From xen-devel-bounces@lists.xensource.com Sat Oct 01 02:21:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 02:21:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1R9vkj-00013y-KK; Sat, 01 Oct 2011 02:21:01 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1R9vk0-0000s3-OU
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 02:20:17 -0700
X-Env-Sender: ijc@hellion.org.uk
X-Msg-Ref: server-15.tower-216.messagelabs.com!1317460813!19686071!1
X-Originating-IP: [80.68.92.230]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6980 invoked from network); 1 Oct 2011 09:20:13 -0000
Received: from aaar.vm.bytemark.co.uk (HELO aaar.vm.bytemark.co.uk)
	(80.68.92.230) by server-15.tower-216.messagelabs.com with SMTP;
	1 Oct 2011 09:20:13 -0000
Received: from localhost (unknown [127.0.0.1])
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id 517CD14257F;
	Sat,  1 Oct 2011 09:20:09 +0000 (UTC)
Received: from aaar.vm.bytemark.co.uk ([127.0.0.1])
	by localhost (aaar.vm.bytemark.co.uk [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id NeWdaoB-8wfZ; Sat,  1 Oct 2011 10:20:05 +0100 (BST)
Received: from hopkins.hellion.org.uk
	(cpc2-cmbg14-2-0-cust125.5-4.cable.virginmedia.com [86.26.0.126])
	(using TLSv1 with cipher AES256-SHA (256/256 bits))
	(No client certificate requested)
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id C1408142258;
	Sat,  1 Oct 2011 10:20:05 +0100 (BST)
Received: from dagon.hellion.org.uk ([192.168.1.7])
	by hopkins.hellion.org.uk with esmtps (SSL3.0:RSA_AES_256_CBC_SHA1:32)
	(Exim 4.72) (envelope-from <ijc@hellion.org.uk>)
	id 1R9vjj-0000gx-8T; Sat, 01 Oct 2011 10:20:01 +0100
From: Ian Campbell <ijc@hellion.org.uk>
To: rush <rush1503@gmail.com>
In-Reply-To: <CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
References: <20110919210045.3256.61939.reportbug@xen-dom0.xen.irush.su>
	<20110919212211.GB6343@elie>
	<CA+rvmvK8G5hNq4wOkPdcDMufYS9bD559zvexMqG9gy=m7dkU_A@mail.gmail.com>
	<1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
	<CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
Date: Sat, 01 Oct 2011 10:19:58 +0100
Message-ID: <1317460798.11991.2.camel@dagon.hellion.org.uk>
Mime-Version: 1.0
X-Mailer: Evolution 2.32.3 
X-SA-Exim-Connect-IP: 192.168.1.7
X-SA-Exim-Mail-From: ijc@hellion.org.uk
X-SA-Exim-Version: 4.2.1 (built Mon, 22 Mar 2010 06:51:10 +0000)
X-SA-Exim-Scanned: Yes (on hopkins.hellion.org.uk)
Cc: Jonathan Nieder <jrnieder@gmail.com>, 642154@bugs.debian.org,
	xen-devel <xen-devel@lists.xensource.com>,
	Ben Hutchings <ben@decadent.org.uk>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: BUG: unable to handle kernel paging request at
	ffff8803bb6ad000
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============1962878350=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============1962878350==
Content-Type: multipart/signed; micalg="pgp-sha512";
	protocol="application/pgp-signature";
	boundary="=-L+hRw1bXgxlvFSrI8g+3"


--=-L+hRw1bXgxlvFSrI8g+3
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable

On Sat, 2011-10-01 at 11:01 +0400, rush wrote:
> 2011/10/1, Jonathan Nieder <jrnieder@gmail.com>:
> >
> > Cc-ing the reporter.  Rush, are you able to reproduce the oops you
> > mentioned?  Does adding noxsave to the kernel command line help?
> >
>=20
> I'm sorry, i'm not guru in such questions.
> Do I need to specify xsave=3D0 in grub boot options or there is another
> way to do it?

Assuming your system uses grub2 you should add it to GRUB_CMDLINE_LINUX
in /etc/default/grub and then run "update-grub".

Ian.
--=20
Ian Campbell


Place stamp here.

--=-L+hRw1bXgxlvFSrI8g+3
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part

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

iQIcBAABCgAGBQJOhts7AAoJEOxjaZd5B0+oEasP/2O37ggLwSzuM+VAmY1p3D2C
1yds8bL4/PSVEOyl/Tc27Bb5jeZXU3ZTcBbv6fW2S3GvezEsQWHSmR+mhZArjx3H
b9nzmnNo0suCihBNbaO4ZztjDMY6ccU88uq7L5f2eMase8y5ghXffkb1FpUVBh9o
F6dMAQN9TZ670kk3PSrR5Ra9mKPHq+F6QPODfmTv0kgLzJP9DjT7EzmnYOctenLA
/ASXeL5uhI2mPZRlWRTmCzHurUxSUeaOtiXcwl9oeIjg+QY70K9NzHmWPVysOuAZ
h3Nc3Rx5C603Tw7gyoUEXd8Pf4oQDXT6MpZdeWC+cCtfN8kP1j0VV3UmOEOX+xx3
RlqoBwOTCGMasGTmxafp08YnBTIifgZHhVDDNW+FlMlsR1P+1muXS779iTe3e2fK
8IdOBPtZ4NjdFIQEGKchb/jxDCSdBl2R3wrhMYwzGHIptN7gCkJFunhAUKNMB+Rj
2urqKcC5pHeiIPMkzLTdqD0FUpYyexp1QWd4sUlOXY23XAybxNwOVKwjJTPTj9Lq
Pf1p6xpU9NKPuIXplh1oQmT2lbY0USMmVgVuPXuh3OiGZO2U0cw9tZzBjdHe4orw
218tPeZUj2A8E1KSPCAmzvLIOgo53lIw2By23/dLBMque+7Buudput7IqWZ3QS3d
uxmlL22hmJw3piVzdfus
=UaRZ
-----END PGP SIGNATURE-----

--=-L+hRw1bXgxlvFSrI8g+3--



--===============1962878350==
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

--===============1962878350==--



From xen-devel-bounces@lists.xensource.com Sat Oct 01 02:28:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 02:28:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1R9vsP-0001Y6-3X; Sat, 01 Oct 2011 02:28:57 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1R9vrs-0001ME-56
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 02:28:24 -0700
X-Env-Sender: ml-xen-devel@hfp.de
X-Msg-Ref: server-11.tower-182.messagelabs.com!1317461301!18652013!1
X-Originating-IP: [88.205.101.6]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17698 invoked from network); 1 Oct 2011 09:28:21 -0000
Received: from rootsrv.hfp.de (HELO rootsrv.hfp.de) (88.205.101.6)
	by server-11.tower-182.messagelabs.com with SMTP;
	1 Oct 2011 09:28:21 -0000
Received: from localhost (localhost [127.0.0.1])
	by rootsrv.hfp.de (Postfix) with ESMTP id 0058E1A7F87;
	Sat,  1 Oct 2011 11:28:19 +0200 (CEST)
X-Virus-Scanned: amavisd-new/ClamAV at rootsrv.hfp.de
Received: from rootsrv.hfp.de ([127.0.0.1])
	by localhost (rootsrv.hfp.de [127.0.0.1]) (amavisd-new, port 10026)
	with ESMTP id I4Rao8cYphrW; Sat,  1 Oct 2011 11:28:19 +0200 (CEST)
Received: from [10.0.0.1] (p57946768.dip.t-dialin.net [87.148.103.104])
	by rootsrv.hfp.de (Postfix) with ESMTPA;
	Sat,  1 Oct 2011 11:28:19 +0200 (CEST)
Message-ID: <4E86DD36.2040303@hfp.de>
Date: Sat, 01 Oct 2011 11:28:22 +0200
From: Andreas Kinzler <ml-xen-devel@hfp.de>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:6.0.2) Gecko/20110902 Thunderbird/6.0.2
MIME-Version: 1.0
To: James Harper <james.harper@bendigoit.com.au>, 
	xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] RE: Stability report GPLPV 0.11.0.308
References: <4E64A0DF.2070007@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5DB8C@trantor>
	<4E64D569.5030607@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5DBBF@trantor>
	<4E7728F9.9020208@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E008@trantor>
	<4E7B04A4.9070601@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E072@trantor>
	<4E7CF2A8.5040405@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E0D0@trantor>
	<4E808FE9.5050008@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E190@trantor>
	<4E858925.6090903@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E2E4@trantor>
In-Reply-To: <AEC6C66638C05B468B556EA548C1A77D01E5E2E4@trantor>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
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

Hello,

> What version of Xen are you testing with? I'm using the latest xen 4.1

I am using Xen 4.1.1 official.

> from hg and this morning I couldn't log into my server via RDP because
> the date had advanced about 2 months. I was testing it hard enough that
> it lost network connectivity for a bit so I'm wondering if that had
> something to do with it... have you seen anything like that during
> intensive testing?

Yes, there might be additional problems that are cause by time issues, 
but that does not explain why the Windows log does not mention my login 
try (see earlier mail).

I have one production system with Xen 4.1.1 and GPLPV 0.11.0.213 which 
has an uptime of more then 100 days.

Regards Andreas

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

From xen-devel-bounces@lists.xensource.com Sat Oct 01 04:11:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 04:11:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1R9xTz-000463-Ri; Sat, 01 Oct 2011 04:11:51 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1R9xT3-0003tk-Am
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 04:10:54 -0700
X-Env-Sender: ml-xen-devel@hfp.de
X-Msg-Ref: server-11.tower-216.messagelabs.com!1317467450!12657378!1
X-Originating-IP: [88.205.101.6]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22345 invoked from network); 1 Oct 2011 11:10:50 -0000
Received: from rootsrv.hfp.de (HELO rootsrv.hfp.de) (88.205.101.6)
	by server-11.tower-216.messagelabs.com with SMTP;
	1 Oct 2011 11:10:50 -0000
Received: from localhost (localhost [127.0.0.1])
	by rootsrv.hfp.de (Postfix) with ESMTP id 34AB51A7F87;
	Sat,  1 Oct 2011 13:10:49 +0200 (CEST)
X-Virus-Scanned: amavisd-new/ClamAV at rootsrv.hfp.de
Received: from rootsrv.hfp.de ([127.0.0.1])
	by localhost (rootsrv.hfp.de [127.0.0.1]) (amavisd-new, port 10026)
	with ESMTP id uJ75JBE0fmqI; Sat,  1 Oct 2011 13:10:48 +0200 (CEST)
Received: from [10.0.0.1] (p57946768.dip.t-dialin.net [87.148.103.104])
	by rootsrv.hfp.de (Postfix) with ESMTPA;
	Sat,  1 Oct 2011 13:10:48 +0200 (CEST)
Message-ID: <4E86F53B.4050100@hfp.de>
Date: Sat, 01 Oct 2011 13:10:51 +0200
From: Andreas Kinzler <ml-xen-devel@hfp.de>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:6.0.2) Gecko/20110902 Thunderbird/6.0.2
MIME-Version: 1.0
To: James Harper <james.harper@bendigoit.com.au>
Subject: Re: [Xen-devel] RE: Stability report GPLPV 0.11.0.308
References: <4E64A0DF.2070007@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5DB8C@trantor>
	<4E64D569.5030607@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5DBBF@trantor>
	<4E7728F9.9020208@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E008@trantor>
	<4E7B04A4.9070601@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E072@trantor>
	<4E7CF2A8.5040405@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E0D0@trantor>
	<4E808FE9.5050008@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E190@trantor>
	<4E858925.6090903@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E2E0@trantor>
In-Reply-To: <AEC6C66638C05B468B556EA548C1A77D01E5E2E0@trantor>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
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

Hello James,

> Actually one other thing you could try is simply using the Windows 2003
> version of the drivers. That uses ndis5 and scsiport instead of ndis6
> and storport. If that worked we could try running with ndis5 + storport
> and see if that works okay. As long as they are from the same patchlevel
> it shouldn't matter if you use one compiled for windows 2008 and one for
> windows 2003 (it's possible that it might matter but I can't think of
> anything).

After 3d:18h I stopped my tx-based test with no problems to far. My 
conclusion: the switch of rx-based to tx-based did not change anything.

I now compiled 0.11.0.312 with scsiport and ndis5 (and patched the .inf 
file, deleted the [XenGplPv.NT$ARCH$.6.0] section). Test is now running.

Regards Andreas

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

From xen-devel-bounces@lists.xensource.com Sat Oct 01 05:08:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 05:08:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1R9yMo-0005dy-UY; Sat, 01 Oct 2011 05:08:30 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1R9yLX-0005RW-7r
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 05:07:22 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-8.tower-216.messagelabs.com!1317470827!17117386!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29416 invoked from network); 1 Oct 2011 12:07:08 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Oct 2011 12:07:08 -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 1ADFB1B80;
	Sat,  1 Oct 2011 15:07:06 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id A7D28200EA; Sat,  1 Oct 2011 15:07:06 +0300 (EEST)
Date: Sat, 1 Oct 2011 15:07:06 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Anthony Wright <anthony@overnetdata.com>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
Message-ID: <20111001120706.GZ12984@reaktio.net>
References: <4E85DB1A.5060606@overnetdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E85DB1A.5060606@overnetdata.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
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, Sep 30, 2011 at 04:07:06PM +0100, Anthony Wright wrote:
> I have a machine with 16GB of RAM running 32 bit xen 4.1.1 with Dom0
> running a 3.0.4 linux kernel and 23 paravirtualized DomUs.
> 

Hey,

Why 32bit Xen? I think all (most?) hypervisor testing happens with 64bit Xen.
Note that you can still have 32bit dom0 kernel with 64b hypervisor.

> As the free ram gets to 2391 MB free the system behaves as if it's got
> no more ram, and starts grabbing ram from Dom0, before getting even more
> confused and failing to start DomUs and eventually crashing the whole
> machine. I have attached a tarball with the output of xl dmesg, xl info
> & xl list at various points.
> 

- Do you use dom0_mem= parameter for Xen? 
- Did you disable dom0 ballooning? 

http://wiki.xen.org/xenwiki/XenBestPractices


> Stage 1
> Everything is fine, Dom0 has 2000MB according to xl list, and 'xl info'
> says there is 2405MB free.
> 

- How much memory did dom0 initially have? 
- Did you use mem= parameter for dom0 kernel (vmlinuz) ?

See: http://wiki.xen.org/xenwiki/Linux_30_bugs


> Stage 2
> I have increased the memory for the DomU labelled 10-4 from 700MB to
> 1000MB, Dom0 has 1713MB and 'xl info' says there is 2391MB free.
> 
> Stage 3
> I have tried to increase the memory for the DomU labelled 13-4 from
> 700MB to 1000MB, but it failed on the 'xl create' displaying the message
> 'failed to free memory for the domain'. Dom0 has 1413MB and 'xl info'
> says there is 3391MB free.
> 
> State 4
> I tried to create the 13-4 DomU again, and this time it succeeds. Dom0
> has 1413MB and 'xl info' says there is 2391MB free.
> 
> If I repeatedly stop and start DomUs at this point, particularly if I
> request more ram, the machine locks up. This may be due to lack of Dom0 ram.


-- Pasi


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

From xen-devel-bounces@lists.xensource.com Sat Oct 01 11:07:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 11:07:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RA3xt-00058Z-IB; Sat, 01 Oct 2011 11:07:09 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RA3x1-0004w2-GB; Sat, 01 Oct 2011 11:06:15 -0700
X-Env-Sender: florian.heigl@gmail.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1317492370!33506366!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7063 invoked from network); 1 Oct 2011 18:06:12 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Oct 2011 18:06:12 -0000
Received: by iagv1 with SMTP id v1so4171344iag.30
	for <multiple recipients>; Sat, 01 Oct 2011 11:06:10 -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:content-transfer-encoding;
	bh=xfLiYEiqVFYImyWHWttVpiPLkq22wE0jprmmsq8EB+U=;
	b=GoF1aE25KqyWUgBCcvb9XRtOfxmq1tGgXs0P2YUz25BU6mF0U+88Y94P7hgUWP/rQ8
	iA96p9Bs5hPyi3Gk4kYN5wdwo4dxSzWWvhzIQriF68I9LC1KmGRmTNj48n3AyN3ob01D
	9xaNIf8X7uC796sjn1fprnQzIkDTuj55B4oVQ=
MIME-Version: 1.0
Received: by 10.231.8.100 with SMTP id g36mr19729024ibg.55.1317492370246; Sat,
	01 Oct 2011 11:06:10 -0700 (PDT)
Received: by 10.231.30.194 with HTTP; Sat, 1 Oct 2011 11:06:09 -0700 (PDT)
In-Reply-To: <20110930235247.GY12984@reaktio.net>
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org>
	<CAFivhPnc-Mpv+Yapp3fVkV2awDcfGw0nv_gWERftnLJXA0_M5A@mail.gmail.com>
	<20110930235247.GY12984@reaktio.net>
Date: Sat, 1 Oct 2011 20:06:09 +0200
Message-ID: <CAFivhPkm7FU7Qp9r2oYB2UYRQiZBpHHqVQ8QNB9MDqWbBjBQwg@mail.gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Florian Heigl <florian.heigl@gmail.com>
To: =?ISO-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: Joseph Glanville <joseph.glanville@orionvm.com.au>,
	Lars Kurth <lars.kurth@xen.org>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.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

2011/10/1 Pasi K=E4rkk=E4inen <pasik@iki.fi>:
> On Fri, Sep 30, 2011 at 06:33:40PM +0200, Florian Heigl wrote:
>> 2011/9/30 Lars Kurth <lars.kurth@xen.org>:
>> > Let me know, which date you agreed on. We could do a poll.
>> > We should publish on the blog a bit before.
>> > Also, how can I help?
>>
>> One thing where you could probably help best is setting clear rules
>> what do document for a release.
>> i.e. the 4.0 relnotes had build instructions and a lot more, whereas
>> this is missing in the next release note.
>>
>> either the build instructions were in the wrong place for 4.0 or 4.1
>> was released with incomplete info ;)
>> making a checklist sounds *ahem* in place :)
>>
>
> Xen 4.1 releasenotes do state that "check Xen 4.0 releasenotes for build =
instructions and more info" :)

You see how well that worked for me :)

Imagine a magazine which has half of the standard topics missing on
it's second issue with a pointer to the last one.
And tbh I guess if anyone had re-tested the 4.0 build instructions
line by line and found them 100% working then he'd probably have
copied them over?

Flo
--=20
the purpose of libvirt is to provide an abstraction layer hiding all
xen features added since 2006 until they were finally understood and
copied by the kvm devs.

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

From xen-devel-bounces@lists.xensource.com Sat Oct 01 14:03:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 14:03:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RA6iU-0002OF-Iz; Sat, 01 Oct 2011 14:03:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RA6hk-0002Bg-Fp
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 14:02:41 -0700
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1317502955!19718862!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10908 invoked from network); 1 Oct 2011 21:02:36 -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; 1 Oct 2011 21:02:36 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p91L2UJq016746
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Sat, 1 Oct 2011 21:02:32 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p91L2Qbn027510
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Sat, 1 Oct 2011 21:02:27 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
	p91L2KKj008133; Sat, 1 Oct 2011 16:02:20 -0500
MIME-Version: 1.0
Message-ID: <83b6aafe-fea3-4d7f-8cd5-47396d74cc81@default>
Date: Sat, 1 Oct 2011 14:02:16 -0700 (PDT)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: Konrad Wilk <konrad.wilk@oracle.com>, linux-kernel@vger.kernel.org
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: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090206.4E877FE8.008F,ss=1,re=0.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, xen-devel@lists.xensource.com,
	David Vrabel <david.vrabel@citrix.com>
Subject: [Xen-devel] [PATCH v5] xen: Fix selfballooning and ensure it
	doesn't go too far
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Note: This patch is also now in a git tree at:
git://oss.oracle.com/git/djm/tmem.git#selfballoon-fix-v5

xen: Fix selfballooning and ensure it doesn't go too far

The balloon driver's "current_pages" is very different from
totalram_pages.  Self-ballooning needs to be driven by
the latter.  Also, Committed_AS doesn't account for pages
used by the kernel so:
1) Add totalreserve_pages to Committed_AS for the normal target.
2) Enforce a floor for when there are little or no user-space threads
   using memory (e.g. single-user mode) to avoid OOMs.  The floor
   function includes a "min_usable_mb" tuneable in case we discover
   later that the floor function is still too aggressive in some
   workloads, though likely it will not be needed.

Changes since version 4:
- change floor calculation so that it is not as aggressive; this version
  uses a piecewise linear function similar to minimum_target in the 2.6.18
  balloon driver, but modified to add to totalreserve_pages instead of
  subtract from max_pfn, the 2.6.18 version causes OOMs on recent kernels
  because the kernel has bloated over time
- change safety_margin to min_usable_mb and comment on its use
- since committed_as does NOT include kernel space (and other reserved
  pages), totalreserve_pages is now added to committed_as.  The result is
  less aggressive self-ballooning, but theoretically more appropriate.
Changes since version 3:
- missing include causes compile problem when CONFIG_FRONTSWAP is disabled
- add comments after includes
Changes since version 2:
- missing include causes compile problem only on 32-bit
Changes since version 1:
- tuneable safety margin added
   =20
[v5: avi.miller@oracle.com: still too aggressive, seeing some OOMs]
[v4: konrad.wilk@oracle.com: fix compile when CONFIG_FRONTSWAP is disabled]
[v3: guru.anbalagane@oracle.com: fix 32-bit compile]
[v2: konrad.wilk@oracle.com: make safety margin tuneable]

Signed-off-by: Dan Magenheimer <dan.magenheimer@oracle.com>

diff --git a/drivers/xen/xen-selfballoon.c b/drivers/xen/xen-selfballoon.c
index 6ea852e..8bb07b6 100644
--- a/drivers/xen/xen-selfballoon.c
+++ b/drivers/xen/xen-selfballoon.c
@@ -68,6 +68,7 @@
  */
=20
 #include <linux/kernel.h>
+#include <linux/bootmem.h>
 #include <linux/mm.h>
 #include <linux/mman.h>
 #include <linux/module.h>
@@ -93,6 +94,15 @@ static unsigned int selfballoon_uphysteresis __read_most=
ly =3D 1;
 /* In HZ, controls frequency of worker invocation. */
 static unsigned int selfballoon_interval __read_mostly =3D 5;
=20
+/*
+ * Minimum usable RAM in MB for selfballooning target for balloon.
+ * If non-zero, it is added to totalreserve_pages and self-ballooning
+ * will not balloon below the sum.  If zero, a piecewise linear function
+ * is calculated as a minimum and added to totalreserve_pages.  Note that
+ * setting this value indiscriminately may cause OOMs and crashes.
+ */
+static unsigned int selfballoon_min_usable_mb;
+
 static void selfballoon_process(struct work_struct *work);
 static DECLARE_DELAYED_WORK(selfballoon_worker, selfballoon_process);
=20
@@ -189,20 +199,23 @@ static int __init xen_selfballooning_setup(char *s)
 __setup("selfballooning", xen_selfballooning_setup);
 #endif /* CONFIG_FRONTSWAP */
=20
+#define MB2PAGES(mb)=09((mb) << (20 - PAGE_SHIFT))
+
 /*
  * Use current balloon size, the goal (vm_committed_as), and hysteresis
  * parameters to set a new target balloon size
  */
 static void selfballoon_process(struct work_struct *work)
 {
-=09unsigned long cur_pages, goal_pages, tgt_pages;
+=09unsigned long cur_pages, goal_pages, tgt_pages, floor_pages;
+=09unsigned long useful_pages;
 =09bool reset_timer =3D false;
=20
 =09if (xen_selfballooning_enabled) {
-=09=09cur_pages =3D balloon_stats.current_pages;
+=09=09cur_pages =3D totalram_pages;
 =09=09tgt_pages =3D cur_pages; /* default is no change */
 =09=09goal_pages =3D percpu_counter_read_positive(&vm_committed_as) +
-=09=09=09balloon_stats.current_pages - totalram_pages;
+=09=09=09=09totalreserve_pages;
 #ifdef CONFIG_FRONTSWAP
 =09=09/* allow space for frontswap pages to be repatriated */
 =09=09if (frontswap_selfshrinking && frontswap_enabled)
@@ -217,7 +230,26 @@ static void selfballoon_process(struct work_struct *wo=
rk)
 =09=09=09=09((goal_pages - cur_pages) /
 =09=09=09=09  selfballoon_uphysteresis);
 =09=09/* else if cur_pages =3D=3D goal_pages, no change */
-=09=09balloon_set_new_target(tgt_pages);
+=09=09useful_pages =3D max_pfn - totalreserve_pages;
+=09=09if (selfballoon_min_usable_mb !=3D 0)
+=09=09=09floor_pages =3D totalreserve_pages +
+=09=09=09=09=09MB2PAGES(selfballoon_min_usable_mb);
+=09=09/* piecewise linear function ending in ~3% slope */
+=09=09else if (useful_pages < MB2PAGES(16))
+=09=09=09floor_pages =3D max_pfn; /* not worth ballooning */
+=09=09else if (useful_pages < MB2PAGES(64))
+=09=09=09floor_pages =3D totalreserve_pages + MB2PAGES(16) +
+=09=09=09=09=09((useful_pages - MB2PAGES(16)) >> 1);
+=09=09else if (useful_pages < MB2PAGES(512))
+=09=09=09floor_pages =3D totalreserve_pages + MB2PAGES(40) +
+=09=09=09=09=09((useful_pages - MB2PAGES(40)) >> 3);
+=09=09else /* useful_pages >=3D MB2PAGES(512) */
+=09=09=09floor_pages =3D totalreserve_pages + MB2PAGES(99) +
+=09=09=09=09=09((useful_pages - MB2PAGES(99)) >> 5);
+=09=09if (tgt_pages < floor_pages)
+=09=09=09tgt_pages =3D floor_pages;
+=09=09balloon_set_new_target(tgt_pages +
+=09=09=09balloon_stats.current_pages - totalram_pages);
 =09=09reset_timer =3D true;
 =09}
 #ifdef CONFIG_FRONTSWAP
@@ -340,6 +372,31 @@ static ssize_t store_selfballoon_uphys(struct sys_devi=
ce *dev,
 static SYSDEV_ATTR(selfballoon_uphysteresis, S_IRUGO | S_IWUSR,
 =09=09   show_selfballoon_uphys, store_selfballoon_uphys);
=20
+SELFBALLOON_SHOW(selfballoon_min_usable_mb, "%d\n",
+=09=09=09=09selfballoon_min_usable_mb);
+
+static ssize_t store_selfballoon_min_usable_mb(struct sys_device *dev,
+=09=09=09=09=09       struct sysdev_attribute *attr,
+=09=09=09=09=09       const char *buf,
+=09=09=09=09=09       size_t count)
+{
+=09unsigned long val;
+=09int err;
+
+=09if (!capable(CAP_SYS_ADMIN))
+=09=09return -EPERM;
+=09err =3D strict_strtoul(buf, 10, &val);
+=09if (err || val =3D=3D 0)
+=09=09return -EINVAL;
+=09selfballoon_min_usable_mb =3D val;
+=09return count;
+}
+
+static SYSDEV_ATTR(selfballoon_min_usable_mb, S_IRUGO | S_IWUSR,
+=09=09   show_selfballoon_min_usable_mb,
+=09=09   store_selfballoon_min_usable_mb);
+
+
 #ifdef CONFIG_FRONTSWAP
 SELFBALLOON_SHOW(frontswap_selfshrinking, "%d\n", frontswap_selfshrinking)=
;
=20
@@ -421,6 +478,7 @@ static struct attribute *selfballoon_attrs[] =3D {
 =09&attr_selfballoon_interval.attr,
 =09&attr_selfballoon_downhysteresis.attr,
 =09&attr_selfballoon_uphysteresis.attr,
+=09&attr_selfballoon_min_usable_mb.attr,
 #ifdef CONFIG_FRONTSWAP
 =09&attr_frontswap_selfshrinking.attr,
 =09&attr_frontswap_hysteresis.attr,

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

From xen-devel-bounces@lists.xensource.com Sat Oct 01 14:56:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 14:56:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RA7Xs-0003k5-KM; Sat, 01 Oct 2011 14:56:32 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RA7XA-0003XB-6D
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 14:55:49 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-5.tower-216.messagelabs.com!1317506143!18151197!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9659 invoked from network); 1 Oct 2011 21:55:45 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-5.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Oct 2011 21:55:45 -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 C17329A82;
	Sat,  1 Oct 2011 14:55:42 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 3111320360; Sat,  1 Oct 2011 14:55:39 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Sat,  1 Oct 2011 14:55:33 -0700
Message-Id: <0b202e43573ff2fba673ca375a95d757ed9a3f36.1317506051.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.2
In-Reply-To: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V2 1/5] jump_label: use proper atomic_t
	initializer
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

ATOMIC_INIT() is the proper thing to use.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 include/linux/jump_label.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 66f23dc..1213e9d 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -28,9 +28,9 @@ struct module;
 #ifdef HAVE_JUMP_LABEL
 
 #ifdef CONFIG_MODULES
-#define JUMP_LABEL_INIT {{ 0 }, NULL, NULL}
+#define JUMP_LABEL_INIT {ATOMIC_INIT(0), NULL, NULL}
 #else
-#define JUMP_LABEL_INIT {{ 0 }, NULL}
+#define JUMP_LABEL_INIT {ATOMIC_INIT(0), NULL}
 #endif
 
 static __always_inline bool static_branch(struct jump_label_key *key)
-- 
1.7.6.2


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

From xen-devel-bounces@lists.xensource.com Sat Oct 01 14:58:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 14:58:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RA7ZH-00047x-Td; Sat, 01 Oct 2011 14:58:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RA7X9-0003X9-EY
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 14:55:48 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317506030!38413910!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17016 invoked from network); 1 Oct 2011 21:53:52 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Oct 2011 21:53:52 -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 D1E849A71;
	Sat,  1 Oct 2011 14:55:41 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 2C6A520504; Sat,  1 Oct 2011 14:55:39 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Sat,  1 Oct 2011 14:55:32 -0700
Message-Id: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.2
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V2 0/5] jump-label: allow early
	jump_label_enable()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

[ This is a new version of this series, which drops the need for any
  special _early() function in favour of making sure stop_machine()
  can operate correctly and efficiently in a pre-SMP envronment. ]

While trying to use the jump-label stuff for my PV ticketlock changes,
I had some problems using jump labels early in the kernel's lifetime
(pre-SMP).

The basic problem is that even if I enable a jump_label_key, the
jump_label_init() initializer ends up nopping out all the code sites.

This series enables early use of jump labels by making
jump_label_init() respect already-enabled keys.

To do this, I've dropped arch_jump_label_poke_text_early() and
replaced it with arch_jump_label_transform(), allowing it to either
insert an optimal nop, or leave the jump in place.

Part of this series makes sure that stop_machine() is safe to call
in an early pre-SMP environment, by making it just call the function
with interrupts disabled.

git://github.com/jsgf/linux-xen upstream/jump-label-noearly

Jeremy Fitzhardinge (5):
  jump_label: use proper atomic_t initializer
  stop_machine: make stop_machine safe and efficient to call early
  jump_label: if a key has already been initialized, don't nop it out
  x86/jump_label: drop arch_jump_label_text_poke_early()
  sparc/jump_label: drop arch_jump_label_text_poke_early()

 arch/sparc/kernel/jump_label.c |    8 --------
 arch/x86/kernel/jump_label.c   |    6 ------
 include/linux/jump_label.h     |    7 ++++---
 kernel/jump_label.c            |   20 ++++++++------------
 kernel/stop_machine.c          |   21 +++++++++++++++++++++
 5 files changed, 33 insertions(+), 29 deletions(-)

-- 
1.7.6.2


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

From xen-devel-bounces@lists.xensource.com Sat Oct 01 15:00:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 15:00:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RA7bo-0004Vx-8a; Sat, 01 Oct 2011 15:00:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RA7X9-0003XA-Rs
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 14:55:48 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-10.tower-216.messagelabs.com!1317506143!10493783!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26311 invoked from network); 1 Oct 2011 21:55:44 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-10.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 1 Oct 2011 21:55:44 -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 9A4DE9A7F;
	Sat,  1 Oct 2011 14:55:42 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 442D520FE3; Sat,  1 Oct 2011 14:55:39 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Sat,  1 Oct 2011 14:55:37 -0700
Message-Id: <32110af5310f6044f0a19e9b5e3ed2c1c70277c6.1317506051.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.2
In-Reply-To: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V2 5/5] sparc/jump_label: drop
	arch_jump_label_text_poke_early()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

It is no longer used.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: David Miller <davem@davemloft.net>
---
 arch/sparc/kernel/jump_label.c |    8 --------
 1 files changed, 0 insertions(+), 8 deletions(-)

diff --git a/arch/sparc/kernel/jump_label.c b/arch/sparc/kernel/jump_label.c
index ea2dafc..971fd43 100644
--- a/arch/sparc/kernel/jump_label.c
+++ b/arch/sparc/kernel/jump_label.c
@@ -36,12 +36,4 @@ void arch_jump_label_transform(struct jump_entry *entry,
 	put_online_cpus();
 }
 
-void arch_jump_label_text_poke_early(jump_label_t addr)
-{
-	u32 *insn_p = (u32 *) (unsigned long) addr;
-
-	*insn_p = 0x01000000;
-	flushi(insn_p);
-}
-
 #endif
-- 
1.7.6.2


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

From xen-devel-bounces@lists.xensource.com Sat Oct 01 15:03:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 15:03:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RA7eo-0004uF-07; Sat, 01 Oct 2011 15:03:42 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RA7XA-0003XC-Ga
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 14:55:49 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-13.tower-174.messagelabs.com!1317506143!33516858!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10896 invoked from network); 1 Oct 2011 21:55:45 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-13.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 1 Oct 2011 21:55:45 -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 8BA589A72;
	Sat,  1 Oct 2011 14:55:42 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 3563C20A81; Sat,  1 Oct 2011 14:55:39 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Sat,  1 Oct 2011 14:55:34 -0700
Message-Id: <58bc7c7142fe54cd6c17f2f18f4b11fd2f597d5a.1317506051.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.2
In-Reply-To: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>, Tejun Heo <tj@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V2 2/5] stop_machine: make stop_machine safe
	and efficient to call early
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Make stop_machine() safe to call early in boot, before SMP has been
set up, by simply calling the callback function directly if there's
only one CPU online.

[ Fixes from AKPM:
   - add comment
   - local_irq_flags, not save_flags
   - also call hard_irq_disable() for systems which need it

  Tejun suggested using an explicit flag rather than just looking at
  the online cpu count. ]

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Tejun Heo <tj@kernel.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: H. Peter Anvin <hpa@linux.intel.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
 kernel/stop_machine.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c
index ba5070c..9c59d9e 100644
--- a/kernel/stop_machine.c
+++ b/kernel/stop_machine.c
@@ -41,6 +41,7 @@ struct cpu_stopper {
 };
 
 static DEFINE_PER_CPU(struct cpu_stopper, cpu_stopper);
+static bool stop_machine_initialized = false;
 
 static void cpu_stop_init_done(struct cpu_stop_done *done, unsigned int nr_todo)
 {
@@ -386,6 +387,8 @@ static int __init cpu_stop_init(void)
 	cpu_stop_cpu_callback(&cpu_stop_cpu_notifier, CPU_ONLINE, bcpu);
 	register_cpu_notifier(&cpu_stop_cpu_notifier);
 
+	stop_machine_initialized = true;
+
 	return 0;
 }
 early_initcall(cpu_stop_init);
@@ -485,6 +488,24 @@ int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus)
 					    .num_threads = num_online_cpus(),
 					    .active_cpus = cpus };
 
+	if (!stop_machine_initialized) {
+		/*
+		 * Handle the case where stop_machine() is called early in boot
+		 * before SMP startup.
+		 */
+ 		unsigned long flags;
+		int ret;
+
+		WARN_ON_ONCE(smdata.num_threads != 1);
+
+		local_irq_save(flags);
+		hard_irq_disable();
+		ret = (*fn)(data);
+		local_irq_restore(flags);
+
+		return ret;
+	}
+
 	/* Set the initial state and stop all online cpus. */
 	set_state(&smdata, STOPMACHINE_PREPARE);
 	return stop_cpus(cpu_online_mask, stop_machine_cpu_stop, &smdata);
-- 
1.7.6.2


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

From xen-devel-bounces@lists.xensource.com Sat Oct 01 15:06:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 15:06:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RA7hN-0005IE-6u; Sat, 01 Oct 2011 15:06:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RA7XB-0003XD-SG
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 14:55:50 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-9.tower-174.messagelabs.com!1317506144!27467515!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23315 invoked from network); 1 Oct 2011 21:55:46 -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; 1 Oct 2011 21:55:46 -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 A7FB99A81;
	Sat,  1 Oct 2011 14:55:42 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 3C15C20FA9; Sat,  1 Oct 2011 14:55:39 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Sat,  1 Oct 2011 14:55:35 -0700
Message-Id: <477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.2
In-Reply-To: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V2 3/5] jump_label: if a key has already
	been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

If a key has been enabled before jump_label_init() is called, don't
nop it out.

This removes arch_jump_label_text_poke_early() (which can only nop
out a site) and uses arch_jump_label_transform() instead.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 include/linux/jump_label.h |    3 ++-
 kernel/jump_label.c        |   20 ++++++++------------
 2 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 1213e9d..c8fb1b3 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -45,7 +45,8 @@ extern void jump_label_lock(void);
 extern void jump_label_unlock(void);
 extern void arch_jump_label_transform(struct jump_entry *entry,
 				 enum jump_label_type type);
-extern void arch_jump_label_text_poke_early(jump_label_t addr);
+extern void arch_jump_label_transform_early(struct jump_entry *entry,
+				 enum jump_label_type type);
 extern int jump_label_text_reserved(void *start, void *end);
 extern void jump_label_inc(struct jump_label_key *key);
 extern void jump_label_dec(struct jump_label_key *key);
diff --git a/kernel/jump_label.c b/kernel/jump_label.c
index a8ce450..059202d5 100644
--- a/kernel/jump_label.c
+++ b/kernel/jump_label.c
@@ -121,13 +121,6 @@ static void __jump_label_update(struct jump_label_key *key,
 	}
 }
 
-/*
- * Not all archs need this.
- */
-void __weak arch_jump_label_text_poke_early(jump_label_t addr)
-{
-}
-
 static __init int jump_label_init(void)
 {
 	struct jump_entry *iter_start = __start___jump_table;
@@ -139,12 +132,15 @@ static __init int jump_label_init(void)
 	jump_label_sort_entries(iter_start, iter_stop);
 
 	for (iter = iter_start; iter < iter_stop; iter++) {
-		arch_jump_label_text_poke_early(iter->code);
-		if (iter->key == (jump_label_t)(unsigned long)key)
+		struct jump_label_key *iterk;
+
+		iterk = (struct jump_label_key *)(unsigned long)iter->key;
+		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
+					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
+		if (iterk == key)
 			continue;
 
-		key = (struct jump_label_key *)(unsigned long)iter->key;
-		atomic_set(&key->enabled, 0);
+		key = iterk;
 		key->entries = iter;
 #ifdef CONFIG_MODULES
 		key->next = NULL;
@@ -212,7 +208,7 @@ void jump_label_apply_nops(struct module *mod)
 		return;
 
 	for (iter = iter_start; iter < iter_stop; iter++)
-		arch_jump_label_text_poke_early(iter->code);
+		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
 }
 
 static int jump_label_add_module(struct module *mod)
-- 
1.7.6.2


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

From xen-devel-bounces@lists.xensource.com Sat Oct 01 15:07:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 15:07:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RA7if-0005et-Qa; Sat, 01 Oct 2011 15:07:41 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RA7XC-0003XE-4g
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 14:55:50 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-5.tower-182.messagelabs.com!1317506145!15523929!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21214 invoked from network); 1 Oct 2011 21:55:46 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-5.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Oct 2011 21:55:46 -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 C17959A84;
	Sat,  1 Oct 2011 14:55:42 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 3FB5E20FE2; Sat,  1 Oct 2011 14:55:39 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Sat,  1 Oct 2011 14:55:36 -0700
Message-Id: <48b39edbbd82711557c52a584c776e1cb44fe869.1317506051.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.2
In-Reply-To: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V2 4/5] x86/jump_label: drop
	arch_jump_label_text_poke_early()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

It is no longer used.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Jason Baron <jbaron@redhat.com>
---
 arch/x86/kernel/jump_label.c |    6 ------
 1 files changed, 0 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
index 3fee346..2ad0298 100644
--- a/arch/x86/kernel/jump_label.c
+++ b/arch/x86/kernel/jump_label.c
@@ -42,10 +42,4 @@ void arch_jump_label_transform(struct jump_entry *entry,
 	put_online_cpus();
 }
 
-void arch_jump_label_text_poke_early(jump_label_t addr)
-{
-	text_poke_early((void *)addr, ideal_nops[NOP_ATOMIC5],
-			JUMP_LABEL_NOP_SIZE);
-}
-
 #endif
-- 
1.7.6.2


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

From xen-devel-bounces@lists.xensource.com Sat Oct 01 17:49:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 17:49:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAAEw-0000ip-Cs; Sat, 01 Oct 2011 17:49:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAADu-0000WQ-HF
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 17:48:09 -0700
X-Env-Sender: chintamani.sid@gmail.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1317516482!12690840!1
X-Originating-IP: [216.139.236.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24124 invoked from network); 2 Oct 2011 00:48:03 -0000
Received: from sam.nabble.com (HELO sam.nabble.com) (216.139.236.26)
	by server-11.tower-216.messagelabs.com with AES256-SHA encrypted SMTP;
	2 Oct 2011 00:48:03 -0000
Received: from [192.168.236.26] (helo=sam.nabble.com)
	by sam.nabble.com with esmtp (Exim 4.72)
	(envelope-from <chintamani.sid@gmail.com>) id 1RAADp-0002tL-Dc
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 17:48:01 -0700
Date: Sat, 1 Oct 2011 17:48:01 -0700 (PDT)
From: Chintamani Siddeshwar <chintamani.sid@gmail.com>
To: xen-devel@lists.xensource.com
Message-ID: <1317516481414-4861071.post@n5.nabble.com>
In-Reply-To: <CAAJKtqpQ7RC2=Mz1B9V1t4HPKPx_9kpxd+xL9mPoE0WCqR2fEA@mail.gmail.com>
References: <1317172992048-4847541.post@n5.nabble.com>
	<1317312832330-4853794.post@n5.nabble.com>
	<CAAJKtqpQ7RC2=Mz1B9V1t4HPKPx_9kpxd+xL9mPoE0WCqR2fEA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Re: Getting the page fault count for 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

Thanks a lot Adin.

Can you please tell me, which daemon should I look for?
I am trying to see whether it makes sense to include this page-fault count
while scheduling guests (vcpus), to achieve better performance isolation
among guests. That is why I am interested in changing XEN's code - If the
code changes that I suggested wont work, can you please suggest me any
alternatives? That will be really helpful.

  thanks
Chintamani


--
View this message in context: http://xen.1045712.n5.nabble.com/Getting-the-page-fault-count-for-domU-tp4847541p4861071.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 Sat Oct 01 21:16:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 01 Oct 2011 21:16:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RADTm-0005Ru-A0; Sat, 01 Oct 2011 21:16:42 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RADSz-0005FD-Ag
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 21:15:53 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1317528941!61749536!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 477 invoked from network); 2 Oct 2011 04:15:41 -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;
	2 Oct 2011 04:15:41 -0000
X-IronPort-AV: E=Sophos;i="4.68,476,1312156800"; 
   d="scan'208";a="8165909"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	02 Oct 2011 04:15: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; Sun, 2 Oct 2011 05:15:49 +0100
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 1RADSv-0006fh-3v;
	Sun, 02 Oct 2011 04:15:49 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RADSu-00040n-Vn;
	Sun, 02 Oct 2011 05:15:49 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9182-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 2 Oct 2011 05:15:48 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9182: 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 9182 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9182/

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                  3d1664cc9e45
baseline version:
 xen                  3d1664cc9e45

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


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 Sun Oct 02 02:13:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 02 Oct 2011 02:13:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAI6r-0003DU-Ag; Sun, 02 Oct 2011 02:13:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAI61-000317-7V
	for xen-devel@lists.xensource.com; Sun, 02 Oct 2011 02:12:29 -0700
X-Env-Sender: manurk.88@gmail.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1317546745!19746229!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6303 invoked from network); 2 Oct 2011 09:12:25 -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;
	2 Oct 2011 09:12:25 -0000
Received: by wyh13 with SMTP id 13so2877142wyh.30
	for <xen-devel@lists.xensource.com>;
	Sun, 02 Oct 2011 02:12: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=zh+vsjf4OIQQdp+B6bCyonPmZqnx8oT6qhtb9xwzPR0=;
	b=VYjcUrkGLaHPtsGJYNiy1ISZNvRtQK1SjqJUwxBavzrutMNjlIo+fgRjTax5FuVfcx
	cquzRkwHaJPIQHBIe3Fdvp/ESbeglUxDrypT79QhDut1MVd5luuO55VEDO1jD8mSU6sj
	W9/uHU+jaVtyF6Dm9HKvK+YSubWrPiuida5cA=
MIME-Version: 1.0
Received: by 10.216.229.144 with SMTP id h16mr1935833weq.31.1317546745579;
	Sun, 02 Oct 2011 02:12:25 -0700 (PDT)
Received: by 10.216.170.16 with HTTP; Sun, 2 Oct 2011 02:12:25 -0700 (PDT)
Date: Sun, 2 Oct 2011 14:42:25 +0530
Message-ID: <CA+DmKfu9NaP=7E1vfwoL0qwYJ8nxfDV1HKKtgvCU0otUNOg6xA@mail.gmail.com>
From: Manu R Krishnan <manurk.88@gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] Start a VM without using XM 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>
Content-Type: multipart/mixed; boundary="===============1719950727=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1719950727==
Content-Type: multipart/alternative; boundary=0016e659f74abec72704ae4d41a8

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

Hi friends,
    I want to write an application to start of pause the VMs on Xen. Now i
am using xm command to start/pause the VM. Is there any way to start a VM
using a program?
Thanks in advance.

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

Hi friends,<br>=A0=A0=A0 I want to write an application to start of pause t=
he VMs on Xen. Now i am using xm command to start/pause the VM. Is there an=
y way to start a VM using a program?<br>Thanks in advance.<br>

--0016e659f74abec72704ae4d41a8--


--===============1719950727==
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

--===============1719950727==--


From xen-devel-bounces@lists.xensource.com Sun Oct 02 03:16:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 02 Oct 2011 03:16:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAJ5n-0004eR-Nr; Sun, 02 Oct 2011 03:16:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAJ56-0004S9-72
	for xen-devel@lists.xensource.com; Sun, 02 Oct 2011 03:15:36 -0700
X-Env-Sender: joseph.glanville@orionvm.com.au
X-Msg-Ref: server-11.tower-216.messagelabs.com!1317550531!12715474!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29549 invoked from network); 2 Oct 2011 10:15:33 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-11.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Oct 2011 10:15:33 -0000
Received: by iagv1 with SMTP id v1so5124163iag.30
	for <xen-devel@lists.xensource.com>;
	Sun, 02 Oct 2011 03:15:31 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.231.8.35 with SMTP id f35mr20876294ibf.4.1317550529882; Sun,
	02 Oct 2011 03:15:29 -0700 (PDT)
Received: by 10.231.170.15 with HTTP; Sun, 2 Oct 2011 03:15:29 -0700 (PDT)
X-Originating-IP: [59.167.234.130]
In-Reply-To: <CA+DmKfu9NaP=7E1vfwoL0qwYJ8nxfDV1HKKtgvCU0otUNOg6xA@mail.gmail.com>
References: <CA+DmKfu9NaP=7E1vfwoL0qwYJ8nxfDV1HKKtgvCU0otUNOg6xA@mail.gmail.com>
Date: Sun, 2 Oct 2011 21:15:29 +1100
Message-ID: <CAOzFzEhp+GiwuRjhwY+WFKxXz2U8fsmYdH+RKEfLCyp9fiqmfQ@mail.gmail.com>
Subject: Re: [Xen-devel] Start a VM without using XM command
From: Joseph Glanville <joseph.glanville@orionvm.com.au>
To: Manu R Krishnan <manurk.88@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="===============2120320678=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2120320678==
Content-Type: multipart/alternative; boundary=0015176f0d9e4eaa6b04ae4e2341

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

Hi

What do you mean by "program"?
The definition is very vague and can be interpretted many ways in this
context.
I assume you aren't familiar with scripting if you are asking this question.

I recommend you take a look at a scripting language called bash, it is
usually distributed with Linux as the default shell.

A script to pause a certain VM (say this one is called vm0) would like
something like this:

#!/bin/bash
/usr/sbin/xm pause vm0

Joseph.

On 2 October 2011 20:12, Manu R Krishnan <manurk.88@gmail.com> wrote:

> Hi friends,
>     I want to write an application to start of pause the VMs on Xen. Now i
> am using xm command to start/pause the VM. Is there any way to start a VM
> using a program?
> Thanks in advance.
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>
>


-- 
*
Founder | Director | VP Research
Orion Virtualisation Solutions* | www.orionvm.com.au | Phone: 1300 56 99 52
| Mobile: 0428 754 846

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

Hi<br><br>What do you mean by &quot;program&quot;?<br>The definition is ver=
y vague and can be interpretted many ways in this context.<br>I assume you =
aren&#39;t familiar with scripting if you are asking this question.<br><br>
I recommend you take a look at a scripting language called bash, it is usua=
lly distributed with Linux as the default shell.<br><br>A script to pause a=
 certain VM (say this one is called vm0) would like something like this:<br=
>
<br>#!/bin/bash<br>/usr/sbin/xm pause vm0<br><br>Joseph.<br><br><div class=
=3D"gmail_quote">On 2 October 2011 20:12, Manu R Krishnan <span dir=3D"ltr"=
>&lt;<a href=3D"mailto:manurk.88@gmail.com">manurk.88@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;">Hi friends,<br>=A0=A0=A0 I want to write an=
 application to start of pause the VMs on Xen. Now i am using xm command to=
 start/pause the VM. Is there any way to start a VM using a program?<br>
Thanks in advance.<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>
<br></blockquote></div><br><br clear=3D"all"><br>-- <br><span style=3D"font=
-family:arial,sans-serif;font-size:13px;border-collapse:collapse"><b><i><fo=
nt color=3D"#0000ff"><div><font color=3D"#000000"><span style=3D"font-style=
:normal;font-weight:normal">Founder | Director | VP Research<br>
</span></font></div>Orion Virtualisation Solutions</font></i></b>=A0|=A0<fo=
nt color=3D"#0000ff"><a href=3D"http://www.orionvm.com.au/" style=3D"color:=
rgb(42, 93, 176)" target=3D"_blank">www.orionvm.com.au</a></font>=A0| Phone=
: 1300 56 99 52 | Mobile: 0428 754 846</span><br>


--0015176f0d9e4eaa6b04ae4e2341--


--===============2120320678==
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

--===============2120320678==--


From xen-devel-bounces@lists.xensource.com Sun Oct 02 03:20:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 02 Oct 2011 03:20:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAJA7-00054Y-VN; Sun, 02 Oct 2011 03:20:47 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAJ9X-0004ss-W2
	for xen-devel@lists.xensource.com; Sun, 02 Oct 2011 03:20:12 -0700
X-Env-Sender: liuw@liuw.name
X-Msg-Ref: server-15.tower-182.messagelabs.com!1317550807!19503939!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17765 invoked from network); 2 Oct 2011 10:20:08 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Oct 2011 10:20:08 -0000
Received: by iagv1 with SMTP id v1so5129472iag.30
	for <xen-devel@lists.xensource.com>;
	Sun, 02 Oct 2011 03:20:07 -0700 (PDT)
Received: by 10.231.70.21 with SMTP id b21mr2538643ibj.69.1317550807117; Sun,
	02 Oct 2011 03:20:07 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.231.13.137 with HTTP; Sun, 2 Oct 2011 03:19:37 -0700 (PDT)
In-Reply-To: <CA+DmKfu9NaP=7E1vfwoL0qwYJ8nxfDV1HKKtgvCU0otUNOg6xA@mail.gmail.com>
References: <CA+DmKfu9NaP=7E1vfwoL0qwYJ8nxfDV1HKKtgvCU0otUNOg6xA@mail.gmail.com>
From: Wei Liu <liuw@liuw.name>
Date: Sun, 2 Oct 2011 18:19:37 +0800
Message-ID: <CAOsiSVXQED7SO5M2Mn5=ZG5d8azC3gH7aj1bW01gDfD_QbZGFQ@mail.gmail.com>
Subject: Re: [Xen-devel] Start a VM without using XM command
To: Manu R Krishnan <manurk.88@gmail.com>
Content-Type: text/plain; charset=UTF-8
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 Sun, Oct 2, 2011 at 5:12 PM, Manu R Krishnan <manurk.88@gmail.com> wrote=
:
> Hi friends,
> =C2=A0=C2=A0=C2=A0 I want to write an application to start of pause the V=
Ms on Xen. Now i
> am using xm command to start/pause the VM. Is there any way to start a VM
> using a program?
> Thanks in advance.
>

Why not check libxc and libxl. They should do the job.

Wei.

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

From xen-devel-bounces@lists.xensource.com Sun Oct 02 04:13:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 02 Oct 2011 04:13:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAJyk-0006Us-F8; Sun, 02 Oct 2011 04:13:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAJy1-0006Ib-RA; Sun, 02 Oct 2011 04:12:22 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-8.tower-27.messagelabs.com!1317553920!48934762!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17920 invoked from network); 2 Oct 2011 11:12:00 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 2 Oct 2011 11:12:00 -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 7ABF31DEB;
	Sun,  2 Oct 2011 14:12:16 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 5F15E200EA; Sun,  2 Oct 2011 14:12:16 +0300 (EEST)
Date: Sun, 2 Oct 2011 14:12:16 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Florian Heigl <florian.heigl@gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
Message-ID: <20111002111216.GA12984@reaktio.net>
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org>
	<CAFivhPnc-Mpv+Yapp3fVkV2awDcfGw0nv_gWERftnLJXA0_M5A@mail.gmail.com>
	<20110930235247.GY12984@reaktio.net>
	<CAFivhPkm7FU7Qp9r2oYB2UYRQiZBpHHqVQ8QNB9MDqWbBjBQwg@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: <CAFivhPkm7FU7Qp9r2oYB2UYRQiZBpHHqVQ8QNB9MDqWbBjBQwg@mail.gmail.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: Joseph Glanville <joseph.glanville@orionvm.com.au>,
	Lars Kurth <lars.kurth@xen.org>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.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 Sat, Oct 01, 2011 at 08:06:09PM +0200, Florian Heigl wrote:
> 2011/10/1 Pasi Kärkkäinen <pasik@iki.fi>:
> > On Fri, Sep 30, 2011 at 06:33:40PM +0200, Florian Heigl wrote:
> >> 2011/9/30 Lars Kurth <lars.kurth@xen.org>:
> >> > Let me know, which date you agreed on. We could do a poll.
> >> > We should publish on the blog a bit before.
> >> > Also, how can I help?
> >>
> >> One thing where you could probably help best is setting clear rules
> >> what do document for a release.
> >> i.e. the 4.0 relnotes had build instructions and a lot more, whereas
> >> this is missing in the next release note.
> >>
> >> either the build instructions were in the wrong place for 4.0 or 4.1
> >> was released with incomplete info ;)
> >> making a checklist sounds *ahem* in place :)
> >>
> >
> > Xen 4.1 releasenotes do state that "check Xen 4.0 releasenotes for build instructions and more info" :)
> 
> You see how well that worked for me :)
> 
> Imagine a magazine which has half of the standard topics missing on
> it's second issue with a pointer to the last one.
> And tbh I guess if anyone had re-tested the 4.0 build instructions
> line by line and found them 100% working then he'd probably have
> copied them over?
> 

Well they ARE working, that's why I didn't copy them when I wrote 4.1 page :-)
But anyway, feel free to do that!

> Flo
> -- 
> the purpose of libvirt is to provide an abstraction layer hiding all
> xen features added since 2006 until they were finally understood and
> copied by the kvm devs.

:)

-- Pasi


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

From xen-devel-bounces@lists.xensource.com Sun Oct 02 21:01:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 02 Oct 2011 21:01:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAZiM-00044F-97; Sun, 02 Oct 2011 21:01:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAZhc-0003rd-Vg
	for xen-devel@lists.xensource.com; Sun, 02 Oct 2011 21:00:29 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317614403!38120606!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19109 invoked from network); 3 Oct 2011 04:00:03 -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;
	3 Oct 2011 04:00:03 -0000
X-IronPort-AV: E=Sophos;i="4.68,478,1312156800"; 
   d="scan'208";a="8170768"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Oct 2011 04:00: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; Mon, 3 Oct 2011 05:00:24 +0100
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 1RAZhY-0003qv-BT;
	Mon, 03 Oct 2011 04:00:24 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RAZhY-0007O2-8v;
	Mon, 03 Oct 2011 05:00:24 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9183-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 3 Oct 2011 05:00:24 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9183: 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 9183 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9183/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf     13 guest-localmigrate.2         fail pass in 9182

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                  3d1664cc9e45
baseline version:
 xen                  3d1664cc9e45

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 Oct 03 01:39:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 01:39:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAe3f-0002Fk-Ko; Mon, 03 Oct 2011 01:39:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAe2v-000239-6J
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 01:38:45 -0700
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317631103!44868266!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15267 invoked from network); 3 Oct 2011 08:38:23 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Oct 2011 08:38:23 -0000
Received: by eye3 with SMTP id 3so4857520eye.30
	for <xen-devel@lists.xensource.com>;
	Mon, 03 Oct 2011 01:38:41 -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:content-transfer-encoding;
	bh=vQcZDCOEPvF/vt4q/vstnz6PAX9zofVstLVoptwueww=;
	b=xTfmmpUOD8ogXWro0T2cLbOziGqeotCxzRdHWkBBZhUmkVcrM7PdYPt3k6dNdN0m61
	ZSG5MEnaw4O0ue3I5HA4psboX/xf4Q1sC/p/3LaM97j6IYV9PWlhz+1Fcbyf+mpIlb17
	9C4/3SmDeCd8QoyvCEL+wmADr0slwDJ2mJvpM=
MIME-Version: 1.0
Received: by 10.223.45.198 with SMTP id g6mr4102331faf.118.1317631121607; Mon,
	03 Oct 2011 01:38:41 -0700 (PDT)
Received: by 10.223.72.205 with HTTP; Mon, 3 Oct 2011 01:38:41 -0700 (PDT)
In-Reply-To: <1317300756.26672.179.camel@zakaz.uk.xensource.com>
References: <CAP2B85-QBczrKLWSKaRVBkao3=6PB=wnYvuKmoXYqGDbZFnTXA@mail.gmail.com>
	<4E81B46F.5080208@citrix.com>
	<CAP2B85_2L2jkRMqbD6OCRXXaPR1nXV3RmRgcLo2zTTuSLDq5_g@mail.gmail.com>
	<1317125353.26672.25.camel@zakaz.uk.xensource.com>
	<CAP2B85_1j_-0kxMSYheFYVD9Qn0-eUxeuyyo92u5bahn_6yQMw@mail.gmail.com>
	<1317295843.26672.170.camel@zakaz.uk.xensource.com>
	<CAP2B8597Vy-t+3BWgk=+YFzhBzP+M1ZRs1ZSskLySynXR3evgA@mail.gmail.com>
	<1317300756.26672.179.camel@zakaz.uk.xensource.com>
Date: Mon, 3 Oct 2011 17:38:41 +0900
Message-ID: <CAP2B85_FEpXdSkuXSsopDHdDQ6QtUTBGEzy3FXpKvJUMD5NPZg@mail.gmail.com>
Subject: Re: [Xen-devel] Debug event_channel.c
From: Daniel Castro <evil.dani@gmail.com>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Content-Type: text/plain; charset=windows-1252
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, Sep 29, 2011 at 9:52 PM, Ian Campbell
<Ian.Campbell@eu.citrix.com> wrote:
> On Thu, 2011-09-29 at 13:36 +0100, Daniel Castro wrote:
>> On Thu, Sep 29, 2011 at 8:30 PM, Ian Campbell
>> <Ian.Campbell@eu.citrix.com> wrote:
>> > On Thu, 2011-09-29 at 12:09 +0100, Daniel Castro wrote:
>> >> On Tue, Sep 27, 2011 at 9:09 PM, Ian Campbell <Ian.Campbell@citrix.co=
m> wrote:
>> >> > On Tue, 2011-09-27 at 12:36 +0100, Daniel Castro wrote:
>> >> >> On Tue, Sep 27, 2011 at 8:33 PM, Andrew Cooper
>> >> >> <andrew.cooper3@citrix.com> wrote:
>> >> >> > On 27/09/11 12:09, Daniel Castro wrote:
>> >> >> >> Hello All,
>> >> >> >>
>> >> >> >> I am trying to debug event_channel.c for this I have filled the
>> >> >> >> functions with gdprintk(XENLOG_WARNING, "..."); yet the message=
s are
>> >> >> >> not displayed on dmesg or /var/log/xen. Where could they be pri=
nted?
>> >> >> >> or should I use a different function?
>> >> >> >>
>> >> >> >> In grub I have loglvl=3Dall to print all messages...
>> >> >> >>
>> >> >> >> Thanks for the answer,
>> >> >> >>
>> >> >> >> Daniel
>> >> >> >>
>> >> >> >
>> >> >> > gdprintk only gets set with guest debugging enabled. ( guest_log=
lvl on
>> >> >> > the command line )
>> >> >> >
>> >> >> > My suggestion would be to just use regular printks and look at t=
he
>> >> >> > serial log.
>> >> >>
>> >> >> How can can I look at the serial log from dom0?
>> >> >
>> >> > 'xl dmesg' (or using a serial cable of course ;-))
>> >> >
>> >> > You can also add XENCONSOLED_TRACE=3Dhv in /etc/sysconfig/xencommon=
s (or
>> >> > the equivalent on your distro, the effect should be to add --log=3D=
hv to
>> >> > the xenconsoled command line). Then the xen console will be logged
>> >> > under /var/log/xen somewhere.
>> >>
>> >> Ian, thanks for the info.
>> >>
>> >> This is the info I gathered:
>> >> (XEN) schedule.c:658:d1 DEBUG 1: START DO POLL port -32060 on
>> >> sched_poll.nr_ports 1
>> >
>> > port =3D=3D -32060 doesn't sound right...
>> >
>> >> (XEN) schedule.c:719:d1 DEBUG 1: DO POLL test bit on port 2 exit here
>> >> -> if ( test_bit(port, &shared_info(d, evtchn_pending)) )
>> >> (XEN) schedule.c:746:d1 DEBUG 1: DO POLL GOTO out: check previus msg,
>> >> return rc=3D0
>> >> (XEN) event_channel.c:606:d1 DEBUG 1: set_pending
>> >> (XEN) event_channel.c:628:d1 DEBUG 1 : evtchn_set_pending test_bit AN=
D
>> >> test_and_set_bit returned 0.
>> >> (XEN) event_channel.c:637:d1 DEBUG 1: evtchn_set_pending bitmap_empty=
 return 0.
>> >>
>> >> In my code test_bit_and_clear in Xenstore ring_wait is in fact
>> >> returning 0, it was expecting a one, the do_poll is finding the bit i=
n
>> >> 1 also according to test_bit, right?
>> >> So the error is on the my test_bit_and_clear. Am I reading it correct=
ly?
>> >
>> > I'm not sure I follow what your debug messages are actually saying, bu=
t
>> > if do_poll is exiting because of the
>> > =A0 =A0 =A0 =A0if ( test_bit(port, &shared_info(d, evtchn_pending)) )
>> > =A0 =A0 =A0 =A0 =A0 =A0goto out;
>> > inside the "for ( i =3D 0; i < sched_poll->nr_ports; i++ )" loop then =
this
>> > indicates that the event channel is pending. If you aren't seeing this
>> > on the guest end then there is likely a problem somewhere on that end.
>> >
>> > In your current ring_wait function you have:
>> > =A0 =A0 =A0 =A0int wait =3D test_and_clear_bit(event, shinfo->evtchn_p=
ending);
>> > =A0 =A0 =A0 =A0int ret =3D 1;
>> > =A0 =A0 =A0 =A0while (wait!=3D0 || ret!=3D0){
>> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ret =3D hypercall_sched_op(SCHEDOP_poll=
, &poll);
>> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0wait =3D test_and_clear_bit(event, shin=
fo->evtchn_pending);
>> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0struct vcpu_info *vcpu =3D shinfo->vcpu=
_info;
>> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dprintf(1,"DEBUG bit clear is %d and re=
t %d\n",wait,ret);
>> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0time =3D shinfo->vcpu_info[0].time;
>> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dprintf(1,"TIME system %d timestamp %d\=
n",time.system_time,time.tsc_timestamp);
>> > =A0 =A0 =A0 =A0}
>> > }
>> >
>> > Isn't "wait!=3D0" backwards? Don't you want to succeed (i.e. fall out =
of
>> > the loop) when wait!=3D0 rather than keep looping?
>>
>> Yes, at some point I must have screwed that up, and later corrected
>> it... Sorry... Yet the problem remains, in the ring wait I get
>> stuck...
>>
>> What else could I check?
>
> Does shinfo actually point to the right thing?
>
> Looking at your *get_shared_info(void) you have:
> =A0 =A0xatp.gpfn =A0=3D malloc_high(sizeof(shared_info));
> =A0 =A0shared_info =3D (struct shared_info *)(xatp.gpfn << PAGE_SHIFT);
>
> but malloc_high returns a void * (i.e. a pointer) not an mfn.
>
> I suspect you want:
> =A0 =A0shared_info =3D malloc_high(sizeof(shared_info));
> =A0 =A0xatp.gpfn =A0=3D ((unsigned long)shared_info >> PAGE_SHIFT);
>
> At least here the compiler produces a clear warning about this issue:
>
> =A0 =A0 =A0 =A0src/xen.c: In function =91get_shared_info=92:
> =A0 =A0 =A0 =A0src/xen.c:157: warning: assignment makes integer from poin=
ter without a cast
>
> The code in your seabios tree currently produces nearly a page of
> warnings. It is very good practice to get into the habit of taking care
> of all warnings as soon as they appear, more often than not they
> represent are real problem with the code. For example just from skimming
> them I can see that a bunch of your debug is not printing what you seem
> to think it is.

Thanks for the comments Ian, I have fixed most of them now. Also I am
getting results now, but after the first wait I get stuck again in the
wait...
First I had to change the function bit_test_and_clear to:
static inline int test_and_clear_bit(int nr, volatile void *addr)
{
    int oldbit;
    asm volatile (
        "lock; btrl %2,%1\n\tsbbl %0,%0"
        : "=3Dr" (oldbit), "=3Dm" (*(volatile long *)addr)
        : "Ir" (nr), "m" (*(volatile long *)addr) : "memory");
    return oldbit;
}
In order to check the bit value without changing it I am using:
static inline int test_bit(int nr, const volatile void *addr)
{
   int oldbit;
//was btl changed to
    asm volatile (
        "btrl %2,%1\n\tsbbl %0,%0"
        : "=3Dr" (oldbit)
        : "m" (addr), "Ir" (nr) : "memory" );
    return oldbit;
}
The first funny thing is that test_bit_and_clear return -1 with Bit
representation 1111111 11111111 11111111 11111111 I was expecting
something like 0...01...

Now my problem lies that after the first wait exists, the second gets
stuck in the same predicament I had before...

Does any one see any problems in the above code?


>
> Ian.
>
>>
>> >
>> > Ian.
>> >
>> >>
>> >> Thanks all,
>> >>
>> >> Daniel
>> >> >
>> >> > Ian.
>> >> >
>> >> >>
>> >> >> >
>> >> >> > --
>> >> >> > 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
>> >> >> >
>> >> >>
>> >> >>
>> >> >>
>> >> >
>> >> >
>> >> >
>> >>
>> >>
>> >>
>> >
>> >
>> >
>>
>>
>>
>
>
>



--=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 Mon Oct 03 02:32:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 02:32:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAesY-00043l-CP; Mon, 03 Oct 2011 02:32:06 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAert-0003pk-PH
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 02:31:26 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317634282!19947176!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5125 invoked from network); 3 Oct 2011 09:31:22 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Oct 2011 09:31:22 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RAerq-0009YL-0V; Mon, 03 Oct 2011 09:31:22 +0000
Date: Mon, 3 Oct 2011 10:31:21 +0100
From: Tim Deegan <tim@xen.org>
To: Chintamani Siddeshwar <chintamani.sid@gmail.com>
Subject: Re: [Xen-devel] Re: Getting the page fault count for domU
Message-ID: <20111003093121.GB36575@ocelot.phlegethon.org>
References: <1317172992048-4847541.post@n5.nabble.com>
	<1317312832330-4853794.post@n5.nabble.com>
	<CAAJKtqpQ7RC2=Mz1B9V1t4HPKPx_9kpxd+xL9mPoE0WCqR2fEA@mail.gmail.com>
	<1317516481414-4861071.post@n5.nabble.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1317516481414-4861071.post@n5.nabble.com>
User-Agent: Mutt/1.4.2.1i
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

Hi, 

At 17:48 -0700 on 01 Oct (1317491281), Chintamani Siddeshwar wrote:
> I am trying to see whether it makes sense to include this page-fault count
> while scheduling guests (vcpus), to achieve better performance isolation
> among guests. That is why I am interested in changing XEN's code - If the
> code changes that I suggested wont work, can you please suggest me any
> alternatives? That will be really helpful.

Are you looking to count: 
 - page faults in the guest (that would have happened on a real server);
 - page faults caused by the hypervisor (i.e. due to shadow pagetables); or
 - page faults caused by Xen tools paging the guest memory to disk?

Or something else?  Not all pagefaults are easy to count, by the way. 

Tim.

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

From xen-api-bounces@lists.xensource.com Mon Oct 03 05:42:31 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 05:42:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAhqo-0000fx-1E; Mon, 03 Oct 2011 05:42:30 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAhqd-0000cu-K5; Mon, 03 Oct 2011 05:42:19 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1317645736!19495028!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6055 invoked from network); 3 Oct 2011 12:42:16 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Oct 2011 12:42:16 -0000
Received: by wwf27 with SMTP id 27so4603866wwf.24
	for <multiple recipients>; Mon, 03 Oct 2011 05:42:16 -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:subject
	:content-type; bh=5WaIWtPiTOQvniNpNBXD4O1FZjguDX2icGlYYroMw74=;
	b=R8DSy/cVDMaoKNLJ4X7jUcUOQ68Ih7SH9o0y6DiSEg8l3/RSEk8CsXV/1VlSkJZJ6t
	ibBaEIp3ZUh+r2dZI85UJ9/FaY+lXeMFqNF3D53206JVv+aXW+/BcShYgiNfZAc5pYA2
	a3yGSFC847zZS5Dt9qBDlRkSF/ZVoLtPaD/bg=
Received: by 10.216.177.138 with SMTP id d10mr4895745wem.98.1317645734956;
	Mon, 03 Oct 2011 05:42:14 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id n21sm23061632wbp.2.2011.10.03.05.42.12
	(version=SSLv3 cipher=OTHER); Mon, 03 Oct 2011 05:42:14 -0700 (PDT)
Message-ID: <4E89ADA1.1000409@xen.org>
Date: Mon, 03 Oct 2011 13:42:09 +0100
From: Lars Kurth <lars.kurth@xen.org>
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:7.0) Gecko/20110922 Thunderbird/7.0
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, 
	"xen-api@lists.xensource.com" <xen-api@lists.xensource.com>,
	xen-arm@lists.xensource.com
Cc: 
Subject: [Xen-API] Bugs in the Project Governance : proposed fixes
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>
Content-Type: multipart/mixed; boundary="===============1374067743=="
Sender: xen-api-bounces@lists.xensource.com
Errors-To: xen-api-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1374067743==
Content-Type: multipart/alternative;
	boundary="------------080404010202050800070002"

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

Dear Developers,

last week, I mentioned that we had some minor bugs in project governance 
<http://www.xen.org/projects/governance.html> that needed correction. A 
revision can be found at revised project governance 
<http://www.xen.org/projects/governance-rev.html> (changes marked in 
italics). If you have any feedback, please reply to this thread or post 
on xen-devel <mailto:xen-devel@lists.xensource.com> with *project 
governance proposal feedback* in the title of the e-mail. Feedback must 
be given by next Monday 18:00 GMT.

Best Regards
Lars

--------------080404010202050800070002
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">
    Dear Developers,<br>
    <br>
    last week, I mentioned that we had some minor bugs in <a
      href="http://www.xen.org/projects/governance.html">project
      governance</a> that needed correction. A revision can be found at
    <a href="http://www.xen.org/projects/governance-rev.html">revised
      project governance</a> (changes marked in italics). If you have
    any feedback, please reply to this thread or post on <a
      href="mailto:xen-devel@lists.xensource.com">xen-devel</a> with <strong>project
      governance proposal feedback</strong> in the title of the e-mail.
    Feedback must be given by next Monday 18:00 GMT.<br>
    <br>
    Best Regards<br>
    Lars<br>
  </body>
</html>

--------------080404010202050800070002--


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

_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

--===============1374067743==--


From xen-devel-bounces@lists.xensource.com Mon Oct 03 06:38:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 06:38:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAij2-00030A-3Z; Mon, 03 Oct 2011 06:38:32 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAiiR-0002mt-9w
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 06:37:55 -0700
X-Env-Sender: chintamani.sid@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1317649049!47381351!1
X-Originating-IP: [216.139.236.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17908 invoked from network); 3 Oct 2011 13:37:30 -0000
Received: from sam.nabble.com (HELO sam.nabble.com) (216.139.236.26)
	by server-5.tower-27.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Oct 2011 13:37:30 -0000
Received: from [192.168.236.26] (helo=sam.nabble.com)
	by sam.nabble.com with esmtp (Exim 4.72)
	(envelope-from <chintamani.sid@gmail.com>) id 1RAiiM-00057Y-Du
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 06:37:50 -0700
Date: Mon, 3 Oct 2011 06:37:50 -0700 (PDT)
From: Chintamani Siddeshwar <chintamani.sid@gmail.com>
To: xen-devel@lists.xensource.com
Message-ID: <1317649070412-4864887.post@n5.nabble.com>
In-Reply-To: <20111003093121.GB36575@ocelot.phlegethon.org>
References: <1317172992048-4847541.post@n5.nabble.com>
	<1317312832330-4853794.post@n5.nabble.com>
	<CAAJKtqpQ7RC2=Mz1B9V1t4HPKPx_9kpxd+xL9mPoE0WCqR2fEA@mail.gmail.com>
	<1317516481414-4861071.post@n5.nabble.com>
	<20111003093121.GB36575@ocelot.phlegethon.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Re: Getting the page fault count for 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

I am interested in counting the number of page-faults in the guest -
page-faults that result in a disk I/O.
Also when would XEN tools page a guest memory to disk? Is it a manual
process (by running "xenpaging" command) or is it a performance enhancement
added in recent versions of XEN?

I am looking forward to your valuable comments/suggestions.

   thanks
Chintamani

--
View this message in context: http://xen.1045712.n5.nabble.com/Getting-the-page-fault-count-for-domU-tp4847541p4864887.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 Oct 03 06:44:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 06:44:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAioZ-0003WY-J8; Mon, 03 Oct 2011 06:44:15 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAio1-0003K5-6R
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 06:43:42 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317649397!40601389!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8443 invoked from network); 3 Oct 2011 13:43:17 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Oct 2011 13:43:17 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RAinx-000ABu-6E; Mon, 03 Oct 2011 13:43:37 +0000
Date: Mon, 3 Oct 2011 14:43:37 +0100
From: Tim Deegan <tim@xen.org>
To: Chintamani Siddeshwar <chintamani.sid@gmail.com>
Subject: Re: [Xen-devel] Re: Getting the page fault count for domU
Message-ID: <20111003134337.GC36575@ocelot.phlegethon.org>
References: <1317172992048-4847541.post@n5.nabble.com>
	<1317312832330-4853794.post@n5.nabble.com>
	<CAAJKtqpQ7RC2=Mz1B9V1t4HPKPx_9kpxd+xL9mPoE0WCqR2fEA@mail.gmail.com>
	<1317516481414-4861071.post@n5.nabble.com>
	<20111003093121.GB36575@ocelot.phlegethon.org>
	<1317649070412-4864887.post@n5.nabble.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1317649070412-4864887.post@n5.nabble.com>
User-Agent: Mutt/1.4.2.1i
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

At 06:37 -0700 on 03 Oct (1317623870), Chintamani Siddeshwar wrote:
> I am interested in counting the number of page-faults in the guest -
> page-faults that result in a disk I/O.

You will have to do that from inside the guest - only the guest's OS
knows which of its page-faults result in I/O, and on modern (EPT/RVI)
hardware, Xen doesn't even see most guest page-faults.

> Also when would XEN tools page a guest memory to disk? Is it a manual
> process (by running "xenpaging" command) or is it a performance enhancement
> added in recent versions of XEN?

Only when the xenpaging daemon is running.  It is definitely not a
performance enhancement (memory pressure is better dealt with by the
guest) but is useful as a backstop if you're overcommitting memory some
other way.

Tim.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 06:46:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 06:46:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAir7-0003xU-V8; Mon, 03 Oct 2011 06:46:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RAiq9-0003kR-RG
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 06:45:55 -0700
X-Env-Sender: anthony@overnetdata.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317649534!52290042!1
X-Originating-IP: [81.137.131.225]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9590 invoked from network); 3 Oct 2011 13:45:34 -0000
Received: from host81-137-131-225.in-addr.btopenworld.com (HELO
	zimbra.overnetdata.com) (81.137.131.225)
	by server-12.tower-21.messagelabs.com with SMTP;
	3 Oct 2011 13:45:34 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by zimbra.overnetdata.com (Postfix) with ESMTP id 84CD916159A;
	Mon,  3 Oct 2011 14:45:50 +0100 (BST)
X-Virus-Scanned: amavisd-new at overnetdata.com
Received: from zimbra.overnetdata.com ([127.0.0.1])
	by localhost (zimbra.overnetdata.com [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id e42S4gG7RMo8; Mon,  3 Oct 2011 14:45:37 +0100 (BST)
Received: from [192.168.1.60] (unknown [192.168.1.60])
	by zimbra.overnetdata.com (Postfix) with ESMTPSA id 254F9161597;
	Mon,  3 Oct 2011 14:45:37 +0100 (BST)
Message-ID: <4E89BC80.4030105@overnetdata.com>
Date: Mon, 03 Oct 2011 14:45:36 +0100
From: Anthony Wright <anthony@overnetdata.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: =?ISO-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
References: <4E85DB1A.5060606@overnetdata.com>
	<20111001120706.GZ12984@reaktio.net>
In-Reply-To: <20111001120706.GZ12984@reaktio.net>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
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 01/10/2011 13:07, Pasi Kärkkäinen wrote:
> On Fri, Sep 30, 2011 at 04:07:06PM +0100, Anthony Wright wrote:
>> I have a machine with 16GB of RAM running 32 bit xen 4.1.1 with Dom0
>> running a 3.0.4 linux kernel and 23 paravirtualized DomUs.
>>
> Hey,
>
> Why 32bit Xen? I think all (most?) hypervisor testing happens with 64bit Xen.
> Note that you can still have 32bit dom0 kernel with 64b hypervisor.
I'm going to investigate 64 bit xen on a 32 bit Dom0 soon, but as to the
32 xen, I work quite a lot with older hardware and Xen since it does
paravirtualisation, and it's a really good way to re-use old hardware.
>> As the free ram gets to 2391 MB free the system behaves as if it's got
>> no more ram, and starts grabbing ram from Dom0, before getting even more
>> confused and failing to start DomUs and eventually crashing the whole
>> machine. I have attached a tarball with the output of xl dmesg, xl info
>> & xl list at various points.
>>
> - Do you use dom0_mem= parameter for Xen? 
> - Did you disable dom0 ballooning? 
>
> http://wiki.xen.org/xenwiki/XenBestPractices
I was already using the dom0_mem= parameter on the xen hypervisor, but I
disabled dom0 ballooning (enable-dom0-ballooning no), and just for good
measure I also set (dom0-min-mem 2000). This had no effect, when I
increase the 10-4 memory requirements, on restart the Dom0 memory is
reduced to 1713MB and xl info reports 2391MB free.
>> Stage 1
>> Everything is fine, Dom0 has 2000MB according to xl list, and 'xl info'
>> says there is 2405MB free.
> - How much memory did dom0 initially have? 
> - Did you use mem= parameter for dom0 kernel (vmlinuz) ?
>
> See: http://wiki.xen.org/xenwiki/Linux_30_bugs
dom0 starts with 2000MB.
I didn't use mem= on the linux kernel - I thought it wasn't neccessary.


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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 06:57:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 06:57:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAj15-0005Fe-Hy; Mon, 03 Oct 2011 06:57:11 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RAizc-0004n6-PN
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 06:55:41 -0700
X-Env-Sender: anthony@overnetdata.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1317650137!20538316!1
X-Originating-IP: [81.137.131.225]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5264 invoked from network); 3 Oct 2011 13:55:37 -0000
Received: from host81-137-131-225.in-addr.btopenworld.com (HELO
	zimbra.overnetdata.com) (81.137.131.225)
	by server-13.tower-182.messagelabs.com with SMTP;
	3 Oct 2011 13:55:37 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by zimbra.overnetdata.com (Postfix) with ESMTP id C799416159B;
	Mon,  3 Oct 2011 14:55:17 +0100 (BST)
X-Virus-Scanned: amavisd-new at overnetdata.com
Received: from zimbra.overnetdata.com ([127.0.0.1])
	by localhost (zimbra.overnetdata.com [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id tUCl6QJo2YfJ; Mon,  3 Oct 2011 14:55:08 +0100 (BST)
Received: from [192.168.1.60] (unknown [192.168.1.60])
	by zimbra.overnetdata.com (Postfix) with ESMTPSA id D036816159A;
	Mon,  3 Oct 2011 14:55:07 +0100 (BST)
Message-ID: <4E89BEBB.9060708@overnetdata.com>
Date: Mon, 03 Oct 2011 14:55:07 +0100
From: Anthony Wright <anthony@overnetdata.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: =?ISO-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
References: <4E85DB1A.5060606@overnetdata.com>
	<20111001120706.GZ12984@reaktio.net>
In-Reply-To: <20111001120706.GZ12984@reaktio.net>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
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 01/10/2011 13:07, Pasi Kärkkäinen wrote:
> On Fri, Sep 30, 2011 at 04:07:06PM +0100, Anthony Wright wrote:
>> Stage 1
>> Everything is fine, Dom0 has 2000MB according to xl list, and 'xl info'
>> says there is 2405MB free.
>>
> - How much memory did dom0 initially have? 
> - Did you use mem= parameter for dom0 kernel (vmlinuz) ?
>
> See: http://wiki.xen.org/xenwiki/Linux_30_bugs
On thing I forgot to mention, is that if I hit or get close to this
memory issue, one time in three/four on reboot the system hangs at the
final reboot request into the kernel.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 07:00:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 07:00:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAj3v-0005dy-TP; Mon, 03 Oct 2011 07:00:07 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAizp-0004qB-Ow
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 06:55:56 -0700
X-Env-Sender: chintamani.sid@gmail.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1317650149!17879868!1
X-Originating-IP: [216.139.236.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17236 invoked from network); 3 Oct 2011 13:55:50 -0000
Received: from sam.nabble.com (HELO sam.nabble.com) (216.139.236.26)
	by server-2.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Oct 2011 13:55:50 -0000
Received: from [192.168.236.26] (helo=sam.nabble.com)
	by sam.nabble.com with esmtp (Exim 4.72)
	(envelope-from <chintamani.sid@gmail.com>) id 1RAizk-0006oL-Ks
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 06:55:48 -0700
Date: Mon, 3 Oct 2011 06:55:48 -0700 (PDT)
From: Chintamani Siddeshwar <chintamani.sid@gmail.com>
To: xen-devel@lists.xensource.com
Message-ID: <CANF5qa9Odq5o-URRjYmixqyC1oNVVkuPGpEp53B_zcwTVbP+pA@mail.gmail.com>
In-Reply-To: <20111003134337.GC36575@ocelot.phlegethon.org>
References: <1317172992048-4847541.post@n5.nabble.com>
	<1317312832330-4853794.post@n5.nabble.com>
	<CAAJKtqpQ7RC2=Mz1B9V1t4HPKPx_9kpxd+xL9mPoE0WCqR2fEA@mail.gmail.com>
	<1317516481414-4861071.post@n5.nabble.com>
	<20111003093121.GB36575@ocelot.phlegethon.org>
	<1317649070412-4864887.post@n5.nabble.com>
	<20111003134337.GC36575@ocelot.phlegethon.org>
MIME-Version: 1.0
Subject: [Xen-devel] Re: Getting the page fault count for 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="===============0762169014=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0762169014==
Content-Type: multipart/alternative; 
	boundary="----=_Part_4236_2983969.1317650148623"

------=_Part_4236_2983969.1317650148623
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Okay.
Is it possible to get this info from within Dom0, because Dom0 handles disk
paging.
Would it help to look at the backend dd's or the xend?

   thanks
Chintamani


On Mon, Oct 3, 2011 at 8:44 AM, Tim Deegan-6 [via Xen] <
ml-node+s1045712n4864909h61@n5.nabble.com> wrote:

> At 06:37 -0700 on 03 Oct (1317623870), Chintamani Siddeshwar wrote:
> > I am interested in counting the number of page-faults in the guest -
> > page-faults that result in a disk I/O.
>
> You will have to do that from inside the guest - only the guest's OS
> knows which of its page-faults result in I/O, and on modern (EPT/RVI)
> hardware, Xen doesn't even see most guest page-faults.
>
> > Also when would XEN tools page a guest memory to disk? Is it a manual
> > process (by running "xenpaging" command) or is it a performance
> enhancement
> > added in recent versions of XEN?
>
> Only when the xenpaging daemon is running.  It is definitely not a
> performance enhancement (memory pressure is better dealt with by the
> guest) but is useful as a backstop if you're overcommitting memory some
> other way.
>
> Tim.
>
> _______________________________________________
> Xen-devel mailing list
> [hidden email] <http://user/SendEmail.jtp?type=node&node=4864909&i=0>
> http://lists.xensource.com/xen-devel
>
>
> ------------------------------
>  If you reply to this email, your message will be added to the discussion
> below:
>
> http://xen.1045712.n5.nabble.com/Getting-the-page-fault-count-for-domU-tp4847541p4864909.html
>  To unsubscribe from Getting the page fault count for domU, click here<http://xen.1045712.n5.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=4847541&code=Y2hpbnRhbWFuaS5zaWRAZ21haWwuY29tfDQ4NDc1NDF8MTYwNDQ2Nzc4MQ==>.
>
>


--
View this message in context: http://xen.1045712.n5.nabble.com/Getting-the-page-fault-count-for-domU-tp4847541p4864950.html
Sent from the Xen - Dev mailing list archive at Nabble.com.
------=_Part_4236_2983969.1317650148623
Content-Type: text/html; charset=UTF8
Content-Transfer-Encoding: quoted-printable

Okay.<br>Is it possible to get this info from within Dom0, because Dom0 han=
dles disk paging.<br>Would it help to look at the backend dd&#39;s or the x=
end?<br><br>=C2=A0=C2=A0 thanks<br>Chintamani<br><br><br><div class=3D"gmai=
l_quote">
On Mon, Oct 3, 2011 at 8:44 AM, Tim Deegan-6 [via Xen] <span dir=3D"ltr">&l=
t;<a href=3D"/user/SendEmail.jtp?type=3Dnode&node=3D4864950&i=3D0" target=
=3D"_top" rel=3D"nofollow" link=3D"external">[hidden email]</a>&gt;</span> =
wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bord=
er-left:1px #ccc solid;padding-left:1ex;">
<div class=3D"im">

=09At 06:37 -0700 on 03 Oct (1317623870), Chintamani Siddeshwar wrote:
<br></div><div class=3D"im">&gt; I am interested in counting the number of =
page-faults in the guest -
<br>&gt; page-faults that result in a disk I/O.
<br><br></div><div class=3D"im">You will have to do that from inside the gu=
est - only the guest&#39;s OS
<br>knows which of its page-faults result in I/O, and on modern (EPT/RVI)
<br>hardware, Xen doesn&#39;t even see most guest page-faults.
<br><br></div><div class=3D"im">&gt; Also when would XEN tools page a guest=
 memory to disk? Is it a manual
<br>&gt; process (by running &quot;xenpaging&quot; command) or is it a perf=
ormance enhancement
<br>&gt; added in recent versions of XEN?
<br><br></div><div class=3D"im">Only when the xenpaging daemon is running. =
=C2=A0It is definitely not a
<br>performance enhancement (memory pressure is better dealt with by the
<br>guest) but is useful as a backstop if you&#39;re overcommitting memory =
some
<br>other way.
<br><br>Tim.
<br><br></div><div class=3D"im">___________________________________________=
____
<br>Xen-devel mailing list
<br><a href=3D"http://user/SendEmail.jtp?type=3Dnode&amp;node=3D4864909&amp=
;i=3D0" rel=3D"nofollow" link=3D"external" target=3D"_blank">[hidden email]=
</a>
<br><a href=3D"http://lists.xensource.com/xen-devel" rel=3D"nofollow" link=
=3D"external" target=3D"_blank">http://lists.xensource.com/xen-devel</a><br=
>
=09
=09<br>
=09<br>
=09</div><hr color=3D"#cccccc" noshade size=3D"1">
=09<div style=3D"color:#444;font:12px tahoma,geneva,helvetica,arial,sans-se=
rif"><div class=3D"im">
=09=09<div style=3D"font-weight:bold">If you reply to this email, your mess=
age will be added to the discussion below:</div>
=09=09</div><a href=3D"http://xen.1045712.n5.nabble.com/Getting-the-page-fa=
ult-count-for-domU-tp4847541p4864909.html" target=3D"_blank" rel=3D"nofollo=
w" link=3D"external">http://xen.1045712.n5.nabble.com/Getting-the-page-faul=
t-count-for-domU-tp4847541p4864909.html</a>
=09</div><div><div></div><div class=3D"h5">
=09<div style=3D"color:#666;font:11px tahoma,geneva,helvetica,arial,sans-se=
rif;margin-top:.4em">
=09=09
=09=09To unsubscribe from Getting the page fault count for domU, <a href=3D=
"" target=3D"_blank" rel=3D"nofollow" link=3D"external">click here</a>.
=09</div></div></div></blockquote></div><br>

=09
<br/><hr align=3D"left" width=3D"300" />
View this message in context: <a href=3D"http://xen.1045712.n5.nabble.com/G=
etting-the-page-fault-count-for-domU-tp4847541p4864950.html">Re: Getting th=
e page fault count for domU</a><br/>
Sent from the <a href=3D"http://xen.1045712.n5.nabble.com/Xen-Dev-f2473738.=
html">Xen - Dev mailing list archive</a> at Nabble.com.<br/>
------=_Part_4236_2983969.1317650148623--


--===============0762169014==
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

--===============0762169014==--


From xen-devel-bounces@lists.xensource.com Mon Oct 03 07:09:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 07:09:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAjD7-000681-S6; Mon, 03 Oct 2011 07:09:37 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAjB5-0005tw-2K
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 07:07:52 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317650829!44936631!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25376 invoked from network); 3 Oct 2011 14:07:09 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Oct 2011 14:07:09 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RAjB1-000AFv-KA; Mon, 03 Oct 2011 14:07:27 +0000
Date: Mon, 3 Oct 2011 15:07:27 +0100
From: Tim Deegan <tim@xen.org>
To: Chintamani Siddeshwar <chintamani.sid@gmail.com>
Subject: Re: [Xen-devel] Re: Getting the page fault count for domU
Message-ID: <20111003140727.GD36575@ocelot.phlegethon.org>
References: <1317172992048-4847541.post@n5.nabble.com>
	<1317312832330-4853794.post@n5.nabble.com>
	<CAAJKtqpQ7RC2=Mz1B9V1t4HPKPx_9kpxd+xL9mPoE0WCqR2fEA@mail.gmail.com>
	<1317516481414-4861071.post@n5.nabble.com>
	<20111003093121.GB36575@ocelot.phlegethon.org>
	<1317649070412-4864887.post@n5.nabble.com>
	<20111003134337.GC36575@ocelot.phlegethon.org>
	<CANF5qa9Odq5o-URRjYmixqyC1oNVVkuPGpEp53B_zcwTVbP+pA@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CANF5qa9Odq5o-URRjYmixqyC1oNVVkuPGpEp53B_zcwTVbP+pA@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

Please don't top-post.

At 06:55 -0700 on 03 Oct (1317624948), Chintamani Siddeshwar wrote:
> Okay.
> Is it possible to get this info from within Dom0, because Dom0 handles disk
> paging.

Not unless dom0 can figure out which parts of the guest's disk I/O is
paging and which not.  In some OSes that might be easier than others,
but it will always need knowledge of the guest OS internals and
configuration.

Tim.

> On Mon, Oct 3, 2011 at 8:44 AM, Tim Deegan-6 [via Xen] <
> ml-node+s1045712n4864909h61@n5.nabble.com> wrote:
> 
> > At 06:37 -0700 on 03 Oct (1317623870), Chintamani Siddeshwar wrote:
> > > I am interested in counting the number of page-faults in the guest -
> > > page-faults that result in a disk I/O.
> >
> > You will have to do that from inside the guest - only the guest's OS
> > knows which of its page-faults result in I/O, and on modern (EPT/RVI)
> > hardware, Xen doesn't even see most guest page-faults.
> >
> > > Also when would XEN tools page a guest memory to disk? Is it a manual
> > > process (by running "xenpaging" command) or is it a performance
> > enhancement
> > > added in recent versions of XEN?
> >
> > Only when the xenpaging daemon is running.  It is definitely not a
> > performance enhancement (memory pressure is better dealt with by the
> > guest) but is useful as a backstop if you're overcommitting memory some
> > other way.
> >
> > Tim.


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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 07:44:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 07:44:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAjl3-0007Cb-2n; Mon, 03 Oct 2011 07:44:41 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAjkN-0006zo-QV
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 07:44:00 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317653036!33701839!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9803 invoked from network); 3 Oct 2011 14:43:56 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-2.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 14:43:56 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317653036; l=362;
	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=xR/nl21+zsCUAJoFAsBC3+XR+hQ=;
	b=e0xGrazktUJblNfZ78TS0z05KXfHROoI8ckqgPeXtpKKiqZ+9rNAwaCEimwyx4UFynI
	3+3VHcXHkky8E3k/V01+roYWIJqCOciW5CsE3+Uqp078LqDkgtAWn2st0CvZToIo6wfAu
	s2xmasNzWVhGIZTpuePMO9Y6neeLMEr9MkM=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiC0PETIB
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-076-129.pools.arcor-ip.net [88.65.76.129])
	by post.strato.de (mrclete mo12) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id N03725n93Cjf1T
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 16:43:54 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id B47D818892
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 16:43:53 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1317653033@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 16:43:53 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 0 of 4] xenpaging fixes for xen-unstable
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 changes the p2m_mem_paging* functions to modify the p2mt
under the p2m_lock, and there is a change to improve PoD handling.

Please review and apply.

Olaf


 xen/arch/x86/mm/p2m-pod.c |   15 ++++++++++
 xen/arch/x86/mm/p2m.c     |   69 ++++++++++++++++++++++++++++------------------
 2 files changed, 57 insertions(+), 27 deletions(-)


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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 07:45:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 07:45:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAjmA-0007Zo-Vj; Mon, 03 Oct 2011 07:45:51 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAjkV-00070m-6W
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 07:44:07 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317653023!40614155!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17170 invoked from network); 3 Oct 2011 14:43:43 -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; 3 Oct 2011 14:43:43 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317653043; l=3923;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=nk8+l0oowJD0mDqzOGTGc1JmYG0=;
	b=OIHbbn2+VlaDSER+ggLxDwDfFxaRFn7OHdoQp/9SqRQgFcJ0P6IEHuu23ENf/nwF0a2
	TVIoAp35EkuQrSdOTsAHBP53uUxSzfD+s3fd9/OVGwWshC9usVp3+HywbkZhrcdeMO3jx
	xCTJGAwd4b67oRejb7OWefaGXZa4rKp5rgo=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiC0PETIB
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-076-129.pools.arcor-ip.net [88.65.76.129])
	by post.strato.de (mrclete mo20) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id z03bdan93ELp2d
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 16:43:54 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 1F75C18B66
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 16:43:54 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 6bf1aa780b9ff40c50cfd00cfa8796ccc76286ee
Message-Id: <6bf1aa780b9ff40c50cf.1317653035@probook.site>
In-Reply-To: <patchbomb.1317653033@probook.site>
References: <patchbomb.1317653033@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 16:43:55 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 2 of 4] xenpaging: fix locking in p2m_mem_paging
	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 Olaf Hering <olaf@aepfle.de>
# Date 1317652810 -7200
# Node ID 6bf1aa780b9ff40c50cfd00cfa8796ccc76286ee
# Parent  a96c307da5101c610fed1ca5fe877f220071d29e
xenpaging: fix locking in p2m_mem_paging functions

As suggested by <hongkaixing@huawei.com>, query and adjust the p2mt
under the p2m_lock to prevent races with PoD.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r a96c307da510 -r 6bf1aa780b9f xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -675,6 +675,8 @@ int p2m_mem_paging_nominate(struct domai
     mfn_t mfn;
     int ret;
 
+    p2m_lock(p2m);
+
     mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
 
     /* Check if mfn is valid */
@@ -701,14 +703,12 @@ int p2m_mem_paging_nominate(struct domai
         goto out;
 
     /* Fix p2m entry */
-    p2m_lock(p2m);
     set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_paging_out, a);
     audit_p2m(p2m, 1);
-    p2m_unlock(p2m);
-
     ret = 0;
 
  out:
+    p2m_unlock(p2m);
     return ret;
 }
 
@@ -719,30 +719,31 @@ int p2m_mem_paging_evict(struct domain *
     p2m_access_t a;
     mfn_t mfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
+    int ret = -EINVAL;
+
+    p2m_lock(p2m);
 
     /* Get mfn */
     mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
     if ( unlikely(!mfn_valid(mfn)) )
-        return -EINVAL;
+        goto out;
 
     if ( (p2mt == p2m_ram_paged) || (p2mt == p2m_ram_paging_in) ||
          (p2mt == p2m_ram_paging_in_start) )
-        return -EINVAL;
+        goto out;
 
     /* Get the page so it doesn't get modified under Xen's feet */
     page = mfn_to_page(mfn);
     if ( unlikely(!get_page(page, d)) )
-        return -EINVAL;
+        goto out;
 
     /* Decrement guest domain's ref count of the page */
     if ( test_and_clear_bit(_PGC_allocated, &page->count_info) )
         put_page(page);
 
     /* Remove mapping from p2m table */
-    p2m_lock(p2m);
     set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, p2m_ram_paged, a);
     audit_p2m(p2m, 1);
-    p2m_unlock(p2m);
 
     /* Put the page back so it gets freed */
     put_page(page);
@@ -750,7 +751,11 @@ int p2m_mem_paging_evict(struct domain *
     /* Track number of paged gfns */
     atomic_inc(&d->paged_pages);
 
-    return 0;
+    ret = 0;
+
+ out:
+    p2m_unlock(p2m);
+    return ret;
 }
 
 void p2m_mem_paging_drop_page(struct domain *d, unsigned long gfn)
@@ -789,15 +794,15 @@ void p2m_mem_paging_populate(struct doma
     /* Fix p2m mapping */
     /* XXX: It seems inefficient to have this here, as it's only needed
      *      in one case (ept guest accessing paging out page) */
+    p2m_lock(p2m);
     p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
     if ( p2mt == p2m_ram_paged )
     {
-        p2m_lock(p2m);
         set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, 
                       p2m_ram_paging_in_start, a);
         audit_p2m(p2m, 1);
-        p2m_unlock(p2m);
     }
+    p2m_unlock(p2m);
 
     /* Pause domain */
     if ( v->domain->domain_id == d->domain_id )
@@ -826,22 +831,28 @@ int p2m_mem_paging_prep(struct domain *d
     p2m_type_t p2mt;
     p2m_access_t a;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
+    int ret = -ENOMEM;
+
+    p2m_lock(p2m);
 
     p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
+
     /* Get a free page */
     page = alloc_domheap_page(p2m->domain, 0);
     if ( unlikely(page == NULL) )
-        return -ENOMEM;
+        goto out;
 
     /* Fix p2m mapping */
-    p2m_lock(p2m);
     set_p2m_entry(p2m, gfn, page_to_mfn(page), 0, p2m_ram_paging_in, a);
     audit_p2m(p2m, 1);
-    p2m_unlock(p2m);
 
     atomic_dec(&d->paged_pages);
 
-    return 0;
+    ret = 0;
+
+ out:
+    p2m_unlock(p2m);
+    return ret;
 }
 
 void p2m_mem_paging_resume(struct domain *d)
@@ -858,8 +869,8 @@ void p2m_mem_paging_resume(struct domain
     /* 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);
-        p2m_lock(p2m);
         set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
         set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
         audit_p2m(p2m, 1);

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 07:46:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 07:46:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAjn7-0007wT-BP; Mon, 03 Oct 2011 07:46:49 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAjkb-00072L-4G
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 07:44:14 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-15.tower-27.messagelabs.com!1317653039!49320617!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30015 invoked from network); 3 Oct 2011 14:43:59 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-15.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 14:43:59 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317653049; l=4170;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=RWze723zsGpHfKkCRbRGe0s3B64=;
	b=BYogc7veckcNF1rZg4DZ/Nri/A6jdMx0VG8yWxo/sbd7U2yhxTls6ZXsR+RqeyCMTMD
	tiV1RQ1hdHSBOtQoxT1QuUjwbFdKhwRplWVxX9OJRdRU0HGR7v3rwzp0B7U/V4KI9ifUE
	wmqBbQAhn0sl33lKInLqVdILQgAhmb9nSUA=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiC0PETIB
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-076-129.pools.arcor-ip.net [88.65.76.129])
	by smtp.strato.de (jimi mo1) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id e06864n93D1Hv4
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 16:43:54 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id E7D7418B65
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 16:43:53 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a96c307da5101c610fed1ca5fe877f220071d29e
Message-Id: <a96c307da5101c610fed.1317653034@probook.site>
In-Reply-To: <patchbomb.1317653033@probook.site>
References: <patchbomb.1317653033@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 16:43:54 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 1 of 4] xenpaging: use p2m->get_entry() in
 p2m_mem_paging 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 Olaf Hering <olaf@aepfle.de>
# Date 1317652809 -7200
# Node ID a96c307da5101c610fed1ca5fe877f220071d29e
# Parent  e78cd03b0308c3ba5737ba9821bf7272f45549ca
xenpaging: use p2m->get_entry() in p2m_mem_paging functions

Use p2m->get_entry() in the p2m_mem_paging functions. This preserves the
p2m_access type when gfn is updated with set_p2m_entry().
Its also a preparation for locking fixes in a subsequent patch.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r e78cd03b0308 -r a96c307da510 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -671,10 +671,11 @@ int p2m_mem_paging_nominate(struct domai
     struct page_info *page;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     p2m_type_t p2mt;
+    p2m_access_t a;
     mfn_t mfn;
     int ret;
 
-    mfn = gfn_to_mfn(p2m->domain, gfn, &p2mt);
+    mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
 
     /* Check if mfn is valid */
     ret = -EINVAL;
@@ -701,7 +702,7 @@ int p2m_mem_paging_nominate(struct domai
 
     /* Fix p2m entry */
     p2m_lock(p2m);
-    set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_paging_out, p2m->default_access);
+    set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_paging_out, a);
     audit_p2m(p2m, 1);
     p2m_unlock(p2m);
 
@@ -715,11 +716,12 @@ int p2m_mem_paging_evict(struct domain *
 {
     struct page_info *page;
     p2m_type_t p2mt;
+    p2m_access_t a;
     mfn_t mfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
     /* Get mfn */
-    mfn = gfn_to_mfn(d, gfn, &p2mt);
+    mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
     if ( unlikely(!mfn_valid(mfn)) )
         return -EINVAL;
 
@@ -738,8 +740,7 @@ int p2m_mem_paging_evict(struct domain *
 
     /* Remove mapping from p2m table */
     p2m_lock(p2m);
-    set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, 
-                  p2m_ram_paged, p2m->default_access);
+    set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, p2m_ram_paged, a);
     audit_p2m(p2m, 1);
     p2m_unlock(p2m);
 
@@ -775,6 +776,7 @@ void p2m_mem_paging_populate(struct doma
     struct vcpu *v = current;
     mem_event_request_t req;
     p2m_type_t p2mt;
+    p2m_access_t a;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
     /* Check that there's space on the ring for this request */
@@ -787,12 +789,12 @@ void p2m_mem_paging_populate(struct doma
     /* Fix p2m mapping */
     /* XXX: It seems inefficient to have this here, as it's only needed
      *      in one case (ept guest accessing paging out page) */
-    gfn_to_mfn(d, gfn, &p2mt);
+    p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
     if ( p2mt == p2m_ram_paged )
     {
         p2m_lock(p2m);
         set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, 
-                      p2m_ram_paging_in_start, p2m->default_access);
+                      p2m_ram_paging_in_start, a);
         audit_p2m(p2m, 1);
         p2m_unlock(p2m);
     }
@@ -821,8 +823,11 @@ void p2m_mem_paging_populate(struct doma
 int p2m_mem_paging_prep(struct domain *d, unsigned long gfn)
 {
     struct page_info *page;
+    p2m_type_t p2mt;
+    p2m_access_t a;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
+    p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
     /* Get a free page */
     page = alloc_domheap_page(p2m->domain, 0);
     if ( unlikely(page == NULL) )
@@ -830,7 +835,7 @@ int p2m_mem_paging_prep(struct domain *d
 
     /* Fix p2m mapping */
     p2m_lock(p2m);
-    set_p2m_entry(p2m, gfn, page_to_mfn(page), 0, p2m_ram_paging_in, p2m->default_access);
+    set_p2m_entry(p2m, gfn, page_to_mfn(page), 0, p2m_ram_paging_in, a);
     audit_p2m(p2m, 1);
     p2m_unlock(p2m);
 
@@ -844,6 +849,7 @@ void p2m_mem_paging_resume(struct domain
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     mem_event_response_t rsp;
     p2m_type_t p2mt;
+    p2m_access_t a;
     mfn_t mfn;
 
     /* Pull the response off the ring */
@@ -852,9 +858,9 @@ void p2m_mem_paging_resume(struct domain
     /* Fix p2m entry if the page was not dropped */
     if ( !(rsp.flags & MEM_EVENT_FLAG_DROP_PAGE) )
     {
-        mfn = gfn_to_mfn(d, rsp.gfn, &p2mt);
+        mfn = p2m->get_entry(p2m, rsp.gfn, &p2mt, &a, p2m_query, NULL);
         p2m_lock(p2m);
-        set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, p2m->default_access);
+        set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
         set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
         audit_p2m(p2m, 1);
         p2m_unlock(p2m);

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 07:48:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 07:48:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAjoS-0008PV-4T; Mon, 03 Oct 2011 07:48:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAjkd-00073l-Vk
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 07:44:17 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-13.tower-182.messagelabs.com!1317653052!20549134!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3242 invoked from network); 3 Oct 2011 14:44:12 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-13.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Oct 2011 14:44:12 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317653052; l=1078;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=2epANTdflEUvjM++XVDkeKtjjQo=;
	b=EeCuFOy3TQ+C0wQCNoDtqyZqxKy1R0cYPdznWDluXmyVL36rc2LQTlZzgVOqStvPnUi
	xbSdnsuerTnK+wWqQ39MNr/3yzb79HxfllQxT8eJEBm6vLQRUDdXRcK7fXPiMExmpTjmu
	HV4TARkYUkFGhVHw0fBCE/OqZNpEWyTnmg4=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiC0PETIB
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-076-129.pools.arcor-ip.net [88.65.76.129])
	by smtp.strato.de (cohen mo8) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id f0074en93CuwgT
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 16:43:55 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 4DB0C18B67
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 16:43:54 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 13872c432c3807e0f977d9c1311801179807ece2
Message-Id: <13872c432c3807e0f977.1317653036@probook.site>
In-Reply-To: <patchbomb.1317653033@probook.site>
References: <patchbomb.1317653033@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 16:43:56 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 3 of 4] xenpaging: remove confusing comment from
 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 1317652811 -7200
# Node ID 13872c432c3807e0f977d9c1311801179807ece2
# Parent  6bf1aa780b9ff40c50cfd00cfa8796ccc76286ee
xenpaging: remove confusing comment from p2m_mem_paging_populate

Currently there is no way to avoid the double check of the p2mt
because p2m_mem_paging_populate() is called from many places without
the p2m_lock held. Upcoming changes will move the function into
gfn_to_mfn(), so its interface could be changed and the extra
p2m_lock/get_entry can be removed.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 6bf1aa780b9f -r 13872c432c38 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -792,8 +792,6 @@ void p2m_mem_paging_populate(struct doma
     req.type = MEM_EVENT_TYPE_PAGING;
 
     /* Fix p2m mapping */
-    /* XXX: It seems inefficient to have this here, as it's only needed
-     *      in one case (ept guest accessing paging out page) */
     p2m_lock(p2m);
     p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
     if ( p2mt == p2m_ram_paged )

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 07:49:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 07:49:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAjpN-0000KY-7f; Mon, 03 Oct 2011 07:49:09 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAjkg-00074l-Hu
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 07:44:18 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317653039!56471593!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18282 invoked from network); 3 Oct 2011 14:44:00 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 14:44:00 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317653055; l=1194;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=7DrV4g9yrqncPM4CpawGVRR/Ln4=;
	b=c9NZNLTPE7LMXSBVqX1TxmAQo7/LUmNrMSZ/904eP6m3igBRd9tEmBTGE9GvzQWFn39
	rauV+Ra9JBbxOywMYCqNHALPzhtkLyY/Um6Br+u86SleiPdtEAhtc4g9KCOYWzveKPqTI
	AiWg9dhwJfyevGS7nVuVRQTTgFB54baE9IU=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiC0PETIB
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-076-129.pools.arcor-ip.net [88.65.76.129])
	by smtp.strato.de (jimi mo28) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id 3000fbn93CBq8M
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 16:43:55 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 8695F18B68
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 16:43:54 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: b05ede64aaf5f5090fdb844c3a58f1f92d9b3588
Message-Id: <b05ede64aaf5f5090fdb.1317653037@probook.site>
In-Reply-To: <patchbomb.1317653033@probook.site>
References: <patchbomb.1317653033@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 16:43:57 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 4 of 4] xenpaging: handle paged pages in
 p2m_pod_decrease_reservation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317652812 -7200
# Node ID b05ede64aaf5f5090fdb844c3a58f1f92d9b3588
# Parent  13872c432c3807e0f977d9c1311801179807ece2
xenpaging: handle paged pages in p2m_pod_decrease_reservation

As suggested by <hongkaixing@huawei.com>, handle paged pages in PoD code.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 13872c432c38 -r b05ede64aaf5 xen/arch/x86/mm/p2m-pod.c
--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -567,6 +567,21 @@ p2m_pod_decrease_reservation(struct doma
             BUG_ON(p2m->pod.entry_count < 0);
             pod--;
         }
+        else if ( steal_for_cache && p2m_is_paging(t) )
+        {
+            struct page_info *page;
+            /* alloc a new page to compensate the pod list */
+            page = alloc_domheap_page(d, 0);
+            if ( !page )
+                goto out_entry_check;
+            set_p2m_entry(p2m, gpfn + i, _mfn(INVALID_MFN), 0, p2m_invalid, p2m->default_access);
+            p2m_mem_paging_drop_page(d, gpfn+i);
+            p2m_pod_cache_add(p2m, page, 0);
+            steal_for_cache =  ( p2m->pod.entry_count > p2m->pod.count );
+            nonpod--;
+            ram--;
+        }
+        /* for other ram types */
         else if ( steal_for_cache && p2m_is_ram(t) )
         {
             struct page_info *page;

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 07:56:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 07:56:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAjww-0000nX-TW; Mon, 03 Oct 2011 07:56:58 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAjwU-0000bm-BR
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 07:56:30 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-14.tower-182.messagelabs.com!1317653786!20524746!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14504 invoked from network); 3 Oct 2011 14:56:27 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-14.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 14:56:27 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317653786; l=2189;
	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=U8hLnnTabNXv4vyJttNP+35tMqs=;
	b=caHxbyOW5+x8l7JDssvWycGGuOiOgRxNF7FXf1fJOr72P9VxWwVmMP+wFxAeD/xaMdv
	IfTQeQmLD0bbq4bXPyOWWsMlP/zZ+dFM4NiZATGtN6JUbaNuWoqWNoHhmX8Aw+01g2fDz
	OUEMxLWtgVsEteRWzjg4uOz8ic3bPbDU9wQ=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiC0PETIB
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-076-129.pools.arcor-ip.net [88.65.76.129])
	by smtp.strato.de (fruni mo21) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 6060can93Chgtk ;
	Mon, 3 Oct 2011 16:56:17 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 43F1618B65; Mon,  3 Oct 2011 16:56:16 +0200 (CEST)
Date: Mon, 3 Oct 2011 16:56:16 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Adin Scannell <adin@gridcentric.ca>
Subject: Re: [Xen-devel] Re: mapping problems in xenpaging
Message-ID: <20111003145616.GA8610@aepfle.de>
References: <CACavRyB4kvMLZK1-vv9bJnVdnpKJBHTmnhJxt6g3eh88xY6FTg@mail.gmail.com>
	<20110929170244.GA29163@aepfle.de>
	<CAAJKtqrFuJkNAZZhRs8tC0ymgQTD0G2VTgYexQ9EhnCxsJNZuw@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <CAAJKtqrFuJkNAZZhRs8tC0ymgQTD0G2VTgYexQ9EhnCxsJNZuw@mail.gmail.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: zhen shi <bickys1986@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 Fri, Sep 30, Adin Scannell wrote:

> >> Â When we analyze and test xenpaging,we found there are some problemsÂ between
> >> mapping and xenpaging.
> >> Â 1) When mapping firstly, then do xenpaging,and the code paths have resolved
> >> the problems.It's OK.
> >> Â 2) The problems exists if we do address mapping firstly then go to
> >> xenpaging,and our confusions are as followings:
> >> Â Â  a) If the domU's memory is directly mapped to dom0,such as the hypercall
> >> from pv driver,then it will build a related page-table in dom0,which will not
> >> change p2m-type.
> >> Â Â Â Â  Â and then do the xenpaging to page out the domU's memory pages whose gfn
> >> address have been already mapped to dom0;So it will cause some problems when
> >> dom0
> >> Â Â Â Â  Â accesses these pages.Because these pages are paged-out,and dom0 cannot
> >> tell the p2mt before access the pages.
> >
> > I'm not entirely sure what you do. xenpaging runs in dom0 and is able to
> > map paged-out pages. It uses that to trigger a page-in, see
> > tools/xenpaging/pagein.c in xen-unstable.hg
> 
> Here's my take...
> 
> Xenpaging doesn't allow selection of pages that have been mapped by
> other domains (as in p2m.c):
> 
>  669 int p2m_mem_paging_nominate(struct domain *d, unsigned long gfn)
> ....
>  693     /* Check page count and type */
>  694     page = mfn_to_page(mfn);
>  695     if ( (page->count_info & (PGC_count_mask | PGC_allocated)) !=
>  696          (1 | PGC_allocated) )
>  697         goto out;
> 
> *However*, I think that the problem Zhen is describing still exists:
> 1) xenpaging nominates a page, it is successful.
> 2) dom0 maps the same page (a process other than xenpaging, which will
> also map it).
> 3) xenpaging evicts the page, successfully.
> 
> I've experienced a few nasty crashes, and I think this could account
> for a couple (but certainly not all)... I think that the solution may
> be to repeat the refcount check in paging_evict, and roll back the
> nomination gracefully if the race is detected. Thoughts?

Are there really code paths that touch a mfn without going through the
p2m functions? If so I will copy the check and update xenpaging.

Olaf

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 08:11:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 08:11:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAkB8-0001Rc-M4; Mon, 03 Oct 2011 08:11:38 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkA1-0001FA-V8
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:10:33 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317654606!40619499!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23043 invoked from network); 3 Oct 2011 15:10:06 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Oct 2011 15:10:06 -0000
X-IronPort-AV: E=Sophos;i="4.68,479,1312156800"; 
   d="scan'208";a="8182340"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Oct 2011 15:10:26 +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, 3 Oct 2011
	16:10:26 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Thomas Gleixner <tglx@linutronix.de>, Jeremy Fitzhardinge
	<Jeremy.Fitzhardinge@citrix.com>, Konrad Rzeszutek Wilk
	<konrad.wilk@oracle.com>
Date: Mon, 3 Oct 2011 16:10:26 +0100
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: xen-devel <xen-devel@lists.xensource.com>,
	linux-kernel <linux-kernel@vger.kernel.org>
Subject: [Xen-devel] xen: IPI interrupts not resumed early enough on
	suspend/resume
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Thomas,

Recently I've been chasing an issue where a Xen guest will fail to
resume about 1 time in 100. I eventually managed to bisect this back to
676dc3cf5bc3 "xen: Use IRQF_FORCE_RESUME".

The Xen suspend procedure (drivers/xen/manage.c:do_suspend()) is roughly
(I've omitted some uninteresting parts) as follows:
  dpm_suspend_start()
  dpm_suspend_noirq()
  stop_machine()
   -> xen_suspend()
        syscore_suspend()
        HYPERVISOR_suspend() /* Hypercall, returns on resume */
        xen_irq_resume() /* Re-establishes evtchn<->irq bindings */
        syscore_resume()
  dpm_resume_noirq()
  dpm_resume_end()

The resume process appears to be coming to a halt at the end of the
stop_machine invocation of xen_suspend(), i.e. after syscore_resume()
but before dpm_resume_noirq().

Looking at the stack traces of all VCPUs when this happens it appears
that they are all idle, which suggests we are missing an event to cause
a reschedule out of the stop_machine thread back into the suspending
thread.

One of the effects of 676dc3cf5bc3 was to move the unmasking of the
timer and IPI interrupts from xen_irq_resume() (i.e. within the
stop_machine region) to dpm_resume_noirq() (i.e. outside the
stop_machine region). Since the IPI interrupts includes the reschedule
IPI I rather suspect that is the reason for the problem. I added a hack
to unmask the reched* IPIs at xen_irq_resume() time and so far it seems
to fix things, which backs up my gut feeling.

I can see a few options for how I might go about solving this in a
non-hacky way, which approach do you think would be preferable:

      * Add "IRQF_RESUME_EARLY", driven from syscore_resume, and use it
        for these interrupts.
      * register syscore ops for the Xen event channel subsystem to
        unmask the IPIs earlier (would probably look a lot like the code
        removed by 676dc3cf5bc3).
      * add syscore_ops to Xen smp subsystem to unmask the specific IPIs
        (which it binds at start of day) earlier.
      * push dpm_(suspend|resume)_noirq down into stop machine region
      * use something other than stop_machine to quiesce system and move
        to cpu0 for suspend (doesn't seem sensible to reproduce that
        functionality).

Routing IPIs through the regular IRQ path seems a little bit unusual but
it looks like powerpc does something similar in smp_request_message_ipi
and mpic_request_ipis and that code uses the syscore approach. Does
applying that here too seem sane?

Any preference / advice?

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 Oct 03 08:48:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 08:48:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAkka-0002ZK-Fk; Mon, 03 Oct 2011 08:48:16 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RAkjs-0002N4-E6
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:47:32 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-2.tower-182.messagelabs.com!1317656848!17905131!1
X-Originating-IP: [71.74.56.125]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11725 invoked from network); 3 Oct 2011 15:47:29 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.125) by server-2.tower-182.messagelabs.com with SMTP;
	3 Oct 2011 15:47:29 -0000
X-Authority-Analysis: v=1.1 cv=agqPq5NoKwAPC9P66H7dbYUCjxvmT73as08i4x3aqAA=
	c=1 sm=0 a=msyzJTVhAHgA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=yaZdvZR3UvQ5Ywe43s0A:9
	a=glSFNH00a4lcUjO01FwA:7 a=PUjeQqilurYA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:35973] helo=[192.168.23.10])
	by hrndva-oedge01.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 6D/EA-12608-E09D98E4; Mon, 03 Oct 2011 15:47:28 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jason Baron <jbaron@redhat.com>
Date: Mon, 03 Oct 2011 11:47:26 -0400
In-Reply-To: <20111003150205.GB2462@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317656848.17991.4.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	David Daney <david.daney@cavium.com>, Michael,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-03 at 11:02 -0400, Jason Baron wrote:

> if (!enabled)
> 	arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
> 
> 
> > +		if (iterk == key)
> >  			continue;
> >  
> > -		key = (struct jump_label_key *)(unsigned long)iter->key;
> > -		atomic_set(&key->enabled, 0);
> > +		key = iterk;
> >  		key->entries = iter;
> >  #ifdef CONFIG_MODULES
> >  		key->next = NULL;
> > @@ -212,7 +208,7 @@ void jump_label_apply_nops(struct module *mod)
> >  		return;
> >  
> >  	for (iter = iter_start; iter < iter_stop; iter++)
> > -		arch_jump_label_text_poke_early(iter->code);
> > +		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
> >  }
> >  
> >  static int jump_label_add_module(struct module *mod)
> > -- 
> > 1.7.6.2
> > 
> 
> hmmm...this is used on module load in smp - so this would introduce a number of
> calls to stop_machine() where we didn't have them before. Yes, module
> load is a very slow path to begin with, but I think its at least worth
> pointing out...

And it is a good point to point out. As stop_machine becomes noticeable
by users on large scale CPU boxes. Ideally, we want to avoid stopmachine
when we do not need it.

-- Steve



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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 08:55:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 08:55:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAkrs-00034h-PA; Mon, 03 Oct 2011 08:55:48 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkqp-0002pv-Q2
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:44 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317657168!38646448!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27657 invoked from network); 3 Oct 2011 15:52:48 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-14.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:52:48 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657280; l=1524;
	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=d/Qde0RMXwj4jo9QK0Bgy8OkcO4=;
	b=V83NzHfhrn829g4/EEMGZzgEDg8vHPPyETO/0HCicCFs/iaepbtF+a4hKzod4W3qgk5
	UFkCpfqaNS/JdHr+x8iPyjCsLER/lLI2LLuHYixOhJw8kbWoN/sV4tDAwceiIxyZADMa3
	KDOwng6CY3xqCnYQSxSe08R/EdH9ShOt/Hs=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by post.strato.de (mrclete mo56) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 5050d2n93FUt0u
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:39 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id A39B218892
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:38 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:37 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 00 of 24] xenpaging fixes for xen-unstable
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 support for xenpaging to libxl and the xl command.
A few code cleanup changes are also part of this series.

The logic of xenpaging was reversed.
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.

Three new configuration file options specific for xenpaging were added:
totmem=<int>
xenpaging_file=<string>
xenpaging_extra=[ 'string', 'string' ]

A new xl command 'mem-tot_pages' instructs xenpaging to adjust its pagefile
size, and it instructs the xl monitor process to actually start xenpaging if
totmem= was not specified in the config file.

Please review and apply.

Olaf


 Config.mk                        |    2 
 config/StdGNU.mk                 |    2 
 tools/libxc/xc_bitops.h          |    6 
 tools/libxl/libxl.c              |  121 +++++++++
 tools/libxl/libxl.h              |    5 
 tools/libxl/libxl_create.c       |  146 +++++++++++
 tools/libxl/libxl_device.c       |   84 ------
 tools/libxl/libxl_dm.c           |   65 +----
 tools/libxl/libxl_dom.c          |    8 
 tools/libxl/libxl_exec.c         |  142 +++++++++++
 tools/libxl/libxl_internal.h     |   33 ++
 tools/libxl/libxl_paths.c        |    5 
 tools/libxl/libxl_types.idl      |    4 
 tools/libxl/xl.h                 |    1 
 tools/libxl/xl_cmdimpl.c         |   71 +++++
 tools/libxl/xl_cmdtable.c        |    5 
 tools/xenpaging/Makefile         |    6 
 tools/xenpaging/file_ops.c       |    6 
 tools/xenpaging/policy_default.c |   23 +
 tools/xenpaging/xenpaging.c      |  479 ++++++++++++++++++++++++++++-----------
 tools/xenpaging/xenpaging.h      |    8 
 21 files changed, 934 insertions(+), 288 deletions(-)


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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 08:56:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 08:56:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAksp-0003Rk-U6; Mon, 03 Oct 2011 08:56:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkqu-0002qJ-SD
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:49 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-13.tower-27.messagelabs.com!1317657272!42572261!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6009 invoked from network); 3 Oct 2011 15:54:32 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 15:54:32 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657285; l=1217;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=3xEeboeC8JoVpM9CyoaMy5QoDaM=;
	b=KAJaBzb2Cahq5XlWA1aJT6t4rbwxfiGE5KIj0GQ/uFiW/3Odh2QPja9MyrQ82d4kCwh
	10HO6f79colfSVNcpRjo4fpKIHhZV2wptRmR122Px4TWCbN/I+FeHALnklhbhJRdyC6hG
	RYRXn8NJKNaQm2vG92CJ1kGo9IQ06C4JzbM=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (cohen mo8) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id f0074en93CuwyX
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:41 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 9225218B67
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:40 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 5d2d87fb19e4749ca11d9d002ee5b44271594cb3
Message-Id: <5d2d87fb19e4749ca11d.1317657286@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:46 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 09 of 24] xenpaging: improve mainloop exit
	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 1317653605 -7200
# Node ID 5d2d87fb19e4749ca11d9d002ee5b44271594cb3
# Parent  87cc0a717a5edc87411295ad0d5cf0b3366da0d3
xenpaging: improve mainloop exit handling

Remove the if/else logic to exit from the in case a signal arrives.
Update comments.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 87cc0a717a5e -r 5d2d87fb19e4 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -804,7 +804,7 @@ int main(int argc, char *argv[])
             }
         }
 
-        /* Write all pages back into the guest */
+        /* If interrupted, write all pages back into the guest */
         if ( interrupted == SIGTERM || interrupted == SIGINT )
         {
             /* If no more pages to process, exit loop. */
@@ -813,13 +813,15 @@ int main(int argc, char *argv[])
             
             /* One more round if there are still pages to process. */
             resume_pages(paging, paging->num_paged_out);
+
+            /* Resume main loop */
+            continue;
         }
-        else
-        {
-            /* Exit on any other signal */
-            if ( interrupted )
-                break;
-        }
+
+        /* Exit main loop on any other signal */
+        if ( interrupted )
+            break;
+
     }
     DPRINTF("xenpaging got signal %d\n", interrupted);
 

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 08:59:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 08:59:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAkv6-0003r5-Ja; Mon, 03 Oct 2011 08:59:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkqu-0002q9-J3
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:49 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-5.tower-21.messagelabs.com!1317657249!50498367!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19651 invoked from network); 3 Oct 2011 15:54:10 -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; 3 Oct 2011 15:54:10 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657285; l=1926;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=hWGa2gz0R4z1CYy9ZnHbuzXwENo=;
	b=y/DCQvYVICyKZ5yHFt6VBLbY3Ks9sEbU4fM57VSxUGuyqGSyH4dhK1cgHm2mSn9U57W
	gmSYczYf8pHOnkngxMZzzrONf0XqrXoFQd4rGmGHT71nCNjrhAzzvpPJ9gdHd5cdWxNV3
	AJ3t3bnaLwE974etlX+rCHaoXvGl+o4hzFI=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (jimi mo31) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id e003bbn93Evfod
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:43 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id C146918892
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:42 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 018f63b6e4863faca16a832a5a34c6a6e7726cf7
Message-Id: <018f63b6e4863faca16a.1317657294@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:54 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 17 of 24] libxl: add
	libxl__spawn_confirm_offspring_startup
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653616 -7200
# Node ID 018f63b6e4863faca16a832a5a34c6a6e7726cf7
# Parent  35ec0355b3283a87477c7377a2fd3da5e84d2bcd
libxl: add libxl__spawn_confirm_offspring_startup

libxl__spawn_confirm_offspring_startup() is a generic version of
libxl__confirm_device_model_startup().

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 35ec0355b328 -r 018f63b6e486 tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c
+++ b/tools/libxl/libxl_exec.c
@@ -262,6 +262,30 @@ err:
     return -1;
 }
 
+static int detach_offspring(libxl__gc *gc,
+                               libxl__spawner_starting *starting)
+{
+    int rc;
+    rc = libxl__spawn_detach(gc, starting->for_spawn);
+    if (starting->for_spawn)
+        free(starting->for_spawn);
+    free(starting);
+    return rc;
+}
+
+int libxl__spawn_confirm_offspring_startup(libxl__gc *gc,
+                                       uint32_t timeout, char *what,
+                                       char *path, char *state,
+                                       libxl__spawner_starting *starting)
+{
+    int detach;
+    int problem = libxl__wait_for_offspring(gc, starting->domid, timeout, what,
+                                               path, state,
+                                               starting->for_spawn, NULL, NULL);
+    detach = detach_offspring(gc, starting);
+    return problem ? problem : detach;
+}
+
 static int libxl__set_fd_flag(libxl__gc *gc, int fd, int flag)
 {
     int flags;
diff -r 35ec0355b328 -r 018f63b6e486 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -313,6 +313,12 @@ _hidden int libxl__wait_for_offspring(li
                                                        const char *state,
                                                        void *userdata),
                                  void *check_callback_userdata);
+
+_hidden int libxl__spawn_confirm_offspring_startup(libxl__gc *gc,
+                                       uint32_t timeout, char *what,
+                                       char *path, char *state,
+                                       libxl__spawner_starting *starting);
+
   /* Logs errors.  A copy of "what" is taken.  Return values:
    *  < 0   error, for_spawn need not be detached
    *   +1   caller is the parent, must call detach on *for_spawn eventually

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:03:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 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 1RAkzW-0004GT-Bi; Mon, 03 Oct 2011 09:03:42 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkqt-0002q2-7M
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:48 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-182.messagelabs.com!1317657283!15697197!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18871 invoked from network); 3 Oct 2011 15:54:44 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-7.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:44 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657283; l=1370;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=qAYNxkKRKvkFxj9bNlEODlLjZ10=;
	b=DbgDgH1fL1AnJ655Oa0MQSN3XOWulBouphvTqc0zs5LvYp8VIHGGCiiWfzfyhCaISWw
	Ei9W4x8KUNfJZqEP+FIXZGpCSqSBiO/qtiO5kWdO9jukd0G0TAQxgMQmP/t+w/KQFrMDS
	z6UiGmUAg35hVio75tn/TJNyaYt1nN1uPic=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (fruni mo23) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id I0620an93DoBiE
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:42 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 305A418892
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:41 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 3924c1ef71ee975b4556ca7766b730dfa3e12295
Message-Id: <3924c1ef71ee975b4556.1317657288@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:48 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 11 of 24] xenpaging: retry unpageable gfns
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653608 -7200
# Node ID 3924c1ef71ee975b4556ca7766b730dfa3e12295
# Parent  b85b2fa9a485cdd815eb9eb3e3a7794b462fa814
xenpaging: retry unpageable gfns

Nomination of gfns can fail, but may succeed later.
Thats the case for a guest that starts ballooned.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r b85b2fa9a485 -r 3924c1ef71ee tools/xenpaging/policy_default.c
--- a/tools/xenpaging/policy_default.c
+++ b/tools/xenpaging/policy_default.c
@@ -32,6 +32,7 @@ static unsigned int i_mru;
 static unsigned int mru_size;
 static unsigned long *bitmap;
 static unsigned long *unconsumed;
+static unsigned int unconsumed_cleared;
 static unsigned long current_gfn;
 static unsigned long max_pages;
 
@@ -87,8 +88,20 @@ int policy_choose_victim(xenpaging_t *pa
         current_gfn++;
         if ( current_gfn >= max_pages )
             current_gfn = 0;
+        /* Could not nominate any gfn */
         if ( wrap == current_gfn )
         {
+            /* Count wrap arounds */
+            unconsumed_cleared++;
+            /* Force retry every few seconds (depends on poll() timeout) */
+            if ( unconsumed_cleared > 123)
+            {
+                /* Force retry of unconsumed gfns */
+                bitmap_clear(unconsumed, max_pages);
+                unconsumed_cleared = 0;
+                /* One more round before returning ENOSPC */
+                continue;
+            }
             victim->gfn = INVALID_MFN;
             return -ENOSPC;
         }

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:05:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:05:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAl1W-0004e6-7k; Mon, 03 Oct 2011 09:05:46 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkqu-0002qA-NM
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:49 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-182.messagelabs.com!1317657285!17905803!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22370 invoked from network); 3 Oct 2011 15:54:45 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-2.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:45 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657285; l=982;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=RDoFg7FFJdL5O2RLjPEDJC/wj/g=;
	b=llZO25p+r9aF10GA0xnTOU6Pi9U7aSPrkWZEpVNHTMAii2KOTs+0607xeSGij6GxMqO
	gH4v9bO8htFeZ/IG+Iy1xmNe0Cy2koORQoSwbAEFhxkHadxkKJR4E1WW+ZXD/4KSPcQH8
	MJjqxw8WKtwdTmI2uF+73QcpF5RmpLVNZJM=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (fruni mo11) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 0058een93F3Jpr
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:42 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id D106018B68
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:40 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: b85b2fa9a485cdd815eb9eb3e3a7794b462fa814
Message-Id: <b85b2fa9a485cdd815eb.1317657287@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:47 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 10 of 24] libxc: add bitmap_clear 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 Olaf Hering <olaf@aepfle.de>
# Date 1317653607 -7200
# Node ID b85b2fa9a485cdd815eb9eb3e3a7794b462fa814
# Parent  5d2d87fb19e4749ca11d9d002ee5b44271594cb3
libxc: add bitmap_clear function

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 5d2d87fb19e4 -r b85b2fa9a485 tools/libxc/xc_bitops.h
--- a/tools/libxc/xc_bitops.h
+++ b/tools/libxc/xc_bitops.h
@@ -4,6 +4,7 @@
 /* bitmap operations for single threaded access */
 
 #include <stdlib.h>
+#include <string.h>
 
 #define BITS_PER_LONG (sizeof(unsigned long) * 8)
 #define ORDER_LONG (sizeof(unsigned long) == 4 ? 5 : 6)
@@ -25,6 +26,11 @@ static inline unsigned long *bitmap_allo
     return calloc(1, bitmap_size(nr_bits));
 }
 
+static inline void bitmap_clear(unsigned long *addr, int nr_bits)
+{
+    memset(addr, 0, bitmap_size(nr_bits));
+}
+
 static inline int test_bit(int nr, volatile unsigned long *addr)
 {
     return (BITMAP_ENTRY(nr, addr) >> BITMAP_SHIFT(nr)) & 1;

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:07:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:07:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAl3M-000572-F6; Mon, 03 Oct 2011 09:07:40 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkqx-0002qx-E4
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:55 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-21.messagelabs.com!1317657256!57218153!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2996 invoked from network); 3 Oct 2011 15:54:16 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-7.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:16 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657287; l=2760;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=TNPSNIn6emlZUli+6qTlHw4OhaE=;
	b=i1PyMw5vGSLVj0E2cY5VvfLQc3FTCkD7OHlYDIz4mOdsHbUGbyy01UgM1R60ztUM12T
	pyDHfXTDD4QnxC8TgGac79F+oShXY68E7hPX9W7pQs1b0ZN2Zw/FgsLI0gN4ohWHei9FA
	QQW5Ri4rrSpM2ETrCKAluvBTgrAvJo2sie8=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by post.strato.de (mrclete mo42) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id J0489bn93CjReU
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:43 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 8796618B69
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:42 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 35ec0355b3283a87477c7377a2fd3da5e84d2bcd
Message-Id: <35ec0355b3283a87477c.1317657293@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:53 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 16 of 24] libxl: use libxl__wait_for_offspring
	for device model
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653615 -7200
# Node ID 35ec0355b3283a87477c7377a2fd3da5e84d2bcd
# Parent  cfca4b1f83f9c2ebf1c1986aad51571243db4c77
libxl: use libxl__wait_for_offspring for device model

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r cfca4b1f83f9 -r 35ec0355b328 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -535,88 +535,12 @@ int libxl__wait_for_device_model(libxl__
                                                        void *userdata),
                                  void *check_callback_userdata)
 {
-    libxl_ctx *ctx = libxl__gc_owner(gc);
     char *path;
-    char *p;
-    unsigned int len;
-    int rc = 0;
-    struct xs_handle *xsh;
-    int nfds;
-    fd_set rfds;
-    struct timeval tv;
-    unsigned int num;
-    char **l = NULL;
-
-    xsh = xs_daemon_open();
-    if (xsh == NULL) {
-        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to open xenstore connection");
-        goto err;
-    }
-
     path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
-    xs_watch(xsh, path, path);
-    tv.tv_sec = LIBXL_DEVICE_MODEL_START_TIMEOUT;
-    tv.tv_usec = 0;
-    nfds = xs_fileno(xsh) + 1;
-    if (spawning && spawning->fd > xs_fileno(xsh))
-        nfds = spawning->fd + 1;
-
-    while (rc > 0 || (!rc && tv.tv_sec > 0)) {
-        if ( spawning ) {
-            rc = libxl__spawn_check(gc, spawning);
-            if ( rc ) {
-                LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
-                           "Device Model died during startup");
-                rc = -1;
-                goto err_died;
-            }
-        }
-        p = xs_read(xsh, XBT_NULL, path, &len);
-        if ( NULL == p )
-            goto again;
-
-        if ( NULL != state && strcmp(p, state) )
-            goto again;
-
-        if ( NULL != check_callback ) {
-            rc = (*check_callback)(gc, domid, p, check_callback_userdata);
-            if ( rc > 0 )
-                goto again;
-        }
-
-        free(p);
-        xs_unwatch(xsh, path, path);
-        xs_daemon_close(xsh);
-        return rc;
-again:
-        free(p);
-        FD_ZERO(&rfds);
-        FD_SET(xs_fileno(xsh), &rfds);
-        if (spawning)
-            FD_SET(spawning->fd, &rfds);
-        rc = select(nfds, &rfds, NULL, NULL, &tv);
-        if (rc > 0) {
-            if (FD_ISSET(xs_fileno(xsh), &rfds)) {
-                l = xs_read_watch(xsh, &num);
-                if (l != NULL)
-                    free(l);
-                else
-                    goto again;
-            }
-            if (spawning && FD_ISSET(spawning->fd, &rfds)) {
-                unsigned char dummy;
-                if (read(spawning->fd, &dummy, sizeof(dummy)) != 1)
-                    LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_DEBUG,
-                                     "failed to read spawn status pipe");
-            }
-        }
-    }
-    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Device Model not ready");
-err_died:
-    xs_unwatch(xsh, path, path);
-    xs_daemon_close(xsh);
-err:
-    return -1;
+    return libxl__wait_for_offspring(gc, domid,
+                                     LIBXL_DEVICE_MODEL_START_TIMEOUT,
+                                     "Device Model", path, state, spawning,
+                                     check_callback, check_callback_userdata);
 }
 
 int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state)

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:08:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 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 1RAl4Y-0005U1-5T; Mon, 03 Oct 2011 09:08:54 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkqw-0002qn-EP
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:55 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-6.tower-27.messagelabs.com!1317657265!51519732!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14904 invoked from network); 3 Oct 2011 15:54:25 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-6.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 15:54:25 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657286; l=20564;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=Fih6QCmjwLleNPpGTGfuMWFEPiM=;
	b=iVFIIQnjmQ6pX+xNwSeLNPx82riJibZZXu5jsEdfehaYgvIuOVCjmQqPSEBiKjEBa8L
	Zg7g8MDcccsUNPM51bOCVk3xFkkv7nJF94hm0NxQddMYixqTThiVlubs3GPHA67VtwJSa
	O7wINT6k9KPDdoBQdnWGj6T90rsITmwhREU=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (jimi mo45) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id 600ddcn93FrxT0
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:45 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 8C23718B65
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:44 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c37a41cf0bf05f183a9b167f307591ec69e770e4
Message-Id: <c37a41cf0bf05f183a9b.1317657301@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:55:01 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 24 of 24] xenpaging: 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 1317656695 -7200
# Node ID c37a41cf0bf05f183a9b167f307591ec69e770e4
# Parent  5dd8e13e8222486bc09894dc3245c28a7e654d0a
xenpaging: libxl support

Add support to libxl for starting xenpaging.
Its a huge patch and should be spit into totmem= and the actual xenpaging
change.

The patch adds three new config options:
totmem=<int> , the number of pages
xenpaging_file=<string>, pagefile to use
xenpaging_extra=[ 'string', 'string' ], additional optional args for xenpaging

xl gets a new 'mem-tot_pages' command which modifies xenstore
"memory/target-tot_pages" to notify the pager of a new target number and it
instructs the xl monitor process to start the pager if the totmem= option was
not in the config file.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 5dd8e13e8222 -r c37a41cf0bf0 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -626,6 +626,21 @@ out:
     return rc;
 }
 
+int libxl_wait_for_target_tot_pages(libxl_ctx *ctx, uint32_t domid, libxl_waiter *waiter)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    int rc = -1;
+    if (asprintf(&waiter->path, "%s/memory/target-tot_pages", libxl__xs_get_dompath(&gc, domid)) < 0)
+        goto out;
+    if (asprintf(&waiter->token, "%d", LIBXL_EVENT_TYPE_XENPAGING) < 0)
+        goto out;
+    if (xs_watch(ctx->xsh, waiter->path, waiter->token) == true)
+        rc = 0;
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
 int libxl_get_event(libxl_ctx *ctx, libxl_event *event)
 {
     unsigned int num;
@@ -2035,6 +2050,112 @@ out:
     return rc;
 }
 
+int libxl_set_memory_tot_pages(libxl_ctx *ctx, uint32_t domid,
+        int32_t tot_pages_memkb, int relative)
+{
+    libxl__gc gc;
+    int rc, abort = 0;
+    uint32_t memorykb, videoram;
+    uint32_t current_target_memkb = 0;
+    uint32_t current_tot_pages_memkb, new_tot_pages_memkb;
+    char *memmax, *endptr, *videoram_s, *target, *tot_pages;
+    char *dompath;
+    xs_transaction_t t;
+
+    if (domid == 0) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot set tot_pages for dom0.\n");
+        return ERROR_INVAL;
+    }
+
+    gc = LIBXL_INIT_GC(ctx);
+    dompath = libxl__xs_get_dompath(&gc, domid);
+
+retry_transaction:
+    rc = 1;
+    t = xs_transaction_start(ctx->xsh);
+
+    target = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+                "%s/memory/target", dompath));
+    if (!target) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+                "cannot get target memory info from %s/memory/target\n",
+                dompath);
+        abort = 1;
+        goto out;
+    } else {
+        current_target_memkb = strtoul(target, &endptr, 10);
+        if (*endptr != '\0') {
+            LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+                    "invalid memory target %s from %s/memory/target\n",
+                    target, dompath);
+            abort = 1;
+            goto out;
+        }
+    }
+
+    videoram_s = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+                "%s/memory/videoram", dompath));
+    videoram = videoram_s ? atoi(videoram_s) : 0;
+
+    current_tot_pages_memkb = current_target_memkb + videoram;
+    tot_pages = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+                "%s/memory/target-tot_pages", dompath));
+    if (tot_pages) {
+        current_tot_pages_memkb = strtoul(tot_pages, &endptr, 10);
+        if (*endptr != '\0') {
+            LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+                    "invalid tot_pages %s from %s/memory/target-tot_pages\n",
+                    tot_pages, dompath);
+            abort = 1;
+            goto out;
+        }
+    }
+    memmax = libxl__xs_read(&gc, t, libxl__sprintf(&gc,
+                "%s/memory/static-max", dompath));
+    if (!memmax) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+                "cannot get memory info from %s/memory/static-max\n",
+                dompath);
+        abort = 1;
+        goto out;
+    }
+    memorykb = strtoul(memmax, &endptr, 10);
+    if (*endptr != '\0') {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+                "invalid max memory %s from %s/memory/static-max\n",
+                memmax, dompath);
+        abort = 1;
+        goto out;
+    }
+
+    if (relative) {
+        if (tot_pages_memkb < 0 && abs(tot_pages_memkb) > current_tot_pages_memkb)
+            new_tot_pages_memkb = 0;
+        else
+            new_tot_pages_memkb = current_tot_pages_memkb + tot_pages_memkb;
+    } else
+        new_tot_pages_memkb = tot_pages_memkb;
+    if (new_tot_pages_memkb > memorykb) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                "memory_dynamic_max must be less than or equal to"
+                " memory_static_max\n");
+        abort = 1;
+        goto out;
+    }
+
+    libxl__xs_write(&gc, t, libxl__sprintf(&gc, "%s/memory/target-tot_pages",
+                dompath), "%"PRIu32, new_tot_pages_memkb);
+
+    rc = 0;
+out:
+    if (!xs_transaction_end(ctx->xsh, t, abort) && !abort)
+        if (errno == EAGAIN)
+            goto retry_transaction;
+
+    libxl__free_all(&gc);
+    return rc;
+}
+
 int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
         libxl_device_model_info *dm_info, uint32_t *need_memkb)
 {
diff -r 5dd8e13e8222 -r c37a41cf0bf0 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);
@@ -312,6 +313,8 @@ int libxl_get_wait_fd(libxl_ctx *ctx, in
 int libxl_wait_for_domain_death(libxl_ctx *ctx, uint32_t domid, libxl_waiter *waiter);
 /* waiter is a preallocated array of num_disks libxl_waiter elements */
 int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disks, int num_disks, libxl_waiter *waiter);
+/* waiter is allocated by the caller */
+int libxl_wait_for_target_tot_pages(libxl_ctx *ctx, uint32_t domid, libxl_waiter *waiter);
 int libxl_get_event(libxl_ctx *ctx, libxl_event *event);
 int libxl_stop_waiting(libxl_ctx *ctx, libxl_waiter *waiter);
 int libxl_free_event(libxl_event *event);
@@ -352,6 +355,7 @@ int libxl_domain_core_dump(libxl_ctx *ct
 int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t target_memkb);
 int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid, int32_t target_memkb, int relative, int enforce);
 int libxl_get_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t *out_target);
+int libxl_set_memory_tot_pages(libxl_ctx *ctx, uint32_t domid, int32_t tot_pages_memkb, int relative);
 /* how much free memory in the system a domain needs to be built */
 int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
         libxl_device_model_info *dm_info, uint32_t *need_memkb);
diff -r 5dd8e13e8222 -r c37a41cf0bf0 tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -429,6 +429,121 @@ 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->target_memkb == 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->for_spawn = calloc(sizeof(libxl__spawn_starting), 1);
+    buf_starting->dom_path = dom_path;
+    buf_starting->pid_path = "xenpaging/xenpaging-pid";
+    if (!buf_starting->for_spawn) {
+        rc = ERROR_NOMEM;
+        goto out;
+    }
+
+    /* Assemble arguments for xenpaging */
+    xp_args = flexarray_make(5, 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, 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)
@@ -641,3 +756,32 @@ int libxl_domain_create_restore(libxl_ct
     libxl__free_all(&gc);
     return rc;
 }
+
+int libxl__create_xenpaging(libxl_ctx *ctx, libxl_domain_config *d_config,
+                            uint32_t domid, char *path)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *value, *endptr;
+    uint32_t new_tot_pages;
+    int rc;
+
+    if (d_config->c_info.type != LIBXL_DOMAIN_TYPE_HVM)
+        return 0;
+
+    value = xs_read(ctx->xsh, XBT_NULL, path, NULL);
+    if (!value)
+        return 0;
+    new_tot_pages = strtoul(value, &endptr, 10);
+    free(value);
+    if (*endptr != '\0') {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid value in %s", path);
+        return 0;
+    }
+    d_config->b_info.tot_memkb = new_tot_pages;
+
+    rc = create_xenpaging(&gc, d_config->dm_info.dom_name, domid, &d_config->b_info);
+    if (rc < 0)
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to start xenpaging: %d", rc);
+    libxl__free_all(&gc);
+    return rc;
+}
diff -r 5dd8e13e8222 -r c37a41cf0bf0 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 5dd8e13e8222 -r c37a41cf0bf0 tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -78,6 +78,7 @@ libxl_action_on_shutdown = Enumeration("
 libxl_event_type = Enumeration("event_type", [
     (1, "DOMAIN_DEATH"),
     (2, "DISK_EJECT"),
+    (3, "XENPAGING"),
     ])
 
 libxl_button = Enumeration("button", [
@@ -157,6 +158,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 +176,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 5dd8e13e8222 -r c37a41cf0bf0 tools/libxl/xl.h
--- a/tools/libxl/xl.h
+++ b/tools/libxl/xl.h
@@ -54,6 +54,7 @@ int main_vcpupin(int argc, char **argv);
 int main_vcpuset(int argc, char **argv);
 int main_memmax(int argc, char **argv);
 int main_memset(int argc, char **argv);
+int main_mem_tot_pages(int argc, char **argv);
 int main_sched_credit(int argc, char **argv);
 int main_domid(int argc, char **argv);
 int main_domname(int argc, char **argv);
diff -r 5dd8e13e8222 -r c37a41cf0bf0 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,
@@ -615,11 +639,15 @@ static void parse_config_data(const char
     if (!xlu_cfg_get_long (config, "memory", &l)) {
         b_info->max_memkb = l * 1024;
         b_info->target_memkb = b_info->max_memkb;
+        b_info->tot_memkb = b_info->max_memkb;
     }
 
     if (!xlu_cfg_get_long (config, "maxmem", &l))
         b_info->max_memkb = l * 1024;
 
+    if (!xlu_cfg_get_long (config, "totmem", &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 +723,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:
     {
@@ -1356,7 +1388,7 @@ static int create_domain(struct domain_c
     int fd, i;
     int need_daemon = daemonize;
     int ret, rc;
-    libxl_waiter *w1 = NULL, *w2 = NULL;
+    libxl_waiter *w1 = NULL, *w2 = NULL, *w3;
     void *config_data = 0;
     int config_len = 0;
     int restore_fd = -1;
@@ -1606,8 +1638,10 @@ start:
         d_config.c_info.name, domid, (long)getpid());
     w1 = (libxl_waiter*) xmalloc(sizeof(libxl_waiter) * d_config.num_disks);
     w2 = (libxl_waiter*) xmalloc(sizeof(libxl_waiter));
+    w3 = (libxl_waiter*) xmalloc(sizeof(libxl_waiter));
     libxl_wait_for_disk_ejects(ctx, domid, d_config.disks, d_config.num_disks, w1);
     libxl_wait_for_domain_death(ctx, domid, w2);
+    libxl_wait_for_target_tot_pages(ctx, domid, w3);
     libxl_get_wait_fd(ctx, &fd);
     while (1) {
         int ret;
@@ -1649,8 +1683,10 @@ start:
                         for (i = 0; i < d_config.num_disks; i++)
                             libxl_free_waiter(&w1[i]);
                         libxl_free_waiter(w2);
+                        libxl_free_waiter(w3);
                         free(w1);
                         free(w2);
+                        free(w3);
 
                         /*
                          * Do not attempt to reconnect if we come round again due to a
@@ -1688,6 +1724,9 @@ start:
                     libxl_device_disk_destroy(&disk);
                 }
                 break;
+            case LIBXL_EVENT_TYPE_XENPAGING:
+                libxl__create_xenpaging(ctx, &d_config, domid, event.path);
+                break;
         }
         libxl_free_event(&event);
     }
@@ -1872,6 +1911,36 @@ int main_memset(int argc, char **argv)
     return 0;
 }
 
+static void set_memory_tot_pages(const char *p, const char *mem)
+{
+    long long int memorykb;
+
+    find_domain(p);
+
+    memorykb = parse_mem_size_kb(mem);
+    if (memorykb == -1)  {
+        fprintf(stderr, "invalid memory size: %s\n", mem);
+        exit(3);
+    }
+
+    libxl_set_memory_tot_pages(ctx, domid, memorykb, 0);
+}
+
+int main_mem_tot_pages(int argc, char **argv)
+{
+    int opt = 0;
+    const char *p = NULL, *mem;
+
+    if ((opt = def_getopt(argc, argv, "", "mem-totpages", 2)) != -1)
+        return opt;
+
+    p = argv[optind];
+    mem = argv[optind + 1];
+
+    set_memory_tot_pages(p, mem);
+    return 0;
+}
+
 static void cd_insert(const char *dom, const char *virtdev, char *phys)
 {
     libxl_device_disk disk; /* we don't free disk's contents */
diff -r 5dd8e13e8222 -r c37a41cf0bf0 tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -158,6 +158,11 @@ struct cmd_spec cmd_table[] = {
       "Set the current memory usage for a domain",
       "<Domain> <MemMB['b'[bytes]|'k'[KB]|'m'[MB]|'g'[GB]|'t'[TB]]>",
     },
+    { "mem-totpages",
+      &main_mem_tot_pages, 0,
+      "Set the how much memory is assigned to a domain",
+      "<Domain> <MemMB['b'[bytes]|'k'[KB]|'m'[MB]|'g'[GB]|'t'[TB]]>",
+    },
     { "button-press",
       &main_button_press, 0,
       "Indicate an ACPI button press to the domain",
diff -r 5dd8e13e8222 -r c37a41cf0bf0 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 startup confirmation */
+#define WATCH_STARTUP "xenpaging/state"
 static char *watch_target_tot_pages;
 static char *dom_path;
 static char watch_token[16];
@@ -777,6 +779,22 @@ static int evict_pages(xenpaging_t *pagi
     return num;
 }
 
+static int 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 -1;
+    DPRINTF("confirm startup '%s'\n", path);
+    len = xs_write(paging->xs_handle, XBT_NULL, path, "running", len);
+    DPRINTF("confirm startup returned %d\n", len);
+    free(path);
+    return 0;
+}
+
 int main(int argc, char *argv[])
 {
     struct sigaction act;
@@ -835,6 +853,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 Mon Oct 03 09:10:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:10:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAl5q-0005rX-8R; Mon, 03 Oct 2011 09:10:14 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkqx-0002qy-H7
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:55 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-21.messagelabs.com!1317657241!50786219!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7944 invoked from network); 3 Oct 2011 15:54:02 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-9.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 15:54:02 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657287; l=1370;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=hG1TzDBMkRMnJTfhWk9rUB5iFiA=;
	b=hg7M3Fj7Z2h6h/ZfZ1HGbS5X/JxL5+wJblVc0yG7Meoszw42mKyxmneGNVriyiRUVhR
	gyPm0cvPpGODjgrjyHfPCCOE7ZCrRtVKI2ae69PVN7wBkGDdG+KZ4SSc+5J+T7HQtIAl7
	EBqnELa/cI8DYVMNwLO/8QriwIqlsNsi2+o=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (jimi mo38) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id j0085fn93CxSHa
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:44 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 0B1CB18B65
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:43 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: acc1ee9d0c10a961834029726d11227c2ff9e97b
Message-Id: <acc1ee9d0c10a9618340.1317657295@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:55 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 18 of 24] libxl: use
 libxl__spawn_confirm_offspring_startup for device model
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653617 -7200
# Node ID acc1ee9d0c10a961834029726d11227c2ff9e97b
# Parent  018f63b6e4863faca16a832a5a34c6a6e7726cf7
libxl: use libxl__spawn_confirm_offspring_startup for device model

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 018f63b6e486 -r acc1ee9d0c10 tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -890,25 +890,16 @@ out:
     return rc;
 }
 
-static int detach_device_model(libxl__gc *gc,
-                               libxl__spawner_starting *starting)
-{
-    int rc;
-    rc = libxl__spawn_detach(gc, starting->for_spawn);
-    if (starting->for_spawn)
-        free(starting->for_spawn);
-    free(starting);
-    return rc;
-}
 
 int libxl__confirm_device_model_startup(libxl__gc *gc,
                                        libxl__spawner_starting *starting)
 {
-    int detach;
-    int problem = libxl__wait_for_device_model(gc, starting->domid, "running",
-                                               starting->for_spawn, NULL, NULL);
-    detach = detach_device_model(gc, starting);
-    return problem ? problem : detach;
+    char *path;
+    int domid = starting->domid;
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
+    return libxl__spawn_confirm_offspring_startup(gc,
+                                     LIBXL_DEVICE_MODEL_START_TIMEOUT,
+                                     "Device Model", path, "running", starting);
 }
 
 int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid)

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:11:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:11:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAl6n-0006En-1p; Mon, 03 Oct 2011 09:11:13 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkqx-0002qz-J1
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:55 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-5.tower-182.messagelabs.com!1317657288!15739098!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3723 invoked from network); 3 Oct 2011 15:54:48 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-5.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:48 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657287; l=7983;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=d3UaHGd66i7gMteOmzpcS2UCdmo=;
	b=HeIZQDtHse3u9j4guZXIQvUYTMFuc+XHRyP2aySzM3IySNUIa2OmybA59pj2bFd/ibL
	KKvWaqck1JJTTNqW9UvXc6YPBZ3z6d5Gt/gEhIULpqzM2tQ/Cvjx/dkAckBd/iosxn8KQ
	ZFoyL+BlbaVSGWCvPPD7YAQtRfIM//zqsmY=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by post.strato.de (mrclete mo61) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id o053e4n93FDkMP
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:40 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 2F42218B67
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:39 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ee4c4c7699e0de2b6bddce1e816d35f36ffb0470
Message-Id: <ee4c4c7699e0de2b6bdd.1317657280@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:40 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 03 of 24] xenpaging: use PERROR to print errno
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653597 -7200
# Node ID ee4c4c7699e0de2b6bddce1e816d35f36ffb0470
# Parent  21b7c9a6545ac1ec9d91fce83d46aab0b5808b05
xenpaging: use PERROR to print errno

Also catch lseek() errors in file_op().

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 21b7c9a6545a -r ee4c4c7699e0 tools/xenpaging/file_ops.c
--- a/tools/xenpaging/file_ops.c
+++ b/tools/xenpaging/file_ops.c
@@ -37,6 +37,11 @@ static int file_op(int fd, void *page, i
     int ret;
 
     seek_ret = lseek(fd, i << PAGE_SHIFT, SEEK_SET);
+    if (seek_ret == -1)
+    {
+        ret = -errno;
+        goto err;
+    }
 
     total = 0;
     while ( total < PAGE_SIZE )
diff -r 21b7c9a6545a -r ee4c4c7699e0 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -90,7 +90,7 @@ static int xenpaging_wait_for_event_or_t
         if (errno == EINTR)
             return 0;
 
-        ERROR("Poll exited with an error");
+        PERROR("Poll exited with an error");
         return -errno;
     }
 
@@ -121,7 +121,7 @@ static int xenpaging_wait_for_event_or_t
         port = xc_evtchn_pending(xce);
         if ( port == -1 )
         {
-            ERROR("Failed to read port from event channel");
+            PERROR("Failed to read port from event channel");
             rc = -1;
             goto err;
         }
@@ -129,7 +129,7 @@ static int xenpaging_wait_for_event_or_t
         rc = xc_evtchn_unmask(xce, port);
         if ( rc < 0 )
         {
-            ERROR("Failed to unmask event channel port");
+            PERROR("Failed to unmask event channel port");
         }
     }
 err:
@@ -185,7 +185,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->xs_handle = xs_open(0);
     if ( paging->xs_handle == NULL )
     {
-        ERROR("Error initialising xenstore connection");
+        PERROR("Error initialising xenstore connection");
         goto err;
     }
 
@@ -193,7 +193,7 @@ static xenpaging_t *xenpaging_init(domid
     snprintf(watch_token, sizeof(watch_token), "%u", domain_id);
     if ( xs_watch(paging->xs_handle, "@releaseDomain", watch_token) == false )
     {
-        ERROR("Could not bind to shutdown watch\n");
+        PERROR("Could not bind to shutdown watch\n");
         goto err;
     }
 
@@ -214,7 +214,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->mem_event.shared_page = init_page();
     if ( paging->mem_event.shared_page == NULL )
     {
-        ERROR("Error initialising shared page");
+        PERROR("Error initialising shared page");
         goto err;
     }
 
@@ -222,7 +222,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->mem_event.ring_page = init_page();
     if ( paging->mem_event.ring_page == NULL )
     {
-        ERROR("Error initialising ring page");
+        PERROR("Error initialising ring page");
         goto err;
     }
 
@@ -240,13 +240,13 @@ static xenpaging_t *xenpaging_init(domid
     {
         switch ( errno ) {
             case EBUSY:
-                ERROR("xenpaging is (or was) active on this domain");
+                PERROR("xenpaging is (or was) active on this domain");
                 break;
             case ENODEV:
-                ERROR("EPT not supported for this guest");
+                PERROR("EPT not supported for this guest");
                 break;
             default:
-                ERROR("Error initialising shared page: %s", strerror(errno));
+                PERROR("Error initialising shared page: %s", strerror(errno));
                 break;
         }
         goto err;
@@ -256,7 +256,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->mem_event.xce_handle = xc_evtchn_open(NULL, 0);
     if ( paging->mem_event.xce_handle == NULL )
     {
-        ERROR("Failed to open event channel");
+        PERROR("Failed to open event channel");
         goto err;
     }
 
@@ -266,7 +266,7 @@ static xenpaging_t *xenpaging_init(domid
                                     paging->mem_event.shared_page->port);
     if ( rc < 0 )
     {
-        ERROR("Failed to bind event channel");
+        PERROR("Failed to bind event channel");
         goto err;
     }
 
@@ -276,7 +276,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->domain_info = malloc(sizeof(xc_domaininfo_t));
     if ( paging->domain_info == NULL )
     {
-        ERROR("Error allocating memory for domain info");
+        PERROR("Error allocating memory for domain info");
         goto err;
     }
 
@@ -284,7 +284,7 @@ static xenpaging_t *xenpaging_init(domid
                                paging->domain_info);
     if ( rc != 1 )
     {
-        ERROR("Error getting domain info");
+        PERROR("Error getting domain info");
         goto err;
     }
 
@@ -292,7 +292,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->bitmap = bitmap_alloc(paging->domain_info->max_pages);
     if ( !paging->bitmap )
     {
-        ERROR("Error allocating bitmap");
+        PERROR("Error allocating bitmap");
         goto err;
     }
     DPRINTF("max_pages = %"PRIx64"\n", paging->domain_info->max_pages);
@@ -308,7 +308,7 @@ static xenpaging_t *xenpaging_init(domid
     rc = policy_init(paging);
     if ( rc != 0 )
     {
-        ERROR("Error initialising policy");
+        PERROR("Error initialising policy");
         goto err;
     }
 
@@ -355,14 +355,14 @@ static int xenpaging_teardown(xenpaging_
     rc = xc_mem_paging_disable(xch, paging->mem_event.domain_id);
     if ( rc != 0 )
     {
-        ERROR("Error tearing down domain paging in xen");
+        PERROR("Error tearing down domain paging in xen");
     }
 
     /* Unbind VIRQ */
     rc = xc_evtchn_unbind(paging->mem_event.xce_handle, paging->mem_event.port);
     if ( rc != 0 )
     {
-        ERROR("Error unbinding event port");
+        PERROR("Error unbinding event port");
     }
     paging->mem_event.port = -1;
 
@@ -370,7 +370,7 @@ static int xenpaging_teardown(xenpaging_
     rc = xc_evtchn_close(paging->mem_event.xce_handle);
     if ( rc != 0 )
     {
-        ERROR("Error closing event channel");
+        PERROR("Error closing event channel");
     }
     paging->mem_event.xce_handle = NULL;
     
@@ -381,7 +381,7 @@ static int xenpaging_teardown(xenpaging_
     rc = xc_interface_close(xch);
     if ( rc != 0 )
     {
-        ERROR("Error closing connection to xen");
+        PERROR("Error closing connection to xen");
     }
 
     return 0;
@@ -441,7 +441,7 @@ static int xenpaging_evict_page(xenpagin
                                 PROT_READ | PROT_WRITE, &gfn, 1);
     if ( page == NULL )
     {
-        ERROR("Error mapping page");
+        PERROR("Error mapping page");
         goto out;
     }
 
@@ -449,8 +449,8 @@ static int xenpaging_evict_page(xenpagin
     ret = write_page(fd, page, i);
     if ( ret != 0 )
     {
+        PERROR("Error copying page");
         munmap(page, PAGE_SIZE);
-        ERROR("Error copying page");
         goto out;
     }
 
@@ -464,7 +464,7 @@ static int xenpaging_evict_page(xenpagin
                               victim->gfn);
     if ( ret != 0 )
     {
-        ERROR("Error evicting page");
+        PERROR("Error evicting page");
         goto out;
     }
 
@@ -520,7 +520,7 @@ static int xenpaging_populate_page(xenpa
                 sleep(1);
                 continue;
             }
-            ERROR("Error preparing for page in");
+            PERROR("Error preparing for page in");
             goto out_map;
         }
     }
@@ -532,7 +532,7 @@ static int xenpaging_populate_page(xenpa
                                 PROT_READ | PROT_WRITE, &gfn, 1);
     if ( page == NULL )
     {
-        ERROR("Error mapping page: page is null");
+        PERROR("Error mapping page: page is null");
         goto out_map;
     }
 
@@ -540,7 +540,7 @@ static int xenpaging_populate_page(xenpa
     ret = read_page(fd, page, i);
     if ( ret != 0 )
     {
-        ERROR("Error reading page");
+        PERROR("Error reading page");
         goto out;
     }
 
@@ -579,7 +579,7 @@ static int evict_victim(xenpaging_t *pag
         {
             if ( j++ % 1000 == 0 )
                 if ( xenpaging_mem_paging_flush_ioemu_cache(paging) )
-                    ERROR("Error flushing ioemu cache");
+                    PERROR("Error flushing ioemu cache");
         }
     }
     while ( ret );
@@ -670,7 +670,7 @@ int main(int argc, char *argv[])
         rc = xenpaging_wait_for_event_or_timeout(paging);
         if ( rc < 0 )
         {
-            ERROR("Error getting event");
+            PERROR("Error getting event");
             goto out;
         }
         else if ( rc != 0 )
@@ -710,7 +710,7 @@ int main(int argc, char *argv[])
                     rc = xenpaging_populate_page(paging, req.gfn, fd, i);
                     if ( rc != 0 )
                     {
-                        ERROR("Error populating page");
+                        PERROR("Error populating page");
                         goto out;
                     }
                 }
@@ -723,7 +723,7 @@ int main(int argc, char *argv[])
                 rc = xenpaging_resume_page(paging, &rsp, 1);
                 if ( rc != 0 )
                 {
-                    ERROR("Error resuming page");
+                    PERROR("Error resuming page");
                     goto out;
                 }
 
@@ -752,7 +752,7 @@ int main(int argc, char *argv[])
                     rc = xenpaging_resume_page(paging, &rsp, 0);
                     if ( rc != 0 )
                     {
-                        ERROR("Error resuming");
+                        PERROR("Error resuming");
                         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 Oct 03 09:12:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:12:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAl82-0006gs-Lt; Mon, 03 Oct 2011 09:12:30 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkr2-0002sL-8W
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:57 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-174.messagelabs.com!1317657293!27677510!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14284 invoked from network); 3 Oct 2011 15:54:53 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 15:54:53 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657292; l=1256;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=KnfxyRC1p5AEHqtPZeRGQiAl70o=;
	b=TupIaXm+zyx2d/6J0fEUrwre4h+T4hqtpFYKYwvSnnSkiwHu4vnNnjn4y6vcLBnqG6p
	dGBeA2KwuIiizGODfbDpT4JDZh5694sp0gpsgCQN8iyVQP6crpJpPL0y8saOndYj9Cm74
	9eFFBA4dBDv1SCOgVZGCE34cnYgRei3p+Xo=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (jimi mo9) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id m01e00n93DbkOv
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:39 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id D22B918B65
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:38 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f2c4a25eec9ce1fcba0efb26ef21711929cca47c
Message-Id: <f2c4a25eec9ce1fcba0e.1317657278@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:38 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 01 of 24] xenpaging: remove filename from comment
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653595 -7200
# Node ID f2c4a25eec9ce1fcba0efb26ef21711929cca47c
# Parent  e78cd03b0308c3ba5737ba9821bf7272f45549ca
xenpaging: remove filename from comment

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r e78cd03b0308 -r f2c4a25eec9c tools/xenpaging/file_ops.c
--- a/tools/xenpaging/file_ops.c
+++ b/tools/xenpaging/file_ops.c
@@ -1,5 +1,4 @@
 /******************************************************************************
- * tools/xenpaging/file_ops.c
  *
  * Common file operations.
  *
diff -r e78cd03b0308 -r f2c4a25eec9c tools/xenpaging/policy_default.c
--- a/tools/xenpaging/policy_default.c
+++ b/tools/xenpaging/policy_default.c
@@ -1,5 +1,4 @@
 /******************************************************************************
- * tools/xenpaging/policy.c
  *
  * Xen domain paging default policy.
  *
diff -r e78cd03b0308 -r f2c4a25eec9c tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -1,5 +1,4 @@
 /******************************************************************************
- * tools/xenpaging/xenpaging.c
  *
  * Domain paging. 
  * Copyright (c) 2009 by Citrix Systems, Inc. (Patrick Colp)

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:13:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:13:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAl93-00073k-ER; Mon, 03 Oct 2011 09:13:33 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkqz-0002ru-O5
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:55 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317657290!33714897!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27568 invoked from network); 3 Oct 2011 15:54:50 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-2.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:50 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657290; l=4562;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=wJ3zD7+IgvM7J68F0hep8FfWvjM=;
	b=Uff4aWnKBsrKaMynCBDkHObnnMOcg7GyUSIRC/Qwq4Eteg+9pAudMvYxjrfkFXGftK6
	vWcAkz158BeH6fewfdEDnhiwiN6J71BP+Xfl0VqMuNMT/hCBTKPj1X0SZhhNJDgT0fuN0
	rIa3zOZbma3GQA4TzPWAgmDej/l2N2kkQhs=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (klopstock mo23) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id I016b3n93F8g6Q
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:41 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 0839D18B66
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:40 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 02453d6279baad46b1388267639892feaf6d56af
Message-Id: <02453d6279baad46b138.1317657284@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:44 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 07 of 24] xenpaging: move page add/resume loops
 into its own 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 Olaf Hering <olaf@aepfle.de>
# Date 1317653603 -7200
# Node ID 02453d6279baad46b1388267639892feaf6d56af
# Parent  363c2f3df22b27d56297fa96f8d1706e224a323e
xenpaging: move page add/resume loops into its own function.

Move page resume loop into its own function.
Move page eviction loop into its own function.
Allocate all possible slots in a paging file to allow growing and
shrinking of the number of paged-out pages. Adjust other places to
iterate over all slots.

This change is required by subsequent patches.

v2:
 - check if victims allocation succeeded

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 363c2f3df22b -r 02453d6279ba tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -553,6 +553,27 @@ static int xenpaging_populate_page(xenpa
     return ret;
 }
 
+/* Trigger a page-in for a batch of pages */
+static void resume_pages(xenpaging_t *paging, int num_pages)
+{
+    xc_interface *xch = paging->xc_handle;
+    int i, num = 0;
+
+    for ( i = 0; i < paging->max_pages && num < num_pages; i++ )
+    {
+        if ( test_bit(i, paging->bitmap) )
+        {
+            paging->pagein_queue[num] = i;
+            num++;
+            if ( num == XENPAGING_PAGEIN_QUEUE_SIZE )
+                break;
+        }
+    }
+    /* num may be less than num_pages, caller has to try again */
+    if ( num )
+        page_in_trigger();
+}
+
 static int evict_victim(xenpaging_t *paging,
                         xenpaging_victim_t *victim, int fd, int i)
 {
@@ -596,6 +617,30 @@ static int evict_victim(xenpaging_t *pag
     return ret;
 }
 
+/* Evict a batch of pages and write them to a free slot in the paging file */
+static int evict_pages(xenpaging_t *paging, int fd, xenpaging_victim_t *victims, int num_pages)
+{
+    xc_interface *xch = paging->xc_handle;
+    int rc, slot, num = 0;
+
+    for ( slot = 0; slot < paging->max_pages && num < num_pages; slot++ )
+    {
+        /* Slot is allocated */
+        if ( victims[slot].gfn != INVALID_MFN )
+            continue;
+
+        rc = evict_victim(paging, &victims[slot], fd, slot);
+        if ( rc == -ENOSPC )
+            break;
+        if ( rc == -EINTR )
+            break;
+        if ( num && num % 100 == 0 )
+            DPRINTF("%d pages evicted\n", num);
+        num++;
+    }
+    return num;
+}
+
 int main(int argc, char *argv[])
 {
     struct sigaction act;
@@ -638,7 +683,14 @@ int main(int argc, char *argv[])
         return 2;
     }
 
-    victims = calloc(paging->num_pages, sizeof(xenpaging_victim_t));
+    /* Allocate upper limit of pages to allow growing and shrinking */
+    victims = calloc(paging->max_pages, sizeof(xenpaging_victim_t));
+    if ( !victims )
+        goto out;
+
+    /* Mark all slots as unallocated */
+    for ( i = 0; i < paging->max_pages; i++ )
+        victims[i].gfn = INVALID_MFN;
 
     /* ensure that if we get a signal, we'll do cleanup, then exit */
     act.sa_handler = close_handler;
@@ -652,18 +704,7 @@ int main(int argc, char *argv[])
     /* listen for page-in events to stop pager */
     create_page_in_thread(paging);
 
-    /* Evict pages */
-    for ( i = 0; i < paging->num_pages; i++ )
-    {
-        rc = evict_victim(paging, &victims[i], fd, i);
-        if ( rc == -ENOSPC )
-            break;
-        if ( rc == -EINTR )
-            break;
-        if ( i % 100 == 0 )
-            DPRINTF("%d pages evicted\n", i);
-    }
-
+    i = evict_pages(paging, fd, victims, paging->num_pages);
     DPRINTF("%d pages evicted. Done.\n", i);
 
     /* Swap pages in and out */
@@ -689,13 +730,13 @@ int main(int argc, char *argv[])
             if ( test_and_clear_bit(req.gfn, paging->bitmap) )
             {
                 /* Find where in the paging file to read from */
-                for ( i = 0; i < paging->num_pages; i++ )
+                for ( i = 0; i < paging->max_pages; i++ )
                 {
                     if ( victims[i].gfn == req.gfn )
                         break;
                 }
     
-                if ( i >= paging->num_pages )
+                if ( i >= paging->max_pages )
                 {
                     DPRINTF("Couldn't find page %"PRIx64"\n", req.gfn);
                     goto out;
@@ -765,25 +806,12 @@ int main(int argc, char *argv[])
         /* Write all pages back into the guest */
         if ( interrupted == SIGTERM || interrupted == SIGINT )
         {
-            int num = 0;
-            for ( i = 0; i < paging->max_pages; i++ )
-            {
-                if ( test_bit(i, paging->bitmap) )
-                {
-                    paging->pagein_queue[num] = i;
-                    num++;
-                    if ( num == XENPAGING_PAGEIN_QUEUE_SIZE )
-                        break;
-                }
-            }
-            /*
-             * One more round if there are still pages to process.
-             * If no more pages to process, exit loop.
-             */
-            if ( num )
-                page_in_trigger();
-            else if ( i == paging->max_pages )
+            /* If no more pages to process, exit loop. */
+            if ( !paging->num_paged_out )
                 break;
+            
+            /* One more round if there are still pages to process. */
+            resume_pages(paging, paging->num_paged_out);
         }
         else
         {

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:14:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:14:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAl9q-0007Q8-Ij; Mon, 03 Oct 2011 09:14:22 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkr3-0002sM-0u
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:59 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317657293!18885635!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26298 invoked from network); 3 Oct 2011 15:54:54 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-9.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:54 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657293; l=7513;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=oE0ZvRUcBaZQvkXq77ruyQd+M60=;
	b=ADcwxiu8IbTMOVL24Nog/7pUikpImGtTZO0crpol8QGvV1Rjl+9095dtaFhs8p74Ij3
	Q8vTC/SPP0QaioPP/+WLN5wkyRKo5DIjuaHsPdJCAp30B8bS0qTf5ORRl1c38/XeTGRfb
	ierWqNlrpSUPOVLToHLJMV45Nj4tGX04Yg8=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by post.strato.de (mrclete mo58) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id p051b1n93FoHio
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:45 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 5C6BA18892
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:44 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 5dd8e13e8222486bc09894dc3245c28a7e654d0a
Message-Id: <5dd8e13e8222486bc098.1317657300@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:55:00 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 23 of 24] 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 1317656694 -7200
# Node ID 5dd8e13e8222486bc09894dc3245c28a7e654d0a
# Parent  59303aeb11d96c5c94da2e9feb2ef9728236f90d
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> <domain_id>
options:
 -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 59303aeb11d9 -r 5dd8e13e8222 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';
@@ -202,11 +203,89 @@ 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> <domain_id>\n\n");
+
+    printf("options:\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(" -d             --debug                  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[] = "hdf:m:r:";
+    static const struct option lopts[] = {
+        {"help", 0, NULL, 'h'},
+        {"debug", 0, NULL, 'd'},
+        {"pagefile", 1, NULL, 'f'},
+        {"mru_size", 1, NULL, 'm'},
+        { }
+    };
+
+    while ((ch = getopt_long(argc, argv, sopts, lopts, NULL)) != -1)
+    {
+        switch(ch) {
+        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 'd':
+            paging->debug = 1;
+            break;
+        case 'h':
+        case '?':
+            usage();
+            return 1;
+        }
+    }
+
+    argv += optind; argc -= optind;
+
+    /* Remaining argument is guest domain_id */
+    if ( argc != 1 )
+    {
+        printf("Numerical <domain_id> value missing!\n");
+        usage();
+        return 1;
+    }
+    
+    /* Path to pagefile is required */
+    if ( !filename )
+    {
+        printf("Filename for pagefile missing!\n");
+        usage();
+        return 1;
+    }
+
+    /* Set domain id */
+    paging->mem_event.domain_id = atoi(argv[0]);
+    if ( paging->mem_event.domain_id == 0 )
+    {
+        printf("Cannot page dom0!\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;
@@ -216,7 +295,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 */
@@ -235,7 +319,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");
@@ -243,7 +327,7 @@ static xenpaging_t *xenpaging_init(domid
     }
 
     /* watch guests xenpaging directory */
-    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");
@@ -261,16 +345,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 )
@@ -333,17 +407,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 )
@@ -353,8 +431,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 )
@@ -719,25 +795,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 59303aeb11d9 -r 5dd8e13e8222 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 Mon Oct 03 09:15:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:15:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlAg-0007mn-Un; Mon, 03 Oct 2011 09:15:14 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkqx-0002qo-A8
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:55 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-174.messagelabs.com!1317657288!27677489!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13836 invoked from network); 3 Oct 2011 15:54:48 -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 EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:48 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657287; l=3961;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=dbzMZRHWW1D5uFkeVpbZLdF0l7o=;
	b=asIk45m80I81zr7zAsi4W1tfGGWnqQTqpqm2YrzIKm0j9QyHRHOtMXkdUeza4UztArk
	OqkYDMvenOdSKm8+dzQUwv3P51IF7nDY75hHOoToUM3DvTQ80ulo1KyppEA9gQBOG4u9m
	wq4LT3h6S5vBvuPsgd1PSGWw5mpF9EckkdA=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by post.strato.de (mrclete mo61) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id o053e4n93FDkMU
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:43 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 4BED518B68
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:42 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: cfca4b1f83f9c2ebf1c1986aad51571243db4c77
Message-Id: <cfca4b1f83f9c2ebf1c1.1317657292@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:52 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 15 of 24] libxl: add libxl__wait_for_offspring
	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 Olaf Hering <olaf@aepfle.de>
# Date 1317653613 -7200
# Node ID cfca4b1f83f9c2ebf1c1986aad51571243db4c77
# Parent  219ab93f22c0492595686a1cc34911e9d6775b07
libxl: add libxl__wait_for_offspring function

libxl__wait_for_offspring() is a generic version of
libxl__wait_for_device_model().

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 219ab93f22c0 -r cfca4b1f83f9 tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c
+++ b/tools/libxl/libxl_exec.c
@@ -169,6 +169,99 @@ out:
     free(pid);
 }
 
+int libxl__wait_for_offspring(libxl__gc *gc,
+                                 uint32_t domid,
+                                 uint32_t timeout, char *what,
+                                 char *path, char *state,
+                                 libxl__spawn_starting *spawning,
+                                 int (*check_callback)(libxl__gc *gc,
+                                                       uint32_t domid,
+                                                       const char *state,
+                                                       void *userdata),
+                                 void *check_callback_userdata)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *p;
+    unsigned int len;
+    int rc = 0;
+    struct xs_handle *xsh;
+    int nfds;
+    fd_set rfds;
+    struct timeval tv;
+    unsigned int num;
+    char **l = NULL;
+
+    xsh = xs_daemon_open();
+    if (xsh == NULL) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to open xenstore connection");
+        goto err;
+    }
+
+    xs_watch(xsh, path, path);
+    tv.tv_sec = timeout;
+    tv.tv_usec = 0;
+    nfds = xs_fileno(xsh) + 1;
+    if (spawning && spawning->fd > xs_fileno(xsh))
+        nfds = spawning->fd + 1;
+
+    while (rc > 0 || (!rc && tv.tv_sec > 0)) {
+        if ( spawning ) {
+            rc = libxl__spawn_check(gc, spawning);
+            if ( rc ) {
+                LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                           "%s died during startup", what);
+                rc = -1;
+                goto err_died;
+            }
+        }
+        p = xs_read(xsh, XBT_NULL, path, &len);
+        if ( NULL == p )
+            goto again;
+
+        if ( NULL != state && strcmp(p, state) )
+            goto again;
+
+        if ( NULL != check_callback ) {
+            rc = (*check_callback)(gc, domid, p, check_callback_userdata);
+            if ( rc > 0 )
+                goto again;
+        }
+
+        free(p);
+        xs_unwatch(xsh, path, path);
+        xs_daemon_close(xsh);
+        return rc;
+again:
+        free(p);
+        FD_ZERO(&rfds);
+        FD_SET(xs_fileno(xsh), &rfds);
+        if (spawning)
+            FD_SET(spawning->fd, &rfds);
+        rc = select(nfds, &rfds, NULL, NULL, &tv);
+        if (rc > 0) {
+            if (FD_ISSET(xs_fileno(xsh), &rfds)) {
+                l = xs_read_watch(xsh, &num);
+                if (l != NULL)
+                    free(l);
+                else
+                    goto again;
+            }
+            if (spawning && FD_ISSET(spawning->fd, &rfds)) {
+                unsigned char dummy;
+                if (read(spawning->fd, &dummy, sizeof(dummy)) != 1)
+                    LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_DEBUG,
+                                     "failed to read spawn status pipe");
+            }
+        }
+    }
+    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "%s not ready", what);
+err_died:
+    xs_unwatch(xsh, path, path);
+    xs_daemon_close(xsh);
+err:
+    return -1;
+}
+
 static int libxl__set_fd_flag(libxl__gc *gc, int fd, int flag)
 {
     int flags;
diff -r 219ab93f22c0 -r cfca4b1f83f9 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -303,6 +303,16 @@ _hidden int libxl__destroy_device_model(
 
 _hidden void libxl_spawner_record_pid(void *for_spawn, pid_t innerchild);
 
+_hidden int libxl__wait_for_offspring(libxl__gc *gc,
+                                 uint32_t domid,
+                                 uint32_t timeout, char *what,
+                                 char *path, char *state,
+                                 libxl__spawn_starting *spawning,
+                                 int (*check_callback)(libxl__gc *gc,
+                                                       uint32_t domid,
+                                                       const char *state,
+                                                       void *userdata),
+                                 void *check_callback_userdata);
   /* Logs errors.  A copy of "what" is taken.  Return values:
    *  < 0   error, for_spawn need not be detached
    *   +1   caller is the parent, must call detach on *for_spawn eventually
@@ -318,7 +328,7 @@ _hidden int libxl__spawn_check(libxl__gc
   /* Logs errors but also returns them.
    * for_spawn must actually be a  libxl__spawn_starting*  but
    * we take void* so you can pass this function directly to
-   * libxl__wait_for_device_model.  Caller must still call detach. */
+   * libxl__wait_for_offspring.  Caller must still call detach. */
 
  /* low-level stuff, for synchronous subprocesses etc. */
 

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:16:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:16:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlBb-00089c-D4; Mon, 03 Oct 2011 09:16:11 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkr2-0002sK-6N
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:56 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-4.tower-182.messagelabs.com!1317657292!20710708!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18201 invoked from network); 3 Oct 2011 15:54:53 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-4.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:53 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657292; l=3990;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=4mAxqXuIVCm6CK20x2GFHnRgZ4k=;
	b=Toh4NMhRk3U3drax7y8mu0LSdJ+kfTS7UpOhRwtiRW+ecd+VAR0Nf+NE8EMyVfpBWbD
	xbudC8YUdzdyavvl1P5/uKvHQQDm7v53b0W/oa9V68VmGClkMgjcKcuudtpoVyuKdjAAq
	D3g090i6nYFi2VfKmrzlEoHbLK+WKaqwIcs=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (klopstock mo48) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id R024efn93FHSfg
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:40 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 9D1A318892
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:39 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 003ad7aa543db226db53760549a172dcff236672
Message-Id: <003ad7aa543db226db53.1317657282@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:42 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 05 of 24] xenpaging: remove xc_dominfo_t from
	paging_t
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653600 -7200
# Node ID 003ad7aa543db226db53760549a172dcff236672
# Parent  cef74f38274df3bf619f9b4f80d2843dd033fea5
xenpaging: remove xc_dominfo_t from paging_t

Remove xc_dominfo_t from paging_t, record only max_pages.
This value is used to setup internal data structures.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r cef74f38274d -r 003ad7aa543d tools/xenpaging/policy_default.c
--- a/tools/xenpaging/policy_default.c
+++ b/tools/xenpaging/policy_default.c
@@ -41,17 +41,17 @@ int policy_init(xenpaging_t *paging)
     int i;
     int rc = -ENOMEM;
 
+    max_pages = paging->max_pages;
+
     /* Allocate bitmap for pages not to page out */
-    bitmap = bitmap_alloc(paging->domain_info->max_pages);
+    bitmap = bitmap_alloc(max_pages);
     if ( !bitmap )
         goto out;
     /* Allocate bitmap to track unusable pages */
-    unconsumed = bitmap_alloc(paging->domain_info->max_pages);
+    unconsumed = bitmap_alloc(max_pages);
     if ( !unconsumed )
         goto out;
 
-    max_pages = paging->domain_info->max_pages;
-
     /* Initialise MRU list of paged in pages */
     if ( paging->policy_mru_size > 0 )
         mru_size = paging->policy_mru_size;
diff -r cef74f38274d -r 003ad7aa543d tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -164,6 +164,7 @@ static void *init_page(void)
 static xenpaging_t *xenpaging_init(domid_t domain_id, int num_pages)
 {
     xenpaging_t *paging;
+    xc_domaininfo_t domain_info;
     xc_interface *xch;
     xentoollog_logger *dbg = NULL;
     char *p;
@@ -272,34 +273,29 @@ static xenpaging_t *xenpaging_init(domid
 
     paging->mem_event.port = rc;
 
-    /* Get domaininfo */
-    paging->domain_info = malloc(sizeof(xc_domaininfo_t));
-    if ( paging->domain_info == NULL )
-    {
-        PERROR("Error allocating memory for domain info");
-        goto err;
-    }
-
     rc = xc_domain_getinfolist(xch, paging->mem_event.domain_id, 1,
-                               paging->domain_info);
+                               &domain_info);
     if ( rc != 1 )
     {
         PERROR("Error getting domain info");
         goto err;
     }
 
+    /* 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->domain_info->max_pages);
+    paging->bitmap = bitmap_alloc(paging->max_pages);
     if ( !paging->bitmap )
     {
         PERROR("Error allocating bitmap");
         goto err;
     }
-    DPRINTF("max_pages = %"PRIx64"\n", paging->domain_info->max_pages);
+    DPRINTF("max_pages = %d\n", paging->max_pages);
 
-    if ( num_pages < 0 || num_pages > paging->domain_info->max_pages )
+    if ( num_pages < 0 || num_pages > paging->max_pages )
     {
-        num_pages = paging->domain_info->max_pages;
+        num_pages = paging->max_pages;
         DPRINTF("setting num_pages to %d\n", num_pages);
     }
     paging->num_pages = num_pages;
@@ -334,7 +330,6 @@ static xenpaging_t *xenpaging_init(domid
         }
 
         free(paging->bitmap);
-        free(paging->domain_info);
         free(paging);
     }
 
@@ -763,7 +758,7 @@ int main(int argc, char *argv[])
         if ( interrupted == SIGTERM || interrupted == SIGINT )
         {
             int num = 0;
-            for ( i = 0; i < paging->domain_info->max_pages; i++ )
+            for ( i = 0; i < paging->max_pages; i++ )
             {
                 if ( test_bit(i, paging->bitmap) )
                 {
@@ -779,7 +774,7 @@ int main(int argc, char *argv[])
              */
             if ( num )
                 page_in_trigger();
-            else if ( i == paging->domain_info->max_pages )
+            else if ( i == paging->max_pages )
                 break;
         }
         else
diff -r cef74f38274d -r 003ad7aa543d tools/xenpaging/xenpaging.h
--- a/tools/xenpaging/xenpaging.h
+++ b/tools/xenpaging/xenpaging.h
@@ -44,11 +44,11 @@ typedef struct xenpaging {
     xc_interface *xc_handle;
     struct xs_handle *xs_handle;
 
-    xc_domaininfo_t    *domain_info;
-
     unsigned long *bitmap;
 
     mem_event_t mem_event;
+    /* number of pages for which data structures were allocated */
+    int max_pages;
     int num_pages;
     int policy_mru_size;
     unsigned long pagein_queue[XENPAGING_PAGEIN_QUEUE_SIZE];

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:16:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:16:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlCL-0008Vl-FC; Mon, 03 Oct 2011 09:16:57 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkr3-0002sR-OM
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:58 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-6.tower-27.messagelabs.com!1317657272!51519763!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15307 invoked from network); 3 Oct 2011 15:54:33 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-6.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:33 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657294; l=2278;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=ZOveSRuxSSmi9V3e0v2z6nIw4g8=;
	b=KpMOtStRxOJV/Kzz/hb0HVndxZoLz9c/PsJpL86n1NXb7vnkm0+NflGy0QOODdOo148
	4Hja2ZAT3Ys869mW/B+/KwPweHNzbBeTxgGObctYpeSOXcUzAlDoETfWJyy1mSDDd9Hye
	FdJTRf8Kz7CNYLaNiJjD1dOOJfi4hMroVzc=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (fruni mo55) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id y004efn93FeXu3
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:44 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 8C06618B66
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:43 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 916749c1775b4435629c747afa4b38c8cbb7dd5b
Message-Id: <916749c1775b4435629c.1317657297@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:57 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 20 of 24] xenpaging: add XEN_PAGING_DIR /
 libxl_xenpaging_dir_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 Olaf Hering <olaf@aepfle.de>
# Date 1317653620 -7200
# Node ID 916749c1775b4435629c747afa4b38c8cbb7dd5b
# Parent  f9b5da9bcffdd96dcae4a26ead0b9c26507711e4
xenpaging: add XEN_PAGING_DIR / libxl_xenpaging_dir_path()

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r f9b5da9bcffd -r 916749c1775b Config.mk
--- a/Config.mk
+++ b/Config.mk
@@ -138,7 +138,7 @@ define buildmakevars2file-closure
 	$(foreach var,                                                      \
 	          SBINDIR BINDIR LIBEXEC LIBDIR SHAREDIR PRIVATE_BINDIR     \
 	          XENFIRMWAREDIR XEN_CONFIG_DIR XEN_SCRIPT_DIR XEN_LOCK_DIR \
-	          XEN_RUN_DIR,                                              \
+	          XEN_RUN_DIR XEN_PAGING_DIR,                               \
 	          echo "$(var)=\"$($(var))\"" >>$(1).tmp;)        \
 	$(call move-if-changed,$(1).tmp,$(1))
 endef
diff -r f9b5da9bcffd -r 916749c1775b config/StdGNU.mk
--- a/config/StdGNU.mk
+++ b/config/StdGNU.mk
@@ -53,10 +53,12 @@ ifeq ($(PREFIX),/usr)
 CONFIG_DIR = /etc
 XEN_LOCK_DIR = /var/lock
 XEN_RUN_DIR = /var/run/xen
+XEN_PAGING_DIR = /var/lib/xen/xenpaging
 else
 CONFIG_DIR = $(PREFIX)/etc
 XEN_LOCK_DIR = $(PREFIX)/var/lock
 XEN_RUN_DIR = $(PREFIX)/var/run/xen
+XEN_PAGING_DIR = $(PREFIX)/var/lib/xen/xenpaging
 endif
 
 SYSCONFIG_DIR = $(CONFIG_DIR)/$(CONFIG_LEAF_DIR)
diff -r f9b5da9bcffd -r 916749c1775b tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -538,6 +538,7 @@ const char *libxl_xen_config_dir_path(vo
 const char *libxl_xen_script_dir_path(void);
 const char *libxl_lock_dir_path(void);
 const char *libxl_run_dir_path(void);
+const char *libxl_xenpaging_dir_path(void);
 
 #endif /* LIBXL_H */
 
diff -r f9b5da9bcffd -r 916749c1775b tools/libxl/libxl_paths.c
--- a/tools/libxl/libxl_paths.c
+++ b/tools/libxl/libxl_paths.c
@@ -69,3 +69,8 @@ const char *libxl_run_dir_path(void)
 {
     return XEN_RUN_DIR;
 }
+
+const char *libxl_xenpaging_dir_path(void)
+{
+    return XEN_PAGING_DIR;
+}
diff -r f9b5da9bcffd -r 916749c1775b tools/xenpaging/Makefile
--- a/tools/xenpaging/Makefile
+++ b/tools/xenpaging/Makefile
@@ -23,7 +23,7 @@ xenpaging: $(OBJS)
 	$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
 
 install: all
-	$(INSTALL_DIR) $(DESTDIR)/var/lib/xen/xenpaging
+	$(INSTALL_DIR) $(DESTDIR)$(XEN_PAGING_DIR)
 	$(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)
 	$(INSTALL_PROG) $(IBINS) $(DESTDIR)$(LIBEXEC)
 

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:17:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:17:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlD5-0000R5-SK; Mon, 03 Oct 2011 09:17:43 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkr3-0002sT-UY
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:54:59 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-4.tower-182.messagelabs.com!1317657294!20710711!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18266 invoked from network); 3 Oct 2011 15:54:55 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-4.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:55 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657294; l=1916;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=1o6JTqyKmJRarcKLG5iDcz8eAaU=;
	b=ACULGWvq5B7gzHDanmGWRb/qY/sF+MHARG1uwr9lPop/5ftGKO0jh+CkxjEPGKVb8Ed
	zmR2IJ9l33UuxXQViVhrDwim6EvZEuLNKC28wEhlsH129WzCTCNzGp01Yo7fqCOWTLp9G
	lZ1VzJMWHoGDn+0Hoho2x7La6c1gq+nvvkU=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (fruni mo27) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id k064a6n93FYr8Z
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:40 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 559BF18B68
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:39 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: cef74f38274df3bf619f9b4f80d2843dd033fea5
Message-Id: <cef74f38274df3bf619f.1317657281@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:41 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 04 of 24] xenpaging: update xenpaging_init
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653599 -7200
# Node ID cef74f38274df3bf619f9b4f80d2843dd033fea5
# Parent  ee4c4c7699e0de2b6bddce1e816d35f36ffb0470
xenpaging: update xenpaging_init

Move comment about xc_handle to the right place.
Allocate paging early and use calloc.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r ee4c4c7699e0 -r cef74f38274d tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -169,18 +169,21 @@ static xenpaging_t *xenpaging_init(domid
     char *p;
     int rc;
 
+    /* Allocate memory */
+    paging = calloc(1, sizeof(xenpaging_t));
+    if ( !paging )
+        goto err;
+
     if ( getenv("XENPAGING_DEBUG") )
         dbg = (xentoollog_logger *)xtl_createlogger_stdiostream(stderr, XTL_DEBUG, 0);
-    xch = xc_interface_open(dbg, NULL, 0);
+
+    /* Open connection to xen */
+    paging->xc_handle = xch = xc_interface_open(dbg, NULL, 0);
     if ( !xch )
-        goto err_iface;
+        goto err;
 
     DPRINTF("xenpaging init\n");
 
-    /* Allocate memory */
-    paging = malloc(sizeof(xenpaging_t));
-    memset(paging, 0, sizeof(xenpaging_t));
-
     /* Open connection to xenstore */
     paging->xs_handle = xs_open(0);
     if ( paging->xs_handle == NULL )
@@ -204,9 +207,6 @@ static xenpaging_t *xenpaging_init(domid
          DPRINTF("Setting policy mru_size to %d\n", paging->policy_mru_size);
     }
 
-    /* Open connection to xen */
-    paging->xc_handle = xch;
-
     /* Set domain id */
     paging->mem_event.domain_id = domain_id;
 
@@ -319,7 +319,8 @@ static xenpaging_t *xenpaging_init(domid
     {
         if ( paging->xs_handle )
             xs_close(paging->xs_handle);
-        xc_interface_close(xch);
+        if ( xch )
+            xc_interface_close(xch);
         if ( paging->mem_event.shared_page )
         {
             munlock(paging->mem_event.shared_page, PAGE_SIZE);
@@ -337,7 +338,6 @@ static xenpaging_t *xenpaging_init(domid
         free(paging);
     }
 
- err_iface: 
     return NULL;
 }
 

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:18:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:18:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlEE-0000tR-OS; Mon, 03 Oct 2011 09:18:54 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkr6-0002sr-IB
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:55:00 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-4.tower-182.messagelabs.com!1317657297!20710721!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18402 invoked from network); 3 Oct 2011 15:54:57 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-4.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:57 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657296; l=826;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=x803CuFFdqg9mZ44lLuEcFWbJPY=;
	b=AYPmPhcedGzSb+wg7+F1TOlqmosoXBPYBOJCaal3/4aISPalFR6/ixIn75130p9vZ0a
	VzZ8Bvpi3Y3xaQ5dsskE+rXITa6W+qsghbueLpIz39PIVM69X+JVdrZz6fgy1N5IeLNAF
	5+1CuQFM1snCSCjvNyDSvihjyoEyx9tiRxE=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (fruni mo42) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id J07000n93EItoq
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:39 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 0141F18B66
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:39 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 21b7c9a6545ac1ec9d91fce83d46aab0b5808b05
Message-Id: <21b7c9a6545ac1ec9d91.1317657279@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:39 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 02 of 24] xenpaging: remove obsolete comment in
	resume 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 Olaf Hering <olaf@aepfle.de>
# Date 1317653596 -7200
# Node ID 21b7c9a6545ac1ec9d91fce83d46aab0b5808b05
# Parent  f2c4a25eec9ce1fcba0efb26ef21711929cca47c
xenpaging: remove obsolete comment in resume path

Remove stale comment.
If a page was populated several times the vcpu is paused and
xenpaging has to unpause it again.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r f2c4a25eec9c -r 21b7c9a6545a tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -742,7 +742,6 @@ int main(int argc, char *argv[])
                         req.gfn, req.flags & MEM_EVENT_FLAG_VCPU_PAUSED);
 
                 /* Tell Xen to resume the vcpu */
-                /* XXX: Maybe just check if the vcpu was paused? */
                 if ( req.flags & MEM_EVENT_FLAG_VCPU_PAUSED )
                 {
                     /* Prepare the response */

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:19:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:19:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlF7-0001GA-8s; Mon, 03 Oct 2011 09:19:49 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkr6-0002sm-20
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:55:00 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317657307!53923502!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13821 invoked from network); 3 Oct 2011 15:55:08 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 15:55:08 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657296; l=1278;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=Yu/RKCxOsl96CF/6TC0D6P2YoQE=;
	b=RqrsTY20m7slh2845lbXUwvFEuGbeYdEqpUZA9F0t63qM6KlUt5DZn51PgGv3KGV0Et
	Uxvk3ZRRBZp0MSfFUmNRiWgsAICp0XIRqaL72Ile68GbMIpJ7X75HViCPiAIFl7h60dXm
	ne8uNDAUHLl0+WCGia4Dg7uk4y+QeyANEsI=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (cohen mo38) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id j067a9n93F5mzK
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:41 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 2A66518B69
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:40 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 87cc0a717a5edc87411295ad0d5cf0b3366da0d3
Message-Id: <87cc0a717a5edc874112.1317657285@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:45 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 08 of 24] xenpaging: compare both token and path
 when checking for @releaseDomain event
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653604 -7200
# Node ID 87cc0a717a5edc87411295ad0d5cf0b3366da0d3
# Parent  02453d6279baad46b1388267639892feaf6d56af
xenpaging: compare both token and path when checking for @releaseDomain event

Subsequent patches will use xenstored to store the numbers of pages
xenpaging is suppose to page-out. A domain_id value could be
misinterpreted as number of pages. Compare both path and token to
recognize the @releaseDomain event.

Also add debug output to show received watch event.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 02453d6279ba -r 87cc0a717a5e tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -101,7 +101,8 @@ static int xenpaging_wait_for_event_or_t
         vec = xs_read_watch(paging->xs_handle, &num);
         if ( vec )
         {
-            if ( strcmp(vec[XS_WATCH_TOKEN], watch_token) == 0 )
+            DPRINTF("path '%s' token '%s'\n", vec[XS_WATCH_PATH], vec[XS_WATCH_TOKEN]);
+            if ( strcmp(vec[XS_WATCH_PATH], "@releaseDomain") == 0 && strcmp(vec[XS_WATCH_TOKEN], watch_token) == 0 )
             {
                 /* If our guest disappeared, set interrupt flag and fall through */
                 if ( xs_is_domain_introduced(paging->xs_handle, paging->mem_event.domain_id) == false )

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:20:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:20:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlFu-0001de-GJ; Mon, 03 Oct 2011 09:20:38 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkr7-0002t3-FU
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:55:02 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-21.messagelabs.com!1317657266!57218182!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3369 invoked from network); 3 Oct 2011 15:54:26 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 15:54:26 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657297; l=1618;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=46Q0u0EUAj4xL0gck2ysA6J8BZc=;
	b=UywvjaqAR9TYwZGXf895e/ZdcTwGcNdQNRdVj2VqaPIq4jiO+rqVR6UL7maLwd8M4lw
	umtpNA8Q0f1PkTHhzJlakHkzqUptiEBknsrkFBG3NvKG2qkCo6THsVSI4mAO242mmrBv5
	FydLQvReB/NTdtMopuXzZClKbkleCZIgt7M=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (jimi mo23) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id I072b1n93Erwxp
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:43 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 236BD18B67
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:42 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 219ab93f22c0492595686a1cc34911e9d6775b07
Message-Id: <219ab93f22c049259568.1317657291@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:51 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 14 of 24] libxl: add pid path to
	libxl__spawner_starting
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653612 -7200
# Node ID 219ab93f22c0492595686a1cc34911e9d6775b07
# Parent  df7be429654c62fb4c61f83549374d77b80ebea3
libxl: add pid path to libxl__spawner_starting

libxl_spawner_record_pid() should be able to write the pid to arbitrary paths.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r df7be429654c -r 219ab93f22c0 tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -848,6 +848,7 @@ int libxl__create_device_model(libxl__gc
 
     p->domid = info->domid;
     p->dom_path = libxl__xs_get_dompath(gc, info->domid);
+    p->pid_path = "image/device-model-pid";
     if (!p->dom_path) {
         rc = ERROR_FAIL;
         goto out_close;
diff -r df7be429654c -r 219ab93f22c0 tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c
+++ b/tools/libxl/libxl_exec.c
@@ -151,7 +151,7 @@ void libxl_spawner_record_pid(void *for_
     char *path = NULL, *pid = NULL;
     int len;
 
-    if (asprintf(&path, "%s/%s", starting->dom_path, "image/device-model-pid") < 0)
+    if (asprintf(&path, "%s/%s", starting->dom_path, starting->pid_path) < 0)
         goto out;
 
     len = asprintf(&pid, "%d", innerchild);
diff -r df7be429654c -r 219ab93f22c0 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -250,6 +250,7 @@ typedef struct {
 
 typedef struct {
     char *dom_path; /* from libxl_malloc, only for libxl_spawner_record_pid */
+    char *pid_path; /* from libxl_malloc, only for libxl_spawner_record_pid */
     int domid;
     libxl__spawn_starting *for_spawn;
 } libxl__spawner_starting;

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:22:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:22:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlHM-00026c-PF; Mon, 03 Oct 2011 09:22:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkr9-0002tY-TX
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:55:04 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-5.tower-27.messagelabs.com!1317657278!47414232!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15482 invoked from network); 3 Oct 2011 15:54:39 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 15:54:39 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657300; l=3161;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=jF+xKWMF9vYeCofNaGdjrUL+jBE=;
	b=opxOU1iWMvScwmv8pea3O/gU2upgxtKzu7Sk0c9GFzfMDhRyO61Z2OEOmcTcJcm9riR
	dEiNty/JVgnjWab5vkAepwFo+RxCMy2/HOX9B5j2iANg+8qRIJRJSJonlBbN6h6PepHlY
	CYcX+bjAsDQnZtO2JZfxndOXr1z98ywQQ/A=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (cohen mo57) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id w000ddn93Fdxkr
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:42 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id B9B3C18B66
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:41 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: df7be429654c62fb4c61f83549374d77b80ebea3
Message-Id: <df7be429654c62fb4c61.1317657290@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:50 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 13 of 24] libxl: rename dm_xenstore_record_pid to
 libxl_spawner_record_pid
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653611 -7200
# Node ID df7be429654c62fb4c61f83549374d77b80ebea3
# Parent  ea8738e045595a235fc05384d3f4d7c74537cd0a
libxl: rename dm_xenstore_record_pid to libxl_spawner_record_pid

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r ea8738e04559 -r df7be429654c tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -516,31 +516,6 @@ static char ** libxl__build_device_model
     }
 }
 
-static void dm_xenstore_record_pid(void *for_spawn, pid_t innerchild)
-{
-    libxl__spawner_starting *starting = for_spawn;
-    struct xs_handle *xsh;
-    char *path = NULL, *pid = NULL;
-    int len;
-
-    if (asprintf(&path, "%s/%s", starting->dom_path, "image/device-model-pid") < 0)
-        goto out;
-
-    len = asprintf(&pid, "%d", innerchild);
-    if (len < 0)
-        goto out;
-
-    /* we mustn't use the parent's handle in the child */
-    xsh = xs_daemon_open();
-
-    xs_write(xsh, XBT_NULL, path, pid, len);
-
-    xs_daemon_close(xsh);
-out:
-    free(path);
-    free(pid);
-}
-
 static int libxl__vfb_and_vkb_from_device_model_info(libxl__gc *gc,
                                                      libxl_device_model_info *info,
                                                      libxl_device_vfb *vfb,
@@ -896,7 +871,7 @@ retry_transaction:
     }
 
     rc = libxl__spawn_spawn(gc, p->for_spawn, "device model",
-                            dm_xenstore_record_pid, p);
+                            libxl_spawner_record_pid, p);
     if (rc < 0)
         goto out_close;
     if (!rc) { /* inner child */
diff -r ea8738e04559 -r df7be429654c tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c
+++ b/tools/libxl/libxl_exec.c
@@ -144,6 +144,31 @@ void libxl_report_child_exitstatus(libxl
     }
 }
 
+void libxl_spawner_record_pid(void *for_spawn, pid_t innerchild)
+{
+    libxl__spawner_starting *starting = for_spawn;
+    struct xs_handle *xsh;
+    char *path = NULL, *pid = NULL;
+    int len;
+
+    if (asprintf(&path, "%s/%s", starting->dom_path, "image/device-model-pid") < 0)
+        goto out;
+
+    len = asprintf(&pid, "%d", innerchild);
+    if (len < 0)
+        goto out;
+
+    /* we mustn't use the parent's handle in the child */
+    xsh = xs_daemon_open();
+
+    xs_write(xsh, XBT_NULL, path, pid, len);
+
+    xs_daemon_close(xsh);
+out:
+    free(path);
+    free(pid);
+}
+
 static int libxl__set_fd_flag(libxl__gc *gc, int fd, int flag)
 {
     int flags;
diff -r ea8738e04559 -r df7be429654c tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -249,7 +249,7 @@ typedef struct {
 } libxl__spawn_starting;
 
 typedef struct {
-    char *dom_path; /* from libxl_malloc, only for dm_xenstore_record_pid */
+    char *dom_path; /* from libxl_malloc, only for libxl_spawner_record_pid */
     int domid;
     libxl__spawn_starting *for_spawn;
 } libxl__spawner_starting;
@@ -300,6 +300,8 @@ _hidden int libxl__spawn_spawn(libxl__gc
                       void *hook_data);
 _hidden int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid);
 
+_hidden void libxl_spawner_record_pid(void *for_spawn, pid_t innerchild);
+
   /* Logs errors.  A copy of "what" is taken.  Return values:
    *  < 0   error, for_spawn need not be detached
    *   +1   caller is the parent, must call detach on *for_spawn eventually

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:23:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:23:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlIn-0002UW-4a; Mon, 03 Oct 2011 09:23:37 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkr9-0002tb-To
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:55:04 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317657284!56485862!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27146 invoked from network); 3 Oct 2011 15:54:45 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 15:54:45 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657300; l=5734;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=BkWc5FdhdzkSQocAM0pQ02zD0og=;
	b=sbIAgo+gUFGemugT6YghXfkZi4GZCBvDRWGczIDO/vk4jUBdgAUmbEkn5MbS3hiYXmI
	+YJWbhB67n1vdVWEb/OfLf2kcei10URXhl0cZN0vXQWKbuCpp4Fnwl//HuuhI5UmWZIYW
	jyaKVBQpsS7atfJ+K4XMuKsOemFhfbmYRfg=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (cohen mo57) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id w000ddn93Fdxkq
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:42 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 7212218B65
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:41 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ea8738e045595a235fc05384d3f4d7c74537cd0a
Message-Id: <ea8738e045595a235fc0.1317657289@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:49 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 12 of 24] libxl: rename
	libxl__device_model_starting
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653609 -7200
# Node ID ea8738e045595a235fc05384d3f4d7c74537cd0a
# Parent  3924c1ef71ee975b4556ca7766b730dfa3e12295
libxl: rename libxl__device_model_starting

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 3924c1ef71ee -r ea8738e04559 tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -434,7 +434,7 @@ static int do_domain_create(libxl__gc *g
                             uint32_t *domid_out, int restore_fd)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
-    libxl__device_model_starting *dm_starting = 0;
+    libxl__spawner_starting *dm_starting = 0;
     libxl_device_model_info *dm_info = &d_config->dm_info;
     libxl__domain_build_state state;
     uint32_t domid;
diff -r 3924c1ef71ee -r ea8738e04559 tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -518,7 +518,7 @@ static char ** libxl__build_device_model
 
 static void dm_xenstore_record_pid(void *for_spawn, pid_t innerchild)
 {
-    libxl__device_model_starting *starting = for_spawn;
+    libxl__spawner_starting *starting = for_spawn;
     struct xs_handle *xsh;
     char *path = NULL, *pid = NULL;
     int len;
@@ -619,7 +619,7 @@ static int libxl__create_stubdom(libxl__
                                  libxl_device_nic *vifs, int num_vifs,
                                  libxl_device_vfb *vfb,
                                  libxl_device_vkb *vkb,
-                                 libxl__device_model_starting **starting_r)
+                                 libxl__spawner_starting **starting_r)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     int i, num_console = STUBDOM_SPECIAL_CONSOLES, ret;
@@ -631,7 +631,7 @@ static int libxl__create_stubdom(libxl__
     char **args;
     struct xs_permissions perm[2];
     xs_transaction_t t;
-    libxl__device_model_starting *dm_starting = 0;
+    libxl__spawner_starting *dm_starting = 0;
     libxl_device_model_info xenpv_dm_info;
 
     if (info->device_model_version != LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL) {
@@ -784,7 +784,7 @@ retry_transaction:
     libxl_domain_unpause(ctx, domid);
 
     if (starting_r) {
-        *starting_r = calloc(1, sizeof(libxl__device_model_starting));
+        *starting_r = calloc(1, sizeof(libxl__spawner_starting));
         (*starting_r)->domid = info->domid;
         (*starting_r)->dom_path = libxl__xs_get_dompath(gc, info->domid);
         (*starting_r)->for_spawn = NULL;
@@ -802,14 +802,14 @@ int libxl__create_device_model(libxl__gc
                               libxl_device_model_info *info,
                               libxl_device_disk *disks, int num_disks,
                               libxl_device_nic *vifs, int num_vifs,
-                              libxl__device_model_starting **starting_r)
+                              libxl__spawner_starting **starting_r)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     char *path, *logfile;
     int logfile_w, null;
     int rc;
     char **args;
-    libxl__device_model_starting buf_starting, *p;
+    libxl__spawner_starting buf_starting, *p;
     xs_transaction_t t;
     char *vm_path;
     char **pass_stuff;
@@ -861,7 +861,7 @@ int libxl__create_device_model(libxl__gc
 
     if (starting_r) {
         rc = ERROR_NOMEM;
-        *starting_r = calloc(1, sizeof(libxl__device_model_starting));
+        *starting_r = calloc(1, sizeof(libxl__spawner_starting));
         if (!*starting_r)
             goto out_close;
         p = *starting_r;
@@ -915,7 +915,7 @@ out:
 }
 
 static int detach_device_model(libxl__gc *gc,
-                               libxl__device_model_starting *starting)
+                               libxl__spawner_starting *starting)
 {
     int rc;
     rc = libxl__spawn_detach(gc, starting->for_spawn);
@@ -926,7 +926,7 @@ static int detach_device_model(libxl__gc
 }
 
 int libxl__confirm_device_model_startup(libxl__gc *gc,
-                                       libxl__device_model_starting *starting)
+                                       libxl__spawner_starting *starting)
 {
     int detach;
     int problem = libxl__wait_for_device_model(gc, starting->domid, "running",
@@ -1041,7 +1041,7 @@ out:
 int libxl__create_xenpv_qemu(libxl__gc *gc, uint32_t domid,
                              libxl_device_model_info *info,
                              libxl_device_vfb *vfb,
-                             libxl__device_model_starting **starting_r)
+                             libxl__spawner_starting **starting_r)
 {
     libxl__build_xenpv_qemu_args(gc, domid, vfb, info);
     libxl__create_device_model(gc, info, NULL, 0, NULL, 0, starting_r);
diff -r 3924c1ef71ee -r ea8738e04559 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -252,7 +252,7 @@ typedef struct {
     char *dom_path; /* from libxl_malloc, only for dm_xenstore_record_pid */
     int domid;
     libxl__spawn_starting *for_spawn;
-} libxl__device_model_starting;
+} libxl__spawner_starting;
 
 /* from xl_create */
 _hidden int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info, uint32_t *domid);
@@ -269,11 +269,11 @@ _hidden int libxl__create_device_model(l
                               libxl_device_model_info *info,
                               libxl_device_disk *disk, int num_disks,
                               libxl_device_nic *vifs, int num_vifs,
-                              libxl__device_model_starting **starting_r);
+                              libxl__spawner_starting **starting_r);
 _hidden int libxl__create_xenpv_qemu(libxl__gc *gc, uint32_t domid,
                               libxl_device_model_info *dm_info,
                               libxl_device_vfb *vfb,
-                              libxl__device_model_starting **starting_r);
+                              libxl__spawner_starting **starting_r);
 _hidden int libxl__need_xenpv_qemu(libxl__gc *gc,
         int nr_consoles, libxl_device_console *consoles,
         int nr_vfbs, libxl_device_vfb *vfbs,
@@ -282,8 +282,8 @@ _hidden int libxl__need_xenpv_qemu(libxl
    * return pass *starting_r (which will be non-0) to
    * libxl_confirm_device_model or libxl_detach_device_model. */
 _hidden int libxl__confirm_device_model_startup(libxl__gc *gc,
-                              libxl__device_model_starting *starting);
-_hidden int libxl__detach_device_model(libxl__gc *gc, libxl__device_model_starting *starting);
+                              libxl__spawner_starting *starting);
+_hidden int libxl__detach_device_model(libxl__gc *gc, libxl__spawner_starting *starting);
 _hidden int libxl__wait_for_device_model(libxl__gc *gc,
                                 uint32_t domid, char *state,
                                 libxl__spawn_starting *spawning,

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:24:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:24:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlJn-0002rL-NL; Mon, 03 Oct 2011 09:24:39 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkrA-0002tj-BS
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:55:04 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-21.messagelabs.com!1317657299!36465049!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10959 invoked from network); 3 Oct 2011 15:54:59 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-2.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:59 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657301; l=1499;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=iJy3Tq4ykq3r9m9Vz57AstVcnp0=;
	b=sh8Px0uEsv5NF7QdZqTrlDh3xjvV67KOssLcLUACJSd20YyR2HA7BVuuZyo7Rih/Kv6
	dIWAE3v5YyNpbD+5piM4hQdMPANEivag08YyKBmqIvFnEsgRUP0HnZsFvyG0StYUOjLYw
	zv4bwxjitZios/ZAS6Id04gKhOqcBUJYOGo=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (klopstock mo13) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id y0108cn93CeBWZ
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:41 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id DAFB018B65
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:39 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 363c2f3df22b27d56297fa96f8d1706e224a323e
Message-Id: <363c2f3df22b27d56297.1317657283@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:43 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 06 of 24] xenpaging: track the number of
	paged-out 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

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1317653601 -7200
# Node ID 363c2f3df22b27d56297fa96f8d1706e224a323e
# Parent  003ad7aa543db226db53760549a172dcff236672
xenpaging: track the number of paged-out pages

This change is required by subsequent changes.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 003ad7aa543d -r 363c2f3df22b tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -467,6 +467,9 @@ static int xenpaging_evict_page(xenpagin
     /* Notify policy of page being paged out */
     policy_notify_paged_out(victim->gfn);
 
+    /* Record number of evicted pages */
+    paging->num_paged_out++;
+
  out:
     return ret;
 }
@@ -480,8 +483,13 @@ static int xenpaging_resume_page(xenpagi
 
     /* Notify policy of page being paged in */
     if ( notify_policy )
+    {
         policy_notify_paged_in(rsp->gfn);
 
+       /* Record number of resumed pages */
+       paging->num_paged_out--;
+    }
+
     /* Tell Xen page is ready */
     ret = xc_mem_paging_resume(paging->xc_handle, paging->mem_event.domain_id,
                                rsp->gfn);
diff -r 003ad7aa543d -r 363c2f3df22b tools/xenpaging/xenpaging.h
--- a/tools/xenpaging/xenpaging.h
+++ b/tools/xenpaging/xenpaging.h
@@ -49,6 +49,7 @@ typedef struct xenpaging {
     mem_event_t mem_event;
     /* number of pages for which data structures were allocated */
     int max_pages;
+    int num_paged_out;
     int num_pages;
     int policy_mru_size;
     unsigned long pagein_queue[XENPAGING_PAGEIN_QUEUE_SIZE];

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:25:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09: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 1RAlKe-0003E8-Jg; Mon, 03 Oct 2011 09:25:32 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkrA-0002tl-Cs
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:55:04 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-11.tower-182.messagelabs.com!1317657301!18906084!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23738 invoked from network); 3 Oct 2011 15:55:01 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-11.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:55:01 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657300; l=849;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=B9G9sZkW/UlTS7AMqp1hO/O4Ltk=;
	b=fCcIYoZtgY7Kq23Y+5MxGif074RNXV+6NzXr2zkU52TCztgGLwiGUcVaG7i977mAX9x
	SXcWTIwVj6u02b4JjKI5SsKIGjv75lst4vT4LGSCt4fLY6gDepAPtvqlGt3SLQMYb4maT
	+xvOGlS4NIsTYmGFIlYM3EjA2uoUiG04lvs=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by post.strato.de (mrclete mo31) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id e04208n93CSxOb
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:44 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 4164418B6A
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:43 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f9b5da9bcffdd96dcae4a26ead0b9c26507711e4
Message-Id: <f9b5da9bcffdd96dcae4.1317657296@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:56 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 19 of 24] xenpaging: install into LIBEXEC dir
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317653619 -7200
# Node ID f9b5da9bcffdd96dcae4a26ead0b9c26507711e4
# Parent  acc1ee9d0c10a961834029726d11227c2ff9e97b
xenpaging: install into LIBEXEC dir

In preparation of upcoming libxl integration,
move xenpaging binary from /usr/sbin/ to /usr/lib/xen/bin/

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r acc1ee9d0c10 -r f9b5da9bcffd tools/xenpaging/Makefile
--- a/tools/xenpaging/Makefile
+++ b/tools/xenpaging/Makefile
@@ -24,8 +24,8 @@ xenpaging: $(OBJS)
 
 install: all
 	$(INSTALL_DIR) $(DESTDIR)/var/lib/xen/xenpaging
-	$(INSTALL_DIR) $(DESTDIR)$(SBINDIR)
-	$(INSTALL_PROG) $(IBINS) $(DESTDIR)$(SBINDIR)
+	$(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)
+	$(INSTALL_PROG) $(IBINS) $(DESTDIR)$(LIBEXEC)
 
 clean:
 	rm -f *.o *~ $(DEPS) xen TAGS $(IBINS) $(LIB)

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:26:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:26:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlLV-0003ah-F9; Mon, 03 Oct 2011 09:26:25 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkrA-0002u6-RF
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:55:05 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-27.messagelabs.com!1317657276!51157850!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22920 invoked from network); 3 Oct 2011 15:54:36 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-7.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 3 Oct 2011 15:54:36 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657301; l=3254;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=fsCO6+OvTYE/rqTtn1AxishHyh0=;
	b=U186f+O933U8ugbXGcyPsjzkVzQ13Z5KHTIrUJDz/+tyy8Rd2U91ST+s0yLtjjGLGAB
	c5QQPGy3v6w4Fpl3DoCnN1xMCdSmMOfeWcdRiwxhk8HlRnRmIZzPgqRiyII8SSUshMHDX
	nUYSivF2JdxQsQUKt7QlfVf7jtCf9FTbP3w=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (fruni mo63) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 200ae6n93F3pBE
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:45 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 0A5CC18B68
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:44 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 59303aeb11d96c5c94da2e9feb2ef9728236f90d
Message-Id: <59303aeb11d96c5c94da.1317657299@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:59 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 22 of 24] 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 1317656685 -7200
# Node ID 59303aeb11d96c5c94da2e9feb2ef9728236f90d
# Parent  8fa2067ed61105a0ae31939f0ca58b8921fc55d4
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 8fa2067ed611 -r 59303aeb11d9 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;
@@ -112,6 +118,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);
         }
     }
@@ -217,6 +242,25 @@ static xenpaging_t *xenpaging_init(domid
         goto err;
     }
 
+    /* watch guests xenpaging directory */
+    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 )
     {
@@ -340,6 +384,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);
     }
@@ -355,6 +401,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 Mon Oct 03 09:27:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09: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 1RAlMa-00043K-Qa; Mon, 03 Oct 2011 09:27:32 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAkrG-0002v3-BA
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:55:11 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317657306!18885676!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27111 invoked from network); 3 Oct 2011 15:55:07 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 15:55:07 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317657306; l=5171;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=+p5u7ld8Lhk1tN0dA8FlT3ajx58=;
	b=nWgR8sFu4+w3V00M05woZYu0yRQSm/g4SXyZs6TRjJaeFTNbHFO5bQwFDwHrE5oSWj/
	hgzi9GHGdiFo22v03WkHGnNI/y8ARy/FbV+2vtrjJQA9GrtK25d8Q5wPPTiu1NqHe8igL
	2TYs1h+z0gwYzxLBCs4IHa9qqoK51WpYA3s=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDAQFWg=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-123-006.pools.arcor-ip.net [88.65.123.6])
	by smtp.strato.de (cohen mo51) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id a071ebn93DssMb
	for <xen-devel@lists.xensource.com>;
	Mon, 3 Oct 2011 17:54:44 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id C6B3818B67
	for <xen-devel@lists.xensource.com>;
	Mon,  3 Oct 2011 17:54:43 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 8fa2067ed61105a0ae31939f0ca58b8921fc55d4
Message-Id: <8fa2067ed61105a0ae31.1317657298@probook.site>
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Mon, 03 Oct 2011 17:54:58 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 21 of 24] 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 1317653622 -7200
# Node ID 8fa2067ed61105a0ae31939f0ca58b8921fc55d4
# Parent  916749c1775b4435629c747afa4b38c8cbb7dd5b
xenpaging: use guests tot_pages as working target

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 916749c1775b -r 8fa2067ed611 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 916749c1775b -r 8fa2067ed611 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -137,6 +137,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;
@@ -162,7 +177,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;
@@ -294,12 +309,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);
@@ -649,7 +659,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;
@@ -660,7 +672,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;
     }
 
@@ -673,7 +685,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);
@@ -705,9 +717,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 )
     {
@@ -772,12 +781,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
             {
@@ -822,6 +827,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 916749c1775b -r 8fa2067ed611 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 Mon Oct 03 09:30:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:30:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlP9-00057e-BU; Mon, 03 Oct 2011 09:30:11 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAl4z-0005er-55
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 09:09:22 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317658136!40630212!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24582 invoked from network); 3 Oct 2011 16:08:57 -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; 3 Oct 2011 16:08:57 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93G8e1u003698
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 3 Oct 2011 16:08:42 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93G8dYg014683
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 16:08:39 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
	p93G8Xjh023342; Mon, 3 Oct 2011 11:08:34 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 09:08:33 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 4D88D1EA; Mon,  3 Oct 2011 12:08:25 -0400 (EDT)
Date: Mon, 3 Oct 2011 12:08:25 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: James Harper <james.harper@bendigoit.com.au>
Subject: Re: [Xen-devel] bug in vlan offload in dom0 3.0.0 kernel?
Message-ID: <20111003160825.GB17108@phenom.oracle.com>
References: <AEC6C66638C05B468B556EA548C1A77D01E5E231@trantor>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <AEC6C66638C05B468B556EA548C1A77D01E5E231@trantor>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090204.4E89DE0A.0239,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, Sep 29, 2011 at 10:33:44AM +1000, James Harper wrote:
> I've just upgraded some dom0's to 3.0.0 (debian kernel) and now my

From?
> vlan's aren't working properly. Traffic is transmitted and other devices
> on that vlan see that traffic, and the xen machine sees the tagged
> response on eth0 but the packet never makes it onto eth0.2 (vlan2). My
> setup is this:
> 
> br-wan
>     eth0.2 - physical network interface
>     vif1.0 - virtual backend interface for vm
> 
> Here's an attempt to describe what I'm seeing for transmit:
> 
> vm eth0 - untagged packet
> xen vif1.0 - untagged packet
> xen br-wan - untagged packet
> xen eth0.2 - untagged packet
> xen eth0 - tagged packet
> |
> router eth0 - tagged packet
> router eth0.2 - untagged packet
> 
> That all looks fine. The packets are tagged inside the vlan interface
> and then tagged once they appear on the physical trunk. For receive:
> 
> router eth0.2 - untagged packet
> router eth0 - tagged packet
> | 
> xen eth0 - tagged packet
> xen eth0.2 - nothing
> 
> The nics are Intel dual port gigabit adapters - 82576. There is at least
> one bug report describing similar behaviour to the above but that was
> back in 2.6.x.
> 
> Has anyone else seen this problem? And more importantly, might vswitch
> solve some of the above problems?

So.. just since that is probably the first thing you should have checked for,
but did your turn checksumming off?


> 
> Thanks
> 
> James
> 
> _______________________________________________
> 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 Oct 03 09:31:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:31:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlPx-0005Uo-08; Mon, 03 Oct 2011 09:31:01 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAlAh-0007lX-7z
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 09:15:15 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1317658493!44970088!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10369 invoked from network); 3 Oct 2011 16:14:54 -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; 3 Oct 2011 16:14:54 -0000
Received: from rtcsinet21.oracle.com (rtcsinet21.oracle.com [66.248.204.29])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93GF6TI022797
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 3 Oct 2011 16:15:08 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by rtcsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93GF4sJ009672
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 16:15:05 GMT
Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p93GExY9028368; Mon, 3 Oct 2011 11:14:59 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 09:14:59 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id D90571EA; Mon,  3 Oct 2011 12:14:50 -0400 (EDT)
Date: Mon, 3 Oct 2011 12:14:50 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 1/9] xen/pciback: Do not dereference psdev
	during printk when it is NULL.
Message-ID: <20111003161450.GC17108@phenom.oracle.com>
References: <1317325971-21603-1-git-send-email-konrad.wilk@oracle.com>
	<1317325971-21603-2-git-send-email-konrad.wilk@oracle.com>
	<4E858C850200007800058A6E@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E858C850200007800058A6E@nat28.tlf.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: rtcsinet21.oracle.com [66.248.204.29]
X-CT-RefId: str=0001.0A090208.4E89DF8D.00F4,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, Dan Carpenter <error27@gmail.com>,
	linux-kernel@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 Fri, Sep 30, 2011 at 08:31:49AM +0100, Jan Beulich wrote:
> >>> On 29.09.11 at 21:52, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> > . instead use printk(.. facility.
> > 
> > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > ---
> >  drivers/xen/xen-pciback/pci_stub.c |    8 +++++---
> >  1 files changed, 5 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/xen/xen-pciback/pci_stub.c 
> > b/drivers/xen/xen-pciback/pci_stub.c
> > index aec214a..32d6891 100644
> > --- a/drivers/xen/xen-pciback/pci_stub.c
> > +++ b/drivers/xen/xen-pciback/pci_stub.c
> > @@ -514,9 +514,11 @@ static void kill_domain_by_device(struct pcistub_device 
> > *psdev)
> >  	int err;
> >  	char nodename[PCI_NODENAME_MAX];
> >  
> > -	if (!psdev)
> > -		dev_err(&psdev->dev->dev,
> > -			"device is NULL when do AER recovery/kill_domain\n");
> > +	if (!psdev) {
> > +		printk(KERN_ERR DRV_NAME
> > +			":device is NULL when do AER recovery/kill_domain\n");
> > +		return;
> > +	}
> 
> This is bogus - all callers of this function already make sure psdev is
> non-NULL, so imo the check should be removed or replaced with a
> BUG_ON().

Done!

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:31:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09: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 1RAlQc-0005rO-Jf; Mon, 03 Oct 2011 09:31:42 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAlDq-0000my-QN
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 09:18:31 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1317658706!15742460!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6006 invoked from network); 3 Oct 2011 16:18:27 -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; 3 Oct 2011 16:18:27 -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
	p93GINRg026654
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 3 Oct 2011 16:18:25 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
	p93GINuJ025831
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 16:18:23 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
	p93GIHIp030938; Mon, 3 Oct 2011 11:18:17 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 09:18:17 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 6CAAB1EA; Mon,  3 Oct 2011 12:18:09 -0400 (EDT)
Date: Mon, 3 Oct 2011 12:18:09 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 2/9] xen/pciback: Return proper error code
	from sscanf.
Message-ID: <20111003161809.GD17108@phenom.oracle.com>
References: <1317325971-21603-1-git-send-email-konrad.wilk@oracle.com>
	<1317325971-21603-3-git-send-email-konrad.wilk@oracle.com>
	<4E858FB60200007800058A99@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E858FB60200007800058A99@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.0A02020B.4E89E051.0150:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, Dan Carpenter <error27@gmail.com>,
	linux-kernel@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 Fri, Sep 30, 2011 at 08:45:26AM +0100, Jan Beulich wrote:
> >>> On 29.09.11 at 21:52, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> > . instead of just hardcoding it to be -EINVAL.
> > 
> > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > ---
> >  drivers/xen/xen-pciback/pci_stub.c |    2 +-
> >  1 files changed, 1 insertions(+), 1 deletions(-)
> > 
> > diff --git a/drivers/xen/xen-pciback/pci_stub.c 
> > b/drivers/xen/xen-pciback/pci_stub.c
> > index 32d6891..d985b65 100644
> > --- a/drivers/xen/xen-pciback/pci_stub.c
> > +++ b/drivers/xen/xen-pciback/pci_stub.c
> > @@ -868,7 +868,7 @@ static inline int str_to_slot(const char *buf, int 
> > *domain, int *bus,
> >  	if (err == 4)
> >  		return 0;
> >  	else if (err < 0)
> > -		return -EINVAL;
> > +		return err;
> >  
> >  	/* try again without domain */
> >  	*domain = 0;
> 
> This should then also be done for the final return from the function:
> 
> 	return err < 0 ? err : -EINVAL;
> 
> But: Where did you read that {v,}sscanf() would return -E... values in
> hypothetical error cases? The C standard says it would return EOF
> when reaching the end of the input string before doing the first
> conversion; lib/vsprintf.c doesn't do so, and also doesn't say it might
> return -E... codes. Bottom line is that I think the code is more correct
> the way it is without this change.

will drop the patch..

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:32:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:32:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlRO-0006J3-Iq; Mon, 03 Oct 2011 09:32:30 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAlH7-00022F-R8
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 09:21:55 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1317658909!17925103!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9254 invoked from network); 3 Oct 2011 16:21:50 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 16:21:50 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93GLj8Z030755
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 3 Oct 2011 16:21:47 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93GFvw8015022
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 16:15:58 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
	p93GLdRn011174; Mon, 3 Oct 2011 11:21:39 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 09:21:39 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 0CA661EA; Mon,  3 Oct 2011 12:21:31 -0400 (EDT)
Date: Mon, 3 Oct 2011 12:21:30 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 4/9] xen/events: BUG() when we can't allocate
	our event->irq array.
Message-ID: <20111003162130.GE17108@phenom.oracle.com>
References: <1317325971-21603-1-git-send-email-konrad.wilk@oracle.com>
	<1317325971-21603-5-git-send-email-konrad.wilk@oracle.com>
	<1317369353.26672.215.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1317369353.26672.215.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A02020B.4E89E11B.0137,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Dan Carpenter <error27@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, Sep 30, 2011 at 08:55:53AM +0100, Ian Campbell wrote:
> On Thu, 2011-09-29 at 20:52 +0100, Konrad Rzeszutek Wilk wrote:
> > In case we can't allocate we are doomed. We should BUG_ON
> > instead of trying to dereference it later on.
> > 
> > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > ---
> >  drivers/xen/events.c |    2 ++
> >  1 files changed, 2 insertions(+), 0 deletions(-)
> > 
> > diff --git a/drivers/xen/events.c b/drivers/xen/events.c
> > index 7523719..5db04bf 100644
> > --- a/drivers/xen/events.c
> > +++ b/drivers/xen/events.c
> > @@ -1670,6 +1670,8 @@ void __init xen_init_IRQ(void)
> >  
> >  	evtchn_to_irq = kcalloc(NR_EVENT_CHANNELS, sizeof(*evtchn_to_irq),
> >  				    GFP_KERNEL);
> > +	if (!evtchn_to_irq)
> > +		BUG();
> 
> AKA
> 	BUG_ON(!evtchn_to_irq);

Duh, I even say it in the description. Changed it to be BUG_ON.
> 
> but
> 
> Acked-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 Oct 03 09:33:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:33:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlS4-0006hH-Hu; Mon, 03 Oct 2011 09:33:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAlMD-0003rm-3q
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 09:27:09 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317659201!38262320!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5678 invoked from network); 3 Oct 2011 16:26: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; 3 Oct 2011 16:26:43 -0000
Received: from rtcsinet21.oracle.com (rtcsinet21.oracle.com [66.248.204.29])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93GR0F3027162
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 3 Oct 2011 16:27:02 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by rtcsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93GQwet024501
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 16:26:59 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
	p93GQr0Q004865; Mon, 3 Oct 2011 11:26:53 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 09:26:53 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id EA9D01EA; Mon,  3 Oct 2011 12:26:44 -0400 (EDT)
Date: Mon, 3 Oct 2011 12:26:44 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 7/9] xen/xenbus: Check before dereferencing it.
Message-ID: <20111003162644.GF17108@phenom.oracle.com>
References: <1317325971-21603-1-git-send-email-konrad.wilk@oracle.com>
	<1317325971-21603-8-git-send-email-konrad.wilk@oracle.com>
	<1317369681.26672.218.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1317369681.26672.218.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: rtcsinet21.oracle.com [66.248.204.29]
X-CT-RefId: str=0001.0A090204.4E89E256.009B,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Dan Carpenter <error27@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, Sep 30, 2011 at 09:01:21AM +0100, Ian Campbell wrote:
> On Thu, 2011-09-29 at 20:52 +0100, Konrad Rzeszutek Wilk wrote:
> > . we do the check whether 'xdev' is NULL - but after we have
> > dereferenced it.
> > 
> > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > ---
> >  drivers/xen/xenbus/xenbus_probe_backend.c |    3 ++-
> >  1 files changed, 2 insertions(+), 1 deletions(-)
> > 
> > diff --git a/drivers/xen/xenbus/xenbus_probe_backend.c b/drivers/xen/xenbus/xenbus_probe_backend.c
> > index 60adf91..331589a 100644
> > --- a/drivers/xen/xenbus/xenbus_probe_backend.c
> > +++ b/drivers/xen/xenbus/xenbus_probe_backend.c
> > @@ -103,10 +103,11 @@ static int xenbus_uevent_backend(struct device *dev,
> >  		return -ENODEV;
> >  
> >  	xdev = to_xenbus_device(dev);
> 
> to_xenbus_device is just container_of. The only way it would return NULL
> is if dev == offsetof(struct xenbus_device, dev), which isn't terribly
> likely. A more likely error would be dev == NULL and we just checked
> above.
> 
> > -	bus = container_of(xdev->dev.bus, struct xen_bus_type, bus);
> >  	if (xdev == NULL)
> >  		return -ENODEV;

Hm, in which case this 'xdev == NULL' is pointless. Will remove it.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:33:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:33:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlSk-00075s-Qb; Mon, 03 Oct 2011 09:33:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAlPM-0005DE-BX
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 09:30:24 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1317659387!57224144!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18336 invoked from network); 3 Oct 2011 16:29:49 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 16:29:49 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93GUFWW031657
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 3 Oct 2011 16:30:17 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93GUFCK006308
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 16:30:15 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
	p93GU9CG007536; Mon, 3 Oct 2011 11:30:10 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 09:30:09 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 668E91EA; Mon,  3 Oct 2011 12:30:01 -0400 (EDT)
Date: Mon, 3 Oct 2011 12:30:01 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 8/9] xen/enlighten: Fix compile warnings.
Message-ID: <20111003163001.GG17108@phenom.oracle.com>
References: <1317325971-21603-1-git-send-email-konrad.wilk@oracle.com>
	<1317325971-21603-9-git-send-email-konrad.wilk@oracle.com>
	<1317370252.26672.224.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <1317370252.26672.224.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090204.4E89E319.0154,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Dan Carpenter <error27@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, Sep 30, 2011 at 09:10:51AM +0100, Ian Campbell wrote:
> On Thu, 2011-09-29 at 20:52 +0100, Konrad Rzeszutek Wilk wrote:
> > linux/arch/x86/xen/enlighten.c: In function =E2=80=98xen_start_kernel=
=E2=80=99:
> > linux/arch/x86/xen/enlighten.c:226: warning: =E2=80=98cx=E2=80=99 may=
 be used uninitialized in this function
> > linux/arch/x86/xen/enlighten.c:240: note: =E2=80=98cx=E2=80=99 was de=
clared here
>=20
> Before 61f4237d5b005767a76f4f3694e68e6f78f392d9 we used to initialise c=
x
> to zero before calling xen_cpuid.
>=20
> 947ccf9c3c30307b774af3666ee74fcd9f47f646 didn't put it back for some
> reason.
>=20
> Regardless I'm not sure how cx can be unused while {a,b,d}x apparently
> are not. All four are passed to xen_cpuid(&ax, &bx, &cx, &dx) and even
> if gcc were being clever and looking into xen_cpuid all four are in the
> output constraints of the real cpuid asm call.
>=20
> Oh, I see, ax and cx are also in the input side of the asm and ax is
> initialised but cx is not and that is the use not the one later in
> xen_init_cpuid_mask.
>=20
> I think that even if cpuid leaf ax=3D1 happens not to use the subleaf
> index in cx we'd be better to initialise cx=3D0 than use uninitialized_=
var

<nods> I somehow read the code as 'cx' being set in xen_cpuid, but your
analysis correct. Done!


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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:38:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09: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 1RAlXR-0007pG-Ts; Mon, 03 Oct 2011 09:38:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAlX2-0007br-RF
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 09:38:21 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1317659898!52945482!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10604 invoked from network); 3 Oct 2011 16:38:19 -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; 3 Oct 2011 16:38:19 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93GcCXE009059
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 3 Oct 2011 16:38:14 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93GWOBl002548
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 16:32:25 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
	p93Gc6ZZ023790; Mon, 3 Oct 2011 11:38:06 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 09:38:06 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id D31E11EA; Mon,  3 Oct 2011 12:37:57 -0400 (EDT)
Date: Mon, 3 Oct 2011 12:37:57 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 9/9] xen/p2m/debugfs: Fix potential pointer
	exception.
Message-ID: <20111003163757.GH17108@phenom.oracle.com>
References: <1317325971-21603-1-git-send-email-konrad.wilk@oracle.com>
	<1317325971-21603-10-git-send-email-konrad.wilk@oracle.com>
	<1317370697.26672.230.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1317370697.26672.230.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090204.4E89E4F6.004F,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Dan Carpenter <error27@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, Sep 30, 2011 at 09:18:17AM +0100, Ian Campbell wrote:
> On Thu, 2011-09-29 at 20:52 +0100, Konrad Rzeszutek Wilk wrote:
> > We could be referencing the last + 1 element of level_name[]
> > array which would cause a pointer exception.
> 
> If we end up accessing it does that not mean something, i.e. should it
> not be a real string here and not NULL? Otherwise isn't it a bug in the
> lookup code that we end up looking there?

Yup. I altereted it per your recommendation to be "error".

> 
> I think this lookup correspond to the initialisation of lvl=4 and
> falling through the subsequent list of checks without matching one. In
> which case I think level_name[4] should be "unknown" or even "error".

Picked "error"
> 
> I don't think you can hit type_name[4] in the same way, type and
> prev_type are always one of the TYPE_* defines, which have values 0..3
> inclusive. You could make this more obvious and defend against future
> changes breaking this with:
> 	... type_name[] = {
> 		[TYPE_IDENTITY] = "identity",
> 		[TYPE_MISSING] = "missing"
> 		...
> 	};

Oooh, pretty. OK, queued another patch with that.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:47:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:47:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlfj-0008RN-BC; Mon, 03 Oct 2011 09:47:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAlez-0008E5-4I
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 09:46:33 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1317660388!27372215!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25693 invoked from network); 3 Oct 2011 16:46:29 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-15.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Oct 2011 16:46:29 -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
	p93GkMI0019410
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 3 Oct 2011 16:46:24 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
	p93GkLbt007286
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 16:46: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
	p93GkFXG030057; Mon, 3 Oct 2011 11:46:15 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 09:46:15 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id A20BA1EA; Mon,  3 Oct 2011 12:46:06 -0400 (EDT)
Date: Mon, 3 Oct 2011 12:46:06 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Thomas Hellstrom <thellstrom@vmware.com>
Message-ID: <20111003164606.GI17108@phenom.oracle.com>
References: <1317328432-25620-1-git-send-email-konrad.wilk@oracle.com>
	<4E8568E8.1070800@vmware.com>
	<20110930140949.GA18905@phenom.oracle.com>
	<4E89E45E.7010009@vmware.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E89E45E.7010009@vmware.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.0A090206.4E89E6E1.004D:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, thomas@shipmail.org, airlied@linux.ie,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	j.glisse@redhat.com, alexdeucher@gmail.com, airlied@redhat.com,
	bskeggs@redhat.com
Subject: [Xen-devel] Re: [PATCH] TTM DMA pool v1.8
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 03, 2011 at 06:35:42PM +0200, Thomas Hellstrom wrote:
> On 09/30/2011 04:09 PM, Konrad Rzeszutek Wilk wrote:
> >On Fri, Sep 30, 2011 at 08:59:52AM +0200, Thomas Hellstrom wrote:
> >>Konrad,
> >>
> >>I'm really sorry for taking so long to review this.
> >That is OK. We all are busy - and it gave me some time to pretty
> >up the code even more.
> >
> >>I'd like to go through a couple of high-level things first before
> >>reviewing the coding itself.
> >>
> >>The page_alloc_func structure looks nice, but I'd like to have it
> >>per ttm backend,
> >Meaning the 'struct ttm_backend_func' right?
> >
> 
> Yes, that's right.
> 
> >>we would just need to make sure that the backend is alive when we
> >>alloc / free pages.
> >>The reason for this is that there may be backends that want to
> >>allocate dma memory running simultaneously with those who don't.
> >As in for some TTM manager use the non-DMA, and for other DMA
> >(is_dma32 is set?) Or say two cards - one that has the concept
> >of MMU and one that does not and both of them are readeon?
> 
> For example, or let's say you have a low-end system that in the
> future needs to
> allocate DMA memory, and want to plug in a high-end graphics card,
> like Radeon.
> 
> 
> 
> >>When the backend fires up, it can determine whether to use DMA
> >>memory or not.
> >Or more of backends (and drivers) that do not have any concept
> >of MMU and just use framebuffers and such?
> >
> >I think we would just have to stick in a pointer to the
> >appropiate 'struct ttm_page_alloc_func' (and the 'struct device')
> >in the 'struct ttm_backend_func'. And this would be done by
> >backend that would decided which one to use.
> 
> Yes, either that, or merge the two structs.
> 
> >And the TTM could find out which page_alloc_func to use straight
> >from the ttm_backend_func and call that (along with the 'struct device'
> >also gathered from that structure). Rough idea (on top of the patches):
> >
> >diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
> >index dd05db3..e7a0c3c 100644
> >--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
> >+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
> >@@ -902,12 +902,12 @@ struct ttm_page_alloc_func ttm_page_alloc_default = {
> >
> >  int ttm_get_pages(struct list_head *pages, int flags,
> >  		  enum ttm_caching_state cstate, unsigned count,
> >-		  dma_addr_t *dma_address, struct device *dev)
> >+		  dma_addr_t *dma_address, struct ttm_backend *be)
> 
> I'd like to see it even more simple. If the ttm_backend_func is
> responsible for allocating pages,
> ttm_get_pages would be called by the backend code, and the
> dma_addr_t pointer can be kept
> in the backend object. No need to expose neither device nor dma
> address to core ttm that
> really doesn't want to care. The dma_address is then available in
> the backend only
> for binding / unbinding, and ttm_get_pages will be called
> exclusively by the backend, and its
> interface can pass struct device.

<nods> OK, let me start cracking on that.
> 
> >And "ttm/tt: Move ttm_tt_set_page_caching implementation in TTM page pool code."
> >would still be there, except it would be done per ttm-backend. Well
> >by choosing which TTM page pool the TTM backend would use.
> >
> 
> Yes.
> 
> >>2) Memory accounting: If the number DMA pages are limited in a way
> >>that the ttm memory global routines are not aware of. How do we
> >>handle memory accounting? (How do we avoid exhausting IOMMU space)?
> >Good question. Not entirely sure about that. I know that on
> >SWIOTLB there is no limit (as you do not use the bounce buffer)
> >but not sure about VT-D, AMD-VI, GART, or when there is no IOMMU.
> >
> >Let me get back to you on that.
> >
> >Granted, the code _only_ gets activated when we use SWIOTLB right
> >now so the answer is "no exhausting" currently. Either way let me
> >dig a bit deeper.
> 
> I'm fine with it working OK with SWIOTLB now.
> When we need to handle other situations, let's find out how to do it then.

<nods>
> 
> >>3) Page swapping. Currently we just copy pages to shmem pages and
> >>then free device pages. In the future we'd probably like to insert
> >>non-dma pages directly into the swap cache. Is it possible to
> >>differentiate dma pages from pages that are directly insertable?
> >Yes. The TTM DMA pool keeps track of which pages belong to which
> >pool and will reject non-dma pages (or pages which belong to
> >a different pool). It is fairly easy to expose that check
> >so that the generic TTM code can make the proper distinction.
> >
> >But also - once you free a device page ('cached') it gets freed.
> >The other pages (writecombine,  writeback, uncached) end up sitting
> >in a recycle pool to be used. This is believe how the current
> >TTM page code works right now (and this TTM DMA pool follows).
> 
> Yes, that's OK, as long as the system shrinker can free those pages.

It does now (I had a spinlock mishap).. which reminds me - how
do I test these patches with your vmwgfx driver? I've an old version
of VMWare Workstation 8, would that do?
> 
> >The swapping code back (so from swap to pool) does not seem to
> >distinguish it that much - it just allocates a new page - and
> >then copies from whatever was in the swap cache?
> >
> >This is something you were thinking to do in the future I presume?
> 
> Yes. If / when I do that, I might be adding a new backend function
> to put a ttm in an
> "anonymous state", that is using only pages that can be inserted in
> the swap cache or passed
> around to other devices, and to put a ttm in a "device" state, that
> copies it to device mappable pages.

OK, that should be no trouble - we would need to expose a function
call to "detach" the page from the TTM pool (which could mean
actually allocating a new page for the "other" device, and copying
it from the "source" to "other" and then freeing the "source).

I am thinking ... you hotplug an high-end radeon while the machine has
an ATI ES1000 in it, and want to move those pages to the new
card. The ATI ES1000 can only do up to 4GB, while the new fancy card
has no such limits (and perhaps does not want to use the TTM DMA
pool).

Is this what you had in mind?
> 
> Thanks,
> /Thomas

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 09:51:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 09:51:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlje-0000RZ-2d; Mon, 03 Oct 2011 09:51:22 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAliy-0000Cm-B5
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 09:50:40 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1317660635!27372696!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 997 invoked from network); 3 Oct 2011 16:50:37 -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; 3 Oct 2011 16:50:37 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93GoW6i002597
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 3 Oct 2011 16:50:34 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93GoVFT026339
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 16:50: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
	p93GoQcs018352; Mon, 3 Oct 2011 11:50:26 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 09:50:25 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 83D231EA; Mon,  3 Oct 2011 12:50:17 -0400 (EDT)
Date: Mon, 3 Oct 2011 12:50:17 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefan Bader <stefan.bader@canonical.com>
Subject: Re: [Xen-devel] Is: [PATCH] x86/paravirt: PTE updates in
	k(un)map_atomic need to be synchronous,
	regardless of lazy_mmu mode. Was:
	Re: [PATCH] x86/paravirt: Partially revert "remove lazy mode in
	interrupts"
Message-ID: <20111003165017.GB4420@phenom.oracle.com>
References: <1317042797-19975-1-git-send-email-konrad.wilk@oracle.com>
	<4E80A6BD.3070703@goop.org>
	<20110926193453.GA9717@phenom.oracle.com>
	<4E859312.40309@canonical.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E859312.40309@canonical.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090208.4E89E7DA.005E,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 Fri, Sep 30, 2011 at 11:59:46AM +0200, Stefan Bader wrote:
> On 26.09.2011 21:34, Konrad Rzeszutek Wilk wrote:
> > On Mon, Sep 26, 2011 at 09:22:21AM -0700, Jeremy Fitzhardinge wrote:
> >> On 09/26/2011 06:13 AM, Konrad Rzeszutek Wilk wrote:
> >>> which has git commit b8bcfe997e46150fedcc3f5b26b846400122fdd9.
> >>>
> >>> The unintended consequence of removing the flushing of MMU
> >>> updates when doing kmap_atomic (or kunmap_atomic) is that we can
> >>> hit a dereference bug when processing a "fork()" under a heavy loaded
> >>> machine. Specifically we can hit:
> >>
> >> The patch is all OK, but I wouldn't have headlined it as a "partial
> >> revert" - the important point is that the pte updates in k(un)map_atomic
> >> need to be synchronous, regardless of whether we're in lazy_mmu mode.
> >>
> >> The fact that b8bcfe997e4 introduced the problem is interesting to note,
> >> but only somewhat relevant to the analysis of what's being fixed here.
> > 
> > Good point. How about
> > 
> 
> Limiting the cc's for just asking about status...

CC-ed you on my query to Andrew. If nothing happens in the next couple of
days can you ping him too please?

> 
> >>From 09966678dd645b68a422c9bf0223b13e73387302 Mon Sep 17 00:00:00 2001
> > From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > Date: Fri, 23 Sep 2011 17:02:29 -0400
> > Subject: [PATCH] x86/paravirt: PTE updates in k(un)map_atomic need to be synchronous, regardless of lazy_mmu mode.
> > 
> > This patch fixes an outstanding issue that has been reported since 2.6.37.
> > Under a heavy loaded machine processing "fork()" calls could keepover with:
> > 
> I wonder whether this may have some effect on older kernels too. According to
> git the patch that removed the lines that are added back happened in 2.6.31.
> Probably it is not the same symptom... I would tend to have it applied all the
> way back but its always better to get some authoritative answer (maybe helps the
> maintainers of longterm, too).

I think so, but I've only gotten bug reports from 2.6.37 and on - so I am being
cautious.
> 
> Anyway, since this is a somewhat painful bug to users, do you happen to know how
> far this is in reaching the upstream kernel?

Just need an Ack from either akpm, or x86 maintainers. The x86 maintainers are
busy with the kernel.org mishap so ... andrew is our guy.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 10:06:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 10:06:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAlxw-0001F6-0p; Mon, 03 Oct 2011 10:06:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAlwH-000104-Cz
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 10:04:38 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1317661422!62599549!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24982 invoked from network); 3 Oct 2011 17:03:43 -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; 3 Oct 2011 17:03:43 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93H4GrA009000
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 3 Oct 2011 17:04:18 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93GwTSG029624
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 16:58:30 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
	p93H4Ag2028658; Mon, 3 Oct 2011 12:04:10 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 10:04:09 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 994881EA; Mon,  3 Oct 2011 13:04:01 -0400 (EDT)
Date: Mon, 3 Oct 2011 13:04:01 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefan Bader <stefan.bader@canonical.com>
Subject: Re: [Xen-devel] Is: [PATCH] x86/paravirt: PTE updates in
	k(un)map_atomic need to be synchronous,
	regardless of lazy_mmu mode. Was:
	Re: [PATCH] x86/paravirt: Partially revert "remove lazy mode in
	interrupts"
Message-ID: <20111003170401.GD4420@phenom.oracle.com>
References: <1317042797-19975-1-git-send-email-konrad.wilk@oracle.com>
	<4E80A6BD.3070703@goop.org>
	<20110926193453.GA9717@phenom.oracle.com>
	<4E859312.40309@canonical.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E859312.40309@canonical.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090206.4E89EB12.0135,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 Fri, Sep 30, 2011 at 11:59:46AM +0200, Stefan Bader wrote:
> On 26.09.2011 21:34, Konrad Rzeszutek Wilk wrote:
> > On Mon, Sep 26, 2011 at 09:22:21AM -0700, Jeremy Fitzhardinge wrote:
> >> On 09/26/2011 06:13 AM, Konrad Rzeszutek Wilk wrote:
> >>> which has git commit b8bcfe997e46150fedcc3f5b26b846400122fdd9.
> >>>
> >>> The unintended consequence of removing the flushing of MMU
> >>> updates when doing kmap_atomic (or kunmap_atomic) is that we can
> >>> hit a dereference bug when processing a "fork()" under a heavy loaded
> >>> machine. Specifically we can hit:
> >>
> >> The patch is all OK, but I wouldn't have headlined it as a "partial
> >> revert" - the important point is that the pte updates in k(un)map_atomic
> >> need to be synchronous, regardless of whether we're in lazy_mmu mode.
> >>
> >> The fact that b8bcfe997e4 introduced the problem is interesting to note,
> >> but only somewhat relevant to the analysis of what's being fixed here.
> > 
> > Good point. How about
> > 
> 
> Limiting the cc's for just asking about status...

Ah, got this email:

                                                                                                                                                          
The patch titled                                                                                                                                              
     Subject: x86/paravirt: PTE updates in k(un)map_atomic need to be synchronous, regardless of lazy_mmu mode                                                
has been added to the -mm tree.  Its filename is                                                                                                              
     x86-paravirt-pte-updates-in-kunmap_atomic-need-to-be-synchronous-regardless-of-lazy_mmu-mode.patch   

so it is definitly on the train.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 10:28:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 10:28:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAmJO-0002rd-OG; Mon, 03 Oct 2011 10:28:18 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAmGH-0001pT-Ht
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 10:25:08 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1317662700!36476468!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29838 invoked from network); 3 Oct 2011 17:25:00 -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;
	3 Oct 2011 17:25:00 -0000
X-IronPort-AV: E=Sophos;i="4.68,480,1312156800"; 
   d="scan'208";a="8185236"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Oct 2011 17:25: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; Mon, 3 Oct 2011 18:25:01 +0100
Date: Mon, 3 Oct 2011 18:24:53 +0100
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] Re: Still struggling with HVM: tx timeouts on emulated
	nics
In-Reply-To: <4E860382.7040108@canonical.com>
Message-ID: <alpine.DEB.2.00.1110031800390.3519@kaball-desktop>
References: <4E7B4768.8060103@canonical.com>
	<alpine.DEB.2.00.1109221838370.8700@kaball-desktop>
	<4E85883C.7030808@canonical.com>
	<alpine.DEB.2.00.1109301427590.3519@kaball-desktop>
	<4E85E8E8.2020702@canonical.com> <4E860382.7040108@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>,
	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, 30 Sep 2011, Stefan Bader wrote:
> Also I did not completely remove the section that would return the status
> without setting needsEOI. I just changed the if condition to be <0 instead of
> <=0 (I knew from the tests that the mapping was always 0 and maybe the <0 check
> could be useful for something.
> 
>         irq_status_query.flags = 0;
>         if ( is_hvm_domain(v->domain) &&
>              domain_pirq_to_irq(v->domain, irq) < 0 )
>         {
>             ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0;
>             break;
>         }
> 

You need to remove the entire test because we want to receive
notifications in all cases.


> With that a quick test shows both the re-sends done sometimes and the domU doing
> EOIs. And there is no stall apparent. Did the same quick test with the e1000
> emulated NIC and that still seems ok. Those were not very thorough tests but at
> least I would have observed a stall pretty quick otherwise.

I am glad it fixes the problem for you.

I am going to send a different patch upstream for Xen 4.2, because I
would also like it to cover the very unlikely scenario in which a PV
guest (like dom0 or a PV guest with PCI passthrough) is loosing level
interrupts because when Xen tries to set the corresponding event channel
pending the bit is alreay set. The codebase is different enough that
making the same change on 4.1 is non-trivial. I am appending the new
patch to this email, it would be great if you could test it. You just
need a 4.2 hypervisor, not the entire system. You should be able to
perform the test updating only xen.gz.
If you have trouble if xen-unstable.hg tip, try changeset 23843.

---


diff -r bf533533046c xen/arch/x86/hvm/irq.c
--- a/xen/arch/x86/hvm/irq.c	Fri Sep 30 14:12:35 2011 +0000
+++ b/xen/arch/x86/hvm/irq.c	Mon Oct 03 16:54:51 2011 +0000
@@ -36,7 +36,8 @@ static void assert_gsi(struct domain *d,
 
     if ( hvm_domain_use_pirq(d, pirq) )
     {
-        send_guest_pirq(d, pirq);
+        if ( send_guest_pirq(d, pirq) && ioapic_gsi >= NR_ISAIRQS )
+            pirq->lost++;
         return;
     }
     vioapic_irq_positive_edge(d, ioapic_gsi);
@@ -63,6 +64,7 @@ static void __hvm_pci_intx_assert(
 {
     struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
     unsigned int gsi, link, isa_irq;
+    struct pirq *pirq;
 
     ASSERT((device <= 31) && (intx <= 3));
 
@@ -72,6 +74,11 @@ static void __hvm_pci_intx_assert(
     gsi = hvm_pci_intx_gsi(device, intx);
     if ( hvm_irq->gsi_assert_count[gsi]++ == 0 )
         assert_gsi(d, gsi);
+    else {
+        pirq = pirq_info(d, domain_emuirq_to_pirq(d, gsi));
+        if ( hvm_domain_use_pirq(d, pirq) )
+            pirq->lost++;
+    }
 
     link    = hvm_pci_intx_link(device, intx);
     isa_irq = hvm_irq->pci_link.route[link];
diff -r bf533533046c xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c	Fri Sep 30 14:12:35 2011 +0000
+++ b/xen/arch/x86/irq.c	Mon Oct 03 16:54:51 2011 +0000
@@ -965,7 +965,11 @@ static void __do_IRQ_guest(int irq)
              !test_and_set_bool(pirq->masked) )
             action->in_flight++;
         if ( !hvm_do_IRQ_dpci(d, pirq) )
-            send_guest_pirq(d, pirq);
+        {
+            if ( send_guest_pirq(d, pirq) &&
+                    action->ack_type == ACKTYPE_EOI )
+                pirq->lost++;
+        }
     }
 
     if ( action->ack_type != ACKTYPE_NONE )
diff -r bf533533046c xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c	Fri Sep 30 14:12:35 2011 +0000
+++ b/xen/arch/x86/physdev.c	Mon Oct 03 16:54:51 2011 +0000
@@ -11,6 +11,7 @@
 #include <asm/current.h>
 #include <asm/io_apic.h>
 #include <asm/msi.h>
+#include <asm/hvm/irq.h>
 #include <asm/hypercall.h>
 #include <public/xen.h>
 #include <public/physdev.h>
@@ -270,6 +271,10 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
         if ( !is_hvm_domain(v->domain) ||
              domain_pirq_to_irq(v->domain, eoi.irq) > 0 )
             pirq_guest_eoi(pirq);
+        if ( pirq->lost > 0) {
+            if ( !send_guest_pirq(v->domain, pirq) )
+                pirq->lost--;
+        }
         spin_unlock(&v->domain->event_lock);
         ret = 0;
         break;
@@ -328,9 +333,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;
         }
 
diff -r bf533533046c xen/include/xen/irq.h
--- a/xen/include/xen/irq.h	Fri Sep 30 14:12:35 2011 +0000
+++ b/xen/include/xen/irq.h	Mon Oct 03 16:54:51 2011 +0000
@@ -146,6 +146,7 @@ struct pirq {
     int pirq;
     u16 evtchn;
     bool_t masked;
+    u32 lost;
     struct rcu_head rcu_head;
     struct arch_pirq arch;
 };

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 11:15:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 11:15:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAn2f-0004yf-7M; Mon, 03 Oct 2011 11:15:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAn1c-0004k9-HM
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 11:14:01 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317665637!20039915!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 931 invoked from network); 3 Oct 2011 18:13:57 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Oct 2011 18:13:57 -0000
X-IronPort-AV: E=Sophos;i="4.68,480,1312156800"; 
   d="scan'208";a="8185750"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Oct 2011 18:13:57 +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, 3 Oct 2011 19:13:57 +0100
Date: Mon, 3 Oct 2011 19:13:48 +0100
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] Re: Still struggling with HVM: tx timeouts on emulated
	nics
In-Reply-To: <alpine.DEB.2.00.1110031800390.3519@kaball-desktop>
Message-ID: <alpine.DEB.2.00.1110031905200.3519@kaball-desktop>
References: <4E7B4768.8060103@canonical.com>
	<alpine.DEB.2.00.1109221838370.8700@kaball-desktop>
	<4E85883C.7030808@canonical.com>
	<alpine.DEB.2.00.1109301427590.3519@kaball-desktop>
	<4E85E8E8.2020702@canonical.com> <4E860382.7040108@canonical.com>
	<alpine.DEB.2.00.1110031800390.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>,
	Jan Beulich <JBeulich@novell.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

CC'ing Jan, that probably is going to have an opinion on this.

Let me add a bit of background: Stefan found out that PV on HVM guests
could loose level interrupts coming from emulated devices. Looking
through the code I realized that we need to add some logic to inject a
pirq in the guest if a level interrupt has been raised while the guest
is servicing the first one.
While this is all very specific to interrupt remapping and emulated
devices, I realized that something similar could happen even with dom0
or other PV guests with PCI passthrough:

1) the device raises a level interrupt and xen injects it into the
guest;

2) the guest is temporarely stuck: it does not ack it or eoi it;

3) the xen timer kicks in and eois the interrupt;

4) the device thinks it is all fine and sends a second interrupt;

5) Xen fails to inject the second interrupt into the guest because the
guest has still the event channel pending bit set;

at this point the guest looses the second interrupt notification, that
is not supposed to happen with level interrupts and I think it might
cause problems with some devices.

Jan, do you think we should try to handle this case, or is it too
unlikely?

In any case we need to handle the PV on HVM remapping bug, that because
of the way interrupts are emulated is much more likely to happen...


On Mon, 3 Oct 2011, Stefano Stabellini wrote:
> On Fri, 30 Sep 2011, Stefan Bader wrote:
> > Also I did not completely remove the section that would return the status
> > without setting needsEOI. I just changed the if condition to be <0 instead of
> > <=0 (I knew from the tests that the mapping was always 0 and maybe the <0 check
> > could be useful for something.
> > 
> >         irq_status_query.flags = 0;
> >         if ( is_hvm_domain(v->domain) &&
> >              domain_pirq_to_irq(v->domain, irq) < 0 )
> >         {
> >             ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0;
> >             break;
> >         }
> > 
> 
> You need to remove the entire test because we want to receive
> notifications in all cases.
> 
> 
> > With that a quick test shows both the re-sends done sometimes and the domU doing
> > EOIs. And there is no stall apparent. Did the same quick test with the e1000
> > emulated NIC and that still seems ok. Those were not very thorough tests but at
> > least I would have observed a stall pretty quick otherwise.
> 
> I am glad it fixes the problem for you.
> 
> I am going to send a different patch upstream for Xen 4.2, because I
> would also like it to cover the very unlikely scenario in which a PV
> guest (like dom0 or a PV guest with PCI passthrough) is loosing level
> interrupts because when Xen tries to set the corresponding event channel
> pending the bit is alreay set. The codebase is different enough that
> making the same change on 4.1 is non-trivial. I am appending the new
> patch to this email, it would be great if you could test it. You just
> need a 4.2 hypervisor, not the entire system. You should be able to
> perform the test updating only xen.gz.
> If you have trouble if xen-unstable.hg tip, try changeset 23843.
> 
> ---
> 
> 
> diff -r bf533533046c xen/arch/x86/hvm/irq.c
> --- a/xen/arch/x86/hvm/irq.c	Fri Sep 30 14:12:35 2011 +0000
> +++ b/xen/arch/x86/hvm/irq.c	Mon Oct 03 16:54:51 2011 +0000
> @@ -36,7 +36,8 @@ static void assert_gsi(struct domain *d,
>  
>      if ( hvm_domain_use_pirq(d, pirq) )
>      {
> -        send_guest_pirq(d, pirq);
> +        if ( send_guest_pirq(d, pirq) && ioapic_gsi >= NR_ISAIRQS )
> +            pirq->lost++;
>          return;
>      }
>      vioapic_irq_positive_edge(d, ioapic_gsi);
> @@ -63,6 +64,7 @@ static void __hvm_pci_intx_assert(
>  {
>      struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
>      unsigned int gsi, link, isa_irq;
> +    struct pirq *pirq;
>  
>      ASSERT((device <= 31) && (intx <= 3));
>  
> @@ -72,6 +74,11 @@ static void __hvm_pci_intx_assert(
>      gsi = hvm_pci_intx_gsi(device, intx);
>      if ( hvm_irq->gsi_assert_count[gsi]++ == 0 )
>          assert_gsi(d, gsi);
> +    else {
> +        pirq = pirq_info(d, domain_emuirq_to_pirq(d, gsi));
> +        if ( hvm_domain_use_pirq(d, pirq) )
> +            pirq->lost++;
> +    }
>  
>      link    = hvm_pci_intx_link(device, intx);
>      isa_irq = hvm_irq->pci_link.route[link];
> diff -r bf533533046c xen/arch/x86/irq.c
> --- a/xen/arch/x86/irq.c	Fri Sep 30 14:12:35 2011 +0000
> +++ b/xen/arch/x86/irq.c	Mon Oct 03 16:54:51 2011 +0000
> @@ -965,7 +965,11 @@ static void __do_IRQ_guest(int irq)
>               !test_and_set_bool(pirq->masked) )
>              action->in_flight++;
>          if ( !hvm_do_IRQ_dpci(d, pirq) )
> -            send_guest_pirq(d, pirq);
> +        {
> +            if ( send_guest_pirq(d, pirq) &&
> +                    action->ack_type == ACKTYPE_EOI )
> +                pirq->lost++;
> +        }
>      }
>  
>      if ( action->ack_type != ACKTYPE_NONE )
> diff -r bf533533046c xen/arch/x86/physdev.c
> --- a/xen/arch/x86/physdev.c	Fri Sep 30 14:12:35 2011 +0000
> +++ b/xen/arch/x86/physdev.c	Mon Oct 03 16:54:51 2011 +0000
> @@ -11,6 +11,7 @@
>  #include <asm/current.h>
>  #include <asm/io_apic.h>
>  #include <asm/msi.h>
> +#include <asm/hvm/irq.h>
>  #include <asm/hypercall.h>
>  #include <public/xen.h>
>  #include <public/physdev.h>
> @@ -270,6 +271,10 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
>          if ( !is_hvm_domain(v->domain) ||
>               domain_pirq_to_irq(v->domain, eoi.irq) > 0 )
>              pirq_guest_eoi(pirq);
> +        if ( pirq->lost > 0) {
> +            if ( !send_guest_pirq(v->domain, pirq) )
> +                pirq->lost--;
> +        }
>          spin_unlock(&v->domain->event_lock);
>          ret = 0;
>          break;
> @@ -328,9 +333,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;
>          }
>  
> diff -r bf533533046c xen/include/xen/irq.h
> --- a/xen/include/xen/irq.h	Fri Sep 30 14:12:35 2011 +0000
> +++ b/xen/include/xen/irq.h	Mon Oct 03 16:54:51 2011 +0000
> @@ -146,6 +146,7 @@ struct pirq {
>      int pirq;
>      u16 evtchn;
>      bool_t masked;
> +    u32 lost;
>      struct rcu_head rcu_head;
>      struct arch_pirq arch;
>  };
> 

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 11:16:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 11:16:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAn4O-0005Nq-ET; Mon, 03 Oct 2011 11:16:52 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAn3p-0005By-NW
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 11:16:18 -0700
X-Env-Sender: davem@davemloft.net
X-Msg-Ref: server-12.tower-182.messagelabs.com!1317665772!20575478!1
X-Originating-IP: [198.137.202.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31580 invoked from network); 3 Oct 2011 18:16:14 -0000
Received: from shards.monkeyblade.net (HELO shards.monkeyblade.net)
	(198.137.202.13)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 3 Oct 2011 18:16:14 -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 p93IG4Ij001161
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 11:16:05 -0700
Date: Mon, 03 Oct 2011 14:16:03 -0400 (EDT)
Message-Id: <20111003.141603.369934124561797426.davem@davemloft.net>
To: Ian.Campbell@eu.citrix.com
From: David Miller <davem@davemloft.net>
In-Reply-To: <1317401105.26672.319.camel@zakaz.uk.xensource.com>
References: <1317400671-21236-1-git-send-email-david.vrabel@citrix.com>
	<1317401105.26672.319.camel@zakaz.uk.xensource.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, 03 Oct 2011 11:16:06 -0700 (PDT)
Cc: netdev@vger.kernel.org, xen-devel@lists.xensource.com,
	david.vrabel@citrix.com
Subject: [Xen-devel] Re: [PATCH] net: xen-netback: correctly restart Tx
 after a VM restore/migrate
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 <Ian.Campbell@eu.citrix.com>
Date: Fri, 30 Sep 2011 17:45:05 +0100

> On Fri, 2011-09-30 at 17:37 +0100, David Vrabel wrote:
>> If a VM is saved and restored (or migrated) the netback driver will no
>> longer process any Tx packets from the frontend.  xenvif_up() does not
>> schedule the processing of any pending Tx requests from the front end
>> because the carrier is off.  Without this initial kick the frontend
>> just adds Tx requests to the ring without raising an event (until the
>> ring is full).
>> 
>> This was caused by 47103041e91794acdbc6165da0ae288d844c820b (net:
>> xen-netback: convert to hw_features) which reordered the calls to
>> xenvif_up() and netif_carrier_on() in xenvif_connect().
> 
> Ah, so the bit of that patch which moved "netif_carrier_on(vif->dev);"
> should have actually moved the entire block
>  	netif_carrier_on(vif->dev);
> 	if (netif_running(vif->dev))
> 		xenvif_up(vif);
> 
> Since it it is logically a single thing. Make sense. Thanks!
> 
>> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
> 
> Acked-by: Ian Campbell <ian.campbell@citrix.com>

Applied, thanks.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 11:43:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 11:43:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAnTl-0007kN-G3; Mon, 03 Oct 2011 11:43:05 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAnTB-0007VM-8t
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 11:42:29 -0700
X-Env-Sender: tglx@linutronix.de
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317667330!56504045!1
X-Originating-IP: [62.245.132.108]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10268 invoked from network); 3 Oct 2011 18:42:10 -0000
Received: from www.linutronix.de (HELO Galois.linutronix.de) (62.245.132.108)
	by server-10.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Oct 2011 18:42:10 -0000
Received: from localhost ([127.0.0.1]) by Galois.linutronix.de with esmtps
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.72)
	(envelope-from <tglx@linutronix.de>)
	id 1RAnT3-00075w-Cg; Mon, 03 Oct 2011 20:42:21 +0200
Date: Mon, 3 Oct 2011 20:42:20 +0200 (CEST)
From: Thomas Gleixner <tglx@linutronix.de>
To: Ian Campbell <Ian.Campbell@citrix.com>
In-Reply-To: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.LFD.2.02.1110032033530.1489@ionos>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.02 (LFD 1266 2009-07-14)
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-Linutronix-Spam-Score: -1.0
X-Linutronix-Spam-Level: -
X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,
	SHORTCIRCUIT=-0.0001
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	xen-devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 3 Oct 2011, Ian Campbell wrote:
> I can see a few options for how I might go about solving this in a
> non-hacky way, which approach do you think would be preferable:

The question is whether you need to disable the IPI interrupt at
all. If not, we have a flag for that.
 
>       * Add "IRQF_RESUME_EARLY", driven from syscore_resume, and use it
>         for these interrupts.

That's the preferable solution, as we could use that for PPC as well,
unless we can move stuff around, so we disable stuff later. 

>       * register syscore ops for the Xen event channel subsystem to
>         unmask the IPIs earlier (would probably look a lot like the code
>         removed by 676dc3cf5bc3).

I'd like to avoid that.

>       * add syscore_ops to Xen smp subsystem to unmask the specific IPIs
>         (which it binds at start of day) earlier.
>       * push dpm_(suspend|resume)_noirq down into stop machine region

Where is stomp machine used?

>       * use something other than stop_machine to quiesce system and move
>         to cpu0 for suspend (doesn't seem sensible to reproduce that
>         functionality).

We already shut down the nonboot cpus on suspend. We could do that
_before_ we disable devices and the interrupts.
 
Raphael ?

Thanks,

	tglx

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 11:48:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 11:48:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAnZI-0008Fh-I6; Mon, 03 Oct 2011 11:48:48 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAnYn-00083k-Gj
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 11:48:17 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317667581!38665001!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28287 invoked from network); 3 Oct 2011 18:46: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; 3 Oct 2011 18:46:22 -0000
Received: from rtcsinet22.oracle.com (rtcsinet22.oracle.com [66.248.204.30])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93IlgQu025298
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 3 Oct 2011 18:47:44 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by rtcsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93Ilbb8019412
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 18:47:38 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
	p93IlWPY013989; Mon, 3 Oct 2011 13:47:32 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 11:47:31 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 180271EA; Mon,  3 Oct 2011 14:47:23 -0400 (EDT)
Date: Mon, 3 Oct 2011 14:47:23 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: rush <rush1503@gmail.com>
Message-ID: <20111003184722.GB15608@phenom.oracle.com>
References: <20110919210045.3256.61939.reportbug@xen-dom0.xen.irush.su>
	<20110919212211.GB6343@elie>
	<CA+rvmvK8G5hNq4wOkPdcDMufYS9bD559zvexMqG9gy=m7dkU_A@mail.gmail.com>
	<1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
	<CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
	<1317460798.11991.2.camel@dagon.hellion.org.uk>
	<CA+rvmv+yU0=nEuvLSqkE44RFqeaQw504MkD-sxjXV3D3nkme_g@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CA+rvmv+yU0=nEuvLSqkE44RFqeaQw504MkD-sxjXV3D3nkme_g@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: rtcsinet22.oracle.com [66.248.204.30]
X-CT-RefId: str=0001.0A090205.4E8A0351.0039,ss=1,re=0.000,fgs=0
Cc: Jonathan Nieder <jrnieder@gmail.com>, 642154@bugs.debian.org,
	xen-devel <xen-devel@lists.xensource.com>,
	Ben Hutchings <ben@decadent.org.uk>, Ian Campbell <ijc@hellion.org.uk>
Subject: [Xen-devel] Re: BUG: unable to handle kernel paging request at
	ffff8803bb6ad000
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>         echo    'Loading Xen 4.0-amd64 ...'
>         multiboot       /boot/xen-4.0-amd64.gz placeholder

Oops. I meant to try it in the hypervisor - so right after placeholder add "xsave=0"

>         echo    'Loading Linux 3.0.0-1-amd64 ...'
>         module  /boot/vmlinuz-3.0.0-1-amd64 placeholder
> root=/dev/mapper/xen-system ro xsave=0 quiet



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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 11:53:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 11:53:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAne8-0000E9-Ek; Mon, 03 Oct 2011 11:53:48 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RAnde-0008TY-0S
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 11:53:18 -0700
X-Env-Sender: ijc@hellion.org.uk
X-Msg-Ref: server-6.tower-182.messagelabs.com!1317667994!19534386!1
X-Originating-IP: [80.68.92.230]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5164 invoked from network); 3 Oct 2011 18:53:14 -0000
Received: from aaar.vm.bytemark.co.uk (HELO aaar.vm.bytemark.co.uk)
	(80.68.92.230) by server-6.tower-182.messagelabs.com with SMTP;
	3 Oct 2011 18:53:14 -0000
Received: from localhost (unknown [127.0.0.1])
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id AA8711425EA;
	Mon,  3 Oct 2011 18:53:10 +0000 (UTC)
Received: from aaar.vm.bytemark.co.uk ([127.0.0.1])
	by localhost (aaar.vm.bytemark.co.uk [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id pKqfQ6OxmtSo; Mon,  3 Oct 2011 19:53:08 +0100 (BST)
Received: from hopkins.hellion.org.uk
	(cpc2-cmbg14-2-0-cust125.5-4.cable.virginmedia.com [86.26.0.126])
	(using TLSv1 with cipher AES256-SHA (256/256 bits))
	(No client certificate requested)
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id 94B7114227F;
	Mon,  3 Oct 2011 19:53:08 +0100 (BST)
Received: from dagon.hellion.org.uk ([192.168.1.7])
	by hopkins.hellion.org.uk with esmtps (SSL3.0:RSA_AES_256_CBC_SHA1:32)
	(Exim 4.72) (envelope-from <ijc@hellion.org.uk>)
	id 1RAndQ-000050-9K; Mon, 03 Oct 2011 19:53:06 +0100
From: Ian Campbell <ijc@hellion.org.uk>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
In-Reply-To: <20111003184722.GB15608@phenom.oracle.com>
References: <20110919210045.3256.61939.reportbug@xen-dom0.xen.irush.su>
	<20110919212211.GB6343@elie>
	<CA+rvmvK8G5hNq4wOkPdcDMufYS9bD559zvexMqG9gy=m7dkU_A@mail.gmail.com>
	<1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
	<CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
	<1317460798.11991.2.camel@dagon.hellion.org.uk>
	<CA+rvmv+yU0=nEuvLSqkE44RFqeaQw504MkD-sxjXV3D3nkme_g@mail.gmail.com>
	<20111003184722.GB15608@phenom.oracle.com>
Date: Mon, 03 Oct 2011 19:53:03 +0100
Message-ID: <1317667984.11991.6.camel@dagon.hellion.org.uk>
Mime-Version: 1.0
X-Mailer: Evolution 2.32.3 
X-SA-Exim-Connect-IP: 192.168.1.7
X-SA-Exim-Mail-From: ijc@hellion.org.uk
X-SA-Exim-Version: 4.2.1 (built Mon, 22 Mar 2010 06:51:10 +0000)
X-SA-Exim-Scanned: Yes (on hopkins.hellion.org.uk)
Cc: xen-devel <xen-devel@lists.xensource.com>, Ben, rush <rush1503@gmail.com>,
	Jonathan Nieder <jrnieder@gmail.com>, 642154@bugs.debian.org,
	Hutchings <ben@decadent.org.uk>
Subject: [Xen-devel] Re: BUG: unable to handle kernel paging request at
	ffff8803bb6ad000
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============1256764974=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============1256764974==
Content-Type: multipart/signed; micalg="pgp-sha512";
	protocol="application/pgp-signature";
	boundary="=-g7EoNTl3SZJmapxNapB9"


--=-g7EoNTl3SZJmapxNapB9
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable

On Mon, 2011-10-03 at 14:47 -0400, Konrad Rzeszutek Wilk wrote:
> >         echo    'Loading Xen 4.0-amd64 ...'
> >         multiboot       /boot/xen-4.0-amd64.gz placeholder
>=20
> Oops. I meant to try it in the hypervisor - so right after placeholder ad=
d "xsave=3D0"

Which in grub2 means add GRUB_CMDLINE_XEN=3D"xsave=3D0" to /etc/default/gru=
b
(there is no commented out example in this case) and re-run update-grub.

Ian.

--=20
Ian Campbell


Many a bum show has been saved by the flag.
		-- George M. Cohan

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

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

iQIcBAABCgAGBQJOigSPAAoJEOxjaZd5B0+ol3UP/3yVYJJliPn3Yn/VZoZRRm4Z
OrODfhELrb+Tr8tnVIoSuHjTvwSy/X68GrUWLRewA3p3ZrfnY9IYLu8XB9fR7jAB
7F8yeVzRABH73JF6Ev/zwHLCEH5KpwjtsFwdc17raI4GOBby6gGk6s1cL716tYkU
oHlNZHlQNMdG9/PP+bqo3tu71DH37E3NH2P+eliN/TMHcupFZa4p3S4xNBGbaWDA
HiCEosN2KXOzB/VlL3TcTvBRHmFf6aqNKwyp3zb3MxjBSDcK79tdZm8VAIoJhUbU
sniq7TZBtpIWleRVTSKhiO24OCRfe5et79CAKld6w6EqagmWDBLYAVJNt1V0SEwO
qqkLoeAYjMVAnFX74plXxS60cw+yEvF0hGNRKbmY6IAd0rsXsnRy37NDtRnaTVV3
hUJTIljeDmFvztkTygTMHEnnNLxl0JqJiSdYA7FBv0z8+AzM6PBFtPxZiAbJdycV
yAwkl8fBO83I8U6zUvPaYvOnFCJw539rAEPAXbBvfK/QJcmP6e2SjAQuW/TjdGz9
g9rRndIyj6sc2L2l+oHrbhEGz09H/IJQhPePMIuHau5sd3UsLyl3VoP3gnESICdh
FDt80OxPBEshZa2jUAAPp8z+eL0oW43jeOUK8xvviqP/GGfVEVCo/yFYRiSi6MbJ
kyBTbw0m69Dp+6v/6VXL
=gaIT
-----END PGP SIGNATURE-----

--=-g7EoNTl3SZJmapxNapB9--



--===============1256764974==
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

--===============1256764974==--



From xen-devel-bounces@lists.xensource.com Mon Oct 03 11:54:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 11:54:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAney-0000bh-OS; Mon, 03 Oct 2011 11:54:40 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAndv-00008R-C3; Mon, 03 Oct 2011 11:53:35 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1317668010!30030358!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3367 invoked from network); 3 Oct 2011 18:53:31 -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; 3 Oct 2011 18:53:31 -0000
Received: from rtcsinet21.oracle.com (rtcsinet21.oracle.com [66.248.204.29])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93IrQSe021568
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 3 Oct 2011 18:53:28 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by rtcsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93IrOuA018442
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 18:53:25 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
	p93IrIKR028211; Mon, 3 Oct 2011 13:53:19 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 11:53:18 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 1D6B91EA; Mon,  3 Oct 2011 14:53:10 -0400 (EDT)
Date: Mon, 3 Oct 2011 14:53:10 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Lars Kurth <lars.kurth@xen.org>
Subject: Re: [Xen-devel] Xen document day (Oct 12 or 26)
Message-ID: <20111003185309.GC15608@phenom.oracle.com>
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4E85A9B7.7040605@xen.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: rtcsinet21.oracle.com [66.248.204.29]
X-CT-RefId: str=0001.0A090204.4E8A04A9.00DC,ss=1,re=0.000,fgs=0
Cc: Joseph Glanville <joseph.glanville@orionvm.com.au>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, Sep 30, 2011 at 12:36:23PM +0100, Lars Kurth wrote:
> Let me know, which date you agreed on. We could do a poll.

Please do a pool. I posted two dates, but other ones could work as well.

> We should publish on the blog a bit before.

Ok.
> Also, how can I help?

In lots of ways. There is a lot of things that we want to do - but
I don't think we can do _all_ of them. Can you help us determine what
ought to have a higher priority?


> Regards
> Lars
>=20
> On 29/09/2011 15:22, Joseph Glanville wrote:
> >
> >On 30 September 2011 00:13, Pasi K=E4rkk=E4inen <pasik@iki.fi
> ><mailto:pasik@iki.fi>> wrote:
> >
> >    On Thu, Sep 22, 2011 at 09:06:18AM -0400, Konrad Rzeszutek Wilk wr=
ote:
> >    > Part of what we brainstormed at Xen Hackathon was what we could
> >    do make Xen easier.
> >    >
> >    > And the one thing that seemed to surface up was making the docs
> >    better - either
> >    > be the Wiki or the three .pdfs that get created/shipped with Xen=
.
> >    >
> >    > One thought was to come up with a Documention Day - where
> >    volunteers would try to
> >    > fix up some portion of the documentation that they feel they hav=
e
> >    > a good grasp of knowledge off and are willing to change (and
> >    also look
> >    > to be incorrect)
> >    >
> >    > What do you guys think of Oct 12th or Oct 26 as a day for this?
> >    >
> >    > And then the next question - what page/pdf section interests you=
?
> >    >
> >    > http://bits.xensource.com/Xen/docs/user.pdf
> >    > http://www.rites.uic.edu/~solworth/xenInterfaceManual.pdf
> >    <http://www.rites.uic.edu/%7Esolworth/xenInterfaceManual.pdf> [the
> >    one on Xen.org is an older version]
> >    >
> >    > Or Wiki pages:
> >    > http://wiki.xensource.com/xenwiki/
> >    >
> >    > http://wiki.xensource.com/xenwiki/XenDom0Kernels
> >    > http://wiki.xensource.com/xenwiki/XenSerialConsole
> >    > http://wiki.xensource.com/xenwiki/XenParavirtOps
> >    > http://wiki.xensource.com/xenwiki/XenCommonProblems
> >    >
> >    > http://wiki.xensource.com/xenwiki/Consulting
> >    > http://wiki.xensource.com/xenwiki/Consultants
> >    > http://wiki.xensource.com/xenwiki/VpsHostingWithXen
> >    >
> >    > http://wiki.xen.org/xenwiki/XenPCIpassthrough
> >    > http://wiki.xen.org/xenwiki/VTdHowTo
> >    >
> >
> >    Some more related pages:
> >    http://wiki.xen.org/xenwiki/Xen4.0
> >    http://wiki.xen.org/xenwiki/Xen4.1
> >    http://wiki.xen.org/xenwiki/XenKernelFeatures
> >    http://wiki.xen.org/xenwiki/XenBestPractices
> >    http://wiki.xen.org/xenwiki/XenHypervisorBootOptions
> >
> >    Also there's something completely new that we should document:
> >    How to install Xen VMs! which means document all the relevant meth=
ods:
> >    boot the native distro installer as PV guest, as HVM guest,
> >    xen-tools, virt-install,
> >    debootstrap, rpmstart, etc..
> >
> >    That's something people ask about very often..
> >
> >Agreed.
> >
> >After working through a bunch of the pages I think we are going to
> >have to have a realtime collab session to decide on some way of
> >reorganising everything into categories.
> >
> >
> >
> >    -- Pasi
> >
> >
> >    _______________________________________________
> >    Xen-devel mailing list
> >    Xen-devel@lists.xensource.com <mailto:Xen-devel@lists.xensource.co=
m>
> >    http://lists.xensource.com/xen-devel
> >
> >
> >
> >
> >--=20
> >*/
> >Founder | Director | VP Research
> >Orion Virtualisation Solutions/* | www.orionvm.com.au
> ><http://www.orionvm.com.au/> | Phone: 1300 56 99 52 | Mobile: 0428
> >754 846
> >
> >
> >_______________________________________________
> >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 Mon Oct 03 12:06:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 12:06:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAnqk-0002GK-JW; Mon, 03 Oct 2011 12:06:50 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAnox-00021k-64
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 12:04:59 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1317668694!30031244!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20299 invoked from network); 3 Oct 2011 19:04:55 -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; 3 Oct 2011 19:04:55 -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
	p93J4gYP002370
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 3 Oct 2011 19:04:44 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
	p93J4fHX017506
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 19:04:41 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
	p93J4a1g004005; Mon, 3 Oct 2011 14:04:36 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 12:04:36 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 776811EA; Mon,  3 Oct 2011 15:04:27 -0400 (EDT)
Date: Mon, 3 Oct 2011 15:04:27 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
Message-ID: <20111003190427.GE15608@phenom.oracle.com>
References: <4E85DB1A.5060606@overnetdata.com>
	<20111001120706.GZ12984@reaktio.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111001120706.GZ12984@reaktio.net>
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.4E8A074C.0062:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Anthony Wright <anthony@overnetdata.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> > Stage 1
> > Everything is fine, Dom0 has 2000MB according to xl list, and 'xl info'
> > says there is 2405MB free.
> > 
> 
> - How much memory did dom0 initially have? 
> - Did you use mem= parameter for dom0 kernel (vmlinuz) ?
> 
> See: http://wiki.xen.org/xenwiki/Linux_30_bugs

..especially the one titled: " dom0_mem=max:XG is ignored".

Those two patches mentioned are going to show up in 3.0.5.
In the meantime, use the work-around.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 12:09:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 12:09:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAnt2-0002hI-Qu; Mon, 03 Oct 2011 12:09:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RAnsG-0002TA-C7
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 12:08:32 -0700
X-Env-Sender: victor_ling12@yahoo.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1317668878!47435228!1
X-Originating-IP: [98.139.91.72]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22878 invoked from network); 3 Oct 2011 19:07:59 -0000
Received: from nm2.bullet.mail.sp2.yahoo.com (HELO
	nm2.bullet.mail.sp2.yahoo.com) (98.139.91.72)
	by server-5.tower-27.messagelabs.com with SMTP;
	3 Oct 2011 19:07:59 -0000
Received: from [98.139.91.65] by nm2.bullet.mail.sp2.yahoo.com with NNFMP;
	03 Oct 2011 19:08:19 -0000
Received: from [98.139.91.20] by tm5.bullet.mail.sp2.yahoo.com with NNFMP;
	03 Oct 2011 19:08:19 -0000
Received: from [127.0.0.1] by omp1020.mail.sp2.yahoo.com with NNFMP;
	03 Oct 2011 19:08:19 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: 614991.50573.bm@omp1020.mail.sp2.yahoo.com
Received: (qmail 50150 invoked by uid 60001); 3 Oct 2011 19:08:19 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024;
	t=1317668899; bh=cMTYF4TDKvJ/EIhMkHlyUbdPQf38z/pMlSsQqTi8Mjc=;
	h=X-YMail-OSG:Received:X-Mailer:References:Message-ID:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type;
	b=O2glBb/IQiOg7XwjL8jX495GxXVz7UhVtdcs79zkZhLddeaVaNabpnInnXazjFG1Aj27S+KYFahH5fqoCcYNjtFXkN/1oFmw/zM+mxJkqZl6+0MefqL88LDsrYEBFnFHfI+jIIiCHnXknZke1CxRxDOsmotSzIc2Ulqz+ODPaQk=
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com;
	h=X-YMail-OSG:Received:X-Mailer:References:Message-ID:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type;
	b=FuJP1GsZfGRBXCBpF2MYHKCAoo7YjWCQf3oH4ZI6BEXRi8gZtqM3RRFeQWWANF+0iryWSIWzUUPvFYfR3+ZTnLtk9OjlvpW063XwL+MIxRhNsTQj1M0KHj6i/AkTcUAZEE16KxtsdzMV6qVQ/uBh8dvLhJTSmF2sCUHryAeV51M=;
X-YMail-OSG: bk7p81cVM1nyAgZNT.fGdH99HQ.VnB6E5x9ezj7pNr3tBr8
	0ywSeNzTNv_rrdAwfpEoUPldmDForsNkD.Rqz83KWa.fF7PD.J7011AEAlOS
	RNIWnjso_hNUV8nlU7yCTI9AjoRBxCRbsLtWO0LgMtosd4WjtV_6xYQmHvnz
	RCHzDkE7DeC4IF1bBb8ngB8ux6sRMnn7mREc652I1jhJPuY3ATPals1K0Bej
	x5t8DeU032VOlftclleDebJYxW3jEkN2bdxOSoXDn5HxYzBmiIQ4BxrwLJQf
	6Mgj2vUssKn8KGikiuVRhlC.nehJzgPmbmF.1QarlZmqvd86KtQ9_Eu17ZYP
	w5wEdBESZyUuF.fL33_SzPkM7WFjj_f3CSRlwoVh9oxdzYRqjayCcpJIHUp.
	xp7jyXTQoDohtjbePWoa8ZJI0coJ44Heu_MUOI2YbC8di4_QKxBwHE1U7VQ- -
Received: from [12.207.18.42] by web114215.mail.gq1.yahoo.com via HTTP;
	Mon, 03 Oct 2011 12:08:19 PDT
X-Mailer: YahooMailWebService/0.8.114.317681
References: <1317165580.71822.YahooMailNeo@web114212.mail.gq1.yahoo.com>
Message-ID: <1317668899.43096.YahooMailNeo@web114215.mail.gq1.yahoo.com>
Date: Mon, 3 Oct 2011 12:08:19 -0700 (PDT)
From: Victor Ling <victor_ling12@yahoo.com>
To: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>
In-Reply-To: <1317165580.71822.YahooMailNeo@web114212.mail.gq1.yahoo.com>
MIME-Version: 1.0
Cc: 
Subject: [Xen-devel] DomU creation problem
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: Victor Ling <victor_ling12@yahoo.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="===============0353159099=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0353159099==
Content-Type: multipart/alternative;
	boundary="32398890-1237362963-1317668899=:43096"

--32398890-1237362963-1317668899=:43096
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

=0AI am running Xen 4.0.0 with kernel=A0 3.0.1.stk64.=0A=0AI have=A0 a simp=
le config file to create DomU but failed.=0AI have included config file and=
 output message.=0ADo I have to have ramdisk? How could I create/get one?=
=0A=0APlease help Thanks.=0AVic=0A-----------------------------------------=
-------------------------=0A=0AThe config file is:=0A=0Akernel=A0 =3D "/boo=
t/vmlinuz-3.0.1.stk64"=0A#ramdisk =3D "/boot/initrd-2.6.32.12-0.7-default"=
=0Amemory =3D128 =0Avcpus =3D '2'=0Aname =3D "xen-test"=0Aroot =3D '/dev/xv=
da1 ro'=0Adisk =3D [=0A=A0=A0=A0=A0=A0=A0=A0=A0 'file:/home/domains/nvidia/=
XenGuest1.img,xvda1,w',=0A=A0=A0=A0=A0=A0=A0=A0 ]=0A=0A_-------------------=
------------------------------------------=0Alinux:/etc/xen # xm create -c =
nvidia.cfg=0AUsing config file "./nvidia.cfg".=0AStarted domain xen-vm6 (id=
=3D8)=0AInitializing cgroup subsys cpuset=0AInitializing cgroup subsys cpu=
=0ALinux version 3.0.1.stk64 (dfn@localhost.localdomain) (gcc version 4.5.1=
 20100924 (Red Hat 4.5.1-4) (GCC) ) #1 SMP Sat Aug 13 12:53:46 EDT 2011=0AC=
ommand line: root=3D/dev/xvda1 ro =0AACPI in unprivileged domain disabled=
=0Areleased 0 pages of unused memory=0ASet 0 page(s) to 1-1 mapping.=0ABIOS=
-provided physical RAM map:=0A=A0Xen: 0000000000000000 - 00000000000a0000 (=
usable)=0A=A0Xen: 00000000000a0000 - 0000000000100000 (reserved)=0A=A0Xen: =
0000000000100000 - 0000000008800000 (usable)=0ANX (Execute Disable) protect=
ion: active=0ADMI not present or invalid.=0ANo AGP bridge found=0Alast_pfn =
=3D 0x8800 max_arch_pfn =3D 0x400000000=0Ainit_memory_mapping: 000000000000=
0000-0000000008800000=0ANo NUMA configuration found=0AFaking a node at 0000=
000000000000-0000000008800000=0AInitmem setup node 0 0000000000000000-00000=
00008800000=0A=A0 NODE_DATA [0000000007fec000 - 0000000007ffffff]=0AZone PF=
N ranges:=0A=A0 DMA=A0=A0=A0=A0=A0 0x00000010 -> 0x00001000=0A=A0 DMA32=A0=
=A0=A0 0x00001000 -> 0x00100000=0A=A0 Normal=A0=A0 empty=0AMovable zone sta=
rt PFN for each node=0Aearly_node_map[2] active PFN ranges=0A=A0=A0=A0 0: 0=
x00000010 -> 0x000000a0=0A=A0=A0=A0 0: 0x00000100 -> 0x00008800=0ASFI: Simp=
le Firmware Interface v0.81 http://simplefirmware.org=0ASMP: Allowing 2 CPU=
s, 0 hotplug CPUs=0ANo local APIC present=0AAPIC: disable apic facility=0AA=
PIC: switched to apic NOOP=0APM: Registered nosave memory: 00000000000a0000=
 - 0000000000100000=0AAllocating PCI resources starting at 8800000 (gap: 88=
00000:f7800000)=0ABooting paravirtualized kernel on Xen=0AXen version: 4.0.=
0_21091_04-0.2 (preserve-AD)=0Asetup_percpu: NR_CPUS:256 nr_cpumask_bits:25=
6 nr_cpu_ids:2 nr_node_ids:1=0APERCPU: Embedded 27 pages/cpu @ffff880007f4d=
000 s78400 r8192 d24000 u110592=0ABuilt 1 zonelists in Node order, mobility=
 grouping on.=A0 Total pages: 34223=0APolicy zone: DMA32=0AKernel command l=
ine: root=3D/dev/xvda1 ro =0APID hash table entries: 1024 (order: 1, 8192 b=
ytes)=0AChecking aperture...=0ANo AGP bridge found=0AMemory: 116580k/139264=
k available (4501k kernel code, 448k absent, 22236k reserved, 2929k data, 9=
20k init)=0ASLUB: Genslabs=3D15, HWalign=3D64, Order=3D0-3, MinObjects=3D0,=
 CPUs=3D2, Nodes=3D1=0AHierarchical RCU implementation.=0ANR_IRQS:16640 nr_=
irqs:288 16=0AConsole: colour dummy device 80x25=0Aconsole [tty0] enabled=
=0Aconsole [hvc0] enabled=0Aallocated 2097152 bytes of page_cgroup=0Aplease=
 try 'cgroup_disable=3Dmemory' option if you don't want memory cgroups=0Ain=
stalling Xen timer for CPU 0=0ADetected 2926.028 MHz processor.=0ACalibrati=
ng delay loop (skipped), value calculated using timer frequency.. 5852.05 B=
ogoMIPS (lpj=3D2926028)=0Apid_max: default: 32768 minimum: 301=0ASecurity F=
ramework initialized=0ASELinux:=A0 Initializing.=0ADentry cache hash table =
entries: 32768 (order: 6, 262144 bytes)=0AInode-cache hash table entries: 1=
6384 (order: 5, 131072 bytes)=0AMount-cache hash table entries: 256=0AIniti=
alizing cgroup subsys cpuacct=0AInitializing cgroup subsys memory=0AInitial=
izing cgroup subsys devices=0AInitializing cgroup subsys freezer=0AInitiali=
zing cgroup subsys net_cls=0ACPU: Physical Processor ID: 0=0ACPU: Processor=
 Core ID: 0=0ASMP alternatives: switching to UP code=0Aftrace: allocating 2=
3941 entries in 94 pages=0APerformance Events: unsupported p6 CPU model 23 =
no PMU driver, software events only.=0Ainstalling Xen timer for CPU 1=0ASMP=
 alternatives: switching to SMP code=0ABrought up 2 CPUs=0Adevtmpfs: initia=
lized=0AGrant table initialized=0Aprint_constraints: dummy: =0ATime: 165:16=
5:165=A0 Date: 165/165/65=0ANET: Registered protocol family 16=0APCI: setti=
ng up Xen PCI frontend stub=0Abio: create slab <bio-0> at 0=0AACPI: Interpr=
eter disabled.=0Axen/balloon: Initialising balloon driver.=0Alast_pfn =3D 0=
x8800 max_arch_pfn =3D 0x400000000=0Axen-balloon: Initialising balloon driv=
er.=0Avgaarb: loaded=0ASCSI subsystem initialized=0APCI: System does not su=
pport PCI=0APCI: System does not support PCI=0ANetLabel: Initializing=0ANet=
Label:=A0 domain hash size =3D 128=0ANetLabel:=A0 protocols =3D UNLABELED C=
IPSOv4=0ANetLabel:=A0 unlabeled traffic allowed by default=0ASwitching to c=
locksource xen=0ASwitched to NOHz mode on CPU #0=0ACE: xen increased min_de=
lta_ns to 150000 nsec=0ACE: xen increased min_delta_ns to 225000 nsec=0ACE:=
 xen increased min_delta_ns to 337500 nsec=0ACE: xen increased min_delta_ns=
 to 506250 nsec=0ACE: xen increased min_delta_ns to 759375 nsec=0ACE: xen i=
ncreased min_delta_ns to 1000000 nsec=0ACE: Reprogramming failure. Giving u=
p=0ACE: Reprogramming failure. Giving up=0Ahrtimer: interrupt took 4327 ns=
=0ASwitched to NOHz mode on CPU #1=0ACE: xen increased min_delta_ns to 1500=
00 nsec=0ACE: xen increased min_delta_ns to 225000 nsec=0ACE: xen increased=
 min_delta_ns to 337500 nsec=0ACE: xen increased min_delta_ns to 506250 nse=
c=0ACE: xen increased min_delta_ns to 759375 nsec=0ACE: xen increased min_d=
elta_ns to 1000000 nsec=0ACE: Reprogramming failure. Giving up=0ACE: Reprog=
ramming failure. Giving up=0ACE: Reprogramming failure. Giving up=0Apnp: Pn=
P ACPI: disabled=0ANET: Registered protocol family 2=0AIP route cache hash =
table entries: 2048 (order: 2, 16384 bytes)=0ATCP established hash table en=
tries: 8192 (order: 5, 131072 bytes)=0ATCP bind hash table entries: 8192 (o=
rder: 5, 131072 bytes)=0ATCP: Hash tables configured (established 8192 bind=
 8192)=0ATCP reno registered=0AUDP hash table entries: 128 (order: 0, 4096 =
bytes)=0AUDP-Lite hash table entries: 128 (order: 0, 4096 bytes)=0ANET: Reg=
istered protocol family 1=0Aplatform rtc_cmos: registered platform RTC devi=
ce (no PNP device found)=0ACE: Reprogramming failure. Giving up=0Aaudit: in=
itializing netlink socket (disabled)=0Atype=3D2000 audit(1317642681.533:1):=
 initialized=0AHugeTLB registered 2 MB page size, pre-allocated 0 pages=0AV=
FS: Disk quotas dquot_6.5.2=0ADquot-cache hash table entries: 512 (order 0,=
 4096 bytes)=0Amsgmni has been set to 227=0ABlock layer SCSI generic (bsg) =
driver version 0.4 loaded (major 253)=0Aio scheduler noop registered=0Aio s=
cheduler deadline registered=0Aio scheduler cfq registered (default)=0Apci_=
hotplug: PCI Hot Plug PCI Core version: 0.5=0Apciehp: PCI Express Hot Plug =
Controller Driver version: 0.4=0Aacpiphp: ACPI Hot Plug PCI Controller Driv=
er version: 0.5=0ASerial: 8250/16550 driver, 4 ports, IRQ sharing enabled
--32398890-1237362963-1317668899=:43096
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

<html><body><div style=3D"color:#000; background-color:#fff; font-family:ti=
mes new roman, new york, times, serif;font-size:12pt"><div><span><br>I am r=
unning Xen 4.0.0 with kernel&nbsp; 3.0.1.stk64.</span></div><div><br><span>=
</span></div><div><span>I have&nbsp; a simple config file to create DomU bu=
t failed.</span></div><div><span>I have included config file and output mes=
sage.</span></div><div><span>Do I have to have ramdisk? How could I create/=
get one?<br></span></div><div><span>Please help Thanks.</span></div><div>Vi=
c</div><div>---------------------------------------------------------------=
---<br><span></span></div><div><span>The config file is:<br></span></div><d=
iv><br><span></span></div>kernel&nbsp; =3D "/boot/vmlinuz-3.0.1.stk64"<br>#=
ramdisk =3D "/boot/initrd-2.6.32.12-0.7-default"<br>memory =3D128 <br>vcpus=
 =3D '2'<br>name =3D "xen-test"<br>root =3D '/dev/xvda1 ro'<br>disk =3D [<b=
r>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 'file:/home/domains/nvidia/XenGuest1.img,xvda1,w',<br>&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp; ]<br><br>_------------------------------------------=
-------------------<br>linux:/etc/xen # xm create -c nvidia.cfg<br>Using co=
nfig file "./nvidia.cfg".<br>Started domain xen-vm6 (id=3D8)<br>Initializin=
g cgroup subsys cpuset<br>Initializing cgroup subsys cpu<br>Linux version 3=
.0.1.stk64 (dfn@localhost.localdomain) (gcc version 4.5.1 20100924 (Red Hat=
 4.5.1-4) (GCC) ) #1 SMP Sat Aug 13 12:53:46 EDT 2011<br>Command line: root=
=3D/dev/xvda1 ro <br>ACPI in unprivileged domain disabled<br>released 0 pag=
es of unused memory<br>Set 0 page(s) to 1-1 mapping.<br>BIOS-provided physi=
cal RAM map:<br>&nbsp;Xen: 0000000000000000 - 00000000000a0000 (usable)<br>=
&nbsp;Xen: 00000000000a0000 - 0000000000100000 (reserved)<br>&nbsp;Xen: 000=
0000000100000 - 0000000008800000 (usable)<br>NX (Execute Disable) protectio=
n: active<br>DMI not present or invalid.<br>No AGP bridge
 found<br>last_pfn =3D 0x8800 max_arch_pfn =3D 0x400000000<br>init_memory_m=
apping: 0000000000000000-0000000008800000<br>No NUMA configuration found<br=
>Faking a node at 0000000000000000-0000000008800000<br>Initmem setup node 0=
 0000000000000000-0000000008800000<br>&nbsp; NODE_DATA [0000000007fec000 - =
0000000007ffffff]<br>Zone PFN ranges:<br>&nbsp; DMA&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp; 0x00000010 -&gt; 0x00001000<br>&nbsp; DMA32&nbsp;&nbsp;&nbsp; 0x0000=
1000 -&gt; 0x00100000<br>&nbsp; Normal&nbsp;&nbsp; empty<br>Movable zone st=
art PFN for each node<br>early_node_map[2] active PFN ranges<br>&nbsp;&nbsp=
;&nbsp; 0: 0x00000010 -&gt; 0x000000a0<br>&nbsp;&nbsp;&nbsp; 0: 0x00000100 =
-&gt; 0x00008800<br>SFI: Simple Firmware Interface v0.81 http://simplefirmw=
are.org<br>SMP: Allowing 2 CPUs, 0 hotplug CPUs<br>No local APIC present<br=
>APIC: disable apic facility<br>APIC: switched to apic NOOP<br>PM: Register=
ed nosave memory: 00000000000a0000 - 0000000000100000<br>Allocating PCI
 resources starting at 8800000 (gap: 8800000:f7800000)<br>Booting paravirtu=
alized kernel on Xen<br>Xen version: 4.0.0_21091_04-0.2 (preserve-AD)<br>se=
tup_percpu: NR_CPUS:256 nr_cpumask_bits:256 nr_cpu_ids:2 nr_node_ids:1<br>P=
ERCPU: Embedded 27 pages/cpu @ffff880007f4d000 s78400 r8192 d24000 u110592<=
br>Built 1 zonelists in Node order, mobility grouping on.&nbsp; Total pages=
: 34223<br>Policy zone: DMA32<br>Kernel command line: root=3D/dev/xvda1 ro =
<br>PID hash table entries: 1024 (order: 1, 8192 bytes)<br>Checking apertur=
e...<br>No AGP bridge found<br>Memory: 116580k/139264k available (4501k ker=
nel code, 448k absent, 22236k reserved, 2929k data, 920k init)<br>SLUB: Gen=
slabs=3D15, HWalign=3D64, Order=3D0-3, MinObjects=3D0, CPUs=3D2, Nodes=3D1<=
br>Hierarchical RCU implementation.<br>NR_IRQS:16640 nr_irqs:288 16<br>Cons=
ole: colour dummy device 80x25<br>console [tty0] enabled<br>console [hvc0] =
enabled<br>allocated 2097152 bytes of page_cgroup<br>please try
 'cgroup_disable=3Dmemory' option if you don't want memory cgroups<br>insta=
lling Xen timer for CPU 0<br>Detected 2926.028 MHz processor.<br>Calibratin=
g delay loop (skipped), value calculated using timer frequency.. 5852.05 Bo=
goMIPS (lpj=3D2926028)<br>pid_max: default: 32768 minimum: 301<br>Security =
Framework initialized<br>SELinux:&nbsp; Initializing.<br>Dentry cache hash =
table entries: 32768 (order: 6, 262144 bytes)<br>Inode-cache hash table ent=
ries: 16384 (order: 5, 131072 bytes)<br>Mount-cache hash table entries: 256=
<br>Initializing cgroup subsys cpuacct<br>Initializing cgroup subsys memory=
<br>Initializing cgroup subsys devices<br>Initializing cgroup subsys freeze=
r<br>Initializing cgroup subsys net_cls<br>CPU: Physical Processor ID: 0<br=
>CPU: Processor Core ID: 0<br>SMP alternatives: switching to UP code<br>ftr=
ace: allocating 23941 entries in 94 pages<br>Performance Events: unsupporte=
d p6 CPU model 23 no PMU driver, software events only.<br>installing Xen
 timer for CPU 1<br>SMP alternatives: switching to SMP code<br>Brought up 2=
 CPUs<br>devtmpfs: initialized<br>Grant table initialized<br>print_constrai=
nts: dummy: <br>Time: 165:165:165&nbsp; Date: 165/165/65<br>NET: Registered=
 protocol family 16<br>PCI: setting up Xen PCI frontend stub<br>bio: create=
 slab &lt;bio-0&gt; at 0<br>ACPI: Interpreter disabled.<br>xen/balloon: Ini=
tialising balloon driver.<br>last_pfn =3D 0x8800 max_arch_pfn =3D 0x4000000=
00<br>xen-balloon: Initialising balloon driver.<br>vgaarb: loaded<br>SCSI s=
ubsystem initialized<br>PCI: System does not support PCI<br>PCI: System doe=
s not support PCI<br>NetLabel: Initializing<br>NetLabel:&nbsp; domain hash =
size =3D 128<br>NetLabel:&nbsp; protocols =3D UNLABELED CIPSOv4<br>NetLabel=
:&nbsp; unlabeled traffic allowed by default<br>Switching to clocksource xe=
n<br>Switched to NOHz mode on CPU #0<br>CE: xen increased min_delta_ns to 1=
50000 nsec<br>CE: xen increased min_delta_ns to 225000 nsec<br>CE: xen
 increased min_delta_ns to 337500 nsec<br>CE: xen increased min_delta_ns to=
 506250 nsec<br>CE: xen increased min_delta_ns to 759375 nsec<br>CE: xen in=
creased min_delta_ns to 1000000 nsec<br>CE: Reprogramming failure. Giving u=
p<br>CE: Reprogramming failure. Giving up<br>hrtimer: interrupt took 4327 n=
s<br>Switched to NOHz mode on CPU #1<br>CE: xen increased min_delta_ns to 1=
50000 nsec<br>CE: xen increased min_delta_ns to 225000 nsec<br>CE: xen incr=
eased min_delta_ns to 337500 nsec<br>CE: xen increased min_delta_ns to 5062=
50 nsec<br>CE: xen increased min_delta_ns to 759375 nsec<br>CE: xen increas=
ed min_delta_ns to 1000000 nsec<br>CE: Reprogramming failure. Giving up<br>=
CE: Reprogramming failure. Giving up<br>CE: Reprogramming failure. Giving u=
p<br>pnp: PnP ACPI: disabled<br>NET: Registered protocol family 2<br>IP rou=
te cache hash table entries: 2048 (order: 2, 16384 bytes)<br>TCP establishe=
d hash table entries: 8192 (order: 5, 131072 bytes)<br>TCP bind hash
 table entries: 8192 (order: 5, 131072 bytes)<br>TCP: Hash tables configure=
d (established 8192 bind 8192)<br>TCP reno registered<br>UDP hash table ent=
ries: 128 (order: 0, 4096 bytes)<br>UDP-Lite hash table entries: 128 (order=
: 0, 4096 bytes)<br>NET: Registered protocol family 1<br>platform rtc_cmos:=
 registered platform RTC device (no PNP device found)<br>CE: Reprogramming =
failure. Giving up<br>audit: initializing netlink socket (disabled)<br>type=
=3D2000 audit(1317642681.533:1): initialized<br>HugeTLB registered 2 MB pag=
e size, pre-allocated 0 pages<br>VFS: Disk quotas dquot_6.5.2<br>Dquot-cach=
e hash table entries: 512 (order 0, 4096 bytes)<br>msgmni has been set to 2=
27<br>Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)<=
br>io scheduler noop registered<br>io scheduler deadline registered<br>io s=
cheduler cfq registered (default)<br>pci_hotplug: PCI Hot Plug PCI Core ver=
sion: 0.5<br>pciehp: PCI Express Hot Plug Controller Driver version:
 0.4<br>acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5<br>Serial=
: 8250/16550 driver, 4 ports, IRQ sharing enabled<br><br><br></div></body><=
/html>
--32398890-1237362963-1317668899=:43096--


--===============0353159099==
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

--===============0353159099==--


From xen-devel-bounces@lists.xensource.com Mon Oct 03 12:10:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 12:10:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAnuU-00036j-Fh; Mon, 03 Oct 2011 12:10:42 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAnsO-0002TC-Lm
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 12:08:33 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317668909!27677564!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19233 invoked from network); 3 Oct 2011 19:08:29 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Oct 2011 19:08:29 -0000
X-IronPort-AV: E=Sophos;i="4.68,481,1312156800"; 
   d="scan'208";a="8186372"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Oct 2011 19:08:29 +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; Mon, 3 Oct 2011
	20:08:29 +0100
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Thomas Gleixner <tglx@linutronix.de>
In-Reply-To: <alpine.LFD.2.02.1110032033530.1489@ionos>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Mon, 3 Oct 2011 20:08:28 +0100
Message-ID: <1317668908.11991.20.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	Wilk <konrad.wilk@oracle.com>, linux-kernel <linux-kernel@vger.kernel.org>,
	"Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>, Konrad
Subject: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-03 at 19:42 +0100, Thomas Gleixner wrote:
> On Mon, 3 Oct 2011, Ian Campbell wrote:
> > I can see a few options for how I might go about solving this in a
> > non-hacky way, which approach do you think would be preferable:
> 
> The question is whether you need to disable the IPI interrupt at
> all. If not, we have a flag for that.

We already that flag for these (I think that was why it was added even).
The issue is that in the resuming domain on the other side event
channels all start off masked and something needs to unmask them.

> >       * Add "IRQF_RESUME_EARLY", driven from syscore_resume, and use it
> >         for these interrupts.
> 
> That's the preferable solution, as we could use that for PPC as well,
> unless we can move stuff around, so we disable stuff later.

OK

> >       * register syscore ops for the Xen event channel subsystem to
> >         unmask the IPIs earlier (would probably look a lot like the code
> >         removed by 676dc3cf5bc3).
> 
> I'd like to avoid that.

Sure.

> >       * add syscore_ops to Xen smp subsystem to unmask the specific IPIs
> >         (which it binds at start of day) earlier.
> >       * push dpm_(suspend|resume)_noirq down into stop machine region
> 
> Where is stomp machine used?

It is used by the xen PV suspend handler which runs in that context in
order to quiesce non-boot CPUs (which Xen does not unplug like native
does).

> >       * use something other than stop_machine to quiesce system and move
> >         to cpu0 for suspend (doesn't seem sensible to reproduce that
> >         functionality).
> 
> We already shut down the nonboot cpus on suspend. We could do that
> _before_ we disable devices and the interrupts.

Xen PV suspend uses many of the PM/suspend core code paths but it does
not have the bit which shuts down non-boot CPUs.

It was a while ago but IIRC Xen used to unplug the secondary processors
and it was found to lead to larger latencies in the migration and
checkpointing cases (which at their core are a suspend/resume). The
disaster recovery folks in particular care about this latency since they
want to do rolling checkpoints many times a second.

Ian.

>  
> Raphael ?
> 
> Thanks,
> 
> 	tglx



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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 12:11:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 12:11:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAnvK-0003Tm-72; Mon, 03 Oct 2011 12:11:34 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAntd-0002pT-SB
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 12:09:50 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317668969!52337834!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20442 invoked from network); 3 Oct 2011 19:09:30 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-12.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 19:09:30 -0000
Received: from rtcsinet21.oracle.com (rtcsinet21.oracle.com [66.248.204.29])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93J9XnD008777
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 3 Oct 2011 19:09:35 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by rtcsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93J9VnL006950
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 19:09:32 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
	p93J9QTf029813; Mon, 3 Oct 2011 14:09:26 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 12:09:26 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 09C701EA; Mon,  3 Oct 2011 15:09:18 -0400 (EDT)
Date: Mon, 3 Oct 2011 15:09:17 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony Wright <anthony@overnetdata.com>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
Message-ID: <20111003190917.GF15608@phenom.oracle.com>
References: <4E85DB1A.5060606@overnetdata.com>
	<20111001120706.GZ12984@reaktio.net>
	<4E89BC80.4030105@overnetdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4E89BC80.4030105@overnetdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: rtcsinet21.oracle.com [66.248.204.29]
X-CT-RefId: str=0001.0A090202.4E8A086F.00A6,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 Mon, Oct 03, 2011 at 02:45:36PM +0100, Anthony Wright wrote:
> On 01/10/2011 13:07, Pasi K=E4rkk=E4inen wrote:
> > On Fri, Sep 30, 2011 at 04:07:06PM +0100, Anthony Wright wrote:
> >> I have a machine with 16GB of RAM running 32 bit xen 4.1.1 with Dom0
> >> running a 3.0.4 linux kernel and 23 paravirtualized DomUs.
> >>
> > Hey,
> >
> > Why 32bit Xen? I think all (most?) hypervisor testing happens with 64=
bit Xen.
> > Note that you can still have 32bit dom0 kernel with 64b hypervisor.
> I'm going to investigate 64 bit xen on a 32 bit Dom0 soon, but as to th=
e
> 32 xen, I work quite a lot with older hardware and Xen since it does
> paravirtualisation, and it's a really good way to re-use old hardware.
> >> As the free ram gets to 2391 MB free the system behaves as if it's g=
ot
> >> no more ram, and starts grabbing ram from Dom0, before getting even =
more
> >> confused and failing to start DomUs and eventually crashing the whol=
e
> >> machine. I have attached a tarball with the output of xl dmesg, xl i=
nfo
> >> & xl list at various points.
> >>
> > - Do you use dom0_mem=3D parameter for Xen?=20
> > - Did you disable dom0 ballooning?=20
> >
> > http://wiki.xen.org/xenwiki/XenBestPractices
> I was already using the dom0_mem=3D parameter on the xen hypervisor, bu=
t I
> disabled dom0 ballooning (enable-dom0-ballooning no), and just for good
> measure I also set (dom0-min-mem 2000). This had no effect, when I
> increase the 10-4 memory requirements, on restart the Dom0 memory is
> reduced to 1713MB and xl info reports 2391MB free.
> >> Stage 1
> >> Everything is fine, Dom0 has 2000MB according to xl list, and 'xl in=
fo'
> >> says there is 2405MB free.
> > - How much memory did dom0 initially have?=20
> > - Did you use mem=3D parameter for dom0 kernel (vmlinuz) ?
> >
> > See: http://wiki.xen.org/xenwiki/Linux_30_bugs
> dom0 starts with 2000MB.
> I didn't use mem=3D on the linux kernel - I thought it wasn't neccessar=
y.

It is if your kernel does not have these two patches:

    xen: use maximum reservation to limit amount of usable RAM
    xen/e820: if there is no dom0_mem=3D, don't tweak extra_pages.

.. oh and you also need to update the hypervisor to include:
"
    For dom0, this requires at patch to Xen ('x86: use 'dom0_mem' to limi=
t
    the number of pages for dom0') (c/s 23790)
"

Grrr.. Let me update the 3.0 bug-list

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 12:12:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 12:12:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAnwX-0003w1-55; Mon, 03 Oct 2011 12:12:49 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAnug-0003BT-9Y
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 12:10:54 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317669049!18905579!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27939 invoked from network); 3 Oct 2011 19:10:51 -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; 3 Oct 2011 19:10:51 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93JAboL019999
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 3 Oct 2011 19:10:39 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93J4mi4010745
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 19:04:49 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
	p93JATWC008247; Mon, 3 Oct 2011 14:10:29 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 12:10:29 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 03EB71EA; Mon,  3 Oct 2011 15:10:21 -0400 (EDT)
Date: Mon, 3 Oct 2011 15:10:20 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony Wright <anthony@overnetdata.com>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
Message-ID: <20111003191020.GG15608@phenom.oracle.com>
References: <4E85DB1A.5060606@overnetdata.com>
	<20111001120706.GZ12984@reaktio.net>
	<4E89BEBB.9060708@overnetdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4E89BEBB.9060708@overnetdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090205.4E8A08B0.0069,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 Mon, Oct 03, 2011 at 02:55:07PM +0100, Anthony Wright wrote:
> On 01/10/2011 13:07, Pasi K=E4rkk=E4inen wrote:
> > On Fri, Sep 30, 2011 at 04:07:06PM +0100, Anthony Wright wrote:
> >> Stage 1
> >> Everything is fine, Dom0 has 2000MB according to xl list, and 'xl in=
fo'
> >> says there is 2405MB free.
> >>
> > - How much memory did dom0 initially have?=20
> > - Did you use mem=3D parameter for dom0 kernel (vmlinuz) ?
> >
> > See: http://wiki.xen.org/xenwiki/Linux_30_bugs
> On thing I forgot to mention, is that if I hit or get close to this
> memory issue, one time in three/four on reboot the system hangs at the
> final reboot request into the kernel.

.. are there any guests still sitting around when that happens? If you
reboot the machine normally do you see the same issue? (and do you have
guests still running when you do this?).

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 12:27:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 12:27:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAoAU-0004WJ-3I; Mon, 03 Oct 2011 12:27:14 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAo9a-0004JY-24
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 12:26:18 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317669957!56507278!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7247 invoked from network); 3 Oct 2011 19:25:58 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 3 Oct 2011 19:25:58 -0000
Received: from rtcsinet22.oracle.com (rtcsinet22.oracle.com [66.248.204.30])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p93JOnKF003433
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 3 Oct 2011 19:24:50 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by rtcsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p93JOihP027207
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 3 Oct 2011 19:24:45 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
	p93JOYNM018052; Mon, 3 Oct 2011 14:24:34 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 03 Oct 2011 12:24:34 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id AF23F1EA; Mon,  3 Oct 2011 15:24:24 -0400 (EDT)
Date: Mon, 3 Oct 2011 15:24:24 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Subject: Re: [Xen-devel] [PATCH RFC V2 2/5] stop_machine: make stop_machine
	safe and efficient to call early
Message-ID: <20111003192424.GB30091@phenom.oracle.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<58bc7c7142fe54cd6c17f2f18f4b11fd2f597d5a.1317506051.git.jeremy.fitzhardinge@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <58bc7c7142fe54cd6c17f2f18f4b11fd2f597d5a.1317506051.git.jeremy.fitzhardinge@citrix.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: rtcsinet22.oracle.com [66.248.204.30]
X-CT-RefId: str=0001.0A090203.4E8A0C04.00DB,ss=1,re=0.000,fgs=0
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	Rusty Russell <rusty@rustcorp.com.au>,
	David Daney <david.daney@cavium.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tejun Heo <tj@kernel.org>, Ingo Molnar <mingo@elte.hu>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	"David S. Miller" <davem@davemloft.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 Sat, Oct 01, 2011 at 02:55:34PM -0700, Jeremy Fitzhardinge wrote:
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> 
> Make stop_machine() safe to call early in boot, before SMP has been
> set up, by simply calling the callback function directly if there's
> only one CPU online.
> 
> [ Fixes from AKPM:
>    - add comment
>    - local_irq_flags, not save_flags
>    - also call hard_irq_disable() for systems which need it
> 
>   Tejun suggested using an explicit flag rather than just looking at
>   the online cpu count. ]
> 
> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> Cc: Tejun Heo <tj@kernel.org>
> Cc: Rusty Russell <rusty@rustcorp.com.au>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: H. Peter Anvin <hpa@linux.intel.com>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Steven Rostedt <rostedt@goodmis.org>
> ---
>  kernel/stop_machine.c |   21 +++++++++++++++++++++
>  1 files changed, 21 insertions(+), 0 deletions(-)
> 
> diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c
> index ba5070c..9c59d9e 100644
> --- a/kernel/stop_machine.c
> +++ b/kernel/stop_machine.c
> @@ -41,6 +41,7 @@ struct cpu_stopper {
>  };
>  
>  static DEFINE_PER_CPU(struct cpu_stopper, cpu_stopper);
> +static bool stop_machine_initialized = false;

__read_mostly?

Thought it probably does not really matter that much in what section it
is put in.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 13:05:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 13:05:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAolF-0006Gu-PO; Mon, 03 Oct 2011 13:05:13 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RAogM-0005gF-QU
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 13:00:31 -0700
X-Env-Sender: rjw@sisk.pl
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317671992!56509734!1
X-Originating-IP: [217.79.144.158]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24203 invoked from network); 3 Oct 2011 19:59:52 -0000
Received: from ogre.sisk.pl (HELO ogre.sisk.pl) (217.79.144.158)
	by server-10.tower-21.messagelabs.com with SMTP;
	3 Oct 2011 19:59:52 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by ogre.sisk.pl (Postfix) with ESMTP id B97FC1B8DDB;
	Mon,  3 Oct 2011 21:05:58 +0200 (CEST)
Received: from ogre.sisk.pl ([127.0.0.1])
	by localhost (ogre.sisk.pl [127.0.0.1]) (amavisd-new,
	port 10024) with ESMTP
	id 27015-09; Mon,  3 Oct 2011 21:05:48 +0200 (CEST)
Received: from ferrari.rjw.lan (220-bem-13.acn.waw.pl [82.210.184.220])
	(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
	(No client certificate requested)
	by ogre.sisk.pl (Postfix) with ESMTP id D1A5D1B5BAB;
	Mon,  3 Oct 2011 21:05:48 +0200 (CEST)
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Thomas Gleixner <tglx@linutronix.de>
Date: Mon, 3 Oct 2011 22:02:24 +0200
User-Agent: KMail/1.13.6 (Linux/3.1.0-rc8+; KDE/4.6.0; x86_64; ; )
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
In-Reply-To: <alpine.LFD.2.02.1110032033530.1489@ionos>
MIME-Version: 1.0
Content-Type: Text/Plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Message-Id: <201110032202.24237.rjw@sisk.pl>
X-Virus-Scanned: amavisd-new at ogre.sisk.pl using MkS_Vir for Linux
Cc: xen-devel <xen-devel@lists.xensource.com>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Monday, October 03, 2011, Thomas Gleixner wrote:
> On Mon, 3 Oct 2011, Ian Campbell wrote:
> > I can see a few options for how I might go about solving this in a
> > non-hacky way, which approach do you think would be preferable:
> 
> The question is whether you need to disable the IPI interrupt at
> all. If not, we have a flag for that.
>  
> >       * Add "IRQF_RESUME_EARLY", driven from syscore_resume, and use it
> >         for these interrupts.
> 
> That's the preferable solution, as we could use that for PPC as well,
> unless we can move stuff around, so we disable stuff later. 
> 
> >       * register syscore ops for the Xen event channel subsystem to
> >         unmask the IPIs earlier (would probably look a lot like the code
> >         removed by 676dc3cf5bc3).
> 
> I'd like to avoid that.
> 
> >       * add syscore_ops to Xen smp subsystem to unmask the specific IPIs
> >         (which it binds at start of day) earlier.
> >       * push dpm_(suspend|resume)_noirq down into stop machine region
> 
> Where is stomp machine used?
> 
> >       * use something other than stop_machine to quiesce system and move
> >         to cpu0 for suspend (doesn't seem sensible to reproduce that
> >         functionality).
> 
> We already shut down the nonboot cpus on suspend. We could do that
> _before_ we disable devices and the interrupts.
>  
> Raphael ?

I'm afraid that wouldn't work.  At least right now our suspend sequence is
reasonably in line with what ACPI says.

Besides, we suspend devices in parallel now, so that would be going backwards
a bit.

Thanks,
Rafael

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 13:30:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 13:30:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAp9z-0007lT-Mw; Mon, 03 Oct 2011 13:30:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAp8N-0007Yk-K5
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 13:29:11 -0700
X-Env-Sender: tglx@linutronix.de
X-Msg-Ref: server-15.tower-27.messagelabs.com!1317673733!49364863!1
X-Originating-IP: [62.245.132.108]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3110 invoked from network); 3 Oct 2011 20:28:53 -0000
Received: from www.linutronix.de (HELO Galois.linutronix.de) (62.245.132.108)
	by server-15.tower-27.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Oct 2011 20:28:53 -0000
Received: from localhost ([127.0.0.1]) by Galois.linutronix.de with esmtps
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.72)
	(envelope-from <tglx@linutronix.de>)
	id 1RAp8G-0007Y3-1c; Mon, 03 Oct 2011 22:29:00 +0200
Date: Mon, 3 Oct 2011 22:28:59 +0200 (CEST)
From: Thomas Gleixner <tglx@linutronix.de>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
In-Reply-To: <201110032202.24237.rjw@sisk.pl>
Message-ID: <alpine.LFD.2.02.1110032228390.1489@ionos>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
	<201110032202.24237.rjw@sisk.pl>
User-Agent: Alpine 2.02 (LFD 1266 2009-07-14)
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-Linutronix-Spam-Score: -1.0
X-Linutronix-Spam-Level: -
X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,
	SHORTCIRCUIT=-0.0001
Cc: xen-devel <xen-devel@lists.xensource.com>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 3 Oct 2011, Rafael J. Wysocki wrote:
> On Monday, October 03, 2011, Thomas Gleixner wrote:
> > We already shut down the nonboot cpus on suspend. We could do that
> > _before_ we disable devices and the interrupts.
> >  
> > Raphael ?
> 
> I'm afraid that wouldn't work.  At least right now our suspend sequence is
> reasonably in line with what ACPI says.
> 
> Besides, we suspend devices in parallel now, so that would be going backwards
> a bit.

Fair enough.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 13:36:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 13:36:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RApFP-0008Q4-Mq; Mon, 03 Oct 2011 13:36:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RApEt-0008Cb-I6
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 13:35:52 -0700
X-Env-Sender: tglx@linutronix.de
X-Msg-Ref: server-6.tower-27.messagelabs.com!1317674126!51545836!1
X-Originating-IP: [62.245.132.108]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1401 invoked from network); 3 Oct 2011 20:35:26 -0000
Received: from www.linutronix.de (HELO Galois.linutronix.de) (62.245.132.108)
	by server-6.tower-27.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Oct 2011 20:35:26 -0000
Received: from localhost ([127.0.0.1]) by Galois.linutronix.de with esmtps
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.72)
	(envelope-from <tglx@linutronix.de>)
	id 1RApEo-0007Zl-80; Mon, 03 Oct 2011 22:35:46 +0200
Date: Mon, 3 Oct 2011 22:35:45 +0200 (CEST)
From: Thomas Gleixner <tglx@linutronix.de>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
In-Reply-To: <1317668908.11991.20.camel@dagon.hellion.org.uk>
Message-ID: <alpine.LFD.2.02.1110032229250.1489@ionos>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
	<1317668908.11991.20.camel@dagon.hellion.org.uk>
User-Agent: Alpine 2.02 (LFD 1266 2009-07-14)
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-Linutronix-Spam-Score: -1.0
X-Linutronix-Spam-Level: -
X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,
	SHORTCIRCUIT=-0.0001
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	xen-devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 3 Oct 2011, Ian Campbell wrote:
> On Mon, 2011-10-03 at 19:42 +0100, Thomas Gleixner wrote:
> > On Mon, 3 Oct 2011, Ian Campbell wrote:
> > > I can see a few options for how I might go about solving this in a
> > > non-hacky way, which approach do you think would be preferable:
> > 
> > The question is whether you need to disable the IPI interrupt at
> > all. If not, we have a flag for that.
> 
> We already that flag for these (I think that was why it was added even).
> The issue is that in the resuming domain on the other side event
> channels all start off masked and something needs to unmask them.

Bah.
 
> > >       * Add "IRQF_RESUME_EARLY", driven from syscore_resume, and use it
> > >         for these interrupts.
> > 
> > That's the preferable solution, as we could use that for PPC as well,
> > unless we can move stuff around, so we disable stuff later.
> 
> OK

I guess we should go down that road then.

Thanks,

	tglx

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 14:23:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 14:23:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RApz3-0001G1-Q3; Mon, 03 Oct 2011 14:23:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RApxX-00012G-IV
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 14:22:05 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1317676899!44997411!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30952 invoked from network); 3 Oct 2011 21:21:39 -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;
	3 Oct 2011 21:21:39 -0000
X-IronPort-AV: E=Sophos;i="4.68,481,1312156800"; 
   d="scan'208";a="8187395"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Oct 2011 21:21: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; Mon, 3 Oct 2011 22:21:56 +0100
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 1RApxT-0008QF-Vz;
	Mon, 03 Oct 2011 21:21:56 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RApxT-0005lz-L7;
	Mon, 03 Oct 2011 22:21:55 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9184-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 3 Oct 2011 22:21:55 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9184: 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 9184 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9184/

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           5 xen-boot                  fail blocked in 8874
 test-amd64-i386-xl-multivcpu 15 guest-stop                   fail   never pass
 test-amd64-amd64-xl-pcipt-intel  8 debian-fixup                fail never pass
 test-amd64-i386-xl           15 guest-stop                   fail   never pass
 test-amd64-i386-xl-credit2    5 xen-boot                  fail blocked in 8874
 test-i386-i386-xl            15 guest-stop                   fail   never pass
 test-amd64-amd64-xl-sedf     15 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-i386-rhel6hvm-amd  7 redhat-install               fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             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-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

version targeted for testing:
 xen                  7707a2bf2a93
baseline version:
 xen                  487d9e650584

------------------------------------------------------------
People who touched revisions under test:
  Andreas Herrmann <herrmann.der.user@googlemail.com>
  Ian Campbell <ian.campbell@citrix.com>
  Igor Mammedov <imammedo@redhat.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Thomas Renninger <trenn@suse.de>
------------------------------------------------------------

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=7707a2bf2a93
+ . 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 7707a2bf2a93
+ branch=xen-4.0-testing
+ revision=7707a2bf2a93
+ . 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 7707a2bf2a93 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 5 changesets with 5 changes to 5 files

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 15:04:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 15:04:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAqd7-00037a-2k; Mon, 03 Oct 2011 15:04:57 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAqXs-0002QB-B7
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 14:59:50 -0700
X-Env-Sender: james.harper@bendigoit.com.au
X-Msg-Ref: server-11.tower-182.messagelabs.com!1317679165!18936570!1
X-Originating-IP: [203.16.207.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25577 invoked from network); 3 Oct 2011 21:59:28 -0000
Received: from mail.bendigoit.com.au (HELO smtp2.bendigoit.com.au)
	(203.16.207.99)
	by server-11.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	3 Oct 2011 21:59:28 -0000
Received: from trantor.int.sbss.com.au ([192.168.200.206]
	helo=mail.bendigoit.com.au)
	by smtp2.bendigoit.com.au with esmtp (Exim 4.72)
	(envelope-from <james.harper@bendigoit.com.au>)
	id 1RAqXg-0003Fl-UZ; Tue, 04 Oct 2011 08:59:20 +1100
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
X-MimeOLE: Produced By Microsoft Exchange V6.5
Subject: RE: [Xen-devel] bug in vlan offload in dom0 3.0.0 kernel?
Date: Tue, 4 Oct 2011 08:59:19 +1100
Message-ID: <AEC6C66638C05B468B556EA548C1A77D01E5E31E@trantor>
In-Reply-To: <20111003160825.GB17108@phenom.oracle.com>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: [Xen-devel] bug in vlan offload in dom0 3.0.0 kernel?
Thread-Index: AcyB5szgPEnUjqAdQr+6JmGr+RofMgAL/W9Q
References: <AEC6C66638C05B468B556EA548C1A77D01E5E231@trantor>
	<20111003160825.GB17108@phenom.oracle.com>
From: "James Harper" <james.harper@bendigoit.com.au>
To: "Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>
X-Really-From-Bendigo-IT: magichashvalue
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, Sep 29, 2011 at 10:33:44AM +1000, James Harper wrote:
> > I've just upgraded some dom0's to 3.0.0 (debian kernel) and now my
>=20
> From?

>From 2.6.32 pvops

> > Has anyone else seen this problem? And more importantly, might
vswitch
> > solve some of the above problems?
>=20
> So.. just since that is probably the first thing you should have
checked for,
> but did your turn checksumming off?
>=20

Yes, even with all offloads turned off this is still broken. Google
tells me that I'm not the only one having this problem and it sounds
like it's the igb driver that is broken wrt the new vlan offload code.
It was a known bug around 2.6.37 and just hasn't been fixed yet.

I've worked around the problem by using openvswitch which works because
it doesn't use vlan offload it handles the trunking internally. I had to
increase the MTU on the eth0 interface to 1504 and had to write a brctl
compatibility script (the 'brctl compatibility layer' in openvswitch
doesn't show internal bridges correctly in the output of show) but other
than that it is now working mostly fine.

The only problem is that the tapN interfaces get added to the bridge on
DomU startup but don't get removed from the database on shutdown. The
reason they don't get removed is that because the PCI device is
unplugged when the PV drivers take over, the shutdown code isn't fired
for that interface. Under brctl it didn't matter because the kernel
handled removing an interface when it went away. That's only cosmetic
though.

James

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 15:41:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 15:41:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RArC2-0004ZV-F3; Mon, 03 Oct 2011 15:41:02 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RArBF-0004Nj-Tq
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 15:40:14 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317681610!18918766!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10304 invoked from network); 3 Oct 2011 22:40:10 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Oct 2011 22:40:10 -0000
X-IronPort-AV: E=Sophos;i="4.68,481,1312156800"; 
   d="scan'208";a="8187822"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	03 Oct 2011 22:40: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, 3 Oct 2011 23:40:09 +0100
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 1RArBB-0000QD-Bl;
	Mon, 03 Oct 2011 22:40:09 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RArBB-0002pG-B5;
	Mon, 03 Oct 2011 23:40:09 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9185-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 3 Oct 2011 23:40:09 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9185: 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 9185 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9185/

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-i386-xl-win-vcpus1 13 guest-stop                   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-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                  d7e0e9f37874
baseline version:
 xen                  5c395e993fe4

------------------------------------------------------------
People who touched revisions under test:
  Andreas Herrmann <herrmann.der.user@googlemail.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Igor Mammedov <imammedo@redhat.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Marek Marczykowski <marmarek@mimuw.edu.pl>
  Thomas Renninger <trenn@suse.de>
------------------------------------------------------------

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=d7e0e9f37874
+ . 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 d7e0e9f37874
+ branch=xen-4.1-testing
+ revision=d7e0e9f37874
+ . 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 d7e0e9f37874 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 4 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 Mon Oct 03 16:45:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 16:45:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAsCS-0006CF-Gv; Mon, 03 Oct 2011 16:45:32 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RAsBK-0005zT-2b
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 16:44:22 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-6.tower-27.messagelabs.com!1317685320!51555553!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11763 invoked from network); 3 Oct 2011 23:42:02 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-6.tower-27.messagelabs.com with SMTP;
	3 Oct 2011 23:42:02 -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 0E4C492E2;
	Mon,  3 Oct 2011 16:36:39 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id EB7E7207E0;
	Mon,  3 Oct 2011 09:27:56 -0700 (PDT)
Message-ID: <4E89E28C.7010700@goop.org>
Date: Mon, 03 Oct 2011 09:27:56 -0700
From: Jeremy Fitzhardinge <jeremy@goop.org>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Jason Baron <jbaron@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com>
In-Reply-To: <20111003150205.GB2462@redhat.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>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/03/2011 08:02 AM, Jason Baron wrote:
> Hi,
>
> (Sorry for the late reply - I was away for a few days).
>
> The early enable is really nice - it means there are not restrictions on
> when jump_label_inc()/dec() can be called which is nice.
>
> comments below.
>
>
> On Sat, Oct 01, 2011 at 02:55:35PM -0700, Jeremy Fitzhardinge wrote:
>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>
>> If a key has been enabled before jump_label_init() is called, don't
>> nop it out.
>>
>> This removes arch_jump_label_text_poke_early() (which can only nop
>> out a site) and uses arch_jump_label_transform() instead.
>>
>> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>> ---
>>  include/linux/jump_label.h |    3 ++-
>>  kernel/jump_label.c        |   20 ++++++++------------
>>  2 files changed, 10 insertions(+), 13 deletions(-)
>>
>> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
>> index 1213e9d..c8fb1b3 100644
>> --- a/include/linux/jump_label.h
>> +++ b/include/linux/jump_label.h
>> @@ -45,7 +45,8 @@ extern void jump_label_lock(void);
>>  extern void jump_label_unlock(void);
>>  extern void arch_jump_label_transform(struct jump_entry *entry,
>>  				 enum jump_label_type type);
>> -extern void arch_jump_label_text_poke_early(jump_label_t addr);
>> +extern void arch_jump_label_transform_early(struct jump_entry *entry,
>> +				 enum jump_label_type type);
>>  extern int jump_label_text_reserved(void *start, void *end);
>>  extern void jump_label_inc(struct jump_label_key *key);
>>  extern void jump_label_dec(struct jump_label_key *key);
>> diff --git a/kernel/jump_label.c b/kernel/jump_label.c
>> index a8ce450..059202d5 100644
>> --- a/kernel/jump_label.c
>> +++ b/kernel/jump_label.c
>> @@ -121,13 +121,6 @@ static void __jump_label_update(struct jump_label_key *key,
>>  	}
>>  }
>>  
>> -/*
>> - * Not all archs need this.
>> - */
>> -void __weak arch_jump_label_text_poke_early(jump_label_t addr)
>> -{
>> -}
>> -
>>  static __init int jump_label_init(void)
>>  {
>>  	struct jump_entry *iter_start = __start___jump_table;
>> @@ -139,12 +132,15 @@ static __init int jump_label_init(void)
>>  	jump_label_sort_entries(iter_start, iter_stop);
>>  
>>  	for (iter = iter_start; iter < iter_stop; iter++) {
>> -		arch_jump_label_text_poke_early(iter->code);
>> -		if (iter->key == (jump_label_t)(unsigned long)key)
>> +		struct jump_label_key *iterk;
>> +
>> +		iterk = (struct jump_label_key *)(unsigned long)iter->key;
>> +		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
>> +					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
> The only reason I called this at boot-time was that the 'ideal' x86
> no-op isn't known until boot time. Thus, in the enabled case we could
> skip the the arch_jump_label_transform() call. ie:
>
> if (!enabled)
> 	arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);


Yep, fair enough.

>
>
>> +		if (iterk == key)
>>  			continue;
>>  
>> -		key = (struct jump_label_key *)(unsigned long)iter->key;
>> -		atomic_set(&key->enabled, 0);
>> +		key = iterk;
>>  		key->entries = iter;
>>  #ifdef CONFIG_MODULES
>>  		key->next = NULL;
>> @@ -212,7 +208,7 @@ void jump_label_apply_nops(struct module *mod)
>>  		return;
>>  
>>  	for (iter = iter_start; iter < iter_stop; iter++)
>> -		arch_jump_label_text_poke_early(iter->code);
>> +		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
>>  }
>>  
>>  static int jump_label_add_module(struct module *mod)
>> -- 
>> 1.7.6.2
>>
> hmmm...this is used on module load in smp - so this would introduce a number of
> calls to stop_machine() where we didn't have them before. Yes, module
> load is a very slow path to begin with, but I think its at least worth
> pointing out...

Ah, that explains it - the module stuff certainly isn't "early" except -
I guess - in the module's lifetime.

Well, I suppose I could introduce either second variant of the function,
or add a "live" flag (ie, may be updating code that a processor is
executing), which requires a stop_machine, or direct update if it doesn't.

But is there any reason why we couldn't just generate a reasonably
efficient 5-byte atomic nop in the first place, and get rid of all that
fooling around?  It looks like x86 is the only arch where it makes any
difference at all, and how much difference does it really make?  Or is
there no one 5-byte atomic nop that works on all x86 variants, aside
from jmp +0?

    J

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

From xen-devel-bounces@lists.xensource.com Mon Oct 03 21:00:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 21:00:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAwAs-0003Uy-Fx; Mon, 03 Oct 2011 21:00:10 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAw9x-0003IQ-Fr
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 20:59:13 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1317700737!42623559!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23548 invoked from network); 4 Oct 2011 03:58:57 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 03:58:57 -0000
X-IronPort-AV: E=Sophos;i="4.68,483,1312156800"; 
   d="scan'208";a="8188711"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 03:59: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, 4 Oct 2011 04:59:10 +0100
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 1RAw9u-0002EM-2t;
	Tue, 04 Oct 2011 03:59:10 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RAw9t-0005EV-U0;
	Tue, 04 Oct 2011 04:59:09 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9186-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 4 Oct 2011 04:59:09 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9186: 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 9186 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9186/

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                  3d1664cc9e45
baseline version:
 xen                  3d1664cc9e45

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


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 Oct 03 23:48:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 03 Oct 2011 23:48:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAynV-0006u6-MA; Mon, 03 Oct 2011 23:48:13 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAymK-0006h1-LB
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 23:47:02 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317710794!38323096!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20380 invoked from network); 4 Oct 2011 06:46:35 -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; 4 Oct 2011 06:46:35 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 07:46:57 +0100
Message-Id: <4E8AC7FD02000078000591A9@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 07:46:53 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Adin Scannell" <adin@gridcentric.com>
Subject: Re: [Xen-devel] [PATCH] build fixes for cross-compiling
References: <CAAJKtqre0Q3qbngZi01NfmSQSh0YXtSyS4LZc=cOQt98Xqzcyw@mail.gmail.com>
	<4E843DBD020000780005865C@nat28.tlf.novell.com>
	<CAAJKtqpFAtrBMHS7+bUAA_WY5GC28a0Ttd8=zpBWR6=BPp1_=A@mail.gmail.com>
In-Reply-To: <CAAJKtqpFAtrBMHS7+bUAA_WY5GC28a0Ttd8=zpBWR6=BPp1_=A@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 30.09.11 at 23:14, Adin Scannell <adin@gridcentric.com> wrote:
>>  Are you saying this actually works for you (building everything, not =
just
>> the tools)?
>=20
> To build everything, I need to tweak a couple of extra bits (in the
> attached patch).  I'm somewhat wary about statements regarding
> anything build-related, because I know everyone has a different
> approach and it runs in a different environment. With the both first
> patch and the attached, everything builds for me for both
> XEN_TARGET_ARCH=3Dx86_32 and x86_64 in my 64-bit environment.
>=20
>> I do cross builds too, but generally the other way around (64-bit
>> build on 32-bit host), and hence need to only cross-build the
>> hypervisor to put underneath everything.
>>
>> I can't seem to find an ld (native or cross) that would accept -m32,
>> -march=3Di686, ...
>=20
> I think I had the same thing happen to me that happened to Ian (-m32
> -melf_x86_64 ... so no errors).

Yeah, I realize that. But I'd nevertheless suggest not passing otherwise
invalid options to any build tool, as them being ignored is likely more a
bug than a feature (and ought to be considered subject to change at
any time).

> If the LDFLAGS / LDFLAGS_INDIRECT stuff is messy, my previous approach
> has been to add $(CFLAGS) to all the link steps in the tools (i.e.
> lib*, xl, etc.) so that the approach architecture flags would be
> passed to gcc for linking.  I don't mind going through and doing that

Passing CFLAGS to the linking stage is as wrong as passing LDFLAGS
to the compiler for the linking step. But it was apparently agreed to
elsewhere in this thread to get this properly separated and cleaned
up anyway.

> until everything builds smoothly for 32-bit target on 64-bit, provided
> that's a friendly solution. It would be great to be able to stop using
> a set of build patches at the bottom of my queue. :)

I understand that (I have some build environment related changes at
the end of my patch set too) - as long as the changes are not
dependent upon something that is entirely specific to your env (some
of mine are), proposing them for general inclusion is certainly
reasonable. Some of what's in the patch you had attached last even
seemed more like a bug fix than a build one to me (though the tools
aren't my realm)...

Jan


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 00:34:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 00:34:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RAzVt-00088R-T0; Tue, 04 Oct 2011 00:34:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAzUo-0007vF-6A
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 00:32:59 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317713573!27730447!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18324 invoked from network); 4 Oct 2011 07:32:55 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 07:32:55 -0000
Received: by yxt3 with SMTP id 3so302478yxt.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 00:32:53 -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=KbWhUWUJGiUzR6Mj4s1MFdrAjB2oXTW7RJUWYn1pwaI=;
	b=xrioSW02VQVKcu7RSh3Ujpublzv3IL6DmsVI9bqhcWdwxfPGRPH2up9HgjGyV9d/A8
	WnQ4XZQrkyjfYp8OVSs6V61Zwx4SyheQzOT0yO9zTzBbPRPorOJ/fB6VGJ3z9VowoFgS
	iT5dnA+X9ogStwmtcNr181N/RofiOkYhjsqDI=
MIME-Version: 1.0
Received: by 10.68.12.162 with SMTP id z2mr7270366pbb.122.1317713573410; Tue,
	04 Oct 2011 00:32:53 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Tue, 4 Oct 2011 00:32:53 -0700 (PDT)
In-Reply-To: <patchbomb.1317389593@localhost.localdomain>
References: <patchbomb.1317389593@localhost.localdomain>
Date: Tue, 4 Oct 2011 09:32:53 +0200
X-Google-Sender-Auth: Yd-HqeSa34vY9bQi4L8HXr6cVFU
Message-ID: <CAPLaKK7qFpZcrjWdNESwotc70KVVvNpC1SOoSqc9esFKJoM3=Q@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 00 of 23] libxl: rationalise libxl_device_*
	APIs
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: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>,
	Jim Fehlig <jfehlig@novell.com>, xen-devel@lists.xensource.com,
	Mike McClurg <mike.mcclurg@citrix.com>,
	Dave Scott <Dave.Scott@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 hope this patches will be applied to unstable soon, so I can rewrite
the NetBSD file disk backend with the new features introduced in the
series.

Great work, regards Roger.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:13:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:13:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB088-0001Z2-Sn; Tue, 04 Oct 2011 01:13:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB07X-0001Mi-Kw
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 01:13:00 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1317715959!45048907!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24107 invoked from network); 4 Oct 2011 08:12:39 -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;
	4 Oct 2011 08:12:39 -0000
X-IronPort-AV: E=Sophos;i="4.68,483,1312156800"; 
   d="scan'208";a="8192234"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 08:12: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; Tue, 4 Oct 2011
	09:12:56 +0100
Subject: Re: [Xen-devel] [PATCH 00 of 23] libxl: rationalise libxl_device_*
	APIs
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Tue, 4 Oct 2011 09:12:55 +0100
In-Reply-To: <CAPLaKK7qFpZcrjWdNESwotc70KVVvNpC1SOoSqc9esFKJoM3=Q@mail.gmail.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<CAPLaKK7qFpZcrjWdNESwotc70KVVvNpC1SOoSqc9esFKJoM3=Q@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317715976.21903.73.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>, Jim
	Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Mike McClurg <mike.mcclurg@citrix.com>, Dave
	Scott <Dave.Scott@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-10-04 at 08:32 +0100, Roger Pau MonnÃ© wrote:
> I hope this patches will be applied to unstable soon, so I can rewrite
> the NetBSD file disk backend with the new features introduced in the
> series.

What I tend to do in these cases is to import the other persons series
into the head of my own patch queue (using the mq extension) and switch
it out as new revisions are posted etc.

Ian.

> 
> Great work, regards Roger.



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:24:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:24:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0IQ-00025E-FM; Tue, 04 Oct 2011 01:24:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB0Hb-0001sp-Cd
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 01:23:23 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1317716600!19595780!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19714 invoked from network); 4 Oct 2011 08:23:20 -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;
	4 Oct 2011 08:23:20 -0000
X-IronPort-AV: E=Sophos;i="4.68,484,1312156800"; 
   d="scan'208";a="8192470"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 08:23:20 +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, 4 Oct 2011
	09:23:19 +0100
Subject: Re: [Xen-devel] [PATCH 14 of 24] libxl: add pid path to
	libxl__spawner_starting
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Olaf Hering <olaf@aepfle.de>
Date: Tue, 4 Oct 2011 09:23:19 +0100
In-Reply-To: <219ab93f22c049259568.1317657291@probook.site>
References: <patchbomb.1317657277@probook.site>
	<219ab93f22c049259568.1317657291@probook.site>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317716599.21903.76.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-10-03 at 16:54 +0100, Olaf Hering wrote:
> # HG changeset patch
> # User Olaf Hering <olaf@aepfle.de>
> # Date 1317653612 -7200
> # Node ID 219ab93f22c0492595686a1cc34911e9d6775b07
> # Parent  df7be429654c62fb4c61f83549374d77b80ebea3
> libxl: add pid path to libxl__spawner_starting
> 
> libxl_spawner_record_pid() should be able to write the pid to arbitrary paths.
> 
> Signed-off-by: Olaf Hering <olaf@aepfle.de>
> 
> diff -r df7be429654c -r 219ab93f22c0 tools/libxl/libxl_dm.c
> --- a/tools/libxl/libxl_dm.c
> +++ b/tools/libxl/libxl_dm.c
> @@ -848,6 +848,7 @@ int libxl__create_device_model(libxl__gc
>  
>      p->domid = info->domid;
>      p->dom_path = libxl__xs_get_dompath(gc, info->domid);
> +    p->pid_path = "image/device-model-pid";
>      if (!p->dom_path) {
>          rc = ERROR_FAIL;
>          goto out_close;
> diff -r df7be429654c -r 219ab93f22c0 tools/libxl/libxl_exec.c
> --- a/tools/libxl/libxl_exec.c
> +++ b/tools/libxl/libxl_exec.c
> @@ -151,7 +151,7 @@ void libxl_spawner_record_pid(void *for_
>      char *path = NULL, *pid = NULL;
>      int len;
>  
> -    if (asprintf(&path, "%s/%s", starting->dom_path, "image/device-model-pid") < 0)
> +    if (asprintf(&path, "%s/%s", starting->dom_path, starting->pid_path) < 0)
>          goto out;
>  
>      len = asprintf(&pid, "%d", innerchild);
> diff -r df7be429654c -r 219ab93f22c0 tools/libxl/libxl_internal.h
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -250,6 +250,7 @@ typedef struct {
>  
>  typedef struct {
>      char *dom_path; /* from libxl_malloc, only for libxl_spawner_record_pid */
> +    char *pid_path; /* from libxl_malloc, only for libxl_spawner_record_pid */

Either this new comment is true and you need a strdup() up above where
you set it and a free() somewhere else (or use libxl__strdup()) or it is
false and it should be removed and pid_path should be const char *.

I think the second option is sufficient for the current and new user you
are about to add?

Ian.

>      int domid;
>      libxl__spawn_starting *for_spawn;
>  } libxl__spawner_starting;
> 
> _______________________________________________
> 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 Oct 04 01:26:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:26:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0L3-0002T1-7J; Tue, 04 Oct 2011 01:26:57 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1R9JyW-0005cR-At
	for Xen-devel@lists.xensource.com; Thu, 29 Sep 2011 10:01:26 -0700
X-Env-Sender: lbassel@codeaurora.org
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317315622!51862347!1
X-Originating-IP: [199.106.114.254]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25831 invoked from network); 29 Sep 2011 17:00:23 -0000
Received: from wolverine01.qualcomm.com (HELO wolverine01.qualcomm.com)
	(199.106.114.254)
	by server-12.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 29 Sep 2011 17:00:23 -0000
X-IronPort-AV: E=McAfee;i="5400,1158,6483"; a="123496390"
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;
	29 Sep 2011 10:00:22 -0700
Received: from labbmf-linux.qualcomm.com (pdmz-snip-v218.qualcomm.com
	[192.168.218.1])
	by mostmsg01.qualcomm.com (Postfix) with ESMTPA id BAB5610004BE;
	Thu, 29 Sep 2011 10:00:22 -0700 (PDT)
Date: Thu, 29 Sep 2011 10:00:21 -0700
From: Larry Bassel <lbassel@codeaurora.org>
To: Dan Magenheimer <dan.magenheimer@oracle.com>
Subject: Re: [Xen-devel] Re: RFC -- new zone type
Message-ID: <20110929170021.GB7007@labbmf-linux.qualcomm.com>
References: <20110928180909.GA7007@labbmf-linux.qualcomm.comCAOFJiu1_HaboUMqtjowA2xKNmGviDE55GUV4OD1vN2hXUf4-kQ@mail.gmail.com>
	<c2d9add1-0095-4319-8936-db1b156559bf@default>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <c2d9add1-0095-4319-8936-db1b156559bf@default>
User-Agent: Mutt/1.5.20 (2009-06-14)
X-Mailman-Approved-At: Tue, 04 Oct 2011 01:26:20 -0700
Cc: Larry Bassel <lbassel@codeaurora.org>, linux-mm@kvack.org,
	vgandhi@codeaurora.org, Sameer Pramod Niphadkar <spniphadkar@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 29 Sep 11 09:38, Dan Magenheimer wrote:
> > From: Sameer Pramod Niphadkar [mailto:spniphadkar@gmail.com]
> > Sent: Thursday, September 29, 2011 12:08 AM
> > To: Larry Bassel
> > Cc: linux-mm@kvack.org; vgandhi@codeaurora.org; Xen-devel@lists.xensource.com
> > Subject: [Xen-devel] Re: RFC -- new zone type
> > 
> > On Wed, Sep 28, 2011 at 11:39 PM, Larry Bassel <lbassel@codeaurora.org> wrote:
> > > We need to create a large (~100M) contiguous physical memory region
> > > which will only be needed occasionally. As this region will
> > > use up 10-20% of all of the available memory, we do not want
> > > to pre-reserve it at boot time. Instead, we want to create
> > > this memory region "on the fly" when asked to by userspace,
> > > and do it as quickly as possible, and return it to
> > > system use when not needed.
> > >
> > > AFAIK, this sort of operation is currently done using memory
> > > compaction (as CMA does for instance).
> > > Alternatively, this memory region (if it is in a fixed place)
> > > could be created using "logical memory hotremove" and returned
> > > to the system using "logical memory hotplug". In either case,
> > > the contiguous physical memory would be created via migrating
> > > pages from the "movable zone".
> > >
> > > The problem with this approach is that the copying of up to 25000
> > > pages may take considerable time (as well as finding destinations
> > > for all of the pages if free memory is scarce -- this may
> > > even fail, causing the memory region not to be created).
> > >
> > > It was suggested to me that a new zone type which would be similar
> > > to the "movable zone" but is only allowed to contain pages
> > > that can be discarded (such as text) could solve this problem,
> > > so that there is no copying or finding destination pages needed (thus
> > > considerably reducing latency).
> 
> If I read the above correctly, you are talking about indeed
> pre-reserving your ~100MB contiguous chunk of memory but using
> it for "discardable" pages only, then discarding all of those
> pages when you need the memory region, then going back to using
> the contiguous chunk for discardable pages, and so on.

Yes, that is exactly what we want to do.

> 
> You may be interested in the concept of "ephemeral pages"
> introduced by transcendent memory ("tmem") and the cleancache
> patchset which went upstream at 3.0.  If you write a driver
> (called a "backend" in tmem language) that accepts pages
> from cleancache, you would be able to use your 100MB contiguous
> chunk of memory for clean pagecache pages when it is not needed
> for your other purposes, easily discard all the pages when
> you do need the space, then start using it for clean pagecache
> pages again when you don't need it for your purposes anymore
> (and repeat this cycle as many times as necessary).
> 
> You maybe could call your driver "cleanzone".
> 
> Zcache (also upstream in drivers/staging) does something like
> this already, though you might not want/need to use compression
> in your driver.  In zcache, space reclaim is driven by the kernel
> "shrinker" code that runs when memory is low, but another trigger
> could easily be used.  Also there is likely a lot of code in
> zcache (e.g. tmem.c) that you could leverage.
> 
> For more info, see: 
> http://lwn.net/Articles/454795/
> http://oss.oracle.com/projects/tmem 

Thanks very much, I'll look into these.

> 
> I'd be happy to answer any questions if you are still interested
> after you have read the above documentation.
> 
> Thanks,
> Dan

Larry
> 

-- 
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 Tue Oct 04 01:27:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:27:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0Lz-0002pY-Qv; Tue, 04 Oct 2011 01:27:56 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1R9X6V-0007pA-9V
	for xen-devel@lists.xensource.com; Fri, 30 Sep 2011 00:02:21 -0700
X-Env-Sender: thellstrom@vmware.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1317366105!17981424!1
X-Originating-IP: [65.115.85.69]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21014 invoked from network); 30 Sep 2011 07:01:46 -0000
Received: from smtp-outbound-1.vmware.com (HELO smtp-outbound-1.vmware.com)
	(65.115.85.69) by server-5.tower-216.messagelabs.com with SMTP;
	30 Sep 2011 07:01:46 -0000
Received: from mailhost3.vmware.com (mailhost3.vmware.com [10.16.27.45])
	by smtp-outbound-1.vmware.com (Postfix) with ESMTP id 532131E008;
	Fri, 30 Sep 2011 00:01:45 -0700 (PDT)
Received: from linlap1.home.shipmail.org (unknown [10.23.99.2])
	by mailhost3.vmware.com (Postfix) with ESMTP id 270FFCD96C;
	Fri, 30 Sep 2011 00:01:41 -0700 (PDT)
Message-ID: <4E8568E8.1070800@vmware.com>
Date: Fri, 30 Sep 2011 08:59:52 +0200
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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <1317328432-25620-1-git-send-email-konrad.wilk@oracle.com>
In-Reply-To: <1317328432-25620-1-git-send-email-konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Tue, 04 Oct 2011 01:26:20 -0700
Cc: xen-devel@lists.xensource.com, thomas@shipmail.org, airlied@linux.ie,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	j.glisse@redhat.com, alexdeucher@gmail.com, airlied@redhat.com,
	bskeggs@redhat.com
Subject: [Xen-devel] Re: [PATCH] TTM DMA pool v1.8
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

I'm really sorry for taking so long to review this.

I'd like to go through a couple of high-level things first before 
reviewing the coding itself.

The page_alloc_func structure looks nice, but I'd like to have it per 
ttm backend,
we would just need to make sure that the backend is alive when we alloc 
/ free pages.
The reason for this is that there may be backends that want to allocate 
dma memory running simultaneously with those who don't. When the backend 
fires up, it can determine whether to use DMA memory or not.

This also eliminates the need for patch 3/9. and is in line with patch 8/9.

2) Memory accounting: If the number DMA pages are limited in a way that 
the ttm memory global routines are not aware of. How do we handle memory 
accounting? (How do we avoid exhausting IOMMU space)?

3) Page swapping. Currently we just copy pages to shmem pages and then 
free device pages. In the future we'd probably like to insert non-dma 
pages directly into the swap cache. Is it possible to differentiate dma 
pages from pages that are directly insertable?

Thanks
Thomas



On 09/29/2011 10:33 PM, 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:
>
>   git://oss.oracle.com/git/kwilk/xen.git devel/ttm.dma_pool.v1.8
>
>   drivers/gpu/drm/nouveau/nouveau_mem.c    |    8 +-
>   drivers/gpu/drm/nouveau/nouveau_sgdma.c  |    3 +-
>   drivers/gpu/drm/radeon/radeon_device.c   |    6 +
>   drivers/gpu/drm/radeon/radeon_gart.c     |    4 +-
>   drivers/gpu/drm/radeon/radeon_ttm.c      |    3 +-
>   drivers/gpu/drm/ttm/Makefile             |    3 +
>   drivers/gpu/drm/ttm/ttm_bo.c             |    4 +-
>   drivers/gpu/drm/ttm/ttm_memory.c         |    5 +
>   drivers/gpu/drm/ttm/ttm_page_alloc.c     |   63 ++-
>   drivers/gpu/drm/ttm/ttm_page_alloc_dma.c | 1317 ++++++++++++++++++++++++++++++
>   drivers/gpu/drm/ttm/ttm_tt.c             |    5 +-
>   drivers/gpu/drm/vmwgfx/vmwgfx_drv.c      |    4 +-
>   drivers/xen/swiotlb-xen.c                |    2 +-
>   include/drm/ttm/ttm_bo_driver.h          |    7 +-
>   include/drm/ttm/ttm_page_alloc.h         |  100 +++-
>   include/linux/swiotlb.h                  |    7 +-
>   lib/swiotlb.c                            |    5 +-
>   17 files changed, 1516 insertions(+), 30 deletions(-)
>    


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:28:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:28:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0Mo-0003D4-Kq; Tue, 04 Oct 2011 01:28:46 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1R9ePc-0005dA-Az
	for xen-devel@lists.xensource.com; Fri, 30 Sep 2011 07:50:04 -0700
X-Env-Sender: jang@linux.vnet.ibm.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1317394200!33409515!1
X-Originating-IP: [194.196.100.167]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22923 invoked from network); 30 Sep 2011 14:50:01 -0000
Received: from mtagate7.uk.ibm.com (HELO mtagate7.uk.ibm.com) (194.196.100.167)
	by server-13.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 30 Sep 2011 14:50:01 -0000
Received: from d06nrmr1806.portsmouth.uk.ibm.com
	(d06nrmr1806.portsmouth.uk.ibm.com [9.149.39.193])
	by mtagate7.uk.ibm.com (8.13.1/8.13.1) with ESMTP id p8UEnxOJ030942
	for <xen-devel@lists.xensource.com>; Fri, 30 Sep 2011 14:49:59 GMT
Received: from d06av08.portsmouth.uk.ibm.com (d06av08.portsmouth.uk.ibm.com
	[9.149.37.249])
	by d06nrmr1806.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with
	ESMTP id p8UEnxtE2265222
	for <xen-devel@lists.xensource.com>; Fri, 30 Sep 2011 15:49:59 +0100
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 p8UEnvOw010667
	for <xen-devel@lists.xensource.com>; Fri, 30 Sep 2011 15:49:59 +0100
Received: from [9.164.185.11] (ICON-9-164-185-11.megacenter.de.ibm.com
	[9.164.185.11])
	by d06av08.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with
	ESMTP id p8UEnuH0010643; Fri, 30 Sep 2011 15:49:56 +0100
From: Jan Glauber <jang@linux.vnet.ibm.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
In-Reply-To: <b1d87557dc3001031ee8d7f69ee97b90cecba6aa.1317338254.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317338254.git.jeremy.fitzhardinge@citrix.com>
	<b1d87557dc3001031ee8d7f69ee97b90cecba6aa.1317338254.git.jeremy.fitzhardinge@citrix.com>
Content-Type: text/plain; charset="UTF-8"
Date: Fri, 30 Sep 2011 16:48:19 +0200
Message-Id: <1317394099.11297.54.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.24.5 
Content-Transfer-Encoding: 8bit
X-Mailman-Approved-At: Tue, 04 Oct 2011 01:26:20 -0700
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	David Daney <david.daney@cavium.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC 7/8] s390/jump-label: add
 arch_jump_label_transform_early()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-09-29 at 16:26 -0700, Jeremy Fitzhardinge wrote:
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> 
> This allows jump-label entries to be modified early, in a pre-SMP
> environment.
> 
> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> Cc: Jan Glauber <jang@linux.vnet.ibm.com>

Hi Jeremy,

Your patch looks fine, if you can fix the minor compiler warnings
below. Excluding stop_machine() on pre-SMP also looks safer too me.

--Jan

  CC      arch/s390/kernel/jump_label.o
arch/s390/kernel/jump_label.c: In function â€˜__jump_label_transformâ€™:
arch/s390/kernel/jump_label.c:41:2: error: â€˜rcâ€™ undeclared (first use in this function)
arch/s390/kernel/jump_label.c:41:2: note: each undeclared identifier is reported only once for each function it appears in
arch/s390/kernel/jump_label.c:41:2: warning: passing argument 1 of â€˜probe_kernel_writeâ€™ makes pointer from integer without a cast [enabled by default]
include/linux/uaccess.h:108:21: note: expected â€˜void *â€™ but argument is of type â€˜jump_label_tâ€™
arch/s390/kernel/jump_label.c:28:19: warning: unused variable â€˜argsâ€™ [-Wunused-variable]
make[2]: *** [arch/s390/kernel/jump_label.o] Error 1



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:29:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:29:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0Nc-0003Zo-JO; Tue, 04 Oct 2011 01:29:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1R9taC-0005yn-UF
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 00:02:01 -0700
X-Env-Sender: rush1503@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1317452495!47127402!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23762 invoked from network); 1 Oct 2011 07:01:36 -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;
	1 Oct 2011 07:01:36 -0000
Received: by yxt3 with SMTP id 3so3387761yxt.30
	for <xen-devel@lists.xensource.com>;
	Sat, 01 Oct 2011 00:01:56 -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=C/6envZH6MSY5MhupgiYnNAY98pmmtf00FIgU8R8h8Y=;
	b=RoJanCoYyGV4WcdN32YB3mjG2HKDM2wQEqwda1AqyJBX3uI32o4Y/JkvNQNmB3Bekx
	X0/g3P1VFm6zIyyZQGeBTWQt59Dcmb/IkgcNldvLfZDz9Q2VosTMbdUq3eyTKHiXxWuT
	w+rIQ91WUIYUMXQfAp6jNVrlohrAjBoYlVkAI=
MIME-Version: 1.0
Received: by 10.101.88.16 with SMTP id q16mr11454537anl.106.1317452516625;
	Sat, 01 Oct 2011 00:01:56 -0700 (PDT)
Received: by 10.101.55.18 with HTTP; Sat, 1 Oct 2011 00:01:56 -0700 (PDT)
In-Reply-To: <20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
References: <20110919210045.3256.61939.reportbug@xen-dom0.xen.irush.su>
	<20110919212211.GB6343@elie>
	<CA+rvmvK8G5hNq4wOkPdcDMufYS9bD559zvexMqG9gy=m7dkU_A@mail.gmail.com>
	<1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
Date: Sat, 1 Oct 2011 11:01:56 +0400
Message-ID: <CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
From: rush <rush1503@gmail.com>
To: Jonathan Nieder <jrnieder@gmail.com>
Content-Type: text/plain; charset=ISO-8859-1
X-Mailman-Approved-At: Tue, 04 Oct 2011 01:26:21 -0700
Cc: 642154@bugs.debian.org, Ian Campbell <ijc@hellion.org.uk>,
	Ben Hutchings <ben@decadent.org.uk>,
	xen-devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: BUG: unable to handle kernel paging request at
	ffff8803bb6ad000
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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/10/1, Jonathan Nieder <jrnieder@gmail.com>:
>
> Cc-ing the reporter.  Rush, are you able to reproduce the oops you
> mentioned?  Does adding noxsave to the kernel command line help?
>

I'm sorry, i'm not guru in such questions.
Do I need to specify xsave=0 in grub boot options or there is another
way to do it?

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:30:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:30:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0OQ-0003wh-Gy; Tue, 04 Oct 2011 01:30:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1R9xfm-0004WN-BE
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 04:24:02 -0700
X-Env-Sender: jang@linux.vnet.ibm.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1317468239!17115209!1
X-Originating-IP: [194.196.100.167]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24712 invoked from network); 1 Oct 2011 11:23:59 -0000
Received: from mtagate7.uk.ibm.com (HELO mtagate7.uk.ibm.com) (194.196.100.167)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 1 Oct 2011 11:23:59 -0000
Received: from d06nrmr1507.portsmouth.uk.ibm.com
	(d06nrmr1507.portsmouth.uk.ibm.com [9.149.38.233])
	by mtagate7.uk.ibm.com (8.13.1/8.13.1) with ESMTP id p91BNvnx008385
	for <xen-devel@lists.xensource.com>; Sat, 1 Oct 2011 11:23:57 GMT
Received: from d06av01.portsmouth.uk.ibm.com (d06av01.portsmouth.uk.ibm.com
	[9.149.37.212])
	by d06nrmr1507.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with
	ESMTP id p91BNuOi2646040
	for <xen-devel@lists.xensource.com>; Sat, 1 Oct 2011 12:23:56 +0100
Received: from d06av01.portsmouth.uk.ibm.com (loopback [127.0.0.1])
	by d06av01.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with
	ESMTP id p91BNt0s008574
	for <xen-devel@lists.xensource.com>; Sat, 1 Oct 2011 05:23:56 -0600
Received: from [9.164.158.201] (ICON-9-164-158-201.megacenter.de.ibm.com
	[9.164.158.201])
	by d06av01.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with
	ESMTP id p91BNssr008565; Sat, 1 Oct 2011 05:23:54 -0600
From: Jan Glauber <jang@linux.vnet.ibm.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
In-Reply-To: <4E85E867.8080809@goop.org>
References: <cover.1317338254.git.jeremy.fitzhardinge@citrix.com>
	<b1d87557dc3001031ee8d7f69ee97b90cecba6aa.1317338254.git.jeremy.fitzhardinge@citrix.com>
	<1317394099.11297.54.camel@localhost.localdomain>
	<4E85E867.8080809@goop.org>
Content-Type: text/plain; charset="windows-1251"
Date: Sat, 01 Oct 2011 13:22:17 +0200
Message-Id: <1317468137.11297.70.camel@localhost.localdomain>
Mime-Version: 1.0
X-Mailer: Evolution 2.24.5 
Content-Transfer-Encoding: 8bit
X-Mailman-Approved-At: Tue, 04 Oct 2011 01:26:20 -0700
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	David Daney <david.daney@cavium.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC 7/8] s390/jump-label: add
 arch_jump_label_transform_early()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-09-30 at 09:03 -0700, Jeremy Fitzhardinge wrote:
> On 09/30/2011 07:48 AM, Jan Glauber wrote:
> > On Thu, 2011-09-29 at 16:26 -0700, Jeremy Fitzhardinge wrote:
> >> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> >>
> >> This allows jump-label entries to be modified early, in a pre-SMP
> >> environment.
> >>
> >> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> >> Cc: Jan Glauber <jang@linux.vnet.ibm.com>
> > Hi Jeremy,
> >
> > Your patch looks fine, if you can fix the minor compiler warnings
> > below. Excluding stop_machine() on pre-SMP also looks safer too me.
> 
> Do you think there would be an actual problem, or are you just being
> cautious?

Just cautious since stop_machine() is quite a big hammer. Who knows how
many jump labels we might get? So without an early exit in
stop_machine() for pre-SMP we might waste performance there.

> It seems to me - in general - stop_machine could just be defined to be a
> no-op (ie, just directly calls the callback) until enough SMP is
> initialized for it to make sense, rather than having to make every user
> work around it (if there's a chance they might call it early).

Agreed.

> >   CC      arch/s390/kernel/jump_label.o
> > arch/s390/kernel/jump_label.c: In function ‘__jump_label_transform’:
> > arch/s390/kernel/jump_label.c:41:2: error: ‘rc’ undeclared (first use in this function)
> > arch/s390/kernel/jump_label.c:41:2: note: each undeclared identifier is reported only once for each function it appears in
> > arch/s390/kernel/jump_label.c:41:2: warning: passing argument 1 of ‘probe_kernel_write’ makes pointer from integer without a cast [enabled by default]
> > include/linux/uaccess.h:108:21: note: expected ‘void *’ but argument is of type ‘jump_label_t’
> > arch/s390/kernel/jump_label.c:28:19: warning: unused variable ‘args’ [-Wunused-variable]
> > make[2]: *** [arch/s390/kernel/jump_label.o] Error 1
> >
> >
> 
> Like so?

Yes, that compiles!

--Jan

> From 9572689d1e5e6f54a1936a1dca09a6920d1bce27 Mon Sep 17 00:00:00 2001
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> Date: Thu, 29 Sep 2011 10:58:46 -0700
> Subject: [PATCH] s390/jump-label: add arch_jump_label_transform_early()
> 
> This allows jump-label entries to be modified early, in a pre-SMP
> environment.
> 
> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> Cc: Jan Glauber <jang@linux.vnet.ibm.com>
> 
> diff --git a/arch/s390/kernel/jump_label.c b/arch/s390/kernel/jump_label.c
> index 44cc06b..4fbe63b 100644
> --- a/arch/s390/kernel/jump_label.c
> +++ b/arch/s390/kernel/jump_label.c
> @@ -18,26 +18,15 @@ struct insn {
>  } __packed;
> 
>  struct insn_args {
> -	unsigned long *target;
> -	struct insn *insn;
> -	ssize_t size;
> +	struct jump_entry *entry;
> +	enum jump_label_type type;
>  };
> 
> -static int __arch_jump_label_transform(void *data)
> +static void __jump_label_transform(struct jump_entry *entry,
> +				   enum jump_label_type type)
>  {
> -	struct insn_args *args = data;
> -	int rc;
> -
> -	rc = probe_kernel_write(args->target, args->insn, args->size);
> -	WARN_ON_ONCE(rc < 0);
> -	return 0;
> -}
> -
> -void arch_jump_label_transform(struct jump_entry *entry,
> -			       enum jump_label_type type)
> -{
> -	struct insn_args args;
>  	struct insn insn;
> +	int rc;
> 
>  	if (type == JUMP_LABEL_ENABLE) {
>  		/* brcl 15,offset */
> @@ -49,11 +38,33 @@ void arch_jump_label_transform(struct jump_entry *entry,
>  		insn.offset = 0;
>  	}
> 
> -	args.target = (void *) entry->code;
> -	args.insn = &insn;
> -	args.size = JUMP_LABEL_NOP_SIZE;
> +	rc = probe_kernel_write((void *)entry->code, &insn, JUMP_LABEL_NOP_SIZE);
> +	WARN_ON_ONCE(rc < 0);
> +}
> 
> -	stop_machine(__arch_jump_label_transform, &args, NULL);
> +static int __sm_arch_jump_label_transform(void *data)
> +{
> +	struct insn_args *args = data;
> +
> +	__jump_label_transform(args->entry, args->type);
> +	return 0;
> +}
> +
> +void arch_jump_label_transform(struct jump_entry *entry,
> +			       enum jump_label_type type)
> +{
> +	struct insn_args args;
> +
> +	args.entry = entry;
> +	args.type = type;
> +
> +	stop_machine(__sm_arch_jump_label_transform, &args, NULL);
> +}
> +
> +void __init arch_jump_label_transform_early(struct jump_entry *entry,
> +					    enum jump_label_type type)
> +{
> +	__jump_label_transform(entry, type);
>  }
> 
>  #endif
> 
> 	J
> 


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:31:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:31:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0PG-0004Jc-8O; Tue, 04 Oct 2011 01:31:18 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RA3SV-0004II-MO
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 10:34:44 -0700
X-Env-Sender: rush1503@gmail.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1317490479!19308206!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26866 invoked from network); 1 Oct 2011 17:34:40 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Oct 2011 17:34:40 -0000
Received: by yxt3 with SMTP id 3so3855938yxt.30
	for <xen-devel@lists.xensource.com>;
	Sat, 01 Oct 2011 10:34:39 -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=UbuLiTrFsK7CQt6tZu9CLtzm0q5vT/hva1oXircckQ4=;
	b=EcIQS4B61P1KXoiczOF65cJLtYAXMDyRCDtn9uD0sbyssyrx1eNAmH4Id0vs/5PQZH
	JPbw67RMOSjqHXo10sit45vCTqawzTG2TmLjtbSD5UVZ/g5/y1OiRAnjddIU83KCis80
	/5/Jc4586v6oasBrGdZqpEVzYZGh1dIjZLCTg=
MIME-Version: 1.0
Received: by 10.100.208.3 with SMTP id f3mr1760825ang.62.1317490477880; Sat,
	01 Oct 2011 10:34:37 -0700 (PDT)
Received: by 10.101.55.18 with HTTP; Sat, 1 Oct 2011 10:34:37 -0700 (PDT)
In-Reply-To: <1317460798.11991.2.camel@dagon.hellion.org.uk>
References: <20110919210045.3256.61939.reportbug@xen-dom0.xen.irush.su>
	<20110919212211.GB6343@elie>
	<CA+rvmvK8G5hNq4wOkPdcDMufYS9bD559zvexMqG9gy=m7dkU_A@mail.gmail.com>
	<1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
	<CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
	<1317460798.11991.2.camel@dagon.hellion.org.uk>
Date: Sat, 1 Oct 2011 21:34:37 +0400
Message-ID: <CA+rvmv+yU0=nEuvLSqkE44RFqeaQw504MkD-sxjXV3D3nkme_g@mail.gmail.com>
From: rush <rush1503@gmail.com>
To: Ian Campbell <ijc@hellion.org.uk>
Content-Type: text/plain; charset=ISO-8859-1
X-Mailman-Approved-At: Tue, 04 Oct 2011 01:26:21 -0700
Cc: Jonathan Nieder <jrnieder@gmail.com>, 642154@bugs.debian.org,
	xen-devel <xen-devel@lists.xensource.com>,
	Ben Hutchings <ben@decadent.org.uk>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: BUG: unable to handle kernel paging request at
	ffff8803bb6ad000
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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, xsave=0 didn't give any effect. Oops is still here.

[   21.095558] BUG: unable to handle kernel paging request at ffff8803bb7c5000
[   21.095827] IP: [<ffffffff810106db>] __sanitize_i387_state+0x23/0xe1
[   21.096002] PGD 1604067 PUD 3d82d9067 PMD 3d84b5067 PTE 0
[   21.096355] Oops: 0000 [#1] SMP
[   21.096578] CPU 3
[   21.096646] Modules linked in: bridge stp xen_evtchn xenfs loop
snd_pcm snd_timer snd i2c_i801 soundcore snd_page_alloc i2c_core
pcspkr evdev joydev ghes video hed button processor ext4 mbcache jbd2
crc16 dm_mod raid1 md_mod usbhid hid sg sd_mod crc_t10dif ahci libahci
libata scsi_mod ehci_hcd fan thermal usbcore thermal_sys e1000e [last
unloaded: scsi_wait_scan]
[   21.099742]
[   21.099835] Pid: 1207, comm: update-exim4.co Not tainted
3.0.0-1-amd64 #1 Intel Corporation S1200BTL/S1200BTL
[   21.100169] RIP: e030:[<ffffffff810106db>]  [<ffffffff810106db>]
__sanitize_i387_state+0x23/0xe1
[   21.100376] RSP: e02b:ffff8803bbc77e00  EFLAGS: 00010246
[   21.100481] RAX: 0000000000000000 RBX: 00007fffa6c18700 RCX: 0000000000000200
[   21.100593] RDX: ffff8803bb7c4e00 RSI: ffff8803bbc77fd8 RDI: ffff8803bbd2ce20
[   21.100705] RBP: ffff8803bbd2ce20 R08: dead000000200200 R09: ffff8803bda8c2d8
[   21.100817] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000
[   21.100929] R13: ffffffffffffffff R14: ffff8803bbd2ce20 R15: 00007fffa6c18700
[   21.101043] FS:  00007f57dae43700(0000) GS:ffff8803d61a0000(0000)
knlGS:0000000000000000
[   21.101185] CS:  e033 DS: 0000 ES: 0000 CR0: 000000008005003b
[   21.101293] CR2: ffff8803bb7c5000 CR3: 00000003bdcce000 CR4: 0000000000002660
[   21.101405] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[   21.101516] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[   21.101629] Process update-exim4.co (pid: 1207, threadinfo
ffff8803bbc76000, task ffff8803bbd2ce20)
[   21.101774] Stack:
[   21.101868]  ffffffff81010919 0000000000000001 ffff8803bbc77f58
0000000000000011
[   21.102254]  ffff8803bbd2d2b0 ffffffffffffffff ffffffff81008fdd
00000000000002d8
[   21.102642]  00007fffa6c18538 0000000000000011 0000000000040001
00000065000005d8
[   21.103029] Call Trace:
[   21.103128]  [<ffffffff81010919>] ? save_i387_xstate+0x102/0x1f3
[   21.103238]  [<ffffffff81008fdd>] ? do_signal+0x212/0x649
[   21.103346]  [<ffffffff81009450>] ? do_notify_resume+0x25/0x6b
[   21.103458]  [<ffffffff8133bfe0>] ? int_signal+0x12/0x17
[   21.103564] Code: e8 13 2a ff ff 66 90 c3 48 8b 97 48 04 00 00 48
85 d2 0f 84 d0 00 00 00 48 8b 47 08 f6 40 14 01 74 02 0f 0b 48 8b 05
45 4e 71 00
[   21.106353]  8b b2 00 02 00 00 48 89 c1 48 21 f1 48 39 c1 0f 84 a7 00 00
[   21.107848] RIP  [<ffffffff810106db>] __sanitize_i387_state+0x23/0xe1
[   21.108020]  RSP <ffff8803bbc77e00>
[   21.108119] CR2: ffff8803bb7c5000
[   21.108218] ---[ end trace f589986fb387a3c2 ]---
[   22.776339] BUG: unable to handle kernel paging request at ffff8803bb7c5000
[   22.776579] IP: [<ffffffff810106db>] __sanitize_i387_state+0x23/0xe1
[   22.776754] PGD 1604067 PUD 3d82d9067 PMD 3d84b5067 PTE 0
[   22.777109] Oops: 0000 [#5] SMP
[   22.777332] CPU 3
[   22.777399] Modules linked in: bridge stp xen_evtchn xenfs loop
snd_pcm snd_timer snd i2c_i801 soundcore snd_page_alloc i2c_core
pcspkr evdev joydev ghes video hed button processor ext4 mbcache jbd2
crc16 dm_mod raid1 md_mod usbhid hid sg sd_mod crc_t10dif ahci libahci
libata scsi_mod ehci_hcd fan thermal usbcore thermal_sys e1000e [last
unloaded: scsi_wait_scan]
[   22.780506]
[   22.780600] Pid: 2070, comm: forks Tainted: G      D
3.0.0-1-amd64 #1 Intel Corporation S1200BTL/S1200BTL
[   22.780933] RIP: e030:[<ffffffff810106db>]  [<ffffffff810106db>]
__sanitize_i387_state+0x23/0xe1
[   22.781141] RSP: e02b:ffff8803bc403e00  EFLAGS: 00010246
[   22.781247] RAX: 0000000000000000 RBX: 00007fff10bfcdc0 RCX: 0000000000000200
[   22.781359] RDX: ffff8803bb7c4e00 RSI: ffff8803bc403fd8 RDI: ffff8803bbd2ce20
[   22.781472] RBP: ffff8803bbd2ce20 R08: ffff8803bc402000 R09: ffffffff81684640
[   22.781584] R10: 00007f2f327999d0 R11: 0000000000000246 R12: 0000000000000000
[   22.781696] R13: ffffffffffffffff R14: ffff8803bbd2ce20 R15: 00007fff10bfcdc0
[   22.781809] FS:  00007f2f32799700(0000) GS:ffff8803d61a0000(0000)
knlGS:0000000000000000
[   22.781952] CS:  e033 DS: 0000 ES: 0000 CR0: 000000008005003b
[   22.782059] CR2: ffff8803bb7c5000 CR3: 00000003b7d28000 CR4: 0000000000002660
[   22.782170] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[   22.782283] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[   22.782395] Process forks (pid: 2070, threadinfo ffff8803bc402000,
task ffff8803bbd2ce20)
[   22.782537] Stack:
[   22.782634]  ffffffff81010919 0000000000413201 ffff8803bc403f58
0000000000000011
[   22.783021]  ffff8803bbd2d2b0 ffffffffffffffff ffffffff81008fdd
0000000000000000
[   22.783408]  00007fff10bfcbf8 0000000000000011 0000000000040001
0000fffe00000817
[   22.783795] Call Trace:
[   22.783895]  [<ffffffff81010919>] ? save_i387_xstate+0x102/0x1f3
[   22.784004]  [<ffffffff81008fdd>] ? do_signal+0x212/0x649
[   22.784112]  [<ffffffff8133733a>] ? error_exit+0x2a/0x60
[   22.784219]  [<ffffffff81336e61>] ? retint_restore_args+0x5/0x6
[   22.784328]  [<ffffffff8100122a>] ? hypercall_page+0x22a/0x1000
[   22.784436]  [<ffffffff81009450>] ? do_notify_resume+0x25/0x6b
[   22.784545]  [<ffffffff8133bfe0>] ? int_signal+0x12/0x17
[   22.784652] Code: e8 13 2a ff ff 66 90 c3 48 8b 97 48 04 00 00 48
85 d2 0f 84 d0 00 00 00 48 8b 47 08 f6 40 14 01 74 02 0f 0b 48 8b 05
45 4e 71 00
[   22.787445]  8b b2 00 02 00 00 48 89 c1 48 21 f1 48 39 c1 0f 84 a7 00 00
[   22.788942] RIP  [<ffffffff810106db>] __sanitize_i387_state+0x23/0xe1
[   22.789115]  RSP <ffff8803bc403e00>
[   22.789215] CR2: ffff8803bb7c5000
[   22.789315] ---[ end trace f589986fb387a3c6 ]---

grub boot options was:

menuentry 'Debian GNU/Linux, with Xen 4.0-amd64 and Linux
3.0.0-1-amd64' --class debian --class gnu-linux --class gnu --class os
--class xen {
        insmod raid
        insmod mdraid1x
        insmod lvm
        insmod part_msdos
        insmod part_msdos
        insmod ext2
        set root='(xen-system)'
        search --no-floppy --fs-uuid --set=root
709c172b-19b2-417d-8a43-e1957bcdc2f6
        echo    'Loading Xen 4.0-amd64 ...'
        multiboot       /boot/xen-4.0-amd64.gz placeholder
        echo    'Loading Linux 3.0.0-1-amd64 ...'
        module  /boot/vmlinuz-3.0.0-1-amd64 placeholder
root=/dev/mapper/xen-system ro xsave=0 quiet
        echo    'Loading initial ramdisk ...'
        module  /boot/initrd.img-3.0.0-1-amd64
}

Rush.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:32:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:32:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0Q4-0004j3-7p; Tue, 04 Oct 2011 01:32:08 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RAA2m-0000CM-QT
	for xen-devel@lists.xensource.com; Sat, 01 Oct 2011 17:36:38 -0700
X-Env-Sender: htejun@gmail.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1317515792!19234366!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7340 invoked from network); 2 Oct 2011 00:36:33 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-3.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Oct 2011 00:36:33 -0000
Received: by pzk34 with SMTP id 34so7627453pzk.8
	for <xen-devel@lists.xensource.com>;
	Sat, 01 Oct 2011 17:36:31 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:date:from:to:cc:subject:message-id:references:mime-version
	:content-type:content-disposition:in-reply-to:user-agent;
	bh=/czwJNlWyVyEg4+wtBBml8zLgXuB3IBwQG+RbPgYGp8=;
	b=e8O3bR3M9legVZKxLuRanALoLXiBTwl4P4hgOcxFCfWUFYjl4WCzJC2++m3N/K4j2t
	0sAro/ckxNBE6V8t+Yf2ibRAv4GdU9398IEU1pORFvs0B3I++mmjB2MtY2HRIUragZw9
	ry3PrI66+2Udv0+kEA+/wqyajz6iSN8WO6kX0=
Received: by 10.68.122.19 with SMTP id lo19mr8640936pbb.93.1317515791434;
	Sat, 01 Oct 2011 17:36:31 -0700 (PDT)
Received: from mtj.dyndns.org (c-24-6-216-108.hsd1.ca.comcast.net.
	[24.6.216.108])
	by mx.google.com with ESMTPS id ml4sm35795481pbc.0.2011.10.01.17.36.29
	(version=SSLv3 cipher=OTHER); Sat, 01 Oct 2011 17:36:30 -0700 (PDT)
Date: Sat, 1 Oct 2011 17:36:27 -0700
From: Tejun Heo <tj@kernel.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111002003627.GB31799@mtj.dyndns.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<58bc7c7142fe54cd6c17f2f18f4b11fd2f597d5a.1317506051.git.jeremy.fitzhardinge@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <58bc7c7142fe54cd6c17f2f18f4b11fd2f597d5a.1317506051.git.jeremy.fitzhardinge@citrix.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Tue, 04 Oct 2011 01:26:20 -0700
Cc: Rusty Russell <rusty@rustcorp.com.au>,
	the arch/x86 maintainers <x86@kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	Andrew Morton <akpm@linux-foundation.org>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 2/5] stop_machine: make stop_machine
 safe and efficient to call early
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

On Sat, Oct 01, 2011 at 02:55:34PM -0700, Jeremy Fitzhardinge wrote:
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> 
> Make stop_machine() safe to call early in boot, before SMP has been
> set up, by simply calling the callback function directly if there's
> only one CPU online.

Maybe "before stop_machine is initialized" is better wording now both
here and in the comment?

> [ Fixes from AKPM:
>    - add comment
>    - local_irq_flags, not save_flags
>    - also call hard_irq_disable() for systems which need it
> 
>   Tejun suggested using an explicit flag rather than just looking at
>   the online cpu count. ]
> 
> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> Cc: Tejun Heo <tj@kernel.org>
> Cc: Rusty Russell <rusty@rustcorp.com.au>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: H. Peter Anvin <hpa@linux.intel.com>
> Cc: Ingo Molnar <mingo@elte.hu>
> Cc: Steven Rostedt <rostedt@goodmis.org>

Other than that,

 Acked-by: Tejun Heo <tj@kernel.org>

Thanks.

-- 
tejun

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:32:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:32:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0Qt-00057V-Gy; Tue, 04 Oct 2011 01:32:59 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RAk2m-00015h-Ta
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 08:03:03 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1317654155!47402735!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17693 invoked from network); 3 Oct 2011 15:02:36 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-5.tower-27.messagelabs.com with SMTP;
	3 Oct 2011 15:02:36 -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 p93F28XS006755
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 3 Oct 2011 11:02:09 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p93F26Bs009201; Mon, 3 Oct 2011 11:02:06 -0400
Date: Mon, 3 Oct 2011 11:02:06 -0400
From: Jason Baron <jbaron@redhat.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111003150205.GB2462@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
X-Mailman-Approved-At: Tue, 04 Oct 2011 01:26:21 -0700
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

(Sorry for the late reply - I was away for a few days).

The early enable is really nice - it means there are not restrictions on
when jump_label_inc()/dec() can be called which is nice.

comments below.


On Sat, Oct 01, 2011 at 02:55:35PM -0700, Jeremy Fitzhardinge wrote:
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> 
> If a key has been enabled before jump_label_init() is called, don't
> nop it out.
> 
> This removes arch_jump_label_text_poke_early() (which can only nop
> out a site) and uses arch_jump_label_transform() instead.
> 
> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> ---
>  include/linux/jump_label.h |    3 ++-
>  kernel/jump_label.c        |   20 ++++++++------------
>  2 files changed, 10 insertions(+), 13 deletions(-)
> 
> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
> index 1213e9d..c8fb1b3 100644
> --- a/include/linux/jump_label.h
> +++ b/include/linux/jump_label.h
> @@ -45,7 +45,8 @@ extern void jump_label_lock(void);
>  extern void jump_label_unlock(void);
>  extern void arch_jump_label_transform(struct jump_entry *entry,
>  				 enum jump_label_type type);
> -extern void arch_jump_label_text_poke_early(jump_label_t addr);
> +extern void arch_jump_label_transform_early(struct jump_entry *entry,
> +				 enum jump_label_type type);
>  extern int jump_label_text_reserved(void *start, void *end);
>  extern void jump_label_inc(struct jump_label_key *key);
>  extern void jump_label_dec(struct jump_label_key *key);
> diff --git a/kernel/jump_label.c b/kernel/jump_label.c
> index a8ce450..059202d5 100644
> --- a/kernel/jump_label.c
> +++ b/kernel/jump_label.c
> @@ -121,13 +121,6 @@ static void __jump_label_update(struct jump_label_key *key,
>  	}
>  }
>  
> -/*
> - * Not all archs need this.
> - */
> -void __weak arch_jump_label_text_poke_early(jump_label_t addr)
> -{
> -}
> -
>  static __init int jump_label_init(void)
>  {
>  	struct jump_entry *iter_start = __start___jump_table;
> @@ -139,12 +132,15 @@ static __init int jump_label_init(void)
>  	jump_label_sort_entries(iter_start, iter_stop);
>  
>  	for (iter = iter_start; iter < iter_stop; iter++) {
> -		arch_jump_label_text_poke_early(iter->code);
> -		if (iter->key == (jump_label_t)(unsigned long)key)
> +		struct jump_label_key *iterk;
> +
> +		iterk = (struct jump_label_key *)(unsigned long)iter->key;
> +		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
> +					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);

The only reason I called this at boot-time was that the 'ideal' x86
no-op isn't known until boot time. Thus, in the enabled case we could
skip the the arch_jump_label_transform() call. ie:

if (!enabled)
	arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);


> +		if (iterk == key)
>  			continue;
>  
> -		key = (struct jump_label_key *)(unsigned long)iter->key;
> -		atomic_set(&key->enabled, 0);
> +		key = iterk;
>  		key->entries = iter;
>  #ifdef CONFIG_MODULES
>  		key->next = NULL;
> @@ -212,7 +208,7 @@ void jump_label_apply_nops(struct module *mod)
>  		return;
>  
>  	for (iter = iter_start; iter < iter_stop; iter++)
> -		arch_jump_label_text_poke_early(iter->code);
> +		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
>  }
>  
>  static int jump_label_add_module(struct module *mod)
> -- 
> 1.7.6.2
> 

hmmm...this is used on module load in smp - so this would introduce a number of
calls to stop_machine() where we didn't have them before. Yes, module
load is a very slow path to begin with, but I think its at least worth
pointing out...

thanks,

-Jason

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:33:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:33:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0Rd-0005U5-Hw; Tue, 04 Oct 2011 01:33:45 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RAlWS-0007Zg-6I
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 09:37:44 -0700
X-Env-Sender: thellstrom@vmware.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1317659860!15703211!1
X-Originating-IP: [65.115.85.73]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9150 invoked from network); 3 Oct 2011 16:37:40 -0000
Received: from smtp-outbound-2.vmware.com (HELO smtp-outbound-2.vmware.com)
	(65.115.85.73) by server-7.tower-182.messagelabs.com with SMTP;
	3 Oct 2011 16:37:40 -0000
Received: from mailhost4.vmware.com (mailhost4.vmware.com [10.16.67.124])
	by smtp-outbound-2.vmware.com (Postfix) with ESMTP id E3EDC43009;
	Mon,  3 Oct 2011 09:37:39 -0700 (PDT)
Received: from linlap1.home.shipmail.org (unknown [10.23.99.2])
	by mailhost4.vmware.com (Postfix) with ESMTP id 9F183C9C5C;
	Mon,  3 Oct 2011 09:37:36 -0700 (PDT)
Message-ID: <4E89E45E.7010009@vmware.com>
Date: Mon, 03 Oct 2011 18:35:42 +0200
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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <1317328432-25620-1-git-send-email-konrad.wilk@oracle.com>
	<4E8568E8.1070800@vmware.com>
	<20110930140949.GA18905@phenom.oracle.com>
In-Reply-To: <20110930140949.GA18905@phenom.oracle.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Tue, 04 Oct 2011 01:26:20 -0700
Cc: xen-devel@lists.xensource.com, thomas@shipmail.org, airlied@linux.ie,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	j.glisse@redhat.com, alexdeucher@gmail.com, airlied@redhat.com,
	bskeggs@redhat.com
Subject: [Xen-devel] Re: [PATCH] TTM DMA pool v1.8
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/30/2011 04:09 PM, Konrad Rzeszutek Wilk wrote:
> On Fri, Sep 30, 2011 at 08:59:52AM +0200, Thomas Hellstrom wrote:
>    
>> Konrad,
>>
>> I'm really sorry for taking so long to review this.
>>      
> That is OK. We all are busy - and it gave me some time to pretty
> up the code even more.
>
>    
>> I'd like to go through a couple of high-level things first before
>> reviewing the coding itself.
>>
>> The page_alloc_func structure looks nice, but I'd like to have it
>> per ttm backend,
>>      
> Meaning the 'struct ttm_backend_func' right?
>
>    

Yes, that's right.

>> we would just need to make sure that the backend is alive when we
>> alloc / free pages.
>> The reason for this is that there may be backends that want to
>> allocate dma memory running simultaneously with those who don't.
>>      
> As in for some TTM manager use the non-DMA, and for other DMA
> (is_dma32 is set?) Or say two cards - one that has the concept
> of MMU and one that does not and both of them are readeon?
>    

For example, or let's say you have a low-end system that in the future 
needs to
allocate DMA memory, and want to plug in a high-end graphics card, like 
Radeon.



>    
>> When the backend fires up, it can determine whether to use DMA
>> memory or not.
>>      
> Or more of backends (and drivers) that do not have any concept
> of MMU and just use framebuffers and such?
>
> I think we would just have to stick in a pointer to the
> appropiate 'struct ttm_page_alloc_func' (and the 'struct device')
> in the 'struct ttm_backend_func'. And this would be done by
> backend that would decided which one to use.
>    

Yes, either that, or merge the two structs.

> And the TTM could find out which page_alloc_func to use straight
> from the ttm_backend_func and call that (along with the 'struct device'
> also gathered from that structure). Rough idea (on top of the patches):
>
> diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
> index dd05db3..e7a0c3c 100644
> --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
> +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
> @@ -902,12 +902,12 @@ struct ttm_page_alloc_func ttm_page_alloc_default = {
>
>   int ttm_get_pages(struct list_head *pages, int flags,
>   		  enum ttm_caching_state cstate, unsigned count,
> -		  dma_addr_t *dma_address, struct device *dev)
> +		  dma_addr_t *dma_address, struct ttm_backend *be)
>    

I'd like to see it even more simple. If the ttm_backend_func is 
responsible for allocating pages,
ttm_get_pages would be called by the backend code, and the dma_addr_t 
pointer can be kept
in the backend object. No need to expose neither device nor dma address 
to core ttm that
really doesn't want to care. The dma_address is then available in the 
backend only
for binding / unbinding, and ttm_get_pages will be called exclusively by 
the backend, and its
interface can pass struct device.

> And "ttm/tt: Move ttm_tt_set_page_caching implementation in TTM page pool code."
> would still be there, except it would be done per ttm-backend. Well
> by choosing which TTM page pool the TTM backend would use.
>
>    

Yes.

>> 2) Memory accounting: If the number DMA pages are limited in a way
>> that the ttm memory global routines are not aware of. How do we
>> handle memory accounting? (How do we avoid exhausting IOMMU space)?
>>      
> Good question. Not entirely sure about that. I know that on
> SWIOTLB there is no limit (as you do not use the bounce buffer)
> but not sure about VT-D, AMD-VI, GART, or when there is no IOMMU.
>
> Let me get back to you on that.
>
> Granted, the code _only_ gets activated when we use SWIOTLB right
> now so the answer is "no exhausting" currently. Either way let me
> dig a bit deeper.
>    

I'm fine with it working OK with SWIOTLB now.
When we need to handle other situations, let's find out how to do it then.

>> 3) Page swapping. Currently we just copy pages to shmem pages and
>> then free device pages. In the future we'd probably like to insert
>> non-dma pages directly into the swap cache. Is it possible to
>> differentiate dma pages from pages that are directly insertable?
>>      
> Yes. The TTM DMA pool keeps track of which pages belong to which
> pool and will reject non-dma pages (or pages which belong to
> a different pool). It is fairly easy to expose that check
> so that the generic TTM code can make the proper distinction.
>
> But also - once you free a device page ('cached') it gets freed.
> The other pages (writecombine,  writeback, uncached) end up sitting
> in a recycle pool to be used. This is believe how the current
> TTM page code works right now (and this TTM DMA pool follows).
>    

Yes, that's OK, as long as the system shrinker can free those pages.

> The swapping code back (so from swap to pool) does not seem to
> distinguish it that much - it just allocates a new page - and
> then copies from whatever was in the swap cache?
>
> This is something you were thinking to do in the future I presume?
>    

Yes. If / when I do that, I might be adding a new backend function to 
put a ttm in an
"anonymous state", that is using only pages that can be inserted in the 
swap cache or passed
around to other devices, and to put a ttm in a "device" state, that 
copies it to device mappable pages.

Thanks,
/Thomas


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:34:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:34:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0SR-0005qp-5q; Tue, 04 Oct 2011 01:34:35 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RAlqY-0000ut-Rj
	for xen-devel@lists.xensource.com; Mon, 03 Oct 2011 09:59:21 -0700
X-Env-Sender: thellstrom@vmware.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1317661107!52948040!1
X-Originating-IP: [65.115.85.73]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23607 invoked from network); 3 Oct 2011 16:58:27 -0000
Received: from smtp-outbound-2.vmware.com (HELO smtp-outbound-2.vmware.com)
	(65.115.85.73) by server-15.tower-21.messagelabs.com with SMTP;
	3 Oct 2011 16:58:27 -0000
Received: from mailhost3.vmware.com (mailhost3.vmware.com [10.16.27.45])
	by smtp-outbound-2.vmware.com (Postfix) with ESMTP id EB3361D007;
	Mon,  3 Oct 2011 09:58:24 -0700 (PDT)
Received: from linlap1.home.shipmail.org (unknown [10.23.99.2])
	by mailhost3.vmware.com (Postfix) with ESMTP id CF43ACD9D8;
	Mon,  3 Oct 2011 09:58:21 -0700 (PDT)
Message-ID: <4E89E93B.1060707@vmware.com>
Date: Mon, 03 Oct 2011 18:56:27 +0200
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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <1317328432-25620-1-git-send-email-konrad.wilk@oracle.com>
	<4E8568E8.1070800@vmware.com>
	<20110930140949.GA18905@phenom.oracle.com>
	<4E89E45E.7010009@vmware.com>
	<20111003164606.GI17108@phenom.oracle.com>
In-Reply-To: <20111003164606.GI17108@phenom.oracle.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Tue, 04 Oct 2011 01:26:20 -0700
Cc: xen-devel@lists.xensource.com, thomas@shipmail.org, airlied@linux.ie,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	j.glisse@redhat.com, alexdeucher@gmail.com, airlied@redhat.com,
	bskeggs@redhat.com
Subject: [Xen-devel] Re: [PATCH] TTM DMA pool v1.8
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/03/2011 06:46 PM, Konrad Rzeszutek Wilk wrote:
>
> It does now (I had a spinlock mishap).. which reminds me - how
> do I test these patches with your vmwgfx driver? I've an old version
> of VMWare Workstation 8, would that do?
>    

VMware workstation 8 is OK (it's actually the latest version of 
workstation).

You'd need the vmwgfx kernel, driver,
latest mesa master compiled with the "svga" driver and the "dri" and 
"xa" state trackers.
xf86-video-vmware, the "vmwgfx" branch.

And you should be fine running 3D.



>>      
>>> The swapping code back (so from swap to pool) does not seem to
>>> distinguish it that much - it just allocates a new page - and
>>> then copies from whatever was in the swap cache?
>>>
>>> This is something you were thinking to do in the future I presume?
>>>        
>> Yes. If / when I do that, I might be adding a new backend function
>> to put a ttm in an
>> "anonymous state", that is using only pages that can be inserted in
>> the swap cache or passed
>> around to other devices, and to put a ttm in a "device" state, that
>> copies it to device mappable pages.
>>      
> OK, that should be no trouble - we would need to expose a function
> call to "detach" the page from the TTM pool (which could mean
> actually allocating a new page for the "other" device, and copying
> it from the "source" to "other" and then freeing the "source).
>
> I am thinking ... you hotplug an high-end radeon while the machine has
> an ATI ES1000 in it, and want to move those pages to the new
> card. The ATI ES1000 can only do up to 4GB, while the new fancy card
> has no such limits (and perhaps does not want to use the TTM DMA
> pool).
>
> Is this what you had in mind?
>    
Yes, that's a typical use-case. Or passing pages between an array of 
GPGPUs...


>> Thanks,
>> /Thomas
>>      

/Thomas


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:35:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:35:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0Tn-0006P1-BW; Tue, 04 Oct 2011 01:35:59 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB0Qg-0004yB-D9
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 01:32:47 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317717147!52401961!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26622 invoked from network); 4 Oct 2011 08:32:27 -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;
	4 Oct 2011 08:32:27 -0000
X-IronPort-AV: E=Sophos;i="4.68,484,1312156800"; 
   d="scan'208";a="8192769"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 08:32:43 +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, 4 Oct 2011
	09:32:43 +0100
Subject: Re: [Xen-devel] [PATCH 00 of 23] libxl: rationalise libxl_device_*
	APIs
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Tue, 4 Oct 2011 09:32:42 +0100
In-Reply-To: <1317715976.21903.73.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<CAPLaKK7qFpZcrjWdNESwotc70KVVvNpC1SOoSqc9esFKJoM3=Q@mail.gmail.com>
	<1317715976.21903.73.camel@zakaz.uk.xensource.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317717163.21903.80.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Jim Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Scott <Dave.Scott@eu.citrix.com>, Mike McClurg <mike.mcclurg@citrix.com>,
	Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>, Dave
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-04 at 09:12 +0100, Ian Campbell wrote:
> On Tue, 2011-10-04 at 08:32 +0100, Roger Pau MonnÃ© wrote:
> > I hope this patches will be applied to unstable soon, so I can rewrite
> > the NetBSD file disk backend with the new features introduced in the
> > series.
> 
> What I tend to do in these cases is to import the other persons series
> into the head of my own patch queue (using the mq extension) and switch
> it out as new revisions are posted etc.

BTW the mbox extension (http://mercurial.selenic.com/wiki/MboxExtension)
can make this a bit easier for larger series, since you can save all the
messages to an mbox and import that in one go.

I think Chris Masons mseries extension is similar too
http://oss.oracle.com/~mason/mseries/

Ian.



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 01:53:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 01:53:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB0lD-0007Ej-QZ; Tue, 04 Oct 2011 01:53:59 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB0kc-00072j-Ir
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 01:53:22 -0700
X-Env-Sender: Dave.Scott@eu.citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1317718367!57308814!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5055 invoked from network); 4 Oct 2011 08:52:47 -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;
	4 Oct 2011 08:52:47 -0000
X-IronPort-AV: E=Sophos;i="4.68,484,1312156800"; 
   d="scan'208";a="8193303"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 08:53:19 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.160]) by
	LONPMAILMX01.citrite.net ([10.30.203.162]) with mapi; Tue, 4 Oct 2011
	09:53:19 +0100
From: Dave Scott <Dave.Scott@eu.citrix.com>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>, "xen-devel@lists.xensource.com"
	<xen-devel@lists.xensource.com>
Date: Tue, 4 Oct 2011 09:53:19 +0100
Thread-Topic: [PATCH 02 of 23] libxl: add a comment describing the device
	interfaces
Thread-Index: Acx/dY7UUNp3fTMrTseklA1KDoG1RQC+vyZw
Message-ID: <81A73678E76EA642801C8F2E4823AD21BC2EE2FCCD@LONPMAILBOX01.citrite.net>
References: <patchbomb.1317389593@localhost.localdomain>
	<7c845e974def74de73f6.1317389595@localhost.localdomain>
In-Reply-To: <7c845e974def74de73f6.1317389595@localhost.localdomain>
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: Jim Fehlig <jfehlig@novell.com>, Mike McClurg <mike.mcclurg@citrix.com>,
	Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>
Subject: [Xen-devel] RE: [PATCH 02 of 23] libxl: add a comment describing
 the device interfaces
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Ian,

I think the shape of this interface looks sensible.

[ snip ]
> + * libxl_device_<type>_add(ctx, domid, device):
> + *
> + *   Adds the given device to the specified domain. This can be called
> + *   while the guest is running (hotplug) or before boot (coldplug).
> + *
> + *   This function only sets up the device but does not wait for the
> + *   domain to connect to the device and therefore cannot block on the
> + *   guest.
> + *
> + *   XXX do we need a way to wait? e.g. wait_for_connect function?

I don't know about other users but xapi doesn't currently care whether a do=
main
has actually connected to the device (in the sense of xenstore state =3D 4)=
.=20
Xapi only cares about whether the device has been connected to the domain
from the host's PoV; i.e. the "virtual cable" has been plugged in and the d=
omain
can use the device if it chooses to.

BTW Xapi's disk hotplug command will block until it gets a completion signa=
l
from a backend udev script. While the command is in progress it holds a loc=
k
which prevents an old xenstore watch being processed which might cause xapi
to think a async unplug has just occurred (more below)

> + *   XXX perhaps an optional way to generate an event on connect?
> + *   needs event system overhaul.
> + *
> + * libxl_device_<type>_remove(ctx, domid, device):
> + *
> + *   Removes the given device from the specified domain by performing
> + *   an orderly unplug with guest co-operation. This requires that the
> + *   guest is running.
> + *
> + *   This method is currently synchronous and therefore can block
> + *   while interacting with the guest.
> + *
> + *   XXX should provide an async version. needs event system overhaul.

Xapi normally performs a synchronous unplug, waiting for completion signale=
d
via a backend udev script. However if the disk is mounted inside the domain
and the blkfront signals an error ("02 - refusing to close" ISTR) then xapi
stops waiting and the synchronous unplug fails. Later when the admin inside=
 the
guest unmounts the disk and the unplug completes, xapi's xenstore watch fir=
es,
it grabs a lock, checks the state of xenstore and if necessary marks the di=
sk
as unplugged.

BTW I've always thought this behaviour a little weird and I'm not attached =
to
it :) IMHO it would be nice to have a failed unplug request cause the whole
operation to be aborted, and not to have the device unplug later by itself.

Cheers,
Dave


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 02:10:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 02:10:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB11X-0007rZ-Te; Tue, 04 Oct 2011 02:10:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB10O-0007f8-7U
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 02:09:40 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-8.tower-27.messagelabs.com!1317719358!46641859!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29301 invoked from network); 4 Oct 2011 09:09:19 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 09:09:19 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317719376; l=816;
	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=hkVYbX1REY0t//MleQcD75Fqe3U=;
	b=C4t1Ug2O2P98SXKFp26if1j8IxEKBv3jCbQTIqhc0j1rP4BLSMsQA6BR/+j2DoaJWe5
	tBHSpk/vMVdWwfy8UwrRQw63LXag7SsWPCzh0PazMJu9DH6bVOqLWzB9Hzjy4xNt/DCF5
	0692dF4BrZWPCl1HTgQFS8cnUSoKNEQz1sY=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by smtp.strato.de (cohen mo46) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id D06d2fn948Lpph ;
	Tue, 4 Oct 2011 11:09:22 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 2D96518B65; Tue,  4 Oct 2011 11:09:20 +0200 (CEST)
Date: Tue, 4 Oct 2011 11:09:20 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 14 of 24] libxl: add pid path to
	libxl__spawner_starting
Message-ID: <20111004090919.GA17264@aepfle.de>
References: <patchbomb.1317657277@probook.site>
	<219ab93f22c049259568.1317657291@probook.site>
	<1317716599.21903.76.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <1317716599.21903.76.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
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, Oct 04, Ian Campbell wrote:

> On Mon, 2011-10-03 at 16:54 +0100, Olaf Hering wrote:

> > +++ b/tools/libxl/libxl_internal.h
> > @@ -250,6 +250,7 @@ typedef struct {
> >  
> >  typedef struct {
> >      char *dom_path; /* from libxl_malloc, only for libxl_spawner_record_pid */
> > +    char *pid_path; /* from libxl_malloc, only for libxl_spawner_record_pid */
> 
> Either this new comment is true and you need a strdup() up above where
> you set it and a free() somewhere else (or use libxl__strdup()) or it is
> false and it should be removed and pid_path should be const char *.
> 
> I think the second option is sufficient for the current and new user you
> are about to add?

I duplicated the dom_path line without paying attention to the comment.
A const char *pid_path; is sufficient.

Olaf

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 02:39:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 02: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 1RB1Th-0000Pp-Fh; Tue, 04 Oct 2011 02:39:57 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB1So-0000D0-G7
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 02:39:02 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1317721141!53039077!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8368 invoked from network); 4 Oct 2011 09:39:01 -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;
	4 Oct 2011 09:39:01 -0000
X-IronPort-AV: E=Sophos;i="4.68,484,1312156800"; 
   d="scan'208";a="8194731"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 09:38:58 +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, 4 Oct 2011
	10:38:58 +0100
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Dave Scott <Dave.Scott@eu.citrix.com>
Date: Tue, 4 Oct 2011 10:38:58 +0100
In-Reply-To: <81A73678E76EA642801C8F2E4823AD21BC2EE2FCCD@LONPMAILBOX01.citrite.net>
References: <patchbomb.1317389593@localhost.localdomain>
	<7c845e974def74de73f6.1317389595@localhost.localdomain>
	<81A73678E76EA642801C8F2E4823AD21BC2EE2FCCD@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: <1317721138.21903.103.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Mike McClurg <mike.mcclurg@citrix.com>, Jim Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>
Subject: [Xen-devel] RE: [PATCH 02 of 23] libxl: add a comment describing
 the device interfaces
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-04 at 09:53 +0100, Dave Scott wrote:
> Hi Ian,
> 
> I think the shape of this interface looks sensible.

Thanks for taking a look.

> [ snip ]
> > + * libxl_device_<type>_add(ctx, domid, device):
> > + *
> > + *   Adds the given device to the specified domain. This can be called
> > + *   while the guest is running (hotplug) or before boot (coldplug).
> > + *
> > + *   This function only sets up the device but does not wait for the
> > + *   domain to connect to the device and therefore cannot block on the
> > + *   guest.
> > + *
> > + *   XXX do we need a way to wait? e.g. wait_for_connect function?
> 
> I don't know about other users but xapi doesn't currently care whether a domain
> has actually connected to the device (in the sense of xenstore state = 4). 
> Xapi only cares about whether the device has been connected to the domain
> from the host's PoV; i.e. the "virtual cable" has been plugged in and the domain
> can use the device if it chooses to.

That's what I was thinking too but I expressed it badly, i.e.
wait_for_backend_setup() might be a better name / concept.

> BTW Xapi's disk hotplug command will block until it gets a completion signal
> from a backend udev script. While the command is in progress it holds a lock
> which prevents an old xenstore watch being processed which might cause xapi
> to think a async unplug has just occurred (more below)
> 
> > + *   XXX perhaps an optional way to generate an event on connect?
> > + *   needs event system overhaul.
> > + *
> > + * libxl_device_<type>_remove(ctx, domid, device):
> > + *
> > + *   Removes the given device from the specified domain by performing
> > + *   an orderly unplug with guest co-operation. This requires that the
> > + *   guest is running.
> > + *
> > + *   This method is currently synchronous and therefore can block
> > + *   while interacting with the guest.
> > + *
> > + *   XXX should provide an async version. needs event system overhaul.
> 
> Xapi normally performs a synchronous unplug, waiting for completion signaled
> via a backend udev script. However if the disk is mounted inside the domain
> and the blkfront signals an error ("02 - refusing to close" ISTR) then xapi
> stops waiting and the synchronous unplug fails. Later when the admin inside the
> guest unmounts the disk and the unplug completes, xapi's xenstore watch fires,
> it grabs a lock, checks the state of xenstore and if necessary marks the disk
> as unplugged.

Is this roughly the same as doing an async unplug followed by an event
triggered by the udev script? The only difference is whether the event
happens sooner or much later? Possibly we could have a separate "unplug
deferred" style event which triggers when we notice that the guest is
refusing to unplug, so the toolstack can at least report that fact?

> 
> BTW I've always thought this behaviour a little weird and I'm not attached to
> it :) IMHO it would be nice to have a failed unplug request cause the whole
> operation to be aborted, and not to have the device unplug later by itself.

We may find our hands tied by the existing backend/frontend
implementations here, but we can see what we can do.

Ian.


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 02:52:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 02:52:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB1fP-00017A-C5; Tue, 04 Oct 2011 02:52:03 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB1eb-0000up-Bj
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 02:51:13 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317721851!45062910!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3181 invoked from network); 4 Oct 2011 09:50:51 -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;
	4 Oct 2011 09:50:51 -0000
X-IronPort-AV: E=Sophos;i="4.68,484,1312156800"; 
   d="scan'208";a="8195143"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 09:51: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; Tue, 4 Oct 2011
	10:51:10 +0100
Subject: Re: [Xen-devel] [PATCH 00 of 24] xenpaging fixes for xen-unstable
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Olaf Hering <olaf@aepfle.de>
Date: Tue, 4 Oct 2011 10:51:09 +0100
In-Reply-To: <patchbomb.1317657277@probook.site>
References: <patchbomb.1317657277@probook.site>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317721869.21903.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 Mon, 2011-10-03 at 16:54 +0100, Olaf Hering wrote:
> The following series adds support for xenpaging to libxl and the xl command.
> A few code cleanup changes are also part of this series.
> 
> The logic of xenpaging was reversed.
> 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.
> 
> Three new configuration file options specific for xenpaging were added:
> totmem=<int>
> xenpaging_file=<string>
> xenpaging_extra=[ 'string', 'string' ]
> 
> A new xl command 'mem-tot_pages' instructs xenpaging to adjust its pagefile
> size, and it instructs the xl monitor process to actually start xenpaging if
> totmem= was not specified in the config file.

In general xl commands do not contain "_" but rather use "-". We also
sometimes use a "-set" suffix too.

totmem is unfortunately not all that descriptive to an end user of what
it does (which I think is a general problem we have with the memory
related options).

Currently the xl config file options are:
        memory = actual start of day RAM
        maxmem = max ram guest could balloon to (?)

How does POD fit in? Is it just maxmem-memory for HVM domains? (not
really relevant for this discussion, more for completeness).

The associated command line options are:
        mem-set (runtime equivalent of memory?)
        mem-max (runtime equivalent of maxmem?)

Hmm, I was hoping that enumerating the existing options would make the
name and semantics of the paging option magically pop into my head, I
was wrong :-(

BTW tools/libxl/libxl_memory.txt should be patched by this series too,
once we figure out what to call things.

The phrase "actual memory" is used in that document -- perhaps that is
suitable terminology for totmem?

Ian.

> 
> Please review and apply.
> 
> Olaf
> 
> 
>  Config.mk                        |    2 
>  config/StdGNU.mk                 |    2 
>  tools/libxc/xc_bitops.h          |    6 
>  tools/libxl/libxl.c              |  121 +++++++++
>  tools/libxl/libxl.h              |    5 
>  tools/libxl/libxl_create.c       |  146 +++++++++++
>  tools/libxl/libxl_device.c       |   84 ------
>  tools/libxl/libxl_dm.c           |   65 +----
>  tools/libxl/libxl_dom.c          |    8 
>  tools/libxl/libxl_exec.c         |  142 +++++++++++
>  tools/libxl/libxl_internal.h     |   33 ++
>  tools/libxl/libxl_paths.c        |    5 
>  tools/libxl/libxl_types.idl      |    4 
>  tools/libxl/xl.h                 |    1 
>  tools/libxl/xl_cmdimpl.c         |   71 +++++
>  tools/libxl/xl_cmdtable.c        |    5 
>  tools/xenpaging/Makefile         |    6 
>  tools/xenpaging/file_ops.c       |    6 
>  tools/xenpaging/policy_default.c |   23 +
>  tools/xenpaging/xenpaging.c      |  479 ++++++++++++++++++++++++++++-----------
>  tools/xenpaging/xenpaging.h      |    8 
>  21 files changed, 934 insertions(+), 288 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 Oct 04 03:08:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 03:08:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB1vL-0001ia-AI; Tue, 04 Oct 2011 03:08:31 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB1uD-0001W1-Gw
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 03:07:23 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1317722809!57604950!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4407 invoked from network); 4 Oct 2011 10:06:50 -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;
	4 Oct 2011 10:06:50 -0000
X-IronPort-AV: E=Sophos;i="4.68,484,1312171200"; d="scan'208";a="165609086"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 06:07:16 -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; Tue, 4 Oct 2011
	06:07:16 -0400
Message-ID: <4E8ADAD3.9050404@citrix.com>
Date: Tue, 4 Oct 2011 11:07:15 +0100
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] Re: Still struggling with HVM: tx timeouts on emulated
	nics
References: <4E7B4768.8060103@canonical.com>	<alpine.DEB.2.00.1109221838370.8700@kaball-desktop>	<4E85883C.7030808@canonical.com>	<alpine.DEB.2.00.1109301427590.3519@kaball-desktop>	<4E85E8E8.2020702@canonical.com>
	<4E860382.7040108@canonical.com>	<alpine.DEB.2.00.1110031800390.3519@kaball-desktop>
	<alpine.DEB.2.00.1110031905200.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1110031905200.3519@kaball-desktop>
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/10/11 19:13, Stefano Stabellini wrote:
> CC'ing Jan, that probably is going to have an opinion on this.
>
> Let me add a bit of background: Stefan found out that PV on HVM guests
> could loose level interrupts coming from emulated devices. Looking
> through the code I realized that we need to add some logic to inject a
> pirq in the guest if a level interrupt has been raised while the guest
> is servicing the first one.
> While this is all very specific to interrupt remapping and emulated
> devices, I realized that something similar could happen even with dom0
> or other PV guests with PCI passthrough:
>
> 1) the device raises a level interrupt and xen injects it into the
> guest;
>
> 2) the guest is temporarely stuck: it does not ack it or eoi it;
>
> 3) the xen timer kicks in and eois the interrupt;
>
> 4) the device thinks it is all fine and sends a second interrupt;
>
> 5) Xen fails to inject the second interrupt into the guest because the
> guest has still the event channel pending bit set;
>
> at this point the guest looses the second interrupt notification, that
> is not supposed to happen with level interrupts and I think it might
> cause problems with some devices.
>
> Jan, do you think we should try to handle this case, or is it too
> unlikely?

I am not certain whether this is relevant, but the ICH10 IO-APIC
documentation indicated that early EOI'ing of a line level interrupt
should not have this effect.  Specifically, it states that EOI'ing a
line level interrupt whos line is still asserted will cause the
interrupt to be "re-raised" from the IO-APIC.  It uses this to assert
that it is fine to use multiple IO-APIC entries with the same vector,
with a broadcast of vector number alone to EOI the interrupt.

In this case, while Xen sees two interrupts, from the devices point of
view, only I has happened.

In the case where the device has dropped its line level interrupt of its
own accord, then I would agree that the current Xen behavior is wrong. 
I cant offhand think of a good reason why this would occur.

I know it is not helpful in this case, but as a rule of thumb, line
level interrupts should not be used with Xen.  The average response time
on an unloaded system is ~30ms, ranging from 5 to 150.  (On a sample set
of a Dell R710, Xen 4.1.0 and 2.6.32 dom0, over 2 weeks of debugging
another line level interrupt bug).

~Andrew

> In any case we need to handle the PV on HVM remapping bug, that because
> of the way interrupts are emulated is much more likely to happen...
>
>
> On Mon, 3 Oct 2011, Stefano Stabellini wrote:
>> On Fri, 30 Sep 2011, Stefan Bader wrote:
>>> Also I did not completely remove the section that would return the status
>>> without setting needsEOI. I just changed the if condition to be <0 instead of
>>> <=0 (I knew from the tests that the mapping was always 0 and maybe the <0 check
>>> could be useful for something.
>>>
>>>         irq_status_query.flags = 0;
>>>         if ( is_hvm_domain(v->domain) &&
>>>              domain_pirq_to_irq(v->domain, irq) < 0 )
>>>         {
>>>             ret = copy_to_guest(arg, &irq_status_query, 1) ? -EFAULT : 0;
>>>             break;
>>>         }
>>>
>> You need to remove the entire test because we want to receive
>> notifications in all cases.
>>
>>
>>> With that a quick test shows both the re-sends done sometimes and the domU doing
>>> EOIs. And there is no stall apparent. Did the same quick test with the e1000
>>> emulated NIC and that still seems ok. Those were not very thorough tests but at
>>> least I would have observed a stall pretty quick otherwise.
>> I am glad it fixes the problem for you.
>>
>> I am going to send a different patch upstream for Xen 4.2, because I
>> would also like it to cover the very unlikely scenario in which a PV
>> guest (like dom0 or a PV guest with PCI passthrough) is loosing level
>> interrupts because when Xen tries to set the corresponding event channel
>> pending the bit is alreay set. The codebase is different enough that
>> making the same change on 4.1 is non-trivial. I am appending the new
>> patch to this email, it would be great if you could test it. You just
>> need a 4.2 hypervisor, not the entire system. You should be able to
>> perform the test updating only xen.gz.
>> If you have trouble if xen-unstable.hg tip, try changeset 23843.
>>
>> ---
>>
>>
>> diff -r bf533533046c xen/arch/x86/hvm/irq.c
>> --- a/xen/arch/x86/hvm/irq.c	Fri Sep 30 14:12:35 2011 +0000
>> +++ b/xen/arch/x86/hvm/irq.c	Mon Oct 03 16:54:51 2011 +0000
>> @@ -36,7 +36,8 @@ static void assert_gsi(struct domain *d,
>>  
>>      if ( hvm_domain_use_pirq(d, pirq) )
>>      {
>> -        send_guest_pirq(d, pirq);
>> +        if ( send_guest_pirq(d, pirq) && ioapic_gsi >= NR_ISAIRQS )
>> +            pirq->lost++;
>>          return;
>>      }
>>      vioapic_irq_positive_edge(d, ioapic_gsi);
>> @@ -63,6 +64,7 @@ static void __hvm_pci_intx_assert(
>>  {
>>      struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
>>      unsigned int gsi, link, isa_irq;
>> +    struct pirq *pirq;
>>  
>>      ASSERT((device <= 31) && (intx <= 3));
>>  
>> @@ -72,6 +74,11 @@ static void __hvm_pci_intx_assert(
>>      gsi = hvm_pci_intx_gsi(device, intx);
>>      if ( hvm_irq->gsi_assert_count[gsi]++ == 0 )
>>          assert_gsi(d, gsi);
>> +    else {
>> +        pirq = pirq_info(d, domain_emuirq_to_pirq(d, gsi));
>> +        if ( hvm_domain_use_pirq(d, pirq) )
>> +            pirq->lost++;
>> +    }
>>  
>>      link    = hvm_pci_intx_link(device, intx);
>>      isa_irq = hvm_irq->pci_link.route[link];
>> diff -r bf533533046c xen/arch/x86/irq.c
>> --- a/xen/arch/x86/irq.c	Fri Sep 30 14:12:35 2011 +0000
>> +++ b/xen/arch/x86/irq.c	Mon Oct 03 16:54:51 2011 +0000
>> @@ -965,7 +965,11 @@ static void __do_IRQ_guest(int irq)
>>               !test_and_set_bool(pirq->masked) )
>>              action->in_flight++;
>>          if ( !hvm_do_IRQ_dpci(d, pirq) )
>> -            send_guest_pirq(d, pirq);
>> +        {
>> +            if ( send_guest_pirq(d, pirq) &&
>> +                    action->ack_type == ACKTYPE_EOI )
>> +                pirq->lost++;
>> +        }
>>      }
>>  
>>      if ( action->ack_type != ACKTYPE_NONE )
>> diff -r bf533533046c xen/arch/x86/physdev.c
>> --- a/xen/arch/x86/physdev.c	Fri Sep 30 14:12:35 2011 +0000
>> +++ b/xen/arch/x86/physdev.c	Mon Oct 03 16:54:51 2011 +0000
>> @@ -11,6 +11,7 @@
>>  #include <asm/current.h>
>>  #include <asm/io_apic.h>
>>  #include <asm/msi.h>
>> +#include <asm/hvm/irq.h>
>>  #include <asm/hypercall.h>
>>  #include <public/xen.h>
>>  #include <public/physdev.h>
>> @@ -270,6 +271,10 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
>>          if ( !is_hvm_domain(v->domain) ||
>>               domain_pirq_to_irq(v->domain, eoi.irq) > 0 )
>>              pirq_guest_eoi(pirq);
>> +        if ( pirq->lost > 0) {
>> +            if ( !send_guest_pirq(v->domain, pirq) )
>> +                pirq->lost--;
>> +        }
>>          spin_unlock(&v->domain->event_lock);
>>          ret = 0;
>>          break;
>> @@ -328,9 +333,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;
>>          }
>>  
>> diff -r bf533533046c xen/include/xen/irq.h
>> --- a/xen/include/xen/irq.h	Fri Sep 30 14:12:35 2011 +0000
>> +++ b/xen/include/xen/irq.h	Mon Oct 03 16:54:51 2011 +0000
>> @@ -146,6 +146,7 @@ struct pirq {
>>      int pirq;
>>      u16 evtchn;
>>      bool_t masked;
>> +    u32 lost;
>>      struct rcu_head rcu_head;
>>      struct arch_pirq arch;
>>  };
>>
> _______________________________________________
> 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 Tue Oct 04 03:15:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 03:15:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB21n-0002FB-OR; Tue, 04 Oct 2011 03:15:11 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB21F-00022r-R2
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 03:14:38 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1317723248!51269635!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10576 invoked from network); 4 Oct 2011 10:14:09 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Oct 2011 10:14:09 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 11:14:34 +0100
Message-Id: <4E8AF8A70200007800059246@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 11:14:31 +0100
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] linux-2.6.18/PCI-MSI: pass segment information
	to 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

Also don't pass PCI devices with non-zero segment to the old-style
PCI device registration hypercall (converting that code to the new
call is relatively pointless, as one would at once need to change the
mechanism, since where the call currently happens doesn't guarantee
the hypervisor to get notified of all devices, and that's out of scope
for the legacy tree here).

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/drivers/pci/msi-xen.c
+++ b/drivers/pci/msi-xen.c
@@ -25,6 +25,11 @@
 #include "msi.h"
=20
 static int pci_msi_enable =3D 1;
+#if CONFIG_XEN_COMPAT < 0x040200
+static int pci_seg_supported =3D 1;
+#else
+#define pci_seg_supported 1
+#endif
=20
 static struct msi_ops *msi_ops;
=20
@@ -210,21 +215,34 @@ static int msi_map_pirq_to_vector(struct
 				  int entry_nr, u64 table_base)
 {
 	struct physdev_map_pirq map_irq;
-	int rc;
+	int rc =3D -EINVAL;
 	domid_t domid =3D DOMID_SELF;
=20
 	domid =3D msi_get_dev_owner(dev);
=20
 	map_irq.domid =3D domid;
-	map_irq.type =3D MAP_PIRQ_TYPE_MSI;
+	map_irq.type =3D MAP_PIRQ_TYPE_MSI_SEG;
 	map_irq.index =3D -1;
 	map_irq.pirq =3D pirq < 0 ? -1 : evtchn_get_xen_pirq(pirq);
-	map_irq.bus =3D dev->bus->number;
+	map_irq.bus =3D dev->bus->number | (pci_domain_nr(dev->bus) << =
16);
 	map_irq.devfn =3D dev->devfn;
 	map_irq.entry_nr =3D entry_nr;
 	map_irq.table_base =3D table_base;
=20
-	if ((rc =3D HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq)))
+	if (pci_seg_supported)
+		rc =3D HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq);=

+#if CONFIG_XEN_COMPAT < 0x040200
+	if (rc =3D=3D -EINVAL && !pci_domain_nr(dev->bus)) {
+		map_irq.type =3D MAP_PIRQ_TYPE_MSI;
+		map_irq.index =3D -1;
+		map_irq.pirq =3D -1;
+		map_irq.bus =3D dev->bus->number;
+		rc =3D HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq);=

+		if (rc !=3D -EINVAL)
+			pci_seg_supported =3D false;
+	}
+#endif
+	if (rc)
 		printk(KERN_WARNING "map irq failed\n");
=20
 	if (rc < 0)
--- a/drivers/xen/core/pci.c
+++ b/drivers/xen/core/pci.c
@@ -18,8 +18,10 @@ static int pci_bus_probe_wrapper(struct=20
 	struct physdev_manage_pci manage_pci;
 	struct physdev_manage_pci_ext manage_pci_ext;
=20
+	if (pci_domain_nr(pci_dev->bus))
+		r =3D -ENOSYS;
 #ifdef CONFIG_PCI_IOV
-	if (pci_dev->is_virtfn) {
+	else if (pci_dev->is_virtfn) {
 		memset(&manage_pci_ext, 0, sizeof(manage_pci_ext));
 		manage_pci_ext.bus =3D pci_dev->bus->number;
 		manage_pci_ext.devfn =3D pci_dev->devfn;
@@ -28,9 +30,9 @@ static int pci_bus_probe_wrapper(struct=20
 		manage_pci_ext.physfn.devfn =3D pci_dev->physfn->devfn;
 		r =3D HYPERVISOR_physdev_op(PHYSDEVOP_manage_pci_add_ext,
 					  &manage_pci_ext);
-	} else
+	}
 #endif
-	if (pci_ari_enabled(pci_dev->bus) && PCI_SLOT(pci_dev->devfn)) {
+	else if (pci_ari_enabled(pci_dev->bus) && PCI_SLOT(pci_dev->devfn))=
 {
 		memset(&manage_pci_ext, 0, sizeof(manage_pci_ext));
 		manage_pci_ext.bus =3D pci_dev->bus->number;
 		manage_pci_ext.devfn =3D pci_dev->devfn;
@@ -54,6 +56,7 @@ static int pci_bus_remove_wrapper(struct
 {
 	int r;
 	struct pci_dev *pci_dev =3D to_pci_dev(dev);
+	int seg =3D pci_domain_nr(pci_dev->bus);
 	struct physdev_manage_pci manage_pci;
 	manage_pci.bus =3D pci_dev->bus->number;
 	manage_pci.devfn =3D pci_dev->devfn;
@@ -60,6 +63,8 @@ static int pci_bus_remove_wrapper(struct
=20
 	r =3D pci_bus_remove(dev);
 	/* dev and pci_dev are no longer valid!! */
+	if (seg)
+		return r;
=20
 	WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_manage_pci_remove,
 		&manage_pci));




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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 03:31:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 03:31:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB2HX-0002qX-2J; Tue, 04 Oct 2011 03:31:27 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB2Gc-0002e4-Dd
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 03:30:30 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1317724208!47157851!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20920 invoked from network); 4 Oct 2011 10:30:08 -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; 4 Oct 2011 10:30:08 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 11:30:27 +0100
Message-Id: <4E8AFC5F020000780005924F@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 11:30:23 +0100
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] linux-2.6.18/x86-64: extend numeric user mode
	selector checks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 also cover Xen provided ones

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/arch/x86_64/mm/fault-xen.c
+++ b/arch/x86_64/mm/fault-xen.c
@@ -146,7 +146,8 @@ static noinline int is_prefetch(struct p
 			/* Could check the LDT for lm, but for now it's =
good
 			   enough to assume that long mode only uses well =
known
 			   segments or kernel. */
-			scan_more =3D (!user_mode(regs)) || (regs->cs =
=3D=3D __USER_CS);
+			scan_more =3D (!user_mode(regs)) || (regs->cs =
=3D=3D __USER_CS)
+				    || (regs->cs =3D=3D FLAT_USER_CS64);
 			break;
 		=09
 		case 0x60:
@@ -575,8 +576,8 @@ bad_area_nosemaphore:
 		   these addresses are not reachable. Just detect this
 		   case and return.  Any code segment in LDT is
 		   compatibility mode. */
-		if ((regs->cs =3D=3D __USER32_CS || (regs->cs & (1<<2))) =
&&
-		    (address >> 32))
+		if ((regs->cs =3D=3D __USER32_CS || regs->cs =3D=3D =
FLAT_USER_CS32 ||
+		     (regs->cs & (1<<2))) && (address >> 32))
 			return;
=20
 		if (exception_trace && unhandled_signal(tsk, SIGSEGV)) {




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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 03:59:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 03:59:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB2it-0003qE-V6; Tue, 04 Oct 2011 03:59:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB2gi-0003cg-NK
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 03:57:29 -0700
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1317725817!57616811!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5843 invoked from network); 4 Oct 2011 10:56:57 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 10:56:57 -0000
Received: by eye3 with SMTP id 3so666023eye.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 03:57:24 -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
	:content-transfer-encoding;
	bh=vVYYycm/mX9cglwbzdPmtaiy/JV9JUzPyjTqzl/Sg/4=;
	b=DhcDtUEMRQiDKgKXC5Q8FZjgBXIzfvY3WVBVg4MdhPDzdbYrB/Ie2AO1yRD18UCaK+
	DssI0/eKxrjmiKTZ3w4eodzkSPuVWDOe8O1v6Bc06typ0Uezje0iMU/aHjFDyDrtNdTO
	NhgoPE0aTs9H9TC73eXz3kddCgUbFVUTxZX5o=
MIME-Version: 1.0
Received: by 10.223.8.2 with SMTP id f2mr1590872faf.23.1317725844860; Tue, 04
	Oct 2011 03:57:24 -0700 (PDT)
Received: by 10.223.72.205 with HTTP; Tue, 4 Oct 2011 03:57:24 -0700 (PDT)
Date: Tue, 4 Oct 2011 19:57:24 +0900
Message-ID: <CAP2B85_LhqE9F53FAJ3ez3+GDichDTcWiau=x2zdftqGdcADag@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] Help with test_and_clear_bit on 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

Hello List,

I have been trying for several days to be able to wait for events and
then continue execution based on the event received. My problem is in
the wait_ring function of xenbus.c
After debugging my test_and_clear_bit I corrected the error that
allows me to receive ONE event, but after that the bit is never set
again. My offset is always 2 (nr eq 2).
Please, can someone explain me how struct shared_info and these two
fields control the events that I can receive?
unsigned long evtchn_pending[sizeof(unsigned long) * 8];
unsigned long evtchn_mask[sizeof(unsigned long) * 8];

I print the whole array Bit by Bit and I do not see a difference after
the arrival of the event and before the arrival.

I also checked struct vcpu_info fields: u8 evtchn_upcall_pending and
u8 evtchn_upcall_mask to see if they are disabling the event delivery.
No changes before or after.

Thank you very much for everyones time,

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 Tue Oct 04 04:04:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 04:04:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB2nq-0004J9-HA; Tue, 04 Oct 2011 04:04:51 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB2lr-00045p-QT
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 04:02:55 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1317726147!45087516!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25118 invoked from network); 4 Oct 2011 11:02:27 -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;
	4 Oct 2011 11:02:27 -0000
X-IronPort-AV: E=Sophos;i="4.68,484,1312156800"; 
   d="scan'208";a="8196926"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 11:02:44 +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, 4 Oct 2011
	12:02:44 +0100
Subject: Re: [Xen-devel] Help with test_and_clear_bit on events
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
Date: Tue, 4 Oct 2011 12:02:43 +0100
In-Reply-To: <CAP2B85_LhqE9F53FAJ3ez3+GDichDTcWiau=x2zdftqGdcADag@mail.gmail.com>
References: <CAP2B85_LhqE9F53FAJ3ez3+GDichDTcWiau=x2zdftqGdcADag@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: <1317726163.21903.113.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-10-04 at 11:57 +0100, Daniel Castro wrote:
> Hello List,
> 
> I have been trying for several days to be able to wait for events and
> then continue execution based on the event received. My problem is in
> the wait_ring function of xenbus.c
> After debugging my test_and_clear_bit I corrected the error that
> allows me to receive ONE event, but after that the bit is never set
> again. My offset is always 2 (nr eq 2).
> Please, can someone explain me how struct shared_info and these two
> fields control the events that I can receive?
> unsigned long evtchn_pending[sizeof(unsigned long) * 8];
> unsigned long evtchn_mask[sizeof(unsigned long) * 8];
> 
> I print the whole array Bit by Bit and I do not see a difference after
> the arrival of the event and before the arrival.
> 
> I also checked struct vcpu_info fields: u8 evtchn_upcall_pending and
> u8 evtchn_upcall_mask to see if they are disabling the event delivery.
> No changes before or after.

If git://github.com/evildani/seabios_patch.git master is up to date
then:
    shared_info = malloc_high(sizeof(shared_info));
    xatp.gpfn  = ((unsigned long)shared_info << PAGE_SHIFT);
is wrong and you aren't registering the correct shared_info so you
aren't actually looking at the right bits, the change in behaviour is
just because you are now looking at different wrong bits.

You need ">>" not "<<" (consider the relation between addresses and page
numbers...).

Ian.



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 04:23:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 04:23:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB364-0005gU-J7; Tue, 04 Oct 2011 04:23:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB35E-0005U5-VH
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 04:22:49 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1317727346!47170257!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31942 invoked from network); 4 Oct 2011 11:22:26 -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; 4 Oct 2011 11:22:26 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 12:22:45 +0100
Message-Id: <4E8B08A10200007800059278@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 12:22:41 +0100
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: Allen M Kay <allen.m.kay@intel.com>
Subject: [Xen-devel] [PATCH] passthrough: update bus2bridge mapping as PCI
	devices get added/removed
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 deals with two limitations at once: On device removal, the
mapping did not get updated so far at all, and hotplugged devices as
well as such not discoverable by Xen's initial bus scan (including the
case where a non-zero PCI segment wasn't accessible during Xen boot,
but became accessible after Dom0 validated access information against
ACPI data) wouldn't cause updates to the mapping either.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/passthrough/pci.c
+++ b/xen/drivers/passthrough/pci.c
@@ -129,11 +129,67 @@ static struct pci_dev *alloc_pdev(struct
     list_add(&pdev->alldevs_list, &pseg->alldevs_list);
     spin_lock_init(&pdev->msix_table_lock);
=20
+    /* update bus2bridge */
+    switch ( pdev_type(pseg->nr, bus, devfn) )
+    {
+        u8 sec_bus, sub_bus;
+
+        case DEV_TYPE_PCIe_BRIDGE:
+            break;
+
+        case DEV_TYPE_PCIe2PCI_BRIDGE:
+        case DEV_TYPE_LEGACY_PCI_BRIDGE:
+            sec_bus =3D pci_conf_read8(pseg->nr, bus, PCI_SLOT(devfn),
+                                     PCI_FUNC(devfn), PCI_SECONDARY_BUS);
+            sub_bus =3D pci_conf_read8(pseg->nr, bus, PCI_SLOT(devfn),
+                                     PCI_FUNC(devfn), PCI_SUBORDINATE_BUS)=
;
+
+            spin_lock(&pseg->bus2bridge_lock);
+            for ( ; sec_bus <=3D sub_bus; sec_bus++ )
+            {
+                pseg->bus2bridge[sec_bus].map =3D 1;
+                pseg->bus2bridge[sec_bus].bus =3D bus;
+                pseg->bus2bridge[sec_bus].devfn =3D devfn;
+            }
+            spin_unlock(&pseg->bus2bridge_lock);
+            break;
+
+        case DEV_TYPE_PCIe_ENDPOINT:
+        case DEV_TYPE_PCI:
+            break;
+
+        default:
+            printk(XENLOG_WARNING "%s: unknown type: %04x:%02x:%02x.%u\n",=

+                   __func__, pseg->nr, bus, PCI_SLOT(devfn), PCI_FUNC(devf=
n));
+            break;
+    }
+
     return pdev;
 }
=20
-static void free_pdev(struct pci_dev *pdev)
+static void free_pdev(struct pci_seg *pseg, struct pci_dev *pdev)
 {
+    /* update bus2bridge */
+    switch ( pdev_type(pseg->nr, pdev->bus, pdev->devfn) )
+    {
+        u8 dev, func, sec_bus, sub_bus;
+
+        case DEV_TYPE_PCIe2PCI_BRIDGE:
+        case DEV_TYPE_LEGACY_PCI_BRIDGE:
+            dev =3D PCI_SLOT(pdev->devfn);
+            func =3D PCI_FUNC(pdev->devfn);
+            sec_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func,
+                                     PCI_SECONDARY_BUS);
+            sub_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func,
+                                     PCI_SUBORDINATE_BUS);
+
+            spin_lock(&pseg->bus2bridge_lock);
+            for ( ; sec_bus <=3D sub_bus; sec_bus++ )
+                pseg->bus2bridge[sec_bus] =3D pseg->bus2bridge[pdev->bus];=

+            spin_unlock(&pseg->bus2bridge_lock);
+            break;
+    }
+
     list_del(&pdev->alldevs_list);
     xfree(pdev);
 }
@@ -377,7 +433,7 @@ int pci_remove_device(u16 seg, u8 bus, u
             if ( pdev->domain )
                 list_del(&pdev->domain_list);
             pci_cleanup_msi(pdev);
-            free_pdev(pdev);
+            free_pdev(pseg, pdev);
             printk(XENLOG_DEBUG "PCI remove device %04x:%02x:%02x.%u\n",
                    seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
             break;
@@ -545,8 +601,6 @@ static int __init _scan_pci_devices(stru
 {
     struct pci_dev *pdev;
     int bus, dev, func;
-    u8 sec_bus, sub_bus;
-    int type;
=20
     for ( bus =3D 0; bus < 256; bus++ )
     {
@@ -564,41 +618,6 @@ static int __init _scan_pci_devices(stru
                     return -ENOMEM;
                 }
=20
-                /* build bus2bridge */
-                type =3D pdev_type(pseg->nr, bus, PCI_DEVFN(dev, func));
-                switch ( type )
-                {
-                    case DEV_TYPE_PCIe_BRIDGE:
-                        break;
-
-                    case DEV_TYPE_PCIe2PCI_BRIDGE:
-                    case DEV_TYPE_LEGACY_PCI_BRIDGE:
-                        sec_bus =3D pci_conf_read8(pseg->nr, bus, dev, =
func,
-                                                 PCI_SECONDARY_BUS);
-                        sub_bus =3D pci_conf_read8(pseg->nr, bus, dev, =
func,
-                                                 PCI_SUBORDINATE_BUS);
-
-                        spin_lock(&pseg->bus2bridge_lock);
-                        for ( sub_bus &=3D 0xff; sec_bus <=3D sub_bus; =
sec_bus++ )
-                        {
-                            pseg->bus2bridge[sec_bus].map =3D 1;
-                            pseg->bus2bridge[sec_bus].bus =3D bus;
-                            pseg->bus2bridge[sec_bus].devfn =3D
-                                PCI_DEVFN(dev, func);
-                        }
-                        spin_unlock(&pseg->bus2bridge_lock);
-                        break;
-
-                    case DEV_TYPE_PCIe_ENDPOINT:
-                    case DEV_TYPE_PCI:
-                        break;
-
-                    default:
-                        printk("%s: unknown type: %04x:%02x:%02x.%u\n",
-                               __func__, pseg->nr, bus, dev, func);
-                        return -EINVAL;
-                }
-
                 if ( !func && !(pci_conf_read8(pseg->nr, bus, dev, func,
                                                PCI_HEADER_TYPE) & 0x80) )
                     break;



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 04:25:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 04:25:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB37X-000648-55; Tue, 04 Oct 2011 04:25:11 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB360-0005eH-GI
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 04:23:36 -0700
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1317727413!30133911!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1513 invoked from network); 4 Oct 2011 11:23:33 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 11:23:33 -0000
Received: by eye3 with SMTP id 3so712023eye.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 04:23: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:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=Zd+sN1wz3cpnJrR8YJ+2BF34qTjsz1x1IRWLsPcZIV0=;
	b=HA5cCeaQ1udnKQ3kO3g3JxTwomr9jB+xjcujLxDMkjk66/biifftddbyobMN8VMEfY
	WjlORNxfZX0plpUYDPHZMg7D6+dTRa8oYJpK7xUHpvAtNsJb43G4oVUHppLtykcZ5gh1
	e5onstgloziHVgXiSjJ6y41uSZf8iHtOOcD0E=
MIME-Version: 1.0
Received: by 10.223.44.89 with SMTP id z25mr1611734fae.42.1317727411719; Tue,
	04 Oct 2011 04:23:31 -0700 (PDT)
Received: by 10.223.72.205 with HTTP; Tue, 4 Oct 2011 04:23:31 -0700 (PDT)
In-Reply-To: <1317726163.21903.113.camel@zakaz.uk.xensource.com>
References: <CAP2B85_LhqE9F53FAJ3ez3+GDichDTcWiau=x2zdftqGdcADag@mail.gmail.com>
	<1317726163.21903.113.camel@zakaz.uk.xensource.com>
Date: Tue, 4 Oct 2011 20:23:31 +0900
Message-ID: <CAP2B85-HDdsrhsUJv1b3sq4D5LnvX8NhAVg0ZbnBuVe_0w=MzA@mail.gmail.com>
Subject: Re: [Xen-devel] Help with test_and_clear_bit on events
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 Tue, Oct 4, 2011 at 8:02 PM, Ian Campbell <Ian.Campbell@citrix.com> wrot=
e:
> On Tue, 2011-10-04 at 11:57 +0100, Daniel Castro wrote:
>> Hello List,
>>
>> I have been trying for several days to be able to wait for events and
>> then continue execution based on the event received. My problem is in
>> the wait_ring function of xenbus.c
>> After debugging my test_and_clear_bit I corrected the error that
>> allows me to receive ONE event, but after that the bit is never set
>> again. My offset is always 2 (nr eq 2).
>> Please, can someone explain me how struct shared_info and these two
>> fields control the events that I can receive?
>> unsigned long evtchn_pending[sizeof(unsigned long) * 8];
>> unsigned long evtchn_mask[sizeof(unsigned long) * 8];
>>
>> I print the whole array Bit by Bit and I do not see a difference after
>> the arrival of the event and before the arrival.
>>
>> I also checked struct vcpu_info fields: u8 evtchn_upcall_pending and
>> u8 evtchn_upcall_mask to see if they are disabling the event delivery.
>> No changes before or after.
>
> If git://github.com/evildani/seabios_patch.git master is up to date
> then:
> =A0 =A0shared_info =3D malloc_high(sizeof(shared_info));
> =A0 =A0xatp.gpfn =A0=3D ((unsigned long)shared_info << PAGE_SHIFT);
> is wrong and you aren't registering the correct shared_info so you
> aren't actually looking at the right bits, the change in behaviour is
> just because you are now looking at different wrong bits.
>
> You need ">>" not "<<" (consider the relation between addresses and page
> numbers...).

Thanks, sorry for the typo, I just corrected it, the same behavior persists=
.

The output for shinfo->evtchn_pending[2] is
11001100110011001100110011001100, which bit am I supposed to change?
Here I am confused.
Also I have: VCPU.0 evtchn_upcall_mask 11000010 AND evntchn_pending 1100001=
0

Sorry but I am somewhat confused by all this. Is this documented somewhere?

Million Thanks again!

>
> 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 Tue Oct 04 04:31:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 04:31:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3DH-0006VX-5o; Tue, 04 Oct 2011 04:31:07 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB3CR-0006J6-GB
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 04:30:16 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1317727784!57624960!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30723 invoked from network); 4 Oct 2011 11:29:44 -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; 4 Oct 2011 11:29:44 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 12:30:12 +0100
Message-Id: <4E8B0A5F0200007800059286@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 12:30:07 +0100
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: Allen M Kay <allen.m.kay@intel.com>
Subject: [Xen-devel] [PATCH] VT-d: don't reject possibly valid DRHD or RMRR
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 a non-zero PCI segment isn't accessible during Xen boot (because
firmware decided to not enter the necessary MMIO space into the E820
table), devices referred to on those segments through DRHD or RMRR
structures should not be rejected just because the devices can't be
found.

This is in line with what is being done in at least one other case
already: Systems with more than one PCI segment (usually high end
ones) are assumed to have valid firmware provided data, while systems
with just segment 0 continue to have their firmware tables validated.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/passthrough/pci.c
+++ b/xen/drivers/passthrough/pci.c
@@ -53,6 +53,11 @@ static inline struct pci_seg *get_pseg(u
     return radix_tree_lookup(&pci_segments, seg);
 }
=20
+bool_t pci_known_segment(u16 seg)
+{
+    return get_pseg(seg) !=3D NULL;
+}
+
 static struct pci_seg *alloc_pseg(u16 seg)
 {
     struct pci_seg *pseg =3D get_pseg(seg);
--- a/xen/drivers/passthrough/vtd/dmar.c
+++ b/xen/drivers/passthrough/vtd/dmar.c
@@ -444,10 +444,14 @@ acpi_parse_one_drhd(struct acpi_dmar_ent
     else
     {
         u8 b, d, f;
-        int i, invalid_cnt =3D 0;
+        unsigned int i =3D 0, invalid_cnt =3D 0;
         void *p;
=20
-        for ( i =3D 0, p =3D dev_scope_start; i < dmaru->scope.devices_cnt=
;
+        /* Skip checking if segment is not accessible yet. */
+        if ( !pci_known_segment(drhd->segment) )
+            i =3D UINT_MAX;
+
+        for ( p =3D dev_scope_start; i < dmaru->scope.devices_cnt;
               i++, p +=3D ((struct acpi_dev_scope *)p)->length )
         {
             if ( ((struct acpi_dev_scope *)p)->dev_type =3D=3D ACPI_DEV_IO=
APIC ||
@@ -549,7 +553,12 @@ acpi_parse_one_rmrr(struct acpi_dmar_ent
     else
     {
         u8 b, d, f;
-        int i, ignore =3D 0;
+        bool_t ignore =3D 0;
+        unsigned int i =3D 0;
+
+        /* Skip checking if segment is not accessible yet. */
+        if ( !pci_known_segment(rmrr->segment) )
+            i =3D UINT_MAX;
=20
         for ( i =3D 0; i < rmrru->scope.devices_cnt; i++ )
         {
--- a/xen/include/xen/pci.h
+++ b/xen/include/xen/pci.h
@@ -82,6 +82,7 @@ enum {
     DEV_TYPE_PCI,
 };
=20
+bool_t pci_known_segment(u16 seg);
 int pci_device_detect(u16 seg, u8 bus, u8 dev, u8 func);
 int scan_pci_devices(void);
 int pdev_type(u16 seg, u8 bus, u8 devfn);




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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 04:33:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 04:33:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3FI-00075g-Eq; Tue, 04 Oct 2011 04:33:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB3Eb-0006mb-HW
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 04:32:29 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1317727927!47172929!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25555 invoked from network); 4 Oct 2011 11:32:07 -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; 4 Oct 2011 11:32:07 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 12:32:26 +0100
Message-Id: <4E8B0AE60200007800059289@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 12:32:22 +0100
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: Jun Nakajima <jun.nakajima@intel.com>,
	Donald D Dugger <donald.d.dugger@intel.com>
Subject: [Xen-devel] [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

There are still a couple of family 6 models missing here: 37, 44, 46,
and 47 (according to SDM doc changes May 2011); presumably they would
all go into the Nehalem/Sandy Bridge group. Intel?

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -1693,6 +1693,20 @@ static const struct lbr_info {
     { MSR_C2_LASTBRANCH_0_FROM_IP,  NUM_MSR_C2_LASTBRANCH_FROM_TO },
     { MSR_C2_LASTBRANCH_0_TO_IP,    NUM_MSR_C2_LASTBRANCH_FROM_TO },
     { 0, 0 }
+}, nh_lbr[] =3D {
+    { MSR_IA32_LASTINTFROMIP,       1 },
+    { MSR_IA32_LASTINTTOIP,         1 },
+    { MSR_C2_LASTBRANCH_TOS,        1 },
+    { MSR_P4_LASTBRANCH_0_FROM_LIP, NUM_MSR_P4_LASTBRANCH_FROM_TO },
+    { MSR_P4_LASTBRANCH_0_TO_LIP,   NUM_MSR_P4_LASTBRANCH_FROM_TO },
+    { 0, 0 }
+}, at_lbr[] =3D {
+    { MSR_IA32_LASTINTFROMIP,       1 },
+    { MSR_IA32_LASTINTTOIP,         1 },
+    { MSR_C2_LASTBRANCH_TOS,        1 },
+    { MSR_C2_LASTBRANCH_0_FROM_IP,  NUM_MSR_ATOM_LASTBRANCH_FROM_TO },
+    { MSR_C2_LASTBRANCH_0_TO_IP,    NUM_MSR_ATOM_LASTBRANCH_FROM_TO },
+    { 0, 0 }
 #ifdef __i386__
 }, pm_lbr[] =3D {
     { MSR_IA32_LASTINTFROMIP,       1 },
@@ -1720,8 +1734,20 @@ static const struct lbr_info *last_branc
 #endif
         /* Core2 Duo */
         case 15:
+        /* Enhanced Core */
+        case 23:
             return c2_lbr;
             break;
+        /* Nehalem */
+        case 26: case 30: case 31: case 46:
+        /* Sandy Bridge */
+        case 42: case 45:
+            return nh_lbr;
+            break;
+        /* Atom */
+        case 28:
+            return at_lbr;
+            break;
         }
         break;
=20
--- a/xen/include/asm-x86/msr-index.h
+++ b/xen/include/asm-x86/msr-index.h
@@ -472,11 +472,12 @@
 #define MSR_PM_LASTBRANCH_0		0x00000040
 #define NUM_MSR_PM_LASTBRANCH		8
=20
-/* Core 2 last-branch recording */
+/* Core 2 and Atom last-branch recording */
 #define MSR_C2_LASTBRANCH_TOS		0x000001c9
 #define MSR_C2_LASTBRANCH_0_FROM_IP	0x00000040
 #define MSR_C2_LASTBRANCH_0_TO_IP	0x00000060
 #define NUM_MSR_C2_LASTBRANCH_FROM_TO	4
+#define NUM_MSR_ATOM_LASTBRANCH_FROM_TO	8
=20
 /* Intel Core-based CPU performance counters */
 #define MSR_CORE_PERF_FIXED_CTR0	0x00000309




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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 04:35:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 04:35:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3HT-0007Ue-Om; Tue, 04 Oct 2011 04:35:27 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB3Go-0007ID-Aa
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 04:34:46 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1317728082!33809653!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7542 invoked from network); 4 Oct 2011 11:34:43 -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; 4 Oct 2011 11:34:43 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 12:34:42 +0100
Message-Id: <4E8B0B70020000780005929A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 12:34:40 +0100
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] AMD-IOMMU: remove dead variable references
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

These got orphaned up by recent changes.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
@@ -26,9 +26,6 @@
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
=20
-extern bool_t __read_mostly opt_irq_perdev_vector_map;
-extern bool_t __read_mostly iommu_amd_perdev_vector_map;
-
 struct amd_iommu *find_iommu_for_device(int seg, int bdf)
 {
     struct ivrs_mappings *ivrs_mappings =3D get_ivrs_mappings(seg);
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -50,7 +50,6 @@ bool_t __read_mostly iommu_qinval =3D 1;
 bool_t __read_mostly iommu_intremap =3D 1;
 bool_t __read_mostly iommu_hap_pt_share =3D 1;
 bool_t __read_mostly iommu_debug;
-bool_t __read_mostly iommu_amd_perdev_vector_map =3D 1;
 bool_t __read_mostly amd_iommu_perdev_intremap;
=20
 static void __init parse_iommu_param(char *s)
@@ -86,8 +85,6 @@ static void __init parse_iommu_param(cha
             iommu_dom0_strict =3D 1;
         else if ( !strcmp(s, "sharept") )
             iommu_hap_pt_share =3D 1;
-        else if ( !strcmp(s, "no-perdev-vector-map") )
-            iommu_amd_perdev_vector_map =3D 0;
=20
         s =3D ss + 1;
     } while ( ss );




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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 04:48:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 04:48:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3Tr-0000Mg-Hr; Tue, 04 Oct 2011 04:48:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB3TF-00008X-Rp
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 04:47:38 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1317728854!18047118!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32109 invoked from network); 4 Oct 2011 11:47:34 -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; 4 Oct 2011 11:47:34 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 12:47:34 +0100
Message-Id: <4E8B0E7202000078000592AC@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 12:47:30 +0100
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/4] introduce and use xzalloc()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Rather than having to match a call to one of the xmalloc() flavors with
a subsequent memset(), introduce a zeroing variant of each of those
flavors.

1: introduce xzalloc() & Co
2: use xzalloc in common code
3: use xzalloc in driver code
4: use xzalloc in x86 code

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 Tue Oct 04 04:49:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 04:49:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3Up-0000k4-V0; Tue, 04 Oct 2011 04:49:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB3Tf-0000Ga-W8
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 04:48:04 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1317728880!19640181!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32122 invoked from network); 4 Oct 2011 11:48:01 -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; 4 Oct 2011 11:48:01 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 12:48:00 +0100
Message-Id: <4E8B0E8E02000078000592AF@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 12:47:58 +0100
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 1/4] introduce xzalloc() & Co
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Rather than having to match a call to one of the xmalloc() flavors with
a subsequent memset(), introduce a zeroing variant of each of those
flavors.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/xmalloc_tlsf.c
+++ b/xen/common/xmalloc_tlsf.c
@@ -585,6 +585,13 @@ void *_xmalloc(unsigned long size, unsig
     return p;
 }
=20
+void *_xzalloc(unsigned long size, unsigned long align)
+{
+    void *p =3D _xmalloc(size, align);
+
+    return p ? memset(p, 0, size) : p;
+}
+
 void xfree(void *p)
 {
     struct bhdr *b;
--- a/xen/include/acpi/platform/aclinux.h
+++ b/xen/include/acpi/platform/aclinux.h
@@ -77,10 +77,7 @@
 #define acpi_thread_id struct vcpu *
=20
 #define ACPI_ALLOCATE(a)	xmalloc_bytes(a)
-#define ACPI_ALLOCATE_ZEROED(a)	({              \
-    void *p =3D xmalloc_bytes(a);                 \
-    if ( p ) memset(p, 0, a);                   \
-    p; })
+#define ACPI_ALLOCATE_ZEROED(a)	xzalloc_bytes(a)
 #define ACPI_FREE(a)		xfree(a)
=20
 #endif				/* __ACLINUX_H__ */
--- a/xen/include/xen/xmalloc.h
+++ b/xen/include/xen/xmalloc.h
@@ -11,19 +11,25 @@
=20
 /* Allocate space for typed object. */
 #define xmalloc(_type) ((_type *)_xmalloc(sizeof(_type), __alignof__(_type=
)))
+#define xzalloc(_type) ((_type *)_xzalloc(sizeof(_type), __alignof__(_type=
)))
=20
 /* Allocate space for array of typed objects. */
 #define xmalloc_array(_type, _num) \
     ((_type *)_xmalloc_array(sizeof(_type), __alignof__(_type), _num))
+#define xzalloc_array(_type, _num) \
+    ((_type *)_xzalloc_array(sizeof(_type), __alignof__(_type), _num))
=20
 /* Allocate untyped storage. */
-#define xmalloc_bytes(_bytes) (_xmalloc(_bytes, SMP_CACHE_BYTES))
+#define xmalloc_bytes(_bytes) _xmalloc(_bytes, SMP_CACHE_BYTES)
+#define xzalloc_bytes(_bytes) _xzalloc(_bytes, SMP_CACHE_BYTES)
=20
 /* Free any of the above. */
 extern void xfree(void *);
=20
 /* Underlying functions */
 extern void *_xmalloc(unsigned long size, unsigned long align);
+extern void *_xzalloc(unsigned long size, unsigned long align);
+
 static inline void *_xmalloc_array(
     unsigned long size, unsigned long align, unsigned long num)
 {
@@ -33,6 +39,15 @@ static inline void *_xmalloc_array(
  	return _xmalloc(size * num, align);
 }
=20
+static inline void *_xzalloc_array(
+    unsigned long size, unsigned long align, unsigned long num)
+{
+    /* Check for overflow. */
+    if (size && num > UINT_MAX / size)
+        return NULL;
+    return _xzalloc(size * num, align);
+}
+
 /*
  * Pooled allocator interface.
  */




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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 04:50:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 04:50:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3Vp-00017L-V0; Tue, 04 Oct 2011 04:50:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB3U1-0000P9-BL
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 04:48:26 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1317728901!33824265!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7011 invoked from network); 4 Oct 2011 11:48:22 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Oct 2011 11:48:22 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 12:48:21 +0100
Message-Id: <4E8B0EA302000078000592B2@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 12:48:19 +0100
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 2/4] use xzalloc in 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

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/cpupool.c
+++ b/xen/common/cpupool.c
@@ -39,7 +39,7 @@ DEFINE_PER_CPU(struct cpupool *, cpupool
=20
 static struct cpupool *alloc_cpupool_struct(void)
 {
-    return xmalloc(struct cpupool);
+    return xzalloc(struct cpupool);
 }
=20
 static void free_cpupool_struct(struct cpupool *c)
@@ -118,7 +118,6 @@ static struct cpupool *cpupool_create(
     *perr =3D -ENOMEM;
     if ( (c =3D alloc_cpupool_struct()) =3D=3D NULL )
         return NULL;
-    memset(c, 0, sizeof(*c));
=20
     /* One reference for caller, one reference for cpupool_destroy(). */
     atomic_set(&c->refcnt, 2);
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -154,11 +154,9 @@ static unsigned int default_vcpu0_locati
=20
     /* Do an initial CPU placement. Pick the least-populated CPU. */
     nr_cpus =3D last_cpu(cpu_online_map) + 1;
-    cnt =3D xmalloc_array(unsigned int, nr_cpus);
+    cnt =3D xzalloc_array(unsigned int, nr_cpus);
     if ( cnt )
     {
-        memset(cnt, 0, nr_cpus * sizeof(*cnt));
-
         rcu_read_lock(&domlist_read_lock);
         for_each_domain ( d )
             for_each_vcpu ( d, v )
@@ -510,9 +508,8 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
             BUG_ON(d->vcpu !=3D NULL);
             BUG_ON(d->max_vcpus !=3D 0);
=20
-            if ( (vcpus =3D xmalloc_array(struct vcpu *, max)) =3D=3D =
NULL )
+            if ( (vcpus =3D xzalloc_array(struct vcpu *, max)) =3D=3D =
NULL )
                 goto maxvcpu_out;
-            memset(vcpus, 0, max * sizeof(*vcpus));
=20
             /* Install vcpu array /then/ update max_vcpus. */
             d->vcpu =3D vcpus;
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -100,10 +100,9 @@ static int get_free_port(struct domain *
     if ( port =3D=3D MAX_EVTCHNS(d) )
         return -ENOSPC;
=20
-    chn =3D xmalloc_array(struct evtchn, EVTCHNS_PER_BUCKET);
+    chn =3D xzalloc_array(struct evtchn, EVTCHNS_PER_BUCKET);
     if ( unlikely(chn =3D=3D NULL) )
         return -ENOMEM;
-    memset(chn, 0, EVTCHNS_PER_BUCKET * sizeof(*chn));
     bucket_from_port(d, port) =3D chn;
=20
     for ( i =3D 0; i < EVTCHNS_PER_BUCKET; i++ )
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -2400,19 +2400,17 @@ grant_table_create(
     struct grant_table *t;
     int                 i;
=20
-    if ( (t =3D xmalloc(struct grant_table)) =3D=3D NULL )
+    if ( (t =3D xzalloc(struct grant_table)) =3D=3D NULL )
         goto no_mem_0;
=20
     /* Simple stuff. */
-    memset(t, 0, sizeof(*t));
     spin_lock_init(&t->lock);
     t->nr_grant_frames =3D INITIAL_NR_GRANT_FRAMES;
=20
     /* Active grant table. */
-    if ( (t->active =3D xmalloc_array(struct active_grant_entry *,
+    if ( (t->active =3D xzalloc_array(struct active_grant_entry *,
                                     max_nr_active_grant_frames())) =3D=3D =
NULL )
         goto no_mem_1;
-    memset(t->active, 0, max_nr_active_grant_frames() * sizeof(t->active[0=
]));
     for ( i =3D 0;
           i < num_act_frames_from_sha_frames(INITIAL_NR_GRANT_FRAMES); =
i++ )
     {
@@ -2422,10 +2420,9 @@ grant_table_create(
     }
=20
     /* Tracking of mapped foreign frames table */
-    if ( (t->maptrack =3D xmalloc_array(struct grant_mapping *,
+    if ( (t->maptrack =3D xzalloc_array(struct grant_mapping *,
                                       max_nr_maptrack_frames())) =3D=3D =
NULL )
         goto no_mem_2;
-    memset(t->maptrack, 0, max_nr_maptrack_frames() * sizeof(t->maptrack[0=
]));
     if ( (t->maptrack[0] =3D alloc_xenheap_page()) =3D=3D NULL )
         goto no_mem_3;
     clear_page(t->maptrack[0]);
@@ -2434,9 +2431,8 @@ grant_table_create(
         t->maptrack[0][i].ref =3D i+1;
=20
     /* Shared grant table. */
-    if ( (t->shared_raw =3D xmalloc_array(void *, max_nr_grant_frames)) =
=3D=3D NULL )
+    if ( (t->shared_raw =3D xzalloc_array(void *, max_nr_grant_frames)) =
=3D=3D NULL )
         goto no_mem_3;
-    memset(t->shared_raw, 0, max_nr_grant_frames * sizeof(t->shared_raw[0]=
));
     for ( i =3D 0; i < INITIAL_NR_GRANT_FRAMES; i++ )
     {
         if ( (t->shared_raw[i] =3D alloc_xenheap_page()) =3D=3D NULL )
@@ -2448,12 +2444,10 @@ grant_table_create(
         gnttab_create_shared_page(d, t, i);
=20
     /* Status pages for grant table - for version 2 */
-    t->status =3D xmalloc_array(grant_status_t *,
+    t->status =3D xzalloc_array(grant_status_t *,
                               grant_to_status_frames(max_nr_grant_frames))=
;
     if ( t->status =3D=3D NULL )
         goto no_mem_4;
-    memset(t->status, 0,
-           grant_to_status_frames(max_nr_grant_frames) * sizeof(t->status[=
0]));
     t->nr_status_frames =3D 0;
=20
     /* Okay, install the structure. */
--- a/xen/common/sched_arinc653.c
+++ b/xen/common/sched_arinc653.c
@@ -341,11 +341,10 @@ a653sched_init(struct scheduler *ops)
 {
     a653sched_priv_t *prv;
=20
-    prv =3D xmalloc(a653sched_priv_t);
+    prv =3D xzalloc(a653sched_priv_t);
     if ( prv =3D=3D NULL )
         return -ENOMEM;
=20
-    memset(prv, 0, sizeof(*prv));
     ops->sched_data =3D prv;
=20
     prv->schedule[0].dom_handle[0] =3D '\0';
--- a/xen/common/sched_credit.c
+++ b/xen/common/sched_credit.c
@@ -351,10 +351,9 @@ csched_alloc_pdata(const struct schedule
     unsigned long flags;
=20
     /* Allocate per-PCPU info */
-    spc =3D xmalloc(struct csched_pcpu);
+    spc =3D xzalloc(struct csched_pcpu);
     if ( spc =3D=3D NULL )
         return NULL;
-    memset(spc, 0, sizeof(*spc));
=20
     spin_lock_irqsave(&prv->lock, flags);
=20
@@ -649,10 +648,9 @@ csched_alloc_vdata(const struct schedule
     struct csched_vcpu *svc;
=20
     /* Allocate per-VCPU info */
-    svc =3D xmalloc(struct csched_vcpu);
+    svc =3D xzalloc(struct csched_vcpu);
     if ( svc =3D=3D NULL )
         return NULL;
-    memset(svc, 0, sizeof(*svc));
=20
     INIT_LIST_HEAD(&svc->runq_elem);
     INIT_LIST_HEAD(&svc->active_vcpu_elem);
@@ -837,10 +835,9 @@ csched_alloc_domdata(const struct schedu
 {
     struct csched_dom *sdom;
=20
-    sdom =3D xmalloc(struct csched_dom);
+    sdom =3D xzalloc(struct csched_dom);
     if ( sdom =3D=3D NULL )
         return NULL;
-    memset(sdom, 0, sizeof(*sdom));
=20
     /* Initialize credit and weight */
     INIT_LIST_HEAD(&sdom->active_vcpu);
@@ -1513,11 +1510,10 @@ csched_init(struct scheduler *ops)
 {
     struct csched_private *prv;
=20
-    prv =3D xmalloc(struct csched_private);
+    prv =3D xzalloc(struct csched_private);
     if ( prv =3D=3D NULL )
         return -ENOMEM;
=20
-    memset(prv, 0, sizeof(*prv));
     ops->sched_data =3D prv;
     spin_lock_init(&prv->lock);
     INIT_LIST_HEAD(&prv->active_sdom);
--- a/xen/common/sched_credit2.c
+++ b/xen/common/sched_credit2.c
@@ -732,10 +732,9 @@ csched_alloc_vdata(const struct schedule
     struct csched_vcpu *svc;
=20
     /* Allocate per-VCPU info */
-    svc =3D xmalloc(struct csched_vcpu);
+    svc =3D xzalloc(struct csched_vcpu);
     if ( svc =3D=3D NULL )
         return NULL;
-    memset(svc, 0, sizeof(*svc));
=20
     INIT_LIST_HEAD(&svc->rqd_elem);
     INIT_LIST_HEAD(&svc->sdom_elem);
@@ -1437,10 +1436,9 @@ csched_alloc_domdata(const struct schedu
     struct csched_dom *sdom;
     int flags;
=20
-    sdom =3D xmalloc(struct csched_dom);
+    sdom =3D xzalloc(struct csched_dom);
     if ( sdom =3D=3D NULL )
         return NULL;
-    memset(sdom, 0, sizeof(*sdom));
=20
     /* Initialize credit and weight */
     INIT_LIST_HEAD(&sdom->vcpu);
@@ -2065,10 +2063,9 @@ csched_init(struct scheduler *ops)
      * set up basic structures, and a callback when the CPU info is
      * available. */
=20
-    prv =3D xmalloc(struct csched_private);
+    prv =3D xzalloc(struct csched_private);
     if ( prv =3D=3D NULL )
         return -ENOMEM;
-    memset(prv, 0, sizeof(*prv));
     ops->sched_data =3D prv;
     spin_lock_init(&prv->lock);
     INIT_LIST_HEAD(&prv->sdom);
--- a/xen/common/sched_sedf.c
+++ b/xen/common/sched_sedf.c
@@ -348,11 +348,10 @@ static void *sedf_alloc_vdata(const stru
 {
     struct sedf_vcpu_info *inf;
=20
-    inf =3D xmalloc(struct sedf_vcpu_info);
+    inf =3D xzalloc(struct sedf_vcpu_info);
     if ( inf =3D=3D NULL )
         return NULL;
=20
-    memset(inf, 0, sizeof(struct sedf_vcpu_info));
     inf->vcpu =3D v;
=20
     /* Every VCPU gets an equal share of extratime by default. */
@@ -387,9 +386,8 @@ sedf_alloc_pdata(const struct scheduler=20
 {
     struct sedf_cpu_info *spc;
=20
-    spc =3D xmalloc(struct sedf_cpu_info);
+    spc =3D xzalloc(struct sedf_cpu_info);
     BUG_ON(spc =3D=3D NULL);
-    memset(spc, 0, sizeof(*spc));
     INIT_LIST_HEAD(&spc->waitq);
     INIT_LIST_HEAD(&spc->runnableq);
     INIT_LIST_HEAD(&spc->extraq[EXTRA_PEN_Q]);
@@ -415,15 +413,7 @@ static void sedf_free_vdata(const struct
 static void *
 sedf_alloc_domdata(const struct scheduler *ops, struct domain *d)
 {
-    void *mem;
-
-    mem =3D xmalloc(struct sedf_dom_info);
-    if ( mem =3D=3D NULL )
-        return NULL;
-
-    memset(mem, 0, sizeof(struct sedf_dom_info));
-
-    return mem;
+    return xzalloc(struct sedf_dom_info);
 }
=20
 static int sedf_init_domain(const struct scheduler *ops, struct domain =
*d)
@@ -1333,8 +1323,8 @@ 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;
-    int                *sumw =3D xmalloc_array(int, nr_cpus);
-    s_time_t           *sumt =3D xmalloc_array(s_time_t, nr_cpus);
+    int                *sumw =3D xzalloc_array(int, nr_cpus);
+    s_time_t           *sumt =3D xzalloc_array(s_time_t, nr_cpus);
=20
     if ( !sumw || !sumt )
     {
@@ -1342,8 +1332,6 @@ static int sedf_adjust_weights(struct cp
         xfree(sumw);
         return -ENOMEM;
     }
-    memset(sumw, 0, nr_cpus * sizeof(*sumw));
-    memset(sumt, 0, nr_cpus * sizeof(*sumt));
=20
     /* Sum across all weights. */
     rcu_read_lock(&domlist_read_lock);
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -233,14 +233,13 @@ int sched_move_domain(struct domain *d,=20
     if ( domdata =3D=3D NULL )
         return -ENOMEM;
=20
-    vcpu_priv =3D xmalloc_array(void *, d->max_vcpus);
+    vcpu_priv =3D xzalloc_array(void *, d->max_vcpus);
     if ( vcpu_priv =3D=3D NULL )
     {
         SCHED_OP(c->sched, free_domdata, domdata);
         return -ENOMEM;
     }
=20
-    memset(vcpu_priv, 0, d->max_vcpus * sizeof(void *));
     for_each_vcpu ( d, v )
     {
         vcpu_priv[v->vcpu_id] =3D SCHED_OP(c->sched, alloc_vdata, v, =
domdata);
--- a/xen/common/wait.c
+++ b/xen/common/wait.c
@@ -41,11 +41,10 @@ int init_waitqueue_vcpu(struct vcpu *v)
 {
     struct waitqueue_vcpu *wqv;
=20
-    wqv =3D xmalloc(struct waitqueue_vcpu);
+    wqv =3D xzalloc(struct waitqueue_vcpu);
     if ( wqv =3D=3D NULL )
         return -ENOMEM;
=20
-    memset(wqv, 0, sizeof(*wqv));
     INIT_LIST_HEAD(&wqv->list);
     wqv->vcpu =3D v;
=20
--- a/xen/common/xenoprof.c
+++ b/xen/common/xenoprof.c
@@ -193,17 +193,14 @@ static int alloc_xenoprof_struct(
     unsigned max_max_samples;
     int i;
=20
-    d->xenoprof =3D xmalloc(struct xenoprof);
-
+    d->xenoprof =3D xzalloc(struct xenoprof);
     if ( d->xenoprof =3D=3D NULL )
     {
         printk("alloc_xenoprof_struct(): memory allocation failed\n");
         return -ENOMEM;
     }
=20
-    memset(d->xenoprof, 0, sizeof(*d->xenoprof));
-
-    d->xenoprof->vcpu =3D xmalloc_array(struct xenoprof_vcpu, d->max_vcpus=
);
+    d->xenoprof->vcpu =3D xzalloc_array(struct xenoprof_vcpu, d->max_vcpus=
);
     if ( d->xenoprof->vcpu =3D=3D NULL )
     {
         xfree(d->xenoprof);
@@ -212,8 +209,6 @@ static int alloc_xenoprof_struct(
         return -ENOMEM;
     }
=20
-    memset(d->xenoprof->vcpu, 0, d->max_vcpus * sizeof(*d->xenoprof->vcpu)=
);
-
     nvcpu =3D 0;
     for_each_vcpu ( d, v )
         nvcpu++;



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 04:51:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 04:51:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3Wn-0001U5-BU; Tue, 04 Oct 2011 04:51:17 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB3UV-0000aX-G6
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 04:48:56 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1317728932!33824383!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8847 invoked from network); 4 Oct 2011 11:48:52 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Oct 2011 11:48:52 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 12:48:52 +0100
Message-Id: <4E8B0EC202000078000592CC@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 12:48:50 +0100
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 3/4] use xzalloc in driver 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

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/acpi/pmstat.c
+++ b/xen/drivers/acpi/pmstat.c
@@ -221,9 +221,8 @@ static int get_cpufreq_para(struct xen_s
         return -EAGAIN;
     }
=20
-    if ( !(affected_cpus =3D xmalloc_array(uint32_t, op->u.get_para.cpu_nu=
m)) )
+    if ( !(affected_cpus =3D xzalloc_array(uint32_t, op->u.get_para.cpu_nu=
m)) )
         return -ENOMEM;
-    memset(affected_cpus, 0, op->u.get_para.cpu_num * sizeof(uint32_t));
     for_each_cpu_mask(cpu, policy->cpus)
         affected_cpus[j++] =3D cpu;
     ret =3D copy_to_guest(op->u.get_para.affected_cpus,
@@ -233,10 +232,8 @@ static int get_cpufreq_para(struct xen_s
         return ret;
=20
     if ( !(scaling_available_frequencies =3D
-        xmalloc_array(uint32_t, op->u.get_para.freq_num)) )
+           xzalloc_array(uint32_t, op->u.get_para.freq_num)) )
         return -ENOMEM;
-    memset(scaling_available_frequencies, 0,
-           op->u.get_para.freq_num * sizeof(uint32_t));
     for ( i =3D 0; i < op->u.get_para.freq_num; i++ )
         scaling_available_frequencies[i] =3D
                         pmpt->perf.states[i].core_frequency * 1000;
@@ -247,10 +244,8 @@ static int get_cpufreq_para(struct xen_s
         return ret;
=20
     if ( !(scaling_available_governors =3D
-        xmalloc_array(char, gov_num * CPUFREQ_NAME_LEN)) )
+           xzalloc_array(char, gov_num * CPUFREQ_NAME_LEN)) )
         return -ENOMEM;
-    memset(scaling_available_governors, 0,
-                gov_num * CPUFREQ_NAME_LEN * sizeof(char));
     if ( (ret =3D read_scaling_available_governors(scaling_available_gover=
nors,
                 gov_num * CPUFREQ_NAME_LEN * sizeof(char))) )
     {
--- a/xen/drivers/cpufreq/cpufreq.c
+++ b/xen/drivers/cpufreq/cpufreq.c
@@ -148,11 +148,10 @@ int cpufreq_add_cpu(unsigned int cpu)
     }
=20
     if (!domexist) {
-        cpufreq_dom =3D xmalloc(struct cpufreq_dom);
+        cpufreq_dom =3D xzalloc(struct cpufreq_dom);
         if (!cpufreq_dom)
             return -ENOMEM;
=20
-        memset(cpufreq_dom, 0, sizeof(struct cpufreq_dom));
         cpufreq_dom->dom =3D dom;
         list_add(&cpufreq_dom->node, &cpufreq_dom_list_head);
     } else {
@@ -176,11 +175,10 @@ int cpufreq_add_cpu(unsigned int cpu)
     }
=20
     if (!domexist || hw_all) {
-        policy =3D xmalloc(struct cpufreq_policy);
+        policy =3D xzalloc(struct cpufreq_policy);
         if (!policy)
             ret =3D -ENOMEM;
=20
-        memset(policy, 0, sizeof(struct cpufreq_policy));
         policy->cpu =3D cpu;
         per_cpu(cpufreq_cpu_policy, cpu) =3D policy;
=20
@@ -374,13 +372,12 @@ int set_px_pminfo(uint32_t acpi_id, stru
     pmpt =3D processor_pminfo[cpuid];
     if ( !pmpt )
     {
-        pmpt =3D xmalloc(struct processor_pminfo);
+        pmpt =3D xzalloc(struct processor_pminfo);
         if ( !pmpt )
         {
             ret =3D -ENOMEM;
             goto out;
         }
-        memset(pmpt, 0, sizeof(*pmpt));
         processor_pminfo[cpuid] =3D pmpt;
     }
     pxpt =3D &pmpt->perf;
--- a/xen/drivers/cpufreq/utility.c
+++ b/xen/drivers/cpufreq/utility.c
@@ -110,22 +110,21 @@ int cpufreq_statistic_init(unsigned int=20
=20
     count =3D pmpt->perf.state_count;
=20
-    pxpt =3D xmalloc(struct pm_px);
+    pxpt =3D xzalloc(struct pm_px);
     if ( !pxpt ) {
         spin_unlock(cpufreq_statistic_lock);
         return -ENOMEM;
     }
-    memset(pxpt, 0, sizeof(*pxpt));
     per_cpu(cpufreq_statistic_data, cpuid) =3D pxpt;
=20
-    pxpt->u.trans_pt =3D xmalloc_array(uint64_t, count * count);
+    pxpt->u.trans_pt =3D xzalloc_array(uint64_t, count * count);
     if (!pxpt->u.trans_pt) {
         xfree(pxpt);
         spin_unlock(cpufreq_statistic_lock);
         return -ENOMEM;
     }
=20
-    pxpt->u.pt =3D xmalloc_array(struct pm_px_val, count);
+    pxpt->u.pt =3D xzalloc_array(struct pm_px_val, count);
     if (!pxpt->u.pt) {
         xfree(pxpt->u.trans_pt);
         xfree(pxpt);
@@ -133,9 +132,6 @@ int cpufreq_statistic_init(unsigned int=20
         return -ENOMEM;
     }
=20
-    memset(pxpt->u.trans_pt, 0, count * count * (sizeof(uint64_t)));
-    memset(pxpt->u.pt, 0, count * (sizeof(struct pm_px_val)));
-
     pxpt->u.total =3D pmpt->perf.state_count;
     pxpt->u.usable =3D pmpt->perf.state_count - pmpt->perf.platform_limit;=

=20
--- a/xen/drivers/passthrough/amd/iommu_detect.c
+++ b/xen/drivers/passthrough/amd/iommu_detect.c
@@ -111,13 +111,12 @@ int __init amd_iommu_detect_one_acpi(voi
         return -ENODEV;
     }
=20
-    iommu =3D (struct amd_iommu *) xmalloc(struct amd_iommu);
+    iommu =3D xzalloc(struct amd_iommu);
     if ( !iommu )
     {
         AMD_IOMMU_DEBUG("Error allocating amd_iommu\n");
         return -ENOMEM;
     }
-    memset(iommu, 0, sizeof(struct amd_iommu));
=20
     spin_lock_init(&iommu->lock);
=20
--- a/xen/drivers/passthrough/amd/iommu_init.c
+++ b/xen/drivers/passthrough/amd/iommu_init.c
@@ -779,13 +779,12 @@ int __init alloc_ivrs_mappings(u16 seg)
     if ( get_ivrs_mappings(seg) )
         return 0;
=20
-    ivrs_mappings =3D xmalloc_array(struct ivrs_mappings, ivrs_bdf_entries=
 + 1);
+    ivrs_mappings =3D xzalloc_array(struct ivrs_mappings, ivrs_bdf_entries=
 + 1);
     if ( ivrs_mappings =3D=3D NULL )
     {
         AMD_IOMMU_DEBUG("Error allocating IVRS Mappings table\n");
         return -ENOMEM;
     }
-    memset(ivrs_mappings, 0, ivrs_bdf_entries * sizeof(struct ivrs_mapping=
s));
     IVRS_MAPPINGS_SEG(ivrs_mappings) =3D seg;
=20
     /* assign default values for device entries */
--- a/xen/drivers/passthrough/io.c
+++ b/xen/drivers/passthrough/io.c
@@ -115,13 +115,12 @@ int pt_irq_create_bind_vtd(
     hvm_irq_dpci =3D domain_get_irq_dpci(d);
     if ( hvm_irq_dpci =3D=3D NULL )
     {
-        hvm_irq_dpci =3D xmalloc(struct hvm_irq_dpci);
+        hvm_irq_dpci =3D xzalloc(struct hvm_irq_dpci);
         if ( hvm_irq_dpci =3D=3D NULL )
         {
             spin_unlock(&d->event_lock);
             return -ENOMEM;
         }
-        memset(hvm_irq_dpci, 0, sizeof(*hvm_irq_dpci));
         softirq_tasklet_init(
             &hvm_irq_dpci->dirq_tasklet,
             hvm_dirq_assist, (unsigned long)d);
--- a/xen/drivers/passthrough/pci.c
+++ b/xen/drivers/passthrough/pci.c
@@ -65,14 +65,13 @@ static struct pci_seg *alloc_pseg(u16 se
     if ( pseg )
         return pseg;
=20
-    pseg =3D xmalloc(struct pci_seg);
+    pseg =3D xzalloc(struct pci_seg);
     if ( !pseg )
         return NULL;
=20
     pseg->nr =3D seg;
     INIT_LIST_HEAD(&pseg->alldevs_list);
     spin_lock_init(&pseg->bus2bridge_lock);
-    memset(pseg->bus2bridge, 0, sizeof(pseg->bus2bridge));
=20
     if ( radix_tree_insert(&pci_segments, seg, pseg) )
     {
@@ -121,10 +120,9 @@ static struct pci_dev *alloc_pdev(struct
         if ( pdev->bus =3D=3D bus && pdev->devfn =3D=3D devfn )
             return pdev;
=20
-    pdev =3D xmalloc(struct pci_dev);
+    pdev =3D xzalloc(struct pci_dev);
     if ( !pdev )
         return NULL;
-    memset(pdev, 0, sizeof(struct pci_dev));
=20
     *(u16*) &pdev->seg =3D pseg->nr;
     *((u8*) &pdev->bus) =3D bus;
--- a/xen/drivers/passthrough/vtd/dmar.c
+++ b/xen/drivers/passthrough/vtd/dmar.c
@@ -291,10 +291,9 @@ static int __init acpi_parse_dev_scope(
     scope->devices_cnt =3D cnt;
     if ( cnt > 0 )
     {
-        scope->devices =3D xmalloc_array(u16, cnt);
+        scope->devices =3D xzalloc_array(u16, cnt);
         if ( !scope->devices )
             return -ENOMEM;
-        memset(scope->devices, 0, sizeof(u16) * cnt);
     }
=20
     while ( start < end )
@@ -400,10 +399,9 @@ acpi_parse_one_drhd(struct acpi_dmar_ent
     if ( (ret =3D acpi_dmar_check_length(header, sizeof(*drhd))) !=3D 0 )
         return ret;
=20
-    dmaru =3D xmalloc(struct acpi_drhd_unit);
+    dmaru =3D xzalloc(struct acpi_drhd_unit);
     if ( !dmaru )
         return -ENOMEM;
-    memset(dmaru, 0, sizeof(struct acpi_drhd_unit));
=20
     dmaru->address =3D drhd->address;
     dmaru->segment =3D drhd->segment;
@@ -534,10 +532,9 @@ acpi_parse_one_rmrr(struct acpi_dmar_ent
     }
 #endif
=20
-    rmrru =3D xmalloc(struct acpi_rmrr_unit);
+    rmrru =3D xzalloc(struct acpi_rmrr_unit);
     if ( !rmrru )
         return -ENOMEM;
-    memset(rmrru, 0, sizeof(struct acpi_rmrr_unit));
=20
     rmrru->base_address =3D base_addr;
     rmrru->end_address =3D end_addr;
@@ -624,10 +621,9 @@ acpi_parse_one_atsr(struct acpi_dmar_ent
     if ( (ret =3D acpi_dmar_check_length(header, sizeof(*atsr))) !=3D 0 )
         return ret;
=20
-    atsru =3D xmalloc(struct acpi_atsr_unit);
+    atsru =3D xzalloc(struct acpi_atsr_unit);
     if ( !atsru )
         return -ENOMEM;
-    memset(atsru, 0, sizeof(struct acpi_atsr_unit));
=20
     atsru->segment =3D atsr->segment;
     atsru->all_ports =3D atsr->flags & 1; /* BIT0: ALL_PORTS */
@@ -673,10 +669,9 @@ acpi_parse_one_rhsa(struct acpi_dmar_ent
     if ( (ret =3D acpi_dmar_check_length(header, sizeof(*rhsa))) !=3D 0 )
         return ret;
=20
-    rhsau =3D xmalloc(struct acpi_rhsa_unit);
+    rhsau =3D xzalloc(struct acpi_rhsa_unit);
     if ( !rhsau )
         return -ENOMEM;
-    memset(rhsau, 0, sizeof(struct acpi_rhsa_unit));
=20
     rhsau->address =3D rhsa->address;
     rhsau->proximity_domain =3D rhsa->proximity_domain;
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -138,10 +138,9 @@ static struct intel_iommu *__init alloc_
 {
     struct intel_iommu *intel;
=20
-    intel =3D xmalloc(struct intel_iommu);
+    intel =3D xzalloc(struct intel_iommu);
     if ( intel =3D=3D NULL )
         return NULL;
-    memset(intel, 0, sizeof(struct intel_iommu));
=20
     spin_lock_init(&intel->qi_ctrl.qinval_lock);
     spin_lock_init(&intel->ir_ctrl.iremap_lock);
@@ -1098,10 +1097,9 @@ int __init iommu_alloc(struct acpi_drhd_
         return -ENOMEM;
     }
=20
-    iommu =3D xmalloc(struct iommu);
+    iommu =3D xzalloc(struct iommu);
     if ( iommu =3D=3D NULL )
         return -ENOMEM;
-    memset(iommu, 0, sizeof(struct iommu));
=20
     iommu->irq =3D -1; /* No irq assigned yet. */
=20
@@ -1157,10 +1155,9 @@ int __init iommu_alloc(struct acpi_drhd_
=20
     /* allocate domain id bitmap */
     nr_dom =3D cap_ndoms(iommu->cap);
-    iommu->domid_bitmap =3D xmalloc_array(unsigned long, BITS_TO_LONGS(nr_=
dom));
+    iommu->domid_bitmap =3D xzalloc_array(unsigned long, BITS_TO_LONGS(nr_=
dom));
     if ( !iommu->domid_bitmap )
         return -ENOMEM ;
-    memset(iommu->domid_bitmap, 0, nr_dom / 8);
=20
     /*
      * if Caching mode is set, then invalid translations are tagged with
@@ -1169,10 +1166,9 @@ int __init iommu_alloc(struct acpi_drhd_
     if ( cap_caching_mode(iommu->cap) )
         set_bit(0, iommu->domid_bitmap);
=20
-    iommu->domid_map =3D xmalloc_array(u16, nr_dom);
+    iommu->domid_map =3D xzalloc_array(u16, nr_dom);
     if ( !iommu->domid_map )
         return -ENOMEM ;
-    memset(iommu->domid_map, 0, nr_dom * sizeof(*iommu->domid_map));
=20
     spin_lock_init(&iommu->lock);
     spin_lock_init(&iommu->register_lock);
--- a/xen/drivers/video/vesa.c
+++ b/xen/drivers/video/vesa.c
@@ -93,11 +93,11 @@ void __init vesa_init(void)
     if ( !lbuf )
         goto fail;
=20
-    text_buf =3D xmalloc_bytes(text_columns * text_rows);
+    text_buf =3D xzalloc_bytes(text_columns * text_rows);
     if ( !text_buf )
         goto fail;
=20
-    line_len =3D xmalloc_array(unsigned int, text_columns);
+    line_len =3D xzalloc_array(unsigned int, text_columns);
     if ( !line_len )
         goto fail;
=20
@@ -108,8 +108,6 @@ void __init vesa_init(void)
         goto fail;
=20
     lfb =3D memset((void *)IOREMAP_VIRT_START, 0, vram_remap);
-    memset(text_buf, 0, text_columns * text_rows);
-    memset(line_len, 0, text_columns * sizeof(*line_len));
=20
     vga_puts =3D vesa_redraw_puts;
=20



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 04:52:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 04:52:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3YD-0001wn-4p; Tue, 04 Oct 2011 04:52:45 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB3VH-0000tR-3C
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 04:49:43 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1317728979!31697398!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1159 invoked from network); 4 Oct 2011 11:49:40 -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; 4 Oct 2011 11:49:40 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 12:49:39 +0100
Message-Id: <4E8B0EF002000078000592CF@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 12:49:36 +0100
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 4/4] use xzalloc in x86 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 includes the removal of a redundant memset() from microcode_amd.c.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/acpi/cpu_idle.c
+++ b/xen/arch/x86/acpi/cpu_idle.c
@@ -602,10 +602,9 @@ static int cpuidle_init_cpu(int cpu)
     if ( !acpi_power )
     {
         int i;
-        acpi_power =3D xmalloc(struct acpi_processor_power);
+        acpi_power =3D xzalloc(struct acpi_processor_power);
         if ( !acpi_power )
             return -ENOMEM;
-        memset(acpi_power, 0, sizeof(*acpi_power));
=20
         for ( i =3D 0; i < ACPI_PROCESSOR_MAX_POWER; i++ )
             acpi_power->states[i].idx =3D i;
--- a/xen/arch/x86/acpi/cpufreq/cpufreq.c
+++ b/xen/arch/x86/acpi/cpufreq/cpufreq.c
@@ -552,10 +552,9 @@ acpi_cpufreq_cpu_init(struct cpufreq_pol
     struct cpuinfo_x86 *c =3D &cpu_data[policy->cpu];
     struct processor_performance *perf;
=20
-    data =3D xmalloc(struct acpi_cpufreq_data);
+    data =3D xzalloc(struct acpi_cpufreq_data);
     if (!data)
         return -ENOMEM;
-    memset(data, 0, sizeof(struct acpi_cpufreq_data));
=20
     cpufreq_drv_data[cpu] =3D data;
=20
--- a/xen/arch/x86/acpi/cpufreq/powernow.c
+++ b/xen/arch/x86/acpi/cpufreq/powernow.c
@@ -189,10 +189,9 @@ static int powernow_cpufreq_cpu_init(str
     uint64_t msr_content;
     struct cpuinfo_x86 *c =3D &cpu_data[policy->cpu];
=20
-    data =3D xmalloc(struct acpi_cpufreq_data);
+    data =3D xzalloc(struct acpi_cpufreq_data);
     if (!data)
         return -ENOMEM;
-    memset(data, 0, sizeof(struct acpi_cpufreq_data));
=20
     cpufreq_drv_data[cpu] =3D data;
=20
--- a/xen/arch/x86/cpu/mcheck/mce.c
+++ b/xen/arch/x86/cpu/mcheck/mce.c
@@ -113,7 +113,7 @@ struct mca_banks *mcabanks_alloc(void)
     if (!mb)
         return NULL;
=20
-    mb->bank_map =3D xmalloc_array(unsigned long,
+    mb->bank_map =3D xzalloc_array(unsigned long,
                                  BITS_TO_LONGS(nr_mce_banks));
     if (!mb->bank_map)
     {
@@ -122,7 +122,6 @@ struct mca_banks *mcabanks_alloc(void)
     }
=20
     mb->num =3D nr_mce_banks;
-    memset(mb->bank_map, 0, sizeof(long) * BITS_TO_LONGS(nr_mce_banks));
=20
     return mb;
 }
--- a/xen/arch/x86/cpu/mcheck/vmce.c
+++ b/xen/arch/x86/cpu/mcheck/vmce.c
@@ -362,14 +362,13 @@ static struct bank_entry* alloc_bank_ent
 {
     struct bank_entry *entry;
=20
-    entry =3D xmalloc(struct bank_entry);
+    entry =3D xzalloc(struct bank_entry);
     if ( entry =3D=3D NULL )
     {
         printk(KERN_ERR "MCE: malloc bank_entry failed\n");
         return NULL;
     }
=20
-    memset(entry, 0x0, sizeof(entry));
     INIT_LIST_HEAD(&entry->list);
     return entry;
 }
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -580,11 +580,10 @@ int arch_domain_create(struct domain *d,
=20
     if ( !is_idle_domain(d) )
     {
-        d->arch.cpuids =3D xmalloc_array(cpuid_input_t, MAX_CPUID_INPUT);
+        d->arch.cpuids =3D xzalloc_array(cpuid_input_t, MAX_CPUID_INPUT);
         rc =3D -ENOMEM;
         if ( d->arch.cpuids =3D=3D NULL )
             goto fail;
-        memset(d->arch.cpuids, 0, MAX_CPUID_INPUT * sizeof(*d->arch.cpuids=
));
         for ( i =3D 0; i < MAX_CPUID_INPUT; i++ )
         {
             d->arch.cpuids[i].input[0] =3D XEN_CPUID_INPUT_UNUSED;
--- a/xen/arch/x86/domain_build.c
+++ b/xen/arch/x86/domain_build.c
@@ -92,10 +92,9 @@ struct vcpu *__init alloc_dom0_vcpu0(voi
     if ( opt_dom0_max_vcpus > MAX_VIRT_CPUS )
         opt_dom0_max_vcpus =3D MAX_VIRT_CPUS;
=20
-    dom0->vcpu =3D xmalloc_array(struct vcpu *, opt_dom0_max_vcpus);
+    dom0->vcpu =3D xzalloc_array(struct vcpu *, opt_dom0_max_vcpus);
     if ( !dom0->vcpu )
         return NULL;
-    memset(dom0->vcpu, 0, opt_dom0_max_vcpus * sizeof(*dom0->vcpu));
     dom0->max_vcpus =3D opt_dom0_max_vcpus;
=20
     return alloc_vcpu(dom0, 0, 0);
--- a/xen/arch/x86/hpet.c
+++ b/xen/arch/x86/hpet.c
@@ -365,10 +365,9 @@ static void __init hpet_fsb_cap_lookup(v
     num_chs =3D ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT);
     num_chs++; /* Value read out starts from 0 */
=20
-    hpet_events =3D xmalloc_array(struct hpet_event_channel, num_chs);
+    hpet_events =3D xzalloc_array(struct hpet_event_channel, num_chs);
     if ( !hpet_events )
         return;
-    memset(hpet_events, 0, num_chs * sizeof(*hpet_events));
=20
     for ( i =3D 0; i < num_chs; i++ )
     {
@@ -504,10 +503,9 @@ void __init hpet_broadcast_init(void)
             return;
=20
         if ( !hpet_events )
-            hpet_events =3D xmalloc(struct hpet_event_channel);
+            hpet_events =3D xzalloc(struct hpet_event_channel);
         if ( !hpet_events )
             return;
-        memset(hpet_events, 0, sizeof(*hpet_events));
         hpet_events->irq =3D -1;
=20
         /* Start HPET legacy interrupts */
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -444,17 +444,13 @@ int hvm_domain_initialise(struct domain=20
     INIT_LIST_HEAD(&d->arch.hvm_domain.msixtbl_list);
     spin_lock_init(&d->arch.hvm_domain.msixtbl_list_lock);
=20
-    d->arch.hvm_domain.pbuf =3D xmalloc_array(char, HVM_PBUF_SIZE);
-    d->arch.hvm_domain.params =3D xmalloc_array(uint64_t, HVM_NR_PARAMS);
+    d->arch.hvm_domain.pbuf =3D xzalloc_array(char, HVM_PBUF_SIZE);
+    d->arch.hvm_domain.params =3D xzalloc_array(uint64_t, HVM_NR_PARAMS);
     d->arch.hvm_domain.io_handler =3D xmalloc(struct hvm_io_handler);
     rc =3D -ENOMEM;
     if ( !d->arch.hvm_domain.pbuf || !d->arch.hvm_domain.params ||
          !d->arch.hvm_domain.io_handler )
         goto fail0;
-    memset(d->arch.hvm_domain.pbuf, 0,
-           HVM_PBUF_SIZE * sizeof(*d->arch.hvm_domain.pbuf));
-    memset(d->arch.hvm_domain.params, 0,
-           HVM_NR_PARAMS * sizeof(*d->arch.hvm_domain.params));
     d->arch.hvm_domain.io_handler->num_slot =3D 0;
=20
     hvm_init_guest_time(d);
--- a/xen/arch/x86/hvm/mtrr.c
+++ b/xen/arch/x86/hvm/mtrr.c
@@ -202,10 +202,9 @@ int hvm_vcpu_cacheattr_init(struct vcpu=20
=20
     memset(m, 0, sizeof(*m));
=20
-    m->var_ranges =3D xmalloc_array(struct mtrr_var_range, MTRR_VCNT);
+    m->var_ranges =3D xzalloc_array(struct mtrr_var_range, MTRR_VCNT);
     if ( m->var_ranges =3D=3D NULL )
         return -ENOMEM;
-    memset(m->var_ranges, 0, MTRR_VCNT * sizeof(struct mtrr_var_range));
=20
     m->mtrr_cap =3D (1u << 10) | (1u << 8) | MTRR_VCNT;
=20
@@ -608,12 +607,10 @@ int32_t hvm_set_mem_pinned_cacheattr(
          !is_hvm_domain(d) )
         return -EINVAL;
=20
-    range =3D xmalloc(struct hvm_mem_pinned_cacheattr_range);
+    range =3D xzalloc(struct hvm_mem_pinned_cacheattr_range);
     if ( range =3D=3D NULL )
         return -ENOMEM;
=20
-    memset(range, 0, sizeof(*range));
-
     range->start =3D gfn_start;
     range->end =3D gfn_end;
     range->type =3D type;
--- a/xen/arch/x86/hvm/svm/vpmu.c
+++ b/xen/arch/x86/hvm/svm/vpmu.c
@@ -323,8 +323,7 @@ static void amd_vpmu_initialise(struct v
 	 }
     }
=20
-    ctxt =3D xmalloc_bytes(sizeof(struct amd_vpmu_context));
-
+    ctxt =3D xzalloc_bytes(sizeof(struct amd_vpmu_context));
     if ( !ctxt )
     {
         gdprintk(XENLOG_WARNING, "Insufficient memory for PMU, "
@@ -333,7 +332,6 @@ static void amd_vpmu_initialise(struct v
         return;
     }
=20
-    memset(ctxt, 0, sizeof(struct amd_vpmu_context));
     vpmu->context =3D (void *)ctxt;
     vpmu->flags |=3D VPMU_CONTEXT_ALLOCATED;
 }
--- a/xen/arch/x86/hvm/vmx/vpmu_core2.c
+++ b/xen/arch/x86/hvm/vmx/vpmu_core2.c
@@ -328,19 +328,15 @@ static int core2_vpmu_alloc_resource(str
     vmx_write_guest_msr(MSR_CORE_PERF_GLOBAL_CTRL,
                  core2_calc_intial_glb_ctrl_msr());
=20
-    pmu_enable =3D xmalloc_bytes(sizeof(struct core2_pmu_enable) +
-                 (core2_get_pmc_count()-1)*sizeof(char));
+    pmu_enable =3D xzalloc_bytes(sizeof(struct core2_pmu_enable) +
+                               core2_get_pmc_count() - 1);
     if ( !pmu_enable )
         goto out1;
-    memset(pmu_enable, 0, sizeof(struct core2_pmu_enable) +
-                 (core2_get_pmc_count()-1)*sizeof(char));
=20
-    core2_vpmu_cxt =3D xmalloc_bytes(sizeof(struct core2_vpmu_context) +
+    core2_vpmu_cxt =3D xzalloc_bytes(sizeof(struct core2_vpmu_context) +
                     (core2_get_pmc_count()-1)*sizeof(struct arch_msr_pair)=
);
     if ( !core2_vpmu_cxt )
         goto out2;
-    memset(core2_vpmu_cxt, 0, sizeof(struct core2_vpmu_context) +
-                    (core2_get_pmc_count()-1)*sizeof(struct arch_msr_pair)=
);
     core2_vpmu_cxt->pmu_enable =3D pmu_enable;
     vpmu->context =3D (void *)core2_vpmu_cxt;
=20
--- a/xen/arch/x86/i387.c
+++ b/xen/arch/x86/i387.c
@@ -245,13 +245,12 @@ int vcpu_init_fpu(struct vcpu *v)
         v->arch.fpu_ctxt =3D &v->arch.xsave_area->fpu_sse;
     else
     {
-        v->arch.fpu_ctxt =3D _xmalloc(sizeof(v->arch.xsave_area->fpu_sse),=
 16);
+        v->arch.fpu_ctxt =3D _xzalloc(sizeof(v->arch.xsave_area->fpu_sse),=
 16);
         if ( !v->arch.fpu_ctxt )
         {
             rc =3D -ENOMEM;
             goto done;
         }
-        memset(v->arch.fpu_ctxt, 0, sizeof(v->arch.xsave_area->fpu_sse));
     }
=20
 done:
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -1365,8 +1365,7 @@ static void __init enable_IO_APIC(void)
     int i, apic;
=20
     /* Initialise dynamic irq_2_pin free list. */
-    irq_2_pin =3D xmalloc_array(struct irq_pin_list, PIN_MAP_SIZE);
-    memset(irq_2_pin, 0, PIN_MAP_SIZE * sizeof(*irq_2_pin));
+    irq_2_pin =3D xzalloc_array(struct irq_pin_list, PIN_MAP_SIZE);
        =20
     for (i =3D 0; i < PIN_MAP_SIZE; i++)
         irq_2_pin[i].pin =3D -1;
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -313,17 +313,13 @@ int __init init_irq_data(void)
     for (vector =3D 0; vector < NR_VECTORS; ++vector)
         this_cpu(vector_irq)[vector] =3D -1;
=20
-    irq_desc =3D xmalloc_array(struct irq_desc, nr_irqs);
-    irq_cfg =3D xmalloc_array(struct irq_cfg, nr_irqs);
-    irq_vector =3D xmalloc_array(u8, nr_irqs_gsi);
+    irq_desc =3D xzalloc_array(struct irq_desc, nr_irqs);
+    irq_cfg =3D xzalloc_array(struct irq_cfg, nr_irqs);
+    irq_vector =3D xzalloc_array(u8, nr_irqs_gsi);
    =20
     if ( !irq_desc || !irq_cfg ||! irq_vector )
         return -ENOMEM;
=20
-    memset(irq_desc, 0,  nr_irqs * sizeof(*irq_desc));
-    memset(irq_cfg, 0,  nr_irqs * sizeof(*irq_cfg));
-    memset(irq_vector, 0, nr_irqs_gsi * sizeof(*irq_vector));
-   =20
     for (irq =3D 0; irq < nr_irqs; irq++) {
         desc =3D irq_to_desc(irq);
         cfg =3D irq_cfg(irq);
@@ -1097,11 +1093,10 @@ struct pirq *alloc_pirq_struct(struct do
 {
     size_t sz =3D is_hvm_domain(d) ? sizeof(struct pirq) :
                                    offsetof(struct pirq, arch.hvm);
-    struct pirq *pirq =3D xmalloc_bytes(sz);
+    struct pirq *pirq =3D xzalloc_bytes(sz);
=20
     if ( pirq )
     {
-        memset(pirq, 0, sz);
         if ( is_hvm_domain(d) )
         {
             pirq->arch.hvm.emuirq =3D IRQ_UNBOUND;
--- a/xen/arch/x86/microcode_amd.c
+++ b/xen/arch/x86/microcode_amd.c
@@ -231,7 +231,6 @@ static int install_equiv_cpu_table(const
         return -ENOMEM;
     }
=20
-    memset(equiv_cpu_table, 0, size);
     memcpy(equiv_cpu_table, (const void *)&buf_pos[3], size);
=20
     *offset =3D size + 12;	/* add header length */
--- a/xen/arch/x86/mm/shadow/common.c
+++ b/xen/arch/x86/mm/shadow/common.c
@@ -1922,10 +1922,8 @@ static int shadow_hash_alloc(struct doma
     ASSERT(paging_locked_by_me(d));
     ASSERT(!d->arch.paging.shadow.hash_table);
=20
-    table =3D xmalloc_array(struct page_info *, SHADOW_HASH_BUCKETS);
+    table =3D xzalloc_array(struct page_info *, SHADOW_HASH_BUCKETS);
     if ( !table ) return 1;
-    memset(table, 0,=20
-           SHADOW_HASH_BUCKETS * sizeof (struct page_info *));
     d->arch.paging.shadow.hash_table =3D table;
     return 0;
 }
@@ -2816,7 +2814,7 @@ static void sh_update_paging_modes(struc
     /* Make sure this vcpu has a virtual TLB array allocated */
     if ( unlikely(!v->arch.paging.vtlb) )
     {
-        v->arch.paging.vtlb =3D xmalloc_array(struct shadow_vtlb, =
VTLB_ENTRIES);
+        v->arch.paging.vtlb =3D xzalloc_array(struct shadow_vtlb, =
VTLB_ENTRIES);
         if ( unlikely(!v->arch.paging.vtlb) )
         {
             SHADOW_ERROR("Could not allocate vTLB space for dom %u vcpu =
%u\n",
@@ -2824,8 +2822,6 @@ static void sh_update_paging_modes(struc
             domain_crash(v->domain);
             return;
         }
-        memset(v->arch.paging.vtlb, 0,=20
-               VTLB_ENTRIES * sizeof (struct shadow_vtlb));
         spin_lock_init(&v->arch.paging.vtlb_lock);
     }
 #endif /* (SHADOW_OPTIMIZATIONS & SHOPT_VIRTUAL_TLB) */
@@ -3656,9 +3652,8 @@ int shadow_track_dirty_vram(struct domai
             goto out_dirty_vram;
         memset(dirty_vram->sl1ma, ~0, sizeof(paddr_t) * nr);
=20
-        if ( (dirty_vram->dirty_bitmap =3D xmalloc_array(uint8_t, =
dirty_size)) =3D=3D NULL )
+        if ( (dirty_vram->dirty_bitmap =3D xzalloc_array(uint8_t, =
dirty_size)) =3D=3D NULL )
             goto out_sl1ma;
-        memset(dirty_vram->dirty_bitmap, 0, dirty_size);
=20
         dirty_vram->last_dirty =3D NOW();
=20
--- a/xen/arch/x86/oprofile/op_model_ppro.c
+++ b/xen/arch/x86/oprofile/op_model_ppro.c
@@ -226,10 +226,9 @@ static int ppro_allocate_msr(struct vcpu
 	struct vpmu_struct *vpmu =3D vcpu_vpmu(v);
 	struct arch_msr_pair *msr_content;
=20
-	msr_content =3D xmalloc_bytes( sizeof(struct arch_msr_pair) * =
num_counters );
+	msr_content =3D xzalloc_array(struct arch_msr_pair, num_counters);
 	if ( !msr_content )
 		goto out;
-	memset(msr_content, 0, sizeof(struct arch_msr_pair) * num_counters)=
;
 	vpmu->context =3D (void *)msr_content;
 	vpmu->flags =3D 0;
 	vpmu->flags |=3D PASSIVE_DOMAIN_ALLOCATED;
--- a/xen/arch/x86/x86_64/mmconfig-shared.c
+++ b/xen/arch/x86/x86_64/mmconfig-shared.c
@@ -57,10 +57,9 @@ static const char __init *pci_mmcfg_e752
         pci_mmcfg_config_num =3D 0;
     else {
         pci_mmcfg_config_num =3D 1;
-        pci_mmcfg_config =3D xmalloc(struct acpi_mcfg_allocation);
+        pci_mmcfg_config =3D xzalloc(struct acpi_mcfg_allocation);
         if (!pci_mmcfg_config)
             return NULL;
-        memset(pci_mmcfg_config, 0, sizeof(pci_mmcfg_config[0]));
         pci_mmcfg_config[0].address =3D win << 16;
         pci_mmcfg_config[0].pci_segment =3D 0;
         pci_mmcfg_config[0].start_bus_number =3D 0;
@@ -111,10 +110,9 @@ static const char __init *pci_mmcfg_inte
         pci_mmcfg_config_num =3D 0;
=20
     if (pci_mmcfg_config_num) {
-        pci_mmcfg_config =3D xmalloc(struct acpi_mcfg_allocation);
+        pci_mmcfg_config =3D xzalloc(struct acpi_mcfg_allocation);
         if (!pci_mmcfg_config)
             return NULL;
-        memset(pci_mmcfg_config, 0, sizeof(pci_mmcfg_config[0]));
         pci_mmcfg_config[0].address =3D pciexbar & mask;
         pci_mmcfg_config[0].pci_segment =3D 0;
         pci_mmcfg_config[0].start_bus_number =3D 0;
--- a/xen/arch/x86/x86_64/mmconfig_64.c
+++ b/xen/arch/x86/x86_64/mmconfig_64.c
@@ -171,13 +171,12 @@ int __init pci_mmcfg_arch_init(void)
     if (pci_mmcfg_virt)
         return 0;
=20
-    pci_mmcfg_virt =3D xmalloc_array(struct mmcfg_virt, pci_mmcfg_config_n=
um);
+    pci_mmcfg_virt =3D xzalloc_array(struct mmcfg_virt, pci_mmcfg_config_n=
um);
     if (pci_mmcfg_virt =3D=3D NULL) {
         printk(KERN_ERR "PCI: Can not allocate memory for mmconfig =
structures\n");
         pci_mmcfg_config_num =3D 0;
         return 0;
     }
-    memset(pci_mmcfg_virt, 0, sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_n=
um);
=20
     for (i =3D 0; i < pci_mmcfg_config_num; ++i) {
         pci_mmcfg_virt[i].cfg =3D &pci_mmcfg_config[i];
--- a/xen/arch/x86/xstate.c
+++ b/xen/arch/x86/xstate.c
@@ -105,11 +105,10 @@ int xstate_alloc_save_area(struct vcpu *
     BUG_ON(xsave_cntxt_size < XSTATE_AREA_MIN_SIZE);
=20
     /* XSAVE/XRSTOR requires the save area be 64-byte-boundary aligned. =
*/
-    save_area =3D _xmalloc(xsave_cntxt_size, 64);
+    save_area =3D _xzalloc(xsave_cntxt_size, 64);
     if ( save_area =3D=3D NULL )
         return -ENOMEM;
=20
-    memset(save_area, 0, xsave_cntxt_size);
     ((u32 *)save_area)[6] =3D 0x1f80;  /* MXCSR */
     *(uint64_t *)(save_area + 512) =3D XSTATE_FP_SSE;  /* XSETBV */
=20



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 05:03:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 05:03:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3iq-0002Um-Fn; Tue, 04 Oct 2011 05:03:44 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB3eL-0002F2-5G
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 05:00:03 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1317729508!57350217!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24666 invoked from network); 4 Oct 2011 11:58:28 -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;
	4 Oct 2011 11:58:28 -0000
Received: by wyh13 with SMTP id 13so608879wyh.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 04:59: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:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=FiZhkLs+2C+J7/c63x1laCZ4GnlR+K2shAgm3rp7Khw=;
	b=IHl2m+vf4+HvdLpLGPKkjXDFQAXQIs8qTKd6+8WzwrjqPLkq26swJW0xPCswanDGqn
	7ahqRWRiGbZelRMJEe0/X6Q9um6adP3S+UKMxqZg/3dHcD8Y1Psd1ZOPAcfhcTjBNTnW
	eq/WG8/JZOY1ubwdHU2p205eVmiwu4wqGzHzg=
Received: by 10.227.61.142 with SMTP id t14mr1352971wbh.68.1317729540582;
	Tue, 04 Oct 2011 04:59:00 -0700 (PDT)
Received: from [192.168.1.3]
	(host213-122-120-74.range213-122.btcentralplus.com. [213.122.120.74])
	by mx.google.com with ESMTPS id fq9sm3045114wbb.15.2011.10.04.04.58.59
	(version=SSLv3 cipher=OTHER); Tue, 04 Oct 2011 04:59:00 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Tue, 04 Oct 2011 12:58:57 +0100
Subject: Re: [Xen-devel] [PATCH] AMD-IOMMU: remove dead variable references
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAB0B391.31C6E%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] AMD-IOMMU: remove dead variable references
Thread-Index: AcyCjP7fU+tLwY1zu0GfjPsX2OTP1A==
In-Reply-To: <4E8B0B70020000780005929A@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/10/2011 12:34, "Jan Beulich" <JBeulich@suse.com> wrote:

> These got orphaned up by recent changes.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
> +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
> @@ -26,9 +26,6 @@
>  #include <asm/amd-iommu.h>
>  #include <asm/hvm/svm/amd-iommu-proto.h>
>  
> -extern bool_t __read_mostly opt_irq_perdev_vector_map;
> -extern bool_t __read_mostly iommu_amd_perdev_vector_map;
> -
>  struct amd_iommu *find_iommu_for_device(int seg, int bdf)
>  {
>      struct ivrs_mappings *ivrs_mappings = get_ivrs_mappings(seg);
> --- a/xen/drivers/passthrough/iommu.c
> +++ b/xen/drivers/passthrough/iommu.c
> @@ -50,7 +50,6 @@ bool_t __read_mostly iommu_qinval = 1;
>  bool_t __read_mostly iommu_intremap = 1;
>  bool_t __read_mostly iommu_hap_pt_share = 1;
>  bool_t __read_mostly iommu_debug;
> -bool_t __read_mostly iommu_amd_perdev_vector_map = 1;
>  bool_t __read_mostly amd_iommu_perdev_intremap;
>  
>  static void __init parse_iommu_param(char *s)
> @@ -86,8 +85,6 @@ static void __init parse_iommu_param(cha
>              iommu_dom0_strict = 1;
>          else if ( !strcmp(s, "sharept") )
>              iommu_hap_pt_share = 1;
> -        else if ( !strcmp(s, "no-perdev-vector-map") )
> -            iommu_amd_perdev_vector_map = 0;
>  
>          s = ss + 1;
>      } while ( ss );
> 
> 
> 
> 
> _______________________________________________
> 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 Oct 04 05:05:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 05:05:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3kZ-0002sK-Jq; Tue, 04 Oct 2011 05:05:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB3ff-0002GU-KF
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 05:00:29 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1317729624!19816906!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25832 invoked from network); 4 Oct 2011 12:00:24 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 12:00:24 -0000
Received: by wyh13 with SMTP id 13so611033wyh.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 05:00:24 -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=Xs5BMErTdZtNKMBk5YvAkmBAhFQSDWAyq16EreaaEDI=;
	b=KCU8bJAbR0XA6m6Mnz/rVYIBmYJl88N7wnPPFWXD8LerIzI9eq10mJnDl/MT9VzH6G
	sqI2TnxHFPVYi4N907JIfgdBdMvng1es2e/ejqw7qCd0AZampM3fuH80ZTCpoztnvIgK
	m8TkJ9xvqHNrF3ZxZYC/Sj/SDjis07M1/XUPQ=
Received: by 10.227.7.94 with SMTP id c30mr1381889wbc.44.1317729624448;
	Tue, 04 Oct 2011 05:00:24 -0700 (PDT)
Received: from [192.168.1.3]
	(host213-122-120-74.range213-122.btcentralplus.com. [213.122.120.74])
	by mx.google.com with ESMTPS id z9sm3054967wbn.19.2011.10.04.05.00.23
	(version=SSLv3 cipher=OTHER); Tue, 04 Oct 2011 05:00:24 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Tue, 04 Oct 2011 13:00:22 +0100
Subject: Re: [Xen-devel] [PATCH 0/4] introduce and use xzalloc()
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAB0B3E6.31C6F%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH 0/4] introduce and use xzalloc()
Thread-Index: AcyCjTGJa8KztVeofEijUnadyOZYUg==
In-Reply-To: <4E8B0E7202000078000592AC@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/10/2011 12:47, "Jan Beulich" <JBeulich@suse.com> wrote:

> Rather than having to match a call to one of the xmalloc() flavors with
> a subsequent memset(), introduce a zeroing variant of each of those
> flavors.
> 
> 1: introduce xzalloc() & Co
> 2: use xzalloc in common code
> 3: use xzalloc in driver code
> 4: use xzalloc in x86 code
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Uncontentious and a good thing in my view.

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 Tue Oct 04 05:07:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 05:07:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3mi-0003GS-7I; Tue, 04 Oct 2011 05:07:44 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB3gI-0002HI-Qp
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 05:01:12 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317729644!45091324!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11979 invoked from network); 4 Oct 2011 12:00:45 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 12:00:45 -0000
Received: by wyh13 with SMTP id 13so611971wyh.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 05:01:03 -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=fQM45SFFTJkwwOJc0YDQHkWdR2S1ljFVTEfH3hfmJrs=;
	b=MnyJ4iH/A1pcO0QU8BGmYlE4Zuv4iCbs0NQZJ20dqIieB1vFg2nNb734zuC2NAJXj+
	jlrmuH5CrSGUc7ProZC6WAeFkSBaHHoThWHL+xy/mr6W/EKbV94iIucrLTq+mnMvSbM1
	9jK4DpFTtyj9zId14o1foLoqd3w8vYWynb+WI=
Received: by 10.227.3.15 with SMTP id 15mr1526918wbl.33.1317729663240;
	Tue, 04 Oct 2011 05:01:03 -0700 (PDT)
Received: from [192.168.1.3]
	(host213-122-120-74.range213-122.btcentralplus.com. [213.122.120.74])
	by mx.google.com with ESMTPS id fo7sm3059443wbb.20.2011.10.04.05.01.01
	(version=SSLv3 cipher=OTHER); Tue, 04 Oct 2011 05:01:02 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Tue, 04 Oct 2011 13:00:59 +0100
Subject: Re: [Xen-devel] [PATCH] VMX: extend last branch MSR info to cover
	newer CPU models
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAB0B40B.31C70%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] VMX: extend last branch MSR info to cover
	newer CPU models
Thread-Index: AcyCjUeXqoDDmwHrfUOGucLmXct94A==
In-Reply-To: <4E8B0AE60200007800059289@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: Donald D Dugger <donald.d.dugger@intel.com>, "Nakajima,
	Jun" <jun.nakajima@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/10/2011 12:32, "Jan Beulich" <JBeulich@suse.com> wrote:

> There are still a couple of family 6 models missing here: 37, 44, 46,
> and 47 (according to SDM doc changes May 2011); presumably they would
> all go into the Nehalem/Sandy Bridge group. Intel?
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

A nod or Ack from someone at Intel would be nice for this patch.

 -- Keir

> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -1693,6 +1693,20 @@ static const struct lbr_info {
>      { MSR_C2_LASTBRANCH_0_FROM_IP,  NUM_MSR_C2_LASTBRANCH_FROM_TO },
>      { MSR_C2_LASTBRANCH_0_TO_IP,    NUM_MSR_C2_LASTBRANCH_FROM_TO },
>      { 0, 0 }
> +}, nh_lbr[] = {
> +    { MSR_IA32_LASTINTFROMIP,       1 },
> +    { MSR_IA32_LASTINTTOIP,         1 },
> +    { MSR_C2_LASTBRANCH_TOS,        1 },
> +    { MSR_P4_LASTBRANCH_0_FROM_LIP, NUM_MSR_P4_LASTBRANCH_FROM_TO },
> +    { MSR_P4_LASTBRANCH_0_TO_LIP,   NUM_MSR_P4_LASTBRANCH_FROM_TO },
> +    { 0, 0 }
> +}, at_lbr[] = {
> +    { MSR_IA32_LASTINTFROMIP,       1 },
> +    { MSR_IA32_LASTINTTOIP,         1 },
> +    { MSR_C2_LASTBRANCH_TOS,        1 },
> +    { MSR_C2_LASTBRANCH_0_FROM_IP,  NUM_MSR_ATOM_LASTBRANCH_FROM_TO },
> +    { MSR_C2_LASTBRANCH_0_TO_IP,    NUM_MSR_ATOM_LASTBRANCH_FROM_TO },
> +    { 0, 0 }
>  #ifdef __i386__
>  }, pm_lbr[] = {
>      { MSR_IA32_LASTINTFROMIP,       1 },
> @@ -1720,8 +1734,20 @@ static const struct lbr_info *last_branc
>  #endif
>          /* Core2 Duo */
>          case 15:
> +        /* Enhanced Core */
> +        case 23:
>              return c2_lbr;
>              break;
> +        /* Nehalem */
> +        case 26: case 30: case 31: case 46:
> +        /* Sandy Bridge */
> +        case 42: case 45:
> +            return nh_lbr;
> +            break;
> +        /* Atom */
> +        case 28:
> +            return at_lbr;
> +            break;
>          }
>          break;
>  
> --- a/xen/include/asm-x86/msr-index.h
> +++ b/xen/include/asm-x86/msr-index.h
> @@ -472,11 +472,12 @@
>  #define MSR_PM_LASTBRANCH_0  0x00000040
>  #define NUM_MSR_PM_LASTBRANCH  8
>  
> -/* Core 2 last-branch recording */
> +/* Core 2 and Atom last-branch recording */
>  #define MSR_C2_LASTBRANCH_TOS  0x000001c9
>  #define MSR_C2_LASTBRANCH_0_FROM_IP 0x00000040
>  #define MSR_C2_LASTBRANCH_0_TO_IP 0x00000060
>  #define NUM_MSR_C2_LASTBRANCH_FROM_TO 4
> +#define NUM_MSR_ATOM_LASTBRANCH_FROM_TO 8
>  
>  /* Intel Core-based CPU performance counters */
>  #define MSR_CORE_PERF_FIXED_CTR0 0x00000309
> 
> 
> 
> 
> _______________________________________________
> 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 Oct 04 05:20:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 05:20:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB3zD-0003vn-Do; Tue, 04 Oct 2011 05:20:39 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB3yH-0003i6-M7
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 05:19:42 -0700
X-Env-Sender: anthony@overnetdata.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1317730778!33838679!1
X-Originating-IP: [81.137.131.225]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29650 invoked from network); 4 Oct 2011 12:19:38 -0000
Received: from host81-137-131-225.in-addr.btopenworld.com (HELO
	zimbra.overnetdata.com) (81.137.131.225)
	by server-12.tower-174.messagelabs.com with SMTP;
	4 Oct 2011 12:19:38 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by zimbra.overnetdata.com (Postfix) with ESMTP id B36D91616C7;
	Tue,  4 Oct 2011 13:19:18 +0100 (BST)
X-Virus-Scanned: amavisd-new at overnetdata.com
Received: from zimbra.overnetdata.com ([127.0.0.1])
	by localhost (zimbra.overnetdata.com [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id Hd7v33rui+TK; Tue,  4 Oct 2011 13:19:09 +0100 (BST)
Received: from [192.168.1.59] (unknown [192.168.1.59])
	by zimbra.overnetdata.com (Postfix) with ESMTPSA id D01FF1616C4;
	Tue,  4 Oct 2011 13:19:08 +0100 (BST)
Message-ID: <4E8AF9BA.3000906@overnetdata.com>
Date: Tue, 04 Oct 2011 13:19:06 +0100
From: Anthony Wright <anthony@overnetdata.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: David Vrabel <david.vrabel@citrix.com>
Subject: Re: [Xen-devel] dmidecode doesn't work under xen 4.1.1 on certain
	hardware
References: <4E7C6BDC.8070005@overnetdata.com>	<20110923133200.GC19579@phenom.oracle.com>	<4E7C9C8B.2010108@overnetdata.com>	<20110926141322.GD4102@phenom.oracle.com>	<4E8090D4.2090009@overnetdata.com>	<20110926193732.GA10007@phenom.oracle.com>	<4E82E429.2080600@overnetdata.com>	<20110928132815.GE10270@phenom.oracle.com>
	<4E83462B.9080002@overnetdata.com> <4E835324.30902@citrix.com>
In-Reply-To: <4E835324.30902@citrix.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>,
	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 28/09/2011 18:02, David Vrabel wrote:
> On 28/09/11 17:07, Anthony Wright wrote:
>> On 28/09/2011 14:28, Konrad Rzeszutek Wilk wrote:
>>> Would you be up for testing a different variant of that patch just to make
>>> sure?
>> Not a problem, ship me the patch when you're ready. I'm running 3.0.4 at
>> the moment and would prefer to stick with 3.0.x for now, so hope that
>> won't be a problem.
> I've just posted an updated patch series that should include a fix for
> your dmidecode problem.
>
> http://lists.xensource.com/archives/html/xen-devel/2011-09/msg01621.html
>
> If you running 3.0.4 you will also need the first two patches from
>
> http://lists.xensource.com/archives/html/xen-devel/2011-09/msg00817.html
>
> Please give these a try and let me know if they work.
>
> Thanks.
>
> David
I've tried to apply these patches by cutting and pasting them from the
URL, but there's seven of them, I'm having to manually edit them due to
the browser truncating them, and then most don't apply even when I relax
the fuzzing.

Could you email me a single patch that applies to 3.0.4?

thanks,

Anthony.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 05:28:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 05:28:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB46Y-0004Ro-4F; Tue, 04 Oct 2011 05:28:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB462-0004E7-F7
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 05:27:42 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317731236!38396223!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13627 invoked from network); 4 Oct 2011 12:27:16 -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 EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 4 Oct 2011 12:27:16 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317731259; l=865;
	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=xULyXDarNDsG3bnw4QR6keaoxkE=;
	b=v89KEakGMmVWTHAAqjqaLmNrjgOaTUrP0KhR3VvfPrunb7YF4BixUFJ5XhTzvM0Njtt
	e+vXoISf6lRhCGBdDfCVWCatt+aJIEHPTui+P9NZiAVcN3B91a1GRDTW/RAOTOonXI4wI
	mZRi0MJ41YBu45iHkvECQSOqFBxnhwNgu24=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by smtp.strato.de (fruni mo37) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 406c0bn94BcZo9
	for <xen-devel@lists.xensource.com>;
	Tue, 4 Oct 2011 14:27:22 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 53ED118892
	for <xen-devel@lists.xensource.com>;
	Tue,  4 Oct 2011 14:27:21 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: e77dd1bf489436d9f115be5d77327d1bbde1f1d2
Message-Id: <e77dd1bf489436d9f115.1317731239@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 04 Oct 2011 14:27:19 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] p2m: use correct p2m_type_t in
	clear_mmio_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

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1317731210 -7200
# Node ID e77dd1bf489436d9f115be5d77327d1bbde1f1d2
# Parent  28556fcb81957a996b2c4b23a450cfefd95338b3
p2m: use correct p2m_type_t in clear_mmio_p2m_entry

clear_mmio_p2m_entry() should mark the gfn as invalid.
Use proper name instead of numerical value. The currently used value of
zero means p2m_ram_rw.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 28556fcb8195 -r e77dd1bf4894 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -628,7 +628,7 @@ clear_mmio_p2m_entry(struct domain *d, u
         return 0;
     }
     p2m_lock(p2m);
-    rc = set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, 0, p2m->default_access);
+    rc = set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, p2m_invalid, p2m->default_access);
     audit_p2m(p2m, 1);
     p2m_unlock(p2m);
 

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 05:29:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 05:29:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB47l-0004qN-0a; Tue, 04 Oct 2011 05:29:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB474-0004cb-J4
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 05:28:48 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-182.messagelabs.com!1317731322!18041287!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30188 invoked from network); 4 Oct 2011 12:28:43 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-2.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 4 Oct 2011 12:28:43 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317731322; l=2253;
	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=ZdILLQ1GZzQkStNd0Sx8Z/QBQBE=;
	b=R79VYgk1FhvA2ZiCYVozWnQ8wl9ek+vkEfyZR0yDpeufW8k9hwWLWkkeQ7jwgeCrkCQ
	S3+K+8tH1ZB9I7WP0+rKS4tJZ6/YgrYM5cy+kWzNVXKeWkXC23K04HBdp8VMXiAhiaqi2
	BvmOmmhq7rL8dhX4zs+4NNuScX+brxojxTs=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by post.strato.de (mrclete mo63) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 205542n94BwWJL
	for <xen-devel@lists.xensource.com>;
	Tue, 4 Oct 2011 14:28:21 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 1462218892
	for <xen-devel@lists.xensource.com>;
	Tue,  4 Oct 2011 14:28:21 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 9c0bf50bfbb645ec80b7a5e1da2dbd94e326f720
Message-Id: <9c0bf50bfbb645ec80b7.1317731300@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 04 Oct 2011 14:28:20 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] p2m: query/modify p2mt with p2m_lock held
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317731245 -7200
# Node ID 9c0bf50bfbb645ec80b7a5e1da2dbd94e326f720
# Parent  e77dd1bf489436d9f115be5d77327d1bbde1f1d2
p2m: query/modify p2mt with p2m_lock held

Query and update the p2mt in set_mmio_p2m_entry, clear_mmio_p2m_entry
and set_shared_p2m_entry with the p2m_lock held.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r e77dd1bf4894 -r 9c0bf50bfbb6 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -583,9 +583,11 @@ set_mmio_p2m_entry(struct domain *d, uns
     if ( !paging_mode_translate(d) )
         return 0;
 
+    p2m_lock(p2m);
     omfn = gfn_to_mfn_query(d, gfn, &ot);
     if ( p2m_is_grant(ot) )
     {
+        p2m_unlock(p2m);
         domain_crash(d);
         return 0;
     }
@@ -596,7 +598,6 @@ set_mmio_p2m_entry(struct domain *d, uns
     }
 
     P2M_DEBUG("set mmio %lx %lx\n", gfn, mfn_x(mfn));
-    p2m_lock(p2m);
     rc = set_p2m_entry(p2m, gfn, mfn, 0, p2m_mmio_direct, p2m->default_access);
     audit_p2m(p2m, 1);
     p2m_unlock(p2m);
@@ -618,18 +619,20 @@ clear_mmio_p2m_entry(struct domain *d, u
     if ( !paging_mode_translate(d) )
         return 0;
 
-    mfn = gfn_to_mfn(d, gfn, &t);
+    p2m_lock(p2m);
+    mfn = gfn_to_mfn_query(d, gfn, &t);
 
     /* Do not use mfn_valid() here as it will usually fail for MMIO pages. */
     if ( (INVALID_MFN == mfn_x(mfn)) || (t != p2m_mmio_direct) )
     {
         gdprintk(XENLOG_ERR,
             "clear_mmio_p2m_entry: gfn_to_mfn failed! gfn=%08lx\n", gfn);
-        return 0;
+        goto out;
     }
-    p2m_lock(p2m);
     rc = set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, p2m_invalid, p2m->default_access);
     audit_p2m(p2m, 1);
+
+out:
     p2m_unlock(p2m);
 
     return rc;
@@ -646,6 +649,7 @@ set_shared_p2m_entry(struct domain *d, u
     if ( !paging_mode_translate(p2m->domain) )
         return 0;
 
+    p2m_lock(p2m);
     omfn = gfn_to_mfn_query(p2m->domain, gfn, &ot);
     /* At the moment we only allow p2m change if gfn has already been made
      * sharable first */
@@ -655,7 +659,6 @@ set_shared_p2m_entry(struct domain *d, u
     set_gpfn_from_mfn(mfn_x(omfn), INVALID_M2P_ENTRY);
 
     P2M_DEBUG("set shared %lx %lx\n", gfn, mfn_x(mfn));
-    p2m_lock(p2m);
     rc = set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_shared, p2m->default_access);
     p2m_unlock(p2m);
     if ( 0 == rc )

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 06:03:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 06:03:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB4ec-0006md-Dc; Tue, 04 Oct 2011 06:03:26 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB4be-0006Y5-SB
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 06:00:34 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-13.tower-21.messagelabs.com!1317733212!51445761!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16704 invoked from network); 4 Oct 2011 13:00:13 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 13:00:13 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317733218; l=305;
	s=domk; d=aepfle.de;
	h=In-Reply-To:Content-Type:MIME-Version:References:Subject:To:From:
	Date:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=OhkCJER+4I0NpEk1Q77qfG8xueo=;
	b=h/YpRiNDv1hcz3j5Jzw/Qb9w9gzpWMPQ6oz+PzfUb7QL/9twaIfqGMM4xb3uiqOeWBo
	uN1mcto9KZCb/ncqL7PmzoskqgPGZpbDP6eO1vncbzFUjlATyulD9cU2TY774iehI/LAk
	Bb0t0gXPi1D2kyGyvjj+N5Atzldth6N6ig4=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by smtp.strato.de (cohen mo30) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id n061f5n94BWUWK
	for <xen-devel@lists.xensource.com>;
	Tue, 4 Oct 2011 15:00:09 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 209E718B65; Tue,  4 Oct 2011 15:00:08 +0200 (CEST)
Date: Tue, 4 Oct 2011 15:00:08 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] [PATCH] p2m: use correct p2m_type_t in
	clear_mmio_p2m_entry
Message-ID: <20111004130008.GA10476@aepfle.de>
References: <e77dd1bf489436d9f115.1317731239@probook.site>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <e77dd1bf489436d9f115.1317731239@probook.site>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, Oct 04, Olaf Hering wrote:

> p2m: use correct p2m_type_t in clear_mmio_p2m_entry
> 
> clear_mmio_p2m_entry() should mark the gfn as invalid.
> Use proper name instead of numerical value. The currently used value of
> zero means p2m_ram_rw.

This bug is also in xen-4.1-testing.hg

Olaf

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 06:16:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 06:16:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB4qs-0007Kk-Bp; Tue, 04 Oct 2011 06:16:07 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB4q4-00078N-1M
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 06:15:17 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317734097!56629261!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 762 invoked from network); 4 Oct 2011 13:14:57 -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;
	4 Oct 2011 13:14:57 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312156800"; 
   d="scan'208";a="8200671"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 13:15: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; Tue, 4 Oct 2011
	14:15:11 +0100
Subject: Re: [Xen-devel] Help with test_and_clear_bit on events
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
Date: Tue, 4 Oct 2011 14:15:10 +0100
In-Reply-To: <CAP2B85-HDdsrhsUJv1b3sq4D5LnvX8NhAVg0ZbnBuVe_0w=MzA@mail.gmail.com>
References: <CAP2B85_LhqE9F53FAJ3ez3+GDichDTcWiau=x2zdftqGdcADag@mail.gmail.com>
	<1317726163.21903.113.camel@zakaz.uk.xensource.com>
	<CAP2B85-HDdsrhsUJv1b3sq4D5LnvX8NhAVg0ZbnBuVe_0w=MzA@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: <1317734110.21903.132.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-10-04 at 12:23 +0100, Daniel Castro wrote:
> On Tue, Oct 4, 2011 at 8:02 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Tue, 2011-10-04 at 11:57 +0100, Daniel Castro wrote:
> >> Hello List,
> >>
> >> I have been trying for several days to be able to wait for events and
> >> then continue execution based on the event received. My problem is in
> >> the wait_ring function of xenbus.c
> >> After debugging my test_and_clear_bit I corrected the error that
> >> allows me to receive ONE event, but after that the bit is never set
> >> again. My offset is always 2 (nr eq 2).
> >> Please, can someone explain me how struct shared_info and these two
> >> fields control the events that I can receive?
> >> unsigned long evtchn_pending[sizeof(unsigned long) * 8];
> >> unsigned long evtchn_mask[sizeof(unsigned long) * 8];
> >>
> >> I print the whole array Bit by Bit and I do not see a difference after
> >> the arrival of the event and before the arrival.
> >>
> >> I also checked struct vcpu_info fields: u8 evtchn_upcall_pending and
> >> u8 evtchn_upcall_mask to see if they are disabling the event delivery.
> >> No changes before or after.
> >
> > If git://github.com/evildani/seabios_patch.git master is up to date
> > then:
> >    shared_info = malloc_high(sizeof(shared_info));
> >    xatp.gpfn  = ((unsigned long)shared_info << PAGE_SHIFT);
> > is wrong and you aren't registering the correct shared_info so you
> > aren't actually looking at the right bits, the change in behaviour is
> > just because you are now looking at different wrong bits.
> >
> > You need ">>" not "<<" (consider the relation between addresses and page
> > numbers...).
> 
> Thanks, sorry for the typo, I just corrected it, the same behavior persists.
> 
> The output for shinfo->evtchn_pending[2] is
> 11001100110011001100110011001100, which bit am I supposed to change?

evtchn2 is bit 2 in evtchn_pending[0] so it is none of the above. If
this were evtchn_pending[0] instead then it would be the third bit from
the right (the rightmost bit would be evtchn 0, the leftmost being
evtchn 31).

However this value for evtchn_pending[2] (which, in the 32 bit ABI,
contains the pending bits for evtchns 64-96) looks very dubious to me:
it's rather too regular and we can be pretty sure event channels up
there are not yet in use. I'm still not 100% convinced you are seeing
the actual shared info.

Does shinfo->wc_sec contains something approximating the number of
seconds since 00:00:00 UTC, Jan 1, 1970? (i.e. something close to "date
+%s")

> Here I am confused.
> Also I have: VCPU.0 evtchn_upcall_mask 11000010 AND evntchn_pending 11000010

(assuming you mean evtchn_upcall_pending not evtchn_pending)

Those values also seem a bit unlikely.

Although C only distinguishes zero and non-zero as truth values at least
on the Xen side evtchn_upcall_mask is generally set to exactly 1 or 0. A
guest may do otherwise, I think, but I don't think hvmloader or your
code are actually touching it.

> Sorry but I am somewhat confused by all this. Is this documented somewhere?

There are reasonably complete comments in xen/include/public/xen.h
associated with the fields in vcpu_info and shared_info which explain
what is going on. I think this is also one area where the existing
interface.pdf docs are actually ok, this ABI has been part of Xen since
3.0.0 (if not much earlier) so any book you have which covers it ought
to still be relevant.

Ian.

> 
> Million Thanks again!
> 
> >
> > Ian.
> >
> >
> >
> 
> 
> 



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 06:20:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 06:20:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB4v6-0007kO-Ku; Tue, 04 Oct 2011 06:20:28 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB4uX-0007Y2-IS
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 06:19:54 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1317734381!62096746!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11877 invoked from network); 4 Oct 2011 13:19:41 -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;
	4 Oct 2011 13:19:41 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312156800"; 
   d="scan'208";a="8200830"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 13:19:50 +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, 4 Oct 2011
	14:19:50 +0100
Subject: Re: [Xen-devel] Help with test_and_clear_bit on events
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
Date: Tue, 4 Oct 2011 14:19:49 +0100
In-Reply-To: <1317726163.21903.113.camel@zakaz.uk.xensource.com>
References: <CAP2B85_LhqE9F53FAJ3ez3+GDichDTcWiau=x2zdftqGdcADag@mail.gmail.com>
	<1317726163.21903.113.camel@zakaz.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: <1317734390.21903.135.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-10-04 at 12:02 +0100, Ian Campbell wrote:
> On Tue, 2011-10-04 at 11:57 +0100, Daniel Castro wrote:
> > Hello List,
> > 
> > I have been trying for several days to be able to wait for events and
> > then continue execution based on the event received. My problem is in
> > the wait_ring function of xenbus.c
> > After debugging my test_and_clear_bit I corrected the error that
> > allows me to receive ONE event, but after that the bit is never set
> > again. My offset is always 2 (nr eq 2).
> > Please, can someone explain me how struct shared_info and these two
> > fields control the events that I can receive?
> > unsigned long evtchn_pending[sizeof(unsigned long) * 8];
> > unsigned long evtchn_mask[sizeof(unsigned long) * 8];
> > 
> > I print the whole array Bit by Bit and I do not see a difference after
> > the arrival of the event and before the arrival.
> > 
> > I also checked struct vcpu_info fields: u8 evtchn_upcall_pending and
> > u8 evtchn_upcall_mask to see if they are disabling the event delivery.
> > No changes before or after.
> 
> If git://github.com/evildani/seabios_patch.git master is up to date
> then:
>     shared_info = malloc_high(sizeof(shared_info));

Another bug here. sizeof(shared_info) is sizeof the pointer (i.e. 4),
not the data structure which it points to.

You could use sizeof(*shared_info) but actually you require a page size
and page aligned allocation so you should just use PAGE_SIZE.

If your allocation is not page aligned the shift to calculate gpfn will
effectively round down the address you wanted...

>     xatp.gpfn  = ((unsigned long)shared_info << PAGE_SHIFT);
> is wrong and you aren't registering the correct shared_info so you
> aren't actually looking at the right bits, the change in behaviour is
> just because you are now looking at different wrong bits.
> 
> You need ">>" not "<<" (consider the relation between addresses and page
> numbers...).
> 
> Ian.
> 
> 
> 
> _______________________________________________
> 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 Oct 04 06:22:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 06:22:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB4xO-00088y-UH; Tue, 04 Oct 2011 06:22:50 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB4wu-0007ws-48
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 06:22:21 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317734424!38798300!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27118 invoked from network); 4 Oct 2011 13:20:24 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Oct 2011 13:20:24 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RB4wo-000IMY-4D; Tue, 04 Oct 2011 13:22:14 +0000
Date: Tue, 4 Oct 2011 14:22:14 +0100
From: Tim Deegan <tim@xen.org>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: Re: [Xen-devel] Help with test_and_clear_bit on events
Message-ID: <20111004132214.GA70432@ocelot.phlegethon.org>
References: <CAP2B85_LhqE9F53FAJ3ez3+GDichDTcWiau=x2zdftqGdcADag@mail.gmail.com>
	<1317726163.21903.113.camel@zakaz.uk.xensource.com>
	<CAP2B85-HDdsrhsUJv1b3sq4D5LnvX8NhAVg0ZbnBuVe_0w=MzA@mail.gmail.com>
	<1317734110.21903.132.camel@zakaz.uk.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1317734110.21903.132.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.4.2.1i
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

At 14:15 +0100 on 04 Oct (1317737710), Ian Campbell wrote:
> On Tue, 2011-10-04 at 12:23 +0100, Daniel Castro wrote:
> > The output for shinfo->evtchn_pending[2] is
> > 11001100110011001100110011001100, which bit am I supposed to change?
> 
> However this value for evtchn_pending[2] (which, in the 32 bit ABI,
> contains the pending bits for evtchns 64-96) looks very dubious to me:
> it's rather too regular and we can be pretty sure event channels up
> there are not yet in use. I'm still not 100% convinced you are seeing
> the actual shared info.

In particular this is 0xcccccccc , which is a string of x86 NOPs - are
you sure this isn't the hypercall page by mistake?

Tim.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 06:25:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 06:25:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB4zl-00005x-Tg; Tue, 04 Oct 2011 06:25:17 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB4yz-0008LF-S3
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 06:24:30 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1317734665!19684008!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14786 invoked from network); 4 Oct 2011 13:24:26 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 13:24:26 -0000
Received: by qyg14 with SMTP id 14so442784qyg.9
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 06:24:25 -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:content-type;
	bh=LRKTWAOS3TbGrhtEoRdBIJRC7+9vDx6NGNXvjmMS3nA=;
	b=Cq6hrQDC4PIN0qC12D6HoBhDEtZO1LSOZ6OBn1UOwwouoXZ8w3CLSSSLzAO+vwLjWc
	jCfHh3RYOIU51Ve/9Jy28nLwjXFwUhpNHMffOxw+wpf3s7pY8dplsGnVkRAOvmseKTmU
	ykgkn9/GuGTD5bnuq4qWmuSQ+yJA5Z2DrQN+s=
MIME-Version: 1.0
Received: by 10.68.34.138 with SMTP id z10mr9434894pbi.105.1317734665254; Tue,
	04 Oct 2011 06:24:25 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Tue, 4 Oct 2011 06:24:25 -0700 (PDT)
In-Reply-To: <patchbomb.1317386580@loki>
References: <patchbomb.1317386580@loki>
Date: Tue, 4 Oct 2011 15:24:25 +0200
X-Google-Sender-Auth: 8iC37LldPcyGEVRdUip7nHvjd4A
Message-ID: <CAPLaKK7cbZG5SnCKdi7DaivNWmz6Ojj5NzFkQ=Wo-jL3RYEQKA@mail.gmail.com>
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=UTF-8
Subject: [Xen-devel] Re: [PATCH 0 of 9] Call hotplug scripts from libxl
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 just realized that there's a drawback with this implementation,
domains that are closed from inside the VM (a typical "shutdown -h
now") do not trigger the launch of hotplug scripts, since libxl is not
running and is not aware that the domain has powered off. Don't know
the best way to solve this issue, that doesn't take us back to having
a separate daemon that monitors xenstore states (or udev on Linux).

Regards, Roger.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 06:34:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 06:34:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB58y-0000pW-4p; Tue, 04 Oct 2011 06:34:48 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB589-0000d7-Ps
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 06:33:59 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1317735217!61490746!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23596 invoked from network); 4 Oct 2011 13:33:37 -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;
	4 Oct 2011 13:33:37 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312156800"; 
   d="scan'208";a="8201417"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 13:33: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; Tue, 4 Oct 2011
	14:33:54 +0100
Subject: Re: [Xen-devel] Re: [PATCH 0 of 9] Call hotplug scripts from libxl
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Tue, 4 Oct 2011 14:33:54 +0100
In-Reply-To: <CAPLaKK7cbZG5SnCKdi7DaivNWmz6Ojj5NzFkQ=Wo-jL3RYEQKA@mail.gmail.com>
References: <patchbomb.1317386580@loki>
	<CAPLaKK7cbZG5SnCKdi7DaivNWmz6Ojj5NzFkQ=Wo-jL3RYEQKA@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317735234.21903.141.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-10-04 at 14:24 +0100, Roger Pau MonnÃ© wrote:
> I've just realized that there's a drawback with this implementation,
> domains that are closed from inside the VM (a typical "shutdown -h
> now") do not trigger the launch of hotplug scripts, since libxl is not
> running and is not aware that the domain has powered off.

By default xl daemonises itself and monitors the domain waiting for it
to exit, at which point it should perform the necessary cleanup (this is
the call to libxl_domain_destroy in handle_domain_death).

If you ask xl to not do this (using the -e or -F options) then you are
expected to call xl destroy yourself.

The call to libxl_domain_destroy calls libxl__devices_destroy which
tears down the backends. Unfortunately this is done in a slightly
generic way but my recent series should have laid the ground work for
doing this in a more device-specific way.

I have a feeling that libxl__device_destroy should really consist of a
sequence of libxl_device_FOO_list+foreach(thing) libxl_device_FOO_remove
calls rather than the current mechanism. i.e. be really explicit about
what it is tearing down.

Ian.

>  Don't know
> the best way to solve this issue, that doesn't take us back to having
> a separate daemon that monitors xenstore states (or udev on Linux).
> 
> Regards, Roger.
> 
> _______________________________________________
> 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 Oct 04 06:46:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 06: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 1RB5KY-0001bm-0Y; Tue, 04 Oct 2011 06:46:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5Jo-0001PF-MG
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 06:46:02 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1317735946!40116265!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16527 invoked from network); 4 Oct 2011 13:45:47 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 13:45:47 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="17925705"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 09:45:56 -0400
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, 4 Oct 2011 09:45:55 -0400
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
	p94DjsHk016920;	Tue, 4 Oct 2011 06:45:55 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a0b8388fc4c82e345377679f4bffe7ab5d9eb55d
Message-ID: <a0b8388fc4c82e345377.1317735953@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 4 Oct 2011 14:45:53 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Anthony.Perard@citrix.com
Subject: [Xen-devel] [PATCH] libxl: remove QMP warning when no pty style
 serial device is configured
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317735934 -3600
# Node ID a0b8388fc4c82e345377679f4bffe7ab5d9eb55d
# Parent  c344d6d30b0f3796ebff069d6ecdde481c9e6a32
libxl: remove QMP warning when no pty style serial device is configured

If the serial device is not "pty" then there is nothing to do but this is not
an error. Removes a spurious warning if e.g. serial="file:/tmp/serial.log" is used:

libxl: error: libxl_qmp.c:137:register_serials_chardev_callback: Failed to store serial port information in xenstore: No such file or directory


Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r c344d6d30b0f -r a0b8388fc4c8 tools/libxl/libxl_qmp.c
--- a/tools/libxl/libxl_qmp.c	Tue Oct 04 14:43:56 2011 +0100
+++ b/tools/libxl/libxl_qmp.c	Tue Oct 04 14:45:34 2011 +0100
@@ -87,7 +87,7 @@ static int store_serial_port_info(libxl_
     int ret = 0;
 
     if (!(chardev && strncmp("pty:", chardev, 4) == 0)) {
-        return -1;
+        return 0;
     }
 
     path = libxl__xs_get_dompath(&gc, qmp->domid);

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:12:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:12:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB5jS-0002Wj-WE; Tue, 04 Oct 2011 07:12:31 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5iP-0002JP-JJ
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:11:26 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1317737472!40122060!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4817 invoked from network); 4 Oct 2011 14:11:12 -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;
	4 Oct 2011 14:11:12 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312156800"; 
   d="scan'208";a="8202664"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 14:11: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; Tue, 4 Oct 2011
	15:11:17 +0100
Subject: Re: [Xen-devel] Help with test_and_clear_bit on events
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
Date: Tue, 4 Oct 2011 15:11:16 +0100
In-Reply-To: <1317734390.21903.135.camel@zakaz.uk.xensource.com>
References: <CAP2B85_LhqE9F53FAJ3ez3+GDichDTcWiau=x2zdftqGdcADag@mail.gmail.com>
	<1317726163.21903.113.camel@zakaz.uk.xensource.com>
	<1317734390.21903.135.camel@zakaz.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: <1317737477.21903.148.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-10-04 at 14:19 +0100, Ian Campbell wrote:

Two more bugs:

A domid is 16 bits not 64, see struct xen_add_to_physmap. So the
structure passed to the hypercall doesn't line up and you don't really
end up with the shared info in the right place.

Secondly in:

	int wait = test_and_clear_bit(event, shinfo->evtchn_pending);
	int ret = 1;
	while (!wait || ret){
		ret = hypercall_sched_op(SCHEDOP_poll, &poll);
		wait = test_and_clear_bit(event, shinfo->evtchn_pending);
	}

This will always go through the loop at least once, even if wait is
already true because ret == 1. But if wait was already one then you have
cleared the bit so wait will then become 0 on the first time through the
loop and since you won't get any more events you get stuck in the loop.
I think you meant && !ret or something, but really you should be doing
BUG on !ret.

With all those fixed things seem to work for me. I do
xenstore-write /local/domain/$(xl domid dHVM-1)/device/vbd/768/test foo
twice to get through the test code and it continues on to boot the
guest.

My patch (with debug and hacks included) is below.

Ian.

diff --git a/src/xen-xs.c b/src/xen-xs.c
index 9f583f9..4c208d4 100644
--- a/src/xen-xs.c
+++ b/src/xen-xs.c
@@ -126,14 +126,21 @@ static void ring_wait(void)
 	memset(&poll, 0, sizeof(poll));
 	set_xen_guest_handle(poll.ports, &event);
 	poll.nr_ports = 1;
-	dprintf(1,"evtchn_pending 0x%p , 0x%lx at event %d \n",shinfo->evtchn_pending,shinfo->evtchn_pending[event],event);
+	dprintf(1, "shared info %p\n", shinfo);
+	dprintf(1,"evtchn_pending %p , 0x%lx at event %d \n",shinfo->evtchn_pending,shinfo->evtchn_pending[0],event);
+	while ( !test_and_clear_bit(event, shinfo->evtchn_pending) )
+		hypercall_sched_op(SCHEDOP_poll, &poll);
+
+#if 0
 	int wait = test_and_clear_bit(event, shinfo->evtchn_pending);
-	int ret = 1;
+	int ret = 0;
+	dprintf(1,"DEBUG bit clear is %d and ret %d\n",wait,ret);
 	while (!wait || ret){
 		ret = hypercall_sched_op(SCHEDOP_poll, &poll);
 		wait = test_and_clear_bit(event, shinfo->evtchn_pending);
 		dprintf(1,"DEBUG bit clear is %d and ret %d\n",wait,ret);
 	}
+#endif
 }
 
 static void ring_wait2(void)
diff --git a/src/xen.c b/src/xen.c
index e8469b0..312c206 100644
--- a/src/xen.c
+++ b/src/xen.c
@@ -154,11 +154,20 @@ struct shared_info *get_shared_info(void)
     xatp.domid = DOMID_SELF;
     xatp.space = XENMAPSPACE_shared_info;
     xatp.idx   = 0;
-    shared_info = malloc_high(sizeof(shared_info));
-    xatp.gpfn  = ((unsigned long)shared_info << PAGE_SHIFT);
+    shared_info = memalign_high(PAGE_SIZE, PAGE_SIZE);
+    memset(shared_info, 0, PAGE_SIZE);
+    xatp.gpfn  = ((unsigned long)shared_info >> PAGE_SHIFT);
+    dprintf(1, "allocated shared info %d bytes at %p, gpfn 0x%lx\n",
+	    sizeof(*shared_info), shared_info, xatp.gpfn);
     //xatp.gpfn  = malloc_high(sizeof(shared_info));
     //shared_info = (struct shared_info *)(xatp.gpfn << PAGE_SHIFT);
     if (hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0)
         panic("MAP info page fail");
+    dprintf(1, "time is %d\n", shared_info->wc_sec);
+    dprintf(1, "evtchn_pending[0] 0x%08lx\n", shared_info->evtchn_pending[0]);
+    dprintf(1, "evtchn_mask[0] 0x%08lx\n", shared_info->evtchn_mask[0]);
+    dprintf(1, "VCPU0 evtchn_upcall_pending 0x%x\n", shared_info->vcpu_info[0].evtchn_upcall_pending);
+    dprintf(1, "VCPU0 evtchn_upcall_mask 0x%x\n", shared_info->vcpu_info[0].evtchn_upcall_mask);
+    dprintf(1, "VCPU0 evtchn_pending_sel 0x%08lx\n", shared_info->vcpu_info[0].evtchn_pending_sel);
     return shared_info;
 }
diff --git a/src/xen.h b/src/xen.h
index 1317af9..d838a7c 100644
--- a/src/xen.h
+++ b/src/xen.h
@@ -480,7 +480,7 @@ static struct xsd_errors __attribute__ ((unused)) xsd_errors[]
 #define XENMEM_add_to_physmap      7
 struct xen_add_to_physmap {
     /* Which domain to change the mapping for. */
-    u64 domid;
+    u16 domid;
 
     /* Source mapping space. */
 #define XENMAPSPACE_shared_info 0 /* shared info page */
@@ -503,7 +503,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t);
 /*
  * Wrappers for hypercalls
  */
-static int hypercall_xen_version( int cmd, void *arg)
+static inline int hypercall_xen_version( int cmd, void *arg)
 {
 	return _hypercall2(int, xen_version, cmd, arg);
 }
@@ -520,7 +520,7 @@ static inline int hypercall_event_channel_op(int cmd, void *arg)
 
 static inline int hypercall_memory_op(int cmd ,void *arg)
 {
-	return _hypercall2(int, memory_op, cmd ,arg);
+	return _hypercall2(int, memory_op, cmd, arg);
 }
 
 static inline int hypercall_sched_op(int cmd, void *arg)



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:13:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:13:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB5kj-0002um-Mg; Tue, 04 Oct 2011 07:13:49 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5k0-0002f3-CG
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:13:06 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1317737574!51461773!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3715 invoked from network); 4 Oct 2011 14:12:54 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:12:54 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312156800"; 
   d="scan'208";a="8202720"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 14:13:00 +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, 4 Oct 2011 15:13:01 +0100
Date: Tue, 4 Oct 2011 15:13:03 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Andrew Cooper <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] Re: Still struggling with HVM: tx timeouts on emulated
	nics
In-Reply-To: <4E8ADAD3.9050404@citrix.com>
Message-ID: <alpine.DEB.2.00.1110041508200.3519@kaball-desktop>
References: <4E7B4768.8060103@canonical.com>
	<alpine.DEB.2.00.1109221838370.8700@kaball-desktop>
	<4E85883C.7030808@canonical.com>
	<alpine.DEB.2.00.1109301427590.3519@kaball-desktop>
	<4E85E8E8.2020702@canonical.com> <4E860382.7040108@canonical.com>
	<alpine.DEB.2.00.1110031800390.3519@kaball-desktop>
	<alpine.DEB.2.00.1110031905200.3519@kaball-desktop>
	<4E8ADAD3.9050404@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 Tue, 4 Oct 2011, Andrew Cooper wrote:
> On 03/10/11 19:13, Stefano Stabellini wrote:
> > CC'ing Jan, that probably is going to have an opinion on this.
> >
> > Let me add a bit of background: Stefan found out that PV on HVM guests
> > could loose level interrupts coming from emulated devices. Looking
> > through the code I realized that we need to add some logic to inject a
> > pirq in the guest if a level interrupt has been raised while the guest
> > is servicing the first one.
> > While this is all very specific to interrupt remapping and emulated
> > devices, I realized that something similar could happen even with dom0
> > or other PV guests with PCI passthrough:
> >
> > 1) the device raises a level interrupt and xen injects it into the
> > guest;
> >
> > 2) the guest is temporarely stuck: it does not ack it or eoi it;
> >
> > 3) the xen timer kicks in and eois the interrupt;
> >
> > 4) the device thinks it is all fine and sends a second interrupt;
> >
> > 5) Xen fails to inject the second interrupt into the guest because the
> > guest has still the event channel pending bit set;
> >
> > at this point the guest looses the second interrupt notification, that
> > is not supposed to happen with level interrupts and I think it might
> > cause problems with some devices.
> >
> > Jan, do you think we should try to handle this case, or is it too
> > unlikely?
> 
> I am not certain whether this is relevant, but the ICH10 IO-APIC
> documentation indicated that early EOI'ing of a line level interrupt
> should not have this effect.  Specifically, it states that EOI'ing a
> line level interrupt whos line is still asserted will cause the
> interrupt to be "re-raised" from the IO-APIC.  It uses this to assert
> that it is fine to use multiple IO-APIC entries with the same vector,
> with a broadcast of vector number alone to EOI the interrupt.
> 
> In this case, while Xen sees two interrupts, from the devices point of
> view, only I has happened.
> 
> In the case where the device has dropped its line level interrupt of its
> own accord, then I would agree that the current Xen behavior is wrong. 
> I cant offhand think of a good reason why this would occur.

I think this scenario is actually possible. It is certainly happening
with qemu's emulated devices.
This patch would take care of re-injecting the interrupts both in the
case of the device deasserting and reasserting the interrupt while the
guest hasn't cleared the pending bit yet and in case a PV on HVM guest
eois the interrupt too early.


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:14:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07: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 1RB5lX-0003Hu-D2; Tue, 04 Oct 2011 07:14:39 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5ke-0002rN-Hz
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:13:45 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317737605!52476920!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5140 invoked from network); 4 Oct 2011 14:13:25 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:13:25 -0000
Received: by wwf27 with SMTP id 27so757993wwf.24
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 07:13:41 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:from:to:cc:subject:date:message-id:x-mailer;
	bh=xe+oaZIl5DSssVEQUk1pPxftW8CjsgYNeoaAtMnItkQ=;
	b=IoY47JN5NXveYN3cCIaaBkUyc/pCbEv4CjBaTdbBmXqWYoYV2TpILS69FNSK2LVNIe
	Sj8XHsAtl1J/rimeUCH3vCzIq2FpwZr1HuL6ZYJXS93zLnEMPVsHrp2DmwcKVZ1/r09/
	rVtul0mh9J4qsN2u6lDzbyI/QrojbZDxntyJA=
Received: by 10.216.229.103 with SMTP id g81mr1498287weq.0.1317737621160;
	Tue, 04 Oct 2011 07:13:41 -0700 (PDT)
Received: from localhost.localdomain (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id j18sm3973011wbo.6.2011.10.04.07.13.38
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 04 Oct 2011 07:13:39 -0700 (PDT)
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Date: Tue,  4 Oct 2011 16:13:19 +0200
Message-Id: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
X-Mailer: git-send-email 1.7.6.3
Cc: Roger Pau Monne <roger.pau@entel.upc.edu>,
	"Charlie Root \(none\)" <root@loki.>
Subject: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Charlie Root <root@loki.(none)>

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>
---
 hw/xen_machine_pv.c |    2 +-
 xen-config-host.h   |    2 +-
 xen-hooks.mak       |    2 ++
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/hw/xen_machine_pv.c b/hw/xen_machine_pv.c
index 0004904..c09adbb 100644
--- a/hw/xen_machine_pv.c
+++ b/hw/xen_machine_pv.c
@@ -47,7 +47,7 @@ static void xen_init_pv(ram_addr_t ram_size, int vga_ram_size,
     CPUState *env;
     uint32_t domid_target;
 
-#ifndef CONFIG_STUBDOM
+#if !defined(CONFIG_STUBDOM) && !defined(__NetBSD__)
     /* Initialize tapdisk client */
     init_blktap();
 #endif
diff --git a/xen-config-host.h b/xen-config-host.h
index f50c3aa..818f25d 100644
--- a/xen-config-host.h
+++ b/xen-config-host.h
@@ -18,7 +18,7 @@ extern int domid, domid_backend;
 
 #include "xenctrl.h"
 #include "xs.h"
-#ifndef CONFIG_STUBDOM
+#if !defined(CONFIG_STUBDOM) && !defined(__NetBSD__)
 #include "blktaplib.h"
 #endif
 
diff --git a/xen-hooks.mak b/xen-hooks.mak
index 253915d..b55f45b 100644
--- a/xen-hooks.mak
+++ b/xen-hooks.mak
@@ -46,11 +46,13 @@ CONFIG_SDL=
 CONFIG_AUDIO=
 OBJS += xenfbfront.o
 else
+ifndef CONFIG_NetBSD
 CPPFLAGS+= -I$(XEN_ROOT)/tools/blktap/lib
 LIBS += -L$(XEN_ROOT)/tools/blktap/lib -lblktap
 OBJS += xen_blktap.o
 OBJS += tpm_tis.o
 endif
+endif
 
 ifdef CONFIG_STUBDOM
 CONFIG_PASSTHROUGH=1
-- 
1.7.6.3


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:15:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:15:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB5mS-0003fW-K5; Tue, 04 Oct 2011 07:15:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5m0-0003TR-3b
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:15:08 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1317737675!57663127!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10192 invoked from network); 4 Oct 2011 14:14:37 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:14:37 -0000
Received: by pzk34 with SMTP id 34so1438531pzk.8
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 07:15:03 -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=fkW7EayzrDg0HN4w7Tk8RtYk3Ogo23NDbol+8KfDR6Y=;
	b=Hryy885cJbKs1GqvGo4a400sqFnLwdsLn7J35H+kn4fbcgxVbNEaKmnfAFkaCEL1jj
	bFfoQWn5EDpBDACEJN50OdBCEGtxfgKD1DSfd9K8DkTZzgcYN0Phumf8O/GpIdVdhW58
	4yFsdc55g0c+yNDoYpPa8DkwHKYVfRy/XQFCQ=
MIME-Version: 1.0
Received: by 10.68.22.105 with SMTP id c9mr9779651pbf.88.1317737703020; Tue,
	04 Oct 2011 07:15:03 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Tue, 4 Oct 2011 07:15:02 -0700 (PDT)
In-Reply-To: <1317735234.21903.141.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317386580@loki>
	<CAPLaKK7cbZG5SnCKdi7DaivNWmz6Ojj5NzFkQ=Wo-jL3RYEQKA@mail.gmail.com>
	<1317735234.21903.141.camel@zakaz.uk.xensource.com>
Date: Tue, 4 Oct 2011 16:15:02 +0200
X-Google-Sender-Auth: -3B6h9w3AIfxhzOs4g2_2RzwDCA
Message-ID: <CAPLaKK5kCDXiuEeUrJotC4x6qKRTnv6w=kV0VBfZ64hHjQNpcA@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [PATCH 0 of 9] Call hotplug scripts from libxl
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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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/10/4 Ian Campbell <Ian.Campbell@citrix.com>:
> By default xl daemonises itself and monitors the domain waiting for it
> to exit, at which point it should perform the necessary cleanup (this is
> the call to libxl_domain_destroy in handle_domain_death).

libxl daemonises itself if you call "xl shutdown <domain>", but if the
domain shuts down from inside (doing a "halt"), xl is never called,
and therefore hotplug scripts are not executed.

> If you ask xl to not do this (using the -e or -F options) then you are
> expected to call xl destroy yourself.
>
> The call to libxl_domain_destroy calls libxl__devices_destroy which
> tears down the backends. Unfortunately this is done in a slightly
> generic way but my recent series should have laid the ground work for
> doing this in a more device-specific way.
>
> I have a feeling that libxl__device_destroy should really consist of a
> sequence of libxl_device_FOO_list+foreach(thing) libxl_device_FOO_remove
> calls rather than the current mechanism. i.e. be really explicit about
> what it is tearing down.
>
> Ian.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:20:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:20:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB5rT-00049h-Re; Tue, 04 Oct 2011 07:20:47 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5qd-0003wY-KM
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:19:56 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1317737992!33889852!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28932 invoked from network); 4 Oct 2011 14:19:52 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-4.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Oct 2011 14:19:52 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 04 Oct 2011 15:19:51 +0100
Message-Id: <4E8B322302000078000593AC@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 04 Oct 2011 15:19:47 +0100
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] linux-2.6.18/x86-64: streamline syscall 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

System calls using the sysret exit path (or its VGCF_in_syscall IRET
equivalent on Xen) always go into user mode, hence the conditionals
in HYPERVISOR_IRET can be omitted entirely.

Further, there's no need to spill %rcx to the stack upon syscall entry
(neither does native code): No argument gets passed there, and due to
the use of the syscall instruction the register's contents don't need
to be preserved either.

Finally, rather than restoring %rcx and %r11 (not preserved by syscall/
sysret anyway) from the stack frame, we can as well simply clear them
out (to avoid leaking kernel data), thus reducing the necessary memory
(cache) bandwidth.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/arch/x86_64/kernel/entry-xen.S
+++ b/arch/x86_64/kernel/entry-xen.S
@@ -153,6 +153,7 @@ NMI_MASK =3D 0x80000000
          * with rax, r11, and rcx being taken care of in the hypercall =
stub.
          */
 	.macro HYPERVISOR_IRET flag
+	.if \flag =3D=3D 0	# return from syscall always uses the =
hypercall
 	testb $3,1*8(%rsp)
 	jnz   2f
 	testl $NMI_MASK,2*8(%rsp)
@@ -165,6 +166,7 @@ NMI_MASK =3D 0x80000000
 	orl   $3,1*8(%rsp)
 	orl   $3,4*8(%rsp)
 1:	iretq
+	.endif
=20
 2:	/* Slow iret via hypervisor. */
 	andl  $~NMI_MASK, 2*8(%rsp)
@@ -248,7 +250,7 @@ END(ret_from_fork)
=20
 ENTRY(system_call)
 	_frame (RIP-0x10)
-	SAVE_ARGS -8,0
+	SAVE_ARGS -8,1
 	movq  %rax,ORIG_RAX-ARGOFFSET(%rsp)=20
 	GET_THREAD_INFO(%rcx)
 	testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadi=
nfo_flags(%rcx)
@@ -279,8 +281,9 @@ sysret_check:
 	 * sysretq will re-enable interrupts:
 	 */
 	TRACE_IRQS_ON
-        XEN_UNBLOCK_EVENTS(%rsi)               =20
-	RESTORE_ARGS 0,8,0
+	RESTORE_ARGS 0,8,1,1
+	xor %ecx,%ecx
+	xor %r11,%r11
         HYPERVISOR_IRET VGCF_IN_SYSCALL
=20
 	/* Handle reschedules */




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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:22:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:22:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB5tG-0004ZO-9h; Tue, 04 Oct 2011 07:22:38 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5sb-0004Ls-Uu
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:21:58 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317738094!40786804!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21159 invoked from network); 4 Oct 2011 14:21: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 DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 14:21:34 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317738114; l=1385;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=47cSKJfNcpg9nZqEPz3vQaZKdCw=;
	b=Z17poMltg3GZgQpW+KKbJlvEGipU8KlXh5xiIIWM/gBbcO+KaiJQILJGP1lq9gHst/4
	CJvJcDSz3Z8s4+A24mL6rMnHMLAx4u1emBO5/r4MMI3p5bJ6gDUR9z7fXQLYK8ypfDzPy
	MwiFVCCjEIUPC1fIUVYoqeFjxlMYZRBG8G0=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by smtp.strato.de (jimi mo38) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id j0085fn94EHTKg
	for <xen-devel@lists.xensource.com>;
	Tue, 4 Oct 2011 16:21:51 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 8D27518B65
	for <xen-devel@lists.xensource.com>;
	Tue,  4 Oct 2011 16:21:50 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c2daf20cf860d942d1105ce2f5fa7e171c536466
Message-Id: <c2daf20cf860d942d110.1317738110@probook.site>
In-Reply-To: <patchbomb.1317738109@probook.site>
References: <patchbomb.1317738109@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 04 Oct 2011 16:21:50 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 1 of 7] tools/check: remove check_logging
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317738016 -7200
# Node ID c2daf20cf860d942d1105ce2f5fa7e171c536466
# Parent  0b66e6450ffe6823d8b323ef4248b38fe7372d54
tools/check: remove check_logging

Remove tools/check/check_logging.
Python 2.3 is the minimal required python version so the checked
function is available anyway.
It is the only python script, its in the way for an subsequent
change which will call all check_* scripts with shell.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 0b66e6450ffe -r c2daf20cf860 tools/check/check_logging
--- a/tools/check/check_logging
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env python
-#  -*- mode: python; -*-
-
-import os
-import sys
-
-def hline():
-    print >>sys.stderr, "*" * 70
-
-def msg(message):
-    print >>sys.stderr, "*" * 3, message
-
-def check_logging():
-    """Check python logging is installed and raise an error if not.
-    Logging is standard from Python 2.3 on.
-    """
-    try:
-        import logging
-    except ImportError:
-        hline()
-        msg("")
-        msg("  *** Python logging is not installed.")
-        msg("  *** Use 'make install-logging' at the xen root to install.")
-        msg("  *** ")
-        msg("  *** Alternatively download and install from")
-        msg("  *** http://www.red-dove.com/python_logging.html")
-        hline()
-        sys.exit(1)
-
-if __name__ == '__main__':
-    check_logging()

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:24:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:24:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB5ui-00053X-9U; Tue, 04 Oct 2011 07:24:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5sg-0004M6-NS
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:22:03 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317738130!54082090!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2115 invoked from network); 4 Oct 2011 14:22:10 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-3.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 4 Oct 2011 14:22:10 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317738119; l=2448;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=vGj2BWKHBxZzImCvc9YCyVbBh8w=;
	b=ONbS3adWvuPP4HzaewvrgPu3zXw+637Nnoilvh8fRlEGB+YgYUWzLWUEavgS6p5FjOW
	01FQDcnB5bhzM9hhHDnARN+abzxVXP+Ic2yPlE+iUHT/jRKXe8OiH/iSoH7cZbBOIWwEj
	ZhTfW0Mz/1crWg2g1q9xVjsrDSrcUffl/sE=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by post.strato.de (mrclete mo50) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id z04dc0n94Cqrq8
	for <xen-devel@lists.xensource.com>;
	Tue, 4 Oct 2011 16:21:51 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id B003A18B66
	for <xen-devel@lists.xensource.com>;
	Tue,  4 Oct 2011 16:21:50 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: bcd7b8ee7e99dc6348c3132a7248db5829bc53f9
Message-Id: <bcd7b8ee7e99dc6348c3.1317738111@probook.site>
In-Reply-To: <patchbomb.1317738109@probook.site>
References: <patchbomb.1317738109@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 04 Oct 2011 16:21:51 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 2 of 7] tools/check: call all check_* scripts
	with shell
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317738016 -7200
# Node ID bcd7b8ee7e99dc6348c3132a7248db5829bc53f9
# Parent  c2daf20cf860d942d1105ce2f5fa7e171c536466
tools/check: call all check_* scripts with shell

Adding new check_* scripts via patch should be possible.
Expect that every script is a shell script and call it with sh.
This removes the need for executable permissions of the individual scripts.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r c2daf20cf860 -r bcd7b8ee7e99 install.sh
--- a/install.sh
+++ b/install.sh
@@ -51,7 +51,7 @@ echo "All done."
 
 echo "Checking to see whether prerequisite tools are installed..."
 cd $src/../check
-./chk install
+sh chk install
 echo "All done."
 
 exit 0
diff -r c2daf20cf860 -r bcd7b8ee7e99 tools/check/Makefile
--- a/tools/check/Makefile
+++ b/tools/check/Makefile
@@ -7,13 +7,13 @@ 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
+	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) $(SHELL) chk build
 
 # Check this machine is OK for installing on.
 .PHONY: check-install
 check-install:
-	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) ./chk install
+	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) $(SHELL) chk install
 
 .PHONY: clean
 clean:
-	./chk clean
+	$(SHELL) chk clean
diff -r c2daf20cf860 -r bcd7b8ee7e99 tools/check/README
--- a/tools/check/README
+++ b/tools/check/README
@@ -1,11 +1,11 @@
 Checks for the suitability of a machine for Xen build or install.
 To check for build suitability use
 
-        ./chk build
+        sh chk build
 
 To check for install suitability use
 
-        ./chk install
+        sh chk install
 
 The chk script will run checks in this directory and print
 the ones that failed. It prints nothing if checks succeed.
@@ -17,4 +17,4 @@ are run for the build check, and files c
 are run for the install check.
 
 Detailed output from the check scripts is in .chkbuild for build
-and .chkinstall for install.
\ No newline at end of file
+and .chkinstall for install.
diff -r c2daf20cf860 -r bcd7b8ee7e99 tools/check/chk
--- a/tools/check/chk
+++ b/tools/check/chk
@@ -53,7 +53,7 @@ for f in check_* ; do
         continue
     fi
     echo -n "Checking $f: "
-    if ./$f 2>&1 ; then
+    if sh $f 2>&1 ; then
         echo OK
     else
         failed=1

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:24:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:24:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB5vX-0005Q3-FR; Tue, 04 Oct 2011 07:24:59 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5sj-0004Nc-UD
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:22:06 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-6.tower-174.messagelabs.com!1317738122!31731113!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31712 invoked from network); 4 Oct 2011 14:22:02 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-6.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 4 Oct 2011 14:22:02 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317738122; l=1113;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=PX03S3XDGt4ryPSW7FpqYOTC2CU=;
	b=dpPGLEMsNLvROcQqm0x9/lqjNXXXRHtLm933yK/k/bX1meZYX1MpBBOZ7BFPOqMzAIs
	aom0jcEwAIUOB6K0gDA1t8DUKmtkb7y3QNOR6gZ5g9tvIxU+JOfby8xyRIYt4Mex1w59K
	hT/YLc+x/C4UenKaQDc+WJ6F84MxkU+Mhq0=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by smtp.strato.de (klopstock mo42) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id J021a3n94CgDPd
	for <xen-devel@lists.xensource.com>;
	Tue, 4 Oct 2011 16:21:52 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 009FA18B68
	for <xen-devel@lists.xensource.com>;
	Tue,  4 Oct 2011 16:21:51 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 6fa23fea467024cf546b0c7d330c43136775825c
Message-Id: <6fa23fea467024cf546b.1317738113@probook.site>
In-Reply-To: <patchbomb.1317738109@probook.site>
References: <patchbomb.1317738109@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 04 Oct 2011 16:21:53 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 4 of 7] tools: call xen-setup with shell
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317738018 -7200
# Node ID 6fa23fea467024cf546b0c7d330c43136775825c
# Parent  738452bd9f33343e46a8e05a3f999935ca5e4c2e
tools: call xen-setup with shell

Removes the need for executable permissions in SCM.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 738452bd9f33 -r 6fa23fea4670 stubdom/Makefile
--- a/stubdom/Makefile
+++ b/stubdom/Makefile
@@ -296,7 +296,7 @@ ioemu: cross-zlib cross-libpci libxc
 	    TARGET_CPPFLAGS="$(TARGET_CPPFLAGS)" \
 	    TARGET_CFLAGS="$(TARGET_CFLAGS)" \
 	    TARGET_LDFLAGS="$(TARGET_LDFLAGS)" \
-	    $(QEMU_ROOT)/xen-setup-stubdom )
+	    $(SHELL) $(QEMU_ROOT)/xen-setup-stubdom )
 	$(CROSS_MAKE) -C ioemu -f $(QEMU_ROOT)/Makefile
 
 ######
diff -r 738452bd9f33 -r 6fa23fea4670 tools/Makefile
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -106,7 +106,7 @@ ioemu-dir-find:
 	set -e; \
 		$(buildmakevars2shellvars); \
 		cd ioemu-dir; \
-		$(QEMU_ROOT)/xen-setup $(IOEMU_CONFIGURE_CROSS)
+		$(SHELL) $(QEMU_ROOT)/xen-setup $(IOEMU_CONFIGURE_CROSS)
 
 .PHONY: ioemu-dir-force-update
 ioemu-dir-force-update:

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:25:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:25:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB5wJ-0005nD-Sm; Tue, 04 Oct 2011 07:25:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5sj-0004Nh-TO
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:22:06 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317738010!38812336!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6412 invoked from network); 4 Oct 2011 14:20:10 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-14.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 4 Oct 2011 14:20:10 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317738122; l=730;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=dSCtBSEGAWQzBeYg3oDFEo0yqkI=;
	b=i+EjQn8G2278+lgqxoHQQHEm3UvyAb14VzeD8WLN9Hql6wZol4StOGXmU1C34MZK7nf
	0lBt75v0v0RNkcFtKzcXtmfKZ5sRD1ROIK/j7tkbQFarUyeVQ2t36o0/eDVwuooP3R1qs
	pLEe9FN0fljrfRhBXgaSAWprdzIMdmkmGuo=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by post.strato.de (mrclete mo61) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id o053e4n94DRiaX
	for <xen-devel@lists.xensource.com>;
	Tue, 4 Oct 2011 16:21:52 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 6958418892
	for <xen-devel@lists.xensource.com>;
	Tue,  4 Oct 2011 16:21:51 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 4c8e7b9ba0d519435e9bdee031c6538d84294b74
Message-Id: <4c8e7b9ba0d519435e9b.1317738116@probook.site>
In-Reply-To: <patchbomb.1317738109@probook.site>
References: <patchbomb.1317738109@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 04 Oct 2011 16:21:56 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 7 of 7] tools: call etherboot/mkhex with shell
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317738021 -7200
# Node ID 4c8e7b9ba0d519435e9bdee031c6538d84294b74
# Parent  c06758bea2f40cc5f9ef20d55e2e7e95d7ad3d63
tools: call etherboot/mkhex with shell

Removes the need for executable permissions in SCM.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r c06758bea2f4 -r 4c8e7b9ba0d5 tools/firmware/etherboot/Makefile
--- a/tools/firmware/etherboot/Makefile
+++ b/tools/firmware/etherboot/Makefile
@@ -28,7 +28,7 @@ all: eb-roms.h
 	$(MAKE) -C $D/src bin/$(*F).rom
 
 eb-roms.h.new: $(ROMS)
-	cat $^ | ../hvmloader/mkhex etherboot >$@
+	cat $^ | $(SHELL) ../hvmloader/mkhex etherboot >$@
 
 eb-roms.h: Config
 	$(MAKE) NO_WERROR=1 $@.new

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:26:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:26:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB5x3-0006AZ-5Q; Tue, 04 Oct 2011 07:26:33 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5sl-0004OC-MI
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:22:09 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-21.messagelabs.com!1317738077!50948894!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20271 invoked from network); 4 Oct 2011 14:21:18 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-9.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 14:21:18 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317738124; l=749;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=NB/FI3NdULgQ2E9dTXCrEz5EPQc=;
	b=IMcFq7bWSA2l1Q2kYQxWedVo7ar/dkSpsubcw2gUCgXc+o7a0CppC7/AfWdADIwaZJg
	1mLUFf0qx6PQ84zO2i6D4uxzltHmz7UgzjCBcy2S2WB0Co5gg7fEFwIT2B3WiwB87FmIN
	QsTVjHQR5ScrjhJMuM1pll69RpZdQ6mXOE0=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by smtp.strato.de (cohen mo45) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id 606cd1n94E4la7
	for <xen-devel@lists.xensource.com>;
	Tue, 4 Oct 2011 16:21:51 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id D390618B67
	for <xen-devel@lists.xensource.com>;
	Tue,  4 Oct 2011 16:21:50 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 738452bd9f33343e46a8e05a3f999935ca5e4c2e
Message-Id: <738452bd9f33343e46a8.1317738112@probook.site>
In-Reply-To: <patchbomb.1317738109@probook.site>
References: <patchbomb.1317738109@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 04 Oct 2011 16:21:52 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 3 of 7] tools/check: update python version check
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317738017 -7200
# Node ID 738452bd9f33343e46a8e05a3f999935ca5e4c2e
# Parent  bcd7b8ee7e99dc6348c3132a7248db5829bc53f9
tools/check: update python version check

Python 2.3 is the minimal version according to the README.
Adjust check script.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r bcd7b8ee7e99 -r 738452bd9f33 tools/check/check_python
--- a/tools/check/check_python
+++ b/tools/check/check_python
@@ -9,5 +9,5 @@ fi
 
 ${PYTHON} -c '
 import sys
-sys.exit(sys.version_info[0] < 2 or sys.version_info[1] < 2)
-' || fail "need python version >= 2.2"
+sys.exit(sys.version_info[0] < 2 or sys.version_info[1] < 3)
+' || fail "need python version >= 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 Oct 04 07:27:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:27:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB5xp-0006Xy-VM; Tue, 04 Oct 2011 07:27:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5so-0004PI-OK
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:22:11 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-14.tower-174.messagelabs.com!1317738127!33866245!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7684 invoked from network); 4 Oct 2011 14:22:07 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-14.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 4 Oct 2011 14:22:07 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317738127; l=834;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=dAXwfAgNkGbAeSDM7ZByeLv8P7k=;
	b=SRyF4c/wNrnRLFX0amI5oB8V7yGnt63NH55TmHLGnPf6eaPOUIZmnPsqHSkTi+85bH8
	f+rsndPb39KLTEbLQTxas2HrBJOUmuoc0opEQYQudy6NG0itguMbwUwxpfK8TtTNuATj5
	GvE7FlPYT2V96nE0j7FMeI+y8W+2x6yABEQ=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by post.strato.de (mrclete mo48) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id R04bf0n94DawLh
	for <xen-devel@lists.xensource.com>;
	Tue, 4 Oct 2011 16:21:52 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 46B8118B6A
	for <xen-devel@lists.xensource.com>;
	Tue,  4 Oct 2011 16:21:51 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c06758bea2f40cc5f9ef20d55e2e7e95d7ad3d63
Message-Id: <c06758bea2f40cc5f9ef.1317738115@probook.site>
In-Reply-To: <patchbomb.1317738109@probook.site>
References: <patchbomb.1317738109@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 04 Oct 2011 16:21:55 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 6 of 7] tools: call install-wrap with shell
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317738020 -7200
# Node ID c06758bea2f40cc5f9ef20d55e2e7e95d7ad3d63
# Parent  bac6675e4d42e1f9074dc01267e859d15c2b84cd
tools: call install-wrap with shell

Removes the need for executable permissions in SCM.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r bac6675e4d42 -r c06758bea2f4 tools/Rules.mk
--- a/tools/Rules.mk
+++ b/tools/Rules.mk
@@ -78,7 +78,7 @@ check-$(CONFIG_X86) = $(call cc-ver-chec
 _PYTHON_PATH := $(shell which $(PYTHON))
 PYTHON_PATH ?= $(_PYTHON_PATH)
 INSTALL_PYTHON_PROG = \
-	$(XEN_ROOT)/tools/python/install-wrap "$(PYTHON_PATH)" $(INSTALL_PROG)
+	$(SHELL) $(XEN_ROOT)/tools/python/install-wrap "$(PYTHON_PATH)" "$(INSTALL_PROG)"
 
 %.opic: %.c
 	$(CC) $(CPPFLAGS) -DPIC $(CFLAGS) $(CFLAGS_$*.opic) -fPIC -c -o $@ $<

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:28:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:28:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB5ya-0006v8-OQ; Tue, 04 Oct 2011 07:28:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5ss-0004Q8-AW
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:22:15 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317738130!20183579!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32558 invoked from network); 4 Oct 2011 14:22:11 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 14:22:11 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317738130; l=693;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=qRSCZncP6ux42xI3Kkq4s+m9nTo=;
	b=GrXUZXUGZrjgwWLouvPTe/VXLTNIIk4jiD4NedozIL6I6s8lTn+06WCAGCdWv+8R/4s
	k5sHptvlfI/BYrsF4TGdudr/SUTzvkKW6FEug1MykKc31TkhVZBElnFUYGasGlH/IRy3a
	SwIkaV+Dyqx9zmjVw5IhppccHcgVRFqqDRE=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by smtp.strato.de (cohen mo1) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id e05178n94DClZY
	for <xen-devel@lists.xensource.com>;
	Tue, 4 Oct 2011 16:21:52 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 231DE18B69
	for <xen-devel@lists.xensource.com>;
	Tue,  4 Oct 2011 16:21:51 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: bac6675e4d42e1f9074dc01267e859d15c2b84cd
Message-Id: <bac6675e4d42e1f9074d.1317738114@probook.site>
In-Reply-To: <patchbomb.1317738109@probook.site>
References: <patchbomb.1317738109@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 04 Oct 2011 16:21:54 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 5 of 7] tools: call cross-install with shell
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317738019 -7200
# Node ID bac6675e4d42e1f9074dc01267e859d15c2b84cd
# Parent  6fa23fea467024cf546b0c7d330c43136775825c
tools: call cross-install with shell

Removes the need for executable permissions in SCM.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 6fa23fea4670 -r bac6675e4d42 tools/Rules.mk
--- a/tools/Rules.mk
+++ b/tools/Rules.mk
@@ -6,7 +6,7 @@ all:
 include $(XEN_ROOT)/Config.mk
 
 export _INSTALL := $(INSTALL)
-INSTALL = $(XEN_ROOT)/tools/cross-install
+INSTALL = $(SHELL) $(XEN_ROOT)/tools/cross-install
 
 XEN_INCLUDE        = $(XEN_ROOT)/tools/include
 XEN_LIBXC          = $(XEN_ROOT)/tools/libxc

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:28:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07: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 1RB5zI-0007I9-SH; Tue, 04 Oct 2011 07:28:52 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5st-0004Qe-V4
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:22:16 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-182.messagelabs.com!1317738131!18066207!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14509 invoked from network); 4 Oct 2011 14:22:12 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-2.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 14:22:12 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317738131; l=897;
	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=zS7g2O+14NO8I9Vfj5vw8Vjav9U=;
	b=GC4MUS6znWOXyBjUdy6J4xpuSyEmfNeqF+bMzZlU/bXHnWApotCeXzvALsM2OLVuzbW
	byguCIkjG8n8JOXqEJ62J2PTSHQLTWITPJ9M2sPIybLz/bssDPqsMSU/DeCAXcsMmQCu/
	2HOR//tQ/Ud34a4hKUcPX/rVnHkqJ1uKRPs=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by smtp.strato.de (cohen mo43) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id Q06b1dn94E2krL
	for <xen-devel@lists.xensource.com>;
	Tue, 4 Oct 2011 16:21:51 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 6556318892
	for <xen-devel@lists.xensource.com>;
	Tue,  4 Oct 2011 16:21:50 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1317738109@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 04 Oct 2011 16:21:49 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 0 of 7] tools/check fixes for xen-unstable
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


Remove the need for executable permissions of some files in the SCM.

With these changes applied I can build the SLES11 xen.rpm package again.
I use a modified xen.spec which does this after unpacking the tar files,
just for testing my changes:

find -type f -executable -print0 | sort -z | xargs -0 --no-run-if-empty chmod -v a-x
find -type f -name configure -print0 | xargs -0 --no-run-if-empty chmod -v 744
find -type f -name texi2pod.pl -print0 | xargs -0 --no-run-if-empty chmod -v 744

Olaf

 install.sh                        |    2 +-
 stubdom/Makefile                  |    2 +-
 tools/Makefile                    |    2 +-
 tools/Rules.mk                    |    4 ++--
 tools/check/Makefile              |    6 +++---
 tools/check/README                |    6 +++---
 tools/check/check_logging         |   31 -------------------------------
 tools/check/check_python          |    4 ++--
 tools/check/chk                   |    2 +-
 tools/firmware/etherboot/Makefile |    2 +-
 10 files changed, 15 insertions(+), 46 deletions(-)


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:29:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:29:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB606-0007fP-CD; Tue, 04 Oct 2011 07:29:42 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB5xR-0006KR-O7
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:26:58 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1317738414!20725874!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12417 invoked from network); 4 Oct 2011 14:26:54 -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;
	4 Oct 2011 14:26:54 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312156800"; 
   d="scan'208";a="8203163"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 14:26:22 +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, 4 Oct 2011
	15:26:22 +0100
Subject: Re: [Xen-devel] Re: [PATCH 0 of 9] Call hotplug scripts from libxl
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Tue, 4 Oct 2011 15:26:21 +0100
In-Reply-To: <CAPLaKK5kCDXiuEeUrJotC4x6qKRTnv6w=kV0VBfZ64hHjQNpcA@mail.gmail.com>
References: <patchbomb.1317386580@loki>
	<CAPLaKK7cbZG5SnCKdi7DaivNWmz6Ojj5NzFkQ=Wo-jL3RYEQKA@mail.gmail.com>
	<1317735234.21903.141.camel@zakaz.uk.xensource.com>
	<CAPLaKK5kCDXiuEeUrJotC4x6qKRTnv6w=kV0VBfZ64hHjQNpcA@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317738381.21903.150.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-10-04 at 15:15 +0100, Roger Pau MonnÃ© wrote:
> 2011/10/4 Ian Campbell <Ian.Campbell@citrix.com>:
> > By default xl daemonises itself and monitors the domain waiting for it
> > to exit, at which point it should perform the necessary cleanup (this is
> > the call to libxl_domain_destroy in handle_domain_death).
> 
> libxl daemonises itself if you call "xl shutdown <domain>", but if the
> domain shuts down from inside (doing a "halt"), xl is never called,
> and therefore hotplug scripts are not executed.

I don't think "xl shutdown" daemonises ever. 

"xl create" daemonises itself and waits for the guest to die. It should
be detecting the guest shutdown no matter if it is triggered internally
or externally. That's not to say it's not buggy though...


> 
> > If you ask xl to not do this (using the -e or -F options) then you are
> > expected to call xl destroy yourself.
> >
> > The call to libxl_domain_destroy calls libxl__devices_destroy which
> > tears down the backends. Unfortunately this is done in a slightly
> > generic way but my recent series should have laid the ground work for
> > doing this in a more device-specific way.
> >
> > I have a feeling that libxl__device_destroy should really consist of a
> > sequence of libxl_device_FOO_list+foreach(thing) libxl_device_FOO_remove
> > calls rather than the current mechanism. i.e. be really explicit about
> > what it is tearing down.
> >
> > Ian.



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:51:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:51:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6Kh-0000KA-PV; Tue, 04 Oct 2011 07:50:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6Ja-00006w-5U
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:49:50 -0700
X-Env-Sender: Andre.Przywara@amd.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1317739786!20874084!1
X-Originating-IP: [213.199.154.139]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1547 invoked from network); 4 Oct 2011 14:49:47 -0000
Received: from db3ehsobe001.messaging.microsoft.com (HELO
	DB3EHSOBE001.bigfish.com) (213.199.154.139)
	by server-4.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	4 Oct 2011 14:49:47 -0000
Received: from mail54-db3-R.bigfish.com (10.3.81.244) by
	DB3EHSOBE001.bigfish.com (10.3.84.21) with Microsoft SMTP Server id
	14.1.225.22; Tue, 4 Oct 2011 14:49:46 +0000
Received: from mail54-db3 (localhost.localdomain [127.0.0.1])	by
	mail54-db3-R.bigfish.com (Postfix) with ESMTP id 59582A8060C;
	Tue,  4 Oct 2011 14:49:46 +0000 (UTC)
X-SpamScore: -17
X-BigFish: VPS-17(zzbb2dK9371K936eK1432N98dKzz1202hzz8275bhz32i668h839h)
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 mail54-db3 (localhost.localdomain [127.0.0.1]) by mail54-db3
	(MessageSwitch) id 1317739742965931_21302;
	Tue,  4 Oct 2011 14:49:02 +0000 (UTC)
Received: from DB3EHSMHS003.bigfish.com (unknown [10.3.81.252])	by
	mail54-db3.bigfish.com (Postfix) with ESMTP id DCA1C1B880E3;
	Tue,  4 Oct 2011 14:49:00 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	DB3EHSMHS003.bigfish.com (10.3.87.103) with Microsoft SMTP Server id
	14.1.225.22; Tue, 4 Oct 2011 14:48:54 +0000
X-WSS-ID: 0LSJQH5-01-7N7-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 298D71028037;	Tue,  4 Oct 2011 09:48: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.106.1;
	Tue, 4 Oct 2011 09:48:53 -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, 4 Oct 2011 09:48:45 -0500
Received: from [165.204.16.96] (165.204.16.96) by storexhtp02.amd.com
	(172.24.4.4) with Microsoft SMTP Server id 8.3.83.0;
	Tue, 4 Oct 2011 10:48:45 -0400
Message-ID: <4E8B1CCA.4040805@amd.com>
Date: Tue, 4 Oct 2011 16:48:42 +0200
From: Andre Przywara <andre.przywara@amd.com>
Organization: AMD
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.18) Gecko/20110705 Thunderbird/3.1.11
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] tools/check: check for yajl (needed by libxl)
References: <4b98868690218126b906.1317368189@cosworth.uk.xensource.com>	<CAJJyHjL55fNgwrmDVdCehaOLC1mPecf8M4fE4RCn_g_vygj=0A@mail.gmail.com>
	<1317379194.26672.256.camel@zakaz.uk.xensource.com>
In-Reply-To: <1317379194.26672.256.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: Anthony PERARD <anthony.perard@citrix.com>, Olaf Hering <olaf@aepfle.de>,
	"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 09/30/2011 12:39 PM, Ian Campbell wrote:
> On Fri, 2011-09-30 at 11:35 +0100, Anthony PERARD wrote:
>> On Fri, Sep 30, 2011 at 08:36, Ian Campbell<ian.campbell@citrix.com>  wrote:
>>  ...
>> You probably want to check the yajl headers as well, no ?
>> #include<yajl/yajl_parse.h>
>> #include<yajl/yajl_gen.h>
>
> tools/check seems a bit inconsistent and I'd expect them both to be in
> the -dev package but I guess it can't hurt.
>
> # HG changeset patch
> # User Ian Campbell<ian.campbell@citrix.com>
> # Date 1317379175 -3600
> # Node ID de602616358b7def9351850f518e453c68141c4f
> # Parent  302b7556edd91a7506f2215bed5302b4b5eaa52a
> tools/check: check for yajl (needed by libxl)
>
> Signed-off-by: Ian Campbell<ian.campbell@citrix.com>
> ---
> (note to committer, ensure the new files are executable)
>
> diff -r 302b7556edd9 -r de602616358b tools/check/check_yajl_devel
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/tools/check/check_yajl_devel	Fri Sep 30 11:39:35 2011 +0100
> @@ -0,0 +1,7 @@
> +#!/bin/sh
> +# CHECK-BUILD CHECK-INSTALL

Shouldn't you be able to omit the CHECK_INSTALL on this one?
The header files are not a runtime requirement, right?

Also wouldn't it be nicer to link this small library statically? This 
would omit the runtime requirement at all.
The test team just spelled yajl as "yet another library to get Xen 
running"...

Also be advised that it looks like this is relying on version 1 of yajl. 
It looks like the new version 2.0.1 is not compatible, I got compile 
errors with the newer version. If the stable version 1.x is required, 
this should be stated somewhere or at least checked properly in check_yajl.

Regards,
Andre.

> +
> +. ./funcs.sh
> +
> +has_header yajl/yajl_parse.h || fail "can't find yajl/yajl_parse.h"
> +has_header yajl/yajl_gen.h || fail "can't find yajl/yajl_gen.h"
> diff -r 302b7556edd9 -r de602616358b tools/check/check_yajl_lib
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/tools/check/check_yajl_lib	Fri Sep 30 11:39:35 2011 +0100
> @@ -0,0 +1,6 @@
> +#!/bin/sh
> +# CHECK-BUILD CHECK-INSTALL
> +
> +. ./funcs.sh
> +
> +has_lib libyajl.so || fail "can't find libyajl.so"
>
>


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:52:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:52:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6MD-0000p4-Kf; Tue, 04 Oct 2011 07:52:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LK-0000Wf-Bo
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:40 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317739781!38817521!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19546 invoked from network); 4 Oct 2011 14:49:42 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:49:42 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="17928378"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51:33 -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, 4 Oct 2011 10:51:33 -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 p94EpSs2017018;	Tue, 4 Oct 2011 07:51:31 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:12 +0100
Message-ID: <1317739882-4809-2-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 01/11] Introduce HostPCIDevice to access
	a pci device on the 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

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 hw/host-pci-device.c |  192 ++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/host-pci-device.h |   36 +++++++++
 2 files changed, 228 insertions(+), 0 deletions(-)
 create mode 100644 hw/host-pci-device.c
 create mode 100644 hw/host-pci-device.h

diff --git a/hw/host-pci-device.c b/hw/host-pci-device.c
new file mode 100644
index 0000000..b3f2899
--- /dev/null
+++ b/hw/host-pci-device.c
@@ -0,0 +1,192 @@
+#include "qemu-common.h"
+#include "host-pci-device.h"
+
+static int path_to(const HostPCIDevice *d,
+                   const char *name, char *buf, ssize_t size)
+{
+    return snprintf(buf, size, "/sys/bus/pci/devices/%04x:%02x:%02x.%x/%s",
+                    d->domain, d->bus, d->dev, d->func, name);
+}
+
+static int get_resource(HostPCIDevice *d)
+{
+    int i;
+    FILE *f;
+    char path[PATH_MAX];
+    unsigned long long start, end, flags, size;
+
+    path_to(d, "resource", path, sizeof (path));
+    f = fopen(path, "r");
+    if (!f) {
+        fprintf(stderr, "Error: Can't open %s: %s\n", path, strerror(errno));
+        return -1;
+    }
+
+    for (i = 0; i < PCI_NUM_REGIONS; i++) {
+        if (fscanf(f, "%llx %llx %llx", &start, &end, &flags) != 3) {
+            fprintf(stderr, "Error: Syntax error in %s\n", path);
+            break;
+        }
+        if (start) {
+            size = end - start + 1;
+        } else {
+            size = 0;
+        }
+
+        flags &= 0xf;
+
+        if (i < PCI_ROM_SLOT) {
+            d->base_addr[i] = start | flags;
+            d->size[i] = size;
+        } else {
+            d->rom_base_addr = start | flags;
+            d->rom_size = size;
+        }
+    }
+
+    fclose(f);
+    return 0;
+}
+
+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;
+    }
+    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;
+}
+
+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_read_byte(HostPCIDevice *d, int pos)
+{
+  uint8_t buf;
+  host_pci_config_read(d, pos, &buf, 1);
+  return buf;
+}
+uint16_t host_pci_read_word(HostPCIDevice *d, int pos)
+{
+  uint16_t buf;
+  host_pci_config_read(d, pos, &buf, 2);
+  return le16_to_cpu(buf);
+}
+uint32_t host_pci_read_long(HostPCIDevice *d, int pos)
+{
+  uint32_t buf;
+  host_pci_config_read(d, pos, &buf, 4);
+  return le32_to_cpu(buf);
+}
+int host_pci_read_block(HostPCIDevice *d, int pos, uint8_t *buf, int len)
+{
+  return host_pci_config_read(d, pos, buf, len);
+}
+
+int host_pci_write_byte(HostPCIDevice *d, int pos, uint8_t data)
+{
+  return host_pci_config_write(d, pos, &data, 1);
+}
+int host_pci_write_word(HostPCIDevice *d, int pos, uint16_t data)
+{
+  return host_pci_config_write(d, pos, &data, 2);
+}
+int host_pci_write_long(HostPCIDevice *d, int pos, uint32_t data)
+{
+  return host_pci_config_write(d, pos, &data, 4);
+}
+int host_pci_write_block(HostPCIDevice *d, int pos, uint8_t *buf, int len)
+{
+  return host_pci_config_write(d, pos, buf, len);
+}
+
+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) == -1)
+        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;
+}
diff --git a/hw/host-pci-device.h b/hw/host-pci-device.h
new file mode 100644
index 0000000..0137507
--- /dev/null
+++ b/hw/host-pci-device.h
@@ -0,0 +1,36 @@
+#ifndef HW_HOST_PCI_DEVICE
+#  define HW_HOST_PCI_DEVICE
+
+#include "pci.h"
+
+typedef struct HostPCIDevice {
+    uint16_t domain;
+    uint8_t bus;
+    uint8_t dev;
+    uint8_t func;
+
+    uint16_t vendor_id;
+    uint16_t device_id;
+
+    pcibus_t base_addr[PCI_NUM_REGIONS - 1];
+    pcibus_t size[PCI_NUM_REGIONS - 1];
+    pcibus_t rom_base_addr;
+    pcibus_t rom_size;
+
+    bool is_virtfn;
+
+    int config_fd;
+} HostPCIDevice;
+
+HostPCIDevice *host_pci_device_get(uint8_t bus, uint8_t dev, uint8_t func);
+
+uint8_t host_pci_read_byte(HostPCIDevice *d, int pos);
+uint16_t host_pci_read_word(HostPCIDevice *d, int pos);
+uint32_t host_pci_read_long(HostPCIDevice *d, int pos);
+int host_pci_read_block(HostPCIDevice *d, int pos, uint8_t *buf, int len);
+int host_pci_write_byte(HostPCIDevice *d, int pos, uint8_t data);
+int host_pci_write_word(HostPCIDevice *d, int pos, uint16_t data);
+int host_pci_write_long(HostPCIDevice *d, int pos, uint32_t data);
+int host_pci_write_block(HostPCIDevice *d, int pos, uint8_t *buf, int len);
+
+#endif /* !HW_HOST_PCI_DEVICE */
-- 
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 Oct 04 07:53:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:53:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6NA-0001CA-H0; Tue, 04 Oct 2011 07:53:32 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LK-0000We-88
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:40 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317739893!27826069!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26219 invoked from network); 4 Oct 2011 14:51:35 -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;
	4 Oct 2011 14:51:35 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="165647574"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51:32 -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, 4 Oct 2011 10:51:31 -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 p94EpSs1017018;	Tue, 4 Oct 2011 07:51:29 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:11 +0100
Message-ID: <1317739882-4809-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>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 patch series introduce the PCI passthrough for Xen.

First, we have HostPCIDevice that help to access one PCI device of the host.

Then, there are several additions in the QEMU code. One is qemu_run_one_timer
to run a specific timer. It is used by PCI passthrough to run a timer about
power management. Another is pci_check_bar_overlap.

There are also several change in pci_ids and pci_regs.

Last part, but not least, the PCI passthrough device himself. Cut in 3 parts
(or file), there is one to take care of the initialisation of a passthrough
device. The second one handle everything about the config address space, there
are specifics functions for every config register. The third one is to handle
MSI.

I'm still working on setting a PCI passthrough device through QMP from libxl
(xen tool stack). It is just a call to device_add, with the driver parametter
hostaddr="0000:00:1b.0".

There is some minor things missing:
 - copyright header
 - PCI IO space multiplexer

Regards,


Anthony PERARD (11):
  Introduce HostPCIDevice to access a pci device on the host.
  qemu-timer: Introduce qemu_run_one_timer
  pci_ids: Add INTEL_82599_VF id.
  pci_regs: Fix value of PCI_EXP_TYPE_RC_EC.
  pci_regs: Add PCI_EXP_TYPE_PCIE_BRIDGE
  pci.c: Add pci_check_bar_overlap
  host-pci-device: Add host_pci_find_ext_cap_offset
  Introduce Xen PCI Passthrough, qdevice (1/3)
  Introduce Xen PCI Passthrough, PCI config space helpers (2/3)
  Introduce Xen PCI Passthrough, MSI (3/3)
  config/make: Introduce --enable-xen-pci-passthrough, built it.

 Makefile.target                      |    7 +
 configure                            |   21 +
 hw/host-pci-device.c                 |  223 +++
 hw/host-pci-device.h                 |   38 +
 hw/pci.c                             |   46 +
 hw/pci.h                             |    3 +
 hw/pci_ids.h                         |    1 +
 hw/pci_regs.h                        |    3 +-
 hw/xen_pci_passthrough.c             |  763 +++++++++++
 hw/xen_pci_passthrough.h             |  335 +++++
 hw/xen_pci_passthrough_config_init.c | 2489 ++++++++++++++++++++++++++++++++++
 hw/xen_pci_passthrough_helpers.c     |   46 +
 hw/xen_pci_passthrough_msi.c         |  674 +++++++++
 qemu-timer.c                         |   15 +
 qemu-timer.h                         |    3 +
 15 files changed, 4666 insertions(+), 1 deletions(-)
 create mode 100644 hw/host-pci-device.c
 create mode 100644 hw/host-pci-device.h
 create mode 100644 hw/xen_pci_passthrough.c
 create mode 100644 hw/xen_pci_passthrough.h
 create mode 100644 hw/xen_pci_passthrough_config_init.c
 create mode 100644 hw/xen_pci_passthrough_helpers.c
 create mode 100644 hw/xen_pci_passthrough_msi.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 Oct 04 07:54:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:54:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6Nz-0001ZB-Rt; Tue, 04 Oct 2011 07:54:23 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LM-0000Xv-PX
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:41 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317739896!20189222!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16520 invoked from network); 4 Oct 2011 14:51:37 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:51:37 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="165647591"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51: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, 4 Oct 2011 10:51: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 p94EpSs5017018;	Tue, 4 Oct 2011 07:51:35 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:15 +0100
Message-ID: <1317739882-4809-5-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 04/11] 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

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 e884096..dad7d9a 100644
--- a/hw/pci_regs.h
+++ b/hw/pci_regs.h
@@ -392,7 +392,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


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 07:55:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:55:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6Oq-0001wa-WD; Tue, 04 Oct 2011 07:55:17 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LL-0000XD-IU
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:41 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317739893!27826069!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26229 invoked from network); 4 Oct 2011 14:51: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;
	4 Oct 2011 14:51:36 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="165647588"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51:35 -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, 4 Oct 2011 10:51:35 -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 p94EpSs4017018;	Tue, 4 Oct 2011 07:51:34 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:14 +0100
Message-ID: <1317739882-4809-4-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 03/11] pci_ids: Add INTEL_82599_VF id.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>
---
 hw/pci_ids.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/hw/pci_ids.h b/hw/pci_ids.h
index 83f3893..2ea5ec2 100644
--- a/hw/pci_ids.h
+++ b/hw/pci_ids.h
@@ -117,6 +117,7 @@
 #define PCI_DEVICE_ID_INTEL_82801I_UHCI6 0x2939
 #define PCI_DEVICE_ID_INTEL_82801I_EHCI1 0x293a
 #define PCI_DEVICE_ID_INTEL_82801I_EHCI2 0x293c
+#define PCI_DEVICE_ID_INTEL_82599_VF     0x10ed
 
 #define PCI_VENDOR_ID_XEN               0x5853
 #define PCI_DEVICE_ID_XEN_PLATFORM      0x0001
-- 
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 Oct 04 07:56:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:56:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6Pm-0002K2-9V; Tue, 04 Oct 2011 07:56:14 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LK-0000X0-V5
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:41 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317739893!27826069!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26224 invoked from network); 4 Oct 2011 14:51:35 -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;
	4 Oct 2011 14:51:35 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="165647585"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51:34 -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, 4 Oct 2011 10:51:34 -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 p94EpSs3017018;	Tue, 4 Oct 2011 07:51:32 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:13 +0100
Message-ID: <1317739882-4809-3-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 02/11] qemu-timer: Introduce
	qemu_run_one_timer
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Used by the Xen PCI Passthrough code to run the timer about the power
state transition.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 qemu-timer.c |   15 +++++++++++++++
 qemu-timer.h |    3 +++
 2 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/qemu-timer.c b/qemu-timer.c
index 46dd483..15e659b 100644
--- a/qemu-timer.c
+++ b/qemu-timer.c
@@ -1163,3 +1163,18 @@ int qemu_calculate_timeout(void)
     return 1000;
 }
 
+/* run the specified timer */
+void qemu_run_one_timer(QEMUTimer *ts)
+{
+    uint64_t current_time;
+
+    /* remove timer from the list before calling the callback */
+    qemu_del_timer(ts);
+
+    while ((current_time = qemu_get_clock_ms(rt_clock)) < ts->expire_time)
+        /* sleep until the expire time */
+        usleep((ts->expire_time - current_time) * 1000);
+
+    /* run the callback */
+    ts->cb(ts->opaque);
+}
diff --git a/qemu-timer.h b/qemu-timer.h
index 0a43469..b7b907b 100644
--- a/qemu-timer.h
+++ b/qemu-timer.h
@@ -338,4 +338,7 @@ extern int64_t tlb_flush_time;
 extern int64_t dev_time;
 #endif
 
+/* run the specified timer */
+void qemu_run_one_timer(QEMUTimer *ts);
+
 #endif
-- 
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 Oct 04 07:57:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 07:57:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6Qn-0002jP-Hc; Tue, 04 Oct 2011 07:57:17 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LO-0000YQ-CE
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:42 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317739781!38817521!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19850 invoked from network); 4 Oct 2011 14:49:46 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:49:46 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="17928382"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51:38 -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, 4 Oct 2011 10:51:38 -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 p94EpSs6017018;	Tue, 4 Oct 2011 07:51:36 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:16 +0100
Message-ID: <1317739882-4809-6-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 05/11] pci_regs: Add
	PCI_EXP_TYPE_PCIE_BRIDGE
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>
---
 hw/pci_regs.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/hw/pci_regs.h b/hw/pci_regs.h
index dad7d9a..091a749 100644
--- a/hw/pci_regs.h
+++ b/hw/pci_regs.h
@@ -391,6 +391,7 @@
 #define  PCI_EXP_TYPE_UPSTREAM	0x5	/* Upstream Port */
 #define  PCI_EXP_TYPE_DOWNSTREAM 0x6	/* Downstream Port */
 #define  PCI_EXP_TYPE_PCI_BRIDGE 0x7	/* PCI/PCI-X Bridge */
+#define  PCI_EXP_TYPE_PCIE_BRIDGE 0x8	/* PCI/PCI-X to PCIE Bridge */
 #define  PCI_EXP_TYPE_RC_END	0x9	/* Root Complex Integrated Endpoint */
 #define  PCI_EXP_TYPE_RC_EC	0xa	/* Root Complex Event Collector */
 #define PCI_EXP_FLAGS_SLOT	0x0100	/* Slot implemented */
-- 
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 Oct 04 08:00:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:00:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6Tn-00039V-VA; Tue, 04 Oct 2011 08:00:24 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LP-0000YR-CU
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:44 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317739896!20189222!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16646 invoked from network); 4 Oct 2011 14:51:40 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:51:40 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="165647599"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51:39 -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, 4 Oct 2011 10:51:39 -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 p94EpSs7017018;	Tue, 4 Oct 2011 07:51:38 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:17 +0100
Message-ID: <1317739882-4809-7-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 06/11] pci.c: Add pci_check_bar_overlap
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 help Xen PCI Passthrough device to check for overlap.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 hw/pci.c |   46 ++++++++++++++++++++++++++++++++++++++++++++++
 hw/pci.h |    3 +++
 2 files changed, 49 insertions(+), 0 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index af74003..56e94d1 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -2196,3 +2196,49 @@ MemoryRegion *pci_address_space(PCIDevice *dev)
 {
     return dev->bus->address_space_mem;
 }
+
+int pci_check_bar_overlap(PCIDevice *dev,
+                          pcibus_t addr, pcibus_t size, uint8_t type)
+{
+    PCIBus *bus = dev->bus;
+    PCIDevice *devices = NULL;
+    PCIIORegion *r;
+    int i, j;
+    int rc = 0;
+
+    /* check Overlapped to Base Address */
+    for (i = 0; i < ARRAY_SIZE(bus->devices); i++) {
+        if (!(devices = bus->devices[i])) {
+            continue;
+        }
+
+        /* skip itself */
+        if (devices->devfn == dev->devfn) {
+            continue;
+        }
+
+        for (j = 0; j < PCI_NUM_REGIONS; j++) {
+            r = &devices->io_regions[j];
+
+            /* skip different resource type, but don't skip when
+             * prefetch and non-prefetch memory are compared.
+             */
+            if (type != r->type) {
+                if (type == PCI_BASE_ADDRESS_SPACE_IO ||
+                    r->type == PCI_BASE_ADDRESS_SPACE_IO) {
+                    continue;
+                }
+            }
+
+            if ((addr < (r->addr + r->size)) && ((addr + size) > r->addr)) {
+                printf("Overlapped to device[%02x:%02x.%x][Region:%d]"
+                       "[Address:%"PRIx64"h][Size:%"PRIx64"h]\n",
+                       pci_bus_num(bus), PCI_SLOT(devices->devfn),
+                       PCI_FUNC(devices->devfn), j, r->addr, r->size);
+                rc = 1;
+            }
+        }
+    }
+
+    return rc;
+}
diff --git a/hw/pci.h b/hw/pci.h
index c04b169..97996b5 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -490,4 +490,7 @@ static inline uint32_t pci_config_size(const PCIDevice *d)
     return pci_is_express(d) ? PCIE_CONFIG_SPACE_SIZE : PCI_CONFIG_SPACE_SIZE;
 }
 
+int pci_check_bar_overlap(PCIDevice *dev,
+                          pcibus_t addr, pcibus_t size, uint8_t type);
+
 #endif
-- 
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 Oct 04 08:04:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:04:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6Xp-0003ZK-F5; Tue, 04 Oct 2011 08:04:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LQ-0000Yi-Ic
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:45 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317739781!38817521!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20021 invoked from network); 4 Oct 2011 14:49:49 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:49:49 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="17928384"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51:40 -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, 4 Oct 2011 10:51:41 -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 p94EpSs8017018;	Tue, 4 Oct 2011 07:51:39 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:18 +0100
Message-ID: <1317739882-4809-8-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 07/11] host-pci-device: Add
	host_pci_find_ext_cap_offset
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>
---
 hw/host-pci-device.c |   31 +++++++++++++++++++++++++++++++
 hw/host-pci-device.h |    2 ++
 2 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/hw/host-pci-device.c b/hw/host-pci-device.c
index b3f2899..2a889d5 100644
--- a/hw/host-pci-device.c
+++ b/hw/host-pci-device.c
@@ -162,6 +162,37 @@ int host_pci_write_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 = 480;
+    int pos = 0x100;
+
+    do {
+        header = host_pci_read_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 < 0x100) {
+            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;
diff --git a/hw/host-pci-device.h b/hw/host-pci-device.h
index 0137507..2734eb3 100644
--- a/hw/host-pci-device.h
+++ b/hw/host-pci-device.h
@@ -33,4 +33,6 @@ int host_pci_write_word(HostPCIDevice *d, int pos, uint16_t data);
 int host_pci_write_long(HostPCIDevice *d, int pos, uint32_t data);
 int host_pci_write_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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 08:07:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:07:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6ap-00043H-5o; Tue, 04 Oct 2011 08:07:39 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LT-0000ZX-Gj
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:50 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317739896!20189222!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16812 invoked from network); 4 Oct 2011 14:51:43 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:51:43 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="165647609"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51:42 -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, 4 Oct 2011 10:51:42 -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 p94EpSs9017018;	Tue, 4 Oct 2011 07:51:40 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:19 +0100
Message-ID: <1317739882-4809-9-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 08/11] 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

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 hw/xen_pci_passthrough.c         |  763 ++++++++++++++++++++++++++++++++++++++
 hw/xen_pci_passthrough.h         |  335 +++++++++++++++++
 hw/xen_pci_passthrough_helpers.c |   46 +++
 3 files changed, 1144 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/hw/xen_pci_passthrough.c b/hw/xen_pci_passthrough.c
new file mode 100644
index 0000000..bfbe042
--- /dev/null
+++ b/hw/xen_pci_passthrough.c
@@ -0,0 +1,763 @@
+#include <sys/ioctl.h>
+
+#include "pci.h"
+#include "xen.h"
+#include "xen_backend.h"
+#include "xen_pci_passthrough.h"
+
+#define PCI_BAR_ENTRIES (6)
+
+typedef struct PlugDevice {
+    uint8_t r_bus;
+    uint8_t r_slot;
+    uint8_t r_func;
+    int bus;
+    int slot;
+    int func;
+} PlugDevice;
+
+QLIST_HEAD(php_dev_list, PlugDevice) php_dev_list = 
+    QLIST_HEAD_INITIALIZER(php_dev_list);
+
+#define PT_BAR_ALLF             0xFFFFFFFF      /* BAR ALLF value */
+
+/* #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 untill previous power state transition is completed.
+         * so finished previous request here.
+         */
+        qemu_run_one_timer(s->pm_state->pm_timer);
+    }
+
+    /* 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_read_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.
+         */
+        qemu_run_one_timer(s->pm_state->pm_timer);
+    }
+
+    /* 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_read_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_write_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) {
+        /* set QEMUTimer */
+        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) {
+        add_msix_mapping(s, i);
+        /* 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");
+        }
+
+        ret = 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);
+        }
+    }
+}
+
+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 */
+int qemu_pci_register_regions(XenPCIPassthroughState *s)
+{
+    /* but no mapping done anymore (see in reset) */
+    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++) {
+        if (pt_pci_base_addr(d->base_addr[i])) {
+            s->bases[i].e_physbase = pt_pci_base_addr(d->base_addr[i]);
+            s->bases[i].access.u = pt_pci_base_addr(d->base_addr[i]);
+
+            /* Register current region */
+            if (d->base_addr[i] & PCI_BASE_ADDRESS_SPACE_IO) {
+                memory_region_init_io(&s->bar[i], NULL, NULL,
+                                      "xen-pci-pt-bar", d->size[i]);
+                pci_register_bar(&s->dev, i, PCI_BASE_ADDRESS_SPACE_IO,
+                                 &s->bar[i]);
+            } else if (d->base_addr[i] & PCI_BASE_ADDRESS_MEM_PREFETCH) {
+                memory_region_init_io(&s->bar[i], NULL, NULL,
+                                      "xen-pci-pt-bar", d->size[i]);
+                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", d->size[i]);
+                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",
+                   d->size[i], d->base_addr[i]);
+        }
+    }
+
+    /* Register expansion ROM address */
+    if ((d->rom_base_addr & PCI_ROM_ADDRESS_MASK) && d->rom_size) {
+        /* Re-set BAR reported by OS, otherwise ROM can't be read. */
+        bar_data = host_pci_read_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_write_long(d, PCI_ROM_ADDRESS, bar_data);
+        }
+
+        s->bases[PCI_ROM_SLOT].e_physbase = d->rom_base_addr & PCI_ROM_ADDRESS_MASK;
+        s->bases[PCI_ROM_SLOT].access.maddr = d->rom_base_addr & PCI_ROM_ADDRESS_MASK;
+
+        // memory_region_init_rom_device
+        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 pci_parse_host_devaddr(char **str, int *seg, int *bus, int *dev,
+                                  int *func, char **opt, int *vdevfn)
+{
+    char *token;
+    const char *delim = ":.";
+
+    if (!(*str) || (!strchr(*str, ':') && !strchr(*str, '.'))) {
+        return 0;
+    }
+
+    token  = strsep(str, delim);
+    *seg = strtoul(token, NULL, 16);
+
+    token  = strsep(str, delim);
+    *bus  = strtoul(token, NULL, 16);
+
+    token  = strsep(str, delim);
+    *dev  = strtoul(token, NULL, 16);
+
+    token  = strsep(str, delim);
+
+    *opt = strchr(token, '@');
+    if (*opt) {
+        *(*opt)++ = '\0';
+        *vdevfn = strtoul(*opt, NULL, 16);
+    } else {
+        *vdevfn = -1; //AUTO_PHP_SLOT;
+        *opt = token;
+    }
+
+    *opt = strchr(*opt, ',');
+    if (*opt) {
+        *(*opt)++ = '\0';
+    }
+
+    *func = strtoul(token, NULL, 16);
+
+    return 1;
+}
+
+// TODO add to PlugDevice list php_dev_list;
+static int pt_initfn(PCIDevice *pci_dev)
+{
+    XenPCIPassthroughState *s = DO_UPCAST(XenPCIPassthroughState, dev, pci_dev);
+    int devfn_ignored = -1;
+    int dom, bus;
+    int slot, func;
+    char *opt;
+    int rc = 0;
+    uint32_t machine_irq;
+
+    /* todo: use local/stack buf, or better: change pci_parse_host_devaddr */
+    char *addr = g_strdup(s->hostaddr);
+
+    PT_LOG("initialiase passthrough for %s (devfn: %i)\n", addr, s->dev.devfn);
+
+    if (pci_parse_host_devaddr(&addr, &dom, &bus, &slot, &func, &opt,
+                               &devfn_ignored) < 0) {
+        fprintf(stderr, "erro parse bdf: %s\n", addr);
+        return -1;
+    }
+
+    s->php_dev.r_bus = bus;
+    s->php_dev.r_dev = slot;
+    s->php_dev.r_func = func;
+
+    /* register real device */
+    PT_LOG("Assigning real physical device %02x:%02x.%x ...\n",
+           bus, slot, func);
+
+    s->real_device = host_pci_device_get(bus, slot, func);
+    if (!s->real_device) {
+        return -1;
+    }
+
+    s->msi_trans_cap = 1; // default enable, later, read from param (xenstore)
+    /* s->power_mgmt = power_mgmt; */
+    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_read_block(s->real_device, 0, pci_dev->config,
+                            PCI_CONFIG_SPACE_SIZE) == -1) {
+        return -1;
+    }
+
+    /* Handle real device's MMIO/PIO BARs */
+    qemu_pci_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");
+        goto out;
+    }
+
+    /* pt machine irq auto */
+    {
+        int pirq = -1;
+
+        machine_irq = host_pci_read_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_write_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]++; */
+        }
+    }
+
+    /* 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);
+        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_write_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,
+           s->msi_trans_en ? "MSI-INTx" : "INTx");
+
+    return 0;
+}
+
+static PCIDeviceInfo xen_pci_passthrough = {
+    .init = pt_initfn,
+    .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_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..10e8189
--- /dev/null
+++ b/hw/xen_pci_passthrough.h
@@ -0,0 +1,335 @@
+#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 XenPTRegion XenPTRegion;
+typedef struct XenPTReg XenPTReg;
+typedef struct XenPTRegInfo XenPTRegInfo;
+typedef struct XenPTRegGroup XenPTRegGroup;
+typedef struct XenPTRegGroupInfo XenPTRegGroupInfo;
+
+typedef struct XenPCIPassthroughState XenPCIPassthroughState;
+
+// fonction 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);
+
+struct PHPDev {
+    /* uint8_t valid; */
+    uint8_t r_bus;
+    uint8_t r_dev;
+    uint8_t r_func;
+    /* char *opt; */
+};
+
+/* power state transition */
+#define PT_FLAG_TRANSITING 0x0001
+
+#define PT_INVALID_REG          0xFFFFFFFF      /* invalid register value */
+#define PT_BAR_ALLF             0xFFFFFFFF      /* BAR ALLF value */
+#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) */
+
+/* MSI-X */
+#define MSI_FLAG_UNINIT 0x1000
+#define PT_MSI_MAPPED   0x2000
+
+#define MSI_DATA_VECTOR_SHIFT          0
+#define     MSI_DATA_VECTOR(v)         (((u8)v) << MSI_DATA_VECTOR_SHIFT)
+
+#define MSI_DATA_DELIVERY_SHIFT        8
+#define     MSI_DATA_DELIVERY_FIXED    (0 << MSI_DATA_DELIVERY_SHIFT)
+#define     MSI_DATA_DELIVERY_LOWPRI   (1 << MSI_DATA_DELIVERY_SHIFT)
+
+#define MSI_DATA_LEVEL_SHIFT           14
+#define     MSI_DATA_LEVEL_DEASSERT    (0 << MSI_DATA_LEVEL_SHIFT)
+#define     MSI_DATA_LEVEL_ASSERT      (1 << MSI_DATA_LEVEL_SHIFT)
+
+#define MSI_DATA_TRIGGER_SHIFT         15
+#define     MSI_DATA_TRIGGER_EDGE      (0 << MSI_DATA_TRIGGER_SHIFT)
+#define     MSI_DATA_TRIGGER_LEVEL     (1 << MSI_DATA_TRIGGER_SHIFT)
+
+/*
+ * Shift/mask fields for APIC-based bus address
+ */
+#define MSI_ADDR_HEADER                0xfee00000
+#define MSI_TARGET_CPU_SHIFT           12
+
+#define MSI_ADDR_DESTID_MASK           0xfff0000f
+#define   MSI_ADDR_DESTID_CPU(cpu)     ((cpu) << MSI_TARGET_CPU_SHIFT)
+
+#define MSI_ADDR_DESTMODE_SHIFT        2
+#define   MSI_ADDR_DESTMODE_PHYS       (0 << MSI_ADDR_DESTMODE_SHIFT)
+#define     MSI_ADDR_DESTMODE_LOGIC    (1 << MSI_ADDR_DESTMODE_SHIFT)
+
+#define MSI_ADDR_REDIRECTION_SHIFT     3
+#define   MSI_ADDR_REDIRECTION_CPU     (0 << MSI_ADDR_REDIRECTION_SHIFT)
+#define   MSI_ADDR_REDIRECTION_LOWPRI  (1 << MSI_ADDR_REDIRECTION_SHIFT)
+
+#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
+
+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;
+
+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;
+};
+
+/* emulated register management */
+struct XenPTReg {
+    QLIST_ENTRY(XenPTReg) entries;
+    XenPTRegInfo *reg;
+    uint32_t data;
+};
+
+/* emul register group management table */
+struct XenPTRegGroup {
+    QLIST_ENTRY (XenPTRegGroup) entries;
+    const XenPTRegGroupInfo *reg_grp;
+    uint32_t base_offset;
+    uint8_t size;
+    QLIST_HEAD(, XenPTReg) reg_tbl_list;
+};
+
+/* 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;
+};
+
+
+/* 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;
+};
+
+typedef struct pt_msi_info {
+    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 msix_entry_info {
+    int pirq;        /* -1 means unmapped */
+    int flags;       /* flags indicting whether MSI ADDR or DATA is updated */
+    uint32_t io_mem[4];
+} XenMSIXEntry;
+typedef struct pt_msix_info {
+    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;
+    struct msix_entry_info msix_entry[0];
+} XenPTMSIX;
+
+typedef struct pt_pm_info {
+    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;
+    struct PHPDev php_dev;
+    bool is_virtfn;
+    HostPCIDevice *real_device;
+    XenPTRegion bases[PCI_NUM_REGIONS]; /* Access regions */
+    QLIST_HEAD(, XenPTRegGroup) reg_grp_tbl;
+
+    uint32_t machine_irq;
+
+    XenPTMSI *msi;
+    XenPTMSIX *msix;
+
+    /* Physical MSI to guest INTx translation when possible */
+    int msi_trans_cap;
+    bool msi_trans_en;
+
+    bool power_mgmt;
+    XenPTPM *pm_state;
+
+    MemoryRegion bar[PCI_NUM_REGIONS - 1];
+    MemoryRegion rom;
+};
+
+void pt_config_init(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);
+
+int qemu_pci_register_regions(XenPCIPassthroughState *);
+
+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;
+    }
+}
+
+static inline pcibus_t pt_pci_base_addr(pcibus_t base)
+{
+    if (base & PCI_BASE_ADDRESS_SPACE_IO)
+        return base & PCI_BASE_ADDRESS_IO_MASK;
+
+    return base & PCI_BASE_ADDRESS_MEM_MASK;
+}
+
+/* INTx */
+static inline uint8_t pci_read_intx(XenPCIPassthroughState *s)
+{
+    return host_pci_read_byte(s->real_device, PCI_INTERRUPT_PIN);
+}
+uint8_t pci_intx(XenPCIPassthroughState *ptdev);
+
+/* MSI/MSI-X */
+void msi_set_enable(XenPCIPassthroughState *dev, int en);
+int pt_msi_setup(XenPCIPassthroughState *dev);
+int pt_msi_update(XenPCIPassthroughState *d);
+void pt_msi_disable(XenPCIPassthroughState *dev);
+int pt_enable_msi_translate(XenPCIPassthroughState* dev);
+void pt_disable_msi_translate(XenPCIPassthroughState *dev);
+
+int pt_msix_init(XenPCIPassthroughState *dev, int pos);
+int pt_msix_update(XenPCIPassthroughState *dev);
+int pt_msix_update_remap(XenPCIPassthroughState *dev, int bar_index);
+void pt_msix_disable(XenPCIPassthroughState *dev);
+int add_msix_mapping(XenPCIPassthroughState *s, int bar_index);
+int remove_msix_mapping(XenPCIPassthroughState *s, int bar_index);
+
+#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;
+}
-- 
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 Oct 04 08:11:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:11:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6em-0004Xm-PT; Tue, 04 Oct 2011 08:11:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LW-0000aF-3s
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:50 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317739781!38817521!5
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20580 invoked from network); 4 Oct 2011 14:49:54 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:49:54 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="17928387"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51:46 -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, 4 Oct 2011 10:51:46 -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 p94EpSsC017018;	Tue, 4 Oct 2011 07:51:44 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:22 +0100
Message-ID: <1317739882-4809-12-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 11/11] config/make: Introduce
	--enable-xen-pci-passthrough, built 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

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 Makefile.target |    7 +++++++
 configure       |   21 +++++++++++++++++++++
 2 files changed, 28 insertions(+), 0 deletions(-)

diff --git a/Makefile.target b/Makefile.target
index f708453..b5fbc18 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -208,6 +208,13 @@ obj-$(CONFIG_NO_XEN) += xen-stub.o
 
 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_helpers.o
+obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough.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 =
 ifeq ($(CONFIG_KVM), y)
diff --git a/configure b/configure
index 0875f95..b90cfe1 100755
--- a/configure
+++ b/configure
@@ -127,6 +127,7 @@ vnc_png=""
 vnc_thread="no"
 xen=""
 xen_ctrl_version=""
+xen_pci_passthrough=""
 linux_aio=""
 attr=""
 xfs=""
@@ -635,6 +636,10 @@ for opt do
   ;;
   --enable-xen) xen="yes"
   ;;
+  --disable-xen-pci-passthrough) xen_pci_passthrough="no"
+  ;;
+  --enable-xen-pci-passthrough) xen_pci_passthrough="yes"
+  ;;
   --disable-brlapi) brlapi="no"
   ;;
   --enable-brlapi) brlapi="yes"
@@ -972,6 +977,8 @@ echo "                           (affects only QEMU, not qemu-img)"
 echo "  --enable-mixemu          enable mixer emulation"
 echo "  --disable-xen            disable xen backend driver support"
 echo "  --enable-xen             enable xen backend driver support"
+echo "  --disable-xen-pci-passthrough"
+echo "  --enable-xen-pci-passthrough"
 echo "  --disable-brlapi         disable BrlAPI"
 echo "  --enable-brlapi          enable BrlAPI"
 echo "  --disable-vnc-tls        disable TLS encryption for VNC server"
@@ -1335,6 +1342,17 @@ EOF
   fi
 fi
 
+if test "$xen_pci_passthrough" != "no"; then
+  if test "$xen" = "yes"; then
+    xen_pci_passthrough=yes
+  else
+    if test "$xen_pci_passthrough" = "yes"; then
+      feature_not_found "Xen PCI Passthrough without Xen"
+    fi
+    xen_pci_passthrough=no
+  fi
+fi
+
 ##########################################
 # pkg-config probe
 
@@ -3378,6 +3396,9 @@ case "$target_arch2" in
     if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then
       target_phys_bits=64
       echo "CONFIG_XEN=y" >> $config_target_mak
+      if test "$xen_pci_passthrough" = yes; then
+        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
+      fi
     else
       echo "CONFIG_NO_XEN=y" >> $config_target_mak
     fi
-- 
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 Oct 04 08:14:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:14:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6hR-0004w9-7M; Tue, 04 Oct 2011 08:14:29 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LW-0000aH-6F
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:51 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317739896!20189222!4
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17033 invoked from network); 4 Oct 2011 14:51:46 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:51:46 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="165647620"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51:45 -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, 4 Oct 2011 10:51:45 -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 p94EpSsB017018;	Tue, 4 Oct 2011 07:51:43 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:21 +0100
Message-ID: <1317739882-4809-11-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 10/11] Introduce Xen PCI Passthrough,
	MSI (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

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 hw/xen_pci_passthrough_msi.c |  674 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 674 insertions(+), 0 deletions(-)
 create mode 100644 hw/xen_pci_passthrough_msi.c

diff --git a/hw/xen_pci_passthrough_msi.c b/hw/xen_pci_passthrough_msi.c
new file mode 100644
index 0000000..be18ff1
--- /dev/null
+++ b/hw/xen_pci_passthrough_msi.c
@@ -0,0 +1,674 @@
+/*
+ * Copyright (c) 2007, Intel Corporation.
+ *
+ * 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.
+ *
+ * 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"
+
+void msi_set_enable(XenPCIPassthroughState *dev, int en)
+{
+    uint16_t val = 0;
+    uint32_t address = 0;
+    PT_LOG("enable: %i\n", en);
+
+    if (!dev->msi) {
+        return;
+    }
+
+    address = dev->msi->ctrl_offset;
+    if (!address) {
+        return;
+    }
+
+    val = host_pci_read_word(dev->real_device, address);
+    val &= ~PCI_MSI_FLAGS_ENABLE;
+    val |= en & PCI_MSI_FLAGS_ENABLE;
+    host_pci_write_word(dev->real_device, address, val);
+
+    PT_LOG("done, address: %#x, val: %#x\n", address, val);
+}
+
+static void msix_set_enable(XenPCIPassthroughState *dev, int en)
+{
+    uint16_t val = 0;
+    uint32_t address = 0;
+
+    if (!dev->msix) {
+        return;
+    }
+
+    address = dev->msix->ctrl_offset;
+    if (!address) {
+        return;
+    }
+
+    val = host_pci_read_word(dev->real_device, address);
+    val &= ~PCI_MSIX_FLAGS_ENABLE;
+    if (en) {
+        val |= PCI_MSIX_FLAGS_ENABLE;
+    }
+    host_pci_write_word(dev->real_device, address, val);
+}
+
+/*********************************/
+/* MSI virtuailization functions */
+
+/*
+ * setup physical msi, but didn't enable it
+ */
+int pt_msi_setup(XenPCIPassthroughState *dev)
+{
+    int pirq = -1;
+    uint8_t gvec = 0;
+
+    if (!(dev->msi->flags & MSI_FLAG_UNINIT)) {
+        PT_LOG("Error: setup physical after initialized?? \n");
+        return -1;
+    }
+
+    gvec = dev->msi->data & 0xFF;
+    if (!gvec) {
+        /* if gvec is 0, the guest is asking for a particular pirq that
+         * is passed as dest_id */
+        pirq = (dev->msi->addr_hi & 0xffffff00) |
+               ((dev->msi->addr_lo >> MSI_TARGET_CPU_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(dev->real_device->dev,
+                                          dev->real_device->func),
+                                dev->real_device->bus, 0, 0)) {
+        PT_LOG("Error: Mapping of MSI failed.\n");
+        return -1;
+    }
+
+    if (pirq < 0) {
+        PT_LOG("Error: Invalid pirq number\n");
+        return -1;
+    }
+
+    dev->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_DESTMODE_SHIFT) & 0x1;
+    dest_id = (addr >> MSI_TARGET_CPU_SHIFT) & 0xff;
+    deliv_mode = (data >> MSI_DATA_DELIVERY_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 *d)
+{
+    uint8_t gvec = 0;
+    uint32_t gflags = 0;
+    uint64_t addr = 0;
+    int ret = 0;
+
+    /* get vector, address, flags info, etc. */
+    gvec = d->msi->data & 0xFF;
+    addr = (uint64_t)d->msi->addr_hi << 32 | d->msi->addr_lo;
+    gflags = __get_msi_gflags(d->msi->data, addr);
+
+    PT_LOG("Update msi with pirq %x gvec %x gflags %x\n",
+           d->msi->pirq, gvec, gflags);
+
+    ret = xc_domain_update_msi_irq(xen_xc, xen_domid, gvec,
+                                   d->msi->pirq, gflags, 0);
+
+    if (ret) {
+        PT_LOG("Error: Binding of MSI failed.\n");
+
+        if (xc_physdev_unmap_pirq(xen_xc, xen_domid, d->msi->pirq)) {
+            PT_LOG("Error: Unmapping of MSI failed.\n");
+        }
+        d->msi->pirq = -1;
+        return ret;
+    }
+    return 0;
+}
+
+void pt_msi_disable(XenPCIPassthroughState *dev)
+{
+    PCIDevice *d = &dev->dev;
+    uint8_t gvec = 0;
+    uint32_t gflags = 0;
+    uint64_t addr = 0;
+    uint8_t e_device = 0;
+    uint8_t e_intx = 0;
+
+    msi_set_enable(dev, 0);
+
+    e_device = PCI_SLOT(dev->dev.devfn);
+    e_intx = pci_intx(dev);
+
+    if (dev->msi_trans_en) {
+        if (xc_domain_unbind_pt_irq(xen_xc, xen_domid, dev->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 (!(dev->msi->flags & MSI_FLAG_UNINIT)) {
+        /* get vector, address, flags info, etc. */
+        gvec = dev->msi->data & 0xFF;
+        addr = (uint64_t)dev->msi->addr_hi << 32 | dev->msi->addr_lo;
+        gflags = __get_msi_gflags(dev->msi->data, addr);
+
+        PT_LOG("Unbind msi with pirq %x, gvec %x\n",
+                dev->msi->pirq, gvec);
+
+        if (xc_domain_unbind_msi_irq(xen_xc, xen_domid, gvec,
+                                        dev->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 (dev->msi->pirq != -1) {
+        PT_LOG("Unmap msi with pirq %x\n", dev->msi->pirq);
+
+        if (xc_physdev_unmap_pirq(xen_xc, xen_domid, dev->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 */
+    dev->msi->flags = 0;
+    dev->msi->pirq = -1;
+    dev->msi_trans_en = 0;
+}
+
+/* MSI-INTx translation virtulization functions */
+int pt_enable_msi_translate(XenPCIPassthroughState* dev)
+{
+    uint8_t e_device = 0;
+    uint8_t e_intx = 0;
+
+    if (!(dev->msi && dev->msi_trans_cap)) {
+        return -1;
+    }
+
+    msi_set_enable(dev, 0);
+    dev->msi_trans_en = 0;
+
+    if (pt_msi_setup(dev)) {
+        PT_LOG("Error: MSI-INTx translation MSI setup failed, fallback\n");
+        return -1;
+    }
+
+    e_device = PCI_SLOT(dev->dev.devfn);
+    /* fix virtual interrupt pin to INTA# */
+    e_intx = pci_intx(dev);
+
+    if (xc_domain_bind_pt_irq(xen_xc, xen_domid, dev->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, dev->msi->pirq)) {
+            PT_LOG("Error: Unmapping of MSI failed.\n");
+        }
+        dev->msi->pirq = -1;
+        return -1;
+    }
+
+    msi_set_enable(dev, 1);
+    dev->msi_trans_en = 1;
+
+    return 0;
+}
+
+void pt_disable_msi_translate(XenPCIPassthroughState *dev)
+{
+    uint8_t e_device = 0;
+    uint8_t e_intx = 0;
+
+    /* MSI_ENABLE bit should be disabed until the new handler is set */
+    msi_set_enable(dev, 0);
+
+    e_device = PCI_SLOT(dev->dev.devfn);
+    e_intx = pci_intx(dev);
+
+    if (xc_domain_unbind_pt_irq(xen_xc, xen_domid, dev->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 (dev->machine_irq) {
+        if (xc_domain_bind_pt_pci_irq(xen_xc, xen_domid, dev->machine_irq,
+                                       0, e_device, e_intx)) {
+            PT_LOG("Error: Rebinding of interrupt failed!\n");
+        }
+    }
+
+    dev->msi_trans_en = 0;
+}
+
+/*********************************/
+/* MSI-X virtulization functions */
+
+static void mask_physical_msix_entry(XenPCIPassthroughState *dev,
+                                     int entry_nr, int mask)
+{
+    void *phys_off;
+
+    phys_off = dev->msix->phys_iomem_base + 16 * entry_nr + 12;
+    *(uint32_t *)phys_off = mask;
+}
+
+static int pt_msix_update_one(XenPCIPassthroughState *dev, int entry_nr)
+{
+    struct msix_entry_info *entry = &dev->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_TARGET_CPU_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);
+        }
+    }
+
+    /* 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(dev->real_device->dev,
+                                                dev->real_device->func),
+                                      dev->real_device->bus, entry_nr,
+                                      dev->msix->table_base);
+        if (ret) {
+            PT_LOG("Error: Mapping msix entry %x\n", entry_nr);
+            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,
+                                   dev->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 *dev)
+{
+    struct pt_msix_info *msix = dev->msix;
+    int i;
+
+    for (i = 0; i < msix->total_entries; i++) {
+        pt_msix_update_one(dev, i);
+    }
+
+    return 0;
+}
+
+void pt_msix_disable(XenPCIPassthroughState *dev)
+{
+    PCIDevice *d = &dev->dev;
+    uint8_t gvec = 0;
+    uint32_t gflags = 0;
+    uint64_t addr = 0;
+    int i = 0;
+    struct msix_entry_info *entry = NULL;
+
+    msix_set_enable(dev, 0);
+
+    for ( i = 0; i < dev->msix->total_entries; i++ ) {
+        entry = &dev->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));
+            }
+        }
+        /* 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 *dev = (XenPCIPassthroughState *)opaque;
+    XenPTMSIX *msix = dev->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);
+
+    // FIXME/TODO I maybe have to do the same in readl !
+    /* entry_nr = (addr - msix->mmio_base_addr) / 16; */
+    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 = dev->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);
+        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(dev, entry_nr);
+        }
+        mask_physical_msix_entry(dev, 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 *dev = (XenPCIPassthroughState *)opaque;
+    struct pt_msix_info *msix = dev->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 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 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 *dev, int pos)
+{
+    uint8_t id;
+    uint16_t control;
+    int i, total_entries, table_off, bar_index;
+    HostPCIDevice *pd = dev->real_device;
+    int fd;
+
+    id = host_pci_read_byte(pd, pos + PCI_CAP_LIST_ID);
+
+    if (id != PCI_CAP_ID_MSIX) {
+        PT_LOG("Error: Invalid id %#x pos %#x\n", id, pos);
+        return -1;
+    }
+
+    control = host_pci_read_word(pd, pos + 2);
+    total_entries = control & 0x7ff;
+    total_entries += 1;
+
+    dev->msix = g_malloc0(sizeof (struct pt_msix_info)
+                          + total_entries * sizeof (struct msix_entry_info));
+
+    dev->msix->total_entries = total_entries;
+    for (i = 0; i < total_entries; i++) {
+        dev->msix->msix_entry[i].pirq = -1;
+    }
+
+    dev->msix->mmio_index =
+        cpu_register_io_memory(pci_msix_read, pci_msix_write,
+                               dev, DEVICE_NATIVE_ENDIAN);
+
+    table_off = host_pci_read_long(pd, pos + PCI_MSIX_TABLE);
+    bar_index = dev->msix->bar_index = table_off & PCI_MSIX_FLAGS_BIRMASK;
+    table_off = dev->msix->table_off = table_off & ~PCI_MSIX_FLAGS_BIRMASK;
+    dev->msix->table_base =
+        pt_pci_base_addr(dev->real_device->base_addr[bar_index]);
+    PT_LOG("get MSI-X table bar base %#"PRIx64"\n", dev->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);
+    dev->msix->table_offset_adjust = table_off & 0x0fff;
+    dev->msix->phys_iomem_base = mmap(0,
+                                      total_entries * 16
+                                      + dev->msix->table_offset_adjust,
+                                      PROT_WRITE | PROT_READ,
+                                      MAP_SHARED | MAP_LOCKED,
+                                      fd,
+                                      dev->msix->table_base + table_off
+                                      - dev->msix->table_offset_adjust);
+    if (dev->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;
+    }
+    dev->msix->phys_iomem_base = ((char *)dev->msix->phys_iomem_base +
+                                  dev->msix->table_offset_adjust);
+
+    close(fd);
+
+    PT_LOG("mapping physical MSI-X table to %p\n", dev->msix->phys_iomem_base);
+    return 0;
+
+error_out:
+    g_free(dev->msix);
+    dev->msix = NULL;
+    return -1;
+}
+
+#if 0
+static void pt_msix_delete(XenPCIPassthroughState *dev)
+{
+    /* unmap the MSI-X memory mapped register area */
+    if (dev->msix->phys_iomem_base)
+    {
+        PT_LOG("unmapping physical MSI-X table from %lx\n",
+           (unsigned long)dev->msix->phys_iomem_base);
+        munmap(dev->msix->phys_iomem_base, dev->msix->total_entries * 16 +
+           dev->msix->table_offset_adjust);
+    }
+
+    if (dev->msix->mmio_index > 0)
+    {
+        cpu_unregister_io_memory(dev->msix->mmio_index);
+    }
+
+
+    free(dev->msix);
+}
+#endif
-- 
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 Oct 04 08:17:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08: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 1RB6k2-0005Mu-PP; Tue, 04 Oct 2011 08:17:10 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6LV-0000a6-1O
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:51:50 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317739781!38817521!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20332 invoked from network); 4 Oct 2011 14:49:52 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 14:49:52 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312171200"; d="scan'208";a="17928385"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 10:51: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, 4 Oct 2011 10:51: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 p94EpSsA017018;	Tue, 4 Oct 2011 07:51:42 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Tue, 4 Oct 2011 15:51:20 +0100
Message-ID: <1317739882-4809-10-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC V1 09/11] 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

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 hw/xen_pci_passthrough_config_init.c | 2489 ++++++++++++++++++++++++++++++++++
 1 files changed, 2489 insertions(+), 0 deletions(-)
 create mode 100644 hw/xen_pci_passthrough_config_init.c

diff --git a/hw/xen_pci_passthrough_config_init.c b/hw/xen_pci_passthrough_config_init.c
new file mode 100644
index 0000000..4bf9c15
--- /dev/null
+++ b/hw/xen_pci_passthrough_config_init.c
@@ -0,0 +1,2489 @@
+#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)))
+
+/* 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 ((index > 0) && (index < PCI_ROM_SLOT) &&
+        ((s->real_device->base_addr[index - 1]
+          & (PCI_BASE_ADDRESS_SPACE | PCI_BASE_ADDRESS_MEM_TYPE_MASK))
+         == (PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_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->base_addr[index] & PCI_BASE_ADDRESS_SPACE_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) {
+        if (s->msi_trans_en) {
+            msi_set_enable(s, 0);
+        } else {
+            throughable_mask |= PCI_COMMAND_INTX_DISABLE;
+        }
+    } else {
+        if (s->msi_trans_en) {
+            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);
+
+    /* 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 */
+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 = s->real_device->base_addr[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->base_addr[index-1]; // >> 32;
+    } else {
+        *value = s->real_device->base_addr[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_read_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_read_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_write_word(s->real_device, real_offset, 0);
+        break;
+    case 2:
+        PT_LOG("Power state transition D2 -> D0active\n");
+        host_pci_write_word(s->real_device, real_offset, 0);
+        usleep(200);
+        break;
+    case 3:
+        PT_LOG("Power state transition D3hot -> D0active\n");
+        host_pci_write_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->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];
+        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_read_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;
+    struct pt_pm_info *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_write_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_read_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,
+    },
+};
+
+/********************************
+ * 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_write_word(s->real_device, real_offset,
+                            reg_field & ~PCI_MSI_FLAGS_ENABLE);
+    }
+    s->msi->flags |= reg_field | 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 &
+        ~(MSI_FLAG_UNINIT | PT_MSI_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 & 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 &= ~MSI_FLAG_UNINIT;
+            s->msi->flags |= PT_MSI_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_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");
+        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_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");
+        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_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_write_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
+ */
+
+/* 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_read_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_write_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;
+}
+/* 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 */
+    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;
+    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 */
+    {
+        .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,
+    },
+    /* 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,
+        .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,
+    },
+    /* 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,
+    },
+};
+
+/* 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_read_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_write_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);
+
+    /* setup MSI-INTx translation if support */
+    ret = pt_enable_msi_translate(s);
+
+    /* rebind machine_irq to device */
+    if (ret < 0 && 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_read_byte(s->real_device, PCI_STATUS);
+    if ((status & PCI_STATUS_CAP_LIST) == 0) {
+        return 0;
+    }
+
+    while (max_cap--) {
+        pos = host_pci_read_byte(s->real_device, pos);
+        if (pos < 0x40) {
+            break;
+        }
+
+        pos &= ~3;
+        id = host_pci_read_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;
+}
-- 
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 Oct 04 08:20:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:20:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6n3-0005wv-45; Tue, 04 Oct 2011 08:20:17 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB6SE-0002xS-HJ
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:58:49 -0700
X-Env-Sender: avi@redhat.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1317740308!33873629!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22424 invoked from network); 4 Oct 2011 14:58:29 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-14.tower-174.messagelabs.com with SMTP;
	4 Oct 2011 14:58:29 -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 p94EwOVW022461
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 4 Oct 2011 10:58:24 -0400
Received: from balrog.usersys.redhat.com (dhcp-1-24.tlv.redhat.com
	[10.35.1.24])
	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p94EwMql026228; Tue, 4 Oct 2011 10:58:22 -0400
Message-ID: <4E8B1F0D.4080203@redhat.com>
Date: Tue, 04 Oct 2011 16:58:21 +0200
From: Avi Kivity <avi@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
In-Reply-To: <1317739882-4809-1-git-send-email-anthony.perard@citrix.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.25
Cc: Alex Williamson <alex.williamson@redhat.com>,
	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 10/04/2011 04:51 PM, Anthony PERARD wrote:
> Hi all,
>
> This patch series introduce the PCI passthrough for Xen.
>
> First, we have HostPCIDevice that help to access one PCI device of the host.
>
> Then, there are several additions in the QEMU code. One is qemu_run_one_timer
> to run a specific timer. It is used by PCI passthrough to run a timer about
> power management. Another is pci_check_bar_overlap.
>
> There are also several change in pci_ids and pci_regs.
>
> Last part, but not least, the PCI passthrough device himself. Cut in 3 parts
> (or file), there is one to take care of the initialisation of a passthrough
> device. The second one handle everything about the config address space, there
> are specifics functions for every config register. The third one is to handle
> MSI.
>
> I'm still working on setting a PCI passthrough device through QMP from libxl
> (xen tool stack). It is just a call to device_add, with the driver parametter
> hostaddr="0000:00:1b.0".
>
> There is some minor things missing:
>   - copyright header
>   - PCI IO space multiplexer
>
>

We also have pci passthrough in qemu-kvm (I think based on the same 
Neocleus code).  Rather than having two pci assignment implementations, 
I think we should have just one, with the differences (programming the 
hypervisor) abstracted at that level.

-- 
error compiling committee.c: too many arguments to function


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 08:21:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08: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 1RB6o7-0006Jt-Lx; Tue, 04 Oct 2011 08:21:23 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6TX-00036x-RM
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 08:00:13 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317740385!45129498!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5337 invoked from network); 4 Oct 2011 14:59:45 -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;
	4 Oct 2011 14:59:45 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312156800"; 
   d="scan'208";a="8204209"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 15:00: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; Tue, 4 Oct 2011
	16:00:01 +0100
Subject: Re: [Xen-devel] [PATCH] tools/check: check for yajl (needed by libxl)
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Andre Przywara <andre.przywara@amd.com>
Date: Tue, 4 Oct 2011 16:00:00 +0100
In-Reply-To: <4E8B1CCA.4040805@amd.com>
References: <4b98868690218126b906.1317368189@cosworth.uk.xensource.com>
	<CAJJyHjL55fNgwrmDVdCehaOLC1mPecf8M4fE4RCn_g_vygj=0A@mail.gmail.com>
	<1317379194.26672.256.camel@zakaz.uk.xensource.com>
	<4E8B1CCA.4040805@amd.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317740400.21903.155.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Anthony Perard <anthony.perard@citrix.com>, Olaf Hering <olaf@aepfle.de>,
	"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-10-04 at 15:48 +0100, Andre Przywara wrote:
> On 09/30/2011 12:39 PM, Ian Campbell wrote:
> > On Fri, 2011-09-30 at 11:35 +0100, Anthony PERARD wrote:
> >> On Fri, Sep 30, 2011 at 08:36, Ian Campbell<ian.campbell@citrix.com>  wrote:
> >>  ...
> >> You probably want to check the yajl headers as well, no ?
> >> #include<yajl/yajl_parse.h>
> >> #include<yajl/yajl_gen.h>
> >
> > tools/check seems a bit inconsistent and I'd expect them both to be in
> > the -dev package but I guess it can't hurt.
> >
> > # HG changeset patch
> > # User Ian Campbell<ian.campbell@citrix.com>
> > # Date 1317379175 -3600
> > # Node ID de602616358b7def9351850f518e453c68141c4f
> > # Parent  302b7556edd91a7506f2215bed5302b4b5eaa52a
> > tools/check: check for yajl (needed by libxl)
> >
> > Signed-off-by: Ian Campbell<ian.campbell@citrix.com>
> > ---
> > (note to committer, ensure the new files are executable)
> >
> > diff -r 302b7556edd9 -r de602616358b tools/check/check_yajl_devel
> > --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> > +++ b/tools/check/check_yajl_devel	Fri Sep 30 11:39:35 2011 +0100
> > @@ -0,0 +1,7 @@
> > +#!/bin/sh
> > +# CHECK-BUILD CHECK-INSTALL
> 
> Shouldn't you be able to omit the CHECK_INSTALL on this one?
> The header files are not a runtime requirement, right?

Correct, it was a cut'n'paste-o.

> Also wouldn't it be nicer to link this small library statically? This 
> would omit the runtime requirement at all.
> The test team just spelled yajl as "yet another library to get Xen 
> running"...

I don't think this is necessary, it's just a library you need to install
and for most users the packaging system will transparently cover this.
All the usual reasons for not statically linking stuff apply here.
There's nothing special about that wrt Xen and/or the size of the
library.

> Also be advised that it looks like this is relying on version 1 of yajl. 
> It looks like the new version 2.0.1 is not compatible, I got compile 
> errors with the newer version. If the stable version 1.x is required, 
> this should be stated somewhere or at least checked properly in check_yajl.

Any idea what we could test for here?

> 
> Regards,
> Andre.
> 
> > +
> > +. ./funcs.sh
> > +
> > +has_header yajl/yajl_parse.h || fail "can't find yajl/yajl_parse.h"
> > +has_header yajl/yajl_gen.h || fail "can't find yajl/yajl_gen.h"
> > diff -r 302b7556edd9 -r de602616358b tools/check/check_yajl_lib
> > --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> > +++ b/tools/check/check_yajl_lib	Fri Sep 30 11:39:35 2011 +0100
> > @@ -0,0 +1,6 @@
> > +#!/bin/sh
> > +# CHECK-BUILD CHECK-INSTALL
> > +
> > +. ./funcs.sh
> > +
> > +has_lib libyajl.so || fail "can't find libyajl.so"
> >
> >
> 



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 08:22:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:22:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6pC-0006hO-WD; Tue, 04 Oct 2011 08:22:31 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6Un-0003Fq-Uy
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 08:01:46 -0700
X-Env-Sender: anthony@codemonkey.ws
X-Msg-Ref: server-9.tower-174.messagelabs.com!1317740481!27843957!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4205 invoked from network); 4 Oct 2011 15:01:22 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 15:01:22 -0000
Received: by iaqq3 with SMTP id q3so216144iaq.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 08:01:20 -0700 (PDT)
Received: by 10.42.148.132 with SMTP id r4mr1994031icv.177.1317740480913;
	Tue, 04 Oct 2011 08:01:20 -0700 (PDT)
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 by18sm37488201ibb.1.2011.10.04.08.01.18
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 04 Oct 2011 08:01:19 -0700 (PDT)
Message-ID: <4E8B1FBC.2080904@codemonkey.ws>
Date: Tue, 04 Oct 2011 10:01:16 -0500
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: Avi Kivity <avi@redhat.com>
Subject: Re: [Qemu-devel] [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<4E8B1F0D.4080203@redhat.com>
In-Reply-To: <4E8B1F0D.4080203@redhat.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	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 10/04/2011 09:58 AM, Avi Kivity wrote:
> On 10/04/2011 04:51 PM, Anthony PERARD wrote:
>> Hi all,
>>
>> This patch series introduce the PCI passthrough for Xen.
>>
>> First, we have HostPCIDevice that help to access one PCI device of the host.
>>
>> Then, there are several additions in the QEMU code. One is qemu_run_one_timer
>> to run a specific timer. It is used by PCI passthrough to run a timer about
>> power management. Another is pci_check_bar_overlap.
>>
>> There are also several change in pci_ids and pci_regs.
>>
>> Last part, but not least, the PCI passthrough device himself. Cut in 3 parts
>> (or file), there is one to take care of the initialisation of a passthrough
>> device. The second one handle everything about the config address space, there
>> are specifics functions for every config register. The third one is to handle
>> MSI.
>>
>> I'm still working on setting a PCI passthrough device through QMP from libxl
>> (xen tool stack). It is just a call to device_add, with the driver parametter
>> hostaddr="0000:00:1b.0".
>>
>> There is some minor things missing:
>> - copyright header
>> - PCI IO space multiplexer
>>
>>
>
> We also have pci passthrough in qemu-kvm (I think based on the same Neocleus
> code). Rather than having two pci assignment implementations, I think we should
> have just one, with the differences (programming the hypervisor) abstracted at
> that level.

I agree in principle but how close is qemu-kvm pci passthrough to a mergable 
state?  Would it make sense to merge the Xen code first and then abstract it?

Regards,

Anthony Liguori

>


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 08:23:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:23:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6qS-000750-CJ; Tue, 04 Oct 2011 08:23:48 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6Yh-0003fE-Bh
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 08:05:29 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1317740724!27844790!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17930 invoked from network); 4 Oct 2011 15:05:24 -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;
	4 Oct 2011 15:05:24 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312156800"; 
   d="scan'208";a="8204458"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 15:05:23 +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, 4 Oct 2011 16:05:24 +0100
Date: Tue, 4 Oct 2011 16:05:16 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony Liguori <anthony@codemonkey.ws>
Subject: Re: [Qemu-devel] [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
In-Reply-To: <4E8B1FBC.2080904@codemonkey.ws>
Message-ID: <alpine.DEB.2.00.1110041603080.3519@kaball-desktop>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<4E8B1F0D.4080203@redhat.com> <4E8B1FBC.2080904@codemonkey.ws>
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>,
	Stabellini <Stefano.Stabellini@eu.citrix.com>,
	QEMU-devel <qemu-devel@nongnu.org>, Stefano,
	Alex Williamson <alex.williamson@redhat.com>, Avi Kivity <avi@redhat.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 Tue, 4 Oct 2011, Anthony Liguori wrote:
> On 10/04/2011 09:58 AM, Avi Kivity wrote:
> > On 10/04/2011 04:51 PM, Anthony PERARD wrote:
> >> Hi all,
> >>
> >> This patch series introduce the PCI passthrough for Xen.
> >>
> >> First, we have HostPCIDevice that help to access one PCI device of the host.
> >>
> >> Then, there are several additions in the QEMU code. One is qemu_run_one_timer
> >> to run a specific timer. It is used by PCI passthrough to run a timer about
> >> power management. Another is pci_check_bar_overlap.
> >>
> >> There are also several change in pci_ids and pci_regs.
> >>
> >> Last part, but not least, the PCI passthrough device himself. Cut in 3 parts
> >> (or file), there is one to take care of the initialisation of a passthrough
> >> device. The second one handle everything about the config address space, there
> >> are specifics functions for every config register. The third one is to handle
> >> MSI.
> >>
> >> I'm still working on setting a PCI passthrough device through QMP from libxl
> >> (xen tool stack). It is just a call to device_add, with the driver parametter
> >> hostaddr="0000:00:1b.0".
> >>
> >> There is some minor things missing:
> >> - copyright header
> >> - PCI IO space multiplexer
> >>
> >>
> >
> > We also have pci passthrough in qemu-kvm (I think based on the same Neocleus
> > code). Rather than having two pci assignment implementations, I think we should
> > have just one, with the differences (programming the hypervisor) abstracted at
> > that level.
> 
> I agree in principle but how close is qemu-kvm pci passthrough to a mergable 
> state?  Would it make sense to merge the Xen code first and then abstract it?

I think it should be fairly easy to abstract the current xen code: just
a matter of providing memory, ioport and interrupt mapping functions.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 08:24:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:24:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6rY-0007Rz-4N; Tue, 04 Oct 2011 08:24:56 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6ZA-0003ke-2w
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 08:05:56 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-27.messagelabs.com!1317740726!51334311!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17970 invoked from network); 4 Oct 2011 15:05:26 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-7.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 4 Oct 2011 15:05:26 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317740752; l=2970;
	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=SEC/ZDJ6p3/iGEOH/cK/qSVpWcU=;
	b=qBxkhUNpfVk41KD4KYXAlYaH1kWBWkRlUN53BdJZScnK8z2y+4WeH+PDfSA1qjyMX/w
	7uDgpu+ycCtOuoRVnBBy2sTuEFXlWzh5/hNbf5iBkfShU+yRzvG7NYic/8reCyUAQMKR8
	vdizG3UyvgIeYJXyHz4uHjJWjrkAZHv/hwo=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by smtp.strato.de (fruni mo14) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id d05b0fn94Dd0H8 ;
	Tue, 4 Oct 2011 17:05:46 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 0B9BE18B65; Tue,  4 Oct 2011 17:05:45 +0200 (CEST)
Date: Tue, 4 Oct 2011 17:05:45 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 00 of 24] xenpaging fixes for xen-unstable
Message-ID: <20111004150545.GA13277@aepfle.de>
References: <patchbomb.1317657277@probook.site>
	<1317721869.21903.110.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <1317721869.21903.110.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
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, Oct 04, Ian Campbell wrote:

> totmem is unfortunately not all that descriptive to an end user of what
> it does (which I think is a general problem we have with the memory
> related options).
> 
> Currently the xl config file options are:
>         memory = actual start of day RAM
>         maxmem = max ram guest could balloon to (?)
> 
> How does POD fit in? Is it just maxmem-memory for HVM domains? (not
> really relevant for this discussion, more for completeness).
> 
> The associated command line options are:
>         mem-set (runtime equivalent of memory?)
>         mem-max (runtime equivalent of maxmem?)
> 
> Hmm, I was hoping that enumerating the existing options would make the
> name and semantics of the paging option magically pop into my head, I
> was wrong :-(
> 
> BTW tools/libxl/libxl_memory.txt should be patched by this series too,
> once we figure out what to call things.
> 
> The phrase "actual memory" is used in that document -- perhaps that is
> suitable terminology for totmem?

The naming of the various numbers is confusing, so far I could not come
up with a better name than tot_pages.

"actual target" is close to what xenpaging leaves for the guest, the
amount of video ram has to be substracted.

I think the code in libxl, xenstore and in my changes is not 100%
consistent with the figure below. I have to wade through the individual
members again and check if the math is correct in all places.

Olaf

/* === Domain memory breakdown: HVM guests ==================================
                           
             +  +----------+                                                 +            
             |  | 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
    extra external = LIBXL_HVM_EXTRA_MEMORY
    shadow = libxl_domain_build_info.shadow_memkb
    static maximum = libxl_domain_build_info.max_memkb
    video = libxl_domain_build_info.video_memkb
    build start = libxl_domain_build_info.target_memkb
    libxl_domain_setmaxmem -> xen maximum
    libxl_set_memory_target -> actual target
                
    build maximum = RAM as seen inside the virtual machine
                    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
    real RAM      = RAM allocated for the guest
                    Increase/Decrease via commands to paging daemon
		    xl mem-FOO

    guest = real RAM
    paging = virtual RAM / swap
    balloon = will become real or virtual RAM after mem-set command


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 08:26:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:26:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6sa-0007ou-0Q; Tue, 04 Oct 2011 08:26:00 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6bc-0004C4-3Z
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 08:08:31 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-15.tower-182.messagelabs.com!1317740902!19856070!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22497 invoked from network); 4 Oct 2011 15:08:23 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-15.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 4 Oct 2011 15:08:23 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317740902; l=403;
	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=2NYKIrSeVQcLzrWVYZIlY82HEGY=;
	b=SLevMaazOwp8arh7kJw3yNImRlRegY5IRINUzzTkEjjf6GUXL5kqEQcaEiFAC7Cs4dp
	efSWCV4urIk/wikhgC+VzoA5kYNcroDjjwJ0VWwxTzE+JYIZR+qzehiEstHaxOH56nxvv
	ruIWdThhf/3QJHzE7Eku7ij2Bt9ELoMe3bk=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by smtp.strato.de (fruni mo47) (RZmta 26.9 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id K0738dn94EeDlR ;
	Tue, 4 Oct 2011 17:08:08 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 3972518B65; Tue,  4 Oct 2011 17:08:07 +0200 (CEST)
Date: Tue, 4 Oct 2011 17:08:07 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 00 of 24] xenpaging fixes for xen-unstable
Message-ID: <20111004150806.GB13277@aepfle.de>
References: <patchbomb.1317657277@probook.site>
	<1317721869.21903.110.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <1317721869.21903.110.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
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, Oct 04, Ian Campbell wrote:

> How does POD fit in? Is it just maxmem-memory for HVM domains? (not
> really relevant for this discussion, more for completeness).

I dont have much experince with PoD, and started just last week some
testing with a ballooned guest. In my limited testing I found no obvious
bugs. But I have to check the code what PoD really means for paged pages.

Olaf

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 08:27:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:27:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6tY-0008C7-KY; Tue, 04 Oct 2011 08:27:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6k4-0005Mq-F5
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 08:17:18 -0700
X-Env-Sender: davidxu06@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1317741415!42749316!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29488 invoked from network); 4 Oct 2011 15:16:56 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 15:16:56 -0000
Received: by ywm21 with SMTP id 21so1183453ywm.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 08:17:08 -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:content-transfer-encoding;
	bh=7eFvSEid6vgSlA2E+hVe9KROrYxau1K2eyVv+CeNM4s=;
	b=F6QtjGAibbdLhalruz06bwKUpqsNmF8yynQBKpYdYIplBA3Kc9Ee0YljpQj3AGZvMp
	+C+ZUhNdDAFgiHT4Z6HdU7Kcf9qPUNLG90c4J4/l5PcJ9BbvuX7hIwi1x9Q7O4sfE629
	ewFAoDU/U0cfhbw38cyJmkK07zdHumBvU86F4=
MIME-Version: 1.0
Received: by 10.150.22.40 with SMTP id 40mr1333886ybv.395.1317741427978; Tue,
	04 Oct 2011 08:17:07 -0700 (PDT)
Received: by 10.150.157.13 with HTTP; Tue, 4 Oct 2011 08:17:07 -0700 (PDT)
In-Reply-To: <1317394559.26672.293.camel@zakaz.uk.xensource.com>
References: <CAGjowiTc0NAJbWR-RxwLTrz+bhbAFfvcPKPAB_F8r1ef6__PbA@mail.gmail.com>
	<1317368064.26672.198.camel@zakaz.uk.xensource.com>
	<CAGjowiQE_3gTJxK+Ja850QU9g1+97hZ8hAgdv_a4B18jxmCNGw@mail.gmail.com>
	<1317393663.26672.288.camel@zakaz.uk.xensource.com>
	<CAGjowiSrPCY50-iBK67nGfOGdK7z1htc58ohtrqJtmutmRRQzQ@mail.gmail.com>
	<1317394559.26672.293.camel@zakaz.uk.xensource.com>
Date: Tue, 4 Oct 2011 11:17:07 -0400
Message-ID: <CAGjowiSkwN9Oz-qevYk2G1NgwBmFOLWFLtT30aBu0SAe=jqtog@mail.gmail.com>
Subject: Re: [Xen-devel] ring buffer overflow
From: David Xu <davidxu06@gmail.com>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
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

Hi,

I made the experiment with httperf again, and used tcpdump to capture
the packets on both server side and client side. I found that if there
was some retransmission (e.t. client send several syn to server
because it didn't receive ack in time), the vif only receive the last
packet (syn) and missed the former ones. So I think there are some
issues happened between the eth0(veth0) and vif in the dom0. But if I
use a low latency scheduler written by myself (only modify the client
scheduler and didn't touch other parts ), there will not be
retransmission or there is very few retransmission. I am not familiar
with netback of xen. Can you give me some suggestion? Or which part
source code I need to check to find the reason of packets loss between
eth0(veth0) and vif in dom0? Thanks.

Regards,
Cong

2011/9/30 Ian Campbell <Ian.Campbell@eu.citrix.com>:
> On Fri, 2011-09-30 at 15:44 +0100, David Xu wrote:
>> Hi,
>>
>> 2011/9/29 Ian Campbell <Ian.Campbell@citrix.com>:
>> > On Fri, 2011-09-30 at 05:18 +0100, David Xu wrote:
>> >> Hi,
>> >>
>> >> Does anybody know whether the ring buffer between front end and back
>> >> end will suffer from overflow? I just wonder if the ring buffer will
>> >> be full and drop some packets when the Net I/O load is very heavy.
>> >
>> > In the case of networking whichever end is putting stuff on the ring
>> > checks that there is enough room and will stop the queue when it canno=
t
>> > transmit any more and restart when room becomes available.
>>
>> You mean even there is not enough room in ring buffer, xen will * not
>> drop the packets * and just delay the transmission.
>
> It's not Xen but rather the kernel back and front ends which is involved
> here. You can examine the hard_start_xmit functions in both netback and
> netfront to determine for yourself whether or not packets can be dropped
> and when.
>
>> =A0I used httperf to
>> measure the performance of web server running in a VM (The workload in
>> this VM is mixed, so it can not benefit from boost mechanism. The net
>> i/o suffers from relatively high latency which depends on the number
>> of VMs in the system). I found that with the increase of request rate
>> in client side, the connection rate will drop and the connection time
>> will increase dramatically. And the retransmission appears when the
>> request rate is over than a quantum. So I doubted that the http/tcp
>> connection suffer from the packets drop when the ring buffer is full
>> because of high request rate.
>>
>> >
>> >> BTW, If I want to change the size of i/o ring buffer, how should I do=
?
>> >> I tried to reset the NET_TX_RING_SIZE and NET_RX_RING_SIZE in both
>> >> front end and back end, but it seems doesn't work. Thanks.
>> >
>> > Currently the rings are limited to 1 page so if you want to increase t=
he
>> > size you would need to add multipage ring support to the network
>> > protocol. There have been patches to do this for the blk protocol but =
I
>> > do not recall any for the net protocol.
>>
>> Yes, increasing the size is relatively hard. So I just want reduce the
>> size of ring buffer to make sure my doubt described above. I directly
>> set =A0NET_TX_RING_SIZE and =A0NET_RX_RING_SIZE to 128, but it doesn't s=
eem to work.
>
> You need to make sure both ends of the connection agree on the ring
> size.
>
> I'm afraid this is not a very common thing to want to do so if you want
> to persist with this approach I'm afraid you'll have to do some
> debugging.
>
> Ian.
>
>
>

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 08:28:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 08:28:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB6uq-0000Dy-CJ; Tue, 04 Oct 2011 08:28:20 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6le-0005dM-4U
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 08:18:51 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-27.messagelabs.com!1317741499!40384410!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18343 invoked from network); 4 Oct 2011 15:18:21 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 15:18:21 -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 DC2D98E91;
	Tue,  4 Oct 2011 08:18:43 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 36388210F3;
	Tue,  4 Oct 2011 08:18:40 -0700 (PDT)
Message-ID: <4E8B23D0.6030503@goop.org>
Date: Tue, 04 Oct 2011 08:18:40 -0700
From: Jeremy Fitzhardinge <jeremy@goop.org>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Jason Baron <jbaron@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com>
In-Reply-To: <20111004141011.GA2520@redhat.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>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	hpa@zytor.com, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/04/2011 07:10 AM, Jason Baron wrote:
> On Mon, Oct 03, 2011 at 09:27:56AM -0700, Jeremy Fitzhardinge wrote:
>> On 10/03/2011 08:02 AM, Jason Baron wrote:
>>> Hi,
>>>
>>> (Sorry for the late reply - I was away for a few days).
>>>
>>> The early enable is really nice - it means there are not restrictions on
>>> when jump_label_inc()/dec() can be called which is nice.
>>>
>>> comments below.
>>>
>>>
>>> On Sat, Oct 01, 2011 at 02:55:35PM -0700, Jeremy Fitzhardinge wrote:
>>>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>>>
>>>> If a key has been enabled before jump_label_init() is called, don't
>>>> nop it out.
>>>>
>>>> This removes arch_jump_label_text_poke_early() (which can only nop
>>>> out a site) and uses arch_jump_label_transform() instead.
>>>>
>>>> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>>> ---
>>>>  include/linux/jump_label.h |    3 ++-
>>>>  kernel/jump_label.c        |   20 ++++++++------------
>>>>  2 files changed, 10 insertions(+), 13 deletions(-)
>>>>
>>>> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
>>>> index 1213e9d..c8fb1b3 100644
>>>> --- a/include/linux/jump_label.h
>>>> +++ b/include/linux/jump_label.h
>>>> @@ -45,7 +45,8 @@ extern void jump_label_lock(void);
>>>>  extern void jump_label_unlock(void);
>>>>  extern void arch_jump_label_transform(struct jump_entry *entry,
>>>>  				 enum jump_label_type type);
>>>> -extern void arch_jump_label_text_poke_early(jump_label_t addr);
>>>> +extern void arch_jump_label_transform_early(struct jump_entry *entry,
>>>> +				 enum jump_label_type type);
>>>>  extern int jump_label_text_reserved(void *start, void *end);
>>>>  extern void jump_label_inc(struct jump_label_key *key);
>>>>  extern void jump_label_dec(struct jump_label_key *key);
>>>> diff --git a/kernel/jump_label.c b/kernel/jump_label.c
>>>> index a8ce450..059202d5 100644
>>>> --- a/kernel/jump_label.c
>>>> +++ b/kernel/jump_label.c
>>>> @@ -121,13 +121,6 @@ static void __jump_label_update(struct jump_label_key *key,
>>>>  	}
>>>>  }
>>>>  
>>>> -/*
>>>> - * Not all archs need this.
>>>> - */
>>>> -void __weak arch_jump_label_text_poke_early(jump_label_t addr)
>>>> -{
>>>> -}
>>>> -
>>>>  static __init int jump_label_init(void)
>>>>  {
>>>>  	struct jump_entry *iter_start = __start___jump_table;
>>>> @@ -139,12 +132,15 @@ static __init int jump_label_init(void)
>>>>  	jump_label_sort_entries(iter_start, iter_stop);
>>>>  
>>>>  	for (iter = iter_start; iter < iter_stop; iter++) {
>>>> -		arch_jump_label_text_poke_early(iter->code);
>>>> -		if (iter->key == (jump_label_t)(unsigned long)key)
>>>> +		struct jump_label_key *iterk;
>>>> +
>>>> +		iterk = (struct jump_label_key *)(unsigned long)iter->key;
>>>> +		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
>>>> +					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
>>> The only reason I called this at boot-time was that the 'ideal' x86
>>> no-op isn't known until boot time. Thus, in the enabled case we could
>>> skip the the arch_jump_label_transform() call. ie:
>>>
>>> if (!enabled)
>>> 	arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
>>
>> Yep, fair enough.
>>
>>>
>>>> +		if (iterk == key)
>>>>  			continue;
>>>>  
>>>> -		key = (struct jump_label_key *)(unsigned long)iter->key;
>>>> -		atomic_set(&key->enabled, 0);
>>>> +		key = iterk;
>>>>  		key->entries = iter;
>>>>  #ifdef CONFIG_MODULES
>>>>  		key->next = NULL;
>>>> @@ -212,7 +208,7 @@ void jump_label_apply_nops(struct module *mod)
>>>>  		return;
>>>>  
>>>>  	for (iter = iter_start; iter < iter_stop; iter++)
>>>> -		arch_jump_label_text_poke_early(iter->code);
>>>> +		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
>>>>  }
>>>>  
>>>>  static int jump_label_add_module(struct module *mod)
>>>> -- 
>>>> 1.7.6.2
>>>>
>>> hmmm...this is used on module load in smp - so this would introduce a number of
>>> calls to stop_machine() where we didn't have them before. Yes, module
>>> load is a very slow path to begin with, but I think its at least worth
>>> pointing out...
>> Ah, that explains it - the module stuff certainly isn't "early" except -
>> I guess - in the module's lifetime.
>>
>> Well, I suppose I could introduce either second variant of the function,
>> or add a "live" flag (ie, may be updating code that a processor is
>> executing), which requires a stop_machine, or direct update if it doesn't.
>>
>> But is there any reason why we couldn't just generate a reasonably
>> efficient 5-byte atomic nop in the first place, and get rid of all that
>> fooling around?  It looks like x86 is the only arch where it makes any
>> difference at all, and how much difference does it really make?  Or is
>> there no one 5-byte atomic nop that works on all x86 variants, aside
>> from jmp +0?
>>
>>     J
> Yes, there are really two reasons for the initial no-op patching pass:
>
> 1) The jmp +0, is a 'safe' no-op that I know is going to initially
> boot for all x86. I'm not sure if there is a 5-byte nop that works on
> all x86 variants - but by using jmp +0, we make it much easier to debug
> cases where we may be using broken no-ops.
>
> 2) This optimization is about as close to a 0 cost off case as possible.
> I know there have been various no-op benchmarks posted on lkml in the
> past, so the choice of no-op does seem to make a difference. see:
> http://lkml.indiana.edu/hypermail/linux/kernel/0808.1/2416.html, for
> example. So at least to me, if we are not using the lowest cost no-op,
> we are at least in-part defeating the point of this optimization.
>
> I like the "live" flag suggestion mentioned above. Less functions is
> better, and non-x86 arches can simply ignore the flag.

I went the other way and added a second function,
arch_jump_label_transform_static(), which has a weak default
implementation which calls arch_jump_label_transform().  That way only
the architectures which really care about it need implement a second
variant. I did x86 and s390 by adapting the patches I had from the other
series; it didn't look like mips/sparc/power were very heavyweight at all.

    J

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 08:29:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 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 1RB6w7-0000dU-49; Tue, 04 Oct 2011 08:29:39 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB6uN-0008Ur-M7
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 08:27:52 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317742045!38435999!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15965 invoked from network); 4 Oct 2011 15:27:25 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 15:27:25 -0000
X-IronPort-AV: E=Sophos;i="4.68,485,1312156800"; 
   d="scan'208";a="8205262"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 15:27: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; Tue, 4 Oct 2011
	16:27:48 +0100
Subject: Re: [Xen-devel] ring buffer overflow
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: David Xu <davidxu06@gmail.com>
Date: Tue, 4 Oct 2011 16:27:47 +0100
In-Reply-To: <CAGjowiSkwN9Oz-qevYk2G1NgwBmFOLWFLtT30aBu0SAe=jqtog@mail.gmail.com>
References: <CAGjowiTc0NAJbWR-RxwLTrz+bhbAFfvcPKPAB_F8r1ef6__PbA@mail.gmail.com>
	<1317368064.26672.198.camel@zakaz.uk.xensource.com>
	<CAGjowiQE_3gTJxK+Ja850QU9g1+97hZ8hAgdv_a4B18jxmCNGw@mail.gmail.com>
	<1317393663.26672.288.camel@zakaz.uk.xensource.com>
	<CAGjowiSrPCY50-iBK67nGfOGdK7z1htc58ohtrqJtmutmRRQzQ@mail.gmail.com>
	<1317394559.26672.293.camel@zakaz.uk.xensource.com>
	<CAGjowiSkwN9Oz-qevYk2G1NgwBmFOLWFLtT30aBu0SAe=jqtog@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: <1317742068.21903.162.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

Please don't top post.

On Tue, 2011-10-04 at 16:17 +0100, David Xu wrote:
> Hi,
> 
> I made the experiment with httperf again, and used tcpdump to capture
> the packets on both server side and client side. I found that if there
> was some retransmission (e.t. client send several syn to server
> because it didn't receive ack in time), the vif only receive the last
> packet (syn) and missed the former ones. So I think there are some
> issues happened between the eth0(veth0) and vif in the dom0. But if I
> use a low latency scheduler written by myself (only modify the client
> scheduler and didn't touch other parts ), there will not be
> retransmission or there is very few retransmission. I am not familiar
> with netback of xen. Can you give me some suggestion? Or which part
> source code I need to check to find the reason of packets loss between
> eth0(veth0) and vif in dom0? Thanks.

The netback code lives in either drivers/xen/netback or
drivers/net/xen-netback depending on the kernel you are using. The
interesting code is generally split between netback.c and interface.c.

>From the point of view of the kernel it is just a normal network driver.
For packets going from dom0->domU you can look at the .ndo_start_xmit
callback registered with the kernel (xenvif_start_xmit in mainline,
something else in some other kernels) and trace from there to see how
and where they can be dropped.

For packets coming the other way (domU->dom0) you can either start from
the place which calls netif_rx_ni() and work backwards or start from the
interrupt handler, i.e. the function passed to
bind_interdomain_evtchn_to_irqhandler() and work forwards.

You might also find starting from the *_tx_action and *_rx_action
functions useful starting points for tracing what is going on..

Ian.

> 
> Regards,
> Cong
> 
> 2011/9/30 Ian Campbell <Ian.Campbell@eu.citrix.com>:
> > On Fri, 2011-09-30 at 15:44 +0100, David Xu wrote:
> >> Hi,
> >>
> >> 2011/9/29 Ian Campbell <Ian.Campbell@citrix.com>:
> >> > On Fri, 2011-09-30 at 05:18 +0100, David Xu wrote:
> >> >> Hi,
> >> >>
> >> >> Does anybody know whether the ring buffer between front end and back
> >> >> end will suffer from overflow? I just wonder if the ring buffer will
> >> >> be full and drop some packets when the Net I/O load is very heavy.
> >> >
> >> > In the case of networking whichever end is putting stuff on the ring
> >> > checks that there is enough room and will stop the queue when it cannot
> >> > transmit any more and restart when room becomes available.
> >>
> >> You mean even there is not enough room in ring buffer, xen will * not
> >> drop the packets * and just delay the transmission.
> >
> > It's not Xen but rather the kernel back and front ends which is involved
> > here. You can examine the hard_start_xmit functions in both netback and
> > netfront to determine for yourself whether or not packets can be dropped
> > and when.
> >
> >>  I used httperf to
> >> measure the performance of web server running in a VM (The workload in
> >> this VM is mixed, so it can not benefit from boost mechanism. The net
> >> i/o suffers from relatively high latency which depends on the number
> >> of VMs in the system). I found that with the increase of request rate
> >> in client side, the connection rate will drop and the connection time
> >> will increase dramatically. And the retransmission appears when the
> >> request rate is over than a quantum. So I doubted that the http/tcp
> >> connection suffer from the packets drop when the ring buffer is full
> >> because of high request rate.
> >>
> >> >
> >> >> BTW, If I want to change the size of i/o ring buffer, how should I do?
> >> >> I tried to reset the NET_TX_RING_SIZE and NET_RX_RING_SIZE in both
> >> >> front end and back end, but it seems doesn't work. Thanks.
> >> >
> >> > Currently the rings are limited to 1 page so if you want to increase the
> >> > size you would need to add multipage ring support to the network
> >> > protocol. There have been patches to do this for the blk protocol but I
> >> > do not recall any for the net protocol.
> >>
> >> Yes, increasing the size is relatively hard. So I just want reduce the
> >> size of ring buffer to make sure my doubt described above. I directly
> >> set  NET_TX_RING_SIZE and  NET_RX_RING_SIZE to 128, but it doesn't seem to work.
> >
> > You need to make sure both ends of the connection agree on the ring
> > size.
> >
> > I'm afraid this is not a very common thing to want to do so if you want
> > to persist with this approach I'm afraid you'll have to do some
> > debugging.
> >
> > Ian.
> >
> >
> >



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 09:13:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 09:13:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB7cJ-0003La-4i; Tue, 04 Oct 2011 09:13:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB7ba-000394-Pz
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 09:12:32 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1317744746!27857190!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21685 invoked from network); 4 Oct 2011 16:12:27 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 16:12:27 -0000
Received: by iaqq3 with SMTP id q3so309528iaq.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 09:12:26 -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=LsOw8dGDm2TmohaF4AxoTsZ3BfC3FtMqAGNN/45gU88=;
	b=mYaadeuKviba09tkh4o/C9EsP/BN6K0RA3TDTkjkQsjoVJsIH9SqEpufbcSQvgL9Cv
	D5jdVRzHfLCpl4mTUlBc3CIK/ngNPKn7oZ3H6mWWfM55Ne8xDm8XzvBo5iIT05YmUid1
	MQh8FVQQSdGqg2aFYkV1Qpd9bGIptsyUszNLY=
MIME-Version: 1.0
Received: by 10.231.73.139 with SMTP id q11mr2370138ibj.97.1317744745866; Tue,
	04 Oct 2011 09:12:25 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Tue, 4 Oct 2011 09:12:25 -0700 (PDT)
In-Reply-To: <b05ede64aaf5f5090fdb.1317653037@probook.site>
References: <patchbomb.1317653033@probook.site>
	<b05ede64aaf5f5090fdb.1317653037@probook.site>
Date: Tue, 4 Oct 2011 17:12:25 +0100
X-Google-Sender-Auth: B8SxCpFGnU_nCRIQPtLSND_dVow
Message-ID: <CAFLBxZZd9rBmRMNyO1qPRv6YtKvyQYpVrBCovpXHYFnCGZM-bw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 4 of 4] xenpaging: handle paged pages in
	p2m_pod_decrease_reservation
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Olaf Hering <olaf@aepfle.de>
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, Oct 3, 2011 at 3:43 PM, Olaf Hering <olaf@aepfle.de> wrote:
> # HG changeset patch
> # User Olaf Hering <olaf@aepfle.de>
> # Date 1317652812 -7200
> # Node ID b05ede64aaf5f5090fdb844c3a58f1f92d9b3588
> # Parent =A013872c432c3807e0f977d9c1311801179807ece2
> xenpaging: handle paged pages in p2m_pod_decrease_reservation
>
> As suggested by <hongkaixing@huawei.com>, handle paged pages in PoD code.
>
> Signed-off-by: Olaf Hering <olaf@aepfle.de>
>
> diff -r 13872c432c38 -r b05ede64aaf5 xen/arch/x86/mm/p2m-pod.c
> --- a/xen/arch/x86/mm/p2m-pod.c
> +++ b/xen/arch/x86/mm/p2m-pod.c
> @@ -567,6 +567,21 @@ p2m_pod_decrease_reservation(struct doma
> =A0 =A0 =A0 =A0 =A0 =A0 BUG_ON(p2m->pod.entry_count < 0);
> =A0 =A0 =A0 =A0 =A0 =A0 pod--;
> =A0 =A0 =A0 =A0 }
> + =A0 =A0 =A0 =A0else if ( steal_for_cache && p2m_is_paging(t) )
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0struct page_info *page;
> + =A0 =A0 =A0 =A0 =A0 =A0/* alloc a new page to compensate the pod list *=
/

This can't be right.  The whole point of the "populate on demand" was
to pre-allocate a fixed amount of memory, and not need to have to
allocate any more.  What happens if this allocation fails?

It seems like a better thing to do might be this:  If we get a request
to swap out a page, and we still have PoD entries present, we "swap
out" that page as a zero page.

Hmm -- this will take some careful thought...

> + =A0 =A0 =A0 =A0 =A0 =A0page =3D alloc_domheap_page(d, 0);
> + =A0 =A0 =A0 =A0 =A0 =A0if ( !page )
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto out_entry_check;
> + =A0 =A0 =A0 =A0 =A0 =A0set_p2m_entry(p2m, gpfn + i, _mfn(INVALID_MFN), =
0, p2m_invalid, p2m->default_access);
> + =A0 =A0 =A0 =A0 =A0 =A0p2m_mem_paging_drop_page(d, gpfn+i);
> + =A0 =A0 =A0 =A0 =A0 =A0p2m_pod_cache_add(p2m, page, 0);
> + =A0 =A0 =A0 =A0 =A0 =A0steal_for_cache =3D =A0( p2m->pod.entry_count > =
p2m->pod.count );
> + =A0 =A0 =A0 =A0 =A0 =A0nonpod--;
> + =A0 =A0 =A0 =A0 =A0 =A0ram--;
> + =A0 =A0 =A0 =A0}
> + =A0 =A0 =A0 =A0/* for other ram types */
> =A0 =A0 =A0 =A0 else if ( steal_for_cache && p2m_is_ram(t) )
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 struct page_info *page;
>
> _______________________________________________
> 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 Oct 04 09:19:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 09:19:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB7ik-0003no-Je; Tue, 04 Oct 2011 09:19:54 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB7i9-0003bC-II
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 09:19:19 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1317745142!49529605!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13822 invoked from network); 4 Oct 2011 16:19:04 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 16:19:04 -0000
Received: by iaqq3 with SMTP id q3so317652iaq.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 09:19:12 -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=vcXcSFJb4DSyFsZC4AGhfJj1tJDGeArl70MLmSiD3oc=;
	b=nYCjj1CBkVnCyO6UIAJLBbhHJZCe813KF+t5aSO6Lk9V3BvLoHHMmPwn+WFLxlFiYX
	+aa1s/BsDz0lRBOoVb78cmT59sFB6r/Ae5cJZOqKerW/ucn3hwT/epCE4mfhFNOurV6K
	FlXWUrrv9J9hV6qk4YXqAH6NvjXcB4hnOFQXc=
MIME-Version: 1.0
Received: by 10.231.73.139 with SMTP id q11mr2382126ibj.97.1317745152356; Tue,
	04 Oct 2011 09:19:12 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Tue, 4 Oct 2011 09:19:12 -0700 (PDT)
In-Reply-To: <ee4c4c7699e0de2b6bdd.1317657280@probook.site>
References: <patchbomb.1317657277@probook.site>
	<ee4c4c7699e0de2b6bdd.1317657280@probook.site>
Date: Tue, 4 Oct 2011 17:19:12 +0100
X-Google-Sender-Auth: mdAZcK7kkam21x_1am7jJdOaa5s
Message-ID: <CAFLBxZYdDmYCWSOoWc2FfiHSrh9ybnJwHNFCSTrqhDuXrNXk_w@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 03 of 24] xenpaging: use PERROR to print errno
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Olaf Hering <olaf@aepfle.de>
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, Oct 3, 2011 at 4:54 PM, Olaf Hering <olaf@aepfle.de> wrote:
> # HG changeset patch
> # User Olaf Hering <olaf@aepfle.de>
> # Date 1317653597 -7200
> # Node ID ee4c4c7699e0de2b6bddce1e816d35f36ffb0470
> # Parent =A021b7c9a6545ac1ec9d91fce83d46aab0b5808b05
> xenpaging: use PERROR to print errno
>
> Also catch lseek() errors in file_op().
>
> Signed-off-by: Olaf Hering <olaf@aepfle.de>
>
> diff -r 21b7c9a6545a -r ee4c4c7699e0 tools/xenpaging/file_ops.c
> --- a/tools/xenpaging/file_ops.c
> +++ b/tools/xenpaging/file_ops.c
> @@ -37,6 +37,11 @@ static int file_op(int fd, void *page, i
> =A0 =A0 int ret;
>
> =A0 =A0 seek_ret =3D lseek(fd, i << PAGE_SHIFT, SEEK_SET);
> + =A0 =A0if (seek_ret =3D=3D -1)
> + =A0 =A0{
> + =A0 =A0 =A0 =A0ret =3D -errno;
> + =A0 =A0 =A0 =A0goto err;
> + =A0 =A0}

Wouldn't it be more idiomatic to make both this check and the other
check in the function:
* check for seek_ret < 0 (rather than -1)
* make file_op() return -1
* Let the caller read errno?  (Rather than returning -errno)?


>
> =A0 =A0 total =3D 0;
> =A0 =A0 while ( total < PAGE_SIZE )
> diff -r 21b7c9a6545a -r ee4c4c7699e0 tools/xenpaging/xenpaging.c
> --- a/tools/xenpaging/xenpaging.c
> +++ b/tools/xenpaging/xenpaging.c
> @@ -90,7 +90,7 @@ static int xenpaging_wait_for_event_or_t
> =A0 =A0 =A0 =A0 if (errno =3D=3D EINTR)
> =A0 =A0 =A0 =A0 =A0 =A0 return 0;
>
> - =A0 =A0 =A0 =A0ERROR("Poll exited with an error");
> + =A0 =A0 =A0 =A0PERROR("Poll exited with an error");
> =A0 =A0 =A0 =A0 return -errno;
> =A0 =A0 }
>
> @@ -121,7 +121,7 @@ static int xenpaging_wait_for_event_or_t
> =A0 =A0 =A0 =A0 port =3D xc_evtchn_pending(xce);
> =A0 =A0 =A0 =A0 if ( port =3D=3D -1 )
> =A0 =A0 =A0 =A0 {
> - =A0 =A0 =A0 =A0 =A0 =A0ERROR("Failed to read port from event channel");
> + =A0 =A0 =A0 =A0 =A0 =A0PERROR("Failed to read port from event channel")=
;
> =A0 =A0 =A0 =A0 =A0 =A0 rc =3D -1;
> =A0 =A0 =A0 =A0 =A0 =A0 goto err;
> =A0 =A0 =A0 =A0 }
> @@ -129,7 +129,7 @@ static int xenpaging_wait_for_event_or_t
> =A0 =A0 =A0 =A0 rc =3D xc_evtchn_unmask(xce, port);
> =A0 =A0 =A0 =A0 if ( rc < 0 )
> =A0 =A0 =A0 =A0 {
> - =A0 =A0 =A0 =A0 =A0 =A0ERROR("Failed to unmask event channel port");
> + =A0 =A0 =A0 =A0 =A0 =A0PERROR("Failed to unmask event channel port");
> =A0 =A0 =A0 =A0 }
> =A0 =A0 }
> =A0err:
> @@ -185,7 +185,7 @@ static xenpaging_t *xenpaging_init(domid
> =A0 =A0 paging->xs_handle =3D xs_open(0);
> =A0 =A0 if ( paging->xs_handle =3D=3D NULL )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error initialising xenstore connection");
> + =A0 =A0 =A0 =A0PERROR("Error initialising xenstore connection");
> =A0 =A0 =A0 =A0 goto err;
> =A0 =A0 }
>
> @@ -193,7 +193,7 @@ static xenpaging_t *xenpaging_init(domid
> =A0 =A0 snprintf(watch_token, sizeof(watch_token), "%u", domain_id);
> =A0 =A0 if ( xs_watch(paging->xs_handle, "@releaseDomain", watch_token) =
=3D=3D false )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Could not bind to shutdown watch\n");
> + =A0 =A0 =A0 =A0PERROR("Could not bind to shutdown watch\n");
> =A0 =A0 =A0 =A0 goto err;
> =A0 =A0 }
>
> @@ -214,7 +214,7 @@ static xenpaging_t *xenpaging_init(domid
> =A0 =A0 paging->mem_event.shared_page =3D init_page();
> =A0 =A0 if ( paging->mem_event.shared_page =3D=3D NULL )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error initialising shared page");
> + =A0 =A0 =A0 =A0PERROR("Error initialising shared page");
> =A0 =A0 =A0 =A0 goto err;
> =A0 =A0 }
>
> @@ -222,7 +222,7 @@ static xenpaging_t *xenpaging_init(domid
> =A0 =A0 paging->mem_event.ring_page =3D init_page();
> =A0 =A0 if ( paging->mem_event.ring_page =3D=3D NULL )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error initialising ring page");
> + =A0 =A0 =A0 =A0PERROR("Error initialising ring page");
> =A0 =A0 =A0 =A0 goto err;
> =A0 =A0 }
>
> @@ -240,13 +240,13 @@ static xenpaging_t *xenpaging_init(domid
> =A0 =A0 {
> =A0 =A0 =A0 =A0 switch ( errno ) {
> =A0 =A0 =A0 =A0 =A0 =A0 case EBUSY:
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ERROR("xenpaging is (or was) active on t=
his domain");
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0PERROR("xenpaging is (or was) active on =
this domain");
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> =A0 =A0 =A0 =A0 =A0 =A0 case ENODEV:
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ERROR("EPT not supported for this guest"=
);
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0PERROR("EPT not supported for this guest=
");
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> =A0 =A0 =A0 =A0 =A0 =A0 default:
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ERROR("Error initialising shared page: %=
s", strerror(errno));
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0PERROR("Error initialising shared page: =
%s", strerror(errno));
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 break;
> =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0 goto err;
> @@ -256,7 +256,7 @@ static xenpaging_t *xenpaging_init(domid
> =A0 =A0 paging->mem_event.xce_handle =3D xc_evtchn_open(NULL, 0);
> =A0 =A0 if ( paging->mem_event.xce_handle =3D=3D NULL )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Failed to open event channel");
> + =A0 =A0 =A0 =A0PERROR("Failed to open event channel");
> =A0 =A0 =A0 =A0 goto err;
> =A0 =A0 }
>
> @@ -266,7 +266,7 @@ static xenpaging_t *xenpaging_init(domid
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 p=
aging->mem_event.shared_page->port);
> =A0 =A0 if ( rc < 0 )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Failed to bind event channel");
> + =A0 =A0 =A0 =A0PERROR("Failed to bind event channel");
> =A0 =A0 =A0 =A0 goto err;
> =A0 =A0 }
>
> @@ -276,7 +276,7 @@ static xenpaging_t *xenpaging_init(domid
> =A0 =A0 paging->domain_info =3D malloc(sizeof(xc_domaininfo_t));
> =A0 =A0 if ( paging->domain_info =3D=3D NULL )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error allocating memory for domain info");
> + =A0 =A0 =A0 =A0PERROR("Error allocating memory for domain info");
> =A0 =A0 =A0 =A0 goto err;
> =A0 =A0 }
>
> @@ -284,7 +284,7 @@ static xenpaging_t *xenpaging_init(domid
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0paging->do=
main_info);
> =A0 =A0 if ( rc !=3D 1 )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error getting domain info");
> + =A0 =A0 =A0 =A0PERROR("Error getting domain info");
> =A0 =A0 =A0 =A0 goto err;
> =A0 =A0 }
>
> @@ -292,7 +292,7 @@ static xenpaging_t *xenpaging_init(domid
> =A0 =A0 paging->bitmap =3D bitmap_alloc(paging->domain_info->max_pages);
> =A0 =A0 if ( !paging->bitmap )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error allocating bitmap");
> + =A0 =A0 =A0 =A0PERROR("Error allocating bitmap");
> =A0 =A0 =A0 =A0 goto err;
> =A0 =A0 }
> =A0 =A0 DPRINTF("max_pages =3D %"PRIx64"\n", paging->domain_info->max_pag=
es);
> @@ -308,7 +308,7 @@ static xenpaging_t *xenpaging_init(domid
> =A0 =A0 rc =3D policy_init(paging);
> =A0 =A0 if ( rc !=3D 0 )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error initialising policy");
> + =A0 =A0 =A0 =A0PERROR("Error initialising policy");
> =A0 =A0 =A0 =A0 goto err;
> =A0 =A0 }
>
> @@ -355,14 +355,14 @@ static int xenpaging_teardown(xenpaging_
> =A0 =A0 rc =3D xc_mem_paging_disable(xch, paging->mem_event.domain_id);
> =A0 =A0 if ( rc !=3D 0 )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error tearing down domain paging in xen");
> + =A0 =A0 =A0 =A0PERROR("Error tearing down domain paging in xen");
> =A0 =A0 }
>
> =A0 =A0 /* Unbind VIRQ */
> =A0 =A0 rc =3D xc_evtchn_unbind(paging->mem_event.xce_handle, paging->mem=
_event.port);
> =A0 =A0 if ( rc !=3D 0 )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error unbinding event port");
> + =A0 =A0 =A0 =A0PERROR("Error unbinding event port");
> =A0 =A0 }
> =A0 =A0 paging->mem_event.port =3D -1;
>
> @@ -370,7 +370,7 @@ static int xenpaging_teardown(xenpaging_
> =A0 =A0 rc =3D xc_evtchn_close(paging->mem_event.xce_handle);
> =A0 =A0 if ( rc !=3D 0 )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error closing event channel");
> + =A0 =A0 =A0 =A0PERROR("Error closing event channel");
> =A0 =A0 }
> =A0 =A0 paging->mem_event.xce_handle =3D NULL;
>
> @@ -381,7 +381,7 @@ static int xenpaging_teardown(xenpaging_
> =A0 =A0 rc =3D xc_interface_close(xch);
> =A0 =A0 if ( rc !=3D 0 )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error closing connection to xen");
> + =A0 =A0 =A0 =A0PERROR("Error closing connection to xen");
> =A0 =A0 }
>
> =A0 =A0 return 0;
> @@ -441,7 +441,7 @@ static int xenpaging_evict_page(xenpagin
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 PROT_READ=
 | PROT_WRITE, &gfn, 1);
> =A0 =A0 if ( page =3D=3D NULL )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error mapping page");
> + =A0 =A0 =A0 =A0PERROR("Error mapping page");
> =A0 =A0 =A0 =A0 goto out;
> =A0 =A0 }
>
> @@ -449,8 +449,8 @@ static int xenpaging_evict_page(xenpagin
> =A0 =A0 ret =3D write_page(fd, page, i);
> =A0 =A0 if ( ret !=3D 0 )
> =A0 =A0 {
> + =A0 =A0 =A0 =A0PERROR("Error copying page");
> =A0 =A0 =A0 =A0 munmap(page, PAGE_SIZE);
> - =A0 =A0 =A0 =A0ERROR("Error copying page");
> =A0 =A0 =A0 =A0 goto out;
> =A0 =A0 }
>
> @@ -464,7 +464,7 @@ static int xenpaging_evict_page(xenpagin
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 victim->gfn);
> =A0 =A0 if ( ret !=3D 0 )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error evicting page");
> + =A0 =A0 =A0 =A0PERROR("Error evicting page");
> =A0 =A0 =A0 =A0 goto out;
> =A0 =A0 }
>
> @@ -520,7 +520,7 @@ static int xenpaging_populate_page(xenpa
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 sleep(1);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 continue;
> =A0 =A0 =A0 =A0 =A0 =A0 }
> - =A0 =A0 =A0 =A0 =A0 =A0ERROR("Error preparing for page in");
> + =A0 =A0 =A0 =A0 =A0 =A0PERROR("Error preparing for page in");
> =A0 =A0 =A0 =A0 =A0 =A0 goto out_map;
> =A0 =A0 =A0 =A0 }
> =A0 =A0 }
> @@ -532,7 +532,7 @@ static int xenpaging_populate_page(xenpa
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 PROT_READ=
 | PROT_WRITE, &gfn, 1);
> =A0 =A0 if ( page =3D=3D NULL )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error mapping page: page is null");
> + =A0 =A0 =A0 =A0PERROR("Error mapping page: page is null");
> =A0 =A0 =A0 =A0 goto out_map;
> =A0 =A0 }
>
> @@ -540,7 +540,7 @@ static int xenpaging_populate_page(xenpa
> =A0 =A0 ret =3D read_page(fd, page, i);
> =A0 =A0 if ( ret !=3D 0 )
> =A0 =A0 {
> - =A0 =A0 =A0 =A0ERROR("Error reading page");
> + =A0 =A0 =A0 =A0PERROR("Error reading page");
> =A0 =A0 =A0 =A0 goto out;
> =A0 =A0 }
>
> @@ -579,7 +579,7 @@ static int evict_victim(xenpaging_t *pag
> =A0 =A0 =A0 =A0 {
> =A0 =A0 =A0 =A0 =A0 =A0 if ( j++ % 1000 =3D=3D 0 )
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ( xenpaging_mem_paging_flush_ioemu_cac=
he(paging) )
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ERROR("Error flushing ioemu cach=
e");
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0PERROR("Error flushing ioemu cac=
he");
> =A0 =A0 =A0 =A0 }
> =A0 =A0 }
> =A0 =A0 while ( ret );
> @@ -670,7 +670,7 @@ int main(int argc, char *argv[])
> =A0 =A0 =A0 =A0 rc =3D xenpaging_wait_for_event_or_timeout(paging);
> =A0 =A0 =A0 =A0 if ( rc < 0 )
> =A0 =A0 =A0 =A0 {
> - =A0 =A0 =A0 =A0 =A0 =A0ERROR("Error getting event");
> + =A0 =A0 =A0 =A0 =A0 =A0PERROR("Error getting event");
> =A0 =A0 =A0 =A0 =A0 =A0 goto out;
> =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0 else if ( rc !=3D 0 )
> @@ -710,7 +710,7 @@ int main(int argc, char *argv[])
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D xenpaging_populate_page(pa=
ging, req.gfn, fd, i);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ( rc !=3D 0 )
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ERROR("Error populating =
page");
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0PERROR("Error populating=
 page");
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto out;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
> @@ -723,7 +723,7 @@ int main(int argc, char *argv[])
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D xenpaging_resume_page(paging, &rsp=
, 1);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ( rc !=3D 0 )
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ERROR("Error resuming page");
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0PERROR("Error resuming page");
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto out;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 }
>
> @@ -752,7 +752,7 @@ int main(int argc, char *argv[])
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 rc =3D xenpaging_resume_page(pagi=
ng, &rsp, 0);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 if ( rc !=3D 0 )
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 {
> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ERROR("Error resuming");
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0PERROR("Error resuming")=
;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto out;
> =A0 =A0 =A0 =A0 =A0 =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
>

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 09:29:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 09:29:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB7sV-0004RT-K2; Tue, 04 Oct 2011 09:29:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB7rn-0004Eg-Ut
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 09:29:16 -0700
X-Env-Sender: eli@dev.mellanox.co.il
X-Msg-Ref: server-3.tower-182.messagelabs.com!1317745751!18105655!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25033 invoked from network); 4 Oct 2011 16:29:12 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-3.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 16:29:12 -0000
Received: by yxt3 with SMTP id 3so1350832yxt.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 09:29:11 -0700 (PDT)
Received: by 10.223.29.69 with SMTP id p5mr2006552fac.35.1317745751090;
	Tue, 04 Oct 2011 09:29:11 -0700 (PDT)
Received: from localhost ([82.166.227.17])
	by mx.google.com with ESMTPS id n12sm26020182fan.9.2011.10.04.09.29.08
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 04 Oct 2011 09:29:09 -0700 (PDT)
Date: Tue, 4 Oct 2011 18:29:06 +0200
From: Eli Cohen <eli@dev.mellanox.co.il>
To: xen-devel@lists.xensource.com
Message-ID: <20111004162906.GA2681@mtldesk30>
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 interrupts when using passthrough
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 debug a problem where a guest does not receive the
correct interrupt. It's a passtrough system where the guest is given a
virtual function and is using MSIX to recieve the interrupts. I am
trying to understand how is the guest supposed to recieve the
interrupt: Is it handled by dom0 which is using event channels to pass
the interrupt to domU, or is handled directly by domU. Please send
pointers to the code.

Thanks in advance,
eli;

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 09:31:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 09:31:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB7uD-0004sr-FR; Tue, 04 Oct 2011 09:31:45 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB7tY-0004fz-Pr
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 09:31:05 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1317745859!20894363!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32293 invoked from network); 4 Oct 2011 16:31:01 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-4.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 16:31:01 -0000
Received: from tazenda.hos.anvin.org ([IPv6:2001:470:861f::feed:face:f00d])
	(authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p94GU63T031893
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Tue, 4 Oct 2011 09:30:07 -0700
Message-ID: <4E8B3489.60902@zytor.com>
Date: Tue, 04 Oct 2011 09:30:01 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Jason Baron <jbaron@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com>
In-Reply-To: <20111004141011.GA2520@redhat.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/04/2011 07:10 AM, Jason Baron wrote:
> 
> 1) The jmp +0, is a 'safe' no-op that I know is going to initially
> boot for all x86. I'm not sure if there is a 5-byte nop that works on
> all x86 variants - but by using jmp +0, we make it much easier to debug
> cases where we may be using broken no-ops.
> 

There are *plenty*.  jmp+0 is about as pessimal as you can get.

The current recommendation when you don't know the CPU you're running at is:

	3E 8D 74 26 00	(GENERIC_NOP5_ATOMIC)

... on 32 bits and ...

	0F 1F 44 00 00	(P6_NOP5_ATOMIC)

... on 64 bits.

	-hpa


-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 09:35:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 09: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 1RB7xM-0005TA-0a; Tue, 04 Oct 2011 09:35:00 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB7wM-0005Fj-LA
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 09:34:00 -0700
X-Env-Sender: alex.williamson@redhat.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1317746034!19698870!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19970 invoked from network); 4 Oct 2011 16:33:55 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-6.tower-182.messagelabs.com with SMTP;
	4 Oct 2011 16:33: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 p94GXm9Z002738
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 4 Oct 2011 12:33:49 -0400
Received: from [10.3.113.131] (ovpn-113-131.phx2.redhat.com [10.3.113.131])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p94GXld9019424; Tue, 4 Oct 2011 12:33:47 -0400
Subject: Re: [Qemu-devel] [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
From: Alex Williamson <alex.williamson@redhat.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Tue, 04 Oct 2011 10:33:47 -0600
In-Reply-To: <alpine.DEB.2.00.1110041603080.3519@kaball-desktop>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<4E8B1F0D.4080203@redhat.com> <4E8B1FBC.2080904@codemonkey.ws>
	<alpine.DEB.2.00.1110041603080.3519@kaball-desktop>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit
Message-ID: <1317746028.2552.191.camel@bling.home>
Mime-Version: 1.0
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
Cc: Anthony Perard <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>, Avi Kivity <avi@redhat.com>,
	Anthony Liguori <anthony@codemonkey.ws>, 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 Tue, 2011-10-04 at 16:05 +0100, Stefano Stabellini wrote:
> On Tue, 4 Oct 2011, Anthony Liguori wrote:
> > On 10/04/2011 09:58 AM, Avi Kivity wrote:
> > > On 10/04/2011 04:51 PM, Anthony PERARD wrote:
> > >> Hi all,
> > >>
> > >> This patch series introduce the PCI passthrough for Xen.
> > >>
> > >> First, we have HostPCIDevice that help to access one PCI device of the host.
> > >>
> > >> Then, there are several additions in the QEMU code. One is qemu_run_one_timer
> > >> to run a specific timer. It is used by PCI passthrough to run a timer about
> > >> power management. Another is pci_check_bar_overlap.
> > >>
> > >> There are also several change in pci_ids and pci_regs.
> > >>
> > >> Last part, but not least, the PCI passthrough device himself. Cut in 3 parts
> > >> (or file), there is one to take care of the initialisation of a passthrough
> > >> device. The second one handle everything about the config address space, there
> > >> are specifics functions for every config register. The third one is to handle
> > >> MSI.
> > >>
> > >> I'm still working on setting a PCI passthrough device through QMP from libxl
> > >> (xen tool stack). It is just a call to device_add, with the driver parametter
> > >> hostaddr="0000:00:1b.0".
> > >>
> > >> There is some minor things missing:
> > >> - copyright header
> > >> - PCI IO space multiplexer
> > >>
> > >>
> > >
> > > We also have pci passthrough in qemu-kvm (I think based on the same Neocleus
> > > code). Rather than having two pci assignment implementations, I think we should
> > > have just one, with the differences (programming the hypervisor) abstracted at
> > > that level.
> > 
> > I agree in principle but how close is qemu-kvm pci passthrough to a mergable 
> > state?  Would it make sense to merge the Xen code first and then abstract it?
> 
> I think it should be fairly easy to abstract the current xen code: just
> a matter of providing memory, ioport and interrupt mapping functions.

I thought we were potentially looking at vfio as a convergence point.
I'm still a bit off from having a vfio re-write ready to submit, but is
this still a possibility?  Thanks,

Alex


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 09:51:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 09:51:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB8D8-0006Fn-KC; Tue, 04 Oct 2011 09:51:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB8CP-00063d-2D
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 09:50:34 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317747028!20209580!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29966 invoked from network); 4 Oct 2011 16:50:29 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 16:50:29 -0000
X-IronPort-AV: E=Sophos;i="4.68,486,1312171200"; d="scan'208";a="165671913"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 12:50:18 -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; Tue, 4 Oct 2011
	12:50:18 -0400
Message-ID: <4E8B3949.4090803@citrix.com>
Date: Tue, 4 Oct 2011 17:50:17 +0100
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: Eli Cohen <eli@dev.mellanox.co.il>
Subject: Re: [Xen-devel] Xen interrupts when using passthrough
References: <20111004162906.GA2681@mtldesk30>
In-Reply-To: <20111004162906.GA2681@mtldesk30>
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 04/10/11 17:29, Eli Cohen wrote:
> Hi,
> I am trying to debug a problem where a guest does not receive the
> correct interrupt. It's a passtrough system where the guest is given a
> virtual function and is using MSIX to recieve the interrupts.

Do you mean that it is receiving interrupts for another device, or are
you trying to pass through multiple interrupts for a device and the
interrupt is appearing in the wrong event channel?

Could you describe your hardware setup in detail please, especially
AMD/Intel, IOMMU features in use according to Xen, and the PCI topology
of the box.

>  I am
> trying to understand how is the guest supposed to recieve the
> interrupt: Is it handled by dom0 which is using event channels to pass
> the interrupt to domU, or is handled directly by domU. Please send
> pointers to the code.

(I am not very familiar with guest IRQs so the following might not be
accurate)

For a PCI passthrough system, the interrupts should be bound directly to
domU, with no dom0 interaction.  A PIRQ is bound to an event channel
using the EVTCHNOP_bind_pirq in common/event_channel.c, which should be
set up by qemu for the relevant domU, when it is interpreting the PCI
config space reads/writes.

> Thanks in advance,
> eli;
>
> _______________________________________________
> 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 Tue Oct 04 09:58:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 09: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 1RB8Jm-0007Nd-QZ; Tue, 04 Oct 2011 09:58:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB8Ig-00078s-Lm
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 09:57:03 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1317747419!33884614!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9452 invoked from network); 4 Oct 2011 16:56:59 -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 Oct 2011 16:56:59 -0000
X-IronPort-AV: E=Sophos;i="4.68,486,1312156800"; 
   d="scan'208";a="8207847"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 16:56:51 +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, 4 Oct 2011 17:56:51 +0100
Date: Tue, 4 Oct 2011 17:56:42 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Alex Williamson <alex.williamson@redhat.com>
Subject: Re: [Qemu-devel] [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
In-Reply-To: <1317746028.2552.191.camel@bling.home>
Message-ID: <alpine.DEB.2.00.1110041740580.3519@kaball-desktop>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<4E8B1F0D.4080203@redhat.com> <4E8B1FBC.2080904@codemonkey.ws>
	<alpine.DEB.2.00.1110041603080.3519@kaball-desktop>
	<1317746028.2552.191.camel@bling.home>
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>,
	QEMU-devel <qemu-devel@nongnu.org>, Avi Kivity <avi@redhat.com>,
	Anthony Liguori <anthony@codemonkey.ws>,
	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 Tue, 4 Oct 2011, Alex Williamson wrote:
> On Tue, 2011-10-04 at 16:05 +0100, Stefano Stabellini wrote:
> > On Tue, 4 Oct 2011, Anthony Liguori wrote:
> > > On 10/04/2011 09:58 AM, Avi Kivity wrote:
> > > > On 10/04/2011 04:51 PM, Anthony PERARD wrote:
> > > >> Hi all,
> > > >>
> > > >> This patch series introduce the PCI passthrough for Xen.
> > > >>
> > > >> First, we have HostPCIDevice that help to access one PCI device of the host.
> > > >>
> > > >> Then, there are several additions in the QEMU code. One is qemu_run_one_timer
> > > >> to run a specific timer. It is used by PCI passthrough to run a timer about
> > > >> power management. Another is pci_check_bar_overlap.
> > > >>
> > > >> There are also several change in pci_ids and pci_regs.
> > > >>
> > > >> Last part, but not least, the PCI passthrough device himself. Cut in 3 parts
> > > >> (or file), there is one to take care of the initialisation of a passthrough
> > > >> device. The second one handle everything about the config address space, there
> > > >> are specifics functions for every config register. The third one is to handle
> > > >> MSI.
> > > >>
> > > >> I'm still working on setting a PCI passthrough device through QMP from libxl
> > > >> (xen tool stack). It is just a call to device_add, with the driver parametter
> > > >> hostaddr="0000:00:1b.0".
> > > >>
> > > >> There is some minor things missing:
> > > >> - copyright header
> > > >> - PCI IO space multiplexer
> > > >>
> > > >>
> > > >
> > > > We also have pci passthrough in qemu-kvm (I think based on the same Neocleus
> > > > code). Rather than having two pci assignment implementations, I think we should
> > > > have just one, with the differences (programming the hypervisor) abstracted at
> > > > that level.
> > > 
> > > I agree in principle but how close is qemu-kvm pci passthrough to a mergable 
> > > state?  Would it make sense to merge the Xen code first and then abstract it?
> > 
> > I think it should be fairly easy to abstract the current xen code: just
> > a matter of providing memory, ioport and interrupt mapping functions.
> 
> I thought we were potentially looking at vfio as a convergence point.
> I'm still a bit off from having a vfio re-write ready to submit, but is
> this still a possibility?  Thanks,
 

As I said at KVM Forum 2011, I am OK with vfio: it is a nice thing to
have in the long term.
However having seen how much time it took to make this code work
reliably, I think is going to take some time before we have a stable
vfio implementation.
Considering that we have just introduced upstream qemu to xen-unstable,
I would like to reach feature parity with the old qemu-xen sooner rather
than later, so that we can kill the qemu-xen fork once and for all. In
order to reach feature parity we need PCI passthrough.  Once that is
done, we could gradually modify this code to introduce vfio support,
throwing away what is not necessary and keeping what can be reused.
If you are interested, we can easily make this code work for KVM too,
otherwise we can keep it Xen specific and wait for vfio to be ready.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 10:06:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 10:06:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB8RT-0007qB-DW; Tue, 04 Oct 2011 10:06:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB8NE-0007af-IR
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 10:02:02 -0700
X-Env-Sender: avi@redhat.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1317747699!27552386!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11936 invoked from network); 4 Oct 2011 17:01:40 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-15.tower-174.messagelabs.com with SMTP;
	4 Oct 2011 17:01:40 -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 p94H1Zak014011
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 4 Oct 2011 13:01:35 -0400
Received: from balrog.usersys.redhat.com (dhcp-1-24.tlv.redhat.com
	[10.35.1.24])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p94H1W19031962; Tue, 4 Oct 2011 13:01:33 -0400
Message-ID: <4E8B3BEC.10101@redhat.com>
Date: Tue, 04 Oct 2011 19:01:32 +0200
From: Avi Kivity <avi@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Alex Williamson <alex.williamson@redhat.com>
Subject: Re: [Qemu-devel] [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<4E8B1F0D.4080203@redhat.com> <4E8B1FBC.2080904@codemonkey.ws>
	<alpine.DEB.2.00.1110041603080.3519@kaball-desktop>
	<1317746028.2552.191.camel@bling.home>
In-Reply-To: <1317746028.2552.191.camel@bling.home>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
Cc: Anthony Perard <anthony.perard@citrix.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Anthony Liguori <anthony@codemonkey.ws>,
	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 10/04/2011 06:33 PM, Alex Williamson wrote:
> I thought we were potentially looking at vfio as a convergence point.
> I'm still a bit off from having a vfio re-write ready to submit, but is
> this still a possibility?  Thanks,
>

vfio leaves out users of current and past kernels; relying on it would 
force me to maintain qemu-kvm for a while.

-- 
error compiling committee.c: too many arguments to function


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 10:10:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 10:10:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB8Vk-0000TL-8K; Tue, 04 Oct 2011 10:10:32 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB8Pb-0007dH-Ic
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 10:04:23 -0700
X-Env-Sender: avi@redhat.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317747832!56670331!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2985 invoked from network); 4 Oct 2011 17:03:52 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-10.tower-21.messagelabs.com with SMTP;
	4 Oct 2011 17:03:52 -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 p94H42Cm014795
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 4 Oct 2011 13:04:02 -0400
Received: from balrog.usersys.redhat.com (dhcp-1-24.tlv.redhat.com
	[10.35.1.24])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p94H3xKM029280; Tue, 4 Oct 2011 13:04:00 -0400
Message-ID: <4E8B3C7F.4020300@redhat.com>
Date: Tue, 04 Oct 2011 19:03:59 +0200
From: Avi Kivity <avi@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Anthony Liguori <anthony@codemonkey.ws>
Subject: Re: [Qemu-devel] [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<4E8B1F0D.4080203@redhat.com> <4E8B1FBC.2080904@codemonkey.ws>
In-Reply-To: <4E8B1FBC.2080904@codemonkey.ws>
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 <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	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 10/04/2011 05:01 PM, Anthony Liguori wrote:
>> We also have pci passthrough in qemu-kvm (I think based on the same 
>> Neocleus
>> code). Rather than having two pci assignment implementations, I think 
>> we should
>> have just one, with the differences (programming the hypervisor) 
>> abstracted at
>> that level.
>
>
> I agree in principle but how close is qemu-kvm pci passthrough to a 
> mergable state?  Would it make sense to merge the Xen code first and 
> then abstract it?

Merging either implementation and abstracting it would risk regressions 
in the other.

How about merging both, with the ABIs (command line and qmp) tagged as 
experimental, and then doing a merge in the same style as 
i386+x86_64->x86 or the two kvm implementations in qemu?  We can pick 
one implementation as the merge target and port fixes from the other.

-- 
error compiling committee.c: too many arguments to function


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 10:20:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 10:20:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB8f8-00010s-FV; Tue, 04 Oct 2011 10:20:14 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB8ec-0000nk-Jh
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 10:19:43 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-15.tower-182.messagelabs.com!1317748778!19878822!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10577 invoked from network); 4 Oct 2011 17:19:39 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-15.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Oct 2011 17:19:39 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317748778; l=725;
	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=Ws1VKbyqIEwNJSpV7Sb/hB7QaUw=;
	b=ucbG9x17ujWmW3wh+k/2WldNgF25Jt1we1RGFRVbhplmKMnEAdqsHwajBD8rzIB9+zl
	Z2rFiKmlHw83Le0GtRlr0hd+5HaF408LaK8VKBGlDVVELkUNRNXAH8F/nvi2ywMQNqW/+
	qEl+7A9RJc2/8xdipfA0hE0efNYHnZ0w7nw=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQFip0
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-053.pools.arcor-ip.net [88.65.105.53])
	by smtp.strato.de (cohen mo35) (RZmta 26.9 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id a06562n94GYD8S ;
	Tue, 4 Oct 2011 19:19:31 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 25BA418B65; Tue,  4 Oct 2011 19:19:30 +0200 (CEST)
Date: Tue, 4 Oct 2011 19:19:30 +0200
From: Olaf Hering <olaf@aepfle.de>
To: George Dunlap <George.Dunlap@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 03 of 24] xenpaging: use PERROR to print errno
Message-ID: <20111004171929.GA15455@aepfle.de>
References: <patchbomb.1317657277@probook.site>
	<ee4c4c7699e0de2b6bdd.1317657280@probook.site>
	<CAFLBxZYdDmYCWSOoWc2FfiHSrh9ybnJwHNFCSTrqhDuXrNXk_w@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <CAFLBxZYdDmYCWSOoWc2FfiHSrh9ybnJwHNFCSTrqhDuXrNXk_w@mail.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, Oct 04, George Dunlap wrote:

> On Mon, Oct 3, 2011 at 4:54 PM, Olaf Hering <olaf@aepfle.de> wrote:

> > Â  Â  seek_ret = lseek(fd, i << PAGE_SHIFT, SEEK_SET);
> > + Â  Â if (seek_ret == -1)
> > + Â  Â {
> > + Â  Â  Â  Â ret = -errno;
> > + Â  Â  Â  Â goto err;
> > + Â  Â }
> 
> Wouldn't it be more idiomatic to make both this check and the other
> check in the function:
> * check for seek_ret < 0 (rather than -1)

The man page said its -1, now that I read it again it says (off_t)-1, so
my change above should be updated to comply with the man page.

> * make file_op() return -1
> * Let the caller read errno?  (Rather than returning -errno)?

Yes, I will change this in a new patch.

Olaf

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 10:21:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 10:21:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB8gi-0001OC-TP; Tue, 04 Oct 2011 10:21:52 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB8g7-0001CC-RJ
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 10:21:16 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317748872!33905837!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 888 invoked from network); 4 Oct 2011 17:21:12 -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;
	4 Oct 2011 17:21:12 -0000
X-IronPort-AV: E=Sophos;i="4.68,486,1312156800"; 
   d="scan'208";a="8208246"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 17:21: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; Tue, 4 Oct 2011 18:21:12 +0100
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 1RB8g3-0006fE-Sv;
	Tue, 04 Oct 2011 17:21:11 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RB8g3-0001U5-SH;
	Tue, 04 Oct 2011 18:21:11 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9187-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 4 Oct 2011 18:21:11 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9187: 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 9187 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9187/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     12 guest-saverestore.2        fail REGR. vs. 9186

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                  0b66e6450ffe
baseline version:
 xen                  3d1664cc9e45

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
------------------------------------------------------------

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:   23903:0b66e6450ffe
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Oct 04 14:18:30 2011 +0200
    
    use xzalloc in x86 code
    
    This includes the removal of a redundant memset() from microcode_amd.c.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23902:4dc9c522abf5
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Oct 04 14:17:28 2011 +0200
    
    use xzalloc in driver code
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23901:a42af55d50fb
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Oct 04 14:16:32 2011 +0200
    
    use xzalloc in common code
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23900:e09ebf7a31f5
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Oct 04 14:15:26 2011 +0200
    
    introduce xzalloc() & Co
    
    Rather than having to match a call to one of the xmalloc() flavors with
    a subsequent memset(), introduce a zeroing variant of each of those
    flavors.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23899:a99d75671a91
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Oct 04 14:11:56 2011 +0200
    
    AMD-IOMMU: remove dead variable references
    
    These got orphaned up by recent changes.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23898:3d1664cc9e45
user:        Keir Fraser <keir@xen.org>
date:        Fri Sep 30 21:17:47 2011 +0100
    
    build: fix grep invocation in cc-options
    
    Currently the build produces lots of
            Usage: grep [OPTION]... PATTERN [FILE]...
            Try `grep --help' for more information.
    
    This is due to the "grep -- $(2)" in cc-options. It seems that the
    default of reading stdin is disabled when using "--". I don't know if
    this is a bug in grep or how it is supposed to be but we can work
    around it by explicitly passing in "-"
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
========================================
commit cd776ee9408ff127f934a707c1a339ee600bc127
Author: Ian Jackson <ian.jackson@eu.citrix.com>
Date:   Tue Jun 28 13:50:53 2011 +0100

    qemu-char.c: fix incorrect CONFIG_STUBDOM handling
    
    qemu-char.c:1123:7: warning: "CONFIG_STUBDOM" is not defined [-Wundef]
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-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 Tue Oct 04 10:23:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 10:23:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB8iY-0001rK-LQ; Tue, 04 Oct 2011 10:23:46 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB8gc-0001LO-23
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 10:21:46 -0700
X-Env-Sender: jan.kiszka@web.de
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317748902!27850528!1
X-Originating-IP: [217.72.192.234]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18243 invoked from network); 4 Oct 2011 17:21:42 -0000
Received: from fmmailgate03.web.de (HELO fmmailgate03.web.de) (217.72.192.234)
	by server-3.tower-174.messagelabs.com with SMTP;
	4 Oct 2011 17:21:42 -0000
Received: from smtp03.web.de  ( [172.20.0.65])
	by fmmailgate03.web.de (Postfix) with ESMTP id 9A35C19DF2A29;
	Tue,  4 Oct 2011 19:21:42 +0200 (CEST)
Received: from [88.65.45.85] (helo=mchn199C.mchp.siemens.de)
	by smtp03.web.de with asmtp (TLSv1:AES256-SHA:256) (WEB.DE 4.110 #2)
	id 1RB8gY-0002K1-00; Tue, 04 Oct 2011 19:21:42 +0200
Message-ID: <4E8B40A5.2070501@web.de>
Date: Tue, 04 Oct 2011 19:21:41 +0200
From: Jan Kiszka <jan.kiszka@web.de>
User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de;
	rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12
	Mnenhy/0.7.5.666
MIME-Version: 1.0
To: Anthony Liguori <anthony@codemonkey.ws>
Subject: Re: [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<4E8B1F0D.4080203@redhat.com> <4E8B1FBC.2080904@codemonkey.ws>
In-Reply-To: <4E8B1FBC.2080904@codemonkey.ws>
X-Enigmail-Version: 1.3.2
X-Sender: jan.kiszka@web.de
X-Provags-ID: V01U2FsdGVkX19OJaRjuwato5dFNuEQHvKjBkpfkE6qjQ78CQFR
	NHIvdrJ0mvNljRO5qMVfb4dBnPDrMoTQNwUO4FaniI+YgS6dhP fwT5GWuHU=
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Alex Williamson <alex.williamson@redhat.com>, Avi Kivity <avi@redhat.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>
Content-Type: multipart/mixed; boundary="===============0198434097=="
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)
--===============0198434097==
Content-Type: multipart/signed; micalg=pgp-sha1;
	protocol="application/pgp-signature";
	boundary="------------enig76FDF5C09CE51A5D83B563C1"

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enig76FDF5C09CE51A5D83B563C1
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

On 2011-10-04 17:01, Anthony Liguori wrote:
> On 10/04/2011 09:58 AM, Avi Kivity wrote:
>> On 10/04/2011 04:51 PM, Anthony PERARD wrote:
>>> Hi all,
>>>
>>> This patch series introduce the PCI passthrough for Xen.
>>>
>>> First, we have HostPCIDevice that help to access one PCI device of
>>> the host.
>>>
>>> Then, there are several additions in the QEMU code. One is
>>> qemu_run_one_timer
>>> to run a specific timer. It is used by PCI passthrough to run a timer=

>>> about
>>> power management. Another is pci_check_bar_overlap.
>>>
>>> There are also several change in pci_ids and pci_regs.
>>>
>>> Last part, but not least, the PCI passthrough device himself. Cut in
>>> 3 parts
>>> (or file), there is one to take care of the initialisation of a
>>> passthrough
>>> device. The second one handle everything about the config address
>>> space, there
>>> are specifics functions for every config register. The third one is
>>> to handle
>>> MSI.
>>>
>>> I'm still working on setting a PCI passthrough device through QMP
>>> from libxl
>>> (xen tool stack). It is just a call to device_add, with the driver
>>> parametter
>>> hostaddr=3D"0000:00:1b.0".
>>>
>>> There is some minor things missing:
>>> - copyright header
>>> - PCI IO space multiplexer
>>>
>>>
>>
>> We also have pci passthrough in qemu-kvm (I think based on the same
>> Neocleus
>> code). Rather than having two pci assignment implementations, I think
>> we should
>> have just one, with the differences (programming the hypervisor)
>> abstracted at
>> that level.
>=20
> I agree in principle but how close is qemu-kvm pci passthrough to a
> mergable state?  Would it make sense to merge the Xen code first and
> then abstract it?

What is missing to get qemu-kvm device assignment ready:
 - MSI/MSI-X refactoring in QEMU (specifically config notifiers, also
   relevant for virtio)
 - switch device assignment to generic MSI/MSI-X
 - get in-kernel irqchip support upstream
 - minor code cleanups

I was hoping to complete this for 1.0, but it looks unrealistic now.
Maybe I'll find the time for the MSI stuff at least.

=46rom a first glance at these patches, I think there are already some
synergies in the host-pci access layer. And I bet the Xen bits could
also make use of our MSI/MSI-X code once it's generalized. But that will
be a bit work for them (based on my experience with qemu-kvm).

Jan


--------------enig76FDF5C09CE51A5D83B563C1
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.16 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6LQKUACgkQitSsb3rl5xQ/hQCgxXVaWIeldXKc2stmhEJmPf1/
BtEAnApi/BX31131ieV22/ONSVBXg+9q
=XnIm
-----END PGP SIGNATURE-----

--------------enig76FDF5C09CE51A5D83B563C1--


--===============0198434097==
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

--===============0198434097==--


From xen-devel-bounces@lists.xensource.com Tue Oct 04 10:28:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 10:28:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB8nC-0002Ic-Ez; Tue, 04 Oct 2011 10:28:34 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB8mT-00025m-IZ
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 10:27:50 -0700
X-Env-Sender: jan.kiszka@web.de
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317749245!40818119!1
X-Originating-IP: [217.72.192.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21439 invoked from network); 4 Oct 2011 17:27:25 -0000
Received: from fmmailgate01.web.de (HELO fmmailgate01.web.de) (217.72.192.221)
	by server-6.tower-21.messagelabs.com with SMTP;
	4 Oct 2011 17:27:25 -0000
Received: from smtp07.web.de  ( [172.20.5.215])
	by fmmailgate01.web.de (Postfix) with ESMTP id BD393199CFD9E;
	Tue,  4 Oct 2011 19:27:31 +0200 (CEST)
Received: from [88.65.45.85] (helo=mchn199C.mchp.siemens.de)
	by smtp07.web.de with asmtp (TLSv1:AES256-SHA:256) (WEB.DE 4.110 #2)
	id 1RB8mB-0005Ig-00; Tue, 04 Oct 2011 19:27:31 +0200
Message-ID: <4E8B4203.8040207@web.de>
Date: Tue, 04 Oct 2011 19:27:31 +0200
From: Jan Kiszka <jan.kiszka@web.de>
User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de;
	rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12
	Mnenhy/0.7.5.666
MIME-Version: 1.0
To: Anthony PERARD <anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<1317739882-4809-3-git-send-email-anthony.perard@citrix.com>
In-Reply-To: <1317739882-4809-3-git-send-email-anthony.perard@citrix.com>
X-Enigmail-Version: 1.3.2
X-Sender: jan.kiszka@web.de
X-Provags-ID: V01U2FsdGVkX19/LTDNvnHB5QSp/g+8ic+9kSOY2f/oAVjgQGR7
	uIihotkh0QVNeE6zyNztCxtiZnrsYKNA8ptZPLF2Vblo1v3e8o WYnemhqJs=
Cc: Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH RFC V1 02/11] qemu-timer: Introduce
	qemu_run_one_timer
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============1521759472=="
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)
--===============1521759472==
Content-Type: multipart/signed; micalg=pgp-sha1;
	protocol="application/pgp-signature";
	boundary="------------enig41F18BA10AEDDB315626B8FD"

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enig41F18BA10AEDDB315626B8FD
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: quoted-printable

On 2011-10-04 16:51, Anthony PERARD wrote:
> Used by the Xen PCI Passthrough code to run the timer about the power
> state transition.
>=20
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  qemu-timer.c |   15 +++++++++++++++
>  qemu-timer.h |    3 +++
>  2 files changed, 18 insertions(+), 0 deletions(-)
>=20
> diff --git a/qemu-timer.c b/qemu-timer.c
> index 46dd483..15e659b 100644
> --- a/qemu-timer.c
> +++ b/qemu-timer.c
> @@ -1163,3 +1163,18 @@ int qemu_calculate_timeout(void)
>      return 1000;
>  }
> =20
> +/* run the specified timer */
> +void qemu_run_one_timer(QEMUTimer *ts)
> +{
> +    uint64_t current_time;
> +
> +    /* remove timer from the list before calling the callback */
> +    qemu_del_timer(ts);
> +
> +    while ((current_time =3D qemu_get_clock_ms(rt_clock)) < ts->expire=
_time)
> +        /* sleep until the expire time */
> +        usleep((ts->expire_time - current_time) * 1000);
> +
> +    /* run the callback */
> +    ts->cb(ts->opaque);
> +}

This looks funny. I can't imagine that this could ever fit into the
standard (asynchronous) QEMU execution model for I/O. Keep it private to
Xen?

Jan


--------------enig41F18BA10AEDDB315626B8FD
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.16 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6LQgMACgkQitSsb3rl5xQHdgCeJDzINaF6x3j72pUtgFZ5Qp0n
ltoAnA82lDcMdOoK70Ixb0OyPMSwyqmF
=x+Jm
-----END PGP SIGNATURE-----

--------------enig41F18BA10AEDDB315626B8FD--


--===============1521759472==
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

--===============1521759472==--


From xen-devel-bounces@lists.xensource.com Tue Oct 04 10:32:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 10:32:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB8rC-0002lz-By; Tue, 04 Oct 2011 10:32:42 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB8qX-0002ZH-DH
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 10:32:02 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1317749517!18113463!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9603 invoked from network); 4 Oct 2011 17:31:58 -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;
	4 Oct 2011 17:31:58 -0000
X-IronPort-AV: E=Sophos;i="4.68,486,1312156800"; 
   d="scan'208";a="8208445"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 17:31:53 +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, 4 Oct 2011
	18:31:53 +0100
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau Monne <roger.pau@entel.upc.edu>
In-Reply-To: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
References: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Tue, 4 Oct 2011 18:31:51 +0100
Message-ID: <1317749511.24742.2.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "Charlie Root \(none\)" <root@loki.>,
	"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-10-04 at 15:13 +0100, Roger Pau Monne wrote:
> From: Charlie Root <root@loki.(none)>

Really?

> 
> 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>
> ---
>  hw/xen_machine_pv.c |    2 +-
>  xen-config-host.h   |    2 +-
>  xen-hooks.mak       |    2 ++
>  3 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/xen_machine_pv.c b/hw/xen_machine_pv.c
> index 0004904..c09adbb 100644
> --- a/hw/xen_machine_pv.c
> +++ b/hw/xen_machine_pv.c
> @@ -47,7 +47,7 @@ static void xen_init_pv(ram_addr_t ram_size, int vga_ram_size,
>      CPUState *env;
>      uint32_t domid_target;
>  
> -#ifndef CONFIG_STUBDOM
> +#if !defined(CONFIG_STUBDOM) && !defined(__NetBSD__)
>      /* Initialize tapdisk client */
>      init_blktap();
>  #endif
> diff --git a/xen-config-host.h b/xen-config-host.h
> index f50c3aa..818f25d 100644
> --- a/xen-config-host.h
> +++ b/xen-config-host.h
> @@ -18,7 +18,7 @@ extern int domid, domid_backend;
>  
>  #include "xenctrl.h"
>  #include "xs.h"
> -#ifndef CONFIG_STUBDOM
> +#if !defined(CONFIG_STUBDOM) && !defined(__NetBSD__)
>  #include "blktaplib.h"
>  #endif
>  
> diff --git a/xen-hooks.mak b/xen-hooks.mak
> index 253915d..b55f45b 100644
> --- a/xen-hooks.mak
> +++ b/xen-hooks.mak
> @@ -46,11 +46,13 @@ CONFIG_SDL=
>  CONFIG_AUDIO=
>  OBJS += xenfbfront.o
>  else
> +ifndef CONFIG_NetBSD
>  CPPFLAGS+= -I$(XEN_ROOT)/tools/blktap/lib
>  LIBS += -L$(XEN_ROOT)/tools/blktap/lib -lblktap
>  OBJS += xen_blktap.o
>  OBJS += tpm_tis.o
>  endif
> +endif
>  
>  ifdef CONFIG_STUBDOM
>  CONFIG_PASSTHROUGH=1



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 10:42:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 10:42:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB90V-0003It-EU; Tue, 04 Oct 2011 10:42:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB8zi-00035a-5e
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 10:41:30 -0700
X-Env-Sender: jan.kiszka@web.de
X-Msg-Ref: server-14.tower-21.messagelabs.com!1317750077!62143345!1
X-Originating-IP: [217.72.192.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12321 invoked from network); 4 Oct 2011 17:41:17 -0000
Received: from fmmailgate01.web.de (HELO fmmailgate01.web.de) (217.72.192.221)
	by server-14.tower-21.messagelabs.com with SMTP;
	4 Oct 2011 17:41:17 -0000
Received: from smtp01.web.de  ( [172.20.0.243])
	by fmmailgate01.web.de (Postfix) with ESMTP id 9AD5F199D0773;
	Tue,  4 Oct 2011 19:41:26 +0200 (CEST)
Received: from [88.65.45.85] (helo=mchn199C.mchp.siemens.de)
	by smtp01.web.de with asmtp (TLSv1:AES256-SHA:256) (WEB.DE 4.110 #2)
	id 1RB8ze-000140-00; Tue, 04 Oct 2011 19:41:26 +0200
Message-ID: <4E8B4545.3030804@web.de>
Date: Tue, 04 Oct 2011 19:41:25 +0200
From: Jan Kiszka <jan.kiszka@web.de>
User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de;
	rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12
	Mnenhy/0.7.5.666
MIME-Version: 1.0
To: Avi Kivity <avi@redhat.com>
Subject: Re: [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<4E8B1F0D.4080203@redhat.com> <4E8B1FBC.2080904@codemonkey.ws>
	<alpine.DEB.2.00.1110041603080.3519@kaball-desktop>
	<1317746028.2552.191.camel@bling.home> <4E8B3BEC.10101@redhat.com>
In-Reply-To: <4E8B3BEC.10101@redhat.com>
X-Enigmail-Version: 1.3.2
X-Sender: jan.kiszka@web.de
X-Provags-ID: V01U2FsdGVkX1+a+YiMlzDT15VtqmcIBli9l6tIrJNWLtevqZcG
	VlX+0uqqgpdnaYEEhdmp7uauFkRkIXhotUbaJNQudbUf5xLxkB Z9853nc6o=
Cc: Anthony Perard <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	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>
Content-Type: multipart/mixed; boundary="===============0393785872=="
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)
--===============0393785872==
Content-Type: multipart/signed; micalg=pgp-sha1;
	protocol="application/pgp-signature";
	boundary="------------enig11747838D70809CED481B851"

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enig11747838D70809CED481B851
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

On 2011-10-04 19:01, Avi Kivity wrote:
> On 10/04/2011 06:33 PM, Alex Williamson wrote:
>> I thought we were potentially looking at vfio as a convergence point.
>> I'm still a bit off from having a vfio re-write ready to submit, but i=
s
>> this still a possibility?  Thanks,
>>
>=20
> vfio leaves out users of current and past kernels; relying on it would
> force me to maintain qemu-kvm for a while.

VFIO is a great thing, and we all want it. But it's also a big project
now as it has to please more and more use cases. I think it will require
some more time to settle its interfaces, and it should likely take this
time. So we need KVM device assignment upstream as well until comparable
VFIO support is in every recent distro kernel out there.

Jan


--------------enig11747838D70809CED481B851
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.16 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6LRUUACgkQitSsb3rl5xQeXQCdF4X1oiWQBclwBZXswPRx1f/S
pdYAn0WHRf0mpMxG0bJHeajEQNWDEjRi
=41lI
-----END PGP SIGNATURE-----

--------------enig11747838D70809CED481B851--


--===============0393785872==
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

--===============0393785872==--


From xen-devel-bounces@lists.xensource.com Tue Oct 04 10:53:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 10:53:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB9BB-0003xD-0k; Tue, 04 Oct 2011 10:53:21 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB9AZ-0003kx-Vr
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 10:52:47 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1317750750!49541738!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9912 invoked from network); 4 Oct 2011 17:52:30 -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;
	4 Oct 2011 17:52:30 -0000
X-IronPort-AV: E=Sophos;i="4.68,486,1312156800"; 
   d="scan'208";a="8208923"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 17:52:40 +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, 4 Oct 2011 18:52:40 +0100
Date: Tue, 4 Oct 2011 18:52:33 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Jan Kiszka <jan.kiszka@web.de>
In-Reply-To: <4E8B4203.8040207@web.de>
Message-ID: <alpine.DEB.2.00.1110041848170.3519@kaball-desktop>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<1317739882-4809-3-git-send-email-anthony.perard@citrix.com>
	<4E8B4203.8040207@web.de>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>, Xen,
	QEMU-devel <qemu-devel@nongnu.org>,
	Alex Williamson <alex.williamson@redhat.com>,
	Anthony Perard <anthony.perard@citrix.com>
Subject: [Xen-devel] Re: [PATCH RFC V1 02/11] qemu-timer: Introduce
	qemu_run_one_timer
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 4 Oct 2011, Jan Kiszka wrote:
> On 2011-10-04 16:51, Anthony PERARD wrote:
> > Used by the Xen PCI Passthrough code to run the timer about the power
> > state transition.
> > 
> > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> > ---
> >  qemu-timer.c |   15 +++++++++++++++
> >  qemu-timer.h |    3 +++
> >  2 files changed, 18 insertions(+), 0 deletions(-)
> > 
> > diff --git a/qemu-timer.c b/qemu-timer.c
> > index 46dd483..15e659b 100644
> > --- a/qemu-timer.c
> > +++ b/qemu-timer.c
> > @@ -1163,3 +1163,18 @@ int qemu_calculate_timeout(void)
> >      return 1000;
> >  }
> >  
> > +/* run the specified timer */
> > +void qemu_run_one_timer(QEMUTimer *ts)
> > +{
> > +    uint64_t current_time;
> > +
> > +    /* remove timer from the list before calling the callback */
> > +    qemu_del_timer(ts);
> > +
> > +    while ((current_time = qemu_get_clock_ms(rt_clock)) < ts->expire_time)
> > +        /* sleep until the expire time */
> > +        usleep((ts->expire_time - current_time) * 1000);
> > +
> > +    /* run the callback */
> > +    ts->cb(ts->opaque);
> > +}
> 
> This looks funny. I can't imagine that this could ever fit into the
> standard (asynchronous) QEMU execution model for I/O. Keep it private to
> Xen?

I haven't finished reading the series yet, but this caught my eye
because it is particularly ugly; we should get rid of it.

Considering that on a real device if you try to write to the PCI config
space before a power transition is completed the write just fails, maybe
we should do the same here and remove the timer.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 11:08:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 11:08:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB9Pn-0005Jn-Pu; Tue, 04 Oct 2011 11:08:28 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB9NO-0004jq-0G
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 11:06:11 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-14.tower-21.messagelabs.com!1317751545!62146542!1
X-Originating-IP: [71.74.56.125]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6007 invoked from network); 4 Oct 2011 18:05:45 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.125) by server-14.tower-21.messagelabs.com with SMTP;
	4 Oct 2011 18:05:45 -0000
X-Authority-Analysis: v=1.1 cv=cSzO76bR5tCkfUT9bEmBgR3d7VUusRLeq08eKGxa4EU=
	c=1 sm=0 a=msyzJTVhAHgA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=3Hg23OBV5lzhnHel5ewA:9
	a=PUjeQqilurYA:10 a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:47076] helo=[192.168.23.10])
	by hrndva-oedge04.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id B6/0D-05514-FFA4B8E4; Tue, 04 Oct 2011 18:05:53 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jason Baron <jbaron@redhat.com>
Date: Tue, 04 Oct 2011 14:05:51 -0400
In-Reply-To: <20111004175312.GC2520@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<20111004175312.GC2520@redhat.com>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317751553.18063.12.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: Linux, Jan, Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Glauber <jang@linux.vnet.ibm.com>,
	Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-04 at 13:53 -0400, Jason Baron wrote:
> On Tue, Oct 04, 2011 at 09:30:01AM -0700, H. Peter Anvin wrote:
> > On 10/04/2011 07:10 AM, Jason Baron wrote:
> > > 
> > > 1) The jmp +0, is a 'safe' no-op that I know is going to initially
> > > boot for all x86. I'm not sure if there is a 5-byte nop that works on
> > > all x86 variants - but by using jmp +0, we make it much easier to debug
> > > cases where we may be using broken no-ops.
> > > 
> > 
> > There are *plenty*.  jmp+0 is about as pessimal as you can get.
> > 
> > The current recommendation when you don't know the CPU you're running at is:
> > 
> > 	3E 8D 74 26 00	(GENERIC_NOP5_ATOMIC)
> > 
> > ... on 32 bits and ...
> > 
> > 	0F 1F 44 00 00	(P6_NOP5_ATOMIC)
> > 
> > ... on 64 bits.
> > 
> > 	-hpa
> > 
> 
> We're currently patching the code at run-time (boot and module load
> time), with the 'ideal' no-op anyway, so the initial no-op doesn't
> really matter much (other than to save patching if the initial and ideal
> match).

Out of correctness, we should still update this to use the proper
"default" nops, as mcount already does.

-- Steve



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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 11:20:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 11:20:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB9bR-0005uw-7n; Tue, 04 Oct 2011 11:20:30 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB9aX-0005ia-51
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 11:19:34 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1317752350!47253632!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12008 invoked from network); 4 Oct 2011 18:19:11 -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;
	4 Oct 2011 18:19:11 -0000
X-IronPort-AV: E=Sophos;i="4.68,486,1312156800"; 
   d="scan'208";a="8209396"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 18:19:30 +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, 4 Oct 2011 19:19:30 +0100
Date: Tue, 4 Oct 2011 19:19:22 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Avi Kivity <avi@redhat.com>
Subject: Re: [Qemu-devel] [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
In-Reply-To: <4E8B3C7F.4020300@redhat.com>
Message-ID: <alpine.DEB.2.00.1110041853390.3519@kaball-desktop>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<4E8B1F0D.4080203@redhat.com> <4E8B1FBC.2080904@codemonkey.ws>
	<4E8B3C7F.4020300@redhat.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>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Alex Williamson <alex.williamson@redhat.com>,
	Anthony Liguori <anthony@codemonkey.ws>,
	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 Tue, 4 Oct 2011, Avi Kivity wrote:
> On 10/04/2011 05:01 PM, Anthony Liguori wrote:
> >> We also have pci passthrough in qemu-kvm (I think based on the same 
> >> Neocleus
> >> code). Rather than having two pci assignment implementations, I think 
> >> we should
> >> have just one, with the differences (programming the hypervisor) 
> >> abstracted at
> >> that level.
> >
> >
> > I agree in principle but how close is qemu-kvm pci passthrough to a 
> > mergable state?  Would it make sense to merge the Xen code first and 
> > then abstract it?
> 
> Merging either implementation and abstracting it would risk regressions 
> in the other.

Honestly the last time I looked at the kvm passthrough code (admittedly
a while ago), it looked very similar to the xen passthrough code, so I
don't think we would risk much merging either one first and then
abstracting it.


> How about merging both, with the ABIs (command line and qmp) tagged as 
> experimental, and then doing a merge in the same style as 
> i386+x86_64->x86 or the two kvm implementations in qemu?  We can pick 
> one implementation as the merge target and port fixes from the other.

I am OK with this too: it is probably more work but it doesn't risk
loosing any bug fixes.
If you think that kvm passthrough might have several bug fixes that xen
passthrough does not have is probably the right way to go.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 11:22:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 11:22:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB9dV-0006Ow-EK; Tue, 04 Oct 2011 11:22:37 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB9bu-0005yt-IX
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 11:20:59 -0700
X-Env-Sender: anthony@codemonkey.ws
X-Msg-Ref: server-11.tower-174.messagelabs.com!1317752454!33894964!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5839 invoked from network); 4 Oct 2011 18:20:55 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 18:20:55 -0000
Received: by yxt3 with SMTP id 3so1491305yxt.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 11:20:54 -0700 (PDT)
Received: by 10.42.133.65 with SMTP id g1mr2398842ict.8.1317752453928;
	Tue, 04 Oct 2011 11:20:53 -0700 (PDT)
Received: from [9.53.41.164] ([32.97.110.59])
	by mx.google.com with ESMTPS id fy35sm38365927ibb.4.2011.10.04.11.20.51
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 04 Oct 2011 11:20:52 -0700 (PDT)
Message-ID: <4E8B4E82.1000009@codemonkey.ws>
Date: Tue, 04 Oct 2011 13:20:50 -0500
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: Jan Kiszka <jan.kiszka@web.de>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>	<1317739882-4809-3-git-send-email-anthony.perard@citrix.com>
	<4E8B4203.8040207@web.de>
In-Reply-To: <4E8B4203.8040207@web.de>
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	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 RFC V1 02/11] qemu-timer:
	Introduce qemu_run_one_timer
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/04/2011 12:27 PM, Jan Kiszka wrote:
> On 2011-10-04 16:51, Anthony PERARD wrote:
>> Used by the Xen PCI Passthrough code to run the timer about the power
>> state transition.
>>
>> Signed-off-by: Anthony PERARD<anthony.perard@citrix.com>
>> ---
>>   qemu-timer.c |   15 +++++++++++++++
>>   qemu-timer.h |    3 +++
>>   2 files changed, 18 insertions(+), 0 deletions(-)
>>
>> diff --git a/qemu-timer.c b/qemu-timer.c
>> index 46dd483..15e659b 100644
>> --- a/qemu-timer.c
>> +++ b/qemu-timer.c
>> @@ -1163,3 +1163,18 @@ int qemu_calculate_timeout(void)
>>       return 1000;
>>   }
>>
>> +/* run the specified timer */
>> +void qemu_run_one_timer(QEMUTimer *ts)
>> +{
>> +    uint64_t current_time;
>> +
>> +    /* remove timer from the list before calling the callback */
>> +    qemu_del_timer(ts);
>> +
>> +    while ((current_time = qemu_get_clock_ms(rt_clock))<  ts->expire_time)
>> +        /* sleep until the expire time */
>> +        usleep((ts->expire_time - current_time) * 1000);
>> +
>> +    /* run the callback */
>> +    ts->cb(ts->opaque);
>> +}
>
> This looks funny. I can't imagine that this could ever fit into the
> standard (asynchronous) QEMU execution model for I/O. Keep it private to
> Xen?

I think it's funny for Xen too.  Why in the world would you need this?

Regards,

Anthony Liguroi

> Jan
>


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 11:23:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 11:23:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB9eM-0006lp-D3; Tue, 04 Oct 2011 11:23:30 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB9cP-00065T-HB
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 11:21:30 -0700
X-Env-Sender: jan.kiszka@web.de
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317752373!38854132!1
X-Originating-IP: [217.72.192.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25203 invoked from network); 4 Oct 2011 18:19:34 -0000
Received: from fmmailgate01.web.de (HELO fmmailgate01.web.de) (217.72.192.221)
	by server-14.tower-27.messagelabs.com with SMTP;
	4 Oct 2011 18:19:34 -0000
Received: from smtp08.web.de  ( [172.20.5.216])
	by fmmailgate01.web.de (Postfix) with ESMTP id 1C8EB199D4177;
	Tue,  4 Oct 2011 20:21:26 +0200 (CEST)
Received: from [88.65.45.85] (helo=mchn199C.mchp.siemens.de)
	by smtp08.web.de with asmtp (TLSv1:AES256-SHA:256) (WEB.DE 4.110 #2)
	id 1RB9cL-0000M5-00; Tue, 04 Oct 2011 20:21:25 +0200
Message-ID: <4E8B4EA5.8060800@web.de>
Date: Tue, 04 Oct 2011 20:21:25 +0200
From: Jan Kiszka <jan.kiszka@web.de>
User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de;
	rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12
	Mnenhy/0.7.5.666
MIME-Version: 1.0
To: Anthony PERARD <anthony.perard@citrix.com>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<1317739882-4809-2-git-send-email-anthony.perard@citrix.com>
In-Reply-To: <1317739882-4809-2-git-send-email-anthony.perard@citrix.com>
X-Enigmail-Version: 1.3.2
X-Sender: jan.kiszka@web.de
X-Provags-ID: V01U2FsdGVkX19jLUEBqT03qnEh4L/MfrjcBMCnkQ7GhPXXJxKD
	kkpWCUJhTStlZy8wRyPmKEWL1VCE7Ra+X1WUWwON1VSMfZ8gRl egr+O4+Fw=
Cc: Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH RFC V1 01/11] Introduce HostPCIDevice to
 access a pci device on the 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>
Content-Type: multipart/mixed; boundary="===============1738703005=="
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)
--===============1738703005==
Content-Type: multipart/signed; micalg=pgp-sha1;
	protocol="application/pgp-signature";
	boundary="------------enig20875CB65C23FC4054A90D95"

This is an OpenPGP/MIME signed message (RFC 2440 and 3156)
--------------enig20875CB65C23FC4054A90D95
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: quoted-printable

This wasn't run through checkpatch.pl, I bet.

On 2011-10-04 16:51, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  hw/host-pci-device.c |  192 ++++++++++++++++++++++++++++++++++++++++++=
++++++++
>  hw/host-pci-device.h |   36 +++++++++
>  2 files changed, 228 insertions(+), 0 deletions(-)
>  create mode 100644 hw/host-pci-device.c
>  create mode 100644 hw/host-pci-device.h
>=20
> diff --git a/hw/host-pci-device.c b/hw/host-pci-device.c
> new file mode 100644
> index 0000000..b3f2899
> --- /dev/null
> +++ b/hw/host-pci-device.c
> @@ -0,0 +1,192 @@
> +#include "qemu-common.h"
> +#include "host-pci-device.h"
> +
> +static int path_to(const HostPCIDevice *d,
> +                   const char *name, char *buf, ssize_t size)
> +{
> +    return snprintf(buf, size, "/sys/bus/pci/devices/%04x:%02x:%02x.%x=
/%s",
> +                    d->domain, d->bus, d->dev, d->func, name);
> +}
> +
> +static int get_resource(HostPCIDevice *d)
> +{
> +    int i;
> +    FILE *f;
> +    char path[PATH_MAX];
> +    unsigned long long start, end, flags, size;
> +
> +    path_to(d, "resource", path, sizeof (path));
> +    f =3D fopen(path, "r");
> +    if (!f) {
> +        fprintf(stderr, "Error: Can't open %s: %s\n", path, strerror(e=
rrno));
> +        return -1;
> +    }
> +
> +    for (i =3D 0; i < PCI_NUM_REGIONS; i++) {
> +        if (fscanf(f, "%llx %llx %llx", &start, &end, &flags) !=3D 3) =
{
> +            fprintf(stderr, "Error: Syntax error in %s\n", path);
> +            break;
> +        }
> +        if (start) {
> +            size =3D end - start + 1;
> +        } else {
> +            size =3D 0;
> +        }
> +
> +        flags &=3D 0xf;

No magic numbers please.

It also looks a bit strange to me: It's the resource type encoded in the
second byte? Aren't you interested in it?

> +
> +        if (i < PCI_ROM_SLOT) {
> +            d->base_addr[i] =3D start | flags;
> +            d->size[i] =3D size;
> +        } else {
> +            d->rom_base_addr =3D start | flags;
> +            d->rom_size =3D size;
> +        }
> +    }
> +
> +    fclose(f);
> +    return 0;
> +}
> +
> +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 =3D fopen(path, "r");
> +    if (!f) {
> +        fprintf(stderr, "Error: Can't open %s: %s\n", path, strerror(e=
rrno));
> +        return -1;
> +    }
> +    if (fscanf(f, "%lx\n", &value) !=3D 1) {
> +        fprintf(stderr, "Error: Syntax error in %s\n", path);
> +        value =3D -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 =3D !stat(path, &buf);
> +
> +    return rc;
> +}
> +
> +static int host_pci_config_fd(HostPCIDevice *d)

[ We will also need the reverse: pass in open file descriptors that
HostPCIDevice should use. Can be added later. ]

> +{
> +    char path[PATH_MAX];
> +
> +    if (d->config_fd < 0) {
> +        path_to(d, "config", path, sizeof (path));
> +        d->config_fd =3D 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 =3D host_pci_config_fd(d);
> +    int res =3D 0;
> +
> +    res =3D 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 =3D host_pci_config_fd(d);
> +    int res =3D 0;
> +
> +    res =3D 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_read_byte(HostPCIDevice *d, int pos)
> +{
> +  uint8_t buf;
> +  host_pci_config_read(d, pos, &buf, 1);
> +  return buf;
> +}
> +uint16_t host_pci_read_word(HostPCIDevice *d, int pos)
> +{
> +  uint16_t buf;
> +  host_pci_config_read(d, pos, &buf, 2);
> +  return le16_to_cpu(buf);
> +}
> +uint32_t host_pci_read_long(HostPCIDevice *d, int pos)
> +{
> +  uint32_t buf;
> +  host_pci_config_read(d, pos, &buf, 4);
> +  return le32_to_cpu(buf);
> +}
> +int host_pci_read_block(HostPCIDevice *d, int pos, uint8_t *buf, int l=
en)
> +{
> +  return host_pci_config_read(d, pos, buf, len);
> +}
> +
> +int host_pci_write_byte(HostPCIDevice *d, int pos, uint8_t data)
> +{
> +  return host_pci_config_write(d, pos, &data, 1);
> +}
> +int host_pci_write_word(HostPCIDevice *d, int pos, uint16_t data)
> +{
> +  return host_pci_config_write(d, pos, &data, 2);

You adjust endianess on read, but not on write.

> +}
> +int host_pci_write_long(HostPCIDevice *d, int pos, uint32_t data)
> +{
> +  return host_pci_config_write(d, pos, &data, 4);
> +}
> +int host_pci_write_block(HostPCIDevice *d, int pos, uint8_t *buf, int =
len)
> +{
> +  return host_pci_config_write(d, pos, buf, len);
> +}
> +
> +HostPCIDevice *host_pci_device_get(uint8_t bus, uint8_t dev, uint8_t f=
unc)
> +{
> +    HostPCIDevice *d =3D NULL;
> +
> +    d =3D g_new0(HostPCIDevice, 1);
> +
> +    d->config_fd =3D -1;
> +    d->domain =3D 0;
> +    d->bus =3D bus;
> +    d->dev =3D dev;
> +    d->func =3D func;
> +
> +    if (host_pci_config_fd(d) =3D=3D -1)
> +        goto error;
> +    if (get_resource(d) =3D=3D -1)
> +        goto error;
> +
> +    d->vendor_id =3D get_value(d, "vendor");
> +    d->device_id =3D get_value(d, "device");
> +    d->is_virtfn =3D pci_dev_is_virtfn(d);
> +
> +    return d;
> +error:
> +    if (d->config_fd >=3D 0)
> +        close(d->config_fd);
> +    g_free(d);
> +    return NULL;
> +}
> diff --git a/hw/host-pci-device.h b/hw/host-pci-device.h
> new file mode 100644
> index 0000000..0137507
> --- /dev/null
> +++ b/hw/host-pci-device.h
> @@ -0,0 +1,36 @@
> +#ifndef HW_HOST_PCI_DEVICE
> +#  define HW_HOST_PCI_DEVICE
> +
> +#include "pci.h"
> +
> +typedef struct HostPCIDevice {
> +    uint16_t domain;
> +    uint8_t bus;
> +    uint8_t dev;
> +    uint8_t func;
> +
> +    uint16_t vendor_id;
> +    uint16_t device_id;
> +
> +    pcibus_t base_addr[PCI_NUM_REGIONS - 1];
> +    pcibus_t size[PCI_NUM_REGIONS - 1];
> +    pcibus_t rom_base_addr;
> +    pcibus_t rom_size;

Regions deserve their own type IMHO. In KVM we have

typedef struct {
    int type;           /* Memory or port I/O */
    int valid;
    uint32_t base_addr;
    uint32_t size;    /* size of the region */
    int resource_fd;
} PCIRegion;

Should probably become HostPCIIORegion (vs. virtual PCIIORegion), and
our field types need some cleanups.

> +
> +    bool is_virtfn;
> +
> +    int config_fd;
> +} HostPCIDevice;
> +
> +HostPCIDevice *host_pci_device_get(uint8_t bus, uint8_t dev, uint8_t f=
unc);

And what about some host_pci_device_put when we're done with it?

> +
> +uint8_t host_pci_read_byte(HostPCIDevice *d, int pos);
> +uint16_t host_pci_read_word(HostPCIDevice *d, int pos);
> +uint32_t host_pci_read_long(HostPCIDevice *d, int pos);
> +int host_pci_read_block(HostPCIDevice *d, int pos, uint8_t *buf, int l=
en);
> +int host_pci_write_byte(HostPCIDevice *d, int pos, uint8_t data);
> +int host_pci_write_word(HostPCIDevice *d, int pos, uint16_t data);
> +int host_pci_write_long(HostPCIDevice *d, int pos, uint32_t data);
> +int host_pci_write_block(HostPCIDevice *d, int pos, uint8_t *buf, int =
len);

I think these should be analogous to our pci layer:
host_pci_get/set_byte/word/long/quad.

Looks like it's generally useful for KVM as well.

Jan


--------------enig20875CB65C23FC4054A90D95
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.16 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6LTqUACgkQitSsb3rl5xRYCQCgq2Z2BpDXH7fas8ILZX79Af4B
JoQAn2GEfTTxqm0m2AImK3eHa/Fxn3Ct
=pqQw
-----END PGP SIGNATURE-----

--------------enig20875CB65C23FC4054A90D95--


--===============1738703005==
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

--===============1738703005==--


From xen-devel-bounces@lists.xensource.com Tue Oct 04 11:29:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 11:29:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB9jm-0007s5-CC; Tue, 04 Oct 2011 11:29:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB9fp-00072K-H6
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 11:25:02 -0700
X-Env-Sender: avi@redhat.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1317752684!42779766!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17396 invoked from network); 4 Oct 2011 18:24:44 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-13.tower-27.messagelabs.com with SMTP;
	4 Oct 2011 18:24:44 -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 p94IOpQW009929
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 4 Oct 2011 14:24:51 -0400
Received: from balrog.usersys.redhat.com (dhcp-1-24.tlv.redhat.com
	[10.35.1.24])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p94IOmt3009633; Tue, 4 Oct 2011 14:24:49 -0400
Message-ID: <4E8B4F70.2030009@redhat.com>
Date: Tue, 04 Oct 2011 20:24:48 +0200
From: Avi Kivity <avi@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Qemu-devel] [Xen-devel] [PATCH RFC V1 00/11] Xen PCI Passthrough
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<4E8B1F0D.4080203@redhat.com> <4E8B1FBC.2080904@codemonkey.ws>
	<4E8B3C7F.4020300@redhat.com>
	<alpine.DEB.2.00.1110041853390.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1110041853390.3519@kaball-desktop>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
Cc: Anthony Perard <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>, Anthony Liguori <anthony@codemonkey.ws>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/04/2011 08:19 PM, Stefano Stabellini wrote:
> On Tue, 4 Oct 2011, Avi Kivity wrote:
> >  On 10/04/2011 05:01 PM, Anthony Liguori wrote:
> >  >>  We also have pci passthrough in qemu-kvm (I think based on the same
> >  >>  Neocleus
> >  >>  code). Rather than having two pci assignment implementations, I think
> >  >>  we should
> >  >>  have just one, with the differences (programming the hypervisor)
> >  >>  abstracted at
> >  >>  that level.
> >  >
> >  >
> >  >  I agree in principle but how close is qemu-kvm pci passthrough to a
> >  >  mergable state?  Would it make sense to merge the Xen code first and
> >  >  then abstract it?
> >
> >  Merging either implementation and abstracting it would risk regressions
> >  in the other.
>
> Honestly the last time I looked at the kvm passthrough code (admittedly
> a while ago), it looked very similar to the xen passthrough code, so I
> don't think we would risk much merging either one first and then
> abstracting it.

There were 59 commits in the past year to hw/device-assignment.c, so the 
risk is real IMO.

> >  How about merging both, with the ABIs (command line and qmp) tagged as
> >  experimental, and then doing a merge in the same style as
> >  i386+x86_64->x86 or the two kvm implementations in qemu?  We can pick
> >  one implementation as the merge target and port fixes from the other.
>
> I am OK with this too: it is probably more work but it doesn't risk
> loosing any bug fixes.
> If you think that kvm passthrough might have several bug fixes that xen
> passthrough does not have is probably the right way to go.

and the other way round.

-- 
error compiling committee.c: too many arguments to function


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 11:37:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 11:37:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RB9ru-0000GG-Cj; Tue, 04 Oct 2011 11:37:30 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB9rN-0008V9-FM
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 11:36:57 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1317753395!47255934!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22412 invoked from network); 4 Oct 2011 18:36:35 -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;
	4 Oct 2011 18:36:35 -0000
X-IronPort-AV: E=Sophos;i="4.68,486,1312156800"; 
   d="scan'208";a="8209703"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 18:36: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; Tue, 4 Oct 2011 19:36:26 +0100
Date: Tue, 4 Oct 2011 19:36:18 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1317739882-4809-2-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1110041921470.3519@kaball-desktop>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<1317739882-4809-2-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: Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH RFC V1 01/11] Introduce HostPCIDevice to
 access a pci device on the 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

On Tue, 4 Oct 2011, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  hw/host-pci-device.c |  192 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  hw/host-pci-device.h |   36 +++++++++
>  2 files changed, 228 insertions(+), 0 deletions(-)
>  create mode 100644 hw/host-pci-device.c
>  create mode 100644 hw/host-pci-device.h
> 
> diff --git a/hw/host-pci-device.c b/hw/host-pci-device.c
> new file mode 100644
> index 0000000..b3f2899
> --- /dev/null
> +++ b/hw/host-pci-device.c
> @@ -0,0 +1,192 @@
> +#include "qemu-common.h"
> +#include "host-pci-device.h"
> +
> +static int path_to(const HostPCIDevice *d,
> +                   const char *name, char *buf, ssize_t size)
> +{
> +    return snprintf(buf, size, "/sys/bus/pci/devices/%04x:%02x:%02x.%x/%s",
> +                    d->domain, d->bus, d->dev, d->func, name);
> +}

This is all very Linux specific so at the very least it should only be
compiled if CONFIG_LINUX.


> +static int get_resource(HostPCIDevice *d)
> +{
> +    int i;
> +    FILE *f;
> +    char path[PATH_MAX];
> +    unsigned long long start, end, flags, size;
> +
> +    path_to(d, "resource", path, sizeof (path));
> +    f = fopen(path, "r");
> +    if (!f) {
> +        fprintf(stderr, "Error: Can't open %s: %s\n", path, strerror(errno));
> +        return -1;
> +    }
> +
> +    for (i = 0; i < PCI_NUM_REGIONS; i++) {
> +        if (fscanf(f, "%llx %llx %llx", &start, &end, &flags) != 3) {
> +            fprintf(stderr, "Error: Syntax error in %s\n", path);
> +            break;
> +        }

you should return error in this case


> +        if (start) {
> +            size = end - start + 1;
> +        } else {
> +            size = 0;
> +        }
> +
> +        flags &= 0xf;

please #define what mask is this 0xf


> +        if (i < PCI_ROM_SLOT) {
> +            d->base_addr[i] = start | flags;
> +            d->size[i] = size;
> +        } else {
> +            d->rom_base_addr = start | flags;
> +            d->rom_size = size;
> +        }
> +    }
> +
> +    fclose(f);
> +    return 0;
> +}
> +
> +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;
> +    }
> +    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;
> +}
> +
> +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_read_byte(HostPCIDevice *d, int pos)
> +{
> +  uint8_t buf;
> +  host_pci_config_read(d, pos, &buf, 1);
> +  return buf;
> +}
> +uint16_t host_pci_read_word(HostPCIDevice *d, int pos)
> +{
> +  uint16_t buf;
> +  host_pci_config_read(d, pos, &buf, 2);
> +  return le16_to_cpu(buf);
> +}
> +uint32_t host_pci_read_long(HostPCIDevice *d, int pos)
> +{
> +  uint32_t buf;
> +  host_pci_config_read(d, pos, &buf, 4);
> +  return le32_to_cpu(buf);
> +}
> +int host_pci_read_block(HostPCIDevice *d, int pos, uint8_t *buf, int len)
> +{
> +  return host_pci_config_read(d, pos, buf, len);
> +}
> +
> +int host_pci_write_byte(HostPCIDevice *d, int pos, uint8_t data)
> +{
> +  return host_pci_config_write(d, pos, &data, 1);
> +}
> +int host_pci_write_word(HostPCIDevice *d, int pos, uint16_t data)
> +{
> +  return host_pci_config_write(d, pos, &data, 2);
> +}
> +int host_pci_write_long(HostPCIDevice *d, int pos, uint32_t data)
> +{
> +  return host_pci_config_write(d, pos, &data, 4);
> +}
> +int host_pci_write_block(HostPCIDevice *d, int pos, uint8_t *buf, int len)
> +{
> +  return host_pci_config_write(d, pos, buf, len);
> +}
> +
> +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) == -1)
> +        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;
> +}
> diff --git a/hw/host-pci-device.h b/hw/host-pci-device.h
> new file mode 100644
> index 0000000..0137507
> --- /dev/null
> +++ b/hw/host-pci-device.h
> @@ -0,0 +1,36 @@
> +#ifndef HW_HOST_PCI_DEVICE
> +#  define HW_HOST_PCI_DEVICE
> +
> +#include "pci.h"
> +
> +typedef struct HostPCIDevice {
> +    uint16_t domain;
> +    uint8_t bus;
> +    uint8_t dev;
> +    uint8_t func;
> +
> +    uint16_t vendor_id;
> +    uint16_t device_id;
> +
> +    pcibus_t base_addr[PCI_NUM_REGIONS - 1];
> +    pcibus_t size[PCI_NUM_REGIONS - 1];
> +    pcibus_t rom_base_addr;
> +    pcibus_t rom_size;
> +
> +    bool is_virtfn;
> +
> +    int config_fd;
> +} HostPCIDevice;
> +
> +HostPCIDevice *host_pci_device_get(uint8_t bus, uint8_t dev, uint8_t func);
> +
> +uint8_t host_pci_read_byte(HostPCIDevice *d, int pos);
> +uint16_t host_pci_read_word(HostPCIDevice *d, int pos);
> +uint32_t host_pci_read_long(HostPCIDevice *d, int pos);
> +int host_pci_read_block(HostPCIDevice *d, int pos, uint8_t *buf, int len);
> +int host_pci_write_byte(HostPCIDevice *d, int pos, uint8_t data);
> +int host_pci_write_word(HostPCIDevice *d, int pos, uint16_t data);
> +int host_pci_write_long(HostPCIDevice *d, int pos, uint32_t data);
> +int host_pci_write_block(HostPCIDevice *d, int pos, uint8_t *buf, int len);
> +
> +#endif /* !HW_HOST_PCI_DEVICE */

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 12:06:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 12:06:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBAKK-0001Pe-BB; Tue, 04 Oct 2011 12:06:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBAEO-0000oo-0W
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 12:01:04 -0700
X-Env-Sender: eli@dev.mellanox.co.il
X-Msg-Ref: server-8.tower-27.messagelabs.com!1317754821!46762904!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1962 invoked from network); 4 Oct 2011 19:00:21 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 19:00:21 -0000
Received: by eye3 with SMTP id 3so1346509eye.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 12:00:39 -0700 (PDT)
Received: by 10.223.65.141 with SMTP id j13mr2160186fai.101.1317754838951;
	Tue, 04 Oct 2011 12:00:38 -0700 (PDT)
Received: from localhost ([82.166.227.17])
	by mx.google.com with ESMTPS id m26sm26486819fac.6.2011.10.04.12.00.36
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 04 Oct 2011 12:00:37 -0700 (PDT)
Date: Tue, 4 Oct 2011 21:00:34 +0200
From: Eli Cohen <eli@dev.mellanox.co.il>
To: Andrew Cooper <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] Xen interrupts when using passthrough
Message-ID: <20111004190034.GA19881@mtldesk30>
References: <20111004162906.GA2681@mtldesk30>
 <4E8B3949.4090803@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8B3949.4090803@citrix.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
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

Andrew, thanks for your response.

On Tue, Oct 04, 2011 at 05:50:17PM +0100, Andrew Cooper wrote:
> 
> Do you mean that it is receiving interrupts for another device, or are
> you trying to pass through multiple interrupts for a device and the
> interrupt is appearing in the wrong event channel?
> 
I am not sure I understand your question.
> Could you describe your hardware setup in detail please, especially
> AMD/Intel, IOMMU features in use according to Xen, and the PCI topology
> of the box.

Here's a description. I have a PCI device which supports SRIOV, so
there are several virtual functions besides the primary function. The
device generates interrupts using MSI-X. I bind one of the virtual
functions to the guest. The PCI device driver at the guest requests
msix vectors from kernel and gets two vectors. Then it calls
request_irq for those vectors.
When the device generates msix interrupt using the address/data in
it's msi-x table. However, the guest kernel complains the no handler
is registered for this vector. Specifically, I request_irq for vectors
48 and 49. When the device issues interrupt for vector 49, the guest
complains that it received interrupt for vector 89 which has no
handler routine.
> 
> >  I am
> > trying to understand how is the guest supposed to recieve the
> > interrupt: Is it handled by dom0 which is using event channels to pass
> > the interrupt to domU, or is handled directly by domU. Please send
> > pointers to the code.
> 
> (I am not very familiar with guest IRQs so the following might not be
> accurate)
> 
> For a PCI passthrough system, the interrupts should be bound directly to
> domU, with no dom0 interaction.  A PIRQ is bound to an event channel
> using the EVTCHNOP_bind_pirq in common/event_channel.c, which should be
> set up by qemu for the relevant domU, when it is interpreting the PCI
> config space reads/writes.
My geust kernel is 2.6.32 based and I can't see any file with the name
event_channel.c.


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 12:19:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 12:19:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBAWM-0001xa-9v; Tue, 04 Oct 2011 12:19:18 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBAVO-0001kF-J2
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 12:18:18 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-14.tower-21.messagelabs.com!1317755884!62158505!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25224 invoked from network); 4 Oct 2011 19:18:06 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 19:18: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 19EC69142;
	Tue,  4 Oct 2011 12:18:12 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id A5DF4210F3; Tue,  4 Oct 2011 12:18:10 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Tue,  4 Oct 2011 12:18:03 -0700
Message-Id: <619c66d6da63aa086e2eac017e7aed216cc8ddc3.1317755691.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>, Andrew Morton <akpm@linux-foundation.org>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V3 2/8] stop_machine: make stop_machine safe
	and efficient to call early
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Make stop_machine() safe to call early in boot, before stop_machine()
has been set up, by simply calling the callback function directly if
there's only one CPU online.

[ Fixes from AKPM:
   - add comment
   - local_irq_flags, not save_flags
   - also call hard_irq_disable() for systems which need it

  Tejun suggested using an explicit flag rather than just looking at
  the online cpu count. ]

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by: Tejun Heo <tj@kernel.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: H. Peter Anvin <hpa@linux.intel.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
 kernel/stop_machine.c |   22 ++++++++++++++++++++++
 1 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c
index ba5070c..d3f960a 100644
--- a/kernel/stop_machine.c
+++ b/kernel/stop_machine.c
@@ -41,6 +41,7 @@ struct cpu_stopper {
 };
 
 static DEFINE_PER_CPU(struct cpu_stopper, cpu_stopper);
+static bool stop_machine_initialized = false;
 
 static void cpu_stop_init_done(struct cpu_stop_done *done, unsigned int nr_todo)
 {
@@ -386,6 +387,8 @@ static int __init cpu_stop_init(void)
 	cpu_stop_cpu_callback(&cpu_stop_cpu_notifier, CPU_ONLINE, bcpu);
 	register_cpu_notifier(&cpu_stop_cpu_notifier);
 
+	stop_machine_initialized = true;
+
 	return 0;
 }
 early_initcall(cpu_stop_init);
@@ -485,6 +488,25 @@ int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus)
 					    .num_threads = num_online_cpus(),
 					    .active_cpus = cpus };
 
+	if (!stop_machine_initialized) {
+		/*
+		 * Handle the case where stop_machine() is called
+		 * early in boot before stop_machine() has been
+		 * initialized.
+		 */
+ 		unsigned long flags;
+		int ret;
+
+		WARN_ON_ONCE(smdata.num_threads != 1);
+
+		local_irq_save(flags);
+		hard_irq_disable();
+		ret = (*fn)(data);
+		local_irq_restore(flags);
+
+		return ret;
+	}
+
 	/* Set the initial state and stop all online cpus. */
 	set_state(&smdata, STOPMACHINE_PREPARE);
 	return stop_cpus(cpu_online_mask, stop_machine_cpu_stop, &smdata);
-- 
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 Oct 04 12:20:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 12:20:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBAXU-0002Kr-4m; Tue, 04 Oct 2011 12:20:28 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBAVP-0001kG-7V
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 12:18:19 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-15.tower-27.messagelabs.com!1317755884!49556128!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26243 invoked from network); 4 Oct 2011 19:18:05 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-15.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 19:18:05 -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 13F919141;
	Tue,  4 Oct 2011 12:18:12 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id B2E74210F4; Tue,  4 Oct 2011 12:18:10 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Tue,  4 Oct 2011 12:18:04 -0700
Message-Id: <6e43e15076e959d0f5ae7180bec2a197a05524e9.1317755691.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V3 3/8] jump_label: if a key has already
	been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

If a key has been enabled before jump_label_init() is called, don't
nop it out.

This removes arch_jump_label_text_poke_early() (which can only nop
out a site) and uses arch_jump_label_transform() instead.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 include/linux/jump_label.h |    3 +--
 kernel/jump_label.c        |   20 ++++++++------------
 2 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 1213e9d..12e804e 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -44,8 +44,7 @@ extern struct jump_entry __stop___jump_table[];
 extern void jump_label_lock(void);
 extern void jump_label_unlock(void);
 extern void arch_jump_label_transform(struct jump_entry *entry,
-				 enum jump_label_type type);
-extern void arch_jump_label_text_poke_early(jump_label_t addr);
+				      enum jump_label_type type);
 extern int jump_label_text_reserved(void *start, void *end);
 extern void jump_label_inc(struct jump_label_key *key);
 extern void jump_label_dec(struct jump_label_key *key);
diff --git a/kernel/jump_label.c b/kernel/jump_label.c
index a8ce450..059202d5 100644
--- a/kernel/jump_label.c
+++ b/kernel/jump_label.c
@@ -121,13 +121,6 @@ static void __jump_label_update(struct jump_label_key *key,
 	}
 }
 
-/*
- * Not all archs need this.
- */
-void __weak arch_jump_label_text_poke_early(jump_label_t addr)
-{
-}
-
 static __init int jump_label_init(void)
 {
 	struct jump_entry *iter_start = __start___jump_table;
@@ -139,12 +132,15 @@ static __init int jump_label_init(void)
 	jump_label_sort_entries(iter_start, iter_stop);
 
 	for (iter = iter_start; iter < iter_stop; iter++) {
-		arch_jump_label_text_poke_early(iter->code);
-		if (iter->key == (jump_label_t)(unsigned long)key)
+		struct jump_label_key *iterk;
+
+		iterk = (struct jump_label_key *)(unsigned long)iter->key;
+		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
+					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
+		if (iterk == key)
 			continue;
 
-		key = (struct jump_label_key *)(unsigned long)iter->key;
-		atomic_set(&key->enabled, 0);
+		key = iterk;
 		key->entries = iter;
 #ifdef CONFIG_MODULES
 		key->next = NULL;
@@ -212,7 +208,7 @@ void jump_label_apply_nops(struct module *mod)
 		return;
 
 	for (iter = iter_start; iter < iter_stop; iter++)
-		arch_jump_label_text_poke_early(iter->code);
+		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
 }
 
 static int jump_label_add_module(struct module *mod)
-- 
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 Oct 04 12:21:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 12:21:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBAYH-0002he-HA; Tue, 04 Oct 2011 12:21:17 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBAVQ-0001kH-O9
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 12:18:21 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-11.tower-174.messagelabs.com!1317755895!33903201!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4578 invoked from network); 4 Oct 2011 19:18:17 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Oct 2011 19:18:17 -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 DC35B3F9;
	Tue,  4 Oct 2011 12:18:11 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 9FD4420260; Tue,  4 Oct 2011 12:18:10 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Tue,  4 Oct 2011 12:18:02 -0700
Message-Id: <0b202e43573ff2fba673ca375a95d757ed9a3f36.1317755691.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V3 1/8] jump_label: use proper atomic_t
	initializer
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

ATOMIC_INIT() is the proper thing to use.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 include/linux/jump_label.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 66f23dc..1213e9d 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -28,9 +28,9 @@ struct module;
 #ifdef HAVE_JUMP_LABEL
 
 #ifdef CONFIG_MODULES
-#define JUMP_LABEL_INIT {{ 0 }, NULL, NULL}
+#define JUMP_LABEL_INIT {ATOMIC_INIT(0), NULL, NULL}
 #else
-#define JUMP_LABEL_INIT {{ 0 }, NULL}
+#define JUMP_LABEL_INIT {ATOMIC_INIT(0), NULL}
 #endif
 
 static __always_inline bool static_branch(struct jump_label_key *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 Tue Oct 04 12:22:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 12:22:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBAZD-00034T-IR; Tue, 04 Oct 2011 12:22:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBAVT-0001kX-Da
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 12:18:24 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-182.messagelabs.com!1317755898!18128136!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18960 invoked from network); 4 Oct 2011 19:18:20 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 19:18:20 -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 C58AF334;
	Tue,  4 Oct 2011 12:18:11 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id BA369210F5; Tue,  4 Oct 2011 12:18:10 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Tue,  4 Oct 2011 12:18:05 -0700
Message-Id: <b0ba511015ed44affa818415528bc00fd79d57bd.1317755691.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V3 4/8] x86/jump_label: drop
	arch_jump_label_text_poke_early()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

It is no longer used.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Jason Baron <jbaron@redhat.com>
---
 arch/x86/kernel/jump_label.c |    6 ------
 1 files changed, 0 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
index 3fee346..2ad0298 100644
--- a/arch/x86/kernel/jump_label.c
+++ b/arch/x86/kernel/jump_label.c
@@ -42,10 +42,4 @@ void arch_jump_label_transform(struct jump_entry *entry,
 	put_online_cpus();
 }
 
-void arch_jump_label_text_poke_early(jump_label_t addr)
-{
-	text_poke_early((void *)addr, ideal_nops[NOP_ATOMIC5],
-			JUMP_LABEL_NOP_SIZE);
-}
-
 #endif
-- 
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 Oct 04 12:23:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 12:23:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBAa7-0003RZ-FG; Tue, 04 Oct 2011 12:23:11 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBAVT-0001kd-GR
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 12:18:24 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-15.tower-27.messagelabs.com!1317755888!49556133!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26339 invoked from network); 4 Oct 2011 19:18:10 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-15.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 19:18:10 -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 34DF99147;
	Tue,  4 Oct 2011 12:18:13 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id C2E1A210F7; Tue,  4 Oct 2011 12:18:10 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Tue,  4 Oct 2011 12:18:06 -0700
Message-Id: <e29cdbf8bef7d1f2ec1a71063679ba717ba9af4a.1317755691.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V3 5/8] sparc/jump_label: drop
	arch_jump_label_text_poke_early()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

It is no longer used.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: David Miller <davem@davemloft.net>
---
 arch/sparc/kernel/jump_label.c |    8 --------
 1 files changed, 0 insertions(+), 8 deletions(-)

diff --git a/arch/sparc/kernel/jump_label.c b/arch/sparc/kernel/jump_label.c
index ea2dafc..971fd43 100644
--- a/arch/sparc/kernel/jump_label.c
+++ b/arch/sparc/kernel/jump_label.c
@@ -36,12 +36,4 @@ void arch_jump_label_transform(struct jump_entry *entry,
 	put_online_cpus();
 }
 
-void arch_jump_label_text_poke_early(jump_label_t addr)
-{
-	u32 *insn_p = (u32 *) (unsigned long) addr;
-
-	*insn_p = 0x01000000;
-	flushi(insn_p);
-}
-
 #endif
-- 
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 Oct 04 12:24:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 12:24:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBAat-0003no-TQ; Tue, 04 Oct 2011 12:23:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBAVU-0001kj-8O
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 12:18:25 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317755899!19093317!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10165 invoked from network); 4 Oct 2011 19:18:21 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 19:18:21 -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 AFDD59157;
	Tue,  4 Oct 2011 12:18:13 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id D5B32210F9; Tue,  4 Oct 2011 12:18:10 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Tue,  4 Oct 2011 12:18:08 -0700
Message-Id: <e56a0ce188082e88e9706b85560dcaa1e411eb11.1317755691.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V3 7/8] s390/jump-label: add
	arch_jump_label_transform_static()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

This allows jump-label entries to be cheaply updated on code which is
not yet live.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Jan Glauber <jang@linux.vnet.ibm.com>
---
 arch/s390/kernel/jump_label.c |   51 +++++++++++++++++++++++++----------------
 1 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/arch/s390/kernel/jump_label.c b/arch/s390/kernel/jump_label.c
index 44cc06b..b987ab2 100644
--- a/arch/s390/kernel/jump_label.c
+++ b/arch/s390/kernel/jump_label.c
@@ -18,26 +18,15 @@ struct insn {
 } __packed;
 
 struct insn_args {
-	unsigned long *target;
-	struct insn *insn;
-	ssize_t size;
+	struct jump_entry *entry;
+	enum jump_label_type type;
 };
 
-static int __arch_jump_label_transform(void *data)
+static void __jump_label_transform(struct jump_entry *entry,
+				   enum jump_label_type type)
 {
-	struct insn_args *args = data;
-	int rc;
-
-	rc = probe_kernel_write(args->target, args->insn, args->size);
-	WARN_ON_ONCE(rc < 0);
-	return 0;
-}
-
-void arch_jump_label_transform(struct jump_entry *entry,
-			       enum jump_label_type type)
-{
-	struct insn_args args;
 	struct insn insn;
+	int rc;
 
 	if (type == JUMP_LABEL_ENABLE) {
 		/* brcl 15,offset */
@@ -49,11 +38,33 @@ void arch_jump_label_transform(struct jump_entry *entry,
 		insn.offset = 0;
 	}
 
-	args.target = (void *) entry->code;
-	args.insn = &insn;
-	args.size = JUMP_LABEL_NOP_SIZE;
+	rc = probe_kernel_write((void *)entry->code, &insn, JUMP_LABEL_NOP_SIZE);
+	WARN_ON_ONCE(rc < 0);
+}
 
-	stop_machine(__arch_jump_label_transform, &args, NULL);
+static int __sm_arch_jump_label_transform(void *data)
+{
+	struct insn_args *args = data;
+
+	__jump_label_transform(args->entry, args->type);
+	return 0;
+}
+
+void arch_jump_label_transform(struct jump_entry *entry,
+			       enum jump_label_type type)
+{
+	struct insn_args args;
+
+	args.entry = entry;
+	args.type = type;
+
+	stop_machine(__sm_arch_jump_label_transform, &args, NULL);
+}
+
+void arch_jump_label_transform_static(struct jump_entry *entry,
+				      enum jump_label_type type)
+{
+	__jump_label_transform(entry, type);
 }
 
 #endif
-- 
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 Oct 04 12:25:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 12:25:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBAbu-0004BA-1h; Tue, 04 Oct 2011 12:25:02 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBAVW-0001l7-1y
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 12:18:27 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-13.tower-182.messagelabs.com!1317755900!20772557!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29837 invoked from network); 4 Oct 2011 19:18:21 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-13.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Oct 2011 19:18:21 -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 49E6B9158;
	Tue,  4 Oct 2011 12:18:14 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id CBE75210F8; Tue,  4 Oct 2011 12:18:10 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Tue,  4 Oct 2011 12:18:07 -0700
Message-Id: <d2218e435a2f5649210edb41b9ba5ccdbd0b8fd6.1317755691.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V3 6/8] jump_label: add
	arch_jump_label_transform_static() to optimise non-live code updates
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

When updating a newly loaded module, the code is definitely not yet
executing on any processor, so it can be updated with no need for any
heavyweight synchronization.

This patch adds arch_jump_label_static() which is implemented as
arch_jump_label_transform() by default, but architectures can override
it if it avoids, say, a call to stop_machine().

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 include/linux/jump_label.h |    2 ++
 kernel/jump_label.c        |   14 +++++++++++++-
 2 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 12e804e..56594e4 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -45,6 +45,8 @@ extern void jump_label_lock(void);
 extern void jump_label_unlock(void);
 extern void arch_jump_label_transform(struct jump_entry *entry,
 				      enum jump_label_type type);
+extern void arch_jump_label_transform_static(struct jump_entry *entry,
+					     enum jump_label_type type);
 extern int jump_label_text_reserved(void *start, void *end);
 extern void jump_label_inc(struct jump_label_key *key);
 extern void jump_label_dec(struct jump_label_key *key);
diff --git a/kernel/jump_label.c b/kernel/jump_label.c
index 059202d5..f0a9bef 100644
--- a/kernel/jump_label.c
+++ b/kernel/jump_label.c
@@ -104,6 +104,18 @@ static int __jump_label_text_reserved(struct jump_entry *iter_start,
 	return 0;
 }
 
+/* 
+ * Update code which is definitely not currently executing.
+ * Architectures which need heavyweight synchronization to modify
+ * running code can override this to make the non-live update case
+ * cheaper.
+ */
+void __weak arch_jump_label_transform_static(struct jump_entry *entry,
+					    enum jump_label_type type)
+{
+	arch_jump_label_transform(entry, type);	
+}
+
 static void __jump_label_update(struct jump_label_key *key,
 				struct jump_entry *entry,
 				struct jump_entry *stop, int enable)
@@ -208,7 +220,7 @@ void jump_label_apply_nops(struct module *mod)
 		return;
 
 	for (iter = iter_start; iter < iter_stop; iter++)
-		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
+		arch_jump_label_transform_static(iter, JUMP_LABEL_DISABLE);
 }
 
 static int jump_label_add_module(struct module *mod)
-- 
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 Oct 04 12:26:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 12:26:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBAcz-0004YH-C0; Tue, 04 Oct 2011 12:26:09 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBAVW-0001lS-PQ
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 12:18:27 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-2.tower-182.messagelabs.com!1317755901!18114231!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28088 invoked from network); 4 Oct 2011 19:18:23 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-2.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 19:18:23 -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 3307D915B;
	Tue,  4 Oct 2011 12:18:18 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 9A19D20EDB; Tue,  4 Oct 2011 12:18:10 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Tue,  4 Oct 2011 12:18:01 -0700
Message-Id: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V3 0/8] jump-label: allow early
	jump_label_enable()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

[ Change from V2: add arch_jump_label_transform_static() for use on
  code which can't possibly be currently executing (ie, a freshly
  loaded module), which can avoid heavyweight things like
  stop_machine.  The default implementation is simply
  arch_jump_label_transform(), so only architectures which would
  particularly benefit need implement it (x86 and s390 in this
  series). ]

While trying to use the jump-label stuff for my PV ticketlock changes,
I had some problems using jump labels early in the kernel's lifetime
(pre-SMP).

The basic problem is that even if I enable a jump_label_key, the
jump_label_init() initializer ends up nopping out all the code sites.

This series enables early use of jump labels by making
jump_label_init() respect already-enabled keys.

To do this, I've dropped arch_jump_label_poke_text_early() and
replaced it with arch_jump_label_transform(), allowing it to either
insert an optimal nop, or leave the jump in place.

Part of this series makes sure that stop_machine() is safe to call
in an early pre-SMP environment, by making it just call the function
with interrupts disabled.

git://github.com/jsgf/linux-xen upstream/jump-label-noearly

Jeremy Fitzhardinge (8):
  jump_label: use proper atomic_t initializer
  stop_machine: make stop_machine safe and efficient to call early
  jump_label: if a key has already been initialized, don't nop it out
  x86/jump_label: drop arch_jump_label_text_poke_early()
  sparc/jump_label: drop arch_jump_label_text_poke_early()
  jump_label: add arch_jump_label_transform_static() to optimise
    non-live code updates
  s390/jump-label: add arch_jump_label_transform_static()
  x86/jump_label: add arch_jump_label_transform_static()

 arch/s390/kernel/jump_label.c  |   51 ++++++++++++++++++++++++---------------
 arch/sparc/kernel/jump_label.c |    8 ------
 arch/x86/kernel/jump_label.c   |   20 +++++++++++----
 include/linux/jump_label.h     |    9 ++++---
 kernel/jump_label.c            |   32 +++++++++++++++---------
 kernel/stop_machine.c          |   22 +++++++++++++++++
 6 files changed, 92 insertions(+), 50 deletions(-)

-- 
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 Oct 04 12:26:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 12:26:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBAdi-0004ul-AI; Tue, 04 Oct 2011 12:26:54 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBAVW-0001lR-Ou
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 12:18:27 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-8.tower-182.messagelabs.com!1317755901!19744809!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7950 invoked from network); 4 Oct 2011 19:18:23 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 19:18:23 -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 6F0BA9159;
	Tue,  4 Oct 2011 12:18:15 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id DDC3F210FA; Tue,  4 Oct 2011 12:18:10 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Tue,  4 Oct 2011 12:18:09 -0700
Message-Id: <a41a06725b61aa91dcd5606e18a159d3b44cf6ba.1317755691.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V3 8/8] x86/jump_label: add
	arch_jump_label_transform_static()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

This allows jump-label entries to be cheaply updated on code which is
not yet live.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Jason Baron <jbaron@redhat.com>
---
 arch/x86/kernel/jump_label.c |   20 +++++++++++++++++---
 1 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
index 2ad0298..ea9d5f2f 100644
--- a/arch/x86/kernel/jump_label.c
+++ b/arch/x86/kernel/jump_label.c
@@ -24,8 +24,9 @@ union jump_code_union {
 	} __attribute__((packed));
 };
 
-void arch_jump_label_transform(struct jump_entry *entry,
-			       enum jump_label_type type)
+static void __jump_label_transform(struct jump_entry *entry,
+				   enum jump_label_type type,
+				   void *(*poker)(void *, const void *, size_t))
 {
 	union jump_code_union code;
 
@@ -35,11 +36,24 @@ void arch_jump_label_transform(struct jump_entry *entry,
 				(entry->code + JUMP_LABEL_NOP_SIZE);
 	} else
 		memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE);
+
+	(*poker)((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
+}
+
+void arch_jump_label_transform(struct jump_entry *entry,
+			       enum jump_label_type type)
+{
 	get_online_cpus();
 	mutex_lock(&text_mutex);
-	text_poke_smp((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
+	__jump_label_transform(entry, type, text_poke_smp);
 	mutex_unlock(&text_mutex);
 	put_online_cpus();
 }
 
+void arch_jump_label_transform_static(struct jump_entry *entry,
+				      enum jump_label_type type)
+{
+	__jump_label_transform(entry, type, text_poke_early);
+}
+
 #endif
-- 
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 Oct 04 13:37:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 13:37:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBBkH-00088F-MA; Tue, 04 Oct 2011 13:37:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBBjm-0007wH-Us
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 13:37:15 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317760615!52531226!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32304 invoked from network); 4 Oct 2011 20:36:55 -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;
	4 Oct 2011 20:36:55 -0000
X-IronPort-AV: E=Sophos;i="4.68,487,1312156800"; 
   d="scan'208";a="8211499"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	04 Oct 2011 20:37: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, 4 Oct 2011 21:37:11 +0100
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 1RBBjj-0007kb-7u;
	Tue, 04 Oct 2011 20:37:11 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RBBjj-0007Wi-7C;
	Tue, 04 Oct 2011 21:37:11 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9188-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 4 Oct 2011 21:37:11 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9188: 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 9188 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9188/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf    12 guest-saverestore.2 fail in 9187 REGR. vs. 9186

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf      8 debian-fixup                 fail pass in 9187

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                  0b66e6450ffe
baseline version:
 xen                  3d1664cc9e45

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
------------------------------------------------------------

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:   23903:0b66e6450ffe
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Oct 04 14:18:30 2011 +0200
    
    use xzalloc in x86 code
    
    This includes the removal of a redundant memset() from microcode_amd.c.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23902:4dc9c522abf5
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Oct 04 14:17:28 2011 +0200
    
    use xzalloc in driver code
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23901:a42af55d50fb
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Oct 04 14:16:32 2011 +0200
    
    use xzalloc in common code
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23900:e09ebf7a31f5
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Oct 04 14:15:26 2011 +0200
    
    introduce xzalloc() & Co
    
    Rather than having to match a call to one of the xmalloc() flavors with
    a subsequent memset(), introduce a zeroing variant of each of those
    flavors.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23899:a99d75671a91
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Oct 04 14:11:56 2011 +0200
    
    AMD-IOMMU: remove dead variable references
    
    These got orphaned up by recent changes.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23898:3d1664cc9e45
user:        Keir Fraser <keir@xen.org>
date:        Fri Sep 30 21:17:47 2011 +0100
    
    build: fix grep invocation in cc-options
    
    Currently the build produces lots of
            Usage: grep [OPTION]... PATTERN [FILE]...
            Try `grep --help' for more information.
    
    This is due to the "grep -- $(2)" in cc-options. It seems that the
    default of reading stdin is disabled when using "--". I don't know if
    this is a bug in grep or how it is supposed to be but we can work
    around it by explicitly passing in "-"
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
========================================
commit cd776ee9408ff127f934a707c1a339ee600bc127
Author: Ian Jackson <ian.jackson@eu.citrix.com>
Date:   Tue Jun 28 13:50:53 2011 +0100

    qemu-char.c: fix incorrect CONFIG_STUBDOM handling
    
    qemu-char.c:1123:7: warning: "CONFIG_STUBDOM" is not defined [-Wundef]
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-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 Tue Oct 04 14:45:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 14:45:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBCnV-0002uq-Pr; Tue, 04 Oct 2011 14:45:09 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBCmU-0002fl-Sj
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 14:44:18 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1317764616!51386504!1
X-Originating-IP: [192.55.52.88]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23325 invoked from network); 4 Oct 2011 21:43:37 -0000
Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88)
	by server-7.tower-27.messagelabs.com with SMTP;
	4 Oct 2011 21:43:37 -0000
Received: from fmsmga002.fm.intel.com ([10.253.24.26])
	by fmsmga101.fm.intel.com with ESMTP; 04 Oct 2011 14:44:02 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,487,1312182000"; d="scan'208,217";a="74590361"
Received: from orsmsx603.amr.corp.intel.com ([10.22.226.49])
	by fmsmga002.fm.intel.com with ESMTP; 04 Oct 2011 14:44:02 -0700
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; Tue, 4 Oct 2011 14:44:01 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx601.amr.corp.intel.com ([10.22.226.213]) with mapi;
	Tue, 4 Oct 2011 14:44:02 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Tue, 4 Oct 2011 14:44:01 -0700
Thread-Topic: build failure caused by $(XEN_ROOT)/.config
Thread-Index: AcyC3rqdQ0zXyMZ0RMWjkzVISQwRvQ==
Message-ID: <987664A83D2D224EAE907B061CE93D5301EE62D025@orsmsx505.amr.corp.intel.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: "keir@xen.org" <keir@xen.org>
Subject: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============1518978997=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1518978997==
Content-Language: en-US
Content-Type: multipart/alternative;
	boundary="_000_987664A83D2D224EAE907B061CE93D5301EE62D025orsmsx505amrc_"

--_000_987664A83D2D224EAE907B061CE93D5301EE62D025orsmsx505amrc_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Hi Keir,

I'm getting the following build error caused by "-include $(XEN_ROOT)/.conf=
ig" line in Config.mk.  Removing it from Config.mk makes the error go away.=
  The OS I'm using is FC15.  "$(XEN_ROOT)/.config" does not exist.

Allen

-------

make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
make[4]: *** ../../.config: Is a directory.  Stop.
make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
make[3]: *** [subdir-clean-check] Error 2
make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
make[2]: *** [subdirs-clean] Error 2
make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
make[1]: *** [clean] Error 2
make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
make: *** [world] Error 2

--_000_987664A83D2D224EAE907B061CE93D5301EE62D025orsmsx505amrc_
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 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;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";}
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;}
/* List Definitions */
@list l0
	{mso-list-id:965739186;
	mso-list-type:hybrid;
	mso-list-template-ids:1848293122 67698703 67698713 67698715 67698703 67698=
713 67698715 67698703 67698713 67698715;}
@list l0:level1
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level2
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level3
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
@list l0:level4
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level5
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level6
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
@list l0:level7
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level8
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level9
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
ol
	{margin-bottom:0in;}
ul
	{margin-bottom:0in;}
--></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>Hi Keir,<o:p></o=
:p></p><p class=3DMsoNormal><o:p>&nbsp;</o:p></p><p class=3DMsoNormal>I&#82=
17;m getting the following build error caused by &#8220;-include $(XEN_ROOT=
)/.config&#8221; line in Config.mk.&nbsp; Removing it from Config.mk makes =
the error go away.&nbsp; The OS I&#8217;m using is FC15.&nbsp; &#8220;$(XEN=
_ROOT)/.config&#8221; does not exist.<o:p></o:p></p><p class=3DMsoNormal><o=
:p>&nbsp;</o:p></p><p class=3DMsoNormal>Allen<o:p></o:p></p><p class=3DMsoN=
ormal><o:p>&nbsp;</o:p></p><p class=3DMsoNormal>-------<o:p></o:p></p><p cl=
ass=3DMsoNormal><o:p>&nbsp;</o:p></p><p class=3DMsoNormal>make[4]: Entering=
 directory `/home/akay/xen-4.1-testing.hg/tools/check'<o:p></o:p></p><p cla=
ss=3DMsoNormal>make[4]: *** ../../.config: Is a directory.&nbsp; Stop.<o:p>=
</o:p></p><p class=3DMsoNormal>make[4]: Leaving directory `/home/akay/xen-4=
.1-testing.hg/tools/check'<o:p></o:p></p><p class=3DMsoNormal>make[3]: *** =
[subdir-clean-check] Error 2<o:p></o:p></p><p class=3DMsoNormal>make[3]: Le=
aving directory `/home/akay/xen-4.1-testing.hg/tools'<o:p></o:p></p><p clas=
s=3DMsoNormal>make[2]: *** [subdirs-clean] Error 2<o:p></o:p></p><p class=
=3DMsoNormal>make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tool=
s'<o:p></o:p></p><p class=3DMsoNormal>make[1]: *** [clean] Error 2<o:p></o:=
p></p><p class=3DMsoNormal>make[1]: Leaving directory `/home/akay/xen-4.1-t=
esting.hg'<o:p></o:p></p><p class=3DMsoNormal>make: *** [world] Error 2<o:p=
></o:p></p></div></body></html>=

--_000_987664A83D2D224EAE907B061CE93D5301EE62D025orsmsx505amrc_--


--===============1518978997==
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

--===============1518978997==--


From xen-devel-bounces@lists.xensource.com Tue Oct 04 16:32:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16:32:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBETS-0005J6-Hz; Tue, 04 Oct 2011 16:32:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESP-00051F-4k
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:31 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-4.tower-27.messagelabs.com!1317771064!43036059!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17525 invoked from network); 4 Oct 2011 23:31:05 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-4.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 23:31:05 -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 69D568763;
	Tue,  4 Oct 2011 16:31:22 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id AD24320EDB; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:10 -0700
Message-Id: <7db4506ad0a64e20ccd9e258f30c026295a19552.1317763862.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V4 04/11] xen: defer spinlock setup until
	boot CPU setup
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

There's no need to do it at very early init, and doing it there
makes it impossible to use the jump_label machinery.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/xen/smp.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index e79dbb9..4dec905 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -200,6 +200,7 @@ static void __init xen_smp_prepare_boot_cpu(void)
 
 	xen_filter_cpu_maps();
 	xen_setup_vcpu_info_placement();
+	xen_init_spinlocks();
 }
 
 static void __init xen_smp_prepare_cpus(unsigned int max_cpus)
@@ -513,7 +514,6 @@ void __init xen_smp_init(void)
 {
 	smp_ops = xen_smp_ops;
 	xen_fill_possible_map();
-	xen_init_spinlocks();
 }
 
 static void __init xen_hvm_smp_prepare_cpus(unsigned int max_cpus)
-- 
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 Oct 04 16:33:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16:33:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBEUa-0005fm-NZ; Tue, 04 Oct 2011 16:33:44 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESP-00051G-9i
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:31 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-182.messagelabs.com!1317771084!18142964!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21135 invoked from network); 4 Oct 2011 23:31:26 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 23:31:26 -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 56D8D87AA;
	Tue,  4 Oct 2011 16:31:23 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 9B73520C63; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:08 -0700
Message-Id: <b6d44e8e22a3ccf6fca1ea574b72f988aa327009.1317763862.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V4 02/11] x86/ticketlock: don't inline
	_spin_unlock when using paravirt 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

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

The code size expands somewhat, and its probably better to just call
a function rather than inline it.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/Kconfig     |    3 +++
 kernel/Kconfig.locks |    2 +-
 2 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 6a47bb2..1f03f82 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -585,6 +585,9 @@ config PARAVIRT_SPINLOCKS
 
 	  If you are unsure how to answer this question, answer N.
 
+config ARCH_NOINLINE_SPIN_UNLOCK
+       def_bool PARAVIRT_SPINLOCKS
+
 config PARAVIRT_CLOCK
 	bool
 
diff --git a/kernel/Kconfig.locks b/kernel/Kconfig.locks
index 5068e2a..584637b 100644
--- a/kernel/Kconfig.locks
+++ b/kernel/Kconfig.locks
@@ -125,7 +125,7 @@ config INLINE_SPIN_LOCK_IRQSAVE
 		 ARCH_INLINE_SPIN_LOCK_IRQSAVE
 
 config INLINE_SPIN_UNLOCK
-	def_bool !DEBUG_SPINLOCK && (!PREEMPT || ARCH_INLINE_SPIN_UNLOCK)
+	def_bool !DEBUG_SPINLOCK && (!PREEMPT || ARCH_INLINE_SPIN_UNLOCK) && !ARCH_NOINLINE_SPIN_UNLOCK
 
 config INLINE_SPIN_UNLOCK_BH
 	def_bool !DEBUG_SPINLOCK && ARCH_INLINE_SPIN_UNLOCK_BH
-- 
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 Oct 04 16:34:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16:34:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBEVJ-00062E-9a; Tue, 04 Oct 2011 16:34:29 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESQ-00051H-6G
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:33 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317771085!27883032!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22787 invoked from network); 4 Oct 2011 23:31:26 -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; 4 Oct 2011 23:31:26 -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 6EEB88798;
	Tue,  4 Oct 2011 16:31:22 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id A452120C79; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:09 -0700
Message-Id: <6dbb707b0b761afa090c899d20c4198a6873fc7a.1317763862.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V4 03/11] x86/ticketlock: collapse a layer
	of 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

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Now that the paravirtualization layer doesn't exist at the spinlock
level any more, we can collapse the __ticket_ functions into the arch_
functions.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/include/asm/spinlock.h |   35 +++++------------------------------
 1 files changed, 5 insertions(+), 30 deletions(-)

diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index 5efd2f9..f0d6a59 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -76,7 +76,7 @@ static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __t
  * in the high part, because a wide xadd increment of the low part would carry
  * up and contaminate the high part.
  */
-static __always_inline void __ticket_spin_lock(struct arch_spinlock *lock)
+static __always_inline void arch_spin_lock(struct arch_spinlock *lock)
 {
 	register struct __raw_tickets inc = { .tail = 1 };
 
@@ -96,7 +96,7 @@ static __always_inline void __ticket_spin_lock(struct arch_spinlock *lock)
 out:	barrier();		/* make sure nothing creeps before the lock is taken */
 }
 
-static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
+static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
 {
 	arch_spinlock_t old, new;
 
@@ -110,7 +110,7 @@ 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;
 }
 
-static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
+static __always_inline void arch_spin_unlock(arch_spinlock_t *lock)
 {
 	__ticket_t next = lock->tickets.head + 1;
 
@@ -118,46 +118,21 @@ static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
 	__ticket_unlock_kick(lock, next);
 }
 
-static inline int __ticket_spin_is_locked(arch_spinlock_t *lock)
+static inline int arch_spin_is_locked(arch_spinlock_t *lock)
 {
 	struct __raw_tickets tmp = ACCESS_ONCE(lock->tickets);
 
 	return !!(tmp.tail ^ tmp.head);
 }
 
-static inline int __ticket_spin_is_contended(arch_spinlock_t *lock)
+static inline int arch_spin_is_contended(arch_spinlock_t *lock)
 {
 	struct __raw_tickets tmp = ACCESS_ONCE(lock->tickets);
 
 	return ((tmp.tail - tmp.head) & TICKET_MASK) > 1;
 }
-
-static inline int arch_spin_is_locked(arch_spinlock_t *lock)
-{
-	return __ticket_spin_is_locked(lock);
-}
-
-static inline int arch_spin_is_contended(arch_spinlock_t *lock)
-{
-	return __ticket_spin_is_contended(lock);
-}
 #define arch_spin_is_contended	arch_spin_is_contended
 
-static __always_inline void arch_spin_lock(arch_spinlock_t *lock)
-{
-	__ticket_spin_lock(lock);
-}
-
-static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
-{
-	return __ticket_spin_trylock(lock);
-}
-
-static __always_inline void arch_spin_unlock(arch_spinlock_t *lock)
-{
-	__ticket_spin_unlock(lock);
-}
-
 static __always_inline void arch_spin_lock_flags(arch_spinlock_t *lock,
 						  unsigned long flags)
 {
-- 
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 Oct 04 16:35:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16:35:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBEWR-0006UQ-JW; Tue, 04 Oct 2011 16:35:39 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESV-00051U-So
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:37 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-7.tower-27.messagelabs.com!1317771065!51391781!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15242 invoked from network); 4 Oct 2011 23:31:06 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 23:31: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 A087D87AF;
	Tue,  4 Oct 2011 16:31:29 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id E32F521105; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:16 -0700
Message-Id: <6a91a90d2dfa5fe1a3d5c932e5398475f1241296.1317763862.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V4 10/11] xen/pvticketlock: allow interrupts
	to be enabled while blocking
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

If interrupts were enabled when taking the spinlock, we can leave them
enabled while blocking to get the lock.

If we can enable interrupts while waiting for the lock to become
available, and we take an interrupt before entering the poll,
and the handler takes a spinlock which ends up going into
the slow state (invalidating the per-cpu "lock" and "want" values),
then when the interrupt handler returns the event channel will
remain pending so the poll will return immediately, causing it to
return out to the main spinlock loop.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/xen/spinlock.c |   48 ++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 41 insertions(+), 7 deletions(-)

diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 0a552ec..fc506e6 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -106,11 +106,28 @@ static void xen_lock_spinning(struct arch_spinlock *lock, __ticket_t want)
 
 	start = spin_time_start();
 
-	/* Make sure interrupts are disabled to ensure that these
-	   per-cpu values are not overwritten. */
+	/*
+	 * Make sure an interrupt handler can't upset things in a
+	 * partially setup state.
+	 */
 	local_irq_save(flags);
 
+	/*
+	 * We don't really care if we're overwriting some other
+	 * (lock,want) pair, as that would mean that we're currently
+	 * in an interrupt context, and the outer context had
+	 * interrupts enabled.  That has already kicked the VCPU out
+	 * of xen_poll_irq(), so it will just return spuriously and
+	 * retry with newly setup (lock,want).
+	 *
+	 * The ordering protocol on this is that the "lock" pointer
+	 * may only be set non-NULL if the "want" ticket is correct.
+	 * If we're updating "want", we must first clear "lock".
+	 */
+	w->lock = NULL;
+	smp_wmb();
 	w->want = want;
+	smp_wmb();
 	w->lock = lock;
 
 	/* This uses set_bit, which atomic and therefore a barrier */
@@ -124,21 +141,36 @@ static void xen_lock_spinning(struct arch_spinlock *lock, __ticket_t want)
 	/* Only check lock once pending cleared */
 	barrier();
 
-	/* Mark entry to slowpath before doing the pickup test to make
-	   sure we don't deadlock with an unlocker. */
+	/*
+	 * Mark entry to slowpath before doing the pickup test to make
+	 * sure we don't deadlock with an unlocker.
+	 */
 	__ticket_enter_slowpath(lock);
 
-	/* check again make sure it didn't become free while
-	   we weren't looking  */
+	/*
+	 * check again make sure it didn't become free while
+	 * we weren't looking 
+	 */
 	if (ACCESS_ONCE(lock->tickets.head) == want) {
 		ADD_STATS(taken_slow_pickup, 1);
 		goto out;
 	}
 
+	/* Allow interrupts while blocked */
+	local_irq_restore(flags);
+
+	/*
+	 * If an interrupt happens here, it will leave the wakeup irq
+	 * pending, which will cause xen_poll_irq() to return
+	 * immediately.
+	 */
+
 	/* Block until irq becomes pending (or perhaps a spurious wakeup) */
 	xen_poll_irq(irq);
 	ADD_STATS(taken_slow_spurious, !xen_test_irq_pending(irq));
 
+	local_irq_save(flags);
+
 	kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq));
 
 out:
@@ -160,7 +192,9 @@ static void xen_unlock_kick(struct arch_spinlock *lock, __ticket_t next)
 	for_each_cpu(cpu, &waiting_cpus) {
 		const struct xen_lock_waiting *w = &per_cpu(lock_waiting, cpu);
 
-		if (w->lock == lock && w->want == next) {
+		/* Make sure we read lock before want */
+		if (ACCESS_ONCE(w->lock) == lock &&
+		    ACCESS_ONCE(w->want) == next) {
 			ADD_STATS(released_slow_kicked, 1);
 			xen_send_IPI_one(cpu, XEN_SPIN_UNLOCK_VECTOR);
 			break;
-- 
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 Oct 04 16:36:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16:36:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBEXC-0006rB-PX; Tue, 04 Oct 2011 16:36:26 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESW-00051Z-Fi
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:37 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-14.tower-21.messagelabs.com!1317771082!62174723!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25313 invoked from network); 4 Oct 2011 23:31:24 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 23:31:24 -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 B1B1B87AD;
	Tue,  4 Oct 2011 16:31:23 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 904B4203CC; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:07 -0700
Message-Id: <33228d356eca9cdbd0448e82ef4bc14f00877500.1317763862.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V4 01/11] x86/spinlock: replace pv spinlocks
	with pv ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Rather than outright replacing the entire spinlock implementation in
order to paravirtualize it, keep the ticket lock implementation but add
a couple of pvops hooks on the slow patch (long spin on lock, unlocking
a contended lock).

Ticket locks have a number of nice properties, but they also have some
surprising behaviours in virtual environments.  They enforce a strict
FIFO ordering on cpus trying to take a lock; however, if the hypervisor
scheduler does not schedule the cpus in the correct order, the system can
waste a huge amount of time spinning until the next cpu can take the lock.

(See Thomas Friebel's talk "Prevent Guests from Spinning Around"
http://www.xen.org/files/xensummitboston08/LHP.pdf for more details.)

To address this, we add two hooks:
 - __ticket_spin_lock which is called after the cpu has been
   spinning on the lock for a significant number of iterations but has
   failed to take the lock (presumably because the cpu holding the lock
   has been descheduled).  The lock_spinning pvop is expected to block
   the cpu until it has been kicked by the current lock holder.
 - __ticket_spin_unlock, which on releasing a contended lock
   (there are more cpus with tail tickets), it looks to see if the next
   cpu is blocked and wakes it if so.

When compiled with CONFIG_PARAVIRT_SPINLOCKS disabled, a set of stub
functions causes all the extra code to go away.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/include/asm/paravirt.h       |   30 ++-----------------
 arch/x86/include/asm/paravirt_types.h |   10 ++----
 arch/x86/include/asm/spinlock.h       |   50 ++++++++++++++++++++++++++------
 arch/x86/include/asm/spinlock_types.h |    4 --
 arch/x86/kernel/paravirt-spinlocks.c  |   15 +--------
 arch/x86/xen/spinlock.c               |    7 ++++-
 6 files changed, 56 insertions(+), 60 deletions(-)

diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index a7d2db9..76cae7a 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -750,36 +750,14 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
 
 #if defined(CONFIG_SMP) && defined(CONFIG_PARAVIRT_SPINLOCKS)
 
-static inline int arch_spin_is_locked(struct arch_spinlock *lock)
+static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, __ticket_t ticket)
 {
-	return PVOP_CALL1(int, pv_lock_ops.spin_is_locked, lock);
+	PVOP_VCALL2(pv_lock_ops.lock_spinning, lock, ticket);
 }
 
-static inline int arch_spin_is_contended(struct arch_spinlock *lock)
+static __always_inline void ____ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
 {
-	return PVOP_CALL1(int, pv_lock_ops.spin_is_contended, lock);
-}
-#define arch_spin_is_contended	arch_spin_is_contended
-
-static __always_inline void arch_spin_lock(struct arch_spinlock *lock)
-{
-	PVOP_VCALL1(pv_lock_ops.spin_lock, lock);
-}
-
-static __always_inline void arch_spin_lock_flags(struct arch_spinlock *lock,
-						  unsigned long flags)
-{
-	PVOP_VCALL2(pv_lock_ops.spin_lock_flags, lock, flags);
-}
-
-static __always_inline int arch_spin_trylock(struct arch_spinlock *lock)
-{
-	return PVOP_CALL1(int, pv_lock_ops.spin_trylock, lock);
-}
-
-static __always_inline void arch_spin_unlock(struct arch_spinlock *lock)
-{
-	PVOP_VCALL1(pv_lock_ops.spin_unlock, lock);
+	PVOP_VCALL2(pv_lock_ops.unlock_kick, lock, ticket);
 }
 
 #endif
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 8e8b9a4..005e24d 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -327,13 +327,11 @@ struct pv_mmu_ops {
 };
 
 struct arch_spinlock;
+#include <asm/spinlock_types.h>
+
 struct pv_lock_ops {
-	int (*spin_is_locked)(struct arch_spinlock *lock);
-	int (*spin_is_contended)(struct arch_spinlock *lock);
-	void (*spin_lock)(struct arch_spinlock *lock);
-	void (*spin_lock_flags)(struct arch_spinlock *lock, unsigned long flags);
-	int (*spin_trylock)(struct arch_spinlock *lock);
-	void (*spin_unlock)(struct arch_spinlock *lock);
+	void (*lock_spinning)(struct arch_spinlock *lock, __ticket_t ticket);
+	void (*unlock_kick)(struct arch_spinlock *lock, __ticket_t ticket);
 };
 
 /* This contains all the paravirt structures: we get a convenient
diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index a82c2bf..5efd2f9 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -37,6 +37,32 @@
 # define UNLOCK_LOCK_PREFIX
 #endif
 
+/* How long a lock should spin before we consider blocking */
+#define SPIN_THRESHOLD	(1 << 11)
+
+#ifndef CONFIG_PARAVIRT_SPINLOCKS
+
+static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, __ticket_t ticket)
+{
+}
+
+static __always_inline void ____ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
+{
+}
+
+#endif	/* CONFIG_PARAVIRT_SPINLOCKS */
+
+
+/* 
+ * If a spinlock has someone waiting on it, then kick the appropriate
+ * waiting cpu.
+ */
+static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t next)
+{
+	if (unlikely(lock->tickets.tail != next))
+		____ticket_unlock_kick(lock, next);
+}
+
 /*
  * Ticket locks are conceptually two parts, one indicating the current head of
  * the queue, and the other indicating the current tail. The lock is acquired
@@ -50,19 +76,24 @@
  * in the high part, because a wide xadd increment of the low part would carry
  * up and contaminate the high part.
  */
-static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)
+static __always_inline void __ticket_spin_lock(struct arch_spinlock *lock)
 {
 	register struct __raw_tickets inc = { .tail = 1 };
 
 	inc = xadd(&lock->tickets, inc);
 
 	for (;;) {
-		if (inc.head == inc.tail)
-			break;
-		cpu_relax();
-		inc.head = ACCESS_ONCE(lock->tickets.head);
+		unsigned count = SPIN_THRESHOLD;
+
+		do {
+			if (inc.head == inc.tail)
+				goto out;
+			cpu_relax();
+			inc.head = ACCESS_ONCE(lock->tickets.head);
+		} while (--count);
+		__ticket_lock_spinning(lock, inc.tail);
 	}
-	barrier();		/* make sure nothing creeps before the lock is taken */
+out:	barrier();		/* make sure nothing creeps before the lock is taken */
 }
 
 static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
@@ -81,7 +112,10 @@ static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
 
 static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
 {
+	__ticket_t next = lock->tickets.head + 1;
+
 	__add(&lock->tickets.head, 1, UNLOCK_LOCK_PREFIX);
+	__ticket_unlock_kick(lock, next);
 }
 
 static inline int __ticket_spin_is_locked(arch_spinlock_t *lock)
@@ -98,8 +132,6 @@ static inline int __ticket_spin_is_contended(arch_spinlock_t *lock)
 	return ((tmp.tail - tmp.head) & TICKET_MASK) > 1;
 }
 
-#ifndef CONFIG_PARAVIRT_SPINLOCKS
-
 static inline int arch_spin_is_locked(arch_spinlock_t *lock)
 {
 	return __ticket_spin_is_locked(lock);
@@ -132,8 +164,6 @@ static __always_inline void arch_spin_lock_flags(arch_spinlock_t *lock,
 	arch_spin_lock(lock);
 }
 
-#endif	/* CONFIG_PARAVIRT_SPINLOCKS */
-
 static inline void arch_spin_unlock_wait(arch_spinlock_t *lock)
 {
 	while (arch_spin_is_locked(lock))
diff --git a/arch/x86/include/asm/spinlock_types.h b/arch/x86/include/asm/spinlock_types.h
index 8ebd5df..dbe223d 100644
--- a/arch/x86/include/asm/spinlock_types.h
+++ b/arch/x86/include/asm/spinlock_types.h
@@ -1,10 +1,6 @@
 #ifndef _ASM_X86_SPINLOCK_TYPES_H
 #define _ASM_X86_SPINLOCK_TYPES_H
 
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
 #include <linux/types.h>
 
 #if (CONFIG_NR_CPUS < 256)
diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c
index 676b8c7..c2e010e 100644
--- a/arch/x86/kernel/paravirt-spinlocks.c
+++ b/arch/x86/kernel/paravirt-spinlocks.c
@@ -7,21 +7,10 @@
 
 #include <asm/paravirt.h>
 
-static inline void
-default_spin_lock_flags(arch_spinlock_t *lock, unsigned long flags)
-{
-	arch_spin_lock(lock);
-}
-
 struct pv_lock_ops pv_lock_ops = {
 #ifdef CONFIG_SMP
-	.spin_is_locked = __ticket_spin_is_locked,
-	.spin_is_contended = __ticket_spin_is_contended,
-
-	.spin_lock = __ticket_spin_lock,
-	.spin_lock_flags = default_spin_lock_flags,
-	.spin_trylock = __ticket_spin_trylock,
-	.spin_unlock = __ticket_spin_unlock,
+	.lock_spinning = paravirt_nop,
+	.unlock_kick = paravirt_nop,
 #endif
 };
 EXPORT_SYMBOL(pv_lock_ops);
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index cc9b1e1..23af06a 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -121,6 +121,9 @@ struct xen_spinlock {
 	unsigned short spinners;	/* count of waiting cpus */
 };
 
+static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
+
+#if 0
 static int xen_spin_is_locked(struct arch_spinlock *lock)
 {
 	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
@@ -148,7 +151,6 @@ static int xen_spin_trylock(struct arch_spinlock *lock)
 	return old == 0;
 }
 
-static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
 static DEFINE_PER_CPU(struct xen_spinlock *, lock_spinners);
 
 /*
@@ -338,6 +340,7 @@ static void xen_spin_unlock(struct arch_spinlock *lock)
 	if (unlikely(xl->spinners))
 		xen_spin_unlock_slow(xl);
 }
+#endif
 
 static irqreturn_t dummy_handler(int irq, void *dev_id)
 {
@@ -373,12 +376,14 @@ void xen_uninit_lock_cpu(int cpu)
 
 void __init xen_init_spinlocks(void)
 {
+#if 0
 	pv_lock_ops.spin_is_locked = xen_spin_is_locked;
 	pv_lock_ops.spin_is_contended = xen_spin_is_contended;
 	pv_lock_ops.spin_lock = xen_spin_lock;
 	pv_lock_ops.spin_lock_flags = xen_spin_lock_flags;
 	pv_lock_ops.spin_trylock = xen_spin_trylock;
 	pv_lock_ops.spin_unlock = xen_spin_unlock;
+#endif
 }
 
 #ifdef CONFIG_XEN_DEBUG_FS
-- 
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 Oct 04 16:37:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16: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 1RBEXw-0007Dt-5Y; Tue, 04 Oct 2011 16:37:12 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESW-00051W-0H
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:38 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-8.tower-21.messagelabs.com!1317771074!61563041!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28477 invoked from network); 4 Oct 2011 23:31:15 -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; 4 Oct 2011 23:31:15 -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 4FB2A87B2;
	Tue,  4 Oct 2011 16:31:30 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id BF68221101; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:12 -0700
Message-Id: <58ca1ea5c2cd3a0d6ee6d20fae17bf4a813e8b06.1317763862.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V4 06/11] xen/pvticketlocks: add
	xen_nopvspin parameter to disable xen pv ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/xen/spinlock.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index f6133c5..1e21c99 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -195,12 +195,26 @@ void xen_uninit_lock_cpu(int cpu)
 	unbind_from_irqhandler(per_cpu(lock_kicker_irq, cpu), NULL);
 }
 
+static bool xen_pvspin __initdata = true;
+
 void __init xen_init_spinlocks(void)
 {
+	if (!xen_pvspin) {
+		printk(KERN_DEBUG "xen: PV spinlocks disabled\n");
+		return;
+	}
+
 	pv_lock_ops.lock_spinning = xen_lock_spinning;
 	pv_lock_ops.unlock_kick = xen_unlock_kick;
 }
 
+static __init int xen_parse_nopvspin(char *arg)
+{
+	xen_pvspin = false;
+	return 0;
+}
+early_param("xen_nopvspin", xen_parse_nopvspin);
+
 #ifdef CONFIG_XEN_DEBUG_FS
 
 static struct dentry *d_spin_debug;
-- 
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 Oct 04 16:37:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16:37:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBEYe-0007Zw-SE; Tue, 04 Oct 2011 16:37:56 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESY-00051k-24
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:38 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-27.messagelabs.com!1317771067!40438712!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28739 invoked from network); 4 Oct 2011 23:31:09 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 23:31:09 -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 67B5087B3;
	Tue,  4 Oct 2011 16:31:30 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id D12B721103; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:14 -0700
Message-Id: <79ae0a17bf2b10eb8d89102ede53b6c2d08dfe94.1317763862.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V4 08/11] x86/pvticketlock: when
	paravirtualizing ticket locks, increment by 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

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Increment ticket head/tails by 2 rather than 1 to leave the LSB free
to store a "is in slowpath state" bit.  This halves the number
of possible CPUs for a given ticket size, but this shouldn't matter
in practice - kernels built for 32k+ CPU systems are probably
specially built for the hardware rather than a generic distro
kernel.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/include/asm/spinlock.h       |   10 +++++-----
 arch/x86/include/asm/spinlock_types.h |   10 +++++++++-
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index f0d6a59..dd155f7 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -78,7 +78,7 @@ static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __t
  */
 static __always_inline void arch_spin_lock(struct arch_spinlock *lock)
 {
-	register struct __raw_tickets inc = { .tail = 1 };
+	register struct __raw_tickets inc = { .tail = TICKET_LOCK_INC };
 
 	inc = xadd(&lock->tickets, inc);
 
@@ -104,7 +104,7 @@ static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
 	if (old.tickets.head != old.tickets.tail)
 		return 0;
 
-	new.head_tail = old.head_tail + (1 << TICKET_SHIFT);
+	new.head_tail = old.head_tail + (TICKET_LOCK_INC << TICKET_SHIFT);
 
 	/* cmpxchg is a full barrier, so nothing can move before it */
 	return cmpxchg(&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail;
@@ -112,9 +112,9 @@ static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
 
 static __always_inline void arch_spin_unlock(arch_spinlock_t *lock)
 {
-	__ticket_t next = lock->tickets.head + 1;
+	__ticket_t next = lock->tickets.head + TICKET_LOCK_INC;
 
-	__add(&lock->tickets.head, 1, UNLOCK_LOCK_PREFIX);
+	__add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX);
 	__ticket_unlock_kick(lock, next);
 }
 
@@ -129,7 +129,7 @@ static inline int arch_spin_is_contended(arch_spinlock_t *lock)
 {
 	struct __raw_tickets tmp = ACCESS_ONCE(lock->tickets);
 
-	return ((tmp.tail - tmp.head) & TICKET_MASK) > 1;
+	return ((tmp.tail - tmp.head) & TICKET_MASK) > TICKET_LOCK_INC;
 }
 #define arch_spin_is_contended	arch_spin_is_contended
 
diff --git a/arch/x86/include/asm/spinlock_types.h b/arch/x86/include/asm/spinlock_types.h
index dbe223d..aa9a205 100644
--- a/arch/x86/include/asm/spinlock_types.h
+++ b/arch/x86/include/asm/spinlock_types.h
@@ -3,7 +3,13 @@
 
 #include <linux/types.h>
 
-#if (CONFIG_NR_CPUS < 256)
+#ifdef CONFIG_PARAVIRT_SPINLOCKS
+#define __TICKET_LOCK_INC	2
+#else
+#define __TICKET_LOCK_INC	1
+#endif
+
+#if (CONFIG_NR_CPUS < (256 / __TICKET_LOCK_INC))
 typedef u8  __ticket_t;
 typedef u16 __ticketpair_t;
 #else
@@ -11,6 +17,8 @@ typedef u16 __ticket_t;
 typedef u32 __ticketpair_t;
 #endif
 
+#define TICKET_LOCK_INC	((__ticket_t)__TICKET_LOCK_INC)
+
 #define TICKET_SHIFT	(sizeof(__ticket_t) * 8)
 #define TICKET_MASK	((__ticket_t)((1 << TICKET_SHIFT) - 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 Oct 04 16:38:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16:38:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBEZL-0007wW-Gh; Tue, 04 Oct 2011 16:38:39 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESW-00051V-0H
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:38 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-7.tower-21.messagelabs.com!1317771059!57441880!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6189 invoked from network); 4 Oct 2011 23:31:00 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 23:31:00 -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 A0BDA87B0;
	Tue,  4 Oct 2011 16:31:29 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 8A620209BF; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:06 -0700
Message-Id: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V4 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

[ Changes since last posting:

  - Stephan Diestelhorst <stephan.diestelhorst@amd.com> pointed out
    that my old unlock code was unsound, and could lead to deadlocks
    (at least in principle).  The new unlock code is definitely sound,
    but likely slower as it introduces a locked xadd; this seems
    unavoidable.  However, when PV ticketlocks are not enabled, the
    unlock code is as it normally would be (a single unlocked add),
    and it uses the jump-label machinery to make the selection at
    runtime.
]

NOTE: this series is available in:
      git://github.com/jsgf/linux-xen.git upstream/pvticketlock-slowflag
and is based on the previously posted ticketlock cleanup series in
      git://github.com/jsgf/linux-xen.git upstream/ticketlock-cleanup

This series replaces the existing paravirtualized spinlock mechanism
with a paravirtualized ticketlock mechanism.

Ticket locks have an inherent problem in a virtualized case, because
the vCPUs are scheduled rather than running concurrently (ignoring
gang scheduled vCPUs).  This can result in catastrophic performance
collapses when the vCPU scheduler doesn't schedule the correct "next"
vCPU, and ends up scheduling a vCPU which burns its entire timeslice
spinning.  (Note that this is not the same problem as lock-holder
preemption, which this series also addresses; that's also a problem,
but not catastrophic).

(See Thomas Friebel's talk "Prevent Guests from Spinning Around"
http://www.xen.org/files/xensummitboston08/LHP.pdf for more details.)

Currently we deal with this by having PV spinlocks, which adds a layer
of indirection in front of all the spinlock functions, and defining a
completely new implementation for Xen (and for other pvops users, but
there are none at present).

PV ticketlocks keeps the existing ticketlock implemenentation
(fastpath) as-is, but adds a couple of pvops for the slow paths:

- If a CPU has been waiting for a spinlock for SPIN_THRESHOLD
  iterations, then call out to the __ticket_lock_spinning() pvop,
  which allows a backend to block the vCPU rather than spinning.  This
  pvop can set the lock into "slowpath state".

- When releasing a lock, if it is in "slowpath state", the call
  __ticket_unlock_kick() to kick the next vCPU in line awake.  If the
  lock is no longer in contention, it also clears the slowpath flag.

The "slowpath state" is stored in the LSB of the within the lock tail
ticket.  This has the effect of reducing the max number of CPUs by
half (so, a "small ticket" can deal with 128 CPUs, and "large ticket"
32768).

This series provides a Xen implementation, but it should be
straightforward to add a KVM implementation as well.

Overall, it results in a large reduction in code, it makes the native
and virtualized cases closer, and it removes a layer of indirection
around all the spinlock functions.

The fast path (taking an uncontended lock which isn't in "slowpath"
state) is optimal, identical to the non-paravirtualized case.

The inner part of ticket lock code becomes:
	inc = xadd(&lock->tickets, inc);
	inc.tail &= ~TICKET_SLOWPATH_FLAG;

	if (likely(inc.head == inc.tail))
		goto out;

	for (;;) {
		unsigned count = SPIN_THRESHOLD;

		do {
			if (ACCESS_ONCE(lock->tickets.head) == inc.tail)
				goto out;
			cpu_relax();
		} while (--count);
		__ticket_lock_spinning(lock, inc.tail);
	}
out:	barrier();

which results in:
	push   %rbp
	mov    %rsp,%rbp

	mov    $0x200,%eax
	lock xadd %ax,(%rdi)
	movzbl %ah,%edx
	cmp    %al,%dl
	jne    1f	# Slowpath if lock in contention

	pop    %rbp
	retq   

	### SLOWPATH START
1:	and    $-2,%edx
	movzbl %dl,%esi

2:	mov    $0x800,%eax
	jmp    4f

3:	pause  
	sub    $0x1,%eax
	je     5f

4:	movzbl (%rdi),%ecx
	cmp    %cl,%dl
	jne    3b

	pop    %rbp
	retq   

5:	callq  *__ticket_lock_spinning
	jmp    2b
	### SLOWPATH END

with CONFIG_PARAVIRT_SPINLOCKS=n, the code has changed slightly, where
the fastpath case is straight through (taking the lock without
contention), and the spin loop is out of line:

	push   %rbp
	mov    %rsp,%rbp

	mov    $0x100,%eax
	lock xadd %ax,(%rdi)
	movzbl %ah,%edx
	cmp    %al,%dl
	jne    1f

	pop    %rbp
	retq   

	### SLOWPATH START
1:	pause  
	movzbl (%rdi),%eax
	cmp    %dl,%al
	jne    1b

	pop    %rbp
	retq   
	### SLOWPATH END

The unlock code is complicated by the need to both add to the lock's
"head" and fetch the slowpath flag from "tail".  This version of the
patch uses a locked xadd to do this, along with a correction to
prevent an overflow in "head" from leaking into "tail".

This is is all unnecessary complication if you're not using PV ticket
locks, it also uses the jump-label machinery to use the standard
"add"-based unlock in the non-PV case.

	if (TICKET_SLOWPATH_FLAG &&
	    unlikely(static_branch(&paravirt_ticketlocks_enabled))) {
		arch_spinlock_t prev;
		__ticketpair_t inc = TICKET_LOCK_INC;

		if (lock->tickets.head >= (1 << TICKET_SHIFT) - TICKET_LOCK_INC)
			inc += -1 << TICKET_SHIFT;

		prev.head_tail = xadd(&lock->head_tail, inc);

		if (unlikely(prev.tickets.tail & TICKET_SLOWPATH_FLAG))
			__ticket_unlock_slowpath(lock, prev);
	} else
		__add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX);

which generates:
	push   %rbp
	mov    %rsp,%rbp

	nop5	# replaced by 5-byte jmp 2f when PV enabled

	# non-PV unlock
	addb   $0x2,(%rdi)

1:	pop    %rbp
	retq   

### PV unlock ###
2:	cmpb   $254,(%rdi)	# cmp head >= 254
	sbb    %esi,%esi	# esi = carry ? 0xffff : 0x0000
	and    $0x100,%si	# si = 0x0100 or 0x0000
	sub    $254,%si		# si = 0x0002 or 0xff02
	lock xadd %si,(%rdi)
	test   $0x100,%si	# Test slowpath flag
	je     1b		# Done if clear

### Slow path ###
	add    $2,%sil		# Add "head" in old lock state
	mov    %esi,%edx
	and    $0xfe,%dh	# clear slowflag for comparison
	movzbl %dh,%eax
	cmp    %dl,%al		# If head == tail (uncontended)
	je     4f		# clear slowpath flag

	# Kick next CPU waiting for lock
3:	movzbl %sil,%esi
	callq  *pv_lock_ops.kick

	pop    %rbp
	retq   

	# Lock no longer contended - clear slowflag
4:	mov    %esi,%eax
	lock cmpxchg %dx,(%rdi)	# cmpxchg to clear flag
	cmp    %si,%ax
	jne    3b		# If clear failed, then kick

	pop    %rbp
	retq   

So when not using PV ticketlocks, the unlock sequence just has a
5-byte nop added to it, and the PV case is reasonable straightforward
aside from requiring a "lock xadd".

Thoughts? Comments? Suggestions?

Jeremy Fitzhardinge (10):
  x86/spinlock: replace pv spinlocks with pv ticketlocks
  x86/ticketlock: don't inline _spin_unlock when using paravirt
    spinlocks
  x86/ticketlock: collapse a layer of functions
  xen: defer spinlock setup until boot CPU setup
  xen/pvticketlock: Xen implementation for PV ticket locks
  xen/pvticketlocks: add xen_nopvspin parameter to disable xen pv
    ticketlocks
  x86/pvticketlock: use callee-save for lock_spinning
  x86/pvticketlock: when paravirtualizing ticket locks, increment by 2
  x86/ticketlock: add slowpath logic
  xen/pvticketlock: allow interrupts to be enabled while blocking

Stefano Stabellini (1):
  xen: enable PV ticketlocks on HVM Xen

 arch/x86/Kconfig                      |    3 +
 arch/x86/include/asm/paravirt.h       |   30 +---
 arch/x86/include/asm/paravirt_types.h |   10 +-
 arch/x86/include/asm/spinlock.h       |  139 ++++++++++-----
 arch/x86/include/asm/spinlock_types.h |   16 +-
 arch/x86/kernel/paravirt-spinlocks.c  |   18 +--
 arch/x86/xen/smp.c                    |    3 +-
 arch/x86/xen/spinlock.c               |  331 ++++++++++-----------------------
 kernel/Kconfig.locks                  |    2 +-
 9 files changed, 221 insertions(+), 331 deletions(-)

-- 
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 Oct 04 16:39:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16:39:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBEa9-0008JP-Vt; Tue, 04 Oct 2011 16:39:30 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESX-00051g-DP
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:38 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-7.tower-182.messagelabs.com!1317771092!15917425!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23953 invoked from network); 4 Oct 2011 23:31:34 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-7.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 23:31:34 -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 17DA587B1;
	Tue,  4 Oct 2011 16:31:30 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id B67B22100B; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:11 -0700
Message-Id: <91538058f37a3b48ed037fb78b46a3225492103c.1317763862.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V4 05/11] xen/pvticketlock: Xen
	implementation for PV ticket locks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Replace the old Xen implementation of PV spinlocks with and implementation
of xen_lock_spinning and xen_unlock_kick.

xen_lock_spinning simply registers the cpu in its entry in lock_waiting,
adds itself to the waiting_cpus set, and blocks on an event channel
until the channel becomes pending.

xen_unlock_kick searches the cpus in waiting_cpus looking for the one
which next wants this lock with the next ticket, if any.  If found,
it kicks it by making its event channel pending, which wakes it up.

We need to make sure interrupts are disabled while we're relying on the
contents of the per-cpu lock_waiting values, otherwise an interrupt
handler could come in, try to take some other lock, block, and overwrite
our values.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/xen/spinlock.c |  287 +++++++----------------------------------------
 1 files changed, 43 insertions(+), 244 deletions(-)

diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 23af06a..f6133c5 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -19,32 +19,21 @@
 #ifdef CONFIG_XEN_DEBUG_FS
 static struct xen_spinlock_stats
 {
-	u64 taken;
 	u32 taken_slow;
-	u32 taken_slow_nested;
 	u32 taken_slow_pickup;
 	u32 taken_slow_spurious;
-	u32 taken_slow_irqenable;
 
-	u64 released;
 	u32 released_slow;
 	u32 released_slow_kicked;
 
 #define HISTO_BUCKETS	30
-	u32 histo_spin_total[HISTO_BUCKETS+1];
-	u32 histo_spin_spinning[HISTO_BUCKETS+1];
 	u32 histo_spin_blocked[HISTO_BUCKETS+1];
 
-	u64 time_total;
-	u64 time_spinning;
 	u64 time_blocked;
 } spinlock_stats;
 
 static u8 zero_stats;
 
-static unsigned lock_timeout = 1 << 10;
-#define TIMEOUT lock_timeout
-
 static inline void check_zero(void)
 {
 	if (unlikely(zero_stats)) {
@@ -73,22 +62,6 @@ static void __spin_time_accum(u64 delta, u32 *array)
 		array[HISTO_BUCKETS]++;
 }
 
-static inline void spin_time_accum_spinning(u64 start)
-{
-	u32 delta = xen_clocksource_read() - start;
-
-	__spin_time_accum(delta, spinlock_stats.histo_spin_spinning);
-	spinlock_stats.time_spinning += delta;
-}
-
-static inline void spin_time_accum_total(u64 start)
-{
-	u32 delta = xen_clocksource_read() - start;
-
-	__spin_time_accum(delta, spinlock_stats.histo_spin_total);
-	spinlock_stats.time_total += delta;
-}
-
 static inline void spin_time_accum_blocked(u64 start)
 {
 	u32 delta = xen_clocksource_read() - start;
@@ -105,214 +78,84 @@ static inline u64 spin_time_start(void)
 	return 0;
 }
 
-static inline void spin_time_accum_total(u64 start)
-{
-}
-static inline void spin_time_accum_spinning(u64 start)
-{
-}
 static inline void spin_time_accum_blocked(u64 start)
 {
 }
 #endif  /* CONFIG_XEN_DEBUG_FS */
 
-struct xen_spinlock {
-	unsigned char lock;		/* 0 -> free; 1 -> locked */
-	unsigned short spinners;	/* count of waiting cpus */
+struct xen_lock_waiting {
+	struct arch_spinlock *lock;
+	__ticket_t want;
 };
 
 static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
+static DEFINE_PER_CPU(struct xen_lock_waiting, lock_waiting);
+static cpumask_t waiting_cpus;
 
-#if 0
-static int xen_spin_is_locked(struct arch_spinlock *lock)
-{
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-
-	return xl->lock != 0;
-}
-
-static int xen_spin_is_contended(struct arch_spinlock *lock)
+static void xen_lock_spinning(struct arch_spinlock *lock, __ticket_t want)
 {
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-
-	/* Not strictly true; this is only the count of contended
-	   lock-takers entering the slow path. */
-	return xl->spinners != 0;
-}
-
-static int xen_spin_trylock(struct arch_spinlock *lock)
-{
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-	u8 old = 1;
-
-	asm("xchgb %b0,%1"
-	    : "+q" (old), "+m" (xl->lock) : : "memory");
-
-	return old == 0;
-}
-
-static DEFINE_PER_CPU(struct xen_spinlock *, lock_spinners);
-
-/*
- * Mark a cpu as interested in a lock.  Returns the CPU's previous
- * lock of interest, in case we got preempted by an interrupt.
- */
-static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl)
-{
-	struct xen_spinlock *prev;
-
-	prev = __this_cpu_read(lock_spinners);
-	__this_cpu_write(lock_spinners, xl);
-
-	wmb();			/* set lock of interest before count */
-
-	asm(LOCK_PREFIX " incw %0"
-	    : "+m" (xl->spinners) : : "memory");
-
-	return prev;
-}
-
-/*
- * Mark a cpu as no longer interested in a lock.  Restores previous
- * lock of interest (NULL for none).
- */
-static inline void unspinning_lock(struct xen_spinlock *xl, struct xen_spinlock *prev)
-{
-	asm(LOCK_PREFIX " decw %0"
-	    : "+m" (xl->spinners) : : "memory");
-	wmb();			/* decrement count before restoring lock */
-	__this_cpu_write(lock_spinners, prev);
-}
-
-static noinline int xen_spin_lock_slow(struct arch_spinlock *lock, bool irq_enable)
-{
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-	struct xen_spinlock *prev;
 	int irq = __this_cpu_read(lock_kicker_irq);
-	int ret;
+	struct xen_lock_waiting *w = &__get_cpu_var(lock_waiting);
+	int cpu = smp_processor_id();
 	u64 start;
+	unsigned long flags;
 
 	/* If kicker interrupts not initialized yet, just spin */
 	if (irq == -1)
-		return 0;
+		return;
 
 	start = spin_time_start();
 
-	/* announce we're spinning */
-	prev = spinning_lock(xl);
+	/* Make sure interrupts are disabled to ensure that these
+	   per-cpu values are not overwritten. */
+	local_irq_save(flags);
+
+	w->want = want;
+	w->lock = lock;
+
+	/* This uses set_bit, which atomic and therefore a barrier */
+	cpumask_set_cpu(cpu, &waiting_cpus);
 
 	ADD_STATS(taken_slow, 1);
-	ADD_STATS(taken_slow_nested, prev != NULL);
-
-	do {
-		unsigned long flags;
-
-		/* clear pending */
-		xen_clear_irq_pending(irq);
-
-		/* check again make sure it didn't become free while
-		   we weren't looking  */
-		ret = xen_spin_trylock(lock);
-		if (ret) {
-			ADD_STATS(taken_slow_pickup, 1);
-
-			/*
-			 * If we interrupted another spinlock while it
-			 * was blocking, make sure it doesn't block
-			 * without rechecking the lock.
-			 */
-			if (prev != NULL)
-				xen_set_irq_pending(irq);
-			goto out;
-		}
 
-		flags = arch_local_save_flags();
-		if (irq_enable) {
-			ADD_STATS(taken_slow_irqenable, 1);
-			raw_local_irq_enable();
-		}
+	/* clear pending */
+	xen_clear_irq_pending(irq);
 
-		/*
-		 * Block until irq becomes pending.  If we're
-		 * interrupted at this point (after the trylock but
-		 * before entering the block), then the nested lock
-		 * handler guarantees that the irq will be left
-		 * pending if there's any chance the lock became free;
-		 * xen_poll_irq() returns immediately if the irq is
-		 * pending.
-		 */
-		xen_poll_irq(irq);
+	/* Only check lock once pending cleared */
+	barrier();
 
-		raw_local_irq_restore(flags);
+	/* check again make sure it didn't become free while
+	   we weren't looking  */
+	if (ACCESS_ONCE(lock->tickets.head) == want) {
+		ADD_STATS(taken_slow_pickup, 1);
+		goto out;
+	}
 
-		ADD_STATS(taken_slow_spurious, !xen_test_irq_pending(irq));
-	} while (!xen_test_irq_pending(irq)); /* check for spurious wakeups */
+	/* Block until irq becomes pending (or perhaps a spurious wakeup) */
+	xen_poll_irq(irq);
+	ADD_STATS(taken_slow_spurious, !xen_test_irq_pending(irq));
 
 	kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq));
 
 out:
-	unspinning_lock(xl, prev);
-	spin_time_accum_blocked(start);
-
-	return ret;
-}
-
-static inline void __xen_spin_lock(struct arch_spinlock *lock, bool irq_enable)
-{
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-	unsigned timeout;
-	u8 oldval;
-	u64 start_spin;
-
-	ADD_STATS(taken, 1);
-
-	start_spin = spin_time_start();
-
-	do {
-		u64 start_spin_fast = spin_time_start();
-
-		timeout = TIMEOUT;
+	cpumask_clear_cpu(cpu, &waiting_cpus);
+	w->lock = NULL;
 
-		asm("1: xchgb %1,%0\n"
-		    "   testb %1,%1\n"
-		    "   jz 3f\n"
-		    "2: rep;nop\n"
-		    "   cmpb $0,%0\n"
-		    "   je 1b\n"
-		    "   dec %2\n"
-		    "   jnz 2b\n"
-		    "3:\n"
-		    : "+m" (xl->lock), "=q" (oldval), "+r" (timeout)
-		    : "1" (1)
-		    : "memory");
+	local_irq_restore(flags);
 
-		spin_time_accum_spinning(start_spin_fast);
-
-	} while (unlikely(oldval != 0 &&
-			  (TIMEOUT == ~0 || !xen_spin_lock_slow(lock, irq_enable))));
-
-	spin_time_accum_total(start_spin);
-}
-
-static void xen_spin_lock(struct arch_spinlock *lock)
-{
-	__xen_spin_lock(lock, false);
-}
-
-static void xen_spin_lock_flags(struct arch_spinlock *lock, unsigned long flags)
-{
-	__xen_spin_lock(lock, !raw_irqs_disabled_flags(flags));
+	spin_time_accum_blocked(start);
 }
 
-static noinline void xen_spin_unlock_slow(struct xen_spinlock *xl)
+static void xen_unlock_kick(struct arch_spinlock *lock, __ticket_t next)
 {
 	int cpu;
 
 	ADD_STATS(released_slow, 1);
 
-	for_each_online_cpu(cpu) {
-		/* XXX should mix up next cpu selection */
-		if (per_cpu(lock_spinners, cpu) == xl) {
+	for_each_cpu(cpu, &waiting_cpus) {
+		const struct xen_lock_waiting *w = &per_cpu(lock_waiting, cpu);
+
+		if (w->lock == lock && w->want == next) {
 			ADD_STATS(released_slow_kicked, 1);
 			xen_send_IPI_one(cpu, XEN_SPIN_UNLOCK_VECTOR);
 			break;
@@ -320,28 +163,6 @@ static noinline void xen_spin_unlock_slow(struct xen_spinlock *xl)
 	}
 }
 
-static void xen_spin_unlock(struct arch_spinlock *lock)
-{
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-
-	ADD_STATS(released, 1);
-
-	smp_wmb();		/* make sure no writes get moved after unlock */
-	xl->lock = 0;		/* release lock */
-
-	/*
-	 * Make sure unlock happens before checking for waiting
-	 * spinners.  We need a strong barrier to enforce the
-	 * write-read ordering to different memory locations, as the
-	 * CPU makes no implied guarantees about their ordering.
-	 */
-	mb();
-
-	if (unlikely(xl->spinners))
-		xen_spin_unlock_slow(xl);
-}
-#endif
-
 static irqreturn_t dummy_handler(int irq, void *dev_id)
 {
 	BUG();
@@ -376,14 +197,8 @@ void xen_uninit_lock_cpu(int cpu)
 
 void __init xen_init_spinlocks(void)
 {
-#if 0
-	pv_lock_ops.spin_is_locked = xen_spin_is_locked;
-	pv_lock_ops.spin_is_contended = xen_spin_is_contended;
-	pv_lock_ops.spin_lock = xen_spin_lock;
-	pv_lock_ops.spin_lock_flags = xen_spin_lock_flags;
-	pv_lock_ops.spin_trylock = xen_spin_trylock;
-	pv_lock_ops.spin_unlock = xen_spin_unlock;
-#endif
+	pv_lock_ops.lock_spinning = xen_lock_spinning;
+	pv_lock_ops.unlock_kick = xen_unlock_kick;
 }
 
 #ifdef CONFIG_XEN_DEBUG_FS
@@ -401,37 +216,21 @@ static int __init xen_spinlock_debugfs(void)
 
 	debugfs_create_u8("zero_stats", 0644, d_spin_debug, &zero_stats);
 
-	debugfs_create_u32("timeout", 0644, d_spin_debug, &lock_timeout);
-
-	debugfs_create_u64("taken", 0444, d_spin_debug, &spinlock_stats.taken);
 	debugfs_create_u32("taken_slow", 0444, d_spin_debug,
 			   &spinlock_stats.taken_slow);
-	debugfs_create_u32("taken_slow_nested", 0444, d_spin_debug,
-			   &spinlock_stats.taken_slow_nested);
 	debugfs_create_u32("taken_slow_pickup", 0444, d_spin_debug,
 			   &spinlock_stats.taken_slow_pickup);
 	debugfs_create_u32("taken_slow_spurious", 0444, d_spin_debug,
 			   &spinlock_stats.taken_slow_spurious);
-	debugfs_create_u32("taken_slow_irqenable", 0444, d_spin_debug,
-			   &spinlock_stats.taken_slow_irqenable);
 
-	debugfs_create_u64("released", 0444, d_spin_debug, &spinlock_stats.released);
 	debugfs_create_u32("released_slow", 0444, d_spin_debug,
 			   &spinlock_stats.released_slow);
 	debugfs_create_u32("released_slow_kicked", 0444, d_spin_debug,
 			   &spinlock_stats.released_slow_kicked);
 
-	debugfs_create_u64("time_spinning", 0444, d_spin_debug,
-			   &spinlock_stats.time_spinning);
 	debugfs_create_u64("time_blocked", 0444, d_spin_debug,
 			   &spinlock_stats.time_blocked);
-	debugfs_create_u64("time_total", 0444, d_spin_debug,
-			   &spinlock_stats.time_total);
 
-	xen_debugfs_create_u32_array("histo_total", 0444, d_spin_debug,
-				     spinlock_stats.histo_spin_total, HISTO_BUCKETS + 1);
-	xen_debugfs_create_u32_array("histo_spinning", 0444, d_spin_debug,
-				     spinlock_stats.histo_spin_spinning, HISTO_BUCKETS + 1);
 	xen_debugfs_create_u32_array("histo_blocked", 0444, d_spin_debug,
 				     spinlock_stats.histo_spin_blocked, HISTO_BUCKETS + 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 Oct 04 16:40:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16:40:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBEau-0000EV-Fy; Tue, 04 Oct 2011 16:40:16 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESZ-00051u-1q
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:42 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-15.tower-182.messagelabs.com!1317771094!19911226!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16093 invoked from network); 4 Oct 2011 23:31:36 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-15.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 4 Oct 2011 23:31:36 -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 C407187B5;
	Tue,  4 Oct 2011 16:31:33 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id EC23121106; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:17 -0700
Message-Id: <6150ec0f188d9b4caddf722cfcb422981a27ba0e.1317763862.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V4 11/11] xen: enable PV ticketlocks on HVM
	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

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/xen/smp.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index 4dec905..2d01aeb 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -552,4 +552,5 @@ void __init xen_hvm_smp_init(void)
 	smp_ops.cpu_die = xen_hvm_cpu_die;
 	smp_ops.send_call_func_ipi = xen_smp_send_call_function_ipi;
 	smp_ops.send_call_func_single_ipi = xen_smp_send_call_function_single_ipi;
+	xen_init_spinlocks();
 }
-- 
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 Oct 04 16:41:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16:41:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBEbo-0000gb-H1; Tue, 04 Oct 2011 16:41:12 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESY-00051t-II
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:42 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317771078!56704160!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19748 invoked from network); 4 Oct 2011 23:31:19 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 23:31:19 -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 3D09087AE;
	Tue,  4 Oct 2011 16:31:32 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id C87F821102; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:13 -0700
Message-Id: <3c2d4b131254f8e6565f4e8c7a0427d06f244b01.1317763862.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V4 07/11] x86/pvticketlock: use callee-save
	for lock_spinning
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Although the lock_spinning calls in the spinlock code are on the
uncommon path, their presence can cause the compiler to generate many
more register save/restores in the function pre/postamble, which is in
the fast path.  To avoid this, convert it to using the pvops callee-save
calling convention, which defers all the save/restores until the actual
function is called, keeping the fastpath clean.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/include/asm/paravirt.h       |    2 +-
 arch/x86/include/asm/paravirt_types.h |    2 +-
 arch/x86/kernel/paravirt-spinlocks.c  |    2 +-
 arch/x86/xen/spinlock.c               |    3 ++-
 4 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index 76cae7a..50281c7 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -752,7 +752,7 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
 
 static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, __ticket_t ticket)
 {
-	PVOP_VCALL2(pv_lock_ops.lock_spinning, lock, ticket);
+	PVOP_VCALLEE2(pv_lock_ops.lock_spinning, lock, ticket);
 }
 
 static __always_inline void ____ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 005e24d..5e0c138 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -330,7 +330,7 @@ struct arch_spinlock;
 #include <asm/spinlock_types.h>
 
 struct pv_lock_ops {
-	void (*lock_spinning)(struct arch_spinlock *lock, __ticket_t ticket);
+	struct paravirt_callee_save lock_spinning;
 	void (*unlock_kick)(struct arch_spinlock *lock, __ticket_t ticket);
 };
 
diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c
index c2e010e..4251c1d 100644
--- a/arch/x86/kernel/paravirt-spinlocks.c
+++ b/arch/x86/kernel/paravirt-spinlocks.c
@@ -9,7 +9,7 @@
 
 struct pv_lock_ops pv_lock_ops = {
 #ifdef CONFIG_SMP
-	.lock_spinning = paravirt_nop,
+	.lock_spinning = __PV_IS_CALLEE_SAVE(paravirt_nop),
 	.unlock_kick = paravirt_nop,
 #endif
 };
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 1e21c99..431d231 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -145,6 +145,7 @@ out:
 
 	spin_time_accum_blocked(start);
 }
+PV_CALLEE_SAVE_REGS_THUNK(xen_lock_spinning);
 
 static void xen_unlock_kick(struct arch_spinlock *lock, __ticket_t next)
 {
@@ -204,7 +205,7 @@ void __init xen_init_spinlocks(void)
 		return;
 	}
 
-	pv_lock_ops.lock_spinning = xen_lock_spinning;
+	pv_lock_ops.lock_spinning = PV_CALLEE_SAVE(xen_lock_spinning);
 	pv_lock_ops.unlock_kick = xen_unlock_kick;
 }
 
-- 
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 Oct 04 16:41:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 16: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 1RBEcW-00012g-I9; Tue, 04 Oct 2011 16:41:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBESb-00052A-EP
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 16:31:42 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317771095!19109171!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5294 invoked from network); 4 Oct 2011 23:31:37 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 4 Oct 2011 23:31:37 -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 6D8F687B6;
	Tue,  4 Oct 2011 16:31:34 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id DA40F21104; Tue,  4 Oct 2011 16:31:18 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Tue,  4 Oct 2011 16:31:15 -0700
Message-Id: <55f8f62ffbdd2d0269398a33e879afad2853b48f.1317763862.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317762058.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317763862.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stephan Diestelhorst <stephan.diestelhorst@amd.com>
Subject: [Xen-devel] [PATCH RFC V4 09/11] x86/ticketlock: add slowpath 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

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Maintain a flag in the LSB of the ticket lock tail which indicates
whether anyone is in the lock slowpath and may need kicking when
the current holder unlocks.  The flags are set when the first locker
enters the slowpath, and cleared when unlocking to an empty queue (ie,
no contention).

In the specific implementation of lock_spinning(), make sure to set
the slowpath flags on the lock just before blocking.  We must do
this before the last-chance pickup test to prevent a deadlock
with the unlocker:

Unlocker			Locker
				test for lock pickup
					-> fail
unlock
test slowpath
	-> false
				set slowpath flags
				block

Whereas this works in any ordering:

Unlocker			Locker
				set slowpath flags
				test for lock pickup
					-> fail
				block
unlock
test slowpath
	-> true, kick

If the unlocker finds that the lock has the slowpath flag set but it is
actually uncontended (ie, head == tail, so nobody is waiting), then it
clears the slowpath flag.

The unlock code uses a locked xadd to atomically update the head counter
and fetch the tail to read the slowpath flag.  Since "head" is in the
least-significant position, there's a possibility that it could overflow
into "tail".  If this is about to happen, then we can also add "-1" to
tail to compensate for the carry overlflow.  This is safe because while
we hold the lock, we own "head", so we can inspect it without risk of
it changing.

(Unfortunately this means we need to do a locked instruction when
unlocking with PV ticketlocks.  However, if PV ticketlocks are not
enabled, then the old non-locked "add" is the only unlocking code.)

Note: this code relies on gcc making sure that unlikely() code is out of
line of the fastpath, which only happens when OPTIMIZE_SIZE=n.  If it
doesn't the generated code isn't too bad, but its definitely suboptimal.

Thanks to Srivatsa Vaddagiri for providing a bugfix to the original
version of this change, which has been folded in.
Thanks to Stephan Diestelhorst for commenting on some code which relied
on an inaccurate reading of the x86 memory ordering rules.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Cc: Stephan Diestelhorst <stephan.diestelhorst@amd.com>
---
 arch/x86/include/asm/paravirt.h       |    2 +-
 arch/x86/include/asm/spinlock.h       |   90 +++++++++++++++++++++++++--------
 arch/x86/include/asm/spinlock_types.h |    2 +
 arch/x86/kernel/paravirt-spinlocks.c  |    3 +
 arch/x86/xen/spinlock.c               |    6 ++
 5 files changed, 81 insertions(+), 22 deletions(-)

diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index 50281c7..13b3d8b 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -755,7 +755,7 @@ static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, _
 	PVOP_VCALLEE2(pv_lock_ops.lock_spinning, lock, ticket);
 }
 
-static __always_inline void ____ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
+static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
 {
 	PVOP_VCALL2(pv_lock_ops.unlock_kick, lock, ticket);
 }
diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index dd155f7..7dbe028 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -1,11 +1,14 @@
 #ifndef _ASM_X86_SPINLOCK_H
 #define _ASM_X86_SPINLOCK_H
 
+#include <linux/jump_label.h>
 #include <linux/atomic.h>
 #include <asm/page.h>
 #include <asm/processor.h>
 #include <linux/compiler.h>
 #include <asm/paravirt.h>
+#include <asm/bitops.h>
+
 /*
  * Your basic SMP spinlocks, allowing only a single CPU anywhere
  *
@@ -40,29 +43,27 @@
 /* How long a lock should spin before we consider blocking */
 #define SPIN_THRESHOLD	(1 << 11)
 
-#ifndef CONFIG_PARAVIRT_SPINLOCKS
+#ifdef CONFIG_PARAVIRT_SPINLOCKS
+
+extern struct jump_label_key paravirt_ticketlocks_enabled;
 
-static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, __ticket_t ticket)
+static inline void __ticket_enter_slowpath(arch_spinlock_t *lock)
 {
+	set_bit(0, (volatile unsigned long *)&lock->tickets.tail);
 }
 
-static __always_inline void ____ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
+#else  /* !CONFIG_PARAVIRT_SPINLOCKS */
+static __always_inline void __ticket_lock_spinning(arch_spinlock_t *lock, __ticket_t ticket)
 {
 }
 
-#endif	/* CONFIG_PARAVIRT_SPINLOCKS */
-
-
-/* 
- * If a spinlock has someone waiting on it, then kick the appropriate
- * waiting cpu.
- */
-static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t next)
+static inline void __ticket_unlock_kick(arch_spinlock_t *lock, __ticket_t ticket)
 {
-	if (unlikely(lock->tickets.tail != next))
-		____ticket_unlock_kick(lock, next);
 }
 
+#endif	/* CONFIG_PARAVIRT_SPINLOCKS */
+
+
 /*
  * Ticket locks are conceptually two parts, one indicating the current head of
  * the queue, and the other indicating the current tail. The lock is acquired
@@ -76,20 +77,22 @@ static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __t
  * in the high part, because a wide xadd increment of the low part would carry
  * up and contaminate the high part.
  */
-static __always_inline void arch_spin_lock(struct arch_spinlock *lock)
+static __always_inline void arch_spin_lock(arch_spinlock_t *lock)
 {
 	register struct __raw_tickets inc = { .tail = TICKET_LOCK_INC };
 
 	inc = xadd(&lock->tickets, inc);
+	if (likely(inc.head == inc.tail))
+		goto out;
 
+	inc.tail &= ~TICKET_SLOWPATH_FLAG;
 	for (;;) {
 		unsigned count = SPIN_THRESHOLD;
 
 		do {
-			if (inc.head == inc.tail)
+			if (ACCESS_ONCE(lock->tickets.head) == inc.tail)
 				goto out;
 			cpu_relax();
-			inc.head = ACCESS_ONCE(lock->tickets.head);
 		} while (--count);
 		__ticket_lock_spinning(lock, inc.tail);
 	}
@@ -101,7 +104,7 @@ static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
 	arch_spinlock_t old, new;
 
 	old.tickets = ACCESS_ONCE(lock->tickets);
-	if (old.tickets.head != old.tickets.tail)
+	if (old.tickets.head != (old.tickets.tail & ~TICKET_SLOWPATH_FLAG))
 		return 0;
 
 	new.head_tail = old.head_tail + (TICKET_LOCK_INC << TICKET_SHIFT);
@@ -110,12 +113,57 @@ static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
 	return cmpxchg(&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail;
 }
 
-static __always_inline void arch_spin_unlock(arch_spinlock_t *lock)
+static inline void __ticket_unlock_slowpath(arch_spinlock_t *lock,
+					    arch_spinlock_t old)
 {
-	__ticket_t next = lock->tickets.head + TICKET_LOCK_INC;
+	arch_spinlock_t new;
+
+	BUILD_BUG_ON(((__ticket_t)NR_CPUS) != NR_CPUS);
+
+	/* Perform the unlock on the "before" copy */
+	old.tickets.head += TICKET_LOCK_INC;
+
+	/* Clear the slowpath flag */
+	new.head_tail = old.head_tail & ~(TICKET_SLOWPATH_FLAG << TICKET_SHIFT);
+
+	/*
+	 * If the lock is uncontended, clear the flag - use cmpxchg in
+	 * case it changes behind our back though.
+	 */
+	if (new.tickets.head != new.tickets.tail ||
+	    cmpxchg(&lock->head_tail, old.head_tail, new.head_tail) != old.head_tail) {
+		/*
+		 * Lock still has someone queued for it, so wake up an
+		 * appropriate waiter.
+		 */
+		__ticket_unlock_kick(lock, old.tickets.head);
+	}
+}
 
-	__add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX);
-	__ticket_unlock_kick(lock, next);
+static __always_inline void arch_spin_unlock(arch_spinlock_t *lock)
+{
+	if (TICKET_SLOWPATH_FLAG &&
+	    unlikely(static_branch(&paravirt_ticketlocks_enabled))) {
+		arch_spinlock_t prev;
+		__ticketpair_t inc = TICKET_LOCK_INC;
+
+		/*
+		 * Use xadd to update "head" to perform the unlock and
+		 * atomically fetch the state of the flag.  Since
+		 * "head" is the least-significant part of the
+		 * head_tail pair, it may overflow into tail if it is
+		 * about to wrap.  If this happens, compensate by
+		 * adding -1 to tail as well.
+		 */
+		if (lock->tickets.head >= (1 << TICKET_SHIFT) - TICKET_LOCK_INC)
+			inc += -1 << TICKET_SHIFT;
+
+		prev.head_tail = xadd(&lock->head_tail, inc);
+
+		if (unlikely(prev.tickets.tail & TICKET_SLOWPATH_FLAG))
+			__ticket_unlock_slowpath(lock, prev);
+	} else
+		__add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX);
 }
 
 static inline int arch_spin_is_locked(arch_spinlock_t *lock)
diff --git a/arch/x86/include/asm/spinlock_types.h b/arch/x86/include/asm/spinlock_types.h
index aa9a205..407f7f7 100644
--- a/arch/x86/include/asm/spinlock_types.h
+++ b/arch/x86/include/asm/spinlock_types.h
@@ -5,8 +5,10 @@
 
 #ifdef CONFIG_PARAVIRT_SPINLOCKS
 #define __TICKET_LOCK_INC	2
+#define TICKET_SLOWPATH_FLAG	((__ticket_t)1)
 #else
 #define __TICKET_LOCK_INC	1
+#define TICKET_SLOWPATH_FLAG	((__ticket_t)0)
 #endif
 
 #if (CONFIG_NR_CPUS < (256 / __TICKET_LOCK_INC))
diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c
index 4251c1d..6ca1d33 100644
--- a/arch/x86/kernel/paravirt-spinlocks.c
+++ b/arch/x86/kernel/paravirt-spinlocks.c
@@ -4,6 +4,7 @@
  */
 #include <linux/spinlock.h>
 #include <linux/module.h>
+#include <linux/jump_label.h>
 
 #include <asm/paravirt.h>
 
@@ -15,3 +16,5 @@ struct pv_lock_ops pv_lock_ops = {
 };
 EXPORT_SYMBOL(pv_lock_ops);
 
+struct jump_label_key paravirt_ticketlocks_enabled = JUMP_LABEL_INIT;
+EXPORT_SYMBOL(paravirt_ticketlocks_enabled);
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 431d231..0a552ec 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -124,6 +124,10 @@ static void xen_lock_spinning(struct arch_spinlock *lock, __ticket_t want)
 	/* Only check lock once pending cleared */
 	barrier();
 
+	/* Mark entry to slowpath before doing the pickup test to make
+	   sure we don't deadlock with an unlocker. */
+	__ticket_enter_slowpath(lock);
+
 	/* check again make sure it didn't become free while
 	   we weren't looking  */
 	if (ACCESS_ONCE(lock->tickets.head) == want) {
@@ -205,6 +209,8 @@ void __init xen_init_spinlocks(void)
 		return;
 	}
 
+	jump_label_inc(&paravirt_ticketlocks_enabled);
+
 	pv_lock_ops.lock_spinning = PV_CALLEE_SAVE(xen_lock_spinning);
 	pv_lock_ops.unlock_kick = xen_unlock_kick;
 }
-- 
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 Oct 04 17:06:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 17: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 1RBEzx-0002H9-A6; Tue, 04 Oct 2011 17:06:09 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBEuQ-0001oG-3W
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 17:00:35 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1317772823!20790104!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11780 invoked from network); 5 Oct 2011 00:00:23 -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;
	5 Oct 2011 00:00:23 -0000
X-IronPort-AV: E=Sophos;i="4.68,488,1312156800"; 
   d="scan'208";a="8213823"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 00:00: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, 5 Oct 2011 01:00:22 +0100
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 1RBEuM-0000Q1-32;
	Wed, 05 Oct 2011 00:00:22 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RBEuL-0001yP-UT;
	Wed, 05 Oct 2011 01:00:21 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9191-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 5 Oct 2011 01:00:21 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9191: 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 9191 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9191/

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           14 guest-start.2                fail    like 9181
 test-i386-i386-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  0b66e6450ffe
baseline version:
 xen                  3d1664cc9e45

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
------------------------------------------------------------

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=0b66e6450ffe
+ . 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 0b66e6450ffe
+ branch=xen-unstable
+ revision=0b66e6450ffe
+ . 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 0b66e6450ffe 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 47 changes to 47 files

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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 21:12:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 21:12:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBIqj-00083p-SM; Tue, 04 Oct 2011 21:12:54 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBIpk-0007rB-UG
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 21:11:53 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1317787909!20772887!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 451 invoked from network); 5 Oct 2011 04:11:49 -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;
	5 Oct 2011 04:11:49 -0000
X-IronPort-AV: E=Sophos;i="4.68,489,1312156800"; 
   d="scan'208";a="8214506"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 04:11: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, 5 Oct 2011 05:11:36 +0100
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 1RBIpT-0001tD-W4;
	Wed, 05 Oct 2011 04:11:36 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RBIpT-0001LH-RC;
	Wed, 05 Oct 2011 05:11:35 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9192-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 5 Oct 2011 05:11:35 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9192: 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 9192 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9192/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail pass in 9191
 test-i386-i386-win           14 guest-start.2        fail in 9191 pass in 9192

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                  0b66e6450ffe
baseline version:
 xen                  0b66e6450ffe

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 Tue Oct 04 21:45:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 21:45:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBJLo-0000mE-GX; Tue, 04 Oct 2011 21:45:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBJKp-0000Zd-2M
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 21:43:59 -0700
X-Env-Sender: silverbottlep@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1317789821!42821124!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25473 invoked from network); 5 Oct 2011 04:43:42 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 04:43:42 -0000
Received: by ywm21 with SMTP id 21so2044819ywm.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 21:43:54 -0700 (PDT)
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
	:content-type:content-transfer-encoding;
	bh=AILRFGJmLVj5gJ2GLls4Cvr+JEqCwd3XYDfbCppmlus=;
	b=tOCgg4a8ZxlFmSW5olp8/uw6EuHPfUK1/ZYnRPlqIyX7ZwR04FKzoveM9oRnFmmTUT
	Cf2M425CeKL8W8O3Ob0Xm/NyTBHFVOVv5Vr66h+mjgtel1htDKiiI5WPAzlxBxlotcWr
	Cet7Fk76rScvtTHclqKHHCFevieRewzXJY6rU=
Received: by 10.68.24.35 with SMTP id r3mr14878938pbf.116.1317789834570;
	Tue, 04 Oct 2011 21:43:54 -0700 (PDT)
Received: from [192.168.2.124] ([112.169.222.30])
	by mx.google.com with ESMTPS id ji3sm3260159pbc.2.2011.10.04.21.43.52
	(version=SSLv3 cipher=OTHER); Tue, 04 Oct 2011 21:43:54 -0700 (PDT)
Message-ID: <4E8BE083.3080000@gmail.com>
Date: Wed, 05 Oct 2011 13:43:47 +0900
From: Eunbyung Park <silverbottlep@gmail.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: george.dunlap@eu.citrix.com, xen-devel@lists.xensource.com
Content-Type: text/plain; charset=EUC-KR
Content-Transfer-Encoding: 7bit
Cc: 
Subject: [Xen-devel] cap and reservation functionality in the credit2
	scheduler?
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 far as I know, from the up-to-date xen-unstable, the credit2
scheduler lacks the functionalities of cap and reservation.

Is there any on-going work for this?

I would really expect the functions to come into us. :)

>From my humble point of view, probably additional timer may be required
to implement them because there isn't any periodic timer in the credit2
unlike the previous credit scheduler.

what do you think about it?

Thanks.

-- 
Best Regards,
Eunbyung Park


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

From xen-devel-bounces@lists.xensource.com Tue Oct 04 21:46:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 21:46:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBJMv-00019h-7v; Tue, 04 Oct 2011 21:46:09 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBJM7-0000ra-IQ
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 21:45:20 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1317789916!27915073!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30993 invoked from network); 5 Oct 2011 04:45:16 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 04:45: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:CC:Subject:References:
	In-Reply-To:Content-Type;
	b=PRq8f+wtYKC3442NChOVazOENXJRGl2fyiCDq/6WoLVv4Zg7e1jIVTMj
	Wkn1ZwlAwHXBm14reKk1BfvVvhLiXg2GG7njPeZagiYLvR4sIfCxcAz0+
	kyys2fx5+Mr1hkOYcSi427KjvfxQtjyED7fa5CTMuTCyc2C+cu5g7fF22
	rbgu5Zvq6mZQMhzkjlm9B6updb4MhFDeILbUH5siHt1uh3E0lbIVIOSW3
	owEXj/RIrynnycAw5bwnHJMVPdNgH;
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=1317789916; x=1349325916;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to;
	bh=+0k0Z1Ph5G1fUHOdwXijuFmxVy17Bu60XOkMrZ+Qm7E=;
	b=jQdrRq8DU1jpFWcHMdpd35xJ6e14FJ3mMWAVFXlwJsb/vjNc8dh5F1+j
	h8AXsZNGRJfC9IxXcMAuTGAQYixqyAh9apNGZa08xfUqbSohy5B+UQ9H6
	x+3v+hwr08rZeMJi+0Z4o4XkGl3u0o/BnM/2vu+I0h+/Kk89mAvzYwB7M
	PZjAigMib9Xd7ItcuyRAooNlEGkDHXESNoZWidCzpLFMg0sI/wKT6vi1G
	NHAdn1JDwUIXSqGuHw30Tb4XuyfIZ;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.68,488,1312149600"; d="scan'208,217";a="89292548"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate10u.abg.fsc.net with ESMTP; 05 Oct 2011 06:45:16 +0200
X-IronPort-AV: E=Sophos;i="4.68,489,1312149600"; 
	d="scan'208,217";a="120664543"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 05 Oct 2011 06:45:16 +0200
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id DF8A13C9EEC;
	Wed,  5 Oct 2011 06:45:15 +0200 (CEST)
Message-ID: <4E8BE0DB.7040503@ts.fujitsu.com>
Date: Wed, 05 Oct 2011 06:45:15 +0200
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.21) Gecko/20110831 Iceowl/1.0b2 Icedove/3.1.13
MIME-Version: 1.0
To: "Kay, Allen M" <allen.m.kay@intel.com>
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
References: <987664A83D2D224EAE907B061CE93D5301EE62D025@orsmsx505.amr.corp.intel.com>
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301EE62D025@orsmsx505.amr.corp.intel.com>
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>
Content-Type: multipart/mixed; boundary="===============1043229349=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1043229349==
Content-Type: multipart/alternative;
	boundary="------------050806020204020706000606"

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

On 10/04/2011 11:44 PM, Kay, Allen M wrote:
>
> Hi Keir,
>
> I'm getting the following build error caused by "-include 
> $(XEN_ROOT)/.config" line in Config.mk.  Removing it from Config.mk makes 
> the error go away.  The OS I'm using is FC15.  "$(XEN_ROOT)/.config" does 
> not exist.
>
> Allen
>
> -------
>
> make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
>
> make[4]: *** ../../.config: Is a directory.  Stop.
>
> make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
>
> make[3]: *** [subdir-clean-check] Error 2
>
> make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
>
> make[2]: *** [subdirs-clean] Error 2
>
> make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
>
> make[1]: *** [clean] Error 2
>
> make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
>
> make: *** [world] Error 2
>
>

This is fixed with cs 23049 in xen-unstable:

http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html


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


--------------050806020204020706000606
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">
    On 10/04/2011 11:44 PM, Kay, Allen M wrote:
    <blockquote
cite="mid:987664A83D2D224EAE907B061CE93D5301EE62D025@orsmsx505.amr.corp.intel.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html;
        charset=ISO-8859-1">
      <meta name="Generator" content="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;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";}
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;}
/* List Definitions */
@list l0
	{mso-list-id:965739186;
	mso-list-type:hybrid;
	mso-list-template-ids:1848293122 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level2
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level3
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
@list l0:level4
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level5
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level6
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
@list l0:level7
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level8
	{mso-level-number-format:alpha-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:left;
	text-indent:-.25in;}
@list l0:level9
	{mso-level-number-format:roman-lower;
	mso-level-tab-stop:none;
	mso-level-number-position:right;
	text-indent:-9.0pt;}
ol
	{margin-bottom:0in;}
ul
	{margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
      <div class="WordSection1">
        <p class="MsoNormal">Hi Keir,<o:p></o:p></p>
        <p class="MsoNormal"><o:p>&nbsp;</o:p></p>
        <p class="MsoNormal">I&#8217;m getting the following build error
          caused by &#8220;-include $(XEN_ROOT)/.config&#8221; line in Config.mk.&nbsp;
          Removing it from Config.mk makes the error go away.&nbsp; The OS
          I&#8217;m using is FC15.&nbsp; &#8220;$(XEN_ROOT)/.config&#8221; does not exist.<o:p></o:p></p>
        <p class="MsoNormal"><o:p>&nbsp;</o:p></p>
        <p class="MsoNormal">Allen<o:p></o:p></p>
        <p class="MsoNormal"><o:p>&nbsp;</o:p></p>
        <p class="MsoNormal">-------<o:p></o:p></p>
        <p class="MsoNormal"><o:p>&nbsp;</o:p></p>
        <p class="MsoNormal">make[4]: Entering directory
          `/home/akay/xen-4.1-testing.hg/tools/check'<o:p></o:p></p>
        <p class="MsoNormal">make[4]: *** ../../.config: Is a
          directory.&nbsp; Stop.<o:p></o:p></p>
        <p class="MsoNormal">make[4]: Leaving directory
          `/home/akay/xen-4.1-testing.hg/tools/check'<o:p></o:p></p>
        <p class="MsoNormal">make[3]: *** [subdir-clean-check] Error 2<o:p></o:p></p>
        <p class="MsoNormal">make[3]: Leaving directory
          `/home/akay/xen-4.1-testing.hg/tools'<o:p></o:p></p>
        <p class="MsoNormal">make[2]: *** [subdirs-clean] Error 2<o:p></o:p></p>
        <p class="MsoNormal">make[2]: Leaving directory
          `/home/akay/xen-4.1-testing.hg/tools'<o:p></o:p></p>
        <p class="MsoNormal">make[1]: *** [clean] Error 2<o:p></o:p></p>
        <p class="MsoNormal">make[1]: Leaving directory
          `/home/akay/xen-4.1-testing.hg'<o:p></o:p></p>
        <p class="MsoNormal">make: *** [world] Error 2<o:p></o:p></p>
      </div>
      <br>
    </blockquote>
    <br>
    <tt>This is fixed with cs 23049 in xen-unstable:<br>
      <br>
<a class="moz-txt-link-freetext" href="http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html">http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html</a><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>

--------------050806020204020706000606--


--===============1043229349==
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

--===============1043229349==--


From xen-devel-bounces@lists.xensource.com Tue Oct 04 23:10:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 04 Oct 2011 23:10:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBKgW-0003qH-8z; Tue, 04 Oct 2011 23:10:28 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43)
	id 1RBKfZ-0003dn-7O; Tue, 04 Oct 2011 23:09:29 -0700
X-Env-Sender: mikenelx@hotmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1317794946!46805248!1
X-Originating-IP: [65.55.90.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29701 invoked from network); 5 Oct 2011 06:09:07 -0000
Received: from snt0-omc2-s14.snt0.hotmail.com (HELO
	snt0-omc2-s14.snt0.hotmail.com) (65.55.90.89)
	by server-8.tower-27.messagelabs.com with SMTP;
	5 Oct 2011 06:09:07 -0000
Received: from SNT107-W5 ([65.55.90.72]) by snt0-omc2-s14.snt0.hotmail.com
	with Microsoft SMTPSVC(6.0.3790.4675); 
	Tue, 4 Oct 2011 23:09:24 -0700
Message-ID: <SNT107-W5B802A9DAA8738A45D242DAF80@phx.gbl>
X-Originating-IP: [24.16.40.251]
From: Michael Nelson <mikenelx@hotmail.com>
To: <xen-devel@lists.xensource.com>, <xen-users@lists.xensource.com>
Subject: [Xen-devel] Re: [Xen-users] XEN 4.1.1 + IGD passthrough and Intel
	DQ67SW, i7-2600
Date: Wed, 5 Oct 2011 02:09:24 -0400
Importance: Normal
MIME-Version: 1.0
X-OriginalArrivalTime: 05 Oct 2011 06:09:24.0771 (UTC)
	FILETIME=[54DD2730:01CC8325]
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="===============0487219809=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0487219809==
Content-Type: multipart/alternative;
	boundary="_5e368bdd-925f-4fc8-b4c1-38183bab3035_"

--_5e368bdd-925f-4fc8-b4c1-38183bab3035_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable






>I have now tried with the new 3.1.0-rc3 kernel (and latest 4.2 XEN)=2C wit=
h the>exact same result. It passthrough works fine before loading the prope=
r drivers=2C>but hangs at startup with correct drivers.>>I forgot to mentio=
n that I did try to install Win 7 on this computer without>XEN and everythi=
ng worked fine=2C so the drivers provided by Intel do work.
I just got a DQ67SW+i5-2500 and see the same behavior. I am running 3.1.0-r=
c8=2Clatest xen-unstable=2C Windows Server 2008 R2=2C and the latest Intel =
September drivers. The VM spins at 100% CPU according to xl top once it tra=
nsitions tofull graphics mode from the boot splash screen. There is also no=
 response fromthe keyboard after this (i.e. caps lock light won't toggle).
I tried using using VNC as primary video and the IGD as a secondary device.=
 Windows sees the IGD PCI device but complains that it can't be started (ev=
en withjust the basic VGA driver).=20
I have also been trying to get a cheap ATI card to work (Radeon 3850) as ei=
thera primary and secondary card with no luck at all (not even text output =
during VMboot). I've tried one of the patches that modifies qemu-dm (pt-gra=
phics.c) that adds some ATI specific bits=2C but other than some extra debu=
g output in the logfiles=2C I don't see any difference in behavior.
I am willing to try out new bits/patches if that would help anyone.
Thanks=2C-mike



 		 	   		  =

--_5e368bdd-925f-4fc8-b4c1-38183bab3035_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html>
<head>
<style><!--
.hmmessage P
{
margin:0px=3B
padding:0px
}
body.hmmessage
{
font-size: 10pt=3B
font-family:Tahoma
}
--></style>
</head>
<body class=3D'hmmessage'><div dir=3D'ltr'>


<style><!--
.hmmessage P
{
margin:0px=3B
padding:0px
}
body.hmmessage
{
font-size: 10pt=3B
font-family:Tahoma
}
--></style>

<div dir=3D"ltr"><pre style=3D"margin-top: 0em=3B margin-right: 0em=3B marg=
in-bottom: 0em=3B margin-left: 0em=3B "><span class=3D"Apple-style-span" st=
yle=3D"font-family: Times=3B white-space: normal=3B "><tt>&gt=3BI have now =
tried with the new 3.1.0-rc3 kernel (and latest 4.2 XEN)=2C&nbsp=3B</tt><tt=
>with the</tt></span></pre></div><div dir=3D"ltr"><tt>&gt=3Bexact same resu=
lt. It passthrough works fine before loading the&nbsp=3B</tt><tt>proper dri=
vers=2C</tt></div><div dir=3D"ltr"><tt>&gt=3B</tt><span class=3D"Apple-styl=
e-span" style=3D"font-family: monospace=3B ">but hangs at startup with corr=
ect drivers.</span></div><div dir=3D"ltr"><span class=3D"Apple-style-span" =
style=3D"font-family: monospace=3B ">&gt=3B</span></div><div dir=3D"ltr"><p=
re style=3D"margin-top: 0em=3B margin-right: 0em=3B margin-bottom: 0em=3B m=
argin-left: 0em=3B "></pre><tt>&gt=3BI forgot to mention that I did try to =
install Win 7 on this computer&nbsp=3B</tt><tt>without</tt></div><div dir=
=3D"ltr"><tt>&gt=3BXEN and everything worked fine=2C so the drivers provide=
d by Intel&nbsp=3B</tt><tt>do work.</tt></div><div dir=3D"ltr"><font class=
=3D"Apple-style-span" face=3D"monospace"><br></font></div><div dir=3D"ltr">=
<pre style=3D"margin-top: 0em=3B margin-right: 0em=3B margin-bottom: 0em=3B=
 margin-left: 0em=3B ">I just got a DQ67SW+i5-2500 and see the same behavio=
r. I am running 3.1.0-rc8=2C</pre><pre style=3D"margin-top: 0em=3B margin-r=
ight: 0em=3B margin-bottom: 0em=3B margin-left: 0em=3B ">latest xen-unstabl=
e=2C Windows Server 2008 R2=2C and the latest Intel September&nbsp=3B</pre>=
<pre style=3D"margin-top: 0em=3B margin-right: 0em=3B margin-bottom: 0em=3B=
 margin-left: 0em=3B ">drivers.&nbsp=3BThe VM spins at 100% CPU according t=
o xl top once it transitions to</pre><pre style=3D"margin-top: 0em=3B margi=
n-right: 0em=3B margin-bottom: 0em=3B margin-left: 0em=3B ">full graphics m=
ode from the boot splash screen. There is also no response from</pre><pre s=
tyle=3D"margin-top: 0em=3B margin-right: 0em=3B margin-bottom: 0em=3B margi=
n-left: 0em=3B ">the keyboard after this (i.e. caps lock light won't toggle=
).</pre><pre style=3D"margin-top: 0em=3B margin-right: 0em=3B margin-bottom=
: 0em=3B margin-left: 0em=3B "><br></pre><pre style=3D"margin-top: 0em=3B m=
argin-right: 0em=3B margin-bottom: 0em=3B margin-left: 0em=3B ">I tried usi=
ng using VNC as primary video and the IGD as a secondary device.&nbsp=3B</p=
re><pre style=3D"margin-top: 0em=3B margin-right: 0em=3B margin-bottom: 0em=
=3B margin-left: 0em=3B ">Windows sees the IGD PCI device but complains tha=
t it can't be started (even with</pre><pre style=3D"margin-top: 0em=3B marg=
in-right: 0em=3B margin-bottom: 0em=3B margin-left: 0em=3B ">just the basic=
 VGA driver). </pre><pre style=3D"margin-top: 0em=3B margin-right: 0em=3B m=
argin-bottom: 0em=3B margin-left: 0em=3B "><br></pre><pre style=3D"margin-t=
op: 0em=3B margin-right: 0em=3B margin-bottom: 0em=3B margin-left: 0em=3B "=
>I have also been trying to get a cheap ATI card to work (Radeon 3850)&nbsp=
=3Bas either</pre><pre style=3D"margin-top: 0em=3B margin-right: 0em=3B mar=
gin-bottom: 0em=3B margin-left: 0em=3B ">a primary and secondary card with =
no luck at all (not even text output&nbsp=3Bduring VM</pre><pre style=3D"ma=
rgin-top: 0em=3B margin-right: 0em=3B margin-bottom: 0em=3B margin-left: 0e=
m=3B ">boot).&nbsp=3BI've tried&nbsp=3Bone of the patches that modifies qem=
u-dm (pt-graphics.c) that </pre><pre style=3D"margin-top: 0em=3B margin-rig=
ht: 0em=3B margin-bottom: 0em=3B margin-left: 0em=3B ">adds some ATI specif=
ic bits=2C but other than some extra debug output in the log</pre><pre styl=
e=3D"margin-top: 0em=3B margin-right: 0em=3B margin-bottom: 0em=3B margin-l=
eft: 0em=3B ">files=2C I don't see any difference in behavior.</pre><pre st=
yle=3D"margin-top: 0em=3B margin-right: 0em=3B margin-bottom: 0em=3B margin=
-left: 0em=3B "><br></pre><pre style=3D"margin-top: 0em=3B margin-right: 0e=
m=3B margin-bottom: 0em=3B margin-left: 0em=3B ">I am willing to try out ne=
w bits/patches if that would help anyone.</pre><pre style=3D"margin-top: 0e=
m=3B margin-right: 0em=3B margin-bottom: 0em=3B margin-left: 0em=3B "><br><=
/pre><pre style=3D"margin-top: 0em=3B margin-right: 0em=3B margin-bottom: 0=
em=3B margin-left: 0em=3B ">Thanks=2C</pre><pre style=3D"margin-top: 0em=3B=
 margin-right: 0em=3B margin-bottom: 0em=3B margin-left: 0em=3B ">-mike</pr=
e><pre style=3D"margin-top: 0em=3B margin-right: 0em=3B margin-bottom: 0em=
=3B margin-left: 0em=3B "><br></pre><pre style=3D"margin-top: 0em=3B margin=
-right: 0em=3B margin-bottom: 0em=3B margin-left: 0em=3B "><br></pre><pre s=
tyle=3D"margin-top: 0em=3B margin-right: 0em=3B margin-bottom: 0em=3B margi=
n-left: 0em=3B "><br></pre></div>
 		 	   		  </div></body>
</html>=

--_5e368bdd-925f-4fc8-b4c1-38183bab3035_--


--===============0487219809==
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

--===============0487219809==--


From xen-devel-bounces@lists.xensource.com Wed Oct 05 00:28:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 00:28:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBLtt-0006L7-Ig; Wed, 05 Oct 2011 00:28:21 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBLsp-00068M-1v
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 00:27:15 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1317799614!61594431!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31089 invoked from network); 5 Oct 2011 07:26:54 -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; 5 Oct 2011 07:26:54 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 05 Oct 2011 08:27:11 +0100
Message-Id: <4E8C22EB0200007800059622@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 05 Oct 2011 08:27:07 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Eli Cohen" <eli@dev.mellanox.co.il>
Subject: Re: [Xen-devel] Xen interrupts when using passthrough
References: <20111004162906.GA2681@mtldesk30> <4E8B3949.4090803@citrix.com>
	<20111004190034.GA19881@mtldesk30>
In-Reply-To: <20111004190034.GA19881@mtldesk30>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Andrew Cooper <andrew.cooper3@citrix.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 04.10.11 at 21:00, Eli Cohen <eli@dev.mellanox.co.il> wrote:
> Here's a description. I have a PCI device which supports SRIOV, so
> there are several virtual functions besides the primary function. The
> device generates interrupts using MSI-X. I bind one of the virtual
> functions to the guest. The PCI device driver at the guest requests
> msix vectors from kernel and gets two vectors. Then it calls
> request_irq for those vectors.
> When the device generates msix interrupt using the address/data in
> it's msi-x table. However, the guest kernel complains the no handler
> is registered for this vector. Specifically, I request_irq for vectors
> 48 and 49. When the device issues interrupt for vector 49, the guest
> complains that it received interrupt for vector 89 which has no
> handler routine.

Quite possibly a mixup of Xen and Linux IRQ numbers. You may want
to check Xen's 'i' and 'e' debug key output for whether this might be
the case.

> My geust kernel is 2.6.32 based

Upstream (pv-ops), forward-port (most likely SUSE-derived), HVM, or
yet something else?

> and I can't see any file with the name
> event_channel.c.

That's a hypervisor source file, not a Linux one.

Jan


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 00:40:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 00:40:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBM5K-00075r-NS; Wed, 05 Oct 2011 00:40:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBM4k-0006rz-O5
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 00:39:35 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1317800369!31830795!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15978 invoked from network); 5 Oct 2011 07:39:31 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-6.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 07:39:31 -0000
Received: by pzk34 with SMTP id 34so3544517pzk.8
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 00:39:29 -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=2h/AcFLN4t0rewl6KqYcHSKeVtCxWFxwngBTL7rw84o=;
	b=h+D38bTS5shH98jZEvdibLJp8voPSEGHw5dp1I8wzmiepaQpiUzZ3sD7HIgZv//LBT
	2/Wn38ct4sWAF0BSWU8qt03aOM8zuYIbk7A898a2zX6hrbBO1vu/lOvsYVWUbxDRxACg
	s4AN8GoLj6dAlI7zI4NtoNvELx3fnh0a23H3I=
MIME-Version: 1.0
Received: by 10.68.31.4 with SMTP id w4mr16449730pbh.20.1317800369389; Wed, 05
	Oct 2011 00:39:29 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Wed, 5 Oct 2011 00:39:29 -0700 (PDT)
In-Reply-To: <1317738381.21903.150.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317386580@loki>
	<CAPLaKK7cbZG5SnCKdi7DaivNWmz6Ojj5NzFkQ=Wo-jL3RYEQKA@mail.gmail.com>
	<1317735234.21903.141.camel@zakaz.uk.xensource.com>
	<CAPLaKK5kCDXiuEeUrJotC4x6qKRTnv6w=kV0VBfZ64hHjQNpcA@mail.gmail.com>
	<1317738381.21903.150.camel@zakaz.uk.xensource.com>
Date: Wed, 5 Oct 2011 09:39:29 +0200
X-Google-Sender-Auth: FOy8mMQNi3cv536Ds1QDCeSYeKM
Message-ID: <CAPLaKK45f6pMM8R=zNzE5_AvmBSZmjEiUXQzEGD6hh6BEN=QTA@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [PATCH 0 of 9] Call hotplug scripts from libxl
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
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

> I don't think "xl shutdown" daemonises ever.
>
> "xl create" daemonises itself and waits for the guest to die. It should
> be detecting the guest shutdown no matter if it is triggered internally
> or externally. That's not to say it's not buggy though...

Sorry for the stupid question, this seems to not be working ok on
NetBSD, I will check it and post a patch.

Regards, Roger.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 00:46:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 00:46:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBMBr-0007cS-PK; Wed, 05 Oct 2011 00:46:55 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBMBD-0007QZ-Er
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 00:46:15 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1317800771!31832145!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7940 invoked from network); 5 Oct 2011 07:46:12 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-6.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 07:46:12 -0000
Received: by gyh3 with SMTP id 3so2280078gyh.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 00:46: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=/dcNAF0ma59natkwVml2G25+ptFQL7ACUrv5syZND6g=;
	b=JPmhKuxO39sIl0BodVmMY1akyb4k4+66ebx6MdlGCvFqEteyJ5P9Hx6VtIP9bj4C7B
	gS7idCYPPTq7wkIK3E1abYYKaO+mdztnTwHO7WrFUjfKpoxYcBXVX+UJVHhL0WlAug1x
	BZoHCahby0p+gcGKbClGRvYUQYBtKDc983As4=
MIME-Version: 1.0
Received: by 10.68.11.138 with SMTP id q10mr16293546pbb.37.1317800770371; Wed,
	05 Oct 2011 00:46:10 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Wed, 5 Oct 2011 00:46:10 -0700 (PDT)
In-Reply-To: <1317749511.24742.2.camel@dagon.hellion.org.uk>
References: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
	<1317749511.24742.2.camel@dagon.hellion.org.uk>
Date: Wed, 5 Oct 2011 09:46:10 +0200
X-Google-Sender-Auth: kwVspdkxISkscAIsNobNnatc_5g
Message-ID: <CAPLaKK7rMSy+xn4twbuEUiLsxgv-JRRBYAwFaDuwRgBvisjk8g@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> Really?

NetBSD added this files to blktap lib to be able to compile it, since
Qemu needed it:

http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/pkgsrc/sysutils/xentools41/files/blk_netbsd.c?rev=1.1.1.1&content-type=text/plain&only_with_tag=MAIN
http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/pkgsrc/sysutils/xentools41/files/blktapctrl_netbsd.c?rev=1.1.1.1&content-type=text/plain&only_with_tag=MAIN

Removing blktap from the build process seems more logical than adding
a dummy library to the system in my opinion, and doesn't affect Qemu,
since only the init_blktap function was called.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 01:02:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 01:02:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBMQs-0008GC-5R; Wed, 05 Oct 2011 01:02:26 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBMNS-00080d-3Q
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 00:59:04 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1317801530!33989901!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 317 invoked from network); 5 Oct 2011 07:58:51 -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;
	5 Oct 2011 07:58:51 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312156800"; 
   d="scan'208";a="8217640"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 07:58:50 +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, 5 Oct 2011
	08:58:51 +0100
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 5 Oct 2011 08:58:50 +0100
In-Reply-To: <CAPLaKK7rMSy+xn4twbuEUiLsxgv-JRRBYAwFaDuwRgBvisjk8g@mail.gmail.com>
References: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
	<1317749511.24742.2.camel@dagon.hellion.org.uk>
	<CAPLaKK7rMSy+xn4twbuEUiLsxgv-JRRBYAwFaDuwRgBvisjk8g@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317801530.21903.163.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 Wed, 2011-10-05 at 08:46 +0100, Roger Pau MonnÃ© wrote:
> > Really?
> 
> NetBSD added this files to blktap lib to be able to compile it, since
> Qemu needed it:
> 
> http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/pkgsrc/sysutils/xentools41/files/blk_netbsd.c?rev=1.1.1.1&content-type=text/plain&only_with_tag=MAIN
> http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/pkgsrc/sysutils/xentools41/files/blktapctrl_netbsd.c?rev=1.1.1.1&content-type=text/plain&only_with_tag=MAIN
> 
> Removing blktap from the build process seems more logical than adding
> a dummy library to the system in my opinion, and doesn't affect Qemu,
> since only the init_blktap function was called.

I meant is the author of this patch really called "Charlie Root" with
email address "root@loki.(none)". The email address is certainly
invalid.

Ian.



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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 01:05:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 01:05:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBMTg-0000D3-I8; Wed, 05 Oct 2011 01:05:20 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBMPL-00082d-6Z
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 01:00:56 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1317801646!19164669!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30262 invoked from network); 5 Oct 2011 08:00:47 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 08:00:47 -0000
Received: by pzk34 with SMTP id 34so3584768pzk.8
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 01:00:46 -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=2mMUYlNbHnUglW6zpZzz1ycVSaDioulM6sb8lXL6nac=;
	b=DaXZCu9fptvgoVCg3i9iRUu+k0qEioRx11/d4qO/15jsbBZH6Aa7HRjdDEjoadobmD
	30H2JnLpFx3YOZfTeyG64f4yxTlGFlvStK4khCrKWIjB2jiu2qj78re0J4gPNA0iBfAF
	9pe68wbfb1J2VwZNOXD7Tdd/hjHx+5M/9AtBY=
MIME-Version: 1.0
Received: by 10.68.4.170 with SMTP id l10mr16489741pbl.3.1317801645909; Wed,
	05 Oct 2011 01:00:45 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Wed, 5 Oct 2011 01:00:45 -0700 (PDT)
In-Reply-To: <1317801530.21903.163.camel@zakaz.uk.xensource.com>
References: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
	<1317749511.24742.2.camel@dagon.hellion.org.uk>
	<CAPLaKK7rMSy+xn4twbuEUiLsxgv-JRRBYAwFaDuwRgBvisjk8g@mail.gmail.com>
	<1317801530.21903.163.camel@zakaz.uk.xensource.com>
Date: Wed, 5 Oct 2011 10:00:45 +0200
X-Google-Sender-Auth: mYpsLUd_MRN33lyvwWh3TLaVWFs
Message-ID: <CAPLaKK4Pf34THUrGK-msxkgox6cO8EaSpwhvZS+Xw13tYEwzDw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
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

Sorry, I didn't realize that, it was my first time sending patches
using git send-email, should I resend the patch?

Regards, Roger.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 01:26:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 01:26:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBMno-0001Xw-6U; Wed, 05 Oct 2011 01:26:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBMmw-0001LI-14
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 01:25:15 -0700
X-Env-Sender: Andre.Przywara@amd.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317803090!40892721!1
X-Originating-IP: [213.199.154.208]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30727 invoked from network); 5 Oct 2011 08:24:50 -0000
Received: from am1ehsobe005.messaging.microsoft.com (HELO
	AM1EHSOBE005.bigfish.com) (213.199.154.208)
	by server-6.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	5 Oct 2011 08:24:50 -0000
Received: from mail71-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, 5 Oct 2011 08:25:10 +0000
Received: from mail71-am1 (localhost.localdomain [127.0.0.1])	by
	mail71-am1-R.bigfish.com (Postfix) with ESMTP id 6D53D17A80A1;
	Wed,  5 Oct 2011 08:25:10 +0000 (UTC)
X-SpamScore: -17
X-BigFish: VPS-17(zzbb2dK9371K936eK1432N98dKzz1202hzz8275bhz32i668h839h93fh61h)
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 mail71-am1 (localhost.localdomain [127.0.0.1]) by mail71-am1
	(MessageSwitch) id 1317803109311365_32120;
	Wed,  5 Oct 2011 08:25:09 +0000 (UTC)
Received: from AM1EHSMHS008.bigfish.com (unknown [10.3.201.242])	by
	mail71-am1.bigfish.com (Postfix) with ESMTP id 46B0EE0056;
	Wed,  5 Oct 2011 08:25:09 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	AM1EHSMHS008.bigfish.com (10.3.207.108) with Microsoft SMTP Server id
	14.1.225.22; Wed, 5 Oct 2011 08:25:08 +0000
X-WSS-ID: 0LSL3DS-01-2ZS-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 20738102859D;	Wed,  5 Oct 2011 03:25:03 -0500 (CDT)
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.106.1;
	Wed, 5 Oct 2011 03:25:17 -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;
	Wed, 5 Oct 2011 03:25:06 -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;
	Wed, 5 Oct 2011 04:25:03 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 5105B49C1FF; Wed,  5 Oct 2011
	09:25:02 +0100 (BST)
Received: from [165.204.15.38] (wanderer.osrc.amd.com [165.204.15.38])	by
	mail.osrc.amd.com (Postfix) with ESMTPS id 35E2B5940FF; Wed,  5 Oct 2011
	10:25:02 +0200 (CEST)
Message-ID: <4E8C1430.3050203@amd.com>
Date: Wed, 5 Oct 2011 10:24:16 +0200
From: Andre Przywara <andre.przywara@amd.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.18) Gecko/20110705 Lightning/1.0b2 Thunderbird/3.1.11
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] tools/check: check for yajl (needed by libxl)
References: <4b98868690218126b906.1317368189@cosworth.uk.xensource.com>	
	<CAJJyHjL55fNgwrmDVdCehaOLC1mPecf8M4fE4RCn_g_vygj=0A@mail.gmail.com>	
	<1317379194.26672.256.camel@zakaz.uk.xensource.com>	
	<4E8B1CCA.4040805@amd.com>
	<1317740400.21903.155.camel@zakaz.uk.xensource.com>
In-Reply-To: <1317740400.21903.155.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset="UTF-8"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: Anthony Perard <anthony.perard@citrix.com>, Olaf Hering <olaf@aepfle.de>,
	"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 10/04/2011 05:00 PM, Ian Campbell wrote:
> On Tue, 2011-10-04 at 15:48 +0100, Andre Przywara wrote:
>> On 09/30/2011 12:39 PM, Ian Campbell wrote:
>>> On Fri, 2011-09-30 at 11:35 +0100, Anthony PERARD wrote:
>>>> On Fri, Sep 30, 2011 at 08:36, Ian Campbell<ian.campbell@citrix.com>   wrote:
>>>>   ...
>>>> You probably want to check the yajl headers as well, no ?
>>>> #include<yajl/yajl_parse.h>
>>>> #include<yajl/yajl_gen.h>
>>>
> ...
>> Also wouldn't it be nicer to link this small library statically? This
>> would omit the runtime requirement at all.
>> The test team just spelled yajl as "yet another library to get Xen
>> running"...
>
> I don't think this is necessary, it's just a library you need to install
> and for most users the packaging system will transparently cover this.
> All the usual reasons for not statically linking stuff apply here.
> There's nothing special about that wrt Xen and/or the size of the
> library.

Unfortunately this package is not omnipresent in the distributions. 
Though I find it already in Fedora 13, it is not in the official RHEL5 
repos, also not in anything before OpenSuSE 11.4 and before SLES11SP2. 
This creates quite some hassle for any people using one of these systems 
to build and run Xen. And pulling it from github will push most people 
(like me ;-) into version 2 in the first place.

But I guess this will not convince you to drop it from unstable. That's 
why I thought static linking (or including in the tree?) would ease the 
pain here.

>> Also be advised that it looks like this is relying on version 1 of yajl.
>> It looks like the new version 2.0.1 is not compatible, I got compile
>> errors with the newer version. If the stable version 1.x is required,
>> this should be stated somewhere or at least checked properly in check_yajl.
>
> Any idea what we could test for here?

The sanest way would be to do it like configure and check explicitly for 
the data structure that we rely on, but I guess just looking for a 
symlink called libyajl.so.1 in /usr/lib64 should suffice here.


>>> diff -r 302b7556edd9 -r de602616358b tools/check/check_yajl_lib
>>> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
>>> +++ b/tools/check/check_yajl_lib	Fri Sep 30 11:39:35 2011 +0100
>>> @@ -0,0 +1,6 @@
>>> +#!/bin/sh
>>> +# CHECK-BUILD CHECK-INSTALL
>>> +
>>> +. ./funcs.sh
>>> +
>>> +has_lib libyajl.so || fail "can't find libyajl.so"

+has_lib libyajl.so.1 || fail "can't find libyajl.so version 1"

Regards,
Andre.

-- 
Andre Przywara
AMD-OSRC (Dresden)
Tel: x29712


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 01:27:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 01:27:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBMpR-00021G-Da; Wed, 05 Oct 2011 01:27:49 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBMoL-0001gd-Ff
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 01:26:41 -0700
X-Env-Sender: eli@dev.mellanox.co.il
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317803198!20291787!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13933 invoked from network); 5 Oct 2011 08:26:38 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 08:26:38 -0000
Received: by eyd10 with SMTP id 10so331192eyd.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 01:26:38 -0700 (PDT)
Received: by 10.223.10.25 with SMTP id n25mr3207124fan.72.1317803197852;
	Wed, 05 Oct 2011 01:26:37 -0700 (PDT)
Received: from localhost ([82.166.227.17])
	by mx.google.com with ESMTPS id w14sm1337939fae.13.2011.10.05.01.26.35
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 05 Oct 2011 01:26:36 -0700 (PDT)
Date: Wed, 5 Oct 2011 10:26:33 +0200
From: Eli Cohen <eli@dev.mellanox.co.il>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] Xen interrupts when using passthrough
Message-ID: <20111005082633.GC2681@mtldesk30>
References: <20111004162906.GA2681@mtldesk30> <4E8B3949.4090803@citrix.com>
	<20111004190034.GA19881@mtldesk30>
	<4E8C22EB0200007800059622@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8C22EB0200007800059622@nat28.tlf.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: Andrew Cooper <andrew.cooper3@citrix.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 Wed, Oct 05, 2011 at 08:27:07AM +0100, Jan Beulich wrote:
> 
> Quite possibly a mixup of Xen and Linux IRQ numbers. You may want
> to check Xen's 'i' and 'e' debug key output for whether this might be
> the case.

Can you tell how this is done - sorry, I'm not a xen expert.

> 
> > My geust kernel is 2.6.32 based
> 
> Upstream (pv-ops), forward-port (most likely SUSE-derived), HVM, or
> yet something else?
> 
> > and I can't see any file with the name
> > event_channel.c.
> 
> That's a hypervisor source file, not a Linux one.
> 

So how do you think interrupts should reach the guest. Is it through
event channels (i.e dom0 receives them first) or do they go directly
to the guest with dom0 unaware that there was an interrupt?

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 01:52:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 01:52:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNCx-00035N-BG; Wed, 05 Oct 2011 01:52:07 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNC7-0002t1-HG
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 01:51:15 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317804683!54193314!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32557 invoked from network); 5 Oct 2011 08:51:23 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 5 Oct 2011 08:51:23 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 05 Oct 2011 09:51:11 +0100
Message-Id: <4E8C369E020000780005967C@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 05 Oct 2011 09:51:10 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Eli Cohen" <eli@dev.mellanox.co.il>
Subject: Re: [Xen-devel] Xen interrupts when using passthrough
References: <20111004162906.GA2681@mtldesk30> <4E8B3949.4090803@citrix.com>
	<20111004190034.GA19881@mtldesk30>
	<4E8C22EB0200007800059622@nat28.tlf.novell.com>
	<20111005082633.GC2681@mtldesk30>
In-Reply-To: <20111005082633.GC2681@mtldesk30>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Andrew Cooper <andrew.cooper3@citrix.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 05.10.11 at 10:26, Eli Cohen <eli@dev.mellanox.co.il> wrote:
> On Wed, Oct 05, 2011 at 08:27:07AM +0100, Jan Beulich wrote:
>>=20
>> Quite possibly a mixup of Xen and Linux IRQ numbers. You may want
>> to check Xen's 'i' and 'e' debug key output for whether this might be
>> the case.
>=20
> Can you tell how this is done - sorry, I'm not a xen expert.

Either by sending the characters from the serial console (after switching
input to Xen), or by using "{xl,xm] debug-key" followed by
"{xm,xl} dmesg" to view the output.

>>=20
>> > My geust kernel is 2.6.32 based
>>=20
>> Upstream (pv-ops), forward-port (most likely SUSE-derived), HVM, or
>> yet something else?
>>=20
>> > and I can't see any file with the name
>> > event_channel.c.
>>=20
>> That's a hypervisor source file, not a Linux one.
>>=20
>=20
> So how do you think interrupts should reach the guest. Is it through
> event channels (i.e dom0 receives them first) or do they go directly
> to the guest with dom0 unaware that there was an interrupt?

Dom0 shouldn't get involved at all - Xen does the necessary conversion.
Dom0 may only be involved in setting things up. Whether they get
received via event channels or virtual interrupts depends on the kind
of guest.

Jan


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:03:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:03:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNOL-0003dt-B9; Wed, 05 Oct 2011 02:03:53 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNLV-0003PN-1i
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:01:18 -0700
X-Env-Sender: eli@dev.mellanox.co.il
X-Msg-Ref: server-5.tower-174.messagelabs.com!1317805252!30288007!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6150 invoked from network); 5 Oct 2011 09:00:53 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:00:53 -0000
Received: by ywm21 with SMTP id 21so2278494ywm.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 02:00:52 -0700 (PDT)
Received: by 10.223.17.219 with SMTP id t27mr3189282faa.123.1317805252024;
	Wed, 05 Oct 2011 02:00:52 -0700 (PDT)
Received: from localhost ([82.166.227.17])
	by mx.google.com with ESMTPS id h16sm1442440fab.19.2011.10.05.02.00.49
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 05 Oct 2011 02:00:50 -0700 (PDT)
Date: Wed, 5 Oct 2011 11:00:48 +0200
From: Eli Cohen <eli@dev.mellanox.co.il>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] Xen interrupts when using passthrough
Message-ID: <20111005090048.GD2681@mtldesk30>
References: <20111004162906.GA2681@mtldesk30> <4E8B3949.4090803@citrix.com>
	<20111004190034.GA19881@mtldesk30>
	<4E8C22EB0200007800059622@nat28.tlf.novell.com>
	<20111005082633.GC2681@mtldesk30>
	<4E8C369E020000780005967C@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8C369E020000780005967C@nat28.tlf.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: Andrew Cooper <andrew.cooper3@citrix.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 Wed, Oct 05, 2011 at 09:51:10AM +0100, Jan Beulich wrote:
> 
> Either by sending the characters from the serial console (after switching
> input to Xen), or by using "{xl,xm] debug-key" followed by
> "{xm,xl} dmesg" to view the output.
> 
Thanks.
> 
> Dom0 shouldn't get involved at all - Xen does the necessary conversion.
> Dom0 may only be involved in setting things up. Whether they get
> received via event channels or virtual interrupts depends on the kind
> of guest.
> 
I think I used the wrong terminology not distinguishing between the
hypervisor and dom0 so I will ask again just to make sure. Is the
hypervisor involved in passing the interrupts? Does it depend on
whether the guest is paravirtualized or not? The guest I am using is
paravirtualized (i.e uses xen hypercalls), so does it mean that it
uses event channels or is there a possibilty that it does not use
event channels.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:08:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:08:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNTB-0004jG-JD; Wed, 05 Oct 2011 02:08:54 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNPJ-0003kd-1R
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:04:55 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1317805470!45255026!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26149 invoked from network); 5 Oct 2011 09:04:32 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:04:32 -0000
Received: by pzk34 with SMTP id 34so3700550pzk.8
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 02:04:48 -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=0CmHk9UCqMFdHrvgDwRtHpa2ReB4b42LNxhN5F34TEY=;
	b=Dzis/ztJKz3X/Syfw/YaH7NwAoaw+Z9fbgVsgWYeyKTbGtCRHjOnUSuyKNYNAahN48
	fy/hfOBm1sq1SFPZdgzHei2PqefmALizCm0Tk8hVFv1wCuyjhqkxqYGl8TGH+tog+fpO
	Ar/NbSWXuS7Bm5kkRGIB6EAKpjdPEj3Jc8nuI=
MIME-Version: 1.0
Received: by 10.68.31.4 with SMTP id w4mr17023276pbh.20.1317805487914; Wed, 05
	Oct 2011 02:04:47 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Wed, 5 Oct 2011 02:04:47 -0700 (PDT)
In-Reply-To: <1317717163.21903.80.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<CAPLaKK7qFpZcrjWdNESwotc70KVVvNpC1SOoSqc9esFKJoM3=Q@mail.gmail.com>
	<1317715976.21903.73.camel@zakaz.uk.xensource.com>
	<1317717163.21903.80.camel@zakaz.uk.xensource.com>
Date: Wed, 5 Oct 2011 11:04:47 +0200
X-Google-Sender-Auth: 8odtqW3MqWUmef0voe4KIk1unU0
Message-ID: <CAPLaKK5w_ott56OYzwHg7b2SXbkoDyVsLCe+gauASUCaHeiv2w@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 00 of 23] libxl: rationalise libxl_device_*
	APIs
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: Mike McClurg <mike.mcclurg@citrix.com>, Jim Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>,
	Dave Scott <Dave.Scott@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

> BTW the mbox extension (http://mercurial.selenic.com/wiki/MboxExtension)
> can make this a bit easier for larger series, since you can save all the
> messages to an mbox and import that in one go.

Thanks for the suggestion, the mbox extension helps a lot to import
large series. I'm having trouble applying your patches to tip, your
libxl_utils.c seems to be different from the one present in the
xen-unstable repository, should I apply some other patches before
yours?

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:09:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:09:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNU7-00056X-Uj; Wed, 05 Oct 2011 02:09:51 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNTQ-0004o4-Lk
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:09:09 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1317805745!33977575!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7045 invoked from network); 5 Oct 2011 09:09:05 -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; 5 Oct 2011 09:09:05 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 05 Oct 2011 10:09:04 +0100
Message-Id: <4E8C3ACD0200007800059694@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 05 Oct 2011 10:09:01 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Eli Cohen" <eli@dev.mellanox.co.il>
Subject: Re: [Xen-devel] Xen interrupts when using passthrough
References: <20111004162906.GA2681@mtldesk30> <4E8B3949.4090803@citrix.com>
	<20111004190034.GA19881@mtldesk30>
	<4E8C22EB0200007800059622@nat28.tlf.novell.com>
	<20111005082633.GC2681@mtldesk30>
	<4E8C369E020000780005967C@nat28.tlf.novell.com>
	<20111005090048.GD2681@mtldesk30>
In-Reply-To: <20111005090048.GD2681@mtldesk30>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Andrew Cooper <andrew.cooper3@citrix.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 05.10.11 at 11:00, Eli Cohen <eli@dev.mellanox.co.il> wrote:
> On Wed, Oct 05, 2011 at 09:51:10AM +0100, Jan Beulich wrote:
>> Dom0 shouldn't get involved at all - Xen does the necessary conversion.
>> Dom0 may only be involved in setting things up. Whether they get
>> received via event channels or virtual interrupts depends on the kind
>> of guest.
>>=20
> I think I used the wrong terminology not distinguishing between the
> hypervisor and dom0 so I will ask again just to make sure. Is the
> hypervisor involved in passing the interrupts?

Yes, of course. The hypervisor receives all physical interrupts.

> Does it depend on whether the guest is paravirtualized or not?

Yes, at least to some degree.

> The guest I am using is
> paravirtualized (i.e uses xen hypercalls), so does it mean that it
> uses event channels or is there a possibilty that it does not use
> event channels.

Yes and no: PV guests can receive interrupts only via the event
channel mechanism.

Jan


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:28:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:28:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNlg-0005jJ-Gq; Wed, 05 Oct 2011 02:28:00 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNkx-0005XV-8n
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:27:15 -0700
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1317806785!51066819!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17466 invoked from network); 5 Oct 2011 09:26:25 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:26:25 -0000
Received: by bkas6 with SMTP id s6so2562443bka.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 02:27:11 -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:content-transfer-encoding;
	bh=lIFjSXBebokNuQ596JY0orPMSCDJwl9XT+34hmEk/C8=;
	b=jNd6g3OQdVShf5VGULx+9JciABXdQxmszDSEx5q/RxCg5QK/CSSDwJu7w3VvWr8GUC
	RBp0kPSCBTlEvDM2f2fJ87BEM8PfMuC2t8i8fTBM6tK5wZXp93dj8hcjfQsXkCXZMmRV
	TDeoiK/wvV1IUC5cNVma+C47azRH/7TVQTjVU=
MIME-Version: 1.0
Received: by 10.223.8.2 with SMTP id f2mr3322086faf.23.1317806830914; Wed, 05
	Oct 2011 02:27:10 -0700 (PDT)
Received: by 10.223.72.205 with HTTP; Wed, 5 Oct 2011 02:27:10 -0700 (PDT)
In-Reply-To: <1317737477.21903.148.camel@zakaz.uk.xensource.com>
References: <CAP2B85_LhqE9F53FAJ3ez3+GDichDTcWiau=x2zdftqGdcADag@mail.gmail.com>
	<1317726163.21903.113.camel@zakaz.uk.xensource.com>
	<1317734390.21903.135.camel@zakaz.uk.xensource.com>
	<1317737477.21903.148.camel@zakaz.uk.xensource.com>
Date: Wed, 5 Oct 2011 18:27:10 +0900
Message-ID: <CAP2B859GBD+Ps8p=_wBzjU=TB74Di=D1uxrOtfjnEmh7fA0WFw@mail.gmail.com>
Subject: Re: [Xen-devel] Help with test_and_clear_bit on events
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
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, Oct 4, 2011 at 11:11 PM, Ian Campbell <Ian.Campbell@citrix.com> wro=
te:
> On Tue, 2011-10-04 at 14:19 +0100, Ian Campbell wrote:
>
> Two more bugs:
>
> A domid is 16 bits not 64, see struct xen_add_to_physmap. So the
> structure passed to the hypercall doesn't line up and you don't really
> end up with the shared info in the right place.
>
> Secondly in:
>
> =A0 =A0 =A0 =A0int wait =3D test_and_clear_bit(event, shinfo->evtchn_pend=
ing);
> =A0 =A0 =A0 =A0int ret =3D 1;
> =A0 =A0 =A0 =A0while (!wait || ret){
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ret =3D hypercall_sched_op(SCHEDOP_poll, &=
poll);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0wait =3D test_and_clear_bit(event, shinfo-=
>evtchn_pending);
> =A0 =A0 =A0 =A0}
>
> This will always go through the loop at least once, even if wait is
> already true because ret =3D=3D 1. But if wait was already one then you h=
ave
> cleared the bit so wait will then become 0 on the first time through the
> loop and since you won't get any more events you get stuck in the loop.
> I think you meant && !ret or something, but really you should be doing
> BUG on !ret.
>
> With all those fixed things seem to work for me. I do
> xenstore-write /local/domain/$(xl domid dHVM-1)/device/vbd/768/test foo
> twice to get through the test code and it continues on to boot the
> guest.

Thank you Ian, it works flawlessly... Sorry about the bug. Github repo
is up to date.
With this, do you consider that any other xenbus functionality should
be added? It can read, write, directory and watch. Maybe, unwatch?

Shall I continue with the blk rings?

>
> My patch (with debug and hacks included) is below.
>
> Ian.
>
> diff --git a/src/xen-xs.c b/src/xen-xs.c
> index 9f583f9..4c208d4 100644
> --- a/src/xen-xs.c
> +++ b/src/xen-xs.c
> @@ -126,14 +126,21 @@ static void ring_wait(void)
> =A0 =A0 =A0 =A0memset(&poll, 0, sizeof(poll));
> =A0 =A0 =A0 =A0set_xen_guest_handle(poll.ports, &event);
> =A0 =A0 =A0 =A0poll.nr_ports =3D 1;
> - =A0 =A0 =A0 dprintf(1,"evtchn_pending 0x%p , 0x%lx at event %d \n",shin=
fo->evtchn_pending,shinfo->evtchn_pending[event],event);
> + =A0 =A0 =A0 dprintf(1, "shared info %p\n", shinfo);
> + =A0 =A0 =A0 dprintf(1,"evtchn_pending %p , 0x%lx at event %d \n",shinfo=
->evtchn_pending,shinfo->evtchn_pending[0],event);
> + =A0 =A0 =A0 while ( !test_and_clear_bit(event, shinfo->evtchn_pending) =
)
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 hypercall_sched_op(SCHEDOP_poll, &poll);
> +
> +#if 0
> =A0 =A0 =A0 =A0int wait =3D test_and_clear_bit(event, shinfo->evtchn_pend=
ing);
> - =A0 =A0 =A0 int ret =3D 1;
> + =A0 =A0 =A0 int ret =3D 0;
> + =A0 =A0 =A0 dprintf(1,"DEBUG bit clear is %d and ret %d\n",wait,ret);
> =A0 =A0 =A0 =A0while (!wait || ret){
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ret =3D hypercall_sched_op(SCHEDOP_poll, &=
poll);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0wait =3D test_and_clear_bit(event, shinfo-=
>evtchn_pending);
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dprintf(1,"DEBUG bit clear is %d and ret %=
d\n",wait,ret);
> =A0 =A0 =A0 =A0}
> +#endif
> =A0}
>
> =A0static void ring_wait2(void)
> diff --git a/src/xen.c b/src/xen.c
> index e8469b0..312c206 100644
> --- a/src/xen.c
> +++ b/src/xen.c
> @@ -154,11 +154,20 @@ struct shared_info *get_shared_info(void)
> =A0 =A0 xatp.domid =3D DOMID_SELF;
> =A0 =A0 xatp.space =3D XENMAPSPACE_shared_info;
> =A0 =A0 xatp.idx =A0 =3D 0;
> - =A0 =A0shared_info =3D malloc_high(sizeof(shared_info));
> - =A0 =A0xatp.gpfn =A0=3D ((unsigned long)shared_info << PAGE_SHIFT);
> + =A0 =A0shared_info =3D memalign_high(PAGE_SIZE, PAGE_SIZE);

Here was my big mistake...

> + =A0 =A0memset(shared_info, 0, PAGE_SIZE);
> + =A0 =A0xatp.gpfn =A0=3D ((unsigned long)shared_info >> PAGE_SHIFT);
> + =A0 =A0dprintf(1, "allocated shared info %d bytes at %p, gpfn 0x%lx\n",
> + =A0 =A0 =A0 =A0 =A0 sizeof(*shared_info), shared_info, xatp.gpfn);
> =A0 =A0 //xatp.gpfn =A0=3D malloc_high(sizeof(shared_info));
> =A0 =A0 //shared_info =3D (struct shared_info *)(xatp.gpfn << PAGE_SHIFT)=
;
> =A0 =A0 if (hypercall_memory_op(XENMEM_add_to_physmap, &xatp) !=3D 0)
> =A0 =A0 =A0 =A0 panic("MAP info page fail");
> + =A0 =A0dprintf(1, "time is %d\n", shared_info->wc_sec);
> + =A0 =A0dprintf(1, "evtchn_pending[0] 0x%08lx\n", shared_info->evtchn_pe=
nding[0]);
> + =A0 =A0dprintf(1, "evtchn_mask[0] 0x%08lx\n", shared_info->evtchn_mask[=
0]);
> + =A0 =A0dprintf(1, "VCPU0 evtchn_upcall_pending 0x%x\n", shared_info->vc=
pu_info[0].evtchn_upcall_pending);
> + =A0 =A0dprintf(1, "VCPU0 evtchn_upcall_mask 0x%x\n", shared_info->vcpu_=
info[0].evtchn_upcall_mask);
> + =A0 =A0dprintf(1, "VCPU0 evtchn_pending_sel 0x%08lx\n", shared_info->vc=
pu_info[0].evtchn_pending_sel);
> =A0 =A0 return shared_info;
> =A0}
> diff --git a/src/xen.h b/src/xen.h
> index 1317af9..d838a7c 100644
> --- a/src/xen.h
> +++ b/src/xen.h
> @@ -480,7 +480,7 @@ static struct xsd_errors __attribute__ ((unused)) xsd=
_errors[]
> =A0#define XENMEM_add_to_physmap =A0 =A0 =A07
> =A0struct xen_add_to_physmap {
> =A0 =A0 /* Which domain to change the mapping for. */
> - =A0 =A0u64 domid;
> + =A0 =A0u16 domid;
>
> =A0 =A0 /* Source mapping space. */
> =A0#define XENMAPSPACE_shared_info 0 /* shared info page */
> @@ -503,7 +503,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t);
> =A0/*
> =A0* Wrappers for hypercalls
> =A0*/
> -static int hypercall_xen_version( int cmd, void *arg)
> +static inline int hypercall_xen_version( int cmd, void *arg)
> =A0{
> =A0 =A0 =A0 =A0return _hypercall2(int, xen_version, cmd, arg);
> =A0}
> @@ -520,7 +520,7 @@ static inline int hypercall_event_channel_op(int cmd,=
 void *arg)
>
> =A0static inline int hypercall_memory_op(int cmd ,void *arg)
> =A0{
> - =A0 =A0 =A0 return _hypercall2(int, memory_op, cmd ,arg);
> + =A0 =A0 =A0 return _hypercall2(int, memory_op, cmd, arg);
> =A0}
>
> =A0static inline int hypercall_sched_op(int cmd, void *arg)
>
>
>



--=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 Oct 05 02:29:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:29:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNmo-00067L-Bs; Wed, 05 Oct 2011 02:29:10 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNlr-0005mz-HX
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:28:11 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1317806888!20974599!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22198 invoked from network); 5 Oct 2011 09:28:08 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:28:08 -0000
Received: by wwf27 with SMTP id 27so1833392wwf.24
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 02:28:08 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to
	:references; bh=V6c4Y9/1ZiJxv0LifmgRcnP42YH7LC13OkOT+BdQdTg=;
	b=aUPHnqyixZRDt9PkUNgw++m8IxkhJt07xg7+K4BKYL9PtLSRa/Tl1DRDxAY1x6OskD
	zbSheqRipIiBmjIK9Xj0pChDar3F/ZAAuuRoVGDloGEffNEeKEycaIdpk5uMlb729ZBG
	OOIE8alfLHaYMkvdAPl72Fjj6ja+RcSUlwbNw=
Received: by 10.216.9.201 with SMTP id 51mr2607566wet.94.1317806888118;
	Wed, 05 Oct 2011 02:28:08 -0700 (PDT)
Received: from localhost.localdomain (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id gd6sm1866229wbb.1.2011.10.05.02.28.06
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 05 Oct 2011 02:28:06 -0700 (PDT)
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Date: Wed,  5 Oct 2011 11:28:03 +0200
Message-Id: <1317806883-22947-1-git-send-email-roger.pau@entel.upc.edu>
X-Mailer: git-send-email 1.7.6.3
In-Reply-To: <1317801530.21903.163.camel@zakaz.uk.xensource.com>
References: <1317801530.21903.163.camel@zakaz.uk.xensource.com>
Cc: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

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>
---
 hw/xen_machine_pv.c |    2 +-
 xen-config-host.h   |    2 +-
 xen-hooks.mak       |    2 ++
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/hw/xen_machine_pv.c b/hw/xen_machine_pv.c
index 0004904..c09adbb 100644
--- a/hw/xen_machine_pv.c
+++ b/hw/xen_machine_pv.c
@@ -47,7 +47,7 @@ static void xen_init_pv(ram_addr_t ram_size, int vga_ram_size,
     CPUState *env;
     uint32_t domid_target;
 
-#ifndef CONFIG_STUBDOM
+#if !defined(CONFIG_STUBDOM) && !defined(__NetBSD__)
     /* Initialize tapdisk client */
     init_blktap();
 #endif
diff --git a/xen-config-host.h b/xen-config-host.h
index f50c3aa..818f25d 100644
--- a/xen-config-host.h
+++ b/xen-config-host.h
@@ -18,7 +18,7 @@ extern int domid, domid_backend;
 
 #include "xenctrl.h"
 #include "xs.h"
-#ifndef CONFIG_STUBDOM
+#if !defined(CONFIG_STUBDOM) && !defined(__NetBSD__)
 #include "blktaplib.h"
 #endif
 
diff --git a/xen-hooks.mak b/xen-hooks.mak
index 253915d..b55f45b 100644
--- a/xen-hooks.mak
+++ b/xen-hooks.mak
@@ -46,11 +46,13 @@ CONFIG_SDL=
 CONFIG_AUDIO=
 OBJS += xenfbfront.o
 else
+ifndef CONFIG_NetBSD
 CPPFLAGS+= -I$(XEN_ROOT)/tools/blktap/lib
 LIBS += -L$(XEN_ROOT)/tools/blktap/lib -lblktap
 OBJS += xen_blktap.o
 OBJS += tpm_tis.o
 endif
+endif
 
 ifdef CONFIG_STUBDOM
 CONFIG_PASSTHROUGH=1
-- 
1.7.6.3


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:33:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02: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 1RBNrT-0006ZL-GR; Wed, 05 Oct 2011 02:33:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNqs-0006N6-OA
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:33:23 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317807199!19167907!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27162 invoked from network); 5 Oct 2011 09:33:19 -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;
	5 Oct 2011 09:33:19 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312156800"; 
   d="scan'208";a="8220323"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 09:33: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; Wed, 5 Oct 2011
	10:33:19 +0100
Subject: Re: [Xen-devel] [PATCH 00 of 23] libxl: rationalise libxl_device_*
	APIs
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 5 Oct 2011 10:33:18 +0100
In-Reply-To: <CAPLaKK5w_ott56OYzwHg7b2SXbkoDyVsLCe+gauASUCaHeiv2w@mail.gmail.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<CAPLaKK7qFpZcrjWdNESwotc70KVVvNpC1SOoSqc9esFKJoM3=Q@mail.gmail.com>
	<1317715976.21903.73.camel@zakaz.uk.xensource.com>
	<1317717163.21903.80.camel@zakaz.uk.xensource.com>
	<CAPLaKK5w_ott56OYzwHg7b2SXbkoDyVsLCe+gauASUCaHeiv2w@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317807198.21903.184.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Jim Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Scott <Dave.Scott@eu.citrix.com>, Mike McClurg <mike.mcclurg@citrix.com>,
	Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>, Dave
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-05 at 10:04 +0100, Roger Pau MonnÃ© wrote:
> > BTW the mbox extension (http://mercurial.selenic.com/wiki/MboxExtension)
> > can make this a bit easier for larger series, since you can save all the
> > messages to an mbox and import that in one go.
> 
> Thanks for the suggestion, the mbox extension helps a lot to import
> large series. I'm having trouble applying your patches to tip, your
> libxl_utils.c seems to be different from the one present in the
> xen-unstable repository, should I apply some other patches before
> yours?

Looks like I had two precursor patches which I thought I'd posted but
apparently I had not. I'll dig them out...

Ian.


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:35:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:35:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNsq-00073u-PC; Wed, 05 Oct 2011 02:35:24 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNr3-0006PQ-Sp
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:33:34 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1317807210!15975095!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10368 invoked from network); 5 Oct 2011 09:33:30 -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;
	5 Oct 2011 09:33:30 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312156800"; 
   d="scan'208";a="8220332"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 09:33:29 +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, 5 Oct 2011
	10:33:29 +0100
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 5 Oct 2011 10:33:28 +0100
In-Reply-To: <CAPLaKK4Pf34THUrGK-msxkgox6cO8EaSpwhvZS+Xw13tYEwzDw@mail.gmail.com>
References: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
	<1317749511.24742.2.camel@dagon.hellion.org.uk>
	<CAPLaKK7rMSy+xn4twbuEUiLsxgv-JRRBYAwFaDuwRgBvisjk8g@mail.gmail.com>
	<1317801530.21903.163.camel@zakaz.uk.xensource.com>
	<CAPLaKK4Pf34THUrGK-msxkgox6cO8EaSpwhvZS+Xw13tYEwzDw@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317807208.21903.185.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 Wed, 2011-10-05 at 09:00 +0100, Roger Pau MonnÃ© wrote:
> Sorry, I didn't realize that, it was my first time sending patches
> using git send-email, should I resend the patch?

Either that or follow up to the original with the correct details for
the author.

BTW, by adding your Signed-off-by you are certifying the contribution
per the Developer's Certificate of Origin
(http://lwn.net/Articles/437739/) which certifies that the contribution
can be submitted by you under the relevant open source license.

This particular patch is probably too trivial to be an issue but in
general you would strictly speaking need a signed-off-by from the
original author, unless you happen to work for the same institution and
have right to contribute the works of others within that organisation.

Ian.


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:36:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:36:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNte-0007Qr-7f; Wed, 05 Oct 2011 02:36:14 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNrL-0006Vh-EQ
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:33:51 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1317807227!16019244!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12564 invoked from network); 5 Oct 2011 09:33:48 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:33:48 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="165759001"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:33:46 -0400
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;
	Wed, 5 Oct 2011 05:33:46 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RBNrF-0006aK-Ta; Wed, 05 Oct 2011
	10:33:45 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 136274808a4d8152302fa3ecbdce9c32390178b3
Message-ID: <136274808a4d8152302f.1317742234@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 4 Oct 2011 16:30:34 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 7 of 7] [OCAML] Small improvement to the ocaml
	xenctrl library
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 a new field 'max_nr_cpus' to the physinfo type in the ocaml xc bindings

Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>

diff -r 05f63323bbb5 -r 136274808a4d tools/ocaml/libs/xc/xc.ml
--- a/tools/ocaml/libs/xc/xc.ml
+++ b/tools/ocaml/libs/xc/xc.ml
@@ -70,6 +70,7 @@
 	scrub_pages      : nativeint;
 	(* XXX hw_cap *)
 	capabilities     : physinfo_cap_flag list;
+	max_nr_cpus      : int;
 }
 
 type version =
diff -r 05f63323bbb5 -r 136274808a4d tools/ocaml/libs/xc/xc.mli
--- a/tools/ocaml/libs/xc/xc.mli
+++ b/tools/ocaml/libs/xc/xc.mli
@@ -52,6 +52,7 @@
   free_pages       : nativeint;
   scrub_pages      : nativeint;
   capabilities     : physinfo_cap_flag list;
+  max_nr_cpus      : int; (** compile-time max possible number of nr_cpus *)
 }
 type version = { major : int; minor : int; extra : string; }
 type compile_info = {
diff -r 05f63323bbb5 -r 136274808a4d tools/ocaml/libs/xc/xc_stubs.c
--- a/tools/ocaml/libs/xc/xc_stubs.c
+++ b/tools/ocaml/libs/xc/xc_stubs.c
@@ -534,6 +534,7 @@
 
 	if (retval)
 		failwith_xc(_H(xch));
+
 	ring[size] = '\0';
 	CAMLreturn(caml_copy_string(ring));
 }
@@ -573,7 +574,7 @@
 		}
 	}
 
-	physinfo = caml_alloc_tuple(9);
+	physinfo = caml_alloc_tuple(10);
 	Store_field(physinfo, 0, Val_int(c_physinfo.threads_per_core));
 	Store_field(physinfo, 1, Val_int(c_physinfo.cores_per_socket));
 	Store_field(physinfo, 2, Val_int(c_physinfo.nr_cpus));
@@ -583,6 +584,7 @@
 	Store_field(physinfo, 6, caml_copy_nativeint(c_physinfo.free_pages));
 	Store_field(physinfo, 7, caml_copy_nativeint(c_physinfo.scrub_pages));
 	Store_field(physinfo, 8, cap_list);
+	Store_field(physinfo, 9, Val_int(c_physinfo.max_cpu_id + 1));
 
 	CAMLreturn(physinfo);
 }

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:36:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:36:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNuN-0007mu-F8; Wed, 05 Oct 2011 02:36:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNrM-0006W7-74
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:33:53 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1317807227!16019244!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12617 invoked from network); 5 Oct 2011 09:33:48 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:33:48 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="165759002"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:33:46 -0400
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;
	Wed, 5 Oct 2011 05:33:46 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RBNrF-0006aK-S4; Wed, 05 Oct 2011
	10:33:45 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 3cb878660928d845dc8e89158a8a3a6b277ba2d0
Message-ID: <3cb878660928d845dc8e.1317742230@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 4 Oct 2011 16:30:30 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 3 of 7] [OCAML] Remove the uuid library
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 library was only minimally used, and was really rather redundant.

Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

diff -r d94a733c3a92 -r 3cb878660928 tools/ocaml/libs/Makefile
--- a/tools/ocaml/libs/Makefile
+++ b/tools/ocaml/libs/Makefile
@@ -2,7 +2,7 @@
 include $(XEN_ROOT)/tools/Rules.mk
 
 SUBDIRS= \
-	uuid mmap \
+	mmap \
 	log xc eventchn \
 	xb xs xl
 
diff -r d94a733c3a92 -r 3cb878660928 tools/ocaml/libs/uuid/META.in
--- a/tools/ocaml/libs/uuid/META.in
+++ /dev/null
@@ -1,4 +0,0 @@
-version = "@VERSION@"
-description = "Uuid - universal identifer"
-archive(byte) = "uuid.cma"
-archive(native) = "uuid.cmxa"
diff -r d94a733c3a92 -r 3cb878660928 tools/ocaml/libs/uuid/Makefile
--- a/tools/ocaml/libs/uuid/Makefile
+++ /dev/null
@@ -1,29 +0,0 @@
-TOPLEVEL=$(CURDIR)/../..
-XEN_ROOT=$(TOPLEVEL)/../..
-include $(TOPLEVEL)/common.make
-
-OBJS = uuid
-INTF = $(foreach obj, $(OBJS),$(obj).cmi)
-LIBS = uuid.cma uuid.cmxa
-
-all: $(INTF) $(LIBS) $(PROGRAMS)
-
-bins: $(PROGRAMS)
-
-libs: $(LIBS)
-
-uuid_OBJS = $(OBJS)
-OCAML_NOC_LIBRARY = uuid
-
-.PHONY: install
-install: $(LIBS) META
-	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) uuid
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore uuid META $(INTF) $(LIBS) *.a *.cmx
-
-.PHONY: uninstall
-uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) uuid
-
-include $(TOPLEVEL)/Makefile.rules
-
diff -r d94a733c3a92 -r 3cb878660928 tools/ocaml/libs/uuid/uuid.ml
--- a/tools/ocaml/libs/uuid/uuid.ml
+++ /dev/null
@@ -1,100 +0,0 @@
-(*
- * Copyright (C) 2006-2010 Citrix Systems Inc.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-(* Internally, a UUID is simply a string. *)
-type 'a t = string
-
-type cookie = string
-
-let of_string s = s
-let to_string s = s
-
-let null = ""
-
-(* deprecated: we don't need to duplicate the uuid prefix/suffix *)
-let uuid_of_string = of_string
-let string_of_uuid = to_string
-
-let string_of_cookie s = s
-
-let cookie_of_string s = s
-
-let dev_random = "/dev/random"
-let dev_urandom = "/dev/urandom"
-
-let rnd_array n =
-	let fstbyte i = 0xff land i in
-	let sndbyte i = fstbyte (i lsr 8) in
-	let thdbyte i = sndbyte (i lsr 8) in
-	let rec rnd_list n acc = match n with
-		| 0 -> acc
-		| 1 ->
-			let b = fstbyte (Random.bits ()) in
-			b :: acc
-		| 2 ->
-			let r = Random.bits () in
-			let b1 = fstbyte r in
-			let b2 = sndbyte r in
-			b1 :: b2 :: acc
-		| n -> 
-			let r = Random.bits () in
-			let b1 = fstbyte r in
-			let b2 = sndbyte r in
-			let b3 = thdbyte r in
-			rnd_list (n - 3) (b1 :: b2 :: b3 :: acc)
-	in
-	Array.of_list (rnd_list n [])
-
-let read_array dev n = 
-  let ic = open_in_bin dev in
-  try
-    let result = Array.init n (fun _ -> input_byte ic) in
-    close_in ic;
-    result
-  with e ->
-    close_in ic;
-    raise e
-
-let uuid_of_int_array uuid =
-  Printf.sprintf "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
-    uuid.(0) uuid.(1) uuid.(2) uuid.(3) uuid.(4) uuid.(5)
-    uuid.(6) uuid.(7) uuid.(8) uuid.(9) uuid.(10) uuid.(11)
-    uuid.(12) uuid.(13) uuid.(14) uuid.(15)
-
-let make_uuid_prng () = uuid_of_int_array (rnd_array 16)
-let make_uuid_urnd () = uuid_of_int_array (read_array dev_urandom 16)
-let make_uuid_rnd () = uuid_of_int_array (read_array dev_random 16)
-let make_uuid = make_uuid_urnd
-
-let make_cookie() =
-  let bytes = Array.to_list (read_array dev_urandom 64) in
-  String.concat "" (List.map (Printf.sprintf "%1x") bytes)
-
-let int_array_of_uuid s =
-  try
-    let l = ref [] in
-    Scanf.sscanf s "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
-      (fun a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 ->
-      l := [ a0; a1; a2; a3; a4; a5; a6; a7; a8; a9;
-             a10; a11; a12; a13; a14; a15; ]);
-    Array.of_list !l
-  with _ -> invalid_arg "Uuid.int_array_of_uuid"
-
-let is_uuid str =
-	try
-		Scanf.sscanf str
-			"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
-			(fun _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -> true)
-	with _ -> false
diff -r d94a733c3a92 -r 3cb878660928 tools/ocaml/libs/uuid/uuid.mli
--- a/tools/ocaml/libs/uuid/uuid.mli
+++ /dev/null
@@ -1,67 +0,0 @@
-(*
- * Copyright (C) 2006-2010 Citrix Systems Inc.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-(** Type-safe UUIDs.
-    Probably need to refactor this; UUIDs are used in two places:
-    + to uniquely name things across the cluster
-    + as secure session IDs
-
-    There is the additional constraint that current Xen tools use 
-    a particular format of UUID (the 16 byte variety generated by fresh ())
-
-	Also, cookies aren't UUIDs and should be put somewhere else.
-*)
-
-(** A 128-bit UUID.  Using phantom types ('a) to achieve the requires type-safety. *)
-type 'a t
-
-(** Create a fresh UUID *)
-val make_uuid : unit -> 'a t
-val make_uuid_prng : unit -> 'a t
-val make_uuid_urnd : unit -> 'a t
-val make_uuid_rnd : unit -> 'a t
-
-(** Create a UUID from a string. *)
-val of_string : string -> 'a t
-
-(** Marshal a UUID to a string. *)
-val to_string : 'a t -> string
-
-(** A null UUID, as if such a thing actually existed.  It turns out to be
- * useful though. *)
-val null : 'a t
-
-(** Deprecated alias for {! Uuid.of_string} *)
-val uuid_of_string : string -> 'a t
-
-(** Deprecated alias for {! Uuid.to_string} *)
-val string_of_uuid : 'a t -> string
-
-(** Convert an array to a UUID. *)
-val uuid_of_int_array : int array -> 'a t
-
-(** Convert a UUID to an array. *)
-val int_array_of_uuid : 'a t -> int array
-
-(** Check whether a string is a UUID. *)
-val is_uuid : string -> bool
-
-(** A 512-bit cookie. *)
-type cookie
-
-val make_cookie : unit -> cookie
-
-val cookie_of_string : string -> cookie
-
-val string_of_cookie : cookie -> string
diff -r d94a733c3a92 -r 3cb878660928 tools/ocaml/libs/xb/Makefile
--- a/tools/ocaml/libs/xb/Makefile
+++ b/tools/ocaml/libs/xb/Makefile
@@ -31,7 +31,7 @@
 
 %.mli: %.ml
 	$(E) " MLI       $@"
-	$(Q)$(OCAMLC) -i $< $o
+	$(Q)$(OCAMLC) $(OCAMLCFLAGS) -i $< $o
 
 .PHONY: install
 install: $(LIBS) META
diff -r d94a733c3a92 -r 3cb878660928 tools/ocaml/libs/xc/META.in
--- a/tools/ocaml/libs/xc/META.in
+++ b/tools/ocaml/libs/xc/META.in
@@ -1,5 +1,5 @@
 version = "@VERSION@"
 description = "Xen Control Interface"
-requires = "unix,mmap,uuid"
+requires = "unix,mmap"
 archive(byte) = "xc.cma"
 archive(native) = "xc.cmxa"
diff -r d94a733c3a92 -r 3cb878660928 tools/ocaml/libs/xc/Makefile
--- a/tools/ocaml/libs/xc/Makefile
+++ b/tools/ocaml/libs/xc/Makefile
@@ -3,7 +3,7 @@
 include $(TOPLEVEL)/common.make
 
 CFLAGS += -I../mmap $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest)
-OCAMLINCLUDE += -I ../mmap -I ../uuid
+OCAMLINCLUDE += -I ../mmap
 
 OBJS = xc
 INTF = xc.cmi
diff -r d94a733c3a92 -r 3cb878660928 tools/ocaml/libs/xc/xc.ml
--- a/tools/ocaml/libs/xc/xc.ml
+++ b/tools/ocaml/libs/xc/xc.ml
@@ -118,14 +118,23 @@
 external _domain_create: handle -> int32 -> domain_create_flag list -> int array -> domid
        = "stub_xc_domain_create"
 
+let int_array_of_uuid_string s =
+	try
+		Scanf.sscanf s
+			"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
+			(fun a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 ->
+				[| a0; a1; a2; a3; a4; a5; a6; a7;
+				   a8; a9; a10; a11; a12; a13; a14; a15 |])
+	with _ -> invalid_arg ("Xc.int_array_of_uuid_string: " ^ s)
+
 let domain_create handle n flags uuid =
-	_domain_create handle n flags (Uuid.int_array_of_uuid uuid)
+	_domain_create handle n flags (int_array_of_uuid_string uuid)
 
 external _domain_sethandle: handle -> domid -> int array -> unit
                           = "stub_xc_domain_sethandle"
 
 let domain_sethandle handle n uuid =
-	_domain_sethandle handle n (Uuid.int_array_of_uuid uuid)
+	_domain_sethandle handle n (int_array_of_uuid_string uuid)
 
 external domain_max_vcpus: handle -> domid -> int -> unit
        = "stub_xc_domain_max_vcpus"
diff -r d94a733c3a92 -r 3cb878660928 tools/ocaml/libs/xc/xc.mli
--- a/tools/ocaml/libs/xc/xc.mli
+++ b/tools/ocaml/libs/xc/xc.mli
@@ -74,12 +74,8 @@
 external is_fake : unit -> bool = "stub_xc_interface_is_fake"
 external interface_close : handle -> unit = "stub_xc_interface_close"
 val with_intf : (handle -> 'a) -> 'a
-external _domain_create : handle -> int32 -> domain_create_flag list -> int array -> domid
-  = "stub_xc_domain_create"
-val domain_create : handle -> int32 -> domain_create_flag list -> 'a Uuid.t -> domid
-external _domain_sethandle : handle -> domid -> int array -> unit
-  = "stub_xc_domain_sethandle"
-val domain_sethandle : handle -> domid -> 'a Uuid.t -> unit
+val domain_create : handle -> int32 -> domain_create_flag list -> string -> domid
+val domain_sethandle : handle -> domid -> string -> unit
 external domain_max_vcpus : handle -> domid -> int -> unit
   = "stub_xc_domain_max_vcpus"
 external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause"
diff -r d94a733c3a92 -r 3cb878660928 tools/ocaml/xenstored/Makefile
--- a/tools/ocaml/xenstored/Makefile
+++ b/tools/ocaml/xenstored/Makefile
@@ -5,7 +5,6 @@
 OCAMLINCLUDE += \
 	-I $(OCAML_TOPLEVEL)/libs/log \
 	-I $(OCAML_TOPLEVEL)/libs/xb \
-	-I $(OCAML_TOPLEVEL)/libs/uuid \
 	-I $(OCAML_TOPLEVEL)/libs/mmap \
 	-I $(OCAML_TOPLEVEL)/libs/xc \
 	-I $(OCAML_TOPLEVEL)/libs/eventchn
@@ -34,7 +33,6 @@
 INTF = symbol.cmi trie.cmi
 XENSTOREDLIBS = \
 	unix.cmxa \
-	$(OCAML_TOPLEVEL)/libs/uuid/uuid.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap $(OCAML_TOPLEVEL)/libs/mmap/mmap.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/log $(OCAML_TOPLEVEL)/libs/log/log.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/eventchn/eventchn.cmxa \

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:38:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:38:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNvO-0008Am-RB; Wed, 05 Oct 2011 02:38:02 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNrO-0006We-0p
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:33:55 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1317807227!16019244!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12656 invoked from network); 5 Oct 2011 09:33:49 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:33:49 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="165759003"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:33:46 -0400
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;
	Wed, 5 Oct 2011 05:33:46 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RBNrF-0006aK-SJ; Wed, 05 Oct 2011
	10:33:45 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: b6d1deac6ca2828ab8550c4e7c41c08ffc63402e
Message-ID: <b6d1deac6ca2828ab855.1317742231@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 4 Oct 2011 16:30:31 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 4 of 7] [OCAML] Remove log library from
	tools/ocaml/libs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 only user was oxenstored, which has had the relevant bits
merged in.

Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/libs/Makefile
--- a/tools/ocaml/libs/Makefile
+++ b/tools/ocaml/libs/Makefile
@@ -3,7 +3,7 @@
 
 SUBDIRS= \
 	mmap \
-	log xc eventchn \
+	xc eventchn \
 	xb xs xl
 
 .PHONY: all
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/libs/log/META.in
--- a/tools/ocaml/libs/log/META.in
+++ /dev/null
@@ -1,5 +0,0 @@
-version = "@VERSION@"
-description = "Log - logging library"
-requires = "unix"
-archive(byte) = "log.cma"
-archive(native) = "log.cmxa"
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/libs/log/Makefile
--- a/tools/ocaml/libs/log/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-TOPLEVEL=$(CURDIR)/../..
-XEN_ROOT=$(TOPLEVEL)/../..
-include $(TOPLEVEL)/common.make
-
-OBJS = syslog log logs
-INTF = log.cmi logs.cmi syslog.cmi
-LIBS = log.cma log.cmxa
-
-all: $(INTF) $(LIBS) $(PROGRAMS)
-
-bins: $(PROGRAMS)
-
-libs: $(LIBS)
-
-log.cmxa: libsyslog_stubs.a $(foreach obj,$(OBJS),$(obj).cmx)
-	$(call mk-caml-lib-native, $@, -cclib -lsyslog_stubs, $(foreach obj,$(OBJS),$(obj).cmx))
-
-log.cma: $(foreach obj,$(OBJS),$(obj).cmo)
-	$(call mk-caml-lib-bytecode, $@, -dllib dllsyslog_stubs.so -cclib -lsyslog_stubs, $(foreach obj,$(OBJS),$(obj).cmo))
-
-syslog_stubs.a: syslog_stubs.o
-	$(call mk-caml-stubs, $@, $+)
-
-libsyslog_stubs.a: syslog_stubs.o
-	$(call mk-caml-lib-stubs, $@, $+)
-
-logs.mli : logs.ml
-	$(OCAMLC) -i $(OCAMLCFLAGS) $< > $@
-
-syslog.mli : syslog.ml
-	$(OCAMLC) -i $< > $@
-
-.PHONY: install
-install: $(LIBS) META
-	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) log
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore log META $(INTF) $(LIBS) *.a *.so *.cmx
-
-.PHONY: uninstall
-uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) log
-
-include $(TOPLEVEL)/Makefile.rules
-
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/libs/log/log.ml
--- a/tools/ocaml/libs/log/log.ml
+++ /dev/null
@@ -1,258 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-open Printf
-
-exception Unknown_level of string
-
-type stream_type = Stderr | Stdout | File of string
-
-type stream_log = {
-  ty : stream_type;
-  channel : out_channel option ref;
-}
-
-type level = Debug | Info | Warn | Error
-
-type output =
-	| Stream of stream_log
-	| String of string list ref
-	| Syslog of string
-	| Nil
-
-let int_of_level l =
-	match l with Debug -> 0 | Info -> 1 | Warn -> 2 | Error -> 3
-
-let string_of_level l =
-	match l with Debug -> "debug" | Info -> "info"
-	           | Warn -> "warn" | Error -> "error"
-
-let level_of_string s =
-	match s with
-	| "debug" -> Debug
-	| "info"  -> Info
-	| "warn"  -> Warn
-	| "error" -> Error
-	| _       -> raise (Unknown_level s)
-
-let mkdir_safe dir perm =
-        try Unix.mkdir dir perm with _ -> ()
-
-let mkdir_rec dir perm =
-	let rec p_mkdir dir =
-		let p_name = Filename.dirname dir in
-		if p_name = "/" || p_name = "." then
-			()
-		else (
-			p_mkdir p_name;
-			mkdir_safe dir perm
-		) in
-	p_mkdir dir
-
-type t = { output: output; mutable level: level; }
-
-let make output level = { output = output; level = level; }
-
-let make_stream ty channel = 
-        Stream {ty=ty; channel=ref channel; }
-
-(** open a syslog logger *)
-let opensyslog k level =
-	make (Syslog k) level
-
-(** open a stderr logger *)
-let openerr level =
-	if (Unix.stat "/dev/stderr").Unix.st_kind <> Unix.S_CHR then
-		failwith "/dev/stderr is not a valid character device";
-	make (make_stream Stderr (Some (open_out "/dev/stderr"))) level
-	
-let openout level =
-	if (Unix.stat "/dev/stdout").Unix.st_kind <> Unix.S_CHR then
-		failwith "/dev/stdout is not a valid character device";
-        make (make_stream Stdout (Some (open_out "/dev/stdout"))) level
-
-
-(** open a stream logger - returning the channel. *)
-(* This needs to be separated from 'openfile' so we can reopen later *)
-let doopenfile filename =
-        if Filename.is_relative filename then
-	        None
-	else (
-                try
-		  mkdir_rec (Filename.dirname filename) 0o700;
-	          Some (open_out_gen [ Open_append; Open_creat ] 0o600 filename)
-                with _ -> None
-	)
-
-(** open a stream logger - returning the output type *)
-let openfile filename level =
-        make (make_stream (File filename) (doopenfile filename)) level
-
-(** open a nil logger *)
-let opennil () =
-	make Nil Error
-
-(** open a string logger *)
-let openstring level =
-        make (String (ref [""])) level
-
-(** try to reopen a logger *)
-let reopen t =
-	match t.output with
-	| Nil              -> t
-	| Syslog k         -> Syslog.close (); opensyslog k t.level
-	| Stream s         -> (
-	      match (s.ty,!(s.channel)) with 
-		| (File filename, Some c) -> close_out c; s.channel := (try doopenfile filename with _ -> None); t 
-		| _ -> t)
-	| String _         -> t
-
-(** close a logger *)
-let close t =
-	match t.output with
-	| Nil           -> ()
-	| Syslog k      -> Syslog.close ();
-	| Stream s      -> (
-	      match !(s.channel) with 
-		| Some c -> close_out c; s.channel := None
-		| None -> ())
-	| String _      -> ()
-
-(** create a string representating the parameters of the logger *)
-let string_of_logger t =
-	match t.output with
-	| Nil           -> "nil"
-	| Syslog k      -> sprintf "syslog:%s" k
-	| String _      -> "string"
-	| Stream s      -> 
-	    begin
-	      match s.ty with 
-		| File f -> sprintf "file:%s" f
-		| Stderr -> "stderr"
-		| Stdout -> "stdout"
-	    end
-
-(** parse a string to a logger *)
-let logger_of_string s : t =
-	match s with
-	| "nil"    -> opennil ()
-	| "stderr" -> openerr Debug
-	| "stdout" -> openout Debug
-	| "string" -> openstring Debug
-	| _        ->
-		let split_in_2 s =
-			try
-				let i = String.index s ':' in
-				String.sub s 0 (i),
-				String.sub s (i + 1) (String.length s - i - 1)
-			with _ ->
-				failwith "logger format error: expecting string:string"
-			in
-		let k, s = split_in_2 s in
-		match k with
-		| "syslog" -> opensyslog s Debug
-		| "file"   -> openfile s Debug
-		| _        -> failwith "unknown logger type"
-
-let validate s =
-	match s with
-	| "nil"    -> ()
-	| "stderr" -> ()
-	| "stdout" -> ()
-	| "string" -> ()
-	| _        ->
-		let split_in_2 s =
-			try
-				let i = String.index s ':' in
-				String.sub s 0 (i),
-				String.sub s (i + 1) (String.length s - i - 1)
-			with _ ->
-				failwith "logger format error: expecting string:string"
-			in
-		let k, s = split_in_2 s in
-		match k with
-		| "syslog" -> ()
-		| "file"   -> (
-			try
-				let st = Unix.stat s in
-				if st.Unix.st_kind <> Unix.S_REG then
-					failwith "logger file is a directory";
-				()
-			with Unix.Unix_error (Unix.ENOENT, _, _) -> ()
-			)
-		| _        -> failwith "unknown logger"
-
-(** change a logger level to level *)
-let set t level = t.level <- level
-
-let gettimestring () =
-	let time = Unix.gettimeofday () in
-	let tm = Unix.localtime time in
-        let msec = time -. (floor time) in
-	sprintf "%d%.2d%.2d %.2d:%.2d:%.2d.%.3d|" (1900 + tm.Unix.tm_year)
-	        (tm.Unix.tm_mon + 1) tm.Unix.tm_mday
-	        tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
-	        (int_of_float (1000.0 *. msec))
-
-(*let extra_hook = ref (fun x -> x)*)
-
-let output t ?(key="") ?(extra="") priority (message: string) =
-  let construct_string withtime =
-		(*let key = if key = "" then [] else [ key ] in
-		let extra = if extra = "" then [] else [ extra ] in
-		let items = 
-      (if withtime then [ gettimestring () ] else [])
-		  @ [ sprintf "%5s" (string_of_level priority) ] @ extra @ key @ [ message ] in
-(*		let items = !extra_hook items in*)
-		String.concat " " items*)
-    Printf.sprintf "[%s%s|%s] %s" 
-      (if withtime then gettimestring () else "") (string_of_level priority) extra message
-	in
-	(* Keep track of how much we write out to streams, so that we can *)
-	(* log-rotate at appropriate times *)
-	let write_to_stream stream =
-	  let string = (construct_string true) in
-	  try
-	    fprintf stream "%s\n%!" string
-	  with _ -> () (* Trap exception when we fail to write log *)
-        in
-
-	if String.length message > 0 then
-	match t.output with
-	| Syslog k      ->
-		let sys_prio = match priority with
-		| Debug -> Syslog.Debug
-		| Info  -> Syslog.Info
-		| Warn  -> Syslog.Warning
-		| Error -> Syslog.Err in
-		Syslog.log Syslog.Daemon sys_prio ((construct_string false) ^ "\n")
-	| Stream s -> (
-	      match !(s.channel) with
-		| Some c -> write_to_stream c
-		| None -> ())
-	| Nil           -> ()
-	| String s      -> (s := (construct_string true)::!s)
-
-let log t level (fmt: ('a, unit, string, unit) format4): 'a =
-	let b = (int_of_level t.level) <= (int_of_level level) in
-	(* ksprintf is the preferred name for kprintf, but the former
-	 * is not available in OCaml 3.08.3 *)
-	Printf.kprintf (if b then output t level else (fun _ -> ())) fmt
-	    
-let debug t (fmt: ('a , unit, string, unit) format4) = log t Debug fmt
-let info t (fmt: ('a , unit, string, unit) format4) = log t Info fmt
-let warn t (fmt: ('a , unit, string, unit) format4) = log t Warn fmt
-let error t (fmt: ('a , unit, string, unit) format4) = log t Error fmt
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/libs/log/log.mli
--- a/tools/ocaml/libs/log/log.mli
+++ /dev/null
@@ -1,55 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-exception Unknown_level of string
-type level = Debug | Info | Warn | Error
-
-type stream_type = Stderr | Stdout | File of string
-type stream_log = {
-  ty : stream_type;
-  channel : out_channel option ref;
-}
-type output =
-    Stream of stream_log
-  | String of string list ref
-  | Syslog of string
-  | Nil
-val int_of_level : level -> int
-val string_of_level : level -> string
-val level_of_string : string -> level
-val mkdir_safe : string -> Unix.file_perm -> unit
-val mkdir_rec : string -> Unix.file_perm -> unit
-type t = { output : output; mutable level : level; }
-val make : output -> level -> t
-val opensyslog : string -> level -> t
-val openerr : level -> t
-val openout : level -> t
-val openfile : string -> level -> t
-val opennil : unit -> t
-val openstring : level -> t
-val reopen : t -> t
-val close : t -> unit
-val string_of_logger : t -> string
-val logger_of_string : string -> t
-val validate : string -> unit
-val set : t -> level -> unit
-val gettimestring : unit -> string
-val output : t -> ?key:string -> ?extra:string -> level -> string -> unit
-val log : t -> level -> ('a, unit, string, unit) format4 -> 'a
-val debug : t -> ('a, unit, string, unit) format4 -> 'a
-val info : t -> ('a, unit, string, unit) format4 -> 'a
-val warn : t -> ('a, unit, string, unit) format4 -> 'a
-val error : t -> ('a, unit, string, unit) format4 -> 'a
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/libs/log/logs.ml
--- a/tools/ocaml/libs/log/logs.ml
+++ /dev/null
@@ -1,197 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-type keylogger =
-{
-	mutable debug: string list;
-	mutable info: string list;
-	mutable warn: string list;
-	mutable error: string list;
-	no_default: bool;
-}
-
-(* map all logger strings into a logger *)
-let __all_loggers = Hashtbl.create 10
-
-(* default logger that everything that doesn't have a key in __lop_mapping get send *)
-let __default_logger = { debug = []; info = []; warn = []; error = []; no_default = false }
-
-(*
- * This describe the mapping between a name to a keylogger.
- * a keylogger contains a list of logger string per level of debugging.
- * Example:   "xenops", debug -> [ "stderr"; "/var/log/xensource.log" ]
- *            "xapi", error ->   []
- *            "xapi", debug ->   [ "/var/log/xensource.log" ]
- *            "xenops", info ->  [ "syslog" ]
- *)
-let __log_mapping = Hashtbl.create 32
-
-let get_or_open logstring =
-	if Hashtbl.mem __all_loggers logstring then
-		Hashtbl.find __all_loggers logstring
-	else
-		let t = Log.logger_of_string logstring in
-		Hashtbl.add __all_loggers logstring t;
-		t
-
-(** create a mapping entry for the key "name".
- * all log level of key "name" default to "logger" logger.
- * a sensible default is put "nil" as a logger and reopen a specific level to
- * the logger you want to.
- *)
-let add key logger =
-	let kl = {
-		debug = logger;
-		info = logger;
-		warn = logger;
-		error = logger;
-		no_default = false;
-	} in
-	Hashtbl.add __log_mapping key kl
-
-let get_by_level keylog level =
-	match level with
-	| Log.Debug -> keylog.debug
-	| Log.Info  -> keylog.info
-	| Log.Warn  -> keylog.warn
-	| Log.Error -> keylog.error
-
-let set_by_level keylog level logger =
-	match level with
-	| Log.Debug -> keylog.debug <- logger
-	| Log.Info  -> keylog.info <- logger
-	| Log.Warn  -> keylog.warn <- logger
-	| Log.Error -> keylog.error <- logger
-
-(** set a specific key|level to the logger "logger" *)
-let set key level logger =
-	if not (Hashtbl.mem __log_mapping key) then
-		add key [];
-
-	let keylog = Hashtbl.find __log_mapping key in
-	set_by_level keylog level logger
-
-(** set default logger *)
-let set_default level logger =
-	set_by_level __default_logger level logger
-
-(** append a logger to the list *)
-let append key level logger =
-	if not (Hashtbl.mem __log_mapping key) then
-		add key [];
-	let keylog = Hashtbl.find __log_mapping key in
-	let loggers = get_by_level keylog level in
-	set_by_level keylog level (loggers @ [ logger ])
-
-(** append a logger to the default list *)
-let append_default level logger =
-	let loggers = get_by_level __default_logger level in
-	set_by_level __default_logger level (loggers @ [ logger ])
-
-(** reopen all logger open *)
-let reopen () =
-	Hashtbl.iter (fun k v ->
-		Hashtbl.replace __all_loggers k (Log.reopen v)) __all_loggers
-
-(** reclaim close all logger open that are not use by any other keys *)
-let reclaim () =
-	let list_sort_uniq l =
-		let oldprev = ref "" and prev = ref "" in
-		List.fold_left (fun a k ->
-			oldprev := !prev;
-			prev := k;
-			if k = !oldprev then a else k :: a) []
-			(List.sort compare l)
-		in
-	let flatten_keylogger v =
-		list_sort_uniq (v.debug @ v.info @ v.warn @ v.error) in
-	let oldkeys = Hashtbl.fold (fun k v a -> k :: a) __all_loggers [] in
-	let usedkeys = Hashtbl.fold (fun k v a ->
-		(flatten_keylogger v) @ a)
-		__log_mapping (flatten_keylogger __default_logger) in
-	let usedkeys = list_sort_uniq usedkeys in
-
-	List.iter (fun k ->
-		if not (List.mem k usedkeys) then (
-			begin try
-				Log.close (Hashtbl.find __all_loggers k)
-			with
-				Not_found -> ()
-			end;
-			Hashtbl.remove __all_loggers k
-		)) oldkeys
-
-(** clear a specific key|level *)
-let clear key level =
-	try
-		let keylog = Hashtbl.find __log_mapping key in
-		set_by_level keylog level [];
-		reclaim ()
-	with Not_found ->
-		()
-
-(** clear a specific default level *)
-let clear_default level =
-	set_default level [];
-	reclaim ()
-
-(** reset all the loggers to the specified logger *)
-let reset_all logger =
-	Hashtbl.clear __log_mapping;
-	set_default Log.Debug logger;
-	set_default Log.Warn logger;
-	set_default Log.Error logger;
-	set_default Log.Info logger;
-	reclaim ()
-
-(** log a fmt message to the key|level logger specified in the log mapping.
- * if the logger doesn't exist, assume nil logger.
- *)
-let log key level ?(extra="") (fmt: ('a, unit, string, unit) format4): 'a =
-	let keylog =
-		if Hashtbl.mem __log_mapping key then
-			let keylog = Hashtbl.find __log_mapping key in
-			if keylog.no_default = false &&
-			   get_by_level keylog level = [] then
-				__default_logger
-			else
-				keylog
-		else
-			__default_logger in
-	let loggers = get_by_level keylog level in
-	match loggers with
-	| [] -> Printf.kprintf ignore fmt
-	| _  ->
-		let l = List.fold_left (fun acc logger ->	
-			try get_or_open logger :: acc
-			with _ -> acc
-		) [] loggers in
-		let l = List.rev l in
-
-		(* ksprintf is the preferred name for kprintf, but the former
-		 * is not available in OCaml 3.08.3 *)
-		Printf.kprintf (fun s ->
-			List.iter (fun t -> Log.output t ~key ~extra level s) l) fmt
-
-(* define some convenience functions *)
-let debug t ?extra (fmt: ('a , unit, string, unit) format4) =
-	log t Log.Debug ?extra fmt
-let info t ?extra (fmt: ('a , unit, string, unit) format4) =
-	log t Log.Info ?extra fmt
-let warn t ?extra (fmt: ('a , unit, string, unit) format4) =
-	log t Log.Warn ?extra fmt
-let error t ?extra (fmt: ('a , unit, string, unit) format4) =
-	log t Log.Error ?extra fmt
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/libs/log/logs.mli
--- a/tools/ocaml/libs/log/logs.mli
+++ /dev/null
@@ -1,46 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-type keylogger = {
-  mutable debug : string list;
-  mutable info : string list;
-  mutable warn : string list;
-  mutable error : string list;
-  no_default : bool;
-}
-val __all_loggers : (string, Log.t) Hashtbl.t
-val __default_logger : keylogger
-val __log_mapping : (string, keylogger) Hashtbl.t
-val get_or_open : string -> Log.t
-val add : string -> string list -> unit
-val get_by_level : keylogger -> Log.level -> string list
-val set_by_level : keylogger -> Log.level -> string list -> unit
-val set : string -> Log.level -> string list -> unit
-val set_default : Log.level -> string list -> unit
-val append : string -> Log.level -> string -> unit
-val append_default : Log.level -> string -> unit
-val reopen : unit -> unit
-val reclaim : unit -> unit
-val clear : string -> Log.level -> unit
-val clear_default : Log.level -> unit
-val reset_all : string list -> unit
-val log :
-  string ->
-  Log.level -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
-val debug : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
-val info : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
-val warn : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
-val error : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/libs/log/syslog.ml
--- a/tools/ocaml/libs/log/syslog.ml
+++ /dev/null
@@ -1,26 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-type level = Emerg | Alert | Crit | Err | Warning | Notice | Info | Debug
-type options = Cons | Ndelay | Nowait | Odelay | Perror | Pid
-type facility = Auth | Authpriv | Cron | Daemon | Ftp | Kern
-              | Local0 | Local1 | Local2 | Local3
-	      | Local4 | Local5 | Local6 | Local7
-	      | Lpr | Mail | News | Syslog | User | Uucp
-
-(* external init : string -> options list -> facility -> unit = "stub_openlog" *)
-external log : facility -> level -> string -> unit = "stub_syslog"
-external close : unit -> unit = "stub_closelog"
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/libs/log/syslog.mli
--- a/tools/ocaml/libs/log/syslog.mli
+++ /dev/null
@@ -1,41 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-type level = Emerg | Alert | Crit | Err | Warning | Notice | Info | Debug
-type options = Cons | Ndelay | Nowait | Odelay | Perror | Pid
-type facility =
-    Auth
-  | Authpriv
-  | Cron
-  | Daemon
-  | Ftp
-  | Kern
-  | Local0
-  | Local1
-  | Local2
-  | Local3
-  | Local4
-  | Local5
-  | Local6
-  | Local7
-  | Lpr
-  | Mail
-  | News
-  | Syslog
-  | User
-  | Uucp
-external log : facility -> level -> string -> unit = "stub_syslog"
-external close : unit -> unit = "stub_closelog"
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/libs/log/syslog_stubs.c
--- a/tools/ocaml/libs/log/syslog_stubs.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- */
-
-#include <syslog.h>
-#include <caml/mlvalues.h>
-#include <caml/memory.h>
-#include <caml/alloc.h>
-#include <caml/custom.h>
-
-static int __syslog_level_table[] = {
-	LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING,
-	LOG_NOTICE, LOG_INFO, LOG_DEBUG
-};
-
-/*
-static int __syslog_options_table[] = {
-	LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR, LOG_PID
-};
-*/
-
-static int __syslog_facility_table[] = {
-	LOG_AUTH, LOG_AUTHPRIV, LOG_CRON, LOG_DAEMON, LOG_FTP, LOG_KERN,
-	LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3,
-	LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7,
-	LOG_LPR | LOG_MAIL | LOG_NEWS | LOG_SYSLOG | LOG_USER | LOG_UUCP
-};
-
-/* According to the openlog manpage the 'openlog' call may take a reference
-   to the 'ident' string and keep it long-term. This means we cannot just pass in
-   an ocaml string which is under the control of the GC. Since we aren't actually
-   calling this function we can just comment it out for the time-being. */
-/*
-value stub_openlog(value ident, value option, value facility)
-{
-	CAMLparam3(ident, option, facility);
-	int c_option;
-	int c_facility;
-
-	c_option = caml_convert_flag_list(option, __syslog_options_table);
-	c_facility = __syslog_facility_table[Int_val(facility)];
-	openlog(String_val(ident), c_option, c_facility);
-	CAMLreturn(Val_unit);
-}
-*/
-
-value stub_syslog(value facility, value level, value msg)
-{
-	CAMLparam3(facility, level, msg);
-	int c_facility;
-
-	c_facility = __syslog_facility_table[Int_val(facility)]
-	           | __syslog_level_table[Int_val(level)];
-	syslog(c_facility, "%s", String_val(msg));
-	CAMLreturn(Val_unit);
-}
-
-value stub_closelog(value unit)
-{
-	CAMLparam1(unit);
-	closelog();
-	CAMLreturn(Val_unit);
-}
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/Makefile
--- a/tools/ocaml/xenstored/Makefile
+++ b/tools/ocaml/xenstored/Makefile
@@ -3,7 +3,6 @@
 include $(OCAML_TOPLEVEL)/common.make
 
 OCAMLINCLUDE += \
-	-I $(OCAML_TOPLEVEL)/libs/log \
 	-I $(OCAML_TOPLEVEL)/libs/xb \
 	-I $(OCAML_TOPLEVEL)/libs/mmap \
 	-I $(OCAML_TOPLEVEL)/libs/xc \
@@ -34,7 +33,6 @@
 XENSTOREDLIBS = \
 	unix.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap $(OCAML_TOPLEVEL)/libs/mmap/mmap.cmxa \
-	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/log $(OCAML_TOPLEVEL)/libs/log/log.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/eventchn/eventchn.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc $(OCAML_TOPLEVEL)/libs/xc/xc.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb $(OCAML_TOPLEVEL)/libs/xb/xb.cmxa \
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/connection.ml
--- a/tools/ocaml/xenstored/connection.ml
+++ b/tools/ocaml/xenstored/connection.ml
@@ -232,3 +232,8 @@
 			Printf.fprintf chan "watch,%d,%s,%s\n" domid (Utils.hexify path) (Utils.hexify token)
 			) (list_watches con);
 	| None -> ()
+
+let debug con =
+	let domid = get_domstr con in
+	let watches = List.map (fun (path, token) -> Printf.sprintf "watch %s: %s %s\n" domid path token) (list_watches con) in
+	String.concat "" watches
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/connections.ml
--- a/tools/ocaml/xenstored/connections.ml
+++ b/tools/ocaml/xenstored/connections.ml
@@ -15,7 +15,7 @@
  * GNU Lesser General Public License for more details.
  *)
 
-let debug fmt = Logs.debug "general" fmt
+let debug fmt = Logging.debug "connections" fmt
 
 type t = {
 	mutable anonymous: Connection.t list;
@@ -165,3 +165,8 @@
 	);
 	(List.length cons.anonymous, !nb_ops_anon, !nb_watchs_anon,
 	 Hashtbl.length cons.domains, !nb_ops_dom, !nb_watchs_dom)
+
+let debug cons =
+	let anonymous = List.map Connection.debug cons.anonymous in
+	let domains = Hashtbl.fold (fun _ con accu -> Connection.debug con :: accu) cons.domains [] in
+	String.concat "" (domains @ anonymous)
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/disk.ml
--- a/tools/ocaml/xenstored/disk.ml
+++ b/tools/ocaml/xenstored/disk.ml
@@ -17,7 +17,7 @@
 let enable = ref false
 let xs_daemon_database = "/var/run/xenstored/db"
 
-let error = Logs.error "general"
+let error fmt = Logging.error "disk" fmt
 
 (* unescape utils *)
 exception Bad_escape
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/domain.ml
--- a/tools/ocaml/xenstored/domain.ml
+++ b/tools/ocaml/xenstored/domain.ml
@@ -16,7 +16,7 @@
 
 open Printf
 
-let debug fmt = Logs.debug "general" fmt
+let debug fmt = Logging.debug "domain" fmt
 
 type t =
 {
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/domains.ml
--- a/tools/ocaml/xenstored/domains.ml
+++ b/tools/ocaml/xenstored/domains.ml
@@ -14,6 +14,8 @@
  * GNU Lesser General Public License for more details.
  *)
 
+let debug fmt = Logging.debug "domains" fmt
+
 type domains = {
 	eventchn: Event.t;
 	table: (Xc.domid, Domain.t) Hashtbl.t;
@@ -35,7 +37,7 @@
 		try
 			let info = Xc.domain_getinfo xc id in
 			if info.Xc.shutdown || info.Xc.dying then (
-				Logs.debug "general" "Domain %u died (dying=%b, shutdown %b -- code %d)"
+				debug "Domain %u died (dying=%b, shutdown %b -- code %d)"
 				                    id info.Xc.dying info.Xc.shutdown info.Xc.shutdown_code;
 				if info.Xc.dying then
 					dead_dom := id :: !dead_dom
@@ -43,7 +45,7 @@
 					notify := true;
 			)
 		with Xc.Error _ ->
-			Logs.debug "general" "Domain %u died -- no domain info" id;
+			debug "Domain %u died -- no domain info" id;
 			dead_dom := id :: !dead_dom;
 		) doms.table;
 	List.iter (fun id ->
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/logging.ml
--- a/tools/ocaml/xenstored/logging.ml
+++ b/tools/ocaml/xenstored/logging.ml
@@ -17,21 +17,122 @@
 open Stdext
 open Printf
 
-let error fmt = Logs.error "general" fmt
-let info fmt = Logs.info "general" fmt
-let debug fmt = Logs.debug "general" fmt
 
-let access_log_file = ref "/var/log/xenstored-access.log"
-let access_log_nb_files = ref 20
-let access_log_nb_lines = ref 13215
-let activate_access_log = ref true
+(* Logger common *)
 
-(* maximal size of the lines in xenstore-acces.log file *)
-let line_size = 180
+type logger =
+		{ stop: unit -> unit;
+		  restart: unit -> unit;
+		  rotate: unit -> unit;
+		  write: 'a. ('a, unit, string, unit) format4 -> 'a }
 
-let log_read_ops = ref false
-let log_transaction_ops = ref false
-let log_special_ops = ref false
+let truncate_line nb_chars line = 
+	if String.length line > nb_chars - 1 then
+		let len = max (nb_chars - 1) 2 in
+		let dst_line = String.create len in
+		String.blit line 0 dst_line 0 (len - 2);
+		dst_line.[len-2] <- '.'; 
+		dst_line.[len-1] <- '.';
+		dst_line
+	else line
+
+let log_rotate ref_ch log_file log_nb_files =
+	let file n = sprintf "%s.%i" log_file n in
+	let log_files =
+		let rec aux accu n =
+			if n >= log_nb_files then accu
+			else
+				if n = 1 && Sys.file_exists log_file
+				then aux [log_file,1] 2
+				else
+					let file = file (n-1) in
+					if Sys.file_exists file then
+						aux ((file, n) :: accu) (n+1)
+					else accu in
+		aux [] 1 in
+	List.iter (fun (f, n) -> Unix.rename f (file n)) log_files;
+	close_out !ref_ch;
+	ref_ch := open_out log_file
+
+let make_logger log_file log_nb_files log_nb_lines log_nb_chars post_rotate =
+	let channel = ref (open_out_gen [Open_append; Open_creat] 0o644 log_file) in
+	let counter = ref 0 in
+	let stop() =
+		try flush !channel; close_out !channel
+		with _ -> () in
+	let restart() =
+		stop();
+		channel := open_out_gen [Open_append; Open_creat] 0o644 log_file in
+	let rotate() =
+		log_rotate channel log_file log_nb_files;
+		(post_rotate (): unit);
+		counter := 0 in
+	let output s =
+		let s = if log_nb_chars > 0 then truncate_line log_nb_chars s else s in
+		let s = s ^ "\n" in
+		output_string !channel s;
+		flush !channel;
+		incr counter;
+		if !counter > log_nb_lines then rotate() in
+	{ stop=stop; restart=restart; rotate=rotate; write = fun fmt -> Printf.ksprintf output fmt }
+
+
+(* Xenstored logger *) 
+
+exception Unknown_level of string
+
+type level = Debug | Info | Warn | Error | Null
+
+let int_of_level = function
+	| Debug -> 0 | Info -> 1 | Warn -> 2
+	| Error -> 3 | Null -> max_int
+
+let string_of_level = function
+	| Debug -> "debug" | Info -> "info" | Warn -> "warn"
+	| Error -> "error" | Null -> "null"
+
+let level_of_string = function
+	| "debug" -> Debug | "info"  -> Info | "warn"  -> Warn
+	| "error" -> Error | "null"  -> Null | s  -> raise (Unknown_level s)
+
+let string_of_date () =
+	let time = Unix.gettimeofday () in
+	let tm = Unix.gmtime time in
+	let msec = time -. (floor time) in
+	sprintf "%d%.2d%.2dT%.2d:%.2d:%.2d.%.3dZ"
+		(1900 + tm.Unix.tm_year) (tm.Unix.tm_mon + 1) tm.Unix.tm_mday
+		tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
+		(int_of_float (1000.0 *. msec))
+
+let xenstored_log_file = ref "/var/log/xenstored.log"
+let xenstored_log_level = ref Null
+let xenstored_log_nb_files = ref 10
+let xenstored_log_nb_lines = ref 13215
+let xenstored_log_nb_chars = ref (-1)
+let xenstored_logger = ref (None: logger option)
+
+let init_xenstored_log () =
+	if !xenstored_log_level <> Null && !xenstored_log_nb_files > 0 then
+		let logger =
+			make_logger 
+				!xenstored_log_file !xenstored_log_nb_files !xenstored_log_nb_lines
+				!xenstored_log_nb_chars ignore in
+		xenstored_logger := Some logger
+
+let xenstored_logging level key (fmt: (_,_,_,_) format4) =
+	match !xenstored_logger with
+	| Some logger when int_of_level level >= int_of_level !xenstored_log_level ->
+			let date = string_of_date() in
+			let level = string_of_level level in
+			logger.write ("[%s|%5s|%s] " ^^ fmt) date level key
+	| _ -> Printf.ksprintf ignore fmt
+
+let debug key = xenstored_logging Debug key
+let info key = xenstored_logging Info key
+let warn key = xenstored_logging Warn key
+let error key = xenstored_logging Error key
+
+(* Access logger *)
 
 type access_type =
 	| Coalesce
@@ -41,38 +142,10 @@
 	| Endconn
 	| XbOp of Xb.Op.operation
 
-type access =
-	{
-		fd: out_channel ref;
-		counter: int ref;
-		write: tid:int -> con:string -> ?data:string -> access_type -> unit;
-	}
-
-let string_of_date () =
-	let time = Unix.gettimeofday () in
-	let tm = Unix.localtime time in
-	let msec = time -. (floor time) in
-	sprintf "%d%.2d%.2d %.2d:%.2d:%.2d.%.3d" (1900 + tm.Unix.tm_year)
-		(tm.Unix.tm_mon + 1)
-		tm.Unix.tm_mday
-		tm.Unix.tm_hour
-		tm.Unix.tm_min
-		tm.Unix.tm_sec
-		(int_of_float (1000.0 *. msec))
-
-let fill_with_space n s =
-	if String.length s < n
-	then 
-		let r = String.make n ' ' in
-		String.blit s 0  r 0 (String.length s);
-		r
-	else 
-		s
-
 let string_of_tid ~con tid =
 	if tid = 0
-	then fill_with_space 12 (sprintf "%s" con)
-	else fill_with_space 12 (sprintf "%s.%i" con tid)
+	then sprintf "%-12s" con
+	else sprintf "%-12s" (sprintf "%s.%i" con tid)
 
 let string_of_access_type = function
 	| Coalesce                -> "coalesce "
@@ -109,41 +182,9 @@
 
 	| Xb.Op.Error             -> "error    "
 	| Xb.Op.Watchevent        -> "w event  "
-
+		(* 
 	| x                       -> Xb.Op.to_string x
-
-let file_exists file =
-	try
-		Unix.close (Unix.openfile file [Unix.O_RDONLY] 0o644);
-		true
-	with _ ->
-		false
-
-let log_rotate fd =
-	let file n = sprintf "%s.%i" !access_log_file n in
-	let log_files =
-		let rec aux accu n =
-			if n >= !access_log_nb_files
-			then accu
-			else if n = 1 && file_exists !access_log_file
-			then aux [!access_log_file,1] 2
-			else
-				let file = file (n-1) in
-				if file_exists file
-				then aux ((file,n) :: accu) (n+1)
-				else accu
-		in
-		aux [] 1
-	in
-	let rec rename = function
-		| (f,n) :: t when n < !access_log_nb_files -> 
-			Unix.rename f (file n);
-			rename t
-		| _ -> ()
-	in
-	rename log_files;
-	close_out !fd;
-	fd := open_out !access_log_file
+		*) 
 
 let sanitize_data data =
 	let data = String.copy data in
@@ -154,86 +195,67 @@
 	done;
 	String.escaped data
 
-let make save_to_disk =
-	let fd = ref (open_out_gen [Open_append; Open_creat] 0o644 !access_log_file) in
-	let counter = ref 0 in
-	{
-		fd = fd;
-		counter = counter;
-		write = 
-			if not !activate_access_log || !access_log_nb_files = 0
-			then begin fun ~tid ~con ?data _ -> () end
-			else fun ~tid ~con ?(data="") access_type ->
-				let s = Printf.sprintf "[%s] %s %s %s\n" (string_of_date()) (string_of_tid ~con tid) 
-					(string_of_access_type access_type) (sanitize_data data) in
-				let s =
-					if String.length s > line_size
-					then begin
-						let s = String.sub s 0 line_size in
-						s.[line_size-3] <- '.'; 
-						s.[line_size-2] <- '.';
-						s.[line_size-1] <- '\n';
-						s
-					end else
-						s
-				in
-				incr counter;
-				output_string !fd s;
-				flush !fd;
-				if !counter > !access_log_nb_lines 
-				then begin 
-					log_rotate fd;
-					save_to_disk ();
-					counter := 0;
-				end
-	}
+let activate_access_log = ref true
+let access_log_file = ref "/var/log/xenstored-access.log"
+let access_log_nb_files = ref 20
+let access_log_nb_lines = ref 13215
+let access_log_nb_chars = ref 180
+let access_log_read_ops = ref false
+let access_log_transaction_ops = ref false
+let access_log_special_ops = ref false
+let access_logger = ref None
 
-let access : (access option) ref = ref None
-let init aal save_to_disk =
-	activate_access_log := aal;
-	access := Some (make save_to_disk)
+let init_access_log post_rotate =
+	if !access_log_nb_files > 0 then
+		let logger =
+			make_logger
+				!access_log_file !access_log_nb_files !access_log_nb_lines
+				!access_log_nb_chars post_rotate in
+		access_logger := Some logger
 
-let write_access_log ~con ~tid ?data access_type = 
+let access_logging ~con ~tid ?(data="") access_type =
         try
-	  maybe (fun a -> a.write access_type ~con ~tid ?data) !access
+		maybe
+			(fun logger ->
+				let date = string_of_date() in
+				let tid = string_of_tid ~con tid in
+				let access_type = string_of_access_type access_type in
+				let data = sanitize_data data in
+				logger.write "[%s] %s %s %s" date tid access_type data)
+			!access_logger
 	with _ -> ()
 
-let new_connection = write_access_log Newconn
-let end_connection = write_access_log Endconn
+let new_connection = access_logging Newconn
+let end_connection = access_logging Endconn
 let read_coalesce ~tid ~con data =
-	if !log_read_ops
-	then write_access_log Coalesce ~tid ~con ~data:("read "^data)
-let write_coalesce data = write_access_log Coalesce ~data:("write "^data)
-let conflict = write_access_log Conflict
-let commit = write_access_log Commit
+	if !access_log_read_ops
+	then access_logging Coalesce ~tid ~con ~data:("read "^data)
+let write_coalesce data = access_logging Coalesce ~data:("write "^data)
+let conflict = access_logging Conflict
+let commit = access_logging Commit
 
 let xb_op ~tid ~con ~ty data =
-	let print =
-	match ty with
-		| Xb.Op.Read | Xb.Op.Directory | Xb.Op.Getperms -> !log_read_ops
+	let print = match ty with
+		| Xb.Op.Read | Xb.Op.Directory | Xb.Op.Getperms -> !access_log_read_ops
 		| Xb.Op.Transaction_start | Xb.Op.Transaction_end ->
 			false (* transactions are managed below *)
 		| Xb.Op.Introduce | Xb.Op.Release | Xb.Op.Getdomainpath | Xb.Op.Isintroduced | Xb.Op.Resume ->
-			!log_special_ops
-		| _ -> true
-	in
-		if print 
-		then write_access_log ~tid ~con ~data (XbOp ty)
+			!access_log_special_ops
+		| _ -> true in
+	if print then access_logging ~tid ~con ~data (XbOp ty)
 
 let start_transaction ~tid ~con = 
-	if !log_transaction_ops && tid <> 0
-	then write_access_log ~tid ~con (XbOp Xb.Op.Transaction_start)
+	if !access_log_transaction_ops && tid <> 0
+	then access_logging ~tid ~con (XbOp Xb.Op.Transaction_start)
 
 let end_transaction ~tid ~con = 
-	if !log_transaction_ops && tid <> 0
-	then write_access_log ~tid ~con (XbOp Xb.Op.Transaction_end)
+	if !access_log_transaction_ops && tid <> 0
+	then access_logging ~tid ~con (XbOp Xb.Op.Transaction_end)
 
 let xb_answer ~tid ~con ~ty data =
 	let print = match ty with
-		| Xb.Op.Error when data="ENOENT " -> !log_read_ops
-		| Xb.Op.Error -> !log_special_ops
+		| Xb.Op.Error when String.startswith "ENOENT" data -> !access_log_read_ops
+		| Xb.Op.Error -> true
 		| Xb.Op.Watchevent -> true
-		| _ -> false
-	in
-		if print
-		then write_access_log ~tid ~con ~data (XbOp ty)
+		| _ -> false in
+	if print then access_logging ~tid ~con ~data (XbOp ty)
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/perms.ml
--- a/tools/ocaml/xenstored/perms.ml
+++ b/tools/ocaml/xenstored/perms.ml
@@ -15,6 +15,8 @@
  * GNU Lesser General Public License for more details.
  *)
 
+let info fmt = Logging.info "perms" fmt
+
 open Stdext
 
 let activate = ref true
@@ -145,16 +147,16 @@
 		in
 		match perm, request with
 		| NONE, _ ->
-			Logs.info "io" "Permission denied: Domain %d has no permission" domainid;
+			info "Permission denied: Domain %d has no permission" domainid;
 			false
 		| RDWR, _ -> true
 		| READ, READ -> true
 		| WRITE, WRITE -> true
 		| READ, _ ->
-			Logs.info "io" "Permission denied: Domain %d has read only access" domainid;
+			info "Permission denied: Domain %d has read only access" domainid;
 			false
 		| WRITE, _ ->
-			Logs.info "io" "Permission denied: Domain %d has write only access" domainid;
+			info "Permission denied: Domain %d has write only access" domainid;
 			false
 	in
 	if !activate
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/process.ml
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -14,6 +14,9 @@
  * GNU Lesser General Public License for more details.
  *)
 
+let error fmt = Logging.error "process" fmt
+let info fmt = Logging.info "process" fmt
+
 open Printf
 open Stdext
 
@@ -79,7 +82,7 @@
 
 (* packets *)
 let do_debug con t domains cons data =
-	if not !allow_debug
+	if not (Connection.is_dom0 con) && not !allow_debug
 	then None
 	else try match split None '\000' data with
 	| "print" :: msg :: _ ->
@@ -89,6 +92,9 @@
 		let domid = int_of_string domid in
 		let quota = (Store.get_quota t.Transaction.store) in
 		Some (Quota.to_string quota domid ^ "\000")
+	| "watches" :: _ ->
+		let watches = Connections.debug cons in
+		Some (watches ^ "\000")
 	| "mfn" :: domid :: _ ->
 		let domid = int_of_string domid in
 		let con = Connections.find_domain cons domid in
@@ -357,8 +363,7 @@
 			in
 		input_handle_error ~cons ~doms ~fct ~ty ~con ~t ~rid ~data;
 	with exn ->
-		Logs.error "general" "process packet: %s"
-		          (Printexc.to_string exn);
+		error "process packet: %s" (Printexc.to_string exn);
 		Connection.send_error con tid rid "EIO"
 
 let write_access_log ~ty ~tid ~con ~data =
@@ -372,7 +377,7 @@
 		let packet = Connection.pop_in con in
 		let tid, rid, ty, data = Xb.Packet.unpack packet in
 		(* As we don't log IO, do not call an unnecessary sanitize_data 
-		   Logs.info "io" "[%s] -> [%d] %s \"%s\""
+		   info "[%s] -> [%d] %s \"%s\""
 		         (Connection.get_domstr con) tid
 		         (Xb.Op.to_string ty) (sanitize_data data); *)
 		process_packet ~store ~cons ~doms ~con ~tid ~rid ~ty ~data;
@@ -386,7 +391,7 @@
 			let packet = Connection.peek_output con in
 			let tid, rid, ty, data = Xb.Packet.unpack packet in
 			(* As we don't log IO, do not call an unnecessary sanitize_data 
-			   Logs.info "io" "[%s] <- %s \"%s\""
+			   info "[%s] <- %s \"%s\""
 			         (Connection.get_domstr con)
 			         (Xb.Op.to_string ty) (sanitize_data data);*)
 			write_answer_log ~ty ~tid ~con ~data;
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/quota.ml
--- a/tools/ocaml/xenstored/quota.ml
+++ b/tools/ocaml/xenstored/quota.ml
@@ -18,7 +18,7 @@
 exception Data_too_big
 exception Transaction_opened
 
-let warn fmt = Logs.warn "general" fmt
+let warn fmt = Logging.warn "quota" fmt
 let activate = ref true
 let maxent = ref (10000)
 let maxsize = ref (4096)
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/store.ml
--- a/tools/ocaml/xenstored/store.ml
+++ b/tools/ocaml/xenstored/store.ml
@@ -83,7 +83,7 @@
 let check_owner node connection =
 	if not (Perms.check_owner connection node.perms)
 	then begin
-		Logs.info "io" "Permission denied: Domain %d not owner" (get_owner node);
+		Logging.info "store|node" "Permission denied: Domain %d not owner" (get_owner node);
 		raise Define.Permission_denied;
 	end
 
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/xenstored.conf
--- a/tools/ocaml/xenstored/xenstored.conf
+++ b/tools/ocaml/xenstored/xenstored.conf
@@ -22,9 +22,14 @@
 # Activate filed base backend
 persistant = false
 
-# Logs
-log = error;general;file:/var/log/xenstored.log
-log = warn;general;file:/var/log/xenstored.log
-log = info;general;file:/var/log/xenstored.log
+# Xenstored logs
+# xenstored-log-file = /var/log/xenstored.log
+# xenstored-log-level = null
+# xenstored-log-nb-files = 10
 
-# log = debug;io;file:/var/log/xenstored-io.log
+# Xenstored access logs
+# access-log-file = /var/log/xenstored-access.log
+# access-log-nb-lines = 13215
+# acesss-log-nb-chars = 180
+# access-log-special-ops = false
+
diff -r 3cb878660928 -r b6d1deac6ca2 tools/ocaml/xenstored/xenstored.ml
--- a/tools/ocaml/xenstored/xenstored.ml
+++ b/tools/ocaml/xenstored/xenstored.ml
@@ -18,7 +18,10 @@
 open Printf
 open Parse_arg
 open Stdext
-open Logging
+
+let error fmt = Logging.error "xenstored" fmt
+let debug fmt = Logging.debug "xenstored" fmt
+let info fmt = Logging.info "xenstored" fmt
 
 (*------------ event klass processors --------------*)
 let process_connection_fds store cons domains rset wset =
@@ -64,7 +67,8 @@
 		()
 
 let sighup_handler _ =
-	try Logs.reopen (); info "Log re-opened" with _ -> ()
+	maybe (fun logger -> logger.Logging.restart()) !Logging.xenstored_logger;
+	maybe (fun logger -> logger.Logging.restart()) !Logging.access_logger
 
 let config_filename cf =
 	match cf.config_file with
@@ -75,26 +79,6 @@
 
 let parse_config filename =
 	let pidfile = ref default_pidfile in
-	let set_log s =
-		let ls = String.split ~limit:3 ';' s in
-		let level, key, logger = match ls with
-		| [ level; key; logger ] -> level, key, logger
-		| _ -> failwith "format mismatch: expecting 3 arguments" in
-
-		let loglevel = match level with
-		| "debug" -> Log.Debug
-		| "info"  -> Log.Info
-		| "warn"  -> Log.Warn
-		| "error" -> Log.Error
-		| s       -> failwith (sprintf "Unknown log level: %s" s) in
-
-		(* if key is empty, append to the default logger *)
-		let append =
-			if key = "" then
-				Logs.append_default
-			else
-				Logs.append key in
-		append loglevel logger in
 	let options = [
 		("merge-activate", Config.Set_bool Transaction.do_coalesce);
 		("perms-activate", Config.Set_bool Perms.activate);
@@ -104,14 +88,20 @@
 		("quota-maxentity", Config.Set_int Quota.maxent);
 		("quota-maxsize", Config.Set_int Quota.maxsize);
 		("test-eagain", Config.Set_bool Transaction.test_eagain);
-		("log", Config.String set_log);
 		("persistant", Config.Set_bool Disk.enable);
+		("xenstored-log-file", Config.Set_string Logging.xenstored_log_file);
+		("xenstored-log-level", Config.String
+			(fun s -> Logging.xenstored_log_level := Logging.level_of_string s));
+		("xenstored-log-nb-files", Config.Set_int Logging.xenstored_log_nb_files);
+		("xenstored-log-nb-lines", Config.Set_int Logging.xenstored_log_nb_lines);
+		("xenstored-log-nb-chars", Config.Set_int Logging.xenstored_log_nb_chars);
 		("access-log-file", Config.Set_string Logging.access_log_file);
 		("access-log-nb-files", Config.Set_int Logging.access_log_nb_files);
 		("access-log-nb-lines", Config.Set_int Logging.access_log_nb_lines);
-		("access-log-read-ops", Config.Set_bool Logging.log_read_ops);
-		("access-log-transactions-ops", Config.Set_bool Logging.log_transaction_ops);
-		("access-log-special-ops", Config.Set_bool Logging.log_special_ops);
+		("access-log-nb-chars", Config.Set_int Logging.access_log_nb_chars);
+		("access-log-read-ops", Config.Set_bool Logging.access_log_read_ops);
+		("access-log-transactions-ops", Config.Set_bool Logging.access_log_transaction_ops);
+		("access-log-special-ops", Config.Set_bool Logging.access_log_special_ops);
 		("allow-debug", Config.Set_bool Process.allow_debug);
 		("pid-file", Config.Set_string pidfile); ] in
 	begin try Config.read filename options (fun _ _ -> raise Not_found)
@@ -223,9 +213,6 @@
 end
 
 let _ =
-	printf "Xen Storage Daemon, version %d.%d\n%!"
-	       Define.xenstored_major Define.xenstored_minor;
-
 	let cf = do_argv in
 	let pidfile =
 		if Sys.file_exists (config_filename cf) then
@@ -249,13 +236,13 @@
 		in
 	
 	if cf.daemonize then
-		Unixext.daemonize ();
+		Unixext.daemonize ()
+	else
+		printf "Xen Storage Daemon, version %d.%d\n%!" 
+			Define.xenstored_major Define.xenstored_minor;
 
 	(try Unixext.pidfile_write pidfile with _ -> ());
 
-	info "Xen Storage Daemon, version %d.%d"
-	     Define.xenstored_major Define.xenstored_minor;
-
 	(* for compatilibity with old xenstored *)
 	begin match cf.pidfile with
 	| Some pidfile -> Unixext.pidfile_write pidfile
@@ -293,7 +280,14 @@
 	Sys.set_signal Sys.sigusr1 (Sys.Signal_handle (fun i -> sigusr1_handler store));
 	Sys.set_signal Sys.sigpipe Sys.Signal_ignore;
 
-	Logging.init cf.activate_access_log (fun () -> DB.to_file store cons "/var/run/xenstored/db");
+	Logging.init_xenstored_log();
+	if cf.activate_access_log then begin
+		let post_rotate () = DB.to_file store cons "/var/run/xenstored/db" in
+		Logging.init_access_log post_rotate
+	end;
+
+	info "Xen Storage Daemon, version %d.%d"
+	     Define.xenstored_major Define.xenstored_minor;
 
 	let spec_fds =
 		(match rw_sock with None -> [] | Some x -> [ x ]) @

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:39:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:39:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNwV-0000Dg-Va; Wed, 05 Oct 2011 02:39:12 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNrc-0006bd-Ep
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:34:08 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317807243!33996347!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13711 invoked from network); 5 Oct 2011 09:34:05 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:34:05 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="17955691"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:33:46 -0400
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;
	Wed, 5 Oct 2011 05:33:46 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RBNrF-0006aK-Rb; Wed, 05 Oct 2011
	10:33:45 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ad1b4634d0d001d2fb65b894e9b135a14aa996b9
Message-ID: <ad1b4634d0d001d2fb65.1317742228@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 4 Oct 2011 16:30:28 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 1 of 7] [OCAML] Rename the ocamlfind packages
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

ocamlfind does not support namespaces, so to avoid
name clashes the ocamlfind package names have been
changed. Note that this does not change the names
of the actual modules themselves.

xb becomes xenbus, xc becomes xenctrl, xl becomes xenlight,
xs becomes xenstore, eventchn becomes xeneventchn.

Signed-off-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

diff -r 3d1664cc9e45 -r ad1b4634d0d0 tools/ocaml/libs/eventchn/Makefile
--- a/tools/ocaml/libs/eventchn/Makefile
+++ b/tools/ocaml/libs/eventchn/Makefile
@@ -24,12 +24,12 @@
 .PHONY: install
 install: $(LIBS) META
 	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) eventchn
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore eventchn META $(INTF) $(LIBS) *.a *.so *.cmx
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xeneventchn
+	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xeneventchn META $(INTF) $(LIBS) *.a *.so *.cmx
 
 .PHONY: uninstall
 uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) eventchn
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xeneventchn
 
 include $(TOPLEVEL)/Makefile.rules
 
diff -r 3d1664cc9e45 -r ad1b4634d0d0 tools/ocaml/libs/xb/Makefile
--- a/tools/ocaml/libs/xb/Makefile
+++ b/tools/ocaml/libs/xb/Makefile
@@ -36,11 +36,11 @@
 .PHONY: install
 install: $(LIBS) META
 	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xb
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xb META $(INTF) $(LIBS) *.a *.so *.cmx
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenbus
+	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenbus META $(INTF) $(LIBS) *.a *.so *.cmx
 
 .PHONY: uninstall
 uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xb
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenbus
 
 include $(TOPLEVEL)/Makefile.rules
diff -r 3d1664cc9e45 -r ad1b4634d0d0 tools/ocaml/libs/xc/Makefile
--- a/tools/ocaml/libs/xc/Makefile
+++ b/tools/ocaml/libs/xc/Makefile
@@ -23,11 +23,11 @@
 .PHONY: install
 install: $(LIBS) META
 	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xc
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xc META $(INTF) $(LIBS) *.a *.so *.cmx
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenctrl
+	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenctrl META $(INTF) $(LIBS) *.a *.so *.cmx
 
 .PHONY: uninstall
 uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xc
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenctrl
 
 include $(TOPLEVEL)/Makefile.rules
diff -r 3d1664cc9e45 -r ad1b4634d0d0 tools/ocaml/libs/xl/Makefile
--- a/tools/ocaml/libs/xl/Makefile
+++ b/tools/ocaml/libs/xl/Makefile
@@ -56,11 +56,11 @@
 .PHONY: install
 install: $(LIBS) META
 	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xl
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xl META $(INTF) $(LIBS) *.a *.so *.cmx
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenlight
+	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenlight META $(INTF) $(LIBS) *.a *.so *.cmx
 
 .PHONY: uninstall
 uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xl
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenlight
 
 include $(TOPLEVEL)/Makefile.rules
diff -r 3d1664cc9e45 -r ad1b4634d0d0 tools/ocaml/libs/xs/META.in
--- a/tools/ocaml/libs/xs/META.in
+++ b/tools/ocaml/libs/xs/META.in
@@ -1,5 +1,5 @@
 version = "@VERSION@"
 description = "XenStore Interface"
-requires = "unix,xb"
+requires = "unix,xenbus"
 archive(byte) = "xs.cma"
 archive(native) = "xs.cmxa"
diff -r 3d1664cc9e45 -r ad1b4634d0d0 tools/ocaml/libs/xs/Makefile
--- a/tools/ocaml/libs/xs/Makefile
+++ b/tools/ocaml/libs/xs/Makefile
@@ -26,12 +26,12 @@
 .PHONY: install
 install: $(LIBS) META
 	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xs
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xs META $(INTF) xs.mli xst.mli xsraw.mli $(LIBS) *.a *.cmx
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenstore
+	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenstore META $(INTF) xs.mli xst.mli xsraw.mli $(LIBS) *.a *.cmx
 
 .PHONY: uninstall
 uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xs
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenstore
 
 include $(TOPLEVEL)/Makefile.rules
 

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:40:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:40:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNxR-0000bB-OK; Wed, 05 Oct 2011 02:40:09 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNrc-0006bg-WE
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:34:09 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317807243!33996347!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13779 invoked from network); 5 Oct 2011 09:34:05 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:34:05 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="17955688"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:33:46 -0400
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;
	Wed, 5 Oct 2011 05:33:46 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RBNrF-0006aK-RN; Wed, 05 Oct 2011
	10:33:45 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 4 Oct 2011 16:30:27 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 0 of 7] Ocaml related fixes/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



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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:40:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:40:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNy8-0000xH-Dx; Wed, 05 Oct 2011 02:40:52 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNre-0006c3-9l
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:34:10 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317807243!33996347!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13899 invoked from network); 5 Oct 2011 09:34:07 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:34:07 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="17955690"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:33:46 -0400
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;
	Wed, 5 Oct 2011 05:33:46 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RBNrF-0006aK-T6; Wed, 05 Oct 2011
	10:33:45 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 05f63323bbb5f578529f7decda5059c131027ffe
Message-ID: <05f63323bbb5f578529f.1317742233@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 4 Oct 2011 16:30:33 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 6 of 7] [OCAML] Fix 2 bit-twiddling bugs and an
	off-by-one
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 bit bugs are in ocaml vcpu affinity calls, and the off-by-one
error is in the ocaml console ring code

Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

diff -r 875d9c54a1cd -r 05f63323bbb5 tools/ocaml/libs/xc/xc_stubs.c
--- a/tools/ocaml/libs/xc/xc_stubs.c
+++ b/tools/ocaml/libs/xc/xc_stubs.c
@@ -430,7 +430,7 @@
 
 	for (i=0; i<len; i++) {
 		if (Bool_val(Field(cpumap, i)))
-			c_cpumap[i/8] |= i << (i&7);
+			c_cpumap[i/8] |= 1 << (i&7);
 	}
 	retval = xc_vcpu_setaffinity(_H(xch), _D(domid),
 	                             Int_val(vcpu), c_cpumap);
@@ -466,7 +466,7 @@
 	ret = caml_alloc(len, 0);
 
 	for (i=0; i<len; i++) {
-		if (c_cpumap[i%8] & 1 << (i&7))
+		if (c_cpumap[i/8] & 1 << (i&7))
 			Store_field(ret, i, Val_true);
 		else
 			Store_field(ret, i, Val_false);
@@ -523,7 +523,7 @@
 
 CAMLprim value stub_xc_readconsolering(value xch)
 {
-	unsigned int size = RING_SIZE;
+	unsigned int size = RING_SIZE - 1;
 	char *ring_ptr = ring;
 
 	CAMLparam1(xch);

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:42:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:42:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBNzL-0001KX-La; Wed, 05 Oct 2011 02:42:07 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNre-0006bv-3e
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:34:10 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1317807239!51583292!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23657 invoked from network); 5 Oct 2011 09:34:00 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:34:00 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="17955692"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:33:46 -0400
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;
	Wed, 5 Oct 2011 05:33:46 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RBNrF-0006aK-Su; Wed, 05 Oct 2011
	10:33:45 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 875d9c54a1cdbf3b129a7da7d9f3268a8d49cc57
Message-ID: <875d9c54a1cdbf3b129a.1317742232@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 4 Oct 2011 16:30:32 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 5 of 7] [OCAML] Minor makefile cleanup
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Zheng Li <zheng.li@eu.citrix.com>
Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

diff -r b6d1deac6ca2 -r 875d9c54a1cd tools/ocaml/Makefile.rules
--- a/tools/ocaml/Makefile.rules
+++ b/tools/ocaml/Makefile.rules
@@ -52,20 +52,20 @@
 mk-caml-lib-native = $(call quiet-command, $(OCAMLOPT) $(OCAMLOPTFLAGS) -a -o $1 $2 $3,MLA,$1)
 mk-caml-lib-bytecode = $(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -a -o $1 $2 $3,MLA,$1)
 
-mk-caml-stubs = $(call quiet-command, $(OCAMLMKLIB) -o `basename $1 .a` $2,MKLIB,$1)
+mk-caml-stubs = $(call quiet-command, $(OCAMLMKLIB) $(LIBS_$(1)) -o $(1)_stubs $2,MKLIB,$1)
 mk-caml-lib-stubs = \
-	$(call quiet-command, $(AR) rcs $1 $2 && $(OCAMLMKLIB) -o `basename $1 .a | sed -e 's/^lib//'` $2,MKLIB,$1)
+	$(call quiet-command, $(AR) rcs lib$(1)_stubs.a $2 && $(OCAMLMKLIB) $(LIBS_$(1)) -o $(1)_stubs $2,MKLIB,$1)
 
 # define a library target <name>.cmxa and <name>.cma
 define OCAML_LIBRARY_template
  $(1).cmxa: lib$(1)_stubs.a $(foreach obj,$($(1)_OBJS),$(obj).cmx)
 	$(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $(foreach obj,$($(1)_OBJS),$(obj).cmx))
  $(1).cma: $(foreach obj,$($(1)_OBJS),$(obj).cmo)
-	$(call mk-caml-lib-bytecode,$$@, -dllib dll$(1)_stubs.so -cclib -l$(1)_stubs, $$+)
+	$(call mk-caml-lib-bytecode,$$@, -dllib dll$(1)_stubs.so -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $$+)
  $(1)_stubs.a: $(foreach obj,$$($(1)_C_OBJS),$(obj).o)
-	$(call mk-caml-stubs,$$@, $$+)
+	$(call mk-caml-stubs,$(1), $$+)
  lib$(1)_stubs.a: $(foreach obj,$($(1)_C_OBJS),$(obj).o)
-	$(call mk-caml-lib-stubs,$$@, $$+)
+	$(call mk-caml-lib-stubs,$(1), $$+)
 endef
 
 define OCAML_NOC_LIBRARY_template
diff -r b6d1deac6ca2 -r 875d9c54a1cd tools/ocaml/libs/eventchn/Makefile
--- a/tools/ocaml/libs/eventchn/Makefile
+++ b/tools/ocaml/libs/eventchn/Makefile
@@ -8,7 +8,7 @@
 INTF = $(foreach obj, $(OBJS),$(obj).cmi)
 LIBS = eventchn.cma eventchn.cmxa
 
-LIBS_evtchn = $(LDLIBS_libxenctrl)
+LIBS_eventchn = $(LDLIBS_libxenctrl)
 
 all: $(INTF) $(LIBS) $(PROGRAMS)
 

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:43:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:43:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBO0P-0001hY-Hk; Wed, 05 Oct 2011 02:43:13 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNrd-0006bh-Lh
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:34:10 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317807243!33996347!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13867 invoked from network); 5 Oct 2011 09:34:06 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:34:06 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="17955689"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:33:46 -0400
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;
	Wed, 5 Oct 2011 05:33:46 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RBNrF-0006aK-Ro; Wed, 05 Oct 2011
	10:33:45 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: d94a733c3a920ac9d8ec107cf83a41ead844d499
Message-ID: <d94a733c3a920ac9d8ec.1317742229@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Tue, 4 Oct 2011 16:30:29 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 2 of 7] [OCAML] Add a missing dependency to the
	xenctrl ocaml package
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

diff -r ad1b4634d0d0 -r d94a733c3a92 tools/ocaml/libs/xc/META.in
--- a/tools/ocaml/libs/xc/META.in
+++ b/tools/ocaml/libs/xc/META.in
@@ -1,5 +1,5 @@
 version = "@VERSION@"
 description = "Xen Control Interface"
-requires = "mmap,uuid"
+requires = "unix,mmap,uuid"
 archive(byte) = "xc.cma"
 archive(native) = "xc.cmxa"

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:44:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02: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 1RBO1I-0002DJ-TK; Wed, 05 Oct 2011 02:44:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNsb-0006wP-Ja
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:35:09 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1317807306!30295685!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29558 invoked from network); 5 Oct 2011 09:35:06 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:35:06 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312156800"; 
   d="scan'208";a="8220421"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 09:35: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; Wed, 5 Oct 2011
	10:35:06 +0100
Subject: Re: [Xen-devel] [PATCH] tools/check: check for yajl (needed by libxl)
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Andre Przywara <andre.przywara@amd.com>
Date: Wed, 5 Oct 2011 10:35:05 +0100
In-Reply-To: <4E8C1430.3050203@amd.com>
References: <4b98868690218126b906.1317368189@cosworth.uk.xensource.com>
	<CAJJyHjL55fNgwrmDVdCehaOLC1mPecf8M4fE4RCn_g_vygj=0A@mail.gmail.com>
	<1317379194.26672.256.camel@zakaz.uk.xensource.com>
	<4E8B1CCA.4040805@amd.com>
	<1317740400.21903.155.camel@zakaz.uk.xensource.com>
	<4E8C1430.3050203@amd.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317807306.21903.188.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Anthony Perard <anthony.perard@citrix.com>, Olaf Hering <olaf@aepfle.de>,
	"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-10-05 at 09:24 +0100, Andre Przywara wrote:
> On 10/04/2011 05:00 PM, Ian Campbell wrote:
> > On Tue, 2011-10-04 at 15:48 +0100, Andre Przywara wrote:
> >> On 09/30/2011 12:39 PM, Ian Campbell wrote:
> >>> On Fri, 2011-09-30 at 11:35 +0100, Anthony PERARD wrote:
> >>>> On Fri, Sep 30, 2011 at 08:36, Ian Campbell<ian.campbell@citrix.com>   wrote:
> >>>>   ...
> >>>> You probably want to check the yajl headers as well, no ?
> >>>> #include<yajl/yajl_parse.h>
> >>>> #include<yajl/yajl_gen.h>
> >>>
> > ...
> >> Also wouldn't it be nicer to link this small library statically? This
> >> would omit the runtime requirement at all.
> >> The test team just spelled yajl as "yet another library to get Xen
> >> running"...
> >
> > I don't think this is necessary, it's just a library you need to install
> > and for most users the packaging system will transparently cover this.
> > All the usual reasons for not statically linking stuff apply here.
> > There's nothing special about that wrt Xen and/or the size of the
> > library.
> 
> Unfortunately this package is not omnipresent in the distributions. 
> Though I find it already in Fedora 13, it is not in the official RHEL5 
> repos, also not in anything before OpenSuSE 11.4 and before SLES11SP2. 
> This creates quite some hassle for any people using one of these systems 
> to build and run Xen. And pulling it from github will push most people 
> (like me ;-) into version 2 in the first place.

Hrm, that's unfortunate. It seems to be the only even vaguely widespread
JSON library for C so I'm not sure there was much alternative here given
that we have to speak JSON in order to speak QMP to upstream Qemu.

AIUI it is usually sufficient to find either a binary RPM from a closely
related distro (i.e. a newer version of said distro or e.g. OpenSUSE for
SLES) or to find a .src.rpm and run rpmbuild on it. I don't suppose
these distros have the equivalent of Debian's backports.org? If
necessary we should have a page on the wiki which gives pointers to
where to obtain these libraries.

> But I guess this will not convince you to drop it from unstable. That's 
> why I thought static linking

But to statically link you must have already obtained the library from
somewhere, right? So statically linking doesn't really help.

>  (or including in the tree?)

Absolutely not.

IMHO the Xen repos should not be ingesting/bundling every project or
library which we want to make use of. We have done this in the past
(i.e. libaio) and it was a mistake.

There is nothing wrong with a project having dependencies on libraries
and other various software. We should strive to clearly document these
dependencies but we should not feel obliged to import them into the Xen
repos.

Including stuff in the Xen tree makes it harder for our downstreams
(i.e. distros, who want to use the existing packages of a library not
some bundled version) to package Xen in a sane way and adds to
maintenance burden, both for us and them.

> >> Also be advised that it looks like this is relying on version 1 of yajl.
> >> It looks like the new version 2.0.1 is not compatible, I got compile
> >> errors with the newer version. If the stable version 1.x is required,
> >> this should be stated somewhere or at least checked properly in check_yajl.
> >
> > Any idea what we could test for here?
> 
> The sanest way would be to do it like configure and check explicitly for 
> the data structure that we rely on, but I guess just looking for a 
> symlink called libyajl.so.1 in /usr/lib64 should suffice here.
> 
> 
> >>> diff -r 302b7556edd9 -r de602616358b tools/check/check_yajl_lib
> >>> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> >>> +++ b/tools/check/check_yajl_lib	Fri Sep 30 11:39:35 2011 +0100
> >>> @@ -0,0 +1,6 @@
> >>> +#!/bin/sh
> >>> +# CHECK-BUILD CHECK-INSTALL
> >>> +
> >>> +. ./funcs.sh
> >>> +
> >>> +has_lib libyajl.so || fail "can't find libyajl.so"
> 
> +has_lib libyajl.so.1 || fail "can't find libyajl.so version 1"

Thanks, I'll regroove the patch with that and the other suggestion about
CHECK-INSTALL.

Ian.


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:45:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:45:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBO2G-0002ht-R5; Wed, 05 Oct 2011 02:45:09 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBNun-0007vL-FV
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:37:26 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1317807440!19795812!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9848 invoked from network); 5 Oct 2011 09:37:21 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:37:21 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312156800"; 
   d="scan'208";a="8220504"
Received: from lonpmailmx02.citrite.net ([10.30.203.163])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 09:37:07 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.160]) by
	LONPMAILMX02.citrite.net ([10.30.203.163]) with mapi; Wed, 5 Oct 2011
	10:37:08 +0100
From: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>
To: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>
Date: Wed, 5 Oct 2011 10:37:06 +0100
Thread-Topic: [PATCH 0 of 7] Ocaml related fixes/cleanups
Thread-Index: AcyDQlkQTgQuXhApS9Ks33k/hCs2eQ==
Message-ID: <18B12EE9-2C43-4883-BE63-529E4A352107@eu.citrix.com>
References: <patchbomb.1317742227@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317742227@snoosnoo2.uk.xensource.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>
Subject: [Xen-devel] Re: [PATCH 0 of 7] Ocaml related fixes/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

Ooops, sorry guys, please ignore this spam. Sent in error.=20

Jon


On 4 Oct 2011, at 16:30, Jon Ludlam wrote:

>=20


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:46:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:46:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBO3G-00035J-J5; Wed, 05 Oct 2011 02:46:10 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBO0B-0001c6-JB
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:42:59 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1317807775!20846591!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25482 invoked from network); 5 Oct 2011 09:42:56 -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;
	5 Oct 2011 09:42:56 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="17955906"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:42: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; Wed, 5 Oct 2011 05:42:54 -0400
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
	p959gqIE019174;	Wed, 5 Oct 2011 02:42:53 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: be6610d3477ebd77eb37c5961bf19a7afd31676f
Message-ID: <be6610d3477ebd77eb37.1317807771@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 5 Oct 2011 10:42:51 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Andre Przywara <andre.przywara@amd.com>
Subject: [Xen-devel] [PATCH] tools/check: check for yajl (needed by libxl)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317807757 -3600
# Node ID be6610d3477ebd77eb37c5961bf19a7afd31676f
# Parent  af62449dc68e952b8efbbb8302bc9ef0c801c9f9
tools/check: check for yajl (needed by libxl)

We need precisely version 1 so check for .so.1. In the future we should handle
yajl v2 as well.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
---
(note to committer, ensure the new file is executable)

diff -r af62449dc68e -r be6610d3477e tools/check/check_yajl_devel
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/check/check_yajl_devel	Wed Oct 05 10:42:37 2011 +0100
@@ -0,0 +1,8 @@
+#!/bin/sh
+# CHECK-BUILD
+
+. ./funcs.sh
+
+has_header yajl/yajl_parse.h || fail "can't find yajl/yajl_parse.h"
+has_header yajl/yajl_gen.h || fail "can't find yajl/yajl_gen.h"
+has_lib libyajl.so || fail "can't find libyajl.so"
diff -r af62449dc68e -r be6610d3477e tools/check/check_yajl_lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/check/check_yajl_lib	Wed Oct 05 10:42:37 2011 +0100
@@ -0,0 +1,6 @@
+#!/bin/sh
+# CHECK-BUILD CHECK-INSTALL
+
+. ./funcs.sh
+
+has_lib libyajl.so.1 || fail "can't find libyajl.so.1 version 1"

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:47:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:47:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBO4P-0003YS-M7; Wed, 05 Oct 2011 02:47:21 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBO2c-0002oy-Vq
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:45:31 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1317807926!19797402!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6743 invoked from network); 5 Oct 2011 09:45:27 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:45:27 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="17955931"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:45:26 -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; Wed, 5 Oct 2011 05:45:26 -0400
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
	p959jNOJ019177;	Wed, 5 Oct 2011 02:45:25 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: b85fcaaf73a9cfb5e5f448015c56630aa8daba3d
Message-ID: <b85fcaaf73a9cfb5e5f4.1317807923@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1317807922@cosworth.uk.xensource.com>
References: <patchbomb.1317807922@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 5 Oct 2011 10:45:23 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: =?iso-8859-1?q?Roger_Pau_Monn=E9?= <roger.pau@entel.upc.edu>
Subject: [Xen-devel] [PATCH 1 of 2] libxl: add and use parse_mac helper
	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 Ian Campbell <ian.campbell@citrix.com>
# Date 1317807819 -3600
# Node ID b85fcaaf73a9cfb5e5f448015c56630aa8daba3d
# Parent  6a40e32738e7026769c2932fa53b8aefd34e6a77
libxl: add and use parse_mac helper function

rather than open coding a bunch it a bunch of times.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 6a40e32738e7 -r b85fcaaf73a9 tools/libxl/libxl_internal.c
--- a/tools/libxl/libxl_internal.c	Wed Oct 05 10:43:10 2011 +0100
+++ b/tools/libxl/libxl_internal.c	Wed Oct 05 10:43:39 2011 +0100
@@ -277,6 +277,23 @@ int libxl__file_reference_unmap(libxl_fi
 	return ERROR_FAIL;
 }
 
+_hidden int libxl__parse_mac(const char *s, libxl_mac mac)
+{
+    const char *tok;
+    char *endptr;
+    int i;
+
+    for (i = 0, tok = s; *tok && (i < 6); ++i, tok += 3) {
+        mac[i] = strtol(tok, &endptr, 16);
+        if (endptr != (tok + 2) || (*endptr != '\0' && *endptr != ':') )
+            return ERROR_INVAL;
+    }
+    if ( i != 6 )
+        return ERROR_INVAL;
+
+    return 0;
+}
+
 int libxl__fd_set_cloexec(int fd)
 {
     int flags = 0;
diff -r 6a40e32738e7 -r b85fcaaf73a9 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Wed Oct 05 10:43:10 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Wed Oct 05 10:43:39 2011 +0100
@@ -426,6 +426,8 @@ _hidden int libxl__fd_set_cloexec(int fd
 
 _hidden int libxl__e820_alloc(libxl__gc *gc, uint32_t domid, libxl_domain_config *d_config);
 
+_hidden int libxl__parse_mac(const char *s, libxl_mac mac);
+
 #define STRINGIFY(x) #x
 #define TOSTRING(x) STRINGIFY(x)
 
diff -r 6a40e32738e7 -r b85fcaaf73a9 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Wed Oct 05 10:43:10 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Wed Oct 05 10:43:39 2011 +0100
@@ -452,22 +452,19 @@ int libxl_mac_to_device_nic(libxl_ctx *c
                             const char *mac, libxl_device_nic *nic)
 {
     libxl_nicinfo *nics;
-    unsigned int nb, i;
+    unsigned int nb, rc, i;
     int found;
-    uint8_t mac_n[6];
+    libxl_mac mac_n;
     uint8_t *a, *b;
-    const char *tok;
-    char *endptr;
+
+    rc = libxl__parse_mac(mac, mac_n);
+    if (rc)
+	    return rc;
 
     nics = libxl_list_nics(ctx, domid, &nb);
     if (!nics)
         return ERROR_FAIL;
 
-    for (i = 0, tok = mac; *tok && (i < 6); ++i, tok += 3) {
-        mac_n[i] = strtol(tok, &endptr, 16);
-        if (endptr != (tok + 2))
-            return ERROR_INVAL;
-    }
     memset(nic, 0, sizeof (libxl_device_nic));
     found = 0;
     for (i = 0; i < nb; ++i) {
@@ -494,9 +491,8 @@ int libxl_devid_to_device_nic(libxl_ctx 
                               const char *devid, libxl_device_nic *nic)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *tok, *val;
+    char *val;
     char *dompath, *nic_path_fe, *nic_path_be;
-    unsigned int i;
     int rc = ERROR_FAIL;
 
     memset(nic, 0, sizeof (libxl_device_nic));
@@ -515,10 +511,10 @@ int libxl_devid_to_device_nic(libxl_ctx 
     nic->devid = strtoul(devid, NULL, 10);
 
     val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", nic_path_fe));
-    for (i = 0, tok = strtok(val, ":"); tok && (i < 6);
-         ++i, tok = strtok(NULL, ":")) {
-        nic->mac[i] = strtoul(tok, NULL, 16);
-    }
+    rc = libxl__parse_mac(val, nic->mac);
+    if (rc)
+	    goto out;
+
     nic->script = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/script", nic_path_be), NULL);
     rc = 0;
 out:

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:48:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:48:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBO5P-0003vs-2U; Wed, 05 Oct 2011 02:48:23 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBO2f-0002pt-Sq
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:45:34 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1317807882!51070428!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26834 invoked from network); 5 Oct 2011 09:44:43 -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;
	5 Oct 2011 09:44:43 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="165760226"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:45:25 -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; Wed, 5 Oct 2011 05:45:25 -0400
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
	p959jNOI019177;	Wed, 5 Oct 2011 02:45:23 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1317807922@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 5 Oct 2011 10:45:22 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: =?iso-8859-1?q?Roger_Pau_Monn=E9?= <roger.pau@entel.upc.edu>
Subject: [Xen-devel] [PATCH 0 of 2] libxl: a couple of MAC address patches
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

These two patches should have been part of my "libxl: rationalise
libxl_device_* APIs" series but I missed them out. I will include them
in future repostings but for now here they are.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:49:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:49:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBO6H-0004Kx-Mo; Wed, 05 Oct 2011 02:49:17 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBO2g-0002qM-H4
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:45:35 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1317807882!51070428!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26877 invoked from network); 5 Oct 2011 09:44:44 -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;
	5 Oct 2011 09:44:44 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="165760229"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 05:45:27 -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; Wed, 5 Oct 2011 05:45:27 -0400
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
	p959jNOK019177;	Wed, 5 Oct 2011 02:45:26 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 88486538d739b5fb0aab51526e77315a696c6092
Message-ID: <88486538d739b5fb0aab.1317807924@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1317807922@cosworth.uk.xensource.com>
References: <patchbomb.1317807922@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 5 Oct 2011 10:45:24 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: =?iso-8859-1?q?Roger_Pau_Monn=E9?= <roger.pau@entel.upc.edu>
Subject: [Xen-devel] [PATCH 2 of 2] libxl: fix libxl_mac_to_device_nic
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317807819 -3600
# Node ID 88486538d739b5fb0aab51526e77315a696c6092
# Parent  b85fcaaf73a9cfb5e5f448015c56630aa8daba3d
libxl: fix libxl_mac_to_device_nic

I think I broke this back in 22041:4c9ef5ec9146, using i as both the inner and
outer loop iterator.

I've added libxl__compare_macs which helps keep things clean.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r b85fcaaf73a9 -r 88486538d739 tools/libxl/libxl_internal.c
--- a/tools/libxl/libxl_internal.c	Wed Oct 05 10:43:39 2011 +0100
+++ b/tools/libxl/libxl_internal.c	Wed Oct 05 10:43:39 2011 +0100
@@ -294,6 +294,18 @@ _hidden int libxl__parse_mac(const char 
     return 0;
 }
 
+_hidden int libxl__compare_macs(libxl_mac *a, libxl_mac *b)
+{
+    int i;
+
+    for (i = 0; i<6; i++) {
+        if ((*a)[i] != (*b)[i])
+            return (*a)[i] - (*b)[i];
+    }
+
+    return 0;
+}
+
 int libxl__fd_set_cloexec(int fd)
 {
     int flags = 0;
diff -r b85fcaaf73a9 -r 88486538d739 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Wed Oct 05 10:43:39 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Wed Oct 05 10:43:39 2011 +0100
@@ -426,7 +426,10 @@ _hidden int libxl__fd_set_cloexec(int fd
 
 _hidden int libxl__e820_alloc(libxl__gc *gc, uint32_t domid, libxl_domain_config *d_config);
 
+/* parse the string @s as a sequence of 6 colon separated bytes in to @mac */
 _hidden int libxl__parse_mac(const char *s, libxl_mac mac);
+/* compare mac address @a and @b. 0 if the same, -ve if a<b and +ve if a>b */
+_hidden int libxl__compare_macs(libxl_mac *a, libxl_mac *b);
 
 #define STRINGIFY(x) #x
 #define TOSTRING(x) STRINGIFY(x)
diff -r b85fcaaf73a9 -r 88486538d739 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Wed Oct 05 10:43:39 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Wed Oct 05 10:43:39 2011 +0100
@@ -453,9 +453,7 @@ int libxl_mac_to_device_nic(libxl_ctx *c
 {
     libxl_nicinfo *nics;
     unsigned int nb, rc, i;
-    int found;
     libxl_mac mac_n;
-    uint8_t *a, *b;
 
     rc = libxl__parse_mac(mac, mac_n);
     if (rc)
@@ -466,17 +464,15 @@ int libxl_mac_to_device_nic(libxl_ctx *c
         return ERROR_FAIL;
 
     memset(nic, 0, sizeof (libxl_device_nic));
-    found = 0;
+
+    rc = ERROR_INVAL;
     for (i = 0; i < nb; ++i) {
-        for (i = 0, a = nics[i].mac, b = mac_n;
-             (b < mac_n + 6) && (*a == *b); ++a, ++b)
-            ;
-        if ((b >= mac_n + 6) && (*a == *b)) {
+        if (!libxl__compare_macs(&mac_n, &nics[i].mac)) {
             nic->backend_domid = nics[i].backend_id;
             nic->devid = nics[i].devid;
             memcpy(nic->mac, nics[i].mac, sizeof (nic->mac));
             nic->script = strdup(nics[i].script);
-            found = 1;
+            rc = 0;
             break;
         }
     }
@@ -484,7 +480,7 @@ int libxl_mac_to_device_nic(libxl_ctx *c
     for (i=0; i<nb; i++)
         libxl_nicinfo_destroy(&nics[i]);
     free(nics);
-    return found;
+    return rc;
 }
 
 int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:50:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02: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 1RBO7X-0004kR-0C; Wed, 05 Oct 2011 02:50:35 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBO2o-0002sr-2U
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:45:42 -0700
X-Env-Sender: eli@dev.mellanox.co.il
X-Msg-Ref: server-14.tower-182.messagelabs.com!1317807938!20820676!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14017 invoked from network); 5 Oct 2011 09:45:39 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 09:45:39 -0000
Received: by eyd10 with SMTP id 10so460019eyd.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 02:45:38 -0700 (PDT)
Received: by 10.223.47.216 with SMTP id o24mr3244558faf.145.1317807938739;
	Wed, 05 Oct 2011 02:45:38 -0700 (PDT)
Received: from localhost ([82.166.227.17])
	by mx.google.com with ESMTPS id g19sm1613308fai.8.2011.10.05.02.45.36
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 05 Oct 2011 02:45:37 -0700 (PDT)
Date: Wed, 5 Oct 2011 11:45:35 +0200
From: Eli Cohen <eli@dev.mellanox.co.il>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] Xen interrupts when using passthrough
Message-ID: <20111005094535.GE2681@mtldesk30>
References: <20111004162906.GA2681@mtldesk30> <4E8B3949.4090803@citrix.com>
	<20111004190034.GA19881@mtldesk30>
	<4E8C22EB0200007800059622@nat28.tlf.novell.com>
	<20111005082633.GC2681@mtldesk30>
	<4E8C369E020000780005967C@nat28.tlf.novell.com>
	<20111005090048.GD2681@mtldesk30>
	<4E8C3ACD0200007800059694@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8C3ACD0200007800059694@nat28.tlf.novell.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: Andrew Cooper <andrew.cooper3@citrix.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

Thanks for the information.

On Wed, Oct 05, 2011 at 10:09:01AM +0100, Jan Beulich wrote:
> >>> On 05.10.11 at 11:00, Eli Cohen <eli@dev.mellanox.co.il> wrote:
> > On Wed, Oct 05, 2011 at 09:51:10AM +0100, Jan Beulich wrote:
> >> Dom0 shouldn't get involved at all - Xen does the necessary conversion.
> >> Dom0 may only be involved in setting things up. Whether they get
> >> received via event channels or virtual interrupts depends on the kind
> >> of guest.
> >> 
> > I think I used the wrong terminology not distinguishing between the
> > hypervisor and dom0 so I will ask again just to make sure. Is the
> > hypervisor involved in passing the interrupts?
> 
> Yes, of course. The hypervisor receives all physical interrupts.
> 
> > Does it depend on whether the guest is paravirtualized or not?
> 
> Yes, at least to some degree.
> 
> > The guest I am using is
> > paravirtualized (i.e uses xen hypercalls), so does it mean that it
> > uses event channels or is there a possibilty that it does not use
> > event channels.
> 
> Yes and no: PV guests can receive interrupts only via the event
> channel mechanism.
> 
> Jan

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:55:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:55:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBOC1-0005GK-RE; Wed, 05 Oct 2011 02:55:13 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBOBZ-000545-4z
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:54:45 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1317808481!33981055!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17264 invoked from network); 5 Oct 2011 09:54:41 -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;
	5 Oct 2011 09:54:41 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312156800"; 
   d="scan'208";a="8221104"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 09:54: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; Wed, 5 Oct 2011
	10:54:41 +0100
Subject: Re: [Xen-devel] Xen interrupts when using passthrough
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Wed, 5 Oct 2011 10:54:41 +0100
In-Reply-To: <4E8C3ACD0200007800059694@nat28.tlf.novell.com>
References: <20111004162906.GA2681@mtldesk30> <4E8B3949.4090803@citrix.com>
	<20111004190034.GA19881@mtldesk30>
	<4E8C22EB0200007800059622@nat28.tlf.novell.com>
	<20111005082633.GC2681@mtldesk30>
	<4E8C369E020000780005967C@nat28.tlf.novell.com>
	<20111005090048.GD2681@mtldesk30>
	<4E8C3ACD0200007800059694@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: <1317808481.21903.192.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Andrew Cooper <Andrew.Cooper3@citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Eli Cohen <eli@dev.mellanox.co.il>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-05 at 10:09 +0100, Jan Beulich wrote:
> >>> On 05.10.11 at 11:00, Eli Cohen <eli@dev.mellanox.co.il> wrote:
> > On Wed, Oct 05, 2011 at 09:51:10AM +0100, Jan Beulich wrote:
> >> Dom0 shouldn't get involved at all - Xen does the necessary conversion.
> >> Dom0 may only be involved in setting things up. Whether they get
> >> received via event channels or virtual interrupts depends on the kind
> >> of guest.
> >> 
> > I think I used the wrong terminology not distinguishing between the
> > hypervisor and dom0 so I will ask again just to make sure. Is the
> > hypervisor involved in passing the interrupts?
> 
> Yes, of course. The hypervisor receives all physical interrupts.
> 
> > Does it depend on whether the guest is paravirtualized or not?
> 
> Yes, at least to some degree.
> 
> > The guest I am using is
> > paravirtualized (i.e uses xen hypercalls), so does it mean that it
> > uses event channels or is there a possibilty that it does not use
> > event channels.
> 
> Yes and no: PV guests can receive interrupts only via the event
> channel mechanism.

While an HVM guest can receive interrupts via any of:
      * Emulated interrupt injection (i.e. from the emulated APIC)
      * Event channels, injected via the INTx interrupt on the PCI
        platform device (itself injected by the previous option)
      * Event channels, injected directly to a vector.

The first is available to any HVM guest, the middle one is the older
style PV Driver for HVM guest mechanism while the third is an additional
feature of more recent Linux kernels using the PVHVM mechanism.

Ian.


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 02:59:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 02:59:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBOGF-0005nK-Ii; Wed, 05 Oct 2011 02:59:35 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBOE2-0005Zy-P7
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 02:57:19 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1317808635!20980054!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6333 invoked from network); 5 Oct 2011 09:57:15 -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;
	5 Oct 2011 09:57:15 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312156800"; 
   d="scan'208";a="8221157"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 09:56: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, 5 Oct 2011
	10:56:48 +0100
Subject: Re: [Xen-devel] Help with test_and_clear_bit on events
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
Date: Wed, 5 Oct 2011 10:56:48 +0100
In-Reply-To: <CAP2B859GBD+Ps8p=_wBzjU=TB74Di=D1uxrOtfjnEmh7fA0WFw@mail.gmail.com>
References: <CAP2B85_LhqE9F53FAJ3ez3+GDichDTcWiau=x2zdftqGdcADag@mail.gmail.com>
	<1317726163.21903.113.camel@zakaz.uk.xensource.com>
	<1317734390.21903.135.camel@zakaz.uk.xensource.com>
	<1317737477.21903.148.camel@zakaz.uk.xensource.com>
	<CAP2B859GBD+Ps8p=_wBzjU=TB74Di=D1uxrOtfjnEmh7fA0WFw@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: <1317808608.21903.194.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 Wed, 2011-10-05 at 10:27 +0100, Daniel Castro wrote:
> On Tue, Oct 4, 2011 at 11:11 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Tue, 2011-10-04 at 14:19 +0100, Ian Campbell wrote:
> >
> > Two more bugs:
> >
> > A domid is 16 bits not 64, see struct xen_add_to_physmap. So the
> > structure passed to the hypercall doesn't line up and you don't really
> > end up with the shared info in the right place.
> >
> > Secondly in:
> >
> >        int wait = test_and_clear_bit(event, shinfo->evtchn_pending);
> >        int ret = 1;
> >        while (!wait || ret){
> >                ret = hypercall_sched_op(SCHEDOP_poll, &poll);
> >                wait = test_and_clear_bit(event, shinfo->evtchn_pending);
> >        }
> >
> > This will always go through the loop at least once, even if wait is
> > already true because ret == 1. But if wait was already one then you have
> > cleared the bit so wait will then become 0 on the first time through the
> > loop and since you won't get any more events you get stuck in the loop.
> > I think you meant && !ret or something, but really you should be doing
> > BUG on !ret.
> >
> > With all those fixed things seem to work for me. I do
> > xenstore-write /local/domain/$(xl domid dHVM-1)/device/vbd/768/test foo
> > twice to get through the test code and it continues on to boot the
> > guest.
> 
> Thank you Ian, it works flawlessly... Sorry about the bug. Github repo
> is up to date.
> With this, do you consider that any other xenbus functionality should
> be added? It can read, write, directory and watch. Maybe, unwatch?

Now that you have the basic infrastructure working I think you can just
add what you need as you need it.

I suspect you won't actually need watch/unwatch since you can just poll
the node.

> Shall I continue with the blk rings?

Yeah!

> 
> >
> > My patch (with debug and hacks included) is below.
> >
> > Ian.
> >
> > diff --git a/src/xen-xs.c b/src/xen-xs.c
> > index 9f583f9..4c208d4 100644
> > --- a/src/xen-xs.c
> > +++ b/src/xen-xs.c
> > @@ -126,14 +126,21 @@ static void ring_wait(void)
> >        memset(&poll, 0, sizeof(poll));
> >        set_xen_guest_handle(poll.ports, &event);
> >        poll.nr_ports = 1;
> > -       dprintf(1,"evtchn_pending 0x%p , 0x%lx at event %d \n",shinfo->evtchn_pending,shinfo->evtchn_pending[event],event);
> > +       dprintf(1, "shared info %p\n", shinfo);
> > +       dprintf(1,"evtchn_pending %p , 0x%lx at event %d \n",shinfo->evtchn_pending,shinfo->evtchn_pending[0],event);
> > +       while ( !test_and_clear_bit(event, shinfo->evtchn_pending) )
> > +               hypercall_sched_op(SCHEDOP_poll, &poll);
> > +
> > +#if 0
> >        int wait = test_and_clear_bit(event, shinfo->evtchn_pending);
> > -       int ret = 1;
> > +       int ret = 0;
> > +       dprintf(1,"DEBUG bit clear is %d and ret %d\n",wait,ret);
> >        while (!wait || ret){
> >                ret = hypercall_sched_op(SCHEDOP_poll, &poll);
> >                wait = test_and_clear_bit(event, shinfo->evtchn_pending);
> >                dprintf(1,"DEBUG bit clear is %d and ret %d\n",wait,ret);
> >        }
> > +#endif
> >  }
> >
> >  static void ring_wait2(void)
> > diff --git a/src/xen.c b/src/xen.c
> > index e8469b0..312c206 100644
> > --- a/src/xen.c
> > +++ b/src/xen.c
> > @@ -154,11 +154,20 @@ struct shared_info *get_shared_info(void)
> >     xatp.domid = DOMID_SELF;
> >     xatp.space = XENMAPSPACE_shared_info;
> >     xatp.idx   = 0;
> > -    shared_info = malloc_high(sizeof(shared_info));
> > -    xatp.gpfn  = ((unsigned long)shared_info << PAGE_SHIFT);
> > +    shared_info = memalign_high(PAGE_SIZE, PAGE_SIZE);
> 
> Here was my big mistake...
> 
> > +    memset(shared_info, 0, PAGE_SIZE);
> > +    xatp.gpfn  = ((unsigned long)shared_info >> PAGE_SHIFT);
> > +    dprintf(1, "allocated shared info %d bytes at %p, gpfn 0x%lx\n",
> > +           sizeof(*shared_info), shared_info, xatp.gpfn);
> >     //xatp.gpfn  = malloc_high(sizeof(shared_info));
> >     //shared_info = (struct shared_info *)(xatp.gpfn << PAGE_SHIFT);
> >     if (hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0)
> >         panic("MAP info page fail");
> > +    dprintf(1, "time is %d\n", shared_info->wc_sec);
> > +    dprintf(1, "evtchn_pending[0] 0x%08lx\n", shared_info->evtchn_pending[0]);
> > +    dprintf(1, "evtchn_mask[0] 0x%08lx\n", shared_info->evtchn_mask[0]);
> > +    dprintf(1, "VCPU0 evtchn_upcall_pending 0x%x\n", shared_info->vcpu_info[0].evtchn_upcall_pending);
> > +    dprintf(1, "VCPU0 evtchn_upcall_mask 0x%x\n", shared_info->vcpu_info[0].evtchn_upcall_mask);
> > +    dprintf(1, "VCPU0 evtchn_pending_sel 0x%08lx\n", shared_info->vcpu_info[0].evtchn_pending_sel);
> >     return shared_info;
> >  }
> > diff --git a/src/xen.h b/src/xen.h
> > index 1317af9..d838a7c 100644
> > --- a/src/xen.h
> > +++ b/src/xen.h
> > @@ -480,7 +480,7 @@ static struct xsd_errors __attribute__ ((unused)) xsd_errors[]
> >  #define XENMEM_add_to_physmap      7
> >  struct xen_add_to_physmap {
> >     /* Which domain to change the mapping for. */
> > -    u64 domid;
> > +    u16 domid;
> >
> >     /* Source mapping space. */
> >  #define XENMAPSPACE_shared_info 0 /* shared info page */
> > @@ -503,7 +503,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_add_to_physmap_t);
> >  /*
> >  * Wrappers for hypercalls
> >  */
> > -static int hypercall_xen_version( int cmd, void *arg)
> > +static inline int hypercall_xen_version( int cmd, void *arg)
> >  {
> >        return _hypercall2(int, xen_version, cmd, arg);
> >  }
> > @@ -520,7 +520,7 @@ static inline int hypercall_event_channel_op(int cmd, void *arg)
> >
> >  static inline int hypercall_memory_op(int cmd ,void *arg)
> >  {
> > -       return _hypercall2(int, memory_op, cmd ,arg);
> > +       return _hypercall2(int, memory_op, cmd, arg);
> >  }
> >
> >  static inline int hypercall_sched_op(int cmd, void *arg)
> >
> >
> >
> 
> 
> 



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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 03:19:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 03:19:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBOZl-0006Su-01; Wed, 05 Oct 2011 03:19:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBOYs-0006FX-6C
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 03:18:50 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1317809899!51458377!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26139 invoked from network); 5 Oct 2011 10:18:20 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 10:18:20 -0000
Received: by pzk34 with SMTP id 34so3828818pzk.8
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 03:18:44 -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=CMmW7qSSpUXoz461wloCAk8PwprkpdI22ging8AuoyI=;
	b=rzRKHRKG9hwm1SL51iLWmlOSn97sMektcmdBtD9iuKPX2M1yeZ7zYtalkSCMOhZYqB
	frPPxeuwKRjohYeK0x8n5eCJWb2EvhLc2uwKs4Zp/2ycJz9q+FDqUP4wa8Jo2vTjxNkw
	EkwnRRR4Q0hXatWKyOwU1FEEQ4theizZVy/E8=
MIME-Version: 1.0
Received: by 10.68.36.232 with SMTP id t8mr17532153pbj.54.1317809924598; Wed,
	05 Oct 2011 03:18:44 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Wed, 5 Oct 2011 03:18:44 -0700 (PDT)
In-Reply-To: <1317807208.21903.185.camel@zakaz.uk.xensource.com>
References: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
	<1317749511.24742.2.camel@dagon.hellion.org.uk>
	<CAPLaKK7rMSy+xn4twbuEUiLsxgv-JRRBYAwFaDuwRgBvisjk8g@mail.gmail.com>
	<1317801530.21903.163.camel@zakaz.uk.xensource.com>
	<CAPLaKK4Pf34THUrGK-msxkgox6cO8EaSpwhvZS+Xw13tYEwzDw@mail.gmail.com>
	<1317807208.21903.185.camel@zakaz.uk.xensource.com>
Date: Wed, 5 Oct 2011 12:18:44 +0200
X-Google-Sender-Auth: vfwuvLPHINf0QnH9SWU6mLidjbs
Message-ID: <CAPLaKK4k8Nng6zud-ibcBMuyKn-UPdEw11+LMqDMi62nJqn58g@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
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

> Either that or follow up to the original with the correct details for
> the author.
>
> BTW, by adding your Signed-off-by you are certifying the contribution
> per the Developer's Certificate of Origin
> (http://lwn.net/Articles/437739/) which certifies that the contribution
> can be submitted by you under the relevant open source license.
>
> This particular patch is probably too trivial to be an issue but in
> general you would strictly speaking need a signed-off-by from the
> original author, unless you happen to work for the same institution and
> have right to contribute the works of others within that organisation.

Sorry, I think I don't get this right, I'm the original author of this
patch, the two links I've posted contain other different patches, that
should not be added to Xen, because this patch fixes the issue using a
different approach, so I think it's fine to include my signed-off-by.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 03:24:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 03: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 1RBOeO-00074i-Qx; Wed, 05 Oct 2011 03:24:32 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBOdV-0006s8-2h
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 03:23:37 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1317810213!18210500!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12620 invoked from network); 5 Oct 2011 10:23:34 -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;
	5 Oct 2011 10:23:34 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312156800"; 
   d="scan'208";a="8221844"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 10:23:33 +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, 5 Oct 2011
	11:23:33 +0100
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 5 Oct 2011 11:23:33 +0100
In-Reply-To: <CAPLaKK4k8Nng6zud-ibcBMuyKn-UPdEw11+LMqDMi62nJqn58g@mail.gmail.com>
References: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
	<1317749511.24742.2.camel@dagon.hellion.org.uk>
	<CAPLaKK7rMSy+xn4twbuEUiLsxgv-JRRBYAwFaDuwRgBvisjk8g@mail.gmail.com>
	<1317801530.21903.163.camel@zakaz.uk.xensource.com>
	<CAPLaKK4Pf34THUrGK-msxkgox6cO8EaSpwhvZS+Xw13tYEwzDw@mail.gmail.com>
	<1317807208.21903.185.camel@zakaz.uk.xensource.com>
	<CAPLaKK4k8Nng6zud-ibcBMuyKn-UPdEw11+LMqDMi62nJqn58g@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317810213.21903.201.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 Wed, 2011-10-05 at 11:18 +0100, Roger Pau MonnÃ© wrote:
> > Either that or follow up to the original with the correct details for
> > the author.
> >
> > BTW, by adding your Signed-off-by you are certifying the contribution
> > per the Developer's Certificate of Origin
> > (http://lwn.net/Articles/437739/) which certifies that the contribution
> > can be submitted by you under the relevant open source license.
> >
> > This particular patch is probably too trivial to be an issue but in
> > general you would strictly speaking need a signed-off-by from the
> > original author, unless you happen to work for the same institution and
> > have right to contribute the works of others within that organisation.
> 
> Sorry, I think I don't get this right, I'm the original author of this
> patch, the two links I've posted contain other different patches, that
> should not be added to Xen, because this patch fixes the issue using a
> different approach, so I think it's fine to include my signed-off-by.

Ah, that's OK then. I thought the original author was this "Charlie
Root" guy/pseudonym, but I suppose that's actually you and/or an
artefact of your local git repo/git send-email.

Ian.



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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 03:27:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 03:27:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBOhd-000897-EQ; Wed, 05 Oct 2011 03:27:53 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBOeF-00071l-LP
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 03:24:24 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1317810259!27968211!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5245 invoked from network); 5 Oct 2011 10:24:20 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 10:24:20 -0000
Received: by iaqq3 with SMTP id q3so1439701iaq.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 03:24: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:date
	:x-google-sender-auth:message-id:subject:from:to:cc:content-type;
	bh=0emxnkwwZ+O9LBFyuJxy+qS/js2+wPnNLJ2C6oywG2g=;
	b=EQ90ndvDSv6T5AigknDYqJr8uxkMvPQRrA0iDQKQ6hAbUc1G+idF0KVAwqp0QzgLEe
	Kl11Oft36yMLNSxdufHgNxfovcQ07lKZAPgmXFSGNKT8XtglhN3jiG6imxr6foJRsEuy
	CgD6WeE5f2np2Ko54oYCTZ2AflgODfMrbfhQQ=
MIME-Version: 1.0
Received: by 10.231.74.21 with SMTP id s21mr3954905ibj.84.1317810258631; Wed,
	05 Oct 2011 03:24:18 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Wed, 5 Oct 2011 03:24:18 -0700 (PDT)
In-Reply-To: <4E8BE083.3080000@gmail.com>
References: <4E8BE083.3080000@gmail.com>
Date: Wed, 5 Oct 2011 11:24:18 +0100
X-Google-Sender-Auth: efDFahcypyoXtIRRY0IPNipiSRo
Message-ID: <CAFLBxZac-6oHaKdeO_kYJ1Y0Fns9xWTt5tyd1BBx0DpvFPk1Dw@mail.gmail.com>
Subject: Re: [Xen-devel] cap and reservation functionality in the credit2
	scheduler?
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Eunbyung Park <silverbottlep@gmail.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

2011/10/5 Eunbyung Park <silverbottlep@gmail.com>:
> As far as I know, from the up-to-date xen-unstable, the credit2
> scheduler lacks the functionalities of cap and reservation.
>
> Is there any on-going work for this?
>
> I would really expect the functions to come into us. :)

Unfortuantely not -- the credit2 work has been stalled for lack of resources.

> >From my humble point of view, probably additional timer may be required
> to implement them because there isn't any periodic timer in the credit2
> unlike the previous credit scheduler.
>
> what do you think about it?

I'm not opposed in principle, but until I've seen the whole algorithm,
I can't really comment. :-)  Do you have an algorithm in mind?

Unfortunately, I never got around to solving that part.  I was focused
on getting a clean, simple, mostly predictable algorithm to handle
weights.  The algorithm itself may therefore need some tweaking to
make cap / reservation possible.

 -George

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 03:29:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 03:29:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBOjF-00005S-6J; Wed, 05 Oct 2011 03:29:33 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBOik-0008Ka-TH
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 03:29:03 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1317810500!62883560!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30012 invoked from network); 5 Oct 2011 10:28:21 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 10:28:21 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="165763912"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 06:28:58 -0400
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; Wed, 5 Oct 2011 06:28:57 -0400
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
	p95ASrWJ019255;	Wed, 5 Oct 2011 03:28:56 -0700
From: Ian Campbell <ian.campbell@citrix.com>
To: netdev@vger.kernel.org
Date: Wed, 5 Oct 2011 11:28:47 +0100
Message-ID: <1317810532-24984-3-git-send-email-ian.campbell@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317810511.21903.204.camel@zakaz.uk.xensource.com>
References: <1317810511.21903.204.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: xen-devel@lists.xensource.com,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ian Campbell <ian.campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 3/8] xen: netfront: convert to SKB paged frag
	API.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Ian Campbell <ian.campbell@citrix.com>
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: xen-devel@lists.xensource.com
Cc: netdev@vger.kernel.org
---
 drivers/net/xen-netfront.c |   34 +++++++++++++++++++---------------
 1 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index d7c8a98..6e5d4c0 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -275,7 +275,7 @@ no_skb:
 			break;
 		}
 
-		skb_shinfo(skb)->frags[0].page = page;
+		__skb_fill_page_desc(skb, 0, page, 0, 0);
 		skb_shinfo(skb)->nr_frags = 1;
 		__skb_queue_tail(&np->rx_batch, skb);
 	}
@@ -309,8 +309,8 @@ no_skb:
 		BUG_ON((signed short)ref < 0);
 		np->grant_rx_ref[id] = ref;
 
-		pfn = page_to_pfn(skb_shinfo(skb)->frags[0].page);
-		vaddr = page_address(skb_shinfo(skb)->frags[0].page);
+		pfn = page_to_pfn(skb_frag_page(&skb_shinfo(skb)->frags[0]));
+		vaddr = page_address(skb_frag_page(&skb_shinfo(skb)->frags[0]));
 
 		req = RING_GET_REQUEST(&np->rx, req_prod + i);
 		gnttab_grant_foreign_access_ref(ref,
@@ -461,7 +461,7 @@ static void xennet_make_frags(struct sk_buff *skb, struct net_device *dev,
 		ref = gnttab_claim_grant_reference(&np->gref_tx_head);
 		BUG_ON((signed short)ref < 0);
 
-		mfn = pfn_to_mfn(page_to_pfn(frag->page));
+		mfn = pfn_to_mfn(page_to_pfn(skb_frag_page(frag)));
 		gnttab_grant_foreign_access_ref(ref, np->xbdev->otherend_id,
 						mfn, GNTMAP_readonly);
 
@@ -762,23 +762,22 @@ static RING_IDX xennet_fill_frags(struct netfront_info *np,
 	struct skb_shared_info *shinfo = skb_shinfo(skb);
 	int nr_frags = shinfo->nr_frags;
 	RING_IDX cons = np->rx.rsp_cons;
-	skb_frag_t *frag = shinfo->frags + nr_frags;
 	struct sk_buff *nskb;
 
 	while ((nskb = __skb_dequeue(list))) {
 		struct xen_netif_rx_response *rx =
 			RING_GET_RESPONSE(&np->rx, ++cons);
+		skb_frag_t *nfrag = &skb_shinfo(nskb)->frags[0];
 
-		frag->page = skb_shinfo(nskb)->frags[0].page;
-		frag->page_offset = rx->offset;
-		frag->size = rx->status;
+		__skb_fill_page_desc(skb, nr_frags,
+				     skb_frag_page(nfrag),
+				     rx->offset, rx->status);
 
 		skb->data_len += rx->status;
 
 		skb_shinfo(nskb)->nr_frags = 0;
 		kfree_skb(nskb);
 
-		frag++;
 		nr_frags++;
 	}
 
@@ -873,7 +872,7 @@ static int handle_incoming_queue(struct net_device *dev,
 		memcpy(skb->data, vaddr + offset,
 		       skb_headlen(skb));
 
-		if (page != skb_shinfo(skb)->frags[0].page)
+		if (page != skb_frag_page(&skb_shinfo(skb)->frags[0]))
 			__free_page(page);
 
 		/* Ethernet work: Delayed to here as it peeks the header. */
@@ -954,7 +953,8 @@ err:
 			}
 		}
 
-		NETFRONT_SKB_CB(skb)->page = skb_shinfo(skb)->frags[0].page;
+		NETFRONT_SKB_CB(skb)->page =
+			skb_frag_page(&skb_shinfo(skb)->frags[0]);
 		NETFRONT_SKB_CB(skb)->offset = rx->offset;
 
 		len = rx->status;
@@ -968,7 +968,7 @@ err:
 			skb_shinfo(skb)->frags[0].size = rx->status - len;
 			skb->data_len = rx->status - len;
 		} else {
-			skb_shinfo(skb)->frags[0].page = NULL;
+			__skb_fill_page_desc(skb, 0, NULL, 0, 0);
 			skb_shinfo(skb)->nr_frags = 0;
 		}
 
@@ -1143,7 +1143,8 @@ static void xennet_release_rx_bufs(struct netfront_info *np)
 
 		if (!xen_feature(XENFEAT_auto_translated_physmap)) {
 			/* Remap the page. */
-			struct page *page = skb_shinfo(skb)->frags[0].page;
+			const struct page *page =
+				skb_frag_page(&skb_shinfo(skb)->frags[0]);
 			unsigned long pfn = page_to_pfn(page);
 			void *vaddr = page_address(page);
 
@@ -1650,6 +1651,8 @@ static int xennet_connect(struct net_device *dev)
 
 	/* Step 2: Rebuild the RX buffer freelist and the RX ring itself. */
 	for (requeue_idx = 0, i = 0; i < NET_RX_RING_SIZE; i++) {
+		skb_frag_t *frag;
+		const struct page *page;
 		if (!np->rx_skbs[i])
 			continue;
 
@@ -1657,10 +1660,11 @@ static int xennet_connect(struct net_device *dev)
 		ref = np->grant_rx_ref[requeue_idx] = xennet_get_rx_ref(np, i);
 		req = RING_GET_REQUEST(&np->rx, requeue_idx);
 
+		frag = &skb_shinfo(skb)->frags[0];
+		page = skb_frag_page(frag);
 		gnttab_grant_foreign_access_ref(
 			ref, np->xbdev->otherend_id,
-			pfn_to_mfn(page_to_pfn(skb_shinfo(skb)->
-					       frags->page)),
+			pfn_to_mfn(page_to_pfn(page)),
 			0);
 		req->gref = ref;
 		req->id   = requeue_idx;
-- 
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 Wed Oct 05 03:32:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 03:32:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBOm5-0001BF-7b; Wed, 05 Oct 2011 03:32:29 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBOiq-0008Lv-U1
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 03:29:09 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1317810512!57511930!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4730 invoked from network); 5 Oct 2011 10:28:33 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 10:28:33 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312171200"; d="scan'208";a="17956667"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 06:28:56 -0400
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; Wed, 5 Oct 2011 06:28:56 -0400
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
	p95ASrWI019255;	Wed, 5 Oct 2011 03:28:55 -0700
From: Ian Campbell <ian.campbell@citrix.com>
To: netdev@vger.kernel.org
Date: Wed, 5 Oct 2011 11:28:46 +0100
Message-ID: <1317810532-24984-2-git-send-email-ian.campbell@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317810511.21903.204.camel@zakaz.uk.xensource.com>
References: <1317810511.21903.204.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: xen-devel@lists.xensource.com, Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 2/8] xen: netback: convert to SKB paged frag API.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

netback currently uses frag->page to store a temporary index reference while
processing incoming requests. Since frag->page is to become opaque switch
instead to using page_offset. Add a wrapper to tidy this up and propagate the
fact that the indexes are only u16 through the code (this was already true in
practice but unsigned long and in were inconsistently used as variable and
parameter types)

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Cc: Ian Campbell <ian.campbell@citrix.com>
Cc: xen-devel@lists.xensource.com
Cc: netdev@vger.kernel.org
---
 drivers/net/xen-netback/netback.c |   54 ++++++++++++++++++++++--------------
 1 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index fd00f25..8d70b44 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -60,6 +60,9 @@ struct netbk_rx_meta {
 
 #define MAX_PENDING_REQS 256
 
+/* Discriminate from any valid pending_idx value. */
+#define INVALID_PENDING_IDX 0xFFFF
+
 #define MAX_BUFFER_OFFSET PAGE_SIZE
 
 /* extra field used in struct page */
@@ -155,13 +158,13 @@ static struct xen_netif_rx_response *make_rx_response(struct xenvif *vif,
 					     u16      flags);
 
 static inline unsigned long idx_to_pfn(struct xen_netbk *netbk,
-				       unsigned int idx)
+				       u16 idx)
 {
 	return page_to_pfn(netbk->mmap_pages[idx]);
 }
 
 static inline unsigned long idx_to_kaddr(struct xen_netbk *netbk,
-					 unsigned int idx)
+					 u16 idx)
 {
 	return (unsigned long)pfn_to_kaddr(idx_to_pfn(netbk, idx));
 }
@@ -215,6 +218,16 @@ static int get_page_ext(struct page *pg,
 			 sizeof(struct iphdr) + MAX_IPOPTLEN + \
 			 sizeof(struct tcphdr) + MAX_TCP_OPTION_SPACE)
 
+static u16 frag_get_pending_idx(skb_frag_t *frag)
+{
+	return (u16)frag->page_offset;
+}
+
+static void frag_set_pending_idx(skb_frag_t *frag, u16 pending_idx)
+{
+	frag->page_offset = pending_idx;
+}
+
 static inline pending_ring_idx_t pending_index(unsigned i)
 {
 	return i & (MAX_PENDING_REQS-1);
@@ -512,7 +525,7 @@ static int netbk_gop_skb(struct sk_buff *skb,
 
 	for (i = 0; i < nr_frags; i++) {
 		netbk_gop_frag_copy(vif, skb, npo,
-				    skb_shinfo(skb)->frags[i].page,
+				    skb_frag_page(&skb_shinfo(skb)->frags[i]),
 				    skb_shinfo(skb)->frags[i].size,
 				    skb_shinfo(skb)->frags[i].page_offset,
 				    &head);
@@ -890,7 +903,7 @@ static int netbk_count_requests(struct xenvif *vif,
 
 static struct page *xen_netbk_alloc_page(struct xen_netbk *netbk,
 					 struct sk_buff *skb,
-					 unsigned long pending_idx)
+					 u16 pending_idx)
 {
 	struct page *page;
 	page = alloc_page(GFP_KERNEL|__GFP_COLD);
@@ -909,11 +922,11 @@ static struct gnttab_copy *xen_netbk_get_requests(struct xen_netbk *netbk,
 {
 	struct skb_shared_info *shinfo = skb_shinfo(skb);
 	skb_frag_t *frags = shinfo->frags;
-	unsigned long pending_idx = *((u16 *)skb->data);
+	u16 pending_idx = *((u16 *)skb->data);
 	int i, start;
 
 	/* Skip first skb fragment if it is on same page as header fragment. */
-	start = ((unsigned long)shinfo->frags[0].page == pending_idx);
+	start = (frag_get_pending_idx(&shinfo->frags[0]) == pending_idx);
 
 	for (i = start; i < shinfo->nr_frags; i++, txp++) {
 		struct page *page;
@@ -945,7 +958,7 @@ static struct gnttab_copy *xen_netbk_get_requests(struct xen_netbk *netbk,
 		memcpy(&pending_tx_info[pending_idx].req, txp, sizeof(*txp));
 		xenvif_get(vif);
 		pending_tx_info[pending_idx].vif = vif;
-		frags[i].page = (void *)pending_idx;
+		frag_set_pending_idx(&frags[i], pending_idx);
 	}
 
 	return gop;
@@ -956,7 +969,7 @@ static int xen_netbk_tx_check_gop(struct xen_netbk *netbk,
 				  struct gnttab_copy **gopp)
 {
 	struct gnttab_copy *gop = *gopp;
-	int pending_idx = *((u16 *)skb->data);
+	u16 pending_idx = *((u16 *)skb->data);
 	struct pending_tx_info *pending_tx_info = netbk->pending_tx_info;
 	struct xenvif *vif = pending_tx_info[pending_idx].vif;
 	struct xen_netif_tx_request *txp;
@@ -976,13 +989,13 @@ static int xen_netbk_tx_check_gop(struct xen_netbk *netbk,
 	}
 
 	/* Skip first skb fragment if it is on same page as header fragment. */
-	start = ((unsigned long)shinfo->frags[0].page == pending_idx);
+	start = (frag_get_pending_idx(&shinfo->frags[0]) == pending_idx);
 
 	for (i = start; i < nr_frags; i++) {
 		int j, newerr;
 		pending_ring_idx_t index;
 
-		pending_idx = (unsigned long)shinfo->frags[i].page;
+		pending_idx = frag_get_pending_idx(&shinfo->frags[i]);
 
 		/* Check error status: if okay then remember grant handle. */
 		newerr = (++gop)->status;
@@ -1008,7 +1021,7 @@ static int xen_netbk_tx_check_gop(struct xen_netbk *netbk,
 		pending_idx = *((u16 *)skb->data);
 		xen_netbk_idx_release(netbk, pending_idx);
 		for (j = start; j < i; j++) {
-			pending_idx = (unsigned long)shinfo->frags[i].page;
+			pending_idx = frag_get_pending_idx(&shinfo->frags[i]);
 			xen_netbk_idx_release(netbk, pending_idx);
 		}
 
@@ -1029,15 +1042,14 @@ static void xen_netbk_fill_frags(struct xen_netbk *netbk, struct sk_buff *skb)
 	for (i = 0; i < nr_frags; i++) {
 		skb_frag_t *frag = shinfo->frags + i;
 		struct xen_netif_tx_request *txp;
-		unsigned long pending_idx;
+		struct page *page;
+		u16 pending_idx;
 
-		pending_idx = (unsigned long)frag->page;
+		pending_idx = frag_get_pending_idx(frag);
 
 		txp = &netbk->pending_tx_info[pending_idx].req;
-		frag->page = virt_to_page(idx_to_kaddr(netbk, pending_idx));
-		frag->size = txp->size;
-		frag->page_offset = txp->offset;
-
+		page = virt_to_page(idx_to_kaddr(netbk, pending_idx));
+		__skb_fill_page_desc(skb, i, page, txp->offset, txp->size);
 		skb->len += txp->size;
 		skb->data_len += txp->size;
 		skb->truesize += txp->size;
@@ -1349,11 +1361,11 @@ static unsigned xen_netbk_tx_build_gops(struct xen_netbk *netbk)
 		skb_shinfo(skb)->nr_frags = ret;
 		if (data_len < txreq.size) {
 			skb_shinfo(skb)->nr_frags++;
-			skb_shinfo(skb)->frags[0].page =
-				(void *)(unsigned long)pending_idx;
+			frag_set_pending_idx(&skb_shinfo(skb)->frags[0],
+					     pending_idx);
 		} else {
-			/* Discriminate from any valid pending_idx value. */
-			skb_shinfo(skb)->frags[0].page = (void *)~0UL;
+			frag_set_pending_idx(&skb_shinfo(skb)->frags[0],
+					     INVALID_PENDING_IDX);
 		}
 
 		__skb_queue_tail(&netbk->tx_queue, skb);
-- 
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 Wed Oct 05 03:33:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 03: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 1RBOn7-0001a5-Oo; Wed, 05 Oct 2011 03:33:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBOj3-0008Qp-8A
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 03:29:21 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1317810531!40509221!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4193 invoked from network); 5 Oct 2011 10:28:52 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 10:28:52 -0000
Received: by ggnk4 with SMTP id k4so1346217ggn.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 03:29: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;
	bh=FludUmU7E3+++KJDe++qT7Q0ImM4+A4WAW5MGNXjv0c=;
	b=Hr1Bf688qu+egmDVzut8xKJqaeQwSM+fT4hFKIoSoDIueG4pmImySQ40Bz0UEYSq+l
	xMXrDP8uUCef/ieywTBP5ldcClWS1+MV0TDpWj4wsLFv+Bkxvw4i6EwktaerPkrReErz
	K1S9IEdblbjJoOxrFh8/Zmd8+YhTwTRQ41EwY=
MIME-Version: 1.0
Received: by 10.68.33.130 with SMTP id r2mr16229391pbi.71.1317810556551; Wed,
	05 Oct 2011 03:29:16 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Wed, 5 Oct 2011 03:29:16 -0700 (PDT)
In-Reply-To: <1317810213.21903.201.camel@zakaz.uk.xensource.com>
References: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
	<1317749511.24742.2.camel@dagon.hellion.org.uk>
	<CAPLaKK7rMSy+xn4twbuEUiLsxgv-JRRBYAwFaDuwRgBvisjk8g@mail.gmail.com>
	<1317801530.21903.163.camel@zakaz.uk.xensource.com>
	<CAPLaKK4Pf34THUrGK-msxkgox6cO8EaSpwhvZS+Xw13tYEwzDw@mail.gmail.com>
	<1317807208.21903.185.camel@zakaz.uk.xensource.com>
	<CAPLaKK4k8Nng6zud-ibcBMuyKn-UPdEw11+LMqDMi62nJqn58g@mail.gmail.com>
	<1317810213.21903.201.camel@zakaz.uk.xensource.com>
Date: Wed, 5 Oct 2011 12:29:16 +0200
X-Google-Sender-Auth: XsR9nyaqkpj-ebBhC3vNqXjapss
Message-ID: <CAPLaKK45u9Z6u7K5-70Do9rVG5-QpeszsF+3V0kvfFEe0ESMKw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
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

> Ah, that's OK then. I thought the original author was this "Charlie
> Root" guy/pseudonym, but I suppose that's actually you and/or an
> artefact of your local git repo/git send-email.

Sorry for the trouble, that is a problem with git, that doesn't get
the name and email attributes right when using "git format-patch", I
think that it used the default name of the root account, which is
"Charlie", hence the "Charlie Root" name, at the end I had to remove
the "From" fields manually, because I wasn't able to generate a patch
with the proper "From" field.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 03:34:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 03:34:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBOo5-0001xk-2E; Wed, 05 Oct 2011 03:34:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBOlu-00016g-NQ
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 03:32:19 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1317810715!43108162!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15598 invoked from network); 5 Oct 2011 10:31:55 -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;
	5 Oct 2011 10:31:55 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312156800"; 
   d="scan'208";a="8222085"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 10:31:47 +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, 5 Oct 2011
	11:31:47 +0100
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 5 Oct 2011 11:31:46 +0100
In-Reply-To: <CAPLaKK45u9Z6u7K5-70Do9rVG5-QpeszsF+3V0kvfFEe0ESMKw@mail.gmail.com>
References: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
	<1317749511.24742.2.camel@dagon.hellion.org.uk>
	<CAPLaKK7rMSy+xn4twbuEUiLsxgv-JRRBYAwFaDuwRgBvisjk8g@mail.gmail.com>
	<1317801530.21903.163.camel@zakaz.uk.xensource.com>
	<CAPLaKK4Pf34THUrGK-msxkgox6cO8EaSpwhvZS+Xw13tYEwzDw@mail.gmail.com>
	<1317807208.21903.185.camel@zakaz.uk.xensource.com>
	<CAPLaKK4k8Nng6zud-ibcBMuyKn-UPdEw11+LMqDMi62nJqn58g@mail.gmail.com>
	<1317810213.21903.201.camel@zakaz.uk.xensource.com>
	<CAPLaKK45u9Z6u7K5-70Do9rVG5-QpeszsF+3V0kvfFEe0ESMKw@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317810707.21903.206.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 Wed, 2011-10-05 at 11:29 +0100, Roger Pau MonnÃ© wrote:
> > Ah, that's OK then. I thought the original author was this "Charlie
> > Root" guy/pseudonym, but I suppose that's actually you and/or an
> > artefact of your local git repo/git send-email.
> 
> Sorry for the trouble,

No problem.

> that is a problem with git, that doesn't get
> the name and email attributes right when using "git format-patch", I
> think that it used the default name of the root account, which is
> "Charlie", hence the "Charlie Root" name, at the end I had to remove
> the "From" fields manually, because I wasn't able to generate a patch
> with the proper "From" field.

I think the problem was probably actually a "git commit" time when the
Author field in the commit seems to have been set to "Charlie Root".
"git format-patch" just picks up on that and because it is different to
the sender it includes a From line.

You probably need to add a ~/.gitconfig containing e.g.:
[user]
        name = Ian Campbell
        email = ian.campbell@citrix.com
so that "git commit" will pickup the right details and/or avoid
committing stuff as root.

Ian.


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 03:39:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 03:39:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBOsc-0002Xf-Bx; Wed, 05 Oct 2011 03:39:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBOs9-0002JM-Jk
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 03:38:45 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317811097!38564527!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17049 invoked from network); 5 Oct 2011 10:38:19 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 10:38:19 -0000
Received: by pzk34 with SMTP id 34so3861665pzk.8
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 03:38:40 -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=izA+EXRhQvhn5rfh/1QjjI+NIW8fOd+dcqRKciQYY2M=;
	b=F7W27xiY3PtqeFX1J6WBVg2afEAEWeZE/Jt43nDOKTmdYjiT3rMqTNAzIiSuHceffR
	VKJi7GGOaW4HnwQeSdmdw3ZbpKQfMv1nB7kHXi0xgfKvO0GPdMDeVpXsoSi+TWBlomRB
	TsON3NQJgHdF6rq+UWcx0CmjZOCDlbPtzhxrI=
MIME-Version: 1.0
Received: by 10.68.4.170 with SMTP id l10mr17531599pbl.3.1317811120216; Wed,
	05 Oct 2011 03:38:40 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Wed, 5 Oct 2011 03:38:40 -0700 (PDT)
In-Reply-To: <1317810707.21903.206.camel@zakaz.uk.xensource.com>
References: <1317737599-21217-1-git-send-email-roger.pau@entel.upc.edu>
	<1317749511.24742.2.camel@dagon.hellion.org.uk>
	<CAPLaKK7rMSy+xn4twbuEUiLsxgv-JRRBYAwFaDuwRgBvisjk8g@mail.gmail.com>
	<1317801530.21903.163.camel@zakaz.uk.xensource.com>
	<CAPLaKK4Pf34THUrGK-msxkgox6cO8EaSpwhvZS+Xw13tYEwzDw@mail.gmail.com>
	<1317807208.21903.185.camel@zakaz.uk.xensource.com>
	<CAPLaKK4k8Nng6zud-ibcBMuyKn-UPdEw11+LMqDMi62nJqn58g@mail.gmail.com>
	<1317810213.21903.201.camel@zakaz.uk.xensource.com>
	<CAPLaKK45u9Z6u7K5-70Do9rVG5-QpeszsF+3V0kvfFEe0ESMKw@mail.gmail.com>
	<1317810707.21903.206.camel@zakaz.uk.xensource.com>
Date: Wed, 5 Oct 2011 12:38:40 +0200
X-Google-Sender-Auth: e1ofThUZD76LWmjrLUB3d8w5Q1E
Message-ID: <CAPLaKK67uasJp0bkss8kn3yBhdzuu8uhV4moi4wS-=XJxxBv4Q@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Campbell <Ian.Campbell@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 think the problem was probably actually a "git commit" time when the
> Author field in the commit seems to have been set to "Charlie Root".
> "git format-patch" just picks up on that and because it is different to
> the sender it includes a From line.
>
> You probably need to add a ~/.gitconfig containing e.g.:
> [user]
> =C2=A0 =C2=A0 =C2=A0 =C2=A0name =3D Ian Campbell
> =C2=A0 =C2=A0 =C2=A0 =C2=A0email =3D ian.campbell@citrix.com
> so that "git commit" will pickup the right details and/or avoid
> committing stuff as root.

You are right, when doing the commit I still haven't set the name and
email values, I added them after, when doing the format-patch and
email. Well, since they are set now I don't think I will have more
problems, thanks again for the tip!

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 04:10:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 04:10:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBPMQ-0004Vs-2n; Wed, 05 Oct 2011 04:10:02 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBPKN-0004Db-9X
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 04:07:56 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1317812865!51602271!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29842 invoked from network); 5 Oct 2011 11:07:45 -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;
	5 Oct 2011 11:07:45 -0000
X-IronPort-AV: E=Sophos;i="4.68,490,1312156800"; 
   d="scan'208";a="8222849"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 11:07:51 +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, 5 Oct 2011 12:07:50 +0100
Date: Wed, 5 Oct 2011 12:07:44 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1317739882-4809-8-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1110051205310.3519@kaball-desktop>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<1317739882-4809-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: Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH RFC V1 07/11] host-pci-device: Add
 host_pci_find_ext_cap_offset
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 4 Oct 2011, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>

any reason why we shouldn't merge this patch with patch #1?


> ---
>  hw/host-pci-device.c |   31 +++++++++++++++++++++++++++++++
>  hw/host-pci-device.h |    2 ++
>  2 files changed, 33 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/host-pci-device.c b/hw/host-pci-device.c
> index b3f2899..2a889d5 100644
> --- a/hw/host-pci-device.c
> +++ b/hw/host-pci-device.c
> @@ -162,6 +162,37 @@ int host_pci_write_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 = 480;
> +    int pos = 0x100;
> +
> +    do {
> +        header = host_pci_read_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 < 0x100) {
> +            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;
> diff --git a/hw/host-pci-device.h b/hw/host-pci-device.h
> index 0137507..2734eb3 100644
> --- a/hw/host-pci-device.h
> +++ b/hw/host-pci-device.h
> @@ -33,4 +33,6 @@ int host_pci_write_word(HostPCIDevice *d, int pos, uint16_t data);
>  int host_pci_write_long(HostPCIDevice *d, int pos, uint32_t data);
>  int host_pci_write_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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 04:14:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 04:14:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBPQu-0004y8-Fr; Wed, 05 Oct 2011 04:14:40 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBPL7-0004IR-Bl
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 04:08:42 -0700
X-Env-Sender: silverbottlep@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1317812917!21006571!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7321 invoked from network); 5 Oct 2011 11:08:38 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 11:08:38 -0000
Received: by qabg14 with SMTP id g14so1575589qab.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 04:08:37 -0700 (PDT)
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
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=bZ8pOmfCHR/WSMFYZBuf4NWmESRt1cyUFhZa03V7On0=;
	b=M74RWnYMPDM6HrANNKEfeM+mVOCwWZXYfdD9pm6yfZGqS2RcwASmzDOpMefbhfsnUZ
	+MC9SgY9yIt50tHXY60g/Wzw4qIYleARLE/8P2T1aIua8XoO8cpP8srSpRKy5okK4xvb
	N6ASU8VEu6gFxAU//9w9DKFUlgUQCQ0Lpmcq0=
Received: by 10.68.15.70 with SMTP id v6mr17820573pbc.85.1317812916669;
	Wed, 05 Oct 2011 04:08:36 -0700 (PDT)
Received: from [192.168.2.124] ([112.169.222.30])
	by mx.google.com with ESMTPS id d7sm6417669pbn.8.2011.10.05.04.08.34
	(version=SSLv3 cipher=OTHER); Wed, 05 Oct 2011 04:08:35 -0700 (PDT)
Message-ID: <4E8C3AAC.3070206@gmail.com>
Date: Wed, 05 Oct 2011 20:08:28 +0900
From: Eunbyung Park <silverbottlep@gmail.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: George Dunlap <George.Dunlap@eu.citrix.com>
Subject: Re: [Xen-devel] cap and reservation functionality in the credit2
	scheduler?
References: <4E8BE083.3080000@gmail.com>
	<CAFLBxZac-6oHaKdeO_kYJ1Y0Fns9xWTt5tyd1BBx0DpvFPk1Dw@mail.gmail.com>
In-Reply-To: <CAFLBxZac-6oHaKdeO_kYJ1Y0Fns9xWTt5tyd1BBx0DpvFPk1Dw@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
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

2011-10-05 ì˜¤í›„ 7:24, George Dunlap ì“´ ê¸€:
>> > From my humble point of view, probably additional timer may be required
>> to implement them because there isn't any periodic timer in the credit2
>> unlike the previous credit scheduler.
>>
>> what do you think about it?
> I'm not opposed in principle, but until I've seen the whole algorithm,
> I can't really comment. :-)  Do you have an algorithm in mind?
Actually, I don't have any idea in mind yet.
however, I will try to devise a method to support them and make a patch.
So, If you can afford to review, I will appreciate it :)

And, I think that there are still some to-do lists for the credit2 and 
xl tools needs to include credit2 support.

In addition, I found that adjusting dom0 weight have failed to work, but 
except for the dom0, it worked well.
I found that this problem had been on xen-devel lists long time ago, but 
it seems not to be solved yet.
I think this may be related with spinlock. When I remove the 
vcpu_schedule_lock_irq() in csched_dom_cntl(), it worked well.
I'm not sure what is the real problem because I didn't completely 
understand the mechanism about spinlocks in xen scheduler.

Any comments? or new thread needed?

-- 
Best Regards,
Eunbyung Park


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 04:52:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 04:52:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBQ16-0006GO-KQ; Wed, 05 Oct 2011 04:52:04 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBQ0G-00062Q-1I
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 04:51:12 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1317815451!45288844!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25835 invoked from network); 5 Oct 2011 11:50:51 -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;
	5 Oct 2011 11:50:51 -0000
X-IronPort-AV: E=Sophos;i="4.68,491,1312156800"; 
   d="scan'208";a="8223738"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 11:51:08 +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, 5 Oct 2011 12:51:08 +0100
Date: Wed, 5 Oct 2011 12:51:01 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1317739882-4809-9-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1110051208150.3519@kaball-desktop>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<1317739882-4809-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: Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH RFC V1 08/11] 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, 4 Oct 2011, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>

You should set the original author correctly and add his signed-off-by.
Remeber to run the patch through checkpatch.pl.

> ---
>  hw/xen_pci_passthrough.c         |  763 ++++++++++++++++++++++++++++++++++++++
>  hw/xen_pci_passthrough.h         |  335 +++++++++++++++++
>  hw/xen_pci_passthrough_helpers.c |   46 +++
>  3 files changed, 1144 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/hw/xen_pci_passthrough.c b/hw/xen_pci_passthrough.c
> new file mode 100644
> index 0000000..bfbe042
> --- /dev/null
> +++ b/hw/xen_pci_passthrough.c
> @@ -0,0 +1,763 @@
> +#include <sys/ioctl.h>
> +
> +#include "pci.h"
> +#include "xen.h"
> +#include "xen_backend.h"
> +#include "xen_pci_passthrough.h"

it would be nice to keep the comment about PCI-MSI translation we have
in the corresponding source file in qemu-xen


> +#define PCI_BAR_ENTRIES (6)
> +
> +typedef struct PlugDevice {
> +    uint8_t r_bus;
> +    uint8_t r_slot;
> +    uint8_t r_func;
> +    int bus;
> +    int slot;
> +    int func;
> +} PlugDevice;
> +
> +QLIST_HEAD(php_dev_list, PlugDevice) php_dev_list =
> +    QLIST_HEAD_INITIALIZER(php_dev_list);
> +

What is the difference between r_bus,r_slot and r_func and bus, slot and
func? It should be well documented with a comment.
Also do we need both PlugDevice and PHPDev? What is the difference?


> +#define PT_BAR_ALLF             0xFFFFFFFF      /* BAR ALLF value */

already defined in hw/xen_pci_passthrough.h


> +
> +/* #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 untill previous power state transition is completed.
> +         * so finished previous request here.
> +         */
> +        qemu_run_one_timer(s->pm_state->pm_timer);
> +    }

the timer is not acceptable, we should probably remove it and return an
error instead, unless somebody has any better ideas.


> +    /* 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_read_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.
> +         */
> +        qemu_run_one_timer(s->pm_state->pm_timer);
> +    }

same here

> +    /* 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_read_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_write_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) {
> +        /* set QEMUTimer */
> +        qemu_mod_timer(s->pm_state->pm_timer,
> +                       qemu_get_clock_ms(rt_clock) + s->pm_state->pm_delay);
> +    }
> +}

same here

> +
> +/* 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) {
> +        add_msix_mapping(s, i);
> +        /* 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");
> +        }
> +
> +        ret = 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);
> +        }
> +    }
> +}
> +
> +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 */
> +int qemu_pci_register_regions(XenPCIPassthroughState *s)
> +{
> +    /* but no mapping done anymore (see in reset) */
> +    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++) {
> +        if (pt_pci_base_addr(d->base_addr[i])) {
> +            s->bases[i].e_physbase = pt_pci_base_addr(d->base_addr[i]);
> +            s->bases[i].access.u = pt_pci_base_addr(d->base_addr[i]);
> +
> +            /* Register current region */
> +            if (d->base_addr[i] & PCI_BASE_ADDRESS_SPACE_IO) {
> +                memory_region_init_io(&s->bar[i], NULL, NULL,
> +                                      "xen-pci-pt-bar", d->size[i]);
> +                pci_register_bar(&s->dev, i, PCI_BASE_ADDRESS_SPACE_IO,
> +                                 &s->bar[i]);
> +            } else if (d->base_addr[i] & PCI_BASE_ADDRESS_MEM_PREFETCH) {
> +                memory_region_init_io(&s->bar[i], NULL, NULL,
> +                                      "xen-pci-pt-bar", d->size[i]);
> +                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", d->size[i]);
> +                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",
> +                   d->size[i], d->base_addr[i]);
> +        }
> +    }
> +
> +    /* Register expansion ROM address */
> +    if ((d->rom_base_addr & PCI_ROM_ADDRESS_MASK) && d->rom_size) {
> +        /* Re-set BAR reported by OS, otherwise ROM can't be read. */
> +        bar_data = host_pci_read_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_write_long(d, PCI_ROM_ADDRESS, bar_data);
> +        }
> +
> +        s->bases[PCI_ROM_SLOT].e_physbase = d->rom_base_addr & PCI_ROM_ADDRESS_MASK;
> +        s->bases[PCI_ROM_SLOT].access.maddr = d->rom_base_addr & PCI_ROM_ADDRESS_MASK;
> +
> +        // memory_region_init_rom_device
> +        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 pci_parse_host_devaddr(char **str, int *seg, int *bus, int *dev,
> +                                  int *func, char **opt, int *vdevfn)
> +{
> +    char *token;
> +    const char *delim = ":.";
> +
> +    if (!(*str) || (!strchr(*str, ':') && !strchr(*str, '.'))) {
> +        return 0;
> +    }
> +
> +    token  = strsep(str, delim);
> +    *seg = strtoul(token, NULL, 16);
> +
> +    token  = strsep(str, delim);
> +    *bus  = strtoul(token, NULL, 16);
> +
> +    token  = strsep(str, delim);
> +    *dev  = strtoul(token, NULL, 16);
> +
> +    token  = strsep(str, delim);
> +
> +    *opt = strchr(token, '@');
> +    if (*opt) {
> +        *(*opt)++ = '\0';
> +        *vdevfn = strtoul(*opt, NULL, 16);
> +    } else {
> +        *vdevfn = -1; //AUTO_PHP_SLOT;
> +        *opt = token;
> +    }
> +
> +    *opt = strchr(*opt, ',');
> +    if (*opt) {
> +        *(*opt)++ = '\0';
> +    }
> +
> +    *func = strtoul(token, NULL, 16);
> +
> +    return 1;
> +}

all the other functions return 0 on success and a negative number on
error, we should do the same here


> +// TODO add to PlugDevice list php_dev_list;
> +static int pt_initfn(PCIDevice *pci_dev)
> +{
> +    XenPCIPassthroughState *s = DO_UPCAST(XenPCIPassthroughState, dev, pci_dev);
> +    int devfn_ignored = -1;
> +    int dom, bus;
> +    int slot, func;
> +    char *opt;
> +    int rc = 0;
> +    uint32_t machine_irq;
> +
> +    /* todo: use local/stack buf, or better: change pci_parse_host_devaddr */
> +    char *addr = g_strdup(s->hostaddr);
> +
> +    PT_LOG("initialiase passthrough for %s (devfn: %i)\n", addr, s->dev.devfn);
> +
> +    if (pci_parse_host_devaddr(&addr, &dom, &bus, &slot, &func, &opt,
> +                               &devfn_ignored) < 0) {
> +        fprintf(stderr, "erro parse bdf: %s\n", addr);
> +        return -1;
> +    }
> +
> +    s->php_dev.r_bus = bus;
> +    s->php_dev.r_dev = slot;
> +    s->php_dev.r_func = func;
> +
> +    /* register real device */
> +    PT_LOG("Assigning real physical device %02x:%02x.%x ...\n",
> +           bus, slot, func);
> +
> +    s->real_device = host_pci_device_get(bus, slot, func);
> +    if (!s->real_device) {
> +        return -1;
> +    }
> +
> +    s->msi_trans_cap = 1; // default enable, later, read from param (xenstore)
> +    /* s->power_mgmt = power_mgmt; */
> +    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_read_block(s->real_device, 0, pci_dev->config,
> +                            PCI_CONFIG_SPACE_SIZE) == -1) {
> +        return -1;
> +    }
> +
> +    /* Handle real device's MMIO/PIO BARs */
> +    qemu_pci_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");
> +        goto out;
> +    }
> +
> +    /* pt machine irq auto */
> +    {
> +        int pirq = -1;
> +
> +        machine_irq = host_pci_read_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_write_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]++; */
> +        }
> +    }
> +
> +    /* 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);
> +        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_write_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,
> +           s->msi_trans_en ? "MSI-INTx" : "INTx");
> +
> +    return 0;
> +}
> +
> +static PCIDeviceInfo xen_pci_passthrough = {
> +    .init = pt_initfn,
> +    .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_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..10e8189
> --- /dev/null
> +++ b/hw/xen_pci_passthrough.h
> @@ -0,0 +1,335 @@
> +#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 XenPTRegion XenPTRegion;
> +typedef struct XenPTReg XenPTReg;
> +typedef struct XenPTRegInfo XenPTRegInfo;
> +typedef struct XenPTRegGroup XenPTRegGroup;
> +typedef struct XenPTRegGroupInfo XenPTRegGroupInfo;
> +
> +typedef struct XenPCIPassthroughState XenPCIPassthroughState;
> +
> +// fonction type for config reg

function


> +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);
> +
> +struct PHPDev {
> +    /* uint8_t valid; */
> +    uint8_t r_bus;
> +    uint8_t r_dev;
> +    uint8_t r_func;
> +    /* char *opt; */
> +};
> +
> +/* power state transition */
> +#define PT_FLAG_TRANSITING 0x0001
> +
> +#define PT_INVALID_REG          0xFFFFFFFF      /* invalid register value */
> +#define PT_BAR_ALLF             0xFFFFFFFF      /* BAR ALLF value */
> +#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) */
> +
> +/* MSI-X */
> +#define MSI_FLAG_UNINIT 0x1000
> +#define PT_MSI_MAPPED   0x2000
> +
> +#define MSI_DATA_VECTOR_SHIFT          0
> +#define     MSI_DATA_VECTOR(v)         (((u8)v) << MSI_DATA_VECTOR_SHIFT)
> +
> +#define MSI_DATA_DELIVERY_SHIFT        8
> +#define     MSI_DATA_DELIVERY_FIXED    (0 << MSI_DATA_DELIVERY_SHIFT)
> +#define     MSI_DATA_DELIVERY_LOWPRI   (1 << MSI_DATA_DELIVERY_SHIFT)
> +
> +#define MSI_DATA_LEVEL_SHIFT           14
> +#define     MSI_DATA_LEVEL_DEASSERT    (0 << MSI_DATA_LEVEL_SHIFT)
> +#define     MSI_DATA_LEVEL_ASSERT      (1 << MSI_DATA_LEVEL_SHIFT)
> +
> +#define MSI_DATA_TRIGGER_SHIFT         15
> +#define     MSI_DATA_TRIGGER_EDGE      (0 << MSI_DATA_TRIGGER_SHIFT)
> +#define     MSI_DATA_TRIGGER_LEVEL     (1 << MSI_DATA_TRIGGER_SHIFT)

considering that all these MSI defines are general purpose they should
probably be in a general purpose header


> +/*
> + * Shift/mask fields for APIC-based bus address
> + */
> +#define MSI_ADDR_HEADER                0xfee00000
> +#define MSI_TARGET_CPU_SHIFT           12
> +
> +#define MSI_ADDR_DESTID_MASK           0xfff0000f
> +#define   MSI_ADDR_DESTID_CPU(cpu)     ((cpu) << MSI_TARGET_CPU_SHIFT)
> +
> +#define MSI_ADDR_DESTMODE_SHIFT        2
> +#define   MSI_ADDR_DESTMODE_PHYS       (0 << MSI_ADDR_DESTMODE_SHIFT)
> +#define     MSI_ADDR_DESTMODE_LOGIC    (1 << MSI_ADDR_DESTMODE_SHIFT)
> +
> +#define MSI_ADDR_REDIRECTION_SHIFT     3
> +#define   MSI_ADDR_REDIRECTION_CPU     (0 << MSI_ADDR_REDIRECTION_SHIFT)
> +#define   MSI_ADDR_REDIRECTION_LOWPRI  (1 << MSI_ADDR_REDIRECTION_SHIFT)

same as before


> +#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

There seem to be used only be the next patch, it makes sense to move
them there.


> +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;
> +
> +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;
> +};
> +
> +/* emulated register management */
> +struct XenPTReg {
> +    QLIST_ENTRY(XenPTReg) entries;
> +    XenPTRegInfo *reg;
> +    uint32_t data;
> +};
> +
> +/* emul register group management table */
> +struct XenPTRegGroup {
> +    QLIST_ENTRY (XenPTRegGroup) entries;
> +    const XenPTRegGroupInfo *reg_grp;
> +    uint32_t base_offset;
> +    uint8_t size;
> +    QLIST_HEAD(, XenPTReg) reg_tbl_list;
> +};
> +
> +/* 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;
> +};
> +
> +
> +/* 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;
> +};
> +
> +typedef struct pt_msi_info {
> +    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 msix_entry_info {
> +    int pirq;        /* -1 means unmapped */
> +    int flags;       /* flags indicting whether MSI ADDR or DATA is updated */
> +    uint32_t io_mem[4];
> +} XenMSIXEntry;
> +typedef struct pt_msix_info {
> +    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;
> +    struct msix_entry_info msix_entry[0];
> +} XenPTMSIX;
> +
> +typedef struct pt_pm_info {
> +    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;
> +    struct PHPDev php_dev;
> +    bool is_virtfn;
> +    HostPCIDevice *real_device;
> +    XenPTRegion bases[PCI_NUM_REGIONS]; /* Access regions */
> +    QLIST_HEAD(, XenPTRegGroup) reg_grp_tbl;
> +
> +    uint32_t machine_irq;
> +
> +    XenPTMSI *msi;
> +    XenPTMSIX *msix;
> +
> +    /* Physical MSI to guest INTx translation when possible */
> +    int msi_trans_cap;
> +    bool msi_trans_en;
> +
> +    bool power_mgmt;
> +    XenPTPM *pm_state;
> +
> +    MemoryRegion bar[PCI_NUM_REGIONS - 1];
> +    MemoryRegion rom;
> +};
> +
> +void pt_config_init(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);
> +
> +int qemu_pci_register_regions(XenPCIPassthroughState *);
> +
> +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;
> +    }
> +}
> +
> +static inline pcibus_t pt_pci_base_addr(pcibus_t base)
> +{
> +    if (base & PCI_BASE_ADDRESS_SPACE_IO)
> +        return base & PCI_BASE_ADDRESS_IO_MASK;
> +
> +    return base & PCI_BASE_ADDRESS_MEM_MASK;
> +}
> +
> +/* INTx */
> +static inline uint8_t pci_read_intx(XenPCIPassthroughState *s)
> +{
> +    return host_pci_read_byte(s->real_device, PCI_INTERRUPT_PIN);
> +}
> +uint8_t pci_intx(XenPCIPassthroughState *ptdev);
> +
> +/* MSI/MSI-X */
> +void msi_set_enable(XenPCIPassthroughState *dev, int en);
> +int pt_msi_setup(XenPCIPassthroughState *dev);
> +int pt_msi_update(XenPCIPassthroughState *d);
> +void pt_msi_disable(XenPCIPassthroughState *dev);
> +int pt_enable_msi_translate(XenPCIPassthroughState* dev);
> +void pt_disable_msi_translate(XenPCIPassthroughState *dev);
> +
> +int pt_msix_init(XenPCIPassthroughState *dev, int pos);
> +int pt_msix_update(XenPCIPassthroughState *dev);
> +int pt_msix_update_remap(XenPCIPassthroughState *dev, int bar_index);
> +void pt_msix_disable(XenPCIPassthroughState *dev);
> +int add_msix_mapping(XenPCIPassthroughState *s, int bar_index);
> +int remove_msix_mapping(XenPCIPassthroughState *s, int bar_index);

These functions are actually implemented in the next patch, so they
should also be defined there.


> +#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;
> +}
> --
> 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 Oct 05 04:53:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 04:53:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBQ2Z-0006j1-Uz; Wed, 05 Oct 2011 04:53:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBQ1L-0006Jz-62
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 04:52:20 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1317815525!49662924!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26259 invoked from network); 5 Oct 2011 11:52:06 -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;
	5 Oct 2011 11:52:06 -0000
X-IronPort-AV: E=Sophos;i="4.68,491,1312156800"; 
   d="scan'208";a="8223760"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 11:52:05 +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, 5 Oct 2011 12:52:05 +0100
Date: Wed, 5 Oct 2011 12:51:58 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1317739882-4809-11-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1110051243070.3519@kaball-desktop>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<1317739882-4809-11-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: Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH RFC V1 10/11] Introduce Xen PCI Passthrough,
	MSI (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, 4 Oct 2011, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>

You should set the original author of this patch correctly and add his
signed-off-by.
Remember to run the patch through checkpatch.pl.

> ---
>  hw/xen_pci_passthrough_msi.c |  674 ++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 674 insertions(+), 0 deletions(-)
>  create mode 100644 hw/xen_pci_passthrough_msi.c
> 
> diff --git a/hw/xen_pci_passthrough_msi.c b/hw/xen_pci_passthrough_msi.c
> new file mode 100644
> index 0000000..be18ff1
> --- /dev/null
> +++ b/hw/xen_pci_passthrough_msi.c
> @@ -0,0 +1,674 @@
> +/*
> + * Copyright (c) 2007, Intel Corporation.
> + *
> + * 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.
> + *
> + * 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"
> +
> +void msi_set_enable(XenPCIPassthroughState *dev, int en)
> +{
> +    uint16_t val = 0;
> +    uint32_t address = 0;
> +    PT_LOG("enable: %i\n", en);
> +
> +    if (!dev->msi) {
> +        return;
> +    }
> +
> +    address = dev->msi->ctrl_offset;
> +    if (!address) {
> +        return;
> +    }
> +
> +    val = host_pci_read_word(dev->real_device, address);
> +    val &= ~PCI_MSI_FLAGS_ENABLE;
> +    val |= en & PCI_MSI_FLAGS_ENABLE;
> +    host_pci_write_word(dev->real_device, address, val);
> +
> +    PT_LOG("done, address: %#x, val: %#x\n", address, val);
> +}
> +
> +static void msix_set_enable(XenPCIPassthroughState *dev, int en)
> +{
> +    uint16_t val = 0;
> +    uint32_t address = 0;
> +
> +    if (!dev->msix) {
> +        return;
> +    }
> +
> +    address = dev->msix->ctrl_offset;
> +    if (!address) {
> +        return;
> +    }
> +
> +    val = host_pci_read_word(dev->real_device, address);
> +    val &= ~PCI_MSIX_FLAGS_ENABLE;
> +    if (en) {
> +        val |= PCI_MSIX_FLAGS_ENABLE;
> +    }
> +    host_pci_write_word(dev->real_device, address, val);
> +}
> +
> +/*********************************/
> +/* MSI virtuailization functions */
> +
> +/*
> + * setup physical msi, but didn't enable it
> + */
> +int pt_msi_setup(XenPCIPassthroughState *dev)
> +{
> +    int pirq = -1;
> +    uint8_t gvec = 0;
> +
> +    if (!(dev->msi->flags & MSI_FLAG_UNINIT)) {
> +        PT_LOG("Error: setup physical after initialized?? \n");
> +        return -1;
> +    }
> +
> +    gvec = dev->msi->data & 0xFF;
> +    if (!gvec) {
> +        /* if gvec is 0, the guest is asking for a particular pirq that
> +         * is passed as dest_id */
> +        pirq = (dev->msi->addr_hi & 0xffffff00) |
> +               ((dev->msi->addr_lo >> MSI_TARGET_CPU_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(dev->real_device->dev,
> +                                          dev->real_device->func),
> +                                dev->real_device->bus, 0, 0)) {
> +        PT_LOG("Error: Mapping of MSI failed.\n");
> +        return -1;
> +    }
> +
> +    if (pirq < 0) {
> +        PT_LOG("Error: Invalid pirq number\n");
> +        return -1;
> +    }
> +
> +    dev->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_DESTMODE_SHIFT) & 0x1;
> +    dest_id = (addr >> MSI_TARGET_CPU_SHIFT) & 0xff;
> +    deliv_mode = (data >> MSI_DATA_DELIVERY_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 *d)
> +{
> +    uint8_t gvec = 0;
> +    uint32_t gflags = 0;
> +    uint64_t addr = 0;
> +    int ret = 0;
> +
> +    /* get vector, address, flags info, etc. */
> +    gvec = d->msi->data & 0xFF;
> +    addr = (uint64_t)d->msi->addr_hi << 32 | d->msi->addr_lo;
> +    gflags = __get_msi_gflags(d->msi->data, addr);
> +
> +    PT_LOG("Update msi with pirq %x gvec %x gflags %x\n",
> +           d->msi->pirq, gvec, gflags);
> +
> +    ret = xc_domain_update_msi_irq(xen_xc, xen_domid, gvec,
> +                                   d->msi->pirq, gflags, 0);
> +
> +    if (ret) {
> +        PT_LOG("Error: Binding of MSI failed.\n");
> +
> +        if (xc_physdev_unmap_pirq(xen_xc, xen_domid, d->msi->pirq)) {
> +            PT_LOG("Error: Unmapping of MSI failed.\n");
> +        }
> +        d->msi->pirq = -1;
> +        return ret;
> +    }
> +    return 0;
> +}
> +
> +void pt_msi_disable(XenPCIPassthroughState *dev)
> +{
> +    PCIDevice *d = &dev->dev;
> +    uint8_t gvec = 0;
> +    uint32_t gflags = 0;
> +    uint64_t addr = 0;
> +    uint8_t e_device = 0;
> +    uint8_t e_intx = 0;
> +
> +    msi_set_enable(dev, 0);
> +
> +    e_device = PCI_SLOT(dev->dev.devfn);
> +    e_intx = pci_intx(dev);
> +
> +    if (dev->msi_trans_en) {
> +        if (xc_domain_unbind_pt_irq(xen_xc, xen_domid, dev->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 (!(dev->msi->flags & MSI_FLAG_UNINIT)) {
> +        /* get vector, address, flags info, etc. */
> +        gvec = dev->msi->data & 0xFF;
> +        addr = (uint64_t)dev->msi->addr_hi << 32 | dev->msi->addr_lo;
> +        gflags = __get_msi_gflags(dev->msi->data, addr);
> +
> +        PT_LOG("Unbind msi with pirq %x, gvec %x\n",
> +                dev->msi->pirq, gvec);
> +
> +        if (xc_domain_unbind_msi_irq(xen_xc, xen_domid, gvec,
> +                                        dev->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 (dev->msi->pirq != -1) {
> +        PT_LOG("Unmap msi with pirq %x\n", dev->msi->pirq);
> +
> +        if (xc_physdev_unmap_pirq(xen_xc, xen_domid, dev->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 */
> +    dev->msi->flags = 0;
> +    dev->msi->pirq = -1;
> +    dev->msi_trans_en = 0;
> +}
> +
> +/* MSI-INTx translation virtulization functions */
> +int pt_enable_msi_translate(XenPCIPassthroughState* dev)
> +{
> +    uint8_t e_device = 0;
> +    uint8_t e_intx = 0;
> +
> +    if (!(dev->msi && dev->msi_trans_cap)) {
> +        return -1;
> +    }
> +
> +    msi_set_enable(dev, 0);
> +    dev->msi_trans_en = 0;
> +
> +    if (pt_msi_setup(dev)) {
> +        PT_LOG("Error: MSI-INTx translation MSI setup failed, fallback\n");
> +        return -1;
> +    }
> +
> +    e_device = PCI_SLOT(dev->dev.devfn);
> +    /* fix virtual interrupt pin to INTA# */
> +    e_intx = pci_intx(dev);
> +
> +    if (xc_domain_bind_pt_irq(xen_xc, xen_domid, dev->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, dev->msi->pirq)) {
> +            PT_LOG("Error: Unmapping of MSI failed.\n");
> +        }
> +        dev->msi->pirq = -1;
> +        return -1;
> +    }
> +
> +    msi_set_enable(dev, 1);
> +    dev->msi_trans_en = 1;
> +
> +    return 0;
> +}
> +
> +void pt_disable_msi_translate(XenPCIPassthroughState *dev)
> +{
> +    uint8_t e_device = 0;
> +    uint8_t e_intx = 0;
> +
> +    /* MSI_ENABLE bit should be disabed until the new handler is set */
> +    msi_set_enable(dev, 0);
> +
> +    e_device = PCI_SLOT(dev->dev.devfn);
> +    e_intx = pci_intx(dev);
> +
> +    if (xc_domain_unbind_pt_irq(xen_xc, xen_domid, dev->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 (dev->machine_irq) {
> +        if (xc_domain_bind_pt_pci_irq(xen_xc, xen_domid, dev->machine_irq,
> +                                       0, e_device, e_intx)) {
> +            PT_LOG("Error: Rebinding of interrupt failed!\n");
> +        }
> +    }
> +
> +    dev->msi_trans_en = 0;
> +}
> +
> +/*********************************/
> +/* MSI-X virtulization functions */
> +
> +static void mask_physical_msix_entry(XenPCIPassthroughState *dev,
> +                                     int entry_nr, int mask)
> +{
> +    void *phys_off;
> +
> +    phys_off = dev->msix->phys_iomem_base + 16 * entry_nr + 12;
> +    *(uint32_t *)phys_off = mask;
> +}
> +
> +static int pt_msix_update_one(XenPCIPassthroughState *dev, int entry_nr)
> +{
> +    struct msix_entry_info *entry = &dev->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_TARGET_CPU_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);
> +        }
> +    }
> +
> +    /* 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(dev->real_device->dev,
> +                                                dev->real_device->func),
> +                                      dev->real_device->bus, entry_nr,
> +                                      dev->msix->table_base);
> +        if (ret) {
> +            PT_LOG("Error: Mapping msix entry %x\n", entry_nr);
> +            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,
> +                                   dev->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 *dev)
> +{
> +    struct pt_msix_info *msix = dev->msix;
> +    int i;
> +
> +    for (i = 0; i < msix->total_entries; i++) {
> +        pt_msix_update_one(dev, i);
> +    }
> +
> +    return 0;
> +}
> +
> +void pt_msix_disable(XenPCIPassthroughState *dev)
> +{
> +    PCIDevice *d = &dev->dev;
> +    uint8_t gvec = 0;
> +    uint32_t gflags = 0;
> +    uint64_t addr = 0;
> +    int i = 0;
> +    struct msix_entry_info *entry = NULL;
> +
> +    msix_set_enable(dev, 0);
> +
> +    for ( i = 0; i < dev->msix->total_entries; i++ ) {
> +        entry = &dev->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));
> +            }
> +        }
> +        /* 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 *dev = (XenPCIPassthroughState *)opaque;
> +    XenPTMSIX *msix = dev->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);
> +
> +    // FIXME/TODO I maybe have to do the same in readl !
> +    /* entry_nr = (addr - msix->mmio_base_addr) / 16; */

what is the problem here?


> +    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 = dev->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);
> +        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(dev, entry_nr);
> +        }
> +        mask_physical_msix_entry(dev, 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 *dev = (XenPCIPassthroughState *)opaque;
> +    struct pt_msix_info *msix = dev->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 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 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 *dev, int pos)
> +{
> +    uint8_t id;
> +    uint16_t control;
> +    int i, total_entries, table_off, bar_index;
> +    HostPCIDevice *pd = dev->real_device;
> +    int fd;
> +
> +    id = host_pci_read_byte(pd, pos + PCI_CAP_LIST_ID);
> +
> +    if (id != PCI_CAP_ID_MSIX) {
> +        PT_LOG("Error: Invalid id %#x pos %#x\n", id, pos);
> +        return -1;
> +    }
> +
> +    control = host_pci_read_word(pd, pos + 2);
> +    total_entries = control & 0x7ff;
> +    total_entries += 1;
> +
> +    dev->msix = g_malloc0(sizeof (struct pt_msix_info)
> +                          + total_entries * sizeof (struct msix_entry_info));
> +
> +    dev->msix->total_entries = total_entries;
> +    for (i = 0; i < total_entries; i++) {
> +        dev->msix->msix_entry[i].pirq = -1;
> +    }
> +
> +    dev->msix->mmio_index =
> +        cpu_register_io_memory(pci_msix_read, pci_msix_write,
> +                               dev, DEVICE_NATIVE_ENDIAN);
> +
> +    table_off = host_pci_read_long(pd, pos + PCI_MSIX_TABLE);
> +    bar_index = dev->msix->bar_index = table_off & PCI_MSIX_FLAGS_BIRMASK;
> +    table_off = dev->msix->table_off = table_off & ~PCI_MSIX_FLAGS_BIRMASK;
> +    dev->msix->table_base =
> +        pt_pci_base_addr(dev->real_device->base_addr[bar_index]);
> +    PT_LOG("get MSI-X table bar base %#"PRIx64"\n", dev->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);
> +    dev->msix->table_offset_adjust = table_off & 0x0fff;
> +    dev->msix->phys_iomem_base = mmap(0,
> +                                      total_entries * 16
> +                                      + dev->msix->table_offset_adjust,
> +                                      PROT_WRITE | PROT_READ,
> +                                      MAP_SHARED | MAP_LOCKED,
> +                                      fd,
> +                                      dev->msix->table_base + table_off
> +                                      - dev->msix->table_offset_adjust);
> +    if (dev->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;
> +    }
> +    dev->msix->phys_iomem_base = ((char *)dev->msix->phys_iomem_base +
> +                                  dev->msix->table_offset_adjust);
> +
> +    close(fd);
> +
> +    PT_LOG("mapping physical MSI-X table to %p\n", dev->msix->phys_iomem_base);
> +    return 0;
> +
> +error_out:
> +    g_free(dev->msix);
> +    dev->msix = NULL;
> +    return -1;
> +}
> +
> +#if 0
> +static void pt_msix_delete(XenPCIPassthroughState *dev)
> +{
> +    /* unmap the MSI-X memory mapped register area */
> +    if (dev->msix->phys_iomem_base)
> +    {
> +        PT_LOG("unmapping physical MSI-X table from %lx\n",
> +           (unsigned long)dev->msix->phys_iomem_base);
> +        munmap(dev->msix->phys_iomem_base, dev->msix->total_entries * 16 +
> +           dev->msix->table_offset_adjust);
> +    }
> +
> +    if (dev->msix->mmio_index > 0)
> +    {
> +        cpu_unregister_io_memory(dev->msix->mmio_index);
> +    }
> +
> +
> +    free(dev->msix);
> +}
> +#endif
> --
> 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 Oct 05 04:56:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 04:56:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBQ58-00079f-8j; Wed, 05 Oct 2011 04:56:14 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBQ4H-0006vu-Ik
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 04:55:21 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1317815671!51096790!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13019 invoked from network); 5 Oct 2011 11:54:31 -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;
	5 Oct 2011 11:54:31 -0000
X-IronPort-AV: E=Sophos;i="4.68,491,1312156800"; 
   d="scan'208";a="8223849"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 11:55:18 +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, 5 Oct 2011 12:55:18 +0100
Date: Wed, 5 Oct 2011 12:55:11 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1317739882-4809-12-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1110051252330.3519@kaball-desktop>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<1317739882-4809-12-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: Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH RFC V1 11/11] config/make: Introduce
 --enable-xen-pci-passthrough, built 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 Tue, 4 Oct 2011, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  Makefile.target |    7 +++++++
>  configure       |   21 +++++++++++++++++++++
>  2 files changed, 28 insertions(+), 0 deletions(-)
> 
> diff --git a/Makefile.target b/Makefile.target
> index f708453..b5fbc18 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -208,6 +208,13 @@ obj-$(CONFIG_NO_XEN) += xen-stub.o
>  
>  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_helpers.o
> +obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pci_passthrough.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 =
>  ifeq ($(CONFIG_KVM), y)
> diff --git a/configure b/configure
> index 0875f95..b90cfe1 100755
> --- a/configure
> +++ b/configure
> @@ -127,6 +127,7 @@ vnc_png=""
>  vnc_thread="no"
>  xen=""
>  xen_ctrl_version=""
> +xen_pci_passthrough=""
>  linux_aio=""
>  attr=""
>  xfs=""
> @@ -635,6 +636,10 @@ for opt do
>    ;;
>    --enable-xen) xen="yes"
>    ;;
> +  --disable-xen-pci-passthrough) xen_pci_passthrough="no"
> +  ;;
> +  --enable-xen-pci-passthrough) xen_pci_passthrough="yes"
> +  ;;
>    --disable-brlapi) brlapi="no"
>    ;;
>    --enable-brlapi) brlapi="yes"
> @@ -972,6 +977,8 @@ echo "                           (affects only QEMU, not qemu-img)"
>  echo "  --enable-mixemu          enable mixer emulation"
>  echo "  --disable-xen            disable xen backend driver support"
>  echo "  --enable-xen             enable xen backend driver support"
> +echo "  --disable-xen-pci-passthrough"
> +echo "  --enable-xen-pci-passthrough"
>  echo "  --disable-brlapi         disable BrlAPI"
>  echo "  --enable-brlapi          enable BrlAPI"
>  echo "  --disable-vnc-tls        disable TLS encryption for VNC server"
> @@ -1335,6 +1342,17 @@ EOF
>    fi
>  fi
>  
> +if test "$xen_pci_passthrough" != "no"; then
> +  if test "$xen" = "yes"; then
> +    xen_pci_passthrough=yes
> +  else
> +    if test "$xen_pci_passthrough" = "yes"; then
> +      feature_not_found "Xen PCI Passthrough without Xen"
> +    fi
> +    xen_pci_passthrough=no
> +  fi
> +fi
> +

Xen works on many OSes that are not Linux, however host-pci-device only
works on Linux. 
For the moment we can turn off xen_pci_passthrough if we are not running
on Linux, but one day not too far I hope will have a host-pci-device
implementation that works on BSDs and Solaris.


>  ##########################################
>  # pkg-config probe
>  
> @@ -3378,6 +3396,9 @@ case "$target_arch2" in
>      if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then
>        target_phys_bits=64
>        echo "CONFIG_XEN=y" >> $config_target_mak
> +      if test "$xen_pci_passthrough" = yes; then
> +        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
> +      fi
>      else
>        echo "CONFIG_NO_XEN=y" >> $config_target_mak
>      fi
> -- 
> 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 Oct 05 05:03:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 05:03:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBQCD-0007qX-UW; Wed, 05 Oct 2011 05:03:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBQ73-0007Ug-VT
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 04:58:15 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317815775!38972002!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24723 invoked from network); 5 Oct 2011 11:56:16 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-14.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 5 Oct 2011 11:56:16 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317815887; l=617;
	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=6wXju1irbu+8mZcCCSekbgIF4gw=;
	b=R9EF2OVsFaA3w8VvUZLpQDoxdgDXqluBDyOMdft4ObhCKek1te87nuOoH0cSFx0QzIN
	xo3cA2umtxvEv+mWBdYliyzQ2QEIxKNJ2sYHqQidCXu6+2CZYLdDBtqrgPN/H9K4OkDDJ
	gW7m9zOkrCa7Sg8jCSZzwidPCbZEx2s6I7Q=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmwtM48/ll387pFkiM
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-084-057-086-247.pools.arcor-ip.net [84.57.86.247])
	by post.strato.de (mrclete mo56) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 504bafn95AdZ0s ;
	Wed, 5 Oct 2011 13:57:51 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id F094418B65; Wed,  5 Oct 2011 13:57:50 +0200 (CEST)
Date: Wed, 5 Oct 2011 13:57:50 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] tools/check: check for yajl (needed by libxl)
Message-ID: <20111005115750.GA22350@aepfle.de>
References: <4b98868690218126b906.1317368189@cosworth.uk.xensource.com>
	<CAJJyHjL55fNgwrmDVdCehaOLC1mPecf8M4fE4RCn_g_vygj=0A@mail.gmail.com>
	<1317379194.26672.256.camel@zakaz.uk.xensource.com>
	<4E8B1CCA.4040805@amd.com>
	<1317740400.21903.155.camel@zakaz.uk.xensource.com>
	<4E8C1430.3050203@amd.com>
	<1317807306.21903.188.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <1317807306.21903.188.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: Anthony Perard <anthony.perard@citrix.com>,
	Andre Przywara <andre.przywara@amd.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 Wed, Oct 05, Ian Campbell wrote:

> AIUI it is usually sufficient to find either a binary RPM from a closely
> related distro (i.e. a newer version of said distro or e.g. OpenSUSE for
> SLES) or to find a .src.rpm and run rpmbuild on it. I don't suppose
> these distros have the equivalent of Debian's backports.org? If
> necessary we should have a page on the wiki which gives pointers to
> where to obtain these libraries.

The openSuSE Buildservice has almost everything:

http://software.opensuse.org/search?q=libyajl1&baseproject=SUSE%3ASLE-11%3ASP1&include_home=true&exclude_debug=true


Olaf

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 05:06:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 05:06:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBQFM-0008HJ-24; Wed, 05 Oct 2011 05:06:48 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBQ81-0007Wh-RD
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 04:59:33 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317815927!40936805!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21691 invoked from network); 5 Oct 2011 11:58:49 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 11:58:49 -0000
Received: by pzk34 with SMTP id 34so3993481pzk.8
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 04:59:07 -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=/7Srt1q1YjNMyXGClgsiC/0Pj7LN2JW+10tD9yYE4qg=;
	b=U8kNbA09hiD2ZRCADpZDYoz273XfTcabYdRVoNHtbRlXbZfdxBwbXaolV5hjd1I1M3
	f3KUTriXyV2tUNUbOwzrbwON9glnJJiHSeaZmzs8/x5gI8wJKUJ+jGjoTE2PYHGEfYzv
	H3ceX19aK0ShHa+vFe9ewxDEZbxg++J7wtlqY=
MIME-Version: 1.0
Received: by 10.68.31.4 with SMTP id w4mr18181670pbh.20.1317815947752; Wed, 05
	Oct 2011 04:59:07 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Wed, 5 Oct 2011 04:59:07 -0700 (PDT)
In-Reply-To: <1317807198.21903.184.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<CAPLaKK7qFpZcrjWdNESwotc70KVVvNpC1SOoSqc9esFKJoM3=Q@mail.gmail.com>
	<1317715976.21903.73.camel@zakaz.uk.xensource.com>
	<1317717163.21903.80.camel@zakaz.uk.xensource.com>
	<CAPLaKK5w_ott56OYzwHg7b2SXbkoDyVsLCe+gauASUCaHeiv2w@mail.gmail.com>
	<1317807198.21903.184.camel@zakaz.uk.xensource.com>
Date: Wed, 5 Oct 2011 13:59:07 +0200
X-Google-Sender-Auth: q0dpiBGp9VsHYZnSJSsgQPCcBmk
Message-ID: <CAPLaKK54T=8SQR-ZOn82HQaK9V7D46SvS+MyUYgb0DfydurS_A@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 00 of 23] libxl: rationalise libxl_device_*
	APIs
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Cc: Mike McClurg <mike.mcclurg@citrix.com>, Jim Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>,
	Dave Scott <Dave.Scott@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

Hello (again),

After importing the series I realized that something is broken in
xl_cmdimpl.c, I get the following errors:

gcc -L/usr/xen42/lib   -o xl xl.o xl_cmdimpl.o xl_cmdtable.o
libxlutil.so -L/root/xen-04102011/tools/libxl/../../tools/libxl
-Wl,-rpath-link=/root/xen-04102011/tools/libxl/../../tools/libxc
-Wl,-rpath-link=/root/xen-04102011/tools/libxl/../../tools/xenstore
-lxenlight -L/root/xen-04102011/tools/libxl/../../tools/libxc
-lxenctrl
xl_cmdimpl.o: In function `parse_disk_config_multistring':
/root/xen-04102011/tools/libxl/xl_cmdimpl.c:497: undefined reference
to `libxl_device_disk_init'
xl_cmdimpl.o: In function `main_blockdetach':
/root/xen-04102011/tools/libxl/xl_cmdimpl.c:4202: undefined reference
to `libxl_device_disk_remove'
xl_cmdimpl.o: In function `main_networkdetach':
/root/xen-04102011/tools/libxl/xl_cmdimpl.c:4099: undefined reference
to `libxl_device_nic_remove'
xl_cmdimpl.o: In function `main_networklist':
/root/xen-04102011/tools/libxl/xl_cmdimpl.c:4052: undefined reference
to `libxl_device_nic_list'
/root/xen-04102011/tools/libxl/xl_cmdimpl.c:4057: undefined reference
to `libxl_device_nic_getinfo'
xl_cmdimpl.o: In function `pcidetach':
/root/xen-04102011/tools/libxl/xl_cmdimpl.c:2087: undefined reference
to `libxl_device_pci_force_remove'
xl_cmdimpl.o: In function `pcilist':
/root/xen-04102011/tools/libxl/xl_cmdimpl.c:2048: undefined reference
to `libxl_device_pci_list'
gmake: *** [xl] Error 1

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 05:49:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 05:49:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBQud-0001VH-Hk; Wed, 05 Oct 2011 05:49:27 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBQtm-0001Iq-8Q
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 05:48:35 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1317818893!61658653!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27933 invoked from network); 5 Oct 2011 12:48:13 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 12:48:13 -0000
Received: by wwf27 with SMTP id 27so2078400wwf.24
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 05:48:31 -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=bO18yG4sKGYtuLnsL2T+dgVfEVP8CnCY91SGx9NLUcU=;
	b=YY9luMdnZR3mEaOiUT1YK3eDO5/O0Ui6n0VQrIRP08QYd8z9oPMUM4DJp4XOySsdnb
	GzmN1AoD8QPLdVgEB8BE7rXbPbRGwsmfP1+dLisCF/djE+5adm/nRl01MY969GZv9MEH
	tjG/AI4pz70Of0DPgjzbj2qk0+p05OV/aK1KU=
Received: by 10.227.37.9 with SMTP id v9mr2956930wbd.50.1317818910982;
	Wed, 05 Oct 2011 05:48:30 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fa3sm2777254wbb.3.2011.10.05.05.48.28
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 05 Oct 2011 05:48:29 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: e94763a6bd3495cc95bd47721ba263acf24dc451
Message-Id: <e94763a6bd3495cc95bd.1317818891@loki>
In-Reply-To: <cafd8b3f9e0c8bbf5c30.1317389599@localhost.localdomain>
References: <cafd8b3f9e0c8bbf5c30.1317389599@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Wed, 05 Oct 2011 14:48:11 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] libxl: update nic list API to use common device
	API style
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

libxl_device_nic_list returns an array of libxl_device_nic and
libxl_device_nic_getinfo retrieves further information.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 25db0629e338 -r e94763a6bd34 tools/libxl/Makefile
--- a/tools/libxl/Makefile	Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/Makefile	Fri Sep 30 14:27:27 2011 +0100
@@ -119,7 +119,7 @@ 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 libxenlight.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
 
 testidl: testidl.o libxlutil.so libxenlight.so
 	$(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
diff -r 25db0629e338 -r e94763a6bd34 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/libxl.c	Fri Sep 30 14:27:27 2011 +0100
@@ -1285,60 +1285,138 @@ int libxl_device_nic_del(libxl_ctx *ctx,
     return rc;
 }
 
-libxl_nicinfo *libxl_list_nics(libxl_ctx *ctx, uint32_t domid, unsigned int *nb)
+static void libxl__device_nic_from_xs_be(libxl__gc *gc,
+                                         const char *be_path,
+                                         libxl_device_nic *nic)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    unsigned int len;
+    char *tmp;
+    int rc;
+
+    memset(nic, 0, sizeof(*nic));
+
+    tmp = xs_read(ctx->xsh, XBT_NULL,
+                  libxl__sprintf(gc, "%s/handle", be_path), &len);
+    if ( tmp )
+        nic->devid = atoi(tmp);
+    else
+        nic->devid = 0;
+
+    /* nic->mtu = */
+
+    tmp = xs_read(ctx->xsh, XBT_NULL,
+                  libxl__sprintf(gc, "%s/mac", be_path), &len);
+    rc = libxl__parse_mac(tmp, nic->mac);
+    if (rc)
+            memset(nic->mac, 0, sizeof(nic->mac));
+
+    nic->ip = xs_read(ctx->xsh, XBT_NULL,
+                      libxl__sprintf(gc, "%s/ip", be_path), &len);
+
+    nic->bridge = xs_read(ctx->xsh, XBT_NULL,
+                      libxl__sprintf(gc, "%s/bridge", be_path), &len);
+
+    nic->script = xs_read(ctx->xsh, XBT_NULL,
+                      libxl__sprintf(gc, "%s/script", be_path), &len);
+
+    /* XXX ioemu nics are not in xenstore at all? */
+    nic->nictype = LIBXL_NIC_TYPE_VIF;
+    nic->model = NULL; /* XXX Only for TYPE_IOEMU */
+    nic->ifname = NULL; /* XXX Only for TYPE_IOEMU */
+}
+
+static int libxl__append_nic_list_of_type(libxl__gc *gc,
+                                           uint32_t domid,
+                                           const char *type,
+                                           libxl_device_nic **nics,
+                                           int *nnics)
+{
+    char *be_path = NULL;
+    char **dir = NULL;
+    unsigned int n = 0;
+    libxl_device_nic *pnic = NULL, *pnic_end = NULL;
+
+    be_path = libxl__sprintf(gc, "%s/backend/%s/%d",
+                             libxl__xs_get_dompath(gc, 0), type, domid);
+    dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n);
+    if (dir) {
+        libxl_device_nic *tmp;
+        tmp = realloc(*nics, sizeof (libxl_device_nic) * (*nnics + n));
+        if (tmp == NULL)
+            return ERROR_NOMEM;
+        *nics = tmp;
+        pnic = *nics + *nnics;
+        *nnics += n;
+        pnic_end = *nics + *nnics;
+        for (; pnic < pnic_end; pnic++, dir++) {
+            const char *p;
+            p = libxl__sprintf(gc, "%s/%s", be_path, *dir);
+            libxl__device_nic_from_xs_be(gc, p, pnic);
+            pnic->backend_domid = 0;
+        }
+    }
+    return 0;
+}
+
+libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath, *nic_path_fe;
-    char **l, **list;
-    char *val, *tok;
-    unsigned int nb_nics, i;
-    libxl_nicinfo *res, *nics;
+    libxl_device_nic *nics = NULL;
+    int rc;
+
+    *num = 0;
+
+    rc = libxl__append_nic_list_of_type(&gc, domid, "vif", &nics, num);
+    if (rc) goto out_err;
+
+    libxl__free_all(&gc);
+    return nics;
+
+out_err:
+    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list nics");
+    while (*num) {
+        (*num)--;
+        libxl_device_nic_destroy(&nics[*num]);
+    }
+    free(nics);
+    return NULL;
+}
+
+int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_nic *nic, libxl_nicinfo *nicinfo)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *dompath, *nicpath;
+    char *val;
 
     dompath = libxl__xs_get_dompath(&gc, domid);
-    if (!dompath)
-        goto err;
-    list = l = libxl__xs_directory(&gc, XBT_NULL,
-                           libxl__sprintf(&gc, "%s/device/vif", dompath), &nb_nics);
-    if (!l)
-        goto err;
-    nics = res = calloc(nb_nics, sizeof (libxl_nicinfo));
-    if (!res)
-        goto err;
-    for (*nb = nb_nics; nb_nics > 0; --nb_nics, ++l, ++nics) {
-        nic_path_fe = libxl__sprintf(&gc, "%s/device/vif/%s", dompath, *l);
-
-        nics->backend = xs_read(ctx->xsh, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", nic_path_fe), NULL);
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nic_path_fe));
-        nics->backend_id = val ? strtoul(val, NULL, 10) : -1;
-
-        nics->devid = strtoul(*l, NULL, 10);
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nic_path_fe));
-        nics->state = val ? strtoul(val, NULL, 10) : -1;
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", nic_path_fe));
-        for (i = 0, tok = strtok(val, ":"); tok && (i < 6);
-             ++i, tok = strtok(NULL, ":")) {
-            nics->mac[i] = strtoul(tok, NULL, 16);
-        }
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nic_path_fe));
-        nics->evtch = val ? strtol(val, NULL, 10) : -1;
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nic_path_fe));
-        nics->rref_tx = val ? strtol(val, NULL, 10) : -1;
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nic_path_fe));
-        nics->rref_rx = val ? strtol(val, NULL, 10) : -1;
-        nics->frontend = xs_read(ctx->xsh, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/frontend", nics->backend), NULL);
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nics->backend));
-        nics->frontend_id = val ? strtoul(val, NULL, 10) : -1;
-        nics->script = xs_read(ctx->xsh, XBT_NULL,
-                               libxl__sprintf(&gc, "%s/script", nics->backend), NULL);
+    nicinfo->devid = nic->devid;
+
+    nicpath = libxl__sprintf(&gc, "%s/device/vif/%d", dompath, nicinfo->devid);
+    nicinfo->backend = xs_read(ctx->xsh, XBT_NULL,
+                                libxl__sprintf(&gc, "%s/backend", nicpath), NULL);
+    if (!nicinfo->backend) {
+        libxl__free_all(&gc);
+        return ERROR_FAIL;
     }
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nicpath));
+    nicinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nicpath));
+    nicinfo->state = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nicpath));
+    nicinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nicpath));
+    nicinfo->rref_tx = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nicpath));
+    nicinfo->rref_rx = val ? strtoul(val, NULL, 10) : -1;
+    nicinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
+                                 libxl__sprintf(&gc, "%s/frontend", nicinfo->backend), NULL);
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nicinfo->backend));
+    nicinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
 
     libxl__free_all(&gc);
-    return res;
-err:
-    libxl__free_all(&gc);
-    return NULL;
+    return 0;
 }
 
 /******************************************************************************/
diff -r 25db0629e338 -r e94763a6bd34 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/libxl.h	Fri Sep 30 14:27:27 2011 +0100
@@ -467,7 +467,9 @@ int libxl_device_disk_local_detach(libxl
 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);
 int libxl_device_nic_del(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, int wait);
-libxl_nicinfo *libxl_list_nics(libxl_ctx *ctx, uint32_t domid, unsigned int *nb);
+libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num);
+int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_nic *nic, libxl_nicinfo *nicinfo);
 
 int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid, libxl_device_console *console);
 
diff -r 25db0629e338 -r e94763a6bd34 tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/libxl_types.idl	Fri Sep 30 14:27:27 2011 +0100
@@ -330,8 +330,6 @@ libxl_nicinfo = Struct("nicinfo", [
     ("frontend_id", uint32),
     ("devid", integer),
     ("state", integer),
-    ("script", string),
-    ("mac", libxl_mac),
     ("evtch", integer),
     ("rref_tx", integer),
     ("rref_rx", integer),
diff -r 25db0629e338 -r e94763a6bd34 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Fri Sep 30 14:27:27 2011 +0100
@@ -451,15 +451,15 @@ int libxl_pipe(libxl_ctx *ctx, int pipes
 int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid,
                             const char *mac, libxl_device_nic *nic)
 {
-    libxl_nicinfo *nics;
-    unsigned int nb, rc, i;
+    libxl_device_nic *nics;
+    int nb, rc, i;
     libxl_mac mac_n;
 
     rc = libxl__parse_mac(mac, mac_n);
     if (rc)
         return rc;
 
-    nics = libxl_list_nics(ctx, domid, &nb);
+    nics = libxl_device_nic_list(ctx, domid, &nb);
     if (!nics)
         return ERROR_FAIL;
 
@@ -468,17 +468,17 @@ int libxl_mac_to_device_nic(libxl_ctx *c
     rc = ERROR_INVAL;
     for (i = 0; i < nb; ++i) {
         if (!libxl__compare_macs(&mac_n, &nics[i].mac)) {
-            nic->backend_domid = nics[i].backend_id;
-            nic->devid = nics[i].devid;
-            memcpy(nic->mac, nics[i].mac, sizeof (nic->mac));
-            nic->script = strdup(nics[i].script);
+            *nic = nics[i];
             rc = 0;
+            i++; /* Do not destroy this NIC on exit path */
             break;
         }
+        libxl_device_nic_destroy(&nics[i]);
     }
 
-    for (i=0; i<nb; i++)
-        libxl_nicinfo_destroy(&nics[i]);
+    for (; i<nb; i++)
+        libxl_device_nic_destroy(&nics[i]);
+
     free(nics);
     return rc;
 }
diff -r 25db0629e338 -r e94763a6bd34 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Fri Sep 30 14:27:27 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Fri Sep 30 14:27:27 2011 +0100
@@ -4022,8 +4022,9 @@ int main_networkattach(int argc, char **
 int main_networklist(int argc, char **argv)
 {
     int opt;
-    libxl_nicinfo *nics;
-    unsigned int nb, i;
+    libxl_device_nic *nics;
+    libxl_nicinfo nicinfo;
+    int nb, i;
 
     if ((opt = def_getopt(argc, argv, "", "network-list", 1)) != -1)
         return opt;
@@ -4036,19 +4037,23 @@ int main_networklist(int argc, char **ar
             fprintf(stderr, "%s is an invalid domain identifier\n", *argv);
             continue;
         }
-        if (!(nics = libxl_list_nics(ctx, domid, &nb))) {
+        nics = libxl_device_nic_list(ctx, domid, &nb);
+        if (!nics) {
             continue;
         }
         for (i = 0; i < nb; ++i) {
-            /* Idx BE */
-            printf("%-3d %-2d ", nics[i].devid, nics[i].backend_id);
-            /* MAC */
-            printf(LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nics[i].mac));
-            /* Hdl  Sta  evch txr/rxr  BE-path */
-            printf("%6d %5d %6d %5d/%-11d %-30s\n",
-                   nics[i].devid, nics[i].state, nics[i].evtch,
-                   nics[i].rref_tx, nics[i].rref_rx, nics[i].backend);
-            libxl_nicinfo_destroy(&nics[i]);
+            if (!libxl_device_nic_getinfo(ctx, domid, &nics[i], &nicinfo)) {
+                /* Idx BE */
+                printf("%-3d %-2d ", nicinfo.devid, nicinfo.backend_id);
+                /* MAC */
+                printf(LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nics[i].mac));
+                /* Hdl  Sta  evch txr/rxr  BE-path */
+                printf("%6d %5d %6d %5d/%-11d %-30s\n",
+                       nicinfo.devid, nicinfo.state, nicinfo.evtch,
+                       nicinfo.rref_tx, nicinfo.rref_rx, nicinfo.backend);
+                libxl_nicinfo_destroy(&nicinfo);
+            }
+            libxl_device_nic_destroy(&nics[i]);
         }
         free(nics);
     }

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 06:08:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 06:08:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBRCo-0002bu-UF; Wed, 05 Oct 2011 06:08:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBRBs-0002PE-Fa
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 06:07:17 -0700
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1317820022!40298758!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15038 invoked from network); 5 Oct 2011 13:07:03 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-11.tower-27.messagelabs.com with SMTP;
	5 Oct 2011 13:07: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 p95D7Bo2007343
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 5 Oct 2011 09:07:11 -0400
Received: from [10.34.1.169] (dhcp-1-169.brq.redhat.com [10.34.1.169])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p95D7AKJ029978; Wed, 5 Oct 2011 09:07:11 -0400
Message-ID: <4E8C56D8.6060604@redhat.com>
Date: Wed, 05 Oct 2011 15:08:40 +0200
From: Laszlo Ersek <lersek@redhat.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.20) Gecko/20110817 Fedora/3.1.12-1.fc14
	Lightning/1.0b3pre Mnenhy/0.8.4 Thunderbird/3.1.12
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
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
Cc: Jan Beulich <JBeulich@novell.com>
Subject: [Xen-devel] xen-wdt questions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 tried to test xen-wdt (as of 066d6c7) with
Documentation/watchdog/src/watchdog-test.c:

(1) when the test tool is invoked as "./watchdog-test -d", it exercises
WDIOC_SETOPTIONS/WDIOS_DISABLECARD, prints "Watchdog card disabled.",
and then closes /dev/watchdog.

That ioctl stops the watchdog alright via the hypercall and zeroes out
the guets's "wdt", but in repsonse to the closure (since
"expect_release" is not set) the xen_wdt_release() function prints a
critical message to the console ("unexpected close, not stopping
watchdog!"), and tries to kick it again. (At this time the guest's
wdt.id is 0, and so xen_wdt_kick() returns -ENXIO, but xen_wdt_release()
ignorese it.) The watchdog is stopped for real and the domain is not
killed, but the KERN_CRIT message could be misleading.

(2) Additionally, the WDIOC_SETOPTIONS/WDIOS_DISABLECARD ioctl manages
to turn off the watchdog, even if nowayout=1 was passed to the xen-wdt
module. Is that intentional?

Thanks
Laszlo

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 06:09:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 06:09:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBRDr-0002yr-NJ; Wed, 05 Oct 2011 06:09:19 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBRCd-0002ZS-Py
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 06:08:04 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1317820078!36789856!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 373 invoked from network); 5 Oct 2011 13:07:58 -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;
	5 Oct 2011 13:07:58 -0000
X-IronPort-AV: E=Sophos;i="4.68,491,1312156800"; 
   d="scan'208";a="8225762"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 13: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; Wed, 5 Oct 2011
	14:08:00 +0100
Subject: Re: [Xen-devel] [PATCH 00 of 23] libxl: rationalise libxl_device_*
	APIs
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 5 Oct 2011 14:08:00 +0100
In-Reply-To: <CAPLaKK54T=8SQR-ZOn82HQaK9V7D46SvS+MyUYgb0DfydurS_A@mail.gmail.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<CAPLaKK7qFpZcrjWdNESwotc70KVVvNpC1SOoSqc9esFKJoM3=Q@mail.gmail.com>
	<1317715976.21903.73.camel@zakaz.uk.xensource.com>
	<1317717163.21903.80.camel@zakaz.uk.xensource.com>
	<CAPLaKK5w_ott56OYzwHg7b2SXbkoDyVsLCe+gauASUCaHeiv2w@mail.gmail.com>
	<1317807198.21903.184.camel@zakaz.uk.xensource.com>
	<CAPLaKK54T=8SQR-ZOn82HQaK9V7D46SvS+MyUYgb0DfydurS_A@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317820080.21903.213.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Jim Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Scott <Dave.Scott@eu.citrix.com>, Mike McClurg <mike.mcclurg@citrix.com>,
	Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>, Dave
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-05 at 12:59 +0100, Roger Pau MonnÃ© wrote:
> Hello (again),
> 
> After importing the series I realized that something is broken in
> xl_cmdimpl.c, I get the following errors:
> 
> gcc -L/usr/xen42/lib   -o xl xl.o xl_cmdimpl.o xl_cmdtable.o
> libxlutil.so -L/root/xen-04102011/tools/libxl/../../tools/libxl
> -Wl,-rpath-link=/root/xen-04102011/tools/libxl/../../tools/libxc
> -Wl,-rpath-link=/root/xen-04102011/tools/libxl/../../tools/xenstore
> -lxenlight -L/root/xen-04102011/tools/libxl/../../tools/libxc
> -lxenctrl
> xl_cmdimpl.o: In function `parse_disk_config_multistring':
> /root/xen-04102011/tools/libxl/xl_cmdimpl.c:497: undefined reference
> to `libxl_device_disk_init'

This function was added by "libxl: convert disk handling to device
API" (patch #17/23). The others were generally added by the "convert XXX
handling to ..." patches.

I suspect that the -L/usr/xen42/lib in your link line has caused it to
try and link against the installed libxenlight.so and not the just built
one. My link line does not include this, it is just:
gcc    -o xl xl.o xl_cmdimpl.o xl_cmdtable.o libxlutil.so
-L/local/scratch/ianc/devel/xen-unstable.hg/tools/libxl/../../tools/libxl -Wl,-rpath-link=/local/scratch/ianc/devel/xen-unstable.hg/tools/libxl/../../tools/libxc -Wl,-rpath-link=/local/scratch/ianc/devel/xen-unstable.hg/tools/libxl/../../tools/xenstore -Wl,-rpath-link=/local/scratch/ianc/devel/xen-unstable.hg/tools/libxl/../../tools/blktap2/control -lxenlight -L/local/scratch/ianc/devel/xen-unstable.hg/tools/libxl/../../tools/libxc -lxenctrl

SO I guess you have LDFLAGS=-L/usr/xen42/lib -- what is that for? It
should not be necessary when building Xen itself.

> xl_cmdimpl.o: In function `main_blockdetach':
> /root/xen-04102011/tools/libxl/xl_cmdimpl.c:4202: undefined reference
> to `libxl_device_disk_remove'
> xl_cmdimpl.o: In function `main_networkdetach':
> /root/xen-04102011/tools/libxl/xl_cmdimpl.c:4099: undefined reference
> to `libxl_device_nic_remove'
> xl_cmdimpl.o: In function `main_networklist':
> /root/xen-04102011/tools/libxl/xl_cmdimpl.c:4052: undefined reference
> to `libxl_device_nic_list'
> /root/xen-04102011/tools/libxl/xl_cmdimpl.c:4057: undefined reference
> to `libxl_device_nic_getinfo'
> xl_cmdimpl.o: In function `pcidetach':
> /root/xen-04102011/tools/libxl/xl_cmdimpl.c:2087: undefined reference
> to `libxl_device_pci_force_remove'
> xl_cmdimpl.o: In function `pcilist':
> /root/xen-04102011/tools/libxl/xl_cmdimpl.c:2048: undefined reference
> to `libxl_device_pci_list'
> gmake: *** [xl] Error 1



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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 06:11:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 06:11:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBRGL-0003WX-Pl; Wed, 05 Oct 2011 06:11:53 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBRFI-0003Gr-TC
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 06:10:49 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317820227!45286520!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10118 invoked from network); 5 Oct 2011 13:10:27 -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;
	5 Oct 2011 13:10:27 -0000
X-IronPort-AV: E=Sophos;i="4.68,491,1312156800"; 
   d="scan'208";a="8225858"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 13:10:45 +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, 5 Oct 2011
	14:10:45 +0100
Subject: Re: [Xen-devel] [PATCH] libxl: update nic list API to use common
	device API style
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Date: Wed, 5 Oct 2011 14:10:44 +0100
In-Reply-To: <e94763a6bd3495cc95bd.1317818891@loki>
References: <cafd8b3f9e0c8bbf5c30.1317389599@localhost.localdomain>
	<e94763a6bd3495cc95bd.1317818891@loki>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317820245.21903.215.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

(I assume everything but the following hunk was a mistake)

> diff -r 25db0629e338 -r e94763a6bd34 tools/libxl/Makefile
> --- a/tools/libxl/Makefile      Fri Sep 30 14:27:27 2011 +0100
> +++ b/tools/libxl/Makefile      Fri Sep 30 14:27:27 2011 +0100
> @@ -119,7 +119,7 @@ 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 libxenlight.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
> 
>  testidl: testidl.o libxlutil.so libxenlight.so
>         $(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)

LDLIBS_libxenlight already has -lxenlight in it. I guess this changes
works around you local addition LDFLAGS=-L/usr/xen42/lib?

I'm not sure what the right answer is here.

Ian.




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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 06:16:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 06:16:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBRKr-00040g-9b; Wed, 05 Oct 2011 06:16:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBRKJ-0003oO-Hm
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 06:15:59 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1317820542!42915847!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15844 invoked from network); 5 Oct 2011 13:15:43 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 13:15:43 -0000
Received: by qabg14 with SMTP id g14so1730658qab.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 06:15:55 -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=PcVe4oFSXO2cqOb5fXNcMIvORFCoY3qh/xgqndQCvRc=;
	b=l9oQpDmDewxj1t08f1wNxrgoK6OkH297a8jn69jiwQIlVjh0yevpJyYYdt4QPjwj4u
	REJKlHTF1N46KtUoAIIf1eSOGExfWzR+E5uBRnDlaQD25KN4YcP8fMFfYMfM9E1ndQri
	rces16DT5KeU4nVIE+I09m7icmn9GMxAl61IM=
MIME-Version: 1.0
Received: by 10.68.31.4 with SMTP id w4mr18655768pbh.20.1317820555065; Wed, 05
	Oct 2011 06:15:55 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Wed, 5 Oct 2011 06:15:54 -0700 (PDT)
In-Reply-To: <1317820080.21903.213.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<CAPLaKK7qFpZcrjWdNESwotc70KVVvNpC1SOoSqc9esFKJoM3=Q@mail.gmail.com>
	<1317715976.21903.73.camel@zakaz.uk.xensource.com>
	<1317717163.21903.80.camel@zakaz.uk.xensource.com>
	<CAPLaKK5w_ott56OYzwHg7b2SXbkoDyVsLCe+gauASUCaHeiv2w@mail.gmail.com>
	<1317807198.21903.184.camel@zakaz.uk.xensource.com>
	<CAPLaKK54T=8SQR-ZOn82HQaK9V7D46SvS+MyUYgb0DfydurS_A@mail.gmail.com>
	<1317820080.21903.213.camel@zakaz.uk.xensource.com>
Date: Wed, 5 Oct 2011 15:15:54 +0200
X-Google-Sender-Auth: osGLB0SQ8moMaUZqAFDv2ZEyoXI
Message-ID: <CAPLaKK6iCKTLvcJw9-NxyKbA_0N0K9bWuGyLtZkiwB6_dzrKVg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 00 of 23] libxl: rationalise libxl_device_*
	APIs
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Mike McClurg <mike.mcclurg@citrix.com>, Jim Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>,
	Dave Scott <Dave.Scott@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

>> gcc -L/usr/xen42/lib =C2=A0 -o xl xl.o xl_cmdimpl.o xl_cmdtable.o
>> libxlutil.so -L/root/xen-04102011/tools/libxl/../../tools/libxl
>> -Wl,-rpath-link=3D/root/xen-04102011/tools/libxl/../../tools/libxc
>> -Wl,-rpath-link=3D/root/xen-04102011/tools/libxl/../../tools/xenstore
>> -lxenlight -L/root/xen-04102011/tools/libxl/../../tools/libxc
>> -lxenctrl
>> xl_cmdimpl.o: In function `parse_disk_config_multistring':
>> /root/xen-04102011/tools/libxl/xl_cmdimpl.c:497: undefined reference
>> to `libxl_device_disk_init'
>
> This function was added by "libxl: convert disk handling to device
> API" (patch #17/23). The others were generally added by the "convert XXX
> handling to ..." patches.
>
> I suspect that the -L/usr/xen42/lib in your link line has caused it to
> try and link against the installed libxenlight.so and not the just built
> one. My link line does not include this, it is just:
> gcc =C2=A0 =C2=A0-o xl xl.o xl_cmdimpl.o xl_cmdtable.o libxlutil.so
> -L/local/scratch/ianc/devel/xen-unstable.hg/tools/libxl/../../tools/libxl=
 -Wl,-rpath-link=3D/local/scratch/ianc/devel/xen-unstable.hg/tools/libxl/..=
/../tools/libxc -Wl,-rpath-link=3D/local/scratch/ianc/devel/xen-unstable.hg=
/tools/libxl/../../tools/xenstore -Wl,-rpath-link=3D/local/scratch/ianc/dev=
el/xen-unstable.hg/tools/libxl/../../tools/blktap2/control -lxenlight -L/lo=
cal/scratch/ianc/devel/xen-unstable.hg/tools/libxl/../../tools/libxc -lxenc=
trl
>
> SO I guess you have LDFLAGS=3D-L/usr/xen42/lib -- what is that for? It
> should not be necessary when building Xen itself.

The -L/usr/xen42/lib is for yajl, the problem was that it was missing
libxenlight.so, so it could not link to the proper functions (or it
was trying to use the old library from /usr/xen42/lib instead of the
new one). I've modified a patch in your series to include
libxenligh.so when compiling xl.

Now I have a similar problem, and I think it's because Xen is trying
to use the old header files and libraries in /usr/xen42/ instead of
the new ones.

gcc -O2 -g -DHAVE_DB_185_H -I/usr/include -I/usr/pkg/include
-I/usr/xen42/include -O1 -fno-omit-frame-pointer -m64 -g
-fno-strict-aliasing -std=3Dgnu99 -Wall -Wstrict-prototypes
-Wno-unused-value -Wdeclaration-after-statement -O1
-fno-omit-frame-pointer -m64 -g -fno-strict-aliasing -std=3Dgnu99 -Wall
-Wstrict-prototypes -Wno-unused-value -Wdeclaration-after-statement
-O1 -fno-omit-frame-pointer -m64 -g -fno-strict-aliasing -std=3Dgnu99
-Wall -Wstrict-prototypes -Wno-unused-value
-Wdeclaration-after-statement -D__XEN_TOOLS__ -MMD -MF
.subdirs-install.d -fno-optimize-sibling-calls -O1
-fno-omit-frame-pointer -m64 -g -fno-strict-aliasing -std=3Dgnu99 -Wall
-Wstrict-prototypes -Wno-unused-value -Wdeclaration-after-statement
-D__XEN_TOOLS__ -MMD -MF .subdir-install-python.d
-fno-optimize-sibling-calls -O1 -fno-omit-frame-pointer -m64 -g
-fno-strict-aliasing -std=3Dgnu99 -Wall -Wstrict-prototypes
-Wno-unused-value -Wdeclaration-after-statement -D__XEN_TOOLS__ -MMD
-MF .build.d -fno-optimize-sibling-calls -fPIC -I../../tools/include
-I../../tools/libxl -I../../tools/libxc -Ixen/lowlevel/xl
-I/usr/pkg/include/python2.6 -c xen/lowlevel/xl/xl.c -o
build/temp.netbsd-5.99.52-amd64-2.6-pydebug/xen/lowlevel/xl/xl.o
-fno-strict-aliasing -Werror
cc1: warnings being treated as errors
xen/lowlevel/xl/xl.c: In function 'pyxl_pci_del':
xen/lowlevel/xl/xl.c:525: warning: implicit declaration of function
'libxl_device_pci_force_remove'
xen/lowlevel/xl/xl.c:530: error: too few arguments to function
'libxl_device_pci_remove'
xen/lowlevel/xl/xl.c: In function 'pyxl_pci_list_assignable':
xen/lowlevel/xl/xl.c:568: warning: passing argument 2 of
'libxl_device_pci_list_assignable' from incompatible pointer type
xen/lowlevel/xl/xl.c:568: error: too few arguments to function
'libxl_device_pci_list_assignable'
xen/lowlevel/xl/xl.c: In function 'pyxl_pci_list':
xen/lowlevel/xl/xl.c:605: warning: implicit declaration of function
'libxl_device_pci_list'
xen/lowlevel/xl/xl.c:605: warning: assignment makes pointer from
integer without a cast
error: command 'gcc' failed with exit status 1

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 06:23:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 06:23:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBRRo-0004U8-VT; Wed, 05 Oct 2011 06:23:45 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBRR6-0004Ha-KV
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 06:23:00 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1317820976!16066401!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3928 invoked from network); 5 Oct 2011 13:22:57 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 13:22:57 -0000
Received: by vws13 with SMTP id 13so1858862vws.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 06:22: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
	:content-transfer-encoding;
	bh=eVV0RQUJacn4xRIBQu30aR+W+kKPuTbSBNDMRAziaNI=;
	b=aD6msZFMRYXPP+e6VtuLienWPQEXSlHEIPmcwVB4m6mfgAbUl8L3KR63u/YR+CeEN0
	ZZ0Uf66BuLuI5OfSb2D0ujIWUjxv823zZu7jBFPrZStPovXvslY7xdXDGZezWcvKR2sp
	oW2BqPpRXkItpcM/imfiQ1VmpiPxL86PoMrdU=
MIME-Version: 1.0
Received: by 10.68.11.138 with SMTP id q10mr18504820pbb.37.1317820975953; Wed,
	05 Oct 2011 06:22:55 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Wed, 5 Oct 2011 06:22:55 -0700 (PDT)
In-Reply-To: <1317820245.21903.215.camel@zakaz.uk.xensource.com>
References: <cafd8b3f9e0c8bbf5c30.1317389599@localhost.localdomain>
	<e94763a6bd3495cc95bd.1317818891@loki>
	<1317820245.21903.215.camel@zakaz.uk.xensource.com>
Date: Wed, 5 Oct 2011 15:22:55 +0200
X-Google-Sender-Auth: ZblzQqw-owyfVXDip9hA0lJtFhY
Message-ID: <CAPLaKK4H+tPJ1Yh6Z39=kyKYqEO1WYcgDmYDX9iQ2TTa3bR7Yw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] libxl: update nic list API to use common
	device API style
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
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

2011/10/5 Ian Campbell <Ian.Campbell@citrix.com>:
> (I assume everything but the following hunk was a mistake)

I modified your patch and resubmitted it (sorry if that's not ok),
since this is the first place where new functions are added to libxl.

>
>> diff -r 25db0629e338 -r e94763a6bd34 tools/libxl/Makefile
>> --- a/tools/libxl/Makefile =C2=A0 =C2=A0 =C2=A0Fri Sep 30 14:27:27 2011 =
+0100
>> +++ b/tools/libxl/Makefile =C2=A0 =C2=A0 =C2=A0Fri Sep 30 14:27:27 2011 =
+0100
>> @@ -119,7 +119,7 @@ libxlutil.a: $(LIBXLU_OBJS)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 $(AR) rcs libxlutil.a $^
>>
>> =C2=A0xl: $(XL_OBJS) libxlutil.so libxenlight.so
>> - =C2=A0 =C2=A0 =C2=A0 $(CC) $(LDFLAGS) -o $@ $(XL_OBJS) libxlutil.so $(=
LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
>> + =C2=A0 =C2=A0 =C2=A0 $(CC) $(LDFLAGS) -o $@ $(XL_OBJS) libxlutil.so li=
bxenlight.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
>>
>> =C2=A0testidl: testidl.o libxlutil.so libxenlight.so
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 $(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.s=
o $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
>
> LDLIBS_libxenlight already has -lxenlight in it. I guess this changes
> works around you local addition LDFLAGS=3D-L/usr/xen42/lib?
>
> I'm not sure what the right answer is here.

Neither do I, I'm not an expert on build processes, but if I need to
append CFLAGS and LDFLAGS to the build process to find my yajl library
libxl should not try to use the libxenligh.so and libxenutil.so from
the CFLAGS/LDFLAGS folder, because they are outdated. If not, the only
option left is to clean my LDFLAGS and CFLAGS folders from previous
Xen versions and compile the new version, but that's risky.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 06:30:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 06:30:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBRYY-0004x5-63; Wed, 05 Oct 2011 06:30:42 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBRXv-0004kN-O9
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 06:30:04 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317821381!45291059!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26640 invoked from network); 5 Oct 2011 13:29:42 -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; 5 Oct 2011 13:29:42 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 05 Oct 2011 14:30:00 +0100
Message-Id: <4E8C77F60200007800059836@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 05 Oct 2011 14:29:57 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Laszlo Ersek" <lersek@redhat.com>
References: <4E8C56D8.6060604@redhat.com>
In-Reply-To: <4E8C56D8.6060604@redhat.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: xen-wdt questions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 05.10.11 at 15:08, Laszlo Ersek <lersek@redhat.com> wrote:
> Hi,
>=20
> I tried to test xen-wdt (as of 066d6c7) with
> Documentation/watchdog/src/watchdog-test.c:
>=20
> (1) when the test tool is invoked as "./watchdog-test -d", it exercises
> WDIOC_SETOPTIONS/WDIOS_DISABLECARD, prints "Watchdog card disabled.",
> and then closes /dev/watchdog.
>=20
> That ioctl stops the watchdog alright via the hypercall and zeroes out
> the guets's "wdt", but in repsonse to the closure (since
> "expect_release" is not set) the xen_wdt_release() function prints a
> critical message to the console ("unexpected close, not stopping
> watchdog!"), and tries to kick it again. (At this time the guest's
> wdt.id is 0, and so xen_wdt_kick() returns -ENXIO, but xen_wdt_release()
> ignorese it.) The watchdog is stopped for real and the domain is not
> killed, but the KERN_CRIT message could be misleading.
>=20
> (2) Additionally, the WDIOC_SETOPTIONS/WDIOS_DISABLECARD ioctl manages
> to turn off the watchdog, even if nowayout=3D1 was passed to the xen-wdt
> module. Is that intentional?

I cloned some other watchdog driver's code when putting together the
Xen one, and I didn't test anything beyond basic watchdog functionality
(being able to reboot a guest and being able to cancel the watchdog).

Any ioctl anomalies are likely unintentional, but subject to knowing
respective behavior of the other watchdog drivers.

Jan

>=20
> Thanks
> Laszlo




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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 06:43:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 06:43:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBRkm-0005Wr-Vr; Wed, 05 Oct 2011 06:43:20 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBRjw-0005KD-33
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 06:42:28 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1317822144!16029503!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30886 invoked from network); 5 Oct 2011 13:42:25 -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;
	5 Oct 2011 13:42:25 -0000
X-IronPort-AV: E=Sophos;i="4.68,491,1312156800"; 
   d="scan'208";a="8226790"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 13:42: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; Wed, 5 Oct 2011
	14:42:01 +0100
Subject: Re: [Xen-devel] [PATCH] libxl: update nic list API to use common
	device API style
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 5 Oct 2011 14:42:00 +0100
In-Reply-To: <CAPLaKK4H+tPJ1Yh6Z39=kyKYqEO1WYcgDmYDX9iQ2TTa3bR7Yw@mail.gmail.com>
References: <cafd8b3f9e0c8bbf5c30.1317389599@localhost.localdomain>
	<e94763a6bd3495cc95bd.1317818891@loki>
	<1317820245.21903.215.camel@zakaz.uk.xensource.com>
	<CAPLaKK4H+tPJ1Yh6Z39=kyKYqEO1WYcgDmYDX9iQ2TTa3bR7Yw@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317822120.21903.219.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 Wed, 2011-10-05 at 14:22 +0100, Roger Pau MonnÃ© wrote:
> 2011/10/5 Ian Campbell <Ian.Campbell@citrix.com>:
> > (I assume everything but the following hunk was a mistake)
> 
> I modified your patch and resubmitted it (sorry if that's not ok),
> since this is the first place where new functions are added to libxl.

It is usually better to submit fixes separately, they can always be
merged in later if necessary. In this case the bug is preexisting, it
just happened to be this patch which exposed it for your particular
case.

> >> diff -r 25db0629e338 -r e94763a6bd34 tools/libxl/Makefile
> >> --- a/tools/libxl/Makefile      Fri Sep 30 14:27:27 2011 +0100
> >> +++ b/tools/libxl/Makefile      Fri Sep 30 14:27:27 2011 +0100
> >> @@ -119,7 +119,7 @@ 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 libxenlight.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
> >>
> >>  testidl: testidl.o libxlutil.so libxenlight.so
> >>         $(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
> >
> > LDLIBS_libxenlight already has -lxenlight in it. I guess this changes
> > works around you local addition LDFLAGS=-L/usr/xen42/lib?
> >
> > I'm not sure what the right answer is here.
> 
> Neither do I, I'm not an expert on build processes, but if I need to
> append CFLAGS and LDFLAGS to the build process to find my yajl library
> libxl should not try to use the libxenligh.so and libxenutil.so from
> the CFLAGS/LDFLAGS folder, because they are outdated. If not, the only
> option left is to clean my LDFLAGS and CFLAGS folders from previous
> Xen versions and compile the new version, but that's risky.

Hmm yes. Other options might be to move LDFLAGS to the end of the link
line (or introduce LDLIBS at the end?) or perhaps add an explicit -L.
somewhere. I'm really not sure though.

Whatever the solution is it applies to the other binary linked in this
directory (testidl) as well.

Ian.


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 07:12:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 07:12:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBSCl-0006Qh-QW; Wed, 05 Oct 2011 07:12:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBSBg-0006E7-6B
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 07:11:10 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-10.tower-174.messagelabs.com!1317823864!34036914!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1860 invoked from network); 5 Oct 2011 14:11:05 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-10.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 5 Oct 2011 14:11:05 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317823864; l=1848;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=h59DqxVTonIraqOgOaa14XgETEA=;
	b=a74MxYRY9BKBYpN3Rr5Bv7OMOEAPfuaPe5VY+OM/2yZAQKn2P8D2jdHnTU/HxLTNb4b
	v0GfmZeyvuHPlITxzFNEna5IipcR2J81Ca4um+OLDKGeejcLB7i+AZLhM8h8jeC2MjDDS
	LkqFizFdZ8wIXSPhwa8cxuFQng1kwxE172M=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmwtM48/ll387pFkiM
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-084-057-086-247.pools.arcor-ip.net [84.57.86.247])
	by post.strato.de (mrclete mo2) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id Z03605n95CBibh
	for <xen-devel@lists.xensource.com>;
	Wed, 5 Oct 2011 16:10:57 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 6AB0918B66
	for <xen-devel@lists.xensource.com>;
	Wed,  5 Oct 2011 16:10:55 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 94943cf143035aa7adbec2c39c45c16a5174e3c5
Message-Id: <94943cf143035aa7adbe.1317823855@probook.site>
In-Reply-To: <patchbomb.1317823853@probook.site>
References: <patchbomb.1317823853@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 05 Oct 2011 16:10:55 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 2 of 3] linux-2.6.18: xen/pv-on-hvm kexec:
 prevent crash in xenwatch_thread() when stale watch events arrive
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1314289811 -7200
# Node ID 94943cf143035aa7adbec2c39c45c16a5174e3c5
# Parent  86e85596d64b49a9a9c07e8817c33d046b078fd4
linux-2.6.18: xen/pv-on-hvm kexec: prevent crash in xenwatch_thread() when stale watch events arrive

commit c4c303c7c5679b4b368e12f41124aee29c325b76

During repeated kexec boots xenwatch_thread() can crash because
xenbus_watch->callback is cleared by xenbus_watch_path() if a node/token
combo for a new watch happens to match an already registered watch from
an old kernel.  In this case xs_watch returns -EEXISTS, then
register_xenbus_watch() does not remove the to-be-registered watch from
the list of active watches but returns the -EEXISTS to the caller
anyway.

Because the watch is still active in xenstored it will cause an event
which will arrive in the new kernel. process_msg() will find the
encapsulated struct xenbus_watch in its list of registered watches and
puts the "empty" watch handle in the queue for xenwatch_thread().
xenwatch_thread() then calls ->callback which was cleared earlier by
xenbus_watch_path().

To prevent that crash in a guest running on an old xen toolstack remove
the special -EEXIST handling.

v2:
 - remove the EEXIST handing in register_xenbus_watch() instead of
   checking for ->callback in process_msg()

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 86e85596d64b -r 94943cf14303 drivers/xen/xenbus/xenbus_xs.c
--- a/drivers/xen/xenbus/xenbus_xs.c
+++ b/drivers/xen/xenbus/xenbus_xs.c
@@ -656,8 +656,7 @@ int register_xenbus_watch(struct xenbus_
 
 	err = xs_watch(watch->node, token);
 
-	/* Ignore errors due to multiple registration. */
-	if ((err != 0) && (err != -EEXIST)) {
+	if (err) {
 		spin_lock(&watches_lock);
 		list_del(&watch->list);
 		spin_unlock(&watches_lock);

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 07:13:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 07:13:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBSE3-0006oS-9n; Wed, 05 Oct 2011 07:13:35 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBSBh-0006E9-2Y
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 07:11:11 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317823865!34054267!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18218 invoked from network); 5 Oct 2011 14:11:06 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-2.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 5 Oct 2011 14:11:06 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317823865; l=2502;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=Hy7SI8TXGipDPnvvdHOKWmSgwl0=;
	b=Hea7lPh7Ydqow96YqO/Aec0vHz3EzKQde53EPYmElT4xFG4/vAw67v9nksO8lMe62sw
	CqYqTZqDkkl3iXWcNI5pe+Y5eVJhHnPrGOpmQFChYIq7R3pUWfZlcx33t+BiVo3+ahF1q
	1vOWc6ha9OiFON8tibWBkJIpCy1uomb/KQs=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmwtM48/ll387pFkiM
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-084-057-086-247.pools.arcor-ip.net [84.57.86.247])
	by smtp.strato.de (klopstock mo18) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 500df2n95Dab9s
	for <xen-devel@lists.xensource.com>;
	Wed, 5 Oct 2011 16:10:56 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id C91B818B65
	for <xen-devel@lists.xensource.com>;
	Wed,  5 Oct 2011 16:10:54 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 86e85596d64b49a9a9c07e8817c33d046b078fd4
Message-Id: <86e85596d64b49a9a9c0.1317823854@probook.site>
In-Reply-To: <patchbomb.1317823853@probook.site>
References: <patchbomb.1317823853@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 05 Oct 2011 16:10:54 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 1 of 3] linux-2.6.18: xen/pv-on-hvm kexec: add
 xs_reset_watches to shutdown watches from old 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

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1316092705 -7200
# Node ID 86e85596d64b49a9a9c07e8817c33d046b078fd4
# Parent  5bda145fc6dcda60cd125699d7ece4bbade0660f
linux-2.6.18: xen/pv-on-hvm kexec: add xs_reset_watches to shutdown watches from old kernel

commit ddacf5ef684a655abe2bb50c4b2a5b72ae0d5e05

Add new xs_reset_watches function to shutdown watches from old kernel after
kexec boot.  The old kernel does not unregister all watches in the
shutdown path.  They are still active, the double registration can not
be detected by the new kernel.  When the watches fire, unexpected events
will arrive and the xenwatch thread will crash (jumps to NULL).  An
orderly reboot of a hvm guest will destroy the entire guest with all its
resources (including the watches) before it is rebuilt from scratch, so
the missing unregister is not an issue in that case.

With this change the xenstored is instructed to wipe all active watches
for the guest.  However, a patch for xenstored is required so that it
accepts the XS_RESET_WATCHES request from a client (see changeset
23839:42a45baf037d in xen-unstable.hg). Without the patch for xenstored
the registration of watches will fail and some features of a PVonHVM
guest are not available. The guest is still able to boot, but repeated
kexec boots will fail.

v5:
  - use xs_single instead of passing a dummy string to xs_talkv

v4:
  - ignore -EEXIST in xs_reset_watches

v3:
  - use XS_RESET_WATCHES instead of XS_INTRODUCE

v2:
  - move all code which deals with XS_INTRODUCE into xs_introduce()
    (based on feedback from Ian Campbell)
  - remove casts from kvec assignment

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 5bda145fc6dc -r 86e85596d64b drivers/xen/xenbus/xenbus_xs.c
--- a/drivers/xen/xenbus/xenbus_xs.c
+++ b/drivers/xen/xenbus/xenbus_xs.c
@@ -627,6 +627,17 @@ static struct xenbus_watch *find_watch(c
 	return NULL;
 }
 
+#ifndef CONFIG_XEN
+static void xs_reset_watches(void)
+{
+	int err;
+
+	err = xs_error(xs_single(XBT_NIL, XS_RESET_WATCHES, "", NULL));
+	if (err && err != -EEXIST)
+		printk(KERN_WARNING "xs_reset_watches failed: %d\n", err);
+}
+#endif
+
 /* Register callback to watch this node. */
 int register_xenbus_watch(struct xenbus_watch *watch)
 {
@@ -928,5 +939,10 @@ int xs_init(void)
 	if (IS_ERR(task))
 		return PTR_ERR(task);
 
+	/* shutdown watches for kexec boot */
+#ifndef CONFIG_XEN
+	xs_reset_watches();
+#endif
+
 	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 Oct 05 07:14:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 07:14:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBSF2-0007BL-Bx; Wed, 05 Oct 2011 07:14:36 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBSBk-0006EC-SY
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 07:11:13 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-5.tower-174.messagelabs.com!1317823869!30353838!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22652 invoked from network); 5 Oct 2011 14:11:09 -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 EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 5 Oct 2011 14:11:09 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317823869; l=290;
	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=s3w6oEWmePk46ouW9x+92jp8kUg=;
	b=Oe2ODm7ORV6QZh773nofnttUJjcEm4Xml5qr76s59pdxTf02dJXW6jJ4sjQ/ksxRG8d
	ZycBdxtSQaMwLjz0Fri21ZM0AQ5Z3LC2Ves+H5L39fXf1E0W3PMkKx5sj2BB2jhjo8hx0
	aiKF+IltVna/yjf1h178DTtr7rVjZoprgEw=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmwtM48/ll387pFkiM
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-084-057-086-247.pools.arcor-ip.net [84.57.86.247])
	by smtp.strato.de (fruni mo37) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 404482n95DKhhO
	for <xen-devel@lists.xensource.com>;
	Wed, 5 Oct 2011 16:10:55 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 1417B18892
	for <xen-devel@lists.xensource.com>;
	Wed,  5 Oct 2011 16:10:54 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1317823853@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 05 Oct 2011 16:10:53 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 0 of 3] linux-2.6.18: merge fixes from mainline
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 three backports from Konrads stable/drivers-3.2 branch implement
kexec for PVonHVM guests.

 drivers/xen/xenbus/xenbus_probe.c |  112 +++++++++++++++++++++++---------------
 drivers/xen/xenbus/xenbus_xs.c    |   19 +++++-
 2 files changed, 87 insertions(+), 44 deletions(-)


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 07:15:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 07:15:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBSG9-0007df-5H; Wed, 05 Oct 2011 07:15:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBSBn-0006EN-Kc
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 07:11:19 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-8.tower-27.messagelabs.com!1317823851!46907724!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2711 invoked from network); 5 Oct 2011 14:10:51 -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; 5 Oct 2011 14:10:51 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317823869; l=7207;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=ZZBPuHWqIM6U7B1/hDYb9GaZ62I=;
	b=M9C4YsmlnAKvFe8RzrCpjkW88mVUs4dVRkz7Hh+NxUNG/dQx5kMDQuOAdkuz9RgGIbO
	LYkD+Y+NtJzPExwDy6lLWMEXhC2piIR5q/iEuqhC+KeuiQu4lIacZRsIs726CTM6+ZEEE
	SLg4vgaMcrr5+1udQxI4NXMGOqgxJWnkaLw=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmwtM48/ll387pFkiM
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-084-057-086-247.pools.arcor-ip.net [84.57.86.247])
	by smtp.strato.de (fruni mo43) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id Q0495bn95CXfYi
	for <xen-devel@lists.xensource.com>;
	Wed, 5 Oct 2011 16:10:58 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id B295E18892
	for <xen-devel@lists.xensource.com>;
	Wed,  5 Oct 2011 16:10:55 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 6cbbaae4d5bed6834b5606a3b9d1a5a919d2db89
Message-Id: <6cbbaae4d5bed6834b56.1317823856@probook.site>
In-Reply-To: <patchbomb.1317823853@probook.site>
References: <patchbomb.1317823853@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 05 Oct 2011 16:10:56 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 3 of 3] linux-2.6.18: xen/pv-on-hvm kexec+kdump:
 reset PV devices in kexec or crash 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

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1314290085 -7200
# Node ID 6cbbaae4d5bed6834b5606a3b9d1a5a919d2db89
# Parent  94943cf143035aa7adbec2c39c45c16a5174e3c5
linux-2.6.18: xen/pv-on-hvm kexec+kdump: reset PV devices in kexec or crash kernel

commit 116df6f004af81925dcaa90d4a3b76da6b009427

After triggering a crash dump in a HVM guest, the PV backend drivers
will remain in Connected state. When the kdump kernel starts the PV
drivers will skip such devices. As a result, no root device is found and
the vmcore cant be saved.

A similar situation happens after a kexec boot, here the devices will be
in the Closed state.

With this change all frontend devices with state XenbusStateConnected or
XenbusStateClosed will be reset by changing the state file to Closing ->
Closed -> Initializing.  This will trigger a disconnect in the backend
drivers. Now the frontend drivers will find the backend drivers in state
Initwait and can connect.

v2:
  - add timeout when waiting for backend state change
  (based on feedback from Ian Campell)
  - extent printk message to include backend string
  - add comment to fall-through case in xenbus_reset_frontend

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 94943cf14303 -r 6cbbaae4d5be drivers/xen/xenbus/xenbus_probe.c
--- a/drivers/xen/xenbus/xenbus_probe.c
+++ b/drivers/xen/xenbus/xenbus_probe.c
@@ -859,72 +859,100 @@ void unregister_xenstore_notifier(struct
 EXPORT_SYMBOL_GPL(unregister_xenstore_notifier);
 #endif
 
-#ifdef CONFIG_CRASH_DUMP
-static DECLARE_WAIT_QUEUE_HEAD(be_state_wq);
-static int be_state;
+#ifndef CONFIG_XEN
+static DECLARE_WAIT_QUEUE_HEAD(backend_state_wq);
+static int backend_state;
 
-static void xenbus_reset_state_changed(struct xenbus_watch *w, const char **v, unsigned int l)
+static void xenbus_reset_backend_state_changed(struct xenbus_watch *w,
+					const char **v, unsigned int l)
 {
-	if (xenbus_scanf(XBT_NIL, v[XS_WATCH_PATH], "", "%i", &be_state) != 1)
-		be_state = XenbusStateUnknown;
-	printk(KERN_INFO "XENBUS: %s %s\n", v[XS_WATCH_PATH], xenbus_strstate(be_state));
-	wake_up(&be_state_wq);
+	if (xenbus_scanf(XBT_NIL, v[XS_WATCH_PATH], "", "%i", &backend_state) != 1)
+		backend_state = XenbusStateUnknown;
+	printk(KERN_DEBUG "XENBUS: backend %s %s\n",
+			v[XS_WATCH_PATH], xenbus_strstate(backend_state));
+	wake_up(&backend_state_wq);
 }
 
-static int xenbus_reset_check_final(int *st)
+static void xenbus_reset_wait_for_backend(char *be, int expected)
 {
-	return *st == XenbusStateInitialising || *st == XenbusStateInitWait;
+	long timeout;
+	timeout = wait_event_interruptible_timeout(backend_state_wq,
+			backend_state == expected, 5 * HZ);
+	if (timeout <= 0)
+		printk(KERN_INFO "XENBUS: backend %s timed out.\n", be);
 }
 
-static void xenbus_reset_frontend_state(char *backend, char *frontend)
+/*
+ * Reset frontend if it is in Connected or Closed state.
+ * Wait for backend to catch up.
+ * State Connected happens during kdump, Closed after kexec.
+ */
+static void xenbus_reset_frontend(char *fe, char *be, int be_state)
 {
-	struct xenbus_watch watch;
+	struct xenbus_watch be_watch;
 
-	memset(&watch, 0, sizeof(watch));
-	watch.node = kasprintf(GFP_NOIO | __GFP_HIGH, "%s/state", backend);
-	if (!watch.node)
+	printk(KERN_DEBUG "XENBUS: backend %s %s\n",
+			be, xenbus_strstate(be_state));
+
+	memset(&be_watch, 0, sizeof(be_watch));
+	be_watch.node = kasprintf(GFP_NOIO | __GFP_HIGH, "%s/state", be);
+	if (!be_watch.node)
 		return;
 
-	watch.callback = xenbus_reset_state_changed;
-	be_state = XenbusStateUnknown;
+	be_watch.callback = xenbus_reset_backend_state_changed;
+	backend_state = XenbusStateUnknown;
 
-	printk(KERN_INFO "XENBUS: triggering reconnect on %s\n", backend);
-	register_xenbus_watch(&watch);
+	printk(KERN_INFO "XENBUS: triggering reconnect on %s\n", be);
+	register_xenbus_watch(&be_watch);
 
-	xenbus_printf(XBT_NIL, frontend, "state", "%d", XenbusStateClosing);
-	wait_event_interruptible(be_state_wq, be_state == XenbusStateClosing);
+	/* fall through to forward backend to state XenbusStateInitialising */
+	switch (be_state) {
+	case XenbusStateConnected:
+		xenbus_printf(XBT_NIL, fe, "state", "%d", XenbusStateClosing);
+		xenbus_reset_wait_for_backend(be, XenbusStateClosing);
 
-	xenbus_printf(XBT_NIL, frontend, "state", "%d", XenbusStateClosed);
-	wait_event_interruptible(be_state_wq, be_state == XenbusStateClosed);
+	case XenbusStateClosing:
+		xenbus_printf(XBT_NIL, fe, "state", "%d", XenbusStateClosed);
+		xenbus_reset_wait_for_backend(be, XenbusStateClosed);
 
-	xenbus_printf(XBT_NIL, frontend, "state", "%d", XenbusStateInitialising);
-	wait_event_interruptible(be_state_wq, xenbus_reset_check_final(&be_state));
+	case XenbusStateClosed:
+		xenbus_printf(XBT_NIL, fe, "state", "%d", XenbusStateInitialising);
+		xenbus_reset_wait_for_backend(be, XenbusStateInitWait);
+	}
 
-	unregister_xenbus_watch(&watch);
-	printk(KERN_INFO "XENBUS: reconnect done on %s\n", backend);
-	kfree(watch.node);
+	unregister_xenbus_watch(&be_watch);
+	printk(KERN_INFO "XENBUS: reconnect done on %s\n", be);
+	kfree(be_watch.node);
 }
 
-static void xenbus_reset_check_state(char *class, char *dev)
+static void xenbus_check_frontend(char *class, char *dev)
 {
-	int state, err;
+	int be_state, fe_state, err;
 	char *backend, *frontend;
 
 	frontend = kasprintf(GFP_NOIO | __GFP_HIGH, "device/%s/%s", class, dev);
 	if (!frontend)
 		return;
 
-	err = xenbus_scanf(XBT_NIL, frontend, "state", "%i", &state);
-	/* frontend connected? */
-	if (err == 1 && state == XenbusStateConnected) {
+	err = xenbus_scanf(XBT_NIL, frontend, "state", "%i", &fe_state);
+	if (err != 1)
+		goto out;
+
+	switch (fe_state) {
+	case XenbusStateConnected:
+	case XenbusStateClosed:
+		printk(KERN_DEBUG "XENBUS: frontend %s %s\n",
+				frontend, xenbus_strstate(fe_state));
 		backend = xenbus_read(XBT_NIL, frontend, "backend", NULL);
 		if (!backend || IS_ERR(backend))
 			goto out;
-		err = xenbus_scanf(XBT_NIL, backend, "state", "%i", &state);
-		/* backend connected? */
-		if (err == 1 && state == XenbusStateConnected)
-			xenbus_reset_frontend_state(backend, frontend);
+		err = xenbus_scanf(XBT_NIL, backend, "state", "%i", &be_state);
+		if (err == 1)
+			xenbus_reset_frontend(frontend, backend, be_state);
 		kfree(backend);
+		break;
+	default:
+		break;
 	}
 out:
 	kfree(frontend);
@@ -945,7 +973,7 @@ static void xenbus_reset_state(void)
 		if (IS_ERR(dev))
 			continue;
 		for (j = 0; j < dev_n; j++)
-			xenbus_reset_check_state(devclass[i], dev[j]);
+			xenbus_check_frontend(devclass[i], dev[j]);
 		kfree(dev);
 	}
 	kfree(devclass);
@@ -956,11 +984,11 @@ void xenbus_probe(void *unused)
 {
 	BUG_ON(!is_xenstored_ready());
 
-#ifdef CONFIG_CRASH_DUMP
-	/* reset devices in XenbusStateConnected state */
-	if (!is_initial_xendomain() && reset_devices)
-		xenbus_reset_state();
+#ifndef CONFIG_XEN
+	/* reset devices in Connected or Closed state */
+	xenbus_reset_state();
 #endif
+
 	/* Enumerate devices in xenstore and watch for changes. */
 	xenbus_probe_devices(&xenbus_frontend);
 	register_xenbus_watch(&fe_watch);

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 07:25:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 07: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 1RBSPD-0000NU-9c; Wed, 05 Oct 2011 07:25:07 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBSMV-00086S-Ql
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 07:22:21 -0700
X-Env-Sender: fantonifabio@tiscali.it
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317824514!40968127!1
X-Originating-IP: [216.139.236.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31956 invoked from network); 5 Oct 2011 14:21:56 -0000
Received: from sam.nabble.com (HELO sam.nabble.com) (216.139.236.26)
	by server-6.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	5 Oct 2011 14:21:56 -0000
Received: from [192.168.236.26] (helo=sam.nabble.com)
	by sam.nabble.com with esmtp (Exim 4.72)
	(envelope-from <fantonifabio@tiscali.it>) id 1RBSMQ-00041A-OR
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 07:22:14 -0700
Date: Wed, 5 Oct 2011 07:22:14 -0700 (PDT)
From: Fantu <fantonifabio@tiscali.it>
To: xen-devel@lists.xensource.com
Message-ID: <1317824534750-4872878.post@n5.nabble.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Dom0 cpu utilisation irregularly distributed
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On some production servers with dom0 kernel 2.6.32 pvops and xen 4.0 and
domus mainly windows with gplpv I noticed a strange cpu usage by the dom0
mainly with the use of a single cpu, for example this take from one server:
xm vcpu-list
Name                                ID  VCPU   CPU State   Time(s) CPU
Affinity
...
Domain-0                             0     0     3   -b-  1043377.5 any cpu
Domain-0                             0     1     2   r--  122083.9 any cpu
Domain-0                             0     2     0   -b-  284636.1 any cpu
Domain-0                             0     3     1   -b-   80772.9 any cpu
...
Note the increased utilisation on the vcpu 0

Domus cpu utilisation apparently successfully distributed but the dom0 has
always use more of its vcpu 0
Is this correct or there are bugs on kernel and/or xen?



--
View this message in context: http://xen.1045712.n5.nabble.com/Dom0-cpu-utilisation-irregularly-distributed-tp4872878p4872878.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 Wed Oct 05 07:29:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 07:29:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBSTB-0000oT-BN; Wed, 05 Oct 2011 07:29:13 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBSSY-0000bx-Vw
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 07:28:35 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-10.tower-174.messagelabs.com!1317824911!34040552!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6982 invoked from network); 5 Oct 2011 14:28:31 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-10.tower-174.messagelabs.com with SMTP;
	5 Oct 2011 14:28:31 -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
	p95ESUIS020338
	for <xen-devel@lists.xensource.com>; Wed, 5 Oct 2011 14:28:30 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 p95ESU2r028322; 
	Wed, 5 Oct 2011 10:28:30 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: xen-devel@lists.xensource.com
Date: Wed,  5 Oct 2011 10:28:40 -0400
Message-Id: <1317824920-639-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>
Subject: [Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming
	domain 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

The xenbus event channel established in xenbus_init is intended to be a
loopback channel, but the remote domain was hardcoded to 0; this will
cause the channel to be unusable when xenstore is not being run in
domain 0.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/xenbus/xenbus_probe.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
index bd2f90c..82bf38c 100644
--- a/drivers/xen/xenbus/xenbus_probe.c
+++ b/drivers/xen/xenbus/xenbus_probe.c
@@ -712,7 +712,7 @@ static int __init xenbus_init(void)
 
 		/* Next allocate a local port which xenstored can bind to */
 		alloc_unbound.dom        = DOMID_SELF;
-		alloc_unbound.remote_dom = 0;
+		alloc_unbound.remote_dom = DOMID_SELF;
 
 		err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
 						  &alloc_unbound);
-- 
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 Oct 05 08:10:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 08:10:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBT7U-0002Ru-TG; Wed, 05 Oct 2011 08:10:52 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBT6b-0002FS-Q3
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 08:09:58 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317827393!20376602!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8968 invoked from network); 5 Oct 2011 15:09:54 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 15:09:54 -0000
X-IronPort-AV: E=Sophos;i="4.68,491,1312171200"; d="scan'208";a="165801959"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 11:09:51 -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; Wed, 5 Oct 2011
	11:09:51 -0400
Message-ID: <4E8C733E.9010600@citrix.com>
Date: Wed, 5 Oct 2011 16:09:50 +0100
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>
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: 
Subject: [Xen-devel] Recommend backporting unstable 23685:5239811f92e1 to
	4.1-testing
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

XenServer is suffering the segfault with Xen-4.1.

The changeset does not cleanly apply because of 4.1-testing
23160:5c395e993fe4 affecting the same hunk, but the backport is trivial.

-- 
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 Oct 05 09:12:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 09:12:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBU4o-0004FY-JX; Wed, 05 Oct 2011 09:12:10 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBU37-000420-M6
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 09:10:28 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1317830996!40585123!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21389 invoked from network); 5 Oct 2011 16:09:56 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-3.tower-27.messagelabs.com with SMTP;
	5 Oct 2011 16:09:56 -0000
Received: from p5b2e5e12.dip.t-dialin.net ([91.46.94.18] 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 1RBU34-0004Yc-0Q; Wed, 05 Oct 2011 16:10:22 +0000
Message-ID: <4E8C816B.7060608@canonical.com>
Date: Wed, 05 Oct 2011 18:10:19 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110922 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] Re: Still struggling with HVM: tx timeouts on emulated
	nics
References: <4E7B4768.8060103@canonical.com>	<alpine.DEB.2.00.1109221838370.8700@kaball-desktop>	<4E85883C.7030808@canonical.com>	<alpine.DEB.2.00.1109301427590.3519@kaball-desktop>	<4E85E8E8.2020702@canonical.com>
	<4E860382.7040108@canonical.com>
	<alpine.DEB.2.00.1110031800390.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1110031800390.3519@kaball-desktop>
X-Enigmail-Version: 1.1.2
Content-Type: multipart/mixed; boundary="------------070400090801000304000406"
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

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

On 03.10.2011 19:24, Stefano Stabellini wrote:
> I am going to send a different patch upstream for Xen 4.2, because I
> would also like it to cover the very unlikely scenario in which a PV
> guest (like dom0 or a PV guest with PCI passthrough) is loosing level
> interrupts because when Xen tries to set the corresponding event channel
> pending the bit is alreay set. The codebase is different enough that
> making the same change on 4.1 is non-trivial. I am appending the new
> patch to this email, it would be great if you could test it. You just
> need a 4.2 hypervisor, not the entire system. You should be able to
> perform the test updating only xen.gz.
> If you have trouble if xen-unstable.hg tip, try changeset 23843.

Hi Stefano,

currently I would have the problem that I don't have too much time to move to
another hypervisor (tests may or may not be useful there with substantial
changes beside this one) with our next release being close.
But I think I got a usable backport of your change to 4.1.1 (you think it looks
ok?) and have given that a quick test which seems to be ok...
Though one drawback is that I don't have a setup which would use passthrough, so
that path is not tested. I think I did see (with a debugging version) that the
lost count was incremented and decremented in dom0, though.

-Stefan

---

Index: xen-4.1.1/xen/arch/x86/domain.c
===================================================================
--- xen-4.1.1.orig/xen/arch/x86/domain.c	2011-10-05 15:03:19.405815293 +0200
+++ xen-4.1.1/xen/arch/x86/domain.c	2011-10-05 15:09:59.781816622 +0200
@@ -514,6 +514,12 @@ int arch_domain_create(struct domain *d,
         memset(d->arch.pirq_irq, 0,
                d->nr_pirqs * sizeof(*d->arch.pirq_irq));

+        d->arch.pirq_lost = xmalloc_array(int, d->nr_pirqs);
+        if ( !d->arch.pirq_lost)
+            goto fail;
+        memset(d->arch.pirq_lost, 0,
+               d->nr_pirqs * sizeof(*d->arch.pirq_lost));
+
         d->arch.irq_pirq = xmalloc_array(int, nr_irqs);
         if ( !d->arch.irq_pirq )
             goto fail;
@@ -575,6 +581,7 @@ int arch_domain_create(struct domain *d,
  fail:
     d->is_dying = DOMDYING_dead;
     vmce_destroy_msr(d);
+    xfree(d->arch.pirq_lost);
     xfree(d->arch.pirq_irq);
     xfree(d->arch.irq_pirq);
     xfree(d->arch.pirq_emuirq);
@@ -628,6 +635,7 @@ void arch_domain_destroy(struct domain *
 #endif

     free_xenheap_page(d->shared_info);
+    xfree(d->arch.pirq_lost);
     xfree(d->arch.pirq_irq);
     xfree(d->arch.irq_pirq);
     xfree(d->arch.pirq_emuirq);
Index: xen-4.1.1/xen/arch/x86/hvm/irq.c
===================================================================
--- xen-4.1.1.orig/xen/arch/x86/hvm/irq.c	2011-10-05 15:14:35.441815292 +0200
+++ xen-4.1.1/xen/arch/x86/hvm/irq.c	2011-10-05 17:55:43.603986605 +0200
@@ -33,7 +33,9 @@ static void assert_gsi(struct domain *d,
     int pirq = domain_emuirq_to_pirq(d, ioapic_gsi);
     if ( hvm_domain_use_pirq(d, pirq) )
     {
-        send_guest_pirq(d, pirq);
+        if ( send_guest_pirq(d, pirq) && ioapic_gsi >= NR_ISAIRQS )
+            if (d->arch.pirq_lost)
+                d->arch.pirq_lost[pirq]++;
         return;
     }
     vioapic_irq_positive_edge(d, ioapic_gsi);
@@ -67,6 +69,12 @@ static void __hvm_pci_intx_assert(
     gsi = hvm_pci_intx_gsi(device, intx);
     if ( hvm_irq->gsi_assert_count[gsi]++ == 0 )
         assert_gsi(d, gsi);
+    else {
+        int pirq = domain_emuirq_to_pirq(d, gsi);
+
+        if ( hvm_domain_use_pirq(d, pirq) && d->arch.pirq_lost)
+            d->arch.pirq_lost[pirq]++;
+    }

     link    = hvm_pci_intx_link(device, intx);
     isa_irq = hvm_irq->pci_link.route[link];
Index: xen-4.1.1/xen/arch/x86/irq.c
===================================================================
--- xen-4.1.1.orig/xen/arch/x86/irq.c	2011-10-05 15:26:58.477815292 +0200
+++ xen-4.1.1/xen/arch/x86/irq.c	2011-10-05 17:56:23.191986535 +0200
@@ -888,10 +888,13 @@ static void __do_IRQ_guest(int irq)
                 desc->status |= IRQ_INPROGRESS; /* cleared during hvm eoi */
             }
         }
-        else if ( send_guest_pirq(d, pirq) &&
-                  (action->ack_type == ACKTYPE_NONE) )
-        {
-            already_pending++;
+        else {
+            if ( send_guest_pirq(d, pirq) ) {
+	        if ( action->ack_type == ACKTYPE_EOI && d->arch.pirq_lost)
+                    d->arch.pirq_lost[pirq]++;
+                else if ( action->ack_type == ACKTYPE_NONE )
+                    already_pending++;
+            }
         }
     }

Index: xen-4.1.1/xen/arch/x86/physdev.c
===================================================================
--- xen-4.1.1.orig/xen/arch/x86/physdev.c	2011-10-05 15:36:14.545815292 +0200
+++ xen-4.1.1/xen/arch/x86/physdev.c	2011-10-05 17:57:06.055986460 +0200
@@ -261,13 +261,18 @@ 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) ||
              domain_pirq_to_irq(v->domain, eoi.irq) > 0 )
-            ret = pirq_guest_eoi(v->domain, eoi.irq);
-        else
-            ret = 0;
+            pirq_guest_eoi(v->domain, eoi.irq);
+        if ( v->domain->arch.pirq_lost && v->domain->arch.pirq_lost[eoi.irq]) {
+            if ( !send_guest_pirq(v->domain, eoi.irq) )
+                v->domain->arch.pirq_lost[eoi.irq]--;
+        }
+        ret = 0;
+        spin_unlock(&v->domain->event_lock);
         break;
     }

@@ -323,9 +328,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;
         }

Index: xen-4.1.1/xen/include/asm-x86/domain.h
===================================================================
--- xen-4.1.1.orig/xen/include/asm-x86/domain.h	2011-10-05 15:10:11.709815293 +0200
+++ xen-4.1.1/xen/include/asm-x86/domain.h	2011-10-05 15:12:46.237815276 +0200
@@ -312,6 +312,9 @@ struct arch_domain
                                 (possibly other cases in the future */
     uint64_t vtsc_kerncount; /* for hvm, counts all vtsc */
     uint64_t vtsc_usercount; /* not used for hvm */
+
+    /* Protected by d->event_lock, count of lost pirqs */
+    int *pirq_lost;
 } __cacheline_aligned;

 #define has_arch_pdevs(d)    (!list_empty(&(d)->arch.pdev_list))

--------------070400090801000304000406
Content-Type: text/x-diff;
 name="xen-backport-pirq-lost.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="xen-backport-pirq-lost.patch"

Index: xen-4.1.1/xen/arch/x86/domain.c
===================================================================
--- xen-4.1.1.orig/xen/arch/x86/domain.c	2011-10-05 15:03:19.405815293 +0200
+++ xen-4.1.1/xen/arch/x86/domain.c	2011-10-05 15:09:59.781816622 +0200
@@ -514,6 +514,12 @@ int arch_domain_create(struct domain *d,
         memset(d->arch.pirq_irq, 0,
                d->nr_pirqs * sizeof(*d->arch.pirq_irq));
 
+        d->arch.pirq_lost = xmalloc_array(int, d->nr_pirqs);
+        if ( !d->arch.pirq_lost)
+            goto fail;
+        memset(d->arch.pirq_lost, 0,
+               d->nr_pirqs * sizeof(*d->arch.pirq_lost));
+
         d->arch.irq_pirq = xmalloc_array(int, nr_irqs);
         if ( !d->arch.irq_pirq )
             goto fail;
@@ -575,6 +581,7 @@ int arch_domain_create(struct domain *d,
  fail:
     d->is_dying = DOMDYING_dead;
     vmce_destroy_msr(d);
+    xfree(d->arch.pirq_lost);
     xfree(d->arch.pirq_irq);
     xfree(d->arch.irq_pirq);
     xfree(d->arch.pirq_emuirq);
@@ -628,6 +635,7 @@ void arch_domain_destroy(struct domain *
 #endif
 
     free_xenheap_page(d->shared_info);
+    xfree(d->arch.pirq_lost);
     xfree(d->arch.pirq_irq);
     xfree(d->arch.irq_pirq);
     xfree(d->arch.pirq_emuirq);
Index: xen-4.1.1/xen/arch/x86/hvm/irq.c
===================================================================
--- xen-4.1.1.orig/xen/arch/x86/hvm/irq.c	2011-10-05 15:14:35.441815292 +0200
+++ xen-4.1.1/xen/arch/x86/hvm/irq.c	2011-10-05 17:55:43.603986605 +0200
@@ -33,7 +33,9 @@ static void assert_gsi(struct domain *d,
     int pirq = domain_emuirq_to_pirq(d, ioapic_gsi);
     if ( hvm_domain_use_pirq(d, pirq) )
     {
-        send_guest_pirq(d, pirq);
+        if ( send_guest_pirq(d, pirq) && ioapic_gsi >= NR_ISAIRQS )
+            if (d->arch.pirq_lost)
+                d->arch.pirq_lost[pirq]++;
         return;
     }
     vioapic_irq_positive_edge(d, ioapic_gsi);
@@ -67,6 +69,12 @@ static void __hvm_pci_intx_assert(
     gsi = hvm_pci_intx_gsi(device, intx);
     if ( hvm_irq->gsi_assert_count[gsi]++ == 0 )
         assert_gsi(d, gsi);
+    else {
+        int pirq = domain_emuirq_to_pirq(d, gsi);
+
+        if ( hvm_domain_use_pirq(d, pirq) && d->arch.pirq_lost)
+            d->arch.pirq_lost[pirq]++;
+    }
 
     link    = hvm_pci_intx_link(device, intx);
     isa_irq = hvm_irq->pci_link.route[link];
Index: xen-4.1.1/xen/arch/x86/irq.c
===================================================================
--- xen-4.1.1.orig/xen/arch/x86/irq.c	2011-10-05 15:26:58.477815292 +0200
+++ xen-4.1.1/xen/arch/x86/irq.c	2011-10-05 17:56:23.191986535 +0200
@@ -888,10 +888,13 @@ static void __do_IRQ_guest(int irq)
                 desc->status |= IRQ_INPROGRESS; /* cleared during hvm eoi */
             }
         }
-        else if ( send_guest_pirq(d, pirq) &&
-                  (action->ack_type == ACKTYPE_NONE) )
-        {
-            already_pending++;
+        else {
+            if ( send_guest_pirq(d, pirq) ) {
+	        if ( action->ack_type == ACKTYPE_EOI && d->arch.pirq_lost)
+                    d->arch.pirq_lost[pirq]++;
+                else if ( action->ack_type == ACKTYPE_NONE )
+                    already_pending++;
+            }
         }
     }
 
Index: xen-4.1.1/xen/arch/x86/physdev.c
===================================================================
--- xen-4.1.1.orig/xen/arch/x86/physdev.c	2011-10-05 15:36:14.545815292 +0200
+++ xen-4.1.1/xen/arch/x86/physdev.c	2011-10-05 17:57:06.055986460 +0200
@@ -261,13 +261,18 @@ 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) ||
              domain_pirq_to_irq(v->domain, eoi.irq) > 0 )
-            ret = pirq_guest_eoi(v->domain, eoi.irq);
-        else
-            ret = 0;
+            pirq_guest_eoi(v->domain, eoi.irq);
+        if ( v->domain->arch.pirq_lost && v->domain->arch.pirq_lost[eoi.irq]) {
+            if ( !send_guest_pirq(v->domain, eoi.irq) )
+                v->domain->arch.pirq_lost[eoi.irq]--;
+        }
+        ret = 0;
+        spin_unlock(&v->domain->event_lock);
         break;
     }
 
@@ -323,9 +328,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;
         }
 
Index: xen-4.1.1/xen/include/asm-x86/domain.h
===================================================================
--- xen-4.1.1.orig/xen/include/asm-x86/domain.h	2011-10-05 15:10:11.709815293 +0200
+++ xen-4.1.1/xen/include/asm-x86/domain.h	2011-10-05 15:12:46.237815276 +0200
@@ -312,6 +312,9 @@ struct arch_domain
                                 (possibly other cases in the future */
     uint64_t vtsc_kerncount; /* for hvm, counts all vtsc */
     uint64_t vtsc_usercount; /* not used for hvm */
+
+    /* Protected by d->event_lock, count of lost pirqs */
+    int *pirq_lost;
 } __cacheline_aligned;
 
 #define has_arch_pdevs(d)    (!list_empty(&(d)->arch.pdev_list))

--------------070400090801000304000406
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

--------------070400090801000304000406--


From xen-devel-bounces@lists.xensource.com Wed Oct 05 09:26:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 09:26:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBUIC-0004vj-A0; Wed, 05 Oct 2011 09:26:00 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBUHJ-0004jW-UF
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 09:25:07 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1317831901!34092681!1
X-Originating-IP: [143.182.124.21]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11920 invoked from network); 5 Oct 2011 16:25:02 -0000
Received: from mga03.intel.com (HELO mga03.intel.com) (143.182.124.21)
	by server-4.tower-174.messagelabs.com with SMTP;
	5 Oct 2011 16:25:02 -0000
Received: from azsmga002.ch.intel.com ([10.2.17.35])
	by azsmga101.ch.intel.com with ESMTP; 05 Oct 2011 09:25:00 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,492,1312182000"; d="scan'208,217";a="23547400"
Received: from orsmsx604.amr.corp.intel.com ([10.22.226.87])
	by AZSMGA002.ch.intel.com with ESMTP; 05 Oct 2011 09:25:00 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx604.amr.corp.intel.com ([10.250.113.17]) with mapi;
	Wed, 5 Oct 2011 09:24:59 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
Date: Wed, 5 Oct 2011 09:24:58 -0700
Subject: RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Topic: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Index: AcyDGZd8Pz7nHlOVRpylkFYDFcuWMgAYZ9sw
Message-ID: <987664A83D2D224EAE907B061CE93D5301EE62D5F4@orsmsx505.amr.corp.intel.com>
References: <987664A83D2D224EAE907B061CE93D5301EE62D025@orsmsx505.amr.corp.intel.com>
	<4E8BE0DB.7040503@ts.fujitsu.com>
In-Reply-To: <4E8BE0DB.7040503@ts.fujitsu.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: "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>
Content-Type: multipart/mixed; boundary="===============1928280436=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1928280436==
Content-Language: en-US
Content-Type: multipart/alternative;
	boundary="_000_987664A83D2D224EAE907B061CE93D5301EE62D5F4orsmsx505amrc_"

--_000_987664A83D2D224EAE907B061CE93D5301EE62D5F4orsmsx505amrc_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

> This is fixed with cs 23049 in xen-unstable:

>

> http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html



I'm using the latest staging tree (cs# 23903) and still seeing this problem=
.



Allen


From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
Sent: Tuesday, October 04, 2011 9:45 PM
To: Kay, Allen M
Cc: xen-devel@lists.xensource.com; keir@xen.org
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config

On 10/04/2011 11:44 PM, Kay, Allen M wrote:
Hi Keir,

I'm getting the following build error caused by "-include $(XEN_ROOT)/.conf=
ig" line in Config.mk.  Removing it from Config.mk makes the error go away.=
  The OS I'm using is FC15.  "$(XEN_ROOT)/.config" does not exist.

Allen

-------

make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
make[4]: *** ../../.config: Is a directory.  Stop.
make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
make[3]: *** [subdir-clean-check] Error 2
make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
make[2]: *** [subdirs-clean] Error 2
make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
make[1]: *** [clean] Error 2
make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
make: *** [world] Error 2


This is fixed with cs 23049 in xen-unstable:

http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html


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<mailto:juergen.gross@ts.fujitsu.com>

Domagkstr. 28                           Internet: ts.fujitsu.com

D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.ht=
ml

--_000_987664A83D2D224EAE907B061CE93D5301EE62D5F4orsmsx505amrc_
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 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
	{font-family:"MS Mincho";
	panose-1:2 2 6 9 4 2 5 8 3 4;}
@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;}
@font-face
	{font-family:Tahoma;
	panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
	{font-family:"\@MS Mincho";
	panose-1:2 2 6 9 4 2 5 8 3 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	color:black;}
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;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
	{mso-style-priority:99;
	mso-style-link:"Plain Text Char";
	margin:0in;
	margin-bottom:.0001pt;
	font-size:10.5pt;
	font-family:Consolas;}
pre
	{mso-style-priority:99;
	mso-style-link:"HTML Preformatted Char";
	margin:0in;
	margin-bottom:.0001pt;
	font-size:10.0pt;
	font-family:"Courier New";
	color:black;}
tt
	{mso-style-priority:99;
	font-family:"Courier New";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	color:black;}
span.EmailStyle18
	{mso-style-type:personal;
	font-family:"Calibri","sans-serif";
	color:windowtext;}
span.HTMLPreformattedChar
	{mso-style-name:"HTML Preformatted Char";
	mso-style-priority:99;
	mso-style-link:"HTML Preformatted";
	font-family:Consolas;
	color:black;}
span.EmailStyle22
	{mso-style-type:personal-reply;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
span.PlainTextChar
	{mso-style-name:"Plain Text Char";
	mso-style-priority:99;
	mso-style-link:"Plain Text";
	font-family:Consolas;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:10.0pt;}
@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 bgcolor=3Dwhite lang=3DEN-US=
 link=3Dblue vlink=3Dpurple><div class=3DWordSection1><p class=3DMsoPlainTe=
xt><span style=3D'font-family:"MS Mincho"'>&gt; </span>This is fixed with c=
s 23049 in xen-unstable:<o:p></o:p></p><p class=3DMsoPlainText>&gt; <o:p></=
o:p></p><p class=3DMsoPlainText>&gt; http://lists.xensource.com/archives/ht=
ml/xen-devel/2011-03/msg01251.html<o:p></o:p></p><p class=3DMsoPlainText><o=
:p>&nbsp;</o:p></p><p class=3DMsoPlainText>I&#8217;m using the latest stagi=
ng tree (cs# 23903) and still seeing this problem.<o:p></o:p></p><p class=
=3DMsoPlainText><o:p>&nbsp;</o:p></p><p class=3DMsoPlainText>Allen<o:p></o:=
p></p><p class=3DMsoNormal><span style=3D'color:#1F497D'><o:p>&nbsp;</o:p><=
/span></p><p class=3DMsoNormal><span style=3D'color:#1F497D'><o:p>&nbsp;</o=
:p></span></p><div><div style=3D'border:none;border-top:solid #B5C4DF 1.0pt=
;padding:3.0pt 0in 0in 0in'><p class=3DMsoNormal><b><span style=3D'font-siz=
e:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext'>From:</span></=
b><span style=3D'font-size:10.0pt;font-family:"Tahoma","sans-serif";color:w=
indowtext'> Juergen Gross [mailto:juergen.gross@ts.fujitsu.com] <br><b>Sent=
:</b> Tuesday, October 04, 2011 9:45 PM<br><b>To:</b> Kay, Allen M<br><b>Cc=
:</b> xen-devel@lists.xensource.com; keir@xen.org<br><b>Subject:</b> Re: [X=
en-devel] build failure caused by $(XEN_ROOT)/.config<o:p></o:p></span></p>=
</div></div><p class=3DMsoNormal><o:p>&nbsp;</o:p></p><p class=3DMsoNormal>=
On 10/04/2011 11:44 PM, Kay, Allen M wrote: <o:p></o:p></p><p class=3DMsoNo=
rmal>Hi Keir,<o:p></o:p></p><p class=3DMsoNormal>&nbsp;<o:p></o:p></p><p cl=
ass=3DMsoNormal>I&#8217;m getting the following build error caused by &#822=
0;-include $(XEN_ROOT)/.config&#8221; line in Config.mk.&nbsp; Removing it =
from Config.mk makes the error go away.&nbsp; The OS I&#8217;m using is FC1=
5.&nbsp; &#8220;$(XEN_ROOT)/.config&#8221; does not exist.<o:p></o:p></p><p=
 class=3DMsoNormal>&nbsp;<o:p></o:p></p><p class=3DMsoNormal>Allen<o:p></o:=
p></p><p class=3DMsoNormal>&nbsp;<o:p></o:p></p><p class=3DMsoNormal>------=
-<o:p></o:p></p><p class=3DMsoNormal>&nbsp;<o:p></o:p></p><p class=3DMsoNor=
mal>make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'=
<o:p></o:p></p><p class=3DMsoNormal>make[4]: *** ../../.config: Is a direct=
ory.&nbsp; Stop.<o:p></o:p></p><p class=3DMsoNormal>make[4]: Leaving direct=
ory `/home/akay/xen-4.1-testing.hg/tools/check'<o:p></o:p></p><p class=3DMs=
oNormal>make[3]: *** [subdir-clean-check] Error 2<o:p></o:p></p><p class=3D=
MsoNormal>make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'<=
o:p></o:p></p><p class=3DMsoNormal>make[2]: *** [subdirs-clean] Error 2<o:p=
></o:p></p><p class=3DMsoNormal>make[2]: Leaving directory `/home/akay/xen-=
4.1-testing.hg/tools'<o:p></o:p></p><p class=3DMsoNormal>make[1]: *** [clea=
n] Error 2<o:p></o:p></p><p class=3DMsoNormal>make[1]: Leaving directory `/=
home/akay/xen-4.1-testing.hg'<o:p></o:p></p><p class=3DMsoNormal>make: *** =
[world] Error 2<o:p></o:p></p><p class=3DMsoNormal><span style=3D'font-size=
:12.0pt;font-family:"Times New Roman","serif"'><o:p>&nbsp;</o:p></span></p>=
<p class=3DMsoNormal><span style=3D'font-size:12.0pt;font-family:"Times New=
 Roman","serif"'><br></span><tt><span style=3D'font-size:10.0pt'>This is fi=
xed with cs 23049 in xen-unstable:</span></tt><span style=3D'font-size:10.0=
pt;font-family:"Courier New"'><br><br><tt><a href=3D"http://lists.xensource=
.com/archives/html/xen-devel/2011-03/msg01251.html">http://lists.xensource.=
com/archives/html/xen-devel/2011-03/msg01251.html</a></tt><br><br><br><tt>J=
uergen</tt><br><br></span><span style=3D'font-size:12.0pt;font-family:"Time=
s New Roman","serif"'><o:p></o:p></span></p><pre>-- <o:p></o:p></pre><pre>J=
uergen Gross&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Principal Developer Operating Systems<o:p=
></o:p></pre><pre>PDG ES&amp;S SWE OS6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp; Telephone: +49 (0) 89 3222 2967<o:p></o:p></pre><pre>F=
ujitsu Technology Solutions&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e-mail: <a href=3D"mailto:juergen.gross@ts.f=
ujitsu.com">juergen.gross@ts.fujitsu.com</a><o:p></o:p></pre><pre>Domagkstr=
. 28&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; Internet: ts.fujitsu.com<o:p></o:p></pre><pre>D-80807 Muenchen&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp; Company details: ts.fujitsu.com/imprint.html<o:p></o:p>=
</pre></div></body></html>=

--_000_987664A83D2D224EAE907B061CE93D5301EE62D5F4orsmsx505amrc_--


--===============1928280436==
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

--===============1928280436==--


From xen-devel-bounces@lists.xensource.com Wed Oct 05 09:43:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 09:43:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBUYl-0006Yk-Vf; Wed, 05 Oct 2011 09:43:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBUY5-0006ML-Sp
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 09:42:26 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317832926!52682157!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5165 invoked from network); 5 Oct 2011 16:42:06 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 16:42:06 -0000
Received: by wwf27 with SMTP id 27so2398808wwf.24
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 09:42:22 -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;
	bh=R8hCHVUj+7zHBMu5lSvoBL7SinPf4C+F16tb7+L3m7A=;
	b=KrbDXisCDOdGCmM1+pthUl0P4DjYe9MdIY2lVVt4EVO0ZKkEosGn9Wt65tybnaQIWv
	shlybh6J/bRfI86W0rwWVooafr/xpU4OWhoQFyajrNODc+SmMnTppoRmE9EC3fcd3DJk
	a6X9ZeUDB+4maH/Nsdah7829seTjJM8WpDidM=
Received: by 10.227.146.76 with SMTP id g12mr3283543wbv.110.1317832942165;
	Wed, 05 Oct 2011 09:42:22 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id s30sm3829546wbm.12.2011.10.05.09.42.19
	(version=SSLv3 cipher=OTHER); Wed, 05 Oct 2011 09:42:20 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Wed, 05 Oct 2011 17:42:18 +0100
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
From: Keir Fraser <keir.xen@gmail.com>
To: "Kay, Allen M" <allen.m.kay@intel.com>,
	Juergen Gross <juergen.gross@ts.fujitsu.com>
Message-ID: <CAB2477A.2240E%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Index: AcyDGZd8Pz7nHlOVRpylkFYDFcuWMgAYZ9swAACh8So=
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301EE62D5F4@orsmsx505.amr.corp.intel.com>
Mime-version: 1.0
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>
Content-Type: multipart/mixed; boundary="===============1933472908=="
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.

--===============1933472908==
Content-type: multipart/alternative;
	boundary="B_3400681340_49418562"

> 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_3400681340_49418562
Content-type: text/plain;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable

Perhaps we=B9re best off just checking in an empty .config, and also adding i=
t
to .hgignore.

 -- Keir

On 05/10/2011 17:24, "Kay, Allen M" <allen.m.kay@intel.com> wrote:

>> > This is fixed with cs 23049 in xen-unstable:
>> >=20
>> > http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.ht=
ml
> =20
> I=B9m using the latest staging tree (cs# 23903) and still seeing this probl=
em.
> =20
> Allen
> =20
> =20
>=20
> From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
> Sent: Tuesday, October 04, 2011 9:45 PM
> To: Kay, Allen M
> Cc: xen-devel@lists.xensource.com; keir@xen.org
> Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
> =20
> On 10/04/2011 11:44 PM, Kay, Allen M wrote:
> Hi Keir,
> =20
> I=B9m getting the following build error caused by =B3-include $(XEN_ROOT)/.co=
nfig=B2
> line in Config.mk.  Removing it from Config.mk makes the error go away.  =
The
> OS I=B9m using is FC15.  =B3$(XEN_ROOT)/.config=B2 does not exist.
> =20
> Allen
> =20
> -------
> =20
> make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
> make[4]: *** ../../.config: Is a directory.  Stop.
> make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
> make[3]: *** [subdir-clean-check] Error 2
> make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
> make[2]: *** [subdirs-clean] Error 2
> make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
> make[1]: *** [clean] Error 2
> make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
> make: *** [world] Error 2
> =20
>=20
> This is fixed with cs 23049 in xen-unstable:
>=20
> http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html
>=20
>=20
> Juergen


--B_3400681340_49418562
Content-type: text/html;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable

<HTML>
<HEAD>
<TITLE>Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config</TITLE>
</HEAD>
<BODY>
<FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN STYLE=3D'font-size:11pt=
'>Perhaps we&#8217;re best off just checking in an empty .config, and also a=
dding it to .hgignore.<BR>
<BR>
&nbsp;-- Keir<BR>
<BR>
On 05/10/2011 17:24, &quot;Kay, Allen M&quot; &lt;<a href=3D"allen.m.kay@inte=
l.com">allen.m.kay@intel.com</a>&gt; wrote:<BR>
<BR>
</SPAN></FONT><BLOCKQUOTE><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><=
FONT SIZE=3D"2"><SPAN STYLE=3D'font-size:10pt'>&gt; </SPAN></FONT></FONT><FONT S=
IZE=3D"2"><SPAN STYLE=3D'font-size:10pt'><FONT FACE=3D"Consolas, Courier New, Cour=
ier">This is fixed with cs 23049 in xen-unstable:<BR>
&gt; <BR>
&gt; <a href=3D"http://lists.xensource.com/archives/html/xen-devel/2011-03/ms=
g01251.html">http://lists.xensource.com/archives/html/xen-devel/2011-03/msg0=
1251.html</a><BR>
&nbsp;<BR>
I&#8217;m using the latest staging tree (cs# 23903) and still seeing this p=
roblem.<BR>
&nbsp;<BR>
Allen<BR>
</FONT></SPAN></FONT><FONT COLOR=3D"#1F497D"><FONT FACE=3D"Calibri, Verdana, He=
lvetica, Arial"><SPAN STYLE=3D'font-size:11pt'> <BR>
&nbsp;<BR>
</SPAN></FONT></FONT><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN =
STYLE=3D'font-size:11pt'><BR>
</SPAN></FONT><FONT SIZE=3D"2"><FONT FACE=3D"Tahoma, Verdana, Helvetica, Arial"=
><SPAN STYLE=3D'font-size:10pt'><B>From:</B> Juergen Gross [<a href=3D"mailto:ju=
ergen.gross@ts.fujitsu.com">mailto:juergen.gross@ts.fujitsu.com</a>] <BR>
<B>Sent:</B> Tuesday, October 04, 2011 9:45 PM<BR>
<B>To:</B> Kay, Allen M<BR>
<B>Cc:</B> <a href=3D"xen-devel@lists.xensource.com">xen-devel@lists.xensourc=
e.com</a>; <a href=3D"keir@xen.org">keir@xen.org</a><BR>
<B>Subject:</B> Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config=
<BR>
</SPAN></FONT></FONT><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN =
STYLE=3D'font-size:11pt'> <BR>
On 10/04/2011 11:44 PM, Kay, Allen M wrote: <BR>
Hi Keir,<BR>
&nbsp;<BR>
I&#8217;m getting the following build error caused by &#8220;-include $(XEN=
_ROOT)/.config&#8221; line in Config.mk. &nbsp;Removing it from Config.mk ma=
kes the error go away. &nbsp;The OS I&#8217;m using is FC15. &nbsp;&#8220;$(=
XEN_ROOT)/.config&#8221; does not exist.<BR>
&nbsp;<BR>
Allen<BR>
&nbsp;<BR>
-------<BR>
&nbsp;<BR>
make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'<BR>
make[4]: *** ../../.config: Is a directory. &nbsp;Stop.<BR>
make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'<BR>
make[3]: *** [subdir-clean-check] Error 2<BR>
make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'<BR>
make[2]: *** [subdirs-clean] Error 2<BR>
make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'<BR>
make[1]: *** [clean] Error 2<BR>
make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'<BR>
make: *** [world] Error 2<BR>
</SPAN></FONT><FONT FACE=3D"Times New Roman"><SPAN STYLE=3D'font-size:12pt'> <B=
R>
<BR>
</SPAN></FONT><FONT SIZE=3D"2"><FONT FACE=3D"Courier New"><SPAN STYLE=3D'font-siz=
e:10pt'>This is fixed with cs 23049 in xen-unstable:<BR>
<BR>
<a href=3D"http://lists.xensource.com/archives/html/xen-devel/2011-03/msg0125=
1.html">http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.=
html</a><BR>
<BR>
<BR>
Juergen<BR>
</SPAN></FONT></FONT></BLOCKQUOTE>
</BODY>
</HTML>


--B_3400681340_49418562--




--===============1933472908==
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

--===============1933472908==--




From xen-devel-bounces@lists.xensource.com Wed Oct 05 09:44:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 09:44:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBUZq-0006ve-15; Wed, 05 Oct 2011 09:44:14 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBUZ1-0006cj-75
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 09:43:24 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1317832999!30377784!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32744 invoked from network); 5 Oct 2011 16:43:19 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 16:43:19 -0000
Received: by wwf27 with SMTP id 27so2399903wwf.24
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 09:43:19 -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;
	bh=JekDBui0fscfGGud9X4sHi3jYLjaAMz97TRmyudsipA=;
	b=PVatdfK1+qITikR2tgZJMetOvwUgUcgQD6c8fm758ZfJyohlkeViiamzkIOWs+mHW8
	8yMF5mCd4HDIMogDUZdFol3oFYw6zMfjPxCLEG7H5I786r1vbNvcK7AGJiQxP+bLqDU8
	9nYxdGXfw+sxTRuTHyU3LQ0tDBY0vmLef9j7k=
Received: by 10.227.58.200 with SMTP id i8mr3397057wbh.2.1317832999407;
	Wed, 05 Oct 2011 09:43:19 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id p13sm3838980wbh.13.2011.10.05.09.43.16
	(version=SSLv3 cipher=OTHER); Wed, 05 Oct 2011 09:43:18 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Wed, 05 Oct 2011 17:43:14 +0100
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
From: Keir Fraser <keir.xen@gmail.com>
To: "Kay, Allen M" <allen.m.kay@intel.com>,
	Juergen Gross <juergen.gross@ts.fujitsu.com>
Message-ID: <CAB247B2.22419%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Index: AcyDGZd8Pz7nHlOVRpylkFYDFcuWMgAYZ9swAACh8SoAAAhYeQ==
In-Reply-To: <CAB2477A.2240E%keir.xen@gmail.com>
Mime-version: 1.0
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>
Content-Type: multipart/mixed; boundary="===============1470790029=="
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.

--===============1470790029==
Content-type: multipart/alternative;
	boundary="B_3400681397_49401468"

> 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_3400681397_49401468
Content-type: text/plain;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable

I=B9ll add though that this bug doesn=B9t happen for me, and I too am using F15=
.


On 05/10/2011 17:42, "Keir Fraser" <keir.xen@gmail.com> wrote:

> Perhaps we=B9re best off just checking in an empty .config, and also adding=
 it
> to .hgignore.
>=20
>  -- Keir
>=20
> On 05/10/2011 17:24, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
>=20
>>> > This is fixed with cs 23049 in xen-unstable:
>>> >=20
>>> > http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.h=
tml
>> =20
>> I=B9m using the latest staging tree (cs# 23903) and still seeing this prob=
lem.
>> =20
>> Allen
>> =20
>> =20
>>=20
>> From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
>> Sent: Tuesday, October 04, 2011 9:45 PM
>> To: Kay, Allen M
>> Cc: xen-devel@lists.xensource.com; keir@xen.org
>> Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
>> =20
>> On 10/04/2011 11:44 PM, Kay, Allen M wrote:
>> Hi Keir,
>> =20
>> I=B9m getting the following build error caused by =B3-include
>> $(XEN_ROOT)/.config=B2 line in Config.mk.  Removing it from Config.mk make=
s the
>> error go away.  The OS I=B9m using is FC15.  =B3$(XEN_ROOT)/.config=B2 does no=
t
>> exist.
>> =20
>> Allen
>> =20
>> -------
>> =20
>> make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
>> make[4]: *** ../../.config: Is a directory.  Stop.
>> make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
>> make[3]: *** [subdir-clean-check] Error 2
>> make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
>> make[2]: *** [subdirs-clean] Error 2
>> make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
>> make[1]: *** [clean] Error 2
>> make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
>> make: *** [world] Error 2
>> =20
>>=20
>> This is fixed with cs 23049 in xen-unstable:
>>=20
>> http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html
>>=20
>>=20
>> Juergen
>=20


--B_3400681397_49401468
Content-type: text/html;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable

<HTML>
<HEAD>
<TITLE>Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config</TITLE>
</HEAD>
<BODY>
<FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN STYLE=3D'font-size:11pt=
'>I&#8217;ll add though that this bug doesn&#8217;t happen for me, and I too=
 am using F15.<BR>
<BR>
<BR>
On 05/10/2011 17:42, &quot;Keir Fraser&quot; &lt;<a href=3D"keir.xen@gmail.co=
m">keir.xen@gmail.com</a>&gt; wrote:<BR>
<BR>
</SPAN></FONT><BLOCKQUOTE><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><=
SPAN STYLE=3D'font-size:11pt'>Perhaps we&#8217;re best off just checking in an=
 empty .config, and also adding it to .hgignore.<BR>
<BR>
&nbsp;-- Keir<BR>
<BR>
On 05/10/2011 17:24, &quot;Kay, Allen M&quot; &lt;<a href=3D"allen.m.kay@inte=
l.com">allen.m.kay@intel.com</a>&gt; wrote:<BR>
<BR>
</SPAN></FONT><BLOCKQUOTE><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><=
FONT SIZE=3D"2"><SPAN STYLE=3D'font-size:10pt'>&gt; </SPAN></FONT></FONT><FONT S=
IZE=3D"2"><SPAN STYLE=3D'font-size:10pt'><FONT FACE=3D"Consolas, Courier New, Cour=
ier">This is fixed with cs 23049 in xen-unstable:<BR>
&gt; <BR>
&gt; <a href=3D"http://lists.xensource.com/archives/html/xen-devel/2011-03/ms=
g01251.html">http://lists.xensource.com/archives/html/xen-devel/2011-03/msg0=
1251.html</a><BR>
&nbsp;<BR>
I&#8217;m using the latest staging tree (cs# 23903) and still seeing this p=
roblem.<BR>
&nbsp;<BR>
Allen<BR>
</FONT></SPAN></FONT><FONT COLOR=3D"#1F497D"><FONT FACE=3D"Calibri, Verdana, He=
lvetica, Arial"><SPAN STYLE=3D'font-size:11pt'> <BR>
&nbsp;<BR>
</SPAN></FONT></FONT><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN =
STYLE=3D'font-size:11pt'><BR>
</SPAN></FONT><FONT SIZE=3D"2"><FONT FACE=3D"Tahoma, Verdana, Helvetica, Arial"=
><SPAN STYLE=3D'font-size:10pt'><B>From:</B> Juergen Gross [<a href=3D"mailto:ju=
ergen.gross@ts.fujitsu.com">mailto:juergen.gross@ts.fujitsu.com</a>] <BR>
<B>Sent:</B> Tuesday, October 04, 2011 9:45 PM<BR>
<B>To:</B> Kay, Allen M<BR>
<B>Cc:</B> <a href=3D"xen-devel@lists.xensource.com">xen-devel@lists.xensourc=
e.com</a>; <a href=3D"keir@xen.org">keir@xen.org</a><BR>
<B>Subject:</B> Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config=
<BR>
</SPAN></FONT></FONT><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN =
STYLE=3D'font-size:11pt'> <BR>
On 10/04/2011 11:44 PM, Kay, Allen M wrote: <BR>
Hi Keir,<BR>
&nbsp;<BR>
I&#8217;m getting the following build error caused by &#8220;-include $(XEN=
_ROOT)/.config&#8221; line in Config.mk. &nbsp;Removing it from Config.mk ma=
kes the error go away. &nbsp;The OS I&#8217;m using is FC15. &nbsp;&#8220;$(=
XEN_ROOT)/.config&#8221; does not exist.<BR>
&nbsp;<BR>
Allen<BR>
&nbsp;<BR>
-------<BR>
&nbsp;<BR>
make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'<BR>
make[4]: *** ../../.config: Is a directory. &nbsp;Stop.<BR>
make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'<BR>
make[3]: *** [subdir-clean-check] Error 2<BR>
make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'<BR>
make[2]: *** [subdirs-clean] Error 2<BR>
make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'<BR>
make[1]: *** [clean] Error 2<BR>
make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'<BR>
make: *** [world] Error 2<BR>
</SPAN></FONT><FONT FACE=3D"Times New Roman"><SPAN STYLE=3D'font-size:12pt'> <B=
R>
<BR>
</SPAN></FONT><FONT SIZE=3D"2"><FONT FACE=3D"Courier New"><SPAN STYLE=3D'font-siz=
e:10pt'>This is fixed with cs 23049 in xen-unstable:<BR>
<BR>
<a href=3D"http://lists.xensource.com/archives/html/xen-devel/2011-03/msg0125=
1.html">http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.=
html</a><BR>
<BR>
<BR>
Juergen<BR>
</SPAN></FONT></FONT></BLOCKQUOTE><FONT FACE=3D"Calibri, Verdana, Helvetica, =
Arial"><SPAN STYLE=3D'font-size:11pt'><BR>
</SPAN></FONT></BLOCKQUOTE>
</BODY>
</HTML>


--B_3400681397_49401468--




--===============1470790029==
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

--===============1470790029==--




From xen-devel-bounces@lists.xensource.com Wed Oct 05 09:47:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 09:47:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBUcv-0007Ka-A9; Wed, 05 Oct 2011 09:47:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBUcO-00078E-BD
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 09:46:53 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1317833209!16062210!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17058 invoked from network); 5 Oct 2011 16:46:49 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 16:46:49 -0000
Received: by eyd10 with SMTP id 10so1087774eyd.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 09:46:49 -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=937k9eUgO9vhve1Aivd7b4QSxykMwgOcC8anTdNxiXA=;
	b=N+FdlPQoREnw4oh2PTk0fiTZ8OGn/JPuXDV4sOmpLnuO9T3q6JfUOKntx6hmHA4v0T
	GEyEXSIbd7Lw7skGCIzJrSVq0RCgKIQZhKGuNA62i36MF6VjlRunaazgFrKkSHIEXCUy
	qV62hHlWg1ro/AycCvsrWmY3Yy+1qgi6OnMJA=
Received: by 10.216.163.194 with SMTP id a44mr3265950wel.1.1317833209061;
	Wed, 05 Oct 2011 09:46:49 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id s30sm3851571wbm.12.2011.10.05.09.46.44
	(version=SSLv3 cipher=OTHER); Wed, 05 Oct 2011 09:46:47 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Wed, 05 Oct 2011 17:46:42 +0100
From: Keir Fraser <keir@xen.org>
To: Andrew Cooper <andrew.cooper3@citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CAB24882.31D46%keir@xen.org>
Thread-Topic: Recommend backporting unstable 23685:5239811f92e1 to 4.1-testing
Thread-Index: AcyDflwHdVNEQlUTd0yJXT9ILupjSw==
In-Reply-To: <4E8C733E.9010600@citrix.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] Re: Recommend backporting unstable 23685:5239811f92e1
	to 4.1-testing
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 05/10/2011 16:09, "Andrew Cooper" <andrew.cooper3@citrix.com> wrote:

> XenServer is suffering the segfault with Xen-4.1.
> 
> The changeset does not cleanly apply because of 4.1-testing
> 23160:5c395e993fe4 affecting the same hunk, but the backport is trivial.

No point ccing me on a toolstack patch. This needs to be backported, or
acked/nacked, by e.g. IanJ. ASAP preferably then we can get the next RC
rolling.

 -- Keir



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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 09:48:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 09:48:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBUeD-0007n0-03; Wed, 05 Oct 2011 09:48:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBUdH-0007TV-RC
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 09:47:49 -0700
X-Env-Sender: brendan@cs.ubc.ca
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317833247!52682940!1
X-Originating-IP: [198.162.52.68]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18219 invoked from network); 5 Oct 2011 16:47:28 -0000
Received: from zakopane.cs.ubc.ca (HELO mail.quuxuum.com) (198.162.52.68)
	by server-12.tower-21.messagelabs.com with SMTP;
	5 Oct 2011 16:47:28 -0000
Received: from zanzibar.kublai.com (kremvax.kublai.com [IPv6:2001:470:e865::3])
	by mail.quuxuum.com (Postfix) with ESMTPSA id 8D1745FD90;
	Wed,  5 Oct 2011 09:47:06 -0700 (PDT)
Date: Wed, 5 Oct 2011 09:47:42 -0700
From: Brendan Cully <brendan@cs.ubc.ca>
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Message-ID: <20111005164742.GC25877@zanzibar.kublai.com>
Mail-Followup-To: Keir Fraser <keir.xen@gmail.com>,
	"Kay, Allen M" <allen.m.kay@intel.com>,
	Juergen Gross <juergen.gross@ts.fujitsu.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"keir@xen.org" <keir@xen.org>
References: <987664A83D2D224EAE907B061CE93D5301EE62D5F4@orsmsx505.amr.corp.intel.com>
	<CAB2477A.2240E%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: <CAB2477A.2240E%keir.xen@gmail.com>
X-Operating-System: Darwin 11.1.0 i386
User-Agent: Mutt/1.5.21+46 (b01d63af6fea) (2011-07-01)
Cc: "keir@xen.org" <keir@xen.org>, Juergen Gross <juergen.gross@ts.fujitsu.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Kay, Allen M" <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 Wednesday, 05 October 2011 at 17:42, Keir Fraser wrote:
> Perhaps we¹re best off just checking in an empty .config, and also adding it
> to .hgignore.

hg won't ignore checked-in files.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 09:52:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 09:52:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBUhT-0008D4-LP; Wed, 05 Oct 2011 09:52:07 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBUgv-00080e-NZ
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 09:51:34 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1317833490!20908157!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26015 invoked from network); 5 Oct 2011 16:51:30 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-14.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 16:51:30 -0000
Received: by wyh13 with SMTP id 13so2509077wyh.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 09:51:30 -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=Mx8lKAtm7jalR4tsLFn+mVaMe7dx2Q3SlDcKrhWenDo=;
	b=TDaNeAXz3Vj8Dnuhd0ivygUHM/mwh3QswCc26baG0wIwr01yyrAOUovS1MsoQT0dTo
	MLD9bq9kbphYf3glpvaFG2q/b+z/PScZHfWBLahoKU43xtA98U6YurrBU+XCXi8k4IOL
	H0t1Jk8+AigCFTTUmglIAtyk+r2aw2wH66IIY=
Received: by 10.227.154.140 with SMTP id o12mr3294204wbw.104.1317833490446;
	Wed, 05 Oct 2011 09:51:30 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id fo7sm3847279wbb.20.2011.10.05.09.51.25
	(version=SSLv3 cipher=OTHER); Wed, 05 Oct 2011 09:51:29 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Wed, 05 Oct 2011 17:51:20 +0100
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
From: Keir Fraser <keir@xen.org>
To: Brendan Cully <brendan@cs.ubc.ca>,
	Keir Fraser <keir.xen@gmail.com>
Message-ID: <CAB24998.31D4F%keir@xen.org>
Thread-Topic: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Index: AcyDfwG6TTsUPXXREEGMJLnMT7Lkuw==
In-Reply-To: <20111005164742.GC25877@zanzibar.kublai.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable
Cc: Juergen Gross <juergen.gross@ts.fujitsu.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Kay, Allen M" <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 05/10/2011 17:47, "Brendan Cully" <brendan@cs.ubc.ca> wrote:

> On Wednesday, 05 October 2011 at 17:42, Keir Fraser wrote:
>> Perhaps we=B9re best off just checking in an empty .config, and also addin=
g it
>> to .hgignore.
>=20
> hg won't ignore checked-in files.

I suppose that makes sense really. And of course .config is already in our
.hgignore.

 -- Keir



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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 09:57:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 09:57:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBUmQ-0000DJ-CY; Wed, 05 Oct 2011 09:57:14 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBUlq-0008RF-2u
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 09:56:38 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1317833762!57584000!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30745 invoked from network); 5 Oct 2011 16:56:02 -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;
	5 Oct 2011 16:56:02 -0000
X-IronPort-AV: E=Sophos;i="4.68,492,1312156800"; 
   d="scan'208";a="8232283"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	05 Oct 2011 16:56:34 +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, 5 Oct 2011
	17:56:34 +0100
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Keir Fraser <keir@xen.org>
Date: Wed, 5 Oct 2011 17:56:33 +0100
In-Reply-To: <CAB24998.31D4F%keir@xen.org>
References: <CAB24998.31D4F%keir@xen.org>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317833794.21903.223.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Brendan Cully <brendan@cs.ubc.ca>,
	Juergen Gross <juergen.gross@ts.fujitsu.com>,
	Keir Fraser <keir.xen@gmail.com>, "Kay, Allen M" <allen.m.kay@intel.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 Wed, 2011-10-05 at 17:51 +0100, Keir Fraser wrote:
> On 05/10/2011 17:47, "Brendan Cully" <brendan@cs.ubc.ca> wrote:
> 
> > On Wednesday, 05 October 2011 at 17:42, Keir Fraser wrote:
> >> Perhaps weÂ¹re best off just checking in an empty .config, and also adding it
> >> to .hgignore.
> > 
> > hg won't ignore checked-in files.
> 
> I suppose that makes sense really. And of course .config is already in our
> .hgignore.

Can we convince Makefile to touch it if it doesn't exist?

Ian.


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 10:05:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 10:05:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBUuR-0000hc-P2; Wed, 05 Oct 2011 10:05:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBUsd-0000U1-Ij
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 10:03:54 -0700
X-Env-Sender: xieliwei@gmail.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1317834214!19882212!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21369 invoked from network); 5 Oct 2011 17:03:35 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	5 Oct 2011 17:03:35 -0000
Received: by yxt3 with SMTP id 3so2969538yxt.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 10:03:34 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:from:date:message-id:subject:to:cc:content-type;
	bh=7J9stk2n7NJK+f+FsQsUZPAht9iiyvDIMJTZBXtYaSs=;
	b=ds+cDuNAiNqBaRfDRD5+qNqAnnGBmGGgmZR1S/PN1RStTg0ydhU1jJKoDKoj39OG4T
	5z2KGq4aP6DislAuFIbjBaYambsa+zTyAGSNentN0SL5OIItp0bVjIDt24b8Zgo0qY2d
	xC/UEy2xrfRb4XrXOwqjN2PceNlHEpNkPmbvY=
Received: by 10.101.197.39 with SMTP id z39mr2202963anp.167.1317834214220;
	Wed, 05 Oct 2011 10:03:34 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.100.201.19 with HTTP; Wed, 5 Oct 2011 10:03:14 -0700 (PDT)
From: Liwei <xieliwei@gmail.com>
Date: Thu, 6 Oct 2011 01:03:14 +0800
Message-ID: <CAPE0SYwSPDu3eKiYq22E7x8f=4_5dracOShGQ7AjG_OicZdU5Q@mail.gmail.com>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: multipart/mixed; boundary=0016e6d27ccd36246104ae9030c4
Cc: Dima Tisnek <dimaqq@gmail.com>
Subject: [Xen-devel] MMIO emulation failed & successful reboot
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

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

Hello list,
    Did an update to the latest AMD drivers
(11-9_vista64_win7_64_dd_ccc_ocl) and was pleasantly surprised to find
that I can reboot my passthrough domU!
    Firstly, the reboot was triggered involuntarily shortly (20
seconds) AFTER the SUCCESSFUL driver update. The only thing logged was
this:
        (XEN) io.c:194:d5 MMIO emulation failed @
0010:fffff800036c7d00: 0f 28 04 10 0f 28
    The domU and qemu spontaneously disappeared (the qemu log just
stops there and logs nothing), and reappeared, as a new domU instance
was automatically spawned.
    This first reboot would be unsuccessful, encountering a BSOD at
the pulsating logo stage:
        "Attempt to reset the display driver and recover from timeout failed"
    The second try would be successful.

    The awesome thing is, I tried normally rebooting the domU a few
times after that, no problems! =)

    Attached is the full log captured between the start of the driver
update and the second (successful) reboot.

Liwei

--0016e6d27ccd36246104ae9030c4
Content-Type: text/plain; charset=US-ASCII;
	name="DriverUpdateMMIOEmulationFail.txt"
Content-Disposition: attachment; filename="DriverUpdateMMIOEmulationFail.txt"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gtekfa3u0

LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRHJpdmVyIFVwZGF0ZSBTdGFydHMNCi0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0NCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFwOmFkZDog
Z2ZuPTAgbWZuPWJmZjAwIG5yX21mbnM9MjANCihYRU4pIGRvbWN0bC5jOjk5MjpkMCBtZW1vcnlf
bWFwOnJlbW92ZTogZ2ZuPTAgbWZuPWJmZjAwIG5yX21mbnM9MjANCihYRU4pIGRvbWN0bC5jOjk5
MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWUwMDAwIG1mbj1jMDAwMCBucl9tZm5zPTEwMDAw
DQooWEVOKSBkb21jdGwuYzo5OTI6ZDAgbWVtb3J5X21hcDpyZW1vdmU6IGdmbj1mMzAyMCBtZm49
ZmE1MDAgbnJfbWZucz0yMA0KKFhFTikgZG9tY3RsLmM6MTA2MjpkMCBpb3BvcnRfbWFwOnJlbW92
ZSBmX2dwb3J0PWMxMDAgZl9tcG9ydD02MDAwIG5wPTEwMA0KKFhFTikgZG9tY3RsLmM6OTgyOmQw
IG1lbW9yeV9tYXA6YWRkOiBnZm49ZTAwMDAgbWZuPWMwMDAwIG5yX21mbnM9MTAwMDANCihYRU4p
IGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDIwIG1mbj1mYTUwMCBucl9t
Zm5zPTIwDQooWEVOKSBkb21jdGwuYzoxMDM4OmQwIGlvcG9ydF9tYXA6YWRkIGZfZ3BvcnQ9YzEw
MCBmX21wb3J0PTYwMDAgbnA9MTAwDQooWEVOKSBzdGR2Z2EuYzoxNDc6ZDUgZW50ZXJpbmcgc3Rk
dmdhIGFuZCBjYWNoaW5nIG1vZGVzDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpTaG9ydGx5
IEFmdGVyIERyaXZlciBVcGRhdGUgRW5kcw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKFhF
TikgaW8uYzoxOTQ6ZDUgTU1JTyBlbXVsYXRpb24gZmFpbGVkIEAgMDAxMDpmZmZmZjgwMDAzNmM3
ZDAwOiAwZiAyOCAwNCAxMCAwZiAyOA0KWzQ0MDM3NC40ODAzMDJdIHZpZiB2aWYtNS0wOiAyIHJl
YWRpbmcgc2NyaXB0DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkb21VIFJlc3RhcnRzDQot
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpbNDQwMzc4Ljc3MjMwM10gdmJkIHZiZC0xMC03Njg6
IDIgY3JlYXRpbmcgdmJkIHN0cnVjdHVyZQ0KKFhFTikgcGh5c2Rldi5jOjE3MDogZG9tMTA6IDE2
Oi0xIGFscmVhZHkgbWFwcGVkIHRvIDE2DQooWEVOKSBIVk0xMDogSFZNIExvYWRlcg0KKFhFTikg
SFZNMTA6IERldGVjdGVkIFhlbiB2NC4xLjItcmMzLXByZQ0KKFhFTikgSFZNMTA6IFhlbmJ1cyBy
aW5ncyBAMHhmZWZmYzAwMCwgZXZlbnQgY2hhbm5lbCA5DQooWEVOKSBIVk0xMDogU3lzdGVtIHJl
cXVlc3RlZCBST01CSU9TDQpbNDQwMzgyLjAyMjI5MV0gKFhFTikgSFZNMTA6IENQVSBzcGVlZCBp
cyAyOTM0IE1Ieg0KcGNpYmFjayAwMDAwOjAxOihYRU4pIGlycS5jOjI2NDogRG9tMTAgUENJIGxp
bmsgMCBjaGFuZ2VkIDAgLT4gNQ0KMDAuMDogZGV2aWNlIGhhcyhYRU4pIEhWTTEwOiBQQ0ktSVNB
IGxpbmsgMCByb3V0ZWQgdG8gSVJRNQ0KIGJlZW4gYXNzaWduZWQgdChYRU4pIGlycS5jOjI2NDog
RG9tMTAgUENJIGxpbmsgMSBjaGFuZ2VkIDAgLT4gMTANCm8gYW5vdGhlciBkb21haW4oWEVOKSBI
Vk0xMDogUENJLUlTQSBsaW5rIDEgcm91dGVkIHRvIElSUTEwDQohIE92ZXItd3JpdHRpbmcgKFhF
TikgaXJxLmM6MjY0OiBEb20xMCBQQ0kgbGluayAyIGNoYW5nZWQgMCAtPiAxMQ0KdGhlIG93bmVy
c2hpcCwgYihYRU4pIEhWTTEwOiBQQ0ktSVNBIGxpbmsgMiByb3V0ZWQgdG8gSVJRMTENCnV0IGJl
d2FyZS4NCihYRU4pIGlycS5jOjI2NDogRG9tMTAgUENJIGxpbmsgMyBjaGFuZ2VkIDAgLT4gNQ0K
KFhFTikgSFZNMTA6IFBDSS1JU0EgbGluayAzIHJvdXRlZCB0byBJUlE1DQpbNDQwMzgyLjA2ODU3
NV0gcGNpYmFjayAwMDAwOjAxOjAwLjE6IGRldmljZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBhbm90
aGVyIGRvbWFpbihYRU4pIEhWTTEwOiBwY2kgZGV2IDAxOjIgSU5URC0+SVJRNQ0KISBPdmVyLXdy
aXR0aW5nIChYRU4pIEhWTTEwOiBwY2kgZGV2IDAxOjMgSU5UQS0+SVJRMTANCnRoZSBvd25lcnNo
aXAsIGJ1dCBiZXdhcmUuDQpbNDQwMzgyLjA5MDE3Ml0gKFhFTikgSFZNMTA6IHBjaSBkZXYgMDM6
MCBJTlRBLT5JUlE1DQpwY2liYWNrIDAwMDA6MDA6MWEuMDogZGV2aWNlIGhhcyhYRU4pIEhWTTEw
OiBwY2kgZGV2IDA0OjAgSU5UQS0+SVJRNQ0KIGJlZW4gYXNzaWduZWQgdG8gYW5vdGhlciBkb21h
aW4oWEVOKSBIVk0xMDogcGNpIGRldiAwNTowIElOVEEtPklSUTEwDQohIE92ZXItd3JpdHRpbmcg
dGhlIG93bmVyc2hpcCwgYihYRU4pIEhWTTEwOiBwY2kgZGV2IDA2OjAgSU5UQi0+SVJRNQ0KdXQg
YmV3YXJlLg0KKFhFTikgSFZNMTA6IHBjaSBkZXYgMDc6MCBJTlRBLT5JUlE1DQpbNDQwMzgyLjEx
NTU1N10gcGNpYmFjayAwMDAwOjAwOihYRU4pIEhWTTEwOiBwY2kgZGV2IDA4OjAgSU5UQS0+SVJR
NQ0KMWIuMDogZGV2aWNlIGhhcyBiZWVuIGFzc2lnbmVkIHQoWEVOKSBIVk0xMDogcGNpIGRldiAw
OTowIElOVEEtPklSUTEwDQpvIGFub3RoZXIgZG9tYWluISBPdmVyLXdyaXR0aW5nIChYRU4pIEhW
TTEwOiBwY2kgZGV2IDBhOjAgSU5UQS0+SVJRMTENCnRoZSBvd25lcnNoaXAsIGJ1dCBiZXdhcmUu
DQpbNDQwMzgyLjE0MDIzMV0gcGNpYmFjayAwMDAwOjAwOjFkLjA6IGRldmljZSBoYXMgYmVlbiBh
c3NpZ25lZCB0byBhbm90aGVyIGRvbWFpbiEgT3Zlci13cml0dGluZyB0aGUgb3duZXJzaGlwLCBi
dXQgYmV3YXJlLg0KWzQ0MDM4Mi4xNTIyNTFdIHBjaWJhY2sgMDAwMDowZjowMy4wOiBkZXZpY2Ug
aGFzIGJlZW4gYXNzaWduZWQgdG8gYW5vdGhlciBkb21haW4hIE92ZXItd3JpdHRpbmcgdGhlIG93
bmVyc2hpcCwgYnV0IGJld2FyZS4NCihYRU4pIEhWTTEwOiBwY2kgZGV2IDA1OjAgYmFyIDEwIHNp
emUgMTAwMDAwMDA6IGUwMDAwMDBjDQooWEVOKSBkb21jdGwuYzo5ODI6ZDAgbWVtb3J5X21hcDph
ZGQ6IGdmbj1lMDAwMCBtZm49YzAwMDAgbnJfbWZucz0xMDAwMA0KKFhFTikgSFZNMTA6IHBjaSBk
ZXYgMDI6MCBiYXIgMTAgc2l6ZSAwMjAwMDAwMDogZjAwMDAwMDgNCihYRU4pIEhWTTEwOiBwY2kg
ZGV2IDAzOjAgYmFyIDE0IHNpemUgMDEwMDAwMDA6IGYyMDAwMDA4DQooWEVOKSBIVk0xMDogcGNp
IGRldiAwNDowIGJhciAxMCBzaXplIDAwMDIwMDAwOiBmMzAwMDAwMA0KKFhFTikgZG9tY3RsLmM6
OTgyOmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMwMjAgbWZuPWZhNTAwIG5yX21mbnM9MjANCihY
RU4pIEhWTTEwOiBwY2kgZGV2IDA1OjAgYmFyIDE4IHNpemUgMDAwMjAwMDA6IGYzMDIwMDA0DQoo
WEVOKSBIVk0xMDogcGNpIGRldiAwNTowIGJhciAzMCBzaXplIDAwMDIwMDAwOiBmMzA0MDAwMA0K
KFhFTikgSFZNMTA6IHBjaSBkZXYgMDY6MCBiYXIgMTAgc2l6ZSAwMDAwNDAwMDogZjMwNjAwMDQN
CihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDYwIG1mbj1mYTUy
MCBucl9tZm5zPTQNCihYRU4pIEhWTTEwOiBwY2kgZGV2IDA4OjAgYmFyIDEwIHNpemUgMDAwMDQw
MDA6IGYzMDY0MDA0DQooWEVOKSBkb21jdGwuYzo5ODI6ZDAgbWVtb3J5X21hcDphZGQ6IGdmbj1m
MzA2NCBtZm49YTAxMDAgbnJfbWZucz00DQooWEVOKSBIVk0xMDogcGNpIGRldiAwYTowIGJhciAx
NCBzaXplIDAwMDA0MDAwOiBmMzA2ODAwMA0KKFhFTikgZG9tY3RsLmM6OTgyOmQwIG1lbW9yeV9t
YXA6YWRkOiBnZm49ZjMwNjggbWZuPWZiZTAwIG5yX21mbnM9NA0KKFhFTikgSFZNMTA6IHBjaSBk
ZXYgMDI6MCBiYXIgMTQgc2l6ZSAwMDAwMTAwMDogZjMwNmMwMDANCihYRU4pIEhWTTEwOiBwY2kg
ZGV2IDA3OjAgYmFyIDEwIHNpemUgMDAwMDEwMDA6IGYzMDZkMDAwDQooWEVOKSBkb21jdGwuYzo5
ODI6ZDAgbWVtb3J5X21hcDphZGQ6IGdmbj1mMzA2ZCBtZm49YTAxMDQgbnJfbWZucz0xDQooWEVO
KSBIVk0xMDogcGNpIGRldiAwOTowIGJhciAxMCBzaXplIDAwMDAxMDAwOiBmMzA2ZTAwMA0KKFhF
TikgZG9tY3RsLmM6OTgyOmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMwNmUgbWZuPWEwMTA1IG5y
X21mbnM9MQ0KKFhFTikgZG9tY3RsLmM6OTgyOmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMwNmYg
bWZuPWZiZTA0IG5yX21mbnM9MQ0KKFhFTikgSFZNMTA6IHBjaSBkZXYgMGE6MCBiYXIgMTAgc2l6
ZSAwMDAwMTAwMDogZjMwNmYwMDANCihYRU4pIEhWTTEwOiBwY2kgZGV2IDAzOjAgYmFyIDEwIHNp
emUgMDAwMDAxMDA6IDAwMDBjMDAxDQooWEVOKSBIVk0xMDogcGNpIGRldiAwNTowIGJhciAyMCBz
aXplIDAwMDAwMTAwOiAwMDAwYzEwMQ0KKFhFTikgZG9tY3RsLmM6MTAzODpkMCBpb3BvcnRfbWFw
OmFkZCBmX2dwb3J0PWMxMDAgZl9tcG9ydD02MDAwIG5wPTEwMA0KKFhFTikgSFZNMTA6IHBjaSBk
ZXYgMDQ6MCBiYXIgMTQgc2l6ZSAwMDAwMDA0MDogMDAwMGMyMDENCihYRU4pIEhWTTEwOiBwY2kg
ZGV2IDAxOjIgYmFyIDIwIHNpemUgMDAwMDAwMjA6IDAwMDBjMjQxDQooWEVOKSBIVk0xMDogcGNp
IGRldiAwMToxIGJhciAyMCBzaXplIDAwMDAwMDEwOiAwMDAwYzI2MQ0KKFhFTikgSFZNMTA6IE11
bHRpcHJvY2Vzc29yIGluaXRpYWxpc2F0aW9uOg0KKFhFTikgSFZNMTA6ICAtIENQVTAgLi4uIDM2
LWJpdCBwaHlzIC4uLiBmaXhlZCBNVFJScyAuLi4gdmFyIE1UUlJzIFszLzhdIC4uLiBkb25lLg0K
KFhFTikgSFZNMTA6ICAtIENQVTEgLi4uIDM2LWJpdCBwaHlzIC4uLiBmaXhlZCBNVFJScyAuLi4g
dmFyIE1UUlJzIFszLzhdIC4uLiBkb25lLg0KKFhFTikgSFZNMTA6ICAtIENQVTIgLi4uIDM2LWJp
dCBwaHlzIC4uLiBmaXhlZCBNVFJScyAuLi4gdmFyIE1UUlJzIFszLzhdIC4uLiBkb25lLg0KKFhF
TikgSFZNMTA6ICAtIENQVTMgLi4uIDM2LWJpdCBwaHlzIC4uLiBmaXhlZCBNVFJScyAuLi4gdmFy
IE1UUlJzIFszLzhdIC4uLiBkb25lLg0KKFhFTikgSFZNMTA6ICAtIENQVTQgLi4uIDM2LWJpdCBw
aHlzIC4uLiBmaXhlZCBNVFJScyAuLi4gdmFyIE1UUlJzIFszLzhdIC4uLiBkb25lLg0KKFhFTikg
SFZNMTA6ICAtIENQVTUgLi4uIDM2LWJpdCBwaHlzIC4uLiBmaXhlZCBNVFJScyAuLi4gdmFyIE1U
UlJzIFszLzhdIC4uLiBkb25lLg0KKFhFTikgSFZNMTA6ICAtIENQVTYgLi4uIDM2LWJpdCBwaHlz
IC4uLiBmaXhlZCBNVFJScyAuLi4gdmFyIE1UUlJzIFszLzhdIC4uLiBkb25lLg0KKFhFTikgSFZN
MTA6ICAtIENQVTcgLi4uIDM2LWJpdCBwaHlzIC4uLiBmaXhlZCBNVFJScyAuLi4gdmFyIE1UUlJz
IFszLzhdIC4uLiBkb25lLg0KKFhFTikgSFZNMTA6IFRlc3RpbmcgSFZNIGVudmlyb25tZW50Og0K
KFhFTikgSFZNMTA6ICAtIFJFUCBJTlNCIGFjcm9zcyBwYWdlIGJvdW5kYXJpZXMgLi4uIHBhc3Nl
ZA0KKFhFTikgSFZNMTA6ICAtIEdTIGJhc2UgTVNScyBhbmQgU1dBUEdTIC4uLiBwYXNzZWQNCihY
RU4pIEhWTTEwOiBQYXNzZWQgMiBvZiAyIHRlc3RzDQooWEVOKSBIVk0xMDogV3JpdGluZyBTTUJJ
T1MgdGFibGVzIC4uLg0KKFhFTikgSFZNMTA6IExvYWRpbmcgUk9NQklPUyAuLi4NCihYRU4pIEhW
TTEwOiAxMjYzNiBieXRlcyBvZiBST01CSU9TIGhpZ2gtbWVtb3J5IGV4dGVuc2lvbnM6DQooWEVO
KSBIVk0xMDogICBSZWxvY2F0aW5nIHRvIDB4ZmMwMDAwMDAtMHhmYzAwMzE1YyAuLi4gZG9uZQ0K
KFhFTikgSFZNMTA6IENyZWF0aW5nIE1QIHRhYmxlcyAuLi4NCihYRU4pIEhWTTEwOiBMb2FkaW5n
IENpcnJ1cyBWR0FCSU9TIC4uLg0KKFhFTikgSFZNMTA6IExvYWRpbmcgUENJIE9wdGlvbiBST00g
Li4uDQooWEVOKSBIVk0xMDogIC0gTWFudWZhY3R1cmVyOiBodHRwOi8vZXRoZXJib290Lm9yZw0K
KFhFTikgSFZNMTA6ICAtIFByb2R1Y3QgbmFtZTogZ1BYRQ0KKFhFTikgSFZNMTA6IExvYWRpbmcg
QUNQSSAuLi4NCihYRU4pIEhWTTEwOiB2bTg2IFRTUyBhdCBmYzAxMzM4MA0KKFhFTikgSFZNMTA6
IEJJT1MgbWFwOg0KKFhFTikgSFZNMTA6ICBjMDAwMC1jOGZmZjogVkdBIEJJT1MNCihYRU4pIEhW
TTEwOiAgYzkwMDAtZGFmZmY6IEV0aGVyYm9vdCBST00NCihYRU4pIEhWTTEwOiAgZjAwMDAtZmZm
ZmY6IE1haW4gQklPUw0KKFhFTikgSFZNMTA6IEU4MjAgdGFibGU6DQooWEVOKSBIVk0xMDogIFsw
MF06IDAwMDAwMDAwOjAwMDAwMDAwIC0gMDAwMDAwMDA6MDAwOWUwMDA6IFJBTQ0KKFhFTikgSFZN
MTA6ICBbMDFdOiAwMDAwMDAwMDowMDA5ZTAwMCAtIDAwMDAwMDAwOjAwMGEwMDAwOiBSRVNFUlZF
RA0KKFhFTikgSFZNMTA6ICBIT0xFOiAwMDAwMDAwMDowMDBhMDAwMCAtIDAwMDAwMDAwOjAwMGUw
MDAwDQooWEVOKSBIVk0xMDogIFswMl06IDAwMDAwMDAwOjAwMGUwMDAwIC0gMDAwMDAwMDA6MDAx
MDAwMDA6IFJFU0VSVkVEDQooWEVOKSBIVk0xMDogIFswM106IDAwMDAwMDAwOjAwMTAwMDAwIC0g
MDAwMDAwMDA6ZTAwMDAwMDA6IFJBTQ0KKFhFTikgSFZNMTA6ICBIT0xFOiAwMDAwMDAwMDplMDAw
MDAwMCAtIDAwMDAwMDAwOmZjMDAwMDAwDQooWEVOKSBIVk0xMDogIFswNF06IDAwMDAwMDAwOmZj
MDAwMDAwIC0gMDAwMDAwMDE6MDAwMDAwMDA6IFJFU0VSVkVEDQooWEVOKSBIVk0xMDogIFswNV06
IDAwMDAwMDAxOjAwMDAwMDAwIC0gMDAwMDAwMDI6MWY4MDAwMDA6IFJBTQ0KKFhFTikgSFZNMTA6
IEludm9raW5nIFJPTUJJT1MgLi4uDQooWEVOKSBIVk0xMDogJFJldmlzaW9uOiAxLjIyMSAkICRE
YXRlOiAyMDA4LzEyLzA3IDE3OjMyOjI5ICQNCihYRU4pIHN0ZHZnYS5jOjE0NzpkMTAgZW50ZXJp
bmcgc3RkdmdhIGFuZCBjYWNoaW5nIG1vZGVzDQooWEVOKSBIVk0xMDogVkdBQmlvcyAkSWQ6IHZn
YWJpb3MuYyx2IDEuNjcgMjAwOC8wMS8yNyAwOTo0NDoxMiB2cnVwcGVydCBFeHAgJA0KKFhFTikg
SFZNMTA6IEJvY2hzIEJJT1MgLSBidWlsZDogMDYvMjMvOTkNCihYRU4pIEhWTTEwOiAkUmV2aXNp
b246IDEuMjIxICQgJERhdGU6IDIwMDgvMTIvMDcgMTc6MzI6MjkgJA0KKFhFTikgSFZNMTA6IE9w
dGlvbnM6IGFwbWJpb3MgcGNpYmlvcyBlbHRvcml0byBQTU0NCihYRU4pIEhWTTEwOg0KKFhFTikg
SFZNMTA6IGF0YTAgbWFzdGVyOiBRRU1VIERWRC1ST00gQVRBUEktNCBDRC1Sb20vRFZELVJvbQ0K
KFhFTikgSFZNMTA6IGF0YTAtMTogUENIUz0xNjM4My8xNi82MyB0cmFuc2xhdGlvbj1sYmEgTENI
Uz0xMDI0LzI1NS82Mw0KKFhFTikgSFZNMTA6IGF0YTAgIHNsYXZlOiBRRU1VIEhBUkRESVNLIEFU
QS03IEhhcmQtRGlzayAoIDI3OSBHQnl0ZXMpDQooWEVOKSBIVk0xMDoNCihYRU4pIEhWTTEwOg0K
KFhFTikgSFZNMTA6DQooWEVOKSBIVk0xMDogUHJlc3MgRjEyIGZvciBib290IG1lbnUuDQooWEVO
KSBIVk0xMDoNCihYRU4pIEhWTTEwOiBCb290aW5nIGZyb20gSGFyZCBEaXNrLi4uDQooWEVOKSBI
Vk0xMDogQm9vdGluZyBmcm9tIDAwMDA6N2MwMA0KKFhFTikgSFZNMTA6IGludDEzX2Nkcm9tOiBm
dW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2UgZmYNCihYRU4pIEhWTTEwOiBpbnQxM19jZHJv
bTogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJhbmdlIGZlDQooWEVOKSBIVk0xMDogaW50MTNf
Y2Ryb206IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBvZiByYW5nZSBmZA0KKFhFTikgSFZNMTA6IGlu
dDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2UgZmMNCihYRU4pIEhWTTEw
OiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJhbmdlIGZiDQooWEVOKSBI
Vk0xMDogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBvZiByYW5nZSBmYQ0KKFhF
TikgSFZNMTA6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2UgZjkN
CihYRU4pIEhWTTEwOiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJhbmdl
IGY4DQooWEVOKSBIVk0xMDogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBvZiBy
YW5nZSBmNw0KKFhFTikgSFZNMTA6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgRUxETCBvdXQg
b2YgcmFuZ2UgZjYNCihYRU4pIEhWTTEwOiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIEVMREwg
b3V0IG9mIHJhbmdlIGY1DQooWEVOKSBIVk0xMDogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCBF
TERMIG91dCBvZiByYW5nZSBmNA0KKFhFTikgSFZNMTA6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0
MSwgRUxETCBvdXQgb2YgcmFuZ2UgZjMNCihYRU4pIEhWTTEwOiBpbnQxM19jZHJvbTogZnVuY3Rp
b24gNDEsIEVMREwgb3V0IG9mIHJhbmdlIGYyDQooWEVOKSBIVk0xMDogaW50MTNfY2Ryb206IGZ1
bmN0aW9uIDQxLCBFTERMIG91dCBvZiByYW5nZSBmMQ0KKFhFTikgSFZNMTA6IGludDEzX2Nkcm9t
OiBmdW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2UgZjANCihYRU4pIEhWTTEwOiBpbnQxM19j
ZHJvbTogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJhbmdlIGVmDQooWEVOKSBIVk0xMDogaW50
MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBvZiByYW5nZSBlZQ0KKFhFTikgSFZNMTA6
IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2UgZWQNCihYRU4pIEhW
TTEwOiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJhbmdlIGVjDQooWEVO
KSBIVk0xMDogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBvZiByYW5nZSBlYg0K
KFhFTikgSFZNMTA6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2Ug
ZWENCihYRU4pIEhWTTEwOiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJh
bmdlIGU5DQooWEVOKSBIVk0xMDogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBv
ZiByYW5nZSBlOA0KKFhFTikgSFZNMTA6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgdW5tYXBw
ZWQgZGV2aWNlIGZvciBFTERMPWU3DQooWEVOKSBIVk0xMDogaW50MTNfY2Ryb206IGZ1bmN0aW9u
IDQxLCB1bm1hcHBlZCBkZXZpY2UgZm9yIEVMREw9ZTYNCihYRU4pIEhWTTEwOiBpbnQxM19jZHJv
bTogZnVuY3Rpb24gNDEsIHVubWFwcGVkIGRldmljZSBmb3IgRUxETD1lNQ0KKFhFTikgSFZNMTA6
IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgdW5tYXBwZWQgZGV2aWNlIGZvciBFTERMPWU0DQoo
WEVOKSBIVk0xMDogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCB1bm1hcHBlZCBkZXZpY2UgZm9y
IEVMREw9ZTMNCihYRU4pIEhWTTEwOiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIHVubWFwcGVk
IGRldmljZSBmb3IgRUxETD1lMg0KKFhFTikgSFZNMTA6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0
MSwgdW5tYXBwZWQgZGV2aWNlIGZvciBFTERMPWUxDQooWEVOKSBzdGR2Z2EuYzoxNTE6ZDEwIGxl
YXZpbmcgc3RkdmdhDQooWEVOKSB2aXJpZGlhbi5jOjE0NTpkMTAgR3Vlc3Qgb3M6DQooWEVOKSB2
aXJpZGlhbi5jOjE0NzpkMTAgICAgICAgIHZlbmRvcjogMQ0KKFhFTikgdmlyaWRpYW4uYzoxNDk6
ZDEwICAgICAgICBvczogNA0KKFhFTikgdmlyaWRpYW4uYzoxNTE6ZDEwICAgICAgICBtYWpvcjog
Ng0KKFhFTikgdmlyaWRpYW4uYzoxNTM6ZDEwICAgICAgICBtaW5vcjogMQ0KKFhFTikgdmlyaWRp
YW4uYzoxNTU6ZDEwICAgICAgICBzcDogMQ0KKFhFTikgdmlyaWRpYW4uYzoxNTc6ZDEwICAgICAg
ICBidWlsZDogMWRiMQ0KKFhFTikgdmlyaWRpYW4uYzoxNjI6ZDEwIFNldCBoeXBlcmNhbGwgcGFn
ZSAzZmZmZjAwMS4NCihYRU4pIGlycS5jOjI2NDogRG9tMTAgUENJIGxpbmsgMCBjaGFuZ2VkIDUg
LT4gMA0KKFhFTikgaXJxLmM6MjY0OiBEb20xMCBQQ0kgbGluayAxIGNoYW5nZWQgMTAgLT4gMA0K
KFhFTikgaXJxLmM6MjY0OiBEb20xMCBQQ0kgbGluayAyIGNoYW5nZWQgMTEgLT4gMA0KKFhFTikg
aXJxLmM6MjY0OiBEb20xMCBQQ0kgbGluayAzIGNoYW5nZWQgNSAtPiAwDQooWEVOKSBkb21jdGwu
Yzo5OTI6ZDAgbWVtb3J5X21hcDpyZW1vdmU6IGdmbj1lMDAwMCBtZm49YzAwMDAgbnJfbWZucz0x
MDAwMA0KKFhFTikgZG9tY3RsLmM6OTkyOmQwIG1lbW9yeV9tYXA6cmVtb3ZlOiBnZm49ZjMwMjAg
bWZuPWZhNTAwIG5yX21mbnM9MjANCihYRU4pIGRvbWN0bC5jOjEwNjI6ZDAgaW9wb3J0X21hcDpy
ZW1vdmUgZl9ncG9ydD1jMTAwIGZfbXBvcnQ9NjAwMCBucD0xMDANCihYRU4pIGRvbWN0bC5jOjk4
MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWUwMDAwIG1mbj1jMDAwMCBucl9tZm5zPTEwMDAwDQoo
WEVOKSBkb21jdGwuYzo5ODI6ZDAgbWVtb3J5X21hcDphZGQ6IGdmbj1mMzAyMCBtZm49ZmE1MDAg
bnJfbWZucz0yMA0KKFhFTikgZG9tY3RsLmM6MTAzODpkMCBpb3BvcnRfbWFwOmFkZCBmX2dwb3J0
PWMxMDAgZl9tcG9ydD02MDAwIG5wPTEwMA0KKFhFTikgZG9tY3RsLmM6OTkyOmQwIG1lbW9yeV9t
YXA6cmVtb3ZlOiBnZm49ZjMwNjAgbWZuPWZhNTIwIG5yX21mbnM9NA0KKFhFTikgZG9tY3RsLmM6
OTgyOmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMwNjAgbWZuPWZhNTIwIG5yX21mbnM9NA0KKFhF
TikgZG9tY3RsLmM6OTkyOmQwIG1lbW9yeV9tYXA6cmVtb3ZlOiBnZm49ZjMwNmQgbWZuPWEwMTA0
IG5yX21mbnM9MQ0KKFhFTikgZG9tY3RsLmM6OTgyOmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMw
NmQgbWZuPWEwMTA0IG5yX21mbnM9MQ0KKFhFTikgZG9tY3RsLmM6OTkyOmQwIG1lbW9yeV9tYXA6
cmVtb3ZlOiBnZm49ZjMwNjQgbWZuPWEwMTAwIG5yX21mbnM9NA0KKFhFTikgZG9tY3RsLmM6OTgy
OmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMwNjQgbWZuPWEwMTAwIG5yX21mbnM9NA0KKFhFTikg
ZG9tY3RsLmM6OTkyOmQwIG1lbW9yeV9tYXA6cmVtb3ZlOiBnZm49ZjMwNmUgbWZuPWEwMTA1IG5y
X21mbnM9MQ0KKFhFTikgZG9tY3RsLmM6OTgyOmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMwNmUg
bWZuPWEwMTA1IG5yX21mbnM9MQ0KKFhFTikgZG9tY3RsLmM6OTkyOmQwIG1lbW9yeV9tYXA6cmVt
b3ZlOiBnZm49ZjMwNmYgbWZuPWZiZTA0IG5yX21mbnM9MQ0KKFhFTikgZG9tY3RsLmM6OTkyOmQw
IG1lbW9yeV9tYXA6cmVtb3ZlOiBnZm49ZjMwNjggbWZuPWZiZTAwIG5yX21mbnM9NA0KKFhFTikg
ZG9tY3RsLmM6OTgyOmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMwNmYgbWZuPWZiZTA0IG5yX21m
bnM9MQ0KKFhFTikgZG9tY3RsLmM6OTgyOmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMwNjggbWZu
PWZiZTAwIG5yX21mbnM9NA0KKFhFTikgZG9tY3RsLmM6OTkyOmQwIG1lbW9yeV9tYXA6cmVtb3Zl
OiBnZm49ZTAwMDAgbWZuPWMwMDAwIG5yX21mbnM9MTAwMDANCihYRU4pIGRvbWN0bC5jOjk5Mjpk
MCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWYzMDIwIG1mbj1mYTUwMCBucl9tZm5zPTIwDQooWEVO
KSBkb21jdGwuYzoxMDYyOmQwIGlvcG9ydF9tYXA6cmVtb3ZlIGZfZ3BvcnQ9YzEwMCBmX21wb3J0
PTYwMDAgbnA9MTAwDQooWEVOKSBkb21jdGwuYzo5ODI6ZDAgbWVtb3J5X21hcDphZGQ6IGdmbj1l
MDAwMCBtZm49YzAwMDAgbnJfbWZucz0xMDAwMA0KKFhFTikgZG9tY3RsLmM6OTgyOmQwIG1lbW9y
eV9tYXA6YWRkOiBnZm49ZjMwMjAgbWZuPWZhNTAwIG5yX21mbnM9MjANCihYRU4pIGRvbWN0bC5j
OjEwMzg6ZDAgaW9wb3J0X21hcDphZGQgZl9ncG9ydD1jMTAwIGZfbXBvcnQ9NjAwMCBucD0xMDAN
CihYRU4pIGRvbWN0bC5jOjk5MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWYzMDZkIG1mbj1h
MDEwNCBucl9tZm5zPTENCihYRU4pIGRvbWN0bC5jOjk5MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTog
Z2ZuPWYzMDYwIG1mbj1mYTUyMCBucl9tZm5zPTQNCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1v
cnlfbWFwOmFkZDogZ2ZuPWYzMDZkIG1mbj1hMDEwNCBucl9tZm5zPTENCihYRU4pIGRvbWN0bC5j
Ojk4MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDYwIG1mbj1mYTUyMCBucl9tZm5zPTQNCihY
RU4pIGRvbWN0bC5jOjk5MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWYzMDY0IG1mbj1hMDEw
MCBucl9tZm5zPTQNCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYz
MDY0IG1mbj1hMDEwMCBucl9tZm5zPTQNCihYRU4pIGRvbWN0bC5jOjk5MjpkMCBtZW1vcnlfbWFw
OnJlbW92ZTogZ2ZuPWYzMDZlIG1mbj1hMDEwNSBucl9tZm5zPTENCihYRU4pIGRvbWN0bC5jOjk4
MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDZlIG1mbj1hMDEwNSBucl9tZm5zPTENCihYRU4p
IGRvbWN0bC5jOjk5MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWYzMDZmIG1mbj1mYmUwNCBu
cl9tZm5zPTENCihYRU4pIGRvbWN0bC5jOjk5MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWYz
MDY4IG1mbj1mYmUwMCBucl9tZm5zPTQNCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFw
OmFkZDogZ2ZuPWYzMDZmIG1mbj1mYmUwNCBucl9tZm5zPTENCihYRU4pIGRvbWN0bC5jOjk4Mjpk
MCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDY4IG1mbj1mYmUwMCBucl9tZm5zPTQNCihYRU4pIHN0
ZHZnYS5jOjE0NzpkMTAgZW50ZXJpbmcgc3RkdmdhIGFuZCBjYWNoaW5nIG1vZGVzDQpbNDQwNDg1
LjQ1OTYyMF0gdmlmIHZpZi0xMC0wOiAyIHJlYWRpbmcgc2NyaXB0DQotLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tDQpXaW5kb3dzIEJTT0RzIGFib3V0IHRpbWVvdXQgcmVzZXR0aW5nIHZpZGVvIGRy
aXZlcg0KZG9tVSByZXN0YXJ0cw0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KWzQ0MDQ4OS41
MTMyNDJdIHZiZCB2YmQtMTEtNzY4OiAyIGNyZWF0aW5nIHZiZCBzdHJ1Y3R1cmUNCihYRU4pIHBo
eXNkZXYuYzoxNzA6IGRvbTExOiAxNjotMSBhbHJlYWR5IG1hcHBlZCB0byAxNg0KKFhFTikgSFZN
MTE6IEhWTSBMb2FkZXINCihYRU4pIEhWTTExOiBEZXRlY3RlZCBYZW4gdjQuMS4yLXJjMy1wcmUN
CihYRU4pIEhWTTExOiBYZW5idXMgcmluZ3MgQDB4ZmVmZmMwMDAsIGV2ZW50IGNoYW5uZWwgOQ0K
KFhFTikgSFZNMTE6IFN5c3RlbSByZXF1ZXN0ZWQgUk9NQklPUw0KWzQ0MDQ5MS41MzIwNjddIChY
RU4pIEhWTTExOiBDUFUgc3BlZWQgaXMgMjkzNCBNSHoNCnBjaWJhY2sgMDAwMDowMTooWEVOKSBp
cnEuYzoyNjQ6IERvbTExIFBDSSBsaW5rIDAgY2hhbmdlZCAwIC0+IDUNCjAwLjA6IGRldmljZSBo
YXMoWEVOKSBIVk0xMTogUENJLUlTQSBsaW5rIDAgcm91dGVkIHRvIElSUTUNCiBiZWVuIGFzc2ln
bmVkIHQoWEVOKSBpcnEuYzoyNjQ6IERvbTExIFBDSSBsaW5rIDEgY2hhbmdlZCAwIC0+IDEwDQpv
IGFub3RoZXIgZG9tYWluKFhFTikgSFZNMTE6IFBDSS1JU0EgbGluayAxIHJvdXRlZCB0byBJUlEx
MA0KISBPdmVyLXdyaXR0aW5nIChYRU4pIGlycS5jOjI2NDogRG9tMTEgUENJIGxpbmsgMiBjaGFu
Z2VkIDAgLT4gMTENCnRoZSBvd25lcnNoaXAsIGIoWEVOKSBIVk0xMTogUENJLUlTQSBsaW5rIDIg
cm91dGVkIHRvIElSUTExDQp1dCBiZXdhcmUuDQooWEVOKSBpcnEuYzoyNjQ6IERvbTExIFBDSSBs
aW5rIDMgY2hhbmdlZCAwIC0+IDUNCihYRU4pIEhWTTExOiBQQ0ktSVNBIGxpbmsgMyByb3V0ZWQg
dG8gSVJRNQ0KWzQ0MDQ5MS41Nzg3MDJdIHBjaWJhY2sgMDAwMDowMTowMC4xOiBkZXZpY2UgaGFz
IGJlZW4gYXNzaWduZWQgdG8gYW5vdGhlciBkb21haW4hIE92ZXItd3JpdHRpbmcgdGhlIG93bmVy
c2hpcCwgYnV0IGJld2FyZS4NCls0NDA0OTEuNTkzNzI4XSBwY2liYWNrIDAwMDA6MDA6MWEuMDog
ZGV2aWNlIGhhcyBiZWVuIGFzc2lnbmVkIHQoWEVOKSBIVk0xMTogcGNpIGRldiAwMToyIElOVEQt
PklSUTUNCm8gYW5vdGhlciBkb21haW4oWEVOKSBIVk0xMTogcGNpIGRldiAwMTozIElOVEEtPklS
UTEwDQohIE92ZXItd3JpdHRpbmcgdGhlIG93bmVyc2hpcCwgYihYRU4pIEhWTTExOiBwY2kgZGV2
IDAzOjAgSU5UQS0+SVJRNQ0KdXQgYmV3YXJlLg0KKFhFTikgSFZNMTE6IHBjaSBkZXYgMDQ6MCBJ
TlRBLT5JUlE1DQpbNDQwNDkxLjYxNTU3M10gcGNpYmFjayAwMDAwOjAwOjFiLjA6IGRldmljZSBo
YXMgYmVlbiBhc3NpZ25lZCB0KFhFTikgSFZNMTE6IHBjaSBkZXYgMDU6MCBJTlRBLT5JUlExMA0K
byBhbm90aGVyIGRvbWFpbiEgT3Zlci13cml0dGluZyAoWEVOKSBIVk0xMTogcGNpIGRldiAwNjow
IElOVEItPklSUTUNCnRoZSBvd25lcnNoaXAsIGJ1dCBiZXdhcmUuDQooWEVOKSBIVk0xMTogcGNp
IGRldiAwNzowIElOVEEtPklSUTUNCls0NDA0OTEuNjM3NDg5XSBwY2liYWNrIDAwMDA6MDA6MWQu
MDogZGV2aWNlIGhhcyhYRU4pIEhWTTExOiBwY2kgZGV2IDA4OjAgSU5UQS0+SVJRNQ0KIGJlZW4g
YXNzaWduZWQgdG8gYW5vdGhlciBkb21haW4oWEVOKSBIVk0xMTogcGNpIGRldiAwOTowIElOVEEt
PklSUTEwDQohIE92ZXItd3JpdHRpbmcgdGhlIG93bmVyc2hpcCwgYihYRU4pIEhWTTExOiBwY2kg
ZGV2IDBhOjAgSU5UQS0+SVJRMTENCnV0IGJld2FyZS4NCls0NDA0OTEuNjYyMzE2XSBwY2liYWNr
IDAwMDA6MGY6MDMuMDogZGV2aWNlIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGFub3RoZXIgZG9tYWlu
ISBPdmVyLXdyaXR0aW5nIHRoZSBvd25lcnNoaXAsIGJ1dCBiZXdhcmUuDQooWEVOKSBIVk0xMTog
cGNpIGRldiAwNTowIGJhciAxMCBzaXplIDEwMDAwMDAwOiBlMDAwMDAwYw0KKFhFTikgZG9tY3Rs
LmM6OTgyOmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZTAwMDAgbWZuPWMwMDAwIG5yX21mbnM9MTAw
MDANCihYRU4pIEhWTTExOiBwY2kgZGV2IDAyOjAgYmFyIDEwIHNpemUgMDIwMDAwMDA6IGYwMDAw
MDA4DQooWEVOKSBIVk0xMTogcGNpIGRldiAwMzowIGJhciAxNCBzaXplIDAxMDAwMDAwOiBmMjAw
MDAwOA0KKFhFTikgSFZNMTE6IHBjaSBkZXYgMDQ6MCBiYXIgMTAgc2l6ZSAwMDAyMDAwMDogZjMw
MDAwMDANCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDIwIG1m
bj1mYTUwMCBucl9tZm5zPTIwDQooWEVOKSBIVk0xMTogcGNpIGRldiAwNTowIGJhciAxOCBzaXpl
IDAwMDIwMDAwOiBmMzAyMDAwNA0KKFhFTikgSFZNMTE6IHBjaSBkZXYgMDU6MCBiYXIgMzAgc2l6
ZSAwMDAyMDAwMDogZjMwNDAwMDANCihYRU4pIEhWTTExOiBwY2kgZGV2IDA2OjAgYmFyIDEwIHNp
emUgMDAwMDQwMDA6IGYzMDYwMDA0DQooWEVOKSBkb21jdGwuYzo5ODI6ZDAgbWVtb3J5X21hcDph
ZGQ6IGdmbj1mMzA2MCBtZm49ZmE1MjAgbnJfbWZucz00DQooWEVOKSBIVk0xMTogcGNpIGRldiAw
ODowIGJhciAxMCBzaXplIDAwMDA0MDAwOiBmMzA2NDAwNA0KKFhFTikgZG9tY3RsLmM6OTgyOmQw
IG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMwNjQgbWZuPWEwMTAwIG5yX21mbnM9NA0KKFhFTikgSFZN
MTE6IHBjaSBkZXYgMGE6MCBiYXIgMTQgc2l6ZSAwMDAwNDAwMDogZjMwNjgwMDANCihYRU4pIGRv
bWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDY4IG1mbj1mYmUwMCBucl9tZm5z
PTQNCihYRU4pIEhWTTExOiBwY2kgZGV2IDAyOjAgYmFyIDE0IHNpemUgMDAwMDEwMDA6IGYzMDZj
MDAwDQooWEVOKSBIVk0xMTogcGNpIGRldiAwNzowIGJhciAxMCBzaXplIDAwMDAxMDAwOiBmMzA2
ZDAwMA0KKFhFTikgZG9tY3RsLmM6OTgyOmQwIG1lbW9yeV9tYXA6YWRkOiBnZm49ZjMwNmQgbWZu
PWEwMTA0IG5yX21mbnM9MQ0KKFhFTikgSFZNMTE6IHBjaSBkZXYgMDk6MCBiYXIgMTAgc2l6ZSAw
MDAwMTAwMDogZjMwNmUwMDANCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFwOmFkZDog
Z2ZuPWYzMDZlIG1mbj1hMDEwNSBucl9tZm5zPTENCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1v
cnlfbWFwOmFkZDogZ2ZuPWYzMDZmIG1mbj1mYmUwNCBucl9tZm5zPTENCihYRU4pIEhWTTExOiBw
Y2kgZGV2IDBhOjAgYmFyIDEwIHNpemUgMDAwMDEwMDA6IGYzMDZmMDAwDQooWEVOKSBIVk0xMTog
cGNpIGRldiAwMzowIGJhciAxMCBzaXplIDAwMDAwMTAwOiAwMDAwYzAwMQ0KKFhFTikgSFZNMTE6
IHBjaSBkZXYgMDU6MCBiYXIgMjAgc2l6ZSAwMDAwMDEwMDogMDAwMGMxMDENCihYRU4pIGRvbWN0
bC5jOjEwMzg6ZDAgaW9wb3J0X21hcDphZGQgZl9ncG9ydD1jMTAwIGZfbXBvcnQ9NjAwMCBucD0x
MDANCihYRU4pIEhWTTExOiBwY2kgZGV2IDA0OjAgYmFyIDE0IHNpemUgMDAwMDAwNDA6IDAwMDBj
MjAxDQooWEVOKSBIVk0xMTogcGNpIGRldiAwMToyIGJhciAyMCBzaXplIDAwMDAwMDIwOiAwMDAw
YzI0MQ0KKFhFTikgSFZNMTE6IHBjaSBkZXYgMDE6MSBiYXIgMjAgc2l6ZSAwMDAwMDAxMDogMDAw
MGMyNjENCihYRU4pIEhWTTExOiBNdWx0aXByb2Nlc3NvciBpbml0aWFsaXNhdGlvbjoNCihYRU4p
IEhWTTExOiAgLSBDUFUwIC4uLiAzNi1iaXQgcGh5cyAuLi4gZml4ZWQgTVRSUnMgLi4uIHZhciBN
VFJScyBbMy84XSAuLi4gZG9uZS4NCihYRU4pIEhWTTExOiAgLSBDUFUxIC4uLiAzNi1iaXQgcGh5
cyAuLi4gZml4ZWQgTVRSUnMgLi4uIHZhciBNVFJScyBbMy84XSAuLi4gZG9uZS4NCihYRU4pIEhW
TTExOiAgLSBDUFUyIC4uLiAzNi1iaXQgcGh5cyAuLi4gZml4ZWQgTVRSUnMgLi4uIHZhciBNVFJS
cyBbMy84XSAuLi4gZG9uZS4NCihYRU4pIEhWTTExOiAgLSBDUFUzIC4uLiAzNi1iaXQgcGh5cyAu
Li4gZml4ZWQgTVRSUnMgLi4uIHZhciBNVFJScyBbMy84XSAuLi4gZG9uZS4NCihYRU4pIEhWTTEx
OiAgLSBDUFU0IC4uLiAzNi1iaXQgcGh5cyAuLi4gZml4ZWQgTVRSUnMgLi4uIHZhciBNVFJScyBb
My84XSAuLi4gZG9uZS4NCihYRU4pIEhWTTExOiAgLSBDUFU1IC4uLiAzNi1iaXQgcGh5cyAuLi4g
Zml4ZWQgTVRSUnMgLi4uIHZhciBNVFJScyBbMy84XSAuLi4gZG9uZS4NCihYRU4pIEhWTTExOiAg
LSBDUFU2IC4uLiAzNi1iaXQgcGh5cyAuLi4gZml4ZWQgTVRSUnMgLi4uIHZhciBNVFJScyBbMy84
XSAuLi4gZG9uZS4NCihYRU4pIEhWTTExOiAgLSBDUFU3IC4uLiAzNi1iaXQgcGh5cyAuLi4gZml4
ZWQgTVRSUnMgLi4uIHZhciBNVFJScyBbMy84XSAuLi4gZG9uZS4NCihYRU4pIEhWTTExOiBUZXN0
aW5nIEhWTSBlbnZpcm9ubWVudDoNCihYRU4pIEhWTTExOiAgLSBSRVAgSU5TQiBhY3Jvc3MgcGFn
ZSBib3VuZGFyaWVzIC4uLiBwYXNzZWQNCihYRU4pIEhWTTExOiAgLSBHUyBiYXNlIE1TUnMgYW5k
IFNXQVBHUyAuLi4gcGFzc2VkDQooWEVOKSBIVk0xMTogUGFzc2VkIDIgb2YgMiB0ZXN0cw0KKFhF
TikgSFZNMTE6IFdyaXRpbmcgU01CSU9TIHRhYmxlcyAuLi4NCihYRU4pIEhWTTExOiBMb2FkaW5n
IFJPTUJJT1MgLi4uDQooWEVOKSBIVk0xMTogMTI2MzYgYnl0ZXMgb2YgUk9NQklPUyBoaWdoLW1l
bW9yeSBleHRlbnNpb25zOg0KKFhFTikgSFZNMTE6ICAgUmVsb2NhdGluZyB0byAweGZjMDAwMDAw
LTB4ZmMwMDMxNWMgLi4uIGRvbmUNCihYRU4pIEhWTTExOiBDcmVhdGluZyBNUCB0YWJsZXMgLi4u
DQooWEVOKSBIVk0xMTogTG9hZGluZyBDaXJydXMgVkdBQklPUyAuLi4NCihYRU4pIEhWTTExOiBM
b2FkaW5nIFBDSSBPcHRpb24gUk9NIC4uLg0KKFhFTikgSFZNMTE6ICAtIE1hbnVmYWN0dXJlcjog
aHR0cDovL2V0aGVyYm9vdC5vcmcNCihYRU4pIEhWTTExOiAgLSBQcm9kdWN0IG5hbWU6IGdQWEUN
CihYRU4pIEhWTTExOiBMb2FkaW5nIEFDUEkgLi4uDQooWEVOKSBIVk0xMTogdm04NiBUU1MgYXQg
ZmMwMTMzODANCihYRU4pIEhWTTExOiBCSU9TIG1hcDoNCihYRU4pIEhWTTExOiAgYzAwMDAtYzhm
ZmY6IFZHQSBCSU9TDQooWEVOKSBIVk0xMTogIGM5MDAwLWRhZmZmOiBFdGhlcmJvb3QgUk9NDQoo
WEVOKSBIVk0xMTogIGYwMDAwLWZmZmZmOiBNYWluIEJJT1MNCihYRU4pIEhWTTExOiBFODIwIHRh
YmxlOg0KKFhFTikgSFZNMTE6ICBbMDBdOiAwMDAwMDAwMDowMDAwMDAwMCAtIDAwMDAwMDAwOjAw
MDllMDAwOiBSQU0NCihYRU4pIEhWTTExOiAgWzAxXTogMDAwMDAwMDA6MDAwOWUwMDAgLSAwMDAw
MDAwMDowMDBhMDAwMDogUkVTRVJWRUQNCihYRU4pIEhWTTExOiAgSE9MRTogMDAwMDAwMDA6MDAw
YTAwMDAgLSAwMDAwMDAwMDowMDBlMDAwMA0KKFhFTikgSFZNMTE6ICBbMDJdOiAwMDAwMDAwMDow
MDBlMDAwMCAtIDAwMDAwMDAwOjAwMTAwMDAwOiBSRVNFUlZFRA0KKFhFTikgSFZNMTE6ICBbMDNd
OiAwMDAwMDAwMDowMDEwMDAwMCAtIDAwMDAwMDAwOmUwMDAwMDAwOiBSQU0NCihYRU4pIEhWTTEx
OiAgSE9MRTogMDAwMDAwMDA6ZTAwMDAwMDAgLSAwMDAwMDAwMDpmYzAwMDAwMA0KKFhFTikgSFZN
MTE6ICBbMDRdOiAwMDAwMDAwMDpmYzAwMDAwMCAtIDAwMDAwMDAxOjAwMDAwMDAwOiBSRVNFUlZF
RA0KKFhFTikgSFZNMTE6ICBbMDVdOiAwMDAwMDAwMTowMDAwMDAwMCAtIDAwMDAwMDAyOjFmODAw
MDAwOiBSQU0NCihYRU4pIEhWTTExOiBJbnZva2luZyBST01CSU9TIC4uLg0KKFhFTikgSFZNMTE6
ICRSZXZpc2lvbjogMS4yMjEgJCAkRGF0ZTogMjAwOC8xMi8wNyAxNzozMjoyOSAkDQooWEVOKSBz
dGR2Z2EuYzoxNDc6ZDExIGVudGVyaW5nIHN0ZHZnYSBhbmQgY2FjaGluZyBtb2Rlcw0KKFhFTikg
SFZNMTE6IFZHQUJpb3MgJElkOiB2Z2FiaW9zLmMsdiAxLjY3IDIwMDgvMDEvMjcgMDk6NDQ6MTIg
dnJ1cHBlcnQgRXhwICQNCihYRU4pIEhWTTExOiBCb2NocyBCSU9TIC0gYnVpbGQ6IDA2LzIzLzk5
DQooWEVOKSBIVk0xMTogJFJldmlzaW9uOiAxLjIyMSAkICREYXRlOiAyMDA4LzEyLzA3IDE3OjMy
OjI5ICQNCihYRU4pIEhWTTExOiBPcHRpb25zOiBhcG1iaW9zIHBjaWJpb3MgZWx0b3JpdG8gUE1N
DQooWEVOKSBIVk0xMToNCihYRU4pIEhWTTExOiBhdGEwIG1hc3RlcjogUUVNVSBEVkQtUk9NIEFU
QVBJLTQgQ0QtUm9tL0RWRC1Sb20NCihYRU4pIEhWTTExOiBhdGEwLTE6IFBDSFM9MTYzODMvMTYv
NjMgdHJhbnNsYXRpb249bGJhIExDSFM9MTAyNC8yNTUvNjMNCihYRU4pIEhWTTExOiBhdGEwICBz
bGF2ZTogUUVNVSBIQVJERElTSyBBVEEtNyBIYXJkLURpc2sgKCAyNzkgR0J5dGVzKQ0KKFhFTikg
SFZNMTE6DQooWEVOKSBIVk0xMToNCihYRU4pIEhWTTExOg0KKFhFTikgSFZNMTE6IFByZXNzIEYx
MiBmb3IgYm9vdCBtZW51Lg0KKFhFTikgSFZNMTE6DQooWEVOKSBIVk0xMTogQm9vdGluZyBmcm9t
IEhhcmQgRGlzay4uLg0KKFhFTikgSFZNMTE6IEJvb3RpbmcgZnJvbSAwMDAwOjdjMDANCihYRU4p
IEhWTTExOiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJhbmdlIGZmDQoo
WEVOKSBIVk0xMTogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBvZiByYW5nZSBm
ZQ0KKFhFTikgSFZNMTE6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFu
Z2UgZmQNCihYRU4pIEhWTTExOiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9m
IHJhbmdlIGZjDQooWEVOKSBIVk0xMTogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCBFTERMIG91
dCBvZiByYW5nZSBmYg0KKFhFTikgSFZNMTE6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgRUxE
TCBvdXQgb2YgcmFuZ2UgZmENCihYRU4pIEhWTTExOiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEs
IEVMREwgb3V0IG9mIHJhbmdlIGY5DQooWEVOKSBIVk0xMTogaW50MTNfY2Ryb206IGZ1bmN0aW9u
IDQxLCBFTERMIG91dCBvZiByYW5nZSBmOA0KKFhFTikgSFZNMTE6IGludDEzX2Nkcm9tOiBmdW5j
dGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2UgZjcNCihYRU4pIEhWTTExOiBpbnQxM19jZHJvbTog
ZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJhbmdlIGY2DQooWEVOKSBIVk0xMTogaW50MTNfY2Ry
b206IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBvZiByYW5nZSBmNQ0KKFhFTikgSFZNMTE6IGludDEz
X2Nkcm9tOiBmdW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2UgZjQNCihYRU4pIEhWTTExOiBp
bnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJhbmdlIGYzDQooWEVOKSBIVk0x
MTogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBvZiByYW5nZSBmMg0KKFhFTikg
SFZNMTE6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2UgZjENCihY
RU4pIEhWTTExOiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIEVMREwgb3V0IG9mIHJhbmdlIGYw
DQooWEVOKSBIVk0xMTogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCBFTERMIG91dCBvZiByYW5n
ZSBlZg0KKFhFTikgSFZNMTE6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgRUxETCBvdXQgb2Yg
cmFuZ2UgZWUNCihYRU4pIEhWTTExOiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIEVMREwgb3V0
IG9mIHJhbmdlIGVkDQooWEVOKSBIVk0xMTogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCBFTERM
IG91dCBvZiByYW5nZSBlYw0KKFhFTikgSFZNMTE6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwg
RUxETCBvdXQgb2YgcmFuZ2UgZWINCihYRU4pIEhWTTExOiBpbnQxM19jZHJvbTogZnVuY3Rpb24g
NDEsIEVMREwgb3V0IG9mIHJhbmdlIGVhDQooWEVOKSBIVk0xMTogaW50MTNfY2Ryb206IGZ1bmN0
aW9uIDQxLCBFTERMIG91dCBvZiByYW5nZSBlOQ0KKFhFTikgSFZNMTE6IGludDEzX2Nkcm9tOiBm
dW5jdGlvbiA0MSwgRUxETCBvdXQgb2YgcmFuZ2UgZTgNCihYRU4pIEhWTTExOiBpbnQxM19jZHJv
bTogZnVuY3Rpb24gNDEsIHVubWFwcGVkIGRldmljZSBmb3IgRUxETD1lNw0KKFhFTikgSFZNMTE6
IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0MSwgdW5tYXBwZWQgZGV2aWNlIGZvciBFTERMPWU2DQoo
WEVOKSBIVk0xMTogaW50MTNfY2Ryb206IGZ1bmN0aW9uIDQxLCB1bm1hcHBlZCBkZXZpY2UgZm9y
IEVMREw9ZTUNCihYRU4pIEhWTTExOiBpbnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIHVubWFwcGVk
IGRldmljZSBmb3IgRUxETD1lNA0KKFhFTikgSFZNMTE6IGludDEzX2Nkcm9tOiBmdW5jdGlvbiA0
MSwgdW5tYXBwZWQgZGV2aWNlIGZvciBFTERMPWUzDQooWEVOKSBIVk0xMTogaW50MTNfY2Ryb206
IGZ1bmN0aW9uIDQxLCB1bm1hcHBlZCBkZXZpY2UgZm9yIEVMREw9ZTINCihYRU4pIEhWTTExOiBp
bnQxM19jZHJvbTogZnVuY3Rpb24gNDEsIHVubWFwcGVkIGRldmljZSBmb3IgRUxETD1lMQ0KKFhF
Tikgc3RkdmdhLmM6MTUxOmQxMSBsZWF2aW5nIHN0ZHZnYQ0KKFhFTikgdmlyaWRpYW4uYzoxNDU6
ZDExIEd1ZXN0IG9zOg0KKFhFTikgdmlyaWRpYW4uYzoxNDc6ZDExICAgICAgICB2ZW5kb3I6IDEN
CihYRU4pIHZpcmlkaWFuLmM6MTQ5OmQxMSAgICAgICAgb3M6IDQNCihYRU4pIHZpcmlkaWFuLmM6
MTUxOmQxMSAgICAgICAgbWFqb3I6IDYNCihYRU4pIHZpcmlkaWFuLmM6MTUzOmQxMSAgICAgICAg
bWlub3I6IDENCihYRU4pIHZpcmlkaWFuLmM6MTU1OmQxMSAgICAgICAgc3A6IDENCihYRU4pIHZp
cmlkaWFuLmM6MTU3OmQxMSAgICAgICAgYnVpbGQ6IDFkYjENCihYRU4pIHZpcmlkaWFuLmM6MTYy
OmQxMSBTZXQgaHlwZXJjYWxsIHBhZ2UgM2ZmZmYwMDEuDQooWEVOKSBpcnEuYzoyNjQ6IERvbTEx
IFBDSSBsaW5rIDAgY2hhbmdlZCA1IC0+IDANCihYRU4pIGlycS5jOjI2NDogRG9tMTEgUENJIGxp
bmsgMSBjaGFuZ2VkIDEwIC0+IDANCihYRU4pIGlycS5jOjI2NDogRG9tMTEgUENJIGxpbmsgMiBj
aGFuZ2VkIDExIC0+IDANCihYRU4pIGlycS5jOjI2NDogRG9tMTEgUENJIGxpbmsgMyBjaGFuZ2Vk
IDUgLT4gMA0KKFhFTikgZG9tY3RsLmM6OTkyOmQwIG1lbW9yeV9tYXA6cmVtb3ZlOiBnZm49ZTAw
MDAgbWZuPWMwMDAwIG5yX21mbnM9MTAwMDANCihYRU4pIGRvbWN0bC5jOjk5MjpkMCBtZW1vcnlf
bWFwOnJlbW92ZTogZ2ZuPWYzMDIwIG1mbj1mYTUwMCBucl9tZm5zPTIwDQooWEVOKSBkb21jdGwu
YzoxMDYyOmQwIGlvcG9ydF9tYXA6cmVtb3ZlIGZfZ3BvcnQ9YzEwMCBmX21wb3J0PTYwMDAgbnA9
MTAwDQooWEVOKSBkb21jdGwuYzo5ODI6ZDAgbWVtb3J5X21hcDphZGQ6IGdmbj1lMDAwMCBtZm49
YzAwMDAgbnJfbWZucz0xMDAwMA0KKFhFTikgZG9tY3RsLmM6OTgyOmQwIG1lbW9yeV9tYXA6YWRk
OiBnZm49ZjMwMjAgbWZuPWZhNTAwIG5yX21mbnM9MjANCihYRU4pIGRvbWN0bC5jOjEwMzg6ZDAg
aW9wb3J0X21hcDphZGQgZl9ncG9ydD1jMTAwIGZfbXBvcnQ9NjAwMCBucD0xMDANCihYRU4pIGRv
bWN0bC5jOjk5MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWYzMDYwIG1mbj1mYTUyMCBucl9t
Zm5zPTQNCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDYwIG1m
bj1mYTUyMCBucl9tZm5zPTQNCihYRU4pIGRvbWN0bC5jOjk5MjpkMCBtZW1vcnlfbWFwOnJlbW92
ZTogZ2ZuPWYzMDZkIG1mbj1hMDEwNCBucl9tZm5zPTENCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBt
ZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDZkIG1mbj1hMDEwNCBucl9tZm5zPTENCihYRU4pIGRvbWN0
bC5jOjk5MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWYzMDY0IG1mbj1hMDEwMCBucl9tZm5z
PTQNCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDY0IG1mbj1h
MDEwMCBucl9tZm5zPTQNCihYRU4pIGRvbWN0bC5jOjk5MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTog
Z2ZuPWYzMDZlIG1mbj1hMDEwNSBucl9tZm5zPTENCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1v
cnlfbWFwOmFkZDogZ2ZuPWYzMDZlIG1mbj1hMDEwNSBucl9tZm5zPTENCihYRU4pIGRvbWN0bC5j
Ojk5MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWYzMDZmIG1mbj1mYmUwNCBucl9tZm5zPTEN
CihYRU4pIGRvbWN0bC5jOjk5MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWYzMDY4IG1mbj1m
YmUwMCBucl9tZm5zPTQNCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2Zu
PWYzMDZmIG1mbj1mYmUwNCBucl9tZm5zPTENCihYRU4pIGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlf
bWFwOmFkZDogZ2ZuPWYzMDY4IG1mbj1mYmUwMCBucl9tZm5zPTQNCihYRU4pIGRvbWN0bC5jOjk5
MjpkMCBtZW1vcnlfbWFwOnJlbW92ZTogZ2ZuPWUwMDAwIG1mbj1jMDAwMCBucl9tZm5zPTEwMDAw
DQooWEVOKSBkb21jdGwuYzo5OTI6ZDAgbWVtb3J5X21hcDpyZW1vdmU6IGdmbj1mMzAyMCBtZm49
ZmE1MDAgbnJfbWZucz0yMA0KKFhFTikgZG9tY3RsLmM6MTA2MjpkMCBpb3BvcnRfbWFwOnJlbW92
ZSBmX2dwb3J0PWMxMDAgZl9tcG9ydD02MDAwIG5wPTEwMA0KKFhFTikgZG9tY3RsLmM6OTgyOmQw
IG1lbW9yeV9tYXA6YWRkOiBnZm49ZTAwMDAgbWZuPWMwMDAwIG5yX21mbnM9MTAwMDANCihYRU4p
IGRvbWN0bC5jOjk4MjpkMCBtZW1vcnlfbWFwOmFkZDogZ2ZuPWYzMDIwIG1mbj1mYTUwMCBucl9t
Zm5zPTIwDQooWEVOKSBkb21jdGwuYzoxMDM4OmQwIGlvcG9ydF9tYXA6YWRkIGZfZ3BvcnQ9YzEw
MCBmX21wb3J0PTYwMDAgbnA9MTAwDQooWEVOKSBkb21jdGwuYzo5OTI6ZDAgbWVtb3J5X21hcDpy
ZW1vdmU6IGdmbj1mMzA2MCBtZm49ZmE1MjAgbnJfbWZucz00DQooWEVOKSBkb21jdGwuYzo5OTI6
ZDAgbWVtb3J5X21hcDpyZW1vdmU6IGdmbj1mMzA2ZCBtZm49YTAxMDQgbnJfbWZucz0xDQooWEVO
KSBkb21jdGwuYzo5ODI6ZDAgbWVtb3J5X21hcDphZGQ6IGdmbj1mMzA2ZCBtZm49YTAxMDQgbnJf
bWZucz0xDQooWEVOKSBkb21jdGwuYzo5ODI6ZDAgbWVtb3J5X21hcDphZGQ6IGdmbj1mMzA2MCBt
Zm49ZmE1MjAgbnJfbWZucz00DQooWEVOKSBkb21jdGwuYzo5OTI6ZDAgbWVtb3J5X21hcDpyZW1v
dmU6IGdmbj1mMzA2NCBtZm49YTAxMDAgbnJfbWZucz00DQooWEVOKSBkb21jdGwuYzo5ODI6ZDAg
bWVtb3J5X21hcDphZGQ6IGdmbj1mMzA2NCBtZm49YTAxMDAgbnJfbWZucz00DQooWEVOKSBkb21j
dGwuYzo5OTI6ZDAgbWVtb3J5X21hcDpyZW1vdmU6IGdmbj1mMzA2ZSBtZm49YTAxMDUgbnJfbWZu
cz0xDQooWEVOKSBkb21jdGwuYzo5ODI6ZDAgbWVtb3J5X21hcDphZGQ6IGdmbj1mMzA2ZSBtZm49
YTAxMDUgbnJfbWZucz0xDQooWEVOKSBkb21jdGwuYzo5OTI6ZDAgbWVtb3J5X21hcDpyZW1vdmU6
IGdmbj1mMzA2ZiBtZm49ZmJlMDQgbnJfbWZucz0xDQooWEVOKSBkb21jdGwuYzo5OTI6ZDAgbWVt
b3J5X21hcDpyZW1vdmU6IGdmbj1mMzA2OCBtZm49ZmJlMDAgbnJfbWZucz00DQooWEVOKSBkb21j
dGwuYzo5ODI6ZDAgbWVtb3J5X21hcDphZGQ6IGdmbj1mMzA2ZiBtZm49ZmJlMDQgbnJfbWZucz0x
DQooWEVOKSBkb21jdGwuYzo5ODI6ZDAgbWVtb3J5X21hcDphZGQ6IGdmbj1mMzA2OCBtZm49ZmJl
MDAgbnJfbWZucz00DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpTdWNjZXNzIQ0KLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQ==
--0016e6d27ccd36246104ae9030c4
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

--0016e6d27ccd36246104ae9030c4--


From xen-devel-bounces@lists.xensource.com Wed Oct 05 11:23:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 11: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 1RBW7l-0003Ma-N3; Wed, 05 Oct 2011 11:23:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBW6D-00038s-EN
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 11:21:53 -0700
X-Env-Sender: agx@sigxcpu.org
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317838901!20400992!1
X-Originating-IP: [87.79.238.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31031 invoked from network); 5 Oct 2011 18:21:42 -0000
Received: from static-87-79-238-240.netcologne.de (HELO honk.sigxcpu.org)
	(87.79.238.240)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 5 Oct 2011 18:21:42 -0000
Received: from localhost (localhost [127.0.0.1])
	by honk.sigxcpu.org (Postfix) with ESMTP id 615B29C003
	for <xen-devel@lists.xensource.com>;
	Wed,  5 Oct 2011 20:21:40 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at honk.sigxcpu.org
Received: from honk.sigxcpu.org ([127.0.0.1])
	by localhost (honk.sigxcpu.org [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id uCzpg0FFprQX for <xen-devel@lists.xensource.com>;
	Wed,  5 Oct 2011 20:21:39 +0200 (CEST)
Received: by bogon.sigxcpu.org (Postfix, from userid 1000)
	id B487851DBC; Wed,  5 Oct 2011 20:14:13 +0200 (CEST)
Date: Wed, 5 Oct 2011 20:14:13 +0200
From: Guido =?iso-8859-1?Q?G=FCnther?= <agx@sigxcpu.org>
To: xen-devel@lists.xensource.com
Message-ID: <20111005181413.GA32317@bogon.sigxcpu.org>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="6c2NcOVqGQ03X4Wi"
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
User-Agent: Mutt/1.5.21 (2010-09-15)
Subject: [Xen-devel] [PATCH] libxc: reset ctx->completed on each domain
	restore
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--6c2NcOVqGQ03X4Wi
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

Hi,
When using current libvirt git with libxenlight 4.1.1 restoring a domain
the second time like:

virsh save foo foo.img
virsh restore foo.img
virsh destroy foo
virsh restore foo.img

fails like:

xc: detail: xc_domain_restore start: p2m_size = 100000
xc: debug: batch 0
xc: debug: Use old firmware ioport from the checkpoint
xc: detail: Writing 0 bytes of QEMU data to /var/lib/xen/qemu-resume.733
xc: error: error zeroing magic pages (22 = Das Argument ist ungültig): Internal error
xc: detail: Restore exit with rc=1

Note the absence of any:

xc: debug: batch 1024

lines that are there on successful resumes. The attached patch fixes
this for me on 4.1.1. However current xen hg fails the same way and
since the static structs are gone I wonder what's causing it there. Any
ideas would be welcome!
Cheers,
 -- Guido

--6c2NcOVqGQ03X4Wi
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment;
	filename="0001-xc_domain_restore-reset-the-completed-flag.patch"

>From 1287d8d2fbc38bb0ab507756281e8d726cf92464 Mon Sep 17 00:00:00 2001
From: Guido Guenther <agx@sigxcpu.org>
Date: Wed, 5 Oct 2011 19:52:11 +0200
Subject: [PATCH] xc_domain_restore: reset the completed flag

otherwise long running processes like libvirt can resume a domain only
once.
---
 a/tools/libxc/xc_domain_restore.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c
index 083927a..6edd584 100644
--- a/tools/libxc/xc_domain_restore.c
+++ b/tools/libxc/xc_domain_restore.c
@@ -1145,6 +1145,7 @@ int xc_domain_restore(xc_interface *xch, int io_fd, uint32_t dom,
     memset(&tailbuf, 0, sizeof(tailbuf));
     tailbuf.ishvm = hvm;
 
+    ctx->completed = 0;
     /* For info only */
     ctx->nr_pfns = 0;
 
-- 
1.7.2.5


--6c2NcOVqGQ03X4Wi
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

--6c2NcOVqGQ03X4Wi--


From xen-devel-bounces@lists.xensource.com Wed Oct 05 12:44:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 12:44:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBXO0-0002BI-K1; Wed, 05 Oct 2011 12:44:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBXNR-0001yu-NR
	for Xen-devel@lists.xensource.com; Wed, 05 Oct 2011 12:43:39 -0700
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1317843793!47446079!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9632 invoked from network); 5 Oct 2011 19:43:15 -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; 5 Oct 2011 19:43:15 -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
	p95JhTNM027719
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 5 Oct 2011 19:43:30 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
	p95JhSQx016228
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 5 Oct 2011 19:43:28 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
	p95JhMha025165; Wed, 5 Oct 2011 14:43:22 -0500
MIME-Version: 1.0
Message-ID: <cc1256f9-4808-4d74-a321-6a3ec129cc05@default>
Date: Wed, 5 Oct 2011 12:43:23 -0700 (PDT)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: Larry Bassel <lbassel@codeaurora.org>
Subject: RE: [Xen-devel] Re: RFC -- new zone type
References: <20110928180909.GA7007@labbmf-linux.qualcomm.comCAOFJiu1_HaboUMqtjowA2xKNmGviDE55GUV4OD1vN2hXUf4-kQ@mail.gmail.com>
	<c2d9add1-0095-4319-8936-db1b156559bf@default
	20111005165643.GE7007@labbmf-linux.qualcomm.com>
In-Reply-To: <20111005165643.GE7007@labbmf-linux.qualcomm.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.0A090206.4E8CB363.007C:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: linux-mm@kvack.org, 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

> > You may be interested in the concept of "ephemeral pages"
> > introduced by transcendent memory ("tmem") and the cleancache
> > patchset which went upstream at 3.0.  If you write a driver
> > (called a "backend" in tmem language) that accepts pages
> > from cleancache, you would be able to use your 100MB contiguous
> > chunk of memory for clean pagecache pages when it is not needed
> > for your other purposes, easily discard all the pages when
> > you do need the space, then start using it for clean pagecache
> > pages again when you don't need it for your purposes anymore
> > (and repeat this cycle as many times as necessary).
> >
> > You maybe could call your driver "cleanzone".
> >
> > Zcache (also upstream in drivers/staging) does something like
> > this already, though you might not want/need to use compression
> > in your driver.  In zcache, space reclaim is driven by the kernel
> > "shrinker" code that runs when memory is low, but another trigger
> > could easily be used.  Also there is likely a lot of code in
> > zcache (e.g. tmem.c) that you could leverage.
> >
> > For more info, see:
> > http://lwn.net/Articles/454795/
> > http://oss.oracle.com/projects/tmem
> >
> > I'd be happy to answer any questions if you are still interested
> > after you have read the above documentation.
>=20
> It appears that ephemeral tmem ("cleancache") is at least
> close to meeting our needs.

Yes, I thought so also,

> We won't need to
> have virtualization or compression.

Right.  Those just demonstrate different interesting uses
of tmem/cleancache.

> I do have some questions (I've read the references
> you included in your email to me last week and a few
> of the links from the "project transcendent memory" one, but have
> not looked at any of the source yet):
>=20
> 1. Is it currently possible to specify the size of tmem
> (as for us it must be convertable into a large contiguous physical
> block of specified size)? Is is currently possible to specify
> the start of tmem? Are there any alignment constraints on
> the start or size?

Your "cleanzone" driver would have complete control over
this so there would be no constraints unless you (or
generic kernel code) choose to enforce them.

> 2. How does one "turn on" and "turn off" tmem (the memory
> which tmem uses may also be needed for the large contiguous
> memory block, or perhaps may be powered off entirely)?
> Is it simply that one always answers "no" for both
> get and put requests when it is "off"?

That's right.  However, you must ensure that stale data
isn't get'able after you've turned if off and then on again.
I don't think you'll need to do that... I think you
will be assuming all of the cleancache data is gone
(not preserved).

> 3. How portable is the tmem code? This needs to run
> on an ARM system.

I don't think there is any reason it wouldn't be portable.
If you are running on a system with a 32-bit pointer
but >4GB memory (e.g. "highmem"), that might add some
complexity, but I think those problems have now been
solved in zcache so should be solveable for cleanzone
also.

> 4. Apparently hooks are needed in the filesystem code --
> which filesystems are currently supported to be used with
> tmem? Is it difficult to add hooks for filesystems
> that aren't yet supported?

The hooks are currently in ext3, ext4, btrfs, and ocfs2.
If the filesystem is "well behaved" the support is easy
to add.

> 5. There are no dependencies on memory compaction
> or memory hotplug (or sparsemem), correct?

No dependencies.

Dan

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 13:42:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 13:42:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBYIZ-0007GB-AV; Wed, 05 Oct 2011 13:42:39 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBYHy-00073f-30
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 13:42:04 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317847301!56865843!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3869 invoked from network); 5 Oct 2011 20:41:43 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 5 Oct 2011 20:41:43 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:e81d:19ff:fe2d:9881])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 6BB5197F9;
	Wed,  5 Oct 2011 13:41:56 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 11D0720AA5;
	Wed,  5 Oct 2011 13:41:53 -0700 (PDT)
Message-ID: <4E8CC110.4010305@goop.org>
Date: Wed, 05 Oct 2011 13:41:52 -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: Fantu <fantonifabio@tiscali.it>
Subject: Re: [Xen-devel] Dom0 cpu utilisation irregularly distributed
References: <1317824534750-4872878.post@n5.nabble.com>
In-Reply-To: <1317824534750-4872878.post@n5.nabble.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
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/05/2011 07:22 AM, Fantu wrote:
> On some production servers with dom0 kernel 2.6.32 pvops and xen 4.0 and
> domus mainly windows with gplpv I noticed a strange cpu usage by the dom0
> mainly with the use of a single cpu, for example this take from one server:
> xm vcpu-list
> Name                                ID  VCPU   CPU State   Time(s) CPU
> Affinity
> ...
> Domain-0                             0     0     3   -b-  1043377.5 any cpu
> Domain-0                             0     1     2   r--  122083.9 any cpu
> Domain-0                             0     2     0   -b-  284636.1 any cpu
> Domain-0                             0     3     1   -b-   80772.9 any cpu
> ...
> Note the increased utilisation on the vcpu 0
>
> Domus cpu utilisation apparently successfully distributed but the dom0 has
> always use more of its vcpu 0
> Is this correct or there are bugs on kernel and/or xen?

VCPU use is entirely up to the guest kernels.  I suspect that cpu0 gets
heavier loading because there are a number of things which end up
running on cpu 0 by default, such as some kernel threads and interrupts.

You can try playing with interrupt migration on dom0 if you like.

But balanced CPU use isn't necessarily a good thing.  The kernel will
generally avoid migrating processes between CPUs needlessly, so unless
you're actually starved for CPU time, I would expect some VCPUs to be
underused compared to others.  It probably just means you've configured
dom0 with too many VCPUs.

    J

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 13:49:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 13:49:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBYPY-0007mv-Bu; Wed, 05 Oct 2011 13:49:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBYOk-0007aH-CB
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 13:49:02 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317847714!38661400!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13297 invoked from network); 5 Oct 2011 20:48:36 -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; 5 Oct 2011 20:48:36 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p95KmsFJ004785
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Wed, 5 Oct 2011 20:48:55 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p95Kh4mV003442
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 5 Oct 2011 20:43:05 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
	p95Kmlbq004511; Wed, 5 Oct 2011 15:48:48 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 05 Oct 2011 13:48:47 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id C7F754BE; Wed,  5 Oct 2011 11:16:01 -0400 (EDT)
Date: Wed, 5 Oct 2011 11:16:01 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony Wright <anthony@overnetdata.com>
Subject: Re: [Xen-devel] dmidecode doesn't work under xen 4.1.1 on certain
	hardware
Message-ID: <20111005151601.GA5223@phenom.oracle.com>
References: <20110923133200.GC19579@phenom.oracle.com>
	<4E7C9C8B.2010108@overnetdata.com>
	<20110926141322.GD4102@phenom.oracle.com>
	<4E8090D4.2090009@overnetdata.com>
	<20110926193732.GA10007@phenom.oracle.com>
	<4E82E429.2080600@overnetdata.com>
	<20110928132815.GE10270@phenom.oracle.com>
	<4E83462B.9080002@overnetdata.com> <4E835324.30902@citrix.com>
	<4E8AF9BA.3000906@overnetdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8AF9BA.3000906@overnetdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090207.4E8CC2B8.0075,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <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 Tue, Oct 04, 2011 at 01:19:06PM +0100, Anthony Wright wrote:
> On 28/09/2011 18:02, David Vrabel wrote:
> > On 28/09/11 17:07, Anthony Wright wrote:
> >> On 28/09/2011 14:28, Konrad Rzeszutek Wilk wrote:
> >>> Would you be up for testing a different variant of that patch just to make
> >>> sure?
> >> Not a problem, ship me the patch when you're ready. I'm running 3.0.4 at
> >> the moment and would prefer to stick with 3.0.x for now, so hope that
> >> won't be a problem.
> > I've just posted an updated patch series that should include a fix for
> > your dmidecode problem.
> >
> > http://lists.xensource.com/archives/html/xen-devel/2011-09/msg01621.html
> >
> > If you running 3.0.4 you will also need the first two patches from
> >
> > http://lists.xensource.com/archives/html/xen-devel/2011-09/msg00817.html
> >
> > Please give these a try and let me know if they work.
> >
> > Thanks.
> >
> > David
> I've tried to apply these patches by cutting and pasting them from the
> URL, but there's seven of them, I'm having to manually edit them due to
> the browser truncating them, and then most don't apply even when I relax
> the fuzzing.
> 
> Could you email me a single patch that applies to 3.0.4?

Anthony,

If you feel adventours you could use the oss.oracle.com/git/kwilk/xen.git
tree. Mainly the #linux-next or #testing branch. They both have David's new
e820 code.

The way to get it is:

git clone oss.oracle.com/git/kwilk/xen.git
cd xen
git checkout origin/linux-next
make -j90 

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 15:38:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 15:38:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBa6q-0005k1-9o; Wed, 05 Oct 2011 15:38:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBa5w-0005Wl-5I
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 15:37:46 -0700
X-Env-Sender: victor_ling12@yahoo.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1317854233!51565354!1
X-Originating-IP: [98.139.91.190]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3103 invoked from network); 5 Oct 2011 22:37:14 -0000
Received: from nm4-vm0.bullet.mail.sp2.yahoo.com (HELO
	nm4-vm0.bullet.mail.sp2.yahoo.com) (98.139.91.190)
	by server-7.tower-27.messagelabs.com with SMTP;
	5 Oct 2011 22:37:14 -0000
Received: from [98.139.91.66] by nm4.bullet.mail.sp2.yahoo.com with NNFMP;
	05 Oct 2011 22:37:39 -0000
Received: from [98.139.91.53] by tm6.bullet.mail.sp2.yahoo.com with NNFMP;
	05 Oct 2011 22:37:39 -0000
Received: from [127.0.0.1] by omp1053.mail.sp2.yahoo.com with NNFMP;
	05 Oct 2011 22:37:39 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: 636050.70396.bm@omp1053.mail.sp2.yahoo.com
Received: (qmail 87741 invoked by uid 60001); 5 Oct 2011 22:37:39 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024;
	t=1317854259; bh=cpSfTmKw/xIEJSPdDRltd+Cq08MMS7pm0Imb1xygZZU=;
	h=X-YMail-OSG:Received:X-Mailer:References:Message-ID:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type;
	b=6ZOGPCx4pcykJiMb0xPsVqENJyj0zNVUOWi3qVH7rWuoc9msw56yDCa4KltqrT41hr00nVKzLdBslmjQ4pseRrntgWK8sHeetKyQ/fPxMCSjZKCK+33QtT5dFF+2fppRxirhKWILXnHZ1WY1uIr04cTIjkjvY2nOAFNbO+wthCI=
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com;
	h=X-YMail-OSG:Received:X-Mailer:References:Message-ID:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type;
	b=DO2tvFdK1TKlvWJyeXwGXpQcYsmfZrAVo0TmpnRNsTyJXb9o4mh3pg0Rl3sms65myon85zPU+r/1baeJnU9zV+YdEXLX+yeGHPuG4JsnQhcWjEdgbxgY//YNjgzuK2j23vk1GHGw1UqotJOsplUP3L+JeOPb3a1kQ6FTEHGXnSo=;
X-YMail-OSG: pLgXpCwVM1lfSvD8dR6TjTNlwj4SC0oNKU4bYI6N5LpZPam
	tykNDlKDgU2TdXimrlHNN2OSoObvUlTJz8fFLepnQx82.wOZiIgRNXpSk4Vm
	_6mcRDJB.mGA1dgCWexJ6EiPZnJPADkQceUUwW_DCffTrfBuEVFBh2JUe08v
	ov39jpySKIKYhVAs0Gb_Wg.QmKEKgmuYqyfL4_Z0LcqlTKyKGuOIaZTptPgI
	4tGERusJukP8BzL._34Cq4EtkBNVyQ0E5u8xM_0pR0ciSiD7.OR3E9e85rp9
	15sNYZQz3O.rthCad5AralN6oNSscbK3TMhqY8tbZhFDJ2CkBPCXnoAL.kFP
	_vvNSnZHofIwfGWxTmf3gBLbGT2aXxjkYIrKSvBFmv9bhlmWraG6uk7F_d0r
	864wYq9g-
Received: from [12.207.18.42] by web114211.mail.gq1.yahoo.com via HTTP;
	Wed, 05 Oct 2011 15:37:38 PDT
X-Mailer: YahooMailWebService/0.8.114.317681
References: <1317165580.71822.YahooMailNeo@web114212.mail.gq1.yahoo.com>
	<1317668899.43096.YahooMailNeo@web114215.mail.gq1.yahoo.com>
Message-ID: <1317854258.87658.YahooMailNeo@web114211.mail.gq1.yahoo.com>
Date: Wed, 5 Oct 2011 15:37:38 -0700 (PDT)
From: Victor Ling <victor_ling12@yahoo.com>
To: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>
In-Reply-To: <1317668899.43096.YahooMailNeo@web114215.mail.gq1.yahoo.com>
MIME-Version: 1.0
Cc: 
Subject: [Xen-devel] Couple PCI passthrough questions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: Victor Ling <victor_ling12@yahoo.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="===============2015009134=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2015009134==
Content-Type: multipart/alternative;
	boundary="243959241-989488231-1317854258=:87658"

--243959241-989488231-1317854258=:87658
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

Hi,=0AI am running ubuntu 2.6.31-14-server for my DomU and Open suse=A0 2.6=
.37.1-1.2-xen for my Dom0.=0A=0AI got the following message from DomU conso=
le. I am doing PCI passthrough=0A=0AAny idea how to fix the problem?=0A=0AT=
hanks.=0A=0AVic=0A=0A[=A0=A0=A0 0.030714] PCI: Fatal: No config space acces=
s function found=0A=0A[=A0=A0=A0 0.063044] XENBUS: Device with no driver: d=
evice/pci/0=0A=0Aroot@ubuntu:~# dmesg | grep pci=0A[=A0=A0=A0 0.057274] pci=
_hotplug: PCI Hot Plug PCI Core version: 0.5=0A[=A0=A0=A0 0.057299] pciehp:=
 PCI Express Hot Plug Controller Driver version: 0.4=0A[=A0=A0=A0 0.063044]=
 XENBUS: Device with no driver: device/pci/0=0Aroot@ubuntu:~# uname -a=0ALi=
nux ubuntu 2.6.31-14-server #48-Ubuntu SMP Fri Oct 16 15:07:34 UTC 2009 x86=
_64 GNU/Linux=0Aroot@ubuntu:~# 
--243959241-989488231-1317854258=:87658
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

<html><body><div style=3D"color:#000; background-color:#fff; font-family:ti=
mes new roman, new york, times, serif;font-size:12pt"><div>Hi,</div><div><b=
r></div>I am running ubuntu 2.6.31-14-server for my DomU and Open suse&nbsp=
; 2.6.37.1-1.2-xen for my Dom0.<br><br>I got the following message from Dom=
U console. I am doing PCI passthrough<br><br>Any idea how to fix the proble=
m?<br><br>Thanks.<br><br>Vic<br><br><span>[&nbsp;&nbsp;&nbsp; 0.030714] PCI=
: Fatal: No config space access function found</span><div><br><span></span>=
</div><div>[&nbsp;&nbsp;&nbsp; 0.063044] XENBUS: Device with no driver: dev=
ice/pci/0<br></div><br>root@ubuntu:~# dmesg | grep pci<br>[&nbsp;&nbsp;&nbs=
p; 0.057274] pci_hotplug: PCI Hot Plug PCI Core version: 0.5<br>[&nbsp;&nbs=
p;&nbsp; 0.057299] pciehp: PCI Express Hot Plug Controller Driver version: =
0.4<br>[&nbsp;&nbsp;&nbsp; 0.063044] XENBUS: Device with no driver: device/=
pci/0<br>root@ubuntu:~# uname -a<br>Linux ubuntu 2.6.31-14-server
 #48-Ubuntu SMP Fri Oct 16 15:07:34 UTC 2009 x86_64 GNU/Linux<br>root@ubunt=
u:~# <br><br></div></body></html>
--243959241-989488231-1317854258=:87658--


--===============2015009134==
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

--===============2015009134==--


From xen-devel-bounces@lists.xensource.com Wed Oct 05 17:07:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 17:07:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBbUK-00082y-DN; Wed, 05 Oct 2011 17:07:00 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBbTG-0007qR-IA
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 17:05:55 -0700
X-Env-Sender: netlogic.xen@gmail.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1317859550!34121996!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10937 invoked from network); 6 Oct 2011 00:05:51 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 00:05:51 -0000
Received: by ggnk4 with SMTP id k4so2120081ggn.30
	for <xen-devel@lists.xensource.com>;
	Wed, 05 Oct 2011 17:05:49 -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=m2ULkG900hTCBHucLJrvS8vrx+xw+4OqAzuHho4Z+k4=;
	b=H9VzGJy8VjxFGvpz8xyaQXbDTEsvSa6C9L9WRksPaG7drGrpm+LDomvLVzvKVp6kaF
	iT6ffMGfHy90uM1aWMGZZolqAtNyU22lPscK+nqvUGxmWxEe58EHUdFkiOLaxImDx/Bf
	vvyHzqplSFzmxaY2OuNjAOl2w7KwUTs7g2LRo=
MIME-Version: 1.0
Received: by 10.68.31.129 with SMTP id a1mr1167398pbi.5.1317859549261; Wed, 05
	Oct 2011 17:05:49 -0700 (PDT)
Received: by 10.142.47.20 with HTTP; Wed, 5 Oct 2011 17:05:49 -0700 (PDT)
Date: Wed, 5 Oct 2011 17:05:49 -0700
Message-ID: <CAPw52B9wm-2VfRcLRhRBgpjDmgwU5LqNryZ0pLpNALF+eYpitQ@mail.gmail.com>
From: Prasad B <netlogic.xen@gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] reg dom0 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>
Content-Type: multipart/mixed; boundary="===============0454337593=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0454337593==
Content-Type: multipart/alternative; boundary=bcaec520f4334c300604ae961652

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

Hello All,

After a few months of hiatus, we have resumed working on mips port of Xen.
We are at the point of booting dom0 userland (init process and its
children).

The init process gets spawned and in turn forks off processes to run
commands in /etc/rc.d/init.d/rcS. However, the getty process does not seem
to run subsequently and hence the login prompt is not displayed. Dom 0 does
not use the uart and uses the hvc0 driver.

I searched the web for hints and there were suggestions to add directives
such as

1:2345:respawn:/sbin/getty 38400 hvc0

to /etc/inittab file. But that does not seem to help.

Could you please give any pointers to get getty talk to the console driver
correctly ?

Screenshot of the tail
-------------------------------

0:<6>console [hvc0] enabled, bootconsole disabled
0:<6>console [hvc0] enabled, bootconsole disabled
0:Delay calibration in progress:
0:<6>Calibrating delay using timer specific routine..   0:<c>3211.14
BogoMIPS (lpj=1605570)
0:<6>Security Framework initialized
0:Mount-cache hash table entries: 4096
0:Checking for the daddi bug...   0:no.
0:<6>NET: Registered protocol family 16
Booting paravirtualized kernel on Xen  0:<6>Xen version: 3.4.0 (dom0)

...

init started: BusyBox v1.14.0 (2009-05-01 15:38:41 PDT)
Mounting all Filesystems...
... mounting done

<at this point cpu_idle() gets called and the processor waits indefinitely
in a wait state>

thank you,
Prasad.

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

Hello All,<br><br>After a few months of hiatus, we have resumed working on =
mips port of Xen. We are at the point of booting dom0 userland (init proces=
s and its children). <br><br>The init process gets spawned and in turn fork=
s off processes to run commands in /etc/rc.d/init.d/rcS. However, the getty=
 process does not seem to run subsequently and hence the login prompt is no=
t displayed. Dom 0 does not use the uart and uses the hvc0 driver.<br>

<br>I searched the web for hints and there were suggestions to add directiv=
es such as <br><br>1:2345:respawn:/sbin/getty 38400 hvc0 <br><br>to /etc/in=
ittab file. But that does not seem to help. <br><br>Could you please give a=
ny pointers to get getty talk to the console driver correctly ?<br>
<br>Screenshot of the tail<br>
-------------------------------<br>=A0 <br>0:&lt;6&gt;console [hvc0] enable=
d, bootconsole disabled<br>0:&lt;6&gt;console [hvc0] enabled, bootconsole d=
isabled<br>0:Delay calibration in progress:<br>0:&lt;6&gt;Calibrating delay=
 using timer specific routine..=A0=A0 0:&lt;c&gt;3211.14 BogoMIPS (lpj=3D16=
05570)<br>
0:&lt;6&gt;Security Framework initialized<br>0:Mount-cache hash table entri=
es: 4096<br>0:Checking for the daddi bug...=A0=A0 0:no.<br>0:&lt;6&gt;NET: =
Registered protocol family 16<br>Booting paravirtualized kernel on Xen=A0 0=
:&lt;6&gt;Xen version: 3.4.0 (dom0)<br>
<br>...<br><br>init started: BusyBox v1.14.0 (2009-05-01 15:38:41 PDT)<br>M=
ounting all Filesystems...<br>... mounting done<br><br>&lt;at this point cp=
u_idle() gets called and the processor waits indefinitely in a wait state&g=
t;<br>
<br>thank you,<br>Prasad.<br>


--bcaec520f4334c300604ae961652--


--===============0454337593==
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

--===============0454337593==--


From xen-devel-bounces@lists.xensource.com Wed Oct 05 17:16:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 17:16:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBbdo-00006b-4G; Wed, 05 Oct 2011 17:16:48 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBbdH-0008MW-WC
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 17:16:16 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-5.tower-27.messagelabs.com!1317860149!47827660!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16424 invoked from network); 6 Oct 2011 00:15:50 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 6 Oct 2011 00:15:50 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:9c66:5cff:fecc:dbc4])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 4806842B;
	Wed,  5 Oct 2011 17:16:10 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 9CB4A20A2A;
	Wed,  5 Oct 2011 17:16:08 -0700 (PDT)
Message-ID: <4E8CF348.4080405@goop.org>
Date: Wed, 05 Oct 2011 17:16:08 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
In-Reply-To: <4E8B3489.60902@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/04/2011 09:30 AM, H. Peter Anvin wrote:
> On 10/04/2011 07:10 AM, Jason Baron wrote:
>> 1) The jmp +0, is a 'safe' no-op that I know is going to initially
>> boot for all x86. I'm not sure if there is a 5-byte nop that works on
>> all x86 variants - but by using jmp +0, we make it much easier to debug
>> cases where we may be using broken no-ops.
>>
> There are *plenty*.  jmp+0 is about as pessimal as you can get.

As an aside, do you know if a 2-byte unconditional jmp is any more
efficient than 5-byte, aside from just being a smaller instruction and
taking less icache?

    J

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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 17:18:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 17:18:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBbfG-0000Ub-1n; Wed, 05 Oct 2011 17:18:18 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBbeb-0000I3-R0
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 17:17:38 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317860230!38672791!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17921 invoked from network); 6 Oct 2011 00:17:11 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 6 Oct 2011 00:17:11 -0000
Received: from tazenda.hos.anvin.org ([IPv6:2001:470:861f::feed:face:f00d])
	(authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p960HERQ019988
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Wed, 5 Oct 2011 17:17:15 -0700
Message-ID: <4E8CF385.2080804@zytor.com>
Date: Wed, 05 Oct 2011 17:17:09 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org>
In-Reply-To: <4E8CF348.4080405@goop.org>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/05/2011 05:16 PM, Jeremy Fitzhardinge wrote:
> On 10/04/2011 09:30 AM, H. Peter Anvin wrote:
>> On 10/04/2011 07:10 AM, Jason Baron wrote:
>>> 1) The jmp +0, is a 'safe' no-op that I know is going to initially
>>> boot for all x86. I'm not sure if there is a 5-byte nop that works on
>>> all x86 variants - but by using jmp +0, we make it much easier to debug
>>> cases where we may be using broken no-ops.
>>>
>> There are *plenty*.  jmp+0 is about as pessimal as you can get.
> 
> As an aside, do you know if a 2-byte unconditional jmp is any more
> efficient than 5-byte, aside from just being a smaller instruction and
> taking less icache?
> 

I don't know for sure, no.  I probably depends on the CPU.

	-hpa


-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


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

From xen-devel-bounces@lists.xensource.com Wed Oct 05 18:05:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 18:05:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBcOl-0002k8-Ng; Wed, 05 Oct 2011 18:05:19 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBcMa-0002Vo-1x; Wed, 05 Oct 2011 18:03:39 -0700
X-Env-Sender: joseph.glanville@orionvm.com.au
X-Msg-Ref: server-6.tower-27.messagelabs.com!1317862954!51938578!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21557 invoked from network); 6 Oct 2011 01:02:35 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 01:02:35 -0000
Received: by iaqq3 with SMTP id q3so2432238iaq.30
	for <multiple recipients>; Wed, 05 Oct 2011 18:02:56 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.231.70.21 with SMTP id b21mr261855ibj.69.1317862976160; Wed,
	05 Oct 2011 18:02:56 -0700 (PDT)
Received: by 10.231.170.15 with HTTP; Wed, 5 Oct 2011 18:02:55 -0700 (PDT)
X-Originating-IP: [59.167.234.130]
In-Reply-To: <20111005170147.g064usrou8sk8kwc@webmail.utoronto.ca>
References: <CA+MHGGgJx8abUNKZ9yOS27TWaWcnCAqZ4s=H88aZyHy-MbfqgQ@mail.gmail.com>
	<4E8CC2DB.1060104@stalks.nooblet.org>
	<20111005170147.g064usrou8sk8kwc@webmail.utoronto.ca>
Date: Thu, 6 Oct 2011 12:02:55 +1100
Message-ID: <CAOzFzEjdNxFvu==U-pjZbB=F4BJACV4qov0HYjg_+gVZo0G-zA@mail.gmail.com>
From: Joseph Glanville <joseph.glanville@orionvm.com.au>
To: kuei.sun@utoronto.ca
Cc: xen-devel <xen-devel@lists.xensource.com>, xen-users@lists.xensource.com
Subject: [Xen-devel] Re: [Xen-users] block level intercept with blktap
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0062693359=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0062693359==
Content-Type: multipart/alternative; boundary=0015175dd79c8e859504ae96e2e8

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

Hi,

Developing blktap2 drivers in userspace is very easy.

You can find the source under tools/blktap2 in the Xen source tarball.
I suggest starting with the README and taking a look at
tools/blktap2/drivers/block_ram.c which is a simple ramdisk implementation.
Blktap2 also allows the creation of "stacking" drivers which would probably
be a good fit for an encryption driver as you could then use it with abitary
backends.
CC'd the xen-devel list if anyone wants to chime in?

Just a note, take a look at the post to xen-devel about the tap-ctl utility
being introduced, the documentation is yet to be updated to reflect it.

Joseph.




On 6 October 2011 08:01, <kuei.sun@utoronto.ca> wrote:

> Hi all,
>
> I am trying to implement a blktap driver which will intercept block data
> from DomU OS and perform encryption/decryption on the fly. Is this possible?
> Also, where can I get good documentation on the data structures used by
> blktap and how to install Xen from source on Debian Squeeze? Thank you all
> very much.
>
> -Jack
>
>
> ______________________________**_________________
> Xen-users mailing list
> Xen-users@lists.xensource.com
> http://lists.xensource.com/**xen-users<http://lists.xensource.com/xen-users>
>



-- 
*
Founder | Director | VP Research
Orion Virtualisation Solutions* | www.orionvm.com.au | Phone: 1300 56 99 52
| Mobile: 0428 754 846

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

Hi,<br><br>Developing blktap2 drivers in userspace is very easy.<br><br>You=
 can find the source under tools/blktap2 in the Xen source tarball.<br>I su=
ggest starting with the README and taking a look at tools/blktap2/drivers/b=
lock_ram.c which is a simple ramdisk implementation.<br>
Blktap2 also allows the creation of &quot;stacking&quot; drivers which woul=
d probably be a good fit for an encryption driver as you could then use it =
with abitary backends.<br>CC&#39;d the xen-devel list if anyone wants to ch=
ime in?<br>
<br>Just a note, take a look at the post to xen-devel about the tap-ctl uti=
lity being introduced, the documentation is yet to be updated to reflect it=
.<br><br>Joseph.<br><br><br><br><br><div class=3D"gmail_quote">On 6 October=
 2011 08:01,  <span dir=3D"ltr">&lt;<a href=3D"mailto:kuei.sun@utoronto.ca"=
>kuei.sun@utoronto.ca</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;">Hi all,<br>
<br>
I am trying to implement a blktap driver which will intercept block data fr=
om DomU OS and perform encryption/decryption on the fly. Is this possible? =
Also, where can I get good documentation on the data structures used by blk=
tap and how to install Xen from source on Debian Squeeze? Thank you all ver=
y much.<br>

<br>
-Jack<br>
<br>
<br>
______________________________<u></u>_________________<br>
Xen-users mailing list<br>
<a href=3D"mailto:Xen-users@lists.xensource.com" target=3D"_blank">Xen-user=
s@lists.xensource.com</a><br>
<a href=3D"http://lists.xensource.com/xen-users" target=3D"_blank">http://l=
ists.xensource.com/<u></u>xen-users</a><br>
</blockquote></div><br><br clear=3D"all"><br>-- <br><span style=3D"font-fam=
ily:arial,sans-serif;font-size:13px;border-collapse:collapse"><b><i><font c=
olor=3D"#0000ff"><div><font color=3D"#000000"><span style=3D"font-style:nor=
mal;font-weight:normal">Founder | Director | VP Research<br>
</span></font></div>Orion Virtualisation Solutions</font></i></b>=A0|=A0<fo=
nt color=3D"#0000ff"><a href=3D"http://www.orionvm.com.au/" style=3D"color:=
rgb(42, 93, 176)" target=3D"_blank">www.orionvm.com.au</a></font>=A0| Phone=
: 1300 56 99 52 | Mobile: 0428 754 846</span><br>


--0015175dd79c8e859504ae96e2e8--


--===============0062693359==
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

--===============0062693359==--


From xen-devel-bounces@lists.xensource.com Wed Oct 05 20:18:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 20:18:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBeTr-00078j-BX; Wed, 05 Oct 2011 20:18:43 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBeSF-0006vU-ED
	for Xen-devel@lists.xensource.com; Wed, 05 Oct 2011 20:17:05 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1317871009!40387215!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24438 invoked from network); 6 Oct 2011 03:16:50 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 6 Oct 2011 03:16:50 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p963Gurn010743
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Thu, 6 Oct 2011 03:16:58 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p963GtOe029525
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 6 Oct 2011 03:16:56 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
	p963GovT017332; Wed, 5 Oct 2011 22:16:50 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 05 Oct 2011 20:16:50 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 65B781C0; Wed,  5 Oct 2011 23:16:49 -0400 (EDT)
Date: Wed, 5 Oct 2011 23:16:49 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Victor Ling <victor_ling12@yahoo.com>
Subject: Re: [Xen-devel] Couple PCI passthrough questions
Message-ID: <20111006031649.GA20150@phenom.oracle.com>
References: <1317165580.71822.YahooMailNeo@web114212.mail.gq1.yahoo.com>
	<1317668899.43096.YahooMailNeo@web114215.mail.gq1.yahoo.com>
	<1317854258.87658.YahooMailNeo@web114211.mail.gq1.yahoo.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1317854258.87658.YahooMailNeo@web114211.mail.gq1.yahoo.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090204.4E8D1DAA.004D,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 Wed, Oct 05, 2011 at 03:37:38PM -0700, Victor Ling wrote:
> Hi,
> I am running ubuntu 2.6.31-14-server for my DomU and Open suse=A0 2.6.3=
7.1-1.2-xen for my Dom0.
>=20
> I got the following message from DomU console. I am doing PCI passthrou=
gh
>=20
> Any idea how to fix the problem?

Well, The PCI frontend code was merged in 2.6.38 time-frame, so you need =
to update
your kernel. Perhaps the 3.0.

>=20
> Thanks.
>=20
> Vic
>=20
> [=A0=A0=A0 0.030714] PCI: Fatal: No config space access function found
>=20
> [=A0=A0=A0 0.063044] XENBUS: Device with no driver: device/pci/0
>=20
> root@ubuntu:~# dmesg | grep pci
> [=A0=A0=A0 0.057274] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
> [=A0=A0=A0 0.057299] pciehp: PCI Express Hot Plug Controller Driver ver=
sion: 0.4
> [=A0=A0=A0 0.063044] XENBUS: Device with no driver: device/pci/0
> root@ubuntu:~# uname -a
> Linux ubuntu 2.6.31-14-server #48-Ubuntu SMP Fri Oct 16 15:07:34 UTC 20=
09 x86_64 GNU/Linux
> root@ubuntu:~#=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 Wed Oct 05 21:09:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 21:09:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBfGr-000093-Ro; Wed, 05 Oct 2011 21:09:22 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBfFB-0008NU-Fw
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 21:08:03 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317874038!56889538!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5145 invoked from network); 6 Oct 2011 04:07:18 -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;
	6 Oct 2011 04:07:18 -0000
X-IronPort-AV: E=Sophos;i="4.68,495,1312156800"; 
   d="scan'208";a="8238885"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 04:07: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; Thu, 6 Oct 2011 05:07:33 +0100
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 1RBfF7-0001II-Fh;
	Thu, 06 Oct 2011 04:07:33 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RBfF7-00070T-7y;
	Thu, 06 Oct 2011 05:07:33 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9193-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 6 Oct 2011 05:07:33 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9193: 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 9193 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9193/

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-amd64-xl-sedf     14 guest-localmigrate/x10       fail    like 9192
 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                  0b66e6450ffe
baseline version:
 xen                  0b66e6450ffe

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 Oct 05 21:41:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 21:41:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBfm7-0001Lc-ND; Wed, 05 Oct 2011 21:41:39 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBfl7-00015Z-7w
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 21:40:38 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1317876000!57627250!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15120 invoked from network); 6 Oct 2011 04:40:01 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 04:40:01 -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=a09NDutS2uN5SBrzPz2+dIPtU6I3u9t+S6fH2Fn1txbmYDV6g6PzGh1m
	qNEXfy+6WOB65GS9HzOVTZuOr/FUSmVPoONypL+J186mjScAivHz/j0b9
	uYN7qEWPW9bGpz/qsulm7H2u5GDrMaxUsTwjD2TPHGTIO7IEiiLtOVjWs
	a5yo5OV9pNceXmZZZp5o7ElFB2hdD8Hp0FcVajLUhXRTmb12tdaSzceCK
	f5tUfUJiQbAvBiWHkXVnAtinIituI;
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=1317876034; x=1349412034;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to;
	bh=CMOBMl1xCQVDdNTtNgUghtoRNReDNnyYXiKBx3GdJHw=;
	b=MxoonREUav3qMoQNY+K5KWMfBkSb7h1Swdp+6CvhwNfIOwCa0cgb6len
	xOZVn0d56JIgCxzkAgmX5jHWTrWTTvi6+9ENP9FCxOYkl8niw+33Gl0Gt
	aaNgwMtejSdX28JV6mD40iY2KiGBHoNrzXPRvwoF2kZnlXs6pWYbE+I0C
	v2QKNzAAzfO9TnVhWw2XGk/OapabTJ8GYk7Fe0dLVjOAtzbUkdfSM5xvc
	dc/WB39UZi6+XOeCnZsD4c+EE+iN0;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.68,494,1312149600"; d="scan'208,217";a="76056907"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 06 Oct 2011 06:40:32 +0200
X-IronPort-AV: E=Sophos;i="4.68,494,1312149600"; 
	d="scan'208,217";a="120734691"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 06 Oct 2011 06:40:31 +0200
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id A76BD76B6DB;
	Thu,  6 Oct 2011 06:40:31 +0200 (CEST)
Message-ID: <4E8D313F.8040809@ts.fujitsu.com>
Date: Thu, 06 Oct 2011 06:40:31 +0200
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.21) Gecko/20110831 Iceowl/1.0b2 Icedove/3.1.13
MIME-Version: 1.0
To: "Kay, Allen M" <allen.m.kay@intel.com>
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
References: <987664A83D2D224EAE907B061CE93D5301EE62D025@orsmsx505.amr.corp.intel.com>	<4E8BE0DB.7040503@ts.fujitsu.com>
	<987664A83D2D224EAE907B061CE93D5301EE62D5F4@orsmsx505.amr.corp.intel.com>
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301EE62D5F4@orsmsx505.amr.corp.intel.com>
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>
Content-Type: multipart/mixed; boundary="===============1146125881=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1146125881==
Content-Type: multipart/alternative;
	boundary="------------090207080709080501090407"

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

Hi Allen,

On 10/05/2011 06:24 PM, Kay, Allen M wrote:
>
> > This is fixed with cs 23049 in xen-unstable:
>
> >
>
> > http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html
>
> I'm using the latest staging tree (cs# 23903) and still seeing this problem.
>

Uuh, the same bug was introduced again.
Could you try the following patch:

diff -r 0b66e6450ffe tools/libfsimage/xfs/Makefile
--- a/tools/libfsimage/xfs/Makefile     Tue Oct 04 14:18:30 2011 +0200
+++ b/tools/libfsimage/xfs/Makefile     Thu Oct 06 06:32:00 2011 +0200
@@ -1,4 +1,4 @@ XEN_ROOT = ../../..
-XEN_ROOT = ../../..
+XEN_ROOT = $(CURDIR)/../../..

  LIB_SRCS-y = fsys_xfs.c


Keir, it is easy to catch this problem: create a .config file in all directories
_above_ $XEN_ROOT containing something like:

$(error usage of relative XEN_ROOT somewhere in $(MAKEFILE_LIST))


Juergen

> Allen
>
> *From:*Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
> *Sent:* Tuesday, October 04, 2011 9:45 PM
> *To:* Kay, Allen M
> *Cc:* xen-devel@lists.xensource.com; keir@xen.org
> *Subject:* Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
>
> On 10/04/2011 11:44 PM, Kay, Allen M wrote:
>
> Hi Keir,
>
> I'm getting the following build error caused by "-include 
> $(XEN_ROOT)/.config" line in Config.mk.  Removing it from Config.mk makes 
> the error go away.  The OS I'm using is FC15.  "$(XEN_ROOT)/.config" does 
> not exist.
>
> Allen
>
> -------
>
> make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
>
> make[4]: *** ../../.config: Is a directory.  Stop.
>
> make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
>
> make[3]: *** [subdir-clean-check] Error 2
>
> make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
>
> make[2]: *** [subdirs-clean] Error 2
>
> make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
>
> make[1]: *** [clean] Error 2
>
> make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
>
> make: *** [world] Error 2
>
>
> This is fixed with cs 23049 in xen-unstable:
>
> http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html
>
>
> 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  <mailto: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


-- 
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


--------------090207080709080501090407
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">
    Hi Allen,<br>
    <br>
    On 10/05/2011 06:24 PM, Kay, Allen M wrote:
    <blockquote
cite="mid:987664A83D2D224EAE907B061CE93D5301EE62D5F4@orsmsx505.amr.corp.intel.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html;
        charset=ISO-8859-1">
      <meta name="Generator" content="Microsoft Word 12 (filtered
        medium)">
      <style><!--
/* Font Definitions */
@font-face
	{font-family:"MS Mincho";
	panose-1:2 2 6 9 4 2 5 8 3 4;}
@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;}
@font-face
	{font-family:Tahoma;
	panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
	{font-family:"\@MS Mincho";
	panose-1:2 2 6 9 4 2 5 8 3 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	color:black;}
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;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
	{mso-style-priority:99;
	mso-style-link:"Plain Text Char";
	margin:0in;
	margin-bottom:.0001pt;
	font-size:10.5pt;
	font-family:Consolas;}
pre
	{mso-style-priority:99;
	mso-style-link:"HTML Preformatted Char";
	margin:0in;
	margin-bottom:.0001pt;
	font-size:10.0pt;
	font-family:"Courier New";
	color:black;}
tt
	{mso-style-priority:99;
	font-family:"Courier New";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	color:black;}
span.EmailStyle18
	{mso-style-type:personal;
	font-family:"Calibri","sans-serif";
	color:windowtext;}
span.HTMLPreformattedChar
	{mso-style-name:"HTML Preformatted Char";
	mso-style-priority:99;
	mso-style-link:"HTML Preformatted";
	font-family:Consolas;
	color:black;}
span.EmailStyle22
	{mso-style-type:personal-reply;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
span.PlainTextChar
	{mso-style-name:"Plain Text Char";
	mso-style-priority:99;
	mso-style-link:"Plain Text";
	font-family:Consolas;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:10.0pt;}
@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="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
      <div class="WordSection1">
        <p class="MsoPlainText"><span style="font-family: &quot;MS
            Mincho&quot;;">&gt; </span>This is fixed with cs 23049 in
          xen-unstable:<o:p></o:p></p>
        <p class="MsoPlainText">&gt; <o:p></o:p></p>
        <p class="MsoPlainText">&gt;
          <a class="moz-txt-link-freetext" href="http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html">http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html</a><o:p></o:p></p>
        <p class="MsoPlainText"><o:p>&nbsp;</o:p></p>
        <p class="MsoPlainText">I&#8217;m using the latest staging tree (cs#
          23903) and still seeing this problem.</p>
      </div>
    </blockquote>
    <br>
    Uuh, the same bug was introduced again.<br>
    Could you try the following patch:<br>
    <br>
    diff -r 0b66e6450ffe tools/libfsimage/xfs/Makefile<br>
    --- a/tools/libfsimage/xfs/Makefile&nbsp;&nbsp;&nbsp;&nbsp; Tue Oct 04 14:18:30 2011
    +0200<br>
    +++ b/tools/libfsimage/xfs/Makefile&nbsp;&nbsp;&nbsp;&nbsp; Thu Oct 06 06:32:00 2011
    +0200<br>
    @@ -1,4 +1,4 @@ XEN_ROOT = ../../..<br>
    -XEN_ROOT = ../../..<br>
    +XEN_ROOT = $(CURDIR)/../../..<br>
    &nbsp;<br>
    &nbsp;LIB_SRCS-y = fsys_xfs.c<br>
    &nbsp;<br>
    <br>
    Keir, it is easy to catch this problem: create a .config file in all
    directories<br>
    _above_ $XEN_ROOT containing something like:<br>
    <br>
    $(error usage of relative XEN_ROOT somewhere in $(MAKEFILE_LIST))<br>
    <br>
    <br>
    Juergen<br>
    <br>
    <blockquote
cite="mid:987664A83D2D224EAE907B061CE93D5301EE62D5F4@orsmsx505.amr.corp.intel.com"
      type="cite">
      <div class="WordSection1">
        <p class="MsoPlainText"><o:p></o:p></p>
        <p class="MsoPlainText"><o:p>&nbsp;</o:p></p>
        <p class="MsoPlainText">Allen<o:p></o:p></p>
        <p class="MsoNormal"><span style="color: rgb(31, 73, 125);"><o:p>&nbsp;</o:p></span></p>
        <p class="MsoNormal"><span style="color: rgb(31, 73, 125);"><o:p>&nbsp;</o:p></span></p>
        <div>
          <div style="border-right: medium none; border-width: 1pt
            medium medium; border-style: solid none none; border-color:
            rgb(181, 196, 223) -moz-use-text-color -moz-use-text-color;
            padding: 3pt 0in 0in;">
            <p class="MsoNormal"><b><span style="font-size: 10pt;
                  font-family:
                  &quot;Tahoma&quot;,&quot;sans-serif&quot;; color:
                  windowtext;">From:</span></b><span style="font-size:
                10pt; font-family:
                &quot;Tahoma&quot;,&quot;sans-serif&quot;; color:
                windowtext;"> Juergen Gross
                [<a class="moz-txt-link-freetext" href="mailto:juergen.gross@ts.fujitsu.com">mailto:juergen.gross@ts.fujitsu.com</a>] <br>
                <b>Sent:</b> Tuesday, October 04, 2011 9:45 PM<br>
                <b>To:</b> Kay, Allen M<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:keir@xen.org">keir@xen.org</a><br>
                <b>Subject:</b> Re: [Xen-devel] build failure caused by
                $(XEN_ROOT)/.config<o:p></o:p></span></p>
          </div>
        </div>
        <p class="MsoNormal"><o:p>&nbsp;</o:p></p>
        <p class="MsoNormal">On 10/04/2011 11:44 PM, Kay, Allen M wrote:
          <o:p></o:p></p>
        <p class="MsoNormal">Hi Keir,<o:p></o:p></p>
        <p class="MsoNormal">&nbsp;<o:p></o:p></p>
        <p class="MsoNormal">I&#8217;m getting the following build error
          caused by &#8220;-include $(XEN_ROOT)/.config&#8221; line in Config.mk.&nbsp;
          Removing it from Config.mk makes the error go away.&nbsp; The OS
          I&#8217;m using is FC15.&nbsp; &#8220;$(XEN_ROOT)/.config&#8221; does not exist.<o:p></o:p></p>
        <p class="MsoNormal">&nbsp;<o:p></o:p></p>
        <p class="MsoNormal">Allen<o:p></o:p></p>
        <p class="MsoNormal">&nbsp;<o:p></o:p></p>
        <p class="MsoNormal">-------<o:p></o:p></p>
        <p class="MsoNormal">&nbsp;<o:p></o:p></p>
        <p class="MsoNormal">make[4]: Entering directory
          `/home/akay/xen-4.1-testing.hg/tools/check'<o:p></o:p></p>
        <p class="MsoNormal">make[4]: *** ../../.config: Is a
          directory.&nbsp; Stop.<o:p></o:p></p>
        <p class="MsoNormal">make[4]: Leaving directory
          `/home/akay/xen-4.1-testing.hg/tools/check'<o:p></o:p></p>
        <p class="MsoNormal">make[3]: *** [subdir-clean-check] Error 2<o:p></o:p></p>
        <p class="MsoNormal">make[3]: Leaving directory
          `/home/akay/xen-4.1-testing.hg/tools'<o:p></o:p></p>
        <p class="MsoNormal">make[2]: *** [subdirs-clean] Error 2<o:p></o:p></p>
        <p class="MsoNormal">make[2]: Leaving directory
          `/home/akay/xen-4.1-testing.hg/tools'<o:p></o:p></p>
        <p class="MsoNormal">make[1]: *** [clean] Error 2<o:p></o:p></p>
        <p class="MsoNormal">make[1]: Leaving directory
          `/home/akay/xen-4.1-testing.hg'<o:p></o:p></p>
        <p class="MsoNormal">make: *** [world] Error 2<o:p></o:p></p>
        <p class="MsoNormal"><span style="font-size: 12pt; font-family:
            &quot;Times New Roman&quot;,&quot;serif&quot;;"><o:p>&nbsp;</o:p></span></p>
        <p class="MsoNormal"><span style="font-size: 12pt; font-family:
            &quot;Times New Roman&quot;,&quot;serif&quot;;"><br>
          </span><tt><span style="font-size: 10pt;">This is fixed with
              cs 23049 in xen-unstable:</span></tt><span
            style="font-size: 10pt; font-family: &quot;Courier
            New&quot;;"><br>
            <br>
            <tt><a moz-do-not-send="true"
href="http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html">http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html</a></tt><br>
            <br>
            <br>
            <tt>Juergen</tt><br>
            <br>
          </span><span style="font-size: 12pt; font-family: &quot;Times
            New Roman&quot;,&quot;serif&quot;;"><o:p></o:p></span></p>
        <pre>-- <o:p></o:p></pre>
        <pre>Juergen Gross&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Principal Developer Operating Systems<o:p></o:p></pre>
        <pre>PDG ES&amp;S SWE OS6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Telephone: +49 (0) 89 3222 2967<o:p></o:p></pre>
        <pre>Fujitsu Technology Solutions&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e-mail: <a moz-do-not-send="true" href="mailto:juergen.gross@ts.fujitsu.com">juergen.gross@ts.fujitsu.com</a><o:p></o:p></pre>
        <pre>Domagkstr. 28&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; Internet: ts.fujitsu.com<o:p></o:p></pre>
        <pre>D-80807 Muenchen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Company details: ts.fujitsu.com/imprint.html<o:p></o:p></pre>
      </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>

--------------090207080709080501090407--


--===============1146125881==
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

--===============1146125881==--


From xen-devel-bounces@lists.xensource.com Wed Oct 05 23:55:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 05 Oct 2011 23:55:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBhrq-0005BK-00; Wed, 05 Oct 2011 23:55:42 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBhr3-0004ym-NM
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 23:54:54 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1317884090!16118434!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26683 invoked from network); 6 Oct 2011 06:54:50 -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;
	6 Oct 2011 06:54:50 -0000
X-IronPort-AV: E=Sophos;i="4.68,495,1312156800"; 
   d="scan'208";a="8240046"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 06:54:50 +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, 6 Oct 2011
	07:54:49 +0100
Subject: Re: [Xen-devel] reg dom0 console
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Prasad B <netlogic.xen@gmail.com>
In-Reply-To: <CAPw52B9wm-2VfRcLRhRBgpjDmgwU5LqNryZ0pLpNALF+eYpitQ@mail.gmail.com>
References: <CAPw52B9wm-2VfRcLRhRBgpjDmgwU5LqNryZ0pLpNALF+eYpitQ@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Thu, 6 Oct 2011 07:54:49 +0100
Message-ID: <1317884089.24742.9.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-10-06 at 01:05 +0100, Prasad B wrote:
> Hello All,
> 
> After a few months of hiatus, we have resumed working on mips port of
> Xen. We are at the point of booting dom0 userland (init process and
> its children). 

That sounds awesome! Are you close to having any initial patches for
submission?

> The init process gets spawned and in turn forks off processes to run
> commands in /etc/rc.d/init.d/rcS. However, the getty process does not
> seem to run subsequently and hence the login prompt is not displayed.
> Dom 0 does not use the uart and uses the hvc0 driver.
> 
> I searched the web for hints and there were suggestions to add
> directives such as 
> 
> 1:2345:respawn:/sbin/getty 38400 hvc0 
> 
> to /etc/inittab file. But that does not seem to help. 
> 
> Could you please give any pointers to get getty talk to the console
> driver correctly ?

Do you have something which is creating the actual /dev/hvc0 node? You
can probably boot with init=/bin/sh in order to get a shell to poke
around and check this with, run the getty by hand etc.

I had a vague recollection that the busybox inittab syntax was a little
different to standard sysvinit but google threw up various things which
suggest that what you've got is OK. Are you maybe in runlevel 1? You
could try changing the 2345->12345 to be sure. You probably want this
getty in single user mode anyway. Alternatively lots of example busybox
configurations I see on google seems to omit the runlevels, which I
guess means "all"?

Ian.

> 
> Screenshot of the tail
> -------------------------------
>   
> 0:<6>console [hvc0] enabled, bootconsole disabled
> 0:<6>console [hvc0] enabled, bootconsole disabled
> 0:Delay calibration in progress:
> 0:<6>Calibrating delay using timer specific routine..   0:<c>3211.14
> BogoMIPS (lpj=1605570)
> 0:<6>Security Framework initialized
> 0:Mount-cache hash table entries: 4096
> 0:Checking for the daddi bug...   0:no.
> 0:<6>NET: Registered protocol family 16
> Booting paravirtualized kernel on Xen  0:<6>Xen version: 3.4.0 (dom0)
> 
> ...
> 
> init started: BusyBox v1.14.0 (2009-05-01 15:38:41 PDT)
> Mounting all Filesystems...
> ... mounting done
> 
> <at this point cpu_idle() gets called and the processor waits
> indefinitely in a wait state>
> 
> thank you,
> Prasad.



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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 00:00:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 00:00:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBhwq-0005cI-HO; Thu, 06 Oct 2011 00:00:52 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBhup-0005P4-7q
	for xen-devel@lists.xensource.com; Wed, 05 Oct 2011 23:58:48 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1317884323!18340968!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23005 invoked from network); 6 Oct 2011 06:58:44 -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; 6 Oct 2011 06:58:44 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 06 Oct 2011 07:58:43 +0100
Message-Id: <4E8D6DFB02000078000599F3@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 06 Oct 2011 07:59:39 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Liwei" <xieliwei@gmail.com>
Subject: Re: [Xen-devel] MMIO emulation failed & successful reboot
References: <CAPE0SYwSPDu3eKiYq22E7x8f=4_5dracOShGQ7AjG_OicZdU5Q@mail.gmail.com>
In-Reply-To: <CAPE0SYwSPDu3eKiYq22E7x8f=4_5dracOShGQ7AjG_OicZdU5Q@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 <xen-devel@lists.xensource.com>, Dima Tisnek <dimaqq@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 05.10.11 at 19:03, Liwei <xieliwei@gmail.com> wrote:
>         (XEN) io.c:194:d5 MMIO emulation failed @
> 0010:fffff800036c7d00: 0f 28 04 10 0f 28

Sooner or later we will need to support at least the most fundamental
SSE (and perhaps also AVX) instructions. What I'm surprised about is
that this is a load from memory rather than a store - I would have
hoped that we could get away with just emulating stores.

Jan


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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 00:39:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 00:39:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBiY4-0006vy-S2; Thu, 06 Oct 2011 00:39:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBiXB-0006ja-DX
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 00:38:31 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-13.tower-21.messagelabs.com!1317886694!51731548!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30041 invoked from network); 6 Oct 2011 07:38:15 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 6 Oct 2011 07:38:15 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:224:d7ff:feba:c318])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id E2D20875D;
	Thu,  6 Oct 2011 00:38:19 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id AC188205DE;
	Wed,  5 Oct 2011 17:47:21 -0700 (PDT)
Message-ID: <4E8CFA99.8030805@goop.org>
Date: Wed, 05 Oct 2011 17:47:21 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
In-Reply-To: <4E8CF385.2080804@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/05/2011 05:17 PM, H. Peter Anvin wrote:
> On 10/05/2011 05:16 PM, Jeremy Fitzhardinge wrote:
>> On 10/04/2011 09:30 AM, H. Peter Anvin wrote:
>>> On 10/04/2011 07:10 AM, Jason Baron wrote:
>>>> 1) The jmp +0, is a 'safe' no-op that I know is going to initially
>>>> boot for all x86. I'm not sure if there is a 5-byte nop that works on
>>>> all x86 variants - but by using jmp +0, we make it much easier to debug
>>>> cases where we may be using broken no-ops.
>>>>
>>> There are *plenty*.  jmp+0 is about as pessimal as you can get.
>> As an aside, do you know if a 2-byte unconditional jmp is any more
>> efficient than 5-byte, aside from just being a smaller instruction and
>> taking less icache?
>>
> I don't know for sure, no.  I probably depends on the CPU.

I was thinking about making the jump-label stuff generate a small jmp if
the offset is small (specifically "jmp; nop3", or perhaps "jmp; ud2a;
nop" to make absolutely sure there's no speculation beyond the jmp), on
the grounds that, while it probably doesn't matter for any modern
Intel/AMD processor, it may help for others.  But I couldn't find any
concrete evidence to support it, and there's already enough questions
about doing "live" code updates without adding more instruction patterns.

    J

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 01:03:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 01:03:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBivi-0007jb-HP; Thu, 06 Oct 2011 01:03:46 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBit1-0007VU-Vo
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 01:01:19 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1317888058!53375835!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20960 invoked from network); 6 Oct 2011 08:00:58 -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;
	6 Oct 2011 08:00:58 -0000
Received: by wyh13 with SMTP id 13so3315945wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 01:00:56 -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=j5h+G9nPxY/MerdlWOMdj1fX68RPvEiina2fmxBXxtg=;
	b=q3vzsJKx4E3J7LsN21YD4O6UBgJ1tdaUwG2w4i6TRt+0eFW+9W0T3xfhkzk9vuLJ3Y
	Nm08jv1epWzvryQ+InjKpV0xfaZDMfi0w3/Vvk8njOeZWpuu4jCwxVAxVQ7X56J81r9X
	n+TBTs8kPitXhwdAOHaSBun0bAK5Hf1XB6CHw=
Received: by 10.227.132.69 with SMTP id a5mr557203wbt.105.1317888056660;
	Thu, 06 Oct 2011 01:00:56 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id h39sm8817870wbo.0.2011.10.06.01.00.54
	(version=SSLv3 cipher=OTHER); Thu, 06 Oct 2011 01:00:55 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 06 Oct 2011 09:00:49 +0100
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
From: Keir Fraser <keir.xen@gmail.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>,
	"Kay, Allen M" <allen.m.kay@intel.com>
Message-ID: <CAB31EC1.22461%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Index: AcyD/g9jZrtW0cWEWUm54XUfFacBEg==
In-Reply-To: <4E8D313F.8040809@ts.fujitsu.com>
Mime-version: 1.0
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 06/10/2011 05:40, "Juergen Gross" <juergen.gross@ts.fujitsu.com> wrote:

> =20
>  Uuh, the same bug was introduced again.
>  Could you try the following patch:

Whilst this is definitely a valid fix, Allen's build was crashing out from
tools/check. This is unlikely to fix it.

 -- Keir

>  diff -r 0b66e6450ffe tools/libfsimage/xfs/Makefile
>  --- a/tools/libfsimage/xfs/Makefile     Tue Oct 04 14:18:30 2011 +0200
>  +++ b/tools/libfsimage/xfs/Makefile     Thu Oct 06 06:32:00 2011 +0200
>  @@ -1,4 +1,4 @@ XEN_ROOT =3D ../../..
>  -XEN_ROOT =3D ../../..
>  +XEN_ROOT =3D $(CURDIR)/../../..
>  =20
>   LIB_SRCS-y =3D fsys_xfs.c
>  =20
> =20
>  Keir, it is easy to catch this problem: create a .config file in all
> directories
>  _above_ $XEN_ROOT containing something like:
> =20
>  $(error usage of relative XEN_ROOT somewhere in $(MAKEFILE_LIST))
> =20
> =20
>  Juergen
> =20
> =20
>> =20
>> =20
>>=20
>> =20
>> =20
>> =20
>> Allen
>> =20
>> =20
>> =20
>> =20
>> =20
>> =20
>> =20
>>=20
>> From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
>>  Sent: Tuesday, October 04, 2011 9:45 PM
>>  To: Kay, Allen M
>>  Cc: xen-devel@lists.xensource.com; keir@xen.org
>>  Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
>> =20
>> =20
>> =20
>> =20
>> =20
>> On 10/04/2011 11:44 PM, Kay, Allen M wrote:
>> =20
>> Hi Keir,
>> =20
>> =20
>> =20
>> I=B9m getting the following build error caused by =B3-include
>> $(XEN_ROOT)/.config=B2 line in Config.mk.  Removing it from Config.mk make=
s the
>> error go away.  The OS I=B9m using is FC15.  =B3$(XEN_ROOT)/.config=B2 does no=
t
>> exist.
>> =20
>> =20
>> =20
>> Allen
>> =20
>> =20
>> =20
>> -------
>> =20
>> =20
>> =20
>> make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
>> =20
>> make[4]: *** ../../.config: Is a directory.  Stop.
>> =20
>> make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
>> =20
>> make[3]: *** [subdir-clean-check] Error 2
>> =20
>> make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
>> =20
>> make[2]: *** [subdirs-clean] Error 2
>> =20
>> make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
>> =20
>> make[1]: *** [clean] Error 2
>> =20
>> make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
>> =20
>> make: *** [world] Error 2
>> =20
>> =20
>> =20
>>=20
>>  This is fixed with cs 23049 in xen-unstable:
>> =20
>>  http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.htm=
l
>> =20
>> =20
>>  Juergen
>> =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 Thu Oct 06 01:12:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 01: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 1RBj49-0008FH-DR; Thu, 06 Oct 2011 01:12:29 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBj39-00082T-Dx
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 01:11:30 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1317888663!43261321!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2806 invoked from network); 6 Oct 2011 08:11:04 -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;
	6 Oct 2011 08:11:04 -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=CPY9vgztxo7jVV0HSgvQrlMICReJJXmjnuMNDMWRKFkT8pX29b/XL3ox
	BgSM0OGfvva4fqS5JcXY4y8JAxTNUut65yBxg6ZJn0iUujWvyoCZgrIyL
	asPT8C+n41ZzWxF7y04JOhH8NuFBupu3f5pihybA9mQ+z/NaKfjWHIBMF
	aU3LwzOcfRXSRrIqn0SMTDUxi2QSM80jnh61ba4g1tUVAOGh808C5qv5L
	ey/9hlkOzhg2CVneXVemnkmNkmBI9;
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=1317888684; x=1349424684;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=IU2HVFvhhRyGIX4NCkk6sclGgGBD/ywcn9DqlCxhX34=;
	b=awzj41EmM41kVgjawEtHn+LnelaLw58QhTontgNtpEGxriAcELX52LNp
	t/3Kug/In8u5vUsyG6imbILXI1BuAw0Awk+XIWVrM3pCCcsv19WrKnlhO
	LiBJ3ZNp3b0yjymfGlZYF7s5cg4ZyYAhIoWttFLxliUB3L2dRCFSZ6yCN
	7d0dDy5YY4rMW+XB2Q+i8YlW81aX5m3uZwItx7l0c2G+wu/PLEGB30Qh4
	FOY78D66hPvHCWru7b27xrEPNRDMt;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.68,495,1312149600"; d="scan'208";a="76075148"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 06 Oct 2011 10:11:23 +0200
X-IronPort-AV: E=Sophos;i="4.68,495,1312149600"; d="scan'208";a="120748968"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 06 Oct 2011 10:11:23 +0200
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 8A7BD76B708;
	Thu,  6 Oct 2011 10:11:23 +0200 (CEST)
Message-ID: <4E8D62AB.9000008@ts.fujitsu.com>
Date: Thu, 06 Oct 2011 10:11:23 +0200
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.21) Gecko/20110831 Iceowl/1.0b2 Icedove/3.1.13
MIME-Version: 1.0
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
References: <CAB31EC1.22461%keir.xen@gmail.com>
In-Reply-To: <CAB31EC1.22461%keir.xen@gmail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, "Kay,
	Allen M" <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 10/06/2011 10:00 AM, Keir Fraser wrote:
> On 06/10/2011 05:40, "Juergen Gross"<juergen.gross@ts.fujitsu.com>  wrote:
>
>>
>>   Uuh, the same bug was introduced again.
>>   Could you try the following patch:
> Whilst this is definitely a valid fix, Allen's build was crashing out from
> tools/check. This is unlikely to fix it.

His build path suggests he is using xen-4.1-testing. cs23049 was applied directly
after branching xen 4.1.
In the current staging tree my patch fixes a similar problem in a different
Makefile.

Allen, which version are you really using?


Juergen

>>   diff -r 0b66e6450ffe tools/libfsimage/xfs/Makefile
>>   --- a/tools/libfsimage/xfs/Makefile     Tue Oct 04 14:18:30 2011 +0200
>>   +++ b/tools/libfsimage/xfs/Makefile     Thu Oct 06 06:32:00 2011 +0200
>>   @@ -1,4 +1,4 @@ XEN_ROOT = ../../..
>>   -XEN_ROOT = ../../..
>>   +XEN_ROOT = $(CURDIR)/../../..
>>
>>    LIB_SRCS-y = fsys_xfs.c
>>
>>
>>   Keir, it is easy to catch this problem: create a .config file in all
>> directories
>>   _above_ $XEN_ROOT containing something like:
>>
>>   $(error usage of relative XEN_ROOT somewhere in $(MAKEFILE_LIST))
>>
>>
>>   Juergen
>>
>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> Allen
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
>>>   Sent: Tuesday, October 04, 2011 9:45 PM
>>>   To: Kay, Allen M
>>>   Cc: xen-devel@lists.xensource.com; keir@xen.org
>>>   Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
>>>
>>>
>>>
>>>
>>>
>>> On 10/04/2011 11:44 PM, Kay, Allen M wrote:
>>>
>>> Hi Keir,
>>>
>>>
>>>
>>> I¹m getting the following build error caused by ³-include
>>> $(XEN_ROOT)/.config² line in Config.mk.  Removing it from Config.mk makes the
>>> error go away.  The OS I¹m using is FC15.  ³$(XEN_ROOT)/.config² does not
>>> exist.
>>>
>>>
>>>
>>> Allen
>>>
>>>
>>>
>>> -------
>>>
>>>
>>>
>>> make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
>>>
>>> make[4]: *** ../../.config: Is a directory.  Stop.
>>>
>>> make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
>>>
>>> make[3]: *** [subdir-clean-check] Error 2
>>>
>>> make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
>>>
>>> make[2]: *** [subdirs-clean] Error 2
>>>
>>> make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
>>>
>>> make[1]: *** [clean] Error 2
>>>
>>> make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
>>>
>>> make: *** [world] Error 2
>>>
>>>
>>>
>>>
>>>   This is fixed with cs 23049 in xen-unstable:
>>>
>>>   http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html
>>>
>>>
>>>   Juergen
>>>
>>>
>>>
>
>
> _______________________________________________
> 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 Oct 06 01:35:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 01:35:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBjQN-0000mN-LT; Thu, 06 Oct 2011 01:35:27 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBjPR-0000Tn-Km
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 01:34:29 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317890043!38719269!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17787 invoked from network); 6 Oct 2011 08:34:03 -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;
	6 Oct 2011 08:34:03 -0000
Received: by wyh13 with SMTP id 13so3368969wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 01:34:26 -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=BOkd8f7fF1KZjG7ljncAU+Sfjo7jeXpJKtFtkT/jKXc=;
	b=TpfpoGN2fHTYAGu+0RNkyJ1iQjuJGHyc0ZIGiehMKOD9JKJhxGYV3PcuoGrCaTCwew
	wZzP4dCm4oB8xXdjVa7hH+FC1ND0HR/lHT6qR+CLTumpcA/MJSiODp85VtZoyuG+piY/
	4JrxrymCWv9nqWGg53ps++4rCGhd85gZJKShY=
Received: by 10.216.230.137 with SMTP id j9mr733797weq.105.1317890066339;
	Thu, 06 Oct 2011 01:34:26 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id k26sm8895738wbo.16.2011.10.06.01.34.22
	(version=SSLv3 cipher=OTHER); Thu, 06 Oct 2011 01:34:25 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 06 Oct 2011 09:34:17 +0100
Subject: Re: [Xen-devel] MMIO emulation failed & successful reboot
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>,
	Liwei <xieliwei@gmail.com>
Message-ID: <CAB32699.22466%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] MMIO emulation failed & successful reboot
Thread-Index: AcyEArw/38iyaPlaHUKMpgTCM/Cnuw==
In-Reply-To: <4E8D6DFB02000078000599F3@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: xen-devel <xen-devel@lists.xensource.com>, Dima Tisnek <dimaqq@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 06/10/2011 07:59, "Jan Beulich" <JBeulich@suse.com> wrote:

>>>> On 05.10.11 at 19:03, Liwei <xieliwei@gmail.com> wrote:
>>         (XEN) io.c:194:d5 MMIO emulation failed @
>> 0010:fffff800036c7d00: 0f 28 04 10 0f 28
> 
> Sooner or later we will need to support at least the most fundamental
> SSE (and perhaps also AVX) instructions. What I'm surprised about is
> that this is a load from memory rather than a store - I would have
> hoped that we could get away with just emulating stores.

Supporting a few more MOV variants would be nice at least. We've got away
with MOVQ as our only supported MMX instruction for a long time...

We'd just need to extend the get_fpu() callback to understand and check for
X86_EMUL_sseN/avx.

 -- 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 Thu Oct 06 01:54:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 01:54:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBjiJ-0001WD-OU; Thu, 06 Oct 2011 01:54:00 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBjhY-0001KO-O6
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 01:53:13 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1317891189!19346271!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1522 invoked from network); 6 Oct 2011 08:53:09 -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; 6 Oct 2011 08:53:09 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 06 Oct 2011 09:53:09 +0100
Message-Id: <4E8D88CE0200007800059A1A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 06 Oct 2011 09:54:06 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Olaf Hering" <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 2 of 3] linux-2.6.18: xen/pv-on-hvm
	kexec: prevent crash in xenwatch_thread() when stale watch
	events arrive
References: <patchbomb.1317823853@probook.site>
	<94943cf143035aa7adbe.1317823855@probook.site>
In-Reply-To: <94943cf143035aa7adbe.1317823855@probook.site>
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 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 05.10.11 at 16:10, Olaf Hering <olaf@aepfle.de> wrote:
> linux-2.6.18: xen/pv-on-hvm kexec: prevent crash in xenwatch_thread() =
when=20
> stale watch events arrive
>=20
> commit c4c303c7c5679b4b368e12f41124aee29c325b76
>=20
> During repeated kexec boots xenwatch_thread() can crash because
> xenbus_watch->callback is cleared by xenbus_watch_path() if a node/token
> combo for a new watch happens to match an already registered watch from
> an old kernel.  In this case xs_watch returns -EEXISTS, then
> register_xenbus_watch() does not remove the to-be-registered watch from
> the list of active watches but returns the -EEXISTS to the caller
> anyway.
>=20
> Because the watch is still active in xenstored it will cause an event
> which will arrive in the new kernel. process_msg() will find the
> encapsulated struct xenbus_watch in its list of registered watches and
> puts the "empty" watch handle in the queue for xenwatch_thread().
> xenwatch_thread() then calls ->callback which was cleared earlier by
> xenbus_watch_path().
>=20
> To prevent that crash in a guest running on an old xen toolstack remove
> the special -EEXIST handling.
>=20
> v2:
>  - remove the EEXIST handing in register_xenbus_watch() instead of
>    checking for ->callback in process_msg()
>=20
> Signed-off-by: Olaf Hering <olaf@aepfle.de>
>=20
> diff -r 86e85596d64b -r 94943cf14303 drivers/xen/xenbus/xenbus_xs.c
> --- a/drivers/xen/xenbus/xenbus_xs.c
> +++ b/drivers/xen/xenbus/xenbus_xs.c
> @@ -656,8 +656,7 @@ int register_xenbus_watch(struct xenbus_
> =20
>  	err =3D xs_watch(watch->node, token);
> =20
> -	/* Ignore errors due to multiple registration. */
> -	if ((err !=3D 0) && (err !=3D -EEXIST)) {
> +	if (err) {

While I committed the other two patches in this series, this one seems
to have the potential for regressions (the comment and the checking for
-EEXIST can be assumed to have been there for a reason - whether
they became stale by now is not obvious), so I'd like to double check
that you verified that there's no code path where
register_xenbus_watch() could be called twice for the same watch.

One group of cases of concern are the watches registered from
xenstore notifiers - these appears to be safe, but the fact that they
get called just once is only implicitly derivable walking through the
code. And that may break the moment xenstore becomes a restartable
entity.

The other possibly problematic case is that of watches user mode
can register through writing the xenbus device: Here the patch
definitely changes behavior observable by user mode (a
re-registration does not cancel an existing watch without this
change).

Jan

>  		spin_lock(&watches_lock);
>  		list_del(&watch->list);
>  		spin_unlock(&watches_lock);



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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 02:04:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 02:04:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBjsH-000275-TY; Thu, 06 Oct 2011 02:04:18 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBjqd-0001u2-Dy
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 02:02:48 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1317891743!51748687!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11140 invoked from network); 6 Oct 2011 09:02:24 -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;
	6 Oct 2011 09:02:24 -0000
X-IronPort-AV: E=Sophos;i="4.68,495,1312156800"; 
   d="scan'208";a="8243053"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 09:01: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; Thu, 6 Oct 2011
	10:01:54 +0100
Subject: Re: [Xen-devel] [PATCH 2 of 3] linux-2.6.18: xen/pv-on-hvm	kexec:
	prevent crash in xenwatch_thread() when stale watch	events arrive
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Thu, 6 Oct 2011 10:01:53 +0100
In-Reply-To: <4E8D88CE0200007800059A1A@nat28.tlf.novell.com>
References: <patchbomb.1317823853@probook.site>
	<94943cf143035aa7adbe.1317823855@probook.site>
	<4E8D88CE0200007800059A1A@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: <1317891713.21903.225.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Olaf Hering <olaf@aepfle.de>,
	"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-10-06 at 09:54 +0100, Jan Beulich wrote:
> >>> On 05.10.11 at 16:10, Olaf Hering <olaf@aepfle.de> wrote:
> > linux-2.6.18: xen/pv-on-hvm kexec: prevent crash in xenwatch_thread() when 
> > stale watch events arrive
> > 
> > commit c4c303c7c5679b4b368e12f41124aee29c325b76
> > 
> > During repeated kexec boots xenwatch_thread() can crash because
> > xenbus_watch->callback is cleared by xenbus_watch_path() if a node/token
> > combo for a new watch happens to match an already registered watch from
> > an old kernel.  In this case xs_watch returns -EEXISTS, then
> > register_xenbus_watch() does not remove the to-be-registered watch from
> > the list of active watches but returns the -EEXISTS to the caller
> > anyway.
> > 
> > Because the watch is still active in xenstored it will cause an event
> > which will arrive in the new kernel. process_msg() will find the
> > encapsulated struct xenbus_watch in its list of registered watches and
> > puts the "empty" watch handle in the queue for xenwatch_thread().
> > xenwatch_thread() then calls ->callback which was cleared earlier by
> > xenbus_watch_path().
> > 
> > To prevent that crash in a guest running on an old xen toolstack remove
> > the special -EEXIST handling.
> > 
> > v2:
> >  - remove the EEXIST handing in register_xenbus_watch() instead of
> >    checking for ->callback in process_msg()
> > 
> > Signed-off-by: Olaf Hering <olaf@aepfle.de>
> > 
> > diff -r 86e85596d64b -r 94943cf14303 drivers/xen/xenbus/xenbus_xs.c
> > --- a/drivers/xen/xenbus/xenbus_xs.c
> > +++ b/drivers/xen/xenbus/xenbus_xs.c
> > @@ -656,8 +656,7 @@ int register_xenbus_watch(struct xenbus_
> >  
> >  	err = xs_watch(watch->node, token);
> >  
> > -	/* Ignore errors due to multiple registration. */
> > -	if ((err != 0) && (err != -EEXIST)) {
> > +	if (err) {
> 
> While I committed the other two patches in this series, this one seems
> to have the potential for regressions (the comment and the checking for
> -EEXIST can be assumed to have been there for a reason - whether
> they became stale by now is not obvious),

Keir said earlier it wasn't correct:
http://marc.info/?l=xen-devel&m=131358786516831&w=2

Ian.

>  so I'd like to double check
> that you verified that there's no code path where
> register_xenbus_watch() could be called twice for the same watch.
> 
> One group of cases of concern are the watches registered from
> xenstore notifiers - these appears to be safe, but the fact that they
> get called just once is only implicitly derivable walking through the
> code. And that may break the moment xenstore becomes a restartable
> entity.
> 
> The other possibly problematic case is that of watches user mode
> can register through writing the xenbus device: Here the patch
> definitely changes behavior observable by user mode (a
> re-registration does not cancel an existing watch without this
> change).
> 
> Jan
> 
> >  		spin_lock(&watches_lock);
> >  		list_del(&watch->list);
> >  		spin_unlock(&watches_lock);
> 
> 
> 
> _______________________________________________
> 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 Oct 06 02:17:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 02:17:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBk4j-0002dS-2D; Thu, 06 Oct 2011 02:17:09 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBk4D-0002RK-L6
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 02:16:38 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317892571!38728843!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17276 invoked from network); 6 Oct 2011 09:16:11 -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; 6 Oct 2011 09:16:11 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 06 Oct 2011 10:16:33 +0100
Message-Id: <4E8D8E4B0200007800059A36@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 06 Oct 2011 10:17:31 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Ian Campbell" <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 2 of 3] linux-2.6.18: xen/pv-on-hvm
	kexec: prevent crash in xenwatch_thread() when stale
	watch	events arrive
References: <patchbomb.1317823853@probook.site>
	<94943cf143035aa7adbe.1317823855@probook.site>
	<4E8D88CE0200007800059A1A@nat28.tlf.novell.com>
	<1317891713.21903.225.camel@zakaz.uk.xensource.com>
In-Reply-To: <1317891713.21903.225.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: Olaf Hering <olaf@aepfle.de>,
	"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 06.10.11 at 11:01, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Thu, 2011-10-06 at 09:54 +0100, Jan Beulich wrote:
>> >>> On 05.10.11 at 16:10, Olaf Hering <olaf@aepfle.de> wrote:
>> > linux-2.6.18: xen/pv-on-hvm kexec: prevent crash in xenwatch_thread() =
when=20
>> > stale watch events arrive
>> >=20
>> > commit c4c303c7c5679b4b368e12f41124aee29c325b76
>> >=20
>> > During repeated kexec boots xenwatch_thread() can crash because
>> > xenbus_watch->callback is cleared by xenbus_watch_path() if a =
node/token
>> > combo for a new watch happens to match an already registered watch =
from
>> > an old kernel.  In this case xs_watch returns -EEXISTS, then
>> > register_xenbus_watch() does not remove the to-be-registered watch =
from
>> > the list of active watches but returns the -EEXISTS to the caller
>> > anyway.
>> >=20
>> > Because the watch is still active in xenstored it will cause an event
>> > which will arrive in the new kernel. process_msg() will find the
>> > encapsulated struct xenbus_watch in its list of registered watches =
and
>> > puts the "empty" watch handle in the queue for xenwatch_thread().
>> > xenwatch_thread() then calls ->callback which was cleared earlier by
>> > xenbus_watch_path().
>> >=20
>> > To prevent that crash in a guest running on an old xen toolstack =
remove
>> > the special -EEXIST handling.
>> >=20
>> > v2:
>> >  - remove the EEXIST handing in register_xenbus_watch() instead of
>> >    checking for ->callback in process_msg()
>> >=20
>> > Signed-off-by: Olaf Hering <olaf@aepfle.de>
>> >=20
>> > diff -r 86e85596d64b -r 94943cf14303 drivers/xen/xenbus/xenbus_xs.c
>> > --- a/drivers/xen/xenbus/xenbus_xs.c
>> > +++ b/drivers/xen/xenbus/xenbus_xs.c
>> > @@ -656,8 +656,7 @@ int register_xenbus_watch(struct xenbus_
>> > =20
>> >  	err =3D xs_watch(watch->node, token);
>> > =20
>> > -	/* Ignore errors due to multiple registration. */
>> > -	if ((err !=3D 0) && (err !=3D -EEXIST)) {
>> > +	if (err) {
>>=20
>> While I committed the other two patches in this series, this one seems
>> to have the potential for regressions (the comment and the checking for
>> -EEXIST can be assumed to have been there for a reason - whether
>> they became stale by now is not obvious),
>=20
> Keir said earlier it wasn't correct:
> http://marc.info/?l=3Dxen-devel&m=3D131358786516831&w=3D2=20

Quoting him: "Either remove the EEXIST check, or convert EEXIST to
return code 0 in register_xenbus_watch(). You could do either, since
I'm sure I added the EEXIST check only as an attempt to theoretically
robustify that function, and looks like I got it wrong."

Removing the check (as Olaf did) doesn't deal with the xenbus device
case mentioned above. Converting it to zero would make sense (as
the watch asked for is actually registered after the function returns),
but would get Olaf's problem addressed afaict.

But wait - the xenbus device case is different because the watch
structure gets allocated, so if duplicate detection is really based on
the address of the watch structure (i.e. the token produced from
the address), this wouldn't be an issue then.

Further I only now notice that there's a list_add() of the watch
structure prior to the call to xs_watch() - if a watch was registered
twice, this would lead to a corrupted list.

So with that it looks like it's indeed pointless to handle the -EEXIST
case separately.

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 Oct 06 02:25:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 02:25:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBkCN-00037V-89; Thu, 06 Oct 2011 02:25:03 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBkBY-0002ub-CV
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 02:24:12 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317893059!54369658!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30880 invoked from network); 6 Oct 2011 09:24:20 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-3.tower-21.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 6 Oct 2011 09:24:20 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1317893048; l=1299;
	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=JU7SDN5SOSNHCRrmAO9vOzlhLq4=;
	b=JryvI59mkSsobD1Zr5pYGMQuXW2bvNcW9wkVn1T8YZtimA6C38cmhMaMJFETiWXK5Er
	O6LV8Y4nRfk7vN99XEjplPHa79jbZ+10+avTbaWMkiun47BWNoNqjSHJEBIZIDe2kp/xn
	AXHOIUYu9s/yXbPgCJNuJ3ZWV5y+cluh9Rs=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFGji0PEdOI
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-080-129.pools.arcor-ip.net [88.65.80.129])
	by smtp.strato.de (fruni mo22) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id R0395fn969KF5k ;
	Thu, 6 Oct 2011 11:23:45 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 53C9418B65; Thu,  6 Oct 2011 11:23:44 +0200 (CEST)
Date: Thu, 6 Oct 2011 11:23:44 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 2 of 3] linux-2.6.18: xen/pv-on-hvm kexec:
	prevent crash in xenwatch_thread() when stale watch events arrive
Message-ID: <20111006092343.GA3731@aepfle.de>
References: <patchbomb.1317823853@probook.site>
	<94943cf143035aa7adbe.1317823855@probook.site>
	<4E8D88CE0200007800059A1A@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <4E8D88CE0200007800059A1A@nat28.tlf.novell.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
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

On Thu, Oct 06, Jan Beulich wrote:

> While I committed the other two patches in this series, this one seems
> to have the potential for regressions (the comment and the checking for
> -EEXIST can be assumed to have been there for a reason - whether
> they became stale by now is not obvious), so I'd like to double check
> that you verified that there's no code path where
> register_xenbus_watch() could be called twice for the same watch.

Would there be any benefit from allowing such a second watch where path
and token match? In the end only one watcher will receive the event.
With this change such code bug will be found.

> The other possibly problematic case is that of watches user mode
> can register through writing the xenbus device: Here the patch
> definitely changes behavior observable by user mode (a
> re-registration does not cancel an existing watch without this
> change).

I did not know watches can be registered by domU userspace, and I
therfore did not consider this case.
Looking through xenbus_dev_write I think the patch does not change
behaviour because the requested watch-path may be the same, but the
generated token passed to xenstored will change each time a watch is
requested because the watch struct is allocated with kmalloc.

Olaf

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 03:13:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 03:13:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBkxV-0004ar-Cl; Thu, 06 Oct 2011 03:13:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBkwb-0004OR-1H
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 03:12:50 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1317895930!57678986!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29326 invoked from network); 6 Oct 2011 10:12:12 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 10:12:12 -0000
X-IronPort-AV: E=Sophos;i="4.68,495,1312156800"; 
   d="scan'208";a="8245224"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 10:12:17 +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, 6 Oct 2011 11:12:18 +0100
Date: Thu, 6 Oct 2011 11:12:12 +0100
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] Re: Still struggling with HVM: tx timeouts on emulated
	nics
In-Reply-To: <4E8C816B.7060608@canonical.com>
Message-ID: <alpine.DEB.2.00.1110061111060.3519@kaball-desktop>
References: <4E7B4768.8060103@canonical.com>
	<alpine.DEB.2.00.1109221838370.8700@kaball-desktop>
	<4E85883C.7030808@canonical.com>
	<alpine.DEB.2.00.1109301427590.3519@kaball-desktop>
	<4E85E8E8.2020702@canonical.com> <4E860382.7040108@canonical.com>
	<alpine.DEB.2.00.1110031800390.3519@kaball-desktop>
	<4E8C816B.7060608@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>,
	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, 5 Oct 2011, Stefan Bader wrote:
> On 03.10.2011 19:24, Stefano Stabellini wrote:
> > I am going to send a different patch upstream for Xen 4.2, because I
> > would also like it to cover the very unlikely scenario in which a PV
> > guest (like dom0 or a PV guest with PCI passthrough) is loosing level
> > interrupts because when Xen tries to set the corresponding event channel
> > pending the bit is alreay set. The codebase is different enough that
> > making the same change on 4.1 is non-trivial. I am appending the new
> > patch to this email, it would be great if you could test it. You just
> > need a 4.2 hypervisor, not the entire system. You should be able to
> > perform the test updating only xen.gz.
> > If you have trouble if xen-unstable.hg tip, try changeset 23843.
> 
> Hi Stefano,
> 
> currently I would have the problem that I don't have too much time to move to
> another hypervisor (tests may or may not be useful there with substantial
> changes beside this one) with our next release being close.
> But I think I got a usable backport of your change to 4.1.1 (you think it looks
> ok?) and have given that a quick test which seems to be ok...
> Though one drawback is that I don't have a setup which would use passthrough, so
> that path is not tested. I think I did see (with a debugging version) that the
> lost count was incremented and decremented in dom0, though.
> 

Honestly if you have to commit to a backport for your package right now,
I would go for the previous version, because it is simpler and less
likely to introduce regressions.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 04:08:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 04:08:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBloV-0006Gp-Dt; Thu, 06 Oct 2011 04:08:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBlnM-00064C-2g
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 04:07:21 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-14.tower-21.messagelabs.com!1317899227!62424260!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1117 invoked from network); 6 Oct 2011 11:07:08 -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; 6 Oct 2011 11:07:08 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RBlnH-0005v9-TQ; Thu, 06 Oct 2011 11:07:15 +0000
Date: Thu, 6 Oct 2011 12:07:15 +0100
From: Tim Deegan <tim@xen.org>
To: Adin Scannell <adin@gridcentric.com>
Subject: Re: [Xen-devel] [PATCH 1/2] enable event channel wake-up for
	mem_event interfaces
Message-ID: <20111006110715.GC21091@ocelot.phlegethon.org>
References: <CAAJKtqoPDzEEY7xLQbFyOXrwNhBUJyV274LzRT-=0fPMbYjWkw@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAAJKtqoPDzEEY7xLQbFyOXrwNhBUJyV274LzRT-=0fPMbYjWkw@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

Hi, 

The general approach seems good.  A few comments on the detail, below:

At 17:24 -0400 on 28 Sep (1317230698), Adin Scannell wrote:
> -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. */
> +        gdprintk(XENLOG_INFO, "mem_event request slots for domain %d: %d\n",
> +                               d->domain_id, free_requests);
> +        WARN_ON(1);

If this is something that might happen on production systems (and is
basically benign except for the performance), we shouldn't print a full
WARN().  The printk is more than enough.

> +    }
> +
> +    return free_requests;
> +}
> +
> +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;
>  
> +    if( mem_event_check_ring(d, med) < 0 )

Xen coding style has another space between the 'if' and the '(' (here
and elsewhere).

> @@ -135,16 +166,28 @@ void mem_event_put_request(struct domain
>      req_prod++;
>  
>      /* Update ring */
> -    med->req_producers--;
>      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->domain_id == d->domain_id &&
> +        mem_event_ring_free(d, med) < d->max_vcpus )
> +        mem_event_mark_and_pause(current, med);
> +

This idiom of comparing domain-ids cropped up in the earlier mem-event
patches and seems to be spreading, but the right check is just
(current->domain == d).

Also: are there cases where current->domain != d?  If so, can't those cases
cause the ring to fill up?
  
> -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;
> +    int online = d->max_vcpus;
>  
5A> +    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_bit(_VPF_mem_event, &v->pause_flags) )
> +            online--;
> + 
> +    for_each_vcpu ( d, v )
> +    {
> +        if ( !(med->blocked) || online >= mem_event_ring_free(d, med) )
> +            break;

Is there a risk that under heavy mem-event loads vcpu 0 might starve
other vcpus entirely because they're never allowed to unpause here?

>          if ( test_and_clear_bit(_VPF_mem_event, &v->pause_flags) )
> +        {
>              vcpu_wake(v);
> +            online++;
> +            med->blocked--;
> +        }
> +    }
> +
> +    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_bit(_VPF_mem_event, &v->pause_flags) )
> +    {
> +        set_bit(_VPF_mem_event, &v->pause_flags);

Does this need to be an atomic test-and-set?

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 Oct 06 04:12:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 04:12:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBls8-0006i9-4P; Thu, 06 Oct 2011 04:12:16 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBlqi-0006T7-TR
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 04:11:08 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317899333!39144912!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14153 invoked from network); 6 Oct 2011 11:08:53 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 6 Oct 2011 11:08:53 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RBlqe-0005vv-J6; Thu, 06 Oct 2011 11:10:44 +0000
Date: Thu, 6 Oct 2011 12:10:44 +0100
From: Tim Deegan <tim@xen.org>
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] Re: mapping problems in xenpaging
Message-ID: <20111006111044.GD21091@ocelot.phlegethon.org>
References: <CACavRyB4kvMLZK1-vv9bJnVdnpKJBHTmnhJxt6g3eh88xY6FTg@mail.gmail.com>
	<20110929170244.GA29163@aepfle.de>
	<CAAJKtqrFuJkNAZZhRs8tC0ymgQTD0G2VTgYexQ9EhnCxsJNZuw@mail.gmail.com>
	<20111003145616.GA8610@aepfle.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20111003145616.GA8610@aepfle.de>
User-Agent: Mutt/1.4.2.1i
Cc: zhen shi <bickys1986@gmail.com>, xen-devel@lists.xensource.com,
	Adin Scannell <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:56 +0200 on 03 Oct (1317660976), Olaf Hering wrote:
> On Fri, Sep 30, Adin Scannell wrote:
> 
> > >>  When we analyze and test xenpaging,we found there are some problems between
> > >> mapping and xenpaging.
> > >>  1) When mapping firstly, then do xenpaging,and the code paths have resolved
> > >> the problems.It's OK.
> > >>  2) The problems exists if we do address mapping firstly then go to
> > >> xenpaging,and our confusions are as followings:
> > >>    a) If the domU's memory is directly mapped to dom0,such as the hypercall
> > >> from pv driver,then it will build a related page-table in dom0,which will not
> > >> change p2m-type.
> > >>       and then do the xenpaging to page out the domU's memory pages whose gfn
> > >> address have been already mapped to dom0;So it will cause some problems when
> > >> dom0
> > >>       accesses these pages.Because these pages are paged-out,and dom0 cannot
> > >> tell the p2mt before access the pages.
> > >
> > > I'm not entirely sure what you do. xenpaging runs in dom0 and is able to
> > > map paged-out pages. It uses that to trigger a page-in, see
> > > tools/xenpaging/pagein.c in xen-unstable.hg
> > 
> > Here's my take...
> > 
> > Xenpaging doesn't allow selection of pages that have been mapped by
> > other domains (as in p2m.c):
> > 
> >  669 int p2m_mem_paging_nominate(struct domain *d, unsigned long gfn)
> > ....
> >  693     /* Check page count and type */
> >  694     page = mfn_to_page(mfn);
> >  695     if ( (page->count_info & (PGC_count_mask | PGC_allocated)) !=
> >  696          (1 | PGC_allocated) )
> >  697         goto out;
> > 
> > *However*, I think that the problem Zhen is describing still exists:
> > 1) xenpaging nominates a page, it is successful.
> > 2) dom0 maps the same page (a process other than xenpaging, which will
> > also map it).
> > 3) xenpaging evicts the page, successfully.
> > 
> > I've experienced a few nasty crashes, and I think this could account
> > for a couple (but certainly not all)... I think that the solution may
> > be to repeat the refcount check in paging_evict, and roll back the
> > nomination gracefully if the race is detected. Thoughts?
> 
> Are there really code paths that touch a mfn without going through the
> p2m functions? If so I will copy the check and update xenpaging.

No, but there are race conditions where CPU A could to the p2m lookup,
then CPU B nominates the page and changes its p2m entry, then CPU A
completes the mapping.  In the extreme case, detecting this in the
eviction code is also subject to the same race; some sort of atomic
lookup-and-get-reference operation seems like a better fix.

Tim.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 04:30:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 04:30:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBmAE-0007L9-8P; Thu, 06 Oct 2011 04:30:58 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBm9H-00078O-Rj
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 04:30:00 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1317900596!34207911!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12097 invoked from network); 6 Oct 2011 11:29:56 -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;
	6 Oct 2011 11:29:56 -0000
Received: by wwf27 with SMTP id 27so3370940wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 04:29:56 -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:cc;
	bh=e3Z+BaZXoVR8F+tU3mcbGvKr0GnGvs0laH77/CdqBM8=;
	b=BnuGt4/Ky1RjIoUYAhL/feWx3eEbdu/Q908bXRgLlrZitAvK5QN3ltSov9bVzsbYjf
	vKtEgtx6GhCbwNEk4e46PJjeIgTu6SMoIE2gYQmLk8PC+9mZHEs9UlqAirchuJ27fGQm
	LqO+YcEQi1b0OyIwRYyA/PidjD3BzZC6bGHQA=
Received: by 10.216.132.4 with SMTP id n4mr1036681wei.111.1317900596418;
	Thu, 06 Oct 2011 04:29:56 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fo7sm9671872wbb.20.2011.10.06.04.29.54
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 06 Oct 2011 04:29:55 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1317900424@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Thu, 06 Oct 2011 13:27:04 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 0 of 2] build: fixes for yajl and force xen
 tools to link to current libraries.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Minor build process fixes, to allow the use of LDFALGS and CFLAGS with folders that contain older versions of xen libraries and added a specific env variable to point to yajl header and library files.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 04:32:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 04:32:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBmBf-0007oM-Qz; Thu, 06 Oct 2011 04:32:27 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBm9J-00078P-Jv
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 04:30:02 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1317900596!34207911!2
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12223 invoked from network); 6 Oct 2011 11:29:58 -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;
	6 Oct 2011 11:29:58 -0000
Received: by mail-ww0-f43.google.com with SMTP id 27so3370940wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 04:29:58 -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:cc; bh=X6TI6gmcXORZHXS4rza1+qFd0tf3hJgQ0kfFgGyKKQ4=;
	b=X365XzPhTXjiSnjoyQcQHgkMljuS9kdy6PoT9XA2OiHa+7F5ktZGedAJhXqhH34CLV
	yzmQghXlo3nXovqViFnFGpsd8vp9MTtybIn0rs6015ky7rTJPsJ8sjnI/jYCha3+ch9i
	udk70tVbHK8JUepSAJSBiGiISYf9j3G2g8Ph8=
Received: by 10.227.24.82 with SMTP id u18mr910105wbb.111.1317900598473;
	Thu, 06 Oct 2011 04:29:58 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fo7sm9671872wbb.20.2011.10.06.04.29.56
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 06 Oct 2011 04:29:57 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: fb73bd21cdf7aed429f7e90e192dcbc034f3ca57
Message-Id: <fb73bd21cdf7aed429f7.1317900425@loki>
In-Reply-To: <patchbomb.1317900424@loki>
References: <patchbomb.1317900424@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Thu, 06 Oct 2011 13:27:05 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 1 of 2] build: link to specific library version
 (libxs, libxl, xenstore, xenstat)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317900003 -7200
# Node ID fb73bd21cdf7aed429f7e90e192dcbc034f3ca57
# Parent  a88029177dbcea6863a9c4e8e0cee81b08ecaed4
build: link to specific library version (libxs, libxl, xenstore, xenstat)

To avoid linking to an older version of xen libraries when compiling with LDFLAGS and CFLAGS set, explicitly pass the linker the library file to link to.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r a88029177dbc -r fb73bd21cdf7 tools/Rules.mk
--- a/tools/Rules.mk	Fri Sep 30 14:27:58 2011 +0100
+++ b/tools/Rules.mk	Thu Oct 06 13:20:03 2011 +0200
@@ -5,6 +5,21 @@ all:
 
 include $(XEN_ROOT)/Config.mk
 
+XLMAJOR = 2.0
+XLMINOR = 0
+
+XLUMAJOR = 1.0
+XLUMINOR = 0
+
+XCMAJOR = 4.2
+XCMINOR = 0
+
+XSMAJOR = 3.0
+XSMINOR = 0
+
+XSTATMAJOR=0
+XSTATMINOR=0
+
 export _INSTALL := $(INSTALL)
 INSTALL = $(XEN_ROOT)/tools/cross-install
 
@@ -18,19 +33,19 @@ XEN_BLKTAP2        = $(XEN_ROOT)/tools/b
 CFLAGS_xeninclude = -I$(XEN_INCLUDE)
 
 CFLAGS_libxenctrl = -I$(XEN_LIBXC) $(CFLAGS_xeninclude)
-LDLIBS_libxenctrl = -L$(XEN_LIBXC) -lxenctrl
+LDLIBS_libxenctrl = $(XEN_LIBXC)/libxenctrl.so.$(XCMAJOR).$(XCMINOR)
 SHLIB_libxenctrl  = -Wl,-rpath-link=$(XEN_LIBXC)
 
 CFLAGS_libxenguest = -I$(XEN_LIBXC) $(CFLAGS_xeninclude)
-LDLIBS_libxenguest = -L$(XEN_LIBXC) -lxenguest
+LDLIBS_libxenguest = $(XEN_LIBXC)/libxenguest.so.$(XCMAJOR).$(XCMINOR)
 SHLIB_libxenguest  = -Wl,-rpath-link=L$(XEN_LIBXC)
 
 CFLAGS_libxenstore = -I$(XEN_XENSTORE) $(CFLAGS_xeninclude)
-LDLIBS_libxenstore = -L$(XEN_XENSTORE) -lxenstore
+LDLIBS_libxenstore = $(XEN_XENSTORE)/libxenstore.so.$(XSMAJOR).$(XSMINOR)
 SHLIB_libxenstore  = -Wl,-rpath-link=$(XEN_XENSTORE)
 
 CFLAGS_libxenstat  = -I$(XEN_LIBXENSTAT)
-LDLIBS_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -L$(XEN_LIBXENSTAT) -lxenstat
+LDLIBS_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBXENSTAT)/libxenstat.so.$(XSTATMAJOR).$(XSTATMINOR)
 SHLIB_libxenstat  = -Wl,-rpath-link=$(XEN_LIBXENSTAT)
 
 ifeq ($(CONFIG_Linux),y)
@@ -50,7 +65,7 @@ SHLIB_libblktapctl  =
 endif
 
 CFLAGS_libxenlight = -I$(XEN_XENLIGHT) $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude)
-LDLIBS_libxenlight = -L$(XEN_XENLIGHT) $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl) -lxenlight
+LDLIBS_libxenlight = $(XEN_XENLIGHT)/libxenlight.so.$(XLMAJOR).$(XLMINOR) $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl)
 SHLIB_libxenlight  = -Wl,-rpath-link=$(XEN_XENLIGHT)
 
 CFLAGS += -D__XEN_TOOLS__
diff -r a88029177dbc -r fb73bd21cdf7 tools/libxc/Makefile
--- a/tools/libxc/Makefile	Fri Sep 30 14:27:58 2011 +0100
+++ b/tools/libxc/Makefile	Thu Oct 06 13:20:03 2011 +0200
@@ -1,9 +1,6 @@
 XEN_ROOT = $(CURDIR)/../..
 include $(XEN_ROOT)/tools/Rules.mk
 
-MAJOR    = 4.2
-MINOR    = 0
-
 CTRL_SRCS-y       :=
 CTRL_SRCS-y       += xc_core.c
 CTRL_SRCS-$(CONFIG_X86) += xc_core_x86.c
@@ -87,12 +84,12 @@ OSDEP_PIC_OBJS := $(patsubst %.c,%.opic,
 
 LIB := libxenctrl.a
 ifneq ($(stubdom),y)
-LIB += libxenctrl.so libxenctrl.so.$(MAJOR) libxenctrl.so.$(MAJOR).$(MINOR)
+LIB += libxenctrl.so libxenctrl.so.$(XCMAJOR) libxenctrl.so.$(XCMAJOR).$(XCMINOR)
 endif
 
 LIB += libxenguest.a
 ifneq ($(stubdom),y)
-LIB += libxenguest.so libxenguest.so.$(MAJOR) libxenguest.so.$(MAJOR).$(MINOR)
+LIB += libxenguest.so libxenguest.so.$(XCMAJOR) libxenguest.so.$(XCMAJOR).$(XCMINOR)
 endif
 
 ifneq ($(stubdom),y)
@@ -113,15 +110,15 @@ libs: $(LIB)
 install: build
 	$(INSTALL_DIR) $(DESTDIR)$(LIBDIR)
 	$(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)
-	$(INSTALL_PROG) libxenctrl.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)
+	$(INSTALL_PROG) libxenctrl.so.$(XCMAJOR).$(XCMINOR) $(DESTDIR)$(LIBDIR)
 	$(INSTALL_DATA) libxenctrl.a $(DESTDIR)$(LIBDIR)
-	ln -sf libxenctrl.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)/libxenctrl.so.$(MAJOR)
-	ln -sf libxenctrl.so.$(MAJOR) $(DESTDIR)$(LIBDIR)/libxenctrl.so
+	ln -sf libxenctrl.so.$(XCMAJOR).$(XCMINOR) $(DESTDIR)$(LIBDIR)/libxenctrl.so.$(XCMAJOR)
+	ln -sf libxenctrl.so.$(XCMAJOR) $(DESTDIR)$(LIBDIR)/libxenctrl.so
 	$(INSTALL_DATA) xenctrl.h xenctrlosdep.h xentoollog.h $(DESTDIR)$(INCLUDEDIR)
-	$(INSTALL_PROG) libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)
+	$(INSTALL_PROG) libxenguest.so.$(XCMAJOR).$(XCMINOR) $(DESTDIR)$(LIBDIR)
 	$(INSTALL_DATA) libxenguest.a $(DESTDIR)$(LIBDIR)
-	ln -sf libxenguest.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)/libxenguest.so.$(MAJOR)
-	ln -sf libxenguest.so.$(MAJOR) $(DESTDIR)$(LIBDIR)/libxenguest.so
+	ln -sf libxenguest.so.$(XCMAJOR).$(XCMINOR) $(DESTDIR)$(LIBDIR)/libxenguest.so.$(XCMAJOR)
+	ln -sf libxenguest.so.$(XCMAJOR) $(DESTDIR)$(LIBDIR)/libxenguest.so
 	$(INSTALL_DATA) xenguest.h $(DESTDIR)$(INCLUDEDIR)
 
 .PHONY: TAGS
@@ -150,22 +147,22 @@ rpm: build
 libxenctrl.a: $(CTRL_LIB_OBJS)
 	$(AR) rc $@ $^
 
-libxenctrl.so: libxenctrl.so.$(MAJOR)
+libxenctrl.so: libxenctrl.so.$(XCMAJOR)
 	ln -sf $< $@
-libxenctrl.so.$(MAJOR): libxenctrl.so.$(MAJOR).$(MINOR)
+libxenctrl.so.$(XCMAJOR): libxenctrl.so.$(XCMAJOR).$(XCMINOR)
 	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)
+libxenctrl.so.$(XCMAJOR).$(XCMINOR): $(CTRL_PIC_OBJS)
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenctrl.so.$(XCMAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(DLOPEN_LIBS) $(PTHREAD_LIBS)
 
 # libxenguest
 
 libxenguest.a: $(GUEST_LIB_OBJS)
 	$(AR) rc $@ $^
 
-libxenguest.so: libxenguest.so.$(MAJOR)
+libxenguest.so: libxenguest.so.$(XCMAJOR)
 	ln -sf $< $@
-libxenguest.so.$(MAJOR): libxenguest.so.$(MAJOR).$(MINOR)
+libxenguest.so.$(XCMAJOR): libxenguest.so.$(XCMAJOR).$(XCMINOR)
 	ln -sf $< $@
 
 ifeq ($(CONFIG_MiniOS),y)
@@ -190,9 +187,9 @@ endif
 xc_dom_bzimageloader.o: CFLAGS += $(call zlib-options,D)
 xc_dom_bzimageloader.opic: CFLAGS += $(call zlib-options,D)
 
-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)
+libxenguest.so.$(XCMAJOR).$(XCMINOR): COMPRESSION_LIBS = $(call zlib-options,l)
+libxenguest.so.$(XCMAJOR).$(XCMINOR): $(GUEST_PIC_OBJS) libxenctrl.so
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenguest.so.$(XCMAJOR) $(SHLIB_LDFLAGS) -o $@ $(GUEST_PIC_OBJS) $(COMPRESSION_LIBS) -lz $(LDLIBS_libxenctrl) $(PTHREAD_LIBS)
 
 xenctrl_osdep_ENOSYS.so: $(OSDEP_PIC_OBJS) libxenctrl.so
 	$(CC) -g $(LDFLAGS) $(SHLIB_LDFLAGS) -o $@ $(OSDEP_PIC_OBJS) $(LDLIBS_libxenctrl)
diff -r a88029177dbc -r fb73bd21cdf7 tools/libxl/Makefile
--- a/tools/libxl/Makefile	Fri Sep 30 14:27:58 2011 +0100
+++ b/tools/libxl/Makefile	Thu Oct 06 13:20:03 2011 +0200
@@ -5,12 +5,6 @@
 XEN_ROOT = $(CURDIR)/../..
 include $(XEN_ROOT)/tools/Rules.mk
 
-MAJOR = 2.0
-MINOR = 0
-
-XLUMAJOR = 1.0
-XLUMINOR = 0
-
 CFLAGS += -Werror -Wno-format-zero-length -Wmissing-declarations
 CFLAGS += -I. -fPIC
 
@@ -94,14 +88,14 @@ _libxl_type%.h _libxl_type%.c: libxl_typ
 	$(call move-if-changed,__libxl_type$*.h,_libxl_type$*.h)
 	$(call move-if-changed,__libxl_type$*.c,_libxl_type$*.c)
 
-libxenlight.so: libxenlight.so.$(MAJOR)
+libxenlight.so: libxenlight.so.$(XLMAJOR)
 	ln -sf $< $@
 
-libxenlight.so.$(MAJOR): libxenlight.so.$(MAJOR).$(MINOR)
+libxenlight.so.$(XLMAJOR): libxenlight.so.$(XLMAJOR).$(XLMINOR)
 	ln -sf $< $@
 
-libxenlight.so.$(MAJOR).$(MINOR): $(LIBXL_OBJS)
-	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenlight.so.$(MAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXL_LIBS)
+libxenlight.so.$(XLMAJOR).$(XLMINOR): $(LIBXL_OBJS)
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenlight.so.$(XLMAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(LIBXL_LIBS)
 
 libxenlight.a: $(LIBXL_OBJS)
 	$(AR) rcs libxenlight.a $^
@@ -118,11 +112,11 @@ libxlutil.so.$(XLUMAJOR).$(XLUMINOR): $(
 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)
+xl: $(XL_OBJS) libxlutil.so.$(XLUMAJOR).$(XLUMINOR) libxenlight.so.$(XLMAJOR).$(XLMINOR)
+	$(CC) $(LDFLAGS) -o $@ $(XL_OBJS) libxlutil.so.$(XLUMAJOR).$(XLUMINOR) $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
 
-testidl: testidl.o libxlutil.so libxenlight.so
-	$(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
+testidl: testidl.o libxlutil.so.$(XLUMAJOR).$(XLUMINOR) libxenlight.so.$(XLMAJOR).$(XLMINOR)
+	$(CC) $(LDFLAGS) -o $@ testidl.o libxlutil.so.$(XLUMAJOR).$(XLUMINOR) $(LDLIBS_libxenlight) $(LDLIBS_libxenctrl)
 
 .PHONY: install
 install: all
@@ -132,9 +126,9 @@ install: all
 	$(INSTALL_DIR) $(DESTDIR)$(BASH_COMPLETION_DIR)
 	$(INSTALL_DIR) $(DESTDIR)$(XEN_RUN_DIR)
 	$(INSTALL_PROG) xl $(DESTDIR)$(SBINDIR)
-	$(INSTALL_PROG) libxenlight.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)
-	ln -sf libxenlight.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)/libxenlight.so.$(MAJOR)
-	ln -sf libxenlight.so.$(MAJOR) $(DESTDIR)$(LIBDIR)/libxenlight.so
+	$(INSTALL_PROG) libxenlight.so.$(XLMAJOR).$(XLMINOR) $(DESTDIR)$(LIBDIR)
+	ln -sf libxenlight.so.$(XLMAJOR).$(XLMINOR) $(DESTDIR)$(LIBDIR)/libxenlight.so.$(XLMAJOR)
+	ln -sf libxenlight.so.$(XLMAJOR) $(DESTDIR)$(LIBDIR)/libxenlight.so
 	$(INSTALL_DATA) libxenlight.a $(DESTDIR)$(LIBDIR)
 	$(INSTALL_PROG) libxlutil.so.$(XLUMAJOR).$(XLUMINOR) $(DESTDIR)$(LIBDIR)
 	ln -sf libxlutil.so.$(XLUMAJOR).$(XLUMINOR) $(DESTDIR)$(LIBDIR)/libxlutil.so.$(XLUMAJOR)
diff -r a88029177dbc -r fb73bd21cdf7 tools/xenstat/libxenstat/Makefile
--- a/tools/xenstat/libxenstat/Makefile	Fri Sep 30 14:27:58 2011 +0100
+++ b/tools/xenstat/libxenstat/Makefile	Thu Oct 06 13:20:03 2011 +0200
@@ -22,17 +22,14 @@ libdir=$(prefix)/lib
 LDCONFIG=ldconfig
 MAKE_LINK=ln -sf
 
-MAJOR=0
-MINOR=0
-
 LIB=src/libxenstat.a
-SHLIB=src/libxenstat.so.$(MAJOR).$(MINOR)
-SHLIB_LINKS=src/libxenstat.so.$(MAJOR) src/libxenstat.so
+SHLIB=src/libxenstat.so.$(XSTATMAJOR).$(XSTATMINOR)
+SHLIB_LINKS=src/libxenstat.so.$(XSTATMAJOR) src/libxenstat.so
 OBJECTS-y=src/xenstat.o
 OBJECTS-$(CONFIG_Linux) += src/xenstat_linux.o
 OBJECTS-$(CONFIG_SunOS) += src/xenstat_solaris.o
 OBJECTS-$(CONFIG_NetBSD) += src/xenstat_netbsd.o
-SONAME_FLAGS=-Wl,$(SONAME_LDFLAG) -Wl,libxenstat.so.$(MAJOR)
+SONAME_FLAGS=-Wl,$(SONAME_LDFLAG) -Wl,libxenstat.so.$(XSTATMAJOR)
 
 WARN_FLAGS=-Wall -Werror
 
@@ -53,19 +50,19 @@ all: $(LIB) $(SHLIB) $(SHLIB_LINKS)
 	$(CC) $(LDFLAGS) $(SONAME_FLAGS) $(SHLIB_LDFLAGS) -o $@ \
 	    $(OBJECTS-y) $(LDLIBS-y)
 
-src/libxenstat.so.$(MAJOR): $(SHLIB)
+src/libxenstat.so.$(XSTATMAJOR): $(SHLIB)
 	$(MAKE_LINK) $(<F) $@
 
-src/libxenstat.so: src/libxenstat.so.$(MAJOR)
+src/libxenstat.so: src/libxenstat.so.$(XSTATMAJOR)
 	$(MAKE_LINK) $(<F) $@
 
 .PHONY: install
 install: all
 	$(INSTALL_DATA) src/xenstat.h $(DESTDIR)$(INCLUDEDIR)
 	$(INSTALL_DATA) $(LIB) $(DESTDIR)$(LIBDIR)/libxenstat.a
-	$(INSTALL_PROG) src/libxenstat.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)
-	ln -sf libxenstat.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)/libxenstat.so.$(MAJOR)
-	ln -sf libxenstat.so.$(MAJOR) $(DESTDIR)$(LIBDIR)/libxenstat.so
+	$(INSTALL_PROG) src/libxenstat.so.$(XSTATMAJOR).$(XSTATMINOR) $(DESTDIR)$(LIBDIR)
+	ln -sf libxenstat.so.$(XSTATMAJOR).$(XSTATMINOR) $(DESTDIR)$(LIBDIR)/libxenstat.so.$(XSTATMAJOR)
+	ln -sf libxenstat.so.$(XSTATMAJOR) $(DESTDIR)$(LIBDIR)/libxenstat.so
 
 PYLIB=bindings/swig/python/_xenstat.so
 PYMOD=bindings/swig/python/xenstat.py
diff -r a88029177dbc -r fb73bd21cdf7 tools/xenstore/Makefile
--- a/tools/xenstore/Makefile	Fri Sep 30 14:27:58 2011 +0100
+++ b/tools/xenstore/Makefile	Thu Oct 06 13:20:03 2011 +0200
@@ -61,15 +61,15 @@ xenstore-control: xenstore_control.o $(L
 xs_tdb_dump: xs_tdb_dump.o utils.o tdb.o talloc.o
 	$(CC) $(LDFLAGS) $^ -o $@
 
-libxenstore.so: libxenstore.so.$(MAJOR)
+libxenstore.so: libxenstore.so.$(XSMAJOR)
 	ln -sf $< $@
-libxenstore.so.$(MAJOR): libxenstore.so.$(MAJOR).$(MINOR)
+libxenstore.so.$(XSMAJOR): libxenstore.so.$(XSMAJOR).$(XSMINOR)
 	ln -sf $< $@
 
 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
+libxenstore.so.$(XSMAJOR).$(XSMINOR): xs.opic xs_lib.opic
+	$(CC) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenstore.so.$(XSMAJOR) $(SHLIB_LDFLAGS) -o $@ $^ $(SOCKET_LIBS) -lpthread
 
 libxenstore.a: xs.o xs_lib.o
 	$(AR) rcs $@ $^
@@ -104,9 +104,9 @@ install: all
 		ln -f $(DESTDIR)$(BINDIR)/xenstore $(DESTDIR)$(BINDIR)/$${c} ; \
 	done
 	$(INSTALL_DIR) $(DESTDIR)$(LIBDIR)
-	$(INSTALL_PROG) libxenstore.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)
-	ln -sf libxenstore.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)/libxenstore.so.$(MAJOR)
-	ln -sf libxenstore.so.$(MAJOR) $(DESTDIR)$(LIBDIR)/libxenstore.so
+	$(INSTALL_PROG) libxenstore.so.$(XSMAJOR).$(XSMINOR) $(DESTDIR)$(LIBDIR)
+	ln -sf libxenstore.so.$(XSMAJOR).$(XSMINOR) $(DESTDIR)$(LIBDIR)/libxenstore.so.$(XSMAJOR)
+	ln -sf libxenstore.so.$(XSMAJOR) $(DESTDIR)$(LIBDIR)/libxenstore.so
 	$(INSTALL_DATA) libxenstore.a $(DESTDIR)$(LIBDIR)
 	$(INSTALL_DATA) xs.h $(DESTDIR)$(INCLUDEDIR)
 	$(INSTALL_DATA) xs_lib.h $(DESTDIR)$(INCLUDEDIR)

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 04:34:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 04:34:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBmDq-0008PR-6v; Thu, 06 Oct 2011 04:34:42 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBm9L-00078W-IA
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 04:30:03 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1317900596!34207911!3
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12449 invoked from network); 6 Oct 2011 11:30:00 -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;
	6 Oct 2011 11:30:00 -0000
Received: by mail-ww0-f43.google.com with SMTP id 27so3370940wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 04:30:00 -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:cc; bh=/DvIOJFAIVvtLeVv6g7o+K7qgFB8tBRdhPkYhOHkFZU=;
	b=P2T/K0oLt+eof+HL9vtMli5Dh2ANqbiP/m8Pg9yJjp0suOk/T/m0h85I6KbGU6rTN5
	LPbDj1F30DtOUR+uBSf106ecXs2iVvok02+A2hTxTBRhsQLKhxEChlFW5ykwHgXR/mwf
	fafuzq+iYUxaNEMUuyDdWQLVeefcdb/Y1HgLg=
Received: by 10.227.28.69 with SMTP id l5mr866911wbc.38.1317900600478;
	Thu, 06 Oct 2011 04:30:00 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fo7sm9671872wbb.20.2011.10.06.04.29.58
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 06 Oct 2011 04:29:59 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: dd09f32c882c9e1492b2346b899fef19f46055dd
Message-Id: <dd09f32c882c9e1492b2.1317900426@loki>
In-Reply-To: <patchbomb.1317900424@loki>
References: <patchbomb.1317900424@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Thu, 06 Oct 2011 13:27:06 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 2 of 2] build: append YAJL_CLFAGS and
 YAJL_LDFLAGS to libxl 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

# HG changeset patch
# User Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1317900172 -7200
# Node ID dd09f32c882c9e1492b2346b899fef19f46055dd
# Parent  fb73bd21cdf7aed429f7e90e192dcbc034f3ca57
build: append YAJL_CLFAGS and YAJL_LDFLAGS to libxl build

Since some users have yajl installed in a non-standard directory, allow the use of YAJL_CFLAGS and YAJL_LDFLAGS to point to the correct folders.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r fb73bd21cdf7 -r dd09f32c882c tools/libxl/Makefile
--- a/tools/libxl/Makefile	Thu Oct 06 13:20:03 2011 +0200
+++ b/tools/libxl/Makefile	Thu Oct 06 13:22:52 2011 +0200
@@ -13,7 +13,7 @@ LIBUUID_LIBS += -luuid
 endif
 
 LIBXL_LIBS =
-LIBXL_LIBS = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(UTIL_LIBS) $(LIBUUID_LIBS)
+LIBXL_LIBS = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(LDLIBS_libblktapctl) $(UTIL_LIBS) $(LIBUUID_LIBS) $(YAJL_LDFLAGS)
 
 LIBXLU_LIBS =
 
@@ -34,7 +34,7 @@ LIBXL_OBJS = flexarray.o libxl.o libxl_c
 			libxl_qmp.o $(LIBXL_OBJS-y)
 LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o
 
-$(LIBXL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) $(CFLAGS_libxenstore) $(CFLAGS_libblktapctl)
+$(LIBXL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) $(CFLAGS_libxenstore) $(CFLAGS_libblktapctl) $(YAJL_CFLAGS)
 
 AUTOINCS= libxlu_cfg_y.h libxlu_cfg_l.h
 AUTOSRCS= libxlu_cfg_y.c libxlu_cfg_l.c

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 04:48:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 04: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 1RBmQs-0000WA-6A; Thu, 06 Oct 2011 04:48:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBmPy-0000JC-6Z
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 04:47:15 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317901630!20508067!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13416 invoked from network); 6 Oct 2011 11:47:11 -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;
	6 Oct 2011 11:47:11 -0000
X-IronPort-AV: E=Sophos;i="4.68,495,1312156800"; 
   d="scan'208";a="8248299"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 11:46: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, 6 Oct 2011
	12:46:41 +0100
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Date: Thu, 6 Oct 2011 12:46:40 +0100
In-Reply-To: <fb73bd21cdf7aed429f7.1317900425@loki>
References: <patchbomb.1317900424@loki> <fb73bd21cdf7aed429f7.1317900425@loki>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317901600.21903.230.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 1 of 2] build: link to specific library
 version (libxs, libxl,  xenstore, xenstat)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-06 at 12:27 +0100, Roger Pau Monne wrote:
> @@ -18,19 +33,19 @@ XEN_BLKTAP2        = $(XEN_ROOT)/tools/b
>  CFLAGS_xeninclude = -I$(XEN_INCLUDE)
> 
>  CFLAGS_libxenctrl = -I$(XEN_LIBXC) $(CFLAGS_xeninclude)
> -LDLIBS_libxenctrl = -L$(XEN_LIBXC) -lxenctrl
> +LDLIBS_libxenctrl = $(XEN_LIBXC)/libxenctrl.so.$(XCMAJOR).$(XCMINOR)
>  SHLIB_libxenctrl  = -Wl,-rpath-link=$(XEN_LIBXC)

I think this is the correct approach but you don't need
the .$(MAJOR).$(MINOR) suffix here since the .so at the specific path
will always be a symlink to the right thing (same for all the others).

Doing it that way will remove the need to move all the major/minor
definitions around and make this patch tiny.

Ian.


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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 04:49:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 04:49:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBmS6-0000tE-PM; Thu, 06 Oct 2011 04:49:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBmR5-0000ZA-UD
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 04:48:24 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317901700!19363690!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9750 invoked from network); 6 Oct 2011 11:48:20 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 6 Oct 2011 11:48:20 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RBmR2-00062t-8y; Thu, 06 Oct 2011 11:48:20 +0000
Date: Thu, 6 Oct 2011 12:48:20 +0100
From: Tim Deegan <tim@xen.org>
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 0 of 4] xenpaging fixes for xen-unstable
Message-ID: <20111006114820.GE21091@ocelot.phlegethon.org>
References: <patchbomb.1317653033@probook.site>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <patchbomb.1317653033@probook.site>
User-Agent: Mutt/1.4.2.1i
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

At 16:43 +0200 on 03 Oct (1317660233), Olaf Hering wrote:
> 
> The following series changes the p2m_mem_paging* functions to modify the p2mt
> under the p2m_lock, and there is a change to improve PoD handling.
> 
> Please review and apply.

I've applied patches 1-3; leaving 4 until the relationship between
paging, sharing, ballooning and PoD is properly understood.

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 Oct 06 04:54:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 04:54:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBmWj-0001JE-Ur; Thu, 06 Oct 2011 04:54:13 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBmW3-00016x-Pj
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 04:53:32 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1317901979!58005480!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21742 invoked from network); 6 Oct 2011 11:53:00 -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;
	6 Oct 2011 11:53:00 -0000
Received: by qabg14 with SMTP id g14so2798886qab.30
	for <xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 04:53:27 -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
	:content-transfer-encoding;
	bh=bEhsCmzgj1FuSWxHRro5SWGXOzh56GtsCHdHgoxXabk=;
	b=id7nlO+O2YPY1B3WyRtJiIwgKX0QvaaXRYLYWQgQbkHfDn6mTJ8nXlDa4FMiejdIV6
	eeVv3QPHebqsvcyoKu/C23cD6c5d2X+nPh+eczoNSmGBg3eZiG7y5z/PDaAm+fdyHtVt
	hRT5na2mJwU56bAwMLUJRlmm5FmrNVAQdOe1w=
Received: by 10.224.214.137 with SMTP id ha9mr441960qab.105.1317902007272;
	Thu, 06 Oct 2011 04:53:27 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.224.28.142 with HTTP; Thu, 6 Oct 2011 04:52:57 -0700 (PDT)
In-Reply-To: <a0b8388fc4c82e345377.1317735953@cosworth.uk.xensource.com>
References: <a0b8388fc4c82e345377.1317735953@cosworth.uk.xensource.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Thu, 6 Oct 2011 12:52:57 +0100
X-Google-Sender-Auth: eLmS3sAokCPPHrdjXYCwE2WcQso
Message-ID: <CAJJyHj+=TzPjFRQE6fN+vPK9HxNiyUHhir4_QayaZEZWdpu68g@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] libxl: remove QMP warning when no pty style
	serial device is configured
To: Ian Campbell <ian.campbell@citrix.com>
Content-Type: text/plain; charset=UTF-8
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 Tue, Oct 4, 2011 at 14:45, Ian Campbell <ian.campbell@citrix.com> wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1317735934 -3600
> # Node ID a0b8388fc4c82e345377679f4bffe7ab5d9eb55d
> # Parent =C2=A0c344d6d30b0f3796ebff069d6ecdde481c9e6a32
> libxl: remove QMP warning when no pty style serial device is configured
>
> If the serial device is not "pty" then there is nothing to do but this is=
 not
> an error. Removes a spurious warning if e.g. serial=3D"file:/tmp/serial.l=
og" is used:
>
> libxl: error: libxl_qmp.c:137:register_serials_chardev_callback: Failed t=
o store serial port information in xenstore: No such file or directory
>
>
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
>
> diff -r c344d6d30b0f -r a0b8388fc4c8 tools/libxl/libxl_qmp.c
> --- a/tools/libxl/libxl_qmp.c =C2=A0 Tue Oct 04 14:43:56 2011 +0100
> +++ b/tools/libxl/libxl_qmp.c =C2=A0 Tue Oct 04 14:45:34 2011 +0100
> @@ -87,7 +87,7 @@ static int store_serial_port_info(libxl_
> =C2=A0 =C2=A0 int ret =3D 0;
>
> =C2=A0 =C2=A0 if (!(chardev && strncmp("pty:", chardev, 4) =3D=3D 0)) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
> =C2=A0 =C2=A0 }
>
> =C2=A0 =C2=A0 path =3D libxl__xs_get_dompath(&gc, qmp->domid);

Acked-by: Anthony PERARD <anthony.perard@citrix.com>

--=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 Thu Oct 06 05:05:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 05:05:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBmhR-0001pq-Hs; Thu, 06 Oct 2011 05:05:17 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBmg4-0001ch-Gr
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 05:03:59 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1317902627!21190542!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22536 invoked from network); 6 Oct 2011 12:03:48 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 12:03:48 -0000
Received: by vcbfo13 with SMTP id fo13so3066591vcb.30
	for <xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 05:03: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=yeEu5kJyJuJVDslAXUPHNCJ12s/VJbGrflun6Iy+jGU=;
	b=RPoszDF6Um53uqDCtbMIMfT2KSL3FcKJtkW1YuM+LJj+YkfB5a6qUkORnuwAdGEsTS
	OSgoDnwuwl/kC9s2AzlBlAawHhsbv5aED605SdBwayJS5Eo/+caQUxiGCv3C5zHJ9m7m
	LpSepo9RAyUsjEela628XNsBETU1Ohitd6+yc=
MIME-Version: 1.0
Received: by 10.68.11.138 with SMTP id q10mr5443745pbb.37.1317902625984; Thu,
	06 Oct 2011 05:03:45 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Thu, 6 Oct 2011 05:03:45 -0700 (PDT)
In-Reply-To: <1317901600.21903.230.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317900424@loki> <fb73bd21cdf7aed429f7.1317900425@loki>
	<1317901600.21903.230.camel@zakaz.uk.xensource.com>
Date: Thu, 6 Oct 2011 14:03:45 +0200
X-Google-Sender-Auth: Sqjpadvm9WviBokIAsKnknLjNKk
Message-ID: <CAPLaKK7sqGVsy7ZK_q3d4shAjxkPvSsfOX0BhkrOiiv+R5577A@mail.gmail.com>
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH 1 of 2] build: link to specific library
 version (libxs, libxl, xenstore, xenstat)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 think this is the correct approach but you don't need
> the .$(MAJOR).$(MINOR) suffix here since the .so at the specific path
> will always be a symlink to the right thing (same for all the others).
>
> Doing it that way will remove the need to move all the major/minor
> definitions around and make this patch tiny.

I've added the version numbers to make sure that we are linking
against the current library versions, so when there's an API change
the version numbers are bumped and the linking is made against the new
libraries for sure, but you are right, and when the version number is
bumped the library is rebuild automatically, so there's no need for
all this fuss. I will send a new patch without the MAJOR.MINOR stuff.

Regards, Roger.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 05:11:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 05: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 1RBmne-0002M7-IX; Thu, 06 Oct 2011 05:11:42 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBmn7-0002AP-Pg
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 05:11:10 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317903046!41111915!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20380 invoked from network); 6 Oct 2011 12:10:46 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 6 Oct 2011 12:10:46 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RBmn4-00068x-Ck; Thu, 06 Oct 2011 12:11:06 +0000
Date: Thu, 6 Oct 2011 13:11:06 +0100
From: Tim Deegan <tim@xen.org>
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH] p2m: use correct p2m_type_t in
	clear_mmio_p2m_entry
Message-ID: <20111006121106.GF21091@ocelot.phlegethon.org>
References: <e77dd1bf489436d9f115.1317731239@probook.site>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <e77dd1bf489436d9f115.1317731239@probook.site>
User-Agent: Mutt/1.4.2.1i
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

At 14:27 +0200 on 04 Oct (1317738439), Olaf Hering wrote:
> # HG changeset patch
> # User Olaf Hering <olaf@aepfle.de>
> # Date 1317731210 -7200
> # Node ID e77dd1bf489436d9f115be5d77327d1bbde1f1d2
> # Parent  28556fcb81957a996b2c4b23a450cfefd95338b3
> p2m: use correct p2m_type_t in clear_mmio_p2m_entry
> 
> clear_mmio_p2m_entry() should mark the gfn as invalid.
> Use proper name instead of numerical value. The currently used value of
> zero means p2m_ram_rw.
> 
> Signed-off-by: Olaf Hering <olaf@aepfle.de>

Applied, thanks, and backported to 4.1-testing

Tim.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 05:17:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 05:17:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBmt1-0002n8-Lr; Thu, 06 Oct 2011 05:17:15 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBmsS-0002aq-4Z
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 05:16:40 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1317903378!47059813!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6352 invoked from network); 6 Oct 2011 12:16:18 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-8.tower-27.messagelabs.com with SMTP;
	6 Oct 2011 12:16:18 -0000
Received: from p5b2e2c44.dip.t-dialin.net ([91.46.44.68] 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 1RBmsO-0002Q3-8q; Thu, 06 Oct 2011 12:16:36 +0000
Message-ID: <4E8D9C22.1050308@canonical.com>
Date: Thu, 06 Oct 2011 14:16:34 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110922 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] Re: Still struggling with HVM: tx timeouts on emulated
	nics
References: <4E7B4768.8060103@canonical.com>
	<alpine.DEB.2.00.1109221838370.8700@kaball-desktop>
	<4E85883C.7030808@canonical.com>
	<alpine.DEB.2.00.1109301427590.3519@kaball-desktop>
	<4E85E8E8.2020702@canonical.com> <4E860382.7040108@canonical.com>
	<alpine.DEB.2.00.1110031800390.3519@kaball-desktop>
	<4E8C816B.7060608@canonical.com>
	<alpine.DEB.2.00.1110061111060.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1110061111060.3519@kaball-desktop>
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 06.10.2011 12:12, Stefano Stabellini wrote:
> On Wed, 5 Oct 2011, Stefan Bader wrote:
>> On 03.10.2011 19:24, Stefano Stabellini wrote:
>>> I am going to send a different patch upstream for Xen 4.2, because I
>>> would also like it to cover the very unlikely scenario in which a PV
>>> guest (like dom0 or a PV guest with PCI passthrough) is loosing level
>>> interrupts because when Xen tries to set the corresponding event channel
>>> pending the bit is alreay set. The codebase is different enough that
>>> making the same change on 4.1 is non-trivial. I am appending the new
>>> patch to this email, it would be great if you could test it. You just
>>> need a 4.2 hypervisor, not the entire system. You should be able to
>>> perform the test updating only xen.gz.
>>> If you have trouble if xen-unstable.hg tip, try changeset 23843.
>>
>> Hi Stefano,
>>
>> currently I would have the problem that I don't have too much time to move to
>> another hypervisor (tests may or may not be useful there with substantial
>> changes beside this one) with our next release being close.
>> But I think I got a usable backport of your change to 4.1.1 (you think it looks
>> ok?) and have given that a quick test which seems to be ok...
>> Though one drawback is that I don't have a setup which would use passthrough, so
>> that path is not tested. I think I did see (with a debugging version) that the
>> lost count was incremented and decremented in dom0, though.
>>
> 
> Honestly if you have to commit to a backport for your package right now,
> I would go for the previous version, because it is simpler and less
> likely to introduce regressions.

Agreed. Well at least I hope that since that backport seemed to fix the issue I
saw in 4.1.1 it will give some more confidence for you on the 4.2 version. With
the drawback of the passthrough not being tested.

-Stefan

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 05:18:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 05:18:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBmu0-00039c-GA; Thu, 06 Oct 2011 05:18:17 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBmsv-0002kA-8U
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 05:17:09 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1317903426!20000004!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13598 invoked from network); 6 Oct 2011 12:17:06 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 12:17:06 -0000
Received: by wwf27 with SMTP id 27so3425556wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 05:17: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:cc; bh=jhMHgLZXkoXvfXLY1QhRqdv7Yx+Moo2IFpuKI28+32I=;
	b=BwTUgNIjxZfOtKf/iTaQzfcmMJy9HHSSCh+kac/FultE6BsjJSs+YifCIq4yDZW2wt
	C1oamrHRnqvFRvkMKw7VBcf8bgw7U4oKY8nYIogvo2sx8JcW/ybu6DZju/a+FKHApeUx
	h9lW9r6iQRpq364MAwo6DfGe1gszV9BE0AOto=
Received: by 10.227.11.81 with SMTP id s17mr920646wbs.62.1317903426000;
	Thu, 06 Oct 2011 05:17:06 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id l9sm9948968wba.5.2011.10.06.05.17.03
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 06 Oct 2011 05:17:04 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 25d25990dd1b0f1e26d8dd56c45b9daf377969b9
Message-Id: <25d25990dd1b0f1e26d8.1317903417@loki>
In-Reply-To: <1317901600.21903.230.camel@zakaz.uk.xensource.com>
References: <1317901600.21903.230.camel@zakaz.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Thu, 06 Oct 2011 14:16:57 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Campbell@eu.citrix.com
Subject: [Xen-devel] [PATCH] build: link to specific library version (libxs,
 libxl, xenstore, xenstat)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317903332 -7200
# Node ID 25d25990dd1b0f1e26d8dd56c45b9daf377969b9
# Parent  a88029177dbcea6863a9c4e8e0cee81b08ecaed4
build: link to specific library version (libxs, libxl, xenstore, xenstat)

To avoid linking to an older version of xen libraries when compiling with LDFLAGS and CFLAGS set, explicitly pass the linker the library file to link to.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r a88029177dbc -r 25d25990dd1b tools/Rules.mk
--- a/tools/Rules.mk	Fri Sep 30 14:27:58 2011 +0100
+++ b/tools/Rules.mk	Thu Oct 06 14:15:32 2011 +0200
@@ -18,19 +18,19 @@ XEN_BLKTAP2        = $(XEN_ROOT)/tools/b
 CFLAGS_xeninclude = -I$(XEN_INCLUDE)
 
 CFLAGS_libxenctrl = -I$(XEN_LIBXC) $(CFLAGS_xeninclude)
-LDLIBS_libxenctrl = -L$(XEN_LIBXC) -lxenctrl
+LDLIBS_libxenctrl = $(XEN_LIBXC)/libxenctrl.so
 SHLIB_libxenctrl  = -Wl,-rpath-link=$(XEN_LIBXC)
 
 CFLAGS_libxenguest = -I$(XEN_LIBXC) $(CFLAGS_xeninclude)
-LDLIBS_libxenguest = -L$(XEN_LIBXC) -lxenguest
+LDLIBS_libxenguest = $(XEN_LIBXC)/libxenguest.so
 SHLIB_libxenguest  = -Wl,-rpath-link=L$(XEN_LIBXC)
 
 CFLAGS_libxenstore = -I$(XEN_XENSTORE) $(CFLAGS_xeninclude)
-LDLIBS_libxenstore = -L$(XEN_XENSTORE) -lxenstore
+LDLIBS_libxenstore = $(XEN_XENSTORE)/libxenstore.so
 SHLIB_libxenstore  = -Wl,-rpath-link=$(XEN_XENSTORE)
 
 CFLAGS_libxenstat  = -I$(XEN_LIBXENSTAT)
-LDLIBS_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -L$(XEN_LIBXENSTAT) -lxenstat
+LDLIBS_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBXENSTAT)/libxenstat.so
 SHLIB_libxenstat  = -Wl,-rpath-link=$(XEN_LIBXENSTAT)
 
 ifeq ($(CONFIG_Linux),y)
@@ -50,7 +50,7 @@ SHLIB_libblktapctl  =
 endif
 
 CFLAGS_libxenlight = -I$(XEN_XENLIGHT) $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude)
-LDLIBS_libxenlight = -L$(XEN_XENLIGHT) $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl) -lxenlight
+LDLIBS_libxenlight = $(XEN_XENLIGHT)/libxenlight.so $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl)
 SHLIB_libxenlight  = -Wl,-rpath-link=$(XEN_XENLIGHT)
 
 CFLAGS += -D__XEN_TOOLS__

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 06:09:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 06:09:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBnhG-00062w-JM; Thu, 06 Oct 2011 06:09:10 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBngM-0005qX-OU
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 06:08:15 -0700
X-Env-Sender: anthony@overnetdata.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1317906473!47070715!1
X-Originating-IP: [81.137.131.225]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21850 invoked from network); 6 Oct 2011 13:07:53 -0000
Received: from host81-137-131-225.in-addr.btopenworld.com (HELO
	zimbra.overnetdata.com) (81.137.131.225)
	by server-8.tower-27.messagelabs.com with SMTP;
	6 Oct 2011 13:07:53 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by zimbra.overnetdata.com (Postfix) with ESMTP id 66F101616C7;
	Thu,  6 Oct 2011 13:57:52 +0100 (BST)
X-Virus-Scanned: amavisd-new at overnetdata.com
Received: from zimbra.overnetdata.com ([127.0.0.1])
	by localhost (zimbra.overnetdata.com [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id DmP4Phxk2rYP; Thu,  6 Oct 2011 13:57:37 +0100 (BST)
Received: from [192.168.1.59] (unknown [192.168.1.59])
	by zimbra.overnetdata.com (Postfix) with ESMTPSA id 2DC9C1616BF;
	Thu,  6 Oct 2011 13:57:37 +0100 (BST)
Message-ID: <4E8DA5BC.8000406@overnetdata.com>
Date: Thu, 06 Oct 2011 13:57:32 +0100
From: Anthony Wright <anthony@overnetdata.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
References: <4E85DB1A.5060606@overnetdata.com>
	<20111001120706.GZ12984@reaktio.net>
	<4E89BC80.4030105@overnetdata.com>
	<20111003190917.GF15608@phenom.oracle.com>
In-Reply-To: <20111003190917.GF15608@phenom.oracle.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
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/10/2011 20:09, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 03, 2011 at 02:45:36PM +0100, Anthony Wright wrote:
>> On 01/10/2011 13:07, Pasi Kärkkäinen wrote:
>>> On Fri, Sep 30, 2011 at 04:07:06PM +0100, Anthony Wright wrote:
>>>> I have a machine with 16GB of RAM running 32 bit xen 4.1.1 with Dom0
>>>> running a 3.0.4 linux kernel and 23 paravirtualized DomUs.
>>>>
>>> Hey,
>>>
>>> Why 32bit Xen? I think all (most?) hypervisor testing happens with 64bit Xen.
>>> Note that you can still have 32bit dom0 kernel with 64b hypervisor.
>> I'm going to investigate 64 bit xen on a 32 bit Dom0 soon, but as to the
>> 32 xen, I work quite a lot with older hardware and Xen since it does
>> paravirtualisation, and it's a really good way to re-use old hardware.
>>>> As the free ram gets to 2391 MB free the system behaves as if it's got
>>>> no more ram, and starts grabbing ram from Dom0, before getting even more
>>>> confused and failing to start DomUs and eventually crashing the whole
>>>> machine. I have attached a tarball with the output of xl dmesg, xl info
>>>> & xl list at various points.
>>>>
>>> - Do you use dom0_mem= parameter for Xen? 
>>> - Did you disable dom0 ballooning? 
>>>
>>> http://wiki.xen.org/xenwiki/XenBestPractices
>> I was already using the dom0_mem= parameter on the xen hypervisor, but I
>> disabled dom0 ballooning (enable-dom0-ballooning no), and just for good
>> measure I also set (dom0-min-mem 2000). This had no effect, when I
>> increase the 10-4 memory requirements, on restart the Dom0 memory is
>> reduced to 1713MB and xl info reports 2391MB free.
>>>> Stage 1
>>>> Everything is fine, Dom0 has 2000MB according to xl list, and 'xl info'
>>>> says there is 2405MB free.
>>> - How much memory did dom0 initially have? 
>>> - Did you use mem= parameter for dom0 kernel (vmlinuz) ?
>>>
>>> See: http://wiki.xen.org/xenwiki/Linux_30_bugs
>> dom0 starts with 2000MB.
>> I didn't use mem= on the linux kernel - I thought it wasn't neccessary.
> It is if your kernel does not have these two patches:
>
>     xen: use maximum reservation to limit amount of usable RAM
>     xen/e820: if there is no dom0_mem=, don't tweak extra_pages.
>
> .. oh and you also need to update the hypervisor to include:
> "
>     For dom0, this requires at patch to Xen ('x86: use 'dom0_mem' to limit
>     the number of pages for dom0') (c/s 23790)
> "
>
> Grrr.. Let me update the 3.0 bug-list
I applied the two kernel patches, but get similar results, dom0 still
gets ballooned down (even more agressively) despite having
dom0_mem=2000, dom0-min-mem=2000 and enable-dom0-ballooning set to 0.

I couldn't find the xen patch, could you point me in the right direction.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 06:12:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 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 1RBnk5-0006S2-Ds; Thu, 06 Oct 2011 06:12:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBnjc-0006Fk-HT
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 06:11:36 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1317906693!34203138!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10386 invoked from network); 6 Oct 2011 13:11:33 -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;
	6 Oct 2011 13:11:33 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8250928"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 13:11: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; Thu, 6 Oct 2011
	14:11:32 +0100
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Date: Thu, 6 Oct 2011 14:11:32 +0100
In-Reply-To: <25d25990dd1b0f1e26d8.1317903417@loki>
References: <1317901600.21903.230.camel@zakaz.uk.xensource.com>
	<25d25990dd1b0f1e26d8.1317903417@loki>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317906692.21903.239.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] build: link to specific library version
 (libxs, libxl, xenstore, xenstat)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-06 at 13:16 +0100, Roger Pau Monne wrote:
> # HG changeset patch
> # User Roger Pau Monne <roger.pau@entel.upc.edu>
> # Date 1317903332 -7200
> # Node ID 25d25990dd1b0f1e26d8dd56c45b9daf377969b9
> # Parent  a88029177dbcea6863a9c4e8e0cee81b08ecaed4
> build: link to specific library version (libxs, libxl, xenstore, xenstat)
> 
> To avoid linking to an older version of xen libraries when compiling with LDFLAGS and CFLAGS set, explicitly pass the linker the library file to link to.
> 
> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

Thanks Roger.

Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> diff -r a88029177dbc -r 25d25990dd1b tools/Rules.mk
> --- a/tools/Rules.mk	Fri Sep 30 14:27:58 2011 +0100
> +++ b/tools/Rules.mk	Thu Oct 06 14:15:32 2011 +0200
> @@ -18,19 +18,19 @@ XEN_BLKTAP2        = $(XEN_ROOT)/tools/b
>  CFLAGS_xeninclude = -I$(XEN_INCLUDE)
>  
>  CFLAGS_libxenctrl = -I$(XEN_LIBXC) $(CFLAGS_xeninclude)
> -LDLIBS_libxenctrl = -L$(XEN_LIBXC) -lxenctrl
> +LDLIBS_libxenctrl = $(XEN_LIBXC)/libxenctrl.so
>  SHLIB_libxenctrl  = -Wl,-rpath-link=$(XEN_LIBXC)
>  
>  CFLAGS_libxenguest = -I$(XEN_LIBXC) $(CFLAGS_xeninclude)
> -LDLIBS_libxenguest = -L$(XEN_LIBXC) -lxenguest
> +LDLIBS_libxenguest = $(XEN_LIBXC)/libxenguest.so
>  SHLIB_libxenguest  = -Wl,-rpath-link=L$(XEN_LIBXC)
>  
>  CFLAGS_libxenstore = -I$(XEN_XENSTORE) $(CFLAGS_xeninclude)
> -LDLIBS_libxenstore = -L$(XEN_XENSTORE) -lxenstore
> +LDLIBS_libxenstore = $(XEN_XENSTORE)/libxenstore.so
>  SHLIB_libxenstore  = -Wl,-rpath-link=$(XEN_XENSTORE)
>  
>  CFLAGS_libxenstat  = -I$(XEN_LIBXENSTAT)
> -LDLIBS_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) -L$(XEN_LIBXENSTAT) -lxenstat
> +LDLIBS_libxenstat  = $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(XEN_LIBXENSTAT)/libxenstat.so
>  SHLIB_libxenstat  = -Wl,-rpath-link=$(XEN_LIBXENSTAT)
>  
>  ifeq ($(CONFIG_Linux),y)
> @@ -50,7 +50,7 @@ SHLIB_libblktapctl  =
>  endif
>  
>  CFLAGS_libxenlight = -I$(XEN_XENLIGHT) $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude)
> -LDLIBS_libxenlight = -L$(XEN_XENLIGHT) $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl) -lxenlight
> +LDLIBS_libxenlight = $(XEN_XENLIGHT)/libxenlight.so $(SHLIB_libxenctrl) $(SHLIB_libxenstore) $(SHLIB_libblktapctl)

OOI, is the reordering of libxenlight wrt the SHLIBs here significant?

>  SHLIB_libxenlight  = -Wl,-rpath-link=$(XEN_XENLIGHT)
>  
>  CFLAGS += -D__XEN_TOOLS__



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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 06:13:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 06:13:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBnl0-0006oJ-HF; Thu, 06 Oct 2011 06:13:02 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBnk0-0006Or-Dt
	for Xen-devel@lists.xensource.com; Thu, 06 Oct 2011 06:12:01 -0700
X-Env-Sender: pracshi@gmail.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317906716!28158262!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25269 invoked from network); 6 Oct 2011 13:11:57 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 13:11:57 -0000
Received: by bkas6 with SMTP id s6so4574950bka.30
	for <Xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 06:11:56 -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=5E8HVR080e27v5HLs+YjXTeTiXRXsJ1l6PAqRwSqh1s=;
	b=kcNf8NhDt/blYuMhy6QWMikBKZvPqOgz1oSZXHzMrIzefLf/IjgkERydszz9RzqU+N
	Xk0/Sfk+dz6FJNHxdnLGQYnuqm8H2tx/T27VqGd13Tn87HIq9GnSWVw2XDZRZwaMTCGz
	Qwrkm17STW/MSMxaR+yZ5FJL5mhS9jlQ7nMUc=
MIME-Version: 1.0
Received: by 10.204.130.196 with SMTP id u4mr576613bks.52.1317906716618; Thu,
	06 Oct 2011 06:11:56 -0700 (PDT)
Received: by 10.204.32.4 with HTTP; Thu, 6 Oct 2011 06:11:56 -0700 (PDT)
Date: Thu, 6 Oct 2011 06:11:56 -0700
Message-ID: <CAEAezkULktsFZDmov0W2hCSVDT_v=ROQJD-w4VcgL_y85Fe3wQ@mail.gmail.com>
From: Pratik shinde <pracshi@gmail.com>
To: Xen-devel@lists.xensource.com
Cc: 
Subject: [Xen-devel] (no subject)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0201463856=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0201463856==
Content-Type: multipart/alternative; boundary=0015173ff382b0f11c04aea1113a

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

why coscheduling is not implemented in xen?

--0015173ff382b0f11c04aea1113a
Content-Type: text/html; charset=ISO-8859-1

why coscheduling is not implemented in xen?<br>

--0015173ff382b0f11c04aea1113a--


--===============0201463856==
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

--===============0201463856==--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 06:19:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 06:19:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBnqy-0007GJ-Pd; Thu, 06 Oct 2011 06:19:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBnqR-000742-J4
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 06:18:39 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317907115!19383328!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31128 invoked from network); 6 Oct 2011 13:18:36 -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;
	6 Oct 2011 13:18:36 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312171200"; d="scan'208";a="17996540"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 09:18:34 -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, 6 Oct 2011
	09:18:34 -0400
Message-ID: <4E8DAAA9.8040106@citrix.com>
Date: Thu, 6 Oct 2011 14:18:33 +0100
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] (no subject)
References: <CAEAezkULktsFZDmov0W2hCSVDT_v=ROQJD-w4VcgL_y85Fe3wQ@mail.gmail.com>
In-Reply-To: <CAEAezkULktsFZDmov0W2hCSVDT_v=ROQJD-w4VcgL_y85Fe3wQ@mail.gmail.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 06/10/11 14:11, Pratik shinde wrote:
> why coscheduling is not implemented in xen?

http://wiki.xen.org/xenwiki/AskingXenDevelQuestions

After reading that wiki page, please explain why you think coscheduling
should be implemented on Xen.

-- 
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 Oct 06 06:43:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 06: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 1RBoEo-0008Fj-H7; Thu, 06 Oct 2011 06:43:50 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBoEE-00083v-F9
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 06:43:14 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317908602!54423228!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22653 invoked from network); 6 Oct 2011 13:43:22 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 6 Oct 2011 13:43:22 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RBoEA-0006Qa-Jr; Thu, 06 Oct 2011 13:43:10 +0000
Date: Thu, 6 Oct 2011 14:43:10 +0100
From: Tim Deegan <tim@xen.org>
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH] p2m: query/modify p2mt with p2m_lock held
Message-ID: <20111006134310.GA24333@ocelot.phlegethon.org>
References: <9c0bf50bfbb645ec80b7.1317731300@probook.site>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <9c0bf50bfbb645ec80b7.1317731300@probook.site>
User-Agent: Mutt/1.4.2.1i
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

At 14:28 +0200 on 04 Oct (1317738500), Olaf Hering wrote:
> p2m: query/modify p2mt with p2m_lock held
> 
> Query and update the p2mt in set_mmio_p2m_entry, clear_mmio_p2m_entry
> and set_shared_p2m_entry with the p2m_lock held.
> 
> Signed-off-by: Olaf Hering <olaf@aepfle.de>

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 Thu Oct 06 06:55:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 06: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 1RBoQ0-0000Lm-Jp; Thu, 06 Oct 2011 06:55:24 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBoOv-00008z-HP
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 06:54:17 -0700
X-Env-Sender: George.Dunlap@eu.citrix.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1317909252!28181292!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7352 invoked from network); 6 Oct 2011 13:54:14 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 13:54:14 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312171200"; d="scan'208";a="165944910"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 09:54:12 -0400
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, 6 Oct 2011 09:54:11 -0400
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 p96DsAcb025563;
	Thu, 6 Oct 2011 06:54:10 -0700
Subject: Re: [Xen-devel] cap and reservation functionality in the credit2
	scheduler?
From: George Dunlap <george.dunlap@citrix.com>
To: Eunbyung Park <silverbottlep@gmail.com>
In-Reply-To: <4E8C3AAC.3070206@gmail.com>
References: <4E8BE083.3080000@gmail.com>
	<CAFLBxZac-6oHaKdeO_kYJ1Y0Fns9xWTt5tyd1BBx0DpvFPk1Dw@mail.gmail.com>
	<4E8C3AAC.3070206@gmail.com>
Content-Type: text/plain; charset="UTF-8"
Date: Thu, 6 Oct 2011 14:57:19 +0100
Message-ID: <1317909439.15843.33.camel@elijah>
MIME-Version: 1.0
X-Mailer: Evolution 2.28.3 
Content-Transfer-Encoding: 8bit
Cc: George Dunlap <George.Dunlap@eu.citrix.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 Wed, 2011-10-05 at 12:08 +0100, Eunbyung Park wrote:
> In addition, I found that adjusting dom0 weight have failed to work, 
> but 
> except for the dom0, it worked well.
> I found that this problem had been on xen-devel lists long time ago, but 
> it seems not to be solved yet.
> I think this may be related with spinlock. When I remove the 
> vcpu_schedule_lock_irq() in csched_dom_cntl(), it worked well.
> I'm not sure what is the real problem because I didn't completely 
> understand the mechanism about spinlocks in xen scheduler.

So I'm afraid that instead of telling you how the spinlocks are supposed
to work, I'm going to let you figure out what the locks should be doing
on your own. If you can't do that, then you may not be ready yet to work
on the scheduler.

I hope that doesn't sound too harsh, but the fact is that the scheduler
is probably one of the most deceptively simple parts of the Xen code.
It requires a lot of expertise to know even how to avoid race conditions
and deadlock, not to mention making a simple algorithm which has the
desired effects without undesirable side effects.  (The shadow code is
probably more complicated, for example, but it *looks* more complicated,
so people don't end up in over their head.)  I wouldn't be doing either
you or me a favor by encouraging you to work on something past your
capability level.

> 2011-10-05 ì˜¤í›„ 7:24, George Dunlap ì“´ ê¸€:
> Actually, I don't have any idea in mind yet.
> however, I will try to devise a method to support them and make a patch.
> So, If you can afford to review, I will appreciate it :)

I'll be happy to review whatever you can send to the list. But like I
said above, beware of getting in over your head. :-)

> And, I think that there are still some to-do lists for the credit2 and 
> xl tools needs to include credit2 support.

This should be fairly straightforward to do, and would be much
appreciated!

 -George


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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 07:06:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 07:06:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBob0-0000xj-S4; Thu, 06 Oct 2011 07:06:46 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBoZX-0000l4-7s
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 07:05:25 -0700
X-Env-Sender: Stephan.Diestelhorst@amd.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1317909864!51297580!1
X-Originating-IP: [213.199.154.143]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25135 invoked from network); 6 Oct 2011 14:04:24 -0000
Received: from db3ehsobe005.messaging.microsoft.com (HELO
	DB3EHSOBE005.bigfish.com) (213.199.154.143)
	by server-9.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	6 Oct 2011 14:04:24 -0000
Received: from mail106-db3-R.bigfish.com (10.3.81.247) by
	DB3EHSOBE005.bigfish.com (10.3.84.25) with Microsoft SMTP Server id
	14.1.225.22; Thu, 6 Oct 2011 14:05:11 +0000
Received: from mail106-db3 (localhost.localdomain [127.0.0.1])	by
	mail106-db3-R.bigfish.com (Postfix) with ESMTP id 3216F15903AA;
	Thu,  6 Oct 2011 14:05:11 +0000 (UTC)
X-SpamScore: -11
X-BigFish: VPS-11(zz9371K1432N98dKzz1202hzz8275bhz32i668h839h93fh)
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 mail106-db3 (localhost.localdomain [127.0.0.1]) by mail106-db3
	(MessageSwitch) id 1317909867182626_16248;
	Thu,  6 Oct 2011 14:04:27 +0000 (UTC)
Received: from DB3EHSMHS005.bigfish.com (unknown [10.3.81.246])	by
	mail106-db3.bigfish.com (Postfix) with ESMTP id 1C60EA10053;
	Thu,  6 Oct 2011 14:04:27 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	DB3EHSMHS005.bigfish.com (10.3.87.105) with Microsoft SMTP Server id
	14.1.225.22; Thu, 6 Oct 2011 14:04:25 +0000
X-WSS-ID: 0LSNDR4-01-65F-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 29CD210284CB;	Thu,  6 Oct 2011 09:04:16 -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.106.1;
	Thu, 6 Oct 2011 09:04:35 -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, 6 Oct 2011 09:04:19 -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, 6 Oct 2011 10:04:14 -0400
Received: from chlor.localnet (chlor.osrc.amd.com [165.204.15.145])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 8A20E49C108; Thu,  6 Oct 2011
	15:04:13 +0100 (BST)
From: Stephan Diestelhorst <stephan.diestelhorst@amd.com>
To: Linus Torvalds <torvalds@linux-foundation.org>
Subject: Re: [Xen-devel] [PATCH 00/10] [PATCH RFC V2] Paravirtualized
	ticketlocks
Date: Thu, 6 Oct 2011 16:04:13 +0200
Message-ID: <2707952.s3VYcmPHUN@chlor>
Organization: AMD OSRC
User-Agent: KMail/4.7.0  (Linux/2.6.38-11-generic; KDE/4.7.0; x86_64; ; )
In-Reply-To: <CA+55aFwm7ESNfrHhEHrAKcjcPUq8YxtuEkJd5PzAekYo2dMYNw@mail.gmail.com>
References: <cover.1315878463.git.jeremy.fitzhardinge@citrix.com>
	<201109282008.17722.stephan.diestelhorst@amd.com>
	<CA+55aFwm7ESNfrHhEHrAKcjcPUq8YxtuEkJd5PzAekYo2dMYNw@mail.gmail.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="utf-8"
X-OriginatorOrg: amd.com
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Nick Piggin <npiggin@kernel.dk>, KVM <kvm@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jan Beulich <JBeulich@suse.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"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 28 September 2011, 14:49:56 Linus Torvalds wrote:
> On Wed, Sep 28, 2011 at 11:08 AM, Stephan Diestelhorst
> <stephan.diestelhorst@amd.com> wrote:
> >
> > I must have missed the part when this turned into the propose-the-
> > craziest-way-that-this-still-works.contest :)
> 
> So doing it just with the "lock addb" probably works fine, but I have
> to say that I personally shudder at the "surround the locked addb by
> reads from the word, in order to approximate an atomic read of the
> upper bits".
> 
> Because what you get is not really an "atomic read of the upper bits",
> it's a "ok, we'll get the worst case of somebody modifying the upper
> bits at the same time".
> 
> Which certainly should *work*, but from a conceptual standpoint, isn't
> it just *much* nicer to say "we actually know *exactly* what the upper
> bits were".

Well, we really do NOT want atomicity here. What we really rather want
is sequentiality: free the lock, make the update visible, and THEN
check if someone has gone sleeping on it.

Atomicity only conveniently enforces that the three do not happen in a
different order (with the store becoming visible after the checking
load).

This does not have to be atomic, since spurious wakeups are not a
problem, in particular not with the FIFO-ness of ticket locks.

For that the fence, additional atomic etc. would be IMHO much cleaner
than the crazy overflow logic.

> But I don't care all *that* deeply. I do agree that the xaddw trick is
> pretty tricky. I just happen to think that it's actually *less* tricky
> than "read the upper bits separately and depend on subtle ordering
> issues with another writer that happens at the same time on another
> CPU".

Fair enough :)

Stephan
-- 
Stephan Diestelhorst, AMD Operating System Research Center
stephan.diestelhorst@amd.com
Tel. +49 (0)351 448 356 719

Advanced Micro Devices GmbH
Einsteinring 24
85609 Aschheim
Germany

Geschaeftsfuehrer: Alberto Bozzo
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632, WEEE-Reg-Nr: DE 12919551



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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 07:13:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 07:13:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBohl-0001PU-MR; Thu, 06 Oct 2011 07:13:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBohG-0001Di-Ji
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 07:13:17 -0700
X-Env-Sender: anthony@overnetdata.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317910375!56994159!1
X-Originating-IP: [81.137.131.225]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17811 invoked from network); 6 Oct 2011 14:12:55 -0000
Received: from host81-137-131-225.in-addr.btopenworld.com (HELO
	zimbra.overnetdata.com) (81.137.131.225)
	by server-10.tower-21.messagelabs.com with SMTP;
	6 Oct 2011 14:12:55 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by zimbra.overnetdata.com (Postfix) with ESMTP id F25291616C7;
	Thu,  6 Oct 2011 15:06:05 +0100 (BST)
X-Virus-Scanned: amavisd-new at overnetdata.com
Received: from zimbra.overnetdata.com ([127.0.0.1])
	by localhost (zimbra.overnetdata.com [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id bX8pqnh6Hrq4; Thu,  6 Oct 2011 15:05:55 +0100 (BST)
Received: from [192.168.1.59] (unknown [192.168.1.59])
	by zimbra.overnetdata.com (Postfix) with ESMTPSA id 416531616C0;
	Thu,  6 Oct 2011 15:05:55 +0100 (BST)
Message-ID: <4E8DB5BE.2050004@overnetdata.com>
Date: Thu, 06 Oct 2011 15:05:50 +0100
From: Anthony Wright <anthony@overnetdata.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
References: <4E85DB1A.5060606@overnetdata.com>
	<20111001120706.GZ12984@reaktio.net>
	<4E89BEBB.9060708@overnetdata.com>
	<20111003191020.GG15608@phenom.oracle.com>
In-Reply-To: <20111003191020.GG15608@phenom.oracle.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
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/10/2011 20:10, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 03, 2011 at 02:55:07PM +0100, Anthony Wright wrote:
>> On 01/10/2011 13:07, Pasi Kärkkäinen wrote:
>>> On Fri, Sep 30, 2011 at 04:07:06PM +0100, Anthony Wright wrote:
>>>> Stage 1
>>>> Everything is fine, Dom0 has 2000MB according to xl list, and 'xl info'
>>>> says there is 2405MB free.
>>>>
>>> - How much memory did dom0 initially have? 
>>> - Did you use mem= parameter for dom0 kernel (vmlinuz) ?
>>>
>>> See: http://wiki.xen.org/xenwiki/Linux_30_bugs
>> On thing I forgot to mention, is that if I hit or get close to this
>> memory issue, one time in three/four on reboot the system hangs at the
>> final reboot request into the kernel.
> .. are there any guests still sitting around when that happens? If you
> reboot the machine normally do you see the same issue? (and do you have
> guests still running when you do this?).
If I startup and shutdown Dom0 without starting any DomU's the system
shuts down nicely every time.

If I startup a fair number of DomUs (23), then I have problems on the
shutdown every so often. As far as I know there are no DomU's running,
we do carefully shut them all down as part of the shutdown process, (xl
shutdown, and then an xl destroy if that doesn't work).

Surely though if Dom0 dies, shouldn't the whole system be shutdown too?


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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 07:26:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 07:26:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBouQ-0002cG-Bl; Thu, 06 Oct 2011 07:26:50 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBosW-0001ud-L5
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 07:24:53 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1317911089!21218735!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20737 invoked from network); 6 Oct 2011 14:24:49 -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;
	6 Oct 2011 14:24:49 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8252998"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 14:24: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; Thu, 6 Oct 2011 15:24:49 +0100
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
	1RBosS-0004l2-U4; Thu, 06 Oct 2011 14:24:48 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBosS-0002wD-RL;
	Thu, 06 Oct 2011 15:24:48 +0100
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: <20109.47664.835436.982989@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 15:24:48 +0100
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: Re: [Xen-devel] Re: [PATCH RESEND V8 4/7] libxl: Introduce
	libxl__realloc.
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1316681562.23371.38.camel@zakaz.uk.xensource.com>
References: <1316609997-26002-1-git-send-email-anthony.perard@citrix.com>
	<1316609997-26002-5-git-send-email-anthony.perard@citrix.com>
	<1316612077.3891.187.camel@zakaz.uk.xensource.com>
	<4E79ED94.1000308@amd.com>
	<1316619995.3891.221.camel@zakaz.uk.xensource.com>
	<4E7AEF0D.5060304@amd.com>
	<1316681562.23371.38.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Anthony Perard <anthony.perard@citrix.com>,
	Christoph Egger <Christoph.Egger@amd.com>,
	Xen Devel <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

Ian Campbell writes ("Re: [Xen-devel] Re: [PATCH RESEND V8 4/7] libxl: Introduce libxl__realloc."):
> libxl: add comments describing the internal memory allocation helpers
> 
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

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 Thu Oct 06 07:39:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 07:39:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBp6h-0003PC-FX; Thu, 06 Oct 2011 07:39:31 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBp5t-0003Cl-Jd
	for Xen-devel@lists.xensource.com; Thu, 06 Oct 2011 07:38:42 -0700
X-Env-Sender: pracshi@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1317911904!43115464!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29665 invoked from network); 6 Oct 2011 14:38:24 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 14:38:24 -0000
Received: by bkas6 with SMTP id s6so4708281bka.30
	for <Xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 07:38:38 -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=IOvubPK4Rsp3UpEEb40kzwQmS9MmlEGJVGOAc5K5DHI=;
	b=StvFhbxpM74MZ4oyhpIkM9ovBkKsCmPi0OYcgg/5F3uWZar7AOpre4lBCQPYjuko+R
	rVZV+NCAKvW0oF4ca138SreoSADJsQoR24EmvRTVkHGfjxLkQwDJuCLKNbWXOyIv7Bgf
	FHrqw0AuKQaAIA9qFNSnwkW3wfZk59W4h9O/o=
MIME-Version: 1.0
Received: by 10.204.13.66 with SMTP id b2mr669285bka.104.1317911917867; Thu,
	06 Oct 2011 07:38:37 -0700 (PDT)
Received: by 10.204.32.4 with HTTP; Thu, 6 Oct 2011 07:38:37 -0700 (PDT)
Date: Thu, 6 Oct 2011 07:38:37 -0700
Message-ID: <CAEAezkVkfj7mFqEgK+crFZ7T1HAkFqL5rOeCe36JBeH+3=YX+A@mail.gmail.com>
From: Pratik shinde <pracshi@gmail.com>
To: Xen-devel@lists.xensource.com
Cc: 
Subject: [Xen-devel] [Project Idea]:-Want a guidance for the project
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0511607701=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0511607701==
Content-Type: multipart/alternative; boundary=00151750e2d4b5b66604aea247fb

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

Respected Sir,
                     I am an undergraduate student from Pune
University(India).As my last year project we are thinking of implementing
the co-scheduling in Xen for concurrent jobs depending on the degree of
concurrency of the domain.
      Sir, abstract for my project is as:

Abstract---Symmetric multiprocessing (SMP) virtual machine (VMs) allow user
to take advantage of multiprocessor architecture. Xen current scheduler
schedules the virtual CPUs (vCPUs) of a virtual machine asynchronously,
which guarantees the proportion of CPU time corresponding to its weight,
maximizing the throughput of the system. But the performance may
deteriorated while executing concurrent applications due to current
scheduling strategy. To address this problem Yulong Yu et al. proposed
co-scheduling strategy in which vCPUs of a SMP VM are scheduled
simultaneously. But this approach causes other problems such as CPU
fragmentation, priority inversion that degrades I/O performance. Our
implementation is inspired from the work proposed by Orathai Sukwong et al.
in Kernel Virtual Machine (KVM) where no two vCPUs are forced to schedule
simultaneously though they are executing concurrent jobs. Our implementation
tries to co-schedule concurrent vCPUs depending on the degree of
co-scheduling of a domain. If degree of co-scheduling of a VM is less than
some threshold value then vCPUs of a VM are scheduled asynchronously and if
it is more then all vCPUs are forced to scheduled simultaneously.

Keywords: Symmetric multiprocessing virtual machine, Xen, Co-scheduling,
KVM, Balance Scheduling

       Forceful co-scheduling of VM may cause many problems such as CPU
fragmentation,priority inversion..This scheduling strategy may keep a
balance.

Sir can you suggest any improvement to this idea.Should I mail you our
project synopsis?

Thanking you


**

* *

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

<font size=3D"2">Respected Sir,<br>=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0=A0 I am an undergraduate student from Pune University(In=
dia).As my last year project we are thinking of implementing the co-schedul=
ing in Xen for concurrent jobs depending on the degree of concurrency of th=
e domain.<br>
=A0 =A0 =A0 Sir, abstract for my project is as:<br><br></font><meta http-eq=
uiv=3D"Content-Type" content=3D"text/html; charset=3Dutf-8"><meta name=3D"P=
rogId" content=3D"Word.Document"><meta name=3D"Generator" content=3D"Micros=
oft Word 12"><meta name=3D"Originator" content=3D"Microsoft Word 12"><link =
rel=3D"File-List" href=3D"file:///C:%5CUsers%5Cpratik%5CAppData%5CLocal%5CT=
emp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml"><link rel=3D"themeData" href=
=3D"file:///C:%5CUsers%5Cpratik%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C0=
1%5Cclip_themedata.thmx"><link rel=3D"colorSchemeMapping" href=3D"file:///C=
:%5CUsers%5Cpratik%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colo=
rschememapping.xml"><style>
<!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:roman;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1107304683 0 0 159 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:0in;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.5in;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParag=
raphCxSpFirst
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListPar=
agraphCxSpMiddle
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagra=
phCxSpLast
	{mso-style-priority:34;
	mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-type:export-only;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:10.0pt;
	margin-left:.5in;
	mso-add-space:auto;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
@page Section1
	{size:8.5in 11.0in;
	margin:1.0in 1.0in 1.0in 1.0in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
 /* List Definitions */
 @list l0
	{mso-list-id:1876767880;
	mso-list-type:hybrid;
	mso-list-template-ids:1717329606 -964642248 67698713 67698715 67698703 676=
98713 67698715 67698703 67698713 67698715;}
@list l0:level1
	{mso-level-tab-stop:none;
	mso-level-number-position:left;
	margin-left:1.25in;
	text-indent:-.25in;}
ol
	{margin-bottom:0in;}
ul
	{margin-bottom:0in;}
-->
</style>

<p class=3D"MsoNormal" style=3D"text-align: justify; line-height: normal;">=
<font size=3D"2"><span style=3D"font-family: &quot;Times New Roman&quot;,&q=
uot;serif&quot;;">Abstract---Symmetric multiprocessing
(SMP) virtual machine (VMs) allow user to take advantage of multiprocessor
architecture. Xen current scheduler schedules the virtual CPUs (vCPUs) of a
virtual machine asynchronously, which guarantees the proportion of CPU time
corresponding to its weight, maximizing the throughput of the system. But t=
he
performance may deteriorated while executing concurrent applications due
to current scheduling strategy. To address this problem Yulong Yu et al. pr=
oposed
co-scheduling strategy in which vCPUs of a SMP VM are scheduled simultaneou=
sly.
But this approach causes other problems such as CPU fragmentation, priority
inversion that degrades I/O performance. Our implementation is inspired fro=
m
the work proposed by Orathai Sukwong et al. in Kernel Virtual Machine (KVM)
where no two vCPUs are forced to schedule simultaneously though they are
executing concurrent jobs. Our implementation tries to co-schedule concurre=
nt vCPUs depending on the degree of co-scheduling of a domain. If degree of=
 co-scheduling of a VM is less than some threshold value then vCPUs of a VM=
 are scheduled asynchronously and if it is more then all vCPUs are forced t=
o scheduled simultaneously. </span></font></p>


<p class=3D"MsoNormal" style=3D"text-align: justify; line-height: normal;">=
<font size=3D"2"><span style=3D"font-family: &quot;Times New Roman&quot;,&q=
uot;serif&quot;;">Keywords: Symmetric multiprocessing virtual machine,
Xen, Co-scheduling, KVM, Balance Scheduling</span></font></p><p class=3D"Ms=
oNormal" style=3D"text-align: justify; line-height: normal;"><font size=3D"=
2">=A0=A0=A0=A0=A0=A0 Forceful co-scheduling of VM may cause many problems =
such as CPU fragmentation,priority inversion..This scheduling strategy may =
keep a balance.</font></p>
<p class=3D"MsoNormal" style=3D"text-align: justify; line-height: normal;">=
<font size=3D"2">Sir can you suggest any improvement to this idea.Should I =
mail you our project synopsis?</font></p><p class=3D"MsoNormal" style=3D"te=
xt-align: justify; line-height: normal;">
<font size=3D"2">Thanking you<br></font></p><p class=3D"MsoNormal" style=3D=
"text-align: justify; line-height: normal;"><font size=3D"2">=A0 <br><span =
style=3D"font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;"></spa=
n><b><span style=3D"font-family: &quot;Times New Roman&quot;,&quot;serif&qu=
ot;;"></span></b></font></p>


<p class=3D"MsoNormal" style=3D"text-align: justify; line-height: normal;">=
<font size=3D"2"><b><span style=3D"font-family: &quot;Times New Roman&quot;=
,&quot;serif&quot;;">=A0</span></b></font></p><font size=3D"2"><br><br></fo=
nt>

--00151750e2d4b5b66604aea247fb--


--===============0511607701==
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

--===============0511607701==--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 07:56:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 07:56:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBpMk-0004ff-Rn; Thu, 06 Oct 2011 07:56:07 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBpMC-0004TQ-Tc
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 07:55:33 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1317912911!47097901!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21514 invoked from network); 6 Oct 2011 14:55:11 -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;
	6 Oct 2011 14:55:11 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8253864"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 14:55: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, 6 Oct 2011 15:55:29 +0100
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
	1RBpM9-0004vO-HU; Thu, 06 Oct 2011 14:55:29 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBpM9-00036o-GM;
	Thu, 06 Oct 2011 15:55:29 +0100
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: <20109.49505.494723.935337@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 15:55:29 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1 of 6] libxl: IDL: autogenerate functions to
	produce JSON from libxl data structures
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <030e844fccebcc3984c5.1317313228@localhost.localdomain>
References: <patchbomb.1317313227@localhost.localdomain>
	<030e844fccebcc3984c5.1317313228@localhost.localdomain>
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 1 of 6] libxl: IDL: autogenerate functi> libxl: IDL: autogenerate functions to produce JSON from libxl data structures.
...
> Also update testidl to generate a random version of each IDL datastructure and
> convert it to JSON. Unfortunately this requires a libxl_ctx and therefore the
> test must be run on a Xen system now.

Perhaps we should have a new version of libxl_ctx_alloc which doesn't
attempt to connect to xenstore etc., for these kind of purposes.  This
might turn out to be useful for xl's command line handling too.

Not essential for this patch, though.

> +    elif isinstance(ty, libxltypes.Struct) and (parent is None or ty.json_fn is None):

Do we care about these >80-column lines ?

>      f.write("""
>  #include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +
>  #include \"libxl.h\"
> +#include \"libxl_utils.h\"

AIU Python's quoting rules, these \'s are unnecessary.  And indeed
later we have:

> +      /* A random selection from libxl_cpuid_parse_config */
> +        {"maxleaf",     32},

> +static void rand_bytes(uint8_t *p, size_t sz)
> +{
> +    int i;
> +    for (i=0; i<sz; i++)
> +        p[i] = rand() % 256;
> +        //p[i] = i;

This line is leftover cruft ?

> diff -r fb42038b1f5c -r 030e844fcceb tools/libxl/gentypes.py
> --- a/tools/libxl/gentypes.py	Thu Sep 29 16:57:52 2011 +0100
> +++ b/tools/libxl/gentypes.py	Thu Sep 29 17:02:14 2011 +0100
> @@ -29,7 +29,6 @@ def libxl_C_instance_of(ty, instancename

I haven't reviewed this in detail but I have instead looked at the
output:

> yajl_gen_status libxl_uuid_gen_json(yajl_gen hand,
>                                     libxl_uuid *p);

Are we confident that these functions will never need to take a
libxl_ctx ?

> yajl_gen_status libxl_disk_format_gen_json(yajl_gen hand, libxl_disk_format *p)
> {
>     yajl_gen_status s;
>     {
>         const char *se = libxl_disk_format_to_string(*p);
>         if (se)
>             s = yajl_gen_string(hand, (const unsigned char *)se, strlen(se));
>         else
>             s = yajl_gen_null(hand);
>         if (s != yajl_gen_status_ok)
>             goto out;
>     }
>     out:
>     return s;
> }

There are quite a few functions which all look like this.  Perhaps the
bulk of this function should be a helper function, so you end up with
something like this:

 yajl_gen_status libxl_disk_format_gen_json(yajl_gen hand, libxl_disk_format *p)
 {
    return libxl__yajl_gen_enum(hand, libxl_disk_format_to_string(*p));
 }

That might reduce the size of the compiled code quite a bit.  IME
autogenerated code can get very big if one isn't careful.

> diff -r fb42038b1f5c -r 030e844fcceb tools/libxl/idl.txt
> --- a/tools/libxl/idl.txt	Thu Sep 29 16:57:52 2011 +0100
> +++ b/tools/libxl/idl.txt	Thu Sep 29 17:02:14 2011 +0100
...
> +yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand,
> +                                libxl_cpuid_policy_list *pcpuid)
> +{

This rather ad-hoc treatment of cpuid policies isn't ideal I think.
Did we want to try to recast them as some more general aggregate ?

> +    libxl_cpuid_policy_list cpuid = *pcpuid;
> +    yajl_gen_status s;
> +    const char *input_names[2] = { "leaf", "subleaf" };
> +    const char *policy_names[4] = { "eax", "ebx", "ecx", "edx" };
> +    int i, j;
> +
> +    /*
> +     * Aiming for:
> +     * [
> +     *     { 'leaf':    'val-eax',
> +     *       'subleaf': 'val-edx',
> +     *       'ebx':     'filter',
> +     *       'ecx':     'filter',
> +     *       'edx':     'filter' }, ],
> +     *     { 'leaf':    'val-eax', ..., 'eax': 'filter', ... },
> +     *     ... etc ...
> +     * }
> +     */

Mismatched brackets, or confused indenting, in the comment.

> diff -r fb42038b1f5c -r 030e844fcceb tools/libxl/libxl_json.h
> --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> +++ b/tools/libxl/libxl_json.h	Thu Sep 29 17:02:14 2011 +0100
...
> +yajl_gen_status libxl_uuid_gen_json(yajl_gen hand,
> +                                    libxl_uuid *p);

Shouldn't these declarations be produced automatically by the IDL
compiler ?  After all it's going to generate calls to these functions.

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 08:02:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08:02:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBpSf-0005Dg-Af; Thu, 06 Oct 2011 08:02:13 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBpOS-0004xo-Vn
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 07:58:57 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1317913069!30535896!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5319 invoked from network); 6 Oct 2011 14:57:49 -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;
	6 Oct 2011 14:57:49 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8253930"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 14:57: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; Thu, 6 Oct 2011 15:57:49 +0100
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
	1RBpOP-0004wB-Ae; Thu, 06 Oct 2011 14:57:49 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBpOP-000377-9Y;
	Thu, 06 Oct 2011 15:57:49 +0100
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: <20109.49645.284014.472695@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 15:57:49 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 2 of 6] xl: allow check-xl-disk-parse to run
	against installed xl as well as build dir
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <3fb003a5d5367ccdfb96.1317313229@localhost.localdomain>
References: <patchbomb.1317313227@localhost.localdomain>
	<3fb003a5d5367ccdfb96.1317313229@localhost.localdomain>
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 2 of 6] xl: allow check-xl-disk-parse to run against installed xl as well as build dir"):
> xl: allow check-xl-disk-parse to run against installed xl as well as build dir

This looks good except:

> +    XL=/usr/sbin/xl

XL=xl surely ?

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 08:07:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08:07:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBpXN-0005ek-2g; Thu, 06 Oct 2011 08:07:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBpQO-0004zd-N7
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 08:00:27 -0700
X-Env-Sender: anthony@overnetdata.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317913188!20548697!1
X-Originating-IP: [81.137.131.225]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8970 invoked from network); 6 Oct 2011 14:59:48 -0000
Received: from host81-137-131-225.in-addr.btopenworld.com (HELO
	zimbra.overnetdata.com) (81.137.131.225)
	by server-8.tower-174.messagelabs.com with SMTP;
	6 Oct 2011 14:59:48 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by zimbra.overnetdata.com (Postfix) with ESMTP id 8E05C1616C0;
	Thu,  6 Oct 2011 15:59:47 +0100 (BST)
X-Virus-Scanned: amavisd-new at overnetdata.com
Received: from zimbra.overnetdata.com ([127.0.0.1])
	by localhost (zimbra.overnetdata.com [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id LwCxb9GeiBMe; Thu,  6 Oct 2011 15:59:37 +0100 (BST)
Received: from [192.168.1.59] (unknown [192.168.1.59])
	by zimbra.overnetdata.com (Postfix) with ESMTPSA id D75341616BF;
	Thu,  6 Oct 2011 15:59:36 +0100 (BST)
Message-ID: <4E8DC254.7060001@overnetdata.com>
Date: Thu, 06 Oct 2011 15:59:32 +0100
From: Anthony Wright <anthony@overnetdata.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
References: <4E85DB1A.5060606@overnetdata.com>
	<20111001120706.GZ12984@reaktio.net>
	<4E89BC80.4030105@overnetdata.com>
	<20111003190917.GF15608@phenom.oracle.com>
In-Reply-To: <20111003190917.GF15608@phenom.oracle.com>
X-Enigmail-Version: 1.3.2
Content-Type: multipart/mixed; boundary="------------000906080401070707060407"
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

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

On 03/10/2011 20:09, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 03, 2011 at 02:45:36PM +0100, Anthony Wright wrote:
>> On 01/10/2011 13:07, Pasi Kärkkäinen wrote:
>>> On Fri, Sep 30, 2011 at 04:07:06PM +0100, Anthony Wright wrote:
>>>> I have a machine with 16GB of RAM running 32 bit xen 4.1.1 with Dom0
>>>> running a 3.0.4 linux kernel and 23 paravirtualized DomUs.
>>>>
>>> Hey,
>>>
>>> Why 32bit Xen? I think all (most?) hypervisor testing happens with 64bit Xen.
>>> Note that you can still have 32bit dom0 kernel with 64b hypervisor.
>> I'm going to investigate 64 bit xen on a 32 bit Dom0 soon, but as to the
>> 32 xen, I work quite a lot with older hardware and Xen since it does
>> paravirtualisation, and it's a really good way to re-use old hardware.
>>>> As the free ram gets to 2391 MB free the system behaves as if it's got
>>>> no more ram, and starts grabbing ram from Dom0, before getting even more
>>>> confused and failing to start DomUs and eventually crashing the whole
>>>> machine. I have attached a tarball with the output of xl dmesg, xl info
>>>> & xl list at various points.
>>>>
>>> - Do you use dom0_mem= parameter for Xen? 
>>> - Did you disable dom0 ballooning? 
>>>
>>> http://wiki.xen.org/xenwiki/XenBestPractices
>> I was already using the dom0_mem= parameter on the xen hypervisor, but I
>> disabled dom0 ballooning (enable-dom0-ballooning no), and just for good
>> measure I also set (dom0-min-mem 2000). This had no effect, when I
>> increase the 10-4 memory requirements, on restart the Dom0 memory is
>> reduced to 1713MB and xl info reports 2391MB free.
>>>> Stage 1
>>>> Everything is fine, Dom0 has 2000MB according to xl list, and 'xl info'
>>>> says there is 2405MB free.
>>> - How much memory did dom0 initially have? 
>>> - Did you use mem= parameter for dom0 kernel (vmlinuz) ?
>>>
>>> See: http://wiki.xen.org/xenwiki/Linux_30_bugs
>> dom0 starts with 2000MB.
>> I didn't use mem= on the linux kernel - I thought it wasn't neccessary.
> It is if your kernel does not have these two patches:
>
>     xen: use maximum reservation to limit amount of usable RAM
>     xen/e820: if there is no dom0_mem=, don't tweak extra_pages.
>
> .. oh and you also need to update the hypervisor to include:
> "
>     For dom0, this requires at patch to Xen ('x86: use 'dom0_mem' to limit
>     the number of pages for dom0') (c/s 23790)
> "
>
> Grrr.. Let me update the 3.0 bug-list
>From reading around some of the bug reports, I thought this was a
problem caused by the fact that I have 16GB of ram. As a result I
reduced the amount of physical ram in the machine down to 8GB, but still
got the same effect (with the two kernel patches, but not with the xen
patch as I can't find it). I've attached a log of xl info & xl list as
the domU that trips the machine up is started (10-5). Dom0 is supposed
to have 700MB of ram (dom0_mem=500M), dom0-min-mem is 700 and
enable-dom0-ballooning is no.

--------------000906080401070707060407
Content-Type: text/plain;
 name="dom-mem.log"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="dom-mem.log"

AET-Box-4:~ # date ; xl info ; xl list                                                          
Thu Oct  6 14:53:19 UTC 2011                                                                    
host                   : AET-Box-4                                                              
release                : 3.0.4                                                                  
version                : #1 SMP Mon Oct 3 05:22:53 GMT 2011                                     
machine                : i686                                                                   
nr_cpus                : 16                                                                     
nr_nodes               : 2                                                                      
cores_per_socket       : 4                                                                      
threads_per_core       : 2                                                                      
cpu_mhz                : 2533                                                                   
hw_caps                : bfebfbff:2c100000:00000000:00003f40:029ee3ff:00000000:00000001:00000000
virt_caps              : hvm hvm_directio                                                       
total_memory           : 8181                                                                   
free_memory            : 1491                                                                   
free_cpus              : 0                                                                      
xen_major              : 4                                                                      
xen_minor              : 1                                                                      
xen_extra              : .1                                                                     
xen_caps               : xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p                         
xen_scheduler          : credit                                                                 
xen_pagesize           : 4096                                                                   
platform_params        : virt_start=0xf5800000                                                  
xen_changeset          : unavailable                                                            
xen_commandline        : dom0_mem=700M sched=credit                                             
cc_compiler            : gcc version 4.4.3 (GCC)                                                
cc_compile_by          :                                                                        
cc_compile_domain      : [unknown]                                                              
cc_compile_date        : Wed Sep 21 08:25:36 GMT 2011                                           
xend_config_format     : 4                                                                      
Name                                        ID   Mem VCPUs      State   Time(s)                 
Domain-0                                     0   700     8     r-----      64.3                 
1-15                                         1  1300     8     -b----       9.3                 
22-5                                         2   400     2     -b----       8.9                 
7-5                                          3   400     2     -b----       8.5                 
8-4                                          4   200     1     -b----       3.3                 
16-5                                         5   400     2     -b----       6.2                 
12-2                                         6   200     1     -b----       4.3                 
21-2                                         7   200     1     -b----       4.1                 
4-5                                          8   400     2     -b----       6.0                 
15-2                                         9   200     1     -b----       4.3                 
5-4                                         10   200     1     -b----       2.7                 
19-5                                        11   400     2     -b----       4.3                 
17-4                                        12   200     1     -b----       2.5                 
13-5                                        13   400     2     -b----       1.4                 
20-4                                        14   200     1     -b----       2.8                 
11-4                                        15   200     1     -b----       2.5                 
14-4                                        16   200     1     -b----       1.3                 
23-6                                        17   200     1     -b----       1.1                 
6-2                                         18   200     1     --p---       0.0                 
AET-Box-4:~ # date ; xl info ; xl list                                                          

Thu Oct  6 14:53:23 UTC 2011
host                   : AET-Box-4
release                : 3.0.4    
version                : #1 SMP Mon Oct 3 05:22:53 GMT 2011
machine                : i686                              
nr_cpus                : 16                                
nr_nodes               : 2                                 
cores_per_socket       : 4                                 
threads_per_core       : 2                                 
cpu_mhz                : 2533                              
hw_caps                : bfebfbff:2c100000:00000000:00003f40:029ee3ff:00000000:00000001:00000000
virt_caps              : hvm hvm_directio                                                       
total_memory           : 8181                                                                   
free_memory            : 1635                                                                   
free_cpus              : 0                                                                      
xen_major              : 4                                                                      
xen_minor              : 1                                                                      
xen_extra              : .1                                                                     
xen_caps               : xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p                         
xen_scheduler          : credit                                                                 
xen_pagesize           : 4096                                                                   
platform_params        : virt_start=0xf5800000                                                  
xen_changeset          : unavailable                                                            
xen_commandline        : dom0_mem=700M sched=credit                                             
cc_compiler            : gcc version 4.4.3 (GCC)                                                
cc_compile_by          :                                                                        
cc_compile_domain      : [unknown]                                                              
cc_compile_date        : Wed Sep 21 08:25:36 GMT 2011                                           
xend_config_format     : 4                                                                      
Name                                        ID   Mem VCPUs      State   Time(s)                 
Domain-0                                     0   555     8     r-----      65.3                 
1-15                                         1  1300     8     -b----       9.5                 
22-5                                         2   400     2     -b----       8.9                 
7-5                                          3   400     2     -b----       8.5                 
8-4                                          4   200     1     -b----       3.4                 
16-5                                         5   400     2     -b----       6.5                 
12-2                                         6   200     1     -b----       4.3                 
21-2                                         7   200     1     -b----       4.2                 
4-5                                          8   400     2     -b----       6.1                 
15-2                                         9   200     1     -b----       4.3                 
5-4                                         10   200     1     -b----       2.8                 
19-5                                        11   400     2     -b----       4.8                 
17-4                                        12   200     1     -b----       2.8                 
13-5                                        13   400     2     -b----       1.4                 
20-4                                        14   200     1     -b----       2.8                 
11-4                                        15   200     1     -b----       2.6                 
14-4                                        16   200     1     -b----       1.5                 
23-6                                        17   200     1     -b----       1.2                 
6-2                                         18   200     1     -b----       0.8                 
(null)                                      19     0     0     --p---       0.0                 
AET-Box-4:~ # date ; xl info ; xl list                                                          
Thu Oct  6 14:53:28 UTC 2011                                                                    
host                   : AET-Box-4                                                              
release                : 3.0.4                                                                  
version                : #1 SMP Mon Oct 3 05:22:53 GMT 2011                                     
machine                : i686                                                                   
nr_cpus                : 16                                                                     
nr_nodes               : 2                                                                      
cores_per_socket       : 4                                                                      
threads_per_core       : 2                                                                      
cpu_mhz                : 2533                                                                   
hw_caps                : bfebfbff:2c100000:00000000:00003f40:029ee3ff:00000000:00000001:00000000
virt_caps              : hvm hvm_directio                                                       
total_memory           : 8181                                                                   
free_memory            : 1635                                                                   
free_cpus              : 0                                                                      
xen_major              : 4                                                                      
xen_minor              : 1                                                                      
xen_extra              : .1                                                                     
xen_caps               : xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p                         
xen_scheduler          : credit                                                                 
xen_pagesize           : 4096                                                                   
platform_params        : virt_start=0xf5800000                                                  
xen_changeset          : unavailable                                                            
xen_commandline        : dom0_mem=700M sched=credit                                             
cc_compiler            : gcc version 4.4.3 (GCC)                                                
cc_compile_by          :                                                                        
cc_compile_domain      : [unknown]                                                              
cc_compile_date        : Wed Sep 21 08:25:36 GMT 2011                                           
xend_config_format     : 4                                                                      
Name                                        ID   Mem VCPUs      State   Time(s)                 
Domain-0                                     0   555     8     r-----      66.4                 
1-15                                         1  1300     8     -b----       9.6                 
22-5                                         2   400     2     -b----       8.9                 
7-5                                          3   400     2     -b----       8.5                 
8-4                                          4   200     1     -b----       3.4                 
16-5                                         5   400     2     -b----       7.0                 
12-2                                         6   200     1     -b----       4.4                 
21-2                                         7   200     1     -b----       4.2                 
4-5                                          8   400     2     -b----       6.5                 
15-2                                         9   200     1     -b----       4.3                 
5-4                                         10   200     1     -b----       2.8                 
19-5                                        11   400     2     -b----       5.5                 
17-4                                        12   200     1     -b----       2.8                 
13-5                                        13   400     2     -b----       1.5                 
20-4                                        14   200     1     -b----       3.0                 
11-4                                        15   200     1     -b----       2.7                 
14-4                                        16   200     1     -b----       2.2                 
23-6                                        17   200     1     -b----       2.2                 
6-2                                         18   200     1     -b----       0.8                 
10-5                                        19     0     0     --p---       0.0                 
AET-Box-4:~ # date ; xl info ; xl list                                                          
Thu Oct  6 14:53:30 UTC 2011                                                                    
host                   : AET-Box-4                                                              
release                : 3.0.4                                                                  
version                : #1 SMP Mon Oct 3 05:22:53 GMT 2011                                     
machine                : i686                                                                   
nr_cpus                : 16                                                                     
nr_nodes               : 2                                                                      
cores_per_socket       : 4                                                                      
threads_per_core       : 2                                                                      
cpu_mhz                : 2533                                                                   
hw_caps                : bfebfbff:2c100000:00000000:00003f40:029ee3ff:00000000:00000001:00000000
virt_caps              : hvm hvm_directio                                                       
total_memory           : 8181                                                                   
free_memory            : 1235                                                                   
free_cpus              : 0                                                                      
xen_major              : 4                                                                      
xen_minor              : 1                                                                      
xen_extra              : .1                                                                     
xen_caps               : xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p                         
xen_scheduler          : credit                                                                 
xen_pagesize           : 4096                                                                   
platform_params        : virt_start=0xf5800000                                                  
xen_changeset          : unavailable                                                            
xen_commandline        : dom0_mem=700M sched=credit                                             
cc_compiler            : gcc version 4.4.3 (GCC)                                                
cc_compile_by          :                                                                        
cc_compile_domain      : [unknown]                                                              
cc_compile_date        : Wed Sep 21 08:25:36 GMT 2011                                           
xend_config_format     : 4                                                                      
Name                                        ID   Mem VCPUs      State   Time(s)                 
Domain-0                                     0   555     8     r-----      67.2                 
1-15                                         1  1300     8     -b----       9.7                 
22-5                                         2   400     2     -b----       8.9                 
7-5                                          3   400     2     -b----       8.5                 
8-4                                          4   200     1     -b----       3.4                 
16-5                                         5   400     2     r-----       7.5                 
12-2                                         6   200     1     -b----       4.4                 
21-2                                         7   200     1     -b----       4.2                 
4-5                                          8   400     2     r-----       6.9                 
15-2                                         9   200     1     -b----       4.3                 
5-4                                         10   200     1     -b----       2.8                 
19-5                                        11   400     2     -b----       5.7                 
17-4                                        12   200     1     -b----       2.8                 
13-5                                        13   400     2     -b----       1.5                 
20-4                                        14   200     1     -b----       3.0                 
11-4                                        15   200     1     -b----       2.8                 
14-4                                        16   200     1     -b----       2.7                 
23-6                                        17   200     1     -b----       2.7                 
6-2                                         18   200     1     -b----       0.9                 
10-5                                        19   400     1     --p---       0.0                 

--------------000906080401070707060407
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

--------------000906080401070707060407--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 08:09:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08:09:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBpZX-00063T-AB; Thu, 06 Oct 2011 08:09:19 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBpT4-0005Gu-VA
	for Xen-devel@lists.xensource.com; Thu, 06 Oct 2011 08:02:53 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1317913352!36984651!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28971 invoked from network); 6 Oct 2011 15:02:33 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 15:02:33 -0000
Received: by iaqq3 with SMTP id q3so3486541iaq.30
	for <Xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 08:02:34 -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=e9YpvFA02AoSHz2arD5J4bXgjQVOpo1rKWgFedixQPk=;
	b=UtU+sHdv8BJpsu571kN9YKgESvu3UF7BCCzBw8VBt9V1Qqyc18oiOZL1qjUFKYxWAr
	4FrzMkzsS52nQSUQu24r31YwVtnDgDEShDxd/AcVw8x3tGPsrpEiTepPrSbQolXXQzU+
	Qgdgvpu9/g74vHo9/XsGQoYr4rkzQdH5NX0Zo=
MIME-Version: 1.0
Received: by 10.42.176.74 with SMTP id bd10mr4915743icb.27.1317913354354; Thu,
	06 Oct 2011 08:02:34 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Thu, 6 Oct 2011 08:02:34 -0700 (PDT)
In-Reply-To: <CAEAezkVkfj7mFqEgK+crFZ7T1HAkFqL5rOeCe36JBeH+3=YX+A@mail.gmail.com>
References: <CAEAezkVkfj7mFqEgK+crFZ7T1HAkFqL5rOeCe36JBeH+3=YX+A@mail.gmail.com>
Date: Thu, 6 Oct 2011 16:02:34 +0100
X-Google-Sender-Auth: _zksnLiMAIYBAig833b6d_qQfYo
Message-ID: <CAFLBxZapnxsEiDJgxpS6UmJv8M0_jKg__mtrVPGDu-bZtKhSrg@mail.gmail.com>
Subject: Re: [Xen-devel] [Project Idea]:-Want a guidance for the project
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Pratik shinde <pracshi@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, Oct 6, 2011 at 3:38 PM, Pratik shinde <pracshi@gmail.com> wrote:
> Respected Sir,
> =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 I am an unde=
rgraduate student from Pune
> University(India).As my last year project we are thinking of implementing
> the co-scheduling in Xen for concurrent jobs depending on the degree of
> concurrency of the domain.
> =A0 =A0 =A0 Sir, abstract for my project is as:
>
> Abstract---Symmetric multiprocessing (SMP) virtual machine (VMs) allow us=
er
> to take advantage of multiprocessor architecture. Xen current scheduler
> schedules the virtual CPUs (vCPUs) of a virtual machine asynchronously,
> which guarantees the proportion of CPU time corresponding to its weight,
> maximizing the throughput of the system. But the performance may
> deteriorated while executing concurrent applications due to current
> scheduling strategy. To address this problem Yulong Yu et al. proposed
> co-scheduling strategy in which vCPUs of a SMP VM are scheduled
> simultaneously. But this approach causes other problems such as CPU
> fragmentation, priority inversion that degrades I/O performance. Our
> implementation is inspired from the work proposed by Orathai Sukwong et a=
l.
> in Kernel Virtual Machine (KVM) where no two vCPUs are forced to schedule
> simultaneously though they are executing concurrent jobs. Our implementat=
ion
> tries to co-schedule concurrent vCPUs depending on the degree of
> co-scheduling of a domain. If degree of co-scheduling of a VM is less tha=
n
> some threshold value then vCPUs of a VM are scheduled asynchronously and =
if
> it is more then all vCPUs are forced to scheduled simultaneously.
>
> Keywords: Symmetric multiprocessing virtual machine, Xen, Co-scheduling,
> KVM, Balance Scheduling
>
> =A0=A0=A0=A0=A0=A0 Forceful co-scheduling of VM may cause many problems s=
uch as CPU
> fragmentation,priority inversion..This scheduling strategy may keep a
> balance.
>
> Sir can you suggest any improvement to this idea.Should I mail you our
> project synopsis?

Just be aware, that schedulers are very difficult to write and modify.
 To write a gang scheduler such as you describe is a very ambitious
project.

 -George

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 08:16:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08:16:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBpgi-0006cR-GV; Thu, 06 Oct 2011 08:16:44 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBpfx-0006Pt-1v
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 08:15:57 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1317914136!61862372!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25991 invoked from network); 6 Oct 2011 15:15:36 -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;
	6 Oct 2011 15:15:36 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8254357"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 15:15: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; Thu, 6 Oct 2011 16:15:53 +0100
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
	1RBpft-00052M-KT; Thu, 06 Oct 2011 15:15:53 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBpft-0003IH-JV;
	Thu, 06 Oct 2011 16:15:53 +0100
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: <20109.50729.478932.460006@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 16:15:53 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 4 of 6] libxl: undo 23728:548b2826293e
	whitespace cleanup to autogenerated file
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <6056b382a44fd94ead95.1317313231@localhost.localdomain>
References: <patchbomb.1317313227@localhost.localdomain>
	<6056b382a44fd94ead95.1317313231@localhost.localdomain>
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 4 of 6] libxl: undo 23728:548b2826293e whitespace cleanup to autogenerated file"):
> libxl: undo 23728:548b2826293e whitespace cleanup to autogenerated file
> 
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

There seemed no reason to wait with this one.

Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
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 Thu Oct 06 08:17:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08:17:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBphg-0006z9-BL; Thu, 06 Oct 2011 08:17:44 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBpgW-0006ZL-LA
	for Xen-devel@lists.xensource.com; Thu, 06 Oct 2011 08:16:33 -0700
X-Env-Sender: pracshi@gmail.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1317914153!51023688!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24645 invoked from network); 6 Oct 2011 15:15:53 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 15:15:53 -0000
Received: by bkas6 with SMTP id s6so4764348bka.30
	for <Xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 08:16:29 -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=gNjIzf6u9f6l6Rwe+nAUcny2iF7LwoWMYlOoCYNIj6k=;
	b=ghFI7EXqIse77CK9W0yEEbIw1WaGmK1uJBKHdsSCOaZ5NflTaiTp4PmH8YCzvmIAhb
	NEco631YoAafQ5CO1uurgftkqX6e8nCFg7paWqpTqIssiwtNqd2lP7rMCY7SchQgOPe6
	IfSpe8sYRaLgsLUbJBOjipea5gj5AJVlE3tF0=
MIME-Version: 1.0
Received: by 10.204.13.66 with SMTP id b2mr700747bka.104.1317914188773; Thu,
	06 Oct 2011 08:16:28 -0700 (PDT)
Received: by 10.204.32.4 with HTTP; Thu, 6 Oct 2011 08:16:28 -0700 (PDT)
In-Reply-To: <CAFLBxZapnxsEiDJgxpS6UmJv8M0_jKg__mtrVPGDu-bZtKhSrg@mail.gmail.com>
References: <CAEAezkVkfj7mFqEgK+crFZ7T1HAkFqL5rOeCe36JBeH+3=YX+A@mail.gmail.com>
	<CAFLBxZapnxsEiDJgxpS6UmJv8M0_jKg__mtrVPGDu-bZtKhSrg@mail.gmail.com>
Date: Thu, 6 Oct 2011 08:16:28 -0700
Message-ID: <CAEAezkVMuiugnNtSRyOo9ZD2DtpQnEU44BYXz6ZdKAKqa76Mnw@mail.gmail.com>
Subject: Re: [Xen-devel] [Project Idea]:-Want a guidance for the project
From: Pratik shinde <pracshi@gmail.com>
To: Xen-devel@lists.xensource.com
Cc: George.Dunlap@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="===============1371829584=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1371829584==
Content-Type: multipart/alternative; boundary=00151750e2d410fa2c04aea2cf01

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

Respected Sir,
      Sir I just want to ask you few questions:

   1.  If this is too big project then can you suggest any subset of this
   idea which can be implemented in four months by the team of four
   undergraduates?
   2. Sir, if we just implement gang scheduler rather than depending on the
   degree of co-scheduling,whether that would be a good project?
   3. Can I CC you from above if I face some problems in project work?

Thanking you,
Pratik Shinde

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

Respected Sir,<br>=A0=A0=A0=A0=A0 Sir I just want to ask you few questions:=
<br><ol><li>=A0If this is too big project then can you suggest any subset o=
f this idea which can be implemented in four months by the team of four und=
ergraduates?</li>
<li>Sir, if we just implement gang scheduler rather than depending on the d=
egree of co-scheduling,whether that would be a good project?</li><li>Can I =
CC you from above if I face some problems in project work?</li></ol>Thankin=
g you,<br>
<div style=3D"text-align: right;">Pratik Shinde<br></div><br>

--00151750e2d410fa2c04aea2cf01--


--===============1371829584==
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

--===============1371829584==--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 08:18:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08:18:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBpiU-0007Lt-6m; Thu, 06 Oct 2011 08:18:34 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBpgh-0006bl-Jy
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 08:16:44 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317914200!20552504!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15990 invoked from network); 6 Oct 2011 15:16:40 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 15:16:40 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8254377"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 15:16:40 +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, 6 Oct 2011 16:16:39 +0100
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
	1RBpgd-00052c-MN; Thu, 06 Oct 2011 15:16:39 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBpgd-0003IS-LT;
	Thu, 06 Oct 2011 16:16:39 +0100
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: <20109.50775.654060.896041@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 16:16:39 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3 of 6] xl: use libxl_device_disk_to_json to
	pretty print disk configuration
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <6c2b62f0452a73811f70.1317313230@localhost.localdomain>
References: <patchbomb.1317313227@localhost.localdomain>
	<6c2b62f0452a73811f70.1317313230@localhost.localdomain>
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 3 of 6] xl: use libxl_device_disk_to_js> xl: use libxl_device_disk_to_json to pretty print disk configuration
> 
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

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

This one looks good to me and I'll apply it as part of the rest of the
series when the time comes.

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 08:20:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08:20:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBpkY-0007jq-Rt; Thu, 06 Oct 2011 08:20:42 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBpk4-0007Y3-FF
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 08:20:12 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317914409!28184942!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3610 invoked from network); 6 Oct 2011 15:20:09 -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;
	6 Oct 2011 15:20:09 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8254484"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 15:20: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; Thu, 6 Oct 2011 16:20:09 +0100
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
	1RBpk0-000540-Oo; Thu, 06 Oct 2011 15:20:08 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBpk0-0003LP-Nu;
	Thu, 06 Oct 2011 16:20:08 +0100
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: <20109.50984.729987.244550@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 16:20:08 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 5 of 6] libxlu: correctly parse disk
	"backendtype" field
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <50cd0fd187b39a263680.1317313232@localhost.localdomain>
References: <patchbomb.1317313227@localhost.localdomain>
	<50cd0fd187b39a263680.1317313232@localhost.localdomain>
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 5 of 6] libxlu: correctly parse disk "b> libxlu: correctly parse disk "backendtype" field
> 
> Currently it tries to parse the value from the full "backendtype=FOO" string
> but really it needs to parse from the equals.

I have applioed all of this apart from the test case, which is in the
pre-json format, right away, since it's a bugfix.  Please retain the
test case hunk in your series.

Thanks,
Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 08:28:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08: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 1RBpsD-0008Dk-CV; Thu, 06 Oct 2011 08:28:37 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBprV-00080v-CD
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 08:27:53 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1317914863!51825991!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28053 invoked from network); 6 Oct 2011 15:27:43 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 15:27:43 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8254689"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 15:27:50 +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, 6 Oct 2011
	16:27:50 +0100
Subject: Re: [Xen-devel] [PATCH 2 of 6] xl: allow check-xl-disk-parse to run
	against installed xl as well as build dir
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Thu, 6 Oct 2011 16:27:49 +0100
In-Reply-To: <20109.49645.284014.472695@mariner.uk.xensource.com>
References: <patchbomb.1317313227@localhost.localdomain>
	<3fb003a5d5367ccdfb96.1317313229@localhost.localdomain>
	<20109.49645.284014.472695@mariner.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: <1317914869.21903.244.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-10-06 at 15:57 +0100, Ian Jackson wrote:
> Ian Campbell writes ("[Xen-devel] [PATCH 2 of 6] xl: allow check-xl-disk-parse to run against installed xl as well as build dir"):
> > xl: allow check-xl-disk-parse to run against installed xl as well as build dir
> 
> This looks good except:
> 
> > +    XL=/usr/sbin/xl
> 
> XL=xl surely ?

If you prefer, sure.

Ian.



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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 08:32:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08:32:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBpw6-0000DP-O9; Thu, 06 Oct 2011 08:32:38 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBpvX-0008Rv-Ms
	for Xen-devel@lists.xensource.com; Thu, 06 Oct 2011 08:32:04 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317915119!20555443!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3908 invoked from network); 6 Oct 2011 15:32:00 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 15:32:00 -0000
Received: by iaqq3 with SMTP id q3so3531864iaq.30
	for <Xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 08:31:58 -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=7W2TJ7yddBDaqRKwoYyxwv7W/irpAC2MI7POeCN3d3o=;
	b=Fh26ai3QzSFhd3TVfCZPld0JnZHpFxHxj5trlqT9NxGZ6QJnzeoJ628Zk6Pmj8SxgM
	8roB90x/Y7cSsBL1bsPoZCkGm/8x4R8KFeC7O4QNjmW1uTyoIhh4bzbwSEElPHFmOOVo
	rtM17E8wYyNvQLc3pkLj/SpxaQDip98ZkfCAc=
MIME-Version: 1.0
Received: by 10.231.73.139 with SMTP id q11mr1400202ibj.97.1317915118855; Thu,
	06 Oct 2011 08:31:58 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Thu, 6 Oct 2011 08:31:58 -0700 (PDT)
In-Reply-To: <CAEAezkVMuiugnNtSRyOo9ZD2DtpQnEU44BYXz6ZdKAKqa76Mnw@mail.gmail.com>
References: <CAEAezkVkfj7mFqEgK+crFZ7T1HAkFqL5rOeCe36JBeH+3=YX+A@mail.gmail.com>
	<CAFLBxZapnxsEiDJgxpS6UmJv8M0_jKg__mtrVPGDu-bZtKhSrg@mail.gmail.com>
	<CAEAezkVMuiugnNtSRyOo9ZD2DtpQnEU44BYXz6ZdKAKqa76Mnw@mail.gmail.com>
Date: Thu, 6 Oct 2011 16:31:58 +0100
X-Google-Sender-Auth: 2iYGS8OnnfEyU_PYnownLHi6Qwo
Message-ID: <CAFLBxZZ2GZavNLerU+Wh3zwk=zwELqD6tD-8OVJnSQKS3y7mow@mail.gmail.com>
Subject: Re: [Xen-devel] [Project Idea]:-Want a guidance for the project
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Pratik shinde <pracshi@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, Oct 6, 2011 at 4:16 PM, Pratik shinde <pracshi@gmail.com> wrote:
> Respected Sir,
> =A0=A0=A0=A0=A0 Sir I just want to ask you few questions:

"Respected Sir" is a little over-the-top for open-source culture,
which is a bit more laid back.  :-)  A more appropriate thing to say
here would be something like, "Thank you for your time."

> =A0If this is too big project then can you suggest any subset of this ide=
a
> which can be implemented in four months by the team of four undergraduate=
s?

I'm sorry, that's not my job. :-)

> Sir, if we just implement gang scheduler rather than depending on the deg=
ree
> of co-scheduling,whether that would be a good project?

Whether it's possible for a team of four undergraduates depends on the
undergraduates.  I'm just warning you that schedulers are harder than
they look.  They're a minefield of deadlocks and race conditions, and
you'll be on your own in debugging them.

Whether it will meet the requirements is something only your professor
can answer.

> Can I CC you from above if I face some problems in project work?

I'm afraid you can't expect too much help from us, especially in the
difficult questions about algorithms, deadlocks, and race conditions.
So consider this before committing to this project.

If you decide to go ahead, "printk" and a serial console is your friend:
 http://wiki.xen.org/xenwiki/XenSerialConsole

 -George

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 08:49:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08:49:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBqC7-00014V-W0; Thu, 06 Oct 2011 08:49:12 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBqBP-0000sA-5B
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 08:48:27 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1317916102!34234520!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5267 invoked from network); 6 Oct 2011 15:48:23 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-14.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 6 Oct 2011 15:48:23 -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
	p96FmKnr007882
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 6 Oct 2011 15:48:22 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
	p96FmJSQ012041
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 6 Oct 2011 15:48:20 GMT
Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p96FmE5w003921; Thu, 6 Oct 2011 10:48:14 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 06 Oct 2011 08:48:14 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 5170ED97; Thu,  6 Oct 2011 11:48:12 -0400 (EDT)
Date: Thu, 6 Oct 2011 11:48:12 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony Wright <anthony@overnetdata.com>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
Message-ID: <20111006154812.GA23041@phenom.oracle.com>
References: <4E85DB1A.5060606@overnetdata.com>
	<20111001120706.GZ12984@reaktio.net>
	<4E89BEBB.9060708@overnetdata.com>
	<20111003191020.GG15608@phenom.oracle.com>
	<4E8DB5BE.2050004@overnetdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4E8DB5BE.2050004@overnetdata.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.0A090202.4E8DCDC6.002D:SCFMA922111,ss=1,re=-4.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 Thu, Oct 06, 2011 at 03:05:50PM +0100, Anthony Wright wrote:
> On 03/10/2011 20:10, Konrad Rzeszutek Wilk wrote:
> > On Mon, Oct 03, 2011 at 02:55:07PM +0100, Anthony Wright wrote:
> >> On 01/10/2011 13:07, Pasi K=E4rkk=E4inen wrote:
> >>> On Fri, Sep 30, 2011 at 04:07:06PM +0100, Anthony Wright wrote:
> >>>> Stage 1
> >>>> Everything is fine, Dom0 has 2000MB according to xl list, and 'xl =
info'
> >>>> says there is 2405MB free.
> >>>>
> >>> - How much memory did dom0 initially have?=20
> >>> - Did you use mem=3D parameter for dom0 kernel (vmlinuz) ?
> >>>
> >>> See: http://wiki.xen.org/xenwiki/Linux_30_bugs
> >> On thing I forgot to mention, is that if I hit or get close to this
> >> memory issue, one time in three/four on reboot the system hangs at t=
he
> >> final reboot request into the kernel.
> > .. are there any guests still sitting around when that happens? If yo=
u
> > reboot the machine normally do you see the same issue? (and do you ha=
ve
> > guests still running when you do this?).
> If I startup and shutdown Dom0 without starting any DomU's the system
> shuts down nicely every time.
>=20
> If I startup a fair number of DomUs (23), then I have problems on the
> shutdown every so often. As far as I know there are no DomU's running,
> we do carefully shut them all down as part of the shutdown process, (xl
> shutdown, and then an xl destroy if that doesn't work).
>=20
> Surely though if Dom0 dies, shouldn't the whole system be shutdown too?

.. unless there is a bug during the shutdown so that Dom0 gets wedged.

And that is what we are trying to determine. Is there any serial output w=
hen
the dom0 reboots with guests?

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 08:50:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08:50:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBqDB-0001RO-9O; Thu, 06 Oct 2011 08:50:17 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBqCD-00015k-1F
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 08:49:17 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317916136!57013672!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29494 invoked from network); 6 Oct 2011 15:48:58 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 6 Oct 2011 15:48:58 -0000
Received: from rtcsinet21.oracle.com (rtcsinet21.oracle.com [66.248.204.29])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p96FnA83008966
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 6 Oct 2011 15:49:12 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by rtcsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p96Fn80l006681
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 6 Oct 2011 15:49:09 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p96Fn373017241; Thu, 6 Oct 2011 10:49:03 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 06 Oct 2011 08:49:03 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id E1696D97; Thu,  6 Oct 2011 11:48:52 -0400 (EDT)
Date: Thu, 6 Oct 2011 11:48:52 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony Wright <anthony@overnetdata.com>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
Message-ID: <20111006154852.GB23041@phenom.oracle.com>
References: <4E85DB1A.5060606@overnetdata.com>
	<20111001120706.GZ12984@reaktio.net>
	<4E89BC80.4030105@overnetdata.com>
	<20111003190917.GF15608@phenom.oracle.com>
	<4E8DA5BC.8000406@overnetdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4E8DA5BC.8000406@overnetdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: rtcsinet21.oracle.com [66.248.204.29]
X-CT-RefId: str=0001.0A090207.4E8DCDF8.0057,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 Thu, Oct 06, 2011 at 01:57:32PM +0100, Anthony Wright wrote:
> On 03/10/2011 20:09, Konrad Rzeszutek Wilk wrote:
> > On Mon, Oct 03, 2011 at 02:45:36PM +0100, Anthony Wright wrote:
> >> On 01/10/2011 13:07, Pasi K=E4rkk=E4inen wrote:
> >>> On Fri, Sep 30, 2011 at 04:07:06PM +0100, Anthony Wright wrote:
> >>>> I have a machine with 16GB of RAM running 32 bit xen 4.1.1 with Do=
m0
> >>>> running a 3.0.4 linux kernel and 23 paravirtualized DomUs.
> >>>>
> >>> Hey,
> >>>
> >>> Why 32bit Xen? I think all (most?) hypervisor testing happens with =
64bit Xen.
> >>> Note that you can still have 32bit dom0 kernel with 64b hypervisor.
> >> I'm going to investigate 64 bit xen on a 32 bit Dom0 soon, but as to=
 the
> >> 32 xen, I work quite a lot with older hardware and Xen since it does
> >> paravirtualisation, and it's a really good way to re-use old hardwar=
e.
> >>>> As the free ram gets to 2391 MB free the system behaves as if it's=
 got
> >>>> no more ram, and starts grabbing ram from Dom0, before getting eve=
n more
> >>>> confused and failing to start DomUs and eventually crashing the wh=
ole
> >>>> machine. I have attached a tarball with the output of xl dmesg, xl=
 info
> >>>> & xl list at various points.
> >>>>
> >>> - Do you use dom0_mem=3D parameter for Xen?=20
> >>> - Did you disable dom0 ballooning?=20
> >>>
> >>> http://wiki.xen.org/xenwiki/XenBestPractices
> >> I was already using the dom0_mem=3D parameter on the xen hypervisor,=
 but I
> >> disabled dom0 ballooning (enable-dom0-ballooning no), and just for g=
ood
> >> measure I also set (dom0-min-mem 2000). This had no effect, when I
> >> increase the 10-4 memory requirements, on restart the Dom0 memory is
> >> reduced to 1713MB and xl info reports 2391MB free.
> >>>> Stage 1
> >>>> Everything is fine, Dom0 has 2000MB according to xl list, and 'xl =
info'
> >>>> says there is 2405MB free.
> >>> - How much memory did dom0 initially have?=20
> >>> - Did you use mem=3D parameter for dom0 kernel (vmlinuz) ?
> >>>
> >>> See: http://wiki.xen.org/xenwiki/Linux_30_bugs
> >> dom0 starts with 2000MB.
> >> I didn't use mem=3D on the linux kernel - I thought it wasn't necces=
sary.
> > It is if your kernel does not have these two patches:
> >
> >     xen: use maximum reservation to limit amount of usable RAM
> >     xen/e820: if there is no dom0_mem=3D, don't tweak extra_pages.
> >
> > .. oh and you also need to update the hypervisor to include:
> > "
> >     For dom0, this requires at patch to Xen ('x86: use 'dom0_mem' to =
limit
> >     the number of pages for dom0') (c/s 23790)
> > "
> >
> > Grrr.. Let me update the 3.0 bug-list
> I applied the two kernel patches, but get similar results, dom0 still
> gets ballooned down (even more agressively) despite having
> dom0_mem=3D2000, dom0-min-mem=3D2000 and enable-dom0-ballooning set to =
0.
>=20
> I couldn't find the xen patch, could you point me in the right directio=
n.

Google seems to find it.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 08:52:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 08:52:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBqFS-0001ux-K2; Thu, 06 Oct 2011 08:52:38 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBqEx-0001jE-Qc
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 08:52:08 -0700
X-Env-Sender: anthony@overnetdata.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1317916292!57749960!1
X-Originating-IP: [81.137.131.225]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19290 invoked from network); 6 Oct 2011 15:51:32 -0000
Received: from host81-137-131-225.in-addr.btopenworld.com (HELO
	zimbra.overnetdata.com) (81.137.131.225)
	by server-7.tower-21.messagelabs.com with SMTP;
	6 Oct 2011 15:51:32 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by zimbra.overnetdata.com (Postfix) with ESMTP id 067E41616C0;
	Thu,  6 Oct 2011 16:51:44 +0100 (BST)
X-Virus-Scanned: amavisd-new at overnetdata.com
Received: from zimbra.overnetdata.com ([127.0.0.1])
	by localhost (zimbra.overnetdata.com [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id hswCIaMcdwAW; Thu,  6 Oct 2011 16:51:37 +0100 (BST)
Received: from [192.168.1.59] (unknown [192.168.1.59])
	by zimbra.overnetdata.com (Postfix) with ESMTPSA id AAF861616BF;
	Thu,  6 Oct 2011 16:51:36 +0100 (BST)
Message-ID: <4E8DCE83.1@overnetdata.com>
Date: Thu, 06 Oct 2011 16:51:31 +0100
From: Anthony Wright <anthony@overnetdata.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Memory allocation going seriously wonky on 4.1.1
References: <4E85DB1A.5060606@overnetdata.com>
	<20111001120706.GZ12984@reaktio.net>
	<4E89BC80.4030105@overnetdata.com>
	<20111003190917.GF15608@phenom.oracle.com>
	<4E8DA5BC.8000406@overnetdata.com>
	<20111006154852.GB23041@phenom.oracle.com>
In-Reply-To: <20111006154852.GB23041@phenom.oracle.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
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 06/10/2011 16:48, Konrad Rzeszutek Wilk wrote:
> On Thu, Oct 06, 2011 at 01:57:32PM +0100, Anthony Wright wrote:
>> On 03/10/2011 20:09, Konrad Rzeszutek Wilk wrote:
>>> On Mon, Oct 03, 2011 at 02:45:36PM +0100, Anthony Wright wrote:
>>>> On 01/10/2011 13:07, Pasi Kärkkäinen wrote:
>>>>> On Fri, Sep 30, 2011 at 04:07:06PM +0100, Anthony Wright wrote:
>>>>>> I have a machine with 16GB of RAM running 32 bit xen 4.1.1 with Dom0
>>>>>> running a 3.0.4 linux kernel and 23 paravirtualized DomUs.
>>>>>>
>>>>> Hey,
>>>>>
>>>>> Why 32bit Xen? I think all (most?) hypervisor testing happens with 64bit Xen.
>>>>> Note that you can still have 32bit dom0 kernel with 64b hypervisor.
>>>> I'm going to investigate 64 bit xen on a 32 bit Dom0 soon, but as to the
>>>> 32 xen, I work quite a lot with older hardware and Xen since it does
>>>> paravirtualisation, and it's a really good way to re-use old hardware.
>>>>>> As the free ram gets to 2391 MB free the system behaves as if it's got
>>>>>> no more ram, and starts grabbing ram from Dom0, before getting even more
>>>>>> confused and failing to start DomUs and eventually crashing the whole
>>>>>> machine. I have attached a tarball with the output of xl dmesg, xl info
>>>>>> & xl list at various points.
>>>>>>
>>>>> - Do you use dom0_mem= parameter for Xen? 
>>>>> - Did you disable dom0 ballooning? 
>>>>>
>>>>> http://wiki.xen.org/xenwiki/XenBestPractices
>>>> I was already using the dom0_mem= parameter on the xen hypervisor, but I
>>>> disabled dom0 ballooning (enable-dom0-ballooning no), and just for good
>>>> measure I also set (dom0-min-mem 2000). This had no effect, when I
>>>> increase the 10-4 memory requirements, on restart the Dom0 memory is
>>>> reduced to 1713MB and xl info reports 2391MB free.
>>>>>> Stage 1
>>>>>> Everything is fine, Dom0 has 2000MB according to xl list, and 'xl info'
>>>>>> says there is 2405MB free.
>>>>> - How much memory did dom0 initially have? 
>>>>> - Did you use mem= parameter for dom0 kernel (vmlinuz) ?
>>>>>
>>>>> See: http://wiki.xen.org/xenwiki/Linux_30_bugs
>>>> dom0 starts with 2000MB.
>>>> I didn't use mem= on the linux kernel - I thought it wasn't neccessary.
>>> It is if your kernel does not have these two patches:
>>>
>>>     xen: use maximum reservation to limit amount of usable RAM
>>>     xen/e820: if there is no dom0_mem=, don't tweak extra_pages.
>>>
>>> .. oh and you also need to update the hypervisor to include:
>>> "
>>>     For dom0, this requires at patch to Xen ('x86: use 'dom0_mem' to limit
>>>     the number of pages for dom0') (c/s 23790)
>>> "
>>>
>>> Grrr.. Let me update the 3.0 bug-list
>> I applied the two kernel patches, but get similar results, dom0 still
>> gets ballooned down (even more agressively) despite having
>> dom0_mem=2000, dom0-min-mem=2000 and enable-dom0-ballooning set to 0.
>>
>> I couldn't find the xen patch, could you point me in the right direction.
> Google seems to find it.
Ooopps, sorry I completely missed that. I'll try with that patch too.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 09:08:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 09:08:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBqVA-0002Ww-Rl; Thu, 06 Oct 2011 09:08:52 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBqTv-0002KO-2B
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 09:07:42 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1317917214!51033919!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23991 invoked from network); 6 Oct 2011 16:06:55 -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; 6 Oct 2011 16:06:55 -0000
Received: from rtcsinet21.oracle.com (rtcsinet21.oracle.com [66.248.204.29])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p96G7QnQ006614
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 6 Oct 2011 16:07:29 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by rtcsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p96G7P6J003385
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 6 Oct 2011 16:07:26 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
	p96G7JhC022035; Thu, 6 Oct 2011 11:07:20 -0500
Received: from oracle.com (/207.172.105.198)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 06 Oct 2011 09:07:19 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 16852D97; Thu,  6 Oct 2011 12:07:18 -0400 (EDT)
Date: Thu, 6 Oct 2011 12:07:18 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony Wright <anthony@overnetdata.com>
Subject: Re: [Xen-devel] dmidecode doesn't work under xen 4.1.1 on certain
	hardware
Message-ID: <20111006160717.GA31310@phenom.oracle.com>
References: <20110926141322.GD4102@phenom.oracle.com>
	<4E8090D4.2090009@overnetdata.com>
	<20110926193732.GA10007@phenom.oracle.com>
	<4E82E429.2080600@overnetdata.com>
	<20110928132815.GE10270@phenom.oracle.com>
	<4E83462B.9080002@overnetdata.com> <4E835324.30902@citrix.com>
	<4E8AF9BA.3000906@overnetdata.com>
	<20111005151601.GA5223@phenom.oracle.com>
	<4E8DA4D1.2040904@overnetdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8DA4D1.2040904@overnetdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: rtcsinet21.oracle.com [66.248.204.29]
X-CT-RefId: str=0001.0A090202.4E8DD241.00D6,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <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

> > If you feel adventours you could use the oss.oracle.com/git/kwilk/xen.git
> > tree. Mainly the #linux-next or #testing branch. They both have David's new
> > e820 code.
> >
> > The way to get it is:
> >
> > git clone oss.oracle.com/git/kwilk/xen.git
> > cd xen
> > git checkout origin/linux-next
> > make -j90 
> Sorry it panicked :-(
> I've attached two photos of the two flavours of panic & a copy of the
> config.

No serial console? Did it panic when you booted as baremetal?

> It seems to get through the initial kernel boot and hands over to my
> init script, but panics early on in that process, probably at the point
> that udev is loading modules.

Looks completly unrelated to the dmidecode issue. Lets attack one thing
at a time.

Can you move the ioatdma.ko as .bak so it wont load and try again.


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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 09:11:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 09:11:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBqXx-0002vB-78; Thu, 06 Oct 2011 09:11:45 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBqXO-0002jW-G1
	for Xen-devel@lists.xensource.com; Thu, 06 Oct 2011 09:11:12 -0700
X-Env-Sender: pracshi@gmail.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1317917467!16232879!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31955 invoked from network); 6 Oct 2011 16:11:07 -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;
	6 Oct 2011 16:11:07 -0000
Received: by bkas6 with SMTP id s6so4839127bka.30
	for <Xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 09:11:06 -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=iU85UvJIEAPbY8drfb3LFRfP6Kzg0hctiJ3QMzEZbeo=;
	b=tClFJO9HW86Iautkt635GscFCS0dS+SJE0a8LaXICgn7TNIZRimXeGVVfWy8j1c2+A
	q3+rYReGABq4ppne0+uULOGF8r7NKN0+YfyJ5SPBm4BJ2r+1stKMRn+sLuJcLc533kwd
	xgRfK1Q+NPXsM2qK8wmho8163LSH8PLuFl14A=
MIME-Version: 1.0
Received: by 10.204.156.195 with SMTP id y3mr662714bkw.260.1317917466747; Thu,
	06 Oct 2011 09:11:06 -0700 (PDT)
Received: by 10.204.32.4 with HTTP; Thu, 6 Oct 2011 09:11:06 -0700 (PDT)
In-Reply-To: <CAFLBxZZ2GZavNLerU+Wh3zwk=zwELqD6tD-8OVJnSQKS3y7mow@mail.gmail.com>
References: <CAEAezkVkfj7mFqEgK+crFZ7T1HAkFqL5rOeCe36JBeH+3=YX+A@mail.gmail.com>
	<CAFLBxZapnxsEiDJgxpS6UmJv8M0_jKg__mtrVPGDu-bZtKhSrg@mail.gmail.com>
	<CAEAezkVMuiugnNtSRyOo9ZD2DtpQnEU44BYXz6ZdKAKqa76Mnw@mail.gmail.com>
	<CAFLBxZZ2GZavNLerU+Wh3zwk=zwELqD6tD-8OVJnSQKS3y7mow@mail.gmail.com>
Date: Thu, 6 Oct 2011 09:11:06 -0700
Message-ID: <CAEAezkWMhFWrXknxSE5BUmk4dFB026pKVn8UWHdKo4d0tCswow@mail.gmail.com>
Subject: Re: [Xen-devel] [Project Idea]:-Want a guidance for the project
From: Pratik shinde <pracshi@gmail.com>
To: Xen-devel@lists.xensource.com
Cc: George.Dunlap@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="===============0730195953=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0730195953==
Content-Type: multipart/alternative; boundary=0015175cfad672e37b04aea39249

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

Although is a challenging project and would be very interesting to do, if we
decide to go ahead with it,
I'm concerned about just one other thing, i.e. does this have a strong
use-case?
As in, how much would this benefit the users of Xen, if they could have a
co-scheduler?

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

Although is a challenging project and would be very interesting to do, if w=
e decide to go ahead with it, <br>I&#39;m concerned about just one other th=
ing, i.e. does this have a strong use-case?<br>As in, how much would this b=
enefit the users of Xen, if they could have a co-scheduler? <br>



--0015175cfad672e37b04aea39249--


--===============0730195953==
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

--===============0730195953==--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 09:19:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 09: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 1RBqfN-00042K-5z; Thu, 06 Oct 2011 09:19:25 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBqeq-0003q1-OT
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 09:18:53 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1317917929!21097810!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28842 invoked from network); 6 Oct 2011 16:18:49 -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;
	6 Oct 2011 16:18:49 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8256014"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 16:18: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; Thu, 6 Oct 2011 17:18:48 +0100
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
	1RBqem-0005Td-LP; Thu, 06 Oct 2011 16:18:48 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBqem-0003Pp-Kf;
	Thu, 06 Oct 2011 17:18:48 +0100
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: <20109.54504.630059.404826@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 17:18:48 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] xl: wrap help output if command name is too
	long
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <d546d9dfb9d6f81c97e6.1317376793@cosworth.uk.xensource.com>
References: <d546d9dfb9d6f81c97e6.1317376793@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] xl: wrap help output if command name is too long"):
> xl: wrap help output if command name is too long

Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
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 Thu Oct 06 09:25:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 09:25:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBql8-0004Tn-Pt; Thu, 06 Oct 2011 09:25:22 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBqki-0004HV-O9
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 09:24:57 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1317918293!32107601!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13646 invoked from network); 6 Oct 2011 16:24:53 -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;
	6 Oct 2011 16:24:53 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8256206"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 16:24: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, 6 Oct 2011 17:24:52 +0100
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
	1RBqke-0005Vt-KP; Thu, 06 Oct 2011 16:24:52 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBqke-0003Qi-IR;
	Thu, 06 Oct 2011 17:24:52 +0100
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: <20109.54868.559278.81866@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 17:24:52 +0100
To: Christoph Egger <Christoph.Egger@amd.com>,
	Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH 1 of 9] xenbackendd: fix incorrect usage of
	pidfile [and 1 more messages]
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <47005b3da245e2be052b.1317386581@loki>, <4E85BB92.10605@amd.com>
References: <patchbomb.1317386580@loki> <47005b3da245e2be052b.1317386581@loki>
	<4E85BB92.10605@amd.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

Roger Pau Monne writes ("[Xen-devel] [PATCH 1 of 9] xenbackendd: fix incorrect usage of pidfile"):
> xenbackendd: fix incorrect usage of pidfile
> 
> Fix xenbackendd ignoring the pidfile passed through the command line.
> 
> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

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 Thu Oct 06 09:26:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 09:26:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBqmd-0004qt-SJ; Thu, 06 Oct 2011 09:26:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBqmC-0004f1-Lg
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 09:26:29 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317918385!19423142!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1161 invoked from network); 6 Oct 2011 16:26:25 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 16:26:25 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8256237"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 16:26: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; Thu, 6 Oct 2011 17:26:25 +0100
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
	1RBqm8-0005WU-TR; Thu, 06 Oct 2011 16:26:24 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBqm8-0003R0-Sj;
	Thu, 06 Oct 2011 17:26:24 +0100
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: <20109.54960.877923.63231@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 17:26:24 +0100
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH 4 of 9] libxl: create pci backend only when
	there are pci devices
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <156626fef95b36184ad4.1317386584@loki>
References: <patchbomb.1317386580@loki> <156626fef95b36184ad4.1317386584@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 4 of 9] libxl: create pci backend on> libxl: create pci backend only when there are pci devices.

Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
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 Thu Oct 06 09:28:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 09:28:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBqoR-0005Ey-M9; Thu, 06 Oct 2011 09:28:47 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBqnl-00052t-8U
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 09:28:05 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1317918482!19437150!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21450 invoked from network); 6 Oct 2011 16:28:02 -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;
	6 Oct 2011 16:28:02 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8256296"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 16:28:02 +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, 6 Oct 2011 17:28:02 +0100
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
	1RBqnh-0005X0-OQ; Thu, 06 Oct 2011 16:28:01 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBqnh-0003R9-Nf;
	Thu, 06 Oct 2011 17:28:01 +0100
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: <20109.55057.491612.998568@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 17:28:01 +0100
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH 5 of 9] libxl: only use interactive PyGrub mode
	when a console is attached
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <84a27a9f39f29194a734.1317386585@loki>
References: <patchbomb.1317386580@loki> <84a27a9f39f29194a734.1317386585@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 5 of 9] libxl: only use interactive > libxl: only use interactive PyGrub mode when a console is attached

I don't think this is correct.

> Sometimes PyGrub freezed when trying to create a domain without the
> console attached (without "-c"). This patch adds the "-q" option to
> PyGrub when "-c" is not specified at creation time. PyGrub freezed
> trying to set terminal attributes (like reset_prog_mode or
> nocbreak).

I think "-c" shouldn't affect the functionality of the domain, just
whether the console is initially connected.  Perhaps the console will
be connected somewhere else.

OTOH I think it would be fine to have an option (libxl config
parameter, I guess) to make pygrub run noninteractively.

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 09:34:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 09:34:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBquB-0005gt-RY; Thu, 06 Oct 2011 09:34:43 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBqtf-0005Uv-5E
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 09:34:11 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1317918847!21237462!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23107 invoked from network); 6 Oct 2011 16:34:08 -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;
	6 Oct 2011 16:34:08 -0000
X-IronPort-AV: E=Sophos;i="4.68,496,1312156800"; 
   d="scan'208";a="8256383"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 16:34: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; Thu, 6 Oct 2011 17:34:07 +0100
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
	1RBqtb-0005Yv-GD; Thu, 06 Oct 2011 16:34:07 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBqtb-0003Rx-FD;
	Thu, 06 Oct 2011 17:34:07 +0100
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: <20109.55422.412736.135972@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 17:34:06 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 01 of 23] libxl: remove hard tabs from
	non-generated *.[ch]
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <42dee7039d911db8b82e.1317389594@localhost.localdomain>
References: <patchbomb.1317389593@localhost.localdomain>
	<42dee7039d911db8b82e.1317389594@localhost.localdomain>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>,
	Jim Fehlig <jfehlig@novell.com>, xen-devel@lists.xensource.com,
	Mike McClurg <mike.mcclurg@citrix.com>,
	Dave Scott <Dave.Scott@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 ("[Xen-devel] [PATCH 01 of 23] libxl: remove hard tabs from non-generated *.[ch]"):
> libxl: remove hard tabs from non-generated *.[ch]

This didn't apply any more (obviously...)

Did you use some rune involving "expand" perhaps ?  If you were to
give me the rune as well as the effects, I could apply it to whatever
the tree happened to look like.

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 09:39:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 09:39:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBqyn-0006Iz-7s; Thu, 06 Oct 2011 09:39:29 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBqyK-00066o-Ok
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 09:39:02 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1317919137!30553826!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31439 invoked from network); 6 Oct 2011 16:38:57 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 16:38:57 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8256497"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 16:38: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; Thu, 6 Oct 2011 17:38:57 +0100
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
	1RBqyG-0005ai-SW; Thu, 06 Oct 2011 16:38:56 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBqyG-0003SK-Rg;
	Thu, 06 Oct 2011 17:38:56 +0100
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: <20109.55712.847181.699115@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 17:38:56 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 10 of 23] libxl: separate forced and non-forced
	device remove
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <dd195d45be273cf85ef0.1317389603@localhost.localdomain>
References: <patchbomb.1317389593@localhost.localdomain>
	<dd195d45be273cf85ef0.1317389603@localhost.localdomain>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>,
	Jim Fehlig <jfehlig@novell.com>, xen-devel@lists.xensource.com,
	Mike McClurg <mike.mcclurg@citrix.com>,
	Dave Scott <Dave.Scott@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 ("[Xen-devel] [PATCH 10 of 23] libxl: separate forced and non-forced device remove"):
> libxl: separate forced and non-forced device remove.
...
>   * the term "destroy" is normally used in libxl for data-type destructors.

I've always thought this was odd.  Perhaps we should rename all of
those "free" and then we could use "destroy" just for domain
destruction and other kinds of violent activity.

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 09:43:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 09:43:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBr2z-0006rp-Kr; Thu, 06 Oct 2011 09:43:49 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBr2V-0006fo-RP
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 09:43:20 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1317919379!61877596!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23500 invoked from network); 6 Oct 2011 16:42:59 -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;
	6 Oct 2011 16:42:59 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8256581"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 16:43: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, 6 Oct 2011 17:43:16 +0100
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
	1RBr2S-0005c9-8e; Thu, 06 Oct 2011 16:43:16 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBr2S-0003T3-7o;
	Thu, 06 Oct 2011 17:43:16 +0100
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: <20109.55972.82217.848563@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 17:43:16 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 00 of 23] libxl: rationalise libxl_device_*
	APIs
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <patchbomb.1317389593@localhost.localdomain>
References: <patchbomb.1317389593@localhost.localdomain>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>,
	Jim Fehlig <jfehlig@novell.com>, xen-devel@lists.xensource.com,
	Mike McClurg <mike.mcclurg@citrix.com>,
	Dave Scott <Dave.Scott@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 ("[Xen-devel] [PATCH 00 of 23] 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.

This all looks reasonably sensible although I by no means read every
line of changed code.

> One of the early patches adds a big comment describing the API. It
> would be useful if this got a particularly close eye with a view to
> supporting it long term -- especially from actual and potential
> consumers of the API (of who I've CC a few who sprang to mind).

The API comment looks good.

I'll give it a bit longer for people to have comments.

Thanks,
Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 09:48:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 09:48:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBr7H-0007Hw-GG; Thu, 06 Oct 2011 09:48:15 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBr6f-00075f-RV
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 09:47:38 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317919636!45498207!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13997 invoked from network); 6 Oct 2011 16:47:16 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 16:47:16 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8256660"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 16:47: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; Thu, 6 Oct 2011 17:47:34 +0100
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
	1RBr6c-0005dZ-8n; Thu, 06 Oct 2011 16:47:34 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBr6c-0003hW-83;
	Thu, 06 Oct 2011 17:47:34 +0100
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: <20109.56230.213236.661330@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 17:47:34 +0100
To: Zheng Li <dev@zheng.li>
Subject: Re: [Xen-devel] [PATCH 1 of 2] Fix invalid memory access in OCaml mmap
	library (to play nicely with the GC)
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <a980cfb2e4da7ce1780f.1317397199@eta>
References: <patchbomb.1317397198@eta>
	<a980cfb2e4da7ce1780f.1317397199@eta>
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

Zheng Li writes ("[Xen-devel] [PATCH 1 of 2] Fix invalid memory access in OCaml mmap library (to play nicely with the GC)"):
> [...]

Thanks, this looks plausible to me.  I have applied both your patches.

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 10:09:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 10:09:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBrS7-0007yJ-2v; Thu, 06 Oct 2011 10:09:47 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBrQp-0007kx-FD
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 10:08:32 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1317920904!34237967!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22313 invoked from network); 6 Oct 2011 17:08:24 -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;
	6 Oct 2011 17:08:24 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8257045"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 17:08: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, 6 Oct 2011 18:08:23 +0100
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 1RBrQl-0005kd-IY;
	Thu, 06 Oct 2011 17:08:23 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RBrQl-0003zy-DF;
	Thu, 06 Oct 2011 18:08:23 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9194-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 6 Oct 2011 18:08:23 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9194: 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 9194 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9194/

Regressions :-(

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

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-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-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

version targeted for testing:
 xen                  1f95ac601974
baseline version:
 xen                  d7e0e9f37874

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  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:   23165:1f95ac601974
tag:         tip
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 06 12:52:18 2011 +0100
    
    p2m: use correct p2m_type_t in clear_mmio_p2m_entry
    
    clear_mmio_p2m_entry() should mark the gfn as invalid.
    Use proper name instead of numerical value. The currently used value of
    zero means p2m_ram_rw.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    xen-unstable changeset:   23898:3d1664cc9e45
    xen-unstable date:        Thu Oct 06 12:52:18 2011 +0100
    
    
changeset:   23164:d7e0e9f37874
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Mon Oct 03 16:33:29 2011 +0100
    
    build: fix grep invocation in cc-options
    
    Currently the build produces lots of
            Usage: grep [OPTION]... PATTERN [FILE]...
            Try `grep --help' for more information.
    
    This is due to the "grep -- $(2)" in cc-options. It seems that the
    default of reading stdin is disabled when using "--". I don't know if
    this is a bug in grep or how it is supposed to be but we can work
    around it by explicitly passing in "-"
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   23898:3d1664cc9e45
    xen-unstable date:        Fri Sep 30 21:17:47 2011 +0100
    
    
(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 Oct 06 10:40:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 10:40:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBrvt-0000bP-Nf; Thu, 06 Oct 2011 10:40:34 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBrv7-0000Ob-3T
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 10:39:45 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317922792!54465148!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15175 invoked from network); 6 Oct 2011 17:39:53 -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;
	6 Oct 2011 17:39:53 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8257375"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 17:39: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; Thu, 6 Oct 2011 18:39:41 +0100
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
	1RBrv3-0005vR-6q; Thu, 06 Oct 2011 17:39:41 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBrv3-0003lT-60;
	Thu, 06 Oct 2011 18:39:41 +0100
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: <20109.59357.97335.226711@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 18:39:41 +0100
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1317806883-22947-1-git-send-email-roger.pau@entel.upc.edu>
References: <1317801530.21903.163.camel@zakaz.uk.xensource.com>
	<1317806883-22947-1-git-send-email-roger.pau@entel.upc.edu>
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] QEMU: remove blktap when building for NetBSD"):
> NetBSD has no blktap support, so remove the use of the blktap if the OS is NetBSD.

Applied to qemu-xen-unstable.git.  Is there a need for a similar patch
to qemu upstream ?

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 10:41:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 10:41:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBrx0-0000yI-Vj; Thu, 06 Oct 2011 10:41:43 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBrvX-0000UT-Jn
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 10:40:12 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-27.messagelabs.com!1317922780!40786977!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17327 invoked from network); 6 Oct 2011 17:39:42 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 6 Oct 2011 17:39:42 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:40a4:69ff:fe3c:d91d])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id F32939341;
	Thu,  6 Oct 2011 10:40:04 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 8C5F620260;
	Thu,  6 Oct 2011 10:40:01 -0700 (PDT)
Message-ID: <4E8DE7F1.3050108@goop.org>
Date: Thu, 06 Oct 2011 10:40:01 -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: Stephan Diestelhorst <stephan.diestelhorst@amd.com>
Subject: Re: [Xen-devel] [PATCH 00/10] [PATCH RFC V2] Paravirtualized
	ticketlocks
References: <cover.1315878463.git.jeremy.fitzhardinge@citrix.com>
	<201109282008.17722.stephan.diestelhorst@amd.com>
	<CA+55aFwm7ESNfrHhEHrAKcjcPUq8YxtuEkJd5PzAekYo2dMYNw@mail.gmail.com>
	<2707952.s3VYcmPHUN@chlor>
In-Reply-To: <2707952.s3VYcmPHUN@chlor>
X-Enigmail-Version: 1.3.2
Content-Type: multipart/mixed; boundary="------------090103080803000506040300"
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Nick Piggin <npiggin@kernel.dk>, KVM <kvm@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jan Beulich <JBeulich@suse.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	"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

This is a multi-part message in MIME format.
--------------090103080803000506040300
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

On 10/06/2011 07:04 AM, Stephan Diestelhorst wrote:
> On Wednesday 28 September 2011, 14:49:56 Linus Torvalds wrote:
>> Which certainly should *work*, but from a conceptual standpoint, isn't
>> it just *much* nicer to say "we actually know *exactly* what the upper
>> bits were".
> Well, we really do NOT want atomicity here. What we really rather want
> is sequentiality: free the lock, make the update visible, and THEN
> check if someone has gone sleeping on it.
>
> Atomicity only conveniently enforces that the three do not happen in a
> different order (with the store becoming visible after the checking
> load).
>
> This does not have to be atomic, since spurious wakeups are not a
> problem, in particular not with the FIFO-ness of ticket locks.
>
> For that the fence, additional atomic etc. would be IMHO much cleaner
> than the crazy overflow logic.

All things being equal I'd prefer lock-xadd just because its easier to
analyze the concurrency for, crazy overflow tests or no.  But if
add+mfence turned out to be a performance win, then that would obviously
tip the scales.

However, it looks like locked xadd is also has better performance:  on
my Sandybridge laptop (2 cores, 4 threads), the add+mfence is 20% slower
than locked xadd, so that pretty much settles it unless you think
there'd be a dramatic difference on an AMD system.

(On Nehalem it was much less dramatic 2% difference, but still in favour
of locked xadd.)

This is with dumb-as-rocks run it in a loop with "time" benchmark, but
the results are not very subtle.

    J

--------------090103080803000506040300
Content-Type: text/x-csrc;
 name="add-barrier.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="add-barrier.c"

#include <stdio.h>

struct {
	unsigned char flag;
	unsigned char val;
} l;

int main(int argc, char **argv)
{
	int i;

	for (i = 0; i < 100000000; i++) {
		l.val += 2;
		asm volatile("mfence" : : : "memory");
		if (l.flag)
			break;
		asm volatile("" : : : "memory");
	}

	return 0;
}

--------------090103080803000506040300
Content-Type: text/x-csrc;
 name="locked-xadd.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="locked-xadd.c"

#include <stdio.h>

union {
	struct {
		unsigned char val;
		unsigned char flag;
	};
	unsigned short lock;
} l = { 0,0 };

int main(int argc, char **argv)
{
	int i;

	for (i = 0; i < 100000000; i++) {
		unsigned short inc = 2;
		if (l.val >= (0x100 - 2))
			inc += -1 << 8;
		asm volatile("lock; xadd %1,%0" : "+m" (l.lock), "+r" (inc) : );
		if (inc & 0x100)
			break;
		asm volatile("" : : : "memory");
	}

	return 0;
}

--------------090103080803000506040300
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

--------------090103080803000506040300--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 10:47:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 10:47:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBs2f-00024Q-T9; Thu, 06 Oct 2011 10:47:33 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBs2G-0001sl-MU
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 10:47:09 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317923225!28207495!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11099 invoked from network); 6 Oct 2011 17:47:05 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 17:47:05 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8257458"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 17:46: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, 6 Oct 2011 18:46:38 +0100
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
	1RBs1m-0005y7-Hj; Thu, 06 Oct 2011 17:46:38 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBs1m-0003nf-GJ;
	Thu, 06 Oct 2011 18:46:38 +0100
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: <20109.59774.489643.241603@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 18:46:38 +0100
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <4E8D62AB.9000008@ts.fujitsu.com>
References: <CAB31EC1.22461%keir.xen@gmail.com>
	<4E8D62AB.9000008@ts.fujitsu.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Keir Fraser <keir.xen@gmail.com>, "Kay, Allen M" <allen.m.kay@intel.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

Juergen Gross writes ("Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.conf> His build path suggests he is using xen-4.1-testing. cs23049 was applied directly
> after branching xen 4.1.
> In the current staging tree my patch fixes a similar problem in a different
> Makefile.
> 
> Allen, which version are you really using?

To summarise, it sounds like we need to backport 23049 to 4.1 but also
to apply Juergen's patch to libfsimage ?

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 10:51:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 10:51:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBs62-0002To-UQ; Thu, 06 Oct 2011 10:51:03 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBs5e-0002Hf-Na
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 10:50:39 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1317923426!62498642!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19704 invoked from network); 6 Oct 2011 17:50:26 -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;
	6 Oct 2011 17:50:26 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8257498"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 17:50: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, 6 Oct 2011 18:50:35 +0100
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
	1RBs5b-0005zl-7R; Thu, 06 Oct 2011 17:50:35 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBs5b-00040b-6j;
	Thu, 06 Oct 2011 18:50:35 +0100
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: <20109.60011.196805.940718@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 18:50:35 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1 of 2] libxl: add and use parse_mac helper
	function
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <b85fcaaf73a9cfb5e5f4.1317807923@cosworth.uk.xensource.com>
References: <patchbomb.1317807922@cosworth.uk.xensource.com>
	<b85fcaaf73a9cfb5e5f4.1317807923@cosworth.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Roger Pau Monné <roger.pau@entel.upc.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

Ian Campbell writes ("[Xen-devel] [PATCH 1 of 2] libxl: add and use parse_mac helper function"):
> libxl: add and use parse_mac helper function

Acked and applied both of these, thanks.

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 10:54:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 10:54:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBs8x-0002sH-Fr; Thu, 06 Oct 2011 10:54:03 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBs8W-0002fx-H2
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 10:53:36 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1317923613!20237862!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3671 invoked from network); 6 Oct 2011 17:53:33 -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;
	6 Oct 2011 17:53:33 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8257526"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 17:53: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; Thu, 6 Oct 2011 18:53:33 +0100
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
	1RBs8S-00060p-UK; Thu, 06 Oct 2011 17:53:32 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBs8S-000418-Tc;
	Thu, 06 Oct 2011 18:53:32 +0100
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: <20109.60188.905267.410813@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 18:53:32 +0100
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming
	domain 0
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1317824920-639-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1317824920-639-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] xenbus: Fix loopback event channel assuming domain 0"):
> The xenbus event channel established in xenbus_init is intended to be a
> loopback channel, but the remote domain was hardcoded to 0; this will
> cause the channel to be unusable when xenstore is not being run in
> domain 0.

I'm not sure I understand this.

...
>  		/* Next allocate a local port which xenstored can bind to */
>  		alloc_unbound.dom        = DOMID_SELF;
> -		alloc_unbound.remote_dom = 0;
> +		alloc_unbound.remote_dom = DOMID_SELF;

The comment doesn't suggest that this is supposedly a loopback channel
(ie one for use by the xenbus client for signalling to itself,
somehow).

Rather it's supposed to be a channel to xenstore.  So the remote
domain should be the xenstore domain, which should come from the
shared info page.

Have you actually tested this with a separate xenstored domain ?

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 10:54:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 10:54:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBs9o-0003Jh-RK; Thu, 06 Oct 2011 10:54:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBs8b-0002g4-3Y
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 10:53:41 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-11.tower-182.messagelabs.com!1317923616!19447922!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19771 invoked from network); 6 Oct 2011 17:53:37 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-11.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 6 Oct 2011 17:53:37 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:40a4:69ff:fe3c:d91d])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 4147E93A2;
	Thu,  6 Oct 2011 10:53:33 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 60A1820AAE;
	Thu,  6 Oct 2011 10:53:29 -0700 (PDT)
Message-ID: <4E8DEB19.1050509@goop.org>
Date: Thu, 06 Oct 2011 10:53:29 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
In-Reply-To: <4E8CF385.2080804@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: multipart/mixed; boundary="------------060407060807030203080909"
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.
--------------060407060807030203080909
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit

On 10/05/2011 05:17 PM, H. Peter Anvin wrote:
> On 10/05/2011 05:16 PM, Jeremy Fitzhardinge wrote:
>> On 10/04/2011 09:30 AM, H. Peter Anvin wrote:
>>> On 10/04/2011 07:10 AM, Jason Baron wrote:
>>>> 1) The jmp +0, is a 'safe' no-op that I know is going to initially
>>>> boot for all x86. I'm not sure if there is a 5-byte nop that works on
>>>> all x86 variants - but by using jmp +0, we make it much easier to debug
>>>> cases where we may be using broken no-ops.
>>>>
>>> There are *plenty*.  jmp+0 is about as pessimal as you can get.
>> As an aside, do you know if a 2-byte unconditional jmp is any more
>> efficient than 5-byte, aside from just being a smaller instruction and
>> taking less icache?
>>
> I don't know for sure, no.  I probably depends on the CPU.

Looks like jmp2 is about 5% faster than jmp5 on Sandybridge with this
benchmark.

But insignificant difference on Nehalem.

    J

--------------060407060807030203080909
Content-Type: text/x-csrc;
 name="jmp2.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="jmp2.c"

#include <stdio.h>

struct {
	unsigned char flag;
	unsigned char val;
} l;

#define JMP2	asm volatile ("jmp 1f; .byte 0x0f,0x1f,0x00; 1: ");
#define JMPJMP2	JMP2 JMP2
#define JMPJMPJMP2	JMPJMP2 JMPJMP2
#define JMPJMPJMP2	JMPJMP2 JMPJMP2
#define JMPJMPJMPJMP2	JMPJMPJMP2 JMPJMPJMP2
#define JMPJMPJMPJMPJMP2	JMPJMPJMPJMP2 JMPJMPJMPJMP2
#define JMPJMPJMPJMPJMPJMP2	JMPJMPJMPJMPJMP2 JMPJMPJMPJMPJMP2

int main(int argc, char **argv)
{
	int i;

	for (i = 0; i < 100000000; i++) {
		JMPJMPJMPJMPJMPJMP2;
		asm volatile("" : : : "memory");
	}

	return 0;
}

--------------060407060807030203080909
Content-Type: text/x-csrc;
 name="jmp5.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="jmp5.c"

#include <stdio.h>

struct {
	unsigned char flag;
	unsigned char val;
} l;

#define JMP5	asm volatile (".byte 0xe9; .long 0");
#define JMPJMP5	JMP5 JMP5
#define JMPJMPJMP5	JMPJMP5 JMPJMP5
#define JMPJMPJMP5	JMPJMP5 JMPJMP5
#define JMPJMPJMPJMP5	JMPJMPJMP5 JMPJMPJMP5
#define JMPJMPJMPJMPJMP5	JMPJMPJMPJMP5 JMPJMPJMPJMP5
#define JMPJMPJMPJMPJMPJMP5	JMPJMPJMPJMPJMP5 JMPJMPJMPJMPJMP5

int main(int argc, char **argv)
{
	int i;

	for (i = 0; i < 100000000; i++) {
		JMPJMPJMPJMPJMPJMP5;
		asm volatile("" : : : "memory");
	}

	return 0;
}

--------------060407060807030203080909
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

--------------060407060807030203080909--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:10:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:10:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsOf-0003xS-2o; Thu, 06 Oct 2011 11:10:17 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBsN7-0003jh-Ey
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:08:48 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1317924471!51340082!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19334 invoked from network); 6 Oct 2011 18:07:51 -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;
	6 Oct 2011 18:07:51 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8257731"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 18:08: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, 6 Oct 2011 19:08:38 +0100
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
	1RBsN3-000664-Rh; Thu, 06 Oct 2011 18:08:37 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBsN3-000450-Qv;
	Thu, 06 Oct 2011 19:08:37 +0100
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: <20109.61093.823941.976965@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 19:08:37 +0100
To: Andrew Cooper <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] Recommend backporting unstable 23685:5239811f92e1 to
	4.1-testing [and 1 more messages]
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <4E8C733E.9010600@citrix.com>,
	<CAB24882.31D46%keir@xen.org>
References: <4E8C733E.9010600@citrix.com>
	<CAB24882.31D46%keir@xen.org>
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>,
	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

Andrew Cooper writes ("[Xen-devel] Recommend backporting unstable 23685:5239811f92e1 to 4.1-testing"):
> XenServer is suffering the segfault with Xen-4.1.
> 
> The changeset does not cleanly apply because of 4.1-testing
> 23160:5c395e993fe4 affecting the same hunk, but the backport is trivial.

Thanks for bringing this up.  Next time, unless the changeset to be
backported applies correctly without manual fixups, we'd appreciate it
if you would provide an actual backport yourself.  This time I did it
for you.

So, I have done this backport.

Thanks,
Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:11:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11: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 1RBsPq-0004KC-9K; Thu, 06 Oct 2011 11:11:30 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBsNv-0003m7-8E
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:09:34 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-14.tower-174.messagelabs.com!1317924566!34254980!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25427 invoked from network); 6 Oct 2011 18:09:28 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-14.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 6 Oct 2011 18:09:28 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:40a4:69ff:fe3c:d91d])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id A399222A;
	Thu,  6 Oct 2011 11:09:24 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 8367020461;
	Thu,  6 Oct 2011 11:09:20 -0700 (PDT)
Message-ID: <4E8DEED0.1020909@goop.org>
Date: Thu, 06 Oct 2011 11:09:20 -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: Stephan Diestelhorst <stephan.diestelhorst@amd.com>
Subject: Re: [Xen-devel] [PATCH 00/10] [PATCH RFC V2] Paravirtualized
	ticketlocks
References: <cover.1315878463.git.jeremy.fitzhardinge@citrix.com>
	<201109282008.17722.stephan.diestelhorst@amd.com>
	<CA+55aFwm7ESNfrHhEHrAKcjcPUq8YxtuEkJd5PzAekYo2dMYNw@mail.gmail.com>
	<2707952.s3VYcmPHUN@chlor> <4E8DE7F1.3050108@goop.org>
In-Reply-To: <4E8DE7F1.3050108@goop.org>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Nick Piggin <npiggin@kernel.dk>, KVM <kvm@vger.kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jan Beulich <JBeulich@suse.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	"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 10/06/2011 10:40 AM, Jeremy Fitzhardinge wrote:
> However, it looks like locked xadd is also has better performance:  on
> my Sandybridge laptop (2 cores, 4 threads), the add+mfence is 20% slower
> than locked xadd, so that pretty much settles it unless you think
> there'd be a dramatic difference on an AMD system.

Konrad measures add+mfence is about 65% slower on AMD Phenom as well.

    J

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:13:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:13:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsSC-0004hx-86; Thu, 06 Oct 2011 11:13:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBsR6-0004VU-6c
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:12:48 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1317924764!21098119!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6133 invoked from network); 6 Oct 2011 18:12:45 -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;
	6 Oct 2011 18:12:45 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8257819"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 18:12: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, 6 Oct 2011 19:12:45 +0100
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
	1RBsR2-00067Z-MK; Thu, 06 Oct 2011 18:12:44 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBsR2-00045n-Le;
	Thu, 06 Oct 2011 19:12:44 +0100
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: <20109.61340.659119.909316@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 19:12:44 +0100
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH] build: link to specific library version
	(libxs, libxl, xenstore, xenstat)
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1317906692.21903.239.camel@zakaz.uk.xensource.com>
References: <1317901600.21903.230.camel@zakaz.uk.xensource.com>
	<25d25990dd1b0f1e26d8.1317903417@loki>
	<1317906692.21903.239.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
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 Campbell writes ("[Xen-devel] Re: [PATCH] build: link to specific library version (libxs, libxl, xenstore, xenstat)"):
> On Thu, 2011-10-06 at 13:16 +0100, Roger Pau Monne wrote:
> > # HG changeset patch
> > # User Roger Pau Monne <roger.pau@entel.upc.edu>
> > # Date 1317903332 -7200
> > # Node ID 25d25990dd1b0f1e26d8dd56c45b9daf377969b9
> > # Parent  a88029177dbcea6863a9c4e8e0cee81b08ecaed4
> > build: link to specific library version (libxs, libxl, xenstore, xenstat)
> > 
> > To avoid linking to an older version of xen libraries when compiling with LDFLAGS and CFLAGS set, explicitly pass the linker the library file to link to.
> > 
> > Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
> 
> Thanks Roger.
> 
> Acked-by: Ian Campbell <ian.campbell@citrix.com>

Thanks, I have applied this patch because I think it's an improvement.

However, I would point out that building Xen (or indeed any other
upstream project) with LDFLAGS or CFLAGS set in the environment is
almost certainly a mistake.  It's not supported by us.

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:15:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:15:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsUA-00055Y-Pn; Thu, 06 Oct 2011 11:15:58 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBsTZ-0004tl-8I
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:15:21 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317924916!34267162!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18609 invoked from network); 6 Oct 2011 18:15:18 -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; 6 Oct 2011 18:15:18 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:40a4:69ff:fe3c:d91d])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id EDB9E2F9;
	Thu,  6 Oct 2011 11:15:14 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id D48A5203B3;
	Thu,  6 Oct 2011 11:15:07 -0700 (PDT)
Message-ID: <4E8DF02B.7010406@goop.org>
Date: Thu, 06 Oct 2011 11:15:07 -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: Jason Baron <jbaron@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
In-Reply-To: <20111006181055.GA2505@redhat.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/06/2011 11:10 AM, Jason Baron wrote:
> On Thu, Oct 06, 2011 at 10:53:29AM -0700, Jeremy Fitzhardinge wrote:
>> On 10/05/2011 05:17 PM, H. Peter Anvin wrote:
>>> On 10/05/2011 05:16 PM, Jeremy Fitzhardinge wrote:
>>>> On 10/04/2011 09:30 AM, H. Peter Anvin wrote:
>>>>> On 10/04/2011 07:10 AM, Jason Baron wrote:
>>>>>> 1) The jmp +0, is a 'safe' no-op that I know is going to initially
>>>>>> boot for all x86. I'm not sure if there is a 5-byte nop that works on
>>>>>> all x86 variants - but by using jmp +0, we make it much easier to debug
>>>>>> cases where we may be using broken no-ops.
>>>>>>
>>>>> There are *plenty*.  jmp+0 is about as pessimal as you can get.
>>>> As an aside, do you know if a 2-byte unconditional jmp is any more
>>>> efficient than 5-byte, aside from just being a smaller instruction and
>>>> taking less icache?
>>>>
>>> I don't know for sure, no.  I probably depends on the CPU.
>> Looks like jmp2 is about 5% faster than jmp5 on Sandybridge with this
>> benchmark.
>>
>> But insignificant difference on Nehalem.
>>
>>     J
> It would be cool if we could make the total width 2-bytes, when
> possible.  It might be possible by making the initial 'JUMP_LABEL_INITIAL_NOP'
> as a 'jmp' to the 'l_yes' label. And then patching that with a no-op at boot
> time or link time - letting the compiler pick the width. In that way we could
> get the optimal width...

I'll have a look at it later today if I get a moment.  Should be fairly
straightforward.

What about the rest of the series.  Do you think it looks cooked enough
for next mergewindow?

    J

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:19:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:19:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsX6-0005Tu-CS; Thu, 06 Oct 2011 11:19:00 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBsWX-0005I8-0S
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:18:28 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1317925100!34247264!1
X-Originating-IP: [143.182.124.21]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21958 invoked from network); 6 Oct 2011 18:18:21 -0000
Received: from mga03.intel.com (HELO mga03.intel.com) (143.182.124.21)
	by server-11.tower-174.messagelabs.com with SMTP;
	6 Oct 2011 18:18:21 -0000
Received: from azsmga002.ch.intel.com ([10.2.17.35])
	by azsmga101.ch.intel.com with ESMTP; 06 Oct 2011 11:18:19 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,497,1312182000"; d="scan'208,217";a="23938927"
Received: from orsmsx604.amr.corp.intel.com ([10.22.226.87])
	by AZSMGA002.ch.intel.com with ESMTP; 06 Oct 2011 11:18:19 -0700
Received: from orsmsx606.amr.corp.intel.com (10.22.226.128) by
	orsmsx604.amr.corp.intel.com (10.22.226.87) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Thu, 6 Oct 2011 11:18:18 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx606.amr.corp.intel.com ([10.22.226.128]) with mapi;
	Thu, 6 Oct 2011 11:18:18 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
Date: Thu, 6 Oct 2011 11:18:17 -0700
Subject: RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Topic: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Index: AcyD4hjtKurCkMoiRPaTw7pzsSMv2QAcfhvA
Message-ID: <987664A83D2D224EAE907B061CE93D5301EE6A3059@orsmsx505.amr.corp.intel.com>
References: <987664A83D2D224EAE907B061CE93D5301EE62D025@orsmsx505.amr.corp.intel.com>
	<4E8BE0DB.7040503@ts.fujitsu.com>
	<987664A83D2D224EAE907B061CE93D5301EE62D5F4@orsmsx505.amr.corp.intel.com>
	<4E8D313F.8040809@ts.fujitsu.com>
In-Reply-To: <4E8D313F.8040809@ts.fujitsu.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: "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>
Content-Type: multipart/mixed; boundary="===============1691783205=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1691783205==
Content-Language: en-US
Content-Type: multipart/alternative;
	boundary="_000_987664A83D2D224EAE907B061CE93D5301EE6A3059orsmsx505amrc_"

--_000_987664A83D2D224EAE907B061CE93D5301EE6A3059orsmsx505amrc_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Hi Juergen,

This patch fixes the build problem for xen-unstable but do not apply to xen=
-4.1-testing.  Xen-4.1-testing do not have xfs directory and still has the =
same build error.

Allen

From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
Sent: Wednesday, October 05, 2011 9:41 PM
To: Kay, Allen M
Cc: xen-devel@lists.xensource.com; keir@xen.org
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config

Hi Allen,

On 10/05/2011 06:24 PM, Kay, Allen M wrote:

> This is fixed with cs 23049 in xen-unstable:

>

> http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html



I'm using the latest staging tree (cs# 23903) and still seeing this problem=
.

Uuh, the same bug was introduced again.
Could you try the following patch:

diff -r 0b66e6450ffe tools/libfsimage/xfs/Makefile
--- a/tools/libfsimage/xfs/Makefile     Tue Oct 04 14:18:30 2011 +0200
+++ b/tools/libfsimage/xfs/Makefile     Thu Oct 06 06:32:00 2011 +0200
@@ -1,4 +1,4 @@ XEN_ROOT =3D ../../..
-XEN_ROOT =3D ../../..
+XEN_ROOT =3D $(CURDIR)/../../..

 LIB_SRCS-y =3D fsys_xfs.c


Keir, it is easy to catch this problem: create a .config file in all direct=
ories
_above_ $XEN_ROOT containing something like:

$(error usage of relative XEN_ROOT somewhere in $(MAKEFILE_LIST))


Juergen





Allen


From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
Sent: Tuesday, October 04, 2011 9:45 PM
To: Kay, Allen M
Cc: xen-devel@lists.xensource.com<mailto:xen-devel@lists.xensource.com>; ke=
ir@xen.org<mailto:keir@xen.org>
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config

On 10/04/2011 11:44 PM, Kay, Allen M wrote:
Hi Keir,

I'm getting the following build error caused by "-include $(XEN_ROOT)/.conf=
ig" line in Config.mk.  Removing it from Config.mk makes the error go away.=
  The OS I'm using is FC15.  "$(XEN_ROOT)/.config" does not exist.

Allen

-------

make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
make[4]: *** ../../.config: Is a directory.  Stop.
make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
make[3]: *** [subdir-clean-check] Error 2
make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
make[2]: *** [subdirs-clean] Error 2
make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
make[1]: *** [clean] Error 2
make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
make: *** [world] Error 2


This is fixed with cs 23049 in xen-unstable:

http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html


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<mailto:juergen.gross@ts.fujitsu.com>

Domagkstr. 28                           Internet: ts.fujitsu.com

D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.ht=
ml





_______________________________________________

Xen-devel mailing list

Xen-devel@lists.xensource.com<mailto: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<mailto:juergen.gross@ts.fujitsu.com>

Domagkstr. 28                           Internet: ts.fujitsu.com

D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.ht=
ml

--_000_987664A83D2D224EAE907B061CE93D5301EE6A3059orsmsx505amrc_
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 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;}
@font-face
	{font-family:Tahoma;
	panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
	{font-family:"MS Mincho \;";
	panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:"Courier New \;";
	panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	color:black;}
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;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
	{mso-style-priority:99;
	mso-style-link:"Plain Text Char";
	margin:0in;
	margin-bottom:.0001pt;
	font-size:10.5pt;
	font-family:Consolas;
	color:black;}
pre
	{mso-style-priority:99;
	mso-style-link:"HTML Preformatted Char";
	margin:0in;
	margin-bottom:.0001pt;
	font-size:10.0pt;
	font-family:"Courier New";
	color:black;}
tt
	{mso-style-priority:99;
	font-family:"Courier New";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	color:black;}
span.HTMLPreformattedChar
	{mso-style-name:"HTML Preformatted Char";
	mso-style-priority:99;
	mso-style-link:"HTML Preformatted";
	font-family:Consolas;
	color:black;}
span.PlainTextChar
	{mso-style-name:"Plain Text Char";
	mso-style-priority:99;
	mso-style-link:"Plain Text";
	font-family:Consolas;}
span.EmailStyle23
	{mso-style-type:personal;
	font-family:"Calibri","sans-serif";
	color:windowtext;}
span.EmailStyle24
	{mso-style-type:personal;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
span.EmailStyle25
	{mso-style-type:personal-reply;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:10.0pt;}
@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 bgcolor=3Dwhite lang=3DEN-US=
 link=3Dblue vlink=3Dpurple><div class=3DWordSection1><p class=3DMsoNormal>=
<span style=3D'color:#1F497D'>Hi Juergen,<o:p></o:p></span></p><p class=3DM=
soNormal><span style=3D'color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=
=3DMsoNormal><span style=3D'color:#1F497D'>This patch fixes the build probl=
em for xen-unstable but do not apply to xen-4.1-testing.&nbsp; Xen-4.1-test=
ing do not have xfs directory and still has the same build error.<o:p></o:p=
></span></p><p class=3DMsoNormal><span style=3D'color:#1F497D'><o:p>&nbsp;<=
/o:p></span></p><p class=3DMsoNormal><span style=3D'color:#1F497D'>Allen<o:=
p></o:p></span></p><p class=3DMsoNormal><span style=3D'color:#1F497D'><o:p>=
&nbsp;</o:p></span></p><div><div style=3D'border:none;border-top:solid #B5C=
4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=3DMsoNormal><b><span style=3D=
'font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext'>From:=
</span></b><span style=3D'font-size:10.0pt;font-family:"Tahoma","sans-serif=
";color:windowtext'> Juergen Gross [mailto:juergen.gross@ts.fujitsu.com] <b=
r><b>Sent:</b> Wednesday, October 05, 2011 9:41 PM<br><b>To:</b> Kay, Allen=
 M<br><b>Cc:</b> xen-devel@lists.xensource.com; keir@xen.org<br><b>Subject:=
</b> Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config<o:p></o:p>=
</span></p></div></div><p class=3DMsoNormal><o:p>&nbsp;</o:p></p><p class=
=3DMsoNormal>Hi Allen,<br><br>On 10/05/2011 06:24 PM, Kay, Allen M wrote: <=
o:p></o:p></p><p class=3DMsoPlainText><span style=3D'font-family:"MS Mincho=
 ;","serif"'>&gt; </span>This is fixed with cs 23049 in xen-unstable:<o:p><=
/o:p></p><p class=3DMsoPlainText>&gt; <o:p></o:p></p><p class=3DMsoPlainTex=
t>&gt; <a href=3D"http://lists.xensource.com/archives/html/xen-devel/2011-0=
3/msg01251.html">http://lists.xensource.com/archives/html/xen-devel/2011-03=
/msg01251.html</a><o:p></o:p></p><p class=3DMsoPlainText>&nbsp;<o:p></o:p><=
/p><p class=3DMsoPlainText>I&#8217;m using the latest staging tree (cs# 239=
03) and still seeing this problem.<o:p></o:p></p><p class=3DMsoNormal><span=
 style=3D'font-size:12.0pt;font-family:"Times New Roman","serif"'><br>Uuh, =
the same bug was introduced again.<br>Could you try the following patch:<br=
><br>diff -r 0b66e6450ffe tools/libfsimage/xfs/Makefile<br>--- a/tools/libf=
simage/xfs/Makefile&nbsp;&nbsp;&nbsp;&nbsp; Tue Oct 04 14:18:30 2011 +0200<=
br>+++ b/tools/libfsimage/xfs/Makefile&nbsp;&nbsp;&nbsp;&nbsp; Thu Oct 06 0=
6:32:00 2011 +0200<br>@@ -1,4 +1,4 @@ XEN_ROOT =3D ../../..<br>-XEN_ROOT =
=3D ../../..<br>+XEN_ROOT =3D $(CURDIR)/../../..<br>&nbsp;<br>&nbsp;LIB_SRC=
S-y =3D fsys_xfs.c<br>&nbsp;<br><br>Keir, it is easy to catch this problem:=
 create a .config file in all directories<br>_above_ $XEN_ROOT containing s=
omething like:<br><br>$(error usage of relative XEN_ROOT somewhere in $(MAK=
EFILE_LIST))<br><br><br>Juergen<br><br><br><o:p></o:p></span></p><p class=
=3DMsoPlainText>&nbsp;<o:p></o:p></p><p class=3DMsoPlainText>Allen<o:p></o:=
p></p><p class=3DMsoNormal><span style=3D'color:#1F497D'>&nbsp;</span><o:p>=
</o:p></p><p class=3DMsoNormal><span style=3D'color:#1F497D'>&nbsp;</span><=
o:p></o:p></p><div><div style=3D'border:none;border-top:solid windowtext 1.=
0pt;padding:3.0pt 0in 0in 0in;border-color:-moz-use-text-color -moz-use-tex=
t-color'><p class=3DMsoNormal><b><span style=3D'font-size:10.0pt;font-famil=
y:"Tahoma","sans-serif";color:windowtext'>From:</span></b><span style=3D'fo=
nt-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext'> Juergen=
 Gross [<a href=3D"mailto:juergen.gross@ts.fujitsu.com">mailto:juergen.gros=
s@ts.fujitsu.com</a>] <br><b>Sent:</b> Tuesday, October 04, 2011 9:45 PM<br=
><b>To:</b> Kay, Allen M<br><b>Cc:</b> <a href=3D"mailto:xen-devel@lists.xe=
nsource.com">xen-devel@lists.xensource.com</a>; <a href=3D"mailto:keir@xen.=
org">keir@xen.org</a><br><b>Subject:</b> Re: [Xen-devel] build failure caus=
ed by $(XEN_ROOT)/.config</span><o:p></o:p></p></div></div><p class=3DMsoNo=
rmal>&nbsp;<o:p></o:p></p><p class=3DMsoNormal>On 10/04/2011 11:44 PM, Kay,=
 Allen M wrote: <o:p></o:p></p><p class=3DMsoNormal>Hi Keir,<o:p></o:p></p>=
<p class=3DMsoNormal>&nbsp;<o:p></o:p></p><p class=3DMsoNormal>I&#8217;m ge=
tting the following build error caused by &#8220;-include $(XEN_ROOT)/.conf=
ig&#8221; line in Config.mk.&nbsp; Removing it from Config.mk makes the err=
or go away.&nbsp; The OS I&#8217;m using is FC15.&nbsp; &#8220;$(XEN_ROOT)/=
.config&#8221; does not exist.<o:p></o:p></p><p class=3DMsoNormal>&nbsp;<o:=
p></o:p></p><p class=3DMsoNormal>Allen<o:p></o:p></p><p class=3DMsoNormal>&=
nbsp;<o:p></o:p></p><p class=3DMsoNormal>-------<o:p></o:p></p><p class=3DM=
soNormal>&nbsp;<o:p></o:p></p><p class=3DMsoNormal>make[4]: Entering direct=
ory `/home/akay/xen-4.1-testing.hg/tools/check'<o:p></o:p></p><p class=3DMs=
oNormal>make[4]: *** ../../.config: Is a directory.&nbsp; Stop.<o:p></o:p><=
/p><p class=3DMsoNormal>make[4]: Leaving directory `/home/akay/xen-4.1-test=
ing.hg/tools/check'<o:p></o:p></p><p class=3DMsoNormal>make[3]: *** [subdir=
-clean-check] Error 2<o:p></o:p></p><p class=3DMsoNormal>make[3]: Leaving d=
irectory `/home/akay/xen-4.1-testing.hg/tools'<o:p></o:p></p><p class=3DMso=
Normal>make[2]: *** [subdirs-clean] Error 2<o:p></o:p></p><p class=3DMsoNor=
mal>make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'<o:p></=
o:p></p><p class=3DMsoNormal>make[1]: *** [clean] Error 2<o:p></o:p></p><p =
class=3DMsoNormal>make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg=
'<o:p></o:p></p><p class=3DMsoNormal>make: *** [world] Error 2<o:p></o:p></=
p><p class=3DMsoNormal><span style=3D'font-size:12.0pt;font-family:"Times N=
ew Roman","serif"'>&nbsp;</span><o:p></o:p></p><p class=3DMsoNormal><span s=
tyle=3D'font-size:12.0pt;font-family:"Times New Roman","serif"'><br></span>=
<tt><span style=3D'font-size:10.0pt'>This is fixed with cs 23049 in xen-uns=
table:</span></tt><span style=3D'font-size:10.0pt;font-family:"Courier New =
;","serif"'><br><br></span><tt><span style=3D'font-size:10.0pt'><a href=3D"=
http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html">h=
ttp://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html</a>=
</span></tt><span style=3D'font-size:10.0pt;font-family:"Courier New ;","se=
rif"'><br><br><br></span><tt><span style=3D'font-size:10.0pt'>Juergen</span=
></tt><span style=3D'font-size:10.0pt;font-family:"Courier New ;","serif"'>=
<br><br><br></span><o:p></o:p></p><pre>-- <o:p></o:p></pre><pre>Juergen Gro=
ss&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp; Principal Developer Operating Systems<o:p></o:p></p=
re><pre>PDG ES&amp;S SWE OS6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp; Telephone: +49 (0) 89 3222 2967<o:p></o:p></pre><pre>Fujitsu Tec=
hnology Solutions&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp; e-mail: <a href=3D"mailto:juergen.gross@ts.fujitsu.com=
">juergen.gross@ts.fujitsu.com</a><o:p></o:p></pre><pre>Domagkstr. 28&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;=
 Internet: ts.fujitsu.com<o:p></o:p></pre><pre>D-80807 Muenchen&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp; Company details: ts.fujitsu.com/imprint.html<o:p></o:p></pre><pre=
><o:p>&nbsp;</o:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>__________________=
_____________________________<o:p></o:p></pre><pre>Xen-devel mailing list<o=
:p></o:p></pre><pre><a href=3D"mailto:Xen-devel@lists.xensource.com">Xen-de=
vel@lists.xensource.com</a><o:p></o:p></pre><pre><a href=3D"http://lists.xe=
nsource.com/xen-devel">http://lists.xensource.com/xen-devel</a><o:p></o:p><=
/pre><p class=3DMsoNormal><span style=3D'font-size:12.0pt;font-family:"Time=
s New Roman","serif"'><br><br><br><o:p></o:p></span></p><pre>-- <o:p></o:p>=
</pre><pre>Juergen Gross&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Principal Developer Operating=
 Systems<o:p></o:p></pre><pre>PDG ES&amp;S SWE OS6&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Telephone: +49 (0) 89 3222 2967<o:p></o:p>=
</pre><pre>Fujitsu Technology Solutions&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e-mail: <a href=3D"mailto:juerge=
n.gross@ts.fujitsu.com">juergen.gross@ts.fujitsu.com</a><o:p></o:p></pre><p=
re>Domagkstr. 28&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; Internet: ts.fujitsu.com<o:p></o:p></pre><pre>D-8080=
7 Muenchen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Company details: ts.fujitsu.com/imprint.htm=
l<o:p></o:p></pre></div></body></html>=

--_000_987664A83D2D224EAE907B061CE93D5301EE6A3059orsmsx505amrc_--


--===============1691783205==
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

--===============1691783205==--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:21:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:21:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsZK-0005xp-N6; Thu, 06 Oct 2011 11:21:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBsYs-0005lT-7e
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:20:50 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1317925246!34249682!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1752 invoked from network); 6 Oct 2011 18:20:47 -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;
	6 Oct 2011 18:20:47 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8258099"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 18:20: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; Thu, 6 Oct 2011 19:20:46 +0100
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
	1RBsYo-0006AU-6C; Thu, 06 Oct 2011 18:20:46 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBsYo-00046r-3g;
	Thu, 06 Oct 2011 19:20:46 +0100
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: <20109.61822.25684.330705@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 19:20:46 +0100
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH 2 of 2] build: append YAJL_CLFAGS and
	YAJL_LDFLAGS to libxl build
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <dd09f32c882c9e1492b2.1317900426@loki>
References: <patchbomb.1317900424@loki> <dd09f32c882c9e1492b2.1317900426@loki>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: 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

Roger Pau Monne writes ("[Xen-devel] [PATCH 2 of 2] build: append YAJL_CLFAGS and YAJL_LDFLAGS to libxl build"):
> build: append YAJL_CLFAGS and YAJL_LDFLAGS to libxl build

I think this should be done by setting EXTRA_INCLUDES and EXTRA_LIB in
Config.mk or .config, and shouldn't need an extra pair of variables.

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:22:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:22:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsaE-0006KN-PU; Thu, 06 Oct 2011 11:22:14 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBsYt-0005lV-5I
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:20:51 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1317925246!16252497!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22120 invoked from network); 6 Oct 2011 18:20:47 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-7.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 6 Oct 2011 18:20:47 -0000
Received: from tazenda.hos.anvin.org ([IPv6:2001:470:861f::feed:face:f00d])
	(authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p96IDuJC027480
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Thu, 6 Oct 2011 11:13:57 -0700
Message-ID: <4E8DEFDE.4030706@zytor.com>
Date: Thu, 06 Oct 2011 11:13:50 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
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 Baron <jbaron@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
In-Reply-To: <20111006181055.GA2505@redhat.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/06/2011 11:10 AM, Jason Baron wrote:
> 
> It would be cool if we could make the total width 2-bytes, when
> possible.  It might be possible by making the initial 'JUMP_LABEL_INITIAL_NOP'
> as a 'jmp' to the 'l_yes' label. And then patching that with a no-op at boot
> time or link time - letting the compiler pick the width. In that way we could
> get the optimal width...
> 

Yes, that would be a win just based on icache footprint alone.

	-hpa

-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:25:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:25:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsdV-0007O9-GQ; Thu, 06 Oct 2011 11:25:37 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBsbu-0006mC-Bm
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:23:58 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317925414!41178454!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24882 invoked from network); 6 Oct 2011 18:23:34 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 18:23:34 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8258167"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 18:23: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; Thu, 6 Oct 2011 19:23:55 +0100
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
	1RBsbq-0006BX-RN; Thu, 06 Oct 2011 18:23:54 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBsbq-00047X-Qe;
	Thu, 06 Oct 2011 19:23:54 +0100
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: <20109.62010.606305.306668@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 19:23:54 +0100
To: "Kay, Allen M" <allen.m.kay@intel.com>
Subject: RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301EE6A3059@orsmsx505.amr.corp.intel.com>
References: <987664A83D2D224EAE907B061CE93D5301EE62D025@orsmsx505.amr.corp.intel.com>
	<4E8BE0DB.7040503@ts.fujitsu.com>
	<987664A83D2D224EAE907B061CE93D5301EE62D5F4@orsmsx505.amr.corp.intel.com>
	<4E8D313F.8040809@ts.fujitsu.com>
	<987664A83D2D224EAE907B061CE93D5301EE6A3059@orsmsx505.amr.corp.intel.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Juergen Gross <juergen.gross@ts.fujitsu.com>,
	"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

Kay, Allen M writes ("RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config"):
> This patch fixes the build problem for xen-unstable but do not apply to
> xen-4.1-testing.  Xen-4.1-testing do not have xfs directory and still has the
> same build error.

Right, so Juergen's patch is good for unstable.  Juergen, can I have a
signoff, and then I'll apply it ?

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:27:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:27:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsfF-0007lc-Mt; Thu, 06 Oct 2011 11:27:25 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBsep-0007ZL-90
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:27:00 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317925503!39233924!1
X-Originating-IP: [71.74.56.122]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23893 invoked from network); 6 Oct 2011 18:25:03 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.122) by server-14.tower-27.messagelabs.com with SMTP;
	6 Oct 2011 18:25:03 -0000
X-Authority-Analysis: v=1.1 cv=XWD5/VRj2HUJOhsR8cgmvPBlhMACpZXxseY1Kn/ehQI=
	c=1 sm=0 a=msyzJTVhAHgA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=fEjlwWcwjQ_8oBIKvfEA:9
	a=yLXAuhYKm-K98py8-iwA:7 a=PUjeQqilurYA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:43608] helo=[192.168.23.10])
	by hrndva-oedge02.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 44/03-07715-CE2FD8E4; Thu, 06 Oct 2011 18:26:55 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jason Baron <jbaron@redhat.com>
Date: Thu, 06 Oct 2011 14:26:52 -0400
In-Reply-To: <20111006181055.GA2505@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317925615.4729.14.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: Linux, Jan, Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Glauber <jang@linux.vnet.ibm.com>,
	Mailing List <linux-kernel@vger.kernel.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-06 at 14:10 -0400, Jason Baron wrote:

> > Looks like jmp2 is about 5% faster than jmp5 on Sandybridge with this
> > benchmark.
> > 
> > But insignificant difference on Nehalem.
> > 
> >     J
> 
> It would be cool if we could make the total width 2-bytes, when
> possible.  It might be possible by making the initial 'JUMP_LABEL_INITIAL_NOP'
> as a 'jmp' to the 'l_yes' label. And then patching that with a no-op at boot
> time or link time - letting the compiler pick the width. In that way we could
> get the optimal width...

Why not just do it?

jump_label is encapsulated in arch_static_branch() which on x86 looks
like:

static __always_inline bool arch_static_branch(struct jump_label_key *key)
{
	asm goto("1:"
		JUMP_LABEL_INITIAL_NOP
		".pushsection __jump_table,  \"aw\" \n\t"
		_ASM_ALIGN "\n\t"
		_ASM_PTR "1b, %l[l_yes], %c0 \n\t"
		".popsection \n\t"
		: :  "i" (key) : : l_yes);
	return false;
l_yes:
	return true;
}


That jmp to l_yes should easily be a two byte jump.

If not I'm sure it would be easy to catch it before modifying the code.
And then complain real loudly about it.

-- Steve



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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:28:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:28:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsg6-0008AK-Va; Thu, 06 Oct 2011 11:28:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBsfE-0007jN-6z
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:27:25 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1317925639!28705!1
X-Originating-IP: [143.182.124.21]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20464 invoked from network); 6 Oct 2011 18:27:20 -0000
Received: from mga03.intel.com (HELO mga03.intel.com) (143.182.124.21)
	by server-8.tower-216.messagelabs.com with SMTP;
	6 Oct 2011 18:27:20 -0000
Received: from azsmga001.ch.intel.com ([10.2.17.19])
	by azsmga101.ch.intel.com with ESMTP; 06 Oct 2011 11:27:18 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,497,1312182000"; d="scan'208,217";a="59548037"
Received: from orsmsx602.amr.corp.intel.com ([10.22.226.211])
	by azsmga001.ch.intel.com with ESMTP; 06 Oct 2011 11:27:18 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx602.amr.corp.intel.com ([10.22.226.211]) with mapi;
	Thu, 6 Oct 2011 11:27:17 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
Date: Thu, 6 Oct 2011 11:27:17 -0700
Subject: RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Topic: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Index: AcyD4hjtKurCkMoiRPaTw7pzsSMv2QAcfhvAAABZOpA=
Message-ID: <987664A83D2D224EAE907B061CE93D5301EE6A3084@orsmsx505.amr.corp.intel.com>
References: <987664A83D2D224EAE907B061CE93D5301EE62D025@orsmsx505.amr.corp.intel.com>
	<4E8BE0DB.7040503@ts.fujitsu.com>
	<987664A83D2D224EAE907B061CE93D5301EE62D5F4@orsmsx505.amr.corp.intel.com>
	<4E8D313F.8040809@ts.fujitsu.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: "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>
Content-Type: multipart/mixed; boundary="===============1095611002=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1095611002==
Content-Language: en-US
Content-Type: multipart/alternative;
	boundary="_000_987664A83D2D224EAE907B061CE93D5301EE6A3084orsmsx505amrc_"

--_000_987664A83D2D224EAE907B061CE93D5301EE6A3084orsmsx505amrc_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Here is the exact build error I get in xen-4.1-testing:

make[4]: Entering directory `/tmp/xen-4.1-testing.hg/tools/check'
make[4]: *** ../../.config: Is a directory.  Stop.
make[4]: Leaving directory `/tmp/xen-4.1-testing.hg/tools/check'
make[3]: *** [subdir-clean-check] Error 2
make[3]: Leaving directory `/tmp/xen-4.1-testing.hg/tools'
make[2]: *** [subdirs-clean] Error 2
make[2]: Leaving directory `/tmp/xen-4.1-testing.hg/tools'
make[1]: *** [clean] Error 2
make[1]: Leaving directory `/tmp/xen-4.1-testing.hg'
make: *** [world] Error 2


From: Kay, Allen M
Sent: Thursday, October 06, 2011 11:18 AM
To: 'Juergen Gross'
Cc: xen-devel@lists.xensource.com; keir@xen.org
Subject: RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config

Hi Juergen,

This patch fixes the build problem for xen-unstable but do not apply to xen=
-4.1-testing.  Xen-4.1-testing do not have xfs directory and still has the =
same build error.

Allen

From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
Sent: Wednesday, October 05, 2011 9:41 PM
To: Kay, Allen M
Cc: xen-devel@lists.xensource.com; keir@xen.org
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config

Hi Allen,

On 10/05/2011 06:24 PM, Kay, Allen M wrote:

> This is fixed with cs 23049 in xen-unstable:

>

> http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html



I'm using the latest staging tree (cs# 23903) and still seeing this problem=
.

Uuh, the same bug was introduced again.
Could you try the following patch:

diff -r 0b66e6450ffe tools/libfsimage/xfs/Makefile
--- a/tools/libfsimage/xfs/Makefile     Tue Oct 04 14:18:30 2011 +0200
+++ b/tools/libfsimage/xfs/Makefile     Thu Oct 06 06:32:00 2011 +0200
@@ -1,4 +1,4 @@ XEN_ROOT =3D ../../..
-XEN_ROOT =3D ../../..
+XEN_ROOT =3D $(CURDIR)/../../..

 LIB_SRCS-y =3D fsys_xfs.c


Keir, it is easy to catch this problem: create a .config file in all direct=
ories
_above_ $XEN_ROOT containing something like:

$(error usage of relative XEN_ROOT somewhere in $(MAKEFILE_LIST))


Juergen




Allen


From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
Sent: Tuesday, October 04, 2011 9:45 PM
To: Kay, Allen M
Cc: xen-devel@lists.xensource.com<mailto:xen-devel@lists.xensource.com>; ke=
ir@xen.org<mailto:keir@xen.org>
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config

On 10/04/2011 11:44 PM, Kay, Allen M wrote:
Hi Keir,

I'm getting the following build error caused by "-include $(XEN_ROOT)/.conf=
ig" line in Config.mk.  Removing it from Config.mk makes the error go away.=
  The OS I'm using is FC15.  "$(XEN_ROOT)/.config" does not exist.

Allen

-------

make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
make[4]: *** ../../.config: Is a directory.  Stop.
make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
make[3]: *** [subdir-clean-check] Error 2
make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
make[2]: *** [subdirs-clean] Error 2
make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
make[1]: *** [clean] Error 2
make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
make: *** [world] Error 2


This is fixed with cs 23049 in xen-unstable:

http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html


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<mailto:juergen.gross@ts.fujitsu.com>

Domagkstr. 28                           Internet: ts.fujitsu.com

D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.ht=
ml





_______________________________________________

Xen-devel mailing list

Xen-devel@lists.xensource.com<mailto: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<mailto:juergen.gross@ts.fujitsu.com>

Domagkstr. 28                           Internet: ts.fujitsu.com

D-80807 Muenchen                 Company details: ts.fujitsu.com/imprint.ht=
ml

--_000_987664A83D2D224EAE907B061CE93D5301EE6A3084orsmsx505amrc_
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 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;}
@font-face
	{font-family:Tahoma;
	panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
	{font-family:"MS Mincho \;";
	panose-1:0 0 0 0 0 0 0 0 0 0;}
@font-face
	{font-family:"Courier New \;";
	panose-1:0 0 0 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	color:black;}
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;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
	{mso-style-priority:99;
	mso-style-link:"Plain Text Char";
	margin:0in;
	margin-bottom:.0001pt;
	font-size:10.5pt;
	font-family:Consolas;
	color:black;}
pre
	{mso-style-priority:99;
	mso-style-link:"HTML Preformatted Char";
	margin:0in;
	margin-bottom:.0001pt;
	font-size:10.0pt;
	font-family:"Courier New";
	color:black;}
tt
	{mso-style-priority:99;
	font-family:"Courier New";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
	{mso-style-priority:34;
	margin-top:0in;
	margin-right:0in;
	margin-bottom:0in;
	margin-left:.5in;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	color:black;}
span.HTMLPreformattedChar
	{mso-style-name:"HTML Preformatted Char";
	mso-style-priority:99;
	mso-style-link:"HTML Preformatted";
	font-family:Consolas;
	color:black;}
span.PlainTextChar
	{mso-style-name:"Plain Text Char";
	mso-style-priority:99;
	mso-style-link:"Plain Text";
	font-family:Consolas;}
span.EmailStyle23
	{mso-style-type:personal;
	font-family:"Calibri","sans-serif";
	color:windowtext;}
span.EmailStyle24
	{mso-style-type:personal;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
span.EmailStyle25
	{mso-style-type:personal;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
span.EmailStyle26
	{mso-style-type:personal-reply;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:10.0pt;}
@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 bgcolor=3Dwhite lang=3DEN-US=
 link=3Dblue vlink=3Dpurple><div class=3DWordSection1><p class=3DMsoNormal>=
<span style=3D'color:#1F497D'>Here is the exact build error I get in xen-4.=
1-testing:<o:p></o:p></span></p><p class=3DMsoNormal><span style=3D'color:#=
1F497D'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal><span style=3D'col=
or:#1F497D'>make[4]: Entering directory `/tmp/xen-4.1-testing.hg/tools/chec=
k'<o:p></o:p></span></p><p class=3DMsoNormal><span style=3D'color:#1F497D'>=
make[4]: *** ../../.config: Is a directory.&nbsp; Stop.<o:p></o:p></span></=
p><p class=3DMsoNormal><span style=3D'color:#1F497D'>make[4]: Leaving direc=
tory `/tmp/xen-4.1-testing.hg/tools/check'<o:p></o:p></span></p><p class=3D=
MsoNormal><span style=3D'color:#1F497D'>make[3]: *** [subdir-clean-check] E=
rror 2<o:p></o:p></span></p><p class=3DMsoNormal><span style=3D'color:#1F49=
7D'>make[3]: Leaving directory `/tmp/xen-4.1-testing.hg/tools'<o:p></o:p></=
span></p><p class=3DMsoNormal><span style=3D'color:#1F497D'>make[2]: *** [s=
ubdirs-clean] Error 2<o:p></o:p></span></p><p class=3DMsoNormal><span style=
=3D'color:#1F497D'>make[2]: Leaving directory `/tmp/xen-4.1-testing.hg/tool=
s'<o:p></o:p></span></p><p class=3DMsoNormal><span style=3D'color:#1F497D'>=
make[1]: *** [clean] Error 2<o:p></o:p></span></p><p class=3DMsoNormal><spa=
n style=3D'color:#1F497D'>make[1]: Leaving directory `/tmp/xen-4.1-testing.=
hg'<o:p></o:p></span></p><p class=3DMsoNormal><span style=3D'color:#1F497D'=
>make: *** [world] Error 2<o:p></o:p></span></p><p class=3DMsoNormal><span =
style=3D'color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal><s=
pan style=3D'color:#1F497D'><o:p>&nbsp;</o:p></span></p><div><div style=3D'=
border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p cl=
ass=3DMsoNormal><b><span style=3D'font-size:10.0pt;font-family:"Tahoma","sa=
ns-serif";color:windowtext'>From:</span></b><span style=3D'font-size:10.0pt=
;font-family:"Tahoma","sans-serif";color:windowtext'> Kay, Allen M <br><b>S=
ent:</b> Thursday, October 06, 2011 11:18 AM<br><b>To:</b> 'Juergen Gross'<=
br><b>Cc:</b> xen-devel@lists.xensource.com; keir@xen.org<br><b>Subject:</b=
> RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config<o:p></o:p></s=
pan></p></div></div><p class=3DMsoNormal><o:p>&nbsp;</o:p></p><p class=3DMs=
oNormal><span style=3D'color:#1F497D'>Hi Juergen,<o:p></o:p></span></p><p c=
lass=3DMsoNormal><span style=3D'color:#1F497D'><o:p>&nbsp;</o:p></span></p>=
<p class=3DMsoNormal><span style=3D'color:#1F497D'>This patch fixes the bui=
ld problem for xen-unstable but do not apply to xen-4.1-testing.&nbsp; Xen-=
4.1-testing do not have xfs directory and still has the same build error.<o=
:p></o:p></span></p><p class=3DMsoNormal><span style=3D'color:#1F497D'><o:p=
>&nbsp;</o:p></span></p><p class=3DMsoNormal><span style=3D'color:#1F497D'>=
Allen<o:p></o:p></span></p><p class=3DMsoNormal><span style=3D'color:#1F497=
D'><o:p>&nbsp;</o:p></span></p><div><div style=3D'border:none;border-top:so=
lid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'><p class=3DMsoNormal><b><span =
style=3D'font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtex=
t'>From:</span></b><span style=3D'font-size:10.0pt;font-family:"Tahoma","sa=
ns-serif";color:windowtext'> Juergen Gross [mailto:juergen.gross@ts.fujitsu=
.com] <br><b>Sent:</b> Wednesday, October 05, 2011 9:41 PM<br><b>To:</b> Ka=
y, Allen M<br><b>Cc:</b> xen-devel@lists.xensource.com; keir@xen.org<br><b>=
Subject:</b> Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config<o:=
p></o:p></span></p></div></div><p class=3DMsoNormal><o:p>&nbsp;</o:p></p><p=
 class=3DMsoNormal>Hi Allen,<br><br>On 10/05/2011 06:24 PM, Kay, Allen M wr=
ote: <o:p></o:p></p><p class=3DMsoPlainText><span style=3D'font-family:"MS =
Mincho ;","serif"'>&gt; </span>This is fixed with cs 23049 in xen-unstable:=
<o:p></o:p></p><p class=3DMsoPlainText>&gt; <o:p></o:p></p><p class=3DMsoPl=
ainText>&gt; <a href=3D"http://lists.xensource.com/archives/html/xen-devel/=
2011-03/msg01251.html">http://lists.xensource.com/archives/html/xen-devel/2=
011-03/msg01251.html</a><o:p></o:p></p><p class=3DMsoPlainText>&nbsp;<o:p><=
/o:p></p><p class=3DMsoPlainText>I&#8217;m using the latest staging tree (c=
s# 23903) and still seeing this problem.<o:p></o:p></p><p class=3DMsoNormal=
 style=3D'margin-bottom:12.0pt'><span style=3D'font-size:12.0pt;font-family=
:"Times New Roman","serif"'><br>Uuh, the same bug was introduced again.<br>=
Could you try the following patch:<br><br>diff -r 0b66e6450ffe tools/libfsi=
mage/xfs/Makefile<br>--- a/tools/libfsimage/xfs/Makefile&nbsp;&nbsp;&nbsp;&=
nbsp; Tue Oct 04 14:18:30 2011 +0200<br>+++ b/tools/libfsimage/xfs/Makefile=
&nbsp;&nbsp;&nbsp;&nbsp; Thu Oct 06 06:32:00 2011 +0200<br>@@ -1,4 +1,4 @@ =
XEN_ROOT =3D ../../..<br>-XEN_ROOT =3D ../../..<br>+XEN_ROOT =3D $(CURDIR)/=
../../..<br>&nbsp;<br>&nbsp;LIB_SRCS-y =3D fsys_xfs.c<br>&nbsp;<br><br>Keir=
, it is easy to catch this problem: create a .config file in all directorie=
s<br>_above_ $XEN_ROOT containing something like:<br><br>$(error usage of r=
elative XEN_ROOT somewhere in $(MAKEFILE_LIST))<br><br><br>Juergen<br><br><=
o:p></o:p></span></p><p class=3DMsoPlainText>&nbsp;<o:p></o:p></p><p class=
=3DMsoPlainText>Allen<o:p></o:p></p><p class=3DMsoNormal><span style=3D'col=
or:#1F497D'>&nbsp;</span><o:p></o:p></p><p class=3DMsoNormal><span style=3D=
'color:#1F497D'>&nbsp;</span><o:p></o:p></p><div><div style=3D'border:none;=
border-top:solid windowtext 1.0pt;padding:3.0pt 0in 0in 0in;border-color:-m=
oz-use-text-color -moz-use-text-color'><p class=3DMsoNormal><b><span style=
=3D'font-size:10.0pt;font-family:"Tahoma","sans-serif";color:windowtext'>Fr=
om:</span></b><span style=3D'font-size:10.0pt;font-family:"Tahoma","sans-se=
rif";color:windowtext'> Juergen Gross [<a href=3D"mailto:juergen.gross@ts.f=
ujitsu.com">mailto:juergen.gross@ts.fujitsu.com</a>] <br><b>Sent:</b> Tuesd=
ay, October 04, 2011 9:45 PM<br><b>To:</b> Kay, Allen M<br><b>Cc:</b> <a hr=
ef=3D"mailto:xen-devel@lists.xensource.com">xen-devel@lists.xensource.com</=
a>; <a href=3D"mailto:keir@xen.org">keir@xen.org</a><br><b>Subject:</b> Re:=
 [Xen-devel] build failure caused by $(XEN_ROOT)/.config</span><o:p></o:p><=
/p></div></div><p class=3DMsoNormal>&nbsp;<o:p></o:p></p><p class=3DMsoNorm=
al>On 10/04/2011 11:44 PM, Kay, Allen M wrote: <o:p></o:p></p><p class=3DMs=
oNormal>Hi Keir,<o:p></o:p></p><p class=3DMsoNormal>&nbsp;<o:p></o:p></p><p=
 class=3DMsoNormal>I&#8217;m getting the following build error caused by &#=
8220;-include $(XEN_ROOT)/.config&#8221; line in Config.mk.&nbsp; Removing =
it from Config.mk makes the error go away.&nbsp; The OS I&#8217;m using is =
FC15.&nbsp; &#8220;$(XEN_ROOT)/.config&#8221; does not exist.<o:p></o:p></p=
><p class=3DMsoNormal>&nbsp;<o:p></o:p></p><p class=3DMsoNormal>Allen<o:p><=
/o:p></p><p class=3DMsoNormal>&nbsp;<o:p></o:p></p><p class=3DMsoNormal>---=
----<o:p></o:p></p><p class=3DMsoNormal>&nbsp;<o:p></o:p></p><p class=3DMso=
Normal>make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/che=
ck'<o:p></o:p></p><p class=3DMsoNormal>make[4]: *** ../../.config: Is a dir=
ectory.&nbsp; Stop.<o:p></o:p></p><p class=3DMsoNormal>make[4]: Leaving dir=
ectory `/home/akay/xen-4.1-testing.hg/tools/check'<o:p></o:p></p><p class=
=3DMsoNormal>make[3]: *** [subdir-clean-check] Error 2<o:p></o:p></p><p cla=
ss=3DMsoNormal>make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/to=
ols'<o:p></o:p></p><p class=3DMsoNormal>make[2]: *** [subdirs-clean] Error =
2<o:p></o:p></p><p class=3DMsoNormal>make[2]: Leaving directory `/home/akay=
/xen-4.1-testing.hg/tools'<o:p></o:p></p><p class=3DMsoNormal>make[1]: *** =
[clean] Error 2<o:p></o:p></p><p class=3DMsoNormal>make[1]: Leaving directo=
ry `/home/akay/xen-4.1-testing.hg'<o:p></o:p></p><p class=3DMsoNormal>make:=
 *** [world] Error 2<o:p></o:p></p><p class=3DMsoNormal><span style=3D'font=
-size:12.0pt;font-family:"Times New Roman","serif"'>&nbsp;</span><o:p></o:p=
></p><p class=3DMsoNormal style=3D'margin-bottom:12.0pt'><span style=3D'fon=
t-size:12.0pt;font-family:"Times New Roman","serif"'><br></span><tt><span s=
tyle=3D'font-size:10.0pt'>This is fixed with cs 23049 in xen-unstable:</spa=
n></tt><span style=3D'font-size:10.0pt;font-family:"Courier New ;","serif"'=
><br><br></span><tt><span style=3D'font-size:10.0pt'><a href=3D"http://list=
s.xensource.com/archives/html/xen-devel/2011-03/msg01251.html">http://lists=
.xensource.com/archives/html/xen-devel/2011-03/msg01251.html</a></span></tt=
><span style=3D'font-size:10.0pt;font-family:"Courier New ;","serif"'><br><=
br><br></span><tt><span style=3D'font-size:10.0pt'>Juergen</span></tt><span=
 style=3D'font-size:10.0pt;font-family:"Courier New ;","serif"'><br><br></s=
pan><o:p></o:p></p><pre>-- <o:p></o:p></pre><pre>Juergen Gross&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp; Principal Developer Operating Systems<o:p></o:p></pre><pre>PDG ES&=
amp;S SWE OS6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tele=
phone: +49 (0) 89 3222 2967<o:p></o:p></pre><pre>Fujitsu Technology Solutio=
ns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp; e-mail: <a href=3D"mailto:juergen.gross@ts.fujitsu.com">juergen.gross=
@ts.fujitsu.com</a><o:p></o:p></pre><pre>Domagkstr. 28&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; Internet: ts.f=
ujitsu.com<o:p></o:p></pre><pre>D-80807 Muenchen&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Compa=
ny details: ts.fujitsu.com/imprint.html<o:p></o:p></pre><pre><o:p>&nbsp;</o=
:p></pre><pre><o:p>&nbsp;</o:p></pre><pre>_________________________________=
______________<o:p></o:p></pre><pre>Xen-devel mailing list<o:p></o:p></pre>=
<pre><a href=3D"mailto:Xen-devel@lists.xensource.com">Xen-devel@lists.xenso=
urce.com</a><o:p></o:p></pre><pre><a href=3D"http://lists.xensource.com/xen=
-devel">http://lists.xensource.com/xen-devel</a><o:p></o:p></pre><p class=
=3DMsoNormal style=3D'margin-bottom:12.0pt'><span style=3D'font-size:12.0pt=
;font-family:"Times New Roman","serif"'><br><br><o:p></o:p></span></p><pre>=
-- <o:p></o:p></pre><pre>Juergen Gross&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Principal Devel=
oper Operating Systems<o:p></o:p></pre><pre>PDG ES&amp;S SWE OS6&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Telephone: +49 (0) 89 3222 2=
967<o:p></o:p></pre><pre>Fujitsu Technology Solutions&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e-mail: <a href=3D=
"mailto:juergen.gross@ts.fujitsu.com">juergen.gross@ts.fujitsu.com</a><o:p>=
</o:p></pre><pre>Domagkstr. 28&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; Internet: ts.fujitsu.com<o:p></o:p></p=
re><pre>D-80807 Muenchen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Company details: ts.fujitsu.c=
om/imprint.html<o:p></o:p></pre></div></body></html>=

--_000_987664A83D2D224EAE907B061CE93D5301EE6A3084orsmsx505amrc_--


--===============1095611002==
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

--===============1095611002==--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:29:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:29:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBshF-0000Ap-Gk; Thu, 06 Oct 2011 11:29:29 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBsfO-0007nW-OS
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:27:35 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1317925651!27913350!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24680 invoked from network); 6 Oct 2011 18:27:31 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 18:27:31 -0000
Received: by wyh13 with SMTP id 13so4169910wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 11:27:31 -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=q8xWfhdHfMXtSxmnKPaiM+R5uTtkuPSywly+BmQ9Pmc=;
	b=lGWOjMzUcVmwkLlnJ1PQ0FKBT2vg0kKoyHow5Hduj1JiSO9FYxHFHqK9XLSZ7ijdQN
	kLqawkgMtA80NMjGxn+TUIbXM8sycJqd0Bczfm5f9iWlh5j2wD9zMixr+VVRFlSejsWB
	YNnGHa06Xbvc8ec6X2KT7UN9IS5IyRaGMdlsI=
Received: by 10.216.132.136 with SMTP id o8mr1500724wei.84.1317925646839;
	Thu, 06 Oct 2011 11:27:26 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id s30sm11621861wbm.12.2011.10.06.11.27.24
	(version=SSLv3 cipher=OTHER); Thu, 06 Oct 2011 11:27:25 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 06 Oct 2011 19:27:21 +0100
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
From: Keir Fraser <keir.xen@gmail.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Juergen Gross <juergen.gross@ts.fujitsu.com>
Message-ID: <CAB3B199.224C2%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Index: AcyEVZX3WQLadxj4ckS0tGtDdyZ5dg==
In-Reply-To: <20109.59774.489643.241603@mariner.uk.xensource.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>, "Kay,
	Allen M" <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 06/10/2011 18:46, "Ian Jackson" <Ian.Jackson@eu.citrix.com> wrote:

> Juergen Gross writes ("Re: [Xen-devel] build failure caused by
> $(XEN_ROOT)/.conf> His build path suggests he is using xen-4.1-testing.
> cs23049 was applied directly
>> after branching xen 4.1.
>> In the current staging tree my patch fixes a similar problem in a different
>> Makefile.
>> 
>> Allen, which version are you really using?
> 
> To summarise, it sounds like we need to backport 23049 to 4.1 but also
> to apply Juergen's patch to libfsimage ?

Sounds about right. If you want to do an equivalent patch to 23049 in 4.1
feel free to go ahead. I'll hold back -rc3 in that case.

 -- Keir

> Ian.



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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:30:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:30:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsiC-0000YL-VJ; Thu, 06 Oct 2011 11:30:28 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBshc-0000Fa-DY
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:29:53 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1317925759!58086029!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20830 invoked from network); 6 Oct 2011 18:29:21 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 6 Oct 2011 18:29:21 -0000
Received: from tazenda.hos.anvin.org ([IPv6:2001:470:861f::feed:face:f00d])
	(authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p96ITUlt028019
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Thu, 6 Oct 2011 11:29:31 -0700
Message-ID: <4E8DF385.3070009@zytor.com>
Date: Thu, 06 Oct 2011 11:29:25 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Steven Rostedt <rostedt@goodmis.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
In-Reply-To: <1317925615.4729.14.camel@gandalf.stny.rr.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	rth@redhat.com, Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/06/2011 11:26 AM, Steven Rostedt wrote:
> On Thu, 2011-10-06 at 14:10 -0400, Jason Baron wrote:
> 
>>> Looks like jmp2 is about 5% faster than jmp5 on Sandybridge with this
>>> benchmark.
>>>
>>> But insignificant difference on Nehalem.
>>>
>>>     J
>>
>> It would be cool if we could make the total width 2-bytes, when
>> possible.  It might be possible by making the initial 'JUMP_LABEL_INITIAL_NOP'
>> as a 'jmp' to the 'l_yes' label. And then patching that with a no-op at boot
>> time or link time - letting the compiler pick the width. In that way we could
>> get the optimal width...
> 
> Why not just do it?
> 
> jump_label is encapsulated in arch_static_branch() which on x86 looks
> like:
> 
> static __always_inline bool arch_static_branch(struct jump_label_key *key)
> {
> 	asm goto("1:"
> 		JUMP_LABEL_INITIAL_NOP
> 		".pushsection __jump_table,  \"aw\" \n\t"
> 		_ASM_ALIGN "\n\t"
> 		_ASM_PTR "1b, %l[l_yes], %c0 \n\t"
> 		".popsection \n\t"
> 		: :  "i" (key) : : l_yes);
> 	return false;
> l_yes:
> 	return true;
> }
> 
> 
> That jmp to l_yes should easily be a two byte jump.
> 
> If not I'm sure it would be easy to catch it before modifying the code.
> And then complain real loudly about it.
> 

The important thing is that it requires the build-time elimination of
jumps.  It's just work.

	-hpa


-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:32:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:32:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBskE-00017t-O7; Thu, 06 Oct 2011 11:32:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBsje-0000lD-PP
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:31:59 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-7.tower-27.messagelabs.com!1317925889!51741467!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23755 invoked from network); 6 Oct 2011 18:31:29 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-7.tower-27.messagelabs.com with SMTP;
	6 Oct 2011 18:31:29 -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
	p96IVqoZ014404; Thu, 6 Oct 2011 18:31:52 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 p96IVqKB004039; 
	Thu, 6 Oct 2011 14:31:52 -0400
Message-ID: <4E8DF425.9000807@tycho.nsa.gov>
Date: Thu, 06 Oct 2011 14:32:05 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming
	domain 0
References: <1317824920-639-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20109.60188.905267.410813@mariner.uk.xensource.com>
In-Reply-To: <20109.60188.905267.410813@mariner.uk.xensource.com>
X-Enigmail-Version: 1.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 10/06/2011 01:53 PM, Ian Jackson wrote:
> Daniel De Graaf writes ("[Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming domain 0"):
>> The xenbus event channel established in xenbus_init is intended to be a
>> loopback channel, but the remote domain was hardcoded to 0; this will
>> cause the channel to be unusable when xenstore is not being run in
>> domain 0.
> 
> I'm not sure I understand this.
> 
> ...
>>  		/* Next allocate a local port which xenstored can bind to */
>>  		alloc_unbound.dom        = DOMID_SELF;
>> -		alloc_unbound.remote_dom = 0;
>> +		alloc_unbound.remote_dom = DOMID_SELF;
> 
> The comment doesn't suggest that this is supposedly a loopback channel
> (ie one for use by the xenbus client for signalling to itself,
> somehow).

The event channel being changed here is a loopback event channel exposed in
/proc/xen/xsd_port, which xenstored binds to. This code is only used for the
initial domain; otherwise, the shared info page is used.

> Rather it's supposed to be a channel to xenstore.  So the remote
> domain should be the xenstore domain, which should come from the
> shared info page.
> 
> Have you actually tested this with a separate xenstored domain ?
> 
> Ian.
> 

The test setup that exposed this issue is having a non-dom0 Linux domain
running xenstored (in addition to other services); this domain is started
with the SIF_INITDOMAIN flag set. It has been tested and can start other
domains with references back to the xenstored running there; the local
kernel is able to communicate with the locally running xenstore to provide
backend services.

The test for xen_initial_domain() here might better be replaced with a
check on xen_start_info->store_evtchn which should be a valid event channel
on all domains except the domain running xenstored. This seems like a more
elegant solution than relying on the SIF_INITDOMAIN flag to determine the
location of xenstore.

-- 
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 Thu Oct 06 11:34:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:34:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBslm-0001Zm-5e; Thu, 06 Oct 2011 11:34:10 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBslE-0001NK-Lc
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:33:38 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1317925977!51053399!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13841 invoked from network); 6 Oct 2011 18:32:57 -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;
	6 Oct 2011 18:32:57 -0000
Received: by wyh13 with SMTP id 13so4178384wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 06 Oct 2011 11:33:33 -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;
	bh=D52lY3ebKqHZ7iG3Cyl+o1nEdQIU4FcYfbL/BtMTi4w=;
	b=OWsx1W3/FDNYv5mLpAVYY3ekEIMKJuRV53dNxeXIlT71dgJ0kVsbbuPwNhFYgu3EIV
	Kn/GXGMy+SRdXhf32hVdM80wKFbQdmF697CRFa6smQdPpo69H6MxVMFxdv658hyeQnDi
	y2bvccTgHgkWBgvJJqyfpH45FUv1t8e/q9WSA=
Received: by 10.227.137.210 with SMTP id x18mr1317753wbt.57.1317926013124;
	Thu, 06 Oct 2011 11:33:33 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id s30sm11651230wbm.12.2011.10.06.11.33.31
	(version=SSLv3 cipher=OTHER); Thu, 06 Oct 2011 11:33:32 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 06 Oct 2011 19:33:28 +0100
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
From: Keir Fraser <keir.xen@gmail.com>
To: "Kay, Allen M" <allen.m.kay@intel.com>,
	Juergen Gross <juergen.gross@ts.fujitsu.com>
Message-ID: <CAB3B308.224D1%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Index: AcyD4hjtKurCkMoiRPaTw7pzsSMv2QAcfhvAAABZOpAAAD6dxg==
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301EE6A3084@orsmsx505.amr.corp.intel.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>
Content-Type: multipart/mixed; boundary="===============0672554758=="
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.

--===============0672554758==
Content-type: multipart/alternative;
	boundary="B_3400774411_51790690"

> 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_3400774411_51790690
Content-type: text/plain;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable

Yes, as Ian Jackson has noted, this is because the fix for this in
xen-unstable has not been backported. I think Ian Jackson may be proposing
to do the backport. If not, you=B9ll just have to manually =8Ctouch .config=B9 at
the root of your Xen repository, and get on with that.

 -- Keir


On 06/10/2011 19:27, "Kay, Allen M" <allen.m.kay@intel.com> wrote:

> Here is the exact build error I get in xen-4.1-testing:
> =20
> make[4]: Entering directory `/tmp/xen-4.1-testing.hg/tools/check'
> make[4]: *** ../../.config: Is a directory.  Stop.
> make[4]: Leaving directory `/tmp/xen-4.1-testing.hg/tools/check'
> make[3]: *** [subdir-clean-check] Error 2
> make[3]: Leaving directory `/tmp/xen-4.1-testing.hg/tools'
> make[2]: *** [subdirs-clean] Error 2
> make[2]: Leaving directory `/tmp/xen-4.1-testing.hg/tools'
> make[1]: *** [clean] Error 2
> make[1]: Leaving directory `/tmp/xen-4.1-testing.hg'
> make: *** [world] Error 2
> =20
> =20
>=20
> From: Kay, Allen M
> Sent: Thursday, October 06, 2011 11:18 AM
> To: 'Juergen Gross'
> Cc: xen-devel@lists.xensource.com; keir@xen.org
> Subject: RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
> =20
> Hi Juergen,
> =20
> This patch fixes the build problem for xen-unstable but do not apply to
> xen-4.1-testing.  Xen-4.1-testing do not have xfs directory and still has=
 the
> same build error.
> =20
> Allen
> =20
>=20
> From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
> Sent: Wednesday, October 05, 2011 9:41 PM
> To: Kay, Allen M
> Cc: xen-devel@lists.xensource.com; keir@xen.org
> Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
> =20
> Hi Allen,
>=20
> On 10/05/2011 06:24 PM, Kay, Allen M wrote:
>> > This is fixed with cs 23049 in xen-unstable:
>> >=20
>> > http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.ht=
ml
> =20
> I=B9m using the latest staging tree (cs# 23903) and still seeing this probl=
em.
>=20
> Uuh, the same bug was introduced again.
> Could you try the following patch:
>=20
> diff -r 0b66e6450ffe tools/libfsimage/xfs/Makefile
> --- a/tools/libfsimage/xfs/Makefile     Tue Oct 04 14:18:30 2011 +0200
> +++ b/tools/libfsimage/xfs/Makefile     Thu Oct 06 06:32:00 2011 +0200
> @@ -1,4 +1,4 @@ XEN_ROOT =3D ../../..
> -XEN_ROOT =3D ../../..
> +XEN_ROOT =3D $(CURDIR)/../../..
> =20
>  LIB_SRCS-y =3D fsys_xfs.c
> =20
>=20
> Keir, it is easy to catch this problem: create a .config file in all
> directories
> _above_ $XEN_ROOT containing something like:
>=20
> $(error usage of relative XEN_ROOT somewhere in $(MAKEFILE_LIST))
>=20
>=20
> Juergen
>=20
>=20
> =20
> Allen
> =20
> =20
>=20
> From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
> Sent: Tuesday, October 04, 2011 9:45 PM
> To: Kay, Allen M
> Cc: xen-devel@lists.xensource.com; keir@xen.org
> Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
> =20
> On 10/04/2011 11:44 PM, Kay, Allen M wrote:
> Hi Keir,
> =20
> I=B9m getting the following build error caused by =B3-include $(XEN_ROOT)/.co=
nfig=B2
> line in Config.mk.  Removing it from Config.mk makes the error go away.  =
The
> OS I=B9m using is FC15.  =B3$(XEN_ROOT)/.config=B2 does not exist.
> =20
> Allen
> =20
> -------
> =20
> make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
> make[4]: *** ../../.config: Is a directory.  Stop.
> make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
> make[3]: *** [subdir-clean-check] Error 2
> make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
> make[2]: *** [subdirs-clean] Error 2
> make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
> make[1]: *** [clean] Error 2
> make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
> make: *** [world] Error 2
> =20
>=20
> This is fixed with cs 23049 in xen-unstable:
>=20
> http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html
>=20
>=20
> Juergen


--B_3400774411_51790690
Content-type: text/html;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable

<HTML>
<HEAD>
<TITLE>Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config</TITLE>
</HEAD>
<BODY>
<FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN STYLE=3D'font-size:11pt=
'>Yes, as Ian Jackson has noted, this is because the fix for this in xen-uns=
table has not been backported. I think Ian Jackson may be proposing to do th=
e backport. If not, you&#8217;ll just have to manually &#8216;touch .config&=
#8217; at the root of your Xen repository, and get on with that.<BR>
<BR>
&nbsp;-- Keir<BR>
<BR>
<BR>
On 06/10/2011 19:27, &quot;Kay, Allen M&quot; &lt;<a href=3D"allen.m.kay@inte=
l.com">allen.m.kay@intel.com</a>&gt; wrote:<BR>
<BR>
</SPAN></FONT><BLOCKQUOTE><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><=
SPAN STYLE=3D'font-size:11pt'><FONT COLOR=3D"#1F497D">Here is the exact build er=
ror I get in xen-4.1-testing:<BR>
&nbsp;<BR>
make[4]: Entering directory `/tmp/xen-4.1-testing.hg/tools/check'<BR>
make[4]: *** ../../.config: Is a directory. &nbsp;Stop.<BR>
make[4]: Leaving directory `/tmp/xen-4.1-testing.hg/tools/check'<BR>
make[3]: *** [subdir-clean-check] Error 2<BR>
make[3]: Leaving directory `/tmp/xen-4.1-testing.hg/tools'<BR>
make[2]: *** [subdirs-clean] Error 2<BR>
make[2]: Leaving directory `/tmp/xen-4.1-testing.hg/tools'<BR>
make[1]: *** [clean] Error 2<BR>
make[1]: Leaving directory `/tmp/xen-4.1-testing.hg'<BR>
make: *** [world] Error 2<BR>
&nbsp;<BR>
&nbsp;<BR>
</FONT><BR>
</SPAN></FONT><FONT SIZE=3D"2"><FONT FACE=3D"Tahoma, Verdana, Helvetica, Arial"=
><SPAN STYLE=3D'font-size:10pt'><B>From:</B> Kay, Allen M <BR>
<B>Sent:</B> Thursday, October 06, 2011 11:18 AM<BR>
<B>To:</B> 'Juergen Gross'<BR>
<B>Cc:</B> <a href=3D"xen-devel@lists.xensource.com">xen-devel@lists.xensourc=
e.com</a>; <a href=3D"keir@xen.org">keir@xen.org</a><BR>
<B>Subject:</B> RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config=
<BR>
</SPAN></FONT></FONT><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN =
STYLE=3D'font-size:11pt'> <BR>
<FONT COLOR=3D"#1F497D">Hi Juergen,<BR>
&nbsp;<BR>
This patch fixes the build problem for xen-unstable but do not apply to xen=
-4.1-testing. &nbsp;Xen-4.1-testing do not have xfs directory and still has =
the same build error.<BR>
&nbsp;<BR>
Allen<BR>
&nbsp;<BR>
</FONT><BR>
</SPAN></FONT><FONT SIZE=3D"2"><FONT FACE=3D"Tahoma, Verdana, Helvetica, Arial"=
><SPAN STYLE=3D'font-size:10pt'><B>From:</B> Juergen Gross [<a href=3D"mailto:ju=
ergen.gross@ts.fujitsu.com">mailto:juergen.gross@ts.fujitsu.com</a>] <BR>
<B>Sent:</B> Wednesday, October 05, 2011 9:41 PM<BR>
<B>To:</B> Kay, Allen M<BR>
<B>Cc:</B> <a href=3D"xen-devel@lists.xensource.com">xen-devel@lists.xensourc=
e.com</a>; <a href=3D"keir@xen.org">keir@xen.org</a><BR>
<B>Subject:</B> Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config=
<BR>
</SPAN></FONT></FONT><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN =
STYLE=3D'font-size:11pt'> <BR>
Hi Allen,<BR>
<BR>
On 10/05/2011 06:24 PM, Kay, Allen M wrote: <BR>
</SPAN><FONT SIZE=3D"2"><SPAN STYLE=3D'font-size:10pt'>&gt; </SPAN></FONT></FON=
T><FONT SIZE=3D"2"><SPAN STYLE=3D'font-size:10pt'><FONT FACE=3D"Consolas, Courier =
New, Courier">This is fixed with cs 23049 in xen-unstable:<BR>
&gt; <BR>
&gt; <a href=3D"http://lists.xensource.com/archives/html/xen-devel/2011-03/ms=
g01251.html">http://lists.xensource.com/archives/html/xen-devel/2011-03/msg0=
1251.html</a><BR>
&nbsp;<BR>
I&#8217;m using the latest staging tree (cs# 23903) and still seeing this p=
roblem.<BR>
</FONT></SPAN></FONT><FONT FACE=3D"Times New Roman"><SPAN STYLE=3D'font-size:12=
pt'><BR>
Uuh, the same bug was introduced again.<BR>
Could you try the following patch:<BR>
<BR>
diff -r 0b66e6450ffe tools/libfsimage/xfs/Makefile<BR>
--- a/tools/libfsimage/xfs/Makefile &nbsp;&nbsp;&nbsp;&nbsp;Tue Oct 04 14:1=
8:30 2011 +0200<BR>
+++ b/tools/libfsimage/xfs/Makefile &nbsp;&nbsp;&nbsp;&nbsp;Thu Oct 06 06:3=
2:00 2011 +0200<BR>
@@ -1,4 +1,4 @@ XEN_ROOT =3D ../../..<BR>
-XEN_ROOT =3D ../../..<BR>
+XEN_ROOT =3D $(CURDIR)/../../..<BR>
&nbsp;<BR>
&nbsp;LIB_SRCS-y =3D fsys_xfs.c<BR>
&nbsp;<BR>
<BR>
Keir, it is easy to catch this problem: create a .config file in all direct=
ories<BR>
_above_ $XEN_ROOT containing something like:<BR>
<BR>
$(error usage of relative XEN_ROOT somewhere in $(MAKEFILE_LIST))<BR>
<BR>
<BR>
Juergen<BR>
<BR>
</SPAN></FONT><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN STYLE=3D'=
font-size:11pt'><BR>
</SPAN></FONT><FONT SIZE=3D"2"><FONT FACE=3D"Consolas, Courier New, Courier"><S=
PAN STYLE=3D'font-size:10pt'> <BR>
Allen<BR>
</SPAN></FONT></FONT><FONT COLOR=3D"#1F497D"><FONT FACE=3D"Calibri, Verdana, He=
lvetica, Arial"><SPAN STYLE=3D'font-size:11pt'> <BR>
&nbsp;<BR>
</SPAN></FONT></FONT><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN =
STYLE=3D'font-size:11pt'><BR>
</SPAN></FONT><FONT SIZE=3D"2"><FONT FACE=3D"Tahoma, Verdana, Helvetica, Arial"=
><SPAN STYLE=3D'font-size:10pt'><B>From:</B> Juergen Gross [<a href=3D"mailto:ju=
ergen.gross@ts.fujitsu.com">mailto:juergen.gross@ts.fujitsu.com</a>] <BR>
<B>Sent:</B> Tuesday, October 04, 2011 9:45 PM<BR>
<B>To:</B> Kay, Allen M<BR>
<B>Cc:</B> <a href=3D"xen-devel@lists.xensource.com">xen-devel@lists.xensourc=
e.com</a>; <a href=3D"keir@xen.org">keir@xen.org</a><BR>
<B>Subject:</B> Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config=
<BR>
</SPAN></FONT></FONT><FONT FACE=3D"Calibri, Verdana, Helvetica, Arial"><SPAN =
STYLE=3D'font-size:11pt'> <BR>
On 10/04/2011 11:44 PM, Kay, Allen M wrote: <BR>
Hi Keir,<BR>
&nbsp;<BR>
I&#8217;m getting the following build error caused by &#8220;-include $(XEN=
_ROOT)/.config&#8221; line in Config.mk. &nbsp;Removing it from Config.mk ma=
kes the error go away. &nbsp;The OS I&#8217;m using is FC15. &nbsp;&#8220;$(=
XEN_ROOT)/.config&#8221; does not exist.<BR>
&nbsp;<BR>
Allen<BR>
&nbsp;<BR>
-------<BR>
&nbsp;<BR>
make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'<BR>
make[4]: *** ../../.config: Is a directory. &nbsp;Stop.<BR>
make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'<BR>
make[3]: *** [subdir-clean-check] Error 2<BR>
make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'<BR>
make[2]: *** [subdirs-clean] Error 2<BR>
make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'<BR>
make[1]: *** [clean] Error 2<BR>
make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'<BR>
make: *** [world] Error 2<BR>
</SPAN></FONT><FONT FACE=3D"Times New Roman"><SPAN STYLE=3D'font-size:12pt'> <B=
R>
<BR>
</SPAN></FONT><FONT SIZE=3D"2"><FONT FACE=3D"Courier New"><SPAN STYLE=3D'font-siz=
e:10pt'>This is fixed with cs 23049 in xen-unstable:<BR>
<BR>
<a href=3D"http://lists.xensource.com/archives/html/xen-devel/2011-03/msg0125=
1.html">http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.=
html</a><BR>
<BR>
<BR>
Juergen<BR>
</SPAN></FONT></FONT></BLOCKQUOTE>
</BODY>
</HTML>


--B_3400774411_51790690--




--===============0672554758==
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

--===============0672554758==--




From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:39:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:39:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsr5-00023w-OH; Thu, 06 Oct 2011 11:39:39 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBsqa-0001s8-Id
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:39:09 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317926343!28215075!1
X-Originating-IP: [134.134.136.20]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10021 invoked from network); 6 Oct 2011 18:39:04 -0000
Received: from mga02.intel.com (HELO mga02.intel.com) (134.134.136.20)
	by server-3.tower-174.messagelabs.com with SMTP;
	6 Oct 2011 18:39:04 -0000
Received: from orsmga002.jf.intel.com ([10.7.209.21])
	by orsmga101.jf.intel.com with ESMTP; 06 Oct 2011 11:39:03 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,351,1309762800"; d="scan'208,217";a="60640472"
Received: from orsmsx602.amr.corp.intel.com ([10.22.226.211])
	by orsmga002.jf.intel.com with ESMTP; 06 Oct 2011 11:39:03 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx602.amr.corp.intel.com ([10.22.226.211]) with mapi;
	Thu, 6 Oct 2011 11:39:02 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Keir Fraser <keir.xen@gmail.com>, Juergen Gross
	<juergen.gross@ts.fujitsu.com>
Date: Thu, 6 Oct 2011 11:39:01 -0700
Subject: RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Topic: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
Thread-Index: AcyD4hjtKurCkMoiRPaTw7pzsSMv2QAcfhvAAABZOpAAAD6dxgAAHptw
Message-ID: <987664A83D2D224EAE907B061CE93D5301EE6A30B3@orsmsx505.amr.corp.intel.com>
References: <987664A83D2D224EAE907B061CE93D5301EE6A3084@orsmsx505.amr.corp.intel.com>
	<CAB3B308.224D1%keir.xen@gmail.com>
In-Reply-To: <CAB3B308.224D1%keir.xen@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: 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>
Content-Type: multipart/mixed; boundary="===============0537445916=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0537445916==
Content-Language: en-US
Content-Type: multipart/alternative;
	boundary="_000_987664A83D2D224EAE907B061CE93D5301EE6A30B3orsmsx505amrc_"

--_000_987664A83D2D224EAE907B061CE93D5301EE6A30B3orsmsx505amrc_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

I have tried "touch .config" and it works.   I provided the error messages =
as FYI in case you guys needed it.

Allen

From: Keir Fraser [mailto:keir.xen@gmail.com]
Sent: Thursday, October 06, 2011 11:33 AM
To: Kay, Allen M; Juergen Gross
Cc: xen-devel@lists.xensource.com; Ian Jackson
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config

Yes, as Ian Jackson has noted, this is because the fix for this in xen-unst=
able has not been backported. I think Ian Jackson may be proposing to do th=
e backport. If not, you'll just have to manually 'touch .config' at the roo=
t of your Xen repository, and get on with that.

 -- Keir


On 06/10/2011 19:27, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
Here is the exact build error I get in xen-4.1-testing:

make[4]: Entering directory `/tmp/xen-4.1-testing.hg/tools/check'
make[4]: *** ../../.config: Is a directory.  Stop.
make[4]: Leaving directory `/tmp/xen-4.1-testing.hg/tools/check'
make[3]: *** [subdir-clean-check] Error 2
make[3]: Leaving directory `/tmp/xen-4.1-testing.hg/tools'
make[2]: *** [subdirs-clean] Error 2
make[2]: Leaving directory `/tmp/xen-4.1-testing.hg/tools'
make[1]: *** [clean] Error 2
make[1]: Leaving directory `/tmp/xen-4.1-testing.hg'
make: *** [world] Error 2



From: Kay, Allen M
Sent: Thursday, October 06, 2011 11:18 AM
To: 'Juergen Gross'
Cc: xen-devel@lists.xensource.com; keir@xen.org
Subject: RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config

Hi Juergen,

This patch fixes the build problem for xen-unstable but do not apply to xen=
-4.1-testing.  Xen-4.1-testing do not have xfs directory and still has the =
same build error.

Allen


From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
Sent: Wednesday, October 05, 2011 9:41 PM
To: Kay, Allen M
Cc: xen-devel@lists.xensource.com; keir@xen.org
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config

Hi Allen,

On 10/05/2011 06:24 PM, Kay, Allen M wrote:
> This is fixed with cs 23049 in xen-unstable:
>
> http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html

I'm using the latest staging tree (cs# 23903) and still seeing this problem=
.

Uuh, the same bug was introduced again.
Could you try the following patch:

diff -r 0b66e6450ffe tools/libfsimage/xfs/Makefile
--- a/tools/libfsimage/xfs/Makefile     Tue Oct 04 14:18:30 2011 +0200
+++ b/tools/libfsimage/xfs/Makefile     Thu Oct 06 06:32:00 2011 +0200
@@ -1,4 +1,4 @@ XEN_ROOT =3D ../../..
-XEN_ROOT =3D ../../..
+XEN_ROOT =3D $(CURDIR)/../../..

 LIB_SRCS-y =3D fsys_xfs.c


Keir, it is easy to catch this problem: create a .config file in all direct=
ories
_above_ $XEN_ROOT containing something like:

$(error usage of relative XEN_ROOT somewhere in $(MAKEFILE_LIST))


Juergen



Allen



From: Juergen Gross [mailto:juergen.gross@ts.fujitsu.com]
Sent: Tuesday, October 04, 2011 9:45 PM
To: Kay, Allen M
Cc: xen-devel@lists.xensource.com; keir@xen.org
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config

On 10/04/2011 11:44 PM, Kay, Allen M wrote:
Hi Keir,

I'm getting the following build error caused by "-include $(XEN_ROOT)/.conf=
ig" line in Config.mk.  Removing it from Config.mk makes the error go away.=
  The OS I'm using is FC15.  "$(XEN_ROOT)/.config" does not exist.

Allen

-------

make[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'
make[4]: *** ../../.config: Is a directory.  Stop.
make[4]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools/check'
make[3]: *** [subdir-clean-check] Error 2
make[3]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
make[2]: *** [subdirs-clean] Error 2
make[2]: Leaving directory `/home/akay/xen-4.1-testing.hg/tools'
make[1]: *** [clean] Error 2
make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'
make: *** [world] Error 2


This is fixed with cs 23049 in xen-unstable:

http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01251.html


Juergen

--_000_987664A83D2D224EAE907B061CE93D5301EE6A30B3orsmsx505amrc_
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 12 (filtered medium)"><title>Re: [Xen-devel] build failure caused =
by $(XEN_ROOT)/.config</title><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;}
@font-face
	{font-family:Tahoma;
	panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
	{font-family:Consolas;
	panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	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.EmailStyle17
	{mso-style-type:personal-reply;
	font-family:"Calibri","sans-serif";
	color:#1F497D;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-size:10.0pt;}
@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><span style=3D'f=
ont-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'>I have tr=
ied &#8220;touch .config&#8221; and it works.&nbsp;&nbsp; I provided the er=
ror messages as FYI in case you guys needed it.<o:p></o:p></span></p><p cla=
ss=3DMsoNormal><span style=3D'font-size:11.0pt;font-family:"Calibri","sans-=
serif";color:#1F497D'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal><spa=
n style=3D'font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497=
D'>Allen<o:p></o:p></span></p><p class=3DMsoNormal><span style=3D'font-size=
:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D'><o:p>&nbsp;</o:p>=
</span></p><div><div style=3D'border:none;border-top:solid #B5C4DF 1.0pt;pa=
dding:3.0pt 0in 0in 0in'><p class=3DMsoNormal><b><span style=3D'font-size:1=
0.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style=3D'fon=
t-size:10.0pt;font-family:"Tahoma","sans-serif"'> Keir Fraser [mailto:keir.=
xen@gmail.com] <br><b>Sent:</b> Thursday, October 06, 2011 11:33 AM<br><b>T=
o:</b> Kay, Allen M; Juergen Gross<br><b>Cc:</b> xen-devel@lists.xensource.=
com; Ian Jackson<br><b>Subject:</b> Re: [Xen-devel] build failure caused by=
 $(XEN_ROOT)/.config<o:p></o:p></span></p></div></div><p class=3DMsoNormal>=
<o:p>&nbsp;</o:p></p><p class=3DMsoNormal style=3D'margin-bottom:12.0pt'><s=
pan style=3D'font-size:11.0pt;font-family:"Calibri","sans-serif"'>Yes, as I=
an Jackson has noted, this is because the fix for this in xen-unstable has =
not been backported. I think Ian Jackson may be proposing to do the backpor=
t. If not, you&#8217;ll just have to manually &#8216;touch .config&#8217; a=
t the root of your Xen repository, and get on with that.<br><br>&nbsp;-- Ke=
ir<br><br><br>On 06/10/2011 19:27, &quot;Kay, Allen M&quot; &lt;<a href=3D"=
allen.m.kay@intel.com">allen.m.kay@intel.com</a>&gt; wrote:</span><o:p></o:=
p></p><p class=3DMsoNormal><span style=3D'font-size:11.0pt;font-family:"Cal=
ibri","sans-serif";color:#1F497D'>Here is the exact build error I get in xe=
n-4.1-testing:<br>&nbsp;<br>make[4]: Entering directory `/tmp/xen-4.1-testi=
ng.hg/tools/check'<br>make[4]: *** ../../.config: Is a directory. &nbsp;Sto=
p.<br>make[4]: Leaving directory `/tmp/xen-4.1-testing.hg/tools/check'<br>m=
ake[3]: *** [subdir-clean-check] Error 2<br>make[3]: Leaving directory `/tm=
p/xen-4.1-testing.hg/tools'<br>make[2]: *** [subdirs-clean] Error 2<br>make=
[2]: Leaving directory `/tmp/xen-4.1-testing.hg/tools'<br>make[1]: *** [cle=
an] Error 2<br>make[1]: Leaving directory `/tmp/xen-4.1-testing.hg'<br>make=
: *** [world] Error 2<br>&nbsp;<br>&nbsp;<br></span><span style=3D'font-siz=
e:11.0pt;font-family:"Calibri","sans-serif"'><br></span><b><span style=3D'f=
ont-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span st=
yle=3D'font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Kay, Allen M <b=
r><b>Sent:</b> Thursday, October 06, 2011 11:18 AM<br><b>To:</b> 'Juergen G=
ross'<br><b>Cc:</b> <a href=3D"xen-devel@lists.xensource.com">xen-devel@lis=
ts.xensource.com</a>; <a href=3D"keir@xen.org">keir@xen.org</a><br><b>Subje=
ct:</b> RE: [Xen-devel] build failure caused by $(XEN_ROOT)/.config<br></sp=
an><span style=3D'font-size:11.0pt;font-family:"Calibri","sans-serif"'><br>=
<span style=3D'color:#1F497D'>Hi Juergen,<br>&nbsp;<br>This patch fixes the=
 build problem for xen-unstable but do not apply to xen-4.1-testing. &nbsp;=
Xen-4.1-testing do not have xfs directory and still has the same build erro=
r.<br>&nbsp;<br>Allen<br>&nbsp;<br></span><br></span><b><span style=3D'font=
-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span style=
=3D'font-size:10.0pt;font-family:"Tahoma","sans-serif"'> Juergen Gross [<a =
href=3D"mailto:juergen.gross@ts.fujitsu.com">mailto:juergen.gross@ts.fujits=
u.com</a>] <br><b>Sent:</b> Wednesday, October 05, 2011 9:41 PM<br><b>To:</=
b> Kay, Allen M<br><b>Cc:</b> <a href=3D"xen-devel@lists.xensource.com">xen=
-devel@lists.xensource.com</a>; <a href=3D"keir@xen.org">keir@xen.org</a><b=
r><b>Subject:</b> Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.conf=
ig<br></span><span style=3D'font-size:11.0pt;font-family:"Calibri","sans-se=
rif"'><br>Hi Allen,<br><br>On 10/05/2011 06:24 PM, Kay, Allen M wrote: <br>=
</span><span style=3D'font-size:10.0pt;font-family:"Calibri","sans-serif"'>=
&gt; </span><span style=3D'font-size:10.0pt;font-family:Consolas'>This is f=
ixed with cs 23049 in xen-unstable:<br>&gt; <br>&gt; <a href=3D"http://list=
s.xensource.com/archives/html/xen-devel/2011-03/msg01251.html">http://lists=
.xensource.com/archives/html/xen-devel/2011-03/msg01251.html</a><br>&nbsp;<=
br>I&#8217;m using the latest staging tree (cs# 23903) and still seeing thi=
s problem.<br></span><br>Uuh, the same bug was introduced again.<br>Could y=
ou try the following patch:<br><br>diff -r 0b66e6450ffe tools/libfsimage/xf=
s/Makefile<br>--- a/tools/libfsimage/xfs/Makefile &nbsp;&nbsp;&nbsp;&nbsp;T=
ue Oct 04 14:18:30 2011 +0200<br>+++ b/tools/libfsimage/xfs/Makefile &nbsp;=
&nbsp;&nbsp;&nbsp;Thu Oct 06 06:32:00 2011 +0200<br>@@ -1,4 +1,4 @@ XEN_ROO=
T =3D ../../..<br>-XEN_ROOT =3D ../../..<br>+XEN_ROOT =3D $(CURDIR)/../../.=
.<br>&nbsp;<br>&nbsp;LIB_SRCS-y =3D fsys_xfs.c<br>&nbsp;<br><br>Keir, it is=
 easy to catch this problem: create a .config file in all directories<br>_a=
bove_ $XEN_ROOT containing something like:<br><br>$(error usage of relative=
 XEN_ROOT somewhere in $(MAKEFILE_LIST))<br><br><br>Juergen<br><br><span st=
yle=3D'font-size:11.0pt;font-family:"Calibri","sans-serif"'><br></span><spa=
n style=3D'font-size:10.0pt;font-family:Consolas'><br>Allen<br></span><span=
 style=3D'font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D=
'><br>&nbsp;<br></span><span style=3D'font-size:11.0pt;font-family:"Calibri=
","sans-serif"'><br></span><b><span style=3D'font-size:10.0pt;font-family:"=
Tahoma","sans-serif"'>From:</span></b><span style=3D'font-size:10.0pt;font-=
family:"Tahoma","sans-serif"'> Juergen Gross [<a href=3D"mailto:juergen.gro=
ss@ts.fujitsu.com">mailto:juergen.gross@ts.fujitsu.com</a>] <br><b>Sent:</b=
> Tuesday, October 04, 2011 9:45 PM<br><b>To:</b> Kay, Allen M<br><b>Cc:</b=
> <a href=3D"xen-devel@lists.xensource.com">xen-devel@lists.xensource.com</=
a>; <a href=3D"keir@xen.org">keir@xen.org</a><br><b>Subject:</b> Re: [Xen-d=
evel] build failure caused by $(XEN_ROOT)/.config<br></span><span style=3D'=
font-size:11.0pt;font-family:"Calibri","sans-serif"'><br>On 10/04/2011 11:4=
4 PM, Kay, Allen M wrote: <br>Hi Keir,<br>&nbsp;<br>I&#8217;m getting the f=
ollowing build error caused by &#8220;-include $(XEN_ROOT)/.config&#8221; l=
ine in Config.mk. &nbsp;Removing it from Config.mk makes the error go away.=
 &nbsp;The OS I&#8217;m using is FC15. &nbsp;&#8220;$(XEN_ROOT)/.config&#82=
21; does not exist.<br>&nbsp;<br>Allen<br>&nbsp;<br>-------<br>&nbsp;<br>ma=
ke[4]: Entering directory `/home/akay/xen-4.1-testing.hg/tools/check'<br>ma=
ke[4]: *** ../../.config: Is a directory. &nbsp;Stop.<br>make[4]: Leaving d=
irectory `/home/akay/xen-4.1-testing.hg/tools/check'<br>make[3]: *** [subdi=
r-clean-check] Error 2<br>make[3]: Leaving directory `/home/akay/xen-4.1-te=
sting.hg/tools'<br>make[2]: *** [subdirs-clean] Error 2<br>make[2]: Leaving=
 directory `/home/akay/xen-4.1-testing.hg/tools'<br>make[1]: *** [clean] Er=
ror 2<br>make[1]: Leaving directory `/home/akay/xen-4.1-testing.hg'<br>make=
: *** [world] Error 2<br></span><br><br><span style=3D'font-size:10.0pt;fon=
t-family:"Courier New"'>This is fixed with cs 23049 in xen-unstable:<br><br=
><a href=3D"http://lists.xensource.com/archives/html/xen-devel/2011-03/msg0=
1251.html">http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01=
251.html</a><br><br><br>Juergen</span><o:p></o:p></p></div></body></html>=

--_000_987664A83D2D224EAE907B061CE93D5301EE6A30B3orsmsx505amrc_--


--===============0537445916==
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

--===============0537445916==--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:41:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:41:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBssn-0002XY-SC; Thu, 06 Oct 2011 11:41:25 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBssM-0002L9-FT
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:40:58 -0700
X-Env-Sender: jinsong.liu@intel.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317926465!54474206!1
X-Originating-IP: [192.55.52.93]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 823 invoked from network); 6 Oct 2011 18:41:06 -0000
Received: from mga11.intel.com (HELO mga11.intel.com) (192.55.52.93)
	by server-3.tower-21.messagelabs.com with SMTP;
	6 Oct 2011 18:41:06 -0000
Received: from fmsmga001.fm.intel.com ([10.253.24.23])
	by fmsmga102.fm.intel.com with ESMTP; 06 Oct 2011 11:40:54 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,497,1312182000"; d="scan'208";a="71018802"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by fmsmga001.fm.intel.com with ESMTP; 06 Oct 2011 11:40:53 -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, 7 Oct 2011 02:40:52 +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, 7 Oct 2011 02:40:52 +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, 7 Oct 2011
	02:40:50 +0800
From: "Liu, Jinsong" <jinsong.liu@intel.com>
To: Jan Beulich <JBeulich@suse.com>, "Jiang, Yunhong" <yunhong.jiang@intel.com>
Date: Fri, 7 Oct 2011 02:40:48 +0800
Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Topic: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Index: Acx/WI2JGiAAymCbSU+OG6bGavY8HgAAEC9gAANiRDABPDKm4A==
Message-ID: <BC00F5384FCFC9499AF06F92E8B78A9E264E34D85F@shsmsx502.ccr.corp.intel.com>
References: <BC00F5384FCFC9499AF06F92E8B78A9E263B557B77@shsmsx502.ccr.corp.intel.com>
	<4E84ADF70200007800058882@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D2366A9B@shsmsx501.ccr.corp.intel.com>
	<4E858AF30200007800058A64@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F02@shsmsx502.ccr.corp.intel.com>
	<4E8592A60200007800058AD4@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F40@shsmsx502.ccr.corp.intel.com>
	<4E859D7F0200007800058B39@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F7C@shsmsx502.ccr.corp.intel.com>
	<4E85B09F0200007800058B7B@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F90@shsmsx502.ccr.corp.intel.com>
In-Reply-To: <BC00F5384FCFC9499AF06F92E8B78A9E263B557F90@shsmsx502.ccr.corp.intel.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: "keir.xen@gmail.com" <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

Liu, Jinsong wrote:
> Liu, Jinsong wrote:
>> Jan Beulich wrote:
>>>>>> On 30.09.11 at 11:42, "Liu, Jinsong" <jinsong.liu@intel.com>
>>>>>> wrote:
>>>> Jan Beulich wrote:
>>>>>>>> On 30.09.11 at 10:21, "Liu, Jinsong" <jinsong.liu@intel.com>
>>>>>>>> wrote:
>>>>>> Executing guest code will not satisfy the check
>>>>>> if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs)) 	return
>>>>>> -1; so it would not panic system.
>>>>>=20
>>>>> Exactly. But it should when the prefetch was to hypervisor code.
>>>>>=20
>>>>=20
>>>> Wouldn't processor refresh instruction prefetch queue under such
>>>> case?
>>>=20
>>> That's a question that you are better positioned to answer than me.
>>> But the SRAR errors being a sub-category of uncorrected errors I
>>> would think it can't be that simple.
>>>=20
>>=20
>> Hmm, I will check this question internally first.
>> BTW, we would have 7 days holiday (1/10 ~ 7/10), so email reply
>> maybe some slow.=20
>>=20
>> Thanks,
>> Jinsong
>=20
> Ah, just think our talking context: the prefetched instruction would
> have been flushed since we now at mce exception context. So I think
> no need to overkill here, just let guest handle it --> who own, who
> take. =20
>=20
> Thanks,
> Jinsong

Jan,

Do you think following is OK?

if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))=20
    return -1;

Thanks,
Jinsong=

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:43:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:43:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsuc-0002vy-T3; Thu, 06 Oct 2011 11:43:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBsu3-0002jf-LC
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:42:43 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317926558!34270312!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7230 invoked from network); 6 Oct 2011 18:42:40 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-2.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 6 Oct 2011 18:42:40 -0000
Received: from tazenda.hos.anvin.org ([IPv6:2001:470:861f::feed:face:f00d])
	(authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p96IZsl6028281
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Thu, 6 Oct 2011 11:35:56 -0700
Message-ID: <4E8DF505.6050807@zytor.com>
Date: Thu, 06 Oct 2011 11:35:49 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
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 Baron <jbaron@redhat.com>
References: <477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<4E8DF02B.7010406@goop.org> <20111006183319.GB2505@redhat.com>
In-Reply-To: <20111006183319.GB2505@redhat.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/06/2011 11:33 AM, Jason Baron wrote:
> 
> cool. It does add some complication, I think...detecting the 2-byte vs.
> 5-byte, and if done at boot time, possibly taking the undesired
> branch...
> 

It has to be done at build time to be sane, IMO.

	-hpa

-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:45:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:45:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBswh-0003KD-9C; Thu, 06 Oct 2011 11:45:27 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBswB-00037T-4I
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:44:55 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317926691!34270498!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10076 invoked from network); 6 Oct 2011 18:44:52 -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;
	6 Oct 2011 18:44:52 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8258556"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 18:44: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; Thu, 6 Oct 2011 19:44:51 +0100
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
	1RBsw7-0006IK-EL; Thu, 06 Oct 2011 18:44:51 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBsw7-0002My-Bw;
	Thu, 06 Oct 2011 19:44:51 +0100
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: <20109.63267.262213.24308@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 19:44:51 +0100
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH v6 0/3] libxenvchan: interdomain
	communications library
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1317371652.26672.236.camel@zakaz.uk.xensource.com>
References: <1313764724-12683-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1316729665-15004-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1317371652.26672.236.camel@zakaz.uk.xensource.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>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.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 ("[Xen-devel] Re: [PATCH v6 0/3] libxenvchan: interdomain communications library"):
> I meant to say this before but, modulo the spurious changes to
> tools/libxl/libxlu_cfg_l.[ch] in the first patch, the whole lot are:
> 
> Acked-by: Ian Campbell <ian.campbell@citrix.com>

Thanks, I have applied all three minus those changes to
libxlu_cfg_l.[ch], which I will post separately.

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:46:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:46:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBsy2-0003ho-Lp; Thu, 06 Oct 2011 11:46:50 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBsxa-0003W2-Go
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:46:23 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1317926779!18476847!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8594 invoked from network); 6 Oct 2011 18:46:19 -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;
	6 Oct 2011 18:46:19 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8258585"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 18: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; Thu, 6 Oct 2011 19:46:19 +0100
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
	1RBsxW-0006Ir-LP	for xen-devel@lists.xensource.com;
	Thu, 06 Oct 2011 18:46:18 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBsxW-0002Oz-JO	for
	xen-devel@lists.xensource.com; Thu, 06 Oct 2011 19:46:18 +0100
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: <20109.63354.587687.24132@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 19:46:18 +0100
To: xen-devel@lists.xensource.com
X-Mailer: VM 7.19 under Emacs 21.4.1
Subject: [Xen-devel] [PATCH] libxl: undo whitespace cleanup to another
	autogenerated file
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

23728:548b2826293e changed another pair of autogenerated files,
libxlu_cfg_l.[ch], too.  Undo that change.

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

diff -r 159be83e5fe9 tools/libxl/libxlu_cfg_l.c
--- a/tools/libxl/libxlu_cfg_l.c	Thu Oct 06 19:44:40 2011 +0100
+++ b/tools/libxl/libxlu_cfg_l.c	Thu Oct 06 19:45:07 2011 +0100
@@ -34,7 +34,7 @@
 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
 
 /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
+ * if you want the limit (max/min) macros for int types. 
  */
 #ifndef __STDC_LIMIT_MACROS
 #define __STDC_LIMIT_MACROS 1
@@ -51,7 +51,7 @@ typedef uint32_t flex_uint32_t;
 typedef signed char flex_int8_t;
 typedef short int flex_int16_t;
 typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
+typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
 
@@ -185,7 +185,7 @@ typedef struct yy_buffer_state *YY_BUFFE
 
     /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires
      *       access to the local variable yy_act. Since yyless() is a macro, it would break
-     *       existing scanners that call yyless() from OUTSIDE xlu__cfg_yylex.
+     *       existing scanners that call yyless() from OUTSIDE xlu__cfg_yylex. 
      *       One obvious solution it to make yy_act a global. I tried that, and saw
      *       a 5% performance hit in a non-yylineno scanner, because yy_act is
      *       normally declared as a register variable-- so it is not worth it.
@@ -197,7 +197,7 @@ typedef struct yy_buffer_state *YY_BUFFE
                     if ( yytext[yyl] == '\n' )\
                         --yylineno;\
             }while(0)
-
+    
 /* Return all but the first "n" matched characters back to the input stream. */
 #define yyless(n) \
 	do \
@@ -259,7 +259,7 @@ struct yy_buffer_state
 
     int yy_bs_lineno; /**< The line count. */
     int yy_bs_column; /**< The column count. */
-
+    
 	/* Whether to try to fill the input buffer when we reach the
 	 * end of it.
 	 */
@@ -574,9 +574,9 @@ static int yy_init_globals (yyscan_t yys
     /* This must go here because YYSTYPE and YYLTYPE are included
      * from bison output in section 1.*/
     #    define yylval yyg->yylval_r
-
+    
     #    define yylloc yyg->yylloc_r
-
+    
 int xlu__cfg_yylex_init (yyscan_t* scanner);
 
 int xlu__cfg_yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
@@ -615,9 +615,9 @@ YYSTYPE * xlu__cfg_yyget_lval (yyscan_t 
 void xlu__cfg_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
 
        YYLTYPE *xlu__cfg_yyget_lloc (yyscan_t yyscanner );
-
+    
         void xlu__cfg_yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner );
-
+    
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
  */
@@ -845,7 +845,7 @@ yy_find_action:
 			int yyl;
 			for ( yyl = yyg->yy_more_len; yyl < yyleng; ++yyl )
 				if ( yytext[yyl] == '\n' )
-
+					   
     do{ yylineno++;
         yycolumn=0;
     }while(0)
@@ -1377,7 +1377,7 @@ static int yy_get_next_buffer (yyscan_t 
 	yyg->yy_hold_char = *++yyg->yy_c_buf_p;
 
 	if ( c == '\n' )
-
+		   
     do{ yylineno++;
         yycolumn=0;
     }while(0)
@@ -1460,7 +1460,7 @@ static void xlu__cfg_yy_load_buffer_stat
     YY_BUFFER_STATE xlu__cfg_yy_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
 {
 	YY_BUFFER_STATE b;
-
+    
 	b = (YY_BUFFER_STATE) xlu__cfg_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
 	if ( ! b )
 		YY_FATAL_ERROR( "out of dynamic memory in xlu__cfg_yy_create_buffer()" );
@@ -1504,7 +1504,7 @@ static void xlu__cfg_yy_load_buffer_stat
 #ifndef __cplusplus
 extern int isatty (int );
 #endif /* __cplusplus */
-
+    
 /* Initializes or reinitializes a buffer.
  * This function is sometimes called more than once on the same buffer,
  * such as during a xlu__cfg_yyrestart() or at EOF.
@@ -1530,7 +1530,7 @@ extern int isatty (int );
     }
 
         b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-
+    
 	errno = oerrno;
 }
 
@@ -1636,9 +1636,9 @@ static void xlu__cfg_yyensure_buffer_sta
 								, yyscanner);
 		if ( ! yyg->yy_buffer_stack )
 			YY_FATAL_ERROR( "out of dynamic memory in xlu__cfg_yyensure_buffer_stack()" );
-
+								  
 		memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-
+				
 		yyg->yy_buffer_stack_max = num_to_alloc;
 		yyg->yy_buffer_stack_top = 0;
 		return;
@@ -1667,12 +1667,12 @@ static void xlu__cfg_yyensure_buffer_sta
  * @param base the character buffer
  * @param size the size in bytes of the character buffer
  * @param yyscanner The scanner object.
- * @return the newly allocated buffer state object.
+ * @return the newly allocated buffer state object. 
  */
 YY_BUFFER_STATE xlu__cfg_yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)
 {
 	YY_BUFFER_STATE b;
-
+    
 	if ( size < 2 ||
 	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
 	     base[size-1] != YY_END_OF_BUFFER_CHAR )
@@ -1708,7 +1708,7 @@ YY_BUFFER_STATE xlu__cfg_yy_scan_buffer 
  */
 YY_BUFFER_STATE xlu__cfg_yy_scan_string (yyconst char * yystr , yyscan_t yyscanner)
 {
-
+    
 	return xlu__cfg_yy_scan_bytes(yystr,strlen(yystr) ,yyscanner);
 }
 
@@ -1725,7 +1725,7 @@ YY_BUFFER_STATE xlu__cfg_yy_scan_bytes  
 	char *buf;
 	yy_size_t n;
 	int i;
-
+    
 	/* Get memory for full buffer, including space for trailing EOB's. */
 	n = _yybytes_len + 2;
 	buf = (char *) xlu__cfg_yyalloc(n ,yyscanner );
@@ -1793,10 +1793,10 @@ YY_EXTRA_TYPE xlu__cfg_yyget_extra  (yys
 int xlu__cfg_yyget_lineno  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
+    
         if (! YY_CURRENT_BUFFER)
             return 0;
-
+    
     return yylineno;
 }
 
@@ -1806,10 +1806,10 @@ int xlu__cfg_yyget_lineno  (yyscan_t yys
 int xlu__cfg_yyget_column  (yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
+    
         if (! YY_CURRENT_BUFFER)
             return 0;
-
+    
     return yycolumn;
 }
 
@@ -1870,8 +1870,8 @@ void xlu__cfg_yyset_lineno (int  line_nu
 
         /* lineno is only valid if an input buffer exists. */
         if (! YY_CURRENT_BUFFER )
-           yy_fatal_error( "xlu__cfg_yyset_lineno called with no buffer" , yyscanner);
-
+           yy_fatal_error( "xlu__cfg_yyset_lineno called with no buffer" , yyscanner); 
+    
     yylineno = line_number;
 }
 
@@ -1885,8 +1885,8 @@ void xlu__cfg_yyset_column (int  column_
 
         /* column is only valid if an input buffer exists. */
         if (! YY_CURRENT_BUFFER )
-           yy_fatal_error( "xlu__cfg_yyset_column called with no buffer" , yyscanner);
-
+           yy_fatal_error( "xlu__cfg_yyset_column called with no buffer" , yyscanner); 
+    
     yycolumn = column_no;
 }
 
@@ -1939,13 +1939,13 @@ YYLTYPE *xlu__cfg_yyget_lloc  (yyscan_t 
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     return yylloc;
 }
-
+    
 void xlu__cfg_yyset_lloc (YYLTYPE *  yylloc_param , yyscan_t yyscanner)
 {
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
     yylloc = yylloc_param;
 }
-
+    
 /* User-visible API */
 
 /* xlu__cfg_yylex_init is special because it creates the scanner itself, so it is
@@ -1993,20 +1993,20 @@ int xlu__cfg_yylex_init_extra(YY_EXTRA_T
         errno = EINVAL;
         return 1;
     }
-
+	
     *ptr_yy_globals = (yyscan_t) xlu__cfg_yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
-
+	
     if (*ptr_yy_globals == NULL){
         errno = ENOMEM;
         return 1;
     }
-
+    
     /* By setting to 0xAA, we expose bugs in
     yy_init_globals. Leave at 0x00 for releases. */
     memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
-
+    
     xlu__cfg_yyset_extra (yy_user_defined, *ptr_yy_globals);
-
+    
     return yy_init_globals ( *ptr_yy_globals );
 }
 
diff -r 159be83e5fe9 tools/libxl/libxlu_cfg_l.h
--- a/tools/libxl/libxlu_cfg_l.h	Thu Oct 06 19:44:40 2011 +0100
+++ b/tools/libxl/libxlu_cfg_l.h	Thu Oct 06 19:45:07 2011 +0100
@@ -38,7 +38,7 @@
 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
 
 /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
+ * if you want the limit (max/min) macros for int types. 
  */
 #ifndef __STDC_LIMIT_MACROS
 #define __STDC_LIMIT_MACROS 1
@@ -55,7 +55,7 @@ typedef uint32_t flex_uint32_t;
 typedef signed char flex_int8_t;
 typedef short int flex_int16_t;
 typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
+typedef unsigned char flex_uint8_t; 
 typedef unsigned short int flex_uint16_t;
 typedef unsigned int flex_uint32_t;
 
@@ -193,7 +193,7 @@ struct yy_buffer_state
 
     int yy_bs_lineno; /**< The line count. */
     int yy_bs_column; /**< The column count. */
-
+    
 	/* Whether to try to fill the input buffer when we reach the
 	 * end of it.
 	 */
@@ -281,9 +281,9 @@ YYSTYPE * xlu__cfg_yyget_lval (yyscan_t 
 void xlu__cfg_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );
 
        YYLTYPE *xlu__cfg_yyget_lloc (yyscan_t yyscanner );
-
+    
         void xlu__cfg_yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner );
-
+    
 /* Macros after this point can all be overridden by user definitions in
  * section 1.
  */

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 11:51:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 11:51:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBt2D-00047m-Gc; Thu, 06 Oct 2011 11:51:09 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBt1Q-0003vM-1a
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:50:20 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317926998!45514815!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10993 invoked from network); 6 Oct 2011 18:49:58 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	6 Oct 2011 18:49:58 -0000
X-IronPort-AV: E=Sophos;i="4.68,497,1312156800"; 
   d="scan'208";a="8258624"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 18:50: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, 6 Oct 2011 19:50:16 +0100
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
	1RBt1M-0006KL-Ci; Thu, 06 Oct 2011 18:50:16 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RBt1M-0006HG-Bz;
	Thu, 06 Oct 2011 19:50:16 +0100
From: Ian Jackson <Ian.Jackson@eu.citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 8bit
Message-ID: <20109.63592.359322.668373@mariner.uk.xensource.com>
Date: Thu, 6 Oct 2011 19:50:16 +0100
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config
In-Reply-To: <CAB3B308.224D1%keir.xen@gmail.com>
References: <987664A83D2D224EAE907B061CE93D5301EE6A3084@orsmsx505.amr.corp.intel.com>
	<CAB3B308.224D1%keir.xen@gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Juergen Gross <juergen.gross@ts.fujitsu.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Kay, Allen M" <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

Keir Fraser writes ("Re: [Xen-devel] build failure caused by $(XEN_ROOT)/.config"):
> Yes, as Ian Jackson has noted, this is because the fix for this in xen-unstable has not been backported. I think Ian Jackson may be proposing to do the backport. If not, youâ€™ll just have to manually â€˜touch .configâ€™ at the root of your Xen repository, and get on with that.

23049:ff3b7749008b applied cleanly to 4.1 and seems to build for me,
so I have pushed it.

Let's wait with doing another RC until we see that the automated
tester is happy with it :-).

Ian.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 12:06:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 12:06:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBtH3-000520-5t; Thu, 06 Oct 2011 12:06:29 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBtBj-0004Sz-6g
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 12:01:30 -0700
X-Env-Sender: Boris.Ostrovsky@amd.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1317927655!24857!1
X-Originating-IP: [216.32.180.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15560 invoked from network); 6 Oct 2011 19:00:56 -0000
Received: from va3ehsobe002.messaging.microsoft.com (HELO
	VA3EHSOBE002.bigfish.com) (216.32.180.12)
	by server-10.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	6 Oct 2011 19:00:56 -0000
Received: from mail164-va3-R.bigfish.com (10.7.14.235) by
	VA3EHSOBE002.bigfish.com (10.7.40.22) with Microsoft SMTP Server id
	14.1.225.22; Thu, 6 Oct 2011 19:00:55 +0000
Received: from mail164-va3 (localhost.localdomain [127.0.0.1])	by
	mail164-va3-R.bigfish.com (Postfix) with ESMTP id 841B518E02ED	for
	<xen-devel@lists.xensource.com>; Thu,  6 Oct 2011 19:00: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: 0,13,
Received: from mail164-va3 (localhost.localdomain [127.0.0.1]) by mail164-va3
	(MessageSwitch) id 1317927624272662_29977;
	Thu,  6 Oct 2011 19:00:24 +0000 (UTC)
Received: from VA3EHSMHS010.bigfish.com (unknown [10.7.14.245])	by
	mail164-va3.bigfish.com (Postfix) with ESMTP id 3C68A74804C	for
	<xen-devel@lists.xensource.com>; Thu,  6 Oct 2011 19:00:24 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	VA3EHSMHS010.bigfish.com (10.7.99.20) with Microsoft SMTP Server id
	14.1.225.22; Thu, 6 Oct 2011 19:00:17 +0000
X-WSS-ID: 0LSNRGE-02-1K2-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 2E327C8093	for <xen-devel@lists.xensource.com>;
	Thu,  6 Oct 2011 14:00:13 -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.106.1;
	Thu, 6 Oct 2011 14:00:29 -0500
Received: from optimon.amd.com (163.181.34.104) by sausexhtp02.amd.com
	(163.181.3.152) with Microsoft SMTP Server (TLS) id 8.3.83.0;
	Thu, 6 Oct 2011 14:00:13 -0500
Received: from f15-sabine (ostr-Sabine.amd.com [10.234.222.53])	by
	optimon.amd.com (8.12.10/8.12.10) with ESMTP id p96J0DuB005653;
	Thu, 6 Oct 2011 14:00:13 -0500
Received: (from root@localhost)	by f15-sabine (8.14.5/8.14.5/Submit) id
	p96IxUGi001264;	Thu, 6 Oct 2011 14:59:30 -0400
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 4374a261682e78d6bbf3b3fefb1e779b7a1fc3b3
Message-ID: <4374a261682e78d6bbf3.1317927545@f15-sabine>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Thu, 6 Oct 2011 14:59:05 -0400
From: Boris Ostrovsky <boris.ostrovsky@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Cc: boris.ostrovsky@amd.com
Subject: [Xen-devel] [PATCH] x86/AMD: Do not enable ARAT feature on AMD
 processors below family 0x12
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Boris Ostrovsky <boris.ostrovsky@amd.com>
# Date 1317915395 14400
# Node ID 4374a261682e78d6bbf3b3fefb1e779b7a1fc3b3
# Parent  0b66e6450ffe6823d8b323ef4248b38fe7372d54
x86/AMD: Do not enable ARAT feature on AMD processors below family 0x12

Determining whether an AMD processor is affected by erratum 400 may
have some corner cases and handling these cases is somewhat complicated.
In the interest of simplicity we won't claim ARAT support on processor
families below 0x12.

Mirrors Linux commit e9cdd343a5e42c43bcda01e609fa23089e026470

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@amd.com>

diff -r 0b66e6450ffe -r 4374a261682e xen/arch/x86/cpu/amd.c
--- a/xen/arch/x86/cpu/amd.c	Tue Oct 04 14:18:30 2011 +0200
+++ b/xen/arch/x86/cpu/amd.c	Thu Oct 06 11:36:35 2011 -0400
@@ -495,8 +495,11 @@
 	}
 #endif
 
-	/* As a rule processors have APIC timer running in deep C states */
-	if (c->x86 > 0xf && !cpu_has_amd_erratum(c, AMD_ERRATUM_400))
+	/*
+	 * Family 0x12 and above processors have APIC timer
+	 * running in deep C states.
+	 */
+	if (c->x86 > 0x11)
 		set_bit(X86_FEATURE_ARAT, c->x86_capability);
 
 	if (cpuid_edx(0x80000007) & (1 << 10)) {


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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 12:23:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 12:23:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBtXK-0001MD-91; Thu, 06 Oct 2011 12:23:18 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBtWu-00019w-BJ
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 12:22:52 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1317928932!51057073!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20219 invoked from network); 6 Oct 2011 19:22:13 -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;
	6 Oct 2011 19:22:13 -0000
X-IronPort-AV: E=Sophos;i="4.68,498,1312156800"; 
   d="scan'208";a="8259050"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 19:22: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; Thu, 6 Oct 2011 20:22:49 +0100
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 1RBtWq-0006VB-Fh;
	Thu, 06 Oct 2011 19:22:48 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RBtWq-0001LU-8j;
	Thu, 06 Oct 2011 20:22:48 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9195-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 6 Oct 2011 20:22:48 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9195: 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 9195 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9195/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     13 guest-localmigrate.2       fail REGR. vs. 9193

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                  88b6e08b8aa8
baseline version:
 xen                  0b66e6450ffe

------------------------------------------------------------
People who touched revisions under test:
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  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:   23908:88b6e08b8aa8
tag:         tip
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 06 14:15:43 2011 +0100
    
    p2m: query/modify p2mt with p2m_lock held
    
    Query and update the p2mt in set_mmio_p2m_entry, clear_mmio_p2m_entry
    and set_shared_p2m_entry with the p2m_lock held.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23907:71844f889e3e
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 06 12:52:18 2011 +0100
    
    p2m: use correct p2m_type_t in clear_mmio_p2m_entry
    
    clear_mmio_p2m_entry() should mark the gfn as invalid.
    Use proper name instead of numerical value. The currently used value of
    zero means p2m_ram_rw.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23906:7bf85c3fd9f0
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 06 12:33:17 2011 +0100
    
    xenpaging: remove confusing comment from p2m_mem_paging_populate
    
    Currently there is no way to avoid the double check of the p2mt
    because p2m_mem_paging_populate() is called from many places without
    the p2m_lock held. Upcoming changes will move the function into
    gfn_to_mfn(), so its interface could be changed and the extra
    p2m_lock/get_entry can be removed.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23905:50ee6be56460
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 06 12:33:17 2011 +0100
    
    xenpaging: fix locking in p2m_mem_paging functions
    
    As suggested by <hongkaixing@huawei.com>, query and adjust the p2mt
    under the p2m_lock to prevent races with PoD.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23904:ecab267b85ef
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 06 12:33:17 2011 +0100
    
    xenpaging: use p2m->get_entry() in p2m_mem_paging functions
    
    Use p2m->get_entry() in the p2m_mem_paging functions. This preserves the
    p2m_access type when gfn is updated with set_p2m_entry().
    Its also a preparation for locking fixes in a subsequent patch.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23903:0b66e6450ffe
user:        Jan Beulich <jbeulich@suse.com>
date:        Tue Oct 04 14:18:30 2011 +0200
    
    use xzalloc in x86 code
    
    This includes the removal of a redundant memset() from microcode_amd.c.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
========================================
commit cd776ee9408ff127f934a707c1a339ee600bc127
Author: Ian Jackson <ian.jackson@eu.citrix.com>
Date:   Tue Jun 28 13:50:53 2011 +0100

    qemu-char.c: fix incorrect CONFIG_STUBDOM handling
    
    qemu-char.c:1123:7: warning: "CONFIG_STUBDOM" is not defined [-Wundef]
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-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 Thu Oct 06 12:31:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 12:31:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBtez-0002Tp-Bo; Thu, 06 Oct 2011 12:31:13 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBtcb-0001n0-21
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 12:28:46 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-12.tower-27.messagelabs.com!1317929304!45556216!1
X-Originating-IP: [71.74.56.124]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4515 invoked from network); 6 Oct 2011 19:28:24 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.124) by server-12.tower-27.messagelabs.com with SMTP;
	6 Oct 2011 19:28:24 -0000
X-Authority-Analysis: v=1.1 cv=agqPq5NoKwAPC9P66H7dbYUCjxvmT73as08i4x3aqAA=
	c=1 sm=0 a=msyzJTVhAHgA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=AH-lfbgdtNEcOgX23IsA:9
	a=vJcPFCk81GmUwGN446QA:7 a=PUjeQqilurYA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:44076] helo=[192.168.23.10])
	by hrndva-oedge01.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 3D/26-12608-7610E8E4; Thu, 06 Oct 2011 19:28:41 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Richard Henderson <rth@redhat.com>
Date: Thu, 06 Oct 2011 15:28:39 -0400
In-Reply-To: <4E8DF870.6010000@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317929321.4729.17.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, the,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-06 at 11:50 -0700, Richard Henderson wrote:
> On 10/06/2011 11:26 AM, Steven Rostedt wrote:
>  
> > 
> > That jmp to l_yes should easily be a two byte jump.
> 
> Until the compiler decides to re-order the code.  That's the problem --
> in the general case you do not know how far away the destination is really
> going to be.

Yeah, I was discussing this with Peter Zijlstra on IRC.

> 
> There are a couple of possibilities for improvement:
> 
> (1) Do as Jason suggests above and let the assembler figure out the size
> of the branch that is needed.  Without adding more data to __jump_table,
> you'll want to be extremely careful about checking the two pointers to 
> see what size branch has been installed.

Yeah, that could be done at patch time.


> 
> (2) Always reserve 5 bytes of space, but if the distance is small enough
> patch in a 2-byte jump.  That doesn't help with the icache footprint.

I don't think this one is worth it.

-- Steve


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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 12:34:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 12:34:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBtiP-0002uQ-3D; Thu, 06 Oct 2011 12:34:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBthz-0002ip-UP
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 12:34:20 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-15.tower-21.messagelabs.com!1317929658!53501842!1
X-Originating-IP: [71.74.56.124]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25455 invoked from network); 6 Oct 2011 19:34:18 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.124) by server-15.tower-21.messagelabs.com with SMTP;
	6 Oct 2011 19:34:18 -0000
X-Authority-Analysis: v=1.1 cv=lfM0d0QHaVz67dfwwr9cyIw6NbaGR/pZhMD6XWNi0kk=
	c=1 sm=0 a=msyzJTVhAHgA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=VKzB9fIMzP--0FXAUagA:9
	a=yuKKYf7CDWY9T4GQFk8A:7 a=PUjeQqilurYA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:44084] helo=[192.168.23.10])
	by hrndva-oedge03.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 9F/81-12229-5B20E8E4; Thu, 06 Oct 2011 19:34:16 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jason Baron <jbaron@redhat.com>
Date: Thu, 06 Oct 2011 15:34:13 -0400
In-Reply-To: <20111006183841.GC2505@redhat.com>
References: <20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF385.3070009@zytor.com> <20111006183841.GC2505@redhat.com>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317929656.4729.22.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: Linux, Jan, Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Glauber <jang@linux.vnet.ibm.com>,
	Mailing List <linux-kernel@vger.kernel.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-06 at 14:38 -0400, Jason Baron wrote:

> Right, its certainly doable, but I'm not sure its so simple, since we'll
> need a pass to eliminate the jumps - which can be keyed off the
> '__jump_table' section. 

Look at the code of scripts/recordmcount.c and friends.

It does two things.

1) find all the callers of mcount and make a section for it.

2) For those callers of mcount that is in sections that are not
whitelisted, and therefor will not be patched, to replace the call to
mcount with a nop.


We can use this code, or a copy of it, to do the same with jump_label.
Have the x86 jump_label be:


static __always_inline bool arch_static_branch(struct jump_label_key
*key)
{
	asm goto("1:"
		"jmp l_yes\n"
		".pushsection __jump_table,  \"aw\" \n\t"
		_ASM_ALIGN "\n\t"
		_ASM_PTR "1b, %l[l_yes], %c0 \n\t"
		".popsection \n\t"
		: :  "i" (key) : : l_yes);
	return false;
l_yes:
	return true;
}

Then have the record_jumplabel.c (or whatever it's called) find all the
jmps at run time, and convert them into the appropriate nop.

Then at runtime patching, the jumplabel code could figure out what size
jump it needs to replace it.

-- Steve



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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 13:46:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 13:46:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBuq2-0000zJ-C5; Thu, 06 Oct 2011 13:46:42 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBupD-0000ki-1h
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 13:45:51 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317933928!45522383!1
X-Originating-IP: [71.74.56.123]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16226 invoked from network); 6 Oct 2011 20:45:29 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.123) by server-11.tower-21.messagelabs.com with SMTP;
	6 Oct 2011 20:45:29 -0000
X-Authority-Analysis: v=1.1 cv=XWD5/VRj2HUJOhsR8cgmvPBlhMACpZXxseY1Kn/ehQI=
	c=1 sm=0 a=msyzJTVhAHgA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=Hsptb0i6piVC7Twp2wYA:9
	a=PUjeQqilurYA:10 a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:45453] helo=[192.168.23.10])
	by hrndva-oedge02.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id B5/75-07715-A731E8E4; Thu, 06 Oct 2011 20:45:47 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jason Baron <jbaron@redhat.com>
Date: Thu, 06 Oct 2011 16:45:45 -0400
In-Reply-To: <20111006203358.GA5985@redhat.com>
References: <20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF385.3070009@zytor.com> <20111006183841.GC2505@redhat.com>
	<1317929656.4729.22.camel@gandalf.stny.rr.com>
	<20111006203358.GA5985@redhat.com>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317933947.4729.25.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: Linux, Jan, Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Glauber <jang@linux.vnet.ibm.com>,
	Mailing List <linux-kernel@vger.kernel.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-06 at 16:33 -0400, Jason Baron wrote:

> > Then have the record_jumplabel.c (or whatever it's called) find all the
> > jmps at run time, and convert them into the appropriate nop.
> > 
> 
> I'd prefer to do this at build-time as hpa said. We don't want there to
> be some race b/w patching in the no-ops and taking an incorrect branch.

Yep, this record_jumplabel.c would execute at build time. Just like the
record_mcount.c does.

> 
> > Then at runtime patching, the jumplabel code could figure out what size
> > jump it needs to replace it.

The runtime patching is when we can figure out what size the compiler
used. That wont change. It should be pretty trivial to do. I can't see
any races here.

-- Steve





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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 14:34:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 14:34:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBvaM-0004RY-9C; Thu, 06 Oct 2011 14:34:34 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBvZQ-0004Ce-Gf
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 14:33:38 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1317936811!37031318!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7706 invoked from network); 6 Oct 2011 21:33:31 -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;
	6 Oct 2011 21:33:31 -0000
X-IronPort-AV: E=Sophos;i="4.68,498,1312156800"; 
   d="scan'208";a="8261010"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 21:33: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; Thu, 6 Oct 2011 22:33:33 +0100
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 1RBvZN-0007ED-07;
	Thu, 06 Oct 2011 21:33:33 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RBvZM-0000lx-Nc;
	Thu, 06 Oct 2011 22:33:32 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9196-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 6 Oct 2011 22:33:32 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9196: 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 9196 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9196/

Regressions :-(

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

Tests which are failing intermittently (not blocking):
 build-amd64-pvops             4 kernel-build                 fail pass in 9194

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-pcipt-intel  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-xl           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  9 guest-start.2                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-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-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 9194 never pass
 test-amd64-amd64-win         16 leak-check/check       fail in 9194 never pass
 test-amd64-amd64-xl-win      13 guest-stop             fail in 9194 never pass

version targeted for testing:
 xen                  1f95ac601974
baseline version:
 xen                  d7e0e9f37874

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Tim Deegan <tim@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            fail    
 build-i386-pvops                                             pass    
 test-amd64-amd64-xl                                          blocked 
 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                              blocked 
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 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                                           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:   23165:1f95ac601974
tag:         tip
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 06 12:52:18 2011 +0100
    
    p2m: use correct p2m_type_t in clear_mmio_p2m_entry
    
    clear_mmio_p2m_entry() should mark the gfn as invalid.
    Use proper name instead of numerical value. The currently used value of
    zero means p2m_ram_rw.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    xen-unstable changeset:   23898:3d1664cc9e45
    xen-unstable date:        Thu Oct 06 12:52:18 2011 +0100
    
    
changeset:   23164:d7e0e9f37874
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Mon Oct 03 16:33:29 2011 +0100
    
    build: fix grep invocation in cc-options
    
    Currently the build produces lots of
            Usage: grep [OPTION]... PATTERN [FILE]...
            Try `grep --help' for more information.
    
    This is due to the "grep -- $(2)" in cc-options. It seems that the
    default of reading stdin is disabled when using "--". I don't know if
    this is a bug in grep or how it is supposed to be but we can work
    around it by explicitly passing in "-"
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   23898:3d1664cc9e45
    xen-unstable date:        Fri Sep 30 21:17:47 2011 +0100
    
    
(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 Oct 06 14:41:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 14:41:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBvhA-0005JS-RC; Thu, 06 Oct 2011 14:41:36 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBvgH-00055w-OW
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 14:40:42 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317937236!34282327!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20487 invoked from network); 6 Oct 2011 21:40:38 -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; 6 Oct 2011 21:40:38 -0000
Received: from saboo.goop.org (mb75636d0.tmodns.net [208.54.86.183])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 1221289EF;
	Thu,  6 Oct 2011 14:40:35 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 4A37820C70;
	Thu,  6 Oct 2011 14:39:49 -0700 (PDT)
Message-ID: <4E8E2025.30004@goop.org>
Date: Thu, 06 Oct 2011 14:39:49 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<4E8DEFDE.4030706@zytor.com>
In-Reply-To: <4E8DEFDE.4030706@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/06/2011 11:13 AM, H. Peter Anvin wrote:
> On 10/06/2011 11:10 AM, Jason Baron wrote:
>> It would be cool if we could make the total width 2-bytes, when
>> possible.  It might be possible by making the initial 'JUMP_LABEL_INITIAL_NOP'
>> as a 'jmp' to the 'l_yes' label. And then patching that with a no-op at boot
>> time or link time - letting the compiler pick the width. In that way we could
>> get the optimal width...
>>
> Yes, that would be a win just based on icache footprint alone.

I'm not sure it would be a win, necessarily.  My test with back-to-back
jmp2 was definitely slower than with the nop padding it out to 5 bytes;
I suspect that's a result of having too many jmps within one cacheline. 
Of course, there's no reason why the CPU would optimise for jumps to
jumps, so perhaps its just hitting a "stupid programmer" path.

    J

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 14:43:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 14:43:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBvj5-0005he-CN; Thu, 06 Oct 2011 14:43:35 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBviJ-0005Uq-09
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 14:42:47 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-16.tower-216.messagelabs.com!1317937361!41434!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31179 invoked from network); 6 Oct 2011 21:42:43 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-16.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 6 Oct 2011 21:42:43 -0000
Received: from saboo.goop.org (mb75636d0.tmodns.net [208.54.86.183])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 9F716113;
	Thu,  6 Oct 2011 14:42:40 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id D68A2202CE;
	Thu,  6 Oct 2011 14:42:37 -0700 (PDT)
Message-ID: <4E8E20CD.5030207@goop.org>
Date: Thu, 06 Oct 2011 14:42:37 -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: Steven Rostedt <rostedt@goodmis.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
In-Reply-To: <1317929321.4729.17.camel@gandalf.stny.rr.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/06/2011 12:28 PM, Steven Rostedt wrote:
>> (2) Always reserve 5 bytes of space, but if the distance is small enough
>> patch in a 2-byte jump.  That doesn't help with the icache footprint.
> I don't think this one is worth it.

I disagree.  This is what I benchmarked as having a 5% improvement.  If
squashing out the padding helps, then that's a separate optimisation.

    J

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 15:08:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 15:08:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBw6q-0006dp-5p; Thu, 06 Oct 2011 15:08:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBw55-0006Qf-JU
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 15:06:40 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-8.tower-174.messagelabs.com!1317938775!20596862!1
X-Originating-IP: [71.74.56.125]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4959 invoked from network); 6 Oct 2011 22:06:15 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.125) by server-8.tower-174.messagelabs.com with SMTP;
	6 Oct 2011 22:06:15 -0000
X-Authority-Analysis: v=1.1 cv=agqPq5NoKwAPC9P66H7dbYUCjxvmT73as08i4x3aqAA=
	c=1 sm=0 a=msyzJTVhAHgA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=IBu5faARPO_BLb2dZK8A:9
	a=PUjeQqilurYA:10 a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:46037] helo=[192.168.23.10])
	by hrndva-oedge01.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 37/57-12608-5562E8E4; Thu, 06 Oct 2011 22:06:15 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Thu, 06 Oct 2011 18:06:13 -0400
In-Reply-To: <4E8E20CD.5030207@goop.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317938775.4729.29.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, "H.
	Peter Anvin" <hpa@zytor.com>, the, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-06 at 14:42 -0700, Jeremy Fitzhardinge wrote:
> On 10/06/2011 12:28 PM, Steven Rostedt wrote:
> >> (2) Always reserve 5 bytes of space, but if the distance is small enough
> >> patch in a 2-byte jump.  That doesn't help with the icache footprint.
> > I don't think this one is worth it.
> 
> I disagree.  This is what I benchmarked as having a 5% improvement.  If
> squashing out the padding helps, then that's a separate optimisation.

But it only speeds up the tracing case. The non-tracing case is a nop
and 5bytes is 5bytes regardless.

Did you see a 5% speed up while tracing was happening? How did you do
your test. I find a 5 byte compared to a 2 byte jump being negligible
with the rest of the overhead of tracing, but I could be wrong.

-- Steve
 


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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 15:09:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 15:09:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBw8F-00071F-7n; Thu, 06 Oct 2011 15:09:35 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBw7L-0006jU-8u
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 15:08:42 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-13.tower-27.messagelabs.com!1317938902!43174189!1
X-Originating-IP: [71.74.56.123]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11532 invoked from network); 6 Oct 2011 22:08:22 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.123) by server-13.tower-27.messagelabs.com with SMTP;
	6 Oct 2011 22:08:22 -0000
X-Authority-Analysis: v=1.1 cv=agqPq5NoKwAPC9P66H7dbYUCjxvmT73as08i4x3aqAA=
	c=1 sm=0 a=msyzJTVhAHgA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=NeFGGJOzwF8m_8lAuY4A:9
	a=PUjeQqilurYA:10 a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:46042] helo=[192.168.23.10])
	by hrndva-oedge01.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 66/09-12608-3E62E8E4; Thu, 06 Oct 2011 22:08:35 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Thu, 06 Oct 2011 18:08:34 -0400
In-Reply-To: <4E8E2025.30004@goop.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<4E8DEFDE.4030706@zytor.com> <4E8E2025.30004@goop.org>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317938915.4729.31.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: Linux, Jan, the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Glauber <jang@linux.vnet.ibm.com>,
	Mailing List <linux-kernel@vger.kernel.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-06 at 14:39 -0700, Jeremy Fitzhardinge wrote:

> I'm not sure it would be a win, necessarily.  My test with back-to-back
> jmp2 was definitely slower than with the nop padding it out to 5 bytes;
> I suspect that's a result of having too many jmps within one cacheline. 
> Of course, there's no reason why the CPU would optimise for jumps to
> jumps, so perhaps its just hitting a "stupid programmer" path.

Just a note. Micro-benchmarks are known to be as good as political polls
and statistics. They show a much different view of the world than what
is really there.

-- Steve



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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 15:11:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 15:11:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBw9u-0007PV-93; Thu, 06 Oct 2011 15:11:18 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBw9R-0007D2-2h
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 15:10:49 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-216.messagelabs.com!1317939044!42544!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4723 invoked from network); 6 Oct 2011 22:10:45 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 6 Oct 2011 22:10:45 -0000
Received: from saboo.goop.org (mb42836d0.tmodns.net [208.54.40.180])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id E867C8A38;
	Thu,  6 Oct 2011 15:10:42 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id C5D862094E;
	Thu,  6 Oct 2011 15:10:39 -0700 (PDT)
Message-ID: <4E8E275F.6010801@goop.org>
Date: Thu, 06 Oct 2011 15:10:39 -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: Steven Rostedt <rostedt@goodmis.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
In-Reply-To: <1317938775.4729.29.camel@gandalf.stny.rr.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/06/2011 03:06 PM, Steven Rostedt wrote:
> But it only speeds up the tracing case. The non-tracing case is a nop
> and 5bytes is 5bytes regardless.
>
> Did you see a 5% speed up while tracing was happening? How did you do
> your test. I find a 5 byte compared to a 2 byte jump being negligible
> with the rest of the overhead of tracing, but I could be wrong.

You're right, this was a completely artificial microbenchmark.  In
practice the improvement would be a much smaller effect.

But bear in mind, I'm not using jump-label for tracing.  While its
important for the "disabled" state to be quick, performance of the
"enabled" state is also important.

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 Oct 06 15:21:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 15:21:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBwJe-0007v4-BJ; Thu, 06 Oct 2011 15:21:22 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBwJB-0007iq-CH
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 15:20:53 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-15.tower-182.messagelabs.com!1317939650!20258512!1
X-Originating-IP: [71.74.56.125]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7741 invoked from network); 6 Oct 2011 22:20:50 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.125) by server-15.tower-182.messagelabs.com with SMTP;
	6 Oct 2011 22:20:50 -0000
X-Authority-Analysis: v=1.1 cv=lfM0d0QHaVz67dfwwr9cyIw6NbaGR/pZhMD6XWNi0kk=
	c=1 sm=0 a=msyzJTVhAHgA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=bRjG9fRkdTCjW9-B8xYA:9
	a=PUjeQqilurYA:10 a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:46107] helo=[192.168.23.10])
	by hrndva-oedge03.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 30/E6-12229-FB92E8E4; Thu, 06 Oct 2011 22:20:49 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Thu, 06 Oct 2011 18:20:47 -0400
In-Reply-To: <4E8E275F.6010801@goop.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
	<4E8E275F.6010801@goop.org>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317939649.4729.36.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, "H.
	Peter Anvin" <hpa@zytor.com>, the, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-06 at 15:10 -0700, Jeremy Fitzhardinge wrote:
> On 10/06/2011 03:06 PM, Steven Rostedt wrote:

> But bear in mind, I'm not using jump-label for tracing.  While its
> important for the "disabled" state to be quick, performance of the
> "enabled" state is also important.

Sorry, I'm still thinking jump-label for tracing over.

But that said, having the nop match is the best of both worlds.

I think having a update_jumplabel.c that is just like the
record_mcount.c which modifies the code right after it was compiled is
the best thing to do. That is, have the assembler determine what size
jumps to use and update them to nops right in the object file before
linking. This should be rather trivial to do.

-- Steve



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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 16:27:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 16:27:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBxLs-0002Dn-AG; Thu, 06 Oct 2011 16:27:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBxLF-00021z-KQ
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 16:27:06 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1317943594!58107296!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4161 invoked from network); 6 Oct 2011 23:26:34 -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;
	6 Oct 2011 23:26:34 -0000
X-IronPort-AV: E=Sophos;i="4.68,499,1312156800"; 
   d="scan'208";a="8261961"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	06 Oct 2011 23:27:02 +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, 7 Oct 2011 00:27:01 +0100
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 1RBxLB-0007rK-D1;
	Thu, 06 Oct 2011 23:27:01 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RBxLB-0003gH-6o;
	Fri, 07 Oct 2011 00:27:01 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9198-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 00:27:01 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9198: 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 9198 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9198/

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-amd64-xl-sedf     14 guest-localmigrate/x10       fail    like 9193
 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                  159be83e5fe9
baseline version:
 xen                  0b66e6450ffe

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Daniel De Graaf <dgdegra@tycho.nsa.gov>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Tim Deegan <tim@xen.org>
  Zheng Li <dev@zheng.li>
------------------------------------------------------------

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=159be83e5fe9
+ . 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 159be83e5fe9
+ branch=xen-unstable
+ revision=159be83e5fe9
+ . 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 159be83e5fe9 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 21 changesets with 48 changes to 33 files

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 18:22:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 18:22:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBz8s-00058V-FP; Thu, 06 Oct 2011 18:22:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBz7s-0004vV-VZ
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 18:21:25 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317950481!19465451!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15020 invoked from network); 7 Oct 2011 01:21:21 -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;
	7 Oct 2011 01:21:21 -0000
X-IronPort-AV: E=Sophos;i="4.68,499,1312156800"; 
   d="scan'208";a="8262337"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 01:21: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; Fri, 7 Oct 2011 02:21:20 +0100
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 1RBz7l-0008UG-GF;
	Fri, 07 Oct 2011 01:21:17 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RBz7l-0004kS-Bm;
	Fri, 07 Oct 2011 02:21:17 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9199-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 02:21:17 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9199: 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 9199 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9199/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      7 debian-install             fail REGR. vs. 9185
 test-amd64-i386-rhel6hvm-amd  7 redhat-install             fail REGR. vs. 9185

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-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                  460b613596fa
baseline version:
 xen                  d7e0e9f37874

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Stefano Stabellini <stefano.stabellini@eu.citrix.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:   23168:460b613596fa
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 06 20:03:56 2011 +0100
    
    Do not re-define XEN_ROOT in hypervisor sub-Makefiles.
    
    We can globally export it from xen/Makefile instead, as all hypervisor
    builds have this Makefile at their root.
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   23048:5069eaaa9f79
    xen-unstable date:        Thu Mar 17 08:04:10 2011 +0000
    
    
changeset:   23167:2e840539a705
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 06 19:47:14 2011 +0100
    
    build: Make XEN_ROOT an absolute path.
    
    Otherwise make can search the path relative to certain standard paths
    such as /usr/include (e.g., the line '-include $(XEN_ROOT)/.config' in
    Config.mk suffers from this).
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    xen-unstable changeset: 23049:ff3b7749008b
    Backport-requested-by: Allen M Kay <allen.m.kay@intel.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23166:71712ce9190a
user:        Stefano Stabellini <stefano.stabellini@eu.citrix.com>
date:        Thu Oct 06 19:06:20 2011 +0100
    
    libxl: Fix segfault in get_all_assigned_devices
    
    pcidevs is an array of ndev elements (ndev is the number of pci devices
    assigend to a specific domain), but we access pcidevs + *num
    where *num is the global number of pci devices assigned so far to all
    domains in the system.
    
    Fix the issue removing pcidevs and just realloc'ing *list every time we
    want to add a new pci device to the array.
    
    Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    xen-unstable changeset: 23685:5239811f92e1
    Backport-requested-by: Andrew Cooper <andrew.cooper3@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23165:1f95ac601974
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 06 12:52:18 2011 +0100
    
    p2m: use correct p2m_type_t in clear_mmio_p2m_entry
    
    clear_mmio_p2m_entry() should mark the gfn as invalid.
    Use proper name instead of numerical value. The currently used value of
    zero means p2m_ram_rw.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    xen-unstable changeset:   23898:3d1664cc9e45
    xen-unstable date:        Thu Oct 06 12:52:18 2011 +0100
    
    
changeset:   23164:d7e0e9f37874
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Mon Oct 03 16:33:29 2011 +0100
    
    build: fix grep invocation in cc-options
    
    Currently the build produces lots of
            Usage: grep [OPTION]... PATTERN [FILE]...
            Try `grep --help' for more information.
    
    This is due to the "grep -- $(2)" in cc-options. It seems that the
    default of reading stdin is disabled when using "--". I don't know if
    this is a bug in grep or how it is supposed to be but we can work
    around it by explicitly passing in "-"
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   23898:3d1664cc9e45
    xen-unstable date:        Fri Sep 30 21:17:47 2011 +0100
    
    
(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 Oct 06 18:52:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 18:52:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBzc6-0006Fg-5m; Thu, 06 Oct 2011 18:52:38 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBzbC-00063H-8w
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 18:51:42 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1317952298!34273072!1
X-Originating-IP: [192.55.52.88]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9773 invoked from network); 7 Oct 2011 01:51:39 -0000
Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88)
	by server-11.tower-174.messagelabs.com with SMTP;
	7 Oct 2011 01:51:39 -0000
Received: from fmsmga001.fm.intel.com ([10.253.24.23])
	by fmsmga101.fm.intel.com with ESMTP; 06 Oct 2011 18:51:37 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,499,1312182000"; d="scan'208";a="71123617"
Received: from orsmsx603.amr.corp.intel.com ([10.22.226.49])
	by fmsmga001.fm.intel.com with ESMTP; 06 Oct 2011 18:51:34 -0700
Received: from orsmsx606.amr.corp.intel.com (10.22.226.128) by
	orsmsx603.amr.corp.intel.com (10.22.226.49) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Thu, 6 Oct 2011 18:51:33 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx606.amr.corp.intel.com ([10.22.226.128]) with mapi;
	Thu, 6 Oct 2011 18:51:33 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jan Beulich <JBeulich@suse.com>, "xen-devel@lists.xensource.com"
	<xen-devel@lists.xensource.com>
Date: Thu, 6 Oct 2011 18:51:31 -0700
Thread-Topic: [PATCH] VT-d: don't reject possibly valid DRHD or RMRR
Thread-Index: AcyCiP125+JDV0W7RZe0puJ1P6SiVgCB9zng
Message-ID: <987664A83D2D224EAE907B061CE93D5301EE709B4D@orsmsx505.amr.corp.intel.com>
References: <4E8B0A5F0200007800059286@nat28.tlf.novell.com>
In-Reply-To: <4E8B0A5F0200007800059286@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: 
Subject: [Xen-devel] RE: [PATCH] VT-d: don't reject possibly valid DRHD or
	RMRR
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 RMRR case, looks like you miss the following change (or something simil=
ar):

-for ( i =3D 0; i < rmrru->scope.devices_cnt; i++ )
+for (; i < rmrru->scope.devices_cnt; i++ )

Otherwise, the logic for handling non-zero PCI segments looks reasonable.

Allen

-----Original Message-----
From: Jan Beulich [mailto:JBeulich@suse.com]=20
Sent: Tuesday, October 04, 2011 4:30 AM
To: xen-devel@lists.xensource.com
Cc: Kay, Allen M
Subject: [PATCH] VT-d: don't reject possibly valid DRHD or RMRR

If a non-zero PCI segment isn't accessible during Xen boot (because
firmware decided to not enter the necessary MMIO space into the E820
table), devices referred to on those segments through DRHD or RMRR
structures should not be rejected just because the devices can't be
found.

This is in line with what is being done in at least one other case
already: Systems with more than one PCI segment (usually high end
ones) are assumed to have valid firmware provided data, while systems
with just segment 0 continue to have their firmware tables validated.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/passthrough/pci.c
+++ b/xen/drivers/passthrough/pci.c
@@ -53,6 +53,11 @@ static inline struct pci_seg *get_pseg(u
     return radix_tree_lookup(&pci_segments, seg);
 }
=20
+bool_t pci_known_segment(u16 seg)
+{
+    return get_pseg(seg) !=3D NULL;
+}
+
 static struct pci_seg *alloc_pseg(u16 seg)
 {
     struct pci_seg *pseg =3D get_pseg(seg);
--- a/xen/drivers/passthrough/vtd/dmar.c
+++ b/xen/drivers/passthrough/vtd/dmar.c
@@ -444,10 +444,14 @@ acpi_parse_one_drhd(struct acpi_dmar_ent
     else
     {
         u8 b, d, f;
-        int i, invalid_cnt =3D 0;
+        unsigned int i =3D 0, invalid_cnt =3D 0;
         void *p;
=20
-        for ( i =3D 0, p =3D dev_scope_start; i < dmaru->scope.devices_cnt=
;
+        /* Skip checking if segment is not accessible yet. */
+        if ( !pci_known_segment(drhd->segment) )
+            i =3D UINT_MAX;
+
+        for ( p =3D dev_scope_start; i < dmaru->scope.devices_cnt;
               i++, p +=3D ((struct acpi_dev_scope *)p)->length )
         {
             if ( ((struct acpi_dev_scope *)p)->dev_type =3D=3D ACPI_DEV_IO=
APIC ||
@@ -549,7 +553,12 @@ acpi_parse_one_rmrr(struct acpi_dmar_ent
     else
     {
         u8 b, d, f;
-        int i, ignore =3D 0;
+        bool_t ignore =3D 0;
+        unsigned int i =3D 0;
+
+        /* Skip checking if segment is not accessible yet. */
+        if ( !pci_known_segment(rmrr->segment) )
+            i =3D UINT_MAX;
=20
         for ( i =3D 0; i < rmrru->scope.devices_cnt; i++ )
         {
--- a/xen/include/xen/pci.h
+++ b/xen/include/xen/pci.h
@@ -82,6 +82,7 @@ enum {
     DEV_TYPE_PCI,
 };
=20
+bool_t pci_known_segment(u16 seg);
 int pci_device_detect(u16 seg, u8 bus, u8 dev, u8 func);
 int scan_pci_devices(void);
 int pdev_type(u16 seg, u8 bus, u8 devfn);




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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 19:04:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 19:04:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBzny-0006nn-S8; Thu, 06 Oct 2011 19:04:54 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBzkF-0006YZ-9u
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 19:01:55 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1317952839!47163894!1
X-Originating-IP: [192.55.52.93]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22129 invoked from network); 7 Oct 2011 02:00:40 -0000
Received: from mga11.intel.com (HELO mga11.intel.com) (192.55.52.93)
	by server-8.tower-27.messagelabs.com with SMTP;
	7 Oct 2011 02:00:40 -0000
Received: from fmsmga002.fm.intel.com ([10.253.24.26])
	by fmsmga102.fm.intel.com with ESMTP; 06 Oct 2011 19:00:57 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,499,1312182000"; d="scan'208";a="75592495"
Received: from orsmsx602.amr.corp.intel.com ([10.22.226.211])
	by fmsmga002.fm.intel.com with ESMTP; 06 Oct 2011 19:00:57 -0700
Received: from orsmsx605.amr.corp.intel.com (10.22.226.10) by
	orsmsx602.amr.corp.intel.com (10.22.226.211) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Thu, 6 Oct 2011 19:00:57 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx605.amr.corp.intel.com ([10.22.226.10]) with mapi; Thu, 6 Oct 2011
	19:00:57 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jan Beulich <JBeulich@suse.com>, "xen-devel@lists.xensource.com"
	<xen-devel@lists.xensource.com>
Date: Thu, 6 Oct 2011 19:00:55 -0700
Thread-Topic: [PATCH] passthrough: update bus2bridge mapping as PCI devices
	get added/removed
Thread-Index: AcyCh/IrkHvXVCJUROekhAfvhSwM/ACDG17g
Message-ID: <987664A83D2D224EAE907B061CE93D5301EE709B54@orsmsx505.amr.corp.intel.com>
References: <4E8B08A10200007800059278@nat28.tlf.novell.com>
In-Reply-To: <4E8B08A10200007800059278@nat28.tlf.novell.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: multipart/mixed;
	boundary="_002_987664A83D2D224EAE907B061CE93D5301EE709B54orsmsx505amrc_"
MIME-Version: 1.0
Cc: 
Subject: [Xen-devel] RE: [PATCH] passthrough: update bus2bridge mapping as
	PCI devices get added/removed
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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_987664A83D2D224EAE907B061CE93D5301EE709B54orsmsx505amrc_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Hi Jan,

I'm not able to spot the difference between this patch and the earlier one =
you had second thoughts about in attached email.  Was there a change I miss=
ed?

Allen

-----Original Message-----
From: Jan Beulich [mailto:JBeulich@suse.com]=20
Sent: Tuesday, October 04, 2011 4:23 AM
To: xen-devel@lists.xensource.com
Cc: Kay, Allen M
Subject: [PATCH] passthrough: update bus2bridge mapping as PCI devices get =
added/removed

This deals with two limitations at once: On device removal, the
mapping did not get updated so far at all, and hotplugged devices as
well as such not discoverable by Xen's initial bus scan (including the
case where a non-zero PCI segment wasn't accessible during Xen boot,
but became accessible after Dom0 validated access information against
ACPI data) wouldn't cause updates to the mapping either.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/passthrough/pci.c
+++ b/xen/drivers/passthrough/pci.c
@@ -129,11 +129,67 @@ static struct pci_dev *alloc_pdev(struct
     list_add(&pdev->alldevs_list, &pseg->alldevs_list);
     spin_lock_init(&pdev->msix_table_lock);
=20
+    /* update bus2bridge */
+    switch ( pdev_type(pseg->nr, bus, devfn) )
+    {
+        u8 sec_bus, sub_bus;
+
+        case DEV_TYPE_PCIe_BRIDGE:
+            break;
+
+        case DEV_TYPE_PCIe2PCI_BRIDGE:
+        case DEV_TYPE_LEGACY_PCI_BRIDGE:
+            sec_bus =3D pci_conf_read8(pseg->nr, bus, PCI_SLOT(devfn),
+                                     PCI_FUNC(devfn), PCI_SECONDARY_BUS);
+            sub_bus =3D pci_conf_read8(pseg->nr, bus, PCI_SLOT(devfn),
+                                     PCI_FUNC(devfn), PCI_SUBORDINATE_BUS)=
;
+
+            spin_lock(&pseg->bus2bridge_lock);
+            for ( ; sec_bus <=3D sub_bus; sec_bus++ )
+            {
+                pseg->bus2bridge[sec_bus].map =3D 1;
+                pseg->bus2bridge[sec_bus].bus =3D bus;
+                pseg->bus2bridge[sec_bus].devfn =3D devfn;
+            }
+            spin_unlock(&pseg->bus2bridge_lock);
+            break;
+
+        case DEV_TYPE_PCIe_ENDPOINT:
+        case DEV_TYPE_PCI:
+            break;
+
+        default:
+            printk(XENLOG_WARNING "%s: unknown type: %04x:%02x:%02x.%u\n",
+                   __func__, pseg->nr, bus, PCI_SLOT(devfn), PCI_FUNC(devf=
n));
+            break;
+    }
+
     return pdev;
 }
=20
-static void free_pdev(struct pci_dev *pdev)
+static void free_pdev(struct pci_seg *pseg, struct pci_dev *pdev)
 {
+    /* update bus2bridge */
+    switch ( pdev_type(pseg->nr, pdev->bus, pdev->devfn) )
+    {
+        u8 dev, func, sec_bus, sub_bus;
+
+        case DEV_TYPE_PCIe2PCI_BRIDGE:
+        case DEV_TYPE_LEGACY_PCI_BRIDGE:
+            dev =3D PCI_SLOT(pdev->devfn);
+            func =3D PCI_FUNC(pdev->devfn);
+            sec_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func,
+                                     PCI_SECONDARY_BUS);
+            sub_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func,
+                                     PCI_SUBORDINATE_BUS);
+
+            spin_lock(&pseg->bus2bridge_lock);
+            for ( ; sec_bus <=3D sub_bus; sec_bus++ )
+                pseg->bus2bridge[sec_bus] =3D pseg->bus2bridge[pdev->bus];
+            spin_unlock(&pseg->bus2bridge_lock);
+            break;
+    }
+
     list_del(&pdev->alldevs_list);
     xfree(pdev);
 }
@@ -377,7 +433,7 @@ int pci_remove_device(u16 seg, u8 bus, u
             if ( pdev->domain )
                 list_del(&pdev->domain_list);
             pci_cleanup_msi(pdev);
-            free_pdev(pdev);
+            free_pdev(pseg, pdev);
             printk(XENLOG_DEBUG "PCI remove device %04x:%02x:%02x.%u\n",
                    seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
             break;
@@ -545,8 +601,6 @@ static int __init _scan_pci_devices(stru
 {
     struct pci_dev *pdev;
     int bus, dev, func;
-    u8 sec_bus, sub_bus;
-    int type;
=20
     for ( bus =3D 0; bus < 256; bus++ )
     {
@@ -564,41 +618,6 @@ static int __init _scan_pci_devices(stru
                     return -ENOMEM;
                 }
=20
-                /* build bus2bridge */
-                type =3D pdev_type(pseg->nr, bus, PCI_DEVFN(dev, func));
-                switch ( type )
-                {
-                    case DEV_TYPE_PCIe_BRIDGE:
-                        break;
-
-                    case DEV_TYPE_PCIe2PCI_BRIDGE:
-                    case DEV_TYPE_LEGACY_PCI_BRIDGE:
-                        sec_bus =3D pci_conf_read8(pseg->nr, bus, dev, fun=
c,
-                                                 PCI_SECONDARY_BUS);
-                        sub_bus =3D pci_conf_read8(pseg->nr, bus, dev, fun=
c,
-                                                 PCI_SUBORDINATE_BUS);
-
-                        spin_lock(&pseg->bus2bridge_lock);
-                        for ( sub_bus &=3D 0xff; sec_bus <=3D sub_bus; sec=
_bus++ )
-                        {
-                            pseg->bus2bridge[sec_bus].map =3D 1;
-                            pseg->bus2bridge[sec_bus].bus =3D bus;
-                            pseg->bus2bridge[sec_bus].devfn =3D
-                                PCI_DEVFN(dev, func);
-                        }
-                        spin_unlock(&pseg->bus2bridge_lock);
-                        break;
-
-                    case DEV_TYPE_PCIe_ENDPOINT:
-                    case DEV_TYPE_PCI:
-                        break;
-
-                    default:
-                        printk("%s: unknown type: %04x:%02x:%02x.%u\n",
-                               __func__, pseg->nr, bus, dev, func);
-                        return -EINVAL;
-                }
-
                 if ( !func && !(pci_conf_read8(pseg->nr, bus, dev, func,
                                                PCI_HEADER_TYPE) & 0x80) )
                     break;



--_002_987664A83D2D224EAE907B061CE93D5301EE709B54orsmsx505amrc_
Content-Type: message/rfc822

Received: from rrsmsx606.amr.corp.intel.com (10.31.1.130) by
	orsmsx603.amr.corp.intel.com (10.22.226.49) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Thu, 22 Sep 2011 01:40:02 -0700
Received: from azsmga001.ch.intel.com (10.2.17.19) by RRSMSX606-1.rr.intel.com
	(10.31.1.130) with Microsoft SMTP Server id 8.2.255.0;
	Thu, 22 Sep 2011 02:40:01 -0600
Received: from azsmga101.ch.intel.com ([10.2.16.36])  by
	azsmga001-1.ch.intel.com with ESMTP; 22 Sep 2011 01:40:01 -0700
Received: from nat28.tlf.novell.com ([130.57.49.28]) by mga03.intel.com with
	ESMTP; 22 Sep 2011 01:40:00 -0700
Received: from EMEA1-MTA by nat28.tlf.novell.com	with Novell_GroupWise; Thu,
	22 Sep 2011 09:39:58 +0100
From: Jan Beulich <JBeulich@suse.com>
To: "Kay, Allen M" <allen.m.kay@intel.com>
CC: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 22 Sep 2011 01:40:24 -0700
Subject: RE: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
Thread-Topic: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
Thread-Index: Acx5AziVrlwBOCuGQNmG/OCZ1lEt9g==
Message-ID: <4E7B1098020000780005742E@nat28.tlf.novell.com>
References: <4E79B56C0200007800056F8E@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE256A2C@orsmsx505.amr.corp.intel.com>
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301EE256A2C@orsmsx505.amr.corp.intel.com>
X-MS-Exchange-Organization-AuthAs: Anonymous
X-MS-Exchange-Organization-AuthSource: RRSMSX606.amr.corp.intel.com
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
x-ironport-av: E=Sophos;i="4.68,421,1312182000"; d="scan'208";a="755004640"
x-ironport-anti-spam-filtered: true
x-ironport-anti-spam-result: Ah8AAHjyek6COTEcmWdsb2JhbABCmQaObRQBAQEBAQgLCwcUJoFTAQEEAScTPwwECxEEAQEBHAsHRgkIBhOHd7UDhh1gBJNQiFOIXQ
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0

>>> On 21.09.11 at 22:32, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
> Looks good to me.

On a second thought I'm not sure about the free_pdev() part anymore:
When having a bridge behind a bridge, and the downstream one gets
removed, wouldn't that mean the upstream one would now be covering
the bus range that got orphaned? Which means rather than flushing
.map we'd have to copy our parent's entry.

Jan

> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]
> Sent: Wednesday, September 21, 2011 12:59 AM
> To: Kay, Allen M
> Cc: Xen Devel
> Subject: RE: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
>
>>>> On 20.09.11 at 20:02, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
>> I agree that the same problem exists for bus-to-bridge mapping function
>> pci_scan_device().  By the way, we probably should take the opportunity =
to
>> give it a proper name that reflects to the true purpose of this function=
.
>
> How about the below (applying only on top of the multi-seg patches,
> and not yet removing the scanning functions)?
>
> Jan
>
> --- a/xen/drivers/passthrough/pci.c
> +++ b/xen/drivers/passthrough/pci.c
> @@ -129,11 +129,67 @@ static struct pci_dev *alloc_pdev(struct
>      list_add(&pdev->alldevs_list, &pseg->alldevs_list);
>      spin_lock_init(&pdev->msix_table_lock);
>
> +    /* update bus2bridge */
> +    switch ( pdev_type(pseg->nr, bus, devfn) )
> +    {
> +        u8 sec_bus, sub_bus;
> +
> +        case DEV_TYPE_PCIe_BRIDGE:
> +            break;
> +
> +        case DEV_TYPE_PCIe2PCI_BRIDGE:
> +        case DEV_TYPE_LEGACY_PCI_BRIDGE:
> +            sec_bus =3D pci_conf_read8(pseg->nr, bus, PCI_SLOT(devfn),
> +                                     PCI_FUNC(devfn), PCI_SECONDARY_BUS)=
;
> +            sub_bus =3D pci_conf_read8(pseg->nr, bus, PCI_SLOT(devfn),
> +                                     PCI_FUNC(devfn), PCI_SUBORDINATE_BU=
S);
> +
> +            spin_lock(&pseg->bus2bridge_lock);
> +            for ( ; sec_bus <=3D sub_bus; sec_bus++ )
> +            {
> +                pseg->bus2bridge[sec_bus].map =3D 1;
> +                pseg->bus2bridge[sec_bus].bus =3D bus;
> +                pseg->bus2bridge[sec_bus].devfn =3D devfn;
> +            }
> +            spin_unlock(&pseg->bus2bridge_lock);
> +            break;
> +
> +        case DEV_TYPE_PCIe_ENDPOINT:
> +        case DEV_TYPE_PCI:
> +            break;
> +
> +        default:
> +            printk(XENLOG_WARNING "%s: unknown type: %04x:%02x:%02x.%u\n=
",
> +                   __func__, pseg->nr, bus, PCI_SLOT(devfn),
> PCI_FUNC(devfn));
> +            break;
> +    }
> +
>      return pdev;
>  }
>
> -static void free_pdev(struct pci_dev *pdev)
> +static void free_pdev(struct pci_seg *pseg, struct pci_dev *pdev)
>  {
> +    /* update bus2bridge */
> +    switch ( pdev_type(pseg->nr, pdev->bus, pdev->devfn) )
> +    {
> +        u8 dev, func, sec_bus, sub_bus;
> +
> +        case DEV_TYPE_PCIe2PCI_BRIDGE:
> +        case DEV_TYPE_LEGACY_PCI_BRIDGE:
> +            dev =3D PCI_SLOT(pdev->devfn);
> +            func =3D PCI_FUNC(pdev->devfn);
> +            sec_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func,
> +                                     PCI_SECONDARY_BUS);
> +            sub_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func,
> +                                     PCI_SUBORDINATE_BUS);
> +
> +            spin_lock(&pseg->bus2bridge_lock);
> +            for ( ; sec_bus <=3D sub_bus; sec_bus++ )
> +                pseg->bus2bridge[sec_bus].map =3D 0;
> +            spin_unlock(&pseg->bus2bridge_lock);
> +            break;
> +    }
> +
>      list_del(&pdev->alldevs_list);
>      xfree(pdev);
>  }
> @@ -378,7 +434,7 @@ int pci_remove_device(u16 seg, u8 bus, u
>              if ( pdev->domain )
>                  list_del(&pdev->domain_list);
>              pci_cleanup_msi(pdev);
> -            free_pdev(pdev);
> +            free_pdev(pseg, pdev);
>              printk(XENLOG_DEBUG "PCI remove device %04x:%02x:%02x.%u\n",
>                     seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
>              break;
> @@ -546,8 +602,6 @@ static int __init _scan_pci_devices(stru
>  {
>      struct pci_dev *pdev;
>      int bus, dev, func;
> -    u8 sec_bus, sub_bus;
> -    int type;
>
>      for ( bus =3D 0; bus < 256; bus++ )
>      {
> @@ -565,41 +619,6 @@ static int __init _scan_pci_devices(stru
>                      return -ENOMEM;
>                  }
>
> -                /* build bus2bridge */
> -                type =3D pdev_type(pseg->nr, bus, PCI_DEVFN(dev, func));
> -                switch ( type )
> -                {
> -                    case DEV_TYPE_PCIe_BRIDGE:
> -                        break;
> -
> -                    case DEV_TYPE_PCIe2PCI_BRIDGE:
> -                    case DEV_TYPE_LEGACY_PCI_BRIDGE:
> -                        sec_bus =3D pci_conf_read8(pseg->nr, bus, dev, f=
unc,
> -                                                 PCI_SECONDARY_BUS);
> -                        sub_bus =3D pci_conf_read8(pseg->nr, bus, dev, f=
unc,
> -                                                 PCI_SUBORDINATE_BUS);
> -
> -                        spin_lock(&pseg->bus2bridge_lock);
> -                        for ( sub_bus &=3D 0xff; sec_bus <=3D sub_bus; s=
ec_bus++ )
> -                        {
> -                            pseg->bus2bridge[sec_bus].map =3D 1;
> -                            pseg->bus2bridge[sec_bus].bus =3D bus;
> -                            pseg->bus2bridge[sec_bus].devfn =3D
> -                                PCI_DEVFN(dev, func);
> -                        }
> -                        spin_unlock(&pseg->bus2bridge_lock);
> -                        break;
> -
> -                    case DEV_TYPE_PCIe_ENDPOINT:
> -                    case DEV_TYPE_PCI:
> -                        break;
> -
> -                    default:
> -                        printk("%s: unknown type: %04x:%02x:%02x.%u\n",
> -                               __func__, pseg->nr, bus, dev, func);
> -                        return -EINVAL;
> -                }
> -
>                  if ( !func && !(pci_conf_read8(pseg->nr, bus, dev, func,
>                                                 PCI_HEADER_TYPE) & 0x80) =
)
>                      break;



--_002_987664A83D2D224EAE907B061CE93D5301EE709B54orsmsx505amrc_
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_987664A83D2D224EAE907B061CE93D5301EE709B54orsmsx505amrc_--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 19:13:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 19:13:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RBzwe-0007NE-3e; Thu, 06 Oct 2011 19:13:52 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBzvq-0007Am-Uq
	for Xen-devel@lists.xensource.com; Thu, 06 Oct 2011 19:13:03 -0700
X-Env-Sender: mukesh.rathor@oracle.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1317953578!53964!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32038 invoked from network); 7 Oct 2011 02:12:59 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-5.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2011 02:12:59 -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
	p972CpYw022062
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 7 Oct 2011 02:12:53 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
	p972CocV009049
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 7 Oct 2011 02:12:50 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
	p972Chv5012555; Thu, 6 Oct 2011 21:12:43 -0500
Received: from mantra.us.oracle.com (/130.35.68.95)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 06 Oct 2011 19:12:42 -0700
Date: Thu, 6 Oct 2011 19:12:41 -0700
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>
Message-ID: <20111006191241.0866625f@mantra.us.oracle.com>
Organization: Oracle Corporation
X-Mailer: Claws Mail 3.7.6 (GTK+ 2.18.9; x86_64-redhat-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090204.4E8E6025.00E8:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] HYBRID: set_page_prot() (make pte readonly)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Jeremy,

This for my hybrid, PV in HVM container with EPT. With EPT, I don't
have the guest going to xen for any va_mapping, and only dealing with
pfn's.

So, I'm at a loss on how to make set_page_prot() work during 
xen_map_identity_early(). I tried few things, but no luck. The fixmap
is not setup during this time, so can't use that. 

Have any ideas?

thanks,
Mukesh

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

From xen-devel-bounces@lists.xensource.com Thu Oct 06 21:31:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 21:31:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC25d-00022Q-SU; Thu, 06 Oct 2011 21:31:17 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC24c-0001pp-Lu
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 21:30:16 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1317961811!19473972!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27396 invoked from network); 7 Oct 2011 04:30:11 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 04:30:11 -0000
X-IronPort-AV: E=Sophos;i="4.68,499,1312156800"; 
   d="scan'208";a="8263631"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 04:30: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; Fri, 7 Oct 2011 05:30:11 +0100
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 1RC24X-00016H-Sc;
	Fri, 07 Oct 2011 04:30:09 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RC24X-00066S-JU;
	Fri, 07 Oct 2011 05:30:09 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9201-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 05:30:09 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9201: 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 9201 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9201/

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-amd64-xl-sedf     14 guest-localmigrate/x10       fail    like 9198
 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                  159be83e5fe9
baseline version:
 xen                  159be83e5fe9

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 Thu Oct 06 21:47:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 21:47:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC2LP-0002rx-90; Thu, 06 Oct 2011 21:47:35 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC2Kb-0002eT-UP
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 21:46:46 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317962785!52907133!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30604 invoked from network); 7 Oct 2011 04:46:26 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 04:46: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=dtxyR/R1QCrbjFfUC/LNWjTMkPkH0ApW58bDhGSikYDEzMeMqe00JyHW
	/nFXmTq/P0pCWeBXmY/dIYh4U6OTlfC5WW2rZLhiRimqB36xhjFed9kHf
	AJaQ6KECXin99nTq6AKConlKiCro0WbBAYq2s3Ct5pw6/pQnVEQwMee2q
	CyUkYkkRtROM34hqwZ1ksZaME3qoXQ9PD0hxk5aEVUhltPwhyWGVznF2Y
	xT+cVZ3ZWYkJZw6GfiyCOvbAL9tsu;
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=1317962802; x=1349498802;
	h=mime-version:subject:message-id:date:from:to;
	bh=WfiUtJSizca9xLWQ3FfjLqrEKlc0SzxOXtvrCEBkYaE=;
	b=ok5Bv3rar/ob0n7J4oKackLvtEArcVLIU2lz5KN/fguojxTRx8krUA40
	q2wqPA3BzEBy2SH9QYbu/ZFv05tTi/A5JXnvxTqf1xDruFb/KJixTauFv
	O/0C0pKZCSpHz7YMdEYCnAmQmUVGactH8stlk96eYET/3CDWRSdKIvDcB
	pm1tgtPHcLrSemFxKhzOywal446Hg02G6s1o1DLcem4VkVpwphgqsTTOO
	0BM5ATNXmaGj/3dAF3ff+4Ub0XoZl;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.68,499,1312149600"; d="scan'208";a="76159769"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 07 Oct 2011 06:46:42 +0200
X-IronPort-AV: E=Sophos;i="4.68,499,1312149600"; d="scan'208";a="120824594"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 07 Oct 2011 06:46:41 +0200
Received: from [172.17.21.25] (nehalem1.osd.mch.fsc.net [172.17.21.25])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id D78A73E5255;
	Fri,  7 Oct 2011 06:46:41 +0200 (CEST)
Content-Type: multipart/mixed; boundary="===============0860245990847151211=="
MIME-Version: 1.0
X-Mercurial-Node: 67f2c8de11ecb6d05e2239340ebbf83208c44863
Message-Id: <67f2c8de11ecb6d05e22.1317962572@nehalem1>
Date: Fri, 07 Oct 2011 06:42:52 +0200
From: Juergen Gross <juergen.gross@ts.fujitsu.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] Avoid relative XEN_ROOT specification
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

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

XEN_ROOT must be set to an absolute path to avoid out of the tree references

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


1 file changed, 1 insertion(+), 1 deletion(-)
tools/libfsimage/xfs/Makefile |    2 +-



--===============0860245990847151211==
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 1317962555 -7200
# Node ID 67f2c8de11ecb6d05e2239340ebbf83208c44863
# Parent  159be83e5fe9111bb30d8b1f83127f5724d44424
Avoid relative XEN_ROOT specification

XEN_ROOT must be set to an absolute path to avoid out of the tree references

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

diff -r 159be83e5fe9 -r 67f2c8de11ec tools/libfsimage/xfs/Makefile
--- a/tools/libfsimage/xfs/Makefile	Thu Oct 06 19:44:40 2011 +0100
+++ b/tools/libfsimage/xfs/Makefile	Fri Oct 07 06:42:35 2011 +0200
@@ -1,4 +1,4 @@ XEN_ROOT = ../../..
-XEN_ROOT = ../../..
+XEN_ROOT = $(CURDIR)/../../..
 
 LIB_SRCS-y = fsys_xfs.c
 

--===============0860245990847151211==
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

--===============0860245990847151211==--


From xen-devel-bounces@lists.xensource.com Thu Oct 06 23:56:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 06 Oct 2011 23: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 1RC4M3-0006AP-SG; Thu, 06 Oct 2011 23:56:23 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC4LL-0005xv-Bh
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 23:55:39 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317970535!34313297!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2907 invoked from network); 7 Oct 2011 06:55:36 -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;
	7 Oct 2011 06:55:36 -0000
X-IronPort-AV: E=Sophos;i="4.68,500,1312156800"; 
   d="scan'208";a="8264500"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:55: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; Fri, 7 Oct 2011 07:55:36 +0100
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 1RC454-0001qW-Fx;
	Fri, 07 Oct 2011 06:38:50 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RC454-0000I0-Aw;
	Fri, 07 Oct 2011 07:38:50 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9202-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 07:38:50 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9202: 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 9202 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9202/

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-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                  460b613596fa
baseline version:
 xen                  d7e0e9f37874

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Stefano Stabellini <stefano.stabellini@eu.citrix.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                                     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=460b613596fa
+ . 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 460b613596fa
+ branch=xen-4.1-testing
+ revision=460b613596fa
+ . 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 460b613596fa 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 4 changesets with 114 changes to 114 files

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 00:08:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 00:08:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC4Xq-0006hS-17; Fri, 07 Oct 2011 00:08:35 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC4Wu-0006V9-JJ
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 00:07:37 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1317971253!55049!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3599 invoked from network); 7 Oct 2011 07:07:33 -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; 7 Oct 2011 07:07:33 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 07 Oct 2011 08:07:33 +0100
Message-Id: <4E8EC18C0200007800059E17@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 07 Oct 2011 08:08:28 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Allen M Kay" <allen.m.kay@intel.com>
References: <4E8B08A10200007800059278@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B54@orsmsx505.amr.corp.intel.com>
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301EE709B54@orsmsx505.amr.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>
Subject: [Xen-devel] RE: [PATCH] passthrough: update bus2bridge mapping as
	PCI devices  get added/removed
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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.10.11 at 04:00, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
> Hi Jan,
>=20
> I'm not able to spot the difference between this patch and the earlier =
one=20
> you had second thoughts about in attached email.  Was there a change =
I=20
> missed?

It addresses the comment I made in the mail you had attached, i.e. ...

> Allen
>=20
> -----Original Message-----
>...
> -static void free_pdev(struct pci_dev *pdev)
> +static void free_pdev(struct pci_seg *pseg, struct pci_dev *pdev)
>  {
> +    /* update bus2bridge */
> +    switch ( pdev_type(pseg->nr, pdev->bus, pdev->devfn) )
> +    {
> +        u8 dev, func, sec_bus, sub_bus;
> +
> +        case DEV_TYPE_PCIe2PCI_BRIDGE:
> +        case DEV_TYPE_LEGACY_PCI_BRIDGE:
> +            dev =3D PCI_SLOT(pdev->devfn);
> +            func =3D PCI_FUNC(pdev->devfn);
> +            sec_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func,
> +                                     PCI_SECONDARY_BUS);
> +            sub_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func,
> +                                     PCI_SUBORDINATE_BUS);
> +
> +            spin_lock(&pseg->bus2bridge_lock);
> +            for ( ; sec_bus <=3D sub_bus; sec_bus++ )
> +                pseg->bus2bridge[sec_bus] =3D pseg->bus2bridge[pdev->bus=
];

... the right side of this was 0 on the first posting.

Jan

> +            spin_unlock(&pseg->bus2bridge_lock);
> +            break;
> +    }
> +
>      list_del(&pdev->alldevs_list);
>      xfree(pdev);
>  }



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 00:17:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 00:17:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC4gI-0007AW-6q; Fri, 07 Oct 2011 00:17:18 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC4fg-0006yC-W3
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 00:16:41 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1317971797!74204!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2520 invoked from network); 7 Oct 2011 07:16:37 -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; 7 Oct 2011 07:16:37 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 07 Oct 2011 08:16:37 +0100
Message-Id: <4E8EC3AE0200007800059E25@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 07 Oct 2011 08:17:34 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Allen M Kay" <allen.m.kay@intel.com>
References: <4E8B0A5F0200007800059286@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B4D@orsmsx505.amr.corp.intel.com>
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301EE709B4D@orsmsx505.amr.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>
Subject: [Xen-devel] RE: [PATCH] VT-d: don't reject possibly valid DRHD or
	RMRR
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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.10.11 at 03:51, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
> For RMRR case, looks like you miss the following change (or something=20
> similar):
>=20
> -for ( i =3D 0; i < rmrru->scope.devices_cnt; i++ )
> +for (; i < rmrru->scope.devices_cnt; i++ )

Indeed.

> Otherwise, the logic for handling non-zero PCI segments looks reasonable.=


So do I take this as an acked-by-with-above-change?

> Allen
>=20
> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]=20
> Sent: Tuesday, October 04, 2011 4:30 AM
> To: xen-devel@lists.xensource.com=20
> Cc: Kay, Allen M
> Subject: [PATCH] VT-d: don't reject possibly valid DRHD or RMRR
>=20
> If a non-zero PCI segment isn't accessible during Xen boot (because
> firmware decided to not enter the necessary MMIO space into the E820
> table), devices referred to on those segments through DRHD or RMRR
> structures should not be rejected just because the devices can't be
> found.
>=20
> This is in line with what is being done in at least one other case
> already: Systems with more than one PCI segment (usually high end
> ones) are assumed to have valid firmware provided data, while systems
> with just segment 0 continue to have their firmware tables validated.
>=20
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>=20
> --- a/xen/drivers/passthrough/pci.c
> +++ b/xen/drivers/passthrough/pci.c
> @@ -53,6 +53,11 @@ static inline struct pci_seg *get_pseg(u
>      return radix_tree_lookup(&pci_segments, seg);
>  }
> =20
> +bool_t pci_known_segment(u16 seg)
> +{
> +    return get_pseg(seg) !=3D NULL;
> +}
> +
>  static struct pci_seg *alloc_pseg(u16 seg)
>  {
>      struct pci_seg *pseg =3D get_pseg(seg);
> --- a/xen/drivers/passthrough/vtd/dmar.c
> +++ b/xen/drivers/passthrough/vtd/dmar.c
> @@ -444,10 +444,14 @@ acpi_parse_one_drhd(struct acpi_dmar_ent
>      else
>      {
>          u8 b, d, f;
> -        int i, invalid_cnt =3D 0;
> +        unsigned int i =3D 0, invalid_cnt =3D 0;
>          void *p;
> =20
> -        for ( i =3D 0, p =3D dev_scope_start; i < dmaru->scope.devices_c=
nt;
> +        /* Skip checking if segment is not accessible yet. */
> +        if ( !pci_known_segment(drhd->segment) )
> +            i =3D UINT_MAX;
> +
> +        for ( p =3D dev_scope_start; i < dmaru->scope.devices_cnt;
>                i++, p +=3D ((struct acpi_dev_scope *)p)->length )
>          {
>              if ( ((struct acpi_dev_scope *)p)->dev_type =3D=3D =
ACPI_DEV_IOAPIC ||
> @@ -549,7 +553,12 @@ acpi_parse_one_rmrr(struct acpi_dmar_ent
>      else
>      {
>          u8 b, d, f;
> -        int i, ignore =3D 0;
> +        bool_t ignore =3D 0;
> +        unsigned int i =3D 0;
> +
> +        /* Skip checking if segment is not accessible yet. */
> +        if ( !pci_known_segment(rmrr->segment) )
> +            i =3D UINT_MAX;
> =20
>          for ( i =3D 0; i < rmrru->scope.devices_cnt; i++ )
>          {
> --- a/xen/include/xen/pci.h
> +++ b/xen/include/xen/pci.h
> @@ -82,6 +82,7 @@ enum {
>      DEV_TYPE_PCI,
>  };
> =20
> +bool_t pci_known_segment(u16 seg);
>  int pci_device_detect(u16 seg, u8 bus, u8 dev, u8 func);
>  int scan_pci_devices(void);
>  int pdev_type(u16 seg, u8 bus, u8 devfn);




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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 00:38:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 00:38:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC518-0000GF-T0; Fri, 07 Oct 2011 00:38:50 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC50G-0008Up-Dx
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 00:37:56 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317973049!38896828!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8213 invoked from network); 7 Oct 2011 07:37:30 -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; 7 Oct 2011 07:37:30 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 07 Oct 2011 08:37:53 +0100
Message-Id: <4E8EC8A80200007800059E3B@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 07 Oct 2011 08:38:48 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Allen M Kay" <allen.m.kay@intel.com>
References: <4E4E48360200007800051F65@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B5E@orsmsx505.amr.corp.intel.com>
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301EE709B5E@orsmsx505.amr.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>
Subject: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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.10.11 at 04:19, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
> Currently I three places where enable_ats_device() can be eventually =
called=20
> because of it is in domain_context_mapping():
>=20
> 1) setup_dom0_devices()
> 2) intel_iommu_add_device()
> 3) reassign_device_ownership()
>=20
> Calling it in the first two is probably all we need to cover all the=20
> devices.   I don't think we need to call it again in=20
> reassign_device_ownership().

That would mean that a device that was found during Xen's initial scan
(i.e. pdev->domain set due to it having gone through
setup_dom0_pci_devices()), but for which enable_ats_device() was
unsuccessful due to mmcfg access still being impossible at that point,
would never get ATS enabled. But that's the whole point of the thread
here. My question isn't whether to *re*move call sites, but whether it
would be possible to move them elsewhere. For which I'd like to
understand why this is being done in the places it is now (not the
least why this is done in VT-d specific code in the first place).

Just like in the suggested change to how pci_enable_acs() gets called,
this should really happen from pci_add_device() *without* regard to
whether pdev->domain was already set.

Also, earlier you suggested to remove the call to pci_enable_acs() from
setup_dom0_device() - I'm not convinced anymore that this is correct,
since old Dom0 kernels (forward ports from the 2.6.18 tree up to pretty
recently) can't be relied upon to report all PCI devices to Xen. Which
also suggests that we shouldn't really remove scan_pci_devices()
(although it may be possible to adjust it back to scan only segment 0).
Otoh, when mmcfg isn't available early, on such Dom0 kernels ATS
wouldn't get enabled today either, even with the adjusted call site of
pci_enable_acs().

Consequently, another alternative would be to retry ATS and ACS
enabling when mmcfg becomes available for a certain bus range, i.e.
out of pci_mmcfg_reserved().

Jan

> By the way, due to the lack of production ATS devices, we have not tried =
ATS=20
> for quite a while.  I'm not sure we should make the change now or should =
we=20
> just make a note of it in reassign_device_ownership() for now.
>=20
> Allen
>=20
> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@novell.com]=20
> Sent: Friday, August 19, 2011 2:26 AM
> To: Kay, Allen M
> Subject: Resend: RE: enable_ats_device() call site
>=20
> (for some reason the first send to you bounced - please re-add xen-devel =
as cc=20
> if you reply to this one)
>=20
>>>> On 18.08.11 at 01:27, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
>>>  what is the reason for calling this from VT-d's domain_context_mapping=
()?
>>> I neither undertsand why this is VT-d specific, nor why it needs to be
>>> re-done with each device re-assignment.
>>=20
>> The reason is FLR clears the ATS enabled bit so we need to re-enable it =
for=20
>> every re-assignment.  The reason we don't need to do this for ACS might =
be=20
> ACS=20
>> reside on the bridge, not in the PCI endpoint.  ATS on the other =
hand,=20
>> resides in PCI endpoints.
>=20
> And why is it VT-d specific then? The problem to solve is that enabling
> may not happen when it is first attempted, in the case where Xen on its
> own can't be certain that using MMCFG is safe. Hence when the device
> gets reported by Dom0 (or when MMCFG gets enabled for the respective
> bus), another attempt needs to be made at enabling it. De-assigning and
> then re-assigning the device to Dom0 seems to be overkill to me.
>=20
>>> Alternatively - why do we need scan_pci_devices() at all? We're
>>> supposed to be getting the devices reported from Dom0 anyway
>>=20
>> Looks like it is use for building bus2bridge[] which is used for =
figuring=20
>> out upstream bridges which are needed when assigning non-PCIe devices.
>=20
> Oh, right, I keep forgetting that, especially as that puts under =
question
> why we have Dom0 report non-extfn, non-virtfn devices at all. And
> perhaps we should issue a warning if Dom0 reports such a device that
> we didn't know about already?
>=20
> Jan



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 00:42:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 00: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 1RC54V-0000mx-6S; Fri, 07 Oct 2011 00:42:19 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC543-0000ag-HR
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 00:41:51 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1317973297!49973225!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23312 invoked from network); 7 Oct 2011 07:41:38 -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; 7 Oct 2011 07:41:38 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 07 Oct 2011 08:41:48 +0100
Message-Id: <4E8EC9940200007800059E47@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 07 Oct 2011 08:42:44 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jinsong Liu" <jinsong.liu@intel.com>,
	"Yunhong Jiang" <yunhong.jiang@intel.com>
Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
References: <BC00F5384FCFC9499AF06F92E8B78A9E263B557B77@shsmsx502.ccr.corp.intel.com>
	<4E84ADF70200007800058882@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D2366A9B@shsmsx501.ccr.corp.intel.com>
	<4E858AF30200007800058A64@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F02@shsmsx502.ccr.corp.intel.com>
	<4E8592A60200007800058AD4@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F40@shsmsx502.ccr.corp.intel.com>
	<4E859D7F0200007800058B39@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F7C@shsmsx502.ccr.corp.intel.com>
	<4E85B09F0200007800058B7B@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F90@shsmsx502.ccr.corp.intel.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E264E34D85F@shsmsx502.ccr.corp.intel.com>
In-Reply-To: <BC00F5384FCFC9499AF06F92E8B78A9E264E34D85F@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: "keir.xen@gmail.com" <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 06.10.11 at 20:40, "Liu, Jinsong" <jinsong.liu@intel.com> wrote:
> Liu, Jinsong wrote:
>> Liu, Jinsong wrote:
>>> Jan Beulich wrote:
>>>>>>> On 30.09.11 at 11:42, "Liu, Jinsong" <jinsong.liu@intel.com>
>>>>>>> wrote:
>>>>> Jan Beulich wrote:
>>>>>>>>> On 30.09.11 at 10:21, "Liu, Jinsong" <jinsong.liu@intel.com>
>>>>>>>>> wrote:
>>>>>>> Executing guest code will not satisfy the check
>>>>>>> if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs)) 	=
return
>>>>>>> -1; so it would not panic system.
>>>>>>=20
>>>>>> Exactly. But it should when the prefetch was to hypervisor code.
>>>>>>=20
>>>>>=20
>>>>> Wouldn't processor refresh instruction prefetch queue under such
>>>>> case?
>>>>=20
>>>> That's a question that you are better positioned to answer than me.
>>>> But the SRAR errors being a sub-category of uncorrected errors I
>>>> would think it can't be that simple.
>>>>=20
>>>=20
>>> Hmm, I will check this question internally first.
>>> BTW, we would have 7 days holiday (1/10 ~ 7/10), so email reply
>>> maybe some slow.=20
>>>=20
>>> Thanks,
>>> Jinsong
>>=20
>> Ah, just think our talking context: the prefetched instruction would
>> have been flushed since we now at mce exception context. So I think
>> no need to overkill here, just let guest handle it --> who own, who
>> take. =20
>>=20
>> Thanks,
>> Jinsong
>=20
> Jan,
>=20
> Do you think following is OK?
>=20
> if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))=20
>     return -1;

That's what we have currently, and as I said earlier I don't think using
the result of guest_mode() for any decision is valid when the EIPV bit
is clear.

Jan

> Thanks,
> Jinsong




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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 00:45:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 00:45:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC57Q-0001BI-Er; Fri, 07 Oct 2011 00:45:20 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC56m-0000yx-0M
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 00:44:40 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1317973476!78498!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29369 invoked from network); 7 Oct 2011 07:44:37 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 07:44:37 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8265422"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 07:44: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; Fri, 7 Oct 2011
	08:44:36 +0100
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 08:44:36 +0100
In-Reply-To: <20109.59357.97335.226711@mariner.uk.xensource.com>
References: <1317801530.21903.163.camel@zakaz.uk.xensource.com>
	<1317806883-22947-1-git-send-email-roger.pau@entel.upc.edu>
	<20109.59357.97335.226711@mariner.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: <1317973476.21903.273.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
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

On Thu, 2011-10-06 at 18:39 +0100, Ian Jackson wrote:
> ~Roger Pau Monne writes ("[Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD"):
> > NetBSD has no blktap support, so remove the use of the blktap if the OS is NetBSD.
> 
> Applied to qemu-xen-unstable.git.  Is there a need for a similar patch
> to qemu upstream ?

I don't think upstream qemu has (or will/should have) any blktap
support.

Having said that it's not exactly clear what, if anything, this blktap
support in qemu-xen is actually used for... It looks a bit like once
upon time it was an option to use qemu to provide the blktap (v1)
userspace backend instead of the tapdisk process (look for qemu and
use_ioemu in tools/blktap/drivers/blktapctrl.c). This functionality does
not appear to be present in blktap2.

Ian.



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 00:52:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 00:52:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC5Ed-0001dZ-PV; Fri, 07 Oct 2011 00:52:47 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC5Ds-0001R0-OC
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 00:52:01 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1317973917!78357!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17610 invoked from network); 7 Oct 2011 07:51:57 -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 Oct 2011 07:51:57 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8265557"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 07:51: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; Fri, 7 Oct 2011
	08:51:30 +0100
Subject: Re: [Xen-devel] [PATCH] Avoid relative XEN_ROOT specification
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>
Date: Fri, 7 Oct 2011 08:51:29 +0100
In-Reply-To: <67f2c8de11ecb6d05e22.1317962572@nehalem1>
References: <67f2c8de11ecb6d05e22.1317962572@nehalem1>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317973890.21903.280.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-10-07 at 05:42 +0100, Juergen Gross wrote:
> XEN_ROOT must be set to an absolute path to avoid out of the tree references

How about:

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1317973741 -3600
# Node ID d0327c39dff8abdc224e3c19f31e11f0fbeb5c16
# Parent  f17f0df2a2ede01a8c35dc4768a532a4438b1c02
tools: error out on non-absolute $(XEN_ROOT)

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r f17f0df2a2ed -r d0327c39dff8 tools/Rules.mk
--- a/tools/Rules.mk	Wed Oct 05 10:43:41 2011 +0100
+++ b/tools/Rules.mk	Fri Oct 07 08:49:01 2011 +0100
@@ -3,6 +3,10 @@
 # `all' is the default target
 all:
 
+ifeq ($(filter /%,$(XEN_ROOT)),)
+$(error XEN_ROOT must be absolute)
+endif
+
 include $(XEN_ROOT)/Config.mk
 
 export _INSTALL := $(INSTALL)



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 00:53:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 00: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 1RC5Fi-00020Y-50; Fri, 07 Oct 2011 00:53:54 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC5EW-0001al-Mr
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 00:52:41 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1317973957!34299521!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10770 invoked from network); 7 Oct 2011 07:52:37 -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;
	7 Oct 2011 07:52:37 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8265593"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 07:52: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; Fri, 7 Oct 2011
	08:52:36 +0100
Subject: Re: [Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming
	domain 0
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Fri, 7 Oct 2011 08:52:36 +0100
In-Reply-To: <4E8DF425.9000807@tycho.nsa.gov>
References: <1317824920-639-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20109.60188.905267.410813@mariner.uk.xensource.com>
	<4E8DF425.9000807@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1317973956.21903.281.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-10-06 at 19:32 +0100, Daniel De Graaf wrote:
> On 10/06/2011 01:53 PM, Ian Jackson wrote:
> > Daniel De Graaf writes ("[Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming domain 0"):
> >> The xenbus event channel established in xenbus_init is intended to be a
> >> loopback channel, but the remote domain was hardcoded to 0; this will
> >> cause the channel to be unusable when xenstore is not being run in
> >> domain 0.
> > 
> > I'm not sure I understand this.
> > 
> > ...
> >>  		/* Next allocate a local port which xenstored can bind to */
> >>  		alloc_unbound.dom        = DOMID_SELF;
> >> -		alloc_unbound.remote_dom = 0;
> >> +		alloc_unbound.remote_dom = DOMID_SELF;
> > 
> > The comment doesn't suggest that this is supposedly a loopback channel
> > (ie one for use by the xenbus client for signalling to itself,
> > somehow).
> 
> The event channel being changed here is a loopback event channel exposed in
> /proc/xen/xsd_port, which xenstored binds to. This code is only used for the
> initial domain; otherwise, the shared info page is used.

How does this change impact the regular dom0? It will be expecting a
xenstored to startup locally when in reality it actually needs to wait
for another domain and then connect to that.

Diego Ongaro did some work several years ago on this issue, it was most
recently re-posted by Alex Zeffert, patches against xen-unstable and the
linux-2.6.18 tree:
http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01484.html
http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01488.html

Part of the trick was to fixup the kernel side in a way which was
compatible with both existing Xen releases while also supporting new
releases which support both stub and non-stub xenstore. To do this Diego
setup a lazy xenbus initialisation with a state machine to track which
case was active, with transitions triggered either from the local-mmap
of /proc/xen/xenbus_xsd (so was backwards compatible) or an ioctl called
by the tool which builds the stub domain to tell the dom0 xenbus code
which domain/mfn/evtchn contains the xenstored and dom0's connection to
it (the patcheset includes a cut-down builder which works without
xenstore).

http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01487.html
is the key kernel side patch in that regard.

Diego did some initial work with xenstored in a Linux domU, but I think
the final patchset was stub-xenstored (i.e. ocaml xenstored on minios,
possibly C xenstored on minios too), so I'm not sure about the xenstored
in Linux domU use case.

Some of the more trivial bits of this series were committed but the real
meat wasn't really pushed through.

> 
> > Rather it's supposed to be a channel to xenstore.  So the remote
> > domain should be the xenstore domain, which should come from the
> > shared info page.
> > 
> > Have you actually tested this with a separate xenstored domain ?
> > 
> > Ian.
> > 
> 
> The test setup that exposed this issue is having a non-dom0 Linux domain
> running xenstored (in addition to other services); this domain is started
> with the SIF_INITDOMAIN flag set. It has been tested and can start other
> domains with references back to the xenstored running there; the local
> kernel is able to communicate with the locally running xenstore to provide
> backend services.
> 
> The test for xen_initial_domain() here might better be replaced with a
> check on xen_start_info->store_evtchn which should be a valid event channel
> on all domains except the domain running xenstored. This seems like a more
> elegant solution than relying on the SIF_INITDOMAIN flag to determine the
> location of xenstore.
> 



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 00:56:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 00:56:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC5I3-0002PA-Nh; Fri, 07 Oct 2011 00:56:19 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC5HX-0002Co-Fy
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 00:55:47 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317974155!54526929!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7724 invoked from network); 7 Oct 2011 07:55:55 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 07:55: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=KbTsJ1hoArV9iZyzwaNVUZNLz3rWpb1yNOuOzcZEtUubiFz+AJMGT/mu
	f4k3yhTG9vSluHPr4mjyd0FHfJ73B2u+rM5HJwfQfVSu+wBmORtZt5FQJ
	ehLGBZfCitNjs+YJNvZqEpBRX7f2eUJDd0vqYQy3DCWt1DUdSl33/ESEN
	w3djAdDs4P9KZ1uboXUym+pq00DN8TiYsHO+yBVI8R8cnJEK4QlDz8Glv
	xRzdEraJKjHTy7R20A3L6nokjXIVo;
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=1317974144; x=1349510144;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=CDD1VhUGd0iAlk5zkK6NPYL8n3qucJJfGYJpSlHnUtw=;
	b=gJTPV+mcS4wu3QvmgeNKH7i2i7naxwSD/XItm+fSeGOpLNLwyHXGFFve
	1c7WQYAFzpVZiQHlg7DgYcwwSGIOoyCy7I6vZeN6bNXinvudDolL7sZh2
	fBTWA9SAoRzA6EDfGGjp+8UGdCzM3l9ESbKxXPY2aFpzoBxeOilNUksYg
	AzanoBp3LrMLnmy7SO1pQvtTqvpis8Vz9r/1PPHUmCBRd0ec+X6QK29o5
	qM+snJwDb/0qNHhq5S/4yxwyL41Jw;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.68,500,1312149600"; d="scan'208";a="89578010"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate10u.abg.fsc.net with ESMTP; 07 Oct 2011 09:55:44 +0200
X-IronPort-AV: E=Sophos;i="4.68,500,1312149600"; d="scan'208";a="120834221"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 07 Oct 2011 09:55:43 +0200
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id E203376B5E2;
	Fri,  7 Oct 2011 09:55:43 +0200 (CEST)
Message-ID: <4E8EB07F.70702@ts.fujitsu.com>
Date: Fri, 07 Oct 2011 09:55:43 +0200
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.21) Gecko/20110831 Iceowl/1.0b2 Icedove/3.1.13
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] Avoid relative XEN_ROOT specification
References: <67f2c8de11ecb6d05e22.1317962572@nehalem1>
	<1317973890.21903.280.camel@zakaz.uk.xensource.com>
In-Reply-To: <1317973890.21903.280.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 10/07/2011 09:51 AM, Ian Campbell wrote:
> On Fri, 2011-10-07 at 05:42 +0100, Juergen Gross wrote:
>> XEN_ROOT must be set to an absolute path to avoid out of the tree references
> How about:
>
> # HG changeset patch
> # User Ian Campbell<ian.campbell@citrix.com>
> # Date 1317973741 -3600
> # Node ID d0327c39dff8abdc224e3c19f31e11f0fbeb5c16
> # Parent  f17f0df2a2ede01a8c35dc4768a532a4438b1c02
> tools: error out on non-absolute $(XEN_ROOT)
>
> Signed-off-by: Ian Campbell<ian.campbell@citrix.com>
Acked-by: juergen.gross@ts.fujitsu.com
> diff -r f17f0df2a2ed -r d0327c39dff8 tools/Rules.mk
> --- a/tools/Rules.mk	Wed Oct 05 10:43:41 2011 +0100
> +++ b/tools/Rules.mk	Fri Oct 07 08:49:01 2011 +0100
> @@ -3,6 +3,10 @@
>   # `all' is the default target
>   all:
>
> +ifeq ($(filter /%,$(XEN_ROOT)),)
> +$(error XEN_ROOT must be absolute)
> +endif
> +
>   include $(XEN_ROOT)/Config.mk
>
>   export _INSTALL := $(INSTALL)
>
>
>
> _______________________________________________
> 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 Fri Oct 07 00:57:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 00:57:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC5Iv-0002nQ-VV; Fri, 07 Oct 2011 00:57:14 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC5IC-0002So-Va
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 00:56:29 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1317974185!80417!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10304 invoked from network); 7 Oct 2011 07:56:26 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 07:56:26 -0000
Received: by qabg14 with SMTP id g14so3807848qab.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 00:56:24 -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=tDxbG9HiLgz/DaMeIcCxxr6OInOMZL9hy4w7cemGtE8=;
	b=onN7AewHqZy/Xg8HvqY4wgcLKVRUCA1yNfhtKHALP5GpqHXi/35/ICCQInG256LZXa
	B2DCjHxECjUtDVhbsCaEaLB1eRrh/AoCuWJ290kQ1s8DnQfZSKChZr89ENBxmqsSsiPa
	4s2PaYxSoWpqDnAcb3cWlAZrykdBIUyAlerKA=
MIME-Version: 1.0
Received: by 10.229.62.79 with SMTP id w15mr1290414qch.219.1317974184714; Fri,
	07 Oct 2011 00:56:24 -0700 (PDT)
Received: by 10.229.190.67 with HTTP; Fri, 7 Oct 2011 00:56:24 -0700 (PDT)
In-Reply-To: <1317973476.21903.273.camel@zakaz.uk.xensource.com>
References: <1317801530.21903.163.camel@zakaz.uk.xensource.com>
	<1317806883-22947-1-git-send-email-roger.pau@entel.upc.edu>
	<20109.59357.97335.226711@mariner.uk.xensource.com>
	<1317973476.21903.273.camel@zakaz.uk.xensource.com>
Date: Fri, 7 Oct 2011 09:56:24 +0200
X-Google-Sender-Auth: Kw3F-WGW3_T-8E1abNTAlvCCg4Q
Message-ID: <CAPLaKK6okQEC+9p9twShdJsx_ze+cf4D0tt5GjYTxy=mATeMvQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] QEMU: remove blktap when building for NetBSD
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
Content-Transfer-Encoding: quoted-printable
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

>> Applied to qemu-xen-unstable.git. =C2=A0Is there a need for a similar pa=
tch
>> to qemu upstream ?
>
> I don't think upstream qemu has (or will/should have) any blktap
> support.

>From what I saw, there's nothing blktap related in qemu-upstream.

> Having said that it's not exactly clear what, if anything, this blktap
> support in qemu-xen is actually used for... It looks a bit like once
> upon time it was an option to use qemu to provide the blktap (v1)
> userspace backend instead of the tapdisk process (look for qemu and
> use_ioemu in tools/blktap/drivers/blktapctrl.c). This functionality does
> not appear to be present in blktap2.

I've looked at the sources of qemu-unstable, and it seems the only
function that was called from the blktap library was init_blktap, but
no blktap backend was used anywhere in the qemu code, so I think it's
safe to remove blktap from qemu after all.

Could this be applied to qemu-xen-4.1-testing?

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 01:02:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 01:02:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC5OF-0003EZ-H2; Fri, 07 Oct 2011 01:02:43 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC5KB-0002z9-Qd
	for Xen-devel@lists.xensource.com; Fri, 07 Oct 2011 00:58:32 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1317974289!79921!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17431 invoked from network); 7 Oct 2011 07:58:10 -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;
	7 Oct 2011 07:58:10 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8265749"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 07:58:09 +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, 7 Oct 2011
	08:58:09 +0100
Subject: Re: [Xen-devel] HYBRID: set_page_prot() (make pte readonly)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Mukesh Rathor <mukesh.rathor@oracle.com>
Date: Fri, 7 Oct 2011 08:58:09 +0100
In-Reply-To: <20111006191241.0866625f@mantra.us.oracle.com>
References: <20111006191241.0866625f@mantra.us.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: <1317974289.21903.287.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Fitzhardinge <jeremy@goop.org>,
	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Jeremy, 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, 2011-10-07 at 03:12 +0100, Mukesh Rathor wrote:
> Hi Jeremy,
> 
> This for my hybrid, PV in HVM container with EPT.

Do you have something functional without EPT? I appreciate that this is
just a stepping stone to the final functionality but it might be worth
starting to post those patches? It would be a useful baseline for others
to start looking at additional features/optimisations on top of etc.

>  With EPT, I don't
> have the guest going to xen for any va_mapping, and only dealing with
> pfn's.

Do you do this by stubbing out the hypercalls (e.g. via a VDSO type
thing in guest address space) or are you cutting off the PV MMU stuff at
start of day using XENFEAT_autotranslated_physmap and/or
XENFEAT_writeable_*? Or some other option?

> So, I'm at a loss on how to make set_page_prot() work during 
> xen_map_identity_early(). I tried few things, but no luck. The fixmap
> is not setup during this time, so can't use that. 

You can just omit it altogether if XENFEAT_writeable_pagetables is set?

Ian.

> 
> Have any ideas?
> 
> thanks,
> Mukesh
> 
> _______________________________________________
> 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 Oct 07 01:04:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 01:04:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC5QD-0003cb-5J; Fri, 07 Oct 2011 01:04:45 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC5MK-000314-0d
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 01:01:01 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1317974439!79672!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16236 invoked from network); 7 Oct 2011 08:00:40 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-11.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 08:00:40 -0000
Received: by wwf27 with SMTP id 27so4495372wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 01:00:39 -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=iuP6HlbC+xkOjWuD3AkMYH5pT18ICWCc4V19bMhmxjU=;
	b=jENT+g1KXCRiONAS9+3r9rFr0cAG3nIUlfBfH60GBIcoWiyYv8Dypsr8tLxBzldX8S
	hFUXWXNl7ql+oNRsSEEgG0XY0KJlXRqJtaXw+/lqRZNeb6WqjrdzxBPQJma57Ft2VI10
	2kMqaYcmzA5iHczoLXzhdwWUB2XuB0VjLdOik=
Received: by 10.227.2.206 with SMTP id 14mr1997677wbk.94.1317974439712;
	Fri, 07 Oct 2011 01:00:39 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id fj1sm10662036wbb.13.2011.10.07.01.00.37
	(version=SSLv3 cipher=OTHER); Fri, 07 Oct 2011 01:00:38 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 07 Oct 2011 09:00:32 +0100
Subject: Re: [Xen-devel] [PATCH] Avoid relative XEN_ROOT specification
From: Keir Fraser <keir.xen@gmail.com>
To: Ian Campbell <Ian.Campbell@citrix.com>,
	Juergen Gross <juergen.gross@ts.fujitsu.com>
Message-ID: <CAB47030.22675%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] Avoid relative XEN_ROOT specification
Thread-Index: AcyExy+rzoROXVXAIkaCq3nuFHJ3jg==
In-Reply-To: <1317973890.21903.280.camel@zakaz.uk.xensource.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/10/2011 08:51, "Ian Campbell" <Ian.Campbell@citrix.com> wrote:

> On Fri, 2011-10-07 at 05:42 +0100, Juergen Gross wrote:
>> XEN_ROOT must be set to an absolute path to avoid out of the tree references
> 
> How about:
> 
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1317973741 -3600
> # Node ID d0327c39dff8abdc224e3c19f31e11f0fbeb5c16
> # Parent  f17f0df2a2ede01a8c35dc4768a532a4438b1c02
> tools: error out on non-absolute $(XEN_ROOT)
> 
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

Why not put this in root Config.mk? The restriction applies outside tools/
as well.

 -- Keir

> diff -r f17f0df2a2ed -r d0327c39dff8 tools/Rules.mk
> --- a/tools/Rules.mk Wed Oct 05 10:43:41 2011 +0100
> +++ b/tools/Rules.mk Fri Oct 07 08:49:01 2011 +0100
> @@ -3,6 +3,10 @@
>  # `all' is the default target
>  all:
>  
> +ifeq ($(filter /%,$(XEN_ROOT)),)
> +$(error XEN_ROOT must be absolute)
> +endif
> +
>  include $(XEN_ROOT)/Config.mk
>  
>  export _INSTALL := $(INSTALL)
> 
> 
> 
> _______________________________________________
> 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 Oct 07 01:07:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 01:07:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC5Sn-00046J-O5; Fri, 07 Oct 2011 01:07:26 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC5Pl-0003Wg-N8
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 01:04:18 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317974665!54528291!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4620 invoked from network); 7 Oct 2011 08:04:25 -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;
	7 Oct 2011 08:04:25 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8265901"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:04:14 +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, 7 Oct 2011
	09:04:14 +0100
Subject: Re: [Xen-devel] [PATCH] Avoid relative XEN_ROOT specification
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Keir Fraser <keir.xen@gmail.com>
Date: Fri, 7 Oct 2011 09:04:13 +0100
In-Reply-To: <CAB47030.22675%keir.xen@gmail.com>
References: <CAB47030.22675%keir.xen@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: <1317974654.21903.289.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
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 Fri, 2011-10-07 at 09:00 +0100, Keir Fraser wrote:
> On 07/10/2011 08:51, "Ian Campbell" <Ian.Campbell@citrix.com> wrote:
> 
> > On Fri, 2011-10-07 at 05:42 +0100, Juergen Gross wrote:
> >> XEN_ROOT must be set to an absolute path to avoid out of the tree references
> > 
> > How about:
> > 
> > # HG changeset patch
> > # User Ian Campbell <ian.campbell@citrix.com>
> > # Date 1317973741 -3600
> > # Node ID d0327c39dff8abdc224e3c19f31e11f0fbeb5c16
> > # Parent  f17f0df2a2ede01a8c35dc4768a532a4438b1c02
> > tools: error out on non-absolute $(XEN_ROOT)
> > 
> > Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> 
> Why not put this in root Config.mk?

Didn't think of it...

> The restriction applies outside tools/ as well.

Seems to work.

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1317974632 -3600
# Node ID 02be23c18197d1bdea51031efb8c69ce32bcd7b3
# Parent  f17f0df2a2ede01a8c35dc4768a532a4438b1c02
tools: error out on non-absolute $(XEN_ROOT)

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r f17f0df2a2ed -r 02be23c18197 Config.mk
--- a/Config.mk	Wed Oct 05 10:43:41 2011 +0100
+++ b/Config.mk	Fri Oct 07 09:03:52 2011 +0100
@@ -1,5 +1,9 @@
 # -*- mode: Makefile; -*-
 
+ifeq ($(filter /%,$(XEN_ROOT)),)
+$(error XEN_ROOT must be absolute)
+endif
+
 -include $(XEN_ROOT)/.config
 



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 01:35:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 01:35:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC5uR-0005c5-2M; Fri, 07 Oct 2011 01:35:59 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC5tD-0005NH-Cq
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 01:34:43 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1317976479!85718!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31276 invoked from network); 7 Oct 2011 08:34:40 -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;
	7 Oct 2011 08:34:40 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8266615"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:34:39 +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, 7 Oct 2011
	09:34:39 +0100
Subject: Re: [Xen-devel] [PATCH 1 of 6] libxl: IDL: autogenerate functions
	to produce JSON from libxl data structures
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 09:34:38 +0100
In-Reply-To: <20109.49505.494723.935337@mariner.uk.xensource.com>
References: <patchbomb.1317313227@localhost.localdomain>
	<030e844fccebcc3984c5.1317313228@localhost.localdomain>
	<20109.49505.494723.935337@mariner.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: <1317976479.21903.304.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-10-06 at 15:55 +0100, Ian Jackson wrote:
> Ian Campbell writes ("[Xen-devel] [PATCH 1 of 6] libxl: IDL: autogenerate functi> libxl: IDL: autogenerate functions to produce JSON from libxl data structures.
> ...
> > Also update testidl to generate a random version of each IDL datastructure and
> > convert it to JSON. Unfortunately this requires a libxl_ctx and therefore the
> > test must be run on a Xen system now.
> 
> Perhaps we should have a new version of libxl_ctx_alloc which doesn't
> attempt to connect to xenstore etc., for these kind of purposes.  This
> might turn out to be useful for xl's command line handling too.
> 
> Not essential for this patch, though.

I considered adding a new flag to enable this behaviour, but then I
realised that libxl_ctx_alloc doesn't have a flag parameter... Perhaps
we should add one?

> 
> > +    elif isinstance(ty, libxltypes.Struct) and (parent is None or ty.json_fn is None):
> 
> Do we care about these >80-column lines ?

I suppose we should. The IDL stuff isn't totally 80-column clean right
now but it is close so I may as well clean it up.

> 
> >      f.write("""
> >  #include <stdio.h>
> > +#include <stdlib.h>
> > +#include <string.h>
> > +
> >  #include \"libxl.h\"
> > +#include \"libxl_utils.h\"
> 
> AIU Python's quoting rules, these \'s are unnecessary.  And indeed
> later we have:

Will fix.

> 
> > +      /* A random selection from libxl_cpuid_parse_config */
> > +        {"maxleaf",     32},
> 
> > +static void rand_bytes(uint8_t *p, size_t sz)
> > +{
> > +    int i;
> > +    for (i=0; i<sz; i++)
> > +        p[i] = rand() % 256;
> > +        //p[i] = i;
> 
> This line is leftover cruft ?

Yes.

> 
> > diff -r fb42038b1f5c -r 030e844fcceb tools/libxl/gentypes.py
> > --- a/tools/libxl/gentypes.py	Thu Sep 29 16:57:52 2011 +0100
> > +++ b/tools/libxl/gentypes.py	Thu Sep 29 17:02:14 2011 +0100
> > @@ -29,7 +29,6 @@ def libxl_C_instance_of(ty, instancename
> 
> I haven't reviewed this in detail but I have instead looked at the
> output:
> 
> > yajl_gen_status libxl_uuid_gen_json(yajl_gen hand,
> >                                     libxl_uuid *p);
> 
> Are we confident that these functions will never need to take a
> libxl_ctx ?

My thinking was that these should be consistent with the interface
provided by the equivalent yajl functions (yajl_gen_integer etc).

Partly because otherwise I need to track which types need a ctx and
which don't.

I can't think of any reason a ctx would be needed, any allocations made
would need to be of the type which could be returned to a caller so they
won't be using the gc.

> 
> > yajl_gen_status libxl_disk_format_gen_json(yajl_gen hand, libxl_disk_format *p)
> > {
> >     yajl_gen_status s;
> >     {
> >         const char *se = libxl_disk_format_to_string(*p);
> >         if (se)
> >             s = yajl_gen_string(hand, (const unsigned char *)se, strlen(se));
> >         else
> >             s = yajl_gen_null(hand);
> >         if (s != yajl_gen_status_ok)
> >             goto out;
> >     }
> >     out:
> >     return s;
> > }
> 
> There are quite a few functions which all look like this.  Perhaps the
> bulk of this function should be a helper function, so you end up with
> something like this:
> 
>  yajl_gen_status libxl_disk_format_gen_json(yajl_gen hand, libxl_disk_format *p)
>  {
>     return libxl__yajl_gen_enum(hand, libxl_disk_format_to_string(*p));
>  }
> 
> That might reduce the size of the compiled code quite a bit.  IME
> autogenerated code can get very big if one isn't careful.

Yes, I'll try this.

> > diff -r fb42038b1f5c -r 030e844fcceb tools/libxl/idl.txt
> > --- a/tools/libxl/idl.txt	Thu Sep 29 16:57:52 2011 +0100
> > +++ b/tools/libxl/idl.txt	Thu Sep 29 17:02:14 2011 +0100
> ...
> > +yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand,
> > +                                libxl_cpuid_policy_list *pcpuid)
> > +{
> 
> This rather ad-hoc treatment of cpuid policies isn't ideal I think.
> Did we want to try to recast them as some more general aggregate ?

We have a smallish number of "builtin" types which really ought to be
moved into the IDL, but which are generally complex and need more
thought (other than cpuid we have cpumaps, topology info, hwcaps etc).

The cpuid case is interesting because the libxl_cpuid_policy(_list)
types are actually opaque typedefs of libxl__cpuid_policy and so are not
part of the public IDL. We do now have the internal IDL which could be
used and libxl_cpuid_policy_list_gen_json would become a wrapper of
sorts for libxl__cpuid_policy_gen_json. Even that is more complex than
it sounds since the actual type is currently not using the richer
semantic names like "leaf" and "subleaf" or "e*x" but rather has
input[2] and policy[4].

I'm not especially keen to tackle all that right now though.

> > +    libxl_cpuid_policy_list cpuid = *pcpuid;
> > +    yajl_gen_status s;
> > +    const char *input_names[2] = { "leaf", "subleaf" };
> > +    const char *policy_names[4] = { "eax", "ebx", "ecx", "edx" };
> > +    int i, j;
> > +
> > +    /*
> > +     * Aiming for:
> > +     * [
> > +     *     { 'leaf':    'val-eax',
> > +     *       'subleaf': 'val-edx',
> > +     *       'ebx':     'filter',
> > +     *       'ecx':     'filter',
> > +     *       'edx':     'filter' }, ],
> > +     *     { 'leaf':    'val-eax', ..., 'eax': 'filter', ... },
> > +     *     ... etc ...
> > +     * }
> > +     */
> 
> Mismatched brackets, or confused indenting, in the comment.

Will fix. Once I figure out what I meant...

> > diff -r fb42038b1f5c -r 030e844fcceb tools/libxl/libxl_json.h
> > --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
> > +++ b/tools/libxl/libxl_json.h	Thu Sep 29 17:02:14 2011 +0100
> ...
> > +yajl_gen_status libxl_uuid_gen_json(yajl_gen hand,
> > +                                    libxl_uuid *p);
> 
> Shouldn't these declarations be produced automatically by the IDL
> compiler ?  After all it's going to generate calls to these functions.

It's somewhat consistent with how we deal with these "builtin" types in
other places (and simpler in gentypes.py) to declare these by hand. I'll
see if I can make it work though.

Thanks for the review.

Ian.

> 
> Ian.



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 01:38:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 01:38:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC5wl-00060Y-9K; Fri, 07 Oct 2011 01:38:23 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC5wA-0005o8-Vh
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 01:37:47 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317976674!54534097!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15025 invoked from network); 7 Oct 2011 08:37:54 -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;
	7 Oct 2011 08:37:54 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8266686"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:37:43 +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, 7 Oct 2011
	09:37:43 +0100
Subject: Re: [Xen-devel] [PATCH 01 of 23] libxl: remove hard tabs from
	non-generated *.[ch]
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 09:37:42 +0100
In-Reply-To: <20109.55422.412736.135972@mariner.uk.xensource.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<42dee7039d911db8b82e.1317389594@localhost.localdomain>
	<20109.55422.412736.135972@mariner.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: <1317976663.21903.306.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>, Jim
	Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Mike McClurg <mike.mcclurg@citrix.com>, Dave
	Scott <Dave.Scott@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-10-06 at 17:34 +0100, Ian Jackson wrote:
> Ian Campbell writes ("[Xen-devel] [PATCH 01 of 23] libxl: remove hard tabs from non-generated *.[ch]"):
> > libxl: remove hard tabs from non-generated *.[ch]
> 
> This didn't apply any more (obviously...)
> 
> Did you use some rune involving "expand" perhaps ?  If you were to
> give me the rune as well as the effects, I could apply it to whatever
> the tree happened to look like.

I used search and replace +/- emacs reindent functionality.

You can either apply just whatever isn't rejected and I'll repost what
gets left out (and iterate until none) or I can coordinate a time with
you for me to regenerate and post while you aren't applying stuff.

Ian.


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 01:39:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 01:39:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC5xd-0006Ng-AY; Fri, 07 Oct 2011 01:39:17 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC5wX-0005vK-Kr
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 01:38:10 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317976669!52932600!1
X-Originating-IP: [209.85.216.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24744 invoked from network); 7 Oct 2011 08:37:50 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 08:37:50 -0000
Received: by qyk29 with SMTP id 29so351800qyk.9
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 01:38: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;
	bh=lXWtVX0idG7nDG6rj0aXva1vqZePn8PwfUC7BfKsDBM=;
	b=xpi5+RsCLTtCwokVaynovF8akE7F7H32AepUjSM1Tysstm3Nopu8A1M2t94crQCsM5
	sRX+HUAOlaU9IKOvnZ+bHzgLyzzpJUXPt800cS631es+QAUxniFyfuIIvYlTu5Gw9n33
	ulzD9JCn63HMTu0lBMFib5vyIVQkoYCO2XfAc=
MIME-Version: 1.0
Received: by 10.229.62.79 with SMTP id w15mr1316636qch.219.1317976685304; Fri,
	07 Oct 2011 01:38:05 -0700 (PDT)
Received: by 10.229.190.67 with HTTP; Fri, 7 Oct 2011 01:38:05 -0700 (PDT)
In-Reply-To: <20109.61822.25684.330705@mariner.uk.xensource.com>
References: <patchbomb.1317900424@loki> <dd09f32c882c9e1492b2.1317900426@loki>
	<20109.61822.25684.330705@mariner.uk.xensource.com>
Date: Fri, 7 Oct 2011 10:38:05 +0200
X-Google-Sender-Auth: jE3F3MGmtXIrkQ9smSfh7N7e7gQ
Message-ID: <CAPLaKK4O0ai0EwGiCfuh8k3wk9mw8H5H-vs3N70tjnf5dWkmnw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 2 of 2] build: append YAJL_CLFAGS and
	YAJL_LDFLAGS to libxl build
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Cc: 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

2011/10/6 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> I think this should be done by setting EXTRA_INCLUDES and EXTRA_LIB in
> Config.mk or .config, and shouldn't need an extra pair of variables.

The problem is that EXTRA_INCLUDES and EXTRA_LIB is added to the whole
compilation process, and if I have old xen header files in this
folders together with the yajl headers for example, they get included
instead of the new ones, and the build fails.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 01:40:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 01:40:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC5yS-0006km-VB; Fri, 07 Oct 2011 01:40:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC5wu-00063k-M6
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 01:38:33 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1317976686!38907255!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14602 invoked from network); 7 Oct 2011 08:38:06 -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; 7 Oct 2011 08:38:06 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 07 Oct 2011 09:38:29 +0100
Message-Id: <4E8ED6DD0200007800059ED5@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 07 Oct 2011 09:39:25 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: <boris.ostrovsky@amd.com>
Subject: Re: [Xen-devel] [PATCH] x86/AMD: Do not enable ARAT feature on
	AMD processors below family 0x12
References: <4374a261682e78d6bbf3.1317927545@f15-sabine>
In-Reply-To: <4374a261682e78d6bbf3.1317927545@f15-sabine>
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 06.10.11 at 20:59, Boris Ostrovsky <boris.ostrovsky@amd.com> wrote:
> # HG changeset patch
> # User Boris Ostrovsky <boris.ostrovsky@amd.com>
> # Date 1317915395 14400
> # Node ID 4374a261682e78d6bbf3b3fefb1e779b7a1fc3b3
> # Parent  0b66e6450ffe6823d8b323ef4248b38fe7372d54
> x86/AMD: Do not enable ARAT feature on AMD processors below family 0x12
>=20
> Determining whether an AMD processor is affected by erratum 400 may
> have some corner cases and handling these cases is somewhat complicated.
> In the interest of simplicity we won't claim ARAT support on processor
> families below 0x12.
>=20
> Mirrors Linux commit e9cdd343a5e42c43bcda01e609fa23089e026470
>=20
> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@amd.com>
>=20
> diff -r 0b66e6450ffe -r 4374a261682e xen/arch/x86/cpu/amd.c
> --- a/xen/arch/x86/cpu/amd.c	Tue Oct 04 14:18:30 2011 +0200
> +++ b/xen/arch/x86/cpu/amd.c	Thu Oct 06 11:36:35 2011 -0400
> @@ -495,8 +495,11 @@
>  	}
>  #endif
> =20
> -	/* As a rule processors have APIC timer running in deep C states =
*/
> -	if (c->x86 > 0xf && !cpu_has_amd_erratum(c, AMD_ERRATUM_400))
> +	/*
> +	 * Family 0x12 and above processors have APIC timer
> +	 * running in deep C states.
> +	 */
> +	if (c->x86 > 0x11)
>  		set_bit(X86_FEATURE_ARAT, c->x86_capability);
> =20
>  	if (cpuid_edx(0x80000007) & (1 << 10)) {

Applied, but - couldn't we do away with the erratum 400 definition
now? Or is it reasonable to expect that something else could depend
on this (which, following the back-and-forth here, seems to be fuzzy
anyway)? (I wouldn't mind keeping record of it in the example part
of the comment preceding the errata definitions, as is already the
case.)

Jan


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 01:42:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 01:42:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC60e-0007Ck-Jb; Fri, 07 Oct 2011 01:42:24 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC60E-00070V-Ph
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 01:41:59 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317976896!45572499!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17482 invoked from network); 7 Oct 2011 08:41:37 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 08:41:37 -0000
Received: by qyg14 with SMTP id 14so3481268qyg.9
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 01:41:54 -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=BM2JWSbPZno7XAHc0GcIoAyfnKknYZiFjy01+JE1+s0=;
	b=tdPQr0igT+DK68geZwgQPHcL0VevnnGkXrTNZ3bl/QEuIzglhO2mbFnQ2di7a5jlEq
	It8JT2oym3TwlH9DOkFoX4lat0ODZvm3dZYaTVxsIq5t9SzMzTTEV5ptatUEQU0emLbo
	XcjN69IZgEvzNTy66ZlkeGQ837QoMoIeG/Xb8=
MIME-Version: 1.0
Received: by 10.229.38.131 with SMTP id b3mr1300450qce.295.1317976914554; Fri,
	07 Oct 2011 01:41:54 -0700 (PDT)
Received: by 10.229.190.67 with HTTP; Fri, 7 Oct 2011 01:41:54 -0700 (PDT)
In-Reply-To: <20109.63267.262213.24308@mariner.uk.xensource.com>
References: <1313764724-12683-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1316729665-15004-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1317371652.26672.236.camel@zakaz.uk.xensource.com>
	<20109.63267.262213.24308@mariner.uk.xensource.com>
Date: Fri, 7 Oct 2011 10:41:54 +0200
X-Google-Sender-Auth: q3c22EkHEHFyMRTSPEgAz3qUxeA
Message-ID: <CAPLaKK5cXfYZ69zj5ArrYS54s8sHN2J0MsvtWqE6S4NTCXSvsA@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [PATCH v6 0/3] libxenvchan: interdomain
	communications library
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Cc: Ian Campbell <Ian.Campbell@eu.citrix.com>,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"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

Why are the binary files tools/libvchan/vchan-node1 and
tools/libvchan/vchan-node2 added to the repository?

Now after compilation I get:

M tools/libvchan/vchan-node1
M tools/libvchan/vchan-node2

Because the compilation process changes them, and I cannot navigate
trough my patch list because of this local changes.

Regards, Roger.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 01:44:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 01:44:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC631-0007bi-Ex; Fri, 07 Oct 2011 01:44:51 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC62I-0007Oh-S8
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 01:44:07 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1317977033!49983919!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14644 invoked from network); 7 Oct 2011 08:43:53 -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;
	7 Oct 2011 08:43:53 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8266985"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:44: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, 7 Oct 2011
	09:44:03 +0100
Subject: Re: [Xen-devel] [PATCH 10 of 23] libxl: separate forced and
	non-forced	device remove
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 09:44:02 +0100
In-Reply-To: <20109.55712.847181.699115@mariner.uk.xensource.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<dd195d45be273cf85ef0.1317389603@localhost.localdomain>
	<20109.55712.847181.699115@mariner.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: <1317977043.21903.312.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>, Jim
	Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Mike McClurg <mike.mcclurg@citrix.com>, Dave
	Scott <Dave.Scott@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-10-06 at 17:38 +0100, Ian Jackson wrote:
> Ian Campbell writes ("[Xen-devel] [PATCH 10 of 23] libxl: separate forced and non-forced device remove"):
> > libxl: separate forced and non-forced device remove.
> ...
> >   * the term "destroy" is normally used in libxl for data-type destructors.
> 
> I've always thought this was odd.  Perhaps we should rename all of
> those "free" and then we could use "destroy" just for domain
> destruction and other kinds of violent activity.

The original rationale for the name was that the libxl_TYPE_destroy
functions only free the content of the datastructure but not the
datastructure itself and that calling such a function free() would be
potentially confusing.

On the other hand not being able to use "destroy" as a term for things
related domain destruction is a pain too.

Thesaurus.com suggests various things for destroy and/or free which we
could use for the type destructors. There's lots of fun sounding ones
("bollix up", "enfranchise") but "release" perhaps?

Ian.


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 01:45:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 01:45:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC63u-00080G-6A; Fri, 07 Oct 2011 01:45:46 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC63P-0007n0-2g
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 01:45:15 -0700
X-Env-Sender: agx@sigxcpu.org
X-Msg-Ref: server-6.tower-216.messagelabs.com!1317977111!87534!1
X-Originating-IP: [87.79.238.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4461 invoked from network); 7 Oct 2011 08:45:11 -0000
Received: from static-87-79-238-240.netcologne.de (HELO honk.sigxcpu.org)
	(87.79.238.240)
	by server-6.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2011 08:45:11 -0000
Received: from localhost (localhost [127.0.0.1])
	by honk.sigxcpu.org (Postfix) with ESMTP id 9DF4B9C003
	for <xen-devel@lists.xensource.com>;
	Fri,  7 Oct 2011 10:45:09 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at honk.sigxcpu.org
Received: from honk.sigxcpu.org ([127.0.0.1])
	by localhost (honk.sigxcpu.org [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id 1gki80ixG2pI for <xen-devel@lists.xensource.com>;
	Fri,  7 Oct 2011 10:45:08 +0200 (CEST)
Received: by bogon.sigxcpu.org (Postfix, from userid 1000)
	id C87B851DBC; Fri,  7 Oct 2011 10:45:06 +0200 (CEST)
Date: Fri, 7 Oct 2011 10:45:06 +0200
From: Guido =?iso-8859-1?Q?G=FCnther?= <agx@sigxcpu.org>
To: xen-devel@lists.xensource.com
Message-ID: <20111007084506.GA23628@bogon.sigxcpu.org>
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] [PATCH] pygrub: add debug flag
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Debugging config file errors is tedious so help a bit by not silently
dropping parsing exceptions when --debug is given. Also intialize the
logging API at debug level in this case.
Cheers,
 -- Guido

---
 tools/pygrub/src/pygrub |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/tools/pygrub/src/pygrub b/tools/pygrub/src/pygrub
index 52b1823..5dc9405 100644
--- a/tools/pygrub/src/pygrub
+++ b/tools/pygrub/src/pygrub
@@ -13,7 +13,7 @@
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 #
 
-import os, sys, string, struct, tempfile, re
+import os, sys, string, struct, tempfile, re, traceback
 import copy
 import logging
 import platform
@@ -665,7 +665,7 @@ if __name__ == "__main__":
                                    ["quiet", "interactive", "not-really", "help", 
                                     "output=", "output-format=", "output-directory=",
                                     "entry=", "kernel=", 
-                                    "ramdisk=", "args=", "isconfig"])
+                                    "ramdisk=", "args=", "isconfig", "debug"])
     except getopt.GetoptError:
         usage()
         sys.exit(1)
@@ -679,6 +679,7 @@ if __name__ == "__main__":
     entry = None
     interactive = True
     isconfig = False
+    debug = False
     not_really = False
     output_format = "sxp"
     output_directory = "/var/run/xend/boot"
@@ -714,6 +715,8 @@ if __name__ == "__main__":
             interactive = False
         elif o in ("--isconfig",):
             isconfig = True
+        elif o in ("--debug",):
+            debug = True
         elif o in ("--output-format",):
             if a not in ["sxp", "simple", "simple0"]:
                 print "unkonwn output format %s" % a
@@ -723,6 +726,9 @@ if __name__ == "__main__":
         elif o in ("--output-directory",):
             output_directory = a
 
+    if debug:
+	logging.basicConfig(level=logging.DEBUG)
+
     if output is None or output == "-":
         fd = sys.stdout.fileno()
     else:
@@ -769,6 +775,8 @@ if __name__ == "__main__":
         except:
             # IOErrors raised by fsimage.open
             # RuntimeErrors raised by run_grub if no menu.lst present
+            if debug:
+		traceback.print_exc()
             fs = None
             continue
 
-- 
1.7.6.3

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 02:16:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 02:16:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC6Xq-0001F2-If; Fri, 07 Oct 2011 02:16:42 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC6XJ-00013K-37
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 02:16:09 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1317978965!34322448!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31666 invoked from network); 7 Oct 2011 09:16:05 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 09:16:05 -0000
Received: by wwf27 with SMTP id 27so4585002wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 02:16:05 -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=cIYZY8Dr1poEHZruhWRvCM4yd8EmyMFKhF/Ju2yWWio=;
	b=eMbv+iECw6xWmkSe3K+TwKWG9Nn1jmTLApVjRCpvYWBlD1IHnMBpgjfFbgwwQ7oZ5a
	IQBCRkSRzV4gV2hO/Y9tztubzVoWAz2pDI+ck8z7FOyRAGMt1vybEl3W0ZLasn+7ek5H
	W/8N+yxBEYCzZNW0GXZGhL98E3kN71p3LqOCA=
Received: by 10.216.56.12 with SMTP id l12mr514781wec.19.1317978963461;
	Fri, 07 Oct 2011 02:16:03 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id y10sm14918928wbm.14.2011.10.07.02.16.00
	(version=SSLv3 cipher=OTHER); Fri, 07 Oct 2011 02:16:02 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 07 Oct 2011 10:15:57 +0100
Subject: Re: [Xen-devel] Re: [PATCH v6 0/3] libxenvchan: interdomain
	communications library
From: Keir Fraser <keir@xen.org>
To: Roger Pau =?ISO-8859-1?B?TW9ubuk=?= <roger.pau@entel.upc.edu>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
Message-ID: <CAB481DD.325A9%keir@xen.org>
Thread-Topic: [Xen-devel] Re: [PATCH v6 0/3] libxenvchan: interdomain
	communications library
Thread-Index: AcyE0bjHtF3YtR1j6k2wRdDG0+9EVQ==
In-Reply-To: <CAPLaKK5cXfYZ69zj5ArrYS54s8sHN2J0MsvtWqE6S4NTCXSvsA@mail.gmail.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="ISO-8859-1"
Content-transfer-encoding: quoted-printable
Cc: Ian Campbell <Ian.Campbell@eu.citrix.com>,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.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 07/10/2011 09:41, "Roger Pau Monn=E9" <roger.pau@entel.upc.edu> wrote:

> Why are the binary files tools/libvchan/vchan-node1 and
> tools/libvchan/vchan-node2 added to the repository?
>=20
> Now after compilation I get:
>=20
> M tools/libvchan/vchan-node1
> M tools/libvchan/vchan-node2
>=20
> Because the compilation process changes them, and I cannot navigate
> trough my patch list because of this local changes.

Probably added in error after a test build. The problem is that they should
be listed in .hgignore.

 -- Keir

> Regards, Roger.
>=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 Fri Oct 07 02:34:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 02:34:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC6or-0001rx-BP; Fri, 07 Oct 2011 02:34:17 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC6o4-0001fb-2Q
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 02:33:28 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1317980004!21192481!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4548 invoked from network); 7 Oct 2011 09:33:24 -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;
	7 Oct 2011 09:33:24 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8268236"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 09:33: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; Fri, 7 Oct 2011
	10:33:24 +0100
Subject: Re: [Xen-devel] [PATCH] pygrub: add debug flag
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Guido =?ISO-8859-1?Q?G=FCnther?= <agx@sigxcpu.org>
Date: Fri, 7 Oct 2011 10:33:23 +0100
In-Reply-To: <20111007084506.GA23628@bogon.sigxcpu.org>
References: <20111007084506.GA23628@bogon.sigxcpu.org>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317980004.21903.315.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-10-07 at 09:45 +0100, Guido GÃ¼nther wrote:
> Debugging config file errors is tedious so help a bit by not silently
> dropping parsing exceptions when --debug is given. Also intialize the
> logging API at debug level in this case.

This looks fine but requires a Signed-off-line, per the DCO
http://wiki.xen.org/xenwiki/SubmittingXenPatches

Acked-by: Ian Campbell <ian.campbell@citrix.com>

BTW another useful but not widely known debug feature is that you can
run {Grub,ExtLinux}Conf.py directly passing a config file as a parameter
and they will print out what they parse from it, or the errors as
appropriate.

Ian.

> Cheers,
>  -- Guido
> 
> ---
>  tools/pygrub/src/pygrub |   12 ++++++++++--
>  1 files changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/tools/pygrub/src/pygrub b/tools/pygrub/src/pygrub
> index 52b1823..5dc9405 100644
> --- a/tools/pygrub/src/pygrub
> +++ b/tools/pygrub/src/pygrub
> @@ -13,7 +13,7 @@
>  # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
>  #
>  
> -import os, sys, string, struct, tempfile, re
> +import os, sys, string, struct, tempfile, re, traceback
>  import copy
>  import logging
>  import platform
> @@ -665,7 +665,7 @@ if __name__ == "__main__":
>                                     ["quiet", "interactive", "not-really", "help", 
>                                      "output=", "output-format=", "output-directory=",
>                                      "entry=", "kernel=", 
> -                                    "ramdisk=", "args=", "isconfig"])
> +                                    "ramdisk=", "args=", "isconfig", "debug"])
>      except getopt.GetoptError:
>          usage()
>          sys.exit(1)
> @@ -679,6 +679,7 @@ if __name__ == "__main__":
>      entry = None
>      interactive = True
>      isconfig = False
> +    debug = False
>      not_really = False
>      output_format = "sxp"
>      output_directory = "/var/run/xend/boot"
> @@ -714,6 +715,8 @@ if __name__ == "__main__":
>              interactive = False
>          elif o in ("--isconfig",):
>              isconfig = True
> +        elif o in ("--debug",):
> +            debug = True
>          elif o in ("--output-format",):
>              if a not in ["sxp", "simple", "simple0"]:
>                  print "unkonwn output format %s" % a
> @@ -723,6 +726,9 @@ if __name__ == "__main__":
>          elif o in ("--output-directory",):
>              output_directory = a
>  
> +    if debug:
> +	logging.basicConfig(level=logging.DEBUG)
> +
>      if output is None or output == "-":
>          fd = sys.stdout.fileno()
>      else:
> @@ -769,6 +775,8 @@ if __name__ == "__main__":
>          except:
>              # IOErrors raised by fsimage.open
>              # RuntimeErrors raised by run_grub if no menu.lst present
> +            if debug:
> +		traceback.print_exc()
>              fs = None
>              continue
>  



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 02:49:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 02:49:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC737-0002hi-Bh; Fri, 07 Oct 2011 02:49:01 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC72a-0002Vo-75
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 02:48:28 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1317980894!49994933!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18186 invoked from network); 7 Oct 2011 09:48:14 -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 Oct 2011 09:48:14 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8268620"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 09:48: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; Fri, 7 Oct 2011 10:48:24 +0100
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
	1RC72V-0002wx-UB; Fri, 07 Oct 2011 09:48:23 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RC72V-0006tF-TC;
	Fri, 07 Oct 2011 10:48:23 +0100
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: <20110.51943.893599.541863@mariner.uk.xensource.com>
Date: Fri, 7 Oct 2011 10:48:23 +0100
To: Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] Re: [PATCH v6 0/3] libxenvchan: interdomain
	communications library
In-Reply-To: <CAB481DD.325A9%keir@xen.org>
References: <CAPLaKK5cXfYZ69zj5ArrYS54s8sHN2J0MsvtWqE6S4NTCXSvsA@mail.gmail.com>
	<CAB481DD.325A9%keir@xen.org>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Ian Campbell <Ian.Campbell@eu.citrix.com>, "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, Stabellini <Stefano.Stabellini@eu.citrix.com>, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, Stefano, Roger Pau Monné <roger.pau@entel.upc.edu>, Daniel De Graaf <dgdegra@tycho.nsa.gov>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Fraser writes ("Re: [Xen-devel] Re: [PATCH v6 0/3] libxenvchan: interdomain communications library"):
> On 07/10/2011 09:41, "Roger Pau Monné" <roger.pau@entel.upc.edu> wrote:
> > Why are the binary files tools/libvchan/vchan-node1 and
> > tools/libvchan/vchan-node2 added to the repository?
> > 
> > Now after compilation I get:
> > 
> > M tools/libvchan/vchan-node1
> > M tools/libvchan/vchan-node2
> > 
> > Because the compilation process changes them, and I cannot navigate
> > trough my patch list because of this local changes.

Sorry about this.

> Probably added in error after a test build. The problem is that they should
> be listed in .hgignore.

Yes, now fixed in staging and will be in the tested tree later today.

# HG changeset patch
# User Ian Jackson <Ian.Jackson@eu.citrix.com>
# Date 1317980824 -3600
# Node ID eb8637351535e9c76779d6dd78a1d5b4a434c082
# Parent  5b5394a55813dfa778a8c944bc0e6a0956629f64
libvchan: remove erroneously-committed libvchan-node[12]; add them to .hgignore

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

diff -r 5b5394a55813 -r eb8637351535 .hgignore
--- a/.hgignore	Fri Oct 07 09:35:31 2011 +0100
+++ b/.hgignore	Fri Oct 07 10:47:04 2011 +0100
@@ -189,6 +189,7 @@
 ^tools/libxl/xl$
 ^tools/libxl/testidl$
 ^tools/libxl/testidl\.c$
+^tools/libvchan/vchan-node[12]$
 ^tools/libaio/src/.*\.ol$
 ^tools/libaio/src/.*\.os$
 ^tools/misc/cpuperf/cpuperf-perfcntr$
diff -r 5b5394a55813 -r eb8637351535 tools/libvchan/vchan-node1
Binary file tools/libvchan/vchan-node1 has changed
diff -r 5b5394a55813 -r eb8637351535 tools/libvchan/vchan-node2
Binary file tools/libvchan/vchan-node2 has changed

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:23:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:23:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7al-0003Zp-UY; Fri, 07 Oct 2011 03:23:48 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7Zp-0003NO-Qi
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:22:50 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1317982965!102999!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7359 invoked from network); 7 Oct 2011 10:22:46 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-15.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:22:46 -0000
Received: by qyg14 with SMTP id 14so3537297qyg.9
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 03:22:45 -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=vVPL8JjqezDs8oz6T8QuBirIKcmmy5y8C5ekSmeM3OQ=;
	b=eBHj7UWkF/coGwRC+hwwBR3VyixN1gse0+PDcH5PmkksF/4dQVKqBwI4ihcSC+P5Ql
	m8lligxY6ri1Ko8DtyvYjCabKzEO7i5jAFNuMGMuIrwhgAyClRuhO5OYX+hsdt7zOG+z
	Oihj+XKAgRDLvwdV6YC/rmSfC29vw5tAIbK2E=
MIME-Version: 1.0
Received: by 10.229.86.135 with SMTP id s7mr1384299qcl.257.1317982965194; Fri,
	07 Oct 2011 03:22:45 -0700 (PDT)
Received: by 10.229.190.67 with HTTP; Fri, 7 Oct 2011 03:22:45 -0700 (PDT)
In-Reply-To: <20110.51943.893599.541863@mariner.uk.xensource.com>
References: <CAPLaKK5cXfYZ69zj5ArrYS54s8sHN2J0MsvtWqE6S4NTCXSvsA@mail.gmail.com>
	<CAB481DD.325A9%keir@xen.org>
	<20110.51943.893599.541863@mariner.uk.xensource.com>
Date: Fri, 7 Oct 2011 12:22:45 +0200
X-Google-Sender-Auth: xn9h7a5MsZPxEZIFNwkArVYTpv4
Message-ID: <CAPLaKK5AsFRt7MnPKa0pwHpu_aAaY5Mf-RC=E4Pf=Ucj43ag5Q@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [PATCH v6 0/3] libxenvchan: interdomain
	communications library
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@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>,
	Keir Fraser <keir@xen.org>, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Ian Campbell <Ian.Campbell@eu.citrix.com>,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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/10/7 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> Keir Fraser writes ("Re: [Xen-devel] Re: [PATCH v6 0/3] libxenvchan: inte=
rdomain communications library"):
>> On 07/10/2011 09:41, "Roger Pau Monn=C3=A9" <roger.pau@entel.upc.edu> wr=
ote:
>> > Why are the binary files tools/libvchan/vchan-node1 and
>> > tools/libvchan/vchan-node2 added to the repository?
>> >
>> > Now after compilation I get:
>> >
>> > M tools/libvchan/vchan-node1
>> > M tools/libvchan/vchan-node2
>> >
>> > Because the compilation process changes them, and I cannot navigate
>> > trough my patch list because of this local changes.
>
> Sorry about this.

NP, it's just that I didn't know if it had anything to do with
building Xen on NetBSD. Thanks!

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:28:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:28:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7fM-00041J-HD; Fri, 07 Oct 2011 03:28:32 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7eo-0003oD-PD
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:27:59 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1317983274!34335386!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12542 invoked from network); 7 Oct 2011 10:27:55 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:27:55 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026592"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:27:53 -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, 7 Oct 2011 06:27:53 -0400
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
	p97ARpa1027909;	Fri, 7 Oct 2011 03:27:52 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1317983270@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Fri, 7 Oct 2011 11:27:50 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 0 of 4 v2] libxl: support json for pretty
	printing objects
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Now that Anthony's QMP series is in we can build upon the use of YAJL
to add support for pretty printing libxl objects as JSON.

Also includes a user in xl (to print disks on dry run) and an
associated fix to the check-xl-disk-parse test script.

This is the second posting. A subset of the patches have been applied
so I have rebased. I have also addressed most of Ian J's review
comments on "libxl: IDL: autogenerate functions to produce JSON from
libxl data structures":
  - wrap python code to 80 columns
  - fixup quoting (although I had to add another case in \"%s=%#x\"
    because "%s=%#x" was confusing emacs' syntax highlighting due to
    the # being treated as a comment and hiding the closing ".
  - remove leftover cruft
  - added libxl__yagl_gen_enum helper
  - autogenerate *_gen_json prototypes for builtins instead of
    handcoding them.

I didn't address the cpuid related comments.

I switched to using "xl" not "/usr/sbin/xl" in that patch.


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:29:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:29:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7gG-0004Nx-N9; Fri, 07 Oct 2011 03:29:28 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7eq-0003oE-3d
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:28:02 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1317983274!34335386!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12579 invoked from network); 7 Oct 2011 10:27:56 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:27:56 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026595"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:27: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, 7 Oct 2011 06:27:54 -0400
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
	p97ARpa2027909;	Fri, 7 Oct 2011 03:27:53 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 75a0a29cccbfce75ba3087cdaf53adfd1b377a11
Message-ID: <75a0a29cccbfce75ba30.1317983271@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1317983270@cosworth.uk.xensource.com>
References: <patchbomb.1317983270@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Fri, 7 Oct 2011 11:27:51 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 1 of 4 v2] libxl: IDL: autogenerate functions to
 produce JSON from libxl data structures
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317981945 -3600
# Node ID 75a0a29cccbfce75ba3087cdaf53adfd1b377a11
# Parent  43b99763284fa639e47dbeb9245f0ebd1d4f2dad
libxl: IDL: autogenerate functions to produce JSON from libxl data structures.

Two functions are provided. TYPE_gen_json exposes an interface which is
compatible with the YAGL generator infrastructure. TYPE_to_string uses this to
produce a pretty printed string.

The TYPE_gen_json functions are defined in a new header libxl_json.h which is
not exposed via libxl.h due to the use of YAGL datatypes to avoid poluting the
namespace us libxl users which don't use the library themselves.  If a libxl
user is interested in integrating at the YAGL level then it should #include
this file itself.

Also update testidl to generate a random version of each IDL datastructure and
convert it to JSON. Unfortunately this requires a libxl_ctx and therefore the
test must be run on a Xen system now.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 43b99763284f -r 75a0a29cccbf tools/libxl/Makefile
--- a/tools/libxl/Makefile	Fri Oct 07 10:10:31 2011 +0100
+++ b/tools/libxl/Makefile	Fri Oct 07 11:05:45 2011 +0100
@@ -84,14 +84,17 @@ _libxl_paths.h: genpath
 libxl_paths.c: _libxl_paths.h
 
 libxl.h: _libxl_types.h
+libxl_json.h: _libxl_types_json.h
 libxl_internal.h: _libxl_types_internal.h
+libxl_internal_json.h: _libxl_types_internal_json.h
 
 $(LIBXL_OBJS) $(LIBXLU_OBJS) $(XL_OBJS): libxl.h
 $(LIBXL_OBJS): libxl_internal.h
 
-_libxl_type%.h _libxl_type%.c: libxl_type%.idl gentypes.py libxltypes.py
-	$(PYTHON) gentypes.py libxl_type$*.idl __libxl_type$*.h __libxl_type$*.c
+_libxl_type%.h _libxl_type%_json.h _libxl_type%.c: libxl_type%.idl gentypes.py libxltypes.py
+	$(PYTHON) gentypes.py libxl_type$*.idl __libxl_type$*.h __libxl_type$*_json.h __libxl_type$*.c
 	$(call move-if-changed,__libxl_type$*.h,_libxl_type$*.h)
+	$(call move-if-changed,__libxl_type$*_json.h,_libxl_type$*_json.h)
 	$(call move-if-changed,__libxl_type$*.c,_libxl_type$*.c)
 
 libxenlight.so: libxenlight.so.$(MAJOR)
@@ -140,7 +143,7 @@ install: all
 	ln -sf libxlutil.so.$(XLUMAJOR).$(XLUMINOR) $(DESTDIR)$(LIBDIR)/libxlutil.so.$(XLUMAJOR)
 	ln -sf libxlutil.so.$(XLUMAJOR) $(DESTDIR)$(LIBDIR)/libxlutil.so
 	$(INSTALL_DATA) libxlutil.a $(DESTDIR)$(LIBDIR)
-	$(INSTALL_DATA) libxl.h _libxl_types.h libxl_utils.h libxl_uuid.h $(DESTDIR)$(INCLUDEDIR)
+	$(INSTALL_DATA) libxl.h libxl_json.h _libxl_types.h _libxl_types_json.h libxl_utils.h libxl_uuid.h $(DESTDIR)$(INCLUDEDIR)
 	$(INSTALL_DATA) bash-completion $(DESTDIR)$(BASH_COMPLETION_DIR)/xl.sh
 
 .PHONY: clean
diff -r 43b99763284f -r 75a0a29cccbf tools/libxl/gentest.py
--- a/tools/libxl/gentest.py	Fri Oct 07 10:10:31 2011 +0100
+++ b/tools/libxl/gentest.py	Fri Oct 07 11:05:45 2011 +0100
@@ -5,6 +5,7 @@ import re
 import random
 
 import libxltypes
+
 def randomize_char(c):
     if random.random() < 0.5:
         return str.lower(c)
@@ -15,6 +16,55 @@ def randomize_case(s):
     r = [randomize_char(c) for c in s]
     return "".join(r)
 
+def randomize_enum(e):
+    return random.choice([v.name for v in e.values])
+
+handcoded = ["libxl_cpumap", "libxl_key_value_list",
+             "libxl_cpuid_policy_list", "libxl_file_reference",
+             "libxl_string_list", "libxl_cpuarray"]
+
+def gen_rand_init(ty, v, indent = "    ", parent = None):
+    s = ""
+    if isinstance(ty, libxltypes.Enumeration):
+        s += "%s = %s;\n" % (ty.pass_arg(v, parent is None), randomize_enum(ty))
+    elif isinstance(ty, libxltypes.KeyedUnion):
+        if parent is None:
+            raise Exception("KeyedUnion type must have a parent")
+        s += "switch (%s) {\n" % (parent + ty.keyvar_name)
+        for f in ty.fields:
+            (nparent,fexpr) = ty.member(v, f, parent is None)
+            s += "case %s:\n" % f.enumname
+            s += gen_rand_init(f.type, fexpr, indent + "    ", nparent)
+            s += "    break;\n"
+        s += "}\n"
+    elif isinstance(ty, libxltypes.Struct) \
+     and (parent is None or ty.json_fn is None):
+        for f in [f for f in ty.fields if not f.const]:
+            (nparent,fexpr) = ty.member(v, f, parent is None)
+            s += gen_rand_init(f.type, fexpr, "", nparent)
+    elif hasattr(ty, "rand_init") and ty.rand_init is not None:
+        s += "%s(%s);\n" % (ty.rand_init,
+                            ty.pass_arg(v, isref=parent is None,
+                                        passby=libxltypes.PASS_BY_REFERENCE))
+    elif ty.typename in ["libxl_uuid", "libxl_mac", "libxl_hwcap"]:
+        s += "rand_bytes((uint8_t *)%s, sizeof(*%s));\n" % (v,v)
+    elif ty.typename in ["libxl_domid"] or isinstance(ty, libxltypes.Number):
+        s += "%s = rand() %% (sizeof(%s)*8);\n" % \
+             (ty.pass_arg(v, parent is None),
+              ty.pass_arg(v, parent is None))
+    elif ty.typename in ["bool"]:
+        s += "%s = rand() %% 2;\n" % v
+    elif ty.typename in ["char *"]:
+        s += "%s = rand_str();\n" % v
+    elif ty.typename in handcoded:
+        raise Exception("Gen for handcoded %s" % ty.typename)
+    else:
+        raise Exception("Cannot randomly init %s" % ty.typename)
+
+    if s != "":
+        s = indent + s
+    return s.replace("\n", "\n%s" % indent).rstrip(indent)
+
 if __name__ == '__main__':
     if len(sys.argv) < 3:
         print >>sys.stderr, "Usage: gentest.py <idl> <implementation>"
@@ -23,27 +73,208 @@ if __name__ == '__main__':
     random.seed()
 
     idl = sys.argv[1]
-    (_,types) = libxltypes.parse(idl)
+    (builtins,types) = libxltypes.parse(idl)
 
     impl = sys.argv[2]
     f = open(impl, "w")
     f.write("""
 #include <stdio.h>
-#include \"libxl.h\"
+#include <stdlib.h>
+#include <string.h>
 
+#include "libxl.h"
+#include "libxl_utils.h"
+
+static char *rand_str(void)
+{
+    int i, sz = rand() % 32;
+    char *s = malloc(sz+1);
+    for (i=0; i<sz; i++)
+        s[i] = 'a' + (rand() % 26);
+    s[i] = '\\0';
+    return s;
+}
+
+static void rand_bytes(uint8_t *p, size_t sz)
+{
+    int i;
+    for (i=0; i<sz; i++)
+        p[i] = rand() % 256;
+}
+
+static void libxl_cpumap_rand_init(libxl_cpumap *cpumap)
+{
+    int i;
+    cpumap->size = rand() % 16;
+    cpumap->map = calloc(cpumap->size, sizeof(*cpumap->map));
+    libxl_for_each_cpu(i, *cpumap) {
+        if (rand() % 2)
+            libxl_cpumap_set(cpumap, i);
+        else
+            libxl_cpumap_reset(cpumap, i);
+    }
+}
+
+static void libxl_key_value_list_rand_init(libxl_key_value_list *pkvl)
+{
+    int i, nr_kvp = rand() % 16;
+    libxl_key_value_list kvl = calloc(nr_kvp+1, 2*sizeof(char *));
+
+    for (i = 0; i<2*nr_kvp; i += 2) {
+        kvl[i] = rand_str();
+        if (rand() % 8)
+            kvl[i+1] = rand_str();
+        else
+            kvl[i+1] = NULL;
+    }
+    kvl[i] = NULL;
+    kvl[i+1] = NULL;
+    *pkvl = kvl;
+}
+
+static void libxl_cpuid_policy_list_rand_init(libxl_cpuid_policy_list *pp)
+{
+    int i, nr_policies = rand() % 16;
+    struct {
+        const char *n;
+        int w;
+    } options[] = {
+      /* A random selection from libxl_cpuid_parse_config */
+        {"maxleaf",     32},
+        {"family",       8},
+        {"model",        8},
+        {"stepping",     4},
+        {"localapicid",  8},
+        {"proccount",    8},
+        {"clflush",      8},
+        {"brandid",      8},
+        {"f16c",         1},
+        {"avx",          1},
+        {"osxsave",      1},
+        {"xsave",        1},
+        {"aes",          1},
+        {"popcnt",       1},
+        {"movbe",        1},
+        {"x2apic",       1},
+        {"sse4.2",       1},
+        {"sse4.1",       1},
+        {"dca",          1},
+        {"pdcm",         1},
+        {"procpkg",      6},
+    };
+    const int nr_options = sizeof(options)/sizeof(options[0]);
+    char buf[64];
+    libxl_cpuid_policy_list p = NULL;
+
+    for (i = 0; i < nr_policies; i++) {
+        int opt = rand() % nr_options;
+        int val = rand() % (1<<options[opt].w);
+        snprintf(buf, 64, \"%s=%#x\", options[opt].n, val);
+        libxl_cpuid_parse_config(&p, buf);
+    }
+    *pp = p;
+}
+
+static void libxl_file_reference_rand_init(libxl_file_reference *p)
+{
+    memset(p, 0, sizeof(*p));
+    if (rand() % 8)
+        p->path = rand_str();
+}
+
+static void libxl_string_list_rand_init(libxl_string_list *p)
+{
+    int i, nr = rand() % 16;
+    libxl_string_list l = calloc(nr+1, sizeof(char *));
+
+    for (i = 0; i<nr; i++) {
+        l[i] = rand_str();
+    }
+    l[i] = NULL;
+    *p = l;
+}
+
+static void libxl_cpuarray_rand_init(libxl_cpuarray *p)
+{
+    int i;
+    /* Up to 16 VCPUs on 32 PCPUS */
+    p->entries = rand() % 16;
+    p->array = calloc(p->entries, sizeof(*p->array));
+    for (i = 0; i < p->entries; i++) {
+        int r = rand() % 32*1.5; /* 2:1 valid:invalid */
+        if (r >= 32)
+            p->array[i] = LIBXL_CPUARRAY_INVALID_ENTRY;
+        else
+            p->array[i] = r;
+    }
+}
+""")
+    for ty in builtins + types:
+        if ty.typename not in handcoded:
+            f.write("static void %s_rand_init(%s);\n" % \
+                    (ty.typename,
+                     ty.make_arg("p", passby=libxltypes.PASS_BY_REFERENCE)))
+            f.write("static void %s_rand_init(%s)\n" % \
+                    (ty.typename,
+                     ty.make_arg("p", passby=libxltypes.PASS_BY_REFERENCE)))
+            f.write("{\n")
+            f.write(gen_rand_init(ty, "p"))
+            f.write("}\n")
+            f.write("\n")
+        ty.rand_init = "%s_rand_init" % ty.typename
+
+    f.write("""
 int main(int argc, char **argv)
 {
 """)
 
-    for ty in [t for t in types if isinstance(t,libxltypes.Enumeration)]:
+    for ty in types:
         f.write("    %s %s_val;\n" % (ty.typename, ty.typename))
-    f.write("    int rc;\n")
-    f.write("\n")
+    f.write("""
+    int rc;
+    char *s;
+    xentoollog_logger_stdiostream *logger;
+    libxl_ctx *ctx;
 
+    logger = xtl_createlogger_stdiostream(stderr, XTL_DETAIL, 0);
+    if (!logger) exit(1);
+
+    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, (xentoollog_logger*)logger)) {
+        fprintf(stderr, "cannot init xl context\\n");
+        exit(1);
+    }
+""")
+    f.write("    printf(\"Testing TYPE_to_json()\\n\");\n")
+    f.write("    printf(\"----------------------\\n\");\n")
+    f.write("    printf(\"\\n\");\n")
+    for ty in [t for t in types if t.json_fn is not None]:
+        arg = ty.typename + "_val"
+        f.write("    %s_rand_init(%s);\n" % (ty.typename, \
+            ty.pass_arg(arg, isref=False, passby=libxltypes.PASS_BY_REFERENCE)))
+        f.write("    s = %s_to_json(ctx, %s);\n" % \
+                (ty.typename, ty.pass_arg(arg, isref=False)))
+        f.write("    printf(\"%%s: %%s\\n\", \"%s\", s);\n" % ty.typename)
+        f.write("    if (s == NULL) abort();\n")
+        f.write("    free(s);\n")
+        if ty.destructor_fn is not None:
+            f.write("    %s(&%s_val);\n" % (ty.destructor_fn, ty.typename))
+        f.write("\n")
+
+    f.write("    printf(\"Testing Enumerations\\n\");\n")
+    f.write("    printf(\"--------------------\\n\");\n")
+    f.write("    printf(\"\\n\");\n")
     for ty in [t for t in types if isinstance(t,libxltypes.Enumeration)]:
         f.write("    printf(\"%s -- to string:\\n\");\n" % (ty.typename))
         for v in ty.values:
-            f.write("    printf(\"\\t%s = %%d = \\\"%%s\\\"\\n\", %s, %s_to_string(%s));\n" %\
+            f.write("    printf(\"\\t%s = %%d = \\\"%%s\\\"\\n\", " \
+                    "%s, %s_to_string(%s));\n" % \
+                    (v.valuename, v.name, ty.typename, v.name))
+        f.write("\n")
+
+        f.write("    printf(\"%s -- to JSON:\\n\");\n" % (ty.typename))
+        for v in ty.values:
+            f.write("    printf(\"\\t%s = %%d = %%s\", " \
+                    "%s, %s_to_json(ctx, %s));\n" %\
                     (v.valuename, v.name, ty.typename, v.name))
         f.write("\n")
 
@@ -54,10 +285,16 @@ int main(int argc, char **argv)
             f.write("    rc = %s_from_string(\"%s\", &%s_val);\n" %\
                     (ty.typename, n, ty.typename))
 
-            f.write("    printf(\"\\t%s = \\\"%%s\\\" = %%d (rc %%d)\\n\", \"%s\", %s_val, rc);\n" %\
+            f.write("    printf(\"\\t%s = \\\"%%s\\\" = %%d (rc %%d)\\n\", " \
+                    "\"%s\", %s_val, rc);\n" %\
                     (v, n, ty.typename))
         f.write("\n")
 
-    f.write("""return 0;
+    f.write("""
+
+    libxl_ctx_free(ctx);
+    xtl_logger_destroy((xentoollog_logger*)logger);
+
+    return 0;
 }
 """)
diff -r 43b99763284f -r 75a0a29cccbf tools/libxl/gentypes.py
--- a/tools/libxl/gentypes.py	Fri Oct 07 10:10:31 2011 +0100
+++ b/tools/libxl/gentypes.py	Fri Oct 07 11:05:45 2011 +0100
@@ -29,7 +29,6 @@ def libxl_C_instance_of(ty, instancename
 
 def libxl_C_type_define(ty, indent = ""):
     s = ""
-
     if isinstance(ty, libxltypes.Enumeration):
         if ty.comment is not None:
             s += format_comment(0, ty.comment)
@@ -76,7 +75,6 @@ def libxl_C_type_define(ty, indent = "")
     return s.replace("\n", "\n%s" % indent)
 
 def libxl_C_type_destroy(ty, v, indent = "    ", parent = None):
-
     s = ""
     if isinstance(ty, libxltypes.KeyedUnion):
         if parent is None:
@@ -100,6 +98,60 @@ def libxl_C_type_destroy(ty, v, indent =
         s = indent + s
     return s.replace("\n", "\n%s" % indent).rstrip(indent)
 
+def libxl_C_type_gen_json(ty, v, indent = "    ", parent = None):
+    s = ""
+    if parent is None:
+        s += "yajl_gen_status s;\n"
+    if isinstance(ty, libxltypes.Enumeration):
+        s += "s = libxl__yajl_gen_enum(hand, %s_to_string(%s));\n" % (ty.typename, ty.pass_arg(v, parent is None))
+        s += "if (s != yajl_gen_status_ok)\n"
+        s += "    goto out;\n"
+    elif isinstance(ty, libxltypes.KeyedUnion):
+        if parent is None:
+            raise Exception("KeyedUnion type must have a parent")
+        s += "switch (%s) {\n" % (parent + ty.keyvar_name)
+        for f in ty.fields:
+            (nparent,fexpr) = ty.member(v, f, parent is None)
+            s += "case %s:\n" % f.enumname
+            s += libxl_C_type_gen_json(f.type, fexpr, indent + "    ", nparent)
+            s += "    break;\n"
+        s += "}\n"
+    elif isinstance(ty, libxltypes.Struct) and (parent is None or ty.json_fn is None):
+        s += "s = yajl_gen_map_open(hand);\n"
+        s += "if (s != yajl_gen_status_ok)\n"
+        s += "    goto out;\n"
+        for f in [f for f in ty.fields if not f.const]:
+            (nparent,fexpr) = ty.member(v, f, parent is None)
+            s += "s = yajl_gen_string(hand, (const unsigned char *)\"%s\", sizeof(\"%s\")-1);\n" % (f.name, f.name)
+            s += "if (s != yajl_gen_status_ok)\n"
+            s += "    goto out;\n"
+            s += libxl_C_type_gen_json(f.type, fexpr, "", nparent)
+        s += "s = yajl_gen_map_close(hand);\n"
+        s += "if (s != yajl_gen_status_ok)\n"
+        s += "    goto out;\n"
+    else:
+        if ty.json_fn is not None:
+            s += "s = %s(hand, %s);\n" % (ty.json_fn, ty.pass_arg(v, parent is None))
+            s += "if (s != yajl_gen_status_ok)\n"
+            s += "    goto out;\n"
+
+    if parent is None:
+        s += "out:\n"
+        s += "return s;\n"
+
+    if s != "":
+        s = indent + s
+    return s.replace("\n", "\n%s" % indent).rstrip(indent)
+
+def libxl_C_type_to_json(ty, v, indent = "    "):
+    s = ""
+    gen = "(libxl__gen_json_callback)&%s_gen_json" % ty.typename
+    s += "return libxl__object_to_json(ctx, \"%s\", %s, (void *)%s);\n" % (ty.typename, gen, ty.pass_arg(v, passby=libxltypes.PASS_BY_REFERENCE))
+
+    if s != "":
+        s = indent + s
+    return s.replace("\n", "\n%s" % indent).rstrip(indent)
+
 def libxl_C_enum_to_string(ty, e, indent = "    "):
     s = ""
     s += "switch(%s) {\n" % e
@@ -138,13 +190,13 @@ def libxl_C_enum_from_string(ty, str, e,
 
 
 if __name__ == '__main__':
-    if len(sys.argv) != 4:
-        print >>sys.stderr, "Usage: gentypes.py <idl> <header> <implementation>"
+    if len(sys.argv) != 5:
+        print >>sys.stderr, "Usage: gentypes.py <idl> <header> <header-json> <implementation>"
         sys.exit(1)
 
-    (_, idl, header, impl) = sys.argv
+    (_, idl, header, header_json, impl) = sys.argv
 
-    (_,types) = libxltypes.parse(idl)
+    (builtins,types) = libxltypes.parse(idl)
 
     print "outputting libxl type definitions to %s" % header
 
@@ -167,6 +219,8 @@ if __name__ == '__main__':
         f.write(libxl_C_type_define(ty) + ";\n")
         if ty.destructor_fn is not None:
             f.write("void %s(%s);\n" % (ty.destructor_fn, ty.make_arg("p")))
+        if ty.json_fn is not None:
+            f.write("char *%s_to_json(libxl_ctx *ctx, %s);\n" % (ty.typename, ty.make_arg("p")))
         if isinstance(ty, libxltypes.Enumeration):
             f.write("const char *%s_to_string(%s);\n" % (ty.typename, ty.make_arg("p")))
             f.write("int %s_from_string(const char *s, %s);\n" % (ty.typename, ty.make_arg("e", passby=libxltypes.PASS_BY_REFERENCE)))
@@ -176,6 +230,30 @@ if __name__ == '__main__':
     f.write("""#endif /* %s */\n""" % (header_define))
     f.close()
 
+    print "outputting libxl JSON definitions to %s" % header_json
+
+    f = open(header_json, "w")
+
+    header_json_define = header_json.upper().replace('.','_')
+    f.write("""#ifndef %s
+#define %s
+
+/*
+ * DO NOT EDIT.
+ *
+ * This file is autogenerated by
+ * "%s"
+ */
+
+""" % (header_json_define, header_json_define, " ".join(sys.argv)))
+
+    for ty in [ty for ty in types+builtins if ty.json_fn is not None]:
+        f.write("yajl_gen_status %s_gen_json(yajl_gen hand, %s);\n" % (ty.typename, ty.make_arg("p", passby=libxltypes.PASS_BY_REFERENCE)))
+
+    f.write("\n")
+    f.write("""#endif /* %s */\n""" % header_json_define)
+    f.close()
+
     print "outputting libxl type implementations to %s" % impl
 
     f = open(impl, "w")
@@ -222,5 +300,17 @@ if __name__ == '__main__':
         f.write("}\n")
         f.write("\n")
 
+    for ty in [t for t in types if t.json_fn is not None]:
+        f.write("yajl_gen_status %s_gen_json(yajl_gen hand, %s)\n" % (ty.typename, ty.make_arg("p", passby=libxltypes.PASS_BY_REFERENCE)))
+        f.write("{\n")
+        f.write(libxl_C_type_gen_json(ty, "p"))
+        f.write("}\n")
+        f.write("\n")
+
+        f.write("char *%s_to_json(libxl_ctx *ctx, %s)\n" % (ty.typename, ty.make_arg("p")))
+        f.write("{\n")
+        f.write(libxl_C_type_to_json(ty, "p"))
+        f.write("}\n")
+        f.write("\n")
 
     f.close()
diff -r 43b99763284f -r 75a0a29cccbf tools/libxl/idl.txt
--- a/tools/libxl/idl.txt	Fri Oct 07 10:10:31 2011 +0100
+++ b/tools/libxl/idl.txt	Fri Oct 07 11:05:45 2011 +0100
@@ -49,6 +49,15 @@ Type.autogenerate_destructor: (default: 
  Indicates if the above named Type.destructor_fn should be
  autogenerated.
 
+Type.json_fn: (default: typename + "_gen_json" or None if type == None)
+
+ The name of the C function which will generate a YAJL data structure
+ representing this type.
+
+Type.autogenerate_json: (default: True)
+
+ Indicates if the above named Type.json_fn should be autogenerated.
+
 Other simple type-Classes
 -------------------------
 
diff -r 43b99763284f -r 75a0a29cccbf tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Fri Oct 07 10:10:31 2011 +0100
+++ b/tools/libxl/libxl.h	Fri Oct 07 11:05:45 2011 +0100
@@ -199,10 +199,10 @@ typedef struct {
     int v;
 } libxl_enum_string_table;
 
+typedef struct libxl__ctx libxl_ctx;
+
 #include "_libxl_types.h"
 
-typedef struct libxl__ctx libxl_ctx;
-
 const libxl_version_info* libxl_get_version_info(libxl_ctx *ctx);
 
 typedef struct {
diff -r 43b99763284f -r 75a0a29cccbf tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Fri Oct 07 10:10:31 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Fri Oct 07 11:05:45 2011 +0100
@@ -35,7 +35,9 @@
 
 #include "flexarray.h"
 #include "libxl_utils.h"
+
 #include "_libxl_types_internal.h"
+#include "libxl_json.h"
 
 #define LIBXL_DESTROY_TIMEOUT 10
 #define LIBXL_DEVICE_MODEL_START_TIMEOUT 10
@@ -362,6 +364,14 @@ _hidden char *libxl__cpupoolid_to_name(l
 _hidden int libxl__enum_from_string(const libxl_enum_string_table *t,
                                     const char *s, int *e);
 
+_hidden yajl_gen_status libxl__yajl_gen_asciiz(yajl_gen hand, const char *str);
+
+_hidden yajl_gen_status libxl__string_gen_json(yajl_gen hand, const char *p);
+
+typedef yajl_gen_status (*libxl__gen_json_callback)(yajl_gen hand, void *);
+_hidden char *libxl__object_to_json(libxl_ctx *ctx, const char *type,
+                                    libxl__gen_json_callback gen, void *p);
+
   /* holds the CPUID response for a single CPUID leaf
    * input contains the value of the EAX and ECX register,
    * and each policy string contains a filter to apply to
@@ -447,6 +457,7 @@ _hidden int libxl__qmp_initializations(l
 #include <yajl/yajl_gen.h>
 
 _hidden yajl_gen_status libxl__yajl_gen_asciiz(yajl_gen hand, const char *str);
+_hidden yajl_gen_status libxl__yajl_gen_enum(yajl_gen hand, const char *str);
 
 typedef enum {
     JSON_ERROR,
diff -r 43b99763284f -r 75a0a29cccbf tools/libxl/libxl_json.c
--- a/tools/libxl/libxl_json.c	Fri Oct 07 10:10:31 2011 +0100
+++ b/tools/libxl/libxl_json.c	Fri Oct 07 11:05:45 2011 +0100
@@ -18,6 +18,7 @@
 #include <yajl/yajl_parse.h>
 #include <yajl/yajl_gen.h>
 
+#include <libxl.h>
 #include "libxl_internal.h"
 
 /* #define DEBUG_ANSWER */
@@ -71,6 +72,216 @@ yajl_gen_status libxl__yajl_gen_asciiz(y
     return yajl_gen_string(hand, (const unsigned char *)str, strlen(str));
 }
 
+yajl_gen_status libxl__yajl_gen_enum(yajl_gen hand, const char *str)
+{
+    if (str)
+        return libxl__yajl_gen_asciiz(hand, str);
+    else
+        return yajl_gen_null(hand);
+}
+
+/*
+ * YAJL generators for builtin libxl types.
+ */
+yajl_gen_status libxl_uuid_gen_json(yajl_gen hand,
+                                    libxl_uuid *uuid)
+{
+    char buf[LIBXL_UUID_FMTLEN+1];
+    snprintf(buf, sizeof(buf), LIBXL_UUID_FMT, LIBXL_UUID_BYTES((*uuid)));
+    return yajl_gen_string(hand, (const unsigned char *)buf, LIBXL_UUID_FMTLEN);
+}
+
+yajl_gen_status libxl_cpumap_gen_json(yajl_gen hand,
+                                      libxl_cpumap *cpumap)
+{
+    yajl_gen_status s;
+    int i;
+
+    s = yajl_gen_array_open(hand);
+    if (s != yajl_gen_status_ok) goto out;
+
+    libxl_for_each_cpu(i, *cpumap) {
+        if (libxl_cpumap_test(cpumap, i)) {
+            s = yajl_gen_integer(hand, i);
+            if (s != yajl_gen_status_ok) goto out;
+        }
+    }
+    s = yajl_gen_array_close(hand);
+out:
+    return s;
+}
+
+yajl_gen_status libxl_key_value_list_gen_json(yajl_gen hand,
+                                              libxl_key_value_list *pkvl)
+{
+    libxl_key_value_list kvl = *pkvl;
+    yajl_gen_status s;
+    int i;
+
+    s = yajl_gen_map_open(hand);
+    if (s != yajl_gen_status_ok) goto out;
+
+    if (!kvl) goto empty;
+
+    for (i = 0; kvl[i] != NULL; i += 2) {
+        s = libxl__yajl_gen_asciiz(hand, kvl[i]);
+        if (s != yajl_gen_status_ok) goto out;
+        if (kvl[i + 1])
+            s = libxl__yajl_gen_asciiz(hand, kvl[i+1]);
+        else
+            s = yajl_gen_null(hand);
+        if (s != yajl_gen_status_ok) goto out;
+    }
+empty:
+    s = yajl_gen_map_close(hand);
+out:
+    return s;
+}
+
+yajl_gen_status libxl_cpuid_policy_list_gen_json(yajl_gen hand,
+                                libxl_cpuid_policy_list *pcpuid)
+{
+    libxl_cpuid_policy_list cpuid = *pcpuid;
+    yajl_gen_status s;
+    const char *input_names[2] = { "leaf", "subleaf" };
+    const char *policy_names[4] = { "eax", "ebx", "ecx", "edx" };
+    int i, j;
+
+    /*
+     * Aiming for:
+     * [
+     *     { 'leaf':    'val-eax',
+     *       'subleaf': 'val-ecx',
+     *       'eax':     'filter',
+     *       'ebx':     'filter',
+     *       'ecx':     'filter',
+     *       'edx':     'filter' },
+     *     { 'leaf':    'val-eax', ..., 'eax': 'filter', ... },
+     *     ... etc ...
+     * ]
+     */
+
+    s = yajl_gen_array_open(hand);
+    if (s != yajl_gen_status_ok) goto out;
+
+    if (cpuid == NULL) goto empty;
+
+    for (i = 0; cpuid[i].input[0] != XEN_CPUID_INPUT_UNUSED; i++) {
+        s = yajl_gen_map_open(hand);
+        if (s != yajl_gen_status_ok) goto out;
+
+        for (j = 0; j < 2; j++) {
+            if (cpuid[i].input[j] != XEN_CPUID_INPUT_UNUSED) {
+                s = libxl__yajl_gen_asciiz(hand, input_names[j]);
+                if (s != yajl_gen_status_ok) goto out;
+                s = yajl_gen_integer(hand, cpuid[i].input[j]);
+                if (s != yajl_gen_status_ok) goto out;
+            }
+        }
+
+        for (j = 0; j < 4; j++) {
+            if (cpuid[i].policy[j] != NULL) {
+                s = libxl__yajl_gen_asciiz(hand, policy_names[j]);
+                if (s != yajl_gen_status_ok) goto out;
+                s = yajl_gen_string(hand,
+                               (const unsigned char *)cpuid[i].policy[j], 32);
+                if (s != yajl_gen_status_ok) goto out;
+            }
+        }
+        s = yajl_gen_map_close(hand);
+        if (s != yajl_gen_status_ok) goto out;
+    }
+
+empty:
+    s = yajl_gen_array_close(hand);
+out:
+    return s;
+}
+
+yajl_gen_status libxl_string_list_gen_json(yajl_gen hand, libxl_string_list *pl)
+{
+    libxl_string_list l = *pl;
+    yajl_gen_status s;
+    int i;
+
+    s = yajl_gen_array_open(hand);
+    if (s != yajl_gen_status_ok) goto out;
+
+    if (!l) goto empty;
+
+    for (i = 0; l[i] != NULL; i++) {
+        s = libxl__yajl_gen_asciiz(hand, l[i]);
+        if (s != yajl_gen_status_ok) goto out;
+    }
+empty:
+    s = yajl_gen_array_close(hand);
+out:
+    return s;
+}
+
+yajl_gen_status libxl_mac_gen_json(yajl_gen hand, libxl_mac *mac)
+{
+    char buf[LIBXL_MAC_FMTLEN+1];
+    snprintf(buf, sizeof(buf), LIBXL_MAC_FMT, LIBXL_MAC_BYTES((*mac)));
+    return yajl_gen_string(hand, (const unsigned char *)buf, LIBXL_MAC_FMTLEN);
+}
+
+yajl_gen_status libxl_hwcap_gen_json(yajl_gen hand,
+                                     libxl_hwcap *p)
+{
+    yajl_gen_status s;
+    int i;
+
+    s = yajl_gen_array_open(hand);
+    if (s != yajl_gen_status_ok) goto out;
+
+    for(i=0; i<4; i++) {
+        s = yajl_gen_integer(hand, (*p)[i]);
+        if (s != yajl_gen_status_ok) goto out;
+    }
+    s = yajl_gen_array_close(hand);
+out:
+    return s;
+}
+
+yajl_gen_status libxl_cpuarray_gen_json(yajl_gen hand,
+                                        libxl_cpuarray *cpuarray)
+{
+    yajl_gen_status s;
+    int i;
+
+    s = yajl_gen_array_open(hand);
+    if (s != yajl_gen_status_ok) goto out;
+
+    for(i=0; i<cpuarray->entries; i++) {
+        if (cpuarray->array[i] == LIBXL_CPUARRAY_INVALID_ENTRY)
+            s = yajl_gen_null(hand);
+        else
+            s = yajl_gen_integer(hand, cpuarray->array[i]);
+        if (s != yajl_gen_status_ok) goto out;
+    }
+    s = yajl_gen_array_close(hand);
+out:
+    return s;
+}
+
+yajl_gen_status libxl_file_reference_gen_json(yajl_gen hand,
+                                              libxl_file_reference *p)
+{
+    if (p->path)
+        return libxl__yajl_gen_asciiz(hand, p->path);
+    else
+        return yajl_gen_null(hand);
+}
+
+yajl_gen_status libxl__string_gen_json(yajl_gen hand,
+                                       const char *p)
+{
+    if (p)
+        return libxl__yajl_gen_asciiz(hand, p);
+    else
+        return yajl_gen_null(hand);
+}
 
 /*
  * libxl__json_object helper functions
@@ -558,3 +769,68 @@ libxl__json_object *libxl__json_parse(li
         return NULL;
     }
 }
+
+static const char *yajl_gen_status_to_string(yajl_gen_status s)
+{
+        switch (s) {
+        case yajl_gen_status_ok: abort();
+        case yajl_gen_keys_must_be_strings:
+            return "keys must be strings";
+        case yajl_max_depth_exceeded:
+            return "max depth exceeded";
+        case yajl_gen_in_error_state:
+            return "in error state";
+        case yajl_gen_generation_complete:
+            return "generation complete";
+        case yajl_gen_invalid_number:
+            return "invalid number";
+        case yajl_gen_no_buf:
+            return "no buffer";
+#if 0 /* This is in the docs but not implemented in the version I am running. */
+        case yajl_gen_invalid_string:
+            return "invalid string";
+#endif
+        default:
+            return "unknown error";
+        }
+}
+
+char *libxl__object_to_json(libxl_ctx *ctx, const char *type,
+                            libxl__gen_json_callback gen, void *p)
+{
+    yajl_gen_config conf = { 1, "    " };
+    const unsigned char *buf;
+    char *ret = NULL;
+    unsigned int len = 0;
+    yajl_gen_status s;
+    yajl_gen hand;
+
+    hand = yajl_gen_alloc(&conf, NULL);
+    if (!hand)
+        return NULL;
+
+    s = gen(hand, p);
+    if (s != yajl_gen_status_ok)
+        goto out;
+
+    s = yajl_gen_get_buf(hand, &buf, &len);
+    if (s != yajl_gen_status_ok)
+        goto out;
+    ret = strdup((const char *)buf);
+
+out:
+    yajl_gen_free(hand);
+
+    if (s != yajl_gen_status_ok) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                   "unable to convert %s to JSON representation. "
+                   "YAJL error code %d: %s", type,
+                   s, yajl_gen_status_to_string(s));
+    } else if (!ret) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                   "unable to allocate space for to JSON representation of %s",
+                   type);
+    }
+
+    return ret;
+}
diff -r 43b99763284f -r 75a0a29cccbf tools/libxl/libxl_json.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxl/libxl_json.h	Fri Oct 07 11:05:45 2011 +0100
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2011      Citrix Ltd.
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+
+#ifndef LIBXL_JSON_H
+#define LIBXL_JSON_H
+
+#include <yajl/yajl_gen.h>
+
+#include <_libxl_types_json.h>
+#include <_libxl_types_internal_json.h>
+
+#endif /* LIBXL_JSON_H */
diff -r 43b99763284f -r 75a0a29cccbf tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Fri Oct 07 10:10:31 2011 +0100
+++ b/tools/libxl/libxl_types.idl	Fri Oct 07 11:05:45 2011 +0100
@@ -5,7 +5,7 @@
 
 namespace("libxl_")
 
-libxl_domid = Builtin("domid")
+libxl_domid = Builtin("domid", json_fn = "yajl_gen_integer", autogenerate_json = False)
 libxl_uuid = Builtin("uuid", passby=PASS_BY_REFERENCE)
 libxl_mac = Builtin("mac", passby=PASS_BY_REFERENCE)
 libxl_cpumap = Builtin("cpumap", destructor_fn="libxl_cpumap_destroy", passby=PASS_BY_REFERENCE)
@@ -16,7 +16,7 @@ libxl_string_list = Builtin("string_list
 libxl_key_value_list = Builtin("key_value_list", destructor_fn="libxl_key_value_list_destroy", passby=PASS_BY_REFERENCE)
 libxl_file_reference = Builtin("file_reference", destructor_fn="libxl_file_reference_destroy", passby=PASS_BY_REFERENCE)
 
-libxl_hwcap = Builtin("hwcap")
+libxl_hwcap = Builtin("hwcap", passby=PASS_BY_REFERENCE)
 
 #
 # Constants / Enumerations
diff -r 43b99763284f -r 75a0a29cccbf tools/libxl/libxltypes.py
--- a/tools/libxl/libxltypes.py	Fri Oct 07 10:10:31 2011 +0100
+++ b/tools/libxl/libxltypes.py	Fri Oct 07 11:05:45 2011 +0100
@@ -50,6 +50,13 @@ class Type(object):
 
         self.autogenerate_destructor = kwargs.setdefault('autogenerate_destructor', True)
 
+        if self.typename is not None:
+            self.json_fn = kwargs.setdefault('json_fn', self.typename + "_gen_json")
+        else:
+            self.json_fn = kwargs.setdefault('json_fn', None)
+
+        self.autogenerate_json = kwargs.setdefault('autogenerate_json', True)
+
     def marshal_in(self):
         return self.dir in [DIR_IN, DIR_BOTH]
     def marshal_out(self):
@@ -83,6 +90,7 @@ class Builtin(Type):
     def __init__(self, typename, **kwargs):
         kwargs.setdefault('destructor_fn', None)
         kwargs.setdefault('autogenerate_destructor', False)
+        kwargs.setdefault('autogenerate_json', False)
         Type.__init__(self, typename, **kwargs)
 
 class Number(Builtin):
@@ -90,6 +98,7 @@ class Number(Builtin):
         kwargs.setdefault('namespace', None)
         kwargs.setdefault('destructor_fn', None)
         kwargs.setdefault('signed', False)
+        kwargs.setdefault('json_fn', "yajl_gen_integer")
         self.signed = kwargs['signed']
         Builtin.__init__(self, ctype, **kwargs)
 
@@ -163,6 +172,8 @@ class Aggregate(Type):
                 comment = None
             else:
                 n,t,const,comment = f
+            if n is None:
+                raise ValueError
             self.fields.append(Field(t,n,const=const,comment=comment))
 
     # Returns a tuple (stem, field-expr)
@@ -220,7 +231,10 @@ class KeyedUnion(Aggregate):
 #
 
 void = Builtin("void *", namespace = None)
-bool = Builtin("bool", namespace = None)
+bool = Builtin("bool", namespace = None,
+               json_fn = "yajl_gen_bool",
+               autogenerate_json = False)
+
 size_t = Number("size_t", namespace = None)
 
 integer = Number("int", namespace = None, signed = True)
@@ -230,7 +244,9 @@ uint16 = UInt(16)
 uint32 = UInt(32)
 uint64 = UInt(64)
 
-string = Builtin("char *", namespace = None, destructor_fn = "free")
+string = Builtin("char *", namespace = None, destructor_fn = "free",
+                 json_fn = "libxl__string_gen_json",
+                 autogenerate_json = False)
 
 class OrderedDict(dict):
     """A dictionary which remembers insertion order.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:30:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:30:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7h6-0004ka-NS; Fri, 07 Oct 2011 03:30:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7er-0003oG-IP
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:28:02 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1317983258!45589547!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3188 invoked from network); 7 Oct 2011 10:27:39 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:27:39 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="166066526"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:27:56 -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, 7 Oct 2011 06:27:56 -0400
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
	p97ARpa4027909;	Fri, 7 Oct 2011 03:27:55 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 7dc93b06164542f06958a181c4747770a5552457
Message-ID: <7dc93b06164542f06958.1317983273@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1317983270@cosworth.uk.xensource.com>
References: <patchbomb.1317983270@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Fri, 7 Oct 2011 11:27:53 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 3 of 4 v2] xl: use libxl_device_disk_to_json to
 pretty print disk configuration
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317982001 -3600
# Node ID 7dc93b06164542f06958a181c4747770a5552457
# Parent  347c7631c123af9abdc5d6dbe10ea32cf5804aab
xl: use libxl_device_disk_to_json to pretty print disk configuration

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>

diff -r 347c7631c123 -r 7dc93b061645 tools/libxl/check-xl-disk-parse
--- a/tools/libxl/check-xl-disk-parse	Fri Oct 07 11:05:47 2011 +0100
+++ b/tools/libxl/check-xl-disk-parse	Fri Oct 07 11:06:41 2011 +0100
@@ -51,15 +51,18 @@ expected </dev/null
 one $e foo
 
 expected <<END
-disk.backend_domid = 0
-disk.pdev_path =     /dev/vg/guest-volume
-disk.vdev =          hda
-disk.backend =       0
-disk.format =        4
-disk.script =        (null)
-disk.removable =     0
-disk.readwrite =     1
-disk.is_cdrom =      0
+disk: {
+    "backend_domid": 0,
+    "pdev_path": "/dev/vg/guest-volume",
+    "vdev": "hda",
+    "backend": "unknown",
+    "format": "raw",
+    "script": null,
+    "removable": 0,
+    "readwrite": 1,
+    "is_cdrom": 0
+}
+
 END
 one 0 /dev/vg/guest-volume,,hda
 one 0 /dev/vg/guest-volume,raw,hda,rw
@@ -68,15 +71,18 @@ one 0  format=raw  vdev=hda  access=rw  
 one 0 raw:/dev/vg/guest-volume,hda,w
 
 expected <<END
-disk.backend_domid = 0
-disk.pdev_path =     /root/image.iso
-disk.vdev =          hdc
-disk.backend =       0
-disk.format =        4
-disk.script =        (null)
-disk.removable =     1
-disk.readwrite =     0
-disk.is_cdrom =      1
+disk: {
+    "backend_domid": 0,
+    "pdev_path": "/root/image.iso",
+    "vdev": "hdc",
+    "backend": "unknown",
+    "format": "raw",
+    "script": null,
+    "removable": 1,
+    "readwrite": 0,
+    "is_cdrom": 1
+}
+
 END
 one 0 /root/image.iso,,hdc,cdrom
 one 0 /root/image.iso,,hdc,,cdrom
diff -r 347c7631c123 -r 7dc93b061645 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Fri Oct 07 11:05:47 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Fri Oct 07 11:06:41 2011 +0100
@@ -4112,17 +4112,9 @@ int main_blockattach(int argc, char **ar
     disk.backend_domid = be_domid;
 
     if (dryrun_only) {
-        /* fixme: this should be generated from the idl */
-        /* fixme: enums (backend, format) should be converted to strings */
-        printf("disk.backend_domid = %"PRIx32"\n", disk.backend_domid);
-        printf("disk.pdev_path =     %s\n",        disk.pdev_path);
-        printf("disk.vdev =          %s\n",        disk.vdev);
-        printf("disk.backend =       %d\n",        disk.backend);
-        printf("disk.format =        %d\n",        disk.format);
-        printf("disk.script =        %s\n",        disk.script);
-        printf("disk.removable =     %d\n",        disk.removable);
-        printf("disk.readwrite =     %d\n",        disk.readwrite);
-        printf("disk.is_cdrom =      %d\n",        disk.is_cdrom);
+        char *json = libxl_device_disk_to_json(ctx, &disk);
+        printf("disk: %s\n", json);
+        free(json);
         if (ferror(stdout) || fflush(stdout)) { perror("stdout"); exit(-1); }
         return 0;
     }

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:31:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:31:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7i0-000579-EF; Fri, 07 Oct 2011 03:31:16 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7eq-0003oF-FT
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:28:02 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1317983275!34356403!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30710 invoked from network); 7 Oct 2011 10:27:57 -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;
	7 Oct 2011 10:27:57 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026600"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:27:55 -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, 7 Oct 2011 06:27:55 -0400
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
	p97ARpa3027909;	Fri, 7 Oct 2011 03:27:54 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 347c7631c123af9abdc5d6dbe10ea32cf5804aab
Message-ID: <347c7631c123af9abdc5.1317983272@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1317983270@cosworth.uk.xensource.com>
References: <patchbomb.1317983270@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Fri, 7 Oct 2011 11:27:52 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 2 of 4 v2] xl: allow check-xl-disk-parse to run
 against installed xl as well as build dir
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317981947 -3600
# Node ID 347c7631c123af9abdc5d6dbe10ea32cf5804aab
# Parent  75a0a29cccbfce75ba3087cdaf53adfd1b377a11
xl: allow check-xl-disk-parse to run against installed xl as well as build dir

I can't run from the current directory since my build box isn't running Xen so
if ./xl doesn't exist use the installed version on the assumption that I've
copied the script to a test host.

I think running from the build dir needs the blktap2 libraries, so update
LD_LIBRARY_PATH as appropriate.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 75a0a29cccbf -r 347c7631c123 tools/libxl/check-xl-disk-parse
--- a/tools/libxl/check-xl-disk-parse	Fri Oct 07 11:05:45 2011 +0100
+++ b/tools/libxl/check-xl-disk-parse	Fri Oct 07 11:05:47 2011 +0100
@@ -2,6 +2,13 @@
 
 set -e
 
+if [ -x ./xl ] ; then
+    export LD_LIBRARY_PATH=.:../libxc:../xenstore:../blktap2/control
+    XL=./xl
+else
+    XL=xl
+fi
+
 fprefix=tmp.check-xl-disk-parse
 
 expected () {
@@ -14,8 +21,7 @@ one () {
     expected_rc=$1; shift
     printf "test case %s...\n" "$*"
     set +e
-    LD_LIBRARY_PATH=.:../libxc:../xenstore \
-        ./xl -N block-attach 0 "$@" </dev/null >$fprefix.actual 2>/dev/null
+    ${XL} -N block-attach 0 "$@" </dev/null >$fprefix.actual 2>/dev/null
     actual_rc=$?
     diff -u $fprefix.expected $fprefix.actual
     diff_rc=$?

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:32:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:32:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7ih-0005U9-Kf; Fri, 07 Oct 2011 03:32:00 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7es-0003oO-TI
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:28:03 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1317983278!34326392!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3236 invoked from network); 7 Oct 2011 10:27:59 -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;
	7 Oct 2011 10:27:59 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026607"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:27:58 -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, 7 Oct 2011 06:27:57 -0400
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
	p97ARpa5027909;	Fri, 7 Oct 2011 03:27:56 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: e530b4b35d3872d93013daa4233cc467a89a1bac
Message-ID: <e530b4b35d3872d93013.1317983274@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1317983270@cosworth.uk.xensource.com>
References: <patchbomb.1317983270@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Fri, 7 Oct 2011 11:27:54 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 4 of 4 v2] libxl: add a test case for correct
 parsing of disk "backendtype" field
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317983222 -3600
# Node ID e530b4b35d3872d93013daa4233cc467a89a1bac
# Parent  7dc93b06164542f06958a181c4747770a5552457
libxl: add a test case for correct parsing of disk "backendtype" field

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 7dc93b061645 -r e530b4b35d38 tools/libxl/check-xl-disk-parse
--- a/tools/libxl/check-xl-disk-parse	Fri Oct 07 11:06:41 2011 +0100
+++ b/tools/libxl/check-xl-disk-parse	Fri Oct 07 11:27:02 2011 +0100
@@ -91,4 +91,20 @@ one 0 "format=raw, vdev=hdc, access=ro, 
 one 0  format=raw  vdev=hdc  access=ro  devtype=cdrom  target=/root/image.iso
 one 0 raw:/root/image.iso,hdc:cdrom,ro
 
+expected <<EOF
+disk: {
+    "backend_domid": 0,
+    "pdev_path": "/dev/vg/guest-volume",
+    "vdev": "xvdb",
+    "backend": "phy",
+    "format": "raw",
+    "script": null,
+    "removable": 0,
+    "readwrite": 1,
+    "is_cdrom": 0
+}
+
+EOF
+one 0 backendtype=phy,vdev=xvdb,access=w,target=/dev/vg/guest-volume
+
 complete

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:37:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:37:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7nj-00060k-CO; Fri, 07 Oct 2011 03:37:11 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7nI-0005oB-07
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:36:44 -0700
X-Env-Sender: George.Dunlap@eu.citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1317983799!21332183!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12191 invoked from network); 7 Oct 2011 10:36:40 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:36:40 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="166067289"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:36:39 -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, 7 Oct 2011 06:36:38 -0400
Received: from [127.0.1.1] (elijah.uk.xensource.com [10.80.2.24])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id p97AabTt027929;
	Fri, 7 Oct 2011 03:36:38 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1317983978@elijah>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:39:38 +0100
From: George Dunlap <george.dunlap@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: george.dunlap@eu.citrix.com
Subject: [Xen-devel] [PATCH 0 of 5] xenalyze updates
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:37:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:37:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7oS-0006N2-1M; Fri, 07 Oct 2011 03:37:56 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7nI-0005oC-SE
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:36:45 -0700
X-Env-Sender: George.Dunlap@eu.citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317983811!54552923!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4072 invoked from network); 7 Oct 2011 10:36:52 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:36:52 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026736"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:36:39 -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, 7 Oct 2011 06:36:39 -0400
Received: from [127.0.1.1] (elijah.uk.xensource.com [10.80.2.24])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id p97AabTu027929;
	Fri, 7 Oct 2011 03:36:38 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 3556b140d85124a6a2c6b1216a8dc79ee7f2a166
Message-ID: <3556b140d85124a6a2c6.1317983979@elijah>
In-Reply-To: <patchbomb.1317983978@elijah>
References: <patchbomb.1317983978@elijah>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:39:39 +0100
From: George Dunlap <george.dunlap@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: george.dunlap@eu.citrix.com
Subject: [Xen-devel] [PATCH 1 of 5] xenalyze: Add string for
	TPR_BELOW_THRESHOLD
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Siged-off-by: George Dunlap <george.dunlap@eu.citrix.com>

diff -r e11e13e66c62 -r 3556b140d851 xenalyze.c
--- a/xenalyze.c	Wed Jul 20 16:10:20 2011 +0100
+++ b/xenalyze.c	Fri Oct 07 11:19:30 2011 +0100
@@ -574,6 +574,7 @@ char * hvm_vmx_exit_reason_name[HVM_VMX_
 	[EXIT_REASON_MONITOR_INSTRUCTION]="MONITOR_INSTRUCTION",
 	[EXIT_REASON_PAUSE_INSTRUCTION]="PAUSE_INSTRUCTION",
 	[EXIT_REASON_MACHINE_CHECK]="MACHINE_CHECK",
+    [EXIT_REASON_TPR_BELOW_THRESHOLD]="TPR_BELOW_THRESHOLD",
 	[EXIT_REASON_APIC_ACCESS]="APIC_ACCESS",
 	[EXIT_REASON_EPT_VIOLATION]="EPT_VIOLATION",
 	[EXIT_REASON_EPT_MISCONFIG]="EPT_MISCONFIG",

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:38:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:38:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7pA-0006jb-Qg; Fri, 07 Oct 2011 03:38:41 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7nJ-0005oD-3W
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:36:45 -0700
X-Env-Sender: George.Dunlap@eu.citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1317983799!21332183!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12225 invoked from network); 7 Oct 2011 10:36:42 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:36:41 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="166067294"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:36:41 -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, 7 Oct 2011 06:36:40 -0400
Received: from [127.0.1.1] (elijah.uk.xensource.com [10.80.2.24])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id p97AabTv027929;
	Fri, 7 Oct 2011 03:36:39 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 9a2c804a8a6f0cae0a81d7aabee0cfc97ec4d1c5
Message-ID: <9a2c804a8a6f0cae0a81.1317983980@elijah>
In-Reply-To: <patchbomb.1317983978@elijah>
References: <patchbomb.1317983978@elijah>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:39:40 +0100
From: George Dunlap <george.dunlap@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: george.dunlap@eu.citrix.com
Subject: [Xen-devel] [PATCH 2 of 5] xenalyze: Fix minor summary issue
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Should be using hvm_cr_write_summary, not hvm_cr3_write_summary.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>

diff -r 3556b140d851 -r 9a2c804a8a6f xenalyze.c
--- a/xenalyze.c	Fri Oct 07 11:19:30 2011 +0100
+++ b/xenalyze.c	Fri Oct 07 11:32:09 2011 +0100
@@ -4169,7 +4169,7 @@ void hvm_cr_write_postprocess(struct hvm
         } else {
             /* For vmx, real mode may cause EXNMI exits on cr accesses */
             if ( h->exit_reason !=  EXIT_REASON_EXCEPTION_NMI )
-                hvm_set_summary_handler(h, hvm_cr3_write_summary);
+                hvm_set_summary_handler(h, hvm_cr_write_summary);
         }
     }
 }

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:39:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:39:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7pv-00076I-3m; Fri, 07 Oct 2011 03:39:27 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7nJ-0005oE-Iw
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:36:45 -0700
X-Env-Sender: George.Dunlap@eu.citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317983811!54552923!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4130 invoked from network); 7 Oct 2011 10:36:53 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:36:53 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026737"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:36:42 -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, 7 Oct 2011 06:36:41 -0400
Received: from [127.0.1.1] (elijah.uk.xensource.com [10.80.2.24])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id p97AabTw027929;
	Fri, 7 Oct 2011 03:36:40 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a2044b64720b7892cd93a642cb892e45f8b0f775
Message-ID: <a2044b64720b7892cd93.1317983981@elijah>
In-Reply-To: <patchbomb.1317983978@elijah>
References: <patchbomb.1317983978@elijah>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:39:41 +0100
From: George Dunlap <george.dunlap@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: george.dunlap@eu.citrix.com
Subject: [Xen-devel] [PATCH 3 of 5] xenalyze: Print exit reason number if no
	string is available
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: George Dunlap <george.dunlap@eu.citrix.com>

diff -r 9a2c804a8a6f -r a2044b64720b xenalyze.c
--- a/xenalyze.c	Fri Oct 07 11:32:09 2011 +0100
+++ b/xenalyze.c	Fri Oct 07 11:33:28 2011 +0100
@@ -5318,8 +5318,13 @@ void hvm_summary(struct hvm_data *h) {
 
    printf("Exit reasons:\n");
    for(i=0; i<h->exit_reason_max; i++) {
-       PRINT_SUMMARY(h->summary.exit_reason[i],
-                     " %-20s ", h->exit_reason_name[i]);
+       if ( h->exit_reason_name[i] )
+           PRINT_SUMMARY(h->summary.exit_reason[i],
+                         " %-20s ", h->exit_reason_name[i]);
+       else
+           PRINT_SUMMARY(h->summary.exit_reason[i],
+                         " %20d ", i);
+
        if(h->exit_reason_summary_handler[i])
            h->exit_reason_summary_handler[i](h);
    }

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:40:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:40:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7rM-0007TD-D8; Fri, 07 Oct 2011 03:40:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7nK-0005oF-Dz
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:36:46 -0700
X-Env-Sender: George.Dunlap@eu.citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1317983799!21332183!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12317 invoked from network); 7 Oct 2011 10:36:43 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:36:43 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="166067295"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:36:42 -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, 7 Oct 2011 06:36:42 -0400
Received: from [127.0.1.1] (elijah.uk.xensource.com [10.80.2.24])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id p97AabTx027929;
	Fri, 7 Oct 2011 03:36:41 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 21e56bad8f2cf4608dcfdbd168dd72840a60e266
Message-ID: <21e56bad8f2cf4608dcf.1317983982@elijah>
In-Reply-To: <patchbomb.1317983978@elijah>
References: <patchbomb.1317983978@elijah>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:39:42 +0100
From: George Dunlap <george.dunlap@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: george.dunlap@eu.citrix.com
Subject: [Xen-devel] [PATCH 4 of 5] xenalyze: Decrease 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

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>

diff -r a2044b64720b -r 21e56bad8f2c xenalyze.c
--- a/xenalyze.c	Fri Oct 07 11:33:28 2011 +0100
+++ b/xenalyze.c	Fri Oct 07 11:35:45 2011 +0100
@@ -128,6 +128,7 @@ enum error_level {
     ERR_SYSTEM, /* System error: cannot allocate memory, short read, &c */
 };
 
+int verbosity = 5;
 
 struct {
     unsigned 
@@ -8163,7 +8164,7 @@ void process_cpu_change(struct pcpu_info
     struct record_info *ri = &p->ri;
     struct cpu_change_data *r = (typeof(r))ri->d;
 
-    if(opt.dump_all) {
+    if(opt.dump_all && verbosity >= 6) {
         printf("]%s cpu_change this-cpu %u record-cpu %u window_size %u(0x%08x)\n",
                ri->dump_header, p->pid, r->cpu, r->window_size,
                r->window_size);

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:42:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:42:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7sb-0007ye-AH; Fri, 07 Oct 2011 03:42:13 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7nL-0005oM-Pr
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:36:48 -0700
X-Env-Sender: George.Dunlap@eu.citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317983811!54552923!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4201 invoked from network); 7 Oct 2011 10:36:55 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:36:55 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026738"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:36: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; Fri, 7 Oct 2011 06:36:43 -0400
Received: from [127.0.1.1] (elijah.uk.xensource.com [10.80.2.24])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id p97AabU0027929;
	Fri, 7 Oct 2011 03:36:42 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 4833fe142a4fe5a31bfa3d8e0af170504a478f6b
Message-ID: <4833fe142a4fe5a31bfa.1317983983@elijah>
In-Reply-To: <patchbomb.1317983978@elijah>
References: <patchbomb.1317983978@elijah>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:39:43 +0100
From: George Dunlap <george.dunlap@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: george.dunlap@eu.citrix.com
Subject: [Xen-devel] [PATCH 5 of 5] xenalyze: Handle new IRQ tracing
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: George Dunlap <george.dunlap@eu.citrix.com>

diff -r 21e56bad8f2c -r 4833fe142a4f analyze.h
--- a/analyze.h	Fri Oct 07 11:35:45 2011 +0100
+++ b/analyze.h	Fri Oct 07 11:36:27 2011 +0100
@@ -7,10 +7,23 @@
 #define TRC_MEM_MAIN     4
 #define TRC_PV_MAIN      5
 #define TRC_SHADOW_MAIN  6
-#define TRC_PM_MAIN      7
+#define TRC_HW_MAIN      7
 
 #define TRC_LOST_RECORDS_END    (TRC_GEN + 50)
 
+#define NR_CPUS 128
+#if __x86_64__
+# define BITS_PER_LONG 64
+#else
+# define BITS_PER_LONG 32
+#endif
+
+#define BITS_TO_LONGS(bits) \
+    (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
+#define DECLARE_BITMAP(name,bits) \
+    unsigned long name[BITS_TO_LONGS(bits)]
+typedef struct cpumask{ DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
+
 enum {
     TRCE_SFLAG_SET_AD,
     TRCE_SFLAG_SET_A,
diff -r 21e56bad8f2c -r 4833fe142a4f trace.h
--- a/trace.h	Fri Oct 07 11:35:45 2011 +0100
+++ b/trace.h	Fri Oct 07 11:36:27 2011 +0100
@@ -38,7 +38,7 @@
 #define TRC_MEM      0x0010f000    /* Xen memory trace         */
 #define TRC_PV       0x0020f000    /* Xen PV traces            */
 #define TRC_SHADOW   0x0040f000    /* Xen shadow tracing       */
-#define TRC_PM       0x0080f000    /* Xen power management trace */
+#define TRC_HW       0x0080f000    /* Xen hardware-related traces */
 #define TRC_GUEST    0x0800f000    /* Guest-generated traces   */
 #define TRC_ALL      0x0ffff000
 #define TRC_HD_TO_EVENT(x) ((x)&0x0fffffff)
@@ -57,11 +57,13 @@
 #define TRC_SCHED_CLASS     0x00022000   /* Scheduler-specific    */
 #define TRC_SCHED_VERBOSE   0x00028000   /* More inclusive scheduling */
 
+#define TRC_HW_PM           0x00801000   /* Power management traces */
+#define TRC_HW_IRQ          0x00802000   /* Traces relating to the handling of IRQs */
+
 /* Trace events per class */
 #define TRC_LOST_RECORDS        (TRC_GEN + 1)
 #define TRC_TRACE_WRAP_BUFFER  (TRC_GEN + 2)
 #define TRC_TRACE_CPU_CHANGE    (TRC_GEN + 3)
-#define TRC_TRACE_IRQ           (TRC_GEN + 4)
 
 #define TRC_SCHED_RUNSTATE_CHANGE   (TRC_SCHED_MIN + 1)
 #define TRC_SCHED_CONTINUE_RUNNING  (TRC_SCHED_MIN + 2)
@@ -164,14 +166,25 @@
 #define TRC_HVM_IOPORT_WRITE    (TRC_HVM_HANDLER + 0x216)
 #define TRC_HVM_IOMEM_WRITE     (TRC_HVM_HANDLER + 0x217)
 
-/* trace subclasses for power management */
-#define TRC_PM_FREQ     0x00801000      /* xen cpu freq events */
-#define TRC_PM_IDLE     0x00802000      /* xen cpu idle events */
+/* trace events for per class */
+#define TRC_PM_FREQ_CHANGE      (TRC_HW_PM + 0x01)
+#define TRC_PM_IDLE_ENTRY       (TRC_HW_PM + 0x02)
+#define TRC_PM_IDLE_EXIT        (TRC_HW_PM  + 0x03)
 
-/* trace events for per class */
-#define TRC_PM_FREQ_CHANGE      (TRC_PM_FREQ + 0x01)
-#define TRC_PM_IDLE_ENTRY       (TRC_PM_IDLE + 0x01)
-#define TRC_PM_IDLE_EXIT        (TRC_PM_IDLE + 0x02)
+#define TRC_HW_IRQ_MOVE_CLEANUP_DELAY (TRC_HW_IRQ + 0x1)
+#define TRC_HW_IRQ_MOVE_CLEANUP       (TRC_HW_IRQ + 0x2)
+#define TRC_HW_IRQ_BIND_VECTOR        (TRC_HW_IRQ + 0x3)
+#define TRC_HW_IRQ_CLEAR_VECTOR       (TRC_HW_IRQ + 0x4)
+#define TRC_HW_IRQ_MOVE_FINISH        (TRC_HW_IRQ + 0x5)
+#define TRC_HW_IRQ_ASSIGN_VECTOR      (TRC_HW_IRQ + 0x6)
+#define TRC_HW_IRQ_UNMAPPED_VECTOR    (TRC_HW_IRQ + 0x7)
+#define TRC_HW_IRQ_HANDLED            (TRC_HW_IRQ + 0x8)
+#define TRC_HW_IRQ_MSI_WRITE          (TRC_HW_IRQ + 0x9)
+#define TRC_HW_IRQ_MAP_PIRQ_MSI       (TRC_HW_IRQ + 0xa)
+#define TRC_HW_IRQ_MAP_PIRQ_GSI       (TRC_HW_IRQ + 0xb)
+#define TRC_HW_IRQ_MSI_SET_AFFINITY   (TRC_HW_IRQ + 0x10)
+#define TRC_HW_IRQ_SET_DESC_AFFINITY  (TRC_HW_IRQ + 0x11)
+#define TRC_HW_IRQ_IOMMU_AMD_IRE      (TRC_HW_IRQ + 0x12)
 
 /* This structure represents a single trace buffer record. */
 struct t_rec {
diff -r 21e56bad8f2c -r 4833fe142a4f xenalyze.c
--- a/xenalyze.c	Fri Oct 07 11:35:45 2011 +0100
+++ b/xenalyze.c	Fri Oct 07 11:36:27 2011 +0100
@@ -144,6 +144,7 @@ struct {
         scatterplot_pcpu:1,
         scatterplot_extint_cycles:1,
         scatterplot_rdtsc:1,
+        scatterplot_irq:1,
         histogram_interrupt_eip:1,
         interval_mode:1,
         dump_cooked:1,
@@ -218,6 +219,7 @@ struct {
     .scatterplot_pcpu=0,
     .scatterplot_extint_cycles=0,
     .scatterplot_rdtsc=0,
+    .scatterplot_irq=0,
     .histogram_interrupt_eip=0,
     .dump_cooked = 0,
     .dump_all = 0,
@@ -7564,9 +7566,6 @@ void mem_process(struct pcpu_info *p) {
 }
 
 /* ---- PM ---- */
-#define TRC_PM_FREQ_CHANGE      (TRC_PM_FREQ + 0x01)
-#define TRC_PM_IDLE_ENTRY       (TRC_PM_IDLE + 0x01)
-#define TRC_PM_IDLE_EXIT        (TRC_PM_IDLE + 0x02)
 #define CSTATE_MAX 5
 #define CSTATE_INVALID ((CSTATE_MAX)+1)
 void pm_process(struct pcpu_info *p) {
@@ -7609,7 +7608,383 @@ void pm_process(struct pcpu_info *p) {
     
 }
 
-
+/*
+ * IRQ related stuff
+ */
+
+#define MAX_VECTOR 256
+int global_vector_used[256] = {0};
+struct pci_dev {
+    uint8_t bus;
+    uint8_t devfn;
+    int vector_used[MAX_VECTOR];
+    struct pci_dev *next;
+} *pdev_list;
+
+#define MAX_IRQ 512
+struct irq_desc {
+    enum {
+        IRQ_NONE,
+        IRQ_MSI,
+        IRQ_GSI
+    } type;
+    struct pci_dev *dev;
+} irq_table[MAX_IRQ];
+
+struct pci_dev * pdev_find(uint8_t bus, uint8_t devfn)
+{
+    struct pci_dev *d, *n, **q;
+
+    /* Look for domain, keeping track of the last pointer so we can add
+       a domain if we need to. */
+    for ( d = pdev_list, q=&pdev_list ;
+          d &&  ( (d->bus < bus)
+                  || (d->bus == bus && d->devfn < devfn) ) ;
+          q = &d->next, d=d->next ) ;
+
+    if(d && d->bus == bus && d->devfn == devfn)
+        return d;
+
+    /* Make a new domain */
+    fprintf(warn, "Creating pdev %02x:%02x.%x\n", bus, devfn>>4, devfn&3);
+
+    if((n=malloc(sizeof(*n)))==NULL)
+    {
+        fprintf(stderr, "%s: malloc %zd failed!\n", __func__, sizeof(*n));
+        error(ERR_SYSTEM, NULL);
+    }
+
+    bzero(n, sizeof(*n));
+
+    n->bus=bus;
+    n->devfn=devfn;
+    
+    /* Insert it into the list */
+    n->next = d;
+    *q = n;
+
+    return n;
+}
+
+void irq_process(struct pcpu_info *p) {
+    struct record_info *ri = &p->ri;
+
+    switch ( ri->event )
+    {
+    case TRC_HW_IRQ_BIND_VECTOR:
+    {
+        struct {
+            int irq, vec;
+            unsigned mask[4];
+        } *r = (typeof(r))ri->d;
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_bind_vector irq %x vec %x mask %04x %04x %04x %04x\n",
+                   ri->dump_header,
+                   r->irq, r->vec,
+                   r->mask[3],
+                   r->mask[2],
+                   r->mask[1],
+                   r->mask[0]);
+        }
+        break;
+    }
+    case TRC_HW_IRQ_HANDLED:
+    {
+        struct {
+            int irq, start_tsc, end_tsc;
+        } *r = (typeof(r))ri->d;
+        int arctime;
+
+        arctime = r->end_tsc - r->start_tsc;
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_handled irq %x %d (%d,%d)\n",
+                   ri->dump_header,
+                   r->irq, arctime, r->start_tsc, r->end_tsc);
+        }
+        if ( opt.scatterplot_irq )
+        {
+            struct time_struct t;
+            
+            abs_cycles_to_time(ri->tsc, &t);
+            
+            printf("i%x %u.%09u %d\n",
+                   (unsigned)r->irq,
+                   t.s, t.ns,
+                   p->pid);
+        }
+        break;
+    }
+    case TRC_HW_IRQ_ASSIGN_VECTOR:
+    {
+        struct {
+            int irq, vec;
+            unsigned mask[4];
+        } *r = (typeof(r))ri->d;
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_assign_vector irq %x vec %x mask %04x %04x %04x %04x\n",
+                   ri->dump_header,
+                   r->irq, r->vec,
+                   r->mask[3],
+                   r->mask[2],
+                   r->mask[1],
+                   r->mask[0]);
+        }
+        if ( r->irq < MAX_IRQ
+             && r->vec < MAX_VECTOR )
+        {
+            if ( irq_table[r->irq].type == IRQ_MSI )
+            {
+                if(global_vector_used[r->vec])
+                    fprintf(warn, "  Vector collision on global table!\n");
+                global_vector_used[r->vec]=1;
+            }
+            if( irq_table[r->irq].dev )
+            {
+                struct pci_dev * pdev=irq_table[r->irq].dev;
+            
+                if(pdev->vector_used[r->vec])
+                    fprintf(warn, "  Vector collision on %02x.%02x!\n",
+                            pdev->bus, pdev->devfn);
+                pdev->vector_used[r->vec]=1;
+            }
+        }
+        break;
+    }
+    case TRC_HW_IRQ_MOVE_CLEANUP_DELAY:
+    {
+        struct {
+            int irq, vec, cpu;
+        } *r = (typeof(r))ri->d;
+
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_move_cleanup_delay irq %x vec %x cpu %d\n",
+                   ri->dump_header,
+                   r->irq, r->vec, r->cpu);
+        }
+        break;
+    }
+    case TRC_HW_IRQ_MOVE_CLEANUP:
+    {
+        struct {
+            int irq;
+            int vec;
+            int cpu;
+        } *r = (typeof(r))ri->d;
+
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_move_cleanup irq %x vec %x cpu %d\n",
+                   ri->dump_header,
+                   r->irq, r->vec, r->cpu);
+        }
+        if ( r->irq < MAX_IRQ 
+             && r->vec < MAX_VECTOR )
+        {
+            if ( irq_table[r->irq].type == IRQ_MSI )
+            {
+                if(!global_vector_used[r->vec])
+                    fprintf(warn,"  Strange, cleanup on non-used vector\n");
+                global_vector_used[r->vec]=0;
+            }
+            if ( irq_table[r->irq].dev )
+            {
+                struct pci_dev * pdev=irq_table[r->irq].dev;
+            
+                if(!pdev->vector_used[r->vec])
+                    fprintf(warn,"  Strange, cleanup on non-used vector\n");
+                pdev->vector_used[r->vec]=0;
+            }
+        }
+        break;
+    }
+    case TRC_HW_IRQ_UNMAPPED_VECTOR:
+    {
+        struct {
+            int vec;
+        } *r = (typeof(r))ri->d;
+
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_unmapped_vector vec %x\n",
+                   ri->dump_header,
+                   r->vec);
+        }
+        break;
+    }
+    case TRC_HW_IRQ_MSI_WRITE:
+    {
+        struct {
+            unsigned address_lo, address_hi;
+            unsigned data;
+            unsigned irq:16, pos:16;
+            uint8_t func, slot, bus, type;
+            unsigned mask_base;
+        } *r = (typeof(r))ri->d;
+
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_msi_write irq %x t %x base %x addr %x %x data %x pci %02x:%02x.%x %x\n",
+                   ri->dump_header,
+                   r->irq,
+                   r->type,
+                   r->mask_base,
+                   r->address_hi, r->address_lo,
+                   r->data,
+                   r->bus, r->slot, r->func, r->pos);
+        }
+        break;
+    }
+    case TRC_HW_IRQ_IOMMU_AMD_IRE:
+    {
+        struct {
+            uint16_t bdf, id;
+            int offset;
+            uint8_t dest_mode, dev_mode, vector, dest;
+        } *r = (typeof(r))ri->d;
+
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_iommu_ire bdf %x id %x offset %x dest_mode %x dev_mode %x vec %x dest %x\n",
+                   ri->dump_header,
+                   r->bdf, r->id,
+                   r->offset,
+                   r->dest_mode, r->dev_mode,
+                   r->vector, r->dest);
+        }
+        break;
+    }
+    case TRC_HW_IRQ_MAP_PIRQ_MSI:
+    {
+        struct {
+            unsigned domain:16,
+                pirq:16,
+                irq:16,
+                bus:16,
+                devfn:16,
+                entry_nr:16;
+        } *r = (typeof(r))ri->d;
+
+        if ( r->irq < MAX_IRQ )
+        {
+            struct irq_desc *irq=irq_table+r->irq;
+
+            if ( irq->dev )
+            {
+                fprintf(warn, "Strange, irq %d already has dev %02x:%x.%x!\n",
+                        r->irq, irq->dev->bus,
+                        irq->dev->devfn>>4,
+                        irq->dev->devfn&3);
+            }
+            else
+            {
+                struct pci_dev *pdev = pdev_find(r->bus, r->devfn);
+
+                irq->dev=pdev;
+                irq->type=IRQ_MSI;
+            }
+        }
+
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_map_pirq_msi d%d pirq %x(%d) irq %x bus %x devfn %x entry %x\n",
+                   ri->dump_header,
+                   r->domain,
+                   r->pirq,
+                   r->pirq,
+                   r->irq,
+                   r->bus,
+                   r->devfn,
+                   r->entry_nr);
+        }
+        break;
+    }
+    case TRC_HW_IRQ_MAP_PIRQ_GSI:
+    {
+        struct {
+            unsigned domain, pirq, irq;
+        } *r = (typeof(r))ri->d;
+
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_map_pirq_gsi d%d pirq %x(%d) irq %x\n",
+                   ri->dump_header,
+                   r->domain,
+                   r->pirq,
+                   r->pirq,
+                   r->irq);
+        }
+        break;
+    }
+    case TRC_HW_IRQ_MSI_SET_AFFINITY:
+    {
+        struct {
+            unsigned irq, apic_id, vector;
+        } *r = (typeof(r))ri->d;
+
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_msi_set_affinity irq %x apicid %x vec %x\n",
+                   ri->dump_header,
+                   r->irq,
+                   r->apic_id,
+                   r->vector);
+        }
+        break;
+    }
+    case TRC_HW_IRQ_SET_DESC_AFFINITY:
+    {
+        struct {
+            unsigned line:16, irq:16;
+            char fname[24]; /* Extra 7 words; 6 words * 4 = 24 */
+        } *r = (typeof(r))ri->d;
+        char fname[25];
+        int i;
+
+        for(i=0; i<24; i++)
+            fname[i]=r->fname[i];
+        fname[i]=0;
+
+        if ( opt.dump_all )
+        {
+            printf(" %s irq_set_desc_affinity irq %x %s:%d\n",
+                   ri->dump_header,
+                   r->irq,
+                   fname,
+                   r->line);
+        }
+        break;
+    }
+    case TRC_HW_IRQ_CLEAR_VECTOR:
+    case TRC_HW_IRQ_MOVE_FINISH :
+    default:
+        if(opt.dump_all || opt.dump_cooked) {
+            dump_generic(stdout, ri);
+        }
+        break;
+    }
+}
+
+#define TRC_HW_SUB_PM 1
+#define TRC_HW_SUB_IRQ 2
+void hw_process(struct pcpu_info *p)
+{
+    struct record_info *ri = &p->ri;
+
+    switch(ri->evt.sub)
+    {
+    case TRC_HW_SUB_PM:
+        pm_process(p);
+        break;
+    case TRC_HW_SUB_IRQ:
+        irq_process(p);
+        break;
+    }
+
+}
 /* ---- Base ----- */
 void dump_generic(FILE * f, struct record_info *ri)
 {
@@ -8404,8 +8779,8 @@ void process_record(struct pcpu_info *p)
         case TRC_MEM_MAIN:
             mem_process(p);
             break;
-        case TRC_PM_MAIN:
-            pm_process(p);
+        case TRC_HW_MAIN:
+            hw_process(p);
             break;
         case TRC_DOM0OP_MAIN:
         default:
@@ -8868,6 +9243,7 @@ enum {
     OPT_SCATTERPLOT_PCPU,
     OPT_SCATTERPLOT_EXTINT_CYCLES,
     OPT_SCATTERPLOT_RDTSC,
+    OPT_SCATTERPLOT_IRQ,
     OPT_HISTOGRAM_INTERRUPT_EIP,
     /* Interval options */
     OPT_INTERVAL_CR3_SCHEDULE_TIME,
@@ -9119,6 +9495,10 @@ error_t cmd_parser(int key, char *arg, s
         G.output_defined = 1;
         opt.scatterplot_rdtsc=1;
         break;
+    case OPT_SCATTERPLOT_IRQ:
+        G.output_defined = 1;
+        opt.scatterplot_irq=1;
+        break;
     case OPT_SCATTERPLOT_IO:
     {
         char * inval;
@@ -9521,6 +9901,11 @@ const struct argp_option cmd_opts[] =  {
       .group = OPT_GROUP_EXTRA,
       .doc = "Output scatterplot of rdtsc values.", },
 
+    { .name = "scatterplot-irq",
+      .key = OPT_SCATTERPLOT_IRQ,
+      .group = OPT_GROUP_EXTRA,
+      .doc = "Output scatterplot of irqs on pcpus.", },
+
     { .name = "histogram-interrupt-eip",
       .key = OPT_HISTOGRAM_INTERRUPT_EIP,
       .arg = "vector[,increment]",

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:46:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:46:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7x3-00004w-Ju; Fri, 07 Oct 2011 03:46:49 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7wN-0008Ki-Vq
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:46:08 -0700
X-Env-Sender: George.Dunlap@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317984363!28295522!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5295 invoked from network); 7 Oct 2011 10:46:04 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:46:04 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026922"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:46:02 -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, 7 Oct 2011 06:46:02 -0400
Received: from [127.0.1.1] (elijah.uk.xensource.com [10.80.2.24])	by
	smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id p97Ak1Sh027987;
	Fri, 7 Oct 2011 03:46:01 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 288573cb0f11f7ee32881041024da586dce5c64b
Message-ID: <288573cb0f11f7ee3288.1317984565@elijah>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:49:25 +0100
From: George Dunlap <george.dunlap@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: george.dunlap@eu.citrix.com
Subject: [Xen-devel] [PATCH] xenalyze: Get rid of all tabs in xenalyze.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

To conform to Xen coding style.  No functional changes.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>

diff -r 4833fe142a4f -r 288573cb0f11 xenalyze.c
--- a/xenalyze.c	Fri Oct 07 11:36:27 2011 +0100
+++ b/xenalyze.c	Fri Oct 07 11:49:04 2011 +0100
@@ -537,56 +537,56 @@ struct {
 
 char * hvm_vmx_exit_reason_name[HVM_VMX_EXIT_REASON_MAX] = {
     [0] = "NONE",
-	[EXIT_REASON_EXCEPTION_NMI]="EXCEPTION_NMI",
-	[EXIT_REASON_EXTERNAL_INTERRUPT]="EXTERNAL_INTERRUPT",
-	[EXIT_REASON_TRIPLE_FAULT]="TRIPLE_FAULT",
-	[EXIT_REASON_INIT]="INIT",
-	[EXIT_REASON_SIPI]="SIPI",
-	[EXIT_REASON_IO_SMI]="IO_SMI",
-	[EXIT_REASON_OTHER_SMI]="OTHER_SMI",
-	[EXIT_REASON_PENDING_INTERRUPT]="PENDING_INTERRUPT",
-	[EXIT_REASON_PENDING_VIRT_NMI]="PENDING_VIRT_NMI",
-	[EXIT_REASON_TASK_SWITCH]="TASK_SWITCH",
-	[EXIT_REASON_CPUID]="CPUID",
-	[EXIT_REASON_GETSEC]="GETSEC",
-	[EXIT_REASON_HLT]="HLT",
-	[EXIT_REASON_INVD]="INVD",
-	[EXIT_REASON_INVLPG]="INVLPG",
-	[EXIT_REASON_RDPMC]="RDPMC",
-	[EXIT_REASON_RDTSC]="RDTSC",
-	[EXIT_REASON_RSM]="RSM",
-	[EXIT_REASON_VMCALL]="VMCALL",
-	[EXIT_REASON_VMCLEAR]="VMCLEAR",
-	[EXIT_REASON_VMLAUNCH]="VMLAUNCH",
-	[EXIT_REASON_VMPTRLD]="VMPTRLD",
-	[EXIT_REASON_VMPTRST]="VMPTRST",
-	[EXIT_REASON_VMREAD]="VMREAD",
-	[EXIT_REASON_VMRESUME]="VMRESUME",
-	[EXIT_REASON_VMWRITE]="VMWRITE",
-	[EXIT_REASON_VMOFF]="VMOFF",
-	[EXIT_REASON_VMON]="VMON",
-	[EXIT_REASON_CR_ACCESS]="CR_ACCESS",
-	[EXIT_REASON_DR_ACCESS]="DR_ACCESS",
-	[EXIT_REASON_IO_INSTRUCTION]="IO_INSTRUCTION",
-	[EXIT_REASON_MSR_READ]="MSR_READ",
-	[EXIT_REASON_MSR_WRITE]="MSR_WRITE",
-	[EXIT_REASON_INVALID_GUEST_STATE]="INVALID_GUEST_STATE",
-	[EXIT_REASON_MSR_LOADING]="MSR_LOADING",
-	[EXIT_REASON_MWAIT_INSTRUCTION]="MWAIT_INSTRUCTION",
-	[EXIT_REASON_MONITOR_TRAP_FLAG]="MONITOR_TRAP_FLAG",
-	[EXIT_REASON_MONITOR_INSTRUCTION]="MONITOR_INSTRUCTION",
-	[EXIT_REASON_PAUSE_INSTRUCTION]="PAUSE_INSTRUCTION",
-	[EXIT_REASON_MACHINE_CHECK]="MACHINE_CHECK",
+    [EXIT_REASON_EXCEPTION_NMI]="EXCEPTION_NMI",
+    [EXIT_REASON_EXTERNAL_INTERRUPT]="EXTERNAL_INTERRUPT",
+    [EXIT_REASON_TRIPLE_FAULT]="TRIPLE_FAULT",
+    [EXIT_REASON_INIT]="INIT",
+    [EXIT_REASON_SIPI]="SIPI",
+    [EXIT_REASON_IO_SMI]="IO_SMI",
+    [EXIT_REASON_OTHER_SMI]="OTHER_SMI",
+    [EXIT_REASON_PENDING_INTERRUPT]="PENDING_INTERRUPT",
+    [EXIT_REASON_PENDING_VIRT_NMI]="PENDING_VIRT_NMI",
+    [EXIT_REASON_TASK_SWITCH]="TASK_SWITCH",
+    [EXIT_REASON_CPUID]="CPUID",
+    [EXIT_REASON_GETSEC]="GETSEC",
+    [EXIT_REASON_HLT]="HLT",
+    [EXIT_REASON_INVD]="INVD",
+    [EXIT_REASON_INVLPG]="INVLPG",
+    [EXIT_REASON_RDPMC]="RDPMC",
+    [EXIT_REASON_RDTSC]="RDTSC",
+    [EXIT_REASON_RSM]="RSM",
+    [EXIT_REASON_VMCALL]="VMCALL",
+    [EXIT_REASON_VMCLEAR]="VMCLEAR",
+    [EXIT_REASON_VMLAUNCH]="VMLAUNCH",
+    [EXIT_REASON_VMPTRLD]="VMPTRLD",
+    [EXIT_REASON_VMPTRST]="VMPTRST",
+    [EXIT_REASON_VMREAD]="VMREAD",
+    [EXIT_REASON_VMRESUME]="VMRESUME",
+    [EXIT_REASON_VMWRITE]="VMWRITE",
+    [EXIT_REASON_VMOFF]="VMOFF",
+    [EXIT_REASON_VMON]="VMON",
+    [EXIT_REASON_CR_ACCESS]="CR_ACCESS",
+    [EXIT_REASON_DR_ACCESS]="DR_ACCESS",
+    [EXIT_REASON_IO_INSTRUCTION]="IO_INSTRUCTION",
+    [EXIT_REASON_MSR_READ]="MSR_READ",
+    [EXIT_REASON_MSR_WRITE]="MSR_WRITE",
+    [EXIT_REASON_INVALID_GUEST_STATE]="INVALID_GUEST_STATE",
+    [EXIT_REASON_MSR_LOADING]="MSR_LOADING",
+    [EXIT_REASON_MWAIT_INSTRUCTION]="MWAIT_INSTRUCTION",
+    [EXIT_REASON_MONITOR_TRAP_FLAG]="MONITOR_TRAP_FLAG",
+    [EXIT_REASON_MONITOR_INSTRUCTION]="MONITOR_INSTRUCTION",
+    [EXIT_REASON_PAUSE_INSTRUCTION]="PAUSE_INSTRUCTION",
+    [EXIT_REASON_MACHINE_CHECK]="MACHINE_CHECK",
     [EXIT_REASON_TPR_BELOW_THRESHOLD]="TPR_BELOW_THRESHOLD",
-	[EXIT_REASON_APIC_ACCESS]="APIC_ACCESS",
-	[EXIT_REASON_EPT_VIOLATION]="EPT_VIOLATION",
-	[EXIT_REASON_EPT_MISCONFIG]="EPT_MISCONFIG",
-	[EXIT_REASON_INVEPT]="INVEPT",
-	[EXIT_REASON_RDTSCP]="RDTSCP",
-	[EXIT_REASON_VMX_PREEMPTION_TIMER_EXPIRED]="VMX_PREEMPTION_TIMER_EXPIRED",
-	[EXIT_REASON_INVVPID]="INVVPID",
-	[EXIT_REASON_WBINVD]="WBINVD",
-	[EXIT_REASON_XSETBV]="XSETBV",
+    [EXIT_REASON_APIC_ACCESS]="APIC_ACCESS",
+    [EXIT_REASON_EPT_VIOLATION]="EPT_VIOLATION",
+    [EXIT_REASON_EPT_MISCONFIG]="EPT_MISCONFIG",
+    [EXIT_REASON_INVEPT]="INVEPT",
+    [EXIT_REASON_RDTSCP]="RDTSCP",
+    [EXIT_REASON_VMX_PREEMPTION_TIMER_EXPIRED]="VMX_PREEMPTION_TIMER_EXPIRED",
+    [EXIT_REASON_INVVPID]="INVVPID",
+    [EXIT_REASON_WBINVD]="WBINVD",
+    [EXIT_REASON_XSETBV]="XSETBV",
 };
 
 /* SVM data */
@@ -905,13 +905,13 @@ char * hvm_svm_exit_reason_name[HVM_SVM_
 #endif
 
 /* General hvm information */
-#define SPURIOUS_APIC_VECTOR	0xff
-#define ERROR_APIC_VECTOR	0xfe
-#define INVALIDATE_TLB_VECTOR	0xfd
-#define EVENT_CHECK_VECTOR	0xfc
-#define CALL_FUNCTION_VECTOR	0xfb
-#define THERMAL_APIC_VECTOR	0xfa
-#define LOCAL_TIMER_VECTOR	0xf9
+#define SPURIOUS_APIC_VECTOR  0xff
+#define ERROR_APIC_VECTOR     0xfe
+#define INVALIDATE_TLB_VECTOR 0xfd
+#define EVENT_CHECK_VECTOR    0xfc
+#define CALL_FUNCTION_VECTOR  0xfb
+#define THERMAL_APIC_VECTOR   0xfa
+#define LOCAL_TIMER_VECTOR    0xf9
 
 #define EXTERNAL_INTERRUPT_MAX 256
 
@@ -929,26 +929,26 @@ char * hvm_extint_vector_name[EXTERNAL_I
 #define HVM_TRAP_MAX 20
 
 char * hvm_trap_name[HVM_TRAP_MAX] = {
-	[0] =  "Divide",
-	[1] =  "RESERVED",
-	[2] =  "NMI",
-	[3] =  "Breakpoint",
-	[4] =  "Overflow",
-	[5] =  "BOUND",
-	[6] =  "Invalid Op",
-	[7] =  "Coprocessor not present",
-	[8] =  "Double Fault",
-	[9] =  "Coprocessor segment overrun",
-	[10] = "TSS",
-	[11] = "Segment not present",
-	[12] = "Stack-segment fault",
-	[13] = "GP",
-	[14] = "Page fault",
-	[15] = "RESERVED",
-	[16] = "FPU",
-	[17] = "Alignment check",
-	[18] = "Machine check",
-	[19] = "SIMD",
+    [0] =  "Divide",
+    [1] =  "RESERVED",
+    [2] =  "NMI",
+    [3] =  "Breakpoint",
+    [4] =  "Overflow",
+    [5] =  "BOUND",
+    [6] =  "Invalid Op",
+    [7] =  "Coprocessor not present",
+    [8] =  "Double Fault",
+    [9] =  "Coprocessor segment overrun",
+    [10] = "TSS",
+    [11] = "Segment not present",
+    [12] = "Stack-segment fault",
+    [13] = "GP",
+    [14] = "Page fault",
+    [15] = "RESERVED",
+    [16] = "FPU",
+    [17] = "Alignment check",
+    [18] = "Machine check",
+    [19] = "SIMD",
 };
 
 
@@ -8826,7 +8826,7 @@ void progress_init(void) {
     int pid;
 
     if (pipe(G.progress.pipe) < 0)
-	    perror("pipe");
+        perror("pipe");
 
     if(!(pid = fork())) {
         progress_child_exec();

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:48:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:48:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7yU-0000Tf-MA; Fri, 07 Oct 2011 03:48:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7xu-0000GP-Jp
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:47:42 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317984457!28295743!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9040 invoked from network); 7 Oct 2011 10:47:39 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:47:39 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026936"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:47:37 -0400
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;
	Fri, 7 Oct 2011 06:47:37 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RC7xp-0003Vd-5h; Fri, 07 Oct 2011
	11:47:37 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: d95acffb817973bc2c177f662dc3ad7e4cddd3a9
Message-ID: <d95acffb817973bc2c17.1317983160@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:26:00 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 2 of 6] [OCAML] Add a missing dependency to the
	xenctrl ocaml package
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

diff -r ffbc5e9929d5 -r d95acffb8179 tools/ocaml/libs/xc/META.in
--- a/tools/ocaml/libs/xc/META.in
+++ b/tools/ocaml/libs/xc/META.in
@@ -1,5 +1,5 @@
 version = "@VERSION@"
 description = "Xen Control Interface"
-requires = "xenmmap,uuid"
+requires = "unix,xenmmap,uuid"
 archive(byte) = "xenctrl.cma"
 archive(native) = "xenctrl.cmxa"

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:49:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:49:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC7zO-0000tj-Nx; Fri, 07 Oct 2011 03:49:14 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7xu-0000GQ-Or
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:47:43 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1317984458!34366344!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17944 invoked from network); 7 Oct 2011 10:47:39 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:47:39 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="166068215"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:47:37 -0400
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;
	Fri, 7 Oct 2011 06:47:37 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RC7xp-0003Vd-6n; Fri, 07 Oct 2011
	11:47:37 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: fdca6d8c0c5a3b69052ff20858556406ffbb533e
Message-ID: <fdca6d8c0c5a3b69052f.1317983163@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:26:03 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 5 of 6] [OCAML] Fix 2 bit-twiddling bugs and an
	off-by-one
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 bit bugs are in ocaml vcpu affinity calls, and the off-by-one
error is in the ocaml console ring code

Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

diff -r da67f075e413 -r fdca6d8c0c5a tools/ocaml/libs/xc/xenctrl_stubs.c
--- a/tools/ocaml/libs/xc/xenctrl_stubs.c
+++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
@@ -430,7 +430,7 @@
 
 	for (i=0; i<len; i++) {
 		if (Bool_val(Field(cpumap, i)))
-			c_cpumap[i/8] |= i << (i&7);
+			c_cpumap[i/8] |= 1 << (i&7);
 	}
 	retval = xc_vcpu_setaffinity(_H(xch), _D(domid),
 	                             Int_val(vcpu), c_cpumap);
@@ -466,7 +466,7 @@
 	ret = caml_alloc(len, 0);
 
 	for (i=0; i<len; i++) {
-		if (c_cpumap[i%8] & 1 << (i&7))
+		if (c_cpumap[i/8] & 1 << (i&7))
 			Store_field(ret, i, Val_true);
 		else
 			Store_field(ret, i, Val_false);
@@ -523,7 +523,7 @@
 
 CAMLprim value stub_xc_readconsolering(value xch)
 {
-	unsigned int size = RING_SIZE;
+	unsigned int size = RING_SIZE - 1;
 	char *ring_ptr = ring;
 
 	CAMLparam1(xch);

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:50:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:50:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC80A-0001GA-1r; Fri, 07 Oct 2011 03:50:02 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7xv-0000GS-83
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:47:43 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317984457!28295743!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9059 invoked from network); 7 Oct 2011 10:47:40 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:47:40 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026937"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:47:37 -0400
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;
	Fri, 7 Oct 2011 06:47:37 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RC7xp-0003Vd-4R; Fri, 07 Oct 2011
	11:47:37 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:25:58 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 0 of 6] Renaming/bugfixing/improving the ocaml
	libraries
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 is based on the previous set I sent. The first patch
has been changed to rename the modules as well as the ocamlfind packages.
The subsequent patches are largely similar to those sent last time, 
with minor tweaks suggested by Ian Campbell - so they remove the log
and uuid libraries, fix the dependencies of the xenctrl findlib 
package, fix a couple of bugs in xenctrl and add a new feature to a 
xenctrl function.



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:50:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:50:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC80q-0001cW-RA; Fri, 07 Oct 2011 03:50:44 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7xv-0000GT-DY
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:47:43 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1317984458!34366344!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17985 invoked from network); 7 Oct 2011 10:47:40 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:47:40 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="166068216"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:47:37 -0400
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;
	Fri, 7 Oct 2011 06:47:37 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RC7xp-0003Vd-6z; Fri, 07 Oct 2011
	11:47:37 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 82d81b98b5dadb80853fd95adccb492f48ce5f51
Message-ID: <82d81b98b5dadb80853f.1317983164@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:26:04 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 6 of 6] [OCAML] Small improvement to the ocaml
	xenctrl library
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 a new field 'max_nr_cpus' to the physinfo type in the ocaml xc bindings

Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>

diff -r fdca6d8c0c5a -r 82d81b98b5da tools/ocaml/libs/xc/xenctrl.ml
--- a/tools/ocaml/libs/xc/xenctrl.ml
+++ b/tools/ocaml/libs/xc/xenctrl.ml
@@ -70,6 +70,7 @@
 	scrub_pages      : nativeint;
 	(* XXX hw_cap *)
 	capabilities     : physinfo_cap_flag list;
+	max_nr_cpus      : int;
 }
 
 type version =
diff -r fdca6d8c0c5a -r 82d81b98b5da tools/ocaml/libs/xc/xenctrl.mli
--- a/tools/ocaml/libs/xc/xenctrl.mli
+++ b/tools/ocaml/libs/xc/xenctrl.mli
@@ -52,6 +52,7 @@
   free_pages       : nativeint;
   scrub_pages      : nativeint;
   capabilities     : physinfo_cap_flag list;
+  max_nr_cpus      : int; (** compile-time max possible number of nr_cpus *)
 }
 type version = { major : int; minor : int; extra : string; }
 type compile_info = {
diff -r fdca6d8c0c5a -r 82d81b98b5da tools/ocaml/libs/xc/xenctrl_stubs.c
--- a/tools/ocaml/libs/xc/xenctrl_stubs.c
+++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
@@ -534,6 +534,7 @@
 
 	if (retval)
 		failwith_xc(_H(xch));
+
 	ring[size] = '\0';
 	CAMLreturn(caml_copy_string(ring));
 }
@@ -573,7 +574,7 @@
 		}
 	}
 
-	physinfo = caml_alloc_tuple(9);
+	physinfo = caml_alloc_tuple(10);
 	Store_field(physinfo, 0, Val_int(c_physinfo.threads_per_core));
 	Store_field(physinfo, 1, Val_int(c_physinfo.cores_per_socket));
 	Store_field(physinfo, 2, Val_int(c_physinfo.nr_cpus));
@@ -583,6 +584,7 @@
 	Store_field(physinfo, 6, caml_copy_nativeint(c_physinfo.free_pages));
 	Store_field(physinfo, 7, caml_copy_nativeint(c_physinfo.scrub_pages));
 	Store_field(physinfo, 8, cap_list);
+	Store_field(physinfo, 9, Val_int(c_physinfo.max_cpu_id + 1));
 
 	CAMLreturn(physinfo);
 }

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:51:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:51:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC81Z-0001z7-Jc; Fri, 07 Oct 2011 03:51:29 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7xw-0000GU-0d
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:47:44 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1317984457!28295743!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9102 invoked from network); 7 Oct 2011 10:47:40 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:47:40 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026938"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:47:37 -0400
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;
	Fri, 7 Oct 2011 06:47:37 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RC7xp-0003Vd-5w; Fri, 07 Oct 2011
	11:47:37 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f325cb3f37bdba04a8b44bf255286dc846bf2a62
Message-ID: <f325cb3f37bdba04a8b4.1317983161@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:26:01 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 3 of 6] [OCAML] Remove the uuid library
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 library was only minimally used, and was really rather redundant.

Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/Makefile
--- a/tools/ocaml/libs/Makefile
+++ b/tools/ocaml/libs/Makefile
@@ -2,7 +2,7 @@
 include $(XEN_ROOT)/tools/Rules.mk
 
 SUBDIRS= \
-	uuid mmap \
+	mmap \
 	log xc eventchn \
 	xb xs xl
 
diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/uuid/META.in
--- a/tools/ocaml/libs/uuid/META.in
+++ /dev/null
@@ -1,4 +0,0 @@
-version = "@VERSION@"
-description = "Uuid - universal identifer"
-archive(byte) = "uuid.cma"
-archive(native) = "uuid.cmxa"
diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/uuid/Makefile
--- a/tools/ocaml/libs/uuid/Makefile
+++ /dev/null
@@ -1,29 +0,0 @@
-TOPLEVEL=$(CURDIR)/../..
-XEN_ROOT=$(TOPLEVEL)/../..
-include $(TOPLEVEL)/common.make
-
-OBJS = uuid
-INTF = $(foreach obj, $(OBJS),$(obj).cmi)
-LIBS = uuid.cma uuid.cmxa
-
-all: $(INTF) $(LIBS) $(PROGRAMS)
-
-bins: $(PROGRAMS)
-
-libs: $(LIBS)
-
-uuid_OBJS = $(OBJS)
-OCAML_NOC_LIBRARY = uuid
-
-.PHONY: install
-install: $(LIBS) META
-	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) uuid
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore uuid META $(INTF) $(LIBS) *.a *.cmx
-
-.PHONY: uninstall
-uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) uuid
-
-include $(TOPLEVEL)/Makefile.rules
-
diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/uuid/uuid.ml
--- a/tools/ocaml/libs/uuid/uuid.ml
+++ /dev/null
@@ -1,100 +0,0 @@
-(*
- * Copyright (C) 2006-2010 Citrix Systems Inc.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-(* Internally, a UUID is simply a string. *)
-type 'a t = string
-
-type cookie = string
-
-let of_string s = s
-let to_string s = s
-
-let null = ""
-
-(* deprecated: we don't need to duplicate the uuid prefix/suffix *)
-let uuid_of_string = of_string
-let string_of_uuid = to_string
-
-let string_of_cookie s = s
-
-let cookie_of_string s = s
-
-let dev_random = "/dev/random"
-let dev_urandom = "/dev/urandom"
-
-let rnd_array n =
-	let fstbyte i = 0xff land i in
-	let sndbyte i = fstbyte (i lsr 8) in
-	let thdbyte i = sndbyte (i lsr 8) in
-	let rec rnd_list n acc = match n with
-		| 0 -> acc
-		| 1 ->
-			let b = fstbyte (Random.bits ()) in
-			b :: acc
-		| 2 ->
-			let r = Random.bits () in
-			let b1 = fstbyte r in
-			let b2 = sndbyte r in
-			b1 :: b2 :: acc
-		| n -> 
-			let r = Random.bits () in
-			let b1 = fstbyte r in
-			let b2 = sndbyte r in
-			let b3 = thdbyte r in
-			rnd_list (n - 3) (b1 :: b2 :: b3 :: acc)
-	in
-	Array.of_list (rnd_list n [])
-
-let read_array dev n = 
-  let ic = open_in_bin dev in
-  try
-    let result = Array.init n (fun _ -> input_byte ic) in
-    close_in ic;
-    result
-  with e ->
-    close_in ic;
-    raise e
-
-let uuid_of_int_array uuid =
-  Printf.sprintf "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
-    uuid.(0) uuid.(1) uuid.(2) uuid.(3) uuid.(4) uuid.(5)
-    uuid.(6) uuid.(7) uuid.(8) uuid.(9) uuid.(10) uuid.(11)
-    uuid.(12) uuid.(13) uuid.(14) uuid.(15)
-
-let make_uuid_prng () = uuid_of_int_array (rnd_array 16)
-let make_uuid_urnd () = uuid_of_int_array (read_array dev_urandom 16)
-let make_uuid_rnd () = uuid_of_int_array (read_array dev_random 16)
-let make_uuid = make_uuid_urnd
-
-let make_cookie() =
-  let bytes = Array.to_list (read_array dev_urandom 64) in
-  String.concat "" (List.map (Printf.sprintf "%1x") bytes)
-
-let int_array_of_uuid s =
-  try
-    let l = ref [] in
-    Scanf.sscanf s "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
-      (fun a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 ->
-      l := [ a0; a1; a2; a3; a4; a5; a6; a7; a8; a9;
-             a10; a11; a12; a13; a14; a15; ]);
-    Array.of_list !l
-  with _ -> invalid_arg "Uuid.int_array_of_uuid"
-
-let is_uuid str =
-	try
-		Scanf.sscanf str
-			"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
-			(fun _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -> true)
-	with _ -> false
diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/uuid/uuid.mli
--- a/tools/ocaml/libs/uuid/uuid.mli
+++ /dev/null
@@ -1,67 +0,0 @@
-(*
- * Copyright (C) 2006-2010 Citrix Systems Inc.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-(** Type-safe UUIDs.
-    Probably need to refactor this; UUIDs are used in two places:
-    + to uniquely name things across the cluster
-    + as secure session IDs
-
-    There is the additional constraint that current Xen tools use 
-    a particular format of UUID (the 16 byte variety generated by fresh ())
-
-	Also, cookies aren't UUIDs and should be put somewhere else.
-*)
-
-(** A 128-bit UUID.  Using phantom types ('a) to achieve the requires type-safety. *)
-type 'a t
-
-(** Create a fresh UUID *)
-val make_uuid : unit -> 'a t
-val make_uuid_prng : unit -> 'a t
-val make_uuid_urnd : unit -> 'a t
-val make_uuid_rnd : unit -> 'a t
-
-(** Create a UUID from a string. *)
-val of_string : string -> 'a t
-
-(** Marshal a UUID to a string. *)
-val to_string : 'a t -> string
-
-(** A null UUID, as if such a thing actually existed.  It turns out to be
- * useful though. *)
-val null : 'a t
-
-(** Deprecated alias for {! Uuid.of_string} *)
-val uuid_of_string : string -> 'a t
-
-(** Deprecated alias for {! Uuid.to_string} *)
-val string_of_uuid : 'a t -> string
-
-(** Convert an array to a UUID. *)
-val uuid_of_int_array : int array -> 'a t
-
-(** Convert a UUID to an array. *)
-val int_array_of_uuid : 'a t -> int array
-
-(** Check whether a string is a UUID. *)
-val is_uuid : string -> bool
-
-(** A 512-bit cookie. *)
-type cookie
-
-val make_cookie : unit -> cookie
-
-val cookie_of_string : string -> cookie
-
-val string_of_cookie : cookie -> string
diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/xc/META.in
--- a/tools/ocaml/libs/xc/META.in
+++ b/tools/ocaml/libs/xc/META.in
@@ -1,5 +1,5 @@
 version = "@VERSION@"
 description = "Xen Control Interface"
-requires = "unix,xenmmap,uuid"
+requires = "unix,xenmmap"
 archive(byte) = "xenctrl.cma"
 archive(native) = "xenctrl.cmxa"
diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/xc/Makefile
--- a/tools/ocaml/libs/xc/Makefile
+++ b/tools/ocaml/libs/xc/Makefile
@@ -3,7 +3,7 @@
 include $(TOPLEVEL)/common.make
 
 CFLAGS += -I../mmap $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest)
-OCAMLINCLUDE += -I ../mmap -I ../uuid
+OCAMLINCLUDE += -I ../mmap
 
 OBJS = xenctrl
 INTF = xenctrl.cmi
diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/xc/xenctrl.ml
--- a/tools/ocaml/libs/xc/xenctrl.ml
+++ b/tools/ocaml/libs/xc/xenctrl.ml
@@ -118,14 +118,23 @@
 external _domain_create: handle -> int32 -> domain_create_flag list -> int array -> domid
        = "stub_xc_domain_create"
 
+let int_array_of_uuid_string s =
+	try
+		Scanf.sscanf s
+			"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
+			(fun a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 ->
+				[| a0; a1; a2; a3; a4; a5; a6; a7;
+				   a8; a9; a10; a11; a12; a13; a14; a15 |])
+	with _ -> invalid_arg ("Xc.int_array_of_uuid_string: " ^ s)
+
 let domain_create handle n flags uuid =
-	_domain_create handle n flags (Uuid.int_array_of_uuid uuid)
+	_domain_create handle n flags (int_array_of_uuid_string uuid)
 
 external _domain_sethandle: handle -> domid -> int array -> unit
                           = "stub_xc_domain_sethandle"
 
 let domain_sethandle handle n uuid =
-	_domain_sethandle handle n (Uuid.int_array_of_uuid uuid)
+	_domain_sethandle handle n (int_array_of_uuid_string uuid)
 
 external domain_max_vcpus: handle -> domid -> int -> unit
        = "stub_xc_domain_max_vcpus"
diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/xc/xenctrl.mli
--- a/tools/ocaml/libs/xc/xenctrl.mli
+++ b/tools/ocaml/libs/xc/xenctrl.mli
@@ -74,12 +74,8 @@
 external is_fake : unit -> bool = "stub_xc_interface_is_fake"
 external interface_close : handle -> unit = "stub_xc_interface_close"
 val with_intf : (handle -> 'a) -> 'a
-external _domain_create : handle -> int32 -> domain_create_flag list -> int array -> domid
-  = "stub_xc_domain_create"
-val domain_create : handle -> int32 -> domain_create_flag list -> 'a Uuid.t -> domid
-external _domain_sethandle : handle -> domid -> int array -> unit
-  = "stub_xc_domain_sethandle"
-val domain_sethandle : handle -> domid -> 'a Uuid.t -> unit
+val domain_create : handle -> int32 -> domain_create_flag list -> string -> domid
+val domain_sethandle : handle -> domid -> string -> unit
 external domain_max_vcpus : handle -> domid -> int -> unit
   = "stub_xc_domain_max_vcpus"
 external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause"
diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/xenstored/Makefile
--- a/tools/ocaml/xenstored/Makefile
+++ b/tools/ocaml/xenstored/Makefile
@@ -5,7 +5,6 @@
 OCAMLINCLUDE += \
 	-I $(OCAML_TOPLEVEL)/libs/log \
 	-I $(OCAML_TOPLEVEL)/libs/xb \
-	-I $(OCAML_TOPLEVEL)/libs/uuid \
 	-I $(OCAML_TOPLEVEL)/libs/mmap \
 	-I $(OCAML_TOPLEVEL)/libs/xc \
 	-I $(OCAML_TOPLEVEL)/libs/eventchn
@@ -34,7 +33,6 @@
 INTF = symbol.cmi trie.cmi
 XENSTOREDLIBS = \
 	unix.cmxa \
-	$(OCAML_TOPLEVEL)/libs/uuid/uuid.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap $(OCAML_TOPLEVEL)/libs/mmap/xenmmap.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/log $(OCAML_TOPLEVEL)/libs/log/log.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/eventchn/xeneventchn.cmxa \

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:52:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:52:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC82P-0002M1-Uk; Fri, 07 Oct 2011 03:52:22 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7xx-0000GW-3r
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:47:46 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1317984458!34366344!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18014 invoked from network); 7 Oct 2011 10:47:40 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:47:40 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="166068218"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:47:38 -0400
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;
	Fri, 7 Oct 2011 06:47:37 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RC7xp-0003Vd-6A; Fri, 07 Oct 2011
	11:47:37 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: da67f075e413bd496f9890ed2dc0955681fe3921
Message-ID: <da67f075e413bd496f98.1317983162@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:26:02 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 4 of 6] [OCAML] Remove log library from
	tools/ocaml/libs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 only user was oxenstored, which has had the relevant bits
merged in.

Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/Makefile
--- a/tools/ocaml/libs/Makefile
+++ b/tools/ocaml/libs/Makefile
@@ -3,7 +3,7 @@
 
 SUBDIRS= \
 	mmap \
-	log xc eventchn \
+	xc eventchn \
 	xb xs xl
 
 .PHONY: all
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/META.in
--- a/tools/ocaml/libs/log/META.in
+++ /dev/null
@@ -1,5 +0,0 @@
-version = "@VERSION@"
-description = "Log - logging library"
-requires = "unix"
-archive(byte) = "log.cma"
-archive(native) = "log.cmxa"
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/Makefile
--- a/tools/ocaml/libs/log/Makefile
+++ /dev/null
@@ -1,44 +0,0 @@
-TOPLEVEL=$(CURDIR)/../..
-XEN_ROOT=$(TOPLEVEL)/../..
-include $(TOPLEVEL)/common.make
-
-OBJS = syslog log logs
-INTF = log.cmi logs.cmi syslog.cmi
-LIBS = log.cma log.cmxa
-
-all: $(INTF) $(LIBS) $(PROGRAMS)
-
-bins: $(PROGRAMS)
-
-libs: $(LIBS)
-
-log.cmxa: libsyslog_stubs.a $(foreach obj,$(OBJS),$(obj).cmx)
-	$(call mk-caml-lib-native, $@, -cclib -lsyslog_stubs, $(foreach obj,$(OBJS),$(obj).cmx))
-
-log.cma: $(foreach obj,$(OBJS),$(obj).cmo)
-	$(call mk-caml-lib-bytecode, $@, -dllib dllsyslog_stubs.so -cclib -lsyslog_stubs, $(foreach obj,$(OBJS),$(obj).cmo))
-
-syslog_stubs.a: syslog_stubs.o
-	$(call mk-caml-stubs, $@, $+)
-
-libsyslog_stubs.a: syslog_stubs.o
-	$(call mk-caml-lib-stubs, $@, $+)
-
-logs.mli : logs.ml
-	$(OCAMLC) -i $(OCAMLCFLAGS) $< > $@
-
-syslog.mli : syslog.ml
-	$(OCAMLC) -i $< > $@
-
-.PHONY: install
-install: $(LIBS) META
-	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) log
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore log META $(INTF) $(LIBS) *.a *.so *.cmx
-
-.PHONY: uninstall
-uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) log
-
-include $(TOPLEVEL)/Makefile.rules
-
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/log.ml
--- a/tools/ocaml/libs/log/log.ml
+++ /dev/null
@@ -1,258 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-open Printf
-
-exception Unknown_level of string
-
-type stream_type = Stderr | Stdout | File of string
-
-type stream_log = {
-  ty : stream_type;
-  channel : out_channel option ref;
-}
-
-type level = Debug | Info | Warn | Error
-
-type output =
-	| Stream of stream_log
-	| String of string list ref
-	| Syslog of string
-	| Nil
-
-let int_of_level l =
-	match l with Debug -> 0 | Info -> 1 | Warn -> 2 | Error -> 3
-
-let string_of_level l =
-	match l with Debug -> "debug" | Info -> "info"
-	           | Warn -> "warn" | Error -> "error"
-
-let level_of_string s =
-	match s with
-	| "debug" -> Debug
-	| "info"  -> Info
-	| "warn"  -> Warn
-	| "error" -> Error
-	| _       -> raise (Unknown_level s)
-
-let mkdir_safe dir perm =
-        try Unix.mkdir dir perm with _ -> ()
-
-let mkdir_rec dir perm =
-	let rec p_mkdir dir =
-		let p_name = Filename.dirname dir in
-		if p_name = "/" || p_name = "." then
-			()
-		else (
-			p_mkdir p_name;
-			mkdir_safe dir perm
-		) in
-	p_mkdir dir
-
-type t = { output: output; mutable level: level; }
-
-let make output level = { output = output; level = level; }
-
-let make_stream ty channel = 
-        Stream {ty=ty; channel=ref channel; }
-
-(** open a syslog logger *)
-let opensyslog k level =
-	make (Syslog k) level
-
-(** open a stderr logger *)
-let openerr level =
-	if (Unix.stat "/dev/stderr").Unix.st_kind <> Unix.S_CHR then
-		failwith "/dev/stderr is not a valid character device";
-	make (make_stream Stderr (Some (open_out "/dev/stderr"))) level
-	
-let openout level =
-	if (Unix.stat "/dev/stdout").Unix.st_kind <> Unix.S_CHR then
-		failwith "/dev/stdout is not a valid character device";
-        make (make_stream Stdout (Some (open_out "/dev/stdout"))) level
-
-
-(** open a stream logger - returning the channel. *)
-(* This needs to be separated from 'openfile' so we can reopen later *)
-let doopenfile filename =
-        if Filename.is_relative filename then
-	        None
-	else (
-                try
-		  mkdir_rec (Filename.dirname filename) 0o700;
-	          Some (open_out_gen [ Open_append; Open_creat ] 0o600 filename)
-                with _ -> None
-	)
-
-(** open a stream logger - returning the output type *)
-let openfile filename level =
-        make (make_stream (File filename) (doopenfile filename)) level
-
-(** open a nil logger *)
-let opennil () =
-	make Nil Error
-
-(** open a string logger *)
-let openstring level =
-        make (String (ref [""])) level
-
-(** try to reopen a logger *)
-let reopen t =
-	match t.output with
-	| Nil              -> t
-	| Syslog k         -> Syslog.close (); opensyslog k t.level
-	| Stream s         -> (
-	      match (s.ty,!(s.channel)) with 
-		| (File filename, Some c) -> close_out c; s.channel := (try doopenfile filename with _ -> None); t 
-		| _ -> t)
-	| String _         -> t
-
-(** close a logger *)
-let close t =
-	match t.output with
-	| Nil           -> ()
-	| Syslog k      -> Syslog.close ();
-	| Stream s      -> (
-	      match !(s.channel) with 
-		| Some c -> close_out c; s.channel := None
-		| None -> ())
-	| String _      -> ()
-
-(** create a string representating the parameters of the logger *)
-let string_of_logger t =
-	match t.output with
-	| Nil           -> "nil"
-	| Syslog k      -> sprintf "syslog:%s" k
-	| String _      -> "string"
-	| Stream s      -> 
-	    begin
-	      match s.ty with 
-		| File f -> sprintf "file:%s" f
-		| Stderr -> "stderr"
-		| Stdout -> "stdout"
-	    end
-
-(** parse a string to a logger *)
-let logger_of_string s : t =
-	match s with
-	| "nil"    -> opennil ()
-	| "stderr" -> openerr Debug
-	| "stdout" -> openout Debug
-	| "string" -> openstring Debug
-	| _        ->
-		let split_in_2 s =
-			try
-				let i = String.index s ':' in
-				String.sub s 0 (i),
-				String.sub s (i + 1) (String.length s - i - 1)
-			with _ ->
-				failwith "logger format error: expecting string:string"
-			in
-		let k, s = split_in_2 s in
-		match k with
-		| "syslog" -> opensyslog s Debug
-		| "file"   -> openfile s Debug
-		| _        -> failwith "unknown logger type"
-
-let validate s =
-	match s with
-	| "nil"    -> ()
-	| "stderr" -> ()
-	| "stdout" -> ()
-	| "string" -> ()
-	| _        ->
-		let split_in_2 s =
-			try
-				let i = String.index s ':' in
-				String.sub s 0 (i),
-				String.sub s (i + 1) (String.length s - i - 1)
-			with _ ->
-				failwith "logger format error: expecting string:string"
-			in
-		let k, s = split_in_2 s in
-		match k with
-		| "syslog" -> ()
-		| "file"   -> (
-			try
-				let st = Unix.stat s in
-				if st.Unix.st_kind <> Unix.S_REG then
-					failwith "logger file is a directory";
-				()
-			with Unix.Unix_error (Unix.ENOENT, _, _) -> ()
-			)
-		| _        -> failwith "unknown logger"
-
-(** change a logger level to level *)
-let set t level = t.level <- level
-
-let gettimestring () =
-	let time = Unix.gettimeofday () in
-	let tm = Unix.localtime time in
-        let msec = time -. (floor time) in
-	sprintf "%d%.2d%.2d %.2d:%.2d:%.2d.%.3d|" (1900 + tm.Unix.tm_year)
-	        (tm.Unix.tm_mon + 1) tm.Unix.tm_mday
-	        tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
-	        (int_of_float (1000.0 *. msec))
-
-(*let extra_hook = ref (fun x -> x)*)
-
-let output t ?(key="") ?(extra="") priority (message: string) =
-  let construct_string withtime =
-		(*let key = if key = "" then [] else [ key ] in
-		let extra = if extra = "" then [] else [ extra ] in
-		let items = 
-      (if withtime then [ gettimestring () ] else [])
-		  @ [ sprintf "%5s" (string_of_level priority) ] @ extra @ key @ [ message ] in
-(*		let items = !extra_hook items in*)
-		String.concat " " items*)
-    Printf.sprintf "[%s%s|%s] %s" 
-      (if withtime then gettimestring () else "") (string_of_level priority) extra message
-	in
-	(* Keep track of how much we write out to streams, so that we can *)
-	(* log-rotate at appropriate times *)
-	let write_to_stream stream =
-	  let string = (construct_string true) in
-	  try
-	    fprintf stream "%s\n%!" string
-	  with _ -> () (* Trap exception when we fail to write log *)
-        in
-
-	if String.length message > 0 then
-	match t.output with
-	| Syslog k      ->
-		let sys_prio = match priority with
-		| Debug -> Syslog.Debug
-		| Info  -> Syslog.Info
-		| Warn  -> Syslog.Warning
-		| Error -> Syslog.Err in
-		Syslog.log Syslog.Daemon sys_prio ((construct_string false) ^ "\n")
-	| Stream s -> (
-	      match !(s.channel) with
-		| Some c -> write_to_stream c
-		| None -> ())
-	| Nil           -> ()
-	| String s      -> (s := (construct_string true)::!s)
-
-let log t level (fmt: ('a, unit, string, unit) format4): 'a =
-	let b = (int_of_level t.level) <= (int_of_level level) in
-	(* ksprintf is the preferred name for kprintf, but the former
-	 * is not available in OCaml 3.08.3 *)
-	Printf.kprintf (if b then output t level else (fun _ -> ())) fmt
-	    
-let debug t (fmt: ('a , unit, string, unit) format4) = log t Debug fmt
-let info t (fmt: ('a , unit, string, unit) format4) = log t Info fmt
-let warn t (fmt: ('a , unit, string, unit) format4) = log t Warn fmt
-let error t (fmt: ('a , unit, string, unit) format4) = log t Error fmt
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/log.mli
--- a/tools/ocaml/libs/log/log.mli
+++ /dev/null
@@ -1,55 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-exception Unknown_level of string
-type level = Debug | Info | Warn | Error
-
-type stream_type = Stderr | Stdout | File of string
-type stream_log = {
-  ty : stream_type;
-  channel : out_channel option ref;
-}
-type output =
-    Stream of stream_log
-  | String of string list ref
-  | Syslog of string
-  | Nil
-val int_of_level : level -> int
-val string_of_level : level -> string
-val level_of_string : string -> level
-val mkdir_safe : string -> Unix.file_perm -> unit
-val mkdir_rec : string -> Unix.file_perm -> unit
-type t = { output : output; mutable level : level; }
-val make : output -> level -> t
-val opensyslog : string -> level -> t
-val openerr : level -> t
-val openout : level -> t
-val openfile : string -> level -> t
-val opennil : unit -> t
-val openstring : level -> t
-val reopen : t -> t
-val close : t -> unit
-val string_of_logger : t -> string
-val logger_of_string : string -> t
-val validate : string -> unit
-val set : t -> level -> unit
-val gettimestring : unit -> string
-val output : t -> ?key:string -> ?extra:string -> level -> string -> unit
-val log : t -> level -> ('a, unit, string, unit) format4 -> 'a
-val debug : t -> ('a, unit, string, unit) format4 -> 'a
-val info : t -> ('a, unit, string, unit) format4 -> 'a
-val warn : t -> ('a, unit, string, unit) format4 -> 'a
-val error : t -> ('a, unit, string, unit) format4 -> 'a
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/logs.ml
--- a/tools/ocaml/libs/log/logs.ml
+++ /dev/null
@@ -1,197 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-type keylogger =
-{
-	mutable debug: string list;
-	mutable info: string list;
-	mutable warn: string list;
-	mutable error: string list;
-	no_default: bool;
-}
-
-(* map all logger strings into a logger *)
-let __all_loggers = Hashtbl.create 10
-
-(* default logger that everything that doesn't have a key in __lop_mapping get send *)
-let __default_logger = { debug = []; info = []; warn = []; error = []; no_default = false }
-
-(*
- * This describe the mapping between a name to a keylogger.
- * a keylogger contains a list of logger string per level of debugging.
- * Example:   "xenops", debug -> [ "stderr"; "/var/log/xensource.log" ]
- *            "xapi", error ->   []
- *            "xapi", debug ->   [ "/var/log/xensource.log" ]
- *            "xenops", info ->  [ "syslog" ]
- *)
-let __log_mapping = Hashtbl.create 32
-
-let get_or_open logstring =
-	if Hashtbl.mem __all_loggers logstring then
-		Hashtbl.find __all_loggers logstring
-	else
-		let t = Log.logger_of_string logstring in
-		Hashtbl.add __all_loggers logstring t;
-		t
-
-(** create a mapping entry for the key "name".
- * all log level of key "name" default to "logger" logger.
- * a sensible default is put "nil" as a logger and reopen a specific level to
- * the logger you want to.
- *)
-let add key logger =
-	let kl = {
-		debug = logger;
-		info = logger;
-		warn = logger;
-		error = logger;
-		no_default = false;
-	} in
-	Hashtbl.add __log_mapping key kl
-
-let get_by_level keylog level =
-	match level with
-	| Log.Debug -> keylog.debug
-	| Log.Info  -> keylog.info
-	| Log.Warn  -> keylog.warn
-	| Log.Error -> keylog.error
-
-let set_by_level keylog level logger =
-	match level with
-	| Log.Debug -> keylog.debug <- logger
-	| Log.Info  -> keylog.info <- logger
-	| Log.Warn  -> keylog.warn <- logger
-	| Log.Error -> keylog.error <- logger
-
-(** set a specific key|level to the logger "logger" *)
-let set key level logger =
-	if not (Hashtbl.mem __log_mapping key) then
-		add key [];
-
-	let keylog = Hashtbl.find __log_mapping key in
-	set_by_level keylog level logger
-
-(** set default logger *)
-let set_default level logger =
-	set_by_level __default_logger level logger
-
-(** append a logger to the list *)
-let append key level logger =
-	if not (Hashtbl.mem __log_mapping key) then
-		add key [];
-	let keylog = Hashtbl.find __log_mapping key in
-	let loggers = get_by_level keylog level in
-	set_by_level keylog level (loggers @ [ logger ])
-
-(** append a logger to the default list *)
-let append_default level logger =
-	let loggers = get_by_level __default_logger level in
-	set_by_level __default_logger level (loggers @ [ logger ])
-
-(** reopen all logger open *)
-let reopen () =
-	Hashtbl.iter (fun k v ->
-		Hashtbl.replace __all_loggers k (Log.reopen v)) __all_loggers
-
-(** reclaim close all logger open that are not use by any other keys *)
-let reclaim () =
-	let list_sort_uniq l =
-		let oldprev = ref "" and prev = ref "" in
-		List.fold_left (fun a k ->
-			oldprev := !prev;
-			prev := k;
-			if k = !oldprev then a else k :: a) []
-			(List.sort compare l)
-		in
-	let flatten_keylogger v =
-		list_sort_uniq (v.debug @ v.info @ v.warn @ v.error) in
-	let oldkeys = Hashtbl.fold (fun k v a -> k :: a) __all_loggers [] in
-	let usedkeys = Hashtbl.fold (fun k v a ->
-		(flatten_keylogger v) @ a)
-		__log_mapping (flatten_keylogger __default_logger) in
-	let usedkeys = list_sort_uniq usedkeys in
-
-	List.iter (fun k ->
-		if not (List.mem k usedkeys) then (
-			begin try
-				Log.close (Hashtbl.find __all_loggers k)
-			with
-				Not_found -> ()
-			end;
-			Hashtbl.remove __all_loggers k
-		)) oldkeys
-
-(** clear a specific key|level *)
-let clear key level =
-	try
-		let keylog = Hashtbl.find __log_mapping key in
-		set_by_level keylog level [];
-		reclaim ()
-	with Not_found ->
-		()
-
-(** clear a specific default level *)
-let clear_default level =
-	set_default level [];
-	reclaim ()
-
-(** reset all the loggers to the specified logger *)
-let reset_all logger =
-	Hashtbl.clear __log_mapping;
-	set_default Log.Debug logger;
-	set_default Log.Warn logger;
-	set_default Log.Error logger;
-	set_default Log.Info logger;
-	reclaim ()
-
-(** log a fmt message to the key|level logger specified in the log mapping.
- * if the logger doesn't exist, assume nil logger.
- *)
-let log key level ?(extra="") (fmt: ('a, unit, string, unit) format4): 'a =
-	let keylog =
-		if Hashtbl.mem __log_mapping key then
-			let keylog = Hashtbl.find __log_mapping key in
-			if keylog.no_default = false &&
-			   get_by_level keylog level = [] then
-				__default_logger
-			else
-				keylog
-		else
-			__default_logger in
-	let loggers = get_by_level keylog level in
-	match loggers with
-	| [] -> Printf.kprintf ignore fmt
-	| _  ->
-		let l = List.fold_left (fun acc logger ->	
-			try get_or_open logger :: acc
-			with _ -> acc
-		) [] loggers in
-		let l = List.rev l in
-
-		(* ksprintf is the preferred name for kprintf, but the former
-		 * is not available in OCaml 3.08.3 *)
-		Printf.kprintf (fun s ->
-			List.iter (fun t -> Log.output t ~key ~extra level s) l) fmt
-
-(* define some convenience functions *)
-let debug t ?extra (fmt: ('a , unit, string, unit) format4) =
-	log t Log.Debug ?extra fmt
-let info t ?extra (fmt: ('a , unit, string, unit) format4) =
-	log t Log.Info ?extra fmt
-let warn t ?extra (fmt: ('a , unit, string, unit) format4) =
-	log t Log.Warn ?extra fmt
-let error t ?extra (fmt: ('a , unit, string, unit) format4) =
-	log t Log.Error ?extra fmt
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/logs.mli
--- a/tools/ocaml/libs/log/logs.mli
+++ /dev/null
@@ -1,46 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-type keylogger = {
-  mutable debug : string list;
-  mutable info : string list;
-  mutable warn : string list;
-  mutable error : string list;
-  no_default : bool;
-}
-val __all_loggers : (string, Log.t) Hashtbl.t
-val __default_logger : keylogger
-val __log_mapping : (string, keylogger) Hashtbl.t
-val get_or_open : string -> Log.t
-val add : string -> string list -> unit
-val get_by_level : keylogger -> Log.level -> string list
-val set_by_level : keylogger -> Log.level -> string list -> unit
-val set : string -> Log.level -> string list -> unit
-val set_default : Log.level -> string list -> unit
-val append : string -> Log.level -> string -> unit
-val append_default : Log.level -> string -> unit
-val reopen : unit -> unit
-val reclaim : unit -> unit
-val clear : string -> Log.level -> unit
-val clear_default : Log.level -> unit
-val reset_all : string list -> unit
-val log :
-  string ->
-  Log.level -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
-val debug : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
-val info : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
-val warn : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
-val error : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/syslog.ml
--- a/tools/ocaml/libs/log/syslog.ml
+++ /dev/null
@@ -1,26 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-type level = Emerg | Alert | Crit | Err | Warning | Notice | Info | Debug
-type options = Cons | Ndelay | Nowait | Odelay | Perror | Pid
-type facility = Auth | Authpriv | Cron | Daemon | Ftp | Kern
-              | Local0 | Local1 | Local2 | Local3
-	      | Local4 | Local5 | Local6 | Local7
-	      | Lpr | Mail | News | Syslog | User | Uucp
-
-(* external init : string -> options list -> facility -> unit = "stub_openlog" *)
-external log : facility -> level -> string -> unit = "stub_syslog"
-external close : unit -> unit = "stub_closelog"
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/syslog.mli
--- a/tools/ocaml/libs/log/syslog.mli
+++ /dev/null
@@ -1,41 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-type level = Emerg | Alert | Crit | Err | Warning | Notice | Info | Debug
-type options = Cons | Ndelay | Nowait | Odelay | Perror | Pid
-type facility =
-    Auth
-  | Authpriv
-  | Cron
-  | Daemon
-  | Ftp
-  | Kern
-  | Local0
-  | Local1
-  | Local2
-  | Local3
-  | Local4
-  | Local5
-  | Local6
-  | Local7
-  | Lpr
-  | Mail
-  | News
-  | Syslog
-  | User
-  | Uucp
-external log : facility -> level -> string -> unit = "stub_syslog"
-external close : unit -> unit = "stub_closelog"
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/syslog_stubs.c
--- a/tools/ocaml/libs/log/syslog_stubs.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- */
-
-#include <syslog.h>
-#include <caml/mlvalues.h>
-#include <caml/memory.h>
-#include <caml/alloc.h>
-#include <caml/custom.h>
-
-static int __syslog_level_table[] = {
-	LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING,
-	LOG_NOTICE, LOG_INFO, LOG_DEBUG
-};
-
-/*
-static int __syslog_options_table[] = {
-	LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR, LOG_PID
-};
-*/
-
-static int __syslog_facility_table[] = {
-	LOG_AUTH, LOG_AUTHPRIV, LOG_CRON, LOG_DAEMON, LOG_FTP, LOG_KERN,
-	LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3,
-	LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7,
-	LOG_LPR | LOG_MAIL | LOG_NEWS | LOG_SYSLOG | LOG_USER | LOG_UUCP
-};
-
-/* According to the openlog manpage the 'openlog' call may take a reference
-   to the 'ident' string and keep it long-term. This means we cannot just pass in
-   an ocaml string which is under the control of the GC. Since we aren't actually
-   calling this function we can just comment it out for the time-being. */
-/*
-value stub_openlog(value ident, value option, value facility)
-{
-	CAMLparam3(ident, option, facility);
-	int c_option;
-	int c_facility;
-
-	c_option = caml_convert_flag_list(option, __syslog_options_table);
-	c_facility = __syslog_facility_table[Int_val(facility)];
-	openlog(String_val(ident), c_option, c_facility);
-	CAMLreturn(Val_unit);
-}
-*/
-
-value stub_syslog(value facility, value level, value msg)
-{
-	CAMLparam3(facility, level, msg);
-	int c_facility;
-
-	c_facility = __syslog_facility_table[Int_val(facility)]
-	           | __syslog_level_table[Int_val(level)];
-	syslog(c_facility, "%s", String_val(msg));
-	CAMLreturn(Val_unit);
-}
-
-value stub_closelog(value unit)
-{
-	CAMLparam1(unit);
-	closelog();
-	CAMLreturn(Val_unit);
-}
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/Makefile
--- a/tools/ocaml/xenstored/Makefile
+++ b/tools/ocaml/xenstored/Makefile
@@ -3,7 +3,6 @@
 include $(OCAML_TOPLEVEL)/common.make
 
 OCAMLINCLUDE += \
-	-I $(OCAML_TOPLEVEL)/libs/log \
 	-I $(OCAML_TOPLEVEL)/libs/xb \
 	-I $(OCAML_TOPLEVEL)/libs/mmap \
 	-I $(OCAML_TOPLEVEL)/libs/xc \
@@ -34,7 +33,6 @@
 XENSTOREDLIBS = \
 	unix.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap $(OCAML_TOPLEVEL)/libs/mmap/xenmmap.cmxa \
-	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/log $(OCAML_TOPLEVEL)/libs/log/log.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/eventchn/xeneventchn.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc $(OCAML_TOPLEVEL)/libs/xc/xenctrl.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb $(OCAML_TOPLEVEL)/libs/xb/xenbus.cmxa \
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/connection.ml
--- a/tools/ocaml/xenstored/connection.ml
+++ b/tools/ocaml/xenstored/connection.ml
@@ -232,3 +232,8 @@
 			Printf.fprintf chan "watch,%d,%s,%s\n" domid (Utils.hexify path) (Utils.hexify token)
 			) (list_watches con);
 	| None -> ()
+
+let debug con =
+	let domid = get_domstr con in
+	let watches = List.map (fun (path, token) -> Printf.sprintf "watch %s: %s %s\n" domid path token) (list_watches con) in
+	String.concat "" watches
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/connections.ml
--- a/tools/ocaml/xenstored/connections.ml
+++ b/tools/ocaml/xenstored/connections.ml
@@ -15,7 +15,7 @@
  * GNU Lesser General Public License for more details.
  *)
 
-let debug fmt = Logs.debug "general" fmt
+let debug fmt = Logging.debug "connections" fmt
 
 type t = {
 	mutable anonymous: Connection.t list;
@@ -165,3 +165,8 @@
 	);
 	(List.length cons.anonymous, !nb_ops_anon, !nb_watchs_anon,
 	 Hashtbl.length cons.domains, !nb_ops_dom, !nb_watchs_dom)
+
+let debug cons =
+	let anonymous = List.map Connection.debug cons.anonymous in
+	let domains = Hashtbl.fold (fun _ con accu -> Connection.debug con :: accu) cons.domains [] in
+	String.concat "" (domains @ anonymous)
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/disk.ml
--- a/tools/ocaml/xenstored/disk.ml
+++ b/tools/ocaml/xenstored/disk.ml
@@ -17,7 +17,7 @@
 let enable = ref false
 let xs_daemon_database = "/var/run/xenstored/db"
 
-let error = Logs.error "general"
+let error fmt = Logging.error "disk" fmt
 
 (* unescape utils *)
 exception Bad_escape
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/domain.ml
--- a/tools/ocaml/xenstored/domain.ml
+++ b/tools/ocaml/xenstored/domain.ml
@@ -16,7 +16,7 @@
 
 open Printf
 
-let debug fmt = Logs.debug "general" fmt
+let debug fmt = Logging.debug "domain" fmt
 
 type t =
 {
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/domains.ml
--- a/tools/ocaml/xenstored/domains.ml
+++ b/tools/ocaml/xenstored/domains.ml
@@ -14,6 +14,8 @@
  * GNU Lesser General Public License for more details.
  *)
 
+let debug fmt = Logging.debug "domains" fmt
+
 type domains = {
 	eventchn: Event.t;
 	table: (Xenctrl.domid, Domain.t) Hashtbl.t;
@@ -35,7 +37,7 @@
 		try
 			let info = Xenctrl.domain_getinfo xc id in
 			if info.Xenctrl.shutdown || info.Xenctrl.dying then (
-				Logs.debug "general" "Domain %u died (dying=%b, shutdown %b -- code %d)"
+				debug "Domain %u died (dying=%b, shutdown %b -- code %d)"
 				                    id info.Xenctrl.dying info.Xenctrl.shutdown info.Xenctrl.shutdown_code;
 				if info.Xenctrl.dying then
 					dead_dom := id :: !dead_dom
@@ -43,7 +45,7 @@
 					notify := true;
 			)
 		with Xenctrl.Error _ ->
-			Logs.debug "general" "Domain %u died -- no domain info" id;
+			debug "Domain %u died -- no domain info" id;
 			dead_dom := id :: !dead_dom;
 		) doms.table;
 	List.iter (fun id ->
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/logging.ml
--- a/tools/ocaml/xenstored/logging.ml
+++ b/tools/ocaml/xenstored/logging.ml
@@ -17,21 +17,122 @@
 open Stdext
 open Printf
 
-let error fmt = Logs.error "general" fmt
-let info fmt = Logs.info "general" fmt
-let debug fmt = Logs.debug "general" fmt
 
-let access_log_file = ref "/var/log/xenstored-access.log"
-let access_log_nb_files = ref 20
-let access_log_nb_lines = ref 13215
-let activate_access_log = ref true
+(* Logger common *)
 
-(* maximal size of the lines in xenstore-acces.log file *)
-let line_size = 180
+type logger =
+		{ stop: unit -> unit;
+		  restart: unit -> unit;
+		  rotate: unit -> unit;
+		  write: 'a. ('a, unit, string, unit) format4 -> 'a }
 
-let log_read_ops = ref false
-let log_transaction_ops = ref false
-let log_special_ops = ref false
+let truncate_line nb_chars line = 
+	if String.length line > nb_chars - 1 then
+		let len = max (nb_chars - 1) 2 in
+		let dst_line = String.create len in
+		String.blit line 0 dst_line 0 (len - 2);
+		dst_line.[len-2] <- '.'; 
+		dst_line.[len-1] <- '.';
+		dst_line
+	else line
+
+let log_rotate ref_ch log_file log_nb_files =
+	let file n = sprintf "%s.%i" log_file n in
+	let log_files =
+		let rec aux accu n =
+			if n >= log_nb_files then accu
+			else
+				if n = 1 && Sys.file_exists log_file
+				then aux [log_file,1] 2
+				else
+					let file = file (n-1) in
+					if Sys.file_exists file then
+						aux ((file, n) :: accu) (n+1)
+					else accu in
+		aux [] 1 in
+	List.iter (fun (f, n) -> Unix.rename f (file n)) log_files;
+	close_out !ref_ch;
+	ref_ch := open_out log_file
+
+let make_logger log_file log_nb_files log_nb_lines log_nb_chars post_rotate =
+	let channel = ref (open_out_gen [Open_append; Open_creat] 0o644 log_file) in
+	let counter = ref 0 in
+	let stop() =
+		try flush !channel; close_out !channel
+		with _ -> () in
+	let restart() =
+		stop();
+		channel := open_out_gen [Open_append; Open_creat] 0o644 log_file in
+	let rotate() =
+		log_rotate channel log_file log_nb_files;
+		(post_rotate (): unit);
+		counter := 0 in
+	let output s =
+		let s = if log_nb_chars > 0 then truncate_line log_nb_chars s else s in
+		let s = s ^ "\n" in
+		output_string !channel s;
+		flush !channel;
+		incr counter;
+		if !counter > log_nb_lines then rotate() in
+	{ stop=stop; restart=restart; rotate=rotate; write = fun fmt -> Printf.ksprintf output fmt }
+
+
+(* Xenstored logger *) 
+
+exception Unknown_level of string
+
+type level = Debug | Info | Warn | Error | Null
+
+let int_of_level = function
+	| Debug -> 0 | Info -> 1 | Warn -> 2
+	| Error -> 3 | Null -> max_int
+
+let string_of_level = function
+	| Debug -> "debug" | Info -> "info" | Warn -> "warn"
+	| Error -> "error" | Null -> "null"
+
+let level_of_string = function
+	| "debug" -> Debug | "info"  -> Info | "warn"  -> Warn
+	| "error" -> Error | "null"  -> Null | s  -> raise (Unknown_level s)
+
+let string_of_date () =
+	let time = Unix.gettimeofday () in
+	let tm = Unix.gmtime time in
+	let msec = time -. (floor time) in
+	sprintf "%d%.2d%.2dT%.2d:%.2d:%.2d.%.3dZ"
+		(1900 + tm.Unix.tm_year) (tm.Unix.tm_mon + 1) tm.Unix.tm_mday
+		tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
+		(int_of_float (1000.0 *. msec))
+
+let xenstored_log_file = ref "/var/log/xenstored.log"
+let xenstored_log_level = ref Null
+let xenstored_log_nb_files = ref 10
+let xenstored_log_nb_lines = ref 13215
+let xenstored_log_nb_chars = ref (-1)
+let xenstored_logger = ref (None: logger option)
+
+let init_xenstored_log () =
+	if !xenstored_log_level <> Null && !xenstored_log_nb_files > 0 then
+		let logger =
+			make_logger 
+				!xenstored_log_file !xenstored_log_nb_files !xenstored_log_nb_lines
+				!xenstored_log_nb_chars ignore in
+		xenstored_logger := Some logger
+
+let xenstored_logging level key (fmt: (_,_,_,_) format4) =
+	match !xenstored_logger with
+	| Some logger when int_of_level level >= int_of_level !xenstored_log_level ->
+			let date = string_of_date() in
+			let level = string_of_level level in
+			logger.write ("[%s|%5s|%s] " ^^ fmt) date level key
+	| _ -> Printf.ksprintf ignore fmt
+
+let debug key = xenstored_logging Debug key
+let info key = xenstored_logging Info key
+let warn key = xenstored_logging Warn key
+let error key = xenstored_logging Error key
+
+(* Access logger *)
 
 type access_type =
 	| Coalesce
@@ -41,38 +142,10 @@
 	| Endconn
 	| XbOp of Xenbus.Xb.Op.operation
 
-type access =
-	{
-		fd: out_channel ref;
-		counter: int ref;
-		write: tid:int -> con:string -> ?data:string -> access_type -> unit;
-	}
-
-let string_of_date () =
-	let time = Unix.gettimeofday () in
-	let tm = Unix.localtime time in
-	let msec = time -. (floor time) in
-	sprintf "%d%.2d%.2d %.2d:%.2d:%.2d.%.3d" (1900 + tm.Unix.tm_year)
-		(tm.Unix.tm_mon + 1)
-		tm.Unix.tm_mday
-		tm.Unix.tm_hour
-		tm.Unix.tm_min
-		tm.Unix.tm_sec
-		(int_of_float (1000.0 *. msec))
-
-let fill_with_space n s =
-	if String.length s < n
-	then 
-		let r = String.make n ' ' in
-		String.blit s 0  r 0 (String.length s);
-		r
-	else 
-		s
-
 let string_of_tid ~con tid =
 	if tid = 0
-	then fill_with_space 12 (sprintf "%s" con)
-	else fill_with_space 12 (sprintf "%s.%i" con tid)
+	then sprintf "%-12s" con
+	else sprintf "%-12s" (sprintf "%s.%i" con tid)
 
 let string_of_access_type = function
 	| Coalesce                -> "coalesce "
@@ -109,41 +182,9 @@
 
 	| Xenbus.Xb.Op.Error             -> "error    "
 	| Xenbus.Xb.Op.Watchevent        -> "w event  "
-
+	(*
 	| x                       -> Xenbus.Xb.Op.to_string x
-
-let file_exists file =
-	try
-		Unix.close (Unix.openfile file [Unix.O_RDONLY] 0o644);
-		true
-	with _ ->
-		false
-
-let log_rotate fd =
-	let file n = sprintf "%s.%i" !access_log_file n in
-	let log_files =
-		let rec aux accu n =
-			if n >= !access_log_nb_files
-			then accu
-			else if n = 1 && file_exists !access_log_file
-			then aux [!access_log_file,1] 2
-			else
-				let file = file (n-1) in
-				if file_exists file
-				then aux ((file,n) :: accu) (n+1)
-				else accu
-		in
-		aux [] 1
-	in
-	let rec rename = function
-		| (f,n) :: t when n < !access_log_nb_files -> 
-			Unix.rename f (file n);
-			rename t
-		| _ -> ()
-	in
-	rename log_files;
-	close_out !fd;
-	fd := open_out !access_log_file
+	*)
 
 let sanitize_data data =
 	let data = String.copy data in
@@ -154,86 +195,68 @@
 	done;
 	String.escaped data
 
-let make save_to_disk =
-	let fd = ref (open_out_gen [Open_append; Open_creat] 0o644 !access_log_file) in
-	let counter = ref 0 in
-	{
-		fd = fd;
-		counter = counter;
-		write = 
-			if not !activate_access_log || !access_log_nb_files = 0
-			then begin fun ~tid ~con ?data _ -> () end
-			else fun ~tid ~con ?(data="") access_type ->
-				let s = Printf.sprintf "[%s] %s %s %s\n" (string_of_date()) (string_of_tid ~con tid) 
-					(string_of_access_type access_type) (sanitize_data data) in
-				let s =
-					if String.length s > line_size
-					then begin
-						let s = String.sub s 0 line_size in
-						s.[line_size-3] <- '.'; 
-						s.[line_size-2] <- '.';
-						s.[line_size-1] <- '\n';
-						s
-					end else
-						s
-				in
-				incr counter;
-				output_string !fd s;
-				flush !fd;
-				if !counter > !access_log_nb_lines 
-				then begin 
-					log_rotate fd;
-					save_to_disk ();
-					counter := 0;
-				end
-	}
+let activate_access_log = ref true
+let access_log_file = ref "/var/log/xenstored-access.log"
+let access_log_nb_files = ref 20
+let access_log_nb_lines = ref 13215
+let access_log_nb_chars = ref 180
+let access_log_read_ops = ref false
+let access_log_transaction_ops = ref false
+let access_log_special_ops = ref false
+let access_logger = ref None
 
-let access : (access option) ref = ref None
-let init aal save_to_disk =
-	activate_access_log := aal;
-	access := Some (make save_to_disk)
-
-let write_access_log ~con ~tid ?data access_type = 
+let init_access_log post_rotate =
+	if !access_log_nb_files > 0 then
+		let logger =
+			make_logger
+				!access_log_file !access_log_nb_files !access_log_nb_lines
+				!access_log_nb_chars post_rotate in
+		access_logger := Some logger
+ 
+let access_logging ~con ~tid ?(data="") access_type =
         try
-	  maybe (fun a -> a.write access_type ~con ~tid ?data) !access
+		maybe
+			(fun logger ->
+				let date = string_of_date() in
+				let tid = string_of_tid ~con tid in
+				let access_type = string_of_access_type access_type in
+				let data = sanitize_data data in
+				logger.write "[%s] %s %s %s" date tid access_type data)
+			!access_logger
 	with _ -> ()
 
-let new_connection = write_access_log Newconn
-let end_connection = write_access_log Endconn
+let new_connection = access_logging Newconn
+let end_connection = access_logging Endconn
 let read_coalesce ~tid ~con data =
-	if !log_read_ops
-	then write_access_log Coalesce ~tid ~con ~data:("read "^data)
-let write_coalesce data = write_access_log Coalesce ~data:("write "^data)
-let conflict = write_access_log Conflict
-let commit = write_access_log Commit
+	if !access_log_read_ops
+	then access_logging Coalesce ~tid ~con ~data:("read "^data)
+let write_coalesce data = access_logging Coalesce ~data:("write "^data)
+let conflict = access_logging Conflict
+let commit = access_logging Commit
 
 let xb_op ~tid ~con ~ty data =
-	let print =
-	match ty with
-		| Xenbus.Xb.Op.Read | Xenbus.Xb.Op.Directory | Xenbus.Xb.Op.Getperms -> !log_read_ops
+	let print = match ty with
+		| Xenbus.Xb.Op.Read | Xenbus.Xb.Op.Directory | Xenbus.Xb.Op.Getperms -> !access_log_read_ops
 		| Xenbus.Xb.Op.Transaction_start | Xenbus.Xb.Op.Transaction_end ->
 			false (* transactions are managed below *)
 		| Xenbus.Xb.Op.Introduce | Xenbus.Xb.Op.Release | Xenbus.Xb.Op.Getdomainpath | Xenbus.Xb.Op.Isintroduced | Xenbus.Xb.Op.Resume ->
-			!log_special_ops
-		| _ -> true
-	in
-		if print 
-		then write_access_log ~tid ~con ~data (XbOp ty)
+			!access_log_special_ops
+		| _ -> true in
+	if print then access_logging ~tid ~con ~data (XbOp ty)
 
 let start_transaction ~tid ~con = 
-	if !log_transaction_ops && tid <> 0
-	then write_access_log ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_start)
+	if !access_log_transaction_ops && tid <> 0
+	then access_logging ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_start)
 
 let end_transaction ~tid ~con = 
-	if !log_transaction_ops && tid <> 0
-	then write_access_log ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_end)
+	if !access_log_transaction_ops && tid <> 0
+	then access_logging ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_end)
 
 let xb_answer ~tid ~con ~ty data =
 	let print = match ty with
-		| Xenbus.Xb.Op.Error when data="ENOENT " -> !log_read_ops
-		| Xenbus.Xb.Op.Error -> !log_special_ops
+		| Xenbus.Xb.Op.Error when String.startswith "ENOENT " data -> !access_log_read_ops
+		| Xenbus.Xb.Op.Error -> true
 		| Xenbus.Xb.Op.Watchevent -> true
 		| _ -> false
 	in
-		if print
-		then write_access_log ~tid ~con ~data (XbOp ty)
+	if print then access_logging ~tid ~con ~data (XbOp ty)
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/perms.ml
--- a/tools/ocaml/xenstored/perms.ml
+++ b/tools/ocaml/xenstored/perms.ml
@@ -15,6 +15,8 @@
  * GNU Lesser General Public License for more details.
  *)
 
+let info fmt = Logging.info "perms" fmt
+
 open Stdext
 
 let activate = ref true
@@ -145,16 +147,16 @@
 		in
 		match perm, request with
 		| NONE, _ ->
-			Logs.info "io" "Permission denied: Domain %d has no permission" domainid;
+			info "Permission denied: Domain %d has no permission" domainid;
 			false
 		| RDWR, _ -> true
 		| READ, READ -> true
 		| WRITE, WRITE -> true
 		| READ, _ ->
-			Logs.info "io" "Permission denied: Domain %d has read only access" domainid;
+			info "Permission denied: Domain %d has read only access" domainid;
 			false
 		| WRITE, _ ->
-			Logs.info "io" "Permission denied: Domain %d has write only access" domainid;
+			info "Permission denied: Domain %d has write only access" domainid;
 			false
 	in
 	if !activate
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/process.ml
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -14,6 +14,9 @@
  * GNU Lesser General Public License for more details.
  *)
 
+let error fmt = Logging.error "process" fmt
+let info fmt = Logging.info "process" fmt
+
 open Printf
 open Stdext
 
@@ -79,7 +82,7 @@
 
 (* packets *)
 let do_debug con t domains cons data =
-	if not !allow_debug
+	if not (Connection.is_dom0 con) && not !allow_debug
 	then None
 	else try match split None '\000' data with
 	| "print" :: msg :: _ ->
@@ -89,6 +92,9 @@
 		let domid = int_of_string domid in
 		let quota = (Store.get_quota t.Transaction.store) in
 		Some (Quota.to_string quota domid ^ "\000")
+	| "watches" :: _ ->
+		let watches = Connections.debug cons in
+		Some (watches ^ "\000")
 	| "mfn" :: domid :: _ ->
 		let domid = int_of_string domid in
 		let con = Connections.find_domain cons domid in
@@ -357,8 +363,7 @@
 			in
 		input_handle_error ~cons ~doms ~fct ~ty ~con ~t ~rid ~data;
 	with exn ->
-		Logs.error "general" "process packet: %s"
-		          (Printexc.to_string exn);
+		error "process packet: %s" (Printexc.to_string exn);
 		Connection.send_error con tid rid "EIO"
 
 let write_access_log ~ty ~tid ~con ~data =
@@ -372,7 +377,7 @@
 		let packet = Connection.pop_in con in
 		let tid, rid, ty, data = Xenbus.Xb.Packet.unpack packet in
 		(* As we don't log IO, do not call an unnecessary sanitize_data 
-		   Logs.info "io" "[%s] -> [%d] %s \"%s\""
+		   info "[%s] -> [%d] %s \"%s\""
 		         (Connection.get_domstr con) tid
 		         (Xenbus.Xb.Op.to_string ty) (sanitize_data data); *)
 		process_packet ~store ~cons ~doms ~con ~tid ~rid ~ty ~data;
@@ -386,7 +391,7 @@
 			let packet = Connection.peek_output con in
 			let tid, rid, ty, data = Xenbus.Xb.Packet.unpack packet in
 			(* As we don't log IO, do not call an unnecessary sanitize_data 
-			   Logs.info "io" "[%s] <- %s \"%s\""
+			   info "[%s] <- %s \"%s\""
 			         (Connection.get_domstr con)
 			         (Xenbus.Xb.Op.to_string ty) (sanitize_data data);*)
 			write_answer_log ~ty ~tid ~con ~data;
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/quota.ml
--- a/tools/ocaml/xenstored/quota.ml
+++ b/tools/ocaml/xenstored/quota.ml
@@ -18,7 +18,7 @@
 exception Data_too_big
 exception Transaction_opened
 
-let warn fmt = Logs.warn "general" fmt
+let warn fmt = Logging.warn "quota" fmt
 let activate = ref true
 let maxent = ref (10000)
 let maxsize = ref (4096)
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/store.ml
--- a/tools/ocaml/xenstored/store.ml
+++ b/tools/ocaml/xenstored/store.ml
@@ -83,7 +83,7 @@
 let check_owner node connection =
 	if not (Perms.check_owner connection node.perms)
 	then begin
-		Logs.info "io" "Permission denied: Domain %d not owner" (get_owner node);
+		Logging.info "store|node" "Permission denied: Domain %d not owner" (get_owner node);
 		raise Define.Permission_denied;
 	end
 
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/xenstored.conf
--- a/tools/ocaml/xenstored/xenstored.conf
+++ b/tools/ocaml/xenstored/xenstored.conf
@@ -22,9 +22,14 @@
 # Activate filed base backend
 persistant = false
 
-# Logs
-log = error;general;file:/var/log/xenstored.log
-log = warn;general;file:/var/log/xenstored.log
-log = info;general;file:/var/log/xenstored.log
+# Xenstored logs
+# xenstored-log-file = /var/log/xenstored.log
+# xenstored-log-level = null
+# xenstored-log-nb-files = 10
 
-# log = debug;io;file:/var/log/xenstored-io.log
+# Xenstored access logs
+# access-log-file = /var/log/xenstored-access.log
+# access-log-nb-lines = 13215
+# acesss-log-nb-chars = 180
+# access-log-special-ops = false
+
diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/xenstored.ml
--- a/tools/ocaml/xenstored/xenstored.ml
+++ b/tools/ocaml/xenstored/xenstored.ml
@@ -18,7 +18,10 @@
 open Printf
 open Parse_arg
 open Stdext
-open Logging
+
+let error fmt = Logging.error "xenstored" fmt
+let debug fmt = Logging.debug "xenstored" fmt
+let info fmt = Logging.info "xenstored" fmt
 
 (*------------ event klass processors --------------*)
 let process_connection_fds store cons domains rset wset =
@@ -64,7 +67,8 @@
 		()
 
 let sighup_handler _ =
-	try Logs.reopen (); info "Log re-opened" with _ -> ()
+	maybe (fun logger -> logger.Logging.restart()) !Logging.xenstored_logger;
+	maybe (fun logger -> logger.Logging.restart()) !Logging.access_logger
 
 let config_filename cf =
 	match cf.config_file with
@@ -75,26 +79,6 @@
 
 let parse_config filename =
 	let pidfile = ref default_pidfile in
-	let set_log s =
-		let ls = String.split ~limit:3 ';' s in
-		let level, key, logger = match ls with
-		| [ level; key; logger ] -> level, key, logger
-		| _ -> failwith "format mismatch: expecting 3 arguments" in
-
-		let loglevel = match level with
-		| "debug" -> Log.Debug
-		| "info"  -> Log.Info
-		| "warn"  -> Log.Warn
-		| "error" -> Log.Error
-		| s       -> failwith (sprintf "Unknown log level: %s" s) in
-
-		(* if key is empty, append to the default logger *)
-		let append =
-			if key = "" then
-				Logs.append_default
-			else
-				Logs.append key in
-		append loglevel logger in
 	let options = [
 		("merge-activate", Config.Set_bool Transaction.do_coalesce);
 		("perms-activate", Config.Set_bool Perms.activate);
@@ -104,14 +88,20 @@
 		("quota-maxentity", Config.Set_int Quota.maxent);
 		("quota-maxsize", Config.Set_int Quota.maxsize);
 		("test-eagain", Config.Set_bool Transaction.test_eagain);
-		("log", Config.String set_log);
 		("persistant", Config.Set_bool Disk.enable);
+		("xenstored-log-file", Config.Set_string Logging.xenstored_log_file);
+		("xenstored-log-level", Config.String
+			(fun s -> Logging.xenstored_log_level := Logging.level_of_string s));
+		("xenstored-log-nb-files", Config.Set_int Logging.xenstored_log_nb_files);
+		("xenstored-log-nb-lines", Config.Set_int Logging.xenstored_log_nb_lines);
+		("xenstored-log-nb-chars", Config.Set_int Logging.xenstored_log_nb_chars);
 		("access-log-file", Config.Set_string Logging.access_log_file);
 		("access-log-nb-files", Config.Set_int Logging.access_log_nb_files);
 		("access-log-nb-lines", Config.Set_int Logging.access_log_nb_lines);
-		("access-log-read-ops", Config.Set_bool Logging.log_read_ops);
-		("access-log-transactions-ops", Config.Set_bool Logging.log_transaction_ops);
-		("access-log-special-ops", Config.Set_bool Logging.log_special_ops);
+		("access-log-nb-chars", Config.Set_int Logging.access_log_nb_chars);
+		("access-log-read-ops", Config.Set_bool Logging.access_log_read_ops);
+		("access-log-transactions-ops", Config.Set_bool Logging.access_log_transaction_ops);
+		("access-log-special-ops", Config.Set_bool Logging.access_log_special_ops);
 		("allow-debug", Config.Set_bool Process.allow_debug);
 		("pid-file", Config.Set_string pidfile); ] in
 	begin try Config.read filename options (fun _ _ -> raise Not_found)
@@ -223,9 +213,6 @@
 end
 
 let _ =
-	printf "Xen Storage Daemon, version %d.%d\n%!"
-	       Define.xenstored_major Define.xenstored_minor;
-
 	let cf = do_argv in
 	let pidfile =
 		if Sys.file_exists (config_filename cf) then
@@ -249,13 +236,13 @@
 		in
 	
 	if cf.daemonize then
-		Unixext.daemonize ();
+		Unixext.daemonize ()
+	else
+		printf "Xen Storage Daemon, version %d.%d\n%!" 
+			Define.xenstored_major Define.xenstored_minor;
 
 	(try Unixext.pidfile_write pidfile with _ -> ());
 
-	info "Xen Storage Daemon, version %d.%d"
-	     Define.xenstored_major Define.xenstored_minor;
-
 	(* for compatilibity with old xenstored *)
 	begin match cf.pidfile with
 	| Some pidfile -> Unixext.pidfile_write pidfile
@@ -293,7 +280,14 @@
 	Sys.set_signal Sys.sigusr1 (Sys.Signal_handle (fun i -> sigusr1_handler store));
 	Sys.set_signal Sys.sigpipe Sys.Signal_ignore;
 
-	Logging.init cf.activate_access_log (fun () -> DB.to_file store cons "/var/run/xenstored/db");
+	Logging.init_xenstored_log();
+	if cf.activate_access_log then begin
+		let post_rotate () = DB.to_file store cons "/var/run/xenstored/db" in
+		Logging.init_access_log post_rotate
+	end;
+
+	info "Xen Storage Daemon, version %d.%d"
+	     Define.xenstored_major Define.xenstored_minor;
 
 	let spec_fds =
 		(match rw_sock with None -> [] | Some x -> [ x ]) @

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 03:53:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 03:53:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC83x-0002tj-Kj; Fri, 07 Oct 2011 03:53:57 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC7xz-0000Gr-AB
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:47:51 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1317984459!106699!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1172 invoked from network); 7 Oct 2011 10:47:41 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-15.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 10:47:41 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18026939"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 06:47:38 -0400
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;
	Fri, 7 Oct 2011 06:47:37 -0400
Received: from snoosnoo2.uk.xensource.com ([10.80.2.49])	by
	ukmail1.uk.xensource.com with esmtp (Exim 4.69)	(envelope-from
	<jonathan.ludlam@eu.citrix.com>)	id 1RC7xp-0003Vd-4g; Fri, 07 Oct 2011
	11:47:37 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ffbc5e9929d52531a9ec33ff861a245cfde604bd
Message-ID: <ffbc5e9929d52531a9ec.1317983159@snoosnoo2.uk.xensource.com>
In-Reply-To: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 7 Oct 2011 11:25:59 +0100
From: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
To: xen-devel@lists.xensource.com
Cc: jonathan.ludlam@eu.citrix.com
Subject: [Xen-devel] [PATCH 1 of 6] [OCAML] Rename the ocaml libraries
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

ocamlfind does not support namespaces, so to avoid
name clashes the module names have become longer.
Additionally, the xenstore and xenbus subdirs, which
contain several modules each, have been packed into
toplevel Xenstore and Xenbus modules.

xb becomes xenbus, xc becomes xenctrl, xl becomes xenlight,
xs becomes xenstore, eventchn becomes xeneventchn and
mmap becomes xenmmap.

Signed-off-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/META.in
--- a/tools/ocaml/libs/eventchn/META.in
+++ b/tools/ocaml/libs/eventchn/META.in
@@ -1,5 +1,5 @@
 version = "@VERSION@"
 description = "Eventchn interface extension"
 requires = "unix"
-archive(byte) = "eventchn.cma"
-archive(native) = "eventchn.cmxa"
+archive(byte) = "xeneventchn.cma"
+archive(native) = "xeneventchn.cmxa"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/Makefile
--- a/tools/ocaml/libs/eventchn/Makefile
+++ b/tools/ocaml/libs/eventchn/Makefile
@@ -4,11 +4,11 @@
 
 CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude)
 
-OBJS = eventchn
+OBJS = xeneventchn
 INTF = $(foreach obj, $(OBJS),$(obj).cmi)
-LIBS = eventchn.cma eventchn.cmxa
+LIBS = xeneventchn.cma xeneventchn.cmxa
 
-LIBS_evtchn = $(LDLIBS_libxenctrl)
+LIBS_xeneventchn = $(LDLIBS_libxenctrl)
 
 all: $(INTF) $(LIBS) $(PROGRAMS)
 
@@ -16,20 +16,20 @@
 
 libs: $(LIBS)
 
-eventchn_OBJS = $(OBJS)
-eventchn_C_OBJS = eventchn_stubs
+xeneventchn_OBJS = $(OBJS)
+xeneventchn_C_OBJS = xeneventchn_stubs
 
-OCAML_LIBRARY = eventchn
+OCAML_LIBRARY = xeneventchn
 
 .PHONY: install
 install: $(LIBS) META
 	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) eventchn
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore eventchn META $(INTF) $(LIBS) *.a *.so *.cmx
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xeneventchn
+	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xeneventchn META $(INTF) $(LIBS) *.a *.so *.cmx
 
 .PHONY: uninstall
 uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) eventchn
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xeneventchn
 
 include $(TOPLEVEL)/Makefile.rules
 
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/eventchn.ml
--- a/tools/ocaml/libs/eventchn/eventchn.ml
+++ /dev/null
@@ -1,30 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-exception Error of string
-
-type handle
-
-external init: unit -> handle = "stub_eventchn_init"
-external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
-external notify: handle -> int -> unit = "stub_eventchn_notify"
-external bind_interdomain: handle -> int -> int -> int = "stub_eventchn_bind_interdomain"
-external bind_dom_exc_virq: handle -> int = "stub_eventchn_bind_dom_exc_virq"
-external unbind: handle -> int -> unit = "stub_eventchn_unbind"
-external pending: handle -> int = "stub_eventchn_pending"
-external unmask: handle -> int -> unit = "stub_eventchn_unmask"
-
-let _ = Callback.register_exception "eventchn.error" (Error "register_callback")
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/eventchn.mli
--- a/tools/ocaml/libs/eventchn/eventchn.mli
+++ /dev/null
@@ -1,31 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-exception Error of string
-
-type handle
-
-external init : unit -> handle = "stub_eventchn_init"
-external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
-
-external notify : handle -> int -> unit = "stub_eventchn_notify"
-external bind_interdomain : handle -> int -> int -> int
-  = "stub_eventchn_bind_interdomain"
-external bind_dom_exc_virq : handle -> int = "stub_eventchn_bind_dom_exc_virq"
-external unbind : handle -> int -> unit = "stub_eventchn_unbind"
-external pending : handle -> int = "stub_eventchn_pending"
-external unmask : handle -> int -> unit
-  = "stub_eventchn_unmask"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/eventchn_stubs.c
--- a/tools/ocaml/libs/eventchn/eventchn_stubs.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stdint.h>
-#include <sys/ioctl.h>
-#include <xen/sysctl.h>
-#include <xen/xen.h>
-#include <xen/sys/evtchn.h>
-#include <xenctrl.h>
-
-#define CAML_NAME_SPACE
-#include <caml/mlvalues.h>
-#include <caml/memory.h>
-#include <caml/alloc.h>
-#include <caml/custom.h>
-#include <caml/callback.h>
-#include <caml/fail.h>
-
-#define _H(__h) ((xc_interface *)(__h))
-
-CAMLprim value stub_eventchn_init(void)
-{
-	CAMLparam0();
-	CAMLlocal1(result);
-
-	xc_interface *xce = xc_evtchn_open(NULL, XC_OPENFLAG_NON_REENTRANT);
-	if (xce == NULL)
-		caml_failwith("open failed");
-
-	result = (value)xce;
-	CAMLreturn(result);
-}
-
-CAMLprim value stub_eventchn_fd(value xce)
-{
-	CAMLparam1(xce);
-	CAMLlocal1(result);
-	int fd;
-
-	fd = xc_evtchn_fd(_H(xce));
-	if (fd == -1)
-		caml_failwith("evtchn fd failed");
-
-	result = Val_int(fd);
-
-	CAMLreturn(result);
-}
-
-CAMLprim value stub_eventchn_notify(value xce, value port)
-{
-	CAMLparam2(xce, port);
-	int rc;
-
-	rc = xc_evtchn_notify(_H(xce), Int_val(port));
-	if (rc == -1)
-		caml_failwith("evtchn notify failed");
-
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_eventchn_bind_interdomain(value xce, value domid,
-                                              value remote_port)
-{
-	CAMLparam3(xce, domid, remote_port);
-	CAMLlocal1(port);
-	evtchn_port_or_error_t rc;
-
-	rc = xc_evtchn_bind_interdomain(_H(xce), Int_val(domid), Int_val(remote_port));
-	if (rc == -1)
-		caml_failwith("evtchn bind_interdomain failed");
-	port = Val_int(rc);
-
-	CAMLreturn(port);
-}
-
-CAMLprim value stub_eventchn_bind_dom_exc_virq(value xce)
-{
-	CAMLparam1(xce);
-	CAMLlocal1(port);
-	evtchn_port_or_error_t rc;
-
-	rc = xc_evtchn_bind_virq(_H(xce), VIRQ_DOM_EXC);
-	if (rc == -1)
-		caml_failwith("evtchn bind_dom_exc_virq failed");
-	port = Val_int(rc);
-
-	CAMLreturn(port);
-}
-
-CAMLprim value stub_eventchn_unbind(value xce, value port)
-{
-	CAMLparam2(xce, port);
-	int rc;
-
-	rc = xc_evtchn_unbind(_H(xce), Int_val(port));
-	if (rc == -1)
-		caml_failwith("evtchn unbind failed");
-
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_eventchn_pending(value xce)
-{
-	CAMLparam1(xce);
-	CAMLlocal1(result);
-	evtchn_port_or_error_t port;
-
-	port = xc_evtchn_pending(_H(xce));
-	if (port == -1)
-		caml_failwith("evtchn pending failed");
-	result = Val_int(port);
-
-	CAMLreturn(result);
-}
-
-CAMLprim value stub_eventchn_unmask(value xce, value _port)
-{
-	CAMLparam2(xce, _port);
-	evtchn_port_t port;
-
-	port = Int_val(_port);
-	if (xc_evtchn_unmask(_H(xce), port))
-		caml_failwith("evtchn unmask failed");
-	CAMLreturn(Val_unit);
-}
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/xeneventchn.ml
--- /dev/null
+++ b/tools/ocaml/libs/eventchn/xeneventchn.ml
@@ -0,0 +1,30 @@
+(*
+ * Copyright (C) 2006-2007 XenSource Ltd.
+ * Copyright (C) 2008      Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ *)
+
+exception Error of string
+
+type handle
+
+external init: unit -> handle = "stub_eventchn_init"
+external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
+external notify: handle -> int -> unit = "stub_eventchn_notify"
+external bind_interdomain: handle -> int -> int -> int = "stub_eventchn_bind_interdomain"
+external bind_dom_exc_virq: handle -> int = "stub_eventchn_bind_dom_exc_virq"
+external unbind: handle -> int -> unit = "stub_eventchn_unbind"
+external pending: handle -> int = "stub_eventchn_pending"
+external unmask: handle -> int -> unit = "stub_eventchn_unmask"
+
+let _ = Callback.register_exception "eventchn.error" (Error "register_callback")
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/xeneventchn.mli
--- /dev/null
+++ b/tools/ocaml/libs/eventchn/xeneventchn.mli
@@ -0,0 +1,31 @@
+(*
+ * Copyright (C) 2006-2007 XenSource Ltd.
+ * Copyright (C) 2008      Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ *)
+
+exception Error of string
+
+type handle
+
+external init : unit -> handle = "stub_eventchn_init"
+external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
+
+external notify : handle -> int -> unit = "stub_eventchn_notify"
+external bind_interdomain : handle -> int -> int -> int
+  = "stub_eventchn_bind_interdomain"
+external bind_dom_exc_virq : handle -> int = "stub_eventchn_bind_dom_exc_virq"
+external unbind : handle -> int -> unit = "stub_eventchn_unbind"
+external pending : handle -> int = "stub_eventchn_pending"
+external unmask : handle -> int -> unit
+  = "stub_eventchn_unmask"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/xeneventchn_stubs.c
--- /dev/null
+++ b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2006-2007 XenSource Ltd.
+ * Copyright (C) 2008      Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdint.h>
+#include <sys/ioctl.h>
+#include <xen/sysctl.h>
+#include <xen/xen.h>
+#include <xen/sys/evtchn.h>
+#include <xenctrl.h>
+
+#define CAML_NAME_SPACE
+#include <caml/mlvalues.h>
+#include <caml/memory.h>
+#include <caml/alloc.h>
+#include <caml/custom.h>
+#include <caml/callback.h>
+#include <caml/fail.h>
+
+#define _H(__h) ((xc_interface *)(__h))
+
+CAMLprim value stub_eventchn_init(void)
+{
+	CAMLparam0();
+	CAMLlocal1(result);
+
+	xc_interface *xce = xc_evtchn_open(NULL, XC_OPENFLAG_NON_REENTRANT);
+	if (xce == NULL)
+		caml_failwith("open failed");
+
+	result = (value)xce;
+	CAMLreturn(result);
+}
+
+CAMLprim value stub_eventchn_fd(value xce)
+{
+	CAMLparam1(xce);
+	CAMLlocal1(result);
+	int fd;
+
+	fd = xc_evtchn_fd(_H(xce));
+	if (fd == -1)
+		caml_failwith("evtchn fd failed");
+
+	result = Val_int(fd);
+
+	CAMLreturn(result);
+}
+
+CAMLprim value stub_eventchn_notify(value xce, value port)
+{
+	CAMLparam2(xce, port);
+	int rc;
+
+	rc = xc_evtchn_notify(_H(xce), Int_val(port));
+	if (rc == -1)
+		caml_failwith("evtchn notify failed");
+
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_eventchn_bind_interdomain(value xce, value domid,
+                                              value remote_port)
+{
+	CAMLparam3(xce, domid, remote_port);
+	CAMLlocal1(port);
+	evtchn_port_or_error_t rc;
+
+	rc = xc_evtchn_bind_interdomain(_H(xce), Int_val(domid), Int_val(remote_port));
+	if (rc == -1)
+		caml_failwith("evtchn bind_interdomain failed");
+	port = Val_int(rc);
+
+	CAMLreturn(port);
+}
+
+CAMLprim value stub_eventchn_bind_dom_exc_virq(value xce)
+{
+	CAMLparam1(xce);
+	CAMLlocal1(port);
+	evtchn_port_or_error_t rc;
+
+	rc = xc_evtchn_bind_virq(_H(xce), VIRQ_DOM_EXC);
+	if (rc == -1)
+		caml_failwith("evtchn bind_dom_exc_virq failed");
+	port = Val_int(rc);
+
+	CAMLreturn(port);
+}
+
+CAMLprim value stub_eventchn_unbind(value xce, value port)
+{
+	CAMLparam2(xce, port);
+	int rc;
+
+	rc = xc_evtchn_unbind(_H(xce), Int_val(port));
+	if (rc == -1)
+		caml_failwith("evtchn unbind failed");
+
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_eventchn_pending(value xce)
+{
+	CAMLparam1(xce);
+	CAMLlocal1(result);
+	evtchn_port_or_error_t port;
+
+	port = xc_evtchn_pending(_H(xce));
+	if (port == -1)
+		caml_failwith("evtchn pending failed");
+	result = Val_int(port);
+
+	CAMLreturn(result);
+}
+
+CAMLprim value stub_eventchn_unmask(value xce, value _port)
+{
+	CAMLparam2(xce, _port);
+	evtchn_port_t port;
+
+	port = Int_val(_port);
+	if (xc_evtchn_unmask(_H(xce), port))
+		caml_failwith("evtchn unmask failed");
+	CAMLreturn(Val_unit);
+}
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/META.in
--- a/tools/ocaml/libs/mmap/META.in
+++ b/tools/ocaml/libs/mmap/META.in
@@ -1,4 +1,4 @@
 version = "@VERSION@"
 description = "Mmap interface extension"
-archive(byte) = "mmap.cma"
-archive(native) = "mmap.cmxa"
+archive(byte) = "xenmmap.cma"
+archive(native) = "xenmmap.cmxa"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/Makefile
--- a/tools/ocaml/libs/mmap/Makefile
+++ b/tools/ocaml/libs/mmap/Makefile
@@ -2,9 +2,9 @@
 XEN_ROOT=$(TOPLEVEL)/../..
 include $(TOPLEVEL)/common.make
 
-OBJS = mmap
+OBJS = xenmmap
 INTF = $(foreach obj, $(OBJS),$(obj).cmi)
-LIBS = mmap.cma mmap.cmxa
+LIBS = xenmmap.cma xenmmap.cmxa
 
 all: $(INTF) $(LIBS) $(PROGRAMS)
 
@@ -12,19 +12,19 @@
 
 libs: $(LIBS)
 
-mmap_OBJS = $(OBJS)
-mmap_C_OBJS = mmap_stubs
-OCAML_LIBRARY = mmap
+xenmmap_OBJS = $(OBJS)
+xenmmap_C_OBJS = xenmmap_stubs
+OCAML_LIBRARY = xenmmap
 
 .PHONY: install
 install: $(LIBS) META
 	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) mmap
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore mmap META $(INTF) $(LIBS) *.a *.so *.cmx
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenmmap
+	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenmmap META $(INTF) $(LIBS) *.a *.so *.cmx
 
 .PHONY: uninstall
 uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) mmap
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenmmap
 
 include $(TOPLEVEL)/Makefile.rules
 
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/mmap.ml
--- a/tools/ocaml/libs/mmap/mmap.ml
+++ /dev/null
@@ -1,31 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-type mmap_interface
-
-type mmap_prot_flag = RDONLY | WRONLY | RDWR
-type mmap_map_flag = SHARED | PRIVATE
-
-(* mmap: fd -> prot_flag -> map_flag -> length -> offset -> interface *)
-external mmap: Unix.file_descr -> mmap_prot_flag -> mmap_map_flag
-		-> int -> int -> mmap_interface = "stub_mmap_init"
-external unmap: mmap_interface -> unit = "stub_mmap_final"
-(* read: interface -> start -> length -> data *)
-external read: mmap_interface -> int -> int -> string = "stub_mmap_read"
-(* write: interface -> data -> start -> length -> unit *)
-external write: mmap_interface -> string -> int -> int -> unit = "stub_mmap_write"
-(* getpagesize: unit -> size of page *)
-external getpagesize: unit -> int = "stub_mmap_getpagesize"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/mmap.mli
--- a/tools/ocaml/libs/mmap/mmap.mli
+++ /dev/null
@@ -1,28 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-type mmap_interface
-type mmap_prot_flag = RDONLY | WRONLY | RDWR
-type mmap_map_flag = SHARED | PRIVATE
-
-external mmap : Unix.file_descr -> mmap_prot_flag -> mmap_map_flag -> int -> int
-             -> mmap_interface = "stub_mmap_init"
-external unmap : mmap_interface -> unit = "stub_mmap_final"
-external read : mmap_interface -> int -> int -> string = "stub_mmap_read"
-external write : mmap_interface -> string -> int -> int -> unit
-               = "stub_mmap_write"
-
-external getpagesize : unit -> int = "stub_mmap_getpagesize"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/mmap_stubs.c
--- a/tools/ocaml/libs/mmap/mmap_stubs.c
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/mman.h>
-#include <string.h>
-#include <errno.h>
-#include "mmap_stubs.h"
-
-#include <caml/mlvalues.h>
-#include <caml/memory.h>
-#include <caml/alloc.h>
-#include <caml/custom.h>
-#include <caml/fail.h>
-#include <caml/callback.h>
-
-#define GET_C_STRUCT(a) ((struct mmap_interface *) a)
-
-static int mmap_interface_init(struct mmap_interface *intf,
-                               int fd, int pflag, int mflag,
-                               int len, int offset)
-{
-	intf->len = len;
-	intf->addr = mmap(NULL, len, pflag, mflag, fd, offset);
-	return (intf->addr == MAP_FAILED) ? errno : 0;
-}
-
-CAMLprim value stub_mmap_init(value fd, value pflag, value mflag,
-                              value len, value offset)
-{
-	CAMLparam5(fd, pflag, mflag, len, offset);
-	CAMLlocal1(result);
-	int c_pflag, c_mflag;
-
-	switch (Int_val(pflag)) {
-	case 0: c_pflag = PROT_READ; break;
-	case 1: c_pflag = PROT_WRITE; break;
-	case 2: c_pflag = PROT_READ|PROT_WRITE; break;
-	default: caml_invalid_argument("protectiontype");
-	}
-
-	switch (Int_val(mflag)) {
-	case 0: c_mflag = MAP_SHARED; break;
-	case 1: c_mflag = MAP_PRIVATE; break;
-	default: caml_invalid_argument("maptype");
-	}
-
-	result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
-
-	if (mmap_interface_init(GET_C_STRUCT(result), Int_val(fd),
-	                        c_pflag, c_mflag,
-	                        Int_val(len), Int_val(offset)))
-		caml_failwith("mmap");
-	CAMLreturn(result);
-}
-
-CAMLprim value stub_mmap_final(value interface)
-{
-	CAMLparam1(interface);
-	struct mmap_interface *intf;
-
-	intf = GET_C_STRUCT(interface);
-	if (intf->addr != MAP_FAILED)
-		munmap(intf->addr, intf->len);
-	intf->addr = MAP_FAILED;
-
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_mmap_read(value interface, value start, value len)
-{
-	CAMLparam3(interface, start, len);
-	CAMLlocal1(data);
-	struct mmap_interface *intf;
-	int c_start;
-	int c_len;
-
-	c_start = Int_val(start);
-	c_len = Int_val(len);
-	intf = GET_C_STRUCT(interface);
-
-	if (c_start > intf->len)
-		caml_invalid_argument("start invalid");
-	if (c_start + c_len > intf->len)
-		caml_invalid_argument("len invalid");
-
-	data = caml_alloc_string(c_len);
-	memcpy((char *) data, intf->addr + c_start, c_len);
-
-	CAMLreturn(data);
-}
-
-CAMLprim value stub_mmap_write(value interface, value data,
-                               value start, value len)
-{
-	CAMLparam4(interface, data, start, len);
-	struct mmap_interface *intf;
-	int c_start;
-	int c_len;
-
-	c_start = Int_val(start);
-	c_len = Int_val(len);
-	intf = GET_C_STRUCT(interface);
-
-	if (c_start > intf->len)
-		caml_invalid_argument("start invalid");
-	if (c_start + c_len > intf->len)
-		caml_invalid_argument("len invalid");
-
-	memcpy(intf->addr + c_start, (char *) data, c_len);
-
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_mmap_getpagesize(value unit)
-{
-	CAMLparam1(unit);
-	CAMLlocal1(data);
-
-	data = Val_int(getpagesize());
-	CAMLreturn(data);
-}
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/xenmmap.ml
--- /dev/null
+++ b/tools/ocaml/libs/mmap/xenmmap.ml
@@ -0,0 +1,31 @@
+(*
+ * Copyright (C) 2006-2007 XenSource Ltd.
+ * Copyright (C) 2008      Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ *)
+
+type mmap_interface
+
+type mmap_prot_flag = RDONLY | WRONLY | RDWR
+type mmap_map_flag = SHARED | PRIVATE
+
+(* mmap: fd -> prot_flag -> map_flag -> length -> offset -> interface *)
+external mmap: Unix.file_descr -> mmap_prot_flag -> mmap_map_flag
+		-> int -> int -> mmap_interface = "stub_mmap_init"
+external unmap: mmap_interface -> unit = "stub_mmap_final"
+(* read: interface -> start -> length -> data *)
+external read: mmap_interface -> int -> int -> string = "stub_mmap_read"
+(* write: interface -> data -> start -> length -> unit *)
+external write: mmap_interface -> string -> int -> int -> unit = "stub_mmap_write"
+(* getpagesize: unit -> size of page *)
+external getpagesize: unit -> int = "stub_mmap_getpagesize"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/xenmmap.mli
--- /dev/null
+++ b/tools/ocaml/libs/mmap/xenmmap.mli
@@ -0,0 +1,28 @@
+(*
+ * Copyright (C) 2006-2007 XenSource Ltd.
+ * Copyright (C) 2008      Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ *)
+
+type mmap_interface
+type mmap_prot_flag = RDONLY | WRONLY | RDWR
+type mmap_map_flag = SHARED | PRIVATE
+
+external mmap : Unix.file_descr -> mmap_prot_flag -> mmap_map_flag -> int -> int
+             -> mmap_interface = "stub_mmap_init"
+external unmap : mmap_interface -> unit = "stub_mmap_final"
+external read : mmap_interface -> int -> int -> string = "stub_mmap_read"
+external write : mmap_interface -> string -> int -> int -> unit
+               = "stub_mmap_write"
+
+external getpagesize : unit -> int = "stub_mmap_getpagesize"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/xenmmap_stubs.c
--- /dev/null
+++ b/tools/ocaml/libs/mmap/xenmmap_stubs.c
@@ -0,0 +1,136 @@
+/*
+ * Copyright (C) 2006-2007 XenSource Ltd.
+ * Copyright (C) 2008      Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <string.h>
+#include <errno.h>
+#include "mmap_stubs.h"
+
+#include <caml/mlvalues.h>
+#include <caml/memory.h>
+#include <caml/alloc.h>
+#include <caml/custom.h>
+#include <caml/fail.h>
+#include <caml/callback.h>
+
+#define GET_C_STRUCT(a) ((struct mmap_interface *) a)
+
+static int mmap_interface_init(struct mmap_interface *intf,
+                               int fd, int pflag, int mflag,
+                               int len, int offset)
+{
+	intf->len = len;
+	intf->addr = mmap(NULL, len, pflag, mflag, fd, offset);
+	return (intf->addr == MAP_FAILED) ? errno : 0;
+}
+
+CAMLprim value stub_mmap_init(value fd, value pflag, value mflag,
+                              value len, value offset)
+{
+	CAMLparam5(fd, pflag, mflag, len, offset);
+	CAMLlocal1(result);
+	int c_pflag, c_mflag;
+
+	switch (Int_val(pflag)) {
+	case 0: c_pflag = PROT_READ; break;
+	case 1: c_pflag = PROT_WRITE; break;
+	case 2: c_pflag = PROT_READ|PROT_WRITE; break;
+	default: caml_invalid_argument("protectiontype");
+	}
+
+	switch (Int_val(mflag)) {
+	case 0: c_mflag = MAP_SHARED; break;
+	case 1: c_mflag = MAP_PRIVATE; break;
+	default: caml_invalid_argument("maptype");
+	}
+
+	result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
+
+	if (mmap_interface_init(GET_C_STRUCT(result), Int_val(fd),
+	                        c_pflag, c_mflag,
+	                        Int_val(len), Int_val(offset)))
+		caml_failwith("mmap");
+	CAMLreturn(result);
+}
+
+CAMLprim value stub_mmap_final(value interface)
+{
+	CAMLparam1(interface);
+	struct mmap_interface *intf;
+
+	intf = GET_C_STRUCT(interface);
+	if (intf->addr != MAP_FAILED)
+		munmap(intf->addr, intf->len);
+	intf->addr = MAP_FAILED;
+
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_mmap_read(value interface, value start, value len)
+{
+	CAMLparam3(interface, start, len);
+	CAMLlocal1(data);
+	struct mmap_interface *intf;
+	int c_start;
+	int c_len;
+
+	c_start = Int_val(start);
+	c_len = Int_val(len);
+	intf = GET_C_STRUCT(interface);
+
+	if (c_start > intf->len)
+		caml_invalid_argument("start invalid");
+	if (c_start + c_len > intf->len)
+		caml_invalid_argument("len invalid");
+
+	data = caml_alloc_string(c_len);
+	memcpy((char *) data, intf->addr + c_start, c_len);
+
+	CAMLreturn(data);
+}
+
+CAMLprim value stub_mmap_write(value interface, value data,
+                               value start, value len)
+{
+	CAMLparam4(interface, data, start, len);
+	struct mmap_interface *intf;
+	int c_start;
+	int c_len;
+
+	c_start = Int_val(start);
+	c_len = Int_val(len);
+	intf = GET_C_STRUCT(interface);
+
+	if (c_start > intf->len)
+		caml_invalid_argument("start invalid");
+	if (c_start + c_len > intf->len)
+		caml_invalid_argument("len invalid");
+
+	memcpy(intf->addr + c_start, (char *) data, c_len);
+
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_mmap_getpagesize(value unit)
+{
+	CAMLparam1(unit);
+	CAMLlocal1(data);
+
+	data = Val_int(getpagesize());
+	CAMLreturn(data);
+}
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/META.in
--- a/tools/ocaml/libs/xb/META.in
+++ b/tools/ocaml/libs/xb/META.in
@@ -1,5 +1,5 @@
 version = "@VERSION@"
 description = "XenBus Interface"
-requires = "unix,mmap"
-archive(byte) = "xb.cma"
-archive(native) = "xb.cmxa"
+requires = "unix,xenmmap"
+archive(byte) = "xenbus.cma"
+archive(native) = "xenbus.cmxa"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/Makefile
--- a/tools/ocaml/libs/xb/Makefile
+++ b/tools/ocaml/libs/xb/Makefile
@@ -6,6 +6,7 @@
 CFLAGS += $(CFLAGS_libxenctrl) # For xen_mb()
 CFLAGS += $(CFLAGS_xeninclude)
 OCAMLINCLUDE += -I ../mmap
+OCAMLOPTFLAGS += -for-pack Xenbus
 
 .NOTPARALLEL:
 # Ocaml is such a PITA!
@@ -15,7 +16,7 @@
 PRELIBS = $(foreach obj, $(PREOBJS),$(obj).cmo) $(foreach obj,$(PREOJBS),$(obj).cmx)
 OBJS = op partial packet xs_ring xb
 INTF = op.cmi packet.cmi xb.cmi
-LIBS = xb.cma xb.cmxa
+LIBS = xenbus.cma xenbus.cmxa
 
 ALL_OCAML_OBJS = $(OBJS) $(PREOJBS)
 
@@ -25,22 +26,30 @@
 
 libs: $(LIBS)
 
-xb_OBJS = $(OBJS)
-xb_C_OBJS = xs_ring_stubs xb_stubs
-OCAML_LIBRARY = xb
+xenbus_OBJS = xenbus
+xenbus_C_OBJS = xs_ring_stubs xenbus_stubs
+OCAML_LIBRARY = xenbus
+
+xenbus.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
+	$(E) " CMX       $@"
+	$(OCAMLOPT) -pack -o $@ $^
+
+xenbus.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
+	$(E) " CMO       $@"
+	$(OCAMLC) -pack -o $@ $^
 
 %.mli: %.ml
 	$(E) " MLI       $@"
-	$(Q)$(OCAMLC) -i $< $o
+	$(Q)$(OCAMLC) $(OCAMLINCLUDE) -i $< $o
 
 .PHONY: install
 install: $(LIBS) META
 	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xb
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xb META $(INTF) $(LIBS) *.a *.so *.cmx
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenbus
+	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenbus META $(LIBS) xenbus.cmo xenbus.cmi xenbus.cmx *.a *.so 
 
 .PHONY: uninstall
 uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xb
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenbus
 
 include $(TOPLEVEL)/Makefile.rules
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xb.ml
--- a/tools/ocaml/libs/xb/xb.ml
+++ b/tools/ocaml/libs/xb/xb.ml
@@ -24,7 +24,7 @@
 
 type backend_mmap =
 {
-	mmap: Mmap.mmap_interface;     (* mmaped interface = xs_ring *)
+	mmap: Xenmmap.mmap_interface;     (* mmaped interface = xs_ring *)
 	eventchn_notify: unit -> unit; (* function to notify through eventchn *)
 	mutable work_again: bool;
 }
@@ -34,7 +34,7 @@
 	fd: Unix.file_descr;
 }
 
-type backend = Fd of backend_fd | Mmap of backend_mmap
+type backend = Fd of backend_fd | Xenmmap of backend_mmap
 
 type partial_buf = HaveHdr of Partial.pkt | NoHdr of int * string
 
@@ -68,7 +68,7 @@
 let read con s len =
 	match con.backend with
 	| Fd backfd     -> read_fd backfd con s len
-	| Mmap backmmap -> read_mmap backmmap con s len
+	| Xenmmap backmmap -> read_mmap backmmap con s len
 
 let write_fd back con s len =
 	Unix.write back.fd s 0 len
@@ -82,7 +82,7 @@
 let write con s len =
 	match con.backend with
 	| Fd backfd     -> write_fd backfd con s len
-	| Mmap backmmap -> write_mmap backmmap con s len
+	| Xenmmap backmmap -> write_mmap backmmap con s len
 
 let output con =
 	(* get the output string from a string_of(packet) or partial_out *)
@@ -145,7 +145,7 @@
 let open_fd fd = newcon (Fd { fd = fd; })
 
 let open_mmap mmap notifyfct =
-	newcon (Mmap {
+	newcon (Xenmmap {
 		mmap = mmap;
 		eventchn_notify = notifyfct;
 		work_again = false; })
@@ -153,12 +153,12 @@
 let close con =
 	match con.backend with
 	| Fd backend   -> Unix.close backend.fd
-	| Mmap backend -> Mmap.unmap backend.mmap
+	| Xenmmap backend -> Xenmmap.unmap backend.mmap
 
 let is_fd con =
 	match con.backend with
 	| Fd _   -> true
-	| Mmap _ -> false
+	| Xenmmap _ -> false
 
 let is_mmap con = not (is_fd con)
 
@@ -176,14 +176,14 @@
 let has_more_input con =
 	match con.backend with
 	| Fd _         -> false
-	| Mmap backend -> backend.work_again
+	| Xenmmap backend -> backend.work_again
 
 let is_selectable con =
 	match con.backend with
 	| Fd _   -> true
-	| Mmap _ -> false
+	| Xenmmap _ -> false
 
 let get_fd con =
 	match con.backend with
 	| Fd backend -> backend.fd
-	| Mmap _     -> raise (Failure "get_fd")
+	| Xenmmap _     -> raise (Failure "get_fd")
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xb.mli
--- a/tools/ocaml/libs/xb/xb.mli
+++ b/tools/ocaml/libs/xb/xb.mli
@@ -1,83 +1,103 @@
-module Op:
-sig
-	type operation = Op.operation =
-		| Debug
-		| Directory
-		| Read
-		| Getperms
-		| Watch
-		| Unwatch
-		| Transaction_start
-		| Transaction_end
-		| Introduce
-		| Release
-		| Getdomainpath
-		| Write
-		| Mkdir
-		| Rm
-		| Setperms
-		| Watchevent
-		| Error
-		| Isintroduced
-		| Resume
-		| Set_target
-		| Restrict
-	val to_string : operation -> string
-end
-
-module Packet:
-sig
-	type t
-
-	exception Error of string
-	exception DataError of string
-
-	val create : int -> int -> Op.operation -> string -> t
-	val unpack : t -> int * int * Op.operation * string
-
-	val get_tid : t -> int
-	val get_ty : t -> Op.operation
-	val get_data : t -> string
-	val get_rid: t -> int
-end
-
+module Op :
+  sig
+    type operation =
+      Op.operation =
+        Debug
+      | Directory
+      | Read
+      | Getperms
+      | Watch
+      | Unwatch
+      | Transaction_start
+      | Transaction_end
+      | Introduce
+      | Release
+      | Getdomainpath
+      | Write
+      | Mkdir
+      | Rm
+      | Setperms
+      | Watchevent
+      | Error
+      | Isintroduced
+      | Resume
+      | Set_target
+      | Restrict
+    val operation_c_mapping : operation array
+    val size : int
+    val offset_pq : int
+    val operation_c_mapping_pq : 'a array
+    val size_pq : int
+    val array_search : 'a -> 'a array -> int
+    val of_cval : int -> operation
+    val to_cval : operation -> int
+    val to_string : operation -> string
+  end
+module Packet :
+  sig
+    type t =
+      Packet.t = {
+      tid : int;
+      rid : int;
+      ty : Op.operation;
+      data : string;
+    }
+    exception Error of string
+    exception DataError of string
+    external string_of_header : int -> int -> int -> int -> string
+      = "stub_string_of_header"
+    val create : int -> int -> Op.operation -> string -> t
+    val of_partialpkt : Partial.pkt -> t
+    val to_string : t -> string
+    val unpack : t -> int * int * Op.operation * string
+    val get_tid : t -> int
+    val get_ty : t -> Op.operation
+    val get_data : t -> string
+    val get_rid : t -> int
+  end
 exception End_of_file
 exception Eagain
 exception Noent
 exception Invalid
-
-type t
-
-(** queue a packet into the output queue for later sending *)
+type backend_mmap = {
+  mmap : Xenmmap.mmap_interface;
+  eventchn_notify : unit -> unit;
+  mutable work_again : bool;
+}
+type backend_fd = { fd : Unix.file_descr; }
+type backend = Fd of backend_fd | Xenmmap of backend_mmap
+type partial_buf = HaveHdr of Partial.pkt | NoHdr of int * string
+type t = {
+  backend : backend;
+  pkt_in : Packet.t Queue.t;
+  pkt_out : Packet.t Queue.t;
+  mutable partial_in : partial_buf;
+  mutable partial_out : string;
+}
+val init_partial_in : unit -> partial_buf
 val queue : t -> Packet.t -> unit
-
-(** process the output queue, return if a packet has been totally sent *)
+val read_fd : backend_fd -> 'a -> string -> int -> int
+val read_mmap : backend_mmap -> 'a -> string -> int -> int
+val read : t -> string -> int -> int
+val write_fd : backend_fd -> 'a -> string -> int -> int
+val write_mmap : backend_mmap -> 'a -> string -> int -> int
+val write : t -> string -> int -> int
 val output : t -> bool
-
-(** process the input queue, return if a packet has been totally received *)
 val input : t -> bool
-
-(** create new connection using a fd interface *)
+val newcon : backend -> t
 val open_fd : Unix.file_descr -> t
-(** create new connection using a mmap intf and a function to notify eventchn *)
-val open_mmap : Mmap.mmap_interface -> (unit -> unit) -> t
-
-(* close a connection *)
+val open_mmap : Xenmmap.mmap_interface -> (unit -> unit) -> t
 val close : t -> unit
-
 val is_fd : t -> bool
 val is_mmap : t -> bool
-
 val output_len : t -> int
 val has_new_output : t -> bool
 val has_old_output : t -> bool
 val has_output : t -> bool
 val peek_output : t -> Packet.t
-
 val input_len : t -> int
 val has_in_packet : t -> bool
 val get_in_packet : t -> Packet.t
 val has_more_input : t -> bool
-
 val is_selectable : t -> bool
 val get_fd : t -> Unix.file_descr
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xb_stubs.c
--- a/tools/ocaml/libs/xb/xb_stubs.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- */
-
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/mman.h>
-#include <string.h>
-#include <errno.h>
-
-#include <caml/mlvalues.h>
-#include <caml/memory.h>
-#include <caml/alloc.h>
-#include <caml/custom.h>
-#include <caml/fail.h>
-#include <caml/callback.h>
-
-#include <xenctrl.h>
-#include <xen/io/xs_wire.h>
-
-CAMLprim value stub_header_size(void)
-{
-	CAMLparam0();
-	CAMLreturn(Val_int(sizeof(struct xsd_sockmsg)));
-}
-
-CAMLprim value stub_header_of_string(value s)
-{
-	CAMLparam1(s);
-	CAMLlocal1(ret);
-	struct xsd_sockmsg *hdr;
-
-	if (caml_string_length(s) != sizeof(struct xsd_sockmsg))
-		caml_failwith("xb header incomplete");
-	ret = caml_alloc_tuple(4);
-	hdr = (struct xsd_sockmsg *) String_val(s);
-	Store_field(ret, 0, Val_int(hdr->tx_id));
-	Store_field(ret, 1, Val_int(hdr->req_id));
-	Store_field(ret, 2, Val_int(hdr->type));
-	Store_field(ret, 3, Val_int(hdr->len));
-	CAMLreturn(ret);
-}
-
-CAMLprim value stub_string_of_header(value tid, value rid, value ty, value len)
-{
-	CAMLparam4(tid, rid, ty, len);
-	CAMLlocal1(ret);
-	struct xsd_sockmsg xsd = {
-		.type = Int_val(ty),
-		.tx_id = Int_val(tid),
-		.req_id = Int_val(rid),
-		.len = Int_val(len),
-	};
-
-	ret = caml_alloc_string(sizeof(struct xsd_sockmsg));
-	memcpy(String_val(ret), &xsd, sizeof(struct xsd_sockmsg));
-
-	CAMLreturn(ret);
-}
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xenbus_stubs.c
--- /dev/null
+++ b/tools/ocaml/libs/xb/xenbus_stubs.c
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2006-2007 XenSource Ltd.
+ * Copyright (C) 2008      Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <string.h>
+#include <errno.h>
+
+#include <caml/mlvalues.h>
+#include <caml/memory.h>
+#include <caml/alloc.h>
+#include <caml/custom.h>
+#include <caml/fail.h>
+#include <caml/callback.h>
+
+#include <xenctrl.h>
+#include <xen/io/xs_wire.h>
+
+CAMLprim value stub_header_size(void)
+{
+	CAMLparam0();
+	CAMLreturn(Val_int(sizeof(struct xsd_sockmsg)));
+}
+
+CAMLprim value stub_header_of_string(value s)
+{
+	CAMLparam1(s);
+	CAMLlocal1(ret);
+	struct xsd_sockmsg *hdr;
+
+	if (caml_string_length(s) != sizeof(struct xsd_sockmsg))
+		caml_failwith("xb header incomplete");
+	ret = caml_alloc_tuple(4);
+	hdr = (struct xsd_sockmsg *) String_val(s);
+	Store_field(ret, 0, Val_int(hdr->tx_id));
+	Store_field(ret, 1, Val_int(hdr->req_id));
+	Store_field(ret, 2, Val_int(hdr->type));
+	Store_field(ret, 3, Val_int(hdr->len));
+	CAMLreturn(ret);
+}
+
+CAMLprim value stub_string_of_header(value tid, value rid, value ty, value len)
+{
+	CAMLparam4(tid, rid, ty, len);
+	CAMLlocal1(ret);
+	struct xsd_sockmsg xsd = {
+		.type = Int_val(ty),
+		.tx_id = Int_val(tid),
+		.req_id = Int_val(rid),
+		.len = Int_val(len),
+	};
+
+	ret = caml_alloc_string(sizeof(struct xsd_sockmsg));
+	memcpy(String_val(ret), &xsd, sizeof(struct xsd_sockmsg));
+
+	CAMLreturn(ret);
+}
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xs_ring.ml
--- a/tools/ocaml/libs/xb/xs_ring.ml
+++ b/tools/ocaml/libs/xb/xs_ring.ml
@@ -14,5 +14,5 @@
  * GNU Lesser General Public License for more details.
  *)
 
-external read: Mmap.mmap_interface -> string -> int -> int = "ml_interface_read"
-external write: Mmap.mmap_interface -> string -> int -> int = "ml_interface_write"
+external read: Xenmmap.mmap_interface -> string -> int -> int = "ml_interface_read"
+external write: Xenmmap.mmap_interface -> string -> int -> int = "ml_interface_write"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/META.in
--- a/tools/ocaml/libs/xc/META.in
+++ b/tools/ocaml/libs/xc/META.in
@@ -1,5 +1,5 @@
 version = "@VERSION@"
 description = "Xen Control Interface"
-requires = "mmap,uuid"
-archive(byte) = "xc.cma"
-archive(native) = "xc.cmxa"
+requires = "xenmmap,uuid"
+archive(byte) = "xenctrl.cma"
+archive(native) = "xenctrl.cmxa"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/Makefile
--- a/tools/ocaml/libs/xc/Makefile
+++ b/tools/ocaml/libs/xc/Makefile
@@ -5,16 +5,16 @@
 CFLAGS += -I../mmap $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest)
 OCAMLINCLUDE += -I ../mmap -I ../uuid
 
-OBJS = xc
-INTF = xc.cmi
-LIBS = xc.cma xc.cmxa
+OBJS = xenctrl
+INTF = xenctrl.cmi
+LIBS = xenctrl.cma xenctrl.cmxa
 
-LIBS_xc = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest)
+LIBS_xenctrl = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest)
 
-xc_OBJS = $(OBJS)
-xc_C_OBJS = xc_stubs
+xenctrl_OBJS = $(OBJS)
+xenctrl_C_OBJS = xenctrl_stubs
 
-OCAML_LIBRARY = xc
+OCAML_LIBRARY = xenctrl
 
 all: $(INTF) $(LIBS)
 
@@ -23,11 +23,11 @@
 .PHONY: install
 install: $(LIBS) META
 	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xc
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xc META $(INTF) $(LIBS) *.a *.so *.cmx
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenctrl
+	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenctrl META $(INTF) $(LIBS) *.a *.so *.cmx
 
 .PHONY: uninstall
 uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xc
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenctrl
 
 include $(TOPLEVEL)/Makefile.rules
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xc.ml
--- a/tools/ocaml/libs/xc/xc.ml
+++ /dev/null
@@ -1,326 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-(** *)
-type domid = int
-
-(* ** xenctrl.h ** *)
-
-type vcpuinfo =
-{
-	online: bool;
-	blocked: bool;
-	running: bool;
-	cputime: int64;
-	cpumap: int32;
-}
-
-type domaininfo =
-{
-	domid             : domid;
-	dying             : bool;
-	shutdown          : bool;
-	paused            : bool;
-	blocked           : bool;
-	running           : bool;
-	hvm_guest         : bool;
-	shutdown_code     : int;
-	total_memory_pages: nativeint;
-	max_memory_pages  : nativeint;
-	shared_info_frame : int64;
-	cpu_time          : int64;
-	nr_online_vcpus   : int;
-	max_vcpu_id       : int;
-	ssidref           : int32;
-	handle            : int array;
-}
-
-type sched_control =
-{
-	weight : int;
-	cap    : int;
-}
-
-type physinfo_cap_flag =
-	| CAP_HVM
-	| CAP_DirectIO
-
-type physinfo =
-{
-	threads_per_core : int;
-	cores_per_socket : int;
-	nr_cpus          : int;
-	max_node_id      : int;
-	cpu_khz          : int;
-	total_pages      : nativeint;
-	free_pages       : nativeint;
-	scrub_pages      : nativeint;
-	(* XXX hw_cap *)
-	capabilities     : physinfo_cap_flag list;
-}
-
-type version =
-{
-	major : int;
-	minor : int;
-	extra : string;
-}
-
-
-type compile_info =
-{
-	compiler : string;
-	compile_by : string;
-	compile_domain : string;
-	compile_date : string;
-}
-
-type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
-
-type domain_create_flag = CDF_HVM | CDF_HAP
-
-exception Error of string
-
-type handle
-
-(* this is only use by coredumping *)
-external sizeof_core_header: unit -> int
-       = "stub_sizeof_core_header"
-external sizeof_vcpu_guest_context: unit -> int
-       = "stub_sizeof_vcpu_guest_context"
-external sizeof_xen_pfn: unit -> int = "stub_sizeof_xen_pfn"
-(* end of use *)
-
-external interface_open: unit -> handle = "stub_xc_interface_open"
-external interface_close: handle -> unit = "stub_xc_interface_close"
-
-external is_fake: unit -> bool = "stub_xc_interface_is_fake"
-
-let with_intf f =
-	let xc = interface_open () in
-	let r = try f xc with exn -> interface_close xc; raise exn in
-	interface_close xc;
-	r
-
-external _domain_create: handle -> int32 -> domain_create_flag list -> int array -> domid
-       = "stub_xc_domain_create"
-
-let domain_create handle n flags uuid =
-	_domain_create handle n flags (Uuid.int_array_of_uuid uuid)
-
-external _domain_sethandle: handle -> domid -> int array -> unit
-                          = "stub_xc_domain_sethandle"
-
-let domain_sethandle handle n uuid =
-	_domain_sethandle handle n (Uuid.int_array_of_uuid uuid)
-
-external domain_max_vcpus: handle -> domid -> int -> unit
-       = "stub_xc_domain_max_vcpus"
-
-external domain_pause: handle -> domid -> unit = "stub_xc_domain_pause"
-external domain_unpause: handle -> domid -> unit = "stub_xc_domain_unpause"
-external domain_resume_fast: handle -> domid -> unit = "stub_xc_domain_resume_fast"
-external domain_destroy: handle -> domid -> unit = "stub_xc_domain_destroy"
-
-external domain_shutdown: handle -> domid -> shutdown_reason -> unit
-       = "stub_xc_domain_shutdown"
-
-external _domain_getinfolist: handle -> domid -> int -> domaininfo list
-       = "stub_xc_domain_getinfolist"
-
-let domain_getinfolist handle first_domain =
-	let nb = 2 in
-	let last_domid l = (List.hd l).domid + 1 in
-	let rec __getlist from =
-		let l = _domain_getinfolist handle from nb in
-		(if List.length l = nb then __getlist (last_domid l) else []) @ l
-		in
-	List.rev (__getlist first_domain)
-
-external domain_getinfo: handle -> domid -> domaininfo= "stub_xc_domain_getinfo"
-
-external domain_get_vcpuinfo: handle -> int -> int -> vcpuinfo
-       = "stub_xc_vcpu_getinfo"
-
-external domain_ioport_permission: handle -> domid -> int -> int -> bool -> unit
-       = "stub_xc_domain_ioport_permission"
-external domain_iomem_permission: handle -> domid -> nativeint -> nativeint -> bool -> unit
-       = "stub_xc_domain_iomem_permission"
-external domain_irq_permission: handle -> domid -> int -> bool -> unit
-       = "stub_xc_domain_irq_permission"
-
-external vcpu_affinity_set: handle -> domid -> int -> bool array -> unit
-       = "stub_xc_vcpu_setaffinity"
-external vcpu_affinity_get: handle -> domid -> int -> bool array
-       = "stub_xc_vcpu_getaffinity"
-
-external vcpu_context_get: handle -> domid -> int -> string
-       = "stub_xc_vcpu_context_get"
-
-external sched_id: handle -> int = "stub_xc_sched_id"
-
-external sched_credit_domain_set: handle -> domid -> sched_control -> unit
-       = "stub_sched_credit_domain_set"
-external sched_credit_domain_get: handle -> domid -> sched_control
-       = "stub_sched_credit_domain_get"
-
-external shadow_allocation_set: handle -> domid -> int -> unit
-       = "stub_shadow_allocation_set"
-external shadow_allocation_get: handle -> domid -> int
-       = "stub_shadow_allocation_get"
-
-external evtchn_alloc_unbound: handle -> domid -> domid -> int
-       = "stub_xc_evtchn_alloc_unbound"
-external evtchn_reset: handle -> domid -> unit = "stub_xc_evtchn_reset"
-
-external readconsolering: handle -> string = "stub_xc_readconsolering"
-
-external send_debug_keys: handle -> string -> unit = "stub_xc_send_debug_keys"
-external physinfo: handle -> physinfo = "stub_xc_physinfo"
-external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
-
-external domain_setmaxmem: handle -> domid -> int64 -> unit
-       = "stub_xc_domain_setmaxmem"
-external domain_set_memmap_limit: handle -> domid -> int64 -> unit
-       = "stub_xc_domain_set_memmap_limit"
-external domain_memory_increase_reservation: handle -> domid -> int64 -> unit
-       = "stub_xc_domain_memory_increase_reservation"
-
-external domain_set_machine_address_size: handle -> domid -> int -> unit
-       = "stub_xc_domain_set_machine_address_size"
-external domain_get_machine_address_size: handle -> domid -> int
-       = "stub_xc_domain_get_machine_address_size"
-
-external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
-                        -> string option array
-                        -> string option array
-       = "stub_xc_domain_cpuid_set"
-external domain_cpuid_apply_policy: handle -> domid -> unit
-       = "stub_xc_domain_cpuid_apply_policy"
-external cpuid_check: handle -> (int64 * (int64 option)) -> string option array -> (bool * string option array)
-       = "stub_xc_cpuid_check"
-
-external map_foreign_range: handle -> domid -> int
-                         -> nativeint -> Mmap.mmap_interface
-       = "stub_map_foreign_range"
-
-external domain_get_pfn_list: handle -> domid -> nativeint -> nativeint array
-       = "stub_xc_domain_get_pfn_list"
-
-external domain_assign_device: handle -> domid -> (int * int * int * int) -> unit
-       = "stub_xc_domain_assign_device"
-external domain_deassign_device: handle -> domid -> (int * int * int * int) -> unit
-       = "stub_xc_domain_deassign_device"
-external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool
-       = "stub_xc_domain_test_assign_device"
-
-external version: handle -> version = "stub_xc_version_version"
-external version_compile_info: handle -> compile_info
-       = "stub_xc_version_compile_info"
-external version_changeset: handle -> string = "stub_xc_version_changeset"
-external version_capabilities: handle -> string =
-  "stub_xc_version_capabilities"
-
-external watchdog : handle -> int -> int32 -> int
-  = "stub_xc_watchdog"
-
-(* core dump structure *)
-type core_magic = Magic_hvm | Magic_pv
-
-type core_header = {
-	xch_magic: core_magic;
-	xch_nr_vcpus: int;
-	xch_nr_pages: nativeint;
-	xch_index_offset: int64;
-	xch_ctxt_offset: int64;
-	xch_pages_offset: int64;
-}
-
-external marshall_core_header: core_header -> string = "stub_marshall_core_header"
-
-(* coredump *)
-let coredump xch domid fd =
-	let dump s =
-		let wd = Unix.write fd s 0 (String.length s) in
-		if wd <> String.length s then
-			failwith "error while writing";
-		in
-
-	let info = domain_getinfo xch domid in
-
-	let nrpages = info.total_memory_pages in
-	let ctxt = Array.make info.max_vcpu_id None in
-	let nr_vcpus = ref 0 in
-	for i = 0 to info.max_vcpu_id - 1
-	do
-		ctxt.(i) <- try
-			let v = vcpu_context_get xch domid i in
-			incr nr_vcpus;
-			Some v
-			with _ -> None
-	done;
-
-	(* FIXME page offset if not rounded to sup *)
-	let page_offset =
-		Int64.add
-			(Int64.of_int (sizeof_core_header () +
-			 (sizeof_vcpu_guest_context () * !nr_vcpus)))
-			(Int64.of_nativeint (
-				Nativeint.mul
-					(Nativeint.of_int (sizeof_xen_pfn ()))
-					nrpages)
-				)
-		in
-
-	let header = {
-		xch_magic = if info.hvm_guest then Magic_hvm else Magic_pv;
-		xch_nr_vcpus = !nr_vcpus;
-		xch_nr_pages = nrpages;
-		xch_ctxt_offset = Int64.of_int (sizeof_core_header ());
-		xch_index_offset = Int64.of_int (sizeof_core_header ()
-					+ sizeof_vcpu_guest_context ());
-		xch_pages_offset = page_offset;
-	} in
-
-	dump (marshall_core_header header);
-	for i = 0 to info.max_vcpu_id - 1
-	do
-		match ctxt.(i) with
-		| None -> ()
-		| Some ctxt_i -> dump ctxt_i
-	done;
-	let pfns = domain_get_pfn_list xch domid nrpages in
-	if Array.length pfns <> Nativeint.to_int nrpages then
-		failwith "could not get the page frame list";
-
-	let page_size = Mmap.getpagesize () in
-	for i = 0 to Nativeint.to_int nrpages - 1
-	do
-		let page = map_foreign_range xch domid page_size pfns.(i) in
-		let data = Mmap.read page 0 page_size in
-		Mmap.unmap page;
-		dump data
-	done
-
-(* ** Misc ** *)
-
-(**
-   Convert the given number of pages to an amount in KiB, rounded up.
- *)
-external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
-let pages_to_mib pages = Int64.div (pages_to_kib pages) 1024L
-
-let _ = Callback.register_exception "xc.error" (Error "register_callback")
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xc.mli
--- a/tools/ocaml/libs/xc/xc.mli
+++ /dev/null
@@ -1,184 +0,0 @@
-(*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-type domid = int
-type vcpuinfo = {
-  online : bool;
-  blocked : bool;
-  running : bool;
-  cputime : int64;
-  cpumap : int32;
-}
-type domaininfo = {
-  domid : domid;
-  dying : bool;
-  shutdown : bool;
-  paused : bool;
-  blocked : bool;
-  running : bool;
-  hvm_guest : bool;
-  shutdown_code : int;
-  total_memory_pages : nativeint;
-  max_memory_pages : nativeint;
-  shared_info_frame : int64;
-  cpu_time : int64;
-  nr_online_vcpus : int;
-  max_vcpu_id : int;
-  ssidref : int32;
-  handle : int array;
-}
-type sched_control = { weight : int; cap : int; }
-type physinfo_cap_flag = CAP_HVM | CAP_DirectIO
-type physinfo = {
-  threads_per_core : int;
-  cores_per_socket : int;
-  nr_cpus          : int;
-  max_node_id      : int;
-  cpu_khz          : int;
-  total_pages      : nativeint;
-  free_pages       : nativeint;
-  scrub_pages      : nativeint;
-  capabilities     : physinfo_cap_flag list;
-}
-type version = { major : int; minor : int; extra : string; }
-type compile_info = {
-  compiler : string;
-  compile_by : string;
-  compile_domain : string;
-  compile_date : string;
-}
-type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
-
-type domain_create_flag = CDF_HVM | CDF_HAP
-
-exception Error of string
-type handle
-external sizeof_core_header : unit -> int = "stub_sizeof_core_header"
-external sizeof_vcpu_guest_context : unit -> int
-  = "stub_sizeof_vcpu_guest_context"
-external sizeof_xen_pfn : unit -> int = "stub_sizeof_xen_pfn"
-external interface_open : unit -> handle = "stub_xc_interface_open"
-external is_fake : unit -> bool = "stub_xc_interface_is_fake"
-external interface_close : handle -> unit = "stub_xc_interface_close"
-val with_intf : (handle -> 'a) -> 'a
-external _domain_create : handle -> int32 -> domain_create_flag list -> int array -> domid
-  = "stub_xc_domain_create"
-val domain_create : handle -> int32 -> domain_create_flag list -> 'a Uuid.t -> domid
-external _domain_sethandle : handle -> domid -> int array -> unit
-  = "stub_xc_domain_sethandle"
-val domain_sethandle : handle -> domid -> 'a Uuid.t -> unit
-external domain_max_vcpus : handle -> domid -> int -> unit
-  = "stub_xc_domain_max_vcpus"
-external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause"
-external domain_unpause : handle -> domid -> unit = "stub_xc_domain_unpause"
-external domain_resume_fast : handle -> domid -> unit
-  = "stub_xc_domain_resume_fast"
-external domain_destroy : handle -> domid -> unit = "stub_xc_domain_destroy"
-external domain_shutdown : handle -> domid -> shutdown_reason -> unit
-  = "stub_xc_domain_shutdown"
-external _domain_getinfolist : handle -> domid -> int -> domaininfo list
-  = "stub_xc_domain_getinfolist"
-val domain_getinfolist : handle -> domid -> domaininfo list
-external domain_getinfo : handle -> domid -> domaininfo
-  = "stub_xc_domain_getinfo"
-external domain_get_vcpuinfo : handle -> int -> int -> vcpuinfo
-  = "stub_xc_vcpu_getinfo"
-external domain_ioport_permission: handle -> domid -> int -> int -> bool -> unit
-       = "stub_xc_domain_ioport_permission"
-external domain_iomem_permission: handle -> domid -> nativeint -> nativeint -> bool -> unit
-       = "stub_xc_domain_iomem_permission"
-external domain_irq_permission: handle -> domid -> int -> bool -> unit
-       = "stub_xc_domain_irq_permission"
-external vcpu_affinity_set : handle -> domid -> int -> bool array -> unit
-  = "stub_xc_vcpu_setaffinity"
-external vcpu_affinity_get : handle -> domid -> int -> bool array
-  = "stub_xc_vcpu_getaffinity"
-external vcpu_context_get : handle -> domid -> int -> string
-  = "stub_xc_vcpu_context_get"
-external sched_id : handle -> int = "stub_xc_sched_id"
-external sched_credit_domain_set : handle -> domid -> sched_control -> unit
-  = "stub_sched_credit_domain_set"
-external sched_credit_domain_get : handle -> domid -> sched_control
-  = "stub_sched_credit_domain_get"
-external shadow_allocation_set : handle -> domid -> int -> unit
-  = "stub_shadow_allocation_set"
-external shadow_allocation_get : handle -> domid -> int
-  = "stub_shadow_allocation_get"
-external evtchn_alloc_unbound : handle -> domid -> domid -> int
-  = "stub_xc_evtchn_alloc_unbound"
-external evtchn_reset : handle -> domid -> unit = "stub_xc_evtchn_reset"
-external readconsolering : handle -> string = "stub_xc_readconsolering"
-external send_debug_keys : handle -> string -> unit = "stub_xc_send_debug_keys"
-external physinfo : handle -> physinfo = "stub_xc_physinfo"
-external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
-external domain_setmaxmem : handle -> domid -> int64 -> unit
-  = "stub_xc_domain_setmaxmem"
-external domain_set_memmap_limit : handle -> domid -> int64 -> unit
-  = "stub_xc_domain_set_memmap_limit"
-external domain_memory_increase_reservation :
-  handle -> domid -> int64 -> unit
-  = "stub_xc_domain_memory_increase_reservation"
-external map_foreign_range :
-  handle -> domid -> int -> nativeint -> Mmap.mmap_interface
-  = "stub_map_foreign_range"
-external domain_get_pfn_list :
-  handle -> domid -> nativeint -> nativeint array
-  = "stub_xc_domain_get_pfn_list"
-
-external domain_assign_device: handle -> domid -> (int * int * int * int) -> unit
-       = "stub_xc_domain_assign_device"
-external domain_deassign_device: handle -> domid -> (int * int * int * int) -> unit
-       = "stub_xc_domain_deassign_device"
-external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool
-       = "stub_xc_domain_test_assign_device"
-
-external version : handle -> version = "stub_xc_version_version"
-external version_compile_info : handle -> compile_info
-  = "stub_xc_version_compile_info"
-external version_changeset : handle -> string = "stub_xc_version_changeset"
-external version_capabilities : handle -> string
-  = "stub_xc_version_capabilities"
-type core_magic = Magic_hvm | Magic_pv
-type core_header = {
-  xch_magic : core_magic;
-  xch_nr_vcpus : int;
-  xch_nr_pages : nativeint;
-  xch_index_offset : int64;
-  xch_ctxt_offset : int64;
-  xch_pages_offset : int64;
-}
-external marshall_core_header : core_header -> string
-  = "stub_marshall_core_header"
-val coredump : handle -> domid -> Unix.file_descr -> unit
-external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
-val pages_to_mib : int64 -> int64
-external watchdog : handle -> int -> int32 -> int
-  = "stub_xc_watchdog"
-
-external domain_set_machine_address_size: handle -> domid -> int -> unit
-  = "stub_xc_domain_set_machine_address_size"
-external domain_get_machine_address_size: handle -> domid -> int
-       = "stub_xc_domain_get_machine_address_size"
-
-external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
-                        -> string option array
-                        -> string option array
-       = "stub_xc_domain_cpuid_set"
-external domain_cpuid_apply_policy: handle -> domid -> unit
-       = "stub_xc_domain_cpuid_apply_policy"
-external cpuid_check: handle -> (int64 * (int64 option)) -> string option array -> (bool * string option array)
-       = "stub_xc_cpuid_check"
-
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xc_stubs.c
--- a/tools/ocaml/libs/xc/xc_stubs.c
+++ /dev/null
@@ -1,1161 +0,0 @@
-/*
- * Copyright (C) 2006-2007 XenSource Ltd.
- * Copyright (C) 2008      Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- */
-
-#define _XOPEN_SOURCE 600
-#include <stdlib.h>
-#include <errno.h>
-
-#define CAML_NAME_SPACE
-#include <caml/alloc.h>
-#include <caml/memory.h>
-#include <caml/signals.h>
-#include <caml/fail.h>
-#include <caml/callback.h>
-
-#include <sys/mman.h>
-#include <stdint.h>
-#include <string.h>
-
-#include <xenctrl.h>
-
-#include "mmap_stubs.h"
-
-#define PAGE_SHIFT		12
-#define PAGE_SIZE               (1UL << PAGE_SHIFT)
-#define PAGE_MASK               (~(PAGE_SIZE-1))
-
-#define _H(__h) ((xc_interface *)(__h))
-#define _D(__d) ((uint32_t)Int_val(__d))
-
-#define Val_none (Val_int(0))
-
-#define string_of_option_array(array, index) \
-	((Field(array, index) == Val_none) ? NULL : String_val(Field(Field(array, index), 0)))
-
-/* maybe here we should check the range of the input instead of blindly
- * casting it to uint32 */
-#define cpuid_input_of_val(i1, i2, input) \
-	i1 = (uint32_t) Int64_val(Field(input, 0)); \
-	i2 = ((Field(input, 1) == Val_none) ? 0xffffffff : (uint32_t) Int64_val(Field(Field(input, 1), 0)));
-
-#define ERROR_STRLEN 1024
-void failwith_xc(xc_interface *xch)
-{
-	static char error_str[ERROR_STRLEN];
-	if (xch) {
-		const xc_error *error = xc_get_last_error(xch);
-		if (error->code == XC_ERROR_NONE)
-                	snprintf(error_str, ERROR_STRLEN, "%d: %s", errno, strerror(errno));
-		else
-			snprintf(error_str, ERROR_STRLEN, "%d: %s: %s",
-				 error->code,
-				 xc_error_code_to_desc(error->code),
-				 error->message);
-	} else {
-		snprintf(error_str, ERROR_STRLEN, "Unable to open XC interface");
-	}
-	caml_raise_with_string(*caml_named_value("xc.error"), error_str);
-}
-
-CAMLprim value stub_sizeof_core_header(value unit)
-{
-	CAMLparam1(unit);
-	CAMLreturn(Val_int(sizeof(struct xc_core_header)));
-}
-
-CAMLprim value stub_sizeof_vcpu_guest_context(value unit)
-{
-	CAMLparam1(unit);
-	CAMLreturn(Val_int(sizeof(struct vcpu_guest_context)));
-}
-
-CAMLprim value stub_sizeof_xen_pfn(value unit)
-{
-	CAMLparam1(unit);
-	CAMLreturn(Val_int(sizeof(xen_pfn_t)));
-}
-
-#define XC_CORE_MAGIC     0xF00FEBED
-#define XC_CORE_MAGIC_HVM 0xF00FEBEE
-
-CAMLprim value stub_marshall_core_header(value header)
-{
-	CAMLparam1(header);
-	CAMLlocal1(s);
-	struct xc_core_header c_header;
-
-	c_header.xch_magic = (Field(header, 0))
-		? XC_CORE_MAGIC
-		: XC_CORE_MAGIC_HVM;
-	c_header.xch_nr_vcpus = Int_val(Field(header, 1));
-	c_header.xch_nr_pages = Nativeint_val(Field(header, 2));
-	c_header.xch_ctxt_offset = Int64_val(Field(header, 3));
-	c_header.xch_index_offset = Int64_val(Field(header, 4));
-	c_header.xch_pages_offset = Int64_val(Field(header, 5));
-
-	s = caml_alloc_string(sizeof(c_header));
-	memcpy(String_val(s), (char *) &c_header, sizeof(c_header));
-	CAMLreturn(s);
-}
-
-CAMLprim value stub_xc_interface_open(void)
-{
-	CAMLparam0();
-        xc_interface *xch;
-        xch = xc_interface_open(NULL, NULL, XC_OPENFLAG_NON_REENTRANT);
-        if (xch == NULL)
-		failwith_xc(NULL);
-        CAMLreturn((value)xch);
-}
-
-
-CAMLprim value stub_xc_interface_is_fake(void)
-{
-	CAMLparam0();
-	int is_fake = xc_interface_is_fake();
-	CAMLreturn(Val_int(is_fake));
-}
-
-CAMLprim value stub_xc_interface_close(value xch)
-{
-	CAMLparam1(xch);
-
-	// caml_enter_blocking_section();
-	xc_interface_close(_H(xch));
-	// caml_leave_blocking_section();
-
-	CAMLreturn(Val_unit);
-}
-
-static int domain_create_flag_table[] = {
-	XEN_DOMCTL_CDF_hvm_guest,
-	XEN_DOMCTL_CDF_hap,
-};
-
-CAMLprim value stub_xc_domain_create(value xch, value ssidref,
-                                     value flags, value handle)
-{
-	CAMLparam4(xch, ssidref, flags, handle);
-
-	uint32_t domid = 0;
-	xen_domain_handle_t h = { 0 };
-	int result;
-	int i;
-	uint32_t c_ssidref = Int32_val(ssidref);
-	unsigned int c_flags = 0;
-	value l;
-
-        if (Wosize_val(handle) != 16)
-		caml_invalid_argument("Handle not a 16-integer array");
-
-	for (i = 0; i < sizeof(h); i++) {
-		h[i] = Int_val(Field(handle, i)) & 0xff;
-	}
-
-	for (l = flags; l != Val_none; l = Field(l, 1)) {
-		int v = Int_val(Field(l, 0));
-		c_flags |= domain_create_flag_table[v];
-	}
-
-	// caml_enter_blocking_section();
-	result = xc_domain_create(_H(xch), c_ssidref, h, c_flags, &domid);
-	// caml_leave_blocking_section();
-
-	if (result < 0)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(Val_int(domid));
-}
-
-CAMLprim value stub_xc_domain_max_vcpus(value xch, value domid,
-                                        value max_vcpus)
-{
-	CAMLparam3(xch, domid, max_vcpus);
-	int r;
-
-	r = xc_domain_max_vcpus(_H(xch), _D(domid), Int_val(max_vcpus));
-	if (r)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(Val_unit);
-}
-
-
-value stub_xc_domain_sethandle(value xch, value domid, value handle)
-{
-	CAMLparam3(xch, domid, handle);
-	xen_domain_handle_t h = { 0 };
-	int i;
-
-        if (Wosize_val(handle) != 16)
-		caml_invalid_argument("Handle not a 16-integer array");
-
-	for (i = 0; i < sizeof(h); i++) {
-		h[i] = Int_val(Field(handle, i)) & 0xff;
-	}
-
-	i = xc_domain_sethandle(_H(xch), _D(domid), h);
-	if (i)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(Val_unit);
-}
-
-static value dom_op(value xch, value domid, int (*fn)(xc_interface *, uint32_t))
-{
-	CAMLparam2(xch, domid);
-
-	uint32_t c_domid = _D(domid);
-
-	// caml_enter_blocking_section();
-	int result = fn(_H(xch), c_domid);
-	// caml_leave_blocking_section();
-        if (result)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_domain_pause(value xch, value domid)
-{
-	return dom_op(xch, domid, xc_domain_pause);
-}
-
-
-CAMLprim value stub_xc_domain_unpause(value xch, value domid)
-{
-	return dom_op(xch, domid, xc_domain_unpause);
-}
-
-CAMLprim value stub_xc_domain_destroy(value xch, value domid)
-{
-	return dom_op(xch, domid, xc_domain_destroy);
-}
-
-CAMLprim value stub_xc_domain_resume_fast(value xch, value domid)
-{
-	CAMLparam2(xch, domid);
-
-	uint32_t c_domid = _D(domid);
-
-	// caml_enter_blocking_section();
-	int result = xc_domain_resume(_H(xch), c_domid, 1);
-	// caml_leave_blocking_section();
-        if (result)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_domain_shutdown(value xch, value domid, value reason)
-{
-	CAMLparam3(xch, domid, reason);
-	int ret;
-
-	ret = xc_domain_shutdown(_H(xch), _D(domid), Int_val(reason));
-	if (ret < 0)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(Val_unit);
-}
-
-static value alloc_domaininfo(xc_domaininfo_t * info)
-{
-	CAMLparam0();
-	CAMLlocal2(result, tmp);
-	int i;
-
-	result = caml_alloc_tuple(16);
-
-	Store_field(result,  0, Val_int(info->domain));
-	Store_field(result,  1, Val_bool(info->flags & XEN_DOMINF_dying));
-	Store_field(result,  2, Val_bool(info->flags & XEN_DOMINF_shutdown));
-	Store_field(result,  3, Val_bool(info->flags & XEN_DOMINF_paused));
-	Store_field(result,  4, Val_bool(info->flags & XEN_DOMINF_blocked));
-	Store_field(result,  5, Val_bool(info->flags & XEN_DOMINF_running));
-	Store_field(result,  6, Val_bool(info->flags & XEN_DOMINF_hvm_guest));
-	Store_field(result,  7, Val_int((info->flags >> XEN_DOMINF_shutdownshift)
-	                                 & XEN_DOMINF_shutdownmask));
-	Store_field(result,  8, caml_copy_nativeint(info->tot_pages));
-	Store_field(result,  9, caml_copy_nativeint(info->max_pages));
-	Store_field(result, 10, caml_copy_int64(info->shared_info_frame));
-	Store_field(result, 11, caml_copy_int64(info->cpu_time));
-	Store_field(result, 12, Val_int(info->nr_online_vcpus));
-	Store_field(result, 13, Val_int(info->max_vcpu_id));
-	Store_field(result, 14, caml_copy_int32(info->ssidref));
-
-        tmp = caml_alloc_small(16, 0);
-	for (i = 0; i < 16; i++) {
-		Field(tmp, i) = Val_int(info->handle[i]);
-	}
-
-	Store_field(result, 15, tmp);
-
-	CAMLreturn(result);
-}
-
-CAMLprim value stub_xc_domain_getinfolist(value xch, value first_domain, value nb)
-{
-	CAMLparam3(xch, first_domain, nb);
-	CAMLlocal2(result, temp);
-	xc_domaininfo_t * info;
-	int i, ret, toalloc, retval;
-	unsigned int c_max_domains;
-	uint32_t c_first_domain;
-
-	/* get the minimum number of allocate byte we need and bump it up to page boundary */
-	toalloc = (sizeof(xc_domaininfo_t) * Int_val(nb)) | 0xfff;
-	ret = posix_memalign((void **) ((void *) &info), 4096, toalloc);
-	if (ret)
-		caml_raise_out_of_memory();
-
-	result = temp = Val_emptylist;
-
-	c_first_domain = _D(first_domain);
-	c_max_domains = Int_val(nb);
-	// caml_enter_blocking_section();
-	retval = xc_domain_getinfolist(_H(xch), c_first_domain,
-				       c_max_domains, info);
-	// caml_leave_blocking_section();
-
-	if (retval < 0) {
-		free(info);
-		failwith_xc(_H(xch));
-	}
-	for (i = 0; i < retval; i++) {
-		result = caml_alloc_small(2, Tag_cons);
-		Field(result, 0) = Val_int(0);
-		Field(result, 1) = temp;
-		temp = result;
-
-		Store_field(result, 0, alloc_domaininfo(info + i));
-	}
-
-	free(info);
-	CAMLreturn(result);
-}
-
-CAMLprim value stub_xc_domain_getinfo(value xch, value domid)
-{
-	CAMLparam2(xch, domid);
-	CAMLlocal1(result);
-	xc_domaininfo_t info;
-	int ret;
-
-	ret = xc_domain_getinfolist(_H(xch), _D(domid), 1, &info);
-	if (ret != 1)
-		failwith_xc(_H(xch));
-	if (info.domain != _D(domid))
-		failwith_xc(_H(xch));
-
-	result = alloc_domaininfo(&info);
-	CAMLreturn(result);
-}
-
-CAMLprim value stub_xc_vcpu_getinfo(value xch, value domid, value vcpu)
-{
-	CAMLparam3(xch, domid, vcpu);
-	CAMLlocal1(result);
-	xc_vcpuinfo_t info;
-	int retval;
-
-	uint32_t c_domid = _D(domid);
-	uint32_t c_vcpu = Int_val(vcpu);
-	// caml_enter_blocking_section();
-	retval = xc_vcpu_getinfo(_H(xch), c_domid,
-	                         c_vcpu, &info);
-	// caml_leave_blocking_section();
-	if (retval < 0)
-		failwith_xc(_H(xch));
-
-	result = caml_alloc_tuple(5);
-	Store_field(result, 0, Val_bool(info.online));
-	Store_field(result, 1, Val_bool(info.blocked));
-	Store_field(result, 2, Val_bool(info.running));
-	Store_field(result, 3, caml_copy_int64(info.cpu_time));
-	Store_field(result, 4, caml_copy_int32(info.cpu));
-
-	CAMLreturn(result);
-}
-
-CAMLprim value stub_xc_vcpu_context_get(value xch, value domid,
-                                        value cpu)
-{
-	CAMLparam3(xch, domid, cpu);
-	CAMLlocal1(context);
-	int ret;
-	vcpu_guest_context_any_t ctxt;
-
-	ret = xc_vcpu_getcontext(_H(xch), _D(domid), Int_val(cpu), &ctxt);
-
-	context = caml_alloc_string(sizeof(ctxt));
-	memcpy(String_val(context), (char *) &ctxt.c, sizeof(ctxt.c));
-
-	CAMLreturn(context);
-}
-
-static int get_cpumap_len(value xch, value cpumap)
-{
-	int ml_len = Wosize_val(cpumap);
-	int xc_len = xc_get_max_cpus(_H(xch));
-
-	if (ml_len < xc_len)
-		return ml_len;
-	else
-		return xc_len;
-}
-
-CAMLprim value stub_xc_vcpu_setaffinity(value xch, value domid,
-                                        value vcpu, value cpumap)
-{
-	CAMLparam4(xch, domid, vcpu, cpumap);
-	int i, len = get_cpumap_len(xch, cpumap);
-	xc_cpumap_t c_cpumap;
-	int retval;
-
-	c_cpumap = xc_cpumap_alloc(_H(xch));
-	if (c_cpumap == NULL)
-		failwith_xc(_H(xch));
-
-	for (i=0; i<len; i++) {
-		if (Bool_val(Field(cpumap, i)))
-			c_cpumap[i/8] |= i << (i&7);
-	}
-	retval = xc_vcpu_setaffinity(_H(xch), _D(domid),
-	                             Int_val(vcpu), c_cpumap);
-	free(c_cpumap);
-
-	if (retval < 0)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_vcpu_getaffinity(value xch, value domid,
-                                        value vcpu)
-{
-	CAMLparam3(xch, domid, vcpu);
-	CAMLlocal1(ret);
-	xc_cpumap_t c_cpumap;
-	int i, len = xc_get_max_cpus(_H(xch));
-	int retval;
-
-	c_cpumap = xc_cpumap_alloc(_H(xch));
-	if (c_cpumap == NULL)
-		failwith_xc(_H(xch));
-
-	retval = xc_vcpu_getaffinity(_H(xch), _D(domid),
-	                             Int_val(vcpu), c_cpumap);
-	free(c_cpumap);
-
-	if (retval < 0) {
-		free(c_cpumap);
-		failwith_xc(_H(xch));
-	}
-
-	ret = caml_alloc(len, 0);
-
-	for (i=0; i<len; i++) {
-		if (c_cpumap[i%8] & 1 << (i&7))
-			Store_field(ret, i, Val_true);
-		else
-			Store_field(ret, i, Val_false);
-	}
-
-	free(c_cpumap);
-
-	CAMLreturn(ret);
-}
-
-CAMLprim value stub_xc_sched_id(value xch)
-{
-	CAMLparam1(xch);
-	int sched_id;
-
-	if (xc_sched_id(_H(xch), &sched_id))
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_int(sched_id));
-}
-
-CAMLprim value stub_xc_evtchn_alloc_unbound(value xch,
-                                            value local_domid,
-                                            value remote_domid)
-{
-	CAMLparam3(xch, local_domid, remote_domid);
-
-	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,
-	                                     c_remote_domid);
-	// caml_leave_blocking_section();
-
-	if (result < 0)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_int(result));
-}
-
-CAMLprim value stub_xc_evtchn_reset(value xch, value domid)
-{
-	CAMLparam2(xch, domid);
-	int r;
-
-	r = xc_evtchn_reset(_H(xch), _D(domid));
-	if (r < 0)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_unit);
-}
-
-
-#define RING_SIZE 32768
-static char ring[RING_SIZE];
-
-CAMLprim value stub_xc_readconsolering(value xch)
-{
-	unsigned int size = RING_SIZE;
-	char *ring_ptr = ring;
-
-	CAMLparam1(xch);
-
-	// caml_enter_blocking_section();
-	int retval = xc_readconsolering(_H(xch), ring_ptr, &size, 0, 0, NULL);
-	// caml_leave_blocking_section();
-
-	if (retval)
-		failwith_xc(_H(xch));
-	ring[size] = '\0';
-	CAMLreturn(caml_copy_string(ring));
-}
-
-CAMLprim value stub_xc_send_debug_keys(value xch, value keys)
-{
-	CAMLparam2(xch, keys);
-	int r;
-
-	r = xc_send_debug_keys(_H(xch), String_val(keys));
-	if (r)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_physinfo(value xch)
-{
-	CAMLparam1(xch);
-	CAMLlocal3(physinfo, cap_list, tmp);
-	xc_physinfo_t c_physinfo;
-	int r;
-
-	// caml_enter_blocking_section();
-	r = xc_physinfo(_H(xch), &c_physinfo);
-	// caml_leave_blocking_section();
-
-	if (r)
-		failwith_xc(_H(xch));
-
-	tmp = cap_list = Val_emptylist;
-	for (r = 0; r < 2; r++) {
-		if ((c_physinfo.capabilities >> r) & 1) {
-			tmp = caml_alloc_small(2, Tag_cons);
-			Field(tmp, 0) = Val_int(r);
-			Field(tmp, 1) = cap_list;
-			cap_list = tmp;
-		}
-	}
-
-	physinfo = caml_alloc_tuple(9);
-	Store_field(physinfo, 0, Val_int(c_physinfo.threads_per_core));
-	Store_field(physinfo, 1, Val_int(c_physinfo.cores_per_socket));
-	Store_field(physinfo, 2, Val_int(c_physinfo.nr_cpus));
-	Store_field(physinfo, 3, Val_int(c_physinfo.max_node_id));
-	Store_field(physinfo, 4, Val_int(c_physinfo.cpu_khz));
-	Store_field(physinfo, 5, caml_copy_nativeint(c_physinfo.total_pages));
-	Store_field(physinfo, 6, caml_copy_nativeint(c_physinfo.free_pages));
-	Store_field(physinfo, 7, caml_copy_nativeint(c_physinfo.scrub_pages));
-	Store_field(physinfo, 8, cap_list);
-
-	CAMLreturn(physinfo);
-}
-
-CAMLprim value stub_xc_pcpu_info(value xch, value nr_cpus)
-{
-	CAMLparam2(xch, nr_cpus);
-	CAMLlocal2(pcpus, v);
-	xc_cpuinfo_t *info;
-	int r, size;
-
-	if (Int_val(nr_cpus) < 1)
-		caml_invalid_argument("nr_cpus");
-	
-	info = calloc(Int_val(nr_cpus) + 1, sizeof(*info));
-	if (!info)
-		caml_raise_out_of_memory();
-
-	// caml_enter_blocking_section();
-	r = xc_getcpuinfo(_H(xch), Int_val(nr_cpus), info, &size);
-	// caml_leave_blocking_section();
-
-	if (r) {
-		free(info);
-		failwith_xc(_H(xch));
-	}
-
-	if (size > 0) {
-		int i;
-		pcpus = caml_alloc(size, 0);
-		for (i = 0; i < size; i++) {
-			v = caml_copy_int64(info[i].idletime);
-			caml_modify(&Field(pcpus, i), v);
-		}
-	} else
-		pcpus = Atom(0);
-	free(info);
-	CAMLreturn(pcpus);
-}
-
-CAMLprim value stub_xc_domain_setmaxmem(value xch, value domid,
-                                        value max_memkb)
-{
-	CAMLparam3(xch, domid, max_memkb);
-
-	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,
-	                                 c_max_memkb);
-	// caml_leave_blocking_section();
-	if (retval)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_domain_set_memmap_limit(value xch, value domid,
-                                               value map_limitkb)
-{
-	CAMLparam3(xch, domid, map_limitkb);
-	unsigned long v;
-	int retval;
-
-	v = Int64_val(map_limitkb);
-	retval = xc_domain_set_memmap_limit(_H(xch), _D(domid), v);
-	if (retval)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_domain_memory_increase_reservation(value xch,
-                                                          value domid,
-                                                          value mem_kb)
-{
-	CAMLparam3(xch, domid, mem_kb);
-
-	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,
-							  nr_extents, 0, 0, NULL);
-	// caml_leave_blocking_section();
-
-	if (retval)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_domain_set_machine_address_size(value xch,
-						       value domid,
-						       value width)
-{
-	CAMLparam3(xch, domid, width);
-	uint32_t c_domid = _D(domid);
-	int c_width = Int_val(width);
-
-	int retval = xc_domain_set_machine_address_size(_H(xch), c_domid, c_width);
-	if (retval)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_domain_get_machine_address_size(value xch,
-                                                       value domid)
-{
-	CAMLparam2(xch, domid);
-	int retval;
-
-	retval = xc_domain_get_machine_address_size(_H(xch), _D(domid));
-	if (retval < 0)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_int(retval));
-}
-
-CAMLprim value stub_xc_domain_cpuid_set(value xch, value domid,
-                                        value input,
-                                        value config)
-{
-	CAMLparam4(xch, domid, input, config);
-	CAMLlocal2(array, tmp);
-	int r;
-	unsigned int c_input[2];
-	char *c_config[4], *out_config[4];
-
-	c_config[0] = string_of_option_array(config, 0);
-	c_config[1] = string_of_option_array(config, 1);
-	c_config[2] = string_of_option_array(config, 2);
-	c_config[3] = string_of_option_array(config, 3);
-
-	cpuid_input_of_val(c_input[0], c_input[1], input);
-
-	array = caml_alloc(4, 0);
-	for (r = 0; r < 4; r++) {
-		tmp = Val_none;
-		if (c_config[r]) {
-			tmp = caml_alloc_small(1, 0);
-			Field(tmp, 0) = caml_alloc_string(32);
-		}
-		Store_field(array, r, tmp);
-	}
-
-	for (r = 0; r < 4; r++)
-		out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL;
-
-	r = xc_cpuid_set(_H(xch), _D(domid),
-			 c_input, (const char **)c_config, out_config);
-	if (r < 0)
-		failwith_xc(_H(xch));
-	CAMLreturn(array);
-}
-
-CAMLprim value stub_xc_domain_cpuid_apply_policy(value xch, value domid)
-{
-	CAMLparam2(xch, domid);
-	int r;
-
-	r = xc_cpuid_apply_policy(_H(xch), _D(domid));
-	if (r < 0)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_cpuid_check(value xch, value input, value config)
-{
-	CAMLparam3(xch, input, config);
-	CAMLlocal3(ret, array, tmp);
-	int r;
-	unsigned int c_input[2];
-	char *c_config[4], *out_config[4];
-
-	c_config[0] = string_of_option_array(config, 0);
-	c_config[1] = string_of_option_array(config, 1);
-	c_config[2] = string_of_option_array(config, 2);
-	c_config[3] = string_of_option_array(config, 3);
-
-	cpuid_input_of_val(c_input[0], c_input[1], input);
-
-	array = caml_alloc(4, 0);
-	for (r = 0; r < 4; r++) {
-		tmp = Val_none;
-		if (c_config[r]) {
-			tmp = caml_alloc_small(1, 0);
-			Field(tmp, 0) = caml_alloc_string(32);
-		}
-		Store_field(array, r, tmp);
-	}
-
-	for (r = 0; r < 4; r++)
-		out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL;
-
-	r = xc_cpuid_check(_H(xch), c_input, (const char **)c_config, out_config);
-	if (r < 0)
-		failwith_xc(_H(xch));
-
-	ret = caml_alloc_tuple(2);
-	Store_field(ret, 0, Val_bool(r));
-	Store_field(ret, 1, array);
-
-	CAMLreturn(ret);
-}
-
-CAMLprim value stub_xc_version_version(value xch)
-{
-	CAMLparam1(xch);
-	CAMLlocal1(result);
-	xen_extraversion_t extra;
-	long packed;
-	int retval;
-
-	// caml_enter_blocking_section();
-	packed = xc_version(_H(xch), XENVER_version, NULL);
-	retval = xc_version(_H(xch), XENVER_extraversion, &extra);
-	// caml_leave_blocking_section();
-
-	if (retval)
-		failwith_xc(_H(xch));
-
-	result = caml_alloc_tuple(3);
-
-	Store_field(result, 0, Val_int(packed >> 16));
-	Store_field(result, 1, Val_int(packed & 0xffff));
-	Store_field(result, 2, caml_copy_string(extra));
-
-	CAMLreturn(result);
-}
-
-
-CAMLprim value stub_xc_version_compile_info(value xch)
-{
-	CAMLparam1(xch);
-	CAMLlocal1(result);
-	xen_compile_info_t ci;
-	int retval;
-
-	// caml_enter_blocking_section();
-	retval = xc_version(_H(xch), XENVER_compile_info, &ci);
-	// caml_leave_blocking_section();
-
-	if (retval)
-		failwith_xc(_H(xch));
-
-	result = caml_alloc_tuple(4);
-
-	Store_field(result, 0, caml_copy_string(ci.compiler));
-	Store_field(result, 1, caml_copy_string(ci.compile_by));
-	Store_field(result, 2, caml_copy_string(ci.compile_domain));
-	Store_field(result, 3, caml_copy_string(ci.compile_date));
-
-	CAMLreturn(result);
-}
-
-
-static value xc_version_single_string(value xch, int code, void *info)
-{
-	CAMLparam1(xch);
-	int retval;
-
-	// caml_enter_blocking_section();
-	retval = xc_version(_H(xch), code, info);
-	// caml_leave_blocking_section();
-
-	if (retval)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(caml_copy_string((char *)info));
-}
-
-
-CAMLprim value stub_xc_version_changeset(value xch)
-{
-	xen_changeset_info_t ci;
-
-	return xc_version_single_string(xch, XENVER_changeset, &ci);
-}
-
-
-CAMLprim value stub_xc_version_capabilities(value xch)
-{
-	xen_capabilities_info_t ci;
-
-	return xc_version_single_string(xch, XENVER_capabilities, &ci);
-}
-
-
-CAMLprim value stub_pages_to_kib(value pages)
-{
-	CAMLparam1(pages);
-
-	CAMLreturn(caml_copy_int64(Int64_val(pages) << (PAGE_SHIFT - 10)));
-}
-
-
-CAMLprim value stub_map_foreign_range(value xch, value dom,
-                                      value size, value mfn)
-{
-	CAMLparam4(xch, dom, size, mfn);
-	CAMLlocal1(result);
-	struct mmap_interface *intf;
-	uint32_t c_dom;
-	unsigned long c_mfn;
-
-	result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
-	intf = (struct mmap_interface *) result;
-
-	intf->len = Int_val(size);
-
-	c_dom = _D(dom);
-	c_mfn = Nativeint_val(mfn);
-	// 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();
-	if (!intf->addr)
-		caml_failwith("xc_map_foreign_range error");
-	CAMLreturn(result);
-}
-
-CAMLprim value stub_sched_credit_domain_get(value xch, value domid)
-{
-	CAMLparam2(xch, domid);
-	CAMLlocal1(sdom);
-	struct xen_domctl_sched_credit c_sdom;
-	int ret;
-
-	// caml_enter_blocking_section();
-	ret = xc_sched_credit_domain_get(_H(xch), _D(domid), &c_sdom);
-	// caml_leave_blocking_section();
-	if (ret != 0)
-		failwith_xc(_H(xch));
-
-	sdom = caml_alloc_tuple(2);
-	Store_field(sdom, 0, Val_int(c_sdom.weight));
-	Store_field(sdom, 1, Val_int(c_sdom.cap));
-
-	CAMLreturn(sdom);
-}
-
-CAMLprim value stub_sched_credit_domain_set(value xch, value domid,
-                                            value sdom)
-{
-	CAMLparam3(xch, domid, sdom);
-	struct xen_domctl_sched_credit c_sdom;
-	int ret;
-
-	c_sdom.weight = Int_val(Field(sdom, 0));
-	c_sdom.cap = Int_val(Field(sdom, 1));
-	// caml_enter_blocking_section();
-	ret = xc_sched_credit_domain_set(_H(xch), _D(domid), &c_sdom);
-	// caml_leave_blocking_section();
-	if (ret != 0)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_shadow_allocation_get(value xch, value domid)
-{
-	CAMLparam2(xch, domid);
-	CAMLlocal1(mb);
-	unsigned long c_mb;
-	int ret;
-
-	// 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();
-	if (ret != 0)
-		failwith_xc(_H(xch));
-
-	mb = Val_int(c_mb);
-	CAMLreturn(mb);
-}
-
-CAMLprim value stub_shadow_allocation_set(value xch, value domid,
-					  value mb)
-{
-	CAMLparam3(xch, domid, mb);
-	unsigned long c_mb;
-	int ret;
-
-	c_mb = Int_val(mb);
-	// 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();
-	if (ret != 0)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_domain_get_pfn_list(value xch, value domid,
-                                           value nr_pfns)
-{
-	CAMLparam3(xch, domid, nr_pfns);
-	CAMLlocal2(array, v);
-	unsigned long c_nr_pfns;
-	long ret, i;
-	uint64_t *c_array;
-
-	c_nr_pfns = Nativeint_val(nr_pfns);
-
-	c_array = malloc(sizeof(uint64_t) * c_nr_pfns);
-	if (!c_array)
-		caml_raise_out_of_memory();
-
-	ret = xc_get_pfn_list(_H(xch), _D(domid),
-			      c_array, c_nr_pfns);
-	if (ret < 0) {
-		free(c_array);
-		failwith_xc(_H(xch));
-	}
-
-	array = caml_alloc(ret, 0);
-	for (i = 0; i < ret; i++) {
-		v = caml_copy_nativeint(c_array[i]);
-		Store_field(array, i, v);
-	}
-	free(c_array);
-
-	CAMLreturn(array);
-}
-
-CAMLprim value stub_xc_domain_ioport_permission(value xch, value domid,
-					       value start_port, value nr_ports,
-					       value allow)
-{
-	CAMLparam5(xch, domid, start_port, nr_ports, allow);
-	uint32_t c_start_port, c_nr_ports;
-	uint8_t c_allow;
-	int ret;
-
-	c_start_port = Int_val(start_port);
-	c_nr_ports = Int_val(nr_ports);
-	c_allow = Bool_val(allow);
-
-	ret = xc_domain_ioport_permission(_H(xch), _D(domid),
-					 c_start_port, c_nr_ports, c_allow);
-	if (ret < 0)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_domain_iomem_permission(value xch, value domid,
-					       value start_pfn, value nr_pfns,
-					       value allow)
-{
-	CAMLparam5(xch, domid, start_pfn, nr_pfns, allow);
-	unsigned long c_start_pfn, c_nr_pfns;
-	uint8_t c_allow;
-	int ret;
-
-	c_start_pfn = Nativeint_val(start_pfn);
-	c_nr_pfns = Nativeint_val(nr_pfns);
-	c_allow = Bool_val(allow);
-
-	ret = xc_domain_iomem_permission(_H(xch), _D(domid),
-					 c_start_pfn, c_nr_pfns, c_allow);
-	if (ret < 0)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_domain_irq_permission(value xch, value domid,
-					     value pirq, value allow)
-{
-	CAMLparam4(xch, domid, pirq, allow);
-	uint8_t c_pirq;
-	uint8_t c_allow;
-	int ret;
-
-	c_pirq = Int_val(pirq);
-	c_allow = Bool_val(allow);
-
-	ret = xc_domain_irq_permission(_H(xch), _D(domid),
-				       c_pirq, c_allow);
-	if (ret < 0)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(Val_unit);
-}
-
-static uint32_t pci_dev_to_bdf(int domain, int bus, int slot, int func)
-{
-	uint32_t bdf = 0;
-	bdf |= (bus & 0xff) << 16;
-	bdf |= (slot & 0x1f) << 11;
-	bdf |= (func & 0x7) << 8;
-	return bdf;
-}
-
-CAMLprim value stub_xc_domain_test_assign_device(value xch, value domid, value desc)
-{
-	CAMLparam3(xch, domid, desc);
-	int ret;
-	int domain, bus, slot, func;
-	uint32_t bdf;
-
-	domain = Int_val(Field(desc, 0));
-	bus = Int_val(Field(desc, 1));
-	slot = Int_val(Field(desc, 2));
-	func = Int_val(Field(desc, 3));
-	bdf = pci_dev_to_bdf(domain, bus, slot, func);
-
-	ret = xc_test_assign_device(_H(xch), _D(domid), bdf);
-
-	CAMLreturn(Val_bool(ret == 0));
-}
-
-CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value desc)
-{
-	CAMLparam3(xch, domid, desc);
-	int ret;
-	int domain, bus, slot, func;
-	uint32_t bdf;
-
-	domain = Int_val(Field(desc, 0));
-	bus = Int_val(Field(desc, 1));
-	slot = Int_val(Field(desc, 2));
-	func = Int_val(Field(desc, 3));
-	bdf = pci_dev_to_bdf(domain, bus, slot, func);
-
-	ret = xc_assign_device(_H(xch), _D(domid), bdf);
-
-	if (ret < 0)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_domain_deassign_device(value xch, value domid, value desc)
-{
-	CAMLparam3(xch, domid, desc);
-	int ret;
-	int domain, bus, slot, func;
-	uint32_t bdf;
-
-	domain = Int_val(Field(desc, 0));
-	bus = Int_val(Field(desc, 1));
-	slot = Int_val(Field(desc, 2));
-	func = Int_val(Field(desc, 3));
-	bdf = pci_dev_to_bdf(domain, bus, slot, func);
-
-	ret = xc_deassign_device(_H(xch), _D(domid), bdf);
-
-	if (ret < 0)
-		failwith_xc(_H(xch));
-	CAMLreturn(Val_unit);
-}
-
-CAMLprim value stub_xc_watchdog(value xch, value domid, value timeout)
-{
-	CAMLparam3(xch, domid, timeout);
-	int ret;
-	unsigned int c_timeout = Int32_val(timeout);
-
-	ret = xc_watchdog(_H(xch), _D(domid), c_timeout);
-	if (ret < 0)
-		failwith_xc(_H(xch));
-
-	CAMLreturn(Val_int(ret));
-}
-
-/*
- * Local variables:
- *  indent-tabs-mode: t
- *  c-basic-offset: 8
- *  tab-width: 8
- * End:
- */
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xenctrl.ml
--- /dev/null
+++ b/tools/ocaml/libs/xc/xenctrl.ml
@@ -0,0 +1,326 @@
+(*
+ * Copyright (C) 2006-2007 XenSource Ltd.
+ * Copyright (C) 2008      Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ *)
+
+(** *)
+type domid = int
+
+(* ** xenctrl.h ** *)
+
+type vcpuinfo =
+{
+	online: bool;
+	blocked: bool;
+	running: bool;
+	cputime: int64;
+	cpumap: int32;
+}
+
+type domaininfo =
+{
+	domid             : domid;
+	dying             : bool;
+	shutdown          : bool;
+	paused            : bool;
+	blocked           : bool;
+	running           : bool;
+	hvm_guest         : bool;
+	shutdown_code     : int;
+	total_memory_pages: nativeint;
+	max_memory_pages  : nativeint;
+	shared_info_frame : int64;
+	cpu_time          : int64;
+	nr_online_vcpus   : int;
+	max_vcpu_id       : int;
+	ssidref           : int32;
+	handle            : int array;
+}
+
+type sched_control =
+{
+	weight : int;
+	cap    : int;
+}
+
+type physinfo_cap_flag =
+	| CAP_HVM
+	| CAP_DirectIO
+
+type physinfo =
+{
+	threads_per_core : int;
+	cores_per_socket : int;
+	nr_cpus          : int;
+	max_node_id      : int;
+	cpu_khz          : int;
+	total_pages      : nativeint;
+	free_pages       : nativeint;
+	scrub_pages      : nativeint;
+	(* XXX hw_cap *)
+	capabilities     : physinfo_cap_flag list;
+}
+
+type version =
+{
+	major : int;
+	minor : int;
+	extra : string;
+}
+
+
+type compile_info =
+{
+	compiler : string;
+	compile_by : string;
+	compile_domain : string;
+	compile_date : string;
+}
+
+type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
+
+type domain_create_flag = CDF_HVM | CDF_HAP
+
+exception Error of string
+
+type handle
+
+(* this is only use by coredumping *)
+external sizeof_core_header: unit -> int
+       = "stub_sizeof_core_header"
+external sizeof_vcpu_guest_context: unit -> int
+       = "stub_sizeof_vcpu_guest_context"
+external sizeof_xen_pfn: unit -> int = "stub_sizeof_xen_pfn"
+(* end of use *)
+
+external interface_open: unit -> handle = "stub_xc_interface_open"
+external interface_close: handle -> unit = "stub_xc_interface_close"
+
+external is_fake: unit -> bool = "stub_xc_interface_is_fake"
+
+let with_intf f =
+	let xc = interface_open () in
+	let r = try f xc with exn -> interface_close xc; raise exn in
+	interface_close xc;
+	r
+
+external _domain_create: handle -> int32 -> domain_create_flag list -> int array -> domid
+       = "stub_xc_domain_create"
+
+let domain_create handle n flags uuid =
+	_domain_create handle n flags (Uuid.int_array_of_uuid uuid)
+
+external _domain_sethandle: handle -> domid -> int array -> unit
+                          = "stub_xc_domain_sethandle"
+
+let domain_sethandle handle n uuid =
+	_domain_sethandle handle n (Uuid.int_array_of_uuid uuid)
+
+external domain_max_vcpus: handle -> domid -> int -> unit
+       = "stub_xc_domain_max_vcpus"
+
+external domain_pause: handle -> domid -> unit = "stub_xc_domain_pause"
+external domain_unpause: handle -> domid -> unit = "stub_xc_domain_unpause"
+external domain_resume_fast: handle -> domid -> unit = "stub_xc_domain_resume_fast"
+external domain_destroy: handle -> domid -> unit = "stub_xc_domain_destroy"
+
+external domain_shutdown: handle -> domid -> shutdown_reason -> unit
+       = "stub_xc_domain_shutdown"
+
+external _domain_getinfolist: handle -> domid -> int -> domaininfo list
+       = "stub_xc_domain_getinfolist"
+
+let domain_getinfolist handle first_domain =
+	let nb = 2 in
+	let last_domid l = (List.hd l).domid + 1 in
+	let rec __getlist from =
+		let l = _domain_getinfolist handle from nb in
+		(if List.length l = nb then __getlist (last_domid l) else []) @ l
+		in
+	List.rev (__getlist first_domain)
+
+external domain_getinfo: handle -> domid -> domaininfo= "stub_xc_domain_getinfo"
+
+external domain_get_vcpuinfo: handle -> int -> int -> vcpuinfo
+       = "stub_xc_vcpu_getinfo"
+
+external domain_ioport_permission: handle -> domid -> int -> int -> bool -> unit
+       = "stub_xc_domain_ioport_permission"
+external domain_iomem_permission: handle -> domid -> nativeint -> nativeint -> bool -> unit
+       = "stub_xc_domain_iomem_permission"
+external domain_irq_permission: handle -> domid -> int -> bool -> unit
+       = "stub_xc_domain_irq_permission"
+
+external vcpu_affinity_set: handle -> domid -> int -> bool array -> unit
+       = "stub_xc_vcpu_setaffinity"
+external vcpu_affinity_get: handle -> domid -> int -> bool array
+       = "stub_xc_vcpu_getaffinity"
+
+external vcpu_context_get: handle -> domid -> int -> string
+       = "stub_xc_vcpu_context_get"
+
+external sched_id: handle -> int = "stub_xc_sched_id"
+
+external sched_credit_domain_set: handle -> domid -> sched_control -> unit
+       = "stub_sched_credit_domain_set"
+external sched_credit_domain_get: handle -> domid -> sched_control
+       = "stub_sched_credit_domain_get"
+
+external shadow_allocation_set: handle -> domid -> int -> unit
+       = "stub_shadow_allocation_set"
+external shadow_allocation_get: handle -> domid -> int
+       = "stub_shadow_allocation_get"
+
+external evtchn_alloc_unbound: handle -> domid -> domid -> int
+       = "stub_xc_evtchn_alloc_unbound"
+external evtchn_reset: handle -> domid -> unit = "stub_xc_evtchn_reset"
+
+external readconsolering: handle -> string = "stub_xc_readconsolering"
+
+external send_debug_keys: handle -> string -> unit = "stub_xc_send_debug_keys"
+external physinfo: handle -> physinfo = "stub_xc_physinfo"
+external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
+
+external domain_setmaxmem: handle -> domid -> int64 -> unit
+       = "stub_xc_domain_setmaxmem"
+external domain_set_memmap_limit: handle -> domid -> int64 -> unit
+       = "stub_xc_domain_set_memmap_limit"
+external domain_memory_increase_reservation: handle -> domid -> int64 -> unit
+       = "stub_xc_domain_memory_increase_reservation"
+
+external domain_set_machine_address_size: handle -> domid -> int -> unit
+       = "stub_xc_domain_set_machine_address_size"
+external domain_get_machine_address_size: handle -> domid -> int
+       = "stub_xc_domain_get_machine_address_size"
+
+external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
+                        -> string option array
+                        -> string option array
+       = "stub_xc_domain_cpuid_set"
+external domain_cpuid_apply_policy: handle -> domid -> unit
+       = "stub_xc_domain_cpuid_apply_policy"
+external cpuid_check: handle -> (int64 * (int64 option)) -> string option array -> (bool * string option array)
+       = "stub_xc_cpuid_check"
+
+external map_foreign_range: handle -> domid -> int
+                         -> nativeint -> Xenmmap.mmap_interface
+       = "stub_map_foreign_range"
+
+external domain_get_pfn_list: handle -> domid -> nativeint -> nativeint array
+       = "stub_xc_domain_get_pfn_list"
+
+external domain_assign_device: handle -> domid -> (int * int * int * int) -> unit
+       = "stub_xc_domain_assign_device"
+external domain_deassign_device: handle -> domid -> (int * int * int * int) -> unit
+       = "stub_xc_domain_deassign_device"
+external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool
+       = "stub_xc_domain_test_assign_device"
+
+external version: handle -> version = "stub_xc_version_version"
+external version_compile_info: handle -> compile_info
+       = "stub_xc_version_compile_info"
+external version_changeset: handle -> string = "stub_xc_version_changeset"
+external version_capabilities: handle -> string =
+  "stub_xc_version_capabilities"
+
+external watchdog : handle -> int -> int32 -> int
+  = "stub_xc_watchdog"
+
+(* core dump structure *)
+type core_magic = Magic_hvm | Magic_pv
+
+type core_header = {
+	xch_magic: core_magic;
+	xch_nr_vcpus: int;
+	xch_nr_pages: nativeint;
+	xch_index_offset: int64;
+	xch_ctxt_offset: int64;
+	xch_pages_offset: int64;
+}
+
+external marshall_core_header: core_header -> string = "stub_marshall_core_header"
+
+(* coredump *)
+let coredump xch domid fd =
+	let dump s =
+		let wd = Unix.write fd s 0 (String.length s) in
+		if wd <> String.length s then
+			failwith "error while writing";
+		in
+
+	let info = domain_getinfo xch domid in
+
+	let nrpages = info.total_memory_pages in
+	let ctxt = Array.make info.max_vcpu_id None in
+	let nr_vcpus = ref 0 in
+	for i = 0 to info.max_vcpu_id - 1
+	do
+		ctxt.(i) <- try
+			let v = vcpu_context_get xch domid i in
+			incr nr_vcpus;
+			Some v
+			with _ -> None
+	done;
+
+	(* FIXME page offset if not rounded to sup *)
+	let page_offset =
+		Int64.add
+			(Int64.of_int (sizeof_core_header () +
+			 (sizeof_vcpu_guest_context () * !nr_vcpus)))
+			(Int64.of_nativeint (
+				Nativeint.mul
+					(Nativeint.of_int (sizeof_xen_pfn ()))
+					nrpages)
+				)
+		in
+
+	let header = {
+		xch_magic = if info.hvm_guest then Magic_hvm else Magic_pv;
+		xch_nr_vcpus = !nr_vcpus;
+		xch_nr_pages = nrpages;
+		xch_ctxt_offset = Int64.of_int (sizeof_core_header ());
+		xch_index_offset = Int64.of_int (sizeof_core_header ()
+					+ sizeof_vcpu_guest_context ());
+		xch_pages_offset = page_offset;
+	} in
+
+	dump (marshall_core_header header);
+	for i = 0 to info.max_vcpu_id - 1
+	do
+		match ctxt.(i) with
+		| None -> ()
+		| Some ctxt_i -> dump ctxt_i
+	done;
+	let pfns = domain_get_pfn_list xch domid nrpages in
+	if Array.length pfns <> Nativeint.to_int nrpages then
+		failwith "could not get the page frame list";
+
+	let page_size = Xenmmap.getpagesize () in
+	for i = 0 to Nativeint.to_int nrpages - 1
+	do
+		let page = map_foreign_range xch domid page_size pfns.(i) in
+		let data = Xenmmap.read page 0 page_size in
+		Xenmmap.unmap page;
+		dump data
+	done
+
+(* ** Misc ** *)
+
+(**
+   Convert the given number of pages to an amount in KiB, rounded up.
+ *)
+external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
+let pages_to_mib pages = Int64.div (pages_to_kib pages) 1024L
+
+let _ = Callback.register_exception "xc.error" (Error "register_callback")
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xenctrl.mli
--- /dev/null
+++ b/tools/ocaml/libs/xc/xenctrl.mli
@@ -0,0 +1,184 @@
+(*
+ * Copyright (C) 2006-2007 XenSource Ltd.
+ * Copyright (C) 2008      Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ *)
+
+type domid = int
+type vcpuinfo = {
+  online : bool;
+  blocked : bool;
+  running : bool;
+  cputime : int64;
+  cpumap : int32;
+}
+type domaininfo = {
+  domid : domid;
+  dying : bool;
+  shutdown : bool;
+  paused : bool;
+  blocked : bool;
+  running : bool;
+  hvm_guest : bool;
+  shutdown_code : int;
+  total_memory_pages : nativeint;
+  max_memory_pages : nativeint;
+  shared_info_frame : int64;
+  cpu_time : int64;
+  nr_online_vcpus : int;
+  max_vcpu_id : int;
+  ssidref : int32;
+  handle : int array;
+}
+type sched_control = { weight : int; cap : int; }
+type physinfo_cap_flag = CAP_HVM | CAP_DirectIO
+type physinfo = {
+  threads_per_core : int;
+  cores_per_socket : int;
+  nr_cpus          : int;
+  max_node_id      : int;
+  cpu_khz          : int;
+  total_pages      : nativeint;
+  free_pages       : nativeint;
+  scrub_pages      : nativeint;
+  capabilities     : physinfo_cap_flag list;
+}
+type version = { major : int; minor : int; extra : string; }
+type compile_info = {
+  compiler : string;
+  compile_by : string;
+  compile_domain : string;
+  compile_date : string;
+}
+type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
+
+type domain_create_flag = CDF_HVM | CDF_HAP
+
+exception Error of string
+type handle
+external sizeof_core_header : unit -> int = "stub_sizeof_core_header"
+external sizeof_vcpu_guest_context : unit -> int
+  = "stub_sizeof_vcpu_guest_context"
+external sizeof_xen_pfn : unit -> int = "stub_sizeof_xen_pfn"
+external interface_open : unit -> handle = "stub_xc_interface_open"
+external is_fake : unit -> bool = "stub_xc_interface_is_fake"
+external interface_close : handle -> unit = "stub_xc_interface_close"
+val with_intf : (handle -> 'a) -> 'a
+external _domain_create : handle -> int32 -> domain_create_flag list -> int array -> domid
+  = "stub_xc_domain_create"
+val domain_create : handle -> int32 -> domain_create_flag list -> 'a Uuid.t -> domid
+external _domain_sethandle : handle -> domid -> int array -> unit
+  = "stub_xc_domain_sethandle"
+val domain_sethandle : handle -> domid -> 'a Uuid.t -> unit
+external domain_max_vcpus : handle -> domid -> int -> unit
+  = "stub_xc_domain_max_vcpus"
+external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause"
+external domain_unpause : handle -> domid -> unit = "stub_xc_domain_unpause"
+external domain_resume_fast : handle -> domid -> unit
+  = "stub_xc_domain_resume_fast"
+external domain_destroy : handle -> domid -> unit = "stub_xc_domain_destroy"
+external domain_shutdown : handle -> domid -> shutdown_reason -> unit
+  = "stub_xc_domain_shutdown"
+external _domain_getinfolist : handle -> domid -> int -> domaininfo list
+  = "stub_xc_domain_getinfolist"
+val domain_getinfolist : handle -> domid -> domaininfo list
+external domain_getinfo : handle -> domid -> domaininfo
+  = "stub_xc_domain_getinfo"
+external domain_get_vcpuinfo : handle -> int -> int -> vcpuinfo
+  = "stub_xc_vcpu_getinfo"
+external domain_ioport_permission: handle -> domid -> int -> int -> bool -> unit
+       = "stub_xc_domain_ioport_permission"
+external domain_iomem_permission: handle -> domid -> nativeint -> nativeint -> bool -> unit
+       = "stub_xc_domain_iomem_permission"
+external domain_irq_permission: handle -> domid -> int -> bool -> unit
+       = "stub_xc_domain_irq_permission"
+external vcpu_affinity_set : handle -> domid -> int -> bool array -> unit
+  = "stub_xc_vcpu_setaffinity"
+external vcpu_affinity_get : handle -> domid -> int -> bool array
+  = "stub_xc_vcpu_getaffinity"
+external vcpu_context_get : handle -> domid -> int -> string
+  = "stub_xc_vcpu_context_get"
+external sched_id : handle -> int = "stub_xc_sched_id"
+external sched_credit_domain_set : handle -> domid -> sched_control -> unit
+  = "stub_sched_credit_domain_set"
+external sched_credit_domain_get : handle -> domid -> sched_control
+  = "stub_sched_credit_domain_get"
+external shadow_allocation_set : handle -> domid -> int -> unit
+  = "stub_shadow_allocation_set"
+external shadow_allocation_get : handle -> domid -> int
+  = "stub_shadow_allocation_get"
+external evtchn_alloc_unbound : handle -> domid -> domid -> int
+  = "stub_xc_evtchn_alloc_unbound"
+external evtchn_reset : handle -> domid -> unit = "stub_xc_evtchn_reset"
+external readconsolering : handle -> string = "stub_xc_readconsolering"
+external send_debug_keys : handle -> string -> unit = "stub_xc_send_debug_keys"
+external physinfo : handle -> physinfo = "stub_xc_physinfo"
+external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
+external domain_setmaxmem : handle -> domid -> int64 -> unit
+  = "stub_xc_domain_setmaxmem"
+external domain_set_memmap_limit : handle -> domid -> int64 -> unit
+  = "stub_xc_domain_set_memmap_limit"
+external domain_memory_increase_reservation :
+  handle -> domid -> int64 -> unit
+  = "stub_xc_domain_memory_increase_reservation"
+external map_foreign_range :
+  handle -> domid -> int -> nativeint -> Xenmmap.mmap_interface
+  = "stub_map_foreign_range"
+external domain_get_pfn_list :
+  handle -> domid -> nativeint -> nativeint array
+  = "stub_xc_domain_get_pfn_list"
+
+external domain_assign_device: handle -> domid -> (int * int * int * int) -> unit
+       = "stub_xc_domain_assign_device"
+external domain_deassign_device: handle -> domid -> (int * int * int * int) -> unit
+       = "stub_xc_domain_deassign_device"
+external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool
+       = "stub_xc_domain_test_assign_device"
+
+external version : handle -> version = "stub_xc_version_version"
+external version_compile_info : handle -> compile_info
+  = "stub_xc_version_compile_info"
+external version_changeset : handle -> string = "stub_xc_version_changeset"
+external version_capabilities : handle -> string
+  = "stub_xc_version_capabilities"
+type core_magic = Magic_hvm | Magic_pv
+type core_header = {
+  xch_magic : core_magic;
+  xch_nr_vcpus : int;
+  xch_nr_pages : nativeint;
+  xch_index_offset : int64;
+  xch_ctxt_offset : int64;
+  xch_pages_offset : int64;
+}
+external marshall_core_header : core_header -> string
+  = "stub_marshall_core_header"
+val coredump : handle -> domid -> Unix.file_descr -> unit
+external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
+val pages_to_mib : int64 -> int64
+external watchdog : handle -> int -> int32 -> int
+  = "stub_xc_watchdog"
+
+external domain_set_machine_address_size: handle -> domid -> int -> unit
+  = "stub_xc_domain_set_machine_address_size"
+external domain_get_machine_address_size: handle -> domid -> int
+       = "stub_xc_domain_get_machine_address_size"
+
+external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
+                        -> string option array
+                        -> string option array
+       = "stub_xc_domain_cpuid_set"
+external domain_cpuid_apply_policy: handle -> domid -> unit
+       = "stub_xc_domain_cpuid_apply_policy"
+external cpuid_check: handle -> (int64 * (int64 option)) -> string option array -> (bool * string option array)
+       = "stub_xc_cpuid_check"
+
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xenctrl_stubs.c
--- /dev/null
+++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
@@ -0,0 +1,1161 @@
+/*
+ * Copyright (C) 2006-2007 XenSource Ltd.
+ * Copyright (C) 2008      Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+
+#define _XOPEN_SOURCE 600
+#include <stdlib.h>
+#include <errno.h>
+
+#define CAML_NAME_SPACE
+#include <caml/alloc.h>
+#include <caml/memory.h>
+#include <caml/signals.h>
+#include <caml/fail.h>
+#include <caml/callback.h>
+
+#include <sys/mman.h>
+#include <stdint.h>
+#include <string.h>
+
+#include <xenctrl.h>
+
+#include "mmap_stubs.h"
+
+#define PAGE_SHIFT		12
+#define PAGE_SIZE               (1UL << PAGE_SHIFT)
+#define PAGE_MASK               (~(PAGE_SIZE-1))
+
+#define _H(__h) ((xc_interface *)(__h))
+#define _D(__d) ((uint32_t)Int_val(__d))
+
+#define Val_none (Val_int(0))
+
+#define string_of_option_array(array, index) \
+	((Field(array, index) == Val_none) ? NULL : String_val(Field(Field(array, index), 0)))
+
+/* maybe here we should check the range of the input instead of blindly
+ * casting it to uint32 */
+#define cpuid_input_of_val(i1, i2, input) \
+	i1 = (uint32_t) Int64_val(Field(input, 0)); \
+	i2 = ((Field(input, 1) == Val_none) ? 0xffffffff : (uint32_t) Int64_val(Field(Field(input, 1), 0)));
+
+#define ERROR_STRLEN 1024
+void failwith_xc(xc_interface *xch)
+{
+	static char error_str[ERROR_STRLEN];
+	if (xch) {
+		const xc_error *error = xc_get_last_error(xch);
+		if (error->code == XC_ERROR_NONE)
+                	snprintf(error_str, ERROR_STRLEN, "%d: %s", errno, strerror(errno));
+		else
+			snprintf(error_str, ERROR_STRLEN, "%d: %s: %s",
+				 error->code,
+				 xc_error_code_to_desc(error->code),
+				 error->message);
+	} else {
+		snprintf(error_str, ERROR_STRLEN, "Unable to open XC interface");
+	}
+	caml_raise_with_string(*caml_named_value("xc.error"), error_str);
+}
+
+CAMLprim value stub_sizeof_core_header(value unit)
+{
+	CAMLparam1(unit);
+	CAMLreturn(Val_int(sizeof(struct xc_core_header)));
+}
+
+CAMLprim value stub_sizeof_vcpu_guest_context(value unit)
+{
+	CAMLparam1(unit);
+	CAMLreturn(Val_int(sizeof(struct vcpu_guest_context)));
+}
+
+CAMLprim value stub_sizeof_xen_pfn(value unit)
+{
+	CAMLparam1(unit);
+	CAMLreturn(Val_int(sizeof(xen_pfn_t)));
+}
+
+#define XC_CORE_MAGIC     0xF00FEBED
+#define XC_CORE_MAGIC_HVM 0xF00FEBEE
+
+CAMLprim value stub_marshall_core_header(value header)
+{
+	CAMLparam1(header);
+	CAMLlocal1(s);
+	struct xc_core_header c_header;
+
+	c_header.xch_magic = (Field(header, 0))
+		? XC_CORE_MAGIC
+		: XC_CORE_MAGIC_HVM;
+	c_header.xch_nr_vcpus = Int_val(Field(header, 1));
+	c_header.xch_nr_pages = Nativeint_val(Field(header, 2));
+	c_header.xch_ctxt_offset = Int64_val(Field(header, 3));
+	c_header.xch_index_offset = Int64_val(Field(header, 4));
+	c_header.xch_pages_offset = Int64_val(Field(header, 5));
+
+	s = caml_alloc_string(sizeof(c_header));
+	memcpy(String_val(s), (char *) &c_header, sizeof(c_header));
+	CAMLreturn(s);
+}
+
+CAMLprim value stub_xc_interface_open(void)
+{
+	CAMLparam0();
+        xc_interface *xch;
+        xch = xc_interface_open(NULL, NULL, XC_OPENFLAG_NON_REENTRANT);
+        if (xch == NULL)
+		failwith_xc(NULL);
+        CAMLreturn((value)xch);
+}
+
+
+CAMLprim value stub_xc_interface_is_fake(void)
+{
+	CAMLparam0();
+	int is_fake = xc_interface_is_fake();
+	CAMLreturn(Val_int(is_fake));
+}
+
+CAMLprim value stub_xc_interface_close(value xch)
+{
+	CAMLparam1(xch);
+
+	// caml_enter_blocking_section();
+	xc_interface_close(_H(xch));
+	// caml_leave_blocking_section();
+
+	CAMLreturn(Val_unit);
+}
+
+static int domain_create_flag_table[] = {
+	XEN_DOMCTL_CDF_hvm_guest,
+	XEN_DOMCTL_CDF_hap,
+};
+
+CAMLprim value stub_xc_domain_create(value xch, value ssidref,
+                                     value flags, value handle)
+{
+	CAMLparam4(xch, ssidref, flags, handle);
+
+	uint32_t domid = 0;
+	xen_domain_handle_t h = { 0 };
+	int result;
+	int i;
+	uint32_t c_ssidref = Int32_val(ssidref);
+	unsigned int c_flags = 0;
+	value l;
+
+        if (Wosize_val(handle) != 16)
+		caml_invalid_argument("Handle not a 16-integer array");
+
+	for (i = 0; i < sizeof(h); i++) {
+		h[i] = Int_val(Field(handle, i)) & 0xff;
+	}
+
+	for (l = flags; l != Val_none; l = Field(l, 1)) {
+		int v = Int_val(Field(l, 0));
+		c_flags |= domain_create_flag_table[v];
+	}
+
+	// caml_enter_blocking_section();
+	result = xc_domain_create(_H(xch), c_ssidref, h, c_flags, &domid);
+	// caml_leave_blocking_section();
+
+	if (result < 0)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(Val_int(domid));
+}
+
+CAMLprim value stub_xc_domain_max_vcpus(value xch, value domid,
+                                        value max_vcpus)
+{
+	CAMLparam3(xch, domid, max_vcpus);
+	int r;
+
+	r = xc_domain_max_vcpus(_H(xch), _D(domid), Int_val(max_vcpus));
+	if (r)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(Val_unit);
+}
+
+
+value stub_xc_domain_sethandle(value xch, value domid, value handle)
+{
+	CAMLparam3(xch, domid, handle);
+	xen_domain_handle_t h = { 0 };
+	int i;
+
+        if (Wosize_val(handle) != 16)
+		caml_invalid_argument("Handle not a 16-integer array");
+
+	for (i = 0; i < sizeof(h); i++) {
+		h[i] = Int_val(Field(handle, i)) & 0xff;
+	}
+
+	i = xc_domain_sethandle(_H(xch), _D(domid), h);
+	if (i)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(Val_unit);
+}
+
+static value dom_op(value xch, value domid, int (*fn)(xc_interface *, uint32_t))
+{
+	CAMLparam2(xch, domid);
+
+	uint32_t c_domid = _D(domid);
+
+	// caml_enter_blocking_section();
+	int result = fn(_H(xch), c_domid);
+	// caml_leave_blocking_section();
+        if (result)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_pause(value xch, value domid)
+{
+	return dom_op(xch, domid, xc_domain_pause);
+}
+
+
+CAMLprim value stub_xc_domain_unpause(value xch, value domid)
+{
+	return dom_op(xch, domid, xc_domain_unpause);
+}
+
+CAMLprim value stub_xc_domain_destroy(value xch, value domid)
+{
+	return dom_op(xch, domid, xc_domain_destroy);
+}
+
+CAMLprim value stub_xc_domain_resume_fast(value xch, value domid)
+{
+	CAMLparam2(xch, domid);
+
+	uint32_t c_domid = _D(domid);
+
+	// caml_enter_blocking_section();
+	int result = xc_domain_resume(_H(xch), c_domid, 1);
+	// caml_leave_blocking_section();
+        if (result)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_shutdown(value xch, value domid, value reason)
+{
+	CAMLparam3(xch, domid, reason);
+	int ret;
+
+	ret = xc_domain_shutdown(_H(xch), _D(domid), Int_val(reason));
+	if (ret < 0)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(Val_unit);
+}
+
+static value alloc_domaininfo(xc_domaininfo_t * info)
+{
+	CAMLparam0();
+	CAMLlocal2(result, tmp);
+	int i;
+
+	result = caml_alloc_tuple(16);
+
+	Store_field(result,  0, Val_int(info->domain));
+	Store_field(result,  1, Val_bool(info->flags & XEN_DOMINF_dying));
+	Store_field(result,  2, Val_bool(info->flags & XEN_DOMINF_shutdown));
+	Store_field(result,  3, Val_bool(info->flags & XEN_DOMINF_paused));
+	Store_field(result,  4, Val_bool(info->flags & XEN_DOMINF_blocked));
+	Store_field(result,  5, Val_bool(info->flags & XEN_DOMINF_running));
+	Store_field(result,  6, Val_bool(info->flags & XEN_DOMINF_hvm_guest));
+	Store_field(result,  7, Val_int((info->flags >> XEN_DOMINF_shutdownshift)
+	                                 & XEN_DOMINF_shutdownmask));
+	Store_field(result,  8, caml_copy_nativeint(info->tot_pages));
+	Store_field(result,  9, caml_copy_nativeint(info->max_pages));
+	Store_field(result, 10, caml_copy_int64(info->shared_info_frame));
+	Store_field(result, 11, caml_copy_int64(info->cpu_time));
+	Store_field(result, 12, Val_int(info->nr_online_vcpus));
+	Store_field(result, 13, Val_int(info->max_vcpu_id));
+	Store_field(result, 14, caml_copy_int32(info->ssidref));
+
+        tmp = caml_alloc_small(16, 0);
+	for (i = 0; i < 16; i++) {
+		Field(tmp, i) = Val_int(info->handle[i]);
+	}
+
+	Store_field(result, 15, tmp);
+
+	CAMLreturn(result);
+}
+
+CAMLprim value stub_xc_domain_getinfolist(value xch, value first_domain, value nb)
+{
+	CAMLparam3(xch, first_domain, nb);
+	CAMLlocal2(result, temp);
+	xc_domaininfo_t * info;
+	int i, ret, toalloc, retval;
+	unsigned int c_max_domains;
+	uint32_t c_first_domain;
+
+	/* get the minimum number of allocate byte we need and bump it up to page boundary */
+	toalloc = (sizeof(xc_domaininfo_t) * Int_val(nb)) | 0xfff;
+	ret = posix_memalign((void **) ((void *) &info), 4096, toalloc);
+	if (ret)
+		caml_raise_out_of_memory();
+
+	result = temp = Val_emptylist;
+
+	c_first_domain = _D(first_domain);
+	c_max_domains = Int_val(nb);
+	// caml_enter_blocking_section();
+	retval = xc_domain_getinfolist(_H(xch), c_first_domain,
+				       c_max_domains, info);
+	// caml_leave_blocking_section();
+
+	if (retval < 0) {
+		free(info);
+		failwith_xc(_H(xch));
+	}
+	for (i = 0; i < retval; i++) {
+		result = caml_alloc_small(2, Tag_cons);
+		Field(result, 0) = Val_int(0);
+		Field(result, 1) = temp;
+		temp = result;
+
+		Store_field(result, 0, alloc_domaininfo(info + i));
+	}
+
+	free(info);
+	CAMLreturn(result);
+}
+
+CAMLprim value stub_xc_domain_getinfo(value xch, value domid)
+{
+	CAMLparam2(xch, domid);
+	CAMLlocal1(result);
+	xc_domaininfo_t info;
+	int ret;
+
+	ret = xc_domain_getinfolist(_H(xch), _D(domid), 1, &info);
+	if (ret != 1)
+		failwith_xc(_H(xch));
+	if (info.domain != _D(domid))
+		failwith_xc(_H(xch));
+
+	result = alloc_domaininfo(&info);
+	CAMLreturn(result);
+}
+
+CAMLprim value stub_xc_vcpu_getinfo(value xch, value domid, value vcpu)
+{
+	CAMLparam3(xch, domid, vcpu);
+	CAMLlocal1(result);
+	xc_vcpuinfo_t info;
+	int retval;
+
+	uint32_t c_domid = _D(domid);
+	uint32_t c_vcpu = Int_val(vcpu);
+	// caml_enter_blocking_section();
+	retval = xc_vcpu_getinfo(_H(xch), c_domid,
+	                         c_vcpu, &info);
+	// caml_leave_blocking_section();
+	if (retval < 0)
+		failwith_xc(_H(xch));
+
+	result = caml_alloc_tuple(5);
+	Store_field(result, 0, Val_bool(info.online));
+	Store_field(result, 1, Val_bool(info.blocked));
+	Store_field(result, 2, Val_bool(info.running));
+	Store_field(result, 3, caml_copy_int64(info.cpu_time));
+	Store_field(result, 4, caml_copy_int32(info.cpu));
+
+	CAMLreturn(result);
+}
+
+CAMLprim value stub_xc_vcpu_context_get(value xch, value domid,
+                                        value cpu)
+{
+	CAMLparam3(xch, domid, cpu);
+	CAMLlocal1(context);
+	int ret;
+	vcpu_guest_context_any_t ctxt;
+
+	ret = xc_vcpu_getcontext(_H(xch), _D(domid), Int_val(cpu), &ctxt);
+
+	context = caml_alloc_string(sizeof(ctxt));
+	memcpy(String_val(context), (char *) &ctxt.c, sizeof(ctxt.c));
+
+	CAMLreturn(context);
+}
+
+static int get_cpumap_len(value xch, value cpumap)
+{
+	int ml_len = Wosize_val(cpumap);
+	int xc_len = xc_get_max_cpus(_H(xch));
+
+	if (ml_len < xc_len)
+		return ml_len;
+	else
+		return xc_len;
+}
+
+CAMLprim value stub_xc_vcpu_setaffinity(value xch, value domid,
+                                        value vcpu, value cpumap)
+{
+	CAMLparam4(xch, domid, vcpu, cpumap);
+	int i, len = get_cpumap_len(xch, cpumap);
+	xc_cpumap_t c_cpumap;
+	int retval;
+
+	c_cpumap = xc_cpumap_alloc(_H(xch));
+	if (c_cpumap == NULL)
+		failwith_xc(_H(xch));
+
+	for (i=0; i<len; i++) {
+		if (Bool_val(Field(cpumap, i)))
+			c_cpumap[i/8] |= i << (i&7);
+	}
+	retval = xc_vcpu_setaffinity(_H(xch), _D(domid),
+	                             Int_val(vcpu), c_cpumap);
+	free(c_cpumap);
+
+	if (retval < 0)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_vcpu_getaffinity(value xch, value domid,
+                                        value vcpu)
+{
+	CAMLparam3(xch, domid, vcpu);
+	CAMLlocal1(ret);
+	xc_cpumap_t c_cpumap;
+	int i, len = xc_get_max_cpus(_H(xch));
+	int retval;
+
+	c_cpumap = xc_cpumap_alloc(_H(xch));
+	if (c_cpumap == NULL)
+		failwith_xc(_H(xch));
+
+	retval = xc_vcpu_getaffinity(_H(xch), _D(domid),
+	                             Int_val(vcpu), c_cpumap);
+	free(c_cpumap);
+
+	if (retval < 0) {
+		free(c_cpumap);
+		failwith_xc(_H(xch));
+	}
+
+	ret = caml_alloc(len, 0);
+
+	for (i=0; i<len; i++) {
+		if (c_cpumap[i%8] & 1 << (i&7))
+			Store_field(ret, i, Val_true);
+		else
+			Store_field(ret, i, Val_false);
+	}
+
+	free(c_cpumap);
+
+	CAMLreturn(ret);
+}
+
+CAMLprim value stub_xc_sched_id(value xch)
+{
+	CAMLparam1(xch);
+	int sched_id;
+
+	if (xc_sched_id(_H(xch), &sched_id))
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_int(sched_id));
+}
+
+CAMLprim value stub_xc_evtchn_alloc_unbound(value xch,
+                                            value local_domid,
+                                            value remote_domid)
+{
+	CAMLparam3(xch, local_domid, remote_domid);
+
+	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,
+	                                     c_remote_domid);
+	// caml_leave_blocking_section();
+
+	if (result < 0)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_int(result));
+}
+
+CAMLprim value stub_xc_evtchn_reset(value xch, value domid)
+{
+	CAMLparam2(xch, domid);
+	int r;
+
+	r = xc_evtchn_reset(_H(xch), _D(domid));
+	if (r < 0)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_unit);
+}
+
+
+#define RING_SIZE 32768
+static char ring[RING_SIZE];
+
+CAMLprim value stub_xc_readconsolering(value xch)
+{
+	unsigned int size = RING_SIZE;
+	char *ring_ptr = ring;
+
+	CAMLparam1(xch);
+
+	// caml_enter_blocking_section();
+	int retval = xc_readconsolering(_H(xch), ring_ptr, &size, 0, 0, NULL);
+	// caml_leave_blocking_section();
+
+	if (retval)
+		failwith_xc(_H(xch));
+	ring[size] = '\0';
+	CAMLreturn(caml_copy_string(ring));
+}
+
+CAMLprim value stub_xc_send_debug_keys(value xch, value keys)
+{
+	CAMLparam2(xch, keys);
+	int r;
+
+	r = xc_send_debug_keys(_H(xch), String_val(keys));
+	if (r)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_physinfo(value xch)
+{
+	CAMLparam1(xch);
+	CAMLlocal3(physinfo, cap_list, tmp);
+	xc_physinfo_t c_physinfo;
+	int r;
+
+	// caml_enter_blocking_section();
+	r = xc_physinfo(_H(xch), &c_physinfo);
+	// caml_leave_blocking_section();
+
+	if (r)
+		failwith_xc(_H(xch));
+
+	tmp = cap_list = Val_emptylist;
+	for (r = 0; r < 2; r++) {
+		if ((c_physinfo.capabilities >> r) & 1) {
+			tmp = caml_alloc_small(2, Tag_cons);
+			Field(tmp, 0) = Val_int(r);
+			Field(tmp, 1) = cap_list;
+			cap_list = tmp;
+		}
+	}
+
+	physinfo = caml_alloc_tuple(9);
+	Store_field(physinfo, 0, Val_int(c_physinfo.threads_per_core));
+	Store_field(physinfo, 1, Val_int(c_physinfo.cores_per_socket));
+	Store_field(physinfo, 2, Val_int(c_physinfo.nr_cpus));
+	Store_field(physinfo, 3, Val_int(c_physinfo.max_node_id));
+	Store_field(physinfo, 4, Val_int(c_physinfo.cpu_khz));
+	Store_field(physinfo, 5, caml_copy_nativeint(c_physinfo.total_pages));
+	Store_field(physinfo, 6, caml_copy_nativeint(c_physinfo.free_pages));
+	Store_field(physinfo, 7, caml_copy_nativeint(c_physinfo.scrub_pages));
+	Store_field(physinfo, 8, cap_list);
+
+	CAMLreturn(physinfo);
+}
+
+CAMLprim value stub_xc_pcpu_info(value xch, value nr_cpus)
+{
+	CAMLparam2(xch, nr_cpus);
+	CAMLlocal2(pcpus, v);
+	xc_cpuinfo_t *info;
+	int r, size;
+
+	if (Int_val(nr_cpus) < 1)
+		caml_invalid_argument("nr_cpus");
+	
+	info = calloc(Int_val(nr_cpus) + 1, sizeof(*info));
+	if (!info)
+		caml_raise_out_of_memory();
+
+	// caml_enter_blocking_section();
+	r = xc_getcpuinfo(_H(xch), Int_val(nr_cpus), info, &size);
+	// caml_leave_blocking_section();
+
+	if (r) {
+		free(info);
+		failwith_xc(_H(xch));
+	}
+
+	if (size > 0) {
+		int i;
+		pcpus = caml_alloc(size, 0);
+		for (i = 0; i < size; i++) {
+			v = caml_copy_int64(info[i].idletime);
+			caml_modify(&Field(pcpus, i), v);
+		}
+	} else
+		pcpus = Atom(0);
+	free(info);
+	CAMLreturn(pcpus);
+}
+
+CAMLprim value stub_xc_domain_setmaxmem(value xch, value domid,
+                                        value max_memkb)
+{
+	CAMLparam3(xch, domid, max_memkb);
+
+	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,
+	                                 c_max_memkb);
+	// caml_leave_blocking_section();
+	if (retval)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_set_memmap_limit(value xch, value domid,
+                                               value map_limitkb)
+{
+	CAMLparam3(xch, domid, map_limitkb);
+	unsigned long v;
+	int retval;
+
+	v = Int64_val(map_limitkb);
+	retval = xc_domain_set_memmap_limit(_H(xch), _D(domid), v);
+	if (retval)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_memory_increase_reservation(value xch,
+                                                          value domid,
+                                                          value mem_kb)
+{
+	CAMLparam3(xch, domid, mem_kb);
+
+	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,
+							  nr_extents, 0, 0, NULL);
+	// caml_leave_blocking_section();
+
+	if (retval)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_set_machine_address_size(value xch,
+						       value domid,
+						       value width)
+{
+	CAMLparam3(xch, domid, width);
+	uint32_t c_domid = _D(domid);
+	int c_width = Int_val(width);
+
+	int retval = xc_domain_set_machine_address_size(_H(xch), c_domid, c_width);
+	if (retval)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_get_machine_address_size(value xch,
+                                                       value domid)
+{
+	CAMLparam2(xch, domid);
+	int retval;
+
+	retval = xc_domain_get_machine_address_size(_H(xch), _D(domid));
+	if (retval < 0)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_int(retval));
+}
+
+CAMLprim value stub_xc_domain_cpuid_set(value xch, value domid,
+                                        value input,
+                                        value config)
+{
+	CAMLparam4(xch, domid, input, config);
+	CAMLlocal2(array, tmp);
+	int r;
+	unsigned int c_input[2];
+	char *c_config[4], *out_config[4];
+
+	c_config[0] = string_of_option_array(config, 0);
+	c_config[1] = string_of_option_array(config, 1);
+	c_config[2] = string_of_option_array(config, 2);
+	c_config[3] = string_of_option_array(config, 3);
+
+	cpuid_input_of_val(c_input[0], c_input[1], input);
+
+	array = caml_alloc(4, 0);
+	for (r = 0; r < 4; r++) {
+		tmp = Val_none;
+		if (c_config[r]) {
+			tmp = caml_alloc_small(1, 0);
+			Field(tmp, 0) = caml_alloc_string(32);
+		}
+		Store_field(array, r, tmp);
+	}
+
+	for (r = 0; r < 4; r++)
+		out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL;
+
+	r = xc_cpuid_set(_H(xch), _D(domid),
+			 c_input, (const char **)c_config, out_config);
+	if (r < 0)
+		failwith_xc(_H(xch));
+	CAMLreturn(array);
+}
+
+CAMLprim value stub_xc_domain_cpuid_apply_policy(value xch, value domid)
+{
+	CAMLparam2(xch, domid);
+	int r;
+
+	r = xc_cpuid_apply_policy(_H(xch), _D(domid));
+	if (r < 0)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_cpuid_check(value xch, value input, value config)
+{
+	CAMLparam3(xch, input, config);
+	CAMLlocal3(ret, array, tmp);
+	int r;
+	unsigned int c_input[2];
+	char *c_config[4], *out_config[4];
+
+	c_config[0] = string_of_option_array(config, 0);
+	c_config[1] = string_of_option_array(config, 1);
+	c_config[2] = string_of_option_array(config, 2);
+	c_config[3] = string_of_option_array(config, 3);
+
+	cpuid_input_of_val(c_input[0], c_input[1], input);
+
+	array = caml_alloc(4, 0);
+	for (r = 0; r < 4; r++) {
+		tmp = Val_none;
+		if (c_config[r]) {
+			tmp = caml_alloc_small(1, 0);
+			Field(tmp, 0) = caml_alloc_string(32);
+		}
+		Store_field(array, r, tmp);
+	}
+
+	for (r = 0; r < 4; r++)
+		out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL;
+
+	r = xc_cpuid_check(_H(xch), c_input, (const char **)c_config, out_config);
+	if (r < 0)
+		failwith_xc(_H(xch));
+
+	ret = caml_alloc_tuple(2);
+	Store_field(ret, 0, Val_bool(r));
+	Store_field(ret, 1, array);
+
+	CAMLreturn(ret);
+}
+
+CAMLprim value stub_xc_version_version(value xch)
+{
+	CAMLparam1(xch);
+	CAMLlocal1(result);
+	xen_extraversion_t extra;
+	long packed;
+	int retval;
+
+	// caml_enter_blocking_section();
+	packed = xc_version(_H(xch), XENVER_version, NULL);
+	retval = xc_version(_H(xch), XENVER_extraversion, &extra);
+	// caml_leave_blocking_section();
+
+	if (retval)
+		failwith_xc(_H(xch));
+
+	result = caml_alloc_tuple(3);
+
+	Store_field(result, 0, Val_int(packed >> 16));
+	Store_field(result, 1, Val_int(packed & 0xffff));
+	Store_field(result, 2, caml_copy_string(extra));
+
+	CAMLreturn(result);
+}
+
+
+CAMLprim value stub_xc_version_compile_info(value xch)
+{
+	CAMLparam1(xch);
+	CAMLlocal1(result);
+	xen_compile_info_t ci;
+	int retval;
+
+	// caml_enter_blocking_section();
+	retval = xc_version(_H(xch), XENVER_compile_info, &ci);
+	// caml_leave_blocking_section();
+
+	if (retval)
+		failwith_xc(_H(xch));
+
+	result = caml_alloc_tuple(4);
+
+	Store_field(result, 0, caml_copy_string(ci.compiler));
+	Store_field(result, 1, caml_copy_string(ci.compile_by));
+	Store_field(result, 2, caml_copy_string(ci.compile_domain));
+	Store_field(result, 3, caml_copy_string(ci.compile_date));
+
+	CAMLreturn(result);
+}
+
+
+static value xc_version_single_string(value xch, int code, void *info)
+{
+	CAMLparam1(xch);
+	int retval;
+
+	// caml_enter_blocking_section();
+	retval = xc_version(_H(xch), code, info);
+	// caml_leave_blocking_section();
+
+	if (retval)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(caml_copy_string((char *)info));
+}
+
+
+CAMLprim value stub_xc_version_changeset(value xch)
+{
+	xen_changeset_info_t ci;
+
+	return xc_version_single_string(xch, XENVER_changeset, &ci);
+}
+
+
+CAMLprim value stub_xc_version_capabilities(value xch)
+{
+	xen_capabilities_info_t ci;
+
+	return xc_version_single_string(xch, XENVER_capabilities, &ci);
+}
+
+
+CAMLprim value stub_pages_to_kib(value pages)
+{
+	CAMLparam1(pages);
+
+	CAMLreturn(caml_copy_int64(Int64_val(pages) << (PAGE_SHIFT - 10)));
+}
+
+
+CAMLprim value stub_map_foreign_range(value xch, value dom,
+                                      value size, value mfn)
+{
+	CAMLparam4(xch, dom, size, mfn);
+	CAMLlocal1(result);
+	struct mmap_interface *intf;
+	uint32_t c_dom;
+	unsigned long c_mfn;
+
+	result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
+	intf = (struct mmap_interface *) result;
+
+	intf->len = Int_val(size);
+
+	c_dom = _D(dom);
+	c_mfn = Nativeint_val(mfn);
+	// 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();
+	if (!intf->addr)
+		caml_failwith("xc_map_foreign_range error");
+	CAMLreturn(result);
+}
+
+CAMLprim value stub_sched_credit_domain_get(value xch, value domid)
+{
+	CAMLparam2(xch, domid);
+	CAMLlocal1(sdom);
+	struct xen_domctl_sched_credit c_sdom;
+	int ret;
+
+	// caml_enter_blocking_section();
+	ret = xc_sched_credit_domain_get(_H(xch), _D(domid), &c_sdom);
+	// caml_leave_blocking_section();
+	if (ret != 0)
+		failwith_xc(_H(xch));
+
+	sdom = caml_alloc_tuple(2);
+	Store_field(sdom, 0, Val_int(c_sdom.weight));
+	Store_field(sdom, 1, Val_int(c_sdom.cap));
+
+	CAMLreturn(sdom);
+}
+
+CAMLprim value stub_sched_credit_domain_set(value xch, value domid,
+                                            value sdom)
+{
+	CAMLparam3(xch, domid, sdom);
+	struct xen_domctl_sched_credit c_sdom;
+	int ret;
+
+	c_sdom.weight = Int_val(Field(sdom, 0));
+	c_sdom.cap = Int_val(Field(sdom, 1));
+	// caml_enter_blocking_section();
+	ret = xc_sched_credit_domain_set(_H(xch), _D(domid), &c_sdom);
+	// caml_leave_blocking_section();
+	if (ret != 0)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_shadow_allocation_get(value xch, value domid)
+{
+	CAMLparam2(xch, domid);
+	CAMLlocal1(mb);
+	unsigned long c_mb;
+	int ret;
+
+	// 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();
+	if (ret != 0)
+		failwith_xc(_H(xch));
+
+	mb = Val_int(c_mb);
+	CAMLreturn(mb);
+}
+
+CAMLprim value stub_shadow_allocation_set(value xch, value domid,
+					  value mb)
+{
+	CAMLparam3(xch, domid, mb);
+	unsigned long c_mb;
+	int ret;
+
+	c_mb = Int_val(mb);
+	// 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();
+	if (ret != 0)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_get_pfn_list(value xch, value domid,
+                                           value nr_pfns)
+{
+	CAMLparam3(xch, domid, nr_pfns);
+	CAMLlocal2(array, v);
+	unsigned long c_nr_pfns;
+	long ret, i;
+	uint64_t *c_array;
+
+	c_nr_pfns = Nativeint_val(nr_pfns);
+
+	c_array = malloc(sizeof(uint64_t) * c_nr_pfns);
+	if (!c_array)
+		caml_raise_out_of_memory();
+
+	ret = xc_get_pfn_list(_H(xch), _D(domid),
+			      c_array, c_nr_pfns);
+	if (ret < 0) {
+		free(c_array);
+		failwith_xc(_H(xch));
+	}
+
+	array = caml_alloc(ret, 0);
+	for (i = 0; i < ret; i++) {
+		v = caml_copy_nativeint(c_array[i]);
+		Store_field(array, i, v);
+	}
+	free(c_array);
+
+	CAMLreturn(array);
+}
+
+CAMLprim value stub_xc_domain_ioport_permission(value xch, value domid,
+					       value start_port, value nr_ports,
+					       value allow)
+{
+	CAMLparam5(xch, domid, start_port, nr_ports, allow);
+	uint32_t c_start_port, c_nr_ports;
+	uint8_t c_allow;
+	int ret;
+
+	c_start_port = Int_val(start_port);
+	c_nr_ports = Int_val(nr_ports);
+	c_allow = Bool_val(allow);
+
+	ret = xc_domain_ioport_permission(_H(xch), _D(domid),
+					 c_start_port, c_nr_ports, c_allow);
+	if (ret < 0)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_iomem_permission(value xch, value domid,
+					       value start_pfn, value nr_pfns,
+					       value allow)
+{
+	CAMLparam5(xch, domid, start_pfn, nr_pfns, allow);
+	unsigned long c_start_pfn, c_nr_pfns;
+	uint8_t c_allow;
+	int ret;
+
+	c_start_pfn = Nativeint_val(start_pfn);
+	c_nr_pfns = Nativeint_val(nr_pfns);
+	c_allow = Bool_val(allow);
+
+	ret = xc_domain_iomem_permission(_H(xch), _D(domid),
+					 c_start_pfn, c_nr_pfns, c_allow);
+	if (ret < 0)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_irq_permission(value xch, value domid,
+					     value pirq, value allow)
+{
+	CAMLparam4(xch, domid, pirq, allow);
+	uint8_t c_pirq;
+	uint8_t c_allow;
+	int ret;
+
+	c_pirq = Int_val(pirq);
+	c_allow = Bool_val(allow);
+
+	ret = xc_domain_irq_permission(_H(xch), _D(domid),
+				       c_pirq, c_allow);
+	if (ret < 0)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(Val_unit);
+}
+
+static uint32_t pci_dev_to_bdf(int domain, int bus, int slot, int func)
+{
+	uint32_t bdf = 0;
+	bdf |= (bus & 0xff) << 16;
+	bdf |= (slot & 0x1f) << 11;
+	bdf |= (func & 0x7) << 8;
+	return bdf;
+}
+
+CAMLprim value stub_xc_domain_test_assign_device(value xch, value domid, value desc)
+{
+	CAMLparam3(xch, domid, desc);
+	int ret;
+	int domain, bus, slot, func;
+	uint32_t bdf;
+
+	domain = Int_val(Field(desc, 0));
+	bus = Int_val(Field(desc, 1));
+	slot = Int_val(Field(desc, 2));
+	func = Int_val(Field(desc, 3));
+	bdf = pci_dev_to_bdf(domain, bus, slot, func);
+
+	ret = xc_test_assign_device(_H(xch), _D(domid), bdf);
+
+	CAMLreturn(Val_bool(ret == 0));
+}
+
+CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value desc)
+{
+	CAMLparam3(xch, domid, desc);
+	int ret;
+	int domain, bus, slot, func;
+	uint32_t bdf;
+
+	domain = Int_val(Field(desc, 0));
+	bus = Int_val(Field(desc, 1));
+	slot = Int_val(Field(desc, 2));
+	func = Int_val(Field(desc, 3));
+	bdf = pci_dev_to_bdf(domain, bus, slot, func);
+
+	ret = xc_assign_device(_H(xch), _D(domid), bdf);
+
+	if (ret < 0)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_domain_deassign_device(value xch, value domid, value desc)
+{
+	CAMLparam3(xch, domid, desc);
+	int ret;
+	int domain, bus, slot, func;
+	uint32_t bdf;
+
+	domain = Int_val(Field(desc, 0));
+	bus = Int_val(Field(desc, 1));
+	slot = Int_val(Field(desc, 2));
+	func = Int_val(Field(desc, 3));
+	bdf = pci_dev_to_bdf(domain, bus, slot, func);
+
+	ret = xc_deassign_device(_H(xch), _D(domid), bdf);
+
+	if (ret < 0)
+		failwith_xc(_H(xch));
+	CAMLreturn(Val_unit);
+}
+
+CAMLprim value stub_xc_watchdog(value xch, value domid, value timeout)
+{
+	CAMLparam3(xch, domid, timeout);
+	int ret;
+	unsigned int c_timeout = Int32_val(timeout);
+
+	ret = xc_watchdog(_H(xch), _D(domid), c_timeout);
+	if (ret < 0)
+		failwith_xc(_H(xch));
+
+	CAMLreturn(Val_int(ret));
+}
+
+/*
+ * Local variables:
+ *  indent-tabs-mode: t
+ *  c-basic-offset: 8
+ *  tab-width: 8
+ * End:
+ */
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/Makefile
--- a/tools/ocaml/libs/xl/Makefile
+++ b/tools/ocaml/libs/xl/Makefile
@@ -6,44 +6,44 @@
 CFLAGS += -Wno-unused
 CFLAGS += $(CFLAGS_libxenlight)
 
-OBJS = xl
-INTF = xl.cmi
-LIBS = xl.cma xl.cmxa
+OBJS = xenlight
+INTF = xenlight.cmi
+LIBS = xenlight.cma xenlight.cmxa
 
-LIBS_xl = $(LDLIBS_libxenlight)
+LIBS_xenlight = $(LDLIBS_libxenlight)
 
-xl_OBJS = $(OBJS)
-xl_C_OBJS = xl_stubs
+xenlight_OBJS = $(OBJS)
+xenlight_C_OBJS = xenlight_stubs
 
-OCAML_LIBRARY = xl
+OCAML_LIBRARY = xenlight
 
-GENERATED_FILES += xl.ml xl.ml.tmp xl.mli xl.mli.tmp
+GENERATED_FILES += xenlight.ml xenlight.ml.tmp xenlight.mli xenlight.mli.tmp
 GENERATED_FILES += _libxl_types.ml.in _libxl_types.mli.in
 GENERATED_FILES += _libxl_types.inc
 
 all: $(INTF) $(LIBS)
 
-xl.ml: xl.ml.in _libxl_types.ml.in
+xenlight.ml: xenlight.ml.in _libxl_types.ml.in
 	$(Q)sed -e '1i\
 (*\
  * AUTO-GENERATED FILE DO NOT EDIT\
- * Generated from xl.ml.in and _libxl_types.ml.in\
+ * Generated from xenlight.ml.in and _libxl_types.ml.in\
  *)\
 ' \
 	    -e '/^(\* @@LIBXL_TYPES@@ \*)$$/r_libxl_types.ml.in' \
-	  < xl.ml.in > xl.ml.tmp
-	$(Q)mv xl.ml.tmp xl.ml
+	  < xenlight.ml.in > xenlight.ml.tmp
+	$(Q)mv xenlight.ml.tmp xenlight.ml
 
-xl.mli: xl.mli.in _libxl_types.mli.in
+xenlight.mli: xenlight.mli.in _libxl_types.mli.in
 	$(Q)sed -e '1i\
 (*\
  * AUTO-GENERATED FILE DO NOT EDIT\
- * Generated from xl.mli.in and _libxl_types.mli.in\
+ * Generated from xenlight.mli.in and _libxl_types.mli.in\
  *)\
 ' \
 	    -e '/^(\* @@LIBXL_TYPES@@ \*)$$/r_libxl_types.mli.in' \
-	  < xl.mli.in > xl.mli.tmp
-	$(Q)mv xl.mli.tmp xl.mli
+	  < xenlight.mli.in > xenlight.mli.tmp
+	$(Q)mv xenlight.mli.tmp xenlight.mli
 
 _libxl_types.ml.in _libxl_types.mli.in _libxl_types.inc: genwrap.py $(XEN_ROOT)/tools/libxl/libxl_types.idl \
                 $(XEN_ROOT)/tools/libxl/libxltypes.py
@@ -56,11 +56,11 @@
 .PHONY: install
 install: $(LIBS) META
 	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xl
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xl META $(INTF) $(LIBS) *.a *.so *.cmx
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenlight
+	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenlight META $(INTF) $(LIBS) *.a *.so *.cmx
 
 .PHONY: uninstall
 uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xl
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenlight
 
 include $(TOPLEVEL)/Makefile.rules
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xenlight.ml.in
--- /dev/null
+++ b/tools/ocaml/libs/xl/xenlight.ml.in
@@ -0,0 +1,39 @@
+(*
+ * Copyright (C) 2009-2011 Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ *)
+
+exception Error of string
+
+type domid = int
+
+(* @@LIBXL_TYPES@@ *)
+
+module Topologyinfo = struct
+	type t =
+	{
+		core : int;
+		socket : int;
+		node : int;
+	}
+	external get : unit -> t = "stub_xl_topologyinfo"
+end
+
+external button_press : domid -> button -> unit = "stub_xl_button_press"
+
+
+external send_trigger : domid -> string -> int -> unit = "stub_xl_send_trigger"
+external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
+external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys"
+
+let _ = Callback.register_exception "xl.error" (Error "register_callback")
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xenlight.mli.in
--- /dev/null
+++ b/tools/ocaml/libs/xl/xenlight.mli.in
@@ -0,0 +1,36 @@
+(*
+ * Copyright (C) 2009-2011 Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ *)
+
+exception Error of string
+
+type domid = int
+
+(* @@LIBXL_TYPES@@ *)
+
+module Topologyinfo : sig
+	type t =
+	{
+		core : int;
+		socket : int;
+		node : int;
+	}
+	external get : unit -> t = "stub_xl_topologyinfo"
+end
+
+external button_press : domid -> button -> unit = "stub_xl_button_press"
+
+external send_trigger : domid -> string -> int -> unit = "stub_xl_send_trigger"
+external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
+external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xenlight_stubs.c
--- /dev/null
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c
@@ -0,0 +1,596 @@
+/*
+ * Copyright (C) 2009-2011 Citrix Ltd.
+ * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+
+#include <stdlib.h>
+
+#define CAML_NAME_SPACE
+#include <caml/alloc.h>
+#include <caml/memory.h>
+#include <caml/signals.h>
+#include <caml/fail.h>
+#include <caml/callback.h>
+
+#include <sys/mman.h>
+#include <stdint.h>
+#include <string.h>
+
+#include <libxl.h>
+
+struct caml_logger {
+	struct xentoollog_logger logger;
+	int log_offset;
+	char log_buf[2048];
+};
+
+typedef struct caml_gc {
+	int offset;
+	void *ptrs[64];
+} caml_gc;
+
+static void log_vmessage(struct xentoollog_logger *logger, xentoollog_level level,
+                  int errnoval, const char *context, const char *format, va_list al)
+{
+	struct caml_logger *ologger = (struct caml_logger *) logger;
+
+	ologger->log_offset += vsnprintf(ologger->log_buf + ologger->log_offset,
+	                                 2048 - ologger->log_offset, format, al);
+}
+
+static void log_destroy(struct xentoollog_logger *logger)
+{
+}
+
+#define INIT_STRUCT() libxl_ctx *ctx; struct caml_logger lg; struct caml_gc gc; gc.offset = 0;
+
+#define INIT_CTX()  \
+	lg.logger.vmessage = log_vmessage; \
+	lg.logger.destroy = log_destroy; \
+	lg.logger.progress = NULL; \
+	caml_enter_blocking_section(); \
+	ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, (struct xentoollog_logger *) &lg); \
+	if (ret != 0) \
+		failwith_xl("cannot init context", &lg);
+
+#define FREE_CTX()  \
+	gc_free(&gc); \
+	caml_leave_blocking_section(); \
+	libxl_ctx_free(ctx)
+
+static char * dup_String_val(caml_gc *gc, value s)
+{
+	int len;
+	char *c;
+	len = caml_string_length(s);
+	c = calloc(len + 1, sizeof(char));
+	if (!c)
+		caml_raise_out_of_memory();
+	gc->ptrs[gc->offset++] = c;
+	memcpy(c, String_val(s), len);
+	return c;
+}
+
+static void gc_free(caml_gc *gc)
+{
+	int i;
+	for (i = 0; i < gc->offset; i++) {
+		free(gc->ptrs[i]);
+	}
+}
+
+static void failwith_xl(char *fname, struct caml_logger *lg)
+{
+	char *s;
+	s = (lg) ? lg->log_buf : fname;
+	caml_raise_with_string(*caml_named_value("xl.error"), s);
+}
+
+#if 0 /* TODO: wrap libxl_domain_create(), these functions will be needed then */
+static void * gc_calloc(caml_gc *gc, size_t nmemb, size_t size)
+{
+	void *ptr;
+	ptr = calloc(nmemb, size);
+	if (!ptr)
+		caml_raise_out_of_memory();
+	gc->ptrs[gc->offset++] = ptr;
+	return ptr;
+}
+
+static int string_string_tuple_array_val (caml_gc *gc, char ***c_val, value v)
+{
+	CAMLparam1(v);
+	CAMLlocal1(a);
+	int i;
+	char **array;
+
+	for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1)) { i++; }
+
+	array = gc_calloc(gc, (i + 1) * 2, sizeof(char *));
+	if (!array)
+		return 1;
+	for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1), i++) {
+		value b = Field(a, 0);
+		array[i * 2] = dup_String_val(gc, Field(b, 0));
+		array[i * 2 + 1] = dup_String_val(gc, Field(b, 1));
+	}
+	*c_val = array;
+	CAMLreturn(0);
+}
+
+#endif
+
+static value Val_mac (libxl_mac *c_val)
+{
+	CAMLparam0();
+	CAMLlocal1(v);
+	int i;
+
+	v = caml_alloc_tuple(6);
+
+	for(i=0; i<6; i++)
+		Store_field(v, i, Val_int((*c_val)[i]));
+
+	CAMLreturn(v);
+}
+
+static int Mac_val(caml_gc *gc, struct caml_logger *lg, libxl_mac *c_val, value v)
+{
+	CAMLparam1(v);
+	int i;
+
+	for(i=0; i<6; i++)
+		(*c_val)[i] = Int_val(Field(v, i));
+
+	CAMLreturn(0);
+}
+
+static value Val_uuid (libxl_uuid *c_val)
+{
+	CAMLparam0();
+	CAMLlocal1(v);
+	uint8_t *uuid = libxl_uuid_bytearray(c_val);
+	int i;
+
+	v = caml_alloc_tuple(16);
+
+	for(i=0; i<16; i++)
+		Store_field(v, i, Val_int(uuid[i]));
+
+	CAMLreturn(v);
+}
+
+static int Uuid_val(caml_gc *gc, struct caml_logger *lg, libxl_uuid *c_val, value v)
+{
+	CAMLparam1(v);
+	int i;
+	uint8_t *uuid = libxl_uuid_bytearray(c_val);
+
+	for(i=0; i<16; i++)
+		uuid[i] = Int_val(Field(v, i));
+
+	CAMLreturn(0);
+}
+
+static value Val_hwcap(libxl_hwcap *c_val)
+{
+	CAMLparam0();
+	CAMLlocal1(hwcap);
+	int i;
+
+	hwcap = caml_alloc_tuple(8);
+	for (i = 0; i < 8; i++)
+		Store_field(hwcap, i, caml_copy_int32((*c_val)[i]));
+
+	CAMLreturn(hwcap);
+}
+
+#include "_libxl_types.inc"
+
+static value Val_topologyinfo(libxl_topologyinfo *c_val)
+{
+	CAMLparam0();
+	CAMLlocal3(v, topology, topologyinfo);
+	int i;
+
+	topologyinfo = caml_alloc_tuple(c_val->coremap.entries);
+	for (i = 0; i < c_val->coremap.entries; i++) {
+		v = Val_int(0); /* None */
+		if (c_val->coremap.array[i] != LIBXL_CPUARRAY_INVALID_ENTRY) {
+			topology = caml_alloc_tuple(3);
+			Store_field(topology, 0, Val_int(c_val->coremap.array[i]));
+			Store_field(topology, 1, Val_int(c_val->socketmap.array[i]));
+			Store_field(topology, 2, Val_int(c_val->nodemap.array[i]));
+			v = caml_alloc(1, 0); /* Some */
+			Store_field(v, 0, topology);
+		}
+		Store_field(topologyinfo, i, v);
+	}
+
+	CAMLreturn(topologyinfo);
+}
+
+value stub_xl_device_disk_add(value info, value domid)
+{
+	CAMLparam2(info, domid);
+	libxl_device_disk c_info;
+	int ret;
+	INIT_STRUCT();
+
+	device_disk_val(&gc, &lg, &c_info, info);
+
+	INIT_CTX();
+	ret = libxl_device_disk_add(ctx, Int_val(domid), &c_info);
+	if (ret != 0)
+		failwith_xl("disk_add", &lg);
+	FREE_CTX();
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_disk_del(value info, value domid)
+{
+	CAMLparam2(info, domid);
+	libxl_device_disk c_info;
+	int ret;
+	INIT_STRUCT();
+
+	device_disk_val(&gc, &lg, &c_info, info);
+
+	INIT_CTX();
+	ret = libxl_device_disk_del(ctx, Int_val(domid), &c_info, 0);
+	if (ret != 0)
+		failwith_xl("disk_del", &lg);
+	FREE_CTX();
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_nic_add(value info, value domid)
+{
+	CAMLparam2(info, domid);
+	libxl_device_nic c_info;
+	int ret;
+	INIT_STRUCT();
+
+	device_nic_val(&gc, &lg, &c_info, info);
+
+	INIT_CTX();
+	ret = libxl_device_nic_add(ctx, Int_val(domid), &c_info);
+	if (ret != 0)
+		failwith_xl("nic_add", &lg);
+	FREE_CTX();
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_nic_del(value info, value domid)
+{
+	CAMLparam2(info, domid);
+	libxl_device_nic c_info;
+	int ret;
+	INIT_STRUCT();
+
+	device_nic_val(&gc, &lg, &c_info, info);
+
+	INIT_CTX();
+	ret = libxl_device_nic_del(ctx, Int_val(domid), &c_info, 0);
+	if (ret != 0)
+		failwith_xl("nic_del", &lg);
+	FREE_CTX();
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_console_add(value info, value domid)
+{
+	CAMLparam2(info, domid);
+	libxl_device_console c_info;
+	int ret;
+	INIT_STRUCT();
+
+	device_console_val(&gc, &lg, &c_info, info);
+
+	INIT_CTX();
+	ret = libxl_device_console_add(ctx, Int_val(domid), &c_info);
+	if (ret != 0)
+		failwith_xl("console_add", &lg);
+	FREE_CTX();
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vkb_add(value info, value domid)
+{
+	CAMLparam2(info, domid);
+	libxl_device_vkb c_info;
+	int ret;
+	INIT_STRUCT();
+
+	device_vkb_val(&gc, &lg, &c_info, info);
+
+	INIT_CTX();
+	ret = libxl_device_vkb_add(ctx, Int_val(domid), &c_info);
+	if (ret != 0)
+		failwith_xl("vkb_add", &lg);
+	FREE_CTX();
+
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vkb_clean_shutdown(value domid)
+{
+	CAMLparam1(domid);
+	int ret;
+	INIT_STRUCT();
+
+	INIT_CTX();
+	ret = libxl_device_vkb_clean_shutdown(ctx, Int_val(domid));
+	if (ret != 0)
+		failwith_xl("vkb_clean_shutdown", &lg);
+	FREE_CTX();
+
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vkb_hard_shutdown(value domid)
+{
+	CAMLparam1(domid);
+	int ret;
+	INIT_STRUCT();
+
+	INIT_CTX();
+	ret = libxl_device_vkb_hard_shutdown(ctx, Int_val(domid));
+	if (ret != 0)
+		failwith_xl("vkb_hard_shutdown", &lg);
+	FREE_CTX();
+
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vfb_add(value info, value domid)
+{
+	CAMLparam2(info, domid);
+	libxl_device_vfb c_info;
+	int ret;
+	INIT_STRUCT();
+
+	device_vfb_val(&gc, &lg, &c_info, info);
+
+	INIT_CTX();
+	ret = libxl_device_vfb_add(ctx, Int_val(domid), &c_info);
+	if (ret != 0)
+		failwith_xl("vfb_add", &lg);
+	FREE_CTX();
+
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vfb_clean_shutdown(value domid)
+{
+	CAMLparam1(domid);
+	int ret;
+	INIT_STRUCT();
+
+	INIT_CTX();
+	ret = libxl_device_vfb_clean_shutdown(ctx, Int_val(domid));
+	if (ret != 0)
+		failwith_xl("vfb_clean_shutdown", &lg);
+	FREE_CTX();
+
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_vfb_hard_shutdown(value domid)
+{
+	CAMLparam1(domid);
+	int ret;
+	INIT_STRUCT();
+
+	INIT_CTX();
+	ret = libxl_device_vfb_hard_shutdown(ctx, Int_val(domid));
+	if (ret != 0)
+		failwith_xl("vfb_hard_shutdown", &lg);
+	FREE_CTX();
+
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_pci_add(value info, value domid)
+{
+	CAMLparam2(info, domid);
+	libxl_device_pci c_info;
+	int ret;
+	INIT_STRUCT();
+
+	device_pci_val(&gc, &lg, &c_info, info);
+
+	INIT_CTX();
+	ret = libxl_device_pci_add(ctx, Int_val(domid), &c_info);
+	if (ret != 0)
+		failwith_xl("pci_add", &lg);
+	FREE_CTX();
+
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_pci_remove(value info, value domid)
+{
+	CAMLparam2(info, domid);
+	libxl_device_pci c_info;
+	int ret;
+	INIT_STRUCT();
+
+	device_pci_val(&gc, &lg, &c_info, info);
+
+	INIT_CTX();
+	ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info, 0);
+	if (ret != 0)
+		failwith_xl("pci_remove", &lg);
+	FREE_CTX();
+
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_device_pci_shutdown(value domid)
+{
+	CAMLparam1(domid);
+	int ret;
+	INIT_STRUCT();
+
+	INIT_CTX();
+	ret = libxl_device_pci_shutdown(ctx, Int_val(domid));
+	if (ret != 0)
+		failwith_xl("pci_shutdown", &lg);
+	FREE_CTX();
+
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_button_press(value domid, value button)
+{
+	CAMLparam2(domid, button);
+	int ret;
+	INIT_STRUCT();
+
+	INIT_CTX();
+	ret = libxl_button_press(ctx, Int_val(domid), Int_val(button) + LIBXL_BUTTON_POWER);
+	if (ret != 0)
+		failwith_xl("button_press", &lg);
+	FREE_CTX();
+
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_physinfo_get(value unit)
+{
+	CAMLparam1(unit);
+	CAMLlocal1(physinfo);
+	libxl_physinfo c_physinfo;
+	int ret;
+	INIT_STRUCT();
+
+	INIT_CTX();
+	ret = libxl_get_physinfo(ctx, &c_physinfo);
+	if (ret != 0)
+		failwith_xl("physinfo", &lg);
+	FREE_CTX();
+
+	physinfo = Val_physinfo(&gc, &lg, &c_physinfo);
+	CAMLreturn(physinfo);
+}
+
+value stub_xl_topologyinfo(value unit)
+{
+	CAMLparam1(unit);
+	CAMLlocal1(topologyinfo);
+	libxl_topologyinfo c_topologyinfo;
+	int ret;
+	INIT_STRUCT();
+
+	INIT_CTX();
+	ret = libxl_get_topologyinfo(ctx, &c_topologyinfo);
+	if (ret != 0)
+		failwith_xl("topologyinfo", &lg);
+	FREE_CTX();
+
+	topologyinfo = Val_topologyinfo(&c_topologyinfo);
+	CAMLreturn(topologyinfo);
+}
+
+value stub_xl_sched_credit_domain_get(value domid)
+{
+	CAMLparam1(domid);
+	CAMLlocal1(scinfo);
+	libxl_sched_credit c_scinfo;
+	int ret;
+	INIT_STRUCT();
+
+	INIT_CTX();
+	ret = libxl_sched_credit_domain_get(ctx, Int_val(domid), &c_scinfo);
+	if (ret != 0)
+		failwith_xl("sched_credit_domain_get", &lg);
+	FREE_CTX();
+
+	scinfo = Val_sched_credit(&gc, &lg, &c_scinfo);
+	CAMLreturn(scinfo);
+}
+
+value stub_xl_sched_credit_domain_set(value domid, value scinfo)
+{
+	CAMLparam2(domid, scinfo);
+	libxl_sched_credit c_scinfo;
+	int ret;
+	INIT_STRUCT();
+
+	sched_credit_val(&gc, &lg, &c_scinfo, scinfo);
+
+	INIT_CTX();
+	ret = libxl_sched_credit_domain_set(ctx, Int_val(domid), &c_scinfo);
+	if (ret != 0)
+		failwith_xl("sched_credit_domain_set", &lg);
+	FREE_CTX();
+
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_send_trigger(value domid, value trigger, value vcpuid)
+{
+	CAMLparam3(domid, trigger, vcpuid);
+	int ret;
+	char *c_trigger;
+	INIT_STRUCT();
+
+	c_trigger = dup_String_val(&gc, trigger);
+
+	INIT_CTX();
+	ret = libxl_send_trigger(ctx, Int_val(domid), c_trigger, Int_val(vcpuid));
+	if (ret != 0)
+		failwith_xl("send_trigger", &lg);
+	FREE_CTX();
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_send_sysrq(value domid, value sysrq)
+{
+	CAMLparam2(domid, sysrq);
+	int ret;
+	INIT_STRUCT();
+
+	INIT_CTX();
+	ret = libxl_send_sysrq(ctx, Int_val(domid), Int_val(sysrq));
+	if (ret != 0)
+		failwith_xl("send_sysrq", &lg);
+	FREE_CTX();
+	CAMLreturn(Val_unit);
+}
+
+value stub_xl_send_debug_keys(value keys)
+{
+	CAMLparam1(keys);
+	int ret;
+	char *c_keys;
+	INIT_STRUCT();
+
+	c_keys = dup_String_val(&gc, keys);
+
+	INIT_CTX();
+	ret = libxl_send_debug_keys(ctx, c_keys);
+	if (ret != 0)
+		failwith_xl("send_debug_keys", &lg);
+	FREE_CTX();
+	CAMLreturn(Val_unit);
+}
+
+/*
+ * Local variables:
+ *  indent-tabs-mode: t
+ *  c-basic-offset: 8
+ *  tab-width: 8
+ * End:
+ */
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xl.ml.in
--- a/tools/ocaml/libs/xl/xl.ml.in
+++ /dev/null
@@ -1,39 +0,0 @@
-(*
- * Copyright (C) 2009-2011 Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-exception Error of string
-
-type domid = int
-
-(* @@LIBXL_TYPES@@ *)
-
-module Topologyinfo = struct
-	type t =
-	{
-		core : int;
-		socket : int;
-		node : int;
-	}
-	external get : unit -> t = "stub_xl_topologyinfo"
-end
-
-external button_press : domid -> button -> unit = "stub_xl_button_press"
-
-
-external send_trigger : domid -> string -> int -> unit = "stub_xl_send_trigger"
-external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
-external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys"
-
-let _ = Callback.register_exception "xl.error" (Error "register_callback")
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xl.mli.in
--- a/tools/ocaml/libs/xl/xl.mli.in
+++ /dev/null
@@ -1,36 +0,0 @@
-(*
- * Copyright (C) 2009-2011 Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- *)
-
-exception Error of string
-
-type domid = int
-
-(* @@LIBXL_TYPES@@ *)
-
-module Topologyinfo : sig
-	type t =
-	{
-		core : int;
-		socket : int;
-		node : int;
-	}
-	external get : unit -> t = "stub_xl_topologyinfo"
-end
-
-external button_press : domid -> button -> unit = "stub_xl_button_press"
-
-external send_trigger : domid -> string -> int -> unit = "stub_xl_send_trigger"
-external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
-external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xl_stubs.c
--- a/tools/ocaml/libs/xl/xl_stubs.c
+++ /dev/null
@@ -1,596 +0,0 @@
-/*
- * Copyright (C) 2009-2011 Citrix Ltd.
- * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
- *
- * This program 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 only. with the special
- * exception on linking described in file LICENSE.
- *
- * This program 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.
- */
-
-#include <stdlib.h>
-
-#define CAML_NAME_SPACE
-#include <caml/alloc.h>
-#include <caml/memory.h>
-#include <caml/signals.h>
-#include <caml/fail.h>
-#include <caml/callback.h>
-
-#include <sys/mman.h>
-#include <stdint.h>
-#include <string.h>
-
-#include <libxl.h>
-
-struct caml_logger {
-	struct xentoollog_logger logger;
-	int log_offset;
-	char log_buf[2048];
-};
-
-typedef struct caml_gc {
-	int offset;
-	void *ptrs[64];
-} caml_gc;
-
-static void log_vmessage(struct xentoollog_logger *logger, xentoollog_level level,
-                  int errnoval, const char *context, const char *format, va_list al)
-{
-	struct caml_logger *ologger = (struct caml_logger *) logger;
-
-	ologger->log_offset += vsnprintf(ologger->log_buf + ologger->log_offset,
-	                                 2048 - ologger->log_offset, format, al);
-}
-
-static void log_destroy(struct xentoollog_logger *logger)
-{
-}
-
-#define INIT_STRUCT() libxl_ctx *ctx; struct caml_logger lg; struct caml_gc gc; gc.offset = 0;
-
-#define INIT_CTX()  \
-	lg.logger.vmessage = log_vmessage; \
-	lg.logger.destroy = log_destroy; \
-	lg.logger.progress = NULL; \
-	caml_enter_blocking_section(); \
-	ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, (struct xentoollog_logger *) &lg); \
-	if (ret != 0) \
-		failwith_xl("cannot init context", &lg);
-
-#define FREE_CTX()  \
-	gc_free(&gc); \
-	caml_leave_blocking_section(); \
-	libxl_ctx_free(ctx)
-
-static char * dup_String_val(caml_gc *gc, value s)
-{
-	int len;
-	char *c;
-	len = caml_string_length(s);
-	c = calloc(len + 1, sizeof(char));
-	if (!c)
-		caml_raise_out_of_memory();
-	gc->ptrs[gc->offset++] = c;
-	memcpy(c, String_val(s), len);
-	return c;
-}
-
-static void gc_free(caml_gc *gc)
-{
-	int i;
-	for (i = 0; i < gc->offset; i++) {
-		free(gc->ptrs[i]);
-	}
-}
-
-static void failwith_xl(char *fname, struct caml_logger *lg)
-{
-	char *s;
-	s = (lg) ? lg->log_buf : fname;
-	caml_raise_with_string(*caml_named_value("xl.error"), s);
-}
-
-#if 0 /* TODO: wrap libxl_domain_create(), these functions will be needed then */
-static void * gc_calloc(caml_gc *gc, size_t nmemb, size_t size)
-{
-	void *ptr;
-	ptr = calloc(nmemb, size);
-	if (!ptr)
-		caml_raise_out_of_memory();
-	gc->ptrs[gc->offset++] = ptr;
-	return ptr;
-}
-
-static int string_string_tuple_array_val (caml_gc *gc, char ***c_val, value v)
-{
-	CAMLparam1(v);
-	CAMLlocal1(a);
-	int i;
-	char **array;
-
-	for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1)) { i++; }
-
-	array = gc_calloc(gc, (i + 1) * 2, sizeof(char *));
-	if (!array)
-		return 1;
-	for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1), i++) {
-		value b = Field(a, 0);
-		array[i * 2] = dup_String_val(gc, Field(b, 0));
-		array[i * 2 + 1] = dup_String_val(gc, Field(b, 1));
-	}
-	*c_val = array;
-	CAMLreturn(0);
-}
-
-#endif
-
-static value Val_mac (libxl_mac *c_val)
-{
-	CAMLparam0();
-	CAMLlocal1(v);
-	int i;
-
-	v = caml_alloc_tuple(6);
-
-	for(i=0; i<6; i++)
-		Store_field(v, i, Val_int((*c_val)[i]));
-
-	CAMLreturn(v);
-}
-
-static int Mac_val(caml_gc *gc, struct caml_logger *lg, libxl_mac *c_val, value v)
-{
-	CAMLparam1(v);
-	int i;
-
-	for(i=0; i<6; i++)
-		(*c_val)[i] = Int_val(Field(v, i));
-
-	CAMLreturn(0);
-}
-
-static value Val_uuid (libxl_uuid *c_val)
-{
-	CAMLparam0();
-	CAMLlocal1(v);
-	uint8_t *uuid = libxl_uuid_bytearray(c_val);
-	int i;
-
-	v = caml_alloc_tuple(16);
-
-	for(i=0; i<16; i++)
-		Store_field(v, i, Val_int(uuid[i]));
-
-	CAMLreturn(v);
-}
-
-static int Uuid_val(caml_gc *gc, struct caml_logger *lg, libxl_uuid *c_val, value v)
-{
-	CAMLparam1(v);
-	int i;
-	uint8_t *uuid = libxl_uuid_bytearray(c_val);
-
-	for(i=0; i<16; i++)
-		uuid[i] = Int_val(Field(v, i));
-
-	CAMLreturn(0);
-}
-
-static value Val_hwcap(libxl_hwcap *c_val)
-{
-	CAMLparam0();
-	CAMLlocal1(hwcap);
-	int i;
-
-	hwcap = caml_alloc_tuple(8);
-	for (i = 0; i < 8; i++)
-		Store_field(hwcap, i, caml_copy_int32((*c_val)[i]));
-
-	CAMLreturn(hwcap);
-}
-
-#include "_libxl_types.inc"
-
-static value Val_topologyinfo(libxl_topologyinfo *c_val)
-{
-	CAMLparam0();
-	CAMLlocal3(v, topology, topologyinfo);
-	int i;
-
-	topologyinfo = caml_alloc_tuple(c_val->coremap.entries);
-	for (i = 0; i < c_val->coremap.entries; i++) {
-		v = Val_int(0); /* None */
-		if (c_val->coremap.array[i] != LIBXL_CPUARRAY_INVALID_ENTRY) {
-			topology = caml_alloc_tuple(3);
-			Store_field(topology, 0, Val_int(c_val->coremap.array[i]));
-			Store_field(topology, 1, Val_int(c_val->socketmap.array[i]));
-			Store_field(topology, 2, Val_int(c_val->nodemap.array[i]));
-			v = caml_alloc(1, 0); /* Some */
-			Store_field(v, 0, topology);
-		}
-		Store_field(topologyinfo, i, v);
-	}
-
-	CAMLreturn(topologyinfo);
-}
-
-value stub_xl_device_disk_add(value info, value domid)
-{
-	CAMLparam2(info, domid);
-	libxl_device_disk c_info;
-	int ret;
-	INIT_STRUCT();
-
-	device_disk_val(&gc, &lg, &c_info, info);
-
-	INIT_CTX();
-	ret = libxl_device_disk_add(ctx, Int_val(domid), &c_info);
-	if (ret != 0)
-		failwith_xl("disk_add", &lg);
-	FREE_CTX();
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_disk_del(value info, value domid)
-{
-	CAMLparam2(info, domid);
-	libxl_device_disk c_info;
-	int ret;
-	INIT_STRUCT();
-
-	device_disk_val(&gc, &lg, &c_info, info);
-
-	INIT_CTX();
-	ret = libxl_device_disk_del(ctx, Int_val(domid), &c_info, 0);
-	if (ret != 0)
-		failwith_xl("disk_del", &lg);
-	FREE_CTX();
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_nic_add(value info, value domid)
-{
-	CAMLparam2(info, domid);
-	libxl_device_nic c_info;
-	int ret;
-	INIT_STRUCT();
-
-	device_nic_val(&gc, &lg, &c_info, info);
-
-	INIT_CTX();
-	ret = libxl_device_nic_add(ctx, Int_val(domid), &c_info);
-	if (ret != 0)
-		failwith_xl("nic_add", &lg);
-	FREE_CTX();
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_nic_del(value info, value domid)
-{
-	CAMLparam2(info, domid);
-	libxl_device_nic c_info;
-	int ret;
-	INIT_STRUCT();
-
-	device_nic_val(&gc, &lg, &c_info, info);
-
-	INIT_CTX();
-	ret = libxl_device_nic_del(ctx, Int_val(domid), &c_info, 0);
-	if (ret != 0)
-		failwith_xl("nic_del", &lg);
-	FREE_CTX();
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_console_add(value info, value domid)
-{
-	CAMLparam2(info, domid);
-	libxl_device_console c_info;
-	int ret;
-	INIT_STRUCT();
-
-	device_console_val(&gc, &lg, &c_info, info);
-
-	INIT_CTX();
-	ret = libxl_device_console_add(ctx, Int_val(domid), &c_info);
-	if (ret != 0)
-		failwith_xl("console_add", &lg);
-	FREE_CTX();
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_vkb_add(value info, value domid)
-{
-	CAMLparam2(info, domid);
-	libxl_device_vkb c_info;
-	int ret;
-	INIT_STRUCT();
-
-	device_vkb_val(&gc, &lg, &c_info, info);
-
-	INIT_CTX();
-	ret = libxl_device_vkb_add(ctx, Int_val(domid), &c_info);
-	if (ret != 0)
-		failwith_xl("vkb_add", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_vkb_clean_shutdown(value domid)
-{
-	CAMLparam1(domid);
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_device_vkb_clean_shutdown(ctx, Int_val(domid));
-	if (ret != 0)
-		failwith_xl("vkb_clean_shutdown", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_vkb_hard_shutdown(value domid)
-{
-	CAMLparam1(domid);
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_device_vkb_hard_shutdown(ctx, Int_val(domid));
-	if (ret != 0)
-		failwith_xl("vkb_hard_shutdown", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_vfb_add(value info, value domid)
-{
-	CAMLparam2(info, domid);
-	libxl_device_vfb c_info;
-	int ret;
-	INIT_STRUCT();
-
-	device_vfb_val(&gc, &lg, &c_info, info);
-
-	INIT_CTX();
-	ret = libxl_device_vfb_add(ctx, Int_val(domid), &c_info);
-	if (ret != 0)
-		failwith_xl("vfb_add", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_vfb_clean_shutdown(value domid)
-{
-	CAMLparam1(domid);
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_device_vfb_clean_shutdown(ctx, Int_val(domid));
-	if (ret != 0)
-		failwith_xl("vfb_clean_shutdown", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_vfb_hard_shutdown(value domid)
-{
-	CAMLparam1(domid);
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_device_vfb_hard_shutdown(ctx, Int_val(domid));
-	if (ret != 0)
-		failwith_xl("vfb_hard_shutdown", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_pci_add(value info, value domid)
-{
-	CAMLparam2(info, domid);
-	libxl_device_pci c_info;
-	int ret;
-	INIT_STRUCT();
-
-	device_pci_val(&gc, &lg, &c_info, info);
-
-	INIT_CTX();
-	ret = libxl_device_pci_add(ctx, Int_val(domid), &c_info);
-	if (ret != 0)
-		failwith_xl("pci_add", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_pci_remove(value info, value domid)
-{
-	CAMLparam2(info, domid);
-	libxl_device_pci c_info;
-	int ret;
-	INIT_STRUCT();
-
-	device_pci_val(&gc, &lg, &c_info, info);
-
-	INIT_CTX();
-	ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info, 0);
-	if (ret != 0)
-		failwith_xl("pci_remove", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_device_pci_shutdown(value domid)
-{
-	CAMLparam1(domid);
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_device_pci_shutdown(ctx, Int_val(domid));
-	if (ret != 0)
-		failwith_xl("pci_shutdown", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_button_press(value domid, value button)
-{
-	CAMLparam2(domid, button);
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_button_press(ctx, Int_val(domid), Int_val(button) + LIBXL_BUTTON_POWER);
-	if (ret != 0)
-		failwith_xl("button_press", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_physinfo_get(value unit)
-{
-	CAMLparam1(unit);
-	CAMLlocal1(physinfo);
-	libxl_physinfo c_physinfo;
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_get_physinfo(ctx, &c_physinfo);
-	if (ret != 0)
-		failwith_xl("physinfo", &lg);
-	FREE_CTX();
-
-	physinfo = Val_physinfo(&gc, &lg, &c_physinfo);
-	CAMLreturn(physinfo);
-}
-
-value stub_xl_topologyinfo(value unit)
-{
-	CAMLparam1(unit);
-	CAMLlocal1(topologyinfo);
-	libxl_topologyinfo c_topologyinfo;
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_get_topologyinfo(ctx, &c_topologyinfo);
-	if (ret != 0)
-		failwith_xl("topologyinfo", &lg);
-	FREE_CTX();
-
-	topologyinfo = Val_topologyinfo(&c_topologyinfo);
-	CAMLreturn(topologyinfo);
-}
-
-value stub_xl_sched_credit_domain_get(value domid)
-{
-	CAMLparam1(domid);
-	CAMLlocal1(scinfo);
-	libxl_sched_credit c_scinfo;
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_sched_credit_domain_get(ctx, Int_val(domid), &c_scinfo);
-	if (ret != 0)
-		failwith_xl("sched_credit_domain_get", &lg);
-	FREE_CTX();
-
-	scinfo = Val_sched_credit(&gc, &lg, &c_scinfo);
-	CAMLreturn(scinfo);
-}
-
-value stub_xl_sched_credit_domain_set(value domid, value scinfo)
-{
-	CAMLparam2(domid, scinfo);
-	libxl_sched_credit c_scinfo;
-	int ret;
-	INIT_STRUCT();
-
-	sched_credit_val(&gc, &lg, &c_scinfo, scinfo);
-
-	INIT_CTX();
-	ret = libxl_sched_credit_domain_set(ctx, Int_val(domid), &c_scinfo);
-	if (ret != 0)
-		failwith_xl("sched_credit_domain_set", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_send_trigger(value domid, value trigger, value vcpuid)
-{
-	CAMLparam3(domid, trigger, vcpuid);
-	int ret;
-	char *c_trigger;
-	INIT_STRUCT();
-
-	c_trigger = dup_String_val(&gc, trigger);
-
-	INIT_CTX();
-	ret = libxl_send_trigger(ctx, Int_val(domid), c_trigger, Int_val(vcpuid));
-	if (ret != 0)
-		failwith_xl("send_trigger", &lg);
-	FREE_CTX();
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_send_sysrq(value domid, value sysrq)
-{
-	CAMLparam2(domid, sysrq);
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_send_sysrq(ctx, Int_val(domid), Int_val(sysrq));
-	if (ret != 0)
-		failwith_xl("send_sysrq", &lg);
-	FREE_CTX();
-	CAMLreturn(Val_unit);
-}
-
-value stub_xl_send_debug_keys(value keys)
-{
-	CAMLparam1(keys);
-	int ret;
-	char *c_keys;
-	INIT_STRUCT();
-
-	c_keys = dup_String_val(&gc, keys);
-
-	INIT_CTX();
-	ret = libxl_send_debug_keys(ctx, c_keys);
-	if (ret != 0)
-		failwith_xl("send_debug_keys", &lg);
-	FREE_CTX();
-	CAMLreturn(Val_unit);
-}
-
-/*
- * Local variables:
- *  indent-tabs-mode: t
- *  c-basic-offset: 8
- *  tab-width: 8
- * End:
- */
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/META.in
--- a/tools/ocaml/libs/xs/META.in
+++ b/tools/ocaml/libs/xs/META.in
@@ -1,5 +1,5 @@
 version = "@VERSION@"
 description = "XenStore Interface"
-requires = "unix,xb"
-archive(byte) = "xs.cma"
-archive(native) = "xs.cmxa"
+requires = "unix,xenbus"
+archive(byte) = "xenstore.cma"
+archive(native) = "xenstore.cmxa"
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/Makefile
--- a/tools/ocaml/libs/xs/Makefile
+++ b/tools/ocaml/libs/xs/Makefile
@@ -3,6 +3,7 @@
 include $(TOPLEVEL)/common.make
 
 OCAMLINCLUDE += -I ../xb/
+OCAMLOPTFLAGS += -for-pack Xenstore
 
 .NOTPARALLEL:
 # Ocaml is such a PITA!
@@ -12,7 +13,7 @@
 PRELIBS = $(foreach obj, $(PREOBJS),$(obj).cmo) $(foreach obj,$(PREOJBS),$(obj).cmx)
 OBJS = queueop xsraw xst xs
 INTF = xsraw.cmi xst.cmi xs.cmi
-LIBS = xs.cma xs.cmxa
+LIBS = xenstore.cma xenstore.cmxa
 
 all: $(PREINTF) $(PRELIBS) $(INTF) $(LIBS) $(PROGRAMS)
 
@@ -20,18 +21,27 @@
 
 libs: $(LIBS)
 
-xs_OBJS = $(OBJS)
-OCAML_NOC_LIBRARY = xs
+xenstore_OBJS = xenstore
+OCAML_NOC_LIBRARY = xenstore
+
+xenstore.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
+	$(E) " CMX      $@"
+	$(Q)$(OCAMLOPT) -pack -o $@ $^
+
+xenstore.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
+	$(E) " CMO      $@"
+	$(Q)$(OCAMLC) -pack -o $@ $^
+
 
 .PHONY: install
 install: $(LIBS) META
 	mkdir -p $(OCAMLDESTDIR)
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xs
-	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xs META $(INTF) xs.mli xst.mli xsraw.mli $(LIBS) *.a *.cmx
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenstore
+	ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenstore META $(LIBS) xenstore.cmo xenstore.cmi xenstore.cmx *.a 
 
 .PHONY: uninstall
 uninstall:
-	ocamlfind remove -destdir $(OCAMLDESTDIR) xs
+	ocamlfind remove -destdir $(OCAMLDESTDIR) xenstore
 
 include $(TOPLEVEL)/Makefile.rules
 
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/queueop.ml
--- a/tools/ocaml/libs/xs/queueop.ml
+++ b/tools/ocaml/libs/xs/queueop.ml
@@ -13,6 +13,7 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Lesser General Public License for more details.
  *)
+open Xenbus
 
 let data_concat ls = (String.concat "\000" ls) ^ "\000"
 let queue_path ty (tid: int) (path: string) con =
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/xs.ml
--- a/tools/ocaml/libs/xs/xs.ml
+++ b/tools/ocaml/libs/xs/xs.ml
@@ -69,7 +69,7 @@
 let read_watchevent xsh = Xsraw.read_watchevent xsh.con
 
 let make fd = get_operations (Xsraw.open_fd fd)
-let get_fd xsh = Xb.get_fd xsh.con.Xsraw.xb
+let get_fd xsh = Xenbus.Xb.get_fd xsh.con.Xsraw.xb
 
 exception Timeout
 
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/xsraw.ml
--- a/tools/ocaml/libs/xs/xsraw.ml
+++ b/tools/ocaml/libs/xs/xsraw.ml
@@ -14,6 +14,8 @@
  * GNU Lesser General Public License for more details.
  *)
 
+open Xenbus
+
 exception Partial_not_empty
 exception Unexpected_packet of string
 
@@ -27,7 +29,7 @@
 	raise (Unexpected_packet s)
 
 type con = {
-	xb: Xb.t;
+	xb: Xenbus.Xb.t;
 	watchevents: (string * string) Queue.t;
 }
 
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/xsraw.mli
--- a/tools/ocaml/libs/xs/xsraw.mli
+++ b/tools/ocaml/libs/xs/xsraw.mli
@@ -16,8 +16,8 @@
 exception Partial_not_empty
 exception Unexpected_packet of string
 exception Invalid_path of string
-val unexpected_packet : Xb.Op.operation -> Xb.Op.operation -> 'a
-type con = { xb : Xb.t; watchevents : (string * string) Queue.t; }
+val unexpected_packet : Xenbus.Xb.Op.operation -> Xenbus.Xb.Op.operation -> 'a
+type con = { xb : Xenbus.Xb.t; watchevents : (string * string) Queue.t; }
 val close : con -> unit
 val open_fd : Unix.file_descr -> con
 val split_string : ?limit:int -> char -> string -> string list
@@ -26,14 +26,14 @@
 val string_of_perms : int * perm * (int * perm) list -> string
 val perms_of_string : string -> int * perm * (int * perm) list
 val pkt_send : con -> unit
-val pkt_recv : con -> Xb.Packet.t
-val pkt_recv_timeout : con -> float -> bool * Xb.Packet.t option
+val pkt_recv : con -> Xenbus.Xb.Packet.t
+val pkt_recv_timeout : con -> float -> bool * Xenbus.Xb.Packet.t option
 val queue_watchevent : con -> string -> unit
 val has_watchevents : con -> bool
 val get_watchevent : con -> string * string
 val read_watchevent : con -> string * string
-val sync_recv : Xb.Op.operation -> con -> string
-val sync : (Xb.t -> 'a) -> con -> string
+val sync_recv : Xenbus.Xb.Op.operation -> con -> string
+val sync : (Xenbus.Xb.t -> 'a) -> con -> string
 val ack : string -> unit
 val validate_path : string -> unit
 val validate_watch_path : string -> unit
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/Makefile
--- a/tools/ocaml/xenstored/Makefile
+++ b/tools/ocaml/xenstored/Makefile
@@ -35,11 +35,11 @@
 XENSTOREDLIBS = \
 	unix.cmxa \
 	$(OCAML_TOPLEVEL)/libs/uuid/uuid.cmxa \
-	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap $(OCAML_TOPLEVEL)/libs/mmap/mmap.cmxa \
+	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap $(OCAML_TOPLEVEL)/libs/mmap/xenmmap.cmxa \
 	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/log $(OCAML_TOPLEVEL)/libs/log/log.cmxa \
-	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/eventchn/eventchn.cmxa \
-	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc $(OCAML_TOPLEVEL)/libs/xc/xc.cmxa \
-	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb $(OCAML_TOPLEVEL)/libs/xb/xb.cmxa \
+	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/eventchn/xeneventchn.cmxa \
+	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc $(OCAML_TOPLEVEL)/libs/xc/xenctrl.cmxa \
+	-ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb $(OCAML_TOPLEVEL)/libs/xb/xenbus.cmxa \
 	-ccopt -L -ccopt $(XEN_ROOT)/tools/libxc
 
 PROGRAMS = oxenstored
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/connection.ml
--- a/tools/ocaml/xenstored/connection.ml
+++ b/tools/ocaml/xenstored/connection.ml
@@ -27,7 +27,7 @@
 }
 
 and t = {
-	xb: Xb.t;
+	xb: Xenbus.Xb.t;
 	dom: Domain.t option;
 	transactions: (int, Transaction.t) Hashtbl.t;
 	mutable next_tid: int;
@@ -93,10 +93,10 @@
 	Logging.new_connection ~tid:Transaction.none ~con:(get_domstr con);
 	con
 
-let get_fd con = Xb.get_fd con.xb
+let get_fd con = Xenbus.Xb.get_fd con.xb
 let close con =
 	Logging.end_connection ~tid:Transaction.none ~con:(get_domstr con);
-	Xb.close con.xb
+	Xenbus.Xb.close con.xb
 
 let get_perm con =
 	con.perm
@@ -108,9 +108,9 @@
 	con.perm <- Perms.Connection.set_target (get_perm con) ~perms:[Perms.READ; Perms.WRITE] target_domid
 
 let send_reply con tid rid ty data =
-	Xb.queue con.xb (Xb.Packet.create tid rid ty data)
+	Xenbus.Xb.queue con.xb (Xenbus.Xb.Packet.create tid rid ty data)
 
-let send_error con tid rid err = send_reply con tid rid Xb.Op.Error (err ^ "\000")
+let send_error con tid rid err = send_reply con tid rid Xenbus.Xb.Op.Error (err ^ "\000")
 let send_ack con tid rid ty = send_reply con tid rid ty "OK\000"
 
 let get_watch_path con path =
@@ -166,7 +166,7 @@
 
 let fire_single_watch watch =
 	let data = Utils.join_by_null [watch.path; watch.token; ""] in
-	send_reply watch.con Transaction.none 0 Xb.Op.Watchevent data
+	send_reply watch.con Transaction.none 0 Xenbus.Xb.Op.Watchevent data
 
 let fire_watch watch path =
 	let new_path =
@@ -179,7 +179,7 @@
 			path
 	in
 	let data = Utils.join_by_null [ new_path; watch.token; "" ] in
-	send_reply watch.con Transaction.none 0 Xb.Op.Watchevent data
+	send_reply watch.con Transaction.none 0 Xenbus.Xb.Op.Watchevent data
 
 let find_next_tid con =
 	let ret = con.next_tid in con.next_tid <- con.next_tid + 1; ret
@@ -203,15 +203,15 @@
 let get_transaction con tid =
 	Hashtbl.find con.transactions tid
 
-let do_input con = Xb.input con.xb
-let has_input con = Xb.has_in_packet con.xb
-let pop_in con = Xb.get_in_packet con.xb
-let has_more_input con = Xb.has_more_input con.xb
+let do_input con = Xenbus.Xb.input con.xb
+let has_input con = Xenbus.Xb.has_in_packet con.xb
+let pop_in con = Xenbus.Xb.get_in_packet con.xb
+let has_more_input con = Xenbus.Xb.has_more_input con.xb
 
-let has_output con = Xb.has_output con.xb
-let has_new_output con = Xb.has_new_output con.xb
-let peek_output con = Xb.peek_output con.xb
-let do_output con = Xb.output con.xb
+let has_output con = Xenbus.Xb.has_output con.xb
+let has_new_output con = Xenbus.Xb.has_new_output con.xb
+let peek_output con = Xenbus.Xb.peek_output con.xb
+let do_output con = Xenbus.Xb.output con.xb
 
 let incr_ops con = con.stat_nb_ops <- con.stat_nb_ops + 1
 
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/connections.ml
--- a/tools/ocaml/xenstored/connections.ml
+++ b/tools/ocaml/xenstored/connections.ml
@@ -26,12 +26,12 @@
 let create () = { anonymous = []; domains = Hashtbl.create 8; watches = Trie.create () }
 
 let add_anonymous cons fd can_write =
-	let xbcon = Xb.open_fd fd in
+	let xbcon = Xenbus.Xb.open_fd fd in
 	let con = Connection.create xbcon None in
 	cons.anonymous <- con :: cons.anonymous
 
 let add_domain cons dom =
-	let xbcon = Xb.open_mmap (Domain.get_interface dom) (fun () -> Domain.notify dom) in
+	let xbcon = Xenbus.Xb.open_mmap (Domain.get_interface dom) (fun () -> Domain.notify dom) in
 	let con = Connection.create xbcon (Some dom) in
 	Hashtbl.add cons.domains (Domain.get_id dom) con
 
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/domain.ml
--- a/tools/ocaml/xenstored/domain.ml
+++ b/tools/ocaml/xenstored/domain.ml
@@ -20,10 +20,10 @@
 
 type t =
 {
-	id: Xc.domid;
+	id: Xenctrl.domid;
 	mfn: nativeint;
 	remote_port: int;
-	interface: Mmap.mmap_interface;
+	interface: Xenmmap.mmap_interface;
 	eventchn: Event.t;
 	mutable port: int;
 }
@@ -47,7 +47,7 @@
 let close dom =
 	debug "domain %d unbound port %d" dom.id dom.port;
 	Event.unbind dom.eventchn dom.port;
-	Mmap.unmap dom.interface;
+	Xenmmap.unmap dom.interface;
 	()
 
 let make id mfn remote_port interface eventchn = {
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/domains.ml
--- a/tools/ocaml/xenstored/domains.ml
+++ b/tools/ocaml/xenstored/domains.ml
@@ -16,7 +16,7 @@
 
 type domains = {
 	eventchn: Event.t;
-	table: (Xc.domid, Domain.t) Hashtbl.t;
+	table: (Xenctrl.domid, Domain.t) Hashtbl.t;
 }
 
 let init eventchn =
@@ -33,16 +33,16 @@
 
 	Hashtbl.iter (fun id _ -> if id <> 0 then
 		try
-			let info = Xc.domain_getinfo xc id in
-			if info.Xc.shutdown || info.Xc.dying then (
+			let info = Xenctrl.domain_getinfo xc id in
+			if info.Xenctrl.shutdown || info.Xenctrl.dying then (
 				Logs.debug "general" "Domain %u died (dying=%b, shutdown %b -- code %d)"
-				                    id info.Xc.dying info.Xc.shutdown info.Xc.shutdown_code;
-				if info.Xc.dying then
+				                    id info.Xenctrl.dying info.Xenctrl.shutdown info.Xenctrl.shutdown_code;
+				if info.Xenctrl.dying then
 					dead_dom := id :: !dead_dom
 				else
 					notify := true;
 			)
-		with Xc.Error _ ->
+		with Xenctrl.Error _ ->
 			Logs.debug "general" "Domain %u died -- no domain info" id;
 			dead_dom := id :: !dead_dom;
 		) doms.table;
@@ -57,7 +57,7 @@
 	()
 
 let create xc doms domid mfn port =
-	let interface = Xc.map_foreign_range xc domid (Mmap.getpagesize()) mfn in
+	let interface = Xenctrl.map_foreign_range xc domid (Xenmmap.getpagesize()) mfn in
 	let dom = Domain.make domid mfn port interface doms.eventchn in
 	Hashtbl.add doms.table domid dom;
 	Domain.bind_interdomain dom;
@@ -66,13 +66,13 @@
 let create0 fake doms =
 	let port, interface =
 		if fake then (
-			0, Xc.with_intf (fun xc -> Xc.map_foreign_range xc 0 (Mmap.getpagesize()) 0n)
+			0, Xenctrl.with_intf (fun xc -> Xenctrl.map_foreign_range xc 0 (Xenmmap.getpagesize()) 0n)
 		) else (
 			let port = Utils.read_file_single_integer Define.xenstored_proc_port
 			and fd = Unix.openfile Define.xenstored_proc_kva
 					       [ Unix.O_RDWR ] 0o600 in
-			let interface = Mmap.mmap fd Mmap.RDWR Mmap.SHARED
-						  (Mmap.getpagesize()) 0 in
+			let interface = Xenmmap.mmap fd Xenmmap.RDWR Xenmmap.SHARED
+						  (Xenmmap.getpagesize()) 0 in
 			Unix.close fd;
 			port, interface
 		)
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/event.ml
--- a/tools/ocaml/xenstored/event.ml
+++ b/tools/ocaml/xenstored/event.ml
@@ -16,15 +16,15 @@
 
 (**************** high level binding ****************)
 type t = {
-	handle: Eventchn.handle;
+	handle: Xeneventchn.handle;
 	mutable virq_port: int;
 }
 
-let init () = { handle = Eventchn.init (); virq_port = -1; }
-let fd eventchn = Eventchn.fd eventchn.handle
-let bind_dom_exc_virq eventchn = eventchn.virq_port <- Eventchn.bind_dom_exc_virq eventchn.handle
-let bind_interdomain eventchn domid port = Eventchn.bind_interdomain eventchn.handle domid port
-let unbind eventchn port = Eventchn.unbind eventchn.handle port
-let notify eventchn port = Eventchn.notify eventchn.handle port
-let pending eventchn = Eventchn.pending eventchn.handle
-let unmask eventchn port = Eventchn.unmask eventchn.handle port
+let init () = { handle = Xeneventchn.init (); virq_port = -1; }
+let fd eventchn = Xeneventchn.fd eventchn.handle
+let bind_dom_exc_virq eventchn = eventchn.virq_port <- Xeneventchn.bind_dom_exc_virq eventchn.handle
+let bind_interdomain eventchn domid port = Xeneventchn.bind_interdomain eventchn.handle domid port
+let unbind eventchn port = Xeneventchn.unbind eventchn.handle port
+let notify eventchn port = Xeneventchn.notify eventchn.handle port
+let pending eventchn = Xeneventchn.pending eventchn.handle
+let unmask eventchn port = Xeneventchn.unmask eventchn.handle port
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/logging.ml
--- a/tools/ocaml/xenstored/logging.ml
+++ b/tools/ocaml/xenstored/logging.ml
@@ -39,7 +39,7 @@
 	| Commit
 	| Newconn
 	| Endconn
-	| XbOp of Xb.Op.operation
+	| XbOp of Xenbus.Xb.Op.operation
 
 type access =
 	{
@@ -82,35 +82,35 @@
 	| Endconn                 -> "endconn  "
 
 	| XbOp op -> match op with
-	| Xb.Op.Debug             -> "debug    "
+	| Xenbus.Xb.Op.Debug             -> "debug    "
 
-	| Xb.Op.Directory         -> "directory"
-	| Xb.Op.Read              -> "read     "
-	| Xb.Op.Getperms          -> "getperms "
+	| Xenbus.Xb.Op.Directory         -> "directory"
+	| Xenbus.Xb.Op.Read              -> "read     "
+	| Xenbus.Xb.Op.Getperms          -> "getperms "
 
-	| Xb.Op.Watch             -> "watch    "
-	| Xb.Op.Unwatch           -> "unwatch  "
+	| Xenbus.Xb.Op.Watch             -> "watch    "
+	| Xenbus.Xb.Op.Unwatch           -> "unwatch  "
 
-	| Xb.Op.Transaction_start -> "t start  "
-	| Xb.Op.Transaction_end   -> "t end    "
+	| Xenbus.Xb.Op.Transaction_start -> "t start  "
+	| Xenbus.Xb.Op.Transaction_end   -> "t end    "
 
-	| Xb.Op.Introduce         -> "introduce"
-	| Xb.Op.Release           -> "release  "
-	| Xb.Op.Getdomainpath     -> "getdomain"
-	| Xb.Op.Isintroduced      -> "is introduced"
-	| Xb.Op.Resume            -> "resume   "
+	| Xenbus.Xb.Op.Introduce         -> "introduce"
+	| Xenbus.Xb.Op.Release           -> "release  "
+	| Xenbus.Xb.Op.Getdomainpath     -> "getdomain"
+	| Xenbus.Xb.Op.Isintroduced      -> "is introduced"
+	| Xenbus.Xb.Op.Resume            -> "resume   "
  
-	| Xb.Op.Write             -> "write    "
-	| Xb.Op.Mkdir             -> "mkdir    "
-	| Xb.Op.Rm                -> "rm       "
-	| Xb.Op.Setperms          -> "setperms "
-	| Xb.Op.Restrict          -> "restrict "
-	| Xb.Op.Set_target        -> "settarget"
+	| Xenbus.Xb.Op.Write             -> "write    "
+	| Xenbus.Xb.Op.Mkdir             -> "mkdir    "
+	| Xenbus.Xb.Op.Rm                -> "rm       "
+	| Xenbus.Xb.Op.Setperms          -> "setperms "
+	| Xenbus.Xb.Op.Restrict          -> "restrict "
+	| Xenbus.Xb.Op.Set_target        -> "settarget"
 
-	| Xb.Op.Error             -> "error    "
-	| Xb.Op.Watchevent        -> "w event  "
+	| Xenbus.Xb.Op.Error             -> "error    "
+	| Xenbus.Xb.Op.Watchevent        -> "w event  "
 
-	| x                       -> Xb.Op.to_string x
+	| x                       -> Xenbus.Xb.Op.to_string x
 
 let file_exists file =
 	try
@@ -210,10 +210,10 @@
 let xb_op ~tid ~con ~ty data =
 	let print =
 	match ty with
-		| Xb.Op.Read | Xb.Op.Directory | Xb.Op.Getperms -> !log_read_ops
-		| Xb.Op.Transaction_start | Xb.Op.Transaction_end ->
+		| Xenbus.Xb.Op.Read | Xenbus.Xb.Op.Directory | Xenbus.Xb.Op.Getperms -> !log_read_ops
+		| Xenbus.Xb.Op.Transaction_start | Xenbus.Xb.Op.Transaction_end ->
 			false (* transactions are managed below *)
-		| Xb.Op.Introduce | Xb.Op.Release | Xb.Op.Getdomainpath | Xb.Op.Isintroduced | Xb.Op.Resume ->
+		| Xenbus.Xb.Op.Introduce | Xenbus.Xb.Op.Release | Xenbus.Xb.Op.Getdomainpath | Xenbus.Xb.Op.Isintroduced | Xenbus.Xb.Op.Resume ->
 			!log_special_ops
 		| _ -> true
 	in
@@ -222,17 +222,17 @@
 
 let start_transaction ~tid ~con = 
 	if !log_transaction_ops && tid <> 0
-	then write_access_log ~tid ~con (XbOp Xb.Op.Transaction_start)
+	then write_access_log ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_start)
 
 let end_transaction ~tid ~con = 
 	if !log_transaction_ops && tid <> 0
-	then write_access_log ~tid ~con (XbOp Xb.Op.Transaction_end)
+	then write_access_log ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_end)
 
 let xb_answer ~tid ~con ~ty data =
 	let print = match ty with
-		| Xb.Op.Error when data="ENOENT " -> !log_read_ops
-		| Xb.Op.Error -> !log_special_ops
-		| Xb.Op.Watchevent -> true
+		| Xenbus.Xb.Op.Error when data="ENOENT " -> !log_read_ops
+		| Xenbus.Xb.Op.Error -> !log_special_ops
+		| Xenbus.Xb.Op.Watchevent -> true
 		| _ -> false
 	in
 		if print
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/perms.ml
--- a/tools/ocaml/xenstored/perms.ml
+++ b/tools/ocaml/xenstored/perms.ml
@@ -43,9 +43,9 @@
 
 type t =
 {
-	owner: Xc.domid;
+	owner: Xenctrl.domid;
 	other: permty;
-	acl: (Xc.domid * permty) list;
+	acl: (Xenctrl.domid * permty) list;
 }
 
 let create owner other acl =
@@ -88,7 +88,7 @@
 module Connection =
 struct
 
-type elt = Xc.domid * (permty list)
+type elt = Xenctrl.domid * (permty list)
 type t =
 	{ main: elt;
 	  target: elt option; }
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/process.ml
--- a/tools/ocaml/xenstored/process.ml
+++ b/tools/ocaml/xenstored/process.ml
@@ -54,10 +54,10 @@
 let process_watch ops cons =
 	let do_op_watch op cons =
 		let recurse = match (fst op) with
-		| Xb.Op.Write    -> false
-		| Xb.Op.Mkdir    -> false
-		| Xb.Op.Rm       -> true
-		| Xb.Op.Setperms -> false
+		| Xenbus.Xb.Op.Write    -> false
+		| Xenbus.Xb.Op.Mkdir    -> false
+		| Xenbus.Xb.Op.Rm       -> true
+		| Xenbus.Xb.Op.Setperms -> false
 		| _              -> raise (Failure "huh ?") in
 		Connections.fire_watches cons (snd op) recurse in
 	List.iter (fun op -> do_op_watch op cons) ops
@@ -83,7 +83,7 @@
 	then None
 	else try match split None '\000' data with
 	| "print" :: msg :: _ ->
-		Logging.xb_op ~tid:0 ~ty:Xb.Op.Debug ~con:"=======>" msg;
+		Logging.xb_op ~tid:0 ~ty:Xenbus.Xb.Op.Debug ~con:"=======>" msg;
 		None
 	| "quota" :: domid :: _ ->
 		let domid = int_of_string domid in
@@ -120,7 +120,7 @@
 		| _                   -> raise Invalid_Cmd_Args
 		in
 	let watch = Connections.add_watch cons con node token in
-	Connection.send_ack con (Transaction.get_id t) rid Xb.Op.Watch;
+	Connection.send_ack con (Transaction.get_id t) rid Xenbus.Xb.Op.Watch;
 	Connection.fire_single_watch watch
 
 let do_unwatch con t domains cons data =
@@ -165,7 +165,7 @@
 		if Domains.exist domains domid then
 			Domains.find domains domid
 		else try
-			let ndom = Xc.with_intf (fun xc ->
+			let ndom = Xenctrl.with_intf (fun xc ->
 				Domains.create xc domains domid mfn port) in
 			Connections.add_domain cons ndom;
 			Connections.fire_spec_watches cons "@introduceDomain";
@@ -299,25 +299,25 @@
 
 let function_of_type ty =
 	match ty with
-	| Xb.Op.Debug             -> reply_data_or_ack do_debug
-	| Xb.Op.Directory         -> reply_data do_directory
-	| Xb.Op.Read              -> reply_data do_read
-	| Xb.Op.Getperms          -> reply_data do_getperms
-	| Xb.Op.Watch             -> reply_none do_watch
-	| Xb.Op.Unwatch           -> reply_ack do_unwatch
-	| Xb.Op.Transaction_start -> reply_data do_transaction_start
-	| Xb.Op.Transaction_end   -> reply_ack do_transaction_end
-	| Xb.Op.Introduce         -> reply_ack do_introduce
-	| Xb.Op.Release           -> reply_ack do_release
-	| Xb.Op.Getdomainpath     -> reply_data do_getdomainpath
-	| Xb.Op.Write             -> reply_ack do_write
-	| Xb.Op.Mkdir             -> reply_ack do_mkdir
-	| Xb.Op.Rm                -> reply_ack do_rm
-	| Xb.Op.Setperms          -> reply_ack do_setperms
-	| Xb.Op.Isintroduced      -> reply_data do_isintroduced
-	| Xb.Op.Resume            -> reply_ack do_resume
-	| Xb.Op.Set_target        -> reply_ack do_set_target
-	| Xb.Op.Restrict          -> reply_ack do_restrict
+	| Xenbus.Xb.Op.Debug             -> reply_data_or_ack do_debug
+	| Xenbus.Xb.Op.Directory         -> reply_data do_directory
+	| Xenbus.Xb.Op.Read              -> reply_data do_read
+	| Xenbus.Xb.Op.Getperms          -> reply_data do_getperms
+	| Xenbus.Xb.Op.Watch             -> reply_none do_watch
+	| Xenbus.Xb.Op.Unwatch           -> reply_ack do_unwatch
+	| Xenbus.Xb.Op.Transaction_start -> reply_data do_transaction_start
+	| Xenbus.Xb.Op.Transaction_end   -> reply_ack do_transaction_end
+	| Xenbus.Xb.Op.Introduce         -> reply_ack do_introduce
+	| Xenbus.Xb.Op.Release           -> reply_ack do_release
+	| Xenbus.Xb.Op.Getdomainpath     -> reply_data do_getdomainpath
+	| Xenbus.Xb.Op.Write             -> reply_ack do_write
+	| Xenbus.Xb.Op.Mkdir             -> reply_ack do_mkdir
+	| Xenbus.Xb.Op.Rm                -> reply_ack do_rm
+	| Xenbus.Xb.Op.Setperms          -> reply_ack do_setperms
+	| Xenbus.Xb.Op.Isintroduced      -> reply_data do_isintroduced
+	| Xenbus.Xb.Op.Resume            -> reply_ack do_resume
+	| Xenbus.Xb.Op.Set_target        -> reply_ack do_set_target
+	| Xenbus.Xb.Op.Restrict          -> reply_ack do_restrict
 	| _                       -> reply_ack do_error
 
 let input_handle_error ~cons ~doms ~fct ~ty ~con ~t ~rid ~data =
@@ -370,11 +370,11 @@
 let do_input store cons doms con =
 	if Connection.do_input con then (
 		let packet = Connection.pop_in con in
-		let tid, rid, ty, data = Xb.Packet.unpack packet in
+		let tid, rid, ty, data = Xenbus.Xb.Packet.unpack packet in
 		(* As we don't log IO, do not call an unnecessary sanitize_data 
 		   Logs.info "io" "[%s] -> [%d] %s \"%s\""
 		         (Connection.get_domstr con) tid
-		         (Xb.Op.to_string ty) (sanitize_data data); *)
+		         (Xenbus.Xb.Op.to_string ty) (sanitize_data data); *)
 		process_packet ~store ~cons ~doms ~con ~tid ~rid ~ty ~data;
 		write_access_log ~ty ~tid ~con ~data;
 		Connection.incr_ops con;
@@ -384,11 +384,11 @@
 	if Connection.has_output con then (
 		if Connection.has_new_output con then (
 			let packet = Connection.peek_output con in
-			let tid, rid, ty, data = Xb.Packet.unpack packet in
+			let tid, rid, ty, data = Xenbus.Xb.Packet.unpack packet in
 			(* As we don't log IO, do not call an unnecessary sanitize_data 
 			   Logs.info "io" "[%s] <- %s \"%s\""
 			         (Connection.get_domstr con)
-			         (Xb.Op.to_string ty) (sanitize_data data);*)
+			         (Xenbus.Xb.Op.to_string ty) (sanitize_data data);*)
 			write_answer_log ~ty ~tid ~con ~data;
 		);
 		ignore (Connection.do_output con)
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/quota.ml
--- a/tools/ocaml/xenstored/quota.ml
+++ b/tools/ocaml/xenstored/quota.ml
@@ -26,7 +26,7 @@
 type t = {
 	maxent: int;               (* max entities per domU *)
 	maxsize: int;              (* max size of data store in one node *)
-	cur: (Xc.domid, int) Hashtbl.t; (* current domains quota *)
+	cur: (Xenctrl.domid, int) Hashtbl.t; (* current domains quota *)
 }
 
 let to_string quota domid =
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/transaction.ml
--- a/tools/ocaml/xenstored/transaction.ml
+++ b/tools/ocaml/xenstored/transaction.ml
@@ -74,7 +74,7 @@
 type t = {
 	ty: ty;
 	store: Store.t;
-	mutable ops: (Xb.Op.operation * Store.Path.t) list;
+	mutable ops: (Xenbus.Xb.Op.operation * Store.Path.t) list;
 	mutable read_lowpath: Store.Path.t option;
 	mutable write_lowpath: Store.Path.t option;
 }
@@ -105,23 +105,23 @@
 	if path_exists
 	then set_write_lowpath t path
 	else set_write_lowpath t (Store.Path.get_parent path);
-	add_wop t Xb.Op.Write path
+	add_wop t Xenbus.Xb.Op.Write path
 
 let mkdir ?(with_watch=true) t perm path =
 	Store.mkdir t.store perm path;
 	set_write_lowpath t path;
 	if with_watch then
-		add_wop t Xb.Op.Mkdir path
+		add_wop t Xenbus.Xb.Op.Mkdir path
 
 let setperms t perm path perms =
 	Store.setperms t.store perm path perms;
 	set_write_lowpath t path;
-	add_wop t Xb.Op.Setperms path
+	add_wop t Xenbus.Xb.Op.Setperms path
 
 let rm t perm path =
 	Store.rm t.store perm path;
 	set_write_lowpath t (Store.Path.get_parent path);
-	add_wop t Xb.Op.Rm path
+	add_wop t Xenbus.Xb.Op.Rm path
 
 let ls t perm path =	
 	let r = Store.ls t.store perm path in
diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/xenstored.ml
--- a/tools/ocaml/xenstored/xenstored.ml
+++ b/tools/ocaml/xenstored/xenstored.ml
@@ -35,7 +35,7 @@
 			if err <> Unix.ECONNRESET then
 			error "closing socket connection: read error: %s"
 			      (Unix.error_message err)
-		| Xb.End_of_file ->
+		| Xenbus.Xb.End_of_file ->
 			Connections.del_anonymous cons c;
 			debug "closing socket connection"
 		in
@@ -170,7 +170,7 @@
 let from_channel store cons doms chan =
 	(* don't let the permission get on our way, full perm ! *)
 	let op = Store.get_ops store Perms.Connection.full_rights in
-	let xc = Xc.interface_open () in
+	let xc = Xenctrl.interface_open () in
 
 	let domain_f domid mfn port =
 		let ndom =
@@ -190,7 +190,7 @@
 		op.Store.setperms path perms
 		in
 	finally (fun () -> from_channel_f chan domain_f watch_f store_f)
-	        (fun () -> Xc.interface_close xc)
+	        (fun () -> Xenctrl.interface_close xc)
 
 let from_file store cons doms file =
 	let channel = open_in file in
@@ -282,7 +282,7 @@
 			Store.mkdir store (Perms.Connection.create 0) localpath;
 
 		if cf.domain_init then (
-			let usingxiu = Xc.is_fake () in
+			let usingxiu = Xenctrl.is_fake () in
 			Connections.add_domain cons (Domains.create0 usingxiu domains);
 			Event.bind_dom_exc_virq eventchn
 		);
@@ -301,7 +301,7 @@
 		(if cf.domain_init then [ Event.fd eventchn ] else [])
 		in
 
-	let xc = Xc.interface_open () in
+	let xc = Xenctrl.interface_open () in
 
 	let process_special_fds rset =
 		let accept_connection can_write fd =

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 04:00:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 04:00:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC8AL-0003V9-RL; Fri, 07 Oct 2011 04:00:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC876-0003G9-LE
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:57:14 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1317985015!43246198!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6341 invoked from network); 7 Oct 2011 10:56:55 -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;
	7 Oct 2011 10:56:55 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8270371"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 10:57: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; Fri, 7 Oct 2011
	11:57:08 +0100
Subject: Re: [Xen-devel] [PATCH 1 of 6] [OCAML] Rename the ocaml libraries
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Date: Fri, 7 Oct 2011 11:57:07 +0100
In-Reply-To: <ffbc5e9929d52531a9ec.1317983159@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
	<ffbc5e9929d52531a9ec.1317983159@snoosnoo2.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: <1317985028.21903.318.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-10-07 at 11:25 +0100, Jon Ludlam wrote:
> ocamlfind does not support namespaces, so to avoid
> name clashes the module names have become longer.
> Additionally, the xenstore and xenbus subdirs, which
> contain several modules each, have been packed into
> toplevel Xenstore and Xenbus modules.
> 
> xb becomes xenbus, xc becomes xenctrl, xl becomes xenlight,
> xs becomes xenstore, eventchn becomes xeneventchn and
> mmap becomes xenmmap.
> 
> Signed-off-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>

I only skimmed the changes (rather than the moves which I assume are
basically identical code).

Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/META.in
> --- a/tools/ocaml/libs/eventchn/META.in
> +++ b/tools/ocaml/libs/eventchn/META.in
> @@ -1,5 +1,5 @@
>  version = "@VERSION@"
>  description = "Eventchn interface extension"
>  requires = "unix"
> -archive(byte) = "eventchn.cma"
> -archive(native) = "eventchn.cmxa"
> +archive(byte) = "xeneventchn.cma"
> +archive(native) = "xeneventchn.cmxa"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/Makefile
> --- a/tools/ocaml/libs/eventchn/Makefile
> +++ b/tools/ocaml/libs/eventchn/Makefile
> @@ -4,11 +4,11 @@
> 
>  CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_xeninclude)
> 
> -OBJS = eventchn
> +OBJS = xeneventchn
>  INTF = $(foreach obj, $(OBJS),$(obj).cmi)
> -LIBS = eventchn.cma eventchn.cmxa
> +LIBS = xeneventchn.cma xeneventchn.cmxa
> 
> -LIBS_evtchn = $(LDLIBS_libxenctrl)
> +LIBS_xeneventchn = $(LDLIBS_libxenctrl)
> 
>  all: $(INTF) $(LIBS) $(PROGRAMS)
> 
> @@ -16,20 +16,20 @@
> 
>  libs: $(LIBS)
> 
> -eventchn_OBJS = $(OBJS)
> -eventchn_C_OBJS = eventchn_stubs
> +xeneventchn_OBJS = $(OBJS)
> +xeneventchn_C_OBJS = xeneventchn_stubs
> 
> -OCAML_LIBRARY = eventchn
> +OCAML_LIBRARY = xeneventchn
> 
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) eventchn
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore eventchn META $(INTF) $(LIBS) *.a *.so *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xeneventchn
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xeneventchn META $(INTF) $(LIBS) *.a *.so *.cmx
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) eventchn
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xeneventchn
> 
>  include $(TOPLEVEL)/Makefile.rules
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/eventchn.ml
> --- a/tools/ocaml/libs/eventchn/eventchn.ml
> +++ /dev/null
> @@ -1,30 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -exception Error of string
> -
> -type handle
> -
> -external init: unit -> handle = "stub_eventchn_init"
> -external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
> -external notify: handle -> int -> unit = "stub_eventchn_notify"
> -external bind_interdomain: handle -> int -> int -> int = "stub_eventchn_bind_interdomain"
> -external bind_dom_exc_virq: handle -> int = "stub_eventchn_bind_dom_exc_virq"
> -external unbind: handle -> int -> unit = "stub_eventchn_unbind"
> -external pending: handle -> int = "stub_eventchn_pending"
> -external unmask: handle -> int -> unit = "stub_eventchn_unmask"
> -
> -let _ = Callback.register_exception "eventchn.error" (Error "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/eventchn.mli
> --- a/tools/ocaml/libs/eventchn/eventchn.mli
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -exception Error of string
> -
> -type handle
> -
> -external init : unit -> handle = "stub_eventchn_init"
> -external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
> -
> -external notify : handle -> int -> unit = "stub_eventchn_notify"
> -external bind_interdomain : handle -> int -> int -> int
> -  = "stub_eventchn_bind_interdomain"
> -external bind_dom_exc_virq : handle -> int = "stub_eventchn_bind_dom_exc_virq"
> -external unbind : handle -> int -> unit = "stub_eventchn_unbind"
> -external pending : handle -> int = "stub_eventchn_pending"
> -external unmask : handle -> int -> unit
> -  = "stub_eventchn_unmask"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/eventchn_stubs.c
> --- a/tools/ocaml/libs/eventchn/eventchn_stubs.c
> +++ /dev/null
> @@ -1,143 +0,0 @@
> -/*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - */
> -
> -#include <sys/types.h>
> -#include <sys/stat.h>
> -#include <fcntl.h>
> -#include <unistd.h>
> -#include <errno.h>
> -#include <stdint.h>
> -#include <sys/ioctl.h>
> -#include <xen/sysctl.h>
> -#include <xen/xen.h>
> -#include <xen/sys/evtchn.h>
> -#include <xenctrl.h>
> -
> -#define CAML_NAME_SPACE
> -#include <caml/mlvalues.h>
> -#include <caml/memory.h>
> -#include <caml/alloc.h>
> -#include <caml/custom.h>
> -#include <caml/callback.h>
> -#include <caml/fail.h>
> -
> -#define _H(__h) ((xc_interface *)(__h))
> -
> -CAMLprim value stub_eventchn_init(void)
> -{
> -       CAMLparam0();
> -       CAMLlocal1(result);
> -
> -       xc_interface *xce = xc_evtchn_open(NULL, XC_OPENFLAG_NON_REENTRANT);
> -       if (xce == NULL)
> -               caml_failwith("open failed");
> -
> -       result = (value)xce;
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_eventchn_fd(value xce)
> -{
> -       CAMLparam1(xce);
> -       CAMLlocal1(result);
> -       int fd;
> -
> -       fd = xc_evtchn_fd(_H(xce));
> -       if (fd == -1)
> -               caml_failwith("evtchn fd failed");
> -
> -       result = Val_int(fd);
> -
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_eventchn_notify(value xce, value port)
> -{
> -       CAMLparam2(xce, port);
> -       int rc;
> -
> -       rc = xc_evtchn_notify(_H(xce), Int_val(port));
> -       if (rc == -1)
> -               caml_failwith("evtchn notify failed");
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_eventchn_bind_interdomain(value xce, value domid,
> -                                              value remote_port)
> -{
> -       CAMLparam3(xce, domid, remote_port);
> -       CAMLlocal1(port);
> -       evtchn_port_or_error_t rc;
> -
> -       rc = xc_evtchn_bind_interdomain(_H(xce), Int_val(domid), Int_val(remote_port));
> -       if (rc == -1)
> -               caml_failwith("evtchn bind_interdomain failed");
> -       port = Val_int(rc);
> -
> -       CAMLreturn(port);
> -}
> -
> -CAMLprim value stub_eventchn_bind_dom_exc_virq(value xce)
> -{
> -       CAMLparam1(xce);
> -       CAMLlocal1(port);
> -       evtchn_port_or_error_t rc;
> -
> -       rc = xc_evtchn_bind_virq(_H(xce), VIRQ_DOM_EXC);
> -       if (rc == -1)
> -               caml_failwith("evtchn bind_dom_exc_virq failed");
> -       port = Val_int(rc);
> -
> -       CAMLreturn(port);
> -}
> -
> -CAMLprim value stub_eventchn_unbind(value xce, value port)
> -{
> -       CAMLparam2(xce, port);
> -       int rc;
> -
> -       rc = xc_evtchn_unbind(_H(xce), Int_val(port));
> -       if (rc == -1)
> -               caml_failwith("evtchn unbind failed");
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_eventchn_pending(value xce)
> -{
> -       CAMLparam1(xce);
> -       CAMLlocal1(result);
> -       evtchn_port_or_error_t port;
> -
> -       port = xc_evtchn_pending(_H(xce));
> -       if (port == -1)
> -               caml_failwith("evtchn pending failed");
> -       result = Val_int(port);
> -
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_eventchn_unmask(value xce, value _port)
> -{
> -       CAMLparam2(xce, _port);
> -       evtchn_port_t port;
> -
> -       port = Int_val(_port);
> -       if (xc_evtchn_unmask(_H(xce), port))
> -               caml_failwith("evtchn unmask failed");
> -       CAMLreturn(Val_unit);
> -}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/xeneventchn.ml
> --- /dev/null
> +++ b/tools/ocaml/libs/eventchn/xeneventchn.ml
> @@ -0,0 +1,30 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + *)
> +
> +exception Error of string
> +
> +type handle
> +
> +external init: unit -> handle = "stub_eventchn_init"
> +external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
> +external notify: handle -> int -> unit = "stub_eventchn_notify"
> +external bind_interdomain: handle -> int -> int -> int = "stub_eventchn_bind_interdomain"
> +external bind_dom_exc_virq: handle -> int = "stub_eventchn_bind_dom_exc_virq"
> +external unbind: handle -> int -> unit = "stub_eventchn_unbind"
> +external pending: handle -> int = "stub_eventchn_pending"
> +external unmask: handle -> int -> unit = "stub_eventchn_unmask"
> +
> +let _ = Callback.register_exception "eventchn.error" (Error "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/xeneventchn.mli
> --- /dev/null
> +++ b/tools/ocaml/libs/eventchn/xeneventchn.mli
> @@ -0,0 +1,31 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + *)
> +
> +exception Error of string
> +
> +type handle
> +
> +external init : unit -> handle = "stub_eventchn_init"
> +external fd: handle -> Unix.file_descr = "stub_eventchn_fd"
> +
> +external notify : handle -> int -> unit = "stub_eventchn_notify"
> +external bind_interdomain : handle -> int -> int -> int
> +  = "stub_eventchn_bind_interdomain"
> +external bind_dom_exc_virq : handle -> int = "stub_eventchn_bind_dom_exc_virq"
> +external unbind : handle -> int -> unit = "stub_eventchn_unbind"
> +external pending : handle -> int = "stub_eventchn_pending"
> +external unmask : handle -> int -> unit
> +  = "stub_eventchn_unmask"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/eventchn/xeneventchn_stubs.c
> --- /dev/null
> +++ b/tools/ocaml/libs/eventchn/xeneventchn_stubs.c
> @@ -0,0 +1,143 @@
> +/*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + */
> +
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +#include <unistd.h>
> +#include <errno.h>
> +#include <stdint.h>
> +#include <sys/ioctl.h>
> +#include <xen/sysctl.h>
> +#include <xen/xen.h>
> +#include <xen/sys/evtchn.h>
> +#include <xenctrl.h>
> +
> +#define CAML_NAME_SPACE
> +#include <caml/mlvalues.h>
> +#include <caml/memory.h>
> +#include <caml/alloc.h>
> +#include <caml/custom.h>
> +#include <caml/callback.h>
> +#include <caml/fail.h>
> +
> +#define _H(__h) ((xc_interface *)(__h))
> +
> +CAMLprim value stub_eventchn_init(void)
> +{
> +       CAMLparam0();
> +       CAMLlocal1(result);
> +
> +       xc_interface *xce = xc_evtchn_open(NULL, XC_OPENFLAG_NON_REENTRANT);
> +       if (xce == NULL)
> +               caml_failwith("open failed");
> +
> +       result = (value)xce;
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_eventchn_fd(value xce)
> +{
> +       CAMLparam1(xce);
> +       CAMLlocal1(result);
> +       int fd;
> +
> +       fd = xc_evtchn_fd(_H(xce));
> +       if (fd == -1)
> +               caml_failwith("evtchn fd failed");
> +
> +       result = Val_int(fd);
> +
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_eventchn_notify(value xce, value port)
> +{
> +       CAMLparam2(xce, port);
> +       int rc;
> +
> +       rc = xc_evtchn_notify(_H(xce), Int_val(port));
> +       if (rc == -1)
> +               caml_failwith("evtchn notify failed");
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_eventchn_bind_interdomain(value xce, value domid,
> +                                              value remote_port)
> +{
> +       CAMLparam3(xce, domid, remote_port);
> +       CAMLlocal1(port);
> +       evtchn_port_or_error_t rc;
> +
> +       rc = xc_evtchn_bind_interdomain(_H(xce), Int_val(domid), Int_val(remote_port));
> +       if (rc == -1)
> +               caml_failwith("evtchn bind_interdomain failed");
> +       port = Val_int(rc);
> +
> +       CAMLreturn(port);
> +}
> +
> +CAMLprim value stub_eventchn_bind_dom_exc_virq(value xce)
> +{
> +       CAMLparam1(xce);
> +       CAMLlocal1(port);
> +       evtchn_port_or_error_t rc;
> +
> +       rc = xc_evtchn_bind_virq(_H(xce), VIRQ_DOM_EXC);
> +       if (rc == -1)
> +               caml_failwith("evtchn bind_dom_exc_virq failed");
> +       port = Val_int(rc);
> +
> +       CAMLreturn(port);
> +}
> +
> +CAMLprim value stub_eventchn_unbind(value xce, value port)
> +{
> +       CAMLparam2(xce, port);
> +       int rc;
> +
> +       rc = xc_evtchn_unbind(_H(xce), Int_val(port));
> +       if (rc == -1)
> +               caml_failwith("evtchn unbind failed");
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_eventchn_pending(value xce)
> +{
> +       CAMLparam1(xce);
> +       CAMLlocal1(result);
> +       evtchn_port_or_error_t port;
> +
> +       port = xc_evtchn_pending(_H(xce));
> +       if (port == -1)
> +               caml_failwith("evtchn pending failed");
> +       result = Val_int(port);
> +
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_eventchn_unmask(value xce, value _port)
> +{
> +       CAMLparam2(xce, _port);
> +       evtchn_port_t port;
> +
> +       port = Int_val(_port);
> +       if (xc_evtchn_unmask(_H(xce), port))
> +               caml_failwith("evtchn unmask failed");
> +       CAMLreturn(Val_unit);
> +}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/META.in
> --- a/tools/ocaml/libs/mmap/META.in
> +++ b/tools/ocaml/libs/mmap/META.in
> @@ -1,4 +1,4 @@
>  version = "@VERSION@"
>  description = "Mmap interface extension"
> -archive(byte) = "mmap.cma"
> -archive(native) = "mmap.cmxa"
> +archive(byte) = "xenmmap.cma"
> +archive(native) = "xenmmap.cmxa"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/Makefile
> --- a/tools/ocaml/libs/mmap/Makefile
> +++ b/tools/ocaml/libs/mmap/Makefile
> @@ -2,9 +2,9 @@
>  XEN_ROOT=$(TOPLEVEL)/../..
>  include $(TOPLEVEL)/common.make
> 
> -OBJS = mmap
> +OBJS = xenmmap
>  INTF = $(foreach obj, $(OBJS),$(obj).cmi)
> -LIBS = mmap.cma mmap.cmxa
> +LIBS = xenmmap.cma xenmmap.cmxa
> 
>  all: $(INTF) $(LIBS) $(PROGRAMS)
> 
> @@ -12,19 +12,19 @@
> 
>  libs: $(LIBS)
> 
> -mmap_OBJS = $(OBJS)
> -mmap_C_OBJS = mmap_stubs
> -OCAML_LIBRARY = mmap
> +xenmmap_OBJS = $(OBJS)
> +xenmmap_C_OBJS = xenmmap_stubs
> +OCAML_LIBRARY = xenmmap
> 
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) mmap
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore mmap META $(INTF) $(LIBS) *.a *.so *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenmmap
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenmmap META $(INTF) $(LIBS) *.a *.so *.cmx
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) mmap
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenmmap
> 
>  include $(TOPLEVEL)/Makefile.rules
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/mmap.ml
> --- a/tools/ocaml/libs/mmap/mmap.ml
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -type mmap_interface
> -
> -type mmap_prot_flag = RDONLY | WRONLY | RDWR
> -type mmap_map_flag = SHARED | PRIVATE
> -
> -(* mmap: fd -> prot_flag -> map_flag -> length -> offset -> interface *)
> -external mmap: Unix.file_descr -> mmap_prot_flag -> mmap_map_flag
> -               -> int -> int -> mmap_interface = "stub_mmap_init"
> -external unmap: mmap_interface -> unit = "stub_mmap_final"
> -(* read: interface -> start -> length -> data *)
> -external read: mmap_interface -> int -> int -> string = "stub_mmap_read"
> -(* write: interface -> data -> start -> length -> unit *)
> -external write: mmap_interface -> string -> int -> int -> unit = "stub_mmap_write"
> -(* getpagesize: unit -> size of page *)
> -external getpagesize: unit -> int = "stub_mmap_getpagesize"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/mmap.mli
> --- a/tools/ocaml/libs/mmap/mmap.mli
> +++ /dev/null
> @@ -1,28 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -type mmap_interface
> -type mmap_prot_flag = RDONLY | WRONLY | RDWR
> -type mmap_map_flag = SHARED | PRIVATE
> -
> -external mmap : Unix.file_descr -> mmap_prot_flag -> mmap_map_flag -> int -> int
> -             -> mmap_interface = "stub_mmap_init"
> -external unmap : mmap_interface -> unit = "stub_mmap_final"
> -external read : mmap_interface -> int -> int -> string = "stub_mmap_read"
> -external write : mmap_interface -> string -> int -> int -> unit
> -               = "stub_mmap_write"
> -
> -external getpagesize : unit -> int = "stub_mmap_getpagesize"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/mmap_stubs.c
> --- a/tools/ocaml/libs/mmap/mmap_stubs.c
> +++ /dev/null
> @@ -1,136 +0,0 @@
> -/*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - */
> -
> -#include <unistd.h>
> -#include <stdlib.h>
> -#include <sys/mman.h>
> -#include <string.h>
> -#include <errno.h>
> -#include "mmap_stubs.h"
> -
> -#include <caml/mlvalues.h>
> -#include <caml/memory.h>
> -#include <caml/alloc.h>
> -#include <caml/custom.h>
> -#include <caml/fail.h>
> -#include <caml/callback.h>
> -
> -#define GET_C_STRUCT(a) ((struct mmap_interface *) a)
> -
> -static int mmap_interface_init(struct mmap_interface *intf,
> -                               int fd, int pflag, int mflag,
> -                               int len, int offset)
> -{
> -       intf->len = len;
> -       intf->addr = mmap(NULL, len, pflag, mflag, fd, offset);
> -       return (intf->addr == MAP_FAILED) ? errno : 0;
> -}
> -
> -CAMLprim value stub_mmap_init(value fd, value pflag, value mflag,
> -                              value len, value offset)
> -{
> -       CAMLparam5(fd, pflag, mflag, len, offset);
> -       CAMLlocal1(result);
> -       int c_pflag, c_mflag;
> -
> -       switch (Int_val(pflag)) {
> -       case 0: c_pflag = PROT_READ; break;
> -       case 1: c_pflag = PROT_WRITE; break;
> -       case 2: c_pflag = PROT_READ|PROT_WRITE; break;
> -       default: caml_invalid_argument("protectiontype");
> -       }
> -
> -       switch (Int_val(mflag)) {
> -       case 0: c_mflag = MAP_SHARED; break;
> -       case 1: c_mflag = MAP_PRIVATE; break;
> -       default: caml_invalid_argument("maptype");
> -       }
> -
> -       result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
> -
> -       if (mmap_interface_init(GET_C_STRUCT(result), Int_val(fd),
> -                               c_pflag, c_mflag,
> -                               Int_val(len), Int_val(offset)))
> -               caml_failwith("mmap");
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_mmap_final(value interface)
> -{
> -       CAMLparam1(interface);
> -       struct mmap_interface *intf;
> -
> -       intf = GET_C_STRUCT(interface);
> -       if (intf->addr != MAP_FAILED)
> -               munmap(intf->addr, intf->len);
> -       intf->addr = MAP_FAILED;
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_mmap_read(value interface, value start, value len)
> -{
> -       CAMLparam3(interface, start, len);
> -       CAMLlocal1(data);
> -       struct mmap_interface *intf;
> -       int c_start;
> -       int c_len;
> -
> -       c_start = Int_val(start);
> -       c_len = Int_val(len);
> -       intf = GET_C_STRUCT(interface);
> -
> -       if (c_start > intf->len)
> -               caml_invalid_argument("start invalid");
> -       if (c_start + c_len > intf->len)
> -               caml_invalid_argument("len invalid");
> -
> -       data = caml_alloc_string(c_len);
> -       memcpy((char *) data, intf->addr + c_start, c_len);
> -
> -       CAMLreturn(data);
> -}
> -
> -CAMLprim value stub_mmap_write(value interface, value data,
> -                               value start, value len)
> -{
> -       CAMLparam4(interface, data, start, len);
> -       struct mmap_interface *intf;
> -       int c_start;
> -       int c_len;
> -
> -       c_start = Int_val(start);
> -       c_len = Int_val(len);
> -       intf = GET_C_STRUCT(interface);
> -
> -       if (c_start > intf->len)
> -               caml_invalid_argument("start invalid");
> -       if (c_start + c_len > intf->len)
> -               caml_invalid_argument("len invalid");
> -
> -       memcpy(intf->addr + c_start, (char *) data, c_len);
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_mmap_getpagesize(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLlocal1(data);
> -
> -       data = Val_int(getpagesize());
> -       CAMLreturn(data);
> -}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/xenmmap.ml
> --- /dev/null
> +++ b/tools/ocaml/libs/mmap/xenmmap.ml
> @@ -0,0 +1,31 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + *)
> +
> +type mmap_interface
> +
> +type mmap_prot_flag = RDONLY | WRONLY | RDWR
> +type mmap_map_flag = SHARED | PRIVATE
> +
> +(* mmap: fd -> prot_flag -> map_flag -> length -> offset -> interface *)
> +external mmap: Unix.file_descr -> mmap_prot_flag -> mmap_map_flag
> +               -> int -> int -> mmap_interface = "stub_mmap_init"
> +external unmap: mmap_interface -> unit = "stub_mmap_final"
> +(* read: interface -> start -> length -> data *)
> +external read: mmap_interface -> int -> int -> string = "stub_mmap_read"
> +(* write: interface -> data -> start -> length -> unit *)
> +external write: mmap_interface -> string -> int -> int -> unit = "stub_mmap_write"
> +(* getpagesize: unit -> size of page *)
> +external getpagesize: unit -> int = "stub_mmap_getpagesize"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/xenmmap.mli
> --- /dev/null
> +++ b/tools/ocaml/libs/mmap/xenmmap.mli
> @@ -0,0 +1,28 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + *)
> +
> +type mmap_interface
> +type mmap_prot_flag = RDONLY | WRONLY | RDWR
> +type mmap_map_flag = SHARED | PRIVATE
> +
> +external mmap : Unix.file_descr -> mmap_prot_flag -> mmap_map_flag -> int -> int
> +             -> mmap_interface = "stub_mmap_init"
> +external unmap : mmap_interface -> unit = "stub_mmap_final"
> +external read : mmap_interface -> int -> int -> string = "stub_mmap_read"
> +external write : mmap_interface -> string -> int -> int -> unit
> +               = "stub_mmap_write"
> +
> +external getpagesize : unit -> int = "stub_mmap_getpagesize"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/mmap/xenmmap_stubs.c
> --- /dev/null
> +++ b/tools/ocaml/libs/mmap/xenmmap_stubs.c
> @@ -0,0 +1,136 @@
> +/*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + */
> +
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <sys/mman.h>
> +#include <string.h>
> +#include <errno.h>
> +#include "mmap_stubs.h"
> +
> +#include <caml/mlvalues.h>
> +#include <caml/memory.h>
> +#include <caml/alloc.h>
> +#include <caml/custom.h>
> +#include <caml/fail.h>
> +#include <caml/callback.h>
> +
> +#define GET_C_STRUCT(a) ((struct mmap_interface *) a)
> +
> +static int mmap_interface_init(struct mmap_interface *intf,
> +                               int fd, int pflag, int mflag,
> +                               int len, int offset)
> +{
> +       intf->len = len;
> +       intf->addr = mmap(NULL, len, pflag, mflag, fd, offset);
> +       return (intf->addr == MAP_FAILED) ? errno : 0;
> +}
> +
> +CAMLprim value stub_mmap_init(value fd, value pflag, value mflag,
> +                              value len, value offset)
> +{
> +       CAMLparam5(fd, pflag, mflag, len, offset);
> +       CAMLlocal1(result);
> +       int c_pflag, c_mflag;
> +
> +       switch (Int_val(pflag)) {
> +       case 0: c_pflag = PROT_READ; break;
> +       case 1: c_pflag = PROT_WRITE; break;
> +       case 2: c_pflag = PROT_READ|PROT_WRITE; break;
> +       default: caml_invalid_argument("protectiontype");
> +       }
> +
> +       switch (Int_val(mflag)) {
> +       case 0: c_mflag = MAP_SHARED; break;
> +       case 1: c_mflag = MAP_PRIVATE; break;
> +       default: caml_invalid_argument("maptype");
> +       }
> +
> +       result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
> +
> +       if (mmap_interface_init(GET_C_STRUCT(result), Int_val(fd),
> +                               c_pflag, c_mflag,
> +                               Int_val(len), Int_val(offset)))
> +               caml_failwith("mmap");
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_mmap_final(value interface)
> +{
> +       CAMLparam1(interface);
> +       struct mmap_interface *intf;
> +
> +       intf = GET_C_STRUCT(interface);
> +       if (intf->addr != MAP_FAILED)
> +               munmap(intf->addr, intf->len);
> +       intf->addr = MAP_FAILED;
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_mmap_read(value interface, value start, value len)
> +{
> +       CAMLparam3(interface, start, len);
> +       CAMLlocal1(data);
> +       struct mmap_interface *intf;
> +       int c_start;
> +       int c_len;
> +
> +       c_start = Int_val(start);
> +       c_len = Int_val(len);
> +       intf = GET_C_STRUCT(interface);
> +
> +       if (c_start > intf->len)
> +               caml_invalid_argument("start invalid");
> +       if (c_start + c_len > intf->len)
> +               caml_invalid_argument("len invalid");
> +
> +       data = caml_alloc_string(c_len);
> +       memcpy((char *) data, intf->addr + c_start, c_len);
> +
> +       CAMLreturn(data);
> +}
> +
> +CAMLprim value stub_mmap_write(value interface, value data,
> +                               value start, value len)
> +{
> +       CAMLparam4(interface, data, start, len);
> +       struct mmap_interface *intf;
> +       int c_start;
> +       int c_len;
> +
> +       c_start = Int_val(start);
> +       c_len = Int_val(len);
> +       intf = GET_C_STRUCT(interface);
> +
> +       if (c_start > intf->len)
> +               caml_invalid_argument("start invalid");
> +       if (c_start + c_len > intf->len)
> +               caml_invalid_argument("len invalid");
> +
> +       memcpy(intf->addr + c_start, (char *) data, c_len);
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_mmap_getpagesize(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLlocal1(data);
> +
> +       data = Val_int(getpagesize());
> +       CAMLreturn(data);
> +}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/META.in
> --- a/tools/ocaml/libs/xb/META.in
> +++ b/tools/ocaml/libs/xb/META.in
> @@ -1,5 +1,5 @@
>  version = "@VERSION@"
>  description = "XenBus Interface"
> -requires = "unix,mmap"
> -archive(byte) = "xb.cma"
> -archive(native) = "xb.cmxa"
> +requires = "unix,xenmmap"
> +archive(byte) = "xenbus.cma"
> +archive(native) = "xenbus.cmxa"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/Makefile
> --- a/tools/ocaml/libs/xb/Makefile
> +++ b/tools/ocaml/libs/xb/Makefile
> @@ -6,6 +6,7 @@
>  CFLAGS += $(CFLAGS_libxenctrl) # For xen_mb()
>  CFLAGS += $(CFLAGS_xeninclude)
>  OCAMLINCLUDE += -I ../mmap
> +OCAMLOPTFLAGS += -for-pack Xenbus
> 
>  .NOTPARALLEL:
>  # Ocaml is such a PITA!
> @@ -15,7 +16,7 @@
>  PRELIBS = $(foreach obj, $(PREOBJS),$(obj).cmo) $(foreach obj,$(PREOJBS),$(obj).cmx)
>  OBJS = op partial packet xs_ring xb
>  INTF = op.cmi packet.cmi xb.cmi
> -LIBS = xb.cma xb.cmxa
> +LIBS = xenbus.cma xenbus.cmxa
> 
>  ALL_OCAML_OBJS = $(OBJS) $(PREOJBS)
> 
> @@ -25,22 +26,30 @@
> 
>  libs: $(LIBS)
> 
> -xb_OBJS = $(OBJS)
> -xb_C_OBJS = xs_ring_stubs xb_stubs
> -OCAML_LIBRARY = xb
> +xenbus_OBJS = xenbus
> +xenbus_C_OBJS = xs_ring_stubs xenbus_stubs
> +OCAML_LIBRARY = xenbus
> +
> +xenbus.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
> +       $(E) " CMX       $@"
> +       $(OCAMLOPT) -pack -o $@ $^
> +
> +xenbus.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
> +       $(E) " CMO       $@"
> +       $(OCAMLC) -pack -o $@ $^
> 
>  %.mli: %.ml
>         $(E) " MLI       $@"
> -       $(Q)$(OCAMLC) -i $< $o
> +       $(Q)$(OCAMLC) $(OCAMLINCLUDE) -i $< $o
> 
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xb
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xb META $(INTF) $(LIBS) *.a *.so *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenbus
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenbus META $(LIBS) xenbus.cmo xenbus.cmi xenbus.cmx *.a *.so
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xb
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenbus
> 
>  include $(TOPLEVEL)/Makefile.rules
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xb.ml
> --- a/tools/ocaml/libs/xb/xb.ml
> +++ b/tools/ocaml/libs/xb/xb.ml
> @@ -24,7 +24,7 @@
> 
>  type backend_mmap =
>  {
> -       mmap: Mmap.mmap_interface;     (* mmaped interface = xs_ring *)
> +       mmap: Xenmmap.mmap_interface;     (* mmaped interface = xs_ring *)
>         eventchn_notify: unit -> unit; (* function to notify through eventchn *)
>         mutable work_again: bool;
>  }
> @@ -34,7 +34,7 @@
>         fd: Unix.file_descr;
>  }
> 
> -type backend = Fd of backend_fd | Mmap of backend_mmap
> +type backend = Fd of backend_fd | Xenmmap of backend_mmap
> 
>  type partial_buf = HaveHdr of Partial.pkt | NoHdr of int * string
> 
> @@ -68,7 +68,7 @@
>  let read con s len =
>         match con.backend with
>         | Fd backfd     -> read_fd backfd con s len
> -       | Mmap backmmap -> read_mmap backmmap con s len
> +       | Xenmmap backmmap -> read_mmap backmmap con s len
> 
>  let write_fd back con s len =
>         Unix.write back.fd s 0 len
> @@ -82,7 +82,7 @@
>  let write con s len =
>         match con.backend with
>         | Fd backfd     -> write_fd backfd con s len
> -       | Mmap backmmap -> write_mmap backmmap con s len
> +       | Xenmmap backmmap -> write_mmap backmmap con s len
> 
>  let output con =
>         (* get the output string from a string_of(packet) or partial_out *)
> @@ -145,7 +145,7 @@
>  let open_fd fd = newcon (Fd { fd = fd; })
> 
>  let open_mmap mmap notifyfct =
> -       newcon (Mmap {
> +       newcon (Xenmmap {
>                 mmap = mmap;
>                 eventchn_notify = notifyfct;
>                 work_again = false; })
> @@ -153,12 +153,12 @@
>  let close con =
>         match con.backend with
>         | Fd backend   -> Unix.close backend.fd
> -       | Mmap backend -> Mmap.unmap backend.mmap
> +       | Xenmmap backend -> Xenmmap.unmap backend.mmap
> 
>  let is_fd con =
>         match con.backend with
>         | Fd _   -> true
> -       | Mmap _ -> false
> +       | Xenmmap _ -> false
> 
>  let is_mmap con = not (is_fd con)
> 
> @@ -176,14 +176,14 @@
>  let has_more_input con =
>         match con.backend with
>         | Fd _         -> false
> -       | Mmap backend -> backend.work_again
> +       | Xenmmap backend -> backend.work_again
> 
>  let is_selectable con =
>         match con.backend with
>         | Fd _   -> true
> -       | Mmap _ -> false
> +       | Xenmmap _ -> false
> 
>  let get_fd con =
>         match con.backend with
>         | Fd backend -> backend.fd
> -       | Mmap _     -> raise (Failure "get_fd")
> +       | Xenmmap _     -> raise (Failure "get_fd")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xb.mli
> --- a/tools/ocaml/libs/xb/xb.mli
> +++ b/tools/ocaml/libs/xb/xb.mli
> @@ -1,83 +1,103 @@
> -module Op:
> -sig
> -       type operation = Op.operation =
> -               | Debug
> -               | Directory
> -               | Read
> -               | Getperms
> -               | Watch
> -               | Unwatch
> -               | Transaction_start
> -               | Transaction_end
> -               | Introduce
> -               | Release
> -               | Getdomainpath
> -               | Write
> -               | Mkdir
> -               | Rm
> -               | Setperms
> -               | Watchevent
> -               | Error
> -               | Isintroduced
> -               | Resume
> -               | Set_target
> -               | Restrict
> -       val to_string : operation -> string
> -end
> -
> -module Packet:
> -sig
> -       type t
> -
> -       exception Error of string
> -       exception DataError of string
> -
> -       val create : int -> int -> Op.operation -> string -> t
> -       val unpack : t -> int * int * Op.operation * string
> -
> -       val get_tid : t -> int
> -       val get_ty : t -> Op.operation
> -       val get_data : t -> string
> -       val get_rid: t -> int
> -end
> -
> +module Op :
> +  sig
> +    type operation =
> +      Op.operation =
> +        Debug
> +      | Directory
> +      | Read
> +      | Getperms
> +      | Watch
> +      | Unwatch
> +      | Transaction_start
> +      | Transaction_end
> +      | Introduce
> +      | Release
> +      | Getdomainpath
> +      | Write
> +      | Mkdir
> +      | Rm
> +      | Setperms
> +      | Watchevent
> +      | Error
> +      | Isintroduced
> +      | Resume
> +      | Set_target
> +      | Restrict
> +    val operation_c_mapping : operation array
> +    val size : int
> +    val offset_pq : int
> +    val operation_c_mapping_pq : 'a array
> +    val size_pq : int
> +    val array_search : 'a -> 'a array -> int
> +    val of_cval : int -> operation
> +    val to_cval : operation -> int
> +    val to_string : operation -> string
> +  end
> +module Packet :
> +  sig
> +    type t =
> +      Packet.t = {
> +      tid : int;
> +      rid : int;
> +      ty : Op.operation;
> +      data : string;
> +    }
> +    exception Error of string
> +    exception DataError of string
> +    external string_of_header : int -> int -> int -> int -> string
> +      = "stub_string_of_header"
> +    val create : int -> int -> Op.operation -> string -> t
> +    val of_partialpkt : Partial.pkt -> t
> +    val to_string : t -> string
> +    val unpack : t -> int * int * Op.operation * string
> +    val get_tid : t -> int
> +    val get_ty : t -> Op.operation
> +    val get_data : t -> string
> +    val get_rid : t -> int
> +  end
>  exception End_of_file
>  exception Eagain
>  exception Noent
>  exception Invalid
> -
> -type t
> -
> -(** queue a packet into the output queue for later sending *)
> +type backend_mmap = {
> +  mmap : Xenmmap.mmap_interface;
> +  eventchn_notify : unit -> unit;
> +  mutable work_again : bool;
> +}
> +type backend_fd = { fd : Unix.file_descr; }
> +type backend = Fd of backend_fd | Xenmmap of backend_mmap
> +type partial_buf = HaveHdr of Partial.pkt | NoHdr of int * string
> +type t = {
> +  backend : backend;
> +  pkt_in : Packet.t Queue.t;
> +  pkt_out : Packet.t Queue.t;
> +  mutable partial_in : partial_buf;
> +  mutable partial_out : string;
> +}
> +val init_partial_in : unit -> partial_buf
>  val queue : t -> Packet.t -> unit
> -
> -(** process the output queue, return if a packet has been totally sent *)
> +val read_fd : backend_fd -> 'a -> string -> int -> int
> +val read_mmap : backend_mmap -> 'a -> string -> int -> int
> +val read : t -> string -> int -> int
> +val write_fd : backend_fd -> 'a -> string -> int -> int
> +val write_mmap : backend_mmap -> 'a -> string -> int -> int
> +val write : t -> string -> int -> int
>  val output : t -> bool
> -
> -(** process the input queue, return if a packet has been totally received *)
>  val input : t -> bool
> -
> -(** create new connection using a fd interface *)
> +val newcon : backend -> t
>  val open_fd : Unix.file_descr -> t
> -(** create new connection using a mmap intf and a function to notify eventchn *)
> -val open_mmap : Mmap.mmap_interface -> (unit -> unit) -> t
> -
> -(* close a connection *)
> +val open_mmap : Xenmmap.mmap_interface -> (unit -> unit) -> t
>  val close : t -> unit
> -
>  val is_fd : t -> bool
>  val is_mmap : t -> bool
> -
>  val output_len : t -> int
>  val has_new_output : t -> bool
>  val has_old_output : t -> bool
>  val has_output : t -> bool
>  val peek_output : t -> Packet.t
> -
>  val input_len : t -> int
>  val has_in_packet : t -> bool
>  val get_in_packet : t -> Packet.t
>  val has_more_input : t -> bool
> -
>  val is_selectable : t -> bool
>  val get_fd : t -> Unix.file_descr
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xb_stubs.c
> --- a/tools/ocaml/libs/xb/xb_stubs.c
> +++ /dev/null
> @@ -1,71 +0,0 @@
> -/*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - */
> -
> -#include <unistd.h>
> -#include <stdlib.h>
> -#include <sys/mman.h>
> -#include <string.h>
> -#include <errno.h>
> -
> -#include <caml/mlvalues.h>
> -#include <caml/memory.h>
> -#include <caml/alloc.h>
> -#include <caml/custom.h>
> -#include <caml/fail.h>
> -#include <caml/callback.h>
> -
> -#include <xenctrl.h>
> -#include <xen/io/xs_wire.h>
> -
> -CAMLprim value stub_header_size(void)
> -{
> -       CAMLparam0();
> -       CAMLreturn(Val_int(sizeof(struct xsd_sockmsg)));
> -}
> -
> -CAMLprim value stub_header_of_string(value s)
> -{
> -       CAMLparam1(s);
> -       CAMLlocal1(ret);
> -       struct xsd_sockmsg *hdr;
> -
> -       if (caml_string_length(s) != sizeof(struct xsd_sockmsg))
> -               caml_failwith("xb header incomplete");
> -       ret = caml_alloc_tuple(4);
> -       hdr = (struct xsd_sockmsg *) String_val(s);
> -       Store_field(ret, 0, Val_int(hdr->tx_id));
> -       Store_field(ret, 1, Val_int(hdr->req_id));
> -       Store_field(ret, 2, Val_int(hdr->type));
> -       Store_field(ret, 3, Val_int(hdr->len));
> -       CAMLreturn(ret);
> -}
> -
> -CAMLprim value stub_string_of_header(value tid, value rid, value ty, value len)
> -{
> -       CAMLparam4(tid, rid, ty, len);
> -       CAMLlocal1(ret);
> -       struct xsd_sockmsg xsd = {
> -               .type = Int_val(ty),
> -               .tx_id = Int_val(tid),
> -               .req_id = Int_val(rid),
> -               .len = Int_val(len),
> -       };
> -
> -       ret = caml_alloc_string(sizeof(struct xsd_sockmsg));
> -       memcpy(String_val(ret), &xsd, sizeof(struct xsd_sockmsg));
> -
> -       CAMLreturn(ret);
> -}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xenbus_stubs.c
> --- /dev/null
> +++ b/tools/ocaml/libs/xb/xenbus_stubs.c
> @@ -0,0 +1,71 @@
> +/*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + */
> +
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <sys/mman.h>
> +#include <string.h>
> +#include <errno.h>
> +
> +#include <caml/mlvalues.h>
> +#include <caml/memory.h>
> +#include <caml/alloc.h>
> +#include <caml/custom.h>
> +#include <caml/fail.h>
> +#include <caml/callback.h>
> +
> +#include <xenctrl.h>
> +#include <xen/io/xs_wire.h>
> +
> +CAMLprim value stub_header_size(void)
> +{
> +       CAMLparam0();
> +       CAMLreturn(Val_int(sizeof(struct xsd_sockmsg)));
> +}
> +
> +CAMLprim value stub_header_of_string(value s)
> +{
> +       CAMLparam1(s);
> +       CAMLlocal1(ret);
> +       struct xsd_sockmsg *hdr;
> +
> +       if (caml_string_length(s) != sizeof(struct xsd_sockmsg))
> +               caml_failwith("xb header incomplete");
> +       ret = caml_alloc_tuple(4);
> +       hdr = (struct xsd_sockmsg *) String_val(s);
> +       Store_field(ret, 0, Val_int(hdr->tx_id));
> +       Store_field(ret, 1, Val_int(hdr->req_id));
> +       Store_field(ret, 2, Val_int(hdr->type));
> +       Store_field(ret, 3, Val_int(hdr->len));
> +       CAMLreturn(ret);
> +}
> +
> +CAMLprim value stub_string_of_header(value tid, value rid, value ty, value len)
> +{
> +       CAMLparam4(tid, rid, ty, len);
> +       CAMLlocal1(ret);
> +       struct xsd_sockmsg xsd = {
> +               .type = Int_val(ty),
> +               .tx_id = Int_val(tid),
> +               .req_id = Int_val(rid),
> +               .len = Int_val(len),
> +       };
> +
> +       ret = caml_alloc_string(sizeof(struct xsd_sockmsg));
> +       memcpy(String_val(ret), &xsd, sizeof(struct xsd_sockmsg));
> +
> +       CAMLreturn(ret);
> +}
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/xs_ring.ml
> --- a/tools/ocaml/libs/xb/xs_ring.ml
> +++ b/tools/ocaml/libs/xb/xs_ring.ml
> @@ -14,5 +14,5 @@
>   * GNU Lesser General Public License for more details.
>   *)
> 
> -external read: Mmap.mmap_interface -> string -> int -> int = "ml_interface_read"
> -external write: Mmap.mmap_interface -> string -> int -> int = "ml_interface_write"
> +external read: Xenmmap.mmap_interface -> string -> int -> int = "ml_interface_read"
> +external write: Xenmmap.mmap_interface -> string -> int -> int = "ml_interface_write"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/META.in
> --- a/tools/ocaml/libs/xc/META.in
> +++ b/tools/ocaml/libs/xc/META.in
> @@ -1,5 +1,5 @@
>  version = "@VERSION@"
>  description = "Xen Control Interface"
> -requires = "mmap,uuid"
> -archive(byte) = "xc.cma"
> -archive(native) = "xc.cmxa"
> +requires = "xenmmap,uuid"
> +archive(byte) = "xenctrl.cma"
> +archive(native) = "xenctrl.cmxa"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/Makefile
> --- a/tools/ocaml/libs/xc/Makefile
> +++ b/tools/ocaml/libs/xc/Makefile
> @@ -5,16 +5,16 @@
>  CFLAGS += -I../mmap $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest)
>  OCAMLINCLUDE += -I ../mmap -I ../uuid
> 
> -OBJS = xc
> -INTF = xc.cmi
> -LIBS = xc.cma xc.cmxa
> +OBJS = xenctrl
> +INTF = xenctrl.cmi
> +LIBS = xenctrl.cma xenctrl.cmxa
> 
> -LIBS_xc = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest)
> +LIBS_xenctrl = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest)
> 
> -xc_OBJS = $(OBJS)
> -xc_C_OBJS = xc_stubs
> +xenctrl_OBJS = $(OBJS)
> +xenctrl_C_OBJS = xenctrl_stubs
> 
> -OCAML_LIBRARY = xc
> +OCAML_LIBRARY = xenctrl
> 
>  all: $(INTF) $(LIBS)
> 
> @@ -23,11 +23,11 @@
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xc
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xc META $(INTF) $(LIBS) *.a *.so *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenctrl
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenctrl META $(INTF) $(LIBS) *.a *.so *.cmx
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xc
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenctrl
> 
>  include $(TOPLEVEL)/Makefile.rules
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xc.ml
> --- a/tools/ocaml/libs/xc/xc.ml
> +++ /dev/null
> @@ -1,326 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -(** *)
> -type domid = int
> -
> -(* ** xenctrl.h ** *)
> -
> -type vcpuinfo =
> -{
> -       online: bool;
> -       blocked: bool;
> -       running: bool;
> -       cputime: int64;
> -       cpumap: int32;
> -}
> -
> -type domaininfo =
> -{
> -       domid             : domid;
> -       dying             : bool;
> -       shutdown          : bool;
> -       paused            : bool;
> -       blocked           : bool;
> -       running           : bool;
> -       hvm_guest         : bool;
> -       shutdown_code     : int;
> -       total_memory_pages: nativeint;
> -       max_memory_pages  : nativeint;
> -       shared_info_frame : int64;
> -       cpu_time          : int64;
> -       nr_online_vcpus   : int;
> -       max_vcpu_id       : int;
> -       ssidref           : int32;
> -       handle            : int array;
> -}
> -
> -type sched_control =
> -{
> -       weight : int;
> -       cap    : int;
> -}
> -
> -type physinfo_cap_flag =
> -       | CAP_HVM
> -       | CAP_DirectIO
> -
> -type physinfo =
> -{
> -       threads_per_core : int;
> -       cores_per_socket : int;
> -       nr_cpus          : int;
> -       max_node_id      : int;
> -       cpu_khz          : int;
> -       total_pages      : nativeint;
> -       free_pages       : nativeint;
> -       scrub_pages      : nativeint;
> -       (* XXX hw_cap *)
> -       capabilities     : physinfo_cap_flag list;
> -}
> -
> -type version =
> -{
> -       major : int;
> -       minor : int;
> -       extra : string;
> -}
> -
> -
> -type compile_info =
> -{
> -       compiler : string;
> -       compile_by : string;
> -       compile_domain : string;
> -       compile_date : string;
> -}
> -
> -type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
> -
> -type domain_create_flag = CDF_HVM | CDF_HAP
> -
> -exception Error of string
> -
> -type handle
> -
> -(* this is only use by coredumping *)
> -external sizeof_core_header: unit -> int
> -       = "stub_sizeof_core_header"
> -external sizeof_vcpu_guest_context: unit -> int
> -       = "stub_sizeof_vcpu_guest_context"
> -external sizeof_xen_pfn: unit -> int = "stub_sizeof_xen_pfn"
> -(* end of use *)
> -
> -external interface_open: unit -> handle = "stub_xc_interface_open"
> -external interface_close: handle -> unit = "stub_xc_interface_close"
> -
> -external is_fake: unit -> bool = "stub_xc_interface_is_fake"
> -
> -let with_intf f =
> -       let xc = interface_open () in
> -       let r = try f xc with exn -> interface_close xc; raise exn in
> -       interface_close xc;
> -       r
> -
> -external _domain_create: handle -> int32 -> domain_create_flag list -> int array -> domid
> -       = "stub_xc_domain_create"
> -
> -let domain_create handle n flags uuid =
> -       _domain_create handle n flags (Uuid.int_array_of_uuid uuid)
> -
> -external _domain_sethandle: handle -> domid -> int array -> unit
> -                          = "stub_xc_domain_sethandle"
> -
> -let domain_sethandle handle n uuid =
> -       _domain_sethandle handle n (Uuid.int_array_of_uuid uuid)
> -
> -external domain_max_vcpus: handle -> domid -> int -> unit
> -       = "stub_xc_domain_max_vcpus"
> -
> -external domain_pause: handle -> domid -> unit = "stub_xc_domain_pause"
> -external domain_unpause: handle -> domid -> unit = "stub_xc_domain_unpause"
> -external domain_resume_fast: handle -> domid -> unit = "stub_xc_domain_resume_fast"
> -external domain_destroy: handle -> domid -> unit = "stub_xc_domain_destroy"
> -
> -external domain_shutdown: handle -> domid -> shutdown_reason -> unit
> -       = "stub_xc_domain_shutdown"
> -
> -external _domain_getinfolist: handle -> domid -> int -> domaininfo list
> -       = "stub_xc_domain_getinfolist"
> -
> -let domain_getinfolist handle first_domain =
> -       let nb = 2 in
> -       let last_domid l = (List.hd l).domid + 1 in
> -       let rec __getlist from =
> -               let l = _domain_getinfolist handle from nb in
> -               (if List.length l = nb then __getlist (last_domid l) else []) @ l
> -               in
> -       List.rev (__getlist first_domain)
> -
> -external domain_getinfo: handle -> domid -> domaininfo= "stub_xc_domain_getinfo"
> -
> -external domain_get_vcpuinfo: handle -> int -> int -> vcpuinfo
> -       = "stub_xc_vcpu_getinfo"
> -
> -external domain_ioport_permission: handle -> domid -> int -> int -> bool -> unit
> -       = "stub_xc_domain_ioport_permission"
> -external domain_iomem_permission: handle -> domid -> nativeint -> nativeint -> bool -> unit
> -       = "stub_xc_domain_iomem_permission"
> -external domain_irq_permission: handle -> domid -> int -> bool -> unit
> -       = "stub_xc_domain_irq_permission"
> -
> -external vcpu_affinity_set: handle -> domid -> int -> bool array -> unit
> -       = "stub_xc_vcpu_setaffinity"
> -external vcpu_affinity_get: handle -> domid -> int -> bool array
> -       = "stub_xc_vcpu_getaffinity"
> -
> -external vcpu_context_get: handle -> domid -> int -> string
> -       = "stub_xc_vcpu_context_get"
> -
> -external sched_id: handle -> int = "stub_xc_sched_id"
> -
> -external sched_credit_domain_set: handle -> domid -> sched_control -> unit
> -       = "stub_sched_credit_domain_set"
> -external sched_credit_domain_get: handle -> domid -> sched_control
> -       = "stub_sched_credit_domain_get"
> -
> -external shadow_allocation_set: handle -> domid -> int -> unit
> -       = "stub_shadow_allocation_set"
> -external shadow_allocation_get: handle -> domid -> int
> -       = "stub_shadow_allocation_get"
> -
> -external evtchn_alloc_unbound: handle -> domid -> domid -> int
> -       = "stub_xc_evtchn_alloc_unbound"
> -external evtchn_reset: handle -> domid -> unit = "stub_xc_evtchn_reset"
> -
> -external readconsolering: handle -> string = "stub_xc_readconsolering"
> -
> -external send_debug_keys: handle -> string -> unit = "stub_xc_send_debug_keys"
> -external physinfo: handle -> physinfo = "stub_xc_physinfo"
> -external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
> -
> -external domain_setmaxmem: handle -> domid -> int64 -> unit
> -       = "stub_xc_domain_setmaxmem"
> -external domain_set_memmap_limit: handle -> domid -> int64 -> unit
> -       = "stub_xc_domain_set_memmap_limit"
> -external domain_memory_increase_reservation: handle -> domid -> int64 -> unit
> -       = "stub_xc_domain_memory_increase_reservation"
> -
> -external domain_set_machine_address_size: handle -> domid -> int -> unit
> -       = "stub_xc_domain_set_machine_address_size"
> -external domain_get_machine_address_size: handle -> domid -> int
> -       = "stub_xc_domain_get_machine_address_size"
> -
> -external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
> -                        -> string option array
> -                        -> string option array
> -       = "stub_xc_domain_cpuid_set"
> -external domain_cpuid_apply_policy: handle -> domid -> unit
> -       = "stub_xc_domain_cpuid_apply_policy"
> -external cpuid_check: handle -> (int64 * (int64 option)) -> string option array -> (bool * string option array)
> -       = "stub_xc_cpuid_check"
> -
> -external map_foreign_range: handle -> domid -> int
> -                         -> nativeint -> Mmap.mmap_interface
> -       = "stub_map_foreign_range"
> -
> -external domain_get_pfn_list: handle -> domid -> nativeint -> nativeint array
> -       = "stub_xc_domain_get_pfn_list"
> -
> -external domain_assign_device: handle -> domid -> (int * int * int * int) -> unit
> -       = "stub_xc_domain_assign_device"
> -external domain_deassign_device: handle -> domid -> (int * int * int * int) -> unit
> -       = "stub_xc_domain_deassign_device"
> -external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool
> -       = "stub_xc_domain_test_assign_device"
> -
> -external version: handle -> version = "stub_xc_version_version"
> -external version_compile_info: handle -> compile_info
> -       = "stub_xc_version_compile_info"
> -external version_changeset: handle -> string = "stub_xc_version_changeset"
> -external version_capabilities: handle -> string =
> -  "stub_xc_version_capabilities"
> -
> -external watchdog : handle -> int -> int32 -> int
> -  = "stub_xc_watchdog"
> -
> -(* core dump structure *)
> -type core_magic = Magic_hvm | Magic_pv
> -
> -type core_header = {
> -       xch_magic: core_magic;
> -       xch_nr_vcpus: int;
> -       xch_nr_pages: nativeint;
> -       xch_index_offset: int64;
> -       xch_ctxt_offset: int64;
> -       xch_pages_offset: int64;
> -}
> -
> -external marshall_core_header: core_header -> string = "stub_marshall_core_header"
> -
> -(* coredump *)
> -let coredump xch domid fd =
> -       let dump s =
> -               let wd = Unix.write fd s 0 (String.length s) in
> -               if wd <> String.length s then
> -                       failwith "error while writing";
> -               in
> -
> -       let info = domain_getinfo xch domid in
> -
> -       let nrpages = info.total_memory_pages in
> -       let ctxt = Array.make info.max_vcpu_id None in
> -       let nr_vcpus = ref 0 in
> -       for i = 0 to info.max_vcpu_id - 1
> -       do
> -               ctxt.(i) <- try
> -                       let v = vcpu_context_get xch domid i in
> -                       incr nr_vcpus;
> -                       Some v
> -                       with _ -> None
> -       done;
> -
> -       (* FIXME page offset if not rounded to sup *)
> -       let page_offset =
> -               Int64.add
> -                       (Int64.of_int (sizeof_core_header () +
> -                        (sizeof_vcpu_guest_context () * !nr_vcpus)))
> -                       (Int64.of_nativeint (
> -                               Nativeint.mul
> -                                       (Nativeint.of_int (sizeof_xen_pfn ()))
> -                                       nrpages)
> -                               )
> -               in
> -
> -       let header = {
> -               xch_magic = if info.hvm_guest then Magic_hvm else Magic_pv;
> -               xch_nr_vcpus = !nr_vcpus;
> -               xch_nr_pages = nrpages;
> -               xch_ctxt_offset = Int64.of_int (sizeof_core_header ());
> -               xch_index_offset = Int64.of_int (sizeof_core_header ()
> -                                       + sizeof_vcpu_guest_context ());
> -               xch_pages_offset = page_offset;
> -       } in
> -
> -       dump (marshall_core_header header);
> -       for i = 0 to info.max_vcpu_id - 1
> -       do
> -               match ctxt.(i) with
> -               | None -> ()
> -               | Some ctxt_i -> dump ctxt_i
> -       done;
> -       let pfns = domain_get_pfn_list xch domid nrpages in
> -       if Array.length pfns <> Nativeint.to_int nrpages then
> -               failwith "could not get the page frame list";
> -
> -       let page_size = Mmap.getpagesize () in
> -       for i = 0 to Nativeint.to_int nrpages - 1
> -       do
> -               let page = map_foreign_range xch domid page_size pfns.(i) in
> -               let data = Mmap.read page 0 page_size in
> -               Mmap.unmap page;
> -               dump data
> -       done
> -
> -(* ** Misc ** *)
> -
> -(**
> -   Convert the given number of pages to an amount in KiB, rounded up.
> - *)
> -external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
> -let pages_to_mib pages = Int64.div (pages_to_kib pages) 1024L
> -
> -let _ = Callback.register_exception "xc.error" (Error "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xc.mli
> --- a/tools/ocaml/libs/xc/xc.mli
> +++ /dev/null
> @@ -1,184 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -type domid = int
> -type vcpuinfo = {
> -  online : bool;
> -  blocked : bool;
> -  running : bool;
> -  cputime : int64;
> -  cpumap : int32;
> -}
> -type domaininfo = {
> -  domid : domid;
> -  dying : bool;
> -  shutdown : bool;
> -  paused : bool;
> -  blocked : bool;
> -  running : bool;
> -  hvm_guest : bool;
> -  shutdown_code : int;
> -  total_memory_pages : nativeint;
> -  max_memory_pages : nativeint;
> -  shared_info_frame : int64;
> -  cpu_time : int64;
> -  nr_online_vcpus : int;
> -  max_vcpu_id : int;
> -  ssidref : int32;
> -  handle : int array;
> -}
> -type sched_control = { weight : int; cap : int; }
> -type physinfo_cap_flag = CAP_HVM | CAP_DirectIO
> -type physinfo = {
> -  threads_per_core : int;
> -  cores_per_socket : int;
> -  nr_cpus          : int;
> -  max_node_id      : int;
> -  cpu_khz          : int;
> -  total_pages      : nativeint;
> -  free_pages       : nativeint;
> -  scrub_pages      : nativeint;
> -  capabilities     : physinfo_cap_flag list;
> -}
> -type version = { major : int; minor : int; extra : string; }
> -type compile_info = {
> -  compiler : string;
> -  compile_by : string;
> -  compile_domain : string;
> -  compile_date : string;
> -}
> -type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
> -
> -type domain_create_flag = CDF_HVM | CDF_HAP
> -
> -exception Error of string
> -type handle
> -external sizeof_core_header : unit -> int = "stub_sizeof_core_header"
> -external sizeof_vcpu_guest_context : unit -> int
> -  = "stub_sizeof_vcpu_guest_context"
> -external sizeof_xen_pfn : unit -> int = "stub_sizeof_xen_pfn"
> -external interface_open : unit -> handle = "stub_xc_interface_open"
> -external is_fake : unit -> bool = "stub_xc_interface_is_fake"
> -external interface_close : handle -> unit = "stub_xc_interface_close"
> -val with_intf : (handle -> 'a) -> 'a
> -external _domain_create : handle -> int32 -> domain_create_flag list -> int array -> domid
> -  = "stub_xc_domain_create"
> -val domain_create : handle -> int32 -> domain_create_flag list -> 'a Uuid.t -> domid
> -external _domain_sethandle : handle -> domid -> int array -> unit
> -  = "stub_xc_domain_sethandle"
> -val domain_sethandle : handle -> domid -> 'a Uuid.t -> unit
> -external domain_max_vcpus : handle -> domid -> int -> unit
> -  = "stub_xc_domain_max_vcpus"
> -external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause"
> -external domain_unpause : handle -> domid -> unit = "stub_xc_domain_unpause"
> -external domain_resume_fast : handle -> domid -> unit
> -  = "stub_xc_domain_resume_fast"
> -external domain_destroy : handle -> domid -> unit = "stub_xc_domain_destroy"
> -external domain_shutdown : handle -> domid -> shutdown_reason -> unit
> -  = "stub_xc_domain_shutdown"
> -external _domain_getinfolist : handle -> domid -> int -> domaininfo list
> -  = "stub_xc_domain_getinfolist"
> -val domain_getinfolist : handle -> domid -> domaininfo list
> -external domain_getinfo : handle -> domid -> domaininfo
> -  = "stub_xc_domain_getinfo"
> -external domain_get_vcpuinfo : handle -> int -> int -> vcpuinfo
> -  = "stub_xc_vcpu_getinfo"
> -external domain_ioport_permission: handle -> domid -> int -> int -> bool -> unit
> -       = "stub_xc_domain_ioport_permission"
> -external domain_iomem_permission: handle -> domid -> nativeint -> nativeint -> bool -> unit
> -       = "stub_xc_domain_iomem_permission"
> -external domain_irq_permission: handle -> domid -> int -> bool -> unit
> -       = "stub_xc_domain_irq_permission"
> -external vcpu_affinity_set : handle -> domid -> int -> bool array -> unit
> -  = "stub_xc_vcpu_setaffinity"
> -external vcpu_affinity_get : handle -> domid -> int -> bool array
> -  = "stub_xc_vcpu_getaffinity"
> -external vcpu_context_get : handle -> domid -> int -> string
> -  = "stub_xc_vcpu_context_get"
> -external sched_id : handle -> int = "stub_xc_sched_id"
> -external sched_credit_domain_set : handle -> domid -> sched_control -> unit
> -  = "stub_sched_credit_domain_set"
> -external sched_credit_domain_get : handle -> domid -> sched_control
> -  = "stub_sched_credit_domain_get"
> -external shadow_allocation_set : handle -> domid -> int -> unit
> -  = "stub_shadow_allocation_set"
> -external shadow_allocation_get : handle -> domid -> int
> -  = "stub_shadow_allocation_get"
> -external evtchn_alloc_unbound : handle -> domid -> domid -> int
> -  = "stub_xc_evtchn_alloc_unbound"
> -external evtchn_reset : handle -> domid -> unit = "stub_xc_evtchn_reset"
> -external readconsolering : handle -> string = "stub_xc_readconsolering"
> -external send_debug_keys : handle -> string -> unit = "stub_xc_send_debug_keys"
> -external physinfo : handle -> physinfo = "stub_xc_physinfo"
> -external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
> -external domain_setmaxmem : handle -> domid -> int64 -> unit
> -  = "stub_xc_domain_setmaxmem"
> -external domain_set_memmap_limit : handle -> domid -> int64 -> unit
> -  = "stub_xc_domain_set_memmap_limit"
> -external domain_memory_increase_reservation :
> -  handle -> domid -> int64 -> unit
> -  = "stub_xc_domain_memory_increase_reservation"
> -external map_foreign_range :
> -  handle -> domid -> int -> nativeint -> Mmap.mmap_interface
> -  = "stub_map_foreign_range"
> -external domain_get_pfn_list :
> -  handle -> domid -> nativeint -> nativeint array
> -  = "stub_xc_domain_get_pfn_list"
> -
> -external domain_assign_device: handle -> domid -> (int * int * int * int) -> unit
> -       = "stub_xc_domain_assign_device"
> -external domain_deassign_device: handle -> domid -> (int * int * int * int) -> unit
> -       = "stub_xc_domain_deassign_device"
> -external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool
> -       = "stub_xc_domain_test_assign_device"
> -
> -external version : handle -> version = "stub_xc_version_version"
> -external version_compile_info : handle -> compile_info
> -  = "stub_xc_version_compile_info"
> -external version_changeset : handle -> string = "stub_xc_version_changeset"
> -external version_capabilities : handle -> string
> -  = "stub_xc_version_capabilities"
> -type core_magic = Magic_hvm | Magic_pv
> -type core_header = {
> -  xch_magic : core_magic;
> -  xch_nr_vcpus : int;
> -  xch_nr_pages : nativeint;
> -  xch_index_offset : int64;
> -  xch_ctxt_offset : int64;
> -  xch_pages_offset : int64;
> -}
> -external marshall_core_header : core_header -> string
> -  = "stub_marshall_core_header"
> -val coredump : handle -> domid -> Unix.file_descr -> unit
> -external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
> -val pages_to_mib : int64 -> int64
> -external watchdog : handle -> int -> int32 -> int
> -  = "stub_xc_watchdog"
> -
> -external domain_set_machine_address_size: handle -> domid -> int -> unit
> -  = "stub_xc_domain_set_machine_address_size"
> -external domain_get_machine_address_size: handle -> domid -> int
> -       = "stub_xc_domain_get_machine_address_size"
> -
> -external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
> -                        -> string option array
> -                        -> string option array
> -       = "stub_xc_domain_cpuid_set"
> -external domain_cpuid_apply_policy: handle -> domid -> unit
> -       = "stub_xc_domain_cpuid_apply_policy"
> -external cpuid_check: handle -> (int64 * (int64 option)) -> string option array -> (bool * string option array)
> -       = "stub_xc_cpuid_check"
> -
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xc_stubs.c
> --- a/tools/ocaml/libs/xc/xc_stubs.c
> +++ /dev/null
> @@ -1,1161 +0,0 @@
> -/*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - */
> -
> -#define _XOPEN_SOURCE 600
> -#include <stdlib.h>
> -#include <errno.h>
> -
> -#define CAML_NAME_SPACE
> -#include <caml/alloc.h>
> -#include <caml/memory.h>
> -#include <caml/signals.h>
> -#include <caml/fail.h>
> -#include <caml/callback.h>
> -
> -#include <sys/mman.h>
> -#include <stdint.h>
> -#include <string.h>
> -
> -#include <xenctrl.h>
> -
> -#include "mmap_stubs.h"
> -
> -#define PAGE_SHIFT             12
> -#define PAGE_SIZE               (1UL << PAGE_SHIFT)
> -#define PAGE_MASK               (~(PAGE_SIZE-1))
> -
> -#define _H(__h) ((xc_interface *)(__h))
> -#define _D(__d) ((uint32_t)Int_val(__d))
> -
> -#define Val_none (Val_int(0))
> -
> -#define string_of_option_array(array, index) \
> -       ((Field(array, index) == Val_none) ? NULL : String_val(Field(Field(array, index), 0)))
> -
> -/* maybe here we should check the range of the input instead of blindly
> - * casting it to uint32 */
> -#define cpuid_input_of_val(i1, i2, input) \
> -       i1 = (uint32_t) Int64_val(Field(input, 0)); \
> -       i2 = ((Field(input, 1) == Val_none) ? 0xffffffff : (uint32_t) Int64_val(Field(Field(input, 1), 0)));
> -
> -#define ERROR_STRLEN 1024
> -void failwith_xc(xc_interface *xch)
> -{
> -       static char error_str[ERROR_STRLEN];
> -       if (xch) {
> -               const xc_error *error = xc_get_last_error(xch);
> -               if (error->code == XC_ERROR_NONE)
> -                       snprintf(error_str, ERROR_STRLEN, "%d: %s", errno, strerror(errno));
> -               else
> -                       snprintf(error_str, ERROR_STRLEN, "%d: %s: %s",
> -                                error->code,
> -                                xc_error_code_to_desc(error->code),
> -                                error->message);
> -       } else {
> -               snprintf(error_str, ERROR_STRLEN, "Unable to open XC interface");
> -       }
> -       caml_raise_with_string(*caml_named_value("xc.error"), error_str);
> -}
> -
> -CAMLprim value stub_sizeof_core_header(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLreturn(Val_int(sizeof(struct xc_core_header)));
> -}
> -
> -CAMLprim value stub_sizeof_vcpu_guest_context(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLreturn(Val_int(sizeof(struct vcpu_guest_context)));
> -}
> -
> -CAMLprim value stub_sizeof_xen_pfn(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLreturn(Val_int(sizeof(xen_pfn_t)));
> -}
> -
> -#define XC_CORE_MAGIC     0xF00FEBED
> -#define XC_CORE_MAGIC_HVM 0xF00FEBEE
> -
> -CAMLprim value stub_marshall_core_header(value header)
> -{
> -       CAMLparam1(header);
> -       CAMLlocal1(s);
> -       struct xc_core_header c_header;
> -
> -       c_header.xch_magic = (Field(header, 0))
> -               ? XC_CORE_MAGIC
> -               : XC_CORE_MAGIC_HVM;
> -       c_header.xch_nr_vcpus = Int_val(Field(header, 1));
> -       c_header.xch_nr_pages = Nativeint_val(Field(header, 2));
> -       c_header.xch_ctxt_offset = Int64_val(Field(header, 3));
> -       c_header.xch_index_offset = Int64_val(Field(header, 4));
> -       c_header.xch_pages_offset = Int64_val(Field(header, 5));
> -
> -       s = caml_alloc_string(sizeof(c_header));
> -       memcpy(String_val(s), (char *) &c_header, sizeof(c_header));
> -       CAMLreturn(s);
> -}
> -
> -CAMLprim value stub_xc_interface_open(void)
> -{
> -       CAMLparam0();
> -        xc_interface *xch;
> -        xch = xc_interface_open(NULL, NULL, XC_OPENFLAG_NON_REENTRANT);
> -        if (xch == NULL)
> -               failwith_xc(NULL);
> -        CAMLreturn((value)xch);
> -}
> -
> -
> -CAMLprim value stub_xc_interface_is_fake(void)
> -{
> -       CAMLparam0();
> -       int is_fake = xc_interface_is_fake();
> -       CAMLreturn(Val_int(is_fake));
> -}
> -
> -CAMLprim value stub_xc_interface_close(value xch)
> -{
> -       CAMLparam1(xch);
> -
> -       // caml_enter_blocking_section();
> -       xc_interface_close(_H(xch));
> -       // caml_leave_blocking_section();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -static int domain_create_flag_table[] = {
> -       XEN_DOMCTL_CDF_hvm_guest,
> -       XEN_DOMCTL_CDF_hap,
> -};
> -
> -CAMLprim value stub_xc_domain_create(value xch, value ssidref,
> -                                     value flags, value handle)
> -{
> -       CAMLparam4(xch, ssidref, flags, handle);
> -
> -       uint32_t domid = 0;
> -       xen_domain_handle_t h = { 0 };
> -       int result;
> -       int i;
> -       uint32_t c_ssidref = Int32_val(ssidref);
> -       unsigned int c_flags = 0;
> -       value l;
> -
> -        if (Wosize_val(handle) != 16)
> -               caml_invalid_argument("Handle not a 16-integer array");
> -
> -       for (i = 0; i < sizeof(h); i++) {
> -               h[i] = Int_val(Field(handle, i)) & 0xff;
> -       }
> -
> -       for (l = flags; l != Val_none; l = Field(l, 1)) {
> -               int v = Int_val(Field(l, 0));
> -               c_flags |= domain_create_flag_table[v];
> -       }
> -
> -       // caml_enter_blocking_section();
> -       result = xc_domain_create(_H(xch), c_ssidref, h, c_flags, &domid);
> -       // caml_leave_blocking_section();
> -
> -       if (result < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_int(domid));
> -}
> -
> -CAMLprim value stub_xc_domain_max_vcpus(value xch, value domid,
> -                                        value max_vcpus)
> -{
> -       CAMLparam3(xch, domid, max_vcpus);
> -       int r;
> -
> -       r = xc_domain_max_vcpus(_H(xch), _D(domid), Int_val(max_vcpus));
> -       if (r)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -
> -value stub_xc_domain_sethandle(value xch, value domid, value handle)
> -{
> -       CAMLparam3(xch, domid, handle);
> -       xen_domain_handle_t h = { 0 };
> -       int i;
> -
> -        if (Wosize_val(handle) != 16)
> -               caml_invalid_argument("Handle not a 16-integer array");
> -
> -       for (i = 0; i < sizeof(h); i++) {
> -               h[i] = Int_val(Field(handle, i)) & 0xff;
> -       }
> -
> -       i = xc_domain_sethandle(_H(xch), _D(domid), h);
> -       if (i)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -static value dom_op(value xch, value domid, int (*fn)(xc_interface *, uint32_t))
> -{
> -       CAMLparam2(xch, domid);
> -
> -       uint32_t c_domid = _D(domid);
> -
> -       // caml_enter_blocking_section();
> -       int result = fn(_H(xch), c_domid);
> -       // caml_leave_blocking_section();
> -        if (result)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_pause(value xch, value domid)
> -{
> -       return dom_op(xch, domid, xc_domain_pause);
> -}
> -
> -
> -CAMLprim value stub_xc_domain_unpause(value xch, value domid)
> -{
> -       return dom_op(xch, domid, xc_domain_unpause);
> -}
> -
> -CAMLprim value stub_xc_domain_destroy(value xch, value domid)
> -{
> -       return dom_op(xch, domid, xc_domain_destroy);
> -}
> -
> -CAMLprim value stub_xc_domain_resume_fast(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -
> -       uint32_t c_domid = _D(domid);
> -
> -       // caml_enter_blocking_section();
> -       int result = xc_domain_resume(_H(xch), c_domid, 1);
> -       // caml_leave_blocking_section();
> -        if (result)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_shutdown(value xch, value domid, value reason)
> -{
> -       CAMLparam3(xch, domid, reason);
> -       int ret;
> -
> -       ret = xc_domain_shutdown(_H(xch), _D(domid), Int_val(reason));
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -static value alloc_domaininfo(xc_domaininfo_t * info)
> -{
> -       CAMLparam0();
> -       CAMLlocal2(result, tmp);
> -       int i;
> -
> -       result = caml_alloc_tuple(16);
> -
> -       Store_field(result,  0, Val_int(info->domain));
> -       Store_field(result,  1, Val_bool(info->flags & XEN_DOMINF_dying));
> -       Store_field(result,  2, Val_bool(info->flags & XEN_DOMINF_shutdown));
> -       Store_field(result,  3, Val_bool(info->flags & XEN_DOMINF_paused));
> -       Store_field(result,  4, Val_bool(info->flags & XEN_DOMINF_blocked));
> -       Store_field(result,  5, Val_bool(info->flags & XEN_DOMINF_running));
> -       Store_field(result,  6, Val_bool(info->flags & XEN_DOMINF_hvm_guest));
> -       Store_field(result,  7, Val_int((info->flags >> XEN_DOMINF_shutdownshift)
> -                                        & XEN_DOMINF_shutdownmask));
> -       Store_field(result,  8, caml_copy_nativeint(info->tot_pages));
> -       Store_field(result,  9, caml_copy_nativeint(info->max_pages));
> -       Store_field(result, 10, caml_copy_int64(info->shared_info_frame));
> -       Store_field(result, 11, caml_copy_int64(info->cpu_time));
> -       Store_field(result, 12, Val_int(info->nr_online_vcpus));
> -       Store_field(result, 13, Val_int(info->max_vcpu_id));
> -       Store_field(result, 14, caml_copy_int32(info->ssidref));
> -
> -        tmp = caml_alloc_small(16, 0);
> -       for (i = 0; i < 16; i++) {
> -               Field(tmp, i) = Val_int(info->handle[i]);
> -       }
> -
> -       Store_field(result, 15, tmp);
> -
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_xc_domain_getinfolist(value xch, value first_domain, value nb)
> -{
> -       CAMLparam3(xch, first_domain, nb);
> -       CAMLlocal2(result, temp);
> -       xc_domaininfo_t * info;
> -       int i, ret, toalloc, retval;
> -       unsigned int c_max_domains;
> -       uint32_t c_first_domain;
> -
> -       /* get the minimum number of allocate byte we need and bump it up to page boundary */
> -       toalloc = (sizeof(xc_domaininfo_t) * Int_val(nb)) | 0xfff;
> -       ret = posix_memalign((void **) ((void *) &info), 4096, toalloc);
> -       if (ret)
> -               caml_raise_out_of_memory();
> -
> -       result = temp = Val_emptylist;
> -
> -       c_first_domain = _D(first_domain);
> -       c_max_domains = Int_val(nb);
> -       // caml_enter_blocking_section();
> -       retval = xc_domain_getinfolist(_H(xch), c_first_domain,
> -                                      c_max_domains, info);
> -       // caml_leave_blocking_section();
> -
> -       if (retval < 0) {
> -               free(info);
> -               failwith_xc(_H(xch));
> -       }
> -       for (i = 0; i < retval; i++) {
> -               result = caml_alloc_small(2, Tag_cons);
> -               Field(result, 0) = Val_int(0);
> -               Field(result, 1) = temp;
> -               temp = result;
> -
> -               Store_field(result, 0, alloc_domaininfo(info + i));
> -       }
> -
> -       free(info);
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_xc_domain_getinfo(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       CAMLlocal1(result);
> -       xc_domaininfo_t info;
> -       int ret;
> -
> -       ret = xc_domain_getinfolist(_H(xch), _D(domid), 1, &info);
> -       if (ret != 1)
> -               failwith_xc(_H(xch));
> -       if (info.domain != _D(domid))
> -               failwith_xc(_H(xch));
> -
> -       result = alloc_domaininfo(&info);
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_xc_vcpu_getinfo(value xch, value domid, value vcpu)
> -{
> -       CAMLparam3(xch, domid, vcpu);
> -       CAMLlocal1(result);
> -       xc_vcpuinfo_t info;
> -       int retval;
> -
> -       uint32_t c_domid = _D(domid);
> -       uint32_t c_vcpu = Int_val(vcpu);
> -       // caml_enter_blocking_section();
> -       retval = xc_vcpu_getinfo(_H(xch), c_domid,
> -                                c_vcpu, &info);
> -       // caml_leave_blocking_section();
> -       if (retval < 0)
> -               failwith_xc(_H(xch));
> -
> -       result = caml_alloc_tuple(5);
> -       Store_field(result, 0, Val_bool(info.online));
> -       Store_field(result, 1, Val_bool(info.blocked));
> -       Store_field(result, 2, Val_bool(info.running));
> -       Store_field(result, 3, caml_copy_int64(info.cpu_time));
> -       Store_field(result, 4, caml_copy_int32(info.cpu));
> -
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_xc_vcpu_context_get(value xch, value domid,
> -                                        value cpu)
> -{
> -       CAMLparam3(xch, domid, cpu);
> -       CAMLlocal1(context);
> -       int ret;
> -       vcpu_guest_context_any_t ctxt;
> -
> -       ret = xc_vcpu_getcontext(_H(xch), _D(domid), Int_val(cpu), &ctxt);
> -
> -       context = caml_alloc_string(sizeof(ctxt));
> -       memcpy(String_val(context), (char *) &ctxt.c, sizeof(ctxt.c));
> -
> -       CAMLreturn(context);
> -}
> -
> -static int get_cpumap_len(value xch, value cpumap)
> -{
> -       int ml_len = Wosize_val(cpumap);
> -       int xc_len = xc_get_max_cpus(_H(xch));
> -
> -       if (ml_len < xc_len)
> -               return ml_len;
> -       else
> -               return xc_len;
> -}
> -
> -CAMLprim value stub_xc_vcpu_setaffinity(value xch, value domid,
> -                                        value vcpu, value cpumap)
> -{
> -       CAMLparam4(xch, domid, vcpu, cpumap);
> -       int i, len = get_cpumap_len(xch, cpumap);
> -       xc_cpumap_t c_cpumap;
> -       int retval;
> -
> -       c_cpumap = xc_cpumap_alloc(_H(xch));
> -       if (c_cpumap == NULL)
> -               failwith_xc(_H(xch));
> -
> -       for (i=0; i<len; i++) {
> -               if (Bool_val(Field(cpumap, i)))
> -                       c_cpumap[i/8] |= i << (i&7);
> -       }
> -       retval = xc_vcpu_setaffinity(_H(xch), _D(domid),
> -                                    Int_val(vcpu), c_cpumap);
> -       free(c_cpumap);
> -
> -       if (retval < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_vcpu_getaffinity(value xch, value domid,
> -                                        value vcpu)
> -{
> -       CAMLparam3(xch, domid, vcpu);
> -       CAMLlocal1(ret);
> -       xc_cpumap_t c_cpumap;
> -       int i, len = xc_get_max_cpus(_H(xch));
> -       int retval;
> -
> -       c_cpumap = xc_cpumap_alloc(_H(xch));
> -       if (c_cpumap == NULL)
> -               failwith_xc(_H(xch));
> -
> -       retval = xc_vcpu_getaffinity(_H(xch), _D(domid),
> -                                    Int_val(vcpu), c_cpumap);
> -       free(c_cpumap);
> -
> -       if (retval < 0) {
> -               free(c_cpumap);
> -               failwith_xc(_H(xch));
> -       }
> -
> -       ret = caml_alloc(len, 0);
> -
> -       for (i=0; i<len; i++) {
> -               if (c_cpumap[i%8] & 1 << (i&7))
> -                       Store_field(ret, i, Val_true);
> -               else
> -                       Store_field(ret, i, Val_false);
> -       }
> -
> -       free(c_cpumap);
> -
> -       CAMLreturn(ret);
> -}
> -
> -CAMLprim value stub_xc_sched_id(value xch)
> -{
> -       CAMLparam1(xch);
> -       int sched_id;
> -
> -       if (xc_sched_id(_H(xch), &sched_id))
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_int(sched_id));
> -}
> -
> -CAMLprim value stub_xc_evtchn_alloc_unbound(value xch,
> -                                            value local_domid,
> -                                            value remote_domid)
> -{
> -       CAMLparam3(xch, local_domid, remote_domid);
> -
> -       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,
> -                                            c_remote_domid);
> -       // caml_leave_blocking_section();
> -
> -       if (result < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_int(result));
> -}
> -
> -CAMLprim value stub_xc_evtchn_reset(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       int r;
> -
> -       r = xc_evtchn_reset(_H(xch), _D(domid));
> -       if (r < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -
> -#define RING_SIZE 32768
> -static char ring[RING_SIZE];
> -
> -CAMLprim value stub_xc_readconsolering(value xch)
> -{
> -       unsigned int size = RING_SIZE;
> -       char *ring_ptr = ring;
> -
> -       CAMLparam1(xch);
> -
> -       // caml_enter_blocking_section();
> -       int retval = xc_readconsolering(_H(xch), ring_ptr, &size, 0, 0, NULL);
> -       // caml_leave_blocking_section();
> -
> -       if (retval)
> -               failwith_xc(_H(xch));
> -       ring[size] = '\0';
> -       CAMLreturn(caml_copy_string(ring));
> -}
> -
> -CAMLprim value stub_xc_send_debug_keys(value xch, value keys)
> -{
> -       CAMLparam2(xch, keys);
> -       int r;
> -
> -       r = xc_send_debug_keys(_H(xch), String_val(keys));
> -       if (r)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_physinfo(value xch)
> -{
> -       CAMLparam1(xch);
> -       CAMLlocal3(physinfo, cap_list, tmp);
> -       xc_physinfo_t c_physinfo;
> -       int r;
> -
> -       // caml_enter_blocking_section();
> -       r = xc_physinfo(_H(xch), &c_physinfo);
> -       // caml_leave_blocking_section();
> -
> -       if (r)
> -               failwith_xc(_H(xch));
> -
> -       tmp = cap_list = Val_emptylist;
> -       for (r = 0; r < 2; r++) {
> -               if ((c_physinfo.capabilities >> r) & 1) {
> -                       tmp = caml_alloc_small(2, Tag_cons);
> -                       Field(tmp, 0) = Val_int(r);
> -                       Field(tmp, 1) = cap_list;
> -                       cap_list = tmp;
> -               }
> -       }
> -
> -       physinfo = caml_alloc_tuple(9);
> -       Store_field(physinfo, 0, Val_int(c_physinfo.threads_per_core));
> -       Store_field(physinfo, 1, Val_int(c_physinfo.cores_per_socket));
> -       Store_field(physinfo, 2, Val_int(c_physinfo.nr_cpus));
> -       Store_field(physinfo, 3, Val_int(c_physinfo.max_node_id));
> -       Store_field(physinfo, 4, Val_int(c_physinfo.cpu_khz));
> -       Store_field(physinfo, 5, caml_copy_nativeint(c_physinfo.total_pages));
> -       Store_field(physinfo, 6, caml_copy_nativeint(c_physinfo.free_pages));
> -       Store_field(physinfo, 7, caml_copy_nativeint(c_physinfo.scrub_pages));
> -       Store_field(physinfo, 8, cap_list);
> -
> -       CAMLreturn(physinfo);
> -}
> -
> -CAMLprim value stub_xc_pcpu_info(value xch, value nr_cpus)
> -{
> -       CAMLparam2(xch, nr_cpus);
> -       CAMLlocal2(pcpus, v);
> -       xc_cpuinfo_t *info;
> -       int r, size;
> -
> -       if (Int_val(nr_cpus) < 1)
> -               caml_invalid_argument("nr_cpus");
> -
> -       info = calloc(Int_val(nr_cpus) + 1, sizeof(*info));
> -       if (!info)
> -               caml_raise_out_of_memory();
> -
> -       // caml_enter_blocking_section();
> -       r = xc_getcpuinfo(_H(xch), Int_val(nr_cpus), info, &size);
> -       // caml_leave_blocking_section();
> -
> -       if (r) {
> -               free(info);
> -               failwith_xc(_H(xch));
> -       }
> -
> -       if (size > 0) {
> -               int i;
> -               pcpus = caml_alloc(size, 0);
> -               for (i = 0; i < size; i++) {
> -                       v = caml_copy_int64(info[i].idletime);
> -                       caml_modify(&Field(pcpus, i), v);
> -               }
> -       } else
> -               pcpus = Atom(0);
> -       free(info);
> -       CAMLreturn(pcpus);
> -}
> -
> -CAMLprim value stub_xc_domain_setmaxmem(value xch, value domid,
> -                                        value max_memkb)
> -{
> -       CAMLparam3(xch, domid, max_memkb);
> -
> -       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,
> -                                        c_max_memkb);
> -       // caml_leave_blocking_section();
> -       if (retval)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_set_memmap_limit(value xch, value domid,
> -                                               value map_limitkb)
> -{
> -       CAMLparam3(xch, domid, map_limitkb);
> -       unsigned long v;
> -       int retval;
> -
> -       v = Int64_val(map_limitkb);
> -       retval = xc_domain_set_memmap_limit(_H(xch), _D(domid), v);
> -       if (retval)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_memory_increase_reservation(value xch,
> -                                                          value domid,
> -                                                          value mem_kb)
> -{
> -       CAMLparam3(xch, domid, mem_kb);
> -
> -       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,
> -                                                         nr_extents, 0, 0, NULL);
> -       // caml_leave_blocking_section();
> -
> -       if (retval)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_set_machine_address_size(value xch,
> -                                                      value domid,
> -                                                      value width)
> -{
> -       CAMLparam3(xch, domid, width);
> -       uint32_t c_domid = _D(domid);
> -       int c_width = Int_val(width);
> -
> -       int retval = xc_domain_set_machine_address_size(_H(xch), c_domid, c_width);
> -       if (retval)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_get_machine_address_size(value xch,
> -                                                       value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       int retval;
> -
> -       retval = xc_domain_get_machine_address_size(_H(xch), _D(domid));
> -       if (retval < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_int(retval));
> -}
> -
> -CAMLprim value stub_xc_domain_cpuid_set(value xch, value domid,
> -                                        value input,
> -                                        value config)
> -{
> -       CAMLparam4(xch, domid, input, config);
> -       CAMLlocal2(array, tmp);
> -       int r;
> -       unsigned int c_input[2];
> -       char *c_config[4], *out_config[4];
> -
> -       c_config[0] = string_of_option_array(config, 0);
> -       c_config[1] = string_of_option_array(config, 1);
> -       c_config[2] = string_of_option_array(config, 2);
> -       c_config[3] = string_of_option_array(config, 3);
> -
> -       cpuid_input_of_val(c_input[0], c_input[1], input);
> -
> -       array = caml_alloc(4, 0);
> -       for (r = 0; r < 4; r++) {
> -               tmp = Val_none;
> -               if (c_config[r]) {
> -                       tmp = caml_alloc_small(1, 0);
> -                       Field(tmp, 0) = caml_alloc_string(32);
> -               }
> -               Store_field(array, r, tmp);
> -       }
> -
> -       for (r = 0; r < 4; r++)
> -               out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL;
> -
> -       r = xc_cpuid_set(_H(xch), _D(domid),
> -                        c_input, (const char **)c_config, out_config);
> -       if (r < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(array);
> -}
> -
> -CAMLprim value stub_xc_domain_cpuid_apply_policy(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       int r;
> -
> -       r = xc_cpuid_apply_policy(_H(xch), _D(domid));
> -       if (r < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_cpuid_check(value xch, value input, value config)
> -{
> -       CAMLparam3(xch, input, config);
> -       CAMLlocal3(ret, array, tmp);
> -       int r;
> -       unsigned int c_input[2];
> -       char *c_config[4], *out_config[4];
> -
> -       c_config[0] = string_of_option_array(config, 0);
> -       c_config[1] = string_of_option_array(config, 1);
> -       c_config[2] = string_of_option_array(config, 2);
> -       c_config[3] = string_of_option_array(config, 3);
> -
> -       cpuid_input_of_val(c_input[0], c_input[1], input);
> -
> -       array = caml_alloc(4, 0);
> -       for (r = 0; r < 4; r++) {
> -               tmp = Val_none;
> -               if (c_config[r]) {
> -                       tmp = caml_alloc_small(1, 0);
> -                       Field(tmp, 0) = caml_alloc_string(32);
> -               }
> -               Store_field(array, r, tmp);
> -       }
> -
> -       for (r = 0; r < 4; r++)
> -               out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL;
> -
> -       r = xc_cpuid_check(_H(xch), c_input, (const char **)c_config, out_config);
> -       if (r < 0)
> -               failwith_xc(_H(xch));
> -
> -       ret = caml_alloc_tuple(2);
> -       Store_field(ret, 0, Val_bool(r));
> -       Store_field(ret, 1, array);
> -
> -       CAMLreturn(ret);
> -}
> -
> -CAMLprim value stub_xc_version_version(value xch)
> -{
> -       CAMLparam1(xch);
> -       CAMLlocal1(result);
> -       xen_extraversion_t extra;
> -       long packed;
> -       int retval;
> -
> -       // caml_enter_blocking_section();
> -       packed = xc_version(_H(xch), XENVER_version, NULL);
> -       retval = xc_version(_H(xch), XENVER_extraversion, &extra);
> -       // caml_leave_blocking_section();
> -
> -       if (retval)
> -               failwith_xc(_H(xch));
> -
> -       result = caml_alloc_tuple(3);
> -
> -       Store_field(result, 0, Val_int(packed >> 16));
> -       Store_field(result, 1, Val_int(packed & 0xffff));
> -       Store_field(result, 2, caml_copy_string(extra));
> -
> -       CAMLreturn(result);
> -}
> -
> -
> -CAMLprim value stub_xc_version_compile_info(value xch)
> -{
> -       CAMLparam1(xch);
> -       CAMLlocal1(result);
> -       xen_compile_info_t ci;
> -       int retval;
> -
> -       // caml_enter_blocking_section();
> -       retval = xc_version(_H(xch), XENVER_compile_info, &ci);
> -       // caml_leave_blocking_section();
> -
> -       if (retval)
> -               failwith_xc(_H(xch));
> -
> -       result = caml_alloc_tuple(4);
> -
> -       Store_field(result, 0, caml_copy_string(ci.compiler));
> -       Store_field(result, 1, caml_copy_string(ci.compile_by));
> -       Store_field(result, 2, caml_copy_string(ci.compile_domain));
> -       Store_field(result, 3, caml_copy_string(ci.compile_date));
> -
> -       CAMLreturn(result);
> -}
> -
> -
> -static value xc_version_single_string(value xch, int code, void *info)
> -{
> -       CAMLparam1(xch);
> -       int retval;
> -
> -       // caml_enter_blocking_section();
> -       retval = xc_version(_H(xch), code, info);
> -       // caml_leave_blocking_section();
> -
> -       if (retval)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(caml_copy_string((char *)info));
> -}
> -
> -
> -CAMLprim value stub_xc_version_changeset(value xch)
> -{
> -       xen_changeset_info_t ci;
> -
> -       return xc_version_single_string(xch, XENVER_changeset, &ci);
> -}
> -
> -
> -CAMLprim value stub_xc_version_capabilities(value xch)
> -{
> -       xen_capabilities_info_t ci;
> -
> -       return xc_version_single_string(xch, XENVER_capabilities, &ci);
> -}
> -
> -
> -CAMLprim value stub_pages_to_kib(value pages)
> -{
> -       CAMLparam1(pages);
> -
> -       CAMLreturn(caml_copy_int64(Int64_val(pages) << (PAGE_SHIFT - 10)));
> -}
> -
> -
> -CAMLprim value stub_map_foreign_range(value xch, value dom,
> -                                      value size, value mfn)
> -{
> -       CAMLparam4(xch, dom, size, mfn);
> -       CAMLlocal1(result);
> -       struct mmap_interface *intf;
> -       uint32_t c_dom;
> -       unsigned long c_mfn;
> -
> -       result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
> -       intf = (struct mmap_interface *) result;
> -
> -       intf->len = Int_val(size);
> -
> -       c_dom = _D(dom);
> -       c_mfn = Nativeint_val(mfn);
> -       // 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();
> -       if (!intf->addr)
> -               caml_failwith("xc_map_foreign_range error");
> -       CAMLreturn(result);
> -}
> -
> -CAMLprim value stub_sched_credit_domain_get(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       CAMLlocal1(sdom);
> -       struct xen_domctl_sched_credit c_sdom;
> -       int ret;
> -
> -       // caml_enter_blocking_section();
> -       ret = xc_sched_credit_domain_get(_H(xch), _D(domid), &c_sdom);
> -       // caml_leave_blocking_section();
> -       if (ret != 0)
> -               failwith_xc(_H(xch));
> -
> -       sdom = caml_alloc_tuple(2);
> -       Store_field(sdom, 0, Val_int(c_sdom.weight));
> -       Store_field(sdom, 1, Val_int(c_sdom.cap));
> -
> -       CAMLreturn(sdom);
> -}
> -
> -CAMLprim value stub_sched_credit_domain_set(value xch, value domid,
> -                                            value sdom)
> -{
> -       CAMLparam3(xch, domid, sdom);
> -       struct xen_domctl_sched_credit c_sdom;
> -       int ret;
> -
> -       c_sdom.weight = Int_val(Field(sdom, 0));
> -       c_sdom.cap = Int_val(Field(sdom, 1));
> -       // caml_enter_blocking_section();
> -       ret = xc_sched_credit_domain_set(_H(xch), _D(domid), &c_sdom);
> -       // caml_leave_blocking_section();
> -       if (ret != 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_shadow_allocation_get(value xch, value domid)
> -{
> -       CAMLparam2(xch, domid);
> -       CAMLlocal1(mb);
> -       unsigned long c_mb;
> -       int ret;
> -
> -       // 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();
> -       if (ret != 0)
> -               failwith_xc(_H(xch));
> -
> -       mb = Val_int(c_mb);
> -       CAMLreturn(mb);
> -}
> -
> -CAMLprim value stub_shadow_allocation_set(value xch, value domid,
> -                                         value mb)
> -{
> -       CAMLparam3(xch, domid, mb);
> -       unsigned long c_mb;
> -       int ret;
> -
> -       c_mb = Int_val(mb);
> -       // 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();
> -       if (ret != 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_get_pfn_list(value xch, value domid,
> -                                           value nr_pfns)
> -{
> -       CAMLparam3(xch, domid, nr_pfns);
> -       CAMLlocal2(array, v);
> -       unsigned long c_nr_pfns;
> -       long ret, i;
> -       uint64_t *c_array;
> -
> -       c_nr_pfns = Nativeint_val(nr_pfns);
> -
> -       c_array = malloc(sizeof(uint64_t) * c_nr_pfns);
> -       if (!c_array)
> -               caml_raise_out_of_memory();
> -
> -       ret = xc_get_pfn_list(_H(xch), _D(domid),
> -                             c_array, c_nr_pfns);
> -       if (ret < 0) {
> -               free(c_array);
> -               failwith_xc(_H(xch));
> -       }
> -
> -       array = caml_alloc(ret, 0);
> -       for (i = 0; i < ret; i++) {
> -               v = caml_copy_nativeint(c_array[i]);
> -               Store_field(array, i, v);
> -       }
> -       free(c_array);
> -
> -       CAMLreturn(array);
> -}
> -
> -CAMLprim value stub_xc_domain_ioport_permission(value xch, value domid,
> -                                              value start_port, value nr_ports,
> -                                              value allow)
> -{
> -       CAMLparam5(xch, domid, start_port, nr_ports, allow);
> -       uint32_t c_start_port, c_nr_ports;
> -       uint8_t c_allow;
> -       int ret;
> -
> -       c_start_port = Int_val(start_port);
> -       c_nr_ports = Int_val(nr_ports);
> -       c_allow = Bool_val(allow);
> -
> -       ret = xc_domain_ioport_permission(_H(xch), _D(domid),
> -                                        c_start_port, c_nr_ports, c_allow);
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_iomem_permission(value xch, value domid,
> -                                              value start_pfn, value nr_pfns,
> -                                              value allow)
> -{
> -       CAMLparam5(xch, domid, start_pfn, nr_pfns, allow);
> -       unsigned long c_start_pfn, c_nr_pfns;
> -       uint8_t c_allow;
> -       int ret;
> -
> -       c_start_pfn = Nativeint_val(start_pfn);
> -       c_nr_pfns = Nativeint_val(nr_pfns);
> -       c_allow = Bool_val(allow);
> -
> -       ret = xc_domain_iomem_permission(_H(xch), _D(domid),
> -                                        c_start_pfn, c_nr_pfns, c_allow);
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_irq_permission(value xch, value domid,
> -                                            value pirq, value allow)
> -{
> -       CAMLparam4(xch, domid, pirq, allow);
> -       uint8_t c_pirq;
> -       uint8_t c_allow;
> -       int ret;
> -
> -       c_pirq = Int_val(pirq);
> -       c_allow = Bool_val(allow);
> -
> -       ret = xc_domain_irq_permission(_H(xch), _D(domid),
> -                                      c_pirq, c_allow);
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -static uint32_t pci_dev_to_bdf(int domain, int bus, int slot, int func)
> -{
> -       uint32_t bdf = 0;
> -       bdf |= (bus & 0xff) << 16;
> -       bdf |= (slot & 0x1f) << 11;
> -       bdf |= (func & 0x7) << 8;
> -       return bdf;
> -}
> -
> -CAMLprim value stub_xc_domain_test_assign_device(value xch, value domid, value desc)
> -{
> -       CAMLparam3(xch, domid, desc);
> -       int ret;
> -       int domain, bus, slot, func;
> -       uint32_t bdf;
> -
> -       domain = Int_val(Field(desc, 0));
> -       bus = Int_val(Field(desc, 1));
> -       slot = Int_val(Field(desc, 2));
> -       func = Int_val(Field(desc, 3));
> -       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> -
> -       ret = xc_test_assign_device(_H(xch), _D(domid), bdf);
> -
> -       CAMLreturn(Val_bool(ret == 0));
> -}
> -
> -CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value desc)
> -{
> -       CAMLparam3(xch, domid, desc);
> -       int ret;
> -       int domain, bus, slot, func;
> -       uint32_t bdf;
> -
> -       domain = Int_val(Field(desc, 0));
> -       bus = Int_val(Field(desc, 1));
> -       slot = Int_val(Field(desc, 2));
> -       func = Int_val(Field(desc, 3));
> -       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> -
> -       ret = xc_assign_device(_H(xch), _D(domid), bdf);
> -
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_domain_deassign_device(value xch, value domid, value desc)
> -{
> -       CAMLparam3(xch, domid, desc);
> -       int ret;
> -       int domain, bus, slot, func;
> -       uint32_t bdf;
> -
> -       domain = Int_val(Field(desc, 0));
> -       bus = Int_val(Field(desc, 1));
> -       slot = Int_val(Field(desc, 2));
> -       func = Int_val(Field(desc, 3));
> -       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> -
> -       ret = xc_deassign_device(_H(xch), _D(domid), bdf);
> -
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -       CAMLreturn(Val_unit);
> -}
> -
> -CAMLprim value stub_xc_watchdog(value xch, value domid, value timeout)
> -{
> -       CAMLparam3(xch, domid, timeout);
> -       int ret;
> -       unsigned int c_timeout = Int32_val(timeout);
> -
> -       ret = xc_watchdog(_H(xch), _D(domid), c_timeout);
> -       if (ret < 0)
> -               failwith_xc(_H(xch));
> -
> -       CAMLreturn(Val_int(ret));
> -}
> -
> -/*
> - * Local variables:
> - *  indent-tabs-mode: t
> - *  c-basic-offset: 8
> - *  tab-width: 8
> - * End:
> - */
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xenctrl.ml
> --- /dev/null
> +++ b/tools/ocaml/libs/xc/xenctrl.ml
> @@ -0,0 +1,326 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + *)
> +
> +(** *)
> +type domid = int
> +
> +(* ** xenctrl.h ** *)
> +
> +type vcpuinfo =
> +{
> +       online: bool;
> +       blocked: bool;
> +       running: bool;
> +       cputime: int64;
> +       cpumap: int32;
> +}
> +
> +type domaininfo =
> +{
> +       domid             : domid;
> +       dying             : bool;
> +       shutdown          : bool;
> +       paused            : bool;
> +       blocked           : bool;
> +       running           : bool;
> +       hvm_guest         : bool;
> +       shutdown_code     : int;
> +       total_memory_pages: nativeint;
> +       max_memory_pages  : nativeint;
> +       shared_info_frame : int64;
> +       cpu_time          : int64;
> +       nr_online_vcpus   : int;
> +       max_vcpu_id       : int;
> +       ssidref           : int32;
> +       handle            : int array;
> +}
> +
> +type sched_control =
> +{
> +       weight : int;
> +       cap    : int;
> +}
> +
> +type physinfo_cap_flag =
> +       | CAP_HVM
> +       | CAP_DirectIO
> +
> +type physinfo =
> +{
> +       threads_per_core : int;
> +       cores_per_socket : int;
> +       nr_cpus          : int;
> +       max_node_id      : int;
> +       cpu_khz          : int;
> +       total_pages      : nativeint;
> +       free_pages       : nativeint;
> +       scrub_pages      : nativeint;
> +       (* XXX hw_cap *)
> +       capabilities     : physinfo_cap_flag list;
> +}
> +
> +type version =
> +{
> +       major : int;
> +       minor : int;
> +       extra : string;
> +}
> +
> +
> +type compile_info =
> +{
> +       compiler : string;
> +       compile_by : string;
> +       compile_domain : string;
> +       compile_date : string;
> +}
> +
> +type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
> +
> +type domain_create_flag = CDF_HVM | CDF_HAP
> +
> +exception Error of string
> +
> +type handle
> +
> +(* this is only use by coredumping *)
> +external sizeof_core_header: unit -> int
> +       = "stub_sizeof_core_header"
> +external sizeof_vcpu_guest_context: unit -> int
> +       = "stub_sizeof_vcpu_guest_context"
> +external sizeof_xen_pfn: unit -> int = "stub_sizeof_xen_pfn"
> +(* end of use *)
> +
> +external interface_open: unit -> handle = "stub_xc_interface_open"
> +external interface_close: handle -> unit = "stub_xc_interface_close"
> +
> +external is_fake: unit -> bool = "stub_xc_interface_is_fake"
> +
> +let with_intf f =
> +       let xc = interface_open () in
> +       let r = try f xc with exn -> interface_close xc; raise exn in
> +       interface_close xc;
> +       r
> +
> +external _domain_create: handle -> int32 -> domain_create_flag list -> int array -> domid
> +       = "stub_xc_domain_create"
> +
> +let domain_create handle n flags uuid =
> +       _domain_create handle n flags (Uuid.int_array_of_uuid uuid)
> +
> +external _domain_sethandle: handle -> domid -> int array -> unit
> +                          = "stub_xc_domain_sethandle"
> +
> +let domain_sethandle handle n uuid =
> +       _domain_sethandle handle n (Uuid.int_array_of_uuid uuid)
> +
> +external domain_max_vcpus: handle -> domid -> int -> unit
> +       = "stub_xc_domain_max_vcpus"
> +
> +external domain_pause: handle -> domid -> unit = "stub_xc_domain_pause"
> +external domain_unpause: handle -> domid -> unit = "stub_xc_domain_unpause"
> +external domain_resume_fast: handle -> domid -> unit = "stub_xc_domain_resume_fast"
> +external domain_destroy: handle -> domid -> unit = "stub_xc_domain_destroy"
> +
> +external domain_shutdown: handle -> domid -> shutdown_reason -> unit
> +       = "stub_xc_domain_shutdown"
> +
> +external _domain_getinfolist: handle -> domid -> int -> domaininfo list
> +       = "stub_xc_domain_getinfolist"
> +
> +let domain_getinfolist handle first_domain =
> +       let nb = 2 in
> +       let last_domid l = (List.hd l).domid + 1 in
> +       let rec __getlist from =
> +               let l = _domain_getinfolist handle from nb in
> +               (if List.length l = nb then __getlist (last_domid l) else []) @ l
> +               in
> +       List.rev (__getlist first_domain)
> +
> +external domain_getinfo: handle -> domid -> domaininfo= "stub_xc_domain_getinfo"
> +
> +external domain_get_vcpuinfo: handle -> int -> int -> vcpuinfo
> +       = "stub_xc_vcpu_getinfo"
> +
> +external domain_ioport_permission: handle -> domid -> int -> int -> bool -> unit
> +       = "stub_xc_domain_ioport_permission"
> +external domain_iomem_permission: handle -> domid -> nativeint -> nativeint -> bool -> unit
> +       = "stub_xc_domain_iomem_permission"
> +external domain_irq_permission: handle -> domid -> int -> bool -> unit
> +       = "stub_xc_domain_irq_permission"
> +
> +external vcpu_affinity_set: handle -> domid -> int -> bool array -> unit
> +       = "stub_xc_vcpu_setaffinity"
> +external vcpu_affinity_get: handle -> domid -> int -> bool array
> +       = "stub_xc_vcpu_getaffinity"
> +
> +external vcpu_context_get: handle -> domid -> int -> string
> +       = "stub_xc_vcpu_context_get"
> +
> +external sched_id: handle -> int = "stub_xc_sched_id"
> +
> +external sched_credit_domain_set: handle -> domid -> sched_control -> unit
> +       = "stub_sched_credit_domain_set"
> +external sched_credit_domain_get: handle -> domid -> sched_control
> +       = "stub_sched_credit_domain_get"
> +
> +external shadow_allocation_set: handle -> domid -> int -> unit
> +       = "stub_shadow_allocation_set"
> +external shadow_allocation_get: handle -> domid -> int
> +       = "stub_shadow_allocation_get"
> +
> +external evtchn_alloc_unbound: handle -> domid -> domid -> int
> +       = "stub_xc_evtchn_alloc_unbound"
> +external evtchn_reset: handle -> domid -> unit = "stub_xc_evtchn_reset"
> +
> +external readconsolering: handle -> string = "stub_xc_readconsolering"
> +
> +external send_debug_keys: handle -> string -> unit = "stub_xc_send_debug_keys"
> +external physinfo: handle -> physinfo = "stub_xc_physinfo"
> +external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
> +
> +external domain_setmaxmem: handle -> domid -> int64 -> unit
> +       = "stub_xc_domain_setmaxmem"
> +external domain_set_memmap_limit: handle -> domid -> int64 -> unit
> +       = "stub_xc_domain_set_memmap_limit"
> +external domain_memory_increase_reservation: handle -> domid -> int64 -> unit
> +       = "stub_xc_domain_memory_increase_reservation"
> +
> +external domain_set_machine_address_size: handle -> domid -> int -> unit
> +       = "stub_xc_domain_set_machine_address_size"
> +external domain_get_machine_address_size: handle -> domid -> int
> +       = "stub_xc_domain_get_machine_address_size"
> +
> +external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
> +                        -> string option array
> +                        -> string option array
> +       = "stub_xc_domain_cpuid_set"
> +external domain_cpuid_apply_policy: handle -> domid -> unit
> +       = "stub_xc_domain_cpuid_apply_policy"
> +external cpuid_check: handle -> (int64 * (int64 option)) -> string option array -> (bool * string option array)
> +       = "stub_xc_cpuid_check"
> +
> +external map_foreign_range: handle -> domid -> int
> +                         -> nativeint -> Xenmmap.mmap_interface
> +       = "stub_map_foreign_range"
> +
> +external domain_get_pfn_list: handle -> domid -> nativeint -> nativeint array
> +       = "stub_xc_domain_get_pfn_list"
> +
> +external domain_assign_device: handle -> domid -> (int * int * int * int) -> unit
> +       = "stub_xc_domain_assign_device"
> +external domain_deassign_device: handle -> domid -> (int * int * int * int) -> unit
> +       = "stub_xc_domain_deassign_device"
> +external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool
> +       = "stub_xc_domain_test_assign_device"
> +
> +external version: handle -> version = "stub_xc_version_version"
> +external version_compile_info: handle -> compile_info
> +       = "stub_xc_version_compile_info"
> +external version_changeset: handle -> string = "stub_xc_version_changeset"
> +external version_capabilities: handle -> string =
> +  "stub_xc_version_capabilities"
> +
> +external watchdog : handle -> int -> int32 -> int
> +  = "stub_xc_watchdog"
> +
> +(* core dump structure *)
> +type core_magic = Magic_hvm | Magic_pv
> +
> +type core_header = {
> +       xch_magic: core_magic;
> +       xch_nr_vcpus: int;
> +       xch_nr_pages: nativeint;
> +       xch_index_offset: int64;
> +       xch_ctxt_offset: int64;
> +       xch_pages_offset: int64;
> +}
> +
> +external marshall_core_header: core_header -> string = "stub_marshall_core_header"
> +
> +(* coredump *)
> +let coredump xch domid fd =
> +       let dump s =
> +               let wd = Unix.write fd s 0 (String.length s) in
> +               if wd <> String.length s then
> +                       failwith "error while writing";
> +               in
> +
> +       let info = domain_getinfo xch domid in
> +
> +       let nrpages = info.total_memory_pages in
> +       let ctxt = Array.make info.max_vcpu_id None in
> +       let nr_vcpus = ref 0 in
> +       for i = 0 to info.max_vcpu_id - 1
> +       do
> +               ctxt.(i) <- try
> +                       let v = vcpu_context_get xch domid i in
> +                       incr nr_vcpus;
> +                       Some v
> +                       with _ -> None
> +       done;
> +
> +       (* FIXME page offset if not rounded to sup *)
> +       let page_offset =
> +               Int64.add
> +                       (Int64.of_int (sizeof_core_header () +
> +                        (sizeof_vcpu_guest_context () * !nr_vcpus)))
> +                       (Int64.of_nativeint (
> +                               Nativeint.mul
> +                                       (Nativeint.of_int (sizeof_xen_pfn ()))
> +                                       nrpages)
> +                               )
> +               in
> +
> +       let header = {
> +               xch_magic = if info.hvm_guest then Magic_hvm else Magic_pv;
> +               xch_nr_vcpus = !nr_vcpus;
> +               xch_nr_pages = nrpages;
> +               xch_ctxt_offset = Int64.of_int (sizeof_core_header ());
> +               xch_index_offset = Int64.of_int (sizeof_core_header ()
> +                                       + sizeof_vcpu_guest_context ());
> +               xch_pages_offset = page_offset;
> +       } in
> +
> +       dump (marshall_core_header header);
> +       for i = 0 to info.max_vcpu_id - 1
> +       do
> +               match ctxt.(i) with
> +               | None -> ()
> +               | Some ctxt_i -> dump ctxt_i
> +       done;
> +       let pfns = domain_get_pfn_list xch domid nrpages in
> +       if Array.length pfns <> Nativeint.to_int nrpages then
> +               failwith "could not get the page frame list";
> +
> +       let page_size = Xenmmap.getpagesize () in
> +       for i = 0 to Nativeint.to_int nrpages - 1
> +       do
> +               let page = map_foreign_range xch domid page_size pfns.(i) in
> +               let data = Xenmmap.read page 0 page_size in
> +               Xenmmap.unmap page;
> +               dump data
> +       done
> +
> +(* ** Misc ** *)
> +
> +(**
> +   Convert the given number of pages to an amount in KiB, rounded up.
> + *)
> +external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
> +let pages_to_mib pages = Int64.div (pages_to_kib pages) 1024L
> +
> +let _ = Callback.register_exception "xc.error" (Error "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xenctrl.mli
> --- /dev/null
> +++ b/tools/ocaml/libs/xc/xenctrl.mli
> @@ -0,0 +1,184 @@
> +(*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + *)
> +
> +type domid = int
> +type vcpuinfo = {
> +  online : bool;
> +  blocked : bool;
> +  running : bool;
> +  cputime : int64;
> +  cpumap : int32;
> +}
> +type domaininfo = {
> +  domid : domid;
> +  dying : bool;
> +  shutdown : bool;
> +  paused : bool;
> +  blocked : bool;
> +  running : bool;
> +  hvm_guest : bool;
> +  shutdown_code : int;
> +  total_memory_pages : nativeint;
> +  max_memory_pages : nativeint;
> +  shared_info_frame : int64;
> +  cpu_time : int64;
> +  nr_online_vcpus : int;
> +  max_vcpu_id : int;
> +  ssidref : int32;
> +  handle : int array;
> +}
> +type sched_control = { weight : int; cap : int; }
> +type physinfo_cap_flag = CAP_HVM | CAP_DirectIO
> +type physinfo = {
> +  threads_per_core : int;
> +  cores_per_socket : int;
> +  nr_cpus          : int;
> +  max_node_id      : int;
> +  cpu_khz          : int;
> +  total_pages      : nativeint;
> +  free_pages       : nativeint;
> +  scrub_pages      : nativeint;
> +  capabilities     : physinfo_cap_flag list;
> +}
> +type version = { major : int; minor : int; extra : string; }
> +type compile_info = {
> +  compiler : string;
> +  compile_by : string;
> +  compile_domain : string;
> +  compile_date : string;
> +}
> +type shutdown_reason = Poweroff | Reboot | Suspend | Crash | Halt
> +
> +type domain_create_flag = CDF_HVM | CDF_HAP
> +
> +exception Error of string
> +type handle
> +external sizeof_core_header : unit -> int = "stub_sizeof_core_header"
> +external sizeof_vcpu_guest_context : unit -> int
> +  = "stub_sizeof_vcpu_guest_context"
> +external sizeof_xen_pfn : unit -> int = "stub_sizeof_xen_pfn"
> +external interface_open : unit -> handle = "stub_xc_interface_open"
> +external is_fake : unit -> bool = "stub_xc_interface_is_fake"
> +external interface_close : handle -> unit = "stub_xc_interface_close"
> +val with_intf : (handle -> 'a) -> 'a
> +external _domain_create : handle -> int32 -> domain_create_flag list -> int array -> domid
> +  = "stub_xc_domain_create"
> +val domain_create : handle -> int32 -> domain_create_flag list -> 'a Uuid.t -> domid
> +external _domain_sethandle : handle -> domid -> int array -> unit
> +  = "stub_xc_domain_sethandle"
> +val domain_sethandle : handle -> domid -> 'a Uuid.t -> unit
> +external domain_max_vcpus : handle -> domid -> int -> unit
> +  = "stub_xc_domain_max_vcpus"
> +external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause"
> +external domain_unpause : handle -> domid -> unit = "stub_xc_domain_unpause"
> +external domain_resume_fast : handle -> domid -> unit
> +  = "stub_xc_domain_resume_fast"
> +external domain_destroy : handle -> domid -> unit = "stub_xc_domain_destroy"
> +external domain_shutdown : handle -> domid -> shutdown_reason -> unit
> +  = "stub_xc_domain_shutdown"
> +external _domain_getinfolist : handle -> domid -> int -> domaininfo list
> +  = "stub_xc_domain_getinfolist"
> +val domain_getinfolist : handle -> domid -> domaininfo list
> +external domain_getinfo : handle -> domid -> domaininfo
> +  = "stub_xc_domain_getinfo"
> +external domain_get_vcpuinfo : handle -> int -> int -> vcpuinfo
> +  = "stub_xc_vcpu_getinfo"
> +external domain_ioport_permission: handle -> domid -> int -> int -> bool -> unit
> +       = "stub_xc_domain_ioport_permission"
> +external domain_iomem_permission: handle -> domid -> nativeint -> nativeint -> bool -> unit
> +       = "stub_xc_domain_iomem_permission"
> +external domain_irq_permission: handle -> domid -> int -> bool -> unit
> +       = "stub_xc_domain_irq_permission"
> +external vcpu_affinity_set : handle -> domid -> int -> bool array -> unit
> +  = "stub_xc_vcpu_setaffinity"
> +external vcpu_affinity_get : handle -> domid -> int -> bool array
> +  = "stub_xc_vcpu_getaffinity"
> +external vcpu_context_get : handle -> domid -> int -> string
> +  = "stub_xc_vcpu_context_get"
> +external sched_id : handle -> int = "stub_xc_sched_id"
> +external sched_credit_domain_set : handle -> domid -> sched_control -> unit
> +  = "stub_sched_credit_domain_set"
> +external sched_credit_domain_get : handle -> domid -> sched_control
> +  = "stub_sched_credit_domain_get"
> +external shadow_allocation_set : handle -> domid -> int -> unit
> +  = "stub_shadow_allocation_set"
> +external shadow_allocation_get : handle -> domid -> int
> +  = "stub_shadow_allocation_get"
> +external evtchn_alloc_unbound : handle -> domid -> domid -> int
> +  = "stub_xc_evtchn_alloc_unbound"
> +external evtchn_reset : handle -> domid -> unit = "stub_xc_evtchn_reset"
> +external readconsolering : handle -> string = "stub_xc_readconsolering"
> +external send_debug_keys : handle -> string -> unit = "stub_xc_send_debug_keys"
> +external physinfo : handle -> physinfo = "stub_xc_physinfo"
> +external pcpu_info: handle -> int -> int64 array = "stub_xc_pcpu_info"
> +external domain_setmaxmem : handle -> domid -> int64 -> unit
> +  = "stub_xc_domain_setmaxmem"
> +external domain_set_memmap_limit : handle -> domid -> int64 -> unit
> +  = "stub_xc_domain_set_memmap_limit"
> +external domain_memory_increase_reservation :
> +  handle -> domid -> int64 -> unit
> +  = "stub_xc_domain_memory_increase_reservation"
> +external map_foreign_range :
> +  handle -> domid -> int -> nativeint -> Xenmmap.mmap_interface
> +  = "stub_map_foreign_range"
> +external domain_get_pfn_list :
> +  handle -> domid -> nativeint -> nativeint array
> +  = "stub_xc_domain_get_pfn_list"
> +
> +external domain_assign_device: handle -> domid -> (int * int * int * int) -> unit
> +       = "stub_xc_domain_assign_device"
> +external domain_deassign_device: handle -> domid -> (int * int * int * int) -> unit
> +       = "stub_xc_domain_deassign_device"
> +external domain_test_assign_device: handle -> domid -> (int * int * int * int) -> bool
> +       = "stub_xc_domain_test_assign_device"
> +
> +external version : handle -> version = "stub_xc_version_version"
> +external version_compile_info : handle -> compile_info
> +  = "stub_xc_version_compile_info"
> +external version_changeset : handle -> string = "stub_xc_version_changeset"
> +external version_capabilities : handle -> string
> +  = "stub_xc_version_capabilities"
> +type core_magic = Magic_hvm | Magic_pv
> +type core_header = {
> +  xch_magic : core_magic;
> +  xch_nr_vcpus : int;
> +  xch_nr_pages : nativeint;
> +  xch_index_offset : int64;
> +  xch_ctxt_offset : int64;
> +  xch_pages_offset : int64;
> +}
> +external marshall_core_header : core_header -> string
> +  = "stub_marshall_core_header"
> +val coredump : handle -> domid -> Unix.file_descr -> unit
> +external pages_to_kib : int64 -> int64 = "stub_pages_to_kib"
> +val pages_to_mib : int64 -> int64
> +external watchdog : handle -> int -> int32 -> int
> +  = "stub_xc_watchdog"
> +
> +external domain_set_machine_address_size: handle -> domid -> int -> unit
> +  = "stub_xc_domain_set_machine_address_size"
> +external domain_get_machine_address_size: handle -> domid -> int
> +       = "stub_xc_domain_get_machine_address_size"
> +
> +external domain_cpuid_set: handle -> domid -> (int64 * (int64 option))
> +                        -> string option array
> +                        -> string option array
> +       = "stub_xc_domain_cpuid_set"
> +external domain_cpuid_apply_policy: handle -> domid -> unit
> +       = "stub_xc_domain_cpuid_apply_policy"
> +external cpuid_check: handle -> (int64 * (int64 option)) -> string option array -> (bool * string option array)
> +       = "stub_xc_cpuid_check"
> +
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xc/xenctrl_stubs.c
> --- /dev/null
> +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
> @@ -0,0 +1,1161 @@
> +/*
> + * Copyright (C) 2006-2007 XenSource Ltd.
> + * Copyright (C) 2008      Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + */
> +
> +#define _XOPEN_SOURCE 600
> +#include <stdlib.h>
> +#include <errno.h>
> +
> +#define CAML_NAME_SPACE
> +#include <caml/alloc.h>
> +#include <caml/memory.h>
> +#include <caml/signals.h>
> +#include <caml/fail.h>
> +#include <caml/callback.h>
> +
> +#include <sys/mman.h>
> +#include <stdint.h>
> +#include <string.h>
> +
> +#include <xenctrl.h>
> +
> +#include "mmap_stubs.h"
> +
> +#define PAGE_SHIFT             12
> +#define PAGE_SIZE               (1UL << PAGE_SHIFT)
> +#define PAGE_MASK               (~(PAGE_SIZE-1))
> +
> +#define _H(__h) ((xc_interface *)(__h))
> +#define _D(__d) ((uint32_t)Int_val(__d))
> +
> +#define Val_none (Val_int(0))
> +
> +#define string_of_option_array(array, index) \
> +       ((Field(array, index) == Val_none) ? NULL : String_val(Field(Field(array, index), 0)))
> +
> +/* maybe here we should check the range of the input instead of blindly
> + * casting it to uint32 */
> +#define cpuid_input_of_val(i1, i2, input) \
> +       i1 = (uint32_t) Int64_val(Field(input, 0)); \
> +       i2 = ((Field(input, 1) == Val_none) ? 0xffffffff : (uint32_t) Int64_val(Field(Field(input, 1), 0)));
> +
> +#define ERROR_STRLEN 1024
> +void failwith_xc(xc_interface *xch)
> +{
> +       static char error_str[ERROR_STRLEN];
> +       if (xch) {
> +               const xc_error *error = xc_get_last_error(xch);
> +               if (error->code == XC_ERROR_NONE)
> +                       snprintf(error_str, ERROR_STRLEN, "%d: %s", errno, strerror(errno));
> +               else
> +                       snprintf(error_str, ERROR_STRLEN, "%d: %s: %s",
> +                                error->code,
> +                                xc_error_code_to_desc(error->code),
> +                                error->message);
> +       } else {
> +               snprintf(error_str, ERROR_STRLEN, "Unable to open XC interface");
> +       }
> +       caml_raise_with_string(*caml_named_value("xc.error"), error_str);
> +}
> +
> +CAMLprim value stub_sizeof_core_header(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLreturn(Val_int(sizeof(struct xc_core_header)));
> +}
> +
> +CAMLprim value stub_sizeof_vcpu_guest_context(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLreturn(Val_int(sizeof(struct vcpu_guest_context)));
> +}
> +
> +CAMLprim value stub_sizeof_xen_pfn(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLreturn(Val_int(sizeof(xen_pfn_t)));
> +}
> +
> +#define XC_CORE_MAGIC     0xF00FEBED
> +#define XC_CORE_MAGIC_HVM 0xF00FEBEE
> +
> +CAMLprim value stub_marshall_core_header(value header)
> +{
> +       CAMLparam1(header);
> +       CAMLlocal1(s);
> +       struct xc_core_header c_header;
> +
> +       c_header.xch_magic = (Field(header, 0))
> +               ? XC_CORE_MAGIC
> +               : XC_CORE_MAGIC_HVM;
> +       c_header.xch_nr_vcpus = Int_val(Field(header, 1));
> +       c_header.xch_nr_pages = Nativeint_val(Field(header, 2));
> +       c_header.xch_ctxt_offset = Int64_val(Field(header, 3));
> +       c_header.xch_index_offset = Int64_val(Field(header, 4));
> +       c_header.xch_pages_offset = Int64_val(Field(header, 5));
> +
> +       s = caml_alloc_string(sizeof(c_header));
> +       memcpy(String_val(s), (char *) &c_header, sizeof(c_header));
> +       CAMLreturn(s);
> +}
> +
> +CAMLprim value stub_xc_interface_open(void)
> +{
> +       CAMLparam0();
> +        xc_interface *xch;
> +        xch = xc_interface_open(NULL, NULL, XC_OPENFLAG_NON_REENTRANT);
> +        if (xch == NULL)
> +               failwith_xc(NULL);
> +        CAMLreturn((value)xch);
> +}
> +
> +
> +CAMLprim value stub_xc_interface_is_fake(void)
> +{
> +       CAMLparam0();
> +       int is_fake = xc_interface_is_fake();
> +       CAMLreturn(Val_int(is_fake));
> +}
> +
> +CAMLprim value stub_xc_interface_close(value xch)
> +{
> +       CAMLparam1(xch);
> +
> +       // caml_enter_blocking_section();
> +       xc_interface_close(_H(xch));
> +       // caml_leave_blocking_section();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +static int domain_create_flag_table[] = {
> +       XEN_DOMCTL_CDF_hvm_guest,
> +       XEN_DOMCTL_CDF_hap,
> +};
> +
> +CAMLprim value stub_xc_domain_create(value xch, value ssidref,
> +                                     value flags, value handle)
> +{
> +       CAMLparam4(xch, ssidref, flags, handle);
> +
> +       uint32_t domid = 0;
> +       xen_domain_handle_t h = { 0 };
> +       int result;
> +       int i;
> +       uint32_t c_ssidref = Int32_val(ssidref);
> +       unsigned int c_flags = 0;
> +       value l;
> +
> +        if (Wosize_val(handle) != 16)
> +               caml_invalid_argument("Handle not a 16-integer array");
> +
> +       for (i = 0; i < sizeof(h); i++) {
> +               h[i] = Int_val(Field(handle, i)) & 0xff;
> +       }
> +
> +       for (l = flags; l != Val_none; l = Field(l, 1)) {
> +               int v = Int_val(Field(l, 0));
> +               c_flags |= domain_create_flag_table[v];
> +       }
> +
> +       // caml_enter_blocking_section();
> +       result = xc_domain_create(_H(xch), c_ssidref, h, c_flags, &domid);
> +       // caml_leave_blocking_section();
> +
> +       if (result < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_int(domid));
> +}
> +
> +CAMLprim value stub_xc_domain_max_vcpus(value xch, value domid,
> +                                        value max_vcpus)
> +{
> +       CAMLparam3(xch, domid, max_vcpus);
> +       int r;
> +
> +       r = xc_domain_max_vcpus(_H(xch), _D(domid), Int_val(max_vcpus));
> +       if (r)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +
> +value stub_xc_domain_sethandle(value xch, value domid, value handle)
> +{
> +       CAMLparam3(xch, domid, handle);
> +       xen_domain_handle_t h = { 0 };
> +       int i;
> +
> +        if (Wosize_val(handle) != 16)
> +               caml_invalid_argument("Handle not a 16-integer array");
> +
> +       for (i = 0; i < sizeof(h); i++) {
> +               h[i] = Int_val(Field(handle, i)) & 0xff;
> +       }
> +
> +       i = xc_domain_sethandle(_H(xch), _D(domid), h);
> +       if (i)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +static value dom_op(value xch, value domid, int (*fn)(xc_interface *, uint32_t))
> +{
> +       CAMLparam2(xch, domid);
> +
> +       uint32_t c_domid = _D(domid);
> +
> +       // caml_enter_blocking_section();
> +       int result = fn(_H(xch), c_domid);
> +       // caml_leave_blocking_section();
> +        if (result)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_pause(value xch, value domid)
> +{
> +       return dom_op(xch, domid, xc_domain_pause);
> +}
> +
> +
> +CAMLprim value stub_xc_domain_unpause(value xch, value domid)
> +{
> +       return dom_op(xch, domid, xc_domain_unpause);
> +}
> +
> +CAMLprim value stub_xc_domain_destroy(value xch, value domid)
> +{
> +       return dom_op(xch, domid, xc_domain_destroy);
> +}
> +
> +CAMLprim value stub_xc_domain_resume_fast(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +
> +       uint32_t c_domid = _D(domid);
> +
> +       // caml_enter_blocking_section();
> +       int result = xc_domain_resume(_H(xch), c_domid, 1);
> +       // caml_leave_blocking_section();
> +        if (result)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_shutdown(value xch, value domid, value reason)
> +{
> +       CAMLparam3(xch, domid, reason);
> +       int ret;
> +
> +       ret = xc_domain_shutdown(_H(xch), _D(domid), Int_val(reason));
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +static value alloc_domaininfo(xc_domaininfo_t * info)
> +{
> +       CAMLparam0();
> +       CAMLlocal2(result, tmp);
> +       int i;
> +
> +       result = caml_alloc_tuple(16);
> +
> +       Store_field(result,  0, Val_int(info->domain));
> +       Store_field(result,  1, Val_bool(info->flags & XEN_DOMINF_dying));
> +       Store_field(result,  2, Val_bool(info->flags & XEN_DOMINF_shutdown));
> +       Store_field(result,  3, Val_bool(info->flags & XEN_DOMINF_paused));
> +       Store_field(result,  4, Val_bool(info->flags & XEN_DOMINF_blocked));
> +       Store_field(result,  5, Val_bool(info->flags & XEN_DOMINF_running));
> +       Store_field(result,  6, Val_bool(info->flags & XEN_DOMINF_hvm_guest));
> +       Store_field(result,  7, Val_int((info->flags >> XEN_DOMINF_shutdownshift)
> +                                        & XEN_DOMINF_shutdownmask));
> +       Store_field(result,  8, caml_copy_nativeint(info->tot_pages));
> +       Store_field(result,  9, caml_copy_nativeint(info->max_pages));
> +       Store_field(result, 10, caml_copy_int64(info->shared_info_frame));
> +       Store_field(result, 11, caml_copy_int64(info->cpu_time));
> +       Store_field(result, 12, Val_int(info->nr_online_vcpus));
> +       Store_field(result, 13, Val_int(info->max_vcpu_id));
> +       Store_field(result, 14, caml_copy_int32(info->ssidref));
> +
> +        tmp = caml_alloc_small(16, 0);
> +       for (i = 0; i < 16; i++) {
> +               Field(tmp, i) = Val_int(info->handle[i]);
> +       }
> +
> +       Store_field(result, 15, tmp);
> +
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_xc_domain_getinfolist(value xch, value first_domain, value nb)
> +{
> +       CAMLparam3(xch, first_domain, nb);
> +       CAMLlocal2(result, temp);
> +       xc_domaininfo_t * info;
> +       int i, ret, toalloc, retval;
> +       unsigned int c_max_domains;
> +       uint32_t c_first_domain;
> +
> +       /* get the minimum number of allocate byte we need and bump it up to page boundary */
> +       toalloc = (sizeof(xc_domaininfo_t) * Int_val(nb)) | 0xfff;
> +       ret = posix_memalign((void **) ((void *) &info), 4096, toalloc);
> +       if (ret)
> +               caml_raise_out_of_memory();
> +
> +       result = temp = Val_emptylist;
> +
> +       c_first_domain = _D(first_domain);
> +       c_max_domains = Int_val(nb);
> +       // caml_enter_blocking_section();
> +       retval = xc_domain_getinfolist(_H(xch), c_first_domain,
> +                                      c_max_domains, info);
> +       // caml_leave_blocking_section();
> +
> +       if (retval < 0) {
> +               free(info);
> +               failwith_xc(_H(xch));
> +       }
> +       for (i = 0; i < retval; i++) {
> +               result = caml_alloc_small(2, Tag_cons);
> +               Field(result, 0) = Val_int(0);
> +               Field(result, 1) = temp;
> +               temp = result;
> +
> +               Store_field(result, 0, alloc_domaininfo(info + i));
> +       }
> +
> +       free(info);
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_xc_domain_getinfo(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       CAMLlocal1(result);
> +       xc_domaininfo_t info;
> +       int ret;
> +
> +       ret = xc_domain_getinfolist(_H(xch), _D(domid), 1, &info);
> +       if (ret != 1)
> +               failwith_xc(_H(xch));
> +       if (info.domain != _D(domid))
> +               failwith_xc(_H(xch));
> +
> +       result = alloc_domaininfo(&info);
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_xc_vcpu_getinfo(value xch, value domid, value vcpu)
> +{
> +       CAMLparam3(xch, domid, vcpu);
> +       CAMLlocal1(result);
> +       xc_vcpuinfo_t info;
> +       int retval;
> +
> +       uint32_t c_domid = _D(domid);
> +       uint32_t c_vcpu = Int_val(vcpu);
> +       // caml_enter_blocking_section();
> +       retval = xc_vcpu_getinfo(_H(xch), c_domid,
> +                                c_vcpu, &info);
> +       // caml_leave_blocking_section();
> +       if (retval < 0)
> +               failwith_xc(_H(xch));
> +
> +       result = caml_alloc_tuple(5);
> +       Store_field(result, 0, Val_bool(info.online));
> +       Store_field(result, 1, Val_bool(info.blocked));
> +       Store_field(result, 2, Val_bool(info.running));
> +       Store_field(result, 3, caml_copy_int64(info.cpu_time));
> +       Store_field(result, 4, caml_copy_int32(info.cpu));
> +
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_xc_vcpu_context_get(value xch, value domid,
> +                                        value cpu)
> +{
> +       CAMLparam3(xch, domid, cpu);
> +       CAMLlocal1(context);
> +       int ret;
> +       vcpu_guest_context_any_t ctxt;
> +
> +       ret = xc_vcpu_getcontext(_H(xch), _D(domid), Int_val(cpu), &ctxt);
> +
> +       context = caml_alloc_string(sizeof(ctxt));
> +       memcpy(String_val(context), (char *) &ctxt.c, sizeof(ctxt.c));
> +
> +       CAMLreturn(context);
> +}
> +
> +static int get_cpumap_len(value xch, value cpumap)
> +{
> +       int ml_len = Wosize_val(cpumap);
> +       int xc_len = xc_get_max_cpus(_H(xch));
> +
> +       if (ml_len < xc_len)
> +               return ml_len;
> +       else
> +               return xc_len;
> +}
> +
> +CAMLprim value stub_xc_vcpu_setaffinity(value xch, value domid,
> +                                        value vcpu, value cpumap)
> +{
> +       CAMLparam4(xch, domid, vcpu, cpumap);
> +       int i, len = get_cpumap_len(xch, cpumap);
> +       xc_cpumap_t c_cpumap;
> +       int retval;
> +
> +       c_cpumap = xc_cpumap_alloc(_H(xch));
> +       if (c_cpumap == NULL)
> +               failwith_xc(_H(xch));
> +
> +       for (i=0; i<len; i++) {
> +               if (Bool_val(Field(cpumap, i)))
> +                       c_cpumap[i/8] |= i << (i&7);
> +       }
> +       retval = xc_vcpu_setaffinity(_H(xch), _D(domid),
> +                                    Int_val(vcpu), c_cpumap);
> +       free(c_cpumap);
> +
> +       if (retval < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_vcpu_getaffinity(value xch, value domid,
> +                                        value vcpu)
> +{
> +       CAMLparam3(xch, domid, vcpu);
> +       CAMLlocal1(ret);
> +       xc_cpumap_t c_cpumap;
> +       int i, len = xc_get_max_cpus(_H(xch));
> +       int retval;
> +
> +       c_cpumap = xc_cpumap_alloc(_H(xch));
> +       if (c_cpumap == NULL)
> +               failwith_xc(_H(xch));
> +
> +       retval = xc_vcpu_getaffinity(_H(xch), _D(domid),
> +                                    Int_val(vcpu), c_cpumap);
> +       free(c_cpumap);
> +
> +       if (retval < 0) {
> +               free(c_cpumap);
> +               failwith_xc(_H(xch));
> +       }
> +
> +       ret = caml_alloc(len, 0);
> +
> +       for (i=0; i<len; i++) {
> +               if (c_cpumap[i%8] & 1 << (i&7))
> +                       Store_field(ret, i, Val_true);
> +               else
> +                       Store_field(ret, i, Val_false);
> +       }
> +
> +       free(c_cpumap);
> +
> +       CAMLreturn(ret);
> +}
> +
> +CAMLprim value stub_xc_sched_id(value xch)
> +{
> +       CAMLparam1(xch);
> +       int sched_id;
> +
> +       if (xc_sched_id(_H(xch), &sched_id))
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_int(sched_id));
> +}
> +
> +CAMLprim value stub_xc_evtchn_alloc_unbound(value xch,
> +                                            value local_domid,
> +                                            value remote_domid)
> +{
> +       CAMLparam3(xch, local_domid, remote_domid);
> +
> +       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,
> +                                            c_remote_domid);
> +       // caml_leave_blocking_section();
> +
> +       if (result < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_int(result));
> +}
> +
> +CAMLprim value stub_xc_evtchn_reset(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       int r;
> +
> +       r = xc_evtchn_reset(_H(xch), _D(domid));
> +       if (r < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +
> +#define RING_SIZE 32768
> +static char ring[RING_SIZE];
> +
> +CAMLprim value stub_xc_readconsolering(value xch)
> +{
> +       unsigned int size = RING_SIZE;
> +       char *ring_ptr = ring;
> +
> +       CAMLparam1(xch);
> +
> +       // caml_enter_blocking_section();
> +       int retval = xc_readconsolering(_H(xch), ring_ptr, &size, 0, 0, NULL);
> +       // caml_leave_blocking_section();
> +
> +       if (retval)
> +               failwith_xc(_H(xch));
> +       ring[size] = '\0';
> +       CAMLreturn(caml_copy_string(ring));
> +}
> +
> +CAMLprim value stub_xc_send_debug_keys(value xch, value keys)
> +{
> +       CAMLparam2(xch, keys);
> +       int r;
> +
> +       r = xc_send_debug_keys(_H(xch), String_val(keys));
> +       if (r)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_physinfo(value xch)
> +{
> +       CAMLparam1(xch);
> +       CAMLlocal3(physinfo, cap_list, tmp);
> +       xc_physinfo_t c_physinfo;
> +       int r;
> +
> +       // caml_enter_blocking_section();
> +       r = xc_physinfo(_H(xch), &c_physinfo);
> +       // caml_leave_blocking_section();
> +
> +       if (r)
> +               failwith_xc(_H(xch));
> +
> +       tmp = cap_list = Val_emptylist;
> +       for (r = 0; r < 2; r++) {
> +               if ((c_physinfo.capabilities >> r) & 1) {
> +                       tmp = caml_alloc_small(2, Tag_cons);
> +                       Field(tmp, 0) = Val_int(r);
> +                       Field(tmp, 1) = cap_list;
> +                       cap_list = tmp;
> +               }
> +       }
> +
> +       physinfo = caml_alloc_tuple(9);
> +       Store_field(physinfo, 0, Val_int(c_physinfo.threads_per_core));
> +       Store_field(physinfo, 1, Val_int(c_physinfo.cores_per_socket));
> +       Store_field(physinfo, 2, Val_int(c_physinfo.nr_cpus));
> +       Store_field(physinfo, 3, Val_int(c_physinfo.max_node_id));
> +       Store_field(physinfo, 4, Val_int(c_physinfo.cpu_khz));
> +       Store_field(physinfo, 5, caml_copy_nativeint(c_physinfo.total_pages));
> +       Store_field(physinfo, 6, caml_copy_nativeint(c_physinfo.free_pages));
> +       Store_field(physinfo, 7, caml_copy_nativeint(c_physinfo.scrub_pages));
> +       Store_field(physinfo, 8, cap_list);
> +
> +       CAMLreturn(physinfo);
> +}
> +
> +CAMLprim value stub_xc_pcpu_info(value xch, value nr_cpus)
> +{
> +       CAMLparam2(xch, nr_cpus);
> +       CAMLlocal2(pcpus, v);
> +       xc_cpuinfo_t *info;
> +       int r, size;
> +
> +       if (Int_val(nr_cpus) < 1)
> +               caml_invalid_argument("nr_cpus");
> +
> +       info = calloc(Int_val(nr_cpus) + 1, sizeof(*info));
> +       if (!info)
> +               caml_raise_out_of_memory();
> +
> +       // caml_enter_blocking_section();
> +       r = xc_getcpuinfo(_H(xch), Int_val(nr_cpus), info, &size);
> +       // caml_leave_blocking_section();
> +
> +       if (r) {
> +               free(info);
> +               failwith_xc(_H(xch));
> +       }
> +
> +       if (size > 0) {
> +               int i;
> +               pcpus = caml_alloc(size, 0);
> +               for (i = 0; i < size; i++) {
> +                       v = caml_copy_int64(info[i].idletime);
> +                       caml_modify(&Field(pcpus, i), v);
> +               }
> +       } else
> +               pcpus = Atom(0);
> +       free(info);
> +       CAMLreturn(pcpus);
> +}
> +
> +CAMLprim value stub_xc_domain_setmaxmem(value xch, value domid,
> +                                        value max_memkb)
> +{
> +       CAMLparam3(xch, domid, max_memkb);
> +
> +       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,
> +                                        c_max_memkb);
> +       // caml_leave_blocking_section();
> +       if (retval)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_set_memmap_limit(value xch, value domid,
> +                                               value map_limitkb)
> +{
> +       CAMLparam3(xch, domid, map_limitkb);
> +       unsigned long v;
> +       int retval;
> +
> +       v = Int64_val(map_limitkb);
> +       retval = xc_domain_set_memmap_limit(_H(xch), _D(domid), v);
> +       if (retval)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_memory_increase_reservation(value xch,
> +                                                          value domid,
> +                                                          value mem_kb)
> +{
> +       CAMLparam3(xch, domid, mem_kb);
> +
> +       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,
> +                                                         nr_extents, 0, 0, NULL);
> +       // caml_leave_blocking_section();
> +
> +       if (retval)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_set_machine_address_size(value xch,
> +                                                      value domid,
> +                                                      value width)
> +{
> +       CAMLparam3(xch, domid, width);
> +       uint32_t c_domid = _D(domid);
> +       int c_width = Int_val(width);
> +
> +       int retval = xc_domain_set_machine_address_size(_H(xch), c_domid, c_width);
> +       if (retval)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_get_machine_address_size(value xch,
> +                                                       value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       int retval;
> +
> +       retval = xc_domain_get_machine_address_size(_H(xch), _D(domid));
> +       if (retval < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_int(retval));
> +}
> +
> +CAMLprim value stub_xc_domain_cpuid_set(value xch, value domid,
> +                                        value input,
> +                                        value config)
> +{
> +       CAMLparam4(xch, domid, input, config);
> +       CAMLlocal2(array, tmp);
> +       int r;
> +       unsigned int c_input[2];
> +       char *c_config[4], *out_config[4];
> +
> +       c_config[0] = string_of_option_array(config, 0);
> +       c_config[1] = string_of_option_array(config, 1);
> +       c_config[2] = string_of_option_array(config, 2);
> +       c_config[3] = string_of_option_array(config, 3);
> +
> +       cpuid_input_of_val(c_input[0], c_input[1], input);
> +
> +       array = caml_alloc(4, 0);
> +       for (r = 0; r < 4; r++) {
> +               tmp = Val_none;
> +               if (c_config[r]) {
> +                       tmp = caml_alloc_small(1, 0);
> +                       Field(tmp, 0) = caml_alloc_string(32);
> +               }
> +               Store_field(array, r, tmp);
> +       }
> +
> +       for (r = 0; r < 4; r++)
> +               out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL;
> +
> +       r = xc_cpuid_set(_H(xch), _D(domid),
> +                        c_input, (const char **)c_config, out_config);
> +       if (r < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(array);
> +}
> +
> +CAMLprim value stub_xc_domain_cpuid_apply_policy(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       int r;
> +
> +       r = xc_cpuid_apply_policy(_H(xch), _D(domid));
> +       if (r < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_cpuid_check(value xch, value input, value config)
> +{
> +       CAMLparam3(xch, input, config);
> +       CAMLlocal3(ret, array, tmp);
> +       int r;
> +       unsigned int c_input[2];
> +       char *c_config[4], *out_config[4];
> +
> +       c_config[0] = string_of_option_array(config, 0);
> +       c_config[1] = string_of_option_array(config, 1);
> +       c_config[2] = string_of_option_array(config, 2);
> +       c_config[3] = string_of_option_array(config, 3);
> +
> +       cpuid_input_of_val(c_input[0], c_input[1], input);
> +
> +       array = caml_alloc(4, 0);
> +       for (r = 0; r < 4; r++) {
> +               tmp = Val_none;
> +               if (c_config[r]) {
> +                       tmp = caml_alloc_small(1, 0);
> +                       Field(tmp, 0) = caml_alloc_string(32);
> +               }
> +               Store_field(array, r, tmp);
> +       }
> +
> +       for (r = 0; r < 4; r++)
> +               out_config[r] = (c_config[r]) ? String_val(Field(Field(array, r), 0)) : NULL;
> +
> +       r = xc_cpuid_check(_H(xch), c_input, (const char **)c_config, out_config);
> +       if (r < 0)
> +               failwith_xc(_H(xch));
> +
> +       ret = caml_alloc_tuple(2);
> +       Store_field(ret, 0, Val_bool(r));
> +       Store_field(ret, 1, array);
> +
> +       CAMLreturn(ret);
> +}
> +
> +CAMLprim value stub_xc_version_version(value xch)
> +{
> +       CAMLparam1(xch);
> +       CAMLlocal1(result);
> +       xen_extraversion_t extra;
> +       long packed;
> +       int retval;
> +
> +       // caml_enter_blocking_section();
> +       packed = xc_version(_H(xch), XENVER_version, NULL);
> +       retval = xc_version(_H(xch), XENVER_extraversion, &extra);
> +       // caml_leave_blocking_section();
> +
> +       if (retval)
> +               failwith_xc(_H(xch));
> +
> +       result = caml_alloc_tuple(3);
> +
> +       Store_field(result, 0, Val_int(packed >> 16));
> +       Store_field(result, 1, Val_int(packed & 0xffff));
> +       Store_field(result, 2, caml_copy_string(extra));
> +
> +       CAMLreturn(result);
> +}
> +
> +
> +CAMLprim value stub_xc_version_compile_info(value xch)
> +{
> +       CAMLparam1(xch);
> +       CAMLlocal1(result);
> +       xen_compile_info_t ci;
> +       int retval;
> +
> +       // caml_enter_blocking_section();
> +       retval = xc_version(_H(xch), XENVER_compile_info, &ci);
> +       // caml_leave_blocking_section();
> +
> +       if (retval)
> +               failwith_xc(_H(xch));
> +
> +       result = caml_alloc_tuple(4);
> +
> +       Store_field(result, 0, caml_copy_string(ci.compiler));
> +       Store_field(result, 1, caml_copy_string(ci.compile_by));
> +       Store_field(result, 2, caml_copy_string(ci.compile_domain));
> +       Store_field(result, 3, caml_copy_string(ci.compile_date));
> +
> +       CAMLreturn(result);
> +}
> +
> +
> +static value xc_version_single_string(value xch, int code, void *info)
> +{
> +       CAMLparam1(xch);
> +       int retval;
> +
> +       // caml_enter_blocking_section();
> +       retval = xc_version(_H(xch), code, info);
> +       // caml_leave_blocking_section();
> +
> +       if (retval)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(caml_copy_string((char *)info));
> +}
> +
> +
> +CAMLprim value stub_xc_version_changeset(value xch)
> +{
> +       xen_changeset_info_t ci;
> +
> +       return xc_version_single_string(xch, XENVER_changeset, &ci);
> +}
> +
> +
> +CAMLprim value stub_xc_version_capabilities(value xch)
> +{
> +       xen_capabilities_info_t ci;
> +
> +       return xc_version_single_string(xch, XENVER_capabilities, &ci);
> +}
> +
> +
> +CAMLprim value stub_pages_to_kib(value pages)
> +{
> +       CAMLparam1(pages);
> +
> +       CAMLreturn(caml_copy_int64(Int64_val(pages) << (PAGE_SHIFT - 10)));
> +}
> +
> +
> +CAMLprim value stub_map_foreign_range(value xch, value dom,
> +                                      value size, value mfn)
> +{
> +       CAMLparam4(xch, dom, size, mfn);
> +       CAMLlocal1(result);
> +       struct mmap_interface *intf;
> +       uint32_t c_dom;
> +       unsigned long c_mfn;
> +
> +       result = caml_alloc(sizeof(struct mmap_interface), Abstract_tag);
> +       intf = (struct mmap_interface *) result;
> +
> +       intf->len = Int_val(size);
> +
> +       c_dom = _D(dom);
> +       c_mfn = Nativeint_val(mfn);
> +       // 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();
> +       if (!intf->addr)
> +               caml_failwith("xc_map_foreign_range error");
> +       CAMLreturn(result);
> +}
> +
> +CAMLprim value stub_sched_credit_domain_get(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       CAMLlocal1(sdom);
> +       struct xen_domctl_sched_credit c_sdom;
> +       int ret;
> +
> +       // caml_enter_blocking_section();
> +       ret = xc_sched_credit_domain_get(_H(xch), _D(domid), &c_sdom);
> +       // caml_leave_blocking_section();
> +       if (ret != 0)
> +               failwith_xc(_H(xch));
> +
> +       sdom = caml_alloc_tuple(2);
> +       Store_field(sdom, 0, Val_int(c_sdom.weight));
> +       Store_field(sdom, 1, Val_int(c_sdom.cap));
> +
> +       CAMLreturn(sdom);
> +}
> +
> +CAMLprim value stub_sched_credit_domain_set(value xch, value domid,
> +                                            value sdom)
> +{
> +       CAMLparam3(xch, domid, sdom);
> +       struct xen_domctl_sched_credit c_sdom;
> +       int ret;
> +
> +       c_sdom.weight = Int_val(Field(sdom, 0));
> +       c_sdom.cap = Int_val(Field(sdom, 1));
> +       // caml_enter_blocking_section();
> +       ret = xc_sched_credit_domain_set(_H(xch), _D(domid), &c_sdom);
> +       // caml_leave_blocking_section();
> +       if (ret != 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_shadow_allocation_get(value xch, value domid)
> +{
> +       CAMLparam2(xch, domid);
> +       CAMLlocal1(mb);
> +       unsigned long c_mb;
> +       int ret;
> +
> +       // 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();
> +       if (ret != 0)
> +               failwith_xc(_H(xch));
> +
> +       mb = Val_int(c_mb);
> +       CAMLreturn(mb);
> +}
> +
> +CAMLprim value stub_shadow_allocation_set(value xch, value domid,
> +                                         value mb)
> +{
> +       CAMLparam3(xch, domid, mb);
> +       unsigned long c_mb;
> +       int ret;
> +
> +       c_mb = Int_val(mb);
> +       // 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();
> +       if (ret != 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_get_pfn_list(value xch, value domid,
> +                                           value nr_pfns)
> +{
> +       CAMLparam3(xch, domid, nr_pfns);
> +       CAMLlocal2(array, v);
> +       unsigned long c_nr_pfns;
> +       long ret, i;
> +       uint64_t *c_array;
> +
> +       c_nr_pfns = Nativeint_val(nr_pfns);
> +
> +       c_array = malloc(sizeof(uint64_t) * c_nr_pfns);
> +       if (!c_array)
> +               caml_raise_out_of_memory();
> +
> +       ret = xc_get_pfn_list(_H(xch), _D(domid),
> +                             c_array, c_nr_pfns);
> +       if (ret < 0) {
> +               free(c_array);
> +               failwith_xc(_H(xch));
> +       }
> +
> +       array = caml_alloc(ret, 0);
> +       for (i = 0; i < ret; i++) {
> +               v = caml_copy_nativeint(c_array[i]);
> +               Store_field(array, i, v);
> +       }
> +       free(c_array);
> +
> +       CAMLreturn(array);
> +}
> +
> +CAMLprim value stub_xc_domain_ioport_permission(value xch, value domid,
> +                                              value start_port, value nr_ports,
> +                                              value allow)
> +{
> +       CAMLparam5(xch, domid, start_port, nr_ports, allow);
> +       uint32_t c_start_port, c_nr_ports;
> +       uint8_t c_allow;
> +       int ret;
> +
> +       c_start_port = Int_val(start_port);
> +       c_nr_ports = Int_val(nr_ports);
> +       c_allow = Bool_val(allow);
> +
> +       ret = xc_domain_ioport_permission(_H(xch), _D(domid),
> +                                        c_start_port, c_nr_ports, c_allow);
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_iomem_permission(value xch, value domid,
> +                                              value start_pfn, value nr_pfns,
> +                                              value allow)
> +{
> +       CAMLparam5(xch, domid, start_pfn, nr_pfns, allow);
> +       unsigned long c_start_pfn, c_nr_pfns;
> +       uint8_t c_allow;
> +       int ret;
> +
> +       c_start_pfn = Nativeint_val(start_pfn);
> +       c_nr_pfns = Nativeint_val(nr_pfns);
> +       c_allow = Bool_val(allow);
> +
> +       ret = xc_domain_iomem_permission(_H(xch), _D(domid),
> +                                        c_start_pfn, c_nr_pfns, c_allow);
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_irq_permission(value xch, value domid,
> +                                            value pirq, value allow)
> +{
> +       CAMLparam4(xch, domid, pirq, allow);
> +       uint8_t c_pirq;
> +       uint8_t c_allow;
> +       int ret;
> +
> +       c_pirq = Int_val(pirq);
> +       c_allow = Bool_val(allow);
> +
> +       ret = xc_domain_irq_permission(_H(xch), _D(domid),
> +                                      c_pirq, c_allow);
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +static uint32_t pci_dev_to_bdf(int domain, int bus, int slot, int func)
> +{
> +       uint32_t bdf = 0;
> +       bdf |= (bus & 0xff) << 16;
> +       bdf |= (slot & 0x1f) << 11;
> +       bdf |= (func & 0x7) << 8;
> +       return bdf;
> +}
> +
> +CAMLprim value stub_xc_domain_test_assign_device(value xch, value domid, value desc)
> +{
> +       CAMLparam3(xch, domid, desc);
> +       int ret;
> +       int domain, bus, slot, func;
> +       uint32_t bdf;
> +
> +       domain = Int_val(Field(desc, 0));
> +       bus = Int_val(Field(desc, 1));
> +       slot = Int_val(Field(desc, 2));
> +       func = Int_val(Field(desc, 3));
> +       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> +
> +       ret = xc_test_assign_device(_H(xch), _D(domid), bdf);
> +
> +       CAMLreturn(Val_bool(ret == 0));
> +}
> +
> +CAMLprim value stub_xc_domain_assign_device(value xch, value domid, value desc)
> +{
> +       CAMLparam3(xch, domid, desc);
> +       int ret;
> +       int domain, bus, slot, func;
> +       uint32_t bdf;
> +
> +       domain = Int_val(Field(desc, 0));
> +       bus = Int_val(Field(desc, 1));
> +       slot = Int_val(Field(desc, 2));
> +       func = Int_val(Field(desc, 3));
> +       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> +
> +       ret = xc_assign_device(_H(xch), _D(domid), bdf);
> +
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_domain_deassign_device(value xch, value domid, value desc)
> +{
> +       CAMLparam3(xch, domid, desc);
> +       int ret;
> +       int domain, bus, slot, func;
> +       uint32_t bdf;
> +
> +       domain = Int_val(Field(desc, 0));
> +       bus = Int_val(Field(desc, 1));
> +       slot = Int_val(Field(desc, 2));
> +       func = Int_val(Field(desc, 3));
> +       bdf = pci_dev_to_bdf(domain, bus, slot, func);
> +
> +       ret = xc_deassign_device(_H(xch), _D(domid), bdf);
> +
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +       CAMLreturn(Val_unit);
> +}
> +
> +CAMLprim value stub_xc_watchdog(value xch, value domid, value timeout)
> +{
> +       CAMLparam3(xch, domid, timeout);
> +       int ret;
> +       unsigned int c_timeout = Int32_val(timeout);
> +
> +       ret = xc_watchdog(_H(xch), _D(domid), c_timeout);
> +       if (ret < 0)
> +               failwith_xc(_H(xch));
> +
> +       CAMLreturn(Val_int(ret));
> +}
> +
> +/*
> + * Local variables:
> + *  indent-tabs-mode: t
> + *  c-basic-offset: 8
> + *  tab-width: 8
> + * End:
> + */
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/Makefile
> --- a/tools/ocaml/libs/xl/Makefile
> +++ b/tools/ocaml/libs/xl/Makefile
> @@ -6,44 +6,44 @@
>  CFLAGS += -Wno-unused
>  CFLAGS += $(CFLAGS_libxenlight)
> 
> -OBJS = xl
> -INTF = xl.cmi
> -LIBS = xl.cma xl.cmxa
> +OBJS = xenlight
> +INTF = xenlight.cmi
> +LIBS = xenlight.cma xenlight.cmxa
> 
> -LIBS_xl = $(LDLIBS_libxenlight)
> +LIBS_xenlight = $(LDLIBS_libxenlight)
> 
> -xl_OBJS = $(OBJS)
> -xl_C_OBJS = xl_stubs
> +xenlight_OBJS = $(OBJS)
> +xenlight_C_OBJS = xenlight_stubs
> 
> -OCAML_LIBRARY = xl
> +OCAML_LIBRARY = xenlight
> 
> -GENERATED_FILES += xl.ml xl.ml.tmp xl.mli xl.mli.tmp
> +GENERATED_FILES += xenlight.ml xenlight.ml.tmp xenlight.mli xenlight.mli.tmp
>  GENERATED_FILES += _libxl_types.ml.in _libxl_types.mli.in
>  GENERATED_FILES += _libxl_types.inc
> 
>  all: $(INTF) $(LIBS)
> 
> -xl.ml: xl.ml.in _libxl_types.ml.in
> +xenlight.ml: xenlight.ml.in _libxl_types.ml.in
>         $(Q)sed -e '1i\
>  (*\
>   * AUTO-GENERATED FILE DO NOT EDIT\
> - * Generated from xl.ml.in and _libxl_types.ml.in\
> + * Generated from xenlight.ml.in and _libxl_types.ml.in\
>   *)\
>  ' \
>             -e '/^(\* @@LIBXL_TYPES@@ \*)$$/r_libxl_types.ml.in' \
> -         < xl.ml.in > xl.ml.tmp
> -       $(Q)mv xl.ml.tmp xl.ml
> +         < xenlight.ml.in > xenlight.ml.tmp
> +       $(Q)mv xenlight.ml.tmp xenlight.ml
> 
> -xl.mli: xl.mli.in _libxl_types.mli.in
> +xenlight.mli: xenlight.mli.in _libxl_types.mli.in
>         $(Q)sed -e '1i\
>  (*\
>   * AUTO-GENERATED FILE DO NOT EDIT\
> - * Generated from xl.mli.in and _libxl_types.mli.in\
> + * Generated from xenlight.mli.in and _libxl_types.mli.in\
>   *)\
>  ' \
>             -e '/^(\* @@LIBXL_TYPES@@ \*)$$/r_libxl_types.mli.in' \
> -         < xl.mli.in > xl.mli.tmp
> -       $(Q)mv xl.mli.tmp xl.mli
> +         < xenlight.mli.in > xenlight.mli.tmp
> +       $(Q)mv xenlight.mli.tmp xenlight.mli
> 
>  _libxl_types.ml.in _libxl_types.mli.in _libxl_types.inc: genwrap.py $(XEN_ROOT)/tools/libxl/libxl_types.idl \
>                  $(XEN_ROOT)/tools/libxl/libxltypes.py
> @@ -56,11 +56,11 @@
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xl
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xl META $(INTF) $(LIBS) *.a *.so *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenlight
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenlight META $(INTF) $(LIBS) *.a *.so *.cmx
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xl
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenlight
> 
>  include $(TOPLEVEL)/Makefile.rules
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xenlight.ml.in
> --- /dev/null
> +++ b/tools/ocaml/libs/xl/xenlight.ml.in
> @@ -0,0 +1,39 @@
> +(*
> + * Copyright (C) 2009-2011 Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + *)
> +
> +exception Error of string
> +
> +type domid = int
> +
> +(* @@LIBXL_TYPES@@ *)
> +
> +module Topologyinfo = struct
> +       type t =
> +       {
> +               core : int;
> +               socket : int;
> +               node : int;
> +       }
> +       external get : unit -> t = "stub_xl_topologyinfo"
> +end
> +
> +external button_press : domid -> button -> unit = "stub_xl_button_press"
> +
> +
> +external send_trigger : domid -> string -> int -> unit = "stub_xl_send_trigger"
> +external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
> +external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys"
> +
> +let _ = Callback.register_exception "xl.error" (Error "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xenlight.mli.in
> --- /dev/null
> +++ b/tools/ocaml/libs/xl/xenlight.mli.in
> @@ -0,0 +1,36 @@
> +(*
> + * Copyright (C) 2009-2011 Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + *)
> +
> +exception Error of string
> +
> +type domid = int
> +
> +(* @@LIBXL_TYPES@@ *)
> +
> +module Topologyinfo : sig
> +       type t =
> +       {
> +               core : int;
> +               socket : int;
> +               node : int;
> +       }
> +       external get : unit -> t = "stub_xl_topologyinfo"
> +end
> +
> +external button_press : domid -> button -> unit = "stub_xl_button_press"
> +
> +external send_trigger : domid -> string -> int -> unit = "stub_xl_send_trigger"
> +external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
> +external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xenlight_stubs.c
> --- /dev/null
> +++ b/tools/ocaml/libs/xl/xenlight_stubs.c
> @@ -0,0 +1,596 @@
> +/*
> + * Copyright (C) 2009-2011 Citrix Ltd.
> + * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + */
> +
> +#include <stdlib.h>
> +
> +#define CAML_NAME_SPACE
> +#include <caml/alloc.h>
> +#include <caml/memory.h>
> +#include <caml/signals.h>
> +#include <caml/fail.h>
> +#include <caml/callback.h>
> +
> +#include <sys/mman.h>
> +#include <stdint.h>
> +#include <string.h>
> +
> +#include <libxl.h>
> +
> +struct caml_logger {
> +       struct xentoollog_logger logger;
> +       int log_offset;
> +       char log_buf[2048];
> +};
> +
> +typedef struct caml_gc {
> +       int offset;
> +       void *ptrs[64];
> +} caml_gc;
> +
> +static void log_vmessage(struct xentoollog_logger *logger, xentoollog_level level,
> +                  int errnoval, const char *context, const char *format, va_list al)
> +{
> +       struct caml_logger *ologger = (struct caml_logger *) logger;
> +
> +       ologger->log_offset += vsnprintf(ologger->log_buf + ologger->log_offset,
> +                                        2048 - ologger->log_offset, format, al);
> +}
> +
> +static void log_destroy(struct xentoollog_logger *logger)
> +{
> +}
> +
> +#define INIT_STRUCT() libxl_ctx *ctx; struct caml_logger lg; struct caml_gc gc; gc.offset = 0;
> +
> +#define INIT_CTX()  \
> +       lg.logger.vmessage = log_vmessage; \
> +       lg.logger.destroy = log_destroy; \
> +       lg.logger.progress = NULL; \
> +       caml_enter_blocking_section(); \
> +       ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, (struct xentoollog_logger *) &lg); \
> +       if (ret != 0) \
> +               failwith_xl("cannot init context", &lg);
> +
> +#define FREE_CTX()  \
> +       gc_free(&gc); \
> +       caml_leave_blocking_section(); \
> +       libxl_ctx_free(ctx)
> +
> +static char * dup_String_val(caml_gc *gc, value s)
> +{
> +       int len;
> +       char *c;
> +       len = caml_string_length(s);
> +       c = calloc(len + 1, sizeof(char));
> +       if (!c)
> +               caml_raise_out_of_memory();
> +       gc->ptrs[gc->offset++] = c;
> +       memcpy(c, String_val(s), len);
> +       return c;
> +}
> +
> +static void gc_free(caml_gc *gc)
> +{
> +       int i;
> +       for (i = 0; i < gc->offset; i++) {
> +               free(gc->ptrs[i]);
> +       }
> +}
> +
> +static void failwith_xl(char *fname, struct caml_logger *lg)
> +{
> +       char *s;
> +       s = (lg) ? lg->log_buf : fname;
> +       caml_raise_with_string(*caml_named_value("xl.error"), s);
> +}
> +
> +#if 0 /* TODO: wrap libxl_domain_create(), these functions will be needed then */
> +static void * gc_calloc(caml_gc *gc, size_t nmemb, size_t size)
> +{
> +       void *ptr;
> +       ptr = calloc(nmemb, size);
> +       if (!ptr)
> +               caml_raise_out_of_memory();
> +       gc->ptrs[gc->offset++] = ptr;
> +       return ptr;
> +}
> +
> +static int string_string_tuple_array_val (caml_gc *gc, char ***c_val, value v)
> +{
> +       CAMLparam1(v);
> +       CAMLlocal1(a);
> +       int i;
> +       char **array;
> +
> +       for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1)) { i++; }
> +
> +       array = gc_calloc(gc, (i + 1) * 2, sizeof(char *));
> +       if (!array)
> +               return 1;
> +       for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1), i++) {
> +               value b = Field(a, 0);
> +               array[i * 2] = dup_String_val(gc, Field(b, 0));
> +               array[i * 2 + 1] = dup_String_val(gc, Field(b, 1));
> +       }
> +       *c_val = array;
> +       CAMLreturn(0);
> +}
> +
> +#endif
> +
> +static value Val_mac (libxl_mac *c_val)
> +{
> +       CAMLparam0();
> +       CAMLlocal1(v);
> +       int i;
> +
> +       v = caml_alloc_tuple(6);
> +
> +       for(i=0; i<6; i++)
> +               Store_field(v, i, Val_int((*c_val)[i]));
> +
> +       CAMLreturn(v);
> +}
> +
> +static int Mac_val(caml_gc *gc, struct caml_logger *lg, libxl_mac *c_val, value v)
> +{
> +       CAMLparam1(v);
> +       int i;
> +
> +       for(i=0; i<6; i++)
> +               (*c_val)[i] = Int_val(Field(v, i));
> +
> +       CAMLreturn(0);
> +}
> +
> +static value Val_uuid (libxl_uuid *c_val)
> +{
> +       CAMLparam0();
> +       CAMLlocal1(v);
> +       uint8_t *uuid = libxl_uuid_bytearray(c_val);
> +       int i;
> +
> +       v = caml_alloc_tuple(16);
> +
> +       for(i=0; i<16; i++)
> +               Store_field(v, i, Val_int(uuid[i]));
> +
> +       CAMLreturn(v);
> +}
> +
> +static int Uuid_val(caml_gc *gc, struct caml_logger *lg, libxl_uuid *c_val, value v)
> +{
> +       CAMLparam1(v);
> +       int i;
> +       uint8_t *uuid = libxl_uuid_bytearray(c_val);
> +
> +       for(i=0; i<16; i++)
> +               uuid[i] = Int_val(Field(v, i));
> +
> +       CAMLreturn(0);
> +}
> +
> +static value Val_hwcap(libxl_hwcap *c_val)
> +{
> +       CAMLparam0();
> +       CAMLlocal1(hwcap);
> +       int i;
> +
> +       hwcap = caml_alloc_tuple(8);
> +       for (i = 0; i < 8; i++)
> +               Store_field(hwcap, i, caml_copy_int32((*c_val)[i]));
> +
> +       CAMLreturn(hwcap);
> +}
> +
> +#include "_libxl_types.inc"
> +
> +static value Val_topologyinfo(libxl_topologyinfo *c_val)
> +{
> +       CAMLparam0();
> +       CAMLlocal3(v, topology, topologyinfo);
> +       int i;
> +
> +       topologyinfo = caml_alloc_tuple(c_val->coremap.entries);
> +       for (i = 0; i < c_val->coremap.entries; i++) {
> +               v = Val_int(0); /* None */
> +               if (c_val->coremap.array[i] != LIBXL_CPUARRAY_INVALID_ENTRY) {
> +                       topology = caml_alloc_tuple(3);
> +                       Store_field(topology, 0, Val_int(c_val->coremap.array[i]));
> +                       Store_field(topology, 1, Val_int(c_val->socketmap.array[i]));
> +                       Store_field(topology, 2, Val_int(c_val->nodemap.array[i]));
> +                       v = caml_alloc(1, 0); /* Some */
> +                       Store_field(v, 0, topology);
> +               }
> +               Store_field(topologyinfo, i, v);
> +       }
> +
> +       CAMLreturn(topologyinfo);
> +}
> +
> +value stub_xl_device_disk_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_disk c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_disk_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_disk_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("disk_add", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_disk_del(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_disk c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_disk_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_disk_del(ctx, Int_val(domid), &c_info, 0);
> +       if (ret != 0)
> +               failwith_xl("disk_del", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_nic_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_nic c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_nic_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_nic_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("nic_add", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_nic_del(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_nic c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_nic_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_nic_del(ctx, Int_val(domid), &c_info, 0);
> +       if (ret != 0)
> +               failwith_xl("nic_del", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_console_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_console c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_console_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_console_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("console_add", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vkb_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_vkb c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_vkb_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_vkb_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("vkb_add", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vkb_clean_shutdown(value domid)
> +{
> +       CAMLparam1(domid);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_device_vkb_clean_shutdown(ctx, Int_val(domid));
> +       if (ret != 0)
> +               failwith_xl("vkb_clean_shutdown", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vkb_hard_shutdown(value domid)
> +{
> +       CAMLparam1(domid);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_device_vkb_hard_shutdown(ctx, Int_val(domid));
> +       if (ret != 0)
> +               failwith_xl("vkb_hard_shutdown", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vfb_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_vfb c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_vfb_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_vfb_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("vfb_add", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vfb_clean_shutdown(value domid)
> +{
> +       CAMLparam1(domid);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_device_vfb_clean_shutdown(ctx, Int_val(domid));
> +       if (ret != 0)
> +               failwith_xl("vfb_clean_shutdown", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_vfb_hard_shutdown(value domid)
> +{
> +       CAMLparam1(domid);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_device_vfb_hard_shutdown(ctx, Int_val(domid));
> +       if (ret != 0)
> +               failwith_xl("vfb_hard_shutdown", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_pci_add(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_pci c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_pci_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_pci_add(ctx, Int_val(domid), &c_info);
> +       if (ret != 0)
> +               failwith_xl("pci_add", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_pci_remove(value info, value domid)
> +{
> +       CAMLparam2(info, domid);
> +       libxl_device_pci c_info;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       device_pci_val(&gc, &lg, &c_info, info);
> +
> +       INIT_CTX();
> +       ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info, 0);
> +       if (ret != 0)
> +               failwith_xl("pci_remove", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_device_pci_shutdown(value domid)
> +{
> +       CAMLparam1(domid);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_device_pci_shutdown(ctx, Int_val(domid));
> +       if (ret != 0)
> +               failwith_xl("pci_shutdown", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_button_press(value domid, value button)
> +{
> +       CAMLparam2(domid, button);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_button_press(ctx, Int_val(domid), Int_val(button) + LIBXL_BUTTON_POWER);
> +       if (ret != 0)
> +               failwith_xl("button_press", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_physinfo_get(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLlocal1(physinfo);
> +       libxl_physinfo c_physinfo;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_get_physinfo(ctx, &c_physinfo);
> +       if (ret != 0)
> +               failwith_xl("physinfo", &lg);
> +       FREE_CTX();
> +
> +       physinfo = Val_physinfo(&gc, &lg, &c_physinfo);
> +       CAMLreturn(physinfo);
> +}
> +
> +value stub_xl_topologyinfo(value unit)
> +{
> +       CAMLparam1(unit);
> +       CAMLlocal1(topologyinfo);
> +       libxl_topologyinfo c_topologyinfo;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_get_topologyinfo(ctx, &c_topologyinfo);
> +       if (ret != 0)
> +               failwith_xl("topologyinfo", &lg);
> +       FREE_CTX();
> +
> +       topologyinfo = Val_topologyinfo(&c_topologyinfo);
> +       CAMLreturn(topologyinfo);
> +}
> +
> +value stub_xl_sched_credit_domain_get(value domid)
> +{
> +       CAMLparam1(domid);
> +       CAMLlocal1(scinfo);
> +       libxl_sched_credit c_scinfo;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_sched_credit_domain_get(ctx, Int_val(domid), &c_scinfo);
> +       if (ret != 0)
> +               failwith_xl("sched_credit_domain_get", &lg);
> +       FREE_CTX();
> +
> +       scinfo = Val_sched_credit(&gc, &lg, &c_scinfo);
> +       CAMLreturn(scinfo);
> +}
> +
> +value stub_xl_sched_credit_domain_set(value domid, value scinfo)
> +{
> +       CAMLparam2(domid, scinfo);
> +       libxl_sched_credit c_scinfo;
> +       int ret;
> +       INIT_STRUCT();
> +
> +       sched_credit_val(&gc, &lg, &c_scinfo, scinfo);
> +
> +       INIT_CTX();
> +       ret = libxl_sched_credit_domain_set(ctx, Int_val(domid), &c_scinfo);
> +       if (ret != 0)
> +               failwith_xl("sched_credit_domain_set", &lg);
> +       FREE_CTX();
> +
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_send_trigger(value domid, value trigger, value vcpuid)
> +{
> +       CAMLparam3(domid, trigger, vcpuid);
> +       int ret;
> +       char *c_trigger;
> +       INIT_STRUCT();
> +
> +       c_trigger = dup_String_val(&gc, trigger);
> +
> +       INIT_CTX();
> +       ret = libxl_send_trigger(ctx, Int_val(domid), c_trigger, Int_val(vcpuid));
> +       if (ret != 0)
> +               failwith_xl("send_trigger", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_send_sysrq(value domid, value sysrq)
> +{
> +       CAMLparam2(domid, sysrq);
> +       int ret;
> +       INIT_STRUCT();
> +
> +       INIT_CTX();
> +       ret = libxl_send_sysrq(ctx, Int_val(domid), Int_val(sysrq));
> +       if (ret != 0)
> +               failwith_xl("send_sysrq", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +value stub_xl_send_debug_keys(value keys)
> +{
> +       CAMLparam1(keys);
> +       int ret;
> +       char *c_keys;
> +       INIT_STRUCT();
> +
> +       c_keys = dup_String_val(&gc, keys);
> +
> +       INIT_CTX();
> +       ret = libxl_send_debug_keys(ctx, c_keys);
> +       if (ret != 0)
> +               failwith_xl("send_debug_keys", &lg);
> +       FREE_CTX();
> +       CAMLreturn(Val_unit);
> +}
> +
> +/*
> + * Local variables:
> + *  indent-tabs-mode: t
> + *  c-basic-offset: 8
> + *  tab-width: 8
> + * End:
> + */
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xl.ml.in
> --- a/tools/ocaml/libs/xl/xl.ml.in
> +++ /dev/null
> @@ -1,39 +0,0 @@
> -(*
> - * Copyright (C) 2009-2011 Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -exception Error of string
> -
> -type domid = int
> -
> -(* @@LIBXL_TYPES@@ *)
> -
> -module Topologyinfo = struct
> -       type t =
> -       {
> -               core : int;
> -               socket : int;
> -               node : int;
> -       }
> -       external get : unit -> t = "stub_xl_topologyinfo"
> -end
> -
> -external button_press : domid -> button -> unit = "stub_xl_button_press"
> -
> -
> -external send_trigger : domid -> string -> int -> unit = "stub_xl_send_trigger"
> -external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
> -external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys"
> -
> -let _ = Callback.register_exception "xl.error" (Error "register_callback")
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xl.mli.in
> --- a/tools/ocaml/libs/xl/xl.mli.in
> +++ /dev/null
> @@ -1,36 +0,0 @@
> -(*
> - * Copyright (C) 2009-2011 Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -exception Error of string
> -
> -type domid = int
> -
> -(* @@LIBXL_TYPES@@ *)
> -
> -module Topologyinfo : sig
> -       type t =
> -       {
> -               core : int;
> -               socket : int;
> -               node : int;
> -       }
> -       external get : unit -> t = "stub_xl_topologyinfo"
> -end
> -
> -external button_press : domid -> button -> unit = "stub_xl_button_press"
> -
> -external send_trigger : domid -> string -> int -> unit = "stub_xl_send_trigger"
> -external send_sysrq : domid -> char -> unit = "stub_xl_send_sysrq"
> -external send_debug_keys : domid -> string -> unit = "stub_xl_send_debug_keys"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xl/xl_stubs.c
> --- a/tools/ocaml/libs/xl/xl_stubs.c
> +++ /dev/null
> @@ -1,596 +0,0 @@
> -/*
> - * Copyright (C) 2009-2011 Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - */
> -
> -#include <stdlib.h>
> -
> -#define CAML_NAME_SPACE
> -#include <caml/alloc.h>
> -#include <caml/memory.h>
> -#include <caml/signals.h>
> -#include <caml/fail.h>
> -#include <caml/callback.h>
> -
> -#include <sys/mman.h>
> -#include <stdint.h>
> -#include <string.h>
> -
> -#include <libxl.h>
> -
> -struct caml_logger {
> -       struct xentoollog_logger logger;
> -       int log_offset;
> -       char log_buf[2048];
> -};
> -
> -typedef struct caml_gc {
> -       int offset;
> -       void *ptrs[64];
> -} caml_gc;
> -
> -static void log_vmessage(struct xentoollog_logger *logger, xentoollog_level level,
> -                  int errnoval, const char *context, const char *format, va_list al)
> -{
> -       struct caml_logger *ologger = (struct caml_logger *) logger;
> -
> -       ologger->log_offset += vsnprintf(ologger->log_buf + ologger->log_offset,
> -                                        2048 - ologger->log_offset, format, al);
> -}
> -
> -static void log_destroy(struct xentoollog_logger *logger)
> -{
> -}
> -
> -#define INIT_STRUCT() libxl_ctx *ctx; struct caml_logger lg; struct caml_gc gc; gc.offset = 0;
> -
> -#define INIT_CTX()  \
> -       lg.logger.vmessage = log_vmessage; \
> -       lg.logger.destroy = log_destroy; \
> -       lg.logger.progress = NULL; \
> -       caml_enter_blocking_section(); \
> -       ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, (struct xentoollog_logger *) &lg); \
> -       if (ret != 0) \
> -               failwith_xl("cannot init context", &lg);
> -
> -#define FREE_CTX()  \
> -       gc_free(&gc); \
> -       caml_leave_blocking_section(); \
> -       libxl_ctx_free(ctx)
> -
> -static char * dup_String_val(caml_gc *gc, value s)
> -{
> -       int len;
> -       char *c;
> -       len = caml_string_length(s);
> -       c = calloc(len + 1, sizeof(char));
> -       if (!c)
> -               caml_raise_out_of_memory();
> -       gc->ptrs[gc->offset++] = c;
> -       memcpy(c, String_val(s), len);
> -       return c;
> -}
> -
> -static void gc_free(caml_gc *gc)
> -{
> -       int i;
> -       for (i = 0; i < gc->offset; i++) {
> -               free(gc->ptrs[i]);
> -       }
> -}
> -
> -static void failwith_xl(char *fname, struct caml_logger *lg)
> -{
> -       char *s;
> -       s = (lg) ? lg->log_buf : fname;
> -       caml_raise_with_string(*caml_named_value("xl.error"), s);
> -}
> -
> -#if 0 /* TODO: wrap libxl_domain_create(), these functions will be needed then */
> -static void * gc_calloc(caml_gc *gc, size_t nmemb, size_t size)
> -{
> -       void *ptr;
> -       ptr = calloc(nmemb, size);
> -       if (!ptr)
> -               caml_raise_out_of_memory();
> -       gc->ptrs[gc->offset++] = ptr;
> -       return ptr;
> -}
> -
> -static int string_string_tuple_array_val (caml_gc *gc, char ***c_val, value v)
> -{
> -       CAMLparam1(v);
> -       CAMLlocal1(a);
> -       int i;
> -       char **array;
> -
> -       for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1)) { i++; }
> -
> -       array = gc_calloc(gc, (i + 1) * 2, sizeof(char *));
> -       if (!array)
> -               return 1;
> -       for (i = 0, a = Field(v, 5); a != Val_emptylist; a = Field(a, 1), i++) {
> -               value b = Field(a, 0);
> -               array[i * 2] = dup_String_val(gc, Field(b, 0));
> -               array[i * 2 + 1] = dup_String_val(gc, Field(b, 1));
> -       }
> -       *c_val = array;
> -       CAMLreturn(0);
> -}
> -
> -#endif
> -
> -static value Val_mac (libxl_mac *c_val)
> -{
> -       CAMLparam0();
> -       CAMLlocal1(v);
> -       int i;
> -
> -       v = caml_alloc_tuple(6);
> -
> -       for(i=0; i<6; i++)
> -               Store_field(v, i, Val_int((*c_val)[i]));
> -
> -       CAMLreturn(v);
> -}
> -
> -static int Mac_val(caml_gc *gc, struct caml_logger *lg, libxl_mac *c_val, value v)
> -{
> -       CAMLparam1(v);
> -       int i;
> -
> -       for(i=0; i<6; i++)
> -               (*c_val)[i] = Int_val(Field(v, i));
> -
> -       CAMLreturn(0);
> -}
> -
> -static value Val_uuid (libxl_uuid *c_val)
> -{
> -       CAMLparam0();
> -       CAMLlocal1(v);
> -       uint8_t *uuid = libxl_uuid_bytearray(c_val);
> -       int i;
> -
> -       v = caml_alloc_tuple(16);
> -
> -       for(i=0; i<16; i++)
> -               Store_field(v, i, Val_int(uuid[i]));
> -
> -       CAMLreturn(v);
> -}
> -
> -static int Uuid_val(caml_gc *gc, struct caml_logger *lg, libxl_uuid *c_val, value v)
> -{
> -       CAMLparam1(v);
> -       int i;
> -       uint8_t *uuid = libxl_uuid_bytearray(c_val);
> -
> -       for(i=0; i<16; i++)
> -               uuid[i] = Int_val(Field(v, i));
> -
> -       CAMLreturn(0);
> -}
> -
> -static value Val_hwcap(libxl_hwcap *c_val)
> -{
> -       CAMLparam0();
> -       CAMLlocal1(hwcap);
> -       int i;
> -
> -       hwcap = caml_alloc_tuple(8);
> -       for (i = 0; i < 8; i++)
> -               Store_field(hwcap, i, caml_copy_int32((*c_val)[i]));
> -
> -       CAMLreturn(hwcap);
> -}
> -
> -#include "_libxl_types.inc"
> -
> -static value Val_topologyinfo(libxl_topologyinfo *c_val)
> -{
> -       CAMLparam0();
> -       CAMLlocal3(v, topology, topologyinfo);
> -       int i;
> -
> -       topologyinfo = caml_alloc_tuple(c_val->coremap.entries);
> -       for (i = 0; i < c_val->coremap.entries; i++) {
> -               v = Val_int(0); /* None */
> -               if (c_val->coremap.array[i] != LIBXL_CPUARRAY_INVALID_ENTRY) {
> -                       topology = caml_alloc_tuple(3);
> -                       Store_field(topology, 0, Val_int(c_val->coremap.array[i]));
> -                       Store_field(topology, 1, Val_int(c_val->socketmap.array[i]));
> -                       Store_field(topology, 2, Val_int(c_val->nodemap.array[i]));
> -                       v = caml_alloc(1, 0); /* Some */
> -                       Store_field(v, 0, topology);
> -               }
> -               Store_field(topologyinfo, i, v);
> -       }
> -
> -       CAMLreturn(topologyinfo);
> -}
> -
> -value stub_xl_device_disk_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_disk c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_disk_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_disk_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("disk_add", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_disk_del(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_disk c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_disk_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_disk_del(ctx, Int_val(domid), &c_info, 0);
> -       if (ret != 0)
> -               failwith_xl("disk_del", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_nic_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_nic c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_nic_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_nic_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("nic_add", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_nic_del(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_nic c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_nic_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_nic_del(ctx, Int_val(domid), &c_info, 0);
> -       if (ret != 0)
> -               failwith_xl("nic_del", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_console_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_console c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_console_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_console_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("console_add", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vkb_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_vkb c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_vkb_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_vkb_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("vkb_add", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vkb_clean_shutdown(value domid)
> -{
> -       CAMLparam1(domid);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_device_vkb_clean_shutdown(ctx, Int_val(domid));
> -       if (ret != 0)
> -               failwith_xl("vkb_clean_shutdown", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vkb_hard_shutdown(value domid)
> -{
> -       CAMLparam1(domid);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_device_vkb_hard_shutdown(ctx, Int_val(domid));
> -       if (ret != 0)
> -               failwith_xl("vkb_hard_shutdown", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vfb_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_vfb c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_vfb_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_vfb_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("vfb_add", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vfb_clean_shutdown(value domid)
> -{
> -       CAMLparam1(domid);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_device_vfb_clean_shutdown(ctx, Int_val(domid));
> -       if (ret != 0)
> -               failwith_xl("vfb_clean_shutdown", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_vfb_hard_shutdown(value domid)
> -{
> -       CAMLparam1(domid);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_device_vfb_hard_shutdown(ctx, Int_val(domid));
> -       if (ret != 0)
> -               failwith_xl("vfb_hard_shutdown", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_pci_add(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_pci c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_pci_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_pci_add(ctx, Int_val(domid), &c_info);
> -       if (ret != 0)
> -               failwith_xl("pci_add", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_pci_remove(value info, value domid)
> -{
> -       CAMLparam2(info, domid);
> -       libxl_device_pci c_info;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       device_pci_val(&gc, &lg, &c_info, info);
> -
> -       INIT_CTX();
> -       ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info, 0);
> -       if (ret != 0)
> -               failwith_xl("pci_remove", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_device_pci_shutdown(value domid)
> -{
> -       CAMLparam1(domid);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_device_pci_shutdown(ctx, Int_val(domid));
> -       if (ret != 0)
> -               failwith_xl("pci_shutdown", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_button_press(value domid, value button)
> -{
> -       CAMLparam2(domid, button);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_button_press(ctx, Int_val(domid), Int_val(button) + LIBXL_BUTTON_POWER);
> -       if (ret != 0)
> -               failwith_xl("button_press", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_physinfo_get(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLlocal1(physinfo);
> -       libxl_physinfo c_physinfo;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_get_physinfo(ctx, &c_physinfo);
> -       if (ret != 0)
> -               failwith_xl("physinfo", &lg);
> -       FREE_CTX();
> -
> -       physinfo = Val_physinfo(&gc, &lg, &c_physinfo);
> -       CAMLreturn(physinfo);
> -}
> -
> -value stub_xl_topologyinfo(value unit)
> -{
> -       CAMLparam1(unit);
> -       CAMLlocal1(topologyinfo);
> -       libxl_topologyinfo c_topologyinfo;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_get_topologyinfo(ctx, &c_topologyinfo);
> -       if (ret != 0)
> -               failwith_xl("topologyinfo", &lg);
> -       FREE_CTX();
> -
> -       topologyinfo = Val_topologyinfo(&c_topologyinfo);
> -       CAMLreturn(topologyinfo);
> -}
> -
> -value stub_xl_sched_credit_domain_get(value domid)
> -{
> -       CAMLparam1(domid);
> -       CAMLlocal1(scinfo);
> -       libxl_sched_credit c_scinfo;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_sched_credit_domain_get(ctx, Int_val(domid), &c_scinfo);
> -       if (ret != 0)
> -               failwith_xl("sched_credit_domain_get", &lg);
> -       FREE_CTX();
> -
> -       scinfo = Val_sched_credit(&gc, &lg, &c_scinfo);
> -       CAMLreturn(scinfo);
> -}
> -
> -value stub_xl_sched_credit_domain_set(value domid, value scinfo)
> -{
> -       CAMLparam2(domid, scinfo);
> -       libxl_sched_credit c_scinfo;
> -       int ret;
> -       INIT_STRUCT();
> -
> -       sched_credit_val(&gc, &lg, &c_scinfo, scinfo);
> -
> -       INIT_CTX();
> -       ret = libxl_sched_credit_domain_set(ctx, Int_val(domid), &c_scinfo);
> -       if (ret != 0)
> -               failwith_xl("sched_credit_domain_set", &lg);
> -       FREE_CTX();
> -
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_send_trigger(value domid, value trigger, value vcpuid)
> -{
> -       CAMLparam3(domid, trigger, vcpuid);
> -       int ret;
> -       char *c_trigger;
> -       INIT_STRUCT();
> -
> -       c_trigger = dup_String_val(&gc, trigger);
> -
> -       INIT_CTX();
> -       ret = libxl_send_trigger(ctx, Int_val(domid), c_trigger, Int_val(vcpuid));
> -       if (ret != 0)
> -               failwith_xl("send_trigger", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_send_sysrq(value domid, value sysrq)
> -{
> -       CAMLparam2(domid, sysrq);
> -       int ret;
> -       INIT_STRUCT();
> -
> -       INIT_CTX();
> -       ret = libxl_send_sysrq(ctx, Int_val(domid), Int_val(sysrq));
> -       if (ret != 0)
> -               failwith_xl("send_sysrq", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_xl_send_debug_keys(value keys)
> -{
> -       CAMLparam1(keys);
> -       int ret;
> -       char *c_keys;
> -       INIT_STRUCT();
> -
> -       c_keys = dup_String_val(&gc, keys);
> -
> -       INIT_CTX();
> -       ret = libxl_send_debug_keys(ctx, c_keys);
> -       if (ret != 0)
> -               failwith_xl("send_debug_keys", &lg);
> -       FREE_CTX();
> -       CAMLreturn(Val_unit);
> -}
> -
> -/*
> - * Local variables:
> - *  indent-tabs-mode: t
> - *  c-basic-offset: 8
> - *  tab-width: 8
> - * End:
> - */
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/META.in
> --- a/tools/ocaml/libs/xs/META.in
> +++ b/tools/ocaml/libs/xs/META.in
> @@ -1,5 +1,5 @@
>  version = "@VERSION@"
>  description = "XenStore Interface"
> -requires = "unix,xb"
> -archive(byte) = "xs.cma"
> -archive(native) = "xs.cmxa"
> +requires = "unix,xenbus"
> +archive(byte) = "xenstore.cma"
> +archive(native) = "xenstore.cmxa"
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/Makefile
> --- a/tools/ocaml/libs/xs/Makefile
> +++ b/tools/ocaml/libs/xs/Makefile
> @@ -3,6 +3,7 @@
>  include $(TOPLEVEL)/common.make
> 
>  OCAMLINCLUDE += -I ../xb/
> +OCAMLOPTFLAGS += -for-pack Xenstore
> 
>  .NOTPARALLEL:
>  # Ocaml is such a PITA!
> @@ -12,7 +13,7 @@
>  PRELIBS = $(foreach obj, $(PREOBJS),$(obj).cmo) $(foreach obj,$(PREOJBS),$(obj).cmx)
>  OBJS = queueop xsraw xst xs
>  INTF = xsraw.cmi xst.cmi xs.cmi
> -LIBS = xs.cma xs.cmxa
> +LIBS = xenstore.cma xenstore.cmxa
> 
>  all: $(PREINTF) $(PRELIBS) $(INTF) $(LIBS) $(PROGRAMS)
> 
> @@ -20,18 +21,27 @@
> 
>  libs: $(LIBS)
> 
> -xs_OBJS = $(OBJS)
> -OCAML_NOC_LIBRARY = xs
> +xenstore_OBJS = xenstore
> +OCAML_NOC_LIBRARY = xenstore
> +
> +xenstore.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
> +       $(E) " CMX      $@"
> +       $(Q)$(OCAMLOPT) -pack -o $@ $^
> +
> +xenstore.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
> +       $(E) " CMO      $@"
> +       $(Q)$(OCAMLC) -pack -o $@ $^
> +
> 
>  .PHONY: install
>  install: $(LIBS) META
>         mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xs
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xs META $(INTF) xs.mli xst.mli xsraw.mli $(LIBS) *.a *.cmx
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenstore
> +       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore xenstore META $(LIBS) xenstore.cmo xenstore.cmi xenstore.cmx *.a
> 
>  .PHONY: uninstall
>  uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) xs
> +       ocamlfind remove -destdir $(OCAMLDESTDIR) xenstore
> 
>  include $(TOPLEVEL)/Makefile.rules
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/queueop.ml
> --- a/tools/ocaml/libs/xs/queueop.ml
> +++ b/tools/ocaml/libs/xs/queueop.ml
> @@ -13,6 +13,7 @@
>   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>   * GNU Lesser General Public License for more details.
>   *)
> +open Xenbus
> 
>  let data_concat ls = (String.concat "\000" ls) ^ "\000"
>  let queue_path ty (tid: int) (path: string) con =
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/xs.ml
> --- a/tools/ocaml/libs/xs/xs.ml
> +++ b/tools/ocaml/libs/xs/xs.ml
> @@ -69,7 +69,7 @@
>  let read_watchevent xsh = Xsraw.read_watchevent xsh.con
> 
>  let make fd = get_operations (Xsraw.open_fd fd)
> -let get_fd xsh = Xb.get_fd xsh.con.Xsraw.xb
> +let get_fd xsh = Xenbus.Xb.get_fd xsh.con.Xsraw.xb
> 
>  exception Timeout
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/xsraw.ml
> --- a/tools/ocaml/libs/xs/xsraw.ml
> +++ b/tools/ocaml/libs/xs/xsraw.ml
> @@ -14,6 +14,8 @@
>   * GNU Lesser General Public License for more details.
>   *)
> 
> +open Xenbus
> +
>  exception Partial_not_empty
>  exception Unexpected_packet of string
> 
> @@ -27,7 +29,7 @@
>         raise (Unexpected_packet s)
> 
>  type con = {
> -       xb: Xb.t;
> +       xb: Xenbus.Xb.t;
>         watchevents: (string * string) Queue.t;
>  }
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/xsraw.mli
> --- a/tools/ocaml/libs/xs/xsraw.mli
> +++ b/tools/ocaml/libs/xs/xsraw.mli
> @@ -16,8 +16,8 @@
>  exception Partial_not_empty
>  exception Unexpected_packet of string
>  exception Invalid_path of string
> -val unexpected_packet : Xb.Op.operation -> Xb.Op.operation -> 'a
> -type con = { xb : Xb.t; watchevents : (string * string) Queue.t; }
> +val unexpected_packet : Xenbus.Xb.Op.operation -> Xenbus.Xb.Op.operation -> 'a
> +type con = { xb : Xenbus.Xb.t; watchevents : (string * string) Queue.t; }
>  val close : con -> unit
>  val open_fd : Unix.file_descr -> con
>  val split_string : ?limit:int -> char -> string -> string list
> @@ -26,14 +26,14 @@
>  val string_of_perms : int * perm * (int * perm) list -> string
>  val perms_of_string : string -> int * perm * (int * perm) list
>  val pkt_send : con -> unit
> -val pkt_recv : con -> Xb.Packet.t
> -val pkt_recv_timeout : con -> float -> bool * Xb.Packet.t option
> +val pkt_recv : con -> Xenbus.Xb.Packet.t
> +val pkt_recv_timeout : con -> float -> bool * Xenbus.Xb.Packet.t option
>  val queue_watchevent : con -> string -> unit
>  val has_watchevents : con -> bool
>  val get_watchevent : con -> string * string
>  val read_watchevent : con -> string * string
> -val sync_recv : Xb.Op.operation -> con -> string
> -val sync : (Xb.t -> 'a) -> con -> string
> +val sync_recv : Xenbus.Xb.Op.operation -> con -> string
> +val sync : (Xenbus.Xb.t -> 'a) -> con -> string
>  val ack : string -> unit
>  val validate_path : string -> unit
>  val validate_watch_path : string -> unit
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/Makefile
> --- a/tools/ocaml/xenstored/Makefile
> +++ b/tools/ocaml/xenstored/Makefile
> @@ -35,11 +35,11 @@
>  XENSTOREDLIBS = \
>         unix.cmxa \
>         $(OCAML_TOPLEVEL)/libs/uuid/uuid.cmxa \
> -       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap $(OCAML_TOPLEVEL)/libs/mmap/mmap.cmxa \
> +       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap $(OCAML_TOPLEVEL)/libs/mmap/xenmmap.cmxa \
>         -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/log $(OCAML_TOPLEVEL)/libs/log/log.cmxa \
> -       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/eventchn/eventchn.cmxa \
> -       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc $(OCAML_TOPLEVEL)/libs/xc/xc.cmxa \
> -       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb $(OCAML_TOPLEVEL)/libs/xb/xb.cmxa \
> +       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/eventchn/xeneventchn.cmxa \
> +       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc $(OCAML_TOPLEVEL)/libs/xc/xenctrl.cmxa \
> +       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb $(OCAML_TOPLEVEL)/libs/xb/xenbus.cmxa \
>         -ccopt -L -ccopt $(XEN_ROOT)/tools/libxc
> 
>  PROGRAMS = oxenstored
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/connection.ml
> --- a/tools/ocaml/xenstored/connection.ml
> +++ b/tools/ocaml/xenstored/connection.ml
> @@ -27,7 +27,7 @@
>  }
> 
>  and t = {
> -       xb: Xb.t;
> +       xb: Xenbus.Xb.t;
>         dom: Domain.t option;
>         transactions: (int, Transaction.t) Hashtbl.t;
>         mutable next_tid: int;
> @@ -93,10 +93,10 @@
>         Logging.new_connection ~tid:Transaction.none ~con:(get_domstr con);
>         con
> 
> -let get_fd con = Xb.get_fd con.xb
> +let get_fd con = Xenbus.Xb.get_fd con.xb
>  let close con =
>         Logging.end_connection ~tid:Transaction.none ~con:(get_domstr con);
> -       Xb.close con.xb
> +       Xenbus.Xb.close con.xb
> 
>  let get_perm con =
>         con.perm
> @@ -108,9 +108,9 @@
>         con.perm <- Perms.Connection.set_target (get_perm con) ~perms:[Perms.READ; Perms.WRITE] target_domid
> 
>  let send_reply con tid rid ty data =
> -       Xb.queue con.xb (Xb.Packet.create tid rid ty data)
> +       Xenbus.Xb.queue con.xb (Xenbus.Xb.Packet.create tid rid ty data)
> 
> -let send_error con tid rid err = send_reply con tid rid Xb.Op.Error (err ^ "\000")
> +let send_error con tid rid err = send_reply con tid rid Xenbus.Xb.Op.Error (err ^ "\000")
>  let send_ack con tid rid ty = send_reply con tid rid ty "OK\000"
> 
>  let get_watch_path con path =
> @@ -166,7 +166,7 @@
> 
>  let fire_single_watch watch =
>         let data = Utils.join_by_null [watch.path; watch.token; ""] in
> -       send_reply watch.con Transaction.none 0 Xb.Op.Watchevent data
> +       send_reply watch.con Transaction.none 0 Xenbus.Xb.Op.Watchevent data
> 
>  let fire_watch watch path =
>         let new_path =
> @@ -179,7 +179,7 @@
>                         path
>         in
>         let data = Utils.join_by_null [ new_path; watch.token; "" ] in
> -       send_reply watch.con Transaction.none 0 Xb.Op.Watchevent data
> +       send_reply watch.con Transaction.none 0 Xenbus.Xb.Op.Watchevent data
> 
>  let find_next_tid con =
>         let ret = con.next_tid in con.next_tid <- con.next_tid + 1; ret
> @@ -203,15 +203,15 @@
>  let get_transaction con tid =
>         Hashtbl.find con.transactions tid
> 
> -let do_input con = Xb.input con.xb
> -let has_input con = Xb.has_in_packet con.xb
> -let pop_in con = Xb.get_in_packet con.xb
> -let has_more_input con = Xb.has_more_input con.xb
> +let do_input con = Xenbus.Xb.input con.xb
> +let has_input con = Xenbus.Xb.has_in_packet con.xb
> +let pop_in con = Xenbus.Xb.get_in_packet con.xb
> +let has_more_input con = Xenbus.Xb.has_more_input con.xb
> 
> -let has_output con = Xb.has_output con.xb
> -let has_new_output con = Xb.has_new_output con.xb
> -let peek_output con = Xb.peek_output con.xb
> -let do_output con = Xb.output con.xb
> +let has_output con = Xenbus.Xb.has_output con.xb
> +let has_new_output con = Xenbus.Xb.has_new_output con.xb
> +let peek_output con = Xenbus.Xb.peek_output con.xb
> +let do_output con = Xenbus.Xb.output con.xb
> 
>  let incr_ops con = con.stat_nb_ops <- con.stat_nb_ops + 1
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/connections.ml
> --- a/tools/ocaml/xenstored/connections.ml
> +++ b/tools/ocaml/xenstored/connections.ml
> @@ -26,12 +26,12 @@
>  let create () = { anonymous = []; domains = Hashtbl.create 8; watches = Trie.create () }
> 
>  let add_anonymous cons fd can_write =
> -       let xbcon = Xb.open_fd fd in
> +       let xbcon = Xenbus.Xb.open_fd fd in
>         let con = Connection.create xbcon None in
>         cons.anonymous <- con :: cons.anonymous
> 
>  let add_domain cons dom =
> -       let xbcon = Xb.open_mmap (Domain.get_interface dom) (fun () -> Domain.notify dom) in
> +       let xbcon = Xenbus.Xb.open_mmap (Domain.get_interface dom) (fun () -> Domain.notify dom) in
>         let con = Connection.create xbcon (Some dom) in
>         Hashtbl.add cons.domains (Domain.get_id dom) con
> 
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/domain.ml
> --- a/tools/ocaml/xenstored/domain.ml
> +++ b/tools/ocaml/xenstored/domain.ml
> @@ -20,10 +20,10 @@
> 
>  type t =
>  {
> -       id: Xc.domid;
> +       id: Xenctrl.domid;
>         mfn: nativeint;
>         remote_port: int;
> -       interface: Mmap.mmap_interface;
> +       interface: Xenmmap.mmap_interface;
>         eventchn: Event.t;
>         mutable port: int;
>  }
> @@ -47,7 +47,7 @@
>  let close dom =
>         debug "domain %d unbound port %d" dom.id dom.port;
>         Event.unbind dom.eventchn dom.port;
> -       Mmap.unmap dom.interface;
> +       Xenmmap.unmap dom.interface;
>         ()
> 
>  let make id mfn remote_port interface eventchn = {
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/domains.ml
> --- a/tools/ocaml/xenstored/domains.ml
> +++ b/tools/ocaml/xenstored/domains.ml
> @@ -16,7 +16,7 @@
> 
>  type domains = {
>         eventchn: Event.t;
> -       table: (Xc.domid, Domain.t) Hashtbl.t;
> +       table: (Xenctrl.domid, Domain.t) Hashtbl.t;
>  }
> 
>  let init eventchn =
> @@ -33,16 +33,16 @@
> 
>         Hashtbl.iter (fun id _ -> if id <> 0 then
>                 try
> -                       let info = Xc.domain_getinfo xc id in
> -                       if info.Xc.shutdown || info.Xc.dying then (
> +                       let info = Xenctrl.domain_getinfo xc id in
> +                       if info.Xenctrl.shutdown || info.Xenctrl.dying then (
>                                 Logs.debug "general" "Domain %u died (dying=%b, shutdown %b -- code %d)"
> -                                                   id info.Xc.dying info.Xc.shutdown info.Xc.shutdown_code;
> -                               if info.Xc.dying then
> +                                                   id info.Xenctrl.dying info.Xenctrl.shutdown info.Xenctrl.shutdown_code;
> +                               if info.Xenctrl.dying then
>                                         dead_dom := id :: !dead_dom
>                                 else
>                                         notify := true;
>                         )
> -               with Xc.Error _ ->
> +               with Xenctrl.Error _ ->
>                         Logs.debug "general" "Domain %u died -- no domain info" id;
>                         dead_dom := id :: !dead_dom;
>                 ) doms.table;
> @@ -57,7 +57,7 @@
>         ()
> 
>  let create xc doms domid mfn port =
> -       let interface = Xc.map_foreign_range xc domid (Mmap.getpagesize()) mfn in
> +       let interface = Xenctrl.map_foreign_range xc domid (Xenmmap.getpagesize()) mfn in
>         let dom = Domain.make domid mfn port interface doms.eventchn in
>         Hashtbl.add doms.table domid dom;
>         Domain.bind_interdomain dom;
> @@ -66,13 +66,13 @@
>  let create0 fake doms =
>         let port, interface =
>                 if fake then (
> -                       0, Xc.with_intf (fun xc -> Xc.map_foreign_range xc 0 (Mmap.getpagesize()) 0n)
> +                       0, Xenctrl.with_intf (fun xc -> Xenctrl.map_foreign_range xc 0 (Xenmmap.getpagesize()) 0n)
>                 ) else (
>                         let port = Utils.read_file_single_integer Define.xenstored_proc_port
>                         and fd = Unix.openfile Define.xenstored_proc_kva
>                                                [ Unix.O_RDWR ] 0o600 in
> -                       let interface = Mmap.mmap fd Mmap.RDWR Mmap.SHARED
> -                                                 (Mmap.getpagesize()) 0 in
> +                       let interface = Xenmmap.mmap fd Xenmmap.RDWR Xenmmap.SHARED
> +                                                 (Xenmmap.getpagesize()) 0 in
>                         Unix.close fd;
>                         port, interface
>                 )
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/event.ml
> --- a/tools/ocaml/xenstored/event.ml
> +++ b/tools/ocaml/xenstored/event.ml
> @@ -16,15 +16,15 @@
> 
>  (**************** high level binding ****************)
>  type t = {
> -       handle: Eventchn.handle;
> +       handle: Xeneventchn.handle;
>         mutable virq_port: int;
>  }
> 
> -let init () = { handle = Eventchn.init (); virq_port = -1; }
> -let fd eventchn = Eventchn.fd eventchn.handle
> -let bind_dom_exc_virq eventchn = eventchn.virq_port <- Eventchn.bind_dom_exc_virq eventchn.handle
> -let bind_interdomain eventchn domid port = Eventchn.bind_interdomain eventchn.handle domid port
> -let unbind eventchn port = Eventchn.unbind eventchn.handle port
> -let notify eventchn port = Eventchn.notify eventchn.handle port
> -let pending eventchn = Eventchn.pending eventchn.handle
> -let unmask eventchn port = Eventchn.unmask eventchn.handle port
> +let init () = { handle = Xeneventchn.init (); virq_port = -1; }
> +let fd eventchn = Xeneventchn.fd eventchn.handle
> +let bind_dom_exc_virq eventchn = eventchn.virq_port <- Xeneventchn.bind_dom_exc_virq eventchn.handle
> +let bind_interdomain eventchn domid port = Xeneventchn.bind_interdomain eventchn.handle domid port
> +let unbind eventchn port = Xeneventchn.unbind eventchn.handle port
> +let notify eventchn port = Xeneventchn.notify eventchn.handle port
> +let pending eventchn = Xeneventchn.pending eventchn.handle
> +let unmask eventchn port = Xeneventchn.unmask eventchn.handle port
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/logging.ml
> --- a/tools/ocaml/xenstored/logging.ml
> +++ b/tools/ocaml/xenstored/logging.ml
> @@ -39,7 +39,7 @@
>         | Commit
>         | Newconn
>         | Endconn
> -       | XbOp of Xb.Op.operation
> +       | XbOp of Xenbus.Xb.Op.operation
> 
>  type access =
>         {
> @@ -82,35 +82,35 @@
>         | Endconn                 -> "endconn  "
> 
>         | XbOp op -> match op with
> -       | Xb.Op.Debug             -> "debug    "
> +       | Xenbus.Xb.Op.Debug             -> "debug    "
> 
> -       | Xb.Op.Directory         -> "directory"
> -       | Xb.Op.Read              -> "read     "
> -       | Xb.Op.Getperms          -> "getperms "
> +       | Xenbus.Xb.Op.Directory         -> "directory"
> +       | Xenbus.Xb.Op.Read              -> "read     "
> +       | Xenbus.Xb.Op.Getperms          -> "getperms "
> 
> -       | Xb.Op.Watch             -> "watch    "
> -       | Xb.Op.Unwatch           -> "unwatch  "
> +       | Xenbus.Xb.Op.Watch             -> "watch    "
> +       | Xenbus.Xb.Op.Unwatch           -> "unwatch  "
> 
> -       | Xb.Op.Transaction_start -> "t start  "
> -       | Xb.Op.Transaction_end   -> "t end    "
> +       | Xenbus.Xb.Op.Transaction_start -> "t start  "
> +       | Xenbus.Xb.Op.Transaction_end   -> "t end    "
> 
> -       | Xb.Op.Introduce         -> "introduce"
> -       | Xb.Op.Release           -> "release  "
> -       | Xb.Op.Getdomainpath     -> "getdomain"
> -       | Xb.Op.Isintroduced      -> "is introduced"
> -       | Xb.Op.Resume            -> "resume   "
> +       | Xenbus.Xb.Op.Introduce         -> "introduce"
> +       | Xenbus.Xb.Op.Release           -> "release  "
> +       | Xenbus.Xb.Op.Getdomainpath     -> "getdomain"
> +       | Xenbus.Xb.Op.Isintroduced      -> "is introduced"
> +       | Xenbus.Xb.Op.Resume            -> "resume   "
> 
> -       | Xb.Op.Write             -> "write    "
> -       | Xb.Op.Mkdir             -> "mkdir    "
> -       | Xb.Op.Rm                -> "rm       "
> -       | Xb.Op.Setperms          -> "setperms "
> -       | Xb.Op.Restrict          -> "restrict "
> -       | Xb.Op.Set_target        -> "settarget"
> +       | Xenbus.Xb.Op.Write             -> "write    "
> +       | Xenbus.Xb.Op.Mkdir             -> "mkdir    "
> +       | Xenbus.Xb.Op.Rm                -> "rm       "
> +       | Xenbus.Xb.Op.Setperms          -> "setperms "
> +       | Xenbus.Xb.Op.Restrict          -> "restrict "
> +       | Xenbus.Xb.Op.Set_target        -> "settarget"
> 
> -       | Xb.Op.Error             -> "error    "
> -       | Xb.Op.Watchevent        -> "w event  "
> +       | Xenbus.Xb.Op.Error             -> "error    "
> +       | Xenbus.Xb.Op.Watchevent        -> "w event  "
> 
> -       | x                       -> Xb.Op.to_string x
> +       | x                       -> Xenbus.Xb.Op.to_string x
> 
>  let file_exists file =
>         try
> @@ -210,10 +210,10 @@
>  let xb_op ~tid ~con ~ty data =
>         let print =
>         match ty with
> -               | Xb.Op.Read | Xb.Op.Directory | Xb.Op.Getperms -> !log_read_ops
> -               | Xb.Op.Transaction_start | Xb.Op.Transaction_end ->
> +               | Xenbus.Xb.Op.Read | Xenbus.Xb.Op.Directory | Xenbus.Xb.Op.Getperms -> !log_read_ops
> +               | Xenbus.Xb.Op.Transaction_start | Xenbus.Xb.Op.Transaction_end ->
>                         false (* transactions are managed below *)
> -               | Xb.Op.Introduce | Xb.Op.Release | Xb.Op.Getdomainpath | Xb.Op.Isintroduced | Xb.Op.Resume ->
> +               | Xenbus.Xb.Op.Introduce | Xenbus.Xb.Op.Release | Xenbus.Xb.Op.Getdomainpath | Xenbus.Xb.Op.Isintroduced | Xenbus.Xb.Op.Resume ->
>                         !log_special_ops
>                 | _ -> true
>         in
> @@ -222,17 +222,17 @@
> 
>  let start_transaction ~tid ~con =
>         if !log_transaction_ops && tid <> 0
> -       then write_access_log ~tid ~con (XbOp Xb.Op.Transaction_start)
> +       then write_access_log ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_start)
> 
>  let end_transaction ~tid ~con =
>         if !log_transaction_ops && tid <> 0
> -       then write_access_log ~tid ~con (XbOp Xb.Op.Transaction_end)
> +       then write_access_log ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_end)
> 
>  let xb_answer ~tid ~con ~ty data =
>         let print = match ty with
> -               | Xb.Op.Error when data="ENOENT " -> !log_read_ops
> -               | Xb.Op.Error -> !log_special_ops
> -               | Xb.Op.Watchevent -> true
> +               | Xenbus.Xb.Op.Error when data="ENOENT " -> !log_read_ops
> +               | Xenbus.Xb.Op.Error -> !log_special_ops
> +               | Xenbus.Xb.Op.Watchevent -> true
>                 | _ -> false
>         in
>                 if print
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/perms.ml
> --- a/tools/ocaml/xenstored/perms.ml
> +++ b/tools/ocaml/xenstored/perms.ml
> @@ -43,9 +43,9 @@
> 
>  type t =
>  {
> -       owner: Xc.domid;
> +       owner: Xenctrl.domid;
>         other: permty;
> -       acl: (Xc.domid * permty) list;
> +       acl: (Xenctrl.domid * permty) list;
>  }
> 
>  let create owner other acl =
> @@ -88,7 +88,7 @@
>  module Connection =
>  struct
> 
> -type elt = Xc.domid * (permty list)
> +type elt = Xenctrl.domid * (permty list)
>  type t =
>         { main: elt;
>           target: elt option; }
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/process.ml
> --- a/tools/ocaml/xenstored/process.ml
> +++ b/tools/ocaml/xenstored/process.ml
> @@ -54,10 +54,10 @@
>  let process_watch ops cons =
>         let do_op_watch op cons =
>                 let recurse = match (fst op) with
> -               | Xb.Op.Write    -> false
> -               | Xb.Op.Mkdir    -> false
> -               | Xb.Op.Rm       -> true
> -               | Xb.Op.Setperms -> false
> +               | Xenbus.Xb.Op.Write    -> false
> +               | Xenbus.Xb.Op.Mkdir    -> false
> +               | Xenbus.Xb.Op.Rm       -> true
> +               | Xenbus.Xb.Op.Setperms -> false
>                 | _              -> raise (Failure "huh ?") in
>                 Connections.fire_watches cons (snd op) recurse in
>         List.iter (fun op -> do_op_watch op cons) ops
> @@ -83,7 +83,7 @@
>         then None
>         else try match split None '\000' data with
>         | "print" :: msg :: _ ->
> -               Logging.xb_op ~tid:0 ~ty:Xb.Op.Debug ~con:"=======>" msg;
> +               Logging.xb_op ~tid:0 ~ty:Xenbus.Xb.Op.Debug ~con:"=======>" msg;
>                 None
>         | "quota" :: domid :: _ ->
>                 let domid = int_of_string domid in
> @@ -120,7 +120,7 @@
>                 | _                   -> raise Invalid_Cmd_Args
>                 in
>         let watch = Connections.add_watch cons con node token in
> -       Connection.send_ack con (Transaction.get_id t) rid Xb.Op.Watch;
> +       Connection.send_ack con (Transaction.get_id t) rid Xenbus.Xb.Op.Watch;
>         Connection.fire_single_watch watch
> 
>  let do_unwatch con t domains cons data =
> @@ -165,7 +165,7 @@
>                 if Domains.exist domains domid then
>                         Domains.find domains domid
>                 else try
> -                       let ndom = Xc.with_intf (fun xc ->
> +                       let ndom = Xenctrl.with_intf (fun xc ->
>                                 Domains.create xc domains domid mfn port) in
>                         Connections.add_domain cons ndom;
>                         Connections.fire_spec_watches cons "@introduceDomain";
> @@ -299,25 +299,25 @@
> 
>  let function_of_type ty =
>         match ty with
> -       | Xb.Op.Debug             -> reply_data_or_ack do_debug
> -       | Xb.Op.Directory         -> reply_data do_directory
> -       | Xb.Op.Read              -> reply_data do_read
> -       | Xb.Op.Getperms          -> reply_data do_getperms
> -       | Xb.Op.Watch             -> reply_none do_watch
> -       | Xb.Op.Unwatch           -> reply_ack do_unwatch
> -       | Xb.Op.Transaction_start -> reply_data do_transaction_start
> -       | Xb.Op.Transaction_end   -> reply_ack do_transaction_end
> -       | Xb.Op.Introduce         -> reply_ack do_introduce
> -       | Xb.Op.Release           -> reply_ack do_release
> -       | Xb.Op.Getdomainpath     -> reply_data do_getdomainpath
> -       | Xb.Op.Write             -> reply_ack do_write
> -       | Xb.Op.Mkdir             -> reply_ack do_mkdir
> -       | Xb.Op.Rm                -> reply_ack do_rm
> -       | Xb.Op.Setperms          -> reply_ack do_setperms
> -       | Xb.Op.Isintroduced      -> reply_data do_isintroduced
> -       | Xb.Op.Resume            -> reply_ack do_resume
> -       | Xb.Op.Set_target        -> reply_ack do_set_target
> -       | Xb.Op.Restrict          -> reply_ack do_restrict
> +       | Xenbus.Xb.Op.Debug             -> reply_data_or_ack do_debug
> +       | Xenbus.Xb.Op.Directory         -> reply_data do_directory
> +       | Xenbus.Xb.Op.Read              -> reply_data do_read
> +       | Xenbus.Xb.Op.Getperms          -> reply_data do_getperms
> +       | Xenbus.Xb.Op.Watch             -> reply_none do_watch
> +       | Xenbus.Xb.Op.Unwatch           -> reply_ack do_unwatch
> +       | Xenbus.Xb.Op.Transaction_start -> reply_data do_transaction_start
> +       | Xenbus.Xb.Op.Transaction_end   -> reply_ack do_transaction_end
> +       | Xenbus.Xb.Op.Introduce         -> reply_ack do_introduce
> +       | Xenbus.Xb.Op.Release           -> reply_ack do_release
> +       | Xenbus.Xb.Op.Getdomainpath     -> reply_data do_getdomainpath
> +       | Xenbus.Xb.Op.Write             -> reply_ack do_write
> +       | Xenbus.Xb.Op.Mkdir             -> reply_ack do_mkdir
> +       | Xenbus.Xb.Op.Rm                -> reply_ack do_rm
> +       | Xenbus.Xb.Op.Setperms          -> reply_ack do_setperms
> +       | Xenbus.Xb.Op.Isintroduced      -> reply_data do_isintroduced
> +       | Xenbus.Xb.Op.Resume            -> reply_ack do_resume
> +       | Xenbus.Xb.Op.Set_target        -> reply_ack do_set_target
> +       | Xenbus.Xb.Op.Restrict          -> reply_ack do_restrict
>         | _                       -> reply_ack do_error
> 
>  let input_handle_error ~cons ~doms ~fct ~ty ~con ~t ~rid ~data =
> @@ -370,11 +370,11 @@
>  let do_input store cons doms con =
>         if Connection.do_input con then (
>                 let packet = Connection.pop_in con in
> -               let tid, rid, ty, data = Xb.Packet.unpack packet in
> +               let tid, rid, ty, data = Xenbus.Xb.Packet.unpack packet in
>                 (* As we don't log IO, do not call an unnecessary sanitize_data
>                    Logs.info "io" "[%s] -> [%d] %s \"%s\""
>                          (Connection.get_domstr con) tid
> -                        (Xb.Op.to_string ty) (sanitize_data data); *)
> +                        (Xenbus.Xb.Op.to_string ty) (sanitize_data data); *)
>                 process_packet ~store ~cons ~doms ~con ~tid ~rid ~ty ~data;
>                 write_access_log ~ty ~tid ~con ~data;
>                 Connection.incr_ops con;
> @@ -384,11 +384,11 @@
>         if Connection.has_output con then (
>                 if Connection.has_new_output con then (
>                         let packet = Connection.peek_output con in
> -                       let tid, rid, ty, data = Xb.Packet.unpack packet in
> +                       let tid, rid, ty, data = Xenbus.Xb.Packet.unpack packet in
>                         (* As we don't log IO, do not call an unnecessary sanitize_data
>                            Logs.info "io" "[%s] <- %s \"%s\""
>                                  (Connection.get_domstr con)
> -                                (Xb.Op.to_string ty) (sanitize_data data);*)
> +                                (Xenbus.Xb.Op.to_string ty) (sanitize_data data);*)
>                         write_answer_log ~ty ~tid ~con ~data;
>                 );
>                 ignore (Connection.do_output con)
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/quota.ml
> --- a/tools/ocaml/xenstored/quota.ml
> +++ b/tools/ocaml/xenstored/quota.ml
> @@ -26,7 +26,7 @@
>  type t = {
>         maxent: int;               (* max entities per domU *)
>         maxsize: int;              (* max size of data store in one node *)
> -       cur: (Xc.domid, int) Hashtbl.t; (* current domains quota *)
> +       cur: (Xenctrl.domid, int) Hashtbl.t; (* current domains quota *)
>  }
> 
>  let to_string quota domid =
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/transaction.ml
> --- a/tools/ocaml/xenstored/transaction.ml
> +++ b/tools/ocaml/xenstored/transaction.ml
> @@ -74,7 +74,7 @@
>  type t = {
>         ty: ty;
>         store: Store.t;
> -       mutable ops: (Xb.Op.operation * Store.Path.t) list;
> +       mutable ops: (Xenbus.Xb.Op.operation * Store.Path.t) list;
>         mutable read_lowpath: Store.Path.t option;
>         mutable write_lowpath: Store.Path.t option;
>  }
> @@ -105,23 +105,23 @@
>         if path_exists
>         then set_write_lowpath t path
>         else set_write_lowpath t (Store.Path.get_parent path);
> -       add_wop t Xb.Op.Write path
> +       add_wop t Xenbus.Xb.Op.Write path
> 
>  let mkdir ?(with_watch=true) t perm path =
>         Store.mkdir t.store perm path;
>         set_write_lowpath t path;
>         if with_watch then
> -               add_wop t Xb.Op.Mkdir path
> +               add_wop t Xenbus.Xb.Op.Mkdir path
> 
>  let setperms t perm path perms =
>         Store.setperms t.store perm path perms;
>         set_write_lowpath t path;
> -       add_wop t Xb.Op.Setperms path
> +       add_wop t Xenbus.Xb.Op.Setperms path
> 
>  let rm t perm path =
>         Store.rm t.store perm path;
>         set_write_lowpath t (Store.Path.get_parent path);
> -       add_wop t Xb.Op.Rm path
> +       add_wop t Xenbus.Xb.Op.Rm path
> 
>  let ls t perm path =
>         let r = Store.ls t.store perm path in
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/xenstored/xenstored.ml
> --- a/tools/ocaml/xenstored/xenstored.ml
> +++ b/tools/ocaml/xenstored/xenstored.ml
> @@ -35,7 +35,7 @@
>                         if err <> Unix.ECONNRESET then
>                         error "closing socket connection: read error: %s"
>                               (Unix.error_message err)
> -               | Xb.End_of_file ->
> +               | Xenbus.Xb.End_of_file ->
>                         Connections.del_anonymous cons c;
>                         debug "closing socket connection"
>                 in
> @@ -170,7 +170,7 @@
>  let from_channel store cons doms chan =
>         (* don't let the permission get on our way, full perm ! *)
>         let op = Store.get_ops store Perms.Connection.full_rights in
> -       let xc = Xc.interface_open () in
> +       let xc = Xenctrl.interface_open () in
> 
>         let domain_f domid mfn port =
>                 let ndom =
> @@ -190,7 +190,7 @@
>                 op.Store.setperms path perms
>                 in
>         finally (fun () -> from_channel_f chan domain_f watch_f store_f)
> -               (fun () -> Xc.interface_close xc)
> +               (fun () -> Xenctrl.interface_close xc)
> 
>  let from_file store cons doms file =
>         let channel = open_in file in
> @@ -282,7 +282,7 @@
>                         Store.mkdir store (Perms.Connection.create 0) localpath;
> 
>                 if cf.domain_init then (
> -                       let usingxiu = Xc.is_fake () in
> +                       let usingxiu = Xenctrl.is_fake () in
>                         Connections.add_domain cons (Domains.create0 usingxiu domains);
>                         Event.bind_dom_exc_virq eventchn
>                 );
> @@ -301,7 +301,7 @@
>                 (if cf.domain_init then [ Event.fd eventchn ] else [])
>                 in
> 
> -       let xc = Xc.interface_open () in
> +       let xc = Xenctrl.interface_open () in
> 
>         let process_special_fds rset =
>                 let accept_connection can_write fd =
> 
> _______________________________________________
> 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 Oct 07 04:06:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 04:06:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC8GU-00048A-57; Fri, 07 Oct 2011 04:06:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC87T-0003JV-U6
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:57:36 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317985036!52954788!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9359 invoked from network); 7 Oct 2011 10:57:16 -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 Oct 2011 10:57:16 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8270381"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 10:57: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; Fri, 7 Oct 2011
	11:57:32 +0100
Subject: Re: [Xen-devel] [PATCH 2 of 6] [OCAML] Add a missing dependency to
	the xenctrl ocaml package
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Date: Fri, 7 Oct 2011 11:57:32 +0100
In-Reply-To: <d95acffb817973bc2c17.1317983160@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
	<d95acffb817973bc2c17.1317983160@snoosnoo2.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: <1317985052.21903.319.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-10-07 at 11:26 +0100, Jon Ludlam wrote:
> Signed-off-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> diff -r ffbc5e9929d5 -r d95acffb8179 tools/ocaml/libs/xc/META.in
> --- a/tools/ocaml/libs/xc/META.in
> +++ b/tools/ocaml/libs/xc/META.in
> @@ -1,5 +1,5 @@
>  version = "@VERSION@"
>  description = "Xen Control Interface"
> -requires = "xenmmap,uuid"
> +requires = "unix,xenmmap,uuid"
>  archive(byte) = "xenctrl.cma"
>  archive(native) = "xenctrl.cmxa"
> 
> _______________________________________________
> 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 Oct 07 04:09:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 04:09:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC8J6-0004ae-CZ; Fri, 07 Oct 2011 04:09:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC88A-0003OG-0J
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:58:18 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1317985094!107714!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19037 invoked from network); 7 Oct 2011 10:58:15 -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;
	7 Oct 2011 10:58:15 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8270402"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 10:58:14 +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, 7 Oct 2011
	11:58:14 +0100
Subject: Re: [Xen-devel] [PATCH 3 of 6] [OCAML] Remove the uuid library
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Date: Fri, 7 Oct 2011 11:58:14 +0100
In-Reply-To: <f325cb3f37bdba04a8b4.1317983161@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
	<f325cb3f37bdba04a8b4.1317983161@snoosnoo2.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: <1317985094.21903.320.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-10-07 at 11:26 +0100, Jon Ludlam wrote:
> The library was only minimally used, and was really rather redundant.
> 
> Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
> Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/Makefile
> --- a/tools/ocaml/libs/Makefile
> +++ b/tools/ocaml/libs/Makefile
> @@ -2,7 +2,7 @@
>  include $(XEN_ROOT)/tools/Rules.mk
> 
>  SUBDIRS= \
> -       uuid mmap \
> +       mmap \
>         log xc eventchn \
>         xb xs xl
> 
> diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/uuid/META.in
> --- a/tools/ocaml/libs/uuid/META.in
> +++ /dev/null
> @@ -1,4 +0,0 @@
> -version = "@VERSION@"
> -description = "Uuid - universal identifer"
> -archive(byte) = "uuid.cma"
> -archive(native) = "uuid.cmxa"
> diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/uuid/Makefile
> --- a/tools/ocaml/libs/uuid/Makefile
> +++ /dev/null
> @@ -1,29 +0,0 @@
> -TOPLEVEL=$(CURDIR)/../..
> -XEN_ROOT=$(TOPLEVEL)/../..
> -include $(TOPLEVEL)/common.make
> -
> -OBJS = uuid
> -INTF = $(foreach obj, $(OBJS),$(obj).cmi)
> -LIBS = uuid.cma uuid.cmxa
> -
> -all: $(INTF) $(LIBS) $(PROGRAMS)
> -
> -bins: $(PROGRAMS)
> -
> -libs: $(LIBS)
> -
> -uuid_OBJS = $(OBJS)
> -OCAML_NOC_LIBRARY = uuid
> -
> -.PHONY: install
> -install: $(LIBS) META
> -       mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) uuid
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore uuid META $(INTF) $(LIBS) *.a *.cmx
> -
> -.PHONY: uninstall
> -uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) uuid
> -
> -include $(TOPLEVEL)/Makefile.rules
> -
> diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/uuid/uuid.ml
> --- a/tools/ocaml/libs/uuid/uuid.ml
> +++ /dev/null
> @@ -1,100 +0,0 @@
> -(*
> - * Copyright (C) 2006-2010 Citrix Systems Inc.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -(* Internally, a UUID is simply a string. *)
> -type 'a t = string
> -
> -type cookie = string
> -
> -let of_string s = s
> -let to_string s = s
> -
> -let null = ""
> -
> -(* deprecated: we don't need to duplicate the uuid prefix/suffix *)
> -let uuid_of_string = of_string
> -let string_of_uuid = to_string
> -
> -let string_of_cookie s = s
> -
> -let cookie_of_string s = s
> -
> -let dev_random = "/dev/random"
> -let dev_urandom = "/dev/urandom"
> -
> -let rnd_array n =
> -       let fstbyte i = 0xff land i in
> -       let sndbyte i = fstbyte (i lsr 8) in
> -       let thdbyte i = sndbyte (i lsr 8) in
> -       let rec rnd_list n acc = match n with
> -               | 0 -> acc
> -               | 1 ->
> -                       let b = fstbyte (Random.bits ()) in
> -                       b :: acc
> -               | 2 ->
> -                       let r = Random.bits () in
> -                       let b1 = fstbyte r in
> -                       let b2 = sndbyte r in
> -                       b1 :: b2 :: acc
> -               | n ->
> -                       let r = Random.bits () in
> -                       let b1 = fstbyte r in
> -                       let b2 = sndbyte r in
> -                       let b3 = thdbyte r in
> -                       rnd_list (n - 3) (b1 :: b2 :: b3 :: acc)
> -       in
> -       Array.of_list (rnd_list n [])
> -
> -let read_array dev n =
> -  let ic = open_in_bin dev in
> -  try
> -    let result = Array.init n (fun _ -> input_byte ic) in
> -    close_in ic;
> -    result
> -  with e ->
> -    close_in ic;
> -    raise e
> -
> -let uuid_of_int_array uuid =
> -  Printf.sprintf "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
> -    uuid.(0) uuid.(1) uuid.(2) uuid.(3) uuid.(4) uuid.(5)
> -    uuid.(6) uuid.(7) uuid.(8) uuid.(9) uuid.(10) uuid.(11)
> -    uuid.(12) uuid.(13) uuid.(14) uuid.(15)
> -
> -let make_uuid_prng () = uuid_of_int_array (rnd_array 16)
> -let make_uuid_urnd () = uuid_of_int_array (read_array dev_urandom 16)
> -let make_uuid_rnd () = uuid_of_int_array (read_array dev_random 16)
> -let make_uuid = make_uuid_urnd
> -
> -let make_cookie() =
> -  let bytes = Array.to_list (read_array dev_urandom 64) in
> -  String.concat "" (List.map (Printf.sprintf "%1x") bytes)
> -
> -let int_array_of_uuid s =
> -  try
> -    let l = ref [] in
> -    Scanf.sscanf s "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
> -      (fun a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 ->
> -      l := [ a0; a1; a2; a3; a4; a5; a6; a7; a8; a9;
> -             a10; a11; a12; a13; a14; a15; ]);
> -    Array.of_list !l
> -  with _ -> invalid_arg "Uuid.int_array_of_uuid"
> -
> -let is_uuid str =
> -       try
> -               Scanf.sscanf str
> -                       "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
> -                       (fun _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ -> true)
> -       with _ -> false
> diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/uuid/uuid.mli
> --- a/tools/ocaml/libs/uuid/uuid.mli
> +++ /dev/null
> @@ -1,67 +0,0 @@
> -(*
> - * Copyright (C) 2006-2010 Citrix Systems Inc.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -(** Type-safe UUIDs.
> -    Probably need to refactor this; UUIDs are used in two places:
> -    + to uniquely name things across the cluster
> -    + as secure session IDs
> -
> -    There is the additional constraint that current Xen tools use
> -    a particular format of UUID (the 16 byte variety generated by fresh ())
> -
> -       Also, cookies aren't UUIDs and should be put somewhere else.
> -*)
> -
> -(** A 128-bit UUID.  Using phantom types ('a) to achieve the requires type-safety. *)
> -type 'a t
> -
> -(** Create a fresh UUID *)
> -val make_uuid : unit -> 'a t
> -val make_uuid_prng : unit -> 'a t
> -val make_uuid_urnd : unit -> 'a t
> -val make_uuid_rnd : unit -> 'a t
> -
> -(** Create a UUID from a string. *)
> -val of_string : string -> 'a t
> -
> -(** Marshal a UUID to a string. *)
> -val to_string : 'a t -> string
> -
> -(** A null UUID, as if such a thing actually existed.  It turns out to be
> - * useful though. *)
> -val null : 'a t
> -
> -(** Deprecated alias for {! Uuid.of_string} *)
> -val uuid_of_string : string -> 'a t
> -
> -(** Deprecated alias for {! Uuid.to_string} *)
> -val string_of_uuid : 'a t -> string
> -
> -(** Convert an array to a UUID. *)
> -val uuid_of_int_array : int array -> 'a t
> -
> -(** Convert a UUID to an array. *)
> -val int_array_of_uuid : 'a t -> int array
> -
> -(** Check whether a string is a UUID. *)
> -val is_uuid : string -> bool
> -
> -(** A 512-bit cookie. *)
> -type cookie
> -
> -val make_cookie : unit -> cookie
> -
> -val cookie_of_string : string -> cookie
> -
> -val string_of_cookie : cookie -> string
> diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/xc/META.in
> --- a/tools/ocaml/libs/xc/META.in
> +++ b/tools/ocaml/libs/xc/META.in
> @@ -1,5 +1,5 @@
>  version = "@VERSION@"
>  description = "Xen Control Interface"
> -requires = "unix,xenmmap,uuid"
> +requires = "unix,xenmmap"
>  archive(byte) = "xenctrl.cma"
>  archive(native) = "xenctrl.cmxa"
> diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/xc/Makefile
> --- a/tools/ocaml/libs/xc/Makefile
> +++ b/tools/ocaml/libs/xc/Makefile
> @@ -3,7 +3,7 @@
>  include $(TOPLEVEL)/common.make
> 
>  CFLAGS += -I../mmap $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest)
> -OCAMLINCLUDE += -I ../mmap -I ../uuid
> +OCAMLINCLUDE += -I ../mmap
> 
>  OBJS = xenctrl
>  INTF = xenctrl.cmi
> diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/xc/xenctrl.ml
> --- a/tools/ocaml/libs/xc/xenctrl.ml
> +++ b/tools/ocaml/libs/xc/xenctrl.ml
> @@ -118,14 +118,23 @@
>  external _domain_create: handle -> int32 -> domain_create_flag list -> int array -> domid
>         = "stub_xc_domain_create"
> 
> +let int_array_of_uuid_string s =
> +       try
> +               Scanf.sscanf s
> +                       "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
> +                       (fun a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 ->
> +                               [| a0; a1; a2; a3; a4; a5; a6; a7;
> +                                  a8; a9; a10; a11; a12; a13; a14; a15 |])
> +       with _ -> invalid_arg ("Xc.int_array_of_uuid_string: " ^ s)
> +
>  let domain_create handle n flags uuid =
> -       _domain_create handle n flags (Uuid.int_array_of_uuid uuid)
> +       _domain_create handle n flags (int_array_of_uuid_string uuid)
> 
>  external _domain_sethandle: handle -> domid -> int array -> unit
>                            = "stub_xc_domain_sethandle"
> 
>  let domain_sethandle handle n uuid =
> -       _domain_sethandle handle n (Uuid.int_array_of_uuid uuid)
> +       _domain_sethandle handle n (int_array_of_uuid_string uuid)
> 
>  external domain_max_vcpus: handle -> domid -> int -> unit
>         = "stub_xc_domain_max_vcpus"
> diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/libs/xc/xenctrl.mli
> --- a/tools/ocaml/libs/xc/xenctrl.mli
> +++ b/tools/ocaml/libs/xc/xenctrl.mli
> @@ -74,12 +74,8 @@
>  external is_fake : unit -> bool = "stub_xc_interface_is_fake"
>  external interface_close : handle -> unit = "stub_xc_interface_close"
>  val with_intf : (handle -> 'a) -> 'a
> -external _domain_create : handle -> int32 -> domain_create_flag list -> int array -> domid
> -  = "stub_xc_domain_create"
> -val domain_create : handle -> int32 -> domain_create_flag list -> 'a Uuid.t -> domid
> -external _domain_sethandle : handle -> domid -> int array -> unit
> -  = "stub_xc_domain_sethandle"
> -val domain_sethandle : handle -> domid -> 'a Uuid.t -> unit
> +val domain_create : handle -> int32 -> domain_create_flag list -> string -> domid
> +val domain_sethandle : handle -> domid -> string -> unit
>  external domain_max_vcpus : handle -> domid -> int -> unit
>    = "stub_xc_domain_max_vcpus"
>  external domain_pause : handle -> domid -> unit = "stub_xc_domain_pause"
> diff -r d95acffb8179 -r f325cb3f37bd tools/ocaml/xenstored/Makefile
> --- a/tools/ocaml/xenstored/Makefile
> +++ b/tools/ocaml/xenstored/Makefile
> @@ -5,7 +5,6 @@
>  OCAMLINCLUDE += \
>         -I $(OCAML_TOPLEVEL)/libs/log \
>         -I $(OCAML_TOPLEVEL)/libs/xb \
> -       -I $(OCAML_TOPLEVEL)/libs/uuid \
>         -I $(OCAML_TOPLEVEL)/libs/mmap \
>         -I $(OCAML_TOPLEVEL)/libs/xc \
>         -I $(OCAML_TOPLEVEL)/libs/eventchn
> @@ -34,7 +33,6 @@
>  INTF = symbol.cmi trie.cmi
>  XENSTOREDLIBS = \
>         unix.cmxa \
> -       $(OCAML_TOPLEVEL)/libs/uuid/uuid.cmxa \
>         -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap $(OCAML_TOPLEVEL)/libs/mmap/xenmmap.cmxa \
>         -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/log $(OCAML_TOPLEVEL)/libs/log/log.cmxa \
>         -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/eventchn/xeneventchn.cmxa \
> 
> _______________________________________________
> 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 Oct 07 04:11:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 04:11:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC8L2-0004yH-3r; Fri, 07 Oct 2011 04:11:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC88P-0003PG-Pv
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:58:35 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1317985110!107087!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27120 invoked from network); 7 Oct 2011 10:58:30 -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 Oct 2011 10:58:30 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8270409"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 10:58: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; Fri, 7 Oct 2011
	11:58:30 +0100
Subject: Re: [Xen-devel] [PATCH 4 of 6] [OCAML] Remove log library from
	tools/ocaml/libs
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Date: Fri, 7 Oct 2011 11:58:29 +0100
In-Reply-To: <da67f075e413bd496f98.1317983162@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
	<da67f075e413bd496f98.1317983162@snoosnoo2.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: <1317985109.21903.321.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-10-07 at 11:26 +0100, Jon Ludlam wrote:
> The only user was oxenstored, which has had the relevant bits
> merged in.
> 
> Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
> Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/Makefile
> --- a/tools/ocaml/libs/Makefile
> +++ b/tools/ocaml/libs/Makefile
> @@ -3,7 +3,7 @@
> 
>  SUBDIRS= \
>         mmap \
> -       log xc eventchn \
> +       xc eventchn \
>         xb xs xl
> 
>  .PHONY: all
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/META.in
> --- a/tools/ocaml/libs/log/META.in
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -version = "@VERSION@"
> -description = "Log - logging library"
> -requires = "unix"
> -archive(byte) = "log.cma"
> -archive(native) = "log.cmxa"
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/Makefile
> --- a/tools/ocaml/libs/log/Makefile
> +++ /dev/null
> @@ -1,44 +0,0 @@
> -TOPLEVEL=$(CURDIR)/../..
> -XEN_ROOT=$(TOPLEVEL)/../..
> -include $(TOPLEVEL)/common.make
> -
> -OBJS = syslog log logs
> -INTF = log.cmi logs.cmi syslog.cmi
> -LIBS = log.cma log.cmxa
> -
> -all: $(INTF) $(LIBS) $(PROGRAMS)
> -
> -bins: $(PROGRAMS)
> -
> -libs: $(LIBS)
> -
> -log.cmxa: libsyslog_stubs.a $(foreach obj,$(OBJS),$(obj).cmx)
> -       $(call mk-caml-lib-native, $@, -cclib -lsyslog_stubs, $(foreach obj,$(OBJS),$(obj).cmx))
> -
> -log.cma: $(foreach obj,$(OBJS),$(obj).cmo)
> -       $(call mk-caml-lib-bytecode, $@, -dllib dllsyslog_stubs.so -cclib -lsyslog_stubs, $(foreach obj,$(OBJS),$(obj).cmo))
> -
> -syslog_stubs.a: syslog_stubs.o
> -       $(call mk-caml-stubs, $@, $+)
> -
> -libsyslog_stubs.a: syslog_stubs.o
> -       $(call mk-caml-lib-stubs, $@, $+)
> -
> -logs.mli : logs.ml
> -       $(OCAMLC) -i $(OCAMLCFLAGS) $< > $@
> -
> -syslog.mli : syslog.ml
> -       $(OCAMLC) -i $< > $@
> -
> -.PHONY: install
> -install: $(LIBS) META
> -       mkdir -p $(OCAMLDESTDIR)
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) log
> -       ocamlfind install -destdir $(OCAMLDESTDIR) -ldconf ignore log META $(INTF) $(LIBS) *.a *.so *.cmx
> -
> -.PHONY: uninstall
> -uninstall:
> -       ocamlfind remove -destdir $(OCAMLDESTDIR) log
> -
> -include $(TOPLEVEL)/Makefile.rules
> -
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/log.ml
> --- a/tools/ocaml/libs/log/log.ml
> +++ /dev/null
> @@ -1,258 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -open Printf
> -
> -exception Unknown_level of string
> -
> -type stream_type = Stderr | Stdout | File of string
> -
> -type stream_log = {
> -  ty : stream_type;
> -  channel : out_channel option ref;
> -}
> -
> -type level = Debug | Info | Warn | Error
> -
> -type output =
> -       | Stream of stream_log
> -       | String of string list ref
> -       | Syslog of string
> -       | Nil
> -
> -let int_of_level l =
> -       match l with Debug -> 0 | Info -> 1 | Warn -> 2 | Error -> 3
> -
> -let string_of_level l =
> -       match l with Debug -> "debug" | Info -> "info"
> -                  | Warn -> "warn" | Error -> "error"
> -
> -let level_of_string s =
> -       match s with
> -       | "debug" -> Debug
> -       | "info"  -> Info
> -       | "warn"  -> Warn
> -       | "error" -> Error
> -       | _       -> raise (Unknown_level s)
> -
> -let mkdir_safe dir perm =
> -        try Unix.mkdir dir perm with _ -> ()
> -
> -let mkdir_rec dir perm =
> -       let rec p_mkdir dir =
> -               let p_name = Filename.dirname dir in
> -               if p_name = "/" || p_name = "." then
> -                       ()
> -               else (
> -                       p_mkdir p_name;
> -                       mkdir_safe dir perm
> -               ) in
> -       p_mkdir dir
> -
> -type t = { output: output; mutable level: level; }
> -
> -let make output level = { output = output; level = level; }
> -
> -let make_stream ty channel =
> -        Stream {ty=ty; channel=ref channel; }
> -
> -(** open a syslog logger *)
> -let opensyslog k level =
> -       make (Syslog k) level
> -
> -(** open a stderr logger *)
> -let openerr level =
> -       if (Unix.stat "/dev/stderr").Unix.st_kind <> Unix.S_CHR then
> -               failwith "/dev/stderr is not a valid character device";
> -       make (make_stream Stderr (Some (open_out "/dev/stderr"))) level
> -
> -let openout level =
> -       if (Unix.stat "/dev/stdout").Unix.st_kind <> Unix.S_CHR then
> -               failwith "/dev/stdout is not a valid character device";
> -        make (make_stream Stdout (Some (open_out "/dev/stdout"))) level
> -
> -
> -(** open a stream logger - returning the channel. *)
> -(* This needs to be separated from 'openfile' so we can reopen later *)
> -let doopenfile filename =
> -        if Filename.is_relative filename then
> -               None
> -       else (
> -                try
> -                 mkdir_rec (Filename.dirname filename) 0o700;
> -                 Some (open_out_gen [ Open_append; Open_creat ] 0o600 filename)
> -                with _ -> None
> -       )
> -
> -(** open a stream logger - returning the output type *)
> -let openfile filename level =
> -        make (make_stream (File filename) (doopenfile filename)) level
> -
> -(** open a nil logger *)
> -let opennil () =
> -       make Nil Error
> -
> -(** open a string logger *)
> -let openstring level =
> -        make (String (ref [""])) level
> -
> -(** try to reopen a logger *)
> -let reopen t =
> -       match t.output with
> -       | Nil              -> t
> -       | Syslog k         -> Syslog.close (); opensyslog k t.level
> -       | Stream s         -> (
> -             match (s.ty,!(s.channel)) with
> -               | (File filename, Some c) -> close_out c; s.channel := (try doopenfile filename with _ -> None); t
> -               | _ -> t)
> -       | String _         -> t
> -
> -(** close a logger *)
> -let close t =
> -       match t.output with
> -       | Nil           -> ()
> -       | Syslog k      -> Syslog.close ();
> -       | Stream s      -> (
> -             match !(s.channel) with
> -               | Some c -> close_out c; s.channel := None
> -               | None -> ())
> -       | String _      -> ()
> -
> -(** create a string representating the parameters of the logger *)
> -let string_of_logger t =
> -       match t.output with
> -       | Nil           -> "nil"
> -       | Syslog k      -> sprintf "syslog:%s" k
> -       | String _      -> "string"
> -       | Stream s      ->
> -           begin
> -             match s.ty with
> -               | File f -> sprintf "file:%s" f
> -               | Stderr -> "stderr"
> -               | Stdout -> "stdout"
> -           end
> -
> -(** parse a string to a logger *)
> -let logger_of_string s : t =
> -       match s with
> -       | "nil"    -> opennil ()
> -       | "stderr" -> openerr Debug
> -       | "stdout" -> openout Debug
> -       | "string" -> openstring Debug
> -       | _        ->
> -               let split_in_2 s =
> -                       try
> -                               let i = String.index s ':' in
> -                               String.sub s 0 (i),
> -                               String.sub s (i + 1) (String.length s - i - 1)
> -                       with _ ->
> -                               failwith "logger format error: expecting string:string"
> -                       in
> -               let k, s = split_in_2 s in
> -               match k with
> -               | "syslog" -> opensyslog s Debug
> -               | "file"   -> openfile s Debug
> -               | _        -> failwith "unknown logger type"
> -
> -let validate s =
> -       match s with
> -       | "nil"    -> ()
> -       | "stderr" -> ()
> -       | "stdout" -> ()
> -       | "string" -> ()
> -       | _        ->
> -               let split_in_2 s =
> -                       try
> -                               let i = String.index s ':' in
> -                               String.sub s 0 (i),
> -                               String.sub s (i + 1) (String.length s - i - 1)
> -                       with _ ->
> -                               failwith "logger format error: expecting string:string"
> -                       in
> -               let k, s = split_in_2 s in
> -               match k with
> -               | "syslog" -> ()
> -               | "file"   -> (
> -                       try
> -                               let st = Unix.stat s in
> -                               if st.Unix.st_kind <> Unix.S_REG then
> -                                       failwith "logger file is a directory";
> -                               ()
> -                       with Unix.Unix_error (Unix.ENOENT, _, _) -> ()
> -                       )
> -               | _        -> failwith "unknown logger"
> -
> -(** change a logger level to level *)
> -let set t level = t.level <- level
> -
> -let gettimestring () =
> -       let time = Unix.gettimeofday () in
> -       let tm = Unix.localtime time in
> -        let msec = time -. (floor time) in
> -       sprintf "%d%.2d%.2d %.2d:%.2d:%.2d.%.3d|" (1900 + tm.Unix.tm_year)
> -               (tm.Unix.tm_mon + 1) tm.Unix.tm_mday
> -               tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
> -               (int_of_float (1000.0 *. msec))
> -
> -(*let extra_hook = ref (fun x -> x)*)
> -
> -let output t ?(key="") ?(extra="") priority (message: string) =
> -  let construct_string withtime =
> -               (*let key = if key = "" then [] else [ key ] in
> -               let extra = if extra = "" then [] else [ extra ] in
> -               let items =
> -      (if withtime then [ gettimestring () ] else [])
> -                 @ [ sprintf "%5s" (string_of_level priority) ] @ extra @ key @ [ message ] in
> -(*             let items = !extra_hook items in*)
> -               String.concat " " items*)
> -    Printf.sprintf "[%s%s|%s] %s"
> -      (if withtime then gettimestring () else "") (string_of_level priority) extra message
> -       in
> -       (* Keep track of how much we write out to streams, so that we can *)
> -       (* log-rotate at appropriate times *)
> -       let write_to_stream stream =
> -         let string = (construct_string true) in
> -         try
> -           fprintf stream "%s\n%!" string
> -         with _ -> () (* Trap exception when we fail to write log *)
> -        in
> -
> -       if String.length message > 0 then
> -       match t.output with
> -       | Syslog k      ->
> -               let sys_prio = match priority with
> -               | Debug -> Syslog.Debug
> -               | Info  -> Syslog.Info
> -               | Warn  -> Syslog.Warning
> -               | Error -> Syslog.Err in
> -               Syslog.log Syslog.Daemon sys_prio ((construct_string false) ^ "\n")
> -       | Stream s -> (
> -             match !(s.channel) with
> -               | Some c -> write_to_stream c
> -               | None -> ())
> -       | Nil           -> ()
> -       | String s      -> (s := (construct_string true)::!s)
> -
> -let log t level (fmt: ('a, unit, string, unit) format4): 'a =
> -       let b = (int_of_level t.level) <= (int_of_level level) in
> -       (* ksprintf is the preferred name for kprintf, but the former
> -        * is not available in OCaml 3.08.3 *)
> -       Printf.kprintf (if b then output t level else (fun _ -> ())) fmt
> -
> -let debug t (fmt: ('a , unit, string, unit) format4) = log t Debug fmt
> -let info t (fmt: ('a , unit, string, unit) format4) = log t Info fmt
> -let warn t (fmt: ('a , unit, string, unit) format4) = log t Warn fmt
> -let error t (fmt: ('a , unit, string, unit) format4) = log t Error fmt
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/log.mli
> --- a/tools/ocaml/libs/log/log.mli
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -exception Unknown_level of string
> -type level = Debug | Info | Warn | Error
> -
> -type stream_type = Stderr | Stdout | File of string
> -type stream_log = {
> -  ty : stream_type;
> -  channel : out_channel option ref;
> -}
> -type output =
> -    Stream of stream_log
> -  | String of string list ref
> -  | Syslog of string
> -  | Nil
> -val int_of_level : level -> int
> -val string_of_level : level -> string
> -val level_of_string : string -> level
> -val mkdir_safe : string -> Unix.file_perm -> unit
> -val mkdir_rec : string -> Unix.file_perm -> unit
> -type t = { output : output; mutable level : level; }
> -val make : output -> level -> t
> -val opensyslog : string -> level -> t
> -val openerr : level -> t
> -val openout : level -> t
> -val openfile : string -> level -> t
> -val opennil : unit -> t
> -val openstring : level -> t
> -val reopen : t -> t
> -val close : t -> unit
> -val string_of_logger : t -> string
> -val logger_of_string : string -> t
> -val validate : string -> unit
> -val set : t -> level -> unit
> -val gettimestring : unit -> string
> -val output : t -> ?key:string -> ?extra:string -> level -> string -> unit
> -val log : t -> level -> ('a, unit, string, unit) format4 -> 'a
> -val debug : t -> ('a, unit, string, unit) format4 -> 'a
> -val info : t -> ('a, unit, string, unit) format4 -> 'a
> -val warn : t -> ('a, unit, string, unit) format4 -> 'a
> -val error : t -> ('a, unit, string, unit) format4 -> 'a
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/logs.ml
> --- a/tools/ocaml/libs/log/logs.ml
> +++ /dev/null
> @@ -1,197 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -type keylogger =
> -{
> -       mutable debug: string list;
> -       mutable info: string list;
> -       mutable warn: string list;
> -       mutable error: string list;
> -       no_default: bool;
> -}
> -
> -(* map all logger strings into a logger *)
> -let __all_loggers = Hashtbl.create 10
> -
> -(* default logger that everything that doesn't have a key in __lop_mapping get send *)
> -let __default_logger = { debug = []; info = []; warn = []; error = []; no_default = false }
> -
> -(*
> - * This describe the mapping between a name to a keylogger.
> - * a keylogger contains a list of logger string per level of debugging.
> - * Example:   "xenops", debug -> [ "stderr"; "/var/log/xensource.log" ]
> - *            "xapi", error ->   []
> - *            "xapi", debug ->   [ "/var/log/xensource.log" ]
> - *            "xenops", info ->  [ "syslog" ]
> - *)
> -let __log_mapping = Hashtbl.create 32
> -
> -let get_or_open logstring =
> -       if Hashtbl.mem __all_loggers logstring then
> -               Hashtbl.find __all_loggers logstring
> -       else
> -               let t = Log.logger_of_string logstring in
> -               Hashtbl.add __all_loggers logstring t;
> -               t
> -
> -(** create a mapping entry for the key "name".
> - * all log level of key "name" default to "logger" logger.
> - * a sensible default is put "nil" as a logger and reopen a specific level to
> - * the logger you want to.
> - *)
> -let add key logger =
> -       let kl = {
> -               debug = logger;
> -               info = logger;
> -               warn = logger;
> -               error = logger;
> -               no_default = false;
> -       } in
> -       Hashtbl.add __log_mapping key kl
> -
> -let get_by_level keylog level =
> -       match level with
> -       | Log.Debug -> keylog.debug
> -       | Log.Info  -> keylog.info
> -       | Log.Warn  -> keylog.warn
> -       | Log.Error -> keylog.error
> -
> -let set_by_level keylog level logger =
> -       match level with
> -       | Log.Debug -> keylog.debug <- logger
> -       | Log.Info  -> keylog.info <- logger
> -       | Log.Warn  -> keylog.warn <- logger
> -       | Log.Error -> keylog.error <- logger
> -
> -(** set a specific key|level to the logger "logger" *)
> -let set key level logger =
> -       if not (Hashtbl.mem __log_mapping key) then
> -               add key [];
> -
> -       let keylog = Hashtbl.find __log_mapping key in
> -       set_by_level keylog level logger
> -
> -(** set default logger *)
> -let set_default level logger =
> -       set_by_level __default_logger level logger
> -
> -(** append a logger to the list *)
> -let append key level logger =
> -       if not (Hashtbl.mem __log_mapping key) then
> -               add key [];
> -       let keylog = Hashtbl.find __log_mapping key in
> -       let loggers = get_by_level keylog level in
> -       set_by_level keylog level (loggers @ [ logger ])
> -
> -(** append a logger to the default list *)
> -let append_default level logger =
> -       let loggers = get_by_level __default_logger level in
> -       set_by_level __default_logger level (loggers @ [ logger ])
> -
> -(** reopen all logger open *)
> -let reopen () =
> -       Hashtbl.iter (fun k v ->
> -               Hashtbl.replace __all_loggers k (Log.reopen v)) __all_loggers
> -
> -(** reclaim close all logger open that are not use by any other keys *)
> -let reclaim () =
> -       let list_sort_uniq l =
> -               let oldprev = ref "" and prev = ref "" in
> -               List.fold_left (fun a k ->
> -                       oldprev := !prev;
> -                       prev := k;
> -                       if k = !oldprev then a else k :: a) []
> -                       (List.sort compare l)
> -               in
> -       let flatten_keylogger v =
> -               list_sort_uniq (v.debug @ v.info @ v.warn @ v.error) in
> -       let oldkeys = Hashtbl.fold (fun k v a -> k :: a) __all_loggers [] in
> -       let usedkeys = Hashtbl.fold (fun k v a ->
> -               (flatten_keylogger v) @ a)
> -               __log_mapping (flatten_keylogger __default_logger) in
> -       let usedkeys = list_sort_uniq usedkeys in
> -
> -       List.iter (fun k ->
> -               if not (List.mem k usedkeys) then (
> -                       begin try
> -                               Log.close (Hashtbl.find __all_loggers k)
> -                       with
> -                               Not_found -> ()
> -                       end;
> -                       Hashtbl.remove __all_loggers k
> -               )) oldkeys
> -
> -(** clear a specific key|level *)
> -let clear key level =
> -       try
> -               let keylog = Hashtbl.find __log_mapping key in
> -               set_by_level keylog level [];
> -               reclaim ()
> -       with Not_found ->
> -               ()
> -
> -(** clear a specific default level *)
> -let clear_default level =
> -       set_default level [];
> -       reclaim ()
> -
> -(** reset all the loggers to the specified logger *)
> -let reset_all logger =
> -       Hashtbl.clear __log_mapping;
> -       set_default Log.Debug logger;
> -       set_default Log.Warn logger;
> -       set_default Log.Error logger;
> -       set_default Log.Info logger;
> -       reclaim ()
> -
> -(** log a fmt message to the key|level logger specified in the log mapping.
> - * if the logger doesn't exist, assume nil logger.
> - *)
> -let log key level ?(extra="") (fmt: ('a, unit, string, unit) format4): 'a =
> -       let keylog =
> -               if Hashtbl.mem __log_mapping key then
> -                       let keylog = Hashtbl.find __log_mapping key in
> -                       if keylog.no_default = false &&
> -                          get_by_level keylog level = [] then
> -                               __default_logger
> -                       else
> -                               keylog
> -               else
> -                       __default_logger in
> -       let loggers = get_by_level keylog level in
> -       match loggers with
> -       | [] -> Printf.kprintf ignore fmt
> -       | _  ->
> -               let l = List.fold_left (fun acc logger ->
> -                       try get_or_open logger :: acc
> -                       with _ -> acc
> -               ) [] loggers in
> -               let l = List.rev l in
> -
> -               (* ksprintf is the preferred name for kprintf, but the former
> -                * is not available in OCaml 3.08.3 *)
> -               Printf.kprintf (fun s ->
> -                       List.iter (fun t -> Log.output t ~key ~extra level s) l) fmt
> -
> -(* define some convenience functions *)
> -let debug t ?extra (fmt: ('a , unit, string, unit) format4) =
> -       log t Log.Debug ?extra fmt
> -let info t ?extra (fmt: ('a , unit, string, unit) format4) =
> -       log t Log.Info ?extra fmt
> -let warn t ?extra (fmt: ('a , unit, string, unit) format4) =
> -       log t Log.Warn ?extra fmt
> -let error t ?extra (fmt: ('a , unit, string, unit) format4) =
> -       log t Log.Error ?extra fmt
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/logs.mli
> --- a/tools/ocaml/libs/log/logs.mli
> +++ /dev/null
> @@ -1,46 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -type keylogger = {
> -  mutable debug : string list;
> -  mutable info : string list;
> -  mutable warn : string list;
> -  mutable error : string list;
> -  no_default : bool;
> -}
> -val __all_loggers : (string, Log.t) Hashtbl.t
> -val __default_logger : keylogger
> -val __log_mapping : (string, keylogger) Hashtbl.t
> -val get_or_open : string -> Log.t
> -val add : string -> string list -> unit
> -val get_by_level : keylogger -> Log.level -> string list
> -val set_by_level : keylogger -> Log.level -> string list -> unit
> -val set : string -> Log.level -> string list -> unit
> -val set_default : Log.level -> string list -> unit
> -val append : string -> Log.level -> string -> unit
> -val append_default : Log.level -> string -> unit
> -val reopen : unit -> unit
> -val reclaim : unit -> unit
> -val clear : string -> Log.level -> unit
> -val clear_default : Log.level -> unit
> -val reset_all : string list -> unit
> -val log :
> -  string ->
> -  Log.level -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
> -val debug : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
> -val info : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
> -val warn : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
> -val error : string -> ?extra:string -> ('a, unit, string, unit) format4 -> 'a
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/syslog.ml
> --- a/tools/ocaml/libs/log/syslog.ml
> +++ /dev/null
> @@ -1,26 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -type level = Emerg | Alert | Crit | Err | Warning | Notice | Info | Debug
> -type options = Cons | Ndelay | Nowait | Odelay | Perror | Pid
> -type facility = Auth | Authpriv | Cron | Daemon | Ftp | Kern
> -              | Local0 | Local1 | Local2 | Local3
> -             | Local4 | Local5 | Local6 | Local7
> -             | Lpr | Mail | News | Syslog | User | Uucp
> -
> -(* external init : string -> options list -> facility -> unit = "stub_openlog" *)
> -external log : facility -> level -> string -> unit = "stub_syslog"
> -external close : unit -> unit = "stub_closelog"
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/syslog.mli
> --- a/tools/ocaml/libs/log/syslog.mli
> +++ /dev/null
> @@ -1,41 +0,0 @@
> -(*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - *)
> -
> -type level = Emerg | Alert | Crit | Err | Warning | Notice | Info | Debug
> -type options = Cons | Ndelay | Nowait | Odelay | Perror | Pid
> -type facility =
> -    Auth
> -  | Authpriv
> -  | Cron
> -  | Daemon
> -  | Ftp
> -  | Kern
> -  | Local0
> -  | Local1
> -  | Local2
> -  | Local3
> -  | Local4
> -  | Local5
> -  | Local6
> -  | Local7
> -  | Lpr
> -  | Mail
> -  | News
> -  | Syslog
> -  | User
> -  | Uucp
> -external log : facility -> level -> string -> unit = "stub_syslog"
> -external close : unit -> unit = "stub_closelog"
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/libs/log/syslog_stubs.c
> --- a/tools/ocaml/libs/log/syslog_stubs.c
> +++ /dev/null
> @@ -1,75 +0,0 @@
> -/*
> - * Copyright (C) 2006-2007 XenSource Ltd.
> - * Copyright (C) 2008      Citrix Ltd.
> - * Author Vincent Hanquez <vincent.hanquez@eu.citrix.com>
> - *
> - * This program 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 only. with the special
> - * exception on linking described in file LICENSE.
> - *
> - * This program 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.
> - */
> -
> -#include <syslog.h>
> -#include <caml/mlvalues.h>
> -#include <caml/memory.h>
> -#include <caml/alloc.h>
> -#include <caml/custom.h>
> -
> -static int __syslog_level_table[] = {
> -       LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING,
> -       LOG_NOTICE, LOG_INFO, LOG_DEBUG
> -};
> -
> -/*
> -static int __syslog_options_table[] = {
> -       LOG_CONS, LOG_NDELAY, LOG_NOWAIT, LOG_ODELAY, LOG_PERROR, LOG_PID
> -};
> -*/
> -
> -static int __syslog_facility_table[] = {
> -       LOG_AUTH, LOG_AUTHPRIV, LOG_CRON, LOG_DAEMON, LOG_FTP, LOG_KERN,
> -       LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3,
> -       LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7,
> -       LOG_LPR | LOG_MAIL | LOG_NEWS | LOG_SYSLOG | LOG_USER | LOG_UUCP
> -};
> -
> -/* According to the openlog manpage the 'openlog' call may take a reference
> -   to the 'ident' string and keep it long-term. This means we cannot just pass in
> -   an ocaml string which is under the control of the GC. Since we aren't actually
> -   calling this function we can just comment it out for the time-being. */
> -/*
> -value stub_openlog(value ident, value option, value facility)
> -{
> -       CAMLparam3(ident, option, facility);
> -       int c_option;
> -       int c_facility;
> -
> -       c_option = caml_convert_flag_list(option, __syslog_options_table);
> -       c_facility = __syslog_facility_table[Int_val(facility)];
> -       openlog(String_val(ident), c_option, c_facility);
> -       CAMLreturn(Val_unit);
> -}
> -*/
> -
> -value stub_syslog(value facility, value level, value msg)
> -{
> -       CAMLparam3(facility, level, msg);
> -       int c_facility;
> -
> -       c_facility = __syslog_facility_table[Int_val(facility)]
> -                  | __syslog_level_table[Int_val(level)];
> -       syslog(c_facility, "%s", String_val(msg));
> -       CAMLreturn(Val_unit);
> -}
> -
> -value stub_closelog(value unit)
> -{
> -       CAMLparam1(unit);
> -       closelog();
> -       CAMLreturn(Val_unit);
> -}
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/Makefile
> --- a/tools/ocaml/xenstored/Makefile
> +++ b/tools/ocaml/xenstored/Makefile
> @@ -3,7 +3,6 @@
>  include $(OCAML_TOPLEVEL)/common.make
> 
>  OCAMLINCLUDE += \
> -       -I $(OCAML_TOPLEVEL)/libs/log \
>         -I $(OCAML_TOPLEVEL)/libs/xb \
>         -I $(OCAML_TOPLEVEL)/libs/mmap \
>         -I $(OCAML_TOPLEVEL)/libs/xc \
> @@ -34,7 +33,6 @@
>  XENSTOREDLIBS = \
>         unix.cmxa \
>         -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/mmap $(OCAML_TOPLEVEL)/libs/mmap/xenmmap.cmxa \
> -       -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/log $(OCAML_TOPLEVEL)/libs/log/log.cmxa \
>         -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/eventchn $(OCAML_TOPLEVEL)/libs/eventchn/xeneventchn.cmxa \
>         -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xc $(OCAML_TOPLEVEL)/libs/xc/xenctrl.cmxa \
>         -ccopt -L -ccopt $(OCAML_TOPLEVEL)/libs/xb $(OCAML_TOPLEVEL)/libs/xb/xenbus.cmxa \
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/connection.ml
> --- a/tools/ocaml/xenstored/connection.ml
> +++ b/tools/ocaml/xenstored/connection.ml
> @@ -232,3 +232,8 @@
>                         Printf.fprintf chan "watch,%d,%s,%s\n" domid (Utils.hexify path) (Utils.hexify token)
>                         ) (list_watches con);
>         | None -> ()
> +
> +let debug con =
> +       let domid = get_domstr con in
> +       let watches = List.map (fun (path, token) -> Printf.sprintf "watch %s: %s %s\n" domid path token) (list_watches con) in
> +       String.concat "" watches
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/connections.ml
> --- a/tools/ocaml/xenstored/connections.ml
> +++ b/tools/ocaml/xenstored/connections.ml
> @@ -15,7 +15,7 @@
>   * GNU Lesser General Public License for more details.
>   *)
> 
> -let debug fmt = Logs.debug "general" fmt
> +let debug fmt = Logging.debug "connections" fmt
> 
>  type t = {
>         mutable anonymous: Connection.t list;
> @@ -165,3 +165,8 @@
>         );
>         (List.length cons.anonymous, !nb_ops_anon, !nb_watchs_anon,
>          Hashtbl.length cons.domains, !nb_ops_dom, !nb_watchs_dom)
> +
> +let debug cons =
> +       let anonymous = List.map Connection.debug cons.anonymous in
> +       let domains = Hashtbl.fold (fun _ con accu -> Connection.debug con :: accu) cons.domains [] in
> +       String.concat "" (domains @ anonymous)
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/disk.ml
> --- a/tools/ocaml/xenstored/disk.ml
> +++ b/tools/ocaml/xenstored/disk.ml
> @@ -17,7 +17,7 @@
>  let enable = ref false
>  let xs_daemon_database = "/var/run/xenstored/db"
> 
> -let error = Logs.error "general"
> +let error fmt = Logging.error "disk" fmt
> 
>  (* unescape utils *)
>  exception Bad_escape
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/domain.ml
> --- a/tools/ocaml/xenstored/domain.ml
> +++ b/tools/ocaml/xenstored/domain.ml
> @@ -16,7 +16,7 @@
> 
>  open Printf
> 
> -let debug fmt = Logs.debug "general" fmt
> +let debug fmt = Logging.debug "domain" fmt
> 
>  type t =
>  {
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/domains.ml
> --- a/tools/ocaml/xenstored/domains.ml
> +++ b/tools/ocaml/xenstored/domains.ml
> @@ -14,6 +14,8 @@
>   * GNU Lesser General Public License for more details.
>   *)
> 
> +let debug fmt = Logging.debug "domains" fmt
> +
>  type domains = {
>         eventchn: Event.t;
>         table: (Xenctrl.domid, Domain.t) Hashtbl.t;
> @@ -35,7 +37,7 @@
>                 try
>                         let info = Xenctrl.domain_getinfo xc id in
>                         if info.Xenctrl.shutdown || info.Xenctrl.dying then (
> -                               Logs.debug "general" "Domain %u died (dying=%b, shutdown %b -- code %d)"
> +                               debug "Domain %u died (dying=%b, shutdown %b -- code %d)"
>                                                     id info.Xenctrl.dying info.Xenctrl.shutdown info.Xenctrl.shutdown_code;
>                                 if info.Xenctrl.dying then
>                                         dead_dom := id :: !dead_dom
> @@ -43,7 +45,7 @@
>                                         notify := true;
>                         )
>                 with Xenctrl.Error _ ->
> -                       Logs.debug "general" "Domain %u died -- no domain info" id;
> +                       debug "Domain %u died -- no domain info" id;
>                         dead_dom := id :: !dead_dom;
>                 ) doms.table;
>         List.iter (fun id ->
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/logging.ml
> --- a/tools/ocaml/xenstored/logging.ml
> +++ b/tools/ocaml/xenstored/logging.ml
> @@ -17,21 +17,122 @@
>  open Stdext
>  open Printf
> 
> -let error fmt = Logs.error "general" fmt
> -let info fmt = Logs.info "general" fmt
> -let debug fmt = Logs.debug "general" fmt
> 
> -let access_log_file = ref "/var/log/xenstored-access.log"
> -let access_log_nb_files = ref 20
> -let access_log_nb_lines = ref 13215
> -let activate_access_log = ref true
> +(* Logger common *)
> 
> -(* maximal size of the lines in xenstore-acces.log file *)
> -let line_size = 180
> +type logger =
> +               { stop: unit -> unit;
> +                 restart: unit -> unit;
> +                 rotate: unit -> unit;
> +                 write: 'a. ('a, unit, string, unit) format4 -> 'a }
> 
> -let log_read_ops = ref false
> -let log_transaction_ops = ref false
> -let log_special_ops = ref false
> +let truncate_line nb_chars line =
> +       if String.length line > nb_chars - 1 then
> +               let len = max (nb_chars - 1) 2 in
> +               let dst_line = String.create len in
> +               String.blit line 0 dst_line 0 (len - 2);
> +               dst_line.[len-2] <- '.';
> +               dst_line.[len-1] <- '.';
> +               dst_line
> +       else line
> +
> +let log_rotate ref_ch log_file log_nb_files =
> +       let file n = sprintf "%s.%i" log_file n in
> +       let log_files =
> +               let rec aux accu n =
> +                       if n >= log_nb_files then accu
> +                       else
> +                               if n = 1 && Sys.file_exists log_file
> +                               then aux [log_file,1] 2
> +                               else
> +                                       let file = file (n-1) in
> +                                       if Sys.file_exists file then
> +                                               aux ((file, n) :: accu) (n+1)
> +                                       else accu in
> +               aux [] 1 in
> +       List.iter (fun (f, n) -> Unix.rename f (file n)) log_files;
> +       close_out !ref_ch;
> +       ref_ch := open_out log_file
> +
> +let make_logger log_file log_nb_files log_nb_lines log_nb_chars post_rotate =
> +       let channel = ref (open_out_gen [Open_append; Open_creat] 0o644 log_file) in
> +       let counter = ref 0 in
> +       let stop() =
> +               try flush !channel; close_out !channel
> +               with _ -> () in
> +       let restart() =
> +               stop();
> +               channel := open_out_gen [Open_append; Open_creat] 0o644 log_file in
> +       let rotate() =
> +               log_rotate channel log_file log_nb_files;
> +               (post_rotate (): unit);
> +               counter := 0 in
> +       let output s =
> +               let s = if log_nb_chars > 0 then truncate_line log_nb_chars s else s in
> +               let s = s ^ "\n" in
> +               output_string !channel s;
> +               flush !channel;
> +               incr counter;
> +               if !counter > log_nb_lines then rotate() in
> +       { stop=stop; restart=restart; rotate=rotate; write = fun fmt -> Printf.ksprintf output fmt }
> +
> +
> +(* Xenstored logger *)
> +
> +exception Unknown_level of string
> +
> +type level = Debug | Info | Warn | Error | Null
> +
> +let int_of_level = function
> +       | Debug -> 0 | Info -> 1 | Warn -> 2
> +       | Error -> 3 | Null -> max_int
> +
> +let string_of_level = function
> +       | Debug -> "debug" | Info -> "info" | Warn -> "warn"
> +       | Error -> "error" | Null -> "null"
> +
> +let level_of_string = function
> +       | "debug" -> Debug | "info"  -> Info | "warn"  -> Warn
> +       | "error" -> Error | "null"  -> Null | s  -> raise (Unknown_level s)
> +
> +let string_of_date () =
> +       let time = Unix.gettimeofday () in
> +       let tm = Unix.gmtime time in
> +       let msec = time -. (floor time) in
> +       sprintf "%d%.2d%.2dT%.2d:%.2d:%.2d.%.3dZ"
> +               (1900 + tm.Unix.tm_year) (tm.Unix.tm_mon + 1) tm.Unix.tm_mday
> +               tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
> +               (int_of_float (1000.0 *. msec))
> +
> +let xenstored_log_file = ref "/var/log/xenstored.log"
> +let xenstored_log_level = ref Null
> +let xenstored_log_nb_files = ref 10
> +let xenstored_log_nb_lines = ref 13215
> +let xenstored_log_nb_chars = ref (-1)
> +let xenstored_logger = ref (None: logger option)
> +
> +let init_xenstored_log () =
> +       if !xenstored_log_level <> Null && !xenstored_log_nb_files > 0 then
> +               let logger =
> +                       make_logger
> +                               !xenstored_log_file !xenstored_log_nb_files !xenstored_log_nb_lines
> +                               !xenstored_log_nb_chars ignore in
> +               xenstored_logger := Some logger
> +
> +let xenstored_logging level key (fmt: (_,_,_,_) format4) =
> +       match !xenstored_logger with
> +       | Some logger when int_of_level level >= int_of_level !xenstored_log_level ->
> +                       let date = string_of_date() in
> +                       let level = string_of_level level in
> +                       logger.write ("[%s|%5s|%s] " ^^ fmt) date level key
> +       | _ -> Printf.ksprintf ignore fmt
> +
> +let debug key = xenstored_logging Debug key
> +let info key = xenstored_logging Info key
> +let warn key = xenstored_logging Warn key
> +let error key = xenstored_logging Error key
> +
> +(* Access logger *)
> 
>  type access_type =
>         | Coalesce
> @@ -41,38 +142,10 @@
>         | Endconn
>         | XbOp of Xenbus.Xb.Op.operation
> 
> -type access =
> -       {
> -               fd: out_channel ref;
> -               counter: int ref;
> -               write: tid:int -> con:string -> ?data:string -> access_type -> unit;
> -       }
> -
> -let string_of_date () =
> -       let time = Unix.gettimeofday () in
> -       let tm = Unix.localtime time in
> -       let msec = time -. (floor time) in
> -       sprintf "%d%.2d%.2d %.2d:%.2d:%.2d.%.3d" (1900 + tm.Unix.tm_year)
> -               (tm.Unix.tm_mon + 1)
> -               tm.Unix.tm_mday
> -               tm.Unix.tm_hour
> -               tm.Unix.tm_min
> -               tm.Unix.tm_sec
> -               (int_of_float (1000.0 *. msec))
> -
> -let fill_with_space n s =
> -       if String.length s < n
> -       then
> -               let r = String.make n ' ' in
> -               String.blit s 0  r 0 (String.length s);
> -               r
> -       else
> -               s
> -
>  let string_of_tid ~con tid =
>         if tid = 0
> -       then fill_with_space 12 (sprintf "%s" con)
> -       else fill_with_space 12 (sprintf "%s.%i" con tid)
> +       then sprintf "%-12s" con
> +       else sprintf "%-12s" (sprintf "%s.%i" con tid)
> 
>  let string_of_access_type = function
>         | Coalesce                -> "coalesce "
> @@ -109,41 +182,9 @@
> 
>         | Xenbus.Xb.Op.Error             -> "error    "
>         | Xenbus.Xb.Op.Watchevent        -> "w event  "
> -
> +       (*
>         | x                       -> Xenbus.Xb.Op.to_string x
> -
> -let file_exists file =
> -       try
> -               Unix.close (Unix.openfile file [Unix.O_RDONLY] 0o644);
> -               true
> -       with _ ->
> -               false
> -
> -let log_rotate fd =
> -       let file n = sprintf "%s.%i" !access_log_file n in
> -       let log_files =
> -               let rec aux accu n =
> -                       if n >= !access_log_nb_files
> -                       then accu
> -                       else if n = 1 && file_exists !access_log_file
> -                       then aux [!access_log_file,1] 2
> -                       else
> -                               let file = file (n-1) in
> -                               if file_exists file
> -                               then aux ((file,n) :: accu) (n+1)
> -                               else accu
> -               in
> -               aux [] 1
> -       in
> -       let rec rename = function
> -               | (f,n) :: t when n < !access_log_nb_files ->
> -                       Unix.rename f (file n);
> -                       rename t
> -               | _ -> ()
> -       in
> -       rename log_files;
> -       close_out !fd;
> -       fd := open_out !access_log_file
> +       *)
> 
>  let sanitize_data data =
>         let data = String.copy data in
> @@ -154,86 +195,68 @@
>         done;
>         String.escaped data
> 
> -let make save_to_disk =
> -       let fd = ref (open_out_gen [Open_append; Open_creat] 0o644 !access_log_file) in
> -       let counter = ref 0 in
> -       {
> -               fd = fd;
> -               counter = counter;
> -               write =
> -                       if not !activate_access_log || !access_log_nb_files = 0
> -                       then begin fun ~tid ~con ?data _ -> () end
> -                       else fun ~tid ~con ?(data="") access_type ->
> -                               let s = Printf.sprintf "[%s] %s %s %s\n" (string_of_date()) (string_of_tid ~con tid)
> -                                       (string_of_access_type access_type) (sanitize_data data) in
> -                               let s =
> -                                       if String.length s > line_size
> -                                       then begin
> -                                               let s = String.sub s 0 line_size in
> -                                               s.[line_size-3] <- '.';
> -                                               s.[line_size-2] <- '.';
> -                                               s.[line_size-1] <- '\n';
> -                                               s
> -                                       end else
> -                                               s
> -                               in
> -                               incr counter;
> -                               output_string !fd s;
> -                               flush !fd;
> -                               if !counter > !access_log_nb_lines
> -                               then begin
> -                                       log_rotate fd;
> -                                       save_to_disk ();
> -                                       counter := 0;
> -                               end
> -       }
> +let activate_access_log = ref true
> +let access_log_file = ref "/var/log/xenstored-access.log"
> +let access_log_nb_files = ref 20
> +let access_log_nb_lines = ref 13215
> +let access_log_nb_chars = ref 180
> +let access_log_read_ops = ref false
> +let access_log_transaction_ops = ref false
> +let access_log_special_ops = ref false
> +let access_logger = ref None
> 
> -let access : (access option) ref = ref None
> -let init aal save_to_disk =
> -       activate_access_log := aal;
> -       access := Some (make save_to_disk)
> -
> -let write_access_log ~con ~tid ?data access_type =
> +let init_access_log post_rotate =
> +       if !access_log_nb_files > 0 then
> +               let logger =
> +                       make_logger
> +                               !access_log_file !access_log_nb_files !access_log_nb_lines
> +                               !access_log_nb_chars post_rotate in
> +               access_logger := Some logger
> +
> +let access_logging ~con ~tid ?(data="") access_type =
>          try
> -         maybe (fun a -> a.write access_type ~con ~tid ?data) !access
> +               maybe
> +                       (fun logger ->
> +                               let date = string_of_date() in
> +                               let tid = string_of_tid ~con tid in
> +                               let access_type = string_of_access_type access_type in
> +                               let data = sanitize_data data in
> +                               logger.write "[%s] %s %s %s" date tid access_type data)
> +                       !access_logger
>         with _ -> ()
> 
> -let new_connection = write_access_log Newconn
> -let end_connection = write_access_log Endconn
> +let new_connection = access_logging Newconn
> +let end_connection = access_logging Endconn
>  let read_coalesce ~tid ~con data =
> -       if !log_read_ops
> -       then write_access_log Coalesce ~tid ~con ~data:("read "^data)
> -let write_coalesce data = write_access_log Coalesce ~data:("write "^data)
> -let conflict = write_access_log Conflict
> -let commit = write_access_log Commit
> +       if !access_log_read_ops
> +       then access_logging Coalesce ~tid ~con ~data:("read "^data)
> +let write_coalesce data = access_logging Coalesce ~data:("write "^data)
> +let conflict = access_logging Conflict
> +let commit = access_logging Commit
> 
>  let xb_op ~tid ~con ~ty data =
> -       let print =
> -       match ty with
> -               | Xenbus.Xb.Op.Read | Xenbus.Xb.Op.Directory | Xenbus.Xb.Op.Getperms -> !log_read_ops
> +       let print = match ty with
> +               | Xenbus.Xb.Op.Read | Xenbus.Xb.Op.Directory | Xenbus.Xb.Op.Getperms -> !access_log_read_ops
>                 | Xenbus.Xb.Op.Transaction_start | Xenbus.Xb.Op.Transaction_end ->
>                         false (* transactions are managed below *)
>                 | Xenbus.Xb.Op.Introduce | Xenbus.Xb.Op.Release | Xenbus.Xb.Op.Getdomainpath | Xenbus.Xb.Op.Isintroduced | Xenbus.Xb.Op.Resume ->
> -                       !log_special_ops
> -               | _ -> true
> -       in
> -               if print
> -               then write_access_log ~tid ~con ~data (XbOp ty)
> +                       !access_log_special_ops
> +               | _ -> true in
> +       if print then access_logging ~tid ~con ~data (XbOp ty)
> 
>  let start_transaction ~tid ~con =
> -       if !log_transaction_ops && tid <> 0
> -       then write_access_log ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_start)
> +       if !access_log_transaction_ops && tid <> 0
> +       then access_logging ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_start)
> 
>  let end_transaction ~tid ~con =
> -       if !log_transaction_ops && tid <> 0
> -       then write_access_log ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_end)
> +       if !access_log_transaction_ops && tid <> 0
> +       then access_logging ~tid ~con (XbOp Xenbus.Xb.Op.Transaction_end)
> 
>  let xb_answer ~tid ~con ~ty data =
>         let print = match ty with
> -               | Xenbus.Xb.Op.Error when data="ENOENT " -> !log_read_ops
> -               | Xenbus.Xb.Op.Error -> !log_special_ops
> +               | Xenbus.Xb.Op.Error when String.startswith "ENOENT " data -> !access_log_read_ops
> +               | Xenbus.Xb.Op.Error -> true
>                 | Xenbus.Xb.Op.Watchevent -> true
>                 | _ -> false
>         in
> -               if print
> -               then write_access_log ~tid ~con ~data (XbOp ty)
> +       if print then access_logging ~tid ~con ~data (XbOp ty)
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/perms.ml
> --- a/tools/ocaml/xenstored/perms.ml
> +++ b/tools/ocaml/xenstored/perms.ml
> @@ -15,6 +15,8 @@
>   * GNU Lesser General Public License for more details.
>   *)
> 
> +let info fmt = Logging.info "perms" fmt
> +
>  open Stdext
> 
>  let activate = ref true
> @@ -145,16 +147,16 @@
>                 in
>                 match perm, request with
>                 | NONE, _ ->
> -                       Logs.info "io" "Permission denied: Domain %d has no permission" domainid;
> +                       info "Permission denied: Domain %d has no permission" domainid;
>                         false
>                 | RDWR, _ -> true
>                 | READ, READ -> true
>                 | WRITE, WRITE -> true
>                 | READ, _ ->
> -                       Logs.info "io" "Permission denied: Domain %d has read only access" domainid;
> +                       info "Permission denied: Domain %d has read only access" domainid;
>                         false
>                 | WRITE, _ ->
> -                       Logs.info "io" "Permission denied: Domain %d has write only access" domainid;
> +                       info "Permission denied: Domain %d has write only access" domainid;
>                         false
>         in
>         if !activate
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/process.ml
> --- a/tools/ocaml/xenstored/process.ml
> +++ b/tools/ocaml/xenstored/process.ml
> @@ -14,6 +14,9 @@
>   * GNU Lesser General Public License for more details.
>   *)
> 
> +let error fmt = Logging.error "process" fmt
> +let info fmt = Logging.info "process" fmt
> +
>  open Printf
>  open Stdext
> 
> @@ -79,7 +82,7 @@
> 
>  (* packets *)
>  let do_debug con t domains cons data =
> -       if not !allow_debug
> +       if not (Connection.is_dom0 con) && not !allow_debug
>         then None
>         else try match split None '\000' data with
>         | "print" :: msg :: _ ->
> @@ -89,6 +92,9 @@
>                 let domid = int_of_string domid in
>                 let quota = (Store.get_quota t.Transaction.store) in
>                 Some (Quota.to_string quota domid ^ "\000")
> +       | "watches" :: _ ->
> +               let watches = Connections.debug cons in
> +               Some (watches ^ "\000")
>         | "mfn" :: domid :: _ ->
>                 let domid = int_of_string domid in
>                 let con = Connections.find_domain cons domid in
> @@ -357,8 +363,7 @@
>                         in
>                 input_handle_error ~cons ~doms ~fct ~ty ~con ~t ~rid ~data;
>         with exn ->
> -               Logs.error "general" "process packet: %s"
> -                         (Printexc.to_string exn);
> +               error "process packet: %s" (Printexc.to_string exn);
>                 Connection.send_error con tid rid "EIO"
> 
>  let write_access_log ~ty ~tid ~con ~data =
> @@ -372,7 +377,7 @@
>                 let packet = Connection.pop_in con in
>                 let tid, rid, ty, data = Xenbus.Xb.Packet.unpack packet in
>                 (* As we don't log IO, do not call an unnecessary sanitize_data
> -                  Logs.info "io" "[%s] -> [%d] %s \"%s\""
> +                  info "[%s] -> [%d] %s \"%s\""
>                          (Connection.get_domstr con) tid
>                          (Xenbus.Xb.Op.to_string ty) (sanitize_data data); *)
>                 process_packet ~store ~cons ~doms ~con ~tid ~rid ~ty ~data;
> @@ -386,7 +391,7 @@
>                         let packet = Connection.peek_output con in
>                         let tid, rid, ty, data = Xenbus.Xb.Packet.unpack packet in
>                         (* As we don't log IO, do not call an unnecessary sanitize_data
> -                          Logs.info "io" "[%s] <- %s \"%s\""
> +                          info "[%s] <- %s \"%s\""
>                                  (Connection.get_domstr con)
>                                  (Xenbus.Xb.Op.to_string ty) (sanitize_data data);*)
>                         write_answer_log ~ty ~tid ~con ~data;
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/quota.ml
> --- a/tools/ocaml/xenstored/quota.ml
> +++ b/tools/ocaml/xenstored/quota.ml
> @@ -18,7 +18,7 @@
>  exception Data_too_big
>  exception Transaction_opened
> 
> -let warn fmt = Logs.warn "general" fmt
> +let warn fmt = Logging.warn "quota" fmt
>  let activate = ref true
>  let maxent = ref (10000)
>  let maxsize = ref (4096)
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/store.ml
> --- a/tools/ocaml/xenstored/store.ml
> +++ b/tools/ocaml/xenstored/store.ml
> @@ -83,7 +83,7 @@
>  let check_owner node connection =
>         if not (Perms.check_owner connection node.perms)
>         then begin
> -               Logs.info "io" "Permission denied: Domain %d not owner" (get_owner node);
> +               Logging.info "store|node" "Permission denied: Domain %d not owner" (get_owner node);
>                 raise Define.Permission_denied;
>         end
> 
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/xenstored.conf
> --- a/tools/ocaml/xenstored/xenstored.conf
> +++ b/tools/ocaml/xenstored/xenstored.conf
> @@ -22,9 +22,14 @@
>  # Activate filed base backend
>  persistant = false
> 
> -# Logs
> -log = error;general;file:/var/log/xenstored.log
> -log = warn;general;file:/var/log/xenstored.log
> -log = info;general;file:/var/log/xenstored.log
> +# Xenstored logs
> +# xenstored-log-file = /var/log/xenstored.log
> +# xenstored-log-level = null
> +# xenstored-log-nb-files = 10
> 
> -# log = debug;io;file:/var/log/xenstored-io.log
> +# Xenstored access logs
> +# access-log-file = /var/log/xenstored-access.log
> +# access-log-nb-lines = 13215
> +# acesss-log-nb-chars = 180
> +# access-log-special-ops = false
> +
> diff -r f325cb3f37bd -r da67f075e413 tools/ocaml/xenstored/xenstored.ml
> --- a/tools/ocaml/xenstored/xenstored.ml
> +++ b/tools/ocaml/xenstored/xenstored.ml
> @@ -18,7 +18,10 @@
>  open Printf
>  open Parse_arg
>  open Stdext
> -open Logging
> +
> +let error fmt = Logging.error "xenstored" fmt
> +let debug fmt = Logging.debug "xenstored" fmt
> +let info fmt = Logging.info "xenstored" fmt
> 
>  (*------------ event klass processors --------------*)
>  let process_connection_fds store cons domains rset wset =
> @@ -64,7 +67,8 @@
>                 ()
> 
>  let sighup_handler _ =
> -       try Logs.reopen (); info "Log re-opened" with _ -> ()
> +       maybe (fun logger -> logger.Logging.restart()) !Logging.xenstored_logger;
> +       maybe (fun logger -> logger.Logging.restart()) !Logging.access_logger
> 
>  let config_filename cf =
>         match cf.config_file with
> @@ -75,26 +79,6 @@
> 
>  let parse_config filename =
>         let pidfile = ref default_pidfile in
> -       let set_log s =
> -               let ls = String.split ~limit:3 ';' s in
> -               let level, key, logger = match ls with
> -               | [ level; key; logger ] -> level, key, logger
> -               | _ -> failwith "format mismatch: expecting 3 arguments" in
> -
> -               let loglevel = match level with
> -               | "debug" -> Log.Debug
> -               | "info"  -> Log.Info
> -               | "warn"  -> Log.Warn
> -               | "error" -> Log.Error
> -               | s       -> failwith (sprintf "Unknown log level: %s" s) in
> -
> -               (* if key is empty, append to the default logger *)
> -               let append =
> -                       if key = "" then
> -                               Logs.append_default
> -                       else
> -                               Logs.append key in
> -               append loglevel logger in
>         let options = [
>                 ("merge-activate", Config.Set_bool Transaction.do_coalesce);
>                 ("perms-activate", Config.Set_bool Perms.activate);
> @@ -104,14 +88,20 @@
>                 ("quota-maxentity", Config.Set_int Quota.maxent);
>                 ("quota-maxsize", Config.Set_int Quota.maxsize);
>                 ("test-eagain", Config.Set_bool Transaction.test_eagain);
> -               ("log", Config.String set_log);
>                 ("persistant", Config.Set_bool Disk.enable);
> +               ("xenstored-log-file", Config.Set_string Logging.xenstored_log_file);
> +               ("xenstored-log-level", Config.String
> +                       (fun s -> Logging.xenstored_log_level := Logging.level_of_string s));
> +               ("xenstored-log-nb-files", Config.Set_int Logging.xenstored_log_nb_files);
> +               ("xenstored-log-nb-lines", Config.Set_int Logging.xenstored_log_nb_lines);
> +               ("xenstored-log-nb-chars", Config.Set_int Logging.xenstored_log_nb_chars);
>                 ("access-log-file", Config.Set_string Logging.access_log_file);
>                 ("access-log-nb-files", Config.Set_int Logging.access_log_nb_files);
>                 ("access-log-nb-lines", Config.Set_int Logging.access_log_nb_lines);
> -               ("access-log-read-ops", Config.Set_bool Logging.log_read_ops);
> -               ("access-log-transactions-ops", Config.Set_bool Logging.log_transaction_ops);
> -               ("access-log-special-ops", Config.Set_bool Logging.log_special_ops);
> +               ("access-log-nb-chars", Config.Set_int Logging.access_log_nb_chars);
> +               ("access-log-read-ops", Config.Set_bool Logging.access_log_read_ops);
> +               ("access-log-transactions-ops", Config.Set_bool Logging.access_log_transaction_ops);
> +               ("access-log-special-ops", Config.Set_bool Logging.access_log_special_ops);
>                 ("allow-debug", Config.Set_bool Process.allow_debug);
>                 ("pid-file", Config.Set_string pidfile); ] in
>         begin try Config.read filename options (fun _ _ -> raise Not_found)
> @@ -223,9 +213,6 @@
>  end
> 
>  let _ =
> -       printf "Xen Storage Daemon, version %d.%d\n%!"
> -              Define.xenstored_major Define.xenstored_minor;
> -
>         let cf = do_argv in
>         let pidfile =
>                 if Sys.file_exists (config_filename cf) then
> @@ -249,13 +236,13 @@
>                 in
> 
>         if cf.daemonize then
> -               Unixext.daemonize ();
> +               Unixext.daemonize ()
> +       else
> +               printf "Xen Storage Daemon, version %d.%d\n%!"
> +                       Define.xenstored_major Define.xenstored_minor;
> 
>         (try Unixext.pidfile_write pidfile with _ -> ());
> 
> -       info "Xen Storage Daemon, version %d.%d"
> -            Define.xenstored_major Define.xenstored_minor;
> -
>         (* for compatilibity with old xenstored *)
>         begin match cf.pidfile with
>         | Some pidfile -> Unixext.pidfile_write pidfile
> @@ -293,7 +280,14 @@
>         Sys.set_signal Sys.sigusr1 (Sys.Signal_handle (fun i -> sigusr1_handler store));
>         Sys.set_signal Sys.sigpipe Sys.Signal_ignore;
> 
> -       Logging.init cf.activate_access_log (fun () -> DB.to_file store cons "/var/run/xenstored/db");
> +       Logging.init_xenstored_log();
> +       if cf.activate_access_log then begin
> +               let post_rotate () = DB.to_file store cons "/var/run/xenstored/db" in
> +               Logging.init_access_log post_rotate
> +       end;
> +
> +       info "Xen Storage Daemon, version %d.%d"
> +            Define.xenstored_major Define.xenstored_minor;
> 
>         let spec_fds =
>                 (match rw_sock with None -> [] | Some x -> [ x ]) @
> 
> _______________________________________________
> 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 Oct 07 04:17:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 04:17:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC8Qa-0005Wp-7A; Fri, 07 Oct 2011 04:17:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC89X-0003Rw-52
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:59:49 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1317985162!52955080!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13910 invoked from network); 7 Oct 2011 10:59:22 -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;
	7 Oct 2011 10:59:22 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8270443"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 10:59:39 +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, 7 Oct 2011
	11:59:39 +0100
Subject: Re: [Xen-devel] [PATCH 6 of 6] [OCAML] Small improvement to the
	ocaml xenctrl library
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Date: Fri, 7 Oct 2011 11:59:38 +0100
In-Reply-To: <82d81b98b5dadb80853f.1317983164@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
	<82d81b98b5dadb80853f.1317983164@snoosnoo2.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: <1317985179.21903.323.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-10-07 at 11:26 +0100, Jon Ludlam wrote:
> Add a new field 'max_nr_cpus' to the physinfo type in the ocaml xc bindings
> 
> Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> diff -r fdca6d8c0c5a -r 82d81b98b5da tools/ocaml/libs/xc/xenctrl.ml
> --- a/tools/ocaml/libs/xc/xenctrl.ml
> +++ b/tools/ocaml/libs/xc/xenctrl.ml
> @@ -70,6 +70,7 @@
>  	scrub_pages      : nativeint;
>  	(* XXX hw_cap *)
>  	capabilities     : physinfo_cap_flag list;
> +	max_nr_cpus      : int;
>  }
>  
>  type version =
> diff -r fdca6d8c0c5a -r 82d81b98b5da tools/ocaml/libs/xc/xenctrl.mli
> --- a/tools/ocaml/libs/xc/xenctrl.mli
> +++ b/tools/ocaml/libs/xc/xenctrl.mli
> @@ -52,6 +52,7 @@
>    free_pages       : nativeint;
>    scrub_pages      : nativeint;
>    capabilities     : physinfo_cap_flag list;
> +  max_nr_cpus      : int; (** compile-time max possible number of nr_cpus *)
>  }
>  type version = { major : int; minor : int; extra : string; }
>  type compile_info = {
> diff -r fdca6d8c0c5a -r 82d81b98b5da tools/ocaml/libs/xc/xenctrl_stubs.c
> --- a/tools/ocaml/libs/xc/xenctrl_stubs.c
> +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
> @@ -534,6 +534,7 @@
>  
>  	if (retval)
>  		failwith_xc(_H(xch));
> +
>  	ring[size] = '\0';
>  	CAMLreturn(caml_copy_string(ring));
>  }
> @@ -573,7 +574,7 @@
>  		}
>  	}
>  
> -	physinfo = caml_alloc_tuple(9);
> +	physinfo = caml_alloc_tuple(10);
>  	Store_field(physinfo, 0, Val_int(c_physinfo.threads_per_core));
>  	Store_field(physinfo, 1, Val_int(c_physinfo.cores_per_socket));
>  	Store_field(physinfo, 2, Val_int(c_physinfo.nr_cpus));
> @@ -583,6 +584,7 @@
>  	Store_field(physinfo, 6, caml_copy_nativeint(c_physinfo.free_pages));
>  	Store_field(physinfo, 7, caml_copy_nativeint(c_physinfo.scrub_pages));
>  	Store_field(physinfo, 8, cap_list);
> +	Store_field(physinfo, 9, Val_int(c_physinfo.max_cpu_id + 1));
>  
>  	CAMLreturn(physinfo);
>  }
> 
> _______________________________________________
> 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 Oct 07 04:18:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 04:18:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC8Rg-0005t6-QZ; Fri, 07 Oct 2011 04:18:28 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC897-0003R9-Rp
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 03:59:45 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1317985154!107877!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22307 invoked from network); 7 Oct 2011 10:59:14 -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;
	7 Oct 2011 10:59:14 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312156800"; 
   d="scan'208";a="8270426"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 10:59:14 +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, 7 Oct 2011
	11:59:14 +0100
Subject: Re: [Xen-devel] [PATCH 5 of 6] [OCAML] Fix 2 bit-twiddling bugs and
	an off-by-one
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Date: Fri, 7 Oct 2011 11:59:14 +0100
In-Reply-To: <fdca6d8c0c5a3b69052f.1317983163@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
	<fdca6d8c0c5a3b69052f.1317983163@snoosnoo2.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: <1317985154.21903.322.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-10-07 at 11:26 +0100, Jon Ludlam wrote:
> The bit bugs are in ocaml vcpu affinity calls, and the off-by-one
> error is in the ocaml console ring code
> 
> Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
> Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> diff -r da67f075e413 -r fdca6d8c0c5a tools/ocaml/libs/xc/xenctrl_stubs.c
> --- a/tools/ocaml/libs/xc/xenctrl_stubs.c
> +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c
> @@ -430,7 +430,7 @@
>  
>  	for (i=0; i<len; i++) {
>  		if (Bool_val(Field(cpumap, i)))
> -			c_cpumap[i/8] |= i << (i&7);
> +			c_cpumap[i/8] |= 1 << (i&7);
>  	}
>  	retval = xc_vcpu_setaffinity(_H(xch), _D(domid),
>  	                             Int_val(vcpu), c_cpumap);
> @@ -466,7 +466,7 @@
>  	ret = caml_alloc(len, 0);
>  
>  	for (i=0; i<len; i++) {
> -		if (c_cpumap[i%8] & 1 << (i&7))
> +		if (c_cpumap[i/8] & 1 << (i&7))
>  			Store_field(ret, i, Val_true);
>  		else
>  			Store_field(ret, i, Val_false);
> @@ -523,7 +523,7 @@
>  
>  CAMLprim value stub_xc_readconsolering(value xch)
>  {
> -	unsigned int size = RING_SIZE;
> +	unsigned int size = RING_SIZE - 1;
>  	char *ring_ptr = ring;
>  
>  	CAMLparam1(xch);
> 
> _______________________________________________
> 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 Oct 07 04:19:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 04: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 1RC8Sn-0006Ft-Na; Fri, 07 Oct 2011 04:19:38 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC8DR-0003on-2C
	for Xen-devel@lists.xensource.com; Fri, 07 Oct 2011 04:03:48 -0700
X-Env-Sender: George.Dunlap@eu.citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1317985420!107977!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30774 invoked from network); 7 Oct 2011 11:03:41 -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;
	7 Oct 2011 11:03:41 -0000
X-IronPort-AV: E=Sophos;i="4.68,501,1312171200"; d="scan'208";a="18027153"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 07:03:39 -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, 7 Oct 2011 07:03:39 -0400
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 p97B3b6f028464;
	Fri, 7 Oct 2011 04:03:38 -0700
Subject: Re: [Xen-devel] [Project Idea]:-Want a guidance for the project
From: George Dunlap <george.dunlap@citrix.com>
To: Pratik shinde <pracshi@gmail.com>
In-Reply-To: <CAEAezkWMhFWrXknxSE5BUmk4dFB026pKVn8UWHdKo4d0tCswow@mail.gmail.com>
References: <CAEAezkVkfj7mFqEgK+crFZ7T1HAkFqL5rOeCe36JBeH+3=YX+A@mail.gmail.com>
	<CAFLBxZapnxsEiDJgxpS6UmJv8M0_jKg__mtrVPGDu-bZtKhSrg@mail.gmail.com>
	<CAEAezkVMuiugnNtSRyOo9ZD2DtpQnEU44BYXz6ZdKAKqa76Mnw@mail.gmail.com>
	<CAFLBxZZ2GZavNLerU+Wh3zwk=zwELqD6tD-8OVJnSQKS3y7mow@mail.gmail.com>
	<CAEAezkWMhFWrXknxSE5BUmk4dFB026pKVn8UWHdKo4d0tCswow@mail.gmail.com>
Content-Type: text/plain; charset="UTF-8"
Date: Fri, 7 Oct 2011 12:07:01 +0100
Message-ID: <1317985621.15843.87.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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-06 at 17:11 +0100, Pratik shinde wrote:
> Although is a challenging project and would be very interesting to do,
> if we decide to go ahead with it, 
> I'm concerned about just one other thing, i.e. does this have a strong
> use-case?
> As in, how much would this benefit the users of Xen, if they could
> have a co-scheduler? 

First of all, in the Xen community, "co-scheduling" has a different
meaning: it has to do with making the scheduler aware of the
relationship between a VM and its stubdomain, driver domain, or other
service domains.  So you should probably come up with a different term
for what you're trying to do.

Secondly, if you're thinkinking about getting your code into the
mainline Xen tree, there are two options: you could try to get gang
scheduling into the default scheduler, or you could try getting an
alternate scheduler added.  The bar for both would be pretty high.

Regarding getting gang scheduling into the default scheduler: Most of
the Xen developers think that gang scheduling isn't the right solution
to the problem, and that paravirtualization of guest synchronization
primitives is the right solution.  So to get changes made to the default
Xen scheduler, you'd have to make a convincing argument (including
extensive testing of multiple workloads) that gang scheduling would be
an improvement over the current situation.

Regarding getting in an alternate scheduler: You'd need to convince the
community that (1) there are a reasonable number of users who would want
to use it, and (2) that you are able and willing to maintain it going
forward.  If you were a company, that would not be difficult (see the
arinc scheduler, for example).  But since you are students, you
currently don't have any users, and most likely you will disappear after
your project is done.  Disappearing after your project is done is a
perfectly reasonable thing to do, but it does leave the community stuck
trying to support your code.

Gang scheduling would certainly teach you a lot about OSes and
scheduling, and so I'm sure it's a valuable learning tool.

If you want some other ideas for undergraduate-level projects, you might
look at the recent Google Summer-of-code suggestions, which can be found
here:
 http://wiki.xen.org/xenwiki/GSoC_2011_ideas

These are projects that are definitely valuable to the community.  How
much help you get will depend mostly on how likely we think you are to
be able to succeed. 

 -George


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 04:34:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 04:34:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC8h1-0006sh-4r; Fri, 07 Oct 2011 04:34:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC8g8-0006fe-Px
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 04:33:25 -0700
X-Env-Sender: agx@sigxcpu.org
X-Msg-Ref: server-13.tower-174.messagelabs.com!1317987200!34366271!1
X-Originating-IP: [87.79.238.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28400 invoked from network); 7 Oct 2011 11:33:21 -0000
Received: from static-87-79-238-240.netcologne.de (HELO honk.sigxcpu.org)
	(87.79.238.240)
	by server-13.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Oct 2011 11:33:21 -0000
Received: from localhost (localhost [127.0.0.1])
	by honk.sigxcpu.org (Postfix) with ESMTP id 243A29C003;
	Fri,  7 Oct 2011 13:33:20 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at honk.sigxcpu.org
Received: from honk.sigxcpu.org ([127.0.0.1])
	by localhost (honk.sigxcpu.org [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id U8uzTYLDNKEr; Fri,  7 Oct 2011 13:33:19 +0200 (CEST)
Received: by bogon.sigxcpu.org (Postfix, from userid 1000)
	id 075D651DBC; Fri,  7 Oct 2011 13:33:18 +0200 (CEST)
Date: Fri, 7 Oct 2011 13:33:17 +0200
From: Guido =?iso-8859-1?Q?G=FCnther?= <agx@sigxcpu.org>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] pygrub: add debug flag
Message-ID: <20111007113317.GA12379@bogon.sigxcpu.org>
References: <20111007084506.GA23628@bogon.sigxcpu.org>
	<1317980004.21903.315.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="h31gzZEtNLTqOjlF"
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <1317980004.21903.315.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
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


--h31gzZEtNLTqOjlF
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

On Fri, Oct 07, 2011 at 10:33:23AM +0100, Ian Campbell wrote:
> On Fri, 2011-10-07 at 09:45 +0100, Guido Günther wrote:
> > Debugging config file errors is tedious so help a bit by not silently
> > dropping parsing exceptions when --debug is given. Also intialize the
> > logging API at debug level in this case.
> 
> This looks fine but requires a Signed-off-line, per the DCO
> http://wiki.xen.org/xenwiki/SubmittingXenPatches
> 
> Acked-by: Ian Campbell <ian.campbell@citrix.com>
> 
> BTW another useful but not widely known debug feature is that you can
> run {Grub,ExtLinux}Conf.py directly passing a config file as a parameter
> and they will print out what they parse from it, or the errors as
> appropriate.

New version with Signed-off attached.
Cheers,
 -- Guido

--h31gzZEtNLTqOjlF
Content-Type: text/x-diff; charset=iso-8859-1
Content-Disposition: attachment; filename="0001-pygrub-add-debug-flag.patch"
Content-Transfer-Encoding: 8bit

>From 41ff0496852be86a43245beaaab0afd43a3a471a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
Date: Fri, 7 Oct 2011 10:35:06 +0200
Subject: [PATCH] pygrub: add debug flag
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Debugging config file errors is tedious so help a bit by not silently
dropping parsing exceptions when --debug is given. Also intialize the
logging API at debug level in this case.
Cheers,
 -- Guido

Signed-off-by: Guido Günther <agx@sigxcpu.org>
---
 tools/pygrub/src/pygrub |   12 ++++++++++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/tools/pygrub/src/pygrub b/tools/pygrub/src/pygrub
index 52b1823..5dc9405 100644
--- a/tools/pygrub/src/pygrub
+++ b/tools/pygrub/src/pygrub
@@ -13,7 +13,7 @@
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 #
 
-import os, sys, string, struct, tempfile, re
+import os, sys, string, struct, tempfile, re, traceback
 import copy
 import logging
 import platform
@@ -665,7 +665,7 @@ if __name__ == "__main__":
                                    ["quiet", "interactive", "not-really", "help", 
                                     "output=", "output-format=", "output-directory=",
                                     "entry=", "kernel=", 
-                                    "ramdisk=", "args=", "isconfig"])
+                                    "ramdisk=", "args=", "isconfig", "debug"])
     except getopt.GetoptError:
         usage()
         sys.exit(1)
@@ -679,6 +679,7 @@ if __name__ == "__main__":
     entry = None
     interactive = True
     isconfig = False
+    debug = False
     not_really = False
     output_format = "sxp"
     output_directory = "/var/run/xend/boot"
@@ -714,6 +715,8 @@ if __name__ == "__main__":
             interactive = False
         elif o in ("--isconfig",):
             isconfig = True
+        elif o in ("--debug",):
+            debug = True
         elif o in ("--output-format",):
             if a not in ["sxp", "simple", "simple0"]:
                 print "unkonwn output format %s" % a
@@ -723,6 +726,9 @@ if __name__ == "__main__":
         elif o in ("--output-directory",):
             output_directory = a
 
+    if debug:
+	logging.basicConfig(level=logging.DEBUG)
+
     if output is None or output == "-":
         fd = sys.stdout.fileno()
     else:
@@ -769,6 +775,8 @@ if __name__ == "__main__":
         except:
             # IOErrors raised by fsimage.open
             # RuntimeErrors raised by run_grub if no menu.lst present
+            if debug:
+		traceback.print_exc()
             fs = None
             continue
 
-- 
1.7.6.3


--h31gzZEtNLTqOjlF
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

--h31gzZEtNLTqOjlF--


From xen-devel-bounces@lists.xensource.com Fri Oct 07 04:50:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 04: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 1RC8wK-0007Y0-Bi; Fri, 07 Oct 2011 04:50:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC8vL-0007JC-Lf
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 04:49:08 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1317988143!34348690!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32160 invoked from network); 7 Oct 2011 11:49:04 -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;
	7 Oct 2011 11:49:04 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="166074640"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 07:49:02 -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, 7 Oct 2011 07:49:02 -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 p97Bn0qJ028571;	Fri, 7 Oct 2011 04:49:01 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Fri, 7 Oct 2011 12:48:52 +0100
Message-ID: <1317988132-17635-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>
Subject: [Xen-devel] [PATCH] 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 f38d4b4..34db29f 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 Fri Oct 07 05:11:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:11:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9Gy-0000uj-UT; Fri, 07 Oct 2011 05:11:28 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9GD-0000hZ-3A
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:10:41 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1317989400!51146494!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17933 invoked from network); 7 Oct 2011 12:10:01 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:10:01 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="18028385"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:10:35 -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, 7 Oct 2011 08:10:35 -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 p97CAXY1028631;	Fri, 7 Oct 2011 05:10:34 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Fri, 7 Oct 2011 13:10:12 +0100
Message-ID: <1317989418-25463-2-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 1/7] 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 key is /local/domain/$domid/dm-version.
This come with libxl__device_model_version_running helper function.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_create.c   |    5 +++++
 tools/libxl/libxl_internal.c |   19 +++++++++++++++++++
 tools/libxl/libxl_internal.h |    5 +++++
 3 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index e1e3258..3f33d90 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -175,6 +175,11 @@ int libxl__domain_build(libxl__gc *gc,
 
     gettimeofday(&start_time, NULL);
 
+    localents = libxl__calloc(gc, 3, sizeof (char *));
+    i = 0;
+    localents[i++] = "dm-version";
+    localents[i++] = libxl__strdup(gc, libxl_device_model_version_to_string(dm_info->device_model_version));
+
     switch (info->type) {
     case LIBXL_DOMAIN_TYPE_HVM:
         ret = libxl__build_hvm(gc, domid, info, dm_info, state);
diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
index 3b8a41f..e535c0c 100644
--- a/tools/libxl/libxl_internal.c
+++ b/tools/libxl/libxl_internal.c
@@ -318,3 +318,22 @@ 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__sprintf(gc, "/local/domain/%d/dm-version", domid);
+    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) {
+        return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL;
+    }
+    return value;
+}
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 935c899..4dd0f91 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -554,4 +554,9 @@ _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
-- 
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 Oct 07 05:12:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:12:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9I6-0001Hj-9p; Fri, 07 Oct 2011 05:12:38 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9GD-0000ha-Oc
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:10:42 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1317989400!51146494!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17977 invoked from network); 7 Oct 2011 12:10:02 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:10:02 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="18028386"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:10: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; Fri, 7 Oct 2011 08:10: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 p97CAXY3028631;	Fri, 7 Oct 2011 05:10:36 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Fri, 7 Oct 2011 13:10:14 +0100
Message-ID: <1317989418-25463-4-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 3/7] 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>
---
 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 5ab9acc..002fb13 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);
 }
 
 /*
@@ -428,7 +429,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 };
@@ -447,6 +448,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);
@@ -490,6 +495,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)
 {
@@ -497,7 +503,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;
     }
@@ -585,7 +591,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 Fri Oct 07 05:13:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:13:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9Ix-0001ee-Sq; Fri, 07 Oct 2011 05:13:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9GE-0000hb-Gi
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:10:43 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1317989400!51146494!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18055 invoked from network); 7 Oct 2011 12:10:03 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:10:03 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="18028391"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:10:38 -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, 7 Oct 2011 08:10:38 -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 p97CAXY4028631;	Fri, 7 Oct 2011 05:10:37 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Fri, 7 Oct 2011 13:10:15 +0100
Message-ID: <1317989418-25463-5-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 4/7] 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>
---
 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 002fb13..1594a4f 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;
@@ -437,6 +441,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) {
@@ -462,19 +467,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 Fri Oct 07 05:14:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:14:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9K8-000270-V6; Fri, 07 Oct 2011 05:14:44 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9GF-0000hc-Hs
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:10:44 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1317989400!51146494!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18139 invoked from network); 7 Oct 2011 12:10:04 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:10:04 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="18028393"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:10:40 -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, 7 Oct 2011 08:10:39 -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 p97CAXY5028631;	Fri, 7 Oct 2011 05:10:38 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Fri, 7 Oct 2011 13:10:16 +0100
Message-ID: <1317989418-25463-6-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 5/7] libxl_qmp,
	Return the callback return code in qmp_next.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

So, if there is an error in the answer given by QEMU, the function
qmp_synchronous_send while know.

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

diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index 1594a4f..cd3e4e4 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -233,6 +233,7 @@ static int qmp_handle_response(libxl__qmp_handler *qmp,
                                const libxl__json_object *resp)
 {
     libxl__qmp_message_type type = LIBXL__QMP_MESSAGE_TYPE_INVALID;
+    int rc = 0;
 
     type = qmp_response_type(qmp, resp);
     LIBXL__LOG(qmp->ctx, LIBXL__LOG_DEBUG,
@@ -241,14 +242,14 @@ 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);
+        rc = enable_qmp_capabilities(qmp);
         break;
     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,
+                rc = pp->callback(qmp,
                              libxl__json_map_get("return", resp, JSON_ANY),
                              pp->opaque);
             }
@@ -263,13 +264,13 @@ static int qmp_handle_response(libxl__qmp_handler *qmp,
     }
     case LIBXL__QMP_MESSAGE_TYPE_ERROR:
         qmp_handle_error_response(qmp, resp);
-        break;
+        return -1;
     case LIBXL__QMP_MESSAGE_TYPE_EVENT:
         break;
     case LIBXL__QMP_MESSAGE_TYPE_INVALID:
         return -1;
     }
-    return 0;
+    return rc;
 }
 
 /*
@@ -358,6 +359,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;
@@ -416,7 +418,7 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler *qmp)
                 s = end + 2;
 
                 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,
@@ -429,7 +431,7 @@ 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,
-- 
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 Oct 07 05:15:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:15:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9LH-0002Tg-5c; Fri, 07 Oct 2011 05:15:55 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9GH-0000hn-G5
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:10:46 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1317989400!51146494!5
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18383 invoked from network); 7 Oct 2011 12:10:06 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:10:06 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="18028394"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:10:41 -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, 7 Oct 2011 08:10:41 -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 p97CAXY7028631;	Fri, 7 Oct 2011 05:10:40 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Fri, 7 Oct 2011 13:10:18 +0100
Message-ID: <1317989418-25463-8-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 7/7] 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

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

diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 1523cf0..b6cb4a3 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -613,27 +613,43 @@ 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));
+        if (libxl__device_model_version_running(gc, domid)
+            == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
+            rc = libxl__qmp_pci_add(gc, domid, pcidev);
+        } else {
+            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));
+        }
         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 Fri Oct 07 05:17:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:17:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9MS-0002qv-HZ; Fri, 07 Oct 2011 05:17:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9GL-0000i0-R1
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:10:50 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1317989424!43492388!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22190 invoked from network); 7 Oct 2011 12:10:26 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:10:26 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="166077038"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:10:35 -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, 7 Oct 2011 08:10:35 -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 p97CAXY0028631;	Fri, 7 Oct 2011 05:10:33 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Fri, 7 Oct 2011 13:10:11 +0100
Message-ID: <1317989418-25463-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>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 0/7] 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 improve the QMP client in lib XenLight to be able to insert a
PCI passthrough device with the upstream QEMU. This require to apply the patch
(RFC) series post earlier this week for QEMU.

The first patch create a key in xenstore with the version of the running device
model, here: /local/domain/$domid/dm-version

The patch series require one patch from Ian:
"libxl: IDL: autogenerate functions to produce JSON from libxl data structures"

Anthony PERARD (7):
  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, Return the callback return code in qmp_next.
  libxl_qmp, Introduce libxl__qmp_pci_add.
  libxl, Use QMP to insert a passthrough device when using upstream
    QEMU

 tools/libxl/libxl_create.c   |    5 ++
 tools/libxl/libxl_internal.c |   19 +++++
 tools/libxl/libxl_internal.h |    7 ++
 tools/libxl/libxl_pci.c      |   58 ++++++++++------
 tools/libxl/libxl_qmp.c      |  164 ++++++++++++++++++++++++++++++++++-------
 5 files changed, 204 insertions(+), 49 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 Fri Oct 07 05:18:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:18:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9NO-0003Dd-U8; Fri, 07 Oct 2011 05:18:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9GM-0000i1-Dt
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:10:51 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1317989424!43492388!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22217 invoked from network); 7 Oct 2011 12:10:26 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:10:26 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="166077042"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:10: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; Fri, 7 Oct 2011 08:10:36 -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 p97CAXY2028631;	Fri, 7 Oct 2011 05:10:35 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Fri, 7 Oct 2011 13:10:13 +0100
Message-ID: <1317989418-25463-3-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 2/7] 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>
---
 tools/libxl/libxl_qmp.c |   29 +++++++++++++++++++----------
 1 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index 34db29f..5ab9acc 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;
@@ -423,7 +428,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;
@@ -461,6 +467,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);
     }
 
@@ -483,13 +490,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;
     }
@@ -579,6 +587,7 @@ int libxl__qmp_query_serial(libxl__qmp_handler *qmp)
 {
     return qmp_synchronous_send(qmp, "query-chardev",
                                 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 Fri Oct 07 05:19:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:19:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9OG-0003Zz-F7; Fri, 07 Oct 2011 05:19:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9GO-0000iH-5U
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:10:53 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1317989424!43492388!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22326 invoked from network); 7 Oct 2011 12:10:28 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:10:28 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="166077056"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 08:10:41 -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, 7 Oct 2011 08:10:40 -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 p97CAXY6028631;	Fri, 7 Oct 2011 05:10:39 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Fri, 7 Oct 2011 13:10:17 +0100
Message-ID: <1317989418-25463-7-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 6/7] 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 |    2 +
 tools/libxl/libxl_qmp.c      |   89 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 91 insertions(+), 0 deletions(-)

diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 4dd0f91..78e1be2 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -119,6 +119,7 @@ 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 AUTO_PHP_SLOT          0x100
 #define SYSFS_PCI_DEV          "/sys/bus/pci/devices"
 #define SYSFS_PCIBACK_DRIVER   "/sys/bus/pci/drivers/pciback"
@@ -444,6 +445,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 cd3e4e4..c39a1ac 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,
@@ -601,6 +602,94 @@ int libxl__qmp_query_serial(libxl__qmp_handler *qmp)
                                 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);
+    args = libxl__xs_kvs_of_flexarray(gc, parameters, 6);
+    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 Fri Oct 07 05:20:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:20:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9PM-00042q-Mi; Fri, 07 Oct 2011 05:20:08 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9NZ-0003HR-BH
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:18:17 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1317989893!118670!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32052 invoked from network); 7 Oct 2011 12:18:14 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-3.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:18:14 -0000
Received: by qyg14 with SMTP id 14so3617632qyg.9
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 05:18:12 -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=K/gJWrzPDYtr4LTtZ/uKUB/YrcuE+4jddxYeeJDWI8A=;
	b=UMyi88rTplLIsWBGqpdj8pN3C4keNsYgPbTkyjQQvkEhWjoLM12mDugAa558Ba1dQ9
	KLThjRE/VTjEyUglG7VsQBy26wPP7J7t4rXueBXZdKaJJawaXtIgc3PJDZgyfLql7SXY
	rJF43q5k0ArBPeFUfgtxXym2wyJ71uoiDnmbY=
MIME-Version: 1.0
Received: by 10.68.34.138 with SMTP id z10mr13666993pbi.105.1317989892148;
	Fri, 07 Oct 2011 05:18:12 -0700 (PDT)
Received: by 10.142.154.18 with HTTP; Fri, 7 Oct 2011 05:18:12 -0700 (PDT)
In-Reply-To: <ec28ee6dace513c3d009.1317389607@localhost.localdomain>
References: <patchbomb.1317389593@localhost.localdomain>
	<ec28ee6dace513c3d009.1317389607@localhost.localdomain>
Date: Fri, 7 Oct 2011 14:18:12 +0200
X-Google-Sender-Auth: xuyIMoP32YYYc51cajfHxo9zlBQ
Message-ID: <CAPLaKK6xV33vHe8eEm3_fF7Z-3NrY=VdM8Wst4K6qzwr+=cxEg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 14 of 23] libxl: use libxl__device in
	libxl_devices_destroy and libxl__device_pci_remove_xenstore
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
Content-Transfer-Encoding: quoted-printable
Cc: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>,
	Jim Fehlig <jfehlig@novell.com>, xen-devel@lists.xensource.com,
	Mike McClurg <mike.mcclurg@citrix.com>,
	Dave Scott <Dave.Scott@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/9/30 Ian Campbell <ian.campbell@citrix.com>:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1317389248 -3600
> # Node ID ec28ee6dace513c3d009d498341f9537a19b2d98
> # Parent =C2=A0e5a70a3b61a1acfa7d73db548a591486024d01b7
> libxl: use libxl__device in libxl_devices_destroy and libxl__device_pci_r=
emove_xenstore
>
> Doing this allows us to use the common functions for removing devices.
>
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
>
> diff -r e5a70a3b61a1 -r ec28ee6dace5 tools/libxl/libxl_device.c
> --- a/tools/libxl/libxl_device.c =C2=A0 =C2=A0 =C2=A0 =C2=A0Fri Sep 30 14=
:27:28 2011 +0100
> +++ b/tools/libxl/libxl_device.c =C2=A0 =C2=A0 =C2=A0 =C2=A0Fri Sep 30 14=
:27:28 2011 +0100
> @@ -49,6 +49,25 @@ char *libxl__device_backend_path(libxl__
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 device->domid, device->devid);
> =C2=A0}
>
> +int libxl__parse_backend_path(libxl__gc *gc,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0const char *path,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__device *dev)
> +{
> + =C2=A0 =C2=A0/* /local/domain/<domid>/backend/<kind>/<domid>/<devid> */
> + =C2=A0 =C2=A0char strkind[16]; /* Longest is actually "console" */
> + =C2=A0 =C2=A0uint32_t domain;
> + =C2=A0 =C2=A0int rc =3D sscanf(path, "/local/domain/%d/backend/%15[^/]/=
%d/%d",
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&d=
ev->backend_domid,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0st=
rkind,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&d=
omain,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&d=
ev->backend_devid);
> +
> + =C2=A0 =C2=A0if (rc !=3D 4)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return ERROR_FAIL;
> +
> + =C2=A0 =C2=A0return libxl__device_kind_from_string(strkind, &dev->backe=
nd_kind);
> +}
> +
> =C2=A0int libxl__device_generic_add(libxl__gc *gc, libxl__device *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=A0 =C2=A0 =C2=A0char **bents, char **fents)
> =C2=A0{
> @@ -348,10 +367,11 @@ int libxl__device_disk_dev_number(const
> =C2=A0 =C2=A0 return -1;
> =C2=A0}
>
> -int libxl__device_remove(libxl__gc *gc, char *be_path)
> +int libxl__device_remove(libxl__gc *gc, libxl__device *dev)
> =C2=A0{
> =C2=A0 =C2=A0 libxl_ctx *ctx =3D libxl__gc_owner(gc);
> =C2=A0 =C2=A0 xs_transaction_t t;
> + =C2=A0 =C2=A0char *be_path =3D libxl__device_backend_path(gc, dev);
> =C2=A0 =C2=A0 char *state_path =3D libxl__sprintf(gc, "%s/state", be_path=
);
> =C2=A0 =C2=A0 char *state =3D libxl__xs_read(gc, XBT_NULL, state_path);
> =C2=A0 =C2=A0 int rc =3D 0;
> @@ -429,10 +449,12 @@ static int wait_for_dev_destroy(libxl__g
> =C2=A0int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force=
)
> =C2=A0{
> =C2=A0 =C2=A0 libxl_ctx *ctx =3D libxl__gc_owner(gc);
> - =C2=A0 =C2=A0char *path, *be_path, *fe_path;
> + =C2=A0 =C2=A0char *path;
> =C2=A0 =C2=A0 unsigned int num1, num2;
> =C2=A0 =C2=A0 char **l1 =3D NULL, **l2 =3D NULL;
> =C2=A0 =C2=A0 int i, j, n_watches =3D 0;
> + =C2=A0 =C2=A0libxl__device dev;
> + =C2=A0 =C2=A0libxl__device_kind kind;
>
> =C2=A0 =C2=A0 path =3D libxl__sprintf(gc, "/local/domain/%d/device", domi=
d);
> =C2=A0 =C2=A0 l1 =3D libxl__xs_directory(gc, XBT_NULL, path, &num1);
> @@ -445,22 +467,27 @@ int libxl__devices_destroy(libxl__gc *gc
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 num1 =3D 0;
> =C2=A0 =C2=A0 }
> =C2=A0 =C2=A0 for (i =3D 0; i < num1; i++) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (!strcmp("vfs", l1[i]))
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (libxl__device_kind_from_string(l1[i], &k=
ind))
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0continue;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (kind =3D=3D LIBXL__DEVICE_KIND_VBD)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 continue;

This should not be there, or hotplug scripts for VBD device types are
not called. I know Linux doesn't need to call hotplug scripts for VBD,
but NetBSD does. Should we add some kind of helper function or ifdef,
or is it safe to remove this and handle VBD devices normally?

> =C2=A0 =C2=A0 =C2=A0 =C2=A0 path =3D libxl__sprintf(gc, "/local/domain/%d=
/device/%s", domid, l1[i]);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 l2 =3D libxl__xs_directory(gc, XBT_NULL, path=
, &num2);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!l2)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 continue;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 for (j =3D 0; j < num2; j++) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fe_path =3D libxl__sprintf(gc,=
 "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0be_path =3D libxl__xs_read(gc,=
 XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (be_path !=3D NULL) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0path =3D libxl__sprintf(gc, "/=
local/domain/%d/device/%s/%s/backend",
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0domid, l1[i], l2[j]);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0path =3D libxl__xs_read(gc, XB=
T_NULL, libxl__sprintf(gc, path));
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (path && libxl__parse_backe=
nd_path(gc, path, &dev) =3D=3D 0) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0dev.domid =3D do=
mid;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0dev.kind =3D kin=
d;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0dev.devid =3D at=
oi(l2[j]);
> +
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (force) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xs=
_rm(ctx->xsh, XBT_NULL, be_path);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xs=
_rm(ctx->xsh, XBT_NULL, fe_path);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0li=
bxl__device_destroy_tapdisk(gc, be_path);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0li=
bxl__device_force_remove(gc, &dev);
> =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 =C2=A0 =C2=A0 =C2=A0 =C2=A0if=
 (libxl__device_remove(gc, be_path) > 0)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if=
 (libxl__device_remove(gc, &dev) > 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 n_watches++;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> @@ -468,14 +495,18 @@ int libxl__devices_destroy(libxl__gc *gc
> =C2=A0 =C2=A0 }
>
> =C2=A0 =C2=A0 /* console 0 frontend directory is not under /local/domain/=
<domid>/device */
> - =C2=A0 =C2=A0fe_path =3D libxl__sprintf(gc, "/local/domain/%d/console",=
 domid);
> - =C2=A0 =C2=A0be_path =3D libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc=
, "%s/backend", fe_path));
> - =C2=A0 =C2=A0if (be_path && strcmp(be_path, "")) {
> + =C2=A0 =C2=A0path =3D libxl__sprintf(gc, "/local/domain/%d/console/back=
end", domid);
> + =C2=A0 =C2=A0path =3D libxl__xs_read(gc, XBT_NULL, path);
> + =C2=A0 =C2=A0if (path && strcmp(path, "") &&
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__parse_backend_path(gc, path, &dev) =
=3D=3D 0) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0dev.domid =3D domid;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0dev.kind =3D LIBXL__DEVICE_KIND_CONSOLE;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0dev.devid =3D 0;
> +
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (force) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, be_p=
ath);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, fe_p=
ath);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__device_force_remove(gc,=
 &dev);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (libxl__device_remove(gc, b=
e_path) > 0)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (libxl__device_remove(gc, &=
dev) > 0)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 n_watches++;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> =C2=A0 =C2=A0 }
> @@ -505,12 +536,9 @@ int libxl__device_del(libxl__gc *gc, lib
> =C2=A0{
> =C2=A0 =C2=A0 libxl_ctx *ctx =3D libxl__gc_owner(gc);
> =C2=A0 =C2=A0 struct timeval tv;
> - =C2=A0 =C2=A0char *backend_path;
> =C2=A0 =C2=A0 int rc;
>
> - =C2=A0 =C2=A0backend_path =3D libxl__device_backend_path(gc, dev);
> -
> - =C2=A0 =C2=A0rc =3D libxl__device_remove(gc, backend_path);
> + =C2=A0 =C2=A0rc =3D libxl__device_remove(gc, dev);
> =C2=A0 =C2=A0 if (rc =3D=3D -1) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 rc =3D ERROR_FAIL;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto out;
> diff -r e5a70a3b61a1 -r ec28ee6dace5 tools/libxl/libxl_internal.h
> --- a/tools/libxl/libxl_internal.h =C2=A0 =C2=A0 =C2=A0Fri Sep 30 14:27:2=
8 2011 +0100
> +++ b/tools/libxl/libxl_internal.h =C2=A0 =C2=A0 =C2=A0Fri Sep 30 14:27:2=
8 2011 +0100
> @@ -240,8 +240,10 @@ _hidden int libxl__device_generic_add(li
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0char **bents, char **fents);
> =C2=A0_hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__devi=
ce *device);
> =C2=A0_hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__dev=
ice *device);
> +_hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__device=
 *dev);
> =C2=A0_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
> -_hidden int libxl__device_remove(libxl__gc *gc, char *be_path);
> +_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev);
> =C2=A0_hidden int libxl__device_force_remove(libxl__gc *gc, libxl__device=
 *dev);
> =C2=A0_hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, i=
nt force);
> =C2=A0_hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, c=
har *state);
> diff -r e5a70a3b61a1 -r ec28ee6dace5 tools/libxl/libxl_pci.c
> --- a/tools/libxl/libxl_pci.c =C2=A0 Fri Sep 30 14:27:28 2011 +0100
> +++ b/tools/libxl/libxl_pci.c =C2=A0 Fri Sep 30 14:27:28 2011 +0100
> @@ -410,9 +410,15 @@ retry_transaction2:
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto retry_transaction2;
>
> =C2=A0 =C2=A0 if (num =3D=3D 1) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0char *fe_path =3D libxl__xs_read(gc, XBT_NUL=
L, libxl__sprintf(gc, "%s/frontend", be_path));
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, be_path);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, fe_path);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__device dev;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (libxl__parse_backend_path(gc, be_path, &=
dev) !=3D 0)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return ERROR_FAIL;
> +
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0dev.domid =3D domid;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0dev.kind =3D LIBXL__DEVICE_KIND_PCI;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0dev.devid =3D 0;
> +
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__device_force_remove(gc, &dev);
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 return 0;
> =C2=A0 =C2=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 Fri Oct 07 05:25:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:25:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9UH-0004WX-JM; Fri, 07 Oct 2011 05:25:13 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9TX-0004Ig-8f
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:24:27 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1317990151!39337816!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23894 invoked from network); 7 Oct 2011 12:22:31 -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;
	7 Oct 2011 12:22:31 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8272492"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 12:24: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; Fri, 7 Oct 2011
	13:24:24 +0100
Subject: Re: [Xen-devel] [PATCH 14 of 23] libxl: use libxl__device in
	libxl_devices_destroy and libxl__device_pci_remove_xenstore
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Fri, 7 Oct 2011 13:24:23 +0100
In-Reply-To: <CAPLaKK6xV33vHe8eEm3_fF7Z-3NrY=VdM8Wst4K6qzwr+=cxEg@mail.gmail.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<ec28ee6dace513c3d009.1317389607@localhost.localdomain>
	<CAPLaKK6xV33vHe8eEm3_fF7Z-3NrY=VdM8Wst4K6qzwr+=cxEg@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317990263.21903.328.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>, Jim
	Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Mike McClurg <mike.mcclurg@citrix.com>, Dave
	Scott <Dave.Scott@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, 2011-10-07 at 13:18 +0100, Roger Pau MonnÃ© wrote:
> 2011/9/30 Ian Campbell <ian.campbell@citrix.com>:

> > @@ -445,22 +467,27 @@ int libxl__devices_destroy(libxl__gc *gc
> >         num1 = 0;
> >     }
> >     for (i = 0; i < num1; i++) {
> > -        if (!strcmp("vfs", l1[i]))
> > +        if (libxl__device_kind_from_string(l1[i], &kind))
> > +            continue;
> > +        if (kind == LIBXL__DEVICE_KIND_VBD)
> >             continue;
> 
> This should not be there, or hotplug scripts for VBD device types are
> not called. I know Linux doesn't need to call hotplug scripts for VBD,
> but NetBSD does. Should we add some kind of helper function or ifdef,
> or is it safe to remove this and handle VBD devices normally?

This is a bug -- I removed a check for "vfs" and replaced it with one
for "vbd" which is not the same!

"vfs" was the fs-backend thing which was remove by 22716:3c78729b6f06 so
I think the check can just be removed and I will do so in the next
posting.


Ian
> 
> >         path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, l1[i]);
> >         l2 = libxl__xs_directory(gc, XBT_NULL, path, &num2);
> >         if (!l2)
> >             continue;
> >         for (j = 0; j < num2; j++) {
> > -            fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]);
> > -            be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
> > -            if (be_path != NULL) {
> > +            path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s/backend",
> > +                                  domid, l1[i], l2[j]);
> > +            path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, path));
> > +            if (path && libxl__parse_backend_path(gc, path, &dev) == 0) {
> > +                dev.domid = domid;
> > +                dev.kind = kind;
> > +                dev.devid = atoi(l2[j]);
> > +
> >                 if (force) {
> > -                    xs_rm(ctx->xsh, XBT_NULL, be_path);
> > -                    xs_rm(ctx->xsh, XBT_NULL, fe_path);
> > -                    libxl__device_destroy_tapdisk(gc, be_path);
> > +                    libxl__device_force_remove(gc, &dev);
> >                 } else {
> > -                    if (libxl__device_remove(gc, be_path) > 0)
> > +                    if (libxl__device_remove(gc, &dev) > 0)
> >                         n_watches++;
> >                 }
> >             }
> > @@ -468,14 +495,18 @@ int libxl__devices_destroy(libxl__gc *gc
> >     }
> >
> >     /* console 0 frontend directory is not under /local/domain/<domid>/device */
> > -    fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid);
> > -    be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
> > -    if (be_path && strcmp(be_path, "")) {
> > +    path = libxl__sprintf(gc, "/local/domain/%d/console/backend", domid);
> > +    path = libxl__xs_read(gc, XBT_NULL, path);
> > +    if (path && strcmp(path, "") &&
> > +        libxl__parse_backend_path(gc, path, &dev) == 0) {
> > +        dev.domid = domid;
> > +        dev.kind = LIBXL__DEVICE_KIND_CONSOLE;
> > +        dev.devid = 0;
> > +
> >         if (force) {
> > -            xs_rm(ctx->xsh, XBT_NULL, be_path);
> > -            xs_rm(ctx->xsh, XBT_NULL, fe_path);
> > +            libxl__device_force_remove(gc, &dev);
> >         } else {
> > -            if (libxl__device_remove(gc, be_path) > 0)
> > +            if (libxl__device_remove(gc, &dev) > 0)
> >                 n_watches++;
> >         }
> >     }
> > @@ -505,12 +536,9 @@ int libxl__device_del(libxl__gc *gc, lib
> >  {
> >     libxl_ctx *ctx = libxl__gc_owner(gc);
> >     struct timeval tv;
> > -    char *backend_path;
> >     int rc;
> >
> > -    backend_path = libxl__device_backend_path(gc, dev);
> > -
> > -    rc = libxl__device_remove(gc, backend_path);
> > +    rc = libxl__device_remove(gc, dev);
> >     if (rc == -1) {
> >         rc = ERROR_FAIL;
> >         goto out;
> > diff -r e5a70a3b61a1 -r ec28ee6dace5 tools/libxl/libxl_internal.h
> > --- a/tools/libxl/libxl_internal.h      Fri Sep 30 14:27:28 2011 +0100
> > +++ b/tools/libxl/libxl_internal.h      Fri Sep 30 14:27:28 2011 +0100
> > @@ -240,8 +240,10 @@ _hidden int libxl__device_generic_add(li
> >                              char **bents, char **fents);
> >  _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device);
> >  _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device);
> > +_hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path,
> > +                                      libxl__device *dev);
> >  _hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
> > -_hidden int libxl__device_remove(libxl__gc *gc, char *be_path);
> > +_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev);
> >  _hidden int libxl__device_force_remove(libxl__gc *gc, libxl__device *dev);
> >  _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
> >  _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);
> > diff -r e5a70a3b61a1 -r ec28ee6dace5 tools/libxl/libxl_pci.c
> > --- a/tools/libxl/libxl_pci.c   Fri Sep 30 14:27:28 2011 +0100
> > +++ b/tools/libxl/libxl_pci.c   Fri Sep 30 14:27:28 2011 +0100
> > @@ -410,9 +410,15 @@ retry_transaction2:
> >             goto retry_transaction2;
> >
> >     if (num == 1) {
> > -        char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path));
> > -        xs_rm(ctx->xsh, XBT_NULL, be_path);
> > -        xs_rm(ctx->xsh, XBT_NULL, fe_path);
> > +        libxl__device dev;
> > +        if (libxl__parse_backend_path(gc, be_path, &dev) != 0)
> > +            return ERROR_FAIL;
> > +
> > +        dev.domid = domid;
> > +        dev.kind = LIBXL__DEVICE_KIND_PCI;
> > +        dev.devid = 0;
> > +
> > +        libxl__device_force_remove(gc, &dev);
> >         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 Fri Oct 07 05:26:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:26:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9Vh-0004xY-5T; Fri, 07 Oct 2011 05:26:41 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9V6-0004jQ-Vw
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:26:05 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1317990361!101946!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29806 invoked from network); 7 Oct 2011 12:26:01 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:26:01 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8272529"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 12:26: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; Fri, 7 Oct 2011
	13:26:01 +0100
Subject: Re: [Xen-devel] [PATCH 14 of 23] libxl: use libxl__device in
	libxl_devices_destroy and libxl__device_pci_remove_xenstore
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Fri, 7 Oct 2011 13:26:01 +0100
In-Reply-To: <1317990263.21903.328.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<ec28ee6dace513c3d009.1317389607@localhost.localdomain>
	<CAPLaKK6xV33vHe8eEm3_fF7Z-3NrY=VdM8Wst4K6qzwr+=cxEg@mail.gmail.com>
	<1317990263.21903.328.camel@zakaz.uk.xensource.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1317990361.21903.329.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Jim Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Scott <Dave.Scott@eu.citrix.com>, Mike McClurg <mike.mcclurg@citrix.com>,
	Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>, Dave
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 13:24 +0100, Ian Campbell wrote:
> On Fri, 2011-10-07 at 13:18 +0100, Roger Pau MonnÃ© wrote:
> > 2011/9/30 Ian Campbell <ian.campbell@citrix.com>:
> 
> > > @@ -445,22 +467,27 @@ int libxl__devices_destroy(libxl__gc *gc
> > >         num1 = 0;
> > >     }
> > >     for (i = 0; i < num1; i++) {
> > > -        if (!strcmp("vfs", l1[i]))
> > > +        if (libxl__device_kind_from_string(l1[i], &kind))
> > > +            continue;
> > > +        if (kind == LIBXL__DEVICE_KIND_VBD)
> > >             continue;
> > 
> > This should not be there, or hotplug scripts for VBD device types are
> > not called. I know Linux doesn't need to call hotplug scripts for VBD,
> > but NetBSD does. Should we add some kind of helper function or ifdef,
> > or is it safe to remove this and handle VBD devices normally?
> 
> This is a bug -- I removed a check for "vfs" and replaced it with one
> for "vbd" which is not the same!
> 
> "vfs" was the fs-backend thing which was remove by 22716:3c78729b6f06 so
> I think the check can just be removed and I will do so in the next
> posting

incremental version:

diff -r 2bf50dc113d4 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Fri Oct 07 13:24:45 2011 +0100
+++ b/tools/libxl/libxl_device.c	Fri Oct 07 13:25:28 2011 +0100
@@ -469,8 +469,6 @@ int libxl__devices_destroy(libxl__gc *gc
     for (i = 0; i < num1; i++) {
         if (libxl__device_kind_from_string(l1[i], &kind))
             continue;
-        if (kind == LIBXL__DEVICE_KIND_VBD)
-            continue;
         path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, l1[i]);
         l2 = libxl__xs_directory(gc, XBT_NULL, path, &num2);
         if (!l2)



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 05:28:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:28:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9Xu-0005M8-2W; Fri, 07 Oct 2011 05:28:58 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9XG-00059s-DW
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:28:18 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1317990481!43262624!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7626 invoked from network); 7 Oct 2011 12:28:01 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:28:01 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8272580"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 12:28:15 +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, 7 Oct 2011
	13:28:15 +0100
Subject: Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Fri, 7 Oct 2011 13:28:15 +0100
In-Reply-To: <1317989418-25463-2-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-2-git-send-email-anthony.perard@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: <1317990495.21903.331.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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 Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
> The key is /local/domain/$domid/dm-version.

I've been wondering if we should introduce /libxl/$domid/ as a place for
keeping tooltack internal droppings like this. The danger with putting
stuff in /local/domain is that domains come to rely on them.

> This come with libxl__device_model_version_running helper function.
> 
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  tools/libxl/libxl_create.c   |    5 +++++
>  tools/libxl/libxl_internal.c |   19 +++++++++++++++++++
>  tools/libxl/libxl_internal.h |    5 +++++
>  3 files changed, 29 insertions(+), 0 deletions(-)
> 
> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
> index e1e3258..3f33d90 100644
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -175,6 +175,11 @@ int libxl__domain_build(libxl__gc *gc,
>  
>      gettimeofday(&start_time, NULL);
>  
> +    localents = libxl__calloc(gc, 3, sizeof (char *));
> +    i = 0;
> +    localents[i++] = "dm-version";
> +    localents[i++] = libxl__strdup(gc, libxl_device_model_version_to_string(dm_info->device_model_version));
> +

You don't seem to use this anywhere?

>      switch (info->type) {
>      case LIBXL_DOMAIN_TYPE_HVM:
>          ret = libxl__build_hvm(gc, domid, info, dm_info, state);
> diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
> index 3b8a41f..e535c0c 100644
> --- a/tools/libxl/libxl_internal.c
> +++ b/tools/libxl/libxl_internal.c
> @@ -318,3 +318,22 @@ 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__sprintf(gc, "/local/domain/%d/dm-version", domid);
> +    dm_version = libxl__xs_read(gc, XBT_NULL, path);
> +    if (!dm_version) {

This would be a bug, since it would imply an inconsistent version of
libxl was used to create the domain? (not sure what our policy around
this actually is / should be).

> +        return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL;
> +    }
> +
> +    if (libxl_device_model_version_from_string(dm_version, &value) < 0) {
> +        return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL;
> +    }
> +    return value;
> +}
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 935c899..4dd0f91 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -554,4 +554,9 @@ _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



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 05:30:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:30:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9ZJ-0005pZ-SO; Fri, 07 Oct 2011 05:30:25 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9Xy-0005Mv-62
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:29:02 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1317990518!41276758!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31054 invoked from network); 7 Oct 2011 12:28:38 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 12:28:38 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8272607"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 12:28:58 +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, 7 Oct 2011
	13:28:58 +0100
Subject: Re: [Xen-devel] [PATCH 2/7] libxl_qmp,	Introduce an opaque argument
	to the callbacks.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Fri, 7 Oct 2011 13:28:58 +0100
In-Reply-To: <1317989418-25463-3-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-3-git-send-email-anthony.perard@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: <1317990538.21903.332.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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 Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>

> ---
>  tools/libxl/libxl_qmp.c |   29 +++++++++++++++++++----------
>  1 files changed, 19 insertions(+), 10 deletions(-)
> 
> diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
> index 34db29f..5ab9acc 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;
> @@ -423,7 +428,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;
> @@ -461,6 +467,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);
>      }
>  
> @@ -483,13 +490,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;
>      }
> @@ -579,6 +587,7 @@ int libxl__qmp_query_serial(libxl__qmp_handler *qmp)
>  {
>      return qmp_synchronous_send(qmp, "query-chardev",
>                                  register_serials_chardev_callback,
> +                                NULL,
>                                  qmp->timeout);
>  }
>  



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 05:31:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:31:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9a7-0006CH-Px; Fri, 07 Oct 2011 05:31:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9Yp-0005d1-4G
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:29:55 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1317990591!18573831!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24348 invoked from network); 7 Oct 2011 12:29:51 -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;
	7 Oct 2011 12:29:51 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8272633"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 12:29: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; Fri, 7 Oct 2011
	13:29:51 +0100
Subject: Re: [Xen-devel] [PATCH 3/7] libxl_qmp,	Introduce list of arguments
	to qmp_send
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Fri, 7 Oct 2011 13:29:51 +0100
In-Reply-To: <1317989418-25463-4-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-4-git-send-email-anthony.perard@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: <1317990591.21903.333.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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 Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
> 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 5ab9acc..002fb13 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);
>  }
>  
>  /*
> @@ -428,7 +429,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 };
> @@ -447,6 +448,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);
> @@ -490,6 +495,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)
>  {
> @@ -497,7 +503,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;
>      }
> @@ -585,7 +591,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);



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 05:33:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:33:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9cJ-0006cm-En; Fri, 07 Oct 2011 05:33:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9bq-0006PS-UP
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:33:03 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1317990777!37116534!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9635 invoked from network); 7 Oct 2011 12:32:57 -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;
	7 Oct 2011 12:32:57 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8272713"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 12:32:59 +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, 7 Oct 2011
	13:33:00 +0100
Subject: Re: [Xen-devel] [PATCH 4/7] libxl_qmp,	Always insert a command id
	in the callback_list.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Fri, 7 Oct 2011 13:32:59 +0100
In-Reply-To: <1317989418-25463-5-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-5-git-send-email-anthony.perard@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: <1317990779.21903.335.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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 Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
> 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 002fb13..1594a4f 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;
> @@ -437,6 +441,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) {
> @@ -462,19 +467,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);
>  



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 05:37:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:37:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9fi-0007lE-Ua; Fri, 07 Oct 2011 05:37:02 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9fD-0007Vu-Vb
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:36:33 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1317990966!52214427!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9082 invoked from network); 7 Oct 2011 12:36:06 -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;
	7 Oct 2011 12:36:06 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8272812"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 12:36: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; Fri, 7 Oct 2011
	13:36:28 +0100
Subject: Re: [Xen-devel] [PATCH 5/7] libxl_qmp,	Return the callback return
	code in qmp_next.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Fri, 7 Oct 2011 13:36:27 +0100
In-Reply-To: <1317989418-25463-6-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-6-git-send-email-anthony.perard@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: <1317990988.21903.339.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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 Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
> So, if there is an error in the answer given by QEMU, the function
> qmp_synchronous_send while know.
                       "will"

> 
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  tools/libxl/libxl_qmp.c |   14 ++++++++------
>  1 files changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
> index 1594a4f..cd3e4e4 100644
> --- a/tools/libxl/libxl_qmp.c
> +++ b/tools/libxl/libxl_qmp.c
> @@ -233,6 +233,7 @@ static int qmp_handle_response(libxl__qmp_handler *qmp,
>                                 const libxl__json_object *resp)
>  {
>      libxl__qmp_message_type type = LIBXL__QMP_MESSAGE_TYPE_INVALID;
> +    int rc = 0;
>  
>      type = qmp_response_type(qmp, resp);
>      LIBXL__LOG(qmp->ctx, LIBXL__LOG_DEBUG,
> @@ -241,14 +242,14 @@ 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);
> +        rc = enable_qmp_capabilities(qmp);
>          break;
>      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,
> +                rc = pp->callback(qmp,
>                               libxl__json_map_get("return", resp, JSON_ANY),
>                               pp->opaque);
>              }
> @@ -263,13 +264,13 @@ static int qmp_handle_response(libxl__qmp_handler *qmp,
>      }
>      case LIBXL__QMP_MESSAGE_TYPE_ERROR:
>          qmp_handle_error_response(qmp, resp);
> -        break;
> +        return -1;

A mixture or "return -1" and a rc variable returned at the outermost
level is a bit odd. You should either always set rc and fall through or
always return at the end of each case.

>      case LIBXL__QMP_MESSAGE_TYPE_EVENT:
>          break;
>      case LIBXL__QMP_MESSAGE_TYPE_INVALID:
>          return -1;
>      }
> -    return 0;
> +    return rc;
>  }
>  
>  /*
> @@ -358,6 +359,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;
> @@ -416,7 +418,7 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handler *qmp)
>                  s = end + 2;
>  
>                  if (o) {
> -                    qmp_handle_response(qmp, o);
> +                    rc = qmp_handle_response(qmp, o);

If rc now indicates error do we need to bail straight away or need to
keep going around this loop? (Or is it certain we will immediately fall
out of the loop after this?)

>                      libxl__json_object_free(gc, o);
>                  } else {
>                      LIBXL__LOG(qmp->ctx, LIBXL__LOG_ERROR,
> @@ -429,7 +431,7 @@ 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,



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 05:43:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:43:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9mQ-0008Py-Vp; Fri, 07 Oct 2011 05:43:59 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9m0-0008CH-6D
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:43:33 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1317991407!34357348!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9909 invoked from network); 7 Oct 2011 12:43:28 -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 Oct 2011 12:43:28 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8273096"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 12:43:26 +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, 7 Oct 2011
	13:43:26 +0100
Subject: Re: [Xen-devel] [PATCH 6/7] libxl_qmp, Introduce libxl__qmp_pci_add.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Fri, 7 Oct 2011 13:43:26 +0100
In-Reply-To: <1317989418-25463-7-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-7-git-send-email-anthony.perard@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: <1317991406.21903.343.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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 Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
> This function insert a PCI passthrough device in qemu.
> 
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  tools/libxl/libxl_internal.h |    2 +
>  tools/libxl/libxl_qmp.c      |   89 ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 91 insertions(+), 0 deletions(-)
> 
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 4dd0f91..78e1be2 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -119,6 +119,7 @@ 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))

No need to include the domain or dev in this? The name is pretty weird
if you don't include the dev portion.  Looks like this is actually a
vdevfn? xl has an open coded instance of this pattern for that -- worth
adding a public macro?

FWIW pcidev_encode_bdf() exists which encodes the whole lot from a
libxl_device_pci, if that what you end up needing.

>  #define AUTO_PHP_SLOT          0x100
>  #define SYSFS_PCI_DEV          "/sys/bus/pci/devices"
>  #define SYSFS_PCIBACK_DRIVER   "/sys/bus/pci/drivers/pciback"
> @@ -444,6 +445,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 cd3e4e4..c39a1ac 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,
> @@ -601,6 +602,94 @@ int libxl__qmp_query_serial(libxl__qmp_handler *qmp)
>                                  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);
> +    args = libxl__xs_kvs_of_flexarray(gc, parameters, 6);
> +    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;



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 05:46:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:46:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9oe-0000YV-9t; Fri, 07 Oct 2011 05:46:16 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9nm-0000Jo-22
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:45:22 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1317991518!126677!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27495 invoked from network); 7 Oct 2011 12:45:18 -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;
	7 Oct 2011 12:45:18 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8273166"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 12:45: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; Fri, 7 Oct 2011
	13:45:18 +0100
Subject: Re: [Xen-devel] [PATCH 7/7] libxl,	Use QMP to insert a passthrough
	device when using upstream QEMU
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Fri, 7 Oct 2011 13:45:18 +0100
In-Reply-To: <1317989418-25463-8-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-8-git-send-email-anthony.perard@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: <1317991518.21903.345.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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 Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>

Sticking within the 80-column limit is getting pretty hard, perhaps
pulling out the interactions with old-qemu into a new function would
help?

> ---
>  tools/libxl/libxl_pci.c |   58 ++++++++++++++++++++++++++++++-----------------
>  1 files changed, 37 insertions(+), 21 deletions(-)
> 
> diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
> index 1523cf0..b6cb4a3 100644
> --- a/tools/libxl/libxl_pci.c
> +++ b/tools/libxl/libxl_pci.c
> @@ -613,27 +613,43 @@ 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));
> +        if (libxl__device_model_version_running(gc, domid)
> +            == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
> +            rc = libxl__qmp_pci_add(gc, domid, pcidev);
> +        } else {
> +            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));
> +        }
>          if ( rc )
>              return ERROR_FAIL;
>          break;



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 05:54:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 05:54:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RC9wU-0001Bo-Ev; Fri, 07 Oct 2011 05:54:22 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RC9vl-0000zT-5U
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 05:53:38 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1317992013!21368323!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16906 invoked from network); 7 Oct 2011 12:53:33 -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;
	7 Oct 2011 12:53:33 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8273481"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 12:53: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; Fri, 7 Oct 2011 13:53:33 +0100
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
	1RC9vh-00049P-04; Fri, 07 Oct 2011 12:53:33 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RC9vg-00073I-WA;
	Fri, 07 Oct 2011 13:53:32 +0100
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: <20110.63052.985985.409587@mariner.uk.xensource.com>
Date: Fri, 7 Oct 2011 13:53:32 +0100
To: Roger Pau =?iso-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH 2 of 2] build: append YAJL_CLFAGS and
	YAJL_LDFLAGS to libxl build
In-Reply-To: <CAPLaKK4O0ai0EwGiCfuh8k3wk9mw8H5H-vs3N70tjnf5dWkmnw@mail.gmail.com>
References: <patchbomb.1317900424@loki> <dd09f32c882c9e1492b2.1317900426@loki>
	<20109.61822.25684.330705@mariner.uk.xensource.com>
	<CAPLaKK4O0ai0EwGiCfuh8k3wk9mw8H5H-vs3N70tjnf5dWkmnw@mail.gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Ian Campbell <Ian.Campbell@eu.citrix.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

Roger Pau Monné writes ("Re: [Xen-devel] [PATCH 2 of 2] build: append YAJL_CLFAGS and YAJL_LDFLAGS to libxl build"):
> 2011/10/6 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> > I think this should be done by setting EXTRA_INCLUDES and EXTRA_LIB in
> > Config.mk or .config, and shouldn't need an extra pair of variables.
> 
> The problem is that EXTRA_INCLUDES and EXTRA_LIB is added to the whole
> compilation process, and if I have old xen header files in this
> folders together with the yajl headers for example, they get included
> instead of the new ones, and the build fails.

Ah.  I don't think the approach of only using these flags when
compiling libxl is a good one, then, as it would build libxl against
these putative old Xen headers.

I think the problem then is that the ordering of the various -I and -L
options is wrong.  The EXTRA_* should come near the end, after all of
the -I and -L specified by the build system to refer to other parts of
the Xen tree.

Would you like to look into how to make that work :-) ?

Ian.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 06:10:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 06:10:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCAC7-0001um-Fr; Fri, 07 Oct 2011 06:10:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCAAa-0001h8-Kb
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 06:09:15 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1317992922!62606678!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25502 invoked from network); 7 Oct 2011 13:08:43 -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 Oct 2011 13:08:43 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8274016"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 13:08: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, 7 Oct 2011 14:08:52 +0100
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
	1RCAAV-0004EO-IO; Fri, 07 Oct 2011 13:08:51 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RCAAV-000747-IB;
	Fri, 07 Oct 2011 14:08:51 +0100
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: <20110.63971.552328.119163@mariner.uk.xensource.com>
Date: Fri, 7 Oct 2011 14:08:51 +0100
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 10 of 23] libxl: separate forced and
	non-forced	device remove
In-Reply-To: <1317977043.21903.312.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<dd195d45be273cf85ef0.1317389603@localhost.localdomain>
	<20109.55712.847181.699115@mariner.uk.xensource.com>
	<1317977043.21903.312.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>,
	Jim Fehlig <jfehlig@novell.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Mike McClurg <mike.mcclurg@citrix.com>,
	Dave Scott <Dave.Scott@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 10 of 23] libxl: separate forced and non-forced	device remove"):
> The original rationale for the name was that the libxl_TYPE_destroy
> functions only free the content of the datastructure but not the
> datastructure itself and that calling such a function free() would be
> potentially confusing.

Hmmm.

> On the other hand not being able to use "destroy" as a term for things
> related domain destruction is a pain too.

Yes.

> Thesaurus.com suggests various things for destroy and/or free which we
> could use for the type destructors. There's lots of fun sounding ones
> ("bollix up", "enfranchise") but "release" perhaps?

"dispose" ?  "discard" ?  "dealloc[ate]" ?  "abandon" ?

"Release" sounds like it refers to some kind of lock or reservation.

Ian.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 06:31:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 06:31:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCAW4-0002bG-Ln; Fri, 07 Oct 2011 06:31:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCAVH-0002On-RP
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 06:30:20 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1317994168!51450725!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19441 invoked from network); 7 Oct 2011 13:29:29 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 13:29:29 -0000
Received: by qabg14 with SMTP id g14so4065210qab.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 06:30:15 -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
	:content-transfer-encoding;
	bh=dqvuZ/MnePZ9ghZ32+fqLkQPLUMwcs14xbxGcJmcAfo=;
	b=u39bHbMkokFU2P2qd3XPbyn3x2UfCaSy0C+oMD6LHKqNdi7EiCOupvcu+o/erytxgQ
	+vZqs6gDBDnOoQ0tYSWOX4rwrKpdu2JJhG37NqP4wc7Dqhb/w5Zn4HRqPg0e/5ZDQVXi
	+WKZDQhieLQRYbC5jsX8XP0zEa5W7P6uDKC6s=
Received: by 10.224.218.194 with SMTP id hr2mr1988880qab.80.1317994215348;
	Fri, 07 Oct 2011 06:30:15 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.224.28.142 with HTTP; Fri, 7 Oct 2011 06:29:45 -0700 (PDT)
In-Reply-To: <1317990495.21903.331.camel@zakaz.uk.xensource.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-2-git-send-email-anthony.perard@citrix.com>
	<1317990495.21903.331.camel@zakaz.uk.xensource.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Fri, 7 Oct 2011 14:29:45 +0100
X-Google-Sender-Auth: Gpow7s4gvTkyXUmhAmHhTXKlhc8
Message-ID: <CAJJyHjJTkNMhBGkhh7JOrM+=XU9gfoSjGjUpU7GPG=+AQjeruQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key.
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Xen Devel <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 Fri, Oct 7, 2011 at 13:28, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
>> The key is /local/domain/$domid/dm-version.
>
> I've been wondering if we should introduce /libxl/$domid/ as a place for
> keeping tooltack internal droppings like this. The danger with putting
> stuff in /local/domain is that domains come to rely on them.

I was not sure about where to put the value. So
/libxl/$domid/dm-version is good to me.

>> This come with libxl__device_model_version_running helper function.
>>
>> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>> ---
>> =C2=A0tools/libxl/libxl_create.c =C2=A0 | =C2=A0 =C2=A05 +++++
>> =C2=A0tools/libxl/libxl_internal.c | =C2=A0 19 +++++++++++++++++++
>> =C2=A0tools/libxl/libxl_internal.h | =C2=A0 =C2=A05 +++++
>> =C2=A03 files changed, 29 insertions(+), 0 deletions(-)
>>
>> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
>> index e1e3258..3f33d90 100644
>> --- a/tools/libxl/libxl_create.c
>> +++ b/tools/libxl/libxl_create.c
>> @@ -175,6 +175,11 @@ int libxl__domain_build(libxl__gc *gc,
>>
>> =C2=A0 =C2=A0 =C2=A0gettimeofday(&start_time, NULL);
>>
>> + =C2=A0 =C2=A0localents =3D libxl__calloc(gc, 3, sizeof (char *));
>> + =C2=A0 =C2=A0i =3D 0;
>> + =C2=A0 =C2=A0localents[i++] =3D "dm-version";
>> + =C2=A0 =C2=A0localents[i++] =3D libxl__strdup(gc, libxl_device_model_v=
ersion_to_string(dm_info->device_model_version));
>> +
>
> You don't seem to use this anywhere?

This is magic ! :-)

This pointer was not used in this functions, but still given to
libxl__build_post() (and written in xenstore to /local/domain).
My other option from this function was to write the value in /vm/
which does not seams to be a good place.

>> =C2=A0 =C2=A0 =C2=A0switch (info->type) {
>> =C2=A0 =C2=A0 =C2=A0case LIBXL_DOMAIN_TYPE_HVM:
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D libxl__build_hvm(gc, domid, in=
fo, dm_info, state);
>> diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
>> index 3b8a41f..e535c0c 100644
>> --- a/tools/libxl/libxl_internal.c
>> +++ b/tools/libxl/libxl_internal.c
>> @@ -318,3 +318,22 @@ int libxl__fd_set_cloexec(int fd)
>> =C2=A0 =C2=A0 =C2=A0}
>> =C2=A0 =C2=A0 =C2=A0return fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
>> =C2=A0}
>> +
>> +libxl_device_model_version libxl__device_model_version_running(libxl__g=
c *gc,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 u=
int32_t domid)
>> +{
>> + =C2=A0 =C2=A0char *path =3D NULL;
>> + =C2=A0 =C2=A0char *dm_version =3D NULL;
>> + =C2=A0 =C2=A0libxl_device_model_version value;
>> +
>> + =C2=A0 =C2=A0path =3D libxl__sprintf(gc, "/local/domain/%d/dm-version"=
, domid);
>> + =C2=A0 =C2=A0dm_version =3D libxl__xs_read(gc, XBT_NULL, path);
>> + =C2=A0 =C2=A0if (!dm_version) {
>
> This would be a bug, since it would imply an inconsistent version of
> libxl was used to create the domain? (not sure what our policy around
> this actually is / should be).

I just want to give libxl the ability to run after an update. But it's
maybe better to print and return an error, so that will give a chance
to the user to update is xenstore :). (or use the tool that created
the domain).

>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_=
TRADITIONAL;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0if (libxl_device_model_version_from_string(dm_version, &v=
alue) < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_=
TRADITIONAL;
>> + =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0return value;
>> +}
>> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
>> index 935c899..4dd0f91 100644
>> --- a/tools/libxl/libxl_internal.h
>> +++ b/tools/libxl/libxl_internal.h
>> @@ -554,4 +554,9 @@ _hidden void libxl__json_object_free(libxl__gc *gc, =
libxl__json_object *obj);
>>
>> =C2=A0_hidden libxl__json_object *libxl__json_parse(libxl__gc *gc, const=
 char *s);
>>
>> + =C2=A0/* Based on /local/domain/$domid/dm-version xenstore key
>> + =C2=A0 * default is qemu xen traditional */
>> +_hidden libxl_device_model_version
>> +libxl__device_model_version_running(libxl__gc *gc, uint32_t domid);
>> +
>> =C2=A0#endif


--=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 Fri Oct 07 06:34:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 06:34:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCAZR-00030h-U6; Fri, 07 Oct 2011 06:34:37 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCAYx-0002ow-EA
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 06:34:07 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1317994425!47255679!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22729 invoked from network); 7 Oct 2011 13:33:46 -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 Oct 2011 13:33:46 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8274608"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 13: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; Fri, 7 Oct 2011 14:34:04 +0100
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
	1RCAYt-0004Mn-O4; Fri, 07 Oct 2011 13:34:03 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RCAYt-00076k-NK;
	Fri, 07 Oct 2011 14:34:03 +0100
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: <20110.65483.710731.280588@mariner.uk.xensource.com>
Date: Fri, 7 Oct 2011 14:34:03 +0100
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 1 of 7] tools/check: remove check_logging [and
	1 more messages]
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <c2daf20cf860d942d110.1317738110@probook.site>,
	<738452bd9f33343e46a8.1317738112@probook.site>
References: <patchbomb.1317738109@probook.site>
	<738452bd9f33343e46a8.1317738112@probook.site>
	<c2daf20cf860d942d110.1317738110@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 3 of 7] tools/check: update python version check"):
> tools/check: update python version check

Olaf Hering writes ("[Xen-devel] [PATCH 1 of 7] tools/check: remove check_logging"):
> tools/check: remove check_logging

I have acked and applied these two (in the opposite order to that
suggested).

Ian.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 06:49:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 06:49:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCAnP-0003rx-Te; Fri, 07 Oct 2011 06:49:03 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCAmm-0003fh-JG
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 06:48:24 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1317995280!43512489!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12057 invoked from network); 7 Oct 2011 13:48:00 -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;
	7 Oct 2011 13:48:00 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8275014"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 13:48: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; Fri, 7 Oct 2011 14:48:21 +0100
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
	1RCAmi-0004Rb-Pw; Fri, 07 Oct 2011 13:48:20 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RCAmi-000780-PA;
	Fri, 07 Oct 2011 14:48:20 +0100
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: <20111.804.769740.932387@mariner.uk.xensource.com>
Date: Fri, 7 Oct 2011 14:48:20 +0100
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 0 of 7] tools/check fixes for xen-unstable
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <patchbomb.1317738109@probook.site>
References: <patchbomb.1317738109@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] tools/check fixes for xen-unstable"):
> 
> Remove the need for executable permissions of some files in the SCM.

Thanks for this contribution but I'm afraid I don't really agree with
the need for this change.  It is simpler in our build system (which is
quite complicated enough already) just to execute these kind of
scripts directly.

If the arrangements you use for producing a source tree don't always
put the +x permissions back correctly, then I think that's something
that shouldn't be too hard to fix.  There should be no problem with
setting +x on files that don't need it (and if there is, we can
probably fix that) so you don't have to be 100% discriminating in that
fixup.

Ian.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 07:10:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 07:10:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCB8B-0004k3-5e; Fri, 07 Oct 2011 07:10:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCB6Y-0004W3-Pc
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 07:08:51 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317996537!54588118!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 856 invoked from network); 7 Oct 2011 14:08:58 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 14:08:58 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="18032567"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 10:08:45 -0400
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; Fri, 7 Oct 2011 10:08:45 -0400
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
	p97E8hKt028925;	Fri, 7 Oct 2011 07:08:44 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1317996522@cosworth.uk.xensource.com>
In-Reply-To: <20109.55422.412736.135972@mariner.uk.xensource.com>
References: <20109.55422.412736.135972@mariner.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Fri, 7 Oct 2011 15:08:42 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH 0 of 3] libxl: fixup hard tabs and indentation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 the whitespace cleanup bit of my "libxl: rationalise
libxl_device_* APIs" series.

As requested I have used the expand utility to automatically fixup the
majority of hard tabs and then fixed up the places which were actually
just wrongly indented to start with by hand.

I added some emacs local-variable runes to stop this happening.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 07:11:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 07: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 1RCB9O-00057O-L7; Fri, 07 Oct 2011 07:11:46 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCB6Z-0004W4-8w
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 07:08:53 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1317996537!54588118!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 882 invoked from network); 7 Oct 2011 14:08:58 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 14:08:58 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="18032569"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 10:08:47 -0400
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; Fri, 7 Oct 2011 10:08:47 -0400
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
	p97E8hKv028925;	Fri, 7 Oct 2011 07:08:46 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ea75a1765a4a8da26089f42c68a1a1f15182a11f
Message-ID: <ea75a1765a4a8da26089.1317996524@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1317996522@cosworth.uk.xensource.com>
References: <patchbomb.1317996522@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Fri, 7 Oct 2011 15:08:44 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH 2 of 3] libxl: fixup incorrect indentation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317996269 -3600
# Node ID ea75a1765a4a8da26089f42c68a1a1f15182a11f
# Parent  a440b0ad413b88ef7814f407b2fc3b412d586e9b
libxl: fixup incorrect indentation

Several places which were previsously indented using hard tabs are now
incorrectly indented. Fix them up.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r a440b0ad413b -r ea75a1765a4a tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Fri Oct 07 14:59:16 2011 +0100
+++ b/tools/libxl/libxl.c	Fri Oct 07 15:04:29 2011 +0100
@@ -696,13 +696,13 @@ int libxl_event_get_disk_eject_info(libx
     sscanf(backend,
             "/local/domain/%d/backend/%" TOSTRING(BACKEND_STRING_SIZE) "[a-z]/%*d/%*d",
             &disk->backend_domid, backend_type);
-        if (!strcmp(backend_type, "tap") || !strcmp(backend_type, "vbd")) {
-                disk->backend = LIBXL_DISK_BACKEND_TAP;
-        } else if (!strcmp(backend_type, "qdisk")) {
-                disk->backend = LIBXL_DISK_BACKEND_QDISK;
-        } else {
-                disk->backend = LIBXL_DISK_BACKEND_UNKNOWN;
-        }
+    if (!strcmp(backend_type, "tap") || !strcmp(backend_type, "vbd")) {
+        disk->backend = LIBXL_DISK_BACKEND_TAP;
+    } else if (!strcmp(backend_type, "qdisk")) {
+        disk->backend = LIBXL_DISK_BACKEND_QDISK;
+    } else {
+        disk->backend = LIBXL_DISK_BACKEND_UNKNOWN;
+    }
 
     disk->pdev_path = strdup("");
     disk->format = LIBXL_DISK_FORMAT_EMPTY;
diff -r a440b0ad413b -r ea75a1765a4a tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Fri Oct 07 14:59:16 2011 +0100
+++ b/tools/libxl/libxl_bootloader.c	Fri Oct 07 15:04:29 2011 +0100
@@ -81,14 +81,14 @@ static int open_xenconsoled_pty(int *mas
 
     ret = openpty(master, slave, NULL, NULL, NULL);
     if (ret < 0)
-            return -1;
+        return -1;
 
     ret = ttyname_r(*slave, slave_path, slave_path_len);
     if (ret == -1) {
-            close(*master);
-            close(*slave);
-            *master = *slave = -1;
-            return -1;
+        close(*master);
+        close(*slave);
+        *master = *slave = -1;
+        return -1;
     }
 
     /*
diff -r a440b0ad413b -r ea75a1765a4a tools/libxl/libxl_internal.c
--- a/tools/libxl/libxl_internal.c	Fri Oct 07 14:59:16 2011 +0100
+++ b/tools/libxl/libxl_internal.c	Fri Oct 07 15:04:29 2011 +0100
@@ -228,53 +228,53 @@ char *libxl__abs_path(libxl__gc *gc, con
 
 int libxl__file_reference_map(libxl_file_reference *f)
 {
-        struct stat st_buf;
-        int ret, fd;
-        void *data;
+    struct stat st_buf;
+    int ret, fd;
+    void *data;
 
-        if (f->mapped)
-                return 0;
+    if (f->mapped)
+        return 0;
 
-        fd = open(f->path, O_RDONLY);
-        if (f < 0)
-                return ERROR_FAIL;
+    fd = open(f->path, O_RDONLY);
+    if (f < 0)
+        return ERROR_FAIL;
 
-        ret = fstat(fd, &st_buf);
-        if (ret < 0)
-                goto out;
+    ret = fstat(fd, &st_buf);
+    if (ret < 0)
+        goto out;
 
-        ret = -1;
-        data = mmap(NULL, st_buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
-        if (data == NULL)
-                goto out;
+    ret = -1;
+    data = mmap(NULL, st_buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+    if (data == NULL)
+        goto out;
 
-        f->mapped = 1;
-        f->data = data;
-        f->size = st_buf.st_size;
+    f->mapped = 1;
+    f->data = data;
+    f->size = st_buf.st_size;
 
-        ret = 0;
+    ret = 0;
 out:
-        close(fd);
+    close(fd);
 
-        return ret == 0 ? 0 : ERROR_FAIL;
+    return ret == 0 ? 0 : ERROR_FAIL;
 }
 
 int libxl__file_reference_unmap(libxl_file_reference *f)
 {
-        int ret;
+    int ret;
 
-        if (!f->mapped)
-                return 0;
+    if (!f->mapped)
+        return 0;
 
-        ret = munmap(f->data, f->size);
-        if (ret == 0) {
-                f->mapped = 0;
-                f->data = NULL;
-                f->size = 0;
-                return 0;
-        }
+    ret = munmap(f->data, f->size);
+    if (ret == 0) {
+        f->mapped = 0;
+        f->data = NULL;
+        f->size = 0;
+        return 0;
+    }
 
-        return ERROR_FAIL;
+    return ERROR_FAIL;
 }
 
 _hidden int libxl__parse_mac(const char *s, libxl_mac mac)
diff -r a440b0ad413b -r ea75a1765a4a tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Fri Oct 07 14:59:16 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Fri Oct 07 15:04:29 2011 +0100
@@ -1114,7 +1114,7 @@ static int e820_sanitize(libxl_ctx *ctx,
         if ((src[i].type == E820_RAM) ||
             (src[i].type == E820_UNUSABLE) ||
             (src[i].type == 0))
-                continue;
+            continue;
 
         start = src[i].addr < start ? src[i].addr : start;
         last = src[i].addr + src[i].size > last ?
diff -r a440b0ad413b -r ea75a1765a4a tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Fri Oct 07 14:59:16 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Fri Oct 07 15:04:29 2011 +0100
@@ -457,7 +457,7 @@ int libxl_mac_to_device_nic(libxl_ctx *c
 
     rc = libxl__parse_mac(mac, mac_n);
     if (rc)
-            return rc;
+        return rc;
 
     nics = libxl_list_nics(ctx, domid, &nb);
     if (!nics)
@@ -509,7 +509,7 @@ int libxl_devid_to_device_nic(libxl_ctx 
     val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", nic_path_fe));
     rc = libxl__parse_mac(val, nic->mac);
     if (rc)
-            goto out;
+        goto out;
 
     nic->script = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/script", nic_path_be), NULL);
     rc = 0;

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 07:12:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 07:12:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCBAL-0005Ui-Ni; Fri, 07 Oct 2011 07:12:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCB6Z-0004W5-ME
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 07:08:53 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317996511!57150448!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6709 invoked from network); 7 Oct 2011 14:08:32 -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 Oct 2011 14:08:32 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="166093481"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 10:08:46 -0400
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; Fri, 7 Oct 2011 10:08:46 -0400
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
	p97E8hKu028925;	Fri, 7 Oct 2011 07:08:45 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a440b0ad413b88ef7814f407b2fc3b412d586e9b
Message-ID: <a440b0ad413b88ef7814.1317996523@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1317996522@cosworth.uk.xensource.com>
References: <patchbomb.1317996522@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Fri, 7 Oct 2011 15:08:43 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH 1 of 3] libxl: expand hard tabs stops
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317995956 -3600
# Node ID a440b0ad413b88ef7814f407b2fc3b412d586e9b
# Parent  197e3be90f3245fb8f66281bf2759327bf051a9d
libxl: expand hard tabs stops

I ran the following and committed the result. ^I is an actual hard tab

for i in $(grep -l --exclude=*_[ly].\[ch\] '^I' tools/libxl/*.[ch]) ; do
     cat $i | expand | sponge $i
done

There are some actually wrong indentations too, I'll fix thos up manually

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 197e3be90f32 -r a440b0ad413b tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Fri Oct 07 13:24:44 2011 +0100
+++ b/tools/libxl/libxl.c	Fri Oct 07 14:59:16 2011 +0100
@@ -696,13 +696,13 @@ int libxl_event_get_disk_eject_info(libx
     sscanf(backend,
             "/local/domain/%d/backend/%" TOSTRING(BACKEND_STRING_SIZE) "[a-z]/%*d/%*d",
             &disk->backend_domid, backend_type);
-	if (!strcmp(backend_type, "tap") || !strcmp(backend_type, "vbd")) {
-		disk->backend = LIBXL_DISK_BACKEND_TAP;
-	} else if (!strcmp(backend_type, "qdisk")) {
-		disk->backend = LIBXL_DISK_BACKEND_QDISK;
-	} else {
-		disk->backend = LIBXL_DISK_BACKEND_UNKNOWN;
-	}
+        if (!strcmp(backend_type, "tap") || !strcmp(backend_type, "vbd")) {
+                disk->backend = LIBXL_DISK_BACKEND_TAP;
+        } else if (!strcmp(backend_type, "qdisk")) {
+                disk->backend = LIBXL_DISK_BACKEND_QDISK;
+        } else {
+                disk->backend = LIBXL_DISK_BACKEND_UNKNOWN;
+        }
 
     disk->pdev_path = strdup("");
     disk->format = LIBXL_DISK_FORMAT_EMPTY;
diff -r 197e3be90f32 -r a440b0ad413b tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Fri Oct 07 13:24:44 2011 +0100
+++ b/tools/libxl/libxl.h	Fri Oct 07 14:59:16 2011 +0100
@@ -420,7 +420,7 @@ int libxl_cpuid_parse_config_xend(libxl_
                                   const char* str);
 void libxl_cpuid_apply_policy(libxl_ctx *ctx, uint32_t domid);
 void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid,
-		     libxl_cpuid_policy_list cpuid);
+                     libxl_cpuid_policy_list cpuid);
 
 /*
  * Functions for allowing users of libxl to store private data
diff -r 197e3be90f32 -r a440b0ad413b tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Fri Oct 07 13:24:44 2011 +0100
+++ b/tools/libxl/libxl_bootloader.c	Fri Oct 07 14:59:16 2011 +0100
@@ -81,14 +81,14 @@ static int open_xenconsoled_pty(int *mas
 
     ret = openpty(master, slave, NULL, NULL, NULL);
     if (ret < 0)
-	    return -1;
+            return -1;
 
     ret = ttyname_r(*slave, slave_path, slave_path_len);
     if (ret == -1) {
-	    close(*master);
-	    close(*slave);
-	    *master = *slave = -1;
-	    return -1;
+            close(*master);
+            close(*slave);
+            *master = *slave = -1;
+            return -1;
     }
 
     /*
diff -r 197e3be90f32 -r a440b0ad413b tools/libxl/libxl_cpuid.c
--- a/tools/libxl/libxl_cpuid.c	Fri Oct 07 13:24:44 2011 +0100
+++ b/tools/libxl/libxl_cpuid.c	Fri Oct 07 14:59:16 2011 +0100
@@ -317,7 +317,7 @@ void libxl_cpuid_apply_policy(libxl_ctx 
 }
 
 void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid,
-		     libxl_cpuid_policy_list cpuid)
+                     libxl_cpuid_policy_list cpuid)
 {
     int i;
     char *cpuid_res[4];
diff -r 197e3be90f32 -r a440b0ad413b tools/libxl/libxl_internal.c
--- a/tools/libxl/libxl_internal.c	Fri Oct 07 13:24:44 2011 +0100
+++ b/tools/libxl/libxl_internal.c	Fri Oct 07 14:59:16 2011 +0100
@@ -228,53 +228,53 @@ char *libxl__abs_path(libxl__gc *gc, con
 
 int libxl__file_reference_map(libxl_file_reference *f)
 {
-	struct stat st_buf;
-	int ret, fd;
-	void *data;
+        struct stat st_buf;
+        int ret, fd;
+        void *data;
 
-	if (f->mapped)
-		return 0;
+        if (f->mapped)
+                return 0;
 
-	fd = open(f->path, O_RDONLY);
-	if (f < 0)
-		return ERROR_FAIL;
+        fd = open(f->path, O_RDONLY);
+        if (f < 0)
+                return ERROR_FAIL;
 
-	ret = fstat(fd, &st_buf);
-	if (ret < 0)
-		goto out;
+        ret = fstat(fd, &st_buf);
+        if (ret < 0)
+                goto out;
 
-	ret = -1;
-	data = mmap(NULL, st_buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
-	if (data == NULL)
-		goto out;
+        ret = -1;
+        data = mmap(NULL, st_buf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
+        if (data == NULL)
+                goto out;
 
-	f->mapped = 1;
-	f->data = data;
-	f->size = st_buf.st_size;
+        f->mapped = 1;
+        f->data = data;
+        f->size = st_buf.st_size;
 
-	ret = 0;
+        ret = 0;
 out:
-	close(fd);
+        close(fd);
 
-	return ret == 0 ? 0 : ERROR_FAIL;
+        return ret == 0 ? 0 : ERROR_FAIL;
 }
 
 int libxl__file_reference_unmap(libxl_file_reference *f)
 {
-	int ret;
+        int ret;
 
-	if (!f->mapped)
-		return 0;
+        if (!f->mapped)
+                return 0;
 
-	ret = munmap(f->data, f->size);
-	if (ret == 0) {
-		f->mapped = 0;
-		f->data = NULL;
-		f->size = 0;
-		return 0;
-	}
+        ret = munmap(f->data, f->size);
+        if (ret == 0) {
+                f->mapped = 0;
+                f->data = NULL;
+                f->size = 0;
+                return 0;
+        }
 
-	return ERROR_FAIL;
+        return ERROR_FAIL;
 }
 
 _hidden int libxl__parse_mac(const char *s, libxl_mac mac)
diff -r 197e3be90f32 -r a440b0ad413b tools/libxl/libxl_nocpuid.c
--- a/tools/libxl/libxl_nocpuid.c	Fri Oct 07 13:24:44 2011 +0100
+++ b/tools/libxl/libxl_nocpuid.c	Fri Oct 07 14:59:16 2011 +0100
@@ -32,6 +32,6 @@ void libxl_cpuid_apply_policy(libxl_ctx 
 }
 
 void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid,
-		     libxl_cpuid_policy_list cpuid)
+                     libxl_cpuid_policy_list cpuid)
 {
 }
diff -r 197e3be90f32 -r a440b0ad413b tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Fri Oct 07 13:24:44 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Fri Oct 07 14:59:16 2011 +0100
@@ -1114,7 +1114,7 @@ static int e820_sanitize(libxl_ctx *ctx,
         if ((src[i].type == E820_RAM) ||
             (src[i].type == E820_UNUSABLE) ||
             (src[i].type == 0))
-		continue;
+                continue;
 
         start = src[i].addr < start ? src[i].addr : start;
         last = src[i].addr + src[i].size > last ?
@@ -1159,14 +1159,14 @@ static int e820_sanitize(libxl_ctx *ctx,
      * to E820_UNUSED. We also need to move some of the E820_RAM regions if
      * the overlap with ram_end. */
     for (i = 0; i < nr; i++) {
-	uint64_t end = src[i].addr + src[i].size;
+        uint64_t end = src[i].addr + src[i].size;
 
-	/* We don't care about E820_UNUSABLE, but we need to
+        /* We don't care about E820_UNUSABLE, but we need to
          * change the type to zero b/c the loop after this
          * sticks E820_UNUSABLE on the guest's E820 but ignores
          * the ones with type zero. */
         if ((src[i].type == E820_UNUSABLE) ||
-	    /* Any region that is within the "RAM region" can
+            /* Any region that is within the "RAM region" can
              * be safely ditched. */
             (end < ram_end)) {
                 src[i].type = 0;
@@ -1174,15 +1174,15 @@ static int e820_sanitize(libxl_ctx *ctx,
         }
 
         /* Look only at RAM regions. */
-	if (src[i].type != E820_RAM)
+        if (src[i].type != E820_RAM)
             continue;
 
         /* We only care about RAM regions below 4GB. */
         if (src[i].addr >= (1ULL<<32))
             continue;
 
-	/* E820_RAM overlaps with our RAM region. Move it */
-	if (src[i].addr < ram_end) {
+        /* E820_RAM overlaps with our RAM region. Move it */
+        if (src[i].addr < ram_end) {
             uint64_t delta;
 
             src[i].type = E820_UNUSABLE;
@@ -1236,8 +1236,8 @@ static int e820_sanitize(libxl_ctx *ctx,
     /* Almost done: copy them over, ignoring the undesireable ones */
     for (i = 0; i < nr; i++) {
         if ((src[i].type == E820_RAM) ||
-	    (src[i].type == 0))
-	    continue;
+            (src[i].type == 0))
+            continue;
 
         e820[idx].type = src[i].type;
         e820[idx].addr = src[i].addr;
diff -r 197e3be90f32 -r a440b0ad413b tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Fri Oct 07 13:24:44 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Fri Oct 07 14:59:16 2011 +0100
@@ -457,7 +457,7 @@ int libxl_mac_to_device_nic(libxl_ctx *c
 
     rc = libxl__parse_mac(mac, mac_n);
     if (rc)
-	    return rc;
+            return rc;
 
     nics = libxl_list_nics(ctx, domid, &nb);
     if (!nics)
@@ -509,7 +509,7 @@ int libxl_devid_to_device_nic(libxl_ctx 
     val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", nic_path_fe));
     rc = libxl__parse_mac(val, nic->mac);
     if (rc)
-	    goto out;
+            goto out;
 
     nic->script = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/script", nic_path_be), NULL);
     rc = 0;
diff -r 197e3be90f32 -r a440b0ad413b tools/libxl/libxlutil.h
--- a/tools/libxl/libxlutil.h	Fri Oct 07 13:24:44 2011 +0100
+++ b/tools/libxl/libxlutil.h	Fri Oct 07 14:59:16 2011 +0100
@@ -64,7 +64,7 @@ const char *xlu_cfg_get_listitem(const X
  */
 
 int xlu_disk_parse(XLU_Config *cfg, int nspecs, const char *const *specs,
-		   libxl_device_disk *disk);
+                   libxl_device_disk *disk);
   /* disk must have been initialised.
    *
    * On error, returns errno value.  Bad strings cause EINVAL and
diff -r 197e3be90f32 -r a440b0ad413b tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Fri Oct 07 13:24:44 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Fri Oct 07 14:59:16 2011 +0100
@@ -557,15 +557,15 @@ static void parse_disk_config_multistrin
     memset(disk, 0, sizeof(*disk));
 
     if (!*config) {
-	*config = xlu_cfg_init(stderr, "command line");
-	if (!*config) { perror("xlu_cfg_init"); exit(-1); }
+        *config = xlu_cfg_init(stderr, "command line");
+        if (!*config) { perror("xlu_cfg_init"); exit(-1); }
     }
 
     e = xlu_disk_parse(*config, nspecs, specs, disk);
     if (e == EINVAL) exit(-1);
     if (e) {
-	fprintf(stderr,"xlu_disk_parse failed: %s\n",strerror(errno));
-	exit(-1);
+        fprintf(stderr,"xlu_disk_parse failed: %s\n",strerror(errno));
+        exit(-1);
     }
 }
 

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 07:13:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 07:13:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCBBD-0005rS-Oy; Fri, 07 Oct 2011 07:13:39 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCB6a-0004W6-J0
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 07:08:58 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1317996511!57150448!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6804 invoked from network); 7 Oct 2011 14:08:33 -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 Oct 2011 14:08:33 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312171200"; d="scan'208";a="166093484"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 10:08:48 -0400
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; Fri, 7 Oct 2011 10:08:48 -0400
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
	p97E8hKw028925;	Fri, 7 Oct 2011 07:08:47 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0925bc3120d1f6474f235eea2ba9539009c47bd5
Message-ID: <0925bc3120d1f6474f23.1317996525@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1317996522@cosworth.uk.xensource.com>
References: <patchbomb.1317996522@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Fri, 7 Oct 2011 15:08:45 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH 3 of 3] libxl: add emacs local variables block
 to turn on four space indentation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317996290 -3600
# Node ID 0925bc3120d1f6474f235eea2ba9539009c47bd5
# Parent  ea75a1765a4a8da26089f42c68a1a1f15182a11f
libxl: add emacs local variables block to turn on four space indentation

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/flexarray.c
--- a/tools/libxl/flexarray.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/flexarray.c	Fri Oct 07 15:04:50 2011 +0100
@@ -107,3 +107,11 @@ void **flexarray_contents(flexarray_t *a
     free(array);
     return data;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/flexarray.h
--- a/tools/libxl/flexarray.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/flexarray.h	Fri Oct 07 15:04:50 2011 +0100
@@ -35,3 +35,11 @@ _hidden int flexarray_get(flexarray_t *a
 _hidden void **flexarray_contents(flexarray_t *array);
 
 #endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl.c	Fri Oct 07 15:04:50 2011 +0100
@@ -3044,3 +3044,11 @@ int libxl_cpupool_movedomain(libxl_ctx *
     libxl__free_all(&gc);
     return 0;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl.h	Fri Oct 07 15:04:50 2011 +0100
@@ -541,3 +541,10 @@ const char *libxl_run_dir_path(void);
 
 #endif /* LIBXL_H */
 
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_blktap2.c
--- a/tools/libxl/libxl_blktap2.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_blktap2.c	Fri Oct 07 15:04:50 2011 +0100
@@ -77,3 +77,11 @@ void libxl__device_destroy_tapdisk(libxl
 
     tap_ctl_destroy(tap.id, tap.minor);
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_bootloader.c	Fri Oct 07 15:04:50 2011 +0100
@@ -450,3 +450,10 @@ out:
     return rc;
 }
 
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_cpuid.c
--- a/tools/libxl/libxl_cpuid.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_cpuid.c	Fri Oct 07 15:04:50 2011 +0100
@@ -326,3 +326,11 @@ void libxl_cpuid_set(libxl_ctx *ctx, uin
         xc_cpuid_set(ctx->xch, domid, cpuid[i].input,
                      (const char**)(cpuid[i].policy), cpuid_res);
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_create.c	Fri Oct 07 15:04:50 2011 +0100
@@ -643,3 +643,11 @@ int libxl_domain_create_restore(libxl_ct
     libxl__free_all(&gc);
     return rc;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_device.c	Fri Oct 07 15:04:50 2011 +0100
@@ -654,3 +654,10 @@ out:
     return rc;
 }
 
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_dm.c	Fri Oct 07 15:04:50 2011 +0100
@@ -1047,3 +1047,11 @@ int libxl__create_xenpv_qemu(libxl__gc *
     libxl__create_device_model(gc, info, NULL, 0, NULL, 0, starting_r);
     return 0;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_dom.c	Fri Oct 07 15:04:50 2011 +0100
@@ -813,3 +813,11 @@ out:
     libxl__free_all(&gc);
     return rc;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_exec.c	Fri Oct 07 15:04:50 2011 +0100
@@ -308,3 +308,11 @@ int libxl__spawn_check(libxl__gc *gc, vo
     for_spawn->intermediate = 0;
     return ERROR_FAIL;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_flask.c
--- a/tools/libxl/libxl_flask.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_flask.c	Fri Oct 07 15:04:50 2011 +0100
@@ -69,3 +69,11 @@ int libxl_flask_loadpolicy(libxl_ctx *ct
 
     return rc;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_internal.c
--- a/tools/libxl/libxl_internal.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_internal.c	Fri Oct 07 15:04:50 2011 +0100
@@ -318,3 +318,11 @@ int libxl__fd_set_cloexec(int fd)
     }
     return fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Fri Oct 07 15:04:50 2011 +0100
@@ -555,3 +555,11 @@ _hidden void libxl__json_object_free(lib
 _hidden libxl__json_object *libxl__json_parse(libxl__gc *gc, const char *s);
 
 #endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_json.c
--- a/tools/libxl/libxl_json.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_json.c	Fri Oct 07 15:04:50 2011 +0100
@@ -834,3 +834,11 @@ out:
 
     return ret;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_json.h
--- a/tools/libxl/libxl_json.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_json.h	Fri Oct 07 15:04:50 2011 +0100
@@ -21,3 +21,11 @@
 #include <_libxl_types_internal_json.h>
 
 #endif /* LIBXL_JSON_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_noblktap2.c
--- a/tools/libxl/libxl_noblktap2.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_noblktap2.c	Fri Oct 07 15:04:50 2011 +0100
@@ -31,3 +31,11 @@ char *libxl__blktap_devpath(libxl__gc *g
 void libxl__device_destroy_tapdisk(libxl__gc *gc, char *be_path)
 {
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_nocpuid.c
--- a/tools/libxl/libxl_nocpuid.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_nocpuid.c	Fri Oct 07 15:04:50 2011 +0100
@@ -35,3 +35,11 @@ void libxl_cpuid_set(libxl_ctx *ctx, uin
                      libxl_cpuid_policy_list cpuid)
 {
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_osdeps.h
--- a/tools/libxl/libxl_osdeps.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_osdeps.h	Fri Oct 07 15:04:50 2011 +0100
@@ -39,3 +39,11 @@ int vasprintf(char **buffer, const char 
 #endif /*NEED_OWN_ASPRINTF*/
 
 #endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_paths.c
--- a/tools/libxl/libxl_paths.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_paths.c	Fri Oct 07 15:04:50 2011 +0100
@@ -69,3 +69,11 @@ const char *libxl_run_dir_path(void)
 {
     return XEN_RUN_DIR;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Fri Oct 07 15:04:50 2011 +0100
@@ -1305,3 +1305,11 @@ int libxl__e820_alloc(libxl__gc *gc, uin
     }
     return 0;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_qmp.c
--- a/tools/libxl/libxl_qmp.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_qmp.c	Fri Oct 07 15:04:50 2011 +0100
@@ -594,3 +594,11 @@ int libxl__qmp_initializations(libxl_ctx
     libxl__qmp_close(qmp);
     return ret;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Fri Oct 07 15:04:50 2011 +0100
@@ -647,3 +647,11 @@ int libxl__enum_from_string(const libxl_
     }
     return ERROR_FAIL;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_utils.h
--- a/tools/libxl/libxl_utils.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_utils.h	Fri Oct 07 15:04:50 2011 +0100
@@ -80,3 +80,10 @@ static inline uint32_t libxl__sizekb_to_
 
 #endif
 
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_uuid.c
--- a/tools/libxl/libxl_uuid.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_uuid.c	Fri Oct 07 15:04:50 2011 +0100
@@ -103,3 +103,11 @@ uint8_t *libxl_uuid_bytearray(libxl_uuid
 #error "Please update libxl_uuid.c for your OS"
 
 #endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_uuid.h
--- a/tools/libxl/libxl_uuid.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_uuid.h	Fri Oct 07 15:04:50 2011 +0100
@@ -62,3 +62,11 @@ int libxl_uuid_compare(libxl_uuid *uuid1
 uint8_t *libxl_uuid_bytearray(libxl_uuid *uuid);
 
 #endif /* __LIBXL_UUID_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxl_xshelp.c
--- a/tools/libxl/libxl_xshelp.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxl_xshelp.c	Fri Oct 07 15:04:50 2011 +0100
@@ -121,3 +121,11 @@ char **libxl__xs_directory(libxl__gc *gc
     libxl__ptr_add(gc, ret);
     return ret;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlu_cfg.c
--- a/tools/libxl/libxlu_cfg.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlu_cfg.c	Fri Oct 07 15:04:50 2011 +0100
@@ -433,3 +433,11 @@ void xlu__cfg_yyerror(YYLTYPE *loc, CfgP
             msg);
     if (!ctx->err) ctx->err= EINVAL;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlu_cfg_i.h
--- a/tools/libxl/libxlu_cfg_i.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlu_cfg_i.h	Fri Oct 07 15:04:50 2011 +0100
@@ -42,3 +42,11 @@ int xlu__cfg_yyparse(CfgParseContext *ct
 
 
 #endif /*LIBXLU_CFG_I_H*/
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlu_cfg_l.c
--- a/tools/libxl/libxlu_cfg_l.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlu_cfg_l.c	Fri Oct 07 15:04:50 2011 +0100
@@ -2122,3 +2122,11 @@ void xlu__cfg_yyfree (void * ptr , yysca
 #define YYTABLES_NAME "yytables"
 
 #line 104 "libxlu_cfg_l.l"
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlu_cfg_l.h
--- a/tools/libxl/libxlu_cfg_l.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlu_cfg_l.h	Fri Oct 07 15:04:50 2011 +0100
@@ -355,3 +355,11 @@ extern int xlu__cfg_yylex \
 #line 356 "libxlu_cfg_l.h"
 #undef xlu__cfg_yyIN_HEADER
 #endif /* xlu__cfg_yyHEADER_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlu_cfg_y.c
--- a/tools/libxl/libxlu_cfg_y.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlu_cfg_y.c	Fri Oct 07 15:04:50 2011 +0100
@@ -1689,3 +1689,11 @@ yyreturn:
 
 
 
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlu_cfg_y.h
--- a/tools/libxl/libxlu_cfg_y.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlu_cfg_y.h	Fri Oct 07 15:04:50 2011 +0100
@@ -85,3 +85,11 @@ typedef struct YYLTYPE
 #endif
 
 
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlu_disk.c
--- a/tools/libxl/libxlu_disk.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlu_disk.c	Fri Oct 07 15:04:50 2011 +0100
@@ -91,3 +91,10 @@ int xlu_disk_parse(XLU_Config *cfg,
     return dpc.err;
 }
 
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlu_disk_i.h
--- a/tools/libxl/libxlu_disk_i.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlu_disk_i.h	Fri Oct 07 15:04:50 2011 +0100
@@ -19,3 +19,11 @@ void xlu__disk_err(DiskParseContext *dpc
 
 
 #endif /*LIBXLU_DISK_I_H*/
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlu_disk_l.c
--- a/tools/libxl/libxlu_disk_l.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlu_disk_l.c	Fri Oct 07 15:04:50 2011 +0100
@@ -2515,3 +2515,11 @@ void xlu__disk_yyfree (void * ptr , yysc
 #define YYTABLES_NAME "yytables"
 
 #line 227 "libxlu_disk_l.l"
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlu_disk_l.h
--- a/tools/libxl/libxlu_disk_l.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlu_disk_l.h	Fri Oct 07 15:04:50 2011 +0100
@@ -345,3 +345,11 @@ extern int xlu__disk_yylex (yyscan_t yys
 #line 346 "libxlu_disk_l.h"
 #undef xlu__disk_yyIN_HEADER
 #endif /* xlu__disk_yyHEADER_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlu_internal.h
--- a/tools/libxl/libxlu_internal.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlu_internal.h	Fri Oct 07 15:04:50 2011 +0100
@@ -50,3 +50,11 @@ typedef struct {
 #define TOSTRING(x) STRINGIFY(x)
 
 #endif /*LIBXLU_INTERNAL_H*/
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/libxlutil.h
--- a/tools/libxl/libxlutil.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/libxlutil.h	Fri Oct 07 15:04:50 2011 +0100
@@ -82,3 +82,11 @@ int xlu_disk_parse(XLU_Config *cfg, int 
 
 
 #endif /* LIBXLUTIL_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/osdeps.c
--- a/tools/libxl/osdeps.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/osdeps.c	Fri Oct 07 15:04:50 2011 +0100
@@ -66,3 +66,11 @@ int asprintf(char **buffer, char *fmt, .
 }
 
 #endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/xl.c
--- a/tools/libxl/xl.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/xl.c	Fri Oct 07 15:04:50 2011 +0100
@@ -162,3 +162,11 @@ int main(int argc, char **argv)
     xtl_logger_destroy((xentoollog_logger*)logger);
     return ret;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/xl.h
--- a/tools/libxl/xl.h	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/xl.h	Fri Oct 07 15:04:50 2011 +0100
@@ -109,3 +109,11 @@ extern char *lockfile;
 extern char *default_vifscript;
 
 #endif /* XL_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Fri Oct 07 15:04:50 2011 +0100
@@ -5413,3 +5413,11 @@ done:
 
     return ret;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r ea75a1765a4a -r 0925bc3120d1 tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c	Fri Oct 07 15:04:29 2011 +0100
+++ b/tools/libxl/xl_cmdtable.c	Fri Oct 07 15:04:50 2011 +0100
@@ -407,3 +407,11 @@ struct cmd_spec *cmdtable_lookup(const c
     }
     return (count == 1) ? cmd : NULL;
 }
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 07:16:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 07:16:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCBE0-0006dF-QK; Fri, 07 Oct 2011 07:16:32 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCBAF-0005S2-TU
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 07:12:40 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1317996756!19572635!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28077 invoked from network); 7 Oct 2011 14:12:36 -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;
	7 Oct 2011 14:12:36 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8275623"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 14:12: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, 7 Oct 2011 15:12:36 +0100
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 1RCBAC-0004a7-47;
	Fri, 07 Oct 2011 14:12:36 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RCBAA-0006wR-65;
	Fri, 07 Oct 2011 15:12:34 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9203-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 15:12:34 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9203: 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 9203 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9203/

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-amd64-xl-sedf     14 guest-localmigrate/x10       fail    like 9201
 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                  eb8637351535
baseline version:
 xen                  159be83e5fe9

------------------------------------------------------------
People who touched revisions under test:
  Boris Ostrovsky <boris.ostrovsky@amd.com>
  Daniel De Graaf <dgdegra@tycho.nsa.gov>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Juergen Gross <juergen.gross@ts.fujitsu.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


Pushing revision :

+ branch=xen-unstable
+ revision=eb8637351535
+ . 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 eb8637351535
+ branch=xen-unstable
+ revision=eb8637351535
+ . 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 eb8637351535 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 4 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 Fri Oct 07 08:23:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 08:23:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCCGb-0000q2-72; Fri, 07 Oct 2011 08:23:17 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCCFz-0000dn-SU
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 08:22:40 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1318000954!143756!1
X-Originating-IP: [192.55.52.88]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19551 invoked from network); 7 Oct 2011 15:22:36 -0000
Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88)
	by server-6.tower-216.messagelabs.com with SMTP;
	7 Oct 2011 15:22:36 -0000
Received: from fmsmga002.fm.intel.com ([10.253.24.26])
	by fmsmga101.fm.intel.com with ESMTP; 07 Oct 2011 08:22:34 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,502,1312182000"; d="scan'208";a="75802117"
Received: from orsmsx604.amr.corp.intel.com ([10.22.226.87])
	by fmsmga002.fm.intel.com with ESMTP; 07 Oct 2011 08:22:32 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx604.amr.corp.intel.com ([10.250.113.17]) with mapi;
	Fri, 7 Oct 2011 08:22:29 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Fri, 7 Oct 2011 08:22:29 -0700
Thread-Topic: [PATCH] VT-d: don't reject possibly valid DRHD or RMRR
Thread-Index: AcyEwQ5yFejVjY6yRGa6N9RALjYp8gAQ9Xaw
Message-ID: <987664A83D2D224EAE907B061CE93D5301EE709CBE@orsmsx505.amr.corp.intel.com>
References: <4E8B0A5F0200007800059286@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B4D@orsmsx505.amr.corp.intel.com>
	<4E8EC3AE0200007800059E25@nat28.tlf.novell.com>
In-Reply-To: <4E8EC3AE0200007800059E25@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>
Subject: [Xen-devel] RE: [PATCH] VT-d: don't reject possibly valid DRHD or
	RMRR
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Yes.  Ack!

Allen

-----Original Message-----
From: Jan Beulich [mailto:JBeulich@suse.com]=20
Sent: Friday, October 07, 2011 12:18 AM
To: Kay, Allen M
Cc: xen-devel@lists.xensource.com
Subject: RE: [PATCH] VT-d: don't reject possibly valid DRHD or RMRR

>>> On 07.10.11 at 03:51, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
> For RMRR case, looks like you miss the following change (or something=20
> similar):
>=20
> -for ( i =3D 0; i < rmrru->scope.devices_cnt; i++ )
> +for (; i < rmrru->scope.devices_cnt; i++ )

Indeed.

> Otherwise, the logic for handling non-zero PCI segments looks reasonable.

So do I take this as an acked-by-with-above-change?

> Allen
>=20
> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]=20
> Sent: Tuesday, October 04, 2011 4:30 AM
> To: xen-devel@lists.xensource.com=20
> Cc: Kay, Allen M
> Subject: [PATCH] VT-d: don't reject possibly valid DRHD or RMRR
>=20
> If a non-zero PCI segment isn't accessible during Xen boot (because
> firmware decided to not enter the necessary MMIO space into the E820
> table), devices referred to on those segments through DRHD or RMRR
> structures should not be rejected just because the devices can't be
> found.
>=20
> This is in line with what is being done in at least one other case
> already: Systems with more than one PCI segment (usually high end
> ones) are assumed to have valid firmware provided data, while systems
> with just segment 0 continue to have their firmware tables validated.
>=20
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>=20
> --- a/xen/drivers/passthrough/pci.c
> +++ b/xen/drivers/passthrough/pci.c
> @@ -53,6 +53,11 @@ static inline struct pci_seg *get_pseg(u
>      return radix_tree_lookup(&pci_segments, seg);
>  }
> =20
> +bool_t pci_known_segment(u16 seg)
> +{
> +    return get_pseg(seg) !=3D NULL;
> +}
> +
>  static struct pci_seg *alloc_pseg(u16 seg)
>  {
>      struct pci_seg *pseg =3D get_pseg(seg);
> --- a/xen/drivers/passthrough/vtd/dmar.c
> +++ b/xen/drivers/passthrough/vtd/dmar.c
> @@ -444,10 +444,14 @@ acpi_parse_one_drhd(struct acpi_dmar_ent
>      else
>      {
>          u8 b, d, f;
> -        int i, invalid_cnt =3D 0;
> +        unsigned int i =3D 0, invalid_cnt =3D 0;
>          void *p;
> =20
> -        for ( i =3D 0, p =3D dev_scope_start; i < dmaru->scope.devices_c=
nt;
> +        /* Skip checking if segment is not accessible yet. */
> +        if ( !pci_known_segment(drhd->segment) )
> +            i =3D UINT_MAX;
> +
> +        for ( p =3D dev_scope_start; i < dmaru->scope.devices_cnt;
>                i++, p +=3D ((struct acpi_dev_scope *)p)->length )
>          {
>              if ( ((struct acpi_dev_scope *)p)->dev_type =3D=3D ACPI_DEV_=
IOAPIC ||
> @@ -549,7 +553,12 @@ acpi_parse_one_rmrr(struct acpi_dmar_ent
>      else
>      {
>          u8 b, d, f;
> -        int i, ignore =3D 0;
> +        bool_t ignore =3D 0;
> +        unsigned int i =3D 0;
> +
> +        /* Skip checking if segment is not accessible yet. */
> +        if ( !pci_known_segment(rmrr->segment) )
> +            i =3D UINT_MAX;
> =20
>          for ( i =3D 0; i < rmrru->scope.devices_cnt; i++ )
>          {
> --- a/xen/include/xen/pci.h
> +++ b/xen/include/xen/pci.h
> @@ -82,6 +82,7 @@ enum {
>      DEV_TYPE_PCI,
>  };
> =20
> +bool_t pci_known_segment(u16 seg);
>  int pci_device_detect(u16 seg, u8 bus, u8 dev, u8 func);
>  int scan_pci_devices(void);
>  int pdev_type(u16 seg, u8 bus, u8 devfn);




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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 08:24:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 08:24:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCCHR-0001Cp-VW; Fri, 07 Oct 2011 08:24:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCCGb-0000p9-FU
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 08:23:17 -0700
X-Env-Sender: davidxu06@gmail.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318000993!34401201!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17459 invoked from network); 7 Oct 2011 15:23:14 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 15:23:14 -0000
Received: by ywt32 with SMTP id 32so760132ywt.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 08:23:12 -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:content-transfer-encoding;
	bh=AB/bIVX2TpkYLeg/tPzzwhl+VCiJ2FFIm8UekwX1ipU=;
	b=gk4Uu+Mi4OmPgeY8YOjEjdhHC7/gtP/WGxrtPLgoomdXNhTwDZhlTlLlToIhFEmm7I
	MSwcivqJ0XlDVCcOl8YiSrvSYBmckfjhBq4Umm9IaA5WLNfotaoqsT9TdxzzPVvzohbr
	SzBaJKxoirxprRWRWWVo3CnYkGpp+a0Fe8nuM=
MIME-Version: 1.0
Received: by 10.151.150.2 with SMTP id c2mr1055137ybo.53.1318000992562; Fri,
	07 Oct 2011 08:23:12 -0700 (PDT)
Received: by 10.150.157.13 with HTTP; Fri, 7 Oct 2011 08:23:12 -0700 (PDT)
In-Reply-To: <CAGjowiSkwN9Oz-qevYk2G1NgwBmFOLWFLtT30aBu0SAe=jqtog@mail.gmail.com>
References: <CAGjowiTc0NAJbWR-RxwLTrz+bhbAFfvcPKPAB_F8r1ef6__PbA@mail.gmail.com>
	<1317368064.26672.198.camel@zakaz.uk.xensource.com>
	<CAGjowiQE_3gTJxK+Ja850QU9g1+97hZ8hAgdv_a4B18jxmCNGw@mail.gmail.com>
	<1317393663.26672.288.camel@zakaz.uk.xensource.com>
	<CAGjowiSrPCY50-iBK67nGfOGdK7z1htc58ohtrqJtmutmRRQzQ@mail.gmail.com>
	<1317394559.26672.293.camel@zakaz.uk.xensource.com>
	<CAGjowiSkwN9Oz-qevYk2G1NgwBmFOLWFLtT30aBu0SAe=jqtog@mail.gmail.com>
Date: Fri, 7 Oct 2011 11:23:12 -0400
Message-ID: <CAGjowiSQO_Hzdbz0FxQK_7ppr-yvBSWYVbzoSUd_RfiWytZKPw@mail.gmail.com>
Subject: Re: [Xen-devel] ring buffer overflow
From: David Xu <davidxu06@gmail.com>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: Ian Campbell <Ian.Campbell@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

Hi,

I want to use the libxc function xc_sched_credit_domain_set( int
xc_handle, uint32_t domid, struct xen_domctl_sched_credit *sdom) in a
user-level application. But I don't know how to set the value of
xc_handle. Is there somebody familiar with it? Thanks.

Regards,
Cong

2011/10/4 David Xu <davidxu06@gmail.com>:
> Hi,
>
> I made the experiment with httperf again, and used tcpdump to capture
> the packets on both server side and client side. I found that if there
> was some retransmission (e.t. client send several syn to server
> because it didn't receive ack in time), the vif only receive the last
> packet (syn) and missed the former ones. So I think there are some
> issues happened between the eth0(veth0) and vif in the dom0. But if I
> use a low latency scheduler written by myself (only modify the client
> scheduler and didn't touch other parts ), there will not be
> retransmission or there is very few retransmission. I am not familiar
> with netback of xen. Can you give me some suggestion? Or which part
> source code I need to check to find the reason of packets loss between
> eth0(veth0) and vif in dom0? Thanks.
>
> Regards,
> Cong
>
> 2011/9/30 Ian Campbell <Ian.Campbell@eu.citrix.com>:
>> On Fri, 2011-09-30 at 15:44 +0100, David Xu wrote:
>>> Hi,
>>>
>>> 2011/9/29 Ian Campbell <Ian.Campbell@citrix.com>:
>>> > On Fri, 2011-09-30 at 05:18 +0100, David Xu wrote:
>>> >> Hi,
>>> >>
>>> >> Does anybody know whether the ring buffer between front end and back
>>> >> end will suffer from overflow? I just wonder if the ring buffer will
>>> >> be full and drop some packets when the Net I/O load is very heavy.
>>> >
>>> > In the case of networking whichever end is putting stuff on the ring
>>> > checks that there is enough room and will stop the queue when it cann=
ot
>>> > transmit any more and restart when room becomes available.
>>>
>>> You mean even there is not enough room in ring buffer, xen will * not
>>> drop the packets * and just delay the transmission.
>>
>> It's not Xen but rather the kernel back and front ends which is involved
>> here. You can examine the hard_start_xmit functions in both netback and
>> netfront to determine for yourself whether or not packets can be dropped
>> and when.
>>
>>> =A0I used httperf to
>>> measure the performance of web server running in a VM (The workload in
>>> this VM is mixed, so it can not benefit from boost mechanism. The net
>>> i/o suffers from relatively high latency which depends on the number
>>> of VMs in the system). I found that with the increase of request rate
>>> in client side, the connection rate will drop and the connection time
>>> will increase dramatically. And the retransmission appears when the
>>> request rate is over than a quantum. So I doubted that the http/tcp
>>> connection suffer from the packets drop when the ring buffer is full
>>> because of high request rate.
>>>
>>> >
>>> >> BTW, If I want to change the size of i/o ring buffer, how should I d=
o?
>>> >> I tried to reset the NET_TX_RING_SIZE and NET_RX_RING_SIZE in both
>>> >> front end and back end, but it seems doesn't work. Thanks.
>>> >
>>> > Currently the rings are limited to 1 page so if you want to increase =
the
>>> > size you would need to add multipage ring support to the network
>>> > protocol. There have been patches to do this for the blk protocol but=
 I
>>> > do not recall any for the net protocol.
>>>
>>> Yes, increasing the size is relatively hard. So I just want reduce the
>>> size of ring buffer to make sure my doubt described above. I directly
>>> set =A0NET_TX_RING_SIZE and =A0NET_RX_RING_SIZE to 128, but it doesn't =
seem to work.
>>
>> You need to make sure both ends of the connection agree on the ring
>> size.
>>
>> I'm afraid this is not a very common thing to want to do so if you want
>> to persist with this approach I'm afraid you'll have to do some
>> debugging.
>>
>> Ian.
>>
>>
>>
>

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 08:24:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 08:24:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCCID-0001Z1-Nf; Fri, 07 Oct 2011 08:24:57 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCCH9-00013e-Iv
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 08:23:52 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318001027!18600962!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17931 invoked from network); 7 Oct 2011 15:23:48 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-3.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 15:23:48 -0000
Received: by qabg14 with SMTP id g14so4201988qab.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 08:23: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:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type
	:content-transfer-encoding;
	bh=HFXc3943Ct6M6PHsRyaeKl/cHqLFhA4oBygaZlqVfM8=;
	b=oPH6DLUvAGWFaDK9uMHkLT7+y9PPBYi3X4GO+H1FB0k0Zw7P6WinBd3QYbTO2GffgQ
	mVSwDO2lYcgs7sliemAJpYcQb17O+53ngVflPo+IQ0UzyF2WCCVk5cym1w9fglIhyC31
	TP+mI0/kDPOV+YZEFmKKX9VmhKF14BD/9N6cg=
Received: by 10.224.199.134 with SMTP id es6mr412735qab.2.1318001027100; Fri,
	07 Oct 2011 08:23:47 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.224.28.142 with HTTP; Fri, 7 Oct 2011 08:23:17 -0700 (PDT)
In-Reply-To: <1317990988.21903.339.camel@zakaz.uk.xensource.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-6-git-send-email-anthony.perard@citrix.com>
	<1317990988.21903.339.camel@zakaz.uk.xensource.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Fri, 7 Oct 2011 16:23:17 +0100
X-Google-Sender-Auth: FPULsOAHKOd0zhqEkqq8SGzooP4
Message-ID: <CAJJyHjJikSYbsOZJY9EQ+pTgnTrswmDVRo58Pb5Zp4hz2s+nuw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 5/7] libxl_qmp, Return the callback return
	code in qmp_next.
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Xen Devel <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 Fri, Oct 7, 2011 at 13:36, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
>> So, if there is an error in the answer given by QEMU, the function
>> qmp_synchronous_send while know.
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 "will"
>
>>
>> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>> ---
>> =C2=A0tools/libxl/libxl_qmp.c | =C2=A0 14 ++++++++------
>> =C2=A01 files changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
>> index 1594a4f..cd3e4e4 100644
>> --- a/tools/libxl/libxl_qmp.c
>> +++ b/tools/libxl/libxl_qmp.c
>> @@ -233,6 +233,7 @@ static int qmp_handle_response(libxl__qmp_handler *q=
mp,
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 const libxl__json_object *resp)
>> =C2=A0{
>> =C2=A0 =C2=A0 =C2=A0libxl__qmp_message_type type =3D LIBXL__QMP_MESSAGE_=
TYPE_INVALID;
>> + =C2=A0 =C2=A0int rc =3D 0;
>>
>> =C2=A0 =C2=A0 =C2=A0type =3D qmp_response_type(qmp, resp);
>> =C2=A0 =C2=A0 =C2=A0LIBXL__LOG(qmp->ctx, LIBXL__LOG_DEBUG,
>> @@ -241,14 +242,14 @@ static int qmp_handle_response(libxl__qmp_handler =
*qmp,
>> =C2=A0 =C2=A0 =C2=A0switch (type) {
>> =C2=A0 =C2=A0 =C2=A0case LIBXL__QMP_MESSAGE_TYPE_QMP:
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* On the greeting message from the se=
rver, enable QMP capabilities */
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0enable_qmp_capabilities(qmp);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D enable_qmp_capabilities(qmp);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
>> =C2=A0 =C2=A0 =C2=A0case LIBXL__QMP_MESSAGE_TYPE_RETURN: {
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0callback_id_pair *pp =3D qmp_get_callb=
ack_from_id(qmp, resp);
>>
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (pp) {
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (pp->callback) {
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pp->callback(qm=
p,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D pp->call=
back(qmp,
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 libxl__json_map_get("return", resp, JSON=
_ANY),
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pp->opaque);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> @@ -263,13 +264,13 @@ static int qmp_handle_response(libxl__qmp_handler =
*qmp,
>> =C2=A0 =C2=A0 =C2=A0}
>> =C2=A0 =C2=A0 =C2=A0case LIBXL__QMP_MESSAGE_TYPE_ERROR:
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0qmp_handle_error_response(qmp, resp);
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>
> A mixture or "return -1" and a rc variable returned at the outermost
> level is a bit odd. You should either always set rc and fall through or
> always return at the end of each case.

OK, I will change that.

>> =C2=A0 =C2=A0 =C2=A0case LIBXL__QMP_MESSAGE_TYPE_EVENT:
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
>> =C2=A0 =C2=A0 =C2=A0case LIBXL__QMP_MESSAGE_TYPE_INVALID:
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return -1;
>> =C2=A0 =C2=A0 =C2=A0}
>> - =C2=A0 =C2=A0return 0;
>> + =C2=A0 =C2=A0return rc;
>> =C2=A0}
>>
>> =C2=A0/*
>> @@ -358,6 +359,7 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handle=
r *qmp)
>>
>> =C2=A0 =C2=A0 =C2=A0char *incomplete =3D NULL;
>> =C2=A0 =C2=A0 =C2=A0size_t incomplete_size =3D 0;
>> + =C2=A0 =C2=A0int rc =3D 0;
>>
>> =C2=A0 =C2=A0 =C2=A0do {
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fd_set rfds;
>> @@ -416,7 +418,7 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handle=
r *qmp)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s =3D end =
+ 2;
>>
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (o) {
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0q=
mp_handle_response(qmp, o);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r=
c =3D qmp_handle_response(qmp, o);
>
> If rc now indicates error do we need to bail straight away or need to
> keep going around this loop? (Or is it certain we will immediately fall
> out of the loop after this?)

We can not be sure that we will return, because it could be another
message in the butffer. So I should return if there is a protocol
error. But I think that I should keep seperate the return code of a
callback, so only the interested function (qmp_synchronous_send) will
read it (and return to the caller).

>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0libxl__json_object_free(gc, o);
>> =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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0LIBXL__LOG(qmp->ctx, LIBXL__LOG_ERROR,
>> @@ -429,7 +431,7 @@ static int qmp_next(libxl__gc *gc, libxl__qmp_handle=
r *qmp)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0} while (s < s_end);
>> =C2=A0 =C2=A0 } while (s < s_end);
>>
>> - =C2=A0 =C2=A0return 1;
>> + =C2=A0 =C2=A0return rc;
>> =C2=A0}
>>
>> =C2=A0static int qmp_send(libxl__qmp_handler *qmp,

--=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 Fri Oct 07 08:25:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 08:25:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCCJ1-0001vj-UL; Fri, 07 Oct 2011 08:25:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCCHa-0001Fa-9S
	for Xen-devel@lists.xensource.com; Fri, 07 Oct 2011 08:24:18 -0700
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1318001034!47769210!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16688 invoked from network); 7 Oct 2011 15:23:55 -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; 7 Oct 2011 15:23:55 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p97FNhPf019124
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Fri, 7 Oct 2011 15:23:44 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p97FNgwU000140
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 7 Oct 2011 15:23:42 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
	p97FNaWH020363; Fri, 7 Oct 2011 10:23:36 -0500
MIME-Version: 1.0
Message-ID: <4d0a5da4-00de-40dd-8d75-8ed6e3d0831c@default>
Date: Fri, 7 Oct 2011 08:23:38 -0700 (PDT)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: Larry Bassel <lbassel@codeaurora.org>
Subject: RE: [Xen-devel] Re: RFC -- new zone type
References: <20110928180909.GA7007@labbmf-linux.qualcomm.comCAOFJiu1_HaboUMqtjowA2xKNmGviDE55GUV4OD1vN2hXUf4-kQ@mail.gmail.com>
	<c2d9add1-0095-4319-8936-db1b156559bf@default20111005165643.GE7007@labbmf-linux.qualcomm.com>
	<cc1256f9-4808-4d74-a321-6a3ec129cc05@default
	20111006230348.GF7007@labbmf-linux.qualcomm.com>
In-Reply-To: <20111006230348.GF7007@labbmf-linux.qualcomm.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: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090205.4E8F1981.007F,ss=1,re=0.000,fgs=0
Cc: linux-mm@kvack.org, Xen-devel@lists.xensource.com,
	Seth Jennings <sjenning@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

> From: Larry Bassel [mailto:lbassel@codeaurora.org]
> Sent: Thursday, October 06, 2011 5:04 PM
> To: Dan Magenheimer
> Cc: Larry Bassel; linux-mm@kvack.org; Xen-devel@lists.xensource.com
> Subject: Re: [Xen-devel] Re: RFC -- new zone type
>=20
> Thanks for your answers to my questions. I have one more:
>=20
> Will there be any problem if the memory I want to be
> transcendent is highmem (i.e. doesn't have any permanent
> virtual<->physical mapping)?

Hi Larry --

I have to admit I am not an expert with highmem things.
Seth Jennings (cc'ed) fixed highmem for zcache with
a patch, so I assume that there shouldn't be a problem
for your code.

Dan

P.S. Seth, google for the subject if needed... there is
not a single email thread I can easily point you to.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 08:33:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 08:33:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCCQZ-0002Xj-7S; Fri, 07 Oct 2011 08:33:35 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCCQ6-0002Lx-Rb
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 08:33:07 -0700
X-Env-Sender: Ian.Campbell@eu.citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1318001567!52997048!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28246 invoked from network); 7 Oct 2011 15:32:47 -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 Oct 2011 15:32:47 -0000
X-IronPort-AV: E=Sophos;i="4.68,502,1312156800"; 
   d="scan'208";a="8277427"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 15:33: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, 7 Oct 2011
	16:33:03 +0100
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: Thomas Gleixner <tglx@linutronix.de>
Date: Fri, 7 Oct 2011 16:32:58 +0100
In-Reply-To: <alpine.LFD.2.02.1110032229250.1489@ionos>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
	<1317668908.11991.20.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110032229250.1489@ionos>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318001583.21903.355.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	xen-devel <xen-devel@lists.xensource.com>, Konrad Rzeszutek
	Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-03 at 22:35 +0200, Thomas Gleixner wrote:
> > > >       * Add "IRQF_RESUME_EARLY", driven from syscore_resume, and
> use it
> > > >         for these interrupts.
> > > 
> > > That's the preferable solution, as we could use that for PPC as
> well,
> > > unless we can move stuff around, so we disable stuff later.
> > 
> > OK
> 
> I guess we should go down that road then.

How does this look? I've done 100 successful migrations with it and am
running another batch as we speak.

BTW original changeset which exposed this has made it into at least the
longterm 2.6.32 release (http://bugs.debian.org/644604) so I'm cc'ing
stable@ too.

Ian.

8<--------------------------

>From bb24b9b45e071e5290a71a6445f4c156b8341699 Mon Sep 17 00:00:00 2001
From: Ian Campbell <ian.campbell@citrix.com>
Date: Mon, 3 Oct 2011 15:37:00 +0100
Subject: [PATCH] irq: add IRQF_RESUME_EARLY and resume such IRQs earlier in the process

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 earlier 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: Thomas Gleixner <tglx@linutronix.de>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: stable@kernel.org (at least to 2.6.32.y)
---
 drivers/xen/events.c      |    2 +-
 include/linux/interrupt.h |    2 ++
 kernel/irq/pm.c           |   38 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 41 insertions(+), 1 deletions(-)

diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 7523719..44490de 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 a103732..a3b8baa 100644
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -59,6 +59,7 @@
  * 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 +73,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..4fbfb36 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"
 
@@ -40,6 +41,40 @@ void suspend_device_irqs(void)
 EXPORT_SYMBOL_GPL(suspend_device_irqs);
 
 /**
+ * irq_pm_syscore_ops - enable interrupt lines early
+ *
+ * Enable all interrupt lines with %IRQF_EARLY_RESUME set
+ */
+static void irq_pm_syscore_resume(void)
+{
+	struct irq_desc *desc;
+	int irq;
+
+	for_each_irq_desc(irq, desc) {
+		unsigned long flags;
+
+		if (!desc->action || !(desc->action->flags & IRQF_EARLY_RESUME))
+			continue;
+
+		raw_spin_lock_irqsave(&desc->lock, flags);
+		__enable_irq(desc, irq, true);
+		raw_spin_unlock_irqrestore(&desc->lock, flags);
+	}
+}
+
+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 interrupt lines previously disabled by suspend_device_irqs() that
@@ -53,6 +88,9 @@ void resume_device_irqs(void)
 	for_each_irq_desc(irq, desc) {
 		unsigned long flags;
 
+		if (desc->action && desc->action->flags & IRQF_EARLY_RESUME)
+			continue;
+
 		raw_spin_lock_irqsave(&desc->lock, flags);
 		__enable_irq(desc, irq, true);
 		raw_spin_unlock_irqrestore(&desc->lock, flags);
-- 
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 Fri Oct 07 08:35:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 08:35:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCCSd-0002vS-FV; Fri, 07 Oct 2011 08:35:43 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCCSA-0002jk-C6
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 08:35:14 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1318001711!16421610!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17634 invoked from network); 7 Oct 2011 15:35:11 -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; 7 Oct 2011 15:35:11 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 07 Oct 2011 16:35:10 +0100
Message-Id: <4E8F3888020000780005A19D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 07 Oct 2011 16:36:08 +0100
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] linux-2.6.18/MSI-X: Avoid unconditional BUG()
	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

msi_remove_pci_irq_vectors() unconditionally (i.e. even in a DomU)
calling msi_unmap_pirq() is guaranteed to BUG() in msi_get_dev_owner().
Adjust the function to call evtchn_map_pirq() instead in a DomU (just
like pci_disable_msix() is doing).

While looking into this I also realized that the
CONFIG_XEN_PCIDEV_FRONTEND conditionals are misplaced - since on x86-64
it is possible to build with this disabled, execution would flow into
Dom0 code even on a DomU in this case. Hence adjust their placement at
once.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/drivers/pci/msi-xen.c
+++ b/drivers/pci/msi-xen.c
@@ -547,9 +547,8 @@ int pci_enable_msi(struct pci_dev* dev
 	if (status < 0)
 		return status;
=20
+	if (!is_initial_xendomain()) {
 #ifdef CONFIG_XEN_PCIDEV_FRONTEND
-	if (!is_initial_xendomain())
-	{
 		int ret;
=20
 		temp =3D dev->irq;
@@ -563,8 +562,10 @@ int pci_enable_msi(struct pci_dev* dev
 		msi_dev_entry->default_irq =3D temp;
=20
 		return ret;
-	}
+#else
+		return -EOPNOTSUPP;
 #endif
+	}
=20
 	temp =3D dev->irq;
=20
@@ -592,8 +593,8 @@ void pci_disable_msi(struct pci_dev* dev
 	if (!dev)
 		return;
=20
-#ifdef CONFIG_XEN_PCIDEV_FRONTEND
 	if (!is_initial_xendomain()) {
+#ifdef CONFIG_XEN_PCIDEV_FRONTEND
 		if (!(dev->msi_enabled)) {
 			printk(KERN_INFO "PCI: %s: Device did not enabled =
MSI.\n",
 			       pci_name(dev));
@@ -603,9 +604,9 @@ void pci_disable_msi(struct pci_dev* dev
 		pci_frontend_disable_msi(dev);
 		dev->irq =3D msi_dev_entry->default_irq;
 		dev->msi_enabled =3D 0;
+#endif
 		return;
 	}
-#endif
=20
 	pos =3D pci_find_capability(dev, PCI_CAP_ID_MSI);
 	if (!pos)
@@ -663,8 +664,8 @@ void pci_disable_msix(struct pci_dev *de
 		if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
 			return -EINVAL;
=20
-#ifdef CONFIG_XEN_PCIDEV_FRONTEND
 	if (!is_initial_xendomain()) {
+#ifdef CONFIG_XEN_PCIDEV_FRONTEND
 		struct msi_pirq_entry *pirq_entry;
 		int ret, irq;
=20
@@ -696,9 +697,11 @@ int pci_enable_msix(struct pci_dev* dev,
 			attach_pirq_entry(irq, entries[i].entry, msi_dev_en=
try);
 			entries[i].vector =3D irq;
 		}
-        return 0;
-	}
+		return 0;
+#else
+		return -EOPNOTSUPP;
 #endif
+	}
=20
 	status =3D msi_init();
 	if (status < 0)
@@ -741,8 +744,8 @@ void pci_disable_msix(struct pci_dev *de
 		return;
 	}
=20
-#ifdef CONFIG_XEN_PCIDEV_FRONTEND
 	if (!is_initial_xendomain()) {
+#ifdef CONFIG_XEN_PCIDEV_FRONTEND
 		struct msi_dev_list *msi_dev_entry;
 		struct msi_pirq_entry *pirq_entry, *tmp;

@@ -758,9 +761,9 @@ void pci_msix_shutdown(struct pci_dev *d

		dev->irq =3D msi_dev_entry->default_irq;
		dev->msix_enabled =3D 0;
+#endif
 		return;
 	}
-#endif
=20
 	pos =3D pci_find_capability(dev, PCI_CAP_ID_MSIX);
 	if (!pos)
@@ -800,7 +791,10 @@ void msi_remove_pci_irq_vectors(struct p
 	if (!list_empty(&msi_dev_entry->pirq_list_head))
 		list_for_each_entry_safe(pirq_entry, tmp,
 		                         &msi_dev_entry->pirq_list_head, =
list) {
-			msi_unmap_pirq(dev, pirq_entry->pirq);
+			if (is_initial_xendomain())
+				msi_unmap_pirq(dev, pirq_entry->pirq);
+			else
+				evtchn_map_pirq(pirq_entry->pirq, 0);
 			list_del(&pirq_entry->list);
 			kfree(pirq_entry);
 		}




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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 08:47:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 08:47:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCCe3-0003YW-8k; Fri, 07 Oct 2011 08:47:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCCdY-0003MB-Bh
	for Xen-devel@lists.xensource.com; Fri, 07 Oct 2011 08:47:00 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318002426!54600302!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27059 invoked from network); 7 Oct 2011 15:47:08 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2011 15:47:08 -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 21C2B8883;
	Fri,  7 Oct 2011 08:46:54 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 8E48D2063C;
	Fri,  7 Oct 2011 08:46:52 -0700 (PDT)
Message-ID: <4E8F1EEC.9000205@goop.org>
Date: Fri, 07 Oct 2011 08:46:52 -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: Mukesh Rathor <mukesh.rathor@oracle.com>
References: <20111006191241.0866625f@mantra.us.oracle.com>
In-Reply-To: <20111006191241.0866625f@mantra.us.oracle.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>,
	stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] Re: HYBRID: set_page_prot() (make pte readonly)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/06/2011 07:12 PM, Mukesh Rathor wrote:
> So, I'm at a loss on how to make set_page_prot() work during 
> xen_map_identity_early(). I tried few things, but no luck. The fixmap
> is not setup during this time, so can't use that. 
>
> Have any ideas?

Why do you need set_page_prot() at all?  It's only being used to mark
pagetable entries RO, but you presumably don't need to do that with EPT.

    J

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 08:50:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 08:50:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCCge-00045W-EJ; Fri, 07 Oct 2011 08:50:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCCgC-0003tE-AO
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 08:49:44 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1318002561!47772162!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16913 invoked from network); 7 Oct 2011 15:49:21 -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;
	7 Oct 2011 15:49:21 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8277702"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 15:49: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, 7 Oct 2011
	16:49:41 +0100
Subject: Re: [Xen-devel] ring buffer overflow
From: Ian Campbell <Ian.Campbell@eu.citrix.com>
To: David Xu <davidxu06@gmail.com>
Date: Fri, 7 Oct 2011 16:49:40 +0100
In-Reply-To: <CAGjowiSQO_Hzdbz0FxQK_7ppr-yvBSWYVbzoSUd_RfiWytZKPw@mail.gmail.com>
References: <CAGjowiTc0NAJbWR-RxwLTrz+bhbAFfvcPKPAB_F8r1ef6__PbA@mail.gmail.com>
	<1317368064.26672.198.camel@zakaz.uk.xensource.com>
	<CAGjowiQE_3gTJxK+Ja850QU9g1+97hZ8hAgdv_a4B18jxmCNGw@mail.gmail.com>
	<1317393663.26672.288.camel@zakaz.uk.xensource.com>
	<CAGjowiSrPCY50-iBK67nGfOGdK7z1htc58ohtrqJtmutmRRQzQ@mail.gmail.com>
	<1317394559.26672.293.camel@zakaz.uk.xensource.com>
	<CAGjowiSkwN9Oz-qevYk2G1NgwBmFOLWFLtT30aBu0SAe=jqtog@mail.gmail.com>
	<CAGjowiSQO_Hzdbz0FxQK_7ppr-yvBSWYVbzoSUd_RfiWytZKPw@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: <1318002580.21903.361.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

Stop top posting, I've asked you this before.

On Fri, 2011-10-07 at 16:23 +0100, David Xu wrote:
> Hi,
> 
> I want to use the libxc function xc_sched_credit_domain_set( int
> xc_handle, uint32_t domid, struct xen_domctl_sched_credit *sdom) in a
> user-level application. But I don't know how to set the value of
> xc_handle. Is there somebody familiar with it? Thanks.

You can't use xc_* functions in the kernel, they are userspace. You
could in theory look at the implementation of xc_sched_credit_domain_set
to find out what that hypercall is and make the underlying hypercall
instead, But:

The hypercall in question here is a domctl which are not available /
allowed from kernel space (for policy and semantic reasons rather than
technological ones).

As I explained elsewhere I don't think the architecture you have in mind
is correct. I think you should look at exporting the necessary
statistics from the kernel to userspace and have a daemon implement the
logic and mechanisms for changing the scheduling parameters as required.

Ian.



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 08:56:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 08:56:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCCn4-0004aQ-QC; Fri, 07 Oct 2011 08:56:50 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCCmc-0004OY-I9
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 08:56:22 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-15.tower-174.messagelabs.com!1318002979!28042885!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30164 invoked from network); 7 Oct 2011 15:56:19 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-15.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Oct 2011 15:56:19 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RCCmV-000Dvj-OS; Fri, 07 Oct 2011 15:56:15 +0000
Date: Fri, 7 Oct 2011 16:56:15 +0100
From: Tim Deegan <tim@xen.org>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: libxc handles (was Re: [Xen-devel] ring buffer overflow)
Message-ID: <20111007155615.GB53408@ocelot.phlegethon.org>
References: <CAGjowiTc0NAJbWR-RxwLTrz+bhbAFfvcPKPAB_F8r1ef6__PbA@mail.gmail.com>
	<1317368064.26672.198.camel@zakaz.uk.xensource.com>
	<CAGjowiQE_3gTJxK+Ja850QU9g1+97hZ8hAgdv_a4B18jxmCNGw@mail.gmail.com>
	<1317393663.26672.288.camel@zakaz.uk.xensource.com>
	<CAGjowiSrPCY50-iBK67nGfOGdK7z1htc58ohtrqJtmutmRRQzQ@mail.gmail.com>
	<1317394559.26672.293.camel@zakaz.uk.xensource.com>
	<CAGjowiSkwN9Oz-qevYk2G1NgwBmFOLWFLtT30aBu0SAe=jqtog@mail.gmail.com>
	<CAGjowiSQO_Hzdbz0FxQK_7ppr-yvBSWYVbzoSUd_RfiWytZKPw@mail.gmail.com>
	<1318002580.21903.361.camel@zakaz.uk.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1318002580.21903.361.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.4.2.1i
Cc: David Xu <davidxu06@gmail.com>, 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

At 16:49 +0100 on 07 Oct (1318006180), Ian Campbell wrote:
> Stop top posting, I've asked you this before.

Also, please start a new thread for a new question; the subject line of
your email didn't match the contents.

> On Fri, 2011-10-07 at 16:23 +0100, David Xu wrote:
> > Hi,
> > 
> > I want to use the libxc function xc_sched_credit_domain_set( int
> > xc_handle, uint32_t domid, struct xen_domctl_sched_credit *sdom) in a
> > user-level application. But I don't know how to set the value of
> > xc_handle. Is there somebody familiar with it? Thanks.
> 
> You can't use xc_* functions in the kernel, they are userspace.

He's programming in userspace. :)

You need to call xc_interface_open() to get an xc_handle.  Please read
through the rest of xenctrl.h before asking any more coding questions
here.  You could also have found the answer by looking at any of the
other programs in the tools/ directore that use the xc interface. 

Cheers,

Tim.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 09:04:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 09:04:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCCus-00056y-Vn; Fri, 07 Oct 2011 09:04:54 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCCrv-0004sJ-RR
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 09:02:31 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1318003303!19586229!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15926 invoked from network); 7 Oct 2011 16:01:44 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 16:01:44 -0000
Received: by qabg14 with SMTP id g14so4249345qab.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 09:01:43 -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
	:content-transfer-encoding;
	bh=OVzXm4u08+2kFAUyJdid6YV8+B0DPIK+gQyZoEQM0W8=;
	b=erR1Xur6mPEG+onLtwEyR8tgHZNXzUcX3Z2vROwraptq3lEGcRRF4aPSE7pHYgdiwe
	Ea0sCpMd32PG24Jc0KbDkQGjcAJWV9wYR2H3J2VSX2ltxYdSGTo6FLMrBsblv6ijSiOd
	wDE11rWv0vJE2hO8x//y6fOGhoymuftSgG55Q=
Received: by 10.224.195.201 with SMTP id ed9mr2576194qab.41.1318003303143;
	Fri, 07 Oct 2011 09:01:43 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.224.28.142 with HTTP; Fri, 7 Oct 2011 09:01:12 -0700 (PDT)
In-Reply-To: <1317991406.21903.343.camel@zakaz.uk.xensource.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-7-git-send-email-anthony.perard@citrix.com>
	<1317991406.21903.343.camel@zakaz.uk.xensource.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Fri, 7 Oct 2011 17:01:12 +0100
X-Google-Sender-Auth: A-9Mp8_Kx1Vf1i9kc5p3oOyZlhQ
Message-ID: <CAJJyHj+HxoGTASskM9eww=FrRwFcM8DN8e4Xcw2U23fQQE5Oxg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 6/7] libxl_qmp, Introduce libxl__qmp_pci_add.
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Xen Devel <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 Fri, Oct 7, 2011 at 13:43, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
>> This function insert a PCI passthrough device in qemu.
>>
>> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>> ---
>> =C2=A0tools/libxl/libxl_internal.h | =C2=A0 =C2=A02 +
>> =C2=A0tools/libxl/libxl_qmp.c =C2=A0 =C2=A0 =C2=A0| =C2=A0 89 ++++++++++=
++++++++++++++++++++++++++++++++
>> =C2=A02 files changed, 91 insertions(+), 0 deletions(-)
>>
>> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
>> index 4dd0f91..78e1be2 100644
>> --- a/tools/libxl/libxl_internal.h
>> +++ b/tools/libxl/libxl_internal.h
>> @@ -119,6 +119,7 @@ typedef struct {
>> =C2=A0} libxl__device;
>>
>> =C2=A0#define XC_PCI_BDF =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "0x%x=
, 0x%x, 0x%x, 0x%x"
>> +#define PCI_DEVFN(slot, func) =C2=A0 ((((slot) & 0x1f) << 3) | ((func) =
& 0x07))
>
> No need to include the domain or dev in this? The name is pretty weird
> if you don't include the dev portion. =C2=A0Looks like this is actually a
> vdevfn? xl has an open coded instance of this pattern for that -- worth
> adding a public macro?

I have actual copy the macro from qemu, and I think "slot =3D=3D=3D dev". I
think the macro come from linux/pci.h.
But yes, I use it to store the vdevfn.

> FWIW pcidev_encode_bdf() exists which encodes the whole lot from a
> libxl_device_pci, if that what you end up needing.

If the vdefvn should contain the virtual bus and domain number, so
yes, that will be the function I need.

--=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 Fri Oct 07 09:08:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 09:08:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCCyM-0005We-70; Fri, 07 Oct 2011 09:08:30 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCCuF-00051h-Fy
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 09:04:21 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1318003451!16387301!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16930 invoked from network); 7 Oct 2011 16:04:12 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 16:04:12 -0000
Received: by qabg14 with SMTP id g14so4252376qab.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 09:04:11 -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=3NPtMXRDfUots/heD8FFuCij/h2BSVfhibwf6Oo/wzg=;
	b=qst5e+dHfN1MAdqrkEktDToH0w7U+et9vH69y/mvWmp7Op2BG2Mw02p9WLhjknMr9V
	egeBSI86QousbnKy4H0RapAvq9JbJQK3V+m6Rl3qDW6GHct/ys87Q0i3eE8zolcIz2/y
	NDuhCRveJ60LwI0MwFufC1WbPljd3SLtH2v+k=
Received: by 10.224.204.10 with SMTP id fk10mr2581260qab.93.1318003451111;
	Fri, 07 Oct 2011 09:04:11 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.224.28.142 with HTTP; Fri, 7 Oct 2011 09:03:41 -0700 (PDT)
In-Reply-To: <1317991518.21903.345.camel@zakaz.uk.xensource.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-8-git-send-email-anthony.perard@citrix.com>
	<1317991518.21903.345.camel@zakaz.uk.xensource.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Fri, 7 Oct 2011 17:03:41 +0100
X-Google-Sender-Auth: kyMlocueu8Go-_lCwAWwW55GqUY
Message-ID: <CAJJyHjL0MVhsu=LSpy3ZVfyNS6Y7S0jzBjFT-PVdtr-4cXBfgQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 7/7] libxl, Use QMP to insert a passthrough
	device when using upstream QEMU
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=UTF-8
Cc: Xen Devel <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 Fri, Oct 7, 2011 at 13:45, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
>> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>
> Sticking within the 80-column limit is getting pretty hard, perhaps
> pulling out the interactions with old-qemu into a new function would
> help?

I think it does, so I will probably create this new function.

-- 
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 Oct 07 09:24:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 09:24:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCDDp-00067x-DO; Fri, 07 Oct 2011 09:24:29 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCDD7-0005v1-3V
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 09:23:48 -0700
X-Env-Sender: davidxu06@gmail.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1318004601!47776325!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32477 invoked from network); 7 Oct 2011 16:23:22 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-9.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 16:23:22 -0000
Received: by gyh3 with SMTP id 3so6187860gyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 09:23:40 -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=xF988WVHO5JgApBfcW6E3zng3lybJXyLogVQ4JKOKMA=;
	b=scJUCmUKi97TsfAQ4LIwfY0UTmx1H1ewit34qsz5oJn2sjme/aQ6ZY/303K2ASdXgb
	XF+DjnbQ+P11bx/SDcRii/mzPiRF2SmpW71QTD3u4ak3c2IKlpzJMFk4S26V5ZpQvB6o
	2RFvM3DSALjoL4tiLvKfEcSlXd0gZXq4Jwbk0=
MIME-Version: 1.0
Received: by 10.150.175.9 with SMTP id x9mr1715991ybe.152.1318004620600; Fri,
	07 Oct 2011 09:23:40 -0700 (PDT)
Received: by 10.150.157.13 with HTTP; Fri, 7 Oct 2011 09:23:40 -0700 (PDT)
In-Reply-To: <1318002580.21903.361.camel@zakaz.uk.xensource.com>
References: <CAGjowiTc0NAJbWR-RxwLTrz+bhbAFfvcPKPAB_F8r1ef6__PbA@mail.gmail.com>
	<1317368064.26672.198.camel@zakaz.uk.xensource.com>
	<CAGjowiQE_3gTJxK+Ja850QU9g1+97hZ8hAgdv_a4B18jxmCNGw@mail.gmail.com>
	<1317393663.26672.288.camel@zakaz.uk.xensource.com>
	<CAGjowiSrPCY50-iBK67nGfOGdK7z1htc58ohtrqJtmutmRRQzQ@mail.gmail.com>
	<1317394559.26672.293.camel@zakaz.uk.xensource.com>
	<CAGjowiSkwN9Oz-qevYk2G1NgwBmFOLWFLtT30aBu0SAe=jqtog@mail.gmail.com>
	<CAGjowiSQO_Hzdbz0FxQK_7ppr-yvBSWYVbzoSUd_RfiWytZKPw@mail.gmail.com>
	<1318002580.21903.361.camel@zakaz.uk.xensource.com>
Date: Fri, 7 Oct 2011 12:23:40 -0400
Message-ID: <CAGjowiTvPu4KFTeLLCVUvoRombjXGscVWAgHLNi6+T7uQs2jPA@mail.gmail.com>
Subject: Re: [Xen-devel] ring buffer overflow
From: David Xu <davidxu06@gmail.com>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
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

Hi,

This time I want to call it in the user-space. I wrote a user-level
application and call the xc_sched_credit_domain_set( int
 xc_handle, uint32_t domid, struct xen_domctl_sched_credit *sdom) in
it. But I don't know how to pass the xc_handle parameter in this
function. Thanks.

Regards,
Cong

2011/10/7 Ian Campbell <Ian.Campbell@eu.citrix.com>:
> Stop top posting, I've asked you this before.
>
> On Fri, 2011-10-07 at 16:23 +0100, David Xu wrote:
>> Hi,
>>
>> I want to use the libxc function xc_sched_credit_domain_set( int
>> xc_handle, uint32_t domid, struct xen_domctl_sched_credit *sdom) in a
>> user-level application. But I don't know how to set the value of
>> xc_handle. Is there somebody familiar with it? Thanks.
>
> You can't use xc_* functions in the kernel, they are userspace. You
> could in theory look at the implementation of xc_sched_credit_domain_set
> to find out what that hypercall is and make the underlying hypercall
> instead, But:
>
> The hypercall in question here is a domctl which are not available /
> allowed from kernel space (for policy and semantic reasons rather than
> technological ones).
>
> As I explained elsewhere I don't think the architecture you have in mind
> is correct. I think you should look at exporting the necessary
> statistics from the kernel to userspace and have a daemon implement the
> logic and mechanisms for changing the scheduling parameters as required.
>
> Ian.
>
>
>

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 09:30:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 09:30:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCDJr-0006gv-1g; Fri, 07 Oct 2011 09:30:43 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCDJH-0006V9-1H
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 09:30:07 -0700
X-Env-Sender: tglx@linutronix.de
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318005003!20378786!1
X-Originating-IP: [62.245.132.108]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9103 invoked from network); 7 Oct 2011 16:30:03 -0000
Received: from www.linutronix.de (HELO Galois.linutronix.de) (62.245.132.108)
	by server-15.tower-182.messagelabs.com with AES256-SHA encrypted
	SMTP; 7 Oct 2011 16:30:03 -0000
Received: from localhost ([127.0.0.1]) by Galois.linutronix.de with esmtps
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.72)
	(envelope-from <tglx@linutronix.de>)
	id 1RCDJ7-0000VJ-Hy; Fri, 07 Oct 2011 18:29:57 +0200
Date: Fri, 7 Oct 2011 18:29:56 +0200 (CEST)
From: Thomas Gleixner <tglx@linutronix.de>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
In-Reply-To: <1318001583.21903.355.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.LFD.2.02.1110071822160.3240@ionos>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
	<1317668908.11991.20.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110032229250.1489@ionos>
	<1318001583.21903.355.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.02 (LFD 1266 2009-07-14)
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-Linutronix-Spam-Score: -1.0
X-Linutronix-Spam-Level: -
X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,
	SHORTCIRCUIT=-0.0001
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	xen-devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 7 Oct 2011, Ian Campbell wrote:
> On Mon, 2011-10-03 at 22:35 +0200, Thomas Gleixner wrote:
>  /**
> + * irq_pm_syscore_ops - enable interrupt lines early
> + *
> + * Enable all interrupt lines with %IRQF_EARLY_RESUME set
> + */
> +static void irq_pm_syscore_resume(void)
> +{
> +	struct irq_desc *desc;
> +	int irq;
> +
> +	for_each_irq_desc(irq, desc) {
> +		unsigned long flags;
> +
> +		if (!desc->action || !(desc->action->flags & IRQF_EARLY_RESUME))
> +			continue;
> +
> +		raw_spin_lock_irqsave(&desc->lock, flags);
> +		__enable_irq(desc, irq, true);
> +		raw_spin_unlock_irqrestore(&desc->lock, flags);
> +	}
> +}

Come on, this is a full copy of resume_device_irqs(). What about
having a common function with an (bool early) argument and call it
from both syscore and resume_device?

Thanks,

	tglx

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 09:38:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 09:38:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCDR9-0007GC-W6; Fri, 07 Oct 2011 09:38:16 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCDQQ-00073t-Ll
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 09:37:31 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318005447!20229930!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25515 invoked from network); 7 Oct 2011 16:37:27 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-8.tower-182.messagelabs.com with SMTP;
	7 Oct 2011 16:37:27 -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
	p97GbN6k022171; Fri, 7 Oct 2011 16:37:23 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 p97GbNle028546; 
	Fri, 7 Oct 2011 12:37:23 -0400
Message-ID: <4E8F2AD0.2060904@tycho.nsa.gov>
Date: Fri, 07 Oct 2011 12:37:36 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming
	domain 0
References: <1317824920-639-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20109.60188.905267.410813@mariner.uk.xensource.com>
	<4E8DF425.9000807@tycho.nsa.gov>
	<1317973956.21903.281.camel@zakaz.uk.xensource.com>
In-Reply-To: <1317973956.21903.281.camel@zakaz.uk.xensource.com>
X-Enigmail-Version: 1.3
Content-Type: text/plain; charset=UTF-8
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 10/07/2011 03:52 AM, Ian Campbell wrote:
> On Thu, 2011-10-06 at 19:32 +0100, Daniel De Graaf wrote:
>> On 10/06/2011 01:53 PM, Ian Jackson wrote:
>>> Daniel De Graaf writes ("[Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming domain 0"):
>>>> The xenbus event channel established in xenbus_init is intended to be a
>>>> loopback channel, but the remote domain was hardcoded to 0; this will
>>>> cause the channel to be unusable when xenstore is not being run in
>>>> domain 0.
>>>
>>> I'm not sure I understand this.
>>>
>>> ...
>>>>  		/* Next allocate a local port which xenstored can bind to */
>>>>  		alloc_unbound.dom        = DOMID_SELF;
>>>> -		alloc_unbound.remote_dom = 0;
>>>> +		alloc_unbound.remote_dom = DOMID_SELF;
>>>
>>> The comment doesn't suggest that this is supposedly a loopback channel
>>> (ie one for use by the xenbus client for signalling to itself,
>>> somehow).
>>
>> The event channel being changed here is a loopback event channel exposed in
>> /proc/xen/xsd_port, which xenstored binds to. This code is only used for the
>> initial domain; otherwise, the shared info page is used.
> 
> How does this change impact the regular dom0? It will be expecting a
> xenstored to startup locally when in reality it actually needs to wait
> for another domain and then connect to that.

This change does not attempt to address the regular dom0, except for not
breaking existing setups where xenstored resides in dom0.

> Diego Ongaro did some work several years ago on this issue, it was most
> recently re-posted by Alex Zeffert, patches against xen-unstable and the
> linux-2.6.18 tree:
> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01484.html
> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01488.html
> 
> Part of the trick was to fixup the kernel side in a way which was
> compatible with both existing Xen releases while also supporting new
> releases which support both stub and non-stub xenstore. To do this Diego
> setup a lazy xenbus initialisation with a state machine to track which
> case was active, with transitions triggered either from the local-mmap
> of /proc/xen/xenbus_xsd (so was backwards compatible) or an ioctl called
> by the tool which builds the stub domain to tell the dom0 xenbus code
> which domain/mfn/evtchn contains the xenstored and dom0's connection to
> it (the patcheset includes a cut-down builder which works without
> xenstore).
> 
> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01487.html
> is the key kernel side patch in that regard.
> 
> Diego did some initial work with xenstored in a Linux domU, but I think
> the final patchset was stub-xenstored (i.e. ocaml xenstored on minios,
> possibly C xenstored on minios too), so I'm not sure about the xenstored
> in Linux domU use case.
> 
> Some of the more trivial bits of this series were committed but the real
> meat wasn't really pushed through.
> 

Thanks for pointing out that series; I hadn't seen it yet. The setup I am
currently using has a non-Linux dom0, so the state machine in dom0 was not
required. A separate minios-based xenstored is the eventual goal; this patch
just avoids creating a broken event channel in an initial domain whose
domain ID is not 0.

I do have a more complex version of this patch that replaces the initial
domain check with a check on the start_info structure so that an initial
domain can have xenstore information placed in its start_info field like
any other domain; would this be of interest?

>>> Rather it's supposed to be a channel to xenstore.  So the remote
>>> domain should be the xenstore domain, which should come from the
>>> shared info page.
>>>
>>> Have you actually tested this with a separate xenstored domain ?
>>>
>>> Ian.
>>>
>>
>> The test setup that exposed this issue is having a non-dom0 Linux domain
>> running xenstored (in addition to other services); this domain is started
>> with the SIF_INITDOMAIN flag set. It has been tested and can start other
>> domains with references back to the xenstored running there; the local
>> kernel is able to communicate with the locally running xenstore to provide
>> backend services.
>>
>> The test for xen_initial_domain() here might better be replaced with a
>> check on xen_start_info->store_evtchn which should be a valid event channel
>> on all domains except the domain running xenstored. This seems like a more
>> elegant solution than relying on the SIF_INITDOMAIN flag to determine the
>> location of xenstore.
>>
> 

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 09:47:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 09:47:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCDaE-0007zr-ON; Fri, 07 Oct 2011 09:47:38 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCDZe-0007nP-VD
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 09:47:03 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318006019!154411!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30962 invoked from network); 7 Oct 2011 16:46:59 -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 Oct 2011 16:46:59 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8278633"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 16:46:37 +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, 7 Oct 2011
	17:46:37 +0100
Subject: Re: libxc handles (was Re: [Xen-devel] ring buffer overflow)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Tim Deegan <tim@xen.org>
In-Reply-To: <20111007155615.GB53408@ocelot.phlegethon.org>
References: <CAGjowiTc0NAJbWR-RxwLTrz+bhbAFfvcPKPAB_F8r1ef6__PbA@mail.gmail.com>
	<1317368064.26672.198.camel@zakaz.uk.xensource.com>
	<CAGjowiQE_3gTJxK+Ja850QU9g1+97hZ8hAgdv_a4B18jxmCNGw@mail.gmail.com>
	<1317393663.26672.288.camel@zakaz.uk.xensource.com>
	<CAGjowiSrPCY50-iBK67nGfOGdK7z1htc58ohtrqJtmutmRRQzQ@mail.gmail.com>
	<1317394559.26672.293.camel@zakaz.uk.xensource.com>
	<CAGjowiSkwN9Oz-qevYk2G1NgwBmFOLWFLtT30aBu0SAe=jqtog@mail.gmail.com>
	<CAGjowiSQO_Hzdbz0FxQK_7ppr-yvBSWYVbzoSUd_RfiWytZKPw@mail.gmail.com>
	<1318002580.21903.361.camel@zakaz.uk.xensource.com>
	<20111007155615.GB53408@ocelot.phlegethon.org>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 7 Oct 2011 17:46:36 +0100
Message-ID: <1318005997.24742.25.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: David Xu <davidxu06@gmail.com>, 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 Fri, 2011-10-07 at 16:56 +0100, Tim Deegan wrote:
> At 16:49 +0100 on 07 Oct (1318006180), Ian Campbell wrote:
> > Stop top posting, I've asked you this before.
> 
> Also, please start a new thread for a new question; the subject line of
> your email didn't match the contents.
> 
> > On Fri, 2011-10-07 at 16:23 +0100, David Xu wrote:
> > > Hi,
> > > 
> > > I want to use the libxc function xc_sched_credit_domain_set( int
> > > xc_handle, uint32_t domid, struct xen_domctl_sched_credit *sdom) in a
> > > user-level application. But I don't know how to set the value of
> > > xc_handle. Is there somebody familiar with it? Thanks.
> > 
> > You can't use xc_* functions in the kernel, they are userspace.
> 
> He's programming in userspace. :)

So he is, I was confused by the existing context...

Ian.



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 09:49:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 09:49:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCDcN-0008OP-IE; Fri, 07 Oct 2011 09:49:51 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCDbY-0008Bk-28
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 09:49:00 -0700
X-Env-Sender: Boris.Ostrovsky@amd.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1318006097!63275221!1
X-Originating-IP: [65.55.88.14]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25840 invoked from network); 7 Oct 2011 16:48:18 -0000
Received: from tx2ehsobe004.messaging.microsoft.com (HELO
	TX2EHSOBE007.bigfish.com) (65.55.88.14)
	by server-4.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	7 Oct 2011 16:48:18 -0000
Received: from mail77-tx2-R.bigfish.com (10.9.14.236) by
	TX2EHSOBE007.bigfish.com (10.9.40.27) with Microsoft SMTP Server id
	14.1.225.22; Fri, 7 Oct 2011 16:48:55 +0000
Received: from mail77-tx2 (localhost.localdomain [127.0.0.1])	by
	mail77-tx2-R.bigfish.com (Postfix) with ESMTP id 399DF1B019B;
	Fri,  7 Oct 2011 16:48:55 +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 mail77-tx2 (localhost.localdomain [127.0.0.1]) by mail77-tx2
	(MessageSwitch) id 131800613553313_13763;
	Fri,  7 Oct 2011 16:48:55 +0000 (UTC)
Received: from TX2EHSMHS018.bigfish.com (unknown [10.9.14.244])	by
	mail77-tx2.bigfish.com (Postfix) with ESMTP id 00AA9110051;
	Fri,  7 Oct 2011 16:48:55 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS018.bigfish.com (10.9.99.118) with Microsoft SMTP Server id
	14.1.225.22; Fri, 7 Oct 2011 16:48:53 +0000
X-WSS-ID: 0LSPG1F-02-5AB-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 2F325C80AC;	Fri,  7 Oct 2011 11:48:51 -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.106.1;
	Fri, 7 Oct 2011 11:49:11 -0500
Received: from optimon.amd.com (163.181.34.104) by sausexhtp02.amd.com
	(163.181.3.152) with Microsoft SMTP Server (TLS) id 8.3.83.0;
	Fri, 7 Oct 2011 11:48:52 -0500
Received: from f15-sabine (ostr-Sabine.amd.com [10.234.222.53])	by
	optimon.amd.com (8.12.10/8.12.10) with ESMTP id p97GmqBd018941;
	Fri, 7 Oct 2011 11:48:52 -0500
Received: (from root@localhost)	by f15-sabine (8.14.5/8.14.5/Submit) id
	p97Gm8Gd005530;	Fri, 7 Oct 2011 12:48:08 -0400
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 17e4b237ec5f162cba2069934ec608ba8be03016
Message-ID: <17e4b237ec5f162cba20.1318006041@f15-sabine>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 7 Oct 2011 12:47:21 -0400
From: Boris Ostrovsky <boris.ostrovsky@amd.com>
To: <JBeulich@suse.com>
X-OriginatorOrg: amd.com
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] x86/AMD: Remove AMD_ERRATUM_400 definition
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Boris Ostrovsky <boris.ostrovsky@amd.com>
# Date 1318005244 14400
# Node ID 17e4b237ec5f162cba2069934ec608ba8be03016
# Parent  4374a261682e78d6bbf3b3fefb1e779b7a1fc3b3
x86/AMD: Remove AMD_ERRATUM_400 definition

AMD_ERRATUM_400 was used to determine whether the processor supports
Always Running APIC Counter (ARAT) feature in init_amd(). Now that
ARAT support is based solely on family number this macro is no longer
needed.

Keep it in comments section as an example in case we ever need to use
it for somethnig else.

Signed-off-by: Boris Ostrovsky <boris.ostrovsky@amd.com>

diff -r 4374a261682e -r 17e4b237ec5f xen/include/asm-x86/amd.h
--- a/xen/include/asm-x86/amd.h	Thu Oct 06 11:36:35 2011 -0400
+++ b/xen/include/asm-x86/amd.h	Fri Oct 07 12:34:04 2011 -0400
@@ -134,10 +134,6 @@
     AMD_OSVW_ERRATUM(3, AMD_MODEL_RANGE(0x10, 0x2, 0x1, 0xff, 0xf),	\
 		        AMD_MODEL_RANGE(0x12, 0x0, 0x0, 0x1, 0x0))
 
-#define AMD_ERRATUM_400                                                 \
-    AMD_OSVW_ERRATUM(1, AMD_MODEL_RANGE(0xf, 0x41, 0x2, 0xff, 0xf),     \
-                        AMD_MODEL_RANGE(0x10, 0x2, 0x1, 0xff, 0xf))
-
 struct cpuinfo_x86;
 int cpu_has_amd_erratum(const struct cpuinfo_x86 *, int, ...);
 


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 09:51:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 09:51:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCDdk-0000KG-93; Fri, 07 Oct 2011 09:51:16 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCDdG-00007o-8U
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 09:50:46 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318006242!34410347!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10995 invoked from network); 7 Oct 2011 16:50:42 -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;
	7 Oct 2011 16:50:42 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8278684"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 16:50:42 +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, 7 Oct 2011
	17:50:42 +0100
Subject: Re: [Xen-devel] ring buffer overflow
From: Ian Campbell <Ian.Campbell@citrix.com>
To: David Xu <davidxu06@gmail.com>
In-Reply-To: <CAGjowiTvPu4KFTeLLCVUvoRombjXGscVWAgHLNi6+T7uQs2jPA@mail.gmail.com>
References: <CAGjowiTc0NAJbWR-RxwLTrz+bhbAFfvcPKPAB_F8r1ef6__PbA@mail.gmail.com>
	<1317368064.26672.198.camel@zakaz.uk.xensource.com>
	<CAGjowiQE_3gTJxK+Ja850QU9g1+97hZ8hAgdv_a4B18jxmCNGw@mail.gmail.com>
	<1317393663.26672.288.camel@zakaz.uk.xensource.com>
	<CAGjowiSrPCY50-iBK67nGfOGdK7z1htc58ohtrqJtmutmRRQzQ@mail.gmail.com>
	<1317394559.26672.293.camel@zakaz.uk.xensource.com>
	<CAGjowiSkwN9Oz-qevYk2G1NgwBmFOLWFLtT30aBu0SAe=jqtog@mail.gmail.com>
	<CAGjowiSQO_Hzdbz0FxQK_7ppr-yvBSWYVbzoSUd_RfiWytZKPw@mail.gmail.com>
	<1318002580.21903.361.camel@zakaz.uk.xensource.com>
	<CAGjowiTvPu4KFTeLLCVUvoRombjXGscVWAgHLNi6+T7uQs2jPA@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 7 Oct 2011 17:50:41 +0100
Message-ID: <1318006241.24742.30.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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 17:23 +0100, David Xu wrote:
> Hi,
> 
> This time I want to call it in the user-space. I wrote a user-level
> application and call the xc_sched_credit_domain_set( int
>  xc_handle, uint32_t domid, struct xen_domctl_sched_credit *sdom) in
> it. But I don't know how to pass the xc_handle parameter in this
> function. Thanks.

Tim already answered this. But why do you persist in top posting? You've
been asked not to _repeatedly_.

Please re-read http://wiki.xen.org/xenwiki/AskingXenDevelQuestions. In
particular the etiquette section.

Perhaps I should start ignoring top posted emails. :-/

Ian.

> 
> Regards,
> Cong
> 
> 2011/10/7 Ian Campbell <Ian.Campbell@eu.citrix.com>:
> > Stop top posting, I've asked you this before.
> >
> > On Fri, 2011-10-07 at 16:23 +0100, David Xu wrote:
> >> Hi,
> >>
> >> I want to use the libxc function xc_sched_credit_domain_set( int
> >> xc_handle, uint32_t domid, struct xen_domctl_sched_credit *sdom) in a
> >> user-level application. But I don't know how to set the value of
> >> xc_handle. Is there somebody familiar with it? Thanks.
> >
> > You can't use xc_* functions in the kernel, they are userspace. You
> > could in theory look at the implementation of xc_sched_credit_domain_set
> > to find out what that hypercall is and make the underlying hypercall
> > instead, But:
> >
> > The hypercall in question here is a domctl which are not available /
> > allowed from kernel space (for policy and semantic reasons rather than
> > technological ones).
> >
> > As I explained elsewhere I don't think the architecture you have in mind
> > is correct. I think you should look at exporting the necessary
> > statistics from the kernel to userspace and have a daemon implement the
> > logic and mechanisms for changing the scheduling parameters as required.
> >
> > Ian.
> >
> >
> >



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 10:06:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 10:06:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCDsv-0000wB-CD; Fri, 07 Oct 2011 10:06:57 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCDrb-0000jR-5L
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:05:44 -0700
X-Env-Sender: agx@sigxcpu.org
X-Msg-Ref: server-3.tower-174.messagelabs.com!1318007131!28349523!1
X-Originating-IP: [87.79.238.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31506 invoked from network); 7 Oct 2011 17:05:31 -0000
Received: from static-87-79-238-240.netcologne.de (HELO honk.sigxcpu.org)
	(87.79.238.240)
	by server-3.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2011 17:05:31 -0000
Received: from localhost (localhost [127.0.0.1])
	by honk.sigxcpu.org (Postfix) with ESMTP id AD63F9C003
	for <xen-devel@lists.xensource.com>;
	Fri,  7 Oct 2011 19:05:30 +0200 (CEST)
X-Virus-Scanned: Debian amavisd-new at honk.sigxcpu.org
Received: from honk.sigxcpu.org ([127.0.0.1])
	by localhost (honk.sigxcpu.org [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id aYOysJxVJxyF for <xen-devel@lists.xensource.com>;
	Fri,  7 Oct 2011 19:05:29 +0200 (CEST)
Received: by bogon.sigxcpu.org (Postfix, from userid 1000)
	id 28A4051DBC; Fri,  7 Oct 2011 19:05:28 +0200 (CEST)
Date: Fri, 7 Oct 2011 19:05:28 +0200
From: Guido =?iso-8859-1?Q?G=FCnther?= <agx@sigxcpu.org>
To: xen-devel@lists.xensource.com
Message-ID: <20111007170528.GA21562@bogon.sigxcpu.org>
References: <20111005181413.GA32317@bogon.sigxcpu.org>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="y0ulUmNC+osPPQO6"
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20111005181413.GA32317@bogon.sigxcpu.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
Subject: [Xen-devel] [PATCH/RFC] don't include <xen/sysctl.h> in libxl.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


--y0ulUmNC+osPPQO6
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hi,
I'm unsure if libvirt qualifies as "node control tool":

In file included from /tmp/usr/include/libxl.h:137:0,
                 from libxl/libxl_conf.c:28:
/tmp/usr/include/xen/sysctl.h:31:2: error: #error "sysctl operations are intended for use by node control tools only"
In file included from /tmp/usr/include/xen/sysctl.h:35:0,
                 from /tmp/usr/include/libxl.h:137,
                 from libxl/libxl_conf.c:28:

If not it makes sense to remove the include from libxl.h and include it
in xl_cmdimpl.c directly. This allows libvirt to include libxl.h again
without defining __XEN_TOOLS__.

Does this look correct?
Cheers,
 -- Guido

--y0ulUmNC+osPPQO6
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: attachment;
	filename="Don't include sysctl.h in public header"
Content-Transfer-Encoding: 8bit

# HG changeset patch
# Parent 0b66e6450ffe6823d8b323ef4248b38fe7372d54

Signed-off-by: Guido Günther <agx@sigxcpu.org>

diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -134,7 +134,6 @@
 #include <xentoollog.h>
 
 #include <xen/sched.h>
-#include <xen/sysctl.h>
 
 #include <libxl_uuid.h>
 
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -41,6 +41,8 @@
 #include "libxlutil.h"
 #include "xl.h"
 
+#include <xen/sysctl.h>
+
 #define CHK_ERRNO( call ) ({                                            \
         int chk_errno = (call);                                         \
         if (chk_errno < 0) {                                                \

--y0ulUmNC+osPPQO6
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

--y0ulUmNC+osPPQO6--


From xen-devel-bounces@lists.xensource.com Fri Oct 07 10:10:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 10:10:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCDwD-0001Ln-SQ; Fri, 07 Oct 2011 10:10:21 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCDvW-000194-4d
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:09:40 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318007374!20234163!1
X-Originating-IP: [71.74.56.124]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29748 invoked from network); 7 Oct 2011 17:09:34 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.124) by server-8.tower-182.messagelabs.com with SMTP;
	7 Oct 2011 17:09:34 -0000
X-Authority-Analysis: v=1.1 cv=agqPq5NoKwAPC9P66H7dbYUCjxvmT73as08i4x3aqAA=
	c=1 sm=0 a=xrjBpH1iXSYA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=meVymXHHAAAA:8 a=20KFwNOVAAAA:8
	a=SyI_GHdlAAAA:8 a=0xq9genQQaudOexsJYQA:9
	a=JJfJ8_RvTk8oEYQcEb8A:7 a=PUjeQqilurYA:10 a=jeBq3FmKZ4MA:10
	a=jEp0ucaQiEUA:10 a=UQxMgyrMzRwA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:48357] helo=[192.168.23.10])
	by hrndva-oedge01.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 11/DA-12608-C423F8E4; Fri, 07 Oct 2011 17:09:34 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Fri, 07 Oct 2011 13:09:32 -0400
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
	<4E8E275F.6010801@goop.org>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318007374.4729.58.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, "H.
	Peter Anvin" <hpa@zytor.com>, the, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH][RFC] jump_labels/x86: Use either 5 byte or 2
	byte jumps
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Note, this is just hacked together and needs to be cleaned up. Please do
not comment on formatting or other sloppiness of this patch. I know it's
sloppy and I left debug statements in. I want the comments to be on the
idea of the patch.

I created a new file called scripts/update_jump_label.[ch] based on some
of the work of recordmcount.c. This is executed at build time on all
object files just like recordmcount is. But it does not add any new
sections, it just modifies the code at build time to convert all jump
labels into nops.

The idea is in arch/x86/include/asm/jump_label.h to not place a nop, but
instead to insert a jmp to the label. Depending on how gcc optimizes the
code, the jmp will be either end up being a 2 byte or 5 byte jump.

After an object is compiled, update_jump_label is executed on this file
and it reads the ELF relocation table to find the jump label locations
and examines what jump was used. It then converts the jump into either a
2 byte or 5 byte nop that is appropriate.

At boot time, the jump labels no longer need to be converted (although
we may do so in the future to use better nops depending on the machine
that is used). When jump labels are enabled, the code is examined to see
if a two byte or 5 byte version was used, and the appropriate update is
made.

I just booted this patch and it worked. I was able to enable and disable
trace points using jump labels. Benchmarks are welcomed :)

Comments and thoughts?

-- Steve

Sloppy-signed-off-by: Steven Rostedt <rostedt@goodmis.org>

diff --git a/Makefile b/Makefile
index 31f967c..8368f42 100644
--- a/Makefile
+++ b/Makefile
@@ -245,7 +245,7 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
 
 HOSTCC       = gcc
 HOSTCXX      = g++
-HOSTCFLAGS   = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
+HOSTCFLAGS   = -Wall -Wmissing-prototypes -Wstrict-prototypes -g -fomit-frame-pointer
 HOSTCXXFLAGS = -O2
 
 # Decide whether to build built-in, modular, or both.
@@ -611,6 +611,13 @@ ifdef CONFIG_DYNAMIC_FTRACE
 endif
 endif
 
+ifdef CONFIG_JUMP_LABEL
+	ifdef CONFIG_HAVE_BUILD_TIME_JUMP_LABEL
+		BUILD_UPDATE_JUMP_LABEL := y
+		export BUILD_UPDATE_JUMP_LABEL
+	endif
+endif
+
 # We trigger additional mismatches with less inlining
 ifdef CONFIG_DEBUG_SECTION_MISMATCH
 KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
diff --git a/arch/Kconfig b/arch/Kconfig
index 4b0669c..8fa6934 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -169,6 +169,12 @@ config HAVE_PERF_EVENTS_NMI
 	  subsystem.  Also has support for calculating CPU cycle events
 	  to determine how many clock cycles in a given period.
 
+config HAVE_BUILD_TIME_JUMP_LABEL
+       bool
+       help
+	If an arch uses scripts/update_jump_label to patch in jump nops
+	at build time, then it must enable this option.
+
 config HAVE_ARCH_JUMP_LABEL
 	bool
 
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 6a47bb2..6de726a 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -61,6 +61,7 @@ config X86
 	select HAVE_ARCH_KMEMCHECK
 	select HAVE_USER_RETURN_NOTIFIER
 	select HAVE_ARCH_JUMP_LABEL
+	select HAVE_BUILD_TIME_JUMP_LABEL
 	select HAVE_TEXT_POKE_SMP
 	select HAVE_GENERIC_HARDIRQS
 	select HAVE_SPARSE_IRQ
diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
index a32b18c..872b3e1 100644
--- a/arch/x86/include/asm/jump_label.h
+++ b/arch/x86/include/asm/jump_label.h
@@ -14,7 +14,7 @@
 static __always_inline bool arch_static_branch(struct jump_label_key *key)
 {
 	asm goto("1:"
-		JUMP_LABEL_INITIAL_NOP
+		"jmp %l[l_yes]\n"
 		".pushsection __jump_table,  \"aw\" \n\t"
 		_ASM_ALIGN "\n\t"
 		_ASM_PTR "1b, %l[l_yes], %c0 \n\t"
diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
index 3fee346..1f7f88f 100644
--- a/arch/x86/kernel/jump_label.c
+++ b/arch/x86/kernel/jump_label.c
@@ -16,34 +16,75 @@
 
 #ifdef HAVE_JUMP_LABEL
 
+static unsigned char nop_short[] = { P6_NOP2 };
+
 union jump_code_union {
 	char code[JUMP_LABEL_NOP_SIZE];
 	struct {
 		char jump;
 		int offset;
 	} __attribute__((packed));
+	struct {
+		char jump_short;
+		char offset_short;
+	} __attribute__((packed));
 };
 
 void arch_jump_label_transform(struct jump_entry *entry,
 			       enum jump_label_type type)
 {
 	union jump_code_union code;
+	unsigned char op;
+	unsigned size;
+	unsigned char nop;
+
+	/* Use probe_kernel_read()? */
+	op = *(unsigned char *)entry->code;
+	nop = ideal_nops[NOP_ATOMIC5][0];
 
 	if (type == JUMP_LABEL_ENABLE) {
-		code.jump = 0xe9;
-		code.offset = entry->target -
-				(entry->code + JUMP_LABEL_NOP_SIZE);
-	} else
-		memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE);
+		if (op == 0xe9 || op == 0xeb)
+			/* Already enabled. Warn? */
+			return;
+
+		/* FIXME for all archs */
+		if (op == nop_short[0]) {
+			size = 2;
+			code.jump_short = 0xeb;
+			code.offset = entry->target -
+				(entry->code + 2);
+			/* Check for overflow ? */
+		} else if (op == nop) {
+			size = JUMP_LABEL_NOP_SIZE;
+			code.jump = 0xe9;
+			code.offset = entry->target - (entry->code + size);
+		} else
+			return; /* WARN ? */
+
+	} else {
+		if (op == nop_short[0] || nop)
+			/* Already disabled, warn? */
+			return;
+
+		if (op == 0xe9) {
+			size = JUMP_LABEL_NOP_SIZE;
+			memcpy(&code, ideal_nops[NOP_ATOMIC5], size);
+		} else if (op == 0xeb) {
+			size = 2;
+			memcpy(&code, nop_short, size);
+		} else
+			return; /* WARN ? */
+	}
 	get_online_cpus();
 	mutex_lock(&text_mutex);
-	text_poke_smp((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
+	text_poke_smp((void *)entry->code, &code, size);
 	mutex_unlock(&text_mutex);
 	put_online_cpus();
 }
 
 void arch_jump_label_text_poke_early(jump_label_t addr)
 {
+	return;
 	text_poke_early((void *)addr, ideal_nops[NOP_ATOMIC5],
 			JUMP_LABEL_NOP_SIZE);
 }
diff --git a/scripts/Makefile b/scripts/Makefile
index df7678f..738b65c 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -13,6 +13,7 @@ hostprogs-$(CONFIG_LOGO)         += pnmtologo
 hostprogs-$(CONFIG_VT)           += conmakehash
 hostprogs-$(CONFIG_IKCONFIG)     += bin2c
 hostprogs-$(BUILD_C_RECORDMCOUNT) += recordmcount
+hostprogs-$(BUILD_UPDATE_JUMP_LABEL) += update_jump_label
 
 always		:= $(hostprogs-y) $(hostprogs-m)
 
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index a0fd502..bc0d89b 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -258,6 +258,15 @@ cmd_modversions =								\
 	fi;
 endif
 
+ifdef BUILD_UPDATE_JUMP_LABEL
+update_jump_label_source := $(srctree)/scripts/update_jump_label.c \
+			$(srctree)/scripts/update_jump_label.h
+cmd_update_jump_label =						\
+	if [ $(@) != "scripts/mod/empty.o" ]; then		\
+		$(objtree)/scripts/update_jump_label "$(@)";	\
+	fi;
+endif
+
 ifdef CONFIG_FTRACE_MCOUNT_RECORD
 ifdef BUILD_C_RECORDMCOUNT
 ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
@@ -294,6 +303,7 @@ define rule_cc_o_c
 	$(cmd_modversions)						  \
 	$(call echo-cmd,record_mcount)					  \
 	$(cmd_record_mcount)						  \
+	$(cmd_update_jump_label)					  \
 	scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    \
 	                                              $(dot-target).tmp;  \
 	rm -f $(depfile);						  \
@@ -301,13 +311,14 @@ define rule_cc_o_c
 endef
 
 # Built-in and composite module parts
-$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
+$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(update_jump_label_source) FORCE
 	$(call cmd,force_checksrc)
 	$(call if_changed_rule,cc_o_c)
 
 # Single-part modules are special since we need to mark them in $(MODVERDIR)
 
-$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
+$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) \
+		  $(update_jump_label_source) FORCE
 	$(call cmd,force_checksrc)
 	$(call if_changed_rule,cc_o_c)
 	@{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
diff --git a/scripts/update_jump_label.c b/scripts/update_jump_label.c
new file mode 100644
index 0000000..86e17bc
--- /dev/null
+++ b/scripts/update_jump_label.c
@@ -0,0 +1,349 @@
+/*
+ * update_jump_label.c: replace jmps with nops at compile time.
+ * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
+ *  Parsing of the elf file was influenced by recordmcount.c
+ *  originally written by and copyright to John F. Reiser <jreiser@BitWagon.com>.
+ */
+
+/*
+ * Note, this code is originally designed for x86, but may be used by
+ * other archs to do the nop updates at compile time instead of at boot time.
+ * X86 uses this as an optimization, as jmps can be either 2 bytes or 5 bytes.
+ * Inserting a 2 byte where possible helps with both CPU performance and
+ * icache strain.
+ */
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <getopt.h>
+#include <elf.h>
+#include <fcntl.h>
+#include <setjmp.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
+
+static int fd_map;	/* File descriptor for file being modified. */
+static struct stat sb;	/* Remember .st_size, etc. */
+static int mmap_failed; /* Boolean flag. */
+
+static void die(const char *err, const char *fmt, ...)
+{
+	va_list ap;
+
+	if (err)
+		perror(err);
+
+	if (fmt) {
+		va_start(ap, fmt);
+		fprintf(stderr, "Fatal error:  ");
+		vfprintf(stderr, fmt, ap);
+		fprintf(stderr, "\n");
+		va_end(ap);
+	}
+
+	exit(1);
+}
+
+static void usage(char **argv)
+{
+	char *arg = argv[0];
+	char *p = arg+strlen(arg);
+
+	while (p >= arg && *p != '/')
+		p--;
+	p++;
+
+	printf("usage: %s file\n"
+	       "\n",p);
+	exit(-1);
+}
+
+/* w8rev, w8nat, ...: Handle endianness. */
+
+static uint64_t w8rev(uint64_t const x)
+{
+	return   ((0xff & (x >> (0 * 8))) << (7 * 8))
+	       | ((0xff & (x >> (1 * 8))) << (6 * 8))
+	       | ((0xff & (x >> (2 * 8))) << (5 * 8))
+	       | ((0xff & (x >> (3 * 8))) << (4 * 8))
+	       | ((0xff & (x >> (4 * 8))) << (3 * 8))
+	       | ((0xff & (x >> (5 * 8))) << (2 * 8))
+	       | ((0xff & (x >> (6 * 8))) << (1 * 8))
+	       | ((0xff & (x >> (7 * 8))) << (0 * 8));
+}
+
+static uint32_t w4rev(uint32_t const x)
+{
+	return   ((0xff & (x >> (0 * 8))) << (3 * 8))
+	       | ((0xff & (x >> (1 * 8))) << (2 * 8))
+	       | ((0xff & (x >> (2 * 8))) << (1 * 8))
+	       | ((0xff & (x >> (3 * 8))) << (0 * 8));
+}
+
+static uint32_t w2rev(uint16_t const x)
+{
+	return   ((0xff & (x >> (0 * 8))) << (1 * 8))
+	       | ((0xff & (x >> (1 * 8))) << (0 * 8));
+}
+
+static uint64_t w8nat(uint64_t const x)
+{
+	return x;
+}
+
+static uint32_t w4nat(uint32_t const x)
+{
+	return x;
+}
+
+static uint32_t w2nat(uint16_t const x)
+{
+	return x;
+}
+
+static uint64_t (*w8)(uint64_t);
+static uint32_t (*w)(uint32_t);
+static uint32_t (*w2)(uint16_t);
+
+/* ulseek, uread, ...:  Check return value for errors. */
+
+static off_t
+ulseek(int const fd, off_t const offset, int const whence)
+{
+	off_t const w = lseek(fd, offset, whence);
+	if (w == (off_t)-1)
+		die("lseek", NULL);
+
+	return w;
+}
+
+static size_t
+uread(int const fd, void *const buf, size_t const count)
+{
+	size_t const n = read(fd, buf, count);
+	if (n != count)
+		die("read", NULL);
+
+	return n;
+}
+
+static size_t
+uwrite(int const fd, void const *const buf, size_t const count)
+{
+	size_t const n = write(fd, buf, count);
+	if (n != count)
+		die("write", NULL);
+
+	return n;
+}
+
+static void *
+umalloc(size_t size)
+{
+	void *const addr = malloc(size);
+	if (addr == 0)
+		die("malloc", "malloc failed: %zu bytes\n", size);
+
+	return addr;
+}
+
+/*
+ * Get the whole file as a programming convenience in order to avoid
+ * malloc+lseek+read+free of many pieces.  If successful, then mmap
+ * avoids copying unused pieces; else just read the whole file.
+ * Open for both read and write; new info will be appended to the file.
+ * Use MAP_PRIVATE so that a few changes to the in-memory ElfXX_Ehdr
+ * do not propagate to the file until an explicit overwrite at the last.
+ * This preserves most aspects of consistency (all except .st_size)
+ * for simultaneous readers of the file while we are appending to it.
+ * However, multiple writers still are bad.  We choose not to use
+ * locking because it is expensive and the use case of kernel build
+ * makes multiple writers unlikely.
+ */
+static void *mmap_file(char const *fname)
+{
+	void *addr;
+
+	fd_map = open(fname, O_RDWR);
+	if (fd_map < 0 || fstat(fd_map, &sb) < 0)
+		die(fname, "failed to open file");
+
+	if (!S_ISREG(sb.st_mode))
+		die(NULL, "not a regular file: %s\n", fname);
+
+	addr = mmap(0, sb.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE,
+		    fd_map, 0);
+
+	mmap_failed = 0;
+	if (addr == MAP_FAILED) {
+		mmap_failed = 1;
+		addr = umalloc(sb.st_size);
+		uread(fd_map, addr, sb.st_size);
+	}
+	return addr;
+}
+
+static void munmap_file(void *addr)
+{
+	if (!mmap_failed)
+		munmap(addr, sb.st_size);
+	else
+		free(addr);
+	close(fd_map);
+}
+
+static unsigned char ideal_nop5_x86_64[5] = { 0x0f, 0x1f, 0x44, 0x00, 0x00 };
+static unsigned char ideal_nop5_x86_32[5] = { 0x3e, 0x8d, 0x74, 0x26, 0x00 };
+static unsigned char ideal_nop2_x86[2] = { 0x66, 0x99 };
+static unsigned char *ideal_nop;
+
+static int (*make_nop)(void *map, size_t const offset);
+
+static int make_nop_x86(void *map, size_t const offset)
+{
+	unsigned char *op;
+	unsigned char *nop;
+	int size;
+
+	/* Determine which type of jmp this is 2 byte or 5. */
+	op = map + offset;
+	switch (*op) {
+	case 0xeb: /* 2 byte */
+		size = 2;
+		nop = ideal_nop2_x86;
+		break;
+	case 0xe9: /* 5 byte */
+		size = 5;
+		nop = ideal_nop;
+		break;
+	default:
+		die(NULL, "Bad jump label section\n");
+	}
+
+	/* convert to nop */
+	ulseek(fd_map, offset, SEEK_SET);
+	uwrite(fd_map, nop, size);
+	return 0;
+}
+
+/* 32 bit and 64 bit are very similar */
+#include "update_jump_label.h"
+#define UPDATE_JUMP_LABEL_64
+#include "update_jump_label.h"
+
+static int do_file(const char *fname)
+{
+	Elf32_Ehdr *const ehdr = mmap_file(fname);
+	unsigned int reltype = 0;
+
+	w = w4nat;
+	w2 = w2nat;
+	w8 = w8nat;
+	switch (ehdr->e_ident[EI_DATA]) {
+		static unsigned int const endian = 1;
+	default:
+		die(NULL, "unrecognized ELF data encoding %d: %s\n",
+			ehdr->e_ident[EI_DATA], fname);
+		break;
+	case ELFDATA2LSB:
+		if (*(unsigned char const *)&endian != 1) {
+			/* main() is big endian, file.o is little endian. */
+			w = w4rev;
+			w2 = w2rev;
+			w8 = w8rev;
+		}
+		break;
+	case ELFDATA2MSB:
+		if (*(unsigned char const *)&endian != 0) {
+			/* main() is little endian, file.o is big endian. */
+			w = w4rev;
+			w2 = w2rev;
+			w8 = w8rev;
+		}
+		break;
+	}  /* end switch */
+
+	if (memcmp(ELFMAG, ehdr->e_ident, SELFMAG) != 0 ||
+	    w2(ehdr->e_type) != ET_REL ||
+	    ehdr->e_ident[EI_VERSION] != EV_CURRENT)
+		die(NULL, "unrecognized ET_REL file %s\n", fname);
+
+	switch (w2(ehdr->e_machine)) {
+	default:
+		die(NULL, "unrecognized e_machine %d %s\n",
+		    w2(ehdr->e_machine), fname);
+		break;
+	case EM_386:
+		reltype = R_386_32;
+		make_nop = make_nop_x86;
+		ideal_nop = ideal_nop5_x86_32;
+		break;
+	case EM_ARM:	 reltype = R_ARM_ABS32;
+			 break;
+	case EM_IA_64:	 reltype = R_IA64_IMM64; break;
+	case EM_MIPS:	 /* reltype: e_class    */ break;
+	case EM_PPC:	 reltype = R_PPC_ADDR32;   break;
+	case EM_PPC64:	 reltype = R_PPC64_ADDR64; break;
+	case EM_S390:    /* reltype: e_class    */ break;
+	case EM_SH:	 reltype = R_SH_DIR32;                 break;
+	case EM_SPARCV9: reltype = R_SPARC_64;     break;
+	case EM_X86_64:
+		make_nop = make_nop_x86;
+		ideal_nop = ideal_nop5_x86_64;
+		reltype = R_X86_64_64;
+		break;
+	}  /* end switch */
+
+	switch (ehdr->e_ident[EI_CLASS]) {
+	default:
+		die(NULL, "unrecognized ELF class %d %s\n",
+		    ehdr->e_ident[EI_CLASS], fname);
+		break;
+	case ELFCLASS32:
+		if (w2(ehdr->e_ehsize) != sizeof(Elf32_Ehdr)
+		||  w2(ehdr->e_shentsize) != sizeof(Elf32_Shdr))
+			die(NULL, "unrecognized ET_REL file: %s\n", fname);
+
+		if (w2(ehdr->e_machine) == EM_S390) {
+			reltype = R_390_32;
+		}
+		if (w2(ehdr->e_machine) == EM_MIPS) {
+			reltype = R_MIPS_32;
+		}
+		do_func32(ehdr, fname, reltype);
+		break;
+	case ELFCLASS64: {
+		Elf64_Ehdr *const ghdr = (Elf64_Ehdr *)ehdr;
+		if (w2(ghdr->e_ehsize) != sizeof(Elf64_Ehdr)
+		||  w2(ghdr->e_shentsize) != sizeof(Elf64_Shdr))
+			die(NULL, "unrecognized ET_REL file: %s\n", fname);
+
+		if (w2(ghdr->e_machine) == EM_S390)
+			reltype = R_390_64;
+
+#if 0
+		if (w2(ghdr->e_machine) == EM_MIPS) {
+			reltype = R_MIPS_64;
+			Elf64_r_sym = MIPS64_r_sym;
+		}
+#endif
+		do_func64(ghdr, fname, reltype);
+		break;
+	}
+	}  /* end switch */
+
+	munmap_file(ehdr);
+	return 0;
+}
+
+int main (int argc, char **argv)
+{
+	if (argc != 2)
+		usage(argv);
+	
+	return do_file(argv[1]);
+}
+
diff --git a/scripts/update_jump_label.h b/scripts/update_jump_label.h
new file mode 100644
index 0000000..6ff9846
--- /dev/null
+++ b/scripts/update_jump_label.h
@@ -0,0 +1,322 @@
+/*
+ * recordmcount.h
+ *
+ * This code was taken out of recordmcount.c written by
+ * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>.  All rights reserved.
+ *
+ * The original code had the same algorithms for both 32bit
+ * and 64bit ELF files, but the code was duplicated to support
+ * the difference in structures that were used. This
+ * file creates a macro of everything that is different between
+ * the 64 and 32 bit code, such that by including this header
+ * twice we can create both sets of functions by including this
+ * header once with RECORD_MCOUNT_64 undefined, and again with
+ * it defined.
+ *
+ * This conversion to macros was done by:
+ * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
+ *
+ * Licensed under the GNU General Public License, version 2 (GPLv2).
+ */
+
+#undef EBITS
+#undef _w
+#undef _align
+#undef _size
+
+#ifdef UPDATE_JUMP_LABEL_64
+# define EBITS			64
+# define _w			w8
+# define _align			7u
+# define _size			8
+#else
+# define EBITS			32
+# define _w			w
+# define _align			3u
+# define _size			4
+#endif
+
+#define _FBITS(x, e)	x##e
+#define FBITS(x, e)	_FBITS(x,e)
+#define FUNC(x)		FBITS(x,EBITS)
+
+#undef Elf_Addr
+#undef Elf_Ehdr
+#undef Elf_Shdr
+#undef Elf_Rel
+#undef Elf_Rela
+#undef Elf_Sym
+#undef ELF_R_SYM
+#undef ELF_R_TYPE
+
+#define __ATTACH(x,y,z)	x##y##z
+#define ATTACH(x,y,z)	__ATTACH(x,y,z)
+
+#define Elf_Addr	ATTACH(Elf,EBITS,_Addr)
+#define Elf_Ehdr	ATTACH(Elf,EBITS,_Ehdr)
+#define Elf_Shdr	ATTACH(Elf,EBITS,_Shdr)
+#define Elf_Rel		ATTACH(Elf,EBITS,_Rel)
+#define Elf_Rela	ATTACH(Elf,EBITS,_Rela)
+#define Elf_Sym		ATTACH(Elf,EBITS,_Sym)
+#define uint_t		ATTACH(uint,EBITS,_t)
+#define ELF_R_SYM	ATTACH(ELF,EBITS,_R_SYM)
+#define ELF_R_TYPE	ATTACH(ELF,EBITS,_R_TYPE)
+
+#undef get_shdr
+#define get_shdr(ehdr) ((Elf_Shdr *)(_w((ehdr)->e_shoff) + (void *)(ehdr)))
+
+#undef get_section_loc
+#define get_section_loc(ehdr, shdr)(_w((shdr)->sh_offset) + (void *)(ehdr))
+
+/* Functions and pointers that do_file() may override for specific e_machine. */
+
+#if 0
+static uint_t FUNC(fn_ELF_R_SYM)(Elf_Rel const *rp)
+{
+	return ELF_R_SYM(_w(rp->r_info));
+}
+static uint_t (*FUNC(Elf_r_sym))(Elf_Rel const *rp) = FUNC(fn_ELF_R_SYM);
+#endif
+
+static void FUNC(get_sym_str_and_relp)(Elf_Shdr const *const relhdr,
+				 Elf_Ehdr const *const ehdr,
+				 Elf_Sym const **sym0,
+				 char const **str0,
+				 Elf_Rel const **relp)
+{
+	Elf_Shdr *const shdr0 = get_shdr(ehdr);
+	unsigned const symsec_sh_link = w(relhdr->sh_link);
+	Elf_Shdr const *const symsec = &shdr0[symsec_sh_link];
+	Elf_Shdr const *const strsec = &shdr0[w(symsec->sh_link)];
+	Elf_Rel const *const rel0 =
+		(Elf_Rel const *)get_section_loc(ehdr, relhdr);
+
+	*sym0 = (Elf_Sym const *)get_section_loc(ehdr, symsec);
+
+	*str0 = (char const *)get_section_loc(ehdr, strsec);
+
+	*relp = rel0;
+}
+
+/*
+ * Read the relocation table again, but this time its called on sections
+ * that are not going to be traced. The mcount calls here will be converted
+ * into nops.
+ */
+static void FUNC(nop_jump_label)(Elf_Shdr const *const relhdr,
+		       Elf_Ehdr const *const ehdr,
+		       const char *const txtname)
+{
+	Elf_Shdr *const shdr0 = get_shdr(ehdr);
+	Elf_Sym const *sym0;
+	char const *str0;
+	Elf_Rel const *relp;
+	Elf_Rela const *relap;
+	Elf_Shdr const *const shdr = &shdr0[w(relhdr->sh_info)];
+	unsigned rel_entsize = w(relhdr->sh_entsize);
+	unsigned const nrel = _w(relhdr->sh_size) / rel_entsize;
+	int t;
+
+	FUNC(get_sym_str_and_relp)(relhdr, ehdr, &sym0, &str0, &relp);
+
+	for (t = nrel; t > 0; t -= 3) {
+		int ret = -1;
+
+		relap = (Elf_Rela const *)relp;
+		printf("rel offset=%lx info=%lx sym=%lx type=%lx addend=%lx\n",
+		       (long)relap->r_offset, (long)relap->r_info,
+		       (long)ELF_R_SYM(relap->r_info),
+		       (long)ELF_R_TYPE(relap->r_info),
+		       (long)relap->r_addend);
+
+		if (0 && make_nop)
+			ret = make_nop((void *)ehdr, shdr->sh_offset + relp->r_offset);
+
+		/* jump label sections are paired in threes */
+		relp = (Elf_Rel const *)(rel_entsize * 3 + (void *)relp);
+	}
+}
+
+/* Evade ISO C restriction: no declaration after statement in has_rel_mcount. */
+static char const *
+FUNC(__has_rel_jump_table)(Elf_Shdr const *const relhdr,  /* is SHT_REL or SHT_RELA */
+		 Elf_Shdr const *const shdr0,
+		 char const *const shstrtab,
+		 char const *const fname)
+{
+	/* .sh_info depends on .sh_type == SHT_REL[,A] */
+	Elf_Shdr const *const txthdr = &shdr0[w(relhdr->sh_info)];
+	char const *const txtname = &shstrtab[w(txthdr->sh_name)];
+
+	if (strcmp("__jump_table", txtname) == 0) {
+		fprintf(stderr, "warning: __mcount_loc already exists: %s\n",
+			fname);
+//		succeed_file();
+	}
+	if (w(txthdr->sh_type) != SHT_PROGBITS ||
+	    !(w(txthdr->sh_flags) & SHF_EXECINSTR))
+		return NULL;
+	return txtname;
+}
+
+static char const *FUNC(has_rel_jump_table)(Elf_Shdr const *const relhdr,
+				      Elf_Shdr const *const shdr0,
+				      char const *const shstrtab,
+				      char const *const fname)
+{
+	if (w(relhdr->sh_type) != SHT_REL && w(relhdr->sh_type) != SHT_RELA)
+		return NULL;
+	return FUNC(__has_rel_jump_table)(relhdr, shdr0, shstrtab, fname);
+}
+
+/* Find relocation section hdr for a given section */
+static const Elf_Shdr *
+FUNC(find_relhdr)(const Elf_Ehdr *ehdr, const Elf_Shdr *shdr)
+{
+	const Elf_Shdr *shdr0 = get_shdr(ehdr);
+	int nhdr = w2(ehdr->e_shnum);
+	const Elf_Shdr *hdr;
+	int i;
+
+	for (hdr = shdr0, i = 0; i < nhdr; hdr = &shdr0[++i]) {
+		if (w(hdr->sh_type) != SHT_REL &&
+		    w(hdr->sh_type) != SHT_RELA)
+			continue;
+
+		/*
+		 * The relocation section's info field holds
+		 * the section index that it represents.
+		 */
+		if (shdr == &shdr0[w(hdr->sh_info)])
+			return hdr;
+	}
+	return NULL;
+}
+
+/* Find a section headr based on name and type */
+static const Elf_Shdr *
+FUNC(find_shdr)(const Elf_Ehdr *ehdr, const char *name, uint_t type)
+{
+	const Elf_Shdr *shdr0 = get_shdr(ehdr);
+	const Elf_Shdr *shstr = &shdr0[w2(ehdr->e_shstrndx)];
+	const char *shstrtab = (char *)get_section_loc(ehdr, shstr);
+	int nhdr = w2(ehdr->e_shnum);
+	const Elf_Shdr *hdr;
+	const char *hdrname;
+	int i;
+
+	for (hdr = shdr0, i = 0; i < nhdr; hdr = &shdr0[++i]) {
+		if (w(hdr->sh_type) != type)
+			continue;
+
+		/* If we are just looking for a section by type (ie. SYMTAB) */
+		if (!name)
+			return hdr;
+
+		hdrname = &shstrtab[w(hdr->sh_name)];
+		if (strcmp(hdrname, name) == 0)
+			return hdr;
+	}
+	return NULL;
+}
+
+static void
+FUNC(section_update)(const Elf_Ehdr *ehdr, const Elf_Shdr *symhdr,
+		     unsigned shtype, const Elf_Rel *rel, void *data)
+{
+	const Elf_Shdr *shdr0 = get_shdr(ehdr);
+	const Elf_Shdr *targethdr;
+	const Elf_Rela *rela;
+	const Elf_Sym *syment;
+	uint_t offset = _w(rel->r_offset);
+	uint_t info = _w(rel->r_info);
+	uint_t sym = ELF_R_SYM(info);
+	uint_t type = ELF_R_TYPE(info);
+	uint_t addend;
+	uint_t targetloc;
+
+	if (shtype == SHT_RELA) {
+		rela = (const Elf_Rela *)rel;
+		addend = _w(rela->r_addend);
+	} else
+		addend = _w(*(unsigned short *)(data + offset));
+
+	syment = (const Elf_Sym *)get_section_loc(ehdr, symhdr);
+	targethdr = &shdr0[w2(syment[sym].st_shndx)];
+	targetloc = _w(targethdr->sh_offset);
+
+	/* TODO, need a separate function for all archs */
+	if (type != R_386_32)
+		die(NULL, "Arch relocation type %d not supported", type);
+
+	targetloc += addend;
+
+#if 1
+	printf("offset=%x target=%x shoffset=%x add=%x\n",
+	       offset, targetloc, _w(targethdr->sh_offset), addend);
+#endif
+	*(uint_t *)(data + offset) = targetloc;
+}
+
+/* Overall supervision for Elf32 ET_REL file. */
+static void
+FUNC(do_func)(Elf_Ehdr *ehdr, char const *const fname, unsigned const reltype)
+{
+	const Elf_Shdr *jlshdr;
+	const Elf_Shdr *jlrhdr;
+	const Elf_Shdr *symhdr;
+	const Elf_Rel *rel;
+	unsigned size;
+	unsigned cnt;
+	unsigned i;
+	uint_t type;
+	void *jdata;
+	void *data;
+
+	jlshdr = FUNC(find_shdr)(ehdr, "__jump_table", SHT_PROGBITS);
+	if (!jlshdr)
+		return;
+
+	jlrhdr = FUNC(find_relhdr)(ehdr, jlshdr);
+	if (!jlrhdr)
+		return;
+
+	/*
+	 * Create and fill in the __jump_table section and use it to
+	 * find the offsets into the text that we want to update.
+	 * We create it so that we do not depend on the order of the
+	 * relocations, and use the table directly, as it is broken
+	 * up into sections.
+	 */
+	size = _w(jlshdr->sh_size);
+	data = umalloc(size);
+
+	jdata = (void *)get_section_loc(ehdr, jlshdr);
+	memcpy(data, jdata, size);
+
+	cnt = _w(jlrhdr->sh_size) / w(jlrhdr->sh_entsize);
+
+	rel = (const Elf_Rel *)get_section_loc(ehdr, jlrhdr);
+
+	/* Is this as Rel or Rela? */
+	type = w(jlrhdr->sh_type);
+
+	symhdr = FUNC(find_shdr)(ehdr, NULL, SHT_SYMTAB);
+
+	for (i = 0; i < cnt; i++) {
+		FUNC(section_update)(ehdr, symhdr, type, rel, data);
+		rel = (void *)rel + w(jlrhdr->sh_entsize);
+	}
+
+	/*
+	 * This is specific to x86. The jump_table is stored in three
+	 * long words. The first is the location of the jmp target we
+	 * must update.
+	 */
+	cnt = size / sizeof(uint_t);
+
+	for (i = 0; i < cnt; i += 3)
+		if (0)make_nop((void *)ehdr, *(uint_t *)(data + i * sizeof(uint_t)));
+
+	free(data);
+}



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 10:36:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 10:36:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCELg-0002JG-Vg; Fri, 07 Oct 2011 10:36:41 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCEKu-00021R-93
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:35:52 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318008948!20237100!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17922 invoked from network); 7 Oct 2011 17:35:49 -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;
	7 Oct 2011 17:35:49 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8279243"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 17:35: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, 7 Oct 2011 18:35:48 +0100
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 1RCEKq-0005nb-0U;
	Fri, 07 Oct 2011 17:35:48 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RCEKp-0008Ic-Qu;
	Fri, 07 Oct 2011 18:35:47 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9204-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 18:35:47 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9204: 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 9204 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9204/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     12 guest-saverestore.2        fail REGR. vs. 9203

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-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                  eec5d0b44f76
baseline version:
 xen                  eb8637351535

------------------------------------------------------------
People who touched revisions under test:
  Ian Jackson <ian.jackson@eu.citrix.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


Not pushing.

------------------------------------------------------------
changeset:   23930:eec5d0b44f76
tag:         tip
user:        Olaf Hering <olaf@aepfle.de>
date:        Fri Oct 07 14:33:15 2011 +0100
    
    tools/check: remove check_logging
    
    Remove tools/check/check_logging.  Python 2.3 is the minimal required
    python version so the checked function is available anyway.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23929:b45b400d11d3
user:        Olaf Hering <olaf@aepfle.de>
date:        Fri Oct 07 14:32:36 2011 +0100
    
    tools/check: update python version check
    
    Python 2.3 is the minimal version according to the README.
    Adjust check script.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23928:eb8637351535
user:        Ian Jackson <Ian.Jackson@eu.citrix.com>
date:        Fri Oct 07 10:47:04 2011 +0100
    
    libvchan: remove erroneously-committed libvchan-node[12]; add them to .hgignore
    
    Signed-off-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 Fri Oct 07 10:37:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 10:37:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCEMm-0002gN-AJ; Fri, 07 Oct 2011 10:37:48 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCEKw-00021i-KC
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:35:55 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318008948!20237100!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17993 invoked from network); 7 Oct 2011 17:35:51 -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;
	7 Oct 2011 17:35:51 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8279244"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 17:35: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, 7 Oct 2011 18:35:51 +0100
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
	1RCEKt-0005nf-AL; Fri, 07 Oct 2011 17:35:51 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RCEKt-0007RG-9I;
	Fri, 07 Oct 2011 18:35:51 +0100
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: <20111.14455.269057.812001@mariner.uk.xensource.com>
Date: Fri, 7 Oct 2011 18:35:51 +0100
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key.
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1317990495.21903.331.camel@zakaz.uk.xensource.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-2-git-send-email-anthony.perard@citrix.com>
	<1317990495.21903.331.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Xen Devel <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

Ian Campbell writes ("Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key."):
> On Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
> > The key is /local/domain/$domid/dm-version.
> 
> I've been wondering if we should introduce /libxl/$domid/ as a place for
> keeping tooltack internal droppings like this. The danger with putting
> stuff in /local/domain is that domains come to rely on them.

Also, can't the domain write to /local/domain/$domid ?  Which we don't
want, in this case.

> > +    localents[i++] = libxl__strdup(gc, libxl_device_model_version_to_string(dm_info->device_model_version));
> > +
> 
> You don't seem to use this anywhere?

Also, like several other lines here, it needs to be wrapped
(preferably, to 75 columns or so).

> This would be a bug, since it would imply an inconsistent version of
> libxl was used to create the domain? (not sure what our policy around
> this actually is / should be).

No, because the same toolstack can create domains with either version
of qemu.

Ian.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 10:38:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 10:38:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCENg-00033O-BM; Fri, 07 Oct 2011 10:38:44 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCENF-0002qo-4T
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:38:17 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318009094!156760!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13325 invoked from network); 7 Oct 2011 17:38:14 -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 Oct 2011 17:38:14 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8279275"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 17:38: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; Fri, 7 Oct 2011 18:38:13 +0100
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
	1RCENB-0005oU-9x; Fri, 07 Oct 2011 17:38:13 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RCENB-0007Rr-8x;
	Fri, 07 Oct 2011 18:38:13 +0100
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: <20111.14597.266685.92483@mariner.uk.xensource.com>
Date: Fri, 7 Oct 2011 18:38:13 +0100
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH 7/7] libxl,
	Use QMP to insert a passthrough device when using upstream QEMU
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1317989418-25463-8-git-send-email-anthony.perard@citrix.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-8-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>,
	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 7/7] libxl, Use QMP to insert a passt> +            else if ( sscanf(vdevfn, "0x%x", &pcidev->vdevfn) != 1 )
> +                rc = -1;

If this ever happens, it would be very mysterious.  Perhaps add a
logging call ?

Ian.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 10:44:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 10:44:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCET1-0003Z9-GW; Fri, 07 Oct 2011 10:44:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCESX-0003Mu-9d
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:43:45 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1318009421!28352636!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23725 invoked from network); 7 Oct 2011 17:43:42 -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;
	7 Oct 2011 17:43:42 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8279339"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 17:43: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, 7 Oct 2011 18:43:41 +0100
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
	1RCEST-0005qG-7e; Fri, 07 Oct 2011 17:43:41 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RCEST-0007Vd-6j;
	Fri, 07 Oct 2011 18:43:41 +0100
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: <20111.14925.196745.735565@mariner.uk.xensource.com>
Date: Fri, 7 Oct 2011 18:43:41 +0100
To: Guido =?iso-8859-1?Q?G=FCnther?= <agx@sigxcpu.org>
Subject: Re: [Xen-devel] [PATCH/RFC] don't include <xen/sysctl.h> in libxl.h
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <20111007170528.GA21562@bogon.sigxcpu.org>
References: <20111005181413.GA32317@bogon.sigxcpu.org>
	<20111007170528.GA21562@bogon.sigxcpu.org>
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

Guido Günther writes ("[Xen-devel] [PATCH/RFC] don't include <xen/sysctl.h> in l> Hi,
> I'm unsure if libvirt qualifies as "node control tool":

Not in this context.

> In file included from /tmp/usr/include/libxl.h:137:0,
>                  from libxl/libxl_conf.c:28:
> /tmp/usr/include/xen/sysctl.h:31:2: error: #error "sysctl operations are intended for use by node control tools only"
> In file included from /tmp/usr/include/xen/sysctl.h:35:0,
>                  from /tmp/usr/include/libxl.h:137,
>                  from libxl/libxl_conf.c:28:
> 
> If not it makes sense to remove the include from libxl.h and include it
> in xl_cmdimpl.c directly. This allows libvirt to include libxl.h again
> without defining __XEN_TOOLS__.

I think neither libxl.h nor xl_cmdimpl should drag in sysctl.h this
way.

xl needs them because of this:

    if (info.phys_cap & XEN_SYSCTL_PHYSCAP_hvm)
        printf(" hvm");
    if (info.phys_cap & XEN_SYSCTL_PHYSCAP_hvm_directio)
        printf(" hvm_directio");

Either libxl should proxy these kinds of flags, or the flags should be
moved to a public header file, or all libxl callers should
automatically get __XEN_TOOLS__.

Ian.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 10:54:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 10:54:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCEcc-0004t7-LA; Fri, 07 Oct 2011 10:54:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCEbw-0004g8-HM
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:53:28 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318010005!158006!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13369 invoked from network); 7 Oct 2011 17:53:25 -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 Oct 2011 17:53:25 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8279410"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 17:53: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; Fri, 7 Oct 2011
	18:53:25 +0100
Subject: Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
In-Reply-To: <20111.14455.269057.812001@mariner.uk.xensource.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-2-git-send-email-anthony.perard@citrix.com>
	<1317990495.21903.331.camel@zakaz.uk.xensource.com>
	<20111.14455.269057.812001@mariner.uk.xensource.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 7 Oct 2011 18:53:24 +0100
Message-ID: <1318010004.24742.34.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Anthony Perard <anthony.perard@citrix.com>,
	Xen Devel <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 Fri, 2011-10-07 at 18:35 +0100, Ian Jackson wrote:
> Ian Campbell writes ("Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key."):
> > This would be a bug, since it would imply an inconsistent version of
> > libxl was used to create the domain? (not sure what our policy around
> > this actually is / should be).
> 
> No, because the same toolstack can create domains with either version
> of qemu.

Such a toolstack would always write the node to one value or the other.

The case I'm referring to is when the domain was created by one version
of libxl (which doesn't write the node) but is now being acted upon by a
new one (which does write & check it), perhaps due to an intervening
upgrade.

There is no way to know which version of qemu was used in this scenario
but I question whether it is something we should support in any case (at
least outside of stable branches).

Ian.

> 
> Ian.



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 10:56:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 10:56:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCEfF-0005He-Tw; Fri, 07 Oct 2011 10:56:53 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCEef-00055p-7F
	for Xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:56:17 -0700
X-Env-Sender: mukesh.rathor@oracle.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1318010152!43545660!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9094 invoked from network); 7 Oct 2011 17:55:53 -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; 7 Oct 2011 17:55:53 -0000
Received: from rtcsinet21.oracle.com (rtcsinet21.oracle.com [66.248.204.29])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p97Hu4va015395
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 7 Oct 2011 17:56:06 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by rtcsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p97Hu20f023182
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 7 Oct 2011 17:56:03 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
	p97Htvsl016617; Fri, 7 Oct 2011 12:55:57 -0500
Received: from mantra.us.oracle.com (/130.35.68.95)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 07 Oct 2011 10:55:56 -0700
Date: Fri, 7 Oct 2011 10:55:55 -0700
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] HYBRID: set_page_prot() (make pte readonly)
Message-ID: <20111007105555.0afb42b3@mantra.us.oracle.com>
In-Reply-To: <1317974289.21903.287.camel@zakaz.uk.xensource.com>
References: <20111006191241.0866625f@mantra.us.oracle.com>
	<1317974289.21903.287.camel@zakaz.uk.xensource.com>
Organization: Oracle Corporation
X-Mailer: Claws Mail 3.7.6 (GTK+ 2.18.9; x86_64-redhat-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Source-IP: rtcsinet21.oracle.com [66.248.204.29]
X-CT-RefId: str=0001.0A090205.4E8F3D37.003A,ss=1,re=0.000,fgs=0
Cc: Fitzhardinge <jeremy@goop.org>,
	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Jeremy, 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, 7 Oct 2011 08:58:09 +0100
Ian Campbell <Ian.Campbell@citrix.com> wrote:

> Do you have something functional without EPT? I appreciate that this
> is just a stepping stone to the final functionality but it might be
> worth starting to post those patches? It would be a useful baseline
> for others to start looking at additional features/optimisations on
> top of etc.

Hi Ian,

Please see my previous posts with patches attached for hybrid without
EPT. Search for HYBRID in subject.

> Do you do this by stubbing out the hypercalls (e.g. via a VDSO type
> thing in guest address space) or are you cutting off the PV MMU stuff
> at start of day using XENFEAT_autotranslated_physmap and/or
> XENFEAT_writeable_*? Or some other option?

I'm cutting off PV MMU stuff with XENFEAT_auto_translated_physmap.

> > So, I'm at a loss on how to make set_page_prot() work during 
> > xen_map_identity_early(). I tried few things, but no luck. The
> > fixmap is not setup during this time, so can't use that. 
> 
> You can just omit it altogether if XENFEAT_writeable_pagetables is
> set?

Right. 

thanks,
Mukesh


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 10:58:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 10:58:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCEh2-0005i7-UE; Fri, 07 Oct 2011 10:58:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCEfq-0005To-1f
	for Xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:57:30 -0700
X-Env-Sender: mukesh.rathor@oracle.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318010256!54612819!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29538 invoked from network); 7 Oct 2011 17:57:37 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2011 17:57:37 -0000
Received: from rtcsinet21.oracle.com (rtcsinet21.oracle.com [66.248.204.29])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p97HvKpY017143
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 7 Oct 2011 17:57:22 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by rtcsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p97HvIFI024650
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 7 Oct 2011 17:57:19 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
	p97HvDJ0016690; Fri, 7 Oct 2011 12:57:13 -0500
Received: from mantra.us.oracle.com (/130.35.68.95)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 07 Oct 2011 10:57:12 -0700
Date: Fri, 7 Oct 2011 10:57:06 -0700
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111007105706.670b646a@mantra.us.oracle.com>
In-Reply-To: <4E8F1EEC.9000205@goop.org>
References: <20111006191241.0866625f@mantra.us.oracle.com>
	<4E8F1EEC.9000205@goop.org>
Organization: Oracle Corporation
X-Mailer: Claws Mail 3.7.6 (GTK+ 2.18.9; x86_64-redhat-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Source-IP: rtcsinet21.oracle.com [66.248.204.29]
X-CT-RefId: str=0001.0A090208.4E8F3D82.0149,ss=1,re=0.000,fgs=0
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] Re: HYBRID: set_page_prot() (make pte readonly)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 07 Oct 2011 08:46:52 -0700
Jeremy Fitzhardinge <jeremy@goop.org> wrote:

> On 10/06/2011 07:12 PM, Mukesh Rathor wrote:
> > So, I'm at a loss on how to make set_page_prot() work during 
> > xen_map_identity_early(). I tried few things, but no luck. The
> > fixmap is not setup during this time, so can't use that. 
> >
> > Have any ideas?
> 
> Why do you need set_page_prot() at all?  It's only being used to mark
> pagetable entries RO, but you presumably don't need to do that with
> EPT.
> 
>     J

Yes, you are right, with EPT I wouldn't need to do that.

thanks
Mukesh

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 11:09:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 11:09:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCErP-0006rw-Gy; Fri, 07 Oct 2011 11:09:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCEnX-0006cv-7k
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 11:05:57 -0700
X-Env-Sender: jmdebruin@xmsnet.nl
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318010723!160855!1
X-Originating-IP: [217.149.192.65]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10226 invoked from network); 7 Oct 2011 18:05:23 -0000
Received: from smtp10.mail.sp.isp-net.nl (HELO smtp10.mail.sp.isp-net.nl)
	(217.149.192.65) by server-13.tower-216.messagelabs.com with SMTP;
	7 Oct 2011 18:05:23 -0000
Received: from [10.10.1.6] by smtp10.mail.sp.isp-net.nl
	via [92.254.124.152] with ESMTP for <xen-devel@lists.xensource.com>
	id p97I5MRt022782 (8.13.2/2.04); Fri, 7 Oct 2011 20:05:22 +0200 (MEST)
Message-ID: <4E8F3F61.9070401@xmsnet.nl>
Date: Fri, 07 Oct 2011 20:05:21 +0200
From: Hans de Bruin <jmdebruin@xmsnet.nl>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.21) Gecko/20110903 Thunderbird/3.1.13
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Content-Type: multipart/mixed; boundary="------------010005020909030502070406"
X-Language-Detected: en
X-Spam-Scanned: InterNLnet Mail Scan System V2.03
Subject: [Xen-devel] Limits on mtu size ?
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.
--------------010005020909030502070406
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit


Network performance on fast physical networks usually increase by 
switching to larger packet sizes. So I decided to increase the mtu on my 
virtual networks to see if that has a positive effect. Anoyingly the 
bridge code does not allow you to increase the mtu above 1500 if no 
interface is attached to the bridge. Google tels me admins attach a nic 
to the bridge, increase the mtu and then remove the nic from the bridge 
as a work around. Then I noticed that the loopback has a whopping 16k 
mtu. For some reason adding lo to a bridge is not allowed. To shortcut 
workarounds and have fun with the mtu size I modified 
linux-2.6/net/bridge/br_if.c. There is a line: mtu = ETH_DATA_LEN; which 
I changed in to mtu = 16436; If lo can handle that size why not a 
bridge. So my setup now has two brides with oversized mtu's and one 
normal sized bidge to talk to my lan. This setup has run for two day's 
and now it suddenly broke while ssh/rsync-ing data between the to 
internal networks. A server called darkstar ran out of memory, as far as 
i can see with an empty swapfile, a server called orion, which was 
reseaving the data, stopped responding. Dom0 feels sluggish. So 16436 is 
to big and 9000 is not?

I have attached the complaints of darkstar. Its running out of kernel 
memory?

-- 
Hans

orion: 2 cpu, 1GB
darkstar: 2 cpu 512MB
...
dom0: 1 cpu's (dual core dual threaded), 1GB
kernels 3.1-rc7 and higher
xen 4.1.1
al pure pv.




--------------010005020909030502070406
Content-Type: application/octet-stream;
 name="log.bz2"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="log.bz2"

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
5J7UdeNXIOMyT1B5dis1w71q5CxmSdYwNi6yicaFVVAm5mluMzDm8Es7tKQxNZuxW41cg4zJ
O0MDYqsnaJJJJLnhli03V9NZpqxLmeNY9FSJx71TImd2u6ZyavWtdSZyq7DJa0KnlzkkZalT
dYpvlXDDmiZvVNqUltLkSSSTUBqitDVXQ657qF5kqubWru2jSN660lY3gwbcmsi5aknXk0N1
dubTmy9W3IwrnWqdzZwWX15bzOfMVkqzJylU9yy1rqt2Tpk41TnZ3kFSdAOxrrHzZTifd53m
dR5Ncm2NtEWRLcJEEEzjNKSNacvHKV9qO5UbttXInWZJ1jA2JvXD3WrlYzJOsPLsc964vOau
QtZknmKwsZx4WEri+5q5GbZknmL27HdJ03qqXqy5Fizhtqpy1l5RGNbq0xV9jtxg3ti8Haja
rdrsVd2EIGVLnZ0ZjpXaWLh2nUprbMtdTK7N6aBHXhmWsk5sz0yqVXORpLPdvJmd6d1IlVOj
VzGzki+yinfTOXVsSE6FTU7a7b3R0Lr11Ty2RnKqfDSc58qq4fc1crGZJ5h9dis7oec1ci8s
yTzE80J3Oh9zVyDjMk9UY2Jx85zImZ3FNqkweb09hyqneW62Fr6qmuyseiXQV6tpckhc7wVC
+6TmTavUk9JTnRKkLu7WyJJtHZkh8VlzLctIjd6rQmKrp5dk83vYp52JHLKQWgkT3Kc6r29E
pbUi41uk5FXSUk43LLGskmUhg2LyTVhYWpJ1uWWKuy9VnQa2pU3jdK9ulWpCsGzuXdKyC5LK
eiaxyg7qmjlpTqW7uVOWpTMVtNTpl2GNgvdlLRXlkG+7tuyNea2b3jGdlOcneGbzpQdCq1WV
Kwk6CpnlEib7UNHU9wIMUGyBIYxMEZ1neoWLGhCp5btiswaHkgkih0tu53RgYwIaM6RKM3tX
WiXjm3ut4py6bylu7XIbzxUCeO31WOCrqlcNqmqzKx1SYwOVfOlRB1S9qe4SxSmt1u1NmXWU
rqbmje3Su0r7t6tnRKEqz21LR0jp7lo0dSzHaog8pe1IwKnUzOY21kKZlLruZM3ilNpXtZtY
WDRkq9NVS1M3WGKx8sk01SS3NjNxq5WMyTrGlsLK2HutXKxmSdYm2hM7sPdauRWEonaGBsTm
uHutXIrCUTtBUKEixo0QxowMIWJDOCwQgQRoYFN9IQFb1w+5q57bMkzUc2Jzuh9zVzWEonqD
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
--------------010005020909030502070406
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

--------------010005020909030502070406--


From xen-devel-bounces@lists.xensource.com Fri Oct 07 11:16:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 11:16:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCExt-00083u-Cf; Fri, 07 Oct 2011 11:16:09 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCEwO-0007VH-VQ
	for Xen-devel@lists.xensource.com; Fri, 07 Oct 2011 11:14:39 -0700
X-Env-Sender: pracshi@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318011273!21411350!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25197 invoked from network); 7 Oct 2011 18:14:33 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 18:14:33 -0000
Received: by bkas6 with SMTP id s6so6548619bka.30
	for <Xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 11:14: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:date:message-id:subject:from:to
	:cc:content-type;
	bh=T/1x2J3U/q2/rBdXVOz5h664H2Mv2fw7xX8+4LA33CE=;
	b=Jx6mMe9L/1JfcX2yGvn9N9Wnio3gImXfhouX8FLN2PMVN+WzhuDYUKfJGvwIz+O2ca
	q8ltrDF7rajKJSZW3t2ThlqMgz6nqS4uEmmu7Wj9PXWnQH7uB3kHOhqe+cQR8Vp3WkmU
	wpf8T60IwuraH9q2Dq6nN5patUnwQNu3H6cp0=
MIME-Version: 1.0
Received: by 10.204.144.15 with SMTP id x15mr1710809bku.9.1318011273353; Fri,
	07 Oct 2011 11:14:33 -0700 (PDT)
Received: by 10.204.156.1 with HTTP; Fri, 7 Oct 2011 11:14:33 -0700 (PDT)
In-Reply-To: <1317985621.15843.87.camel@elijah>
References: <CAEAezkVkfj7mFqEgK+crFZ7T1HAkFqL5rOeCe36JBeH+3=YX+A@mail.gmail.com>
	<CAFLBxZapnxsEiDJgxpS6UmJv8M0_jKg__mtrVPGDu-bZtKhSrg@mail.gmail.com>
	<CAEAezkVMuiugnNtSRyOo9ZD2DtpQnEU44BYXz6ZdKAKqa76Mnw@mail.gmail.com>
	<CAFLBxZZ2GZavNLerU+Wh3zwk=zwELqD6tD-8OVJnSQKS3y7mow@mail.gmail.com>
	<CAEAezkWMhFWrXknxSE5BUmk4dFB026pKVn8UWHdKo4d0tCswow@mail.gmail.com>
	<1317985621.15843.87.camel@elijah>
Date: Fri, 7 Oct 2011 11:14:33 -0700
Message-ID: <CAEAezkUxnVi9zNHS3xq8nxVWTkJXgg31sVs8YrO9ry-K7VnY-w@mail.gmail.com>
Subject: Re: [Xen-devel] [Project Idea]:-Want a guidance for the project
From: Pratik shinde <pracshi@gmail.com>
To: Xen-devel@lists.xensource.com
Cc: George.Dunlap@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="===============1492516432=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1492516432==
Content-Type: multipart/alternative; boundary=0015174c3830c21a1704aeb96930

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

Think you for your time,
          As gang scheduler would an interesting tool to learn about
operating systems, and as we are students we want to learn more about O.S.So,we
all decided to go with our idea to implement the gang scheduler. Thank you
for your kind guidance and your help.
Thankig you,

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

<br><br>Think you for your time,<br>=A0=A0=A0=A0=A0=A0=A0=A0=A0 As gang sch=
eduler would an interesting tool to learn about operating systems, and as w=
e are students we want to learn more about <a href=3D"http://O.S.So">O.S.So=
</a>,we all decided to go with our idea to implement the gang scheduler. Th=
ank you for your kind guidance and your help.<br>
Thankig you,<br>

--0015174c3830c21a1704aeb96930--


--===============1492516432==
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

--===============1492516432==--


From xen-devel-bounces@lists.xensource.com Fri Oct 07 11:23:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 11:23:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCF52-0000k1-HW; Fri, 07 Oct 2011 11:23:32 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCF4a-0000Xo-Gv
	for Xen-devel@lists.xensource.com; Fri, 07 Oct 2011 11:23:04 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318011758!52264854!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27522 invoked from network); 7 Oct 2011 18:22:39 -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;
	7 Oct 2011 18:22:39 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8279856"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 18:23: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; Fri, 7 Oct 2011
	19:23:01 +0100
Subject: Re: [Xen-devel] HYBRID: set_page_prot() (make pte readonly)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Mukesh Rathor <mukesh.rathor@oracle.com>
In-Reply-To: <20111007105555.0afb42b3@mantra.us.oracle.com>
References: <20111006191241.0866625f@mantra.us.oracle.com>
	<1317974289.21903.287.camel@zakaz.uk.xensource.com>
	<20111007105555.0afb42b3@mantra.us.oracle.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 7 Oct 2011 19:23:00 +0100
Message-ID: <1318011780.24742.37.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Fitzhardinge <jeremy@goop.org>,
	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Jeremy, 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, 2011-10-07 at 18:55 +0100, Mukesh Rathor wrote:
> On Fri, 7 Oct 2011 08:58:09 +0100
> Ian Campbell <Ian.Campbell@citrix.com> wrote:
> 
> > Do you have something functional without EPT? I appreciate that this
> > is just a stepping stone to the final functionality but it might be
> > worth starting to post those patches? It would be a useful baseline
> > for others to start looking at additional features/optimisations on
> > top of etc.
> 
> Hi Ian,
> 
> Please see my previous posts with patches attached for hybrid without
> EPT. Search for HYBRID in subject.

I remember the WIP diffs from back in July, have there been others since
then? I guess I was thinking more along the lines of beginning to post
this new feature as a patch series for review or something like that.

Ian.


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 11:25:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 11:25:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCF6m-000184-Bg; Fri, 07 Oct 2011 11:25:21 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCF6K-0000ve-IB
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 11:24:52 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1318011868!41321510!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26898 invoked from network); 7 Oct 2011 18:24:29 -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;
	7 Oct 2011 18:24:29 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8279874"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 18:24:49 +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, 7 Oct 2011
	19:24:49 +0100
Subject: Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
In-Reply-To: <20111.14455.269057.812001@mariner.uk.xensource.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-2-git-send-email-anthony.perard@citrix.com>
	<1317990495.21903.331.camel@zakaz.uk.xensource.com>
	<20111.14455.269057.812001@mariner.uk.xensource.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 7 Oct 2011 19:24:47 +0100
Message-ID: <1318011887.13747.0.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Anthony Perard <anthony.perard@citrix.com>,
	Xen Devel <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 Fri, 2011-10-07 at 18:35 +0100, Ian Jackson wrote:
> Ian Campbell writes ("Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key."):
> > On Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
> > > The key is /local/domain/$domid/dm-version.
> > 
> > I've been wondering if we should introduce /libxl/$domid/ as a place for
> > keeping tooltack internal droppings like this. The danger with putting
> > stuff in /local/domain is that domains come to rely on them.
> 
> Also, can't the domain write to /local/domain/$domid ?  Which we don't
> want, in this case.

Do you think /libxl/$domid is a good idea then or do you have somewhere
else in mind?

Ian.



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 11:28:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 11:28:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCF9y-0002BA-EG; Fri, 07 Oct 2011 11:28:38 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCF8O-0001fd-IC
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 11:27:01 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318012017!20723647!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10123 invoked from network); 7 Oct 2011 18:26:57 -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;
	7 Oct 2011 18:26:57 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8279896"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 18:26: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; Fri, 7 Oct 2011
	19:26:54 +0100
Subject: Re: [Xen-devel] [PATCH/RFC] don't include <xen/sysctl.h> in libxl.h
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
In-Reply-To: <20111.14925.196745.735565@mariner.uk.xensource.com>
References: <20111005181413.GA32317@bogon.sigxcpu.org>
	<20111007170528.GA21562@bogon.sigxcpu.org>
	<20111.14925.196745.735565@mariner.uk.xensource.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 7 Oct 2011 19:26:53 +0100
Message-ID: <1318012014.13747.2.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 8bit
Cc: Guido =?ISO-8859-1?Q?G=FCnther?= <agx@sigxcpu.org>,
	"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-10-07 at 18:43 +0100, Ian Jackson wrote:
> Guido Günther writes ("[Xen-devel] [PATCH/RFC] don't include <xen/sysctl.h> in l> Hi,
> > I'm unsure if libvirt qualifies as "node control tool":
> 
> Not in this context.
> 
> > In file included from /tmp/usr/include/libxl.h:137:0,
> >                  from libxl/libxl_conf.c:28:
> > /tmp/usr/include/xen/sysctl.h:31:2: error: #error "sysctl operations are intended for use by node control tools only"
> > In file included from /tmp/usr/include/xen/sysctl.h:35:0,
> >                  from /tmp/usr/include/libxl.h:137,
> >                  from libxl/libxl_conf.c:28:
> > 
> > If not it makes sense to remove the include from libxl.h and include it
> > in xl_cmdimpl.c directly. This allows libvirt to include libxl.h again
> > without defining __XEN_TOOLS__.
> 
> I think neither libxl.h nor xl_cmdimpl should drag in sysctl.h this
> way.
> 
> xl needs them because of this:
> 
>     if (info.phys_cap & XEN_SYSCTL_PHYSCAP_hvm)
>         printf(" hvm");
>     if (info.phys_cap & XEN_SYSCTL_PHYSCAP_hvm_directio)
>         printf(" hvm_directio");
> 
> Either libxl should proxy these kinds of flags,

I agree. I think the correct thing is for libxl to parse the raw data
into separate info.hvm, info.hvm_directio etc booleans, much like we do
for dominfo.

>  or the flags should be
> moved to a public header file, or all libxl callers should
> automatically get __XEN_TOOLS__.
> 
> Ian.
> 
> _______________________________________________
> 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 Oct 07 11:29:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 11:29:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCFAu-0002Y6-ND; Fri, 07 Oct 2011 11:29:36 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCFAS-0002LI-Q8
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 11:29:09 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318012128!57177546!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32476 invoked from network); 7 Oct 2011 18:28:48 -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;
	7 Oct 2011 18:28:48 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8279918"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 18:29:04 +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, 7 Oct 2011
	19:29:04 +0100
Subject: Re: [Xen-devel] [PATCH 6/7] libxl_qmp, Introduce libxl__qmp_pci_add.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <CAJJyHj+HxoGTASskM9eww=FrRwFcM8DN8e4Xcw2U23fQQE5Oxg@mail.gmail.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-7-git-send-email-anthony.perard@citrix.com>
	<1317991406.21903.343.camel@zakaz.uk.xensource.com>
	<CAJJyHj+HxoGTASskM9eww=FrRwFcM8DN8e4Xcw2U23fQQE5Oxg@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 7 Oct 2011 19:29:03 +0100
Message-ID: <1318012143.13747.3.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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 17:01 +0100, Anthony PERARD wrote:
> On Fri, Oct 7, 2011 at 13:43, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Fri, 2011-10-07 at 13:10 +0100, Anthony PERARD wrote:
> >> This function insert a PCI passthrough device in qemu.
> >>
> >> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> >> ---
> >>  tools/libxl/libxl_internal.h |    2 +
> >>  tools/libxl/libxl_qmp.c      |   89 ++++++++++++++++++++++++++++++++++++++++++
> >>  2 files changed, 91 insertions(+), 0 deletions(-)
> >>
> >> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> >> index 4dd0f91..78e1be2 100644
> >> --- a/tools/libxl/libxl_internal.h
> >> +++ b/tools/libxl/libxl_internal.h
> >> @@ -119,6 +119,7 @@ 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))
> >
> > No need to include the domain or dev in this? The name is pretty weird
> > if you don't include the dev portion.  Looks like this is actually a
> > vdevfn? xl has an open coded instance of this pattern for that -- worth
> > adding a public macro?
> 
> I have actual copy the macro from qemu, and I think "slot === dev".

It appears to yes.

>  I
> think the macro come from linux/pci.h.
> But yes, I use it to store the vdevfn.
> 
> > FWIW pcidev_encode_bdf() exists which encodes the whole lot from a
> > libxl_device_pci, if that what you end up needing.
> 
> If the vdefvn should contain the virtual bus and domain number, so
> yes, that will be the function I need.

I don't think it does in the old qemu stuff, but I don't know about
upstream, I suspect not.
> 



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 11:32:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 11:32:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCFDL-0003cb-12; Fri, 07 Oct 2011 11:32:07 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCFCc-0003Fb-R5
	for Xen-devel@lists.xensource.com; Fri, 07 Oct 2011 11:31:23 -0700
X-Env-Sender: mukesh.rathor@oracle.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1318012278!34381504!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2513 invoked from network); 7 Oct 2011 18:31:19 -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; 7 Oct 2011 18:31: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
	p97IVCU9009032
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 7 Oct 2011 18:31: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
	p97IVB1N015481
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 7 Oct 2011 18:31:11 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
	p97IV5a8029761; Fri, 7 Oct 2011 13:31:05 -0500
Received: from mantra.us.oracle.com (/130.35.68.95)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 07 Oct 2011 11:31:05 -0700
Date: Fri, 7 Oct 2011 11:31:04 -0700
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] HYBRID: set_page_prot() (make pte readonly)
Message-ID: <20111007113104.769f133c@mantra.us.oracle.com>
In-Reply-To: <1318011780.24742.37.camel@dagon.hellion.org.uk>
References: <20111006191241.0866625f@mantra.us.oracle.com>
	<1317974289.21903.287.camel@zakaz.uk.xensource.com>
	<20111007105555.0afb42b3@mantra.us.oracle.com>
	<1318011780.24742.37.camel@dagon.hellion.org.uk>
Organization: Oracle Corporation
X-Mailer: Claws Mail 3.7.6 (GTK+ 2.18.9; x86_64-redhat-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090209.4E8F4572.0046:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Fitzhardinge <jeremy@goop.org>,
	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Jeremy, 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, 7 Oct 2011 19:23:00 +0100
Ian Campbell <Ian.Campbell@citrix.com> wrote:

> On Fri, 2011-10-07 at 18:55 +0100, Mukesh Rathor wrote:
> > On Fri, 7 Oct 2011 08:58:09 +0100
> > Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > 
> > > Do you have something functional without EPT? I appreciate that
> > > this is just a stepping stone to the final functionality but it
> > > might be worth starting to post those patches? It would be a
> > > useful baseline for others to start looking at additional
> > > features/optimisations on top of etc.
> > 
> > Hi Ian,
> > 
> > Please see my previous posts with patches attached for hybrid
> > without EPT. Search for HYBRID in subject.
> 
> I remember the WIP diffs from back in July, have there been others
> since then? I guess I was thinking more along the lines of beginning
> to post this new feature as a patch series for review or something
> like that.

No, I'm just doing the prototype which allows me to learn the stuff at
the same time. Once I've my prototype working, I'll post patches and be
able to understand comments/feedback better.

Mukesh



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 11:40:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 11:40:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCFLd-0005PL-Kq; Fri, 07 Oct 2011 11:40:41 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCFKM-0004lZ-F5
	for Xen-devel@lists.xensource.com; Fri, 07 Oct 2011 11:39:22 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318012743!57178096!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9038 invoked from network); 7 Oct 2011 18:39:03 -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;
	7 Oct 2011 18:39:03 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8280034"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 18:39:19 +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, 7 Oct 2011
	19:39:19 +0100
Subject: Re: [Xen-devel] HYBRID: set_page_prot() (make pte readonly)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Mukesh Rathor <mukesh.rathor@oracle.com>
In-Reply-To: <20111007113104.769f133c@mantra.us.oracle.com>
References: <20111006191241.0866625f@mantra.us.oracle.com>
	<1317974289.21903.287.camel@zakaz.uk.xensource.com>
	<20111007105555.0afb42b3@mantra.us.oracle.com>
	<1318011780.24742.37.camel@dagon.hellion.org.uk>
	<20111007113104.769f133c@mantra.us.oracle.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 7 Oct 2011 19:39:18 +0100
Message-ID: <1318012758.13747.8.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Fitzhardinge <jeremy@goop.org>,
	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Jeremy, 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, 2011-10-07 at 19:31 +0100, Mukesh Rathor wrote:
> On Fri, 7 Oct 2011 19:23:00 +0100
> Ian Campbell <Ian.Campbell@citrix.com> wrote:
> 
> > On Fri, 2011-10-07 at 18:55 +0100, Mukesh Rathor wrote:
> > > On Fri, 7 Oct 2011 08:58:09 +0100
> > > Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > > 
> > > > Do you have something functional without EPT? I appreciate that
> > > > this is just a stepping stone to the final functionality but it
> > > > might be worth starting to post those patches? It would be a
> > > > useful baseline for others to start looking at additional
> > > > features/optimisations on top of etc.
> > > 
> > > Hi Ian,
> > > 
> > > Please see my previous posts with patches attached for hybrid
> > > without EPT. Search for HYBRID in subject.
> > 
> > I remember the WIP diffs from back in July, have there been others
> > since then? I guess I was thinking more along the lines of beginning
> > to post this new feature as a patch series for review or something
> > like that.
> 
> No, I'm just doing the prototype which allows me to learn the stuff at
> the same time. Once I've my prototype working, I'll post patches and be
> able to understand comments/feedback better.

OK, 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 Oct 07 11:41:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 11:41:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCFMP-0005m9-Lo; Fri, 07 Oct 2011 11:41:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCFLb-0005N5-0N
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 11:40:39 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1318012835!21263804!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14639 invoked from network); 7 Oct 2011 18:40:35 -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 Oct 2011 18:40:35 -0000
X-IronPort-AV: E=Sophos;i="4.68,503,1312156800"; 
   d="scan'208";a="8280042"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 18:40:35 +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, 7 Oct 2011
	19:40:35 +0100
Subject: Re: [Xen-devel] [PATCH 5/7] libxl_qmp, Return the callback return
	code in qmp_next.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <CAJJyHjJikSYbsOZJY9EQ+pTgnTrswmDVRo58Pb5Zp4hz2s+nuw@mail.gmail.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-6-git-send-email-anthony.perard@citrix.com>
	<1317990988.21903.339.camel@zakaz.uk.xensource.com>
	<CAJJyHjJikSYbsOZJY9EQ+pTgnTrswmDVRo58Pb5Zp4hz2s+nuw@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 7 Oct 2011 19:40:34 +0100
Message-ID: <1318012834.13747.10.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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 16:23 +0100, Anthony PERARD wrote:
> >> @@ -416,7 +418,7 @@ static int qmp_next(libxl__gc *gc,
> libxl__qmp_handler *qmp)
> >>                  s = end + 2;
> >>
> >>                  if (o) {
> >> -                    qmp_handle_response(qmp, o);
> >> +                    rc = qmp_handle_response(qmp, o);
> >
> > If rc now indicates error do we need to bail straight away or need
> to
> > keep going around this loop? (Or is it certain we will immediately
> fall
> > out of the loop after this?)
> 
> We can not be sure that we will return, because it could be another
> message in the butffer. So I should return if there is a protocol
> error. But I think that I should keep seperate the return code of a
> callback, so only the interested function (qmp_synchronous_send) will
> read it (and return to the caller).

I think this means the caller cannot tell which request or how many
errors have occurred in total.

I think that the callbacks should take a success/error code. If that
particular function is interested in propagating the error then they can
save it in their opaque data pointer to be retrieved by the caller of
the sync_send.

Another alternative could be to add an rc member to callback_id_pair
(making it more of a qmp request handle than an callback/id pair) and
push the allocation/free of that datastructure back up into the caller
of qmp_send (perhaps many callers of sync_send would just use an on
stack variable). Callers could then check the result of a specific
request by looking at that new member.

Ian.


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 12:23:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 12:23:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCG0c-00085o-Up; Fri, 07 Oct 2011 12:23:03 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCFzY-0007s4-4k
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 12:21:57 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318015312!34420802!1
X-Originating-IP: [71.74.56.122]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1268 invoked from network); 7 Oct 2011 19:21:52 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.122) by server-13.tower-174.messagelabs.com with SMTP;
	7 Oct 2011 19:21:52 -0000
X-Authority-Analysis: v=1.1 cv=agqPq5NoKwAPC9P66H7dbYUCjxvmT73as08i4x3aqAA=
	c=1 sm=0 a=gxfjmhR6zbwA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=meVymXHHAAAA:8
	a=KfiAD8111wU19YO4z_cA:9 a=xDXKTUQFG9w3g_tP3PoA:7
	a=PUjeQqilurYA:10 a=jeBq3FmKZ4MA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:48541] helo=[192.168.23.10])
	by hrndva-oedge01.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 58/5F-12608-D415F8E4; Fri, 07 Oct 2011 19:21:52 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jason Baron <jbaron@redhat.com>
Date: Fri, 07 Oct 2011 15:21:49 -0400
In-Reply-To: <20111007185214.GD2978@redhat.com>
References: <4E8CF385.2080804@zytor.com> <4E8DEB19.1050509@goop.org>
	<20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
	<4E8E275F.6010801@goop.org>
	<1318007374.4729.58.camel@gandalf.stny.rr.com>
	<20111007185214.GD2978@redhat.com>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318015311.4729.69.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jan Glauber <jang@linux.vnet.ibm.com>, Michael,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH][RFC] jump_labels/x86: Use either 5 byte or
	2 byte jumps
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 14:52 -0400, Jason Baron wrote:
> On Fri, Oct 07, 2011 at 01:09:32PM -0400, Steven Rostedt wrote:
> > Note, this is just hacked together and needs to be cleaned up. Please do
> > not comment on formatting or other sloppiness of this patch. I know it's
> > sloppy and I left debug statements in. I want the comments to be on the
> > idea of the patch.
> > 
> > I created a new file called scripts/update_jump_label.[ch] based on some
> > of the work of recordmcount.c. This is executed at build time on all
> > object files just like recordmcount is. But it does not add any new
> > sections, it just modifies the code at build time to convert all jump
> > labels into nops.
> > 
> > The idea is in arch/x86/include/asm/jump_label.h to not place a nop, but
> > instead to insert a jmp to the label. Depending on how gcc optimizes the
> > code, the jmp will be either end up being a 2 byte or 5 byte jump.
> > 
> > After an object is compiled, update_jump_label is executed on this file
> > and it reads the ELF relocation table to find the jump label locations
> > and examines what jump was used. It then converts the jump into either a
> > 2 byte or 5 byte nop that is appropriate.
> > 
> > At boot time, the jump labels no longer need to be converted (although
> > we may do so in the future to use better nops depending on the machine
> > that is used). When jump labels are enabled, the code is examined to see
> > if a two byte or 5 byte version was used, and the appropriate update is
> > made.
> > 
> > I just booted this patch and it worked. I was able to enable and disable
> > trace points using jump labels. Benchmarks are welcomed :)
> > 
> > Comments and thoughts?
> > 
> 
> Generally, I really like it, I guess b/c I suggested it :)

Yeah, I saw your suggestion about using jump for the asm. I didn't read
carefully enough if you suggested the build time changes or not. I
thought about recordmcount at that moment, and decided to try it ;)

>  I'll try and
> run some workloads on it - A real simple one, I used recently was putting
> a single jump label in 'getppid()' and then calling it in a loop - I
> wonder if the short nop vs long nop would show up there, as a baseline
> test. (fwiw, the jump label vs. no jump label for this test was anywhere
> b/w 1-5% improvement).
> 
> Anyways, some comments below.  
> 
> > -- Steve
> > 
> > Sloppy-signed-off-by: Steven Rostedt <rostedt@goodmis.org>
> > 
> > diff --git a/Makefile b/Makefile
> > index 31f967c..8368f42 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -245,7 +245,7 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
> >  
> >  HOSTCC       = gcc
> >  HOSTCXX      = g++
> > -HOSTCFLAGS   = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
> > +HOSTCFLAGS   = -Wall -Wmissing-prototypes -Wstrict-prototypes -g -fomit-frame-pointer
> >  HOSTCXXFLAGS = -O2
> >  
> >  # Decide whether to build built-in, modular, or both.
> > @@ -611,6 +611,13 @@ ifdef CONFIG_DYNAMIC_FTRACE
> >  endif
> >  endif
> >  
> > +ifdef CONFIG_JUMP_LABEL
> > +	ifdef CONFIG_HAVE_BUILD_TIME_JUMP_LABEL
> > +		BUILD_UPDATE_JUMP_LABEL := y
> > +		export BUILD_UPDATE_JUMP_LABEL
> > +	endif
> > +endif
> > +
> >  # We trigger additional mismatches with less inlining
> >  ifdef CONFIG_DEBUG_SECTION_MISMATCH
> >  KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
> > diff --git a/arch/Kconfig b/arch/Kconfig
> > index 4b0669c..8fa6934 100644
> > --- a/arch/Kconfig
> > +++ b/arch/Kconfig
> > @@ -169,6 +169,12 @@ config HAVE_PERF_EVENTS_NMI
> >  	  subsystem.  Also has support for calculating CPU cycle events
> >  	  to determine how many clock cycles in a given period.
> >  
> > +config HAVE_BUILD_TIME_JUMP_LABEL
> > +       bool
> > +       help
> > +	If an arch uses scripts/update_jump_label to patch in jump nops
> > +	at build time, then it must enable this option.
> > +
> >  config HAVE_ARCH_JUMP_LABEL
> >  	bool
> >  
> > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> > index 6a47bb2..6de726a 100644
> > --- a/arch/x86/Kconfig
> > +++ b/arch/x86/Kconfig
> > @@ -61,6 +61,7 @@ config X86
> >  	select HAVE_ARCH_KMEMCHECK
> >  	select HAVE_USER_RETURN_NOTIFIER
> >  	select HAVE_ARCH_JUMP_LABEL
> > +	select HAVE_BUILD_TIME_JUMP_LABEL
> >  	select HAVE_TEXT_POKE_SMP
> >  	select HAVE_GENERIC_HARDIRQS
> >  	select HAVE_SPARSE_IRQ
> > diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
> > index a32b18c..872b3e1 100644
> > --- a/arch/x86/include/asm/jump_label.h
> > +++ b/arch/x86/include/asm/jump_label.h
> > @@ -14,7 +14,7 @@
> >  static __always_inline bool arch_static_branch(struct jump_label_key *key)
> >  {
> >  	asm goto("1:"
> > -		JUMP_LABEL_INITIAL_NOP
> > +		"jmp %l[l_yes]\n"
> >  		".pushsection __jump_table,  \"aw\" \n\t"
> >  		_ASM_ALIGN "\n\t"
> >  		_ASM_PTR "1b, %l[l_yes], %c0 \n\t"
> > diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
> > index 3fee346..1f7f88f 100644
> > --- a/arch/x86/kernel/jump_label.c
> > +++ b/arch/x86/kernel/jump_label.c
> > @@ -16,34 +16,75 @@
> >  
> >  #ifdef HAVE_JUMP_LABEL
> >  
> > +static unsigned char nop_short[] = { P6_NOP2 };
> > +
> >  union jump_code_union {
> >  	char code[JUMP_LABEL_NOP_SIZE];
> >  	struct {
> >  		char jump;
> >  		int offset;
> >  	} __attribute__((packed));
> > +	struct {
> > +		char jump_short;
> > +		char offset_short;
> > +	} __attribute__((packed));
> >  };
> >  
> >  void arch_jump_label_transform(struct jump_entry *entry,
> >  			       enum jump_label_type type)
> >  {
> >  	union jump_code_union code;
> > +	unsigned char op;
> > +	unsigned size;
> > +	unsigned char nop;
> > +
> > +	/* Use probe_kernel_read()? */
> > +	op = *(unsigned char *)entry->code;
> > +	nop = ideal_nops[NOP_ATOMIC5][0];
> >  
> >  	if (type == JUMP_LABEL_ENABLE) {
> > -		code.jump = 0xe9;
> > -		code.offset = entry->target -
> > -				(entry->code + JUMP_LABEL_NOP_SIZE);
> > -	} else
> > -		memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE);
> > +		if (op == 0xe9 || op == 0xeb)
> > +			/* Already enabled. Warn? */
> > +			return;
> > +
> 
> Using the jump_label_inc/dec interface this shouldn't happen, I would
> have it be BUG
> 
> 
> > +		/* FIXME for all archs */
> > +		if (op == nop_short[0]) {
> > +			size = 2;
> > +			code.jump_short = 0xeb;
> > +			code.offset = entry->target -
> > +				(entry->code + 2);
> > +			/* Check for overflow ? */
> > +		} else if (op == nop) {
> > +			size = JUMP_LABEL_NOP_SIZE;
> > +			code.jump = 0xe9;
> > +			code.offset = entry->target - (entry->code + size);
> > +		} else
> > +			return; /* WARN ? */
> 
> same here, at least WARN, more likely BUG()

I just don't like using BUG(). BUG() means that if we continue we will
corrupt the filesystem or make you go blind. WARN and returning here
should not cause any harm and will even let those with X terminals see
oops in /var/log/messages.

> 
> > +
> > +	} else {
> > +		if (op == nop_short[0] || nop)
> > +			/* Already disabled, warn? */
> > +			return;
> > +
> 
> same here.
> 
> > +		if (op == 0xe9) {
> > +			size = JUMP_LABEL_NOP_SIZE;
> > +			memcpy(&code, ideal_nops[NOP_ATOMIC5], size);
> > +		} else if (op == 0xeb) {
> > +			size = 2;
> > +			memcpy(&code, nop_short, size);
> > +		} else
> > +			return; /* WARN ? */
> 
> same here

WARN is better.

> 
> > +	}
> >  	get_online_cpus();
> >  	mutex_lock(&text_mutex);
> > -	text_poke_smp((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
> > +	text_poke_smp((void *)entry->code, &code, size);
> >  	mutex_unlock(&text_mutex);
> >  	put_online_cpus();
> >  }
> >  
> >  void arch_jump_label_text_poke_early(jump_label_t addr)
> >  {
> > +	return;
> >  	text_poke_early((void *)addr, ideal_nops[NOP_ATOMIC5],
> >  			JUMP_LABEL_NOP_SIZE);
> >  }
> 
> hmmm...we spent a bunch of time selecting the 'ideal' run-time noops I
> wouldn't want to drop that work.

Read my change log again :)


> 
> > diff --git a/scripts/Makefile b/scripts/Makefile
> > index df7678f..738b65c 100644
> > --- a/scripts/Makefile
> > +++ b/scripts/Makefile
> > @@ -13,6 +13,7 @@ hostprogs-$(CONFIG_LOGO)         += pnmtologo
> >  hostprogs-$(CONFIG_VT)           += conmakehash
> >  hostprogs-$(CONFIG_IKCONFIG)     += bin2c
> >  hostprogs-$(BUILD_C_RECORDMCOUNT) += recordmcount
> > +hostprogs-$(BUILD_UPDATE_JUMP_LABEL) += update_jump_label
> >  
> >  always		:= $(hostprogs-y) $(hostprogs-m)
> >  
> > diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> > index a0fd502..bc0d89b 100644
> > --- a/scripts/Makefile.build
> > +++ b/scripts/Makefile.build
> > @@ -258,6 +258,15 @@ cmd_modversions =								\
> >  	fi;
> >  endif
> >  
> > +ifdef BUILD_UPDATE_JUMP_LABEL
> > +update_jump_label_source := $(srctree)/scripts/update_jump_label.c \
> > +			$(srctree)/scripts/update_jump_label.h
> > +cmd_update_jump_label =						\
> > +	if [ $(@) != "scripts/mod/empty.o" ]; then		\
> > +		$(objtree)/scripts/update_jump_label "$(@)";	\
> > +	fi;
> > +endif
> > +
> >  ifdef CONFIG_FTRACE_MCOUNT_RECORD
> >  ifdef BUILD_C_RECORDMCOUNT
> >  ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
> > @@ -294,6 +303,7 @@ define rule_cc_o_c
> >  	$(cmd_modversions)						  \
> >  	$(call echo-cmd,record_mcount)					  \
> >  	$(cmd_record_mcount)						  \
> > +	$(cmd_update_jump_label)					  \
> >  	scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    \
> >  	                                              $(dot-target).tmp;  \
> >  	rm -f $(depfile);						  \
> > @@ -301,13 +311,14 @@ define rule_cc_o_c
> >  endef
> >  
> >  # Built-in and composite module parts
> > -$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
> > +$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(update_jump_label_source) FORCE
> >  	$(call cmd,force_checksrc)
> >  	$(call if_changed_rule,cc_o_c)
> >  
> >  # Single-part modules are special since we need to mark them in $(MODVERDIR)
> >  
> > -$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
> > +$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) \
> > +		  $(update_jump_label_source) FORCE
> >  	$(call cmd,force_checksrc)
> >  	$(call if_changed_rule,cc_o_c)
> >  	@{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
> > diff --git a/scripts/update_jump_label.c b/scripts/update_jump_label.c
> > new file mode 100644
> > index 0000000..86e17bc

> > +	/*
> > +	 * This is specific to x86. The jump_table is stored in three
> > +	 * long words. The first is the location of the jmp target we
> > +	 * must update.
> > +	 */
> > +	cnt = size / sizeof(uint_t);
> > +
> > +	for (i = 0; i < cnt; i += 3)
> > +		if (0)make_nop((void *)ehdr, *(uint_t *)(data + i * sizeof(uint_t)));
> > +
> 
> hmmmm, isn't this the line that actually writes in the no-ops? why isn't
> it disabled?


*DOH!*

Oh crap! I added that to dump more debug info. Let me make sure it
actually works ;)


> 
> > +	free(data);
> > +}
> > 
> > 
> 
> Thanks again for doing this...I was still understanding recordmcount.c ;)

And after this, I plan on giving recordmcount.c an overhaul so it is
easier to read. Right now it is written with lots of
micro-optimizations, with the sacrifice to simplicity. Modifying this
code is nasty, and it needs to be read by mere mortals.

I'll go and test with actual modifications and see if it still works.

-- Steve



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 12:33:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 12:33:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCGB7-0000IG-9Z; Fri, 07 Oct 2011 12:33:53 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCGAS-0008VJ-8s
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 12:33:12 -0700
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1318015964!39005559!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28147 invoked from network); 7 Oct 2011 19:32:45 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-10.tower-27.messagelabs.com with SMTP;
	7 Oct 2011 19:32:45 -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 p97JX7LS016495
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <xen-devel@lists.xensource.com>; Fri, 7 Oct 2011 15:33:07 -0400
Received: from lacos-laptop.redhat.com (vpn1-4-43.ams2.redhat.com [10.36.4.43])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p97JX6w0007631; Fri, 7 Oct 2011 15:33:06 -0400
From: Laszlo Ersek <lersek@redhat.com>
To: xen-devel@lists.xensource.com, lersek@redhat.com
Date: Fri,  7 Oct 2011 21:34:38 +0200
Message-Id: <1318016078-7110-1-git-send-email-lersek@redhat.com>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
Cc: 
Subject: [Xen-devel] [PATCH] xen-blkfront: plug device number leak in
	xlblk_init() error 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

... though after a failed xenbus_register_frontend() all may be lost.

Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---
 drivers/block/xen-blkfront.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 9ea8c25..a5a9b1b 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -1385,6 +1385,8 @@ static struct xenbus_driver blkfront = {
 
 static int __init xlblk_init(void)
 {
+	int ret;
+
 	if (!xen_domain())
 		return -ENODEV;
 
@@ -1394,7 +1396,13 @@ static int __init xlblk_init(void)
 		return -ENODEV;
 	}
 
-	return xenbus_register_frontend(&blkfront);
+	ret = xenbus_register_frontend(&blkfront);
+	if (ret) {
+		unregister_blkdev(XENVBD_MAJOR, DEV_NAME);
+		return ret;
+	}
+
+	return 0;
 }
 module_init(xlblk_init);
 
-- 
1.7.4.4


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 12:34:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 12:34:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCGC6-0000gN-ES; Fri, 07 Oct 2011 12:34:54 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCGAV-0008VK-29
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 12:33:15 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318015991!31863!1
X-Originating-IP: [71.74.56.122]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14938 invoked from network); 7 Oct 2011 19:33:11 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.122) by server-2.tower-216.messagelabs.com with SMTP;
	7 Oct 2011 19:33:11 -0000
X-Authority-Analysis: v=1.1 cv=agqPq5NoKwAPC9P66H7dbYUCjxvmT73as08i4x3aqAA=
	c=1 sm=0 a=gxfjmhR6zbwA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=tBYeR_1S0UNBOaloq88A:9
	a=PUjeQqilurYA:10 a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:48593] helo=[192.168.23.10])
	by hrndva-oedge01.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 62/79-12608-4F35F8E4; Fri, 07 Oct 2011 19:33:09 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jason Baron <jbaron@redhat.com>
Date: Fri, 07 Oct 2011 15:33:08 -0400
References: <4E8CF385.2080804@zytor.com> <4E8DEB19.1050509@goop.org>
	<20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
	<4E8E275F.6010801@goop.org>
	<1318007374.4729.58.camel@gandalf.stny.rr.com>
	<20111007185214.GD2978@redhat.com>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318015989.4729.72.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jan Glauber <jang@linux.vnet.ibm.com>, Michael,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH][RFC] jump_labels/x86: Use either 5 byte or
	2 byte jumps
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 15:21 -0400, Steven Rostedt wrote:

> > > +	/*
> > > +	 * This is specific to x86. The jump_table is stored in three
> > > +	 * long words. The first is the location of the jmp target we
> > > +	 * must update.
> > > +	 */
> > > +	cnt = size / sizeof(uint_t);
> > > +
> > > +	for (i = 0; i < cnt; i += 3)
> > > +		if (0)make_nop((void *)ehdr, *(uint_t *)(data + i * sizeof(uint_t)));

I just compiled and booted the 

-		if (0)make_nop((void *)ehdr, *(uint_t *)(data + i * sizeof(uint_t)));
+		make_nop((void *)ehdr, *(uint_t *)(data + i * sizeof(uint_t)));

version, and it still works.

Phew!

-- Steve



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 12:41:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 12:41:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCGIP-0001QP-2n; Fri, 07 Oct 2011 12:41:25 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCGHp-00018o-F7
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 12:40:51 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318016444!34428616!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4144 invoked from network); 7 Oct 2011 19:40:45 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-4.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2011 19:40:45 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:e44b:35ff:fee8:2394])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 2AAC5910C;
	Fri,  7 Oct 2011 12:40:43 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id E14BD2025E;
	Fri,  7 Oct 2011 12:40:39 -0700 (PDT)
Message-ID: <4E8F55B7.9010409@goop.org>
Date: Fri, 07 Oct 2011 12:40:39 -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: Steven Rostedt <rostedt@goodmis.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
	<4E8E275F.6010801@goop.org>
	<1318007374.4729.58.camel@gandalf.stny.rr.com>
In-Reply-To: <1318007374.4729.58.camel@gandalf.stny.rr.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH][RFC] jump_labels/x86: Use either 5 byte or
	2 byte jumps
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/07/2011 10:09 AM, Steven Rostedt wrote:
> diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
> index 3fee346..1f7f88f 100644
> --- a/arch/x86/kernel/jump_label.c
> +++ b/arch/x86/kernel/jump_label.c
> @@ -16,34 +16,75 @@
>  
>  #ifdef HAVE_JUMP_LABEL
>  
> +static unsigned char nop_short[] = { P6_NOP2 };
> +
>  union jump_code_union {
>  	char code[JUMP_LABEL_NOP_SIZE];
>  	struct {
>  		char jump;
>  		int offset;
>  	} __attribute__((packed));
> +	struct {
> +		char jump_short;
> +		char offset_short;
> +	} __attribute__((packed));
>  };
>  
>  void arch_jump_label_transform(struct jump_entry *entry,
>  			       enum jump_label_type type)
>  {
>  	union jump_code_union code;
> +	unsigned char op;
> +	unsigned size;
> +	unsigned char nop;
> +
> +	/* Use probe_kernel_read()? */
> +	op = *(unsigned char *)entry->code;
> +	nop = ideal_nops[NOP_ATOMIC5][0];
>  
>  	if (type == JUMP_LABEL_ENABLE) {
> -		code.jump = 0xe9;
> -		code.offset = entry->target -
> -				(entry->code + JUMP_LABEL_NOP_SIZE);
> -	} else
> -		memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE);
> +		if (op == 0xe9 || op == 0xeb)
> +			/* Already enabled. Warn? */
> +			return;
> +
> +		/* FIXME for all archs */

By "archs", do you mean different x86 variants?

> +		if (op == nop_short[0]) {

My gut feeling is that all this "trying to determine the jump size by
sniffing the instruction" stuff seems pretty fragile.  Couldn't you
store the jump size in the jump_label structure (even as a bit hidden
away somewhere)?

    J

> +			size = 2;
> +			code.jump_short = 0xeb;
> +			code.offset = entry->target -
> +				(entry->code + 2);
> +			/* Check for overflow ? */
> +		} else if (op == nop) {
> +			size = JUMP_LABEL_NOP_SIZE;
> +			code.jump = 0xe9;
> +			code.offset = entry->target - (entry->code + size);
> +		} else
> +			return; /* WARN ? */
> +
> +	} else {
> +		if (op == nop_short[0] || nop)
> +			/* Already disabled, warn? */
> +			return;
> +
> +		if (op == 0xe9) {
> +			size = JUMP_LABEL_NOP_SIZE;
> +			memcpy(&code, ideal_nops[NOP_ATOMIC5], size);
> +		} else if (op == 0xeb) {
> +			size = 2;
> +			memcpy(&code, nop_short, size);
> +		} else
> +			return; /* WARN ? */
> +	}
>  	get_online_cpus();
>  	mutex_lock(&text_mutex);
> -	text_poke_smp((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
> +	text_poke_smp((void *)entry->code, &code, size);
>  	mutex_unlock(&text_mutex);
>  	put_online_cpus();
>  }
>  
>  void arch_jump_label_text_poke_early(jump_label_t addr)
>  {
> +	return;
>  	text_poke_early((void *)addr, ideal_nops[NOP_ATOMIC5],
>  			JUMP_LABEL_NOP_SIZE);
>  }
> diff --git a/scripts/Makefile b/scripts/Makefile
> index df7678f..738b65c 100644
> --- a/scripts/Makefile
> +++ b/scripts/Makefile
> @@ -13,6 +13,7 @@ hostprogs-$(CONFIG_LOGO)         += pnmtologo
>  hostprogs-$(CONFIG_VT)           += conmakehash
>  hostprogs-$(CONFIG_IKCONFIG)     += bin2c
>  hostprogs-$(BUILD_C_RECORDMCOUNT) += recordmcount
> +hostprogs-$(BUILD_UPDATE_JUMP_LABEL) += update_jump_label
>  
>  always		:= $(hostprogs-y) $(hostprogs-m)
>  
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index a0fd502..bc0d89b 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -258,6 +258,15 @@ cmd_modversions =								\
>  	fi;
>  endif
>  
> +ifdef BUILD_UPDATE_JUMP_LABEL
> +update_jump_label_source := $(srctree)/scripts/update_jump_label.c \
> +			$(srctree)/scripts/update_jump_label.h
> +cmd_update_jump_label =						\
> +	if [ $(@) != "scripts/mod/empty.o" ]; then		\
> +		$(objtree)/scripts/update_jump_label "$(@)";	\
> +	fi;
> +endif
> +
>  ifdef CONFIG_FTRACE_MCOUNT_RECORD
>  ifdef BUILD_C_RECORDMCOUNT
>  ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
> @@ -294,6 +303,7 @@ define rule_cc_o_c
>  	$(cmd_modversions)						  \
>  	$(call echo-cmd,record_mcount)					  \
>  	$(cmd_record_mcount)						  \
> +	$(cmd_update_jump_label)					  \
>  	scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    \
>  	                                              $(dot-target).tmp;  \
>  	rm -f $(depfile);						  \
> @@ -301,13 +311,14 @@ define rule_cc_o_c
>  endef
>  
>  # Built-in and composite module parts
> -$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
> +$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(update_jump_label_source) FORCE
>  	$(call cmd,force_checksrc)
>  	$(call if_changed_rule,cc_o_c)
>  
>  # Single-part modules are special since we need to mark them in $(MODVERDIR)
>  
> -$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
> +$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) \
> +		  $(update_jump_label_source) FORCE
>  	$(call cmd,force_checksrc)
>  	$(call if_changed_rule,cc_o_c)
>  	@{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
> diff --git a/scripts/update_jump_label.c b/scripts/update_jump_label.c
> new file mode 100644
> index 0000000..86e17bc
> --- /dev/null
> +++ b/scripts/update_jump_label.c
> @@ -0,0 +1,349 @@
> +/*
> + * update_jump_label.c: replace jmps with nops at compile time.
> + * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
> + *  Parsing of the elf file was influenced by recordmcount.c
> + *  originally written by and copyright to John F. Reiser <jreiser@BitWagon.com>.
> + */
> +
> +/*
> + * Note, this code is originally designed for x86, but may be used by
> + * other archs to do the nop updates at compile time instead of at boot time.
> + * X86 uses this as an optimization, as jmps can be either 2 bytes or 5 bytes.
> + * Inserting a 2 byte where possible helps with both CPU performance and
> + * icache strain.
> + */
> +#include <sys/types.h>
> +#include <sys/mman.h>
> +#include <sys/stat.h>
> +#include <getopt.h>
> +#include <elf.h>
> +#include <fcntl.h>
> +#include <setjmp.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <stdarg.h>
> +#include <string.h>
> +#include <unistd.h>
> +
> +static int fd_map;	/* File descriptor for file being modified. */
> +static struct stat sb;	/* Remember .st_size, etc. */
> +static int mmap_failed; /* Boolean flag. */
> +
> +static void die(const char *err, const char *fmt, ...)
> +{
> +	va_list ap;
> +
> +	if (err)
> +		perror(err);
> +
> +	if (fmt) {
> +		va_start(ap, fmt);
> +		fprintf(stderr, "Fatal error:  ");
> +		vfprintf(stderr, fmt, ap);
> +		fprintf(stderr, "\n");
> +		va_end(ap);
> +	}
> +
> +	exit(1);
> +}
> +
> +static void usage(char **argv)
> +{
> +	char *arg = argv[0];
> +	char *p = arg+strlen(arg);
> +
> +	while (p >= arg && *p != '/')
> +		p--;
> +	p++;
> +
> +	printf("usage: %s file\n"
> +	       "\n",p);
> +	exit(-1);
> +}
> +
> +/* w8rev, w8nat, ...: Handle endianness. */
> +
> +static uint64_t w8rev(uint64_t const x)
> +{
> +	return   ((0xff & (x >> (0 * 8))) << (7 * 8))
> +	       | ((0xff & (x >> (1 * 8))) << (6 * 8))
> +	       | ((0xff & (x >> (2 * 8))) << (5 * 8))
> +	       | ((0xff & (x >> (3 * 8))) << (4 * 8))
> +	       | ((0xff & (x >> (4 * 8))) << (3 * 8))
> +	       | ((0xff & (x >> (5 * 8))) << (2 * 8))
> +	       | ((0xff & (x >> (6 * 8))) << (1 * 8))
> +	       | ((0xff & (x >> (7 * 8))) << (0 * 8));
> +}
> +
> +static uint32_t w4rev(uint32_t const x)
> +{
> +	return   ((0xff & (x >> (0 * 8))) << (3 * 8))
> +	       | ((0xff & (x >> (1 * 8))) << (2 * 8))
> +	       | ((0xff & (x >> (2 * 8))) << (1 * 8))
> +	       | ((0xff & (x >> (3 * 8))) << (0 * 8));
> +}
> +
> +static uint32_t w2rev(uint16_t const x)
> +{
> +	return   ((0xff & (x >> (0 * 8))) << (1 * 8))
> +	       | ((0xff & (x >> (1 * 8))) << (0 * 8));
> +}
> +
> +static uint64_t w8nat(uint64_t const x)
> +{
> +	return x;
> +}
> +
> +static uint32_t w4nat(uint32_t const x)
> +{
> +	return x;
> +}
> +
> +static uint32_t w2nat(uint16_t const x)
> +{
> +	return x;
> +}
> +
> +static uint64_t (*w8)(uint64_t);
> +static uint32_t (*w)(uint32_t);
> +static uint32_t (*w2)(uint16_t);
> +
> +/* ulseek, uread, ...:  Check return value for errors. */
> +
> +static off_t
> +ulseek(int const fd, off_t const offset, int const whence)
> +{
> +	off_t const w = lseek(fd, offset, whence);
> +	if (w == (off_t)-1)
> +		die("lseek", NULL);
> +
> +	return w;
> +}
> +
> +static size_t
> +uread(int const fd, void *const buf, size_t const count)
> +{
> +	size_t const n = read(fd, buf, count);
> +	if (n != count)
> +		die("read", NULL);
> +
> +	return n;
> +}
> +
> +static size_t
> +uwrite(int const fd, void const *const buf, size_t const count)
> +{
> +	size_t const n = write(fd, buf, count);
> +	if (n != count)
> +		die("write", NULL);
> +
> +	return n;
> +}
> +
> +static void *
> +umalloc(size_t size)
> +{
> +	void *const addr = malloc(size);
> +	if (addr == 0)
> +		die("malloc", "malloc failed: %zu bytes\n", size);
> +
> +	return addr;
> +}
> +
> +/*
> + * Get the whole file as a programming convenience in order to avoid
> + * malloc+lseek+read+free of many pieces.  If successful, then mmap
> + * avoids copying unused pieces; else just read the whole file.
> + * Open for both read and write; new info will be appended to the file.
> + * Use MAP_PRIVATE so that a few changes to the in-memory ElfXX_Ehdr
> + * do not propagate to the file until an explicit overwrite at the last.
> + * This preserves most aspects of consistency (all except .st_size)
> + * for simultaneous readers of the file while we are appending to it.
> + * However, multiple writers still are bad.  We choose not to use
> + * locking because it is expensive and the use case of kernel build
> + * makes multiple writers unlikely.
> + */
> +static void *mmap_file(char const *fname)
> +{
> +	void *addr;
> +
> +	fd_map = open(fname, O_RDWR);
> +	if (fd_map < 0 || fstat(fd_map, &sb) < 0)
> +		die(fname, "failed to open file");
> +
> +	if (!S_ISREG(sb.st_mode))
> +		die(NULL, "not a regular file: %s\n", fname);
> +
> +	addr = mmap(0, sb.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE,
> +		    fd_map, 0);
> +
> +	mmap_failed = 0;
> +	if (addr == MAP_FAILED) {
> +		mmap_failed = 1;
> +		addr = umalloc(sb.st_size);
> +		uread(fd_map, addr, sb.st_size);
> +	}
> +	return addr;
> +}
> +
> +static void munmap_file(void *addr)
> +{
> +	if (!mmap_failed)
> +		munmap(addr, sb.st_size);
> +	else
> +		free(addr);
> +	close(fd_map);
> +}
> +
> +static unsigned char ideal_nop5_x86_64[5] = { 0x0f, 0x1f, 0x44, 0x00, 0x00 };
> +static unsigned char ideal_nop5_x86_32[5] = { 0x3e, 0x8d, 0x74, 0x26, 0x00 };
> +static unsigned char ideal_nop2_x86[2] = { 0x66, 0x99 };
> +static unsigned char *ideal_nop;
> +
> +static int (*make_nop)(void *map, size_t const offset);
> +
> +static int make_nop_x86(void *map, size_t const offset)
> +{
> +	unsigned char *op;
> +	unsigned char *nop;
> +	int size;
> +
> +	/* Determine which type of jmp this is 2 byte or 5. */
> +	op = map + offset;
> +	switch (*op) {
> +	case 0xeb: /* 2 byte */
> +		size = 2;
> +		nop = ideal_nop2_x86;
> +		break;
> +	case 0xe9: /* 5 byte */
> +		size = 5;
> +		nop = ideal_nop;
> +		break;
> +	default:
> +		die(NULL, "Bad jump label section\n");
> +	}
> +
> +	/* convert to nop */
> +	ulseek(fd_map, offset, SEEK_SET);
> +	uwrite(fd_map, nop, size);
> +	return 0;
> +}
> +
> +/* 32 bit and 64 bit are very similar */
> +#include "update_jump_label.h"
> +#define UPDATE_JUMP_LABEL_64
> +#include "update_jump_label.h"
> +
> +static int do_file(const char *fname)
> +{
> +	Elf32_Ehdr *const ehdr = mmap_file(fname);
> +	unsigned int reltype = 0;
> +
> +	w = w4nat;
> +	w2 = w2nat;
> +	w8 = w8nat;
> +	switch (ehdr->e_ident[EI_DATA]) {
> +		static unsigned int const endian = 1;
> +	default:
> +		die(NULL, "unrecognized ELF data encoding %d: %s\n",
> +			ehdr->e_ident[EI_DATA], fname);
> +		break;
> +	case ELFDATA2LSB:
> +		if (*(unsigned char const *)&endian != 1) {
> +			/* main() is big endian, file.o is little endian. */
> +			w = w4rev;
> +			w2 = w2rev;
> +			w8 = w8rev;
> +		}
> +		break;
> +	case ELFDATA2MSB:
> +		if (*(unsigned char const *)&endian != 0) {
> +			/* main() is little endian, file.o is big endian. */
> +			w = w4rev;
> +			w2 = w2rev;
> +			w8 = w8rev;
> +		}
> +		break;
> +	}  /* end switch */
> +
> +	if (memcmp(ELFMAG, ehdr->e_ident, SELFMAG) != 0 ||
> +	    w2(ehdr->e_type) != ET_REL ||
> +	    ehdr->e_ident[EI_VERSION] != EV_CURRENT)
> +		die(NULL, "unrecognized ET_REL file %s\n", fname);
> +
> +	switch (w2(ehdr->e_machine)) {
> +	default:
> +		die(NULL, "unrecognized e_machine %d %s\n",
> +		    w2(ehdr->e_machine), fname);
> +		break;
> +	case EM_386:
> +		reltype = R_386_32;
> +		make_nop = make_nop_x86;
> +		ideal_nop = ideal_nop5_x86_32;
> +		break;
> +	case EM_ARM:	 reltype = R_ARM_ABS32;
> +			 break;
> +	case EM_IA_64:	 reltype = R_IA64_IMM64; break;
> +	case EM_MIPS:	 /* reltype: e_class    */ break;
> +	case EM_PPC:	 reltype = R_PPC_ADDR32;   break;
> +	case EM_PPC64:	 reltype = R_PPC64_ADDR64; break;
> +	case EM_S390:    /* reltype: e_class    */ break;
> +	case EM_SH:	 reltype = R_SH_DIR32;                 break;
> +	case EM_SPARCV9: reltype = R_SPARC_64;     break;
> +	case EM_X86_64:
> +		make_nop = make_nop_x86;
> +		ideal_nop = ideal_nop5_x86_64;
> +		reltype = R_X86_64_64;
> +		break;
> +	}  /* end switch */
> +
> +	switch (ehdr->e_ident[EI_CLASS]) {
> +	default:
> +		die(NULL, "unrecognized ELF class %d %s\n",
> +		    ehdr->e_ident[EI_CLASS], fname);
> +		break;
> +	case ELFCLASS32:
> +		if (w2(ehdr->e_ehsize) != sizeof(Elf32_Ehdr)
> +		||  w2(ehdr->e_shentsize) != sizeof(Elf32_Shdr))
> +			die(NULL, "unrecognized ET_REL file: %s\n", fname);
> +
> +		if (w2(ehdr->e_machine) == EM_S390) {
> +			reltype = R_390_32;
> +		}
> +		if (w2(ehdr->e_machine) == EM_MIPS) {
> +			reltype = R_MIPS_32;
> +		}
> +		do_func32(ehdr, fname, reltype);
> +		break;
> +	case ELFCLASS64: {
> +		Elf64_Ehdr *const ghdr = (Elf64_Ehdr *)ehdr;
> +		if (w2(ghdr->e_ehsize) != sizeof(Elf64_Ehdr)
> +		||  w2(ghdr->e_shentsize) != sizeof(Elf64_Shdr))
> +			die(NULL, "unrecognized ET_REL file: %s\n", fname);
> +
> +		if (w2(ghdr->e_machine) == EM_S390)
> +			reltype = R_390_64;
> +
> +#if 0
> +		if (w2(ghdr->e_machine) == EM_MIPS) {
> +			reltype = R_MIPS_64;
> +			Elf64_r_sym = MIPS64_r_sym;
> +		}
> +#endif
> +		do_func64(ghdr, fname, reltype);
> +		break;
> +	}
> +	}  /* end switch */
> +
> +	munmap_file(ehdr);
> +	return 0;
> +}
> +
> +int main (int argc, char **argv)
> +{
> +	if (argc != 2)
> +		usage(argv);
> +	
> +	return do_file(argv[1]);
> +}
> +
> diff --git a/scripts/update_jump_label.h b/scripts/update_jump_label.h
> new file mode 100644
> index 0000000..6ff9846
> --- /dev/null
> +++ b/scripts/update_jump_label.h
> @@ -0,0 +1,322 @@
> +/*
> + * recordmcount.h
> + *
> + * This code was taken out of recordmcount.c written by
> + * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>.  All rights reserved.
> + *
> + * The original code had the same algorithms for both 32bit
> + * and 64bit ELF files, but the code was duplicated to support
> + * the difference in structures that were used. This
> + * file creates a macro of everything that is different between
> + * the 64 and 32 bit code, such that by including this header
> + * twice we can create both sets of functions by including this
> + * header once with RECORD_MCOUNT_64 undefined, and again with
> + * it defined.
> + *
> + * This conversion to macros was done by:
> + * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
> + *
> + * Licensed under the GNU General Public License, version 2 (GPLv2).
> + */
> +
> +#undef EBITS
> +#undef _w
> +#undef _align
> +#undef _size
> +
> +#ifdef UPDATE_JUMP_LABEL_64
> +# define EBITS			64
> +# define _w			w8
> +# define _align			7u
> +# define _size			8
> +#else
> +# define EBITS			32
> +# define _w			w
> +# define _align			3u
> +# define _size			4
> +#endif
> +
> +#define _FBITS(x, e)	x##e
> +#define FBITS(x, e)	_FBITS(x,e)
> +#define FUNC(x)		FBITS(x,EBITS)
> +
> +#undef Elf_Addr
> +#undef Elf_Ehdr
> +#undef Elf_Shdr
> +#undef Elf_Rel
> +#undef Elf_Rela
> +#undef Elf_Sym
> +#undef ELF_R_SYM
> +#undef ELF_R_TYPE
> +
> +#define __ATTACH(x,y,z)	x##y##z
> +#define ATTACH(x,y,z)	__ATTACH(x,y,z)
> +
> +#define Elf_Addr	ATTACH(Elf,EBITS,_Addr)
> +#define Elf_Ehdr	ATTACH(Elf,EBITS,_Ehdr)
> +#define Elf_Shdr	ATTACH(Elf,EBITS,_Shdr)
> +#define Elf_Rel		ATTACH(Elf,EBITS,_Rel)
> +#define Elf_Rela	ATTACH(Elf,EBITS,_Rela)
> +#define Elf_Sym		ATTACH(Elf,EBITS,_Sym)
> +#define uint_t		ATTACH(uint,EBITS,_t)
> +#define ELF_R_SYM	ATTACH(ELF,EBITS,_R_SYM)
> +#define ELF_R_TYPE	ATTACH(ELF,EBITS,_R_TYPE)
> +
> +#undef get_shdr
> +#define get_shdr(ehdr) ((Elf_Shdr *)(_w((ehdr)->e_shoff) + (void *)(ehdr)))
> +
> +#undef get_section_loc
> +#define get_section_loc(ehdr, shdr)(_w((shdr)->sh_offset) + (void *)(ehdr))
> +
> +/* Functions and pointers that do_file() may override for specific e_machine. */
> +
> +#if 0
> +static uint_t FUNC(fn_ELF_R_SYM)(Elf_Rel const *rp)
> +{
> +	return ELF_R_SYM(_w(rp->r_info));
> +}
> +static uint_t (*FUNC(Elf_r_sym))(Elf_Rel const *rp) = FUNC(fn_ELF_R_SYM);
> +#endif
> +
> +static void FUNC(get_sym_str_and_relp)(Elf_Shdr const *const relhdr,
> +				 Elf_Ehdr const *const ehdr,
> +				 Elf_Sym const **sym0,
> +				 char const **str0,
> +				 Elf_Rel const **relp)
> +{
> +	Elf_Shdr *const shdr0 = get_shdr(ehdr);
> +	unsigned const symsec_sh_link = w(relhdr->sh_link);
> +	Elf_Shdr const *const symsec = &shdr0[symsec_sh_link];
> +	Elf_Shdr const *const strsec = &shdr0[w(symsec->sh_link)];
> +	Elf_Rel const *const rel0 =
> +		(Elf_Rel const *)get_section_loc(ehdr, relhdr);
> +
> +	*sym0 = (Elf_Sym const *)get_section_loc(ehdr, symsec);
> +
> +	*str0 = (char const *)get_section_loc(ehdr, strsec);
> +
> +	*relp = rel0;
> +}
> +
> +/*
> + * Read the relocation table again, but this time its called on sections
> + * that are not going to be traced. The mcount calls here will be converted
> + * into nops.
> + */
> +static void FUNC(nop_jump_label)(Elf_Shdr const *const relhdr,
> +		       Elf_Ehdr const *const ehdr,
> +		       const char *const txtname)
> +{
> +	Elf_Shdr *const shdr0 = get_shdr(ehdr);
> +	Elf_Sym const *sym0;
> +	char const *str0;
> +	Elf_Rel const *relp;
> +	Elf_Rela const *relap;
> +	Elf_Shdr const *const shdr = &shdr0[w(relhdr->sh_info)];
> +	unsigned rel_entsize = w(relhdr->sh_entsize);
> +	unsigned const nrel = _w(relhdr->sh_size) / rel_entsize;
> +	int t;
> +
> +	FUNC(get_sym_str_and_relp)(relhdr, ehdr, &sym0, &str0, &relp);
> +
> +	for (t = nrel; t > 0; t -= 3) {
> +		int ret = -1;
> +
> +		relap = (Elf_Rela const *)relp;
> +		printf("rel offset=%lx info=%lx sym=%lx type=%lx addend=%lx\n",
> +		       (long)relap->r_offset, (long)relap->r_info,
> +		       (long)ELF_R_SYM(relap->r_info),
> +		       (long)ELF_R_TYPE(relap->r_info),
> +		       (long)relap->r_addend);
> +
> +		if (0 && make_nop)
> +			ret = make_nop((void *)ehdr, shdr->sh_offset + relp->r_offset);
> +
> +		/* jump label sections are paired in threes */
> +		relp = (Elf_Rel const *)(rel_entsize * 3 + (void *)relp);
> +	}
> +}
> +
> +/* Evade ISO C restriction: no declaration after statement in has_rel_mcount. */
> +static char const *
> +FUNC(__has_rel_jump_table)(Elf_Shdr const *const relhdr,  /* is SHT_REL or SHT_RELA */
> +		 Elf_Shdr const *const shdr0,
> +		 char const *const shstrtab,
> +		 char const *const fname)
> +{
> +	/* .sh_info depends on .sh_type == SHT_REL[,A] */
> +	Elf_Shdr const *const txthdr = &shdr0[w(relhdr->sh_info)];
> +	char const *const txtname = &shstrtab[w(txthdr->sh_name)];
> +
> +	if (strcmp("__jump_table", txtname) == 0) {
> +		fprintf(stderr, "warning: __mcount_loc already exists: %s\n",
> +			fname);
> +//		succeed_file();
> +	}
> +	if (w(txthdr->sh_type) != SHT_PROGBITS ||
> +	    !(w(txthdr->sh_flags) & SHF_EXECINSTR))
> +		return NULL;
> +	return txtname;
> +}
> +
> +static char const *FUNC(has_rel_jump_table)(Elf_Shdr const *const relhdr,
> +				      Elf_Shdr const *const shdr0,
> +				      char const *const shstrtab,
> +				      char const *const fname)
> +{
> +	if (w(relhdr->sh_type) != SHT_REL && w(relhdr->sh_type) != SHT_RELA)
> +		return NULL;
> +	return FUNC(__has_rel_jump_table)(relhdr, shdr0, shstrtab, fname);
> +}
> +
> +/* Find relocation section hdr for a given section */
> +static const Elf_Shdr *
> +FUNC(find_relhdr)(const Elf_Ehdr *ehdr, const Elf_Shdr *shdr)
> +{
> +	const Elf_Shdr *shdr0 = get_shdr(ehdr);
> +	int nhdr = w2(ehdr->e_shnum);
> +	const Elf_Shdr *hdr;
> +	int i;
> +
> +	for (hdr = shdr0, i = 0; i < nhdr; hdr = &shdr0[++i]) {
> +		if (w(hdr->sh_type) != SHT_REL &&
> +		    w(hdr->sh_type) != SHT_RELA)
> +			continue;
> +
> +		/*
> +		 * The relocation section's info field holds
> +		 * the section index that it represents.
> +		 */
> +		if (shdr == &shdr0[w(hdr->sh_info)])
> +			return hdr;
> +	}
> +	return NULL;
> +}
> +
> +/* Find a section headr based on name and type */
> +static const Elf_Shdr *
> +FUNC(find_shdr)(const Elf_Ehdr *ehdr, const char *name, uint_t type)
> +{
> +	const Elf_Shdr *shdr0 = get_shdr(ehdr);
> +	const Elf_Shdr *shstr = &shdr0[w2(ehdr->e_shstrndx)];
> +	const char *shstrtab = (char *)get_section_loc(ehdr, shstr);
> +	int nhdr = w2(ehdr->e_shnum);
> +	const Elf_Shdr *hdr;
> +	const char *hdrname;
> +	int i;
> +
> +	for (hdr = shdr0, i = 0; i < nhdr; hdr = &shdr0[++i]) {
> +		if (w(hdr->sh_type) != type)
> +			continue;
> +
> +		/* If we are just looking for a section by type (ie. SYMTAB) */
> +		if (!name)
> +			return hdr;
> +
> +		hdrname = &shstrtab[w(hdr->sh_name)];
> +		if (strcmp(hdrname, name) == 0)
> +			return hdr;
> +	}
> +	return NULL;
> +}
> +
> +static void
> +FUNC(section_update)(const Elf_Ehdr *ehdr, const Elf_Shdr *symhdr,
> +		     unsigned shtype, const Elf_Rel *rel, void *data)
> +{
> +	const Elf_Shdr *shdr0 = get_shdr(ehdr);
> +	const Elf_Shdr *targethdr;
> +	const Elf_Rela *rela;
> +	const Elf_Sym *syment;
> +	uint_t offset = _w(rel->r_offset);
> +	uint_t info = _w(rel->r_info);
> +	uint_t sym = ELF_R_SYM(info);
> +	uint_t type = ELF_R_TYPE(info);
> +	uint_t addend;
> +	uint_t targetloc;
> +
> +	if (shtype == SHT_RELA) {
> +		rela = (const Elf_Rela *)rel;
> +		addend = _w(rela->r_addend);
> +	} else
> +		addend = _w(*(unsigned short *)(data + offset));
> +
> +	syment = (const Elf_Sym *)get_section_loc(ehdr, symhdr);
> +	targethdr = &shdr0[w2(syment[sym].st_shndx)];
> +	targetloc = _w(targethdr->sh_offset);
> +
> +	/* TODO, need a separate function for all archs */
> +	if (type != R_386_32)
> +		die(NULL, "Arch relocation type %d not supported", type);
> +
> +	targetloc += addend;
> +
> +#if 1
> +	printf("offset=%x target=%x shoffset=%x add=%x\n",
> +	       offset, targetloc, _w(targethdr->sh_offset), addend);
> +#endif
> +	*(uint_t *)(data + offset) = targetloc;
> +}
> +
> +/* Overall supervision for Elf32 ET_REL file. */
> +static void
> +FUNC(do_func)(Elf_Ehdr *ehdr, char const *const fname, unsigned const reltype)
> +{
> +	const Elf_Shdr *jlshdr;
> +	const Elf_Shdr *jlrhdr;
> +	const Elf_Shdr *symhdr;
> +	const Elf_Rel *rel;
> +	unsigned size;
> +	unsigned cnt;
> +	unsigned i;
> +	uint_t type;
> +	void *jdata;
> +	void *data;
> +
> +	jlshdr = FUNC(find_shdr)(ehdr, "__jump_table", SHT_PROGBITS);
> +	if (!jlshdr)
> +		return;
> +
> +	jlrhdr = FUNC(find_relhdr)(ehdr, jlshdr);
> +	if (!jlrhdr)
> +		return;
> +
> +	/*
> +	 * Create and fill in the __jump_table section and use it to
> +	 * find the offsets into the text that we want to update.
> +	 * We create it so that we do not depend on the order of the
> +	 * relocations, and use the table directly, as it is broken
> +	 * up into sections.
> +	 */
> +	size = _w(jlshdr->sh_size);
> +	data = umalloc(size);
> +
> +	jdata = (void *)get_section_loc(ehdr, jlshdr);
> +	memcpy(data, jdata, size);
> +
> +	cnt = _w(jlrhdr->sh_size) / w(jlrhdr->sh_entsize);
> +
> +	rel = (const Elf_Rel *)get_section_loc(ehdr, jlrhdr);
> +
> +	/* Is this as Rel or Rela? */
> +	type = w(jlrhdr->sh_type);
> +
> +	symhdr = FUNC(find_shdr)(ehdr, NULL, SHT_SYMTAB);
> +
> +	for (i = 0; i < cnt; i++) {
> +		FUNC(section_update)(ehdr, symhdr, type, rel, data);
> +		rel = (void *)rel + w(jlrhdr->sh_entsize);
> +	}
> +
> +	/*
> +	 * This is specific to x86. The jump_table is stored in three
> +	 * long words. The first is the location of the jmp target we
> +	 * must update.
> +	 */
> +	cnt = size / sizeof(uint_t);
> +
> +	for (i = 0; i < cnt; i += 3)
> +		if (0)make_nop((void *)ehdr, *(uint_t *)(data + i * sizeof(uint_t)));
> +
> +	free(data);
> +}
>
>


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 12:42:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 12:42:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCGJj-00022j-Cd; Fri, 07 Oct 2011 12:42:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCGJ3-0001ij-OZ
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 12:42:06 -0700
X-Env-Sender: davidxu06@gmail.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318016499!52269479!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25359 invoked from network); 7 Oct 2011 19:41:40 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 19:41:40 -0000
Received: by ggnk4 with SMTP id k4so5107598ggn.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 12:42: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:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding;
	bh=QMK8M2KOMVwlMaf9xssI7F1ra/AntwMkDP2YJ/ZO498=;
	b=WWmkUsrMfY4sRReNjPtNZt7ozbsm6DYV2q0Tn9Q3OjQNSi4AAa3O4I2ljA/fM+TPnJ
	Bp9g2caJ/XJekISugfGDEJTv3L/iiuJxEbH2IRm4uLI/mi4kcuyWB4dwzQAvVGhfYTYC
	CKj0zVBRDyITJMBhOTi67Y9ulEET8RXsHADGg=
MIME-Version: 1.0
Received: by 10.150.175.9 with SMTP id x9mr1904820ybe.152.1318016521244; Fri,
	07 Oct 2011 12:42:01 -0700 (PDT)
Received: by 10.150.157.13 with HTTP; Fri, 7 Oct 2011 12:42:01 -0700 (PDT)
In-Reply-To: <1318006241.24742.30.camel@dagon.hellion.org.uk>
References: <CAGjowiTc0NAJbWR-RxwLTrz+bhbAFfvcPKPAB_F8r1ef6__PbA@mail.gmail.com>
	<1317368064.26672.198.camel@zakaz.uk.xensource.com>
	<CAGjowiQE_3gTJxK+Ja850QU9g1+97hZ8hAgdv_a4B18jxmCNGw@mail.gmail.com>
	<1317393663.26672.288.camel@zakaz.uk.xensource.com>
	<CAGjowiSrPCY50-iBK67nGfOGdK7z1htc58ohtrqJtmutmRRQzQ@mail.gmail.com>
	<1317394559.26672.293.camel@zakaz.uk.xensource.com>
	<CAGjowiSkwN9Oz-qevYk2G1NgwBmFOLWFLtT30aBu0SAe=jqtog@mail.gmail.com>
	<CAGjowiSQO_Hzdbz0FxQK_7ppr-yvBSWYVbzoSUd_RfiWytZKPw@mail.gmail.com>
	<1318002580.21903.361.camel@zakaz.uk.xensource.com>
	<CAGjowiTvPu4KFTeLLCVUvoRombjXGscVWAgHLNi6+T7uQs2jPA@mail.gmail.com>
	<1318006241.24742.30.camel@dagon.hellion.org.uk>
Date: Fri, 7 Oct 2011 15:42:01 -0400
Message-ID: <CAGjowiSdUbrg0hWNVCU4OAqu6Cu=eoXVAQggGGAcG-VKBA-4zg@mail.gmail.com>
Subject: Re: [Xen-devel] ring buffer overflow
From: David Xu <davidxu06@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 <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

Sorry, I did not notice his email and I did not mean to. I will be
more careful next time.

Regards,
Cong

2011/10/7 Ian Campbell <Ian.Campbell@citrix.com>:
> On Fri, 2011-10-07 at 17:23 +0100, David Xu wrote:
>> Hi,
>>
>> This time I want to call it in the user-space. I wrote a user-level
>> application and call the xc_sched_credit_domain_set( int
>> =A0xc_handle, uint32_t domid, struct xen_domctl_sched_credit *sdom) in
>> it. But I don't know how to pass the xc_handle parameter in this
>> function. Thanks.
>
> Tim already answered this. But why do you persist in top posting? You've
> been asked not to _repeatedly_.
>
> Please re-read http://wiki.xen.org/xenwiki/AskingXenDevelQuestions. In
> particular the etiquette section.
>
> Perhaps I should start ignoring top posted emails. :-/
>
> Ian.
>
>>
>> Regards,
>> Cong
>>
>> 2011/10/7 Ian Campbell <Ian.Campbell@eu.citrix.com>:
>> > Stop top posting, I've asked you this before.
>> >
>> > On Fri, 2011-10-07 at 16:23 +0100, David Xu wrote:
>> >> Hi,
>> >>
>> >> I want to use the libxc function xc_sched_credit_domain_set( int
>> >> xc_handle, uint32_t domid, struct xen_domctl_sched_credit *sdom) in a
>> >> user-level application. But I don't know how to set the value of
>> >> xc_handle. Is there somebody familiar with it? Thanks.
>> >
>> > You can't use xc_* functions in the kernel, they are userspace. You
>> > could in theory look at the implementation of xc_sched_credit_domain_s=
et
>> > to find out what that hypercall is and make the underlying hypercall
>> > instead, But:
>> >
>> > The hypercall in question here is a domctl which are not available /
>> > allowed from kernel space (for policy and semantic reasons rather than
>> > technological ones).
>> >
>> > As I explained elsewhere I don't think the architecture you have in mi=
nd
>> > is correct. I think you should look at exporting the necessary
>> > statistics from the kernel to userspace and have a daemon implement th=
e
>> > logic and mechanisms for changing the scheduling parameters as require=
d.
>> >
>> > Ian.
>> >
>> >
>> >
>
>
>

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 13:02:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 13: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 1RCGcZ-0003Na-QT; Fri, 07 Oct 2011 13:02:15 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCGZF-00038W-9V
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 12:59:10 -0700
X-Env-Sender: peterz@infradead.org
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318017525!166438!1
X-Originating-IP: [205.233.59.134]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28130 invoked from network); 7 Oct 2011 19:58:45 -0000
Received: from merlin.infradead.org (HELO merlin.infradead.org)
	(205.233.59.134)
	by server-14.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Oct 2011 19:58:45 -0000
Received: from canuck.infradead.org ([2001:4978:20e::1])
	by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux))
	id 1RCGZ8-0001rc-UZ
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 19:58:43 +0000
Received: from j77219.upc-j.chello.nl ([24.132.77.219]
	helo=dyad.programming.kicks-ass.net)
	by canuck.infradead.org with esmtpsa (Exim 4.76 #1 (Red Hat Linux))
	id 1RCGZ8-0006s8-LW
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 19:58:42 +0000
Received: by dyad.programming.kicks-ass.net (Postfix, from userid 65534)
	id 8003810011; Fri,  7 Oct 2011 21:57:03 +0200 (CEST)
X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on dyad
X-Spam-Level: 
X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED
	autolearn=unavailable version=3.3.1
Received: from [IPv6:::1] (dyad [192.168.0.60])
	by dyad.programming.kicks-ass.net (Postfix) with ESMTP id 96A5610BC5;
	Fri,  7 Oct 2011 21:56:49 +0200 (CEST)
From: Peter Zijlstra <peterz@infradead.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
In-Reply-To: <4E8F55B7.9010409@goop.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
	<4E8E275F.6010801@goop.org>
	<1318007374.4729.58.camel@gandalf.stny.rr.com>
	<4E8F55B7.9010409@goop.org>
Content-Type: text/plain; charset="UTF-8"
Date: Fri, 07 Oct 2011 22:04:34 +0200
Message-ID: <1318017874.12984.4.camel@laptop>
Mime-Version: 1.0
X-Mailer: Evolution 2.32.2 
Content-Transfer-Encoding: 7bit
Cc: Linux, Jan, the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, Jason Baron <jbaron@redhat.com>,
	Glauber <jang@linux.vnet.ibm.com>, Richard Henderson <rth@redhat.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH][RFC] jump_labels/x86: Use either 5 byte or
	2 byte jumps
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 12:40 -0700, Jeremy Fitzhardinge wrote:
>     J

can we please, pretty please start trimming email replies?


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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 13:05:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 13:05:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCGfc-0003nE-Gi; Fri, 07 Oct 2011 13:05:24 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCGYs-00038T-Qa
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 12:59:14 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-3.tower-174.messagelabs.com!1318017502!28360621!1
X-Originating-IP: [71.74.56.122]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6284 invoked from network); 7 Oct 2011 19:58:22 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.122) by server-3.tower-174.messagelabs.com with SMTP;
	7 Oct 2011 19:58:22 -0000
X-Authority-Analysis: v=1.1 cv=agqPq5NoKwAPC9P66H7dbYUCjxvmT73as08i4x3aqAA=
	c=1 sm=0 a=gxfjmhR6zbwA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:17 a=S-x86ON2MK9qNWMveHkA:9
	a=8jbVAO-12CBWOFvf65MA:7 a=PUjeQqilurYA:10
	a=17wjrS5wAhQaEczCPkpxpQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.83.30
Received: from [74.67.83.30] ([74.67.83.30:48653] helo=[192.168.23.10])
	by hrndva-oedge01.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id AB/70-12608-DD95F8E4; Fri, 07 Oct 2011 19:58:21 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Fri, 07 Oct 2011 15:58:20 -0400
In-Reply-To: <4E8F55B7.9010409@goop.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
	<4E8E275F.6010801@goop.org>
	<1318007374.4729.58.camel@gandalf.stny.rr.com>
	<4E8F55B7.9010409@goop.org>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318017501.4729.78.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, "H.
	Peter Anvin" <hpa@zytor.com>, the, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH][RFC] jump_labels/x86: Use either 5 byte or
	2 byte jumps
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 12:40 -0700, Jeremy Fitzhardinge wrote:
> On 10/07/2011 10:09 AM, Steven Rostedt wrote:
> > diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
> > index 3fee346..1f7f88f 100644
> > --- a/arch/x86/kernel/jump_label.c
> > +++ b/arch/x86/kernel/jump_label.c
> > @@ -16,34 +16,75 @@
> >  
> >  #ifdef HAVE_JUMP_LABEL
> >  
> > +static unsigned char nop_short[] = { P6_NOP2 };
> > +
> >  union jump_code_union {
> >  	char code[JUMP_LABEL_NOP_SIZE];
> >  	struct {
> >  		char jump;
> >  		int offset;
> >  	} __attribute__((packed));
> > +	struct {
> > +		char jump_short;
> > +		char offset_short;
> > +	} __attribute__((packed));
> >  };
> >  
> >  void arch_jump_label_transform(struct jump_entry *entry,
> >  			       enum jump_label_type type)
> >  {
> >  	union jump_code_union code;
> > +	unsigned char op;
> > +	unsigned size;
> > +	unsigned char nop;
> > +
> > +	/* Use probe_kernel_read()? */
> > +	op = *(unsigned char *)entry->code;
> > +	nop = ideal_nops[NOP_ATOMIC5][0];
> >  
> >  	if (type == JUMP_LABEL_ENABLE) {
> > -		code.jump = 0xe9;
> > -		code.offset = entry->target -
> > -				(entry->code + JUMP_LABEL_NOP_SIZE);
> > -	} else
> > -		memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE);
> > +		if (op == 0xe9 || op == 0xeb)
> > +			/* Already enabled. Warn? */
> > +			return;
> > +
> > +		/* FIXME for all archs */
> 
> By "archs", do you mean different x86 variants?

Yeah, that was a confusing use of archs. This was to make sure it works
for all nops for different variants of x86.

> 
> > +		if (op == nop_short[0]) {
> 
> My gut feeling is that all this "trying to determine the jump size by
> sniffing the instruction" stuff seems pretty fragile.  Couldn't you
> store the jump size in the jump_label structure (even as a bit hidden
> away somewhere)?

We could but it's not as fragile as you think. This is machine code, and
it should be a jump or not. I could add more checks, that is, to look at
the full nop to make sure it is truly a nop. But for the jump side, a
byte instruction that starts with e9 is definitely a jump.

I could harden this more like what we do with mcount updates in the
function tracer. I actually calculate what I expect to be there before
looking at what is there. The entire instruction is checked. If it does
not match, then we fail and give big warnings about it.

Other than that, it should be quite solid. If we don't get a match, we
should warn and disable jump labels.

No BUG()!

-- Steve



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 13:51:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 13:51:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCHNs-0006UV-Mx; Fri, 07 Oct 2011 13:51:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCHN0-0006Hx-4e
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 13:50:14 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-7.tower-21.messagelabs.com!1318020578!57922009!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30933 invoked from network); 7 Oct 2011 20:49:38 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-7.tower-21.messagelabs.com with SMTP;
	7 Oct 2011 20:49:38 -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
	p97Ko7Df019924; Fri, 7 Oct 2011 20:50:07 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 p97Ko65w009870; 
	Fri, 7 Oct 2011 16:50:07 -0400
Message-ID: <4E8F660C.4010405@tycho.nsa.gov>
Date: Fri, 07 Oct 2011 16:50:20 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Ian Campbell <ian.campbell@citrix.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
References: <patchbomb.1317313227@localhost.localdomain>
	<50cd0fd187b39a263680.1317313232@localhost.localdomain>
In-Reply-To: <50cd0fd187b39a263680.1317313232@localhost.localdomain>
X-Enigmail-Version: 1.3
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] libxlu: correctly parse disk "backendtype" field
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 expression for backendtype was missing a comma.

--- a/tools/libxl/libxlu_disk_l.l
+++ b/tools/libxl/libxlu_disk_l.l
@@ -139,7 +139,7 @@ devtype=disk,?	{ DPC->disk->is_cdrom = 0; }
 devtype=[^,]*,?	{ xlu__disk_err(DPC,yytext,"unknown value for type"); }
 
 access=[^,]*,?	{ STRIP(','); setaccess(DPC, FROMEQUALS); }
-backendtype=[^,]*? { STRIP(','); setbackendtype(DPC,FROMEQUALS); }
+backendtype=[^,]*,? { STRIP(','); setbackendtype(DPC,FROMEQUALS); }
 
 vdev=[^,]*,?	{ STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); }
 script=[^,]*,?	{ STRIP(','); SAVESTRING("script", script, FROMEQUALS); }

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 14:39:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 14:39:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCI8h-0008FO-Ea; Fri, 07 Oct 2011 14:39:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCI84-00082n-AR
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 14:38:56 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318023540!54623705!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9551 invoked from network); 7 Oct 2011 21:39:00 -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;
	7 Oct 2011 21:39:00 -0000
X-IronPort-AV: E=Sophos;i="4.68,504,1312156800"; 
   d="scan'208";a="8281539"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 21:38: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; Fri, 7 Oct 2011 22:38:49 +0100
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 1RCI80-0007CY-N5;
	Fri, 07 Oct 2011 21:38:48 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RCI80-0003h1-IC;
	Fri, 07 Oct 2011 22:38:48 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9205-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 22:38:48 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9205: 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 9205 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9205/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. vs. 9184
 test-amd64-i386-xl-win-vcpus1  5 xen-boot                  fail REGR. vs. 9184

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-amd64-xl          15 guest-stop                   fail   never pass
 test-amd64-i386-xl-credit2    5 xen-boot                     fail    like 9184
 test-amd64-i386-xl-multivcpu 15 guest-stop                   fail   never pass
 test-i386-i386-xl            15 guest-stop                   fail   never pass
 test-amd64-i386-xl           15 guest-stop                   fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-rhel6hvm-amd  7 redhat-install               fail   never pass
 test-i386-i386-win           16 leak-check/check             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-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                  f051e9973b79
baseline version:
 xen                  7707a2bf2a93

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.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                                          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:   21545:f051e9973b79
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:46:57 2011 +0100
    
    Added signature for changeset fd7c4d4e52d9
    
    
changeset:   21544:b5d76f548ed1
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:46:48 2011 +0100
    
    Added tag 4.0.3-rc3 for changeset fd7c4d4e52d9
    
    
changeset:   21543:fd7c4d4e52d9
tag:         4.0.3-rc3
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:46:32 2011 +0100
    
    Update Xen version to 4.0.3-rc3
    
    
changeset:   21542:7707a2bf2a93
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Mon Oct 03 16:36:09 2011 +0100
    
    build: fix grep invocation in cc-options
    
    Currently the build produces lots of
            Usage: grep [OPTION]... PATTERN [FILE]...
            Try `grep --help' for more information.
    
    This is due to the "grep -- $(2)" in cc-options. It seems that the
    default of reading stdin is disabled when using "--". I don't know if
    this is a bug in grep or how it is supposed to be but we can work
    around it by explicitly passing in "-"
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   23898:3d1664cc9e45
    xen-unstable date:        Fri Sep 30 21:17:47 2011 +0100
    
    
(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 Fri Oct 07 14:42:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 14:42:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCIBO-0000Ct-7A; Fri, 07 Oct 2011 14:42:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCIAe-0008Rh-Cu
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 14:41:33 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318023689!34433878!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20039 invoked from network); 7 Oct 2011 21:41:29 -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;
	7 Oct 2011 21:41:29 -0000
X-IronPort-AV: E=Sophos;i="4.68,504,1312156800"; 
   d="scan'208";a="8281570"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 21:41:28 +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, 7 Oct 2011
	22:41:28 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
In-Reply-To: <4E8F660C.4010405@tycho.nsa.gov>
References: <patchbomb.1317313227@localhost.localdomain>
	<50cd0fd187b39a263680.1317313232@localhost.localdomain>
	<4E8F660C.4010405@tycho.nsa.gov>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Fri, 7 Oct 2011 22:41:28 +0100
Message-ID: <1318023688.13747.28.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>
Subject: [Xen-devel] Re: [PATCH] libxlu: correctly parse disk "backendtype"
	field
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 21:50 +0100, Daniel De Graaf wrote:
> The expression for backendtype was missing a comma.

This appears correct even though things seem to work without, at least:
xl -N block-attach 0 backendtype=phy,vdev=xvdb,access=w,target=/dev/vg/guest-volume
works as expected. Do you have a test case which fails or did you just
find by code inspection?

Acked-by: Ian Campbell <ian.campbell@citrix.com>

(we need a signed-off-by I suspect)

> 
> --- a/tools/libxl/libxlu_disk_l.l
> +++ b/tools/libxl/libxlu_disk_l.l
> @@ -139,7 +139,7 @@ devtype=disk,?	{ DPC->disk->is_cdrom = 0; }
>  devtype=[^,]*,?	{ xlu__disk_err(DPC,yytext,"unknown value for type"); }
>  
>  access=[^,]*,?	{ STRIP(','); setaccess(DPC, FROMEQUALS); }
> -backendtype=[^,]*? { STRIP(','); setbackendtype(DPC,FROMEQUALS); }
> +backendtype=[^,]*,? { STRIP(','); setbackendtype(DPC,FROMEQUALS); }
>  
>  vdev=[^,]*,?	{ STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); }
>  script=[^,]*,?	{ STRIP(','); SAVESTRING("script", script, FROMEQUALS); }



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 14:50:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 14:50:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCIJ3-00011p-2L; Fri, 07 Oct 2011 14:50:13 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCIHq-0000jC-Vh
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 14:49:02 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318024118!57187305!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3171 invoked from network); 7 Oct 2011 21:48:39 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2011 21:48:39 -0000
Received: from anacreon.sc.intel.com (jfdmzpr01-ext.jf.intel.com
	[134.134.139.70]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p97LmOjM004712
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Fri, 7 Oct 2011 14:48:25 -0700
Message-ID: <4E8F73A3.5080904@zytor.com>
Date: Fri, 07 Oct 2011 14:48:19 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Steven Rostedt <rostedt@goodmis.org>
References: <4E8CF385.2080804@zytor.com> <4E8DEB19.1050509@goop.org>
	<20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
	<4E8E275F.6010801@goop.org>
	<1318007374.4729.58.camel@gandalf.stny.rr.com>
	<20111007185214.GD2978@redhat.com>
	<1318015311.4729.69.camel@gandalf.stny.rr.com>
In-Reply-To: <1318015311.4729.69.camel@gandalf.stny.rr.com>
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH][RFC] jump_labels/x86: Use either 5 byte or
	2 byte jumps
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/07/2011 12:21 PM, Steven Rostedt wrote:
>>
>> same here, at least WARN, more likely BUG()
>
> I just don't like using BUG(). BUG() means that if we continue we will
> corrupt the filesystem or make you go blind. WARN and returning here
> should not cause any harm and will even let those with X terminals see
> oops in /var/log/messages.
>

Uh, NO.

If this is wrong something in the kernel code stream is corrupted (heck, 
you might just have caught a rootkit!)

Die.  NOW.

	-hpa

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 14:58:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 14:58:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCIQo-0001bs-Qe; Fri, 07 Oct 2011 14:58:14 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCIPN-0001Mz-Gz
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 14:56:47 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318024602!18621417!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3733 invoked from network); 7 Oct 2011 21:56:42 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 21:56:42 -0000
Received: by wyh13 with SMTP id 13so5716604wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 14:56:41 -0700 (PDT)
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:mime-version:content-type:content-transfer-encoding;
	bh=UctGTB92egv2F62GuIncDO8wCtJ5jdTVmf4jEXJgdYo=;
	b=xOKnPIKbEXWrTvYCuhkG53ncYTfq+fJ78wTjZ5l9GMDSW7SBsbsZ1y3uF5GTd1Ggea
	QvTUHmSmHL2+MCNxs80WAoGCRcwhq3JxTvEYaieR0mKbZWkPt2HK3r8xLw5eeWdvNt5f
	0DIPqzuZYXQkrom1yDPRRYBLze320UIMN9uTQ=
Received: by 10.216.131.234 with SMTP id m84mr3067051wei.25.1318024601882;
	Fri, 07 Oct 2011 14:56:41 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id fj1sm14403453wbb.13.2011.10.07.14.56.40
	(version=SSLv3 cipher=OTHER); Fri, 07 Oct 2011 14:56:41 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 07 Oct 2011 22:56:37 +0100
From: Keir Fraser <keir.xen@gmail.com>
To: <xen-devel@lists.xensource.com>
Message-ID: <CAB53425.227E8%keir.xen@gmail.com>
Thread-Topic: Third RCs for Xen 4.0.3 and 4.1.2
Thread-Index: AcyFO/xWnpbvBlbzyki2V7GkTIRTVA==
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Subject: [Xen-devel] Third RCs for Xen 4.0.3 and 4.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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Folks,

Release candidates are tagged as follows:
http://xenbits.xen.org/staging/xen-4.0-testing.hg '4.0.3-rc3'
http://xenbits.xen.org/staging/xen-4.1-testing.hg '4.1.2-rc3'

Hopefully these will be the final release candidates. So please test!

 -- Keir



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 15:06:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 15:06:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCIZ4-00024s-Ai; Fri, 07 Oct 2011 15:06:46 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCITS-0001nX-PX
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 15:01:24 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-4.tower-21.messagelabs.com!1318024815!63293868!1
X-Originating-IP: [71.74.56.124]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19543 invoked from network); 7 Oct 2011 22:00:16 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.124) by server-4.tower-21.messagelabs.com with SMTP;
	7 Oct 2011 22:00:16 -0000
X-Authority-Analysis: v=1.1 cv=agqPq5NoKwAPC9P66H7dbYUCjxvmT73as08i4x3aqAA=
	c=1 sm=0 a=gxfjmhR6zbwA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=cahJxx6UZF3xCAIBq47FAQ==:17 a=zBK5yZjOAAAA:8
	a=mWILyxohiJLPY4WqqIoA:9 a=wWYzvfqj6_-I5wr8oGgA:7
	a=PUjeQqilurYA:10 a=jCX6CI3P4pcA:10
	a=cahJxx6UZF3xCAIBq47FAQ==:117
X-Cloudmark-Score: 0
X-Originating-IP: 69.204.222.235
Received: from [69.204.222.235] ([69.204.222.235:49030] helo=[192.168.23.10])
	by hrndva-oedge01.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id C3/36-12608-3967F8E4; Fri, 07 Oct 2011 22:00:53 +0000
From: Steven Rostedt <rostedt@goodmis.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Fri, 07 Oct 2011 18:00:51 -0400
In-Reply-To: <4E8F73A3.5080904@zytor.com>
References: <4E8CF385.2080804@zytor.com> <4E8DEB19.1050509@goop.org>
	<20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
	<4E8E275F.6010801@goop.org>
	<1318007374.4729.58.camel@gandalf.stny.rr.com>
	<20111007185214.GD2978@redhat.com>
	<1318015311.4729.69.camel@gandalf.stny.rr.com>
	<4E8F73A3.5080904@zytor.com>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318024853.4729.88.camel@gandalf.stny.rr.com>
Mime-Version: 1.0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Michael,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH][RFC] jump_labels/x86: Use either 5 byte or
	2 byte jumps
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 14:48 -0700, H. Peter Anvin wrote:
> On 10/07/2011 12:21 PM, Steven Rostedt wrote:
> >>
> >> same here, at least WARN, more likely BUG()
> >
> > I just don't like using BUG(). BUG() means that if we continue we will
> > corrupt the filesystem or make you go blind. WARN and returning here
> > should not cause any harm and will even let those with X terminals see
> > oops in /var/log/messages.
> >
> 
> Uh, NO.
> 
> If this is wrong something in the kernel code stream is corrupted (heck, 
> you might just have caught a rootkit!)
> 
> Die.  NOW.

Ouch, quite shaken by k.org? I guess I should have substituted go blind
with being hacked.


The thing is, it may be as simple as an out of tree module screwing up
the jump table. Or worse, gcc not doing things that we did not expect.
If this is the case, jump labels can be disabled from modifying code.

But if we just want to do the BUG() case, this will be a big hammer to
the code and we just prevent any further progress until the issue is
addressed. Which may be tell people to disable jump labels in their
code, or use a different compiler.

Currently ftrace takes the approach to WARN() and disable itself when it
finds an anomaly from what it expects to modify. The times this has
triggered has been either a problem with writing to the code, due to
securities preventing code modification, or the scan of the relocation
tables mistook a data point as code. The later I could foresee happening
with jump labels.

-- Steve



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 15:09:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 15:09:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCIbj-0002Tc-44; Fri, 07 Oct 2011 15:09:31 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCIWF-0001pu-KP
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 15:03:55 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1318025026!34406522!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31254 invoked from network); 7 Oct 2011 22:03:47 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 7 Oct 2011 22:03:47 -0000
Received: from anacreon.sc.intel.com (fmdmzpr02-ext.fm.intel.com
	[192.55.55.37]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p97M3U66005080
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Fri, 7 Oct 2011 15:03:31 -0700
Message-ID: <4E8F772D.20408@zytor.com>
Date: Fri, 07 Oct 2011 15:03:25 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Steven Rostedt <rostedt@goodmis.org>
References: <4E8CF385.2080804@zytor.com> <4E8DEB19.1050509@goop.org>
	<20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
	<4E8E275F.6010801@goop.org>
	<1318007374.4729.58.camel@gandalf.stny.rr.com>
	<20111007185214.GD2978@redhat.com>
	<1318015311.4729.69.camel@gandalf.stny.rr.com>
	<4E8F73A3.5080904@zytor.com>
	<1318024853.4729.88.camel@gandalf.stny.rr.com>
In-Reply-To: <1318024853.4729.88.camel@gandalf.stny.rr.com>
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH][RFC] jump_labels/x86: Use either 5 byte or
	2 byte jumps
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/07/2011 03:00 PM, Steven Rostedt wrote:
>
> Ouch, quite shaken by k.org? I guess I should have substituted go blind
> with being hacked.
>

Well, yes, but I would have said exactly the same thing before.

> The thing is, it may be as simple as an out of tree module screwing up
> the jump table. Or worse, gcc not doing things that we did not expect.
> If this is the case, jump labels can be disabled from modifying code.
>
> But if we just want to do the BUG() case, this will be a big hammer to
> the code and we just prevent any further progress until the issue is
> addressed. Which may be tell people to disable jump labels in their
> code, or use a different compiler.

That is EXACTLY what should happen.  Something is wrong to the point of 
the kernel is *known* to be executing the wrong code.  That is an 
extremely serious condition and should be treated as such.

If you want, you could have a debug option to demote this to WARN, but I 
really don't want to see it by default.

	-hpa

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 15:29:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 15:29:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCIum-0003lA-Bm; Fri, 07 Oct 2011 15:29:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCIu4-0003XR-Ij
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 15:28:29 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318026392!39403331!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31479 invoked from network); 7 Oct 2011 22:26:32 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-14.tower-27.messagelabs.com with SMTP;
	7 Oct 2011 22:26:32 -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
	p97MSMDf004449; Fri, 7 Oct 2011 22:28:22 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 p97MSMZ9013714; 
	Fri, 7 Oct 2011 18:28:22 -0400
Message-ID: <4E8F7D13.1040409@tycho.nsa.gov>
Date: Fri, 07 Oct 2011 18:28:35 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
References: <patchbomb.1317313227@localhost.localdomain>
	<50cd0fd187b39a263680.1317313232@localhost.localdomain>
	<4E8F660C.4010405@tycho.nsa.gov>
	<1318023688.13747.28.camel@dagon.hellion.org.uk>
In-Reply-To: <1318023688.13747.28.camel@dagon.hellion.org.uk>
X-Enigmail-Version: 1.3
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>
Subject: [Xen-devel] Re: [PATCH] libxlu: correctly parse disk "backendtype"
	field
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/07/2011 05:41 PM, Ian Campbell wrote:
> On Fri, 2011-10-07 at 21:50 +0100, Daniel De Graaf wrote:
>> The expression for backendtype was missing a comma.
> 
> This appears correct even though things seem to work without, at least:
> xl -N block-attach 0 backendtype=phy,vdev=xvdb,access=w,target=/dev/vg/guest-volume
> works as expected. Do you have a test case which fails or did you just
> find by code inspection?
> 
> Acked-by: Ian Campbell <ian.campbell@citrix.com>
> 
> (we need a signed-off-by I suspect)
> 

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>

Found when xl was parsing a configuration file with the disk line:

disk = [ 'backendtype=phy,backend=3,vdev=xvda,access=w,target=/dev/clam/vm1' ]

This is after adding another patch allowing backend domain ID for disk/vif to
be changed in the config, so it may or may not show up on its own; I didn't
test the new syntax until I needed it.

>>
>> --- a/tools/libxl/libxlu_disk_l.l
>> +++ b/tools/libxl/libxlu_disk_l.l
>> @@ -139,7 +139,7 @@ devtype=disk,?	{ DPC->disk->is_cdrom = 0; }
>>  devtype=[^,]*,?	{ xlu__disk_err(DPC,yytext,"unknown value for type"); }
>>  
>>  access=[^,]*,?	{ STRIP(','); setaccess(DPC, FROMEQUALS); }
>> -backendtype=[^,]*? { STRIP(','); setbackendtype(DPC,FROMEQUALS); }
>> +backendtype=[^,]*,? { STRIP(','); setbackendtype(DPC,FROMEQUALS); }
>>  
>>  vdev=[^,]*,?	{ STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); }
>>  script=[^,]*,?	{ STRIP(','); SAVESTRING("script", script, FROMEQUALS); }
> 

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 15:30:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 15:30:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCIwG-0004Ai-Kd; Fri, 07 Oct 2011 15:30:44 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCIuq-0003lU-07
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 15:29:16 -0700
X-Env-Sender: james.harper@bendigoit.com.au
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318026549!34435887!1
X-Originating-IP: [203.16.224.4]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24587 invoked from network); 7 Oct 2011 22:29:12 -0000
Received: from smtp1.bendigoit.com.au (HELO smtp1.bendigoit.com.au)
	(203.16.224.4)
	by server-4.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	7 Oct 2011 22:29:12 -0000
Received: from smtp2.bendigoit.com.au ([203.16.207.99]
	helo=mail.bendigoit.com.au)
	by smtp1.bendigoit.com.au with esmtp (Exim 4.69)
	(envelope-from <james.harper@bendigoit.com.au>)
	id 1RCIue-0007QE-Q9; Sat, 08 Oct 2011 09:29:04 +1100
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
X-MimeOLE: Produced By Microsoft Exchange V6.5
Subject: RE: [Xen-devel] Limits on mtu size ?
Date: Sat, 8 Oct 2011 09:29:04 +1100
Message-ID: <AEC6C66638C05B468B556EA548C1A77D01E5E424@trantor>
In-Reply-To: <4E8F3F61.9070401@xmsnet.nl>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: [Xen-devel] Limits on mtu size ?
Thread-Index: AcyFHFwT37mcE2BURxmDQ9nld2E0tAAI/tQA
References: <4E8F3F61.9070401@xmsnet.nl>
From: "James Harper" <james.harper@bendigoit.com.au>
To: "Hans de Bruin" <jmdebruin@xmsnet.nl>,
	<xen-devel@lists.xensource.com>
X-Really-From-Bendigo-IT: magichashvalue
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

>=20
> Network performance on fast physical networks usually increase by
> switching to larger packet sizes. So I decided to increase the mtu on
my
> virtual networks to see if that has a positive effect. Anoyingly the
bridge code
> does not allow you to increase the mtu above 1500 if no interface is
attached
> to the bridge. Google tels me admins attach a nic to the bridge,
increase the
> mtu and then remove the nic from the bridge as a work around. Then I
> noticed that the loopback has a whopping 16k mtu. For some reason
adding
> lo to a bridge is not allowed. To shortcut workarounds and have fun
with the
> mtu size I modified linux-2.6/net/bridge/br_if.c. There is a line: mtu
=3D
> ETH_DATA_LEN; which I changed in to mtu =3D 16436; If lo can handle =
that
size
> why not a bridge. So my setup now has two brides with oversized mtu's
and
> one normal sized bidge to talk to my lan. This setup has run for two
day's and
> now it suddenly broke while ssh/rsync-ing data between the to internal
> networks. A server called darkstar ran out of memory, as far as i can
see with
> an empty swapfile, a server called orion, which was reseaving the
data,
> stopped responding. Dom0 feels sluggish. So 16436 is to big and 9000
is not?
>=20
> I have attached the complaints of darkstar. Its running out of kernel
> memory?
>=20

If all the hosts are Linux and GSO is enabled, the machines should be
exchanging 64K packets anyway, regardless of MTU.

James

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 15:43:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 15:43:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCJ8J-00054c-0y; Fri, 07 Oct 2011 15:43:11 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCJ7R-0004sG-2H
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 15:42:17 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1318027333!170370!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9294 invoked from network); 7 Oct 2011 22:42:13 -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 Oct 2011 22:42:13 -0000
X-IronPort-AV: E=Sophos;i="4.68,505,1312156800"; 
   d="scan'208";a="8282042"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	07 Oct 2011 22:42: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, 7 Oct 2011 23:42:13 +0100
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 1RCJ7M-0007Zm-GW;
	Fri, 07 Oct 2011 22:42:12 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RCJ7M-0001Rf-48;
	Fri, 07 Oct 2011 23:42:12 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9206-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 7 Oct 2011 23:42:12 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9206: 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 9206 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9206/

Regressions :-(

Tests which did not succeed and are blocking:
 build-amd64-oldkern           4 xen-build                  fail REGR. vs. 9202

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-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                  3f8fb62436e6
baseline version:
 xen                  460b613596fa

------------------------------------------------------------
People who touched revisions under test:
  Keir Fraser <keir@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          fail    
 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:   23171:3f8fb62436e6
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:47:08 2011 +0100
    
    Added signature for changeset 24041ed83728
    
    
changeset:   23170:f721aba2dc96
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:46:44 2011 +0100
    
    Added tag 4.1.2-rc3 for changeset 24041ed83728
    
    
changeset:   23169:24041ed83728
tag:         4.1.2-rc3
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:46:25 2011 +0100
    
    Update Xen version to 4.1.2-rc3
    
    
changeset:   23168:460b613596fa
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 06 20:03:56 2011 +0100
    
    Do not re-define XEN_ROOT in hypervisor sub-Makefiles.
    
    We can globally export it from xen/Makefile instead, as all hypervisor
    builds have this Makefile at their root.
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   23048:5069eaaa9f79
    xen-unstable date:        Thu Mar 17 08:04:10 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 Fri Oct 07 18:02:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 18:02:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCLJ0-0000Nq-RF; Fri, 07 Oct 2011 18:02:22 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCLIA-0000Ap-9Q
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 18:01:30 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318035686!20740304!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23682 invoked from network); 8 Oct 2011 01:01:27 -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;
	8 Oct 2011 01:01:27 -0000
X-IronPort-AV: E=Sophos;i="4.68,505,1312156800"; 
   d="scan'208";a="8282454"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Oct 2011 01:01: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; Sat, 8 Oct 2011 02:01:26 +0100
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 1RCLI5-0008Lm-UZ;
	Sat, 08 Oct 2011 01:01:25 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RCLI5-0001Rd-Mm;
	Sat, 08 Oct 2011 02:01:25 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9207-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 8 Oct 2011 02:01:25 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9207: 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 9207 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9207/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-win           14 guest-start.2              fail REGR. vs. 9203

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-xl-sedf     14 guest-localmigrate/x10       fail    like 9203
 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-xl-win        13 guest-stop                   fail   never pass

version targeted for testing:
 xen                  0c2bfd1f9c68
baseline version:
 xen                  eb8637351535

------------------------------------------------------------
People who touched revisions under test:
  "Kay, Allen M" <allen.m.kay@intel.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.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


Not pushing.

------------------------------------------------------------
changeset:   23932:0c2bfd1f9c68
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 07 17:57:07 2011 +0200
    
    Adjust 23931:6a9466e1753d.
    
    Committed a stale patch - this was missing from what was actually acked.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    
    
changeset:   23931:6a9466e1753d
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 07 17:50:50 2011 +0200
    
    VT-d: don't reject possibly valid DRHD or RMRR
    
    If a non-zero PCI segment isn't accessible during Xen boot (because
    firmware decided to not enter the necessary MMIO space into the E820
    table), devices referred to on those segments through DRHD or RMRR
    structures should not be rejected just because the devices can't be
    found.
    
    This is in line with what is being done in at least one other case
    already: Systems with more than one PCI segment (usually high end
    ones) are assumed to have valid firmware provided data, while systems
    with just segment 0 continue to have their firmware tables validated.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: "Kay, Allen M" <allen.m.kay@intel.com>
    
    
changeset:   23930:eec5d0b44f76
user:        Olaf Hering <olaf@aepfle.de>
date:        Fri Oct 07 14:33:15 2011 +0100
    
    tools/check: remove check_logging
    
    Remove tools/check/check_logging.  Python 2.3 is the minimal required
    python version so the checked function is available anyway.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23929:b45b400d11d3
user:        Olaf Hering <olaf@aepfle.de>
date:        Fri Oct 07 14:32:36 2011 +0100
    
    tools/check: update python version check
    
    Python 2.3 is the minimal version according to the README.
    Adjust check script.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23928:eb8637351535
user:        Ian Jackson <Ian.Jackson@eu.citrix.com>
date:        Fri Oct 07 10:47:04 2011 +0100
    
    libvchan: remove erroneously-committed libvchan-node[12]; add them to .hgignore
    
    Signed-off-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 Fri Oct 07 18:40:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 18:40:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCLtn-00024Y-Hk; Fri, 07 Oct 2011 18:40:23 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCLtD-0001rm-Fn
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 18:39:47 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1318037983!16420263!1
X-Originating-IP: [192.55.52.88]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12782 invoked from network); 8 Oct 2011 01:39:44 -0000
Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88)
	by server-7.tower-182.messagelabs.com with SMTP;
	8 Oct 2011 01:39:44 -0000
Received: from fmsmga002.fm.intel.com ([10.253.24.26])
	by fmsmga101.fm.intel.com with ESMTP; 07 Oct 2011 18:39:42 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,505,1312182000"; d="scan'208";a="75963266"
Received: from orsmsx603.amr.corp.intel.com ([10.22.226.49])
	by fmsmga002.fm.intel.com with ESMTP; 07 Oct 2011 18:39:42 -0700
Received: from orsmsx606.amr.corp.intel.com (10.22.226.128) by
	orsmsx603.amr.corp.intel.com (10.22.226.49) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Fri, 7 Oct 2011 18:39:42 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx606.amr.corp.intel.com ([10.22.226.128]) with mapi;
	Fri, 7 Oct 2011 18:39:41 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Fri, 7 Oct 2011 18:39:40 -0700
Thread-Topic: [PATCH] passthrough: update bus2bridge mapping as PCI	 devices
	get added/removed
Thread-Index: AcyEv80sHSj/QYc+Q3WIsFj6xv6s6wAmvupA
Message-ID: <987664A83D2D224EAE907B061CE93D5301EE70A43F@orsmsx505.amr.corp.intel.com>
References: <4E8B08A10200007800059278@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B54@orsmsx505.amr.corp.intel.com>
	<4E8EC18C0200007800059E17@nat28.tlf.novell.com>
In-Reply-To: <4E8EC18C0200007800059E17@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>
Subject: [Xen-devel] RE: [PATCH] passthrough: update bus2bridge mapping as
 PCI	 devices get added/removed
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 ( ; sec_bus <=3D sub_bus; sec_bus++ )
> +                pseg->bus2bridge[sec_bus] =3D pseg->bus2bridge[pdev->bus=
];

OK.  You are collapsing the bridge of the subordinate buses to be the same =
upstream bridge of the pdev we are removing.  Looks good.  Ack!

Allen

-----Original Message-----
From: Jan Beulich [mailto:JBeulich@suse.com]=20
Sent: Friday, October 07, 2011 12:08 AM
To: Kay, Allen M
Cc: xen-devel@lists.xensource.com
Subject: RE: [PATCH] passthrough: update bus2bridge mapping as PCI devices =
get added/removed

>>> On 07.10.11 at 04:00, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
> Hi Jan,
>=20
> I'm not able to spot the difference between this patch and the earlier on=
e=20
> you had second thoughts about in attached email.  Was there a change I=20
> missed?

It addresses the comment I made in the mail you had attached, i.e. ...

> Allen
>=20
> -----Original Message-----
>...
> -static void free_pdev(struct pci_dev *pdev)
> +static void free_pdev(struct pci_seg *pseg, struct pci_dev *pdev)
>  {
> +    /* update bus2bridge */
> +    switch ( pdev_type(pseg->nr, pdev->bus, pdev->devfn) )
> +    {
> +        u8 dev, func, sec_bus, sub_bus;
> +
> +        case DEV_TYPE_PCIe2PCI_BRIDGE:
> +        case DEV_TYPE_LEGACY_PCI_BRIDGE:
> +            dev =3D PCI_SLOT(pdev->devfn);
> +            func =3D PCI_FUNC(pdev->devfn);
> +            sec_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func,
> +                                     PCI_SECONDARY_BUS);
> +            sub_bus =3D pci_conf_read8(pseg->nr, pdev->bus, dev, func,
> +                                     PCI_SUBORDINATE_BUS);
> +
> +            spin_lock(&pseg->bus2bridge_lock);
> +            for ( ; sec_bus <=3D sub_bus; sec_bus++ )
> +                pseg->bus2bridge[sec_bus] =3D pseg->bus2bridge[pdev->bus=
];

... the right side of this was 0 on the first posting.

Jan

> +            spin_unlock(&pseg->bus2bridge_lock);
> +            break;
> +    }
> +
>      list_del(&pdev->alldevs_list);
>      xfree(pdev);
>  }



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 19:10:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 19:10:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCMN4-0003Ds-4O; Fri, 07 Oct 2011 19:10:38 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCMLk-00031F-1V
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 19:09:21 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1318039742!62664076!1
X-Originating-IP: [143.182.124.37]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14052 invoked from network); 8 Oct 2011 02:09:03 -0000
Received: from mga14.intel.com (HELO mga14.intel.com) (143.182.124.37)
	by server-14.tower-21.messagelabs.com with SMTP;
	8 Oct 2011 02:09:03 -0000
Received: from azsmga001.ch.intel.com ([10.2.17.19])
	by azsmga102.ch.intel.com with ESMTP; 07 Oct 2011 19:09:11 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,505,1312182000"; d="scan'208";a="60059514"
Received: from orsmsx604.amr.corp.intel.com ([10.22.226.87])
	by azsmga001.ch.intel.com with ESMTP; 07 Oct 2011 19:09:11 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx604.amr.corp.intel.com ([10.250.113.17]) with mapi;
	Fri, 7 Oct 2011 19:09:10 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Fri, 7 Oct 2011 19:09:09 -0700
Thread-Topic: Resend: RE: enable_ats_device() call site
Thread-Index: AcyExBU3KfJIvho2RsyUYD3oufbBKwAmGj6w
Message-ID: <987664A83D2D224EAE907B061CE93D5301EE70A446@orsmsx505.amr.corp.intel.com>
References: <4E4E48360200007800051F65@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B5E@orsmsx505.amr.corp.intel.com>
	<4E8EC8A80200007800059E3B@nat28.tlf.novell.com>
In-Reply-To: <4E8EC8A80200007800059E3B@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>
Subject: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 which I'd like to understand why this is being done in the places it i=
s now
>(not the least why this is done in VT-d specific code in the first place).

The reason it is call by reassign_device_ownership() is because FLR clears =
ATS enabling bit on the device - I forgot about it when I wrote the last em=
ail so we still need to re-enable ATS on the device for each device assignm=
ent.  To summarize:

1) Reason for difference in ATS and ACS handling
    a. ATS capability is in the PCIe endpoint - enabling bit is cleared by =
device FLR on the passthrough device.
    b. ACS capability is in the PCIe switch - not affected by FLR on the pa=
ssthrough device.

2) ATS enabling requirement
    a. VT-d engine serving the device has to be ATS capable.
    b. device has to be ATS capable

Allen

-----Original Message-----
From: Jan Beulich [mailto:JBeulich@suse.com]=20
Sent: Friday, October 07, 2011 12:39 AM
To: Kay, Allen M
Cc: xen-devel@lists.xensource.com
Subject: RE: Resend: RE: enable_ats_device() call site

>>> On 07.10.11 at 04:19, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
> Currently I three places where enable_ats_device() can be eventually call=
ed=20
> because of it is in domain_context_mapping():
>=20
> 1) setup_dom0_devices()
> 2) intel_iommu_add_device()
> 3) reassign_device_ownership()
>=20
> Calling it in the first two is probably all we need to cover all the=20
> devices.   I don't think we need to call it again in=20
> reassign_device_ownership().

That would mean that a device that was found during Xen's initial scan
(i.e. pdev->domain set due to it having gone through
setup_dom0_pci_devices()), but for which enable_ats_device() was
unsuccessful due to mmcfg access still being impossible at that point,
would never get ATS enabled. But that's the whole point of the thread
here. My question isn't whether to *re*move call sites, but whether it
would be possible to move them elsewhere. For which I'd like to
understand why this is being done in the places it is now (not the
least why this is done in VT-d specific code in the first place).

Just like in the suggested change to how pci_enable_acs() gets called,
this should really happen from pci_add_device() *without* regard to
whether pdev->domain was already set.

Also, earlier you suggested to remove the call to pci_enable_acs() from
setup_dom0_device() - I'm not convinced anymore that this is correct,
since old Dom0 kernels (forward ports from the 2.6.18 tree up to pretty
recently) can't be relied upon to report all PCI devices to Xen. Which
also suggests that we shouldn't really remove scan_pci_devices()
(although it may be possible to adjust it back to scan only segment 0).
Otoh, when mmcfg isn't available early, on such Dom0 kernels ATS
wouldn't get enabled today either, even with the adjusted call site of
pci_enable_acs().

Consequently, another alternative would be to retry ATS and ACS
enabling when mmcfg becomes available for a certain bus range, i.e.
out of pci_mmcfg_reserved().

Jan

> By the way, due to the lack of production ATS devices, we have not tried =
ATS=20
> for quite a while.  I'm not sure we should make the change now or should =
we=20
> just make a note of it in reassign_device_ownership() for now.
>=20
> Allen
>=20
> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@novell.com]=20
> Sent: Friday, August 19, 2011 2:26 AM
> To: Kay, Allen M
> Subject: Resend: RE: enable_ats_device() call site
>=20
> (for some reason the first send to you bounced - please re-add xen-devel =
as cc=20
> if you reply to this one)
>=20
>>>> On 18.08.11 at 01:27, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
>>>  what is the reason for calling this from VT-d's domain_context_mapping=
()?
>>> I neither undertsand why this is VT-d specific, nor why it needs to be
>>> re-done with each device re-assignment.
>>=20
>> The reason is FLR clears the ATS enabled bit so we need to re-enable it =
for=20
>> every re-assignment.  The reason we don't need to do this for ACS might =
be=20
> ACS=20
>> reside on the bridge, not in the PCI endpoint.  ATS on the other hand,=20
>> resides in PCI endpoints.
>=20
> And why is it VT-d specific then? The problem to solve is that enabling
> may not happen when it is first attempted, in the case where Xen on its
> own can't be certain that using MMCFG is safe. Hence when the device
> gets reported by Dom0 (or when MMCFG gets enabled for the respective
> bus), another attempt needs to be made at enabling it. De-assigning and
> then re-assigning the device to Dom0 seems to be overkill to me.
>=20
>>> Alternatively - why do we need scan_pci_devices() at all? We're
>>> supposed to be getting the devices reported from Dom0 anyway
>>=20
>> Looks like it is use for building bus2bridge[] which is used for figurin=
g=20
>> out upstream bridges which are needed when assigning non-PCIe devices.
>=20
> Oh, right, I keep forgetting that, especially as that puts under question
> why we have Dom0 report non-extfn, non-virtfn devices at all. And
> perhaps we should issue a warning if Dom0 reports such a device that
> we didn't know about already?
>=20
> Jan



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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 19:23:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 19:23:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCMZc-0003kn-0Q; Fri, 07 Oct 2011 19:23:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCMYp-0003YR-90
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 19:22:52 -0700
X-Env-Sender: netlogic.xen@gmail.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1318040552!50095493!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26431 invoked from network); 8 Oct 2011 02:22:33 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Oct 2011 02:22:33 -0000
Received: by yxt3 with SMTP id 3so6777062yxt.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 19:22: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
	:content-type; bh=28Rt7sJfN9a5KAyueQEHtv0Z1xQ278DoilfuxYRQDRI=;
	b=oe9dJ1VjjdYRR8yuLWe6+aX03npt53yHsYZxhlNg2swhBdO9cx0+8BaF9qO3JF/Azb
	nQ5EpCxJ3BpPbp7stXxEmw0HbcqzWw6bjdGPwo3CMLajIy35kKNPSzFFINESoTMBfLm0
	P8P9bHd4qDC3Qpz2avEfGdiBbQQWDYnuNBHRw=
MIME-Version: 1.0
Received: by 10.68.31.199 with SMTP id c7mr18488127pbi.73.1318040562427; Fri,
	07 Oct 2011 19:22:42 -0700 (PDT)
Received: by 10.142.47.20 with HTTP; Fri, 7 Oct 2011 19:22:42 -0700 (PDT)
In-Reply-To: <1317884089.24742.9.camel@dagon.hellion.org.uk>
References: <CAPw52B9wm-2VfRcLRhRBgpjDmgwU5LqNryZ0pLpNALF+eYpitQ@mail.gmail.com>
	<1317884089.24742.9.camel@dagon.hellion.org.uk>
Date: Fri, 7 Oct 2011 19:22:42 -0700
Message-ID: <CAPw52B_-K5Hy+Wo3UnarYoAb85WLhxTb4KtfByMPpL5_g+COVQ@mail.gmail.com>
Subject: Re: [Xen-devel] reg dom0 console
From: Prasad B <netlogic.xen@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="===============0572663692=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0572663692==
Content-Type: multipart/alternative; boundary=bcaec520ecdb85e69804aec03bfd

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

On Wed, Oct 5, 2011 at 11:54 PM, Ian Campbell <Ian.Campbell@citrix.com>wrote:

>  > After a few months of hiatus, we have resumed working on mips port of
> > Xen. We are at the point of booting dom0 userland (init process and
> > its children).
>
> That sounds awesome! Are you close to having any initial patches for
> submission?
>

We are working with 3.4.0 which is really old. So, we would like to run a
few heavyweight applications on Linux, forward port our MIPS changes to
4.1.0 and then submit the patches along with our PV Linux. We are using
2.6.34 Linux kernel and have not been working with pvops interface. So,
there might have to be some collective effort to move our MIPS Linux changes
into the pvops framework.



> > The init process gets spawned and in turn forks off processes to run
> > commands in /etc/rc.d/init.d/rcS. However, the getty process does not
> > seem to run subsequently and hence the login prompt is not displayed.
> > Dom 0 does not use the uart and uses the hvc0 driver.
> >
> > I searched the web for hints and there were suggestions to add
> > directives such as
> >
> > 1:2345:respawn:/sbin/getty 38400 hvc0
> >
> > to /etc/inittab file. But that does not seem to help.
> >
> > Could you please give any pointers to get getty talk to the console
> > driver correctly ?
>
> Do you have something which is creating the actual /dev/hvc0 node? You
> can probably boot with init=/bin/sh in order to get a shell to poke
> around and check this with, run the getty by hand etc.
>

replacing /sbin/init with /bin/sh displays the following output:

"BusyBox v1.14.0 (2009-05-01 15:38:41 PDT) built-in shell (ash)
Enter 'help' for a list of built-in commands.

/bin/sh: can't access tty; job control turned of"

and input/commands could not be fed to the shell.

I had a vague recollection that the busybox inittab syntax was a little
> different to standard sysvinit but google threw up various things which
> suggest that what you've got is OK. Are you maybe in runlevel 1? You
> could try changing the 2345->12345 to be sure. You probably want this
> getty in single user mode anyway. Alternatively lots of example busybox
> configurations I see on google seems to omit the runlevels, which I
> guess means "all"?
>

created an hvc device in /dev and played with different runlevels. But getty
process is either dormant or dead and the cpu_idle() function kicks in.

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

<div class=3D"gmail_quote">On Wed, Oct 5, 2011 at 11:54 PM, Ian Campbell <s=
pan dir=3D"ltr">&lt;<a href=3D"mailto:Ian.Campbell@citrix.com" target=3D"_b=
lank">Ian.Campbell@citrix.com</a>&gt;</span> wrote:<br><blockquote class=3D=
"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rg=
b(204, 204, 204); padding-left: 1ex;">

<div>
&gt; After a few months of hiatus, we have resumed working on mips port of<=
br>
&gt; Xen. We are at the point of booting dom0 userland (init process and<br=
>
&gt; its children).<br>
<br>
</div>That sounds awesome! Are you close to having any initial patches for<=
br>
submission?<br></blockquote><div><br>We are working with 3.4.0 which is rea=
lly old. So, we would like to run a few heavyweight applications on Linux, =
forward port our MIPS changes to 4.1.0 and then submit the patches along wi=
th our PV Linux. We are using 2.6.34 Linux kernel and have not been working=
 with pvops interface. So, there might have to be some collective effort to=
 move our MIPS Linux changes into the pvops framework.<br>

</div><div><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>
&gt; The init process gets spawned and in turn forks off processes to run<b=
r>
&gt; commands in /etc/rc.d/init.d/rcS. However, the getty process does not<=
br>
&gt; seem to run subsequently and hence the login prompt is not displayed.<=
br>
&gt; Dom 0 does not use the uart and uses the hvc0 driver.<br>
&gt;<br>
&gt; I searched the web for hints and there were suggestions to add<br>
&gt; directives such as<br>
&gt;<br>
&gt; 1:2345:respawn:/sbin/getty 38400 hvc0<br>
&gt;<br>
&gt; to /etc/inittab file. But that does not seem to help.<br>
&gt;<br>
&gt; Could you please give any pointers to get getty talk to the console<br=
>
&gt; driver correctly ?<br>
<br>
</div>Do you have something which is creating the actual /dev/hvc0 node? Yo=
u<br>
can probably boot with init=3D/bin/sh in order to get a shell to poke<br>
around and check this with, run the getty by hand etc.<br></blockquote><div=
><br>replacing /sbin/init with /bin/sh displays the following output:<br><b=
r><font size=3D"2">&quot;BusyBox v1.14.0 (2009-05-01 15:38:41 PDT) built-in=
 shell (ash)<br>


Enter &#39;help&#39; for a list of built-in commands.<br>
<br>
/bin/sh: can&#39;t access tty; job control turned of</font>&quot;<br><br>an=
d input/commands could not be fed to the shell.<br><br></div><blockquote cl=
ass=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8ex; border-left: 1px so=
lid rgb(204, 204, 204); padding-left: 1ex;">


I had a vague recollection that the busybox inittab syntax was a little<br>
different to standard sysvinit but google threw up various things which<br>
suggest that what you&#39;ve got is OK. Are you maybe in runlevel 1? You<br=
>
could try changing the 2345-&gt;12345 to be sure. You probably want this<br=
>
getty in single user mode anyway. Alternatively lots of example busybox<br>
configurations I see on google seems to omit the runlevels, which I<br>
guess means &quot;all&quot;?<br></blockquote></div><br>created an hvc devic=
e in /dev and played with different runlevels. But getty process is either =
dormant or dead and the cpu_idle() function kicks in.<br>

--bcaec520ecdb85e69804aec03bfd--


--===============0572663692==
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

--===============0572663692==--


From xen-devel-bounces@lists.xensource.com Fri Oct 07 20:37:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 20:37:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCNik-0005X4-IZ; Fri, 07 Oct 2011 20:37:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCNhl-0005Id-5K
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 20:36:05 -0700
X-Env-Sender: maillists.shan@gmail.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318044933!40977446!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31586 invoked from network); 8 Oct 2011 03:35:35 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Oct 2011 03:35:35 -0000
Received: by pzk34 with SMTP id 34so11345867pzk.8
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 20:35:59 -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=sWBa42qYiS++YpX3IG8Wh1w84Mp957vBBg+CKAon80k=;
	b=j0tAaJSfLYlohCO0p56foKJ8NxUqF/1ld5hHA+LA0Z1/JMOrEX5Hwqa1ZxvhqlncDu
	CfB8m2bvmHjK+acKcgL9/74z1v7y1aLBCrSoDpyIlaqRz9fw8RZNW/0l6o4/NMqjajKq
	4NJgxLCz5HvL/nUowxQKSA/Hv1wvyKJRpJdzs=
MIME-Version: 1.0
Received: by 10.68.39.170 with SMTP id q10mr18436699pbk.96.1318044959677; Fri,
	07 Oct 2011 20:35:59 -0700 (PDT)
Received: by 10.142.154.21 with HTTP; Fri, 7 Oct 2011 20:35:59 -0700 (PDT)
Date: Sat, 8 Oct 2011 11:35:59 +0800
Message-ID: <CAFQ2Z+cSfzqt60Tae7g93uOaAUyBYEaweHpJH9CVb_mWWSbZdw@mail.gmail.com>
From: Haitao Shan <maillists.shan@gmail.com>
To: Keir Fraser <keir@xen.org>, xen-devel@lists.xensource.com
Content-Type: multipart/mixed; boundary=bcaec520e5af9e9bbd04aec14130
Cc: 
Subject: [Xen-devel] [Patch] Fix up Xsave in pv_cpuid()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

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

Hi, Keir,

This patch will fix wrong logic in determining Xsave return value in pv_cpuid().
I am sorry I made some mistakes in my last patch.

Signed-off-by:  Shan Haitao <haitao.shan@intel.com>


diff -r 2dab09bcec81 xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c	Sun Sep 18 00:25:57 2011 +0100
+++ b/xen/arch/x86/traps.c	Sat Oct 08 04:24:40 2011 +0800
@@ -768,16 +768,18 @@ static void pv_cpuid(struct cpu_user_reg

     if ( current->domain->domain_id != 0 )
     {
+        unsigned int cpuid_leaf = a, sub_leaf = c;
+
         if ( !cpuid_hypervisor_leaves(a, c, &a, &b, &c, &d) )
             domain_cpuid(current->domain, a, c, &a, &b, &c, &d);

-        switch ( a )
+        switch ( cpuid_leaf )
         {
         case 0xd:
         {
-            unsigned int sub_leaf, _eax, _ebx, _ecx, _edx;
+            unsigned int _eax, _ebx, _ecx, _edx;
             /* EBX value of main leaf 0 depends on enabled xsave features */
-            if ( c == 0 && current->arch.xcr0 )
+            if ( sub_leaf == 0 && current->arch.xcr0 )
             {
                 /* reset EBX to default value first */
                 b = XSTATE_AREA_MIN_SIZE;
@@ -785,8 +787,8 @@ static void pv_cpuid(struct cpu_user_reg
                 {
                     if ( !(current->arch.xcr0 & (1ULL << sub_leaf)) )
                         continue;
-                    domain_cpuid(current->domain, a, c, &_eax, &_ebx, &_ecx,
-                                 &_edx);
+                    domain_cpuid(current->domain, cpuid_leaf, sub_leaf,
+                                 &_eax, &_ebx, &_ecx, &_edx);
                     if ( (_eax + _ebx) > b )
                         b = _eax + _ebx;
                 }

--bcaec520e5af9e9bbd04aec14130
Content-Type: application/octet-stream; name="pv_cpuid_xsave_fix.patch"
Content-Disposition: attachment; filename="pv_cpuid_xsave_fix.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gti1uj7h1

ZGlmZiAtciAyZGFiMDliY2VjODEgeGVuL2FyY2gveDg2L3RyYXBzLmMKLS0tIGEveGVuL2FyY2gv
eDg2L3RyYXBzLmMJU3VuIFNlcCAxOCAwMDoyNTo1NyAyMDExICswMTAwCisrKyBiL3hlbi9hcmNo
L3g4Ni90cmFwcy5jCVNhdCBPY3QgMDggMDQ6MjQ6NDAgMjAxMSArMDgwMApAQCAtNzY4LDE2ICs3
NjgsMTggQEAgc3RhdGljIHZvaWQgcHZfY3B1aWQoc3RydWN0IGNwdV91c2VyX3JlZwogCiAgICAg
aWYgKCBjdXJyZW50LT5kb21haW4tPmRvbWFpbl9pZCAhPSAwICkKICAgICB7CisgICAgICAgIHVu
c2lnbmVkIGludCBjcHVpZF9sZWFmID0gYSwgc3ViX2xlYWYgPSBjOworCiAgICAgICAgIGlmICgg
IWNwdWlkX2h5cGVydmlzb3JfbGVhdmVzKGEsIGMsICZhLCAmYiwgJmMsICZkKSApCiAgICAgICAg
ICAgICBkb21haW5fY3B1aWQoY3VycmVudC0+ZG9tYWluLCBhLCBjLCAmYSwgJmIsICZjLCAmZCk7
CiAKLSAgICAgICAgc3dpdGNoICggYSApCisgICAgICAgIHN3aXRjaCAoIGNwdWlkX2xlYWYgKQog
ICAgICAgICB7CiAgICAgICAgIGNhc2UgMHhkOgogICAgICAgICB7Ci0gICAgICAgICAgICB1bnNp
Z25lZCBpbnQgc3ViX2xlYWYsIF9lYXgsIF9lYngsIF9lY3gsIF9lZHg7CisgICAgICAgICAgICB1
bnNpZ25lZCBpbnQgX2VheCwgX2VieCwgX2VjeCwgX2VkeDsKICAgICAgICAgICAgIC8qIEVCWCB2
YWx1ZSBvZiBtYWluIGxlYWYgMCBkZXBlbmRzIG9uIGVuYWJsZWQgeHNhdmUgZmVhdHVyZXMgKi8K
LSAgICAgICAgICAgIGlmICggYyA9PSAwICYmIGN1cnJlbnQtPmFyY2gueGNyMCApCisgICAgICAg
ICAgICBpZiAoIHN1Yl9sZWFmID09IDAgJiYgY3VycmVudC0+YXJjaC54Y3IwICkKICAgICAgICAg
ICAgIHsKICAgICAgICAgICAgICAgICAvKiByZXNldCBFQlggdG8gZGVmYXVsdCB2YWx1ZSBmaXJz
dCAqLwogICAgICAgICAgICAgICAgIGIgPSBYU1RBVEVfQVJFQV9NSU5fU0laRTsKQEAgLTc4NSw4
ICs3ODcsOCBAQCBzdGF0aWMgdm9pZCBwdl9jcHVpZChzdHJ1Y3QgY3B1X3VzZXJfcmVnCiAgICAg
ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoICEoY3VycmVudC0+YXJjaC54
Y3IwICYgKDFVTEwgPDwgc3ViX2xlYWYpKSApCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgZG9tYWluX2NwdWlkKGN1cnJlbnQtPmRvbWFpbiwg
YSwgYywgJl9lYXgsICZfZWJ4LCAmX2VjeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICZfZWR4KTsKKyAgICAgICAgICAgICAgICAgICAgZG9tYWluX2NwdWlkKGN1cnJlbnQtPmRv
bWFpbiwgY3B1aWRfbGVhZiwgc3ViX2xlYWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAmX2VheCwgJl9lYngsICZfZWN4LCAmX2VkeCk7CiAgICAgICAgICAgICAgICAgICAgIGlm
ICggKF9lYXggKyBfZWJ4KSA+IGIgKQogICAgICAgICAgICAgICAgICAgICAgICAgYiA9IF9lYXgg
KyBfZWJ4OwogICAgICAgICAgICAgICAgIH0K
--bcaec520e5af9e9bbd04aec14130
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

--bcaec520e5af9e9bbd04aec14130--


From xen-devel-bounces@lists.xensource.com Fri Oct 07 21:04:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 21: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 1RCO9F-0006ZW-JG; Fri, 07 Oct 2011 21:04:29 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCO6y-0006MJ-JE
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 21:02:32 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318046524!52057!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14536 invoked from network); 8 Oct 2011 04:02:04 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Oct 2011 04:02:04 -0000
X-IronPort-AV: E=Sophos;i="4.68,506,1312156800"; 
   d="scan'208";a="8282783"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Oct 2011 04:01: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; Sat, 8 Oct 2011 05:01:42 +0100
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 1RCO6Y-0000uX-Fh;
	Sat, 08 Oct 2011 04:01:42 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RCO6Y-0005O0-Ed;
	Sat, 08 Oct 2011 05:01:42 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9210-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 8 Oct 2011 05:01:42 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9210: 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 9210 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9210/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      5 xen-boot           fail in 9205 REGR. vs. 9184

Tests which are failing intermittently (not blocking):
 test-i386-i386-pv            10 guest-saverestore            fail pass in 9205
 build-amd64-pvops             4 kernel-build                 fail pass in 9205
 test-i386-i386-xl-win         5 xen-boot                     fail pass in 9205
 test-amd64-i386-xl-win-vcpus1  5 xen-boot            fail in 9205 pass in 9210

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-i386-xl-multivcpu 15 guest-stop                   fail   never pass
 test-amd64-amd64-pv           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-credit2   15 guest-stop                   fail   never pass
 test-i386-i386-xl            15 guest-stop                   fail   never pass
 test-amd64-amd64-pair         1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl           15 guest-stop                   fail   never pass
 test-amd64-amd64-xl-sedf      1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  7 redhat-install               fail   never pass
 test-amd64-i386-rhel6hvm-intel  7 redhat-install               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-win          1 xen-build-check(1)           blocked  n/a
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win       1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-win-vcpus1  7 windows-install              fail  never pass
 test-amd64-amd64-xl-pcipt-intel  8 debian-fixup        fail in 9205 never pass
 test-amd64-amd64-xl          15 guest-stop             fail in 9205 never pass
 test-amd64-i386-xl-credit2    5 xen-boot                fail in 9205 like 9184
 test-amd64-amd64-win         16 leak-check/check       fail in 9205 never pass
 test-i386-i386-xl-win         7 windows-install        fail in 9205 never pass
 test-amd64-amd64-xl-win       7 windows-install        fail in 9205 never pass

version targeted for testing:
 xen                  f051e9973b79
baseline version:
 xen                  7707a2bf2a93

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Keir Fraser <keir@xen.org>
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          pass    
 build-i386-oldkern                                           pass    
 build-amd64-pvops                                            fail    
 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                               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                                            fail    
 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                                        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:   21545:f051e9973b79
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:46:57 2011 +0100
    
    Added signature for changeset fd7c4d4e52d9
    
    
changeset:   21544:b5d76f548ed1
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:46:48 2011 +0100
    
    Added tag 4.0.3-rc3 for changeset fd7c4d4e52d9
    
    
changeset:   21543:fd7c4d4e52d9
tag:         4.0.3-rc3
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:46:32 2011 +0100
    
    Update Xen version to 4.0.3-rc3
    
    
changeset:   21542:7707a2bf2a93
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Mon Oct 03 16:36:09 2011 +0100
    
    build: fix grep invocation in cc-options
    
    Currently the build produces lots of
            Usage: grep [OPTION]... PATTERN [FILE]...
            Try `grep --help' for more information.
    
    This is due to the "grep -- $(2)" in cc-options. It seems that the
    default of reading stdin is disabled when using "--". I don't know if
    this is a bug in grep or how it is supposed to be but we can work
    around it by explicitly passing in "-"
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   23898:3d1664cc9e45
    xen-unstable date:        Fri Sep 30 21:17:47 2011 +0100
    
    
(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 Fri Oct 07 22:11:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 22:11:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCPBs-0000WP-0Q; Fri, 07 Oct 2011 22:11:16 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCPBK-0000JF-E8
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 22:10:42 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1318050638!34424053!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21568 invoked from network); 8 Oct 2011 05:10:39 -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;
	8 Oct 2011 05:10:39 -0000
X-IronPort-AV: E=Sophos;i="4.68,507,1312156800"; 
   d="scan'208";a="8283132"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Oct 2011 05:10: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; Sat, 8 Oct 2011 06:10:38 +0100
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 1RCPBG-0001Ho-Df;
	Sat, 08 Oct 2011 05:10:38 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RCPBF-0002OW-TF;
	Sat, 08 Oct 2011 06:10:38 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9215-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 8 Oct 2011 06:10:37 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9215: 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 9215 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9215/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail pass in 9206
 build-amd64-oldkern           4 xen-build            fail in 9206 pass in 9215

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-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                  3f8fb62436e6
baseline version:
 xen                  460b613596fa

------------------------------------------------------------
People who touched revisions under test:
  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


Pushing revision :

+ branch=xen-4.1-testing
+ revision=3f8fb62436e6
+ . 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 3f8fb62436e6
+ branch=xen-4.1-testing
+ revision=3f8fb62436e6
+ . 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 3f8fb62436e6 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 3 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 Fri Oct 07 23:41:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 23: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 1RCQal-0002lz-5L; Fri, 07 Oct 2011 23:41:03 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCQa1-0002Zc-10
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 23:40:17 -0700
X-Env-Sender: jmdebruin@xmsnet.nl
X-Msg-Ref: server-15.tower-174.messagelabs.com!1318056013!28086422!1
X-Originating-IP: [217.149.192.65]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23766 invoked from network); 8 Oct 2011 06:40:13 -0000
Received: from smtp10.mail.sp.isp-net.nl (HELO smtp10.mail.sp.isp-net.nl)
	(217.149.192.65) by server-15.tower-174.messagelabs.com with SMTP;
	8 Oct 2011 06:40:13 -0000
Received: from [10.10.1.6] by smtp10.mail.sp.isp-net.nl
	via [92.254.124.152] with ESMTP
	id p986dYwe029187 (8.13.2/2.04); Sat, 8 Oct 2011 08:39:35 +0200 (MEST)
Message-ID: <4E8FF025.6090807@xmsnet.nl>
Date: Sat, 08 Oct 2011 08:39:33 +0200
From: Hans de Bruin <jmdebruin@xmsnet.nl>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.21) Gecko/20110903 Thunderbird/3.1.13
MIME-Version: 1.0
To: James Harper <james.harper@bendigoit.com.au>
Subject: Re: [Xen-devel] Limits on mtu size ?
References: <4E8F3F61.9070401@xmsnet.nl>
	<AEC6C66638C05B468B556EA548C1A77D01E5E424@trantor>
In-Reply-To: <AEC6C66638C05B468B556EA548C1A77D01E5E424@trantor>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Language-Detected: en
X-Spam-Scanned: InterNLnet Mail Scan System V2.03
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 10/08/2011 12:29 AM, James Harper wrote:
 >>
 >> Network performance on fast physical networks usually increase by
 >> switching to larger packet sizes. So I decided to increase the mtu on
...
 > Dom0 feels sluggish.

This was a wrong  dns setting.

  So 16436 is to big and 9000
 > is not?
 >>
 >> I have attached the complaints of darkstar. Its running out of kernel
 >> memory?
 >>
 >
 > If all the hosts are Linux and GSO is enabled, the machines should be
 > exchanging 64K packets anyway, regardless of MTU.
 >

I should have read this http://lwn.net/Articles/188489/

-- 
Hans

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

From xen-devel-bounces@lists.xensource.com Fri Oct 07 23:55:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 07 Oct 2011 23:55:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCQoU-0003aR-KR; Fri, 07 Oct 2011 23:55:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCQnx-0003O7-Mi
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 23:54:42 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1318056857!43579941!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18648 invoked from network); 8 Oct 2011 06:54:17 -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;
	8 Oct 2011 06:54:17 -0000
X-IronPort-AV: E=Sophos;i="4.68,507,1312156800"; 
   d="scan'208";a="8283384"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Oct 2011 06:54: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; Sat, 8 Oct 2011 07:54:38 +0100
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 1RCQnt-0001t8-NQ;
	Sat, 08 Oct 2011 06:54:37 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RCQnt-0001K5-L3;
	Sat, 08 Oct 2011 07:54:37 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9224-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 8 Oct 2011 07:54:37 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9224: 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 9224 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9224/

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-xl-sedf     14 guest-localmigrate/x10       fail    like 9203
 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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  0c2bfd1f9c68
baseline version:
 xen                  eb8637351535

------------------------------------------------------------
People who touched revisions under test:
  "Kay, Allen M" <allen.m.kay@intel.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.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=0c2bfd1f9c68
+ . 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 0c2bfd1f9c68
+ branch=xen-unstable
+ revision=0c2bfd1f9c68
+ . 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 0c2bfd1f9c68 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 4 changesets with 5 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 Oct 08 00:17:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 08 Oct 2011 00:17:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCR9n-0004Rl-Ch; Sat, 08 Oct 2011 00:17:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCR8g-0004FH-VF
	for xen-devel@lists.xensource.com; Sat, 08 Oct 2011 00:16:08 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-15.tower-174.messagelabs.com!1318058163!28088194!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24653 invoked from network); 8 Oct 2011 07:16:03 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-15.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 8 Oct 2011 07:16:03 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1318058163; l=1356;
	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=vhvma0bmKAn9IgCHU3JK9dTyd08=;
	b=koFypRDY5BF/NJM2GTixkEXl9Mlp1Q8fp6pNJpwM5MCJLXfxDzyQ/2o9WggRedQRJ1z
	NdDSTO1Jzg+5lo/pe7gQ4q3twv9p8op9a95yQ1WEh54QEXoudku+avZeZYBhyCcjk5ZKu
	bAnsPv8QGytTvWX7ktWXlSubFAIXWy/vSsw=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmwtM48/ll2c7qE0bd
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-084-057-080-115.pools.arcor-ip.net [84.57.80.115])
	by smtp.strato.de (jimi mo35) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id a05d47n986Qttu
	for <xen-devel@lists.xensource.com>;
	Sat, 8 Oct 2011 09:15:43 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 6D9F118890
	for <xen-devel@lists.xensource.com>;
	Sat,  8 Oct 2011 09:15:36 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f67616df0e0891ddddba3cbe4e7db816816abf0d
Message-Id: <f67616df0e0891ddddba.1318058133@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Sat, 08 Oct 2011 09:15:33 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] xenpaging: clear page content after evict
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318005908 -7200
# Node ID f67616df0e0891ddddba3cbe4e7db816816abf0d
# Parent  eec5d0b44f76ebe748a6279f5c847d719bdc72e6
xenpaging: clear page content after evict

If the guest happens to read from the gfn while xenpaging is in the process of
evicting the page, the guest may read zeros instead of actual data.
Also if eviction fails the page content will be corrupted and xenpaging wont
attempt to restore the page.

Remove page scrubbing from pager and do it after successful eviction.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r eec5d0b44f76 -r f67616df0e08 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -455,9 +455,6 @@ static int xenpaging_evict_page(xenpagin
         goto out;
     }
 
-    /* Clear page */
-    memset(page, 0, PAGE_SIZE);
-
     munmap(page, PAGE_SIZE);
 
     /* Tell Xen to evict page */
diff -r eec5d0b44f76 -r f67616df0e08 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -748,6 +748,9 @@ int p2m_mem_paging_evict(struct domain *
     set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, p2m_ram_paged, a);
     audit_p2m(p2m, 1);
 
+    /* Clear content before returning the page to Xen */
+    scrub_one_page(page);
+
     /* Put the page back so it gets freed */
     put_page(page);
 

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

From xen-devel-bounces@lists.xensource.com Sat Oct 08 01:30:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 08 Oct 2011 01:30:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCSIo-0006sb-9w; Sat, 08 Oct 2011 01:30:38 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCSHs-0006fr-N9
	for xen-devel@lists.xensource.com; Sat, 08 Oct 2011 01:29:41 -0700
X-Env-Sender: yunhong.jiang@intel.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318062566!40743395!1
X-Originating-IP: [192.55.52.88]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3909 invoked from network); 8 Oct 2011 08:29:26 -0000
Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88)
	by server-11.tower-27.messagelabs.com with SMTP;
	8 Oct 2011 08:29:26 -0000
Received: from fmsmga001.fm.intel.com ([10.253.24.23])
	by fmsmga101.fm.intel.com with ESMTP; 08 Oct 2011 01:29:35 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,507,1312182000"; 
	d="p7s'?scan'208";a="71506227"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by fmsmga001.fm.intel.com with ESMTP; 08 Oct 2011 01:29:34 -0700
Received: from pgsmsx509.gar.corp.intel.com (172.30.13.17) by
	pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Sat, 8 Oct 2011 16:29:15 +0800
Received: from shsmsx602.ccr.corp.intel.com (10.239.4.104) by
	PGSMSX509.gar.corp.intel.com (172.30.13.17) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Sat, 8 Oct 2011 16:29:16 +0800
Received: from shsmsx501.ccr.corp.intel.com ([10.239.4.141]) by
	SHSMSX602.ccr.corp.intel.com ([10.239.4.104]) with mapi; Sat, 8 Oct 2011
	16:29:13 +0800
From: "Jiang, Yunhong" <yunhong.jiang@intel.com>
To: "JBeulich@suse.com" <JBeulich@suse.com>, "Liu, Jinsong"
	<jinsong.liu@intel.com>
Date: Sat, 8 Oct 2011 16:29:13 +0800
Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Topic: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Index: Acx/Qhd6SSxYVjF3SFeFyfeM4atJZAGTM3kQ
Message-ID: <789F9655DD1B8F43B48D77C5D306597312D23D3B7D@shsmsx501.ccr.corp.intel.com>
References: <BC00F5384FCFC9499AF06F92E8B78A9E263B557B77@shsmsx502.ccr.corp.intel.com>
	<4E84ADF70200007800058882@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D2366A9B@shsmsx501.ccr.corp.intel.com>
	<4E858AF30200007800058A64@nat28.tlf.novell.com>
In-Reply-To: <4E858AF30200007800058A64@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: "keir.xen@gmail.com" <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>
Content-Type: multipart/mixed; boundary="===============0287395383=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0287395383==
Content-Language: en-US
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature";
	micalg=SHA1; boundary="----=_NextPart_000_000C_01CC85D7.6A0E32C0"

------=_NextPart_000_000C_01CC85D7.6A0E32C0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit



> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]
> Sent: Friday, September 30, 2011 3:25 PM
> To: Liu, Jinsong; Jiang, Yunhong
> Cc: keir.xen@gmail.com; xen-devel@lists.xensource.com
> Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
> 
> >>> On 30.09.11 at 04:51, "Jiang, Yunhong" <yunhong.jiang@intel.com>
wrote:
> 
> >
> >> -----Original Message-----
> >> From: Jan Beulich [mailto:JBeulich@suse.com]
> >> Sent: Thursday, September 29, 2011 11:42 PM
> >> To: Liu, Jinsong
> >> Cc: Keir Fraser; Jiang, Yunhong; xen-devel@lists.xensource.com
> >> Subject: Re: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
> >>
> >> >>> On 29.09.11 at 17:20, "Liu, Jinsong" <jinsong.liu@intel.com> wrote:
> >> > @@ -782,8 +821,12 @@ static void intel_default_mce_uhandler(
> >> >
> >> >      switch (type)
> >> >      {
> >> > -    /* Panic if no handler for SRAR error */
> >> >      case intel_mce_ucr_srar:
> >> > +        if ( !guest_mode(regs) )
> >> > +            *result = MCER_RESET;
> >> > +        else
> >> > +            *result = MCER_CONTINUE;
> >> > +        break;
> >> >      case intel_mce_fatal:
> >> >          *result = MCER_RESET;
> >> >          break;
> >>
> >> Using the stack based registers for any decision in an MCE handler
> >> seems bogus to me - without knowing that the error occurred
> >> synchronously, the result is meaningless. Unfortunately I wasn't
> >
> > I think the usage of stack in MCE handler should be case by case.
> > For example, it's ok to use it at data load instruction since the EIPV
is
> > valid for it.
> 
> According to the table in the manual, this is only the case on the local
> thread.

Sorry for long delay response because of china holiday
.
That's about the so-called "affected processors". For the un-affected
processor, it should not be impact.
But current patch does not handle the share bank situation correctly and
need some changes. According to the SDM, only affected processor should
clear the bank, un-affected process should not clear it, current patch does
not handle such situation.

> 
> > For the instruction load, not that sure and I will check it internally.
> >
> > But agree that we should not do this depends on the error type (like
SRAR),
> > but should depends on the specific error code.
> >
> >> able to spot - throughout your patch - what SRAR actually stands
> >> for, and the manual is no help in that respect either. It does state,
> >> however, that EIPV in three of four cases would be clear for these,
> >> so using the registers on stack is likely wrong here.
> >>
> >> This made me look at the current source, and there I see in
> >> mce_urgent_action()
> >>
> >>     if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))
> >>         return -1;
> >>
> >> which I think should say ... _EIPV and use || instead. Thoughts?
> >
> > I think this code means, if the error happens in hypervisor mode (i.e.
> > !guest_mode()), and RIPV indicate the RIP in stack can't be restarted,
we
> > have to panic.
> 
> Then the guest_mode() check still lacks an extra check of EIPV, like
> 
>      if ( !(gstatus & MCG_STATUS_RIPV) &&
>           (!(gstatus & MCG_STATUS_EIPV) || !guest_mode(regs)))
>          return -1;
> 

The RIPV is not related to the EIPV. RIPV means the context saved in the
stack can't be restarted anymore. According to the SDM, RIPV means
"execution can be restarted reliably at the instruction pointed to by the
instruction pointer pushed on the stack". It's not about error happened
synchronously or asynchronously. The point is, if the program is running in
hypervisor context, and RIPV tells us that the program can't be restarted,
we can't do anything but panic, because we can't switch context while we are
in xen. So this code have nothing to do with EIPV. 

If Xen is pre-emptible and can be switched to a new context, possibly
sometimes (like in shadow handling) we can switch to a new context and don't
need such detection, but at least currently we don't want to involve so
complex handling. 

The boundary condition of syscall/sysret is something interesting. If a
Instruction Fetch Error happens in hypervisor's syscall entry point, it will
cause system panic because in the end, we should find it's a xen page broken
by checking the MCi_ADDR MSR. And if guest's sysret rip is broken, it will
overkill xen hypervisor for a guest error. But possibly the handling result
is acceptable considering the low possibility and there is no potential data
pollution.
 
Thanks
--jyh
> Jan


------=_NextPart_000_000C_01CC85D7.6A0E32C0
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
9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTExMTAwODA4MjkxM1owIwYJKoZIhvcNAQkEMRYEFEmU2F3n
84nnrpRTlDYLfmQr2A5jMHMGCSsGAQQBgjcQBDFmMGQwVjELMAkGA1UEBhMCVVMxGjAYBgNVBAoT
EUludGVsIENvcnBvcmF0aW9uMSswKQYDVQQDEyJJbnRlbCBFeHRlcm5hbCBCYXNpYyBJc3N1aW5n
IENBIDNCAgoyudBoAAEAAHj9MHUGCyqGSIb3DQEJEAILMWagZDBWMQswCQYDVQQGEwJVUzEaMBgG
A1UEChMRSW50ZWwgQ29ycG9yYXRpb24xKzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElz
c3VpbmcgQ0EgM0ICCjK50GgAAQAAeP0wgbcGCSqGSIb3DQEJDzGBqTCBpjALBglghkgBZQMEASow
CwYJYIZIAWUDBAEWMAoGCCqGSIb3DQMHMAsGCWCGSAFlAwQBAjAOBggqhkiG9w0DAgICAIAwBwYF
Kw4DAgcwDQYIKoZIhvcNAwICAUAwDQYIKoZIhvcNAwICASgwBwYFKw4DAhowCwYJYIZIAWUDBAID
MAsGCWCGSAFlAwQCAjALBglghkgBZQMEAgEwCgYIKoZIhvcNAgUwDQYJKoZIhvcNAQEBBQAEggEA
A5qkAHF8ACvjhDZBTFhMZFu4X0xbS0Bij78N/SxRXfogekLSQOFp0+NIN0wBtWSCI5t9HDKoW19z
BpTszE6TMwTSEitzEU7qV/gc1XjfJD4q/RqCvz0/HXG1vPqyst1LyyVe2WPv7GY1nfF5fK3NZL10
ViU/BqeKywrc2hsMqz9Pfv2dQ2oH4wb/Dtwn/dRemXlui5DXN3dayzU+0CnjaasVgidTvECD7usI
tSRMpM4NYJcOlVlui9Ko2k2r5dR5B2p3vIwnsAmGmVwx0YUHLVrqSFhCrS11KFKM+dnyOvM8OCFP
56XUa/zg5wRENqEC+I608qbg5NPWUE6bVpLjxwAAAAAAAA==

------=_NextPart_000_000C_01CC85D7.6A0E32C0--


--===============0287395383==
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

--===============0287395383==--


From xen-devel-bounces@lists.xensource.com Sat Oct 08 02:06:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 08 Oct 2011 02:06:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCSrt-0008GV-Mq; Sat, 08 Oct 2011 02:06:53 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCSqL-00083b-5Y
	for xen-devel@lists.xensource.com; Sat, 08 Oct 2011 02:05:35 -0700
X-Env-Sender: yunhong.jiang@intel.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1318064712!30748974!1
X-Originating-IP: [134.134.136.24]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10340 invoked from network); 8 Oct 2011 09:05:13 -0000
Received: from mga09.intel.com (HELO mga09.intel.com) (134.134.136.24)
	by server-5.tower-174.messagelabs.com with SMTP;
	8 Oct 2011 09:05:13 -0000
Received: from orsmga001.jf.intel.com ([10.7.209.18])
	by orsmga102.jf.intel.com with ESMTP; 08 Oct 2011 02:05:11 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,352,1309762800"; 
	d="p7s'?scan'208";a="60479834"
Received: from pgsmsx601.gar.corp.intel.com ([10.221.43.69])
	by orsmga001.jf.intel.com with ESMTP; 08 Oct 2011 02:05:10 -0700
Received: from pgsmsx103.gar.corp.intel.com (10.221.44.82) by
	pgsmsx601.gar.corp.intel.com (10.221.43.69) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Sat, 8 Oct 2011 17:05:10 +0800
Received: from shsmsx602.ccr.corp.intel.com (10.239.4.104) by
	PGSMSX103.gar.corp.intel.com (10.221.44.82) with Microsoft SMTP Server
	(TLS) id 14.1.323.3; Sat, 8 Oct 2011 17:05:09 +0800
Received: from shsmsx501.ccr.corp.intel.com ([10.239.4.141]) by
	SHSMSX602.ccr.corp.intel.com ([10.239.4.104]) with mapi; Sat, 8 Oct 2011
	17:05:07 +0800
From: "Jiang, Yunhong" <yunhong.jiang@intel.com>
To: "JBeulich@suse.com" <JBeulich@suse.com>, "Liu, Jinsong"
	<jinsong.liu@intel.com>
Date: Sat, 8 Oct 2011 17:05:05 +0800
Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Topic: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Index: AcyExJRvS8PfpDNWQViD7Uz0eTT9JgA1ERxw
Message-ID: <789F9655DD1B8F43B48D77C5D306597312D23D3BB8@shsmsx501.ccr.corp.intel.com>
References: <BC00F5384FCFC9499AF06F92E8B78A9E263B557B77@shsmsx502.ccr.corp.intel.com>
	<4E84ADF70200007800058882@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D2366A9B@shsmsx501.ccr.corp.intel.com>
	<4E858AF30200007800058A64@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F02@shsmsx502.ccr.corp.intel.com>
	<4E8592A60200007800058AD4@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F40@shsmsx502.ccr.corp.intel.com>
	<4E859D7F0200007800058B39@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F7C@shsmsx502.ccr.corp.intel.com>
	<4E85B09F0200007800058B7B@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E263B557F90@shsmsx502.ccr.corp.intel.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E264E34D85F@shsmsx502.ccr.corp.intel.com>
	<4E8EC9940200007800059E47@nat28.tlf.novell.com>
In-Reply-To: <4E8EC9940200007800059E47@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: "keir.xen@gmail.com" <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>
Content-Type: multipart/mixed; boundary="===============1828338143=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1828338143==
Content-Language: en-US
Content-Type: multipart/signed; protocol="application/x-pkcs7-signature";
	micalg=SHA1; boundary="----=_NextPart_000_001D_01CC85DC.6CFDE660"

------=_NextPart_000_001D_01CC85DC.6CFDE660
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit



> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]
> Sent: Friday, October 07, 2011 3:43 PM
> To: Liu, Jinsong; Jiang, Yunhong
> Cc: keir.xen@gmail.com; xen-devel@lists.xensource.com
> Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
> 
> >>> On 06.10.11 at 20:40, "Liu, Jinsong" <jinsong.liu@intel.com> wrote:
> > Liu, Jinsong wrote:
> >> Liu, Jinsong wrote:
> >>> Jan Beulich wrote:
> >>>>>>> On 30.09.11 at 11:42, "Liu, Jinsong" <jinsong.liu@intel.com>
> >>>>>>> wrote:
> >>>>> Jan Beulich wrote:
> >>>>>>>>> On 30.09.11 at 10:21, "Liu, Jinsong" <jinsong.liu@intel.com>
> >>>>>>>>> wrote:
> >>>>>>> Executing guest code will not satisfy the check
> >>>>>>> if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))
> 	return
> >>>>>>> -1; so it would not panic system.
> >>>>>>
> >>>>>> Exactly. But it should when the prefetch was to hypervisor code.
> >>>>>>
> >>>>>
> >>>>> Wouldn't processor refresh instruction prefetch queue under such
> >>>>> case?
> >>>>
> >>>> That's a question that you are better positioned to answer than me.
> >>>> But the SRAR errors being a sub-category of uncorrected errors I
> >>>> would think it can't be that simple.
> >>>>
> >>>
> >>> Hmm, I will check this question internally first.
> >>> BTW, we would have 7 days holiday (1/10 ~ 7/10), so email reply
> >>> maybe some slow.
> >>>
> >>> Thanks,
> >>> Jinsong
> >>
> >> Ah, just think our talking context: the prefetched instruction would
> >> have been flushed since we now at mce exception context. So I think
> >> no need to overkill here, just let guest handle it --> who own, who
> >> take.
> >>
> >> Thanks,
> >> Jinsong
> >
> > Jan,
> >
> > Do you think following is OK?
> >
> > if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))
> >     return -1;
> 
> That's what we have currently, and as I said earlier I don't think using
> the result of guest_mode() for any decision is valid when the EIPV bit
> is clear.

guest_mode() should be ok to be used together with RIPV, since RIPV is
talking about the RIP in the stack.

Thanks
--jyh

> 
> Jan
> 
> > Thanks,
> > Jinsong
> 
> 


------=_NextPart_000_001D_01CC85DC.6CFDE660
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
9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTExMTAwODA5MDUwNVowIwYJKoZIhvcNAQkEMRYEFFhkhM2F
FATH4AxoDqjXMZmfp/1OMHMGCSsGAQQBgjcQBDFmMGQwVjELMAkGA1UEBhMCVVMxGjAYBgNVBAoT
EUludGVsIENvcnBvcmF0aW9uMSswKQYDVQQDEyJJbnRlbCBFeHRlcm5hbCBCYXNpYyBJc3N1aW5n
IENBIDNCAgoyudBoAAEAAHj9MHUGCyqGSIb3DQEJEAILMWagZDBWMQswCQYDVQQGEwJVUzEaMBgG
A1UEChMRSW50ZWwgQ29ycG9yYXRpb24xKzApBgNVBAMTIkludGVsIEV4dGVybmFsIEJhc2ljIElz
c3VpbmcgQ0EgM0ICCjK50GgAAQAAeP0wgbcGCSqGSIb3DQEJDzGBqTCBpjALBglghkgBZQMEASow
CwYJYIZIAWUDBAEWMAoGCCqGSIb3DQMHMAsGCWCGSAFlAwQBAjAOBggqhkiG9w0DAgICAIAwBwYF
Kw4DAgcwDQYIKoZIhvcNAwICAUAwDQYIKoZIhvcNAwICASgwBwYFKw4DAhowCwYJYIZIAWUDBAID
MAsGCWCGSAFlAwQCAjALBglghkgBZQMEAgEwCgYIKoZIhvcNAgUwDQYJKoZIhvcNAQEBBQAEggEA
XQyXK6BHGF191V+7BZijquvDTyfR2BKSzcaFzWkGMJ3lD6eFpN4EM7msf22xGqA9uc1tyydsfWRh
Oo8otgZV+D08j2SMwfA3Y2k3E6+s70sK466jHXMoNAxy0bCYA72EBm0b9cbaVkP7UfjLZhgX+pt0
4ccfZJQmfjytdf2q+6XyTriYnGKydM68aCViWa38rJ3WDGbf3/94k3wMOl6VczobCoEpySRFwudb
QclqaOK4FkHqErLSBqncURIp/Il3md7SFKuxwkDDWOOf8gj2Cu1OXn81BEOoxudngNVOQqk31W0x
qABuM2k5Y2sbmz+2dFSFij9+5xKx/oUYX68acgAAAAAAAA==

------=_NextPart_000_001D_01CC85DC.6CFDE660--


--===============1828338143==
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

--===============1828338143==--


From xen-devel-bounces@lists.xensource.com Sat Oct 08 03:22:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 08 Oct 2011 03:22:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCU2f-0001jH-V9; Sat, 08 Oct 2011 03:22:05 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCU0z-0001V6-TN
	for xen-devel@lists.xensource.com; Sat, 08 Oct 2011 03:20:23 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318069218!188738!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31495 invoked from network); 8 Oct 2011 10:20:18 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Oct 2011 10:20:18 -0000
X-IronPort-AV: E=Sophos;i="4.68,507,1312156800"; 
   d="scan'208";a="8284043"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Oct 2011 10:20: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; Sat, 8 Oct 2011 11:20:18 +0100
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 1RCU0v-0002zv-Qf;
	Sat, 08 Oct 2011 10:20:17 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RCU0v-0003vl-J9;
	Sat, 08 Oct 2011 11:20:17 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9233-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 8 Oct 2011 11:20:17 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9233: 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 9233 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9233/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-win       5 xen-boot                     fail pass in 9205
 test-amd64-amd64-xl-sedf      5 xen-boot             fail in 9205 pass in 9233
 test-amd64-i386-xl-win-vcpus1  5 xen-boot            fail in 9205 pass in 9233

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-i386-i386-xl            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-amd64-amd64-xl-sedf     15 guest-stop                   fail   never pass
 test-amd64-i386-xl-credit2    5 xen-boot                     fail    like 9184
 test-amd64-i386-rhel6hvm-amd  7 redhat-install               fail   never pass
 test-amd64-i386-rhel6hvm-intel  7 redhat-install               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-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 in 9205 never pass

version targeted for testing:
 xen                  f051e9973b79
baseline version:
 xen                  7707a2bf2a93

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.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                                          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=f051e9973b79
+ . 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 f051e9973b79
+ branch=xen-4.0-testing
+ revision=f051e9973b79
+ . 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 f051e9973b79 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 3 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 Oct 08 05:05:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 08 Oct 2011 05:05:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCVfD-0005RQ-K7; Sat, 08 Oct 2011 05:05:59 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCVeU-0005Fk-EI
	for xen-devel@lists.xensource.com; Sat, 08 Oct 2011 05:05:14 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318075511!211641!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5167 invoked from network); 8 Oct 2011 12:05:11 -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 Oct 2011 12:05:11 -0000
X-IronPort-AV: E=Sophos;i="4.68,507,1312156800"; 
   d="scan'208";a="8284557"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	08 Oct 2011 12:05: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; Sat, 8 Oct 2011 13:05:10 +0100
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 1RCVeQ-0003Z1-55;
	Sat, 08 Oct 2011 12:05:10 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RCVeQ-0006gH-3b;
	Sat, 08 Oct 2011 13:05:10 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9234-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 8 Oct 2011 13:05:10 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9234: 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 9234 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9234/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf      7 debian-install               fail pass in 9224
 test-amd64-i386-win-vcpus1   10 guest-saverestore.2          fail pass in 9224
 test-amd64-i386-xl-win-vcpus1 12 guest-localmigrate/x10      fail pass in 9224
 test-amd64-amd64-xl-win      12 guest-localmigrate/x10       fail pass in 9224

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-i386-win          16 leak-check/check             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-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10  fail in 9224 like 9207
 test-amd64-i386-win-vcpus1   16 leak-check/check       fail in 9224 never pass
 test-amd64-i386-xl-win-vcpus1 13 guest-stop            fail in 9224 never pass
 test-amd64-amd64-xl-win      13 guest-stop             fail in 9224 never pass

version targeted for testing:
 xen                  0c2bfd1f9c68
baseline version:
 xen                  0c2bfd1f9c68

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 Sat Oct 08 06:03:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 08 Oct 2011 06:03:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCWYs-00075X-0Q; Sat, 08 Oct 2011 06:03:30 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCWV7-0006pd-Br
	for xen-devel@lists.xensource.com; Sat, 08 Oct 2011 05:59:57 -0700
X-Env-Sender: silverbottlep@gmail.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318078783!54670383!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29461 invoked from network); 8 Oct 2011 12:59:44 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Oct 2011 12:59:44 -0000
Received: by pzk34 with SMTP id 34so12227407pzk.8
	for <xen-devel@lists.xensource.com>;
	Sat, 08 Oct 2011 05:59:31 -0700 (PDT)
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
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=I1gocqCMZxMaTr89FTNVm419FDb8rbEpPdOgCRpa6v4=;
	b=mIyTFl1mF10f+5AJKdr9QrWdQbGj/pKMmOGhJ/FiAxQs7crum2dbKophbPQ2SX2zF1
	MC/SMKToyKsJ/zpUSLUL3xiuutcf7GUpDjLOhX8hhHBlkNLFECwwkb5S0lbwU47mR/NW
	MpWYyfI8CADNw45nCy9R9ELxnJpwiRPi69fho=
Received: by 10.68.40.234 with SMTP id a10mr21495688pbl.120.1318078771698;
	Sat, 08 Oct 2011 05:59:31 -0700 (PDT)
Received: from [218.232.129.67] ([218.232.129.67])
	by mx.google.com with ESMTPS id e7sm42865266pbq.1.2011.10.08.05.59.29
	(version=SSLv3 cipher=OTHER); Sat, 08 Oct 2011 05:59:31 -0700 (PDT)
Message-ID: <4E904936.5090102@gmail.com>
Date: Sat, 08 Oct 2011 21:59:34 +0900
From: Eunbyung Park <silverbottlep@gmail.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: George Dunlap <george.dunlap@citrix.com>
Subject: Re: [Xen-devel] cap and reservation functionality in the credit2
	scheduler?
References: <4E8BE083.3080000@gmail.com>
	<CAFLBxZac-6oHaKdeO_kYJ1Y0Fns9xWTt5tyd1BBx0DpvFPk1Dw@mail.gmail.com>
	<4E8C3AAC.3070206@gmail.com> <1317909439.15843.33.camel@elijah>
In-Reply-To: <1317909439.15843.33.camel@elijah>
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


> I hope that doesn't sound too harsh, but the fact is that the scheduler
> is probably one of the most deceptively simple parts of the Xen code.
> It requires a lot of expertise to know even how to avoid race conditions
> and deadlock, not to mention making a simple algorithm which has the
> desired effects without undesirable side effects.  (The shadow code is
> probably more complicated, for example, but it *looks* more complicated,
> so people don't end up in over their head.)  I wouldn't be doing either
> you or me a favor by encouraging you to work on something past your
> capability level.
It was too harsh comments. just kidding~~:)

Anyway, nowadays, I am working on the project which is related with the 
xen scheduler. Actually, I do not have enough expertise yet, however, I 
am very interested and excited at the xen source code and I am a little 
bit more getting used to it. I hope that I would completely understand 
the all of the mechanisms soon and hack the xen source.

Thanks, george.

--
Best Regards,
Eunbyung Park

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

From xen-users-bounces@lists.xensource.com Sat Oct 08 12:28:58 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 08 Oct 2011 12:28:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCcZu-0002nc-8S; Sat, 08 Oct 2011 12:28:58 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCcYe-0002T8-Ai
	for xen-users@lists.xensource.com; Sat, 08 Oct 2011 12:27:40 -0700
X-Env-Sender: donduq@i2pmail.org
X-Msg-Ref: server-4.tower-27.messagelabs.com!1318102036!43640546!1
X-Originating-IP: [82.103.129.142]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11271 invoked from network); 8 Oct 2011 19:27:16 -0000
Received: from e82-103-129-142s.easyspeedy.com (HELO b.mx.i2pmail.org)
	(82.103.129.142) by server-4.tower-27.messagelabs.com with SMTP;
	8 Oct 2011 19:27:16 -0000
X-Mailer: smtp.postman.i2p - Official I2P Mailer
From: "D. Duckworth" <donduq@i2pmail.org>
To: xen-users@lists.xensource.com, xen-devel@lists.xensource.com
Subject: Re: [Xen-users] XEN - networking and performance
In-Reply-To: <20111006203821.CD70CE9342@kermit.internecto.net>
References: <20111006203821.CD70CE9342@kermit.internecto.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Message-Id: <20111008190701.21336AE08F@smtp.postman.i2p>
Date: Sat,  8 Oct 2011 19:07:01 +0000 (UTC)
Cc: 
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

Salutations,

=46rom the xen-users list:
> I would like some advice from people how are/were using  Xen 3.4.2 -
> it should be a rather stable release. Dom0 is CentOS 5.5 64bit with
> Xen 3.4.2 installed with the default settings (minus cpu pinning to
> Dom0 and memory setup for 2GB). There are 2 built-in nics (Broadcom)
> and an add-on network card (Intel) with another 4 nics. Currently
> only one NIC is used for all network access, and as far as
> networking, the default setings are used - xend-config.sxp:
> (network-script network-bridge) (vif-script vif-bridge)
>=20
> The questions are:
>=20
> How can I improve the network performance (now all the VM are sharing
> one bridge):
>=20
> a. creating multiple bridges and assigning a VM (DomU) per bridge
> b. trying to hide the NICs from Dom0 using something like "pciback
> hide" - (pointers/example of how one would do this in Centos 5.5
> would be highly appreciated...)

Xen Networking has been a thorn in my eye and a similar question has
been with me for a long time now. So prepare, for this response contains
rage.

Xen networking has room for many different approaches, yet the best
thing about its scripts is that they are not mandatory to use. You can
fully adjust the scripts to your needs or even replace them with your
own. You can find modifications on forums and blogs although most of
them just seem to be copies of few suggestions made by few people.
Logical, because quite frankly it's a pain to grope what the Xen
scripts and udev rules really do, let alone grok most of what they
do out of the box.

Right now I just care about creating my ideal networking solution, i.e.
routing, bridging and firewall stuff for vms with different roles. I am
running Xen 4.1.2-rc3-pre non-professionally on a quad core single cpu
1U server. with 4 hard drives in RAID10 configuration. The server has
one usable Ethernet port with multiple globally routable IPs. I can't
use the other ethernet port; the server has no IPMI and the ISP declines
use of two ports by one system because the data center is a no smoking
zone for both humans and routers and switches.

So the highest priority is to reach dom0 from the Internet and
therefore my grub has fallback options, one of which is a boot to Linux
with no Xen. In turn this means that dom0's networking boot scripts
may not depend on Xen at all, and Xen may not change networking in any
way unless specified. My dom0 is a minimal system that only controls vms
and networking. I want dom0 to be small and simple so the obvious
choice is Arch Linux. Dom0 should be separated from the domUs in that
the domUs cannot reach dom0 and one domU (domN) should do all
networking for the other domUs.

I tried to use xl with xen4 for a while but due to bugs and missing
features I had to go back to xm and xend. This is where the fun
begins. In the past I used xend with network-bridge and for some strange
reason (voodoo probably) I blindly accepted that script in the past and
blamed myself for not appreciating it. But let's be blunt and honest:
the scripts, in particular the script that *modifies dom0 networking
during xend startup* is the biggest piece of sh!# idea I have ever seen
in Xen. It creates bridges, takes eth0 down, tortures dom0 with occult
ip addr/route, brctl, sysctl and iptables awk/sed manipulations and then
it has you looking at your screen yearning for the moment that ping
timeouts become ping replies, telling you that your box is reachable
again. This script is a malevolent demon from the sewers of Norman the
Golgothan and the worst part is that network-bridge is also still the
recommended default!

On the more positive side there was a fantastic update in Xen 4 where
network-bridge changed a bit so that "it will not bring a bridge up if
one already exists". Whoever wrote it should get a corporate medal for
that and then a long vacation to a deserted island with an MSX II and
no floppies. How can this even be approved by Xen's senior project
manager, or is that a vacant position?

It surely seems so. Xen's /etc/xen/scripts (another design fail, why
not /usr?) and udev scripts are confusing ad-hoc bloatware routines and
are not transparent at all. With the current xen4 I saw the premature
advice to more or less 'prepare for migration from xm to xl'. Yet, xl
supports less and is conflicting: there is no vifname, no 'xl
new/delete', no more python, no relocation and suddenly there is a
conflict between 'xm start domain' versus 'xl start /etc/xen/domain'.

So new features emerge, adding to the confusion of the end user, while
old problems are not being fixed properly. I wonder why, especially
because it does not seem that xm and xend are the broken parts that
need to be replaced by an unstable interface.

What needs attention first and foremost are two things, first of which
is real and wise effort into one simple, minimal script that just
handles the minimum in a transparent way e.g. control the hypervisor,
manage vms, manage the backend. Of course networking can be done on
domain start too, but this has happen in an entirely different way from
what it does and how it does it. This is so important because it gives
more control to the user that runs Xen. It's also a good moment to
build in proper and mature support for IPv6.

Secondly, the website and documentation should be cleaned up and
revised where appropriate. The current situation is a mess that has
a much too steep and incompatible learning curve right now - for
example, a bridge should just not be named eth0 and a physical device
should not be renamed at all. It's fundamentally wrong, stupid, mad as
hell and a PR failure for Xen to do it this way out of the box. No
matter how often and detailed it has been documented on the website.=20

I propose something like the following for xen networking:

* Xen will not manipulate non-xen devices or a firewall under any
  circumstance, it might only add or substract routes and/or rules from
  the routing tables,
* Allow for networking configuration per domU. For example let
  networking per device be nat, routed, bridged or custom, where
  all name the interface and bring it up; nat only adds the ip to the
  routing table; routed could be an array of routes and rules that need
  to be added or subtracted from various routing tables and it might
  support proxyarp; bridged turns off arp, sets the mac on the vif and
  then adds the interface to a bridge that should already be created by
  the user; and custom is a custom set of unmanaged commands after
  creating and destroying a domain.

I am aware that this can already be done with Xen. However, that
process is quite arbitrary and it does things no one asked for. So one
has to read the scripts. For example with the iptables part of
vif-bridge. It is not handled transparently, it is quite arbitrary and
it automatically executes for all vms that are being started. This leads
you to wonder what more it does without you knowing it...

So, with that off my chest and the second line of my network-bridge
being the words "exit 0" Xen lets my dom0 configuration alone
like it is supposed to do. While KVM is becoming a 'next cool
thing' for many people I would still prefer a separate hypervisor so now
the fat just has to be removed from Xen.


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

From xen-devel-bounces@lists.xensource.com Sat Oct 08 12:30:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 08 Oct 2011 12:30:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCcbf-0003Mh-GA; Sat, 08 Oct 2011 12:30:48 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCcYe-0002T9-Nq
	for xen-devel@lists.xensource.com; Sat, 08 Oct 2011 12:27:41 -0700
X-Env-Sender: donduq@i2pmail.org
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318102057!20328973!1
X-Originating-IP: [82.103.129.142]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2796 invoked from network); 8 Oct 2011 19:27:37 -0000
Received: from e82-103-129-142s.easyspeedy.com (HELO b.mx.i2pmail.org)
	(82.103.129.142) by server-8.tower-182.messagelabs.com with SMTP;
	8 Oct 2011 19:27:37 -0000
X-Mailer: smtp.postman.i2p - Official I2P Mailer
From: "D. Duckworth" <donduq@i2pmail.org>
To: xen-users@lists.xensource.com, xen-devel@lists.xensource.com
In-Reply-To: <20111006203821.CD70CE9342@kermit.internecto.net>
References: <20111006203821.CD70CE9342@kermit.internecto.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Message-Id: <20111008190701.50DFBAE098@smtp.postman.i2p>
Date: Sat,  8 Oct 2011 19:07:01 +0000 (UTC)
Cc: 
Subject: [Xen-devel] Re: [Xen-users] XEN - networking and performance
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Salutations,

=46rom the xen-users list:
> I would like some advice from people how are/were using  Xen 3.4.2 -
> it should be a rather stable release. Dom0 is CentOS 5.5 64bit with
> Xen 3.4.2 installed with the default settings (minus cpu pinning to
> Dom0 and memory setup for 2GB). There are 2 built-in nics (Broadcom)
> and an add-on network card (Intel) with another 4 nics. Currently
> only one NIC is used for all network access, and as far as
> networking, the default setings are used - xend-config.sxp:
> (network-script network-bridge) (vif-script vif-bridge)
>=20
> The questions are:
>=20
> How can I improve the network performance (now all the VM are sharing
> one bridge):
>=20
> a. creating multiple bridges and assigning a VM (DomU) per bridge
> b. trying to hide the NICs from Dom0 using something like "pciback
> hide" - (pointers/example of how one would do this in Centos 5.5
> would be highly appreciated...)

Xen Networking has been a thorn in my eye and a similar question has
been with me for a long time now. So prepare, for this response contains
rage.

Xen networking has room for many different approaches, yet the best
thing about its scripts is that they are not mandatory to use. You can
fully adjust the scripts to your needs or even replace them with your
own. You can find modifications on forums and blogs although most of
them just seem to be copies of few suggestions made by few people.
Logical, because quite frankly it's a pain to grope what the Xen
scripts and udev rules really do, let alone grok most of what they
do out of the box.

Right now I just care about creating my ideal networking solution, i.e.
routing, bridging and firewall stuff for vms with different roles. I am
running Xen 4.1.2-rc3-pre non-professionally on a quad core single cpu
1U server. with 4 hard drives in RAID10 configuration. The server has
one usable Ethernet port with multiple globally routable IPs. I can't
use the other ethernet port; the server has no IPMI and the ISP declines
use of two ports by one system because the data center is a no smoking
zone for both humans and routers and switches.

So the highest priority is to reach dom0 from the Internet and
therefore my grub has fallback options, one of which is a boot to Linux
with no Xen. In turn this means that dom0's networking boot scripts
may not depend on Xen at all, and Xen may not change networking in any
way unless specified. My dom0 is a minimal system that only controls vms
and networking. I want dom0 to be small and simple so the obvious
choice is Arch Linux. Dom0 should be separated from the domUs in that
the domUs cannot reach dom0 and one domU (domN) should do all
networking for the other domUs.

I tried to use xl with xen4 for a while but due to bugs and missing
features I had to go back to xm and xend. This is where the fun
begins. In the past I used xend with network-bridge and for some strange
reason (voodoo probably) I blindly accepted that script in the past and
blamed myself for not appreciating it. But let's be blunt and honest:
the scripts, in particular the script that *modifies dom0 networking
during xend startup* is the biggest piece of sh!# idea I have ever seen
in Xen. It creates bridges, takes eth0 down, tortures dom0 with occult
ip addr/route, brctl, sysctl and iptables awk/sed manipulations and then
it has you looking at your screen yearning for the moment that ping
timeouts become ping replies, telling you that your box is reachable
again. This script is a malevolent demon from the sewers of Norman the
Golgothan and the worst part is that network-bridge is also still the
recommended default!

On the more positive side there was a fantastic update in Xen 4 where
network-bridge changed a bit so that "it will not bring a bridge up if
one already exists". Whoever wrote it should get a corporate medal for
that and then a long vacation to a deserted island with an MSX II and
no floppies. How can this even be approved by Xen's senior project
manager, or is that a vacant position?

It surely seems so. Xen's /etc/xen/scripts (another design fail, why
not /usr?) and udev scripts are confusing ad-hoc bloatware routines and
are not transparent at all. With the current xen4 I saw the premature
advice to more or less 'prepare for migration from xm to xl'. Yet, xl
supports less and is conflicting: there is no vifname, no 'xl
new/delete', no more python, no relocation and suddenly there is a
conflict between 'xm start domain' versus 'xl start /etc/xen/domain'.

So new features emerge, adding to the confusion of the end user, while
old problems are not being fixed properly. I wonder why, especially
because it does not seem that xm and xend are the broken parts that
need to be replaced by an unstable interface.

What needs attention first and foremost are two things, first of which
is real and wise effort into one simple, minimal script that just
handles the minimum in a transparent way e.g. control the hypervisor,
manage vms, manage the backend. Of course networking can be done on
domain start too, but this has happen in an entirely different way from
what it does and how it does it. This is so important because it gives
more control to the user that runs Xen. It's also a good moment to
build in proper and mature support for IPv6.

Secondly, the website and documentation should be cleaned up and
revised where appropriate. The current situation is a mess that has
a much too steep and incompatible learning curve right now - for
example, a bridge should just not be named eth0 and a physical device
should not be renamed at all. It's fundamentally wrong, stupid, mad as
hell and a PR failure for Xen to do it this way out of the box. No
matter how often and detailed it has been documented on the website.=20

I propose something like the following for xen networking:

* Xen will not manipulate non-xen devices or a firewall under any
  circumstance, it might only add or substract routes and/or rules from
  the routing tables,
* Allow for networking configuration per domU. For example let
  networking per device be nat, routed, bridged or custom, where
  all name the interface and bring it up; nat only adds the ip to the
  routing table; routed could be an array of routes and rules that need
  to be added or subtracted from various routing tables and it might
  support proxyarp; bridged turns off arp, sets the mac on the vif and
  then adds the interface to a bridge that should already be created by
  the user; and custom is a custom set of unmanaged commands after
  creating and destroying a domain.

I am aware that this can already be done with Xen. However, that
process is quite arbitrary and it does things no one asked for. So one
has to read the scripts. For example with the iptables part of
vif-bridge. It is not handled transparently, it is quite arbitrary and
it automatically executes for all vms that are being started. This leads
you to wonder what more it does without you knowing it...

So, with that off my chest and the second line of my network-bridge
being the words "exit 0" Xen lets my dom0 configuration alone
like it is supposed to do. While KVM is becoming a 'next cool
thing' for many people I would still prefer a separate hypervisor so now
the fat just has to be removed from Xen.


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

From xen-api-bounces@lists.xensource.com Sat Oct 08 12:47:06 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 08 Oct 2011 12:47:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCcrR-0004Bo-KL; Sat, 08 Oct 2011 12:47:05 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCcrD-00048B-RX; Sat, 08 Oct 2011 12:46:52 -0700
X-Env-Sender: torushikeshj@gmail.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318103206!244943!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9368 invoked from network); 8 Oct 2011 19:46:48 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Oct 2011 19:46:48 -0000
Received: by ggnk4 with SMTP id k4so6390868ggn.30
	for <multiple recipients>; Sat, 08 Oct 2011 12:46:46 -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=Z9aeNEX0Jq3bWRpGh02NNIrUQEoR+Hh6JJzkVBfRIzQ=;
	b=S+QBmy78jvOAKCZeQHFr6A7ob3oiCXbX0QLu/B2VqXquEQpalPTCu9yoinDA+oIkti
	BWn/sz95kdYp5iNiZy479umUSD7FWk4BfZq8pdCXl1AP0UbCAnkEXYZ/KDbfN+WudBjm
	yG0CdhHwCIquVZF/6QOntJEX1Rxl0k4CuSVWY=
MIME-Version: 1.0
Received: by 10.68.74.65 with SMTP id r1mr16109237pbv.87.1318103206221; Sat,
	08 Oct 2011 12:46:46 -0700 (PDT)
Received: by 10.143.90.4 with HTTP; Sat, 8 Oct 2011 12:46:46 -0700 (PDT)
In-Reply-To: <CAP8mzPOOkZ2iUzKkMCC7T+TExPL6osoANQnw1tUREeE=Jx-_BQ@mail.gmail.com>
References: <CAO14VsP9by7CYgSiVN-hY0rJpDk0MYjuJ+FD5Tp3i8w+BcNYHw@mail.gmail.com>
	<4E8024E5.9020406@citrix.com>
	<CAO14VsMXGyNjbgF0PiJ5MLH_HGwMA6M8yN0Z3Vq5e7tE-tW1bw@mail.gmail.com>
	<CAP8mzPOOkZ2iUzKkMCC7T+TExPL6osoANQnw1tUREeE=Jx-_BQ@mail.gmail.com>
Date: Sun, 9 Oct 2011 01:16:46 +0530
Message-ID: <CAO14VsM2GRyCaNU6No06dxyRjSkUmmOjBqm4LMieKXkQmBxtTg@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [Xen-API] FT for XCP
From: R J <torushikeshj@gmail.com>
To: rshriram@cs.ubc.ca
Cc: "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>
Content-Type: multipart/mixed; boundary="===============1197793470=="
Sender: xen-api-bounces@lists.xensource.com
Errors-To: xen-api-bounces@lists.xensource.com

--===============1197793470==
Content-Type: multipart/alternative; boundary=bcaec546918f62583904aeced191

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

Thanks Shriram,

I thought of using the native VM migrate code but in that case I may end up
with corruption either in NW, DIsk or Mem.
The remus page is not updated. http://nss.cs.ubc.ca/remus/hg/ I hope this
project is not stopped.

I'm still learning xen-3.4.2/tools path so hopefully I'll get some direction
which can save from corruption.

Regards,
R J



On Wed, Sep 28, 2011 at 9:38 PM, Shriram Rajagopalan <rshriram@cs.ubc.ca>wrote:

>
>
> On Mon, Sep 26, 2011 at 8:58 AM, R J <torushikeshj@gmail.com> wrote:
>
>> Hello Mike,
>>
>> Thank you for suggestion. I would love to incorporate remus in xapi if
>> thats possible.
>>
>
> Great. That would be certainly welcome. [I am not a fan of ocaml ;)]
>
> Remus as its inbuilt logic of detecting checkpoint failure and taking
>> decisions accordingly.
>>
>> I think there is remus support for xen 3.4
>>
>>
> What matters is the toolstack.
> a. I am not sure if the xe toolstack uses libxenguest (tools/libxc) and
>  if it does, then it should have the basic remus support already.
>
> b. I am also not sure if it is recent enough to include all the remus bug
> fixes that went in over the last 6 months.
>
> What do you suggest as my next step ?
>>
>>
> Most of the remus code is python based and completely self contained. It
> just needs
> the domU's info (disk paths & vifs) as an s-expression. There is only one
> api call to
> Xend- to obtain the domU's s-expression.
>
> 1. A quick and dirty way would be to change this single api call to xapi
> equivalent
> and obtain the s-expression, then you should have Remus running.
>
> 2. Another approach would be to re-write the toolstack code in ocaml -
> which might
> be easy. But make sure that ocaml can make netlink api calls.
>
> shriram
>
>> Regards,
>> Rushikesh
>>
>>
>>
>>
>> On Mon, Sep 26, 2011 at 12:38 PM, Mike McClurg <mike.mcclurg@citrix.com>wrote:
>>
>>>  On 09/25/2011 09:11 PM, R J wrote:
>>>
>>> Hello List,
>>>
>>> I have a proposal and wont mind to implement my self but need a helping
>>> hand to start on.
>>> I want to implement the aggressive FT feature in XCP. The best way I
>>> could imagine is the use of feature *Live Migration*
>>>
>>> Steps
>>> 1. Enable the FT of a particular VM using xe commands and adding as a
>>> param to that VM e.g. xe vm-param-set FT=true uuid=XYZ
>>> 2. If the FT = true detected by xenstore then xapi will initiate a live
>>> migrate of that VM to any of available host.
>>> 3. A parallel "network ping"/"xapi heartbit" from/to that host could be
>>> initialized for each FT VM.
>>> 4. Live migrate will run forever until its disabled by FT = false or one
>>> of the host is down. e.g. the process will loop at 99.99% migration state
>>> 5. If there is a packet drop of x packets the VM Migrate procedure will
>>> mark the VM Migration as Complete and will switch the devices forcefully.
>>> -- this could result in some data loss but I dont have any alternative to
>>> this.
>>> -- The specific x packets can be set by XCP but we cant rely for default
>>> XCP Errors
>>> 6. If there is a successful migration due to host down then we will again
>>> start from step2
>>>
>>> Above steps I have assumed to my knowledge, we can discuss the problems
>>> in it.
>>>
>>> Apologies if I'm being too naive.
>>>
>>> Regards,
>>> Rushikesh
>>>
>>>  This sounds like Remus (http://nss.cs.ubc.ca/remus/). Are you proposing
>>> to implement Remus support in xapi?
>>>
>>> Mike
>>>
>>
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
>>
>>
>

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

Thanks Shriram,<br><br>I thought of using the native VM migrate code but in=
 that case I may end up with corruption either in NW, DIsk or Mem.<br>The r=
emus page is not updated. <a href=3D"http://nss.cs.ubc.ca/remus/hg/">http:/=
/nss.cs.ubc.ca/remus/hg/</a> I hope this project is not stopped. <br>
<br>I&#39;m still learning xen-3.4.2/tools path so hopefully I&#39;ll get s=
ome direction which can save from corruption.<br><br>Regards,<br>R J<br><br=
><br><br><div class=3D"gmail_quote">On Wed, Sep 28, 2011 at 9:38 PM, Shrira=
m Rajagopalan <span dir=3D"ltr">&lt;<a href=3D"mailto:rshriram@cs.ubc.ca">r=
shriram@cs.ubc.ca</a>&gt;</span> wrote:<br>
<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;"><br><br><div clas=
s=3D"gmail_quote"><div class=3D"im">On Mon, Sep 26, 2011 at 8:58 AM, R J <s=
pan dir=3D"ltr">&lt;<a href=3D"mailto:torushikeshj@gmail.com" target=3D"_bl=
ank">torushikeshj@gmail.com</a>&gt;</span> wrote:<br>
<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;">

Hello Mike,<br><br>Thank you for suggestion. I would love to incorporate re=
mus in xapi if thats possible.<br></blockquote></div><div><br>Great. That w=
ould be certainly welcome. [I am not a fan of ocaml ;)]<br><br></div><div c=
lass=3D"im">
<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;">

Remus as its inbuilt logic of detecting checkpoint failure and taking decis=
ions accordingly.<br><br>I think there is remus support for xen 3.4<br>
<br></blockquote></div><div><br>What matters is the toolstack. <br>a. I am =
not sure if the xe toolstack uses libxenguest (tools/libxc) and <br>=A0if i=
t does, then it should have the basic remus support already. <br><br>b. I a=
m also not sure if it is recent enough to include all the remus bug <br>


fixes that went in over the last 6 months.<br><br></div><div class=3D"im"><=
blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8ex; border=
-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">What do you sugges=
t as my next step ?<br>


<br></blockquote></div><div><br>Most of the remus code is python based and =
completely self contained. It just needs <br>the domU&#39;s info (disk path=
s &amp; vifs) as an s-expression. There is only one api call to <br>Xend- t=
o obtain the domU&#39;s s-expression. <br>


<br>1. A quick and dirty way would be to change this single api call to xap=
i equivalent <br>and obtain the s-expression, then you should have Remus ru=
nning.<br><br>2. Another approach would be to re-write the toolstack code i=
n ocaml - which might<br>


be easy. But make sure that ocaml can make netlink api calls.<br><br>shrira=
m<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 c=
lass=3D"im">
Regards,<br>

Rushikesh<div><div></div><div><br><br><br><br><div class=3D"gmail_quote">On=
 Mon, Sep 26, 2011 at 12:38 PM, Mike McClurg <span dir=3D"ltr">&lt;<a href=
=3D"mailto:mike.mcclurg@citrix.com" target=3D"_blank">mike.mcclurg@citrix.c=
om</a>&gt;</span> wrote:<br>



<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;">
 =20
   =20
 =20
  <div bgcolor=3D"#FFFFFF" text=3D"#000000"><div><div></div><div>
    On 09/25/2011 09:11 PM, R J wrote:
    <blockquote type=3D"cite">Hello List,<br>
      <br>
      I have a proposal and wont mind to implement my self but need a
      helping hand to start on.<br>
      I want to implement the aggressive FT feature in XCP. The best way
      I could imagine is the use of feature *Live Migration*<br>
      <br>
      Steps<br>
      1. Enable the FT of a particular VM using xe commands and adding
      as a param to that VM e.g. xe vm-param-set FT=3Dtrue uuid=3DXYZ<br>
      2. If the FT =3D true detected by xenstore then xapi will initiate a
      live migrate of that VM to any of available host.<br>
      3. A parallel &quot;network ping&quot;/&quot;xapi heartbit&quot; from=
/to that host
      could be initialized for each FT VM.<br>
      4. Live migrate will run forever until its disabled by FT =3D false
      or one of the host is down. e.g. the process will loop at 99.99%
      migration state<br>
      5. If there is a packet drop of x packets the VM Migrate procedure
      will mark the VM Migration as Complete and will switch the devices
      forcefully.<br>
      -- this could result in some data loss but I dont have any
      alternative to this.<br>
      -- The specific x packets can be set by XCP but we cant rely for
      default XCP Errors<br>
      6. If there is a successful migration due to host down then we
      will again start from step2<br>
      <br>
      Above steps I have assumed to my knowledge, we can discuss the
      problems in it.<br>
      <br>
      Apologies if I&#39;m being too naive.<br>
      <br>
      Regards,<br>
      Rushikesh<br>
      <br>
    </blockquote>
    </div></div><font size=3D"-1">This sounds like Remus
      (<a href=3D"http://nss.cs.ubc.ca/remus/" target=3D"_blank">http://nss=
.cs.ubc.ca/remus/</a>). Are you proposing to implement
      Remus support in xapi?<br><font color=3D"#888888">
      <br>
      Mike<br>
    </font></font>
  </div>

</blockquote></div><br>
</div></div><br></div>_______________________________________________<br>
Xen-devel mailing list<br>
<a href=3D"mailto:Xen-devel@lists.xensource.com" target=3D"_blank">Xen-deve=
l@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>
<br></blockquote></div><br>
</blockquote></div><br>

--bcaec546918f62583904aeced191--


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

_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

--===============1197793470==--


From xen-devel-bounces@lists.xensource.com Sat Oct 08 16:02:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 08 Oct 2011 16:02:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCfuf-0000up-RM; Sat, 08 Oct 2011 16:02:37 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCftq-0000iM-4m; Sat, 08 Oct 2011 16:01:46 -0700
X-Env-Sender: james.harper@bendigoit.com.au
X-Msg-Ref: server-6.tower-21.messagelabs.com!1318114879!41417680!1
X-Originating-IP: [203.16.207.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3103 invoked from network); 8 Oct 2011 23:01:22 -0000
Received: from mail.bendigoit.com.au (HELO smtp2.bendigoit.com.au)
	(203.16.207.99)
	by server-6.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	8 Oct 2011 23:01:22 -0000
Received: from trantor.int.sbss.com.au ([192.168.200.206]
	helo=mail.bendigoit.com.au)
	by smtp2.bendigoit.com.au with esmtp (Exim 4.72)
	(envelope-from <james.harper@bendigoit.com.au>)
	id 1RCftV-0005aH-Ly; Sun, 09 Oct 2011 10:01:25 +1100
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
X-MimeOLE: Produced By Microsoft Exchange V6.5
Date: Sun, 9 Oct 2011 10:01:24 +1100
Message-ID: <AEC6C66638C05B468B556EA548C1A77D01E5E427@trantor>
In-Reply-To: <20111008190701.21336AE08F@smtp.postman.i2p>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: [Xen-users] XEN - networking and performance
Thread-Index: AcyF8KXW1pK2tDctQ0WUhgaQo3YDqQAHN1bA
References: <20111006203821.CD70CE9342@kermit.internecto.net>
	<20111008190701.21336AE08F@smtp.postman.i2p>
From: "James Harper" <james.harper@bendigoit.com.au>
To: "D. Duckworth" <donduq@i2pmail.org>, <xen-users@lists.xensource.com>,
	<xen-devel@lists.xensource.com>
X-Really-From-Bendigo-IT: magichashvalue
Cc: 
Subject: [Xen-devel] RE: [Xen-users] XEN - networking and performance
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 scripts, in particular the script that *modifies dom0 networking
during
> xend startup* is the biggest piece of sh!# idea I have ever seen in
Xen. It
> creates bridges, takes eth0 down, tortures dom0 with occult ip
addr/route,
> brctl, sysctl and iptables awk/sed manipulations and then it has you
looking at
> your screen yearning for the moment that ping timeouts become ping
> replies, telling you that your box is reachable again. This script is
a malevolent
> demon from the sewers of Norman the Golgothan and the worst part is
that
> network-bridge is also still the recommended default!

That script was designed to make the network look like it was before you
installed xen. Anyone with anything beyond a basic single-port
single-vlan setup comments that line out and creates their own bridges.

> It surely seems so. Xen's /etc/xen/scripts (another design fail, why
not /usr?)
> and udev scripts are confusing ad-hoc bloatware routines and are not
> transparent at all. With the current xen4 I saw the premature advice
to more
> or less 'prepare for migration from xm to xl'. Yet, xl supports less
and is
> conflicting: there is no vifname, no 'xl new/delete', no more python,
no
> relocation and suddenly there is a conflict between 'xm start domain'
versus
> 'xl start /etc/xen/domain'.
>=20

This is an open source project. Please feel free to submit your own
scripts. I'd definitely like to see something that didn't create
firewall rules as I don't even want iptables loaded on my xen systems.

James


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

From xen-devel-bounces@lists.xensource.com Sat Oct 08 20:55:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 08 Oct 2011 20:55:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCkTy-00027Y-By; Sat, 08 Oct 2011 20:55:22 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCkTJ-0001v6-Hu
	for xen-devel@lists.xensource.com; Sat, 08 Oct 2011 20:54:41 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1318132478!261812!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16151 invoked from network); 9 Oct 2011 03:54:38 -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 Oct 2011 03:54:38 -0000
X-IronPort-AV: E=Sophos;i="4.68,510,1312156800"; 
   d="scan'208";a="8287659"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	09 Oct 2011 03:54: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, 9 Oct 2011 04:54:38 +0100
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 1RCkTF-0000O7-MZ;
	Sun, 09 Oct 2011 03:54:37 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RCkTF-0003fQ-BX;
	Sun, 09 Oct 2011 04:54:37 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9235-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 9 Oct 2011 04:54:37 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9235: 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 9235 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9235/

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-xl-sedf     14 guest-localmigrate/x10       fail    like 9224
 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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  0c2bfd1f9c68
baseline version:
 xen                  0c2bfd1f9c68

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-api-bounces@lists.xensource.com Sun Oct 09 08:10:35 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 08:10:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCv1O-0005xi-3O; Sun, 09 Oct 2011 08:10:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCv1D-0005ud-W6; Sun, 09 Oct 2011 08:10:24 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318172992!41105529!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25545 invoked from network); 9 Oct 2011 15:09:53 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 9 Oct 2011 15:09: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 B522A2AA6;
	Sun,  9 Oct 2011 18:10:17 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 3C1F8200DB; Sun,  9 Oct 2011 18:10:16 +0300 (EEST)
Date: Sun, 9 Oct 2011 18:10:16 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: R J <torushikeshj@gmail.com>
Subject: Re: [Xen-devel] Re: [Xen-API] FT for XCP
Message-ID: <20111009151016.GJ12984@reaktio.net>
References: <CAO14VsP9by7CYgSiVN-hY0rJpDk0MYjuJ+FD5Tp3i8w+BcNYHw@mail.gmail.com>
	<4E8024E5.9020406@citrix.com>
	<CAO14VsMXGyNjbgF0PiJ5MLH_HGwMA6M8yN0Z3Vq5e7tE-tW1bw@mail.gmail.com>
	<CAP8mzPOOkZ2iUzKkMCC7T+TExPL6osoANQnw1tUREeE=Jx-_BQ@mail.gmail.com>
	<CAO14VsM2GRyCaNU6No06dxyRjSkUmmOjBqm4LMieKXkQmBxtTg@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAO14VsM2GRyCaNU6No06dxyRjSkUmmOjBqm4LMieKXkQmBxtTg@mail.gmail.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: rshriram@cs.ubc.ca,
	"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 Sun, Oct 09, 2011 at 01:16:46AM +0530, R J wrote:
>    Thanks Shriram,
> 
>    I thought of using the native VM migrate code but in that case I may end
>    up with corruption either in NW, DIsk or Mem.
>    The remus page is not updated. [1]http://nss.cs.ubc.ca/remus/hg/ I hope
>    this project is not stopped.
> 

There's also: http://wiki.xen.org/xenwiki/Remus

-- Pasi

>    I'm still learning xen-3.4.2/tools path so hopefully I'll get some
>    direction which can save from corruption.
> 
>    Regards,
>    R J
> 
>    On Wed, Sep 28, 2011 at 9:38 PM, Shriram Rajagopalan
>    <[2]rshriram@cs.ubc.ca> wrote:
> 
>      On Mon, Sep 26, 2011 at 8:58 AM, R J <[3]torushikeshj@gmail.com> wrote:
> 
>        Hello Mike,
> 
>        Thank you for suggestion. I would love to incorporate remus in xapi if
>        thats possible.
> 
>      Great. That would be certainly welcome. [I am not a fan of ocaml ;)]
> 
>        Remus as its inbuilt logic of detecting checkpoint failure and taking
>        decisions accordingly.
> 
>        I think there is remus support for xen 3.4
> 
>      What matters is the toolstack.
>      a. I am not sure if the xe toolstack uses libxenguest (tools/libxc) and
>       if it does, then it should have the basic remus support already.
> 
>      b. I am also not sure if it is recent enough to include all the remus
>      bug
>      fixes that went in over the last 6 months.
> 
>        What do you suggest as my next step ?
> 
>      Most of the remus code is python based and completely self contained. It
>      just needs
>      the domU's info (disk paths & vifs) as an s-expression. There is only
>      one api call to
>      Xend- to obtain the domU's s-expression.
> 
>      1. A quick and dirty way would be to change this single api call to xapi
>      equivalent
>      and obtain the s-expression, then you should have Remus running.
> 
>      2. Another approach would be to re-write the toolstack code in ocaml -
>      which might
>      be easy. But make sure that ocaml can make netlink api calls.
> 
>      shriram
> 
>        Regards,
>        Rushikesh
> 
>        On Mon, Sep 26, 2011 at 12:38 PM, Mike McClurg
>        <[4]mike.mcclurg@citrix.com> wrote:
> 
>          On 09/25/2011 09:11 PM, R J wrote:
> 
>            Hello List,
> 
>            I have a proposal and wont mind to implement my self but need a
>            helping hand to start on.
>            I want to implement the aggressive FT feature in XCP. The best way
>            I could imagine is the use of feature *Live Migration*
> 
>            Steps
>            1. Enable the FT of a particular VM using xe commands and adding
>            as a param to that VM e.g. xe vm-param-set FT=true uuid=XYZ
>            2. If the FT = true detected by xenstore then xapi will initiate a
>            live migrate of that VM to any of available host.
>            3. A parallel "network ping"/"xapi heartbit" from/to that host
>            could be initialized for each FT VM.
>            4. Live migrate will run forever until its disabled by FT = false
>            or one of the host is down. e.g. the process will loop at 99.99%
>            migration state
>            5. If there is a packet drop of x packets the VM Migrate procedure
>            will mark the VM Migration as Complete and will switch the devices
>            forcefully.
>            -- this could result in some data loss but I dont have any
>            alternative to this.
>            -- The specific x packets can be set by XCP but we cant rely for
>            default XCP Errors
>            6. If there is a successful migration due to host down then we
>            will again start from step2
> 
>            Above steps I have assumed to my knowledge, we can discuss the
>            problems in it.
> 
>            Apologies if I'm being too naive.
> 
>            Regards,
>            Rushikesh
> 
>          This sounds like Remus ([5]http://nss.cs.ubc.ca/remus/). Are you
>          proposing to implement Remus support in xapi?
>          Mike
> 
>        _______________________________________________
>        Xen-devel mailing list
>        [6]Xen-devel@lists.xensource.com
>        [7]http://lists.xensource.com/xen-devel
> 
> References
> 
>    Visible links
>    1. http://nss.cs.ubc.ca/remus/hg/
>    2. mailto:rshriram@cs.ubc.ca
>    3. mailto:torushikeshj@gmail.com
>    4. mailto:mike.mcclurg@citrix.com
>    5. http://nss.cs.ubc.ca/remus/
>    6. mailto:Xen-devel@lists.xensource.com
>    7. http://lists.xensource.com/xen-devel

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


_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:07:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:07:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCvuU-0001zr-P4; Sun, 09 Oct 2011 09:07:30 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB5hi-0002Ho-Uy
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 07:10:44 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1317737438!33888057!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28137 invoked from network); 4 Oct 2011 14:10:39 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-4.tower-174.messagelabs.com with SMTP;
	4 Oct 2011 14:10:39 -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 p94EADwd013583
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 4 Oct 2011 10:10:13 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p94EABvZ008387; Tue, 4 Oct 2011 10:10:12 -0400
Date: Tue, 4 Oct 2011 10:10:11 -0400
From: Jason Baron <jbaron@redhat.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111004141011.GA2520@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E89E28C.7010700@goop.org>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:06 -0700
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	hpa@zytor.com, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 03, 2011 at 09:27:56AM -0700, Jeremy Fitzhardinge wrote:
> On 10/03/2011 08:02 AM, Jason Baron wrote:
> > Hi,
> >
> > (Sorry for the late reply - I was away for a few days).
> >
> > The early enable is really nice - it means there are not restrictions on
> > when jump_label_inc()/dec() can be called which is nice.
> >
> > comments below.
> >
> >
> > On Sat, Oct 01, 2011 at 02:55:35PM -0700, Jeremy Fitzhardinge wrote:
> >> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> >>
> >> If a key has been enabled before jump_label_init() is called, don't
> >> nop it out.
> >>
> >> This removes arch_jump_label_text_poke_early() (which can only nop
> >> out a site) and uses arch_jump_label_transform() instead.
> >>
> >> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> >> ---
> >>  include/linux/jump_label.h |    3 ++-
> >>  kernel/jump_label.c        |   20 ++++++++------------
> >>  2 files changed, 10 insertions(+), 13 deletions(-)
> >>
> >> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
> >> index 1213e9d..c8fb1b3 100644
> >> --- a/include/linux/jump_label.h
> >> +++ b/include/linux/jump_label.h
> >> @@ -45,7 +45,8 @@ extern void jump_label_lock(void);
> >>  extern void jump_label_unlock(void);
> >>  extern void arch_jump_label_transform(struct jump_entry *entry,
> >>  				 enum jump_label_type type);
> >> -extern void arch_jump_label_text_poke_early(jump_label_t addr);
> >> +extern void arch_jump_label_transform_early(struct jump_entry *entry,
> >> +				 enum jump_label_type type);
> >>  extern int jump_label_text_reserved(void *start, void *end);
> >>  extern void jump_label_inc(struct jump_label_key *key);
> >>  extern void jump_label_dec(struct jump_label_key *key);
> >> diff --git a/kernel/jump_label.c b/kernel/jump_label.c
> >> index a8ce450..059202d5 100644
> >> --- a/kernel/jump_label.c
> >> +++ b/kernel/jump_label.c
> >> @@ -121,13 +121,6 @@ static void __jump_label_update(struct jump_label_key *key,
> >>  	}
> >>  }
> >>  
> >> -/*
> >> - * Not all archs need this.
> >> - */
> >> -void __weak arch_jump_label_text_poke_early(jump_label_t addr)
> >> -{
> >> -}
> >> -
> >>  static __init int jump_label_init(void)
> >>  {
> >>  	struct jump_entry *iter_start = __start___jump_table;
> >> @@ -139,12 +132,15 @@ static __init int jump_label_init(void)
> >>  	jump_label_sort_entries(iter_start, iter_stop);
> >>  
> >>  	for (iter = iter_start; iter < iter_stop; iter++) {
> >> -		arch_jump_label_text_poke_early(iter->code);
> >> -		if (iter->key == (jump_label_t)(unsigned long)key)
> >> +		struct jump_label_key *iterk;
> >> +
> >> +		iterk = (struct jump_label_key *)(unsigned long)iter->key;
> >> +		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
> >> +					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
> > The only reason I called this at boot-time was that the 'ideal' x86
> > no-op isn't known until boot time. Thus, in the enabled case we could
> > skip the the arch_jump_label_transform() call. ie:
> >
> > if (!enabled)
> > 	arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
> 
> 
> Yep, fair enough.
> 
> >
> >
> >> +		if (iterk == key)
> >>  			continue;
> >>  
> >> -		key = (struct jump_label_key *)(unsigned long)iter->key;
> >> -		atomic_set(&key->enabled, 0);
> >> +		key = iterk;
> >>  		key->entries = iter;
> >>  #ifdef CONFIG_MODULES
> >>  		key->next = NULL;
> >> @@ -212,7 +208,7 @@ void jump_label_apply_nops(struct module *mod)
> >>  		return;
> >>  
> >>  	for (iter = iter_start; iter < iter_stop; iter++)
> >> -		arch_jump_label_text_poke_early(iter->code);
> >> +		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
> >>  }
> >>  
> >>  static int jump_label_add_module(struct module *mod)
> >> -- 
> >> 1.7.6.2
> >>
> > hmmm...this is used on module load in smp - so this would introduce a number of
> > calls to stop_machine() where we didn't have them before. Yes, module
> > load is a very slow path to begin with, but I think its at least worth
> > pointing out...
> 
> Ah, that explains it - the module stuff certainly isn't "early" except -
> I guess - in the module's lifetime.
> 
> Well, I suppose I could introduce either second variant of the function,
> or add a "live" flag (ie, may be updating code that a processor is
> executing), which requires a stop_machine, or direct update if it doesn't.
> 
> But is there any reason why we couldn't just generate a reasonably
> efficient 5-byte atomic nop in the first place, and get rid of all that
> fooling around?  It looks like x86 is the only arch where it makes any
> difference at all, and how much difference does it really make?  Or is
> there no one 5-byte atomic nop that works on all x86 variants, aside
> from jmp +0?
> 
>     J

Yes, there are really two reasons for the initial no-op patching pass:

1) The jmp +0, is a 'safe' no-op that I know is going to initially
boot for all x86. I'm not sure if there is a 5-byte nop that works on
all x86 variants - but by using jmp +0, we make it much easier to debug
cases where we may be using broken no-ops.

2) This optimization is about as close to a 0 cost off case as possible.
I know there have been various no-op benchmarks posted on lkml in the
past, so the choice of no-op does seem to make a difference. see:
http://lkml.indiana.edu/hypermail/linux/kernel/0808.1/2416.html, for
example. So at least to me, if we are not using the lowest cost no-op,
we are at least in-part defeating the point of this optimization.

I like the "live" flag suggestion mentioned above. Less functions is
better, and non-x86 arches can simply ignore the flag.

Thanks,

-Jason






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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:09:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:09:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCvwq-0002Nn-15; Sun, 09 Oct 2011 09:09:56 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RB9BS-000439-Pw
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 10:53:39 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1317750814!33895919!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4497 invoked from network); 4 Oct 2011 17:53:35 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-12.tower-174.messagelabs.com with SMTP;
	4 Oct 2011 17:53:35 -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 p94HrD74030705
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 4 Oct 2011 13:53:13 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p94HrDnC029847; Tue, 4 Oct 2011 13:53:13 -0400
Date: Tue, 4 Oct 2011 13:53:12 -0400
From: Jason Baron <jbaron@redhat.com>
To: "H. Peter Anvin" <hpa@zytor.com>
Message-ID: <20111004175312.GC2520@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8B3489.60902@zytor.com>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:06 -0700
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, Oct 04, 2011 at 09:30:01AM -0700, H. Peter Anvin wrote:
> On 10/04/2011 07:10 AM, Jason Baron wrote:
> > 
> > 1) The jmp +0, is a 'safe' no-op that I know is going to initially
> > boot for all x86. I'm not sure if there is a 5-byte nop that works on
> > all x86 variants - but by using jmp +0, we make it much easier to debug
> > cases where we may be using broken no-ops.
> > 
> 
> There are *plenty*.  jmp+0 is about as pessimal as you can get.
> 
> The current recommendation when you don't know the CPU you're running at is:
> 
> 	3E 8D 74 26 00	(GENERIC_NOP5_ATOMIC)
> 
> ... on 32 bits and ...
> 
> 	0F 1F 44 00 00	(P6_NOP5_ATOMIC)
> 
> ... on 64 bits.
> 
> 	-hpa
> 

We're currently patching the code at run-time (boot and module load
time), with the 'ideal' no-op anyway, so the initial no-op doesn't
really matter much (other than to save patching if the initial and ideal
match).

-Jason

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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:11:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 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 1RCvyY-0002lK-7o; Sun, 09 Oct 2011 09:11:42 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RB9Rj-0005WR-M2
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 11:10:29 -0700
X-Env-Sender: hyo747@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1317751810!42777547!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19151 invoked from network); 4 Oct 2011 18:10:11 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	4 Oct 2011 18:10:11 -0000
Received: by vcbfo13 with SMTP id fo13so983599vcb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 04 Oct 2011 11:10:23 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:from:content-type:subject:date:message-id:to:mime-version
	:x-mailer; bh=U+Fz3gEjkjZWJ33k/zQtnrgceS2TnXlc/pnC/qq1a30=;
	b=pg9lqDugKRO1pBesYIALtAd0nmTKfDbnT3abckBZhhT4Zr1S7tYhhxntgFI+Ut9c2q
	ljKT6hNaWXUEKAxZoHusGiNk1bAE2W50UWCB2yvP8m6P45Cot2VJ3xylFnyQ8/7VIyUX
	bvxcB8G2mVzE/qmcNqYK+zflyDF+ogcd9Wz4s=
Received: by 10.52.75.168 with SMTP id d8mr1476721vdw.421.1317751823318;
	Tue, 04 Oct 2011 11:10:23 -0700 (PDT)
Received: from pal-nat184-037-188.itap.purdue.edu
	(pal-160-046.itap.purdue.edu. [128.211.160.46])
	by mx.google.com with ESMTPS id x19sm17816079vdf.10.2011.10.04.11.10.20
	(version=SSLv3 cipher=OTHER); Tue, 04 Oct 2011 11:10:20 -0700 (PDT)
From: Hyo J Lee <hyo747@gmail.com>
Date: Tue, 4 Oct 2011 14:10:19 -0400
Message-Id: <3DDB718A-0E09-486A-810D-05DF7D790C22@gmail.com>
To: xen-devel@lists.xensource.com
Mime-Version: 1.0 (Apple Message framework v1084)
X-Mailer: Apple Mail (2.1084)
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:01 -0700
Subject: [Xen-devel] nested xen on 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="===============1732669818=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============1732669818==
Content-Type: multipart/alternative; boundary=Apple-Mail-1-142203131


--Apple-Mail-1-142203131
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=us-ascii

Hi all

I wonder if there's any way that I can do nested xen on domU not dom0.
This is what I plan.

            | dom0_T| |domU1_T| |domU2_T|
            ----------------------------- (domU1_B)
|dom0_B|    |       xen top             |
-----------------------------------------
|             xen bottom                |

And I want to be able to take the entire snapshot of domU1_B (including =
dom0_T, domU1_T, domU2_T)
So far, only documents I found about nested xen told me to install the =
xen top on dom0_B.
So I wonder if there's any way to install xen top on domU1_B or any =
workaround.

Thanks,
- Hyo




--Apple-Mail-1-142203131
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=us-ascii

<html><head></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><font =
class=3D"Apple-style-span" face=3D"Courier">Hi all</font><div><font =
class=3D"Apple-style-span" face=3D"Courier"><br></font></div><div><font =
class=3D"Apple-style-span" face=3D"Courier">I wonder if there's any way =
that I can do nested xen on domU not dom0.</font></div><div><span =
class=3D"Apple-style-span" style=3D"font-family: Courier; ">This is what =
I plan.</span></div><div><span class=3D"Apple-style-span" =
style=3D"font-family: Courier; "><br></span></div><div><span =
class=3D"Apple-style-span" style=3D"font-family: Courier; ">&nbsp;&nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| dom0_T| |domU1_T| =
|domU2_T|</span></div><div><font class=3D"Apple-style-span" =
face=3D"Courier">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
----------------------------- (domU1_B)</font></div><div><font =
class=3D"Apple-style-span" face=3D"Courier">|dom0_B| &nbsp; &nbsp;| =
&nbsp; &nbsp; &nbsp; xen top &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
|</font></div><div><font class=3D"Apple-style-span" =
face=3D"Courier">-----------------------------------------</font></div><di=
v><font class=3D"Apple-style-span" face=3D"Courier">| &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp; xen bottom &nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp; &nbsp; &nbsp;|</font></div><div><font =
class=3D"Apple-style-span" face=3D"Courier"><br></font></div><div><font =
class=3D"Apple-style-span" face=3D"Courier">And I want to be able to =
take the entire snapshot of domU1_B (including dom0_T, domU1_T, =
domU2_T)</font></div><div><font class=3D"Apple-style-span" =
face=3D"Courier">So far, only documents I found about nested xen told me =
to install the xen top on dom0_B.</font></div><div><font =
class=3D"Apple-style-span" face=3D"Courier">So I wonder if there's any =
way to install xen top on domU1_B or any =
workaround.</font></div><div><font class=3D"Apple-style-span" =
face=3D"Courier"><br></font></div><div><font class=3D"Apple-style-span" =
face=3D"Courier">Thanks,</font></div><div><font class=3D"Apple-style-span"=
 face=3D"Courier">- Hyo</font></div><div><font class=3D"Apple-style-span" =
face=3D"Courier"><br></font></div><div><font class=3D"Apple-style-span" =
face=3D"Courier"><br></font></div><div><br></div></body></html>=

--Apple-Mail-1-142203131--


--===============1732669818==
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

--===============1732669818==--


From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:12:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:12:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCvzQ-00038L-C4; Sun, 09 Oct 2011 09:12:36 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBG60-0004Ue-C5
	for xen-devel@lists.xensource.com; Tue, 04 Oct 2011 18:16:29 -0700
X-Env-Sender: rusty@ozlabs.org
X-Msg-Ref: server-8.tower-182.messagelabs.com!1317777382!19766447!1
X-Originating-IP: [203.10.76.45]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7555 invoked from network); 5 Oct 2011 01:16:24 -0000
Received: from ozlabs.org (HELO ozlabs.org) (203.10.76.45)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 5 Oct 2011 01:16:24 -0000
Received: by ozlabs.org (Postfix, from userid 1011)
	id B2FEA1007D9; Wed,  5 Oct 2011 12:16:19 +1100 (EST)
From: Rusty Russell <rusty@rustcorp.com.au>
To: Jeremy Fitzhardinge <jeremy@goop.org>, Steven Rostedt <rostedt@goodmis.org>
In-Reply-To: <619c66d6da63aa086e2eac017e7aed216cc8ddc3.1317755691.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
	<619c66d6da63aa086e2eac017e7aed216cc8ddc3.1317755691.git.jeremy.fitzhardinge@citrix.com>
User-Agent: Notmuch/0.5 (http://notmuchmail.org) Emacs/23.2.1
	(i686-pc-linux-gnu)
Date: Wed, 05 Oct 2011 11:45:25 +1030
Message-ID: <8762k4grwy.fsf@rustcorp.com.au>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:01 -0700
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>, Andrew Morton <akpm@linux-foundation.org>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V3 2/8] stop_machine: make stop_machine
	safe and efficient to call early
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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,  4 Oct 2011 12:18:03 -0700, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> 
> Make stop_machine() safe to call early in boot, before stop_machine()
> has been set up, by simply calling the callback function directly if
> there's only one CPU online.

Not that you need this, since it's >90% Tejun's code now, but:

Acked-by: Rusty Russell <rusty@rustcorp.com.au>

Cheers,
Rusty.

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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:13:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:13:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCw0G-0003V0-C7; Sun, 09 Oct 2011 09:13:28 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBUm2-0008UM-6f
	for Xen-devel@lists.xensource.com; Wed, 05 Oct 2011 09:56:50 -0700
X-Env-Sender: lbassel@codeaurora.org
X-Msg-Ref: server-5.tower-27.messagelabs.com!1317833783!47796557!1
X-Originating-IP: [199.106.114.254]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2523 invoked from network); 5 Oct 2011 16:56:24 -0000
Received: from wolverine01.qualcomm.com (HELO wolverine01.qualcomm.com)
	(199.106.114.254)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 5 Oct 2011 16:56:24 -0000
X-IronPort-AV: E=McAfee;i="5400,1158,6490"; a="125006392"
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;
	05 Oct 2011 09:56:45 -0700
Received: from labbmf-linux.qualcomm.com (pdmz-snip-v218.qualcomm.com
	[192.168.218.1])
	by mostmsg01.qualcomm.com (Postfix) with ESMTPA id DE2F210004C2;
	Wed,  5 Oct 2011 09:56:44 -0700 (PDT)
Date: Wed, 5 Oct 2011 09:56:43 -0700
From: Larry Bassel <lbassel@codeaurora.org>
To: Dan Magenheimer <dan.magenheimer@oracle.com>
Subject: Re: [Xen-devel] Re: RFC -- new zone type
Message-ID: <20111005165643.GE7007@labbmf-linux.qualcomm.com>
References: <20110928180909.GA7007@labbmf-linux.qualcomm.comCAOFJiu1_HaboUMqtjowA2xKNmGviDE55GUV4OD1vN2hXUf4-kQ@mail.gmail.com>
	<c2d9add1-0095-4319-8936-db1b156559bf@default>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <c2d9add1-0095-4319-8936-db1b156559bf@default>
User-Agent: Mutt/1.5.20 (2009-06-14)
X-Mailman-Approved-At: Sun, 09 Oct 2011 08:59:59 -0700
Cc: linux-mm@kvack.org, 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 29 Sep 11 09:38, Dan Magenheimer wrote:
[snip]
> 
> You may be interested in the concept of "ephemeral pages"
> introduced by transcendent memory ("tmem") and the cleancache
> patchset which went upstream at 3.0.  If you write a driver
> (called a "backend" in tmem language) that accepts pages
> from cleancache, you would be able to use your 100MB contiguous
> chunk of memory for clean pagecache pages when it is not needed
> for your other purposes, easily discard all the pages when
> you do need the space, then start using it for clean pagecache
> pages again when you don't need it for your purposes anymore
> (and repeat this cycle as many times as necessary).
> 
> You maybe could call your driver "cleanzone".
> 
> Zcache (also upstream in drivers/staging) does something like
> this already, though you might not want/need to use compression
> in your driver.  In zcache, space reclaim is driven by the kernel
> "shrinker" code that runs when memory is low, but another trigger
> could easily be used.  Also there is likely a lot of code in
> zcache (e.g. tmem.c) that you could leverage.
> 
> For more info, see: 
> http://lwn.net/Articles/454795/
> http://oss.oracle.com/projects/tmem 
> 
> I'd be happy to answer any questions if you are still interested
> after you have read the above documentation.

It appears that ephemeral tmem ("cleancache") is at least
close to meeting our needs. We won't need to
have virtualization or compression.

I do have some questions (I've read the references
you included in your email to me last week and a few
of the links from the "project transcendent memory" one, but have
not looked at any of the source yet):

1. Is it currently possible to specify the size of tmem
(as for us it must be convertable into a large contiguous physical
block of specified size)? Is is currently possible to specify
the start of tmem? Are there any alignment constraints on
the start or size?

2. How does one "turn on" and "turn off" tmem (the memory
which tmem uses may also be needed for the large contiguous
memory block, or perhaps may be powered off entirely)?
Is it simply that one always answers "no" for both
get and put requests when it is "off"?

3. How portable is the tmem code? This needs to run
on an ARM system.

4. Apparently hooks are needed in the filesystem code --
which filesystems are currently supported to be used with
tmem? Is it difficult to add hooks for filesystems
that aren't yet supported?

5. There are no dependencies on memory compaction
or memory hotplug (or sparsemem), correct?

Thank you for suggesting tmem and thanks in
advance for answering my questions.

> 
> Thanks,
> Dan
> 

Larry

-- 
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 Sun Oct 09 09:18:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:18:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCw53-0003vO-QI; Sun, 09 Oct 2011 09:18:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBnj4-0006Ek-4c
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 06:11:10 -0700
X-Env-Sender: anthony@overnetdata.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1317906491!18404520!1
X-Originating-IP: [81.137.131.225]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7461 invoked from network); 6 Oct 2011 13:08:11 -0000
Received: from host81-137-131-225.in-addr.btopenworld.com (HELO
	zimbra.overnetdata.com) (81.137.131.225)
	by server-2.tower-182.messagelabs.com with SMTP;
	6 Oct 2011 13:08:11 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by zimbra.overnetdata.com (Postfix) with ESMTP id 4DB371616C0;
	Thu,  6 Oct 2011 13:53:58 +0100 (BST)
X-Virus-Scanned: amavisd-new at overnetdata.com
Received: from zimbra.overnetdata.com ([127.0.0.1])
	by localhost (zimbra.overnetdata.com [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id soFzppdLN9wG; Thu,  6 Oct 2011 13:53:43 +0100 (BST)
Received: from [192.168.1.59] (unknown [192.168.1.59])
	by zimbra.overnetdata.com (Postfix) with ESMTPSA id 1FEBE1616BF;
	Thu,  6 Oct 2011 13:53:42 +0100 (BST)
Message-ID: <4E8DA4D1.2040904@overnetdata.com>
Date: Thu, 06 Oct 2011 13:53:37 +0100
From: Anthony Wright <anthony@overnetdata.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] dmidecode doesn't work under xen 4.1.1 on certain
	hardware
References: <20110923133200.GC19579@phenom.oracle.com>
	<4E7C9C8B.2010108@overnetdata.com>
	<20110926141322.GD4102@phenom.oracle.com>
	<4E8090D4.2090009@overnetdata.com>
	<20110926193732.GA10007@phenom.oracle.com>
	<4E82E429.2080600@overnetdata.com>
	<20110928132815.GE10270@phenom.oracle.com>
	<4E83462B.9080002@overnetdata.com> <4E835324.30902@citrix.com>
	<4E8AF9BA.3000906@overnetdata.com>
	<20111005151601.GA5223@phenom.oracle.com>
In-Reply-To: <20111005151601.GA5223@phenom.oracle.com>
X-Enigmail-Version: 1.3.2
Content-Type: multipart/mixed; boundary="------------010303010409000005060507"
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:04 -0700
Cc: "xen-devel@lists.xensource.com" <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

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

On 05/10/2011 16:16, Konrad Rzeszutek Wilk wrote:
> On Tue, Oct 04, 2011 at 01:19:06PM +0100, Anthony Wright wrote:
>> On 28/09/2011 18:02, David Vrabel wrote:
>>> On 28/09/11 17:07, Anthony Wright wrote:
>>>> On 28/09/2011 14:28, Konrad Rzeszutek Wilk wrote:
>>>>> Would you be up for testing a different variant of that patch just to make
>>>>> sure?
>>>> Not a problem, ship me the patch when you're ready. I'm running 3.0.4 at
>>>> the moment and would prefer to stick with 3.0.x for now, so hope that
>>>> won't be a problem.
>>> I've just posted an updated patch series that should include a fix for
>>> your dmidecode problem.
>>>
>>> http://lists.xensource.com/archives/html/xen-devel/2011-09/msg01621.html
>>>
>>> If you running 3.0.4 you will also need the first two patches from
>>>
>>> http://lists.xensource.com/archives/html/xen-devel/2011-09/msg00817.html
>>>
>>> Please give these a try and let me know if they work.
>>>
>>> Thanks.
>>>
>>> David
>> I've tried to apply these patches by cutting and pasting them from the
>> URL, but there's seven of them, I'm having to manually edit them due to
>> the browser truncating them, and then most don't apply even when I relax
>> the fuzzing.
>>
>> Could you email me a single patch that applies to 3.0.4?
> Anthony,
>
> If you feel adventours you could use the oss.oracle.com/git/kwilk/xen.git
> tree. Mainly the #linux-next or #testing branch. They both have David's new
> e820 code.
>
> The way to get it is:
>
> git clone oss.oracle.com/git/kwilk/xen.git
> cd xen
> git checkout origin/linux-next
> make -j90 
Sorry it panicked :-(
I've attached two photos of the two flavours of panic & a copy of the
config.
It seems to get through the initial kernel boot and hands over to my
init script, but panics early on in that process, probably at the point
that udev is loading modules.



--------------010303010409000005060507
Content-Type: text/plain;
 name="config-3.1.0-rc8"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="config-3.1.0-rc8"

#
# Automatically generated file; DO NOT EDIT.
# Linux/i386 3.1.0-rc8 Kernel Configuration
#
# CONFIG_64BIT is not set
CONFIG_X86_32=y
# CONFIG_X86_64 is not set
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_OUTPUT_FORMAT="elf32-i386"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig"
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_MMU=y
CONFIG_ZONE_DMA=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_NEED_SG_DMA_LENGTH=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_GENERIC_GPIO=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
# CONFIG_GENERIC_TIME_VSYSCALL is not set
CONFIG_ARCH_HAS_CPU_RELAX=y
CONFIG_ARCH_HAS_DEFAULT_IDLE=y
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
# CONFIG_HAVE_CPUMASK_OF_CPU_MAP is not set
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
# CONFIG_ZONE_DMA32 is not set
CONFIG_ARCH_POPULATES_NODE_MAP=y
# CONFIG_AUDIT_ARCH is not set
CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_HAVE_INTEL_TXT=y
CONFIG_X86_32_SMP=y
CONFIG_X86_HT=y
CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-ecx -fcall-saved-edx"
CONFIG_KTIME_SCALAR=y
CONFIG_ARCH_CPU_PROBE_RELEASE=y
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
CONFIG_HAVE_IRQ_WORK=y
CONFIG_IRQ_WORK=y

#
# General setup
#
CONFIG_EXPERIMENTAL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_CROSS_COMPILE=""
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
# CONFIG_KERNEL_GZIP is not set
# CONFIG_KERNEL_BZIP2 is not set
CONFIG_KERNEL_LZMA=y
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
CONFIG_DEFAULT_HOSTNAME="(none)"
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
# CONFIG_FHANDLE is not set
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_AUDIT=y
CONFIG_AUDITSYSCALL=y
CONFIG_AUDIT_WATCH=y
CONFIG_AUDIT_TREE=y
CONFIG_HAVE_GENERIC_HARDIRQS=y

#
# IRQ subsystem
#
CONFIG_GENERIC_HARDIRQS=y
CONFIG_HAVE_SPARSE_IRQ=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_GENERIC_IRQ_SHOW=y
CONFIG_GENERIC_PENDING_IRQ=y
CONFIG_IRQ_FORCED_THREADING=y
CONFIG_SPARSE_IRQ=y

#
# RCU Subsystem
#
CONFIG_TREE_RCU=y
# CONFIG_PREEMPT_RCU is not set
# CONFIG_RCU_TRACE is not set
CONFIG_RCU_FANOUT=32
# CONFIG_RCU_FANOUT_EXACT is not set
CONFIG_RCU_FAST_NO_HZ=y
# CONFIG_TREE_RCU_TRACE is not set
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_BUF_SHIFT=17
CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CPUSETS=y
CONFIG_PROC_PID_CPUSET=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_RESOURCE_COUNTERS=y
CONFIG_CGROUP_MEM_RES_CTLR=y
CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED=y
# CONFIG_CGROUP_PERF is not set
CONFIG_CGROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y
CONFIG_RT_GROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_SCHED_AUTOGROUP=y
CONFIG_MM_OWNER=y
# CONFIG_SYSFS_DEPRECATED is not set
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""
# CONFIG_RD_GZIP is not set
# CONFIG_RD_BZIP2 is not set
CONFIG_RD_LZMA=y
CONFIG_RD_XZ=y
# CONFIG_RD_LZO is not set
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
CONFIG_EXPERT=y
CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_PCSPKR_PLATFORM=y
CONFIG_HAVE_PCSPKR_PLATFORM=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_AIO=y
# CONFIG_EMBEDDED is not set
CONFIG_HAVE_PERF_EVENTS=y

#
# Kernel Performance Events And Counters
#
CONFIG_PERF_EVENTS=y
CONFIG_PERF_COUNTERS=y
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_PCI_QUIRKS=y
CONFIG_SLUB_DEBUG=y
# CONFIG_COMPAT_BRK is not set
# CONFIG_SLAB is not set
CONFIG_SLUB=y
# CONFIG_SLOB is not set
# CONFIG_PROFILING is not set
CONFIG_TRACEPOINTS=y
CONFIG_HAVE_OPROFILE=y
# CONFIG_KPROBES is not set
# CONFIG_JUMP_LABEL is not set
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_HAVE_IOREMAP_PROT=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_OPTPROBES=y
CONFIG_HAVE_ARCH_TRACEHOOK=y
CONFIG_HAVE_DMA_ATTRS=y
CONFIG_USE_GENERIC_SMP_HELPERS=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_DMA_API_DEBUG=y
CONFIG_HAVE_HW_BREAKPOINT=y
CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
CONFIG_HAVE_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
CONFIG_HAVE_ARCH_JUMP_LABEL=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y

#
# GCOV-based kernel profiling
#
# CONFIG_GCOV_KERNEL is not set
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y
CONFIG_BASE_SMALL=0
CONFIG_MODULES=y
# CONFIG_MODULE_FORCE_LOAD is not set
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y
CONFIG_STOP_MACHINE=y
CONFIG_BLOCK=y
CONFIG_LBDAF=y
CONFIG_BLK_DEV_BSG=y
# CONFIG_BLK_DEV_BSGLIB is not set
CONFIG_BLK_DEV_INTEGRITY=y
CONFIG_BLK_DEV_THROTTLING=y

#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
CONFIG_CFQ_GROUP_IOSCHED=y
# CONFIG_DEFAULT_DEADLINE is not set
CONFIG_DEFAULT_CFQ=y
# CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="cfq"
CONFIG_PADATA=y
# CONFIG_INLINE_SPIN_TRYLOCK is not set
# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
# CONFIG_INLINE_SPIN_LOCK is not set
# CONFIG_INLINE_SPIN_LOCK_BH is not set
# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
CONFIG_INLINE_SPIN_UNLOCK=y
# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
# CONFIG_INLINE_READ_TRYLOCK is not set
# CONFIG_INLINE_READ_LOCK is not set
# CONFIG_INLINE_READ_LOCK_BH is not set
# CONFIG_INLINE_READ_LOCK_IRQ is not set
# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
CONFIG_INLINE_READ_UNLOCK=y
# CONFIG_INLINE_READ_UNLOCK_BH is not set
CONFIG_INLINE_READ_UNLOCK_IRQ=y
# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
# CONFIG_INLINE_WRITE_TRYLOCK is not set
# CONFIG_INLINE_WRITE_LOCK is not set
# CONFIG_INLINE_WRITE_LOCK_BH is not set
# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
CONFIG_INLINE_WRITE_UNLOCK=y
# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
CONFIG_MUTEX_SPIN_ON_OWNER=y
CONFIG_FREEZER=y

#
# Processor type and features
#
CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
CONFIG_SMP=y
CONFIG_X86_MPPARSE=y
# CONFIG_X86_BIGSMP is not set
CONFIG_X86_EXTENDED_PLATFORM=y
# CONFIG_X86_INTEL_MID is not set
# CONFIG_X86_RDC321X is not set
# CONFIG_X86_32_NON_STANDARD is not set
CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
CONFIG_X86_32_IRIS=m
CONFIG_SCHED_OMIT_FRAME_POINTER=y
CONFIG_PARAVIRT_GUEST=y
# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
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_KVM_CLOCK is not set
# CONFIG_KVM_GUEST is not set
# CONFIG_LGUEST_GUEST is not set
CONFIG_PARAVIRT=y
CONFIG_PARAVIRT_SPINLOCKS=y
CONFIG_PARAVIRT_CLOCK=y
# CONFIG_PARAVIRT_DEBUG is not set
CONFIG_NO_BOOTMEM=y
# CONFIG_MEMTEST is not set
# CONFIG_M386 is not set
# CONFIG_M486 is not set
# CONFIG_M586 is not set
# CONFIG_M586TSC is not set
# CONFIG_M586MMX is not set
CONFIG_M686=y
# CONFIG_MPENTIUMII is not set
# CONFIG_MPENTIUMIII is not set
# CONFIG_MPENTIUMM is not set
# CONFIG_MPENTIUM4 is not set
# CONFIG_MK6 is not set
# CONFIG_MK7 is not set
# CONFIG_MK8 is not set
# CONFIG_MCRUSOE is not set
# CONFIG_MEFFICEON is not set
# CONFIG_MWINCHIPC6 is not set
# CONFIG_MWINCHIP3D is not set
# CONFIG_MELAN is not set
# CONFIG_MGEODEGX1 is not set
# CONFIG_MGEODE_LX is not set
# CONFIG_MCYRIXIII is not set
# CONFIG_MVIAC3_2 is not set
# CONFIG_MVIAC7 is not set
# CONFIG_MCORE2 is not set
# CONFIG_MATOM is not set
CONFIG_X86_GENERIC=y
CONFIG_X86_INTERNODE_CACHE_SHIFT=6
CONFIG_X86_CMPXCHG=y
CONFIG_CMPXCHG_LOCAL=y
CONFIG_CMPXCHG_DOUBLE=y
CONFIG_X86_L1_CACHE_SHIFT=6
CONFIG_X86_XADD=y
CONFIG_X86_PPRO_FENCE=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y
CONFIG_X86_BSWAP=y
CONFIG_X86_POPAD_OK=y
CONFIG_X86_INTEL_USERCOPY=y
CONFIG_X86_USE_PPRO_CHECKSUM=y
CONFIG_X86_TSC=y
CONFIG_X86_CMPXCHG64=y
CONFIG_X86_CMOV=y
CONFIG_X86_MINIMUM_CPU_FAMILY=5
CONFIG_X86_DEBUGCTLMSR=y
CONFIG_PROCESSOR_SELECT=y
CONFIG_CPU_SUP_INTEL=y
CONFIG_CPU_SUP_CYRIX_32=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_CENTAUR=y
CONFIG_CPU_SUP_TRANSMETA_32=y
CONFIG_CPU_SUP_UMC_32=y
CONFIG_HPET_TIMER=y
CONFIG_HPET_EMULATE_RTC=y
CONFIG_DMI=y
CONFIG_SWIOTLB=y
CONFIG_IOMMU_HELPER=y
CONFIG_NR_CPUS=8
CONFIG_SCHED_SMT=y
CONFIG_SCHED_MC=y
# CONFIG_IRQ_TIME_ACCOUNTING is not set
# CONFIG_PREEMPT_NONE is not set
CONFIG_PREEMPT_VOLUNTARY=y
# CONFIG_PREEMPT is not set
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
CONFIG_X86_MCE=y
CONFIG_X86_MCE_INTEL=y
CONFIG_X86_MCE_AMD=y
# CONFIG_X86_ANCIENT_MCE is not set
CONFIG_X86_MCE_THRESHOLD=y
CONFIG_X86_MCE_INJECT=m
CONFIG_X86_THERMAL_VECTOR=y
CONFIG_VM86=y
# CONFIG_TOSHIBA is not set
CONFIG_I8K=m
CONFIG_X86_REBOOTFIXUPS=y
CONFIG_MICROCODE=m
CONFIG_MICROCODE_INTEL=y
CONFIG_MICROCODE_AMD=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_X86_MSR=m
CONFIG_X86_CPUID=m
# CONFIG_NOHIGHMEM is not set
# CONFIG_HIGHMEM4G is not set
CONFIG_HIGHMEM64G=y
CONFIG_VMSPLIT_3G=y
# CONFIG_VMSPLIT_2G is not set
# CONFIG_VMSPLIT_1G is not set
CONFIG_PAGE_OFFSET=0xC0000000
CONFIG_HIGHMEM=y
CONFIG_X86_PAE=y
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
CONFIG_ARCH_FLATMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ILLEGAL_POINTER_VALUE=0
CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_FLATMEM_MANUAL=y
# CONFIG_SPARSEMEM_MANUAL is not set
CONFIG_FLATMEM=y
CONFIG_FLAT_NODE_MEM_MAP=y
CONFIG_SPARSEMEM_STATIC=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_PAGEFLAGS_EXTENDED=y
CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_COMPACTION=y
CONFIG_MIGRATION=y
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
CONFIG_VIRT_TO_BUS=y
CONFIG_MMU_NOTIFIER=y
CONFIG_KSM=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
CONFIG_MEMORY_FAILURE=y
# CONFIG_HWPOISON_INJECT is not set
# CONFIG_TRANSPARENT_HUGEPAGE is not set
# CONFIG_CLEANCACHE is not set
CONFIG_HIGHPTE=y
CONFIG_X86_CHECK_BIOS_CORRUPTION=y
CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
CONFIG_X86_RESERVE_LOW=64
# CONFIG_MATH_EMULATION is not set
CONFIG_MTRR=y
CONFIG_MTRR_SANITIZER=y
CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0
CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
CONFIG_X86_PAT=y
CONFIG_ARCH_USES_PG_UNCACHED=y
CONFIG_EFI=y
CONFIG_SECCOMP=y
CONFIG_CC_STACKPROTECTOR=y
# CONFIG_HZ_100 is not set
CONFIG_HZ_250=y
# CONFIG_HZ_300 is not set
# CONFIG_HZ_1000 is not set
CONFIG_HZ=250
CONFIG_SCHED_HRTICK=y
CONFIG_KEXEC=y
CONFIG_CRASH_DUMP=y
CONFIG_KEXEC_JUMP=y
CONFIG_PHYSICAL_START=0x1000000
CONFIG_RELOCATABLE=y
CONFIG_X86_NEED_RELOCS=y
CONFIG_PHYSICAL_ALIGN=0x1000000
CONFIG_HOTPLUG_CPU=y
# CONFIG_COMPAT_VDSO is not set
# CONFIG_CMDLINE_BOOL is not set
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y

#
# Power management and ACPI options
#
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
CONFIG_HIBERNATE_CALLBACKS=y
CONFIG_HIBERNATION=y
CONFIG_PM_STD_PARTITION=""
CONFIG_PM_SLEEP=y
CONFIG_PM_SLEEP_SMP=y
CONFIG_PM_RUNTIME=y
CONFIG_PM=y
CONFIG_PM_DEBUG=y
# CONFIG_PM_ADVANCED_DEBUG is not set
CONFIG_PM_TEST_SUSPEND=y
CONFIG_CAN_PM_TRACE=y
CONFIG_PM_TRACE=y
CONFIG_PM_TRACE_RTC=y
CONFIG_ACPI=y
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_PROCFS=y
CONFIG_ACPI_PROCFS_POWER=y
CONFIG_ACPI_EC_DEBUGFS=m
CONFIG_ACPI_PROC_EVENT=y
CONFIG_ACPI_AC=y
CONFIG_ACPI_BATTERY=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_VIDEO=m
CONFIG_ACPI_FAN=y
CONFIG_ACPI_DOCK=y
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_IPMI=m
CONFIG_ACPI_HOTPLUG_CPU=y
CONFIG_ACPI_PROCESSOR_AGGREGATOR=m
CONFIG_ACPI_THERMAL=y
CONFIG_ACPI_CUSTOM_DSDT_FILE=""
# CONFIG_ACPI_CUSTOM_DSDT is not set
CONFIG_ACPI_BLACKLIST_YEAR=2000
# CONFIG_ACPI_DEBUG is not set
CONFIG_ACPI_PCI_SLOT=y
CONFIG_X86_PM_TIMER=y
CONFIG_ACPI_CONTAINER=y
CONFIG_ACPI_SBS=y
CONFIG_ACPI_HED=m
# CONFIG_ACPI_CUSTOM_METHOD is not set
CONFIG_ACPI_APEI=y
# CONFIG_ACPI_APEI_GHES is not set
# CONFIG_ACPI_APEI_PCIEAER is not set
# CONFIG_ACPI_APEI_MEMORY_FAILURE is not set
CONFIG_ACPI_APEI_EINJ=m
CONFIG_ACPI_APEI_ERST_DEBUG=m
CONFIG_SFI=y
CONFIG_X86_APM_BOOT=y
CONFIG_APM=m
# CONFIG_APM_IGNORE_USER_SUSPEND is not set
# CONFIG_APM_DO_ENABLE is not set
# CONFIG_APM_CPU_IDLE is not set
# CONFIG_APM_DISPLAY_BLANK is not set
# CONFIG_APM_ALLOW_INTS is not set

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
CONFIG_CPU_FREQ_STAT=y
CONFIG_CPU_FREQ_STAT_DETAILS=y
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_POWERSAVE=y
CONFIG_CPU_FREQ_GOV_USERSPACE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y

#
# x86 CPU frequency scaling drivers
#
CONFIG_X86_PCC_CPUFREQ=m
CONFIG_X86_ACPI_CPUFREQ=y
CONFIG_X86_POWERNOW_K6=y
CONFIG_X86_POWERNOW_K7=y
CONFIG_X86_POWERNOW_K7_ACPI=y
CONFIG_X86_POWERNOW_K8=y
CONFIG_X86_GX_SUSPMOD=y
CONFIG_X86_SPEEDSTEP_CENTRINO=y
CONFIG_X86_SPEEDSTEP_CENTRINO_TABLE=y
CONFIG_X86_SPEEDSTEP_ICH=y
CONFIG_X86_SPEEDSTEP_SMI=y
CONFIG_X86_P4_CLOCKMOD=m
CONFIG_X86_CPUFREQ_NFORCE2=y
CONFIG_X86_LONGRUN=y
CONFIG_X86_LONGHAUL=y
CONFIG_X86_E_POWERSAVER=m

#
# shared options
#
CONFIG_X86_SPEEDSTEP_LIB=y
CONFIG_X86_SPEEDSTEP_RELAXED_CAP_CHECK=y
CONFIG_CPU_IDLE=y
CONFIG_CPU_IDLE_GOV_LADDER=y
CONFIG_CPU_IDLE_GOV_MENU=y
CONFIG_INTEL_IDLE=y

#
# Bus options (PCI etc.)
#
CONFIG_PCI=y
# CONFIG_PCI_GOBIOS is not set
# CONFIG_PCI_GOMMCONFIG is not set
# CONFIG_PCI_GODIRECT is not set
CONFIG_PCI_GOANY=y
CONFIG_PCI_BIOS=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_XEN=y
CONFIG_PCI_DOMAINS=y
# CONFIG_PCI_CNB20LE_QUIRK is not set
CONFIG_PCIEPORTBUS=y
CONFIG_HOTPLUG_PCI_PCIE=y
CONFIG_PCIEAER=y
# CONFIG_PCIE_ECRC is not set
# CONFIG_PCIEAER_INJECT is not set
CONFIG_PCIEASPM=y
# CONFIG_PCIEASPM_DEBUG is not set
CONFIG_PCIE_PME=y
CONFIG_ARCH_SUPPORTS_MSI=y
CONFIG_PCI_MSI=y
# CONFIG_PCI_DEBUG is not set
CONFIG_PCI_STUB=m
CONFIG_XEN_PCIDEV_FRONTEND=y
CONFIG_HT_IRQ=y
CONFIG_PCI_IOV=y
CONFIG_PCI_IOAPIC=y
CONFIG_PCI_LABEL=y
CONFIG_ISA_DMA_API=y
CONFIG_ISA=y
CONFIG_EISA=y
CONFIG_EISA_VLB_PRIMING=y
CONFIG_EISA_PCI_EISA=y
CONFIG_EISA_VIRTUAL_ROOT=y
CONFIG_EISA_NAMES=y
CONFIG_MCA=y
CONFIG_MCA_LEGACY=y
# CONFIG_MCA_PROC_FS is not set
CONFIG_SCx200=m
CONFIG_SCx200HR_TIMER=m
CONFIG_AMD_NB=y
CONFIG_PCCARD=m
CONFIG_PCMCIA=m
CONFIG_PCMCIA_LOAD_CIS=y
CONFIG_CARDBUS=y

#
# PC-card bridges
#
CONFIG_YENTA=m
CONFIG_YENTA_O2=y
CONFIG_YENTA_RICOH=y
CONFIG_YENTA_TI=y
CONFIG_YENTA_ENE_TUNE=y
CONFIG_YENTA_TOSHIBA=y
CONFIG_PD6729=m
CONFIG_I82092=m
CONFIG_I82365=m
CONFIG_TCIC=m
CONFIG_PCMCIA_PROBE=y
CONFIG_PCCARD_NONSTATIC=y
CONFIG_HOTPLUG_PCI=y
CONFIG_HOTPLUG_PCI_FAKE=m
CONFIG_HOTPLUG_PCI_COMPAQ=m
CONFIG_HOTPLUG_PCI_COMPAQ_NVRAM=y
CONFIG_HOTPLUG_PCI_IBM=m
CONFIG_HOTPLUG_PCI_ACPI=m
CONFIG_HOTPLUG_PCI_ACPI_IBM=m
CONFIG_HOTPLUG_PCI_CPCI=y
CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m
CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m
CONFIG_HOTPLUG_PCI_SHPC=m
# CONFIG_RAPIDIO is not set

#
# Executable file formats / Emulations
#
CONFIG_BINFMT_ELF=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
CONFIG_HAVE_AOUT=y
CONFIG_BINFMT_AOUT=m
CONFIG_BINFMT_MISC=m
CONFIG_HAVE_ATOMIC_IOMAP=y
CONFIG_HAVE_TEXT_POKE_SMP=y
CONFIG_NET=y

#
# Networking options
#
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_XFRM=y
CONFIG_XFRM_USER=m
# CONFIG_XFRM_SUB_POLICY is not set
# CONFIG_XFRM_MIGRATE is not set
# CONFIG_XFRM_STATISTICS is not set
CONFIG_XFRM_IPCOMP=m
# CONFIG_NET_KEY is not set
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
# CONFIG_IP_FIB_TRIE_STATS is not set
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_ROUTE_CLASSID=y
# CONFIG_IP_PNP is not set
CONFIG_NET_IPIP=m
# CONFIG_NET_IPGRE_DEMUX is not set
CONFIG_IP_MROUTE=y
# CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
# CONFIG_ARPD is not set
CONFIG_SYN_COOKIES=y
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_XFRM_TUNNEL is not set
CONFIG_INET_TUNNEL=m
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
# CONFIG_INET_XFRM_MODE_BEET is not set
CONFIG_INET_LRO=y
CONFIG_INET_DIAG=y
CONFIG_INET_TCP_DIAG=y
CONFIG_TCP_CONG_ADVANCED=y
CONFIG_TCP_CONG_BIC=m
CONFIG_TCP_CONG_CUBIC=y
CONFIG_TCP_CONG_WESTWOOD=m
CONFIG_TCP_CONG_HTCP=m
CONFIG_TCP_CONG_HSTCP=m
CONFIG_TCP_CONG_HYBLA=m
CONFIG_TCP_CONG_VEGAS=m
CONFIG_TCP_CONG_SCALABLE=m
CONFIG_TCP_CONG_LP=m
CONFIG_TCP_CONG_VENO=m
CONFIG_TCP_CONG_YEAH=m
CONFIG_TCP_CONG_ILLINOIS=m
CONFIG_DEFAULT_CUBIC=y
# CONFIG_DEFAULT_RENO is not set
CONFIG_DEFAULT_TCP_CONG="cubic"
CONFIG_TCP_MD5SIG=y
CONFIG_IPV6=y
CONFIG_IPV6_PRIVACY=y
# CONFIG_IPV6_ROUTER_PREF is not set
# CONFIG_IPV6_OPTIMISTIC_DAD is not set
CONFIG_INET6_AH=m
CONFIG_INET6_ESP=m
CONFIG_INET6_IPCOMP=m
# CONFIG_IPV6_MIP6 is not set
CONFIG_INET6_XFRM_TUNNEL=m
CONFIG_INET6_TUNNEL=m
CONFIG_INET6_XFRM_MODE_TRANSPORT=m
CONFIG_INET6_XFRM_MODE_TUNNEL=m
CONFIG_INET6_XFRM_MODE_BEET=m
CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION=m
CONFIG_IPV6_SIT=m
CONFIG_IPV6_SIT_6RD=y
CONFIG_IPV6_NDISC_NODETYPE=y
CONFIG_IPV6_TUNNEL=m
CONFIG_IPV6_MULTIPLE_TABLES=y
# CONFIG_IPV6_SUBTREES is not set
# CONFIG_IPV6_MROUTE is not set
CONFIG_NETWORK_SECMARK=y
# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
CONFIG_NETFILTER_ADVANCED=y
CONFIG_BRIDGE_NETFILTER=y

#
# Core Netfilter Configuration
#
CONFIG_NETFILTER_NETLINK=m
CONFIG_NETFILTER_NETLINK_QUEUE=m
CONFIG_NETFILTER_NETLINK_LOG=m
CONFIG_NF_CONNTRACK=m
CONFIG_NF_CONNTRACK_MARK=y
CONFIG_NF_CONNTRACK_SECMARK=y
CONFIG_NF_CONNTRACK_ZONES=y
CONFIG_NF_CONNTRACK_EVENTS=y
# CONFIG_NF_CONNTRACK_TIMESTAMP is not set
CONFIG_NF_CT_PROTO_DCCP=m
CONFIG_NF_CT_PROTO_GRE=m
CONFIG_NF_CT_PROTO_SCTP=m
CONFIG_NF_CT_PROTO_UDPLITE=m
CONFIG_NF_CONNTRACK_AMANDA=m
CONFIG_NF_CONNTRACK_FTP=m
CONFIG_NF_CONNTRACK_H323=m
CONFIG_NF_CONNTRACK_IRC=m
CONFIG_NF_CONNTRACK_BROADCAST=m
CONFIG_NF_CONNTRACK_NETBIOS_NS=m
# CONFIG_NF_CONNTRACK_SNMP is not set
CONFIG_NF_CONNTRACK_PPTP=m
CONFIG_NF_CONNTRACK_SANE=m
CONFIG_NF_CONNTRACK_SIP=m
CONFIG_NF_CONNTRACK_TFTP=m
CONFIG_NF_CT_NETLINK=m
CONFIG_NETFILTER_TPROXY=m
CONFIG_NETFILTER_XTABLES=m

#
# Xtables combined modules
#
CONFIG_NETFILTER_XT_MARK=m
CONFIG_NETFILTER_XT_CONNMARK=m

#
# Xtables targets
#
# CONFIG_NETFILTER_XT_TARGET_AUDIT is not set
CONFIG_NETFILTER_XT_TARGET_CHECKSUM=m
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=m
CONFIG_NETFILTER_XT_TARGET_CT=m
CONFIG_NETFILTER_XT_TARGET_DSCP=m
CONFIG_NETFILTER_XT_TARGET_HL=m
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=m
CONFIG_NETFILTER_XT_TARGET_MARK=m
CONFIG_NETFILTER_XT_TARGET_NFLOG=m
CONFIG_NETFILTER_XT_TARGET_NFQUEUE=m
CONFIG_NETFILTER_XT_TARGET_NOTRACK=m
CONFIG_NETFILTER_XT_TARGET_RATEEST=m
CONFIG_NETFILTER_XT_TARGET_TEE=m
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
CONFIG_NETFILTER_XT_TARGET_TRACE=m
CONFIG_NETFILTER_XT_TARGET_SECMARK=m
CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
# CONFIG_NETFILTER_XT_TARGET_TCPOPTSTRIP is not set

#
# Xtables matches
#
# CONFIG_NETFILTER_XT_MATCH_ADDRTYPE is not set
CONFIG_NETFILTER_XT_MATCH_CLUSTER=m
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
CONFIG_NETFILTER_XT_MATCH_CONNBYTES=m
CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=m
CONFIG_NETFILTER_XT_MATCH_CONNMARK=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
CONFIG_NETFILTER_XT_MATCH_CPU=m
CONFIG_NETFILTER_XT_MATCH_DCCP=m
# CONFIG_NETFILTER_XT_MATCH_DEVGROUP is not set
CONFIG_NETFILTER_XT_MATCH_DSCP=m
CONFIG_NETFILTER_XT_MATCH_ESP=m
CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=m
CONFIG_NETFILTER_XT_MATCH_HELPER=m
CONFIG_NETFILTER_XT_MATCH_HL=m
CONFIG_NETFILTER_XT_MATCH_IPRANGE=m
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
CONFIG_NETFILTER_XT_MATCH_MAC=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
CONFIG_NETFILTER_XT_MATCH_OSF=m
CONFIG_NETFILTER_XT_MATCH_OWNER=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
CONFIG_NETFILTER_XT_MATCH_PHYSDEV=m
CONFIG_NETFILTER_XT_MATCH_PKTTYPE=m
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
CONFIG_NETFILTER_XT_MATCH_RATEEST=m
CONFIG_NETFILTER_XT_MATCH_REALM=m
CONFIG_NETFILTER_XT_MATCH_RECENT=m
CONFIG_NETFILTER_XT_MATCH_SCTP=m
CONFIG_NETFILTER_XT_MATCH_SOCKET=m
CONFIG_NETFILTER_XT_MATCH_STATE=m
CONFIG_NETFILTER_XT_MATCH_STATISTIC=m
CONFIG_NETFILTER_XT_MATCH_STRING=m
CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
CONFIG_NETFILTER_XT_MATCH_TIME=m
CONFIG_NETFILTER_XT_MATCH_U32=m
# CONFIG_IP_SET is not set
CONFIG_IP_VS=m
CONFIG_IP_VS_IPV6=y
# CONFIG_IP_VS_DEBUG is not set
CONFIG_IP_VS_TAB_BITS=12

#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y

#
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m

#
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PE_SIP=m

#
# IP: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV4=m
CONFIG_NF_CONNTRACK_IPV4=m
CONFIG_NF_CONNTRACK_PROC_COMPAT=y
CONFIG_IP_NF_QUEUE=m
CONFIG_IP_NF_IPTABLES=m
CONFIG_IP_NF_MATCH_AH=m
CONFIG_IP_NF_MATCH_ECN=m
CONFIG_IP_NF_MATCH_TTL=m
CONFIG_IP_NF_FILTER=m
CONFIG_IP_NF_TARGET_REJECT=m
CONFIG_IP_NF_TARGET_LOG=m
CONFIG_IP_NF_TARGET_ULOG=m
CONFIG_NF_NAT=m
CONFIG_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=m
CONFIG_IP_NF_TARGET_NETMAP=m
CONFIG_IP_NF_TARGET_REDIRECT=m
CONFIG_NF_NAT_PROTO_DCCP=m
CONFIG_NF_NAT_PROTO_GRE=m
CONFIG_NF_NAT_PROTO_UDPLITE=m
CONFIG_NF_NAT_PROTO_SCTP=m
CONFIG_NF_NAT_FTP=m
CONFIG_NF_NAT_IRC=m
CONFIG_NF_NAT_TFTP=m
CONFIG_NF_NAT_AMANDA=m
CONFIG_NF_NAT_PPTP=m
CONFIG_NF_NAT_H323=m
CONFIG_NF_NAT_SIP=m
CONFIG_IP_NF_MANGLE=m
CONFIG_IP_NF_TARGET_CLUSTERIP=m
CONFIG_IP_NF_TARGET_ECN=m
CONFIG_IP_NF_TARGET_TTL=m
CONFIG_IP_NF_RAW=m
CONFIG_IP_NF_ARPTABLES=m
CONFIG_IP_NF_ARPFILTER=m
CONFIG_IP_NF_ARP_MANGLE=m

#
# IPv6: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV6=m
CONFIG_NF_CONNTRACK_IPV6=m
CONFIG_IP6_NF_QUEUE=m
CONFIG_IP6_NF_IPTABLES=m
CONFIG_IP6_NF_MATCH_AH=m
CONFIG_IP6_NF_MATCH_EUI64=m
CONFIG_IP6_NF_MATCH_FRAG=m
CONFIG_IP6_NF_MATCH_OPTS=m
CONFIG_IP6_NF_MATCH_HL=m
CONFIG_IP6_NF_MATCH_IPV6HEADER=m
CONFIG_IP6_NF_MATCH_MH=m
CONFIG_IP6_NF_MATCH_RT=m
CONFIG_IP6_NF_TARGET_HL=m
CONFIG_IP6_NF_TARGET_LOG=m
CONFIG_IP6_NF_FILTER=m
CONFIG_IP6_NF_TARGET_REJECT=m
CONFIG_IP6_NF_MANGLE=m
CONFIG_IP6_NF_RAW=m
CONFIG_BRIDGE_NF_EBTABLES=m
CONFIG_BRIDGE_EBT_BROUTE=m
CONFIG_BRIDGE_EBT_T_FILTER=m
CONFIG_BRIDGE_EBT_T_NAT=m
CONFIG_BRIDGE_EBT_802_3=m
CONFIG_BRIDGE_EBT_AMONG=m
CONFIG_BRIDGE_EBT_ARP=m
CONFIG_BRIDGE_EBT_IP=m
CONFIG_BRIDGE_EBT_IP6=m
CONFIG_BRIDGE_EBT_LIMIT=m
CONFIG_BRIDGE_EBT_MARK=m
CONFIG_BRIDGE_EBT_PKTTYPE=m
CONFIG_BRIDGE_EBT_STP=m
CONFIG_BRIDGE_EBT_VLAN=m
CONFIG_BRIDGE_EBT_ARPREPLY=m
CONFIG_BRIDGE_EBT_DNAT=m
CONFIG_BRIDGE_EBT_MARK_T=m
CONFIG_BRIDGE_EBT_REDIRECT=m
CONFIG_BRIDGE_EBT_SNAT=m
CONFIG_BRIDGE_EBT_LOG=m
CONFIG_BRIDGE_EBT_ULOG=m
CONFIG_BRIDGE_EBT_NFLOG=m
# CONFIG_IP_DCCP is not set
CONFIG_IP_SCTP=y
# CONFIG_SCTP_DBG_MSG is not set
# CONFIG_SCTP_DBG_OBJCNT is not set
# CONFIG_SCTP_HMAC_NONE is not set
# CONFIG_SCTP_HMAC_SHA1 is not set
CONFIG_SCTP_HMAC_MD5=y
# CONFIG_RDS is not set
# CONFIG_TIPC is not set
# CONFIG_ATM is not set
# CONFIG_L2TP is not set
CONFIG_STP=y
CONFIG_GARP=y
CONFIG_BRIDGE=y
CONFIG_BRIDGE_IGMP_SNOOPING=y
# CONFIG_NET_DSA is not set
CONFIG_VLAN_8021Q=y
CONFIG_VLAN_8021Q_GVRP=y
# CONFIG_DECNET is not set
CONFIG_LLC=y
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_PHONET is not set
# CONFIG_IEEE802154 is not set
CONFIG_NET_SCHED=y

#
# Queueing/Scheduling
#
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_HTB=m
CONFIG_NET_SCH_HFSC=m
CONFIG_NET_SCH_PRIO=m
CONFIG_NET_SCH_MULTIQ=m
CONFIG_NET_SCH_RED=m
# CONFIG_NET_SCH_SFB is not set
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TEQL=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_SCH_GRED=m
CONFIG_NET_SCH_DSMARK=m
CONFIG_NET_SCH_NETEM=m
CONFIG_NET_SCH_DRR=m
# CONFIG_NET_SCH_MQPRIO is not set
# CONFIG_NET_SCH_CHOKE is not set
# CONFIG_NET_SCH_QFQ is not set
CONFIG_NET_SCH_INGRESS=m

#
# Classification
#
CONFIG_NET_CLS=y
CONFIG_NET_CLS_BASIC=m
CONFIG_NET_CLS_TCINDEX=m
CONFIG_NET_CLS_ROUTE4=m
CONFIG_NET_CLS_FW=m
CONFIG_NET_CLS_U32=m
# CONFIG_CLS_U32_PERF is not set
CONFIG_CLS_U32_MARK=y
CONFIG_NET_CLS_RSVP=m
CONFIG_NET_CLS_RSVP6=m
CONFIG_NET_CLS_FLOW=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_STACK=32
CONFIG_NET_EMATCH_CMP=m
CONFIG_NET_EMATCH_NBYTE=m
CONFIG_NET_EMATCH_U32=m
CONFIG_NET_EMATCH_META=m
CONFIG_NET_EMATCH_TEXT=m
CONFIG_NET_CLS_ACT=y
CONFIG_NET_ACT_POLICE=m
CONFIG_NET_ACT_GACT=m
CONFIG_GACT_PROB=y
CONFIG_NET_ACT_MIRRED=m
CONFIG_NET_ACT_IPT=m
CONFIG_NET_ACT_NAT=m
CONFIG_NET_ACT_PEDIT=m
CONFIG_NET_ACT_SIMP=m
CONFIG_NET_ACT_SKBEDIT=m
CONFIG_NET_ACT_CSUM=m
# CONFIG_NET_CLS_IND is not set
CONFIG_NET_SCH_FIFO=y
# CONFIG_DCB is not set
# CONFIG_BATMAN_ADV is not set
CONFIG_RPS=y
CONFIG_RFS_ACCEL=y
CONFIG_XPS=y

#
# Network testing
#
CONFIG_NET_PKTGEN=m
# CONFIG_NET_DROP_MONITOR is not set
# CONFIG_HAMRADIO is not set
# CONFIG_CAN is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
# CONFIG_AF_RXRPC is not set
CONFIG_FIB_RULES=y
# CONFIG_WIRELESS is not set
# CONFIG_WIMAX is not set
# CONFIG_RFKILL is not set
# CONFIG_RFKILL_REGULATOR is not set
# CONFIG_NET_9P is not set
# CONFIG_CAIF is not set
# CONFIG_CEPH_LIB is not set
# CONFIG_NFC is not set

#
# Device Drivers
#

#
# Generic Driver Options
#
CONFIG_UEVENT_HELPER_PATH=""
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
# CONFIG_STANDALONE is not set
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y
CONFIG_FIRMWARE_IN_KERNEL=y
CONFIG_EXTRA_FIRMWARE=""
# CONFIG_DEBUG_DRIVER is not set
# CONFIG_DEBUG_DEVRES is not set
CONFIG_SYS_HYPERVISOR=y
CONFIG_REGMAP=y
CONFIG_REGMAP_I2C=m
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
CONFIG_MTD=m
# CONFIG_MTD_DEBUG is not set
CONFIG_MTD_TESTS=m
CONFIG_MTD_REDBOOT_PARTS=m
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
# CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set
# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
CONFIG_MTD_AR7_PARTS=m

#
# User Modules And Translation Layers
#
CONFIG_MTD_CHAR=m
CONFIG_MTD_BLKDEVS=m
CONFIG_MTD_BLOCK=m
CONFIG_MTD_BLOCK_RO=m
CONFIG_FTL=m
CONFIG_NFTL=m
CONFIG_NFTL_RW=y
CONFIG_INFTL=m
CONFIG_RFD_FTL=m
CONFIG_SSFDC=m
CONFIG_SM_FTL=m
CONFIG_MTD_OOPS=m
# CONFIG_MTD_SWAP is not set

#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=m
CONFIG_MTD_JEDECPROBE=m
CONFIG_MTD_GEN_PROBE=m
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
CONFIG_MTD_MAP_BANK_WIDTH_1=y
CONFIG_MTD_MAP_BANK_WIDTH_2=y
CONFIG_MTD_MAP_BANK_WIDTH_4=y
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
CONFIG_MTD_CFI_I1=y
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set
# CONFIG_MTD_CFI_I8 is not set
CONFIG_MTD_CFI_INTELEXT=m
CONFIG_MTD_CFI_AMDSTD=m
CONFIG_MTD_CFI_STAA=m
CONFIG_MTD_CFI_UTIL=m
CONFIG_MTD_RAM=m
CONFIG_MTD_ROM=m
CONFIG_MTD_ABSENT=m

#
# Mapping drivers for chip access
#
CONFIG_MTD_COMPLEX_MAPPINGS=y
CONFIG_MTD_PHYSMAP=m
# CONFIG_MTD_PHYSMAP_COMPAT is not set
CONFIG_MTD_SC520CDP=m
CONFIG_MTD_NETSC520=m
CONFIG_MTD_TS5500=m
CONFIG_MTD_SBC_GXX=m
CONFIG_MTD_SCx200_DOCFLASH=m
CONFIG_MTD_AMD76XROM=m
CONFIG_MTD_ICHXROM=m
CONFIG_MTD_ESB2ROM=m
CONFIG_MTD_CK804XROM=m
CONFIG_MTD_SCB2_FLASH=m
CONFIG_MTD_NETtel=m
CONFIG_MTD_L440GX=m
CONFIG_MTD_PCI=m
CONFIG_MTD_PCMCIA=m
# CONFIG_MTD_PCMCIA_ANONYMOUS is not set
CONFIG_MTD_GPIO_ADDR=m
CONFIG_MTD_INTEL_VR_NOR=m
CONFIG_MTD_PLATRAM=m
# CONFIG_MTD_LATCH_ADDR is not set

#
# Self-contained MTD device drivers
#
CONFIG_MTD_PMC551=m
# CONFIG_MTD_PMC551_BUGFIX is not set
# CONFIG_MTD_PMC551_DEBUG is not set
CONFIG_MTD_SLRAM=m
CONFIG_MTD_PHRAM=m
CONFIG_MTD_MTDRAM=m
CONFIG_MTDRAM_TOTAL_SIZE=4096
CONFIG_MTDRAM_ERASE_SIZE=128
CONFIG_MTD_BLOCK2MTD=m

#
# Disk-On-Chip Device Drivers
#
CONFIG_MTD_DOC2000=m
CONFIG_MTD_DOC2001=m
CONFIG_MTD_DOC2001PLUS=m
CONFIG_MTD_DOCPROBE=m
CONFIG_MTD_DOCECC=m
# CONFIG_MTD_DOCPROBE_ADVANCED is not set
CONFIG_MTD_DOCPROBE_ADDRESS=0
CONFIG_MTD_NAND_ECC=m
# CONFIG_MTD_NAND_ECC_SMC is not set
CONFIG_MTD_NAND=m
# CONFIG_MTD_NAND_VERIFY_WRITE is not set
# CONFIG_MTD_NAND_ECC_BCH is not set
CONFIG_MTD_SM_COMMON=m
# CONFIG_MTD_NAND_MUSEUM_IDS is not set
CONFIG_MTD_NAND_DENALI=m
CONFIG_MTD_NAND_DENALI_SCRATCH_REG_ADDR=0xFF108018
CONFIG_MTD_NAND_IDS=m
CONFIG_MTD_NAND_RICOH=m
CONFIG_MTD_NAND_DISKONCHIP=m
# CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED is not set
CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0
# CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE is not set
CONFIG_MTD_NAND_CAFE=m
CONFIG_MTD_NAND_CS553X=m
CONFIG_MTD_NAND_NANDSIM=m
CONFIG_MTD_NAND_PLATFORM=m
CONFIG_MTD_ALAUDA=m
CONFIG_MTD_ONENAND=m
CONFIG_MTD_ONENAND_VERIFY_WRITE=y
CONFIG_MTD_ONENAND_GENERIC=m
# CONFIG_MTD_ONENAND_OTP is not set
CONFIG_MTD_ONENAND_2X_PROGRAM=y
CONFIG_MTD_ONENAND_SIM=m

#
# LPDDR flash memory drivers
#
CONFIG_MTD_LPDDR=m
CONFIG_MTD_QINFO_PROBE=m
CONFIG_MTD_UBI=m
CONFIG_MTD_UBI_WL_THRESHOLD=4096
CONFIG_MTD_UBI_BEB_RESERVE=1
CONFIG_MTD_UBI_GLUEBI=m
# CONFIG_MTD_UBI_DEBUG is not set
CONFIG_PARPORT=m
CONFIG_PARPORT_PC=m
CONFIG_PARPORT_SERIAL=m
CONFIG_PARPORT_PC_FIFO=y
# CONFIG_PARPORT_PC_SUPERIO is not set
CONFIG_PARPORT_PC_PCMCIA=m
# CONFIG_PARPORT_GSC is not set
CONFIG_PARPORT_AX88796=m
CONFIG_PARPORT_1284=y
CONFIG_PARPORT_NOT_PC=y
CONFIG_PNP=y
CONFIG_PNP_DEBUG_MESSAGES=y

#
# Protocols
#
CONFIG_ISAPNP=y
CONFIG_PNPBIOS=y
CONFIG_PNPBIOS_PROC_FS=y
CONFIG_PNPACPI=y
CONFIG_BLK_DEV=y
CONFIG_BLK_DEV_FD=m
# CONFIG_BLK_DEV_XD is not set
CONFIG_PARIDE=m

#
# Parallel IDE high-level drivers
#
CONFIG_PARIDE_PD=m
CONFIG_PARIDE_PCD=m
CONFIG_PARIDE_PF=m
CONFIG_PARIDE_PT=m
CONFIG_PARIDE_PG=m

#
# Parallel IDE protocol modules
#
CONFIG_PARIDE_ATEN=m
CONFIG_PARIDE_BPCK=m
CONFIG_PARIDE_BPCK6=m
CONFIG_PARIDE_COMM=m
CONFIG_PARIDE_DSTR=m
CONFIG_PARIDE_FIT2=m
CONFIG_PARIDE_FIT3=m
CONFIG_PARIDE_EPAT=m
# CONFIG_PARIDE_EPATC8 is not set
CONFIG_PARIDE_EPIA=m
CONFIG_PARIDE_FRIQ=m
CONFIG_PARIDE_FRPW=m
CONFIG_PARIDE_KBIC=m
CONFIG_PARIDE_KTTI=m
CONFIG_PARIDE_ON20=m
CONFIG_PARIDE_ON26=m
CONFIG_BLK_CPQ_DA=m
CONFIG_BLK_CPQ_CISS_DA=m
CONFIG_CISS_SCSI_TAPE=y
CONFIG_BLK_DEV_DAC960=m
CONFIG_BLK_DEV_UMEM=m
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
CONFIG_BLK_DEV_CRYPTOLOOP=m
CONFIG_BLK_DEV_DRBD=m
# CONFIG_DRBD_FAULT_INJECTION is not set
CONFIG_BLK_DEV_NBD=m
CONFIG_BLK_DEV_OSD=m
CONFIG_BLK_DEV_SX8=m
# CONFIG_BLK_DEV_UB is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=65536
# CONFIG_BLK_DEV_XIP is not set
CONFIG_CDROM_PKTCDVD=y
CONFIG_CDROM_PKTCDVD_BUFFERS=8
# CONFIG_CDROM_PKTCDVD_WCACHE is not set
CONFIG_ATA_OVER_ETH=m
CONFIG_XEN_BLKDEV_FRONTEND=y
CONFIG_XEN_BLKDEV_BACKEND=y
CONFIG_VIRTIO_BLK=y
# CONFIG_BLK_DEV_HD is not set
# CONFIG_BLK_DEV_RBD is not set
CONFIG_SENSORS_LIS3LV02D=m
CONFIG_MISC_DEVICES=y
CONFIG_AD525X_DPOT=m
CONFIG_AD525X_DPOT_I2C=m
CONFIG_IBM_ASM=m
CONFIG_PHANTOM=m
# CONFIG_INTEL_MID_PTI is not set
CONFIG_SGI_IOC4=m
CONFIG_TIFM_CORE=m
CONFIG_TIFM_7XX1=m
CONFIG_ICS932S401=m
CONFIG_ENCLOSURE_SERVICES=m
# CONFIG_CS5535_MFGPT is not set
CONFIG_HP_ILO=m
CONFIG_APDS9802ALS=m
CONFIG_ISL29003=m
CONFIG_ISL29020=m
CONFIG_SENSORS_TSL2550=m
CONFIG_SENSORS_BH1780=m
CONFIG_SENSORS_BH1770=m
CONFIG_SENSORS_APDS990X=m
CONFIG_HMC6352=m
CONFIG_DS1682=m
CONFIG_VMWARE_BALLOON=m
CONFIG_BMP085=m
CONFIG_PCH_PHUB=m
CONFIG_USB_SWITCH_FSA9480=m
CONFIG_C2PORT=m
CONFIG_C2PORT_DURAMAR_2150=m

#
# EEPROM support
#
CONFIG_EEPROM_AT24=m
CONFIG_EEPROM_LEGACY=m
CONFIG_EEPROM_MAX6875=m
CONFIG_EEPROM_93CX6=m
CONFIG_CB710_CORE=m
# CONFIG_CB710_DEBUG is not set
CONFIG_CB710_DEBUG_ASSUMPTIONS=y

#
# Texas Instruments shared transport line discipline
#
CONFIG_TI_ST=m
CONFIG_SENSORS_LIS3_I2C=m
CONFIG_HAVE_IDE=y
# CONFIG_IDE is not set

#
# SCSI device support
#
CONFIG_SCSI_MOD=y
CONFIG_RAID_ATTRS=m
CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
CONFIG_SCSI_TGT=m
CONFIG_SCSI_NETLINK=y
CONFIG_SCSI_PROC_FS=y

#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=y
CONFIG_CHR_DEV_ST=m
CONFIG_CHR_DEV_OSST=m
CONFIG_BLK_DEV_SR=y
# CONFIG_BLK_DEV_SR_VENDOR is not set
CONFIG_CHR_DEV_SG=y
CONFIG_CHR_DEV_SCH=m
CONFIG_SCSI_ENCLOSURE=m
CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y
CONFIG_SCSI_WAIT_SCAN=m

#
# SCSI Transports
#
CONFIG_SCSI_SPI_ATTRS=y
CONFIG_SCSI_FC_ATTRS=m
CONFIG_SCSI_FC_TGT_ATTRS=y
CONFIG_SCSI_ISCSI_ATTRS=m
CONFIG_SCSI_SAS_ATTRS=m
CONFIG_SCSI_SAS_LIBSAS=m
CONFIG_SCSI_SAS_ATA=y
CONFIG_SCSI_SAS_HOST_SMP=y
CONFIG_SCSI_SRP_ATTRS=m
CONFIG_SCSI_SRP_TGT_ATTRS=y
CONFIG_SCSI_LOWLEVEL=y
CONFIG_ISCSI_TCP=m
CONFIG_ISCSI_BOOT_SYSFS=m
CONFIG_SCSI_CXGB3_ISCSI=m
CONFIG_SCSI_CXGB4_ISCSI=m
CONFIG_SCSI_BNX2_ISCSI=m
# CONFIG_SCSI_BNX2X_FCOE is not set
CONFIG_BE2ISCSI=m
CONFIG_BLK_DEV_3W_XXXX_RAID=m
CONFIG_SCSI_HPSA=m
CONFIG_SCSI_3W_9XXX=m
CONFIG_SCSI_3W_SAS=m
CONFIG_SCSI_7000FASST=m
CONFIG_SCSI_ACARD=m
CONFIG_SCSI_AHA152X=m
CONFIG_SCSI_AHA1542=m
CONFIG_SCSI_AHA1740=m
CONFIG_SCSI_AACRAID=m
CONFIG_SCSI_AIC7XXX=m
CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
CONFIG_AIC7XXX_RESET_DELAY_MS=15000
CONFIG_AIC7XXX_DEBUG_ENABLE=y
CONFIG_AIC7XXX_DEBUG_MASK=0
CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
# CONFIG_SCSI_AIC7XXX_OLD is not set
CONFIG_SCSI_AIC79XX=m
CONFIG_AIC79XX_CMDS_PER_DEVICE=32
CONFIG_AIC79XX_RESET_DELAY_MS=5000
CONFIG_AIC79XX_DEBUG_ENABLE=y
CONFIG_AIC79XX_DEBUG_MASK=0
CONFIG_AIC79XX_REG_PRETTY_PRINT=y
CONFIG_SCSI_AIC94XX=m
# CONFIG_AIC94XX_DEBUG is not set
CONFIG_SCSI_MVSAS=m
CONFIG_SCSI_MVSAS_DEBUG=y
# CONFIG_SCSI_MVSAS_TASKLET is not set
CONFIG_SCSI_DPT_I2O=m
CONFIG_SCSI_ADVANSYS=m
CONFIG_SCSI_IN2000=m
CONFIG_SCSI_ARCMSR=m
CONFIG_SCSI_ARCMSR_AER=y
CONFIG_MEGARAID_NEWGEN=y
CONFIG_MEGARAID_MM=m
CONFIG_MEGARAID_MAILBOX=m
CONFIG_MEGARAID_LEGACY=m
CONFIG_MEGARAID_SAS=m
CONFIG_SCSI_MPT2SAS=m
CONFIG_SCSI_MPT2SAS_MAX_SGE=128
# CONFIG_SCSI_MPT2SAS_LOGGING is not set
CONFIG_SCSI_HPTIOP=m
CONFIG_SCSI_BUSLOGIC=m
# CONFIG_SCSI_FLASHPOINT is not set
CONFIG_VMWARE_PVSCSI=m
CONFIG_LIBFC=m
CONFIG_LIBFCOE=m
CONFIG_FCOE=m
CONFIG_FCOE_FNIC=m
CONFIG_SCSI_DMX3191D=m
CONFIG_SCSI_DTC3280=m
CONFIG_SCSI_EATA=m
CONFIG_SCSI_EATA_TAGGED_QUEUE=y
CONFIG_SCSI_EATA_LINKED_COMMANDS=y
CONFIG_SCSI_EATA_MAX_TAGS=16
CONFIG_SCSI_FUTURE_DOMAIN=m
CONFIG_SCSI_FD_MCS=m
CONFIG_SCSI_GDTH=m
# CONFIG_SCSI_ISCI is not set
CONFIG_SCSI_GENERIC_NCR5380=m
CONFIG_SCSI_GENERIC_NCR5380_MMIO=m
CONFIG_SCSI_GENERIC_NCR53C400=y
CONFIG_SCSI_IBMMCA=m
CONFIG_IBMMCA_SCSI_ORDER_STANDARD=y
# CONFIG_IBMMCA_SCSI_DEV_RESET is not set
CONFIG_SCSI_IPS=m
CONFIG_SCSI_INITIO=m
CONFIG_SCSI_INIA100=m
CONFIG_SCSI_PPA=m
CONFIG_SCSI_IMM=m
# CONFIG_SCSI_IZIP_EPP16 is not set
# CONFIG_SCSI_IZIP_SLOW_CTR is not set
CONFIG_SCSI_NCR53C406A=m
CONFIG_SCSI_NCR_D700=m
CONFIG_SCSI_STEX=m
CONFIG_SCSI_SYM53C8XX_2=y
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
CONFIG_SCSI_SYM53C8XX_MMIO=y
CONFIG_SCSI_IPR=m
# CONFIG_SCSI_IPR_TRACE is not set
# CONFIG_SCSI_IPR_DUMP is not set
CONFIG_SCSI_NCR_Q720=m
CONFIG_SCSI_NCR53C8XX_DEFAULT_TAGS=8
CONFIG_SCSI_NCR53C8XX_MAX_TAGS=4
CONFIG_SCSI_NCR53C8XX_SYNC=5
CONFIG_SCSI_PAS16=m
CONFIG_SCSI_QLOGIC_FAS=m
CONFIG_SCSI_QLOGIC_1280=m
CONFIG_SCSI_QLA_FC=m
CONFIG_SCSI_QLA_ISCSI=m
CONFIG_SCSI_LPFC=m
CONFIG_SCSI_LPFC_DEBUG_FS=y
CONFIG_SCSI_SIM710=m
CONFIG_SCSI_SYM53C416=m
CONFIG_SCSI_DC395x=m
CONFIG_SCSI_DC390T=m
CONFIG_SCSI_T128=m
CONFIG_SCSI_U14_34F=m
CONFIG_SCSI_U14_34F_TAGGED_QUEUE=y
CONFIG_SCSI_U14_34F_LINKED_COMMANDS=y
CONFIG_SCSI_U14_34F_MAX_TAGS=8
CONFIG_SCSI_ULTRASTOR=m
CONFIG_SCSI_NSP32=m
CONFIG_SCSI_DEBUG=m
CONFIG_SCSI_PMCRAID=m
CONFIG_SCSI_PM8001=m
CONFIG_SCSI_SRP=m
CONFIG_SCSI_BFA_FC=m
CONFIG_SCSI_LOWLEVEL_PCMCIA=y
CONFIG_PCMCIA_AHA152X=m
CONFIG_PCMCIA_FDOMAIN=m
CONFIG_PCMCIA_NINJA_SCSI=m
CONFIG_PCMCIA_QLOGIC=m
CONFIG_PCMCIA_SYM53C500=m
CONFIG_SCSI_DH=y
CONFIG_SCSI_DH_RDAC=m
CONFIG_SCSI_DH_HP_SW=m
CONFIG_SCSI_DH_EMC=m
CONFIG_SCSI_DH_ALUA=m
CONFIG_SCSI_OSD_INITIATOR=m
CONFIG_SCSI_OSD_ULD=m
CONFIG_SCSI_OSD_DPRINT_SENSE=1
# CONFIG_SCSI_OSD_DEBUG is not set
CONFIG_ATA=y
# CONFIG_ATA_NONSTANDARD is not set
CONFIG_ATA_VERBOSE_ERROR=y
CONFIG_ATA_ACPI=y
CONFIG_SATA_PMP=y

#
# Controllers with non-SFF native interface
#
CONFIG_SATA_AHCI=m
CONFIG_SATA_AHCI_PLATFORM=m
CONFIG_SATA_INIC162X=m
CONFIG_SATA_ACARD_AHCI=m
CONFIG_SATA_SIL24=m
CONFIG_ATA_SFF=y

#
# SFF controllers with custom DMA interface
#
CONFIG_PDC_ADMA=y
CONFIG_SATA_QSTOR=m
CONFIG_SATA_SX4=m
CONFIG_ATA_BMDMA=y

#
# SATA SFF controllers with BMDMA
#
CONFIG_ATA_PIIX=y
CONFIG_SATA_MV=m
CONFIG_SATA_NV=m
CONFIG_SATA_PROMISE=m
CONFIG_SATA_SIL=m
CONFIG_SATA_SIS=m
CONFIG_SATA_SVW=m
CONFIG_SATA_ULI=m
CONFIG_SATA_VIA=m
CONFIG_SATA_VITESSE=m

#
# PATA SFF controllers with BMDMA
#
CONFIG_PATA_ALI=m
CONFIG_PATA_AMD=m
# CONFIG_PATA_ARASAN_CF is not set
CONFIG_PATA_ARTOP=m
CONFIG_PATA_ATIIXP=m
CONFIG_PATA_ATP867X=m
CONFIG_PATA_CMD64X=m
CONFIG_PATA_CS5520=m
CONFIG_PATA_CS5530=m
CONFIG_PATA_CS5535=m
CONFIG_PATA_CS5536=m
CONFIG_PATA_CYPRESS=m
CONFIG_PATA_EFAR=m
CONFIG_PATA_HPT366=m
CONFIG_PATA_HPT37X=m
CONFIG_PATA_HPT3X2N=m
CONFIG_PATA_HPT3X3=m
# CONFIG_PATA_HPT3X3_DMA is not set
CONFIG_PATA_IT8213=m
CONFIG_PATA_IT821X=m
CONFIG_PATA_JMICRON=m
CONFIG_PATA_MARVELL=m
CONFIG_PATA_NETCELL=m
CONFIG_PATA_NINJA32=m
CONFIG_PATA_NS87415=m
CONFIG_PATA_OLDPIIX=m
CONFIG_PATA_OPTIDMA=m
CONFIG_PATA_PDC2027X=m
CONFIG_PATA_PDC_OLD=m
CONFIG_PATA_RADISYS=m
CONFIG_PATA_RDC=m
CONFIG_PATA_SC1200=m
CONFIG_PATA_SCH=m
CONFIG_PATA_SERVERWORKS=m
CONFIG_PATA_SIL680=m
CONFIG_PATA_SIS=y
# CONFIG_PATA_TOSHIBA is not set
CONFIG_PATA_TRIFLEX=m
CONFIG_PATA_VIA=m
CONFIG_PATA_WINBOND=m

#
# PIO-only SFF controllers
#
CONFIG_PATA_CMD640_PCI=m
CONFIG_PATA_ISAPNP=m
CONFIG_PATA_MPIIX=m
CONFIG_PATA_NS87410=m
CONFIG_PATA_OPTI=m
CONFIG_PATA_PCMCIA=m
CONFIG_PATA_PLATFORM=m
CONFIG_PATA_QDI=m
CONFIG_PATA_RZ1000=m
CONFIG_PATA_WINBOND_VLB=m

#
# Generic fallback / legacy drivers
#
CONFIG_PATA_ACPI=y
CONFIG_ATA_GENERIC=y
CONFIG_PATA_LEGACY=m
CONFIG_MD=y
CONFIG_BLK_DEV_MD=y
CONFIG_MD_AUTODETECT=y
CONFIG_MD_LINEAR=m
CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m
CONFIG_MD_RAID10=m
CONFIG_MD_RAID456=m
# CONFIG_MULTICORE_RAID456 is not set
CONFIG_MD_MULTIPATH=m
CONFIG_MD_FAULTY=m
CONFIG_BLK_DEV_DM=y
# CONFIG_DM_DEBUG is not set
CONFIG_DM_CRYPT=m
CONFIG_DM_SNAPSHOT=y
CONFIG_DM_MIRROR=y
CONFIG_DM_RAID=m
# CONFIG_DM_LOG_USERSPACE is not set
CONFIG_DM_ZERO=m
CONFIG_DM_MULTIPATH=y
CONFIG_DM_MULTIPATH_QL=m
CONFIG_DM_MULTIPATH_ST=m
# CONFIG_DM_DELAY is not set
CONFIG_DM_UEVENT=y
# CONFIG_DM_FLAKEY is not set
CONFIG_TARGET_CORE=m
CONFIG_TCM_IBLOCK=m
CONFIG_TCM_FILEIO=m
CONFIG_TCM_PSCSI=m
# CONFIG_LOOPBACK_TARGET is not set
# CONFIG_TCM_FC is not set
# CONFIG_ISCSI_TARGET is not set
CONFIG_FUSION=y
CONFIG_FUSION_SPI=m
CONFIG_FUSION_FC=m
CONFIG_FUSION_SAS=m
CONFIG_FUSION_MAX_SGE=128
CONFIG_FUSION_CTL=m
CONFIG_FUSION_LAN=m
CONFIG_FUSION_LOGGING=y

#
# IEEE 1394 (FireWire) support
#
CONFIG_FIREWIRE=m
CONFIG_FIREWIRE_OHCI=m
CONFIG_FIREWIRE_OHCI_DEBUG=y
CONFIG_FIREWIRE_SBP2=m
CONFIG_FIREWIRE_NET=m
CONFIG_FIREWIRE_NOSY=m
CONFIG_I2O=m
CONFIG_I2O_LCT_NOTIFY_ON_CHANGES=y
CONFIG_I2O_EXT_ADAPTEC=y
CONFIG_I2O_EXT_ADAPTEC_DMA64=y
CONFIG_I2O_CONFIG=m
CONFIG_I2O_CONFIG_OLD_IOCTL=y
CONFIG_I2O_BUS=m
CONFIG_I2O_BLOCK=m
CONFIG_I2O_SCSI=m
CONFIG_I2O_PROC=m
CONFIG_MACINTOSH_DRIVERS=y
CONFIG_MAC_EMUMOUSEBTN=y
CONFIG_NETDEVICES=y
CONFIG_IFB=m
CONFIG_DUMMY=m
CONFIG_BONDING=m
CONFIG_MACVLAN=m
# CONFIG_MACVTAP is not set
CONFIG_EQUALIZER=m
CONFIG_TUN=y
CONFIG_VETH=m
CONFIG_NET_SB1000=m
# CONFIG_ARCNET is not set
CONFIG_MII=y
CONFIG_PHYLIB=y

#
# MII PHY device drivers
#
CONFIG_MARVELL_PHY=y
CONFIG_DAVICOM_PHY=y
CONFIG_QSEMI_PHY=y
CONFIG_LXT_PHY=y
CONFIG_CICADA_PHY=y
CONFIG_VITESSE_PHY=y
CONFIG_SMSC_PHY=y
CONFIG_BROADCOM_PHY=y
CONFIG_ICPLUS_PHY=y
CONFIG_REALTEK_PHY=y
CONFIG_NATIONAL_PHY=y
CONFIG_STE10XP=y
CONFIG_LSI_ET1011C_PHY=y
CONFIG_MICREL_PHY=m
CONFIG_FIXED_PHY=y
CONFIG_MDIO_BITBANG=y
CONFIG_MDIO_GPIO=y
CONFIG_NET_ETHERNET=y
CONFIG_HAPPYMEAL=m
CONFIG_SUNGEM=m
CONFIG_CASSINI=m
CONFIG_NET_VENDOR_3COM=y
CONFIG_EL1=m
CONFIG_EL2=m
CONFIG_ELPLUS=m
CONFIG_EL16=m
CONFIG_EL3=m
CONFIG_3C515=m
CONFIG_ELMC=m
CONFIG_ELMC_II=m
CONFIG_VORTEX=m
CONFIG_TYPHOON=m
CONFIG_LANCE=m
CONFIG_NET_VENDOR_SMC=y
CONFIG_WD80x3=m
CONFIG_ULTRAMCA=m
CONFIG_ULTRA=m
CONFIG_ULTRA32=m
CONFIG_SMC9194=m
CONFIG_ETHOC=m
CONFIG_NET_VENDOR_RACAL=y
CONFIG_NI52=m
CONFIG_NI65=m
CONFIG_DNET=m
CONFIG_NET_TULIP=y
CONFIG_DE2104X=m
CONFIG_DE2104X_DSL=0
CONFIG_TULIP=m
# CONFIG_TULIP_MWI is not set
# CONFIG_TULIP_MMIO is not set
# CONFIG_TULIP_NAPI is not set
CONFIG_DE4X5=m
CONFIG_WINBOND_840=m
CONFIG_DM9102=m
CONFIG_ULI526X=m
CONFIG_PCMCIA_XIRCOM=m
CONFIG_AT1700=m
CONFIG_DEPCA=m
CONFIG_HP100=m
CONFIG_NET_ISA=y
CONFIG_E2100=m
CONFIG_EWRK3=m
CONFIG_EEXPRESS=m
CONFIG_EEXPRESS_PRO=m
CONFIG_HPLAN_PLUS=m
CONFIG_HPLAN=m
CONFIG_LP486E=m
CONFIG_ETH16I=m
CONFIG_NE2000=m
CONFIG_ZNET=m
CONFIG_SEEQ8005=m
CONFIG_NE2_MCA=m
CONFIG_IBMLANA=m
# CONFIG_IBM_NEW_EMAC_ZMII is not set
# CONFIG_IBM_NEW_EMAC_RGMII is not set
# CONFIG_IBM_NEW_EMAC_TAH is not set
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set
# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set
# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set
CONFIG_NET_PCI=y
CONFIG_PCNET32=m
CONFIG_AMD8111_ETH=m
CONFIG_ADAPTEC_STARFIRE=m
CONFIG_AC3200=m
CONFIG_KSZ884X_PCI=m
CONFIG_APRICOT=m
CONFIG_B44=m
CONFIG_B44_PCI_AUTOSELECT=y
CONFIG_B44_PCICORE_AUTOSELECT=y
CONFIG_B44_PCI=y
CONFIG_FORCEDETH=m
CONFIG_CS89x0=m
CONFIG_E100=m
CONFIG_LNE390=m
CONFIG_FEALNX=m
CONFIG_NATSEMI=m
CONFIG_NE2K_PCI=m
CONFIG_NE3210=m
CONFIG_ES3210=m
CONFIG_8139CP=m
CONFIG_8139TOO=m
CONFIG_8139TOO_PIO=y
# CONFIG_8139TOO_TUNE_TWISTER is not set
CONFIG_8139TOO_8129=y
# CONFIG_8139_OLD_RX_RESET is not set
# CONFIG_R6040 is not set
CONFIG_SIS900=m
CONFIG_EPIC100=m
CONFIG_SMSC9420=m
CONFIG_SUNDANCE=m
# CONFIG_SUNDANCE_MMIO is not set
CONFIG_TLAN=m
CONFIG_KS8842=m
CONFIG_KS8851_MLL=m
CONFIG_VIA_RHINE=m
CONFIG_VIA_RHINE_MMIO=y
CONFIG_SC92031=m
CONFIG_NET_POCKET=y
CONFIG_ATP=m
CONFIG_DE600=m
CONFIG_DE620=m
CONFIG_ATL2=m
CONFIG_NETDEV_1000=y
CONFIG_ACENIC=m
# CONFIG_ACENIC_OMIT_TIGON_I is not set
# CONFIG_DL2K is not set
CONFIG_E1000=m
CONFIG_E1000E=m
CONFIG_IP1000=m
CONFIG_IGB=m
CONFIG_IGB_DCA=y
CONFIG_IGBVF=m
CONFIG_NS83820=m
CONFIG_HAMACHI=m
CONFIG_YELLOWFIN=m
CONFIG_R8169=m
CONFIG_SIS190=m
CONFIG_SKGE=m
# CONFIG_SKGE_DEBUG is not set
CONFIG_SKGE_GENESIS=y
CONFIG_SKY2=m
# CONFIG_SKY2_DEBUG is not set
CONFIG_VIA_VELOCITY=m
CONFIG_TIGON3=m
CONFIG_BNX2=m
CONFIG_CNIC=m
CONFIG_QLA3XXX=m
CONFIG_ATL1=m
CONFIG_ATL1E=m
CONFIG_ATL1C=m
CONFIG_JME=m
CONFIG_STMMAC_ETH=m
# CONFIG_STMMAC_DA is not set
# CONFIG_STMMAC_DUAL_MAC is not set
CONFIG_PCH_GBE=m
CONFIG_NETDEV_10000=y
CONFIG_MDIO=m
CONFIG_CHELSIO_T1=m
CONFIG_CHELSIO_T1_1G=y
CONFIG_CHELSIO_T3=m
CONFIG_CHELSIO_T4=m
CONFIG_CHELSIO_T4VF=m
CONFIG_ENIC=m
CONFIG_IXGBE=m
CONFIG_IXGBE_DCA=y
CONFIG_IXGBEVF=m
CONFIG_IXGB=m
CONFIG_S2IO=m
CONFIG_VXGE=m
# CONFIG_VXGE_DEBUG_TRACE_ALL is not set
CONFIG_MYRI10GE=m
CONFIG_MYRI10GE_DCA=y
CONFIG_NETXEN_NIC=m
CONFIG_NIU=m
CONFIG_MLX4_EN=m
CONFIG_MLX4_CORE=m
CONFIG_MLX4_DEBUG=y
CONFIG_TEHUTI=m
CONFIG_BNX2X=m
CONFIG_QLCNIC=m
CONFIG_QLGE=m
CONFIG_BNA=m
CONFIG_SFC=m
CONFIG_SFC_MTD=y
CONFIG_BE2NET=m
CONFIG_TR=y
CONFIG_IBMTR=m
CONFIG_IBMOL=m
CONFIG_IBMLS=m
CONFIG_3C359=m
CONFIG_TMS380TR=m
CONFIG_TMSPCI=m
CONFIG_SKISA=m
CONFIG_PROTEON=m
CONFIG_ABYSS=m
CONFIG_MADGEMC=m
CONFIG_SMCTR=m
# CONFIG_WLAN is not set

#
# Enable WiMAX (Networking options) to see the WiMAX drivers
#

#
# USB Network Adapters
#
CONFIG_USB_CATC=m
CONFIG_USB_KAWETH=m
CONFIG_USB_PEGASUS=m
CONFIG_USB_RTL8150=m
CONFIG_USB_USBNET=m
CONFIG_USB_NET_AX8817X=m
CONFIG_USB_NET_CDCETHER=m
CONFIG_USB_NET_CDC_EEM=m
CONFIG_USB_NET_CDC_NCM=m
CONFIG_USB_NET_DM9601=m
CONFIG_USB_NET_SMSC75XX=m
CONFIG_USB_NET_SMSC95XX=m
CONFIG_USB_NET_GL620A=m
CONFIG_USB_NET_NET1080=m
CONFIG_USB_NET_PLUSB=m
CONFIG_USB_NET_MCS7830=m
CONFIG_USB_NET_RNDIS_HOST=m
CONFIG_USB_NET_CDC_SUBSET=m
CONFIG_USB_ALI_M5632=y
CONFIG_USB_AN2720=y
CONFIG_USB_BELKIN=y
CONFIG_USB_ARMLINUX=y
CONFIG_USB_EPSON2888=y
CONFIG_USB_KC2190=y
CONFIG_USB_NET_ZAURUS=m
CONFIG_USB_NET_CX82310_ETH=m
# CONFIG_USB_NET_KALMIA is not set
CONFIG_USB_NET_INT51X1=m
CONFIG_USB_IPHETH=m
CONFIG_USB_SIERRA_NET=m
# CONFIG_USB_VL600 is not set
CONFIG_NET_PCMCIA=y
CONFIG_PCMCIA_3C589=m
CONFIG_PCMCIA_3C574=m
CONFIG_PCMCIA_FMVJ18X=m
CONFIG_PCMCIA_PCNET=m
CONFIG_PCMCIA_NMCLAN=m
CONFIG_PCMCIA_SMC91C92=m
CONFIG_PCMCIA_XIRC2PS=m
CONFIG_PCMCIA_AXNET=m
CONFIG_PCMCIA_IBMTR=m
# CONFIG_WAN is not set

#
# CAIF transport drivers
#
CONFIG_XEN_NETDEV_FRONTEND=y
CONFIG_XEN_NETDEV_BACKEND=y
CONFIG_FDDI=y
CONFIG_DEFXX=m
# CONFIG_DEFXX_MMIO is not set
CONFIG_SKFP=m
CONFIG_HIPPI=y
CONFIG_ROADRUNNER=m
# CONFIG_ROADRUNNER_LARGE_RINGS is not set
CONFIG_PLIP=m
CONFIG_PPP=y
CONFIG_PPP_MULTILINK=y
CONFIG_PPP_FILTER=y
CONFIG_PPP_ASYNC=m
CONFIG_PPP_SYNC_TTY=m
CONFIG_PPP_DEFLATE=m
CONFIG_PPP_BSDCOMP=m
CONFIG_PPP_MPPE=m
CONFIG_PPPOE=m
CONFIG_SLIP=m
CONFIG_SLIP_COMPRESSED=y
CONFIG_SLHC=y
CONFIG_SLIP_SMART=y
CONFIG_SLIP_MODE_SLIP6=y
CONFIG_NET_FC=y
CONFIG_NETCONSOLE=m
CONFIG_NETCONSOLE_DYNAMIC=y
CONFIG_NETPOLL=y
# CONFIG_NETPOLL_TRAP is not set
CONFIG_NET_POLL_CONTROLLER=y
CONFIG_VIRTIO_NET=y
# CONFIG_VMXNET3 is not set
# CONFIG_ISDN is not set
# CONFIG_PHONE is not set

#
# Input device support
#
CONFIG_INPUT=y
CONFIG_INPUT_FF_MEMLESS=m
CONFIG_INPUT_POLLDEV=m
CONFIG_INPUT_SPARSEKMAP=m

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set

#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
CONFIG_KEYBOARD_ADP5520=m
CONFIG_KEYBOARD_ADP5588=m
# CONFIG_KEYBOARD_ADP5589 is not set
CONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_QT1070 is not set
# CONFIG_KEYBOARD_QT2160 is not set
CONFIG_KEYBOARD_LKKBD=m
CONFIG_KEYBOARD_GPIO=m
CONFIG_KEYBOARD_GPIO_POLLED=m
CONFIG_KEYBOARD_TCA6416=m
CONFIG_KEYBOARD_MATRIX=m
CONFIG_KEYBOARD_LM8323=m
CONFIG_KEYBOARD_MAX7359=m
CONFIG_KEYBOARD_MCS=m
# CONFIG_KEYBOARD_MPR121 is not set
CONFIG_KEYBOARD_NEWTON=m
CONFIG_KEYBOARD_OPENCORES=m
CONFIG_KEYBOARD_STOWAWAY=m
CONFIG_KEYBOARD_SUNKBD=m
CONFIG_KEYBOARD_STMPE=m
CONFIG_KEYBOARD_TC3589X=m
CONFIG_KEYBOARD_XTKBD=m
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=m
CONFIG_MOUSE_PS2_ALPS=y
CONFIG_MOUSE_PS2_LOGIPS2PP=y
CONFIG_MOUSE_PS2_SYNAPTICS=y
CONFIG_MOUSE_PS2_LIFEBOOK=y
CONFIG_MOUSE_PS2_TRACKPOINT=y
CONFIG_MOUSE_PS2_ELANTECH=y
CONFIG_MOUSE_PS2_SENTELIC=y
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
CONFIG_MOUSE_SERIAL=m
CONFIG_MOUSE_APPLETOUCH=m
CONFIG_MOUSE_BCM5974=m
CONFIG_MOUSE_INPORT=m
# CONFIG_MOUSE_ATIXL is not set
CONFIG_MOUSE_LOGIBM=m
CONFIG_MOUSE_PC110PAD=m
CONFIG_MOUSE_VSXXXAA=m
CONFIG_MOUSE_GPIO=m
CONFIG_MOUSE_SYNAPTICS_I2C=m
# CONFIG_INPUT_JOYSTICK is not set
# CONFIG_INPUT_TABLET is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
CONFIG_INPUT_MISC=y
CONFIG_INPUT_88PM860X_ONKEY=m
CONFIG_INPUT_AB8500_PONKEY=m
CONFIG_INPUT_AD714X=m
CONFIG_INPUT_AD714X_I2C=m
CONFIG_INPUT_PCSPKR=m
CONFIG_INPUT_MAX8925_ONKEY=m
# CONFIG_INPUT_MMA8450 is not set
# CONFIG_INPUT_MPU3050 is not set
# CONFIG_INPUT_APANEL is not set
CONFIG_INPUT_WISTRON_BTNS=m
CONFIG_INPUT_ATLAS_BTNS=m
CONFIG_INPUT_ATI_REMOTE=m
CONFIG_INPUT_ATI_REMOTE2=m
CONFIG_INPUT_KEYSPAN_REMOTE=m
# CONFIG_INPUT_KXTJ9 is not set
CONFIG_INPUT_POWERMATE=m
CONFIG_INPUT_YEALINK=m
CONFIG_INPUT_CM109=m
CONFIG_INPUT_UINPUT=y
CONFIG_INPUT_PCF50633_PMU=m
CONFIG_INPUT_PCF8574=m
CONFIG_INPUT_GPIO_ROTARY_ENCODER=m
CONFIG_INPUT_WM831X_ON=m
CONFIG_INPUT_ADXL34X=m
CONFIG_INPUT_ADXL34X_I2C=m
CONFIG_INPUT_CMA3000=m
CONFIG_INPUT_CMA3000_I2C=m

#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_SERIO_SERPORT=m
CONFIG_SERIO_CT82C710=m
CONFIG_SERIO_PARKBD=m
CONFIG_SERIO_PCIPS2=m
CONFIG_SERIO_LIBPS2=y
CONFIG_SERIO_RAW=m
CONFIG_SERIO_ALTERA_PS2=m
CONFIG_SERIO_PS2MULT=m
# CONFIG_GAMEPORT is not set

#
# Character devices
#
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
# CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_NONSTANDARD=y
CONFIG_ROCKETPORT=m
CONFIG_CYCLADES=m
# CONFIG_CYZ_INTR is not set
CONFIG_MOXA_INTELLIO=m
CONFIG_MOXA_SMARTIO=m
CONFIG_SYNCLINK=m
CONFIG_SYNCLINKMP=m
CONFIG_SYNCLINK_GT=m
CONFIG_NOZOMI=m
# CONFIG_ISI is not set
CONFIG_N_HDLC=m
# CONFIG_N_GSM is not set
# CONFIG_TRACE_SINK is not set
# CONFIG_DEVKMEM is not set
CONFIG_STALDRV=y

#
# Serial drivers
#
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_PNP=y
CONFIG_SERIAL_8250_CS=m
CONFIG_SERIAL_8250_NR_UARTS=48
CONFIG_SERIAL_8250_RUNTIME_UARTS=32
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_FOURPORT=m
CONFIG_SERIAL_8250_ACCENT=m
CONFIG_SERIAL_8250_BOCA=m
CONFIG_SERIAL_8250_EXAR_ST16C554=m
CONFIG_SERIAL_8250_HUB6=m
CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
CONFIG_SERIAL_8250_RSA=y
CONFIG_SERIAL_8250_MCA=m

#
# Non-8250 serial port support
#
CONFIG_SERIAL_MFD_HSU=m
CONFIG_SERIAL_UARTLITE=m
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_CONSOLE_POLL=y
CONFIG_SERIAL_JSM=m
CONFIG_SERIAL_TIMBERDALE=m
CONFIG_SERIAL_ALTERA_JTAGUART=m
CONFIG_SERIAL_ALTERA_UART=m
CONFIG_SERIAL_ALTERA_UART_MAXPORTS=4
CONFIG_SERIAL_ALTERA_UART_BAUDRATE=115200
CONFIG_SERIAL_PCH_UART=m
# CONFIG_SERIAL_XILINX_PS_UART is not set
CONFIG_TTY_PRINTK=y
# CONFIG_PRINTER is not set
CONFIG_PPDEV=m
CONFIG_HVC_DRIVER=y
CONFIG_HVC_IRQ=y
CONFIG_HVC_XEN=y
CONFIG_VIRTIO_CONSOLE=m
CONFIG_IPMI_HANDLER=m
# CONFIG_IPMI_PANIC_EVENT is not set
CONFIG_IPMI_DEVICE_INTERFACE=m
CONFIG_IPMI_SI=m
CONFIG_IPMI_WATCHDOG=m
CONFIG_IPMI_POWEROFF=m
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_TIMERIOMEM=m
CONFIG_HW_RANDOM_INTEL=m
CONFIG_HW_RANDOM_AMD=m
CONFIG_HW_RANDOM_GEODE=m
CONFIG_HW_RANDOM_VIA=m
CONFIG_HW_RANDOM_VIRTIO=m
CONFIG_NVRAM=m
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_SONYPI is not set

#
# PCMCIA character devices
#
CONFIG_SYNCLINK_CS=m
CONFIG_CARDMAN_4000=m
CONFIG_CARDMAN_4040=m
CONFIG_IPWIRELESS=m
# CONFIG_MWAVE is not set
# CONFIG_SCx200_GPIO is not set
# CONFIG_PC8736x_GPIO is not set
# CONFIG_NSC_GPIO is not set
CONFIG_RAW_DRIVER=m
CONFIG_MAX_RAW_DEVS=256
CONFIG_HPET=y
CONFIG_HPET_MMAP=y
CONFIG_HANGCHECK_TIMER=m
CONFIG_TCG_TPM=m
CONFIG_TCG_TIS=m
CONFIG_TCG_NSC=m
CONFIG_TCG_ATMEL=m
CONFIG_TCG_INFINEON=m
CONFIG_TELCLOCK=m
CONFIG_DEVPORT=y
CONFIG_RAMOOPS=m
CONFIG_I2C=y
CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_COMPAT=y
CONFIG_I2C_CHARDEV=m
CONFIG_I2C_MUX=m

#
# Multiplexer I2C Chip support
#
CONFIG_I2C_MUX_GPIO=m
CONFIG_I2C_MUX_PCA9541=m
CONFIG_I2C_MUX_PCA954x=m
# CONFIG_I2C_HELPER_AUTO is not set
CONFIG_I2C_SMBUS=m

#
# I2C Algorithms
#
CONFIG_I2C_ALGOBIT=m
CONFIG_I2C_ALGOPCF=m
CONFIG_I2C_ALGOPCA=m

#
# I2C Hardware Bus support
#

#
# PC SMBus host controller drivers
#
CONFIG_I2C_ALI1535=m
CONFIG_I2C_ALI1563=m
CONFIG_I2C_ALI15X3=m
CONFIG_I2C_AMD756=m
CONFIG_I2C_AMD756_S4882=m
CONFIG_I2C_AMD8111=m
CONFIG_I2C_I801=m
CONFIG_I2C_ISCH=m
CONFIG_I2C_PIIX4=m
CONFIG_I2C_NFORCE2=m
CONFIG_I2C_NFORCE2_S4985=m
CONFIG_I2C_SIS5595=m
CONFIG_I2C_SIS630=m
CONFIG_I2C_SIS96X=m
CONFIG_I2C_VIA=m
CONFIG_I2C_VIAPRO=m

#
# ACPI drivers
#
CONFIG_I2C_SCMI=m

#
# I2C system bus drivers (mostly embedded / system-on-chip)
#
CONFIG_I2C_GPIO=m
CONFIG_I2C_INTEL_MID=m
CONFIG_I2C_OCORES=m
CONFIG_I2C_PCA_PLATFORM=m
# CONFIG_I2C_PXA_PCI is not set
CONFIG_I2C_SIMTEC=m
CONFIG_I2C_XILINX=m
CONFIG_I2C_EG20T=m

#
# External I2C/SMBus adapter drivers
#
# CONFIG_I2C_DIOLAN_U2C is not set
CONFIG_I2C_PARPORT=m
CONFIG_I2C_PARPORT_LIGHT=m
CONFIG_I2C_TAOS_EVM=m
CONFIG_I2C_TINY_USB=m

#
# Other I2C/SMBus bus drivers
#
CONFIG_I2C_PCA_ISA=m
CONFIG_I2C_STUB=m
CONFIG_SCx200_ACB=m
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
# CONFIG_SPI is not set

#
# PPS support
#
CONFIG_PPS=m
# CONFIG_PPS_DEBUG is not set

#
# PPS clients support
#
# CONFIG_PPS_CLIENT_KTIMER is not set
CONFIG_PPS_CLIENT_LDISC=m
CONFIG_PPS_CLIENT_PARPORT=m

#
# PPS generators support
#

#
# PTP clock support
#
# CONFIG_PTP_1588_CLOCK is not set
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
CONFIG_GPIOLIB=y
# CONFIG_DEBUG_GPIO is not set
CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_GENERIC=m
CONFIG_GPIO_MAX730X=m

#
# Memory mapped GPIO drivers:
#
CONFIG_GPIO_GENERIC_PLATFORM=m
CONFIG_GPIO_IT8761E=m
CONFIG_GPIO_SCH=m
CONFIG_GPIO_VX855=m

#
# I2C GPIO expanders:
#
CONFIG_GPIO_MAX7300=m
CONFIG_GPIO_MAX732X=m
CONFIG_GPIO_PCA953X=m
CONFIG_GPIO_PCF857X=m
CONFIG_GPIO_SX150X=y
CONFIG_GPIO_STMPE=y
CONFIG_GPIO_TC3589X=y
# CONFIG_GPIO_TPS65912 is not set
CONFIG_GPIO_WM831X=m
CONFIG_GPIO_WM8350=m
CONFIG_GPIO_WM8994=m
CONFIG_GPIO_ADP5520=m
CONFIG_GPIO_ADP5588=m

#
# PCI GPIO expanders:
#
CONFIG_GPIO_CS5535=m
# CONFIG_GPIO_BT8XX is not set
CONFIG_GPIO_LANGWELL=y
CONFIG_GPIO_PCH=m
CONFIG_GPIO_ML_IOH=m
CONFIG_GPIO_TIMBERDALE=y
CONFIG_GPIO_RDC321X=m

#
# SPI GPIO expanders:
#
CONFIG_GPIO_MCP23S08=m

#
# AC97 GPIO expanders:
#

#
# MODULbus GPIO expanders:
#
CONFIG_GPIO_JANZ_TTL=m
CONFIG_GPIO_TPS65910=y
# CONFIG_W1 is not set
CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
CONFIG_PDA_POWER=m
CONFIG_MAX8925_POWER=m
CONFIG_WM831X_BACKUP=m
CONFIG_WM831X_POWER=m
CONFIG_WM8350_POWER=m
CONFIG_TEST_POWER=m
# CONFIG_BATTERY_DS2780 is not set
CONFIG_BATTERY_DS2782=m
CONFIG_BATTERY_BQ20Z75=m
CONFIG_BATTERY_BQ27x00=m
CONFIG_BATTERY_BQ27X00_I2C=y
CONFIG_BATTERY_BQ27X00_PLATFORM=y
CONFIG_BATTERY_DA9030=m
CONFIG_BATTERY_MAX17040=m
CONFIG_BATTERY_MAX17042=m
CONFIG_CHARGER_PCF50633=m
CONFIG_CHARGER_MAX8903=m
CONFIG_CHARGER_GPIO=m
# CONFIG_CHARGER_MAX8998 is not set
CONFIG_HWMON=y
CONFIG_HWMON_VID=m
# CONFIG_HWMON_DEBUG_CHIP is not set

#
# Native drivers
#
CONFIG_SENSORS_ABITUGURU=m
CONFIG_SENSORS_ABITUGURU3=m
CONFIG_SENSORS_AD7414=m
CONFIG_SENSORS_AD7418=m
CONFIG_SENSORS_ADM1021=m
CONFIG_SENSORS_ADM1025=m
CONFIG_SENSORS_ADM1026=m
CONFIG_SENSORS_ADM1029=m
CONFIG_SENSORS_ADM1031=m
CONFIG_SENSORS_ADM9240=m
CONFIG_SENSORS_ADT7411=m
CONFIG_SENSORS_ADT7462=m
CONFIG_SENSORS_ADT7470=m
CONFIG_SENSORS_ADT7475=m
CONFIG_SENSORS_ASC7621=m
CONFIG_SENSORS_K8TEMP=m
CONFIG_SENSORS_K10TEMP=m
# CONFIG_SENSORS_FAM15H_POWER is not set
CONFIG_SENSORS_ASB100=m
CONFIG_SENSORS_ATXP1=m
CONFIG_SENSORS_DS620=m
CONFIG_SENSORS_DS1621=m
CONFIG_SENSORS_I5K_AMB=m
CONFIG_SENSORS_F71805F=m
CONFIG_SENSORS_F71882FG=m
CONFIG_SENSORS_F75375S=m
CONFIG_SENSORS_FSCHMD=m
CONFIG_SENSORS_G760A=m
CONFIG_SENSORS_GL518SM=m
CONFIG_SENSORS_GL520SM=m
CONFIG_SENSORS_GPIO_FAN=m
CONFIG_SENSORS_CORETEMP=m
CONFIG_SENSORS_IBMAEM=m
CONFIG_SENSORS_IBMPEX=m
CONFIG_SENSORS_IT87=m
CONFIG_SENSORS_JC42=m
# CONFIG_SENSORS_LINEAGE is not set
CONFIG_SENSORS_LM63=m
CONFIG_SENSORS_LM73=m
CONFIG_SENSORS_LM75=m
CONFIG_SENSORS_LM77=m
CONFIG_SENSORS_LM78=m
CONFIG_SENSORS_LM80=m
CONFIG_SENSORS_LM83=m
CONFIG_SENSORS_LM85=m
CONFIG_SENSORS_LM87=m
CONFIG_SENSORS_LM90=m
CONFIG_SENSORS_LM92=m
CONFIG_SENSORS_LM93=m
# CONFIG_SENSORS_LTC4151 is not set
CONFIG_SENSORS_LTC4215=m
CONFIG_SENSORS_LTC4245=m
CONFIG_SENSORS_LTC4261=m
CONFIG_SENSORS_LM95241=m
CONFIG_SENSORS_LM95245=m
# CONFIG_SENSORS_MAX16065 is not set
CONFIG_SENSORS_MAX1619=m
CONFIG_SENSORS_MAX1668=m
# CONFIG_SENSORS_MAX6639 is not set
# CONFIG_SENSORS_MAX6642 is not set
CONFIG_SENSORS_MAX6650=m
CONFIG_SENSORS_NTC_THERMISTOR=m
CONFIG_SENSORS_PC87360=m
CONFIG_SENSORS_PC87427=m
CONFIG_SENSORS_PCF8591=m
# CONFIG_PMBUS is not set
CONFIG_SENSORS_SHT15=m
CONFIG_SENSORS_SHT21=m
CONFIG_SENSORS_SIS5595=m
CONFIG_SENSORS_SMM665=m
CONFIG_SENSORS_DME1737=m
CONFIG_SENSORS_EMC1403=m
CONFIG_SENSORS_EMC2103=m
# CONFIG_SENSORS_EMC6W201 is not set
CONFIG_SENSORS_SMSC47M1=m
CONFIG_SENSORS_SMSC47M192=m
CONFIG_SENSORS_SMSC47B397=m
CONFIG_SENSORS_SCH56XX_COMMON=m
# CONFIG_SENSORS_SCH5627 is not set
CONFIG_SENSORS_SCH5636=m
# CONFIG_SENSORS_ADS1015 is not set
CONFIG_SENSORS_ADS7828=m
CONFIG_SENSORS_AMC6821=m
CONFIG_SENSORS_THMC50=m
CONFIG_SENSORS_TMP102=m
CONFIG_SENSORS_TMP401=m
CONFIG_SENSORS_TMP421=m
CONFIG_SENSORS_VIA_CPUTEMP=m
CONFIG_SENSORS_VIA686A=m
CONFIG_SENSORS_VT1211=m
CONFIG_SENSORS_VT8231=m
CONFIG_SENSORS_W83781D=m
CONFIG_SENSORS_W83791D=m
CONFIG_SENSORS_W83792D=m
CONFIG_SENSORS_W83793=m
CONFIG_SENSORS_W83795=m
# CONFIG_SENSORS_W83795_FANCTRL is not set
CONFIG_SENSORS_W83L785TS=m
CONFIG_SENSORS_W83L786NG=m
CONFIG_SENSORS_W83627HF=m
CONFIG_SENSORS_W83627EHF=m
CONFIG_SENSORS_WM831X=m
CONFIG_SENSORS_WM8350=m
CONFIG_SENSORS_APPLESMC=m

#
# ACPI drivers
#
# CONFIG_SENSORS_ACPI_POWER is not set
CONFIG_SENSORS_ATK0110=m
CONFIG_THERMAL=y
CONFIG_THERMAL_HWMON=y
CONFIG_WATCHDOG=y
CONFIG_WATCHDOG_CORE=y
# CONFIG_WATCHDOG_NOWAYOUT is not set

#
# Watchdog Device Drivers
#
CONFIG_SOFT_WATCHDOG=m
CONFIG_WM831X_WATCHDOG=m
CONFIG_WM8350_WATCHDOG=m
CONFIG_ACQUIRE_WDT=m
CONFIG_ADVANTECH_WDT=m
CONFIG_ALIM1535_WDT=m
CONFIG_ALIM7101_WDT=m
CONFIG_F71808E_WDT=m
CONFIG_SP5100_TCO=m
CONFIG_SC520_WDT=m
CONFIG_SBC_FITPC2_WATCHDOG=m
CONFIG_EUROTECH_WDT=m
CONFIG_IB700_WDT=m
CONFIG_IBMASR=m
CONFIG_WAFER_WDT=m
CONFIG_I6300ESB_WDT=m
CONFIG_ITCO_WDT=m
CONFIG_ITCO_VENDOR_SUPPORT=y
CONFIG_IT8712F_WDT=m
CONFIG_IT87_WDT=m
# CONFIG_HP_WATCHDOG is not set
CONFIG_SC1200_WDT=m
CONFIG_SCx200_WDT=m
CONFIG_PC87413_WDT=m
CONFIG_NV_TCO=m
CONFIG_60XX_WDT=m
CONFIG_SBC8360_WDT=m
CONFIG_SBC7240_WDT=m
CONFIG_CPU5_WDT=m
CONFIG_SMSC_SCH311X_WDT=m
CONFIG_SMSC37B787_WDT=m
CONFIG_W83627HF_WDT=m
CONFIG_W83697HF_WDT=m
CONFIG_W83697UG_WDT=m
CONFIG_W83877F_WDT=m
CONFIG_W83977F_WDT=m
CONFIG_MACHZ_WDT=m
CONFIG_SBC_EPX_C3_WATCHDOG=m
CONFIG_XEN_WDT=y

#
# ISA-based Watchdog Cards
#
CONFIG_PCWATCHDOG=m
CONFIG_MIXCOMWD=m
CONFIG_WDT=m

#
# PCI-based Watchdog Cards
#
CONFIG_PCIPCWATCHDOG=m
CONFIG_WDTPCI=m

#
# USB-based Watchdog Cards
#
CONFIG_USBPCWATCHDOG=m
CONFIG_SSB_POSSIBLE=y

#
# Sonics Silicon Backplane
#
CONFIG_SSB=m
CONFIG_SSB_SPROM=y
CONFIG_SSB_PCIHOST_POSSIBLE=y
CONFIG_SSB_PCIHOST=y
# CONFIG_SSB_B43_PCI_BRIDGE is not set
CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
# CONFIG_SSB_PCMCIAHOST is not set
# CONFIG_SSB_SILENT is not set
# CONFIG_SSB_DEBUG is not set
CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
CONFIG_SSB_DRIVER_PCICORE=y
CONFIG_BCMA_POSSIBLE=y

#
# Broadcom specific AMBA
#
# CONFIG_BCMA is not set
CONFIG_MFD_SUPPORT=y
CONFIG_MFD_CORE=y
CONFIG_MFD_88PM860X=y
CONFIG_MFD_SM501=m
# CONFIG_MFD_SM501_GPIO is not set
CONFIG_HTC_PASIC3=m
CONFIG_HTC_I2CPLD=y
# CONFIG_TPS6105X is not set
CONFIG_TPS65010=m
CONFIG_TPS6507X=m
CONFIG_MFD_TPS6586X=y
CONFIG_MFD_TPS65910=y
CONFIG_MFD_TPS65912=y
CONFIG_MFD_TPS65912_I2C=y
# CONFIG_TWL4030_CORE is not set
CONFIG_MFD_STMPE=y
CONFIG_MFD_TC3589X=y
# CONFIG_MFD_TMIO is not set
CONFIG_PMIC_DA903X=y
CONFIG_PMIC_ADP5520=y
CONFIG_MFD_MAX8925=y
# CONFIG_MFD_MAX8997 is not set
CONFIG_MFD_MAX8998=y
CONFIG_MFD_WM8400=m
CONFIG_MFD_WM831X=y
CONFIG_MFD_WM831X_I2C=y
CONFIG_MFD_WM8350=y
CONFIG_MFD_WM8350_I2C=y
CONFIG_MFD_WM8994=y
CONFIG_MFD_PCF50633=m
CONFIG_PCF50633_ADC=m
CONFIG_PCF50633_GPIO=m
CONFIG_ABX500_CORE=y
CONFIG_AB3100_CORE=y
CONFIG_AB3100_OTP=m
CONFIG_AB8500_CORE=y
CONFIG_AB8500_DEBUG=y
CONFIG_AB8500_GPADC=y
CONFIG_AB3550_CORE=y
CONFIG_MFD_CS5535=m
CONFIG_MFD_TIMBERDALE=m
CONFIG_LPC_SCH=m
CONFIG_MFD_RDC321X=m
CONFIG_MFD_JANZ_CMODIO=m
CONFIG_MFD_VX855=m
CONFIG_MFD_WL1273_CORE=m
CONFIG_MFD_AAT2870_CORE=y
CONFIG_REGULATOR=y
CONFIG_REGULATOR_DEBUG=y
# CONFIG_REGULATOR_DUMMY is not set
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
CONFIG_REGULATOR_VIRTUAL_CONSUMER=m
CONFIG_REGULATOR_USERSPACE_CONSUMER=m
CONFIG_REGULATOR_BQ24022=m
CONFIG_REGULATOR_MAX1586=m
CONFIG_REGULATOR_MAX8649=m
CONFIG_REGULATOR_MAX8660=m
CONFIG_REGULATOR_MAX8925=m
CONFIG_REGULATOR_MAX8952=m
CONFIG_REGULATOR_MAX8998=m
CONFIG_REGULATOR_WM831X=m
CONFIG_REGULATOR_WM8350=m
CONFIG_REGULATOR_WM8400=m
CONFIG_REGULATOR_WM8994=m
CONFIG_REGULATOR_DA903X=m
CONFIG_REGULATOR_PCF50633=m
CONFIG_REGULATOR_LP3971=m
CONFIG_REGULATOR_LP3972=m
CONFIG_REGULATOR_AB3100=m
CONFIG_REGULATOR_TPS65023=m
CONFIG_REGULATOR_TPS6507X=m
# CONFIG_REGULATOR_TPS65912 is not set
CONFIG_REGULATOR_88PM8607=y
CONFIG_REGULATOR_ISL6271A=m
CONFIG_REGULATOR_AD5398=m
CONFIG_REGULATOR_AB8500=y
CONFIG_REGULATOR_TPS6586X=m
# CONFIG_REGULATOR_TPS65910 is not set
# CONFIG_REGULATOR_AAT2870 is not set
# CONFIG_MEDIA_SUPPORT is not set

#
# Graphics support
#
CONFIG_AGP=y
CONFIG_AGP_ALI=m
CONFIG_AGP_ATI=m
CONFIG_AGP_AMD=y
CONFIG_AGP_AMD64=y
CONFIG_AGP_INTEL=y
CONFIG_AGP_NVIDIA=y
CONFIG_AGP_SIS=m
CONFIG_AGP_SWORKS=m
CONFIG_AGP_VIA=y
CONFIG_AGP_EFFICEON=m
CONFIG_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=16
CONFIG_VGA_SWITCHEROO=y
# CONFIG_DRM is not set
# CONFIG_STUB_POULSBO is not set
# CONFIG_VGASTATE is not set
CONFIG_VIDEO_OUTPUT_CONTROL=y
# CONFIG_FB is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=m
CONFIG_LCD_PLATFORM=m
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_BACKLIGHT_GENERIC=m
CONFIG_BACKLIGHT_PROGEAR=m
CONFIG_BACKLIGHT_DA903X=m
CONFIG_BACKLIGHT_MAX8925=m
# CONFIG_BACKLIGHT_APPLE is not set
CONFIG_BACKLIGHT_SAHARA=m
CONFIG_BACKLIGHT_WM831X=m
CONFIG_BACKLIGHT_ADP5520=m
CONFIG_BACKLIGHT_ADP8860=m
# CONFIG_BACKLIGHT_ADP8870 is not set
CONFIG_BACKLIGHT_88PM860X=m
CONFIG_BACKLIGHT_PCF50633=m
# CONFIG_BACKLIGHT_AAT2870 is not set

#
# Display device support
#
CONFIG_DISPLAY_SUPPORT=m

#
# Display hardware drivers
#

#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
CONFIG_MDA_CONSOLE=m
CONFIG_DUMMY_CONSOLE=y
# CONFIG_SOUND is not set
CONFIG_HID_SUPPORT=y
CONFIG_HID=m
CONFIG_HIDRAW=y

#
# USB Input Devices
#
CONFIG_USB_HID=m
CONFIG_HID_PID=y
CONFIG_USB_HIDDEV=y

#
# USB HID Boot Protocol drivers
#
CONFIG_USB_KBD=m
CONFIG_USB_MOUSE=m

#
# Special HID drivers
#
CONFIG_HID_A4TECH=m
CONFIG_HID_ACRUX=m
CONFIG_HID_ACRUX_FF=m
CONFIG_HID_APPLE=m
CONFIG_HID_BELKIN=m
CONFIG_HID_CHERRY=m
CONFIG_HID_CHICONY=m
CONFIG_HID_CYPRESS=m
CONFIG_HID_DRAGONRISE=m
CONFIG_DRAGONRISE_FF=y
CONFIG_HID_EMS_FF=m
CONFIG_HID_EZKEY=m
# CONFIG_HID_HOLTEK is not set
# CONFIG_HID_KEYTOUCH is not set
CONFIG_HID_KYE=m
CONFIG_HID_UCLOGIC=m
CONFIG_HID_WALTOP=m
CONFIG_HID_GYRATION=m
CONFIG_HID_TWINHAN=m
CONFIG_HID_KENSINGTON=m
# CONFIG_HID_LCPOWER is not set
CONFIG_HID_LOGITECH=m
CONFIG_LOGITECH_FF=y
CONFIG_LOGIRUMBLEPAD2_FF=y
CONFIG_LOGIG940_FF=y
CONFIG_LOGIWII_FF=y
CONFIG_HID_MICROSOFT=m
CONFIG_HID_MONTEREY=m
CONFIG_HID_MULTITOUCH=m
CONFIG_HID_NTRIG=m
CONFIG_HID_ORTEK=m
CONFIG_HID_PANTHERLORD=m
CONFIG_PANTHERLORD_FF=y
CONFIG_HID_PETALYNX=m
CONFIG_HID_PICOLCD=m
CONFIG_HID_PICOLCD_BACKLIGHT=y
CONFIG_HID_PICOLCD_LCD=y
CONFIG_HID_PICOLCD_LEDS=y
CONFIG_HID_QUANTA=m
CONFIG_HID_ROCCAT=m
CONFIG_HID_ROCCAT_COMMON=m
# CONFIG_HID_ROCCAT_ARVO is not set
CONFIG_HID_ROCCAT_KONE=m
CONFIG_HID_ROCCAT_KONEPLUS=m
# CONFIG_HID_ROCCAT_KOVAPLUS is not set
CONFIG_HID_ROCCAT_PYRA=m
CONFIG_HID_SAMSUNG=m
CONFIG_HID_SONY=m
# CONFIG_HID_SPEEDLINK is not set
CONFIG_HID_SUNPLUS=m
CONFIG_HID_GREENASIA=m
CONFIG_GREENASIA_FF=y
CONFIG_HID_SMARTJOYPLUS=m
CONFIG_SMARTJOYPLUS_FF=y
CONFIG_HID_TOPSEED=m
CONFIG_HID_THRUSTMASTER=m
CONFIG_THRUSTMASTER_FF=y
CONFIG_HID_ZEROPLUS=m
CONFIG_ZEROPLUS_FF=y
CONFIG_HID_ZYDACRON=m
CONFIG_USB_SUPPORT=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB_ARCH_HAS_EHCI=y
CONFIG_USB=y
# CONFIG_USB_DEBUG is not set
# CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set

#
# Miscellaneous USB options
#
# CONFIG_USB_DEVICEFS is not set
# CONFIG_USB_DEVICE_CLASS is not set
# CONFIG_USB_DYNAMIC_MINORS is not set
CONFIG_USB_SUSPEND=y
# CONFIG_USB_OTG is not set
# CONFIG_USB_OTG_WHITELIST is not set
# CONFIG_USB_OTG_BLACKLIST_HUB is not set
CONFIG_USB_MON=y
# CONFIG_USB_WUSB is not set
# CONFIG_USB_WUSB_CBAF is not set

#
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
CONFIG_USB_XHCI_HCD=m
# CONFIG_USB_XHCI_HCD_DEBUGGING is not set
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_EHCI_ROOT_HUB_TT=y
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_USB_OXU210HP_HCD=m
CONFIG_USB_ISP116X_HCD=m
CONFIG_USB_ISP1760_HCD=m
CONFIG_USB_ISP1362_HCD=m
CONFIG_USB_OHCI_HCD=y
# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_UHCI_HCD=y
CONFIG_USB_SL811_HCD=m
# CONFIG_USB_SL811_HCD_ISO is not set
CONFIG_USB_SL811_CS=m
CONFIG_USB_R8A66597_HCD=m
# CONFIG_USB_WHCI_HCD is not set
# CONFIG_USB_HWA_HCD is not set

#
# USB Device Class drivers
#
# CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set
# CONFIG_USB_WDM is not set
# CONFIG_USB_TMC is not set

#
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
#

#
# also be needed; see USB_STORAGE Help for more info
#
CONFIG_USB_STORAGE=m
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_REALTEK is not set
CONFIG_USB_STORAGE_DATAFAB=m
CONFIG_USB_STORAGE_FREECOM=m
CONFIG_USB_STORAGE_ISD200=m
CONFIG_USB_STORAGE_USBAT=m
CONFIG_USB_STORAGE_SDDR09=m
CONFIG_USB_STORAGE_SDDR55=m
CONFIG_USB_STORAGE_JUMPSHOT=m
CONFIG_USB_STORAGE_ALAUDA=m
CONFIG_USB_STORAGE_ONETOUCH=m
CONFIG_USB_STORAGE_KARMA=m
CONFIG_USB_STORAGE_CYPRESS_ATACB=m
# CONFIG_USB_STORAGE_ENE_UB6250 is not set
CONFIG_USB_UAS=m
# CONFIG_USB_LIBUSUAL is not set

#
# USB Imaging devices
#
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_MICROTEK is not set

#
# USB port drivers
#
# CONFIG_USB_USS720 is not set
# CONFIG_USB_SERIAL is not set

#
# USB Miscellaneous drivers
#
# CONFIG_USB_EMI62 is not set
# CONFIG_USB_EMI26 is not set
# CONFIG_USB_ADUTUX is not set
# CONFIG_USB_SEVSEG is not set
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_LEGOTOWER is not set
# CONFIG_USB_LCD is not set
# CONFIG_USB_LED is not set
# CONFIG_USB_CYPRESS_CY7C63 is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_IDMOUSE is not set
# CONFIG_USB_FTDI_ELAN is not set
# CONFIG_USB_APPLEDISPLAY is not set
CONFIG_USB_SISUSBVGA=m
# CONFIG_USB_SISUSBVGA_CON is not set
# CONFIG_USB_LD is not set
# CONFIG_USB_TRANCEVIBRATOR is not set
# CONFIG_USB_IOWARRIOR is not set
# CONFIG_USB_TEST is not set
# CONFIG_USB_ISIGHTFW is not set
# CONFIG_USB_YUREX is not set
# CONFIG_USB_GADGET is not set

#
# OTG and related infrastructure
#
# CONFIG_USB_GPIO_VBUS is not set
# CONFIG_NOP_USB_XCEIV is not set
# CONFIG_AB8500_USB is not set
# CONFIG_UWB is not set
# CONFIG_MMC is not set
# CONFIG_MEMSTICK is not set
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y

#
# LED drivers
#
# CONFIG_LEDS_88PM860X is not set
# CONFIG_LEDS_LM3530 is not set
# CONFIG_LEDS_ALIX2 is not set
# CONFIG_LEDS_PCA9532 is not set
# CONFIG_LEDS_GPIO is not set
# CONFIG_LEDS_LP3944 is not set
# CONFIG_LEDS_LP5521 is not set
# CONFIG_LEDS_LP5523 is not set
# CONFIG_LEDS_CLEVO_MAIL is not set
# CONFIG_LEDS_PCA955X is not set
# CONFIG_LEDS_WM831X_STATUS is not set
# CONFIG_LEDS_WM8350 is not set
# CONFIG_LEDS_DA903X is not set
# CONFIG_LEDS_REGULATOR is not set
# CONFIG_LEDS_BD2802 is not set
# CONFIG_LEDS_INTEL_SS4200 is not set
# CONFIG_LEDS_LT3593 is not set
# CONFIG_LEDS_ADP5520 is not set
# CONFIG_LEDS_TRIGGERS is not set

#
# LED Triggers
#
# CONFIG_ACCESSIBILITY is not set
CONFIG_INFINIBAND=m
CONFIG_INFINIBAND_USER_MAD=m
CONFIG_INFINIBAND_USER_ACCESS=m
CONFIG_INFINIBAND_USER_MEM=y
CONFIG_INFINIBAND_ADDR_TRANS=y
CONFIG_INFINIBAND_MTHCA=m
CONFIG_INFINIBAND_MTHCA_DEBUG=y
CONFIG_INFINIBAND_AMSO1100=m
CONFIG_INFINIBAND_AMSO1100_DEBUG=y
CONFIG_INFINIBAND_CXGB3=m
# CONFIG_INFINIBAND_CXGB3_DEBUG is not set
CONFIG_INFINIBAND_CXGB4=m
CONFIG_MLX4_INFINIBAND=m
# CONFIG_INFINIBAND_NES is not set
CONFIG_INFINIBAND_IPOIB=m
CONFIG_INFINIBAND_IPOIB_CM=y
CONFIG_INFINIBAND_IPOIB_DEBUG=y
# CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set
CONFIG_INFINIBAND_SRP=m
CONFIG_INFINIBAND_ISER=m
CONFIG_EDAC=y

#
# Reporting subsystems
#
# CONFIG_EDAC_DEBUG is not set
CONFIG_EDAC_DECODE_MCE=m
CONFIG_EDAC_MCE_INJ=m
CONFIG_EDAC_MM_EDAC=m
CONFIG_EDAC_MCE=y
CONFIG_EDAC_AMD76X=m
CONFIG_EDAC_E7XXX=m
CONFIG_EDAC_E752X=m
CONFIG_EDAC_I82875P=m
CONFIG_EDAC_I82975X=m
CONFIG_EDAC_I3000=m
CONFIG_EDAC_I3200=m
CONFIG_EDAC_X38=m
CONFIG_EDAC_I5400=m
CONFIG_EDAC_I7CORE=m
CONFIG_EDAC_I82860=m
CONFIG_EDAC_R82600=m
CONFIG_EDAC_I5000=m
CONFIG_EDAC_I5100=m
CONFIG_EDAC_I7300=m
CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
CONFIG_RTC_HCTOSYS=y
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
# CONFIG_RTC_DEBUG is not set

#
# RTC interfaces
#
CONFIG_RTC_INTF_SYSFS=y
CONFIG_RTC_INTF_PROC=y
CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
CONFIG_RTC_DRV_TEST=m

#
# I2C RTC drivers
#
# CONFIG_RTC_DRV_88PM860X is not set
CONFIG_RTC_DRV_DS1307=m
CONFIG_RTC_DRV_DS1374=m
CONFIG_RTC_DRV_DS1672=m
CONFIG_RTC_DRV_DS3232=m
CONFIG_RTC_DRV_MAX6900=m
CONFIG_RTC_DRV_MAX8925=m
CONFIG_RTC_DRV_MAX8998=m
CONFIG_RTC_DRV_RS5C372=m
CONFIG_RTC_DRV_ISL1208=m
CONFIG_RTC_DRV_ISL12022=m
CONFIG_RTC_DRV_X1205=m
CONFIG_RTC_DRV_PCF8563=m
CONFIG_RTC_DRV_PCF8583=m
CONFIG_RTC_DRV_M41T80=m
CONFIG_RTC_DRV_M41T80_WDT=y
CONFIG_RTC_DRV_BQ32K=m
CONFIG_RTC_DRV_S35390A=m
CONFIG_RTC_DRV_FM3130=m
CONFIG_RTC_DRV_RX8581=m
CONFIG_RTC_DRV_RX8025=m
# CONFIG_RTC_DRV_EM3027 is not set
# CONFIG_RTC_DRV_RV3029C2 is not set

#
# SPI RTC drivers
#

#
# Platform RTC drivers
#
CONFIG_RTC_DRV_CMOS=y
CONFIG_RTC_DRV_DS1286=m
CONFIG_RTC_DRV_DS1511=m
CONFIG_RTC_DRV_DS1553=m
CONFIG_RTC_DRV_DS1742=m
CONFIG_RTC_DRV_STK17TA8=m
CONFIG_RTC_DRV_M48T86=m
CONFIG_RTC_DRV_M48T35=m
CONFIG_RTC_DRV_M48T59=m
CONFIG_RTC_DRV_MSM6242=m
CONFIG_RTC_DRV_BQ4802=m
CONFIG_RTC_DRV_RP5C01=m
CONFIG_RTC_DRV_V3020=m
CONFIG_RTC_DRV_WM831X=m
CONFIG_RTC_DRV_WM8350=m
CONFIG_RTC_DRV_PCF50633=m
CONFIG_RTC_DRV_AB3100=m
CONFIG_RTC_DRV_AB8500=m

#
# on-CPU RTC drivers
#
CONFIG_DMADEVICES=y
# CONFIG_DMADEVICES_DEBUG is not set

#
# DMA Devices
#
CONFIG_INTEL_MID_DMAC=m
CONFIG_INTEL_IOATDMA=m
CONFIG_TIMB_DMA=m
CONFIG_PCH_DMA=m
CONFIG_DMA_ENGINE=y

#
# DMA Clients
#
CONFIG_NET_DMA=y
CONFIG_ASYNC_TX_DMA=y
# CONFIG_DMATEST is not set
CONFIG_DCA=m
CONFIG_AUXDISPLAY=y
CONFIG_KS0108=m
CONFIG_KS0108_PORT=0x378
CONFIG_KS0108_DELAY=2
CONFIG_UIO=m
CONFIG_UIO_CIF=m
CONFIG_UIO_PDRV=m
CONFIG_UIO_PDRV_GENIRQ=m
CONFIG_UIO_AEC=m
CONFIG_UIO_SERCOS3=m
CONFIG_UIO_PCI_GENERIC=m
CONFIG_UIO_NETX=m
CONFIG_VIRTIO=y
CONFIG_VIRTIO_RING=y

#
# Virtio drivers
#
CONFIG_VIRTIO_PCI=y
CONFIG_VIRTIO_BALLOON=m

#
# Xen driver support
#
CONFIG_XEN_BALLOON=y
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DEV_EVTCHN=y
CONFIG_XEN_BACKEND=y
CONFIG_XENFS=y
CONFIG_XEN_COMPAT_XENFS=y
CONFIG_XEN_SYS_HYPERVISOR=y
CONFIG_XEN_XENBUS_FRONTEND=y
CONFIG_XEN_GNTDEV=y
CONFIG_XEN_GRANT_DEV_ALLOC=y
CONFIG_SWIOTLB_XEN=y
CONFIG_XEN_PCIDEV_BACKEND=y
# CONFIG_STAGING is not set
# CONFIG_X86_PLATFORM_DEVICES is not set
CONFIG_CLKSRC_I8253=y
CONFIG_CLKEVT_I8253=y
CONFIG_I8253_LOCK=y
CONFIG_CLKBLD_I8253=y
CONFIG_IOMMU_API=y
CONFIG_IOMMU_SUPPORT=y
CONFIG_DMAR=y
# CONFIG_DMAR_DEFAULT_ON is not set
CONFIG_DMAR_FLOPPY_WA=y
CONFIG_VIRT_DRIVERS=y

#
# Firmware Drivers
#
CONFIG_EDD=y
CONFIG_EDD_OFF=y
CONFIG_FIRMWARE_MEMMAP=y
CONFIG_EFI_VARS=y
CONFIG_DELL_RBU=m
CONFIG_DCDBAS=m
CONFIG_DMIID=y
# CONFIG_DMI_SYSFS is not set
CONFIG_ISCSI_IBFT_FIND=y
CONFIG_ISCSI_IBFT=m
# CONFIG_SIGMA is not set
# CONFIG_GOOGLE_FIRMWARE is not set

#
# File systems
#
CONFIG_EXT2_FS=y
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT2_FS_SECURITY=y
# CONFIG_EXT2_FS_XIP is not set
CONFIG_EXT3_FS=y
CONFIG_EXT3_DEFAULTS_TO_ORDERED=y
CONFIG_EXT3_FS_XATTR=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_XATTR=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
# CONFIG_EXT4_DEBUG is not set
CONFIG_JBD=y
# CONFIG_JBD_DEBUG is not set
CONFIG_JBD2=y
# CONFIG_JBD2_DEBUG is not set
CONFIG_FS_MBCACHE=y
CONFIG_REISERFS_FS=m
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
CONFIG_REISERFS_FS_XATTR=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_SECURITY=y
# CONFIG_JFS_FS is not set
# CONFIG_XFS_FS is not set
# CONFIG_GFS2_FS is not set
# CONFIG_OCFS2_FS is not set
# CONFIG_BTRFS_FS is not set
# CONFIG_NILFS2_FS is not set
CONFIG_FS_POSIX_ACL=y
CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY_USER=y
# CONFIG_FANOTIFY is not set
# CONFIG_QUOTA is not set
# CONFIG_QUOTACTL is not set
# CONFIG_AUTOFS4_FS is not set
# CONFIG_FUSE_FS is not set
CONFIG_GENERIC_ACL=y

#
# Caches
#
# CONFIG_FSCACHE is not set

#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
# CONFIG_UDF_FS is not set

#
# DOS/FAT/NT Filesystems
#
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
# CONFIG_NTFS_FS is not set

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_VMCORE=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_TMPFS_XATTR=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_CONFIGFS_FS=m
CONFIG_MISC_FILESYSTEMS=y
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_JFFS2_FS is not set
# CONFIG_UBIFS_FS is not set
# CONFIG_LOGFS is not set
# CONFIG_CRAMFS is not set
CONFIG_SQUASHFS=y
CONFIG_SQUASHFS_XATTR=y
CONFIG_SQUASHFS_ZLIB=y
CONFIG_SQUASHFS_LZO=y
CONFIG_SQUASHFS_XZ=y
# CONFIG_SQUASHFS_EMBEDDED is not set
CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
# CONFIG_VXFS_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_OMFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_ROMFS_FS is not set
CONFIG_PSTORE=y
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
# CONFIG_EXOFS_FS is not set
# CONFIG_NETWORK_FILESYSTEMS is not set

#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
CONFIG_ACORN_PARTITION=y
# CONFIG_ACORN_PARTITION_CUMANA is not set
# CONFIG_ACORN_PARTITION_EESOX is not set
CONFIG_ACORN_PARTITION_ICS=y
# CONFIG_ACORN_PARTITION_ADFS is not set
# CONFIG_ACORN_PARTITION_POWERTEC is not set
CONFIG_ACORN_PARTITION_RISCIX=y
CONFIG_OSF_PARTITION=y
CONFIG_AMIGA_PARTITION=y
CONFIG_ATARI_PARTITION=y
CONFIG_MAC_PARTITION=y
CONFIG_MSDOS_PARTITION=y
CONFIG_BSD_DISKLABEL=y
CONFIG_MINIX_SUBPARTITION=y
CONFIG_SOLARIS_X86_PARTITION=y
CONFIG_UNIXWARE_DISKLABEL=y
CONFIG_LDM_PARTITION=y
# CONFIG_LDM_DEBUG is not set
CONFIG_SGI_PARTITION=y
CONFIG_ULTRIX_PARTITION=y
CONFIG_SUN_PARTITION=y
CONFIG_KARMA_PARTITION=y
CONFIG_EFI_PARTITION=y
CONFIG_SYSV68_PARTITION=y
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=m
CONFIG_NLS_CODEPAGE_737=m
CONFIG_NLS_CODEPAGE_775=m
CONFIG_NLS_CODEPAGE_850=m
CONFIG_NLS_CODEPAGE_852=m
CONFIG_NLS_CODEPAGE_855=m
CONFIG_NLS_CODEPAGE_857=m
CONFIG_NLS_CODEPAGE_860=m
CONFIG_NLS_CODEPAGE_861=m
CONFIG_NLS_CODEPAGE_862=m
CONFIG_NLS_CODEPAGE_863=m
CONFIG_NLS_CODEPAGE_864=m
CONFIG_NLS_CODEPAGE_865=m
CONFIG_NLS_CODEPAGE_866=m
CONFIG_NLS_CODEPAGE_869=m
CONFIG_NLS_CODEPAGE_936=m
CONFIG_NLS_CODEPAGE_950=m
CONFIG_NLS_CODEPAGE_932=m
CONFIG_NLS_CODEPAGE_949=m
CONFIG_NLS_CODEPAGE_874=m
CONFIG_NLS_ISO8859_8=m
CONFIG_NLS_CODEPAGE_1250=m
CONFIG_NLS_CODEPAGE_1251=m
CONFIG_NLS_ASCII=m
CONFIG_NLS_ISO8859_1=m
CONFIG_NLS_ISO8859_2=m
CONFIG_NLS_ISO8859_3=m
CONFIG_NLS_ISO8859_4=m
CONFIG_NLS_ISO8859_5=m
CONFIG_NLS_ISO8859_6=m
CONFIG_NLS_ISO8859_7=m
CONFIG_NLS_ISO8859_9=m
CONFIG_NLS_ISO8859_13=m
CONFIG_NLS_ISO8859_14=m
CONFIG_NLS_ISO8859_15=m
CONFIG_NLS_KOI8_R=m
CONFIG_NLS_KOI8_U=m
CONFIG_NLS_UTF8=m
CONFIG_DLM=m
# CONFIG_DLM_DEBUG is not set

#
# Kernel hacking
#
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_PRINTK_TIME=y
CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
# CONFIG_ENABLE_WARN_DEPRECATED is not set
# CONFIG_ENABLE_MUST_CHECK is not set
CONFIG_FRAME_WARN=1024
CONFIG_MAGIC_SYSRQ=y
# CONFIG_STRIP_ASM_SYMS is not set
CONFIG_UNUSED_SYMBOLS=y
CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set
# CONFIG_DEBUG_SECTION_MISMATCH is not set
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set
# CONFIG_LOCKUP_DETECTOR is not set
# CONFIG_HARDLOCKUP_DETECTOR is not set
CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
CONFIG_SCHED_DEBUG=y
CONFIG_SCHEDSTATS=y
CONFIG_TIMER_STATS=y
# CONFIG_DEBUG_OBJECTS is not set
# CONFIG_SLUB_DEBUG_ON is not set
# CONFIG_SLUB_STATS is not set
# CONFIG_DEBUG_KMEMLEAK is not set
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_RT_MUTEX_TESTER is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_MUTEXES is not set
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_PROVE_LOCKING is not set
# CONFIG_SPARSE_RCU_POINTER is not set
# CONFIG_LOCK_STAT is not set
# CONFIG_DEBUG_ATOMIC_SLEEP is not set
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
CONFIG_STACKTRACE=y
# CONFIG_DEBUG_STACK_USAGE is not set
# CONFIG_DEBUG_KOBJECT is not set
# CONFIG_DEBUG_HIGHMEM is not set
CONFIG_DEBUG_BUGVERBOSE=y
# CONFIG_DEBUG_INFO is not set
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_VIRTUAL is not set
# CONFIG_DEBUG_WRITECOUNT is not set
CONFIG_DEBUG_MEMORY_INIT=y
# CONFIG_DEBUG_LIST is not set
# CONFIG_TEST_LIST_SORT is not set
# CONFIG_DEBUG_SG is not set
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_CREDENTIALS is not set
CONFIG_ARCH_WANT_FRAME_POINTERS=y
CONFIG_FRAME_POINTER=y
CONFIG_BOOT_PRINTK_DELAY=y
# CONFIG_RCU_TORTURE_TEST is not set
CONFIG_RCU_CPU_STALL_TIMEOUT=60
# CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
# CONFIG_DEBUG_PER_CPU_MAPS is not set
# CONFIG_LKDTM is not set
CONFIG_CPU_NOTIFIER_ERROR_INJECT=m
# CONFIG_FAULT_INJECTION is not set
CONFIG_LATENCYTOP=y
CONFIG_SYSCTL_SYSCALL_CHECK=y
# CONFIG_DEBUG_PAGEALLOC is not set
CONFIG_USER_STACKTRACE_SUPPORT=y
CONFIG_NOP_TRACER=y
CONFIG_HAVE_FTRACE_NMI_ENTER=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_HAVE_C_RECORDMCOUNT=y
CONFIG_TRACER_MAX_TRACE=y
CONFIG_RING_BUFFER=y
CONFIG_FTRACE_NMI_ENTER=y
CONFIG_EVENT_TRACING=y
# CONFIG_EVENT_POWER_TRACING_DEPRECATED is not set
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_TRACING_SUPPORT=y
CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
# CONFIG_IRQSOFF_TRACER is not set
CONFIG_SCHED_TRACER=y
CONFIG_FTRACE_SYSCALLS=y
CONFIG_BRANCH_PROFILE_NONE=y
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
# CONFIG_PROFILE_ALL_BRANCHES is not set
CONFIG_STACK_TRACER=y
CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_FUNCTION_PROFILER=y
CONFIG_FTRACE_MCOUNT_RECORD=y
# CONFIG_FTRACE_STARTUP_TEST is not set
CONFIG_MMIOTRACE=y
# CONFIG_MMIOTRACE_TEST is not set
# CONFIG_RING_BUFFER_BENCHMARK is not set
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
# CONFIG_FIREWIRE_OHCI_REMOTE_DMA is not set
# CONFIG_DYNAMIC_DEBUG is not set
# CONFIG_DMA_API_DEBUG is not set
# CONFIG_ATOMIC64_SELFTEST is not set
CONFIG_ASYNC_RAID6_TEST=m
# CONFIG_SAMPLES is not set
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
# CONFIG_KGDB_TESTS is not set
CONFIG_KGDB_LOW_LEVEL_TRAP=y
CONFIG_KGDB_KDB=y
CONFIG_KDB_KEYBOARD=y
CONFIG_HAVE_ARCH_KMEMCHECK=y
CONFIG_TEST_KSTRTOX=m
CONFIG_STRICT_DEVMEM=y
# CONFIG_X86_VERBOSE_BOOTUP is not set
CONFIG_EARLY_PRINTK=y
# CONFIG_EARLY_PRINTK_DBGP is not set
# CONFIG_DEBUG_STACKOVERFLOW is not set
# CONFIG_X86_PTDUMP is not set
CONFIG_DEBUG_RODATA=y
# CONFIG_DEBUG_RODATA_TEST is not set
CONFIG_DEBUG_SET_MODULE_RONX=y
# CONFIG_DEBUG_NX_TEST is not set
CONFIG_DOUBLEFAULT=y
# CONFIG_IOMMU_STRESS is not set
CONFIG_HAVE_MMIOTRACE_SUPPORT=y
CONFIG_IO_DELAY_TYPE_0X80=0
CONFIG_IO_DELAY_TYPE_0XED=1
CONFIG_IO_DELAY_TYPE_UDELAY=2
CONFIG_IO_DELAY_TYPE_NONE=3
# CONFIG_IO_DELAY_0X80 is not set
CONFIG_IO_DELAY_0XED=y
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not set
CONFIG_DEFAULT_IO_DELAY_TYPE=1
# CONFIG_DEBUG_BOOT_PARAMS is not set
# CONFIG_CPA_DEBUG is not set
CONFIG_OPTIMIZE_INLINING=y
# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set

#
# Security options
#
# CONFIG_KEYS is not set
# CONFIG_SECURITY_DMESG_RESTRICT is not set
# CONFIG_SECURITY is not set
CONFIG_SECURITYFS=y
# CONFIG_INTEL_TXT is not set
CONFIG_DEFAULT_SECURITY_DAC=y
CONFIG_DEFAULT_SECURITY=""
CONFIG_XOR_BLOCKS=m
CONFIG_ASYNC_CORE=m
CONFIG_ASYNC_MEMCPY=m
CONFIG_ASYNC_XOR=m
CONFIG_ASYNC_PQ=m
CONFIG_ASYNC_RAID6_RECOV=m
CONFIG_ASYNC_TX_DISABLE_PQ_VAL_DMA=y
CONFIG_ASYNC_TX_DISABLE_XOR_VAL_DMA=y
CONFIG_CRYPTO=y

#
# Crypto core or helper
#
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_ALGAPI2=y
CONFIG_CRYPTO_AEAD=m
CONFIG_CRYPTO_AEAD2=y
CONFIG_CRYPTO_BLKCIPHER=y
CONFIG_CRYPTO_BLKCIPHER2=y
CONFIG_CRYPTO_HASH=y
CONFIG_CRYPTO_HASH2=y
CONFIG_CRYPTO_RNG=m
CONFIG_CRYPTO_RNG2=y
CONFIG_CRYPTO_PCOMP=m
CONFIG_CRYPTO_PCOMP2=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_MANAGER2=y
CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
CONFIG_CRYPTO_GF128MUL=m
CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_PCRYPT=m
CONFIG_CRYPTO_WORKQUEUE=y
CONFIG_CRYPTO_CRYPTD=m
CONFIG_CRYPTO_AUTHENC=m
CONFIG_CRYPTO_TEST=m

#
# Authenticated Encryption with Associated Data
#
CONFIG_CRYPTO_CCM=m
CONFIG_CRYPTO_GCM=m
CONFIG_CRYPTO_SEQIV=m

#
# Block modes
#
CONFIG_CRYPTO_CBC=y
CONFIG_CRYPTO_CTR=m
CONFIG_CRYPTO_CTS=m
CONFIG_CRYPTO_ECB=y
CONFIG_CRYPTO_LRW=m
CONFIG_CRYPTO_PCBC=m
CONFIG_CRYPTO_XTS=m

#
# Hash modes
#
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_XCBC=m
CONFIG_CRYPTO_VMAC=m

#
# Digest
#
CONFIG_CRYPTO_CRC32C=y
CONFIG_CRYPTO_CRC32C_INTEL=y
CONFIG_CRYPTO_GHASH=m
CONFIG_CRYPTO_MD4=m
CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_MICHAEL_MIC=m
CONFIG_CRYPTO_RMD128=m
CONFIG_CRYPTO_RMD160=m
CONFIG_CRYPTO_RMD256=m
CONFIG_CRYPTO_RMD320=m
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m
CONFIG_CRYPTO_TGR192=m
CONFIG_CRYPTO_WP512=m

#
# Ciphers
#
CONFIG_CRYPTO_AES=m
CONFIG_CRYPTO_AES_586=m
CONFIG_CRYPTO_AES_NI_INTEL=m
CONFIG_CRYPTO_ANUBIS=m
CONFIG_CRYPTO_ARC4=m
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_CAMELLIA=m
CONFIG_CRYPTO_CAST5=m
CONFIG_CRYPTO_CAST6=m
CONFIG_CRYPTO_DES=m
CONFIG_CRYPTO_FCRYPT=m
CONFIG_CRYPTO_KHAZAD=m
CONFIG_CRYPTO_SALSA20=m
CONFIG_CRYPTO_SALSA20_586=m
CONFIG_CRYPTO_SEED=m
CONFIG_CRYPTO_SERPENT=m
CONFIG_CRYPTO_TEA=m
CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_TWOFISH_COMMON=m
CONFIG_CRYPTO_TWOFISH_586=m

#
# Compression
#
CONFIG_CRYPTO_DEFLATE=m
CONFIG_CRYPTO_ZLIB=m
CONFIG_CRYPTO_LZO=m

#
# Random Number Generation
#
CONFIG_CRYPTO_ANSI_CPRNG=m
CONFIG_CRYPTO_USER_API=m
CONFIG_CRYPTO_USER_API_HASH=m
CONFIG_CRYPTO_USER_API_SKCIPHER=m
CONFIG_CRYPTO_HW=y
CONFIG_CRYPTO_DEV_PADLOCK=y
CONFIG_CRYPTO_DEV_PADLOCK_AES=m
CONFIG_CRYPTO_DEV_PADLOCK_SHA=m
CONFIG_CRYPTO_DEV_GEODE=m
CONFIG_CRYPTO_DEV_HIFN_795X=m
CONFIG_CRYPTO_DEV_HIFN_795X_RNG=y
CONFIG_HAVE_KVM=y
CONFIG_VIRTUALIZATION=y
# CONFIG_KVM is not set
CONFIG_VHOST_NET=m
# CONFIG_LGUEST is not set
CONFIG_BINARY_PRINTF=y

#
# Library routines
#
CONFIG_RAID6_PQ=m
CONFIG_BITREVERSE=y
CONFIG_GENERIC_FIND_FIRST_BIT=y
CONFIG_CRC_CCITT=m
CONFIG_CRC16=y
CONFIG_CRC_T10DIF=y
CONFIG_CRC_ITU_T=m
CONFIG_CRC32=y
CONFIG_CRC7=m
CONFIG_LIBCRC32C=y
# CONFIG_CRC8 is not set
CONFIG_AUDIT_GENERIC=y
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=m
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_DECOMPRESS=y
CONFIG_XZ_DEC=y
CONFIG_XZ_DEC_X86=y
CONFIG_XZ_DEC_POWERPC=y
CONFIG_XZ_DEC_IA64=y
CONFIG_XZ_DEC_ARM=y
CONFIG_XZ_DEC_ARMTHUMB=y
CONFIG_XZ_DEC_SPARC=y
CONFIG_XZ_DEC_BCJ=y
CONFIG_XZ_DEC_TEST=m
CONFIG_DECOMPRESS_LZMA=y
CONFIG_DECOMPRESS_XZ=y
CONFIG_GENERIC_ALLOCATOR=y
CONFIG_REED_SOLOMON=m
CONFIG_REED_SOLOMON_DEC16=y
CONFIG_TEXTSEARCH=y
CONFIG_TEXTSEARCH_KMP=m
CONFIG_TEXTSEARCH_BM=m
CONFIG_TEXTSEARCH_FSM=m
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y
CONFIG_CHECK_SIGNATURE=y
CONFIG_CPU_RMAP=y
CONFIG_NLATTR=y
CONFIG_LRU_CACHE=m
CONFIG_AVERAGE=y
# CONFIG_CORDIC is not set

--------------010303010409000005060507
Content-Type: image/jpeg;
 name="IMAG0180.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="IMAG0180.jpg"

/9j/4ejXRXhpZgAATU0AKgAAAAgABwEPAAIAAAAESFRDAAEQAAIAAAALAAAAYgEaAAUAAAAB
AAAAbgEbAAUAAAABAAAAdgEoAAMAAAABAAIAAAITAAMAAAABAAEAAIdpAAQAAAABAAAAfgAA
AVZIVEMgRGVzaXJlAAAAAABIAAAAAQAAAEgAAAABAAuIJwADAAAAAQBbAACQAAAHAAAABDAy
MjCQAwACAAAAFAAAAQiQBAACAAAAFAAAARyRAQAHAAAABAECAwCSCgAFAAAAAQAAATCgAAAH
AAAABDAxMDCgAQADAAAAAQABAACgAgAEAAAAAQAACiCgAwAEAAAAAQAABhCgBQAEAAAAAQAA
ATgAAAAAMjAxMToxMDowNiAxMzozNToxOAAyMDExOjEwOjA2IDEzOjM1OjE4AAAAAa8AAABk
AAIAAQACAAAABFI5OAAAAgAHAAAABDAxMDAAAAAAAAYBAwADAAAAAQAGAAABGgAFAAAAAQAA
AaQBGwAFAAAAAQAAAawBKAADAAAAAQACAAACAQAEAAAAAQAAAbQCAgAEAAAAAQAA5xsAAAAA
AAAASAAAAAEAAABIAAAAAf/Y/9sAhAAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4d
GhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQyAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAHgAyAD
ASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUE
BAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygp
KjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaX
mJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T1
9vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAEC
AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5
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
+tEpRm7vQai47GjoV1GuiXmnSkI0jh8txx6U/Wr22ubvSpI5lKxSKh+bqOefoK5q6uZbidpW
2oT1C8D8KhzzjoKartKyE4Xd2ejXWq6eTdAXcTAyKAd33veq97qFrcPfWUM6GR9o8zIC9B0N
cD19AKUljznitPrcnpYj2KvudP4quYLmwtBFKreTHsyDnJBNc15bk7tpINJG+x1YjdjnBrWT
XYEUKdJhOOM5x/WspNVJXloWk4rQXQLYOxYXHlSqMqCcA+xq/wCIWgjjtWd0a4LjcEIO0ZB5
Irn727NxO0iIsIP8KcCqpZiOp/E5p+2UdEDg5O7O31qx/t69Fwt6trbheSZdvHrgVzdrDG2t
xW1q++KOfAdjjcB35/rWYxfP+skz3+c/40oZgSVJB+tFSrzNOwRjbqdT4/2tqqFHV8IVwrBs
8DnirnjKNV0DTUMsbOichXB21xIkcEHe2R3LZP60rSSMMsztnuWJxVOve+m4lBq1gO45OKFB
XGRV3S7yxtt32mze5J6YbAH6irN7qumyRFbfS2icjqzAgfTmsIpPVs0bfY3ND2X/AIWXSUkj
WQys7O7AKoyepNM8Oyw20OqWcE4kkLBI2X+PjnFceZpRkLI6qTyFYgfpSLNKnKSOp9VbBrdV
7W0M3DXc3NY0u8tLMXmo3zuXcLHbNJub/ex2rY021nEMUDussRX7+eB9TXFyTzSjdJNJIw7s
5P8AOnm4uSu37TOF/uiQgfpQqy5rg4Nq1zYsTBbeK7cLIrQxyHLjpmtDxXYF2l1aSaONHb90
hb5n/CuU8xt+clT9eadNNNM++WWVyBgbnJ/Sl7VWaHyttWZvaN4gOnWU8ZDySsu2M9QgPf61
J4TvdgvY2O6WdiwYnucVzWffmnwyvDKGjcq3Yg0oVZK1+g3BO52qGXSND1G+1GQu1wCkSs2W
b5hjAPOOKl8PP/YOkJHfTf6ddqRGmeY19fbNcTNdXE5BnnklI6bmzj8OlE1zcTT+fJPJJKP4
nbJrT6xZ3RDpnV+Hrb7J4kkJbIki3ZJ+vNWtSza+GLsz7RJNcbYger5PGPauOF/diYy/aH39
NwPaknvru4ZTcXEkm37u5s7fpR9YVhezdzpb6ePw/oK6bburXt4N1xIpB8teoUEdD6/hUPhK
6igW4Q43yrxz39a5ppHclpGLN6k5NOhlkhO+NyrdjWftfeTL5NNTt7Qz6fp9/qGpzuwdWWIM
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
81UjJxmrEHLj+tZ3tqUe1/s6A/2lqjZ48pMD8Vr2uvGf2dF/0nVH/wBiMf8AoNezUQ6jkFFF
FWSFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
FLXv+QFf84/0aT/0E18wPnyI+mcdK+nvEH/IB1D/AK9pP/QTXzDOSbdB32imr2Ie5RkIJIOD
VaX5Txx9KsTcN0565FV5M+1VqKxXl+6eaosQJCe4NXZc8+hqg7ESEnHWmr3BHQ6xxosBbvjF
YLE9PxrVbWYprFLWex8zb91hJjH61kseSVGOelVVabWoopoOC3pTZUKYyPpzScjnpQ7Mckkm
syxucfWmt0z3ox3pDx3/APrUnoFxcgjrjHWrNhfz2UgeBl91bkMPeqh6cVYsjaiYfaw/kj7w
Q4Y/TNVG6d7iaOvsb8X+g3chs7a2KnawiGN3ua4ccrmtvUNYshYiy0iCeCEnMnm8sxqpod5p
9pPI+o2Qu4ymFTnhvXgit5yUrJsmKtd2NHwTk38xXGTHjOe1bmk3ekvqbQWNo8V4hPnSseG+
lcfaXxtdSNzANiFslOwX0rYk13RIoZJLC1u0vpQAzMvyD1q6c42tcicW3clsrRLa+vtXvACi
TExqe5wMY/GqejPcap4mMxmaORjkEdlz0qymt6Bd6Pb6frJvldMMzRJkEg59Khm1vRLe/t5t
Es5reKIYkaQEs/GOh/Ork47pgk10Ni2uIbu61KwtrVLa4ijw9yDln5HOP89KwtM8QLZaeNIv
NJh1C3ViGZ5NhPNW/wC3fD9s1xeWE17JfXC/NHJCVQceuPb1qhpdx4deyK6wssNwCcTwIzHH
05/lQ5p7MSj3RN4v02zs7O0vbWFbeO4GVhU52/jVixA0DQzqD/8AHzcLiIDsD3NZ3ivWLXU1
t7ayMhtoMBHdCrMB04NP8R61Y6hotlZW4nE0CgSllwp+lS5xUm0UublsV/CjM/iG1lZvm83c
2CeSaf4548TXJPoBSeE7nRbO9S71S7ng8pt0YSIvuPvgGpvGNzoeoXJvdMvbmSVz8yywlAPf
kZqW703rqOS95F/wH/yDtRbn/VHA/AVx0mPMk2kY3v1/3jXXeHdU8OaVpNzHPqF015NGV8tL
dioJHTOP61x8p/eOV5BZiPoSTU1H7i1Gl7zGZ9DikLY4wDS4zR09xXPqaHQfD8FvE9sw4xmq
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
DeW33WPHbggVP4T3J4L1G2k+W5jlKmPqTye35Vw9ne3li/m2s7RSZ4ZeoqWz1jVLK4e5tL+a
G4k+9KMEsffINaRrxTTZMqb1sP8A+Ee1W30SLWLuyMFq2FWSVwrE5xwh5612PgiKT/hBNUAR
87nwNp+b5O1cTqesatqjo2p6jNeFCCvmYwuDkYAAHWr8XjHxRDEIYdbuYogMKiqmB2/u06dW
EZ3G4TcbFXTNG1e7spbyztmEcRKybpAjKc+h5rr2dYPhvZ3d0rRyCVSxkUh+HX15rkLfxBrN
tdy3lvqUqXUuPMlIBLfgRjsO1R6trmr6sqrql/Ld4HAcAAD6AAVVOtCCdhShJ6M9A8S3PiGf
UbBPDssqWlzIrTbccrn37VsX1zau2qLaOPMgBTj7yn0FeYWXifxBY2otbDVZraEDG1Ap4/EG
qum6xqWm3D3NpePHO5y0mAST+NarFwIdFnaaPGI/hvaTXQdZDdMN02d/3hx83NV/ijbXd/r+
l22nwTXNw8RC+VnrtB+92rldX8Qa3rAjGq6jLdCIny0ICqPwAFW7fxn4ptoBb2urNFEBtGIk
3AfUjNTLEQknEpU5J8xmaraanpGoPaXvmW96gBdYpd7DPQZUnrXeebJYfD2wj1Vplubu4Qwr
MSXIJGD+lcNp+s6jYahLqNtOPtsn35pEDk+/Pem63rmr61cpc6tfyXciABMqAFHsABWdOtGF
7MqUXLRno3jXXvEWl3ul2fhyCKa6nVVBNuJGDbCepHHSuF1e38S6j4oS01zMuuTBQVyGIB6Z
xwOO1TWvjjxVZ2gtbTUUhiC7VYQqXUexIrN03XNU03UpdUtrx1v5V2tcsAz+nf2qqteE7akx
puOp1vj25t/D2h23hK0mN1eqv+lzvyY/VQT6+1UvgwQPGMkZDf8AHm5JwTx9a465mmurl7m4
kaSaQ5d2PLGtvRfGHiHQbR7fRrqK0DqVZxCrOQevzEZqPbR9pd7FKDUWupn+Jf8AkYL/ADjc
JiprNX71TXNxLczyXEz75pW3O56sfWoiPXrWE5KUnJFxTirM7P4dazcaXp+r2tpol1qc10hI
MbhUjG0Akk+wzXFyDEsvG3dIzFc52kk5FbGheJ9d0OyubTSbwW8N1nz8ICW4x17cAVjMSWLH
qxLE+pJyauc7wURKPvtklqoa4hRs4MqZ+m4cV7jcDyvGWmWkOIraCBwsQPyrxXhkbFTuz0rp
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
AAAAANgLAABvDAAAAAAAACoeAAAoIQIAAAAAAHAMAAANDQAAAAAAAAYeAAAtPwIAAAAAAA4N
AAC4DQAAAAAAACkeAABVXQIAAAAAALkNAABaDgAAAAAAAEgeAACcewIAAAAAAFsOAAACDwAA
AAAAAEweAADnmQIAAAAAAAMPAACADwAAAAAAAJsSAAAAACwATABsAIwArADMABACwAJoAwsE
pAQ7BdIFeQYtB8cHbAgACZgJDgqkCjQLxwtaDA4Nsg09DuUOcQ8BEI4QDhGfEUES6hJtEx0U
rxRNFdEVbxYDF48XHRivGFIZ4xl5Gv8ahRsfHKkcPx32HaseRR/pH3kgFiGzIVki/yKVIyck
yiSRJSgm2yZ8Jyoo5iibKQcrMitSK3IrkiuyK9Ir8isSLDIsUixyLJIssizSLCsu2i64L7Yw
bDEYMvky7zPaNOQ1zTapN5E4ZzkuOvQ60jucPFs9Lz7jPpc/SEAAQcJBZUINQ8hDY0QgRd1F
j0YpR95HpkhFSfRJn0pIS+dLlUxHTQhOwk5LTw1QulB8UTRS9FK1U2dUNFX6VbJWg1c8WN5Y
hFkjWtlaeVvKXCxeQ1/kX25hnGG8Ydxh/GEcYjxiXGJ8YpxivGLcYvxiHGM8Y5VkK2UIZvRm
iGcHaAFpiWosbNZte28scdZyFnSXdNd1Znf1eJ56aXwRfrt/UoHYggmE7oUqh8WIK4qOi9SM
xY0kj/CQiZI8lOOVY5fjmFiaEJyznW2eJ5/tn5CgU6ELosWii6NSpBml5qW4poOnR6gWqc+p
k6pRqxis0KyWrWauca8YsH2xqbHJsemxCbIpskmyabKJsqmyybLpsgmzKbNJs4i0MbUethi3
qLc1uDS5iboWvNW9er/qwEPCcMPZwybFV8bJxyzJesqsyyHNaM7Bz9PQLdJO08/UZNYr2OXZ
Z9sm3dbeL+BB4gfk9uWs57fphOtY7eXtge4G73PvBACFABcBiQEYApACKwPKA1gEywRnBfUF
aQYFB40HGgiYCE0JOgrmCnkMowzDDOMMAw0jDUMNYw2DDaMNww3jDQMOIw5DDrAPXxBAEVAS
1xKJE4kUJRb7FwIa7huLHV0fwiBDIeIimySeJrooyCocLQkvHTHrMkM0fDa+N7M5NTvMPCs+
3z9+QetCakT8RWxHUEm2SgFMtk0OT3JQ/VFkU9dUoVYoWPpZuFuCXf5el2CUYShitmJFY9Fj
MGThZIZlJGbCZopnjWguabRq3Wr9ah1rPWtda31rnWu9a91r/WsdbD1sXWx9bNhtcG43b3Bw
GnGCcY1y93NxdWp3QnkOe+t8Wn79fniAvoFIg8KEaIbRh3WJ5opQjG2NyY7hj6ORYpMrldyW
qJjNmrCcep5joAOiCaQPpjGoDapArOytoK+NsWuzbbWSt7O58rsIvv6//sEIw4DD+cOFxBPF
tsVJxu3GfscXyLrItclQypvLwcvhywHMIcxBzGHMgcyhzMHM4cwBzSHNQc1hzdPOiM910I3R
/NGN0sPTntWi18PZx9uw3anfauHx4aTjb+Wp58Xp/utR7gUAggJhBLkFEgh3CY4LOA2BD+gQ
9xK3FNUVbRdMGV0bVRw8HtYfoyGTI18lbydVKT0rXC09L78wtjISNLc1hjcTOYY6jDsLPKQ8
Jj2lPSQ+vz4/P/Y/4UBiQaFCxkLmQgZDJkNGQ2ZDhkOmQ8ZD5kMGRCZERkRmRM1FfEZCR2xI
/Uh/SbxKV0wJTjBQPlIaVAtWnVcLWOBZTlv/XJ5eUWAFYtVjeWUaZztoyWnkaqRsXW4fcPlx
73OZdWB3VHlde0x91H4IgVKDUYUTh5OJwovejXuQo5LElCKWE5g5mk2cd56FoISitKM1pMek
XKXppW2m4aaEp1OoOanRqZKrn6w7rpqvJrGSssqzM7WGtrO207bzthO3M7dTt+q4f7lMuoG7
G7yovOC9xL/YwSHEZMaXyMXKccwdzcPO8dBB04bV69d52uLcPd9U4bniQOXS5vjo3epr7BPu
BwAEAgQEyQUhCKQKDQ2rDvMQ5hJsFe4XXBlNG2kd5R7qILwiViQUJqQmPyfNJz4owyhoKecp
iSoAK5QrEyyJLCAtCC6bLtsvuDCmMa0ynTPSNAc2NjeBOKs4yzjrOAs5KzlLOeU6bTszPHM9
Gj6zPso/SkHrQgpFQUdeSTlL5ExdTUxPtVCSUlZUNVb/VwlaIVzhXQNfs2DbYZxjXGVqZ+Jp
l2s/bS5vp3CMcoN0hnaWeFV6QXxJfm6Aq4FPg3OFh4e0iYGLao1qjweQqJAXkbmRUpLakl6T
9JOIlBaVqZVNlh+XAZiOmKWal5uOnHCdQp61nuWeDZ8tn02fbZ+Nn62fzZ/tn4ahMKL7olyk
46RcpbOm3aj5qlat6K8TsoK0MLbAto+43rqCvfa/gMITxenHd8rDzDDOJdG50hnVTNfl2bLb
PN5z4NHh5+M95mToferv7EXvAQCvAtMEdAf6CXkMJw9zEP8SdBRkFroYoBpwHMUdPR7PHm8f
EiCeIDwh0CFiIikj+yOtJNQl+iUaJjomWiZ6JpomuibaJvomGic6J1oneieaJyEpsSlfKpYr
/SuLLIkt/C63MNAyIDVtN4o5PDvIO9E9Wz9TQV9DoEW0R2hJXUtQTbFOxFAlUg5Up1WYV7tZ
2VuIXXBfC2LLY7RliWc2aWBrV22Fb6hxsXPUdc136Xk0ezp9YH8+gV2DIoU+h+WIi4n+iYmK
GIubiy6MtIw2jeqNl442j1SQdpCWkLaQ1pD2kBaRNpFWkXaRlpG2kdaR9pEWkrWTXJQclVmW
+ZaRl/WYCZsznZOfNaJ6pOumsKhAqfuqdK0rsMeyW7Xat7O6Kr2Vv9HAoMNsxdXHSsouzDnO
gdAU0jLUx9ZM2arbCd6n4Cjj8eUC6Nbq++yw7wQASAGpA90F5QckCkYM2w3ID1kQ5BBuEecR
XBLuEnAT4BN9FDEVCRbOFtIX9RcVGDUYVRh1GJUYtRjVGPUYFRk1GVUZdRmVGSobxhuhHL8d
Lh7NHtkfNyGpInMkTyZJKFcqNizQLNcufzBLMrc0+TZTObk7aD5wQO5BW0TnRc5HW0mMS0ZO
+0/UUXhUVVYjWDhapFuQXV9fJ2EvY9tk0Ga5aLVqAWzmbdVvmXFvcxZ1uXZnePp4lnkXeph6
Qnvie2x8+nx/fTh+9n6qf9CA84ATgTOBU4FzgZOBs4HTgfOBE4IzglOCc4KTgiiEyISLheKG
aYfghymJYIunjS+Q8pKhlVWYU5rkmrucRJ8johSl0aeGqnOtLrC0sg60ILeWuCG77L2DwNLB
CMTDxlfIyMpwzcjPfNJv1R/YK9s33lLh6+Oa5m/o9uhw6QDqiuoW66vrL+yu7E7t4e1t7vzu
e+8FAJYACAF2ASoC7AKVA6MExwTnBAcFJwVHBWcFhwWnBccF5wUHBicGRwZnBvMHkAhlCXsK
BguHC5wM6A15D20ROBP9FK8WVhjvGOMa2hzzHpIhCSSwJsEoWSuZLRcvnDHNMlY08jYGOUs7
xT0VQMJBQEQhRgdIZkrLSzBO/k9OUjNUkFarWIFaR1vqW49cCF2ZXR1eyl5GX9ZfiGASYZxh
JmK3Yk1j2GNXZChl52WeZsln7GcMaCxoTGhsaIxorGjMaOxoDGksaUxpbGmMaThr0WuPbOtt
im4Ub1Nwl3LHdGJ3JXqkfEV/XIHmgeWDg4aOiXCMXY9kkmeVbZj6mqKcu5+hocOkQqcyqfyr
6K7PsQG1+raNuVO8z765wanEhce5yszNptCJ00rWsNdK2N/Yj9kz2sbafdsm3LTcON3S3Vje
796U3xzgouA84QHizOJ646vkzuTu5A7lLuVO5W7ljuWu5c7l7uUO5i7mTuZu5vnnsuht6YXq
Geuq67Ps++1r7wMA1gHHA5oFUQfxB+EJjwtRDYAPjxFbE78VLBg9GqYbFx79HwUisyREJt4n
bikcK/AsSC9dMXozXzU7NyQ54jo7PTI/pkHlQxlG/UY/SGtJIUqxSk9L70udTCpNh00jTspO
XU8BUL5QVVECUsdSkFNDVG9Vk1WzVdNV81UTVjNWU1ZzVpNWs1bTVvNWE1czV7VYgVlLWqpb
UFzmXEBeYmCsYlplXWgRa3FtpG8pcFZyF3UjeBJ74n0IgV6EiYdWivCL6Y4WkU2UWZfVmkee
9J8qo2imOqmrq1+up7HgtOu36Lo/vl7BWMRCx27Kqc190E3Tp9Qn1cTVX9bo1onXGti52ErZ
1dlk2vnalNsT3NDckN0w3i7fUN9w35DfsN/Q3/DfEOAw4FDgcOCQ4LDg0ODw4H7iFuPV4ynl
uOU75mbno+hb6nHspe4DALoBWwPwA6kFYQdPCYgLsQ2pD+MRQhQUFnMXkxl4GrMb7x1RH5Ug
LiOoJTUn3ymwKwsumy9NMf8zDjZROK86Oj0QP4dBfkNvRSBHyUdYSAlJjEknSq1KZ0vsS21M
6kx+TRtOvE4+T+RPl1A2UUZSalKKUqpSylLqUgpTKlNKU2pTilOqU8pT6lMKVJVVNFbtVnBY
DFmYWdpaJl2EX1ZiJ2X7Z6xq1WxbbaFvVHJgdU54hHvMft+BHoXyh5eJgIx3jrWRZpS4luuZ
Sp1goHGixaUMqTasqa8QsyO2OblOvGq/cMKKxa3IIcq1ymXL+cuBzATNrM0wzrTOPs/bz23Q
DNG10V3S+dKD01rUD9XS1QTXJ9dH12fXh9en18fX59cH2CfYR9hn2IfYp9jH2Eza0tqQ2xzd
q90r3kffzeCl4uXkJucn6V3rKe217brvBQDvATIEcQa5CAsLOw1JD6sQyhI9FA8VshciGqYb
nRycHUEfWyESIyEk+SXBJ2Yp8isRLh8wXzI2NR03xjdPOOo4gzkIOrA6LDvFOzw86DxsPe09
mT5XPw5AskBPQSNC20KtQ8dE6kQKRSpFSkVqRYpFqkXKRepFCkYqRkpGakaKRiVIukh7SftK
lEsbTD5NpE8EUspUpVd/WuJc/16RX91hq2SWZ4xqjm2+cAJ0pHaAefJ6330Gf4eA2oMkh2eK
3o10kLOTJJdxmuKdLaGvpB2oZ6uSrgOyN7VauC66zrpMu/i7h7w+veC9Y77Zvmi/EMDSwGvB
DMLMwlvD+8OBxGzFN8b9xmjIi8iryM3I8cgayUjJdsmnycnJ6ckJyinKScppyt3LeswzzdPO
cc/qz03RG9M+1azXcdoZ3ZLfleEV4mDkK+Zk6B3rne0HADICugSqBgYITApnDAgP3RBxEkkU
yxV5F3IZQBu1HEse3x8vISUj9iRSJxApKCsILRAv6y95MAcxdDEyMroySDPLM0Y04jRkNdw1
pTZBN+k3mDhGOQw60DqYO7o86DwSPUA9fD3APQE+VT6wPto++j4fP08/bz+PP/dAqEFvQhVE
kEQkRUBG00gkS+BNQlCWUiJVH1ecV9JZXVwSX/Vhy2T7ZxtrW24vca9ykHWvd3Z6oH1MgGaD
gIZDiYuM/Y+BksKVSZmgnLef7KI8plKpaKysr6+yCLSwtD+167WOtjq3urdKuNu4arkfurO6
U7v2u4W8IL3IvbC+ZL8lwD/BfsGxwfTBUsK9wiXDmcMbxEjEaMSIxLjF7sUjxpHHN8j9yJjK
NcvXy23NWs+q0WXUFtfg2Y3cid4V32PhbeP15dzooesm7gMAOAKaBDsGPAkCC0MN7g8YEgUU
mxX0FzMaEBx1Howg1yIhJc0mqiirKggt9S6zLy0wxTBxMQgypjI7M+QzcTQUNZs1IzakNjM3
zzd9OCU50zlvOjs7DTzEPBA+uz5fP/g/oEBMQRRCvUJlQ5dDt0PXQ/dDF0Q3RJ9FMkbTRlRI
5kiRSdFKKE1jTxRSqFRfVwRa/FuTXNxeZ2FjZFpnCWoRbS1wd3NrduB3lXqvfKd/UYLFhROJ
uYu0jteR+5RWmDObxp7RoRylMajFq+yuy7GCsgmzoLMetLa0KLWttUa28baLtxm4nrglubq5
ObrPunG7H7yrvJK9V74Tv2bA+cCtwVnCE8O6w1jE78S2xerFCsYqxkrGasaKxgfItchsyUPL
78t9zAXOEdB00l3VZ9hk213eeuDu4DDj7+Wj6NTr9+4HAPcCDgZ+CGcKjw2IDwcSYxQVFxAZ
mBofHf0fHiLQJJwmhSmXK2cuuTBbM1Q1sDdaOOI4fzkWOsU6dDv6O5E8Oz3cPXo+HD+hP0JA
0EB1QTdC1UKLQ0FEH0UURlFHl0fkRzRIdki7SPxIYEm7SedJB0onSkdKZ0qHSh9Mo0xiTe5O
dU8GUAtRCVP1VDhXXFluW5VdT1/VX9NhEGSIZu5ommsbbqtwkXMJdjN3kXmqe75+vYG9hNKH
RIoujVKQIJMclteYM5w+nz2iF6VzqFarRa7YrnSvC7C/sFSx3LFbsgizi7MStK60R7XntZS2
KLfDt024Ebm1uZe6WLtIvFe9gb2yvda9Dr45vmq+oL7Uvvy+HL88v1y/fL+cv0HB4MGiwk7E
2sRaxfHGDclsyzjON9H508rWy9hY2anbgd5B4Wrkauek6u/tAwB2An8EsQc6CkQMNw7MD9gS
wxUlGPYaCB7/HyYi6SRnJ54phixFL80xujSNNwY5hTkeOrQ6UDvjO3I8FD23PUo+5D6DPxNA
ikAXQZpBKEK1QpNDOERfRZlGvkbeRgJHJkdPR4BHtUf0RxhIOEhYSHhImEi4SEpK/krOSxRN
nU0WTgdP+VCbUqdUt1aoWFFa9lusXLpepWACY0tlfGfsaRhsgG69cNJxvHN/dfp36HqafRCA
yYI7hbeHOIpQjQaQjJKxlZiYcZv2nQ+hGKQdp4uoQKnvqaaqS6vgq2Ws96yErSGur65Sr9Wv
XbD2sJqxU7LqsrezebS9tcO26LYItyi3SLdot4i3qLfIt+i3CLgouEi4aLiIuBK6rLpeuxq9
or0ivrO/tcEPxMzGm8k0zN3O3NB50eXT1da+2fXcduCW4/fmaeox7RrvBAAjAkoFpgdfCjgM
dQ7WEHYSyhVxGKUbrh68IdckfCcpKjwtTTBQMvAyhjMjNKk0VTXFNUg26TaQNyU40zh3OS86
yjpHO+M7dTwaPfU9lz4EQPRAF0E3QVdBd0GXQbdB10H3QRdCN0JXQndCl0K3QmRE/0TBRUNH
4UdXSGVJFksATTFPGVExU1JV7VZsV31ZX1uDXeJfMGKGZOdmE2lHa2xsGm4pcEFyeHTAdnx5
hnvofY6A/4JDhaaHBYp/jLqO1ZBlk8uVGpiwmTua1pp9mxycppw7ndGdW54bn56fWqDloGyh
G6LSooWjFaTMpL2lYKa+p4WoqKjIqOioCKkoqUipaKmIqaipyKnoqQiqKKpIqs+rfKxQrc+u
Z6/9r6ixqLMwthy587u0vpjBjMMTxLfGuMlyzIvPu9Lf1SHZLty93oHgkOP35d7oret17gEA
tQGUBCcH/QnrDK0PPxJaFRsYFxtxHaYgSiNtJpMpWirmKngrCyynLF0t4C2NLjQv0S9/MDIx
7jGsMlYz3DNdNEg1+jV7N+o3DTgtOE04bTiNOK04zTjtOA05LTlNOW05jTmtOVM75TvDPHk+
ED+fP/RAGEMpRbNHG0pdTPFOu1BGUcVTplXuV8NaeV3lX6xiYWWaZ6donmpHbCZuInBpctB0
MHc4eUF8YX6RgMSCroS7hveIG4sjjXePvJH7k3eWK5ful6GYRpnvmYKaIpukmzuczZx1nQye
up5snx6glqBEoRSi8KItpIKkpaTFpOWkBaUlpUWlZaWFpaWlxaXlpQWmJaZFptinmKhdqdKq
Z6vhq3atnq8ysvy0iLdtugu9175kv73BkMRQx7HK683n0F7Uctcj2unbq94o343gLeND5v/n
O+ss7gUAPANyBlkJaQtVDk8RGhQcF0oaXx2nIMcjyyasKXcsMS/mL3YwMTHCMVQy6TKYM0I0
1DRdNRQ2wTZZNy449DhFOo86sDrQOvA6EDswO1A7cDuQO7A70DvwOxA8MDxQPPs9nz51Px9B
yUE4QptDpkXhR5VKLk21T/5R01M8VNRWf1joWiFd1l9JYipl42cgaklrg22Hb9hxeHTSdox5
53v0fuCAzYJihYSHxYnDi3qOzZCbk0WVfpe/mTqcW558oMOimqQZpaOldKYLp86nfKg3qcqp
caoqq9OriawwrRCux643sG2wjbCtsM2w7bANsS2xTbFtsY2xrbHNse2xDbItst2zibRetbO2
aLfot3O5nrs8vh7BBMTExjfJ/8qOy7/N4dDB0/jWrtlU3HjfoeKD5T7nHeoV7BfvBQAlAukE
gAePCowMGg/UEXEUSheTGqodqyCnI6UmyymXLJIvvjJ9NPU2qzlrPCQ/tUF4RL9GXUf3R3JI
Ekm3SV9KFUu0S6xMWU3FTv1OHU89T11PfU+dT71P3U/9Tx1QPVBdUH1QnVC9UGZS9lLHU7ZV
ZVbgVnNYgFrEXFZfB2KzZFxnPWnWaXVst27rcLVzYXYEeeR7uX7PgPyBOoQ1hv+HnolfizON
d4/YkfKU9ZadmICb8p0XoGOiO6WWpwiqR6wcrwSy4LMltce2u7hbujy87r2tv33BIsLJwknD
1cNoxBDFu8VXxjHH+MdpyaPJw8njyQPKI8pDymPKg8qjysPK48oDyyPLQ8tjywLNn82VzhLQ
o9A00cPSKNWj14/agd1F4C3j9eSV5QPo7eoJ7gAALgMbBlAJsAxPDyUR1RNtFqkZ7hu3Hh0i
AiTdJgoqbS2sMBgzAzaeOfk8ZUCHQ8BGAUoDTfpPx1BsUQZSkVIwU7FTRlTPVGhVF1a+VnlX
GFjHWHdZHlrkWtdbmFweXmReDGA4Yj5kPmbFZ/JnEmgyaLFp12n3aRdqN2pXav9rumybbSpv
xm9RcL5xW3NRdY531Hmze+p9ln80gHGCO4QIhqWHFYoyjGaOq5CXkv2T/pXYl7eZ/Zs1nu2g
IqOYpSCoc6nBqhCsAK1ersqvSrFIsgC0krUQt6K4V7n+uY26IbvPu2W8GL3dvXS+Ar+ev1DA
68ClwVTCAcOOw3rEPsUQx5LJscrUyvTKFMvlyzzOw8/uz6/RS9SX1b3V3dX91b7XX9hp2dna
mNsb3Lbd+t9+4lHlJ+gP69Xtoe8EAIkCdQWGCLsLkQ6GEX4UgBcSGrYbRR7qIPMjFCdOKoYt
dDB0MyM2vDZzNwg4nzg8OeM5ijoIO5U7OjzIPGo9AT69Pm0/6D+hQD9B1EGFQjtDyENMROJE
j0VJRtZGkUcrSApJ2kmUSmVMlUy1TNVM9UwVTTVN9k5dUYlRIVIQVN9Wjlh2WR1bs1uaXCxe
0V5EX3xgG2LZY8llw2e0aclraG0DbiFw1nHic9J1GXh5eqR86H62gEGCR4S5hT2HpYhjigqM
No6Tj+WQjpI/lAeWNJcimeaaA52QnoygJKIYpAamsqZOp+mnTajiqIOpCaqYqiSr06t9rBKt
kK1BrvCuoa9BsB+xwbGSspK03bVntoe2p7bHtue2B7f9uCm5SblpuYm58boVvU6/87/rwIHC
FcOgw1zFrccSyg3N9c/f0ozVU9f11zraEN3D36vinuWS6HnroO4FAD4BfgNvBmUJVAzwDrcR
khQbFxIaCR27H2EivSXkKBEsGy9sMqg1yTjGO+s+lz8kQLdAVEHSQW9CEEOwQ0FE0USARRlG
vEZOR9tHgEgbSfpJf0qCSyVN407wUBdTRFVsV5hZk1vFXfddF143Xlded16XXitg5WDVYS1j
xGNjZL1lNGcKaf1q9mwTbzBxsHIpcwB1y3a0eNR68HwKfyiBLIMWhXqGdogIio2MMY4zkDWS
6ZMtlu2XEZoxnGueb6A4ouOjrKVoph2nzad0qCip3Kltqgiroqs1rOaslq08rsmuaa8qsNCw
brELsqiyU7MCtNm0f7Vbtjy3PbhGuW66srsJveO9o76/v/G/EcAxwFHAccCRwDrC68L2w5fF
LMbHxmXIycojzQLQq9Js1bvXV9nt2UDc59614RzkzubL6crswe8CAAcBIgP9BeIInwtnDhER
CxQ8F8EZyRzJH7oiqSWBKGQr5i2JLhEvqC89MPkwzjGQMikzzjNeNAk1sjVGNvQ2rjc2OLo4
WTn+OYo6HTu8O3w8MT34Pc0+lT9fQCVBEEIMQwFEQ0UORkJGYkaCRqJGwkbiRo5IKkkXSmdL
AEx1TMVNSk80UU5TnFWcV9tZclsdXD9eCWA7YsZkPmebaTpsk26QcAByQXTpdYR4k3qIfJ5+
SYD5geqDJoYhiLSKUI1cj9eRIpRYleOVjpYhl7KXRJgHmaiZTprUmoKbOZzvnICdEp6rnk+f
7p99oCKhx6F6olKjF6QGpgSoualSqzOtb6+VsGKxErLXsgmzKbNJs2mzibOps2a1CbYJt1i4
9LiBuRC7X72rv0bC7MRNx7/JXMv1y07O5NC202LW6dh/21/eM+G34/Pk6OaZ6XHsgO8CAIAC
2wSXB1EK0Qw5DwcSABVRFxIashx0HiEfxB9KIOMgiyE9ItQiaiMGJJskJCXOJWomFCe9J1Mo
2ih9KR8qqSpVKzAs4yyYLtcu/S4dLz8vmDB0M8E19zfkORI6MjpSOnI6kjqyOl88DD37PfY+
jj8TQCtB2kJhRAlGzkePSQxLX0z3TKFON1AjUvRTslWDV0FZC1uiXG1dol41YHtii2Q9ZgRo
7Wnja9Btpm/RcKpyhnScdXJ3R3l+ehR7wHtJfON8hX0pfrN+V38XgL6AbIEAgo+CK4PZg4aE
GIWrhVSG8IaOh1uIN4nsioCLp4vHiwCMWo65kFyS2ZP+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDcnN6bf3+TkJKNf3+NjIqIgH+KiYeGgH6IiISEgH6Ih4ODgH+GhoOD
f3+FhYOCgH+Eg4GAf3+Dgn5+f3+CgX5/f3+Cgn5/f3+Dg39/f3+Cg39/f4CDg39/f3+Dg39/
f3+Cg35/f3+Dgn9/f3+Dgn9+f3+Bgn19f3+BgXx+f4CBgX5+f4CBgX19f4CBf3x8f4F/gHx8
f4B/f3x8f4B/f3x8f4B/f3p7foF/f3p6f4F/f3p7f4F/f3x8f4F/fnt6foF+fXp6foF9fXp6
foF+fXl5f4F+fXl5foF8fHl5f4B8fHl5foF9fXl5foF9fXl5f4F+fnl5foF+fnl5f4F+fnl5
f4F+fXl5f4F8fHl4f4F8fHl5f4F8fHl5f4F9fXp6f4F+f3t7f4F/gHx8f4GBgXx7f4CBgXx8
f4GBgnx9f4CCgXx8f4GBgXx8f4GBgXx8f4GBgXx8foF/f3x8f4B/gHt8f4CAgHx8f4GBgXx+
foCCg39/f4GEg4CBfoGEhIGBf4CEh4GDfoGJiYWGfoCQ3o7efoH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDhmuSaf3+QjJCLgH+JgYZ8gH6Bf4R9gX5+fnx8gH9+fnt6gH9+fHp8
gX59fH14gX98e3l7gX96enx5gX95enl5gX95fHd3gH97e3d1gH96enZ0gH96e3Rzf396e3Ny
f396e3Jxf396enBwf396enBwf396enBvf396em9vf396em5vf4F6eW5uf4B6eW1tf4B5eW1r
f4B4eGtrf4B5d2trf4F4eGtqf4B3eGtqf4F4d2pqf4B5eGppf4B5d2pqf4B3d2pqf4B1dmpq
f4F2dmpqf4B1dmpqf4F2dWprf4F2dmtrf4F2dmtrf4B2dmtrf4F2dmxtf4B2d21tf4F3dm1s
f4F2dm1tfoF2dm1uf4F1dm5vf4F2dW9vf4F2dnBvf4B3d3Bwf4F4eHFyf4F3eHJyf4F5eXJz
f4F5eXR0f4F5eXR0f4F5eHR0f4F4eXV1f4B4eXV1f4B5eXV1f4B5eXV1f4F5enV2f4F6end4
f4F8fHh5f4GBhH6BfoCGiYSGfoGJg4iBf4CChYGEf4GN4I3lfoH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDkmeWZf3+QipCKgX6Gf4Z+gX6Ng46CgX6DgYGBgH+BgYB/f3+AjH+B
gX6Qf46Dg36Lj4yThXyJjo2NhnyPjZCQh3yMkpKTh3yMi4OOhH6Nfo18gn58fHx8f4CDhIWD
g3+CgImLg35+i4KMg36Bi3yNhH6JhJKXh318h4aShH6EiI2Mhn2EhH6Ig39+fYl8gn+Bd4h3
gX+DgH+Dg392eHeEgIF/douPhH51dYaEg391dIyGg350c4WHgn9ycnd0f4FycYV+gn94domM
hX5ycHuBgoB3c46KhH5veYGKhH90dnqIhH5ub3mIgn90bYt/g35wdYGHhH5xb4qFhH5ra3Rz
f4Fqa3R0f4FqanN0f4FqanR0f4FoaHR0f4FoanV1f4FqaXV1f4FqaXV2f4FpaXV2f4FpaXd3
f4FpaHd3f4FoaHd3f4FoaHh3f4FoaHd5f4FoaHl4gIFoZ3l5f4BnZ3l5f4FnZ3l5f4FnZ3p6
f4BoaXp8f4Bqanx8f4Bqanx6f4Bxf3uAgICAhH+Df4GM6ovtfoH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDnmOiYf3+Qi5CKgH6GfIZ9gX6EgomCgX6BgIGAgX9/f39/f39+gX+D
gX+Cg4R9gX+AhH6Cgn+IhIJ/g36Hg4F9g36Bhnx8gX+DgXx8gX+Ge316gX96enp6f4B/gnp6
gX+BhXl5gX+GiXh5gn+DiHh5gn+HiXl4g3+HiHl5g3+FjXh3g36Ehnd3g3+FfnZ1gYCEdXV0
gIB7enR0gIB1hnN0gYCJi3RzhH+DiHN0gn+JhnR0g3+Bi3R1g393dXl+g4CTiHV0hn6Ik3V1
hn58f3Jxgn+Li3Z1hH6LgXR4hH+EiHV2hH6FgnJzg3+Ni3d2hX5+hHZ1hH+Lhnl0hH5ycnBw
f4FycnJxf4Fyc3Byf4Fyc3Jxf4FzdHJyf4FzdHJyf4F0dXJzf4F0dXR0foJ1dXR1f4F1dnR1
f4B2dnV1f4F3d3V1f4F2d3V2f4F3d3V2f4F3eXd3f4F5eHd3f4F5eXh5f4B5eXl5f4F6e3p5
gIF6e3p7f4F8fHp8f4B+en15f4B+f39/gH9+g3+DfoGL8oz2foH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDqmOyZf3+Qio+JgH6GfoV9gX6NgZCBgn2Bf4B/gH9/foB+gH5+jn1+
gn6TfJCBhH2Lk42Th3yLkpCNiHyTkJKJiHyCk4CQhnyGi4x+hX2Qeo15g314d3d3f4CDhYOD
g36CfouNhH5+j4COhX6EjYuUiXyMhJCJh3yOjpWHiXx9eZCRhn2Bgo+Jhn1+e4p5hH+Dc4dy
gn+EgXuAhH5ydXGFgoCBcouVh35ycoaJhX9zcZh8hH5xcnKOg39ycYaIhH5xcI6DhX5wcIGO
hH5wcIN+hH51b45vg39wdW+Og393coGEhX5wb4aBhH9wb4N/hH9wd3mLhn5wcIN8hH93b41v
hH9wdXCAg4BwcIJ+g39wcIB6gn9xeIONhX5xdH6DhH96c42Jhn50coB9g391dYuKhn5zdH18
gX90d4GOhH90dHhzgIF0dXJ0f4F1dnR1f4F1dXV1f4F3d3V1gIF3d3d3f4F4eHh3f4B5eXd5
f4F6enl6f4F6e3p7f4F9d3t3f4CAfYB+gH9+gn2Bf4GL+Iv7foH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDsmO2Xf3+OiY6JgH6EeoR8gH6DgYuBgX5/f39+gH9+fn59gX99f3yC
gX6AgYN7gX58g36Dg3+Hg4N/g36EgoF8g3+Ah3yBg36Eg3x6g36EeHt3gX94d3V2f398gHd4
gX9+g3V1gX+DiHV1g3+AiHV0g36IgXR1g3+GhHR0g3+HhnR0hH97hHNyg3+CenJxgYCBcXBw
gIB3d29vgYBvhG9vgYCGim9thH9/iG5vhH+Vf292hn5xiHpuhH+Gf29uhH+ZhIBxiHyHjW1t
hX5+hG1thX+Icm10hH9tiHpvhH+Gh29vhX6KhXBvhn6Ak3Byhn6Jh3Bxhn2OinVwhn6KbnN6
hH9vh3V0hH+MiHdyhn6LhIxuh36GkXB5hn6Of3d1hn6HiHR2hH6HhHlwhH6NjXp7hn6Tj3l+
iH2PlXl/h313cnFxgIFycnFxf4Fzc3Jyf4F0dHRzf4F1dXN1f4F2d3V2f4B2d3Z3f4F5eXd3
f4F3eXd5f4B6enh5f4F6dnp1f4CAfIB6gH98gHt/foGM/I7+foH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDtmO2Xf3+OiY6JgX6FfYR8gX6Of5GAgn1/fn9/gH9+fX58gH98jXx+
gn6Ve5CChH2Nl42ViHuJk5OOiXuXj5OJiHuDkoGOh3yOjo6NiHuPd413hH51dXV0f3+BhIGB
hH6BfomNhn1+iYiYh3yAfI9+h32PhZGNiXyQgpKTinuNhYeOiXyDhHqHh319eop2hX+Bb4Ru
g3+DgHl7hn5udG15goF1cIOPh35ub4GDhn58eo5yhn5+bIhrhH5vfYCIh35tbJqHiH1ra4Fp
g39ra3x+hX9rb491hn53fIONiHxtampqgYBza419hn5raoOEhX5sb35/hn5qb32Ghn95a41/
iH10b4iBhn1rb3WKhH96bY1+iH5tdX6Jhn55co9/hn1udW2Jg39xdHGCg39vb4F5g39vcX2O
hH9xdXiPhH9wcISAhH9xdH1/g390cn9xgYByc3Jyf4FzdHJzf4F0dXR0f4F1dXV2f4F2dnV1
f4F3d3Z3f4F4eXd5f4B5dXl0f4F/eoB5gX96f3p+f4GO/pH+fYH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDumO6Yf3+Oio6JgX6FeoV8gX6BgIyBgn5/fn9+gX9+fH19gH98fn2C
gX9+fYZ6gn57f3yFg36DgYWAhH6Df4SBhH5/fXx8g35+fn9+g36CdXx0gX90dHN0f4B5fnV3
gX96f3RzgX+ChHJ0g3+Bg3Jyg36EenRyg3+EhHJyhH9/hnJxhH6BfnBvhH99eG5ugoB7bW1s
gYB0cm1tgYBseGtrgYF/i2tqhX6BgWprhn6GfGpqhH6DbWt3hH+ChG1phX6VkGlqiHyCa2p4
hH55gm5ohX6KdGhohX6CiWhohn5oaHB2goCIhmhnhn55iGdphn54gmdohn57fmZohX+JjWtr
iH2GjG1tiHyEgGlqhX6Njm1uh315iXByh359eXNrhH5riWt0g39wiW90hH+Qk3d0h32Oi3V1
h36KjXV5iH6dmnt7iXySf3p6hn59cHJwgn9wcnBxf4FycnJygIF0dHJyf4F0dXN0f4F1dnR1
f4F2d3Z2f4F3d3d3f4F4c3lzgICAeIB4gH95fXl8f4GS/oewfoH+/rCwgID9+q6uf4D39qyt
f4D0762tf4Hs566vf4Dj36+uf4Db2q6uf4DX1K+ugH/+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDvmO+Yf3+OiY6JgX6FfIR8gn6QgJR/g31+fn99gX99fXx8gX98jHx+
g36XepCDhnyNmIqViXuJkpSQiXqWhJOPinuNnIGViXuRfHyNiHyOdY10hH5zcnJygIB/g39/
hX6EfomMh3x+jIaaiXx+fY54iHyRh5GMi3uSjZCUjXqQj5yVjnqGhItwiH1+eYd1hn5/a4Fq
g3+DgHd0hn5qcml6goBzb4GQiH1tbISBh359aItohH5pbGuVhX5qaoiBiH1qfpKGiXxraYST
iXxnaXiGhn6DbpCLjHtpgYODiX1+aIGBiXxmZYZrhX5mfYGQiXxtZ4yBiHx/dHyNinx5fo58
intsZnJlg395aoRrhn50aHuFhn5oaXl+hX5wa493hn53a4uOiHxra4F+hX53cIFyhX9sbGpr
gYFsbWtrf4FtbWxsgIFvb21uf4Fvb21uf4FwcG9vgIFwcXBwf4FycnBxf4Fzc3Jyf4F0dHN0
f4F1dXR1f4F2d3V2f4F3cnZxf4GAeH93gX95fHl7f4GDooSsfoGnqbGyf4CrrLGzgICurrGx
gICwsLCwf4Cxsa+wgICxsrCzgICzs7i6gICysr7CgID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDwl/GXgH+OiI6JgX6EeYN6gX5+fo5+gn5+fH18gX97e3t6gH96enqC
gn56eoZ4gn95fHuGg35+fIWAhH5+f4WChH58fnx8g358eX56hH59c31xgn9ycHBwgH91eXJ2
gn92em9vgn98fm5yhH97fnBvg35/dXJvhH9/fHBxhH56gm9whH6DfHBthH53dWprg392ampo
goBwbmlogoBodWhngYF5hmdnhX98emZnhH+CbGZvhH9vlXR0iH2Ab2VlhH+IfmVlhn5/gmRk
hn5rbWRjgn+FgGNjhn6Ai2Njh36Cg2Njh32HfGFjhn1phmNihX6EgWNjiH2Eg2Njhn2FhGNj
h35uZGNjgn+GbWNlhX+FkGZmh32MhmZoiH2JiGhqhn6JnWpsiXyYimxriHyFb21mhH9qamdp
f4FqamprgYFsbGprgIFrbWtrgIFtbWxtf4Fvb21tf4FvcG9vgIFwcG9wf4FxcnBwgIFyc3Jy
f4F0dHN0f4F1dnV1f4F2cXZwgX9/d393gH95fHl+f4CS26T+foHg5f7+gYDn7P7+gIDv8f7+
gID2+f7+gID7/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDymPOXgH+OiI2IgX6DfYN8gn6RfpR+hH19fHx8gX97enp6gX96iHl9
g36VeJCChnyLmIeTiXuHkJWQiXqVf5aBiXuLlY6Uint+jH2Nh3yMco5yhX1wcG9vgIB+fn5+
hn6DfoeLiHx8jYOZi3t+f492iXuTiI+KjHqSk5B8jXqEkZSTjXqEh4ZviXx9eYZziH58aHxm
hH6Bf3Vuh35mcmZ6g39wcYGPiXxta4OAiH2Bd4htiXx+ZYNkhn5rfoOJintpZ6KLi3tmY35i
hH5mZoCDiH1mZZKEiXxofH+VjHplZIl+iHxkdIqHinx5Y42Ki3ptdHR8iXx6eZmCjXpmYn59
iH1yeIaOjHpjaoZ5iH5ydnyVinx1eG6GiXxlbWR2g392dXN/iH1oZnyAhn5naoWBhn9udX6T
iH5taoaOiH1qboZwhX95a4dqhH9rbGtrgIFsbWtrgIFtbm1tf4FucG5tgIFxcG9vf4FxcHBw
gIFycnFygIFzdXR0f4B1b3VvgYB+dn51gX95fnh/f4Cn/qr+f4H+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID0l/WXgH+OiI2Ign6DeIN6gn58fo59gn19e3x7gX97enp6gX55eXmC
g355d4Z3g353eHqHhH54d4SBhH53d4aBhH51eX+EhX53dXx8hH54cH9wg39vbW9ugIBxdnJ4
g39xdW5tgn94eW1zhH93em5rg398cHdxhX57fXVqhH5zfGlpg391a29og39xcmdqg39wZmhl
goBwampng39lcmNlgoBzfmVjhH92cmNjhH58dWRihH93cWNqhX96e2Nhhn6DgGNhh312a2Jr
hn6FeHJiiHx6eWFhhn54i2BgiH1+cWBghX5pdmFghH98hF9giH54emBghn1/fF5fhn6BdF5g
h314gl9ghn2IemFgh32EkmFiiHx5hGNhhn5kdmNjg392iWNlhn6BimZmh32VfGZoh32GlWhp
iH2QnGpqiH2ZdGtrhn6Kamppg39ra2lqgIFrbGprf4FrbWtrgIFtbWttf4Fub25uf4FvcG9v
f4BwcnBxgIFydHJyf4F0b3RvgIB+dX51gX94fnl/f4Gu/rD+f4H+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID2l/WXgX+Nh42Hgn6DeoN6g36QfJB9g317ent6gX55eXl4gX94hXd8
gn6Wd46BhnyJmIOSiHuIjZWPinuWfJWDiXuTl5SXjHqQkouOjHqLcJBwhn1ubW1tgIB9e3x+
hn2GgISLiXyCjoOai3t/gI52inuSho6GjHqOfomJjHp5foqDinyQcYuCi3x/d4Z0iH56ZXlj
hH+BfXRpiH1jdWJ6g39vd4GMinxubIV+iXyGY4Zjhn1lcGmYh35saolriH15YIRghn5ia2eX
h31oaIh/iXxqgZCGjHtmaIiOi3xhZniGiX6EbY+KjnpkhIGDi3tyemeDi3xiXpFtiH1mg4GN
jHtqYYuBinyDdYSGi3ttgXqEinxoYmFgg3+AaoRviHxtZHyRiHxkZYKAh311aZCBiH17Zoqd
inxnZ4t/h359aoVqhX5oaGdngIFpaWhogIFqamhpgIFra2prgIFra2tsf4FtbWxsf4Fub25u
gIFwcG9wf4BxcnFygIFzbnJuf4B9dX11f394f3d9f4Cw/q3+f4H+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID2l/aYgX+NiI6IgX6DeIN5gn57fI17g356eXp5gX95eHh4gX93dneD
gn91dYh1g391c3qIhH50c4WEhX1yc4h5hH5ycn2ChH5xcIN7hH5xbYNug39sbGxrgIBucHJ5
g39tcGxtg39xcmp3hH9xdHR5hX52b3dwhX50dXh1hn5wdWlxhH51bXluhn5rb2Vtg39qY2hj
gYBsZW1nhH9hbmFogoBtd2RhhH9xbWFihH93cmFjhH94j2ZoiH10b2BghH94b2BghH90j2Rp
iH13Zl5ehX9+dF5ehX52fV9fhn5hY1xdg39+dVxeh350gl9dhn5yfF1ehn6CdGBdiH1jgV1e
hn56d11ehn6Ee19fh32AiF9diH5lX15egn+BcV5fhX97i19fh32Fe2Fhhn6IhmFhhn6HlmNk
h32Sf2Rkhn6JZ2Vlg39mZmVmgIFnaGZmgIFoaGdof4FpamhpgIFra2pqf4FsbWtrgIFtbWxt
f4FvcG5vgIFwcXBwgIFybXFtgIF8dH10gH93fHZ8f4Gu/q/+f4H+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID1l/WWgX+Nho2Hgn2DeoN5g36Ne417hH16eXl5gX54d3h3gX93gXV5
g36UdIl/hnyJl4COiXuIipGMiXqUk5N4i3qQooiOi3qHfn+KiXuJbY9thn1ra2pqgH98eXt+
h32HgISKiXx+k3qQintvhYiBi3uUhpKWjnmNkIuRjnmIfZeLjnp2gYZmiXx/dYR2iXx3YnVh
hH5/eXNmiH1ggGF8hH9ye4GKi3t1cIR7inxzepN5inxtYG1ghH5xbYSVi3t5dHd4iHxrXm9d
hH5tbYKFi3tybY2DjHtthIWYjnlqZoxzinxlfoyHjXqBZYiSjnp1g3x/jXqJYoJzi3tuiX6Q
jXptaoqDjHp/epiMjnl8XYtciHxcXlxcgYBeXlxcgYBeXl1egYBfYF5fgYBgYV5ggYBhYWBi
gIFjY2JigYFkZGNkgIFlZWRlf4FlZmVlf4FnaGZmf4FoaGdof4Foamhof4Fqa2hpf4FrbGts
f4Ftbm1uf4FvcG5wf4FxbXBsgIB8dHxzgX93fHZ8f4Gw/rT+foH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID2lfWVgX6Nh4uGgn2Dd4J5gn57eo16g355eXl3gX93dnd2gX91dHWD
g350c4pzg35ycnqLhH5ycISIhX1wcIuHhn1vb3yIhn5ubYR/hX5sa4Vrg39qamlpgH9ranN4
g39qa29tg39qa2h8hH9qanV7hn5raXlzhX9qa3l7h35oa2xlhH9nZnhrhX5kaGRvhH9jYGZg
g39mYXRohH9gal9ggoBocGBghH9ua2hjhH9wa19lhH9temZehn6ObWNeh352a2ZehH5sd15d
hX6Nb2VciH5vcF1chX9te1tbhn5va2Jbhn5bbFpbhH9wcVpgiH5mbVtZhn5ta15dhn5gfF5b
hn5xclxeh36CcVxciH1xXF5ehX5bXFxbgYBcXFtcgYBcXFxcgYBdXlxdgYFdX11egYFgYF5f
gYFhZWBhgIBiYmFhgIBjY2Jjf4FlZWNlgIBlZmRlf4FmZmZmf4FmZ2hpf4BpamhpgIFqbGpr
f4FrbWxtgIFvb21vf4FvbG9rgIB8dHpyf4B1fHV7f4G2/rj+f4H+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID1lfWVgX6LhouFgX6CeYF3gn2LeYl5hHx5d3d3gX52dXV0gX50fHR3
g36Tc4V8hnyGlnyKiHyJhouIinqThI1/i3qNloiOi3qYiYuFi3qIa4trhn1paGhogIB6d3l+
h36IgYGIi3x7kHyUi3xthI2Ei3uUg5R+jXqQiol/jXqQfI98jXmOfZCCjnmCdYB6inxyXnFe
hX59c3Zjh31gfV6Jhn17f5l6jXp5ZX9qiH1ffV+NiH6BgI6FjXlycYOAi3t+dYWFjHp0fH+E
i3teY15mhH94dJyIjnlvd3+LjXqKaYaVj3l1ZIR5i3twjYOPj3lydYiNjnl9h46GkHh+aoF9
jHuDg4yIkHlnipdrjXqIjZOTkXllWmhahH5bXFlagYBbXFtbgYFcXFtbgYBcXlxcgIFeXlxe
gIBfYF5egYFhYWBggIBhYmBhgYFjY2JigIBjZWNjgIFlZWVlf4BmZ2VmgIFnaGZof4Fpamlq
gIFrbGlrgIFtbWxtf4Fva21rf4B5cnlygH90fHR7f4G4/rr+f4H+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID2k/aUgX6LhouFgn6BdoF3gn54eY55g353dXV1gX91dHR0gn9zc3KF
g35ycY1whH5wcHqMhX5wb4WLhn1ubo2Ih3xtbX6OhX5sa4F5hH5qaoZqhH5oaGdogX9oZnR3
hH5oZnBsg39lY2aEhH9lY3d+hn5lZYB/iH5jY31ihH5jYnB7hn5jYX1wh35fYGVyhH9eXWhc
g39fXXlqhX5diVxqhn5hZWhdhH9laGxjhH93al9ehX9la15ehH9kX1xcgoFqaV1cg39lbVxc
hH9veW1ciH6Ea1tbhn5gbVtqhn5oZlpZhX9vWVlehH9bbl5YhH9ma1hYhn5vbVlgh35sW19Z
hn5rbmFgiH1tb2VZh35mdllhhn5aWlpZgn9ZWl5fgn9ZW15gg39aW1xbgYBbXFtbgIFcXVxc
f4FcXlxdgYFeX15egYFgYF9ggIFhYWFhgIFjY2Fif4FjZWNjf4FlZWVlgIFmZ2VmgIFoamdo
gIBqa2hqf4BrbGtsf4Fta2xrgIF4cXhxgX90enR5foG7/r/+foH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID2k/aTgX6KhImEgn5/d391g36Kd4R3hH13dXV1gX90cnJygX9yeHF2
gn6TcIF6hn2Fl3mIiHuLg4mFinuUgol/inqDiH5/iXx6fHx/iHyJaodphn1nZmdngX97dnd6
h32HhHyDinx6i3uMinxoi3qGi3uVn4iOkHmLl4eJj3l4g4iBi3p0eYF9inyDc3p7iXxwXGtb
hX58bHNfiH1ciFyRiH1/joh2jnl5eYN1i3t3ipCNjnmBjX98jXpcaF1thH+EfpyJkHl+gXqQ
jnqMdYmXj3mEXIJciXxgkneOjHp3fI18jnpveJB8jXpreYByjXpyaY1vjXpth3+JjnqJcoiT
kHiMg4aCkHmLXYd/jXqBjXaSkHlzb4xxjXuKjoZrjnqOjZWUkXhjW2FahH9aWllZgYBbW1tb
f4FcXVtcgIFdXlxegYBfX15egYFgYF9gf4FgYmFhgYFiY2Fif4FjY2Nkf4FlZWVlgIFmaGZm
f4FoaWhpf4Bqa2pqgIBramtqgIB3cHdwf4ByeXJ5f4HB/sP+f4H+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID2kvaSgX6Jg4iDg35/dH51gn54do92hH10dHRzgX9ycXJxgX9xcXCE
g35wb45vhX1vbnyOhn1ubYaOh3xsa5GHiHxranSOhX1qanyEhn5paItohH5nZ2Zmgn9nZnl5
hH5mZXVshH9lZWiLhX5lZXSDhn1jY4N8hn5iYYJhhn5gX298hn5eXn50hn5cXGZ1hH9cW2db
g39bW4Bthn5bXFpbgoBcXFtZg4BcXG1ehH9cXltbg39eXlxchH9xem1ciH50X1x1iH5dXlta
g39fXWZnhn5gbVpbhn9qYVpuh35hXFpZg39eYVlZhH9eZFx0h35kXFljhn5XY2Nvhn5jYWNY
hn5qY2liiH5pXldXhH9baltthn5laFhXhH5wa1dXhX5gbVZXhH9aWVlZgYFZWVdZgYBZWllZ
gYFbW1pbgIBbXFxcgYFcXlxcgIFeYF5fgIFgYF9ggIFhYWBhgIFjY2Njf4FlZWNkf4FlZmVl
gIFnZ2ZogIFpamhqgIBrampqgIB3b3VugYByeXF5f4HF/sj+f4H+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID1kfWQgn6HgoeBgn5+dX1zg36LdYN1hH10c3Rzgn5ycHFwgX9vdW90
gn6Tb357hXyEl3SEiHyNgISDinuTkYV+i3qGi3+GiXuHinB+iHuIaIJohn1mZmZmgX98dHN1
h32IiXZ+iXx5iniFint1fIJ8i3uXjoiCjnmJmH6LjnmHb4FtjHt1d353i3yFdHN5iXxrW2Za
hH57Y21ciH1bi1qQiXyQfYt5jnp9YIBiiXxbmlqZi3yLiZqNkXeRd3+CjXp7in6IjnpzW3xb
hn2Kg5KLj3mNeXuEj3l4enOKjXp/eoyGjnqLdXtujHqFkHWOj3l9g4iGkHmHbpl2j3l3eItr
jHqOjoiJkXh7fpCJkHmDkICPkHlfVltVg39WVlVWgYBXVlZXgYBYV1dXgYBXV1ZYgYFYWVhY
gYBZWllZgYBbW1lbgYBcXVxcgIBdXlxef4BeYF5ggIFfYV9ggIBhYmFhf4FjY2Fjf4FkZWNk
gYFmZmRmgIBoaWZogIFqamhpf391b3RtgIBweXF5f4HM/s/+foH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID1kPWOgX6GgIV/gn59cnx0gX55dI11hH5zcnJygX5xcHBvgX5vcG+F
g35wbZNthX1ub3+Thn1tbYmSiHxtbJWMiXtranyZiHxqaIONiHxnZpBohX5mZmVlgX9lZHp8
hX5lZXxvhX5lZG2Shn5kY3SIh31hYo2SinxhYYiFiXxgXZF0iXxeXoxoh35bW2t7hX5bWmZb
g39bWYZuh31ZeFlZg39aWVlZgYBYYnBohn5vW1tuhn5ZWV1bg39aWVpbg39ZWVlahH9hcFpZ
hH9bWm9dhn5YWG1XhX9ZWFlZg39aWXhZhn5ZWFh3hX5ZWGpZhX9bW3pqiH1aW3VYhn5YV2F4
hn5cW1lohX5bYHZ0iH1ZW2RWhH9WVVVVgYBUVlRVgYBVVlRVgIFWVlZWgYFXV1dXgYBXV1dX
gIBYWVhZgIBZW1lagYBbW1tbf4BcXVtcgIFdXlxdgIBfX15egIBgYWBggIBgYmFhf4FhY2Jh
gIFkZWNlf4BmZ2VmgIFnaGZogIBybXJtf4BweXB5foHR/tP+foH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID2jfWLgX6Ff4R+g356cnpwgn6KdH90hH10cnJwgX9wb29ugX9ucG5y
g36Pb3l3hnyDlnF+iHyNgX59iXuSjn54i3qLj3V6iXt/dnRrhnyJaHtmhX1lZWVlgX98cnBy
h32IinJ5iXxviXeBiXxojXl5i3yWjH9xjXqShneFjnpuiXx6i3uGYIBvinuGeWt3iXxpW2Na
hX56XmxbiH1YWFljgn9ZWmVlhX+Zg4h/j3mPhGx8jHp/f2qDjXqahIN6kHmQWWxdiXxqi3WD
jXuSb3tqjXuHi4ONkHmEfIR3j3mOeYd1jnqIlGaBjnqUiISGkXmPeY11kHmHcIx6jXqNknCH
kHmEhYd1j3mOkICFkXmAVXRWiH1VVVRUgX9WVFRUgYBUVVRWgYFVVVVVgYBWVlVWgYFWV1ZX
gIFXWFdXgIFZWVlZgYFZWllaf4BbXFpbgYFbXVxcgYBdXlxdf4FeX11egIFgYGBgf4FhYmBh
f4FiY2Fjf4FkZWNlf4FlaGVogX9wbG9rgIBveW53f4HV/tH+foH+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDviu+IgX6DfoF9gn55cHlyg359c4xyhHxycHFwgn9vbm9ugX9ucW6F
g351bZRuhn1tc4GSiHxzb4WPiHx0cZd8iXtvbZSKiHtsa4yLiXxtZo5ohn5mZmZmgX9maH13
hn5kZIF1hX5jZXSXhn1lZXSMiHxkY5Kbi3thYY2LintgXndwhn5eXYZ9iHxcXHCBhn5bW2da
hH9aWYxviX1ZZFqNiH1jZWFihn5aWWdchH9YWFmKhn5ZWWRjhH5YV2JbhH9ZbFdghH9hWFxd
hX5YWGB1hn9YV2pYhX9ZWFqChn5YWFxbhH9ZV1pZhH9ZWWyBiH5XV1x3hn5XWXJ8iH5XVmpc
hn5XWIBsiH5XV1uEhn5XVnd6h3xUVFZUgoBUVVVUgYBUVFRUgoBUVFRUg4BXVVRUgYFVVlVV
gYBWV1ZWgYFXV1dXgYFYWVdXgIBZW1lagIBbXFtcgYBcXFtcgIFdXlxcf4FeYF5ef4FfYF9g
gIBhYmBhgIFiZGFjf4FjZmNnf39va21qf4BvdW10f4HK/sz9foH+/v39gID+/v79gID+/v39
gID+/v38f4D+/f38f4D9/Pz7foD8/Pv7fYH8/Pr5fIH+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDvhu+GgX9/fH97gn55cXhvgX6NcXdwg31wcHBwgn9vbW9tgX9tb21x
g3+JcnRyhX2Ck212iHyOh3l0iXyQg3dwiXuBkmx6iXyQjnFyiXuKZ3lnhX1lZmZlgX9+cm1w
hn2Ii250iXxri3V9iXxrjXZ0iXyWo3pyjXqKiHWCjXqLaXh2i3t7dX9uinyHe2N0iXxmWl9Z
g395W3Bahn1ZlFl+iXyYiHV3kHmIZn1ti3tZj3J8i3uDi2t3jXqUaXxhintZnG5+i3yBjXd6
jnmOfnx6jnqWWXxni3p5i3l6jnqdk39ujnqGjn5fjHqKlWt9jnqNgX59j3mBdH5/jnp0g31c
jHuVk4B+kHmLln6JkHmWk3x+kHhXVFRUg39UVFNTgYBUVVNUgYBTVFNTgoBUVFRUgYBUVVRV
gYBWVlVWgYFXV1ZWgYBXV1ZXgIFYWVhYgYFaW1lZgYFbW1pbgIFcXFtbgIFcXlxdgIFeX15e
gIFgYV9gf4FhY2FigIBiZ2FngIBsaGxpgIBrcmtyf4HO/c/8fYH9/fz8f4D9/fz8f4D8/Pz8
foD8/Pv7fYH8+/v6fIH7+/r5fIH6+fj3fIH4+Pf2e4L+/v7+gID+/v7+gID+/v7+gID8/vn4
gID+/v7+gID+/v7+gIDvhOyDgH9+en56gn54b3dwgn5/cYtwhH1wb29ugn9vbW1tgX9scmyB
hH56a5VrhnxtfIOTh3x6dIGQiXt6dZWOi3pzfIyLiXt1cHmJiHx3aI1ohX5mZmZmgX9rb4Fy
hn5lZYh8hn5ja3mYiH1qbXOPiXxuaZehjXprYIyBiXtlaI6Si3peXHxyhn1cY3eBiHxcWWZc
hH5hXI1siXxZXFqNhn5bWXJyiHxbW4FqiH1bWWdyhn1YWWlthn5YW1hgg39cWWePiX1ZWXB/
iHxXWWpihX5aY2uQiH1eWV9khX9ZWY5/iXxZWGOTh31ZWWBmhn5YWV1/hX5YWYlhiH1XV3CF
iHxXWIlviH1XV1ZWgYBXVVVWgYBUVFVUgYBUVFVUgYBUVFRUgYFUU1RUgYBUVFNTgYBUVFRT
gYFVVFRVgYFWVlRVgYBWVlVWgYBXWFZXgIBZWVdYgIFaWllZgYBaW1pagIFcXFtcgIBdXlxe
gIBeX11egIFgYWBhf4FgaGBmgYBraGpof4Bqcmtwf4HS+8rseoP8/O3ue4P8/O7ueoP8++7u
eoP7++3teoP6+e3seoP59+vqeoP39urpeoP19OjoeoP+/v7+gID+/v7+gID+/v7+gID+/v7+
gID+/v7+gID+/v7+gIDvhe+Ef39+eX55gX52b3ZtgX6RcHFwg31vbm9vgX5tbG1tgX9rb21t
gn6OeG9shn2ClG1wh3yUjnJviHyUj3BwiXuWjm9yiXt6i3Bth32SaHBohH5mZmdmgYCBdWtt
hn2JjWptiHxvjmx1iXxvjW9tinyVpHJsjXqNiG10jHtojmppiXyVcHRpi3uFfV5viXxlWl5b
hH56WmlZhn5coltxiXyGenBhi3qIfm9hi3yOlWt1jnqIfG9ji3tYeXR0iX2LiXBvjXpremVy
i3udk3dwjnljmXJ4jXqBkGVZinuZk3l0jnmViHJ9jXqHfXN1jnqGiGloi3yWmHd3kHl+dIB3
jnqXfXxgjHpWVVZVgYBVVFRUgYBUU1NUgYBUVFJUgYFUVFRUgX9UU1NTgYFUVFNUgYBUVFRT
gYFUVFRUgX9UVFRUgYBUVVRVf4BWV1ZWgYBYWFZXgYBXWVdXgIFZWVhZgIFbW1tagIFcXFtc
gIFdXVxdgIBeYF5fgIFgZl5mgIBoZmlmf4BqcWpxfoHK7Nn6dYTs7Pr6doTs7Pn5dYTs6/n4
dYTq6vn4dYTp6Pj3dYXo5/f2dYXn5fX0dIXl5PLydIX+/v7+gID+/v7+gID+/v/khs5TQ0FM
QURPAAAEAAMAA4aD/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPGE8YR/f315fnmBf3VtdW6CfoNw
i3CEfW9wbm6Bf21ubG2Bf254bn+EfoBslWyGfHCDhpeJfIB8hIuJe4N+lo6LenqDlZeMeoF1
jXeJfIBojmiGfWZmZmeCgHF0g3KHfmlni4KHfGV1epeIfHJybpGKfHt0mqCOenRxkZiNemNw
cpKLe3Rjm4uNel5vfYGIfF9bZV6EfnBei2iJfFpoW5OHfV5ZeH2IfFtbcXaHfWNZfH6JfFlZ
dXeIfVhYWWGDf1ldcJeJfFpcd3+IfVlZc26GflthdJiJfFlZZW6GfmBcl4mLe1pZcHGGfltf
hpCLfFlaZ42HfV5ZjmuJfFhYbmqGflpXlXKJfFVWVVaBgFRUVVSBgFRUVFOBgFNTU1KBgFNU
UlOBgVNSUlKBgFJUUlOBgVJSU1OBgFRTU1OBgFNUU1KBgFVUVFSBgVZWVlaBgVZXVld/gVdX
V1eAgVdZV1h/gVlaWVmAgVtbWlt/gFxcW1x/gVxeXV5/gV5mXGWAgGhmZmd/gGpyanN+geD8
5v17gfz8/v5+gPz8/f1+gPz7/f18gfz8/f18gfz7/fx8gPv7/Px7gfv6/Px5gfr5/Pt3gf7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPGD8oN/f356fnmBfnVtdmuBfo9w
bW6Efm5tbW2BfmxrbGuBf2xxa2uCfot6amqFfX+QbGuGfJeQamqIe5WPamuIfJeZamqIfIGK
ammGfJVoaGiEfmZnZ2iAf4N6aGiFfomSaGiIfHmaZWeHfXuTZmaIfJeBZmaKfIyXY2WKe46R
ZGOLe5aIZGKKfIGJXmOIfWVcXluDf39bYFuEfl+mW2OIfZV8YmGLepV5YF6Ke4uMY2iLeo58
YWaLe1uDcmuJfI6NZWaLenSBXmWJfKeTbGiNemWgaW6LfICJX1qJfJqTbWiNepWoZnGNeo6X
Z26NeomIX2WJfJWfbWqNeoiScmqNepd2dVmLfFZUVlaBgVRUVFSCgVRTVFSBgFNTU1KAgVNT
VFSAgFRVVFSBgVNSUlKBgFNSUlOAgVNSUlKAgFNSUlKBgVRUU1SAgFRWVFWAgVZWVVZ/gVZW
VlaAgVdYV1iAgFhZV1h/gVlaWVl/gFtcWluAgVxdW1x/gVxmWmWAf2ZmZWV/gGlyaXJ+gen+
7P59gf7+/v6AgP3+/v6AgP7+/v6AgP39/v6AgP39/f2AgP39/v1/gPz8/f1+gPz8/Px8gP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPKE8oR+f355fXmAfnVtdW2CfoZv
iW6EfG1tbW2BfmtsbGuBfmx8bHuEfoRrlWuHfHKIiJiJe4OGiYmLeomDmIWMeXyFmKaMeoOD
d4SIfIZokGqGfWhoaGiBgHh1hnKHfXBqjoiIfGaBfJWJfHl7a5aLe4Z+nqaQeX6Ek5COeWp5
kJuNeoFtnYiOemF5g4aJfGFeZWCEfn5ji2OJfF10W6GJfFxbgX2IfFtbiWSGfltbW4aFf11x
dY+LfG5fnmWJfFtsXJqIfl9bfoOJfG1bgXiIfFtbeI6IfVtbgYCHfltkfo6IfW1blYCKfFpa
g3+Gfm9cmneLfFltg5qLe1xZinuIfG5bh4OKfGFmkZeMe1dUb1WEf1RUVFR/gVNSU1KBgVNT
U1KAgVNTUlOAgVJSUVKAgVJSUlKAgVFSU1KAgVJSUlGAgVJUUlOBgVRUVFOAgVRVVFSAgVVW
VFWAgVZXVlZ/gVdXV1d+gVhZV1l/gVlZWVl/gVtbWlt/gVxlW2WAgGVlZGV/gWlzaHR8gu/+
8v5+gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP79/v6AgP79/v6AgP38/v1/gP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPKE9IJ/gHx5fHmBfnVtdWyBfohv
b22DfmxsbW2BfmtrbGuBf2xya2uBf4Z5a2uEfn2Ma2yGfZCLa2yIfJB8a2uGfX+ObGuGfYVv
a2uEfpJqamqEfmhnaGiBf4F5Z2eEfoWOZ2aGfnqZZWWHfX+OZWSIfJWYZGSJfI6TY2GJfHSV
Y2GIfJSGYWCJfHiPYF6GfmNdXl2Cf35cXVyEflynXFuGfpWPXlyKfJtlXGuIfGKpdF6KfJOT
Xl6KeqtoXmqJfGGrcV6JfJZqXlyIfZV9YF6IfZWXXmKLfJJpYF2IfoGIXF6HfpKeYWCLe5V5
Y1+KfJiWYlyLe2+YW2OJfJCNX2KLe49zaF6JfJeXYWWMe2tUVlWDf1RUVFSAgFNSU1N/gVNS
UlKAgVJRUlKAgVFSUVKAgVFSUlJ/gVJRUVKAgVFSUVGAgVJSUlKAgFNTUlKAgVNTU1OAgVRU
VFSAgVRWVFV/gVZWVFZ/gVdXVld/gVlZWVh/gVlbWVl/gVllWWWAgGNlY2V+gWl1aXZ8g/b+
9/5+gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPSE9IN+gH15fnmAfnVtdW2Bfolv
iW6EfG1sbWyBfmxra2uAf2yAbHeEfoprlWuGfHmLiZiKe4aOi3qKepCHmJmNeYSNko+NeoaD
mpaLeo1qkWuGfGhoaWiBf353h3OHfHlqjo+JfGiOe5GJfHmDeoWLe4OBn4SNeoBjnKONeneB
cpiMeoh5nIOOeWaCiYiKe2JiZGCDf4pojWGJe15cYpmGfmlqiIGKfFtdnZKKfF1cjqOKelxd
aGCDf1tdnZSJfF1ckYmJfFtcel2Ef3Vfi3yJfHhcjJOLfG93kpmOelxpjoGJfW6BipuOenNz
qJSPeVttf5WJfHJZmIyLe2ZohISLfH5vmqKOeW1XkFeIfVZUVlSBgVRUVFWBgFNUVFN/gVNS
UlKBgVJSUlKAgVFSUVKAgVJSUVGAgVFRUVGAgVJRUVGAgVJSUlKAgFJSUlKBgVJTU1N/gVNU
UlKAgVRUU1R/gFRVVFZ/gVZWVVaAgVdYVlh/gVlZWFp/gVhkWWWAgGNlY2R+gWl5anp7g/n+
+v5+gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPSE9IN+gH55fXh/f3RsdWyAf4Vv
bW2Cfm1sbWyBfm1ra2uBfmtya2uBfoF6a2uDfniIa2qFfox/bG2FfYaFa2yGfoKQbGqGfYWD
a2uFfo1qa2qDfmloaWiAf352aWaEfn+GZ2iGfXqQZ2aGfouEZmWHfZV4ZWWHfYWNZWSIfH6I
Y2OHfY6CY2KIfXCJYWGFfmNfYGCCf3ZeXmCEf2OQYF+FfneHYGCHfZqRYGCJfHCOX1+HfWNc
cHeGfpuSXl6JfHqrXl2JfHRbcHeIfZGFXF2IfIhwXVyGfoKMXFyHfpKCXFyIfYmXXFyJfI6P
XFuJfXmEW1mGfouWWVmJfISHWVmIfZeNWFiKfIVXV1eFflZUVlaBgVRUVVWAgVRTVFR/gVNT
U1KAgVJSU1OBgVFSUlGAgVJSUlF/gFFRUVGAgVFRUVGBgVFRUVGAgVJSUlJ/gVJTUlKAgFJS
UlJ/gFJUUlOAgVNUU1SAgVRWVFaBgVZXVld/gVdZV1h/gVdkWWV/gGJlYWV+gWl+aoB7gvz+
/P5/gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPSD9YJ+gHx4fXh/fnRtdG6Bfo1v
h22EfG1rbWyAf2tra2uBfmuEa3SDfo9slmuHfH6RipiLeouTjnWLepWLmZmNeZOXko+NeYWJ
im+Je5RpkGqHfGloaWmBf4R3iHGIfH9wjpGJe2+XdZGKe3mOb5yMepWTno6Qd42HoqaQd4iJ
gZyOeWx1pWqJfGuMi4uLe2NnY2CEf5RriGCJfGCKaayJfGVjj4aJfHthl46LfGBjk6KLemBg
lYSJe11gXo6Ef19hjKWLe19fl4mKe3dek4OKfF57gZqLfF1ekoqJfFxdpX+JfGGLlZqOemZh
mJmNe31bl4uLelpcfImIfXl3lZiOeVl1mH+KfG+Cb4SMenhxko6OelZVVlSAgFRTVFSAgVJS
VFOAgVNTU1OAgVJSU1GAgVFRUlGBgFFRUVF/gVFRUVCAgFFRT1CBgFFRUVKBgVFRUVGAgFFS
UVGAgFFSUlJ/gVJSUlN/gVRVVFR/gVZXVVd/gVdYV1h/gVdjV2N/gGBjYWN/gWqDaoZ7gv7+
/v5/gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPWD9IN+gHx5fXh/fnRsdWt/foFt
b22CfmxsbGuAfmtra2uBf2pza2yCfn16b2yEfXWEa2+Efop/b26GfYGBcGyFfnp8bW6EfYl+
bWuGfYVpbWqDfmloaGiBf3x0aWmDfnqBZ2eEfnyLZmiGfYB9aGiHfYt3aGaGfX2NZmWGfXd8
ZmWGfox8Z2WGfWiEYmOFfmFgYWGBf3lfYWCEfmaNYGCEfoZmYF+EfodxXl6GfoCIXl6IfYRm
XmCEfmyFaGCGfmuGXl2GfoeIcWmLe4Z2XFyGfnmGXFyGfoF5W1uGfn9gWluEf2aMWluFfoCH
XFuIfYyGW1uJfINrW1qGfnyCWVmIfot/WFmIfIaGWFiJfIB3V1eIfVZWVlWBgFRUVlWBgVNS
VFSBgFNSVFSAgFFRUlJ/gVFRUVGAgVJRUVGAgVBQUVGAgVBRT1B/gVFRUVF/gFFRUE+BgVFR
UVGBgVFSUVCAgVFSUlF/gVRUUlR/gVRWVVV/gVZXVld/gVZiVmN/gWBkX2N+gWqKaY16g/7+
/v5/gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPWD9YJ+gH14fHh/fnRtdG2Af41t
iGyEfGxrbGuAf2tqa2qBf2qIam+DfpNqkG6GfIOUiZeMeo2UjnKKepqQkoSMen6Xd5KKepJw
louLepVpkWiGfGhoZ2aBf4l1hnCIfId5i46LenidcJKLen2UiH+Neo6ToHaOeZF+oYWNeY6b
lZuQeJJ8jXiMenCWhY2Le2JqYmGDf5tpgl+IfF9eXl6BgF9jX2SCf3RsppyNem2GapCJe11h
XGKDgHJonJiNemlwiqSNenBzdH2Je3CAj4WMe3BtfZWLemZjkXWKfFpsWpOGfoRoiZmOem1r
e4aKfGFljqKMe2JjhJeLfFxrhpCKfZBnm5WPeWCPi5+OeoxmeXyMemGCgpWMe3lblJaNeoRo
lZSOeoVYl1yLe1JRUlKBgFJRUVF/gVFRUU9/gFBPUFCAgE9QT0+BgVBRUE+AgFBQUE+AgFBR
UFF/gVBRUVB/gVFSUVF/gVJSUVJ/gVRVU1R/gVVXVFV/gVVjVGF/gGBjYGN+gWmQaJJ6g/7+
/v5/gP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPaB9YF+gHx3fHeAf3NsdGuAf35t
dm2DfWtra2uBf2tqamqBfmpyam+BfnZ4dGuDfXB9bXaEfYR8eXKGfHp+eHeGfH1/cXiGfH50
c2+Efn9od2iDfmhoaGiAf3Vybm+EfnR5ZmaDfneDZnOFfX9+ZmeGfoJ0d3KHfHOBZnOHfXR4
bGyGfYJ1eGWGfWR8YnCEfmFgYWGCgHVfcGCDfmN8XmOEfnl8XWGHfaF1ZWCJfHR6YFyFfnN6
X2CGfnZ0XV6Ffn2kYWiKfGtzXFyFfn9rW1uFfnl/XGCHfnljW1uEf3N7YFqHfndzWlmFfm9p
XlyFf314WlyGfnlwXGCIfVthW1mDgIF1W1mHfnB/WVmGfnt6WlmIfl16WFiGfnp8V1aHfoJ0
VlaIfX5UVlKFflJSUlKAgFFSUlKBgFFRUVGBgVBPUVCAgE9QT1CBgFBQUE+AgE9RT1CAgVBQ
UFCAgE9RT0+AgFFRUFF/gVJTUlN/gFRUUlR/gVVWVFZ/gVRhVGF/gF5jX2J+gWiXaJp6g/7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPWB9YF+gHp2end/f3Ntc22Bf4hs
iGyEfGtra2qAfmpqammAfmqJaWuDfpNrjXWHe4iVh5WMeYmTknWLepyDjo6NeZOajJmOeZ5x
l4uLeZBnkmeGfGdoaGiAf4hvinGJfI2Bi5eLen6fkKGOeX6IkISMeqKZnZeQd4GenJ2Qd6aC
nZSQd5B8jX2MenWSf5KLemBrX2CDf5Nlgl2IfF6JXpGHfHV0jJiNeXmJqn+OeXVddV2GfXJ3
dXyKfH11pXyNenSXdJGOeVxkXnSEf4J4rpqReG2en56QeXBok3uLepBwi5WOeWhrd5KLfIuQ
k4+QeG2ToJCQeYGCiYuOeV6Fhn6LfJRwmZeQeXCOcoWNeo2VlaSReJKPmJiSeHxWglaGfIpf
hliIfHlohI6Lel9gjYmLe4heiXmLe4tijauOel5cmoaLenpddF6IfU9PT05/gU9PUE+AgU9P
T0+AgE9PT1B/gVBQUFCAgVFRUVGAgVJUUlJ/gVRVU1SAgVNhU2J/f15iXmF+gWieZqF5g/7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPaA9n9+gHp3enV/f3Nrc2t/fnds
e2uCfWtqamqAfmpqamqAfmpwaXSCfnBweWqDfW10cHyEfXdzgHmGfHJ3fX+HfHB0fYOGfHVv
fnSGfXNofmeDfmdnZmaAf25sdG+Efm1va2aEfmxyZneFfnBrdHSGfXNufnuIfGtxdH+HfG1q
eXmIfHBqfmqHfWFvYXmEfl9fXmOBf2ZeemGEfl5uXnOEfmpoXl2Efm9kXl6Ef2tzXlyFf2tn
XFuEf2tmW2ODf2RqY1uEfm1yY2OHfm9vY1mFfmdvWVmEf2plZV+Gfm9sa1iGfmNZW3CEfmpr
WV+Ef2lxb3CIfWpyZFmGfmJeaGCEf3RqWWOFfm95ZW2IfXBnZlyGfnJwVlaFf2BVVVSBgG1f
VFODf291UlGEf2tvUVGFf2tuUVGEf3R5UVGGfnhvUVGFfm9XT1GDf09PT0+AgE9PT0+AgU9Q
T0+AgU9QT09/gFFRUFGAgFFRUVGAgFJSUlJ/gFRTUlN/gVJgU2B/gF5hXWB+gWikZqd5g/7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPZ/9X99gXp1enV/f3Jucm6Bf4ds
j22EfGtqamuBf2ppamqAfmqGaXCEfZVqjHuIe4uYhJWMeYWNmHyLeZqBj5iNeXuOf4aJe398
mXqJeo5llGWHfGZmZmaBf4lti3OJfI2EiZKMeXqVd5uMepOljpeQd52DmoeQeJ+fmJuRd4Sb
iJKQeIx3lYGNenmOc5eLelxoXF6Df49if1yIfGWecqKMenx6kIqOeV5/XY6IfX+MkKKPeIZ8
l3GOeVtyWnqFf3KHfqKOeXVwf3OLepN7ko+PeXKBg6KOeXdofG2KfItwknKLeoGXfZiPeYF5
kIGOeo6VkHiQeWJ5kHKLepOTkJCReHuPl4iNeWuKb3yNepF/kn6PeVZVVVSAgVRUVFN/gVRT
UlJ/gFJSUVF/gVJRUVF/gVFRUFCAgVFRT0+AgU9PT0+AgE9PT0+AgE9PT09/gFBPT01/gU9P
Tk+AgU5PT0+AgU9PT09/gVBQUFCAgFJRUVF/gFJUUlN/gVJfUV5/gFxgW15+gWarZa55g/7+
/v6AgP7+7Nt/gf724+h/ge3v8vF+gfn+6ed+gf7+5fB/gf7+/v6AgP7+/v6AgP7+/v6AgP3+
2PaAf/7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPR/9H99gXp1enZ/fnJqcmqAf25r
gWuCfmpqamqAfmlpaWiAfmlqanqDfmpqfmmDfWtrdIKFfWpqhIGGfGpqg4WHfGlqg4WGfGln
hXKGfGZlg2aEfmVlZWWBf2Zkem2EfmRkcGSDfmNjZH+EfmRiY2yEf2FkhoGIfGJhaIaGfWJh
fXyIfWBghXGHfWBeYYKFfl5eXWmCf1xdhGGEflxeY4OGfl5jYl2EfnZhW2iGflxcb1uEflxj
eXGIfXRhW3WGfltbbH+HfFxac2aFfltbV1eDf1lbVleDf1tZVlaBf1tXVVWBf1dcVVaCf1tc
VlaDf11fVlaDf1lXVlaBf11dVlWDf1tjVVaDf1xbVFWBf2BXVFSDgFRUU1R/gFNTUlJ/gVJS
UlJ/gVJSUVF/gVFPUVF/gVFQUE9/gVBPT1B/gU9PTk+AgU9NTk5/gU5OTk9/gE5PT0+AgE9P
T06Bf05PT0+AgU9QTk9/gE9RT09/gFBSUVF/gVFSUVJ/gVJeUVx/f1tdW1x+gGSuYYF6g/7U
pcV9gtv+/v5/gf7+/v6AgP7+/v6AgP7+/v6AgP7v/v5/gNns/uh+gv7+zvV+gf7+/v6AgPXJ
/v5/gNn73ryAf/7+2vqBf/7+/v6AgP7+/v6AgP7+/v6AgPZ/9n9+gHp1enV/fnJucm6Bfolq
kmuFfGtqamqBfmhoaWiBfmqBaHSEfZRpiH6IeoyYg5KMeYaEmH+Lepp8i4qNeYGViJOMeZB5
ioGKeo1lkGaHfGVlZGWBf4puiG+JfIaUg4uNeYuehJeOeImJi4SOeZ2VlY6Qd5Kai5GQeKSm
jIuRd5qBkYKPeXyNaY+KelxiXF2Cf41edVyIfXeaapCMepKNh42QeJ2Nh4+Qd4uJiYePeZCJ
i46QeJWSmJCQd2+CbnuLe5FbjliKfFZWV1aBgFZVVlV/gFRUVFWAgFRUVFSAgFVVVFSAgFRV
VFSAgVRUVFR/gVRUVFSBgFRUVFR/gFRUVFR/gFRUVFN/gFRTUlN/gVNSUlJ/gVJSUlJ/gVJS
UVF/gVFRUVF/gVFQUFF/gVFPT09/gVBPT09/gU9PT05+gE9OTk5/gE5PTU5/gU1OTk5/gU5O
TU2AgU1OTU1/gU1NTU9/gE9PT09+gFBRT09/gFFRUVGAgFFcUVt/f1lbWFt9gV9oXWV8gXfu
cex5g/7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPvJ/vx+gen+yex8gv7+
/v6AgP78/v6AgNi2/v5/gMns5sKAgP7+stGAgP7+8f6AgPZ+9n5+gHl1eXV/f3FqcG2Afmpr
h2uDfWpqaWqBfmhoaGiBfmhoaIGDfmhog2iDfWhoeomFfGhpiYuGfGloioeHfGhni42HfGdn
jnGGfWVliGWDfmRkZGOBf2Rjg2qEfmNjeGaEfmNjaoiGfWJig4qHfGNhjoOIfGFghnqHfGFh
cImGfWBefnWGfF5dYomEflxdW22Bf1xbjF6FfltbXGCCf1tbXl2Df1lbXlqDf1pZW3SEf1lZ
XFyDf1lZc3eGfllYXVeDf1dXWVqCf1dXWmyDflZWbViDflZUdV6EflRUV1aCf1VWaISEflZV
WW6Cf1VVaIOGflRUX1yCf1VUfmqFflRUV36Df1RUcXSEflRTfmSEflJSUlF+gVJRUlJ/gVJR
UVF/gVBRUVF/gVBQT09+gU9QT09/gU9PT05/gU5OTk5/gE5OTU5/gU9PTk5/gE5OTU5/gE5N
TU1/gU1NTUx/gU1OTU1/gE5PTk9/gU9PT1B/gE9QUVF+gFBZUFl/gFdZV1h/gFxjWmB9gW7e
Zrp5g/7+7vd/gf7+/P6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPu8/vB+gf7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPnZ/v5/gLuz/vZ/gcJ/zX59gXl1eXV/f3JwcW+BfoZq
h2mFfGhoaGiBf2hoaGiBfmh9aHSEfJNpgHyHfI6Yfo2MeYl8kH6LepiAhIqMeoqbfoSMeYt6
hnmKe41lh2WGfGRkY2SBf4tvgmyJfIGRfISMenSLd4yLepOYgXyOeZiYgX6OeaeXhImQd5eI
hoGOeZBwiXmMenyLZIWKelpdW1yCf4VbdFuGfWqTaISLe42QgY2QeZJbhmiJfFuLZoKJfJB+
e3SNeouPg3ONemBZcGiGfaaoiY6Sd5eVg4OQeZGTfoWQd3t/dXWNepKIel6Meo2VaIKOeZCJ
fH+PeZWEhoCQeW+DfVuLepWWf36QeIuBgomOeWaEc4GMepV6gmaNeVJSUlJ/gVFRUVF/gVFR
UFF/gVBQUFCAgU9QUE9/gU9PUFB/gE9PT09/gU5NTk9/gU9NTk5/gE5OTU1/gE1NTU1/gE1M
TU2AgE1NTEx/gU1NTU1/gE5NTU1/gE5PTk9/gFBRUFF/gVFYT1eAgFdXVlZ+gFpcWHB9gWBo
k5x6gm1roKB8g3B/oZ58g5WrmJN8g7fAhnB/gcXJdoB+gcfGkpp8gsXGmpN8gcnChXl+gf7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPR+9n5+gHh0eXR/f3BpcG2Afmpq
imqDfWhoaGiAfmhnaGiBfmdoaIiEfWdpiWiDfGhogpCGfGhpkZSIe2lokI2He2hmk4OHe2Vl
kIOGfGVkkWSEfWRjZGOBf2JjjW2EfWNjfm+DfmJhcI6GfGJhinmGfF5gk26GfGBeeJeHfF5g
hJKIfF1emXiIfF1bZZOGfVtbWm+Cf1pbk1yGfVtbXm6DfnFhZmeGflplbVmEfmBZXmuDflhZ
fGyGflhYa2iEfl1lZGqGflpYXnGEflZXj2aIfVdVdZWIfFZXkXSIfFVUaYqGfVZVe16GflVW
Z3eFflRUi1WGflRSUlGBgFNTUlGBgFNUUlKBgFJTUlKAgFNTUlJ/gFFRUVGAgVFRUVF/gVFQ
UVF/gVBQUE9/gE9PT1B/gFBPUE9/gVBPT05/gU9OTk1/gU5OTk5/gE1OTk5/gE5NT01/gExN
TU1/gUxMTE1/gU1NTU1/gE1NTU1/gE5PTU9/f09RT1B/gE9XT1Z/gFRWVFZ/gFlzWG9+gY2O
hIl+gZCSioh+gZSVgXd+gZCJZ11+gYKAW2R8gpOfhY58gZyajo58gZqbkJJ8gpmXinp8gv7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPd+9n99gHl0eXR/f3BwcG2BfoNq
gWqEfGhoaWiBfmdnZmeBfmh4Z3SEfpJpeH2GfJKceYeMeot1i3yLepqbfHyLeoaQgX+LeoVt
eWqGfI1kfmSFfGNjY2OBfo1vemqIfIGLd36Lem6KdIGLen97e36Len6XhX2NeneIcXCJe4Z8
fnuMepdwfHCMenaMX3mJe1lcW1uBf3pbcFqFfWiJZnqJe42LgYiPeYhaenKJe3h0dHiKe3mF
bW2Ke4+DeHeOeoqGcnmNeYWLV2CIfJWVdm2OeXaBbWaLepN+dnCNen+SWXSLepKYcG+OeYaI
eGuOepZXdVGJfFJRUlF/gFFRUFCAgVFRUVCAgVFRUVB/gFFRUVB/gFFRUFF/gVFRUVB/gVBQ
UFF/gVBQUE9/gVBPT1B/gVBPT0+AgE9PT05/gU5NTk5+gU5NTU1/gU1OTk9/gE1NTUx/gU1M
TEx/gUxNTEx/gExMTUx/gUxNTU1/gU1OTU5/gE5QT05/gFFWT1Z/f1VVVFZ+gVllWGh+gW5v
b2x/f2pjZmB/gGNfYmF+gVdUW1d/gVReV2B+gXWKbX9+gI2OfnJ9gYd0ZmN+gWVcYVt+gf7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPZ/9n98gXl0eXR+f3BpcXB/fmpp
iGqCfWloaWmAfmhoaGeAfmdoaI6EfGZojmiEfWhpiZWHfGlpkpaIe2ponZeIe2lnfo2GfGhn
m4CGfGZkkWODfWNjY2OBf2VlkWqEfWNigneEfWNjdo6GfGhml3SIfGJmjZeIfGNjj42IemNg
kHGGfGFdmniIfF5jZ46GfVtcWW2Cf2VZkFuGfFlaY3mDfmhbb3KGfVlXeHSGfVdYa2+Efl5c
fmiGfl5Wg1eEflZWY3SDflZYamODf1tchIKIfFZWYGuEflxXjoaJfFZfb4GHfVdVc3KGfltV
j4GIfFRWapCIfVFRVE9/gVFQT09/gFFQUE9/gFBPT09/gU9QT09/gVBRUE9/gU9RT1B/gU9P
UE9/gVBPT09/gU9PT09/gVBPTk9/gU9PT05+gU9NTk1/gU1NTU1/gUxNTU1/gU1NTEx/gU1M
TUx/gUxMTE1+gE1NTUx/gU1NTU1/gUxOTU5/gE5OTk1/gE9WTVZ+gFRXVFd+gVt/YN18gXpz
/Ot+gHJt2c5+gW9tyc18gmZh1OV8g2Vw8sh7gnR4iXx+gG9mb2p+gGZka2h9gWFbY199gv7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPZ/9398gXl1enV+f3JxcW2AfoFq
fGqDfGpoaWiAfmdnZ2eAfmh0aHWDfo5sdHqGfJCddH2LeolxhHmJe5OGd3+JeoKGdHyJen9+
emyIfIxjdWSFfGNjY2OBfo1tcmaIfIGIbXSKem2IbXWJe3mAdGqIe4eRdXCLepF6bWiKepGJ
b2OKe5dzbmeJe3CJXmuIfFhcWVqBf3dZZVmEfmiEYGuIfIqJg3mOeYaDamqMen6VZWiKe3po
ZF+IfYFWZmyHfHpwameKfJZwZV6Ke39/ZWWJfGeIWFSGfpCMZWONeo6CYGCLe210WlOHfZCL
ZmGMe42UYGqNemhPVU+Df1BPT09/gE9PT09/gE9PT09/gU9PT09/gU9PTk9/gU9PUE9/gE9P
T09/gE9OT09/gU5NTk5/gU5OTk9/gU9PTk5/gU1NTk9/gU1MTU1/gU1NTU1/gU1MTU1+gU1M
TU1/gUxNTEx+gU1MTU1/gExNTU1/gUxNTU1/gE1NTU1/gU1UTVR/gFVZVFd+gWLVY9R7gf7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+996BgOGnxa6AgYN3pLt8gnZy2fF7g3d7+/t6g/7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPd/9399gXp1enV/f3FpcW1/fmpq
fGqBfmloaWiAfmhnZ2d/fmdoaHWBfmZodHqDfWhodH2EfWhmhHmEfWZmd3+EfWZmdHyDfWVl
emyDfmNjdWSBfmJiY2OAf2FhcmaDfmFgbXSEfmBfbXWEfl9edGqEfl1ddXCEflxcbWiDflxb
b2ODf1pabmeEflpZXmuCflhYWVqAf1hXZVmBf1dXYGuDflZXg3mHfFdXamqEflZWZWiEf1ZV
ZF+Cf1RUZmyEflVUameFflNUZV6Ef1NTZWWDflNUWFSBf1JSZWOEf1RUYGCDflJSWlOBf1FR
ZmGDf1FRYGqEf1BPVU9/gE9PT09/gU9PT09/gU5OT09/gU9OT09/gU9PTk9/gE9PUE9/gVBP
T09/gE9PT0+AgE5OTk5/gU5OTk9/gU1NTk5/gU5OTk9/gU5OTU1/gU1OTU1/gU1NTU1+gE1N
TU1/gUxNTEx+gU5NTU1+gU5NTU1/gU1NTU1/gU5MTU1/gUxUTVR/gFNXVFd+gWPWY9R7gfv+
/v5/gP7+/v6AgP7+/v6AgP7+/v6AgO3s996AgPL8xa5/gf7+pLt+gf7+2fF+gf78+/t+gRIG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGspYTcMDDAaKyUJDSAtKx4LBy0g
Kh0KBSYTKBwQDB0oJB8KBSQuHx0FBDAkHyULBC4iLSgFCiQkJhsHCiMfKiQMCSwfHx0ECSUr
HhkNBB4aHhYFBRgpJRgIECMtGB8EBSAWIyULCiogHSQEBCQiMSQNDCcmKx8JBCEdHhgMCyMe
Ji0QBCIjHB0ECiUdIBoPBSAhFSQOBRcgHCIHBCEYOxAECREpIioRCyUrISQKCiUcGBwKBCsp
JSIRBBwgIiEKCSQkJx0OBCYcFSUEBCgiISYGByUaKCMGBBYtGCELBR4mHRUOCiIjIxQOCCcm
JR8ICiMfHRwMCiIbJR4SBCEVJxwECRUiHSAJCRciLB4NCigPHyQLBRQiKycKBC4uHS0NBDAb
JSEVDycjIiEJBCoXJy0ECyEoEiYECyEkJSAOBSouHBkLBSQmKB0QByAoMR8KBCQgJh4KBCMY
GSwFDSArJyYHBCoiMSsQDyQVKCwFBS4lJygMBSExIyMFBCgpKSUKBSI4IycNCzokIigFCDJz
OXUOCw4GBgYGBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBH08aSoFCCwoJiMNBScuKkAVCik1
STAWESchKSgUCSghKigNBCc1LDoQDy8yRTERDjAqL0gODCUwVEgQCS0wQzQMCS4tNToLBzcr
MjkKESUtOy0NDzAoMycNCCkoKTcQBS4wOTIRBC02KykPBCkpJjYNBC8rNDUKByQdNioPBCgj
KyQMDiIfNSURBScgNS4KBCosJysWBB8ZKikOChciKisODCIkOS4JBRgVJy0VBSQvLC8KBS4n
KyoMBychKicPCiAZMCMHByUoMSMMCCsiLy0SDRweLSgFCx8cMykKDiUhLyINBxsjKjMJBSoZ
KCcIBRshOSUPBR8cNycUBSgZMDQQDB8lMikRChgULCQJBCssKC0PBxoaOCwRBCImOTMJBSwh
JDoIBSslLTEJCSkhQigECR0mLzUHBCgoNDQMCSciQCUMDCsfKzUEChopNjkVCikfMTAHCSEc
MCYLBCIzJyEEBSQeLCYEByUoJSoQCisiIiAICUNRUFIRCl5OSFcSBTk6TD0TCBkfLCgLCjGF
P3UUDA4GBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHQvaC4XCRknHx8OCiw9JjYQCD4e
UxoVDiAUHyMMEhUrHxEFChxdHzoWElwkam4WGlBUXm0eFmhbXmgPEmdaXXQIC2ZbWXYPEmJa
W2gZEmYtRjoZFBsZGxsRBkNJQUYYFUdPXmIeGzxsa1MXElJ1TW0VE2lYeFwhFTN4Z2cbFFtW
bmEZEWFZSGAhFE9RcUIcF1EuWiMgFXRya2EeFSpDJnYfFGEra2YkGjYlem0WDjwpVHseESsn
dVYZECsoSygcDyY7XGshFldCe3skGVc3Y2kmGU9Eg2kgFD1LcnMgGk87WHQXEzQ5YIcYFFsx
Y1YiDkJPfXobFUo8kGEaEjMvIR4OCzAwLhwLBT8uHiARCjgvGRUJBTUqLB0RCjowJBsKBS8p
LBsWBTBDHSAMCjk5GykNBEI2JxkKBT02Hy0KBDgxJSkMD0M2HB4KDkI6GyIEBzs1IyERCjs6
IQwSBTMyJigJCDA5KyIEBDA5LyAHCCswJSUPBDQzKCcMBC82KDYJBFE4KzsTCR0pIScRCERx
N1kUDAwGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGE0aysMCCElKisIBjsvKzsYBU0b
WB8TCB8YJh0QBhoWKBoNDhhRIU4dCk1oZg4YFEd0Ql4eFHh5XUsbC3NuV0wVDFR3M0oQGGJP
Rz4UD3YuQxsbEBgWIg0GBmZhKywdEm5oGR0VEH1+ISAgFmpuKC8gFHtqIBkcFF10IyIQDG98
LiwgEG9pJRkaF35fIi8cD3wiGh8iGXh5KB4WDSB5IzQdFGqBK0UYDmqWNToZDX57UUUbHX9m
UU8aG1U8WmYYGYZsV1YSDoJ1VEcPD1luRR4hDo+KUXcgEYdbTlkkGW98ZmccG4hrVDsgFIR6
cXYWEGxzYk0nGG9/V2EbExkiHRoODRopHSgLCRQWIR4QDBMTGRkKCyAaHScJCiAcGiIFBCAd
HC8FBRUbGh4FBSEeHSUFCR8SGR8ECx8YKCASCikdKxUQCR4dJSIIBBwcGBgHBCogGyMQBB0t
IxgEBR0cFB0EBiwiFh0QCyMhFSALBB0oGB8NBBYTESwNCx0tGDcSCiw0OTYQDiUnISoJDEaB
Q3UQBAsGBgYIBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHk9ZjcRCSojIisPBiQ2KzwRD0Qh
YCkXCxgZIh0MCyAjLywKCh5mHDEgD3AjZW4eGGBvZG4aG3h8cnYWFYFrelYdE1VvTGEbEXJq
cVoVFn0xVTQaFCIfFRAODWlyQUojFlxjal0aGVaMgWAhH2iZaIUaFH5vd2spFpB9f4skGWdB
hoYlFGNooWokGmJidU0rHXcjXiUiGYCJdIQdGxJQIIgkFH0re4srHCghhX4lESgdlnknHCks
O5YhGCsmnYseHR8kiaAbGCEfj3AdESEaoG4eGFsmikUkHh5bKJElGWxPcnwlFhwRjX8dECMT
e18hGiVdeIEiGCMSfnQcFWMlgyMgFiRoNYskGyEceHoeGhcbk34gEDRefnwiHBNdU5UiDVY4
iH0kG1wdZZomIFFFjnEhFCchmHMYESdVb3ogFDQpVxogDyEfHx4TBCIkHh8HBCEmGiMHBCUZ
JR8GBBYcEgsMBCgdGjkNDCQlIh4QDCgVGycLFCAjJCMQBCosJTERC0Y4MzkRCCckGiIUBktb
Xl8YCwoGBgYIBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGI2bj4PCCQgJiIGBh8nKDMSFEgr
dCIaFiUmGygNDxEQHSEFBBZdIU0cDld3XBwVD0RoN2sYFISDX2McFH5ubFAWGnZ0WWEaDnuG
YEkhEn45YSocESYoISEOBWF+OTkVFWp/IhUUEoZ+JiciF4SDIiIcE42GOSEkFYR6NRIVD5aF
Ji4kEXKHJhweGH9uIC0eEoUgGiAlGXt+GhsaFCGHJhkgEZiUKTggFXisNi4cG4V6I18lI0mI
bSssHJeZNS0fG4V4hlkrHnWXQVkhHI1zSUsgFo96SVshGyWCd1QYFpVpalkoHYl7aVMpHZuE
c1sfFoJ7VVUeF4yfZG4cGnQ6ZF8jGDp0Y2AmHWeLc0clHHGEgRssIX+KQ4sfDJByil4eHY97
b2onF5e+fSslHXt+Y4sfEJeFZk4WEFyRYoQeD38aHRYlGRwXGyEFBBwgFhwHBCIiFyMKBBYZ
HykQByckIikIBSQbHx8RBSwlICEOBBkcIyQKCxomKCQIBSA2FSgLBT4zNzMOEhgkJSsJBmg+
aRwSDgYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGhFbEARCCUqMigGBihALjsVB00Y
bx8aCxoXIAgQBikgHhgJCRl0JFUgEJEmdnceGVmGcoQZFnpzgJMUDXuAeGoXEHaITmsfE4Nx
d2YYEIJGb08kFx4oGRUNBl6HQ08lF2FnclchGWV6nX8jHGtrc5kgGn1xjoYhFnd7nIcgHoiO
kaEkGKqSiIAgGXZlhEkdGnccYSEiIZOSeIYhFSV5I3EfFII0fp0rGysvmnsgG4mPjGMiIHoe
hhoiDT6AhIEpIzImiaUiGCcYfCMjHSEdhpMnGixgioclHWh8a3gxGTodPDwTFmYZlYIqJywb
joojGEhkd2UlIC1mfpcqHnkkmF8hF2hJsmgpHCtOk6MiFXIsmXEiHjh/oogjG4JIgV0gGSJy
MHcnIFl9VZseEyAXllwdFik3fY0gGyVeg40lFyYcjIYkFR1CamolG0ATVBwmHR8dERoMDBMt
ICEQCCEfIQ8OBBwhDiMNBBgtFhMHCiglJhQPBSMYGCMFBSkoHigQED0yPSoMCRYgIRMMC24c
cRwbDQYGBgYIBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGY4dDwRCCIlLikGCyM3HzMTB0EX
gx0fEx4VISEPDRseFB0QCCdiJl0ZGFxsiiUWDkJ3RoMdE4WLh2UWFXZxhHceDoVxUGUeE3J0
bXoTEZAxbyghGSIUFxUGBmyKUF4eE3CLKCAcD5p9KzobGoSdNRwaE590RyIgF4+TMjIdEZSp
LzMcFZiFNCIhEJd/HjIgG38tGx4jGYKOMiAXFSuEJxkcEJ6uIyAZGJ+KMyQfGp+mKx4bGZlA
V2YpG4adciQgHYWVIyYoH5A8RWovHXacajghH5mgVjgoGoV7WlImHSAhg4oiGKmWaE8iHKx9
d20eH3yQRm4eIZZ4IVEqGLujfm8lEIKXZn8ZGNFvVUojGrSgk4cZFnt4gHEjIZR7oS0lHyJ2
I2MjHVxoaYEmHYSNgGsZEYh9Z24iGJFyiWQlFWiJdmwiGXtRZokmHkgqYxcmHiIcFhoICxkh
ISkJBSkfIRwLBR0iIyAHBCcaJRYEBB4XHBoFBCEfISYODiwiLEIICzQwPSgNEB0hJB8MC3wc
j3YaChAMdXEGBUtjeV8SBGtgQUsEBGx6U0UJBXF+PiMSCmBxLyUKCXl3OSQTCXxrMikMBRIG
BgYEBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBG5ZbEwPCRojKyIGBR0zMzURBEwZ
iCoTCxwcKh8OCxwZLRYOBxt5GlYfFYwveX8eE2CLdoUaFIJ/hKMQEYtwhJMcFYtwgXojGpRw
e3ogFXBIa1YdFicaICcVD0KKUVcaGISDhG0eGHt2oXUnIoCJbJAlG41+iJkdHIqhlZojEYmk
cqEaD5eHjW8nGm+MgFkrGHUvVy4iGqaThZsdESiUH3wiGYVNaKEoI0JEonokH3sohiYnGCw+
Y6EkFkg3r6okIEKDlm4fFVE9kqMmFykxlJgkG5xXnoImH06kp6MpHqJzin0nJjMooGMlGzee
naMXHFg7eqwgGqOGkownGIOJrYsoFlYjfy8nIJhZZGMgGYwhpZQhFQ4clYkiEnA6f5UrHFwk
gY0kIC0jmHgmFHBhXU0oGyEPICkLDCEjHyUPBCISJCARBRoeIQgFCxcdIx8ECyciKhYODhkf
IBEMCi8XGycWBB4cFRoKBDETHSQLBBYiGx0LBBgYGRUOCh8lISMIB0MkNC8PDycfDiQVBjdD
TFgYCiotRywOBTIwOzcTBzk1QkkKBCsxP0EQBD01T1YVCTwpS2cPDyowW2QSBDYqa20PBBAG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHVOdE0OCB4RIyEJDCAqJzkSCkYj
jB4eDyUoHCQPCyEkKSIFBBpLHGEhFExdiRsbGC53RH4gGnqFgW8bFXmEjYgUEZCEaHsYDm5z
cmQVD448eS8gGR0PGR8QBWGHXXQeGHWHHScYEZ6DJl8bHH2gSSsbGIt1WEYnGnp+UU8ZGZOn
VksYF6KpT0YhF5aNHjoqG34gMRogGY+JOzMZEROTIi0gE5KtKB8iGaCeHyIjHrV0K3sgH2et
jYcpJ5mALCQwHJuPIx0gHrqvKiIhGYeKHyMVEaKzLy4iEZ61LTYgIbWfPTYkGMatQxskG3eo
KDwfHcCMQSckFLWLUjwiGLqWSUwiHoYqJSgkHINUUkMfGZGiT2YhG6CFW1wdG5OgZlQjHYRV
WVwgH3l+W1spE6RdiDAnICcYFy8NCykpHx0JCiEUFBMKCSUmJCAPBCEfDCsXCxogHSELBR0T
IR4RBBseJiMLCSQcJxoLCBseIB4NCiUbJx4KBBwkKSUMChs+HkYGDzYtRicLByAwHhQGBbyo
exIaDFtpDgYQCm5mDAYNBGNfDAYKBGdMCwYKBE8QBgYEBA4OBgYEBA4GBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBIJIdU4ECCAsLiIIBikzHjEVC1sc
oCYTERsgEB4YBhIeHR4KBByAH20WGY83iponGWeMdYQfEYqFjp0VDp2Ep58WFX6GeXUfGouA
oosjFGBRgUodFSoYGhYTC2d2V2UcGoZ4jH8kIp+RsXgpIo2keZIhF42LnKAeGIeZl5wiHp26
i74eGKiIn38pF32glFYpHHcnaishGc+dtJkfHSaoFYAdFIpjd6suI2VMtYUoII2mmoojH6gu
hyosGnmqmoIoI2RRm64hGEwfkhkrHT5EnqkuH01CzrcoGlt5joUiHkk0uZcsIDavspclH5E8
maooHpmQtY4nGamJuYInGlsrddgtJJuHl6whGz2dq7MoJoOAi6cnI7iCmpsnGBx6JVYkF6ma
UaMwJRkWoHgWGCJernwlIXJjhaouJFUtkY8mHihsmmclFnIdZSskEiAfGgsIDCglGxwECiYo
IRsRBSsbHSsOBxkkHR4LCSwcJR4KCSAmHiIKBCUlIxMICiY1IzwJBDowLx8PCyQrJygMCHYS
dxINCQgGBgYGBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHBEgj8JCSAeIhwPBRwkIzANDjIW
jzIdESAPDhgJCSUYIh0NBRUyH2geEjxCjjEdGTJuTpwfEnRpoHYSFHl3m54WEXuHh5AjEYZs
hHwXFHkqlUcfFCMgFiUIBmyCXIQiGV6PMzkeE5+HI3khFZCrdighEpl4eHYkHqOahCAfFI2g
KywgEJ17hCYdFpWWL2QiE4whXhogHK6QXFAZEB6cK0gjEZK0SyIdGaeFEhgmHanGLSYdErFo
Z2EjH6i3ZhsgHo6hLB8fFpNcY1IjIZDGqFQoIZGZJSsoHryrKyccFKqmLRwiGo+SLSwfFMa8
LzwlGKyVOzcoHMOsSS8lItOwRCIhGZrSLzYhF8G6OTkdGZObRT8nIJHASEIjHjp/H0ElDZqX
Pk4pIJm1VlAgEomDXkAjEbCBYFIfHW1rUV8fHomGZ3AcGqchdS4hGyQWLiEUCR4eFBoFBB8l
HiAFBBIcLB8SBB0WFSYRBCAiJxoLBSQkIwsFCyEhGRkFCRY4GjQQCDEmJR4ICycfIx0QCYoS
ZBAHBwYGBgYFBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGxGjUkIDyMuHiERBh8xIDUWBVEo
eycXCx4dIyAWDCMlFSMKDiR9GXYgFJAsjJMgGVuSdI8fG4eBoJcMFZqUspoWEn+hgYYQDpGR
mJYUDV1MklIeGiQZGSUNCEtgXH8dGIiij4IbI6GNvoUoHqWWjqAhEpiyhY8dGZyeknoiF4Op
qL4lIpmDk4YlHY2QnWknIV0tVyIfGsajnpIeGCumMo0fHZeMb4YvIoVqw3wnIKQvlDknHW5p
ZIQoJJRlkIQhGpwzZyUfGWNpg44nGohspLIpInydsXUmIFlpl70pH0eFq6IlIbBqv38mIFKf
v4MpJbGmiqkmGVskr5grIIe4xpkgFlNFhsUlHbWzd6EdGK22pqIsFWwvVigaEa+UYn0kG484
l6IcGCspz6YhHn1epYIiG4BAg5wlHh4en3gnG4tmYV8nFRkqLw0KCCQgIBYHChwlIhkJBSUP
HxkJBCIXFhoFBxknJRoOBR4dGB4GCxwbHRIFBSUjICALChstGi4WDk0eMiMNCy4jMSwNClwQ
dBIKCAYGBgYGBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHhHeEUOCx0vGyYKBSswMzATCiMc
mCAVEhkTGhkGChksJx8QBCQlG3wdDzoyni8WDxk0V5UkFUc3n4MZEV9Lm3AUE0Zei5IeG1FU
oIwiG3IspFoqGSQXIiAXBl5ya40rFGRzVmIUBXJ1JY8eE3SXkJ4YG4WPkW8aFIKPjJcXD5Wd
dookEKKaoZAmHJaTO2wlE30hfiEnGqSMim0pHReiHn0fGYSfaR8jGZx+HCAeGbWpJ3MiF5q5
iYQzJ56jIxMnF5yGLFIgGZStl3gxI82FKBsrHbSaICcgGbuxLzkjHoR3KB8cDqq/Ii0cGJqi
PhQsFZmzHS8eEqS8Qy4iFWS7ISkrGNKTMCIkGqChOjEjGsOvLxsjHZc1KB8gGaeoLSUsGKam
MTYjGZeXMCsjGKWgOTUREpB2NTEgG5CMKiYcG8pLMSgiHigVISEOBignKBcHByIVIh4FBR8T
HhYKESseJykNBCodKxwLBycVIxsMBBccGikRBxQpDyANDB8+FDAKDjMbOCAMDCUmKiQVBoYS
ZhARBwYGBgYGBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHZQdkAOCyQiHyEPCxM9JDETC0It
niUYDSAVIR4NBhwLJB4ECiF8GmQdEZ8wlpgfG2mYgJEaG454q64bDq6zq4cgEJaRo6cfH5mN
sKIjGV9ls1QdFiEdHxkTCFRRZ5QfGI6mkIkjGbCjsZ4lGKWisb0kGL6fm40gGKWUuKAUEKK6
oLUiGsCaqW0pIpB1sI0nHWclbBwsGt+puZEoGCCRHWwfHYicfpctJamRjsAmHZl4zW4pImYh
YishGnSIg24mI427s3IrI6kjaxcmIJOOhnwoJn6MyJMlHoiTdIgkHYhourgtJYK1u68zH5Bt
s78lHLK91X4rH8h1wcEqI6ypzr4gGniOp7QgGJXCdp0nHoktqjEnHR0bFhsWCB0ZJBMJBCIe
FiESBxcgKhsKBBgjGCcEDiQrGiIFBR0cHiQFBBkZHSELBB8oHSATCSYjHxYQBRkQJisKCCAi
KRAQBBgfHhkICR4gKjMLDBsdJyQEChwXGxsEBRAgGhgHBScsHDAQBTgmLR8OCiQoICsJCWAQ
dRARCAYGBgYGBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHtFdjwJERcmKSIMCRlAMTMSBiAU
izYUDSMpHRMJBh0MFycSCBoeIokbFykrsR8XERRAaJUiHjw9u48eEz0dsZIcEkA3jpQcECoe
mZkhF0ccqlcmHRkiJx4PCjpWdawoG01ugYsZF3V9MrIlHo2Gp6olFn96rJUjGoGCw6ofGIuX
iyomFI6BuJEkHHeBcZYmG4ATkiAjFqCAoIApHBybJiAhE2+uGBogGp+miogtGIaiJowfG4mb
lD0uIsKwijcmIbStjCIlHKN4LigoFLnGiyQzHaWgLSkpHbywKxcjFa68hC4nHFCWISElGNW2
In8jFqScKSQoGbywZVkYDm7HXB4iFNqxXUsYErihQk4dFdYtQlQjGjQhNB0VCx0aJzIPBCIe
JCsKDBoYIBsHBSAhJCQEBBAjJRYMChtEHhgTBR4gFSEEBBwfJCIFCiQtMCQIBSchFRcKDCUb
FyMHCRYgHicKBSAgGCMLCx8fIyIPBCAfKBYFCRgUHR0UBSFBJy0LEDUcLSUTCSYpHjcJCnYQ
exARCQYGBgYGBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHdRfkwJESYgKB0JBSorHTEQC1En
gy8aGCsZKRUXBikkFBUNBx5xH3MRDa0zl4wmG1yReZsaFYWEta0bFbSbtJoZDayRkH0gFYmS
s6YZFGtYuFskHSYdIREKC09of5McGp2egKEmHLayu7EeGXydx8QhHcGsq5kiGr2yvaAjGKDD
pMAdH7iqtbkgFpRYvpsnIXs+iCgkG8mlx6MlHCS3J58kIbO+prssJLCZdn0iISC9PJgmGZ6c
iLEwJ7iapqspIMW6jI0rJLmgvdIoIl52fWwlF4uhgZ4oIJ6qt30pIZiGi4woH52M0KgsHZSz
tK4lIpS3n68jIMzAsrchHpait8kyKbmTp7QbGI6wsa0qHaq6iq4RFHEWdi0jGR0dMRIXBiUi
IxkNBRopJSwUCCQjEi4VCB8kHBwKDjQrHyIFEiwkKh8LBR0rHR8FBRsYGxwVBSYoFiEKCxok
EyQMBSEhIB8MCiExICkFBSEjFRcNCx8WGCIKDSIfIyYFCx80KzMKCjYgNCQPDhouKCkKC4AQ
eRARBwYGBgYGBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGZJgkAJESodKysRCyciKiwSCiwY
fC4YEh0iHiUMBhoqJx0FBC4RFngfHSYqmjIYFCMqYowiEysdvpIdEyYksqwbECopq7IhIEY9
lIYfF0AewV8fGhwlJx8TBjdAj6cmHSo3iJEdF0JMPqwpIU5JuqYiFkhGsqIaE0xSuTcnF0lv
urEnGmVrvqEmGDeAdp0pHk0ikCojHXs51J0sICjRJn0tHXudiikjGqaSo54gFXqfIxsiGJSw
GBAcEqZ7JB8hC6eNKh8YGay3FSQhF6KogkwmGrO3QSUpHGK1MZUmGpq5Mx8lG78+IokgFFyu
ihYjHKuNLSMfF8+lHYglG8RsbiMgFn27iXQnGLmnhCAiGY62K4MkHlEjKiIbCR4fc2UfDh0j
ZWgWCS4oIh4WCiYdJBINCiMkLRUFECwgGx4PDCgaMyUQBCMjGB4KByAUCBkEBCEoLhUFCyse
KSUMBB8dKhwNBC0gHyUJCiIsIzQQCC4dGyIFCiExGywKChVFIjQOBywrLCARFSIpISkYBnUQ
fRAQCgYGBgYGBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGhDdUESDy4zNx4MCiUxJzQSB0Yn
hTgiExs2HikIBhwgEjEOCS5sG3ogC5QgjJooIF+We5YmHpiGpLYfF76jyacbF6COqJwkHn1F
rbAnGmhe1F4jGB4lEhgQCFNTlqwoHaqkgrQjGrSjuL0gIIafycIlGq9ruscZHLq81LQbDbqy
0dQoHbS2yLwhHKtotMgbI20joSEpH9CixIsgGC69SrghH73Fu68qIcSrrKYkJ77K7c0iGMvC
5rkkIjWvKWscGafWwKssIsK9rMomI52YpLUjIbBczUsqI3G/mKkjIL+ywc0oIbHGy6crJay5
kNwfG6yHvtIbH7O/5bIwHpzTw6wjHrC3v6YcErV7tccnF8TDp70lHKLG3qgtIKu1kKkjGKLA
kboQE2oeeBklHBQkExsODCYaLxEPDiIfIh0RCiQhIxELBSUnJyAJBR0gJSIJBCYnKw8PCTEa
GBsOBRUnHhkTBR0dGxoXCRkiLxYLCh0gJicMBRUYIx0OBCcyFTkPBzIbLywUBCsnGioFBWMQ
YxAPCQYGBgYFBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBH9GczwPCyAmJyAGBS4tJiURCD0l
hjsaFyYdFh4NCxsmGhkECxEnKo4gGx8SsysaFBs1drciGTY0z7EZE0hEwrkdEDRLmbgiHCkr
e6ohHTQTwFcqGSAkEycIDxstjKElHysmlpwfFjM+as4mH0s3ss0lE0s0xKMlHktKwG0dGUdN
ncEtG0044LMkIyw7d7ElHjcYlTwmGT8W4Z8uHRJXHzscBlpUNEAVBF1DyZYlGGV7JDoaCoFh
KRsUCqzZkj8nHLaWRKMkI3abLhweFI6CrqYrG56aOSIoFpCOQbwjHYSLIykhFKmXKxQdFnzC
ebUoHpOILpEiEyuIfs4hI8+ucyMuHZKbr3IhHLKTMCAlHFuskJ4oGsGmQhwjD6qzKyolGom2
HiUfECYjJRgXDB0iHhwRBTQkJCAKCxobHBsLDCIbISQPCg8tHiAIBDAtLRkOCRokIhgJBCYc
GhcHBx0OJRcSBCQeHSUFCyMfJx8GDygVIC0OCRIhHhgMDSIoHC8HCjMSNSgKBxgjHzULBWwQ
aRARCgYGBgYGBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHI9dkoLESkoIxkNBSAoMywOBGwu
iDkWEiQkGh4TCSYaGhkQCSBkIXsTD5syo5knHG2ZeJ8sFZaVtLYiG7+etZEbE5mlnbApILeM
iKgkGmhdwV8lHx4XHxgNDWhygqMmIZSWmqcoILd4wNUpH4uwxLYfGsy3xLgkE7/Tx7ofFpqy
yasuJbyo2r8lHa1jwrEqJ18rnS8tIsaYvJYkFSK4L7wdFbTCssooJMJxtI0lGDHVWrEkHdDL
qbkjE7zRxcskHsWbyrogEp0uq0gwI+uru8AjIMLFxbojHsfGsLEhG9fNwtAaI9S92bMlJbrB
lL8pHKHC0q0gFJfCps4kJJbG16QoHb+UrcwgGrfIuqQfHsqzw7gZEmUifyooHBweICIPCSMn
KyQOCRkiHygLBx4UICENCB4RIxwQBSgbICIVDh4eHCEEBx0YISUFBCEnFhULDCQeGisKDCQi
IRwHCBclLCMIDCgnJhgMECUjJyEOCh4aMR4NCCAUHikKBR8/KzQRCTciLBgQCCc3LCUJC30Q
dhAQDwYGBgYGBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHI8eEIODy4VESYIBCYpLC4QBYAy
fjIaECkiGR4IBSkSFSEFChNDH24hGGorlCYiFR5XeqklG1ZZwqAcE2FDtrIdGD1PjLQeF0lH
wacoFkolyE0qHioZHBoNBjlRi6AvIR4jpagcGSJGhLQqIEg/y7IiHVk2zKggHE1EqscoHjtT
xrMnJDMs3KgsIS8+nLwpICojmzEnIiUk0bQuIyi3MB4oHjRDIyERBl2hvpwpIo2FSdQiHz81
pjobFTswQDMUBT5LRg8TDoeALjcgGXc7sXIoHVM8nkcnHDs8L0MbC2FJqT4qHWwbOc8lFD1/
fDIgG3huuKgpHXJ/uS4oH2sio6gfF4aPSqkhF4+Sr8YoGX6Idi4qEyIkHy0IDxkcIh4QBB8h
KR0KCxwXJiMUCRgTJR4KDSooGCUPChQaISIHBCkrGR4KBCoUFRoGBCkjKygFCBMnDy0JBRwm
GR4EBCMnIiMQDR0uKTEPCiAlKC8ODSQkIRwOESUeFi8LCihAJDYKCDsYKiUSBCA9KTERCm4Q
cBAPDQYGBgYGBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHZBg0EPESYaKBcMCjMnJiURC14n
ij8YGiEaEyYVEB8XIR8FDBFjGHsUCJ9dlJYlG3ifb50eH56IuLUeFcCjrp0ZFIKyt6wlHp59
mW8sFHJNzkomICIdHCINCFtnnqcnHrCUhLcnKKFlztImH4Oov8InI76ZqL8oHLOvxbwpJLS0
xs0oIXFky8EmG7d1prUsKWMqhBkmIsWgv4gmGyAiKIsgEiE1f3UhFtWdv84tJ+KatswvHbWt
p/UpHLna0tMkG9E0s4svJLLKucAtHcfA3c4gH7K62r0qIMDOxt4lGsml2cQjHd/Qw8srGqPd
8MkYHcW30r8jGoXGzMosHtPCtOMoHbi8060iHq201rgeFocmxCIlHCkbFiUQESIfFRgEDCAl
Kx0TDCAaHSMQBS0sHCkRCCUnFCQUChUZJCMJBRsPFhwNDSIjGBoTBSQnKCEJCyQtJC0RDxob
KiELDicxGyEFCDgtKhgRCCAhHCEEDSIcHSkTCSMiJg0KBDYzMisUETEnKSkQESMtIz4LCpUQ
lhARDwYGBgYGBQYGBgYEBAYGBggEBAgGBggEBAgGCAsEBAgGDQsEBAgGDQsEBAgGDQ4EBAgG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGVHZEIRER8oHiAPCSQrJC0OC5U6
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
JiwKDSIfICUJBRgoIRsSDRYfGyAVBSMpLTQSBR8uJRoJDy4zLi0RFSoXLigYEh1CJEkQFG4O
XwwZDwgGCAYIBg4LCAgEBAgIBgYEBAgLDQsJBA4GCQYEBAYGCwsLBA0GCAwLBAkGCwgOBAoG
BgYIBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBH1AhUsQCCAgJB4SCzIqJycPCZxT
YiUgFhwrHREOCR8VGh4JCyGSGY8iGqUvwT0rH4CcYakhGMeUpJgdGLK7m7khHZObvJoiHLa8
j44mHK9UcUwjHh8bFigKC4uyVXIvHpiKrbspJUDAvq0xJM+9nLQsIbiwwpUqF8alycQnG6DG
4bYtIcewxbIlIXG6nlcwI3tzZnciHM2O26MxKHbMQLkqJCYVy88iEyMgyZ8pHycZMtomI4PG
yaUyI7unwmY0LRvEWtgyH6oq5ssrIdJD19YtIyodyK4jFyso1sccGyG3w9AwKJontcQiIiwz
x9QoFbhs2JkuJTi4vtAmG2xdpcsvIJN3xMoyI6WqnKsgHWgpgBwrIRodGR4LBi4cIhoGDR0m
Jx0LBCIoJhoJCSUZJSAMBCAfGigKBC0eGSoEECMdJSoQBCApLBUFBBwnKxcLCiUyHCQEBBge
JyYJBBYdHRsFBx0cJx8GCCweERoJBSgmFhoLBRcoGSYKBS80LDkRBSgeLxsMCSdTKGYOEYEM
dgwaEQYGBgYIBQYGBgYEBAYICAYEBAgGCAYEBAYNCAYEBBEICAgEBA0SCAYEBAgLDg8LBAkG
BgYFBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHA6hUgUByYuLBwMDDI4KCQWBKQr
JSMdEhckHxkLCyQSFCAKBR2BKBEWBLqmNSMfG4KqIyYaE8GnPTYcFcewNTIfE5LBJz4eG7xr
MxYgGcdIPRwgHSgcMCsRBqyuOTQrHJusLUMaGtC9R0AoIbfKRjcpIr2pUz4fG8/aOkcmILm6
JEUqJtrORDojH6zOL04mIIMdHRwhG/FVSBgsGE6tPlAhGbnUXFQcIuStZrApHp24qWAvJbmy
aFwnIKWmdqIxJX6VpW4rIbu/eTwnJrarhU4nJtfnhYQuI8+umE0uJr3RMW8uKt3MqYkoIqzI
lJMrIcjNlnQfG6TRNpglHdzCq4gpH8PImJMwI668qbgmFJkrPR8uICcoJyYUBSQlLy0FBS8h
KSINDyAtGyIQCx0nIR4JCR0cHB0KCSEhICELBBseKB8JBB4pIyMEDCEYIiIHCiAoJBkNESAX
JxAHDh8jEhkSCSAcICwMBSUiIxoRDykpKyUOCSEdGykKCyszJDYNCDclLhsSCx5oIHQUFmcL
XgsaEQYGBgYIBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGVEf0MSDSAlGyEOCyAoKiURCqta
XCcdFyAVJxURBgwYHSIRDCSJIIUjHKgvtD0fG3SqVrAfF8WUm40hG7iop44eHLOxlmIiG6aT
lp4jGbFLdE0iIB0eIiAYCLemVngpGLGcs7IhHXPPzJYoHcvQprEoHb/H2MwuKcxc1twoHsvF
xMcnH9jD2bQpIYu9w2goLX50RnEjHdqg35E1IyU7ld0rIpmU28otKE033M0YF0NNAN0iHiok
sZAtHUNDt7goIEk14LcrITsX1SssIt+G0NEuILo1mMY2JLq0u7wuIT+16dg0IK3DgcwoKcWq
p8odHjO4ubkrHbQdzsIrIbal5YkvG7G/uacqF5UhxDQ0IR4kJCAPCyIfJCMECignGSANCCYd
FB8MBCgmLx0LBxEfFhYNBxkiIhYMBBknJCwNBC8uGSMECiUbHCQLCiUsIy0IBRYgJCsTDCYt
ISoRCSciGx8OChQbHCQJBSMaHzALBSYeDygNCiIkIiwHCio4MjIIDSwkLBYLBSxvL3wWEV4L
TQocFAYGBgYGBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBIJNgzoUDSMXKiIMCSQxKSYXB6dK
OCcZGRkaLSsOBSIjCBwJBCJ+IjEXBJ+KOhEhHIqtLFIjErq2RjwjHKeVQ0QVEKOrS0waGamu
UEAgGrlHQRomGhsZHRoOBqyhQUEnG5+5KiYaIMG9Hz8nIdLHQkcjGrbAUUIpHMbURz8gFsbh
RD8iFdzMKCYgFqLPL0kpIn0gJSMnGd82PxooGI7MMDwnIrXeKhcnHdLFOCwjGcHcOSgqILxy
q6YiG7jALi8hFNHMSDojIMJRmKYzIs3NS0EqIcHLQSgsI8rYOz8oH9vMMjstHs7STE0jHrLA
SUkYH7CwLD4uI/bUUzYkGdTCR0AmI9OrUkgdGsAzQCArGCIgGB4LCCEfIxwRCzEiLRgKBR0o
GSoNChAdKhYQDRYpHyQPBB4qGCIIDCMgHB4IBTEtMB0OBxQsIBQLBCYqMBsUDRUZLiIFCB4R
Jx8ICjUdHS8MBScvHikQCiQpLR4RCiUbHSQLBCMqJiYWCDo4KjoSCSUrGSUPBjJzJGsWFE0K
PgkaDwYGBgYGBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHA4bU0YDSEtKiIKCTEsIzkUB5Iy
YSYdFyMWIyQLDSYmHxsLBR+hJYMpGqQym1MhG46rZKwkG8yopaEfE7G0mqAeGq+rl50dFtKg
m4crJbpMckcaGxseHhUQC6q0cJklGMSnsKMjIJnEtWYlHcvKpp4mGsS8v68hIbjKrbokF77K
u8IiG6C+z5MqI3TRp1gnJHijVR4fF+mp3VwnHSHTmJglHqCRp7wuJdR9qpchHH6Eps0tJn52
4M8sJSJpHbUwJ4x+0LwnInFjxbAoItNunLwkGXqwwr0mH21lxNcsKWU31dgoIaLByaklIYKB
trsvHslJxs0yJT5bp9InIcWyt8AoHzeqtbovJbzFmLMvKNK+t50qGCwnLyUTDSYbFh4NCioe
JBgKBCAhEiYQCh0fIx4SDRogJjkNEB8TFCYPCCglLB4LCx8lLR8LDBAlIyoODSUqKCMKCi0p
Jh0RCS0mLiwFCikmKS4LDRomKjALBR8ZIxgJChgWHiEQBC02KT8PEScoJicRBS6EJ3UfFCgI
EAYaDwYGBgYGBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBG5Lg0cWDR8gHRwLDx5AJToVDJRA
dzYgFSEfJCUJBR0gIR4OBSePH1sRFK+rfRodFoCoL4wcEqa1iXEjEqyrjVQeEqiLZ3ocErCy
hHAlGboshCIiHBkhHyEGC6WodnspGJfFNR8aF8SrL2slGtDHg3wpFrXMjXQjEbjOhRslId/C
aIIlF6nVhnMlGYzAJXgoKGUWNCYjFdUzgykoG3GqLR0qGrOdHiolIsWwJxkjJNHOIFMaG92o
HHgwHnS3YoMrJarFMiAsG8yAsbAxK8bTLx4eHMneKCAlHNLhHCQhH8OPLSAoI6TSPR4lF9PI
OjUdFd2/LDAXFcK2LCQmGsnmQCMmHLHMUTMkIL+7Sz4lF9XUTkMlHRgcJUATCCglOSgKCxcv
MiQNCiEdLiMMCiwkICYICycnGRoOBB8eMRgQChMcKRQMCicoHBUTBC8bHxsJBSYgIDIGCi4t
EyEEBB4oKDIKBCsdJDIKCjUrJiEEByYNHhoJBCcwLCMEBCUwJzIYCjQ5LisMCipnJ1gcERIG
EAgWDwYGBgYGBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHFLbEgWDS8hKigSDCU1JioRCps3
WCYPFhgoISQICBwTHhURBxygLHUjFaNDk3QhGom2a64hG8Ogp4ohFamloXMXE7W+kqsgFcGK
loQiF5BIb0UhHyUNHyQKDomcZY8dI7mzo3MuI7XInmciHOLItb0qG87HqLglILifqbgoHNfL
0sgjGLu8wJ0lG5G6pHspHmSRaS8iF9OjzDQrIRkVIBoNCC+JHXAYCJarjZMlGqPkrpknIU+K
QXIfEZyqydsvI6eX1ZwiINTloMAmGpLB0MgsILyUwdooI5tvwcoyIBzWKagpJLuFkrw1Kbmq
tpwqG5yHpMooEoqO18wnIIS808gvJLWlwLgjIJ+55LgxI7OmusEpI3zDwb0nIKyFpsIrHbud
opQjGtduxGItIjIqDCsVDRklJBQMDiYpKiYRCxkaIh4OEB8cGyISCBgdHR8SEiglLB8NCiYm
LScFBRQoJCQHBycYFh8QBSYdLycQDiEtHi8LByQbGi0KCCs7LSgRCSwuMSIMDS9wLFkcERII
BgYTEQYGBgYFBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGZae00WDR8lISQQCxs7IjsaCYRB
dDclFSEtJhoNDx4ZEBATBRh9JnsdEICnhiIhG3ygZoUgFJm4oJAdFp+gkZYeFauhfJIaE5OK
gHQhF6snlywlGxMjCR0IBZmakownIIKnNh4ZFceKMZ0uHKbFS00hFZ2xk5ohGa6dT5oiHbzJ
lp8UE6bFjoggGHO6L5woHWMiTDUOFcw1l1goIotvHqUmIYy3YmsnGtSqjE0sHb3EbSYoHrG5
fZIqF8C5HoEjINurnZYxI7XHGRsmFrixKC0aFdW5JJ4nHtWgOSkvHIfJixgtIb+lKCwpHbG3
fYQpJbzALHgfFNy5g3AqHG6RSy4fE63CbB4pF8uzJ1omHMu0ZFgoGH2fZVQvHcGvUy8aFcKu
VUQkGsVuLyYtIhsSHiENBiUcGR8ICS0kPSsOCiAXJykLBRwTSjEVBC8mICAOCysqIygQCy0b
IRkEDSQyIR0PBCQoJy0OCxskJioSCCcmLC4ECyYeJCYMDTI6MyQNECsnJSkPCDFuLnUhDRIG
BgYKCAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHtPc00ZDSYtKBYQCycxIkARCnQw
XiUVGSYlJScSDBgqJw8EBCyVMWMcGpYtoYwhGoqqjqkfFLmrnLIYGLWrs60SFJKhs64cEJqR
omwjF5M9hjoeGhcoERoWD3J8YqcfG7DDnMAwI7apxW4qJLnAscYmIbOnsocUD6OVgKspGrTK
rsIfF6i9za0jJ5Wzt54mH1ypWyIfGteo1UMoICrJL5YhH7G4ksEjI6nEpaQuGs4lvyklIMbH
c38hJIuyfI8qJcS6g8ckIzaXf2smIKe3VY4qI6XTjGYqJryfa4QvJJ64drk0IJyy6csqHbS3
s7QsGaSwsa0pJrayorwcGoOywaU3LMCrwrAnIq2uqHosI72pwZohGcWt1LUZGJEpjiwrIKqc
dn8kGcGaeJ0nH5ShnrceGK+QjKMrILmPh3YsIJOKrLEqH6yHb3AbGiAgHSYKESUiISIMBBIU
HiIHDiQeIyILDicqHB8QCR8nJSsLByIoNB0RCigcHywGCjc9OSkWDB4xHSwPBjhxOlQkERII
BgYKCAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGFSdVoaDSQdIx0JBiAzJEAQCphB
ozkhGTQmGiITBhgeCycJCiKLLY8gCoR9oDEfHF+cdpsiFp2PppEWGaKaoqgXFKifnp8XEZqI
vpMhFZQkrzYmHhsZICAUEYaDpakpH5CLjm8YEquAMpkkGqKvn54kGJuclq4fEqCanZYgFpqz
uasZFqu3oJUhHTiiT6UoIDUcSWchC5snsnotIx21M7geIJOjOB8lGI+LKCUhF7V/JyMkH6m5
JSoWDaWpLJ4aEpi5oyAvHrm7pbUsIH2VkCkjFa+aIwgdF7+eo54lILygrCYoHKE5ZacjHJq2
TnUiF7aLtqobHKWzkR4yIp5om5seGKy5KXwfFqCsrZ0mGaa0qpAzIbCsKCIYHpQjJCYlH659
Kw8jGserJSkWHqCZHBoeE7GqKxwkG5iSKSodGJSwIiAbHrSPIycnHBsjKCMSCh4tJCcMBR8U
Ix0JBCgaHxsFCyQXIioIBB8wKxsJCiMlKCEKEC8iFyMMBTIwMzUEDCwmLSYWDCR3PHQbCxIG
CAgKCAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGxMeEoZDCccKBcNDi1ELjwUB1Uj
kUQgECEhIRMNDiciFh8OBRedJH8iFp43qKkmGW6thKQiFq6lrbUiFby4orEcD6+atYYhH7aL
sr8gFnZDpDcbGR0fHyEQFGyAm6cmGqnBlrIcHLWuxq0lIdCi18YgGMTKtLsYGZjIs64XFcG6
v9EYEs6ozs4sIo17lLspH2WmZC0gGrmF4EgpIXWvpIomIL3Aw7EtHjS+T7UsI76KtYYkIsHB
zcsqIh+9N5YhG8yQqoUsJNO8pq4oIrnI0bsxJcbA0Z0qIXRtoKonGnW3sb8vIMjY2tIuIcnI
t7swKN7GvNAeHqmyxLAwI8esx8UjF6/D1aIvKay/rpgyH7ymrKsrE0ElIygSCiMYIjARBxsd
KiIMChofJRwMBR8rIhkQCg8uGhQMChwkISYKBB0hGx8EDRkoHSAQCzAnJB0QBx4qHCoOCyU2
JSQTBCAhISsLByUoHCgOEBgrJysNDjEkIyALBCosLiYODjI6NDQRDigrLyoPBi58O3waCxwI
CAgKCAYGubYdEA6Ru6UcEXR9gnoPCowLn5wcEg4Gna4RFwwGCAgGBQYGBgYEBAYGBgYEBEcJ
q20NCgsGBgYEBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHBLgEAfDi0fKiwRCB8qLkceBWEp
nSsiGywoGxoJCiEfHBcTBRxjJo8jFlZJlyclG0VobJklH2tcsJkbEmZTr6obGUAskrYaEVlM
qKcoG1kjsDkrHA4lISgLF1ZMr6QtGzxXm20ZFktQK8MoHFNDUoEeFmNWqdIkGGNccqkmHVw6
qrkeHV5hqaYeGSpsWLYoICsnVI0gE1UfuIUrJTReYqYkHGGTdj0iFoCcSaohFmdoy1onHWCU
w7spHXeVRKIoG21vqa0mHnFksqwwJXN0KB8fBnBxLBoeCX5fHx8kEGAhJBQiFVKaKSQbCo5v
NBYbCpSNHRQfD3wgIhEfEJGWMiQmFYKTJCYdFp9rHyMjD5V3JSIoFykoJSYQCSkkIx8KDiAZ
IiEKCSkkJBgHBDMpICMLBCUpFSIEDR8kKi4PCS4kLTIQBA8lIiYXBCIhFSgECh4hIS0FCiof
JicXBR0lEycTDCcXJzUYCCAhJSwWBzMgKR4LCCAbJxsICDI2LTMTESkrLiYMEDpvN7coExzQ
nLYtF9sOCAgVEQYGBgYGBQYGBgYEBAYGBgYEBAiYDAYQD86jDKEiFw4IwI4WDQsGBgYIBpTC
ED4ZBJF3uKImFBAGonQRDwoGBgYFBQYGBgYEBAYGBgYEBHFUcFsfEh8fLxoODCNQMEYaB1gs
jTgYDy42IhcUDhkWIRwTBBiVLIAlHZQ/mpcgIGedlrQdGZCYqsYhGp6iuLEXFp2jv7MeGKaV
oqwkGVk4yDYeHyceFB0KC2uCsaEpHamomcUiG7q1yaIeGdqxxMYXCaGaossYFrKxsbUaEqqc
xLwcFq+ps8QYG4xxjcAqHlaYVC8cF7l/3y4pIWvCgrQhIbC4x6keE7Gi27weGaLTwckcH8C+
y70dFcGSqrobHKynrrUtHZWPxIYqFx4kGx8QDSI3LB0RBDEZGB0NCRssKR8EBCkhHCwHBCYv
Jx0JBSknIScLBCQjFgkGEhkiHCYMBCMqHx0PDRknJBcPBCEnGC0PBgYvJSwJCCckLy8KCSMl
KykKCiAXDh0PCiAuHjAVCCItHR8KCS4kKA0FCSQvHScFFSc3IiQFDSAmIxAKChwpHxgEBCAk
ISUFByMuHiwOBCcnIjUFEC8KHhoQDCYvJSIVCh8kGSwLByc7OTIMBio8Kx0XCyIoGy4XEFWD
W20eEwwGBgYKCAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGHdEE0VEbUO0JAqGgwG
BgYIBgZ6CgYEBLXHED8gBKaasbgdCToIu5cXBBAGjT0EBHFNblgYCx4lGxgQEC8qIksWC0Uj
qUMlGSMhHikJER4RGg8RCiQsFZAlHktBozohFSw3faciFUkwqZQgGkU4sJ4gDy9Rja8hFEwh
uqolH1UdtzInHSMlGSISBkE1s7AsGSU8mogaGDg7qLYhGkYjsJglGjtHysMmEkRMvtAnG0Ew
rMUqH1Qp0KosIR1IaronHi0hTbQgHDYf2I0sICVLR4kbFz4rcn4VFkw5iDEaEDJCQdYeFVNA
d3sYCj1My5klGi0/nx0eF0McXWceEScVjqIhHColuWYkHykip5YmGh8ee0odDh0sm8UrGikm
iqkmHCQivs8pITMdlmkiHCIkxaMuICwkVrgcHjMasbIpGygYyp8nHicnESMYEikhHB8MCyUs
IB8HBAgfHBQJBCUZIiUMBCsfIiMICiMSGyILCSoeHxkKBR4jHBoQBTIeJCURBSUhLhsRCh4l
FiUPCBYfEycKBR4kKSYRDyEhMCQRCB0zJCkPBRgzIhkRCSc7MDAMECwWIigNCR0yNDYTBT54
SsAoGBAGloIPDgsGXxAFBQYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBF/DFoohEwwG
BgYIBgYGBgYEBAYGBgYEBAYGBgYEBIqqDgYXCaypEKAaBbpGxEsjBywZJiYIDCFDJEkYD1wu
sC0aFSkeGRsIESESFxkSFiKaJZ0pFZkznaUjIF2dhakiG5+ivrwkHKintqkkFqGutqkhG6yB
q5kgHGY6wzQdEyASLCQTDWB5pIUqGZu3nKwlF6pcxq4dHJ2ftMQeFrSduK8eHZevq8cmFpm9
h8EoIa+gutEnJp1xgMwsH0lUQCseE9040yEeGY69l8QsH4isyMAfG7Z9vqswI1aYpsIkIoiM
v68mH6emvJUgHbE3xYwxH7amtZYtI7KWzKQhHo6csaQgE2mTtactId66y64vHLmc0MkhGLfI
y6YiG6LDqbclIMbIw7QrIbawz8UqGM27qLMkGql7zMgoHdGG26onIiYjIhwbCh8qESoFBBka
IiATCx4jHywMBRsdHhYLBzAhHR0NBSIuIhoQBSQgJigKBCgiGxIMDh8oKBkEBCYuFCcXCSMi
KhoMBBMhJCkaCB0iIR0QBScfIBkKBCUqHyMQBCIiICUNBTY4MS0LCBwKLyAMBDQkLV0ZCGJ3
XFAVCYuGQUYcCpSNaGUVCoqGgW8eCYWBk24gBop9ZJIcD4FzhoQfD4B3dHURCnali3IRCRIG
BgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGJTalIaCSYuKx8TCTArK0QcCjIg
oDIjESIjESUQDCAlJCARBSY2KpInG0EqqickFyY/jqskFEo4qpEgFkcqrZ4nFj9MtK4cFFQ9
pqYjHUYipzcgGhcjFBcOBj4wkpUnGyoropskFSNAlq4nGzwvubgpG08htLEpHkFRmqwkHkos
xqYgHEcfuqYiHCtHgKswHS4yNpMiGUYhuY0uISYlcZkiG6Kdf4kgHiiJnSAkEoEpfaQfGEU3
maQqHy4niJ4dHIBui5IgGWwgX6UdE1UiwKAxHD1DorcrHFcptrQuIjU+isMeJiYZs5cjHSMr
noMjGUcXsngpGC4sJiQQCDInLBsOByshIicSCSYqHSYQBCkmIyYNDzApLB0NBSMdIyAFCS4Z
HiIKCiQdGyURCB8TIDMECi8rJB8MCBsqLR8QDyItHygEDBofHyYKBR8fMx0ICiMpIi4WDx4n
ICMQDictECwECiMkGSILECMhISUPBDcXKCYKBSMiLyYNCCo2MysQCTAbIiQRBCdAHkERBTcg
NjkNDjMqREQQDDI7R0MNBUU6TkMMDE5FT0cLEGhtSiIJDVE/IxQPBDwsISYMBTg5TUsPBBIG
BgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHFGeFYZCyEfKikVCSM/JVobD2Uy
njIkFismGBYQBi4iGx8MBSOCNI0lE5hEpJ4jI2eTh5sgHpOYt8ccGo6Ou5AnG6SSqKwhFnN+
mn0pHl80piMmGhQiJyQNCGZ9mo4sHJeXlKYkG6lkyLMkIlyCrJkjIY+fmqEnIrOru6AoHLui
orsoHbqto64kG6BleaovIk5BLicWC8cnzB0mHomppa8wJYO1rb4kHqZiuqI0JWiwob4sJY55
sacrIJvQpK8iGrHbsK8mILK/Un4nHc+ZpsAiGMKasqUsIbGwoaQoI7m9hqQuIa+xnp4fHb2f
lqskIr55uT8wIx0fIx8UESAeJBMOBR8jJCkEBCAvIBwFBS8nJCsQBzEvLSwPDSgpKycWCSMi
JhsPBCcdLR4PBx8nFCoHBSUsJx8JCyIkIyUODRgmIicFCCYpLR0QBSYyIiUKERkbLBoJBRgW
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
CjPm/wA/8Ko6hfRyJ5G5snBDYrmhckyM24/TsKFl3nGTmqUlHQejOqhjOweW4xj3FTFGgBZj
x9a5QXbLhFY4980v2zIA3Mw9SaE29CUy/qk8ckoVSTgenvVAKFB71DvaZjt6e9JGfmbJI2nF
abrUGidZV5UjAPfFObOVCnjvUfll1Y596dFAQrHPFRdRVyktCwsRGD2qQfKwFV4lOOeNtWPM
xgdaq90BahBGCMgnitW1k+zozPyoXPrWVax7x8xwOtatsgMMin7pQjNTa40rH0l+x3YmGDWJ
zwZIoxge0j19JV4F+yPGG8PajN/soP8AyJL/AIV77UUfhYSCiiiuggKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAOlfPH7WSb7fTxnHzR8
/wDf6voc8186/teMV0uxP+3F/wC1azn0Ezwa4+c5+6T1rMljKglea0rwjcWxxWZdfMOOlHNy
meuyKr5B61XZv3mGNWGbAPpVOX5iT6VvzCtqR3LbCRu4PSoPMAGCfqalc5Bz2qBxz9amLTDl
sIwJHHINV7k4UdjVhslfQ9qgnRtnzcUpPsNrS5kTdepq7pW3z1Jbk/41VllXfgHdn1q1pY/0
lQexHX61aZEtUdneJss/oDz+dcpNKJe+cjrXUzgi22Z6Z/rXLXCeQcAAj6VpJtigtCJfukE5
9zQgyeO1IZcSgY5IoBwM965XozawuByenNLuwMDP5013VfekHAzgc1pYOSwjbpE44IpWOVPY
0xVw27pj0p5G5s4wfSpauynohjKQAwOStODEj1zSNw+OvqTScLn9KGlYheYsgPlntTAxVPX6
0E5YetKD64xUpW2LtdaDSMgY70u8KuO9IVIYnp6YpeoOaq7JsXdIcNdHf0OM/nXT6zbLZWwe
M8HOO2cCuUsJxbSBjznA/Wuqe6XUogrttA9ATXXSd0zKbtqV9EmM8nlv0LYz+VU/FGmJb3rK
vIAByQPSt3TdLEDgg8g56fSszxSTJeOc4JA6fStJL3WRze8cnuZiR29aeQWPB5ppAXvk0E4G
RxXA9zqdrD4mVn24wRXS2likMIfJLEVz9k6tMoAy2O/0rvAkbaUVAAJxzjp0rtgr7o55yMBN
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
FuIGAUA8+1OKrnmmsoCkgHJ5NIoCjIoVx2RIuF3bh7ilUllJJHtSAbgDyTSOCMAd/Wi9rpk7
i+tORPmDCkXjgnmlHGf6UkJ7kow5bcenamoQrkjHPemKMt709uRinonYrzQ7BBJXGPenKQ5O
fSogMHB/Cncnnrim43Vw8yXaOvUjsKj8wdCMUuTu44OKaEGS3Wot3Bb6le8xtKjOPUU3TQol
J7c806+fC5ByKTT8GQE9AD0p3UUSzqbHeQM/dAqPVJF2EHqDVjT+FUHgdvyqvqgGG/u55+ua
aehne7MrI3YNSFVwBz71D8rDnmpUAY47Cpv0ZqOIVcMM7uoqZJS3tUS4656dKcsrHgCrT0Gi
xESGyDV2OY/KOvSqaNhMn0q7atuQelRJaBdX2NzTiWhl/wCuZyBX13+yEf8Aikb8Z6bOO4/e
TV8iWTmGIvGQCi5NfX37I0YPhG+uP45thb8JJqhPVIrue8UUUVsZhRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAF
FFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVynxXQSfD/AFRS
cA+V/wCjUrq65X4qxvL4C1NExuPldf8ArqlNaiex8O2WPsYz8rZ/oKp3Hyscjk1cilWeAKMn
Z8rGqdyGzjvTMjPlfkn86rSYOSvIx19KsSgEOBwe+aqYIOAcik7NjsNbO0beaqucE57VKzus
h6YqOVS2MDGe9NrUnYj80HOTxVeZlHfg1Oy8EGoZBsTnpVyaSsg5tbGVMy5xjAFVN+ZSM9PS
rFzhsY4J71UKuJCPTtRFp6FPcvBRKOenpUiSbAc9TUca5UEVKcbsEfNTdwXmNUbunWlDEPgn
jFIQFk9vWkLjd8v3R3NRsU2MYEMQfzpFYF8jp709jjI7GmBSwyOlLSwNpASoP86bIemfuml4
waXaT7Yqou6FotwIABwOaa78AnoBzQvBPHBodQe2eOKhaPUq/YaHLKcYx6Uw5DD0709Qygnp
6UMVZMM3JqpPsQmRvgjNKpXGOvFSMiqoz0HeoP4j6UrdS1d7i/IDubvTioP3hxUbkEc9KeJA
Bt9acdNg6akAtoQ24Kdw96sSD5eOMVGMYOeAKRWLHOa0d7hZdBd5Cg9qY8Ubt5m35/XNPjC5
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
27BsRsGB3Z5qQsQv86XaSD8p/GhvQ8D1oUrsLjWkzjac44pzY2Hnmmqgxwae6Jg4J+taXIYp
bYfXHenBg4yfl96YAF4Y4+tI0gAwOfSqukVZ9CYELnP503OQ2OhpMhlHPalUZBANS9NgS7jS
/Cgn8aeSdoI6U3btXJ5oLFlAC8VntoNq5Ir56mmgK4xnBpuNoGcg0rYzwcVSYJLoPWRghUjB
FOjkwvTrUTAkdw3pSg7VyOaa0dxW6j1G2MnOCDQr4YkHJpFQvxkj2pyxqq5Y4NQr3EnpqSKu
DuxmlVm3ZxgU2J85J4FL5gX6eoq7hqhzMQDj8OKerl1IIA9xUfDcA8U7OFx/KlcSQGMKc8ki
gHc2B1pyknqce3rQCqv6E9Kq76l7Covl5IHNPMnBOD0/KkZsDp+NNYEDryRUXSepL11HIAAW
zwfWjq2c/lRGg2YckDtRnD4UcU+YFqyQkrnrQqqVY547Zo3EHkcGnbdgx19jTTvcTEJxjHX0
pzkjBPB9qaAWPIAIoZkbq+KF5gtVYo3b/NgnAP8AFU+lpmUE8jnoaq3R5xjI9at6VFudSrnv
wK0ilLcT7HW2xZkA24IHAzVHUs9WwvP+NX7csoz3x1rP1YliPT/9dDukZryMzzTjK808KThu
tNRMHFSLx059qjfY3toScv8ASpg+AAO3aq5Yg4qZPvCpSRN+hajk3L83B9PWrVq+ZVGec9Ko
opLDHXtV62Qhw38dQ9Ni1ZGyVeS0IjBBJGcfQ19z/s0wCD4XaUo6/Z1Leud718N2bYj5bAXr
k192/s6xFfhdpEhXAkgyD6je9Z/8vEWl7rPTKKKK6TEKKKKACiiigAooooAKKKKACiiigAoo
ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuU+K6K/gDVA4yP3X/o1K6uu
T+LGP+Ffark7R+65/wC2qU0TLY+GrRGSyQOOvIz6YFU5zhjzV2BybJCW57fkKoTcsM8eoqne
+pn6FWT5Qc9T2qnJzntjtVmXPfrVeQDnHBqkuxCICAahlBGSO1TBl3HcQP60x2AHqDTaaK2R
XOSDk/WoZQGGM54qRt29uynpUD5w2BjrSbHbS5kXnyHgHB6mq2DuBXIPpVydwG+Yce9V48q5
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
Tzmk433KlZop3IMcvt2rZ0NjkE/d5rCu5QJQDwSK3tFQYBJ55q1C2pFrI6FjhBg81j3uNx6m
tgbWiO38TWNeMC+OlaSuloRCKbK4TB44p+7g5/SiQ7guDjilYhWFc6bluXsxysB7A1OnCmq8
XLn9KmOeRnnvUJXKb7EqZzz0q3a4JCjrn8KpK7DHfHc1ftSCy5HzNUydho6fR03alo2f+fmP
Pt8wr9GfAoC+B9AA5H2GDn/gAr87PDa/8TvRcDLG6iDf99iv0Z8IqF8I6GBxiyg/9FilHWZb
+E16KKK6DEKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC
iiigAooooAKKKKACuV+Kuf8AhAdUx1/df+jUrqq5X4qME8A6oT0/df8Ao1KL2In8LPg/TyGs
zsPIbB9zgVBKUz8xxVjTgY7V/QtkfkKqzhZGIxgCtZPW7M1qig7BmwelQzRhxgEipJ3G8gDG
Ki3Bj1/GlKXYSWhWeJUOSfmHb1qJmKgkY5qzMoAJLZzntVNsjgfnVbaAtCNycglic/pVe4bg
DnOasklRk1XncY/Gpcg5jMuFO7knmi3URPliRiluD5bVG0m/ao/iO3Nawdy3rE9O8OgG0Cn7
pJ/DmuQ8TRA3ZJ/hxz+Fdh4YiDaY24427iD61xniuTdfBM4Pynj8a66lnTOZfEZIKs3HWo3b
k+3anONqlh1qNRhSSOa8zmb0Om9xzqpGdx9KbtIjOOufWhjx1xmno/z8d6adnoN7kQTaMgmo
yMHIrRkswVB61nSAFyM9OM0PcNwAJ5I59KcTgZI/Coz8nzHOaNwODT1s2DsBw+QePYU1l2jr
06CnZ3E88CmSfNxnGaSbsDZLGuUyTjjp6VExKse4NIDsJXPOMZpxlVFH6mk2xE0L+QysDlge
hrtfDvjW2WT7NfyP5R6qrN69ehHQ1wQcEk4zildllK7kVvqOldFOo42FJcysz3OwtPBtx/pS
TTNcHgIU7jpz5f0qLx4qTWTRjIBQg5OezV5Z4Rgji8RQMqDbgEnA/vivUfHhCwuBwSuf0avT
jNzjdnNKCWx4goCrgdBQTt5ydtMgO0OPvD3/AAqQqUUjt715s9ZXOq1lcWVFmjI/hI5r2vwx
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
I3mDnoazersJu2hpWiv5qAgcnjFeo/s9Kq/G3w8Rkyi7jLeg+Rq8ysXbzE3cjtXqv7N8QPxj
0tx2u4sD1+Vq5a/8NmsNWj9G0OY0J6laWmp/q0z1206uug700yJ/EwooorcgKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuQ+LjF
fh3qpH/TH/0aldfXH/F4E/DrVAO/k/8Ao1KwrK8Ro/OTRZCLS5UnH79v6UydmUnk47c1Ppjb
IJtw48w8/lUNzyRzwa2SimTJlZgu5SarXG3LEZq48pAIGMVDLGJOScVDd9jNau5S3fNjBJFN
2MxLH8qmkXYCCeOxqEHGRmhq71Hd7IhkB3Z61FKcKeKk5VnLHIpj/MpKn86ad0PYzy3AqS2V
RMMnIBB5qB8xyYxUsWxGC7iGc7V+vat6VtyZdz1zRYmOlK4OfmIAJriPHc3l3i9eWQZ/A16D
opjTw4ing725x9a858do8l5GqjOGQs2e2DXo1XeDONSfPY5xm2nNNIkP3QPqac2Bz2p0UoQb
q8x26HZoMlQ4/wBmpCd454UUxz39aakjMMD9aQ3LQc+TwBz2qICQIxODz3p+Nuc/nQ77ePyo
WoluRKCuMd/WnPkrz1FGNoBznNGRuxuzTVrMe4KMrjHNNI+ZQBjHWlZ8MR096UfKCSeMZJoW
ugrMQpubGcUuNvApikNlhyKkHzqSvUdQaNtBybRYguGjkQnsc5r0Xwf8VdI0aVhqam4QAfK0
JkxznufSvMl+VgWGBT2O9sgce9dFOo4slxU9z6a0b4p+FdaKjStNRbhm2h3s1TnjuDnuK5j4
gOLmKdiuEZcfjtNcf8L1eW8hlH+qWUN17BlzxXUeP7iJLW4kV9pK52EH+6f8K9Jz5oHHOCg9
DxK2kEsAc+vahlAfLdBUVkrNahumSelSPdoreWwJI7gV5ttW0jsvZXNGwGGSRR86nj06f/Xr
6EgjEmhWmRglUz/3zXzrF83lgttBb9MGvon7Qs2hWUROAI48ED/Zr0aDvuc1bpY1U+H/AISl
WK7vW33qry4iU7SRyATHnqTWdctFCrC3LeWOmeK+efGx1eTxTEftlxFbKr7Qk5APLds/Sveb
QeToliWYsxjGWbkn5V612bOxg4Wje54/4tsJtS8baZZRAFpmJOTjjcSf0Br17TraDwh4ZkZ1
2y+UDwAf4QO2O9U9N0OOyv5bxwGkJLKxwcdTxxx1rivih4z3XENnvK7VYNgHoG+vtWco8vvD
V3aJyvizWDr+rSSbiYY5GyDn1HY+4rf8IeOYfDjQNektZJgMm0sCvPGM471wI1CK6mKxk5Zu
uMdasMCMKee2K8r20ua7R2KCS5T6I0b42+Ab+4jgSxzdYHWwXrkDr9SKveOdTi1XSwYF8qF4
i0YVdvBQY4rwnwO6SeIIIlVQygbuO5dcV7Xr0qW+nRmQ4AhHOM9EFetTqtq9jmrRUSl4WPma
KqtwMn+bV0sHgjQdVtGutVCvEnzL+7DYIzzgoewrmfCskR0F3U5wDtyPdq8t+LF9dZhEd5cW
0W5g3lSFc/KPT8apbGMVzSR7rdrZWtu8WmOxs+o428454wP5V4Z8Z7hV1eBJCeGjbb+DV6t8
O7NrfwCBK7zMJJSJJW3MRz3ryP4lyxan4z06BjuZ2hzx23Ed6mb5olr3Zs6v4M+DUv8AWTf3
yqsDI4HQkYCjpg981r/FbxNDbBrGydiBsOSCOeSfSusaGKw0yOCM7E+9uAwep9K+d/FGoM3i
afzHwoRQOvoDWUn7OF0aJ+0nqU7WOQQ44Zzzgnqf85r3j4c+DE8JaSl7dKBK6A5BDZ3KvPA9
jXHfCLwK8uuDUr9QbUo+0bg3BAxxg881v/FjxyukabJAN3Dr8qg9NxHqPSppxUU5M1qys+VH
D/FfxcnifUnt7aR1SIFSCCv8Zx3/ANmuFibY/OR7VUj1aGdZJU3vk5Ykc5q4AxRWOcMM15tS
bqO5vGnyI7r4MyGXxbFjlROiNnsPmzXqvxUH2XS72OLmGSFmcnsc15R8G4v+Kk2DIZ7lcZ/4
FXqnxPn8vS5LYgEmNs/mP8K9KlZ0m2cte3MfNyMBNdYJOZGx/wB9GpfLDJk9qLjYt7Oo+UiQ
/TrQHAbk15E9G7nZH4RqqDkfrSMBj3ocBmbB98VGFYZ9Kwv1Q0r7js4JGM07Kg4Y49hQHU8C
nb174z9Ku99WgYTsytGFOAXANfUngv5PBNug5Pmuf1NfK8siCaONvulwQcd6+p/C8Dt4Itpl
wFR3z68FjXsYVWRy17uB4B8WznxekeNsxjTP02t3rB0uxm1nWLews1D3Dhm2sdowFJ61t/Fh
zceMYZQMIyKPf7rVhWF7NY3G6BjHIQfnBIP5isaqSqu5dH4Lo+pPC+nRfC7wxPNcRRpeYUBl
UNhTsGMjHdT3r5s8a+O5fHGvyxIHFkCzuZODuDNwBuPHzDtXtPhrxEvifRVgdmeZQCu4HkAL
3OfU1wXxI8Ny2sc13bIpbgAAgdWP0/nXbL4LI5lHln7xd/Zy0Ky1W/u571TIFmKqMA8eW3qD
6133xe8Zav4c0p30+9ltgvCgSuo++o6KR2NcL+zFMIrG6H3vMnyxP8J8uuj+No8jS4yQGGDw
ef41qqD5YNk1376KugfH2wh8OeVrc09zfSIpQNG0g+6NwJLeteceOvENv4j1OO8tYUt0CsQE
j2bskkE8+9cZJqiRGCIZkmZQEGP6mrcaS+WWkQq5GcEg/wAjXnVaspI6oRimmes/s+KINeSd
wMyM+Mf7so/rXUfG3MPh/VnXvHK2PfiuX+AEQfXIYycks2Qe2RJXT/GkiDR9SjY5ISUfTpXq
UU1SOev/ABEfPGlZe1iYgByM47da9k+GvizwVottFHrMLS3u0bgbVZF3bieCR6EV5BbuGtYy
PTj3qpc3UTCZfLzIgOSQPSvKovk2R0K01Zn13feLtN1zR7geHLbyk2ncPKEQ6MB0I75ry/4a
aTeaT4znmvmVpsR8q27gMp/wrvPhxOkngp2j5ZDndj/alrEs43/4TF5CeGjyefQx170XzQuz
iklGTSO2j8N2viq6Ntf/ADwuMMCAcjoeoPYmrh+H/h/wc4bTx5MwYMECKAT1z8qD+6K4r4m6
jJpWkXH2Fv3/AJTMOSP4W78dwK8t/ZtvbzVrgvfX9xdS/aekkrMAMxY+9/nmnKyZMY8yZ6z4
71iTRrGa9BI2FATz3OOxqv4e+Mvw9m05X1Pz5hzuE1n5i9eOCDUfxtmih8MTeZhT5keQB718
0MIvsO8oixehXrz6VhWq8r0NKMFJtM+6bLxV4d1zw0X0S08iDahQrbrEMfL2HsRXkMmX+IVo
FyR5Lkj/AL7re+FFuY/h3GyqAp2Af98R1h2syXHj6OKFszC3cngju2ea35lyEzhyy0PVr/UP
CehWj3GuRvKf4t8CyqDkA8Yz1NcnPdeA/GOjteaHpqNGMDzFso4uTg85APQ/rXPfGuXztNkK
KA+O/wD10Wpf2e4IovA2pRsoG+aNlGP9hacpK6RmlueS6nZXXw98c2l4P3NvO4c7Wz0Zuy4/
vCvY9F+Lfgq7tlXVopZ3VAkoktBIrfLz1znnNeafHyR7jU9OV8AqhUfhIK8qvbdHhLFArqw+
ZQPUZrgnP2M7LqdlGPPDU+5/D/irwxrPh+dNBtPs6CE4xbLEDw2On0NfM3xzkU61beZnzPPb
y8eu6PH07V6h8DYA/g2WYceVax4Prw4/pXO61p1r4h+Jek20zqXiuGcpg5J2qw6gj+EV3Kft
IWsc04cszN+HFh8UNciij0vbHYRomxmvSn7vOBwJPT2r13WvB00WgWk3iJ917tK3BR/Mycep
BzwPWqniLxZceGbOKG0kkgWI+TtiJXoPYj0q7a3kuqaDDdTEytLEXcucnke9UoqMbCnJz1Pj
3XY0tPF+pQhNqbUKHA5+Rc/qa0vDHiGfQtWS7RztQqSyk5UBgc9R6Vn6+M+NdRbcx+RByf8A
YTpVjQtDm8W61DplgAziRPOUtt+ViBwTwTzXgub9u4+Z6NL+GfSC3lv4+ha+04Ga2wUkaQbS
COvB9iK8F+I/hS58M6g07xqlrIFGVYH5sHsPZa+no7Ox+Efg+SLzEjaMSSDahO5iCw+6o/u1
8m+I/EknizVX1ByzQSRhFSTPGOM4yfeu7EuMaSb3OSmm5+6Z2mF/7Zs+Ofmwf+AtX2NaAN4I
swRldzZ/77avj7w+zDxVYjPyhXP/AI41fZejor+ELcY4Zmxn/fP+FPCPS/kb4nSB8aeKbhov
GE8JOcq5A9Pnb/CqDduKk8XS48ZzLgFgX+b23tUEk67eDz715eJd5s2ov3NAkYk5zgVKDujM
Z5VqglJLDb1p6cHBNckVe1jZnZfBjwdb+J/HMFpJtEcUiEq+MDhzkfKefk/QV9G/Em6PhnwJ
fW1kAFtoGjJ6ZxtXPGOwr5++EnjDR/BHja01bVZJI7eNkLBIy+4AODkDr94V3/xe/aU8O+Lb
C80jRbMYu4mg857Py23FuDnd/SvboT9nG7OOtByaseAQ3s97cX1xNkmaaQ5z6OwHehjtINKI
zBFsJ5ySfxOf60mQev51486nPK7OmCXKSKQR9au6Po11rWtWVpaBWLOrShm2/JuUH/0Ks9Y8
sD+Vem/s8ATeOZGkXPlvEFzz/wAtB/hW9G0pDmuWLkj3rwjbWXwi0wXMsMYunBBCoGVAGLcY
A9q19S1KbxFZyyvIzI6nBYnrgjvmuT+Kr+ZHIQSRu4Hb7ldJYoH8L7X6Ybn/AL6r6KC5fdR4
s9btnyjJ4rm8IfFeeaKNXaTyYm3AnAIjPYj+7X2L4DzdWL6jqW14UR32n5j8pHY59DXw54yT
zPibHGveSBR+O2vtG7V49CtYlO1SGBAOOrPXPTspu50SVqUbF288WN49jm03SSY4EYOc5jOQ
AT3x/EO1fOH7TPgpPCSWsySKbuTy1O09j5nfaP7vrWRrnxF1bw34mvLXTWKNsWQ4ZlHKqD0Y
egrkr/Xr3VyZNScTTkg5JZgMDA+8TWeIxEGnFjp0m7STPWP2YPGz22sQaPNHGSI5CSyE/djU
dc+3pXsvxn1efVvClwsoUSJKgUjPADfX3NfO/wCzign8d4TnIn+Y/wC6K9y+LUg/si4eM/Lv
VWHvuJ/wp4bWlcdde8meBfsoNHH4wumlhinXcOJE3f8ALOX1r6M+K2uz/wBhXFqAsMbNk+Vl
c4dff2r5h/Zw1610TWryS4LBWkGCq5P3H/xr6H+IzyanbNFbAMmNwLcdWH+FXQS5ZXDEapHh
P7KnlQ/EDzZYo5X89CFddwJ2yV9KeLbUeJbu7glhjWIs8ZVVA43H1zXz5+zR4fvdM8cXctxA
ESCfaGDKeiSg9/pXvNx4gt4fEn2En9/cyuVG088nv+Fa0KfImZ1LsnbUNR8KeFms9Ds4JJ44
tse8BQCDxkhl9TVjQdD8ceONDzqEMNukicolxgHJPUbm9B+dVfFPjebwNoGo3oXIgiLnaCeB
9GHrXz5q37Xmt3SXMVm8sMRZkz+8U4Bx2l9jXTKpGEXcwipS0R1Xjmyl+EPxC0y5WK3ku72Y
wTlhuAAaI8EbTn65r2zwzPNNaRa3cxxPBPEJFXGcd+AenSviz/hKbjxb4t0rULud5pZrpHKs
zHB3oO5Pp619mQCRfAmkIuBusiev+yP8a46bjKo2jonFxpmhceIm+Jlu2n6INqWoMkuR5XDc
c8896+b/ANojwTJ4Intmby98svljYc/8swfQe1c3D8Tte8Ga3q1lpMjIskaKxEjL8u3PZ17t
6VzGva3deI50udRmkkmByMsW5wBnkn0FY4mtG0oBSpNvmTM3dtYqelNPzZApFYhSAMk81Iq7
Rivn5rXU9VNWOt+FfiY+D/GMN+kccrSRSRbZULDlc9AR/dr640KR55W1i+ijFkylfKAyM8KP
l5718U+HYivirT36oA4I/wCAPX2TemSTwlBGmBn/AOONXu4CKascGJ1Vy1e+KY/G9lLaaDlF
R/nbHlH5eo69OVrwrxV8FYX8eWSiKGOV4mkk+7z/AKzPRfXFcg3xXuPB11fadpz3CyPM7EIS
oxuwejD+4K2PgVrmoeLfiXLNfyGQGKdNrsWxghu5PrXZUnGTs0Y06TXvXPoM+IJfDGjQwabp
9uQFAciMKSQFGT8wzTdH0vxb490+S8hjEcEeFwk+wnPPdj7Uzxd45/4V7ZNcpAsysck7M4+Y
D+8v96vEb39s7U20trazia3LhcsEdSMEdCJq3m4wjcxSc7l/Xvg/cD4n6MJvJEQHmShXH95/
9nnpXrup+IYvA3hs2Gn2sKO8QQyCLBLYCA5UivDf2e/Ed74t8b3V9qTNKxn+VmYtglZGPUk9
SK9U+IGf7Ut0PK+aCP8Av4MVjDls5o0mnC0WdH4cvcaJ9rv7a3nl8ozFnTeR1Y8n2x+VfInx
d8UXfi74haxaPIUsLadhFGCwCjAPQkj+EdK+rzMsHhK5b+I27dvrXx74tt2i8eavdnHlyS7u
PZfSs8U0oMdFtTPe/wBl7WY0T7AIIZp4YhhpY84/enHP4iuq/aJ1RbzwxcwrBDDOol3PGm3J
8sjrmvNv2W5Fn8Q6q6jASEMM/wDXSu2+PDi68O3nZx5wJ/4A1ZYZL2dzSsm6lz59/Z50SDxJ
4iksrqTgCMqTz1kA7g+tfXur+LtE8A6C39m2AM6hgzmBPmGGYcgqTXxP4VvT4dWO+QbSPvle
uA2e2PSvp3w94x0rxrpMMSz7Z0J3b42AbLEDsanDNRdkaVE5ROn0b4s6V4q0QXFyEjV9yunk
NjAyDxz2rw7xH4m8M+CvGcmqWcH2i1kRPM324IBGM4Hynog/OtL4jfCSAvcXVtMYbgR8RQuE
UYU4P3Pp3rxPVFGm2klvLzOynHfkg45qcROUNWKhCLZ91eBfiO/iTwwl3EqNYiRlC7GAyD/d
J9TXBfH3442+iXS6fYWqKGEfzLAV5+Zj0Ydh6Vd+Di+V8KImU7pDcyZJ/wB6vFf2jrtF1hMn
aAYx04+49dc6nJR5jJwvWaOd+C3hi++Ivjy5Uqk0sonYCV+Oobvn1NfWOoeILTwDoYjtNNhd
4dqOwhXcT9085XPQV4H+yBHHNrdxIW5QzDd6fLH/AI17p4z+Itt8PdOmv5bdJjvCndFvPzHH
HI9PWowcVKLkx4iTUuUufYfEPxI8PR3Fnp8Uca/6za6xnkKw6ua8Ig0vT/hf8QpbHVIFkXUQ
1zwiybSDLnsMdB61r6j+23I+lm1tbZ4VbB+WFl7j0m9q8g03xXdeMviJYXl7mTesmN5J4KyN
3J9aVWpHYdOErtn2H4a0rTEt2udVsbf7M2HjxCrcYz0wfUU/xRbWXiiOLTdAsoQrRmIjyliy
f0HQVn+NopovDsyxtgRW3r2/yK8J079oZ/CWma7o9qJTdvMV81VIZCpxw28YHBrpc4wpq5z8
jm9DjvjF4YuPA/iuWO4RVnnlZVjRgwJAUYOMf3hXefs2+CG1rWYbnUbVJIXJba+xuiy44OfQ
V5XL4iutd8fWPiDVGM9vFOLiVJiXJwB2JOeVHevqv4S/FiPxHbiy02COG327CREYyMB+nzeq
ntXFThCdS6O2TlCFjlP2i9EMvh1rTTbKKM2xnUiNVQkbDgdq5X9kyE2E2uRzpsn+yhSODg72
7ivY/i98UE8FeEmeO2he8lEqhzCSSQjHk7h7V5v+z74ifxjqmtag6LHcPD5kgUYH3yO5Pp61
0VIRVSPc5KbfIzd+I3gDU/ifosenWgBkhZmyZQnVSOpz60nws+C958J0lu7jBnnjMbESq/Ri
w6Adq0vFHxL/AOFWaY+o3ALQyKw4Uv8AdBY8BhXN/BP4oX/xXub2WfzkgjjV0ErHBO4qeN7e
ldLsmrihzcra2OxutY0XTDHHqkIkaeQRITCHGW6D9DXN/EDQrHXNEmsrS0SH5TyEVc5Vh6e9
c/8AtD7lsoin7sxlZARxyFkre/Z115viBYqrpvlgLtI0g44demST0cfrUS5ZSsCTtcofs/8A
waXwxo1ze+JoE+zhpNhykrZJQDPyn/a/Su60PxjpOsa2+laHbrDaohdisIiy2ATjH1HbtWZ+
03461XRPCjWemWpeVWicsCFXBZs/xqfTtXA/squZILma45lVpcE89ox/U06lONPlt1HGTqJt
nqHiv4NTePbFxO8ewsP9Y44IOeMqfWvHvF/7Mg8P2hn3xHBChY5F4yT/ANMxW7+0Tqmox6fG
bW7ks2MifNDIyE8yehrt/CkIvPBFpe3J3z/u8s3zE5jU8n6k1NRRloyE2veufLWgalaeHdcm
GpqPssDshGzeTjcvT64r6L8H/F/wpLD9m0zTDvfBG+0RQfl9m9BXn9r4FTxP48numhhNvbs6
MGAxkmTtg+1e9WGp+GvAkaWUVnHNPL8weS2VhwMHnArClQUJHTUqcyR5n8V/B0t9od5fNaQW
08cDOqRBVB5zz1/nXzYHMkkke0K8TGN/qOK+yvipqbX/AIRvLmTpDbHbj3xXxlBcPqGu3kKA
edPdNHGDwCSxxn86wxtLRWHh5Sd0bXhLRLjXvFGm6dAiuZZVU7iAD3HWvr6PT9G+FnwxuZ7y
Mf2nHZlyiRhwGGTgEAf3h3rl/gh8O4/DXh2HXdW2xPFGJw6EMc5fPRc8ZGOa8o/aU+K/9vvf
aVas5jjcor7WXIzGect3C+lKlTjShdlVJuclBbHpXwz8TS+Kba91AnbEWd4xyDjzHxxk+lZv
xY8Ca18RbaCDSVjeRJNzebLs427eM+9Qfs1of+EIKsoLPbhgT6lpD/Wus8VfFofCqylkmRWa
XKIPLL5IUsOjCuyk+alcwn7srIr/AAp+Her/AA48PPa6ykYnkRlDRyiQE7nPX6MK0b+30W92
RauHYK2YFCBgH/EHFVvhz49u/iJo8t1cBxtjYgOTgHcy8ZZv7tcB8db6Tw/Y6dcQyNvFznIJ
7Jn2rXRQuZ8rc1fqXfiH4NtdVsJ5dPgEc/ksqhgqjO1sdB64rW/Z/wDgda/8I7Nf+IQiQwrM
2UKu2VKkZ+Q8YzXVfB3W7DxRbR3/AJYuLdWbd5seT8rLng1S/aD+KX9i2E9tp1uY0aPdtt02
Kco+cjcPSkoRkr2KlKUX7NHjXxt8d6f4fnMXhRXgu08shvL8rgg7uVK+1eq/AnxDqfiXwf8A
bNRkDt5kgYBmPRlA6k18nefNMjXt2GadvlIJ3H+ft619U/s1gjwh5fbdKT/30tebSq3q6bHT
KNqWpw/7RUIurNgcbA6EA+m58V4o/k/Zd8qBsAdVBxXtP7R0wtrOR3+XDoOP9968w8H+Hbjx
Hq0LbVazeMkgsB2yOD9RUYyLlVVh4bSLbPQ/gt8Lj4ynMr20CwjaVkfbkAoxB6HrXd/HTx9b
+DdLi0+3lJmWPauEbHyuqkZ47A16BNqll8LfClpBHGn2mSNWbbHkEgIp5GPeviv4j6tceL76
4vd5NvGzBTkjOXz0JPqK6lahTJS9tPXY+kfgE23wtcXcvLNsk3dT80YrnvjZ8OdW8f3lpJpY
QzpuVTJKExlwR/Wur+Ctt5vw/Mi9UWLGe48ta2tc+Ldh8NbGea+J3FS6KsTPkjjsR3IrajJu
FyKmlSyF+GPhe68C+CY7XVFU34t0QlWDgsN2ef8AgQryT4/TMLW8kQ5OFbB7cx17P4T8Yt8S
dPTUkTZFIokUEbcqc44yey14v8fG8nUJ0H+qzhx+Ef8AWnWS9lJmbXv6ni0DmWKJl6lRk/hU
pwTtPQUqIoAK/d6gHtTsAs30718fO7kz1ubQruSGAA4ppU729AKkCkZ7+lI5IYE8Vqn7ti1c
DkJjA2mo1Bj5IzUhXcvtUe4eZnOBWZOjJFfPykc0xnXO3J+tN46knHTFTLGOoHFNWsFrrURs
BQe3qKiZ9+CVwPWpZZAq7TwBUcxx8w5HvVu0UFricRsM8D2qQ7cg44IqLkqQck+tSM3ygL0r
Pn51qUxnHbgZoUEtwec8UrjHQ0isWBU9KpS6Ax2XZvpSFlU/MfmPanHMa5HT3qJjvBzjNEU2
Jq2grg5z2P604OEUtjtSFsxAUq/KvzAHjipbvoyLdyCNhIT6981NuAyBUaqSeAM96JV2kdqJ
tPQ1STHKxLe1Eib1JPWkVepHSmgmReuFzTTVjOURjgcHvTomEjFccYpzR7CG5xTt43FlH51X
MmCVkxoAQZJI+lAk2nB5Jp27vj5qjVVaIg9c1EpdxxH5GCdxOKR5wU4HT2pAybQBx6nFO2ll
JUn0qOZ7lPVCF2AC8cjNICMU3d5Zy2TUikOp4PPenJ8uhEmMZyTgUm/5sAdOpoc/MSfurSYx
kjIzWl2kJ7A/POevamvtCA5OT6U6ViYwo69zQNuApBBAoXQpLQUAZ4H1pY49rkk5GKbnCjrj
3pAVU5Yn2qeazsXf3dRzvuf5ACvvUjHaBu4BpAQDntik5YYPy/ShuzsTYfCybyRyT0zSOSWG
Bg0oIVfem78Z9apJImwrEAEk5FOkKomBwT3qAguTtzStFzlvpRe+rK0JDjOMjGKjc8g9hQQU
IwOB3NKp3ONvJx0pKTeyG7PVjniGQQTkc0Kc8DrQZMOvcdCKR2CN8o5PODST1sStbj2ibAOM
5pjsi7gAQ9OKllz0bFJ5LNjJ/I1UopEpW3GrKoUb8nNTB/lKqABim+UApHB4xzQG8tNrDjti
pk9Loq9xI90RY9TjqaIWc5JHTvT1AXGeSaeyEpkcUN824cz2IXUl9x61KAXUlQMVCDk4zxTt
wB2549aqysaNjs4HHWnJNsBVuppAM/KBj3PWljYGXB6gVk11JTvoKWLqQOGPepxwgyeR1qry
X9KkK5bHb1NUveBrsIHILADBNPyIjg96jETIC2RmnGZWX1b3rRbaFPXYI+5PHrU0ahkOOlVw
uPpUgkEQ68GoknEGmyfICkfnTAAGz37Ugk6HsaDJgjgUruwvIHL5xtA9xT1AUAjg96YHJbJF
SA5bJ6VPN0I8xVRCcnNKw3nd0SgyBxxnj1pFwRj1pvUdncbJBnr0pgUiT1FSbflOTTc8r169
RQtfduDbNqxVSmDnvV/cpTbk59az9PIdQB97J61oTLxjHz+nam7K6IWruyhOx3kCkEWFOOD7
Uo3Rzbsdafjndn8KmJdrBEMHBq2JNh7EVXjO/nsKeqMHDDgd+aCty6kmHC8c4q0iLknvWfCC
rcfrV2EnI3DNQ03qgsamnt86Y5AP5V6/+zfLu+M+goRgi7jPHf5GNeSWKkldoG7qK9i/ZjjM
3xc0uQD5lu4g/t8rjj8q8+vK0XY3gfoc3UUlK3Wkr0KGlNHPL4mFFFFbkhRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVx/xeGfh5
qeTgfus/9/UrsK5P4rp5nw+1ReufK/8ARqVz1vhQ1ufnJp+GtZlY8iU49+lRznceBkCjSpWl
tLgMowszAH8qllg2ZOa3TsRJ2M5oyucc+tROARknGKlkchio796jddqnnPvQQmVmIZjzwKZw
ScHipywUYUZNV5G2kZHJJ703e1wUrsikb5iPSo5W3x4+7juO9PmyxwBnHJqKdS0WCMcce9Q7
v1G2kZkkY3feyPWnWzJPNGrH7rBgcd80ssZibB+761BHJ5T8d+laUpcujE5XPcvCUKapZpb7
tnJ5Az3x/WpvFvwvikjkujqDoQuSnlDHAPvXiElxcyoVju5rcesbkf1quEuiMS6hdSDPeQ/4
13SqqUTL2bbvcuX0HkTMmeFwc/hUIbPbikbcr+uBxSOxxg8D1rgbvI1t0BFLnHT3o8zj5une
mRnadwY09vmY1CST1G1YXzAnSowpdiQcCnKuMnHHrQzYZR7VadloJWvYaGxuz0pFKHoaeRlc
joaQQ8N2P86LprQvYBhyQOtRyEqMHjtUgGQBjGKjkU5Izn3q42S0Em0xNpz8ufzp8eCT2Yda
W3yqtk5prqckj1yRS1loVJ+9YmVy0gUjI6V6L4J+Fy+LoGZr17ZMfwxhs/MRjqPSvNI5CxPy
jB71Ykv5zCUiuZbdsH5o3INbRcYtXMZp20PpkeEdF+G3hg27XTzzFmYfutnBBPYHuteD+NPE
javevsOyEqOAT6H/AD0rkYRdjIm1S9uM84eZiP1qyh8xTmuidRWsZ+z1uy7oqiXU4UkAW3O7
dj/dP/1q+irXSfB+j+Hbe/YfaPmKGOSIYJ3N38v0FfNEchxhSVPqDUU8c8j+Yb25yONolO38
qiNWMN0VUg5q1zX8QzJPrErwRiKAFtoB/wBo47Dt7V2vgLxbHM/2a5YsgBB5PBAHPQ15v9oM
ud3NTrO9sMxMVb24pRr636F8mlj6jsPhlpuoIl3LclsjKnyRkAjPU/WvNviz4rg8NJ9l0yQz
4BUu25cEOB0wO1eOyS6lKD/xNbtE6/JKwx+tPs4TboweeS4LYOZjuIruWIijn9mfT3g7SbTx
HokQkvjHMwCsnlFuqA9fzob9nnRr3XItQu9RklRCSYfs64Ycnvn19K+ZZri6LEwX1xb9c7JC
B+hFQNc6iQVOtX3zcZEz8frQsRF6Mp0tT6f+IeieDPCfhu6igT9/b27fL5KqSQAeoj968Q8B
+CJfHWpXU4me2tJJj5e3DbFLOB1I7KOwri44p1kDXF/c3R7edIW/nV0TzpEUine3/wBqNiCP
yNc9SrBtJDjDlvqfTPhr4O6L4E06XVb6/klZ0+VjAASRluSAT2ryf4reLku3ksrB28oSMm4l
gdpXGegrzYyajLIVl1O6eMdAZW5/Whk8sg/fY9WPU03X5VaKF7PmlzNnbfDTxQNLvG06cmVC
mNzE9C3Jxz/er2mH4X6b4zto2uLo+WjiQKIQckZHevmiNipOxypIxkdaimk1BzhdWvIx/sSs
P61cMRZczLnTUtj6J+IutWvgOGbT7GTzYY4i5DAqQSrE9BivA7CM6r4ltL+4lMY8yM4+8Bhh
/hWegkkOJbmeZu7SyFs1LHKUbIJ4965pYlvbYmNJQXmfUWvSaUdLXffFIGxjETZzuPt7elfL
3ixBe65clCSiqoGOOcD/ABpk4ubiXe95cYAxt8w4qQEl9xNXPFcyskKEOWTZ9FfCeaC60CGx
e9YzsgPl7G4wiZ9uxrR8XfAGx8XXUbPqrwoJC5226ns3HJ/2q+YJpbtP9Ve3Fue3lyEfyNEl
1qiLxrV6T6ec/wDjXSsSoqzRMqfM7o+utV+HvgvwXp8U8y4cKPlaBCH6AniP3r5U8bXsZ8QO
1pEEhcuVTPA+Y+w7Y7Vhzw310QLrVr2c44zK3H5k1ZjZhsBdmIGAWOTWFWrGTWhcabi7tn0J
8H/gn/pVpqN3fyRTJIkoTy1YfdzjO71roPjrZ6dpGkyWrXjSXctu5QeWRj5gOuPY96+WLi71
Ri3l6vdwZ6CORwB/49VNbW8aXzrrU7u6ZeR5khI/UmqliFGLSQOj7R3bL8kYidwW3HceT9ai
8wKW4BBppdmxmkLflXmNubOm1tCRxuUYPUUzbsGcn0xQqhuSeD7U+QbV45Heq23Gm0NUqVyo
pVIfPyjIpkZEnGSuKGJiYgjr3o9AZZiiVzkqGZTkZr62+H2kw6x4Et1S8KJ50isPLJ5yfcdj
XyEJXhYEU+W91F5N8WpT2ygY8uN2A/Rq7aFZQMpw5o2Peviz8HLWzuX1Q6lJI6qgEZhAHdfW
vBJtqSHaeKhM1+8m6fU7qcH+F5WI/U0sxYtkY9Kyr1VUehMIOG7Oi8L+JJNG1FJVYocMOGIH
T2r3xdOt/EmjR3BbYJSpbavQkbuM/WvmPJQbx1pftl4kRjF/chM5wJW/xranirLUqdNVNT1X
whqVl8OvFF1pVu5uY5XMwZgUwfnXGAPRRXqGt/Cg/EvSdl5fy2cUgBURoGyCQ3c+wr5aSaZV
3CRjIf4y2W/P/PWnT6prIQJDq91FgfwSOM/+PV0RxCXQ550mfVC/Crwp8KfCxe5xe3EcQKPL
AnzbVCjoh6k+tfPHijVF8ZeNodN02zjtYnkMIaLAOWdhnovYCuU+2axeOGvtQuZFTohlYgj3
yxqzb3j28okjO2QfdbnINYVcRGWiQ40nF3bPqX4IfAyPwvs1SfVZZLnBkKPECFLCTjIY9N36
VufEf4Q2/irTb9ft7RNIr7pEhGecep9q+QG8QeIFkcDVbjyznCiVwB7D56hbxF4huA8Dapcx
wnhtsz/MP++67FioqNglSbdz1fwx4S0fwX4nm0S/uHvVVfkmaMAj5lPTDf3/ANK9UvvgxpPj
TQWiguDZxzxMBIsCk4ZSM9uRXyrazz2Ykf7RJJM//LR2JOacvifxHGWSDUZIFxjcjuMj8HrN
VqaY/ZSa3Pr2y8B2Pwn8AS2i6g1ypDBWeHaxP7xu2f71fM/iH4h3N/4tsTDGsUVtIC7IzDcp
MZII/CuSN1qtx8t1rN7Ovo0z/wBWNP8AN4IHP1oqYzTligjRUXdu59T+G9MX4gW/2ksIY2Yo
Tt3cjA749a6Xw/8AC7w98MNPuriOY+YqPIf3KrngH+Ff9gV8gf2/qsS7IrloEHdGYfyas+6v
tVvpN0+s3rIP4RM/P5sferWLjyidG70Z1nxI8YXPi/xh/ZiIBalFfhzkkKT3wMfhXong79lz
/hJ5onvb+a2U7sweXHIvA4P3sV4paXH2a4E68vgjcev51pt418TSp5A1q5gh6jy5pBj/AMfr
njXTlzSK9k0rJn1R8Q7jRvhh4ZksbOUsqMiA7CmMHbn5V9Er5s+GHjafS/iIb+6jWQzpNtVm
JHzc+/oa5KZ7uSXzptRurs9DHLIzL+RNWFuTGyuo+Yd60qYrmtyrQIUeXVs+r9U+Hk3xFtJk
muJLO2kIKyR4Y4JDDqfYfnWr4J+G1t8J/B95FPq0l+jOjF5YcHgKvGCa+SIPGPiOw+S11KVI
/RZJF/k9UtS8Qa1rU4e81S7VkBACzvhvrljXUsVG2qMZUG9EzpPih4ouPGvjfTNKhURxu5iU
qxzkycdcDsK7nwT+y7ca7d209/rNxDArq7QeWrqwxnB+fp+FePxXBjkjm4M0ZBV25IPrmtZ/
H/iWCHyrTUpoExg7ZpB7dnFcX1iLnzyOn2UowtFn1H4wGj/CbwLc6fbTGSdLZkA2FM4xn7q+
jHvXzf8ADTxyYPimmr3qCSP7WXiVmJ3Lhx6HGBjtXISz399ctcXuoXN08h3MryMVz34JNSxX
BgddoC7TkEcVrUxadraGUKXLufW19oEvjkjUAv2e1nfz49uGz7YJH8quTaFeW+lLZW5+WNCp
YYBAwfevkxfGWuQo8EV7IsGMKPMfgf8AfVUI/FGuqZYTeyCNyct5j85z/te9WsbHluT7DzOt
+K3gyTSdSs5Ld99xeSiL7oX+FQOc19FfCT4U6f4G8Py6zqF0ftBQhD5K9VZ25Iyf4RXyDmUy
JLJcSzyxsHRpGJ2sOhFXdW8U6/rcMUN1qs4ijJICSSd+vVzXMsRGU3O2hr7N8vLc6v4t/EG5
8T65NaJlLYRpuYSMf4TlcHHZs1wXmCO33EAIAeBRK5ds9SPU0EFF5Fc1at7SV7aG0aap6I9F
+F/wgufG95bX63MlvZkSASKFJyAR0LA9T6V9c634GtvDPguKKbUnCQyYEnlcnLE9ifX9K+F9
M8Z674ftBDpNy8CKSdgkdRz16MKrar428U69IP7R1O48vA4E8hAxnHVzXdSxEacNjCtRlU6l
XxZIt342unix5EQdAcfeIkbn8jVURqQXboOMVJPMJWJP3s9ahBHJ715VWpzyvY6KceWNrjnP
IU96BGTkkYpjkJ33H0p6KVbcxIA6Cs4ycTRO56N8BvAmnfEzxadK1B9tskgGRGrN92QnG4YH
3B2r2X4n/BTwX4I8HapNHHtv4Yna3cwR5LLjHKx8fmOtfMum65eeHrkXenFY5wc5BK+o6gj1
NQa1rGpeILkTXWoXGW5eMSsV65I5Jr06dWMY6nLOnzyTvYoQBszSOc7pZMA9gHIH6YqQ4bJp
D8iYzkdMmoywQZBrzZxvK5slZWJeVwR0rvfg7rQ8PeK/tLqGR/LODns6ntXBRzsyn5QBipoL
+S0YPGfmHI5NdFKfJImWzR9f6z4an8YEiEFbcENvBHpjoSPeti+0rUbXRlt7eEORuDHeBwc+
/vXyNB8V/FcMRgjPlRnjKzvx+Af3NR2nxC8Q6XHOBqUknmrsJaSTOOf9uvaWLjbzON4dy0ud
L4w+Fmqf8LKsjaoZd5gcuxQchgMfeHoK+yLnwHNdaFEWcqyRuxwBxgt718FWHizVrG4+1Q3U
jXHTJkYenfd7CtpPjV41gWTN2zxOpVlM8vQ9f+WlZQxMFNyKnh5ciSZZ+LHgm58Ma9JeysXi
lVE3NtznB44J/u1w0kqxAu3AFT3esXF5IHnkaVj3Zicce9Qlg5KkAr3zXnVqinNtI6KcHCNm
e4/sy/D7Up/EsWp2677eSOVhkqMbkU/3vQjtXt/xN+H050KUxuWMzqWBC/Kc59favkLTPiDr
3hyBI9IuXh2qBxK6joBjhh6Cmax8ZvG+rFbe/lPkev2iQ9M4ODIa76ddU4WOarSdSV9jIi0W
bwnrN7bn78MhxnA4yy9j7V9EfBTWk+ITw2F9cNBJwqEbnwBGWxz/ALtfNpkaZmbJyx5JOTmt
LR/EV7oknm2UgidfXdzxjsR2rmhiGpO3U6pUly2Z9y/Em20H4S+DtVmgG/UhA+wGPaSRhSdy
rweSevavk74cfEUax8Ukv7wmRFuWVcsx2g+ZxyD03CuM1jxXq/iC4M2oXsskjEnYJHK8nJGC
xrMscWmopeKu10bd8vHPP+NdU8VayRhTocmrPrnxZ4X1Tx3ouoW9rGRb3cbCNw69G6cEj+lY
Xgf9k/SbLSvtOv3cks0atI0PkRkcljjPze1eHQ/GvxVoiCCzZhAowh+0SLgfQMPWo9V+M3i7
xDYvBcXLrbuu1sTyE4/F/b0rX6xCUbyMvZSWxteJvDumXHxYs9B8PWWP7OvVV5CUXeN8fbau
MHI6mvrseBtQfwVp0JUxvDaKchlOQUzjr9K+E/D3iC98MTz6hZSSSX03LO0hUk53dQc9cd66
T/hf/j6ayktnkZICNozdykkYIx/rPQ1nDEQi2yqlFuNrlP4oeELnwr4kF1cIRHeHy1OV6hU9
Ca5AfvGIYYFaWoazc60Ve9maWQHIBJO3txkn0FHhvQLrxZezWlgMyKBknHc47kV5laXtara6
nRBclOxmNIA2FGc05W3d69Jtf2XfE13EZP7QmjJz8o2f/Halh/ZQ8UIn/ITuMDtlP/jtafVZ
WuL28Djfh3ol54i8a28Vpz5UbsVOMH5TzyR/er7hn8FamNBi223KdR5iY++ff3r5Tk+H+vfC
+N7wznIO0yHAb5u2VfPasGX9pbxlHu0gSFYz84f7VL9cY3130m6MURNe2VkVvH/hO88JazLc
36gCeRthGP4mYjoT/dNbP7PmrW3hnx+9xeA4aOZsg+uPQH0rjtT1a51ybzNQkMsx+bcSTjr6
k+pqjDdzaddLcw/M6gqBnFcMq6VW6NacLR5WfU/jzQNU+IWlS2WlnynJzvBH95W7svZT371g
eAf2Lbe20VZ9a1OeW5QLujaGJhkqAedzd815bpv7SXiPwtGYYrGOZG5Be5cYwMdAai1v9oHx
Z4utzbsWtIh95YrmTrkH+97V6rqQqK7OX2c4XUT0jwlfeHfCHxBbSdMVtzSFGJG3DjzFPAQD
tXoN1od74wv1FmgYxSZ5I/vbu5HpXyjpVtf6pqsOo6cTNeQOQVLbdzdeSSPU16r4Y8e+OdEu
7SJrVYo3kVfkuSCRwCeJPerp1OZNJaCqUrWbep7n4g0a60jw0/noCsdu6yDI4OMep7mvi3xX
Nv8AGetoSQjTHj0GDX2l4gkutc8IRXUxbzms98gLbvm2DPJPPIr4x8Twg+MNbDqMGXaT6cYq
MZb2a9f8yaHxnuP7IvhK8m1XUblcvayW42nIH/LX6/XtXofxx8Bard6NMIoMIWlKtvTkbT/t
V87eGfjJqfgDR47DTmKKi5UiV0Jxk4+Uju1Sat+0N4m8aotpdq0MMIOGS6kO7IAJIJrKlWhG
HKzapCUp3Kvwg8FW3jXxJd6FqVwbSRURkCxh87mAI9P4hXqWo/AJtPg3+H3ka+jy4OI0BIGV
HVe+O9eEaVfto+oNew5NywAL5weCMcjnsK7vTf2ote0HMcVhHdADrLcyfWs6VSEGVKnLdM+i
fD3w81658O7tVjUXTM4d1KkBf++z/Ovkf4229lb6/wCVp259qx+YzYHOCfQdiK6XxN+0p4r8
YRsj266faumxkt7mTHQg8bvc9q4Z7r7S/wAw3+rMcmliq0XTsgp05KXMz6Y+EviK1h+G0Gmw
g+YlxI+/JGRuz6e/rWx4g+AVp498vW9XcmAYAjMcbqcZUH5s9ye3avmvQPiJeeBrg3cMK3IX
IWB3ZV5AB6fia3/E37R/izxuVhmtEs7TaB5UNy+3IJOcFsZyfStYYhctpbBUpNy5keg/Cq78
P+G/iFf6VpjNGsXngnbgcMFxgIP7orb+Kmhan8QtBnsNPTbOGTaQw5Ctk9WHY+tfNOnXj6Vr
B1JWZ5SGByxGc9eeteo6X+1VrWlIsEGmW90UGP3k7g8DGf0p08VHWwqlF/Ejrfh7+xuLjSIp
NdvZUuVVVdDFFJn5BnB3HHOfWvOX0DS7P4r2un6Od0Nr50LnYF+dRKCMYHYCpfE37S3ijxnI
tuLKOwjQFSsFy+G5zyM+1YHgz4jz/Du5vJraBLiW7k812ldgVPPAI7fMaynUhzJIcYz3Z9oe
PPD16NBmtYYssbIgksvXB9/aviDxnosvhfxNcx3ihZLpmkTAH99vQmvQdd/a98TeKrEWQsIo
WVTHvjupM9vU+1eaa/r914jmWa/y83OC7lyvOTgnNLEVYzgopkUqUoyuzP35f2Ndl4F+KNx8
MI2mtbZLh23Eb3ZME7/T/f8A0rixJsAA6Cla4yMYx9K8uNVwbO96nT+MPiBqHxCimkvHMYkd
pBGHZtuQRjJNdJ8CfFT+EL6e1wNtxGIw2SCQX5PH+9Xme4nHpU9rKYZkdXZXB4KnGOa1Vdqa
lIlQSVj6b8d+En8XWcmj3K+YxDCMnaSGZcZGTgferofgr8FdR+HGlXV1fFi0MDEj5NpAdn6K
x7AV4jov7TOp+D41t4tOgvQvRppXB67v6/pR41/aZ8S+Pl8o2kWnRkMClvPJt5UL0z+P417K
rx5VJs4JUpbITxtrV58UPHsOlWf/AB6loQdrHuQp4Ygfx+lfQ9v9l/Z+8NMUtonijDswKBBg
5Y/cB/uV8u/Db4m3Pwihllt9OttUldmYS3JIZSdpGCOeNg/M1neLviZrHxJEr6jI0JddpAld
yAAR1J9zUKvBNzL9k9uh9Iar4gg8eWpvwiiCQheMkArx3H9Kzvh74RHgc3PkEyWUjEo7AA8h
M8D3U9q8R8F/Fe9+HWnmC3tI9RQhl2TuwUZYHOPw/Wppfjhry3Ru54BbwY2i3Sd9gPrwfr2r
RYiMkmxew5XZPQ9G+NVlfeKNHjaygDSwOmU3DBA3A9SP71emaHpc+meALOGb5pkEWSMD+BR6
nv714pZftg3mlR/u9EsZIwOfnkX2z0+lZXir9rXXfHGnnTRptvaWu8P5kM8mSVzgYJ9xWnt4
LUzVCVrHpfw31ex1GbV5IXxILxxsKnnrznA960tUtX1PVbeUD5E35/GvnDwv4nm8MXs95b7m
Erb2UyEDOG9P96vSbv8Aa3vrW2RbDR7KRyPmAaRMHj/69ZwxN7lSotWsen/EKZ73wvPYwr+8
e2Krz1PGM/lXlvwE+ESap42mvNaBjhivBtwEbn5yfXvtqpqv7UOrazEivpNrbSBdoaKV8/XN
c9c/GPWLqGTCGMEkkrO/Oep60q1eMghSkr2PbP2gPiP/AMI3Hd+GrRh5MMPlQnLqWASMjIHH
Ga+W9Qc38VzLIB5swLMfer+qa1Nq7mWVi7McncxPPHrWc03zbT9K82vX9o+VbHTRp8t2z2b4
C+LDpmmRaQVBlmVVDZOR87Ae38Y79q6j4oeBLn4h2ZtUmeK6gLNGVwcnbgdSPbvXgOlX8mn3
STI5TZg5BIzyD2+les+HP2n4/BdpCktnb3LABCXMm44OeSAa6sPXtHlYVaPM+ZbnqPwg8Aah
8PvCN1BqJMrLExaQ7egaRugZux/SvGPEhufjD4ot9GtnK2cMiuzqeX3bFwAxAHVuead41/ad
1f4kabLYWtnFZ2wBJkgmkB5Ur0OPU1R+EnxVh+FMd5cLaw3F5NFtDThjyGLDBUcdu9byrRb5
UznVKUW5Pc+nvD1/pvwJ0Y6fPaRNGA8mzaFADc9EUj+E1w/ieSDxL5spjEasuFA5xgEdxXz3
8RfiFq3xQdp76V7UkrykruTtUrjk+9dP4T+O9v4a0yXTLyzgnmG545Jd7EMQMfwn3701iYW5
UR7G/vvc4D4ieG7rwvq7vG24FU/ctjAyOuQfavpb9nWzn0vwQu6P5WmlDMWHHIPb6CvIx8YI
LzWBfazplnNbom0KVLc9uob1PavQNP8A2zLPR7RdOsdJtvs+4uTvkHPXoEHoKzpuHPdG0lL2
dkcv+0hpk8mn3GyMzbZl5LAYG9vWux+AXha007RLW9kO+6aIEIVGOY0yen1rF8Y/tWWutWDQ
RWtsspK9RKehz/dFYvgT9oIaNbKJba2yvHzLIc/KB2+lbVHF1EzKClytB+0/Hr2taxYWmmbl
g8uRJNsu3kOCOCw9Kg0v9lzWZNMW4nkleN1VsK0QHIHq59a75/2utGtG8ybTbZph0x5g+v8A
yzNZ/jj9tQ6haW0WlaXbMnlgPuklyDkdPlX0rWooVGmyUqkUkkN+FviEaRBqHh5UHnWreSTk
/wAKlc8cfwHvWR8Tfh6/juIyBmW9QbYjhSBlwe5H8xXllj4xm0/xF/wkMrfvGlErxFm28sSe
ep++fyr2jQP2otD0q2R5rK3MmBlwsgOccnOw+tc/tYtOCLlTknc7n4X6HN4D+HciXv7x4LMb
XOOSofPQnHUV84fFbxZ/wkXiS5ijxsWV9/J/2fX/AHa6j4g/tQXvjsS6db6fDFYqWSOSOVwW
U45IIH930rxsWwS8urkMxe4kMjZPQkk/1rmrV1CDgh06blLmmOZcjOcAelLFtYkA5Pv2pTkq
eKbGAD6Y5ryGlJNs9BsCFYkZxilEXy8Nx64prHc24DH9aWSIBgdxA9qytoF7DHmLH5enekkI
bnaAKcIcAkE470rcitFHTUvREZxyMc05AcYYnPpQkQUk7yaYCe/SlpeyIe4pICneB1oAypHr
URYM2DxUi/MflqXpuO1xJZRCoAGT60iy8c044Y/MdpPSkdSGBxjHFJR0HsLgbs08srgZ69qj
xtG7OT2FOTcSWPyj0p2JG5AYjPPpQU445PWnPGcMe/ao0k8vIxk96zfkWKxDDrtI4NRPJtcA
ZwD1zSz/ADhTjoaUJ5gHbA7VeyIT1sJKDkY6Z6VKSD97io1AQk9eOlNOXOGpSimitthZH8s5
HJxQp39OlJsG0dz6U6QBOnT2pO9hJ6kiPgHpu7U2VAUJxjFRSvgB15HSlBYMD1BHetIxE7tj
gQYyRwaI2LHNOG7aeMUD7m1uPepjYV7CkBcnOCahyAM9MUckjnpUgj6H9KHZalXGMDtHfNJ9
flA7Uoj8vJ3HFMOTnnimkpLUbV9R/Uex70rfKOnFRqD0BpzhlAX9apRi9EyZaCliMHaMetOD
qOp5NRKWGT6UOQw6/Nz2rGcbSKV+hM0YCgmmBFzz0FMG5eeoPrUkg3/d6mqlHZkt6iecnT2p
6jdgH61EIghC56c5NK7rIp7Ghu60C99hdwfoc0oUDooY+9RoNzY6DFSt+7AbrTva1xbIVXz8
vQimCYoxHWkDNnnAJ5pqN5hxgA+tFyrdR8ZDFt3U0obYT2OaUMHyGABXuKQx7+KrYTWthuC0
n61JgZGRwKR0UKACSTUaRFWPJ20tB2JHkCsAvfr7UByFz3pAqrljzSjMvTp/KptcocrAnJ+9
Q3zZx+VAi5OaiZSrNycdjQ0ToiVCr5yfpSuf9rjvUTKWAJGKkbCLk8Zpuy1E1b3hOoBxz6U0
upYY4pS249aUzrESMDaabV46A5DhznPTHWo4iSMnkk1JGob5s4A46U8RhlwBjvkVnJqI4vuL
v2EZ+op2xZEyTge1RTorAg9aBD5S53Fs1UfeHshXYxEr+VPLjaCOSetBxKSSo44peFU4GQaS
dxarQUsoTAqMrlTngetSBC/OMUjRFVPJIppO4X6AvKcH8akxlRkdKYhwRuHFPjbJbA49apu4
9kOQdc8D1pWQNwCcCmA7mOe3FIg+c47VCte4biht2ccGpLdvMBU8GmE+nenu/loMcGh+8xp6
EhcbSABVaOMFzkniiRSvzZNRKN8oY8VUU09BtJM3rDDr8rHHJrQfhPmJA9ao6fBwAGI61flb
JOBk0T2JepntlHz2NTIxDZPPFQyuYpRkAhucnt1qVpRjA/Os7tKzFsWFj44OPWn5DOMGq8Tj
I5J+tSDETE5+9zUK17lapkyA7lY9jWlBkbW657VQg4Zg3SrluwPQ/LUzaUtxu7RradgzqTxg
ivcv2Uin/CxPk5l+2Q/jzJXhenA+egAGCete/fsgR48fyng5u0/DBmrkxS91msO7PvTnC564
5ooY80V3UtIIwl8TCiiitiQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAK5D4u3Btfh1qsgAJHk4B/wCuqV19cZ8Y4zJ8OdTxzgwn
Hr+9SueurxGj869LXZazBef3hJ47nFRzsQDtP1qawkQ20mw/N5hyPypk6BPlPOea3ukrGcio
568de9VZOGzzVmVxnAFVi2WYHpmpd7C5b6kJU5JyQPWo2XqT07E1JMxHHY1FJICm0/mKG2kT
sDN8nBqpO7EY6+/pU7sMDHYdqrzkAA56+tUthWRnXRLcOcL2NV44jG3yjPuamuJNy4YHA7io
oS0gwM0WuVsWEYlCwFBXCetWoNMvJY8QWc8ufRCP6VZTwr4jTm40S4gj7sVzx/nNaOEnHQnn
V7GUXLnPOPSnEEj2p80LW7bGUq4/hI5prMEQg9TRJpKxbb7DWTGCOB9KZJkKcE093JU8UgfG
d2Me9Z2u7g2HMi8U4AKME4aoUXaT85HfrxT2JLA449acY+YaMQHDYzge1KX+bOfajYBk7s0u
F2k1TXQL6jWO8j270icMeQaUOMEAZNNDAAj+L1pJpLlHayF3biRnbTwSEIz0qJQOpJ3U8N8r
rnJqr2iSkIo9Bz7Uuw4x3oRtv3hgnpzVo6dqE237Dp899IxxtjB/DnHrVwi5IG0ldlbYFX7o
owS5P8ular+CvGUYzJ4VvVT+8V4FVbnTrmwTF1E0Djkg9qbhOOthRlF9St0A5OfSmgnGO/vS
g729BQUA5ySPWsdW7FbDCRySApoJ5HpSFxyODz1NWYLRpcBFaRsfdUZNVGL6IGR5U43cCiQE
425Ix2rSh8GeLbhRJa+Grq6iP8YHT0qOfTLnT4z9tgazkXgq2OO3X61s6dTsS5xWzKMYAjY9
+nNJjggDrVqDTrzUFxZWcl0+doWMfebsKvL4G8aKm4+FLwIRkP7etV7Ob2HzRSMUbsf7tOVz
g47+9Xp9IvtNjkOoWj2boCXV+3+eKhh024vod1lA91I/+rSMZ3GpdKXVC5lJXIHckDAz6mnA
7goJxWnD4B8bvAJU8L3UiMMjC9R65zUD+H9XsC39p6dLYSL/AAOOh9Kl0J72DnilYz2Ybjgg
GkWU7iDijygW+X5896tJod/cEmGznZuwCHB/GpjFyRpeNrtkAYhe+aA3ykY59hU09ncWRVLu
E28//PNuvtQltcynNtayXEh42qP8+1N0m9DPmXQrn933yvrTWkdc4X5elaqeBfHVzCJI/Cd0
0R6YX/69QS+G/EOnfLqejzWJ7iTr7VqqMt2g5odypv8Al5HNMXI6g1YEBkYEAnPQDnNTr4U8
T6hn+zdCubtByWVeg9f1H51Kpya0Q7pbuxnlW69R7mkEwyRnJ/lV7UND1XSolOoWM1kxHSRc
D/OapRQKWCj757UnF9QuraMaATkmk79eBWsvgvxbeIW0/wAN3dzGekmOP6dqifwj4l0sE6vo
k+noQW3yDjHrSdKUlzWD2kLaszx90n1oyCoz170SBlfaBwP1prttx8vNczunYu/YbwH9velk
bIwcjFKqhjkk+tLKqnBzWiWl2F+gmxTjcB+FI7BmHGfYmlY7VyDn601B8xJo1JT7gybzyeKa
UIOAx+tTKBIPl6jtUqaLrt/Mo0vRLnUVbgGNTyc9hj6VSpylsh81tym0j9159aY25s9fpW3L
4I8W2hI1Dw5eWAHVpE/Lisko0Ujo4KMvUMOlU4OC1BTi9hpTahGeSehNIU3DIJx0pzlcYzn3
NNaeOE/PKiD0ZgKySE5WFO5cDtSRsSTuXAp3mCQbgVK+oPFNkLAnAGPWqvYoJGdscfL60ivg
EcfWhW3ArnjufSlWPJwOR2NNeY7h95R296b90kdasrY3k2EtbSa6lbokaE8/XFD6ZqkCObzT
J7RUGWeQcD9KtQn0RLlFaNlcDJGfypXUAD0z3qS3jNzu8lTMyj7qcn6VZtPCPi3XGZdK8N3l
4FG5ysZ+Udj2qoUqk3oKU1HdlJ3HUAH3FR9eVPPf2rTbwD4z00lr3w1d28I/ilwPeqVxbNZk
+aPKJ7NxVTozhugU4S2epHtJXFBZSvTB96lXTta1CUR6Zo89+zHCmIEhj0wOOucVefwh4jsY
2bV9Cu9N2AkmRCAB1yfwz+VQqM10E5R2bMvcCxyAKWRgBnr704WzzvhFLem3mpbbwz4o1HIs
PD13dqP7qH8acaUm9Ac4pblUg8+tKrjGGq/N4F8cWeJr7wxdW1v3dhjHp3qnPEYvldDHIOqN
1FTKnOK95C54vYbuwaTcCc44HelA39eKZgq2O3pWa8jZWe44kAmkLZ9B9KeimQY28+tSf2Xq
VyRHp+nTX8x4CRDPPpVqlKTskQ9OpX289cAUhHIJJIP6Vcm8N+KoFzc+Gru1UDlnUjj8qpmO
6R/s/wBkeS7PAgXls9cflVvDVLpNaCVRNaMOVOAu4e9Nd+emCO1XrPwz4x1Hd9k8JX8yjo6x
MRj16Va/4V947VSz+Dr1h67MYprDyWyIdWC6mVyuR2NRldyEbunrV6+0bUtKQf2lZS2LMcDz
BjPsKoPPEoCmRFb03DNZSjKN4tFp8yuhGbBwMfWlO3AAOaJFGcH5aFiwck8+lZuN0aOyFLHz
OfTtTJHAkwelTppGt3kmLDR7i8HdkGQP88UyXQPFFtlrjwzexoO7qRz+VdUKUmr2MnOMXqyP
fnimFmByQMVLLDJAoMkZSTvGeoqByzMRgiuZ3T1RcZKQhyWAQZz+lSOuWyxwfSgAAZ5B9qcw
ZlY7d3vjNCTlpYp2SGnAUjsevtSFhtxwaINJ8RalKI9N8PXl8G4ykbfh2q3N4R8XWC7r7wxd
2sZGcuu3A9a6fq8+xjzx2bKII5BGV9TTvLVhnA46U+W3a34lBjk7xt2PpTN2B0xkVjO8XqV6
DVODxSsxUk4zSIBHuJJwehNKMvyORWL8ilpqIu4k/NkUpYkjIHHagNs3Z4FN3bgT0NaNlptk
m8seQFFRYJ6E/wBDUi7fXP1NNyyjgcVCbQmyNY2U4PbualwMYzimvJuck5H0pVwy8nBq03KR
O4qv5f8AFgetMDl3JPT0JqORWdhzxT8nJIHT3py3tcrQVpCcY4xS9V5AzTDx3HufSkZueDx6
iq0TFYcCQwJXGOtK74bI6Y/Km7mLLxketPcgg8CoUrk7Cb+B6mnLkK2eM1DMWhjDCN5XP3UV
SSfYYzUlrDe3EReSwuYE6lpImAH4kCtkpWbsOUox0bEHy8AihnI4HJpXAXv8w6iotzZ4XNYN
3AlTHOevv3rS0TxBc+F7iWfTXMUsgAJVimccjpjvWSrl85+Uj3qQorEYbOO4qoT5NQ5e52I+
OXjeNiFkG0dNs8n/AMcq2Pj14zijO6cFv+viX/45XAgsrccj1NNkUs2AST9a61ipyWhMoRfQ
3NQ+IXiTxGzDUpg1ucfu/NduR06ufftWCnyRCLAwORSiIjjc1SJGCcH8xXNVrTluVFKOwJKI
1zjJpDMC2McetRgZyM496cYx/erJXLSW4cYJzk0vVMng+1MK4XIOfwoQ5U54xV37CO1+GXjQ
+Bteju4Fi8pnVpVkJUcBh2/3q9+0j44+CrlWutUu7AT/AHvKZt2DjOB8p78V8nodwIYcGqF5
YxxP5i+Y3cqOR/KvQo13TslqY1acam59E/FP9oq38QaXdaPoUEVvbMjRI9v5g3D5cMSFUdif
xrwWbdI7ySEmaXDSMe5qK0l2LGqwy7iOpjYD88YqxJJj7wGTU4qvOotVYmEI0/hYwBUUFsbu
xpjyYOeme/rTW3Fj1I6/Sl4kXHpXBzaXOjbW5IDleuaQMfXkVGcp935qczBPmJ2k9Ae9EJOW
wW0uDS5OMZpUOMgdB3pFO9d20j3pgcbOflPpVWa1BPQlK4OQcmgu3Q8UwsdueRz601Tnqf1r
OUrLcXUc8nYr8vqKazMSCDjjtQW5IzxTdxzwOPemnfYLjknYnJHI9acHJJJ4981AwO4HBxUh
y4B6Y7CnKTQxSxZgDwO9RyfewD9Pek3ZLEnmmqx3fMOPWl5o0epNvCKAcZphIY5AxTtnmc9h
3oKpErO5KpjOatK+xle24BEAyX6048DjBqqLmJm+Vm2k/KzKQD+Yqwo2ZOc5HrSnBrVoLqSv
ckSTauM4HbFKXOM55qE8jKk59KbyTjOPxqbOQ0TPKSOWINAY7SSMGgEBORk56kUTTRwfeZce
5rVbWQpPQXzNi4PIpokHO/H0NRwzLO2V7diKHXcM8ZqGmrMW6vcljkIGF+WiN1jG0KNv0qIS
HbhRkjvS4YgnGD1xT5nux/DsPd92cgbaSJ1izsUAe3eo3Y4wB9aFdscqFHrRzcw1sSByGJXB
z1odiR9aii4zk59qeGG7PUVLfW5OobgMAjmgS8kYX60hYMTnimMoUk5x3570Rlpcvm6Eykjm
oZY45SS0asfVlzQ0uQMdfrSvu2jCk56mqi2tSUtQUrFlVAVfReKkHJxnOORmo1X5eetKiHO4
tj6U5SVr3H1GrKCTxg+gqTIYZKhh05qoby0jOJJwrjnAGaktr63uB+6kzz3BHP41SUnsiJSR
PvxlcfhTGigmB3RqCe+3mlyRltpJpqspGTkN6UnJodrq5HHZwQnKwxg/7oFPdFmJ3qpxxk80
+R9wyAM+lRjcVOBmjmexSXUb5UaYAiRvqoqQwxjlY0U+wAprSpCcysEHYnvSfbIJpNkcqux5
wppJySsidnoDuyjpu9qaRH1e3jJPdlGafcTwW/Mkqxj3NVH1W0bJEhZF6vtOB+lUoyfQbaZZ
bAVQiqq9gowBQ+CCOrdqiW8tpVUxyg56CpCNqhiSAaiSa3C62GK4jJyfrRvDPnPFIArEnGad
5akgH5e/FLyBOwjbQPUVHJlmyM4HcVIVRT80gCDue9QyahawE5nj54GWGKXK76Id11Jx844O
KbjCcjJzimxXEUnEcitnuKeVbd3C9aTTW4X7AE8tMjBPvUbE5DFRmnsjBMAll7Nmm7HI6Uk2
tikIEKZIGRTY1DsecVPvVDy4Hbk1ENpbKFT9CK236GfNYQoo4LZpGjBx8xGKXYZMgjawoKs3
AH1NQ12ZTTDO7Kn5MdPpS5zgZ3AcUhePOXkVWH8JYU9I8xs68jrxSSuthc2qRGxYZz+FNyCD
6ip2ZdhyO3pUH3+gxjvUJWKIyrF89h2pxPU7sE9aXJDsDTSMFif1oabloFtbgI9x4bp+tPdS
QcjC+tMjKqTzRJJlNvXPvUfC7PcLdWwUKzE4wP71DZGAOB1pAxiXDcr60gJkOSdvtWl+4IUR
bBgHIP8AFSHIODwKfnPA5FI3zH6CkmnoFxV6jjK+tNkTqCcDrUSs5JFSNI+MsmKhXWyKskNd
DjrxSscr8rZoTAUluWz0NKVOOF+uKvbVkyfYYXfGCvB9KehLcKtODBl7elJt2nKn34NDk+xK
dxjAmQAjb705lOCSSAKFb5m3fgTS5LA8ZU9/Slc0a01IlbYT/FmmuyhuVFSugXkHOP0qMLk5
OCPei6uJPQdGOSDyMcUvJBOPmpJBt5XvQCSckYod3oCFZvkGRhj2pZHDD7ozn0pDtJyW+YdA
acFBGcc46Yqb20J3Gh8ctT0Tjkk1GY8jLcL604yFDxkiq0tcd+gMc/d5NPjm2g/KM+tRCRQ2
OAOuaRiR0/nVOOmhSa1HLtBySDnuaaZcJ93ke9KIw44bn3psSZbDDjuTQ9REpAPIPPtSAABu
Tk0o+XOBkdaA27OBx3NF42sNXYsasqNkDB6ZFOIbb12/SkywGRyPT0phkfJJXim3HcTTJAN4
5IyKaxUnB/A+tJG/XP8AFTlQOG5GV5pOzV0Ts9SP/Vnrkn1NAO7jduo8sFmJJzjv2pIYsEnP
GKLXepd0SlcKcDGajRGOVOSB3IqZ2CopBz7UrOApI796UpdEIa+VT7gA9RTY5Gk+ToP71LK5
CEfepisVTIx9az0W4a20RNuEb89Kes29wB0xUALFPmXr3NSA9gMe4rS9ynYe23r3FPifhu9R
eapXB4+lLEjAE/zqXZdTNeZIJT/wEdacWPAHIbnBqFTnOAMZ5qTO07jjgcUXVx2W4pbC425P
pQWwhI+8O1NWUtJnFOKk7s8E0uZDfmPikJUArjvmj+JiW25/WoyCqY3H0zSBGwckt6Zp3sOy
Q/bgDacnvUqYccio45CmcoPrTgcvtHFO7sxdBZEXoTgDvUeSGAUbgOafISUJZcGo4j0xnOex
qLuwt0dBYlXTIb1q6dqqf51n2AOBx61cuG8oYJrTl0uStzPcbsrzknqacmMBWwB602R2EhAX
6E05oyeGGPep23NXYmCgjj86mVfKT1z61GVyoxkYHapR++HPyn0FTJkeZZXP3mAGOwqaAZYs
MjnpUCqSo+bOOoqeA4bHSs29bFWfU17LDKc8MOcetfQ/7IC/8VhFgdbhCfbmWvnmxUfL1JPp
X0n+x/bGDxerMMhpUIz24m/xrjxFrWOiC0Z9vn77UtIfvmlrvpq0Ejmlo2FFFFakhRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVx
/wAXyw+HWq7Pvfuf/RqV2Fch8XCV+Heqkdf3P/o1K5q7skNbn5yaYIykzJ2kII96JWbzM4yB
60abGsNo+D8xkYn8hSv87Vq42d2J2RSkjJYscrULhY88gk81amdUyDyO/NVH2uSR0oRlzdBm
c5yuRVeXktgDjoKkdyuQvNRnuc81crXDRELbgmcYJqrdKdnXrVstlhntVe44LZ5Tsal6IRSk
jUKMsPpRbgMw2ADBqN1OOW3VLbruZfLJJyBgVvTjqU0rHuHhC4t4dMDPYW7FSx81o1POenSs
D4gfEe6d4oLbbbjAVkWNRnO7nO0eorX0J1TQFizmQuxJx9a8+8aoHvFbH7wbenpg16UuVR0O
NfHqc1cyPLKZGJYn+I1FKOOze9OZyRg1Hg7eSVryX1Z230HJnGD1prICcHj2p2QR1waax3ED
OTQn2JcWDqM8c46mhCCMHmhlK89B9aj5Knbwf509h2H8DNN3bA2fzpfule+fWhh13EEdxTab
2FsMbjkHr6UoU7d3Wkzg8AFaV2wBg9f0pRiupb94YzHI45p4U7gRx6mkyDtzyTUqgZIJxTcd
Q2LVnp32+7t4UPzGQE49M4Pf3r6B0KLTvCNkxOnQTXCqSSyglcEkEAg/pXgmjX8dhrNkzsOX
Az/wJa9yvmOqTSm0DTo4wPLBbPGP516lGEXE5ardivpPxavvEeqPZpFiA4XcY1xztB6oP71c
3468OR7ZiwUjb97/AICferngrwFr2ka9LPd6fcwWe8FXePAx8mf5N+VXPHS7La43tyEPB9Np
recfcZzN66Hh8a4QZbPvmhiSoRevWobaXzER8fLg8fiamLDJYcDpmvGs1Jno3voWILdZMDaN
x/WvTvht4SXelzfW6sAhyJF65UcdfevNNODSahbJuOMk/wDjpr6HkWO20qzNqgjdokJ2DGfl
5r1KFHTUwqTcSOb4vafpN7DpcUdvayyLlQu0DC5/2Mdj3rnPEWhwa0rvJCjF/mzt65OfavPt
c8N67f6808ejzyKu5VlU8gZbofx/WvZ2t44NKs0ZR5vljfnqDgcH9a7OW5yyta6Zj+B73wn8
PtGmfU5LSfUBiSITgqchcEDqOveprb48ReJfEcGj6bAqRyHy/MRd6gnd6xgdB6968g+ITI+v
KrAtuDBItxA+8e3ft+Vdl8JfCIgB1OaBYWjZZFcoBxtJGDn3/WsE9bJGlk48zZv+M/Dq6lDq
LXexSUctIwAA469R6Cn+BfDdjoWn2lwixXMioHBKAgdTnkkHr+lc98VPF5gt57OCY+bK20BT
yRuXPb0JrqfBt7DeeEdNjh/fXn2cK8aAls46fzrVcuzZMeazZZn+LF7Br/8AZcO1EUbQVRMD
lQBjZ/tHvVbxRpUmt2011c4MhUyElQM5X2xWGvw+8S3PjOS9TSbs2L4ZZBHwOU/Hsfyrr/E0
Vzpmm+XMjo/lbCrrg/c5q3FNaCb0Pn/wfod54r8Sm2tIJZbVNjfuwSOSo56e9fV+i/D+18M6
RPPqemw5CHy/NUZLfMfU+lfK3hLxVe+ApZGs/nnYqvBUHGSepB9q+j9M8X6p4l0HN7NLt5wZ
Hznlh6D0rnp043NJ3cEfP/xflaHVRJEuAyoNy8c4b/CvTfhgfBPhvRhea9qVjNeAuVgnJ3ZB
BU8E/wB09R3rzn4lIh1OOObk/IQD9DXMfZPt83khXmmI+Vdxz7cZ9655NRk9C6ceaFj6Bn/a
AtLvUo9N0qCKMEb90eGXoSeseP1qz4n02TW4PtN8Qd4ADlAOhI6DHvXjngr4aeK18QRXLaJd
i0WNhu8r+LH5969l8ba1FoejYum8p4iuVfjqT7e9dcW6mliKkYx0TPHvAnhS51vxzcQSq8On
RCVVZlymQeO47GvbPEXxB0f4eaK0ENrbQXRCJvUDf1GeNpz9ysfwkkUlpDPbW6xSugc7F5JK
jJrkPjB8NvGHik/atO0u9LhwQFjyCMv6kD+KtYwjCLtuQ5OTSZweu+K9R8TTPLfu7KCdiEjA
Gc9AB7flWZAQsqyMOV6GtKTwR4j0qEf2vp1xaP8A9NEA3dj096yyQpIJ6cEV4041E/eR2Rcd
ontnwp+J19ql7/Z7xiLYQq/u1w3ytg/cH92t34m3kuo+H79rkIWijZVbYowMj0FebfBbEviM
NkE+YAQOw2t/9evRPie4h0HUVUg5iY7R35rtppum7nJUilI+cPNLXU4zlVcgH8TT2kA5IBxS
JCUZ2YbdzM2D9SaGVTxnrXk1NG7HdDRBuJAYdzzTWbexx0HFNdXU4BytIcIBjknrz0paMasP
ZQR96k3E4wMDvSbhjB/nSgkJ0ovboDRNEMFCCF+YA+49K+sPBV1p+i+EbWSHSbYXLSOfO2Lu
HzHHO0+gr5GLt9qtkXJUyLnnHevq3QdqeDbM7gw3Pyf95q9bDJSTbOavdRPOPjN8XNRufE0m
n2y+XCY42ygXHQnrs9fevHpi0rNIxLk9Se9dL8Q2H/CRoc5dkUE9TjDf4VzbSRoh8xhGnqxw
K56/vT5UOkupNp1q11MIxF5rtnCjr0zXs3h/9nOyvtFXU9Znjs4yQd0/TBUEceYO59KzPg78
Pp7yf7dqFoVjG7Ekg4wVXA6+5rofjL8TRp2lPp9lcgBWQCGJsAkMR0C+g/SumOHSV5Gdapd8
sTxnxzb6faaubTR9n2aPcrPEDjIYgdfYVgS3tvEArTRo3+0wrofBPh668U3VwvkPOzvkt1yc
Env7V7novwK+H+lWpl8QT2LHgn7VKybTjBGfM9SKwWG9s7x2NnUVNWe581wXNtOxEU0bt0wr
Ak1ftbWW5kSCBGe4kYJHGoy2TwMD/PSvoPxF8B/CJja48NxW5dULKLbc4LdQMl8dK8W1CK68
E+L4mlhMM0JLxK6jkqWHGcjsKboKm9RRqqZ9D/A34QNp+m2Oq67p4kj2CRmnQDOd/BG7jGQO
lc1+0Pc2NtpWswafp9vbLGkgWSNFyR8vfGfXvWl8I/ix4g8Vqun3Pmx2pDJjeuMLvxgBR/dF
YfxsVX0nUd3LMsgZj9Vr1owhyHHVcvaK551+z9pOkXWpSXevXcMFqqo4W4PD4k5HUdh+te0+
Kfjv4Q+Hlq8Wi29nPKxaEG1JDHAO3OI2yM+tfL1sJo7WOKCd4QBx5bEfyNa2heE7jxRqVtbJ
bvduJFMkh+Y8sB3Pv+lefhqtnsdUqd0pN6H0vFqN/wCPNI86UbYjnAKKMn5lx0X0NeB/EDwp
PN4h0uxt42DSTATJGMlVOwfMAeB81fQN/La/D7waY57hI2QOxfdyMB2zwT615P8AA7VR418W
alf6ri4dI4yjSjPO4Djgf3RXfNKS945o3Um49D2jw2nhX4a+HYp9Q06yWeEvIJZQAS2SwA4O
Pu/pXz147+Md74+1u6+zgwaWyKoAUYc7QD/Ap/iP5V6r8YfCWv8AirwzcRaXZXc82xtiQKeu
xwPTuRXgVj8LPHGkWUf2/Rbu1VCSzPGvIyT6+n8qirStG8RwknJubOo+DPhI+L9eCY3wosny
sMjIUepHrXvXjHxlo3ws8Py3tto0G1WVQqfeyx9djHtXkvwA1q18M63PFdutrOFkxG/BwQnP
T611vxX8O654s8J3EGl6Zc307PGVVI89G5PPHSihBdSqu6tsdAviO58e6BDdJDi1mCPtKDgk
BgOVB7ivAvi3oUfhjWUYMuHbBxwBkycdT/dr3/4b+Gdf0jwFa22p6bcWVyix7kdOR+7QHp7g
/lXi3xg0q58VeKodOt0eR3YyfJycAy/T+dOtT5oamcZWnoeaG/gAP71T9KbHf2zvgTRs3pux
X0foP7PPhW2sY7vWrm0stwGUuHx/CO/m+pqzq37OfgmeDztLltpZG6G3Lt3HpJ6E158cE47n
TLEa6I8C0DSLrVtXsLa3jZxJMu/aM8ZBx+ODX074Z0rw18NPDcmpataWouEQXBlmXGwBRkd+
5PNebfCrwhceHfGt7BqNuyoj7oGmX+ECUDHJ9BXR/GdrzUPCV/BaW73r+VIgiTuMrgfzrtoU
XFNyWqMqlRvY6S78faJ4403dptlaSQyAhZUAbcM44yg/umuI8OeArdfiXa6pcWKTaeJw7xsM
LjZg9/X2rl/2eNA8QW9+w1bT7my0tVJjSb7oG2UnA69cfnXutjao87iBAxJIQKOe9dqjz7oz
bUb8pb8T/EjRPBOnTyQaHbwwR7lUxdwFJ7IfSvJLz9q20vEnit9MEbksqkEn1GeYfpW/8U/B
niTVdCuY9P065uZG3ERrFnIKN68dSK+dn+E3j6xYyXHhq8iUMx3eWg757VhXUoK0I3FTUG/e
Zq+I/EVz411GwgnmJV5gOgXGcL2Ar0KH9nuwt9ON3M6XLbW2kSbuRnHSQ+leQ/vLaQhv3d0n
IAI3IeoP8jXtXwo8df2gktjqF4zZT5Vnc8MWIHUe9eZBKc3znXK8Y+4eQeIdIfR9QNvNEyEg
EFh69qzA21sEfQ17p8QfB0erpNPHCrTRpkELzkKcd68LKSiLbPG0NwPvKwwR6f0rGvQcJcy2
ZdKopaSPVfhf8S9N8PPb2F5YxXdxKZCuUyx4J7If7pr6P8R3mkajYrKNCtIoyASuxSc7iP7u
a+KPCyhfGOmkj5gr8n/cevsbUlxbxqvKsvT/AIEf8K9PC2lC3kY4iCte58Z+IJRP4jvijfKr
uAg6D5zVFgQenNGoFk8UapGcgmWVhn08ykGScDJPfmvFxGlRnRR0iO8wKOa7b4X+CLrx7qj2
tnbm6ZTjaoH91j6j+7XBMCT6Y7V2vw5+I918MtSbULAsHY5KKep2svdW/vntVU2rps1le10f
Turz6H8HPDcs82iW4nhi3szja7MoC8fKx5J7Vj6V4qg+MGhS3NlYRxQxYjkQqGJLAHGSqkfh
XgOv/FDxh8Y9UTSntriVbh/LLB0YKGbPQKuenSvfvBmlRfDD4Z3QuNtpcmJZZHYbDuCKMnk4
5zXvxan8KPLnFw+Lc8G+MHg2TwtqzXTRqkRYnywwzyEA4yT/ABelcAG3KGxjPOK6X4l+K7jx
h4j3/a3uLWKVs/PlT93Hp0K/pXNbvnxxivCxXK56HdQUuW8hx2kZbhfQ0gfaRjgdeKa3IPcA
9PSoZHbIxkjsK4/Q6rXQ98yEcY9aFzk+lKjYHPP1pGcg5xRqK62HBG25HFNLvGMdaf5oIx90
/WjG5ecA0uW+tyWhAS68jDeuKdj5d2M++cUHgcH8K6XwT4QTxhrC2U8otLYqzGRn28gZ/vKf
1rWEW3ZCbSWpyguos8yx9P74oeeAnCXEZJ9HH+Ne62n7Nug3TtD9sVJFz8xZ+3v5tW9T/Zs8
LaXpTTxX8VxdbgAiFyeevSU+9d31Ke5z+3SVkeBiMdOGzTHaCE/PKiD+6zAfzNbGpeF73TvF
tvpUdvMYZEZyeSRjfjvn+H1r2fw1+y7aajYm41t/spbDR+dnLAjP/PUY5qVhpyexbqxSvc+f
FvbdmG24i9gHFWFHmEenrX0Bq37K+g2ljJNZTLcuELRrFvyx7Y/enrxXjHjDw/c+Db9baezl
gTBCmRSM4JHU59qmphXDVCVWLdju/wBnbQvD+reLWbxRJam0Eg8uO8O1QAJO+R3CH8q9W+Me
pfDHSvA/iOw0iTSZNYELrAtq+51YEEYIyM49+1ePeA/hTqfjL+zrjT76S1M+1m8mToOcnHmL
0AP61ofEv4C3fhCG91V7xryC2i82Z9wO5tq5B/eN/ESOldMIv2bsjmrWcrtnjtqpa2VpCd7E
tljz1OKmBwMA8+tM85ZUR0GEPYdqUEq+SMrXmSXvNnoJaDvL/OnIhB+UYHcUE4z39xWz4M8K
y+O7+awgk+zyRhTkyBScnHGWX19afs+fRdQvZamC8yF9iuuRzgNTldWbiRS3oDzXslt+zS2p
W2NO3zXIzudXJP6y+61fvv2WYNC0Rb69vWhvAT+4Ltu4BIPE3t6V3RwM0k0czrwtY8M3Meow
1RSzxw8PKsTdwzYNaU2ialB4y/sT7HKwkj3xykdflyf5N3r17w/+y7HfIbjxBMbFzkYuGIJH
AHHmj3/Kl9VlOVmtjT2sEr3PEVeKUZSVCPQMDUqIO5yewr2rxH+zroejQh7PUElbjCxu3Ocj
/nqa8jn0q+j8QnSorKTzyGKE91BPPP8AunvTng5xREaqkZclxDGdplTPpuHFTBFMWTgZ/Wva
dF/ZaSfSG1TVHNlyMC4YrvyBzzKO7elUX/ZyvtVl/wCJcZZ4BnBikyvtz5vpULCTG60TyILg
EjnHQV6z+zR4S8P+K9R1UeKGtjHHMfKS8O0bfLc8HcOMgVwfxF0Gy8Batbafa3q37sCZCrE7
CG24+83oe9dj4A+EviTxPbx6rpd5PptoVXeYXCg7kzk/vF7N6VVOi1LlsEpJwbPTPjRovw40
PwJqEWhrpa6ykTrCbV90isGX0J7Zr5kRS9unmDMm0cnrmvRvHvwU8R+FrK81rUNQuruwhVpm
dpNykcdcSN3I7VwGgwSeJLq3tLKN5ZZm2AoCSM5xx+FViIO9nozKk072kVnlW2H71lTI6ucZ
pkc8EhPlzIxPVVYGvavDn7K1/rCLPr08ttbugeHzVx17YEoPTHWrHiT9l2z0O2D6dK885zxG
XycDPTzT3rP6o5LU19vBaM8Pknhtk3yMFHQA9zXsPgL4Py6zpcl9e2avGcLEZAODlgcfN/s1
wfhz4V6p4i1aTS7q1mSWLYzecNhUE+7DPBHevtPRfA50nwdZ2sc8YmLMcbl67nx/F/tV0YXC
KOjFWrJQ90+Ofibotr4X13+zIFjidQjbFAGQQfc1x3lncS2DivpP4sfAuG51qbV9YuvslysK
gb5Tj5QSOkgHY9q+d9LtX1bVprGFGfgBZEBI5C/1b1qcRQalaJFCpeOpRaeFP9bKqJ6k4FOX
y5PnjZXX/ZNev6L+yVqep2on1G4lhjJPySDHTgHHmg/pUHiP9nUeGbcyQ35mOR+6jc9/YSn0
9K5vqNRmrrQ2ueShfl68nmnRxtt5HFdB4W8DXvii7ubKBJRcws+VAyQFIB7jua6qD9mnxJqJ
MltPdEf3UXOP/InuKUcHNqw5VIxWrPMC27IU5x1x2p/3SB2716fr37NOr+GI45bm4lgMqBxG
7DLc4zjzSe9eb6jYzadO0MyFZFzgHqRnGf0NVLCzgrtExqxlomUymPx70sijaADzQDwOaVlz
g5471xXtozqvYdEvTk49PWvUvgppng/xDqUen63LbXN68oT7HKrFuS+BwfTbXmNshmljjUEs
zBVA5OTXrXwM+COs3fxC0zXltriK1WdJpJduE2hWBJO4Dsa78JBzlqtDGckk3Jnsfjj4V/Dv
TtAdbfRrOO7ihZwVjcEHZkd/XFfJGqRRrrmpRwkCGKdkRFHCgEgfyr7B+LzrZLeRo4YIrIzg
5HEeDXytpXgLUvGus6u+miZRHOzM8abgQXYeo9K9HE0VyqxwUJe9dvQ51QSMbelRb1BwSN31
r09P2aPE9yiNby3UuTyUUHH/AJEqHWv2e9Y8MxmW9ScS/wAIfqSBnp5h9q4Pqk7XsdntobXP
OZZjHA5xuIBIP4V7d8Ffg/o3jfwkmravParcCSRWgmAJwpGD98dvavGZVihufs0wCSkhTGww
een869P8C+A/iLIkttoz38diytjy1VACSAerCnRpe80yqklybnQ/HrwT4O8JeH0udDl0+O5A
jVktSCxJdsnhj2x2rwW23NbK8oIk5ypGD1rpPH3gfxf4UuFfxW98lqCuUu23K2QdvO498/lR
ovgfUvGlv5ukxzSR8/vIY9w4OD3HrSxEG5JRRnScVH4rnPINqH5Nue9Id+cjNdH4x+Her/Dy
2SbWTKAwXCyRhRzkDkE/3TSaX4G1XX7VJ9Mtp7mJwG8yJMgAgH19x+dYOhUUrNGvPGWzOdEZ
KZ/WkG2Rc7gAODzXU6v8JtZ0m4gjlluFadSyxtHjP0+auptP2Z/EGrQJNFFc26kDKsNucjOe
ZBWkcHUeiQnVglueXpHznkL60jxspGBlc8123iX4Pa34OgmknMsgjQvsKjoOvO81jaD4K1bx
UhaxgneNW2SNHHnY2M88jpWcsJUjugjVi+pz5iO/rx6UpQMPvZx2rtT8APGk1wv2W2vrmJz9
9YRgf+PfUfhRq3wI8R+F7c3l2bhAq75IZIx7Z/jPr6Vf1Kpy7A6sL7nFiMdRgYpyk7iM1KyR
h5I2cKyMVYHjBBxV6x+H+v8AiL95pttPPCcESQqCAD+P1/KslRm3axrzRSuzKxhhk4xW74X8
PS67qCxpE0qNgYUZ5LAev1qp478Ga14BtYjqUE0Qkk8tXkQLn5SSOpr3j4K+GLVIHvHgQlAC
AV772OevtWtHDOVTlkZSmuVyR0fg34BeDbO1D+ILHT3uSTmO4wrAZGP4/QH86wfHvwq8J2yP
/YWm2kTKuf3SEdj0yfpXL/tK+O7/AEnV0tdM1SWykPlMWhfHBV+P5Gu78GSP4q8KRX0r7iJH
QuT97BP09a9t0oQfIjgbb99s+adStHsr+S0kGyZQGCEYyuOtUggyVPBr274o/DSTUNaa702y
dEZUT7RFEcYAOR19a8q8TeFLrwcUfU/MhRyAHlTbnIOO5/ukV5dbCyi/d1OqnVVrMxH4X/A0
5NoO92CRAck9M1s23w68RayyzabZXF1ARkGJAw9fX0IrSs/hnq0esRWV/bzBZULGN48YPPv/
ALNYqhJ9DZVIW3N/4cfCK78fzFY7B7qIHgmPjlS3cj0ro/ib8GtH+H9g9xDbwJOqhiAmCMuF
67j6mvoT4XWGk+B9CjKyxQ3rBdyqpBACAdsju1eSftCam2paZcybtwwBkf8AXVTXr0sLGMbs
4JVpOXu7HI/CT4IWXjm0judWjhWLCuXlwRgpu6Bx3r1GX4JfDLRofJu4tILEYO9wuccHjfVb
4MzbPBe8HYyxxL9R5Y/xNeOftE319YavbFdSurUSB2QQu6gDzB2U88etKFJKm5NEym+e17Ho
HirwP8LdGs53gj0pZEU7BFIWIPGMAMfWvnrxAluuqXa2jKbTzD5W3ptzx15rPg1Brgosup3F
1K/aSZ+fwJqaZQDhjz2rysROPRHbTXmRRxMOQMj+VPdQSMct6Vd0m2+23XkRgyOcZQdRk/8A
169H0r4J39xbRXk1pIkUyiRGf5QR7EuKzhRlP3kbSmobnD+E/C0mvah9nEDXAOAV2Z6nH617
34c/Zf0GaMS6vaW8YXrG6Z7nuJOOB+tX/hX4JtdDu5bueCFWKDGcHDBsjoT6V578dvi/r3hX
WtO/s3ULmG3ab99CkuBIoVDjkH1PT1r1KNBRXNJHJUm5y5Yknjb4N6RpYlOkxwyoi7v3Ixj5
ST/F9K8ZEEkSlZlZHHVWGCK+qNLtX1jRYLp12Cbcr554yR7dhXjvxM+HV+uuOuj28lwmxD5k
ScNwcjk/Ss6+HVSPNEinU5XyyZ5qyEfLnj8qIcRnMmav3Oi3+mbYtRtnt5icfPgE8Ejj6VKP
CutanA0dnps7SHkOB6deteVGjNOzR3OcbXuepeEPgiPEtrFcS20X2Rhkzb1OPlBHG8HuPzqr
8T/g9pPgWze6s7iKdcqAEY8ZYj++3oK6v4Ay+IIVNjrJuIEjRk8qZhglVQZwPofyq58XvDOo
6tokqWkEl0XdDhR0+YnHWvchh4OLPPqVGpaPQ+azGHCOvDONwFbeh+HJddJWEMQDtZlXODjP
qKyr5JtBvILO/gNvJtO0uOoHH9K+lvhP4ItdIhW4urOMRy4dfMXIbKdep9RXm08O3LlaO11E
o3uZuj/sqWk1is+pFIn2hy5OeMZOSJa4j4hfCO18J7206UXSKjEiJiQMHAGN5re8ffF3WdC8
f2emw6jcLo0rNHKvnYX77KB0zx8vSuug0x/EmlfaQvnRSofnPI5UH+or0Pq8I+6cXPJe9c+X
ZonVpAVKlScqe31qv5oUEDr3rr/iNpkXh7WZ40wvmSMG7YIx7n1rkQUb0yf1rx6sFTm0d9Op
zK4wHfzuA96ZL04bPrT9u1zxxQ4jCnkVjzcrui1djHTy8YzzwadGQS3HGOpFEfOd5LcU0Pjo
MCstHqNroOOD1ORSlV3cHApoXemB605ffApa7sTViN8lvkOPcU6JwBjqfWhT+76Z9TSps2ZA
ANRaw0rkYyXzUkjF+g3D09KeyovSolfHHTPetYy11BtvoM5Hb5v5VLGCWPz01nTtwxpiliem
B65pNt6JCJGAHIqMzAtgUrZRvmOB2FNZATkDH0qkl1GvdHMcj3FBkAUANg0wBg3t70FQzHHT
1qX8VhttscWOT0246+tIvQ/ypMDHJ6U6IDcSTxTcbO6BrS44kMAh4ajBUAN97+VNlIY5U8jv
SK5ck7sn3qmkld7ii+rQ99o4ON3rSRku/U7abu43MMt6Yp0bHb93jPUVLirXAkYguR/DjpSO
QR2BprOu88496YUYjhs1HwqwlHW7JHCKR8gb1PSouGzzzUgBBG/rjvQoQk4xTTaC+ugkCknc
aVgADznPoaDgI231+lMYAYXPNW1fUnUkDhcZHHekRlDnn5M9KjeTYw9MfnSgZwQNuaz06Giu
iaSRMDB257VGdwb1Q+tIVPcZx3oJLEAdPSizHccw6Y4pI22uT145oYn3yKUHA4A9T7VT+HQm
19QjJkJJ/lUoKBM9PSmoAqnBz700srL8vGKzTlzDtcWX5ODzTSwZevehxuUFST65p0aAQnIG
c5xitpJb3GkJktxyPen7RjGODzTVb5OhY09DxyeT3rG1ncE9xZOg4+XFNb5Uzk5705JQOGXO
OgNIcSDpitIvTUi9h20FVzwTz0pBK4GCaazMOxOBSgZPPU1m7ST1L5kSb1HBwM0oAOV3Aims
qBwPvEUnAzjhu1UkiVruSDGdvAI6GjbJyWb8fWmc7hxn1NTtIBHjODj8qbjbUbukN6oAW5pE
JUkFsgU75Suepx1poB6549KTsBJncAacoOc/xUxFO3k8elSRof73IFV0sgeiI5PMOe49KiT9
3JktipXl2If71QAmSQfLz3B9KlxvYe50mmOWUZAPJ5zV26G9fujNUdOZfLBxtGTxV2Z1xjdW
i0MnpqUHyCfX1pxLMvGT700vvfFNSYhyOiisteppuieJhsxuy3vVmJlTPQt/KqiBZFJXg9jU
qYQ4b8zUTeug7F6FflJzyamt03Pk8YNU4nKtg5PPFXoSCODiobsw3ZtaUuJ0HYnvX0n+x2zP
4ymWTJCT4GfpPjH6V806cSsqtnITnr1r6a/Y3Uv4paXrvlzj8J646663N4abH2sfvmloP3jR
XpwVonPJ3bYUUUVZIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFF
FFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFch8XW2/DrVTjP+p4/7apXX1xvxik8r4bau2M48n/0clc9f4UN
H50WEbC2kJYEGQ/0ol4HB/Kk0pW+xT73BJmYjnoOKZNLtXAGM960bbZm9ypKeTnkdDVeX92R
tBOast8qnIyarM/OSDx+lVy9yZJDHKqM45NQkcN6/Wp2ZcZxmqxYlzxwf0pTV1dBo0MYFeT1
PFV7gFlC54qxK3A5qu7jnrgULbUvSxQuCFYAcD+dSW/yyxbG25cD9aZMA5AHT1NOtgPtMXTa
GBzn3FbU73E3oey6RIItKQFd25j8w7da4TxmTHdsxO04APvwa7/SEB8OqfvOJGyfQc15548Y
zXg7cr8o+hr0Jp8tjiSvNs5ckDnr9aGwnLEMPQUx2+XH3frShQwxmvOmjrHEgjhdp9aYBsyw
5PrS5+bGaBIoUgClbl1DVkblmXO47aciErnoBSbW2+mfXvSZJU4OPxpXV9Srj5EIYZ7DrUZQ
88/nTizg/MQaTeWI7AdavmvqiPUaEORzwaCuDg804MMt/Khm6H0pN66lpWEUAnggY9e1Kxwc
5/GkVcncTgGnhF5BYYo+Y077hGQ8iMRgodwJHeuv0j4g6joyh7eV2ZOdrMOec9CDXFmTGMGp
w4VhuYDJwADXTCctFElqLV2e7eAvibrnjNvLu5HjjDEFH2gkZUdlH941m+Pne4s5nRsZXbt7
/daqfwt06ezR55TtUFmDAEZwV4/Q1H8QNbhgDQqNsjqPlBHGQwzXouT5PeOGVlL3TyiBE8lS
mFA44pyxM5xkBTUtratIAkahm545rT/4V94knjE8SskJ6EROR+e2vLcW22jtuox1I9GRItQh
DYYnOCf90175GGFhaSNygiQY/CvBLdPsOpwrLyY8ls8Z4I/nXtdp4hj1LT4TbphURVKEg9B1
/UV6dCTW5zVrySsXr74xeF9CMdu2mwzzNncQ8QII4P8AWn3tz9pjFwiBVkG5R6A8/wBa8R8Q
eEru68Y2wjhLwSK7O+1iFPzHnjHpXs5kWy0yBLhwBGgBY8AcAY/SurmS0RzySS03PN4/CreJ
PG8E8wBtLZ8PuBIJyx/oK77xbrNr4W0EW9si24WHGYyF3EYGf0qa3t4LZXmgCruBcso6nGa8
k8ea3qOr+IY9PSCaZQGwoyQRuOOAP9ms3Bxi2hp3aT2Od1O+l1XU5bqZjINxKb+cf5wK09H8
Y6p4bZJrSR8R8hFIHr7H1oj8D66bV7uW1MVuBuPyPlR/3yP51h3t0tosqnLGLIIXrxXmP2sf
eO+PI9Eev+CPjn4l1zUv7PdngUKuGJXnkD+4PWuu8U3c95aSSXcjSSFCRk/xba8j+Fto2pX0
N7DGyY253L/t/wD2Nel+OdbttL0wiX/XbSOCP7nufpXqRbcb7HJVUeayPn25jZb11kbDBlJP
4V9KeGXEvhxW+4iZz78t/hXzXqUckrm4Zwi5GQep4/8ArV9I+G9s3hGBEzGdxLHHUbn/AMay
pa6ly0hqeR/EgqdXVJE+cbDuP0PFcva3RtrpZo8rKpBDfQ1ufF+eSHxDCE3FCYtxX0wc/hTI
PAGuavbLdWMB8gkgOI3I468hSK5Kik5tJF0ZpRd2dp4Z+MniM30dqkhMTBiZBtGOM9k9h3rt
PFOjpq0TC+Iu1fa2HJOccD+VeN6Lpd94d16KG/wqurfvOQASCR1A9K9y1UfuowpLgL1HPc16
FFO12jGq43VjN8FOLayUcnykC5+gUVH4j+M+uaVqttYQO3lknLPsAIAfjlD/AHRUugosOnRs
FKh1BPvwK85+I1wLfxRbsI3kjBOAgzn/AFlaSvb3TLdnq+vWUviGKGa8uFZpIw2H6DPJ9K+d
tftBaatJDDhQcsfT7x/wr6UvY1Sw05pDsQ26kk8Y4FfN3iCUTa7O390lcZ/2m5rkr3UdSqV+
Y7b4ICN/Eisi7P3gDqfXa2a7/wCKYVdNvdgBzG+fbmvO/ged/itkWQFvNBKqf9l69G+JikaH
qhK9Eft71cU1TY6r94+cwzPLKH7OwGemMmmuNrdvpmmLP5kkvs7AfmaUtg5PJrxJ3Unc743a
G53E5O3Hahh8hwRnFDfNzjHemMSSQODS0K0T1ARsRhj05oEhXK4JFBckEMSp708FeuMZ9aGt
LlrTUhuN4uLEqSA1winHpmvqvSW8nwrZxn5ly3A6feavmCLZ9ottyhgJFI9jnrX1FoSH/hFb
N3TeAz846/M1erg72dzjrv3dT5++JSGPX49uCQq898bWrO8K2NnqfiWC31LabPYzFXHyk4OM
8j/Iq38Rrjd4tCqGJMS/J3HB5rEs5zDOrbiHGfmBwayqtRq6hRtbc+odd1D+y7H7Foyi3RlV
ozEeMZ6988CvmjxAmoJqcqavcG7LEsspXAHzHA7c9fzr1n4deMP7etza3pPnrlY5JGBPyhfp
x96qfxB8FrqenSiBFjuQ64facjk56fU16E37SGjOeS9lK7Ln7Olmv9nXUjxq8qyr8+ORmP8A
/XS/Hl5JtMkEMkkIUYwjFcnzF54NH7OFx5fh/UhKdsyzqg3Hk4TmovjtqEVtoiEDfIEywXGS
d6f/AF6dJOMHZairNcxwdv8AFvXrLS47ezmuIhtB3rJg5wBk/L7VhaxrF5r7C81CR57pFJDu
2SM8nsO9XtG+GnibVYEltrcm3wMkRSNtyM9k/rUXiDw7d+GSlrfZE0qEj5CvseDivOn7RvXY
6E4aW3PVf2fpTJbRT8hk35PrzKK0PjWc6BdSnjcsv81qj+zvEZbZgg2pGHDZHU/vf61P8e5T
Z+ErxjljskwoHI+Zf8a9aKvTZhVtzrU8KsUkuxbW0HM0zBAwGduTjP6ivpr4Z+EbXwT4bh1G
7EMl3Pbqxd1wVIy2ct36HtXl/wCzl4RtPExa8vPLcxQiRA67iCJPqPQV2/x08VXPhnwmsVjH
Jvj82MGLgAKhx2PtWGFpcsfeWppOd1ypnnvxP+IE3iu+fToHmjgH+sDOCpBQDHH1Naf7OFot
tqV4oO4MiAHHT5zXm3hrwj4p8RxrcW1nM6k4aeWJznkjqEPoe/avaPgj4S1LwrrWp/2pGUjE
SeUzRsgJzk9QKa5nK8hXjGDSep3HxE+KGqeA9PkNmjSvsJAAXAO1j1Kn+6KTw94jv/iP4UTU
Lt/IDu8flMo7ZHYD1rj/AIzTefp0r54CZY+nyvXRfBwC6+H0ZRtiieX7w9665XvbocunK+54
38SIT4N8U+bZczsiqTFxnKn6+gq9ZftKeItEtvLS2umVckklT19yhqr8bblbfxMkbDEmEPPH
G1q85uL1tQkFhZwyz3UnIWNd3AGT0ye3pXnznKNTliddJXj7x9paL421LxD4KF7czukzsnBI
UgFVOOAPU159p1lBceOBO0SsywuNzDPc9PzrqPDUDQeDYYrgC2+WNm3cAfKowc45zXD+CvE0
Pibx3PBap5SRJKmdwYMVbrx9a9BzXL7xzOHvOxofGcTXGim3S6ltQ2cSRuQRh09CPT1ryvw3
8VvEGhaNBZJO80qqo+0PIAeFA7oeuD3716b8c5x/wi6yRPtmGQQDz9+P/wCvXiegeDfEHivT
47rTbOZYAi7meN+4yOikfrXNXlNtOJpR5deY9L+COv6p4u1jUpNUunmuUlZUZ2zgBHbA4HfN
evLqel6Kk1zqsUc0EWdwk24PY/eOPSvHvhLbP8P/ABWLPVlaK5vzmNWXZyUdTw2CeT2rqfit
ZXWueHtRtbN3t5mjk2OM4YkjB4+lb0pNRd9yatr+7sdfovxR0DxXPdadoulxQPETH5sRjx/F
0C+ytWT4z8RXXhXSLu9tAyzQo7qUOMEe+D6151+zx4O1TQL2aa+blycsQ2Wx5ozyB6iuv+J9
6NbtLzQrBAdQlSSIKDksxAI4GT6nitVL3WxT5U7ROIX9rDxDabIJLe6uMKBuTy2BPHfZXrWg
eK9Q+IXg61vZGe1kkXcyOoBGdw6qB6V8xa94A1rwrpLXOoJym5sCNwwwCx6qK+iPgzci8+Fd
hOg/eSRKuR1yDIP6VhGU5PU0qcihpueL/GHQ4fDN/aTW6oryzCN9owWG0Hn8q5rTL+50+9Nx
a+YZRj5EJz1B/pXcftHhbG7tBLIrP5+4c+ka/wCIqX4H+ALjxjqf26aH/QwFJEiMRjzMHpx/
Ca4Jxl7a0UaUpWheR614cs59b8Pw3V8pt5JN4cSg5ABIyenGK8B+LEen2XiZbXTGEjhY3eWM
gqRzkcE+1e5/Gzx/Y+CbCWzsMRTmPCiFlAyyOQPrnHavmFZ553Wa7YzXTDDSsc8Z4/pV4qSU
FEVKLcuboX/Du4eNdPJztKOPodj19kagPJsYCW6Jyx/32r418P6rbxeNtPt2ZS2x26j+49fZ
Orq02mqjZX5PT/bNbYNWgGIleJ8U6v8A8jLqDg5/eSDP/AzUZJUZXj3qbVAv/CR6hgggSSce
h3mmkDaMDivJr8rmzpo6R1ICNxxnDEelPWElsFgR9KRoju3BhxTosseSRmuVaM2k7I9U/Zns
FufGFxK0H2gx3H7sbM4wkhGPxx+VeufHa0u08EarI9wttGIJWaJmKuwyvAGK+c/B3irXPCWq
xzeHYJZbhmywtxuYNggEja3Yn8jWj4o8Q/ETxYtxNrUt6mmru82K5jZVKk5I/wBWB6V7VKo4
w0Rw1o3nG7PP7cYtlZTtDFjz1PJqaNQwyT0pcpghVGxSQFHbBwabkemK8aTu7s7UrJWFLAM2
O3X3pnG4mhx1I696PMUADbWfXQpCBhn1z0o4OMZ/GjaGII4FSAIQB0xVpprQHa2wzA54H1NS
Ku1STg8VGykNjOafv4wTz7UKNtROwwAs/BxW34M1SeDxfa26O6gxuWwcA/Kf/rVkoVVgcZHv
Wp4UEZ8WWpAAkKPz/wABPFdNFrmE1dH1zr+nw6TZ288IxJJGjNtJySc5P6Vy/g6R9Utrh7lv
NwxIDc4Hy/411vjA7dMsWdsN5EeQe3BrkPhnDK2lXxblwSR+cdfTK7szx72uV7Sw0y48YmSf
T4pphEAjsPu/6zNW/ilrmpWXhtora+nt7ndhHjc8AOnA/DP51HpMQfxTI7AkJGoP/kSqfxRu
ANAnnYA7XOCe2XSqikr6A9bHlWj/ALQeq+H9Ltre4N5eTrEq+buVvmCgbuR681y3i3xtd/EG
5S4vPMHl5Chwo6nPYCsTQtG1DxPBaGwsZJi+0BnjYgkgHsprY1rw5f8AhOJP7Ttfs7su4LtZ
d3b+JR3rwak6rbutD0Y+zXqenfs06xdw68ITPI0UTMqpu+UDbL0r0L43vP8A8ITrspnYwzQy
EoWOOCK8w/ZlIufE0zKQVZ24HO35Zutem/HEkeAtbjP3UglyPqRXfR/hO5x4nSZ8l2EZ+zAq
xIbJ+nJq15Z28EH1FRacMWMeBtHPH4mpS/lN1yD2rwJ39o7HqQd0IoO5ueK2vAmoT6X4ngFv
I8byMoZlOMjev+NY5ODweK0/Caq/iiyycbGVj2z86VrRXvK4H2vJfReE9OZ7dNkzozblOD39
f90VyPhfxxp3izRjdeIL3y5F37obiVQTjp/EvUE9q3vF8El1FOqnaqwFhn6HivjzxBrEz6/d
RR3s8ECqv7iOUqCdo7AjrmvoalR04RsePCKnJo9+0q78NeMPHf2vTNLjZIIDGshIbLYycEE9
nxXp2t+GbjxRaiV9cj0yMEDLyHPGeOo9f0rwH9k6BppbsTFi6GVv3jFj0iHf611/7QOu6jpX
gKaaw1STTts0X7yJ9hGWIPIrSjKMk5MurHl0R6pb6P4N0XSZZdQ1e01JoyAEa5AfPA4/efWv
IfDVz4Z8Z+Pp5NO05d8aSokjYbADE9iezfrXzhp194v8QwR+VqmpXAdAxJkkIzjOeM+te3fs
2+GNQ8KeJJk1VZJJWErb2DdCEH8QHcHmpc+ZpWKjCMep6F448QX8kVvbC8mW3wVKB/l4Ixx+
Arr9MuTpOlKLZmjXapJjbHYCvPvHrJBdWiFgEfeSemOldm2X06OMSrGGRSpzwRxW7XY573R8
a+JpZNS8Vak9wzSFZJFQuc4+d+le7/sw65fXFnqdlNdzPbxsESEuduBE2OPwH5V4ZrxR9c1L
aNp8xxz67m5r2H9lwHztSTOZPNOfp5Tf/Xrx4Saq2PRt+5dzrPj/AKndW/w+voRPK0EsciNF
vOAN6DkfjmvHPgDrdh4a1+I31lHdmdk8iR9o8s4fnkdtwP4V6x+0TOv/AAhV3Cinf5cgLf8A
Akr540aa5FpaGxt5JbmFFIeMEkED2B64NXiVeom0c9K3Kz6u8Y32ua1bINP1e5s0I8yIxu2A
pXgDHYZHT0rzbUfjTrHgpXtdVtL+9a1yguzyrkDJb5l+lSeBPivd6fBa2niOwlgtyixJcXO1
QTnHBZR27Z7e1dH4z8P6b4o0nz0hgnguQzxOFDZUqe4+o6V2/FG6RErJ+R4R4l+J+uazepq+
m30+jMzAExEKz4AGDtAzylfXXhHWryXwZYzXl7LLPI7KsjtyDvcf0H5V8TeKtLn0CSCykjKx
+aNp2kDpk9R/tV9l+HIxH4L0gSkY81yM9sO9c9CUuflZ0VFF07xPnv8AaE8aeLH8Z+Udeu/s
PlxbrMtkHhsnPuMj8a6P9mLRtK1mKe6vrGO6lLvsZicrgxgdOvf865H4622p6h8QSbPTJrmJ
oYh5ioxUdQeikV6L+zJoF54d0+6i1FDFKPNZQQw7x46gehpSjJ17y2M4OKpvuex+JPDWv+Io
D/ZPiMaVGuAUZ2B469OnUflWivhHQrDRGm1jXrS9mib5hJIAzZPHV+2f0rxj9orxvrHhXws9
xpGqzaXKxi+eJ9pOXII/IfpXzx/wlfj3WoPKOqatcB+SzPIRx+Fd058qsjGMObdnqVpr9tH8
W5U8OM9nayeeJBG+Qfmc54J9E/KvphvECeEtDYxqXugV3OCD1wD1z6V8afCHT7iz+IYjvHZ5
PJlYtIzHnp3/ABr6t8dREadesgIRSDn/AIGB/WooNSbbRtXioxVmPj1nTvGOm2+pazrFuhKg
LDLKu5QQGxjcuOW/Svlz4yvZSeOYTo6gWSrIHZTkE72x0J9u9cqfEeq391eCLWLmO1jndI40
lOAoPGMH0xTZbhpVG93ZiOWdix/M15uJxCleNzSFHls0VxgtgilZgmeM4GcUhQrzmmSv5cTD
aSzA8+leLbU7mrnp3wf8DL4g1G3vZUV4i6uEZSdoG7Ptztr6Hi8Ty+F54NKsC1tCy+X+6IUc
Lk579z+dee/s4RRyeGZZWUCRIuM/WUVv6wxbxDAT13v/ACFfR4RxUFoeZiJNz5Sx48ZtR8Oa
hPI53MjEMTk/cbNeGfBLXLu38caxp8VxIscsm0hWwP8AW4/9mNe7eK1WPwfcu/KujL9Pkf8A
wrwH4HRB/i1frjMZuQOfTzxW+I15bCoWu0z6w1DX18HaRujdnmAYswYY4yRwc+tZyalpfiS1
XUda1FDErZ8maRdx6gj7w7L+orL+Iozo122SNgJz/wBs2r5Lk8aeIryMKNUk+zryYwwwfyH1
/Orq1PZU02ZxjzysL8Z4LVvGMl1oh8i2SGNgEP8AEAcngn2r6Z/Z18WX2u+DFvZZ5I23Tckg
Hhh6Yr5XupluFllmy/yHJY54xX0p+zpGF8A4gH7jfMfl+ozXm0J+0qto75x5admcr+1Vqd1q
VmhuZ5JAGixubr9+uh/ZdxH4GwYkG5pj5uwZ++vGce1ch+03JnTY3OfvRYA+r1c/Zz8YRWWk
LoMrotwxlk2l13KMhs4POOP1roqNKqr/ANbHHBNxdh37Ud7Je6dEJHZstGFDHoMyGui+Atwt
v4QAVUwsC5yo67YvWsz4s+Er3xvpMsMLYu43XyyUJxhjnoPRj2rqPhj4Yl8K+Fvs1+VScQoG
OCoziMHrjuprocE5qSHGUYxep18mkWepPHPeQpPNGMRFxnaD1FXZtB8T60VOn6x/ZsMY24fK
g+mMD0rB8JeIF8S2txLBwkMnl7iQc8deK8/+PPxL8R+GY7aLSNTm0xfK5aOTaCQ4GenpXSmo
3aMbNux7J4r8A2Mehyzazr1rI4hw6TN9/pnksOMmvDfhzqQtvG2q6Lpbp9hkuyoaHBUcyDOR
k8hR3rxvVvir418XgWdxq+oXEJzGzKxPB+gHp613f7MiSReNLkXLSTyJMpYyk7j8snr7ivPq
VVJ8tjoVJxTdz6YuvEzeDdOQu28KMErj168/71VNVtrPxHpK6pqWqQfZbqJn8iWUZxjGPvAe
nSuY+L9y8Hh/UZ87YgkjBj/ByK+Z77x34m1G3FtHrMqadHlERXz8uccce3rXRWqqmr9DOMOd
lzxN4SbxH8T9R0jw6V8oSgvJCC6BW2DJ257sf1r6y+EXw6bwj4MWK6a1uLhoETKqd4ID84Iy
OtfGui+J9Q8G3s2qWUjyXk42yylvmYZz1Ib0FfWPwh8YT+IvCSX15qYjmaBHZZZgNpO76eno
K46MoTnzHVVUlTtc5P49/BvXPGmnrO+sxWMFrIZ9tyrEHEfIB/CrXwy32nh9tsqktwWXoRue
uQ/aW+KmoXNhaW9hqc8KeeRJ5Eww6mPkHHauw+FKx3fhFpUcEKemckfNJ/hXX7ntEc8VJU3c
3Nc+EPh/x1GL7U5rRJkIJM6ZOFBxk7h61uLo2laHYCy0gRfZAS/7jG0sc56E+1eHfHnx1rnh
1nttGnngtGVQ88bfLyj7h0Pt37V6l8F7p9f+Hq3l07STCWUFpfvECtI8vPqzF35bmfqXjqCw
1ZNGucDzE8xdxUAdT357Gmaj8OIfiaq2VwscznlHmUuF25PGPqfzryP42STat4wij0iWS31E
xJtdGIwoD5Hy5/lX0n8I7K7g8Pw3V4d17HJIvnKCAQfwHr6dql2lKyLekFLqZ3iBtN+CHhWQ
NDay3ERRCkW0NyQpxu5/hrF+Gmgy+LIhrN1PFcSzAyIJWJKhlVto7cbj0rzr9pTSvEfiyG4m
tdYkAEwJjwfmG9+Pl/3h+VedaR8WvEfhKxhisri5VIkVNkUuMHAHTb7CsarjBoumudaPU+wB
4C1W4uyVvUhi5xw2O/t9K4j4weBbprKS1IDCRQd6o2OJAfT2rG+AvxM8UfEdHfUb6e3EbhfL
eTJOYy3ZV71tfF/xle21guJJDjIPzc/fX2rqjNSV0zKUJQaRy/wt+IGjaBon2LVG2shSI7ZF
H3VAPVh3rq7rU/hl45u4obvToNRuR8iedIjkZ54Hme1fHEWpXHzyyfbJXmcybQzYXP4/07V2
XwunJ8daP88q7pQWVpD6HqM156rO/LbQ7JUYy1PXvHPwz8NtFePo2h29i8IYq4jO7jHI5Pof
zrwC52wazd2kgLSRS7AMf0r7I8R20KaHPIgXzGts57n5BXy/4b8ITeKfindkR7oBeEPlWI6M
B091pVaEZq6RFKdnZs9B+CfwwGrTnUrlYljCpIfNQjK784z9BW98efiX/wAIrp9lounSNbyo
xhV4JAAF2Dgd+pH5V2Wva1pnwp8DW8e1I7mWJo9yME5Cse59xXyX4+1248WeJIL2eZ2t2uco
rNngleeP92m3ChBR6hrUqX6H1j4bMh0CCbe2ZWIOSc8MwqHWPgXp3j24t7u/e02wPvzKhOeg
9R/drQ8Oog8J6ezMAGd8N6fO1eNfGL40a34RvrbSLCe5gWWTBuIpQoI2rx0/2/XtXRTlzRuZ
TTc7I911HS7fQ7WO2tZUlhjGcxfdyST6muWl8R2El0bHy40vQu7cWXODwOOvU1r+HZXvfC0d
3cuZjufJbrxn/Cvn/wCIWr3um/EG2nsZHZmjiUxo2N3zdOAeuB2rVtKJMY3lZnqurfCqXx7I
vkxj7Qrb/METHoCP4frXTa+3h74SeCWuNQtbea8jkG4DasihmwD8xzjH8663wJNd2Ph5b5Bt
u2LAD23Y9Pb0r5s/aHm17W72e4vJ/wDiWbYg8Kk8kcDooGM4PXtRywcbk6uXLfQ6j4L67e+J
ru71CWVyTJIwXAxghDxgY/i9K9g1DXrW40/y0tY45Mg5O05/SvHP2bIVGjThcBxFkn8IeK7O
7kYuMErg9M/WsaMtHc1qRTZ5v8TfAEfiMx3MMUaTwg8iM85Yen416d4ZuZ30OzSRiCsagDpg
bF/wqLWYBDZkhQCQDkj3FT6WMWMewqflHI6dBWzjG9yObRmfq/7PMfibX7XW7i5thDDljDIH
O45LZ646kflXRLpyaBZCzTYtvCcER8A4wP6CvJfHfxq13S9as9FtJriKOVwplWbAA8wD+76L
6969O0eSfVfCkN3dOWZlDO5OS3yoevHqaVle0tyWmlc+aPjHJ5/i+5ByITNIRnp0U1xKJgZ6
gdK634zTeZ4yRIziNZ5AwB6jCVyrME6H6DNeHjeVTdj0cP8AANYbgWBx6imHmPpz61Ic4OMA
dT71HkjIzwRx7V5kN7M6W9B5kUL05qIAup6IPepVj2odzKabgOuRwKdlysgRFKjlqRuTjdhv
XNDcqCGx2we1MDAncevtR0K1tdkjtgcdKaxJXcBtU9qkaMFc5H4VEy5AXNZpXKj5iDez4z2p
+wjDdfrSqhGGB7U4kMeOP61NmiW7kDpg7un1oEvbpTs+ZkN09DTCAq429e9N3T0GlYlBWXhu
vYntQy5GNwAHeo0bbwRn604n5SCRnqK1SuyJJpj2XbHnrxUTJhchhzUgBKcnPFRBWORn/wCt
UNWegXYRjqDycUcpu64P6U7AXPPOOppM/L8xBB6GqcnoaDSnGc4FSCNUXgjPrUYlD5BGfxpz
qSpVcHHoaHruS3oOyAx47U9QUGKhOduD94dTThKyEg/NxTlawbajSPM9qVZDtA2496ah42/x
etPb5jtH6VNinLTQeq+dzu/PtUe3YSqnHvSxt5YxSuQy/Kv1NRfoyHoxqNjO44+tPChxuDAH
1qIgysCOwxg08DC4/rWlTTY0cRWi3MpYjC/rQzfvFA6UMvyZ35PvTN20ZPJ7EVC1dkStSbBc
HFRgGJuadHLgZ6GkLfOWYEj0qr6hYfkHLHjuKYhG9j1B7U8lXXOMY7UzHUgYovdaCVxVcAHj
j0pCAx+Q4B60r4Cjjk/hUKtk/L8o71OqdikuhYUZU4YEDvSKTt9KQqQcAEL1pwfgnFZ3ew2+
VaCLuQcnB+lCkkZHH1oY7uSQoPYmlU44I6VVxavUbJJgc4zinoQG4OOKAqy8nGaUIDnHWk7p
BpYdITwVGAaZCrPnJOfU1IxZRjjBHftSRPjIA/OtEk1dEtW2FVlDcjJ9aSTB6fKaXAGT/doW
RW52n0ye1K9xp6k0C/uwx/Wmysn4885poYndg4UflTXUErkcd8U077Gml9R4yFGDxSg4ypB5
70wtsICg4J4pzsdvzYUnoaj4pbC0uPCspzk49Kakkhc4bHFORzzuO4fypElUucJ+VDveyE30
EnOT8vXGfWoY96vu3ZqaVvLGR1NMgYbsHqT1q1dbjSa1Og09f4jwpzwauS7SCx6dKp2SEoF3
Z6/hVyePCH0pNmK8ykSoB65p8W1sgoPXNBXa3QNSs6qOBs46ms72VjWW2hKigjCDB/lTzgkb
uTUUO4I2WHOCCDViNAwz/OsrtvcIjozubAB64zVyFCrYz1qqhCDHc9xVmBmUrk/jilr1KsbF
sCqDa2CBkmvqX9i5A2sxsOSWYlvwnr5ZtvuHnKlTn6YNfVv7FEW2+3Y+Uk7fb/X1y4haI1jo
mfZB+8aKD940V6kVZHM9woooqhBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVyPxbIHw71UkZH7ngf8AXVK66uT+K/8AyT7VO3+q
/wDRqVzV/hQ0fm5oy7oLhjkhZSufTpS3IJbIGaTSB5dncZBy07EfkKWdc+2K1jpuTKxUkYhs
Y685qNuVbHU96nY/Kf72OKqybh26jmtZNPUhoheM53HjFQvMFI61MZSBgg96jycEY609Lahb
QhkIKk1XkOR0NWn6emKhkYYI71DvuC2MyRypz29KmsXG8FjwOeeO9McKGHPNQlQjdetaQnyu
7Ez2Lw3470TTdOWK+hI+Ykv5wHH4kUniDxn4J1FGFtbSSSleCJwecH0kPtXkRVZVAZfrzSrb
Ih+UY/Gur6w3oZ+zW5PdqHuHbjYQMDNQn5Tx0oOEGCR1ppA2ZHPvXNdMu1kDgL060rIAOoH4
0O4C5Gc461FlmIHU1Eb2d9Rx7CySFVA6/wBKDgDjrUjDdjd8px1NRFSh68U5WuU0Eg3kE08I
GGR24pFcZAIx3p7v3z0FCXLoyGMwDnsfWmK3zH2p7fNg0wDDE5q5crQ02ICG3Z7U5Ychj7UH
APJpPvnjoKzle2gkmOhXzGyeMdq9N8I6t4S06HfqkLlx/GZdo6k/3x2xXmJ3BjzQ43IUkG5T
26V0UpKO4S1ie56v8afCttbGz0uBncgkN9oQhSQf9pvavHNXuG1XU3vGbAKhFU9sf5NZi2du
q5RcEc9SaerdQauda/umcaSTuaWhXcdlrMN1J8sSK2QTjOQR/WvbdT/aO0yExfZbB2RBt2rc
IfU+h9a8DD7TxyxqNMRk8YpQq8qtYco8xev73+0NQuZ3GBM7Pz2y2a6Pwj4nTSZcXTAxbSPv
BR0GOfwrkwfMGegphbK7TyMdKFX5dblpK1mfR1h8YvBWlWGTGwlwMj7QnzHgE8vXk3xF+IB8
ZMsenxtbWnzZDFX/AIgRyB7DvXE+XGzD5Dx7mpI2KZwcAVrLE2WhiqSV2e5+FPij4VsLBLXV
IDI+AodbhVx8oByNw710Vj8YPh7ol39qigdZjj5hcoeBnsZMfxGvmgW8TRyFhkE5bJxmmRWk
Fvu2R4D8/eNbLFWVmS6SZ7946/aI0vWtPvbawspHDoyRP56HsAOBn09a868D3nh+0u5bvXA7
vcSGYqGChcljjO9fUdu1cUkaB9wXafrSyjzQ6t8yMMGsp17yLjDlWh9CxfGnwR4d014LC2aW
QoUC/al4ODz989zXjHjjxUnjK+lkgVoI/OMgViDweMZFcxFYW6bgEwPXJqQoY8YOR0FKWIfK
10HGmr3Z3Pgq+0G2mY6zE04AG0I+3nd/vDtXtFp8efh9a2kVl5EimPJz9pTuc/8APT3r5ffD
RnIwKrrZwMG3R5z/ALRrSliYxVkN01Lc978WfEzwPqUkgtLCSWRkxvFyCvQjs59qxPAvxZHh
a1FteMstvvOFDouASCeSPrXkcFnDbqRGAg9Mk1I6+YNrj5T1FT9YvIUacVofSUnxg+Hk777i
MtMBjP2pBx/38rhfiH8X9H12FrHRLaSKE7SH81ZBkZJ7n+deQixtUjI8o7f94/40+3gitkIj
GFz0zmn9b00YOlBs9A8DeModFMcWonfAqkZDKo+6AOePSvVbf4mfD1Io5JoHMij732lRzj/r
p9a+b5GEkZVhkHtVc6ZAi427l64yf8aFiJRW4OlFntHj74xabrUYh06BooYgVA81XLfMMHv2
FeRWp338skjjDsWz6darwwxWyEKuAevNLIxTB28msatdz1ZpCnGD0PoDwd8UvAng+FXaBhdh
BljcquTtIPBk9zWT8UfjrpPjbT/7N0yzkhRo2RpWmVwckHtnsvr3rw6SygmnE8ibpF5Byak3
BRgAgZJxWrxL5OVESoxcrsWbAZlThc8ZqJ1b5e/uKlc4UHpTVbGSelcDd3dmydg83aNp/Ok3
AjpzSbQxJ698U4JleOPaoe4adSI7SeVNPXBBB6GlKlZF5/KnHK5Gc0XWhVyS2mWOeBWG5FkD
Fs9s819E+GvjX4YtNCgs7+2KCN2IYXK9yT3Yepr5vhwpY9O3NJcWkN0p81d2fc13Uq6hoYzh
zLU9t+IPxG8Fa3O7WGnyzzsFG/7SMcdejn+VeL3bJNdM6DahAwPSoLW3S0j8uJdiZz1z/OpC
Rs9eazq1HPUKdNR2NPS9R+wXkMinG3OenoRXtFt8YPDkVnGbqLddBQrr9oQbuOT97jnPavAW
cIcd/SmSxRPl2Tn1zVU8Q0OdNT3O/svG0en+Kp54E8uyuWaQ4cMAfnPJP1HevWbf4pfD0Arf
xFpO5+1Ko/8ARg7181hvk6ZqrcWNrNzJFn/gR/xreGLad2T7GPU+oPG/7Tvh600g6ToltLdP
cQlVnjmjZYjwACAWzwK8I0m9XVvGJ1bWJPMtzKWKgAEKSxxxtH8VczBa29oreWnlBuRlic/n
UzLvjIPII6etROu5iVKMVc+ofBvxe+HnhOya3MbCR1AJN0gwfmzwZP8Aao8U/GT4d61ZSxmJ
nLKRxdJ3x6Se1fLUllbSxhXi6dcsRULaPYr86xYI5++f8a6Prrh7q/r8CFRjJ3Z714I+J3hD
wpq93cC0KW0rAKxugMjcT3b+td5dfFz4da9ExngbDAscXa4/MSCvk5EiVdu3K46ZrPuNBtbm
YuU2gnOMk/1qoYtLcr2Kufat5+1Z4I8NaJLDawTXQYFViiuIic4Y/wB8nqf1rwrxF8apfEXi
SzvEV4LIOAYmKEqDsB5x/sn868pttOtLVvkjwV7hif61aLEj5vWoljE9hKjFM+mLL4nfD1rU
x6j8znIINyi8f9/RTte/aB8HaZpTWGj2UlwZASHW5QhGIIz95s44r5e+wWshJaLc3+8f8alE
USLhE29+pNX9ddthOhFamtbXUesePjqeqEixSLYFAGc7cDnKjqT3r3rwl48+HHh6RLiWJ4JF
DYLXKjrx3l+tfN3mbkIPSoZdNtZ1w0W4dfvH/GueFb3ueRpye7ZHvvxS/aEtfF2jTaTpFs6N
5yyLcmVHUhSeMAH2NeT+AdQk8I64t0soO5GBbgYJHvn0rnoEW3GyJcYGPWnlv7wyO9EsRKUr
vYXs0kfTujfEzwJPaE6oN82eW+0oo6D/AKaDvVrVv2lfCXhnSks9JtpJ0YZULcRnGNo/vMeg
r5Gu9Gtbs8rgfU/41ZsrKHToyII8H6mumWJVtCfYx3Oh13xFe+IvGtvr8sm1I3ysTKu7G9mx
wP8Aar2/wZ8VvDTWduuuQss0G1VdplT5Qo7bl7ivnYuxkVl/I1Heot78sybiBgEE8VgsQ09W
aOlFRtY+rfFP7RXhLTdEnt9Ohe5neIxxhLiMlTwAcbjnrn8K+ffDfj68X4kT6y6PDG1x5i7w
oyNrDuMdK5S1s4LRFKJh/XJqZsOT3qpYp3SvoZxowiz6ks/iz4J1OwCa2had1xJ/pCLkng9J
F7VDq/x+8E+EdEnsdFs2uTKhQCO7RtnynB++xPLdK+VbjT7adx5ke7nn5j/jUlvp9paMTDFs
99xOfzNavF2VkS6KbLl/LJ4x8R2d5dkpZpMjPE4w23KhgCMdQp719Uf8NEeEvA3hlLPRrOS4
IDgoLhM87mHBZj1NfJxKsCH6Hio4baKI7wuDj1rk+stNyb1NvZR5bMv+JdQm8U+IzqcjFYvL
VRG4AIK+4/Gqb7tjKnDEcZ7UNtbnNRM5J3etZOo6jbkWkoqyPbfhdfeCPD2nQ3GsEmVWfLvM
I+vA4MgFen/EX9ojwO+m/ZtGt3urgMpAjuo2yMkngO1fIU0MM7HzY94+pFRW+n29q4MK7cA4
5J/rXTDE+zhZGE6SqS1L2qqt1rF3eD5BO7MFJ+6CxOKphynyrz9Kc5OCM989KjQHcScYrgcr
3cjpjHl0Q47gSCcVIjjPHLetR53xkEUAhIsd6Tutxqz3PXf2cPFOk+DPEU11rC5meQtHIJAg
UeW47kA8tXX/ABo/aG0jX9B1bQbKykc3SSQi5EyFVJYAHAz6Z6185zGNotrRl885zRGQseFG
1TxiuqliLRtJGU6alJN9CK0jFvbhMhjycj3JNSMvFPwAfSoGmKvtyK4uZN3sbq1rIC5ViCD7
cUNMsSM7kIvqxxUhR3wSRjFdd8O7PRbvUJBrp2wJt2ZbaG+bnncvb61tThGbsyW+VXOBl1+0
yQqyNn+6AcfrSf27bAgKsg9cgf419aWMvwzjUKWhVh63uO//AF1q4938L1P7y5tlz3a+A/8A
a1d8MGt7/wBfecsq8l9k+Qjr1sV6Pg/T/Go3161Q42Sv7oAf619Mvq3w4vtVe2iVVQKCJTdj
aenQ+b7/AKV0dl/wrKKHLT227PT7aM/+japYVbX/AK+8n20mvhPkf+37YgZSTP0H+Nbfgu9j
m8daf5aOUkjkXf8AwghHPX8K+q5IfhgtqZWuLVUz0N9z/wCja4dh4Z1/X4rLw5aSO4y3nCQy
LwhJ6O3qK3hh6dN3uv6+YvbTenKe0RaRDqkEUt3KI1WNVLEf/XHrWBrfxL8H+BbGW3swl3ds
ApkS6UKBuGf4zz8np3ruNW8CX9t4fhE8kTAJGBGN2T+lfBPiz4Y3PhHxZdzXFyhjmZ3VNjD7
zt3P0Nd86qjDQ44LnlZnaeHPiDdaZ4yvr0nEFzIzqfl4H7wjkj/aFe86PfeFNatmbU7+AoSD
5ck6pjIz1Djvj8q+S96vGyyAsD6VlzaHbytlTtA6dT/WvMjjPebbO/2UWrH2tc/FLwH8OdOd
dJeG7mZG8uK3vUfDAYGSXY9/Q9K+Wfin40uPiDr8+ohGt4ondVifBJBctkEAZHI/KuOttCtb
SZJiNzqcqckY/WtHf83qKwrYlS0QRpcrufRH7OUHhfwnBY6nf3sYmlRZJomkCHJEnGTJxjd6
Cu2+LfxD8BXenXtpbr9pmlVuYrlWAJ2nHEn4fhXxlqOmvfLIFuPKXsNmcfr7VDp2jpYkSF/N
f+9jHr7+9XTxKUGhToqpLmkzb1+WD+1LqSEiK33lkVj0HpnvWJLr1qjbGV2I4JXGP516b8ON
G0TWblk1ieOKIBSA77QTuwedy9q9v0/wt8N7WzjSW6tFwuMm9Iz/AORazjSjWd72Zq5+zVkj
5Lg1ezycPt+pH+Nd38H7HTdW8VGe/vIreKEIylmGD86553D0r6Cbwp8MXQk3NnjHJ+3n/wCO
14z8TpvBdpYPb6AolnXJJjuN4I2E/wDPRu59K1VBUnzN3t/XczVWT0sfUOq+PfA134fuJWnj
aZUfI+0oGOFPQCSvjf4nS6Rqutpd6OGWPCAhju6A56MfauG/sm23mRh16Lk8H86vW8aRRYT5
Rn7uamtiuaKiioUFF8x3vwd8bt4M1qddrGOcOxI2gcqgxkj1SvfbOz8L+MbAnVNUtkgc820s
yoeDwchwa+TFuAIypHWs640z7Z92XYR/s5/rTpYpQVmOpR5tT7d8ReNvAXwy0aKOzaK5uXVC
v2e8VgFPGDmQ8/L6V8/eHPjVeW3xEuNTnDxWcwmEQcIoQMxZQWK88cV5Rp2mQ2khlLeZLgjd
0/rXoHwr8K2PxI1aXSdRuo7BcOwkmPB27ccbl9T3q3iedpRM1R5dz6K8LT+GdfIebV7Z5Oux
ZUJGRns4/wAit7xxa24ggjteQqYB9sjHc15ND+zg2m3SvbyeZHGSPlikO7jGepr0TxTeQ+Gt
GgbUGMcixKFTgFuVB4JHrXswqNRfMcVSK2R8XarMZdd1kLlm+0vGMDp87D+tfT37M9joHhvT
hLqGqQRS3TK+2R1TYxiwc5cdz+lfMjzCfWL+6jGElnZ057Fif5EUXyPfQskjAED5T6V4brRh
U5j0eRuCi3ufW/xnuvCj6Xqlv/aUF0Zo3C+TKrcsB6Sc9f0rwz4L+LrDwR4tuLa6tWuLK4mC
xyCTZtT95zz1++O/brXl1rpMdsPNlPmSDkHkf1rQJDRbSeGGAPSqqYlOSZEaMYJo+w9U0Lwh
46sgJ9TtbeOT94I5JxlcgjBxIPWnaprfgn4WeGLO1N1DqsiIVhFvcqPKwCRu/eH1HXPSvimf
Sg5YrcbXJ/u//XostLW3l3yP5knqBjv9a3eLiloR9X5n5G/8RNQfxzq6XkZEECHKK2CfuqDy
Pda98+GPjODW7OHSrm4jtQjArNM6heXbPp/e/SvnR5Qw4PSoLyGaaMiKXy/crntXHHENVOe5
0OmuTlR9veK/G/gzwLZeUt1FfXgBO63uEIbIYj/lpx0A6V4P4O+Nl3c+J7q3ntpYrd8NubZt
6RjGdo968OtdHto8PMvmSD+LJX+ta3mF1I7EdfSt6mLXQyhQir3PrHVvAWg+PNINve63ZhNw
IG8Hbg+zj1P51teI9a8EfDvQIzDJDc3YI+aC6DfeY9QZPQV8Q3VreuuI7wRqOg8sGktbCUSK
9zKJXXPzAYrV4uNrtEugz2T4TwxeM/Hl3rN5dw6TbuZyq3LgEZIYDsD97r7GvqDx7ceGW0WR
4Nes5AQgMazISfmz/f8ApXwRqUkl5Y+VHN5LZBztDVlQaXeW8iOb0MuOQIx6VEMbGmnoOdHn
0Os8Xaba2HiC4ksJA9tOzMR3B3N7nsR3rIJVVY5Cj1JprEhcbhiu6+H3gTS/Gls8moX8FmyN
tCStg425/vLXnSftpXR0xXJHU87F9bbgDdQ7ug+cVKJVlDBZ4yxBAIYV9Fwfs7+BjCQdaswX
xkmVuv8A3+ol/Zs8DR2srjW7PABJxI3/AMerqjhNLtmft1bY5X4JfEKDQ7SbRpV3tIAhkDqF
BPmHP/j1ez21jpckEWoXOsWaFhvWPzV3D2+8PavnXx34N0PwhEy6RqEdxLGwC+Wd2PmX/bb1
P5V59drf3sweS9XCnIHlj/PauiFSNFWbMpQVX3j6915tMvrB7Z9WtUgkzhmkX0I/ve/rXC/C
fwFplh8SdQv49cs1s1kVtxYc/vAx53Y7N3rwFo5p4kS5nEiL9xQoGPypwuryzj8m1n8qM8MC
gPH4g+tJ4uMmSqNtUfevxOsvDs2lGVNes9swcFRIhPCY/v18ReKLC20zUpVtZxcQHAVl7fKP
c98965tZNQ87L3CSRD/lntAP54qy8pmK7RsXPes62KVSPLuaUqHI9R4PmkRDgzHywT054r7L
/Z98LaZ4b8GfYpdYsw7vKNvmAfeI9WzXxpu/ehs8KQR9akvNR1SaUeTfLAg6Axqf6Vhh68aU
tTWrHnjyo+l/jz4Z0W9t5Ixrlq8kXl4QMuTyfR/Rq+aNHvH0TWV1ZEZm2GNkUfMQfr+FUYop
RL51xP8AaJRxuCBf5VcWXK7j2qsRiVOV0yKVLk3Ps/4VeI9C1vThqmoXEdr5UeCJZVUsSE5+
8B/Gfyrjv2ivjBo2p+G5LXQ4HF/G8Y83zUfcAzZwuT9a+YZZp5YjEtxiNjnbsHH41XhhSGQy
L97GDmun62lHRkPDJyu9j3L4E+MkGh3WmzYhkllU75GVQMID/SvSde+C9p8RoYZL3VbZDGu1
dmXwDg9mX0r5PTUbq0ANu/lv7gH+Yqy/iTXwgRNRjQHnmNP/AImnTxStqwnRvrE+rfGln4H+
FHhC4dmiv76GA7UhucNkYXGDIfftXn/7OOip4l8W6nr0c0Gm2dzekrHO53KCHbr0PDgZz2r5
/H2m4ufNv51uZBnBVQuAc+mK1V1q8srYC1m8lFGMbVb27ih4iEnohKk1Fps+z/iv4f0e80C8
sTrVoGMbK4aRQGzt6fNmvinWtO/sTxBqNhE6TW0chEUsZypHXg9+vrVebU9Sv2IubvdG38Pl
qDj8B9KY7ZXb/dGM1lia6kuVBRpuErsakhVmRlyCOtXH1nUre1WCzvBBGRt2mNT29SD6mqS+
5zSO4U9DmvO9pKD0O6STWwyI3Txut9cC4dh1CBcflXqvwd8YHSNT+xXDfupVCbyVVQC4ycn6
15jvG3JHPrS20mwng+xFa0cRJy1Zk4qzR9iJ8MYPF9o0ct9bPbtkZjYt7diPU96k8Y63o3w2
8PzW1teRXcvluzLFIvykqx7sfQfnXyKPG/iG0XZbzqMchti//EGqU9xc6jMZ7qYO2OeAM4+g
HavUeJhHW+pyOg36Hv8A8DfAr+M76XxRq1zHbQOHj3Sgr02KORtHWtz4lfGOy+Ht3BZWUovb
IsoLwSRkZKs3U57gd6+a7vXdcFkbO0v0gtM7thjRiT+K5/WsuG1kVQJpvMIO7O3HtWccXCCb
e5ao3ep9iJa21/o6ajcvFLZz7QV8zBUkBhkj/Gvm74qeGIfCd4biDUbS/SSTGy3fLDJc57+n
61ip4w1eyg8tJRJb5/1W1Qc+udue1ZhRRO8zfO7ksT061jVxClEUKPJK62PqP9lzwWzwG7ub
qC3MzLIokJB5iJPXHrXS/GfwFHLZyR/2naRTEZJd8D/WD3+tfKEXjDWbZY47OWOFVH8e3njH
dD2qG/8AFeu63ceZe3a45GxUQ+/90d66qWIpxha5M6U5Suz3n4UeGvDutaCkYmia6i2QkNKQ
WYIMkAP9e1b7fs7tc+NdK123v7WG3tGJeE7yWBzjBz2zXzPpmtTaKzy2zEMSCRgfMR9c+taR
+KfiFFkEEqqu0rtITPII/uVFOtTW5U6U/sn0n8WLzT/CNiFkv7e6mZBELeGRd4J2KMjOf4gf
wNZPgLWNG8K6SNTkKfaJczGLzQGJLMehPbd6V8v3GoXmo3jXV7KHnLCThQMHr2A9BVu71ea+
hiWV9wiHA45HHp9Kqpi4JpJkqg4rU6742+LG8a63JtBSBbgsAcHjaAOR7V53eWnnQxRrwUII
J9hVmSfewODz+lOMm1c15las6sr3OmnT5eh7n8MPGyakkukzMI8gBGdlABLEfU/er0E/COLx
j5e+ZF8phIGIbr07GvlOx1WWymWWIfOvQ598+ntXUx/GzxJZ2pjt4wrMCpbKHrn/AKZmu6nW
jGNmzGrTk3eJ9G/EHV9P+G/ht7FriK8uQrPtikAxlXIGCSc8Dt3rhfgv8NZfFr/29qlwlnGz
HLTqy4CMgxngdia+e7m81DU5TPqFwJZeANqgAY6dAK3V+IWs2mkLpttIgtw5ck7eCQQf4D6+
tavERk0k9CVRklpufSXiz45WWh+JI/C8EfmpMgkW5jlQoOGYj81PeqWraLba7EY3uYTE+MSB
srx2yD7V8t3ckl7Eoml3Sht3mBR6EdPoa6eX4mahHo0ekpBvgWTzN+4Dnn/Y9/Wq+tRu1she
y08z3H4H+DW8Oi/tv7QtJmMkiqUfjH7v/wCJrvn8CX1w/BRcfxMGx/KvkDR/Gd/4dtibZRK+
ckZAzkAH+E+ldA/7S3iqa2+xixmRBjBITAx/2yqqeIpJbinRk3oe2/Fu/j8G2saSTQ3Evlgs
sMgOPnAwc9+tch8LfGi+KdHeKR1hmjKoFdlyRtB7fQ14hqPiK91yfz7l8EZwpUZGeewFLo2q
toVxJc2675XAymcZxn2P949qipioJ6McaFlZn08Pg03i+6tr92jtzA4YebvBbkNxjitL4m3l
v8PfBa2LXMM87wkhInGV27ByDzzz+Rr5/l/aS8Sx6W9mLGVQy7Qx2YXgD/nlXEXviLVNenku
b2UOZMnbtUFcknso7mtfrFPlcr6mfsZN67EWszHV9dn1Fzgs7FVPUcY/pVd1B4IOT3oAPzFu
MHrSbiT34rwJydRttnoqKUbIYcgFWPA7mlXCbu/Hahv3hPfHalUBBz37Vhs9AY1yFUcYzTVI
YHAOaew2DBOQaap3grnqKpq6sPZXE2helInfvxSwxtt55HpimMAkgweKSSHF3Hg7jnoaHG4j
pT3xu4xj60KpdD701a1wciFXYHB9amLhiF6cVCQUbnnipTgd8Gna/Qb0QwIxY7iKdn15PbFQ
y/71LHlgQOtPS1gfdDtuW3HtTHjBOfyqYELuHQGoWyTjt2pN9iW7iggArjmm7gMjB4p3APOa
CQeAevalddQtYRuFyemKTYNgwOKfHjlehFJ8zE+lO6sMUqAOMH2zQowMYwaamFb5SM0u7GFY
9KL6CsKJNi47nvQIiec4x3prhR34p6xlRwRioWomroQrtc9/pSYZM09TvTPY96buB5wT6Yqm
rDjoRq2/gjp3qTO5SucU3cI8qefpTniyoI4zzUqzeo9GAU9T1x6UFXL4B4NOVvl2jgiiFRsL
E9DVSasKV0xgKr8vrSiQQ5yM01Fw/p70+Q/pUpcr0G04go3nPTvzTi23AJGKjU7s5ORQUC8n
kVPQTlYkJ3EBaRVO9skY6VBvKFgmcHvQuSOW6+1aONo6BqTSHBADcU3cseFIP1p7oIgpzkmi
WTac5zk1nzWdwuMbe0h5/E1McdAc/Sm7jtJOQMYwaQMVyAOgp3ixasV2EgKspHemrGAeRxTi
+5MfpSSMw7YNS3foXsKpEQBAyfapM5Xf0PvUcZJIye1SjKKR1zQ3fRiasIWLLzTscc/pTRuZ
dxGQOKcgqrcuiJY7JQZHOOwp0jFo+RgHmmq/zAZwT3pZ32rtOWz39KlajaGZVUb5efXNKr8A
7fxodS0QwCMetSLlolXoAKJLk+EpO6EBzgnoxpkqKGwQeOlORcyDLDANTSOCPU0J7XKegkSq
itxkEc4NNwNuFGBQnCgZAA6mkP7wjngd6q6T1M3uRtIcYZT9aLdgsvyjmlclQQemKWFlYZHX
60OVzW6NzTh5Y7E5PNXLiUspUdKraScDjpzzVi8JGdvTFCaTsYuyZTBG7Pagr5pGeAB0qOE8
7j24p8h4z3rOdrmtuhdjYMAccD3pxlVeGYewzUMJ3jaOgqYRrjDDrSsk9jK7TaJM/MrYNXYP
n5bgD1qqqspGSMDtVqEgkenepeprfoatlEJWUk4QfrX13+xZGTNMQPkVuD/3/r5DinMdpMV/
hQ4P4Gvsn9ipN+jQTD+Jcn8564K3Q2WzPq0/eNFB6mivX2OZhRRRQIKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuS+LMXnfD3VE
BwT5X/o1K62uQ+LgY/DvVQpwf3PP/bVK5q7slcD84NJuGmguFPRZSBx9KS9XYVznmnaWy+RM
6jjzSp+ox/jRdsZJAR0x3rZ/ETIqSuPfjvUJIOTk+2akuCzbSR064qFz8vPGaTVhNXIZB94j
p3qHPOMcDmpXXaT+lRmRVPfd3qrMaWg1thOf0qu6qS3bNWXcEdDVaUAkn8qd7oRmXOSOOKhX
5vvfdqy7FslhzTFg8/hRyKrlvoD2JAo28/SlaMA4HUda6nSPhjqXiNR5KyCJuNyqcDnHXYfW
tPUPhBfeHoSZXZ41Gctn3P8AcHoa29hJR5jB1EtGcCWLPnFK2Cp7H0qa4XZMQowMd6rkc5c5
z1xWcI8ujNE20LnaSp7UjnYcjr60sm1+QKjHyHjp70rWTY7Cknrnioy+/g8GpnUZHOfWmuvm
dTgCpbT1Ld0NAODxx2pNzbWUjHcUrZJzngUMwK59BSciEC5Cc9aRl4+tCv1B59KcBlhnv0Pp
SvoN6MYAM47U4nYo2sBUmdpweR0zUMik59AatajWmor4Y8Uh7egqSJDIQoHzE4Fdh4W+EWse
LXZZPkiwCHQMB1x12GtYxblYzlPlWpxQU9+KdnHNer337Ml5ZW73LXrSmMFjtfPAGf8AnkPS
uC1XQZtOkKYLIB97n6+laSoS3ZPtItWMhH2jJHNK0mRux8xpv+rbHb3oDknJ61g3bQ1SbQK2
ByRn0pIhklm+96VIE/ixzWrpWgza3N5NrnziDyuT05PY1caTnokJ6bmQc5PqPShpAchhzXql
r+zPcXFt9oklZZXAJBdgeeenl+9cT4l8H/8ACLRvlXITgkk+uPQVtKg47oyVSLMPjyuhBpAu
Fznr1rqfC3w61Lx0kRsVkWMlVd9pwu4Z5IVsV2yfsr3kUfntfZkC5IMhx0/65U40JNXYTqJO
x48CTn0pVIyR0rqvFHg0+ElulJMptSQ7Akg4POOBVbwz4NuvGXkiGJ/LnIAwGzg554B9KzeH
qIamrXZz7LvwOgpHQKo7j3r1yP8AZVunhWb7cUJG7YZMY74/1Vcl4o+Hj+E2aESecYmKyEMW
6D/dFW8NOxCqpuxxwGHGTwKVgx5XGK6Lw58PpfHojW38/wAo8/KO+7b1CnjrXfW37J08f7z+
0drjkDzu/wD36pxw8uhbqxR4+keRk/eoLkPyDXb+Ifh9LoErq8hd0XJOcjpn+6K5PS7WXWSy
wjEudoyD14x0z60pUGpWuCqKV7FOSQquTwKYI/lLdRXrXhv9my/8RwLNfXLQbsgh2MY46f8A
LKsTxL8LpPBxeFVdtu05yzDn/gIprBzjqR7SN7HCHKj5fSkLOoGe464q5pcS6nOUhO5gDxnJ
GPpXomkfs7ahrNibxriS2Uc/vjtzkDp+6P8AepKjKXQ151HVnmH3RkCmt0yOtdP4u8Jr4OkW
HzY5GIJIjcsRg45yBWBbQLNKqtjLdBn2rB05XsUpX1Ki4jVuPmFKDlC3f3r1jSf2b73xHbrc
S3fljAIXeVxxn/nkaxfFnwPm8GW8ly/mypGrMZckqMcddgHetlh5b3IlWjc8+XDMSxH0pzlC
u0DGetROMElDuGSOOehoQZ5bpXPNWe5smnqPyAMdB0pB8g45pSOnp2pOM+majQncdvzyaQqF
5B5pm4nqc5pxj28E8e1T1sityIxlvmB+tSZ+T5cjnvTkAaaNc/M7hVHfJr0jwx+zvqXjIDzH
lghYkbzlV6gdfLPrXXToSepE5qKuzzZQQCCeaTBUcdPSvVPE37PA8DQuz3sf7vbzJOed3/AB
XlLyB3woIHbNKpTlAVOaqfCIyBsscbh701iecc47d6VgN3AOfWkuGW1YZilZiP4VzmsUpN6G
l0viHowZTSKdjYJxS8hQdjJx0YYNDJ5jDntTtZ+8G+qGynzCA44HFOjO1cDO0UO+1vUDpQnc
kEA9qHfdCvoBGeO1ATrnkV1/hT4a3HjURrbO4835QFznnI/un0rpNV/Zpn0DT5L7dNJLEpkk
QMSRj28sY61vGjOfvGUqkYaM8sVBkn060OFPI4FOvVW2vJ4ACDE5Qg9iDj+lRtl+nJrKceV6
m0XdXECkN14NDMVOex4pRhRz09q0NJ0ptWn8pOd2Mbe3OPSiEHJ6Dtpcz8KrjB49acULKGIJ
969f0j9lO61uxE1xcvaliVMcjlDj6GI1X1j9mo+DbcyJe71xnZ5u49Cf+eY/u11vC1EjllXh
flPKPvMVXr7011ZQRxn2rqNG+HF/4m1aewhVzHGMllU54Cnsp/vV2Or/ALNt1pOlC5Yz5yN7
ktxkkf8APPHpQqE2N1oxR5MGG3JPNRbuc+lT3Cx217LAud0ZKnPscURQtM+wDI61yy5lLlNY
y5lcrkruyx/Wp42BGGIPpiu+8IfAe78aQSzqkiwggb/mC8jPUIfb860dc/ZUk0BVl+0vOzDO
2OUseuP+eQ9a71hZyjcylWinY8v6AjIINNkOyMluKtalZDSr1LSQNv6Adzzj+ldp4N+B+qfE
QKSGischS3zKACM8nYcHpXN9XnexcqkUrnnfmKy/KQfXmnoOhHSvQvGnwUi+G9rdyNPEViB5
85iWxjplR/erk/C/hq68b3LWempI0udgVFLE5z6Bj/Cap0JX5RqopK6Rlg/O/uKAqjK8n+le
zab+x3eX1hHc3ty8E0i7mRpGQqfTBi4pLz9keSytyw1D5Rn/AJbfX/plWv1OaV2zL28L7Hi8
mPXpTGjATqD+NdD4v8Ef8IN5EHnJM0zbcK+4jgHngf3q5YT7jtihlf8AvELniuKVNqTRspKS
vsTBs9wD0p21Qh55+tNVC0e8qVb3FScLCX52AEn1rPldyyEjjk4A9aIwCc9sda9I8L/s/XHx
Bt47gXGxG3AYcj7vH/PM1f1/9ki+0WIzQzyuq4AAYt1/7ZV2RoSkrmLqRi9TyZpM54P1oc/J
nv6VNqSpY3z2QyXTIbPYgkH+VQK5HSuVwadmzdNSV0N346Y+lOYZQk0/AbBGM+tWbS0+0ybe
p9BTjzVGVYqZdCMc/hS5K/eHJr1Lw9+zP4j8UW4uLyX7NaNgruDIWUjOVzEcjpzmn+If2Yrv
wtZtdC7d0UFuH3dMf9Mh613fU52uckq8b2PKGYA5ximyxrsLg8nkZNXdTs/7LvGtXLF1JUFu
p4+grPkY/dI4rzZRdOXKbxmpK6DB8vOQSfSlhGQ24ZGOlInPGOnSn5YNjgD3oTdxlGTTYrmT
JDIfUGnrolpIm1wzIOxbH8q39B8H614vlaDSEMjqMnajMeTgdFPeug1L4L+I/DWiS6tfxTNE
gOR5TjGAxP8AyzHZfWu6Ptpq99DObjHc4W306zgtfI8ohASQNx/xqMaTEkgeHIB4Kk9qls5l
v7VZ06Nnr7HFS7Ar/McGsueoupa5Wip/ZFvJMcqx47mum0DxNc+FE/0BkVhnaGXd161hsDvG
P1pwi3Lubk+1L2s0DS6nW6h8dfiBf2htHubYx5G0m0AwB0HSuau7+6uxvvJRLMeSwAAz+AHv
UJkLYHOcUk3zmm683o2Z8kVshoYFSM/WmHk8HApyLgEDvV610mXULaSSBHl8s4YoCdp98Cph
Bz2RpdIzlOGJJp6jJyK0NQ0G80W3ie9UJ5yhl4IyOPUD1rMfcOV+7SnTcNJDUk9hJRmTnp7U
m7BABpoLGQcd+tLt2yE9T2qFo7FNrYdNFHOAZFLFeRg9KrDTIZ5WYtJz2yP8KtruY8DmtTRf
C2q+Jmki0mHz5o+XARmxzj+EHvWsHNSSiZvTU5saBZY2kPj/AHqtwQpbqUiXauPUmuv1T4Ve
KvC2jtqOsW7LbsDhvJkUDaCTyUHYetctHIm0Echu9a1FOPxPcmMlLVDI1BXLHmmkBjnBz6mn
LnB/nThyDuHHbFcsttC4pt3I3IzgDj1qRSBjAx71GTsyAce5q5pnhHxD4uIXRYxLnOAsbuTj
r91TRFOeiKk7asrxHLY6Vc0q5l06+N1FLhsEbcA9a0ta+FPiPwXpP9qanHIlnuVSWiZeW6cl
FH61z0UoeNZFPysAR9K2cJUrMlTjPY9Dsv2oPFuk27x2wUMpwA9mp6cetcxq3j/X/F8hn1CW
LL5JAiCHk7v51kyabfXUSzWcPnr3IVmHb0HvU17p0+jxxvdhY2ddwHI4/HFdcqlXlvci1Ptq
VONuBgbeAKaud3485ppLHLEEfhRy3B715d3Jlse74OBzUbsCw659KQLszgj8acxyoOfrV2bW
gku4bQxyeoprsF4GcmgkFQVPzA96k3jb796mzRp0IQNx5qfIQEAjHfmmBmJOAOajaLaemMU9
xJEhiAGWPT0oQ5fB4FNUsp5qT73zdaUrsS0ZE3Ex9MU/CqeprQ0nwpqfim2zpsZeM5+YKzcj
r0BFal18I/GOjW/2nUbYrbDqxhkUcnA5KDvXTGjOSJlUUXZnMqozycg0oc8rngU1FWVS0ZyM
4oZSBg8iuVqzszXbUcWAIycn2pUu2RHVTtBPPAqEgqM4qUADBYgfjVqco6RJ9QaacqM3DCPp
twvT8qbKbhQPst0wB+/uCn/2WulsvhV4n8SRmaxtcwxrn/VSHPGc8IewrP1bwdq/hgAajF5I
Ocko6+38SjvXelW5L30Rg5U27GQ7EAbjub+JvU0btsbHrTTlGI6r3xTlH90ZHWuKeqbZu9Fa
wkbgjJ4qRsDB6mm+WCMke9RMcH6dKy1cbjJGKKgY8HPemPtJwQfwpWj3gZ705A+7BFQrrYbV
tbjwN4x0xUcbnHTj1q2kLXMoRfxHetKz+HPinXZNun2+VP3QIpG56dkPrXRTpSqbEOSirswy
QucZpSmRjtWvf/DvxToCNLqcAEYx8oikB56dUHvWLDP9phVwpWM9MirnRlBe8ONSMlZDmwmA
p9jTiCVJAzk0m4RqW/Wo1bOccVy69zQlDMx54HvTHQk8HIqSNA77OXOPuryTVyz8C+LNYPma
bp7uo/hNvKx9eyntXTTjKWyIbUdWzPKlRnpn1pFZsgdQa1NW0DVdAMcWsQi2lkzgbGQHHB+8
AetVToms3kka2Ft9oVhgERu306CqUJp2RDmrXKxJDHjilCkkkkBfSugt/hH48uo451sW8s/M
ENtL0/79/wBafcfCvxhaK8s9i20DO0QS49+qVs6FQlVIM57yt2MHimsoDEbuR71Nd281jIYJ
R5cycOhGNp+h5qvjOT3rjlB2s2bJ9h3mZA6fjRlVORzmosE9amgt2kVgg3MBnjJzRBa2sPTc
Gx26imJjGSec1bHh3Xr3EltZM0Q64hcn37Ukuh6jalnuLSSNAOrRsP5j61vKhVXvEc8FoVcB
WwDxTWJDDnPv2qV08wgEjb7Uw5TK9veudrqyk+oIwOe3vTGlwT1x6VJlSMY4pCPlOBTlrYLJ
DtgKnJFR7Sehx65pwiu71SLO1lZh/ejJ/lSva3VmQt1C0Ehz8rKV/nWns5b2JTi3uMBLHGOn
ekIy+QMlelTiBzG3lqXJOMAZp8nh/X7iLzbKwkMaDLkwOfp0FEKc6mxU5JatlQRtlmbp1qTC
lc9DTo9O1SEf6ZavCvcmJlx+YpBbSOzeUpkI7AZz+VU6LWkjLmUtUyIvgn0p7gSRj3o/svXJ
wxttLlcDOS0Eh4/CmR22oQZW+s3t8esbKP1puhKK5i/aR6DyQmB2oI55olSQKGjRpT6IM1E1
jrkuNmmSlW/iEEnFRySlsN2WrHM+4nHHFM7Ek596X7HfwPturdoR67GH86RgwwMUSjKnoCae
sR6OAnGR9aj2nzC3rQH3c55ph37sDn2rFt7BbuTAqFzn5qj87JO39aXyJJUJC8D2NRva6ihA
j064cdd3ksQa1hTbC6irsCVOcAg0RYV2OCOe9S/YZ44Q88TQt12upXHT1p8aBzgZBPeokpN2
YlJS2EJ3K24jGOBUIQE5JwPrSzWrxyHy4pXYAkhVzn/PNIhJjO6N4z6OMGqSklcV47CO5BIH
boaqj55cg/MTzUwJ3E9qjwS+Rxjnmo6s02VyZBxtPB/nUNx94Ak9ae4Zkzxkc0xSSOfvVnZp
i6XHFRtAHSmFyM7V6inyDgdDzSiIJnaO3WrQtxiuQnB/DvTBgkDHJ65qYJuXcASfWmyodu5g
cZ60Ri27A5KKFZgqqO3qKaW2tgdfWnlcRnPP0p9vHwMZx7U/Il2tcgfCc9WoQ7VO786bdSfZ
JNrI/P8AEBUkU0NxkRhhj1p8sktENySGPEZSSOopHBhlHBIxxTtzI55oeZiR/Ss7NO5V7IbJ
NuYjGR7UkTAknoB605m+UY6YpvMg57VL01QWCRyCMDIprNnaSMU5hsxmgYccKf8AGm9hpoYM
BiU6t1Jp6KCx7GpJIQsHmbTwDkd6zTrEKuUcMu08A4B/nTjByJctC4ZCpBA/OpCgfBJG761B
A4mXzIyCMHjv/nipT0wSOvrVSjy6F7rQdt3KR27mo2k3ZUnOTUnYhqYEAGT1qETLbQRysfHN
PjA8vINRIcnHUUrKFBwDmqm/duGyDaCcjNIy8EA4GadGFjGQDnvSbOOAc1FmXZdAXapJb14x
Uj4ZeOlNaPpin7AvTgmqbvuhadUMWMyjcW4FOD7FbvSKTGwGcilJBfpQybsFcEHKkU12+U4P
HpQxLEg8CkwDxnpSUfMLLcVD04OKJcDBz1NIXaNen6U0neRweabelg6jt5Lc0pbbgkGk2b85
zxSu2MAjjvRZN3Hpew+QkcDkU0PgUpVfLJpkcW/k8Y71MUm7WB6aD13GTI596lJVic0yQbRt
QYB6mmSJ8nzcnpTSd9QZIrBuBnrTw5AIHWo4xkYYce1SBhHkk8VE0yeYdG+F57elDyeUcdzz
SRtjIBomjyNxxmld32EnqDcgHjIGaZ5jSHDdulPVUdSWPPQc0nCjjnFXszZO6HLuAPfFKJC/
sR602O54ZSDk8UNCevPrSM9VoKBubB6g1Iw5B5yKbGVA75FEspKDHPNKzTTBtiyMC4x609sD
GO3NNj+Uc4p/y7TnrSs27jtoMLGRMMeaZEhQjGAwolJjHy80kbmYgnj2q9tiLm/YNtQHOev1
qzMyj5cHNVtPAYhgPmwcVauExzgH2pWe6Yr9yiV2Me47ip0jBTGevOM1HFkuS/3qdEgLEnpU
S97c1fclRtgz+WakEmX5JIFV2QqwK9PerkQXPUfnSd2g3dyXdgo3r61atiHJU/dJ5NVgd5+n
rVm3Axg9DUqV90Uu5rQhlQAYMRGD9K+0f2NYBFpEJjyEYZOfrNXxTny9PnZPvbTj9a+3P2ME
3+E7GTGD5Qzn6zV5uJbTSZvHZn08fvGig9aK9s5HuFFFFAgooooAKKKKACiiigAooooAKKKK
ACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5H4tjPw71X/ALY/+jUr
rq5D4uO0fw71VkGWHk4z/wBdUrlxHwoaPzi0vP2ObBwvmn+QplwCRnHSl0iNUsbjnOZ2OfT7
tEpZsDt3NdK01Ile5TnY+UxBqqW+UZ6mrD5Gcdqgkbcc8ZFJ9wvoyIq2T0wahYnzNp7elWAT
nJqCViHOehqlK+gk2JJwAcdKgmjZ13Ac9amc/Jj8qgZiSRmps+jG3oUZ/lO0jBFWdPbMy54w
R0+tVbhSD8vJ9TT9Pc/a4y/AyOn1FdFO8ndktpo9v8OXn2fTPO3YcFgox+NcD4y1q5kuWWaQ
HcABhR6Guz0WLGmDn5iW+WvOfG0iPqgikyJVCuAPxrvm2oWORxXMYMjbnKHpjPvUaL3Yc0pU
E5zg00M2MfxV5etzqWiH7SCc9Kjk3RjJ5Hanb1xknnpTGUHg8rSfmxK+45ZV25Jz6U0vlh70
Roq43HGR0oBVT8nIxWaXUpy6sToT6UKcHBHDU2MB3HzcehpzcthfXnNVcV9BWKhSAfwpqyBV
5ODSONqt60IBIgPcdTVXVrWBPQc7jAx1oZSUyO9BU7D6etNEjqOCNtaRVg30Rs+EbdL3X4YZ
c+WpB4OD95f8a941MLo8EyWZKwup2huTnHv7k14Rod6unahDd/xqRnjPG4H+le4abef8J1PI
IpY4DgfKwYDn5eODXo0klY5619kcb8Ltd1HVBctqM4nkeQp8qKoAwnoB71b8cWsMFm/BIK56
+zV22g/CWDwmrGC5TLtu2l2bnj/Y/wBkVyfxDgWKxkt0Ichc7ueu1q6JK92YaXPGpFySGOW7
1Xb5AcdPepVfzV3P16EimsNycjFeNP4nqd6bSLVhF58yW6H98+cZ6dM/0Ne5eD/DyaFZLNGp
F8o+XLZGCAD/AFrxzQIw2oWzj765wf8AgJH9a96llklMLpw7RAtnHXvXq4aBhWbSOCufi5fS
629sZMWUZZJGMK53At6c9lrpNR0MaraRmRMxTKHX5sEjg/4Vj3HwF1y81b7SyRjTpSzyDz13
EnJBHHutdtqO20S1j58u3iEYH04/wrseu5zaWOKvPjBP4GtDpljEsKCPG4R78YG0cs3t6Vj+
DvFuueMvFH2i9ul+xtIqBEjVSQSx54z3HeuQ8WwS3vjGzsAARcZyM443Nnn8K9c8EeFIPDWl
NeyqVZVDjD7uAv8A9esutkavlUbvcteMbDSrfTbkXBkbchXaCeScDt7kVN4cgi0rRLMwLst3
iBAzk4/H615T8QvGFzqHiBLeEr9gE/70FMMQCpGPxFegeEtdTV7CysvNWIKgRSynH6A+lO6T
tuQ4yaMaHXr27+JFzZ/aCtkgyqBF7mPvjPc11viWxtBaF5UZo2Q7sE8/Lz/WtXTvg5p51b+2
5brdcSAE4kbaRkHgbP8AZFVfHltHaQSxxNmKNSv5J/8ArrbfUho8/wBD+N1r4SsfsOk2vl8E
DdGWIySerPjq1UPD3jvWvE/jCOO6lUxvtG1I1XHzIOa8/tJ5L66WEYLMQFI474/rXt/w/wDC
K6FBNcyqd7phG355BPUD8K5qc+d+Ru1GMbs3dftrC0S6iuHKxqhbdyf4fYfWuS+GPgxLO2e5
uR8zuzKVfpjaP/ZTXKfFzxlLdX0emWzDLhNzFP4SGB5/Edq9W8MgxaBEg53Ox/UitUozZhql
ddTmPHnxY1fw1cQ2UBGwkFz5SkEEMe5znIFbliJfEmlNMg+R22ndx0NZXiv4Ka9451aK/tmj
SzACkGZVOQGHdSe9dra6FP4athazjDg7jhg3WuiznoK6t5nI+HvhhB4Vke7aPlyScylvvY/w
qj8ZfilqOmaculwyqd7IADECMAt3/wCA16cLdb1VjLbc881ieKf2e7LxRJ9ouplMh5UpMy45
J/ue5rJxcL2QRnf4j5md5cl5Z2mY8hmAH8gKkglVH3E4I6V3viD4Tw+HdyWconKcH94cDBx3
UVwcyeVOyofmUkHPrXjVIyg27nfGpGWh6b8HNZvNT1eVLmXNopIVAoBHyP7Z7D8q634m3Mx8
EazGCAgjfbx7j/CuK+Dc4lv5ZV5Ckofr5bf4113xF3DwrqCMfllSQn26V6FPWDbOapZSPnu0
Ym2Q/wAXOfrmnhmYn0FNhwMov3VJGfXmpvu7iP1rx6iXMzsSsiNTls9aJHK5x2pCxDcd+9OX
r6/WuexotEMDFwPl6c81MOF3Hn0xSqEwPamSN6fhVxetrE9SM/Pq2nuo5SeMn6Bq+uNN1S6j
8PWiRsPJct8pA/vMDXyZCuNVsG7meNW+m6vqyxBtvD9ksn+sDNjH+81e5hHo7nNiFaNkfPXx
N1q9ufGAgM+bQxKxXYv3sH2zXMPlTlh+Irb8erjxcQ/JMK/yNZlvp8t98kahnboM46Vy1vfq
uJVFWiaXhTw3ceIdZjtkjzGyM2d4HQV9FXOg+GPBWhxXWowSNLGEj3B3bJIA6Aj3rN+G/hRf
BtlDfTH975YZfm3cMqjPT615L8YPHL+MmudMLD7J5m4/JtxtdsDPX0roVONJXZlUm6krI5fx
Vrja3qzXFvbBI2yI0XjcNxIPLHsfWqNtoviC5BI0wNH3/exg/wDodejfBvwT/wAJLDNfSrm1
gZUGH2kAoccfiK9km8cy+CoFs7XT0kyM55bOMDnLj0qaeH9rqy/a8i5T5a/sbVUVjc2XlDPG
JEPH4Mahf92WRuqjkf5+lfWGr6bqfjvSHuDYpDbqm2TDhTzg/wB414BqPgW4tviTbWSpiOU5
YGQf3pO/4UqmFcdETGvrZjfhBeagfG1jFBH+6NxHtY7ffrzmvf8Ax1HPY6ZqRuMB5oTnbzk7
R/jVnwPZ6B4PS0knt5pL+EK4O4lQwyR0I9RVb4l+IZNftb+4bAhVGKqFxtGB+PavUhSSj2MK
sueSdj5PupUXVdT3E4Wd+B67mpsdlqOoA/2baNN6l3QD9WFeg/CXwG/iHxZrt4QDCspcgvj5
fMbPb2r3HWfH3h74Q6NZB7OYGZhBIyAyZIBOeXHvXmxwvtW5M29rypJHyeNG1yzVpLuwWGFQ
SziRDgDr0Y9s16n8AdJtNWW+uJA22GDzBgkchz/hXsOt+K/D3jHT2EokjtRneWVlIyCOxPYG
vF/B+rW3gzxbc6bpbvLa3KoiM65JGVyCTjHLmtqdGMHoW6snFo6r41eJtU0vRrR9PnWGaQhX
ZkB+U+b0yD6Cur8J2Ca14ZS8mZpHMjJzgdPoKdefCuL4jWzLfTBYxldqyFSMAjsp/vGtC7it
fhz4f/sm1cyGJmkyMtywJxkge1dzTk9zik1bXc8b1C4k0X4uW0Fu3lrLa/vAQDn5WPf/AHRX
t/iqeW4t5FRfNtgi8DAOd3vivm/TNXvNe+LPnX6hWSA+UAAOPL74J9Wr6l03UbOwuimqwtIj
Kdwjzn1HQj0qYJSk0hzj7qZ8X3Og6jaalfz3UHlI8zsh3qeC3HQmur+EfhZvHGqCSP8A1MIc
Mxbb0UfX++K9a8caFb635wVCIi3yDcQdu4kZrkfgBYv4YvLq2cYuBLKGGdwxtQfzWuWeGXtO
Y2jWbjY9F8e/EA/DDRw9gTFahRhBGJCcMq/xH0IrmPAXxCuviTY+ZcnfdrgZMYQcruPQ/Wt3
x18P734lafJYWOMcDLSBP4g3Ug/3aPhz8GLn4ZWPmXRDTZBH70Pzt2noB616DSUbIwT6yMW+
+Esetana6i58tbOTzD+9I3cg9MH09utdL4x+IP8Awrn4e3zWbCKRICqAxl8sAqnr9RXQ20e+
OTnAPFU/EvwTtfiHobx3kuyDDA7ZSpw208YU+lDp6eZMpvY+Tb/X7nxUZL68uTNLd5lKBFVV
zzxgZ9O56V61+zrG1hq0LQnZL8zM3XospHX2pviP9lrSfDMMkkdy3yqfKBuGJOAMfwe4o+B2
zw14ul0q+mEJWUxxnBbKkSEcgejCuBUpwnzSd0dinFw5YnZ/Hrxnq1r4WeSK8SBommCuYlOc
I2M8H0r5ws/iDr95ZotxqSOj8nZAg9f9n3r7D8XfCbRfiFp7Q3lxJJCxZl8uQpyQQf4a8a8R
/suaX4PU3FpM8kbswRJLgk+v9wfzras5TVouxjTtB+8jyqC8EuqWFxelpIIpVaTaACV3Anp7
A19IRW3hjUbd7vTNPeOBlKOJXk3DP/Az/dNfNGrWk2mX8lvKoWNgAvOc8DP867r4W+M10u4k
sLxiIZUABVM5+b/7KvMhpNqW51v34+6YXxC8NXPh3WmwFNmyLzuyQxB/HGBXKHPllD90ggiv
o/xfoKazaMkg3ExlRhsZ4b/GvnrU9PbRrw2cowwUMDnPBqcRS5WpxIp1fss6n4d+LdYsfENr
p9rLHFY7HcqUBYtg9z2/wr6p8TXBvImknOV2jOBjndXx74Cd18cwKxAXyHK/XB/+vX1nrred
ZNAMqQAW/wC+v/1V34V88XcnEJWufE90uPFGqFjyZpcfTfU4wx6Uy9MR8TaiyA+aJZVJPT75
p5O77leLW+N2Omn8KEU7DknIr2f9mPw3oniPVtSk115I4llARYywyNkh5wD3xXim4KcGtHTt
evdFybGdYmY5JKBu3uPrToSindlyWm59HfGn4jx6J4ZksdE1TD7TFHmAnb86KBlk9KtfDOG4
8QeCIbnWJhNKBHh0AX5SiE8AD3rwj4aeBk8a+KLe5u5XuY4JwWG4Jjqx6KPTP4V77461iz+G
3ge4MO5VaAqnG85AVf5MK+gpSlUjfoedUhGHu9WeF/HM6TF4whgsGkaVHcHOcZ2x56/jXn7l
mdgcdanub59ev7rU5yDJcSMyYGMLkgcD2xUTR7Cf514Facak7pHZShyRGouScnkVJ5nmEAjK
jioyD26GpCFWMEdRzzWF1c6Eu56T8FvjFH8J9UufPheeOeIRqPLD4O8N2ZfWrXjz9pXUPHVg
dIMHkQPkYSBV+8u3klyf4jXc/AODwz4nhf8AtOwmlu0TzI/KdlQESEDPz/7v61c+OWm+H7fw
lPeaXZyw3aLIXZ3YrgRsRgFj6CvcpQtS0POqztUs0fNFpZrbQiKPIRcnk81A3224bFlb+cem
WIA/Uj2rr/gn4QvvHM+CiyQhirtvCYG5M/o1fTss3gj4XaU00tteskSs7S5LnHLdAw/u+lc9
LCuor3NHW9nbQ+MtmoJ/rrNlYdSGTGP++qtkbVD9R6V9Z6rrOkfEfw6mqaTas9pM/lrLNuRi
VJzxu9R6V88eNPD8XgP4gw3F4u63MQ82PcW5KMB0wey96qrhVFXQRxHO7NHCzPqV1NttLIug
Gcsyj/2b6VZEVypHm27RAj7zMpH6E19FeDvjN4UZltrTTLyLKnmReOAP+mhPYVpeN/AzahCw
ktEh34Zdkp6bie5NWsAnG9wlXS0PmG9M1vEpthmU9Ont619ZfCHwTb2/hC4nkgDylow+ZDz8
q9MH1Jr58+GGveH/AArfazaeIY5Zore42oYgxK43KfukZ5Ar668M+LrBtCjksrXy9PbGN4bc
flXH8R7EVeEpKLaZnVm3DQ+XPj3ZX2oazYPZQbrSPKyOWUbV8wdMnPSvOmh8rCEY7HmvqH45
fE7wr4ZlTS9NtplvL6JhiVHZS27HXdx3r5lvpXub24lYj95Iz4HbJzisMbBXVi8O20VmTaeK
aeByOKa2Y32/wt1p2Onp2rylpudiFAaQhRyor074NfGWH4V3d5DNC0sUsO0KIt+Dv3f3l/vG
vMPMkjBaErvHJBr6T+A2m+Gta0u3e/s7ibUBApbY5VM7iD0Ye1d2HXNJaGdX3ItnCfEr9o67
+I2hpogtfJtjvxthVSdylTklz/eNeTTyx6fFGpVsZOMc19I/H3Q/D2m+HZZtHtp7eXZKf3jl
hxHx1J715H+z5Po2p389trcU1wzKgj8olcMXI5wR6iuqvSc5KNzno1E07I4Q365Ia3lHfnbx
/wCPUW92877BBIE7Elf8a+v7Lwv4ej3JqOnuu3n91K//AMV9ap+ING0DVbEDSrBkQ8B5JHz/
ABZ6se59Kr6guXVjeJt0PlJ4C5ZWGQPQ16z8APjNY/DO8mtLhGnVlkK7Yi2C2w/3l/un864T
4m6TceBfEgtm2hXRHPO7JKn/AOJr3P4IeG/A3jXTRLeWN494FkJKyMqYDAD+L3rClR5Kjiay
qc1PmseefFT9pL/hYeiyaJcWxjtndWAWELypJHO8mvMZ7S6GnxRQKpcbVxn0Hv8ASvevj94O
8PaR4Smu9It54vmiCGWQnGXPqfSvNfhNrmi2ssbeIoppYRGdphB67Vx0I/2q6a8LSSZhRkmm
0j6B8C+B7HSPCsEpiLF9vBkJx8iemPWvBvjbazTeNIwLZzap5oJRl/vt6tn0r670vW9B1jSb
RNNt50slQK3m5B3bV/2jxjFeQfGD4j+BdI1dtOjt7o3w3A7kcqSHIJzu9jXbOjH2Rzc8vaXP
mqU7AcjB71EvJyPzNTviSWZyAN8jMAM8AmmshJ6dq+Yas2keqpeREw2ufSnSP5EXmHkEdB1p
6x7n56j/AAr1z4H+B9G8XXduNVMyqZcM0blflDPnoD2UVrShzvlCUuWLZ41HdxyB3VH+UZyc
f40j6jCiK2WJPGAK+6fFvwF8OXOlW1v4eWaRmj25nnYZJQDuB/FmsrTP2VdM0+xF5frtuBHv
cR3Tnkc/3cdq9d4C8dzj+tJdD4yWZUUMAee1U5dTEDF3glZOxXb/APFV9IXnwEv5tZS6gjj/
ALICneTP838Ptns9dvqWnfDr4f6NZT6qLplupDCjAyNlskgfLjHFZxwDvuV9ZXQ+O7bU1uFB
8qRcnocf41eRZM5A4r6n8Q+EvDmuW6HR7CaMzfKryysBnkd2PfFfN99ot9a+N10eIL5bPEAW
YZ+bb3/Gs6uD5di6ddSbTR337OXjGSz8ff2RCGMJjlkZNo5OxT1Jz2FfQHxK125Xwpf2ksm6
N3j2/KOPmU/0NUvhJ8P/AA34F1OK/vUmGrRCRGRJGZNrDj9PemfGbUkvdOuzYIVhBiOHHI5G
e9enSoKEdTlr1FKSsfF8M0VhHK7sVhEhwMZNIupQ3Kb42O0+or2X4LfDHRvF+m3EupGQyRMw
AjkK8AR+2P4jXbeIfhl4Qu72wgh+1qv3XDSHsrnjj1Ary3heduR0Ouo6NHzBa3n9oyMkGfMX
j5hgf54q7NA4iyeMelfTmv8Aws8MaD4cnNuLky/LtJlJ43KO4+tfK9xfyFLl3IxDKU4HbIFY
1cM6avc0hXVV2SPsH4A+OL3VvBeos7gLGI0GUAP+rrz79pq4N3pkZf7/AJYx+Mq1v/s/r9n8
B37ofnlSFsHoT5f/ANeuZ/aQuFbQ7USjEogBGOn+sSvTt/s79P0OOorVLo8JjUQQozN8gUZP
4VFJq0ERwA5x3A4r0n4RfDmXxkLea5UGwYrkrJtIXLA+/wDDXva+E/h94Rs47G8t7uZ9oBIk
c89T0I/vVw08I6sb30OupXUdD49TUIXAbLDceMjvU7IWwwOQea+l/F/w+8M69Z7tKtLlFwzx
h5SATjjqSetfOvim2PhTWLuzu1CmJyFAO7jqOR7EVNXCuEfd1HCupytYoXN5b2mBI+0/QmgX
0bksrfL1yRXufwt+CWh+NdPur3VIZttsnmjyZypJ3N/Ra5b9oTwlofhLTrQaWlxEZLjDLM+7
gJn+Zojg5KPOx1K0eblsRfCz4b/8JRdw6hMuyRW4JkwMK69hmvevFHxX074Q6QkMsZWXJCII
2kBZgzDncP7tYnwZkRvA6Tx5/wBbLjPsa4T9onwPqXjG7j1CwWJiPLX94+3AVXzx9TXqUKcY
007HJUm3Kzeh6hrGsP4wsxJOEkglwGCgrgqT/hXzp8TfDFx4X8QyIiZsfLTB3g/OR+B7V758
PfCN/wCF/Bq2t9sdjM7BkcHgkew9DVrWvCek+KISNSkkMgI+RGK5A6Hge/rTnR9pHUhT5HdH
yWPnGVff/n6VHNeQ2SsZn2pnkgE16/8AEf4cR2Ni0/hqEiZduRdS5zliD+mK6X4e/AOy13Q4
dR1KMozIvmFLgjkqp4AB7tXlvAyUt9Dt9umrs5L4Q/Dy48RagLiSMLE33D5gGV2MQe/rXtvj
f4rwfCO1SztYYywXOJI3foQnXcPer/h59NsYZYtBLGMEJK0meWA9/avO/jj8BvFPxMmtbvSF
i2pEVYzTonJcN6HtXrUqEaaehxVavPI8I8b+MNS8eTxXOpMolWUiFUQKArOp5xmvqD9n2JNL
8IC6jhR50EeS5ODiIehHqa+dPE/wk8SeCrIvrCW/loQyGOYMcBgOw+lfSPwCsbjUvAEjwKHW
IxA8gfMY19a5KUf3l5o3nJOm+Uy/iT+0zN4T1Ka0FpGZUcoFWAtnG3uZB615prf7Teua4pii
so7eGXKmUwruHTn/AFh/lXV/Gj9nvxJ421yPU9OhiWSFi6GW4VQThO3P9015LrXwj8a+GRJJ
qsdmbdPveXMCwAxnp9RXRieZL92jnpON7NHO6ldvqWpXl453TXD73JGMn6CoIR5hKn+GkERj
lkXuGKn6g4rp/BvhmbXNSjEW0hSu8FscFh7e1eEoupKzPWVoxuY1to91dnMcPHYsw6/nXo/w
l+Glxe6xK18AqtsJ2ydg2DjAr1vxL4Q8NeA/DseoXInLHeAodmyQCw6Y9PWrngvUk1LTXutm
xlU7cZ65b3P92vUo4ZJ6nBOu3dItar8WvC/wqdNLMc8M7MAgEbSAl8kZO71FYvim6PimEtOi
MsqYTblcHBGev1rxX43eGPEniTxJC1vbQPEwiQO0gU5+YevvXu2h6O+m+FLS1vMG7DszbDkY
LNivQmk3y2MH8PNfU+YvGvh6TwvftC0eIkRSW3BuTXO2t0t2pZMkds8V9R+Kfh9p3jBmutT3
m1+UMkUhU7hwO3v615J8RvhzFobRtoKulsXUHzpAW5Vs9R6gV5VXCc2x1UqulpHnMz+T/rDs
J6d66rwN4am8SanDBboG3BiSXC5AXP8AhXrPhb9miDxLbLezYI28k3BU9AegX/arjj460r4Y
eI/I8PmSdI90cnnIWIPKkDJX+6v61jHD8m5s6ylpE+otB+FWjeH/AAcZLyF/twKsG85iuCEB
6fjXyJ+0DqTnxPZlNqgrKWGP9vivq2z8Y3vijQ7WeWQEOi/KUC/wq3b618jfH1AfFVvE3Dqs
mR/wM/4GvSqKCpXsefT5lPVnZfBzwJ/bl3FdzJmDcj8SYJG0t+te4zfEvw54DmttAEUsV7d5
SNQjOrMuF+Y7uPwrL+HtrBo3haB4AVOF6nPRF/xrxH4uaHql58SNJvrSJJp3lYx7mAAIkLHO
SOzUqdJQhdGkpOcrNnp3j6xXxba3iSRqGnRthDFcBgPc9sVwfw0+FU1rrLx3Q/0dZsriUZ25
c9h6Yr17RNMkXw9oz3yL9sMQ80I3y546VrzQRWSrNECswGeuRW/slKzaM+fkukNj+IPhjwUk
GjxxzreFfK5RmViMd93qwrhviTZJ41tJisSpJIGKMGK8Fcc5J9q8p+Jnh3VdS+J1nfQW4cm8
EgO9RwDHzgn6V7x4csJE0qxa6UfahGu8A8e3T2xRKKvyWBKy5rnkPwj+F93HqckeoxgQKUwE
lGcbuele5jxv4P8ADaLpsEFzHJKCERlZg31O71cfnVm7cQSJcIoV1Ocf5+lfNHxR0rWr7xxp
zafCjTLIGBdlAAAi9T64qFSjTTdjVVHN2k9D07xpodv4ltLiaRAj7CAFYgYCn6+tfO+oWM+m
ylJcDGCOQeMf/rr65s9OQaHbtecXB3ZVTwfmbHSvmT4tukfi8xqnlq0UZ2DJx1965cTTUqfN
YVOq1PlOUI3vxwMdaC7Icg8+tICY+c80sjF0wCBn1r59uzPRR3Xwds4fEfixbORS0PlyE87c
kAfjX1bHL4R8H+HZ7qazuJGgYDIZj1Kr/eFfMvwBiWz1u3df9biQHP8A1zGa9s8arJBo2oQv
jlwQR6bx/hXuYOCkm2cmKeqSPnvx58Q4vH1xOY7cR28TsiPtKkjdnux7AVyGlF1vYFk/1Rzu
Ydfu1VJEV7dwxt8qyt+eT/hXUeDfDr+L5pLGBv3gIzltvYnqR/smuCbc5m1L3Yn0pa2Hw90n
QbK7naaWUQBmGZcltoyOMDqa+cfincWl94pe40pDDp43gK2cnLtjqSehFelX37M00+iEXN40
UkSnEfnLk8D0jI7etePeIPDw8I6/HojFnLZIJYHoSvUAf3fSvQqU+WnaxzQ1qXuY5tw8e4Hk
c1CsqFyu75x7V6t4O+B9x42aEqCY5AN+ZgoUEH2z2rtr39kKztrJpDcKrbcuPtLEf+i65IYV
vU6pVVHRnzplGIweacVMYJPToDXa+NPhnF4Ejl+zr5iI5DN5pboC2eQPetLwD8NV8f26iJ1V
/LVm3yFcZOOwNTPCyUuUpVE43R5uZY1G1j81SRJmVsYFe0eIP2WrTSIhLNdIzAnGJ3POM/8A
POvMtd0P+xdXtLZxiOdtgYtk5+X/ABNS8LKCvIzVSNy/4I8Ot4jdUhXduk2LltvOVH9a9H1P
4XwaFaXIvDmZI2K7JCRnGR2ruPgh8JToMKTF0WIsxyZSTncvov8As12PiX4bX+v6dcxQBDbb
SXcyAY+Ug9s9D6V6FDCp6nNWqpOyPiBpS0jjOCD0/AVq6Mqm7hEgxGxbcR/un+uK3vHfw/tv
h9mKFlZ/lJAdm+9n1A9Kj8J+Cb/xS6xw7f3m7A3hen4e1efKi+ex105pxuz6F8F+EfCS6Wuo
3UFzPGoEZAkYHcVU9iPWvKPj1pOnaFFGdGjaPcU5lYscEv6/QV9B+FPhTJ4W8GrFcHYx2MVM
u7qqDsPavAfjXE98sRTgJKF/D95/jXsQpQ9nqcLk3Lc8YuZUD43H5evHSgIE+93HBr2zw/8A
sn614viae2thICAebtFHIz3rnL79nPVLafyGwwBPytcLx+S+1eX9Wk1odvtobHnXlYcFj24x
RImMevY16DrPwO1LQNKk1G+x+6QsqpMpBAA9vf1pngv4QSfESFvIPkhH8osZdoB259DWTwsk
UqsXscBs3Dae9LGMNjrtPWvWdU/ZYv8AQ4JrmC9EhhUuR54OMc94x715rrGmvo14bSZv3oJX
Oc5x/wDronh5QjdoUZxbOq+HcOmX1+w1ZpI4U27DHnLHdznGa+htM8DeBNR8PRzeXcmZlyr+
ZIBn5u1fJVvGZHjXcVCsGz719OeAwT4D0tGPULz7Zet8MouyM8QrK6Z4x8atLtfDd3bJZoyx
vLtO9tx+4D/U15uo3MSzY+lepftFlZNVtFYkRJcAr658ta8sEmDgjis8ZFKVkh4abauSZG0k
nn2qIv8AMM9akaMhS38NQiMN8x6159tDpjvqPyM04FNpIJ9OaasRkBzw1IqGNsfnSurbFskK
bl+Xj1BpXOwYXr70zzdpODinOuVyKUW1qybiByUIP6UF3Xock03BRTg49c04dCr9e2Kbeug/
QTcxbgZz1NL0JUdDSNlXyKGATn+I1TvYejHGRlXaQCvemE4HA4peWXjjNIUK/ebr2qXp1MnK
zsNDOD+tSqrEFm70oRiARjb71G25CcnIPAxS32KUkyVRlTjpTFDPnngUquTH8p575poc4JHe
l717AlrcmDBV2EcUi9DmoU5YEcU6T7+0fdNUk9x2u9SUgyxkmol4HBpRENwAJ3HsaGlWNuMg
jpT5rD6i8IMZ5PJqR8umBUWPMyz9fQVNgKME4FJuwSit0QvJtGCMnvipcM6jPQCmopjzu5zT
y52ZFUmpMl6IjXaz4ByMc1L8oUqAcUKynJ6bfSnAK/IOKz5t9C0Ise0ZHBNS7iFAB+tMKZ6d
aHUYwCc96UddWRIVtgGejZ60gOTnrng0saqBhvwokjXr2rTcFqh4UfeUfLQ2QOKZ5pIODkU9
fmXnpTsrFarciJbnb+NLBIA24nFMlmEbbQfmp0AMz564rK6uS9jotPLmEN7nmpp1BXJJFNsD
iMKeF5pbrCfMG4HFXZWIvcqchsE81KJGKnPY1DncSxPFTbxjC9TWNmjVErRnapY808gx7cHH
FRLlTljVkgBQ5PQUrtbjk+Vk0WWxnnsTVu3QRHP5VQWR0YbsbSc1oW5EgJ7VGtri1epqwIfs
rsP7pP8AOvuT9jZFbwbbuQd4jX/0KavhuP5dPmKnlUJB/Ovur9i9Wf4fRSHHMSZ/77mrysU/
fjfyOmHvRZ9E55NLR60V9Acj3CiiigQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU
UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcd8YCy/DrVCpxjyc/8Af1K7GuS+LChvh9qg
IyP3XH/bVK5q/wAKGj84tJRkspyD1mbv7CoJlHJz+Bp2msz287KeBMw59eM0kiebuJ4x0xW8
k3qmZPV3KsysF9M81UK4OSauStwV9KrSkqQV/Wqj7sbMeyInOTnPFMIzkjnPTNSMT6CoXYKT
x9ayd0JDD1OeD6VXnUtk1PkZJx8p9KglIBPXFXFdx33Rn+YBIcgnPHNWNPG65Qf7Q/nVacgk
cYPeprIb5BGD87cfTn/69dNPWSM3oeyaaI5NMUqf3o3fzNedeNYTJfqc5ddpJPXHNel6Xbeb
oEXl8srMCOncn+org/FdjM948gjwNoG4kehrtrfAc/MlJnGtlGz+FNklIU8Yb1p7QsrbW60j
5J2nivM2RursbI42YPfmkb5oiQMEU/5O/So2DBTn7pqXozR9hGzIRgc4p+TGCx5FNRvKU4AJ
7UhILfUVclcGkhWKkZUjJHpTQDzk/lQoVcgdO9IRwaiwpMUqeueO+aaQc47CkyxPX5RUm0Eb
uwpt2Fa2o1pPkwDiiLhTk+9I67jxx70wKemfrQnoPVonLqmG3EZqxJcXE20x3M8P/XOQrVMx
l8LzgGr9lp99O+yGDzemDuUfzIrqpPawbK7PTfhIs11azSPdXDuFdiHkJHBWrfxCtx/wjE1y
H5KsOP8Adf8AwrU8A+Eb3w9pRku0UGTeF2OCMEjn/wAdNcN8SPEyXM82n27scRfcIIGCDz6d
69ScrQTZwyfNKyODZBHhck4Gc1IWBG1eDVrQtKfUrmO0T55WDHk9hk9TXp+mfs26ibtQwUsy
nJM64H/jvtXmumpNs65SUVqzzbQoJTrNrIDhBuHX/ZNfQQcGO3ZOMRKCT9K+dLq8m03X5Lde
tu7ocHjIJX1r2fTtZPiOyhRTtaONfmGRkAD3969ChLl0MKl5q5g618ar1/EdvZM9zHDErqQr
HBxu/wBv/ZFd9IZLi1gnYBvMQNg+4B/rXGRfCTU9b1+HVrWGN4YVZXzKoJyGxwR/tV0Ov63D
4Vt4mvC6IF2gKN3TA7fUV2OXM9zBq60MTQfCzjxJNqF2quFf92CQ3GXPpx1pPiX4pjstPa2t
N5bYwZAMDOQPUDsa7CNJ7iye5hUZCsBzjkjj+deU3vwh8ReOvGbNEAkR+V2W4CHlnPfNc8vh
bQJpPU4bLSGSZ87nJfGenekMkjANHLLEV7o2M16pqv7PN94O0e7vrqTzPs8ZkYNOrnHf+Eet
eXQ2lzeXU/2GMSlXK7WIA6keo9DXn8ri9TshKMtjpPhgLm58StJJqF26qyARecdv3x2P0r1j
xSpEEpySNh4J/wBmsD4PfC7WIJp9bktUIkiVsCVPlIbPT/gPrUXxU8Vv4emjg3MlzLcGN1XP
AxzyD7ivUi31OapJSlZHK/CLwjcfapdQvEUiRVCgsG6Nz/IV3XxA8R2+jaYIkciZiQQFP904
549a6Tw9psj2kc4jGHztwQOhIry/xd8J/GHjLxLaQ2KQ8HfJm52fL+7Hc9eahu0G4iv7yucB
dv8AaUWU5aZWBLN1wPevozw+uPDVq+OWkYD8zXLJ+zhqGjWrSXfls6ZPzTK3uP4fak8DeKE1
izezVmWSNyAuCBuOCMc/7VTSSg7s0nJSVolf4k/HCbwZfpoitcrIdshaHPAIY9d49PSu10PU
5tU05bmZmbcxXLEknH41yXiD4V6h41cNZwRSXgIJlldQdoB4yRnuK6y9sz4E8PhNQJUK+47T
vPzEgdK7lO70MdErdTXvGKQZHynivHPFc858aWNsLu5RDuclZSO0vFehaX4lh12ySeFmaJ1D
LuBBwQCP51yGteF9W1rxraXlvaqbNFYNI0igg4k7Zz/EPzqJz00FGPKz0Ga3it7NN4HzRqSS
M186a3l9ZvPkEahjgLx/E1fR/iJxpQjW6QiNYwrdDyDj+eK+ab65N7r9z5ZJUMyjPHRmrgrt
RRrS1eh3XwLiMN5dSNj7zMP+/bV2vxGYzeCdWyACY5Np/wC+aw/gV4W1U3N4oiQxs5ZcuM4M
be/tXV/FXRbuy8D6uJIguIn/AIgf7voauLtTbCsrzPmq1jZbcBvvc/zNTYyvXnuKis3YwKhO
WHB9qnCYbLdK8WolzXZ3JNIY68L296QgocDknpTyRuPOQaAcdMe2azlaIRTsEa8EfzpPL6E8
052UgHJyaaoIB96aetgaaLVsd1xabVAk89MH8a+ndOz/AGTZb23Lzknk/favmC3/AHd9Z55f
zk+mM19XaVpk82hWWyPcoLZ5H99q9zDaL5GFe3KfMXjjL+MmToBArZ/CpvBOuroPiVbyRVlT
ymTy5FLLkjritH4heB9fsPF815cQwrpxhRQwlBbd9M+xrjmXZLzkcdq5qnuVWx0ZJRtc+ldZ
ujrmkO0blEuNp+XK7eQ2K+f/ABf4cm8NxtHLzEH5bcGyeR/Su7+HPjNbdhp92zFCp4wW6AYP
XGeK67xZ4NOv6dJbSRhw5UgkryAcjqK7H+8jZmEv3c7kfwDmS40C8kQ7IQ0eSBj+Diut8b/G
mH4cacH+xxTbhvz5G5j8yr/eHrXE/BGM+G9F1TSdQ/d3DTrsVfmGFXHUcdjUXxQ8Ha78QbRI
dEgjmuEjCbZZQg4YN3PoDXRQfs0zKrZyuZviX9r261bSpra0t5IY9pDskZQ446fvfQVt/BrV
U8X6fqGqyb3lDBt0vLDKFu5Pr61S039mS80y3j1HUnjQQAPIpmDAjHPAQ56mtjwRquiaXean
punTPJIjmKVfLIUMAy8cD0NS5TlJOZbceVqKNLWA02qWWxjgOSxzjjirmvlB4V1IjnEHzZFR
/ZpLq/iZBna2QCal1+Jv7Ev7fBE00RUDPGa6W9DG7tY474IsyX2sHorBtn/fxqT49yq+hW5U
5eNpGkz0+5UfwrmGiaprFvcHExBG1eersRz+Iqz8WfBmvfEPRFsvDcUUl1l/MM8ojAUoVyDn
rmsKKtDlG17yueDgXVzF895cLEOdqSkfpXsn7NenwT2moy3EYeU2+YwwBwQ7c+3ajw9+yvf2
dhC+rMhkUkuHnWQfeJ4+Q9q3fAt74f0PVtRsNLndpUjVT+7KjDc/3R3Nc1Om4y1Z1upGUHFG
d8e9RvLLSrUWFw9ushVHeN2RuRLnkfQV3PgeyjHhu3uX/wBIYzN803zEgHp+lcf8T/C2q+L7
CFNJgSadXG5ZJAgwA/qf9oV6P4e0S60bwosd3F5csbvIQjAjHPvXZzvm1OTRRseKeImS4+M1
vJHEkINv91FCj/Vt2r2TxRKWuGbOPlFeFtqMepfGCJYiWEVuQxIx/wAsyf8A2YV9Aa/oN1du
8dvGGIUYJYCnTa5nYJ/AjC09ElsVZuygkn8KytKt408USPEAMxNnAxzurrLLQLnTNIzcxiNs
KrEMDzx6fSvFE8fQWfxGW2hdikkcinKn7wLH1/2aq6S3CMeZ2R6h4q+Isvw50w3DK3lvz+7B
J6gf3h/ern/hN8Q9U8etO2pNJxKQhZycAqT3dvSr2veF/wDhNh5ar56v91WIAxnd/EParvwr
+D+r+A9LvP7UVEdZt0TrMH+QqF5wM5/xpyle1gjaN7nTRMVgkY9+RXmPxnvbv/hFbkQXUtuw
6NFIVPMiDtXQaV43ttS1+702N23Q/KQVIG7L57/7NZXxL0a88RaRJb6dCJZeAwdgoOHU9z6A
1pOfuu3Qz5Xe50Hw4sRc/DzSZLh2nl+yofMlO5ifcmvFPjgTF4jgWJmttsj/ADwnaekfpX0H
4O0DUNM+HVkk8IRoLVS5DggbeT39q8o1jQbP4l+Mn060uEeeGRknWQFQGK9ASpB+4a5qjvT8
zRazujxiO61WSQ+VrN4vICgXLjAr6g+HVk958P8ASmnlee4jRS0sjbixJbPJ5PSvOvFn7O9/
Y6eq6FBBPqKk+aGkRFAAOMHavfHevX/h1oOq+Hvh5aQatCkVxDAoYRuGAID570qcZKOrNKs1
JaHgH7Rhht9asREqxqbgABFx/AlctpmgXPiTULeyt22urrJu37SOQBz/AMC/StX416rb+JNd
srPTy0tyZcOJBtxlUA5P1r3P4MfDS48O2Yvrm2iKbDtbKseJCc9O2K4nBus2jSm/Z07s6DR9
OtvBvhMHVnaSWEvIpb94xPJAzj2NfMnj3xovjnxQ+pgKsAiSNSiFclfYk+prsvj38Sv7T1M2
Oku7xMqI3mhlABVs45HPI7V5LBCIEWJB8o6fnWWKq8vuIdKDb52dP4GZZ/GdtCo/eGJ2H02m
vqfxFIRqEmcbljGR26//AF6+Zvht4f1S48YwTQQq8KxuNzOOu36+9fV3jHw9f2kcuoSQDYUV
SA6/3sdM+1dmFtyXFiLHw1qR3eKb5lG355AT6/OaVnIOF7+tRXTEeKdSGc/vZcgdvnqQsB3y
a8Ss7yOykvdQplABB5JoQEZJ4phcdu/XNOwDgA5HesrrZGr11R7R+zJqdjbPqUeoS/Z1eY/O
FJwPLb0Bre+OvivQLvw5eabaXUtxeGGVYx5bBSSQOpA9DXk3gP4W6j8WWkGkHaLV/LlLTCMD
5c9wc8A103jb9m+58A+G21iV/NnjjZ+ZlYAjbn+AH+L1r26M37M4ayXOjySzVoLSKN8BgDn+
dPYb26k0odsZbAYjnHr3pokBbqcV4t9bnVF2jYXGOlPiBy5JJGKazDB7g9KWMBl5NYp8zuUm
e2fsvTGSa6kz8wtzkf8AbX/61dJ8bYvL8IXI7PFKfyjb/Gs79mrTng1a4GwLAYQFbI5Pmf8A
666H45+G9Ul8PzQwRIzGOUfM4xzH9fevqKCTp8p5dZfvLnEfskv5NrdnHVpP5xV0vxmkCaVM
GP34iuPqr1yv7LN5BYx3UEjlZ2MihME8kxY5rqfinZXes6Q6WMInnEZ+8wH8L9yR6itKGkLI
VS10zY+EP+ifCe2RgNoupCe/8RrjPEvhJ/GHxOhuiqvZQ2w8xZCMZCsBwQc/eFei/Drw5qWh
fCaG0v4kW5+1O5COGGC3HOayPD2rWWpeJJ7GGQm8RcspUgY2qeuPQit1pCxna7907yDX/C3g
nSo/K0yJpF2pvktEOTgA9MelN8Y+IH1SzWR1Xb5aEBQQBz2yfeuO8Q2MmrNHDCBvV8nJwOA3
+Nb2tXUdrCsLgkGJR0zg5/8ArVq5WXKZvXc+KvEiKfFF+mAQ8zk/Xe1fZvwyKjwJADlkVlHP
b93HXx1430q50TXr9bkASSyM6gNnje1fXXgK/gm8A2j2pOEVBKCMfNsj/OvKo2jVd/63O6bv
SR4X+0PJv8ZacGO475cH0HmVwEkijj8zX0b41+AV58QNXs9VcpHbIHYs8qjKk7um1j3rxj4m
eGrLwbrNvpFgwlcRkzEDADBivXav909qxxcPthQqpLlOXZv3eB39aiyUzxzTxEzD6U1lI4Yc
+teOpW0O5uzsKeYHOPmKmvf/ANmiX/Qrg/xLbkEf9tD/AIV8/FB5UhBPAJ5r6H/Zgsne3uLk
YCeRtbJ7eYf8K9TCPVGVde4WP2gXW08HRNnIPnAk9T8hrwv4JR7PHMBc4BVc4/66pXvfx90a
6vPC3lwxqyIJWwWA/wCWZr5/+Ckofx5HBknKp1/66J/jXdXXvxZx0NUz6y8cEI0+0c+XwP8A
gJrP8CBW0OHcN2HY4I961fFFpcXTzbF3SCP1GOhrP8E/LpcKEYdnYY9Mmu1aJI53qmfOP7Q9
ysvjDc/GY4sf98tXoP7JLSPpNzuJJ2y5yf8Abjrz/wDaJs3svH6QXPBEUbYBz/C9erfsn2Mk
iuY1AikSY8cZ5T/CuFSTrM64u1EX9oEF/ALMTj95CP1NfOM8MVzp9tbNlchSGHstfS/7QOnX
beD5bUxg3IkiOwMMYDHPOa+YLlzZ2Nt8xbZgMPfaRWeMXvRb/rYWFldNH2x4WmCeCbb++oUD
H+5HXzP8cTInjqOSIAM3mkgcY+dq+jNA1W3Xwzp+3JcRrxt4+4lcB44/Z61/xZ4mj1oyLFYz
ozANcgEhmZhxtP8AeFdUm50rGTfJUbZ4GTvOR1pmMPluMVt+OPDw8GeIo9KV0kG1mJXnozAd
h/d9Kw25fjp3r5uS5Zcp6cZKSuLLcKsbFeWxivoL9nyAP4ekn7xxlg3uTLXz3OoaCXnaCjA/
lX0L+zvDIvgy5Of3QixkH/alrrwy5aiIqr927HrUWpyrZBg5DL3BPv8A4VJLqs1xpx8yRicc
HJ9D71SjtXTT0ds7DyDn604wPHZhv4WGQc/Wvq1LSx43dMkRyunsMkfy7141+0DHu0DShIqu
PtR255x8pr2N4mhsCXGAe+frXjvxqs7zWNG02K0iEvl3POWA6qfU1FR3joXTXvI9P0hvs3hC
1mGQ5Z9p/wCBN/UVyfhTRYb7X7zVZYwbjIXJAOFAjPpnt611ul2szeErZZcBoi7HB4A3Mf61
ifDy4j1i31O6tnD2y78tgjoiZ4NYyioxRb+JtE2qXsj6rEm4jcMkqcHoad42njPhqYtwC684
96ieEy6jE65Kqp5J56H/ABp3joLJo0lmf9dvVsdsZpz2uG6SOW/ZsDW9hfsepL4z/wBsq176
b/ipLRe2GP6PWJ+z1IsNjfIxxJvcAfhF/ga6G6gabxLC8Y+VUbnp/e/xrOLvTsVN2kbnjIqn
h25Dn5m2kf8Afa18V3PzWmqLn/l4PH/AhX2Z4zZr7RZbeIZnXHB4z8y9/wADXxm8Hl2epW03
yzi4bdj2Yd/wNefjnblsa4X4mfVX7OY83wBcbhh0SAD/AL9jNcb+0+4FvabTkGDB9j5i16B8
AICPA86kYbyounTiKvOf2lbCVrSOfqkcZzk9MyLXRFOVBoip/EO2/Z+LReAbcMMKYkOf+BPX
oOta/wCEPCtuup66rvJCA/8Ax7iUdvbPda4H9n+ZG+G2WYhFt4/0Z84rh/2gtKl8TpDb2imQ
FlXlgv8AFF6/Q1ph/cpOJNdc9S56j4k/au8F2GjCHQ4He6kDKVax2hRg4Odw7kV4Xouvaf4n
+Iuo65rUfm2lzteOPy9205T+Fs44X1rO0L9mfxFqVnHe4SK2KbwwuVBGOuRg+hrn/EXh6fwz
qc2kStulh4Lbt2eAev8AwL0rkrVJLdaHVThC9kz7h8FeJNEk0q6t7G2KxyAAt5Kqf4x/U1y3
xu8UeEPC2g2y31k11LJIyZNqj87CR1x2ryf4Z/HDQvBGg6nBqhYyzRbYD9nMmH+cjJzwPmFe
d/FHx7/wsS0hW3c5ik8z5gyg/LjuTW6xEVS07GUqEnU0Pe/h3KdT0ES20awW4Z/3ajaODzwO
K39e+MOjfC/SyNSjPmYJwsBfJIJA4I/u1xXwE8ZWk/g82Mu77SXlZTs7kgAZz71ynxf8CXfj
lGuIVRr9QMGRwOArY5IJ6kd6uElKmmZyjadnseyaR4yt/iXo39s2GVtSxjAZChypweMn1ryL
4r+JpvBviCC/UsYlRYyqE85D9sj2r0H4VaXJ4O+GLWWo7RJHO7M0Z3cFlxzXkniIS/E34gLp
dp+9hihEjiQ7eQp6Zz/fHatub3NRQinOy2PfPAC2OsvBeSp5tvtOQUB5Kg9CPeuT/aR+KFno
EYttFUwBpFULHGYx96TJ4I7KK73wtf2Pgay8rVUZA64AjQOc4X/4k15z8R9Ah8WaVcW9sgO9
lZGkwCMNn09Kt3jFrqTJLnuaXwUh+yeE5bzJkWdkkOeSCUXP8xWH8QvjNqXhTxBbWkUt0IyJ
CVRztwCQP4x6V0Pw2jPh/wAKxWc/XZHkDnBCKP6V5L8YkNx4qs22ny5Fl2nj+8T/AFFRGTcb
hOzlc9k8VaWdU0rfeOZo5rMy4c7s5UnuD7V89v8AEXVfAuq3lnprMkCSF8xsygfMVA4Zey+l
fS3ic7NDs4wcZsAhP/AcV846x8JPEHivxDPNpQi+yFikhknCEtuY9PoR1rnq3UdNy6NlLXY3
vAn7QHiLV/FFrZSSzNEZFDkyP0wT3k9vSvX9e0eXVdLvr+6kMiywNKAzZ6rnuD7V84+HPAer
eA/ippC6iseyS4A+SQP0T/7IV9O6/Nt0FogSGkt+AP8AdH+NFKUtpGtVxduU+SfsEt/421Sx
h4VJuucfxY/rX0x8KvCcfhHR01O+jQQtAGDDDHIJJ4x7GuR+FPw0udV8VanftFH5ZnLFmZeV
Epz2PpWr8efiNbeGdJh0KzeSOaJ2gbapCk7MAZBHHJ7VnTpqMnKRMpOSUEeQfHz4lt4o16C3
iZ1CygsgBVQSiAYG7619AeEkx4etpFwPmOQP95v8K+PZ7NEuIp0G5lcMc+3/AOqvrPwH4jtJ
vDxihLvPGpdwy8Y3NjH50qdeNSrc6JU+WlY6LxB8WdE8C6eHvomMqP8AKVg384LDuPSr0urR
+JLMX8KgLJlR8uOmR0r5r+NvgPWPFutxalYokqYjRlklC7cBsnB/DvXv3hyzl0jwXE1y2ZYz
I52nIxljXY5e/Y4Wko+Z5j4i8Zy6B8Q4bC4YrayWuWAyRn5iDgH/AGR2r2jwVptteQrcS28d
xESygyIrc/Q188a7pp+J3xAS5twjxLAEcN8oO1T2Of7wr6Y8MS2Xh7wp9luJPLlVyfLVSTy3
qBip5nKRbfuJdTyH4/8Axbg8NaZLptuPLImVVSKMqDhmHPzAYwv6Cvmq7t/OaPHNzI25mPc4
JPNfQ/xG8Fp4mineO3jkuCwclwoONxzyR718+WDLd679gztuYmdSvYbcg81zYtXasbYdI+yt
FkRfDOlED5liUHj/AGEr5f8Aj0QnjGN87srJ/wCjG/xr6h8MW7Xnh+y6BI0VSQcfwLXyr8e9
RiHi2KRXJQiXnB67z/iK3lFulYzj/EPprw2dnhfT5BzCVB56/cT/AOtWzN4/8MeF7eOa+t99
wMAOLYMwJwvB+prmPC+v2up+AoJbYt91QMrjqkdeP/EnwdqeqeIdN1C3jEsMcuZN0gGAZAeh
+tOLtAmXxan0RJqkGtLDf2+Rb3J8yPK4OD7dqLh9hUt9wdaydGK6H4L0Wef5Eht8yYGcAYzj
FST+JbLUrcXNmXdAM5ZcD0/mDW8ZWV2ZSjroa1z8SPCnhKG0F/GDdTuIVK2u5t3ufTp3pk+r
Qa3Ml3bArDIQ6fLt47cV8y/EvwPqmrePLXVRsktZbxWjVpPuElOx6dD0r37Q3GjeENINx8ph
ixLt5xj0/Ks7+9oVZKN7m/qEqoyE/dzRe+P/AAt4Yhja7i33EjeWrJbBmyeepx7VkXfiCyv0
RrZ3kjz/ABLivnX4leE9Xm8UWGoqBLaCdQE837vCZ4P+6elaN6NlQs5a6H0hqV2L10ljGUcA
jPHQkf0r5V+MkgfxskcvyuI4m4/Gvqi1iFr4ct7q5OEjDliOTwzH+VfJnxIvYvEPin7VbOWj
jWMZcYPHJ/nXFippUrvqaU7OpYxX+bDE4qRUAXeDz71EZMZ5+Ud6fHzyORXy28j032PTPgKq
N4hUsxC/vRu/4CK9m8fMZdLvJGPOVGP+BivF/wBnhHXxOUlwUJmIHX+EV7N8SF8nQbqZmKqX
UZ/4Fmvo8LG0Dz8Tuj5ItYiHuDKf3jTMRznj/Oa3fDkz22oqlsSJXJPJwDwfT8a5qxuIp7i9
WJ9xjnZWyCMHNbugzImtQdd204/75avK95VLtHbTdoo+u1lEvh6GJuZJLT5m99nrXzL4rgJ+
K+nQPyPN4J548x/8K+ltRU2fh/TJejCyBAHfKAc180eIWMvxd0wlvmaUN9P3j17NRvkOCK98
+jrAx6R4ZhiQlXe2DfL/ALuf615r4O1W9u/iNqUE07SW73CoI2diFGGHAJwK9FvB9o0S2GcF
LVf/AEAf4V5t4Nj3fEObb2ulBP8A31VSk1FJClq2dN8Q9PjTSr9doP38DA6bWrzrwL8Mdf8A
Ed4slpcG1tSQUEVz5ZxuxyMV694otDeGeAAsXZlOT2IINT6YP7J0qGBGMarGFIQ4yQPb8a1l
HmIjNxTsdBp/w3tNDsDFe6k08iqx3O7OepPXZ7183/tBAWthp0yqqst2MEDn7hP9K9v02eRk
ZZZGJPXJJrx79olNlnEMZDy7V9j5dVOKUGQk3NG58C9Xn126Z5ZD5IJAGTx8ydiT6mvRPGeu
XFn4SuoI5GXcHywJ7o3vXk/7Mjho9rnDB3HHf5o/8a9J8aQtP4amt2GSWOSD/sNXNhpNxuzo
q2UkfLXgaGXW1ME08tzcOWO6Zy3AA7mvqHwH4dPhnSUlYmO63Nt2sD8pPqB7GvnX4U+G9Wtt
cSSeBYI1D9ZASflHoT3P6V9U6lOtwUaPJXbj07msqUXGo2y6krQSRYm8R3HiGJopJJBtOMsx
7fifWvG/HMfmazAG5QEnH/fdel6Z5j28glADdsdccVwPioGbXrWMdeefweuus/cZgrRdke++
DvFdzpVgFWZlEiq3Bb+79a6C18ZW0JO6BGm/veX/AFz9a810lz5KAkZAA/SrwfN3wen/ANet
KL0ImkP+Iuq/8JHbtG6LtEbJt29cn3zXiNh4L8S6lrj2ehiKGJ5SSTN5ZByfQ+g9K9qmRbi5
Ckc4/wAar3c7aUj/AGV2idgWJQ7efwxWtSPMKD5B8fw3ubPwzbSahcqLy2hzOnmFgx/75Ofz
r5x+N2npFqcc8Crtif5jjH/PMH+te+R3U+pIRJIzOepLHn65rwj42zCDUvsUjEea547cbDXH
VivZSRUZPmPOo989zaCPAXzUZu2Rn/69fUXg+MxeAdPKcsUAA9Pv18wacWivrPYBsEqqT+I/
wr6j8Gxs/g+ydDlVUE5Pu1ebhI2mdta6joeMfH+aO8msVA+ZLgMSR/sCvMWYhuh/GvSPjy32
rVLMHgiYNx/uLXnDc4ycGpxtucdDQcMtngGo1ZQdvSnBtvrUZXnAGO+K8ppJ8x1IC+0Yyc05
iI03dqYFLtz96lZSpCsaTd9Bt20Hv83TvT42wMjtUeDEDt6e9PjcFGKjmmPR6iBt+SaJFC5J
qMj5gwJx3pXlYuGC5UDvVPUVrDifu9OfWl3/ACsBjNHnq+GOcL2pvEmT0yeKG09yWtbio7hh
0Jo3YmLN26/lS4G3GelNyHJA6ms1aSsEloBkVicc0KxOeBgUix7M5/DFNZsEc4PetY2SEtVZ
EzJuOae6Bj0GKhVguQe9C/MPbpWbv1Nfs2HBfKYgdMUoYc4GfenAIF4OR6moziLvT3IXYXkA
dm9RT3XeCeBmmE5XHelgJBz/AAimknqhNMaAdoFSo6pgEY9zQp/eAk/hTcEsR1ok76FuRMMK
SB0bke1Mc+VjB69qbgucnpS4BzmiK6ksVQXU49etSqBHgjr3+tCuoQgE5PWo3CqRtJJ64rC9
5WDfRksp3qM/L/Wm7gpwDkmo1zkk/e7UpQr8zH8q1s9ilbZjvMw5HpSg7tzEcUgICbj+Bp3m
Ajjr1p62sxSemgRkDOB1qSQSZwTz6ZqONizHI59O1LI5D8YxSkTq2K90HGPLUepxSQFZCMdj
1qCdWAI6H2qSzPlnr82cURSWornS2Mqs3TBOe1TXC7kOAD9ais2AT5uG55qWeYhSrGicuxKK
OMDnpUm4BcjFRbTtLEkc+tOXErZU4XpUpcqNGTqCwx3qWRSBwPwPSoBcFGGamS4647ms+Zrc
roSxMCpLDpV+2dAyYGM46Cs8K7OuFG0nmtG2UAcDBFDqW2QM05cmwcZIGVzz0G7mvvn9jhQv
w8jx90wQkH/gUtfA7sxsNoG7oT9M5Nff37IQ/wCLeWpHQ28XHpzJXl4le8rm9P4Ge8+tFHrR
XuHM9wooooEFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUUUAFFFFABXJfFkE/D3VMHB/df+jUrra5X4qDPgDU+/8Aqv8A0alc1d2SGtz82dLn
xHcLsAHmE/j/AJFE2QTxkHuabox32t05OR57D6dKdLyTk4B9K3e9xS0ZTk5BIFQSsVAANW3A
wxHSqsoUA7uKlGadyNwWyMdvvVA0YIYbiSO1Ss2BkHNRlwGB71bQ3ciKA8EkCopVAUjqAfyq
wWDbgB05qvMcr0wTxmpd9mCepnTZU8Cls5cTBsDIxSXBOdo59zTEOGHatU3BXE/M73S/jFf+
F0EEFjBNEp3F5HYHJ5xx9Kl1X45aj4ozusba3jIx+7Z/THr71we4Fc7jjOKSSMMARx24raVb
m90xcI3Jb2cz3W8jBI6A1BOVY8ce1KykdWzj1oQhj61zrfc0+ERI8EvklvSmLliVbgU6Vy0f
ycEelMVQ/OTuo03YXuBzGPlHJpE+fvTtvTPBxxSBTvwORRDTQd7i7QAwBphGCPQdaVsEMBxS
xuSpGOnGapq2o5NCDb260ki5O4ngU/aCcd6i8n5mLE4FJJsExyESAjsOaV8RAHJ57UgGBuH3
aeTkA9qm2o27O4+3m8mZTjdg9677Tvjpf+GLfFrpVjLwcDDJnkn1rz1k/XpRu2H5ea6IT5NS
ZJSO41f48694sXZJZRWUIGD5U7kd88Z/2v0rjbm6Ms7SkAuw5Y9fzqKQAx7+9JvB+UfnTlUl
UZnCCT0NHStTk0yZLiPKuAQGyQefcVvXPxp8TSZjijbyiMM/2p/r0z9K5A3HybQMj1NIhLnj
oO1NVeVWLsupK0waaRwPndixP1rc0XxPcaIfNQbyM8FiOoxXPbGDgjinK4fOOo4+tCquLvEE
rqx6XL+1F4hsbcWtpo9rKjgfvPPdSMfjXF6n4hvfElylzqY2SIWxGHLDnk9Se9ZBfDc9KcST
yeMDrmtXiJNkOCR3Om/tD+IPCS/Z49NhuYOo8ydhjAwOM/Sr6/te+IgGVdCslZuAwnf/ABrz
l8RxkDnIzzTFClQSBmrWKnsg5E1c6nxH8ZPEfjAOl7mCG4UhkjnchVIHYt7VP4Y+Jl14GsFS
0sre6HLEykgk5J6j3Y1yBIU4x1pjSkNgf/qrJVm9ZAqelkeh6z+0V4t8Q2K2kGn22nwIeZIZ
nywwRyNw9zXE6pqMuqzw3V2fMuA/mMTkjdxnrn09apMxY89KUbV9zVTxEmNU4xO40n48eIPC
y5htVuw3GyW4cAc59a2R+1r4nYhU0CyD+puH/wAa8uAPJFO80qfb1q4YqUehMoKTOw1/44+M
PFs7m7gjsomXaUhncqRjHTf7mua0jUJtK1L7Zb/LnGVBI5BHOR/uiqLc85JAprNtbjkGodeU
ndlxikrHpkX7TPiHw/GIbfSLa8AOd00755/GuW8S/ELVPG0bPex+UsmOkrNjb06msFQXU8fr
TNu5iSMCnLENbByR3N3w741vPBscT2kC3DRLsCtIVB4A7fSuztv2tvEdrLzoViQMjBmf/GvM
XYBeOaV3GMADJohipRRLinqdJ4j+J+teN7h7q7jWAOSdglZwMndgZPArn9Puf7NlMiICSSTn
6VGPlAB61ECFJDVzyqyUlJlwio7Hpsf7SfiXQ7VoLLS7QsV2hhK6npjs3pXJa98Tda8Zh21R
PJLAjaJmcYJyepPeuf25B/OmFcKx6+lbTxEmrLYXKtxCQoyBzSbXKlsUBSpBB5PapEbYOeSe
tcbbbuakY3cZH60gQO7DO004ne5zxjnio2XDA5PWlL4RJtjkG1sYzQZckqORRuKyHnrSeWMD
A+bPWiFlEubui3aXP2SZZeN4II/z+Fdrpv7RHiDw+qQwWazbPmCvcvjrn1rz9zuPpjvUqABM
1106vItCGk1qdhrPxy17xtC63lnHZxsQCYpmbpyO9cZI4bJzgetCHIOe9MI5zjj0qKlRzdyY
xSZPbahLYT+fDEHdRgZbHFde3xp8SXWnR2JsUhgiwBItw275Rgd64xW3DOMYpJSc4HIrRV3F
WFKPMbFv4vk0+6N0cmRiWb5jyTn/ABrsk/ay1/SolRNHtZkI++07g/zrzEMQDwMClR8qcCtl
imlqN000dn4s+Oni3x9bGG4t4rCyaIxFIJnIYHndjf16du1c34f1yfwu73lqublWEhJYguw9
SPqaonr2oPBAPOax+sTb1Y1BRTR6J/w0r4nkshbJpkCsqhfN+0Pu+vWq0/x38U31viWzRCBg
Mtw//wAV7VwgbBx2prOTx2raWJk1sZ+yVzet/GF3FrEmtMGF63Lr5hwcEHr1/hH512Fj+1rr
mhwrbppFtMEG3e875OPWvMFG4kE5x60/BXp0zUxxLLdOLR2fiX9o7xX41bY1nDaQvkMIJ3wA
QF6FvrXJeHbh/DV893A0lxM4AId8Zwcjmq7OwJGBj0pqsQCCMH1pSxEr+8JQSPVbb9qrxLo8
Qtl0O0kK87muHzzz61ka78fPFPi1ybmCO1gZdpjhnfbjkE43e5rgwTnrknihxtbGcVTxUmtN
BOnFsvaHqcnh3WG1O0UzXDIU2u2Mg47/AIV31j+1b4n0GLyRptvOOTma4kJGffPtXme/5tpH
B9KWRh0C7h71MMROmDitjt/Ef7RPijx0vlPaxWkQxlY55CvBJ6Fvf9K4qU7pmm4EzEkyDrz1
560xXwrNjmomfdJx+VRUrzm9xxgk9D0vQP2g9e8GWTQ2+lQXceQQ8s7A8ADsaj8TftF+IfHq
x/6LFaW0abGSKaQgnOckEj2rzhCW+8cAUMFB+XkHrWqxco6DcEaNnrl1o2sDUrXLyA73jLkb
iN3f8TXomm/tT6/oVmqDRLSRV7vO+TgAc4NeVgkMQe/Q04OTkA9OtKOIauKyasd54l/aS8V+
NIjB9jisbJwVZYbiTDA4zkbvb071xWl6nPoWtNq1sXN27+aw8zaM89xz3NVWXrxRmRQMjgZ7
1UsTJq4KCieoWX7W2ueG7SO1fR7afA2iWWdyzfX86zPE37THinxxHHbf2bBZ2i5OYbh+QRjk
Fvr2rz5n3Z3AdOlMVgn0NNYuUlZIXs4su6PqMmh6++sogmnAUqjHAypUjn/gIrvPFH7RPinx
koC2UemxYIdYLh9uCMdNw9P1rzpGLHkYHbFR7yFOScisHWl0NHFNajpX8yZ2eQvI3Vm5J4pv
kb+HZlwexpucrkgYpTtLYzWLk5vUEl0PUvDP7RureA4I47LS7O58rdgyO6k7uT0NReLv2pvF
XxBlMMthDYQ4Xd9nuJMZXJ6FvcV5qehZhnB6GoWO5TxiumNdxVjHkUtWNMSieWQ/fkcuT9TR
I2QcjA9aeNoXLc1EcY/WuO6Z0K2zHpGMEH8DThEc4Dnio8bRxyO+aeFMYz3POKLWGtDsPAvx
S1f4YQzro9sk6Sne5eVkAO0r0BGetU/F/wAW/Efj1JYtVBjtXDAIs7uOTngFj6DtXLkkrnPe
lMu75SMgda39tJRshSipasaoKwhMfLgDNGNg6dKeecHGMdKapJkGQMCuVxtqO1tgADEHPPXF
I4EgKZ289RUrbG6AAjrxTC3oMn1qob6Bsep+G/2m9Y8AQpHZaRZzhf4mkdP4t3OD70/X/wBq
7xD41YLJpNtbBsjdHcOeCNvc15UzlRk8DtSFgRXdHEOMbIydJP3mbej6k+i6q1/A7JI2M8kd
Nvp/uivTbD9rG/0O1EUGk2dwq5O5nkBPevFl+dWbJHsKRMgl8CnCvJCdNPc9P8WftV+JvGds
bG30u3s4chi0NxIDxnjqPUVw3h/W7jTdRF8wKT4IbDn5hjHb8PyrL2fIQOntxQrYzk4AoqYu
T0Qo01HY9cf9rPULeAWqaTZqyAL5oeQM2O5Pviqp/am1G8Q2radbFyc+Y0khYY/z+teWvJnB
ZBxSSSjbjr9a0+syasheyRr+JtYk8W6gt3eja6ggAMW6knv9a1/DHxNl8DGPZGJ06hZHbH3d
vQCuQ77s0gDFOeSelcvtJX5rmqpq1j1bxX+1P4g8bWS6Pa6fBZ2uxo5JoJ5ASDjqMjPC/qa8
1Wxvr2SZ7ZDdyyyMXLuBgnnAyenWqaAKhKAL64rsPAXxEfwAJfKiiuPOkErGYNkYGOMV0KtK
u0pbGfslHY5//hX3iuTZPbWgbJyI2lTH/oYqT/hX/jKSQK+mxRse4lj4/wDIlen/APDY17Zl
4f7IsmEXAbfJz+lRp+2hqV2siro1kjdE/eScmupwpW1/r8TJzqs8vn8M6lo6t/akYiI/usp6
dejGvRvCX7Tl18MdKtbK002zniSNYssXQvjnnH1Ncx4u+Lmq+PkeO8tYrWJiX2xSMc5GO59D
XIECNFH8HT6Vxe09nJ8pso80bTPWfFX7WWs+OkEZ0m1tF5GIppOhGD1rznwvrI8M+IG1eJVM
yhTg5H3Sp6jn+GswxYG7rmk+VBu7+lOWJlLccIRSseo+Jf2kdb8Y3EqwWi20bptLQ3DrxjBO
Dj1/SnWP7Rt5oGippiWUO+NzIJTI+85zxkfWvKZZioA+79KGRd27ALdQSKX1lslU47M0vFGv
y/ETVU1bUS0cwAQjeXyFBA5P1r1Hwh+09dfDSySxsNLsjt3HHzp945P3eO1eOnJQk8gmopFU
IVAz9amGIcZuQ+RP3T1/xR+1dq3jU+WNItIicZKSv2JPf615QxRbuWUDc8rF2B6Ak5OKgBEK
YLZzS4GCwOccc1FavKoxwp8h6H4S+K7+DbZTOkdxjG0SF8Y27e2a6Lxt+1rrPjC0itbfTYbW
JF2/uJ5FPUHvj0FeNeTHN1AJ9xmnRP5IIAFbQxjSs0RKkpu7LDpqGs3Ms1tF9pdmO7c4HPJx
yfelbwv4qcq0ekxY95o+f/H66XwD8So/hbZPGtrDdiaUTFpcgg4A7A16VH+11FFaIW0u1ZsA
BQ0g44/2a2oxpzV5CneOkTw+Twv4rZGU6TEFIIb99H/8XXofw8+J/iP4XaNcWsmiwuhj25e5
4/j5wpP9+unvf2xES2YLpNruZSAC8nX/AL5rznxX8XtR+IFvKs9hDaW752PFIxJBI9f90fnX
S1TguaLEnOSszvNM/au1PyJ0lsLcOrEhTLIR1bj+VSx/tW6giSF7K3JP3U8yTC9eleHFwVAK
jK8Z7mm7kU52gs3tXN9efaxXsonqtx+0Jf3upo11AFhxyPOdlz8vb6ZrutI/am0/TbYh9LtG
bHBXevc/7Br5yeQhlyBtPGKUW0cMjSeUueAOBTWNlccqKaPY/Fv7Ul/4sSWwttMgt42H345X
B5Uj0H96uC8D+KJPB8DGSdnjeQu24tj+Hjj2WuaDgZCqB6kUF8IRgFe4NRUxk5O1v6+4IUlG
6Pdpv2nrDTLIGy0uykuc8KyuMjPPO0VTv/2mE1iMT/2XYxTDgkK5J/HHv+leI+XFA/yxIOOo
UUJIEXKADPcDFU8W2tRexjfQ6vwt8TG0Xxrd6texrFZzCVjErNs3M2RgAH+XavVm/as0q2hU
Wel2hcADJEn/AMQK8ALI6lZVDqexGaYbWIKQ0abfTaKKeLcXcTpJ7nt+r/tKpqzJLbafZ+ao
IO0OOfxA968j8U6k/iXxGmrGGGBwrKYolwhyWOTk/wC1+lZMVuluT5SiMHqAMU/kAgE1lWxL
qlwhGDPpHwp+1TpHw/8ADz6cukWiysByA45VQv8ACntXG/Eb9oQfEzTbuxTTbOOKeFojIocs
uTkEbgOa8c8mAtuaCNmXoSoqQBd4KqqZ/ujFaLF8seWKE6Sk7na/DvxjJ4L8pJT5tqjZ2uWx
jLHBAz/er2HTf2pfDmmLHFJpdr5qgAuquDn1/wBWa+biCoy3zA9Qarm0tpd58mPPUnYM0o4v
ku2hzpqR7b4//awvvEqyaVpmnW8NruYJNHJIr7SuMngeteMy3Es97c3crGSe4Yu7Mc8nnvzU
CxCNCI1AU+gxTowQrAn3FY1sQ6sb9BU6ahsEuxx88avnswzT44lgwVUKPQCmnIznrSj5RgnI
PeuSMkbs3fDGsz+HdVjuoGPlqQ2wkgZDA54+le7+Hv2ktJsQ0t3YW5c5yyhwe3+wfSvmoB1z
zhaQQwlCTBGc/wARUZrsp4n2SJlFT0Z7H8Vv2mrzxzp8ukaRaRQQEo++OSRW4OT1CjvTvhZ8
VtN+GWhGdbWCTVQzgyTKxOGI7quegx1rxpQkI2wxqg64UYqUW6TESMqk+4zVyxblK9jH2MYn
XfE74xX3xR8qRAlpNHIDiFnxgb/Uj+/XoWn/ABjgtvDsFnPFF9qRlPmkOSQEA9PXPevEGiVe
QAp9hUc5TeGeNWbtkU/rkk7sboxase3QfH+CeUxXlvAsYJCbA/zD16H2rtIv2hfCNnHGtxpN
puC/eaNienr5VfLYVJThkVh7iqr6DZjkxrzyflH+FbRxjT1G8PG1me3/ABS+P0fjrSJ9P06z
gtrcwNErxbw3J46gdgPzrK+EfxSn8LWDWN2PNjMgf53YnG0DAxkdq8xWOO2TbEAq+gGKJFEi
YPKntWEsVKU+YI0kotH1dB8f/C3kA3mmWxnhTOXRmJ49fL46CvM/iV+0UnjNJdJ0ixt7ODIh
E8JdXC5XJ6L2Vq8TbTrdh80Stz95lBP8qtKvkRjaoCAAYHHFbfXrbIhUEndnpdl8bbrwvokN
hbIsjxpseXe6s3U5OPrXC61rzeJdQl1GZ2Mk7FypYsFJxnGfpVAOAAegJoYDqMcnFcM685xa
ZsqcU7gHYHHcV1vgLxPL4e1GSWPLK+0MpYgYDc9K5EjnI+8KEuPKJYcHvWVKo6buy2rpo+tt
C+OnhvTrVkubWGNgGbAVz/KOvLfij+0Gni0tBYWsVtH5YQCJnGOG56Du1eKNp1vM2WjVjnOS
o/wqzE3l/KoVQPQV6f11JXS1OJ0EpXPd/hj8UNE+F3hBZJreK61IyuD5qt91iOchD6Y61wfi
/wCKV54w8YRa9aMsEKKEMERcIcIy5wSP7w7dq8/uIoZnMjRIX6ZKipFOxAqKFT0HFZrEyUeV
Gns1e57/AC/FPT7SwtpZlxcBFBClhnjnJ2n3rH0vVPDOp+I01K4sorM7GyIowQxOTk/u/wDa
/SvEmtozMXdFYn1ANPYM7Fw5TjgA8U3iObQr2KWtz7Utvj34PtbWG2+y20SRKEyIH+bAAyQI
/avOPid8TvCd7cE2+k2Vwr5O4wbcfPnvHXzS+i2pfcy5buSBz+lSW1tb27HbGqt67R/hW7xu
lrGXsVe53/wm8VSeHtTuIr4brSaYFYyxwFIYdBkccdu1fRWg/FLwfp1uRdrFyNx3wsx6e0df
HTy+YpjPIPymov7KtfKYY3Z5JIHH6VzLFtatXLnRT1Z7X8bfjyviS2vNH0e3hW3+eCEx70O0
lRk5AHQE9q5L4R+NZvDslvb3p+0KzEGOQsQMl+3I/iH5VwscSQoAigAADgYprzLnYVBJ4ye1
VLGObWhUKairI+ytG+JXg/S9Ka6vUhefZu8l4GYBuTgHyzivGPjV8aYfGMM+m6THHYoN6L5G
9SAU2g9FHfNeJyadBNJ8ylyeoOP8Knt7eO2V1ijVdvoAM1s8dywslqZLDpO56J8IPGc3htDZ
agPtUbJsDSMT1ckkDnBGa+idC8deDLK1le68piFLfvbdn6Z6fu+K+NN24lDxxxVYWEQ+Z2d+
f4jn+lZRxllqa1KUZI9z+K/xpTxQj2ml20VtDswEiLLt+VgW6AfxV4fEhhTZkt/tHrUibVB2
gAd8DFMChmJrlr4j22nYqlRUHuIzLvweM96VTjLP8uPSm70yQRilmYEHLYrkiras3tc9A+FX
iCDQ/ESSypiDY+cEg5I9gf5V9I6n4p8GaraSGS9kA4ITymI6/wDXP3r4ueIXEGxzwfSqQ0iG
R+WlX3DD/CvRoYhU46o5atNTPTviT/YZuC2kNhmyW+Tbk7v90ds1kfDaG1n1Tffv5Bj4DKu7
Pyt161ycUK2qlUQY7sQM1KtzKAzRtsJ6kZ/xpTxCnK6RUafIj7kuvFng6Hw2zrePO8EAjw8L
8cAH/lnXzH8UrvSrzxbpWq6PmRraQvNkbQQJAwHKg/3vWvJVsWeQv9suMk8oz5U/UVNa2/2J
nZGI3HLdga1eKio8qMYUOWV7n1L4R8VWXiq2sxeTLZhI0QiONmyAMenov612FrYeDPD0r6gt
1IJWw74ixuI9cR5718XGEzPuE80TdfkfApkqXZyP7Qn8roY9x5H5/wBKaxatZmksPzPRntnx
d+KH/E18rRBiNLjcWDspYYHHRe5NdX4S8ZW+r6Hpwu28iYRDzSNzZJ/Cvmu3j8gEqBnue5qa
S9njX9zcSQseDsYj+VP62nK9ivY8sbH16/iDw39mMEV6/mDJBMTc9f8AY968p+ItzouqaRNG
9y0kxVthMZ4OwgHlfp3rw+QzEki5lDd33HNFuCkRZmZ/RnOTVVMXFxtFGaoW1O5+CXiyfwcz
RvDHMd5JaXJ6lD2+lfTHha/0C60n7dqdyQiswKGIuOOf7p7Zr4zSdipZGZD6qcVFcrcXIIfU
7wKRzGJTtIrGlWVPRlzpcx7/APGL42Wuj3kdt4etLae23Id7K8Z5VieML3xXTeHtfg12KNjM
IidwIVWIGDXyxa2kOnLuhye3NWI765hLGK9nh/2Vdtv5CtHiuaV7aEOjpofY0154bit3RNTc
zjjBhbB5Gf4a4LUbvQ791Ml60U6OdoETHPB77fc/lXznB9ot7v7Ql7P5rAneXPft1zTlvJmu
N7SMZecPuOR/nn861li42sJUPM+x9L8ReH7RUiu7xoyQMsI244/3TVy78QeGodQjiN+6owJD
+U/I57bP85r4ona5mI869mlYd3Yn+ZqOaG6ukBudRuJmQYQs5O0egyTTjjIJEOg20faGs+K9
E0mdpBdNNHg4YowyMnH8PvVCw1aHxNdKtuR5THG7B4Bye+O1fIitPMgWe6lnVfuq7EgfmfYV
JJfamI1W11KW1VBgKjMBj8GFU8dGSsh/VtbM+zb5dJ0+zlRdSYXMa8p5LdfTIFeI/FW30m80
bULoXpbUFVmRDEfvZGOSOOnrXjkd/qEDGV76aSY8sxdufrzUT3888nmyyPIwOcMxIrnnioyg
0kNULPc774SeBT4qbMrna20uxUNt+cjufrX1jpnhTRfBPguzW81BxEE6iHGMBjjgH1r4Ytdf
1KwVzYym1Z+GZWYbuvowqG71jWr1SLvVblo2J/d+Y5U+vVj/AJNc9OpCDTNKlJzdrnofxols
9Tvrc2ExmRJN5YqQRhF9QPf8q85mYBACADUeSsAVCcD1NKACTu5PaufE1faS5kawhyRsKoyu
4VG2RwOacWxlR0FN27htH51xu6V+5S90VUBG4GnOGCjBz70ki+WmNvGetJ0Cj8cmqirLUHqK
JS4Knp600JlwgYjIzxT8jJ3HmkdG4Pf1FPl6lISNssVPQcZqVNgQ5PBpjyZO3HHrTY1UqS/H
0o1e420PZMnr8tR7/m24wM4zUsrZYcfLimeYoAAHU1CWupWyFYDkZ4HP1pFBGD2P6UobcWI6
d6Ad2OenWm2oomwsg4BJwc8U3YxO4H8abL8zYJyBzTM7mK/do3HtqSFB1JOfWnofl6dO5pqg
LgAZHqaeF3Zyaq2liWwj+ZWPSlKDkn6U5W2DB496TBkGVPFTZom/UYU5+Tkepp6naOfwqMMd
u09KkY9Ao/GtfId9BCSi7sY560hKscZ/GlDrJGQSR60uFB4PIHTFJ7WJimtGLyX5OB7UGAIf
lbPrmkHLAk8HtSlRG2QTjvUJtFajsgN0wRzSvIrgcfP0FNZuRjtSFtpzjOaVru4rajt4GAeo
oMqg5xmlRFOTt5NMA/e49+lW3pqVzIk3kqcAdKfEivHz1pRlFOADnrntTQjHocCo5uZWHe6B
H2Z4ycc81G5POBSEjGAM59am24+6OcVUdFqHw6kAPyZ6NViFtzcgBvSqtyWCYKge9WLddgHz
H8ahWkI3bBmZcAZ6mpLkMBuYYxxinafjAxx1ougxFXboiY7kJQAZJyTzikVkDHd1x0FMYEDI
5FPKh+ccgVg03sUiS2VXHPapBGhOQx+lNWP5eDinxthuADj1pSjcHHUtp8i+1WEfovr3quhD
MCfTpVu3QuGx68Cs7+8UmkadniKHJ4GV3H2zX6G/so2wi+HVrKPuy20LDjpzJ/jX57WqJ5lq
snG91Hr3Ffod+y0vl+BIkxjFvCB+clcGIv7RG8PhZ7N60UetFe2czCiiigQUUUUAFFFFABRR
RQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcr8VGC+
AdTJ6fuv/RqV1Vcn8Vl3/D/VBnGfK/8ARqVyYn4UNbn5r6KGeC6AHyi4bkfhUtxiNsg1FoMp
W2ux6Ttn9KlmVT1fb/Wt07E1NSmz5J5yPXNV5hzxyPapWH4VG5GxucGkrx0J0tdFZyF5z9aY
cnOBxUkiDj5s56+1NK8fKePWr1cOZCb0IeRkD73emSq2w88n9KnB2lsj8TVeeQLn5hST5lcV
2ZtwSgAz83pmooiHznjFTXCBzknn1p9rbq06qTt3HGCOvNaJOWiB7WIi/lct93rzTEvYLhgU
mXPpmvW/DfwrsNXtFuLy7FvFkhtyoeAfQn0zTvFHg7wD4f3ImoKbjbuULEq5ODjont61v7Pq
YuaWiPKGOThsj3poOM4HFS37RxzHy23x8c9KhZsjA6etYuOlzVXaECkFvmOPWjexP3enc0AH
BOcj3pHchcY/Goak3cNhyDeeTilD7TkYNNLbgNvBPU1GCyt0GPeq5b6srVjsj5/0oU5GcYYd
B60L9RTcncSO3FZ6oSXckMjjjaKWVi6Acc+lMMgKnP3h2z1pBIG+UgqRV6rULX1ARlV649vW
gKcE4/Co2LltuTgHrUyHjGe3eqTuim7IbzuJbp2qKa/t4id8ixnuD1rV0/Tzfyqigtk9APfF
eqeHPhN4dbdc67L5CleFaFD0PPVT2FdNOlzrYznJJXPFI721kAKzqcntVpVB+bIYe1e8TfDv
4eT2ckmlTpcOM42QpjOPaMe1ea+JvC50e2edICIFGQdoA6E9vpVToOKM41ruxyTHah2DJqJZ
CW+cFc9TTlffjacg96XZvYlhj6VztWTubW1uCllBAGTSMihSzHZj+Kp4l3tXZ+EfA39tyg3g
MFuQfmdQV6AjOfrV0oOegm1FHnjanbbsCUE+gBq0irMoKSZHtX0avwd+H0FtgXsb3GATlYfx
42Z9a8x8T+CVsC506AyjJwqxgd/b2ro+r8uxiqik7Hn0ssULBXlAJzwetNivrbeVNwqt2U8Z
Ne3eCfgxpd1bLfa/cx2ijDbJhFnBXJ5YnHJ9K3Z/h58MnaWKG7inuUBA8uONjuGcciP1FVGg
2vIU6nLpE+eQ4fo2T6etJKyIhLNtAGeTXpXivwNbWdveTabbs6xqxQ7FzgdOgFT+BvhxZatD
a3GsFoYmVWdfLVuOc9QfQVPsHfTYcal1dnkq3tu+czc9MYNTRyLLkRsDgdR1r6LHgH4YtJJa
xXaSXkY5jEKbs/8Afv3FcJ4w8B2tsly+kWrgR7im1FJcAHHQCtJYXqHtuh5k8ixJmVxEO244
zVUarabyBISO7bGx/KvavA3wci1u3W58Q7bCIAtiUR84Yg/ePHArqpPAvwqiufsK31u90efK
jSJm7Y6R/wC0Pzojhr6ida2h84rcRNgiWPnjG4fyouLyC3yXlUEdhz/KvVfGPw200B20e0Yb
BlR5aZJwfRV74rsvCvwG8Mm0S51m+iLEncjiHgA+pz2BqXh23YPbaHzn/atsyb1nOf7m1v8A
Cn294LhsFSjehB/wr6YufAnwotdSFkLy3a5K7tqRRNx9RHjtVHxN8M/CkMZ/swgvxhmjRR7/
AMA/nWn1Npbk+3e1j57n2RR7pH2CqE2rRLIECO3qyox/kK9j8C/B59W1Ga41plt9MJfy3lMb
KehXgn39K76Xwl8KdGuo7GW+tGupRlVMcTMeDnGI/wDZNSsM7mjqpKyPmuORJsFWJ9mBB/Wg
hy/3dw9a9k8X/DSyF3JHpFpLkE7cRrkjd1GFHavKLSSC11NYLxgiKWWUn+EgH696znQ5dUOn
PmMq6ultXGQdhHLKpI/SnQTR3KkxOWz1yMH9a+hvBXg34c+IbWWNL0XU2ANojRiPlJI5j9jW
N8Svh94Z8NaXNd6U+8pE7FPKVSGGPRR606mGvG4p1bPlseKFChOSRTDnPB49c055jOhfbgNn
FRkgKATjNcUfdujoQrMpA+bpRkZ9vWkEIznnn1pxIVcYGKy1chbsYqfxAmpG+U9fxod9u0BR
nvjtUZYt1PHtVNJ6D1Y9slchc461T/tSyiJBkYsRwoRj/IVp2jmS+tYBGCssqoxPYE4Jr6N8
NfBTweEi/tBVaVjwRBGe+BzsPv3ruo4d1DKdRU1dnzRDMLoALuD9dpUgj86kMZzg8D1r1v4l
f8IHoc81lopjur3CE7FVGUHk9Ix6D868mmLEc4BHYVnXpqk7MITcyOUk4APFO3lhggAVJawN
dTiJR85GQO5rp9I+EHinWrlc6fcW9uylhL5fB7jksB3qPY32LcuTc5Ldzg8U1wExgkn0Pare
p6PN4fuza3Th5ueQQehI7E46HvVGRw77Twe3rU8rgJSvqiXsD1IpGJIOKNpVTzn606yTzbuO
Js5lYKoHOaUIuW5ra5UnuoLYgyyFD754qdJlnh3oSykZVtpAb8a9w+HvwNtvFVgZdQhKLtDh
nhQ5HzH+L2UVh/Frwho/g3S51sVBFupThFXaflHYepNdksPLluc0qqjLlPKo9wJLDHpUVzfx
Wpw0hZz0RQT/ACrU8LafP4kubeGCF5F+Us6jIwSBj9f0r6H8JfB7wZa6fBd+IZIobnYrlJIo
uvUjlT2xU0qMqm451FHU+Yobw7sPDKpPZkYf0q0qnOMdOea+kPFPgDwdqEbNo5DSc8rEgA44
/gHf3rwS40DUYfF62EdpJLbOVBk2ZwDsyfT+I1pUwtldbkQrcz1OdutSitcbjn3XJ/lUkN7F
cqGUscnA+Q/4V9N+Ffgj4Ls7HzNduo92WJMqRYAz6lT2Bqv4l+G3g2MMmjRiUbcqyxxhc4Pp
GO+K1WE5iXXadkfOs+BnfhV/vGq5uYduYy0reiISPzAr1Hwz8JLnVtdms9QPk22CwmKoV4Ve
OWx1zXq0ngb4W+BdM8/V9TsE+baWdYT1PHAQntRHCc7swlWUdVufKqXLuceWwXuxzxVgxdwP
xFfSfij4Z+GZbFZ9IszNFNtZZEjjAIOT02DtivBNQ8P3sHiQaXFCX83c64XkKC3vj+GpqYXl
+EKdVt2ZgzXkVtwzkN2XaTmq66pbyHBZl+qN/hX1F4U+DnhGGyS48RzQwswUgSxxKQNvqynu
ad4h+FvgAEHTkSZWG7ckcWBz7R+lSsHpdhLEWdj5nkVTH5m4+WBncBVU6hCFZYg8rdyqMcfp
XqHhH4U3174vuLS6j26U8o/eEIUjTL+rY6AcV69/wrT4Z+D7Uz6nfWgcEbtywkE8L0CE9TVx
wfMxyrpbHyil9HIhAEnHXMbDH6VI9zbxxhpJVjAGQD1NfSniHwL4RvrJrjRbOOWGddyTRxRq
p6c48se9cj4J+E2kaxrd1b6ziCKGbgeShJUliOoPYLVvCW0QlXb+I8OOsW4J++Qf4gjEfyp4
vYplXaX29j5Tdfyr691P4f8Awj8GaTBdahcWiDBB+1W8WPlGT/yy9q5TVde+DX2Jns5tId8H
asVugJ4OOkX0/OqeBiveuJYiTfuo+dVDKC2GC9iQRTWIbvXVa+lv4q1WG28P2hAU7mWIBsj5
QOAq9yamn+DHicEvJa3FsyAsY3ixkD/gQ/ya8902puKOhS93mkcaSTkA/jSgbTgnOfWpLqzk
tLl4nDB1wSCMdqSNcSJuXIyM59KwknflZrGSaKl3dx2g3OQqeoBP8qZ/aNuxARywP8RRgP5V
758PPB/w81+WG11G8DzsHYoYlbp06xmu78SfA/wJZQzx2w2uqqwPkRjuP+mYr0aeFU4XRzVK
3L0Pk7aOOcjrSgKpJXk989qrNcZ1XUII8GKKeRUb2DYA/KpQx25GD6g1506fJpE6U20mSqcH
kYb0oYnqT+Z4FIFLHOckV1ngXwXN4s3ssMkqK2MogYfdzRShKrKwaWuzh31K3ZjiUlh/Cqk/
0ogv9zZaJ1QnG8qf8K+sLb4TfDXwzowutcmit5CF+/bx4zwD/wAsz3aqPiH4a+DL/T430GL7
V56fuvLhQAscEY/djsRXqPBaHJ9Z6WPmlsYBDcMKYDtJFbvjPw/L4Y197OeNoCzsFjdcYwAf
6isGSNt5OcD0ry6kHB8p006nOgfB3ZJHfimqzRYIBbPrTgoIOT07etPQhj0xjis0r6oOrG3T
goGb5AKqW+pQ3RKK+CO5BH869N+EXhvRfF961rrcwtJV24Qxhs5fHQg9sfnXs/iX4F+BbDSJ
pbInzokd2P2eMZwpI6RivShh/aLmMZ13T0sfKxBRSOT70okAAU/nSsxkubhQpESkAMP90H+t
MKpnIfpzXHUjyM3i1NXAnaCOeKRTuOByKBiVDgjk9RQGEXGM+9Y6lrTRDmzsOVx70xV3DoCw
7VMXDJ1z26VAGIYnGKtyckZqIoJXPHFPVV25BPuKFQOpJJ57CmxqynoSKlK6NPUXy9gJ3Ed8
EUjEFCoAOe4FK+5mIPT1pCMLkZ471SkF0ldiCIL2GaZNk4UDAFLg5zyaQliSCDj19KG5Mqy3
Ho52gY5FIWJLdPpSspCgqCR60xEYEkg4NKzSuZXsxOVXcrFvUHtQCzLyKViQpJXaDTQzAA4w
PerbbiaXtsNfe3O3FAYvliOR1FKS4wW65pZASxI4z1ArLl6MNGIGbb0INRyt5KF5TtHTJqXd
5ERZzkCvXPg78FY/iv4fF9cXP2dlaTMKojE7WA6Mc/xenatIU76EPRXPG4JIrlC8Miygdh2p
7Agba9v+OXwq8O/D3w4LzQbmC4uE8pZIEWJWJLEMflwewrxG3JdVkZSCy5wR0rSrS9lZ9zOE
+dMepMnOMEelI+TkkYpEDFuMge1OLtuwV6VhK+yNLsI3I4UggnpUdwYocvLsjHXeccU/IQlj
wAM17L8J/gTZfErRp7651EpFCULJsR8ZXdggn29K2hGU9IiqS5Vdni9veWs3ETK8n06093Yn
nj6GvXPjH8K9B+HmhyXWmXlvc3UMZzEiRq2RsHRef4ia8j03ddi23LiSfGF9z/8Arq6lFwdn
uRSmp3Y0SqSVyN1OC7Tu259/WvSdE+D19qtlBeR20m2TkkouOvqT7VyHjXS18O6x/Z+cyKWD
gYypAXPT/eqJ0Gveewe19/lRiEhDkHPtStOW69/SowSTyPxHajGG6cetc6jqa2tqIoAGc5pf
MXaQDRtzxgj3pCiBeozWnNfRgtRSA3OKXJYEYxSgKFyTgetIQTnGcetZ3ux9AXHOOTUEt/ao
2JbmNCPVqv6esJuEWZxFFzucjPave/DP7NXhbxFpY1K51cCM4G1IIzyQD7n+L0rso0vaPQic
/Zq589RzxyruRg6juDmngB22nj0Nd18a/h9Y/Dma3h0yfzopYy5Yoq9HAH3fauHWcR6jaxNG
CsgbLemBRUouDsFOSkitPdwQvsMq7+mM09ZA6kKVb3VgcV9DeGv2aPD+saeb2XW0kL4JKxxN
tJXOOp9a8++LXw7074aKPsl39rD8liiqB+8C9vrWs6FoORi6yUuU873FFAPOfWlMm3ntUauX
O7A2sMj2p20nOOledyq1jp0ANlieRjtT0VfmJ44zz2pkZy2Me2cVveHfDMuv3awosjIRyUAP
JIGP51UIuXuLqKTstTAudQhgAzIMNkcHP8qSG8hnOyOVGxz8rV9K+Gf2U9Mu7U3GsX0lkrKd
iyRxNyCR+HA/Wuc8Wfs+6PpNtKdL1DzriIFgEjjXcNue3XnHFej9UcY6HI68Ys8RkZicdu5p
ANowDkVNcwvazyQXC+VIvY9TkA/1qIDaMDn61584tPlOqMuYA2Rtxg0nmrFJhmHTu2KWNhvy
wwTwOK9F8DfB+fx3IqrFMsRDbp1VQo29stx6VVKk6krBN8quzzY6haFsG6jZhxgOKPtkEh2p
Isp6/Kc19Nx/sn+ErBVW81sRTt93zEhUnj369DXC+MfgdpvhC2nk0m6fU7hXCmPyVH8WD09M
V6TwrRze3gzyOQrDhmBVf7xqJtSsv+fuLPu4r2zwV8AT45t43mupLSIqu4AJwSu7GCR7V1dz
+yl4F0x/LvPEahxnIJt1Pp3zUQwsnqXUxCWh8yR3lq/+ruo5N3GAw4qcDA9q9v134F+BfDqS
z23iKCUhSwQmFsH6D615DrFrb22oTw20omgQnZIBgEZP9APzrmrU/ZalQq85nZIbOc4p2S55
P4Ck2jnHNOTcDkrwOmK59dzdW1EaM7eO3XNV5LyDf5TTRqw/2gK63w94Sn8TSCGNZB5gGGQD
PJx3+tes6P8AsgWOoaUt3qWq3NlKyCQZjiOc5PJz9K6KVF1VcwlUUdz5/GGjLRlWX+8pzSBN
yHLGvU/GfwQi8J2TTadqMmoRjPyqUP8ADnop+teYyxmMDhgp9R1qq9Fw+IIzU9iMAooxz/Sk
+bOSoAzmnOGAyAfTFPVtycjn0riSZrYQszZKrk0m4qnzce5rS0zTHvrtYY0YnBOQM16FZfs/
ar4lhilxdWcTZxIqKE4z3JA9a6qdKpLYUpRgtTy5kY8kEH3qCdhAN0j7FPGScVt+LdKm8LeI
E0iQfaHwfnTBOAXHYkfw16f4a/ZivvF2z7W93a25G7ftTA4BAwT71oqM+azM3OMY8zPDjqlo
RgXkJ/4GM/zqxFJGSGEiOe2CDX0S37FGiQyEtrk6H0MUQ/rXK+JP2aG0FHltdSeWFf4i8Q74
HRveur6rKxnHEJuzPI2iLHuaryXUMcnlmeNZOmwuASa6jwx4ak8VXktpaebvSQQ7kGeTn6el
en2f7IZvdLe/vL24trjG9T+64GAcn5sjqa5lhm3Y1nVUNzwoEqhJ/OmbuS2Mmu98Y/Bu+8Fx
SSreNqUK52qpRjgEDna5x19O1cOyeUcMoUjqp7e1c1elKnJJmkZxnqiNpSq5A69qVOVyW256
imsQc4I+lMU5f+lYvTQq7sOGFbJNOd2bt+NDD5jkDA96bnA/2D3pONtStNxMkZOAfSlclkyR
ijLNyEwBSMWIPA+mazeuhCkRgoDyR+NSM4K8jgGoNhaU7hjipQQoxjI9TW6tbQrYTcQwxyuO
1L5hQjPHHSolO3PJ9s1JINzhj8oxSd09Rp9xzA4xuyPaoZMsBg/L6VJuCjqc+lRsDjgVjsJ2
6DiQSCGGB6U2QgYwc+ppNgOSpOO9BUgevsaE20JK2rF3HaBu49aYx38BuR1oBOTkY9qYg/ek
8gGrT5WUKfu7ecdj604nACjr3oJxx3HegnIB7+ta3VtAuDvnoc5pQSzANwo9aaxVCTwMdqM5
PzdBWUW2Jiu4c8fKfSjcGXJx7YpMKMgEk+tGzC8ZxRdMVkhZGCrSYIwT2oZfk/vNnpThwp3d
qq6W5V7CSHC/KcmhW4xzzTN/zZAwvuOKkLbUHAzTkktSUrjZXAGO9KCVA7+1AXeclfzqMFie
mcelZtsaViVjyM8UhlCsuDTDl2HzDA6kU1tueMcevehPoOxYbDIWLfhUZwFyKRSSpO04HNNE
mQc8Z6CqXwuxFgZznpx25600qG6ZJ7j0okIwOcU+PaBwwJxzTvpcaVkP8vjg49scUyQBO4+t
PDhjjPHqDTJiCuMfjUqV2kKL1GGLK5HU9hTQDtxyB61KjhRgc/jTGLlT8uPpWv5FirHnncT7
mnjAjIxz6VHCfkzngdqHdsHOFPqKz5t+wuVbiOD/AAnNLsJ5HUd6RSDyOR6U/wCYnaO/OaU3
exTaEBAB3tgDvSFFcnJ47U2UHBGKfGwGMjn6U3NrQi3UHC7Spb5scU1VyvX8KUrvbd3x6UhU
qCacpdxJWFC7RnoO3FMO5Wzjd3p5k+XH86ArHvx61UrWuPzFY71xjaRzwKj8pWzzg9akUsQQ
APf3pOxO3mo2VyRAvyfMNg7Gl3kZAUsPWh8FMEnHakhYfNngY6GjzEk73HgFsihyTHgfKR2p
d4bO04FNGWOScY7VKVnct7aixplOvNIYWHTPPcVJGm456Cl3kSBMdPStHde8HQb1QgjBHf1p
Cu9euz1IFSvtOcnBz0xUMuUiyDkntU3vuBLuAIA+73NMc7uRxjvScpgYyD60iejHHvSS7jv3
JNxdTjkDvTkHyEk4NKSsSEcZNNU5XJIGOg9aIvmTl2E9AWQhgemP1qRmDjOAvuKiYA/X2pxy
oAPpSbvuTa4pbpRkgjtShWONoz9aVsYxgkir6XKuKckH39KQqVC5bHNKwGAVbk9s0FN/IYN7
VDv0CNr6kcjiQ7eoqe14wSckHoarM/lsAFGDxu71YtEKNk8896LcvqNnQ2kvyEjDc0XUrMCM
YHtSWMTSKWA247etE5IfPQdKW6JuVs+YPmyPanKDIPl6U1FD5+bihG8tiOxqLaaFLUnCfN8x
OBwKmjUKMcGofN8zjgU87tvyjOKqDutQab3LUZ3L96rlsrIwbPB96oxKFA5OfSr1qGY8n5f5
VlJK1xpdTYgciS0AG8NIuT6fMK/Rn9mdBH8PNOOPma1iyf8Avuvzns5RFcWSMPlaVBu/4EK/
SH9nGLZ8ONObHDWsWD/33XmV23NJG0Xoz1T1opF6Ute6czCiiigAooooAKKKKACiiigAoooo
AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5L4sBj8PdUCct+
6x/39SutrlPitn/hX+qbW2n91z/21SuPE6xXqVHc/NnS0C287DgtM2f0pblNxHGDTNLkaa0u
Cq4CTMM+vSlcksCxOK3UOUJ76FeRVBxuBJ/SoSgHBI+uaWVtxJXpVWVmHc/Wq8iLaCyBcsBz
7+lRD5QR+VOBJGMfU1FnaWJ59PanG8dyLMY5LNjPPeorhAF96mUgnJ6+tQzISxwTjtTSW7B6
FGQqcduehq1ZL5l3CQASrqfpzVaYZ4K4PbFWNKGLuP58MWGR+NdFNJSJd3qe0aZNK+lhUYhP
m6evNeV/EBtmqxByXkJQcknjmvVNHJOmhcbEyTnNeXePU8zV0lA+UbMH35rvqy5YnKnaRz7B
P4uW9DQBhdoXkc5olBYZx8/tQ4ZBxke9eVzXdjqWoxTtyCPwpz7W7gGk2tnJbmmEE807huIy
EsFU7R60rqccc4706MbgMmlfO7CnbVu72KIFB3j0zUjqAeuB1NOwsbcjdu5GKHIZTx2rNNbM
G2yKRQvzdvWnggqSQM4496jYE8ZyP5U5VyMZzjpSfYQgHPJx9akBBU4IJpki7cA9zwaFG3NX
FLqDfU6j4fsP7TjjnUAKy5dv4hur2TxKVETqPQ/KP92vA7LUHsZYXiYxkOMn1Gc969f8O+P/
AA/OxOtTQyjH3pJmHf0A9K9eg0o6HNVTauZHwxcvbTxHeXV23IwPHCev1q98QGVNFZX/ANTs
Jyeg4evS9F1HwDJDJLosNm8hBZmiZhnGB3HsteX/ABGkSSynypW2MZ+UkkfdbP8AWt5xVrs5
rt6HjsKiC1AJ+fPB74qXIIxu59aaQWiyRk+oojx0wDXiNe82elFqxr+H7ZbzUY0Zfkw2SfXF
e6pp0Wk2yRKqqu0EgDGe39K8Q8LEJqUalsMQxx+Fe/TRpdTRK5+UxjkmvWoR7HNXdjw+Hxdd
XnjN4oryV1QuhhVjjjfj/PtXsK6es7RFxt3rkk9uKv2/w08Hadd/bBNp4vHG5iAAxPOf4vc0
t95ZugEcCIZClTxjmuuTuczd1oeIeL/FOtDWZbaDU5/sCqQ0at/tNx69AOlavwq0+/u9TmvJ
xMIfMBAlJO8YY55PuKyF0eXWPHJQRsbZJCJOMr95+v5V6zEln4W0KaQmOBljyp6ZIXHH6VlG
7bubOSUbFTxLr1vpu63Z4lMrCMxsAcgkAjke9aVk6f2XE8eEjaLjYOOntXh3iLV7nW9aku2u
HEMcxZFzkHBHPb+7mu68JeP7Kwhtk1GQSW8YAdHcjjnPQURqxctCFFtEOgN5/wAStRyH2LtH
3Tjqn+Bru9dYW9hdMT5bAHyzjqdp4/lWx4c8Y/DnVJm+xWli+puACqFxISTgZbb64rL8fXEB
hmMUQhiGfl3E4+X/APXWk9dUTJtaM8OPjjxHf6WiDV7u2B3b18zPHIrZ+Gvh+5l119Vlkmvy
AuHcsRgMM9Sf7o7dq5nwjZS6/fSW8cbOo25Cjpk4r6B0i00/wpozMkcMR2tuJ4B5Ygdx+Vck
HK7TN20olDxZ4gttCSaSRkVzGSqnjbweentXiNx458TzYjXV7lIG4Me4HA789ateMfEVxrl/
ITM7Q7QAueDx9Pc1i28LSOowSScA46msqtZ83LE0pQurs6jwbuvdcSSWSWWXY2GeRi2MdOTX
tniSNbW3mywj2hT9ORXHfDLwgsNsl9fRrGQXUu6gfTvVf4ueMlt3e1srgSOQnzRt16k9vat4
TaXMzCrrPlR5/dfEHW1kuLe21SdbeNyqor/LwcD9MVZ8F+HdV1vxda3lwJrxEjfEkjZCnafU
/wC1+tYukaHLfFBFGXZuXwM5OMk/nivoPw5olv4X01J7hRbDAy7DBAIAx69RTpSlUd2aVLQW
hc8W+KbbQLZ5i0UNz0jkbHA3AHqMdzXzBOBqV/c3MnyiWRm2/Uk5/Wut+I3iiTxHfTRRXDeS
pYDaeMb8gdB6CuSDKcbcYHHFcmJn7yUQowerPWfgxBHDeTGFApG4nHb921bHxPVn8JanICS6
rLx/3zWJ8E5ZI0uSwzIxxk9f9Wc/zNbvxSIi8HamqNmWSGTaM854rshdwdyK2kjwW3fNrGzD
Bx900p2v8xxVay3/AGKPeSWAIbPY5qUBjwPwFePUS5tDpjexIxO3rwO1N80ADoaJCduOhHXn
rTAobt9ayehsmkTErkk4AI60xMZ4Hy96apD9Tn608AqxA4B60noN2LmhMv8AwkFvvxsyu3Pr
uFfUkM0n7iBGIZBnPf7x/wAa+VtKAGvWWPmIdD+G8V9TwPsdZQNzMvb6/wD1q9zC6Qv5HJiI
qx8y+MHj/wCEwujgCbykycckYFZ4Hmv15x0q74zQJ4xmJGC0S4+mP/rVoeFfDb+I7xYIceZh
m5YDgD3I9a46kVOs7mkPgudZ8OPAz6pfxzz2hJCthiM4G0e/vXo/xO+IQ8E6D5dteiGdWRPL
i4YDJBHAP939K021LTfBugFoI40mhVFkdASSflU9j39K+Z/EPiK78XX891eNKsAdtsc+Rnkk
Nggf3j2r0HanBs5JN1ZBY6bq3iS4mkWOW9mkcvuY5Izzjn8a7vS/2Z/E2roJZjLbkjKlggwC
M/8APQV1nwn0C2GgyXnlLvUR4k9CV57+9VPjd4/8VeG4bWPQtVurUNFlmjkHXeAOvtmpp0oV
FzMuVSV+RHGax8CvEHhWJ5buSeeMAv8AdBwB9HNZPgmaw0jxOs2s2iywW8uV84lQMbvb1216
XffHmwurBYbhvtsvlbH8xmYZxzn5CPWvJfGWuQau01zbxJbRgFtsagZ+bPYCsaipxd4msOfV
M+u/C3xF0fU/C0kWnWcFrJHCFjkh75z/ALI9P1rwv47yO2hahM+T5vc+7IM/rW98GSW8KwyM
MhoUJY+nzVz/AMdcnQr0HLR4UqM9Bujrv5vcsjklHlqIm+Aeh26+Go71o1aREBLEc/fcg/pU
v7QPiObSNEsGgupLQSSkeZGSMjZ04/zxVj4Fy7fCCxIN26EMcf7z/wCNekP4S8L+KbIxeJEs
5oohvjS8OAjYIJByO1FKPu6hUbUrs8/+EF5JruiyyTNIY1Q/vJAeTvYd8eh/Ku8bwzpKRi4S
3iNyOs2zkj/IH5Vfk07w3o+nLF4fW1SEk7ltW47+/qTSMMwkDgexropxVtTFyu7nlHxv1y7s
fCohs5ZICykvLEcEArLn39O9Wf2fLu78V+FpJ755LlYxMPtM3chh646A/pXpa+EPDviTT3TW
JLQAhhsucdOndh6mpYdN8OeGtL+yeGRaQ2TbiRZMCpJzu6E+gotzMfO0rI8x+KWsT+DvDT39
hcuJ9yAbG2k5Yg+vpXg11JrHi6+hW8kv7yFzloHEjLkKcHHT0r2H48gp4T8xsmFXjz6feYVr
fDvxp4B07TbeS8tLA3xLgpIC56nBztPauOd1L3TeCfLc9EhbyPDGnRqdhEUWVIxt+THeuN0f
RNM1HxK9+jR3MkavFwp+U5yec+/610vifUW1m0STTIDZwuFK7OQBye4HYiub8D2L6XJOJCfM
Mjk5PJ4HPX2rotoYb7md8etamstChMM7WsTRjMiNtwd6enPp+dQfAe5uNf0C8F9dPdiORFSS
XqF2Dp3r1NPCHhvxRYtH4gNrLAMBYrpsDseu4dwv5VLHoHhbw9ppi8PNZRocbhZtwSMAZwT2
rWzk0VzWR5l8VNRufCHhuS6sLl7a5eMnMRwQcqAe/wDeNeCvqut+JtRsGvL++vkaVC8ILlWG
4HkD8+le2/GeUL4dD3CGaIEEqx6qJEz+lO+Hviz4e6VpllJc6dp63myMgSKXYtsA6lT3rmkv
fUTemrK53WlW8Vn4L0QCPyl+zDcCMFeB1zWRoFwk3ia9MTrIA6D5f90itvWtUXXdIVtNt/Jt
50IgWMYUDgDHArzDRPF8Xwz8XXDawVkSWbOyc43cNkDhv74/St52glYwXvPXc1f2hLE3Phuz
C2k11uaXcsSscDZ7V872OhCE7pbGeFFHy743A+lfXsPx48A6yIrXULWxAbhVlRn5PGP9X71D
4h0zw14itEbTvD9pHBLkx3ES4ByMZxgVhUgqtmXCcqe58x6dq1zoF9Dd2jNFKrDPl8EgEHn8
hX0ho3jd/GujpKLpZr1Ml2QgFlJI6AAdhXzz4v0Wbwzq4jnG2OYhUQgfKQFz3PrWh8PvFE3h
jWHMsrx2jhQFzkH5gSMYPvXDFck7HX/Fhc6P4m+DnguFubKHspcxjsA2R19hXmqybjxya+nf
sC67p5It/NWbKhmGNvUZ5xjH4V86+PNF/wCET8VG0DJ5bxo37t1ZQTx2JHapxFNW5luZUpWl
ymz8KJ2n8eRwmQpsgcnn2/8Ar19La/K8sF3vBWfavXrjctfNPwpRP+E4EmPn8hxn1GBX0t4h
IjS6djkBFy5P+0tdeGm3Gw8S7JHxPaj/AInWqqTh/tMvHp81XVQk7cVBGoPiLVZFGVM8vOOv
z1OJNjnJxXgzk+ZpnXTV4odnsAeR1FexfBH4n6H8ObKWDVYreZZWV/MlbBTCYx91j1xXjZk6
Y4+lDxRTriRN49ME1vRm4SuDXMrM9e8d/ENfiY0Om6VGWjkYJiIHA+cNnO1c8L69q9V8N2n/
AAingiynvMJJZxLKGlwOiJ9e4968y/Z08NWmr2V5f3KxrJZyrsUx/eGwnqMf1rrf2iNTvdP8
BGPT2ktleFg0iDgDdGPT0z+de9TqOS5mebVSg+RdTxf4q+Jz4x8WNdoUKRSyDegHPCjHAH93
FckAdxLMT+NJbyH7FCWbe5QMznqzEZJ/OnDnnOK+dryc5Ns76UbRshMbiSBg+tWLK2eeXbGu
9vSohtXOXAHfNd98LPCUviC/aZYGe2GwmTblcbsE9fY1dCkmy2+RNmv8KvhT4h1LxKl6i3Nv
ExTJVflGHUddwHY/rXvnj6I2NjcQqwDeW4cD02f/AF6o2msf8I4RDZy/Z484Aj49+vXqTVbx
HqElxo17PKzTSFCFLHJPyN/gK+lox5IHlVJyqSPkrTLefV9Ruba2UjkMFUZzwo/rXc6P+zJ4
u8Q25uybm0ByArKq5x7eYP5dq6D4C+E7XVPPunhSa5SRiSy5O0eXx1rvfi18Sdc8MaTE2jXM
kefl/dFVC5DnOCPUCuOnh4zbcjb20opRieR6x8Adc8MW/wDpAm2jGWwD1Ps5rg7u2FpcyQNk
OmMqevIz/Wvq/wANS3nifwlaXmqXct5JLKyuZGOCAWxwDjsK+fvjtZ2el+PFXTrZbSJo4wyK
TydjHJz9B+Vc9ejCEbxKp1JKVmcR8yn2NOOOnXNSuwVBwM461FblZHwSK8dRW56G5f0/Srq+
BW2jLk9GAHHeu30j9m7xbr9ubgPcwKcYyiqGBGcj94K6v4A+FbXUtDvpr2ATXEbx7N+c4Kc9
6634l/EXWvB2hxjTbp4JfLUoqlR/Eo4yD2r2sPh4TjeRyVq7h7qPF9b/AGf/ABN4WRri8uZn
jVS2wqpzj6SH1rD0TwVqmvSzx2yTO0UhiZFjzz788f8A1q+ldMvLrxb4WsL6/mkmknjG9ZH3
dURiOw6t2Fee291/YXxWstMsv9Ftrw7p40/ibMnJPXPHrVyw1NW5UZxrTlo2cWfgB4tkhE0E
dzIz8iNY1+X/AMf/AM4p138D/EOkWZnvVmDqu4qUXj8A/vX0PNqd1pKXDpdyqqAkDeSMVXM0
2vWXnzTPLEy/OWY4weOn4Vp9Wg1qYuvNdT5StdMn1LU7jTrXcbu2bbIgXJHOOhrtNG/Z88Y6
9H5qrPDAw3KxiRQR7fOK9P8AD/g/RF8W6pd21pEk+UDsFPzn15PqP1r0XVNO8VS2VjFopuII
MgMYyqALjjqR704YOEt9huvJo+Zdc+BHiLwxF516s8qjO3KjBwM9nNcHPGUysitC/wDcbIIr
7hv/AATenS45dd1hdgJ3G4kUjHOeN/oK+UfjnpWn6Z4nsxoUsNxbux8wwNkABY+vJ9TWGIw0
Ixbj0NKVVuVmcRksMnt3pjOW5HFPY4+VeAetMb7/AMvIryJI9C6JoYPtQ8sLvc/wdzXovw/0
f4q6IpXQLfU7a0ZWH7hVC9QT19wK81EktuDLGzJIvQg8+lfU3wK8aahq/gwyyTssvmSdQM43
KOuBXfhkrmVVyUdD598W6X4+0kvdeLk1GLTs5Zr3BUkk7f1qnpvhTV/EtqJdFs5rvIyBDHu4
wD/IivYv2oNTutW8Mv5sreUfJCrxj77EHHFcX+zT4nuY9fGiB2A8uR9xGRgKox0/2fWtq1GP
Or/1sc1OcpxZnP8AAnxldRRS2kFyu5cuohXCt1xy3vVTUfg54w0S3828tpy56J5aDI47hj61
9NXOrXmixyRpcuAG5575x71UupLjXETzZXmyP4mOPWuj6rTUbWMXWn3PkwW4muhbniXcEKeh
z0r0PwbpvxRs4J7bwzbalDZzrgG2ChZMKcdfbH51yPxPtk0PxxbrZoII/MLPs7kSHmvpL4Je
Krw+GJPLnz5KxnftXK/u/XHtXHRi4T5WdEpt07nzj4wtPG9hNeHxbHdrCpIl+1FeOg5x7lam
8JeBtV8TX+iXOlWs1xapKjMYkyrLkd8/7Jr079pid9R0WZy+55wpZh3O6LrXnvwx+IeoeFbj
S9Os7hxyi7FxweT6H1NaVElUVxUpOUGfWmneF7vTvDmkWsdo6T+SoeJV+YEgHkfj+tfOPxc+
Emvx+J9Q1hoJVty8jsHVeFwp7tnovpX0Xoniq9ubTT7yS6ka4aJXcM3oB+H5V8wfHf4r+I7v
xlqGnLf3MNotw64WQAMuAMdB616FWNL2N3scseb2mhwumadca9Cy6XC1zP3RBzzkDrXV6V+z
7431uN3fT7yzWMbvmRRv9vvj0r0L4GeFbW10m51BraPzlQcMgOTvcg8+m30712HxT+MereB4
NK+yS7Fe58uYrGn3MZOfkNcFGhDl55HVOrNPlR4Ne/CTxJoCs99aXCjGSrxDgdeuT6Gue0jQ
pvEhZbGOSVw23bGpJzx9PUV9H6v8ZtDu7Xz7yS0vsod6PIO2eMbfT2714Vp+q3SeI7rUPDVj
NHaSlRHBbghQwVATkj1X071NSjT+yFOU3fmNIfAHxbPbm8SwuxEPl8nYDk+v3v6Vz+teE9W8
Nv8A8TC0lhQgHLoBjOccD6V9I/CwfEbWpBFrUd9Bpzq5DsqKAwIxyuD696q/FnwtFb6Jcw35
WW+DRlSxycZ6ZBPvWssJBxIlWnGVrny3d/u7VnUg9D+tfVfwmvGk8AmRCZD8hUE9flj55+tf
IlpcNdaW8TkmQEKT6YxX1x8JY/I8Bqi8hdoyOn3I6wwi5JWOiv8AAeW/tRsyPp20ls25LNn7
p8wcV5RdsqQeaWHyDhu4zXrP7TQEttaoTsZochj1/wBYtePXkTSaeVBOMDJ/KljG3NW7GeG2
1Prb4NTO3gmSViz5MZ+Yk8bFrzH9pB/td7p0aruhKjeBxz5qmvT/AIMLt8ByEfMHMSqP+AJ/
jXlf7Tu/TdU0jyzt3wl2Ud/3grslrh5LyOeo/wB6eTCMCZUC4HQLWrD4S1jUo82NnJJuHylA
D/Wn+HfD914qWIWUby3BI/1aZIOT9PQ19Z/Dj4bS6b4EtZbrTQt4IkJeSMB8hjnvXmYeh7Vn
dUqckT461vR9W8L+TDqtnJaSznCNIAM8A549mFfQPwV8LW8eg2+pzRLuaOMh2H3jljnr7frW
d+0B8L9f8QXlndWlvKsETnG5FA+4vQsR/dPSuw+G8c1h4JsNOnUx3FvGiPngkjcD/nNehCjy
VrHK6vPTucP+0b8TfEHhi40+LTtRurWFZ8uYpcBhsU4PHTk12vhfVY/FmgQahGd5DESe/wAz
Adh/cq74v+CsfxElsLi6Rfs8dwrymQAgp0P8Y7Cuo1HwxpXhayjs9I+zpbgksLdQoPUjOCf7
zV2Wbn5HM2uSx87fF/4bXq+KVn0rT5JbeRY0Uwr8u7nPf2rz2/8ADWq+HnMesW8llOP4ZVAP
IyOlfUt14x0+3u0027MBvCA0QlxuGTgYyPXPesvxZ8PX+JCmNYBJeMBicKCSQCo7j+8Pyrlq
4ZTdzojVnFHz1H4R1u+ZTZaVLc8/KqAZPHNddD8VfFvwwsxpUujT6S5O8hmTf83PXYTzt9a+
hhDovww8KSPfWdompo/yibAcBmHru7Zr5d1nxW3xD8dfaL+XfaCMKC6/LwnXoO5Irn9hGj7x
rGq6jsSeGvirrvivx7aLqWsXTwLHIVieUlchWweAOxNfSGtWcYnclASxyVYZ5yayPAHw/wDh
tZhbiYaW92FOJv4uQM9G+v51F8T9SvJNOuBo28XW5QkiHHG/k5PHSu+jdp3MarV7JG34dmub
ONI7DKE/88yAOleBfH/XdSi8QBI9bvNNZTKGCO4DfvOvBA9a9q+Gnjfw7HpTJq+qQWt8m1T5
rEEEL8365rpdS8G/DbxvKJp/7J1GUZy7ybic8/3vxrdS9xpGWsJbHxVZaldXm8vrNzegHkPK
/wDImp2kJbH3s+9eyfET4XaPYw3D6BYxRbUcgwRlec8dTzxXjKgx6iLJxi6B27Mck5I/oa+c
xFCXNdnfTmpbF/TdOe9uFiRcliAOK7rSPhhdyrHLLayNE4DGRkwoH1zit74T+BTdXNlPdW25
A4Zyy9stx19K7D4u+NrDwvYR6Rprxw3Mg8lVjOCDlMjof7x7120MOpK8ialRxajEvfDXwbba
LMGniQrsyjYzzuyMEE1yPxJ+MeraD41h0mO7njshcmAqs+AEyg6Y6AE133g2eaTwxpNxIzGS
SJSWbqT3rH8UfAn/AITDxDZ6xNCERpvMaQuMPkr/ALY/u+lelGKVPQ5NOe8i8lgNW06J12yx
TblzwR1I/wAa8T8ceBru0u40sbFpHJOUUYAGB6nHevpK90m30G2htLZlMcO4/KfX5vU+tYsu
raLqLNbm3g+3xDdub7x/T/d/SipTjOF2SptSvE+VbuzntJFt7iBrSdiMROfm56U7+w9VkYpD
pszjtKBxXvuv/CoeMtXF5b2gE6hcbFxjb7bgOpHau4t4PC/gXwhNPrGn2f21BI224HzHgkHo
cD5a89YOC1Ov27sl1PG/gZ4WspdRa18Q38NjdoJGIuQN23C4ONw9f0r6l8R6lpOmeDY7HSZY
m2yAo8SkMcsSeevr3r4RXxdd+J/Hx1aykksrWVPLRIuBwmDxgdwT0r6s0tZG8Oae0ztKzsxJ
Y/7T/wCFdGGnFTcTGvFyipM+X/i+Z4/FiTKzJMFKhu+d0mf616RP+0/f6PoEVnaSN9sTYCY1
GWAGDz5Xt61wfxWA/wCEsZ5vubmxnsd0lctDbLPKMRBm5+YiuTEVpQqPlN6UVOOp6p8H/in4
x8deJb19Zv72O23AJDJKMAYkbsB7flXsXihpLpHhUuU6beTn5v8A61ea/CTwdcW8f2lYSjkg
s23HJQ+/uav/ABp8fLoOpWdpYXIWWaNi5ifBUhvp9a9GjUlKN2YVXdpI1fhf4Nt/DUVxdNCi
XG7zgWXknYfc96wPFfx51XTviBY+HhcOunXG5JmDgKvzMoH3M/wjoRXoejrJLpsC4Ks6D5j/
ABZUVymrfAG48Q+MbHWntR5ce4ldyjzPvMD98f3vSqio8r7kJ3l7xqXukNrGnhtvnx3UJZJG
GRyucjJr5v8AGunJo3iW6ssDcZXB56YwfU+tfWs1o2kWcFi6eX9nQRquenAr5T+KpP8Awn92
SRkTvgHv8orlxUb0m+xpTlaehzQZFLZAJHFRzbn2si49xUpQbssNoNJLwo2N+Ar52yueomkh
juWB+bBpWYbcDnr2pEj3KCT+YpzFVbaFxUy3E2hpkI7n6UsgKoSeD2qNgxfC/dpTKGxvNRa2
poldAGJIDDBxRjI70SYVs7s05JOvFVzp6kXY1YwevX0okfK8rj3pV+9k0x2LZGcihT5tWTvu
OXkbjwKC67gOxpN2YyM01mD44xxVO3UVnew5CArAjbjp71GZCD70rcfxU3G7I79jUPTYtD1K
OCWGD603aA3TjNIc5wBgjrS4ZsjNXdW1EEnHOB7UuQyLkAHvSYDYDHaRQ+EPHNTa41ZlcnL8
jNWGcADKjJ9qjILD5V6d6SRiWHY1pJq1gtceAM4HpnpTx80ZOcGo921sZ57+4pwA2k7uPrio
jugIstn5Tn2zUyHenPHqTUWAB8tTp5fknOAM+tJ6ol2ZG20Lt46+tKhRiAaHUbN3Un0pHIBB
GOB2p7JoaWuo5nAbg8egpnIPPy+tNGGHXmmtubPNHInuPVC4w/TH0pHGQeOaQbgc8n2p6KNx
JbHsaEk9wUtRvmFU2jOSKF+6QQM+vFK23eBkZ70hADdetVZRQN62BgrDHGfX1pNqg8Hn0pGz
xjn3pu1skgZNOLE9h4Hl+/vTmIGf4vWhXV42yMH3pA6yDgAetZNXbsKK7jgEHzZwKfujkTAY
KfWoGYZI6jFCJ0I6etNxstRvUcw2KePmoUqV+bn60rkc5OaihOXw3yiocboF2HBDgn7mPwqy
AA24jFRYJX5skUSuYyPmyKI2b1IvfRibgzc8AU1lZmyo4HU0IVck5wPrShnTJz8vpW0oJGkh
0jhBkc/1ppkBGcjPXFNI3c0RAEtkZx61PurQTFXY6nJG7+VAcqTnoOnvT2VdhwBk1C7n7uMG
nzJ+gluG9izYOAaVXKgjv3zTUyWAAPHWnOQrDPzZ7UtGrluLWpI/G0gZB4pMIpIUbjSHe5A+
7jmmF+uzr7UnsT0uSgKg3YwKUsAcjGPWmrEWXljjuDQke5SPTpzRLbQS8wjlJODkVK3XIPI7
iqylkkwefUYqVWy2B09KS2KtpcVycZzz64ppI8zazYXGcmpCedv3jjOM1HKgUcrnPQ0KaejM
0PiYHPIY5wKEIY4bj1phAiXphqV+mRwTzirWqNE0ydAsqljjA4p0gjRQAMk1DE21SM4BOaeQ
uNxb6Vm1YTshjSBeQOaeZA6dMH1prLuUkfnRggA8balN2dwVuUkSTaDg80hlJH3eR39qahAJ
ON3rz0p8bgEk9DV2utCb8rHjZjjH0zSkoq5Uc98UzajSZXjHvQxC9R14q72SSKvfUjmZeg/A
1NZbsjcd3NVJOWAB4q3Gu1gVO1aiVpLcp6o6CCUrHlWwfam3bhoSQeaS1KfdI4680t8FKfLw
o/iHSl9kyWr1IYduzlufT0omTdyPlPrUasuMjg1LksvJ49qSldam1tSeMAHBxUyL833hx29a
qREZ5OSOmamDjIydp9KxildoHGxaRVLfex71ftGCnG7IzzWdG44GOetXoDnoAPpSnpsC0dja
sgs15ZqcALMh/DcCa/Sj9npdvwy0nH3fsiYPry1fm3pEQ/tDTR94vMox6/MBX6V/AMBPhppM
Y42WqDb6ctXm1VaojdfCz0Vfu0tIv3aWvdOQKKKKACiiigAooooAKKOtLj8KAEorF1Lxt4e0
b/j91zT7Y4ztkuUDdcdM5rAvfjl4D08DzfEloc/88g8n/oKmna47Hc5ozXlV3+0n4MhP7m/j
uB67JV/nHVI/tP8AhXPDofxk/wDjdQ3Z2YWPYs0ZryGP9pnwq5GZUX6mT/43Wzpfx+8FagQJ
NYt7Zz2cP79yoqedD5Wei0VzVp8TfCd86rD4gsHZugMwH863LfUrO8wbe8gnzyPLkVs/kaan
F9RWLNFGDRViCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5H4tED4e6pklc+VyP+uqV11c
j8WVD/D/AFIH1i/9GLXHipcsU/MpH5t6LIHtLlVQqBOwPueKJ84OM/hSaIf9FuCPlBnb+QqS
ZuSehro0loKSsyiSqAgLj61C+w44yfappl+Y5PJ71WcFBnPSm1pqZXuMdcHg8+lQS5UHpmp3
45H3jVeXIDep70oq2wKVxrgBNwPJ6gVC0hIPUYHWpE6HK9BTXK7Se/NTJtuzL6FOb5Nu4H6+
tT2LrHcw4UFmdRk9uaqzsQignPPWrliEF1bs3TePw5rtpLVGcnoey6cu3T4w/ByeOg6mvMPH
WY9cKZxHsXA7Z/xr2Tw7ob6rp67Z4CQx5Zjnr7D3rmfHvwouWJma9tI9mG3lmzwDx0r0a7i4
6bnGpWkeQltnPOaY7mZeD+FWru38iUoXRsfxKeDVaQhCdowfUV5ClrodadyIMykh+lKjYPPI
xROpKZB/CkVHIzlR+NNtpaltjiwJyoxjsKAOfm5pUIU9vemrgMMnP1NCbsTe+wdBzyQOKb5g
wflI9aHb5gMcetNLAZ7jvQkrXYWsKMkZGCD0HpSfNuHb6U5MiPcOlHJXd0qJSXQp2GvKeBjo
e9KvJ5703jd0yadsOcA5z+lNWaIWorOSeecdvSnhY3XLINq8nHcVGkLtIAPmLEAmvSvDHwRv
vEWyRdUtVhP3kwxJG7BHH0Nd1JN2URSaSNH4YW0EllK0ahQEkxtPfI9Km+IrxL4dfzGUNsYY
yMn5Xrs5PC+m+BdKliivbYSqrMUUhWIIJ7tnsK8K8a+IbjXNVCxuyWSov7tmyCec/wA67ZyU
I2ZyX5noYkaMItuCSP8AGoY7uKWVUVTHIf4W4NdP4R0yHVNXht7hkijYMWmk+6MA8dq9x1f4
f/D3RUZymnTzoBiVHGTk+m/0rhjT9o2zeTcEeD+GVj/t2NXID+W2CT0r3S5ukhKYbIVANwxz
Xzssz2XiKe5jLNbq7qijg4ycfpXsnhXV49fSO1mlSGXbnzJXAHAHFdlGb2RFSLmlI4BfEusT
+ORHc3FxFbjeqxtwCB5mD0Ht+VeykB4o8E/cHJq3F8I9MkmXULu9sVkUYWTGQAfckf3v1rj/
ABT4yttHvlsLQ+e3zATxuu35Tjjr6frXbzc25zt3VkaNjoltpk1xcbFDuxkZwPqf6mvN/ir4
5lnmgsrVJGt4lIlMbA5+Yeg77fWvctI8OjXLAs19aReYm3a8nJyv/wBesrTP2drH+1ru91DV
bSa3lIYROrMAMsT1bH8Q/KsppyXujT5XdnzbZXy3udkci/7LCpZz1DYCjrn0r3/4jeB/BfhT
w5fSWH2B9QghZh5DAMWwDgDeeeT2rzHwd8NLrx5FFci5gtreRvmWQsDtJIxwP9muF0OXrqdE
anUm+FFvbDVzMI4tx2FXVRnO/wBa9B8YuJNPvEdwrENtLcfwmtnw78NdF+H1p593fWrMsZ2q
xxlh83BZq8n+IHjA6v4nTT7B3SBLrMkisCjJwMDHsT+VejG8I+8YyftZabHS/DbwePD0SzSx
J58pCs208/Mcdaw/iv46TT2/s2KRxuJysbLlRsHPr/FXsnhzSbbVNOhC6rZJIh3cyDI+Y9qy
ZP2dNN1DXpdS1LVrO4hKgBJELY+7nkv6LS5OaNok3s9eh8yQ3bXrBlt51ToGZeK6rwfbw3uo
pC6iTa45PI6r/jXvniTwf8PfCekXEQg0+9n2sUNvIoIJUkcb/UfrXz78L5AniYpO3lxF1wzH
gcx+v41xKmoPU6YVG0e660BpejXENt8mwqw2+7D/ABr5zvb9tX124Du7MAANxyANoP8AU19F
+LLnTINKuIhqcE07lf3iOpGMj/a9q+ctPtsaxJLxsIxk9/lFb1r8tiIfE2ezfDrwdHaxpdXA
Rk24AIPJKr61lfE/4gTafC1q0r5LhQoZQOC3/wATXpfgu3sdT023jTUraAhQTG7qD90e/vVX
Vf2etJ8Sa0moXut2zW6ZJiJYgk7uf9YB/FW0Yvk93czk/evI+X4bjzIQF8ydgAGKjJJ9etWI
4gB3Gea+ptU8DfDnwtblkttLuJAB8qSKCecdN59a+bUtk1TxLNb24S0tmkcJ5jfKANxHP0Ar
z50OT5m0KjZ33wXRj5oY5ZSefX92a2PiZltBuQTkssgHt92uv+FPwxs/Dmn3c9/rdmCwDAlv
VCO7D1rlvjQbDT9FuobTUoL2Z45PL8h1OCSBzgnmux2VNoyqNOZ4I4EWFHTuR+tG4feB6UIj
LboJPmk25Y+/WkwNp4xXiSTUrnctRThhu49/elUdT0zQIzt9B704kKBkE/So5tSm7ajHj2hc
EUvzhyx5XuKX7xwOn8qTftJB5x1qk073BO6si1o6lfENmyjILIMj/fFfUsDrbRxF1JJU/L3H
Jr5e0LI1q1YuqoHU8/7wr6106LSdVginj1W03MpUxtIu4fMe276V7OHSUTkrJpWPkvxgXbxv
MWBK+SoXPbgf/Xq5oOqTaRepNbO0bnIJV9vGP/rCvQviN8MtL0uabUItZtZ7nCL5ZkOcdOPn
P16V5JBOwOR8p9DXPV92pzFQleNj6EsL+38S6fGdoZdo3q2DuIAOePcivJ/il4XOjO97aqPs
ysAYY1IGCzYP8qteAvFz6VqCxSl5Ydrfu9wA6DH8q9W1nRdH1Cyzf39jJFKqv5TSKTycjIyK
6+aNRamM4um7lb4RE/8ACETneG3+U230+Va4r9oe7jsoLLLhWNvzlsfxitT4e67DpYuNJ+0b
Ykk2rIWAUqowO/8As/rXd+I/g5ovxEtkfUNbs3ZBtUhtwAJB7OPSrTUo8pDvzczPlb7UkbrC
llNMzDG+OLOTVm7iP2Fw8RjLJwrrgj8K+nPEukfDv4e6P5qWOnavfJCWHkshO4ADoWODnJ6V
4PFpv/CzvFs4hkh0GzMmxYnOBgs5BGMdsD8q4pUfZnZGpzdND1r4LAjwhGGH3YUGOx+9XNfH
2TZoNyqdSFAA92j4r2n4Z/D/AETwx4Y+y3XiC0acxKoLMByN3rJ7iud+JPw40LWbG4DeILNz
gld7jHBUj/lp7CvUpx9yxxVJrnOL+BM0cHg4ByBOYBgHr95//rVS+POo6qvh6y/sSWe3lR2N
yYM5K7O+AcfpXN6Jrf8AwhPir+z1uPtdlGVjBgYbDyp6+nJr2/RvD2keM7ES3WoWcMdwmTDI
yswB4IPzDFRGdkOcW7TOH+D0txe6G1xPNK/yHiRiw++3qfavS/NgFquJ1LHPy7hnv71W1KXw
l8P9FmNlJaXIKsiwW8iDBwzZ+8e/86+dtC+JGrw+MJLi8nnl0yXy0jg3Dap+XJ6Y7N+dWqyj
HXcjldRnf/GK+1NdKc6Ldy2hVMu0fXG189M+1SfACd5/DLRXdxNeS/vT5k7ludwA6k4rutK0
DRfFlm0lxf2lvBIGUxTMpb0ORuHvVjU4PB3w80MjT7iyMo3HZbSqucgnn5z6D9K1u5K/QNI6
Lc8s+Pl1Fb6ELdx5sbNHmNcHncx6fhXkkKR2s1tItu8SbiAZEx/C3rXrXw98X6D4812aHxPp
4ljcM8Yu3BVAqrjOSOc7vzr03Ufg74V8TW+YrrT7GPOUWM7sEdSCHHqa53FVHubRcqerRPFG
F8N2D4A/dxj5R/sVgadeQC/ljLr5uWOMjOM+ldT4mudH8G+HFRtUt7+SFkQQpIobGNv94njF
fMtl4/u4/GZv5GmWxJkTaWAGDuI9sdKuVRQVjGMXJnqPxj1LUV0aCHRpZ4JQn7x4Cc7ty+n0
NM/Z1vX1jQ71717iaSKVUDXDsQfk56mu+0jQtI8WWv2mTULSCJzny5WUlcgNj73uKdqEHhH4
ZaPLFY3tkrvhtts6LkghTn5+uKtNzY7Wujzv4+OH0I21rG00nl7SsS7uS6jt9K8Y0aylinsW
urWSFI3j3NMhUYyPWvWPh94zsvEviHUrfxDB9phacLbNMyhUUl+T0z0XnnpXqGofCbw74psW
8i9srGMgEsnzdw3UOMdKx5faTv2Lg/ZrYPD7xv4M0l4lXCRgqwxz83avAPjpp8+qeKIZYkZ2
WRjsUEngR9h9K+g9bGj+BPCkNpDq1vetZwlBFFIuSRjr8xPfP4V5H4L8ZaN4g8Xaj/bVgLof
aAkEkjjEY+cE9uMBfyrWpouVGau58x5Tpdm0V7bm5gaJVkU7pkxznsTX1P4PKp4R0eTaHjZQ
PwyanvvhR4T8X2VvJbTWNkVIlYodxPHA4cYqfWm0TwD4btrVdVt7xoAUWGORQRgEjI3k1EKL
j77LqVHJcp84fGy6X+3rVZCWyx2knvtStb4X/D6bXtUWW8aOS3UA7JEJH3wD/Kucul/4WN49
jS8lWxs0KMGn+7z5YOMY9D3r6ggtfC3w10GRvt1pf3e1gvkuikkbmH8Z9h0rnjFOo5Gi5qdO
3U5/4h+LbLwJpssEKhJnjO1Yyq4yrdM98ivlq4vLzWbt7zUZDNKwAAc7toH4D3P410XjrxLf
eK9beae4lMaBAEc5HA6/qawGAVo1PRmC8D1rlxNfml7OPQ3pU3D3mdj8JDt8bKD8wELgZ/3Q
a+j/ABL8tleF/mjKr/6EtcF8EPg5aW2sxajqGs2sYYSDDseBtAA5YDqK9O+KkugaJYXccGs2
s8j+XhEdMryD/fPp+tdmG0Ry4h82h8OWrE6tqRBIAuJR/wCPVdeMHLEjr61QtYpY77UA4IDX
EjK5GMjPFWn3Y68DtXiz+NnoQ92KQ5xtPY0sW5QSSc02MF1J/nT0bcDx+ZqIt8xXNY774b/G
W0+FmnahYTaZNf3F4A6OhUKnylf4s1T8b/G3UfiFZHSnsHt7FkdfMdUwnQ9Qg/ujvXe/ATwd
4S1/RtQn8UQWE91GyeS90wUhdhJ6sO9XvjxY+AtH8IC28PabZLqBhcCaxZSd2UAJ2sT6/ma9
pSfs3Y4KlnM+fBEIbVY1bdtGMikRjjk5wOlNsg6WiBzl9vOetPVeWJ4rw3e53QaSHIon3KRw
RX0F+zymND1ELgCO3P6O/wDhXz/GcHjjPAr1f4JeMk0RL7T51O64TyxIXCgZdsHnt81ehhGk
7yIqvmi0enas53Qc5YyAGr+uW7JohJbHDEj8DV+Lw3ZyxLNd6vZRgHI/eA8j6kelR+Ibe1Fu
PM1ezMD5UFJge31+vevoFK68jyNU9Dzv9nCYW9hfyHIIaT+UdQ/GyNo9KgCHG5gSPbElQeEN
S0/wb4gutAtLpLhHXzPtSMojw2wEZ3HkV6Xqnwoh8f6aguNZt40UkB42L4xn0Zf7xrKm+ZWN
ZdGR/D4hPA9ko+aMTyAfm1eBfHkef4/XJGPLjIP/AABq+l9SXQ/hx4XW2a9gu5Ek3Lbxuqt8
xPOCxPrXyX421eTxR4lk1BgwVFVFVuvC9eP941z4pqNOzLprmnzGDLJ+724xzSmNYQXXGcdQ
aieaFfvSxg46FxUwuLZ02+bH/wB9ivnXC+x6btHVH0X+zszReH9R89g0m6LDDp901hfHB3lt
LMNkbYyB7jctUPgf40h0iwurK4ImZ2T94JAAAEP+Feq678Jl+IenKZtXtrfCgRlSWwCQ3Yr6
V9Hh2uSx59eL5rsi8G4TwTYkDAjVQP8Av3H/APWrzS5Ut8ctELj77H/0KSvYdastL8D+CHs5
NVtpLq2iyqo6hnIVV6Fs9V968A8C+JP+Eq+NWnS3T+RDb3XkrJIRt25kwc8VpJxja5jTXM7n
uHiaFoobxc/KVOPYYpmiyeToYi6h4x0/OrPjS802CO/X+07d8BgqrIpPT/eqDQxZL4diuZdR
tgnlgkeYN3p0zWykrqxlyvcy/DzeRrGpN6ODn15NZn7QnxN8Q+DPB+mXOiahPZu7sjeXJjgR
kjsfSorDxPp6eJNStI5vMZpFCuGXbj8/cV1HiX4PJ8VNHsYb3VLe3tY/3qDl85GCCAV/mavn
Vmlua8ttZI+XNT+M/jzXokt5dfv7qMnmNJN3XjoBWdPLdSMpupJWmOf9cSSPz/Cvra8+E/w2
+HmjtJdQ6be3qKzYRgr5ALDgyfSvmDxrq1lq+vLJptiLC3QHcu7cGyE/wP514+KjUjFubOyn
NOVoowv+WZI6+9NjZiM9Ke+0ch1C+hNNMsS9ZEU+m6vHlzM6dEx0mfJfB+b9etfQ/wCz2N/g
spjad0p3D/fXivn6GPzWBQq+ePrX11+z98Pvs3hxRNfWgUtLmIMd33hzivQwmkrmVWXuHmP7
Ryef4VECNsceTg/Rmrgf2cir+LUCqBd+XLmTuRtGf1r2z46+CrTVtPngj1mxR1ZACZOmHPoa
8U/ZtTZ8QVgYrHJ5Uw86Q4ThR3/CvSxFudW/rY5qD91o9+8RsWimbknd/wCzCrvh9Vls42PG
FHP4VB4xfTLEXA/tezLBjlVlXru+taGiW9ra6ZDJc6naQxMBgtKBn5R6keorq5l9o5mtD5M+
M7vN4/t443KoQ5+vzt/hXvfwGdW8GagirhgsSs3c/JXhXxXg/tb4j2SWDB0LMqunI5kb0z2/
nX1T8Avh+1v4YkW4ubaJ7hI8RkkHPl8kg49f0rj09q2dTtGjZnkXx+3LokuW2/J8gPY5jrx3
ws6xalozBQ1w0yBnB5+8B/KvpH49eBrW707VIZNYtFlt1fYm/HI2nHX/AGRXzNpiNpOrWMhP
mrbzrvZehAYc1z4uymmLDu8ZJH2RoMRh0jTnY5MlsNvtwtfKHxoXzviHqMShnlNywwgyQTtx
X0/4I1uHxXp2kLayJEY4kVleQcdFzx9P1qXx54E8D+Ho7nWtSh02/wBTdWlZQyiQuF3d268A
dK9BpVKfKzG7hUOa+Dyvb+GryOfHmBQR+clch+0+wstI0pxgPJcspH/AK2fhT8QrDxXbzWcV
oumSgD5mlX5yWYAdB612Hjn4I3XxPi0v7VqVrbxWlyJ2V9zF16FcDGM4pRV4uCKm2p8zPkUy
hZmAiuJgR91SWX8s19H/AAZ8I2knh9rmSOLehkK7k7ggius1b4U+CfAOky3eox6feSorOIgA
khABIwC/P3SPxrkvhT8R9N8QaS1tp9ulhH5jxgtKuGJ2/wDxX6VzQo+zkmzeVSVSOh6SfGep
wXK2kU5ihC7h5eE5/AVznxKd7jw/dXVw5lmDxje3JPIrpbXwjNPJ57XVsvGMO5B/lWR4w0Ca
7tpbGa6t4opNreY7nYpB9ce3616D2OJ76nxdpu5LC5nb/nocKPfbX1/8HuPACs/zIdmV752R
18q3GitZeJpNGE0Tx7n+aNiUbaWGf/Ha+4fhZ8PJYPBhtDd2il9rKQxyBtj7Y9q8vDr947Hb
WleB86ftPjZrFgmQ0LQudo6AeZwK8lvHEGnNuPBA/mK+iv2gfAP2+4gk/tSx3W8bIQ8nJPmC
vne3tH1y/itFwivn5ZOhwCf6Vni1eaDD2tqfVnwYdk+HsXXdui5/4BHXmf7T6x/2vou796Wt
yev3f3gr3r4U+A57Xwdsa4to8lcIzEcBF56f5xXlH7RPgG4ZJNSfULWVbKByI1YlsB+grpdp
UZJb2OaTvVueL+EfFlz4T1S2ls2aMM65xjHcc5B/vGvrvwH4x1LX/DEFzPdyeXFGrMoYBcEn
0AHavia3lBVS6+hB9MV01t8S/Eml2I03T9SmtbZl25SQYwOeRj3PeuHD1nSdmd1SHPGyPU/2
lfivqsElhp9lqMkEIl/5YuqnAjUYyBn+I967D4aSHUvAenXbzF53hjaSV23EnDZyfWvl/V7y
61795qVy1/cKSweQ52n2/IflXr3wV8YmCxXQ7qYqrIqxu7gInzEDr0ADj8q64Yjmq3Zl7Hlp
8vUs/HP4p+JvCyWtppOoz2sMkpXfFLjjYDj7p7se/avUPBV7LrfhpLi7dmkyd0j85+Zx/Ifp
UOo/BS18fWoW9ktn2HeshDNg4I7EVf8AEstj8KvCbtPPb3K7XCwQuFYEKzZwT7/rXdyyfvrY
5Xbl5FueB/GS+nXxzbz2LskqxxbFjPOQSQOPevpjwBHdt4atr6aPyLze+RGSeAxxzgenpXjv
wv8Ah5J8Rbn+3tTmhWPd8j3IJVAhUcHgddx/Ouo+InxtsvhpqUeiWzJdJlP3sEsezD5JxnPI
optSbbNXflUEcH+07e+J9Vme6sJWFn+5Dwrkt/F6Ie+O9eGWWswfZhPBuj6jIAz1+tfW01hD
4jtopZglxazDJ3cgEEjGR34rP034E+E2lMcMenlef3IjyB/49WeIp+1SaClJQPCfhpr8l/4t
htGu5mTyXcq0pxkD0zX1DrtnBBYTfukeTC4+UH+IVyy/sxpZeJ4dU0W5srNFVlZAjgkENx3H
dfyroPibqVv4Q0l769uInWMojW8Uo8xssRnBxxn+VFGDh8RNSaqtWPkLUbiSXVtUIupIStzI
uPNIH3j2zXRfCS/1JddnMuq3LRAjbC0zEEbXweT/AJxXr/g74c+D/GlqdUhW2VZz5r27qGfc
y7ucP7/oa3h+zU9r4gi1HSbq0tLbac2+HH97HqOA36Vz255No2VZQ91o3PFNvbw6DfSpEocw
nAA6Z7/r+lfOXgzwdJ4h+IN9I4EoS6PzMpO0FpPSvor4rTw+EbApc3EErSRACCGQZbLBehx3
P6VhfDyHw3oGm3esSyRC6m/0kxllD/czt5f/AGj2raolojljJqTaN/W7vTvhl8PpZwEW/W33
RsuASwI/vH/a9K+Ute1u98V+NrPUbm5keGa7V1jduFBK56cc47V2Pxe+Ik/izVLi0t5ZFsEd
kEZYMu35eOP92vOWZo41ePPmwkOmOxBzx+VcmIrcr9mmdVKD+KR9heGrcN4Q0TawjTy8Z9Oe
a8q+JXxz1vw34rttDtXuBaw3GwOswVW+70+U/wB4963PhF42Pi3wtBpzS/Z7qzi+YSyAEkMy
ngc8nBFdLqXwFh8eS2d8wtUuIZ1mkkmVtzjPIyOvQV3U5c1OyMprlneR0GmzHUtKtbqclmfd
u3nJOGI/kK8A8R69eWHj2EWzyk+YitHGfvgiM4Ne3fETUYPhj4dCz3EU7OXjjSFwCDtLd64f
4TfCy+1++n1XWnjmk2q6NNG2VKtj0A/hH5VpK6jYhWu5dD2jwzbzQ6NDfhNkr7twXPADHvj/
AGRXzP8AHnUfFGpa2W83ytKKxh4FYnja27PyDjr3r2DXPjXbeFtUTwq6gyMqss8Tx7fnJGOR
nqc1DqHhSDxBFcR3SRXJliZY5GJIDYwD9Bk0SkuTl6iV1Lm6Hy94f8q1122toUAGGYBen3TX
1/oMTS+GtPTOfnfr1HzPXzho/wAKtW034gLZ7HukjjLCdInZeUzjOPevrWw8Aapp2g2RMyGQ
MxICtwMsOmK8vD0+SRviKilCJ8cfFeVrjxlLCG6FmA/4HIKk+GunL4i1U2+1XYbwFPPQD0rs
vil8GNbPiafWY7qNYAWTyPJYscu5znHuPyrm/wBm9vtPxEaAAlgk5weh4FGIj+9VjSi/caR9
DHyvCPh24MSDfEVDFPXKqetfJR8QzeMPHhGoO2UeVI0lbPy/OfavrPxzZTHRrwBhENwLAkjn
evWvjP7PLZ67LqSHcyyyBVQc4OR/7NW1aXJFKJlQTcnc+zbDzINOsS3BSJW9MgKP8K848U/H
LXLfx9puj2bTW9uhZH/eBQRuYdl9Frb8I+LT4u0GHZIYp4UWMIWG5gVHGB3GDVz/AIUh/wAJ
Hq1rrIWNJ4D8zSK4LZ57cdz19a6oTUoLuRKKjL3jpJLqTUNNsb2WQvLcRhmycknAH418s/FU
NJ4/uMDb5U8hY+vyivpD4k6rB4C8MLbvKjXcEBVRC4BQ4X15H3q+W9X1CTXb+e+mcmWR2YFz
k4Pr+GKwxVRRp27lU4Nu62M+Vw5IJ6dOaYvB5/Dmn7ACc8n+VRkjeRnOK+cck9j0RMkseSAP
WlWbfncu3HrQCHyvQ+tI67VJzn6VHxPUvRiCcDJ7mgAFfu596AI1QEjOelKH+XjgGqv9kNti
Nn2tnZn2p3mdWxj2p52ouWAOKYzr5eAMnP51NkKzAzDg9KjDZfOQ30NPKrwCAfpSuqxglRj3
pWsrMLtIUDKluKjPJ4O38abuO4Akjj8KmWP5SeD3+lVYbZEmXzkdKAuM8/jSSS7FGBjPXNKr
7u3aps2D2Gtlc4JP401GYEsT+Bp5IwQRzTTycY4FU0hq9tRxBcZzz9aa6nbnOfxpPmLHacCn
HIXOM1MnrYnmFQ8daayk9B+JppJPIOKkYFEzyc0uW6uVe2o1eRnqfWmFTjGcU9QVIwcDrSsR
zxTtbYjVsaGwSD8vvSODs54poXcfmJI9KkKFz97HsatuNtR7ApKx9foKjQ8leppMnocil2lW
DqcVTakhsCSDjI/wpFk42k/jSnLAngmgxBVHHUdalSSDXYdnBA9aZJ8rZzyB69aeRg5446c0
1tvcbifShtRZCAbSpPVj+lGQfY01lYDcvA70KN2Dn8KNJLUq3YdyeBxSIWZyq9uuaceMHp70
1nABI+Vs8kd6EuiB9xzIVGc9aRAFB78dMUrkvH1qLDL3yKbVrglcfGc5zgU/yyBw3HcVErbR
nrTwGZCQcGoWrB36jcEtjPNOMYC7uv0pApK7j8retSuQE54PpVtW0ZLIAxCn5j9DT2XzF64/
GkJC9VyaVdw5bms3eTsUkyNDuyoH406TOCAwz7UE+UD8vHWo1YIM8sx/SnHmb1LvFkmTtA74
601ZNjdM461IMKnQ5PJJpAgdiBwPeqaa1QtWIZOhDDHpTjtfB7jvQ0YAwoBPrTlQcZwCOo9a
mK0uxOz9RGYbcAbTjr61EwwBk5PXmpXAPU4z0GelIqhmxjPvVxWlh62I45WJ7knue1PChXJH
8qcqBG5HXj6UjEo3UY9hUtWehncR5SDgZPfimhznCsQPanrES5OQOO9IyjOV2qOlNySZfKOj
O85PHHWhuHBXgCm4ZIznkelSKytFnv71mm7kt20G/flyCVp8uCBk8fWmRqd3XinMvmIRkZFV
y3uyk7bBGpfIbnPc9qazAEDB9ye9SBzGBzx34pGZWbJ6VSgrEpq4vl8nLAj2phUgHnIp4GF6
8nnNG0ld2R7029A33BT8gFBkbI4wo7U1mK8inL865NQHLbVDjgKD0J7U8AFAMe5pgQS5U8YG
QaRUy2PM6e9HMo6Iu19yVU8sk9c+lKyEoSeQOeKdxn0Hqaj8zyyQTuU+lLmfQh36FZ5FIIAI
NTwyMQuQSajlRTggfnVi2GQD71MophdJG9bMJIQwAH+1SXUmbbgcZotBstymd3PUVHcqfLwM
4qlF2C8UV1DEYAxU0OQCCT9DTEYtgDhhUsgJGBwT3qJO2iK3HEhRkDJpyfP8xBX60wZyQSMG
p9yEc8j2otce2iJ45Ex05H61esTvJ/hGe9UECKy5Gcdfer9q4J4XAzUNPqGiOg0Ziuqaa2Pu
Tx7ff5hX6XfAmIL8ONKlz80lqhI9OWr81tFCtqmkDg/6QhPP+0K/S/4IJt+G+jnsbZcD8Wrz
KmtVP0OiL91neL0paQdKWvcOQKKKKACisTxR400bwbaG41a/t7UdQkkyIzcE8BmGfumvnLxV
+2LNqd9JYeGNHu4w0YVbtpI2IcjGdoRhwSvftTl7i5paIuMHLY+ntQ1ew0iPzL++trKMY+a4
mWMc9OSRXnHiL9onwvoE3kxLcanJtDBrR4nTntnf149K8c8O/D34k/FHypta1y8htJiwP2wT
Kny5xhQoXr/WvWvCv7OHh7Q9j6mE1mVd2TIroDnpxvI4rldbmX7tXZfLGL945fUv2gvEHiaN
4PDXh28tJD924AE2ADk/L5RHIx9KitfDPxc8UhBN4hm00P8AN+8MkG3jODtjGOuMV7pp/hjR
tJULZaTZWoAxmK3RT+YHtWnk+tV++e7SJvFbI+em/Zi1rVJFk1bxUty+MElZJMd8Alh3robX
9mDwzFEFnK3Mg6uRIP08yvZM0UnQT1bf4f5B7SSPNrL9nfwJbJiXRIrhv7xllH/s9XU+BXgF
V2jw1a493c/rurvMUU/YU+wnOTOBf4DeAJTz4cgH+7LKv8mrOuv2dPBcrkwaalsOwEkrY/8A
Ilen4oxS9hDpoHPI8T1T9mWykcPpWrHTWGSFEbt9OTJxz/Oqo+B/jbSFV9M8ZnKdFd5UwByM
fezXu3Sg59al0F0Y/aPY8JkX4peH4xPLfyaginLJFGznA57xfhVuH44a1pzq2peHL4Q92I2/
XrGO1e1MNwIbDKeCCOtUrrQ9MvI9lxp1rOh7SQqR/Kkqclqhqa6o4XRvjvoOqvtlilsveaSM
en+0PX9K7fTNf0/V4FmtruJ1YkAeYpOenYmuX1f4N+GNTbfHp8Nm2MfugyjvzgMP8iuIvvg/
4p8PhZtF8Qs6IwKwgyKAepOBuB5A/OqlNw3Fo3oe4Hj/ABorwXSfjJ4g8J3AtfE1heXCLktO
yBM5HyjlB/OvW/DPjTTPFVmtxZzIASwwZFPIPTg/jVKr/MVKm0rm/RSHjrS1uYhRRRQAUUUU
AFFFFABRRRQAUUUUAFFVdPv4dQgWSJgSwyUyCV+tWqACiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAK474v/APJPdR9MxZ/7+LXY1xvxhx/wrrUwWCgmHJP/
AF1SuLFK6j6lR3Pzd0Zg9ncjsJ2/pTpm2nbjPFN0bclldEgruuGIz3HFLImckcfWum3LqyZX
5iuQc1DMdoJzyOcetSyHyxVeWTocHIpr3mZEUh8wBqgZMnrUrsAvT71JtXy8E4PaktNAeiuR
MMY4qtcZUEg9ewHSp3OxiBnmq8oGGyeaTRSdzPkm25x+dFvMVcn72fSkkXGWI/CoojgjGce9
b0p8u4u5sHxBq0L4tp0VevIX/wCJNNl1vUb6UfaZ1IA6BV5/QetUmkBwQMYpQnzAsc+1aOrK
as3oQ4R36jZX4z1prMytgH86eU2vu6D0ofBUjp9axUVFlphvOzaTlqikGFIp0TIoyeT9aGIc
EqMHNV8T1E3qNicR5BHXrzTm2rknpSbkj57mh269qlpRI1uRrwSOoqU4YAY7etNyq8BTj1pG
ZXGPbFU2pLUvoCZVuP0p2BuJPBHamRqUPX/61PLneQT+NRGK1uNsjJKtuIJB/Snb8njv2p28
d+TSBtpZv0q7tIL6j0ZoPwqaTWdUXH2G7FoPVo1b+Yqrn5iSODSseq4zVwqSjsJrm3HC81KV
la6vVnz1xGo/kKV5AzhgDj0piKMZ6UZK8DketVNynqJRiWFvZolKp8rHnJHT9Khlkklw1w4l
PpgD+VRytuOAefSlVSy4ORj2rNTlHQLdGSlsjA4NTm7m8oLDN5Lf3ioP86qA7hgnn1pdy5+a
tFU5HZDa00JL3VtVuE8lr0GIjn92uf5e3rS2k720QH3vQ/hUOCz5PGaeW+Xgc1o68nrcz5LE
8mr6qJA0d8oVe3lr/hUN5fazfrh9VVEIxjyUP9KiX5Tg9+tKB1A5FXGrO17j5StaWE8Vx5s9
yJ2z1CBf5VrPql9DD5drIIQB1IB/mPrVXdgYXinZ+Q+tZSqTvdA46Ec1ze367Ly889QPuCNV
9uox2pbci2j2RfKByO+KZI20jAyD6UoHfOMjvROvKW5oopLQmmvb5iHW6COO+xT/AEqvJf61
Muz7evljqPKXn9KVCAM7SaQyFDwOO9X7aT+FhykUdvNG25pg6/7oFXYro2+WHOeDiqwBkPpS
lW5GeBUObvdg0kPaQzZZzvB/hxiniQo2aYEGOOB6UA4znnFS6kpaXBtCXd5fvDstroW5JzuK
Bv5imSz6qY9qagoz1JiX/CnAn/61L5YMmeg962VeaVrktLqUf7MlZwbi6E59kC/yq75u07V+
UD8aaG27iAc0mdqngnPtWDqSbuwUeVC3V9qU6lBegKRjb5a9PyqnZ2zI5ad/Mlz8rYxirIUs
CSOlRsNpyeBVzqcysxtJ6kjuF3Z6jvUBO7OKfIgKbs9ulIoBA4IxWO407aikNtU9RSZ3BgPx
pQ5BK54pjEk8cY71HKk7jUr7koTCj0prw853AqKYj85bn2o27GxyR0ziqjdO47NFhH2tu6Fe
QKguZ9ReTzLW7WBjx80an+YqQEDJprHI681r7WUSOupXtobi3fzJ7gTuep2BalOdhb3xTy2+
Mg9aRGypA49zUOfM2mP0FEzqcqcH1xVeSE3UgeSfcAMBdoGP196mHB9qY6rnK8Gnzyvox25i
xvCLtiPl+/Ws2R9VDFUvURD/ANM1P9KtBiyY/WnggYqo4icXZEuNjNt9O+z3KyPcCVgd2duO
fzrXF06qdjbCRgHAP41UaMM6kjpUwbsO3Q0pVZuV2XpaxTktr9pTML4cHO0xAVNFJqFw37+6
Vo06AIOn5ewqUZ545oVsOeuT1rZ4idrGLimSx3BRhg8iqt9cahK+IrwRoTgr5anj0qSVCTu6
CkdMAHOahVJJ+6y1FPQonSm8zMlwJcHONuMfrWitw0YGeOeKiXGTnvQw3Nz0pOtK9xuy0Emn
u7iNkNz5Z7HywapWmjxxyiS5k+0ydjjb9Ohq+E2jGOT3oDjPpWrqSasyeVdCwZyysg4J6H0q
oZtWZwft6lAOB5a/4fWpQwRTjkn0pm7HOOtSq847BZdShFpMsmpG8urkTsdxK7NvXPcfWtYz
45x+RqFj3B5NDSlR0z2qZVJSd5MqCQ2S71AEiK8WOMn7uxTj9KrmzkklWS7kWYoPlxx/Kp2U
jaTTgAeav205K1xcsUybznWMhW2ZAGcZx6VRmfUvM2/2gDGR93ylGBUzjbIMUrLkE9fYU1Wc
VYOVXuypbW3lPI00nnFuuBj1q9DceQu2P5AR161EAFOGGTTHyWGOlTOrNtNGiSuJPNqshxHf
IkYOVzGvH6VHcWb3Ox7qTzpQOX24z+X0qfftAGDTZpQsZBGar205Rs2ZuKvclW7dGO07WA+9
xVLUmutYlRryYSbDkYUD+QHpTkz5eT17U45xz1NZOpKKZTSepJJKQSe+OtJHLk/1psnK5xjP
amo2xT3FRe6uxO7C7vdVugYVvFjgPIzGpOfy/rWeuiySXO+4uRO2P7m3+RrTB3Luxj2ppGRn
pWjqSitGS0hCgydxBFMxhjgcU5Qsw6bfrSlg3APArncr7miuxhJi5U59aHznGQu71pquIyxw
SD2p+C3zFgcc1b95KwnHUJpZntmgimEYI2kFQaqWlo1szfvAxbk8Yqd1O8Ec+9PRgrc8n1rT
mk0PlT1GjHmEnrTjtHzGlkQ/eIOPX0qIu2SuOPWsb80hPcejnJI6dvagM8cxdZPLYkc7QaYq
bt3bHelZAQP7w6mrU+WWm4eRNcXup3xIe7VY/Ty1/HtVaz+22IkhF0Ht3GGXywD/AJ5Pepiw
jHHOepp/mbRjrnrW6rVHu9BcsUhkUC2DZtpBCemfvfzqQajrcLt5OqKFI6GFP8DUbDP8JNKZ
AVGOPrVKrOGsWS4pFeWK+vrnfqN4s5xwFQD6cgD3r0LwF8MrXx/ZrNJdw2qZYFXJLcewI9fW
uD/1YySDUrXl+uw2VyIR3VkBz17kH2qVWU3eox8t1oe/W37IugPAPM1OFyf9mQf+1af/AMMf
+H+g1SBQexWT/wCO18+NqniBskasuB0/cJx+lMk1TxE4w2qxhD1/cp/8TXZGvRSsc/sZdztP
iD8N7D4f25XTNRgmn5yEySMMF6Fm7E1yCa14iVB/xM0IAxjyUGP/AB2qFtC8BczTm4ZjnOwL
j8qtNOEIwDz1rCeI1/d7HQqbt7xVuEvb1z9tuFuMnJKqBx6cAVd0y5bTJB5HG0g59D+OarjD
njjJpzRmIEqRg9awlWl1L5UlYdez3t9dO8lyAC24/IPr6VNPqOoPpz2Md4FgddpzGvTP0/rV
XDY6feHakyQ3PGO+OlTGvUT1IUUlYW0+0aWqyQXAEwHLFRzj86vf8JP4jZSItSijHp5aH/2W
qDMGB7jPX1pyAZBx24rRV582hTjdakEjXmoTeZfzi4I5BVQuD+AHpXp/hT4Ut43hwbu2WMdy
zEjJI7fSvOYZdm4EfMRU41O9iQm0n+zOOpKBs/mKr2qlNc5LTtoe7v8AsfaPcMCdYhPr+7f/
AOO0yT9jjRooyzavC2Bx+7kH/tWvAx4q8SOQqagI1B5JgT/4mnyeJ/E+/H9oI0JGMeUgIPr9
yuxVaVrGDpztudj47+HWneC1ZtNv4LtiVykZOec5/ib0FcufEuuWE6vZXqxkDo0aH69VNZxu
bto9lxJ5r5zuCgD9BTlUuMn73rXJKsozfIapNLUcdX1O5uS91dqVOSVCL1/IVYjvrm2UfZpv
IcdHKhv51R27W3ZzinAnGW5HtWUq027l8kbCTNd3kwkvZxM65wwUD+WKsXur6rdxiNrtWgQY
CeWvH449hUQzznpUZ5J5xnvUqvUk9WRyongm8ho5MfvEwRz1NWX8V+JYJVewvYoFXnYyKf1K
GqDncVJHtinMfkwAef0pRqyjqjR8rVmFxfajqN0bq/ulmuGOX2ooGeh6AfyppLlsDjd3poRh
SqxHX86qdRzd5MatHYu2/iXUNFUR2k4iZhtDFVIH5g96qXWqavqNwZr26SdQdxwqjP5KO1Mk
KuMH+dNTgkDgYxVRxDSsFk9epPb6ndWrb7SUQOO5AOfzFXj478UWynZfxvu44jTj/wAcrGJ5
9M0p4zyKSxE4vRlWutSS5vtT1i6W41K6Wc8DCoo4HbgD3q1aXs2m4+zSeSoO4rgNk/j9KopI
cYp/TJyKX1ic5XuSoqOxq3/jnxBenalysQ65ZEP/ALJVafxRr7gLNdxSr3+VR/JKoqd3NRO2
58ZwPet3iqj0uLkiy+tzm6W4ZcSDODnp1/xrRbxr4it1YW15HGp4AKIeP++D6VgjA7YI4pwJ
HPUVzxrypXcRuKehoXet3uolXurgSOBhgFUZ/IDvVNLkR3CSgbnXOOenFQ8O3oRxzTfMVW6E
Z9aUqjnqwUOXY35/iXrdooigBcYxlQpA7f3KoSeItV1VXa+kG1gQF2jOP++RWerYJ9T3p7O2
Rk9B6Vo8ROS5b6GcoLdIRhkEn+HoKIwTkjihZMPz370/zNgYg8GuVt3N07aDCdv3Qc9zVuzv
ZrBxJGw3enH19KppKHcgnpTy4Vtx5+lbqTirkWbdmdLa/F3xHowka0jKl12Nwp4/GM1jzeJt
U1csmoSrMjKQQAq4zweQo7VUEpYZ/KmhixOeD3rd4ifLYlRitWdLH8QNYsNF/s2yZIoNzMCS
pxkHPVD6+tcxPaHUir6i4uZgwO4fLwOg4xSiTnGDSlsA4/AVH1mdrD5VfQ228daukItocJbq
cjO0+/8Ac9/WnWvi3VbGU3EcyPL0I+Uf+ymsBHJznKk0/cAuM81X1ydrIFGzO3X47eLLODZF
tVOmTs/+Ne1chrmr3/idG/tOVZImO5kUDk5z1AHrVSX5hg9aU8DOeKv63Nq0mT7KMXoa/hvx
Bc+ErcpZ4aEHPl5GemO4NdfF+0V4pSLyBB5UXdiUIH5xe1ecD5Qec/SkyTnPSojiZQ2Y3SU9
zQv/ABBf+IryKe9b/UMSgwOec9gPQUl/ql5fNFul2xRDbt2g5H5VniR1OD17GgM4JJNZyxMp
at6iVNLYlnfcCSM+1NVTtLA7T1xTMsDk857UpyVJ6fWstWrs01Rf0vXZtElM8EZaXgHnGcHP
ofSuxtf2jPEdlZNYRWUqKE2B/kIxj3j968+Ve55x+tKW5JHFa08RKlsTOKluad7r+pa+2dVk
WVc5VVwMHGOyjtXQ3HxR1qLTksrYqkK7uSVPXOf4D6nvXFuCTg8U5JAgYbTyOtaPFzfvMlwS
QS+bqGrxandyb50UKDtA4ByOmB+ldi/xP1E2Aso4MAZIkZlAGc/7HvXHH5uTRnAx1rP6xOOq
2G4xaO10b4v614dcmBN+c/c2nqB6p7VuSftY+KbcCAWFy5HoseMdf+eVeVOx2hs8j+GpjLkZ
7elarFSjqiXSjJHZ638a/EXiaNlu4RHG5BIYrnrntGPWuW8NaqPCF813aI0hbcdq8n5vrn0q
jJ8+cdaYH4yvHbFZvEyk7y3NFSUVodVq3xV1DxDdPJJE6kkls7eSTnstc+5UszDjdzzVdpF6
7SDT1UheeayqVpyM+RLU2fDniqfwneG6hVpXyCqqB1wR3B9f0rtf+GpPEmn2MlgllKVnAAce
Xgduf3VeY7flJY9Kijydx6gHit6eKlEpwi1qbGt+MtQ8VSyy3qCMu+9skZJznso9BWZnOfmH
0qDGGLd89KXdl93Ss69WVR8zLjaK5UKwAbcTxUbSJuIA5zzUk3zKPrTVwByDmuS90O4xmA6d
fWlRlDcsKd5YcfNkU3YIl25BNKPdDb6CxIFG4kdelMmUgjvQE3EEnGKeJNrEE5yOtXaz5ibu
4wQefhicL6Uj4D5H5U+NvL6tzSuQ3OKTXMUpNPUjAO4kdfekMoCkbDjOacykJnPNKFGMjihu
+gOQgA2Z7DtSAlg204yeaQfIPm5zzQnBI9f0qL8pbWgOuQOOlCMUHbFSLu3H2HFV5NzMc56n
tWrsQ2TjbIpPYUyY/LtUYHekRiq55wO2KcCrAnPIrN6bAyNWI+UnbjilaTjaO3ekkBVt5+YH
07U5VDjPbriqVnqCt1IFOTgkcd6mf5gMEAL3zTJI9uT+tQuntQ1ZaFWLCOuDwOvXNNdwRxTU
CoRwfxqWRwGzjP0pWugkrCD/AFYx94d6jdmfG4Yp/Cng8VFIplUDoc96ej0JVndsc0rEdOfW
n8hc7Sc9qIyMHIwBxTWJGBngUnG6HddARFGSWA9M00t8hJ5+lK6jbk8k0jyBEPBx6VDVnqVo
G8spz0xTAvXaQMGpHUFOCOnPtSIhGMHIPWtLXM9N2By7Kccr196JCUwf0p5JHC9BUQRgxP6U
mrXsOMr7jmOQvZT1prIqtxyDjmpN7ADPQA5BqIuCxwMU4N7huO3KibQM01X3jFNLHA4P1pcB
qb1eo0hzQBM89qakhCYHWpN4kyc9B0pCvHUAUlZMNFuKXy2c0NiTjOD6moznGSDjpilRA+Sf
lX3olIVrDY2Bc4PI9aeuAzcZJJ5pQm7JHHbmjeBnHahuy0E5jZMgYPNEWAp4Jz0x2qcPu6jF
GN+QOP60J6ajdhky+URg7simpMAjcE96bInzUpUIuew7DvVte7cVlaw4S7gcDB/lSeY4/wAa
EcbwcHHalkk3NjH0rOUpdAemiGlS6/N2pFTCgg07dx0/GkLEYOODWkW0/ItNtWHFzIOR+FIy
FGOeM0m4E5HY1LMoc+1Q5vmIStoxI5dgJHI7mmMRgY7c0oAVDuoViYqiUlfQpaD8sxLAjbTV
xs5zmhQQv3u/TFO8v+LqPSqT/m2IbTZFFlZB3IFSAqpyOCPWkVcDJzu9cVHtPXBNRfdDe5M7
7mAAwD3NAA4FPQlhj9aYCvzDritoy1sxqNhreZ5hwOO4qQMCOn1FNdirKRycUizHzORweKyU
ue7QnckCg1KqZHbHHehTtU9PzqLLZLD7oqXJ3KtqEhxNjkheBgUqfIzf7VImSzNnHellyyq3
Qj9a003ZTdtCRlwgX0pNmU6imK7J1+b6U4AAZPJ7e1JtX0J0IXiCMBnINWoOeRwPQ1TI33OO
FHHWrUC4O0nBzS5rszkmnc3rHLRHHIou5vLXaRk06zYJBgdM9ahvNrL6+4ra6tZkq9yHc24H
HOKdHMpbax+b1o3CJQw5NEK5c8cDv61z26l81iRgqcnqamWMueDiqinPJqxHKSDtU5PU076a
F26lgct0Jq/azBmCdD0waqK5P1FTW4HmBieQenrWTkpAlfU6fQFJ8Q6Oi8ZuY/8A0IV+nnwa
iMXw30UE/wDLqv8AM1+X/hFkufGWjRlsMLmPGfqDX6hfCAt/wgelqVIC26gEjr1ry6jbrL5H
SvgZ2a/dpaQcD0pa945AryT41ftD6R8JbERtE99fTh0hEMsYAYIGB5JyMsueK6D4xfEmz+G3
hae6uCDLNHKsamRUyRGTgbup6YFfCnww8Ha18c/GEkuokiDdETJJEQDlgmPkAHRT+VRUqRow
52aRi5Gt4b8F+MP2i/E0eqTOFhJWNpZoGACoyqeUQDHzHn619i/DT4G6N4A01Y5Y0ur3ezma
N5FHJBHBb/ZFdn4T8NW/hDRItNtvmVGZywzySc55J7Y/KtcDArmUJ1nz1ipStpEcSc+1J0oo
rrSsrGO4UUUUwCiiigAooooAKKKKACiiigAooooADzSYx0paKAMzXPD1pr9s0VyuScfNk9jn
sRXhvjD4Ran4Tv21Lw9coihVAiETPjPB5O7n2r6FpuMe4rGcLr3S1No8C8GftGC1nGna7YT2
0sSlC0jIigqAMnIXHIIxXtWjeJtM1+FZbO6icMMgCRSSMA9ifWue8a/CnSvGls0UqiIlg3Jc
8gk54Yepr591b4NeK/hy8l5pVwLiOI7QY7ZicE7cDKsD2rnXNT0NfdmfXGCD0or5q8N/tMT6
Iv2LWtLuUdAADlFPAIPBVe4r2vw38S9E8UQh7a6iDDAbMyEKcZxkNW3tuX49CJU2tjqqKTtn
OQecigHNbpp7GWwtFFFMAooooAKKKKAPGNC8RPBIskLruGCcgHvXpOgeI01Ndk7okwUHOQAf
1+leJ+LPB2qeBL6WS0TztJ3fu/lZyigZ5O0e/eo9G8Wi5RSjqHXG7pwc/X2qFNMmzR9HHg4o
rzHw/wDEhrcBLpkMRwOgGOee4r0Sw1G31OAS20iuOcruBI5xzg+1a2drhfuWqKKKkoKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK4r4zRGb4b6ooGeYf/AEaldrXI/Fp/
L+H2psfujys/9/UrixXwr1Kifm/pkiz2r5OSkhXj6Co5toJ6g+tN0yIR20zdMzN/SnXCqBxm
uiW5Mr3Ks/Bz1HrUEjZXGetTyFeep46VXYAnoR9afUj1IDFk5z0qOQsM47damYDJwaQFeh61
pyu9yb3ZWBySSelRTFNrcjJ96nnC5IHXvVSaEmPnp1FRJq2gOyZQmbLc96ZGokkxnj0p4Td1
4qfTI0F/DBgl3YZPoMj/ABFdEI30RTlpoMCbflEUjseiqMk0kcF83+stZE9SY2GBX0T4etNJ
0ewhJtPMn5be7t/eOOjD0rmPiF8VoNMujYxWcbM4VehJ+YHn79dLw7SuczqtvlPHiCjncPxp
koLL61NM7TOW5Oe5FN27BkGuJvU3TRGxDEACkJYKx6AU7dkcce1NDnBHb0ptuD1FoNZshTgZ
pxwU6ZPrTACCe5pWfC5IOahpJ6lO1hVB2Nkc9qRY2Y5btTT9ws3YdqIpsjr9M0uUmzeopYiQ
jt3oYggj8zSEfMzZoDEt0/GrTVtCrkiKCOARjuaRiFznoabv8ssfXinKGeP0HWrTE7dRUQyM
QKdc2t9G5MFpLcenlRM38q3fDmlJqd7HGhJwQflPvXtuhXkfg6KSSCCN5CuGLljnkkY5FdsK
LlZmMp8i0PnC2s9W84CXTLiMHqfIccfjVl7Zo+qsgI+6wwa+i7X4nTeLLaaEW0SKMqfkIPQf
7Z/vV5n490BIoDd7Sqhd3U44Df4VU6PJqzNVW3qebeWY23DrTmwy5z+VLISshU49c0iMEO0c
CuF1LOx177ix88HpT5I3Ee6OKSVum1FyaktIjO20jPXpXrXgvQIrFo55ELnaeGJ7gemK6adF
TbaJlNQR49Jp+soAyWEgX/ahepBFNbRH7SnkydsgqD+dfTk3xFsnH2G0SMuoG4Mc4P4P/smv
P/FHhKLxIpLMInH8QcgcnPofSumeDsjlVd9TyC5gvPLxb2ktxKegWNm/lRBpXiF4jI2nGML2
eCQHH5V9G+Gb7w54E0oyhjNfIoKs0oIUhcYI3Djk9qSx+NU3ia6u9PhtodqnZ5iocfxd95/u
+lKOHlYv2st0tD54Wzuo1zcxeUx/2SB+tRNBePIyRWk0v90pGxB/KvcPEvgVvFVtOxxHI/zb
ixUZyD6H0rW8Iaeng+G1+SOae2VfnZmIyAeeCKfsOeQe20PncaT4hOSNLkVD0LW8n+FSx2N1
CmL2LyX6D5Soz+NfSlv8ZLzWddvNIitI08v5RL5Rxzgdd59fTtXL+MvCUPi1pk1GQRsHZt+/
YA2MelE8LbYlVmtzxWW0vJDsitpJAehSMkZpY9G1uMgNpdwA3G828mP5V9DeFZPDfgWz8xrl
b2bBAeO4VwMEtzgrx0/KnWHx9l1jW59NtrWKQIFAkWMlfmx3Eh9fSrjhtLBKo3qj56awubbK
3ULRMOdxUgfrUEtvc5H2e2lnH+whb+Ve6+J9GHiZJPtZCo67CQSoAwRn9a0PA8XhbwPpySXN
7HPNGWbIuVI67hjlfSsnhkNVG0fPy+GPEl0TNHYvHbdNzQSDn0zjFOk0m+sIS17FsOeysD+o
r6MtPj22u+K20jTYIpLUQ+Z5+zd8wwSNwcjv6VkeJtJOu+a10SZG2/MPl6fhW7w6toZqck7y
PAZLXVWyLXT5ZSeg8lzn8qdF4S8cXwJj0OcoD1+xzf8AxPvX1L4T1OHQokaC1iD7cbnLnsP9
r2rlfiF+0nfeEL5bdbGORmkKZSAsP4/+mg/u0/qsUtRurJuyPDk8K+JYxm508wL33wSqc/iK
reSZZWiGDtOCB2/ziu41b9o7XtdlVVtY4EI+8tt+Pdj6VyWkXhsdSe6UnzXdnLMBjJBz/OuO
aimbx5re8U5fDevHizs5Jo85LeS7YH4D0pY9D1C0R3v4irDkfIy4HvkCvpDwB8VNQ1VfKaGE
KowXEZH8JP8Ae9qwPjbqX2zw1dXGxFm8uQZTPqp6E+5raph/dcjJ1pRdjwOVSCRxzTcKwC02
2l82zjYj5yoyTT1Tcp9RXlNNHZ0uNKBeKNpAz2FI1vwT3xSYPl/pUdbiiSONw3DGKYWZDgdK
bsXHU8cipEYH1xWy1QNvYW3heaTaentUMugeKLy58uy05pYuMOtvI315ArZ8PlZNZt4wuVyp
P/fQr600LxS3hPTYrS1t4ZVUl8kMx5J/2hXfQoOWpjWqygtD5LbwfrNnaGbULN4n6YETqAM8
dRWLZS+bDkjHWvQviZ8YdZ8T+I7nTniEFl5aMSIMZYAHqSfX9K4TylUAAEVjWpxhK3UdNyau
yNlGPX6VAsiFuXXHpmtfQ9KOr3/2fy3aLaSWAOMjtmvZND/Z70yC3jvdTkW1stoJka4ZCCQM
DLLjvShRk9UOVVQ3PB/mBIHY96V3OQO1XNaaAatdRW3/AB7ROyh2OQfmI6/gKynu7eEfNMnP
+0KwlCzNU+ZXLTLkhe56U84QqMfNUUUgnI2sMjoM0+QsuQBkkYNJK+4NCTabrcriSztRNC3T
ETsT+QqzF4Y8RRILm5tPLtyMkmKRcD8RXsXwK8e3C3VnpOY9kf7sB1APR8c59q9F+I/iW5uP
B+uK+wCCNgAq/wC19favWp4dS1scdWpKEkj5PlEiM6kjgkUhK+WPXHNK7NczTz54eRjz2OTm
q7ahaozRSXEasnUFwK8uUWjsg20myfquAc4oWxuJlItk3v6EE/yqOzv4LtXaORWVRnAINey/
CbwzHcxvc8/ul3/eOOHPt7VvRpObFOaSbPLtN8C+NdZhLWemOIxkZ+zSke/8J9akuPh54r0t
A11bJCRyQ8UinH4r7V9HePfj1feBoYESziKsyqSsJbruPdx6U/Ubu68W28c1ywbzOFG3b0yO
3416bw+mpwe1le58vpY3+oRr/Zls07H+LYzKPX7tXJvBHiTTXQ6hbLHE4zu8qRfUDqo7ivXP
h5rUnhPxxd6Nb7BYeUZ9r84YqnfOe1elfEDXZ7/wrdLK6eSjphsAY+Yd/wAazjhktSpVW0rH
yXgCQx5GR1oiDSy7QM8VTtnWaS5kVgzNKx4PGK7jwBoR124RnjZQQ3qP4Qf61xKF5NHV8MeZ
nLSeHPEl7Ps06y82P1EMjZ+mAewqy/w98XaeRJe2v2eHqRJDIp/VPXFfU0/jnS/hHoQIRVVg
GZpWBJPyrxl1Heqt/wCL38e2a3bvG9ptB2w4wc4YHIJ9u9d/1X3dUc0qrfwnynIGjZ0jUyMv
GxRkk/SprTw54g1wD+zbCXzAcbWgclj14ABr062+Gr/8JZFeeU4tmfcTluOWPXHuO9exnx1p
/wAKvD3nlY0YRhlMjZ3MAF7sPUVlDC3ehUq9lpufLdx4J8TaTbmTUrFox1K+RIrY78FR6is3
b87IgJkXgoOSD6EV9S3vjqbx1pXnt5fkXUW7bGuOGH1Pp615H/wrWZfH0N8quLGaUs+M8YXu
dvHPvTnhr6JDhWd/ePPE8MeItTCiwsWkDdMQyMf0BqaXwH4p0pC+pWLJGw+UmCRT691HavqV
fHFl8KdAt2l8mONxtR5m+8QC3dlHeqd748n8bWaXoeJ7WQBlSMDBBGByCewPetlhko6oiVaT
fu7HyjIyguGYIYxkhjg1XW4jlO1ZkZhzwwr0u8+HVhL4yhOoFo7S8IjJMhXB/djqRxxurub/
AOAnhTS45Gt3aWTY3lN9rLDdjI6DnmuSWGk27G3tko3Z8/biGwQAcd6lt8zDB/CrOs2f9m61
JaSKQwVXG70IFQ2zCG4D9RXHOCjLlkbJ3Vy+PBviDWZPL0i1aQN3MTt069FNRXPgHxbotz5e
qWYjUDJ3QyoeenVRXuXwa+Lt8/iODTDAkoVZG8zyuPu56hvf0r03x/4qubmw1DfHFKwEePlP
95fQ/WvRp4eMo3OWpUcGfFzFCXXGSDtOPUUzZhaqaaAtzf5OQLmQBe/UVeO0n9K8Zp38jpUt
LoRY9nAPXnmlijlnZljieYLwdik4/KlBHJY4Ar2/4I/Dn/hIdLu9TIJRXQ7QxB+Zc9Me/rXX
RjzOwOXKrs8ksPhv4z11XlsLFvIU4/495TjuM4Q9qZd/C7xlpEgmvoFS3A3MGhkU4/FB/Ovq
jxr8Urv4d6baJDHHLuVMoE3t95U6bh61DJqt14/0a2nuyUiuFHyBAhAYK3v6+tel9VicLrSv
dHyZOskJaNtoZTtI9Ki24Vu+a6H4qacmg+PJLO2bfGztk53EYRTz6dTWADvUKeK8StSdOVjt
pz51cSLJyvepVhMzFV+hpCnQ9uhrrvAXhZ9Y1RMqxi+TaRnuw9q0pU3KRs2lqc3H4S13UCEs
rYux4ULG7Ek/QHvTpvBPiTSD/p9mQvvDID691HavrbUPFujfB7RxOQqu24b3cHeRlgBllGay
dY8ayeNbBm2wvC2RmIHuCvUMfQ17UcMoqzPNnVldtbHyjJvDEEYx1BFNjbMY9a7D4leGJPD3
iBioIt2RMsckZwcnOPauRiCMSyHcPUHNeVXg6bsdcJ88ENeP5NuPelVljQU5pUXiSQJ9SBUB
kVzgOpX1zXO4vlK1Q9CVbIICnrTpnwAvXvxVOfULW1KgyK3H8LA/1p8F/DKw2Nu46ZFHLbVm
ktNSzEgIOf0qRtPuZYt1lbyXLZwdqFsH8KSFij4xge9ewfAXxP8A2BeSWqeU3mSeYwk6/wCr
Yccj0relT5nYzcnZnkA8JeJrQLPdWfl2f32fyZBgfUrj0qFgC7KHVgpw2D3r7E+IviG5vPB2
uwyGPaYGTao7E4r4xtbd4r7VCxwPtLlc9hk104ii4JWMqFVzdpFhX2yFOQD0NLK4QbWGd3pV
aTVYLWTZJIoPrkY/nToL6zuZRidCc52q4ya87lcnY6Grstx2dxcwj7Mhdv7uCTj8KuWfgbxV
q0b/AGHTnfaNxzbynjt0U1678F/B8GpWr6lIcLEiuFLkE4Y47f7PrXoXjP4yyfDqDTLeGzjl
jllEOFjLlVwDk/OPWvWo4W8VJnLUq8krRPlh/CfiewYG/sGWIHnEEgPqeqjtVV3wDtIb6c19
j6jf33iOIR3Dp9muFZNqLjg/Kea+TPGukR+HfErwRkESAdGyOFT/AOKp1qHLFySJpVJOVmZS
yFk5FIG6YI61C+oQB/LMi59Qwx/OrAhGwEcg9x0ryZp3O+ysSRo7PwM8dhVaPTPEmoS4tdOY
xnput5OcfQV3Pwp8OxeLNUFrL/x7tv8An3beQoPUV9T+F7iz8LWX2KNVEiE/vZGPQ8+oH6V3
YbD+01ZyVZ+zWiPiS60bVtLbF/AsOOuEdf8A0IexpIY3C8KWH+yMmvo/x5oNn4i0q8e5u4WK
MpAEwUn5x6D/AGjXh/wf0248XeJH0w4MmyRxtyPu49AT61pUoJNIVOrzLUxP7F166cvBp0ks
I9IJCf0FD6Xf2uTeW5gPbKMv86+2/Bt/ZeEtKkgjVRP8uWZsjgY9R79q858a6BbeOrG5a6li
hmiPBEmwEFwff0/WuieFio3Zg675j5jiDSuYhjzWyFFS/wDCP6/JuFpaPIuMlvJdlH4gV0Xw
a8P/APCR+IbiKUh2gnCKQcDGGz0HtX1t4RurTw1oOoadHHHEJUxI7sclgpHGT7enesKGG9rC
5tVquKVj4fktr20wl7EYZuhJQqD9M/hQvyg8jNfSHxO0PStf8K+IJjtF7FEWSQSkDOfTJH8P
pXzRDmJPKfkxkpnscHGf0rjxVD2TVi6VX2isx/mlSc9+lKr9/wCI8UwxAuWpe2On1rmbTehv
sNYZGD2707IUA9aaxC9O9JI524FTsU72GyuVGU5NSRjHPI+tRxjeOvFIrMzdxx6U3ZBYmyd2
aQIrsM9KCAW9/SkZN2Bms210EO3YORzUaEtkcU4nC56j2pA7MMd/WqfZAhJFyQAQeO9SA7UG
ecVEVwwJPPrQcnGO9OLstR2fUFCBuO59aHIVxnpTFQM2OmDzTmKZ65PTrQrAhSwZsdhRvOSM
cCmMoBBAIpx4BI5zTk7qwm9dBrgD5gDmpU2sMtTYw2cngds0MvJfPPf6Vmrvcb02HgZJ3Glc
jHXk9ajIBXj9aIz0LjAq76WJtpdkikkHPUc0nmFjkrnHPFBJAO3gUxJCwIB/OklrqLcczHq3
3qRsnnvQzEg8cUwui8YpppNmqT6Em8Bc/wAXrSKTnbtwvWmrtRt2MmnNIcEYJ57CnZ7iHsuT
zTc44PSmK7c+v0pGO3BfJ9cVLkrAtNyYDeuaZJt45zjqab5gZ1P86V8c9qhak7Dhg4x+dDkh
DTf7opctn1FW9NAu0xVZsdvagOAcE896CF2n5hn61D5O/OOvrVtq+pae4/fhumKeD5nXjHpU
e4r19eTQc5wOnrWbairCbY4/JKVVuo5Jpe22omIV+P1qUNzn7tF7oHHQcwGc459aSTK/U9aE
kLfM3WmyMzE5PHrTU0gQ1zsOOx5pFySSelBKuAB0FCqVyw61D7oL2HjI4Y0rFh6fWmklOc59
aYGBU84q+W6uDfUHJLcnJ6fhSMu0rjvyc08KGO4dRQybsE1WjBvUUqoCkH9aTeMkY696jkbG
V64pobeMY+lEtmMkEhUsM5Hal87oOPeosgk5/h6ClSEycggdzmojZqzJvbYmOAODz6VXaPLH
tVmVQOV6+tR7QvHUGp2GtBnAb5SCAKaZNoJAyfWlZdxBwQPWnlV201K49iISb1JYYNO2BsMW
wabuCj3pCMcnr6U+ay0C6bJnI2deKiZsqB1IpYwBkmlkVQwalzJiVmN2bhn86eI1U80I4UEd
M00nccY/KhKyuxttB90Z7ikL7yeMNjihm9O1M875hkfSk1d6j1aJGDbOT0602Ngep47UpG4H
r+FN24BWm2thJdwLFZSqjKmkYAsQRwvpTSCrjZwe+afjkHPzHrVJdQ0TE+ZlXPSlb5s9xT55
FY56EVEHDZwDg1LXcG3uDDkc0nQ/3ieuKBGA3ByfU06RSAduenTvQ23ogk9CNckFl60oY7h6
0i/ux8uV+tPwC4DfnSjdasLNK5GhIkz3qTzC0gB6U1CwY44UeopQiq25u/vVXvdkt3AKQx4z
ihkjIyR+tIHDN/WnyR7m6gZ680Rd1YL23K7OeQowCae0hiix1yKVIwSfQU1kLBs9KS0epWgR
udm7ilSb5vVu1JtwoA4FKYwqFu/atnawS7jZCWbPQ980h3YHvU27Kpu9OgqMrl8jp3rmSabJ
6AJD5W0YyKYoYE+pqRNpPAP400kqcAYrRSirj1QnljdnIzjnmnKCwJ5ojclyrelCvjIGBx3q
Vcnm6Eg60zAG4/e+lOYqrgZGMetJCw8wkfe9qvbVgGSw5+VRTlGfekLlztJ2j3pMrG4xyD6U
NLdjewrtg49KCzKTtwfXFBIZsAHHemMfIb5BnP40OaQLYk4IwTjPrTcAKwBFJIdyEj86bGxZ
ccZFXzXWpLVmADJxxg04kFf9qky24k8kdAKQzfN0696fMreY3e+o9W2oQeM04EKgIHtUJABy
eSaATn5mwp4FRdW1KVhVDO+BgKOfepQoLghsE9RUYUDk5BNCuEbJB3HvUc2g20SSPvbp+FNC
BwecegpjysD3/Kowu4gjjHrQoe6K6auTqF2Bi3PpmnowEZUHiopBxnHX1p7yApkY44xSclyk
tXHPMAoHOadI64xjjFVwwDcDJPangFh7+1CW7DbQfGDnghR71E8YeRtmRnrmpCoZznr2pdyq
+AMepq7cmpfNYkRguAeSe9NJRZc8k80xVVCTnNDFS+c8iotZ3EnckLZIPal3lBj+CowMsG6C
nMwPTHHSjRl3QSMuzPel5IQ8EUkhCxhhgt3GaE+VcgYLDmrSSiCaiPEm7cGORS8ENgjio4pf
vdhTkGxDxWfNZ7EPR6EcyqzAnr7VLF8zA9RUE2FwQcZ65qezi8xlIyRnFEdW7ib5jehLJH8v
A96jlbKcZ4qWEZj5Hy1FcbU9dpptBFiIhkQ885zinSABceneqiMclulTxMHylD10QPuOTgMV
4571OkoUHA6elVAgAJHapopGLYPT1qHaxTZaR9+cHip4naPGDk8VAnyLtU9amh+V8c88mlo0
UmtkdBoki/2jY3OcT28gdMeoOen4V9cfDb9pPU9H0bTdOETmG3QIwNsuCOe+4GvjqwmEcqtn
oeK6+x8UXFvEqIyYA7qK5nFSexfNbQ+6NP8A2nbWQgXcMcHHVlC8/jJTtf8A2rNA0rTHmhlh
kuVz8haMg/KT0EueoFfCdzrN1qhdLllEIyVCLgn1qjZ6Dbz3Lv8AvB3xn3rp5lDdha56Z8Rf
i/qPxz122tTCxgSVW3eQEySFQcqW96+2fgl8P4PBWgl1jZJJVKDezEgb3JBBA9q+UP2YvBJ1
7xO6XMTCKDymTllxmXk9K++G4wBXDzLE17rZf1+ppK0IaCDnnvS0UV6pyBRRRQAUUUUAFFFF
ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFACYFGSKWigDjfFvwr0Lxdblbi2bzOekzqDkgnPPt
Xz341+Aur+Bbo3fh6QkEFzu3S4JbGB+79DX1qRmgsVHFYOn1RpGbifJHw5/aF1zw3ew6X4iU
W4kkVd0lssQ6bSWLFccgdBX0v4V8ZWPiixWaO6gLnGAki4bIB45Oa5P4ofBvRfGenSl7aZ59
jbfLlYYJIOcDPp+lfNup6BrvwHv5LvTUebTWk82aOWIyOoDbT/CuOG9e1c7XLrA0upn26rg9
+PWnV5H8JvjPYeL9IsEkmiEpjUSRgoHjY7uGG845FesJKJEV1OUYZBHQit4VU9HuZSi4klFG
c0V0EBRRRQAyWNZoXicbo3Uqw9QeteR/ED4LG8ll1Pw/iK8LNI0cs3ytxn+IHuPXvXr9HQ5r
OUb7bgfIf9uT6NcfZdUj+z3R4KgBh69VJ7EV0GjePpNDn863k+QYx+7B75717b48+GGifECF
DqMUn2mEl4ZI5WTD7cAnqOMDtXz7428Ba38OUS4uYYpdOckCSOQMwwNxyOPft2pxqcj5WDjc
908KfFzS9eUQzs8d2SeFiIXbkAHqfWu8Vgy7l5X1r41sdVS9CyIxKA9duCMV6R4V+LOo6EPJ
JjuLMksQYhuBJGTwR2BrptGexHw7n0HRXP8AhnxxpnimMC1lb7RkgxtGy9Ofp0PrXQHgc1k0
1uUmmFFFFIYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcl8WWC/D3VC3T91/wCjUrra
5P4rxiX4faop6Hyv/RqVyYj4UNas/NbTI5Ps06EZzOxB9uMU+V2Q8kUzSHklhuHbGEmZf5VL
Mu8YIzmulaOzJlpoylvU9OpqKYHGXHT0qSUFG44IqFmODuHNF1e5EttCJm+U44xUW/byD161
JIG27u1VtoZs457UOehK1QkpIcse9QyuwjOKsOCV54NQSj+Hv3qb6FrYoIJHYnADVe0qPdew
t1cMCfpmqEkpRwFPGec1q6U5jvIto4ZgD+YruovXUzkme12svm2qyyDKEEAD6n/69eP/ABHA
XWoEk+8pjIK/jXrlooSxjU8A5/ma8q+IEa/27iQ/vFVDx+Nd9a/LocqXvM5hpiJfamshwT3p
7pufPbFRuSAR615Gjd2di2JPMwuTRHCbjIXG33601GJGAc/WnmbygccZp9GD0eg2SBosgDke
9N37iAeop3mu45AqIDL56UKSZW+4hH7ty1N2bQMH5iOKexw+AOMcimtnBOOR0pX5tyXdaAF2
5yfmpVQ5phkxjrnFOUsSCQMUlFpBclwSvB+tOViwxn7tQknJx0pQ/XB5xTV46hujrvhzdJpW
qM8p++UzgZ6NXqt/EbtZEi5ZgQD0GcV4bY3n2Vt469uK7bw18aNV8NLsFuk2cADy1I6k/wB8
etetRneBz1IN6nU+DPDOqaPAUuYY/mYksrg4HHv7Vn/EqWX+xZLWPB+Qk7v91/8AGu80H4l6
j4s02SWcJAg3fIsYHT8T6+tcD8SGLaXNNxtMRz6/db/Ct5fBZHPK9zyBFDAFTkU8oFGOcUy1
ZHgRlzjnr9alCJ2J+teKrc7TO+zN7wiA+rxo4DRiNj+OK9tkVbUkIDtVcAfjXjXg5US/Xg78
N/KvcdMaCGf/AEkEouQ2M/5617NBWV0YYh2aPDvDOiav/wAJVfSpbqts0zs251yc78d/pXss
+2IxIoKnbg57HvWk/wAQ/DQvTa28cscwHOUftn1Psarzyq915je5/nXVy9znlK6R8/eJ3XUf
EixsCxLeWo6c7z/9avUfht4Rj0GFroAq8vzEb8/wc/8AoVcx4V8LnVPFd5f3KFUtrlkTDgZG
WzkD6iu38WeJ4fDujTRR/wCseIquVJwOAP51glyttmnNaPKc54s8dmz8TW2mI37ppys/7vkA
FSMH867C0uY7+2i8nLb0AUHjqK8DuLg313JPNzI0hfI475H6YrrvDvxG1Lw0I/soRvLA2gxg
5xn1I9azWIjcbp+6eieHvh/r1h4kvNRmghW0mIaFhKCx5B5FW/FsUsVnciYhJfm5H0P/ANan
eA/jTrvii5ls7hEh2KDkRKM5OP7x9ar+Prl7uzvZHwZdzZPT+Fv8K6nZo57STsz570OxfxCj
LajEyddxwOSf8K9U+G/w08TaLeSXEltbJaNsIPnAtwxz3+tefeCdXk8KSG8t13s2MKRno2fU
V7J4U+M+t+IpHtQIkUgL/qgOpx6muam7SuzolCShoWPFniSx8OWE8U7OHdDyFJHKn/CvB4tD
/tRQfL81y2B82K9o8WeGFv4pzc4bahJO4jop9B715b4X8TXHh+4aS0IIQ52suc/dP9Kism9h
Ud2d18M/ht4j0bU01F7a3Sx2urfvgWyRjpn6V3Gv6rBYM7MW2HGOM/56Gszwd8atY8VXA0vy
Et48MzP5Sjpzj7x9R2p3iLSft1pK853Km08HHOQPT3roprlV2FRu9mdP4e0e81OCOe1jEuRw
SwHGAe59684+InwQ8aahqRvNOgt8mQt+/nQDBL+n1Fczp3xh8UeFbuS105YfLUsoJiVsgcd2
/wBkV3fg348eLtX1iOyvVtmRkZ9ywqMYHHRv6UuZSuTySWqPJtU8Lap4cB/thIUIHWF9wHOP
51neX8/HQdq+hvEOlpr0N5PfMZGiIC7Tt6tz0FfOUgaS9vIS3MchVT7An/CvMq07Sv0N4VOZ
2Z638I9yadcSNgeZhkx6FDV34q/P4XcHqY3H/oNU/hUqi1eNORGAvPshq18UyyeGLkZAYxyE
D2+WvSb/AHTsZVbXueKCPyoI1OMhR/Ko8kEnOBTU3Nbox4JUZ/KlUZU8fjXhu6u2dqaSsOkn
4APUdKQuCOD8x6imsA2NvUdc0fMAeKi6log0HeVsJBGPWnZDHavGeuaa0gz0wTSBufn/AEoX
u7lept+FGLa7Gox8oBJP+8tfRn370gEgbK+d/Byp/a/B+csPyytfRkoE+ov5YwTHzmvdw8ly
6HJWPmbxTPjxNdIODsU5/wCAiq9rbS3ZCxAFznAJxUviV1n8TXcTdQqncP8AdX/Guo+HMFnL
eL9tcxKA+CufQegPvXDOLlWZ0wdoHonw+8HQ6UkcsyEIVz9/PJUVzXxl+Kj3ijw/ZNj5lk2t
EMfKXG7JPsK7jxHqNzJotzBaKousqEBHGAwz1Ppmvm/VIZ9PvBLendd8lyuMc5z09816FV8k
LI4oxVSep3Hg74dw+IbcC9QmFcfdkwfu57e4FeqP8K/hloqQJePeiZ0yF8yQ9uegp3w3t0/s
Uy8gHbkf8BH+NdJ4i0fwBG8dxrE12LhQSQm/Ayeeg9c1eHpqOrRNWpaVjzrxR8PfDn2SZtCi
u1kMbbDPJxnt19q8t0jQLm78RjTZcDZJhzuHTLd/+AmvoDX/AI0+AtNt/I06O5e72bI2eKTG
fujqwrn/AAtpUWt6lda+ydWDrhiMKdzDj/gVTOipO7QRk4q52Pw1+FHhrRIIdbnaX7fCBKAk
jH5vmHTGO/rVH4pTxPoutSwBvsyxs7luvY/zzSy6g8d0kSHCkkdKxvHcsh8L6kMjy2t3yPwr
sjFJWRz6ylzXPIvAXgNPFl9M94m7T5pN0ZEm0jLkHpz617TF8FvhdodranUpLv7RIAuFllK7
uuBhaw/hNDFD4Uhdgd/b2G9z/hWF8dryS2i024DYMcytFx3CA8/lXLGEFG8jdttpHX+Jvgh4
Y+xs2iCfLqyjzZmwOPcetY3wv1F9FtrrS7tcXSKA20ZGWLEc59GFeaW/xE8SorReZapDjkmP
k/5ya9H8AaMNRM2pO37xQM4OO57Y/wBmqptSdoo0cHFXb0Nrxt8LPEnxDhgn0qGAxLKpdpZg
n3QwI/UV1eq2snhTTIxfr5U8KlyqncMZZh0rnPiB8XfEHgSG3j0h4Ut2kVSssSuQCGJ6n2rS
vorrxJDHJeSq7TLhivyjGSvp6V0N8rVzlu/keSeA9bg8T/FC8u7bJge2KqSu3oqZr6Jh8P6Z
ruhT294z7gdwVSQDhl749zXgngTTo9I+KU9pCu2P7OWQZJ6queT+Net6pdvYeYueRjtn0pLV
lVForHkfxH+F2n6bp9w3h+GRbgsM+fLkfe56/hW/8JXik0fzFzuEYVv97CZrrksk1C3DSZ3M
ASM496zfDGnWumTXMVqrBPMcncc4PA/oKjki5cw4zdmjlfj5oeta5ocKWkUMkKxANuYKc70P
c+wroPg54LvfC/hGaDUNhllMbII3yAAgB7V2eofFCy8Eaa324ZhYBs+WzY5A7Ed8VBp3xLtf
H1kLyyXESgDJjKk5GQcEmt3BaXFeTjZG1JLMNMMe75SMYwPavIfjp4X1LxVokSWccTiGMAF3
24O9Sf0Ar1iVsacgPQj+gqjqPxK03wBo8818XxsLgCMtkDA7EetDi7aGSOO+F3hXUvD/AIVs
49QSLa8CYMb5zjOf5ivQhI66W0anCBcY/Gs3SviTbeP9IjvLIYtgg6xlSM8dye6mrk779LkT
OCy4FVSSRU7t6nlPx+8Naj4m8MaXDZxxyNHOzje+0fcNX/hL4T1bQPB8CapHCB5a7BE+cHLn
n8DXb3nxP034faOsuqbvLVCsRWMt8wBJ6EU/S/ida/EjR/tFmMQovmcxlDjkdyfSpkveTK5n
bQ8t/aJlMPhvTprUYKzs77vQIasfDfxani7SUUyYYAsmE287yKqfH6d4fCcLsuFl81QP+AHN
eZfDj7dZywy6YVyGG5JMc/Px1/xrlrStI3pR5oanp3xE8JR6tm+jXF4qDJ34HAbHH5V4xJAy
zFeAccjPSvq260dbuF7q5IjgjQtLgnoOuMZ7V8y+Lr62uPE039ng/ZdidQeuBnrzXBiqfNFS
LoT5ZWOv+CQEXiqMZxIEkP4bRXtvjBiLHU2iPO1MZ/3krxP4Kr5vipFJxcbJM+mNor2bxe4G
laiMYkITntjcldOH0hoTXaPkKw+W4vZh/FcPke5NXiN+QvU1TsZUe7vYsHzBM5bPTOeatv8A
IhB4rwpyvKyOyDSSAnOVkOR2rsPC3xS1vwVZTwaIY1M+0yGWJWGVHHU+5rjmbzEz6UsTvzsw
WFaQlZlNcysei+DIdb+ImrK2p+T9nhmGBHhM/wAXuewr2TxZrkHw+8EMMlZhD+6O3eA2EX+o
rD+AFhJJ4M1K4j27C0bMSenyCsv9pJ1XwvajzVZhHnaAc8PH6ivfpSShzM86pH37Hh+q6nPr
Op3eoXRV5p5GcFRjAJ44+mKp8bWI6+9NjYy28TH+4P5Ch3VBya+dqyc5XPRpxsizAu+M7/Tt
Xv8A8B40XRbuYjLLBgf99N/hXz9FL+6dvRc1738DyLnw7O2dqrCG+vL16WDs3YzrJ8jIP2gt
Gn1/wxYtbRedJFK7EMwXA2HnqPStT4ReEb/wv4ami1SNAGXEflvu+bc55x9a7HU/iBofgPSH
vtXWRYJVZUEaM5JAJPQ+1T6F8U7b4paS8tkv7iBTICYyh6sO5PcGvYt7ykeZFycWjG1vwvpf
iqye21Ay/MhXCMV+Ugj0/wBo15l4s+FljZ2kjaGjiQRkjzZc5bDevb7tbvxV1+78NwWs9uyq
fMQt8objDk9fpXZeBL+w8Y2aXUW54ctuIBXgEA9frRUipys0ON0ro8v+HXwes/GdhHNrMRjb
a+RHMV6NgdM+ta+ufCbwmt+ujWqXbttEkjGU4A5PBI/3e3eu4+NnjLSPh74eFxpsLqzmPajq
zk5Zgerf7PrXKfAnVBrum3Go3482V3cZxt6bAOBx2rndFRZrzSlqbll8F/hro9tGbwXplIA2
iaQjp7D2NZPiD4SeECpGgw3jXROV82Y7Mc5689K9I8QWng2wtRda1LdR4A5j3Hr06D1zWHq3
x7+GXhuw3Wf2t7yIhVbyJSMdD1IFdU6cGkrHOry2PmaDSbuPxNLpM0Ss6u44boBu75/2a+kv
hV8GNFs2OpXG5ZVIOBM5PKEdMY71yvg/RrTX7q78QxRsBcMJMliMBtzDj/gddlNfyQ3EaRNt
U5zxXPRpRjdm86j5eUT4vXdvNo2qG0D+WLd9+/1yelfOnw48Cf8ACZarfQzgNC10Qf3m3g5P
b6V7l47BfwhrUnQC2cH34Nc18AYlGgarOR8yXI59tgp1o80oroTSvDY6yL4JfD7SNPtYNWlu
RM6hdqSyFQeOBhfcVQ1n9nvweNPu5dCFx9oeNjG0s7bckd8j3Nc58e7mS2sra6V9oiaN4yBn
ndD1z7156vxX1mOwjhjaPy1UKS0Q5z+NTUcKdolwU6ivc9V+HF2vhyO90OQ5mtD5Um0ZH3mx
g/Q1b8ZfDzXvH8tpLpEMDRwSh2E0oQ4wB/MGsX4V+Hftr3GvTOWubhEeRQcDJJIwMf7PrXWe
LvjBqvgJrCwsY1xNKqEmNW2rgE8lhz8wrWlZx0IqXv5nTX3/ABSugJJeDZNCrsQPmAxlu34V
8w6feaN488c3M99JL/ZoiAR4wVbJ8sHIxn+E19C65ZNrFpHcTyF45gwwMDOOPSvE4fhdFrnj
aWxAMVqqqxIl9dg7gnuaipeSsi6TUZe8eo6B8Pvhbf6NJaxT3st1GWdtrSDjHTlQO4rzrx/8
LrDSdMubvw7FIlqqH/j6ly2QjE/yFe5+DPh34K8ERrNFLcyXYJ6u7ZGQR/CB/CKpePZUXSbt
7NPLtSjZByT9w56k1Kw6tcxlU97Q8i/Zw0m5u72G4RB9kDTBgWG7dtH/ANavZPiHpN5Bp0tz
a7VyyBS579x+hryL9nDxVdMz2QkG/wAyV1Gwf3U7/nXtHjzxJcWvhOaWQ/v1kQKqqMdf8M1r
ThyQZtWbdj5Su/FWsvqt3b3ptl8tmXEanoGx/Ou6/Z58MTxa+l5ZqDcyLIRvfjaUU15HLJca
s11dyENcTuWJ4A5O48fWvbv2fPFFw80Fup2CFGjL7R1VFH+eK86k+epqdcF+7bPUvG2j3OnW
RMRAnkJI3EEfeXPb3NfMXiHxXrFrrMtncyQKy5+4mf4mH9K+rfHPimWXwtNMxBlQgKwXp8yZ
r4uE76jdXN9cHdO8rcqMDk56fia7cVP2cEctFXkex/s2aA9vrDzbctNcnnd6xnH869Y+IOi3
llbXcmRHKQzxYIIPPevOPgRrt3aFLKJgWMgz8o/uY/pXqfxM8VTx+AtVZj+9tomONo55X/Cr
oP3boVe/MkfLXiLxZqCand2N20W/cyHYnX8fyrm3kMrMWOT1FOurg6ne3N7Kf3krs2MYxyR/
KochfUCvAxVTnmzupK0Rrb3PIGAeKWRsKB0I5pc5HBzSZDYPcda5d1dG4eY2RwMGlMgHrTZX
BDcYIFInzqDjk9aiSdtAfclAIVu2aiO9ugAFOZyTtH3e9MMmOE/Wk/MNAALxnjnPFIsxLc9M
U5XZnA/hpJAM4UcmoemjEwdnCZyAe1RpI3cgg0/Bj5I59aCqoMkfMauL5WUnoKRwdv5Gk3bW
44J70zKyHP3WHFOjIbIPXtSk0w6DBw4PfvUhz1I+WkRNp2k0oLKG9BVLVaCuhElTawP5U0SB
e3FLnfyOlBQAZ7jkUOyVmJvqSrcZ4xRJIu1hzUYbI57DNOG1h9aSVkLcCuDgU5ScFWOcc/So
2WRSBkY9aUdcDvVWtGwX7iZL4GeD6UbRFx3PemAFj93DVIrVSdtx7PQkEn8Q6dKjZkkfoc+t
MR9wyOgp7uCm8Go+0y7ISNeSM5XNSNMUYBsY7VCeFBPH0pzMHY8cihJx1ZMtWOidXDn3pvmb
/lNC4UHPSjdk5I+mKzupMfqBiCrg8ntikQ/vFGM44pDk9Pxp6Ls5B+atna2hLYrgbz6DrQre
XuI6U2XHmZY80mV7E4HWpa0uO11oSPlxk+nFNjAGc9etMVsk4PHSnq5Xhu/ANRsw1QjxjaDn
5RQrK+AeFoIIQhuaXCsADnAq7pgIIwSSOnpSvtLc9RSb1jfAzQ7k/dGc9aTbT0IbYkpLDJPP
rSMCI8nk0Mdo9aPMbIyM5pyemhadhVXAPp7U9SeVz9KjEpIPy4H605MrHurJuSCTuJIm59o5
xTdm5gKccoe/1pHzuFa3ug20JGYxYx3FRvuk5bAoc5x60nIIY8hetSpaWHawmAHBzT3lUHAy
D60hIYZweelN3n7ppXtoV0sxcHkjlu9Lkd89OabuCnB6Hil6ZxyPU00jMdICzdfwqPYZSefl
pjsV5NPWYImcdeKEnqXYAu1MkgDFL8u3Bzml+/Gec1EFKD5uo6AU9ehNr6DjuXk4HpSl9oDN
1qOV8pk8k0sTZG98belS229BtWELsAWPFSMCsQz3pCM/Kx/KhCAcfw+9VfoADay4PWjzFjBC
jApCm7ocAdc0gj/hHTvRdJE6dRwAVT6nmmFgHWgJgn9KAACRQrFJ31FyFkPPJ9acWIHBFIsb
MCT92mvGoORmoS5txLewNhvm/iNHKhS2MCmIRvJB4HNOaXcuOtS7vQVnfUZyWwe9SYaNiF+7
QoI57015ySB0xWnK7aGovAI657Uk4YEnOaI5CfmPDdKk3AkiktGS2iIZlX0oK4+ZTub3p0gI
OB0qGQt1A5FWmnowS7k8EpAO/G32qGQsXJwD2Bp6gqgOOaA+VzjAJrLuFrsahAwp4Bp53K2T
09qYxDNnPIoDN8x4I71beugnpuKo8sAk+4p7TEr9aY/A6844pu4Y2knmpt3CWupIcbMDqeua
TYyqSOCOtNXAUio5n24pNu90LV6DgS7ZJ5PSgMVcg9jT4yHjBPUDNM3Y3HqfeqctLjasIzyF
jwAR61OF2rlvvD0quJHBJbHtQZDIePuii/bcLDw/mN833u+KQnJbA+tJGmCSRRy/UjBql5kt
WY5Uy2RxSg7GznmkjfC80bgx3ZyKehVncZMuTuH50KFXIb9KUdOOp9fSmnpxjNSrS2JbtoOD
SEl1/M0kbliQefSl8wLHz9407zpIlJGFNNpLcq/QA2FA6ZpTwjetMkuPMxk+x4pnnBWxng00
r6hZrVk0CdTnmk27X3dTUbPhgw69qcZDuByMmjqJ66jtu/cR19KblCGVz06D3pjqd2fWm4IY
HuTxU83RDcS0ygoO4qFGO4gj5aUnaQX5z6UJIhyBuzjqaafViinZ3FIZgST2pFRV5PXsKJWI
Xmm78mkhIlf51wOVqJE2Pg9BTmlxD8nUetNGW781BepKm5idoAb1qSJ3ZeMZB61GJSiYU9PW
nRyELhT9aS8ieW+oOpG48Y74prYC8H86lYkDHBJ61CRkVpzaWkLfQcoyn6GlVQqndnPUUikI
pNO8xZVB5bbxVKTe2w2rCttaPvnFPRUKZP3gKhX7xx0FTRylQcDNRbUTEYBuAaVQWUjstNZx
uJxgmnI3ytmtWklcm+hH16U9mYKTnIHSmSSY+6MnvT1IfqflFTJt2sXa0SuRvBDdau2b4wue
c1VcgthenfNW7ZAD8vX3rNy5UZuNjeh+SLLdRVO8lDsc5x6CnwoyR5zhT2qOZQW7mrTXLcII
Au35l6deaVNrDKn5h0pjZReelNU5GR0rFNNF7kpbauB36mpFl2cE5NNEojXA6GmqCW3EZB9K
h6vQa94txkvjAxU5yqgHqelVkIaM9c461JGSMd8U7uw7cpdiZgyjA/Cta0Yrgn7vWsW3ZvN3
npmteAsyhs8GpknFlc1zTjnyRg4HbIrf0Im4O3OCCB+prmLfBPI6V0Xhy4b+07WIjEe5efX5
h/jXLWb5W0aRPuz9mzwr/Y0F7dsuHeIRk78/xsen4V7apJznrXE/CHZ/wi6FO+c/99vXbing
YrkchVXrYWiiivUMAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK
KKAExjpXN+J/CFvrlvMSpMzKQMuQDzn/ABrpaQjNRKKkhp2PjD4jfBnUvB3iS68V+H2C30Ej
TvDNKrI2AAQAR3Bb+Ida7b4QftEJqMlvo+okxajHtimjFv8AKHG7O0gnjivofX9Fh1yxeGYM
SEYJtbHJ9fyFfLXxa+BtzY6lda7pX+j6rAxnjLzAqxG3GQQR0+nWuScb6S3NoyutT6m0nWYN
Ut0kiYkldxBXFaIOa+R/gx8eLu01WbQNaYQ6naqsRZIAVkIfB5Ukd17DrX1HoOuw61ZRyxsS
+wFsrjr6VdKo17s9yZR6o1qKQHIpa6zIKKKKACo54IrlCk8STR/3ZFDD8jUlFJpPRgeLfEb9
nuHxDdfbdEdbOVUH7pXWIMw3eid/l714ZeR3/he6NprMTQTjDBkcOpB6cgk+v5V9ud6oaxod
hr9q9vfW0U6MpU741bggjuD6mslB09Ysd7qzPka01yeJVa2mMQ5+dSyn9K9K8FfGW40eIW+p
FpkJbDkM+O/dvY9qy/H37NuoWN+974UIkhO0GGedU7YbgKo64715Rd3dz4YuTba0ghuFG4qh
3rg9OhNawxF/daM+S2x9o6J4u0vxDtFnMxdhkI8ZU9M+mK2MV8R2mqh2D2dzJFKB8rISvFeo
+GPjdqWiFUv/APSYFj2D7zkdMdXHp+tdDjF6xEm1ufRdFcpoHxP0HxDDmG5kjkGNySQsOcZ7
Aj1711mDWTTjuWJRRnNFSMKKKKACiiigAooooAKKKKACiiigArlPirj/AIQDVMnA/dc/9tUr
q65b4pAHwFqeeR+6/wDRqVy4jWJUdz81tGtzFb3EhPDTscZ+lOmPzAVX0pmltLk56XD4/wDH
akYNy36VrJK5NTR6lOcFSWPTtUBftzzVuXDcHn0qBvlVuOKu+mpmpaFds4PHBPOajkXjK9qc
pbc2DlaazbjSlroh7jHLsnHUVXeRVVs53YwasMwU4PIPFV5QOafKtyGuUoSDGO5z1Nauk4+1
w8c715/GsuV/mHTirukypHdxyMx2hgTjuAa66OrBvQ9ytv3dokpyU5/mf8K8p8eKBe4Y/Nle
T9DXsOgeIfD19AgurmSAjI2CI4Az14U+tc541svB95I80V5LLcKo274j1AOOSld1XVanGrqV
zxgqScUmMNgD65qzfbTMQOlVpE3RZHHNeQ04ux2p3QMhhb60HO1iOQexpkzMVwcZoGM43Gjm
tpYdnuhoYsvJwalVQcYPGKQfM/HWnsBzjpU8um5LlfQjyACTxUQwxJHI7+tDE4GOtP2fJnoc
c0+gWe4MdqHHpUYcj7x57U9cKDzmk25bJ/CtIu2jHsiQOHjAUfN3NQhWVj/dpzDA+bgHjim4
Cc5yDVuyQkyRAw5JqUfOQD9/+EeppbGNZZ1WRtqEjJ9BmvZfCGn+CrbbJdXcjOOeYdw+9/1z
roo0nLUU5uOxL4Bgki0yVnGAVcYJ+lc98UNbtoNPW2UsZGTZ93jJD4/nXa+LfiB4b061A0uQ
yMFwcwFRn5j6D2rwTVtQbUr55pA244Cq3QAD6n3rrqS5I2ORRdSWo21smf5I4y+P4QQP51a/
4R3VgxIt08teTlxn+ddF4A17T9B1aO4v03IFccR7uo4r1jXfjLoF1p8r2sTPI5C4a3wOCD6+
1c0YLVm0qjjsjxnw9dxWWrpHIf3mxiBjP+e9exXF9DdWsjDJWQDIx3yDXglxP5+tve8JndgL
xjJP+Nek+CfGVjbSiG/3GPaeAm45wP8ACuilL3mkRNOauc1ofgmS38V3F1LCgi3syHKkkHf/
AIivY/M8xd0nBwPwrRn8f+A9GtFMkhlZwDt+yEsOncqBXk3ivx/D4h1mEWP7q1QN91CnUnHG
fauxPuY2lI76dItPiklxiPDOcDvj/wDVXiXim+1LxH4mktbSBZ4IySSxwVy7Y6t/s9q998N+
P/CD2Xk6hJKkhABZrfcPu89jWzpvjb4caI9xcoUlfliTYkknB/2B605XnGwawZ80N4a1C2gM
88CIFGchwf61jyNskLOdqg9RXuXxR+MWjeIPDuraZo8OBPE8a5t9mM4xjnjvXN/DSz8JwWGn
Pq9xKLpArSRtFvXOSSPuHPbvXA6Si/dNozdm2HwshdXF192N1ADZ64b/AOtXRfELWIdF0wmX
J+1s0ajbnJKnH862fE3xV8DWWn/YbBNlzAGVWjstgJx3OB3xXhvi/W5PEuqW9x5p8mKbzI/v
D07HPpXSn7Na7k2c3crW/gXxH5EaQpbGIE5ZpecZrq/AFsLTxBc2YAWWHyywHuQev413HhP4
q6HDbi21l5QR0KQlu5znOexFdbc/Ef4b2kBlVsSc/wCrsSGY9hnZRGCeqKcpLRGVrKNdWEsM
Q3ykHr6YP+NeE3/w/wBcvGWOwWGKJCGLtLtY+o4+tdb8RviXYeIS0GjSyWyFQD8hjP3WB6H3
FdN4K+J+l2ljFZanLI21j84jLHBPqfqabmpe6ZxTjeRy3gSJ9M8VpYzcSiBpCQc9fevUfEaj
7JdFfuPtA+uR/hWrL8SPh/DA0hCmQcFhYnfjPrtryP4h/FLT/EObXQtyRAqctEYzxnOcH3Fa
P3UDvM49vBviCYzEx2y5csrGTnHatnwjp8mgeJY/tjAK0TZKndz/AJFdz4L+KWn29vFDrKtI
qpgssRc5Cgdz9a7qf4u/DixRZ5bcMcD7ungnn8KzhBasq8ktCpf3C29vPK2RuwQo78//AF6+
X1Qrqeqgclrl2+nzGvVfH3xU0/xU7R6SvlQKTtIiMZ5bPr6AVwnheKzgvCb9n8tjksgyTwfU
euK58RUt7qQ6SabbPSvg9A6208IH+sUEMT/0zNTfFUCHwzcREkzqJGU9uqf4Gur8PfEX4f8A
hHTnt3mlYyKDn7ISwIXGM7RXnPxW+JOl+KbSa00qPYjIyq5h2N94EHOfQVq2lT1ImpTmeXRt
5luC+M7Rn60jH5PakWFordQTn5eeajXduOf1rx5JanZy+YOPlG386FUg8+lITtJPc0bz1J6V
m1bVFvsPA3Z45oROcckjmmq4QZJ+lL8xAJ49xQkW9DofCjLDqMeeruP5r/hX0TPL9nmklfIT
yyDivm3w5fx6Xq8V44DBcBlZcjAYHp+FfQWm/HfwlsUX0BB6YSzyMZ+v1r2sJK0bHFWblsfP
GvxZ8SXLggo6rjH+6P8ACq8FxJbSJJE2GUnufQivTPiF8RPCuuWckej2KrdMUwzWipwOvNeR
28bwoNzFsepzXJWfLU5iqbbWp774X16LWbUbHYzovcEcYHc/WuO+KvhcajpjT2aATI6klsL3
OR0965jw3rzaZdqzMUTB+7n0+telXPxa8PQRATQ7nYDj7NkZ/P613RmpqxlODjK8TY+H7lvC
cag/MoQn8UX/AArzz9oy1XXdT0uG3yCYHDkYXJDA8+tHhvxzHpV7dPLxaySF0VVJABzgYzx2
r16x+Mfw8FsoltGkYAZMtgrHpW6aasiZRd+Znz5oPwO8T6hchoI7c2yyBiDcAMO49uwr3Xwh
pNxoOiPY3I2ypsU7WzyAAefwrB+Jv7QdjrmmzaPoIkiSeFovOMRjeM54wQ3AwPQ15/8AD3xM
fD8kx1O4klR5vNLZZyRjnrUJqGlynzTWp7FIh/tFMc8/0qj42Uf8IzqUakmV7dwQemcVIv7Q
HgqxtYYlgMl0o2kyWWefrmsrWPi7oF8kk8FuGaUH5GtsLnGOma2VVLQyUZdhfhkWTwnGh4ZO
CPT5nrmP2gpI7jStDiiBkuGuQhHuUwOTVXQ/iJZaHrt1d3n7uwncHy44yQOcnC544zXqdh8c
fh6LOF57RnYDKs9grHPrQlGpGz2LkmrM8Q0v4QeJ9XUsghII4AuMY5x3r2Twlo0/h+yngmxu
xzhs92P9ay/HX7Sul3ti1lopkRnDDcYGRhlcDBDDHJ/lXl/wz8QTeGrq5fUp2k88ICQWfgE5
6+xrJKNP3Uy/fqLU7D4vlLzULdg37tXjwD9Gr0uyH2ewsyc4YH/0Nv8ACq9n8c/h5DCIZ7Vn
lXJy9gGP51yHj79oLRb5fI0mArAybFAtihBIbJ+8B1NbOUdzDklsZPhiRrX4w3pkBJW14B5x
8if416X4iZkillkGBlc14P8ACfxHD4N8Qy6lqxNzAVdcsplJyqgcH3Fe7WX7Svw+hhEdzAzS
cnJ0/P60qdRNtlTi0kkS2cLLZR5ONwHOfauW0LxVYSape2RaT7SssjABPlwCByfzqv8AED9o
Hw9rGnG20CFowWU5Ft5THBOedwGMYrxbw3O+l63cag8ru0pcn5icbjmirVjAdODb1PU/jJ4T
1Hx/p8cdkyJLHGECvJsU/Op569ga6H4V6LL4d8NG0nVUkVY1baQeQoB6fSrXhf8AaE8G6RaL
HqUb+eMAulnuPC4POfXNUPHn7SGh6nALXRFfaw+d3tyjAhgRg7h2BrWMo/E2JqS0R1D+OdO8
46OS/wBvYAoPLOMcjr/wE1xHxN0G78S6PKluEaSNDhZGwD8wP9DXkfhm/m0zXrq/uJmlaWbe
uWLbRlj+H3q978JfHTwrpNqi6tCzzIFG9bTeQAuDyT65rH20amhcqXKk0VvhZpM2g+F0t50W
NhEC205AOWPb61st8QNHmu5NFVpTqKYQjy/lzjPX6Vznj/8AaQ0TVLS5tdFgYW0iFGka2KMO
B/tDvu7V4fpF+0XiSTVI5GImm8wkk5wc/wCNU6sKVkCjKpK8j1f4r+F73xrpSW8KoTA7PGJG
xk7SMd66T4M+HbnQvDkdjerHHIIgpEZyM7m/xqbwf8efCukadDbahHIbiFAsrLa7skH1zzWR
8RP2j9A1e1+waNE43E/M1sUb7uOu7pk/ypuSl7xnaT91HGftB+MIfEtvpOgW/NylySPlK8Mo
HJJ9XFdz8JvAi6dE0zxphFyCMHneT6e1eQeAtSs9L8SHUtZVrhAq53KJOjKc4Pstes+Kf2k9
Gms5dP0eDaJlZCRbFCAVx/eHdq5vaXk7mvJKCsjnvjp8Ry06adpMjhXCK5YMowwcEjBHPI7V
5HbQeSgSNQAOadeXDTyNNKzSMxHLHPbHf6U6wkjNxGZWIjDDdj0zXBWq+0qW6I6YwUdTuvgf
cLc+IdoyXLSfP3/1Y4zXufjy3ey0u+gf/W4QsM9ty1yfgT40/DvwWyC9tn3DdyLBXbn3qP4k
ftGaH4qtZLfRbZZEYod0lqUc45Izu6ZxXdTmox1OWpebsfNekDJvicFzcvz7cVcYs2d3WgFY
2k28BmLUEnB4yPevEceaVzujpEahZepwBT4RudiBg0OBIO9NEYcMpYhc9e9FinI6XRNG8Z3l
pcpobYspQofZdGMjOdvG4dvameI/APi/wpYw6j4ilzZTj5Q10ZT/AAjpk93WvT/hd8dNL8Ae
GLvTtQ3GSRU8siFnHyrjk59hXOfFv42N8UNLWxiRVtYF2IRGyZ+dSM5Y/wBxe1etdKGrMG25
6Hl+wPuI+7TGiyegI96dGSkaqeuMUoYjPqa8uSOq7RPFHvTyycArg49K9r+Duv20Olz2TZEk
cIUAL1wWHJ/KvDS5zjJyK2vD+rvo1yk4LbWK7iPQHPqK2wtVU3YyqLmjY9c+K3h268caLDbR
bA0LtIodsDJUj3rf+DOj3Ph/RbqC8hSCUxEN5ZBB+Zj29iKPC3xy8GaeM30crSHqRabgOe34
Yqh4+/aT0TVLKTT9JDtK4IBa3ZCMrjruHc17t4v3rnn2lG8Uct8TtQbxhq0Wj2ikzRlHYt8o
AwR1J/2xXtnw60vTfBunFL0GANvyIlByCR6D2NeI/CHx94d8C6a0/iFJJ79ndgfIE3ddvJ/3
fWs/4vfGj/hPZtulBrcBFUlEMQIw2c/N6t+lTGtG/O2Dpu3Keu/EnT7PxwZoYk3wOE2mRQD8
vPcHvmsH4YaFc+GdHms7tVjmRmwEYEclT1H41zPg74p6Vpfh2O0vmke98xnBMRb5c9zn61qn
47aXcTKoC+WPvZt2z39/pWntVPUn2coaIzv2n5o5fAsMZVpJGaAErjPVj1P0rznRPghr+szr
EtpAoKkgNMgJGPxr6Ksfjf8ADyGxAuoWkORkS2Ac9B7Vj+Ov2nNCax+z6L5plO0fNbsmACc4
O4egpVIwlq2VFSjpYt+AtIn8LaM9hcABo9keFbIBVQCP0q9cRF7pMdCDzXhnw18ZS6Lc3k99
K0izS+Zhtz9QevPuK9g/4Xx4FsIBlJ2Y9S9mDRTqwtyk1KT5iTx4/wDxR+qwDIP2eQn34/8A
rVzPwLbyvDGsA8AXIz/3yKt618bfCV9bu8cTlShGDa8HPqM+9cV4U+I9tpGv3L+WBpF1P5rr
HH90Zb+HPXBXselTUmuZPsVCm0bHxtne7gt7aGMzeayR4OBgkxAdT61wGm/BDxTrU8U8KQ+T
kOsZuAOnIBHTtX0Npvxu+H8UEYmti0igHc9gCc/WsH4hftNaFLpN3o+gpKJZ4mi3G3MewkDG
0hhjqe1RKMZe/JlR546JGh4A0q78K6KbS/QJP5aodjBhld2en1rhvjNOkWpaRM/+pNwAW99q
/wCBrmvhz4+Xw9eXVxqk0kovHPytukxlyc9euDXuek/GD4fLaQ/bYt7qoZzJY7yp79jVU5q1
kTUhLctyQlNJsBnhy4GP96sTSI47fULxgQzYT5gOelc98R/j3o2sWD2ehReUGVwp+zmMglcA
8N6k15j8NPFX/CKusWpTsykjLLufPzk/yNbSqRgkhRpuW57peBrnVIm6qNvX607xbKI9FvED
EysrKE7coaoR/HXwNpFuDNHNI3O4tZhiP8gVnaj8bvB99Obi1hkliYBdstoP5ZodRWuY+zle
yPO/2aI5D4l8nywrDzTu4z9xeM17R8TMS+HLuVsrteMEfiP8a5LwV8SvBnhjVLjULm2a3dmO
1YbRdoBRR0HuDXW+Of2jvh/f2PlWtszoSpO6wA5yff6VlTkrSZrUjJux8g6GGEMoYnJkLYB9
hXsH7ParNqojUYyJCT/wFa808SSRXPiGe9slEVtKWPlgbRyxPQe2K9w+EHxE8K+CFtru/t3M
0cZVl+zK65KKD+ua8yk17U63dR1O1+ICfY/B8yHIZ2Dcem6OvkLRWxAe6luB+FfXPjT9o34f
6hElvawPKuMtusMc5Hr9K+YvFd3FqmvS3llEkEJ3bY0XZ1Zj0HsR+VdWLkpRS7GFDmi3c9O/
Z8tpI9dbcAHeU7cHr+7avSPi8DB4Q1cOCNsLkn8R/hXLfBzx34Y8E+Xd6ksj+Wyk/uA+Pkwf
1Ndf4/8A2hvAmpWEkFvE0zzKwxJY8cketdOHcVTux11JyTSPki0gdI5JXwBJI7Jz23H+mKc2
TjgYHWr3iKSPUfEt9fW/yWcsm+KMDaFBH93tVTadrHp6V89Usps66eyuNx3UChWJyMDPOaRQ
WOO9Ok9OmK51szZtEKZwSygfSnTRSEfIAMdc06Nsk45HvSyEMD1GPSqV7kLe4BS+SMUhTYMD
HFJHlOSePSmyhVOdxz0wKzkk2Wtwxu+Y4xTVUxgk/ep6Od2TjOOlNSRQxH3hVuN9Bt2E5bg0
i7iw6UEM0hxQqk8E0SmrAxWjBHJ5pGU/KV+7jnFBfc23A44qVMlsYAxRuSmyBMAjIpyuVL8Z
J6Zpxyz9AMUsoJZSBjA5pK60G3ZkJcrIN3ANOdtvPak27pCaCp3j5RxTTu7sHqG8bckcGnpj
Yf0pu3qSABRgDmpk7u4Dcu3QinCVVfr+VOEe1c0iusZ4HPbitPiQ7cw4LuUkcH1qNCQpNKzm
Wmr94hvu4zWbdmV8JJG4LZxxSYBBXrj1pyDKnPWmAblyv3vWhK92TdWEb5WHrigSYVlHX1qU
q3lYA+aqy/INx6Z5rRWaDcexyBUxJCg8GmhQ4JHQ9KUkcgdvWsWrvQegxoyCcdP5U5WwCBnN
N3gHOT704gudw6etW9tCXEVjlOR0ppO7OO44FOJ4HqKZgklvSqvpqCTWgJEVBPHAyaGcYU4o
D4HTmkIyCTnOCahqzuyvUQM3Apxc5zgYpIQSvPWlZ9zDjGDmizTsTdXG5BPA/OpNi4ZunFNk
Qvy3X2prbxz2+tQneQW6kgIPYAio3c7cDtQmfvOfmz0FDORyoGK0VoscbXHSEqQQcn0pJJPM
QYqQyh0xjFROpdvl4NTZroTsxNwVerZIoZCFzn60NknI7DmlVSAR1o6FNW1Q0uECcZ96XJLY
7E0MNwJBwRQqsRn86Fa9ir33Ax7m9hTyRsIOOlRmQszIoOaBE3bn1yaqSFawrLvUAY4pnO3H
4CpUymc0x33HaR9KFZ2TBO7shWJ4B59c0h4GGUYBoZQuDngU2WXzh1wKWivYe2gry+W+0DCg
ZpSGZDgfhSo6sDz+NMfcx+XIAPrWbEKEIQE9e9OIEZ56UvDHdjgdqiyJ5GwcrihXV2xyQ1XB
6U+SbYM44xTfLCjBYgEVLHgpg8j3pXvqTcjIMnI59qUgk8nFRsDG/wAp4PNLtDR9TmtJNtaj
SHMCTgc5/SkwN/HanI4HHRiOKZnLHJwB1rNPXUoechCO/amHLfJyKewPy4JweuTTW2Z68jrV
3YupHGhUsKlWT5cFRxxnFMkYMvB49qaP3g2jqK10S0Jd29SVuFHHWgSDv9002UsoweoqJsSj
gnA5zUSdirEuwg8fl2phDN82RgUgbEY+tKEblj19M0Npq5NxcFVwfWh5C3A5NIz4PrSGVHBx
x74pc3NrYdubUcMv9KR8oxB+7TdpKYzz1odgMAn86lJN3I1W45jtAKjjrzS4L9MYpgHy4B/O
kUjnPWqb7DF8tgSCc8880sjEjgYUcE0qofm3HpSNyMZ4qVe2oosaHVQepBoEgY+oFIyqBjOD
UixhYtzdu9D8inYRypXgdelIrBBwBuzg0mQpJzwelNPH3uaObkIaew6RNxyD065p0OFJBHUV
Hgggr0HWnP0yCeat66lRWmopJUHPekzlCvf1pmxiMj8aBtA3HPXtSdkrlKz3FAI5/hFBTbz1
FOVipxgGl5Uck5zxzSi2U20w4YnFQ7Sq49aeWy2F+tPBEZJHJ96p+6yb31GKNyEAZPvU3ITB
54qJm3PkHaB2pJXBTg8USZNhGh+YMcYpQwUkuOB0xS7eB1zikBI4NPQpuw4yI4wByfakdGKg
EDjoRTchWzxinOcr14qX7uopbaBHgkrg5AoI+bmgDanuaaqbXBz1pXc9ELbcduySo49TUZTY
adO6A5OaOH5HI96pK2jHcAm77xzimugVcjj3qdYDsB96jmwRgZJHNS7CQ5TtjzilklBiKDA7
80y3kOzjlT61Lu2qCQBmnyxitRNtMiQYBwucVMIyw2sBnvioxKEBI4NTKTgkketQ1yu6FzND
clDz+FG8MM+npTHj4LEkU0ZPTpTS0H6EuMryc0RssSuG6npSMcKpHrQfmO49BVKGugRd9WKS
xjB/h70iOzAnoo6HvQ/TI4U0EEpzwB39ap2KvoIoy+OcnvUxTah9O1Rx9SO2OKkDZQila6Jb
GhHAUYwc9jTZUMZANSL8ykLy3fPamyDeducn3qSr3GuQxxyDU9orqccHnOTVeZgh2+npV6xj
3jJbrU31s9iE9DUt5D5fHJz3qG5ZicEBc96lVSLc46g9aglky/U9KrR7EryADcvXP1pEkByo
GcVEG2884pUAUeZ0FRKNkbw2JgME7qsRvtBqFGz9TTsbQdx5NZrmS0FdIep+YY9anDNtIPeo
A3IPepU5bvVL3dRO70LMLMzRqv41qwEqCOpFZKvtYD8jWvaD90DnkjmsXNlJWLcBO7PqK2LB
zFeWDk/Isilvb5hWJEGDdeM1pW07QTQydVBwR+I/wqalpQdjSO6P0j+BVys2kTgMT8oO09vn
evTV5FeK/s23H+gXEbHnysjP/XRv8a9qTpWOB0TX9dB1UOooor1jnCiiigAooooAKKKKACii
igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAA1Q1bTk1GzliKKzMMAsBxV+g80m
rqzA+Vvjv8Ip9RC3VlHFFfW8rSpIrKhOEyBnGeoXuOlUPgp8UZNFvR4f1eRl1KyVEPDOGw/9
7cc8FfTrX1Hr+jrrFp5bYyobbnvkfSvlf45/Cu8+2f2jpkcUF/bys5cOELgKCMkDJOVHeuCU
LvkZ0KVz6p0vWYtUj3Iee42kd60w2a+Wvgb8YYdYlazllkF7EoMq7GxgyHHOTngivpmxvI7u
PzIySvuP8+lKhVkpezmKcLK5dooor0TAKKKKACiiigA6VkeIfCmleJ7SSDUbKCYPgmRokZuD
kcsDWvRSauB85eK/2WE020a70DVbl7hXGIGRFG05zzuXpxXi94db0C7MN/bLCwz83mBu5HZj
6GvvXoaz9a0DT/ENq9vf2kNwjY5kjViMHIxkGo96K91jv3Piq11JJOY3/eH+MAgiuu8O/FLX
vDEZjS5e6iJyFmlk9Mf3vpXoPjL9lrTb9nu9D1G4sZsf8e4jj2sS3JBGzGAT+VeIeKvDfiH4
f3Jh1C1WVSTtcyLnAO3s7e1KOKadrDcU0fRXhL9oKy1qaKDULeO1lkkCAxlyAD7bT/OvUtO1
K11aEy2kvmxg4J2ke/cCvhGy12G8yrxpu6dCefyrd0XxHfaJdRTWM0kIVw+xZGVSR0yARXY1
Geuxm9GfbRGKK+ePD37Q+rWQhg1Cwt5oFI3TmR9+3kk9TXqXhn4taH4jiB87yJTjCbHbJ577
B6VDg1sFztaKSJ1niSVG3I6hlOOoPSlPFZlBRRRQAUUUUAFFFFABXLfFEZ8B6n/2y/8ARqV1
Nct8Uf8AkQ9T/wC2X/o1K5sR8A1ufmfo37uK6X/pux/lU0vy/dY4PWm6YPNtrhsYZZmU+/Sl
kbYwwMg9TWzSewT1dyrM4Rgo796rlssfap3ODnpmoSwLHjp1q00Y2tqQyJhvrTHhBU81M4PY
cVWmbn6VN+wXGFRH05NRT42c9TUoYNv3DHHWq0qn8KVutwtfcozr5g54FNQ+Uo+Y5qS4ByM9
BVZpN7elarXS5XL0JLm1S9ADO6dvkOKdb2MNouYyXPctQAUz83PpSup7HH0qnNrQUktETFTI
uM8DvTG5ypJyKcoaLjqPemu2W6D60lq7k7MAxVScD60wQs2c9M03aVPWlEhVahWd2aths4OD
xSmYAcDA9aRjgDjg03djBI5q4p7sykr6hvyeD7UEFW9c9aQP5j+mOOKRiFJHUnv6UXUXqh2d
hSmckdRSA8ZHJo3kZAxkfrQCMBidpNU3zIEtAIZsA9KazhDgjpxT2baCSeDUSrub1HbNZ27l
IkhYnJA69KimtVujh3faOgzxUoUDBp2DuxW0ZNLQhpXKi6XbxT+aVy+R1x/hVpgC+en0pQSQ
cAE04Z2HH61HM5A1bUY0SXMZWQBhnuM1EtvHbthEUe4AFTLKSOQBSuuGB70KpZ8rEtWIQpHD
fNSTRR3HLjcRxuppxuz0PpSpJhSD2ojO4yFdOtoyXaBJP99Qf6VMkCIp2xogPYKOKkilCqwA
B5oALqe1Xzu4kupA1pbyRFXiT67Rmqo0e1RwyKc554H+FaWCvB5xSbNyt2oVST6juiFYVQr5
aKuO4GKe8W8EMoOepxzT44yinnPtSSHAHqKjmcXoPRkKQwwsQI046kqM1KSFw2PkPQU8DemS
ABSeWvXtiqlOTIbsMa3gccwxse4KioWtbdsAQxxgHjaoFTnAGc8DmnBTMMdxyKrmaVkwS6jY
yYjwoA6Y7U12R2w0ak98ilZDGTuyD6U3GX64NRFuT0L5b6lRtDtZG8wRqCOwUf4VdU/JgAD2
FKqHZuHXpTV3L83f0pycluyUkmMuYTdx7GJC+xqC30iC3Q/uwwPZgDVw8r1PNMfKAjqM9afN
J6GyW6FB2jaqhR7UZ3cN92mNu4K9abJucjnA71Dmoy1M7WKcmi2jOz+WM5znaPX6VaRFiVY0
UKuOwxUqR8E5/A1DcnZgAde9R7RvctDwShPNNABcsTz1pvmZUA9cYpNuGyOtK9+orjmUNknp
URUcjsaV5cBgaaMbQadhu9rhxng5zUkjEdMdaXaAm4jIpvzY6cUpeQb6jjkjd0xUMlvb3IxJ
Eh4wcqD/AEqQoXAJ+U+lP8refSqhOzsTGyIYoYrdQIkVF/2RihpMD1we9SBNue/1puD949fS
nJtaj0CXDYOTio8GNshFYj+I9adt2ZbOeelKI88hifY0Kchxs3ccz7vkAyD1FQyWcM+DIqjH
ooqdR6mkkUBsdqtOUVYie41GVE2K24460PEskRDcjqcioiu1sAdTmpVBKkUuZtg0QLp1vyVj
RSerBBmni1ihXhFz64GasBDtAqMoSeRx3NXZvUhXVxqssoKOAVHYjNQy6fasSfJj9vkH+FWZ
QFVB+tNMTHoeDzSU2zVK6I4YYwT+7RD/ALKinzIrDbJ8wPY80ph28U1owEzySeOaHPzHykH2
GDB/dKD3+UVZjCKSERUI9BTjHuKgClZcLnaAc1KlJq4raDGfByRkehqs2nW0kpYwxliOuwVY
ePL/AD9KarErxwPSmpN6AtiBFgjmzHCkZHGVUD+lW0kI6fhTVAK5B4pGUqpx19aLu+oupHcw
QznDxI5PUsoNR2tjDa/6iJR6kKBUyncu09T3prIVGOV+lVeUV6ja7kjyFTxx7iobiCK6C+co
cjoSM/zpY8kjjHvTywCkY5qOZxkkVsrDVijgQKihF7BRgUjuQRjiiQFkB9PenxxBo85z7VTv
LXsRsVp7eGTcXiQk8kkA5pLW2htCzRoqsw5IUCrLxnow7cULEVxuHHak3Jsf2bke/IOORjmo
lVET9yirkc7RilkcYyo2+oFIrY7AZ71fM0gQwKxfcCcCpeTluhPGKbnseCalTAGQM8cGsJNv
UZUj2A7RDGT/AHyozUscUTcxoqEcfKuKS7ljj+VztY9hUkShY8gYHrQ7uIW7DG6ZPFNLBTjA
55pZW28daag3Y/vVNylEeCEUgnDHkU2IgZ3cZNOUFmJzx3pBwM4yD3NNImfujJ4vMbbIoPpk
Zp6xqse1FC8dhil/1mSOdtDJuTOMVfMwumM27EPf2NNJ3ctx6CjYCPvHJ7U12KNkcFf1qbdB
tjl4+Y8D1pwYucZ4pqvvBBABxnIoUAg+q81fNYm19SE6Tagsdo56/KP8Kkht4rfHkoqt3Krg
mlMhV+mfxpETPIz+JqXOVtyrJK4ksUNx80kKOR/eUGnKQnCDbz0FOduT0HHpTY1IBHb1o5mC
d0HmYbOwbj2NOeJAQ7AfTFNK5Q5PIPWkPJyTitVJ23JuVptItZGJeFBnkkKP8KmjgjtF2xoq
j1AAqRyFIx2pitklSc896I1HtcasTFht2NypqKGOK24WGPH+6KA247T+dRyJweSMdMd6nmsN
JMeyxFw4iRWXnhaUt5u5X+4eGFMicBcMPxNS4DY4wKFUb1YmrbEB021IP7tWz0BUcfpUkUcN
uh2RouPQAUpUuxUcY4oe2bGc8D9abm2nqNxW4GVnBXACkVVbSLXeztGMnk/KOf0qcR7Wxnr+
lSSkIADyKzi5LqLfQis7SG2JMSKv0UCpHMcvDgS45wwzQAVHAzx1zUYJzjHXuKu7Su2URizt
mk8xYkB9Ao/wqwiW6HAgjB9QgFAjU8A9KaysecnA70ObdkRoTXJjlBQqpHqRWbFpVvby7kjX
PqVFW2Tam4c0oG/knB9qpSa0Q0Ii4O4H2xTLsCSP94Aw9CM07jbknHvTZDtIBGaUZa6lPtYY
IYFxi3iB7EIM1NDc4Jx+JpvkkAEE4IzR5QL8HFQ5u75mJWIbqGK65kiUgewOaIbC2h+YQRjP
IO0cfpUrYXKg5J4pACMruIJ5qlLomJ2TF2KASPwGKYxJOMU9sKv+1TWJKZPGaxlJPQroOEuz
iopn3cYzn9KfjKA4oCd89aV7OyJ5VuMA6AnHuKfKMOB2pCNxyCcU7bhc9aSTWo+gwlQcZ7+l
MnAVhgn1p5OGHHNI5zJ1/CnblCKtqNVC60MkYGBTwd/GMEUnI+baM1SuEmRupA4JB9c0Q/xE
89+akcZTIz1okjIHPBNLTZgr2ISpZiSuWx60MqgfKxFTMm3ADHOKjYA8ZxTjdIptdB24gDjF
JL90Hr6USdMg1ERzkknHNKLs7kWY5Sq8nqf0pQ+7OPzojXfls49qAvzHa1NNXuW1qIeDljwa
UqWj44p4Ukc96UnaMYwOmaybvLQLkbKWx2NPYoMjODTgN2QOo5pWQY+Y4JrTdDv0IkXCgD86
m24GaYybCVLGm567jj2qLNoT8xXjypxxTAxEROBkHpSx8biDT0UsCAcGrUlaw07IjWQHjJoL
gfKQDUgXIJwN38qY6ANuyRijS+hKVxGPC7fmBoCH0xipShaM7B9SOKaibGOfwNFrlNKxCMAk
YznrUqgCM4/EUhQFw7Hmh3AUqp5NT1sS5McnKn27VG55GQOKFQqRk4pGQZzzn1rbpZFL3h6h
OSewpeCpxTUVm6jHbrTzDtXIzmsG77k21I1LKob1pZzjBPftTWQ7uTjHpSRAsQM5x61aXLuH
Khyy4OT9KJCqkc9utPcMc4XimDBAPf0NNWY7KwoXnOO3WkUhxnPPpTidvHWhlG046n0qNwsh
rLxjvUf32AXORUqRbeGJyaIogJDihzcXZitbUfwVx3FQbFboxPuakkXdkj5cccVHtIb0oauN
eYb9q49TUpAERpccepAzQOUbK80nZaktJkQYZyR0oLkfMKQQ7mPY0EH7g5HrTWqbZbCQ7lGT
tzzxSRpvHPT1pNgEgBPenYCOe/8As+lZyfRF7IJQAgApjRr1Pbtinv8AOo4xSNIwXBAz2NTG
8Vchp7kSN2HQ09228kcU9Fyfl4piEsTknmtuXnVxN2EfDrgEgU4Rgrjp9OKZKpVuCaerYAA6
0/Z2Vyr3Qs0Kqob+Hp0pAmDnPy0MzcZwB603cSduMmoeisC2Hf6zodvpioUO4kdhTiwVm5zz
SsQ6kr1NWkthvQYBz8wwD6Uq7Efj8jQF2jae/OaB8mSOWrOSS0E3cV3ZmGRx2pDgHBGM96Uy
FhzwfakfIjHeqSuFiZEREzgEHuRUOEZ2wcewphfbgZ4NJHIyuR2NTdvVC7jtrMo4+X605QuD
xwKVS29lJxjvScsvXBHOKmwa7MaI1ZtwOSPWiVi3Kcc9aeeVwcbqjDHbnHPTFa2W5SAsD93p
6mn/AHSEUZPX6Ugj+UYH4VJvxxmoaadyHpsRFS4yDgCmyLvwc5FPUYPBqOTeScDAqoybYkrv
UVFG1mzkg08YKe571HGu373FKMA5PAFPRe9cq2ogO0N6Y5oQkkDt/KlZFIYKxzjNNVAh+bPN
SpczJ3B4gxLBuRQFLcsx47dqcq9T0HrQvEvJ+WqTvoGq0EYjHPSmxkbiBg59aUx5lJDH1pzn
CA4HpUvsPXqI8QXp+NNzv47etSLHxnOc9zTM7WIxxVRe491YfhVU/Mce9P2K8JYdPSoFXzDz
kDFK0Rj+VTn3paEbEqOvJ7etRSNihFO8nPA7ClJLPjOMelDi2rodtbjAC2OODTyu72FDxh4s
Zx708JsUEnPHShLqPR6kbpuO0Hj1phhXH0qUbWBPTBpWOCT60rsUbjEIIODkCgAMwwSp7U8g
Krf3scVEqnPP1quaxdrg37ttzdjyTSuR5ZfPymkJDMNw6UKuSxPQdAarn6i0tYaoK443A9M0
pbnoBj0pcZ54z7UoQHd3OMmpcrD6CPGxG0c+5pRhRijcByCTmmo+ScjnFG4uW48McE4yR0Ga
h8wh9vXPrUm4KOlOGO9CaYNDEj3ZZjsXvip0AZuBxTSwjU5zjNNBIPt61m9dSNWSNHURQRnn
86VWO4DqTTyoHJ49q0Tadh26MWNN6sOuKRQEDY+b60qkoGx35pm3cM7jmolO6KceUeULHaOa
GXbwaRH2fNnr1pAfMdsH5e5FWnpcmzF3EDaOhpxAVcZ+ppyKIj6g9SaZLGN2Qev6UmwVhucr
weByDTkJZhk8UqRkA459c04xll+Xr3qYy1sVKSGygR9CTmhFG4Z6H07VIsZHDHg96a58kZBy
x9ad9bCeqGzIEkCA+9TWcZALDp6GqhJBxnn0qza5BK9/Sq23E9rGnCDJEvOFB7U+6U7AgPP6
06M+VCOBkHp61BcM7NkAAegqX3GtdCOVcLjPFPUGVSuOlKgOzcwyfSnBQCexqVJvcH5DlJGR
jr60Ek0yPltpPXoaQgmQgHBFU9WCsy2gGzJP41OmSuM496qqxXIpUlcvgKKlQ0HbqXoiRIFP
I9a0YAdpIJ+tZccWcNnB64rRtd23nOO3NYyaiPoXYeBnNa1jC000JHbBI/EVkQnMgB4Fatpy
20HHTmsJ6LQ2jLQ+4/2VNRNzA0md2+LbyTx++P8AhX0kThiK+Rf2UNTYXNxCQFKxKMDPeU19
dv1FYYGX7xp/1sKo7oKKKK9o5wooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooARhkVzvivw5HrNi56OgLHAHI2n1ro6QnB96iUeYadnc+Fvit4E
ufCOop4h0d5ILiJw80cZWNXjVAxB2kEj5Bxz1r2f4MfFlPE1isgO1DjKbnOPnYdx7Gu/+IHg
yC+09mChshgQVX+7Xxp4kS8+CXiO0vbNzJYXUixyxudoQLsbI2nn+LtXLUpuqrLdHTF8x+h9
FFFdpyhRRRQAUUUUAFFFFABRRRQAfpUc9vFdRlJ4o5k/uyKCP1qSik0nuB5l4y/Z+8M+LmeV
Q2l3ByQ9rFEoBJznG3J/OvG/Fv7OfiTwzOX0FrjWbc7iQQoIwcDjf6H07V9YmgHFY+ys7xZV
z4M1O01/QLiSDWNIurNYjh2kjbH58juPzqCDWbAOhaWNXzxzgr+nFfcWu+EdH8S2s0OoafbT
eaMNI0KM/boSD6CvHfFf7J+j6gb260vUJ7aeTLRweVGVU+gxtwOtHtKsdLCsnueX+HPG19o0
iyWGrTRoAMoZn24znHBHFeiaV+0PrFj5EEmlw38ZIDTmds4z17+v6V5T4i+CvjPwTPKY9Ou9
RslJAliUNkAZzhWbHf8AKufj1q60yXyL62msZF4InVlI/MCtI1Yp+8Dilqj7E0j4weH9QZku
ryDT342rJIfm/NR7fnXX2up2V8cW13BcHGcRSBv5GvhyPxJb3Mqu8kZI6FXyf88V2ugeN7vS
ZPMtNTmDYxiSZyMZz2IrVuL2E9HY+t8UV4voHx1ugscN9ZQyKDzKsrZPP4+p/KvQ9J+Imh6t
Gn+nRQTMceU5IxzjqQKOV9BXOlopkMsdwm+KRJU/vIwIp9SMK5j4nf8AIi6l/wBsv/RqV09c
t8UTt8Bamf8Arl/6NSuevbl1GtGfmjoR2x3w3f8ALdutOnOBnqPrUWjSAQXbAbibhvw6U+Qc
cjrzTatuKSuysRk9wM1DcD5sDipSCTknbio5ctngnA61SaQnorkOSKgY75CMAY71KFO7kkex
qOQAFsdau7lqkTe5FINrZJ69DUM5IGc59qkBLA55A7VFKTsOBn+lKMe4r2KE53Y7GpbC2E8h
VBvOORTJU+dcnI9q19AtgL7d0Bxnj3FdNKN5WYnJWZo6f8NfEmtkta6XNs7P5YI4/EetXLr4
NeJdMid7tOxJzsTAx7yH0r17QvE9zYW8ccapGrE5K5GMn2NeXfEf4ga3d6y0X2toYdqfKkj/
ADcHP8XvXXKioLmZzc7bscJNC1pIUlbO3rUZYMPUU6eXzwWc5J9etQhgVOSB7VxbM2SuNJJB
9KJCQAcZ9hSx4OSTwO1K5H8OD9anTuW32FR9wOeRShgSQpz9abgY4qIAruzkemKb1WgmxVww
9DTjyvPHvTARzjnHWnb96N09Kjfcq77A2OORj1pCeM9fSmqe3X0zT9oOB0pwvfVEN2GjjPy8
H9KXJPQYHTimu2CRgnFPAOF49605bvUpaK5LZWclzIUiUufpmuw0r4L+IfEoJhaSHjJ2oB3x
3cU/wDpEN3qTLI2zdtA4B53Yr1Y6vd6Lp0728kiOikgK5XPBPavQpUItK5zVarT0PL7n9nPx
BpsJea9dVHOXaMf+1PauU1jQptHk8uZugzuGAO59TXs/hzxTqPiPTle/uJG3FhgyMy9cdyfU
1zPxU0WGz0uaVSWlERYDA/uvj+VFWhGN5Ec8urPLC+AMpSsBjd0qJJ/PiVgOD3FPJLZwPwrg
dkdl7oInMgI2EY74roNK8Ganrkix2sEjArnIj3Hp6ZHtUeiaX/aEyIoyvOcAc8V7X4WT/hHU
+0JGpkVcbJF9cDtXZRoJu5jOolucNcfs5eJbWJbmaVoo2G7GYxwf+2nvXI6r4YutEO243HPQ
qnbOOxNerD4u3XifVbmya42JCdm1JnweW7H/AHalv9IW8ytxBuPbcoPf3rplh4LYw5pLc870
T4Ma74wCvbieGEnAZUAyCM9SwrUvf2aNesY2ma/mWONdzjMY/wDalb0vxxk8HQNYWFrbSkKV
JJZShxtHI4HT9Kf4J8da74nuL2TUbmVLeZ/ki812XaQxGMsR3HbtQqMEJyk9bnm2qeELjQI2
WRpZ/LOCxGe/sT61oaJ8LNU8YeT9kZkjcA/dAJBGepYehr1HVdN0+5ilS6cBn4A4ySfw+lXt
JK6LYAWsjRmOP5Sp2k4B9Kr6rFsartK1jzq7/Zo1e1j86bVZ4lAz5bvGF9cf6yuW1nwRN4d3
CWV59p2grhhwM9QTXqej+LNT17XNQtbq6leKNwqoZGI646E1L4htLa3s7ia4iEwTI2sBjoT6
H0pyw0dh+0Z5t4f+Emp+Mtv2VZ1XqcKMYzjuRXQXf7K+oW0DSpq9xa7edu6MA8eu8Vetf2g4
NAsQujaTalmBHAcep6hR3o8F/EbXfGt9Kt1ctHbnZhVmdupwerf0qFQprqU3LdbHn+s+BLrw
3Cxlklu3Ubtww3YnsT6VZ8P/AAr1nxfAv2cvblmI+UDjnHUsPWvX73Sbe7iYSIJMjGNoP9Kv
aKo0qJUhLW3JI2nac59q09gr6Ee1kkcA/wCzFqlrB5kusTRTdPLZowMZ/wCulctrvw6vPCsZ
xI162R8+Vbr7qx9K9CTxjrWo+LprSa8leFYchfMc5OAc8t71t6jp8d3bOkvJOOWGf503Qpti
9o0rtnnWi/ALX9eIkMkkMTruAARfQ9C/vXRD9lJ1QfafE1xDJ/dKJx/5E+tdzpGrXNtFEv2u
SMBcffIxx9a8a+JXxC8Q/wDCRSW0etz2sAZiHiuJBnDOMYD+n8qSpU0m5C55zehd1j4LWOgo
+7xWlzMvRHaNe+OfnNcFpOmnV7h4EIjcMV5YDoCepwO1ULq61K/l8261a7kcj7vnMc9+5NW9
Pu2s38xTtbP3u/SuCSg5HUoyjueh6d+zjf3kJnGqSF8DbGrR4PH+/WD4w+GV74HtWnvJfMCj
cMlCcAgdmPrXovw71/ULvS5ZnupSNqlcO3y5X61m/GK6luPDTGdyzmJ8FiTkfLXTKjDlbRzy
nKMtzxcESfvAchhkVG43EsG6dqZA5W3jH8O0c/hUikZI4wevtXk2V3c71sRSFiRjk56U9QWH
zDB9KH+VuADz1xQxKnk0pJdB9LDS2wHvS538A5HY0hGSafEAoAPApw3sw6F7StNOrX4s0ZhM
w7e5A/rXp2h/syXmsbTqWqz2IbgbPLOBnGfv/X8q4jwXGv8AbavnEnAz7blr6Tg1a4jkmO9v
kjJVSx616tChTkrs5K0mtjwTxT8K9K8FW7ra+Il1KVCvyNJGWIb6MelcEPnG/p2wak8QS3En
i2+ka9uJBtUeQ8hKj5F5A/z1qNIWY8kgVyV1FzcEjWmny6sAjyNtRGdv7q0La6kzEjTLkgdf
kb/Cu+8F+Eft92krowG08FBxwOf1r1PxFqvh7wNpxuJ7CymfCqFnVccnrwvsa0WG0uyJT5XZ
HzdNayQNiVWRuuD2o6HHWrMk1zrk00wtpMtIzKsUbEYJyB0pYfCfjC9RpLLwvezxjjcEP/1q
ydJ9C+b+Z2KSqzP83FWILYSzIgbJdgoHqTSjR/EFmzvqmjSWEKgkySEcDucflXXfDPQtM13W
IJb7UEtIYJxjcAQ3Ge/0H51UaT5tVYvnVnZ3H6R8DtY8Tok1vNeRxPyQgAUA59WHpWd438EH
wHCLeeQyTJhTuKkkkr1wT/er650uXQvD3hmRNNvEvZZIQNwXGw89MD3P5V8w/HqWSe7+YndN
KTknnG6P+leg6HuuRxKpKVRJ7HH6LpMmrvsjBJwD8ozjNem+Gf2Ym8SWv2y91S6s0kTeoUIc
c+m7IpPhX4TVNItryTJLohyyjnJJ6/hW38RPihqHgaO1tLL94rEI2JWTYu0Eng+9TRoR+0XU
qNPlich4j+AsHhqFvsGqz30nOeUOOM84NcnoHge/129NtGZYsbQW2epx3Ir2vQr4+I7MXEf7
1G43A5zyR3+lbsHh220gefCipI/XCgYx06VrLDwb0MvayhoziYf2S9Hht/MvvE0ltcHJKs0P
Hpzu9BXPeIvglB4dyLTVZdRiUZB3IecE9AT6frW18WvEl9FrdvaxX8tvCzRkssrKWzuBHX/O
K7CG2W4tI3Y7sg5B5zya0lQSVkR7SXxHztYaVJqOotZvG8cwXcVA5HAr0zwx+y43ilPtl9q1
xbwnK7VVGAx7FqvaR4PjXxXcalk+WY/L27RjOF5q/wDFf4mah8M7CKPTUaTzWUFfOZAudxJ4
/wBwfnWdLCQT1NHVlJKxzfiD9n+y8IpJNpmotfsuAV/djgnB4Bz2H515hp1jLqWtyaesckbL
vydpzwfwr6E0W8k8RaVFdBy/mqCxB3DkBup+tV4fhlb2eqHVVGHIIKKqDrzn170Swylqhqq4
6M5rw7+yoPE0LX17qN1p1quMyYjI5Gecn1IH41xvjTwVpXhaEppmsQ6pgkHaybgQwHY+lem/
GH4r6h4B0O3srJtsNxEJZHMroE+ZQBwR6V87Wnl3ckjx6pcXe9y5Lzbhk+1ZVkqaVlqaU3Kb
u2WoCGRic9M4r0LwX8IYPHtj5z6v9iQYDIrR55Xd0LD+VcDFbSuG8pDK/QADqa9P+DNjr76r
HA1lLDA8gGecEbD71z4eipyuzecrK9xPEfwGtfC+mz6hFqctytrG0mMx4bA74NZng74PzfEG
GGZLmSzt5GKySKyYUbmGeSP7pr1z4jF7LwvqttKAGFvIHB6jArA+Ds00fhuPymZY/myQSP43
r0ZUIKSOKNSTuxrfsk+G7KENeeL5FkK8hzCMHH+9WXqn7P3hLSrfEfi2FyucFjDnpn+9VX9p
fXb6w0zRvseqSacxmxK8crIWHlg4OGGa8XtdV1PUI0E2s3EsQGQ/nsS2fqxrOsqcFor/ANeg
oRlLVyNrXNIW0vmgsC2oFf7g9gf5ms+PTNXfLSaRcxxL1kKnH8vr+Vdd4E1K1sNXaa6iju1f
aCJsHHzD1Br2qcaZfWssEVvai1mG0TJEMrwRnp7n8q4o0lU1udcpOnHufMjbVJDrtYVJZIsz
qC2CTxWv4v8ADsnh/UZVuFkRHK7GZcdV6foaxIAYG3559DXJ7JUp2expCSmj2Lwt+zhoviyI
Nc+IgpfdlsROVx06t/nNQ+J/2cbLwvbyXVhrD3MEe0DLxAEk4PAPvSfB7XbmTUtqzO6EuChZ
sD5Qf8K9O8YxAeFtQO4ttdMe3zJXq06UZRZyVZuL0Z8kQzm8ErKNpjlMZGfT/wDXU5mUHt+N
UNFHmRXUm7G6djtP4VaEfUMPxrxXGx3xd4k6Scg10ugeCbnxMVSF5Ez3RR6Z9R6VyUgJt2Cn
D9q+ivhXqvhW08JNNfXiafqOUCq3JxsXJBC+571vh4qctSKsmloVbX9lLQjpxkv/ABPJb3Dg
MNxhBB4zyT61geJP2fbLQUWTT9dm1MxqW8pTGd2O3Bra8d+NU13VtK0/Rb9p13KkjW7sDgOC
c9OoBrutLs49L06G+u90scMQeTzuRjb3r2vY09VHU4OeUdz5V1JDp+pz2kimOWNym1hz+VV3
AAySK2PiReWupfEDUbnTwrQNOxPlH5V+UcdB3z+VYyoSrZ+YH9K8OrFRk0jupyvG7G7mByDl
frT1fPsfWm7MLjP4GrCWF3LHm2tHuXI+6nFZqDmtDS9iuyFgcc4p6BjntitW08A+PNQj8y18
JXYX0ZM5/HI9KjvPBvivTlze6LPac/NvXHHX19K0+rTtdIzlWje1zM25cjGPfFSKVYFSRkU9
dP1CQgwafcXCHkPGCwP4gVLLol9psZfULSWyLHCiTv8A5wfypOjJ9B+0XcouD5nyjj0p/Lcd
qsxaHrl7NsstHubgkcYQ8+vamPpl/DL9ma1k+2kbvJAycev5VSpTWthucWVCWVvlGT6UGMue
m33ratPhz451NPNh8LXoh7TKmQf85qC68LeK9J3HU/DtxaKOjPxn0/rVOhPoiHUitLma52cg
cYpu4EY4OevtT5OAVOCe49KiRPLfLHr2NciVrpmqd9h0o+ZRn8amtkLSKpXIZgOmT1qKVPnG
Dk+gqe1WbfmNWd1IIA4ORzinFOTsxrU9J0D4Fax4r0+K6tUnjglUHzECAYOfVh6Vn/Ev4Ryf
CzR4bua7lupJAC6SsnynKDoCT/y0/Stzwd8a/Gnh/QpNMsfDE1xEsexZnErYA3HIxgd/0riv
HHjzxD4zke316wuLVGYAGRn2jleAHz/dUV6jpKNJtnHNuU9zl4ZGkUOq8MAeKeTn734VN/Y+
qKiLYabNeBwAuz07VY/4Qvxkyof+EaugX5UFetcEaEn0OhzUdygzHjgA0rFdybyApOM4q5L4
U8VabMRq2gT2KdncYHv39KrOpmTZHGJX/hUEcmq9lKLV0UmpbM9D0f8AZ+17xDaJewLcJAzF
cgLt4OD1YVnfFf4aXXww8v7W5+YKfnZD1DnorH+6a7LwL8cvGGjeGJtKHhWWYjzHSV1lZske
w9TXnfxA8ceIPHshPiKwksQqgK0rPgYBxw/+8xrvdKPJc5W5c9rmNZ2huziMbuD0Ga3bT4bX
urMGUXCq2eEUDp+NWPhr4b1G/wBRiR7KU2bK5E6jduI7fz/Kvp2Lw3c+H0I/sQYVeDJAAeT9
KnD4ZTbbLqVeTY+O9csItNvGthJ865AU45AJGePpVBUCAktvPoa6jxX8P9ch164v2srxrUlh
vZDtXLnH8x+dcun7xdynj1rlq0+SVuhpCfNHRjWJGMkjPYUMNn1PalK/3s+nNEalj3c1i4qW
xqvMXaBz1xSeXk+nerDWOqA4t9IubxDkgxKTk+nAPtSf2V4gyGk8P3cA7Bkbn9KpYeo9UiJz
UXYa1sjhG3/MtRSDaxz90d6stpOvvxFok7E98cUq6NfyKym2kkuVADwRjLK3oetHsal9EUpx
a1ZV+993JGMYFRvDkkbiD6ZrWTwL43khW4tfCt9LbtyrCMnI9ahudB1nTiG1HR7qyc/e8xDh
T+VaLDzWrRmqkb6MqxoFB35AA6V6R4Z+C83iyIPbSsEP3nUxjHJHcj0Nef29pJfowgHmsQcb
eea9++Cw16Jri2/s6VovK5cNgL855x7ZNbYei5O8kTUqNJ2OF8X/AAWufAdlJcSXLT2qKT5r
lCM7S2OGP9015XHOtxGrqvB9K+o/jJK0vga6smfzJgrscnkfu5B/WvmSy0HUorVY7SwmvRzh
1GB1rXF4ezXKjKjVbvzsjPB6bSabvL4U8fSpl03WySLjRriH3AJ/pUsWj38X7yawuIU/vyIQ
D+Yrz1RqPdHUqkOrLOjaWNZukskbbK4JVcgZwM9Tx2Nenaf+yzqN+pa9u7i2bbuTc0XzdPVv
Qn8q8u8OzuutowfyWjVtrg47EdfoTX114f165v8AR7WSaVzIgVMlyc/IOefrXoYajF7mFebt
eJ8peOPCV14F1O2srx1d5A/QqSNpx/CxrnZSQx+Wu6/aHeV/HcaLIcAzck9P3jdPyrkBpt7M
37mzkuVPOUH6VliKHJO0R0pOSuyBF3LzxSynbgdvWrUnhfxeYhLF4XvWi7SBSV/E49xVdtJ1
iyVm1Owe1GMkt0Ue/PrXOsPPdo1dSF9yAjDYHf8AWlwE9CT1qSFGl+4N/oVGanGm3k4/cWU8
0x4CLGef0qXS5nYfPbcrpz90da3tC8HXfiUiKFJMt/cXJ5OPWqFrprw3MMF0jWtw52iJ+obI
4x+Ir6C+E3hF9OgtriZCu9QyMyD5jvzW1HD+/sZTqcsTk7T9kfWL2F5rmSe32DIRljBPX1f2
/WuU8RfBi88IQvcmWWeMZB+4wGBu/hJ9DXsXjH9oTU7TxBa6XbW0UkUrhJZY5XVowdnJ/wC+
j+VaLQNrlnJDInnxzqVUsN2DyuRn61688NDlt1OT2sviufKUoO4sBwR1qPy8Hkn8a6fxh4Rv
PDWrNYx209wcKwBXkZHTj/PNc/NHJFMIJYmgmIz5cilWwfrXiVMPNScUjuhVUyWwtEupxEz7
CQfSu+0z9nPV/FESyJcTwQkn94Cg6dslxXEwaVqBXdDaTGUH5cKR+v519I/CfWNSvPDZW98y
0uEZyYfMJwNwx3962w+HvpJGdWajH3WeEeM/hJqnw4tGu9QnlNqCFHnFeckgYwx9PSsHTYFv
J1VfmBBxx7V7l+0Vb6trPh5FjsprmIeVgKSxJ3N2+hrxHwtA41C2inD28xBIikG0/dPY/j+V
b4jDKFuVEUqjktWeg6N+zjrniwLJaveWqNySFVQcjIxlhXQR/sfzvGRcavcW7jrlYzn/AMfr
2LTdQu7K20xLWV41a2TOxyuTt9jXzv8AFP49eL9D8ay2Ns+y2O/71zICMO4HAceg7V3Qw1NQ
cmZSqz5rIg8T/s/3nhKJ7k6wZliUt5cuxQwBx/z0rzmUIsssa4LIxViOmQa6DU/iHr/iKI/b
Lx5IiCNvmucg892NYBHzF9vzMST714uIUeb3Tspc6XvEbuQm3GB61LCjvtwOBj8av2OlS6ko
RYmLN93C102hfDLVr6WM/Z51hQht6p94deefbFRGk5LQtzjF6sy9J8G3uutGIg6biNoCZyc4
9RXXD9lfxJqNn9tjuLm33jf0RRjB7GQGvTvh/wCERpqGaeMq1ugbYyDsc5/T9alufj283iK+
8LiOG2W2+QTqzqzZwMen8X6V7FLCx5Lz0OKdVuVoHz54m+HOreCLfddOboZO4gA4AGc5Dt2r
n2AOChyD3Br6c1vw0/iXT7i1ljZ2dTsYgEk7SMDP1/SvnrVPD82lXUlsIZnMWM4jJ4Iz2HvX
NicOl70CqdZv3ZGHcMx4Bxn0q1a2rS7VClm74HvTTaPJKo8thkcAjnr6Vf05prG6jEtvLgON
xMbHjIz2rzo0pPodSmranT6D8INZ8VOrWSThiDyIwU468lgP1roJ/wBmHxVFGXed2HoQnH/k
Wut0n4/aP4Q0hbaws7aW4BLHIbdye+E9MVqeBfi/rfxLuHjks/sEZLAeTI/IUA9D7k/lXq0q
VPuctSc5baJHgHibwVf+EoHa8fzlVgCyqOOcdQzen61T0vS5NX2/Zh5h7FRntXvnxJ0fSJPC
d1FqN0tlcecjea4HA3dOnrnvWD8Bfhu2rRIZWREy2yRmj+ddi4PJ75pVcLG9ghWbTucHa/A/
xLqLNNCl0yqBlRDkc56/PXJ39k1veNbSMBPHlWTGCCCR6+xr7z8brbeGIYl0nyWyn7zaoHII
H8OPevh65019X8d3/lsXxK4bHrukNKrhowhcVPEOcrMm0jwLqPiNkht/MRnIUbI8nJ6Y5FdU
f2XvGIs/tKSXCx43ZeNQQMA9DKD3r1j4feHV8P6e2ryRgm0xJskQYOF/PvWjF8fP+EovbnQ4
I4bWRWMPymRWJyemQB/D71pDCRcbyKqVZOXuHzLr3hLUvCzS2+oKx8o7TJtwM8dfmPqO9YRk
G5cH/CvpDxv4YPivSryNogtxFG7eYqgtIRzyT1+7XztfWf2K8uLR/lmgdkKnrwa5sThlTV47
F0q11aRXZgGPI574ppbjHf1PegDJwT8w7GkbO7lePWvJdldHUmKZQuS/JPTNG/eRuwPagKG+
+MfWonjZW7/XNOyUbjTvqWCojDHg8d6ZlSATx9BSAnG0/N70ZKZOzPHpU3uKSYobefmxj1pQ
wUE9T6VDuLcY2g1KqkcYz7mrb2Q1puJkHhuh7UjMB90gUZ3NwOfSk8kFgQTmpsovQVhEkGT8
uD70yQEAnr7Cn8K/b6mlHIOeMU01cadhkYLDoQT604R4JGcfWhZGV8gDFOLeZnJwTSlZu4eo
FCAOfl700nC9foKR3Iyp/DJppDEjjkdOetXKyQJ3EdtxwB0pYkDe/qKUEDk4DelIoZWP+1+l
TyqSDUcdoO7BAPFEi7hgKPY0koOwBeQKZl84ORWaS6jtpceIygAJyPU00gAMCacWZm+7x7Uj
pwAPzq+mhLdxFyh5bn1pyudhJ596ao+X5+KUOFi5x9KSvJ6iGsRy3QegohYZO84HvQMv2+XH
Wh4weO3rTSsinZdRXA6KdwPeo/L46809EdQR2HQ0K4QHcOfelFXBpxIzwQKlJVUwTyaQLlTw
KRlxj2pu19RXuhmfvDkjpT9v7vG7ntQCobJIHoKVnAJ7A9DT00sPVojQnLbv1pHcjp69KUjP
TOBSum5Rjg+1V7w9B4cc84+lDpsGOpPem7flB/PFJnOeSR6ms2mpaCb7CeYFPPJqRiSmM4+t
RrEch+uOxFSuw284B+lE1oF0MWTaPu8+hp4kBXJXB9qiBfdymTUmAR1xTina4m+gx/ljx94+
9HmEc7iePWhhuGOnuKY0RRDglj7UXvqDfKShAVJyOaYvyH+tSqu9MZwajYHletNIi9mJlSw+
alLAd/pTNmw465HX0pcBSvOfrTluatoeAGjYd6YocAqcFfrTsAE46etM3FTU212sRew8Dgr0
poHl5A+bNN8xt3SnLkEsefxqJb7lX0HPKCMbQCO1NE6oO3+FRyZ+8Pm9SO1Cxhxk8UrWG1aI
8/M2QQRTuh+8MDpg9aEi+Q4xz7UhTYvJA5zmqjoyOZ20EZMkl2K+1SR/ux2K9qj5kTkYz3p6
xtu5ztFauz0GpaC4LDONo9aVRzkfrTjKJIjgAewqOORskbQaym9LInVu5MCo759qhZmccLip
Iznkio2Y7SwAPsKNI6Gjd9iSINxxwO9KTskznHPWmxSu8ZAFDKWHUgiqUbbkj2Kuc5zinqdq
krjP93FQKrY71L0GB1x1qXroJ6aCoxy2cD+VOOQMjgUxULDO7n0p+47CvBx2NJxsmD8h7zbQ
M4K015ew28etR7dqjPPPQ00DOSTinGGl2F7kEimSXPVh3q9aDY+SM81VIBPHA9RVuAsSAqlu
eSK0Kb0sbBYunAyPrUEqHcEz71KCcAL2qvJK7zcrtwOtRKL3MotoauQx5zj3p6SBsLj8abGA
BuJxz6UYzkqcU5JPUrcf948fpSyKXOQDxxUK7lIAO6pllZTjHWk7LRA12FiXAwTwepPapVYJ
9zn1qPeVXaUHPeljHBOfyqGm0V0LUJ43FufStOC5Ij6DGOuax1BHP86tpOBBjp75qeW2w0m9
TVgmByCRz3Bq5Dc+SOzZ4Ht71z8V4oU8gY6H1qxBe4YNvDegJrJIrma6H1j+yrrKrqFwqyiR
gsYbBOcGQ192NyQRX5ZfBz4k23w01O4vLiVTDMEUhy3G1s/wg+/avq/Rf26fB8sYjmuLVsfx
efID1946wpUp06vMldGrakrH09RXi+k/tbfD/Udvm6zZ2uf70rnHP+4K6i2/aB+Hd0uY/Fen
t9Gb/CvSv5GDVj0CiuUt/iv4OvCFi8Q2LE858zH6mtC38beHbo4i1yxb/t4UfzNLmDle5t0V
Qi8Q6TOcR6pZyH/ZuEP9auR3EM3+rmR/91gaq6BxaH0Uu2kwfSi6JCijB9KMUXAKKOlGaYBR
RRQAUUUUAFFFFABRRRQAUUUUAFFGaKACiijNABRRRmgAprUuaQ80ARyxrNE6MMqwINeL/FX4
ZQ6lYyRyw+fG4YAmNSPuY4zXtZOBWF4znt4NBma5IRlVjHnu208dK55fFpuXFtHQUUUV0EBR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAySJJ0KSosqHqrgEVzHiH4WeE/FEbi+0GxeUh
v3qRbGyRjJK4J/OuqorKVOM9x3sfOPi/9lOOKMTeHpz5gyfIVSOg45eXHUfrXjutfDn4g+GF
8+40fUGiJxlIgwHGf4c194VHc20N5H5dxDHPH/dkUMPyNJQcV7rBu+5+fcHiq/05v9JmkjZf
4HGPf0rqdN8fRsFY3G1s9Vcg9fUCvqbX/gl4K1+GUS6BZRTOpAljQoQcEA4UivC/F/7Jmp2t
7NJoN081uqhkjUBedvI+aXPUfrTVScfiQ7In0L4pXiEJaa9KijJ8ozFv0Neh6D8b70uBqGnG
aA5/frKDg9vlVP8AOa+W9X8E+MfB8xF3o2owOAD5yxHGD7rkdsVU0z4janpcwiuLiYRjJIk4
6++2rVWL6ktPsfccHxa8KtEGudWgs3IyUm3Lj8wP8iuR+JPxo8FXHha+sYddtLq5kKBYVZhn
EgJ+bGOx71822/xJ0i6YG7EV3x911J/9lrJ8SapoeoJutrKGGTjgA56nsQPWsqqUtLFLR6nl
ejwNbQXJk43zMwB9OKkdgck8VamUISBjGScVUmAXknHtVaPSRDepA+0k84HeoJHCghTyf0qR
ySCAPpUBA3deauMVuyLtkb5Kk9D/ADqHGXznPqKsMSQcjHvULYUHHDGpUm27DbRGMCRugHpU
M33WwMD+dTSHauQMtVeZ8qOcHuKNUT6lI4D56j0ra0KRZLtSp9Mr+NY0i4bI4B9q1fDqbb0M
eCccevIruw/dkTjoew2LhoIyBnB5H41478SZAPE8fl5SMrHgZ+tev2O544sfKW4OB715J43j
jl11fM4KqmCT35rtrv3LnLCK59TCY5PFNYKo+bp61JIqrwp3N61EyEgZb615nxbnW2lsIpHO
OBSvJsOTjFBHlnIGeKcYdyZI59M1GiZfkRmTn27U4fPkjOajQbeH+76mpEXYRhsA0pNrYNBr
YXPO329aRTtHTg050JJJXj1NJt3Dk9KE9dg5hpYBjxx608EFSc8djSYIOCKRmAXbjA9Ktt30
RL94IyGJB6j9akQ4kJP3ewqJUI+Yd6lD4A3Ln1NCnyvUls7DwXrEVlfBpHCcryT/ALVeuabp
zeJFdFuIo4WGCWlX6dCw96+eYZxE2VYitKw8Ua4khjh1OeFB0MbY/lXq0q6aUbGU6fMfQ2lf
DSLw7ZMjX0UiLll/eryevTefSvP/AInubixdd3IiIJ69n/xrW8Eapql9p0v9oXst3KA5Xefp
j+tYXxMDLoruX2P5LbiB7PW1VpxOdq0jydBGi4UBV7AU7le1JtTA2HKdqeqN1bgeteO1eR6N
rI6/wMyy6mqDgbGJ474FeyRWn22F415dhgEfUGvHfBEPl6h5gbkhgBjtgV7FFdDT1Zt20oOf
5V7FK1jhr3bOD8H/AAW1vT9b1K9u45xG87MjOmAVO7p83uK726Pk3KGbhQCDntXO6V8ZNZ1W
9urKTdtikKL90ZAzj+Af3a37lXvVJfJPeujTVGLu7XPC7DTW1nxTexyw+bF9oKnK5GNzGvYN
M0i20TRPNESQGJd+7pwFGB/n1rJ8J+FPsWoahNJH80twzoWHQckHr71lfE/xtBZGDQ7a5AuZ
kIdUbkYYA54/2W7/AErG3JqzX4kkjm9U8a3N542UJM/2GCUh1B+U/L9OxFeq+H7+z1q3t4xd
wwl1Ct5kgXAOfUivAQAkzYPzE5L9yfU1aS/ul2iG+mt2XoUcj9M1FPEp6s1dFNH0fpvw70vR
r241CLVYJ3uCGKq4OD1/vn+Vc58SB9m0S7SPkncd4PX5G/xrnfhfqeo3yypfXskqop2NIevz
kfyrb8fuzeHLlj8xXcB7jY3+FdUpqSujnlFxdjyDwT4cTXkW3LRxheru4XqxHcivctB+GOke
F4/tFtqkDOOfLR+eCT08w/y71896bcvYWcYjvDbuc/MrYJ5OO9ekfDq6v57uQX17cXCYG0Ss
eu761yU5KR0ST5DS8d+KNR0ONP7PgknViA7xn7qkNk9D0wK2/D2uW+vwxul9BsZseY0yqOuO
5FWtc023k8PXErRqzDcM7e2w18+2txcxWqw2d5Lboh/5ZMR7+vvW8qnLZy2MoLnuj6ktPh1o
8Wpf2pBrFnNP5fllBKv5/wCsx6dqqeJESxjkCujN8vKMD+ory34dXN99qQXGo3E8RD5V3Y8/
nXoHiONoNDnbLGQMuGJyeorVcpE4crN7w8PD2qwJnW7NG25+dgMcDjlh61g+Ivgb4V8Q3Zuh
rlo8mSfllPqT2lH96vnO3u7oib7Pq1xagyHAWZuP/Hq9D8AXuoNdqp1Ca8yrAqzluw9Sawbi
7o09nJO6IfFfw5j8POyWuLmMdJFO/wDix/eOK4GKQifkfuwSGGOlfRGrQRnSrwsqs6FQNy5/
iFfO21pL+82tsAmb5e3U1w1oqMka05tuzPaPhvIsGl3IAyj7cDsvy8VV+MY3eGEOcHy2wPUZ
Srvw4jUaPdFlwcJwR0+Wq3xcjH/CMJuOfkY7v7vKV1P+G7GM/jPFoE3wR5G1Qo6/SgRqrHFE
MgaFVzk4xkd6Y7sjcHOK8Zx1ud2wpP705yAOlMc7iMLjnvTsmTrwR3pwQ9DyB3qdErlbajQS
W9qemD0w1MXqR0NPXEZOO9VFXdx30Oq8GlXvo1CfvNw+YjtuFe9F2F3Pz8vln+leB+CJi+vx
xsMLwc/8CWvf7tQLu8KH5RASAB3wK92h8BxYh2Pl/Xodvim8lIwuxQT052rWr4b0h9RulXyz
IpDfw5FZfiBD/wAJDdFm+Qhcr/wEV2nw+12HT7xFdYgm1z86A/qRXHKK9s2zbmagmkeq6Nb2
fhjS2urqONFTAZnOOu0Y7968H8b+JLnxReyD7Q8lgDgAtuUkMSOeOxFey6nby67YPZSSMYZS
H4OM45HQj0rw3U7H+x9XFhLF5Nvztz043Af+g+tdlZtJKJyxfvansPw58LQQWSyzWkcoUKCW
Uf3P/r13Gt/GjRPBVzb2MmkW9qJQ3RtoO3jPEdYng6UrojpuwSwx7/KK8v8A2gYt+qWBVctH
HIGA653CnFRjFsUvena56z4q13wn4hsZmupLKFHhb5Bz157Ae1fPl1PFYeKTBps7fYTKWUxE
qoG5sfoBWS8k0gKSX8xBPKmZunp1q3ZRok0OBnLL+8POK4pVE2dVOn7PqfRXgieV/DtpvdnD
BeWbORuNeX/HsEa1bAfdLdO3SKvUPAgLeHLNQMkqu0/8CNeYfHjjUl7sGA+h/d16MnLkZzNr
2h6D8O2b/hE9NQAgCFPm9etP8dfB2/8AHf8AZ89uhWLz1aZwy/OmMEffHp2pPh8w/wCEH0oc
bxCmfXoax/il8V9Y8FxafZ2Us8aPIFLJLtwNoP8AdP8AerWnblImve0O7h8Mx+FLBbaBBDjP
Ccep9T61V1DxJaWrww310tqjtt3vnC57/lzVTRtZv9ZsFlvGcnOAzMGzyR/SuD/aD3WNtbmM
tEkkxUNGSv8Ayz9RQ5KKuRy3lZnq8vgLwZ4qeCa91/T7mWNwykyDPB46SD1rU1fSrHS18m2n
jnVVyGQYHOT6nvXyloA1KTULUwaneRxCRSVEzkEbhkfer6VupOUVWZk28EknufWqhUUlcdWn
yWMnR42Kvxg5Oc/QVB8R/hDcfE60t/JVlaNlLMHx03/7a/3hVyx3LcOg4Pp+Arnfi18TNa8C
WEcekyytMxQfunC4yWJP3T/dFVfUna1juIPCcXgrTI7CMYCYO7PTjbjqf7vrWsIEZEWRhGpH
U1xnhDXtQ8RaLBcanM7zSIrN5jBiMqp/mTXXatIktkgVtrAKMg1cGnoiZXIPE/wu8IeKreL+
3tQsZV2BVimfb8uQe0g7/wAq8u8WfB7w9pBCaKkEmQf+PdCMc467jnis74sardWVxp7JdTxj
Y42pKy55HofevS44F+zWrhQWaJSSRnPFc9WnGRak4ao8P+Hnhe6k1ie3vLdt0Eyg+YvUfMM9
ePumvo3w1faf4d01lWygW6AGyQAbgQuMjg1yWlwQi+vJRFHG7PyyoATy3+NXrhiJUAOaKUY0
tipVHPcz/iTI+oeGddvGyf3Dt9cisD4Ja9ocHh+C31HU4LViSCkhwRh3/wDrfnXS+MGU+A9W
RsbmgIx6818siUWslyJLuS2YSyBAsrLj5j2B+lTWqK6ZdOKkrI+yfFXg34d/EKzto7680648
rDKZJT127c/fFeX+LPgn4e00OuhCG64OI4AcKAOMEuc8mvKfB1xfNfxZ1O6uImKkAzvgDcP9
qvpPw5FHJZWzKN7LbgsTyc8dSaUVGognF01dM+UUNxYX13auWimRQV9emf6ivWPhp4tiuIfs
OoTI87gY3uAVO4gHAH+0K868aIreJyYMLLlQyr3BVP8AAV1PgrwdJqWppJFHIsox80ZOcbh6
Eegri5XGpyx2OhS5oe8d54t8Nx+IoihtxczqvHy5OcHGPfmvCbmxudPvHtbyNoriPBKSLg4I
Bz+tfT3inX9L8C6TK85hTUyreUJD83KsVIBBBOV6V8xahqt1rV5JqF4xN3Ku1ugwAMDgYHb0
qcUrW7kUbuWmx6L8EHjfVNzYRN0nzH/cFeqeL5XHhm/jOQNyEtnr8y15X8EYvPuYVZdgJkJ/
KvU/F53+Er1zwfMQY74ytddD+GZ19GfJ+lFBbyAYOJCDj1wKss4XgkZqhpOVSfaco0rH+VXn
Aftk+ua+fclfQ743UUN344A3f0qw0s9zGFW8ltVXjCsQP0I9KrjaD6etWYhHMpU8e9a05J6o
UtT2D4O+DliSHULkC42yIzSyDJ5UcdT6/rW9+0L4lufDnh2C3sS8IuoAD5TYyC6KO3oTVb4Y
eP8AwppXhu5g1bVbW0nXYyRvIcthRnp7iuS+PHxF0PxxbWVpos0Uz20YQskhJOHU9GA7Ka9q
M+SDZxyg5SVzy2JlZBIV3SyDdI56knk5/M0u9gSByKSFgsIDcHaAfrS7gBkYzXiRt1dzsSaV
khUXz32F9je9ez/CfQ7K4sftUyxSyQIp8t8EnDHnr/s+nevF1OWyDl67Hwb43i8O3Ucc1z5K
MArBmwCMg4PHvXVQklKwqibjofRXiX4tQeE7SCePT1S03ESGJOEA5ycRn3rJ1L4k+FfEUB+2
S2Cqc5YuG7Y7AdqLCXw74wsriJJ7S7hZDmIkOFzlc8/j+deSfEX4cQ6HY/aNIDyKhJcRsxBU
LnoWPpXuNR5bI87Z2keq+FbLQ7OxWOysLa6j+YiRk3d/9oE1yPx1W0kubJIbaONvMjyEAAPD
8cD6V0PwtkD+F0nkTkvIATz3rmPjFG51O2Q9fNiOfThqxcY8rKfxbnqOltpum6XbzwaTbJMN
3z7VzyxHcelcJpGg6dP4wudTlS3ljCeX5bY+U7V6DP8ATvXaaVH9otLaI8oVYnP+81eD6l4y
Phv4mNBJdeXZSQhpELYVTs4J4P8AdA/GtHCLQJPmep9AeLfi1B4XsohZaYIrVdoKxJ8o6jOf
LPoKybj4i+EPEG0a3PZfZSMnccnPUcqAepqC1utB8U26Ks1tqETKCYl+YA9f0zXkPxE+Gx0y
2e+07zZYA4HlRs2Mkn/aPYjtSkrR0Qkle0jiPECWieIL82JDWLOWhKk4A3t0z7bazHyX5BqU
ypJGAPvAcjuKRhzlecV83J3k3Y9KCshu47wQeRV/Sb0W2rWM+PMiilUyx44cZHB4rOGU9z6V
bshmWMqAMOC351VNpyVzTY+s/BOuaRqHhy2+z6PaI5jVZD5alsEkc5XI4zXj/wC0j9ls8C0t
UtvusHjGMH90fT3Nei/DNIv+EZt5RhWKJn35Irzb9opzJOYX5jIXafTiI17tl7JnlybUzT+C
F3FdaLEstvHc3JhXZJIoJVtxA6j6flXrv9qNZQL59vC7pwMxINuP+A14n+zzIY3m8wbo0iXY
T04c9K9Z1aYyCRs5Us2M9utFBKS2HXbb0DVbX/hLC8N4sbDYdjFF4JAGeMV8p36nQfHcdmjh
4YZI2ZQeMfIT6+tfW+lbYjIz4/1ZwT25r5E8cL9l8e+ZyDK8YB9flj4pYiKUbpDw8nz2PsHw
hrOk3Xh+KaHRbMSq7K5MaksM57p9K8O/adSGxuEW0to7VZWjXZGAMZRx6e1ep+AgB4Yz0czP
geteWftNKZL9Cx3FDG30wr1Vv3N+tjNv95oWvhH8RoPDdtb6bcxxy3f7x0Z0DMATn+4ffv3r
6Y0fx7LdXxOrBLmLYTtkjUZ546L618VeBxHceJ7eVgGYROPXHWvqa2RppCigmXZ8pHcZ/wD1
1OGldeZvXSseCfEP40T67qt1pVlGbW2GScR7R8sh6ZjHt0NeWgNGiInG0AfWrWuXUB8U32ZU
JDSLkEcfOeKg38/7PrXl4ureVrGtKNojOR9/JNXbSIM5C8M1VWGUHdjU8ExhuoWC5JB4/CsK
audL10PrL4B2Ph0WqDV9OtpiSmHnXOP3f09cV6Zq/hLwvqN4qNZWNvbknaQgGVzx0wa8c+Hc
bJpEcqsQdygj/gK/413eo3cpWzYyNwEHX3FfT4eMeQ8mu3zmt4i8CeEtK0iRrGG1e6ZDsCgk
gnHYk9c15pYfDaz0nWH1aaGJluHEhjYDHHHPzH19K7XUZ2kMeXJGF/kKi1PMsFsrHapHJ/Ku
h0YpGSlJIztQ+K+keHb220Q6dEjuu1GUEKT8uAMIR/GO9c/4l0yPxTBeNcW0Wx42kRRGoIyv
HIwehrifGxWX4g2Mb4RYpB5bH+I5ixXo/wA4s48naTCo+vyiuZ8sny2NVouY8O+F/gidtdmt
57dvIRVwzjgksPf619R6LqeieGtLlisLeEXcilHk5zj5iOCD6ivP9EtYbMFoY1Vz1dRzweOa
m8zbdtljzjA/KlTgrXsEpOWjOZ+ME5bRJHVseapUnPba4/pWz4D0nRrbwzbsdLhe4Ejgs3P8
RPf8Kwfiym3RBuOMqf5PXR+C0z4Zi3/KwlY5I681M7OdiFdIt/Y9Hm1YpNpFu0fl524A5/AV
zHxyhsIPhy4s9OgsrlZ49ssKgMBuOeQPrXUBV+2s54O3Ga4/45tIPhq7qfnM8fzf8CNNKKTu
hpu6PnrQJRO1sd/z7cse5+Wvrnw9CqaDaSDO35cgeuwV8geHo9htH+6pQZPb7tfZWgbV0Cxc
gLGqJlfU7BXDhdLs7sQlGCPmr4+zI/j+N3IAUSnH1kavW/hv4Fhitobi8skdGAwjLyfk+ue4
ryH45BP+FhBnXepSTKf9tJK+kPBU72dhazSDMe0fK4BA+Qf411ShzTWhyqTjHc2brXY45/7K
s/DSuh+XfHBlR25/d46L61x3j34aza74d1SebTVtFELEMYljxnnjlc0nxP8A2ldL8CaxHa2e
nQTTsXA2YUnDYznyj7mvKvF37VmreK4nsIkNnbTRmJgsy9z/ANcwfStavs1F30Zkozk7nBeE
9Gu18Vy2Jhkmt4bkwj5SRwzAfXpX1T4P+H9hYafZXt3oa7igdnlQjPXB5+oNeEfCvxhb6TqT
NewW9xNPMHV5kUtks5zkqf7wr6q0Xxbc6lb6Wk0Ua2kqKFBgTaVwO+3ntXHQhGbbOys3FHy/
8UvCl7/wsa3uLLTJhZPfEh4ozsC7k/Tr+Ve2eEXaLStNikyrQAAqfrXB/GP4oSaf42t9ItIY
IhHfFGYRR9Mr6p/tetd14faSey0+diM3KhjgADkj/GunkjGpoc/vShqcbqHwJ1fWPFv9oCKW
O1ba2/gA7dgx98ehrvxYNoKpEQAY+R7d/evPPFH7QGtaPr1ppNqJXLSqsiAgbVO3nmP/AGvW
vQba7l1m3gubgEFyd2eehx/IV0O17shJta7FDVbfQdZlFybW2n1JcBwTlgByOOnda8/8X/Cx
vEetxanY2GwKUBjij4wvXuP5Vzd/4kv9J+I4jilmeCbykaJTxyVBPQ+lfSnhiVlWOQwr9mbO
WaMYznnqPasuRVJNWK1guZHCHSvC/gzQPtOsW1vFdI3KTZUgFsA45/lVHwHr1vr5k1K1tltb
KQsqxJ93gKCc4HceleT/ALRvi/V73xM9g8M1vpxSJvtAOEZsE7eFHfnr2r0D4MxiLwPHGvJD
yYPX+MVLjGElFDSco8zPYPFE+l3ejpttIJnG0YODj8CK+a/iD4SOlajFr9pCQsbeWUjXAAbf
z1/2gOle0XM7bwpY7D2qj4lsbR/B9406I6iRcBxnncta1FGSsZRlyHT+GDpmoWFnKms2rbYl
ARpFBHy+7Vx3jT9nHQfFGoSanJfQyTNnLbiMZYntKB/Ea+XrPxR4gsprgW+tXUMYkZUVZeFA
6Ac+le1fBDxjrWvu8GpapcXq78BZWyMbCf5j9K5YVY25Tp9k371zh/G/wsbwQs08E5urVEd/
kbcowcdd7dsVyOkBdQkiA+85wEP0r6Z+IOm23/CvPERkRGkWJ9jFeR0zivD/AIS+G21W7kZ4
C+24Aidk6Ajt+lc1XDroaUqzs+Y9C+G3gU3k9rLLABAhDSMy8AfN7+1dX4u8a2HhXUrTR7BY
laaRYd8Z56pnIwf7x71s61e6d8PfBTyvdRQ3ot923GCDx169mr5n0TXbrxZ8UDdXVw88L3Za
FXbgDBwQOPQHpWsYwoxs9zJ3qSv0R9V+HZWuoiVG5pYiCPXNebxfAzWb/wCJuq6ybW4WykdX
QtHheqk4O7noe1ehaOZLRLQxKQwiQn24HNcvd/H3UYPG93oNvMXFsfLdcKvdR3Tnqe9djV6d
noY3ak7HZuhsLz512bMHB4x0NYt3pnhqS/8AOi0y2u5WwJlJOccYzn2FamoSS3QllkJD+WzA
n2FeN+F/FN1beMby3vZXaKURhcnIB+XsB71MlHk0BJti658Kr1vGcd3Y2T/2SY0XCJlFYN83
fPQGvUH8I+CdA8HTanqiWP21EkOybIY4DEHGf9n0rvdCENppkklxChUBj+8TI/Ue1fH/AMXf
EfiHxB4oGmg3Njpu2PIB2h8ggjGAeQx49qmVKEI8zLUnN8pk2dqnjHW5bnTrP7LZuuFCLuAI
AzyQO9fSHw58N2fhSCK4nCWY+fLOu3GTjrn2rjvhP4FSKFFNsERd5zt4zke9Wfi98Q4NOtk0
+yuI/NwhkSNgG6sfTP8Adrlo00rzkbyfMlCJ5l8YvHLeLNQu9PtZSYTMTuQ4UAO3y9B7d60P
hj4n1KyuorCDUZbdlQ7QrdFCgf0rzeGNpCWkJZydxZup9ya63wCu/wASxyA/MsTg4Nc8sQ5y
ujaNNRTR9SahfPeIBJIZztAZye+ea+WfDZ2fEW/XqrXMxP8A5Er6gKIIXIIAAXj15r5j8IjP
xA1JmXfi5l69v9ZXfVs4Js4YL3mfT9pCt3oOoW8IHzw7VVe5KnHH5V474S+D3iqTx7eajNZX
dpaR3Jkhcw4EikvznI7Y/OvWrO9bTIJZtoEcQ8xm4wABnn8qxbX4+Jd+I4dGtb+KZ5G8orFt
JQgng4T29e1bpJxQk53djVu7YWOmamkq4uI7eRST1yEbNfIuvHzPFOsO+VZZ22k/xcmvrnWm
lltdTnbLb4JGY+5Q18ieIX3eLdVDfKFmPGa48Y17J2ZpSTctSmyrnf3zzzQXA6jr0ppYAtzw
elJ95Rzn8K+baXU9ZaaDt3mH7uB2pi8n5m/OntIFHHJpF2nkjPB7UulhkaqwOD+dK7sHEecZ
704ZPBHNIRkbsZbOM5pbXBu4rKq4IINEjMThTx7Ux1aPPOfrSrlhuX5aG9rit1GRNs65J/vU
8MwPI2nHrQNmCOvrQz5frmm5X2H5DgFXGRnPOTTe/X8abM+FXscc5pFzj5uPQVKj1JaS3H5U
kBfxppwpOOv1pvllFyD17+lOaP5QQwJPJoa0HuEw+TIG5sUkbkIMjmkJ3LgfSnqvyEd8Vpay
sydUNYE8ke/NN+Yc5wKPnZ9vOPehxtIB6A1N0tC0OVTu+98tPK5Bwee1RcknaflFKGY4HX1N
Cs9yG2xA57nFIWYsccip3WNyMLj6VHtAXB+WmmgvbQQnKgHk+lNCCROODTmxjj71PIAGAdtL
mWw7EaNs4BzSAEdc09kCj5eCe9LIQi/3sd6ptPRA0rXI4mYK244yacUBUE4JxUbsQ2M4BpXU
lASxB9aSYXbHBsA00sTk9qEBA+Y5FIXH3c8elS3d3Gm0thrfOBxj3pMAEAnOP1pwXBP909qQ
jLdMDsavzGm1oTIVCtkYyOKFUYJJ4pqfNwx4Hemu2XKjkD0pczUtTL0E+cNjaQD2pVUKSCOP
WmEuWILEehqYEd/1qXq7o0SVgw6nb2phG4HP3fWh5nBwOmeTTVc5K9qfQNhyqynJJPtSqwdO
flNKj5bLU1nXGMZPbFUnZE2uxjZDYBzx2p8Y3Icvg5xzTcqqE5y3pTFb5skcUStYGh4JB4b6
0salm5bGaWLa4I6H+dOCqAefxqOey0FJEcilWOBkUmd5APy0pEhGSCB65pCRxkYNXF6XaKdo
6CEEHvt6Uo+YNyBjoaJP9XwfwpkR5wR1ol3Dl0uPUbVz1Pf3pcg5O3FOZTtXsPpTD8pG5sL6
VhvK47dQjIwVxtHfNOUKuaj+9Lk8A1IBk88fhW260IbuG4qMn5aRCXP3Swx37U5sOcc4pUYq
SO1TF23Q1tZDY8AZY/hTzNtAyDTEUF854x0oL/MRwSKc9tBpW3HAAD2PJoDhHHHHemwjP+0P
SnFVA5osrWkLdihgQP4cD1pr4CgqvA601vlGRzShgy8nA7iot1HccjgDkbO9KpB3EHPpTSG2
MWHHakjOwc8ZrRyuhInRhs5PPpRtJyScUwOg5yCfShnDA7ScmoSd7h6kuSFyvP4UzefvdfWm
ozgfexzjFSKVXg8knmm5ajXkNG5z1zSbCD0yG4qSMYz8pFOZ1EYBPzD8MVVwK7AI+0HpV6xy
gJ/WsyTc0uenvWlaEjKtwae2opX2RowZdCScN2qCbIkyeOOmafg7chiKZPtGMnLU3dq4rIbk
gDPI9KeoxnJ49aidvnABxxUowY8ZyfWsrspbEYODUrAhjlvxqEA55OBUo+bnPT1pPUclYnOM
epxwDUkDIqNuGWzmq7MRg9aejBgT3ppabkrzJCx+Zsnb6VH5mFJySPSrEah0A7HqKkNlvXCx
n8ATWfMolpu+xRUtjOCeelTJIw7YzV+w0i6uZzGLObZj/WbDitq18E3s0hBhbysZDbB1/P61
HtYWGzmprvyl2SSqQeocjiqJayhZXjKAjqqvXo8Xwy+17fNtWcg8Egj/ANmrVt/gnFO2TYbG
/wBo7QfzYVEq6S0LSsjzGPXACq28m+Mclw359a1k1qR0X7LqEsJz82yVv5Z+legzfs/GMAQ2
/lZ7K/8ATzKyNU/Z21YFnsppouOsfIHHp5lVCs+oaGVbeMb+D90viS6D9QVncYH51s2/xF16
0wI/EV5jsftDc/rXOXnwO8QafDlpppJAf9aIxnHpw5rLfwT4ttSWeznZB0YhR/WtnWiG56HB
8XfGNg/mQeI9QUnjaJia17D9pf4j2TfLr2oSp2InUf8AsteTPpuv2y7jZXMpx93bike4vbdd
zWVxBjgrtY/0rT2kG+gkmfQtt+1Z44giG/Wb+eTvm4A7f7ldBp/7Y/i+xOZJLi4J/haRG7f9
cj/kV8srre2P5zInPJKsP6Vcg1neMrchh6g5I+tHtIvSwcrR9m6T+2ldzon2mfa/G5WVRjjn
nya7TSP2vtMlRWupkHI4YkA8evlcV8EW+t20jgCeJsHJAYda17fWg4wJEZOmwY/wpLlkhPU/
QzT/ANq7wXdNGk+oWluTgMWnY4/8crpbL9oP4fXgH/FT6ejHou8k/wAq/NeO7sZWxJtVupG4
g1aa4s2MYgnMLdnSVsg/nSUPe0YK3VH6Zx/F/wAFThdviKyO7kZcjP6VetfiJ4XvW2wa7YyE
ekwr8y4Li8ONutXKgdP3jcf+PVdiv9diIFnr94jdysjdP++qu1nuJtH6bL4o0Vumr2B+lyn+
NSDXtLk+5qVofpOp/rX5nt4l8a2WBDrV/MD0Yz4/mauReMPiFGpePVdRYnsLgf41XLfqT7qW
rP0pGo2bdLyA/SRf8alE8R6Tof8AgQr82o/iZ8TrNMNqmo/8CnWrCfGf4qDKjWNRyOeJE/wq
LO9rguV9T9HvMj/56r+Yp3GM7xj1r85U+O3xQH3tW1EH0Lp/8TQPj98UdxH9takAP+mqAf8A
oNDTSFofo0xCLuZwo9TTfOjxnzkx9RX5xj9oL4nkES6xqjp0A3gj/wBBqNvjx8Tyu1NY1E+p
3qP/AGWlZ23Hofo8Z4M/6+PPpuFNF1bvnbcxHHo4/wAa/OR/jr8Tkwf7Uv8AP++h/wDZaanx
r+JaAsmrX4LHP+sT/CpSk73Y7R7n6PNcQR/euI1z6sBR9og4/wBIj56fMK/N+6+NHxKdgTrm
osQM/wCvXr+VNh+N3xLL5fWtQXb0zKp/pQoye7BpH6RtcwDrcRj6sKZ9stSSBdQ5HbeP8a/O
OT45/ErvrF+wHU+Yn/xNS/8AC+viAqqBfXxkxy+9ef8Ax2naT6iXKfoyJ4DgCeMk9PmFO3xl
secufTIr85/+F+/EGLaw1O/Y/wDXVRt/8dqxF+0Z4+Rgz39+AOrecP8A4mkk3rcdkfokY/Vq
4D4xajBb6PGGu4o2XflC4B+5xxXxp/w0546Y5TUNSce8uP5pXO+JfjL4x8Ss/wBtvLoIQceb
Kp7Y/uinGmubmbC1tT9LqKKK0ICiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKK
KACjn1oooAqX2k2Gpri9sre8HT9/Er/TqK8/8U/s8eCPE1qUTRbWwn3A+dErDgZ4wrCvS6Ky
dOL6DufIPib9jLV9PimudI1e0nKv8sRikDFSfQbvavKNf8A+JfCc7Jq2nTtjgS/Z3UdSAeUH
HB/Ov0VzXD/GKz04+Cr24u7GC4kBiUO6Dcv7wfxYz6/nXFNTo2fNe5V7n52O8c24qwIBIyDm
qlwQDgjdUGkbpYbk8qomYKCe3FTyAA5Y5xXa1zEaLoV9ykcdqhYLuyTk9afJhTwQc9qruTnr
+FWtFuZpCSyqWx6Z71CPmPJ4p7KO68+tR78NtAxRGzRTSegx1beQDwPWoJFyT+eambduJ6fW
q9zu29dv40NJIi1lqQN94g/rWxooDXYwB8uOn1FYTyEuP1q/p2o/ZZw47YzyOea66LSepLu1
Y9rsImFvC68Ack/ia8f+Itrcf8JKjR2s8sWIwWVDtHXkkV3Ok/HHS9Bt/s91pDX5yTkFOM/h
/nNUda+M+layJEi8L+SzLtEjJH8pxjP3feu6q+aNjm5WmecNlJCCoJHamO4A+7yTTmDmR3LZ
Le2McCmYJfn0rzdro6VHqAYvkHjFLvOcZI96YRnncB25p64Zc5GPpWbdzXzEkI5GOPemoxXj
G73PajBc9CacifKfmwPem2jOWg8qQvzsD7ZqPI39RtHakZix5O7HpTFb5yMVSaaFpElduCRz
ULITg5qRVOSeMHtSsVDD1ocrKyGhudoAI6D1qQHCgnkHtTXxj5iMdhTVfb15Hb2rNq7uxNWJ
hC0uNoP0FaeieHtU1W52WltIhGCd0bHIzj0NU7G6FtMjnDBWBIOCDz05r1HSPjfoujE48NoJ
sYyhjU9c/wB36V30Em1qZylJLQ67w34budF07fdAxMN2RIpXjr3+leT/ABJ8Sm/lbToN7psG
XBBABDAjj61d8QfHPVddZoYreaGNhgElVA4I6hfeuCWaR5WMjNK56u1bV5pe7F3MacJN3kb/
AIY8Iz+K71LO2YRlgzBtpxxz2rtW/Z812ASebqMJEYycxOAckDrj3ri/DXi+XwvOJbbckig4
ZSO/XrW3qXx+8U36yW+JY1fGZAVGcYPUR+1Z01C12dVTmexhaBq507V5YC33JHTdkY4//VXs
fn/2tCrRcFlBZRyc9e1eDI6pcNLjDuSzEnnJ6mux0P4gXGgurtulXBH8LAcehGO1dFOpG7Rz
1ItnbWHwp1TTNVOoR+Y8MuWeMQOeTuxyf979K6C/1u20pgsqZd8kLkA8Vw9z+0rq8y+Ta2kw
Ucb9se3/ANAPpXIT+O7jUtQ+1X+VK52oXGOc57D1FdTqUlszJRlLRnup067ls7iS2t5TI0bb
Cit1IODwPevLI/gp4j8Xa/ez3dvLbS7iIrqSCU4XLng7R/k1b0/9pqbQ4lR9OnvI+AAixDAA
x/dq5c/tdXLoEstJubaQjHPl9f8AviplKEtJMPZzRm+I/ghdeENBuL+6vUmeCMuVHmAnHXOT
71wOjeH9Y1uYfYtPlkV2wsgR2GMnnhT6V1Ov/GDXPGMEsd6XjtZhho2ZRlTjjAQelXfDHxUX
wjaxJFYrOsS8KixgjGe+0nvXJKEIv3WbRU0nc6zwR4I1LQbeN72CYlgC2YnXadxJ6iuf+Ivi
ZRq9vo6P/r7jyXG4YQHCnI/4FVbWf2hdd1tJYbWzks4uQGYoO2Ooj/rXCXF++oX32+7/AHl2
W3ly2SG9f0FayrRjDlvqQoTlK7PTh+z+pXzluob0DlY4DI2CPofatHwv4D1/StYuXmsp2tAE
KfuXGMcn+H6965PSfjNq/h6IeWZLhB2BViec91NaV1+1LrtxGUg02eEngswj/wDjdXTdJa3L
lGex1/jHVrfR/DE8Ux2zEs2wsA2NjdifavCdC8K67qJVbKxeeJmz5io5B5APRDVrX/Feo+LA
z3krIzDBAb0BHYD1rf8ADXxOu/CVpHHFCZUViQFRMjJz1Kk9qwqTjUdkxxg4q6PQPhv8N9Y0
1jeanbskI3AI8TqATgDkqPesf4m+MV0k/wBkRzeZNKyMJEdSAME89/4f1rJ1v9pXX763Njbx
yRoSGJUovv1Eea881G+l1m/W8umMkwXHzNn1H9fStvbU0rXIUJSd5nqumfAWGeGOZbqCSNlD
ERl2ySOvWr/h74b6z4f8RJLBYzfYljYFfJk5bkZ5B9u9cRpXxf1nwzbDY8twi/KEBVuwHQqf
StV/2qNfa2wun3Ilzwdsf/xurhKlu2Vab2O+8W3UejafdLc/umnIZEY7SAHHXP1/SvnvSYpd
UurgRQsZDIT0Jz1PYexrV8R+P9V8YgTX7yRtjAQP2znsq4qLw1r3/COs0yQK7k5wUVj0I7g+
tclWpCbtcuEeS7Z7j8OPBms/2RdSTWkygKpKeU/Pyn2FYfxos5bXw0Y3ieMiJ8q6kd19fpXN
xftOeJrNWtLSGaJJRtLbY1C9v+eZrlfFHxD8QeLcrqFwJYSCCN4PBOccIK2lVhyNXMHCblzH
M2wxDGcdqmbYP4RnuaajDAUYFAUs5549a8lu70Oxu6GMOwOM96YWZW2bsD19alYBcg81EFDS
dzWb1K30JGPI7eppFBYnB7VH5m70qRWCtxiqWgK6R1nw+hZ71JMbpN+OnJ5Wvo238P39xZzz
i3lJZGABjbJ4+lfK2ma3NpUyNBI0bKwYFSBzkf4V3cf7SviuzhESpI23PQpjnn/nlXr0K0IR
1ZzVqcpHOeLPA+qaRqt1f3sUi2zBQA0TKF4A6kD0P51z9vdNBMro5QLnp9K3/FPxM1fxfaMl
5Myo5X5Dt4x9FFcsu1Isg5x71zVasOfmiy6aklZnsfgvxONTiVJJMPtwC7D5cAf/AF6n8WeC
I/Edtm3tBHdqQROUYnqc9Pqa8p0rWJLAho3MY5yAQM8Vsv8AFzXJiIofMhAGN+4LnH0SuqNe
DjqyJ09bo9T8I6lE+meQozPC2x+RncFAI/Sqfjr4S69461K1uLYNaRgOW82B2zk5HQV5jpXj
S50UzToHkkkcuVVhyT1PT39K6WL9pbxdBFgQnHYbk4/8hVtGrSa1ZDpSvdHWar+z/pnhvSp9
R1S9tU8qMyFfmy2O3zMO5ryWw0q48S+Jmh0W3Z7O2m8ttilw2GbHQHsB3qx4j+K3ibxgMajd
SraspVrfzBhgTnoEX2/Kq/hTxnc+DXmm09Nm9w7qoUsxwR1IPrXJL2Tl7uxS5+p9PeBPhtrU
fhu3md1hAQERvGwIwTwOK8z+Mvw61m9vjcJbNJFCSz/u3+bGzkYX2Nc+P2pPGdra+XCkwhTh
VLIOM+nlGszVv2h/FmsW5WZXUSjawLJxnA5/dCu+VWly25jL2c3K9jpPh7r5ijOlSsVmhAj8
tmA2HcQOOveu01P4UH4iR+XNDG8ijfHNIHIUkYBBH4flXzzZa/dWmqTakrMLmc7mw+MnOfT1
9q7PSv2g/FWhgR2yPtUBdzSKcgfWI1jTqwS3LqU3bTc9pufDLfDbw+randQ3XJxtYjkbm/i6
cGvnzXdS1j4maiVtxLc2kRDLC+X5IAyAoOOh/Oo9f+Knijxczx6pfSvCRjyy4wMjBxhRjiqX
h7xbN4QeWWwU+Zt+7hTnBz3B71FWtCXuphCk1q9z1P4efAjXLjy7i+mWCNWOI5I5EPDDvge9
dJ8SPEMHg7S2t/ORtQ2kqyOOMqxA55zwD0rzH/hpTxnJYtBHG9u7Z+YFBjIx18rNcXq3iTUv
EhEupzSXE2QdzuSeOBngVarwgtGNwlOdpnoXwr8c3Wrzm31C4f7X85MksgxgYx6V6Nqvwyn8
aW3lyIJWJBFwyswGO2R9TXzfp17Lp159otmMcuCpIOMj/OPyrubT9oLxT4fjW2tfNkXk7t6s
OfrGacMRF6thUp6+6e2S+ER8PtDSa+uoiq7Y/wB2x5OAOjYHY1z3hvxsnijeIww2sVClgScA
HPH1rxHV/if4u8SuU1bU5p7R/n8oPgA5JHAUYxmodE8RXfhgCS0nk38nAb1GD1zWksTBfCyf
YPqe1+OPhJr3jSW0ntv9FjgDKyTRPls4Ixha7PUrSTSLGB7krbrHEqkSfKTjA7/WvEI/2nPG
EA2CGVgOhLJj/wBFVzeu/Fbxd4slLX+oSQxDgIGHTOegRR6U3iKfVmfsZ3PYfCni+x8QyXRt
IyQJygywJPfsTXXw6PdXzI6W8gA7lDj+VfMXhjxFP4TBazLcNvxv+8cY7g10kn7RHiqHbEiT
JGOP3bqD+kdT9YpvrY0lRbeh7X4p0i7uNEvdO2BZZIyoc5AB688V5r4W+Dmma1JLBe3VpJfp
K/mIwJOSzEYG4HoB2Fcpe/GTxFqy8yzwlh8zNN83/oPtWZY+NNY0i8kvoLyRrlmEh/eYLHnr
wfX0rKVanJpbijTlHQ9ob9ne9hntZNHnt7REcFy0b/MoxwByB0ruLjSf+EF0SN7+5gDpCQcP
tMhA3YwcV4NF+0f42tofLWRsAYB3IT/6KrnPEXxP8UeLGDajqE7Rk58oycDjGAAoxxWirUoK
6eoOlOejK2j2U/j7x1PNYwyeShiPl7SxH3B/D9DX03YeErb4e6e2oXhhjKA4X7pcjLYG7HpX
y94f8SXfg25mu9IxFcuBuwQAccjqD39qs638VvF/ipQupatMYCc+TvBGcY6bRjjP51kq8Lub
NJ05W5US/EjxZc+MtdNy8zfZl2YRmBGQO2OO5rAtrOS8YeWCTnGMZqtI/wAvJ4HqasWOoNZu
rKxBU5BB968+pW553ex0U48qPdPgf8N9Y/tSN3VkgAkb54XA6AYzj1rvfiZ4cfRPCF7NPPAh
kkjVYdxDjlecEdODXhWnftA+LNFA/s+Xy0XPUoCc9ePLP+RWB4g+L3irxjcO+pXk32dsZhMu
VJA4OAgFelTrU4w1ZySpznK72OI0fK2zgrghzn8hVhieT92ljQK7bTjcSxAqSbaEPTPpXh2T
lc9BJJJEQVl5Y1NFiJgW5XuAKi3HPzc05nIxkZzT0i7EtWPbfA/7O2neMdKn1G5nt4thTC5k
5BGezAd6xfjt8JNE+Gek6XLpklu93PEryeUSX++gPVj2Zv1rldN+J3ifRLGS0sNSmihkxnEu
MAdONp7Vl674t1TxKFGr30t+yDCGV920ZzgfiK9N1IONrnO4y5l2MYLvSMjjgE5qTCqMHGfa
mZwSQcDsKeNrDJHPrXnJxRvfQfDFlwcjHp3r1bwF8LNK8Z2CzSy2vnhAxikHzdSOxz2H515Q
gKOCDge9b2j+Nr/wlunspZXcgDZHJjpz6H+VbUZxjLUUruOh7inwL1nRdk+g3a2i5w8Q81gy
9e4PcH866PWPBq6XpTTa1cQ/ZwrFlfIL4BJXBx1Ga8Pg/ai8awIV8qfHYgocf+QqxNe+LXi7
xkgW/v5Utu8Rcdxg8BB2z+dez7enFXbOJ0ptnsPgHxJputaYq6TCbe2DMBblgW3ZGeAT1zV/
xd8JvEXjjUYL22YWkEbJuimicsduckYX3r500vxdfeCQH09ZlTduGx+AeD3B/u16f4P/AGg/
HtzNFEv2qaF2+8YkI+8AefKpwqRnoOVO3U9lm0C98P2sJnfa6DGNpU8sexFeYWfwy0Hx94iv
GuGgivYlCFZR8zAKpzwwP8Xp2r0jxB4ku4PD/wDaOsSF3Zgm0sOOeOoHYHtXzPdeP9R0fxhd
6rp0szRvGI/Kikxk7VyeAfStqs1Ba6GdOEpydj3I/AvWfC08U+h3ixxYwYoxJIMEHnBB9Frp
L7wlFZaXJc61NAlkmN0DsVZmJAGAcevr2NeIn9qHxhaw/IsrqAAE3IW/9FVzutfFLxV4xB+2
6tPHDId32cMMDqRwFXpn9K55V4Jbmroy3ZzesRwDW7t7JdtpJIxjX0G5sevYioB/EMfNXV6T
8JPEPiBFktLgJBj/AJ4sx6Z7D6d66g/sseLZo1aPWbaLI5zFISf/AB2vIdKpVvKKOhTjFWZ5
OUYntV2wsp724ggt8rJJIq8Ak9R/9evSP+GW/FtjCzvrNpIAM8xSZ/8AQa5HXPDOr/DjWbL7
bP5rFi6PCrKPlOO4Ht+daKjKDvNWHGpFvc+nPhV4Gv7jwpbo3lgxwpncGBPLHpj2rzj9ofwD
qAhur4yxvDbpuZEVicAR57cdK4ux/aI8V6Cgh0+S5VQuwDzBjpjpsPqawtd+LHibxW06aheT
GGfIljaXIYHqMbR6V3OvSVNxbOaVOUp3O3/Z1tmvIrkhkURx52MeT+8bjH4V63qulTtbSNhY
uThWyCevTivmDw94vuvCDtLp7yxFsbkifAPOf5/zrQu/i14nurjz5dSuGiLblg8/G32+7VUK
9OMGrjnScpaH09pGlvLbXEshVI44mJMmR/noa+RPFVhLqfxEe3J3GIxmPjILFY+ldJdfGrxV
eR+SLia1iYFW8uXgg8EEbBXLQ6jLDqP2+YNNcgqyyZ5yMY5/AflWVWvCSsmKnTlGVz7A+Gvg
a91Dw6Pl8plkcjerD09vevMv2h/AeoXUlxOdmY41JChjnCMfSuJs/wBqDxdokf2azM6D/ZKd
/wDtmawNZ+K3ibxNJJLqWpXDiRdrRmTjpjoFHbNautTVK3MS6M3O6Mr4fajHp+vxwTjc4R/3
mQO2cV9aeGbg6hcwy2o+0eYjAeX8xXBOen0/Wvjm2dY7v7QihZcY3LxXX6B8a/Efg6QCzEki
DOHWQcZ68FD/ADrCjVjDW5vUg5R8z2LW/wBnHw7oEd5rGp3Fou+UuUZWBJdumS49Sfwr5y1C
S3lvpzbJttAxCL7Z4/T3rqdb+KniXxxI0d7qF0lqx3+S0vGQSRwAPX9KTSfhNq/iBVisI3tw
43LLJHIV6Z9D2rHEctW3KTTjKHxM40IwOeT9KuWsPnNnoV6etejj9lTxi6ZbW7aP28qT/wCJ
qGf9m7xhoxDDU4rjPOUhkOO392lToVVrY1dWHc9g+G1jNqGiRvCVSJXG4tn+4vtXc3mkzTfZ
1Uo2MA4JPce1fLlz418ZfDG2GnSTyESksNp8vIXC8Ax+1VR+0P4siQqgud46MZv/ALXXrQrR
hFXdjmdJz1R9X3Gj3CBN6hUHV2BAHT2qnrdu0dpGUljmYDhYmyeo7V8yv+0T4tv7JoJWuF+X
G/z/AP7WKr2Hxc8TW0oupb2WZFO4QmUH8OVq3i4L7Rl7GWqZ6/r/AMM9a8R+IdO1CCJ4o4n8
xmeFzkZTHIH+ya6LxYP+EN0iO41F12CHGCdpyqAnrj0rxdv2q/FlrGIIrK4wo2q4CY9j/qq4
rxr8SvFHxCgKajqcsUTMWEQcHaCMEYCrjis/b0/ivqaxpTdl0PoDwXqkes6NFc27ibcSNqkF
vvMO30rqIPDV9PI0htZEwMjfGw/pXyz4W8faj4ItVSzeeZF6Rq/Tkt3B7mupuP2n/GGoOojh
ntY0OTllXI7jiKqhiIWs5EToyUtD0v4j6Rea5pP2SGFhNF8xYqTkbX44H+0K0PCF2k/h+JIp
FkxIx2IwLDnuP89a8Wm+NuvasZSTJbMVI3F1GeP9wf5FY3hP4k6v4VUxoZLl2fdneCozj1U+
lZSrUlLmuNU5JH1PbaBeXgaf7O4XpjY2f5VxvxS0S51/wdLp8QIeJ0cnaTxu9B/vCvNbv9pb
xTanMaTCMfwo6gfl5dZFx8dNa1mOT5ZbffgMGZQTjH+x9Kp1qdtJEqjPc4zwNbyatfjTfLZi
gbPy5K7QB0619qaD4X1EaDZxGCVxtQk+W39we1fF+hao3hvWptUhDCRw4KIB/Eck88fpXpdn
+1x4usofJjs7kxKNqMdg4GMf8sj2FcmHnCLfMzorRlOKSMn9ofw9eab4tTUHidYnEgDFCAMS
HnJGP4xXuHhXV01Pw/bPApfYqjYpBz8q88V88+NfiDqfxBtvL1ViGx8p3A4ywY9FX0p+hfFv
VfBVvDBawzXQCAFlII4GOhU1uq8Oe9yVRk42Z6n4s/Z81H4heK7XUHiWzgjLDZLBJg7mJ6gD
2qLxH+zZoHhLQbq+v7uzgvYk3wr83zEYz95x6+hrnz+1/wCIBAIYbG5ExGN7+WOf+/Z/ya4/
xZ8YfEnjkkao0qQ7SgTzB0Jz0CL7UVatOWrZm6U07HOq7abrsrIweOKXMbJ90gdMfpXoKfH/
AFm20WHSooJVkgXZDdB1G3nOQdmfbrXmjMzYPUeuaaZBuKk5I6c15KxE6cnyHfyKWjNLV9Uv
df1uPVr+czXCSiZiWyWOQeuB/dr6D8A+KG8R+HbGO3byLi0iGAzDLDJHAH0H5182RuQOeB71
0Hhzxne+FJTcQSTNgDbFGR2Oen4V0UsQ780mZShpypHvOu/A288XX1nqdsyWFzBKJHd4n3SK
MfKcf7orovEN4vgzw0VuiFlTdg52nozcZ/CvG4/2sfEEMJhhtbsOf7yRgL1/2D61x/iv4oa/
43aM31zMkSvuaPeDuGMEcKO1ej9Yha7ZzKjPboesfDjwBc+N9QfWpI1LqcDzkbjYU5BAxXpV
78VNH8PlfDhhVr7bvEwkQD5iccdc8ivnm0/aE1XQ40ttHt57OLBDKmxBknnop9q4zV9Zv9S8
QxaxNeS/aYwgKq5OQpzjsP0qViYQu76sTpzejWh9A+O/h2/jnTZY2hSK4yrJJMjZGDjt7E1L
8K9Bv9I0lbK5hkWVN4ZSjDqwYHBHpXlc/wC0HrE0UUccF5HJGuC2VweSeu33H5VLpP7Q2raf
OZ7hJhI2euzB4HqvtTjWpyd2yo0p7H0FP4dv3nQi3lZfaNvf2rD8X39todhPb6qvlW7MAd+F
+bdwecf3a86u/wBry+htxFHY3L3PGHjERx6/wexrzrxf8TdX8eBl1Hz1iZt53Se5I4Cjua1l
Wpq+pn7CT3R6xpP7NMN0k0r3drPFLIZUaPzPutyOh/rV/wCH3wo1nwPrd2htpLi2Lb4pIoZO
Bh1xkjnjHfvXAeH/AI8av4ajRDJc3EIA2qJFcAAYx8wOO1dDcftnuYjHb6ZciVeC5aL+W361
hSdL4pM1qKotInf/ABBtxbeHr+yvG8iW7jaOKCThnLELwpwTyR0ql8OPDel+C/D0l3fSQSSA
C5EY+VhhASOT1rxHxD8WNa8bahb31+8iyQEmNTLwMncOigdcdqp3/wARNZuYHhe4kC7CufMy
Mf8AfNKeJpuWjIjRk1qa3xj8b3PizX5Y7WR4dM3sjQ7wwKgIAOBx909+9cVo0q6RrlhqMREU
ds4Z1HGRjH045qDz2ndmkcksSxJPc80zPzlScx9x615lStKc7nXGmoqyPqjw5r7+I9Bs7yyd
iTEqvsIYjjAzj/dNYmp/BHVbnxBb+IrQgSXMoebbC5Zlyp54x/DXjng34nap4FZ0iWSexOAs
ceDswSehUjue9ejx/tfXNrpcluml3rziPbEwEYG7B/2fXFepCtGcLNnPOk1JuJ6F4714eGrE
mZXWUhkxwucrnjP4Vyvw8+H11qt9c6pND5hRVf5424wfXGP4a8g1r4u6x43lt5tVjkjRHDFH
Yc9uyL2H611z/tHanYWp0/SYHgDKyyyqI1Dg+4QnjcaqVen8KZLpTtdI981b4jaVqf8AxKbG
MQXajc6LKpyDkdAc/wAS9q4jU/hzF4pljuVjiaZHUk7SWIHbj614LaeM73T9bfWDJI12yhcJ
JngYI7Y/hHauxtP2ip9HYy2aXMgByyYjOfzB9BT+sU6i5Uw9i4pPqe+aZpdzpVqYrezdX55C
Ed/pXheq/AbxN4o8VTagZbjydojCvDKw4Qfh3rd079sOO2kAvNCunOCS37oD252itNP209Jh
DLb6DcE9dqSxc/pV89Nx5W1YlQqRfMjm/FH7N+qeHNCOpyahCiBlUw7JA/PfB7VxXwg0m9ut
WYtDKXw+CyNyML7VveK/2i9f+IUc9ukc+n2TvkJKU4AOQBhB6jv2q14V+NGkeCIojLokdxLG
mzegjVm4Az932NcLVFStBm8XVs7n0Fd6BfRK4a1kRSq4+Rh3PtXyibfUPDHii9vbi2mtYjcS
Ft6FdwywByw9Wr16f9uHSbpW3aFcuBwW82IgfpXmvjj4u2vxEgcWmnx2EJ4fcsZZjuDAghcj
p6111ZQcLORhCFRPY9ui1L/hINN22gP2a4h8pyDkHK+o+tcNpXwPutC8e2mt2pMkLSmaVEik
bJO7ucgferifA3xbm8DwiG8Wa9tQw2gMpCgDaMlhx2/Ku8uv2w9MtLFra10SZrxlxHOrRMFb
oDjBz61EK6lGzZUqU4u8TrPiF4wg8I6LfiRd0jW7K0ZKhoztA6H/AHq+Ubqf+1NRvNQJOLmR
nXPUDJx09q6Pxt471Px1qf224cpBKWaWFmHzggYBUKAMYrmzgnZGAgI4C9BXFja0WlGLOmjB
rVjSuwdN1IzlWX5eKXa0Y+Zs0pkVkwe1eMpJ6M69dxMZkIA57ntSsdijjP0NK0gQdPvcZpXT
aAAc+9aJKxOpHu+YnkcUqzBgcJwOaaeQSDx700ggZUhR6VnzWumGvUcrbxyc56ilkyvI4HpS
DvgBQO9IXJ4PND11LdxGAQHH50nB+b+VK3z56gUCMow9KlIY6UbyOMDHQ0hYMoyh44BpWy+C
T07Uij5cknAq20kJ26g4LsAPlXrimjO7aePehWJbPYdaV23OMfSqTQroTyypPzZzSKHDdena
pE4OCPxNIxIkYZ49ad7vUUW+omfnzkfSlY5HTOOtHCqTgE0gk289BSfL0Hrcbt2LgdDQgCjk
0QHLODzgZFIxwQAKgT5rkpYRtgDPoaY5Jfnn6CjHOT1poYrwfzNZ8ulwirsV1ZTnGAPWhgxy
xOR6CpcmXK9uuaYcKNpJz61S32B36DNzBgp5+lMkYytgZAHWnmUKTxnHenRoD04zRJNPRDei
1IzEcZLA4pGYsRgce9SsMK3OcHtURfHGK1aUulhsXPyY655z6U1FBO48Y/WlYh8EfIo6570R
lWB9AeppPYHckBVv/wBdR7S7k54HaldCpz0FADKAQeKnXoK+gjA56EClf5dpHBPXFPLZXNQy
sQBjir93Ym3UmbaQTt/OoCWkxgY9qfuyM54FIDnJ6UrWvoK9glhfPDfXFJETtLYyKDNkHuW4
4piOYxt5waEVfuSsSGLgfL7UwH5sdMc1LuwmOvtTJe2MZ9qEtbC2GiPB5pxUAe9GMr16cc0x
35wDj61UtXca1JCdh+UZz/EO1Nj3M+GPAo3Yx09xRwuMHn1NZ2TY+gNK5IweB1FKWDsvb1oI
4zn36UzcoP8AWri+jJa1JXAHHBz+lRMpVd44xSghiM9fXNOlGzgkEGqbVx+RGZmYDrx7UEl1
56njntSZKkgdKAck5OOaiUVGV0N32QbHB5YHHOcUsjPtBBNDsdpA60LuRAWbIPA9qbdlcVh8
bAJ83J9aeSHUleCO9NCAnFByOFHvms+bmdkFrDQMyZBIXHSh8DletD/KOuD1oAGC3UnpWrta
whY325IG1qe5AUc4pmxsbiR9aGB25PJHrSbTF1FwQcE/nSsyxuBgGgklQSp/GjaBndz70ppL
Ybd2IWLnAOB707y9y4JGaaoy3FS7gAQR+NJ6ES0eg2JFVvmwam8tApYCoyBjpkmmqzZIJwvv
Tu7NWLabFdguBtzmnlPlQjhu5o4UDcM+hoX75JPHpWWxSaWhKokQ4LAk96imVt3I61OzFDnq
TUTEyAk8e9Eb9QempUlP704B21ftmZgAw+frmqMm5n+XgdxVy3LcnOTjqOa1d0tA6XNMMNuQ
M+1V5wzOcZ4HSpUO1Q27IqKVyJCy5Ze4pqaS1JuNjBflvvCnhgFIP5ioopMhuCOepqU4VDnB
rHmvqDGjdgFmHPrTkkZiR0A/DNMxxk8+1SKwxkrx6Yq1vsDHCXJxgYzUqj5hggZNRkKegx+F
SqVjK5PXmpk9bIlO5rabAkkyIwGTxntXe+HNAtpmiMyIVGCQRwRzXE6GubuIkAqSOTXpujIu
xADzgcD8a5JJN2Zt6HW2UWkRwxxLpkKBAAXwMt/n61pWdlpxcsY1WEchAB/jWDb8jbjGO9W4
S4+UNjPvScIg1rudH5NgMLFGuBzn/Jq6DG4HIOOQQa5r54MASHH1qyl6YyPnOPrR7PTRFN2O
g+0lZMM3bqWpv2iRXOJGwR0BrFOoAnnLEd80/wC3MDyTVOLWwJ3NKaNZlKth1z3qJ4rZmzJb
xyR4/wBWVFVEvyV74z61ZikjZ/mIxjvRypbiuNuNL0i+jIGmRwH+8v8AkVRPgbR5MmWzikB7
FP8A69bKPEMcqParMM0cnyjH50SinsUmcdcfC3Q75yI7G1hUdRJFx/Os7/hRel72aJbZM9Qq
sB+hr0yOOPac7RmpvKXGAwU+uayd+jBu54ze/s56dNC5s7mK0m/vbpOvsN9YVz+zdrMBD22u
lDjIVUkO70/ir6ES3Vewbv8AU1KbkAqDwV6HPSiLnHRDR82n4D+KYeXvZSR/F9nk5/Sp0+EO
tW0fzXMnnKOCY5MZr6PbUJGUgy5A/vYqk97bozPKVk/2eKpTqXFc+brrwh4k07di4UsD1YMM
j/vk1zupeNdS8NTCK7s7gkEp50RO0ke5UV9Raj/ZmprteFIvQhRzx35Fchr/AIE0S/hbzIbe
4JJI3oDjj0zW6nLqS3rseJ23xVL4WRZuOg3LWy3xjXR9rMr3gfjy4CjFfepta+DVvMN1o8Vu
wOSVVumPrWEvwsTTZC7TLMzDGDvbH5mt1Wio+YOMXq0dFB8YjPECY3kOeMpGSP0q8PipbNhV
8tJe/Mefyx9K5m3+GmF3rOsbf3QG5/WpR8F7i9Y+XdkSn+JFfP6Gp9vHqiVSTfkbtx8VbNW+
zyRIz9ftCmML9OlUbj4oaej+WsbM395WUg/rVrTv2atV1XbDHcSkckloJSfzzmu78O/shXEg
BuZINvP+ujlU/nWUsVFLRF+zVjzU/FW1Vdn2eb/eCoalh+JbTsBBplxJntsX+gNfQWnfss6B
bY+1/YXHdfLYk8e7CujsvhF4J0sbRplozLwG8vHt/erGFeT2RXLBHzXB4l1W6BMeh3WO5ZD/
APEVMuq6uQf+JJdEHuFb/wCIr6Sk8OeGYAQljFEB2Tv/AOPVDK+iouyHRoEA4yQD/Sm51L7E
LlPn0PqkmCNMlVT13BgR/wCO1JNFqUSbksWkOM7fm6/9817kH0rBD6ZEfTGBUTJpRYn+zo19
PSqdSTC2p4NJfapEBu0afnrtDcf+OVWuNZvLUZk0u657ohOP0r3ma302YMrW0Q68BRxWddaX
ozQurWSF8dSf/r0RqytqPlW7PBpvGZiciXT7uNR1Z0wDVc/ELT0dllBQf3XZR/WvaLnwXpOo
oVNrbr1PzIDXP6j8HdBun3SWlpu56R4/ka2VSNthcquebQeNrKQEi4iAxx+9UVM2vJexYU7w
OjBh/Suh1H4F6OsO+IIMZOEMi9vZqxf+Fe3OnyF7eXMQH+p2N9ff3/OmqkWh2Wx+stFFFbmI
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXC/GtfM+H90p4
Uyxbj6fMP64ruq5H4tQCf4fakrdvKP8A5FSuTEK6XqUnZn5o6CXMN4vXbOwDdu1S3DGTvTtE
AFnc8Z/0h/5LRKoDE9B6Vt72orFCQYbIG3HrULgYJPNWmJckdulVpEJyBwKVmZ7EKuYpOBuD
Ht2pJZdzN7U/iAnuTUUoDKTjg1UWkhNtMiZjICDx6ZqJwyp2xU3lqqjtkVA64JHb1qrxWgNl
GU/NgDr+lRCZf4cr65qS4Te+V4A7mo9y9xknvTj6h0Jduec9KQyHPHHvTuFi3MQF96askQjz
vViehBrWUntcm3ViBm38gn3ApXRgmRwc9afuKJz0qHf+6AFQ7gn3Ef5h196UOoG4A4HalfKD
qG7cVG/TnkmhWW5TbZI0mOccGkYYUjBqMjZKM9+pqZsv3xRLfQzldEGwxjd2NPX7pP5U1HZu
MgCnl/LK96ptW0Ho1Yaz5ABzSnDL9BTJMP04NKrkLtPYUh7bCNgqAxye3tTgxK4B7YpCm5eP
rSoNq9eadrq4ldjemM9KnBKkjqPWoiNw5PWgzJEMPIqj1JAq4tpF2TV0SMBnOaY6MxzTVng6
CeNz/ssKZ5hkGUO5fUcipfM22R6FgfKwLHIp7t8u4cY7VDCpY5z+FOkI3lcH14qXJ7Mod5wY
5xRNKegNMK7mwTxQYiqnn5euatPoNRuSRsxDYNIrHk4+Yd6ge6hhYD7RFv8A7u4ZqfYWwwYE
EdqvVMhLUajc4xz61IchgcZwKryPHbqzGRQByST0qOPVbZnVfOQsenzD/GnyzfvIuRZZmIJx
gU0AtkDip2O9Ay9MdRzmqs13FbHa8qqT2JAofM9BX7EisYvp9Kc0m4dDg1Gl5BIPlmR27gMM
ipTyoZCGB9O1S072YnIiVsZPQUpckgdRRgr97mkeL7OoZmChuOeKm7b0C+g5TxmowzP1BH1q
aJlYbdyt9DUc8kKLiSaOLHOGYA1Svcad1oIrEDjoKcrHdu647VRTWLRW2mTGR1yP8asiWGVP
MWePOcbSwzQoyvsRfuyR5Oc4qJ3AOepplxdwWY/eSpk/whhmqp1q1kb92W/HH+NVyyLi7uxc
GSMrxQTuHPFJFcQyKAkilm5xkZp0pSMFm49ycVzLmbd0D1EkJwOevemAlQQOneof7TtkBJkA
z2JH+NWIZEnUMjAg+9a2fUE1YhdBvQg9OadIXLLjoadJGfUcmnggJgnnFHS6FFWIyh25OM00
n0pzgbffvSAgALtPNJcpTsIwIyRQRu6jig/d56U1HJ6dPek2PXoLjy2yeQakWTJOefeogWMb
YBYjnAqub+O0j/fBlJ6VUU5Be+rLLj94M9MUvyY6YFNt5YrpBtOD12nr/OnM20nn8qUoW6Am
nsNzsPIzThlkySB9aGnwp9ajVi/3lJGOgqUtAeo9j3/SnM3fIz70x4ABncM46elIAC33scd6
jmaerEtR4+ZeeDURxk8EY70uAzfpzThHhT6VSlJ6BpuK7Aw4HDAdaj3EpnPbkUjtEASZF3L1
QHmkgnjnDbTjHY9a2cX0By7Dlwyg4wQePenEk/X09KArdMZHUUhaOHJkkVPYnBp6t6E3u3ce
WAXkVDGAzH1AzzTg3mDdtO0dz3pt1IIUMpOAO3rUrmuNbgkrF+eaa8pB4GPrVI65AEGYpyfZ
R/jUltei7bH2aeIesiYo5Z32HeN9WWYGBXcxGaQcvkdPenOu0EdaRI+OabdloNpPUcoIYtRk
khjzQQ2SCePWobm9FinmbWfHG1OTS969khMm+aQHjAHrSNhm9qorrP2pCYradAf760+21IT7
1lt5YSvADjGatxlvYnmT6lpwAAvTPf0pyghcFg3uKiM2yEu0b4HQ4qsl+C+Fgm5OPu0crS1R
UXFLVlxm5wKUEDOeTilVQFUsdu4Zw3GPrSTDyoWcngDP1pJSWyIbT2G/OuXxn2pvmYwT37VS
XWIjuRLa5lcdSkeR/OrEF2JjzDLC3T94uKbi7bajUlfVjxL+FNM3mN6Y9akaLB5GGHrTHhGS
x49KzZStcbJCJTu3AD0NBXjcCCPQUpUgEUeWWXAByOeOaJWaVh3sRkknaDz60iOCuCeBUFzf
fZW2m3nJPOQnFTKwuQrKjK3Ta3WtVFpbE8yFCluchcetIXWT7wwaePm+oqIjeSOgrnbadhti
gnae4pQHk6cexpCAAfmxRJOIUBZWIx2FHxPQt7DmlClh+AxSeXuGc+9QNexo2TDO4UZ3KmR/
Onw3cdw25IZkHq64GfzrV05rVEc0V1JGQZ5NJI+Au2hs79vUUqqwJ9KhKzux3QAl05zz7UBO
nIwKUEYAJGAeaYIw0rMCMUnZ6hfsOJ2dOQadCxbcB8uR3qNo94zUu3aAP1pOV2LY9a8D6x4T
s9OR9Wt3afe27Eu0Yz/vjt7V6ZZfGb4daNbN9ljO5cttF0hyfxlPoK+UpLdZHLsMsRgjPUVQ
Oh2YkDiHDD/ab/GvTjiIRMpUuY9d+MHxli+JbmKwtpbGBVQDeyuPlJJ5H+9Xmix+VwCMUyFS
FwPlXHU0pTf/ABc1jWruqtTSnBUxZcH+dCSeSc5poVlz3A7UbvaufmZpo1odhoPxT1XwlbCH
T0ZsgZxt5wMd1NaUn7RvjKE4Kbs9Noj4/wDIVefqDn5fzpw4JAB3Z61vDFzgtDF009WdzP8A
tBeLb2OSOQbIyNrErHz/AOQq5DWNcuddvYru7bfIm7HAHXk9AKpMhI4P1pqjIIJ/GoqYipPd
goxWyHmT5mfpmojlm+tD88A9KEwo5PIrlbbNtEOIxgj8aSR+BgdKcyEoXALADJxVR9RhSQK6
yL2yQMZ/OrhGcthaItQyEg8Yz3NKzluCelIjiVcocAetNA+92OKTi47ibT2BcYoZ8nHUVGU7
qcetOUiJOOaUrytYrYc69D096b8wbg8U4/OC2ePSk3hOTyPSm27Be5Iz5iwDtPrXX6V8adZ0
CGK2tEkZUGAQqYxjHUofSuMcqM5BINNAG8sflq6c5pk2Utz0sftM+LHk2fY3GP4jsx/6Kpk3
7Svim4iZJLaQfQRn/wBpV5u24EEGkExGTiu1Yuo1a5LowfQ19X8QXfiG4W4vMeac8ccZ57AV
muQWPFMPzOGBA4pSckDrjvXHKo2txpJaIQ5XnoDTnk+UAZ49qSSQgdDgcUIu358HPXGKlRb1
uVZC+YcZpm1pGOeg56VSn14Ryun2O7O0kFhHwfpzVyzvY7qMHa8WRkLIME+3WtJRnvYSkh+S
nsaUPuyPzprJlidwwahB5Knt0rLmd9y9yYjYDnpTG7KB75qYNvXGefSq1xN9kBHkyOT6CrSl
J6EOy3JnzsJbp6UzaF5zk+1VU1XIwLW4klxygSn29x58hBhkhbH8YxWjjKJPMl1J1Gcg8ipQ
NxwTiqzYhGQC8g6Be9VzqckR/wCPOdifRalRbuypNLqXRgFhjApY3xjj8aiEyyMuA0bkfdcY
J/CpHfbwPxFS3KGjQ07rQZOMtnPrTY2Y9egpEj3MOcmnvCfWp5mnuA12x8o/ipGjGF4+Yd81
L9kYx7sjGM5qiNQBnNv5chIOCwHFUouTukEnysuEZXk4xSCTYnfr1xSRAMXx1x0PWnbTUtOO
4731GysQACcinGUR9evrTANxYEGhsqq++alt2HF9xzSA9s570hby35+Y+1MG3cM9+KeYgGx0
AoV2ErWuJvL5wMD3oO6Qn29aVQyqQRwfSp4oWK7sYXuTReXQmHdlNIljbKnaT1JqeViydODV
ea8tkcxs2D65GP51LuW4ZQkqvgc4INaPnW5TlFg3PHT3oVl5JH15onbH3iKaMoeSCalSm1qy
ny9STkHJIIFNeUOMFTgcVEWCEdx3p20PznqKzb6olIUOqkDp+NRtHudnB4605UCjBIqJlIcj
OFz1rW6fUq6WpYSXYnHPqKJpDIBg9O1Qk4bA6Y5PrSqAmW656D0ou7aEtpsUkE8jipZpMfdP
WotpU5YjmkVgrMTnBrK7buPRD1mcLtB75yadFMY+G+bmoWiLEkHGKVDt5bn3rRSSWjIl2JJG
JYhjnPakEaoPkG09aQyDzN23JHvSq5Y5fvWcZyT1Y+1xWl42k/Mec0yKRs8011G4nPU04L3P
Sr5rMb7iiOLJIXk+9OVuvambfQ5FMMuwk9aXtL7sTfYeZCQw5JbrSl2CDPbineYAh7Z5qHzA
xNZObWxfNpsP8xiCduc0qEA5IwR+tDbgBzx6U0PgnjIqr3auZuV9hktxyVALf0p0KggA8dya
aFyxP3T70Ny6jPTk0NLoXe6sSTKSTnpio443I+ZwB6YpXAbbjjB5FM25yNwoi1Z3E30Q9+G4
oMO/JJwaYU2JweaRlYMMtuqWr6o09SRVGSCRinKcR7fXpUPAIBNSffYqKFdXZLuOhOWIPYd6
hJxk9hT3URcMetMVFX3zSXcIvUT7jY9ad5wQFcE5pBk8Dj2pCm0YNLkbKdmIrAhh0NHBwOmO
9PQAHkUk23jA/wDrU0m2Z21EHLZPIFPdF2cDk00Ntj3bulIhC5bkk81U4tbDukAJQHv9KZIW
2ZHJJ9KcWxlsYz2o5PPYipS7hdgHx1GM0indgnk0rKRjecgdKQJt34OKctdguTFAGPzDNQOM
tjr6kUqnIz/OpFiVMgkdKOXpcSbRG+UUbQWHoBQPnGcHFSOwiBbOPSkWQYJB4pJ2Zd9LkTpx
gAgVOAVQHvSdBtzjPelG0NnPQYxSlJiWu4xJSAciom4zxuGe1PVwSc5PoKSRvKfjmtFewMdt
Cj5sZ7c1G0hEgIB+X0pWck9OcUJgknp61Er6C1vdjSxmYFuMdjTs4BHUdKAqnLZxjpTGjw+/
qOpFNMbkmSKARgcetMOEbB59MU5lXAccCkL+xKkcEUtX71jO7FZhIowDSsuQc/jTQoUEnOPp
TmTPORg+lUpN6FJojKqeeoFSRzDlWBBHPNRbWJwOFHakk/1m85HHTHWkx2TepOyfNnAI+tQs
FZhwfqKkXLDlto9DTZVG7jGKhNtj23EYhRjqBTjAgOeopyxBF3N0zTZThi3vVSuiU7vcR3CK
RjJpHAdQCD0qVdzDLdqicbn96Td1oO/YYxIGCd30poUOdvQU+QfLkdcUkWThmPToKbUlsXdd
x6xFBjqtIU69B6Zp/mKhPcn9Ka2XHUAHn6VV9CU0hqkCUZGTSTv85wKbn5sDt1NI4Kk98nrU
631HdD1G0jpQGyfmyy+3ak8rLM4x05FOflQAcCnL1E7WFaLnjIz6ilL7CaasZZyWPIpZflOR
yfSoUOVX6i6C5DAGh1BGM4I55qOOM4B3Ae1PKAnmr3ElqOjYs+PWpCBGfU+tQrn5scU7nGOt
TpfcbVg8wyNt2n60jBmyCduP1pRlOvXsKTOevNaX1sTfsJ86j0z2xTmOEG7k/SrKsjKSEO4Z
6moJR5nB49aWrYr3dwB24I5xSh1IbK9OaRItn3TwadsK55znrSl5svqLG5kGCMAdM0ofbkEZ
IpIwAW7nFIQdx7VF9RyXvEnmFmBI6dMUN8kZwKesgjyO9RHey4IwPU05SEQmPvkVdhQRBWB5
zVJyx69qsQEuBnh/U1Sk7XaFrbQ00ZiuOlMeUo3tT1dnTdgg+lVpMyZycfWob3Ho1ZDoV8xn
3MFHvR8ud3pUbKi8Z5qRY8gZOBjvUO8SWKFxyehqXAUAj0qNiMgEE49KeoAZf5VrF3uymlbQ
cuAwzyBUu5dw+Xk4HWmOd7AgcU8R5x6UnaTElbU6DRBveM5AAPPP1r0nQlHlRnPYc/nXmui4
a4t0C8ZHPpXpWigoi88ADn86xsrjTVjeV8EAd6sh9qjb17mqW9Wxxk1KCzjg4AHStIwT3Qm7
FnzgDjue9HmNuw3HvVTJaMdx71KGYAbvwpSstjS90WPN2of8aet15x4Bx61SeMuwK8CpC5D7
f1rNvQXQvpd7lwOmeacLjapJrNX55Af0qYjAxniq8xWsXhdFxgc85qxDdmI788istN3rTml6
DODQ1bUpysbserHJzwPfHNL/AG+MbenvkVzbz7yVPX+VVZ5jGRtNNRXYFq9Tqm8T7FK+g4wR
VKXxWc4KsxPpiubeTapfdz1xVKa+3E844PpTsrjuu51sniV3xgEflxVSXWWbLEE5+lcrJqKx
RHnp7jmov7ej2gH5VHXJFDSQlJHSS6w2zjIYZ9Kg/tguy84x1BxXLT65ESxVgB9RVSXW0bBz
x9RS30A7K41dZQQByfcVQEJuXCqdxYjoK5WPWh5ud4x7kVu6dq2CP4j7Y9azlGzSRTemp12n
6C8RUzuFx6gjvXXaTcWej4JYSydVKtgDn6+1cRBdGRBuPy1ZFxu5wcGhRjd8xPNZbnqCfFho
18uCB4j/AM9SykfqKrz/ABIuLxMSS709tn9BXnEk2fl6r6UvmDbjaQBQ4QeyKurHez/ECe6G
0hto7nb/AIVVfxcSvQ/pXGmQkHHSmxttckn8Kpcq2RPodifEashODuH0qNfEi8ggnPuK5MXO
MjaakWdSeBg+5qpWsG251K+IEIIwfzFIdVWZ8H5fxFcz5m7nOMU5Z+Ris+VFXOiebdlgePSq
kszNntVBJig35p7XZODj8afKraA9iwt68XAGcd6kF+WxuHJqg0w2kgZ+lRu+VVqUddUK1tTX
jugfwqhqSpLGWBG7n+VVDesmQPzqpcXmU5PPXilGOugX0P0looortMgooooAKKKKACiiigAo
oooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuU+KjbPAGpkjP+q/8ARqV1dct8UVDe
AtTB6fuv/RqVhW+ED8ztEUgXechTMxFT3OyTgjA9afpsgmtbhc42TMP5VFcjLjvx1rW6uJyK
cvycLgA9aiBO0jB61ZkbeSPTiqj4RuvIpX6CuRyIMklvmqLA5HUVJJhgW/iqBgQuRwafL1uS
3cZIuWIUdqgkZkUjqfSrAJPLdaguMbGxwaHB7iM92IA6CtHR9NF3OVTcxI5A+tZpLFQMZX6V
v+Ht3njbxjGfzropxUpWFJ2jueieHfgLpmtqs97cosbHBj+0lW4IH9361J4j+E3gzwssv2a/
PmqmQv2xW5wTjBHsK1bWRlslJkw2Dtxjjk14/wCNYUv/ABL5kq5ZI0IPTkV2zpxhG7Rypty3
Mqf91dMoHy9vy/8A11C4fZ2x6VJJzIfp3pqDJx3rznJPodTVlcYVOMEjGM1CPnJB496fyWYG
jaNuTkjviokro0bUQcDeB2AxTVOHIB4PanhcgMCd3fNMT5XHGSe9XHYm/cAMZHYUpXcAR90d
qcqxBskHP1pZFUZxk55rNptkegBUjXcOpFMYjYSRzSJ948cD1oI6leBWqTZWiQ5VDqOelKqj
c2DUZJK4xkVNbsuRnOfWrSb0ZBp6VoZv7lFC7kyM9fX2r2Lwn8EPCWpwvJq0xhMYyMXewHk+
o9AK5D4fWKfaiC33sZ5/2q7nVJQNNnUkbNpz+Rr1KVGLjqY1JNaJia58G/AlrbM1pNNccZ/d
Xgfsf8K8i8T+G4dBk8uyV0tyAQJCSeQc8/hXpPgOJLfRREn3QXIGc85rI+KMw+wbrgbSYiAO
nZ6itTjGN4owjOS0ueUhyG6UPIe3SnyKqSYX0qPOOvFebo3qehdMsWkJuJ1QDJ5NemeDPhZp
niiULqxMUG0ksZjHyACOce9c74O0VZL9JG6FDzn2r12GJbOykKZ+QDg/UCvQpUIvVmNSo46I
san8EvAehWQeIzvMANqrebj2HT8a8o8QeBXs38yxjYRHJJO5j147Vb8PeJNVv9bu0aSOaESE
LhOVHzYHFelNppnglIJ+XHX6/StnSi+hzOcorcreCvgp4f1aykudaZ4UUA4+0GMEbcnOR61e
1T4UfD6wt5Gsi80wB2+Te78EeozXiviHxfrN/qH2PS54oyhMTGSMHoceh7A12nw306e0jke4
O+edw8rAcE7eccDjOa2hGDvZBJztzXMLxL4GS1uGlsFdYt5yGJJIyPb612Pgb4VaBq0EE+rM
8Z2hn/f7PXPUewrT1HxPDp9zHZKFMsrbMH8Pf3q1JKGtJOcboyT6YIpKhG+ovaSsS6l8OvAF
sJVtVlkuFBXdFd7+ccZ+b19q8p8aeFotMDy26P5IZsbiTwBn0ra8HXUZ8QazEqOyrJj5RnHz
N71u+Pfn8MOhBC7JDnv90/40qlFbJC5npqeKaDEurTkKCwXBwPrXrPh74L2Gu+bdXSsPLG45
lZe56cf7Nc78IPCCxqJ5QdjYxgns59q+hbq6ttJsnjiA8uVWXg5/r7mlRwqSvIqdR7I+eviB
4VsNG1C2s9NLbXkj5d93XOefyr03w18E/BN6scupyN55bhhebV68elcV4zU3Gp2oIw6uhz+d
drAM2cLNkjOMfiav2UIPYXNJLc0tc034Z+Fz5E0kJYY4+3jPPPeQVyl83gPUJjb2kLh3AKyJ
c5HHX+M+h7V4P47j0x/G7yTRneLded+B/OksDHbHzrLCyDIBJ3D3rOdSH8ljSMW1e59S+Hfg
t4Mit0nv5WclfmEl5tBJA54x3rSvPCPw3tphEsaTPjIWK+LHv/t18sN438RyOsfnQCJeMiLn
j8K6nwDpkS6p5p3NJJvZnJ4yRk0U505dBuElrc9L8VeBfDMdjc3lis8LxkBQ82erAep7GvEP
h3LYXOp6kNVSQxCc7AhC8Yb3HtXt/iIrJp1wzuFCkAAnGfmFfO+nFRqN8nRDKSoPfk//AFqy
rRgpaIVNttq59RaL4V8CXmnyMttLI7ALuFycocdeH9+/pXmvxj8LaP4ctVk0wyN5ke4B5A4B
LgfyNavw/cwaTN/eGxePpis74wp/xToLcExMw/NaupCCg3YiXNGVrnjzN8o/vY5qMSMMkgUt
oc26Z7qKVlTd3Jryd7pHoJ6agpJz0B60ZIOc0hPzDtQ+OvX1qeW2jDTcVvmPPNNAxjPPpSR8
KRnino3bPAoS1LuraHWeD9Hiv54zMrBS+Dg4OMivovQvBfgjTU8i7tZ7qQglpBcHABPsw7e1
eBfD6486aKTo3mYH5rXsl2zFr1APkMLAn2xzXrUKceS9jhqtrqeXfEbVvDrrLDpFo0cysn7y
SQt2yf4z6jtXmLIJScZx71a1dwuq3MY+4CpA/wCALRZwfaLgxDnIya46r5p2ia01ZDtO0aTU
TsXOT0x/+quhtPhdrMkcjlJtqDJ2RtwMgf3PUiu/8BeD8mNpFZMKdrsSAflHt9as/GT4o3Xh
uzmsbCWIXe9UYFQxJDHPGc4+X0rqjh1y3ZFSo72ieGzxqkzIGDbSVJB7io2jANbmkeAtS11v
9AjYs/zOoVmOSM9lPvXoln+yddz2yyy3hV2AbaZCCMjpjyq5VhpTeiLdSMdGeOtgyLWxoGkP
qN8kaKWywz1756Y+ldL4p+E154ItJXl3yRorNvG4jjjrsFL8KPFNtoOrrdTKoljlUxFzgAgH
r8w9RVrDtStIPaJxdj03wb8Fra5s49Uul2QRgPKDKysRyOOMdq8z+M1lYaTq3laVGyQmTaS7
Fi2Nme57k19FP4/Ov6JnYgkmTaGQcHnH949hXzf8b99vqcKry5kBzjjJMZ/rXpSpQjB9zljK
TnZnN6Rp819cwJGm7LLuAByBkV7p4J+D2kaxZSXepLLGYIRKpWUpk8nHI56V5t8LfFFloNw7
3cQaXYuWzjcd2f7wr6GtfH8fiTw1FDCkcSRr8u0ckEMOfmNY4alG15I2qtpaHzl8d2tLU2bW
UJt4jcBcEknGwepPvXafDD4XwX8wl1dxDb8HJkMefn55I9BXFfHe1Im01XBBFxyDxxtFcuuv
aog8uK4REPB+QZx+VZ1HThUtYKTlKNrn1LqN38PvDl0lkkS3NwQCpgu945PH/LQd/auU8T+H
LHxBJKlpZmJ9mRhnJJwRjqfWvIvBng9bzUY79d/nH5Tg8HDDtj2r3HU9cj8MWT3ZYRzIhIDY
4xkgkE+1dy5JK6iYzXK9HqfMGqx/Y9dnsG++iB+euCB/j6U14yw29xW9o3g6X4ieJ7i+DMIr
hNoK8cqF/wBkjtXpNv8AslT39tvlvWQ54BlIP/oqvLlRlNvlOlVFCK5jx2xYS3CRMMoQc+3F
fS3w0+HnhaaxjvL+5Ujbyr3QUcqv07n1rynxB8GpvBsDKkpkKkLwxbvj+4PSuG/tjUjG8RuQ
sedpGxe34e1aRtTaU0Ckqmx9a+INX+Hfh2/gs1iWd5QxUQXe/GPX97VXWNN8K6kE8jT5ULLn
c0reuf75r5g8I6JG2sG4lBkduA5JGOG9MetfStvaLbfZ1PEYiXLE8dD3r0YOnP7Jz1I8nU4z
wJ8P7HU/Euo3mqN5NhBMI4wZSgZQX5yRz1XnNegaxcfDzwxNa2jKk89wp8tYrzccjjGPMFfM
HinxNqV54hurfTbhI7flDuRSQ25++D2xV/wF4ZuLrXILuePzbtJQVkwwHIOeAAPXtXOuRyaS
LVNtXbPYPFHhfTdfSZbKyaNJgdoDuSQce5rj/BngOOx12SDUIZVtIZuBkqSuWOMkD2r0DXtY
/wCEV8NtfyyLDLDblkD4GWUADg4zzisrwfrTeItLGpzMplmO9sADPzMBx9BXR7OK3RjFyW2x
2V3qvgPwxb2lq1pKlzPhPmn5Y4GODIP73pXJ+JtDtPE5kWwsdka7nQhnLEY4zyw/Kub8cW0l
zr2mTLbzShJ1yyISB9z/AAr0TQWWK0VpW8lRbkkucYHHrQ6ceiId++p842fhS41jV7uxTzA8
AUkKOzD/AHTWnf8Awhn0ywa7WaR8H7pOexP9z2rIsPF9xofxMvbiykTy2WJGcqGGMRnr+Br3
GzvhqgW5yCrEBwvp0/pXH7GDk9DqvNQTufNkkbhyB8uOCCK0NGuI4J4zcAOu4ZGccZHuK6P4
ieGF0TWJbmAO1vIq/MTkfd5Ocf7NcfEqs2a4qlN0p3todEZqSsz6Z+GupeENWKxmxeSUb8hJ
TjHHpJ7074maJ4VfRbu6sbKaN1aNQWlY9xn+I+tcD8FMf2ipb/WASdPoK7fxogj8ETyH75uF
Ax+FerS5ZQ2OOrKz0PlqwkeaAlsnDYGB7Va3AKT6VVsWK2zY+X5+/wBKmklI4UfMK8CcPe1P
Sgk1qWLe1+0TDjK16v4B8HR30fmvBJIox90tj7vtXlVjcG1kO1gB15r1fw58ez4P0M2LeVJI
23ogJwAB/fHoe1ddBRctUY1XK1kex3934M8HC2s57OVbm4QYHnfeboesgPX0rkfF+j2Ov2lw
tnYeUjxMUYM5b1/vEdMVwcWuz/EHW7K6YMZYZM8oF6nPQZ9K9O1zVo/BnhN9RdtlzFbkxhsf
eCgdCRnrXtLkaskefZq13qfMmuWy6Vq9xZvlZUcgA9R35/CqPm54z0qxrd43iHxDd63cPunu
pC/GAMYwOB7YqtgGQHIr56ty8z5T0YJ8tpA2GPt6UFdi5HBPFKsW5/Uk9q6fQfh63iqRIx5r
EgEKnbJx2U06cEzR2SuzlluFywLD8xTsMcFgcfSveIf2N7a5sknnuisuThPtDAjr28v2Fc74
k+Ab+EreRoPMuJApIKszjgZ5+QV1LCO1zn9vFuzPKZImHPX3FG3Nd7ovwr1TWYlfypzbvkEK
jeuDzs9Kd4j+F7+G7iK1uNwMpVUJJyS2cdVHoayeGkldle2WxwBy0mRmnmHAGOTXpmlfAy6v
yPJFwnB+Zs4/9ANYlr8NpNa1iXTJkmEqDOFyDjaD/d9/SreHdh+0TOJlYqdpwB1yaYHCjOM1
78n7HQn09ZJ75t3GEM5BHHp5X1rm/Ev7P83ha0kuIZGkZMZ2OzdTj+4KHhpRVyI14XseT5YH
IOD6Gm+YVZsHr1pwG5iGUhl4YehqMZOeOK4GrdDpdujJAxb5SefWl8vcCeeO9LHb5kRe5Pau
s8O+AZvEc0dujyYmYJtX3/4CaunFzloDskcbkK5GQT9aekfU4Oa93X9jyK7s4p5bkpKyBsee
wKn6eXXL+LP2dJPCNpNdR3Mkpt1LAK+706/ux612vCySuzldeGxxvhdok1GEzLujDrvUnBI3
DPf619J+GtJ8H3+jW0yabM0xQCTdM2CeemH9q+WbIFdXhiB/eQyAOvf7w7V9J+BisXh+zlB5
O0bfTlq6sLGKdrCrS0ujy/8Aaf07TNJbSW0aB7YfavnV2LE/ICOpPvXmSoSoyP8AGvSf2mJm
tNSsWkGUFypH4RrWR4e8Bt4nkWNRJluPlz3OP7prPE0uao1FCoytHU4x4yx4IJHYUkStk7q9
5H7GcSwh/tZWQ8kC4b+sXtXIeLfgP/wiEciBpJHVMgq5Ycgn+4PSslhJpXLWIi9GebFVIwrD
I6jNLIvzbeme3eus8H/DxfGUSwRpIDubkE9hn0PrXpx/Y/W+sVeW6ZJs9PPIIH08qojhpNu4
SqJao8CWNScd6k8oNxyT6V6N4z+COo+EdNf7IrzSIyjedzrjOP7g9KyfC/gU+MHWJPMUEHPO
OQAfQ0OhNWsNVYpXOOlHlY9DzUBw7gqRj1zXv4/ZA86ENNcHf2zMwx9f3dcT4k+CK+EN32eQ
zAZyEkLgc45+UVs8HKN2L6xE88dQCD7UmFALE4/GptHjXWJzGpxh9hU9c12ul/Bq51h4z5c0
kcpAXAbqfonuK4VSlJ2NJTjHU4iONZOmSDj8a9D8B+EF1O4tS6sQSpIyRxz7VyniPw7deBfF
Nhpk6MqtP5bI4OQPl9QD0avoX4d6VDp8Ol3PO2YKevbkf1rvpYdqXKzKdX3W4nY6Ho/hDw7o
im4hEl28flun2k7s89t4rzrx14Y0jXLe+bT7ZoGG+QZkY5Xafc89K8++NutalY/FK0+ygmNb
kogMeQVPkk/yFeq+ErdtS06xuLtDGxRXZcFa9ScIpciRyNNJTufLUMc6u0U0bo64zuXBOaQx
kD5uK+gPHnwpk8RaukmmebawEEFmJOQQgIyVbuDXk/jLwDe+DNSgtpHdxLIE3OPYHg7R615V
bC+8+VHXCvsmZekC2FzBHcFgHcLkEADJHWvrPwH8NvCSafBd306TbixBa72rw3sR6GvnvTPg
pqXiBRLbrMQTtL7Wxx9EPrWN4jm13wmRpT6kNuMiMomcNn1QH1rShBUl7xFSSm7RZ9XXsnw+
sNW/s+OATztHv/cXe8Y/7+Z7elY3i3w54Vmtn+x2E0cwK8tKxH/oRrwb4QWPm6st3cx5uXWR
STkHGB2/CveNUiS38zzJFhjGCXkbaB+Nd8eSo/hMZrkS1PPfh34HtZbmRtQik2b32gMV4wMf
1r1C+uPh9bXS6dJZSrPjhPtBycZ5x5mex7Vl6Tcxi3hkRt0eBhgc9q82urSab4m2zzQuV8qT
EgUhf+WneqhTgk3YzcpSerNbx18PdM8QJK9jbvbCDjDSNnluP73pXzuZ0meUICGjcxuD6ivs
TUhFZQX8dzIkW5gVZm25G73r43sZCNU1kjobyQgn/eNebjIxVmjqw8tWiyFITdjP0qWOEvIi
KrEyY6DpXUeFfDx1CeLhiSwHGe4+lewaP8JrOythqF63kwBBIx80qeR7jHcVzU6Dmazq8jsc
L4B8GJey23nKxViu4Akcc57V9C2XgfwTpfhxhOqPetCDsa8IbdjJG3cPWuc0CxtbCQCz3NGw
+RmbcTwcdPrXg/ifWb9fje0UsjSpDdMI0RB8uYxnPGf/ANVerToRhFtnNKbqPc7X4keArO/t
5rrTEMIhdiVDluNpx1zx8teHTq8dxNGQd0Tsh49Dj+lfV2j2CXtvD52RHNEokGcHDAZ+nevL
fFfwsvbvxVqDWUMi2JZijEMfTHO0+9Z18P7SDcdyoVFB2bPHmGckHmmxxLkDPPc10U3hi703
UFtrtdkkhAQgEZ6eo9xW5p3we1zXJ08qJhZggsVR89cddh9685Yd25WdPtUtThHUORgjHrmk
RCpK8+tehxfBe+vNUNosFxyQCwVsDOP9j3rsNS/ZDv7ZDi93yIMgrIT6n/njTWEmT7eCPFLW
186UFevPFepfDzwbDq13GLpXWMh8kMVxgcdqzIvhnqng7XIk1FS8MgKrLtYDJUnqVUfwmvb/
AANp8doqqqkuQ3f3rsoYb3ncznV93Q6WX4d+A7DSi/E0oC/8vpLHp2DCvDPiz8PtOj0GW70T
eLvzVwrSbwqknPGD9K5GTxhqdr8RG+0S7okMsaxJGvQF8ds/rXv+m6VHczQMuSk0Yd1zzyM/
zxXdOjB+7Y5U3HVs+PhKXUBsb14b2PepEfJ2t3rQ8a2VppvjK7htN7RSFm+Y5wd7/wD1qzCm
c4r5yuvZy5T04S51cSQBB0JJ5pm/KjggZ5zS5OcNzk1ICDkDpXNHRXZo3oRMGA3DBFICzAkg
YpWwGIHWm4+cAng9aptoSWgBijk9T+lSb9yn1pygAfNnA6UrFMZH3j2zUOV3oK1rXRCGJGMg
0hPIB4x696XzEwQAckc0IxbO/mtPh1ZpoyUbHfB649abuDJgDHNRt+7yRShjLjJA9cUpK2or
dSVsrzk4z2pWO1PWoPOKqTjOO1KZTIm4/pSXoJruOlGDnqDSpuCbiaFfs33aRmA68/Speomw
Jdfuj8xSEeaQ3GRwQafk7SW5FI0hX7vep03HZsRlIQ7ulNQENkemeak2loyzelR5EZ+Xv1zV
N30BPoPUZ+Yn8KY0uCcA8U9WLqRUZj+c9wKXQGkmI0m5hk9OlKobcSefT2pHIXkdQeKetw7K
cjI9hVxta5TegxW25PekPBzjk8c09gVXJxzSlwy4Jz703pG6Q7LoR8lj61IFVFyQRSbdhDAc
9hTzKFjOQcEVN7R2JehBk455FPjYvJzww7+1I454wOOtJExYjI4FQnzDbuhSC5Pek8sbuvy0
qt+8449acrqOOTVN2M9UIxZT1x701nJHt60+PGxsj5s96iJYMemKeppYFATkAkfxH0p7YcHb
0oBJG3P0pFJGQT9ap90Tdojw4OBzipN+E5BzSqoL8cGomRnkOex69qhNvdlJJ7js9N3Of0ok
kwNoOM8E08DapxyaYyMwIxQnqTLfQURFwe5H603JJBYYPvUkeYycelOlxL90dPWhNrUdrasT
eWjA4OepFMZdpweTUgIRff1qFZCc+tJtgmgYNkng4pFbYO9KPu4/WkWYKMYOaaVugxCpZgwO
W9KaWO8gD61NDgtlOD702VDvxtJWhNNWFe2g0ksSemKavKtn1qTIUY6E85pGDFenP0o5kKT0
I2DjA68dQKcN4xkc460vm/KRkZpf+WTY+tPRjdxjMV4xxQ+PLHPzHoKeoBAJHbrUROJcDkGo
26DikxrA4Gf0qZG+Qk0/7qZOPUVGXzknkn0rRXa1FfoIZN456ChWL5GOO1OVy3D8GndOlTs7
jdhgHbIzSSMxIBwKcEDy8jkUku0v/tUr66i2FKgqfWkCgAZFKw2KT0IpfMD/AC9qLWd0S7sN
zNjnNDyMOcU8KCMYOO9IFDSYB+X3pOblpYSavYjA83kEVG2ecVI8a4bHrTPMUptBPTkmkro1
UU9hyDfx27mkdQrYWmlgAueM9aC+05A47mtFruJxRIqZYZwKa7BGOMn6UmWOWGCtIzoAeCDT
tfUl7iNljwe3emqN24EYxTlwcmgksuF7VOzKeqFWT5SScU/azDAINREZRsjinxnYpCZHpmm9
SNxQpxzz7ig4UkimjdnjqaUIFk6dOmaUbl2S3FX3ODQz7W9aV22A55U9xSJtYDtRsyXKz0Ht
LsQnjNDssQBHemBd3I4JoYYHznjvUOD3bC1x8EhBbkEdajdsc460nm7cFeM+tPZiEzmt0le4
3ZLQV5HZhx9cCg5xx1NJESqNyAT0Bppm2Bj3/nWV+V3RKTJ0jDkBjTnHDAfw9KSHmMMeM80w
jfI3pmldttskI423lmO2pJmxtIYZ9aiMmSRjpwaMKrA4yO31qnZq5pq9ScLnluPemSSyLId3
QDuKBK7NyQc0OrBdp5BBxis7q9rEK5B5hLYbGat2chXg8tnmqO8n5SMVehj+bPFau2iY5XTN
J5dkZx0FVWzLMcYwB1q0ZQOg49arlgkhGPlPNDcbWsSlZ3REF5PoO9WEQOxx196hJyCF60pV
iuRx9aXLa7lqW9yXZ82c9OlPKfLuzz2qNMFDnAp0RG2k7JD5R8R+VhjDYyc06FuCRwQcUmem
OncUREqSQO9LS1wWu5v6IzNLH2KkGvSNIlIt1z0IHFeYaTc/6VChBGTycV6Bpl4qQIoOQB1F
TG09Ru0dTp7aYKG6DjirCTdTxk1gjVBtIBxjpmnRaiGPzHH5VtYltdUb6Ha2QQR6VIz7wax4
9RQ8A4x34qz9sBQMGGO9ZqL+Qc1jQWQqCM05X3LkfSs175AhYEVDFrC7CQwx+FN00lcXMzbI
BH9aXeO3Fc7L4gRRncpPcjH+NULrxaWU7CqD3A/xo9nZXK5jrZbpEHB5+tUDfnceRn3rlU1/
LEBxgd+KqXGtsWwGB/AUra6lXT6HXteBWPzAn1qnda0sA5Zc/h/jXGza6xz8w2/QVkahqkko
3ZBJ9qrltuO51174iO18OABnsK5698SySk5ZcLx0Fc/JdMVbBHpiqNwwZgR2GSKLxtsQ5K1r
G8+uvIWG5cY44FU59VZuhGe/FYr7mHGMH86aJCygHqtN8tr2FozXk1JmU5IHHYVHBqjuzIWw
o9QKy1doy59aUMZBnODWej2NEru5rJcCd8Y6c8V1OhXAUnLgHHQketcjZYjGepNbVrIA4LDr
1rBt82opOx6dpt15kGQR1PFbMMm88AhfeuL0u92gBCNhNdVDcbFBByKpoXqafmiMHPNNLq+e
c1AJd/3ai3bDsOMetPZaDLJOOe1MZmLFl/WkWTJ68elI3zEDIIpWuGo/lsZIGeuaJBnGO1LI
AsfPNNUnblhg9hQ42WoXfUkDcg1IrcE96ZHz0/KpcqME0k7rUtbEkeWAJ69qlK/XNQByEJX9
aieb5SSwDY6GmiW9bE7Drk4qBrjygcnGOKzbzXUt9wLLuX6f41zOpeKd0hGRtB9B/jVKm46D
2Z1lzqKFeoFZ02uWscf3iG56kY/nXE32vPMp+dT9APSuevdbMinLKAMkDjrWihaVxvyP2Zoo
orQxCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK5n4mf8iN
qX/bL/0YldNXM/EsgeB9RLdP3X/oxK56/wAI1ufmjpLgJeZH/LdsfpRcnDc9e1Q6Q2De7Ogn
brViYEnLEYqm9QlZFSXAAyck1VlVQ65/EVZLc4Paq83zHjGR60ru2hirlaYlXwuAOaYd3TAz
609yN3P4018Njaa2T5tEMjdDznnbVeZRsyOverDfKhJPHNQTqpiU87aPe2uFyiT82CcZrb0A
L9rQdsjP51kPGiEd62dATbeLj73H866cO3zES1R6e+VG5eAOa8o8aTyf8JBugAKFFBz6d69f
0zcYjuHCgkj2ryPxaA3iVtp2r5CnB+tdtafu3ZzxVmYjbt3mMQQeMillzs+Xr706SMemBTnP
lYxXmcy0sjrbstCDno3OeRTWZFBXJzUsrqx5ODTCAFBNPTqRu9RBKIjj9aaz5YYHHvTgi87s
0hAz1wKOaKd0NjMgDn9KcZWQZ9uKCwCnmkUl1Ynt3pX5kx2F3b0DEfNSkFkJGMd6hQb2wTya
mKMgwKV2hXE5wvGVxzTlYKdwHFCyLjaOT3FMYkg9lrVSuNo6TQfE40W4V5CWQkDhc45zmvYf
D/jLwdchVvHvNx7Khx1r5+idwxIHNTWdkn2rftyW4HP0r0aOIXwtEump6H1G174VFsU0s3DE
g8uGwD+P4V5N8VYzc2Mm/GFiJGP91/8AGuk8GWiQ6SY0QKdzN1PtXPfEiVDYSW7/ACu0ZAP1
Vq1rO8Wcjios8vZ1hc5XGRSxJ5y/MPlqvBBLJbq3U8jNTrIsLeSzjf1xg15K3sdisd/4Fd0u
0JUEANjPpgV69bact7uQt98cnOPQ/wBK8e8ETF5I2PBwf/QRXqk999mtpiDtl7DGe4/+vXuU
0rHLWepoaD8MtA8O/aZ/MlWZ5N3EjMPT+77mqty6wNIo/wBWev515h4T8Sa3fa1dCWSEWqSE
Muwbs/N0/SvU0tWuIvZgCM1skktDnkratnjHhLw81/4k1KZ1wsd0wXDdeWz/AEr1HUbqDwv4
bldiRMyEpwWHAA/rTtC0gaMLuaRT5aM8zkNnopP9K8h+JHj+PVNXa3ikK20RaNy0eCMOcD9K
ydoK5qrysjLTXru98UXF9MyiESkphR05HT8BXq3hb4neFre3hg1Xz3kTAfy4256+h+leKxzw
3sZ8pt4xycEU/wDs+CfYrxlhkcbiP61xqvJvU6FTi4n1VpPijwbqdu76Za3KTMm4lw2CPxY9
8Vha/DbalHLG7iO3kJUZznBBGOM1xHw1t0sYj5SbQ0WzrnA3Vt+OJvsehmR2xw5TAz0U/wD1
q9BVE1do5Zws9DvPDXw1mtrMJalAgB27pDnOT7etTy+A9Vh3G5cY7AOv9BXzF4Y+JfjKKRUW
ezIHOTEP71e4eHfFWranZs2oSRZHQRJjuauElJWTBwaXMc/4/wBDe2uleVtssO18k5GACewr
V0r4x+Dre2SHVIJjKmcmKN/XI/i964v4zavdW960SlNsoRGyOeVYV5cIBLNsWAlh1y3/ANf3
rCVRKVioxUlqfTMXiDwB4niZ7OwupJDwNxkUcdf46858c+FopYZJ7SLyYwVAXeTj165qL4a2
628yOsYVwHGM5/rXXeLJZIfD8yR48xnXIPpkf4CpcVMbXJomeG6Gv9qXRjQEBc5zx0r2vwh4
bSzRZGXkrx83sK89+FWl29/dLHgi4IYk54+6M16tqTtp+gXTJ8rgqqnr/Ev9BWVKCWpVSelk
eafE3xel1e/YbVyQikbtmON/HX/d9K4eORY8O4yVGBVOGaS4kuXlIMxlbcR/n61YhVbhWQHD
Vx1Z+0noaQgkrntnw/CjSp5G6KEx9dvH9KyvjIxOgxb8DdFjj03LWl4GfbpjR9WbYP0rM+Ms
WNChV+R5ef8Ax5a7Za0mc0m3JHj0YCRIB0Cj+VBI2nHWliwi4H90fypHAbtXjXa6HoMZgsM4
4pHXAGPrzUgBxtH1oOMHf9OKTuwZHERyexqUoqAkjGBUUbKHcH7mPlqTcpGW6H0oTsxrQ7rw
GqebC4zt3/j94V7PKuIb+Q4EYt34564rx3wAxbUYQcCPeAB3zuWvW7lGX7VHLwFiYkfhXs0b
qBx17HzbqMiteXL9SGAz/wABFdp4F8PS3cAuXUGL5stux6CuGvXb/hI70Ljyvl499i11nhnx
GdKkBLgKN2SFz1rmgo+1dzfaB6v4n8RHTvDim3BklQoirt6fmR2rwLzn1rVzPqAzONylU4A6
nHHuTXvUdut3ZGfbmFsDk4PY15JrXhw+HNafUDzA24fez8zE9vpXbUTei2OenJLfU9e8F2yW
HkyRn95jI7/w1gfEv4qa54S8TQw28qfYm8wuoiVmJDEDGfwrovDaBLOKXd1HP/fI/wAa8n+O
90o8RWoY4mAl24Hbf/8ArrdvkheJnJc0zYn+O0d3aXFituJWuFKsXiI5/BxXA2kzXHieGTAQ
TTF9o6DknvVeAyXkoWKFtw6sxAH8/Y1e0+LZqUG776yAHH1wa851JTdzq5YrRHv/AIXV20a0
JHy4AyPrivLPjZKE1qODP3nB/LyzXqvhWeRNBsoiMREDB/4FmvJfjZGjazubOQ/B9P8AV13y
Vqbucyf7w5bRzvu1CfwkdfrXvHgq42afaBjxhRjHua8D0mFjLbmM4JZd2e4zXvnhSMJpWnsg
O4ABvfn/AOtXPhm2tdjarseb/H6Nzr1ohOYxMCx/4An/ANeuX0DS2vrzaFyvHfHeui/aFf7R
rVl5WQrTdGx/cQV1ngHwoLfy5Zk4YgAh++40VKSlUuFKSjDU6nw5pNv4Z0sSyqUZGZt24tx1
/pXifxW8ZXfizxfHDHhbP91uXYBk4wcck9DXf/GTxrJpkculRZAZAwOwH5mVh1Jrx/TGfU7u
38mJndXXcSQBjP19xWlWXKuWJENZczPoH4d6LbQ2MWxSoy45Y+tehX3gK9v5vtK3y20B4C5H
pj+4a4Pwv+50tOcNubNcF+0B4q8Q6dd29tpdxFFgoMtGp4w5PUV002oIiouedj269sPCujRM
dXv5pCQAVjVzk59kHcGvkjWo5JvGzxwkPakyFCeONzYz36Yqo58TeIAFvo1niI3ZUxr9OhHr
XReDxHBqotJPmbDevYf/AFq8+rONR2UTWFPk1uemeAvCYMLSsuQNufn9VNSfGb4hR+HorXR7
NjI8sWXPl5wVYcZOP7vavQPDMEWnKQgOGVW5Oexr5c8VzSax46l+0MCV34IGP4pK6G/ZQM9a
kix4Q0Sa4ulSYAu8gJIbrmvoXwr4ei8L6G+pXgPlIqyKVbcR8o7fiK4/4b+HY1uIJJh8hkUj
De3/AOql/aC8W3nh6xttI0/aVvoSrB1B/jUdc8YFRShyxcmVUld8qOB+KfjCbxhrl5Zx4Oni
TaQU2sQNuOc56rXa/DfRLm00mzm80m2Ea7UJHA5GOmf1ryDQo59Sv0t/JJkBXzuQO2eOfY19
DeC1MehW9vtKKihTk+5rWnNzbbLklCnZHQTfErTfBsNrb3EIaa5YRR/I7ZbtnDADrWJ4mi1D
x6kyQstqkqlvlwPlK477vWuP+JkAi8T6GyjgXK55/wCuden6CcWSyjoLfP5AV0ubehy6Wv1P
k+e1ttC1CfT4i58kAsX5zkA/+zV33gHxLcx32JQPssmFDBefvc55+tcH4hie88e3USjcWEYI
zjgqle2fDzwVv/eMMxAY4f8A2v8A6xrgSftNO52Kf7v3jorrw7F4ktLmyujttkjZ9wYjHGDn
AJ/iPavnHVYIrHXpLKxbzLaHafMbOTkAnrj19K9h+MPj59CX+yNIlAMqgOZI8/eDg4J/4DXi
VuRAQM4UdazxUtVFbk0Ytu7PZvg8yW2oEjowfP5D/Cu08ZuF8ESqxxsnVjj64/rXGfCYoLkK
R0D4/Suw8bN5Xw/mkcgI90q5/wA/Suqim6fyMKu7PlrTHWWCQgn5nLc/hVhHKvjH41X0uL7P
FKCML5hwc844xVkg4BNfP63dz0ov3ULsRFyQfXNWbCRmuc/8s+/r0NVXIkYBehqxacKQOvrT
hJ82g1G61PoXwDp8MOkfaFXMgkXacn0H+Ncr+0nd3cMeiICFtpoAJRgd5E/HvXOaH8cLnwxp
c9gIHN3wYz5SlQQMf3vUVgeL/HOv+OjBLrSxLBGo8oRoqkqWyM4J7gV7rqRUDhcf3i1OeVgF
AHYYFBwG5BDGg7c+woaRHIB4Pavn23ex27bkts7JOm3pkbs+le2/DHXbSGDZagpdpGuWYEjO
T74614iiOrZUA5HStTSNU1Pw9dx3VvbhjK6g52noeOrCuzDaSFU96Lse2+M7zxG6Q3mjyxCW
N90qyKuGUDoMj29RXOx/tB3+mhoJLYmYjGDCpGT06P7113h74gz6zvhuo/KudvKlBjrjsx9q
wPHXg8a7pzeQuJ4iZF+fAyFOOte85Nq1jyvhep23hLXL/VfD6SOVQb2BQKOP5/zrgPijufxv
p5b/AFXmQYI9cmuu8GM9v4bRGOyQyOSBz3rk/iQry+MNOZMGASwE565yaznH3ClrI9I02/li
tGVDhlGQCP8AaFcX4c8SQR+Ib+JGYX+dxYr8u3ZH/wDWrt9NijWCXBO1kwD/AMCH+FfNer32
seGviNLcw26Sae0QVmBUtuKDsWHoK05UlqOOsmj2nxld695IudLmT7SGBaNgmGznPUe479q4
3Uvj9c6XGYrm1MUg+ViYgQT+D+1dt4L+KEesSbWVkvNhI3x4B6Z6Ejua5z4heDYPFmnTkp+/
VxJjeVH3iD/6FUTblEIpJ6njV9ffbb+e7Iw9wxcgDpkk/wBapgNk9MU91dcrLhXUlWA7EU1M
4PT2r5ucry1PSUVa6L2jljqduuB5ZcBs19EfDmytobWKdMiTeuASeu0f41866U+7VbFD1Mg/
TFfSPgKPbpSSdAjqfx2rXo4WKTvYxq83LdHH/GT4ja34S8S2Qs5Y/s5mXzUMSsxX93wM+zGs
q5/aQkW1aIR/MU2FWgHJxg9Gqj8d545NfjkyS3mjgD/rnXBwabqN2WeG2DockZdQcfnXViKk
07Laxz04wcbyH2ty2teL7rVEAi+1MJGH4jIxzX0R4N3x6FYHAw238eTXztYoy61BbEASxkGV
P7vK9/xr6O8BRtcWNijj5EC+Xj/erLDyalc2rcvJoeWftCjf4l03zBuxOCV9fljr1HwlZwRW
tvceWFDNhtpP94+p9q8w/aFXHjDTYz9/zsZ/4DFXqfhlnTSFzjIYfzaur4qrbOVXVLQ5Tx94
p1SP4gWttbXQitJBDvjEaknLYPJBPT3rureAEzMvzbIy3zd8V5n47g/4uFYNFyn7kZP+/Xq+
mFQs5H+qETcnvXV6ku3KcJ8PvEdu/wBritoxDdLISBgkY2p6k+tX/Euq+ILZjqVg6TFMBomV
eQeM849R3rxG11TWPC/xFvJ9PgWS38sL820nJjXJ5I9K9z8NfE+016CWGaBo9TIOQUIBUEHs
xFQnq7I2lHS6OMT9oWaGU232RnlbqrxLgnvyHHpXo/hCwgu4UYIElcbmCk4ztGetedeO/BL6
vCbnSo1F+pGPMkwuMnI5/wB6vQ/CU0kGi25fCS4UlhyPuCoUXe7MpNW0Owk8D3N9dGf+0hAh
J/d8fX/nmfX1qLXT4Y8JQut/cSXE8gBEQDkHBweQB6+vavnD9oPxf4h0fxlp9vbXCJHcLMwV
Y0JOGP8AeFedy6X4xv5ladYzGwzkmMdee1VWrKGj1CFLm1vY9C8CeCIPE/jC/udNu1itfth4
kLAjJYj+A9sV9Q6P4Qh0fR7WzE6T3TbZFZS2AcKOcqO618ceFtUPh7UI492HeVSxxnnoa+h/
DXjW1h0+1me4BdSu5RG3TC+3ua5sO4vWSNqydkkY/wAWfhWD4jtb67vo47l5TIibmwT8mBwh
9u9dH4bj+zWFlauwbyFC5WvEvi54vbV/HltLC++CO4OSUxtXCf0Fey+Fru3bwrpVyCzHywzn
HbP+FdTnBz0M+WSjqdFfad4Pl1Kyu9Xln+1JgKE343fL6D/ZFT65Pp800Z0zd9nUBU3ZyRtA
7/Q14L8XH1m+8SWM9lErWAmwdxUHGE9Tnsa9N8IYtvD9g5ysojV5h2Hfit7q+iJ5Lxvczrrx
kg1j+ypWwzDK/Jx/D3/4HXV2/gy28WQxQ3ONsbbl+dl5Jx2FeOa1po13xfGLcFvLZWl3HGB8
nT9a+kdB0F4vC6XTSBFQOy85PBb29qy5k5tMmXuxv1PPPHHxKtfhVptxplud10ASuYy+dyEg
A5AzkDrxXzXpi3nii6a/vwvnzHBC4XAGFHT6V3nxs8Af8JJ4gfxM5Y3ccaKfnCqQik4xj2FY
vwmWPVpI7dweJcL2/iX/ABrlxCTfLHY2opWbe56/8NPDiWAW6lzsUPzuz1wK4z4ueMj4l1U6
Vpz7InCFiyYPALdTnvivWdXRNO8KagsBIZCoXv1dD3+tfJ/g27uJPF8/mY8vBJ45zsX+lXOX
sqd47iivaTdz6L8B6ddQ2kFvcyiSJUAyMdlGOgHpXUv8QvDgvP7JgtSdRC7sOsm0gHBOd2Ox
qLRCIrG0YrhQinj/AHa8riDL8RUc8M0cn5Zc1qm1C5LSb1Oo+I/h2+8aaNLcCc20dthWMZUN
8zrjqrDtXz14WsW1F2Ea5ELmNySAScda+q9SkMdjexrwzMOD7NXjfwo8HS3E2oyFBta6Yff9
if61y16fPZyHSkotnpHw38MW9hYXOoXSsvkAOCrZ4CkniuO+IXxFHiLxdpui6a5NvGds++PG
cOT1Psh6V1vxc8aweA9D/sezfbd3sDL8yF+4Uc9B3zXzx4TmNv40ikmYCe8maRiBwWO4n6cm
qlONJKK3ZpFOq7s+pfCzpDBaHuqr/KtT/hG/B39vLqt1cTrqEjF5I8vtLbcYGF/rWRpFxDa6
fp0jkjdH82B6CvFPHc2rP8TrZ3kC6XJdnycBc7cLnPGeuK7FZwuzBL3rM+gdRmtoLh2tARb5
+TOc47da5b/hO01bXLjQ5DhrUAjCY4OB1z/tCtrT2W10CzlYmRTBgH04/CvH4bW5vvipqdxb
MFi3LuJx0ymev0NLmXLoVGKcrM9mX4d23imaKYkCe3YSKTIV7/T2FZXi34jJ4etBpySAXEhK
qojJByPU/wC8K9HGlyeHdNW8iGY5FdWJIPTnp+Br5y8UeDpY9bTVIyZEd13hmGQAF6DA/umi
UUkpEx+Ll6HrnhKJbVhKGIIBce5BH+FeUal+0v4g0jxrd2Op3KLYJCrqEtUJ5C55HP8Aer1T
SJBC0AHAC4IP+8a+VfiTDbN47mEinHkRnqazqScIXRULOep7HY/GS18VL9mcrMshJBMLKeOf
X2r0zwxcpAyOeAQ3NfMnw+XzdWVUiKWoRjuYj72B75r6Osri1SKIO5Mag8gH1P8AjUUKjlqz
SrFRV4mzpvgbwbpGqPf3Mtw9xKGYrufHzHPZR700yI+tu9t8kbMxGfTnH9K+d/7T8Rn4hJa6
pOgtGMrQiNUyV+fbk4z0Br6G8PWayajCH4jeMsST7V086cnoc7jpds+Q/GzkeMbhYBiAbid3
Une//wBash90g61p+J7tLvxVqUiHMUUrRA4weHf/ABFZAmGGx1HWvmsXrVf9dD1aN1EMgH5v
0pzMHQ4prbWx/eNKE8s89+a5Uro1bGjo3H40mFXrSt8zBV/M0gZY5AvPvUO+xCkOzlDtPy96
Q4jXPrT28sKcZG41CDtfA9cVTduhpcUg5wTQjDcw9O9PlKsMZxiowABnOTUy1Wo0Pcho8jPW
jC/lQXAUAcn1oLo3GDmhNSViNbjdyLjk4pyuMYAOPWoxtcnjC0+M7XB7AVWyt1LELZ+YHNOB
8r2z3qNMK5JGM05pM8ZBGM1CTZFtR5cKPm49KQ4c8c00FVB6ke1LLhCDGefek1bQq7TsK8io
ec0Kxc4PQ9KTaD87DpzQZPmB/KnJWd0K19hzbk54A7VEXYPnIye1TM+5enHeoo1UOzc5HQUQ
kuqGlfceuFUsw+Y0KykZ5zQGabtjbzTJff8AOqbj2Ja96wssh2hKcikLz0qJhH6HnpT2k4AB
xQ27WLtoPcKzBs0kpJz/ACpPKB6U8bZQd3WsXKxNrDBh48dBSO7KcgdKFATgfe9Kc7MwxwMd
RRFNg/Ii2q5BBwxNAYJnPDdqcrBecGlYKTkdat6vUq4v3FGTg9qjkYuQO/tTvmcc0oYNwyk7
eM1pbQVwxtTJ4IHFRBwPvfMx7ipm+YYHTvmmq6Rjp83as3e4rPcNxOMAUOWbgUwszSY4wTUu
NowRwOlTZpF8tkJllGF6DrQJMZ9DTWkP3R1qNm3fKe3WrburpBGN9yaGXYW9MVGHBAIyM1IE
2Ddnk1DuU44xz1qLtism7EsihmwODSTDA2rgkdc0kjc4B5p0km9s+nB+lat2epLi0yJS3lbj
inlz5eB39aazBh8nP1pA+EIpu+4x6NuT5uCKR3Y98YoA3ULkZU1HmJ2Yr7BgHP4U5jxgHimq
i5J79qaDngmlddCuXoNkj2n0HanRsNwBOcU0fOSzHkdKcoz83XHWoWqLtoI0nzEDp703zQSR
iibaylh260QqpXrjNO76kfCKLjZwckelDPkBgMZNLs2FiOe1BV5F5xgVbemgm09URl2Qc854
qUNuTqARUbusmO+Kf5bEZ7U09LMHsDFyMnGPakMqIevvSK+Mq3WkICk8YFDK5UtRxmWR8DOQ
OtGzyj6mlWISYwee9OJQjaW47msW+xPxaIR5AACOT70wSA/WmMQpOOp9aXJUcjj1rVCa1uh6
sR16mo5TjoR+NSM3y8g4PSkYKwxSTKd1qNUB2BNOkyuQPu0LwozxQcdQMjvTluF9Rgz0/hPW
kK4b6dBUpwV4GBUBIBz+tJ3ewWCWQjCnpTxJkDjimoPMb5hwOlSjCkgdximmlo0S30Gsw2gY
6U1mJUADoacU2n5unagoWX5eMU90CSWogJOG/hpHn596DABgFuKRsRsccMfWpU0nsU1ceW3L
hsY9RTXl3cDoKcjFDlunSmntjg0S7glZ7CZBOCKQZJwanYL5e3nNNAyw8sdqrWwteg2XKgKF
yPepDsYdzSGQMB9Oc0rMIR1pJvl1FbXUjkJ49BTowCpB5prgkEZHtSxuYl9fQ+lJb6jfkSmU
KmB2HSmFty7gPrQ7byvHJpSjAj2qrkOydhVYADNKzk4waaxJIz25oLk+5HUU27q5VyQELk45
qWIMDyBioncOoCDPoDT1YIpzxWEk17w7CTou7IHPc1YtwF6cCs9yGm4J21oQOEAAPGe9Utrs
l3Za27gQO3WoQuDk1YC/IHjI54zTZMgZOM0X7iuQyDcwB49CKUBg4HtTY053Y5p/UZHJHrTc
jRLmEG0jPIzSpIFOMZz3pu1nOVHSlVQsmSOlJttagkTlv3o3VMSN646dTUWcnGDnqKkDAjBG
O1JJN6AXrMr5mR1rpbG5bygDwFHBrmNOUiQAcjt+tdHbkpCG44FCXLLQTSL63W0kufpxSrfn
ncPl7cVnMwkzk+9IFOMYyO2a3Ta3Iem5sDUVdDg5I7EUh1UAnaefpWMJjnA6UhIYhs89armv
sG5qvqzgAqfqMVTl1R1zgjafaqM1yBy5wD6CqUk5bnqp71N2xpFyS6KJ8pwvpim/bCyDJwuf
SqMsjFSeMCo2u+Bz+lZuo9hpamispLBgeaQThs46ZqoJwOPXvSi6IGOMDpShre5T8hZZSc54
A4NUpiQVI+9ViSVV61TnnAB9aTk5aIsiuZGUDkA5zUQkV1Yk8jqRScHf71DKTGAB371djNK2
jJHOVOOgHFQCQnIHWjJVQR170xycEt0PSktrDsh8jNFgnGW4p8b88cHvVVHbfgkEdhVtUGck
c96h6FWtoW7aQxt6+lbNjc73O49faseLAwRxjvWjad8de1PR9BNJrU6jTJvJZV98gfjXaafN
5kQYfc5HPXNeeWFwYgp/iPH611mnXm1VBPU4HFZ37md+x1Eb85xUmSWzjNV7fcwG3p61ajQZ
wOaHsappjwy/Q0qER8mkCgNh849qfsJ+bAzURlrqFriO/U54pV+Yc1IgV/lIpnmxw7vUHjrV
z7oQRZGc02W68s8nj6Vmahr9vYxMWYhhz90mub1Lxk8hIhIVWXk7O1VyPZjTSOl1HX44VYEk
MOny1zOpeJpZUlVSMEEZ21zt7qLTlmzkt7Vmi7YSEZyM+lOygtBNXdy9canI+7OMg9cVny3R
ZiT94+1KzI5b171CzAnHcUndvcl32ZBNJ8vtWbdyKEDN34yKvSosfIOfXNZl6VK5arUvddyt
rH7e0UUVoQFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVy/
xQz/AMIHqW3r+6/9GpXUVy/xQ/5EPUv+2X/o1K5MTflVhrc/NHRo2aO75wvnt/SpJWWNjnkU
3Q48xXbZ4E7f0olK7if4s1tZyZFT3mU7jDOMd6gkjA5z0qdyDz29qiduw6UnF9CNys2CwwOa
id/mxjp1qYkByT2qNxuJ9GrWNkimiFyrAnnniq8vyoAD06ireNlVZlwTnuahS5dSV1KbAS9+
lb/htXlukjwGIIxn61z0zMmMDHcU+DUJI8bW2sOnWuqDVyGr3PoPSvD19cxqwT5Qf7455rz7
xb8MdeGpSXYgQQiMA/vlyABz/KuXi+IGu2sQVLoA56CSTH/oVVr/AMaa/qcm2a5JgIwVMrn6
8bsdzXZNwlG1znVOSlczp8wzNGrZx60wuMHnPuaco81t7fSo5CQOPxridRJ7HQAAZSp6+ppH
Qk7eM0rjJBJwMZpxBKgfjmocU9S+a2pEQVH0peCKeXCc9/WmD+IjnPf0pLVBfmIM7eRyTTs9
OOvpSrFs5PJPNBZt4YfdHWm9VoTJsHYoB2NIcygfrT1IY5Pel6dselTZvQtaOwwGMNg8Eeg7
0rNsPAyD60koyRg4Pen8CMf3qu+gpKyLWn2E2pzCOEDe2AOcd8V6T4S+A+r3lyXmYpnGN1wp
7+wNeaR3b22JoW2ODlSMjn8K1V+JXi23jVra9bd3DTyAfo9ddGSWplNSa0Pdb/RIfAkIF1cK
20bgI8sT1P8AdHoa8F8X6w/ivWpLxnIjAVVUZAyB6HPqazX1/WLq5Mt5dbiwwVEjkfqagUhV
+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
tDKDk9vSs53asho//9k=
--------------010303010409000005060507
Content-Type: image/jpeg;
 name="IMAG0181.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="IMAG0181.jpg"

/9j/4bBiRXhpZgAATU0AKgAAAAgABwEPAAIAAAAESFRDAAEQAAIAAAALAAAAYgEaAAUAAAAB
AAAAbgEbAAUAAAABAAAAdgEoAAMAAAABAAIAAAITAAMAAAABAAEAAIdpAAQAAAABAAAAfgAA
AVZIVEMgRGVzaXJlAAAAAABIAAAAAQAAAEgAAAABAAuIJwADAAAAAQBwAACQAAAHAAAABDAy
MjCQAwACAAAAFAAAAQiQBAACAAAAFAAAARyRAQAHAAAABAECAwCSCgAFAAAAAQAAATCgAAAH
AAAABDAxMDCgAQADAAAAAQABAACgAgAEAAAAAQAACiCgAwAEAAAAAQAABhCgBQAEAAAAAQAA
ATgAAAAAMjAxMToxMDowNiAxMzozNjoyOAAyMDExOjEwOjA2IDEzOjM2OjI4AAAAAa8AAABk
AAIAAQACAAAABFI5OAAAAgAHAAAABDAxMDAAAAAAAAYBAwADAAAAAQAGAAABGgAFAAAAAQAA
AaQBGwAFAAAAAQAAAawBKAADAAAAAQACAAACAQAEAAAAAQAAAbQCAgAEAAAAAQAArqYAAAAA
AAAASAAAAAEAAABIAAAAAf/Y/9sAhAAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4d
GhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQyAQkJCQwLDBgNDRgyIRwhMjIyMjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAHgAyAD
ASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUE
BAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygp
KjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaX
mJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T1
9vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAEC
AxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5
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
AAAAAAAAAR4AAKprAQAAAAAALAoAAOsKAAAAAAAALR4AANaJAQAAAAAA7AoAAN4LAAAAAAAA
FB4AAOmnAQAAAAAA3wsAAM8MAAAAAAAAJR4AAA7GAQAAAAAA0AwAAKcNAAAAAAAAEh4AAB/k
AQAAAAAAqA0AAK4OAAAAAAAACB4AACYCAgAAAAAArw4AAIAPAAAAAAAAWxMAAAAALABMAGwA
jACsAMwA7AAqArkCmQN0BA8FxQXUBtgHNQnDCjkMpA0ND18Q9hBREqMTCxWfFigYqRkdG48c
/R1xH4QgrSHoIoAk2SWDJ/UocCqXK10tzS5FMLMxajICM6AzKTSmNEU1yTVpNvw2kzc8OMU4
VjnUOYA6FDvHO1w84Dx6Pfc9kz47P8Y/XUDyQLBBikJBQ75E6kQKRSpFSkVqRYpFqkXKRepF
CkYqRkpGaka+R1FIO0kJSqFKLEsnTB5NV05OT29QoVHPUgJUeVR9VZ1W+VdwWdNaLVyJXQlf
TGCnYQRjcWTmZXVnvmhGagdslG3bbnBwGHKvc1R153V/dgN3pHdOeNV4XHn+eax6WXvze4N8
B32pfU5+5n6AfxKAqIBAgcOBWIL7grGDWYTshJuFh4Yvh36IqojKiOqICokqiUqJaomKiaqJ
yonqiQqKKoqIiy6MF432jW+OD487kFiR5JKdlC6WrpdjmdGaT5unnByeqp9uoRajwaR/pnCo
BqqHq6ys1q0arzewTLGJsj607bWCt9K4RLrmuxi9qr7xv43ALMHKwUPC18JYw+jDecQexbrF
TcbbxmzH5Md3yOvIbskOyqHKJ8u7yyvMvcxIzfjN486UzwLRLtFO0W7RjtGu0c7R7tEO0i7S
TtJu0o7SrtIr1MTUqdWE1hPXl9dh2HHZftqf2+LcDt5Z33zg++Aw4oDjAeWj5jToxulw6/3s
Xe7b7wcAswGHAz4F9QalCEEK8wvFDYkPEhH9EvQUtRYOGL0YdBkGGpAaIRuoGzQcvhxRHdMd
bR7nHlcf2R9cIN4gXyHlIXQiDyOnIzskvyRfJRsm/CaJJwkpNSlVKXUplSm1KdUp9SkVKjUq
VSp1KpUqtSooLLkswC2/Lmgv+i8yMWoy8jO6NXI3RTkCO2c88DxkPtI/bEE9Q+1EoEZqSChK
xkt2TdxOsFAJUpxTNVUSV6ZYTVruW7JdP1/lX5lgMGG8YTtixWJkYw1km2QkZcNlYGb8ZqVn
PWjFaF5pEGqoajFrwWtMbMdsUm3CbVVu5m54bzlwEHG7cRxzR3Nnc4dzp3PHcyx0UHRwdJB0
sHTQdPB0EHV5did3L3gbebx5a3o2e218rH3WfhSAT4GdgtKDYYSXheeGcIgMiqaLRo3xjlCQ
0JFPk5OUMJbZl36ZSJsOndiegaBaoh6km6U7psWmUafip2mo+qiFqTmqtqpiq/KrgKz+rKut
Qa7troOvC7CIsBGxnLElsqmyMLPLs2q077RxtR22BLeWt+646bnuugO8Br0Rvg+/Pb9dv32/
nb+9v92//b9Jwd/B98Lsw4TEAcU0xm3H/sjbynfMBs6zzzrRutE009/UcNZo2B3aHtwG3s7f
cuE546jkWOZo5wjpZOrA64DtRe8DALwBWwMgBaMGcwgRCYcJKwrMCn0LCgymDD4N5A1cDgEP
pg8WEKoQJxG0EU8S8RKREyAUlRQuFbgVOBbNFo8XbRgeGaUatxvWHO0dEx9CID0hXyF/IZ8h
vyHfIf8hHyJvI+sj0yTkJXsm+ybKJ/8oOCp2K8QsKi6ULwgxeTHKMiY00jWNN1Y5BzvkPI0+
IEC1QSpD4ERNRk9I9UnbS3VNhU+HUYhTblV3V35ZS1vMW19c21xwXe1dhl4MX55fIGCxYEdh
ymFaYuFig2MRZJJkGWW9ZT9m4WaHZxtosmhdaQJq62qUaxJtOm1abXptmm26bdpt+m0abjpu
Wm56bppuum7ab15wT3FKcrlyVHOHdNp1cHdQeQZ7unyyfiWA54BughSExIWyh3KJO4vcjMuO
qJBukvuTYZU7l3GYuZlQm7WcIZ6Tn/agbqLjo2iliqb5p0mpt6o5rAiuCK+asNWxNrOptP21
RLf/uMy6ibwFvqG/KsHFwmnDB8SexCHFqMVPxhnH+ceZyLvJ4ckByiHKQcphyoHKocrByuHK
Acshy0HLYcuuzGjNXc5Mz7/PQtAF0S3SaNOu1B7WbNe/2Bnao9r/227dDt/j4JTiXuQN5rrn
Uun46jvsNO0Y7wMA+AHsA/AFuwfkCeULFg4VEO8RyhPrFfMXghloG1QdAx8yIUYjVyVBJwsp
0Cq0LIAuSzANMqszTzUKN6s3OzjVOH45Hzq5OnM7fjwePUM+aT6JPqk+yT7pPgk/KT9JP2k/
iT+pP8k/6T8JQY5BYUJRQ8hDWESNRdlGjUhqSj9M603GT19R9VGIU0FV3lbdWNBaulzjXs9g
i2JaZBtm52cFafNqTGzBbalv6XFGc8h0V3aNeIR6wnxPfoWAIoIbhHOFLYbfhlyH4IeGiBuJ
w4lRivSKiIssjLOMQI3NjWyOE4/Lj2yQ8ZCLkT2SIZPPk+GUB5UnlUeVZ5WHlaeVx5XnlQeW
J5ZHlmeWh5bHl2GYPpkqmsGaLpvwm0edoJ4CoIShD6OypCamnKYPqHSpSaslrQOv2bDpsr20
TbYHuJu5irsAvQi/EcEXw/rE78azyNjK2sztzhfRHtPt1ATXFdkt23rcHt3O3Vre8d6L3zvg
veBW4dfhiOIh49PjaOQI5ZDlNObP5nfnDOiJ6EDpKurH6urrEOww7FDscOyQ7LDs0Ozw7BDt
MO1Q7XDtkO337qDvBAAVAZEBBAIwA2cE9AXIB6cJjwvXDYIPGxCvEWwTDRXjFuIYFxvfHOce
uSB3Ij0klyUqJn0ncikcK7EsIi7ZL9gx4DMFNmA4QjpiPEI+ZkCdQgdECkYmSM5Jm0uATRpP
31BlUfRRcFISU6FTLVTEVGBVA1aBVi9X4ld3WD1ZJVrhWiRcSlxqXIpcqlzKXOpcCl0qXUpd
al2KXapdyl0vX9FfxmCrYSZit2J2Y5Fk0WUcZ3xo3Gkxa3xsIG1bbrVvjXFacwx1yXaWeGB6
AHzFfRh/439agVSDOIVHhyqJ/IozjfmOApFMk2yVUpddmY+buZ25nw+hFKMzpTenOqkQq/qs
tq5MrwCwpbBCsfixgrI0s9SzVbTWtFu1A7aetmW3RbgEuVu6gbqhusG64boBuyG7Qbthu4G7
obvBu+G7AbxgvfC99b4DwK/AK8FcwqXDOcULx/DIwMqyzEzO185S0CLSx9PX1cfX4tkG3Ovd
2d/M4anjL+Uf5+7onuqq7Pfti+8CAI8BJgMrBTYG8QeqCW0LfQ2XD7ARQBM+FVcXjxldGwMc
uhw3HcYdPh67Hkof2B96IAshviFgIhEjvCNGJAgl0CVvJn4npCfEJ+QnBCgkKEQoZCiEKKQo
xCjkKAQpJCmWKi4rGSwlLbktRC4dL4MwyjFPM7U0OTbtN2E58zk4O7w8hz43QPNB0kO7RW1H
BUnHShlMP01aT1tRWVN7VWBXZ1mrW+NdDGALYgdkG2ZLaDxqO2xxboFwqnKRdKV23HhxegJ7
hXsyfLd8WX0ZfqF+Qn/Ifz2A2YB5gQGCoIJQgyCE8oSVhaSGyobqhgqHKodKh2qHioeqh8qH
6ocKiCqISoiwiU2KXYtkjBONtY3rjmGQ8ZHXk82Vs5fDmVib/Zt2nU2fHaEbowSlH6cuqeGq
w6zLrpiwJLK4s2q1z7YzuQC7y7ygvu+/4sEaxGPGbcjaybnLtc3Nz/XRtNMy1gjYhtql3Dje
+N/84eTjFObM5lzn3edq6O/okekp6sjqXesD7MzsmO017jjvXu9+757vvu/e7/7vBgAmAEYA
ZgCGAKYAxgAOAqkClQOJBAYFmgVkBrMH8QhZCpYLBQ2HDusPlxDaEUAT0xR5Fu0XlRk4G/Ac
fR4ZIFEhLyL1I9UltiezKaEroy2/L6kxxTOyNeA3nTmgO8495T8LQhNEC0YoSONJ3ksZTi5Q
/lEOVCVWAFi2WE1Z11lwWiZbwFsyXNRccl0DXsRekV9MYFJheGGYYbhh2GH4YRhiOGJYYnhi
mGK4Ythi+GI9ZPJk4WUBZ65nN2hdafxqiWxzbkNwMXI6dLd1Xnbsd8B5m3uifat/24Hng+6F
BYj5icCLbo2Lj4qRWJNgla6WXJgbmgGcKJ4PoIuimqTFpjKp/apYrPesh60prt2uaK/wr5yw
M7HFsVKy7bKQswW0o7RStfC1krYtt8i3YrjnuKm5iboVuw+8NbxVvHW8lby1vNW89bwVvTW9
Vb11vZW9tb3gvnu/WcBxwQHClcJaw4DEvcUYx4fIAMqZyxHNps34zjrQ7NG50zvVANfZ2LTa
X9wN3mPfaOBq4lTkbeas6Njqx+wE7wAAEwK5A7gFpAdgCXwLmg37DrkPOBCyEE8R1xF9EgYT
sRNXFPUUjxU/FrwWThfJF0cY6hiHGSsayhqDG10cKR3eHfoeIB9AH2AfgB+gH8Af4B8AICAg
QCBgIIAgoCDaIXsidyOIJBslkCWtJjcoqCmtK10tPi8bMa4yWTPbNLc2jzifOnU8pT6jQLRC
yETfRrBIOUoSTO1Nd09nUWBTpFVvV1RZzloqXTdf3WAdYxBlHmdsacRq0mw1bz9xO3O5dTl4
cHpYfJZ+jIAzgdCBZ4L6gpGDQITShISFO4bkhq2HeohBiTqKYIqAiqCKwIrgigCLIItAi2CL
gIugi8CL4Isqjb6Np46rjzeQuJCckd6SNpSolSuXpJgwmpqbRpx+ncKeTqALonKjG6WAphao
qKlNq4msgq0Mr8aw0rKAtDq2ILiwuZi7jL2Gv6LBnsNQxR3HJcn6ysnMyc7J0JrSadRg1lzY
NNr129zdj98+4PLgiuEZ4rziVuMA5JrkNeXe5bHmdOcn6DnpYemB6aHpwenh6QHqIepB6mHq
geqh6sHq4eo87PXs3O3i7oXvAwAhAdUCQgRPBjoICQryC88Neg4REMsR0RPwFQ4YCRoqHDMe
UyBCIh0kiiWnJqIonipDLEYuhDCjMik0QDajOKQ6Fz1oPtFA10LuRANHf0mgS8VN8E9DUsBU
31b7WFBbfV3CX01hBGKsYldj9GOCZCdluWVnZkhnBmitaKBpyGnoaQhqKGpIamhqiGqoashq
6GoIayhrSGuZbEVtMm5gb/ZvkXB3cbFy+HN4dep2eHgGepV7M3yRfd5+ZYDsgXeDEIW/hkCI
polZi6aMzI3Mj5eRRZNVlWyXVplemzKdwp6ToDeiD6QSphyoLaoXrPqt1q+qsYCzOrUjtzG5
/7qNvFe+LcDrwQHDjMM1xMzEccX2xabGVMf/x8LIjclIyo3LEsx8zPDMVs3EzT7Oac6JzqnO
yc7pzgnPKc+K0DbRM9Jw0z7UxNTi1YDX/9jh2pzcId4g4OXhi+IK5Nnlwue26bzr0O367wcA
KgIbBO0FhAeXCa0LRA1zDwwR/xIdFVQXAxk0GzQdeh/EIQMkSyZdKMsqEy2mLw0y0DJqMxQ0
rjRKNeU1gTYCN5o3NDivOEU53DmqOlg7Bzy0PGk9JD7aPgZAiUAMQYRB/kGHQgJDLUNNQ21D
jUOtQ81D7UM6RdlFtEbVR2FI7ki3Sf9KXkzbTS5PhFASUphTOFSgVctWPFjIWWFbHF2dXgpg
V2H9YkdkJGWeZsVo2mqPbGtuG3CycTlzFHUddyN5tHoyfAJ+1H+EgSiD44TIhniIaIkuitWK
k4tVjFSNKI7HjnaP/I+VkD+R7ZGMkiGT4ZOClEGV8ZXMlrCX2Jf4lxiYOJhYmHiYmJi4mNiY
+JgYmTiZWJnamnybXZyfnUSe854YoMuhTaMvpeKmlag+qjmsxqxcrgmw57HSs8C1cLeYuYe7
qb2ov3zBHsP4xO/GgsiiymvMwc4f0bbS5tRh17nZv9tg3Z7f1OHU4wzmYejl6hXtpO8AADEC
YwTMBjYJhwsrDOYMeA0sDsgOcQ8WEJEQJxHFEYESTRMLFAcVLRVNFW0VjRWtFc0V7RUNFi0W
TRZtFo0WrRYrGMEYlhmpGl4b5RupHAMeRh+yIB8igiMIJZ0mKCeNKLApHivLLGwuBDDFMYcz
/zSWNrA3sTgJOko7Tz3VPmtAQEITRAlG1kffSXhLM00cT7lQWlIKVI9VKlevWABaZFsKXbpe
W2CYYTJjfWQhZaFlMmbKZlNn62dzaBZpxWmDaiZrxWu5bK9t1W31bRVuNW5VbnVulW61btVu
9W4VbzVvVW+xcFtxS3KKcy10ynTOdX139Hi6emp8D37jf7mBZYL8g7uFpoe7ibWLc41ej3WR
e5NplU+XXJlWm2CdIJ9LoUGje6WOp7qp9as9rluweLK/tNW2abcPuLG4PrnKuWC66bp4ux68
wbxMvc29aL4Nv6+/XsD3wJrBO8LVwnHDIcTExJPFeMaLx2vIkcixyNHI8cgRyTHJUclxyZHJ
scnRyfHJEcqfy07MOM1FzuPOf89e0JrR1NJR1MnVYNfk2JraM9uP3MXdPt/d4JviNeSu5YDn
weiI6kHstu3/7gAAyAE8A4QE5wUcB5UIIQrQC58NSw8vEcUSBxRVFRMWXRckGOUY+hn0Gq0b
qRxQHbEdRB7nHn8fICDYIJUhMSLKIl8jACTKJJIlRSZRJzkoXyh/KJ8ovyjfKP8oHyk/KV8p
fymfKb8p3yleK+4ruyzpLY0u+S4DMJkxCjOyNFg2CzjJOX07Gzy3PT0/HUH6QuBE1kb0SBNL
IU0JT7RQ/VGTUpNUf1azWJBaTFxbXmxgYWKIZOVmEGkta3htlG/tcXVzonXBd/V5UHyJftCA
fYIng7ODWYT9hJ2FNIbRhoCHLYjUiIyJKYrXiqaLgoy4jZSOuo7ajvqOGo86j1qPeo+aj7qP
2o/6jxqQOpC0kUaSLpMulLuUSZUxloCX5pg4mqmbA52nnjaguKA0om2j56R3phmo9qnKq7Kt
K6/asFOyY7M2tTO3xbhHuv67kr1cv57A9MFtw+HEPcYTyLvJcct8zRXPCtHa0r3Uita32OXa
Ltwz3X/eJd9n4BHhpuE74szigeMU5MrkZOXd5Y3mS+de6E7pdOmU6bTp1On06RTqNOpU6nTq
lOq06tTq9OqU7EPtPu5p7wUAkgCuATkDrQRzBv4HkAlLC9UMXw3mDoAQfRJIFP4VxBfCGZYb
cx05H68geCIrJG8mBigMKgcs9C3bL6kxczO8Ne435DkUPDg+UUBIQoREpUb2SEtLO00FTzJR
T1NkVZRXZlmFW3FcA120XUde0F51Xydg4WCWYVZiBWMbZARlKmVKZWplimWqZcpl6mUKZipm
SmZqZopmqmY6aOxo4GkBa4hrFmwTbTpufG/McClyjnMddct2ZHfWeDN6g3sCfZV+HoDWgXOD
zYRzhrqH+YhciiqM4Y2Nj9WQEZKbk2yVBJecmHuawJuJnfKei6AOovOjKKV7pqmnwqgAqlCr
f6ycrc+uBbBgsRqy4bJsswO0trRbtdy1kLY5t/u3tbjCuYm6r7rPuu+6D7svu0+7b7uPu6+7
z7vvuw+8L7y6vWS+Nr9JwOPAacF6whfEfMUQx7HIOsr8y3PN/M2YzzHR+9J21D7WH9h62R7b
CN3P3orgfuJH5BXmBej16ZHruu2b7wQACQLwA7QFnQeTCbQLzw3jDw8SwhJQE/MTdhQoFdQV
YRYAF4gXPBjrGHQZCBraGoobOxzNHF0dCB6gHkEfBSAlIeUhCyIrIksiayKLIqsiyyLrIgsj
KyNLI2sjiyP5JK0lfCabJxoouyjGKf4qQiyXLe8uZDDDMUgz+jNoNZ429TeDOQU7dTwSPrk/
EUGmQsxDH0XSRuZHGUmjSmZMJk4yT39QXVLZU+JValchWaJaZlxTXp9fQGDOYHthCGKYYhpj
z2NvZBlluWVbZudmgGf0Z6poWGn2aX5qJWuqa2NsGG03bgxvMm9Sb3Jvkm+yb9Jv8m8ScDJw
UnBycJJwsnBEctVymHO6dE9133XMdmN4uHkce4p8/n2Mfz2B04E4g5iETIa3h4CJlYtDjaaO
i5BBku2S+ZOglUaXC5nPmo6cVZ4zoB2itqOTpQmnHaniqtisma6OsHSx+LGHsiOzrrNOtOK0
kLVdtv+2j7c2uPK4g7kSuru6Wrvtu6G8Pr32vay+YL9ywE/BdcGVwbXB1cH1wRXCNcJVwnXC
lcK1wtXC9cKGxCzFA8Y3x9bHd8hwycDKHsxtzdjOJ9B80d7SddPI1CjWmdcs2bPaLtzC3Vzf
u+A/4vPjlOUc52vorunO6kPsme3U7gQAkgFKAwUFqQY9CCkKtgvxDKYNTw4GD7APWhD+EIwR
WhL9EqUTNxTdFI4VKBa/FnoXBxizGFYZHxrXGpYbUhyaHboeSx/VHyMgVSB3IJcgtyDXIPcg
FyE3IVchdyEgI7kjtyTrJaImSidKKNgpLyuSLPEtSi+rMAwyrjIpNJo1VTe1OHU6TTwnPrI/
TUHwQm9E0EV5R1dJ/EoRTb9Ot1DCUmtUQFYKWMhZfltkXT9f7GCZYTBirmJpY/xjjWQMZcRl
aGbpZoBnM2jqaHFpFWq3ak1rE2y9bHBtJ27MbphvNHBncYJyqHLIcuhyEnPAc1p0g3SjdMN0
43QDdSN1Q3Xndop3e3iMeSl60HrVexV9bX7HfyOBcoLXg0WF6IUjh6GIMYqzi9uMK46mjwmR
f5IqlHeV/ZazmECaWpznnV6fCqEwoj+jZaSjpR2njqgbqper1azlrWavk7AFsuWykrMitM+0
arUGtpy2HLfHt3e4Crm3uWq6/rqfuzm84bymvVS+E780wP3AIMFAwWDBgMGgwTbCIMQYxTrF
WsV6xZrFusVjxw7IAckTypHKLMtNzMTNO8+X0PLRPdOJ1NrVgtbV1zbZhtr620XdRt7q35jh
8eJ35ETm3Od86STrAu0/7pjvAADPAW8DVgUhB9IIuApvDBAOIBD4Ec0TshWBF34YHhmxGXAa
HBu7G0sc/hybHUwe/x6mHzkg3SCTIV8i+iKlI1UkHSVVJkInZyeJJ6knySfpJwkoLShaKXkr
pCw4LVotei0PL9IvzzDiMXwyHjM1NIw14jZMOLA5ADtkPNA9eD6vP+ZAOkLPQwBFWUboR4hJ
DUuoTEtOl08AUSJSAVP0UyZVf1YJWHBZCVslXBddMl5XX7pgP2J0YxtlrGZxaNFpMmvHbF9u
H2/cb31wLHHAcWJy/XKhczV03nSMdUN24Hasd3d4IXk6esR7JH2vfiSAnYFLg5+E0YTxhBGF
xYUahymJQYr2i5iMk42/jmyPH5BEkbGSBpSDlfiWQJjGmVOb7ZtInbeeRKDUoVSj+qRuphKo
sqlGq7qs+a2rr1WxJ7PttJS2Yrgauvu7v72vv3vBMsMMxabGYsgcyrjLm82rz4bRR9NE1R/X
4deR2DnZy9mA2izbyttv3ArdwN1Q3vvekd8+4PngxOGm4pTjleS+5dPmyOeZ6GLplum26dbp
9ukW6jbq1uq97GbtU+5m7/HvBQD5ADcCdwO5BO4FUwefCAoKjgrrCysNhw44ELwRXhMAFY8W
zRcRGXAaqhvTHAUeqB8lIRUiQCOQJCEm0yd7KXcrVy0nL6IwDzJUMwg0zjRzNRs21zaqN044
/DigOVI6ETubO0I8yzxZPeo9gT4oP8s/gEAoQehBjEJDQwpExkSBRT5GSEdPSDxJbEmMSaxJ
zEnsSQxKLErmS59Mb01+TiFP0k/5UFxSqVP2VBxWYVetWPZZslr8W0BduF4qYI5hQGPhZHlm
7mdgadpqN2zWbZNvN3HKcm50Enahd1Z56XpwfAZ+tX9DgSmD9YTdhpGHIojDiI+JMYq7ioOL
MozhjHqNAY6tjmWP+o+MkC+RypFlkgyTsZOHlE2VIZahl0qZwZp0nD2ecZ9NoCKhVKF0oZSh
tKHUofShFKLno5mkWaU0pramb6c8qDmpMao4q0msP604riKvsq+PsICxcrJ3s2q0QbX6tbS2
Sbf3t764Z7kWusG6+7u/vPm9G786wAjBvsFWwubCnMNBxO7EmMVbxvbGlccoyPHIjsknytrK
hss7zOfMss1vzhnPtc+C0DzR5NF+0ljTE9TU1JzVTtap1//XH9g/2MjYtdrK3FPefd6d3r3e
3d793h3fPd8H4bzhX+IE44bjHuTA5G7l+eWR5iTnv+ds6Pbokuk96sjqV+v767fseO0K7rHu
Ne/I7wQAlQA9AeMBjQJGA9UDggQGBacFaAb5BpQHOgjpCKMJXQrzCpkLJQzGDG4NPg7xDqQP
LxDwEKERRBL2EqITQhQFFaQVTRbuFpsXUhgXGeYZjRovHG4cjhyuHM4c7hwOHS4dTh1uHY4d
rh3OHe4dDh69H1ggXyHLIogjLyTlJJUlQSb+JsgngCgmKc0pnCpYKwYstSxULSou/S7lL8Ew
iTFRMgwzwjOONDg16DXBNos3ZDgoOQI69Dq/O4U8Qz0APtU+hz9MQA9BykF8Ql9DLkQBRdJF
q0ZqRydI9EjBSZVKektATBFN503MTspPsFClUYxSNVOxVG1WPFdeV35Xnle+V95X/lceWD5Y
Xlh+WJ5Yvlh3Wh5b+VsJXQZe8F7kX9BgsGGxYpNjlWSEZXxmdGdUaElpRGogaxds+2z6bQZv
52/XcJxxmnKDc1p0MXUJdtt2w3emeIx5gnp7e2Z8SH0gfvt+1X+NgGSBQoIOg9+DqYSahXKG
ZoctiOeIu4mNimqLO4wWjeCNqY6Tj36QZZFCkjWT6pNglXiXS5lQmnKakpqymv7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgMCfwp9+f5mVmJSAf46WjpWDfpKO
kY6Afo2Njo2Af4uMjot/f4udi5KDfpiJnYqDfpednaKIfJ2VmqGHfJGXnqGHfI2al5iFfZWS
kJSEfpaKlouDfoaGhoZ/gImViZWDfoiLk5KDf4aOmI6DfpGWlZmGfo2QjpiEfpCLn5qGfpSS
oaKIfIqEj52DfoiFjZCDf5CElYaDf4ODg5iCgIKDj5KDf4KDlYyDf4mBkJKEf4GBipGCgIiI
mJyFfoGKkZyEf4h/jJGEf3+AhJCCgYiCm5mGfn+Gi5eDf4OFkpCEf4OCl5CEf4B/f39/gX9/
f35/gn+Afn9+gYCBf39+gYCBf39/gYGBf39+goGBf39/goGBgH9+goGBgH9/gYGBgIB/goGC
gIF+goOCgYF+goKDgYF/goODgoF/gYODgoF/gYODgoJ/gYSEg4N+gYSEg4R/gYWFg4R/gYWF
hIV/gYaGhYZ/gYaIhod/gYeIhod/gYiIiIl/gYmLiYp/gYuLi4x/gY2Ii4h/gYmQio6Af42Q
jY9/gJfsl+18gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgMKfxJ9+f5iTmJR/f42QjYqBfpKO
kI6Af42MjYx/gIyLjYqAf4uSioqBf5CTiYiBf5KXiYmDfpiYiYiDfpqYiIeDfpqch4eDfpOU
h4aCfpaKhoWBf4WFhIR+gYiXhISBf4uVhISBf5iPhISDf5eXhIWEf5KahISDf5yahYOEfpye
hISEfo2Yg4SDf46Mg4GBf5eFg4GCf4OggpeFfp2agoSGfpuTg4GEfpiYg4OEfoaRgn+CgJea
gYOEfp6MgoWEfpqWhIWGfo2Jgn6Df5uYhIOGfp2Tg4aGfpOahIiGfpKQgYSEf35+fHx+gX1+
fH5/gX1+fX1/gX5+fHx/gn5+fH1+gn5+fH1/gn5+fH1/gn5/fn5+gn5/fn5+gX9/fn5+goB/
fn9/gn+Af39+goGAf4B+goCBgH9/goGAf39+goGBgIB/goGCgYF+gYODgYF/gYKDgoF/gYSD
g4R/gYSFhIR/gYaGhYZ/gYaHhYZ/gYeIh4h/gYmJiIl/gYmLiYt/gYuIi4d/f4qOioyBf4uO
io5/gZfvl/B8gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgMSfx59/f5iUmJSBfo2VjZWDfpON
ko2Bf42MjIuAf4uJiomAf4qciZKDfpiInYiDfpWenaWIfJ+Tm6KIe5KXnqKIfJCdnaOIe5yP
mpaHfJSJlIqEfoSEhIR/gYaThpaEfoWKkpCEfoSLl46Ef46TlqGIfY2OmJiHfI2NpKCIfpOO
oqWKe4uPoaKIfIWAiY2Df42Ak4GDf35/gZWDf39/kpKEf35+k46Ef35+kH2BgH1+hJWDf359
jY2Ef4Z+nYaFfnyIjZyGfn58l4uEf3x9joeDf4N8mIGEf36GlJyGfnx8jYmDf4KBm5aGfn97
lXqDf3p8enl/gXp7enl+gXp8enp/gXx7enl/gnt8enp/gXx8enp/gnx9fHx+gX5+fHx+gn5+
fH1/gX9+fH1/gX5/fn5/gX9/fn9/gX9/f39/gX9/f4B/gYCAf4F/gYGBgYF/gYKCgoJ/gYOD
goJ/gYSEg4N+gYSEhIR/gYSGhIV/gYaHhYZ/gYiIiIiAgYmKiIl/gYqGiYR/gYuMiouAf4qN
iY1+gZfxlvJ8gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgMegx59+f5iVmJWAfo6QjoiBfpON
jo2Af4yKi4uAf4qJiomBf4mQiYmBf5KSiIiCfpKZh4eDfpiah4aEfpyZhYaEfpqchYSEfpWX
hISEfpaJhIOCf4ODg4N/gYaXg4ODf4mUgYODf5iOg4KDf5icg4OEfpOagYOEfo+YgYGEf5yb
goCGfp+igIGGfYuJf3yDf5eBgHyDf4GcfYGEf6CZf4KHfpyXmH+IfJd8gYeEf4mVhYKGfpac
f3+GfqKEgnqGfo+ceYGGfpeagH6IfpWTgn+GfZaQgXyGfY2aeYOGfpmYfoGIfZyVhH+IfZV3
fHSDf3d4dXZ/gXh5d3h/gXl4d3eAgXl5eHh/gXp6eHh/gXp6enp/gXp7enp/gnx8e3x/gXx8
e3x/gXx8fHx/gXx+fH1/gX5+fX5/gX5+fn5/gX9/fn9/goCAf4B/gYGBgIB/gYGAgYF/gYGB
gYF/gYOEgoN/gYSEg4N/gYSFg4R/gYWGhYV/gYaHhoZ/gYiHhoh/gYiEiIR/gYuLi4mAf4mN
iI1/gZX0lfR8gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgMefx59/f5iVmJWAf46Tj5WCfpWN
k42BfouKi4qAf4mJiYmAgImbiJKEfpiGn4aEfZOcnKSJfJ2SnaGIfJGWn5CGfZeZmKmIfJGJ
oJWHfJKGk4qEfoKBgYF/gISThJeEfoOHkI+Ef4GImIuFfoySlaGJfImNmJeIfIqJpJ+JfJOM
oqWKe4SNi6mIfYJ9iI2Efot8k36FfnuGfJ2Ef3+Fho2Ffnx6lYiEfnqFjpqHfoF6m46GfYeB
nImIfoN5pn6GfnqFjpuIfnp5louGfoV+nZyJfYF3mnqFf3d3dnV/gXd2dXWAgXV0dHR/gXR0
dHR/gXR1dXR/gXV1dHR/gXd2dXWAgXZ3dXZ/gnd3dnZ/gXh5d3d/gXh6d3h/gXp5eXl/gXp7
eXqAgXt7enp/gXt8e3yAgXx8fHx/gX19fHx/gn5+fX5/gX5/fn5/gYCAf39/gYGAf4B/goCB
gIF/gYKCgoJ/gYODgoN/gYODg4N/gYSEhIR/gYaGhIV/gYaHhoaAgYiDhoKBgYqJioiBf4eN
h4p/gZT2kvZ8gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v1/gP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgMifyKB+f5iUmJSBf42PjoiCf5SN
jYyBf4uKi4qAf4mIiIiBf4iPh4eBf5OShoaCfpCahYaDfpiahoWEfpyVhISEfoiXhIODfpiY
g4KEfpOIgoGDf4GBgYB/gYSYgICCf4aVf36Df5eMf3+Efpeaf3+FfpGafn+Efo6Yfn2Gf5ye
f36GfX6ae32Df4mIfHmEf5V9fXmDf36heXyEf4aVe3yFfpqDfXqFfo2Xd3uFfpigfHyIfIiT
fXqGfpqNfHqHfoSadn2GfpaafHyIfZqbgHmIfZh5fnWGfnV1dXSBgHV0dHOAgXR0cnN/gXR0
c3OAgXN0c3N/gXN1c3J/gXR0dHSAgXR0cnR/gXV1dHR/gXV2dHR/gXd4dnaAgXh5dneAgnl5
eHeAgXl5eHmAgXp6eXmAgXp7eHl/gXt8eXp/gXx8e3yAgX1+fHx/gX5+fn1/gX5/fn5/gX+A
f39/gYGBgIF/gYGBgYF/gYKDgYN/gYODgoN/gYSFg4SAgYaGhIV/gYaBhn9/gYuIioaBf4aJ
hYd/gY/Rjat9geDetrh/gdvYurp+gdXRu7x+gc/OvL1+gcnGvr5+gcLBv79+gf7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgMmgyp9/f5iTmJSBf42TjpSEfpaM
lIuCfoqJiomBf4iIiYeBf4iYh5GDfpiFn4aEfZCcmqSJfJ2RnZ+Je5CWnZ2Je5WaoaSKe5WI
rJSIe5GGkImFfYF/f35/gYGSgpeEfn+FjY6Efn6Fl4qFfomRlqGJfIiKl5eIfIuHmIKHfpKI
lJ2KfICIk5iIfX56hYqEf4h6knuFfneDeZuEf3p3jY6GfnZ5d3+CgHx3lI+HfnV2ho2Ff3V1
iYaEf3V8iZOGfn50mYuIfX5/lJqJfH50l3eGfnR/h5iIfnd0l4aGfnN1io2Gfn9ymXiGfnJy
cHGAgXJxcHCAgXJycXCBgXJycHKAgXJycXJ/gXJzcnJ/gXN0cnKBgXR0c3R/gnV1dXWAgXZ2
dXV/gnd3dXaAgXd4d3eAgnh4d3mAgXh6eXl/gXp7eXqAgXx8fHt/gX19fHx/gX5+fX2AgX5/
fn9/gX9/f39/gYCAf4B/gYGBgYGAgYKCgoJ/gYODg4N/gYSEhIR/gIR/hn+AgYqGiYWBf4WI
hol/gI6xktp+gb3A5emAgMDB7PB/gcLC8vZ/gcLB+Pt/gMTF/P5/gcfL/v5/gf7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgMyfzqB/f5iTmJOBf46PjoeCfpWK
jYuBf4qJi4mBf4iGiIeBf4eNhoaBf5OQhoSDfo+bhIWEfpeahIOFfp2Zg4OEfZicgYKEfp2Y
gYGFfpOIgH+Dfn5+fn5/gIGYfn+Df4aSfX6Ef5eLfn6Efpiafn6GfpKafH2FfpWIfHyEf5GZ
enyGfp2de3yIfYmEeXeEf5R6eXWEfnqhdHqGfpWXeXqIfHV6hH6Ef5SXeXqIfoifdXuIfZOP
lXiKfIyRcnWGfpWceHeJfH+VeneIfpqQe3aJfICZcXqHfpSceXmJfJSLfHeIfZh5fXCGfnBv
cG+AgW9wb3CBgXBwb2+BgXBwb3CBgXBwcG+AgXBwcHCAgXFycXJ/gXJzcnKAgXR0c3SBgXV1
dHWAgXV2dHWAgXV3dXd/gnd4d3iBgXh5eXmAgXl6eXqBgXp7enqAgXx8fHx/gX19e3x/gX1+
fX5/gX9/fn6AgX9/fn+AgX+Bf4CAgYCBgIF/gYKDgoOAgYSEg4R/gYR/hH6AgIqFi4aAgIWJ
hop/gZj8nP58gv7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgM6h0aB/f5iUmJSAf4+RjpODfpeL
lYuCfoqJiYmAgImHh4eBf4aXhpCDfpiEoYSEfY6amKSJfJyOnZ+Je5GUn52Je5OSn6CJepCY
iZaHfI+GjomFfX5+fHyAgX6Rf5eFfn6DjI2FfnyDmImGfomQlaKLfIaKl5eJfIp8l4aHfnl/
lpOIfoaOm6CLfH52kImGfoh2kXeFfnaJdZKGfnl0fHSDf355lo2JfXJyjnKEf3JyfYyFf3Nx
iomGfnFxkYmHfnBwio6IfnBwhoSGfnBwkISHfnBwhIuHfnBvhYaGfnBvi3qFfm9vb4aDf29v
g4uGfm9vhIaGf29vkIiIfm9vgomGfnNwi3+Gf3Bwb36BgHFxhICEf3JyioWEf3J0jISEf3R1
iImEf3R1goeEgHV4g4uDf4B4noqGfnqBk6GHfn99nJeIfnqAh5qFf397moqFfoGCnZ2IfYR+
n42Gfn5+fHyAgX1/fX6AgX5/fn6AgYCAf39/gYGCgYF/gYKDgoN/gYN+g35/gIuFi4WAgIaL
hot/gZ3+nv58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNGh0aF/f5qUmZSBfo6OjYaCfpWK
i4qBf4mIiIiAf4aGh4aAf4aLhoSBf5SOhIODfpCag4OEfpaagoGFfZ2ZgICGfZmef3+GfZGK
f36Df5CIfnyDfnx7e3t/gX6XenyDf4SRenqEf5eIe3qGfpaaenqGfpCaeXmGfpOTeXmGfp6a
eXmIfZWad3iIfY2DdXSFfpJ1dnKEf3KIcnSDgHN0cHCBgJ+XdXWJfJdyeIOHfoWKfneIfpOT
dXuJfKWbkHWMe4GbcHeIfZqAc3SJfJeFeHSJfYyTdneJfZOTdHeJfJR0eHWHfm6Ng3qHfpCO
dXqKfJiVjYWNequkfHyNeoKid3qJfIyAdHqHfW6Rg32GfpKYeXqJfKSJeX2JfJiSfnqIfYuj
eICIfZGhfoKJfI6UdHeFfp+dhIGJfJyghIiJfJydg4SIfZCce4OGf56khoaIfZ2eiYeIfaGO
iX6Gfnx8ent/gXx8fHyAgX1+fH5/gX5/fn5/gX+Af4F/gYGBgYF/gYN9gnx/gYuEi4SAf4WJ
hYl+gZ/+n/58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNKi0aGAf5qVmZWBfo+Ojo6DfpeK
lYmDfoiHiIeBf4eGhoaBf4WVhJCDfpiDoIOFfouZlqKJfJyNnZyJfI+Sn5KJfJGXnZKJfI+S
jZuJfI2DjYmGfXp6eXmBgHyRfJWGfnqCiYuFfnqBloeGfoiPlaKLfISJl5eJfImDloqJfYKN
npWLe4aDiaGKfHp0gYaGfoZzkHSGfnCBc56GfnRwjI6IfXJwcHKBgHxviY6IfW9vkISHfm9v
i3yGfn90k3yIfXV9f56JfG5rcHCDf2xtjoaGfmxthoaFfnN+jZyLfG10iJSIfXx6mJmNe2tt
dYGEf3p2l5eMfGxthYKHfm59hZyJfGxtfGuDf21ta2yBgG1ubG2BgW9ubW2BgXBvbm+AgXBw
b2+BgXFxb3CAgXJycHKBgXN0cnOAgXV1c3SAgXd3dXWAgHd3dXaAgXd5dnd/gXl5eHiAgXp6
eXmAgXp6eniAgXt7eXp/gXx9enx/gX5+fH1/gX5/fn+AgICBf4CAgYF6gXqAgYuDioOBgISJ
g4h/gZ3+nf58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNKh0qF/f5qUmJOBfo6MjYaDfpWJ
i4mCfoiGh4aBgIaFhoSBf4SJhIOCf5SNgoGDfo6agYGFfpOYgH+Ffp2Mf36FfZOYfn6EfZKX
fXyGfo+Ge3mDf3l3eHeAgXqXd3eDf4CQd3iEf5iGeHeGf5eZd3eHfo6bdneHfZOMd3aHfqOJ
dnWIfZOkdXWJfYaAc3CGf5N0dG+Ef3ehbnSGf5WVcnSJfG9ygXmFf5KUcnGIfJWacHGJfJuI
cnCIfJR+dG+Hfouhb3KKfHB0eX6HfpuVc4iMe5WFemqJfIuXbHSJfJiYcHOLfJWWdHSLfJOA
cmqIfZWTcXKJfJ+XcnWLfJWacneLfHtqa2qDf2tramqBgGtra2uBgW1tbGyBgG1ubW6AgG1v
bW2AgW9vbm+BgXBxcHCAgXJzcHGAgXJzcnKAgXR1c3d/gXV0dHR/gnZ3dHaAgXZ3d3eAgXd4
d3d/gXl4eXl/gXh5eXmBgXp6enp/gXx9fHx/gX5/fn5/gX+Af39/gYF5f3mBgYuCioGBf4OI
g4d/gZ/+oP58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNOg06CAf5iUl5OCfo6Ljo2DfpeI
lYiDfoiGhoaCf4WFhYOBf4OTg46Df5eBoIKFfYiYlaKJfJuLnZuKe4+SoJKJfJOYn5yLepWV
kJWJe4qDioeGfXd3d3aAgHmQeZWGfnmAiIqFfnd4oZSIfYt3mZeJfIONjqGLfJB8lZCLe3R9
nJ2JfIGJmKuNendxfYaGfoZwkHKIfnGKb5KGfnRsdWyDf21tbG2BgWtsbY2Ef26AepKIfWtr
j4WIfmtqj4aHfmpqjJCIfGpphISGfmp0i5CJfHxqnYuLfG55gJCKfINxlYSLe3ppn3SJfG1+
kpyMe2lqiX6IfXh2lJeMe29+iJ6Le2tqemmDf3twkXqIfnJrgo6GfWttfICGfnRunX+Hfnpv
l5WJfW5vhoOFfnxyjHqFf3Bwb3CBgXFycXF/gXJycnKAgXN0cnN/gXR0dHOAgXV1dHV/gXd2
dXV/gXd4d3d/gXh5d3iAgXl6eXl/gXt8e3x/gXx+fH1/gX5/fn6AgX95fnmAgYmBiYGBf4OG
g4h+gaL+pP58gv7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNOf1Z+Af5eTl5OCfo2LjISDfpWI
iYeDfoaFhYWBf4SDhIOBf4OGgYGBf5OLgX+DfoyZf3+FfZOaf36GfZ2Lfn2FfpCRfHuFfouJ
enmEfoyDeHeEf3Z1dnWAgXeWdXaEf3+OdHWEf5iVc3SIfpaYdHSIfYGTdHOGfo2cc3OIfpCB
cnGGfo6XcHGHfYJ+b26Ff5Jwb22Ef2yGa22DgW1sa22BgG1tgYCFf2+Ug3KIfniTbXCGfpeL
cG6JfqKNcG2JfJqibXCLe46QjXGNeoWLaGqGfpSab22LfH+QbnCJfIaGcWqIfJiIb2mJfIKX
aHGJfJWDbm+JfJOVcnGLfJqbbXKLe3ZqaGiEf5N7cm+Ifo2fcneJfJmQdHSKfJiUdXWJfZev
eXuLe6mXeniLfI16eHCFf25vbW6AgW9wb3CBgXBxcHCAgnJycXKBgXNycnN/gXR0c3R/gXV1
dHWAgXZ3dnZ/gXd3d3d/gXh5d3h/gXp6eXp/gXx8e3t/gX1+fX6AgX93fXeAgYmAiYCAgIOI
goZ/gKb+p/58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNWf2J+Af5eTl5KBfo2JjYuDfpeG
lYaDfoWEhoSBf4OCg4KBf4KSgYuEfpd/oICGfIiYk6OJfJmMnZCKepySlZ2LepOQpqKNeoeS
jJCIfImCiYiGfXV0dXSBgXeQd5WGfnZ+h4iGfnV+lYOIfYeOlKGMeoGLpqWOeYmJoJeNeo6N
l3+Me4ZvjJiJe3dveoaGfoZukG6Ifm+MbpGHfnJrc2+Df2t7ko2JfXVrmpeKfGttkoyIfYNq
mn2JfGpqaouEf2lpipqIfGhpjo2JfGlol5SJfGhompSJfG1vi4mJfGZlZnyEf2Zmg4+JfWZm
go+JfWZmjXqIfmZ4h5qKfHRomYuKfHZsnHqKfGhojHCGfmyCjp+Le2xulY2JfIR4pJyNen1s
nWqHfmtsa2qBgW1ta2yBgW5ubW2AgW9vbW6AgW9wb3B/gXFxcHB/gXJycHB/gXJzcnOAgXR0
c3N/gnV1dHR/gXZ3dHZ/gXd4dnd/gXl6d3l/gXp8ent/gXx9fHyAgX53fXd/gYqAiX+Bf4KF
gYV/gaf+q/59gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNie2Z1/f5aSlpKCfoyJi4OCfpWE
h4aDfoSEg4OBf4OBgoGBf4GGgICBf5OLf36Efouafn6EfpORfXyGfZKPfHqEfpidenqHfZyV
enmGfouEd3WFfnR0dXSBgXeWdHSEf3yNcXKFf5aEc3KHfpaYcnKJfIiZcXKIfpOTcXCIfZiM
cG2IfYGhbW+IfYF6bWuGfpNvbWqGfmqDamuDf2tvamqCgJWLb26IfZ6YbW2KfJCKbG2JfZqG
bnKJfGuVg5OKfJOOb2uKe5KIamuJfJWZbWyLfKekcY6QeYiLaGuJfGaKfXSIfX+fa2uKfI9/
a2eKfJVra2WIfoOTZGuIfZOfbGuLe5eZb22LfKSHcGuKfHydanKIfZSab3CLfKGadG+LfJZq
cWmGfmpqamqBgWtramuAgWtsa2yBgW1ubW2BgW9vb26AgW9wb3CAgXBwb3B/gXJycHF/gXJz
cXJ/gXN0c3N/gXV1dHV/gXd3dnd/gXd3d3d/gXp5eXl/gXx8e3x/gXx1fHV/gIh/iX6Bf4CE
gIR/gav+rv58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNme2Z1/f5WRlZCDfouIi4mEfpeE
lYSEfoODg4KBf4GAgX+Bf4CQfomEfpd8oX6GfIaYkKKJe5qMnY6Le5uOlYiJfIyUkpKJfJOX
gJOJfIiBhoeGfnNzc3KBgXWQdpOIfXR+hoiHfnR8lYOIfYaPlKKOeomPrqKQeZCLpJiQeX5u
oZOMfG1thJqIfXdteYaHfolrkGyIfG2Na5CIfXNpcGuDf2tqkpeIfGtrmJaJfGlpgWqEf4J0
nH+LfGpomJKJfGhokJCJfGhmkIiIfWZmZomEf2ZlkIWJfGxumIiLe2V5kYuKfGtlkpKLe2Nj
d2OFf2RkjXuIfWV4i4aJfGt8cZCLfH5mmH6LfGZnkIiIfW93hKCLfGdqfIyHfYRrn5eNe2p/
hpyKfGlqfIGGfmt2gZqHfn9toI2JfHmAg5qIfYJ1n42JfG1ubm+Agm5wb2+AgXBwb3B/gXFx
cHCAgXJycnN/gXR1dHSAgXV2dHV/gXd4dnZ/gXl5eHh/gXp7eXl/gHx1enWBgYl/h36Bf3+E
f4R/ga7+sf58gv7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNmd2p2Af5WQlJCDfouIi4GDfpaE
hYODfoKBg4CBf39/f3+Bf36DfnyDf5GIfXyEfomYfHyEfZKOe3qGfZCGenmFfpabeXiHfYuJ
d3aEfoiCdXODfnNycnGAgXWTcnKEfnuNcXCGfpWDcXCHfpSWcHCJfJWZcG6IfJqSb22JfKGW
bW2JfIygbGuIfIJ6a2qGfpJsamiGfmmDaGmEf2hrZ2iCgJaYamqJfImVa2qJfIhrcYGIfpd9
bGeIfpyXaWqLfHyQaGmIfZV8aGyJfGiPf2+IfYGaZ2aJfYSQZWeJfJOJaGiKfZeXZ2eLe4Fo
b36JfZOLa2eLfJqFaGiKfHKSZmiIfZWaamiKfKGSa2qLfIGoa2uLfHeDZmaGfpyUbWuKfI6Y
bXCJfZORb2+IfIiOam2GfpaccnCJfIaXc3KIfZiFc26Ifm1tbGyBgW5vbW6AgW9wbm9/gXBw
b3B/gXJycXF/gXJzcnJ/gXR0c3R/gXR1dHV/gXZ3dXd/gXh5eXmAgXl0enSAgYd9hn2BgH+E
f4R+gbP+tf58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNmc2pyAf5SPk46CfoqGiYeDfpeC
l4OEfYGBgX+Cfn9+fn6Cf36NfYiEfph8oXyHfIOYjqGKe5mLnI6LepmNk4iJfI6YkZeLeo+T
k42LeoeChYaHfXJxcnGBgHSPdZKIfXR+hYmIfHR8lYGIfYiPk6KOeouSr6KQeJGJmI+PeZKN
lpuPeW6OkqyOendteoWJfYlqkGuJfG2QapGJfXJobW2Ef2p/lIyLfHRrn52Nemlrl4uKfIhm
n3qLe2VoZ5aGf2ZmloiJfGhnoY+KfGdyn5OLe21lgZaKfGRmepCIfYZxoZyPeWaIkp+OenBl
gYmKfIJ1n5yOemNkkpKKfGJic2GDf2FiYWGBgGNjYWGBgWNjYWKCgWNjYmOCgGRlY2SCgGVm
ZWaCgWZmZWWBgWhoZmiBgWhqZ2mBgWpqaWqAgGtramuBgWxsa2yBgWttbGx/gW5tbG2AgW5v
bW+AgXBwb3CAgXJycHGAgXN0cnKAgXR0c3R/gXR1dXV/gXh4d3d/gXl0eHOBgIZ8hHx/f3+E
f4R+gbb+uv58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNmb2puAf5ONko6BfomEiICCfpWC
g4KDfoGAgX+Bfn59fn2Cf3yBfHyCf5KFfnqEfoiXenqFfpGPe3qGfZCEeXmFfpGOeHiGfZaT
dnWGfoiCdXOEfnFwcXCBgHSScHGEfnmNcHCFfpWDb2+HfpOVb2+JfZWVbW+JfIaIbWuIfpWW
bGuJfIeUaWmIfYF3amiFfpJraWeGfmiDZ2iEf2dtZmaDgJONaGiJfZyVaGiKfI+NZ2eJfZmB
Z22JfWuSf2uIfX+ZZmaJfZWDZmaJfJ2IZWWJfIqYZWaJfHR7ZWOGfpWRZmaKfJeZZmeLe5Fy
ZWSIfZORZWWKfJiTZGeLfHBhY2GEf2BgYWGBgGBhYWOBgGFhY2KBgWJjY2KCgWNjY2OBgWVl
Y2aBgGVmZmaBgGZmZmaBgWdnaWiBgWhpaGiBgWpqaGqBgWpramqAgWtra2t/gWxsbG2AgW1t
bW1/gW9vb29/gXBwcHB/gXFycHJ/gXNycXJ/gnR1dHR/gXV3dXeBgXdyd3KAgIN7gXmAgH6D
foN/gbv+vf58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNma2ZiBf5KNkY2CfoiFh4aDfpeB
lYGEfIF/gX+Bf358fnyBf3yOfIaEfph6oHyHfIOZjqOKe5yLnJCLepqSk4qKepWYjZWLeoGU
mKOMeoaDhoeIfHFxcXCBgHSQdZKIfXR/hoiIfXR8lYGJfYiRlKOOeY6TsKSSeJWLmI6QeZJt
l5SNeneCj6eNenlse4aIfIxpkmqJfG6TaZGJfHJnamqEf2lrmJ2KfGtrnJyLe2dmg2iEf2lo
nJeLfGloopOLfGp9hpqMe2hnk5OKfGdlpZqLe2VjjmSGfnp8lXGLe4ZjlGWIfGKAZ6SIfG95
d4uLfGZknZWLfGVlmJOLe2h3hJCLfGFhYXeEf2VlnZqKe2aDgpGLfGZkkpWKfGZlj4GIfmuM
lZ+Nem1pmpKKfYdornWLfG+LkaGMe3JrmpKKfIZsq3GJfGpqaWmAgWtramqAgGtra2yAgWtt
a21/gW5tbW1/gW9wb29/gXByb3B/gXFycHF/gXJ0cnR/gXR2c3WAgXZydXKAgYB5f3mBgHyC
fIF/gb3+tv58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNqX2JaAf5CMkIuBfoeEh3+DfpWB
g3+Dfn9/f3+Cf358fnyCf3uAenyCf5CEfHqEfoaXeXqGfpCPeXmGfY6SeXiGfpKTd3eHfYWT
dXWGfoaBdHKEfnBwcXGBgXSScHGEf3mNb2+FfpODbm6HfpOTbm6JfJGVbW2IfIiHa2uIfZWX
aWmJfIyfaWmJfIR0aGaGfpBoZmWGfmV/ZWWEf2ZqZGWCgJKYZWaJfIiUZWaIfYNucH6IfZV+
ZmWIfo+NZmSJfIOVZGaJfZOSZWWJfIqPZGOJfX1paHyIfY5ta2OIfpJpZHKIfnCdemSKfHqK
ZGOIfZKEZGOJfYmTY2OKfHqQZGWIfWd8eXGIfYCTY2SJfXmRZGaIfpWWZWSJfI1xZWOHfnyY
ZGiIfpCIZmeIfZOFaGiIfXWXZ2qHfpKNamqIfpFwamqEf2hpaGmBgWlqaWmAgWpqaWqAgWpr
aWt/gW1sa2x/gW1tbW1/gm5wbm9/gXBwb3B/gXJycHF/gXJ0cnN/gXRxdG+AgYB4f3eAf3p/
en9+gbH+sv58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNaU15N/f46LjoqDfoaEhYSDfpeA
lX+FfH5+fn2Bf318fHqCf3qNeoWEfpp6oXuIfISajqSLe5+KnZKLepyTlYGKe5WYmpmNeo2Z
hqKMeoiDhoiIfHFwcXCBgHSSdZKIfHV/hoqJfHV/lYKJfI6VkpOPeX+Ph5WNeZeSoJySeIJv
ppqNenyZg5+Oen1tfoaLe49okmqLfG2VZ5CJfHJkaWSDf2VpZIaEgGpqmZyLe2hpmJmLe2Vm
bnmFf2tql5mLfGmBi5OMe2lnlYyKfGNnZJeGfmdqkKeMe3R+gpCMe2pmoZ6Me2yIgqyOemRj
bWOEf35pkoWLfGhomKCMe2dnkpyLe2hmoZCLe2eBk5yNe2hpiJyLfGhmmpOLfGpmn4aKfG+R
mqKNem5qmoiLfIuHlYaNe4JrkomLfIOEnaGMemt/mIWJfIaOjaGNenZohmeEf2lpaGiAgWlq
amp/gWtramp/gWxsa2t/gW1tbG2AgW9vbm9+gXBwb29/gHBxcHB/gXJwcXCAgX91fnWAgHl9
eHx+gbP+tf58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNeT15N/f42JjIiCfoWDhHyDfpR/
gX+Dfn19fnyCf3x7fHyBf3p/enuDf5CEe3qFfoeXeXqFfJGOenmHfI2GeniGfZGUd3iHfYSO
d3eGfoaBdXKFfnBvcXCBgXSOcHGFf3eLb2+Gf5ODb26HfpGRbW6JfIeVbG2JfJWObWuKfJuS
a2mKfH+MaGaIfoFzZ2aGfo5oaGWHfmWAZGaEf2VlZGeDgG+HeW2IfnuWZGaIfpSkZmaKfHJ6
eXCIfpSgZoSNeoSRZmSJfIuGZWuJfW+Re2qJfYuYZGOKfIONZGOIfZqVY2OKfIacZGaJfHhs
cXeIfY6GZmWJfXqiZHmLfJB8cGKJfJKDZWOJfZKJY2WJfI6XZWWKfJN7ZWOIfY1tYmKHfnmV
YmOHfo6EZGOIfZZ6ZGWIfoh4Y2WGf4iOZWaHfpOYZmiIfYuTZ2iHfnVnZmaCgGhoZmeAgWhp
Z2h/gWhqaWp/gmtramt+gmxsa2t/gW5ubG1/gW9vbW1/gW9vbm9/gXBwcG9/gX10fHSAgHd8
d3t+gbb+sfl6g/7++/t9gf7++vp9gf7++vp8gf7++vl8gf7++fl8gf7++Ph8gv7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNaS15F+f4uHi4iBfoODg4SDfpd/
lYCEfX5/fHyBf3t7e3qBf3yOeoSEf5x6oXyIe4SdjqaLe6GLn5SLepuUlYOKepmdoKOPeZ+N
mZuNeYiEhoiIfHFwcXCBgXWUdpOIfHWCiIuJfXeBloKJfI6Xl6aQeYyYqaeSd5aNnnmNep1x
op2QeG9xkKGMe3xvfIeKfJJok2qLfHCYZo+KfHJmaGqFfotroIuNem1rnpyNemllhmaGf4ht
nY2Nem9lo2iIfGhqhZ+JfG12ppONeolrsKGQeWlkiGaGfmlqm5WLfG9lqIyMem+WnqePeX9q
opiOepWFmIuOeXVtn6aPemVugJKKfJCDpKGQeWuJnY2NeomTeo2OeoyBoZWQeWJiYWGCgGBh
YGGBgGFiYWKBgWJiYmOBgWNjYWOBgWRkY2OBgGNlY2OBgWVlY2R/gWVmZWWAgWZmZWaAgWZo
ZmaAgWhoZ2h/gWlraGl/gWtramp/gWttbGt/gWxta21/gW1ubW1/gW9vbm5/gHt0eXR/gHd6
dnp+gbP5vP13g/r6/v58gfr6/v58gfr6/v58gfr6/v58gfn5/v17gfn5/f16gf7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNmR25J+f4uIi4iBfoOBg3qCfpN+
f3yDfnx8fHyBf3t6e3qBf3qAenqCf5CEe3mDfoeXeXqGfpKOenqGfY2IeniGfpSWd3eHfI6T
d3iHfYeAdnSFfnFwcnCBgXWPcnOEf3mMb2+FfpOFb2+HfpGSb3CJfYGSb2+IfZByb22IfY2Q
a2qIfIuOamiJfIFxaGaGfoxoaGaGfmZ/ZmmFf2VmZmWDgI2MZWaIfXycaIGLfIp0dHeJfIeM
aWaIfZNzZ3aJfYSjcGaKfZeNZmaJfJiSZmaJfX90a3mIfpCOa26LfKlzfGiKfHKSZWOHfo2L
ZWSIfJCJZGSIfJWRZGaKfIZuZWWHfo6LZWKJfZCWY2OKfJSRZWWJfIt6YmOHfmFhZWKDgGFg
YWSDgGBiYGKCgGJiY2WBgWJjY2OBgGFjZmaCgGNiZmOBgWNjY2OBgWRlY2SBgWVlZWWAgWZm
ZmZ/gWdnZmeAgWdpaGd/gWlqaWl/gWtramt/gWtramyAgW1ta2x/gW1vbW2AgXl0eXOAgHZ6
dXt+gcP+yP56gv7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgNyQ3ZF/f4uHioaBf4OCg4OCfpZ+
lHyEfXt7e3uBf3t7enqCf3qPeoSEfp16oXyIfISfjqaLeqOMnZWMep2Sl5eMepmapKaOeZuf
paWPeYuHiYmIfHJxcnGBgHaWeJWJfHmGiZCJfHyEl4SLfJOcmqiQeJ2htKyTd6KbraGTdol3
rJ6PeXJ0iqmLen9zeoiJe5VplWuLfHOdapCKfHNoaGyEfm9yoqeNenRymqWOempohWyGfpp4
n4uOeXVzpKWOenB1mpCMenJtpoSMe2VwaqOHfnBvmpyNeol5qI+PenaUlZ2OenR0oamOeWZl
e3OGfnRsl5KLe26TlpeNenKOdJGNepZppZyPeW5woZiNeoOAj6GOemp9lZyMfJpwop+QeXWQ
hpOOemtmmIaLfG+Pjp6Ne4hun6GOeoaNfJyNepdvoXqMemJjYmKBgWNjYWOBgWVlY2OAgGVl
ZGWBgWZmZWaBgWdoZ2aAgWhpaGeAgWpqaGp/gWtqamqAgWpsamt/gWxubW6AgXhyd3N/gHV8
dXx9gcv+zf58gv7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgN2Q3pF+f4mGiYaBf4OBg3yBfpB9
f32Dfnx7fHuBf3l5e3qBf3p/enuDf42EfXqEfoiVenyFfZGOfn6GfYx+fXyEfpCLfHqGfpOU
eXqIfYiBeXeFfnRxc3KBgHWOc3aEfnmLcnKEfpGGcHGIfZCQcnWJfYyTcXGIfZOLc3CJfJaQ
cG+JfIuSbnGJfIJxa2qGfotobWeGfmd/ZmaEf2ZtaGaDgIqQaGiIfYmNaGeIfoJ/b3SHfY18
aGeHfpKOZ2mJfHqOameIfo5/ZmyIfn2OemqJfYGNaGyIfn6LbW2IfZCNZmqIfYuNa2aIfX6A
cXKIfY6KZWSHfYSIY2OHfnSDY2OGfpCKYmKIfYyLYmOIfYeKYmGIfWh0YWGEf4uFYmGIfn+N
YWKIfouBYWGHfWuEYWCFf4SGYWGHfoaCYWKGfolmYWGFf2FhYWGAgWFiYWKBgGNkYmOAgWRk
Y2SBgWZlZWV/gGZmZWWAgGdnZmeAgWhpZ2l/gWpqaWqAgWtqamqAgWptam2AgHdzdnKAgHV8
dn5+gdH+1f58gv7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgN6R3pF+gIqGiYaBf4KBgoODfpV+
k32EfXx7fHyBf3p6enqBf3qQeoOFfqB9on6HfIihkKeLeqaNnpmMeZ+omI+Neo2fnJqMeouf
haCLeo2JjIyJe3NydHKBgXmYepWJfHyJi5OJfIGJlYaKe5qflZOPeYeakJOOeaKfkK6ReIiU
pY6OeYyhhZWOeYt2gIiKe5hrl22Le2t8f6SKfHh5oZeMen13pKKNenp6o6SOeW1od3KEf3p3
mJmMe3yJp6qPeYl8pp2PeXCDlKCMe6ODq6iSeIOSp6uReI6Wj4WNenSYk6KNepl0qKmQeZd2
qp+QeXpolGuJfWNjY2OBgWJhYmGBgWFhYWCBgWFhYWGBgWFhYGGBgGBhYGGBgGBgYGCBgGBh
YGCBgWBgYGCBgWBgX2CBgWBgYGCBgWFgYGCBgWBhX2CBgWBgYGCAgWFhYGGAgWJjYWJ/gWNj
Y2OAgWRlY2N/gWVmY2R/gWZmZWaAgWZnZmZ/gWhpZ2d/gWlqaGp/gmpuaW2AgXVydXJ/gHZ/
dYB8gdn+3f58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgN+R4JB+gImGiYWAf4F/gXqBfpB+
f32Dfnx7fHyBf3p6e3qBf3p/enyDf46DfXqEfoaTen6GfpGOf3+GfY2JgX6EfpGTfn6GfY6T
e3qGfYmBeneEfnR0dHOBgHeMdHiFf3mIcnGEfpCGcXKGfo+PdHCIfoeOcnaIfYeId3OIfY6J
bm+GfoR/cHKGfX9ybWyEf4lscWuGfnOOanSHfot5amiGfoaCaWmGfo2IamqHfXWHb3WHfo2H
aWiHfo2MamqIfoiKaWmHfm11aWiDgIyGaG6HfoiNb2iIfYB4a2+GfnJ/dWuGfoeGbmiHfYuG
a2+JfYlrZmeFf2Vja22Df2NhaGyDf2FhY2WCgWBha2mDgGFhYmGBgWFgYWKBgWBgZWiCgGBg
ZWGCgV9gYGGCgWBgamCCgGBgYGCBgWBgX2CBgWBgX2CBgWBfYF+BgWBgX1+AgWFhYWGAgWJj
YWKAgWJiYmOAgWNkY2OAgWRlZGSAgWZmZWaAgWhoZmaAgWhoZ2h/gWluaG5/gXVydHJ/gXaB
dYN8geD+4/58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgOGQ4pB9gYqGioWAf4CBgYKBfpZ9
knyEfHx7fHyBf3p5enqCf3qReoOEfqF8oX+IfIiikamLeqiPn5qNeZ+pmY+LepGcnpiMeqOL
n6SNeY6JjIuJfHRzdHSBgHuYfJaIfH6Li5aJfIaGpqeNepuFppqOeZirhKWPeaODlayQeIaa
n5+PeZWqn6uSd4Z8hIiLe5tumm6JfHmgbZCKfHdoa2iDf2hoaWmBgGuDepeJfICSgpyNeoF6
pp2Oen6AqaaOeX9/rKePeYB3pZiNen6foaWPeZp8pqqReZecjI6QepqRnZqQeZN4nJKOep6e
oqaSeHuOp4aOepWXnKaSeJWdrKKSd2R8ZX6GfoSLgpeNe3Z8maCNenqApI2Ne4uQl6aQeYuD
qraQeXlxp4CMfJVgk2CIfV9gYGCBgV5eYF+AgV9gYGCAgV9eX19/gF5fX2CAgWBgYGCBgWFh
YGCAgWBiYWGAgWJjYmN/gWNlY2N/gWVlZGR/gWZmZWZ/gWZnZmd/gWhtZm1/gXNxcnB/gXWD
doR7guX+5/58gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgOSQ5ZF9gYuGiYaAf4F+gXqBf459
f3uCfnt6fHqBf3p6enmBf3qBenyCf42Ef3qEfoaTfIGFfpGNgYGGfIuJgX6EfY+LfHyFfoeQ
fX6GfYd/fHmEfnR0dHSBgHeKdXuEf3mIdHOEf46LcnSGfo2NeHGIfYOIdnyHfI2KfXiJfIt/
eXOGfoGJeX6IfIJzcW+Ef4ZreG2Ffmx9a3OEf2pva2yCgIiIb3GHfYuKc3mKfHyEbmqGfomC
am2GfoaDdGqGfoOJaWuGfqZ4dWqJfGx/aWiEf4GAaGiFfoaEaGeFfoZ1Z2eEf4FuZ2aEf3qB
amqGfn6BZ26GfoGEc2aHfnt6cHWIfmVxemiEfnV8ZXSGf3p+amOGfn90cWqIfn5+c2KIfn+B
ZnCIfX9ya2OGfnlhYWGDf2FgYmiBgGBeZ2iDgWBfYGCBgF9fYW+BgF9eYF6BgWBgYF5/gWBg
YGCAgWBhYGB/gWJiYWF/gWJjYWN/gWNkY2N/gWRlY2V/gWZmZWZ/gWZtZmx/gXJwcnF/gXWG
dYZ8g+n+7P58gv7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgOaQ55B9gIuHioR/f4CCgYSCfpV8
k3yEfXt6e3qBf3p5enmBf3qSeoOEfqN+oYCIe4ulkqmLeqqOn5uNeZ+km6ONeYujpKSOeZad
n5CMepCKjYuJe3R0dHOAgHyafZeJfIGPjZmLeouLpquNep6MqZyOeZ2uhaSPeaSVlaaQeJyf
jp6OeaqXmp+Qd4x/jomLe5xwm3CKfG+ScZ+JfIKEoqeOeYaQr5WOeZKXlZmPeX1uc3qGfoiD
loKLe5SJnaSQeIGEnquPeYWFpauQeYiEqaaPeXpqkXCHfoSGo5eNen+Opq6QeYSLk6uPeZeC
m4iOeoKcl5+OeqKCpKiSeI2jhpqQeZpvkpiOeoukiKWQeZSIoqWSeZqVpKaSeKFloWWLe3mI
eoaJfIh6kJaNeoN9o6GOeoSOjZWNepCOn6WQeYx+taeQeXKTf5KMe19fXl6BgV5fYF9/gV5f
X1+AgWBgX2B/gWBgYGB/gWFhYGF/gWNjYWJ/gWNkY2R/gWVlZGV+gWVsZWx/gXBwcXB+gXaI
dop6g+3+7/58gv7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgOiQ6JB9gImEiYV/f4F/gXqBf458
gXyCfnp6enqBf3p6enqBf3qBeX2Cf4uDf3qDfoaQfIGFfo6Lg4KHfYiJhISGfY2Ig4GGfZGR
goOIfId+fnmEfnNzdHSBf3iIdX2EfnmFdHWEfo2Ic3WGfomLen+IfIOEgIGIfIqHcneGfnx9
gH6GfYiJfoCIfH50cnCEf4NvfG6Ffm+DbXOEf4KDbGyFfoV7bXmGfoSLcXqHfoaLbm2HfoR3
cmqGfn+BaWmGf31/aWiFfn59cG2Gf4Oidm+JfH+KamqHfoN2aGyFf3l8f2qHfnp6Z2eEf3Vz
eXWHfmd1ZnOEf3l2eGaGf355ZmqEf3xwe2qGfmd5Y2KDgHR1YWKDf3pyYWGEf3JhYWCDgWtv
YGCDf3RyYGCEf3V1YGCEf210YF+Ef3V0X1+Ef3d2X16Ff21xXl6Df15eXF2AgV5eXl6AgV5e
Xl5/gV9fXl9/gWBgX2CAgGBgYGB/gWFhYGF/gWNkYmR/gWNlZGR/gWNsY2t/gXBwcHB+gXWL
dY56g/H+8v59gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgOmQ6Y98gYmFiYZ/f4GDgYSDfpV9
knuEfHt6e3qAf3p6enmBf3uTeoKEfqR+n4KIe42nk6iLequQoJ2MeZ2bmo2Leqamm6mPeaGh
opKNeZGKjoqJe3R0dHSAgH6Zf5eJfIORjZqKe4+UmI6Mep+poamRd7OSoamReI+dn52Oea2r
rquTdqmslZ2Rd5OEj4iMepxwm3CJfHugd56Me4KIpJ+OeZCdoKeQeY+anZqQeYmTopOPeaRx
nXWMe2uHdaiJfIaPo4qOeaF+mISOeo6LnaGPeYqSn6yPeH+TkJWOeqmXpqaSeIeQoauQeZ+W
g5iQeYSii5qOeqOIoqeSeJOXppWQeaaEpH6OemNiYWKAgmFhYWGAgWFgYWCAgWBgYGCBgWBg
X2CBgWBgXl6AgWBfXl6BgV5eXl6BgV5eXV6AgV5dXV2AgVxcXFyAgVxdXF2AgV1eXlyAgV1e
Xl2AgV5eXl5/gV5fXl5/gV9gXmB/gWBhYGB/gWFjYWF/gWNkY2N/gWNsY2t/gHBwb29+gXSP
dJF6g/T+9f5+gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgOqQ6o58gYmFiYV/f4F/gXuBf4x8
gXyDfnt5enqAf3l5eXiAf3mAeX6Bf4mDg3mEfoSOfYSFfo2KhYWGfIaBiIeFfYKLhYGGfYWB
gIOGfoR+gHqEfnV0dHSAf3iGd4GEfnmDdXWEfoiDcniFfoaEfIOIfISEhIKIfIaBcXOFfoWD
fnmHfX1+gXeHfXlycnGDf35tgG2Efm17amuDf3x8a2uEf399fHCHfnl8a2qEf3l5amqEf3d/
anSFf4l8fHWJfHd2bneGfnNyZ2iDf3V3Z2iEf3R1cIOHfmpra3KEf3dwhoCIfXR0Z2eEf3Ru
e3mGfmhwZnSDf3Jwe4aJfnVwfnyIfXJlZGOBgGNhY2F/gWFhYWF/gGFgYWB/gWBgYWB/gWBf
X15/gV5eXl6AgV1eXl5/gV1dXl2AgV1cXVx/gV5dXlyAgV1cXF2AgVxcXFx/gVxcXVx/gV5e
Xl5/gV1eXl5/gF5eXl1/gV5eXmB/gWBgYGB/gWFiYWF/gWJjYmN/gWJrYWt/gG9vbm5+gXST
cpV6g/b++P5+gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgOqO6458gYiEiIR/f4GFgIWCf5V8
lXuEfXp6enqBf3p5enmBf3mUeYGEfqR+nYKIe46pk6mNequOnp2NeZ2amY6LeqegnKiOeZ2n
lZ2NeZKJkImJe3RzdHOAgICYgJeJe4aTi5qLe5GUlo2NeqGqoKiRd7GSn6iRd5OYnYuOeqyc
q6uSd6SdoqyRd4uDkYaMeppwm3CJe2tqamuBgWp0a4SEf6STq6WSd4prmm2JfIWQi6GNepOe
pKOReJChgZeOeX+Nh5qNepWQmpSOeZKGooOOepqpkaSReJido6KSeKmnpqaTd4CNnIaNeqWl
mZ+Sd5GUoZKQeZqpnaaSeKifoJSSeGNjY2GBgWFhYWGAgWFgYGGAgWFgYGB/gWBgYF6BgWBf
X1+AgV5eXl6AgV5eXl2AgV1dXF6AgV9dXFyAgV1cXFyAgVxdXFt/gFxcXFt/gVxcXF1/gV1e
XFyAgV1dXF1/gV1eXV1/gV5eXl6BgV5fXl+AgWFhYGB/gWJhYGJ/gWJqYWt/gGxubW5/gXOX
cph5g/j++f5+gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgOyO7I18gYeEiIN/f4F/f3yBf4x8
gXuCfnp6eXmBf3l5eXiBf3l/eX+CfoiBgneEfoKKe4SFfoqGhYiGfIN/iYaFfIKJhoeGfYSC
gH+FfYF6gXqEfXNzcnKAgHaAd4OEfnV+dHSDf4J+cHmEfoB+foaIfX5/iYSIfH93b3SEf319
hIuIfHx+g4eIfHVwdnGEfnhsg22EfnWNdIiIfYyHcGyHfXd2fGuGfnmKamqGfnxzaGiEf3Rz
aGmEf2xvaneEf25wameEf290Z2eEf5RqaoOIfWpvd2uFfm1vjYeIfXBviGuHfWtmcYmGfmtt
a3eFf2pvkoeJfG1tfmKFf2pmYmGDgWJhYWGAgWFhYWB/gWBgYGCAgWFgX19/gWBgXl6AgV9e
X16AgV1dXl2AgV5eXF1/gV5cXV6AgV1dXFx/gVxbXFx/gVxcXFx/gVtcXFyAgFxcW1uAgVxc
XFyAgVxdXFx/gV1dXFx/gV1eXF6AgV5fXl9/gWBhX2B/gWBhYWB/gWFqYGh/gGxtbG1+gXKa
cpV5g/n+7Px8gf79/fx+gP3+/P1/gf7+/f5/gP7+/f6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgO2N7Y18gIiDhoN/f3+Gf4eDfpd6
lXqEfHt5enqAf3l4eHmBfnqVeIKEfqV9nYKJeo+pk6eNeauNnp2NeZ2pmqGOeaOboZeNeZ+Y
mpiNeY+IkIeJenJycXKBf3+Uf5WJe4eSiZqLepKUlY6MeZ+qn6SRd6+TnaaQeJWbm4mOebGf
opOReJ2ppKSSd5iElYONepdvl22KfHmZb4iJfHFwanGDf5CSmJiOeZiYjqeQeXZ1d36GfZyV
m5eQeJqhoJiSeJKdnJWQd5qJlnSOepmmhJqQeaKVmpuReImikYmPeaaOn4+QeJ2ogp2QeZ6L
nZKQeJeki5OQeZtji2OIfGJhYmGAgWFgYWB/gWBgYGCAgWBgYGB/gWBfX19/gV9eX15/gV9e
X15/gV5dXl5/gV1dXV1/gVxdXVyAgVxcXFx/gFxcW1t/gVtcW1yAgVtbXFyAgVxcW1x/gFtc
W1t/gVxcXFt/gFxcXFx/gV1cXFx/gF1fXV1/gV9gXl9/gGFhX2B/gWBpX2l/gGttamx9gXCU
caF5g/L+/P5+gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPz8/vx+gf7++fx+gf7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgO+M7418gYaDh4N/f35+f3uBf4t7
gnqDfnl5enmBf3h4eHeBf3d+eYCDfoWAhHeEfoGIfIiFfYaDiYmHfIGCjYmGfISGiIqIfIGE
hYaGfX94g3qEfnFxcnGBf3R8cnaDf3R6gIiHfXx7joqIfHt6hnaGfXl5bm2Df3l0bXmDf3d3
g3KGfnR1dG6Ef3FtgH+GfnNrjo+IfGpuem2Ef2lqhoaFfm9vhWuGfm+ObXSGfYiDdoKJe29r
aIGEfmtqh2WFfmtrbniEfmplZ2aDf2VoaGSCf2ZmZWaDf2dmZmyDf2ZmenqGfmZoa2mDf2do
iH+GfmZoaoKFf2VibWiDf2JhZXSBgGJhjnCFfmFhZWmBgGFgg4OFfl9gYF9/gV5dX16AgV5e
Xl6AgV1dXVyAgV1cXFx/gVxcXFx/gVxbW1t/gVxbW1t/gFtbWlqAgFtbW1t/gVtcW1t/gFxc
Wlt/gVxcXFx/gVtcXFp/gVxcXFx/gVxdXFx/gV5fXF5/gV5fXmB+gWBoX2h+gGpraGp+gXCj
cKZ5g/z+/P5+gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP74/v5+ge/+9+V+gP7+
7f6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPCL8Yt9gYeDiIN/f36Gf4iDfpZ6
lXmEfHl5eXiAfnd3d3aAf3mXd4KGfaV9nISJepKslaiOeayNn5+NeZ2rm6GOeamroJaQeKym
pqKQd5iGl4aKenJxcHGAf3ySepKIfI6aj5qNebCqqa+Tdp6Qpo+OeXdsdGyDf22EbISFfouP
jYuMepKRmZGOeZefl5qPeaynoZqSd5KSopWPeYeakJeOeZyZnpyQeJONiomOeYGNf4qMemZ+
ZXOEf4tlemWGfXiQepWLe52bkpCQeJZnm2qLeomeio2OeZaOlI2OeZCajouOeoGdfniMeqSk
kZWReKGlmZySeJqhmJKReIOahHqNeqmimJWReJiimJyReKKckYeQeGFeYF+BgF5eX15/gV5e
XV1/gVxcXFyAgV5cXFx/gVtcXFt/gVtcXFx/gVtbW1t/gFtbWlqAgVtbWlp+gVtaW1t/gFtb
W1qAgVtaWlt/gFtcW1t/gFxcW1x/gFxcXFx/gF1eW1x/gF5gXl5+gV9nXmZ/gGhqZmd+gG6l
bKJ4g/z++/5+gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPTi
/v5+gOT5++V+gP7+3eN+gP7++v6AgP7+/v6AgP7+/v6AgPCM8It8gYeDhoJ/f35+fnyBf4l6
g3qDfnl4eXiBfnd3d3eAf3d+d4KDfoN+hniEfn+Gf4yGfIWCjYyIfH6AkI6HfIGAjI2HfHx+
jo6IfHx2hnuFfXBwcG+Bf3B1eYaDfnd4dXaEfnh/cn+Ffodyho6IfG1siXyEfmxviYKGfXBv
iI+HfHFykoqIfHBveXSFfm9uiGuFfm1ueo+HfWxtb2iDf2xqaWuDf2poamqDf2dnZmaBf2Vl
amiBf2Vla3+Df2ZmanSEf2ZvhWiFfoh/aGSGfXFlbYmGfmNjamaDf2NjY2aCf2FjaGmDf2Ni
aGiDf2Nkan+Ef2Rkf4iGfWJiZXiDf2Njk3SGfWNld5WGfmRjmHSIfmBgao2DfmFeiGqEf2Bh
hJCHfWBdkHCGflxbXFx/gltbW1x/gVxcW1uBgVxbW1t/gVtbW1t/gVtbWlt/gVtaW1t/gVtb
Wlt/gVtaW1qAgVlaWlt/gVtaW1uAgFtbW1x/gVxcXFx/gF5eXF5/gF1lXmV/gGVmZWV+gGp6
aHx9gpiipqx6g6ixrrB6g7/Jrql7hNTZm4t9g9vajp58g9bUsLZ8g9HPtbB9g/7+/v6AgP7+
/v6AgP7+/v6AgP72/v5/gOLf/v5+gen79OR+gf7+3d5+gfCJzYx8gIaChoN/f36HfoiDfpN6
knqEfHh4eXeBfnh2d3eAf3mYd4OFfqV+m4WJepWvl6mNeayOoaCNeZypl4mNea6qpKaQd5aX
mouNepGFkISJenFwcHCAgIGRgZKJfIuTiJmLepSTlJGNeZCTn56OeZ+inaaQd5uHlYWNep2l
n5+Rd6GSl5iPeYmGjX6LepJskGuJfHaQbn+IfWt5aHmFfpykmZuQeJyekJeQeHd8eX+IfKSa
kIuQeZmgjY+QeJOPko6PeaOflZKRd5pokHKKeoqlipaPeZ2AlX2OeXGceJOMe5mml5+Sd5uN
kY6OeZqIjoaOeYOOf4aNeoyfa3iMe6eij4uReZWOkpOPeYuLi4iNepCfcoSNeqSci4mQeYSh
ioiOeqJ9iWmMelxcXFx/gVxbXFt/gVxbW1t/gVtaW1t/gVpaWll/gVlaWlp/gVtbW1uAgVpb
Wll/gVpZWll/gVpZWlp/gFpaW1p/gVtcW1t/gFxbXFx/gFxdXVx/gV5jXGOAgWNkY2N/gGd3
ZnV9gZihkJF9gaOiioF+gpqScmp+g4yMaHJ9g56ljJx8g6Wlnp98g6WpoJ58g/7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP77/v5/gNmL9It8gYaChoJ/f359fn2Bf4V6
g3mCfnp5eXmAfnd3eHeAf3d+eISCfoB9iHiEfn+DgY+GfYN/kI2HfHx8j4uGfHx/kI6HfHl2
hYOEfnh0hnyEfnFwcHCBf3J1e4aEfXBzdnmDf3RzcYKEfnR0jY6IfHJxhouHfHFvknyFfXBw
eZOGfm9vk5WIfGxrfXaEfmtoiWqDfmhofJGGfmdmbWiCf2hoa22Cf2ZobWyDf3l5Z2qEfmdl
iHWGfmVla2OBf2RkaWuDf2NjbWuDf2h6bWyEfm1kd4SIfWRvhXGGfnVmcZKIfXdxg3KJfGVk
k4KIfGFjcpKGfmNgh2yFfmBgcGeDf2BgXl6BgWBgXl6AgWBfXl2AgV5fXV6Agl9fXl6AgV5e
XV1/gV1cXFx/gVtbXFt/gVtcXFx/gVxbWlt+gVtZWll/gVtaWVp/gFpZWll/gVlaWVl/gVlZ
Wll/gFlaWVl/gVlZWVl/gVpaWlp/gVpbW1t/gVxcW1t+gFxcXFt/gVxjW2J/gGNjZGR+gGVs
ZWx+gXRwcXB+gHBtcnB+gWZka2Z+gWNsaG98gn6WfIh+gZybhnt+gY9+dnN+gv7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPSN8Y18gIaDhoJ/f36If4aCfpB6
j3mDfHl5eXiAfnl3eHeAf3qXeISFfaR+mYaJe5atlqaNeaudnqeOeKysp6aQd66fopuPd5SS
mpWNeY6DkIOJe3BwcG+Bf4KPgY+JeouThZiLepKRk5KNepiXlZeOeZKVlZGNeZ+pjpmQeZ+c
jYqOeZOOi4ONeYiGhHuLfI5rjGqIfHSMbXyIfGp6Z3eEfp+kkpSReJueipCPeXV7eYCIfKSf
k5CQeJFrh3KKe5SZiZGPeaCfnIySeIuciouOeYmIf4CNeoiHgG2LfJ6ibISNeqKbhYOPeYmB
fnSLe5KfbICNeqKjg4SPeZdsh3CLe11eXV2AgV1dXVx/gV1dXVx/gl5dXF1/gV1dXFx/gVxc
XFt/gVxcXFt/gVxcXFx/gFtbW1t/gVpbW1t/gVpZW1l/gVlZW1l/gVlZWVp/gVpZWVl/gFlZ
WVl/gFlZWll/gVtaWlmAgVtaWlt/gVtbW1t/gVxcXFx+gFxbXFt+gVpiWmGAgGNjY2Z+gWdx
a7V6gn9+8O58gX9+6+17gXyA8vZ6gomP+ul6goWItJJ+gYB3g3x+gXd1fXt8gv7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPKN8o18gIeCh4N+f358f3h/f4J6
eXmBfnh4eXiBf3h4eHmBfnh8eHeBf358d3aCf3yAdnWDfn9+dnWDfn58dXWDfnt7dHSDf3l5
cnKBf3ZzcXGBf3BvcG+BgHBxb2+Bf29wbm2Bf3FvbWyBf3Bva2uBgG1tamqBf21rammCf2tq
amiBgGppZ2iAf2hoaGeAgGhmZmaAgGZmZWWBgGZlZWSBf2VmZWSBgGRlY2KBgHJwY2KDf2Vj
YmGBgGhyYWGDf2hrYWCDf3VjYGCDf2FhYF6AgWBgYF+BgGBgX16AgF9fX16AgGBfYF6BgF5e
Xl6BgV5eXF2AgV5eXV2BgF5dXl2AgF1dXVyAgVxdXV1/gV1cXFx+gV1cXVx/gVxcXFx/gVxc
XFx/gVxcXFuAgVxcW1t/gVtcXFx/gVxbXFt/gVtaW1t+gVtaW1t/gVtbWlp/gVpaW1p/gVla
Wlp+gVpaWlp/gVtbWlt/gVtbW1p/gVtbW1t/gVxcW1x+gFtcXV5+gVtiXGF/gWNmY2Z+gW7C
b7x6gv7+/v6AgP7+/v6AgP7+/v6AgP7+/vl/gPzn6Nx9gbCN1u57gper/f57gf7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPGN9I17gYeDh4N/f353fnh+f3p5
e3t/f3l5eXl/f3l4eXiAf3d4eHeAfnd1d3eAf3d1d3aAf3Z2dnaAf3V1dXWBf3R0dXSAf3Ny
c3KAf3JxcnKAf3BwcHCAgG9ub29/f21tbm2BgGxtbWuAf2tqa2x/gGpqa2l/f2ppammAgGho
aGiAgGdnZ2eBgGhlZmaAf2ZmZmaAgWVlZWWAgGRlZGOAgGNjY2OAgGNjY2J/gWJhYmKAgGFi
YGF/gGBgYWCAgGBgYGB/gWBgYF+AgF9eX16AgV9eXl6BgV5eXl6AgVxcXF2BgV5cXV2AgVxd
XFyAgVxcW1t/gVxcXFt/gVxcXFx/gVxbW1yAgVxbXFyAgVxcXFx/gVxcXFt/glxcXlx/gVxc
XFx/gVtcXFx/gVxbXFx/gV1cW1x/gVtaW1p/gVpaW1p/gVpbW1t+gVtZW1l+gVlaWVl+gVpa
WVt+gVpaWlt/gVtbW1p/gVtaW1t/gVtbXF1+gVtcXV1+gV1dXlx+gVthW2F/gGNmY2Z+gW/M
b+B5g/7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPSN9I18gYaDhoN+f3+Df3uAfpaE
fn2CfXl5fHqAf3l5eXmAf3l4enl/f3d5eXl/f3d3eHh/f3d2d3d/f3V1dnZ/f3V0dXWAgHN0
dHR/f3Jyc3OAf3JwcnB/gHBvb29/gG9tbW1/gG1sbWx/gGtra2uAgGtqaWl/gGpqamp/gGho
aWh/gGhoaGiAf2dmaGd/gGZlZmaAgGVlZWV/gWRjZWV/gWNjZWR/gWNjYmOAgGFiY2KAgWFh
YWJ/gWBgYWF/gGBfYmKAgF9fYWGAf15eYWKAgF1cYGCAgF5eYGB/gFxcXl5/gVxcXmB/gVxb
YGF/gFtbYWN/gVxbZGN/gVxcY2F+gVtbYmJ/gVtcYmJ/gVxcYmJ+gVtdYmN/gV5cY2V+gVxc
Y2N+gVxbY2V+gVtbZWV+gVxcZWZ+gVxcZmV/gVtbZmd+gVxcaGl+gVxcaGp+gVtbamp+gVxc
a2t+gVxda2t/gV1ea21/gV5ebWx+gV5gbXB+gWBfcnB+gWBeb21+gV5jcm1/f2RlY2V+gW2/
anl8gvr+nMl+gf7+7v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+
/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgPWM9I18gYaEhoN+f4OGf3t+f4mN
fn1+f46OfHp+gI+OeXl+f46Nenl+f4yMeXl+gI2MeHh+gIuLd3d+f4uKdnZ+gIiIdXV/gYaF
dHR+gYODc3N+gIKDcnB+gYOAb29+gX9+bW1+gX9+bWx+gHx8a2t+gXx8aWl/gHt6amp+gHp4
aWh+gXl3aGh/gHV1aGd+gXNyZmZ/gXFwZWV/gXBvZWV/gW1tZWR+gWxsYmN/gWtqY2J/gWpq
YWJ/gWhoYWF+gWhoYmJ/gGhoYWF/gWhnYWJ/gWdmYGB/gGZlYGB+gGVjXl5/gWNhXmB/gWNh
YGF+gWFhYWN/gWFiZGN/gWFhY2F+gWFhYmJ/gWFhYmJ+gWFhYmJ+gWFhYmN/gWFhY2V9gWFi
Y2N+gWFgY2V9gWFhZWV+gmJiZWZ+gWJhZmV+gWRjZmd9gWNjaGl+gWNkaGp9gWNjamp+gWNl
a2t+gWRja2t+gWNja21+gWNjbWx9gWNjbXB+gWNjcnB+gWNkb21+gWVjcm1/gGJlY2V+gWuY
anl6g87UnMl5g7rN7v5+guz9/v5/gf7+/v6AgP7+/v6AgP7+/v6AgP7+/v6AgBIGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHIkYTAPCBklIx0JCCg2IzcVEzob
PSsLEysdHicEChYlNzAKCiJKIEwgF0UePDEfFU5JRlIaFFhRVlUhGU9IW04cGkdSV08cEGFH
SkIhFFs6SUYdERceJyASCURaQ0ccFzg+T1ciFCxScUsbE0pmT1okF1tPUlAqE0tGbF0bDFVC
Z0ccE1opS2AoHFMqXFkmFmY9XTsgGSEiN1oiHSEeX2EdDSckWV0hGWUfgmAeFB8jeFslH01X
Z2ceGhxXVW0jGlgecWUeESUfY08eE1pTbnAjGChPVl8oHD88ZWAeGj5MXUYlHCYoMRYQEiAj
HSMKCxoiJC0FDCEfJBYLBBciGhwFCRYrLxgMCyAWHxoRBCchJSQIByIRICsLChcsJgwXCy8e
Lh8LBCMeEx4NChYkKhsLBxEeFSwJBTAhIiANDCMjHSgEBSoeLCERDRsfHygLCRUfGyAEERAy
HB0VChsiFRYRBCIiGSoOByEdLysICBgeGCIPDBsgHyURByEpIhoLBC00ITMFBDEsLTMQDSsx
JiQGC0JwOWkcDQwGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGgofTAPCCAcJR8JCiU4NzQaCEwd
LRsUCSYjFhoQDyUcHhoKCBlaJzIZFk1SGRgQF0thLygfF0o7IScYElVlFyYbD1BmKigXE19Z
JxQjGGNYIB8jFhYSGx4LC0NeEx0gE05nJhsZEWhVOyYjG2JnPTApGGJpLjchEmdZOjoZDWNY
QzYbDU99MTwmIVVKRSkgFmc/SjEhGTBUQGIiFVRfSUAeE1ZTR0khG3ZeTEUbD09YPigmFmRY
TUceGmhjXVcnG2JvPUseFlNZRh4eGW9PZkMYFnRLWVEqFWVWXlgXD3JLSVQtHicnHBYKCSYj
IR8FChwjFhcOCjApGw8TCyUcIycRDhUbJRYMEBwXISIHCiAeNBwGDikfIyIRECYjHC4QChsm
FSQUDCceJBESBB0dJRgJBCsmFioNBCEnGycMDyUUIioFDh8sIR4LBR0lHxQUCR4lHSUNBBoj
JyEMBxsVFRwVDR0nJBMRCSgvIBkFDiIqJigKEiMiLB8KDh8eHCEQCRktKjQFBio6LDgREyAk
JB4RETddPVoYDAwGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHozcScRCCQcIisTBicyLToZED0q
MiQRERUhGRYMCCgiJxoJDCRRLVIlE1MuSCweClNWSGQeGW1RcFgcF09QX18ZG1FbUE8dGFpT
eFoeGF9VQD4iGg8nFxQVCDlTNlcmGUZBWWMeFDxYclMgFVhhXHEiHFVNaGIiGlBcb1cgGWBW
dFwcHF9xaW0mJVouYWgnHmBETE8nGxwcQngfFCYiU2QYEy4VbGoZEh4hhCMfGBYbSF0kGyMl
YGMbF38tcGMdGS1hcXQiGlcoelokHh8rZ2shE28aY0cjHD1gV3AiHB8geUocFFpDX2geEEkb
gyYiGCMhKxoNBikfIiMLByUjJxYPCigdGhAFBSQoHCIFBRAeKxkKBRwZKiYGBRsfIxsOCywU
JB4TECoqHh0JBBUkKh0ICyIfGBsNDR4gLw4PBxoYDScOBCQdICIHCSINFRYNDSMTIR8JBCsj
HCQLByogIRUOBSIfHRkLBBwiKBIODhsQGhwLBDEfFRkFDygbHRUJDSEwJSMQBzMzNysWDSkn
JCYOCTJzMW4eDAwGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBJIudS8RCCsmGxkJCyBHJjYdBUcn
JyITESkbHRsEDxwOJRwLDiFJHCgVB05eFB0bGFBTHxgiEWpTKREaEGpgKSUcD1xpKxQZD2pp
MSETE2NOHRshGR8XFyQIBkJoJjAiE1tzHTQfEoRNPTgiGXtvRz0kEGhsQEcgFl52QkMfGmtq
UUseG2NhVEkdD2ZXSCQgF2xJUj0fG0J8JlcoGWpdXlEfF1pual0nHnstZWshHlJ/Vk4kHmJd
YV4cFmNbWUMkHnl9ImEkFXGGQ18mE4RXVVEnHGpSUUUcG3p5XlokHIh5XGYgFFl+Wl0iEXMu
Ux4qHSUzHCUOCDApISMWBCQaIx8OBBsSJSEOCS8dIxQKBBsbFyUEER0kJRgIBhkjIxsKBh0Y
KxURDRcbGSIRBCYnHCMKBBkiGh0EBBUYERcSCSkXIRUHBRsbHSMIBRklIBMICRoZJh8FBCQm
FRYEDSAjIBkOBSoZICALDSMrIB4IBCIrGR4MBBkhGh8KBxspHyYLDCcrJy0NCTgyKjIMDxIi
HSgGDjBtSW8dDgwGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBIA2eicRCyYdIx0JBTNEKjsaEUkq
QSUXDyYdLyIJDBctHxQODR5gIGIaHmUmWBkfHVBjSlYfFm1bZl8iGVpfaF0gGmpXdl4lGV5S
ZXAgGGBKQEQgFxcYFikKETJiQV0nGz5HUlsmFi9ld1khFVduZm4fGV1Nbl0jGGFTZ2EgF2Rf
dlchGVdpXV8nG1c2Y3AkGnVNWk4rGyxvPlIkF196THwdFiYdcG4hFyBfcGMiH18pb2UlGF1R
dHknG1s8bEwpHDFhVoAlGlQweGUoGGBVeGkaFGYbdk4sHCowFx0SBiorISQQCiEmKBgLBRUm
FyINCyAkFBgKBR4cHx4KCS0dJRoLCyEdKyYUBhocJB0LDBckGCYJBxwVMiEQCyMfGi0KChEm
IDMOBC8lISYKBBwcLxoOCRsgKBYLBCAeJB8QCCosIyIMCyAXKRsUCRodIxkNCRYhKR4NBR0h
IRISCBgaHCQFBBocHSMQBRcfFRIJCiQiESIQCiQlHBgQBCMrHBwIBCIxKywOCTIiPCsNDx8o
IiUSCzpbRF8dDAsGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGFjINBAkGBgYFBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBH0sejMLCCYpJiYOBTRLLTYfB0oo
JSYXGB8mFScWCigoLR4KCh5LJhcdCFljKCkdDWFqLxsYEl5lHycUDWlmJxwdD1VvFSkfGnJY
LiMeFWFcKBggGCQWEygUBjRuIDogGk92KyoiFHVnQi4jGm92Pz8kFWpuQEsnEF2AP0keHX5p
UUQfEDF3LkYkH3ZiRicjGGVYSTokG0xZHkgiF1NtQ1wmGHBvTUYhFnx0Jk0kHn1/SU0hF31t
YUkhEX5gWlEoGWSFJloiHnmIUlIhE3pwXE8UG2xEYiEpIR0jIC0NBh4iIBwIBhIeJyAQBSUc
HiYFByobHRMICiApFyANBB0WMRkFCSEnLC4FDREiHiAHBSc3Gx4NCCIeJhsLBBofMRUKBR8m
GAgMDSMmJygEERomGSIPDCkgJyYMCigoHRsHBxwaJiIFBRogJA8LBRUeIh4NCSwYGxgNByIb
FCUOBSQYHBoHCx8hHhAIER0kJRkNDxsjIiMSCiAVIBQODiYgFBQLCRowIDcHBD4vMCwPDxod
ISUJDDagJT4WCVdQJCAMBFpVKh0LBFxbMSAJBFdVIiARBFZYLRoMCldLKiMKBRAGBgYGBgYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHYjbysRCCYZIiALCjJCOT4ZFEIg
OiobFDEXIBUSCR0ZIRUKBy1fIlMhEWMaUzUaGk1rP2QiFHJpZ2IjFmNQaFAdFGdHWloYFWtO
W18gGlxaVkgdFhUXIRYVCDhxM1wjHzxQaG0qICpadFwmF1xnboQqGWBibU8gF3GGY2ofHmVj
b3gjFlRcZXcmFlc9WWsuHnZTXF8lHiNcQWsqGl0egHgjGiM+JFchE0gibngwIDAcZHghEyEm
cWkfHDVNfXwnHmcvZ4omGFtrfHAlF000fnAqICxjWX4eG2EcjXsoGB45d3onFGstj2UoHCck
FiINDhElGBkKBSUjJhsQCx8gMyALBCImKioLCh0uHB4EBCgcHx8SCB8XIyIRDDAXIiQOCxki
GxgFBSYmHCcRBSofHyENDyUNFRoKBSsgGxoNBxURGSoFDyQdGCQLBREhJyQUCh0gKx0TChol
ICYNDiQgGCAPBBUaIhUFChoeKSENCiokFB8FBBsiGRwKBB8fJR0EERkyJzoIDisuOS4RDRwq
JS8MCytDVJ0bDSkiXF0IBiwbbF0KBR0waFUJBEM3V0YKBU1MTjUJCmdcGA4JCQYGBgYFBQYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHsnaSoTCBkWIhsLBTFBKC8TDFUr
KjQcFxwlIR8OCBQhHx4ECh5VHx4XCFtXJiceGGJpJhceE2ZZNBwfEHJqMhgYEHRsNCsXEHZv
NyAfD2RlMjEmIh4XFRMOBjR5JjsqGVV2JDYbHH5iSUQkG3GAUD8iGW94QmMhHF1tVU0lIHuB
Uk8kHGplWU4gE21pVisgHHFNVz4mHFBsLU8nFmxzWFAbFCtKWV0mHIN7XWYoGW9gUksdHVpr
fWEjIGaCFFYoIIuHX2UkFoOEY1gkHImDZ1QdHXKPM2AxIXeXVXgaFIuDW2YiFpVcYjQpHRMQ
ICYKDiIYHisICCUZFhsIBRwcIRoYChAaJhkNByswER8EChMbJCULBB0dHyMLCxwWIhgRBR4g
HhsNDR4XHjAPBBckFhsSBR8ZHCMTBg4bJSMMCiEfLR8MCiMiIR4FBSYZFBQQCicWHB0NBCMx
HCMJCBsfGCAFCyocKSUKBCUeKh8LDx4oIhwLBRYhLyILBCgcJicQCiInHyUQCDgsRzMHBB4m
IykOC2pHajMfEQgGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
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
HyMNDCcdHhgEChcmLiUMCCgfKhkMBRskLScQBRomJR8JCCIPHh0NBBE8HDsMBzcxPDANCRgo
KxcVBmMSZxwdDgYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHM0bC8SEycbLCsLBSxLLTwYFFUf
SikYEhwhIRIGBh4eDxgLBSVcHlohEl0vaBQbFFFbTlYlGGpfXGwnHGFtYG4nHF5+a2UiGpyM
YnomHmRySFQjFiIgIB8KDjd4PWMlIEpfa28iGDlGaoEhFoEudHYlGFt8dnciGYJqhYEmHTFg
cYEnHm9uh10pHltNcWovIHhcVlInGz5sTI4mHGMrYyEoIB4WLRsRBiUrRIQeHUaOemIpHC4n
fZkiHSgbiYYlHi0hhHQYEzkkiI8lHjFlloYyG4gnjYknHGV+gHMwH29voJgpHIMqdHMoJkqO
dpAmHCxJtm4kI3VbgH0xJlpvoo4kGjUnhEApIWdpdHAuIYgomokpICoqeJclIF48e3EpHpAh
fXQpGikelngrGl5sX2EhGh0iDB0NESAjGyEGCh4cEyIFCB4tFC0LCxwlIhUQBxwpHxAQCBgf
JB4RDR8nIiMMBSgfHiISCh0fFhgLCTIhMhsKBC0kLCUHCiIoIREMDSg6HzoEBz0wQSEQCSAv
KjAIC2kcehwYEAYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHIycS0UDyUpLRQGDS9JKikbD1kl
IxcdECYSExkMCycgGRwOBxpSHhwSB2ROHw8jGF15IBscE3BcMxweEmtxLisXFG1oKSQfH25f
GygkIWRkJiEgHBgjHS0RDj9yJiclGE97LTIdFIKCYz0cGIp4R0sdHHB2ST8oHINtUUAlF5Rr
Vj4hGWx2UlIkIH58SxolHIlhVjguHxeTI04dGzwdLSoTCCwvbHAiHk+Oa2A0HnGFVFYsGI2T
VmgcFXSWRFIkH3uMT0ohEXR+insoGIuOHkwmHZR8ZloaH6meZl4lGpyMZVIkHYdrY1IsE4Ob
QWUpHp6rYUclHJKFfmIgE3aObGMXFnM2OCksIIVwYmUsHZyOaFUgGHWSV2ImHoCGYFgpHJJY
XVYhGHiNVlsiEl9rU1MsIBsfHiMTCCMrKSMLDykcFScSEh8kIiMPBiseJCkVCy0SKQwSBCYw
HCoSBCQfIyIPCRUgFCwECCEWGiIJBRwWGiYPBCUpJCIMCCIsHhwOBSs9HDAJCjQsQSUQCiku
HjgJCW4cfxkhFAYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBH8odCkSCSYiJhQJBTJMJDsYEGEf
QCAbEyMpLSQGCR8YGxgOBBNkK1QhGlgnYTAhGElmSGYhFmprXGohFmR2YnkYGGpjVnYdGmp8
Z1snI11gXU8bFiciERcSCDxmR1EkHT5nZn8nHzVTf2AoFnJna38qI256aW0fE2d7e3wqGHRx
fXonIXEuiHQrH11ZaH4sJoxiXF8rH0hxVYQrIHYrXkEnHz5sgH8sG3Mse3AqGysylH4lHHs+
goMtISYjL4YvICUclocgFicYiI0lFi4mbpQlEiIblYkfHWBkkWgqHh0nFXAnGzQkl4glHysv
g50hHiQaia8wHSdhqJMtIIohjaAmHFtaipYnHSginWUsGEl5c4ApIFhYnoQnIG+AhYQmGpIm
nTMqHCIhJSMTCCwjKSgKDSIhFhoFBRkhGCQMDR8cEh8IBCEcFxUKCh4kIBUKDi0TISAIBSUn
KBgNCRYhIiUHDCcdKC4PCictIh8JBCUeLSsMCh4kKCoMCxQdKR4NBSM8GjAPCjEhNBwSFBYr
LyMGBlkSaxIfCAYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHM7bzUVCyImIx0LBS1LJS4YCF0f
NyUeFicpIhcGBR8bJhEPCx9TICgYB2pbPyklFGJgKy4bEW9uPS8mFnFjLSkhG2V6Oi0jG36O
MzMkHmZjOzAoGCMgHQwSFDJ1JzwjGFaaJDshFJJ0SzwrE2xvS0YiIoxqPkUlHo58UEMkHoOW
Vz0iGnpuQE8lFoFyRSUiGYRiVzItJhR6OEklHk9MMS8bEIuOXWAnHnaTYV8fGX6AVWQoH32Y
XGIoJzZ0YIgrKH1+bmIdH6iUZVosHa1/ZWEnH2xkgI8qIF6PWGUxJDeGg3MpII6IaVUnGYiT
bGUjIZJ0cC4pJI+sLFUlHoqfcmIeG6GLYFobD6iHW1gqHXaZQlImHo6pWkgkF5ygYl0iGpIx
XiAyIhYgHyEODRcXJR4GDCIoIy0MBxchGh0FESAfKx4QCiMrJTAVCBwYJhoQBCApFisNCiQQ
FCkKCxIgGRcPBCAgHCMLEgwqJR8WECAdKQoTBR4YLCkPBTEYKCcKDig4JTUHDzYjNiUUCiYj
ICYOBl4SYhIeDQYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHI8cS0RCSATJysQCDlDLkAUElUf
RyUYDyckIiEQESMfJCkPBBVbJl4lHXQ1ajMZF1VgSVgfG2djZ3cnF2x0aHEfHoBmYF8nGnCC
XX0nHVtfU0shHCohGyMUCDZ3NV4nEldYYIErHERWiGwqGG52YXonGHF0SYUfF3mJb3UcGY04
eYAvIiw1j3YsIWBiV3wqI4xpal0rIUV5TYAhIXIwbTgkISUth3UoHj4liIkkGjEflC8wIoSD
fYUzKD5PeZcgEDE3n4IiIEAyiY0pJC0yJ3srIyk/kLInInFdj40xHT2Vn5EoH3Ium48rFTEY
jk0nIjcfo6ErGiKMoGMmJWuLZ3wfIJcigacnIDMin4MvGW6XnpMnITVOhIMtH3SBibsrGjqK
hoYtIjUjaY4lHzJdZoUnH4sih40qGUyKbGUkHXl+e3UwGSkmKSkKDRwpGx8MBRYSISkLBCci
Gh4FBwwdJhoSCiQqIyELBSgnGiAKBSQaJxsTDCQpHxcNBSseJiQOBSU2LSsMCjweNyYMCSIj
JCgGBmISWhAaCwYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBG41YCwQCRwnFSoIESNMKjYYBWQn
KR8VDBAtIBQGBiIdHx4UBB9PHCUXBGRYLS4iFmlkKBwZFHNyIjEfEWFaLCccE3duLiEeHXFu
LS8oH2FzKCUlHh8sGyoLETtwLiQsGlCMMSYiEXdwPTgkE392SB8pIWp0JjwiEoB5PDciGmyM
Qj8bD3d3RUQmG4VrOyApGYVjQi0lICN0IkEiHDs5ICoUDH6BRkIiHY58WzolHIVJXWgtIYt9
bD8pIX6SWEohG32gRV0oG4aSU2koIDiIb24sIZGnWlAkFoSWR00fIKWNXE0sJ4J3VT8gEIxP
aWYyJ6aAZF4oHqV2UFkyIY+SV2UuG32KaVoiHJ18UlsZGYuwV0IrHnyATCspH6GAWU0XHcCM
SFYqJ5SgWkItGHaHSkckHpOXXkojG6xxW1gnIJJlXEgkHC4eJx4SEyAaIxwRDSQnFRULCiIk
JSAJBScuHy0MCSocHSIKCyIXFhMLBSYrICILBB4oJB4NCR8eHyIOBSUuJDMHEDAsMyUQCTEk
JCMSDWkQVxAcCgYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBF8yXzoPDCkwJiMJCiNBMzcZCFcg
VCUbFRwjHTMVCSIfEB0RChhYJVgeG246ckUiHkdoQWIeHYFoaWobE3NoWGUdG35mamghF3p5
dmQgHFxmOlAeEyAkHhwZED9xP14kHUJ2XIIhHVJkhmYeG4RsWHYsHYR7UokZFnmHeHQlH3eC
aG8hG0x5iW0rIXtkdnIwIH1qZl4nIkxvTIMfHnkrbVQqH0VxiJYkJXM7iYQkIDZDhYcmI31I
fHksIiI5NnYlIjMkmYkjEjk7bJwiIStohIslH2RPi5wrIi9Xg58pFoWEj5gqIlOFenQpIIpO
j3oqIHaCnJEmIi09mIofIDoslSEpFhYqIycLCh4fHhwJECMyHSELBCY0MBwJBSkaDykMBBwa
HSMNBRwfKCcYCh4XJyEQCg4nJCgNBBsiFCELECYaIykKBTIgGyIKChobIQ8GChYoGCgSDh4y
JSYMCCIxHiAJBCMkHiQJEBwgJxgWCh0nHR8IEyQlHx4PBRwYHh0KDBcwHz8SC0YaMSgVEhon
GR0PBlsQXxAWCgYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBFMpby0KCSghGCwGCCZJJygcBGQq
LR0gIB4gGR0RCyIhHigFBhdJKiANDmJHKiwZDmhnHyIcEW5jLishEGpeNi4nHHNsLiclIICD
MyIkHWyBKyggGCAUJiQOCT56MiwkGFhwIygcE4tuRjQiHYF6SEYnHWSGMD8WE4aSRTMfFoWC
Rk0hHoqNPj0sHZxtQCAlHZlnThooHiCMMEAiGEBJLB8cFZaHT04pH3WSS2YcFoiMXmYjHpiW
WGwvHlmGiXsqH4qeUTUrFrGcU1UpH3uMTUAfEZB/XV8mInaJODEmGK9+YT4iEZpsV1keGJx8
QxsoHqePZEYlF6WbTl0dFnYxTCEvHikfLyUUDhkdIhYICRYVFiIKDSgYIiwLBBoWLhYLCSEk
KyEKCyAhFxwMCRspJSEPEhgWMi4OChslJB4SCiUoHh0JCSApJysNCBkuEhgIBCUaHx0IDx4T
IxUFDRYmHhwEBCIuJh8JBSIhIyQJCiQkJB8KDxwxHSYJBjEjIiQUCyk7KzIRCDUrLCQVByYl
HDoPBXQQZxAZCAYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBF8qcy0ICSIjHioLCTNDJTobDFgZ
TSUaFB0hICILCBIcFSkEBRlZKkQjGmxBaDUhH1BcP0wcHn9agXMhF2FpVl0fFGt+Zm8VDlB7
Z2shH2NkQlMgFygcKCUNDTp3P1UrEk1vV4gjHlVggWojFXpybnEqG3V4UGsaFHOCfm8qJHZf
dXQkHFmEgmwmIHFkenAuJ5BubmcmHlxhUIkeHWsxY0ImIklPiXYpGVJIhXQlI0ccmEAtIk9A
h4gtJVNJfpUoIlx1no8qHE9FboQiI1pHfYUjH1khjSkrH3iccIwrIalVd08rHiR8RnkpHnSr
XoMkHFVEjZkdF1lIso4dEGx9p4AjGypJKXwjHVBIpYgrHl6fn282IlFHkaobHE9FpXguHWiZ
npMsIJVCz48yGYxUf4orI1CAaHQfHZ0+pXQsHnhacG0uGS0cHiIPDx8cKCMMCyEoHyAKBRwj
ISINBCQoGiEMBCIqKyQHDSUgHRwLCSguJyYECyogLigKDSwiJBwNDiEzLDoHCCsxKiUaCDwp
KCwJBVQQYxAYCgYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHA1ZSgPCSYgJxkJBSxAMCYWEVwd
NyMcFSEgIBwGCRwYFCoECyVQKC0VBWdONiYjDnNpIC8eD2KAMyoeFXJoOj0iEH9jOSgfF296
NiolHm58IyMjFy0kLh0ICDxtJSYmHl1wGyIlFYVwLyojG3uMLUIpHlt7LzEdFH+BRSQjHWtu
MRwjHIB0OyskGJBnMCckII1oPx0sKC+IJCMnF0BDKCEdEHWAJjUlFZB/NywmIo1baXAqIYli
WSwhHZZpMUgmHJigLTYqIX5wPCoeHpORSzoiHZNVT3EtH5N+VkEtJaZ4PXgoIWSAg0ovHHSP
MzYkIox4SzwrF6OSRUwnG3acN1AoFFR1bWMeGJKkSEUkGZyURUAwG4eHSjslGZ5wTywvF6eS
NEYnHZKvSTMlGpWKRjInGnCcMkglFqWZQjUfE4lpRzIpHyInJSYODSAlKCUUDiMlIx0EDBcg
GyAUCRszHyAHDyQZKRcKEy0hISYMCSIcGTAOBSgjESYQCSMhKysLBCs1LzMGCzonLB4PCSws
KCILBmwQZhAWCggGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHQ0cCUVCSghNCcQBRtCKjoWEFsi
Ph4aEx0WKBoeEA4WKxwNDh5WLEEhHHBGb00lHUtWSEohGYdkcXQmF3dsX2kmGnx1U1QeGWp3
WncdGnh9U10hFyUfIyYQDj14PmklFkh1THchGUhimoYiGoeMYm0iG2uFg3MiFmaPcGUbFotN
fX4tIVd+eXkiIIFtbXorIIllaGEeGl5oRZoeGIEpaxUpGiJGGVwjHVVQj3MtJ2RUi40dDyw9
d3wqH1pLkIMtHmGJk34kH1ZWjpwqHy5eNnwpH2RIi50pGoKadpseGFFmkYcgEmujkocpI1Mk
eh4nG5thnoonHlNHq34lHl9YjpQmGGBOkZslFl+Nu4krIWZdoH8kG1dYoaEiElZhnYosIWmM
nYMlGZpYxH4tHH98bXohHKNAfHwpGIeVfHsnG0pssIojGqR1b3wmG44abi0uGi0tICEQDBwp
JSMRCigmKCMKCDMcIxoMBRcxGRAMESQfIxwUDx4ZISYJCyclHCUZCC1AJSwPFDIeJCsRDh8n
IiYRCFsQWBAWCggGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHAidDESCCAfKCkPDSxDKi0aDWUj
OzMdGycdFSQNDCYqHR4GCh1CKTwUDnJBNxooDldbLzcYF19vQzohFHJQQD4iEHJqQC8kH2d3
PDEjIGtyPjUiHSQjGyETCEx+ID8dGFdwKyYjEpNsNRohGH1yLDIjF3N+MzUdFY1jPzEiF3mB
SzEfGntxMCMmHHVvJyEkFp9lOicvHyp4MD4lGEg7KU8UF1hxb3gvIZOFNzIvG4l7M0caFoJv
eGApHnt3SIwtJIuRXS8oGoOgOWwkHFaAakwmIoSBNiIfFJ+bMh8mIIaaOhUiE5OOOD0lHYhP
ZH8tHKmfP0AhIo2SPGYvIYSNcCMsGp6KTDMfHZmFOUMpGZaBPkkfF5l/OTwtHKR2OiMsF5uT
PEAiHZG8OkckHJF/PzcuGoxrNyYhGZ6DPDIjGICPR0seF2+ITEIjFnAnGyEnHCsYIhsGBSEo
IiUNDBctJSMFBioXKCAYBCkTJBYJBiksJiQJCCMuIxsVCiYkGysKERQvJz0PDTIqNh8QCiQt
NBkOD1oQWzsoHQsGISMfEQoGGh0UDwoGHyAVEAoIFxkUEAsIIRgTDxAGHR4XEgsGBgYIBgYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHggeCsWECkaKyMQCy8/KkoUB1ko
VDYfEywnHjUYECchFBMQBx1QKEklG15EdEsdIEpdRFQkHHxeamUkFWxsVkwkHVxUX1UTDl5/
b3wjFFR3X18gHC0eHyIQCkFpRlseFllxUXUlGk53h2UgGH5wW2okHXl1emkdGIR9XWokKHWB
Y4koIG9ReXspIHh0fHgoG3xqaV8nHF9zRoUcGXVJW0IkGH1mangpJXRwgXEjHWwwcjowH291
coctJWMna1AvJVl1X3guIHRudYkiHHlxfoQoI2UhkEExJ35yg3YpH3VJeYUnHW2GiI4lGJtc
goopHoiLhG4iGI1QmYwpHWBlgH4tIoKNiI0rH35wnYEjGbKFh4koJIapdoQiHDEeJyYXECMq
GCQNBB4mJigQCBsgJB8VByQnISIKBB4mKB0NBSshIRsKChIiGCcGCBkjJhwPCycfHB0UBxQZ
DigNCysfGhQSDB4dISkICjQuICIaEBkuJR0YDSAqIycRCiUjJSYSCCE7HScNCC8hMyQNBxsw
Iy8TBlsjTxstFx8fDwsaESoaDwsWDx8aDwsWDx8fDwsTDyMkDxAUDx8aEQwVEAkGBgYKBgYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBG8mbSkXCyMkHSUNCS06JTIZBF8u
NSEjGxESGioVEBcbGiQODyBCGjERC2FKOS0mEVJaMUMnGGtqQS8jFWxTQCUfEGBjPR8jFHB2
PD8bEnVnPywlGh8mHicIDkJ3IkErIVJbISoeFYBeNiUjFXJsOjAnHWZ1OEoiGohcSkcpHXB4
QSAdG258KSsdEmhqHh0kHH9pSyUtISB8H0kqHEAyNRcWCYFlIiopH4xyVoopIJRmY2krJHNt
Xi0qIHpuO3UkIG1zWy0oIHuCKjcfGo6CLRscE4JaVWklHICYTGMmHI1qe0oqIG+GNywgGXaP
KCAdFKmRMysmEoGRKlcmGY5sNUkhF4BxVSYlE56hJiccE5p2XDwmF414OioqHR4lWy4ZCxse
JlUOBCgqGh0OECcWJkQPCCYaRCAQDiUoP08TESMlSCcLEiYjJCAICikhIy4JCx8aJhILCiMf
Hi0FBy0vGh8LCh0rMB4PCR8oHCEUBy0mFR4KBSAyKiUPECIdJC4LBSI1MSgLBCwhMBwPCCo2
KzkOCUwQTBAbEQYGBgYKBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHc2fjcYCCklGykLBSM8KjMUEWMs
UTUZFCsgIh4UBh4jHS0ZCytXKUUjEmRNZl4jG01WTlofGHBaeHAYGGR0VVMbGGhRXWQdHFp5
SmUYD3GIamAiFigOHB4VCENzSGIhFUplSXofHEpnf2olH3RvV3clFYB3X3IVEXBmVFUaF4xV
dn8wImJvbnEkG2SMcoAlG3pwbW8fGl91RYQcG4M7XkgkGmZZeGgjGGtrhFklH142dEEoIox9
aWUnImpfW3QcFX5nkp8hH3Jlp5AxHydjO30wJXlyf4ImHoODhaMpJHiLmnUpHX5ydWQjGmEz
aVkqIVxfp5ErIICBhmsqGnmGZWMnEoZjfIcpI3FlhK8tH5CdhpAkHXJ5e38oI5uQlIknIHSR
l4AuIlpkk5AxH1WUeIsmIKR4h40iF5CRmnYeG4iJhH4lGSQhIRQZESIkLDIMCyAdHykIBS4w
KR8IBicqGBsKDisXKCUTByQgGiYXCiQYHBcIBCYVGyUODSIiIyAKDSgtHDUOCDUuLCITCBs3
GzgUBV0QUxAYFAYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHFAfjEWCBchIyESCCU/KSUYC2Ai
OyIkECgnIiwMDCsTIhUKCBpCISIZDGVJRCUnHFpRL0EXEWtaQzkaEWdCPEgmGmJLRToiFVxa
SkgpFW1oQkInFQ0iISIRCEVxIkgrGlZbKhwaEmxnLTcjFHlTTlEoGm54SEEbF15iXzwkGYF9
UDsfGX5lV1UfFGpwPx8iHmVmWCsiJyd/KhMjFEZRHyAZEl5sLCQkGntgGxcgFIxgW2kvJnRi
UxkoHG9wNUgeHHyPXSwjHpZ8KVwfHWmBcVUpHX6SK04rGYBycmojGItzIUIkFG19Zi8jGXxo
aFgnHpl8OSYXEomLORYmGJGLMSQoF49tLyMjFHuWLi0dEoKNKRgaG2dpHi0jE313Gx8jE5+A
MSQYGomTOyscEnl/Kj0qGGBoGiscFKRzNh8cEm9ZJSMkFx8oIBkSEhwcHBcQBR0fGiURBR4d
IykNBCsbHBwGBR8hGSAUCx4eGyQECSMeFyoOEyYqJSUOBzcoGzQJBykeJSMOBi0eKxYJChw+
JkUcE08QVhAhEAYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGoxbTcWBx4kKyQNDCVDJDkYE2oh
YyMaFCgYJCMRCygjHRgRDCBHKT4jE2RWY08jIEVRTlkfG1dhanQXGVpkVF0jHl5gaUYdG2xo
ZmEeG3R2UWgeFScfHCcQE0ByPW8jFld6TWcjF1FnjmYnGHKKcWwhG2Z9dm8YGlh7X08iG3ta
X3ciHnt4a3khH3F/bF0tIHZqbXAeE1JhSZktJHJtcXYnIG95ZXAjGnyGZG8bGns2ez4xJXlx
lWslHHdpYWUtI4htZJYpInlqilspIoOScl0mInqbbHAoIp2FaXwlHFyCcIMuH4R5bnMlGoJ8
foEmJGtjmGQtHyoOHCUNDicaMSIJCSkQLSYLCxsnIh0HBSEiHSIFBR8gHyMIDRwiFyMNBCQc
ICAKBSUnLCIIBBYnJSgPChgZHScPBxwdIR8EBBwsHRsRCikqHyEOBCsaHSwMCDEiIh4MEC8t
FhMQBCckHSALEBokLSEJDCIpEyISCCYiGiYLCScnMCILBS0kJBsJCiczLC8LDy8vNCwUEzs9
MkQWD08OTg4YDwYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHdAezYZDSQoJiMNDS1HJiYbD040
PRkeFx4mICMMCyUpIxMOCiRFIDoUCFFURh4hEktENUQiEF5hRkEgF1leRkwgD2ZmQ00jGFpd
UUgjEXJzRUsrFiMfHyUNBjtvJkcsGVZhMRsgE3duKTkdFWxmYC4oF250S1QkGV9QakglFGd5
IEceFHWEU1McF1NVMi0hGYNkWjwqIFGDSFYnIGdgQS4hHnBcHiAgH2l3KRAiFnJkUGcjGHpo
NDMWFXphIhQkE2qGLRQXG1RZJSAmHWlWH1smGmtlVywkFWheVlojFmZvYFokHGhudCgiGIxq
V1okGYdfJUkpGSMpbVQhFCItY2QgGB8jHkcLDBsgY3ofEygZRCoMDB8cK0cPBSIiR2MaDRwc
ZSwaFx4hJjEXDCkgYCQeESAhKCAOEAwbEBwKBBkfGSsTBCUoISgJBCAgKh4LBR0dJx4SECgs
Hy0KDiM3KSoMBCgfIisEBC4PMB0ECxwRLSIUBR4lHy8MBDEhMS4VBCUxIDAXCygiMhwRCh9J
LEkbFFkOSg4aDwYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBHE6ajYmDigiIBgIBh43KDITC1Y1
VCkZDSAiJhsZCBslCRcIBChDIUkfFlRSWFslGERRTlYfGVtUbmAaEWdYVVUfHm1kX1QbFFZt
ZmIdFk1rZ1odHiYmGBMXEEB4OXUnD1RYR18dF1JigGArIXFRZngnFmNfaX8hG4VreV0dE19w
nGwoH4R9c2kpGXV2dGomH3RkbWckGE5jQ3oiG3IkThsoIicaIhwOCUeATJgwJXR7YV4lGWtx
nngpGWx7XlgkHHBqVVgcGY1mZ3AoHWOKcGYsInlybGUkFXZ4gIYdFpN+gZAeHX1XhXo4IIB9
g2MiGHmCaY8zJYmKZHIcF4mJioIeHWJgUDcjHImOgl8eF4x4cHEjF3ZskYkeGoF5lXwyHphr
enInI3p9hnwrI29Hb1AeGiUaJiEPFR0lHhsNBCglLBYNCisdGykNCyoXJh4QCx8tIBwLBCEr
LBgFCB4mJC8KDiYgJywIDCgmIh8KDjUbLyQMCR0lFCYUDSYtGyAQECAvLzwHDjssJS4TDyVZ
PFEaEUkOQA4nEAYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGo/cTcdDCggJhENBi04Iz0YC0ok
QiQcEBwjHCMGCR4gIR8LBR5GHj4bDVNNTiogF1FiQDsgGEdVUzEcFlFSVUcjD1RVO0McF2Zg
TFkhGFlZRVArHRMcJR0LBkpxNEwlHFJTMzcaEH5uGT8gFm5nWB8kIFtjVFwiEoRwXVUbHHxb
XVQuHmR8ZV4qG2ZbRjkfGndfVEAoHTdvOWkcFTRiGzgaDYF4UU8eHHRvZHcjHGtyXR0lFnln
KUgfEmaBcB4kHnx3MkIYFXxiYDUwJ0FuLSQmHG5wJx4gE3p4KyUmEX56HyEiGnphJiEfG4Bl
WVknGHV+FmIlGHlxaiEmG4podmwiFStNfVcvHnt6RHUpHoJ6XToiG3hzWmwdFW5/cS8lG5+E
XHElGJiCc1QtIIg5ISckHCQYNGoaERwnW3QjFychHyQWBSwxQWwfGSsbKRwPECQjGCcGCR8e
IiMPBCUdIR4FCyoqKiUHCygYIh4PBCkvKiMFDBcWLCEVCyYRHxUFCSInKDAECzMtHSgOCyVI
J0wdFlQOUAweFAYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBG9aZkkbDSEpNhYTBiZBKDseE1s0
SiwZDSYjIR8LCCgbJBkECSdPJUwiE11EU1kgHlJKUFEjFG1jXmUbGGVYRV0ZE2hZRFEnFWBZ
WW0jGVxiNmAiFBEVJicKDTp9N2khD2JSVWAbFmpfmF8jGmlxSGgnGldSbGAlHH1jYlcbEmxq
fGklHmV0clMfF1iHX1UvG3NmXloeF0JvQVYfD25vT1gnHmBsV1ckFYRyepQgIF9GZkYmIGdw
gmMpIW5zSYYrIHNgfWMfG21xZ18oG3RvV1IkHm87dlMvKH1/kW0qJXN9eIMmIXN4amAlHId0
YoUqJH11Z4MnIXx6fWEnHnpnfW8ZEYh5d4AlH3KHgGwjGaGDg20iG6d8doUcG39bdG0gFVZ/
R3kgFX9/Z34uHHdggIEjInKBcG0lIGx9kGU1HXFXW4EYFnKBilUwHUMrOR0VEyAlJhcGChou
IiMYDB0ZIicMCBgpIBkLBCsfHykMBy0mJyENCiYgMSkSCCIhKC8RCiItJjMLDSQpKR0UCCVN
KU0dEVYMSAwfFAYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGJZZFAWCyQjMScNBis0MEAVEEwu
RighGCEWIRoNCBolGikFBydDJEUXE0VESx0jE0hVN0gZDUtJTz8aFEtEVU4dDldMVEIYFExe
UlwkE2pqSUwvFjQdESAOCURWN14pGlJWRD0cGGVMJ0kaFURfV1IdFltNZ1UcE25INl4jHFhU
Z2AoHVZbbV0TD0JaRjsjGmFPX08qHjdbKk8lF2NXMiYbElNSJGMjFGNhYG0gHWJ5YzUlH3Jo
XTklF2FkMBcgHHNJLikXElxVXUUfGGJsZFEtIXxuOy8tF35iLEslHHRlcVUjHWdpGyofEVpj
a14pGitdKXQpG2JdbigoHHFlMkkhEVpkbnYjIE1iHSkkHG9kJSoaF1RiLx4YE3klJB8kFFti
Kx8jFHNXMyIiD1pbLBwiEE5TKiQdEWdUIyobEGdVISYhEmZ0JighEjYbJCQUDTArLCYTByAh
HxgFDiYWHScTBCYkLSEQCxwfJCUPEhwGIiMQCiMqKyQNCyYvIxgNDCU6IzEIBzAdJigQDyhI
KkgiCUMMOwwcFQYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGJSaUUdDDAiHSULCyE2JjAaC1Mv
QiUYEh0YKSEODRMaIicLBSFBOkkeDk9aUl8lHkRJU1MdFVBUWmUgEVVwTFYhGVJeXkwcE29X
XHgbDVZfOFUfFhsYFCgQCj5rSG0mGF9eSlojFVxjc1YlHVZOTF0YFlV6aVgeGm1je04pH0hO
VVUODU9Nf1gZGFt+Z2kiH2NdYmshGWBnUWohGG5jaXMmIXFUZlwmHH9Lbl0iF4NfXnkgF3Zc
Y3kmHDRsUWQpHnJzXZMuJnF4WF4hIXFtUlUmHod2bmodE3RtblgoGGSDU1ghEYJYbGkgGm9r
d3MdFXFrgngtHnJ6bIQlGoB5emgfGmeQd3slHiIpICMVECkWHRwQBiQXMSYJCBoaIh4IByYy
GDEJCBUsJSgQDiAZGiURBB4aIzEPBBoYHSMSBCYvJS8HBC4mEi0RCyUIJCAKDh4mIx0MBCsz
JzYMCx0jKR8SFi8nJxYRDSUmGSAKBBYhISEQBy41FBwOCiEmHSAQBBgrKyYECSwpKyQRDypR
L0wcDkMMOQscEQYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBFpIXkoYDCMuJyATCRsxIDMdE1Uh
Ri4fFhQeIhgICyQpJiAKBC5CJ0UfEFpEPyYkEUhLO0IcGE5KUDgfFlBHQFIdEmNYUEMZDklQ
Rk8fEkFhQmMpFScqKx0TBkBMTVUmGlJGOjgcEGRYIUchElVVTl8dGkdXZlwUDmFSN0khHGNZ
WlUiEFlbXWUZGENWS0QbFVlJY0wkIEFxKhQjE2tSITgmF2lcUlYqHFRXHhMlE11UKikcE1d1
I18hG3JRV1kvIVRxY2gfEVJcHg0iEWhaMCciElJoWoEoIUNCWGUnE2tae5IeGVtkRUMqF11Y
YW0fFVlZNl0jGVhPcGwlHHB3aGodF2JUJSQuHykeIR8PCyANIisJCyctIRUREiAgIhoNBBsl
HBsPChkZHhgODDEvGygOBCchHiALDx8hLC8LBCQmHiUPBBsqHyUQCR0hKRcKBBYmIyAKEBYg
ExkICjA3GRsWBRkXOy4QBSonIh0KBBojHBsJCyUtHyALCx8gEh8QBSAdODIEDhwvKRgUFSZK
JVQfF0ILUAscEQYGBgYIBgYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGNLcUodDBkYLhoNCxsuJSwZEEox
TycYGR0qHSEICCEhGCMLCBw5I0cdEVZUUlwfIENQRUscFk9RWkAaEE5aSEgfF1lXU08ZCVFY
Y1UXFl1aYV4iGRIiHCUSDzhhOmMeEUVQSk4bGFxOelYnE05MQ1weFE+GdlAZFXdqh2gmH2Rn
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
OjYNDTInLiQTEy4dOjoQCicnJiUVESsmJC8MDScvLDQSBTMlLC4QCy0xKTYQBz4uMC4RCjQn
LykHDDEyLC0QBTA7LCYMDTUwOSwQCzw4NkINBTc2OTEKBTw5OycTCzcoOjkJDCYnLR4LBkuR
MlAZBX4Kkn8TEBAGfy4GBggGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYG
BgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBAYGBgYEBGdffFIZDB8pJhgTDig3IzkWCj4x
RjQSFTo+NTEUC0MxMiIYCj4tNycaES8xKzwbCjQ1JjAYCUQ8LC8cCj4xLiwPCjo/MTYOFDc8
KywZDD04KiwcET01NDIQECxFOiIPBD49KjQNDzxFLigXDT8sMSYNDTE8OjoLCzkvOisNCjc2
OTYYCzk9RjwPBTM4LzIQBTo5Ny8OCSktLikRB046MjQMBC4sOjITED4oLSwLDUMoKjMFCiso
PTkLBDcnOiUMCTclNzMQEjQuMTgNCy04LzoUBDc3PzcKCDo7LTcWCjc2ODYFCzM1Oy8MBC8s
Mi0UCjgpMCcZCjU0NSkHDCEgNi8ICi82MjEIBzAyKjQUCjMzKiYLCy0xPCcJBy0jKz4MBStA
ODYUBDM9LSQQBzIxODoTDDAtJSUNEyopIy8RBC81KjQOBDwrKy4NBSo6JzYSCi4tLy4LDjos
LikRDS4xKy0KCTgnKyYMDTwyOSwNCi8vNkILCj8rOTEKCTAtOycTCzcrOjkQDi0rLB4LCDyC
MFAlE4BegH8sD22EgS4dFoFXCQYVCQYGBgYFBQYGBgYEBAYGBgYEBAYGBgYEBP/bAIQAAwIC
AwICAwMDAwQDAwQFCAUFBAQFCgcHBggMCgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcY
FhQYEhQVFAEDBAQFBAUJBQUJFA0LDRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQU
FBQUFBQUFBQUFBQUFBQUFBQU/8AAEQgGEAogAwEiAAIRAQMRAf/EAaIAAAEFAQEBAQEBAAAA
AAAAAAABAgMEBQYHCAkKCxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKB
kaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNk
ZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6AQADAQEBAQEBAQEBAAAAAAAAAQID
BAUGBwgJCgsRAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkj
M1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpz
dHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT
1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/VCiiigAooooAKKKKACi
iigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA8k/aUz/AMIOfp/7
Uir5uQYtoMcZjGfyr6R/aVQv4HODjAJ/8iRV81wBprJM8FUA+oxWUXuJkN0AASe1UJCT7Cr0
vAwR0rPmOHNFl1I0SsxsjhV9/WqknzEseasMdwO4VAU6+lXfuOyaGkcccVBtBU56DvUsjmLk
DP0qIszKQB+NV0JsmV3bCkHpWbc/f5HzVqMMjGcGsq4chyoBI9adkndCJdPKF9pBxzXbaeyC
DPI681xWnKFuMkjODXZwoPs2AQVz1zXZDVWImlYzdR1AbSCDwaxnlJbODVvUFHmnnJ6frVEn
PPYVyuxUbIVm2c4xmkBz1oflcdfU0eWMZNZO8TWUrK42STa3APFNVt7BiD6CnKvlHGc570Fh
npn3p3T0Y1tcHJBAJ4prggghqVsAH1phHyk4zx1pr3SW5bgeCTnNNcAEEdabv4AHeplTYOaT
RfqMZvQ4PvSou+PBPI5psg2tk9DUpVQB7U2trBokQ7SDknv6VJBGRk9/eo3kKEn7y+1SwFWX
exz6GqWrsyPeNzR7NiNzc9a290cDbpBn2ziq+gyKqfNgqc8A1HrkbGYGMFlGO3sa9CNmkkYy
1diW6sEnjZl4/WuOuIzBIeDgccivQLaLEIGPvDk1xeskecyDrnOPxNY1kmVDV2Mxh6nINOGW
6Hb9aaULdB/9al8sEZbmuS62Nb9CeBC84QDHPX0rpNM05I8PJz9M+lZ2iQq83Tkt1rorqL7P
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
25na5IRu6cVGSVXODmnKSBnGadIp2DGOlNNDvyiqS67iCKaB8xyODQshbj7opd3ynHOOlZrR
6sauOUAClLAcd/Woi5BAwSe9SKynORz71bduoloKWIxtIFPjZRnIycdaaEDDPamscZA7d6Ud
geg8yZA/UUu7eue/pTAN/TilOVwAee5o0uNaAF2L15z1qTq3TGeKi8zHBU81KHODx+NV7quG
+rEkiwRj5aG9+foaeWJG5ulJna2cZGKWyJd2MMmenFPzkdDimBM5GRmpGO1fb0oTezG9RXBi
YE/MD2zRwzFhjjoTQrF1+YZx3NI+AOBtFDuxRVhHAZuBgjjNShfkGRyOabuGzO0AinxyfL8y
596lpD1bGScjofrWVqGN20+tbLgMpOCOvNY18AJMlgT704voJ3RY0dcSe3/166e3x5fOPbmu
b0pto4GSfQe9dJCpMKn1HYVUVyrUykUb+PI5INZwyWx0FaN++3HaqDqQM9z2oehcW1oPXI5+
9UgYtycjNRZwowcGpEf5sE59sVHxaGt+5YULHgmrKFd2cc1UBPRhk+1WlXaOh+pFJ/yikluW
UAIGOKuXG/7KAgLMW6D6VRiIBx7VrQqRGjZBOeAfpWFVpRFHVn2t8If+RGtMnPCf+i0rta4v
4RgDwTb4GPu/+i0rtKjB/wAN+ppU3Ciiiu4yCiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigDkviy/l/DTxE2M4tWOPyr43sEb7PM79ZJCRjsOK+x/i2cfD
LxIf+nR/6V8dWFx5lixxgKxGD9BXPTesv67A72IJl5bmq0hHPPSrk7qVb/GqckakEk8eldC1
1ZHqV3lBO3r71BK3BqVss20D5V71FMRnA5pco35EOCVPOKYVwpyexqUcZJNQuNx5H41ei2J9
Su7bxnvVG4OBuzuI9K0XG4YHArOu4wmSpyPSobdtxaNFWAB5N+M4HSu70GwSS0DcDk55NcVa
wkPuyAa7rQfltyccnI/UV3UTOeiG6ssMEbDGT7H3rlrli56fjWv4gJ3Y6ZPU9utYbZVSOoJ7
Vz1X72oqa0Glse2KeZFZh247molJIbIxSgqjHt9aysbpdyDflycdOnvSk57Y+tOZ/wB4BnBp
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
h1bHGKUcrggfShpCjMMZDdKPMUIQRjjriou0EtShexqCS3AHpTNOBe4GOEB4PrS3bK5YZJHr
T9OcJOiKAeRjI6Vor7ENXR1tohEKZ9AabfH939KksyBFlu4puolRED/npV6uOpKumZDsOcc+
1OQ5b2NRM2Dkc+tOWXP3OlYNaGlr3J3JHQcU9CDgc5zUa4YEA8il8tgMg8VkkrkqJYAw2RjN
TwMF6dfWo4mznAHTvU6LluDirfvFLTQ2dOiMpBUksPU8V9j/AAEAEXHP+j/0jr490lAZUQnG
QcgfSvsP9n/I0/a2CRDwfbEdedX+NGl2kev0UdqK9YxCiiigAooooAKKKKACiiigAooooAKK
KKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAB94V8ffHAn/habjqNkn/oyWvsEfeFfHfx0
JHxaVegMcv8A6MlrJL958iZbHD3W7DZB796zXIjyx5PvWldNlmA6Anms+4XvXVpsZW7FWQ7y
W9arSOTkDoKnkAz1xUTsBwefei6vdFXsitIrjkmopsnrwasO2fl4qq5+UEsQCab11JB8dMDA
qjOSDtUVYIDPwTjHWq7vhTzUczY7W1M1wxk54rS0mzMzj05qluG7rxitzw4/+mBMdif0rppW
k9RO7R00PhwPEuRjgcgCub1O1jjLELgg9sV6BqEhj0kSYAwVA968y1Odi7EnJz0/E1dZqKSR
gndmcqbWYkU0kYGPxxQrZPPJNMOUbjn61za7o7WxVBXJ7d6WRlZcDg03cTnPBHHHek+93+Yd
BUtybsyGLnapI64pnnLsIxyaeSSOail6hQB9av1E3qNJJU460i9fmp5yi89MUwYYcCp1LT1u
K4+YY4psTFwckgYppXnrzT0x7E+lTz3uglrqK5ULgD8aYBtHByKU8NUbY3YWiOr0F0JoI/Ol
Arq9G8OG4XJ569cViaDGZJvmHTIr1TTYU/snzAACrEZx716NGmmrswqNqOhz0/hUIgLjaP8A
gNc74l8PCwszKmT09B1NdPZ3sj3siHkBm6mtzxdYJ/YMb4AOU5wK3lTUlqYuTVjxNAwU7vvd
hUYJyflz+NWJw4kYke4qNW+X5vzrync7lK+o05w2Bn39Kv6dpzXTIMnnHNV7OL5/9knOa73w
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
FWT3AEnBHUdTUnm5GMfWoUiIfB6CpSu3g96E3bQh2WzGswHqBT0TI4Oc1HgjJPTtTlXd3xUu
L6jXmSkAMe5pihVHPWlZSu0k96dIwJz3p27BoIAG6DpSjlcj1xSpIBHnGBTi4X5T+dD21B6F
dCz5DHrUoIA5B+lGAhLdjxSpnfnd+FObuh3uAUE7gMDHenzMH5XjHFK8nc8Clc9AowKlFJrq
NRlUZ25Ip+5WGcHIpHIQcmmGVlwcZ9aa7Ep66ErOMgdcU0sX4UUN90kDk80sZ2c55qrqJfQA
u7I6EU/ywqH6c0/aGTPc03J+7moV29TLW4wycAdfp2peTjI/GkEQ8w5qX7yhRxjvQ+ZMbeg3
zgWwB+IpA7BwO2acI1hOR1xQo465p63uTGVxZOO/SkicFNvenSEYA6mm8Rrg9RzkVSV7midy
cYJAKHPqaCuUHYU0Tb+T0oa4JPAJ4qSHuNdiqY9O9KYi2GJyKj2gHOcGplk3celVKPYcm9LE
vUjA6UnXG403zCg+U4HvTkGDkijW249uhIeXD9AvFMlwpJz94ZppLI5BP3s9qCeCM/jUuy2J
9DNucmTgd+au6ZH865xjIqrI7CQ8HGTziremIZLhW7A1d7K4m+50iOqqvOcgdO1QXj8cnAqd
I1IUjtVW9OcjOAD6Ver1DQplw6E+gpY8S4GDxyaiTKMVJ4x1p6lskjj1z3rKUXYtE68cDqKk
juFJVGUgg96g2swypxU0YLKWYc1CbT1FaxaUsvTpVyP56oRsRwDkeoq5AxcDHDVSXWTA6nwx
GW1S3Unau08++019w/CNt2i8AgDjP/AUr4e8NAyahbxsNoO4kn/dNfcfwib/AIkAQHjOf/HE
rzW7TLex3XaijtRXqGQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUA
FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRR
RQAUUUUAFFFFAAOtfHX7QuH+K1sD2ikPP/XST/CvsUda+Pf2klD/ABSsccMIH/H95JS6oTPO
riQguBgdaoSEkHNX5wMY+tZszYyDzg1srbEbEMjcHjNQqck8YqVskN2GOlV2OP8ACk7sm42e
PcvPFVuMkdBVpmJAz0NVZSqP0Y0JuzuPVoZ5yhSpFVZiFBwRipvMyOep6mqk42nmpirjWhTH
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
--------------010303010409000005060507
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

--------------010303010409000005060507--


From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:22:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:22:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCw8m-0004Kq-Lf; Sun, 09 Oct 2011 09:22:16 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBsPh-0004H1-9e
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:11:24 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1317924677!34255391!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31998 invoked from network); 6 Oct 2011 18:11:17 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-14.tower-174.messagelabs.com with SMTP;
	6 Oct 2011 18:11:17 -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 p96IAuNB004237
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 6 Oct 2011 14:10:57 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p96IAtKE002745; Thu, 6 Oct 2011 14:10:56 -0400
Date: Thu, 6 Oct 2011 14:10:55 -0400
From: Jason Baron <jbaron@redhat.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111006181055.GA2505@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8DEB19.1050509@goop.org>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:06 -0700
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 06, 2011 at 10:53:29AM -0700, Jeremy Fitzhardinge wrote:
> On 10/05/2011 05:17 PM, H. Peter Anvin wrote:
> > On 10/05/2011 05:16 PM, Jeremy Fitzhardinge wrote:
> >> On 10/04/2011 09:30 AM, H. Peter Anvin wrote:
> >>> On 10/04/2011 07:10 AM, Jason Baron wrote:
> >>>> 1) The jmp +0, is a 'safe' no-op that I know is going to initially
> >>>> boot for all x86. I'm not sure if there is a 5-byte nop that works on
> >>>> all x86 variants - but by using jmp +0, we make it much easier to debug
> >>>> cases where we may be using broken no-ops.
> >>>>
> >>> There are *plenty*.  jmp+0 is about as pessimal as you can get.
> >> As an aside, do you know if a 2-byte unconditional jmp is any more
> >> efficient than 5-byte, aside from just being a smaller instruction and
> >> taking less icache?
> >>
> > I don't know for sure, no.  I probably depends on the CPU.
> 
> Looks like jmp2 is about 5% faster than jmp5 on Sandybridge with this
> benchmark.
> 
> But insignificant difference on Nehalem.
> 
>     J

It would be cool if we could make the total width 2-bytes, when
possible.  It might be possible by making the initial 'JUMP_LABEL_INITIAL_NOP'
as a 'jmp' to the 'l_yes' label. And then patching that with a no-op at boot
time or link time - letting the compiler pick the width. In that way we could
get the optimal width...

thanks,

-Jason


> #include <stdio.h>
> 
> struct {
> 	unsigned char flag;
> 	unsigned char val;
> } l;
> 
> #define JMP2	asm volatile ("jmp 1f; .byte 0x0f,0x1f,0x00; 1: ");
> #define JMPJMP2	JMP2 JMP2
> #define JMPJMPJMP2	JMPJMP2 JMPJMP2
> #define JMPJMPJMP2	JMPJMP2 JMPJMP2
> #define JMPJMPJMPJMP2	JMPJMPJMP2 JMPJMPJMP2
> #define JMPJMPJMPJMPJMP2	JMPJMPJMPJMP2 JMPJMPJMPJMP2
> #define JMPJMPJMPJMPJMPJMP2	JMPJMPJMPJMPJMP2 JMPJMPJMPJMPJMP2
> 
> int main(int argc, char **argv)
> {
> 	int i;
> 
> 	for (i = 0; i < 100000000; i++) {
> 		JMPJMPJMPJMPJMPJMP2;
> 		asm volatile("" : : : "memory");
> 	}
> 
> 	return 0;
> }

> #include <stdio.h>
> 
> struct {
> 	unsigned char flag;
> 	unsigned char val;
> } l;
> 
> #define JMP5	asm volatile (".byte 0xe9; .long 0");
> #define JMPJMP5	JMP5 JMP5
> #define JMPJMPJMP5	JMPJMP5 JMPJMP5
> #define JMPJMPJMP5	JMPJMP5 JMPJMP5
> #define JMPJMPJMPJMP5	JMPJMPJMP5 JMPJMPJMP5
> #define JMPJMPJMPJMPJMP5	JMPJMPJMPJMP5 JMPJMPJMPJMP5
> #define JMPJMPJMPJMPJMPJMP5	JMPJMPJMPJMPJMP5 JMPJMPJMPJMPJMP5
> 
> int main(int argc, char **argv)
> {
> 	int i;
> 
> 	for (i = 0; i < 100000000; i++) {
> 		JMPJMPJMPJMPJMPJMP5;
> 		asm volatile("" : : : "memory");
> 	}
> 
> 	return 0;
> }


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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:23:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:23:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCwA5-0004iT-RH; Sun, 09 Oct 2011 09:23:37 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBslF-0001NL-Ji
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:33:37 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1317926013!30268!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3965 invoked from network); 6 Oct 2011 18:33:34 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-6.tower-216.messagelabs.com with SMTP;
	6 Oct 2011 18:33:34 -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 p96IXKii013144
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 6 Oct 2011 14:33:20 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p96IXJ8N012667; Thu, 6 Oct 2011 14:33:19 -0400
Date: Thu, 6 Oct 2011 14:33:19 -0400
From: Jason Baron <jbaron@redhat.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111006183319.GB2505@redhat.com>
References: <477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<4E8DF02B.7010406@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8DF02B.7010406@goop.org>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:06 -0700
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 06, 2011 at 11:15:07AM -0700, Jeremy Fitzhardinge wrote:
> On 10/06/2011 11:10 AM, Jason Baron wrote:
> > On Thu, Oct 06, 2011 at 10:53:29AM -0700, Jeremy Fitzhardinge wrote:
> >> On 10/05/2011 05:17 PM, H. Peter Anvin wrote:
> >>> On 10/05/2011 05:16 PM, Jeremy Fitzhardinge wrote:
> >>>> On 10/04/2011 09:30 AM, H. Peter Anvin wrote:
> >>>>> On 10/04/2011 07:10 AM, Jason Baron wrote:
> >>>>>> 1) The jmp +0, is a 'safe' no-op that I know is going to initially
> >>>>>> boot for all x86. I'm not sure if there is a 5-byte nop that works on
> >>>>>> all x86 variants - but by using jmp +0, we make it much easier to debug
> >>>>>> cases where we may be using broken no-ops.
> >>>>>>
> >>>>> There are *plenty*.  jmp+0 is about as pessimal as you can get.
> >>>> As an aside, do you know if a 2-byte unconditional jmp is any more
> >>>> efficient than 5-byte, aside from just being a smaller instruction and
> >>>> taking less icache?
> >>>>
> >>> I don't know for sure, no.  I probably depends on the CPU.
> >> Looks like jmp2 is about 5% faster than jmp5 on Sandybridge with this
> >> benchmark.
> >>
> >> But insignificant difference on Nehalem.
> >>
> >>     J
> > It would be cool if we could make the total width 2-bytes, when
> > possible.  It might be possible by making the initial 'JUMP_LABEL_INITIAL_NOP'
> > as a 'jmp' to the 'l_yes' label. And then patching that with a no-op at boot
> > time or link time - letting the compiler pick the width. In that way we could
> > get the optimal width...
> 
> I'll have a look at it later today if I get a moment.  Should be fairly
> straightforward.
> 

cool. It does add some complication, I think...detecting the 2-byte vs.
5-byte, and if done at boot time, possibly taking the undesired
branch...

> What about the rest of the series.  Do you think it looks cooked enough
> for next mergewindow?
> 
>     J

Yes, it looks good to me thanks! Feel free to add my ack to the series.

thanks,

-Jason

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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:24:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:24:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCwAx-00055R-Lb; Sun, 09 Oct 2011 09:24:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBsqW-0001s2-Vc
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:39:05 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1317926341!21254076!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25877 invoked from network); 6 Oct 2011 18:39:01 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-10.tower-182.messagelabs.com with SMTP;
	6 Oct 2011 18:39:01 -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 p96IcgKq022264
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 6 Oct 2011 14:38:42 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p96IcfIM014488; Thu, 6 Oct 2011 14:38:41 -0400
Date: Thu, 6 Oct 2011 14:38:41 -0400
From: Jason Baron <jbaron@redhat.com>
To: "H. Peter Anvin" <hpa@zytor.com>
Message-ID: <20111006183841.GC2505@redhat.com>
References: <20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF385.3070009@zytor.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8DF385.3070009@zytor.com>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:07 -0700
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 06, 2011 at 11:29:25AM -0700, H. Peter Anvin wrote:
> On 10/06/2011 11:26 AM, Steven Rostedt wrote:
> > On Thu, 2011-10-06 at 14:10 -0400, Jason Baron wrote:
> > 
> >>> Looks like jmp2 is about 5% faster than jmp5 on Sandybridge with this
> >>> benchmark.
> >>>
> >>> But insignificant difference on Nehalem.
> >>>
> >>>     J
> >>
> >> It would be cool if we could make the total width 2-bytes, when
> >> possible.  It might be possible by making the initial 'JUMP_LABEL_INITIAL_NOP'
> >> as a 'jmp' to the 'l_yes' label. And then patching that with a no-op at boot
> >> time or link time - letting the compiler pick the width. In that way we could
> >> get the optimal width...
> > 
> > Why not just do it?
> > 
> > jump_label is encapsulated in arch_static_branch() which on x86 looks
> > like:
> > 
> > static __always_inline bool arch_static_branch(struct jump_label_key *key)
> > {
> > 	asm goto("1:"
> > 		JUMP_LABEL_INITIAL_NOP
> > 		".pushsection __jump_table,  \"aw\" \n\t"
> > 		_ASM_ALIGN "\n\t"
> > 		_ASM_PTR "1b, %l[l_yes], %c0 \n\t"
> > 		".popsection \n\t"
> > 		: :  "i" (key) : : l_yes);
> > 	return false;
> > l_yes:
> > 	return true;
> > }
> > 
> > 
> > That jmp to l_yes should easily be a two byte jump.

remember the compiler is moving the l_yes out of line, so its not
necessarily always a two byte jump. Also, I plan to look at a possible
'cold' label for the 'l_yes' branch, so that it can moved to a separate
'cold' section, but we might only want that for some cases...

> > 
> > If not I'm sure it would be easy to catch it before modifying the code.
> > And then complain real loudly about it.
> > 
> 
> The important thing is that it requires the build-time elimination of
> jumps.  It's just work.
> 
> 	-hpa
> 

Right, its certainly doable, but I'm not sure its so simple, since we'll
need a pass to eliminate the jumps - which can be keyed off the
'__jump_table' section. 

thanks,

-Jason

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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:25:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09: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 1RCwBq-0005T2-B9; Sun, 09 Oct 2011 09:25:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBsvf-00037A-BG
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:44:23 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1317926659!30858!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6308 invoked from network); 6 Oct 2011 18:44:20 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-7.tower-216.messagelabs.com with SMTP;
	6 Oct 2011 18:44:20 -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 p96IhpBQ008182
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 6 Oct 2011 14:43:51 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p96IhopU010630; Thu, 6 Oct 2011 14:43:51 -0400
Date: Thu, 6 Oct 2011 14:43:50 -0400
From: Jason Baron <jbaron@redhat.com>
To: "H. Peter Anvin" <hpa@zytor.com>
Message-ID: <20111006184350.GD2505@redhat.com>
References: <4E89E28C.7010700@goop.org> <20111004141011.GA2520@redhat.com>
	<4E8B3489.60902@zytor.com> <4E8CF348.4080405@goop.org>
	<4E8CF385.2080804@zytor.com> <4E8DEB19.1050509@goop.org>
	<20111006181055.GA2505@redhat.com> <4E8DF02B.7010406@goop.org>
	<20111006183319.GB2505@redhat.com> <4E8DF505.6050807@zytor.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8DF505.6050807@zytor.com>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:07 -0700
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, peterz@infradead.org,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 06, 2011 at 11:35:49AM -0700, H. Peter Anvin wrote:
> On 10/06/2011 11:33 AM, Jason Baron wrote:
> > 
> > cool. It does add some complication, I think...detecting the 2-byte vs.
> > 5-byte, and if done at boot time, possibly taking the undesired
> > branch...
> > 
> 
> It has to be done at build time to be sane, IMO.
> 
> 	-hpa
> 

agreed.

-Jason

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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:26:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:26:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCwCh-0005q0-CA; Sun, 09 Oct 2011 09:26:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBt1p-0003zc-L4
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 11:50:46 -0700
X-Env-Sender: rth@redhat.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1317927041!34271015!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17826 invoked from network); 6 Oct 2011 18:50:42 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-2.tower-174.messagelabs.com with SMTP;
	6 Oct 2011 18:50:42 -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 p96IoQkg011144
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 6 Oct 2011 14:50:26 -0400
Received: from anchor.twiddle.net (vpn-236-148.phx2.redhat.com [10.3.236.148])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with
	ESMTP id p96IoO7j027526; Thu, 6 Oct 2011 14:50:24 -0400
Message-ID: <4E8DF870.6010000@redhat.com>
Date: Thu, 06 Oct 2011 11:50:24 -0700
From: Richard Henderson <rth@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Steven Rostedt <rostedt@goodmis.org>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111003150205.GB2462@redhat.com> <4E89E28C.7010700@goop.org>
	<20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
In-Reply-To: <1317925615.4729.14.camel@gandalf.stny.rr.com>
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
X-Mailman-Approved-At: Sun, 09 Oct 2011 08:59:59 -0700
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jason Baron <jbaron@redhat.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/06/2011 11:26 AM, Steven Rostedt wrote:
> On Thu, 2011-10-06 at 14:10 -0400, Jason Baron wrote:
> 
>>> Looks like jmp2 is about 5% faster than jmp5 on Sandybridge with this
>>> benchmark.
>>>
>>> But insignificant difference on Nehalem.
>>>
>>>     J
>>
>> It would be cool if we could make the total width 2-bytes, when
>> possible.  It might be possible by making the initial 'JUMP_LABEL_INITIAL_NOP'
>> as a 'jmp' to the 'l_yes' label. And then patching that with a no-op at boot
>> time or link time - letting the compiler pick the width. In that way we could
>> get the optimal width...
> 
> Why not just do it?
> 
> jump_label is encapsulated in arch_static_branch() which on x86 looks
> like:
> 
> static __always_inline bool arch_static_branch(struct jump_label_key *key)
> {
> 	asm goto("1:"
> 		JUMP_LABEL_INITIAL_NOP
> 		".pushsection __jump_table,  \"aw\" \n\t"
> 		_ASM_ALIGN "\n\t"
> 		_ASM_PTR "1b, %l[l_yes], %c0 \n\t"
> 		".popsection \n\t"
> 		: :  "i" (key) : : l_yes);
> 	return false;
> l_yes:
> 	return true;
> }
> 
> 
> That jmp to l_yes should easily be a two byte jump.

Until the compiler decides to re-order the code.  That's the problem --
in the general case you do not know how far away the destination is really
going to be.

There are a couple of possibilities for improvement:

(1) Do as Jason suggests above and let the assembler figure out the size
of the branch that is needed.  Without adding more data to __jump_table,
you'll want to be extremely careful about checking the two pointers to 
see what size branch has been installed.

(2) Always reserve 5 bytes of space, but if the distance is small enough
patch in a 2-byte jump.  That doesn't help with the icache footprint.

(3) There is no 3.  I was going to say something clever about gas .ifne
conditionals, but a quick test revealed they don't work for forward
declarations.



r~


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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:27:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09: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 1RCwDW-0006Cv-82; Sun, 09 Oct 2011 09:27:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RBue7-0007jV-Lx
	for xen-devel@lists.xensource.com; Thu, 06 Oct 2011 13:34:27 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1317933259!37426!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4669 invoked from network); 6 Oct 2011 20:34:20 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-14.tower-216.messagelabs.com with SMTP;
	6 Oct 2011 20:34:20 -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 p96KY3xc029816
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 6 Oct 2011 16:34:03 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p96KXxnc014445; Thu, 6 Oct 2011 16:33:59 -0400
Date: Thu, 6 Oct 2011 16:33:58 -0400
From: Jason Baron <jbaron@redhat.com>
To: Steven Rostedt <rostedt@goodmis.org>
Message-ID: <20111006203358.GA5985@redhat.com>
References: <20111004141011.GA2520@redhat.com> <4E8B3489.60902@zytor.com>
	<4E8CF348.4080405@goop.org> <4E8CF385.2080804@zytor.com>
	<4E8DEB19.1050509@goop.org> <20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF385.3070009@zytor.com> <20111006183841.GC2505@redhat.com>
	<1317929656.4729.22.camel@gandalf.stny.rr.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1317929656.4729.22.camel@gandalf.stny.rr.com>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:07 -0700
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	rth@redhat.com, Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 06, 2011 at 03:34:13PM -0400, Steven Rostedt wrote:
> On Thu, 2011-10-06 at 14:38 -0400, Jason Baron wrote:
> 
> > Right, its certainly doable, but I'm not sure its so simple, since we'll
> > need a pass to eliminate the jumps - which can be keyed off the
> > '__jump_table' section. 
> 
> Look at the code of scripts/recordmcount.c and friends.
> 
> It does two things.
> 
> 1) find all the callers of mcount and make a section for it.
> 
> 2) For those callers of mcount that is in sections that are not
> whitelisted, and therefor will not be patched, to replace the call to
> mcount with a nop.
> 
> 
> We can use this code, or a copy of it, to do the same with jump_label.
> Have the x86 jump_label be:
> 
> 
> static __always_inline bool arch_static_branch(struct jump_label_key
> *key)
> {
> 	asm goto("1:"
> 		"jmp l_yes\n"
> 		".pushsection __jump_table,  \"aw\" \n\t"
> 		_ASM_ALIGN "\n\t"
> 		_ASM_PTR "1b, %l[l_yes], %c0 \n\t"
> 		".popsection \n\t"
> 		: :  "i" (key) : : l_yes);
> 	return false;
> l_yes:
> 	return true;
> }
> 
> Then have the record_jumplabel.c (or whatever it's called) find all the
> jmps at run time, and convert them into the appropriate nop.
> 

I'd prefer to do this at build-time as hpa said. We don't want there to
be some race b/w patching in the no-ops and taking an incorrect branch.

> Then at runtime patching, the jumplabel code could figure out what size
> jump it needs to replace it.
> 
> -- Steve
> 
> 

sounds like a good plan. thanks for the pointers!

-Jason

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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:28:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:28:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCwEK-0006ZY-Gi; Sun, 09 Oct 2011 09:28:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RBwyp-0000ch-Hf
	for Xen-devel@lists.xensource.com; Thu, 06 Oct 2011 16:03:58 -0700
X-Env-Sender: lbassel@codeaurora.org
X-Msg-Ref: server-8.tower-27.messagelabs.com!1317942212!47156244!1
X-Originating-IP: [199.106.114.251]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14467 invoked from network); 6 Oct 2011 23:03:33 -0000
Received: from wolverine02.qualcomm.com (HELO wolverine02.qualcomm.com)
	(199.106.114.251)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 6 Oct 2011 23:03:33 -0000
X-IronPort-AV: E=McAfee;i="5400,1158,6491"; a="125315183"
Received: from pdmz-ns-mip.qualcomm.com (HELO mostmsg01.qualcomm.com)
	([199.106.114.10])
	by wolverine02.qualcomm.com with ESMTP/TLS/ADH-AES256-SHA;
	06 Oct 2011 16:03:49 -0700
Received: from labbmf-linux.qualcomm.com (pdmz-snip-v218.qualcomm.com
	[192.168.218.1])
	by mostmsg01.qualcomm.com (Postfix) with ESMTPA id D493910004DE;
	Thu,  6 Oct 2011 16:03:49 -0700 (PDT)
Date: Thu, 6 Oct 2011 16:03:48 -0700
From: Larry Bassel <lbassel@codeaurora.org>
To: Dan Magenheimer <dan.magenheimer@oracle.com>
Subject: Re: [Xen-devel] Re: RFC -- new zone type
Message-ID: <20111006230348.GF7007@labbmf-linux.qualcomm.com>
References: <20110928180909.GA7007@labbmf-linux.qualcomm.comCAOFJiu1_HaboUMqtjowA2xKNmGviDE55GUV4OD1vN2hXUf4-kQ@mail.gmail.com>
	<c2d9add1-0095-4319-8936-db1b156559bf@default20111005165643.GE7007@labbmf-linux.qualcomm.com>
	<cc1256f9-4808-4d74-a321-6a3ec129cc05@default>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <cc1256f9-4808-4d74-a321-6a3ec129cc05@default>
User-Agent: Mutt/1.5.20 (2009-06-14)
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:00 -0700
Cc: linux-mm@kvack.org, Xen-devel@lists.xensource.com,
	Larry Bassel <lbassel@codeaurora.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

Thanks for your answers to my questions. I have one more:

Will there be any problem if the memory I want to be
transcendent is highmem (i.e. doesn't have any permanent
virtual<->physical mapping)?

Thanks.

Larry

-- 
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 Sun Oct 09 09:28:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:28:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCwF9-00071n-MD; Sun, 09 Oct 2011 09:28:51 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCCt7-0004tj-7q
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 09:03:08 -0700
X-Env-Sender: sjenning@linux.vnet.ibm.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318003266!39374626!1
X-Originating-IP: [32.97.110.152]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28070 invoked from network); 7 Oct 2011 16:01:08 -0000
Received: from e34.co.us.ibm.com (HELO e34.co.us.ibm.com) (32.97.110.152)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2011 16:01:08 -0000
Received: from /spool/local
	by e34.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only!
	Violators will be prosecuted
	for <xen-devel@lists.xensource.com> from <sjenning@linux.vnet.ibm.com>; 
	Fri, 7 Oct 2011 10:02:39 -0600
Received: from d03relay01.boulder.ibm.com ([9.17.195.226])
	by e34.co.us.ibm.com ([192.168.1.134]) with IBM ESMTP SMTP Gateway:
	Authorized Use Only! Violators will be prosecuted; 
	Fri, 7 Oct 2011 10:02:37 -0600
Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167])
	by d03relay01.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p97G1ETU081796
	for <Xen-devel@lists.xensource.com>; Fri, 7 Oct 2011 10:01:15 -0600
Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1])
	by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP
	id p97G1A8A014885
	for <Xen-devel@lists.xensource.com>; Fri, 7 Oct 2011 10:01:10 -0600
Received: from [9.76.27.67] (sig-9-76-27-67.mts.ibm.com [9.76.27.67])
	by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p97G19XE014744; Fri, 7 Oct 2011 10:01:09 -0600
Message-ID: <4E8F2242.3030406@linux.vnet.ibm.com>
Date: Fri, 07 Oct 2011 11:01:06 -0500
From: Seth Jennings <sjenning@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110922 Thunderbird/3.1.15
MIME-Version: 1.0
To: Dan Magenheimer <dan.magenheimer@oracle.com>
Subject: Re: [Xen-devel] Re: RFC -- new zone type
References: <20110928180909.GA7007@labbmf-linux.qualcomm.comCAOFJiu1_HaboUMqtjowA2xKNmGviDE55GUV4OD1vN2hXUf4-kQ@mail.gmail.com>
	<c2d9add1-0095-4319-8936-db1b156559bf@default20111005165643.GE7007@labbmf-linux.qualcomm.com>
	<cc1256f9-4808-4d74-a321-6a3ec129cc05@default
	20111006230348.GF7007@labbmf-linux.qualcomm.com>
	<4d0a5da4-00de-40dd-8d75-8ed6e3d0831c@default>
In-Reply-To: <4d0a5da4-00de-40dd-8d75-8ed6e3d0831c@default>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
x-cbid: 11100716-1780-0000-0000-0000001AE3A8
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:02 -0700
Cc: linux-mm@kvack.org, Xen-devel@lists.xensource.com,
	Larry Bassel <lbassel@codeaurora.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/07/2011 10:23 AM, Dan Magenheimer wrote:
>> From: Larry Bassel [mailto:lbassel@codeaurora.org]
>> Sent: Thursday, October 06, 2011 5:04 PM
>> To: Dan Magenheimer
>> Cc: Larry Bassel; linux-mm@kvack.org; Xen-devel@lists.xensource.com
>> Subject: Re: [Xen-devel] Re: RFC -- new zone type
>>
>> Thanks for your answers to my questions. I have one more:
>>
>> Will there be any problem if the memory I want to be
>> transcendent is highmem (i.e. doesn't have any permanent
>> virtual<->physical mapping)?

I guess I need to make the distinction between tmem, the transcendent
memory layer, and zcache, a tmem backend that does the compression
and storage work.  Tmem is highmem agnostic.  It's just passing the
page information through to the backend, zcache.

Zcache can store data stored in highmem pages (after the patch that Dan
referred to), but can't use highmem pages in it's own storage pools.  Both
zbud (storage for compressed ephemeral pages) and xvmalloc (storage for
compressed persistent pages) don't set __GFP_HIGHMEM in their page
allocation calls because they return the virtual address of the page to
zcache.  Since highmem pages have no virtual address expect for the short
time they are mapped, this prevents highmem pages from being used by zbud
and xvmalloc.

I did write a patch a while back that allows xvmalloc to use highmem
pages in it's storage pool.  Although, from looking at the history of this
conversation, you'd be writing a different backend for tmem and not using
zcache anyway.

Currently the tmem code is in the zcache driver.  However, if there are
going to be other backends designed for it, we may need to move it into its
own module so it can be shared.

--
Seth


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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:30:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:30:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCwGL-0007Pd-Rh; Sun, 09 Oct 2011 09:30:05 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCE5h-0001kh-Um
	for Xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:20:10 -0700
X-Env-Sender: lbassel@codeaurora.org
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318008015!54609719!1
X-Originating-IP: [199.106.114.254]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5204 invoked from network); 7 Oct 2011 17:20:17 -0000
Received: from wolverine01.qualcomm.com (HELO wolverine01.qualcomm.com)
	(199.106.114.254)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 7 Oct 2011 17:20:17 -0000
X-IronPort-AV: E=McAfee;i="5400,1158,6492"; a="125715817"
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;
	07 Oct 2011 10:20:00 -0700
Received: from labbmf-linux.qualcomm.com (pdmz-snip-v218.qualcomm.com
	[192.168.218.1])
	by mostmsg01.qualcomm.com (Postfix) with ESMTPA id 20A1510004C2;
	Fri,  7 Oct 2011 10:20:00 -0700 (PDT)
Date: Fri, 7 Oct 2011 10:19:58 -0700
From: Larry Bassel <lbassel@codeaurora.org>
To: Seth Jennings <sjenning@linux.vnet.ibm.com>
Subject: Re: [Xen-devel] Re: RFC -- new zone type
Message-ID: <20111007171958.GG7007@labbmf-linux.qualcomm.com>
References: <20110928180909.GA7007@labbmf-linux.qualcomm.comCAOFJiu1_HaboUMqtjowA2xKNmGviDE55GUV4OD1vN2hXUf4-kQ@mail.gmail.com>
	<c2d9add1-0095-4319-8936-db1b156559bf@default20111005165643.GE7007@labbmf-linux.qualcomm.com>
	<cc1256f9-4808-4d74-a321-6a3ec129cc05@default20111006230348.GF7007@labbmf-linux.qualcomm.com>
	<4d0a5da4-00de-40dd-8d75-8ed6e3d0831c@default>
	<4E8F2242.3030406@linux.vnet.ibm.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8F2242.3030406@linux.vnet.ibm.com>
User-Agent: Mutt/1.5.20 (2009-06-14)
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:00 -0700
Cc: linux-mm@kvack.org, Dan Magenheimer <dan.magenheimer@oracle.com>,
	Larry Bassel <lbassel@codeaurora.org>, 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 Oct 11 11:01, Seth Jennings wrote:
> On 10/07/2011 10:23 AM, Dan Magenheimer wrote:
> >> From: Larry Bassel [mailto:lbassel@codeaurora.org]
> >> Sent: Thursday, October 06, 2011 5:04 PM
> >> To: Dan Magenheimer
> >> Cc: Larry Bassel; linux-mm@kvack.org; Xen-devel@lists.xensource.com
> >> Subject: Re: [Xen-devel] Re: RFC -- new zone type
> >>
> >> Thanks for your answers to my questions. I have one more:
> >>
> >> Will there be any problem if the memory I want to be
> >> transcendent is highmem (i.e. doesn't have any permanent
> >> virtual<->physical mapping)?
> 
> I guess I need to make the distinction between tmem, the transcendent
> memory layer, and zcache, a tmem backend that does the compression
> and storage work.  Tmem is highmem agnostic.  It's just passing the
> page information through to the backend, zcache.

I'm sorry if my question was ambiguous -- I want to use the
"cleancache" concept to allow us to have a large (> 100M) piece
of contiguous physical memory which can either be used as
such or otherwise used as a cleancache for discardable pages.
It is this memory that I'm asking if it can be highmem.
> 
> Zcache can store data stored in highmem pages (after the patch that Dan
> referred to), but can't use highmem pages in it's own storage pools.  Both
> zbud (storage for compressed ephemeral pages) and xvmalloc (storage for
> compressed persistent pages) don't set __GFP_HIGHMEM in their page
> allocation calls because they return the virtual address of the page to
> zcache.  Since highmem pages have no virtual address expect for the short
> time they are mapped, this prevents highmem pages from being used by zbud
> and xvmalloc.

As this area must be very large and contiguous, I can't use kmalloc or similar
allocation APIs -- I imagine I'll carve it out early in boot with
memblock_remove() -- luckily this area is of fixed size. If this memory
were in ZONE_HIGHMEM, I'd just have to use kmap to get a temporary mapping
to use when the page is copied to or from "normal" system memory (or am
I missing something here?). Whether this area is in highmem or not, I imagine
I'll need to write an allocator to allocate/free pages from the "dual-purpose"
memory when it is cleancache.

> 
> I did write a patch a while back that allows xvmalloc to use highmem
> pages in it's storage pool.  Although, from looking at the history of this
> conversation, you'd be writing a different backend for tmem and not using
> zcache anyway.

We're going to want a backend which is (at least to a
first approximation) a simplification of zcache
-- no compression and no frontswap is needed.
Possibly we'll start with zcache and remove things we don't need.
> 
> Currently the tmem code is in the zcache driver.  However, if there are
> going to be other backends designed for it, we may need to move it into its
> own module so it can be shared.
> 
> --
> Seth
> 

Larry

-- 
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 Sun Oct 09 09:31:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:31:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCwHM-0007mV-Ot; Sun, 09 Oct 2011 09:31:08 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCECN-0001rD-Mc
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:27:04 -0700
X-Env-Sender: nasirabed@gmail.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1318008420!16434975!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29109 invoked from network); 7 Oct 2011 17:27:00 -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;
	7 Oct 2011 17:27:00 -0000
Received: by wyh13 with SMTP id 13so5451678wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 10:27:00 -0700 (PDT)
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=1V0xLOxreSwyNiKHipL8nsUNMFTjAPI7fhjqZwjslGU=;
	b=dBzDw91LJRGfCTQo4QpGb6RGsE00rh5eMrSYHOdkdD477r/kDQ89kyE9rGvAda8ku4
	eaK/rYgYqIhIot4F9+xxquXI195VoJx8BASX8T5VcvFX7mrtPpBKDcI7BfqJ/1XMS9hk
	uQZmtXluDK6Qnc1E4MY9g1KyapKawqMDAjaaQ=
Received: by 10.227.195.13 with SMTP id ea13mr2696901wbb.36.1318008420208;
	Fri, 07 Oct 2011 10:27:00 -0700 (PDT)
Received: from localhost.localdomain (a2176-0490160821.pck.nerim.net.
	[213.41.173.17])
	by mx.google.com with ESMTPS id fo7sm17171786wbb.20.2011.10.07.10.26.57
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 07 Oct 2011 10:26:59 -0700 (PDT)
From: Nasir Abed <nasirabed@gmail.com>
To: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, x86@kernel.org,
	venki@google.com
Date: Fri,  7 Oct 2011 19:26:19 +0200
Message-Id: <1318008380-3379-1-git-send-email-nasirabed+kernel@gmail.com>
X-Mailer: git-send-email 1.7.4.1
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:09 -0700
Cc: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	virtualization@lists.linux-foundation.org
Subject: [Xen-devel] [PATCH 0/1] x86: removed deprecated IRQF_DISABLED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 removed IRQF_DISABLED which is deprecated and is ignored anyway since 2.6.36.

[PATCH 1/1] x86: removed deprecated IRQF_DISABLED

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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:32:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:32:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCwID-0008A0-8U; Sun, 09 Oct 2011 09:32:01 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCECl-0001s9-Cu
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 10:27:27 -0700
X-Env-Sender: nasirabed@gmail.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1318008444!20215027!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26734 invoked from network); 7 Oct 2011 17:27:24 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Oct 2011 17:27:24 -0000
Received: by wwf27 with SMTP id 27so5163827wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 10:27:24 -0700 (PDT)
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:in-reply-to:references;
	bh=WvUHu826PRV72aAiHhf8jYZQZQF8OSLm5UqaHA8XP1I=;
	b=Qf4AHsND/91jgAfnwQBKogiGadkyO4uMPYFCHWjrWj+JT9BpzXuYtZOzBmSV0Dqshl
	0OY00r2+irvxOuhjjnVsxrwJp7Jt6eXofqFyXocsMJW1fNQx17RUeDosoToIzBzmXB2C
	XEdl0ysI9HGRwGC8RCN8fAuO2lWZCoJhsN8Q4=
Received: by 10.216.131.234 with SMTP id m84mr2797045wei.25.1318008443949;
	Fri, 07 Oct 2011 10:27:23 -0700 (PDT)
Received: from localhost.localdomain (a2176-0490160821.pck.nerim.net.
	[213.41.173.17])
	by mx.google.com with ESMTPS id fo7sm17171786wbb.20.2011.10.07.10.27.21
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 07 Oct 2011 10:27:22 -0700 (PDT)
From: Nasir Abed <nasirabed@gmail.com>
To: tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, x86@kernel.org,
	venki@google.com
Date: Fri,  7 Oct 2011 19:26:20 +0200
Message-Id: <1318008380-3379-2-git-send-email-nasirabed+kernel@gmail.com>
X-Mailer: git-send-email 1.7.4.1
In-Reply-To: <1318008380-3379-1-git-send-email-nasirabed+kernel@gmail.com>
References: <1318008380-3379-1-git-send-email-nasirabed+kernel@gmail.com>
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:09 -0700
Cc: Nasir Abed <nasirabed+kernel@gmail.com>, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org
Subject: [Xen-devel] [PATCH 1/1] x86: removed deprecated IRQF_DISABLED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Nasir Abed <nasirabed+kernel@gmail.com>
---
 arch/x86/include/asm/floppy.h |    4 ++--
 arch/x86/kernel/hpet.c        |    2 +-
 arch/x86/kernel/time.c        |    2 +-
 arch/x86/xen/smp.c            |    8 ++++----
 arch/x86/xen/spinlock.c       |    2 +-
 arch/x86/xen/time.c           |    5 ++---
 6 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/arch/x86/include/asm/floppy.h b/arch/x86/include/asm/floppy.h
index dbe82a5..22bf4d6 100644
--- a/arch/x86/include/asm/floppy.h
+++ b/arch/x86/include/asm/floppy.h
@@ -145,10 +145,10 @@ static int fd_request_irq(void)
 {
 	if (can_use_virtual_dma)
 		return request_irq(FLOPPY_IRQ, floppy_hardint,
-				   IRQF_DISABLED, "floppy", NULL);
+				   0, "floppy", NULL);
 	else
 		return request_irq(FLOPPY_IRQ, floppy_interrupt,
-				   IRQF_DISABLED, "floppy", NULL);
+				   0, "floppy", NULL);
 }
 
 static unsigned long dma_mem_alloc(unsigned long size)
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
index 4aecc54..9d96096 100644
--- a/arch/x86/kernel/hpet.c
+++ b/arch/x86/kernel/hpet.c
@@ -515,7 +515,7 @@ static int hpet_setup_irq(struct hpet_dev *dev)
 {
 
 	if (request_irq(dev->irq, hpet_interrupt_handler,
-			IRQF_TIMER | IRQF_DISABLED | IRQF_NOBALANCING,
+			IRQF_TIMER | IRQF_NOBALANCING,
 			dev->name, dev))
 		return -1;
 
diff --git a/arch/x86/kernel/time.c b/arch/x86/kernel/time.c
index 5a64d05..e62386a 100644
--- a/arch/x86/kernel/time.c
+++ b/arch/x86/kernel/time.c
@@ -70,7 +70,7 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id)
 
 static struct irqaction irq0  = {
 	.handler = timer_interrupt,
-	.flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
+	.flags = IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
 	.name = "timer"
 };
 
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index 041d4fe..a375a75 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -100,7 +100,7 @@ static int xen_smp_intr_init(unsigned int cpu)
 	rc = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR,
 				    cpu,
 				    xen_reschedule_interrupt,
-				    IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING,
+				    IRQF_PERCPU|IRQF_NOBALANCING,
 				    resched_name,
 				    NULL);
 	if (rc < 0)
@@ -111,7 +111,7 @@ static int xen_smp_intr_init(unsigned int cpu)
 	rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_VECTOR,
 				    cpu,
 				    xen_call_function_interrupt,
-				    IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING,
+				    IRQF_PERCPU|IRQF_NOBALANCING,
 				    callfunc_name,
 				    NULL);
 	if (rc < 0)
@@ -120,7 +120,7 @@ static int xen_smp_intr_init(unsigned int cpu)
 
 	debug_name = kasprintf(GFP_KERNEL, "debug%d", cpu);
 	rc = bind_virq_to_irqhandler(VIRQ_DEBUG, cpu, xen_debug_interrupt,
-				     IRQF_DISABLED | IRQF_PERCPU | IRQF_NOBALANCING,
+				     IRQF_PERCPU | IRQF_NOBALANCING,
 				     debug_name, NULL);
 	if (rc < 0)
 		goto fail;
@@ -130,7 +130,7 @@ static int xen_smp_intr_init(unsigned int cpu)
 	rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR,
 				    cpu,
 				    xen_call_function_single_interrupt,
-				    IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING,
+				    IRQF_PERCPU|IRQF_NOBALANCING,
 				    callfunc_name,
 				    NULL);
 	if (rc < 0)
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index cc9b1e1..27882f5 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -354,7 +354,7 @@ void __cpuinit xen_init_lock_cpu(int cpu)
 	irq = bind_ipi_to_irqhandler(XEN_SPIN_UNLOCK_VECTOR,
 				     cpu,
 				     dummy_handler,
-				     IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING,
+				     IRQF_PERCPU|IRQF_NOBALANCING,
 				     name,
 				     NULL);
 
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
index 163b467..1889b8e 100644
--- a/arch/x86/xen/time.c
+++ b/arch/x86/xen/time.c
@@ -394,9 +394,8 @@ void xen_setup_timer(int cpu)
 		name = "<timer kasprintf failed>";
 
 	irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, xen_timer_interrupt,
-				      IRQF_DISABLED|IRQF_PERCPU|
-				      IRQF_NOBALANCING|IRQF_TIMER|
-				      IRQF_FORCE_RESUME,
+				      IRQF_PERCPU|IRQF_NOBALANCING|
+				      IRQF_TIMER|IRQF_FORCE_RESUME,
 				      name, NULL);
 
 	evt = &per_cpu(xen_clock_events, cpu);
-- 
1.7.4.1


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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:32:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:32:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCwJ8-00006p-I6; Sun, 09 Oct 2011 09:32:58 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RCFXK-0006l3-JB
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 11:52:52 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1318013562!28357095!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18541 invoked from network); 7 Oct 2011 18:52:42 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-3.tower-174.messagelabs.com with SMTP;
	7 Oct 2011 18:52:42 -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 p97IqHVr021484
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 7 Oct 2011 14:52:17 -0400
Received: from redhat.com (vpn-9-156.rdu.redhat.com [10.11.9.156])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p97IqFYT025598; Fri, 7 Oct 2011 14:52:16 -0400
Date: Fri, 7 Oct 2011 14:52:15 -0400
From: Jason Baron <jbaron@redhat.com>
To: Steven Rostedt <rostedt@goodmis.org>
Message-ID: <20111007185214.GD2978@redhat.com>
References: <4E8CF385.2080804@zytor.com> <4E8DEB19.1050509@goop.org>
	<20111006181055.GA2505@redhat.com>
	<1317925615.4729.14.camel@gandalf.stny.rr.com>
	<4E8DF870.6010000@redhat.com>
	<1317929321.4729.17.camel@gandalf.stny.rr.com>
	<4E8E20CD.5030207@goop.org>
	<1317938775.4729.29.camel@gandalf.stny.rr.com>
	<4E8E275F.6010801@goop.org>
	<1318007374.4729.58.camel@gandalf.stny.rr.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318007374.4729.58.camel@gandalf.stny.rr.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:08 -0700
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>, peterz@infradead.org,
	Jan Glauber <jang@linux.vnet.ibm.com>, Richard Henderson <rth@redhat.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH][RFC] jump_labels/x86: Use either 5 byte or
	2 byte jumps
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 07, 2011 at 01:09:32PM -0400, Steven Rostedt wrote:
> Note, this is just hacked together and needs to be cleaned up. Please do
> not comment on formatting or other sloppiness of this patch. I know it's
> sloppy and I left debug statements in. I want the comments to be on the
> idea of the patch.
> 
> I created a new file called scripts/update_jump_label.[ch] based on some
> of the work of recordmcount.c. This is executed at build time on all
> object files just like recordmcount is. But it does not add any new
> sections, it just modifies the code at build time to convert all jump
> labels into nops.
> 
> The idea is in arch/x86/include/asm/jump_label.h to not place a nop, but
> instead to insert a jmp to the label. Depending on how gcc optimizes the
> code, the jmp will be either end up being a 2 byte or 5 byte jump.
> 
> After an object is compiled, update_jump_label is executed on this file
> and it reads the ELF relocation table to find the jump label locations
> and examines what jump was used. It then converts the jump into either a
> 2 byte or 5 byte nop that is appropriate.
> 
> At boot time, the jump labels no longer need to be converted (although
> we may do so in the future to use better nops depending on the machine
> that is used). When jump labels are enabled, the code is examined to see
> if a two byte or 5 byte version was used, and the appropriate update is
> made.
> 
> I just booted this patch and it worked. I was able to enable and disable
> trace points using jump labels. Benchmarks are welcomed :)
> 
> Comments and thoughts?
> 

Generally, I really like it, I guess b/c I suggested it :) I'll try and
run some workloads on it - A real simple one, I used recently was putting
a single jump label in 'getppid()' and then calling it in a loop - I
wonder if the short nop vs long nop would show up there, as a baseline
test. (fwiw, the jump label vs. no jump label for this test was anywhere
b/w 1-5% improvement).

Anyways, some comments below.  

> -- Steve
> 
> Sloppy-signed-off-by: Steven Rostedt <rostedt@goodmis.org>
> 
> diff --git a/Makefile b/Makefile
> index 31f967c..8368f42 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -245,7 +245,7 @@ CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
>  
>  HOSTCC       = gcc
>  HOSTCXX      = g++
> -HOSTCFLAGS   = -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer
> +HOSTCFLAGS   = -Wall -Wmissing-prototypes -Wstrict-prototypes -g -fomit-frame-pointer
>  HOSTCXXFLAGS = -O2
>  
>  # Decide whether to build built-in, modular, or both.
> @@ -611,6 +611,13 @@ ifdef CONFIG_DYNAMIC_FTRACE
>  endif
>  endif
>  
> +ifdef CONFIG_JUMP_LABEL
> +	ifdef CONFIG_HAVE_BUILD_TIME_JUMP_LABEL
> +		BUILD_UPDATE_JUMP_LABEL := y
> +		export BUILD_UPDATE_JUMP_LABEL
> +	endif
> +endif
> +
>  # We trigger additional mismatches with less inlining
>  ifdef CONFIG_DEBUG_SECTION_MISMATCH
>  KBUILD_CFLAGS += $(call cc-option, -fno-inline-functions-called-once)
> diff --git a/arch/Kconfig b/arch/Kconfig
> index 4b0669c..8fa6934 100644
> --- a/arch/Kconfig
> +++ b/arch/Kconfig
> @@ -169,6 +169,12 @@ config HAVE_PERF_EVENTS_NMI
>  	  subsystem.  Also has support for calculating CPU cycle events
>  	  to determine how many clock cycles in a given period.
>  
> +config HAVE_BUILD_TIME_JUMP_LABEL
> +       bool
> +       help
> +	If an arch uses scripts/update_jump_label to patch in jump nops
> +	at build time, then it must enable this option.
> +
>  config HAVE_ARCH_JUMP_LABEL
>  	bool
>  
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 6a47bb2..6de726a 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -61,6 +61,7 @@ config X86
>  	select HAVE_ARCH_KMEMCHECK
>  	select HAVE_USER_RETURN_NOTIFIER
>  	select HAVE_ARCH_JUMP_LABEL
> +	select HAVE_BUILD_TIME_JUMP_LABEL
>  	select HAVE_TEXT_POKE_SMP
>  	select HAVE_GENERIC_HARDIRQS
>  	select HAVE_SPARSE_IRQ
> diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
> index a32b18c..872b3e1 100644
> --- a/arch/x86/include/asm/jump_label.h
> +++ b/arch/x86/include/asm/jump_label.h
> @@ -14,7 +14,7 @@
>  static __always_inline bool arch_static_branch(struct jump_label_key *key)
>  {
>  	asm goto("1:"
> -		JUMP_LABEL_INITIAL_NOP
> +		"jmp %l[l_yes]\n"
>  		".pushsection __jump_table,  \"aw\" \n\t"
>  		_ASM_ALIGN "\n\t"
>  		_ASM_PTR "1b, %l[l_yes], %c0 \n\t"
> diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
> index 3fee346..1f7f88f 100644
> --- a/arch/x86/kernel/jump_label.c
> +++ b/arch/x86/kernel/jump_label.c
> @@ -16,34 +16,75 @@
>  
>  #ifdef HAVE_JUMP_LABEL
>  
> +static unsigned char nop_short[] = { P6_NOP2 };
> +
>  union jump_code_union {
>  	char code[JUMP_LABEL_NOP_SIZE];
>  	struct {
>  		char jump;
>  		int offset;
>  	} __attribute__((packed));
> +	struct {
> +		char jump_short;
> +		char offset_short;
> +	} __attribute__((packed));
>  };
>  
>  void arch_jump_label_transform(struct jump_entry *entry,
>  			       enum jump_label_type type)
>  {
>  	union jump_code_union code;
> +	unsigned char op;
> +	unsigned size;
> +	unsigned char nop;
> +
> +	/* Use probe_kernel_read()? */
> +	op = *(unsigned char *)entry->code;
> +	nop = ideal_nops[NOP_ATOMIC5][0];
>  
>  	if (type == JUMP_LABEL_ENABLE) {
> -		code.jump = 0xe9;
> -		code.offset = entry->target -
> -				(entry->code + JUMP_LABEL_NOP_SIZE);
> -	} else
> -		memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE);
> +		if (op == 0xe9 || op == 0xeb)
> +			/* Already enabled. Warn? */
> +			return;
> +

Using the jump_label_inc/dec interface this shouldn't happen, I would
have it be BUG


> +		/* FIXME for all archs */
> +		if (op == nop_short[0]) {
> +			size = 2;
> +			code.jump_short = 0xeb;
> +			code.offset = entry->target -
> +				(entry->code + 2);
> +			/* Check for overflow ? */
> +		} else if (op == nop) {
> +			size = JUMP_LABEL_NOP_SIZE;
> +			code.jump = 0xe9;
> +			code.offset = entry->target - (entry->code + size);
> +		} else
> +			return; /* WARN ? */

same here, at least WARN, more likely BUG()

> +
> +	} else {
> +		if (op == nop_short[0] || nop)
> +			/* Already disabled, warn? */
> +			return;
> +

same here.

> +		if (op == 0xe9) {
> +			size = JUMP_LABEL_NOP_SIZE;
> +			memcpy(&code, ideal_nops[NOP_ATOMIC5], size);
> +		} else if (op == 0xeb) {
> +			size = 2;
> +			memcpy(&code, nop_short, size);
> +		} else
> +			return; /* WARN ? */

same here

> +	}
>  	get_online_cpus();
>  	mutex_lock(&text_mutex);
> -	text_poke_smp((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
> +	text_poke_smp((void *)entry->code, &code, size);
>  	mutex_unlock(&text_mutex);
>  	put_online_cpus();
>  }
>  
>  void arch_jump_label_text_poke_early(jump_label_t addr)
>  {
> +	return;
>  	text_poke_early((void *)addr, ideal_nops[NOP_ATOMIC5],
>  			JUMP_LABEL_NOP_SIZE);
>  }

hmmm...we spent a bunch of time selecting the 'ideal' run-time noops I
wouldn't want to drop that work.

> diff --git a/scripts/Makefile b/scripts/Makefile
> index df7678f..738b65c 100644
> --- a/scripts/Makefile
> +++ b/scripts/Makefile
> @@ -13,6 +13,7 @@ hostprogs-$(CONFIG_LOGO)         += pnmtologo
>  hostprogs-$(CONFIG_VT)           += conmakehash
>  hostprogs-$(CONFIG_IKCONFIG)     += bin2c
>  hostprogs-$(BUILD_C_RECORDMCOUNT) += recordmcount
> +hostprogs-$(BUILD_UPDATE_JUMP_LABEL) += update_jump_label
>  
>  always		:= $(hostprogs-y) $(hostprogs-m)
>  
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index a0fd502..bc0d89b 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -258,6 +258,15 @@ cmd_modversions =								\
>  	fi;
>  endif
>  
> +ifdef BUILD_UPDATE_JUMP_LABEL
> +update_jump_label_source := $(srctree)/scripts/update_jump_label.c \
> +			$(srctree)/scripts/update_jump_label.h
> +cmd_update_jump_label =						\
> +	if [ $(@) != "scripts/mod/empty.o" ]; then		\
> +		$(objtree)/scripts/update_jump_label "$(@)";	\
> +	fi;
> +endif
> +
>  ifdef CONFIG_FTRACE_MCOUNT_RECORD
>  ifdef BUILD_C_RECORDMCOUNT
>  ifeq ("$(origin RECORDMCOUNT_WARN)", "command line")
> @@ -294,6 +303,7 @@ define rule_cc_o_c
>  	$(cmd_modversions)						  \
>  	$(call echo-cmd,record_mcount)					  \
>  	$(cmd_record_mcount)						  \
> +	$(cmd_update_jump_label)					  \
>  	scripts/basic/fixdep $(depfile) $@ '$(call make-cmd,cc_o_c)' >    \
>  	                                              $(dot-target).tmp;  \
>  	rm -f $(depfile);						  \
> @@ -301,13 +311,14 @@ define rule_cc_o_c
>  endef
>  
>  # Built-in and composite module parts
> -$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
> +$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(update_jump_label_source) FORCE
>  	$(call cmd,force_checksrc)
>  	$(call if_changed_rule,cc_o_c)
>  
>  # Single-part modules are special since we need to mark them in $(MODVERDIR)
>  
> -$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
> +$(single-used-m): $(obj)/%.o: $(src)/%.c $(recordmcount_source) \
> +		  $(update_jump_label_source) FORCE
>  	$(call cmd,force_checksrc)
>  	$(call if_changed_rule,cc_o_c)
>  	@{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
> diff --git a/scripts/update_jump_label.c b/scripts/update_jump_label.c
> new file mode 100644
> index 0000000..86e17bc
> --- /dev/null
> +++ b/scripts/update_jump_label.c
> @@ -0,0 +1,349 @@
> +/*
> + * update_jump_label.c: replace jmps with nops at compile time.
> + * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
> + *  Parsing of the elf file was influenced by recordmcount.c
> + *  originally written by and copyright to John F. Reiser <jreiser@BitWagon.com>.
> + */
> +
> +/*
> + * Note, this code is originally designed for x86, but may be used by
> + * other archs to do the nop updates at compile time instead of at boot time.
> + * X86 uses this as an optimization, as jmps can be either 2 bytes or 5 bytes.
> + * Inserting a 2 byte where possible helps with both CPU performance and
> + * icache strain.
> + */
> +#include <sys/types.h>
> +#include <sys/mman.h>
> +#include <sys/stat.h>
> +#include <getopt.h>
> +#include <elf.h>
> +#include <fcntl.h>
> +#include <setjmp.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <stdarg.h>
> +#include <string.h>
> +#include <unistd.h>
> +
> +static int fd_map;	/* File descriptor for file being modified. */
> +static struct stat sb;	/* Remember .st_size, etc. */
> +static int mmap_failed; /* Boolean flag. */
> +
> +static void die(const char *err, const char *fmt, ...)
> +{
> +	va_list ap;
> +
> +	if (err)
> +		perror(err);
> +
> +	if (fmt) {
> +		va_start(ap, fmt);
> +		fprintf(stderr, "Fatal error:  ");
> +		vfprintf(stderr, fmt, ap);
> +		fprintf(stderr, "\n");
> +		va_end(ap);
> +	}
> +
> +	exit(1);
> +}
> +
> +static void usage(char **argv)
> +{
> +	char *arg = argv[0];
> +	char *p = arg+strlen(arg);
> +
> +	while (p >= arg && *p != '/')
> +		p--;
> +	p++;
> +
> +	printf("usage: %s file\n"
> +	       "\n",p);
> +	exit(-1);
> +}
> +
> +/* w8rev, w8nat, ...: Handle endianness. */
> +
> +static uint64_t w8rev(uint64_t const x)
> +{
> +	return   ((0xff & (x >> (0 * 8))) << (7 * 8))
> +	       | ((0xff & (x >> (1 * 8))) << (6 * 8))
> +	       | ((0xff & (x >> (2 * 8))) << (5 * 8))
> +	       | ((0xff & (x >> (3 * 8))) << (4 * 8))
> +	       | ((0xff & (x >> (4 * 8))) << (3 * 8))
> +	       | ((0xff & (x >> (5 * 8))) << (2 * 8))
> +	       | ((0xff & (x >> (6 * 8))) << (1 * 8))
> +	       | ((0xff & (x >> (7 * 8))) << (0 * 8));
> +}
> +
> +static uint32_t w4rev(uint32_t const x)
> +{
> +	return   ((0xff & (x >> (0 * 8))) << (3 * 8))
> +	       | ((0xff & (x >> (1 * 8))) << (2 * 8))
> +	       | ((0xff & (x >> (2 * 8))) << (1 * 8))
> +	       | ((0xff & (x >> (3 * 8))) << (0 * 8));
> +}
> +
> +static uint32_t w2rev(uint16_t const x)
> +{
> +	return   ((0xff & (x >> (0 * 8))) << (1 * 8))
> +	       | ((0xff & (x >> (1 * 8))) << (0 * 8));
> +}
> +
> +static uint64_t w8nat(uint64_t const x)
> +{
> +	return x;
> +}
> +
> +static uint32_t w4nat(uint32_t const x)
> +{
> +	return x;
> +}
> +
> +static uint32_t w2nat(uint16_t const x)
> +{
> +	return x;
> +}
> +
> +static uint64_t (*w8)(uint64_t);
> +static uint32_t (*w)(uint32_t);
> +static uint32_t (*w2)(uint16_t);
> +
> +/* ulseek, uread, ...:  Check return value for errors. */
> +
> +static off_t
> +ulseek(int const fd, off_t const offset, int const whence)
> +{
> +	off_t const w = lseek(fd, offset, whence);
> +	if (w == (off_t)-1)
> +		die("lseek", NULL);
> +
> +	return w;
> +}
> +
> +static size_t
> +uread(int const fd, void *const buf, size_t const count)
> +{
> +	size_t const n = read(fd, buf, count);
> +	if (n != count)
> +		die("read", NULL);
> +
> +	return n;
> +}
> +
> +static size_t
> +uwrite(int const fd, void const *const buf, size_t const count)
> +{
> +	size_t const n = write(fd, buf, count);
> +	if (n != count)
> +		die("write", NULL);
> +
> +	return n;
> +}
> +
> +static void *
> +umalloc(size_t size)
> +{
> +	void *const addr = malloc(size);
> +	if (addr == 0)
> +		die("malloc", "malloc failed: %zu bytes\n", size);
> +
> +	return addr;
> +}
> +
> +/*
> + * Get the whole file as a programming convenience in order to avoid
> + * malloc+lseek+read+free of many pieces.  If successful, then mmap
> + * avoids copying unused pieces; else just read the whole file.
> + * Open for both read and write; new info will be appended to the file.
> + * Use MAP_PRIVATE so that a few changes to the in-memory ElfXX_Ehdr
> + * do not propagate to the file until an explicit overwrite at the last.
> + * This preserves most aspects of consistency (all except .st_size)
> + * for simultaneous readers of the file while we are appending to it.
> + * However, multiple writers still are bad.  We choose not to use
> + * locking because it is expensive and the use case of kernel build
> + * makes multiple writers unlikely.
> + */
> +static void *mmap_file(char const *fname)
> +{
> +	void *addr;
> +
> +	fd_map = open(fname, O_RDWR);
> +	if (fd_map < 0 || fstat(fd_map, &sb) < 0)
> +		die(fname, "failed to open file");
> +
> +	if (!S_ISREG(sb.st_mode))
> +		die(NULL, "not a regular file: %s\n", fname);
> +
> +	addr = mmap(0, sb.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE,
> +		    fd_map, 0);
> +
> +	mmap_failed = 0;
> +	if (addr == MAP_FAILED) {
> +		mmap_failed = 1;
> +		addr = umalloc(sb.st_size);
> +		uread(fd_map, addr, sb.st_size);
> +	}
> +	return addr;
> +}
> +
> +static void munmap_file(void *addr)
> +{
> +	if (!mmap_failed)
> +		munmap(addr, sb.st_size);
> +	else
> +		free(addr);
> +	close(fd_map);
> +}
> +
> +static unsigned char ideal_nop5_x86_64[5] = { 0x0f, 0x1f, 0x44, 0x00, 0x00 };
> +static unsigned char ideal_nop5_x86_32[5] = { 0x3e, 0x8d, 0x74, 0x26, 0x00 };
> +static unsigned char ideal_nop2_x86[2] = { 0x66, 0x99 };
> +static unsigned char *ideal_nop;
> +
> +static int (*make_nop)(void *map, size_t const offset);
> +
> +static int make_nop_x86(void *map, size_t const offset)
> +{
> +	unsigned char *op;
> +	unsigned char *nop;
> +	int size;
> +
> +	/* Determine which type of jmp this is 2 byte or 5. */
> +	op = map + offset;
> +	switch (*op) {
> +	case 0xeb: /* 2 byte */
> +		size = 2;
> +		nop = ideal_nop2_x86;
> +		break;
> +	case 0xe9: /* 5 byte */
> +		size = 5;
> +		nop = ideal_nop;
> +		break;
> +	default:
> +		die(NULL, "Bad jump label section\n");
> +	}
> +
> +	/* convert to nop */
> +	ulseek(fd_map, offset, SEEK_SET);
> +	uwrite(fd_map, nop, size);
> +	return 0;
> +}
> +
> +/* 32 bit and 64 bit are very similar */
> +#include "update_jump_label.h"
> +#define UPDATE_JUMP_LABEL_64
> +#include "update_jump_label.h"
> +
> +static int do_file(const char *fname)
> +{
> +	Elf32_Ehdr *const ehdr = mmap_file(fname);
> +	unsigned int reltype = 0;
> +
> +	w = w4nat;
> +	w2 = w2nat;
> +	w8 = w8nat;
> +	switch (ehdr->e_ident[EI_DATA]) {
> +		static unsigned int const endian = 1;
> +	default:
> +		die(NULL, "unrecognized ELF data encoding %d: %s\n",
> +			ehdr->e_ident[EI_DATA], fname);
> +		break;
> +	case ELFDATA2LSB:
> +		if (*(unsigned char const *)&endian != 1) {
> +			/* main() is big endian, file.o is little endian. */
> +			w = w4rev;
> +			w2 = w2rev;
> +			w8 = w8rev;
> +		}
> +		break;
> +	case ELFDATA2MSB:
> +		if (*(unsigned char const *)&endian != 0) {
> +			/* main() is little endian, file.o is big endian. */
> +			w = w4rev;
> +			w2 = w2rev;
> +			w8 = w8rev;
> +		}
> +		break;
> +	}  /* end switch */
> +
> +	if (memcmp(ELFMAG, ehdr->e_ident, SELFMAG) != 0 ||
> +	    w2(ehdr->e_type) != ET_REL ||
> +	    ehdr->e_ident[EI_VERSION] != EV_CURRENT)
> +		die(NULL, "unrecognized ET_REL file %s\n", fname);
> +
> +	switch (w2(ehdr->e_machine)) {
> +	default:
> +		die(NULL, "unrecognized e_machine %d %s\n",
> +		    w2(ehdr->e_machine), fname);
> +		break;
> +	case EM_386:
> +		reltype = R_386_32;
> +		make_nop = make_nop_x86;
> +		ideal_nop = ideal_nop5_x86_32;
> +		break;
> +	case EM_ARM:	 reltype = R_ARM_ABS32;
> +			 break;
> +	case EM_IA_64:	 reltype = R_IA64_IMM64; break;
> +	case EM_MIPS:	 /* reltype: e_class    */ break;
> +	case EM_PPC:	 reltype = R_PPC_ADDR32;   break;
> +	case EM_PPC64:	 reltype = R_PPC64_ADDR64; break;
> +	case EM_S390:    /* reltype: e_class    */ break;
> +	case EM_SH:	 reltype = R_SH_DIR32;                 break;
> +	case EM_SPARCV9: reltype = R_SPARC_64;     break;
> +	case EM_X86_64:
> +		make_nop = make_nop_x86;
> +		ideal_nop = ideal_nop5_x86_64;
> +		reltype = R_X86_64_64;
> +		break;
> +	}  /* end switch */
> +
> +	switch (ehdr->e_ident[EI_CLASS]) {
> +	default:
> +		die(NULL, "unrecognized ELF class %d %s\n",
> +		    ehdr->e_ident[EI_CLASS], fname);
> +		break;
> +	case ELFCLASS32:
> +		if (w2(ehdr->e_ehsize) != sizeof(Elf32_Ehdr)
> +		||  w2(ehdr->e_shentsize) != sizeof(Elf32_Shdr))
> +			die(NULL, "unrecognized ET_REL file: %s\n", fname);
> +
> +		if (w2(ehdr->e_machine) == EM_S390) {
> +			reltype = R_390_32;
> +		}
> +		if (w2(ehdr->e_machine) == EM_MIPS) {
> +			reltype = R_MIPS_32;
> +		}
> +		do_func32(ehdr, fname, reltype);
> +		break;
> +	case ELFCLASS64: {
> +		Elf64_Ehdr *const ghdr = (Elf64_Ehdr *)ehdr;
> +		if (w2(ghdr->e_ehsize) != sizeof(Elf64_Ehdr)
> +		||  w2(ghdr->e_shentsize) != sizeof(Elf64_Shdr))
> +			die(NULL, "unrecognized ET_REL file: %s\n", fname);
> +
> +		if (w2(ghdr->e_machine) == EM_S390)
> +			reltype = R_390_64;
> +
> +#if 0
> +		if (w2(ghdr->e_machine) == EM_MIPS) {
> +			reltype = R_MIPS_64;
> +			Elf64_r_sym = MIPS64_r_sym;
> +		}
> +#endif
> +		do_func64(ghdr, fname, reltype);
> +		break;
> +	}
> +	}  /* end switch */
> +
> +	munmap_file(ehdr);
> +	return 0;
> +}
> +
> +int main (int argc, char **argv)
> +{
> +	if (argc != 2)
> +		usage(argv);
> +	
> +	return do_file(argv[1]);
> +}
> +
> diff --git a/scripts/update_jump_label.h b/scripts/update_jump_label.h
> new file mode 100644
> index 0000000..6ff9846
> --- /dev/null
> +++ b/scripts/update_jump_label.h
> @@ -0,0 +1,322 @@
> +/*
> + * recordmcount.h
> + *
> + * This code was taken out of recordmcount.c written by
> + * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>.  All rights reserved.
> + *
> + * The original code had the same algorithms for both 32bit
> + * and 64bit ELF files, but the code was duplicated to support
> + * the difference in structures that were used. This
> + * file creates a macro of everything that is different between
> + * the 64 and 32 bit code, such that by including this header
> + * twice we can create both sets of functions by including this
> + * header once with RECORD_MCOUNT_64 undefined, and again with
> + * it defined.
> + *
> + * This conversion to macros was done by:
> + * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
> + *
> + * Licensed under the GNU General Public License, version 2 (GPLv2).
> + */
> +
> +#undef EBITS
> +#undef _w
> +#undef _align
> +#undef _size
> +
> +#ifdef UPDATE_JUMP_LABEL_64
> +# define EBITS			64
> +# define _w			w8
> +# define _align			7u
> +# define _size			8
> +#else
> +# define EBITS			32
> +# define _w			w
> +# define _align			3u
> +# define _size			4
> +#endif
> +
> +#define _FBITS(x, e)	x##e
> +#define FBITS(x, e)	_FBITS(x,e)
> +#define FUNC(x)		FBITS(x,EBITS)
> +
> +#undef Elf_Addr
> +#undef Elf_Ehdr
> +#undef Elf_Shdr
> +#undef Elf_Rel
> +#undef Elf_Rela
> +#undef Elf_Sym
> +#undef ELF_R_SYM
> +#undef ELF_R_TYPE
> +
> +#define __ATTACH(x,y,z)	x##y##z
> +#define ATTACH(x,y,z)	__ATTACH(x,y,z)
> +
> +#define Elf_Addr	ATTACH(Elf,EBITS,_Addr)
> +#define Elf_Ehdr	ATTACH(Elf,EBITS,_Ehdr)
> +#define Elf_Shdr	ATTACH(Elf,EBITS,_Shdr)
> +#define Elf_Rel		ATTACH(Elf,EBITS,_Rel)
> +#define Elf_Rela	ATTACH(Elf,EBITS,_Rela)
> +#define Elf_Sym		ATTACH(Elf,EBITS,_Sym)
> +#define uint_t		ATTACH(uint,EBITS,_t)
> +#define ELF_R_SYM	ATTACH(ELF,EBITS,_R_SYM)
> +#define ELF_R_TYPE	ATTACH(ELF,EBITS,_R_TYPE)
> +
> +#undef get_shdr
> +#define get_shdr(ehdr) ((Elf_Shdr *)(_w((ehdr)->e_shoff) + (void *)(ehdr)))
> +
> +#undef get_section_loc
> +#define get_section_loc(ehdr, shdr)(_w((shdr)->sh_offset) + (void *)(ehdr))
> +
> +/* Functions and pointers that do_file() may override for specific e_machine. */
> +
> +#if 0
> +static uint_t FUNC(fn_ELF_R_SYM)(Elf_Rel const *rp)
> +{
> +	return ELF_R_SYM(_w(rp->r_info));
> +}
> +static uint_t (*FUNC(Elf_r_sym))(Elf_Rel const *rp) = FUNC(fn_ELF_R_SYM);
> +#endif
> +
> +static void FUNC(get_sym_str_and_relp)(Elf_Shdr const *const relhdr,
> +				 Elf_Ehdr const *const ehdr,
> +				 Elf_Sym const **sym0,
> +				 char const **str0,
> +				 Elf_Rel const **relp)
> +{
> +	Elf_Shdr *const shdr0 = get_shdr(ehdr);
> +	unsigned const symsec_sh_link = w(relhdr->sh_link);
> +	Elf_Shdr const *const symsec = &shdr0[symsec_sh_link];
> +	Elf_Shdr const *const strsec = &shdr0[w(symsec->sh_link)];
> +	Elf_Rel const *const rel0 =
> +		(Elf_Rel const *)get_section_loc(ehdr, relhdr);
> +
> +	*sym0 = (Elf_Sym const *)get_section_loc(ehdr, symsec);
> +
> +	*str0 = (char const *)get_section_loc(ehdr, strsec);
> +
> +	*relp = rel0;
> +}
> +
> +/*
> + * Read the relocation table again, but this time its called on sections
> + * that are not going to be traced. The mcount calls here will be converted
> + * into nops.
> + */
> +static void FUNC(nop_jump_label)(Elf_Shdr const *const relhdr,
> +		       Elf_Ehdr const *const ehdr,
> +		       const char *const txtname)
> +{
> +	Elf_Shdr *const shdr0 = get_shdr(ehdr);
> +	Elf_Sym const *sym0;
> +	char const *str0;
> +	Elf_Rel const *relp;
> +	Elf_Rela const *relap;
> +	Elf_Shdr const *const shdr = &shdr0[w(relhdr->sh_info)];
> +	unsigned rel_entsize = w(relhdr->sh_entsize);
> +	unsigned const nrel = _w(relhdr->sh_size) / rel_entsize;
> +	int t;
> +
> +	FUNC(get_sym_str_and_relp)(relhdr, ehdr, &sym0, &str0, &relp);
> +
> +	for (t = nrel; t > 0; t -= 3) {
> +		int ret = -1;
> +
> +		relap = (Elf_Rela const *)relp;
> +		printf("rel offset=%lx info=%lx sym=%lx type=%lx addend=%lx\n",
> +		       (long)relap->r_offset, (long)relap->r_info,
> +		       (long)ELF_R_SYM(relap->r_info),
> +		       (long)ELF_R_TYPE(relap->r_info),
> +		       (long)relap->r_addend);
> +
> +		if (0 && make_nop)
> +			ret = make_nop((void *)ehdr, shdr->sh_offset + relp->r_offset);
> +
> +		/* jump label sections are paired in threes */
> +		relp = (Elf_Rel const *)(rel_entsize * 3 + (void *)relp);
> +	}
> +}
> +
> +/* Evade ISO C restriction: no declaration after statement in has_rel_mcount. */
> +static char const *
> +FUNC(__has_rel_jump_table)(Elf_Shdr const *const relhdr,  /* is SHT_REL or SHT_RELA */
> +		 Elf_Shdr const *const shdr0,
> +		 char const *const shstrtab,
> +		 char const *const fname)
> +{
> +	/* .sh_info depends on .sh_type == SHT_REL[,A] */
> +	Elf_Shdr const *const txthdr = &shdr0[w(relhdr->sh_info)];
> +	char const *const txtname = &shstrtab[w(txthdr->sh_name)];
> +
> +	if (strcmp("__jump_table", txtname) == 0) {
> +		fprintf(stderr, "warning: __mcount_loc already exists: %s\n",
> +			fname);
> +//		succeed_file();
> +	}
> +	if (w(txthdr->sh_type) != SHT_PROGBITS ||
> +	    !(w(txthdr->sh_flags) & SHF_EXECINSTR))
> +		return NULL;
> +	return txtname;
> +}
> +
> +static char const *FUNC(has_rel_jump_table)(Elf_Shdr const *const relhdr,
> +				      Elf_Shdr const *const shdr0,
> +				      char const *const shstrtab,
> +				      char const *const fname)
> +{
> +	if (w(relhdr->sh_type) != SHT_REL && w(relhdr->sh_type) != SHT_RELA)
> +		return NULL;
> +	return FUNC(__has_rel_jump_table)(relhdr, shdr0, shstrtab, fname);
> +}
> +
> +/* Find relocation section hdr for a given section */
> +static const Elf_Shdr *
> +FUNC(find_relhdr)(const Elf_Ehdr *ehdr, const Elf_Shdr *shdr)
> +{
> +	const Elf_Shdr *shdr0 = get_shdr(ehdr);
> +	int nhdr = w2(ehdr->e_shnum);
> +	const Elf_Shdr *hdr;
> +	int i;
> +
> +	for (hdr = shdr0, i = 0; i < nhdr; hdr = &shdr0[++i]) {
> +		if (w(hdr->sh_type) != SHT_REL &&
> +		    w(hdr->sh_type) != SHT_RELA)
> +			continue;
> +
> +		/*
> +		 * The relocation section's info field holds
> +		 * the section index that it represents.
> +		 */
> +		if (shdr == &shdr0[w(hdr->sh_info)])
> +			return hdr;
> +	}
> +	return NULL;
> +}
> +
> +/* Find a section headr based on name and type */
> +static const Elf_Shdr *
> +FUNC(find_shdr)(const Elf_Ehdr *ehdr, const char *name, uint_t type)
> +{
> +	const Elf_Shdr *shdr0 = get_shdr(ehdr);
> +	const Elf_Shdr *shstr = &shdr0[w2(ehdr->e_shstrndx)];
> +	const char *shstrtab = (char *)get_section_loc(ehdr, shstr);
> +	int nhdr = w2(ehdr->e_shnum);
> +	const Elf_Shdr *hdr;
> +	const char *hdrname;
> +	int i;
> +
> +	for (hdr = shdr0, i = 0; i < nhdr; hdr = &shdr0[++i]) {
> +		if (w(hdr->sh_type) != type)
> +			continue;
> +
> +		/* If we are just looking for a section by type (ie. SYMTAB) */
> +		if (!name)
> +			return hdr;
> +
> +		hdrname = &shstrtab[w(hdr->sh_name)];
> +		if (strcmp(hdrname, name) == 0)
> +			return hdr;
> +	}
> +	return NULL;
> +}
> +
> +static void
> +FUNC(section_update)(const Elf_Ehdr *ehdr, const Elf_Shdr *symhdr,
> +		     unsigned shtype, const Elf_Rel *rel, void *data)
> +{
> +	const Elf_Shdr *shdr0 = get_shdr(ehdr);
> +	const Elf_Shdr *targethdr;
> +	const Elf_Rela *rela;
> +	const Elf_Sym *syment;
> +	uint_t offset = _w(rel->r_offset);
> +	uint_t info = _w(rel->r_info);
> +	uint_t sym = ELF_R_SYM(info);
> +	uint_t type = ELF_R_TYPE(info);
> +	uint_t addend;
> +	uint_t targetloc;
> +
> +	if (shtype == SHT_RELA) {
> +		rela = (const Elf_Rela *)rel;
> +		addend = _w(rela->r_addend);
> +	} else
> +		addend = _w(*(unsigned short *)(data + offset));
> +
> +	syment = (const Elf_Sym *)get_section_loc(ehdr, symhdr);
> +	targethdr = &shdr0[w2(syment[sym].st_shndx)];
> +	targetloc = _w(targethdr->sh_offset);
> +
> +	/* TODO, need a separate function for all archs */
> +	if (type != R_386_32)
> +		die(NULL, "Arch relocation type %d not supported", type);
> +
> +	targetloc += addend;
> +
> +#if 1
> +	printf("offset=%x target=%x shoffset=%x add=%x\n",
> +	       offset, targetloc, _w(targethdr->sh_offset), addend);
> +#endif
> +	*(uint_t *)(data + offset) = targetloc;
> +}
> +
> +/* Overall supervision for Elf32 ET_REL file. */
> +static void
> +FUNC(do_func)(Elf_Ehdr *ehdr, char const *const fname, unsigned const reltype)
> +{
> +	const Elf_Shdr *jlshdr;
> +	const Elf_Shdr *jlrhdr;
> +	const Elf_Shdr *symhdr;
> +	const Elf_Rel *rel;
> +	unsigned size;
> +	unsigned cnt;
> +	unsigned i;
> +	uint_t type;
> +	void *jdata;
> +	void *data;
> +
> +	jlshdr = FUNC(find_shdr)(ehdr, "__jump_table", SHT_PROGBITS);
> +	if (!jlshdr)
> +		return;
> +
> +	jlrhdr = FUNC(find_relhdr)(ehdr, jlshdr);
> +	if (!jlrhdr)
> +		return;
> +
> +	/*
> +	 * Create and fill in the __jump_table section and use it to
> +	 * find the offsets into the text that we want to update.
> +	 * We create it so that we do not depend on the order of the
> +	 * relocations, and use the table directly, as it is broken
> +	 * up into sections.
> +	 */
> +	size = _w(jlshdr->sh_size);
> +	data = umalloc(size);
> +
> +	jdata = (void *)get_section_loc(ehdr, jlshdr);
> +	memcpy(data, jdata, size);
> +
> +	cnt = _w(jlrhdr->sh_size) / w(jlrhdr->sh_entsize);
> +
> +	rel = (const Elf_Rel *)get_section_loc(ehdr, jlrhdr);
> +
> +	/* Is this as Rel or Rela? */
> +	type = w(jlrhdr->sh_type);
> +
> +	symhdr = FUNC(find_shdr)(ehdr, NULL, SHT_SYMTAB);
> +
> +	for (i = 0; i < cnt; i++) {
> +		FUNC(section_update)(ehdr, symhdr, type, rel, data);
> +		rel = (void *)rel + w(jlrhdr->sh_entsize);
> +	}
> +
> +	/*
> +	 * This is specific to x86. The jump_table is stored in three
> +	 * long words. The first is the location of the jmp target we
> +	 * must update.
> +	 */
> +	cnt = size / sizeof(uint_t);
> +
> +	for (i = 0; i < cnt; i += 3)
> +		if (0)make_nop((void *)ehdr, *(uint_t *)(data + i * sizeof(uint_t)));
> +

hmmmm, isn't this the line that actually writes in the no-ops? why isn't
it disabled?

> +	free(data);
> +}
> 
> 

Thanks again for doing this...I was still understanding recordmcount.c ;)

-Jason

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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:34:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:34:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCwKA-0000Uc-DB; Sun, 09 Oct 2011 09:34:03 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCQ9v-00024M-Hp
	for xen-devel@lists.xensource.com; Fri, 07 Oct 2011 23:13:33 -0700
X-Env-Sender: rush1503@gmail.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1318054395!30738023!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21817 invoked from network); 8 Oct 2011 06:13:16 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	8 Oct 2011 06:13:16 -0000
Received: by yxt3 with SMTP id 3so6874764yxt.30
	for <xen-devel@lists.xensource.com>;
	Fri, 07 Oct 2011 23:13:14 -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=Oo3/Ex8tN4qPahfCrZ1AR6kxtZc+KKlH/DULyxOje10=;
	b=SAHoFJf31a9llYyLLJblL/VQG6VKa5lkIpbJYK53zvmhrkpGS+NAW+rUrSafGihgli
	orGnW3XUkgZHMs5d8861kTyYtUUYXGbNSijbocV/H9v0jNmReLF/TDMpHQJBpBvrT8r1
	FLfR6qw0OfXaGRXy/EBR30TE/pugil2I3DIIM=
MIME-Version: 1.0
Received: by 10.101.213.24 with SMTP id p24mr2194489anq.18.1318054394840; Fri,
	07 Oct 2011 23:13:14 -0700 (PDT)
Received: by 10.101.55.18 with HTTP; Fri, 7 Oct 2011 23:13:14 -0700 (PDT)
In-Reply-To: <1317667984.11991.6.camel@dagon.hellion.org.uk>
References: <20110919210045.3256.61939.reportbug@xen-dom0.xen.irush.su>
	<20110919212211.GB6343@elie>
	<CA+rvmvK8G5hNq4wOkPdcDMufYS9bD559zvexMqG9gy=m7dkU_A@mail.gmail.com>
	<1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
	<CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
	<1317460798.11991.2.camel@dagon.hellion.org.uk>
	<CA+rvmv+yU0=nEuvLSqkE44RFqeaQw504MkD-sxjXV3D3nkme_g@mail.gmail.com>
	<20111003184722.GB15608@phenom.oracle.com>
	<1317667984.11991.6.camel@dagon.hellion.org.uk>
Date: Sat, 8 Oct 2011 10:13:14 +0400
Message-ID: <CA+rvmvJ_i4Ta+GV5PQ0U7+2yPxT2oJXtnE_fq0j8Faa7GcUxqw@mail.gmail.com>
From: rush <rush1503@gmail.com>
To: Ian Campbell <ijc@hellion.org.uk>
Content-Type: text/plain; charset=ISO-8859-1
X-Mailman-Approved-At: Sun, 09 Oct 2011 09:00:10 -0700
Cc: Jonathan Nieder <jrnieder@gmail.com>, 642154@bugs.debian.org,
	xen-devel <xen-devel@lists.xensource.com>,
	Ben Hutchings <ben@decadent.org.uk>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: BUG: unable to handle kernel paging request at
	ffff8803bb6ad000
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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, I tried it again, but Oops didn't gone.

menuentry 'Debian GNU/Linux, with Xen 4.0-amd64 and Linux
3.0.0-1-amd64' --class debian --class gnu-linux --class gnu --class os
--class xen {
        insmod raid
        insmod mdraid1x
        insmod lvm
        insmod part_msdos
        insmod part_msdos
        insmod ext2
        set root='(xen-system)'
        search --no-floppy --fs-uuid --set=root
709c172b-19b2-417d-8a43-e1957bcdc2f6
        echo    'Loading Xen 4.0-amd64 ...'
        multiboot       /boot/xen-4.0-amd64.gz placeholder xsave=0
        echo    'Loading Linux 3.0.0-1-amd64 ...'
        module  /boot/vmlinuz-3.0.0-1-amd64 placeholder
root=/dev/mapper/xen-system ro quiet
        echo    'Loading initial ramdisk ...'
        module  /boot/initrd.img-3.0.0-1-amd64
}

Was it right?

[   24.242539] BUG: unable to handle kernel paging request at ffff8803be1ab000
[   24.242780] IP: [<ffffffff810106db>] __sanitize_i387_state+0x23/0xe1
[   24.242956] PGD 1604067 PUD 3d82d9067 PMD 3d84ca067 PTE 0
[   24.243309] Oops: 0000 [#1] SMP
[   24.243533] CPU 0
[   24.243601] Modules linked in: xt_tcpudp xt_physdev iptable_filter
ip_tables x_tables xen_netback xen_blkback bridge stp xen_evtchn xenfs
loop snd_pcm snd_timer snd soundcore snd_page_alloc i2c_i801 joydev
evdev pcspkr ghes i2c_core video processor hed button ext4 mbcache
jbd2 crc16 dm_mod raid1 md_mod usbhid hid sg sd_mod crc_t10dif ahci
libahci libata scsi_mod ehci_hcd fan thermal usbcore thermal_sys
e1000e [last unloaded: scsi_wait_scan]
[   24.247197]
[   24.247291] Pid: 2526, comm: forks Not tainted 3.0.0-1-amd64 #1
Intel Corporation S1200BTL/S1200BTL
[   24.247621] RIP: e030:[<ffffffff810106db>]  [<ffffffff810106db>]
__sanitize_i387_state+0x23/0xe1
[   24.247829] RSP: e02b:ffff88034862be00  EFLAGS: 00010246
[   24.247935] RAX: 0000000000000000 RBX: 00007fff1755a8c0 RCX: 0000000000000200
[   24.248047] RDX: ffff8803be1aae00 RSI: ffff88034862bfd8 RDI: ffff8803bbf55650
[   24.248159] RBP: ffff8803bbf55650 R08: ffff88034862a000 R09: ffffffff81684640
[   24.248271] R10: 00007fe2b7cd09d0 R11: 0000000000000246 R12: 0000000000000000
[   24.248384] R13: ffffffffffffffff R14: ffff8803bbf55650 R15: 00007fff1755a8c0
[   24.248498] FS:  00007fe2b7cd0700(0000) GS:ffff8803d614f000(0000)
knlGS:0000000000000000
[   24.248641] CS:  e033 DS: 0000 ES: 0000 CR0: 000000008005003b
[   24.248750] CR2: ffff8803be1ab000 CR3: 00000003bc23c000 CR4: 0000000000002660
[   24.248862] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[   24.248976] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[   24.249088] Process forks (pid: 2526, threadinfo ffff88034862a000,
task ffff8803bbf55650)
[   24.249231] Stack:
[   24.249325]  ffffffff81010919 0000000000413201 ffff88034862bf58
0000000000000011
[   24.249715]  ffff8803bbf55ae0 ffffffffffffffff ffffffff81008fdd
0000000000000000
[   24.250101]  00007fff1755a6f8 0000000000000011 0000000000040001
0000fffe000009df
[   24.250491] Call Trace:
[   24.250589]  [<ffffffff81010919>] ? save_i387_xstate+0x102/0x1f3
[   24.250700]  [<ffffffff81008fdd>] ? do_signal+0x212/0x649
[   24.250810]  [<ffffffff8133733a>] ? error_exit+0x2a/0x60
[   24.250916]  [<ffffffff81009450>] ? do_notify_resume+0x25/0x6b
[   24.251027]  [<ffffffff8133bfe0>] ? int_signal+0x12/0x17
[   24.251132] Code: e8 13 2a ff ff 66 90 c3 48 8b 97 48 04 00 00 48
85 d2 0f 84 d0 00 00 00 48 8b 47 08 f6 40 14 01 74 02 0f 0b 48 8b 05
45 4e 71 00
[   24.253911]  8b b2 00 02 00 00 48 89 c1 48 21 f1 48 39 c1 0f 84 a7 00 00
[   24.255408] RIP  [<ffffffff810106db>] __sanitize_i387_state+0x23/0xe1
[   24.255581]  RSP <ffff88034862be00>
[   24.255680] CR2: ffff8803be1ab000
[   24.255780] ---[ end trace e9c161e4e81bf087 ]---

2011/10/3, Ian Campbell <ijc@hellion.org.uk>:
> On Mon, 2011-10-03 at 14:47 -0400, Konrad Rzeszutek Wilk wrote:
>> >         echo    'Loading Xen 4.0-amd64 ...'
>> >         multiboot       /boot/xen-4.0-amd64.gz placeholder
>>
>> Oops. I meant to try it in the hypervisor - so right after placeholder add
>> "xsave=0"
>
> Which in grub2 means add GRUB_CMDLINE_XEN="xsave=0" to /etc/default/grub
> (there is no commented out example in this case) and re-run update-grub.
>
> Ian.
>
> --
> Ian Campbell
>
>
> Many a bum show has been saved by the flag.
> 		-- George M. Cohan
>

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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 09:41:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 09:41:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RCwR3-0001W0-1U; Sun, 09 Oct 2011 09:41:09 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RCwQW-0001JJ-E5
	for xen-devel@lists.xensource.com; Sun, 09 Oct 2011 09:40:37 -0700
X-Env-Sender: bickys1986@gmail.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318178432!20393972!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24532 invoked from network); 9 Oct 2011 16:40:33 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Oct 2011 16:40:33 -0000
Received: by bkas6 with SMTP id s6so9645533bka.30
	for <xen-devel@lists.xensource.com>;
	Sun, 09 Oct 2011 09:40:32 -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=qelL55PDfVlY9OwfV4On8CaP8qyMHQS1EJD2Tuj/Y+8=;
	b=fcPfmTHYZZU0SzA3YkZVrDK+tmc8fHMQ9zDmyl9A+7VUnPpHDF98WPhR4S4qaML7rJ
	wz2v2SUzcWznUe5Sq0osfD8gxar8ySQv8ZgkFgK2nZUVErROyBNg1IR66E0zvwBXkx+H
	YK+yoeNR+HPzikQKfWjPmxdeE8bOKHQWBP4dw=
MIME-Version: 1.0
Received: by 10.204.144.87 with SMTP id y23mr3662387bku.93.1318178432568; Sun,
	09 Oct 2011 09:40:32 -0700 (PDT)
Received: by 10.204.60.71 with HTTP; Sun, 9 Oct 2011 09:40:32 -0700 (PDT)
In-Reply-To: <20111006111044.GD21091@ocelot.phlegethon.org>
References: <CACavRyB4kvMLZK1-vv9bJnVdnpKJBHTmnhJxt6g3eh88xY6FTg@mail.gmail.com>
	<20110929170244.GA29163@aepfle.de>
	<CAAJKtqrFuJkNAZZhRs8tC0ymgQTD0G2VTgYexQ9EhnCxsJNZuw@mail.gmail.com>
	<20111003145616.GA8610@aepfle.de>
	<20111006111044.GD21091@ocelot.phlegethon.org>
Date: Mon, 10 Oct 2011 00:40:32 +0800
Message-ID: <CACavRyA+Djzr3AVwgaZQu1-doPiMkAZ-NpdVR1nXjiiW_74PqQ@mail.gmail.com>
Subject: Re: [Xen-devel] Re: mapping problems in xenpaging
From: zhen shi <bickys1986@gmail.com>
To: Tim Deegan <tim@xen.org>, Olaf Hering <olaf@aepfle.de>,
	Adin Scannell <adin@gridcentric.ca>
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="===============1037785370=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1037785370==
Content-Type: multipart/alternative; boundary=0015174c0faa394e8104aee05542

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

2011/10/6 Tim Deegan <tim@xen.org>

> At 16:56 +0200 on 03 Oct (1317660976), Olaf Hering wrote:
> > On Fri, Sep 30, Adin Scannell wrote:
> >
> > > >>  When we analyze and test xenpaging,we found there are some
> problems between
> > > >> mapping and xenpaging.
> > > >>  1) When mapping firstly, then do xenpaging,and the code paths have
> resolved
> > > >> the problems.It's OK.
> > > >>  2) The problems exists if we do address mapping firstly then go to
> > > >> xenpaging,and our confusions are as followings:
> > > >>    a) If the domU's memory is directly mapped to dom0,such as the
> hypercall
> > > >> from pv driver,then it will build a related page-table in dom0,which
> will not
> > > >> change p2m-type.
> > > >>       and then do the xenpaging to page out the domU's memory pages
> whose gfn
> > > >> address have been already mapped to dom0;So it will cause some
> problems when
> > > >> dom0
> > > >>       accesses these pages.Because these pages are paged-out,and
> dom0 cannot
> > > >> tell the p2mt before access the pages.
> > > >
> > > > I'm not entirely sure what you do. xenpaging runs in dom0 and is able
> to
> > > > map paged-out pages. It uses that to trigger a page-in, see
> > > > tools/xenpaging/pagein.c in xen-unstable.hg
> > >
> > > Here's my take...
> > >
> > > Xenpaging doesn't allow selection of pages that have been mapped by
> > > other domains (as in p2m.c):
> > >
> > >  669 int p2m_mem_paging_nominate(struct domain *d, unsigned long gfn)
> > > ....
> > >  693     /* Check page count and type */
> > >  694     page = mfn_to_page(mfn);
> > >  695     if ( (page->count_info & (PGC_count_mask | PGC_allocated)) !=
> > >  696          (1 | PGC_allocated) )
> > >  697         goto out;
>
>     I wonder if pages have been mapped by other domains,then the
page->count_info will be added.I have analyzed  xc_map_foreign_pages()
function,and have not figured out how to add the page->count_info
by xc_map_foreign_pages().and the page->count_info decreases in munmap().


> > > *However*, I think that the problem Zhen is describing still exists:
> > > 1) xenpaging nominates a page, it is successful.
> > > 2) dom0 maps the same page (a process other than xenpaging, which will
> > > also map it).
> > > 3) xenpaging evicts the page, successfully.
> > >
> > > I've experienced a few nasty crashes, and I think this could account
> > > for a couple (but certainly not all)... I think that the solution may
> > > be to repeat the refcount check in paging_evict, and roll back the
> > > nomination gracefully if the race is detected. Thoughts?
>


> > Are there really code paths that touch a mfn without going through the
> > p2m functions? If so I will copy the check and update xenpaging.
>
> >No, but there are race conditions where CPU A could to the p2m lookup,
> >then CPU B nominates the page and changes its p2m entry, then CPU A
> >completes the mapping.  In the extreme case, detecting this in the
> >eviction code is also subject to the same race; some sort of atomic
> >lookup-and-get-reference operation seems like a better fix.
>

  Tim , Olaf and Adin, do you have any good ideas about the above
situation.

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

<br><div class=3D"gmail_quote">2011/10/6 Tim Deegan <span dir=3D"ltr">&lt;<=
a href=3D"mailto:tim@xen.org">tim@xen.org</a>&gt;</span><br><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;pa=
dding-left:1ex;">
<div><div></div><div class=3D"h5">At 16:56 +0200 on 03 Oct (1317660976), Ol=
af Hering wrote:<br>
&gt; On Fri, Sep 30, Adin Scannell wrote:<br>
&gt;<br>
&gt; &gt; &gt;&gt; =A0When we analyze and test xenpaging,we found there are=
 some problems=A0between<br>
&gt; &gt; &gt;&gt; mapping and xenpaging.<br>
&gt; &gt; &gt;&gt; =A01) When mapping firstly, then do xenpaging,and the co=
de paths have resolved<br>
&gt; &gt; &gt;&gt; the problems.It&#39;s OK.<br>
&gt; &gt; &gt;&gt; =A02) The problems exists if we do address mapping first=
ly then go to<br>
&gt; &gt; &gt;&gt; xenpaging,and our confusions are as followings:<br>
&gt; &gt; &gt;&gt; =A0=A0 a) If the domU&#39;s memory is directly mapped to=
 dom0,such as the hypercall<br>
&gt; &gt; &gt;&gt; from pv driver,then it will build a related page-table i=
n dom0,which will not<br>
&gt; &gt; &gt;&gt; change p2m-type.<br>
&gt; &gt; &gt;&gt; =A0=A0=A0=A0 =A0and then do the xenpaging to page out th=
e domU&#39;s memory pages whose gfn<br>
&gt; &gt; &gt;&gt; address have been already mapped to dom0;So it will caus=
e some problems when<br>
&gt; &gt; &gt;&gt; dom0<br>
&gt; &gt; &gt;&gt; =A0=A0=A0=A0 =A0accesses these pages.Because these pages=
 are paged-out,and dom0 cannot<br>
&gt; &gt; &gt;&gt; tell the p2mt before access the pages.<br>
&gt; &gt; &gt;<br>
&gt; &gt; &gt; I&#39;m not entirely sure what you do. xenpaging runs in dom=
0 and is able to<br>
&gt; &gt; &gt; map paged-out pages. It uses that to trigger a page-in, see<=
br>
&gt; &gt; &gt; tools/xenpaging/pagein.c in xen-unstable.hg<br>
&gt; &gt;<br>
&gt; &gt; Here&#39;s my take...<br>
&gt; &gt;<br>
&gt; &gt; Xenpaging doesn&#39;t allow selection of pages that have been map=
ped by<br>
&gt; &gt; other domains (as in p2m.c):<br>
&gt; &gt;<br>
&gt; &gt; =A0669 int p2m_mem_paging_nominate(struct domain *d, unsigned lon=
g gfn)<br>
&gt; &gt; ....<br>
&gt; &gt; =A0693 =A0 =A0 /* Check page count and type */<br>
&gt; &gt; =A0694 =A0 =A0 page =3D mfn_to_page(mfn);<br>
&gt; &gt; =A0695 =A0 =A0 if ( (page-&gt;count_info &amp; (PGC_count_mask | =
PGC_allocated)) !=3D<br>
&gt; &gt; =A0696 =A0 =A0 =A0 =A0 =A0(1 | PGC_allocated) )<br>
&gt; &gt; =A0697 =A0 =A0 =A0 =A0 goto out;<br><br></div></div></blockquote>=
<div>=A0=A0 =A0I wonder if pages have been mapped by other domains,then the=
 page-&gt;count_info will be added.I have analyzed =A0xc_map_foreign_pages(=
) function,and have not figured out how to add the=A0page-&gt;count_info by=
=A0xc_map_foreign_pages().and the=A0page-&gt;count_info decreases in munmap=
().</div>
<div>=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;=
border-left:1px #ccc solid;padding-left:1ex;"><div><div class=3D"h5">
&gt; &gt; *However*, I think that the problem Zhen is describing still exis=
ts:<br>
&gt; &gt; 1) xenpaging nominates a page, it is successful.<br>
&gt; &gt; 2) dom0 maps the same page (a process other than xenpaging, which=
 will<br>
&gt; &gt; also map it).<br>
&gt; &gt; 3) xenpaging evicts the page, successfully.<br>
&gt; &gt;<br>
&gt; &gt; I&#39;ve experienced a few nasty crashes, and I think this could =
account<br>
&gt; &gt; for a couple (but certainly not all)... I think that the solution=
 may<br>
&gt; &gt; be to repeat the refcount check in paging_evict, and roll back th=
e<br>
&gt; &gt; nomination gracefully if the race is detected. Thoughts?</div></d=
iv></blockquote><div>=A0</div><blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div cla=
ss=3D"h5">

&gt; Are there really code paths that touch a mfn without going through the=
<br>
&gt; p2m functions? If so I will copy the check and update xenpaging.<br>
<br>
</div></div>&gt;No, but there are race conditions where CPU A could to the =
p2m lookup,<br>&gt;then CPU B nominates the page and changes its p2m entry,=
 then CPU A<br>&gt;completes the mapping. =A0In the extreme case, detecting=
 this in the<br>
&gt;eviction code is also subject to the same race; some sort of atomic<br>=
&gt;lookup-and-get-reference operation seems like a better fix.<br></blockq=
uote><div><br></div><div>=A0=A0Tim , Olaf and Adin, do you have any good id=
eas about the above situation.=A0</div>
</div><br>

--0015174c0faa394e8104aee05542--


--===============1037785370==
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

--===============1037785370==--


From xen-devel-bounces@lists.xensource.com Sun Oct 09 14:35:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 14: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 1RD11Q-0000wZ-1c; Sun, 09 Oct 2011 14:35:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RD10U-0000jW-VJ
	for xen-devel@lists.xensource.com; Sun, 09 Oct 2011 14:34:03 -0700
X-Env-Sender: double-u@secretpanda.net
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318196012!41134195!1
X-Originating-IP: [178.18.19.164]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16016 invoked from network); 9 Oct 2011 21:33:32 -0000
Received: from unknown (HELO secretpanda.net) (178.18.19.164)
	by server-3.tower-27.messagelabs.com with SMTP;
	9 Oct 2011 21:33:32 -0000
Received: from localhost (176.67-241-81.adsl-dyn.isp.belgacom.be
	[81.241.67.176])
	by secretpanda.net (Postfix) with ESMTPA id BAE381467E;
	Sun,  9 Oct 2011 17:34:01 -0400 (EDT)
MIME-Version: 1.0
X-UserIsAuth: true
Received: from butters.w-gr.net ([172.16.1.1])
	by liane (JAMES SMTP Server ) with ESMTPA ID 799519500;
	Sun, 9 Oct 2011 23:34:37 +0200 (CEST)
From: Double-U <double-u@secretpanda.net>
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
Date: Sun, 9 Oct 2011 23:33:55 +0200
To: xen-devel@lists.xensource.com
Message-Id: <8E8ED498-D81D-4FA1-A817-5E481EAB3CD7@secretpanda.net>
X-Mailer: Apple Mail (2.1244.3)
Subject: [Xen-devel] VM_guest_metrics 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

Hi,

I am developing a Xen management application only using the Xen API as =
it seemed complete enough to use for the whole application, and indeed =
it is.
However, when trying to acquire a VM_guest_metrics reference (Debian, =
Xen 4.1-amd64 and Xen 4.1-i686 with XAPI) for a VM, the getter returns =
MESSAGE_METHOD_UNKNOWN and the reference isn't included in VM.get_record =
either.

That said, wouldn't it be better to make the actual memory use available =
through the VM_metrics memory_actual -- I know Xen always reserves the =
full amount of memory needed, but this also renders the variable useless =
because it'll probably resemble VM.memory_static_max if there is enough =
RAM to go around.

So the question remains: how can I, using only the Xen API, acquire VCPU =
and memory load -- preferably without the need to install anything? It =
would be rather unpleasant having to create and install some simple =
daemon just to send load numbers over to my backend.

Thank you for your time,
W=

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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 19:42:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 19:42:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RD5oc-0000a2-1K; Sun, 09 Oct 2011 19:42:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RD5nv-0000NU-Sx
	for xen-devel@lists.xensource.com; Sun, 09 Oct 2011 19:41:24 -0700
X-Env-Sender: xudong.hao@intel.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1318214456!39195628!1
X-Originating-IP: [143.182.124.21]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24996 invoked from network); 10 Oct 2011 02:40:56 -0000
Received: from mga03.intel.com (HELO mga03.intel.com) (143.182.124.21)
	by server-10.tower-27.messagelabs.com with SMTP;
	10 Oct 2011 02:40:56 -0000
Received: from azsmga002.ch.intel.com ([10.2.17.35])
	by azsmga101.ch.intel.com with ESMTP; 09 Oct 2011 19:41:19 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,514,1312182000"; d="scan'208";a="24710866"
Received: from pgsmsx601.gar.corp.intel.com ([10.221.43.69])
	by AZSMGA002.ch.intel.com with ESMTP; 09 Oct 2011 19:41:18 -0700
Received: from shsmsx601.ccr.corp.intel.com (10.239.4.112) by
	pgsmsx601.gar.corp.intel.com (10.221.43.69) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Mon, 10 Oct 2011 10:40:31 +0800
Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by
	shsmsx601.ccr.corp.intel.com ([10.239.4.112]) with mapi;
	Mon, 10 Oct 2011 10:40:30 +0800
From: "Hao, Xudong" <xudong.hao@intel.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Mon, 10 Oct 2011 10:40:29 +0800
Thread-Topic: Biweekly Xen status report. Xen:23883 & Dom0:20a27c1e2...
Thread-Index: AcyG9UeCQLGGIeD8RDOHxjX/kjg5bQ==
Message-ID: <BC00F5384FCFC9499AF06F92E8B78A9E2693B8EF16@shsmsx502.ccr.corp.intel.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] Biweekly Xen status report. Xen:23883 &
	Dom0:20a27c1e2...
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 is the test report for xen-unstable Cset #23883. 2 old bugs got fixed =
recently.=20

Version Info
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
xen-changeset:   23883:7998217630e2
pvops git:
commit 20a27c1e25b8550066902c9d6ca91631e656dfa3
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Test Environment
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
Platform		Westmere-EP(x86_64)
CPU			24
Memory		12G
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D


Fixed issues(2)
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
1. Windows2k8 guest shows blue screen when shut down
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1778
2.[Save/Restore] guest failed to reboot after L-Migration it
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1739

Old issues(6)
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
1. [ACPI] System cann't resume after do suspend
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1707
2.[XL]"xl vcpu-set" causes dom0 crash or panic
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1730
3.[VT-D]fail to detach NIC from guest
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1736
4.Dom0 crash on power-off
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1740
5.Sometimes Xen panic on ia32pae Sandybridge when restore guest
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1747
6.[VT-D] device reset fail when create/destroy guest
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1752


Best Regards,
Xudong Hao


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

From xen-devel-bounces@lists.xensource.com Sun Oct 09 21:01:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 09 Oct 2011 21:01:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RD732-0003fI-0a; Sun, 09 Oct 2011 21:01:04 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RD728-0003Ss-4b
	for xen-devel@lists.xensource.com; Sun, 09 Oct 2011 21:00:09 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1318219166!63465527!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32218 invoked from network); 10 Oct 2011 03:59:26 -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;
	10 Oct 2011 03:59:26 -0000
X-IronPort-AV: E=Sophos;i="4.68,515,1312156800"; 
   d="scan'208";a="8292394"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 04:00: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, 10 Oct 2011 05:00:04 +0100
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 1RD724-0008N8-5x;
	Mon, 10 Oct 2011 04:00:04 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RD724-0002hH-0h;
	Mon, 10 Oct 2011 05:00:04 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9236-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 10 Oct 2011 05:00:04 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9236: 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 9236 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9236/

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-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1 12 guest-localmigrate/x10       fail   like 9234
 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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  0c2bfd1f9c68
baseline version:
 xen                  0c2bfd1f9c68

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


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 Oct 10 00:35:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 00:35:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDAOX-0000s2-Cp; Mon, 10 Oct 2011 00:35:29 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDAN9-0000dS-QY
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 00:34:04 -0700
X-Env-Sender: mingo@elte.hu
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318232039!34618526!1
X-Originating-IP: [157.181.1.138]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18662 invoked from network); 10 Oct 2011 07:33:59 -0000
Received: from mx3.mail.elte.hu (HELO mx3.mail.elte.hu) (157.181.1.138)
	by server-4.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Oct 2011 07:33:59 -0000
Received: from elvis.elte.hu ([157.181.1.14])
	by mx3.mail.elte.hu with esmtp (Exim) id 1RDAMu-0005X6-T2
	from <mingo@elte.hu>; Mon, 10 Oct 2011 09:33:49 +0200
Received: by elvis.elte.hu (Postfix, from userid 1004)
	id 2BAD13E2596; Mon, 10 Oct 2011 09:33:40 +0200 (CEST)
Date: Mon, 10 Oct 2011 09:32:14 +0200
From: Ingo Molnar <mingo@elte.hu>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Subject: Re: [Xen-devel] [PATCH 00/10] [PATCH RFC V2] Paravirtualized
	ticketlocks
Message-ID: <20111010073214.GB29035@elte.hu>
References: <cover.1315878463.git.jeremy.fitzhardinge@citrix.com>
	<201109282008.17722.stephan.diestelhorst@amd.com>
	<CA+55aFwm7ESNfrHhEHrAKcjcPUq8YxtuEkJd5PzAekYo2dMYNw@mail.gmail.com>
	<2707952.s3VYcmPHUN@chlor> <4E8DE7F1.3050108@goop.org>
	<4E8DEED0.1020909@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E8DEED0.1020909@goop.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
Received-SPF: neutral (mx3: 157.181.1.14 is neither permitted nor denied by
	domain of elte.hu) client-ip=157.181.1.14;
	envelope-from=mingo@elte.hu; helo=elvis.elte.hu; 
X-ELTE-SpamScore: -2.0
X-ELTE-SpamLevel: 
X-ELTE-SpamCheck: no
X-ELTE-SpamVersion: ELTE 2.0 
X-ELTE-SpamCheck-Details: score=-2.0 required=5.9 tests=BAYES_00 autolearn=no
	SpamAssassin version=3.3.1
	-2.0 BAYES_00               BODY: Bayes spam probability is 0 to 1%
	[score: 0.0000]
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Nick Piggin <npiggin@kernel.dk>, KVM <kvm@vger.kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jan Beulich <JBeulich@suse.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stephan Diestelhorst <stephan.diestelhorst@amd.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Fitzhardinge <jeremy@goop.org> wrote:

> On 10/06/2011 10:40 AM, Jeremy Fitzhardinge wrote:
> > However, it looks like locked xadd is also has better performance:  on
> > my Sandybridge laptop (2 cores, 4 threads), the add+mfence is 20% slower
> > than locked xadd, so that pretty much settles it unless you think
> > there'd be a dramatic difference on an AMD system.
> 
> Konrad measures add+mfence is about 65% slower on AMD Phenom as well.

xadd also results in smaller/tighter code, right?

Thanks,

	Ingo

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 00:36:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 00:36:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDAPf-0001Do-75; Mon, 10 Oct 2011 00:36:39 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDAP9-00011H-Tj
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 00:36:09 -0700
X-Env-Sender: mingo@elte.hu
X-Msg-Ref: server-15.tower-21.messagelabs.com!1318232166!53838589!1
X-Originating-IP: [157.181.151.9]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7242 invoked from network); 10 Oct 2011 07:36:06 -0000
Received: from mx2.mail.elte.hu (HELO mx2.mail.elte.hu) (157.181.151.9)
	by server-15.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Oct 2011 07:36:06 -0000
Received: from elvis.elte.hu ([157.181.1.14])
	by mx2.mail.elte.hu with esmtp (Exim) id 1RDAOq-0005pw-K6
	from <mingo@elte.hu>; Mon, 10 Oct 2011 09:35:50 +0200
Received: by elvis.elte.hu (Postfix, from userid 1004)
	id DD67D3E2596; Mon, 10 Oct 2011 09:35:29 +0200 (CEST)
Date: Mon, 10 Oct 2011 09:34:05 +0200
From: Ingo Molnar <mingo@elte.hu>
To: Rusty Russell <rusty@rustcorp.com.au>
Message-ID: <20111010073405.GC29035@elte.hu>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
	<619c66d6da63aa086e2eac017e7aed216cc8ddc3.1317755691.git.jeremy.fitzhardinge@citrix.com>
	<8762k4grwy.fsf@rustcorp.com.au>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <8762k4grwy.fsf@rustcorp.com.au>
User-Agent: Mutt/1.5.21 (2010-09-15)
Received-SPF: neutral (mx2.mail.elte.hu: 157.181.1.14 is neither permitted nor
	denied by domain of elte.hu) client-ip=157.181.1.14;
	envelope-from=mingo@elte.hu; helo=elvis.elte.hu; 
X-ELTE-SpamScore: -2.0
X-ELTE-SpamLevel: 
X-ELTE-SpamCheck: no
X-ELTE-SpamVersion: ELTE 2.0 
X-ELTE-SpamCheck-Details: score=-2.0 required=5.9 tests=BAYES_00 autolearn=no
	SpamAssassin version=3.3.1
	-2.0 BAYES_00               BODY: Bayes spam probability is 0 to 1%
	[score: 0.0000]
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V3 2/8] stop_machine: make stop_machine
 safe and efficient to call early
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


* Rusty Russell <rusty@rustcorp.com.au> wrote:

> On Tue,  4 Oct 2011 12:18:03 -0700, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
> > From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> > 
> > Make stop_machine() safe to call early in boot, before stop_machine()
> > has been set up, by simply calling the callback function directly if
> > there's only one CPU online.
> 
> Not that you need this, since it's >90% Tejun's code now, but:
> 
> Acked-by: Rusty Russell <rusty@rustcorp.com.au>

hey, extra review is always useful.

Jeremy, Tejun, what's the expected merge path of these changes?

Thanks,

	Ingo

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 01:09:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 01:09:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDAvI-0003aQ-HF; Mon, 10 Oct 2011 01:09:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDArg-0003LF-1n
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 01:06:08 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1318233934!53843730!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7905 invoked from network); 10 Oct 2011 08:05:34 -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; 10 Oct 2011 08:05:34 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 10 Oct 2011 09:05:31 +0100
Message-Id: <4E92C369020000780005A68B@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 10 Oct 2011 09:05:29 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jinsong Liu" <jinsong.liu@intel.com>,
	"Yunhong Jiang" <yunhong.jiang@intel.com>
Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
References: <BC00F5384FCFC9499AF06F92E8B78A9E263B557B77@shsmsx502.ccr.corp.intel.com>
	<4E84ADF70200007800058882@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D2366A9B@shsmsx501.ccr.corp.intel.com>
	<4E858AF30200007800058A64@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D23D3B7D@shsmsx501.ccr.corp.intel.com>
In-Reply-To: <789F9655DD1B8F43B48D77C5D306597312D23D3B7D@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: "keir.xen@gmail.com" <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 08.10.11 at 10:29, "Jiang, Yunhong" <yunhong.jiang@intel.com> =
wrote:

>=20
>> -----Original Message-----
>> From: Jan Beulich [mailto:JBeulich@suse.com]=20
>> Sent: Friday, September 30, 2011 3:25 PM
>> To: Liu, Jinsong; Jiang, Yunhong
>> Cc: keir.xen@gmail.com; xen-devel@lists.xensource.com=20
>> Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
>>=20
>> >>> On 30.09.11 at 04:51, "Jiang, Yunhong" <yunhong.jiang@intel.com>
> wrote:
>>=20
>> >
>> >> -----Original Message-----
>> >> From: Jan Beulich [mailto:JBeulich@suse.com]=20
>> >> This made me look at the current source, and there I see in
>> >> mce_urgent_action()
>> >>
>> >>     if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))
>> >>         return -1;
>> >>
>> >> which I think should say ... _EIPV and use || instead. Thoughts?
>> >
>> > I think this code means, if the error happens in hypervisor mode =
(i.e.
>> > !guest_mode()), and RIPV indicate the RIP in stack can't be restarted,=

> we
>> > have to panic.
>>=20
>> Then the guest_mode() check still lacks an extra check of EIPV, like
>>=20
>>      if ( !(gstatus & MCG_STATUS_RIPV) &&
>>           (!(gstatus & MCG_STATUS_EIPV) || !guest_mode(regs)))
>>          return -1;
>>=20
>=20
> The RIPV is not related to the EIPV. RIPV means the context saved in the
> stack can't be restarted anymore. According to the SDM, RIPV means
> "execution can be restarted reliably at the instruction pointed to by =
the
> instruction pointer pushed on the stack". It's not about error happened
> synchronously or asynchronously. The point is, if the program is running =
in
> hypervisor context, and RIPV tells us that the program can't be =
restarted,
> we can't do anything but panic, because we can't switch context while we =
are
> in xen. So this code have nothing to do with EIPV.=20

I continue to disagree (including the statement in your other response):
RIPV only tells us whether we can resume, not in which context the error
occurred. EIPV tells us whether, by looking at the saved registers, we
can determine the context that the error occurred in. Since with !RIPV
we have to determine in what context the error occurred in order to
decide whether to panic or just kill a guest, we can't ignore EIPV (and if
it's not set we have to assume the worst case, since even if the
registers indicate guest mode the error may have occurred in
hypervisor context or accessing hypervisor structures [consider e.g. a
data load error during a GDT access]).

Jan


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 01:24:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 01:24:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDB9k-0004DA-PB; Mon, 10 Oct 2011 01:24:16 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDB99-00040p-Hd
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 01:23:39 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318234901!39611609!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9169 invoked from network); 10 Oct 2011 08:21:43 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 08:21:43 -0000
Received: by pzk34 with SMTP id 34so16632020pzk.8
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 01:23:34 -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=QBrctaK0X8jjeqOBQtP4SAfexf03lh8PlCLGEQUNk1k=;
	b=d5Fe9ALwVEZiEz1cmMuq3If5VC5I+AlsN5O/+jcfiqYat2v4CiIMoarPXxYAq86xhE
	p8wZqGLB1oboVg+ZoVfhOclxqio1SXIT3I1OSC40aur9lSXWguLqDxatwrwJjy+NvTMn
	gZ/58KQE3/zV7bFpjSunqzUE0my5+OSxPpSwA=
MIME-Version: 1.0
Received: by 10.68.36.105 with SMTP id p9mr21007613pbj.3.1318235014353; Mon,
	10 Oct 2011 01:23:34 -0700 (PDT)
Received: by 10.142.225.20 with HTTP; Mon, 10 Oct 2011 01:23:34 -0700 (PDT)
In-Reply-To: <20110.63052.985985.409587@mariner.uk.xensource.com>
References: <patchbomb.1317900424@loki> <dd09f32c882c9e1492b2.1317900426@loki>
	<20109.61822.25684.330705@mariner.uk.xensource.com>
	<CAPLaKK4O0ai0EwGiCfuh8k3wk9mw8H5H-vs3N70tjnf5dWkmnw@mail.gmail.com>
	<20110.63052.985985.409587@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 10:23:34 +0200
X-Google-Sender-Auth: JlYVyhpx3j6YOIR-Uy8ZgF0DLhA
Message-ID: <CAPLaKK460XdVkmo4TE1=tMtq58NJZ64yT+aMD9dbLTX6OH-wGQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 2 of 2] build: append YAJL_CLFAGS and
	YAJL_LDFLAGS to libxl build
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Ian Campbell <Ian.Campbell@eu.citrix.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

> Ah. =C2=A0I don't think the approach of only using these flags when
> compiling libxl is a good one, then, as it would build libxl against
> these putative old Xen headers.
>
> I think the problem then is that the ordering of the various -I and -L
> options is wrong. =C2=A0The EXTRA_* should come near the end, after all o=
f
> the -I and -L specified by the build system to refer to other parts of
> the Xen tree.
>
> Would you like to look into how to make that work :-) ?

I've took a look at how EXTRA_LIB and EXTRA_INCLUDES are handled, and
found that they are appended to CFLAGS and LDFLAGS, so it's mostly the
same using CFLAGS or EXTRA_INCLUDES. The best way I've come up to
solve this is to modify each makefile and append EXTRA_LIB and
EXTRA_INCLUDES at the end, but this means modifying a lot of
makefiles. What do you think?

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 Oct 10 01:55:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 01:55:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDBdn-0005y0-Km; Mon, 10 Oct 2011 01:55:19 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDBcj-0005l1-77
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 01:54:13 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-5.tower-27.messagelabs.com!1318236827!48382542!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 508 invoked from network); 10 Oct 2011 08:53:47 -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; 10 Oct 2011 08:53:47 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RDBce-0008Is-UG; Mon, 10 Oct 2011 08:54:08 +0000
Date: Mon, 10 Oct 2011 09:54:08 +0100
From: Tim Deegan <tim@xen.org>
To: Hyo J Lee <hyo747@gmail.com>
Subject: Re: [Xen-devel] nested xen on domU?
Message-ID: <20111010085408.GA31800@ocelot.phlegethon.org>
References: <3DDB718A-0E09-486A-810D-05DF7D790C22@gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <3DDB718A-0E09-486A-810D-05DF7D790C22@gmail.com>
User-Agent: Mutt/1.4.2.1i
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

Hi, 

At 14:10 -0400 on 04 Oct (1317737419), Hyo J Lee wrote:
> I wonder if there's any way that I can do nested xen on domU not dom0.
> This is what I plan.
> 
>             | dom0_T| |domU1_T| |domU2_T|
>             ----------------------------- (domU1_B)
> |dom0_B|    |       xen top             |
> -----------------------------------------
> |             xen bottom                |
> 

Yes, this is exactly how nested HVM is meant to work.  You should e
aware that the feature is still experimental, and performance will not
be so great (but better on AMD than on Intel).

Tim.



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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 02:22:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 02:22:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDC3n-0006qp-Kz; Mon, 10 Oct 2011 02:22:11 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDC2w-0006e9-1m
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 02:21:18 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-4.tower-21.messagelabs.com!1318238436!63503052!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31882 invoked from network); 10 Oct 2011 09:20:36 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-4.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Oct 2011 09:20:36 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RDC2p-0008Mi-JQ; Mon, 10 Oct 2011 09:21:11 +0000
Date: Mon, 10 Oct 2011 10:21:11 +0100
From: Tim Deegan <tim@xen.org>
To: Andres Lagar Cavilla <andres@lagarcavilla.org>
Message-ID: <20111010092111.GB31800@ocelot.phlegethon.org>
References: <CADzFZPsJ2--PQCVH1QGJ-L1q5k4bokBrZeaaAt=BSD7QU9cbOA@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CADzFZPsJ2--PQCVH1QGJ-L1q5k4bokBrZeaaAt=BSD7QU9cbOA@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Cc: Olaf Hering <olaf@aepfle.de>, xen-devel@lists.xensource.com,
	zhen shi <bickys1986@gmail.com>, Adin Scannell <adin@gridcentric.ca>
Subject: [Xen-devel] Re: Re: mapping problems in 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

At 21:20 -0400 on 09 Oct (1318195224), Andres Lagar Cavilla wrote:
> I have a proposal. I'd like to hear from the list what they think.
> 
> - 1. change p2m lock to a read/write lock
> - 2. Make lookups (gfn_to_mfn_* family) take a read lock. All current
> callers of p2m_lock will become write lockers.
> - 3. Change the gfn_to_mfn_* family to get_page on the mfn obtained,
> while holding the read lock.
> - 4. Have all lookup callers put_page on the obtained mfn, once done.

This seems like a step in the right direction, but if we're going to
make this big an interface change there might be better interfaces to
end up with.

A few issues I can see with it:
 - p2m lookups are on some very performance-sensitive paths
   (e.g. multiple times in any pagetable walk or instruction emulation
   in a HVM guest) so adding the rwlock might have a noticeable impact.

 - This fixes one class of races (page gets freed-to-xen underfoot) but
   leaves another one (gfn -> mfn map changes underfoot) untouched.  In
   particular it doesn't solve the race where a foreign mapper 
   gets a r/w map of what's meant to be a read-only frame.

I think that to fix things properly we need to have some refcount
associated with the p2m mapping itself.  That would be taken by all
lookups (or at least some - we could have a flag to the p2m lookup) and
released as you suggest, but more importantly it would block all p2m changes
while the count was raised.  (I think that a least in the common case we
could encode such a refcount using the existing typecount).

One problem then is how to make all the callers of the p2m update
functions handle failure, either by waiting (new deadlock risk?) or
returning EAGAIN at the hypercall interface.  Paths where the update
isn't caused by an explicit request (like log-dirty and the mem-event
rx-to-rw conversion) would be particularly tricky.  

More seriously, it introduces another round of the sort of priority
inversion we already get with the existing refcounts - a foreign
mapping, caused by a user-space program in another VM, could arbitrarily
delay a p2m update (and so prevent a VCPU from making progress), without
any mechanism to even request that the mapping be removed.

Any ideas how to avoid that?  Potentially with some extra bookkeeping on
foreign mappings we could revoke or redirect them when the p2m changes.
That would fit nicely with the abstraction in the interfaces where HVM
domains' memory is always indexed by pfn.  I can imagine it being quite
tricky though.

> I'm more wary that turning p2m locking into read/write will result in
> code deadlocking itself: taking a read lock first and a write lock
> later. Possibly the current rwlock implementation could be improved to
> keep a cpumask of read-lockers, and provide an atomic "promote from
> read to write" atomic operation (something along the lines of wait
> until you're the only reader in the cpumask, and then cmpxchg(lock,
> -1, WRITE_BIAS))

I think that would deadlock if two cpus tried it at once.

Tim.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 03:07:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 03:07:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDCm5-0008AW-UC; Mon, 10 Oct 2011 03:07:58 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDCkT-0007xS-C9
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 03:06:35 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318241163!40948811!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23608 invoked from network); 10 Oct 2011 10:06:03 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 10:06:03 -0000
Received: by wyh13 with SMTP id 13so7735328wyh.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 03:06:13 -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=t4pTkn9GVWOaVyFQRUR0AeF4XcqJmh3QzY7jLq0qsu8=;
	b=J6p4FsPyeDn0xWro+iTn6yWuwySOX/BxweiTARlMDNSJ1qiKj2UvRHy5F5ZhcNpDVA
	Ry79AOOqKWLd3RcL4kkN2NgCPD82QhD51Vkz/bwKbU8R5DJnKMMBOLPFfn38yBUTT4Zb
	qiCBipFDqqp7qpe0kLOITxspMiJRkdD0h59c0=
Received: by 10.216.190.131 with SMTP id e3mr6240716wen.48.1318241173752;
	Mon, 10 Oct 2011 03:06:13 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id p2sm31900965wbo.17.2011.10.10.03.06.08
	(version=SSLv3 cipher=OTHER); Mon, 10 Oct 2011 03:06:12 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Mon, 10 Oct 2011 11:06:02 +0100
Subject: Re: [Xen-devel] Re: Re: mapping problems in xenpaging
From: Keir Fraser <keir.xen@gmail.com>
To: Tim Deegan <tim@xen.org>,
	Andres Lagar Cavilla <andres@lagarcavilla.org>
Message-ID: <CAB8821A.2291B%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] Re: Re: mapping problems in xenpaging
Thread-Index: AcyHNDcj60+WNXNrK0uZ9zGSoYCFSw==
In-Reply-To: <20111010092111.GB31800@ocelot.phlegethon.org>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: Olaf Hering <olaf@aepfle.de>, xen-devel@lists.xensource.com,
	zhen shi <bickys1986@gmail.com>, Adin Scannell <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 10/10/2011 10:21, "Tim Deegan" <tim@xen.org> wrote:

> At 21:20 -0400 on 09 Oct (1318195224), Andres Lagar Cavilla wrote:
>> I have a proposal. I'd like to hear from the list what they think.
>> 
>> - 1. change p2m lock to a read/write lock
>> - 2. Make lookups (gfn_to_mfn_* family) take a read lock. All current
>> callers of p2m_lock will become write lockers.
>> - 3. Change the gfn_to_mfn_* family to get_page on the mfn obtained,
>> while holding the read lock.
>> - 4. Have all lookup callers put_page on the obtained mfn, once done.
> 
> This seems like a step in the right direction, but if we're going to
> make this big an interface change there might be better interfaces to
> end up with.
> 
> A few issues I can see with it:
>  - p2m lookups are on some very performance-sensitive paths
>    (e.g. multiple times in any pagetable walk or instruction emulation
>    in a HVM guest) so adding the rwlock might have a noticeable impact.

If the read sections are short, may as well use a plain spinlock.

The best (but hard) way to make the locking cheaper is to work out a way to
use finer-grained locks (e.g., per-page / per-mapping) or avoid locks
altogether (e.g., RCU).

Multi-reader locks are rarely going to be a good choice in the hypervisor.

A good first step anyhow would be to make the p2m_ synchronisation correct,
and then optimise it. Sounds like that is hard enough. :-)

 -- Keir

>  - This fixes one class of races (page gets freed-to-xen underfoot) but
>    leaves another one (gfn -> mfn map changes underfoot) untouched.  In
>    particular it doesn't solve the race where a foreign mapper
>    gets a r/w map of what's meant to be a read-only frame.
> 
> I think that to fix things properly we need to have some refcount
> associated with the p2m mapping itself.  That would be taken by all
> lookups (or at least some - we could have a flag to the p2m lookup) and
> released as you suggest, but more importantly it would block all p2m changes
> while the count was raised.  (I think that a least in the common case we
> could encode such a refcount using the existing typecount).
> 
> One problem then is how to make all the callers of the p2m update
> functions handle failure, either by waiting (new deadlock risk?) or
> returning EAGAIN at the hypercall interface.  Paths where the update
> isn't caused by an explicit request (like log-dirty and the mem-event
> rx-to-rw conversion) would be particularly tricky.
> 
> More seriously, it introduces another round of the sort of priority
> inversion we already get with the existing refcounts - a foreign
> mapping, caused by a user-space program in another VM, could arbitrarily
> delay a p2m update (and so prevent a VCPU from making progress), without
> any mechanism to even request that the mapping be removed.
> 
> Any ideas how to avoid that?  Potentially with some extra bookkeeping on
> foreign mappings we could revoke or redirect them when the p2m changes.
> That would fit nicely with the abstraction in the interfaces where HVM
> domains' memory is always indexed by pfn.  I can imagine it being quite
> tricky though.
> 
>> I'm more wary that turning p2m locking into read/write will result in
>> code deadlocking itself: taking a read lock first and a write lock
>> later. Possibly the current rwlock implementation could be improved to
>> keep a cpumask of read-lockers, and provide an atomic "promote from
>> read to write" atomic operation (something along the lines of wait
>> until you're the only reader in the cpumask, and then cmpxchg(lock,
>> -1, WRITE_BIAS))
> 
> I think that would deadlock if two cpus tried it at once.
> 
> Tim.
> 
> _______________________________________________
> 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 Oct 10 03:20:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 03:20:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDCxx-0000FJ-JL; Mon, 10 Oct 2011 03:20:13 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDCx0-0008UD-VT
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 03:19:15 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318241922!58486406!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26374 invoked from network); 10 Oct 2011 10:18:42 -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;
	10 Oct 2011 10:18:42 -0000
X-IronPort-AV: E=Sophos;i="4.68,516,1312156800"; 
   d="scan'208";a="8298189"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 10:19: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; Mon, 10 Oct 2011 11:19:11 +0100
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
	1RDCwx-000207-Aq; Mon, 10 Oct 2011 10:19:11 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RDCwx-00016t-2k;
	Mon, 10 Oct 2011 11:19:11 +0100
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: <20114.50842.798048.685817@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 11:19:06 +0100
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key.
In-Reply-To: <1318011887.13747.0.camel@dagon.hellion.org.uk>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-2-git-send-email-anthony.perard@citrix.com>
	<1317990495.21903.331.camel@zakaz.uk.xensource.com>
	<20111.14455.269057.812001@mariner.uk.xensource.com>
	<1318011887.13747.0.camel@dagon.hellion.org.uk>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Anthony Perard <anthony.perard@citrix.com>,
	Xen Devel <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

Ian Campbell writes ("Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key."):
> Do you think /libxl/$domid is a good idea then or do you have somewhere
> else in mind?

/libxl/$domid is fine I think.  We need a clear rule that nothing
other than libxl will ever be expected to look there, so it's entirely
a private path and does not ever form part of any API.

Ian.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 03:25:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 03:25:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDD3C-0000gl-H4; Mon, 10 Oct 2011 03:25:38 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDD2i-0000UO-4V
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 03:25:08 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1318242304!19817990!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19868 invoked from network); 10 Oct 2011 10:25:04 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 10:25:04 -0000
X-IronPort-AV: E=Sophos;i="4.68,516,1312156800"; 
   d="scan'208";a="8298350"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 10:25: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, 10 Oct 2011 11:25:04 +0100
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
	1RDD2e-00022H-45; Mon, 10 Oct 2011 10:25:04 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RDD2e-0001D5-3C;
	Mon, 10 Oct 2011 11:25:04 +0100
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: <20114.51200.87383.294193@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 11:25:04 +0100
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
In-Reply-To: <4E8F7D13.1040409@tycho.nsa.gov>
References: <patchbomb.1317313227@localhost.localdomain>
	<50cd0fd187b39a263680.1317313232@localhost.localdomain>
	<4E8F660C.4010405@tycho.nsa.gov>
	<1318023688.13747.28.camel@dagon.hellion.org.uk>
	<4E8F7D13.1040409@tycho.nsa.gov>
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>
Subject: [Xen-devel] Re: [PATCH] libxlu: correctly parse disk "backendtype"
	field
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 ("Re: [PATCH] libxlu: correctly parse disk "backendtype" field"):
> On 10/07/2011 05:41 PM, Ian Campbell wrote:
> > On Fri, 2011-10-07 at 21:50 +0100, Daniel De Graaf wrote:
> >> The expression for backendtype was missing a comma.

Good catch, thanks.

> > This appears correct even though things seem to work without, at least:

Daniel's fix is correct.  Without the ",?", the "backendtype=..."
match would not eat the trailing comma.  The comma would then be
matched by the positional parameter rule, with effects ranging from
unhelpful to fatal.  Ie, it would parse as if you'd written
   backendtype=<something>,,vdev=<blah>
etc.

> > (we need a signed-off-by I suspect)

Thanks, yes.

> 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>

Ian.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 03:29:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 03:29:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDD6h-00016b-UC; Mon, 10 Oct 2011 03:29:16 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDD5r-0000tc-6y
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 03:28:23 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1318242499!34623009!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14797 invoked from network); 10 Oct 2011 10:28:19 -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 Oct 2011 10:28:19 -0000
X-IronPort-AV: E=Sophos;i="4.68,516,1312156800"; 
   d="scan'208";a="8298443"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 10:28: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;
	Mon, 10 Oct 2011 11:28:19 +0100
Subject: Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Mon, 10 Oct 2011 11:28:18 +0100
In-Reply-To: <20114.50842.798048.685817@mariner.uk.xensource.com>
References: <1317989418-25463-1-git-send-email-anthony.perard@citrix.com>
	<1317989418-25463-2-git-send-email-anthony.perard@citrix.com>
	<1317990495.21903.331.camel@zakaz.uk.xensource.com>
	<20111.14455.269057.812001@mariner.uk.xensource.com>
	<1318011887.13747.0.camel@dagon.hellion.org.uk>
	<20114.50842.798048.685817@mariner.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: <1318242499.21903.389.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Anthony Perard <anthony.perard@citrix.com>,
	Xen Devel <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, 2011-10-10 at 11:19 +0100, Ian Jackson wrote:
> Ian Campbell writes ("Re: [Xen-devel] [PATCH 1/7] libxl, Introduce dm-version xenstore key."):
> > Do you think /libxl/$domid is a good idea then or do you have somewhere
> > else in mind?
> 
> /libxl/$domid is fine I think.  We need a clear rule that nothing
> other than libxl will ever be expected to look there, so it's entirely
> a private path and does not ever form part of any API.

Agreed, this includes toolstacks using libxl accessing directly also.

If we come up with a valid reason for toolstacks to store stuff in
xenstore then libxl can provide a user-data style interface to mediate
this use.

The permissions should be such that only the toolstack domain can access
it.

Ian.


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 03:40:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 03:40:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDDHt-0001mx-B6; Mon, 10 Oct 2011 03:40:49 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDDHK-0001Xz-MV
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 03:40:15 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318243211!34618825!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10206 invoked from network); 10 Oct 2011 10:40:11 -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;
	10 Oct 2011 10:40:11 -0000
X-IronPort-AV: E=Sophos;i="4.68,516,1312156800"; 
   d="scan'208";a="8298696"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 10:40: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; Mon, 10 Oct 2011 11:40:11 +0100
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
	1RDDHH-00027O-33; Mon, 10 Oct 2011 10:40:11 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RDDHH-0001E0-2E;
	Mon, 10 Oct 2011 11:40:11 +0100
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: <20114.52106.901431.37870@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 11:40:10 +0100
To: Roger Pau =?iso-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH 2 of 2] build: append YAJL_CLFAGS and
	YAJL_LDFLAGS to libxl build
In-Reply-To: <CAPLaKK460XdVkmo4TE1=tMtq58NJZ64yT+aMD9dbLTX6OH-wGQ@mail.gmail.com>
References: <patchbomb.1317900424@loki> <dd09f32c882c9e1492b2.1317900426@loki>
	<20109.61822.25684.330705@mariner.uk.xensource.com>
	<CAPLaKK4O0ai0EwGiCfuh8k3wk9mw8H5H-vs3N70tjnf5dWkmnw@mail.gmail.com>
	<20110.63052.985985.409587@mariner.uk.xensource.com>
	<CAPLaKK460XdVkmo4TE1=tMtq58NJZ64yT+aMD9dbLTX6OH-wGQ@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 2 of 2] build: append YAJL_CLFAGS and YAJL_LDFLAGS to libxl build"):
> I've took a look at how EXTRA_LIB and EXTRA_INCLUDES are handled, and
> found that they are appended to CFLAGS and LDFLAGS, so it's mostly the
> same using CFLAGS or EXTRA_INCLUDES. The best way I've come up to
> solve this is to modify each makefile and append EXTRA_LIB and
> EXTRA_INCLUDES at the end, but this means modifying a lot of
> makefiles. What do you think?

I'm not convinced that we should change the semantics of existing
variables, even if they are rather misnamed.

In principle changing every Makefile for this is a possibility but
we'd have to think properly about exactly what the global change
should be.

To me the most obvious possibility would be to modify the pattern
rule for compilation (tools/Rules.mk) to add a new variable at the end
of the compilation lines, just after "-o $@".

AFAICT link lines would indeed need a change to each one.

What should the new variables be called ?

 FINAL_CFLAGS_COMPILE
 FINAL_CFLAGS_LINK

?

Ian.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 04:05:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 04:05:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDDfk-0002dY-KX; Mon, 10 Oct 2011 04:05:28 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDDcd-0002MX-6F
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 04:03:05 -0700
X-Env-Sender: Stephan.Diestelhorst@amd.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1318244512!47549150!1
X-Originating-IP: [213.199.154.208]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22563 invoked from network); 10 Oct 2011 11:01:52 -0000
Received: from am1ehsobe005.messaging.microsoft.com (HELO
	AM1EHSOBE005.bigfish.com) (213.199.154.208)
	by server-8.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	10 Oct 2011 11:01:52 -0000
Received: from mail38-am1-R.bigfish.com (10.3.201.246) by
	AM1EHSOBE005.bigfish.com (10.3.204.25) with Microsoft SMTP Server id
	14.1.225.22; Mon, 10 Oct 2011 11:02:10 +0000
Received: from mail38-am1 (localhost.localdomain [127.0.0.1])	by
	mail38-am1-R.bigfish.com (Postfix) with ESMTP id D27CE12B02A3;
	Mon, 10 Oct 2011 11:02:09 +0000 (UTC)
X-SpamScore: -14
X-BigFish: VPS-14(zzbb2dK9371K1432N98dKzz1202hzzz32i668h839h944h61h)
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 mail38-am1 (localhost.localdomain [127.0.0.1]) by mail38-am1
	(MessageSwitch) id 1318244468975328_9273;
	Mon, 10 Oct 2011 11:01:08 +0000 (UTC)
Received: from AM1EHSMHS016.bigfish.com (unknown [10.3.201.246])	by
	mail38-am1.bigfish.com (Postfix) with ESMTP id DDEA21C30056;
	Mon, 10 Oct 2011 11:01:08 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	AM1EHSMHS016.bigfish.com (10.3.207.154) with Microsoft SMTP Server id
	14.1.225.22; Mon, 10 Oct 2011 11:01:00 +0000
X-WSS-ID: 0LSUJXH-02-382-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 2EF65C80D2;	Mon, 10 Oct 2011 06:00:52 -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;
	Mon, 10 Oct 2011 06:00:59 -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;
	Mon, 10 Oct 2011 06:00:55 -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; Mon, 10 Oct 2011
	07:00:54 -0400
Received: from d-allen.localnet (unknown [10.224.148.7])	by gwo.osrc.amd.com
	(Postfix) with ESMTP id 1D12B49C1F1;
	Mon, 10 Oct 2011 12:00:52 +0100 (BST)
From: Stephan Diestelhorst <stephan.diestelhorst@amd.com>
To: <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] [PATCH 00/10] [PATCH RFC V2] Paravirtualized
	ticketlocks
Date: Mon, 10 Oct 2011 13:00:50 +0200
Message-ID: <2523929.AGG4U997NO@d-allen>
Organization: AMD OSRC
User-Agent: KMail/4.7.1 (Linux/3.0.4-030004-generic; KDE/4.7.1; x86_64; ; )
In-Reply-To: <4E8DE7F1.3050108@goop.org>
References: <cover.1315878463.git.jeremy.fitzhardinge@citrix.com>
	<2707952.s3VYcmPHUN@chlor> <4E8DE7F1.3050108@goop.org>
MIME-Version: 1.0
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"
X-OriginatorOrg: amd.com
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>, Andi,
	Nick Piggin <npiggin@kernel.dk>, KVM <kvm@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>, maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jan Beulich <JBeulich@suse.com>, "H. Peter Anvin" <hpa@zytor.com>, the,
	Linus Torvalds <torvalds@linux-foundation.org>, Ingo Molnar <mingo@elte.hu>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 06 October 2011, 13:40:01 Jeremy Fitzhardinge wrote:
> On 10/06/2011 07:04 AM, Stephan Diestelhorst wrote:
> > On Wednesday 28 September 2011, 14:49:56 Linus Torvalds wrote:
> >> Which certainly should *work*, but from a conceptual standpoint, isn't
> >> it just *much* nicer to say "we actually know *exactly* what the upper
> >> bits were".
> > Well, we really do NOT want atomicity here. What we really rather want
> > is sequentiality: free the lock, make the update visible, and THEN
> > check if someone has gone sleeping on it.
> >
> > Atomicity only conveniently enforces that the three do not happen in a
> > different order (with the store becoming visible after the checking
> > load).
> >
> > This does not have to be atomic, since spurious wakeups are not a
> > problem, in particular not with the FIFO-ness of ticket locks.
> >
> > For that the fence, additional atomic etc. would be IMHO much cleaner
> > than the crazy overflow logic.
> 
> All things being equal I'd prefer lock-xadd just because its easier to
> analyze the concurrency for, crazy overflow tests or no.  But if
> add+mfence turned out to be a performance win, then that would obviously
> tip the scales.
> 
> However, it looks like locked xadd is also has better performance:  on
> my Sandybridge laptop (2 cores, 4 threads), the add+mfence is 20% slower
> than locked xadd, so that pretty much settles it unless you think
> there'd be a dramatic difference on an AMD system.

Indeed, the fences are usually slower than locked RMWs, in particular,
if you do not need to add an instruction. I originally missed that
amazing stunt the GCC pulled off with replacing the branch with carry
flag magic. It seems that two twisted minds have found each other
here :)

One of my concerns was adding a branch in here... so that is settled,
and if everybody else feels like this is easier to reason about...
go ahead :) (I'll keep my itch to myself then.)

Stephan
-- 
Stephan Diestelhorst, AMD Operating System Research Center
stephan.diestelhorst@amd.com, Tel. +49 (0)351 448 356 719

Advanced Micro Devices GmbH
Einsteinring 24
85609 Aschheim
Germany

Geschaeftsfuehrer: Alberto Bozzo;
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632, WEEE-Reg-Nr: DE 12919551 


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 04:12:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 04:12:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDDmn-0003Iy-Q0; Mon, 10 Oct 2011 04:12:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDDkA-00033b-Ls
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 04:11:52 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1318244978!43802369!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23365 invoked from network); 10 Oct 2011 11:09:38 -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;
	10 Oct 2011 11:09:38 -0000
X-IronPort-AV: E=Sophos;i="4.68,516,1312156800"; 
   d="scan'208";a="8299493"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 11:09: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; Mon, 10 Oct 2011 12:09:58 +0100
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
	1RDDk6-0002HO-0F; Mon, 10 Oct 2011 11:09:58 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RDDk5-0001Xl-Vi;
	Mon, 10 Oct 2011 12:09:57 +0100
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: <20114.53893.970136.218539@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 12:09:57 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3 of 3] libxl: add emacs local variables block
	to turn on four space indentation
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <0925bc3120d1f6474f23.1317996525@cosworth.uk.xensource.com>
References: <patchbomb.1317996522@cosworth.uk.xensource.com>
	<0925bc3120d1f6474f23.1317996525@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 3 of 3] libxl: add emacs local variables block to turn on four space indentation"):
> libxl: add emacs local variables block to turn on four space indentation

FYI Emacs 23 has a new ".dir-locals.el" feature, but I think we should
wait a while before starting to use it.

The rest of this series looks OK to me.  I'll see if I can apply the
other things in the libxl queue first though.

Ian.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 04:34:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 04:34:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDE7k-0004lU-2R; Mon, 10 Oct 2011 04:34:24 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDE6w-0004Yz-5V
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 04:33:34 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1318246410!21640837!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7483 invoked from network); 10 Oct 2011 11:33:31 -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;
	10 Oct 2011 11:33:31 -0000
X-IronPort-AV: E=Sophos;i="4.68,517,1312156800"; 
   d="scan'208";a="8300091"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 11:33: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; Mon, 10 Oct 2011 12:33:30 +0100
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
	1RDE6s-0002PS-0Y; Mon, 10 Oct 2011 11:33:30 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RDE6r-0001Z3-W1;
	Mon, 10 Oct 2011 12:33:29 +0100
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: <20114.55305.982229.786791@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 12:33:29 +0100
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH] xenpaging: clear page content after evict
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <f67616df0e0891ddddba.1318058133@probook.site>
References: <f67616df0e0891ddddba.1318058133@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: clear page content after evi> xenpaging: clear page content after evict
> 
> If the guest happens to read from the gfn while xenpaging is in the process of
> evicting the page, the guest may read zeros instead of actual data.
> Also if eviction fails the page content will be corrupted and xenpaging wont
> attempt to restore the page.

As far as the tools are concerned,

Acked-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 Mon Oct 10 04:35:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 04:35:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDE93-0005AA-5O; Mon, 10 Oct 2011 04:35:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDE70-0004Z7-UT; Mon, 10 Oct 2011 04:33:39 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318246388!52158271!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28633 invoked from network); 10 Oct 2011 11:33:08 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 11:33:08 -0000
Received: by wyh13 with SMTP id 13so7839423wyh.30
	for <multiple recipients>; Mon, 10 Oct 2011 04:33:35 -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=mXcKC53GKi6eZ5QkbxtIsgndLh3jeqeT0vH16geG7ug=;
	b=moN+TZPsfE1YcYici6K4HzP5Um1nt5u4r0g4XkfP5bt1ANoVj31TKuChNfzf1KKm06
	swT6Pk6hh36eZ+8dsSkFuxE4JEvtZ7jXgad8x14YXzuCFpYlMBmlrCu53T27Za549Chx
	dYlVcvy2GAnWxcb8GUX2rmRb1JPc4gLTnPWnM=
Received: by 10.216.137.13 with SMTP id x13mr4285945wei.52.1318246415373;
	Mon, 10 Oct 2011 04:33:35 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id fj1sm28376856wbb.13.2011.10.10.04.33.33
	(version=SSLv3 cipher=OTHER); Mon, 10 Oct 2011 04:33:34 -0700 (PDT)
Message-ID: <4E92D809.9000504@xen.org>
Date: Mon, 10 Oct 2011 12:33:29 +0100
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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Xen document day (Oct 12 or 26)
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org>
	<20111003185309.GC15608@phenom.oracle.com>
In-Reply-To: <20111003185309.GC15608@phenom.oracle.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
Cc: Joseph Glanville <joseph.glanville@orionvm.com.au>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Looks like me being maxed out means we are too close to Oct 12th now. 
Does anybody object to doing this on the 26th?

How long will the day be? An afternoon? A whole day with rolling 
time-zones?

 > In lots of ways. There is a lot of things that we want to do - but I 
don't think we can do
 > _all_ of them. Can you help us determine what ought to have a higher 
priority?
In a nutshell:
- We should focus on some of the shortfalls we identified at the Hackathon
   (CLI guides, man pages, etc.)?
- We should also do a quick Wiki sanity check (i.e. identify important 
pages, which are wrong)
   I can help guide this

Maybe we can split into two groups
Lars

On 03/10/2011 19:53, Konrad Rzeszutek Wilk wrote:
> On Fri, Sep 30, 2011 at 12:36:23PM +0100, Lars Kurth wrote:
>> Let me know, which date you agreed on. We could do a poll.
> Please do a pool. I posted two dates, but other ones could work as well.
>
>> We should publish on the blog a bit before.
> Ok.
>> Also, how can I help?
> In lots of ways. There is a lot of things that we want to do - but
> I don't think we can do _all_ of them. Can you help us determine what
> ought to have a higher priority?
>
>
>> Regards
>> Lars
>>
>> On 29/09/2011 15:22, Joseph Glanville wrote:
>>> On 30 September 2011 00:13, Pasi Kärkkäinen<pasik@iki.fi
>>> <mailto:pasik@iki.fi>>  wrote:
>>>
>>>     On Thu, Sep 22, 2011 at 09:06:18AM -0400, Konrad Rzeszutek Wilk wrote:
>>>     >  Part of what we brainstormed at Xen Hackathon was what we could
>>>     do make Xen easier.
>>>     >
>>>     >  And the one thing that seemed to surface up was making the docs
>>>     better - either
>>>     >  be the Wiki or the three .pdfs that get created/shipped with Xen.
>>>     >
>>>     >  One thought was to come up with a Documention Day - where
>>>     volunteers would try to
>>>     >  fix up some portion of the documentation that they feel they have
>>>     >  a good grasp of knowledge off and are willing to change (and
>>>     also look
>>>     >  to be incorrect)
>>>     >
>>>     >  What do you guys think of Oct 12th or Oct 26 as a day for this?
>>>     >
>>>     >  And then the next question - what page/pdf section interests you?
>>>     >
>>>     >  http://bits.xensource.com/Xen/docs/user.pdf
>>>     >  http://www.rites.uic.edu/~solworth/xenInterfaceManual.pdf
>>>     <http://www.rites.uic.edu/%7Esolworth/xenInterfaceManual.pdf>  [the
>>>     one on Xen.org is an older version]
>>>     >
>>>     >  Or Wiki pages:
>>>     >  http://wiki.xensource.com/xenwiki/
>>>     >
>>>     >  http://wiki.xensource.com/xenwiki/XenDom0Kernels
>>>     >  http://wiki.xensource.com/xenwiki/XenSerialConsole
>>>     >  http://wiki.xensource.com/xenwiki/XenParavirtOps
>>>     >  http://wiki.xensource.com/xenwiki/XenCommonProblems
>>>     >
>>>     >  http://wiki.xensource.com/xenwiki/Consulting
>>>     >  http://wiki.xensource.com/xenwiki/Consultants
>>>     >  http://wiki.xensource.com/xenwiki/VpsHostingWithXen
>>>     >
>>>     >  http://wiki.xen.org/xenwiki/XenPCIpassthrough
>>>     >  http://wiki.xen.org/xenwiki/VTdHowTo
>>>     >
>>>
>>>     Some more related pages:
>>>     http://wiki.xen.org/xenwiki/Xen4.0
>>>     http://wiki.xen.org/xenwiki/Xen4.1
>>>     http://wiki.xen.org/xenwiki/XenKernelFeatures
>>>     http://wiki.xen.org/xenwiki/XenBestPractices
>>>     http://wiki.xen.org/xenwiki/XenHypervisorBootOptions
>>>
>>>     Also there's something completely new that we should document:
>>>     How to install Xen VMs! which means document all the relevant methods:
>>>     boot the native distro installer as PV guest, as HVM guest,
>>>     xen-tools, virt-install,
>>>     debootstrap, rpmstart, etc..
>>>
>>>     That's something people ask about very often..
>>>
>>> Agreed.
>>>
>>> After working through a bunch of the pages I think we are going to
>>> have to have a realtime collab session to decide on some way of
>>> reorganising everything into categories.
>>>
>>>
>>>
>>>     -- Pasi
>>>
>>>
>>>     _______________________________________________
>>>     Xen-devel mailing list
>>>     Xen-devel@lists.xensource.com<mailto:Xen-devel@lists.xensource.com>
>>>     http://lists.xensource.com/xen-devel
>>>
>>>
>>>
>>>
>>> -- 
>>> */
>>> Founder | Director | VP Research
>>> Orion Virtualisation Solutions/* | www.orionvm.com.au
>>> <http://www.orionvm.com.au/>  | Phone: 1300 56 99 52 | Mobile: 0428
>>> 754 846
>>>
>>>
>>> _______________________________________________
>>> 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 Oct 10 05:37:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 05:37:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDF6z-0007NP-Jy; Mon, 10 Oct 2011 05:37:41 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDF5v-00079E-DD
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 05:36:36 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318250192!397812!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2344 invoked from network); 10 Oct 2011 12:36:32 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Oct 2011 12:36:32 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 10 Oct 2011 13:36:31 +0100
Message-Id: <4E9302EA020000780005A752@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 10 Oct 2011 13:36:26 +0100
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: Daniel Stodden <daniel.stodden@citrix.com>
Subject: [Xen-devel] [PATCH] linux-2.6.18/blkback: Don't let in-flight
	requests defer pending ones
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Running RING_FINAL_CHECK_FOR_REQUESTS from make_response is a bad
idea. It means that in-flight I/O is essentially blocking continued
batches. This essentially kills throughput on frontends which unplug
(or even just notify) early and rightfully assume additional requests
will be picked up on time, not synchronously.=20

Saw cache writeback going up from 45MB/s top 65MB/s for xen-blkfront
on ISCSI.

Signed-off-by: Daniel Stodden <daniel.stodden@citrix.com>

--- a/drivers/xen/blkback/blkback.c
+++ b/drivers/xen/blkback/blkback.c
@@ -351,7 +351,7 @@ irqreturn_t blkif_be_int(int irq, void *
  * DOWNWARD CALLS -- These interface with the block-device layer proper.
  */
=20
-static int do_block_io_op(blkif_t *blkif)
+static int _do_block_io_op(blkif_t *blkif)
 {
 	blkif_back_rings_t *blk_rings =3D &blkif->blk_rings;
 	blkif_request_t req;
@@ -432,6 +432,23 @@ static int do_block_io_op(blkif_t *blkif
 	return more_to_do;
 }
=20
+static int
+do_block_io_op(blkif_t *blkif)
+{
+	blkif_back_rings_t *blk_rings =3D &blkif->blk_rings;
+	int more_to_do;
+
+	do {
+		more_to_do =3D _do_block_io_op(blkif);
+		if (more_to_do)
+			break;
+
+		RING_FINAL_CHECK_FOR_REQUESTS(&blk_rings->common, =
more_to_do);
+	} while (more_to_do);
+
+	return more_to_do;
+}
+
 static void dispatch_rw_block_io(blkif_t *blkif,
 				 blkif_request_t *req,
 				 pending_req_t *pending_req)
@@ -641,7 +658,6 @@ static void make_response(blkif_t *blkif
 	blkif_response_t  resp;
 	unsigned long     flags;
 	blkif_back_rings_t *blk_rings =3D &blkif->blk_rings;
-	int more_to_do =3D 0;
 	int notify;
=20
 	resp.id        =3D id;
@@ -668,22 +684,8 @@ static void make_response(blkif_t *blkif
 	}
 	blk_rings->common.rsp_prod_pvt++;
 	RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&blk_rings->common, notify);
-	if (blk_rings->common.rsp_prod_pvt =3D=3D blk_rings->common.req_con=
s) {
-		/*
-		 * Tail check for pending requests. Allows frontend to =
avoid
-		 * notifications if requests are already in flight (lower
-		 * overheads and promotes batching).
-		 */
-		RING_FINAL_CHECK_FOR_REQUESTS(&blk_rings->common, =
more_to_do);
-
-	} else if (RING_HAS_UNCONSUMED_REQUESTS(&blk_rings->common)) {
-		more_to_do =3D 1;
-	}
-
 	spin_unlock_irqrestore(&blkif->blk_ring_lock, flags);
=20
-	if (more_to_do)
-		blkif_notify_work(blkif);
 	if (notify)
 		notify_remote_via_irq(blkif->irq);
 }




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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 05:55:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 05:55:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDFOR-0008DM-Ae; Mon, 10 Oct 2011 05:55:43 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDFNX-00080G-9f
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 05:54:47 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318251284!18877918!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3631 invoked from network); 10 Oct 2011 12:54:44 -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;
	10 Oct 2011 12:54:44 -0000
X-IronPort-AV: E=Sophos;i="4.68,517,1312156800"; 
   d="scan'208";a="8302507"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 12:54:44 +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, 10 Oct 2011 13:54:44 +0100
Subject: Re: [Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming
	domain 0
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Mon, 10 Oct 2011 13:54:43 +0100
In-Reply-To: <4E8F2AD0.2060904@tycho.nsa.gov>
References: <1317824920-639-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20109.60188.905267.410813@mariner.uk.xensource.com>
	<4E8DF425.9000807@tycho.nsa.gov>
	<1317973956.21903.281.camel@zakaz.uk.xensource.com>
	<4E8F2AD0.2060904@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318251283.21903.424.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 Fri, 2011-10-07 at 17:37 +0100, Daniel De Graaf wrote:
> On 10/07/2011 03:52 AM, Ian Campbell wrote:
> > On Thu, 2011-10-06 at 19:32 +0100, Daniel De Graaf wrote:
> >> On 10/06/2011 01:53 PM, Ian Jackson wrote:
> >>> Daniel De Graaf writes ("[Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming domain 0"):
> >>>> The xenbus event channel established in xenbus_init is intended to be a
> >>>> loopback channel, but the remote domain was hardcoded to 0; this will
> >>>> cause the channel to be unusable when xenstore is not being run in
> >>>> domain 0.
> >>>
> >>> I'm not sure I understand this.
> >>>
> >>> ...
> >>>>  		/* Next allocate a local port which xenstored can bind to */
> >>>>  		alloc_unbound.dom        = DOMID_SELF;
> >>>> -		alloc_unbound.remote_dom = 0;
> >>>> +		alloc_unbound.remote_dom = DOMID_SELF;
> >>>
> >>> The comment doesn't suggest that this is supposedly a loopback channel
> >>> (ie one for use by the xenbus client for signalling to itself,
> >>> somehow).
> >>
> >> The event channel being changed here is a loopback event channel exposed in
> >> /proc/xen/xsd_port, which xenstored binds to. This code is only used for the
> >> initial domain; otherwise, the shared info page is used.
> > 
> > How does this change impact the regular dom0? It will be expecting a
> > xenstored to startup locally when in reality it actually needs to wait
> > for another domain and then connect to that.
> 
> This change does not attempt to address the regular dom0, except for not
> breaking existing setups where xenstored resides in dom0.
> 
> > Diego Ongaro did some work several years ago on this issue, it was most
> > recently re-posted by Alex Zeffert, patches against xen-unstable and the
> > linux-2.6.18 tree:
> > http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01484.html
> > http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01488.html
> > 
> > Part of the trick was to fixup the kernel side in a way which was
> > compatible with both existing Xen releases while also supporting new
> > releases which support both stub and non-stub xenstore. To do this Diego
> > setup a lazy xenbus initialisation with a state machine to track which
> > case was active, with transitions triggered either from the local-mmap
> > of /proc/xen/xenbus_xsd (so was backwards compatible) or an ioctl called
> > by the tool which builds the stub domain to tell the dom0 xenbus code
> > which domain/mfn/evtchn contains the xenstored and dom0's connection to
> > it (the patcheset includes a cut-down builder which works without
> > xenstore).
> > 
> > http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01487.html
> > is the key kernel side patch in that regard.
> > 
> > Diego did some initial work with xenstored in a Linux domU, but I think
> > the final patchset was stub-xenstored (i.e. ocaml xenstored on minios,
> > possibly C xenstored on minios too), so I'm not sure about the xenstored
> > in Linux domU use case.
> > 
> > Some of the more trivial bits of this series were committed but the real
> > meat wasn't really pushed through.
> > 
> 
> Thanks for pointing out that series; I hadn't seen it yet. The setup I am
> currently using has a non-Linux dom0, so the state machine in dom0 was not
> required. A separate minios-based xenstored is the eventual goal; this patch
> just avoids creating a broken event channel in an initial domain whose
> domain ID is not 0.

Although I suspect it was envisaged when the API was written I don't
think SIF_INITDOMAIN can actually be used (or redefined) to mean
anything other than dom0 in practice without a whole host of knock-on
effects and breakage.

Setting SIF_INITDOMAIN has effects other than xenstore setup on a Linux
domU, grepping for other uses of xen_initial_domain() shows loads of
them. e.g. the selection of host vs. pseudo-physical e820, various
driver setup stuff, some pagetable features, how the console works etc.

> I do have a more complex version of this patch that replaces the initial
> domain check with a check on the start_info structure so that an initial
> domain can have xenstore information placed in its start_info field like
> any other domain; would this be of interest?

If you already have something then it would be interesting to see.

Ian.

> 
> >>> Rather it's supposed to be a channel to xenstore.  So the remote
> >>> domain should be the xenstore domain, which should come from the
> >>> shared info page.
> >>>
> >>> Have you actually tested this with a separate xenstored domain ?
> >>>
> >>> Ian.
> >>>
> >>
> >> The test setup that exposed this issue is having a non-dom0 Linux domain
> >> running xenstored (in addition to other services); this domain is started
> >> with the SIF_INITDOMAIN flag set. It has been tested and can start other
> >> domains with references back to the xenstored running there; the local
> >> kernel is able to communicate with the locally running xenstore to provide
> >> backend services.
> >>
> >> The test for xen_initial_domain() here might better be replaced with a
> >> check on xen_start_info->store_evtchn which should be a valid event channel
> >> on all domains except the domain running xenstored. This seems like a more
> >> elegant solution than relying on the SIF_INITDOMAIN flag to determine the
> >> location of xenstore.
> >>
> > 



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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 06:05:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 06:05:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDFY4-0000zD-G1; Mon, 10 Oct 2011 06:05:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDFVE-0000kt-Ku
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 06:03:27 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318251745!43593600!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22805 invoked from network); 10 Oct 2011 13:02:25 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 13:02:25 -0000
X-IronPort-AV: E=Sophos;i="4.68,517,1312156800"; 
   d="scan'208";a="8302712"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 13:02:26 +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, 10 Oct 2011 14:02:26 +0100
Subject: Re: [Xen-devel] [PATCH] xen-blkfront: plug device number leak in
	xlblk_init() error path
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Laszlo Ersek <lersek@redhat.com>, Konrad Rzeszutek Wilk
	<konrad.wilk@oracle.com>, Jeremy Fitzhardinge
	<jeremy.fitzhardinge@citrix.com>
Date: Mon, 10 Oct 2011 14:02:25 +0100
In-Reply-To: <1318016078-7110-1-git-send-email-lersek@redhat.com>
References: <1318016078-7110-1-git-send-email-lersek@redhat.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318251746.21903.430.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

Cc'ing Konrad & Jeremy per get_maintainers.pl

On Fri, 2011-10-07 at 20:34 +0100, Laszlo Ersek wrote:
> ... though after a failed xenbus_register_frontend() all may be lost.

Indeed. But anyway:

Acked-by: Ian Campbell <ian.campbell@citrix.com>

{net,kbd,fb,pci}front seem to not have this issue. Although it's not
100% clear if the effect of pci_frontend_registrar(1) needs to be
undone.

(is registrar a typo for register here?)


> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> ---
>  drivers/block/xen-blkfront.c |   10 +++++++++-
>  1 files changed, 9 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
> index 9ea8c25..a5a9b1b 100644
> --- a/drivers/block/xen-blkfront.c
> +++ b/drivers/block/xen-blkfront.c
> @@ -1385,6 +1385,8 @@ static struct xenbus_driver blkfront = {
>  
>  static int __init xlblk_init(void)
>  {
> +	int ret;
> +
>  	if (!xen_domain())
>  		return -ENODEV;
>  
> @@ -1394,7 +1396,13 @@ static int __init xlblk_init(void)
>  		return -ENODEV;
>  	}
>  
> -	return xenbus_register_frontend(&blkfront);
> +	ret = xenbus_register_frontend(&blkfront);
> +	if (ret) {
> +		unregister_blkdev(XENVBD_MAJOR, DEV_NAME);
> +		return ret;
> +	}
> +
> +	return 0;
>  }
>  module_init(xlblk_init);
>  



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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 06:07:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 06: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 1RDFa6-0001N1-Kr; Mon, 10 Oct 2011 06:07:46 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDFYw-00016F-Fn
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 06:06:46 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318251991!20501463!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27771 invoked from network); 10 Oct 2011 13:06:31 -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;
	10 Oct 2011 13:06:31 -0000
X-IronPort-AV: E=Sophos;i="4.68,517,1312156800"; 
   d="scan'208";a="8302885"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 13:06: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;
	Mon, 10 Oct 2011 14:06:31 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Thomas Gleixner <tglx@linutronix.de>
Date: Mon, 10 Oct 2011 14:06:30 +0100
In-Reply-To: <alpine.LFD.2.02.1110071822160.3240@ionos>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
	<1317668908.11991.20.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110032229250.1489@ionos>
	<1318001583.21903.355.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110071822160.3240@ionos>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318251990.21903.433.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	xen-devel <xen-devel@lists.xensource.com>, Konrad Rzeszutek
	Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 17:29 +0100, Thomas Gleixner wrote:
> On Fri, 7 Oct 2011, Ian Campbell wrote:
> > On Mon, 2011-10-03 at 22:35 +0200, Thomas Gleixner wrote:
> >  /**
> > + * irq_pm_syscore_ops - enable interrupt lines early
> > + *
> > + * Enable all interrupt lines with %IRQF_EARLY_RESUME set
> > + */
> > +static void irq_pm_syscore_resume(void)
> > +{
> > +	struct irq_desc *desc;
> > +	int irq;
> > +
> > +	for_each_irq_desc(irq, desc) {
> > +		unsigned long flags;
> > +
> > +		if (!desc->action || !(desc->action->flags & IRQF_EARLY_RESUME))
> > +			continue;
> > +
> > +		raw_spin_lock_irqsave(&desc->lock, flags);
> > +		__enable_irq(desc, irq, true);
> > +		raw_spin_unlock_irqrestore(&desc->lock, flags);
> > +	}
> > +}
> 
> Come on, this is a full copy of resume_device_irqs(). What about
> having a common function with an (bool early) argument and call it
> from both syscore and resume_device?

Yes, that's a good idea.

>From dc8a8329f3e97f30e1290c898c816250aa7e8957 Mon Sep 17 00:00:00 2001
From: Ian Campbell <ian.campbell@citrix.com>
Date: Mon, 3 Oct 2011 15:37:00 +0100
Subject: [PATCH] irq: add IRQF_RESUME_EARLY and resume such IRQs earlier in the process

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: Thomas Gleixner <tglx@linutronix.de>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: stable@kernel.org (at least to 2.6.32.y)
---
 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 7523719..44490de 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 a103732..f51a81b 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..86bcd79 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 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.2.5




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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 06:17:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 06:17:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDFjj-0001xR-0m; Mon, 10 Oct 2011 06:17:43 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDFiy-0001lB-Nz
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 06:16:57 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318252584!52180278!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20352 invoked from network); 10 Oct 2011 13:16:26 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 13:16:26 -0000
Received: by pzk34 with SMTP id 34so17177512pzk.8
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 06:16:51 -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=ud7o6RPtjA5H1+qpnGsMVMRhkTQLO1XXdyGhVIY3cDQ=;
	b=uZDyNrR4x6NiEoo64PjsMmZEMRyVZKYuZdPCnrsE5fPqtFwFU8wKuu6LJV6WshykOa
	mZgMcM1dOacTHAtxq3/kq+pV0HfQtdKeq+2uRra1mttSS1YFBSG5S6Nx1zFIRmrb56TX
	Ixm6MFb8Kc3CGrNb0qYUEYJzanlLJlD2lDUBs=
MIME-Version: 1.0
Received: by 10.68.17.194 with SMTP id q2mr266833pbd.88.1318252611582; Mon, 10
	Oct 2011 06:16:51 -0700 (PDT)
Received: by 10.142.225.20 with HTTP; Mon, 10 Oct 2011 06:16:51 -0700 (PDT)
In-Reply-To: <20109.55057.491612.998568@mariner.uk.xensource.com>
References: <patchbomb.1317386580@loki> <84a27a9f39f29194a734.1317386585@loki>
	<20109.55057.491612.998568@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 15:16:51 +0200
X-Google-Sender-Auth: M9pY2kmvO1BHdxfPVRws5GwHe8g
Message-ID: <CAPLaKK5AwPnrvfoPdbc8Ap6pyFqiBuvEWfFUmqSeN_-QR-TZQw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 5 of 9] libxl: only use interactive PyGrub
	mode when a console is attached
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
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

> I think "-c" shouldn't affect the functionality of the domain, just
> whether the console is initially connected. =C2=A0Perhaps the console wil=
l
> be connected somewhere else.
>
> OTOH I think it would be fine to have an option (libxl config
> parameter, I guess) to make pygrub run noninteractively.

I've digged a little more into this issue, and found out that NetBSD
ptys have a 1024 buffer limit, and when this limit is hit, the select
from libxl_bootloader:211 blocks and no more data is writen to
xenconsole_fd and no more data is read from bootloader_fd (because
bootloader_buf contains data), which of course blocks the execution of
pygrub. Since the xenconsoled_fd pty is not monitored by xenconsole,
nobody is draining data from it. I don't know the best way to solve
this, but it seems like somebody should read the data from
xenconsoled_fd and dispose it if there is no console attached.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 06:42:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 06:42:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDG7T-0004wW-3Q; Mon, 10 Oct 2011 06:42:15 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDG71-0004jl-UX
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 06:41:48 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1318254104!409881!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1522 invoked from network); 10 Oct 2011 13:41:44 -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 Oct 2011 13:41:44 -0000
X-IronPort-AV: E=Sophos;i="4.68,517,1312156800"; 
   d="scan'208";a="8303886"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 13:41:43 +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, 10 Oct 2011 14:41:43 +0100
Subject: Re: [Xen-devel] [PATCH 5 of 9] libxl: only use interactive PyGrub
	mode when a console is attached
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Mon, 10 Oct 2011 14:41:43 +0100
In-Reply-To: <CAPLaKK5AwPnrvfoPdbc8Ap6pyFqiBuvEWfFUmqSeN_-QR-TZQw@mail.gmail.com>
References: <patchbomb.1317386580@loki> <84a27a9f39f29194a734.1317386585@loki>
	<20109.55057.491612.998568@mariner.uk.xensource.com>
	<CAPLaKK5AwPnrvfoPdbc8Ap6pyFqiBuvEWfFUmqSeN_-QR-TZQw@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1318254103.21903.444.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 Mon, 2011-10-10 at 14:16 +0100, Roger Pau MonnÃ© wrote:
> > I think "-c" shouldn't affect the functionality of the domain, just
> > whether the console is initially connected.  Perhaps the console will
> > be connected somewhere else.
> >
> > OTOH I think it would be fine to have an option (libxl config
> > parameter, I guess) to make pygrub run noninteractively.
> 
> I've digged a little more into this issue, and found out that NetBSD
> ptys have a 1024 buffer limit, and when this limit is hit, the select
                  ^byte ?

> from libxl_bootloader:211 blocks and no more data is writen to
> xenconsole_fd and no more data is read from bootloader_fd (because
> bootloader_buf contains data),

IIRC I made that last condition like that because it simplified things
because I could avoid worrying about wrapping the consumer round in the
buffer, or something. However if that scheme doesn't work for BSD we
could go the more complex route, assuming it would help.

This could well be a problem on Linux too but we are just avoiding it
due to the larger buffers. I wonder if I can artificially reduce the
buffer size on Linux...

>  which of course blocks the execution of
> pygrub. Since the xenconsoled_fd pty is not monitored by xenconsole,
> nobody is draining data from it. I don't know the best way to solve
> this, but it seems like somebody should read the data from
> xenconsoled_fd and dispose it if there is no console attached.

Yes. One option could be to add a timeout to the select and throwaway
data if necessary. I think xenconsoled does this for real guest consoles
too if no one is connected so that behaviour would at least be
consistent. Or maybe xenconsoled should be doing this for this pty like
it does for guests?

Might another option be to increase the size of the buffer in libxl to
>1K? More of a workaround than a solution I suppose.

Ian.


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 06:44:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 06:44:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDG9j-0005LJ-Hv; Mon, 10 Oct 2011 06:44:35 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDG9H-00058q-Bi
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 06:44:07 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1318254244!34644820!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9551 invoked from network); 10 Oct 2011 13:44:04 -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;
	10 Oct 2011 13:44:04 -0000
X-IronPort-AV: E=Sophos;i="4.68,517,1312156800"; 
   d="scan'208";a="8303987"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 13:44: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;
	Mon, 10 Oct 2011 14:44:03 +0100
Subject: Re: [Xen-devel] [PATCH 5 of 9] libxl: only use interactive PyGrub
	mode when a console is attached
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Mon, 10 Oct 2011 14:44:03 +0100
In-Reply-To: <1318254103.21903.444.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317386580@loki> <84a27a9f39f29194a734.1317386585@loki>
	<20109.55057.491612.998568@mariner.uk.xensource.com>
	<CAPLaKK5AwPnrvfoPdbc8Ap6pyFqiBuvEWfFUmqSeN_-QR-TZQw@mail.gmail.com>
	<1318254103.21903.444.camel@zakaz.uk.xensource.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1318254243.21903.445.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 Mon, 2011-10-10 at 14:41 +0100, Ian Campbell wrote:
> On Mon, 2011-10-10 at 14:16 +0100, Roger Pau MonnÃ© wrote:
> > > I think "-c" shouldn't affect the functionality of the domain, just
> > > whether the console is initially connected.  Perhaps the console will
> > > be connected somewhere else.
> > >
> > > OTOH I think it would be fine to have an option (libxl config
> > > parameter, I guess) to make pygrub run noninteractively.
> > 
> > I've digged a little more into this issue, and found out that NetBSD
> > ptys have a 1024 buffer limit, and when this limit is hit, the select
>                   ^byte ?
> 
> > from libxl_bootloader:211 blocks and no more data is writen to
> > xenconsole_fd and no more data is read from bootloader_fd (because
> > bootloader_buf contains data),
> 
> IIRC I made that last condition like that because it simplified things
> because I could avoid worrying about wrapping the consumer round in the
> buffer, or something. However if that scheme doesn't work for BSD we
> could go the more complex route, assuming it would help.
> 
> This could well be a problem on Linux too but we are just avoiding it
> due to the larger buffers. I wonder if I can artificially reduce the
> buffer size on Linux...
> 
> >  which of course blocks the execution of
> > pygrub. Since the xenconsoled_fd pty is not monitored by xenconsole,
> > nobody is draining data from it. I don't know the best way to solve
> > this, but it seems like somebody should read the data from
> > xenconsoled_fd and dispose it if there is no console attached.
> 
> Yes. One option could be to add a timeout to the select and throwaway
> data if necessary. I think xenconsoled does this for real guest consoles
> too if no one is connected so that behaviour would at least be
> consistent. Or maybe xenconsoled should be doing this for this pty like
> it does for guests?

Wait, that last suggestion doesn't work because this pty goes direct to
the xencosole client not via the server and the issue is that there is
no client connected.

Ian.

> 
> Might another option be to increase the size of the buffer in libxl to
> >1K? More of a workaround than a solution I suppose.
> 
> Ian.
> 
> 
> _______________________________________________
> 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 Oct 10 07:05:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 07:05:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDGTh-0006go-8z; Mon, 10 Oct 2011 07:05:13 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDGRg-0006T2-Sj
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 07:03:21 -0700
X-Env-Sender: Stephan.Diestelhorst@amd.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318255385!413164!1
X-Originating-IP: [213.199.154.208]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32767 invoked from network); 10 Oct 2011 14:03:05 -0000
Received: from am1ehsobe005.messaging.microsoft.com (HELO
	AM1EHSOBE005.bigfish.com) (213.199.154.208)
	by server-7.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	10 Oct 2011 14:03:05 -0000
Received: from mail41-am1-R.bigfish.com (10.3.201.247) by
	AM1EHSOBE005.bigfish.com (10.3.204.25) with Microsoft SMTP Server id
	14.1.225.22; Mon, 10 Oct 2011 14:03:04 +0000
Received: from mail41-am1 (localhost.localdomain [127.0.0.1])	by
	mail41-am1-R.bigfish.com (Postfix) with ESMTP id A836D9B8281;
	Mon, 10 Oct 2011 14:03:04 +0000 (UTC)
X-SpamScore: -3
X-BigFish: VPS-3(zzbb2dK9371Kc85fh1432Nc857h98dKzz1202hzzz32i668h839ha3cs34h61h)
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,0,0,0,0,0,0,
Received: from mail41-am1 (localhost.localdomain [127.0.0.1]) by mail41-am1
	(MessageSwitch) id 1318255340399884_364; Mon, 10 Oct 2011 14:02:20 +0000
	(UTC)
Received: from AM1EHSMHS009.bigfish.com (unknown [10.3.201.249])	by
	mail41-am1.bigfish.com (Postfix) with ESMTP id 580E4B40051;
	Mon, 10 Oct 2011 14:02:20 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	AM1EHSMHS009.bigfish.com (10.3.207.109) with Microsoft SMTP Server id
	14.1.225.22; Mon, 10 Oct 2011 14:02:15 +0000
X-WSS-ID: 0LSUSBL-01-54G-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 2CEA21028099;	Mon, 10 Oct 2011 09:02:08 -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;
	Mon, 10 Oct 2011 09:02:15 -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;
	Mon, 10 Oct 2011 09:02:10 -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; Mon, 10 Oct 2011
	10:01:52 -0400
Received: from d-allen.localnet (unknown [10.224.148.7])	by gwo.osrc.amd.com
	(Postfix) with ESMTP id 4ECA549C1F1;
	Mon, 10 Oct 2011 15:01:51 +0100 (BST)
From: Stephan Diestelhorst <stephan.diestelhorst@amd.com>
To: <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] [PATCH 00/10] [PATCH RFC V2] Paravirtualized
	ticketlocks
Date: Mon, 10 Oct 2011 16:01:50 +0200
Message-ID: <2222671.j13duhYQpt@d-allen>
Organization: AMD OSRC
User-Agent: KMail/4.7.1 (Linux/3.0.4-030004-generic; KDE/4.7.1; x86_64; ; )
In-Reply-To: <2523929.AGG4U997NO@d-allen>
References: <cover.1315878463.git.jeremy.fitzhardinge@citrix.com>
	<4E8DE7F1.3050108@goop.org> <2523929.AGG4U997NO@d-allen>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="nextPart1396890.6bZkbSRBX5"
Content-Transfer-Encoding: 7Bit
X-OriginatorOrg: amd.com
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Nick Piggin <npiggin@kernel.dk>, KVM <kvm@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>, maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>, Kleen <andi@firstfloor.org>,
	"Andi@domain.invalid" <Andi@domain.invalid>, Avi,
	Jan Beulich <JBeulich@suse.com>, "H. Peter Anvin" <hpa@zytor.com>,
	"the@domain.invalid" <the@domain.invalid>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Ingo Molnar <mingo@elte.hu>, Kivity <avi@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

--nextPart1396890.6bZkbSRBX5
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"

On Monday 10 October 2011, 07:00:50 Stephan Diestelhorst wrote:
> On Thursday 06 October 2011, 13:40:01 Jeremy Fitzhardinge wrote:
> > On 10/06/2011 07:04 AM, Stephan Diestelhorst wrote:
> > > On Wednesday 28 September 2011, 14:49:56 Linus Torvalds wrote:
> > >> Which certainly should *work*, but from a conceptual standpoint, isn't
> > >> it just *much* nicer to say "we actually know *exactly* what the upper
> > >> bits were".
> > > Well, we really do NOT want atomicity here. What we really rather want
> > > is sequentiality: free the lock, make the update visible, and THEN
> > > check if someone has gone sleeping on it.
> > >
> > > Atomicity only conveniently enforces that the three do not happen in a
> > > different order (with the store becoming visible after the checking
> > > load).
> > >
> > > This does not have to be atomic, since spurious wakeups are not a
> > > problem, in particular not with the FIFO-ness of ticket locks.
> > >
> > > For that the fence, additional atomic etc. would be IMHO much cleaner
> > > than the crazy overflow logic.
> > 
> > All things being equal I'd prefer lock-xadd just because its easier to
> > analyze the concurrency for, crazy overflow tests or no.  But if
> > add+mfence turned out to be a performance win, then that would obviously
> > tip the scales.
> > 
> > However, it looks like locked xadd is also has better performance:  on
> > my Sandybridge laptop (2 cores, 4 threads), the add+mfence is 20% slower
> > than locked xadd, so that pretty much settles it unless you think
> > there'd be a dramatic difference on an AMD system.
> 
> Indeed, the fences are usually slower than locked RMWs, in particular,
> if you do not need to add an instruction. I originally missed that
> amazing stunt the GCC pulled off with replacing the branch with carry
> flag magic. It seems that two twisted minds have found each other
> here :)
> 
> One of my concerns was adding a branch in here... so that is settled,
> and if everybody else feels like this is easier to reason about...
> go ahead :) (I'll keep my itch to myself then.)

Just that I can't... if performance is a concern, adding the LOCK
prefix to the addb outperforms the xadd significantly:

With mean over 100 runs... this comes out as follows
(on my Phenom II)

locked-add   0.648500 s   80%
add-rmwtos   0.707700 s   88%
locked-xadd  0.807600 s  100%
add-barrier  1.270000 s  157%

With huge read contention added in (as cheaply as possible):
locked-add.openmp  0.640700 s  84%
add-rmwtos.openmp  0.658400 s  86%
locked-xadd.openmp 0.763800 s 100%

And the numbers for write contention are crazy, but also feature the
locked-add version:
locked-add.openmp  0.571400 s  71%
add-rmwtos.openmp  0.699900 s  87%
locked-xadd.openmp 0.800200 s 100%

Stephan
-- 
Stephan Diestelhorst, AMD Operating System Research Center
stephan.diestelhorst@amd.com, Tel. +49 (0)351 448 356 719

Advanced Micro Devices GmbH
Einsteinring 24
85609 Aschheim
Germany

Geschaeftsfuehrer: Alberto Bozzo;
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632, WEEE-Reg-Nr: DE 12919551 
--nextPart1396890.6bZkbSRBX5
Content-Disposition: attachment; filename="add-rmwtos.c"
Content-Transfer-Encoding: 7Bit
Content-Type: text/x-csrc; charset="UTF-8"; name="add-rmwtos.c"
Content-Description: add-rmwtos.c

#include <stdio.h>

struct {
	unsigned char flag;
	unsigned char val;
} l;

int main(int argc, char **argv)
{
	int i;

	{
		{
			for (i = 0; i < 100000000; i++) {
				l.val += 2;
				asm volatile("lock or $0x0,(%%rsp)" : : : "memory");
				if (l.flag)
					break;
				asm volatile("" : : : "memory");
			}
			l.flag = 1;
		}
	}
	return 0;
}

--nextPart1396890.6bZkbSRBX5
Content-Disposition: attachment; filename="add-rmwtos.openmp.c"
Content-Transfer-Encoding: 7Bit
Content-Type: text/x-csrc; charset="UTF-8"; name="add-rmwtos.openmp.c"
Content-Description: add-rmwtos.openmp.c

#include <stdio.h>

struct {
	unsigned char flag;
	unsigned char val;
} l;

int main(int argc, char **argv)
{
	int i;

#   pragma omp sections 
	{
#       pragma omp section
		{
			for (i = 0; i < 100000000; i++) {
				l.val += 2;
				asm volatile("lock or $0x0,(%%rsp)" : : : "memory");
				if (l.flag)
					break;
				asm volatile("" : : : "memory");
			}
			l.flag = 1;
		}
#       pragma omp section
		while(!l.flag)
			asm volatile("":::"memory");
			//asm volatile("lock orb $0x0, %0"::"m"(l.flag):"memory");
	}
	return 0;
}

--nextPart1396890.6bZkbSRBX5
Content-Disposition: attachment; filename="locked-add.c"
Content-Transfer-Encoding: 7Bit
Content-Type: text/x-csrc; charset="UTF-8"; name="locked-add.c"
Content-Description: locked-add.c

#include <stdio.h>

struct {
	unsigned char flag;
	unsigned char val;
} l;

int main(int argc, char **argv)
{
	int i;
	{
		{
			for (i = 0; i < 100000000; i++) {
				asm volatile("lock addb %1, %0":"+m"(l.val):"r"((char)2):"memory");
				if (l.flag)
					break;
				asm volatile("" : : : "memory");
			}
			l.flag = 1;
		}
	}
	return 0;
}

--nextPart1396890.6bZkbSRBX5
Content-Disposition: attachment; filename="locked-xadd.openmp.c"
Content-Transfer-Encoding: 7Bit
Content-Type: text/x-csrc; charset="UTF-8"; name="locked-xadd.openmp.c"
Content-Description: locked-xadd.openmp.c

#include <stdio.h>

union {
	struct {
		unsigned char val;
		unsigned char flag;
	};
	unsigned short lock;
} l = { 0,0 };

int main(int argc, char **argv)
{
	int i;
#   pragma omp sections 
	{
#       pragma omp section
	    {

			for (i = 0; i < 100000000; i++) {
				unsigned short inc = 2;
				if (l.val >= (0x100 - 2))
					inc += -1 << 8;
				asm volatile("lock; xadd %1,%0" : "+m" (l.lock), "+r" (inc) : );
				if (inc & 0x100)
					break;
				asm volatile("" : : : "memory");
			}
			l.flag = 1;
		}
#       pragma omp section
	    while(!l.flag)
		    asm volatile("":::"memory");
			//asm volatile("lock orb $0x0, %0"::"m"(l.flag):"memory");
	}
	return 0;
}

--nextPart1396890.6bZkbSRBX5
Content-Disposition: attachment; filename="locked-add.openmp.c"
Content-Transfer-Encoding: 7Bit
Content-Type: text/x-csrc; charset="UTF-8"; name="locked-add.openmp.c"
Content-Description: locked-add.openmp.c

#include <stdio.h>

struct {
	unsigned char flag;
	unsigned char val;
} l;

int main(int argc, char **argv)
{
	int i;
#   pragma omp sections 
	{
#       pragma omp section
		{
			for (i = 0; i < 100000000; i++) {
				asm volatile("lock addb %1, %0":"+m"(l.val):"r"((char)2):"memory");
				if (l.flag)
					break;
				asm volatile("" : : : "memory");
			}
			l.flag = 1;
		}
#       pragma omp section
		while(!l.flag)
			asm volatile("":::"memory");
			//asm volatile("lock orb $0x0, %0"::"m"(l.flag):"memory");
	}
	return 0;
}

--nextPart1396890.6bZkbSRBX5
Content-Disposition: attachment; filename="locked-xadd.c"
Content-Transfer-Encoding: 7Bit
Content-Type: text/x-csrc; charset="UTF-8"; name="locked-xadd.c"
Content-Description: locked-xadd.c

#include <stdio.h>

union {
	struct {
		unsigned char val;
		unsigned char flag;
	};
	unsigned short lock;
} l = { 0,0 };

int main(int argc, char **argv)
{
	int i;
	{
	    {

			for (i = 0; i < 100000000; i++) {
				unsigned short inc = 2;
				if (l.val >= (0x100 - 2))
					inc += -1 << 8;
				asm volatile("lock; xadd %1,%0" : "+m" (l.lock), "+r" (inc) : );
				if (inc & 0x100)
					break;
				asm volatile("" : : : "memory");
			}
			l.flag = 1;
		}
	}
	return 0;
}

--nextPart1396890.6bZkbSRBX5
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

--nextPart1396890.6bZkbSRBX5--


From xen-devel-bounces@lists.xensource.com Mon Oct 10 07:06:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 07:06:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDGVE-00074S-0E; Mon, 10 Oct 2011 07:06:48 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDGTI-0006cb-L4
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 07:04:53 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318255372!39680894!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4662 invoked from network); 10 Oct 2011 14:02:52 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 14:02:52 -0000
Received: by wwf27 with SMTP id 27so7436844wwf.24
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 07:04:45 -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:user-agent:date:from:to:cc;
	bh=n8rWac6cx1IYcRCtXVMQOUqp9mfmdOLD5L85PvHdEnY=;
	b=gkcsLk7qmjvaLZ6ndV6LjWjwr8J4BTFHByLdDBY0FpqylNeKAG7cPPtJMO70HAhXN6
	M1SRJlbcWdRngfOYznSPIErYqRMXrhn/s4Lj6oEFZi7dfz7ZC3RduVHR+Ojb2K/izLPU
	47UnyFJP7+hgoJGwVO5rp6PAlvNzIX2yDiwV8=
Received: by 10.227.58.200 with SMTP id i8mr6419585wbh.2.1318255485426;
	Mon, 10 Oct 2011 07:04:45 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fj1sm29048263wbb.13.2011.10.10.07.04.43
	(version=TLSv1/SSLv3 cipher=OTHER);
	Mon, 10 Oct 2011 07:04:44 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1ebcb5d27ead38d6713d865704394ca99444f93c
Message-Id: <1ebcb5d27ead38d6713d.1318255457@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Mon, 10 Oct 2011 16:04:17 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH] libxl: drop bootloader output if xenconsole
 file descriptor is not available for writing
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318255452 -7200
# Node ID 1ebcb5d27ead38d6713d865704394ca99444f93c
# Parent  a5b8d5c8c98e0dd17368eea1801a8edaf1e79e69
libxl: drop bootloader output if xenconsole file descriptor is not available for writing.

Drop output from bootloader if the pty buffer is full and we cannot write more data. Prevents the bootloader from getting stuck when using ptys with small buffers.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r a5b8d5c8c98e -r 1ebcb5d27ead tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Mon Oct 10 11:26:22 2011 +0200
+++ b/tools/libxl/libxl_bootloader.c	Mon Oct 10 16:04:12 2011 +0200
@@ -169,6 +169,7 @@ static char * bootloader_interact(libxl_
 
     size_t nr_out = 0, size_out = 0;
     char *output = NULL;
+    struct timeval timeout;
 
     /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
     int xenconsoled_prod = 0, xenconsoled_cons = 0;
@@ -177,9 +178,14 @@ static char * bootloader_interact(libxl_
     int bootloader_prod = 0, bootloader_cons = 0;
     char bootloader_buf[BOOTLOADER_BUF_SIZE];
 
+    /* Set timeout to 1s before starting to discard data */
+    timeout.tv_sec = 1;
+    timeout.tv_usec = 0;
+
     while(1) {
         fd_set wsel, rsel;
         int nfds;
+        int space;
 
         if (xenconsoled_prod == xenconsoled_cons)
             xenconsoled_prod = xenconsoled_cons = 0;
@@ -208,9 +214,14 @@ static char * bootloader_interact(libxl_
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
-        ret = select(nfds, &rsel, &wsel, NULL, NULL);
+        ret = select(nfds, &rsel, &wsel, NULL, &timeout);
         if (ret < 0)
             goto out_err;
+        if (ret == 0) {
+            /* Timeout reached, force clear buffers */
+            xenconsoled_prod = xenconsoled_cons;
+            bootloader_prod = bootloader_cons;
+        }
 
         /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
         if (FD_ISSET(xenconsoled_fd, &rsel)) {

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 07:07:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 07: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 1RDGWA-0007RB-0m; Mon, 10 Oct 2011 07:07:46 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDGTs-0006ie-Dv
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 07:05:28 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1318255521!34646997!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13254 invoked from network); 10 Oct 2011 14:05:21 -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;
	10 Oct 2011 14:05:21 -0000
X-IronPort-AV: E=Sophos;i="4.68,517,1312156800"; 
   d="scan'208";a="8304657"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 14:05: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; Mon, 10 Oct 2011 15:05:21 +0100
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 1RDGTo-0003F9-Ko;
	Mon, 10 Oct 2011 14:05:20 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RDGTo-0006VO-H9;
	Mon, 10 Oct 2011 15:05:20 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9237-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 10 Oct 2011 15:05:20 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9237: 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 9237 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9237/

Failures :-/ but no regressions.

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

version targeted for testing:
 xen                  72f339bc600d
baseline version:
 xen                  0c2bfd1f9c68

------------------------------------------------------------
People who touched revisions under test:
  "Kay, Allen M" <allen.m.kay@intel.com>
  Boris Ostrovsky <boris.ostrovsky@amd.com>
  Daniel De Graaf <dgdegra@tycho.nsa.gov>
  Ian Campbell <ian.campbell@citrix.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                                     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=72f339bc600d
+ . 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 72f339bc600d
+ branch=xen-unstable
+ revision=72f339bc600d
+ . 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 72f339bc600d 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 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 Mon Oct 10 07:09:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 07:09:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDGXb-0007uJ-FT; Mon, 10 Oct 2011 07:09:15 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDGVS-000795-GR
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 07:07:03 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318255603!57450721!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28072 invoked from network); 10 Oct 2011 14:06:43 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 14:06:43 -0000
Received: by eyb6 with SMTP id 6so3273399eyb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 07:06:59 -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:cc; bh=UgHP4PaWa+nZBNL7Hhp33oae3uVACcEjEcRAbxCVD0g=;
	b=OFjSLd5BBUPRCShJ63LKE4zOmMn3VDU6hVQxnCMTZB+8TRtSMIjByeu4eQmtTjaomZ
	dD5I0ASjoAd3CmRPls0jamV/42MgWptlEcPxKig4uQzCpBBlr9QHdStQWpteea1f8mKW
	/iKMv2H+5PjjTJtHgzJpcp/UHSpxGrb6c2YaA=
Received: by 10.216.4.160 with SMTP id 32mr3990739wej.70.1318255619000;
	Mon, 10 Oct 2011 07:06:59 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id o7sm33003566wbh.8.2011.10.10.07.06.56
	(version=TLSv1/SSLv3 cipher=OTHER);
	Mon, 10 Oct 2011 07:06:57 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0012a80df7a0fe07497d58423ba651b302d84745
Message-Id: <0012a80df7a0fe07497d.1318255614@loki>
In-Reply-To: <1ebcb5d27ead38d6713d.1318255457@loki>
References: <1ebcb5d27ead38d6713d.1318255457@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Mon, 10 Oct 2011 16:06:54 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH] libxl: drop bootloader output if xenconsole
 file descriptor is not available for writing
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318255572 -7200
# Node ID 0012a80df7a0fe07497d58423ba651b302d84745
# Parent  a5b8d5c8c98e0dd17368eea1801a8edaf1e79e69
libxl: drop bootloader output if xenconsole file descriptor is not available for writing.

Drop output from bootloader if the pty buffer is full and we cannot write more data. Prevents the bootloader from getting stuck when using ptys with small buffers.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r a5b8d5c8c98e -r 0012a80df7a0 tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Mon Oct 10 11:26:22 2011 +0200
+++ b/tools/libxl/libxl_bootloader.c	Mon Oct 10 16:06:12 2011 +0200
@@ -169,6 +169,7 @@ static char * bootloader_interact(libxl_
 
     size_t nr_out = 0, size_out = 0;
     char *output = NULL;
+    struct timeval timeout;
 
     /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
     int xenconsoled_prod = 0, xenconsoled_cons = 0;
@@ -177,6 +178,10 @@ static char * bootloader_interact(libxl_
     int bootloader_prod = 0, bootloader_cons = 0;
     char bootloader_buf[BOOTLOADER_BUF_SIZE];
 
+    /* Set timeout to 1s before starting to discard data */
+    timeout.tv_sec = 1;
+    timeout.tv_usec = 0;
+
     while(1) {
         fd_set wsel, rsel;
         int nfds;
@@ -208,9 +213,14 @@ static char * bootloader_interact(libxl_
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
-        ret = select(nfds, &rsel, &wsel, NULL, NULL);
+        ret = select(nfds, &rsel, &wsel, NULL, &timeout);
         if (ret < 0)
             goto out_err;
+        if (ret == 0) {
+            /* Timeout reached, force clear buffers */
+            xenconsoled_prod = xenconsoled_cons;
+            bootloader_prod = bootloader_cons;
+        }
 
         /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
         if (FD_ISSET(xenconsoled_fd, &rsel)) {

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 07:12:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 07:12:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDGam-0008T6-LP; Mon, 10 Oct 2011 07:12:32 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDGa3-0008FE-OL
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 07:11:49 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1318255885!62308039!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17488 invoked from network); 10 Oct 2011 14:11:26 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 14:11:26 -0000
X-IronPort-AV: E=Sophos;i="4.68,517,1312171200"; d="scan'208";a="166289781"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 10:11:43 -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; Mon, 10 Oct 2011
	10:11:43 -0400
Message-ID: <4E92FD1D.8070400@citrix.com>
Date: Mon, 10 Oct 2011 15:11:41 +0100
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: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH] libxl: drop bootloader output if xenconsole
	file descriptor is not available for writing
References: <1ebcb5d27ead38d6713d.1318255457@loki>
In-Reply-To: <1ebcb5d27ead38d6713d.1318255457@loki>
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
Cc: Ian, "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	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 10/10/11 15:04, Roger Pau Monne wrote:
> # HG changeset patch
> # User Roger Pau Monne <roger.pau@entel.upc.edu>
> # Date 1318255452 -7200
> # Node ID 1ebcb5d27ead38d6713d865704394ca99444f93c
> # Parent  a5b8d5c8c98e0dd17368eea1801a8edaf1e79e69
> libxl: drop bootloader output if xenconsole file descriptor is not available for writing.
>
> Drop output from bootloader if the pty buffer is full and we cannot write more data. Prevents the bootloader from getting stuck when using ptys with small buffers.
>
> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
>
> diff -r a5b8d5c8c98e -r 1ebcb5d27ead tools/libxl/libxl_bootloader.c
> --- a/tools/libxl/libxl_bootloader.c	Mon Oct 10 11:26:22 2011 +0200
> +++ b/tools/libxl/libxl_bootloader.c	Mon Oct 10 16:04:12 2011 +0200
> @@ -169,6 +169,7 @@ static char * bootloader_interact(libxl_
>  
>      size_t nr_out = 0, size_out = 0;
>      char *output = NULL;
> +    struct timeval timeout;
>  
>      /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
>      int xenconsoled_prod = 0, xenconsoled_cons = 0;
> @@ -177,9 +178,14 @@ static char * bootloader_interact(libxl_
>      int bootloader_prod = 0, bootloader_cons = 0;
>      char bootloader_buf[BOOTLOADER_BUF_SIZE];
>  
> +    /* Set timeout to 1s before starting to discard data */
> +    timeout.tv_sec = 1;
> +    timeout.tv_usec = 0;
> +
>      while(1) {
>          fd_set wsel, rsel;
>          int nfds;
> +        int space;

You appear to introduce an unreferenced variable here.

>  
>          if (xenconsoled_prod == xenconsoled_cons)
>              xenconsoled_prod = xenconsoled_cons = 0;
> @@ -208,9 +214,14 @@ static char * bootloader_interact(libxl_
>              nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
>          }
>  
> -        ret = select(nfds, &rsel, &wsel, NULL, NULL);
> +        ret = select(nfds, &rsel, &wsel, NULL, &timeout);
>          if (ret < 0)
>              goto out_err;
> +        if (ret == 0) {
> +            /* Timeout reached, force clear buffers */
> +            xenconsoled_prod = xenconsoled_cons;
> +            bootloader_prod = bootloader_cons;
> +        }
>  
>          /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
>          if (FD_ISSET(xenconsoled_fd, &rsel)) {
>
> _______________________________________________
> 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 Mon Oct 10 07:18:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 07:18:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDGgU-0000Tn-6P; Mon, 10 Oct 2011 07:18:26 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDGfr-0000H4-Jd
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 07:17:47 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1318256256!52270493!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23583 invoked from network); 10 Oct 2011 14:17:37 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 14:17:37 -0000
Received: by qabg14 with SMTP id g14so6349367qab.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 07:17:43 -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=PvUTwk8HS4flQUTxUV5McuUVCdySX7cjKQXnOJI6CxE=;
	b=NbnEY0KdK/7y6knRE5lLF+9psjbaBoMg+zz+MFL6pW6BFdFOO8H6yEdmDx3QvsReL7
	+4h1FLM5nlhuV2RlBi2Hgbafp/usPu2VBaWCI4CJEDzODn2K+c630SjZjbK8vitSjbN4
	mxnPmNLmbwxTykrhr0nEhkZ2sNN3R0mYHpnNk=
MIME-Version: 1.0
Received: by 10.68.36.232 with SMTP id t8mr38184218pbj.54.1318256257700; Mon,
	10 Oct 2011 07:17:37 -0700 (PDT)
Received: by 10.142.225.20 with HTTP; Mon, 10 Oct 2011 07:17:37 -0700 (PDT)
In-Reply-To: <4E92FD1D.8070400@citrix.com>
References: <1ebcb5d27ead38d6713d.1318255457@loki>
	<4E92FD1D.8070400@citrix.com>
Date: Mon, 10 Oct 2011 16:17:37 +0200
X-Google-Sender-Auth: TDSPGd8zMPY4M7aPUOSdufrNLbQ
Message-ID: <CAPLaKK5833cxrgPyJeiRqdPOr4DEf5qX43pdJQu9OqKf43ynhQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] libxl: drop bootloader output if xenconsole
	file descriptor is not available for writing
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Andrew Cooper <andrew.cooper3@citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Ian@mx2.upc.es,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	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

2011/10/10 Andrew Cooper <andrew.cooper3@citrix.com>:
>
>
> On 10/10/11 15:04, Roger Pau Monne wrote:
>> # HG changeset patch
>> # User Roger Pau Monne <roger.pau@entel.upc.edu>
>> # Date 1318255452 -7200
>> # Node ID 1ebcb5d27ead38d6713d865704394ca99444f93c
>> # Parent =C2=A0a5b8d5c8c98e0dd17368eea1801a8edaf1e79e69
>> libxl: drop bootloader output if xenconsole file descriptor is not avail=
able for writing.
>>
>> Drop output from bootloader if the pty buffer is full and we cannot writ=
e more data. Prevents the bootloader from getting stuck when using ptys wit=
h small buffers.
>>
>> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
>>
>> diff -r a5b8d5c8c98e -r 1ebcb5d27ead tools/libxl/libxl_bootloader.c
>> --- a/tools/libxl/libxl_bootloader.c =C2=A0Mon Oct 10 11:26:22 2011 +020=
0
>> +++ b/tools/libxl/libxl_bootloader.c =C2=A0Mon Oct 10 16:04:12 2011 +020=
0
>> @@ -169,6 +169,7 @@ static char * bootloader_interact(libxl_
>>
>> =C2=A0 =C2=A0 =C2=A0size_t nr_out =3D 0, size_out =3D 0;
>> =C2=A0 =C2=A0 =C2=A0char *output =3D NULL;
>> + =C2=A0 =C2=A0struct timeval timeout;
>>
>> =C2=A0 =C2=A0 =C2=A0/* input from xenconsole. read on xenconsoled_fd wri=
te to bootloader_fd */
>> =C2=A0 =C2=A0 =C2=A0int xenconsoled_prod =3D 0, xenconsoled_cons =3D 0;
>> @@ -177,9 +178,14 @@ static char * bootloader_interact(libxl_
>> =C2=A0 =C2=A0 =C2=A0int bootloader_prod =3D 0, bootloader_cons =3D 0;
>> =C2=A0 =C2=A0 =C2=A0char bootloader_buf[BOOTLOADER_BUF_SIZE];
>>
>> + =C2=A0 =C2=A0/* Set timeout to 1s before starting to discard data */
>> + =C2=A0 =C2=A0timeout.tv_sec =3D 1;
>> + =C2=A0 =C2=A0timeout.tv_usec =3D 0;
>> +
>> =C2=A0 =C2=A0 =C2=A0while(1) {
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fd_set wsel, rsel;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int nfds;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0int space;
>
> You appear to introduce an unreferenced variable here.

Yes I've missed that one, sorry, second patch is ok.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 07:33:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 07:33:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDGvE-00019P-SM; Mon, 10 Oct 2011 07:33:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDGuF-0000ux-4Y
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 07:32:39 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318257137!46011254!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 426 invoked from network); 10 Oct 2011 14:32:17 -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;
	10 Oct 2011 14:32:17 -0000
X-IronPort-AV: E=Sophos;i="4.68,517,1312156800"; 
   d="scan'208";a="8305607"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 14:32: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; Mon, 10 Oct 2011 15:32:20 +0100
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
	1RDGtv-0003OO-GG; Mon, 10 Oct 2011 14:32:19 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RDGtv-0001ki-FY;
	Mon, 10 Oct 2011 15:32:19 +0100
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: <20115.499.220667.547225@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 15:32:19 +0100
To: Roger Pau =?iso-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH 5 of 9] libxl: only use interactive PyGrub
	mode when a console is attached
In-Reply-To: <CAPLaKK5AwPnrvfoPdbc8Ap6pyFqiBuvEWfFUmqSeN_-QR-TZQw@mail.gmail.com>
References: <patchbomb.1317386580@loki> <84a27a9f39f29194a734.1317386585@loki>
	<20109.55057.491612.998568@mariner.uk.xensource.com>
	<CAPLaKK5AwPnrvfoPdbc8Ap6pyFqiBuvEWfFUmqSeN_-QR-TZQw@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

Roger Pau Monné writes ("Re: [Xen-devel] [PATCH 5 of 9] libxl: only use interactive PyGrub mode when a console is attached"):
> I've digged a little more into this issue, and found out that NetBSD
> ptys have a 1024 buffer limit, and when this limit is hit, the select
> from libxl_bootloader:211 blocks and no more data is writen to
> xenconsole_fd and no more data is read from bootloader_fd (because
> bootloader_buf contains data), which of course blocks the execution of
> pygrub. Since the xenconsoled_fd pty is not monitored by xenconsole,
> nobody is draining data from it. I don't know the best way to solve
> this, but it seems like somebody should read the data from
> xenconsoled_fd and dispose it if there is no console attached.

That sounds unfortunate.  I agree with you.

Ian.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 07:52:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 07:52:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDHDN-00021K-Fn; Mon, 10 Oct 2011 07:52:25 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDHCb-0001ow-Vl
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 07:51:38 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318258293!34667769!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28590 invoked from network); 10 Oct 2011 14:51:34 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 14:51:34 -0000
Received: by vws13 with SMTP id 13so6882190vws.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 07:51:33 -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=ulC6z746D2/l1Pxx5witmQPA+qYdjGWgJHV/dh8FgWs=;
	b=EWptryRPvSaXdtxfUe/ZJM7VHN/A+As4P++Z9sycPk6gKVbqdY8fcjZ77JSOy8kl+D
	kk1Vp34vNcjnu9rKlGSo6gXzqRK/mXbK4fnZDQse8XFgz+aZt/UsPvlKZ41unpcoJEaL
	AaAzBkGpUQIO0ioweMIudduwl8NuxhinantXY=
MIME-Version: 1.0
Received: by 10.68.36.232 with SMTP id t8mr38367893pbj.54.1318258292926; Mon,
	10 Oct 2011 07:51:32 -0700 (PDT)
Received: by 10.142.225.20 with HTTP; Mon, 10 Oct 2011 07:51:32 -0700 (PDT)
In-Reply-To: <20115.499.220667.547225@mariner.uk.xensource.com>
References: <patchbomb.1317386580@loki> <84a27a9f39f29194a734.1317386585@loki>
	<20109.55057.491612.998568@mariner.uk.xensource.com>
	<CAPLaKK5AwPnrvfoPdbc8Ap6pyFqiBuvEWfFUmqSeN_-QR-TZQw@mail.gmail.com>
	<20115.499.220667.547225@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 16:51:32 +0200
X-Google-Sender-Auth: juYheo4IaS0oxMCQV_DDKw0GouE
Message-ID: <CAPLaKK7ZBR9twbU=6nt1RXPh0a5uzw_jBRHMi1V4YLVuTxghqA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 5 of 9] libxl: only use interactive PyGrub
	mode when a console is attached
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> That sounds unfortunate. =C2=A0I agree with you.

Well Ian Campbell proposed to use a timeout in select and drop data
when the timeout is hit, that what I've implemented in

libxl: drop bootloader output if xenconsole file descriptor is not
available for writing

The patch is quite simple and solves the problem, I don't think it
interferes with normal boot process, since a 1s timeout is quite high
for data to be delivered from xenconsoled_fd to the user if the
console is attached. The other option would be to modify xenconsole
daemon, but I think that's far too complicated for a problem that can
be solved easily.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 08:17:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08:17:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDHbC-0002ov-UF; Mon, 10 Oct 2011 08:17:02 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDHaL-0002cO-Gl
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:16:10 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318259765!34699973!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6673 invoked from network); 10 Oct 2011 15:16:06 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 15:16:06 -0000
Received: by vcbfo13 with SMTP id fo13so6901923vcb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 08:16: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:content-type
	:content-transfer-encoding;
	bh=57Iyd6REoy6nGHN8GLdWxO5/4F5zwz12i3fKJ8jXltU=;
	b=DRU++cQ/mbC1O2O5Q6swV9GHKlW7DkHWxPiJJ5RAIVQFOweqzfbusw3hVo8t9A45qP
	TlD9Wo7gxmUIl+N3h6Ip+gqmTmUvy0zb+sg8Fd0RXw3FJzRnIFV7C6M5dcfJ2aTXCoRF
	+AgOsaN7ZRLBh2BvMsShGU+uZ1YTh5222ZsZ4=
MIME-Version: 1.0
Received: by 10.52.92.132 with SMTP id cm4mr14253474vdb.5.1318259765033; Mon,
	10 Oct 2011 08:16:05 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Mon, 10 Oct 2011 08:16:04 -0700 (PDT)
In-Reply-To: <CAE1-PRdq9BWjTTHPPBPvESr-ULcdjHgPMTABcCO6+wCLJ1UYog@mail.gmail.com>
References: <CAE1-PRdq9BWjTTHPPBPvESr-ULcdjHgPMTABcCO6+wCLJ1UYog@mail.gmail.com>
Date: Mon, 10 Oct 2011 16:16:04 +0100
X-Google-Sender-Auth: 8js3dHzDplUikW3DCgFQ7xcktUY
Message-ID: <CAE1-PReA8E-kSif=BU=s-vzOqi-4F4LotxqofH7EEw+dYLtpUA@mail.gmail.com>
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Subject: [Xen-devel] Fwd: xentop reporting zero written sectors
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

No response in xen-users, asking developers ....

---------- Forwarded message ----------

Just moving a chunk of files from one filesysstem on xvba to another
on xvdb, and was monitoring with xentop as it was taking longer than
expected.

The VBD_RD =A0and VBD_WR counters were both clocking-up as expected, as
was the VBD_RSECT counter, but the VBD_WSECT counter was stuck on
zero, I toggled on the individual VBD device counters and these showed
the same (with the RD and WR counters correctly split between my
source and destination disks)

Is this a long standing "feature" that I've never noticed before or a
problem that should be reported?

Using the following packages from Fedora 16 beta

xen.x86_64 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 4.1.1-3.fc16
en-hypervisor.x86_64 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 4.1.1-3.fc16
xen-libs.x86_64 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 4.1.1-3=
.fc16
xen-licenses.x86_64 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A04.1.1-3.fc16
xen-runtime.x86_64 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A04.1.1-3.fc16
kernel.x86_64 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A03.=
1.0-0.rc8.git0.0.fc16

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 08:26:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08:26:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDHkI-0003Ks-GI; Mon, 10 Oct 2011 08:26:26 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDHjq-00038S-9A
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:25:59 -0700
X-Env-Sender: anthony@overnetdata.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1318260345!62934319!1
X-Originating-IP: [81.137.131.225]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7933 invoked from network); 10 Oct 2011 15:25:46 -0000
Received: from host81-137-131-225.in-addr.btopenworld.com (HELO
	zimbra.overnetdata.com) (81.137.131.225)
	by server-14.tower-21.messagelabs.com with SMTP;
	10 Oct 2011 15:25:46 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by zimbra.overnetdata.com (Postfix) with ESMTP id D1AD61616B7;
	Mon, 10 Oct 2011 16:25:54 +0100 (BST)
X-Virus-Scanned: amavisd-new at overnetdata.com
Received: from zimbra.overnetdata.com ([127.0.0.1])
	by localhost (zimbra.overnetdata.com [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id gnZwSL3TUfed; Mon, 10 Oct 2011 16:25:39 +0100 (BST)
Received: from [192.168.1.59] (unknown [192.168.1.59])
	by zimbra.overnetdata.com (Postfix) with ESMTPSA id 25A6E1615F9;
	Mon, 10 Oct 2011 16:25:39 +0100 (BST)
Message-ID: <4E930E71.7000306@overnetdata.com>
Date: Mon, 10 Oct 2011 16:25:37 +0100
From: Anthony Wright <anthony@overnetdata.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] dmidecode doesn't work under xen 4.1.1 on certain
	hardware
References: <20110926141322.GD4102@phenom.oracle.com>
	<4E8090D4.2090009@overnetdata.com>
	<20110926193732.GA10007@phenom.oracle.com>
	<4E82E429.2080600@overnetdata.com>
	<20110928132815.GE10270@phenom.oracle.com>
	<4E83462B.9080002@overnetdata.com> <4E835324.30902@citrix.com>
	<4E8AF9BA.3000906@overnetdata.com>
	<20111005151601.GA5223@phenom.oracle.com>
	<4E8DA4D1.2040904@overnetdata.com>
	<20111006160717.GA31310@phenom.oracle.com>
In-Reply-To: <20111006160717.GA31310@phenom.oracle.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>,
	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 06/10/2011 17:07, Konrad Rzeszutek Wilk wrote:
>>> If you feel adventours you could use the oss.oracle.com/git/kwilk/xen.git
>>> tree. Mainly the #linux-next or #testing branch. They both have David's new
>>> e820 code.
>>>
>>> The way to get it is:
>>>
>>> git clone oss.oracle.com/git/kwilk/xen.git
>>> cd xen
>>> git checkout origin/linux-next
>>> make -j90 
>> Sorry it panicked :-(
>> I've attached two photos of the two flavours of panic & a copy of the
>> config.
> No serial console? Did it panic when you booted as baremetal?
Sorry - no serial console - I hadn't really intended to become part
kernel hacker!! We're looking for leads to see if we can set it up, but
I'm going to have to look through the attic into some old dusty boxes...

It runs through fine on bare metal.

>> It seems to get through the initial kernel boot and hands over to my
>> init script, but panics early on in that process, probably at the point
>> that udev is loading modules.
> Looks completly unrelated to the dmidecode issue. Lets attack one thing
> at a time.
>
> Can you move the ioatdma.ko as .bak so it wont load and try again.
I moved the ioatdma.ko module out of the way, but I'm still getting the
panics in my init script as udev registers the devices. It's the same
panic as I attached a photo of in the previous email (the one with
xen_force_evtchk_callback & do_coprocessor_segment_overrun in the call
stack).


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 08:29:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08:29:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDHmv-0003km-9y; Mon, 10 Oct 2011 08:29:09 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDHmM-0003Y0-W9
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:28:35 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318260510!433170!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8118 invoked from network); 10 Oct 2011 15:28:31 -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; 10 Oct 2011 15:28:31 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AFSMh9023903
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 15:28:24 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AFSM74009399
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 15:28:22 GMT
Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9AFSG3T015019; Mon, 10 Oct 2011 10:28:16 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 08:28:16 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id AEE3A120E; Mon, 10 Oct 2011 11:28:15 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	hch@infradead.org, Jan Beulich <JBeulich@novell.com>
Date: Mon, 10 Oct 2011 11:28:13 -0400
Message-Id: <1318260494-27985-3-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.5.4
In-Reply-To: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090204.4E930F19.0022,ss=1,re=0.000,fgs=0
Cc: Li Dongyang <lidongyang@novell.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 2/3] xen/blkback: Fix the inhibition to map
	pages when discarding sector ranges.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 'operation' parameters are the ones provided to the bio layer while
the req->operation are the ones passed in between the backend and
frontend. We used the wrong 'operation' value to squash the
call to map pages when processing the discard operation resulting
in mapping the pages unnecessarily.

CC: Li Dongyang <lidongyang@novell.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/block/xen-blkback/blkback.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index 184b133..3da9a40 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -707,7 +707,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
 	 * the hypercall to unmap the grants - that is all done in
 	 * xen_blkbk_unmap.
 	 */
-	if (operation != BLKIF_OP_DISCARD &&
+	if (operation != REQ_DISCARD &&
 			xen_blkbk_map(req, pending_req, seg))
 		goto fail_flush;
 
-- 
1.7.5.4


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 08:29:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08:29:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDHni-00047F-Li; Mon, 10 Oct 2011 08:29:58 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDHmN-0003Y2-PL
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:28:36 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1318260490!41613703!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2948 invoked from network); 10 Oct 2011 15:28:11 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Oct 2011 15:28:11 -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
	p9AFSMq5023896
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 10 Oct 2011 15:28: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
	p9AFSMPR007261
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 15:28:22 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
	p9AFSGlA015016; Mon, 10 Oct 2011 10:28:16 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 08:28:16 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id A0795208; Mon, 10 Oct 2011 11:28:15 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	hch@infradead.org, Jan Beulich <JBeulich@novell.com>
Date: Mon, 10 Oct 2011 11:28:11 -0400
Message-Id: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.5.4
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4E930F18.019A:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: 
Subject: [Xen-devel] [PATCH] Xen block fixes, secure discard,
	and barrier support for 3.2 (v1)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

 [PATCH 1/3] xen/blkback: Support 'feature-barrier' aka old-style

The BARRIER support is done by:
 1) setting the drain value to one and waiting for the 'complete waitqueue' to be
    complete. We also double-check the kthread status in case the interface is being
    disconnected. Waiting means stalling processing of the queue.
 2) By latching on the refcnt value which is incremented every time a 'struct request'
    is used for a particular interface we can figure out outstanding I/Os.
    The refcnt is decremented when all the bio's that were generated for the
    'struct request' have been processed. When we detect that all outstanding
    'struct request' and their bio's have been completed we notify the
    'complete waitqueue' which halted processing of the ring.
 3) When the 'complete waitqueue' is signaled, it submits a WRITE_FLUSH
    operation.

That should take care of emulating the drain behavior properly. When I ran with SLES11
guests using the ext3/reiserfs using the 'fio tiobench-example;fio fsx' they ran fine.
Also killing the guest during runtime and then restarting showed no corruption.
If there are some better tests to check for proper operation of this - please advise.

 [PATCH 2/3] xen/blkback: Fix the inhibition to map pages when

Obvious bugfix in the 'feature-discard' patchset.

 [PATCH 3/3] xen/blk[front|back]: Enhance discard support with secure

We also provide the REQ_SECURE support to allow the user to now issue:
 'blkdev_issue_discard(.., secure)' flag.

[NOTE: My SSD died on my - so I can't test this yet - going through the process
of RMA-ing it, so please consider the 3/3 patch more as an RFC as it has not been tested].

Please review.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 08:31:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08: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 1RDHot-0004ab-Db; Mon, 10 Oct 2011 08:31:11 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDHmP-0003Y3-PV
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:28:38 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1318260513!16689472!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15709 invoked from network); 10 Oct 2011 15:28:34 -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; 10 Oct 2011 15:28:34 -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
	p9AFSMAs023893
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 10 Oct 2011 15:28:24 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
	p9AFSLDO023242
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 15:28:22 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
	p9AFSGcX023038; Mon, 10 Oct 2011 10:28:16 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 08:28:16 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id B6EF41361; Mon, 10 Oct 2011 11:28:15 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	hch@infradead.org, Jan Beulich <JBeulich@novell.com>
Date: Mon, 10 Oct 2011 11:28:14 -0400
Message-Id: <1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.5.4
In-Reply-To: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
References: <1318260494-27985-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.4E930F18.0179:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Li Dongyang <lidongyang@novell.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing 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

Part of the blkdev_issue_discard(xx) operation is that it can also
issue a secure discard operation that will permanantly remove the
sectors in question. We advertise that we can support that via the
'discard-secure' attribute and on the request, if the 'secure' bit
is set, we will attempt to pass in REQ_DISCARD | REQ_SECURE.

CC: Li Dongyang <lidongyang@novell.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/block/xen-blkback/blkback.c |    4 +++-
 drivers/block/xen-blkback/common.h  |    5 +++++
 drivers/block/xen-blkback/xenbus.c  |   12 ++++++++++++
 drivers/block/xen-blkfront.c        |   19 +++++++++++++++++--
 include/xen/interface/io/blkif.h    |    5 +++++
 5 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index 3da9a40..0bd7143 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -427,7 +427,9 @@ static void xen_blk_discard(struct xen_blkif *blkif, struct blkif_request *req)
 		err = blkdev_issue_discard(bdev,
 				req->u.discard.sector_number,
 				req->u.discard.nr_sectors,
-				GFP_KERNEL, 0);
+				GFP_KERNEL,
+				blkif->vbd.discard_secure ?
+				req->u.discard.secure : 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;
diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
index e638457..ed64ba8 100644
--- a/drivers/block/xen-blkback/common.h
+++ b/drivers/block/xen-blkback/common.h
@@ -72,6 +72,7 @@ struct blkif_x86_32_request_rw {
 struct blkif_x86_32_request_discard {
 	blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
 	uint64_t nr_sectors;
+	uint8_t secure:1;
 };
 
 struct blkif_x86_32_request {
@@ -101,6 +102,7 @@ struct blkif_x86_64_request_rw {
 struct blkif_x86_64_request_discard {
 	blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
 	uint64_t nr_sectors;
+	uint8_t secure:1;
 };
 
 struct blkif_x86_64_request {
@@ -157,6 +159,7 @@ struct xen_vbd {
 	/* Cached size parameter. */
 	sector_t		size;
 	bool			flush_support;
+	bool			discard_secure;
 };
 
 struct backend_info;
@@ -259,6 +262,7 @@ static inline void blkif_get_x86_32_req(struct blkif_request *dst,
 	case BLKIF_OP_DISCARD:
 		dst->u.discard.sector_number = src->u.discard.sector_number;
 		dst->u.discard.nr_sectors = src->u.discard.nr_sectors;
+		dst->u.discard.secure = src->u.discard.secure;
 		break;
 	default:
 		break;
@@ -288,6 +292,7 @@ static inline void blkif_get_x86_64_req(struct blkif_request *dst,
 	case BLKIF_OP_DISCARD:
 		dst->u.discard.sector_number = src->u.discard.sector_number;
 		dst->u.discard.nr_sectors = src->u.discard.nr_sectors;
+		dst->u.discard.secure = src->u.discard.secure;
 		break;
 	default:
 		break;
diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index a6d4303..0c0ce39 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -378,6 +378,9 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
 	if (q && q->flush_flags)
 		vbd->flush_support = true;
 
+	if (q && blk_queue_secdiscard(q))
+		vbd->discard_secure = true;
+
 	DPRINTK("Successful creation of handle=%04x (dom=%u)\n",
 		handle, blkif->domid);
 	return 0;
@@ -460,6 +463,15 @@ int xen_blkbk_discard(struct xenbus_transaction xbt, struct backend_info *be)
 				state = 1;
 				blkif->blk_backend_type = BLKIF_BACKEND_PHY;
 			}
+			/* Optional. */
+			err = xenbus_printf(xbt, dev->nodename,
+				"discard-secure", "%d",
+				blkif->vbd.discard_secure);
+			if (err) {
+				xenbus_dev_fatal(dev, err,
+					"writting discard-secure");
+				goto kfree;
+			}
 		}
 	} else {
 		err = PTR_ERR(type);
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index e9d301c..bc39b5e 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -98,7 +98,8 @@ struct blkfront_info
 	unsigned long shadow_free;
 	unsigned int feature_flush;
 	unsigned int flush_op;
-	unsigned int feature_discard;
+	unsigned int feature_discard:1;
+	unsigned int feature_secdiscard:1;
 	unsigned int discard_granularity;
 	unsigned int discard_alignment;
 	int is_ready;
@@ -305,11 +306,13 @@ static int blkif_queue_request(struct request *req)
 		ring_req->operation = info->flush_op;
 	}
 
-	if (unlikely(req->cmd_flags & REQ_DISCARD)) {
+	if (unlikely(req->cmd_flags & (REQ_DISCARD | REQ_SECURE))) {
 		/* id, sector_number and handle are set above. */
 		ring_req->operation = BLKIF_OP_DISCARD;
 		ring_req->nr_segments = 0;
 		ring_req->u.discard.nr_sectors = blk_rq_sectors(req);
+		if ((req->cmd_flags & REQ_SECURE) && info->feature_secdiscard)
+			ring_req->u.discard.secure = 1;
 	} else {
 		ring_req->nr_segments = blk_rq_map_sg(req->q, req, info->sg);
 		BUG_ON(ring_req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST);
@@ -424,6 +427,8 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
 		blk_queue_max_discard_sectors(rq, get_capacity(gd));
 		rq->limits.discard_granularity = info->discard_granularity;
 		rq->limits.discard_alignment = info->discard_alignment;
+		if (info->feature_secdiscard)
+			queue_flag_set_unlocked(QUEUE_FLAG_SECDISCARD, rq);
 	}
 
 	/* Hard sector size and max sectors impersonate the equiv. hardware. */
@@ -749,7 +754,9 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 					   info->gd->disk_name);
 				error = -EOPNOTSUPP;
 				info->feature_discard = 0;
+				info->feature_secdiscard = 0;
 				queue_flag_clear(QUEUE_FLAG_DISCARD, rq);
+				queue_flag_clear(QUEUE_FLAG_SECDISCARD, rq);
 			}
 			__blk_end_request_all(req, error);
 			break;
@@ -1135,11 +1142,13 @@ static void blkfront_setup_discard(struct blkfront_info *info)
 	char *type;
 	unsigned int discard_granularity;
 	unsigned int discard_alignment;
+	unsigned int discard_secure;
 
 	type = xenbus_read(XBT_NIL, info->xbdev->otherend, "type", NULL);
 	if (IS_ERR(type))
 		return;
 
+	info->feature_secdiscard = 0;
 	if (strncmp(type, "phy", 3) == 0) {
 		err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
 			"discard-granularity", "%u", &discard_granularity,
@@ -1150,6 +1159,12 @@ static void blkfront_setup_discard(struct blkfront_info *info)
 			info->discard_granularity = discard_granularity;
 			info->discard_alignment = discard_alignment;
 		}
+		err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
+			    "discard-secure", "%d", &discard_secure,
+			    NULL);
+		if (!err)
+			info->feature_secdiscard = discard_secure;
+
 	} else if (strncmp(type, "file", 4) == 0)
 		info->feature_discard = 1;
 
diff --git a/include/xen/interface/io/blkif.h b/include/xen/interface/io/blkif.h
index 9324488..04f60b0 100644
--- a/include/xen/interface/io/blkif.h
+++ b/include/xen/interface/io/blkif.h
@@ -84,6 +84,10 @@ typedef uint64_t blkif_sector_t;
  *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
  * http://www.seagate.com/staticfiles/support/disc/manuals/
  *     Interface%20manuals/100293068c.pdf
+ * We also provide three extra XenBus options to the discard operation:
+ * 'discard-granularity' - Max amount of sectors that can be discarded.
+ * 'discard-alignment' - 4K, 128K, etc aligment on sectors to erased.
+ * 'discard-secure' - whether the discard can also securely erase data.
  */
 #define BLKIF_OP_DISCARD           5
 
@@ -107,6 +111,7 @@ struct blkif_request_rw {
 struct blkif_request_discard {
 	blkif_sector_t sector_number;
 	uint64_t nr_sectors;
+	uint8_t secure:1;
 };
 
 struct blkif_request {
-- 
1.7.5.4


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 08:32:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08:32:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDHph-0004wz-3y; Mon, 10 Oct 2011 08:32:01 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDHmR-0003YE-3x
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:28:39 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1318260507!52285460!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24215 invoked from network); 10 Oct 2011 15:28:29 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Oct 2011 15:28:29 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AFSMFL009941
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 15:28:24 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AFSLeC009384
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 15:28:22 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9AFSG4L013852; Mon, 10 Oct 2011 10:28:16 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 08:28:16 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id A70C762; Mon, 10 Oct 2011 11:28:15 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	hch@infradead.org, Jan Beulich <JBeulich@novell.com>
Date: Mon, 10 Oct 2011 11:28:12 -0400
Message-Id: <1318260494-27985-2-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.5.4
In-Reply-To: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090203.4E930F18.0246,ss=1,re=0.000,fgs=0
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 1/3] xen/blkback: Support 'feature-barrier' aka
	old-style BARRIER requests.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 emulate the barrier requests by draining the outstanding bio's
and then sending the WRITE_FLUSH command. To drain the I/Os
we use the refcnt that is used during disconnect to wait for all
the I/Os before disconnecting from the frontend. We latch on its
value and if it reaches either the threshold for disconnect or when
there are no more outstanding I/Os, then we have drained all I/Os.

Suggested-by: Christopher Hellwig <hch@infradead.org>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/block/xen-blkback/blkback.c |   37 +++++++++++++++++++++++++++++++++-
 drivers/block/xen-blkback/common.h  |    5 ++++
 drivers/block/xen-blkback/xenbus.c  |   18 +++++++++++++++++
 3 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index e0dab61..184b133 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -452,6 +452,23 @@ static void xen_blk_discard(struct xen_blkif *blkif, struct blkif_request *req)
 	make_response(blkif, req->id, req->operation, status);
 }
 
+static void xen_blk_drain_io(struct xen_blkif *blkif)
+{
+	atomic_set(&blkif->drain, 1);
+	do {
+		wait_for_completion_interruptible_timeout(
+				&blkif->drain_complete, HZ);
+
+		if (!atomic_read(&blkif->drain))
+			break;
+		/* The initial value is one, and one refcnt taken at the
+		 * start of the xen_blkif_schedule thread. */
+		if (atomic_read(&blkif->refcnt) <= 2)
+			break;
+	} while (!kthread_should_stop());
+	atomic_set(&blkif->drain, 0);
+}
+
 /*
  * Completion callback on the bio's. Called as bh->b_end_io()
  */
@@ -464,6 +481,11 @@ static void __end_block_io_op(struct pending_req *pending_req, int error)
 		pr_debug(DRV_PFX "flush diskcache op failed, not supported\n");
 		xen_blkbk_flush_diskcache(XBT_NIL, pending_req->blkif->be, 0);
 		pending_req->status = BLKIF_RSP_EOPNOTSUPP;
+	} else if ((pending_req->operation == BLKIF_OP_WRITE_BARRIER) &&
+		    (error == -EOPNOTSUPP)) {
+		pr_debug(DRV_PFX "write barrier op failed, not supported\n");
+		xen_blkbk_barrier(XBT_NIL, pending_req->blkif->be, 0);
+		pending_req->status = BLKIF_RSP_EOPNOTSUPP;
 	} else if (error) {
 		pr_debug(DRV_PFX "Buffer not up-to-date at end of operation,"
 			 " error=%d\n", error);
@@ -481,6 +503,10 @@ static void __end_block_io_op(struct pending_req *pending_req, int error)
 			      pending_req->operation, pending_req->status);
 		xen_blkif_put(pending_req->blkif);
 		free_req(pending_req);
+		if (atomic_read(&pending_req->blkif->refcnt) <= 2) {
+			if (atomic_read(&pending_req->blkif->drain))
+				complete(&pending_req->blkif->drain_complete);
+		}
 	}
 }
 
@@ -574,7 +600,6 @@ do_block_io_op(struct xen_blkif *blkif)
 
 	return more_to_do;
 }
-
 /*
  * Transmutation of the 'struct blkif_request' to a proper 'struct bio'
  * and call the 'submit_bio' to pass it to the underlying storage.
@@ -591,6 +616,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
 	int i, nbio = 0;
 	int operation;
 	struct blk_plug plug;
+	bool drain = false;
 
 	switch (req->operation) {
 	case BLKIF_OP_READ:
@@ -601,6 +627,8 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
 		blkif->st_wr_req++;
 		operation = WRITE_ODIRECT;
 		break;
+	case BLKIF_OP_WRITE_BARRIER:
+		drain = true;
 	case BLKIF_OP_FLUSH_DISKCACHE:
 		blkif->st_f_req++;
 		operation = WRITE_FLUSH;
@@ -609,7 +637,6 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
 		blkif->st_ds_req++;
 		operation = REQ_DISCARD;
 		break;
-	case BLKIF_OP_WRITE_BARRIER:
 	default:
 		operation = 0; /* make gcc happy */
 		goto fail_response;
@@ -668,6 +695,12 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
 		}
 	}
 
+	/* Wait on all outstanding I/O's and once that has been completed
+	 * issue the WRITE_FLUSH.
+	 */
+	if (drain)
+		xen_blk_drain_io(pending_req->blkif);
+
 	/*
 	 * If we have failed at this point, we need to undo the M2P override,
 	 * set gnttab_set_unmap_op on all of the grant references and perform
diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
index 1b1bc44..e638457 100644
--- a/drivers/block/xen-blkback/common.h
+++ b/drivers/block/xen-blkback/common.h
@@ -181,6 +181,9 @@ struct xen_blkif {
 	atomic_t		refcnt;
 
 	wait_queue_head_t	wq;
+	/* for barrier (drain) requests */
+	struct completion	drain_complete;
+	atomic_t		drain;
 	/* One thread per one blkif. */
 	struct task_struct	*xenblkd;
 	unsigned int		waiting_reqs;
@@ -229,6 +232,8 @@ int xen_blkif_schedule(void *arg);
 int xen_blkbk_flush_diskcache(struct xenbus_transaction xbt,
 			      struct backend_info *be, int state);
 
+int xen_blkbk_barrier(struct xenbus_transaction xbt,
+		      struct backend_info *be, int state);
 struct xenbus_device *xen_blkbk_xenbus(struct backend_info *be);
 
 static inline void blkif_get_x86_32_req(struct blkif_request *dst,
diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index 1c44b32..a6d4303 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -114,6 +114,8 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid)
 	spin_lock_init(&blkif->blk_ring_lock);
 	atomic_set(&blkif->refcnt, 1);
 	init_waitqueue_head(&blkif->wq);
+	init_completion(&blkif->drain_complete);
+	atomic_set(&blkif->drain, 0);
 	blkif->st_print = jiffies;
 	init_waitqueue_head(&blkif->waiting_to_free);
 
@@ -474,6 +476,19 @@ kfree:
 out:
 	return err;
 }
+int xen_blkbk_barrier(struct xenbus_transaction xbt,
+		      struct backend_info *be, int state)
+{
+	struct xenbus_device *dev = be->dev;
+	int err;
+
+	err = xenbus_printf(xbt, dev->nodename, "feature-barrier",
+			    "%d", state);
+	if (err)
+		xenbus_dev_fatal(dev, err, "writing feature-barrier");
+
+	return err;
+}
 
 /*
  * Entry point to this code when a new device is created.  Allocate the basic
@@ -708,6 +723,9 @@ again:
 
 	err = xen_blkbk_discard(xbt, be);
 
+	/* If we can't advertise it is OK. */
+	err = xen_blkbk_barrier(xbt, be, be->blkif->vbd.flush_support);
+
 	err = xenbus_printf(xbt, dev->nodename, "sectors", "%llu",
 			    (unsigned long long)vbd_sz(&be->blkif->vbd));
 	if (err) {
-- 
1.7.5.4


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 08:32:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08:32:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDHqX-0005Nj-LC; Mon, 10 Oct 2011 08:32:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDHnn-00048O-5h
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:30:03 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318260600!433339!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11529 invoked from network); 10 Oct 2011 15:30:00 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 15:30:00 -0000
X-IronPort-AV: E=Sophos;i="4.68,517,1312156800"; 
   d="scan'208";a="8307256"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 15:30: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, 10 Oct 2011 16:30:00 +0100
Subject: Re: [Xen-devel] Fwd: xentop reporting zero written sectors
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andy Burns <xen.lists@burns.me.uk>
Date: Mon, 10 Oct 2011 16:29:59 +0100
In-Reply-To: <CAE1-PReA8E-kSif=BU=s-vzOqi-4F4LotxqofH7EEw+dYLtpUA@mail.gmail.com>
References: <CAE1-PRdq9BWjTTHPPBPvESr-ULcdjHgPMTABcCO6+wCLJ1UYog@mail.gmail.com>
	<CAE1-PReA8E-kSif=BU=s-vzOqi-4F4LotxqofH7EEw+dYLtpUA@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: <1318260599.21903.455.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 Mon, 2011-10-10 at 16:16 +0100, Andy Burns wrote:
> No response in xen-users, asking developers ....
> 
> ---------- Forwarded message ----------
> 
> Just moving a chunk of files from one filesysstem on xvba to another
> on xvdb, and was monitoring with xentop as it was taking longer than
> expected.
> 
> The VBD_RD  and VBD_WR counters were both clocking-up as expected, as
> was the VBD_RSECT counter, but the VBD_WSECT counter was stuck on
> zero, I toggled on the individual VBD device counters and these showed
> the same (with the RD and WR counters correctly split between my
> source and destination disks)
> 
> Is this a long standing "feature" that I've never noticed before or a
> problem that should be reported?

How would it be a feature?

Scrobbling around under tools/xenstat these statistics appear to be read
from /sys/bus/xen-backend/devices/<vbd>/wr_sect (likewise rd_sect,
wr_req etc etc).

Can you see all of those and do the numbers appear to be doing the right
thing? This will indicate whether this is an issue with the kernel
producing the numbers or the tools consuming them.

Ian.

> 
> Using the following packages from Fedora 16 beta
> 
> xen.x86_64                                   4.1.1-3.fc16
> en-hypervisor.x86_64                 4.1.1-3.fc16
> xen-libs.x86_64                           4.1.1-3.fc16
> xen-licenses.x86_64                  4.1.1-3.fc16
> xen-runtime.x86_64                    4.1.1-3.fc16
> kernel.x86_64                              3.1.0-0.rc8.git0.0.fc16
> 
> _______________________________________________
> 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 Oct 10 08:37:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08:37:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDHuw-0005zV-OI; Mon, 10 Oct 2011 08:37:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDHuN-0005mj-Uq
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:36:52 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318261008!432775!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16091 invoked from network); 10 Oct 2011 15:36:48 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-12.tower-216.messagelabs.com with SMTP;
	10 Oct 2011 15:36:48 -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 p9AFaZfu013013
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 10 Oct 2011 11:36:35 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9AFaWjD025036; Mon, 10 Oct 2011 11:36:34 -0400
Date: Mon, 10 Oct 2011 11:36:32 -0400
From: Jason Baron <jbaron@redhat.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111010153631.GA2413@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 01, 2011 at 02:55:35PM -0700, Jeremy Fitzhardinge wrote:
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> 
> If a key has been enabled before jump_label_init() is called, don't
> nop it out.
> 
> This removes arch_jump_label_text_poke_early() (which can only nop
> out a site) and uses arch_jump_label_transform() instead.
> 
> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> ---
>  include/linux/jump_label.h |    3 ++-
>  kernel/jump_label.c        |   20 ++++++++------------
>  2 files changed, 10 insertions(+), 13 deletions(-)
> 
> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
> index 1213e9d..c8fb1b3 100644
> --- a/include/linux/jump_label.h
> +++ b/include/linux/jump_label.h
> @@ -45,7 +45,8 @@ extern void jump_label_lock(void);
>  extern void jump_label_unlock(void);
>  extern void arch_jump_label_transform(struct jump_entry *entry,
>  				 enum jump_label_type type);
> -extern void arch_jump_label_text_poke_early(jump_label_t addr);
> +extern void arch_jump_label_transform_early(struct jump_entry *entry,
> +				 enum jump_label_type type);
>  extern int jump_label_text_reserved(void *start, void *end);
>  extern void jump_label_inc(struct jump_label_key *key);
>  extern void jump_label_dec(struct jump_label_key *key);
> diff --git a/kernel/jump_label.c b/kernel/jump_label.c
> index a8ce450..059202d5 100644
> --- a/kernel/jump_label.c
> +++ b/kernel/jump_label.c
> @@ -121,13 +121,6 @@ static void __jump_label_update(struct jump_label_key *key,
>  	}
>  }
>  
> -/*
> - * Not all archs need this.
> - */
> -void __weak arch_jump_label_text_poke_early(jump_label_t addr)
> -{
> -}
> -
>  static __init int jump_label_init(void)
>  {
>  	struct jump_entry *iter_start = __start___jump_table;
> @@ -139,12 +132,15 @@ static __init int jump_label_init(void)
>  	jump_label_sort_entries(iter_start, iter_stop);
>  
>  	for (iter = iter_start; iter < iter_stop; iter++) {
> -		arch_jump_label_text_poke_early(iter->code);
> -		if (iter->key == (jump_label_t)(unsigned long)key)
> +		struct jump_label_key *iterk;
> +
> +		iterk = (struct jump_label_key *)(unsigned long)iter->key;
> +		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
> +					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
> +		if (iterk == key)
>  			continue;
>  
> -		key = (struct jump_label_key *)(unsigned long)iter->key;
> -		atomic_set(&key->enabled, 0);
> +		key = iterk;
>  		key->entries = iter;
>  #ifdef CONFIG_MODULES
>  		key->next = NULL;
> @@ -212,7 +208,7 @@ void jump_label_apply_nops(struct module *mod)
>  		return;
>  
>  	for (iter = iter_start; iter < iter_stop; iter++)
> -		arch_jump_label_text_poke_early(iter->code);
> +		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
>  }
>  
>  static int jump_label_add_module(struct module *mod)
> -- 
> 1.7.6.2
> 

Hi,

I just realized that the early call to jump_label_inc(), isn't being
honored with this patch until later when we invoke jump_label_init().
That strikes me as being inconsistent. When jump_label_inc() returns we
should expect the branch to be updated.

Thus, I think what probably want is to add a new 'int jump_label_init'
flag. If its not set we can call 'jump_label_init()' from
jump_label_inc()/dec(). And jump_label_init() can avoid initialization
if its already set.

Thanks,

-Jason 

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 08:50:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08:50:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDI7m-0007LC-Tc; Mon, 10 Oct 2011 08:50:42 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDI7D-00078q-Ca
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:50:07 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1318261804!435868!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3072 invoked from network); 10 Oct 2011 15:50:04 -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 Oct 2011 15:50:04 -0000
X-IronPort-AV: E=Sophos;i="4.68,518,1312156800"; 
   d="scan'208";a="8307804"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 15:50: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; Mon, 10 Oct 2011 16:50:04 +0100
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
	1RDI79-0003oU-Gq; Mon, 10 Oct 2011 15:50:03 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RDI79-0005aD-D8;
	Mon, 10 Oct 2011 16:50:03 +0100
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: <20115.5163.249179.667315@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 16:50:03 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] tools/check: check for yajl (needed by libxl)
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <be6610d3477ebd77eb37.1317807771@cosworth.uk.xensource.com>
References: <be6610d3477ebd77eb37.1317807771@cosworth.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Andre Przywara <andre.przywara@amd.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] tools/check: check for yajl (needed by libxl)"):
> tools/check: check for yajl (needed by libxl)

Thanks everyone.

Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
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 Oct 10 08:52:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08:52:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDI9M-0007jX-2V; Mon, 10 Oct 2011 08:52:20 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDI8f-0007Wg-6l
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:51:37 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318261779!39701550!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32009 invoked from network); 10 Oct 2011 15:49:40 -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 Oct 2011 15:49:40 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AFpSwC014557
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 15:51:30 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AFjW0F010817
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 15:45:33 GMT
Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9AFpMU1005792; Mon, 10 Oct 2011 10:51:22 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 08:51:20 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 0E3DBC54; Mon, 10 Oct 2011 11:51:11 -0400 (EDT)
Date: Mon, 10 Oct 2011 11:51:11 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Christopher S. Aker" <caker@theshore.net>
Subject: Re: [Xen-devel] vmalloc_sync_all() patch problems?
Message-ID: <20111010155110.GA29026@phenom.oracle.com>
References: <4E832F1A.3030209@theshore.net> <4E83330A.3030509@citrix.com>
	<4E834519.3090300@theshore.net> <4E8353B1.9070007@citrix.com>
	<4E85E26F.1030202@theshore.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E85E26F.1030202@theshore.net>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090204.4E931482.0100,ss=1,re=0.000,fgs=0
Cc: xen devel <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 Fri, Sep 30, 2011 at 11:38:23AM -0400, Christopher S. Aker wrote:
> On 9/28/11 1:04 PM, David Vrabel wrote:
> >On 28/09/11 17:02, Christopher S. Aker wrote:
> >>I've restarted the tests to see if I can reproduce, but I'm certain that
> >>if it happened once, it'll happen again.
> 
> I was able to reproduce it.
> 
> >Instead of the vmalloc_sync_all() patch you could try this series instead.
> >
> >http://lists.xensource.com/archives/html/xen-devel/2011-09/msg01343.html
> 
> I'll rebuild using this series and reset the tests.  Will let you know!

ping?

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 08:53:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08:53:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDIAp-00087E-4I; Mon, 10 Oct 2011 08:53:51 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDI8o-0007Xr-RK
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:51:47 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318261903!20683981!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26368 invoked from network); 10 Oct 2011 15:51:43 -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;
	10 Oct 2011 15:51:43 -0000
X-IronPort-AV: E=Sophos;i="4.68,518,1312156800"; 
   d="scan'208";a="8307844"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 15:51: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, 10 Oct 2011 16:51:43 +0100
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
	1RDI8k-0003pC-NG; Mon, 10 Oct 2011 15:51:42 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RDI8k-0005aU-Me;
	Mon, 10 Oct 2011 16:51:42 +0100
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: <20115.5262.639227.64829@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 16:51:42 +0100
To: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 0 of 6] Renaming/bugfixing/improving the ocaml
	libraries
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: 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

Jon Ludlam writes ("[Xen-devel] [PATCH 0 of 6] Renaming/bugfixing/improving the ocaml libraries"):
> This patch series is based on the previous set I sent. The first patch
> has been changed to rename the modules as well as the ocamlfind packages.
> The subsequent patches are largely similar to those sent last time, 
> with minor tweaks suggested by Ian Campbell - so they remove the log
> and uuid libraries, fix the dependencies of the xenctrl findlib 
> package, fix a couple of bugs in xenctrl and add a new feature to a 
> xenctrl function.

Thanks, I have applied all these six.  I had to fix up the first one
(the renaming) because the mmap_stubs.c file had changed since you
prepared the patch.  I just renamed the existing file to the new name
- I hope that was the right thing to do.  It did build.

Also I adjusted the .hgignore.

Ian.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 08:56:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 08:56:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDIDg-0000ji-Pm; Mon, 10 Oct 2011 08:56:48 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDIAi-00084b-AK
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 08:53:45 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1318261972!51770852!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11797 invoked from network); 10 Oct 2011 15:52:53 -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; 10 Oct 2011 15:52: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
	p9AFraOm018059
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 10 Oct 2011 15:53:37 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
	p9AFrZvB011753
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 15:53:35 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
	p9AFrTn0007872; Mon, 10 Oct 2011 10:53:30 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 08:53:29 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 09C0DC54; Mon, 10 Oct 2011 11:53:20 -0400 (EDT)
Date: Mon, 10 Oct 2011 11:53:19 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Zhenzhong Duan <zhenzhong.duan@oracle.com>,
	Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111010155319.GA29140@phenom.oracle.com>
References: <ce19ea02-45e6-465a-a4c8-b5d74bf8c2ad@default>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <ce19ea02-45e6-465a-a4c8-b5d74bf8c2ad@default>
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.4E931502.0110:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, linux-x86_64@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: [Xen-devel] Re: [PATCH] cpu idle ticks show twice in xen pvm 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

On Wed, Oct 05, 2011 at 10:11:58PM -0700, Zhenzhong Duan wrote:
> Run below test on xen pvm.
> # x=$(cat /proc/stat | grep cpu0 | awk '{print $5}') && sleep 60  \
> && y=$(cat /proc/stat | grep cpu0 | awk '{print $5}') \
> && echo -e  "X:$x\nY:$y\nIDLE:" $(echo "scale=3; ($y-$x)/6000*100" | bc)
> 
> @ X:58562301
> @ Y:58574282
> @ IDLE: 199.600
> 
> Normal idle percent should be around 100%.
> xen_timer_interrupt called account_idle_ticks to account hypervisor stolen idle ticks 
> but these ticks will be accounted again when idle ticks restarted.
> 
> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
> Signed-off-by: Joe Jin <joe.jin@oracle.com>

Please in the future also CC the maintainers (you can get that using
the scripts/get_maintainer.pl).

Jeremy, any thoughts?
> 
> diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
> index 163b467..5dcbc91 100644
> --- a/arch/x86/xen/time.c
> +++ b/arch/x86/xen/time.c
> @@ -151,7 +151,6 @@ static void do_stolen_accounting(void)
>  
>  	ticks = iter_div_u64_rem(blocked, NS_PER_TICK, &blocked);
>  	__this_cpu_write(xen_residual_blocked, blocked);
> -	account_idle_ticks(ticks);
>  }
>  
>  /* Get the TSC speed from Xen */
> --
> 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 Mon Oct 10 09:09:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 09: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 1RDIQ0-0001MA-I5; Mon, 10 Oct 2011 09:09:32 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDING-00017p-Gv
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 09:07:09 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318262781!57471985!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14309 invoked from network); 10 Oct 2011 16:06:22 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Oct 2011 16:06:22 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AG6VcE006404
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 16:06:33 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AG6UTX021588
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 16:06:31 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
	p9AG6Pie022966; Mon, 10 Oct 2011 11:06:25 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 09:06:25 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 69041154C; Mon, 10 Oct 2011 12:06:15 -0400 (EDT)
Date: Mon, 10 Oct 2011 12:06:15 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] xen-blkfront: plug device number leak in
	xlblk_init() error path
Message-ID: <20111010160615.GC28646@phenom.oracle.com>
References: <1318016078-7110-1-git-send-email-lersek@redhat.com>
	<1318251746.21903.430.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318251746.21903.430.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090201.4E93180A.00BC,ss=1,re=0.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Laszlo Ersek <lersek@redhat.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, Oct 10, 2011 at 02:02:25PM +0100, Ian Campbell wrote:
> Cc'ing Konrad & Jeremy per get_maintainers.pl
> 
> On Fri, 2011-10-07 at 20:34 +0100, Laszlo Ersek wrote:
> > ... though after a failed xenbus_register_frontend() all may be lost.
> 
> Indeed. But anyway:
> 
> Acked-by: Ian Campbell <ian.campbell@citrix.com>

Queue up for 3.2.
> 
> {net,kbd,fb,pci}front seem to not have this issue. Although it's not
> 100% clear if the effect of pci_frontend_registrar(1) needs to be
> undone.
> 
> (is registrar a typo for register here?)

Yes.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 09:10:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 09:10:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDIRP-0001ju-9s; Mon, 10 Oct 2011 09:10:59 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDIO1-00018p-73
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 09:07:37 -0700
X-Env-Sender: ml-xen-devel@hfp.de
X-Msg-Ref: server-8.tower-21.messagelabs.com!1318262828!62329276!1
X-Originating-IP: [88.205.101.6]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28925 invoked from network); 10 Oct 2011 16:07:08 -0000
Received: from rootsrv.hfp.de (HELO rootsrv.hfp.de) (88.205.101.6)
	by server-8.tower-21.messagelabs.com with SMTP;
	10 Oct 2011 16:07:08 -0000
Received: from localhost (localhost [127.0.0.1])
	by rootsrv.hfp.de (Postfix) with ESMTP id 3390C1A98BE;
	Mon, 10 Oct 2011 18:07:25 +0200 (CEST)
X-Virus-Scanned: amavisd-new/ClamAV at rootsrv.hfp.de
Received: from rootsrv.hfp.de ([127.0.0.1])
	by localhost (rootsrv.hfp.de [127.0.0.1]) (amavisd-new, port 10026)
	with ESMTP id M2t-merkxIJB; Mon, 10 Oct 2011 18:07:24 +0200 (CEST)
Received: from [10.0.0.1] (p57946215.dip.t-dialin.net [87.148.98.21])
	by rootsrv.hfp.de (Postfix) with ESMTPA;
	Mon, 10 Oct 2011 18:07:24 +0200 (CEST)
Message-ID: <4E93183D.80600@hfp.de>
Date: Mon, 10 Oct 2011 18:07:25 +0200
From: Andreas Kinzler <ml-xen-devel@hfp.de>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: James Harper <james.harper@bendigoit.com.au>
Subject: Re: [Xen-devel] RE: Stability report GPLPV 0.11.0.308
References: <4E64A0DF.2070007@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5DB8C@trantor>
	<4E64D569.5030607@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5DBBF@trantor>
	<4E7728F9.9020208@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E008@trantor>
	<4E7B04A4.9070601@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E072@trantor>
	<4E7CF2A8.5040405@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E0D0@trantor>
	<4E808FE9.5050008@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E190@trantor>
	<4E858925.6090903@hfp.de>
	<AEC6C66638C05B468B556EA548C1A77D01E5E2E0@trantor>
	<4E86F53B.4050100@hfp.de>
In-Reply-To: <4E86F53B.4050100@hfp.de>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
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

Hello James,

>> Actually one other thing you could try is simply using the Windows
>> 2003 version of the drivers. That uses ndis5 and scsiport instead
>> of ndis6 and storport. If that worked we could try running with
>> ndis5 + storport and see if that works okay. As long as they are
>> from the same patchlevel it shouldn't matter if you use one
>> compiled for windows 2008 and one for windows 2003 (it's possible
>> that it might matter but I can't think of anything).
> I now compiled 0.11.0.312 with scsiport and ndis5 (and patched the
> .inf file, deleted the [XenGplPv.NT$ARCH$.6.0] section). Test is now
> running.

Crashed after 1-2 days, but actually I found that ndis5 of 0.11.0.213
has major differences from ndis5 of 0.11.0.312 so I am not sure what
that means?

The whole reason I am doing all the testing is because the net
performance of 0.11.0.213 is not good enough and 0.11.0.312 has near
native performance on gigabit links - but even the ndis5 driver of
0.11.0.312 has very good performance so it does not seem to be an NDIS 6
improvement.

Any news on your side?

Regards Andreas

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 09:13:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 09:13:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDIU1-00028d-UI; Mon, 10 Oct 2011 09:13:41 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDITW-0001ws-QQ
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 09:13:12 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318263187!20538823!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10713 invoked from network); 10 Oct 2011 16:13: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;
	10 Oct 2011 16:13:07 -0000
X-IronPort-AV: E=Sophos;i="4.68,518,1312156800"; 
   d="scan'208";a="8308402"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 16:13:07 +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, 10 Oct 2011 17:13:07 +0100
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Mon, 10 Oct 2011 17:13:07 +0100
In-Reply-To: <1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@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: <1318263187.21903.464.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "hch@infradead.org" <hch@infradead.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Li Dongyang <lidongyang@novell.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	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

On Mon, 2011-10-10 at 16:28 +0100, Konrad Rzeszutek Wilk wrote:
> diff --git a/include/xen/interface/io/blkif.h b/include/xen/interface/io/blkif.h
> index 9324488..04f60b0 100644
> --- a/include/xen/interface/io/blkif.h
> +++ b/include/xen/interface/io/blkif.h
> @@ -84,6 +84,10 @@ typedef uint64_t blkif_sector_t;
>   *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
>   * http://www.seagate.com/staticfiles/support/disc/manuals/
>   *     Interface%20manuals/100293068c.pdf
> + * We also provide three extra XenBus options to the discard operation:
> + * 'discard-granularity' - Max amount of sectors that can be discarded.
> + * 'discard-alignment' - 4K, 128K, etc aligment on sectors to erased.
> + * 'discard-secure' - whether the discard can also securely erase data.
>   */
>  #define BLKIF_OP_DISCARD           5
>  
> @@ -107,6 +111,7 @@ struct blkif_request_rw {
>  struct blkif_request_discard {
>         blkif_sector_t sector_number;
>         uint64_t nr_sectors;
> +       uint8_t secure:1;
>  };
>  
>  struct blkif_request { 

Which tree/branch is this? I don't see BLKIF_OP_DISCARD in mainline or
your linux-next branch.

Since this changes an inter-guest ABI we may need to consider backwards
compatibility (I suspect this interface is new enough that no one has
actually implemented it in anger and we can get away with changing it).
In any case it should also be posted against the canonical inter-guest
interface definition in the xen tree for review with that in mind.

I think an explicit flag variable is likely to be less trouble WRT
maintaining compatibility in the future than a bit-field. Also I think
you may as well align the struct size to something larger than a byte,
either 4 or 8 bytes would make sense.

Ian.


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 09:14:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 09:14:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDIV3-0002Vw-Q7; Mon, 10 Oct 2011 09:14:45 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDIUZ-0002Ju-0w; Mon, 10 Oct 2011 09:14:15 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318263250!438650!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16913 invoked from network); 10 Oct 2011 16:14:11 -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; 10 Oct 2011 16:14: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
	p9AGE7gU017756
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 10 Oct 2011 16:14:08 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
	p9AGE520025165
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 16:14:05 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
	p9AGDx5l028466; Mon, 10 Oct 2011 11:13:59 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 09:13:59 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 41AE5C54; Mon, 10 Oct 2011 12:04:04 -0400 (EDT)
Date: Mon, 10 Oct 2011 12:04:04 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Lars Kurth <lars.kurth@xen.org>
Subject: Re: [Xen-devel] Xen document day (Oct 12 or 26)
Message-ID: <20111010160404.GB28646@phenom.oracle.com>
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org>
	<20111003185309.GC15608@phenom.oracle.com>
	<4E92D809.9000504@xen.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E92D809.9000504@xen.org>
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.4E9319D1.011F:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Joseph Glanville <joseph.glanville@orionvm.com.au>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, Oct 10, 2011 at 12:33:29PM +0100, Lars Kurth wrote:
> Looks like me being maxed out means we are too close to Oct 12th
> now. Does anybody object to doing this on the 26th?

I am OK.
> 
> How long will the day be? An afternoon? A whole day with rolling
> time-zones?

One day. As much as people can do I would think.

> 
> > In lots of ways. There is a lot of things that we want to do - but
> I don't think we can do
> > _all_ of them. Can you help us determine what ought to have a
> higher priority?
> In a nutshell:
> - We should focus on some of the shortfalls we identified at the Hackathon
>   (CLI guides, man pages, etc.)?
> - We should also do a quick Wiki sanity check (i.e. identify
> important pages, which are wrong)
>   I can help guide this
> 
> Maybe we can split into two groups

<nods>

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 09:18:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 09:18:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDIYB-0003aU-V5; Mon, 10 Oct 2011 09:18:00 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDIW2-0002pt-K4
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 09:15:47 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318263342!18909789!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12445 invoked from network); 10 Oct 2011 16:15:43 -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; 10 Oct 2011 16:15:43 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AGFcnk002232
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 16:15:40 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AGFbPs008813
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 16:15:38 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
	p9AGFWtH031291; Mon, 10 Oct 2011 11:15:32 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 09:15:31 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 6CD6BC54; Mon, 10 Oct 2011 12:15:22 -0400 (EDT)
Date: Mon, 10 Oct 2011 12:15:22 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony Wright <anthony@overnetdata.com>
Subject: Re: [Xen-devel] dmidecode doesn't work under xen 4.1.1 on certain
	hardware
Message-ID: <20111010161522.GD28646@phenom.oracle.com>
References: <20110926193732.GA10007@phenom.oracle.com>
	<4E82E429.2080600@overnetdata.com>
	<20110928132815.GE10270@phenom.oracle.com>
	<4E83462B.9080002@overnetdata.com> <4E835324.30902@citrix.com>
	<4E8AF9BA.3000906@overnetdata.com>
	<20111005151601.GA5223@phenom.oracle.com>
	<4E8DA4D1.2040904@overnetdata.com>
	<20111006160717.GA31310@phenom.oracle.com>
	<4E930E71.7000306@overnetdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E930E71.7000306@overnetdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090202.4E931A2D.000D,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <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 Mon, Oct 10, 2011 at 04:25:37PM +0100, Anthony Wright wrote:
> On 06/10/2011 17:07, Konrad Rzeszutek Wilk wrote:
> >>> If you feel adventours you could use the oss.oracle.com/git/kwilk/xen.git
> >>> tree. Mainly the #linux-next or #testing branch. They both have David's new
> >>> e820 code.
> >>>
> >>> The way to get it is:
> >>>
> >>> git clone oss.oracle.com/git/kwilk/xen.git
> >>> cd xen
> >>> git checkout origin/linux-next
> >>> make -j90 
> >> Sorry it panicked :-(
> >> I've attached two photos of the two flavours of panic & a copy of the
> >> config.
> > No serial console? Did it panic when you booted as baremetal?
> Sorry - no serial console - I hadn't really intended to become part
> kernel hacker!! We're looking for leads to see if we can set it up, but
> I'm going to have to look through the attic into some old dusty boxes...

Heheh.
> 
> It runs through fine on bare metal.

Ok, this was the #linux-next branch right? If you did:

git checkout v3.1-rc8

and built that kernel does it work? (Trying to figure out if the patches
in #linux-next are the cause of your failure).

> 
> >> It seems to get through the initial kernel boot and hands over to my
> >> init script, but panics early on in that process, probably at the point
> >> that udev is loading modules.
> > Looks completly unrelated to the dmidecode issue. Lets attack one thing
> > at a time.
> >
> > Can you move the ioatdma.ko as .bak so it wont load and try again.
> I moved the ioatdma.ko module out of the way, but I'm still getting the
> panics in my init script as udev registers the devices. It's the same
> panic as I attached a photo of in the previous email (the one with
> xen_force_evtchk_callback & do_coprocessor_segment_overrun in the call
> stack).

Oh, I somehow missed the do_coprocessor_segment_overrun. That looks to
be something entirely new or perhaps: http://bugs.debian.org/642154

Hm, let me take a look at the photos once more.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 09:19:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 09:19:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDIa0-000443-Ho; Mon, 10 Oct 2011 09:19:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDIZL-0003ru-4P
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 09:19:11 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318263532!43633399!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8543 invoked from network); 10 Oct 2011 16:18:53 -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; 10 Oct 2011 16:18:53 -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
	p9AGJ3a8006924
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 10 Oct 2011 16:19:05 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
	p9AGJ1Sa016321
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 16:19:01 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
	p9AGIr5R001532; Mon, 10 Oct 2011 11:18:55 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 09:18:51 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id A4A22C54; Mon, 10 Oct 2011 12:18:41 -0400 (EDT)
Date: Mon, 10 Oct 2011 12:18:41 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony Wright <anthony@overnetdata.com>
Subject: Re: [Xen-devel] dmidecode doesn't work under xen 4.1.1 on certain
	hardware
Message-ID: <20111010161841.GE28646@phenom.oracle.com>
References: <20110926193732.GA10007@phenom.oracle.com>
	<4E82E429.2080600@overnetdata.com>
	<20110928132815.GE10270@phenom.oracle.com>
	<4E83462B.9080002@overnetdata.com> <4E835324.30902@citrix.com>
	<4E8AF9BA.3000906@overnetdata.com>
	<20111005151601.GA5223@phenom.oracle.com>
	<4E8DA4D1.2040904@overnetdata.com>
	<20111006160717.GA31310@phenom.oracle.com>
	<4E930E71.7000306@overnetdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E930E71.7000306@overnetdata.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.4E931AF9.0110:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <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 Mon, Oct 10, 2011 at 04:25:37PM +0100, Anthony Wright wrote:
> On 06/10/2011 17:07, Konrad Rzeszutek Wilk wrote:
> >>> If you feel adventours you could use the oss.oracle.com/git/kwilk/xen.git
> >>> tree. Mainly the #linux-next or #testing branch. They both have David's new
> >>> e820 code.
> >>>
> >>> The way to get it is:
> >>>
> >>> git clone oss.oracle.com/git/kwilk/xen.git
> >>> cd xen
> >>> git checkout origin/linux-next
> >>> make -j90 
> >> Sorry it panicked :-(
> >> I've attached two photos of the two flavours of panic & a copy of the
> >> config.
> > No serial console? Did it panic when you booted as baremetal?
> Sorry - no serial console - I hadn't really intended to become part
> kernel hacker!! We're looking for leads to see if we can set it up, but
> I'm going to have to look through the attic into some old dusty boxes...

I just realized that you can run netconsole - so no need for serial console.

But.. <scratches his head> I am really baffled by this. None of the patches
in #linux-next do anything there.

Please do try to run v3.1-rc8 (or v3.1-rc9) and see if that fails? If it does
then we can try to play a bit of bisection game and figure out what caused this
mayhem.

Is your motherboard easily bought online?

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 09:24:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 09:24:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDIeR-0004Vs-A4; Mon, 10 Oct 2011 09:24:27 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDIdr-0004If-5m
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 09:23:52 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1318263811!53305394!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14753 invoked from network); 10 Oct 2011 16:23:31 -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;
	10 Oct 2011 16:23:31 -0000
X-IronPort-AV: E=Sophos;i="4.68,518,1312156800"; 
   d="scan'208";a="8308632"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 16:23: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; Mon, 10 Oct 2011 17:23:48 +0100
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
	1RDIdn-00040Z-Md; Mon, 10 Oct 2011 16:23:47 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RDIdn-0001PM-Ln;
	Mon, 10 Oct 2011 17:23:47 +0100
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: <20115.7187.664787.960964@mariner.uk.xensource.com>
Date: Mon, 10 Oct 2011 17:23:47 +0100
To: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH v7 0/5] build upstream qemu and seabios by
	default
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <alpine.DEB.2.00.1109301514460.3519@kaball-desktop>
References: <alpine.DEB.2.00.1109301514460.3519@kaball-desktop>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Ian, Campbell <Ian.Campbell@eu.citrix.com>,
	"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

Stefano Stabellini writes ("[Xen-devel] [PATCH v7 0/5] build upstream qemu and seabios by default"):
> this is the sixth version of the patch series to introduce upstream qemu
> and seabios in the xen-unstable build system.

I did this (on my workstation, running Debian squeeze i386):

 * hg clean --all
 * Apply this series (it applied cleanly)
 * cp ../.config .  (see below)
 * in the referenced qemu-iwj.git dir, git-clean -xdf
 * (make -j4 && echo ok.) 2>&1 | tee ../log

My ../.config contains only
 
CONFIG_QEMU=/u/iwj/work/1/qemu-iwj.git

and the referenced directory is at git changeset
25378e0a76b282127e9ab8933a4defbc91db3862.

The result was the error you see below.

After this, the directory "tools/qemu-xen-dir-remote" is at
6dd84c71dff047f9e492d67e7c99928d09202760.

IIRC this is the same problem that v5 and v6 had.  Please come back
when you've actually fixed it.

Ian.


make[1]: Leaving directory `/u/iwj/work/xen-unstable-tools.hg/xen'
Switched to a new branch 'dummy'
cd qemu-xen-dir; \
        ./configure --enable-xen --target-list=i386-softmmu \
                --source-path=$ROOT \
                --extra-cflags="-I/u/iwj/work/xen-unstable-tools.hg/tools/../tools/include \
                -I/u/iwj/work/xen-unstable-tools.hg/tools/../tools/libxc \
                -I/u/iwj/work/xen-unstable-tools.hg/tools/../tools/xenstore" \
                --extra-ldflags="-L/u/iwj/work/xen-unstable-tools.hg/tools/../tools/libxc \
                -L/u/iwj/work/xen-unstable-tools.hg/tools/../tools/libxenstore" \
                --bindir=/usr/lib/xen/bin \
                --disable-kvm \

ERROR
ERROR: User requested feature xen
ERROR: configure was not able to find it
ERROR
make[1]: *** [qemu-xen-dir-find] Error 1
make[1]: Leaving directory `/u/iwj/work/xen-unstable-tools.hg/tools'
make: *** [tools/qemu-xen-dir] Error 2

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 09:32:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 09:32:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDImd-00052x-Fb; Mon, 10 Oct 2011 09:32:55 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDIlt-0004om-Q9
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 09:32:10 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318264315!41024999!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20887 invoked from network); 10 Oct 2011 16:31:56 -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 Oct 2011 16:31: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
	p9AGVkwb027377
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 10 Oct 2011 16:31: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
	p9AGVjJq029929
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 16:31:45 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
	p9AGVdeA014028; Mon, 10 Oct 2011 11:31:39 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 09:31:39 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 016D0154C; Mon, 10 Oct 2011 12:31:29 -0400 (EDT)
Date: Mon, 10 Oct 2011 12:31:29 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andy Burns <xen.lists@burns.me.uk>
Subject: Re: [Xen-devel] Fwd: xentop reporting zero written sectors
Message-ID: <20111010163129.GF28646@phenom.oracle.com>
References: <CAE1-PRdq9BWjTTHPPBPvESr-ULcdjHgPMTABcCO6+wCLJ1UYog@mail.gmail.com>
	<CAE1-PReA8E-kSif=BU=s-vzOqi-4F4LotxqofH7EEw+dYLtpUA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAE1-PReA8E-kSif=BU=s-vzOqi-4F4LotxqofH7EEw+dYLtpUA@mail.gmail.com>
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.0A020202.4E931DF4.0030:SCFMA922111,ss=1,re=-4.000,fgs=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 Mon, Oct 10, 2011 at 04:16:04PM +0100, Andy Burns wrote:
> No response in xen-users, asking developers ....
>=20
> ---------- Forwarded message ----------
>=20
> Just moving a chunk of files from one filesysstem on xvba to another
> on xvdb, and was monitoring with xentop as it was taking longer than
> expected.
>=20
> The VBD_RD =A0and VBD_WR counters were both clocking-up as expected, as
> was the VBD_RSECT counter, but the VBD_WSECT counter was stuck on
> zero, I toggled on the individual VBD device counters and these showed
> the same (with the RD and WR counters correctly split between my
> source and destination disks)

Huh. Imagine that!
>=20
> Is this a long standing "feature" that I've never noticed before or a
> problem that should be reported?

Must be a feature. We would never write code with bugs. Never :-)

I think this new "feature" below will fix it for you:


diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkb=
ack/blkback.c
index 0bd7143..3e2ca68 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -778,7 +778,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blk=
if,
=20
 	if (operation =3D=3D READ)
 		blkif->st_rd_sect +=3D preq.nr_sects;
-	else if (operation =3D=3D WRITE || operation =3D=3D WRITE_FLUSH)
+	else if (operation =3D=3D WRITE_ODIRECT || operation =3D=3D WRITE_FLUSH=
)
 		blkif->st_wr_sect +=3D preq.nr_sects;
=20
 	return 0;


Thanks for reporting it!

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 09:44:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 09:44:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDIxT-0005qc-HS; Mon, 10 Oct 2011 09:44:07 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDIwi-0005dr-CR
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 09:43:20 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1318264995!21567857!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28270 invoked from network); 10 Oct 2011 16:43:17 -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; 10 Oct 2011 16:43:17 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AGh8uD031715
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 16:43:10 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AGh66e002040
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 16:43:06 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
	p9AGh021001408; Mon, 10 Oct 2011 11:43:00 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 09:43:00 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id C5F1DC54; Mon, 10 Oct 2011 12:42:50 -0400 (EDT)
Date: Mon, 10 Oct 2011 12:42:50 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
Message-ID: <20111010164250.GG28646@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318263187.21903.464.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090206.4E93209E.02B7,ss=1,re=0.000,fgs=0
Cc: "hch@infradead.org" <hch@infradead.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Li Dongyang <lidongyang@novell.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	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

On Mon, Oct 10, 2011 at 05:13:07PM +0100, Ian Campbell wrote:
> On Mon, 2011-10-10 at 16:28 +0100, Konrad Rzeszutek Wilk wrote:
> > diff --git a/include/xen/interface/io/blkif.h b/include/xen/interface/io/blkif.h
> > index 9324488..04f60b0 100644
> > --- a/include/xen/interface/io/blkif.h
> > +++ b/include/xen/interface/io/blkif.h
> > @@ -84,6 +84,10 @@ typedef uint64_t blkif_sector_t;
> >   *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
> >   * http://www.seagate.com/staticfiles/support/disc/manuals/
> >   *     Interface%20manuals/100293068c.pdf
> > + * We also provide three extra XenBus options to the discard operation:
> > + * 'discard-granularity' - Max amount of sectors that can be discarded.
> > + * 'discard-alignment' - 4K, 128K, etc aligment on sectors to erased.
> > + * 'discard-secure' - whether the discard can also securely erase data.
> >   */
> >  #define BLKIF_OP_DISCARD           5
> >  
> > @@ -107,6 +111,7 @@ struct blkif_request_rw {
> >  struct blkif_request_discard {
> >         blkif_sector_t sector_number;
> >         uint64_t nr_sectors;
> > +       uint8_t secure:1;
> >  };
> >  
> >  struct blkif_request { 
> 
> Which tree/branch is this? I don't see BLKIF_OP_DISCARD in mainline or
> your linux-next branch.

Uh, that is not good. I must have forgotten to merge it in - that is the
#stable/for-jens-3.2 branch.

Let me do that right now.
> 
> Since this changes an inter-guest ABI we may need to consider backwards
> compatibility (I suspect this interface is new enough that no one has
> actually implemented it in anger and we can get away with changing it).

<nods>
> In any case it should also be posted against the canonical inter-guest
> interface definition in the xen tree for review with that in mind.

Yes! But I was thinking to first let this one rattle a bit and see what
folks thought about it before submitting the xen-devel.
> 
> I think an explicit flag variable is likely to be less trouble WRT
> maintaining compatibility in the future than a bit-field. Also I think
> you may as well align the struct size to something larger than a byte,
> either 4 or 8 bytes would make sense.

Ok. Will change it and make it an uint64_t secure_flag
variable. Later on if there are any "other" flags we can chop it down.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 10:04:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 10:04:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDJGz-0006al-MR; Mon, 10 Oct 2011 10:04:17 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDJCb-0006IV-Qf
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 09:59:50 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1318265978!34690369!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21219 invoked from network); 10 Oct 2011 16:59:39 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-14.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Oct 2011 16:59:39 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AGx9Pf006005
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 16:59:11 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AGx7G9001706
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 16:59:07 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
	p9AGx0K1008810; Mon, 10 Oct 2011 11:59:00 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 09:59:00 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id A0517C54; Mon, 10 Oct 2011 12:49:20 -0400 (EDT)
Date: Mon, 10 Oct 2011 12:49:20 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: rush <rush1503@gmail.com>
Subject: Re: [Xen-devel] Re: BUG: unable to handle kernel paging request at
	ffff8803bb6ad000
Message-ID: <20111010164920.GA30351@phenom.oracle.com>
References: <1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
	<CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
	<1317460798.11991.2.camel@dagon.hellion.org.uk>
	<CA+rvmv+yU0=nEuvLSqkE44RFqeaQw504MkD-sxjXV3D3nkme_g@mail.gmail.com>
	<20111003184722.GB15608@phenom.oracle.com>
	<1317667984.11991.6.camel@dagon.hellion.org.uk>
	<CA+rvmvJ_i4Ta+GV5PQ0U7+2yPxT2oJXtnE_fq0j8Faa7GcUxqw@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CA+rvmvJ_i4Ta+GV5PQ0U7+2yPxT2oJXtnE_fq0j8Faa7GcUxqw@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090202.4E93245F.018C,ss=1,re=0.000,fgs=0
Cc: Jonathan Nieder <jrnieder@gmail.com>, 642154@bugs.debian.org,
	xen-devel <xen-devel@lists.xensource.com>,
	Ben Hutchings <ben@decadent.org.uk>, Ian Campbell <ijc@hellion.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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sat, Oct 08, 2011 at 10:13:14AM +0400, rush wrote:
> OK, I tried it again, but Oops didn't gone.
.. snip..
>         echo    'Loading Xen 4.0-amd64 ...'
>         multiboot       /boot/xen-4.0-amd64.gz placeholder xsave=0
.. snip..
> Was it right?

Yup. I think.. this is a bit embarrassing. It took a bit of time for Intel
folks to get the xsave part right and I remember seeing this error about a
year ago with xsave on a Dell Optiplex 780. Hence I wonder if the fixes that
ultimately went in 4.1.1 did not get ported over to 4.0 and you are just
hitting that.

Can I ask you to do one more thing? Can you upgrade to the xen-4.1.1 in
the testing and try with the xsave (or without) and see if it works?

<holds his fingers hoping it is the xsave feature>

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 10:07:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 10:07:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDJJl-00070c-Qr; Mon, 10 Oct 2011 10:07:09 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDJGg-0006Xs-9h; Mon, 10 Oct 2011 10:04:18 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318266233!18915744!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22425 invoked from network); 10 Oct 2011 17:03:54 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-2.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Oct 2011 17:03:54 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AH3lB2031500
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 17:03:49 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AGvqVW004395
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 16:57:52 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
	p9AH3eZu021503; Mon, 10 Oct 2011 12:03:40 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 10:03:40 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id DFB5FC54; Mon, 10 Oct 2011 13:03:30 -0400 (EDT)
Date: Mon, 10 Oct 2011 13:03:30 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "D. Duckworth" <donduq@i2pmail.org>
Subject: Re: [Xen-devel] Re: [Xen-users] XEN - networking and performance
Message-ID: <20111010170330.GA30732@phenom.oracle.com>
References: <20111006203821.CD70CE9342@kermit.internecto.net>
	<20111008190701.50DFBAE098@smtp.postman.i2p>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111008190701.50DFBAE098@smtp.postman.i2p>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090204.4E932575.015A,ss=1,re=0.000,fgs=0
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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sat, Oct 08, 2011 at 07:07:01PM +0000, D. Duckworth wrote:
> Salutations,
> 
> From the xen-users list:
> > I would like some advice from people how are/were using  Xen 3.4.2 -
> > it should be a rather stable release. Dom0 is CentOS 5.5 64bit with
> > Xen 3.4.2 installed with the default settings (minus cpu pinning to
> > Dom0 and memory setup for 2GB). There are 2 built-in nics (Broadcom)
> > and an add-on network card (Intel) with another 4 nics. Currently
> > only one NIC is used for all network access, and as far as
> > networking, the default setings are used - xend-config.sxp:
> > (network-script network-bridge) (vif-script vif-bridge)
> > 
> > The questions are:
> > 
> > How can I improve the network performance (now all the VM are sharing
> > one bridge):
> > 
> > a. creating multiple bridges and assigning a VM (DomU) per bridge
> > b. trying to hide the NICs from Dom0 using something like "pciback
> > hide" - (pointers/example of how one would do this in Centos 5.5
> > would be highly appreciated...)
> 
> Xen Networking has been a thorn in my eye and a similar question has
> been with me for a long time now. So prepare, for this response contains
> rage.
> 
> Xen networking has room for many different approaches, yet the best
> thing about its scripts is that they are not mandatory to use. You can
> fully adjust the scripts to your needs or even replace them with your
> own. You can find modifications on forums and blogs although most of
> them just seem to be copies of few suggestions made by few people.
> Logical, because quite frankly it's a pain to grope what the Xen
> scripts and udev rules really do, let alone grok most of what they
> do out of the box.
> 
> Right now I just care about creating my ideal networking solution, i.e.
> routing, bridging and firewall stuff for vms with different roles. I am
> running Xen 4.1.2-rc3-pre non-professionally on a quad core single cpu
> 1U server. with 4 hard drives in RAID10 configuration. The server has
> one usable Ethernet port with multiple globally routable IPs. I can't
> use the other ethernet port; the server has no IPMI and the ISP declines
> use of two ports by one system because the data center is a no smoking
> zone for both humans and routers and switches.
> 
> So the highest priority is to reach dom0 from the Internet and
> therefore my grub has fallback options, one of which is a boot to Linux
> with no Xen. In turn this means that dom0's networking boot scripts
> may not depend on Xen at all, and Xen may not change networking in any
> way unless specified. My dom0 is a minimal system that only controls vms
> and networking. I want dom0 to be small and simple so the obvious
> choice is Arch Linux. Dom0 should be separated from the domUs in that
> the domUs cannot reach dom0 and one domU (domN) should do all
> networking for the other domUs.
> 
> I tried to use xl with xen4 for a while but due to bugs and missing
> features I had to go back to xm and xend. This is where the fun
> begins. In the past I used xend with network-bridge and for some strange
> reason (voodoo probably) I blindly accepted that script in the past and
> blamed myself for not appreciating it. But let's be blunt and honest:
> the scripts, in particular the script that *modifies dom0 networking
> during xend startup* is the biggest piece of sh!# idea I have ever seen
> in Xen. It creates bridges, takes eth0 down, tortures dom0 with occult
> ip addr/route, brctl, sysctl and iptables awk/sed manipulations and then
> it has you looking at your screen yearning for the moment that ping
> timeouts become ping replies, telling you that your box is reachable
> again. This script is a malevolent demon from the sewers of Norman the
> Golgothan and the worst part is that network-bridge is also still the

<laughs>
> recommended default!

Can you point me to where it mentions that please?
> 
> On the more positive side there was a fantastic update in Xen 4 where
> network-bridge changed a bit so that "it will not bring a bridge up if
> one already exists". Whoever wrote it should get a corporate medal for
> that and then a long vacation to a deserted island with an MSX II and
> no floppies. How can this even be approved by Xen's senior project
> manager, or is that a vacant position?

We realized that the networking setup is quite complex and would be best
left in the hands of the admins. The problem is that..
> 
> It surely seems so. Xen's /etc/xen/scripts (another design fail, why
> not /usr?) and udev scripts are confusing ad-hoc bloatware routines and
> are not transparent at all. With the current xen4 I saw the premature
> advice to more or less 'prepare for migration from xm to xl'. Yet, xl
> supports less and is conflicting: there is no vifname, no 'xl
> new/delete', no more python, no relocation and suddenly there is a
> conflict between 'xm start domain' versus 'xl start /etc/xen/domain'.
> 
> So new features emerge, adding to the confusion of the end user, while
> old problems are not being fixed properly. I wonder why, especially
> because it does not seem that xm and xend are the broken parts that
> need to be replaced by an unstable interface.
> 
> What needs attention first and foremost are two things, first of which
> is real and wise effort into one simple, minimal script that just
> handles the minimum in a transparent way e.g. control the hypervisor,
> manage vms, manage the backend. Of course networking can be done on
> domain start too, but this has happen in an entirely different way from
> what it does and how it does it. This is so important because it gives
> more control to the user that runs Xen. It's also a good moment to
> build in proper and mature support for IPv6.
> 
> Secondly, the website and documentation should be cleaned up and
> revised where appropriate. The current situation is a mess that has
> a much too steep and incompatible learning curve right now - for
> example, a bridge should just not be named eth0 and a physical device
> should not be renamed at all. It's fundamentally wrong, stupid, mad as
> hell and a PR failure for Xen to do it this way out of the box. No
> matter how often and detailed it has been documented on the website. 

.. the documentation and setup is sometimes quite hard. BTW, we are
going to do on Oct 26th a Documentation Day to clean up some of this mess.
Would you be intereted in helping along - perhaps in the networking Wiki?
> 
> I propose something like the following for xen networking:
> 
> * Xen will not manipulate non-xen devices or a firewall under any
>   circumstance, it might only add or substract routes and/or rules from
>   the routing tables,

Uh, what is 'non-xen' devices? Like bridges?

> * Allow for networking configuration per domU. For example let
>   networking per device be nat, routed, bridged or custom, where
>   all name the interface and bring it up; nat only adds the ip to the
>   routing table; routed could be an array of routes and rules that need
>   to be added or subtracted from various routing tables and it might
>   support proxyarp; bridged turns off arp, sets the mac on the vif and
>   then adds the interface to a bridge that should already be created by
>   the user; and custom is a custom set of unmanaged commands after
>   creating and destroying a domain.

You lost me. <sigh> I am using a bridge configuration and just
do:

auto lo
iface lo inet loopback

auto switch
iface switch inet static
	address 192.168.101.16
	netmask 255.255.255.0
	gateway 192.168.101.1
	bridge_ports eth2

And just use that 'bridge=switch' in all my configuration. And that
seems to work just fine - wouldn't that be best way of providing
the first network setup to users? I would think the majority of folks
do something akin to this?

> 
> I am aware that this can already be done with Xen. However, that
> process is quite arbitrary and it does things no one asked for. So one
> has to read the scripts. For example with the iptables part of
> vif-bridge. It is not handled transparently, it is quite arbitrary and
> it automatically executes for all vms that are being started. This leads
> you to wonder what more it does without you knowing it...
> 
> So, with that off my chest and the second line of my network-bridge
> being the words "exit 0" Xen lets my dom0 configuration alone
> like it is supposed to do. While KVM is becoming a 'next cool
> thing' for many people I would still prefer a separate hypervisor so now
> the fat just has to be removed from Xen.
> 

I am all for removing fat. Do you have links to some of particularly
bad Wiki pages that should be heavily audited?

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 11:03:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 11:03:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDKCD-0000rS-Pt; Mon, 10 Oct 2011 11:03:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDK88-0000bi-Cs
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 10:59:50 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318269545!447977!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2824 invoked from network); 10 Oct 2011 17:59:07 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Oct 2011 17:59:07 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AHwvte016763
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 17:58:59 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AHwunW015571
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 17:58:57 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
	p9AHwplW007392; Mon, 10 Oct 2011 12:58:51 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 10:58:50 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 3DBCB1361; Mon, 10 Oct 2011 13:53:23 -0400 (EDT)
Date: Mon, 10 Oct 2011 13:53:23 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
Message-ID: <20111010175323.GA31210@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111010164250.GG28646@phenom.oracle.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090207.4E933264.0044,ss=1,re=-2.300,fgs=0
Cc: "hch@infradead.org" <hch@infradead.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Li Dongyang <lidongyang@novell.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	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

> > I think an explicit flag variable is likely to be less trouble WRT
> > maintaining compatibility in the future than a bit-field. Also I think
> > you may as well align the struct size to something larger than a byte,
> > either 4 or 8 bytes would make sense.
> 
> Ok. Will change it and make it an uint64_t secure_flag
> variable. Later on if there are any "other" flags we can chop it down.

New patch (it also looks like the patch I sent to xen-devel to update
the blkif.h was never merged) - so let me send right now.

BTW, it seems that the #pragma pack(push, 4) is used in the
drivers/block/xen-blkback/common.h to compact the structures already so
I don't think we need the aligment.


>From f74cc58b77c2a1c1a93c0324a50b9d1b9a0cb159 Mon Sep 17 00:00:00 2001
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Mon, 10 Oct 2011 10:58:40 -0400
Subject: [PATCH] xen/blk[front|back]: Enhance discard support with secure
 erasing support.

Part of the blkdev_issue_discard(xx) operation is that it can also
issue a secure discard operation that will permanantly remove the
sectors in question. We advertise that we can support that via the
'discard-secure' attribute and on the request, if the 'secure' bit
is set, we will attempt to pass in REQ_DISCARD | REQ_SECURE.

CC: Li Dongyang <lidongyang@novell.com>
[v1: Used 'flag' instead of 'secure:1' bit]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 drivers/block/xen-blkback/blkback.c |    9 ++++++---
 drivers/block/xen-blkback/common.h  |    5 +++++
 drivers/block/xen-blkback/xenbus.c  |   12 ++++++++++++
 drivers/block/xen-blkfront.c        |   19 +++++++++++++++++--
 include/xen/interface/io/blkif.h    |    6 ++++++
 5 files changed, 46 insertions(+), 5 deletions(-)

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index ca23dff..5ccb648 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -422,13 +422,16 @@ 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)
+	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY) {
+		unsigned long secure = (blkif->vbd.discard_secure &&
+			(req->u.discard.flag & BLKIF_OP_DISCARD_FLAG_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, 0);
-	else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
+				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;
diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
index e638457..43b72a7 100644
--- a/drivers/block/xen-blkback/common.h
+++ b/drivers/block/xen-blkback/common.h
@@ -72,6 +72,7 @@ struct blkif_x86_32_request_rw {
 struct blkif_x86_32_request_discard {
 	blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
 	uint64_t nr_sectors;
+	uint32_t flag;
 };
 
 struct blkif_x86_32_request {
@@ -101,6 +102,7 @@ struct blkif_x86_64_request_rw {
 struct blkif_x86_64_request_discard {
 	blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
 	uint64_t nr_sectors;
+	uint32_t flag;
 };
 
 struct blkif_x86_64_request {
@@ -157,6 +159,7 @@ struct xen_vbd {
 	/* Cached size parameter. */
 	sector_t		size;
 	bool			flush_support;
+	bool			discard_secure;
 };
 
 struct backend_info;
@@ -259,6 +262,7 @@ static inline void blkif_get_x86_32_req(struct blkif_request *dst,
 	case BLKIF_OP_DISCARD:
 		dst->u.discard.sector_number = src->u.discard.sector_number;
 		dst->u.discard.nr_sectors = src->u.discard.nr_sectors;
+		dst->u.discard.flag = src->u.discard.flag;
 		break;
 	default:
 		break;
@@ -288,6 +292,7 @@ static inline void blkif_get_x86_64_req(struct blkif_request *dst,
 	case BLKIF_OP_DISCARD:
 		dst->u.discard.sector_number = src->u.discard.sector_number;
 		dst->u.discard.nr_sectors = src->u.discard.nr_sectors;
+		dst->u.discard.flag = src->u.discard.flag;
 		break;
 	default:
 		break;
diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index a6d4303..0c0ce39 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -378,6 +378,9 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
 	if (q && q->flush_flags)
 		vbd->flush_support = true;
 
+	if (q && blk_queue_secdiscard(q))
+		vbd->discard_secure = true;
+
 	DPRINTK("Successful creation of handle=%04x (dom=%u)\n",
 		handle, blkif->domid);
 	return 0;
@@ -460,6 +463,15 @@ int xen_blkbk_discard(struct xenbus_transaction xbt, struct backend_info *be)
 				state = 1;
 				blkif->blk_backend_type = BLKIF_BACKEND_PHY;
 			}
+			/* Optional. */
+			err = xenbus_printf(xbt, dev->nodename,
+				"discard-secure", "%d",
+				blkif->vbd.discard_secure);
+			if (err) {
+				xenbus_dev_fatal(dev, err,
+					"writting discard-secure");
+				goto kfree;
+			}
 		}
 	} else {
 		err = PTR_ERR(type);
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 7b2ec59..807b7b6 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -98,7 +98,8 @@ struct blkfront_info
 	unsigned long shadow_free;
 	unsigned int feature_flush;
 	unsigned int flush_op;
-	unsigned int feature_discard;
+	unsigned int feature_discard:1;
+	unsigned int feature_secdiscard:1;
 	unsigned int discard_granularity;
 	unsigned int discard_alignment;
 	int is_ready;
@@ -305,11 +306,13 @@ static int blkif_queue_request(struct request *req)
 		ring_req->operation = info->flush_op;
 	}
 
-	if (unlikely(req->cmd_flags & REQ_DISCARD)) {
+	if (unlikely(req->cmd_flags & (REQ_DISCARD | REQ_SECURE))) {
 		/* id, sector_number and handle are set above. */
 		ring_req->operation = BLKIF_OP_DISCARD;
 		ring_req->nr_segments = 0;
 		ring_req->u.discard.nr_sectors = blk_rq_sectors(req);
+		if ((req->cmd_flags & REQ_SECURE) && info->feature_secdiscard)
+			ring_req->u.discard.flag = BLKIF_OP_DISCARD_FLAG_SECURE;
 	} else {
 		ring_req->nr_segments = blk_rq_map_sg(req->q, req, info->sg);
 		BUG_ON(ring_req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST);
@@ -424,6 +427,8 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
 		blk_queue_max_discard_sectors(rq, get_capacity(gd));
 		rq->limits.discard_granularity = info->discard_granularity;
 		rq->limits.discard_alignment = info->discard_alignment;
+		if (info->feature_secdiscard)
+			queue_flag_set_unlocked(QUEUE_FLAG_SECDISCARD, rq);
 	}
 
 	/* Hard sector size and max sectors impersonate the equiv. hardware. */
@@ -749,7 +754,9 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 					   info->gd->disk_name);
 				error = -EOPNOTSUPP;
 				info->feature_discard = 0;
+				info->feature_secdiscard = 0;
 				queue_flag_clear(QUEUE_FLAG_DISCARD, rq);
+				queue_flag_clear(QUEUE_FLAG_SECDISCARD, rq);
 			}
 			__blk_end_request_all(req, error);
 			break;
@@ -1135,11 +1142,13 @@ static void blkfront_setup_discard(struct blkfront_info *info)
 	char *type;
 	unsigned int discard_granularity;
 	unsigned int discard_alignment;
+	unsigned int discard_secure;
 
 	type = xenbus_read(XBT_NIL, info->xbdev->otherend, "type", NULL);
 	if (IS_ERR(type))
 		return;
 
+	info->feature_secdiscard = 0;
 	if (strncmp(type, "phy", 3) == 0) {
 		err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
 			"discard-granularity", "%u", &discard_granularity,
@@ -1150,6 +1159,12 @@ static void blkfront_setup_discard(struct blkfront_info *info)
 			info->discard_granularity = discard_granularity;
 			info->discard_alignment = discard_alignment;
 		}
+		err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
+			    "discard-secure", "%d", &discard_secure,
+			    NULL);
+		if (!err)
+			info->feature_secdiscard = discard_secure;
+
 	} else if (strncmp(type, "file", 4) == 0)
 		info->feature_discard = 1;
 
diff --git a/include/xen/interface/io/blkif.h b/include/xen/interface/io/blkif.h
index 9324488..13d040e 100644
--- a/include/xen/interface/io/blkif.h
+++ b/include/xen/interface/io/blkif.h
@@ -84,6 +84,10 @@ typedef uint64_t blkif_sector_t;
  *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
  * http://www.seagate.com/staticfiles/support/disc/manuals/
  *     Interface%20manuals/100293068c.pdf
+ * We also provide three extra XenBus options to the discard operation:
+ * 'discard-granularity' - Max amount of sectors that can be discarded.
+ * 'discard-alignment' - 4K, 128K, etc aligment on sectors to erased.
+ * 'discard-secure' - whether the discard can also securely erase data.
  */
 #define BLKIF_OP_DISCARD           5
 
@@ -107,6 +111,8 @@ struct blkif_request_rw {
 struct blkif_request_discard {
 	blkif_sector_t sector_number;
 	uint64_t nr_sectors;
+#define BLKIF_OP_DISCARD_FLAG_SECURE	(1<<1) /* ignored if discard-secure=0 */
+	uint32_t flag;
 };
 
 struct blkif_request {
-- 
1.7.5.4


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 11:06:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 11:06:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDKEn-0001Ge-JK; Mon, 10 Oct 2011 11:06:05 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDKB3-0000ih-Br
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 11:02:19 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318269728!446985!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11982 invoked from network); 10 Oct 2011 18:02:10 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 18:02:10 -0000
Received: by vws13 with SMTP id 13so7131811vws.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 11:02:08 -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:content-type;
	bh=tSi5fRcmlWk5Hsr8I7uRehp3LnS0iWPhFz3+Hupk8yI=;
	b=O4U65+nThQBEFzPhR+xWSMc32QqrDAbf0nHbfkSkFLTXry3nyGI9rWgD5DxYQSzw9/
	uveGwYK0A5nJk8vTLr7Psg1WidZBS93k3G5XzWS2XBSTtLJnkwQLE+StWP8br98FWCCU
	gNB/xptes9tsclcWozM4dPB9Oio0bcVZF9sSc=
MIME-Version: 1.0
Received: by 10.52.6.132 with SMTP id b4mr14933735vda.39.1318269728303; Mon,
	10 Oct 2011 11:02:08 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Mon, 10 Oct 2011 11:02:08 -0700 (PDT)
In-Reply-To: <1318260599.21903.455.camel@zakaz.uk.xensource.com>
References: <CAE1-PRdq9BWjTTHPPBPvESr-ULcdjHgPMTABcCO6+wCLJ1UYog@mail.gmail.com>
	<CAE1-PReA8E-kSif=BU=s-vzOqi-4F4LotxqofH7EEw+dYLtpUA@mail.gmail.com>
	<1318260599.21903.455.camel@zakaz.uk.xensource.com>
Date: Mon, 10 Oct 2011 19:02:08 +0100
X-Google-Sender-Auth: 3xuITKvYVtL7wjIq6Zhpmq2wO0M
Message-ID: <CAE1-PRdorUt+_DznkVe1dgeDJiz5pGe4AGvTkvd=JAN70a=_nQ@mail.gmail.com>
Subject: Re: [Xen-devel] Fwd: xentop reporting zero written sectors
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-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 10 October 2011 16:29, Ian Campbell <Ian.Campbell@citrix.com> wrote:

> How would it be a feature?

Sorry for the bug <-> feature sarcasm

> Scrobbling around under tools/xenstat these statistics appear to be read
> from /sys/bus/xen-backend/devices/<vbd>/wr_sect (likewise rd_sect,
> wr_req etc etc).
> Can you see all of those and do the numbers appear to be doing the right
> thing?

Yes, just to confirm what Konrad has spotted ...

# cat /sys/bus/xen-backend/devices/*/statistics/wr_sect
0
0
0

# cat /sys/bus/xen-backend/devices/*/statistics/rd_sect
90313
125876
2546

I'll try the patch later, when I've finished pulling my hair out with
a pci-passthrough issue!

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 11:07:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 11:07:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDKGS-0001eA-1y; Mon, 10 Oct 2011 11:07:48 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDKCY-0000uY-9f
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 11:03:49 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318269803!46039988!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10267 invoked from network); 10 Oct 2011 18:03:24 -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; 10 Oct 2011 18:03:24 -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
	p9AI3MI6024657
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 10 Oct 2011 18:03: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
	p9AI3LkB001293
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 18:03:21 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
	p9AI3FZg003610; Mon, 10 Oct 2011 13:03:15 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 11:03:15 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 61B351361; Mon, 10 Oct 2011 14:03:14 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1318269010@localhost6.localdomain6>
User-Agent: Mercurial-patchbomb/1.9.1
Date: Mon, 10 Oct 2011 13:50:10 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Jackson@eu.citrix.com,
	Ian.Campbell@citrix.com, lidongyang@novell.com, owen.smith@citrix.com, 
	paul.durrant@citrix.com, pasik@iki.fi
Status: O
Lines: 8
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090205.4E93336D.005E:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 0 of 1] Patch to alter BLKIF_OP_TRIM to
	BLKIF_OP_DISCARD (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

I posted the v1 version of these patches some time ago and they were
looked by Paul and Li and both of them were OK with it.

I was wondering if either one of the maintainers (tools?) would be willing
to commit this patch in?

Thanks!



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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 11:09:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 11:09:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDKHw-00022C-Ll; Mon, 10 Oct 2011 11:09:20 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDKCW-0000uD-Nh
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 11:03:50 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318269820!34723144!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19473 invoked from network); 10 Oct 2011 18:03:41 -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; 10 Oct 2011 18:03:41 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AI3Mxb024659
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 18:03:23 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AI3Lm8024464
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 18:03:21 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
	p9AI3FLH003613; Mon, 10 Oct 2011 13:03:15 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 11:03:15 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 66DF7C54; Mon, 10 Oct 2011 14:03:14 -0400 (EDT)
MIME-Version: 1.0
X-Mercurial-Node: d17ab29f2f9ad29a7b8af02d6f17de7f112a9723
Message-Id: <d17ab29f2f9ad29a7b8a.1318269011@localhost6.localdomain6>
In-Reply-To: <patchbomb.1318269010@localhost6.localdomain6>
References: <patchbomb.1318269010@localhost6.localdomain6>
User-Agent: Mercurial-patchbomb/1.9.1
Date: Mon, 10 Oct 2011 13:50:11 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Jackson@eu.citrix.com,
	Ian.Campbell@citrix.com, lidongyang@novell.com, owen.smith@citrix.com, 
	paul.durrant@citrix.com, pasik@iki.fi
Status: RO
Lines: 93
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090207.4E93336D.0048,ss=1,re=0.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 1 of 1] interface: BLKIF_OP_TRIM ->
	BLKIF_OP_DISCARD
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0525935646=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0525935646==
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIEtvbnJhZCBSemVzenV0ZWsgV2lsayA8a29ucmFk
LndpbGtAb3JhY2xlLmNvbT4KIyBEYXRlIDEzMTgyNjg5MDYgMTQ0MDAKIyBOb2RlIElEIGQxN2Fi
MjlmMmY5YWQyOWE3YjhhZjAyZDZmMTdkZTdmMTEyYTk3MjMKIyBQYXJlbnQgIDcyZjMzOWJjNjAw
ZDdhOTYyOWQzZjllYjhhMjc5ZmJmOGJlMjViMTIKaW50ZXJmYWNlOiBCTEtJRl9PUF9UUklNIC0+
IEJMS0lGX09QX0RJU0NBUkQKClRoZSBuYW1lICd0cmltJyBpcyBzcGVjaWZpYyB0byB0aGUgQVRB
IGRpc2NhcmQgaW1wbGVtZW50YXRpb24uClRoZSBuYW1lICdzY3NpIHVubWFwJyBpcyBzcGVjaWZp
YyB0byB0aGUgU0NTSSBkaXNjYXJkIGltcGxlbWVudGF0aW9uLgoKV2Ugc2hvdWxkIHJlYWxseSB1
c2UgYSBnZW5lcmljIG5hbWUgLSBhbmQgdGhlIG5hbWUgJ2Rpc2NhcmQnCmxvb2tzIHRvIGJlIHRo
ZSBtb3N0IGdlbmVyaWMgb2YgdGhlbSBhbGwuCgpDQzogbGlkb25neWFuZ0Bub3ZlbGwuY29tCkND
OiBvd2VuLnNtaXRoQGNpdHJpeC5jb20KQ0M6IFBhc2kgS8Okcmtrw6RpbmVuIDxwYXNpa0Bpa2ku
Zmk+CkNDOiBKQmV1bGljaEBub3ZlbGwuY29tClNpZ25lZC1vZmYtYnk6IEtvbnJhZCBSemVzenV0
ZWsgV2lsayA8a29ucmFkLndpbGtAb3JhY2xlLmNvbT4KCmRpZmYgLXIgNzJmMzM5YmM2MDBkIC1y
IGQxN2FiMjlmMmY5YSB4ZW4vaW5jbHVkZS9wdWJsaWMvaW8vYmxraWYuaAotLS0gYS94ZW4vaW5j
bHVkZS9wdWJsaWMvaW8vYmxraWYuaAlNb24gT2N0IDEwIDExOjIxOjUxIDIwMTEgKzAxMDAKKysr
IGIveGVuL2luY2x1ZGUvcHVibGljL2lvL2Jsa2lmLmgJTW9uIE9jdCAxMCAxMzo0ODoyNiAyMDEx
IC0wNDAwCkBAIC04MiwyNiArODIsMzcgQEAKICAqLwogI2RlZmluZSBCTEtJRl9PUF9SRVNFUlZF
RF8xICAgICAgICA0CiAvKgotICogUmVjb2duaXNlZCBvbmx5IGlmICJmZWF0dXJlLXRyaW0iIGlz
IHByZXNlbnQgaW4gYmFja2VuZCB4ZW5idXMgaW5mby4KLSAqIFRoZSAiZmVhdHVyZS10cmltIiBu
b2RlIGNvbnRhaW5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdHJpbQotICogcmVxdWVz
dHMgYXJlIGxpa2VseSB0byBzdWNjZWVkIG9yIGZhaWwuIEVpdGhlciB3YXksIGEgdHJpbSByZXF1
ZXN0CisgKiBSZWNvZ25pc2VkIG9ubHkgaWYgImZlYXR1cmUtZGlzY2FyZCIgaXMgcHJlc2VudCBp
biBiYWNrZW5kIHhlbmJ1cyBpbmZvLgorICogVGhlICJmZWF0dXJlLWRpc2NhcmQiIG5vZGUgY29u
dGFpbnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0cmltCisgKiAoQVRBKSBvciB1bm1h
cCAoU0NTSSkgLSBjb252aWVudGx5IGNhbGxlZCBkaXNjYXJkIHJlcXVlc3RzIGFyZSBsaWtlbHkK
KyAqIHRvIHN1Y2NlZWQgb3IgZmFpbC4gRWl0aGVyIHdheSwgYSBkaXNjYXJkIHJlcXVlc3QKICAq
IG1heSBmYWlsIGF0IGFueSB0aW1lIHdpdGggQkxLSUZfUlNQX0VPUE5PVFNVUFAgaWYgaXQgaXMg
dW5zdXBwb3J0ZWQgYnkKICAqIHRoZSB1bmRlcmx5aW5nIGJsb2NrLWRldmljZSBoYXJkd2FyZS4g
VGhlIGJvb2xlYW4gc2ltcGx5IGluZGljYXRlcyB3aGV0aGVyCi0gKiBvciBub3QgaXQgaXMgd29y
dGh3aGlsZSBmb3IgdGhlIGZyb250ZW5kIHRvIGF0dGVtcHQgdHJpbSByZXF1ZXN0cy4KLSAqIElm
IGEgYmFja2VuZCBkb2VzIG5vdCByZWNvZ25pc2UgQkxLSUZfT1BfVFJJTSwgaXQgc2hvdWxkICpu
b3QqCi0gKiBjcmVhdGUgdGhlICJmZWF0dXJlLXRyaW0iIG5vZGUhCi0gKiAKLSAqIFRyaW0gb3Bl
cmF0aW9uIGlzIGEgcmVxdWVzdCBmb3IgdGhlIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlIHRvIG1h
cmsKLSAqIGV4dGVudHMgdG8gYmUgZXJhc2VkLiBUcmltIG9wZXJhdGlvbnMgYXJlIHBhc3NlZCB3
aXRoIHNlY3Rvcl9udW1iZXIgYXMgdGhlCi0gKiBzZWN0b3IgaW5kZXggdG8gYmVnaW4gdHJpbSBv
cGVyYXRpb25zIGF0IGFuZCBucl9zZWN0b3JzIGFzIHRoZSBudW1iZXIgb2YKLSAqIHNlY3RvcnMg
dG8gYmUgdHJpbW1lZC4gVGhlIHNwZWNpZmllZCBzZWN0b3JzIHNob3VsZCBiZSB0cmltbWVkIGlm
IHRoZQotICogdW5kZXJseWluZyBibG9jayBkZXZpY2Ugc3VwcG9ydHMgdHJpbSBvcGVyYXRpb25z
LCBvciBhIEJMS0lGX1JTUF9FT1BOT1RTVVBQCi0gKiBzaG91bGQgYmUgcmV0dXJuZWQuIE1vcmUg
aW5mb3JtYXRpb24gYWJvdXQgdHJpbSBvcGVyYXRpb25zIGF0OgorICogb3Igbm90IGl0IGlzIHdv
cnRod2hpbGUgZm9yIHRoZSBmcm9udGVuZCB0byBhdHRlbXB0IGRpc2NhcmQgcmVxdWVzdHMuCisg
KiBJZiBhIGJhY2tlbmQgZG9lcyBub3QgcmVjb2duaXNlIEJMS0lGX09QX0RJU0NBUkQsIGl0IHNo
b3VsZCAqbm90KgorICogY3JlYXRlIHRoZSAiZmVhdHVyZS1kaXNjYXJkIiBub2RlIQorICoKKyAq
IERpc2NhcmQgb3BlcmF0aW9uIGlzIGEgcmVxdWVzdCBmb3IgdGhlIHVuZGVybHlpbmcgYmxvY2sg
ZGV2aWNlIHRvIG1hcmsKKyAqIGV4dGVudHMgdG8gYmUgZXJhc2VkLiBIb3dldmVyLCBkaXNjYXJk
IGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBibG9ja3MKKyAqIHdpbGwgYmUgZXJhc2VkIGZy
b20gdGhlIGRldmljZSAtIGl0IGlzIGp1c3QgYSBoaW50IHRvIHRoZSBkZXZpY2UKKyAqIGNvbnRy
b2xsZXIgdGhhdCB0aGVzZSBibG9ja3MgYXJlIG5vIGxvbmdlciBpbiB1c2UuIFdoYXQgdGhlIGRl
dmljZQorICogY29udHJvbGxlciBkb2VzIHdpdGggdGhhdCBpbmZvcm1hdGlvbiBpcyBsZWZ0IHRv
IHRoZSBjb250cm9sbGVyLgorICogRGlzY2FyZCBvcGVyYXRpb25zIGFyZSBwYXNzZWQgd2l0aCBz
ZWN0b3JfbnVtYmVyIGFzIHRoZQorICogc2VjdG9yIGluZGV4IHRvIGJlZ2luIGRpc2NhcmQgb3Bl
cmF0aW9ucyBhdCBhbmQgbnJfc2VjdG9ycyBhcyB0aGUgbnVtYmVyIG9mCisgKiBzZWN0b3JzIHRv
IGJlIGRpc2NhcmRlZC4gVGhlIHNwZWNpZmllZCBzZWN0b3JzIHNob3VsZCBiZSBkaXNjYXJkZWQg
aWYgdGhlCisgKiB1bmRlcmx5aW5nIGJsb2NrIGRldmljZSBzdXBwb3J0cyB0cmltIChBVEEpIG9y
IHVubWFwIChTQ1NJKSBvcGVyYXRpb25zLAorICogb3IgYSBCTEtJRl9SU1BfRU9QTk9UU1VQUCAg
c2hvdWxkIGJlIHJldHVybmVkLgorICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0cmltL3VubWFw
IG9wZXJhdGlvbnMgYXQ6CiAgKiBodHRwOi8vdDEzLm9yZy9Eb2N1bWVudHMvVXBsb2FkZWREb2N1
bWVudHMvZG9jczIwMDgvCiAgKiAgICAgZTA3MTU0cjYtRGF0YV9TZXRfTWFuYWdlbWVudF9Qcm9w
b3NhbF9mb3JfQVRBLUFDUzIuZG9jCisgKiBodHRwOi8vd3d3LnNlYWdhdGUuY29tL3N0YXRpY2Zp
bGVzL3N1cHBvcnQvZGlzYy9tYW51YWxzLworICogICAgIEludGVyZmFjZSUyMG1hbnVhbHMvMTAw
MjkzMDY4Yy5wZGYKKyAqIFdlIGFsc28gcHJvdmlkZSB0aHJlZSBleHRyYSBYZW5CdXMgb3B0aW9u
cyB0byB0aGUgZGlzY2FyZCBvcGVyYXRpb246CisgKiAnZGlzY2FyZC1ncmFudWxhcml0eScgLSBN
YXggYW1vdW50IG9mIHNlY3RvcnMgdGhhdCBjYW4gYmUgZGlzY2FyZGVkLgorICogJ2Rpc2NhcmQt
YWxpZ25tZW50JyAtIDRLLCAxMjhLLCBldGMgYWxpZ21lbnQgb24gc2VjdG9ycyB0byBlcmFzZWQu
CisgKiAnZGlzY2FyZC1zZWN1cmUnIC0gd2hldGhlciB0aGUgZGlzY2FyZCBjYW4gYWxzbyBzZWN1
cmVseSBlcmFzZSBkYXRhLgogICovCi0jZGVmaW5lIEJMS0lGX09QX1RSSU0gICAgICAgICAgICAg
IDUKLQorI2RlZmluZSBCTEtJRl9PUF9ESVNDQVJEICAgICAgICAgICA1CiAvKgogICogTWF4aW11
bSBzY2F0dGVyL2dhdGhlciBzZWdtZW50cyBwZXIgcmVxdWVzdC4KICAqIFRoaXMgaXMgY2FyZWZ1
bGx5IGNob3NlbiBzbyB0aGF0IHNpemVvZihibGtpZl9yaW5nX3QpIDw9IFBBR0VfU0laRS4KQEAg
LTEzNCwxOCArMTQ1LDIxIEBAIHN0cnVjdCBibGtpZl9yZXF1ZXN0IHsKIHR5cGVkZWYgc3RydWN0
IGJsa2lmX3JlcXVlc3QgYmxraWZfcmVxdWVzdF90OwogCiAvKgotICogQ2FzdCB0byB0aGlzIHN0
cnVjdHVyZSB3aGVuIGJsa2lmX3JlcXVlc3Qub3BlcmF0aW9uID09IEJMS0lGX09QX1RSSU0KLSAq
IHNpemVvZihzdHJ1Y3QgYmxraWZfcmVxdWVzdF90cmltKSA8PSBzaXplb2Yoc3RydWN0IGJsa2lm
X3JlcXVlc3QpCisgKiBDYXN0IHRvIHRoaXMgc3RydWN0dXJlIHdoZW4gYmxraWZfcmVxdWVzdC5v
cGVyYXRpb24gPT0gQkxLSUZfT1BfRElTQ0FSRAorICogc2l6ZW9mKHN0cnVjdCBibGtpZl9yZXF1
ZXN0X2Rpc2NhcmQpIDw9IHNpemVvZihzdHJ1Y3QgYmxraWZfcmVxdWVzdCkKICAqLwotc3RydWN0
IGJsa2lmX3JlcXVlc3RfdHJpbSB7Ci0gICAgdWludDhfdCAgICAgICAgb3BlcmF0aW9uOyAgICAv
KiBCTEtJRl9PUF9UUklNICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCBibGtpZl9y
ZXF1ZXN0X2Rpc2NhcmQgeworICAgIHVpbnQ4X3QgICAgICAgIG9wZXJhdGlvbjsgICAgLyogQkxL
SUZfT1BfRElTQ0FSRCAgICAgICAgICAgICAgICAgICAgICovCiAgICAgdWludDhfdCAgICAgICAg
cmVzZXJ2ZWQ7ICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8K
ICAgICBibGtpZl92ZGV2X3QgICBoYW5kbGU7ICAgICAgIC8qIHNhbWUgYXMgZm9yIHJlYWQvd3Jp
dGUgcmVxdWVzdHMgICAgICAqLwogICAgIHVpbnQ2NF90ICAgICAgIGlkOyAgICAgICAgICAgLyog
cHJpdmF0ZSBndWVzdCB2YWx1ZSwgZWNob2VkIGluIHJlc3AgICovCiAgICAgYmxraWZfc2VjdG9y
X3Qgc2VjdG9yX251bWJlcjsvKiBzdGFydCBzZWN0b3IgaWR4IG9uIGRpc2sgICAgICAgICAgICAg
Ki8KICAgICB1aW50NjRfdCAgICAgICBucl9zZWN0b3JzOyAgIC8qIG51bWJlciBvZiBjb250aWd1
b3VzIHNlY3RvcnMgdG8gdHJpbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
LyogaWdub3JlZCBpZiAnZGlzY2FyZC1zZWN1cmU9MCcgICAgICAgICovCisjZGVmaW5lIEJMS0lG
X09QX0RJU0NBUkRfRkxBR19TRUNVUkUgKDE8PDEpCisgICAgdWludDMyX3QgICAgICAgZmxhZzsK
IH07Ci10eXBlZGVmIHN0cnVjdCBibGtpZl9yZXF1ZXN0X3RyaW0gYmxraWZfcmVxdWVzdF90cmlt
X3Q7Cit0eXBlZGVmIHN0cnVjdCBibGtpZl9yZXF1ZXN0X2Rpc2NhcmQgYmxraWZfcmVxdWVzdF9k
aXNjYXJkX3Q7CiAKIHN0cnVjdCBibGtpZl9yZXNwb25zZSB7CiAgICAgdWludDY0X3QgICAgICAg
IGlkOyAgICAgICAgICAgICAgLyogY29waWVkIGZyb20gcmVxdWVzdCAqLwo=




--===============0525935646==
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

--===============0525935646==--

From xen-devel-bounces@lists.xensource.com Mon Oct 10 11:53:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 11:53:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDKyU-0003OX-PM; Mon, 10 Oct 2011 11:53:18 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDKxj-0003BG-Rz; Mon, 10 Oct 2011 11:52:32 -0700
X-Env-Sender: andrey.warkentin@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1318272729!47629148!1
X-Originating-IP: [209.85.220.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10956 invoked from network); 10 Oct 2011 18:52:09 -0000
Received: from mail-dy0-f43.google.com (HELO mail-dy0-f43.google.com)
	(209.85.220.43)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 18:52:09 -0000
Received: by dyj3 with SMTP id 3so586068dyj.30
	for <multiple recipients>; Mon, 10 Oct 2011 11:52:28 -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=NAfUDopq/J7DmYrZ7zsZ7qd/fxgIbdnxmvopSwo4yVE=;
	b=Rof+CHK2Y/wf+qjbhLYEjdAAgC0YC3PZyM6W2pEq2NkvtAbQx0V7clystLpa0dRnUD
	oVc6DeQ3MG5PwS958asvyu2BJp1iIDfIOpGyZhVBW15BUmR3zh+83jifq92C6i0AdOfq
	3+l/8zxu5s+ZaYbKZGNH+63MPZyHLuMD4o4to=
MIME-Version: 1.0
Received: by 10.216.50.143 with SMTP id z15mr5122150web.16.1318272748294; Mon,
	10 Oct 2011 11:52:28 -0700 (PDT)
Received: by 10.216.176.139 with HTTP; Mon, 10 Oct 2011 11:52:28 -0700 (PDT)
In-Reply-To: <CAA73919.21AB3%keir.xen@gmail.com>
References: <1317134474.26672.43.camel@zakaz.uk.xensource.com>
	<CAA73919.21AB3%keir.xen@gmail.com>
Date: Mon, 10 Oct 2011 14:52:28 -0400
Message-ID: <CANz0V+4_jaQgpHJExtLm-k5s6wNoF1FyR3P5O1X4N73r3twkMw@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [Xen-users] Is xen planning to support hvm guests
	booting under UEFI?
From: "Andrei E. Warkentin" <andrey.warkentin@gmail.com>
To: Keir Fraser <keir.xen@gmail.com>
Content-Type: text/plain; charset=UTF-8
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	jim burns <jim_burn@bellsouth.net>, Bei Guan <gbtju85@gmail.com>,
	Ian Campbell <Ian.Campbell@eu.citrix.com>,
	Paul Durrant <Paul.Durrant@citrix.com>,
	Todd Deshane <todd.deshane@xen.org>, Jordan Justen <jljusten@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

Hi,

2011/9/27 Keir Fraser <keir.xen@gmail.com>:
> On 27/09/2011 07:41, "Ian Campbell" <Ian.Campbell@eu.citrix.com> wrote:
>
>>> OVMF is aware of Xen, and work was being done on a PV block device
>>> (Bei got as far as hypercall support and xenstore). Bei, are you
>>> working on the PV block driver? I want to say we're pretty close on
>>> that one (PV block not very hard, and neither is the block device
>>> abstraction for EFI).
>>
>> Thanks for the update, it sounds like it's pretty far along.
>>
>> The PV enhancements etc sound great but it would be nice if we could tie
>> up the baseline stuff so that folks can start using it.
>
> Yes, we'd rather get something basically working into the tree, than wait
> for everything to be absolutely perfect.
>
>> Is Bei still working on the project since the end of GSoC? If not is
>> there an archive of what he accomplished so that we can find someone to
>> pick up on it if necessary?
>>
>>> I/Bei had patches against hvmloader (to support booting OVMF) and Bei
>>> had patches against the management stack as well to expose the
>>> functionality of picking OVMF as the firmware. I believe all of these
>>> were sent to xen development list.
>>
>> I remember these. A bunch got applied after some discussion but IIRC not
>> all of them were? Bei, are you able to resend the ones which did not?
>
> Pretty much all the non-ovmf-specific changes went in (i.e., the most
> contentious bits, to existing hvmloader code, should be pretty much checked
> in already).
>

This is just a ping to let you know that I'm still on this. I'll
update you guys as soon as
I can get Bei's work on top of latest hg tree building and running.

Thanks,
A

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 12:01:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 12:01:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDL5z-0004o7-Iy; Mon, 10 Oct 2011 12:01:03 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDL2s-0004Yz-Ng; Mon, 10 Oct 2011 11:57:51 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318273067!447507!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5104 invoked from network); 10 Oct 2011 18:57:47 -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 Oct 2011 18:57:47 -0000
X-IronPort-AV: E=Sophos;i="4.68,518,1312156800"; 
   d="scan'208";a="8311562"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 18:57: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;
	Mon, 10 Oct 2011 19:57:38 +0100
Subject: Re: [Xen-devel] Re: [Xen-users] Is xen planning to support hvm
	guests booting under UEFI?
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "Andrei E. Warkentin" <andrey.warkentin@gmail.com>
In-Reply-To: <CANz0V+4_jaQgpHJExtLm-k5s6wNoF1FyR3P5O1X4N73r3twkMw@mail.gmail.com>
References: <1317134474.26672.43.camel@zakaz.uk.xensource.com>
	<CAA73919.21AB3%keir.xen@gmail.com>
	<CANz0V+4_jaQgpHJExtLm-k5s6wNoF1FyR3P5O1X4N73r3twkMw@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Mon, 10 Oct 2011 19:57:37 +0100
Message-ID: <1318273057.27397.0.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>,
	Keir Fraser <keir.xen@gmail.com>,
	jim burns <jim_burn@bellsouth.net>, Bei Guan <gbtju85@gmail.com>, Paul
	Durrant <Paul.Durrant@citrix.com>, Todd
	Deshane <todd.deshane@xen.org>, Jordan Justen <jljusten@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 Mon, 2011-10-10 at 19:52 +0100, Andrei E. Warkentin wrote:
> 
> This is just a ping to let you know that I'm still on this. I'll
> update you guys as soon as
> I can get Bei's work on top of latest hg tree building and running.

Thanks Andrei. If there's anything I can do to help please let me know.

Ian.



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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 12:20:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 12: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 1RDLOP-0006Tj-6T; Mon, 10 Oct 2011 12:20:05 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDLNg-0006Gm-60
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 12:19:20 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1318274333!48489032!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23368 invoked from network); 10 Oct 2011 19:18:54 -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 Oct 2011 19:18:54 -0000
X-IronPort-AV: E=Sophos;i="4.68,518,1312156800"; 
   d="scan'208";a="8311790"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 19:19: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;
	Mon, 10 Oct 2011 20:19:16 +0100
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
In-Reply-To: <20111010175323.GA31210@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<20111010175323.GA31210@phenom.oracle.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Mon, 10 Oct 2011 20:19:15 +0100
Message-ID: <1318274355.27397.12.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "hch@infradead.org" <hch@infradead.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Li Dongyang <lidongyang@novell.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	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

Where is your tree at the moment?

On Mon, 2011-10-10 at 18:53 +0100, Konrad Rzeszutek Wilk wrote:
> > > I think an explicit flag variable is likely to be less trouble WRT
> > > maintaining compatibility in the future than a bit-field. Also I think
> > > you may as well align the struct size to something larger than a byte,
> > > either 4 or 8 bytes would make sense.
> > 
> > Ok. Will change it and make it an uint64_t secure_flag
> > variable. Later on if there are any "other" flags we can chop it down.
> 
> New patch (it also looks like the patch I sent to xen-devel to update
> the blkif.h was never merged) - so let me send right now.
> 
> BTW, it seems that the #pragma pack(push, 4) is used in the
> drivers/block/xen-blkback/common.h to compact the structures already so
> I don't think we need the aligment.

Only around the x86_32 ABI definition, working around the fact that the
original 32 bit interface was not 64 bit clean :-(. I think to ensure
that the new DISCARD structure is sensibly aligned you probably do want
it to be a multiple of 64 bits in size (32 of flags and 32 of pad would
do it).

> diff --git a/include/xen/interface/io/blkif.h b/include/xen/interface/io/blkif.h
> index 9324488..13d040e 100644
> --- a/include/xen/interface/io/blkif.h
> +++ b/include/xen/interface/io/blkif.h
> @@ -84,6 +84,10 @@ typedef uint64_t blkif_sector_t;
>   *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
>   * http://www.seagate.com/staticfiles/support/disc/manuals/
>   *     Interface%20manuals/100293068c.pdf
> + * We also provide three extra XenBus options to the discard operation:

Who is "We" here? The frontend, backend or both? Do they both need to
agree on anything?

> + * 'discard-granularity' - Max amount of sectors that can be discarded.

... in a single request?

> + * 'discard-alignment' - 4K, 128K, etc aligment on sectors to erased.
                                          alignment

What size are the sectors which "discard-granularity" is measured in? Is
it "discard-alignment"-byte sectors or in base 512-byte sectors?

> + * 'discard-secure' - whether the discard can also securely erase data.
>   */
>  #define BLKIF_OP_DISCARD           5
>  
> @@ -107,6 +111,8 @@ struct blkif_request_rw {
>  struct blkif_request_discard {
>  	blkif_sector_t sector_number;
>  	uint64_t nr_sectors;
> +#define BLKIF_OP_DISCARD_FLAG_SECURE	(1<<1) /* ignored if discard-secure=0 */

"1<<0" is unused.

> +	uint32_t flag;
>  };
>  
>  struct blkif_request {



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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 12:21:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 12:21:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDLPU-0006rU-Hc; Mon, 10 Oct 2011 12:21:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDLOQ-0006TH-Kk
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 12:20:07 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318274403!18927581!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12101 invoked from network); 10 Oct 2011 19:20:03 -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;
	10 Oct 2011 19:20:03 -0000
X-IronPort-AV: E=Sophos;i="4.68,518,1312156800"; 
   d="scan'208";a="8311799"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 19:20: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;
	Mon, 10 Oct 2011 20:20:03 +0100
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
In-Reply-To: <20111010164250.GG28646@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Mon, 10 Oct 2011 20:20:02 +0100
Message-ID: <1318274402.27397.13.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "hch@infradead.org" <hch@infradead.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Li Dongyang <lidongyang@novell.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	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

On Mon, 2011-10-10 at 17:42 +0100, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 10, 2011 at 05:13:07PM +0100, Ian Campbell wrote:

> > In any case it should also be posted against the canonical inter-guest
> > interface definition in the xen tree for review with that in mind.
> 
> Yes! But I was thinking to first let this one rattle a bit and see what
> folks thought about it before submitting the xen-devel.

It's a good idea to get ABI changes out for review before the
implementation rattles around so much that changing it becomes hard.

Ian.


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 12:28:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 12:28:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDLW9-0007No-4L; Mon, 10 Oct 2011 12:28:05 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDLVL-0007At-5R
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 12:27:16 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318274830!438240!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6024 invoked from network); 10 Oct 2011 19:27:12 -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; 10 Oct 2011 19:27:12 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AJR6eC010913
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 19:27:07 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AJR4V3012274
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 19:27:05 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
	p9AJQxNq013794; Mon, 10 Oct 2011 14:26:59 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 12:26:59 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 2B12FC54; Mon, 10 Oct 2011 15:26:50 -0400 (EDT)
Date: Mon, 10 Oct 2011 15:26:50 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andy Burns <xen.lists@burns.me.uk>
Subject: Re: [Xen-devel] Fwd: xentop reporting zero written sectors
Message-ID: <20111010192650.GA31011@phenom.oracle.com>
References: <CAE1-PRdq9BWjTTHPPBPvESr-ULcdjHgPMTABcCO6+wCLJ1UYog@mail.gmail.com>
	<CAE1-PReA8E-kSif=BU=s-vzOqi-4F4LotxqofH7EEw+dYLtpUA@mail.gmail.com>
	<1318260599.21903.455.camel@zakaz.uk.xensource.com>
	<CAE1-PRdorUt+_DznkVe1dgeDJiz5pGe4AGvTkvd=JAN70a=_nQ@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAE1-PRdorUt+_DznkVe1dgeDJiz5pGe4AGvTkvd=JAN70a=_nQ@mail.gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090201.4E93470C.004B,ss=1,re=0.000,fgs=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 Mon, Oct 10, 2011 at 07:02:08PM +0100, Andy Burns wrote:
> On 10 October 2011 16:29, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> 
> > How would it be a feature?
> 
> Sorry for the bug <-> feature sarcasm
> 
> > Scrobbling around under tools/xenstat these statistics appear to be read
> > from /sys/bus/xen-backend/devices/<vbd>/wr_sect (likewise rd_sect,
> > wr_req etc etc).
> > Can you see all of those and do the numbers appear to be doing the right
> > thing?
> 
> Yes, just to confirm what Konrad has spotted ...
> 
> # cat /sys/bus/xen-backend/devices/*/statistics/wr_sect
> 0
> 0
> 0
> 
> # cat /sys/bus/xen-backend/devices/*/statistics/rd_sect
> 90313
> 125876
> 2546
> 
> I'll try the patch later, when I've finished pulling my hair out with
> a pci-passthrough issue!

HVM or PV?

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 12:45:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 12:45:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDLn8-0008JA-Ge; Mon, 10 Oct 2011 12:45:38 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDLli-00086C-JN
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 12:44:11 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318275845!450161!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22800 invoked from network); 10 Oct 2011 19:44:07 -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; 10 Oct 2011 19:44:07 -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 1ADA39D36;
	Mon, 10 Oct 2011 12:44:04 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id EA60C2093F;
	Mon, 10 Oct 2011 12:44:01 -0700 (PDT)
Message-ID: <4E934B01.4040805@goop.org>
Date: Mon, 10 Oct 2011 12:44:01 -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: Stephan Diestelhorst <stephan.diestelhorst@amd.com>
Subject: Re: [Xen-devel] [PATCH 00/10] [PATCH RFC V2] Paravirtualized
	ticketlocks
References: <cover.1315878463.git.jeremy.fitzhardinge@citrix.com>
	<4E8DE7F1.3050108@goop.org> <2523929.AGG4U997NO@d-allen>
	<2222671.j13duhYQpt@d-allen>
In-Reply-To: <2222671.j13duhYQpt@d-allen>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com, Kleen <andi@firstfloor.org>,
	Nick Piggin <npiggin@kernel.dk>, KVM <kvm@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>, maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"Andi@domain.invalid" <Andi@domain.invalid>,
	Avi Kivity <avi@redhat.com>, Jan Beulich <JBeulich@suse.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	"the@domain.invalid" <the@domain.invalid>,
	Linus Torvalds <torvalds@linux-foundation.org>, Ingo Molnar <mingo@elte.hu>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/10/2011 07:01 AM, Stephan Diestelhorst wrote:
> On Monday 10 October 2011, 07:00:50 Stephan Diestelhorst wrote:
>> On Thursday 06 October 2011, 13:40:01 Jeremy Fitzhardinge wrote:
>>> On 10/06/2011 07:04 AM, Stephan Diestelhorst wrote:
>>>> On Wednesday 28 September 2011, 14:49:56 Linus Torvalds wrote:
>>>>> Which certainly should *work*, but from a conceptual standpoint, isn't
>>>>> it just *much* nicer to say "we actually know *exactly* what the upper
>>>>> bits were".
>>>> Well, we really do NOT want atomicity here. What we really rather want
>>>> is sequentiality: free the lock, make the update visible, and THEN
>>>> check if someone has gone sleeping on it.
>>>>
>>>> Atomicity only conveniently enforces that the three do not happen in a
>>>> different order (with the store becoming visible after the checking
>>>> load).
>>>>
>>>> This does not have to be atomic, since spurious wakeups are not a
>>>> problem, in particular not with the FIFO-ness of ticket locks.
>>>>
>>>> For that the fence, additional atomic etc. would be IMHO much cleaner
>>>> than the crazy overflow logic.
>>> All things being equal I'd prefer lock-xadd just because its easier to
>>> analyze the concurrency for, crazy overflow tests or no.  But if
>>> add+mfence turned out to be a performance win, then that would obviously
>>> tip the scales.
>>>
>>> However, it looks like locked xadd is also has better performance:  on
>>> my Sandybridge laptop (2 cores, 4 threads), the add+mfence is 20% slower
>>> than locked xadd, so that pretty much settles it unless you think
>>> there'd be a dramatic difference on an AMD system.
>> Indeed, the fences are usually slower than locked RMWs, in particular,
>> if you do not need to add an instruction. I originally missed that
>> amazing stunt the GCC pulled off with replacing the branch with carry
>> flag magic. It seems that two twisted minds have found each other
>> here :)
>>
>> One of my concerns was adding a branch in here... so that is settled,
>> and if everybody else feels like this is easier to reason about...
>> go ahead :) (I'll keep my itch to myself then.)
> Just that I can't... if performance is a concern, adding the LOCK
> prefix to the addb outperforms the xadd significantly:

Hm, yes.  So using the lock prefix on add instead of the mfence?  Hm.

    J

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 12:52:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 12:52:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDLte-0000Kc-58; Mon, 10 Oct 2011 12:52:22 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDLsv-00007z-1x
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 12:51:38 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-13.tower-182.messagelabs.com!1318276292!21584253!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16597 invoked from network); 10 Oct 2011 19:51:33 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-13.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 10 Oct 2011 19:51:33 -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 56DE99D38;
	Mon, 10 Oct 2011 12:51:31 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 41DBC20925;
	Mon, 10 Oct 2011 12:51:29 -0700 (PDT)
Message-ID: <4E934CC1.9040804@goop.org>
Date: Mon, 10 Oct 2011 12:51:29 -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: Ingo Molnar <mingo@elte.hu>
Subject: Re: [Xen-devel] [PATCH 00/10] [PATCH RFC V2] Paravirtualized
	ticketlocks
References: <cover.1315878463.git.jeremy.fitzhardinge@citrix.com>
	<201109282008.17722.stephan.diestelhorst@amd.com>
	<CA+55aFwm7ESNfrHhEHrAKcjcPUq8YxtuEkJd5PzAekYo2dMYNw@mail.gmail.com>
	<2707952.s3VYcmPHUN@chlor> <4E8DE7F1.3050108@goop.org>
	<4E8DEED0.1020909@goop.org> <20111010073214.GB29035@elte.hu>
In-Reply-To: <20111010073214.GB29035@elte.hu>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Nick Piggin <npiggin@kernel.dk>, KVM <kvm@vger.kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jan Beulich <JBeulich@suse.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Stephan Diestelhorst <stephan.diestelhorst@amd.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/10/2011 12:32 AM, Ingo Molnar wrote:
> * Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>
>> On 10/06/2011 10:40 AM, Jeremy Fitzhardinge wrote:
>>> However, it looks like locked xadd is also has better performance:  on
>>> my Sandybridge laptop (2 cores, 4 threads), the add+mfence is 20% slower
>>> than locked xadd, so that pretty much settles it unless you think
>>> there'd be a dramatic difference on an AMD system.
>> Konrad measures add+mfence is about 65% slower on AMD Phenom as well.
> xadd also results in smaller/tighter code, right?

Not particularly, mostly because of the overflow-into-the-high-part
compensation.  But its only a couple of extra instructions, and no
conditionals, so I don't think it would have any concrete effect.

But, as Stephen points out, perhaps locked add is preferable to locked
xadd, since it also has the same barrier as mfence but has
(significantly!) better performance than either mfence or locked xadd...

    J

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 13:03:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 13:03:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDM4o-0001Yu-2D; Mon, 10 Oct 2011 13:03:54 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDLzb-0001HQ-Ej
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 12:58:50 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318276692!41044706!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16151 invoked from network); 10 Oct 2011 19:58:13 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Oct 2011 19:58:13 -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 C42E39D43;
	Mon, 10 Oct 2011 12:58:21 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id CC12420925;
	Mon, 10 Oct 2011 12:58:19 -0700 (PDT)
Message-ID: <4E934E5B.3000603@goop.org>
Date: Mon, 10 Oct 2011 12:58:19 -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: Jason Baron <jbaron@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111010153631.GA2413@redhat.com>
In-Reply-To: <20111010153631.GA2413@redhat.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>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/10/2011 08:36 AM, Jason Baron wrote:
> On Sat, Oct 01, 2011 at 02:55:35PM -0700, Jeremy Fitzhardinge wrote:
>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>
>> If a key has been enabled before jump_label_init() is called, don't
>> nop it out.
>>
>> This removes arch_jump_label_text_poke_early() (which can only nop
>> out a site) and uses arch_jump_label_transform() instead.
>>
>> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>> ---
>>  include/linux/jump_label.h |    3 ++-
>>  kernel/jump_label.c        |   20 ++++++++------------
>>  2 files changed, 10 insertions(+), 13 deletions(-)
>>
>> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
>> index 1213e9d..c8fb1b3 100644
>> --- a/include/linux/jump_label.h
>> +++ b/include/linux/jump_label.h
>> @@ -45,7 +45,8 @@ extern void jump_label_lock(void);
>>  extern void jump_label_unlock(void);
>>  extern void arch_jump_label_transform(struct jump_entry *entry,
>>  				 enum jump_label_type type);
>> -extern void arch_jump_label_text_poke_early(jump_label_t addr);
>> +extern void arch_jump_label_transform_early(struct jump_entry *entry,
>> +				 enum jump_label_type type);
>>  extern int jump_label_text_reserved(void *start, void *end);
>>  extern void jump_label_inc(struct jump_label_key *key);
>>  extern void jump_label_dec(struct jump_label_key *key);
>> diff --git a/kernel/jump_label.c b/kernel/jump_label.c
>> index a8ce450..059202d5 100644
>> --- a/kernel/jump_label.c
>> +++ b/kernel/jump_label.c
>> @@ -121,13 +121,6 @@ static void __jump_label_update(struct jump_label_key *key,
>>  	}
>>  }
>>  
>> -/*
>> - * Not all archs need this.
>> - */
>> -void __weak arch_jump_label_text_poke_early(jump_label_t addr)
>> -{
>> -}
>> -
>>  static __init int jump_label_init(void)
>>  {
>>  	struct jump_entry *iter_start = __start___jump_table;
>> @@ -139,12 +132,15 @@ static __init int jump_label_init(void)
>>  	jump_label_sort_entries(iter_start, iter_stop);
>>  
>>  	for (iter = iter_start; iter < iter_stop; iter++) {
>> -		arch_jump_label_text_poke_early(iter->code);
>> -		if (iter->key == (jump_label_t)(unsigned long)key)
>> +		struct jump_label_key *iterk;
>> +
>> +		iterk = (struct jump_label_key *)(unsigned long)iter->key;
>> +		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
>> +					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
>> +		if (iterk == key)
>>  			continue;
>>  
>> -		key = (struct jump_label_key *)(unsigned long)iter->key;
>> -		atomic_set(&key->enabled, 0);
>> +		key = iterk;
>>  		key->entries = iter;
>>  #ifdef CONFIG_MODULES
>>  		key->next = NULL;
>> @@ -212,7 +208,7 @@ void jump_label_apply_nops(struct module *mod)
>>  		return;
>>  
>>  	for (iter = iter_start; iter < iter_stop; iter++)
>> -		arch_jump_label_text_poke_early(iter->code);
>> +		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
>>  }
>>  
>>  static int jump_label_add_module(struct module *mod)
>> -- 
>> 1.7.6.2
>>
> Hi,
>
> I just realized that the early call to jump_label_inc(), isn't being
> honored with this patch until later when we invoke jump_label_init().
> That strikes me as being inconsistent. When jump_label_inc() returns we
> should expect the branch to be updated.

Why is that?  It looks to me like it will unconditionally update the
instruction, irrespective of whether _init() has been called?

> Thus, I think what probably want is to add a new 'int jump_label_init'
> flag. If its not set we can call 'jump_label_init()' from
> jump_label_inc()/dec().

Hm.  I worry that it may end up calling jump_label_init() in an
unexpected context, especially since it may well be config-dependent, or
adding a jump_label_inc() later on starts mysteriously failing.

>  And jump_label_init() can avoid initialization
> if its already set.

That doesn't seem worthwhile in itself.  I suspect the number of "early"
jump_label_incs will be very small (or we should look at doing the init
earlier).

    J

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 13:06:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 13:06:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDM6z-0001xn-45; Mon, 10 Oct 2011 13:06:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDM0N-0001IR-N5
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 12:59:27 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1318276754!454102!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30251 invoked from network); 10 Oct 2011 19:59:16 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-6.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Oct 2011 19:59:16 -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
	p9AJwx7T006796
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 10 Oct 2011 19:59:01 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
	p9AJwwHF009082
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 19:58:58 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
	p9AJwqOJ017378; Mon, 10 Oct 2011 14:58:52 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 12:58:52 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id D65531361; Mon, 10 Oct 2011 15:58:42 -0400 (EDT)
Date: Mon, 10 Oct 2011 15:58:42 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Jackson@eu.citrix.com,
	Ian.Campbell@citrix.com, lidongyang@novell.com, owen.smith@citrix.com, 
	paul.durrant@citrix.com, pasik@iki.fi
Subject: Re: [Xen-devel] [PATCH 1 of 1] interface: BLKIF_OP_TRIM ->
	BLKIF_OP_DISCARD
Message-ID: <20111010195842.GB5755@phenom.oracle.com>
References: <patchbomb.1318269010@localhost6.localdomain6>
	<d17ab29f2f9ad29a7b8a.1318269011@localhost6.localdomain6>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <d17ab29f2f9ad29a7b8a.1318269011@localhost6.localdomain6>
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.0A090205.4E934E85.0149:SCFMA922111,ss=1,re=-4.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

On Mon, Oct 10, 2011 at 01:50:11PM -0400, Konrad Rzeszutek Wilk wrote:
> # HG changeset patch
> # User Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> # Date 1318268906 14400
> # Node ID d17ab29f2f9ad29a7b8af02d6f17de7f112a9723
> # Parent  72f339bc600d7a9629d3f9eb8a279fbf8be25b12
> interface: BLKIF_OP_TRIM -> BLKIF_OP_DISCARD
>=20

Per Ian's suggestion:

# HG changeset patch
# Parent 72f339bc600d7a9629d3f9eb8a279fbf8be25b12
interface: BLKIF_OP_TRIM -> BLKIF_OP_DISCARD

The name 'trim' is specific to the ATA discard implementation.
The name 'scsi unmap' is specific to the SCSI discard implementation.

We should really use a generic name - and the name 'discard'
looks to be the most generic of them all.

CC: lidongyang@novell.com
CC: owen.smith@citrix.com
CC: Pasi K=E4rkk=E4inen <pasik@iki.fi>
CC: JBeulich@novell.com
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff -r 72f339bc600d xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h	Mon Oct 10 11:21:51 2011 +0100
+++ b/xen/include/public/io/blkif.h	Mon Oct 10 15:54:51 2011 -0400
@@ -82,26 +82,47 @@
  */
 #define BLKIF_OP_RESERVED_1        4
 /*
- * Recognised only if "feature-trim" is present in backend xenbus info.
- * The "feature-trim" node contains a boolean indicating whether trim
- * requests are likely to succeed or fail. Either way, a trim request
+ * Recognised only if "feature-discard" is present in backend xenbus inf=
o.
+ * The "feature-discard" node contains a boolean indicating whether trim
+ * (ATA) or unmap (SCSI) - conviently called discard requests are likely
+ * to succeed or fail. Either way, a discard request
  * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported b=
y
  * the underlying block-device hardware. The boolean simply indicates wh=
ether
- * or not it is worthwhile for the frontend to attempt trim requests.
- * If a backend does not recognise BLKIF_OP_TRIM, it should *not*
- * create the "feature-trim" node!
- *=20
- * Trim operation is a request for the underlying block device to mark
- * extents to be erased. Trim operations are passed with sector_number a=
s the
- * sector index to begin trim operations at and nr_sectors as the number=
 of
- * sectors to be trimmed. The specified sectors should be trimmed if the
- * underlying block device supports trim operations, or a BLKIF_RSP_EOPN=
OTSUPP
- * should be returned. More information about trim operations at:
+ * or not it is worthwhile for the frontend to attempt discard requests.
+ * If a backend does not recognise BLKIF_OP_DISCARD, it should *not*
+ * create the "feature-discard" node!
+ *
+ * Discard operation is a request for the underlying block device to mar=
k
+ * extents to be erased. However, discard does not guarantee that the bl=
ocks
+ * will be erased from the device - it is just a hint to the device
+ * controller that these blocks are no longer in use. What the device
+ * controller does with that information is left to the controller.
+ * Discard operations are passed with sector_number as the
+ * sector index to begin discard operations at and nr_sectors as the num=
ber of
+ * sectors to be discarded. The specified sectors should be discarded if=
 the
+ * underlying block device supports trim (ATA) or unmap (SCSI) operation=
s,
+ * or a BLKIF_RSP_EOPNOTSUPP  should be returned.
+ * More information about trim/unmap operations at:
  * http://t13.org/Documents/UploadedDocuments/docs2008/
  *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
+ * http://www.seagate.com/staticfiles/support/disc/manuals/
+ *     Interface%20manuals/100293068c.pdf
+ * The backend can optionally provide three extra XenBus attributes to
+ * further optimize the discard functionality:
+ * 'discard-aligment' - Devices that support discard functionality may
+ * internally allocate space in units that are bigger than the exported
+ * logical block size. The discard-alignment parameter indicates how man=
y bytes
+ * the beginning of the partition is offset from the internal allocation=
 unit's
+ * natural alignment.
+ * 'discard-granularity'  - Devices that support discard functionality m=
ay
+ * internally allocate space using units that are bigger than the logica=
l block
+ * size. The discard-granularity parameter indicates the size of the int=
ernal
+ * allocation unit in bytes if reported by the device. Otherwise the
+ * discard-granularity will be set to match the device's physical block =
size.
+ * 'discard-secure' - All copies of the discarded sectors (potentially c=
reated by
+ * garbage collection) must also be erased.
  */
-#define BLKIF_OP_TRIM              5
-
+#define BLKIF_OP_DISCARD           5
 /*
  * Maximum scatter/gather segments per request.
  * This is carefully chosen so that sizeof(blkif_ring_t) <=3D PAGE_SIZE.
@@ -134,18 +155,22 @@ struct blkif_request {
 typedef struct blkif_request blkif_request_t;
=20
 /*
- * Cast to this structure when blkif_request.operation =3D=3D BLKIF_OP_T=
RIM
- * sizeof(struct blkif_request_trim) <=3D sizeof(struct blkif_request)
+ * Cast to this structure when blkif_request.operation =3D=3D BLKIF_OP_D=
ISCARD
+ * sizeof(struct blkif_request_discard) <=3D sizeof(struct blkif_request=
)
  */
-struct blkif_request_trim {
-    uint8_t        operation;    /* BLKIF_OP_TRIM                       =
 */
+struct blkif_request_discard {
+    uint8_t        operation;    /* BLKIF_OP_DISCARD                    =
 */
     uint8_t        reserved;     /*                                     =
 */
     blkif_vdev_t   handle;       /* same as for read/write requests     =
 */
     uint64_t       id;           /* private guest value, echoed in resp =
 */
     blkif_sector_t sector_number;/* start sector idx on disk            =
 */
     uint64_t       nr_sectors;   /* number of contiguous sectors to trim=
 */
+                                 /* ignored if 'discard-secure=3D0'     =
   */
+#define BLKIF_OP_DISCARD_FLAG_SECURE (1<<0)
+    uint32_t       flag;
+    uint32_t       pad;
 };
-typedef struct blkif_request_trim blkif_request_trim_t;
+typedef struct blkif_request_discard blkif_request_discard_t;
=20
 struct blkif_response {
     uint64_t        id;              /* copied from request */

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 13:08:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 13:08:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDM9U-0002M1-4u; Mon, 10 Oct 2011 13:08:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDM1I-0001JP-LZ
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 13:00:21 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318276793!46047917!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 651 invoked from network); 10 Oct 2011 19:59:55 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 10 Oct 2011 19:59:55 -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 316C79D44;
	Mon, 10 Oct 2011 13:00:11 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 24B5820925;
	Mon, 10 Oct 2011 13:00:09 -0700 (PDT)
Message-ID: <4E934EC9.5030909@goop.org>
Date: Mon, 10 Oct 2011 13:00:09 -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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <ce19ea02-45e6-465a-a4c8-b5d74bf8c2ad@default>
	<20111010155319.GA29140@phenom.oracle.com>
In-Reply-To: <20111010155319.GA29140@phenom.oracle.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: linux-kernel@vger.kernel.org, xen-devel@lists.xensource.com,
	Zhenzhong Duan <zhenzhong.duan@oracle.com>, linux-x86_64@vger.kernel.org
Subject: [Xen-devel] Re: [PATCH] cpu idle ticks show twice in xen pvm 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

On 10/10/2011 08:53 AM, Konrad Rzeszutek Wilk wrote:
> On Wed, Oct 05, 2011 at 10:11:58PM -0700, Zhenzhong Duan wrote:
>> Run below test on xen pvm.
>> # x=$(cat /proc/stat | grep cpu0 | awk '{print $5}') && sleep 60  \
>> && y=$(cat /proc/stat | grep cpu0 | awk '{print $5}') \
>> && echo -e  "X:$x\nY:$y\nIDLE:" $(echo "scale=3; ($y-$x)/6000*100" | bc)
>>
>> @ X:58562301
>> @ Y:58574282
>> @ IDLE: 199.600
>>
>> Normal idle percent should be around 100%.
>> xen_timer_interrupt called account_idle_ticks to account hypervisor stolen idle ticks 
>> but these ticks will be accounted again when idle ticks restarted.
>>
>> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
>> Signed-off-by: Joe Jin <joe.jin@oracle.com>
> Please in the future also CC the maintainers (you can get that using
> the scripts/get_maintainer.pl).
>
> Jeremy, any thoughts?

Does this affect the accounting of stolen ticks?  If it does, that's not
necessarily a showstopper for this patch, but we'll need to do some more
thinking about it.  Certainly, accurate accounting for idleness is
important.

    J

>> diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
>> index 163b467..5dcbc91 100644
>> --- a/arch/x86/xen/time.c
>> +++ b/arch/x86/xen/time.c
>> @@ -151,7 +151,6 @@ static void do_stolen_accounting(void)
>>  
>>  	ticks = iter_div_u64_rem(blocked, NS_PER_TICK, &blocked);
>>  	__this_cpu_write(xen_residual_blocked, blocked);
>> -	account_idle_ticks(ticks);
>>  }
>>  
>>  /* Get the TSC speed from Xen */
>> --
>> 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 Mon Oct 10 13:11:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 13:11:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDMC3-0002qI-Fl; Mon, 10 Oct 2011 13:11:23 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDM38-0001LV-Dz
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 13:02:21 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-2.tower-174.messagelabs.com!1318276925!34703524!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10046 invoked from network); 10 Oct 2011 20:02:07 -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 Oct 2011 20:02:07 -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 B2B939D4A;
	Mon, 10 Oct 2011 13:02:01 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 172DC2084F;
	Mon, 10 Oct 2011 13:01:59 -0700 (PDT)
Message-ID: <4E934F37.2020300@goop.org>
Date: Mon, 10 Oct 2011 13:01:59 -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: Ingo Molnar <mingo@elte.hu>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
	<619c66d6da63aa086e2eac017e7aed216cc8ddc3.1317755691.git.jeremy.fitzhardinge@citrix.com>
	<8762k4grwy.fsf@rustcorp.com.au> <20111010073405.GC29035@elte.hu>
In-Reply-To: <20111010073405.GC29035@elte.hu>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	Rusty Russell <rusty@rustcorp.com.au>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V3 2/8] stop_machine: make stop_machine
 safe and efficient to call early
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/10/2011 12:34 AM, Ingo Molnar wrote:
> * Rusty Russell <rusty@rustcorp.com.au> wrote:
>
>> On Tue,  4 Oct 2011 12:18:03 -0700, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>>
>>> Make stop_machine() safe to call early in boot, before stop_machine()
>>> has been set up, by simply calling the callback function directly if
>>> there's only one CPU online.
>> Not that you need this, since it's >90% Tejun's code now, but:
>>
>> Acked-by: Rusty Russell <rusty@rustcorp.com.au>
> hey, extra review is always useful.
>
> Jeremy, Tejun, what's the expected merge path of these changes?

Andrew has already picked up the stop_machine patch, I think.  But it's
pretty settled now, so it shouldn't cause any problem if it gets via
multiple paths.

What about the jump-label stuff?  Has that been going via tip.git in the
past, or by some other path?

    J

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 13:13:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 13:13:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDMDu-0003Eh-Gh; Mon, 10 Oct 2011 13:13:18 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDM52-0001b9-2k
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 13:04:11 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1318277025!62348706!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18523 invoked from network); 10 Oct 2011 20:03:46 -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; 10 Oct 2011 20:03:46 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9AK3vAB029490
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Mon, 10 Oct 2011 20:03:58 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9AK3u1A007634
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 10 Oct 2011 20:03:56 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
	p9AK3ovg022078; Mon, 10 Oct 2011 15:03:50 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 13:03:50 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 59271C54; Mon, 10 Oct 2011 15:57:49 -0400 (EDT)
Date: Mon, 10 Oct 2011 15:57:49 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
Message-ID: <20111010195749.GA5755@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318274402.27397.13.camel@dagon.hellion.org.uk>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090208.4E934FAF.0036,ss=1,re=0.000,fgs=0
Cc: "hch@infradead.org" <hch@infradead.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Li Dongyang <lidongyang@novell.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	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

On Mon, Oct 10, 2011 at 08:20:02PM +0100, Ian Campbell wrote:
> On Mon, 2011-10-10 at 17:42 +0100, Konrad Rzeszutek Wilk wrote:
> > On Mon, Oct 10, 2011 at 05:13:07PM +0100, Ian Campbell wrote:
> 
> > > In any case it should also be posted against the canonical inter-guest
> > > interface definition in the xen tree for review with that in mind.
> > 
> > Yes! But I was thinking to first let this one rattle a bit and see what
> > folks thought about it before submitting the xen-devel.
> 
> It's a good idea to get ABI changes out for review before the
> implementation rattles around so much that changing it becomes hard.

OK, lets drop this until we get that straigthen out. I've posted
http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00642.html the changes to
Xen ABI.

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 13:15:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 13:15:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDMG4-0003d5-I9; Mon, 10 Oct 2011 13:15:32 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDMBY-0002hG-9I
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 13:10:52 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318277448!451644!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29790 invoked from network); 10 Oct 2011 20:10:48 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-7.tower-216.messagelabs.com with SMTP;
	10 Oct 2011 20:10:48 -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 p9AKASDV032074
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 10 Oct 2011 16:10:28 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9AKASPP022600; Mon, 10 Oct 2011 16:10:28 -0400
Date: Mon, 10 Oct 2011 16:10:28 -0400
From: Jason Baron <jbaron@redhat.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111010201027.GC2413@redhat.com>
References: <cover.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<477dead9647029012f93c651f2892ed0e86b89e7.1317506051.git.jeremy.fitzhardinge@citrix.com>
	<20111010153631.GA2413@redhat.com> <4E934E5B.3000603@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E934E5B.3000603@goop.org>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] jump_label: if a key has already
 been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 10, 2011 at 12:58:19PM -0700, Jeremy Fitzhardinge wrote:
> > Hi,
> >
> > I just realized that the early call to jump_label_inc(), isn't being
> > honored with this patch until later when we invoke jump_label_init().
> > That strikes me as being inconsistent. When jump_label_inc() returns we
> > should expect the branch to be updated.
> 
> Why is that?  It looks to me like it will unconditionally update the
> instruction, irrespective of whether _init() has been called?
> 

No. jump_label_init(), sets up key->entries, to point into the jump
table...before that jump_label_update(), doesn't know where the table is
located, and will just return, without doing the update.


> > Thus, I think what probably want is to add a new 'int jump_label_init'
> > flag. If its not set we can call 'jump_label_init()' from
> > jump_label_inc()/dec().
> 
> Hm.  I worry that it may end up calling jump_label_init() in an
> unexpected context, especially since it may well be config-dependent, or
> adding a jump_label_inc() later on starts mysteriously failing.

good point.

> 
> >  And jump_label_init() can avoid initialization
> > if its already set.
> 
> That doesn't seem worthwhile in itself.  I suspect the number of "early"
> jump_label_incs will be very small (or we should look at doing the init
> earlier).
> 
>     J

I have it as 'early_initcall()', but perhaps it should be moved into
init/main.c. I don't think there's any reason it can't be done super
early. So I think this might be the best answer. It will also simplify
your series.

Thanks,

-Jason

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 13:16:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 13:16:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDMHQ-00040R-2K; Mon, 10 Oct 2011 13:16:56 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDMCA-0002rf-Rp
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 13:11:32 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1318277454!58226253!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27284 invoked from network); 10 Oct 2011 20:10:55 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 20:10:55 -0000
X-IronPort-AV: E=Sophos;i="4.68,519,1312156800"; 
   d="scan'208";a="8312323"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 20:11: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, 10 Oct 2011 21:11:27 +0100
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 1RDMC7-0005Kb-8J;
	Mon, 10 Oct 2011 20:11:27 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RDMC7-0008Hn-2o;
	Mon, 10 Oct 2011 21:11:27 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9238-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 10 Oct 2011 21:11:27 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9238: 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 9238 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9238/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-pair          7 xen-boot/src_host          fail REGR. vs. 9237
 test-i386-i386-xl-win        12 guest-localmigrate/x10     fail REGR. vs. 9237

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 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-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

version targeted for testing:
 xen                  b8b413d8b2df
baseline version:
 xen                  72f339bc600d

------------------------------------------------------------
People who touched revisions under test:
  Daniel De Graaf <dgdegra@tycho.nsa.gov>
  Ian Campbell <ian.campbell.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jon Ludlam <jonathan.ludlam@eu.citrix.com>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Zheng Li <zheng.li@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                                         fail    
 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:   23942:b8b413d8b2df
tag:         tip
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Mon Oct 10 16:49:48 2011 +0100
    
    tools/check: check for yajl (needed by libxl)
    
    We need precisely version 1 so check for .so.1. In the future we should handle
    yajl v2 as well.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23941:9ad40e16c68f
user:        Jon Ludlam <jonathan.ludlam@eu.citrix.com>
date:        Mon Oct 10 16:41:17 2011 +0100
    
    tools/ocaml: Small improvement to the ocaml xenctrl library
    
    Add a new field 'max_nr_cpus' to the physinfo type in the ocaml xc bindings
    
    Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
    Acked-by: Ian Campbell <ian.campbell.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   23940:187d59e32a58
user:        Jon Ludlam <jonathan.ludlam@eu.citrix.com>
date:        Mon Oct 10 16:41:16 2011 +0100
    
    tools/ocaml: Fix 2 bit-twiddling bugs and an off-by-one
    
    The bit bugs are in ocaml vcpu affinity calls, and the off-by-one
    error is in the ocaml console ring code
    
    Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
    Acked-by: Ian Campbell <ian.campbell.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
    
    
changeset:   23939:51288f69523f
user:        Jon Ludlam <jonathan.ludlam@eu.citrix.com>
date:        Mon Oct 10 16:41:16 2011 +0100
    
    tools/ocaml: Remove log library from tools/ocaml/libs
    
    The only user was oxenstored, which has had the relevant bits
    merged in.
    
    Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
    Acked-by: Ian Campbell <ian.campbell.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
    
    
changeset:   23938:fa04fbd56521
user:        Jon Ludlam <jonathan.ludlam@eu.citrix.com>
date:        Mon Oct 10 16:41:16 2011 +0100
    
    tools/ocaml: Remove the uuid library
    
    The library was only minimally used, and was really rather redundant.
    
    Signed-off-by: Zheng Li <zheng.li@eu.citrix.com>
    Acked-by: Ian Campbell <ian.campbell.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    Acked-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
    
    
changeset:   23937:5173834e8476
user:        Jon Ludlam <jonathan.ludlam@eu.citrix.com>
date:        Mon Oct 10 16:38:08 2011 +0100
    
    tools/ocaml: Add a missing dependency to the xenctrl ocaml package
    
    Signed-off-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
    Acked-by: Ian Campbell <ian.campbell.com>
    Committed-by: Ian Jackson <ian.jackson.citrix.com>
    
    
changeset:   23936:cdb34816a40a
user:        Jon Ludlam <jonathan.ludlam@eu.citrix.com>
date:        Mon Oct 10 16:37:07 2011 +0100
    
    tools/ocaml: Rename the ocaml libraries
    
    ocamlfind does not support namespaces, so to avoid
    name clashes the module names have become longer.
    Additionally, the xenstore and xenbus subdirs, which
    contain several modules each, have been packed into
    toplevel Xenstore and Xenbus modules.
    
    xb becomes xenbus, xc becomes xenctrl, xl becomes xenlight,
    xs becomes xenstore, eventchn becomes xeneventchn and
    mmap becomes xenmmap.
    
    [ Patch modified from that submitted, to update the .hgignore, and to
      cope with intervening changes to mmap_stubs.c -iwj ]
    
    Signed-off-by: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23935:72f339bc600d
user:        Daniel De Graaf <dgdegra@tycho.nsa.gov>
date:        Mon Oct 10 11:21:51 2011 +0100
    
    libxl: correctly parse disk "backendtype" field
    
    The expression for backendtype was missing a comma.
    
    Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
    Acked-by: Ian Campbell <ian.campbell@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 Mon Oct 10 14:14:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 14:14:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDNBK-0001q9-TK; Mon, 10 Oct 2011 14:14:42 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDN8T-0000yF-De
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 14:11:48 -0700
X-Env-Sender: rush1503@gmail.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318281078!52607483!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12930 invoked from network); 10 Oct 2011 21:11:19 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 21:11:19 -0000
Received: by ggnk4 with SMTP id k4so8787327ggn.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 14:11:41 -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=C2XP5J5f681VhynCTSTANAfPG57E2mYQLrW1Y8t7THY=;
	b=UGqXJcfqGK2u3HXYyYje/i9/IKnGpVcgnu00VL7ss2PhZO1+3VSFjWljf/A41E2srZ
	7qDXDNzdkjkosk6ZJl66g1KjKoILZP6jyEzKApUmAMeNmq599J5c/1fhv8IyyJbri0Wy
	TltiICjPiU7ScJ5hz3RXTYIyEO7k32KhgmR4Q=
MIME-Version: 1.0
Received: by 10.101.165.2 with SMTP id s2mr4071963ano.58.1318281101188; Mon,
	10 Oct 2011 14:11:41 -0700 (PDT)
Received: by 10.101.55.18 with HTTP; Mon, 10 Oct 2011 14:11:40 -0700 (PDT)
In-Reply-To: <20111010164920.GA30351@phenom.oracle.com>
References: <1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
	<CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
	<1317460798.11991.2.camel@dagon.hellion.org.uk>
	<CA+rvmv+yU0=nEuvLSqkE44RFqeaQw504MkD-sxjXV3D3nkme_g@mail.gmail.com>
	<20111003184722.GB15608@phenom.oracle.com>
	<1317667984.11991.6.camel@dagon.hellion.org.uk>
	<CA+rvmvJ_i4Ta+GV5PQ0U7+2yPxT2oJXtnE_fq0j8Faa7GcUxqw@mail.gmail.com>
	<20111010164920.GA30351@phenom.oracle.com>
Date: Tue, 11 Oct 2011 01:11:40 +0400
Message-ID: <CA+rvmvJhxnqA_L5OXw8P_Vuqjq0ps-0Ux7nELEhoSCO_MuguRA@mail.gmail.com>
Subject: Re: [Xen-devel] Re: BUG: unable to handle kernel paging request at
	ffff8803bb6ad000
From: rush <rush1503@gmail.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: Jonathan Nieder <jrnieder@gmail.com>, 642154@bugs.debian.org,
	xen-devel <xen-devel@lists.xensource.com>,
	Ben Hutchings <ben@decadent.org.uk>, Ian Campbell <ijc@hellion.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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

2011/10/10, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>:
>
> Can I ask you to do one more thing? Can you upgrade to the xen-4.1.1 in
> the testing and try with the xsave (or without) and see if it works?
>
Ok, but I need around a week for it. (some difficulties with access to
this server at the moment).

> <holds his fingers hoping it is the xsave feature>

Thank you (:

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 14:36:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 14:36:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDNW7-00045H-AK; Mon, 10 Oct 2011 14:36:11 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDNVY-0003sR-SO
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 14:35:38 -0700
X-Env-Sender: apxeng@gmail.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1318282523!62964315!1
X-Originating-IP: [209.85.216.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2451 invoked from network); 10 Oct 2011 21:35:24 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 21:35:24 -0000
Received: by qyk29 with SMTP id 29so3043659qyk.9
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 14:35:32 -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=NoliCsWrlk0Iv+M8RtKOn6WobgHk8syGkfsPoX17/G0=;
	b=RoT4zQZGwTzxv5bm6OZaxHlbIAbEHcZn0yno5SyYddIceNVZyXdUhcOi3TRF29b+A1
	joLDJz7U5dIRbTzdhIYVhKfBiq3iLWlNGVwI6TXwU0vTaUARW7AJN0D36KML+S5i2zBV
	KHX8dQnw3I8fG70JLXPFMwpojzfMO0gVfvx28=
MIME-Version: 1.0
Received: by 10.229.23.206 with SMTP id s14mr3744364qcb.178.1318282532180;
	Mon, 10 Oct 2011 14:35:32 -0700 (PDT)
Received: by 10.229.34.139 with HTTP; Mon, 10 Oct 2011 14:35:32 -0700 (PDT)
Received: by 10.229.34.139 with HTTP; Mon, 10 Oct 2011 14:35:32 -0700 (PDT)
In-Reply-To: <3DDB718A-0E09-486A-810D-05DF7D790C22@gmail.com>
References: <3DDB718A-0E09-486A-810D-05DF7D790C22@gmail.com>
Date: Mon, 10 Oct 2011 14:35:32 -0700
Message-ID: <CAGU+autfuFcgxCOSxyEPOtJ6ZQjnqb6nfbZzzJoUGZnbxONXmw@mail.gmail.com>
Subject: Re: [Xen-devel] nested xen on domU?
From: AP <apxeng@gmail.com>
To: Hyo J Lee <hyo747@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="===============0973561927=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0973561927==
Content-Type: multipart/alternative; boundary=0016364172cb0b549f04aef89221

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

On Oct 9, 2011 9:11 AM, "Hyo J Lee" <hyo747@gmail.com> wrote:
>
> Hi all
>
> I wonder if there's any way that I can do nested xen on domU not dom0.
> This is what I plan.
>
>             | dom0_T| |domU1_T| |domU2_T|
>             ----------------------------- (domU1_B)
> |dom0_B|    |       xen top             |
> -----------------------------------------
> |             xen bottom                |
>

I tried this recently on an Intel platform and was unable to bring up
DomU1_T. The bios screen wouldn't come up. Do let me know if you have better
luck.

Thanks,
AP

> And I want to be able to take the entire snapshot of domU1_B (including
dom0_T, domU1_T, domU2_T)
> So far, only documents I found about nested xen told me to install the xen
top on dom0_B.
> So I wonder if there's any way to install xen top on domU1_B or any
workaround.
>
> Thanks,
> - Hyo
>
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>

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

<p>On Oct 9, 2011 9:11 AM, &quot;Hyo J Lee&quot; &lt;<a href=3D"mailto:hyo7=
47@gmail.com">hyo747@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Hi all<br>
&gt;<br>
&gt; I wonder if there&#39;s any way that I can do nested xen on domU not d=
om0.<br>
&gt; This is what I plan.<br>
&gt;<br>
&gt; =A0=A0 =A0 =A0 =A0 =A0 =A0| dom0_T| |domU1_T| |domU2_T|<br>
&gt; =A0 =A0 =A0 =A0 =A0 =A0 ----------------------------- (domU1_B)<br>
&gt; |dom0_B| =A0 =A0| =A0 =A0 =A0 xen top =A0 =A0 =A0 =A0 =A0 =A0 |<br>
&gt; -----------------------------------------<br>
&gt; | =A0 =A0 =A0 =A0 =A0 =A0 xen bottom =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0|<=
br>
&gt;</p>
<p>I tried this recently on an Intel platform and was unable to bring up Do=
mU1_T. The bios screen wouldn&#39;t come up. Do let me know if you have bet=
ter luck.</p>
<p>Thanks,<br>
AP</p>
<p>&gt; And I want to be able to take the entire snapshot of domU1_B (inclu=
ding dom0_T, domU1_T, domU2_T)<br>
&gt; So far, only documents I found about nested xen told me to install the=
 xen top on dom0_B.<br>
&gt; So I wonder if there&#39;s any way to install xen top on domU1_B or an=
y workaround.<br>
&gt;<br>
&gt; Thanks,<br>
&gt; - Hyo<br>
&gt;<br>
&gt;<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">http://lists.xensourc=
e.com/xen-devel</a><br>
&gt;<br>
</p>

--0016364172cb0b549f04aef89221--


--===============0973561927==
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

--===============0973561927==--


From xen-devel-bounces@lists.xensource.com Mon Oct 10 15:05:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 15:05:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDNyA-00055n-Cq; Mon, 10 Oct 2011 15:05:10 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDNvo-0004qy-Dv
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 15:03:20 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318284136!52610186!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29948 invoked from network); 10 Oct 2011 22:02:17 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 22:02:17 -0000
Received: by vcbfo13 with SMTP id fo13so7354570vcb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 15:02:39 -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:content-type;
	bh=LhhU0YbLBjAYjD3u3/WRBB26B4+h/KALZaWIUKfe0wI=;
	b=N2CVYzvutyb1+NLcl9J3DGAeI4PLXbdMWxQ5mi2AFkkenqA5TFFwLhpBjrYnOapkhj
	s0wRpEgOGsrl4VPjqodSgZl+7RqKJd2mQx3KpC+qla+0C6i+ZLHX2MwvOQ7NRdpvAdRE
	FbKcovGb+1DM7QJECmRPL/7TVuNvv/uiiL3OU=
MIME-Version: 1.0
Received: by 10.52.6.132 with SMTP id b4mr15810372vda.39.1318284158813; Mon,
	10 Oct 2011 15:02:38 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Mon, 10 Oct 2011 15:02:38 -0700 (PDT)
In-Reply-To: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
Date: Mon, 10 Oct 2011 23:02:38 +0100
X-Google-Sender-Auth: Y9HGmrKTVsbJyv9LClBEBpuqllU
Message-ID: <CAE1-PRcQxQ4vmOn5zYLRCXLPLqoMqO+CKNJVrpnJ3QX3bd+OyA@mail.gmail.com>
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] Re: PCI passthrough stopped working, brainache!
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

[Resent from subscribed address]

Recently had passthrough of 2xPCI DVB-T cards and 1xPCIe DVB-S2 card working,
the last know config that was *certainly* working was

dom0
xen-4.1.1-3.fc16.x86_64
kernel-3.1.0-0.rc7.git0.0.fc16.x86_64

domU
kernel-3.1.0-0.rc8.git0.0.fc16.x86_64

Since then I've updated

xen-4.1.1-6.fc16.x86_64 on dom0

kernel-3.1.0-0.rc9.git0.0.fc16.x86_64 on dom0 and domU

and updated all other packages to current F16 updates-testing,
also lots of fiddling with grub2 and systemd on the domU

Only today did I realise that only the PCIe card is now working, not
the PCI ones, and have since spent several hours trying to get back to
a working configuration :-(

I've rolled my xen packages back from 4.1.1-6 to 4.1.1-3
tried booting various combinations of 3.1.0-rc7/rc8/rc9 as dom0 and domU

made sure I still have "pci=resource_alignment" for all the relevant
PCI devices on the dom0
made sure I still have "iommu=soft" on the domU
made sure pci-back is happy with "xm pci-list-assignable-devices"
made sure devices really have been assigned with "xm pci-list mythf16"
made sure the devices and drivers show in the domU with "lspci",
"lsusb" and "lsmod"
checked "xm dmesg" on dom0 and "dmesg" on dom0 and domU that drivers
see the hardware and load firmware OK
scandvb goes through the motions of tuning, but finds no stations,
this  *feels* as though the issue is lack of DMA transfers.

How can I tell if the iommu=soft is taking effect?
Anything stupid I sound like I've forgotten?

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 16:43:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 16:43:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDPVU-0008Ga-Gq; Mon, 10 Oct 2011 16:43:40 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDPUJ-00083v-CB
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 16:42:28 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318290143!464992!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6534 invoked from network); 10 Oct 2011 23:42:24 -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;
	10 Oct 2011 23:42:24 -0000
X-IronPort-AV: E=Sophos;i="4.68,519,1312156800"; 
   d="scan'208";a="8314781"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	10 Oct 2011 23:42: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; Tue, 11 Oct 2011 00:42:07 +0100
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 1RDPTz-0006Um-CW;
	Mon, 10 Oct 2011 23:42:07 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RDPTz-0000os-Bz;
	Tue, 11 Oct 2011 00:42:07 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9239-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 11 Oct 2011 00:42:07 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9239: 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 9239 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9239/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail pass in 9238
 test-amd64-i386-pair          7 xen-boot/src_host    fail in 9238 pass in 9239
 test-i386-i386-xl-win      12 guest-localmigrate/x10 fail in 9238 pass in 9239

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

version targeted for testing:
 xen                  b8b413d8b2df
baseline version:
 xen                  72f339bc600d

------------------------------------------------------------
People who touched revisions under test:
  Daniel De Graaf <dgdegra@tycho.nsa.gov>
  Ian Campbell <ian.campbell.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jon Ludlam <jonathan.ludlam@eu.citrix.com>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Zheng Li <zheng.li@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=b8b413d8b2df
+ . 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 b8b413d8b2df
+ branch=xen-unstable
+ revision=b8b413d8b2df
+ . 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 b8b413d8b2df 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 71 changes to 50 files

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 18:40:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 18:40:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDRKi-0003gZ-J3; Mon, 10 Oct 2011 18:40:40 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDRJR-0003Tt-Gs
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 18:39:21 -0700
X-Env-Sender: universalbillow@gmail.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1318297157!19933031!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25483 invoked from network); 11 Oct 2011 01:39:18 -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;
	11 Oct 2011 01:39:18 -0000
Received: by ggnk4 with SMTP id k4so9062573ggn.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 18:39:17 -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=aRXcSdTYtMwB5Km2zzSrmCfkD9qec7mSAynCt0b/Z10=;
	b=b3W1o2JFxMaTzxRkH8lYRf27+WWrsyqfHztMRYSKjUIsj1N9ALXbu+rpRvJOfbf0i0
	vdwqRZ2ucoC7IUdh+I6Ab0IEPny4hzhAUR8DuUkyUY5W4Vs5T9IckRsUw6UzK51nwOtj
	lOlL3m3D0rTyb6Dw4CdmQ4py7zg0LBEc6nC34=
MIME-Version: 1.0
Received: by 10.236.165.102 with SMTP id d66mr2529187yhl.2.1318297157061; Mon,
	10 Oct 2011 18:39:17 -0700 (PDT)
Received: by 10.236.69.230 with HTTP; Mon, 10 Oct 2011 18:39:17 -0700 (PDT)
Date: Tue, 11 Oct 2011 09:39:17 +0800
Message-ID: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
From: cc Luit <universalbillow@gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] why xen use x86_emulation() in page_fault
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============1428484866=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1428484866==
Content-Type: multipart/alternative; boundary=20cf30563c37c14c8504aefbf9e8

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

Hi, everyone, I have a question,
in the shadow_page_fault or ept mechanism, xen will use the x86_emulation
for some instructions, I'm wondering why it must use it, if after we fix the
SPT or EPT table, just VMEntry to HVM to re-excute this instruction  but not
emulate in xen, is there some problems?

can sb. tell me why?
thanks:)

-- 
- Luit @ Parallel Processing Institute, Fudan University

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

<div>Hi, everyone, I have a question,</div>
<div>in the shadow_page_fault or ept mechanism, xen will use the x86_emulat=
ion for some instructions, I&#39;m wondering why it must use it, if after w=
e fix the SPT or EPT table, just VMEntry to HVM to re-excute this instructi=
on=A0 but not emulate in xen, is there some problems?</div>

<div>=A0</div>
<div>can sb. tell me why?</div>
<div>thanks:)</div>
<div><br>-- <br>- Luit @ Parallel Processing Institute, Fudan University=A0=
<br></div>

--20cf30563c37c14c8504aefbf9e8--


--===============1428484866==
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

--===============1428484866==--


From xen-devel-bounces@lists.xensource.com Mon Oct 10 19:03:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 19:03:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDRgk-0004gg-3b; Mon, 10 Oct 2011 19:03:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDRcU-0004LY-Vh
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 18:59:28 -0700
X-Env-Sender: universalbillow@gmail.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1318298337!468752!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1179 invoked from network); 11 Oct 2011 01:58:58 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-9.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 01:58:58 -0000
Received: by ggnk4 with SMTP id k4so9081385ggn.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 18:58:57 -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=YzAyqz+vkP2LKEaCyn7d17q0oQLbyUPPOakWtXoZAoY=;
	b=R9xpSdTd5qOeqd8/JLx8PDPZPC7vE3ZGHWNRct2F3+yJsKqlGuFSjJdTGO74fbLhPo
	qez1oZbwxwzgnaosy3N9ZZH+7/Wa5AsdgcQMIYJG5j3nQZsoPKFrPWjp3297is/WmzsH
	xEVo9O0gxLmuNf9R8MI015FGYmrf2ivrlKcOo=
MIME-Version: 1.0
Received: by 10.236.76.38 with SMTP id a26mr27694683yhe.53.1318298337489; Mon,
	10 Oct 2011 18:58:57 -0700 (PDT)
Received: by 10.236.69.230 with HTTP; Mon, 10 Oct 2011 18:58:57 -0700 (PDT)
Date: Tue, 11 Oct 2011 09:58:57 +0800
Message-ID: <CADWh-PFu7Cs7TiAbuQiO31MoJq+eboy7O_z9KBAuweNDjsWqKw@mail.gmail.com>
Subject: =?UTF-8?B?W1hlbi1kZXZlbF0gd2h5IHhlbiB1c2UgeDg2X2VtdWxhdOKAi2lvbigpIGluIHBhZ2VfZg==?=
	=?UTF-8?B?YXVsdA==?=
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="===============2107972712=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2107972712==
Content-Type: multipart/alternative; boundary=20cf303bf65c1d322804aefc4059

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

Hi, everyone, I have a question,
in the shadow_page_fault or ept mechanism, xen will use the x86_emulation
for some instructions, I'm wondering why it must use it, if after we fix the
SPT or EPT table, just VMEntry to HVM to re-excute this instruction  but not
emulate in xen, is there some problems?

can sb. tell me why?
thanks:)
-- 
- Luit @ Parallel Processing Institute, Fudan University

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

<p>Hi, everyone, I have a question,<br>in the shadow_page_fault or ept mech=
anism, xen will use the x86_emulation for some instructions, I&#39;m wonder=
ing why it must use it, if after we fix the SPT or EPT table, just VMEntry =
to HVM to re-excute this instruction=A0 but not emulate in xen, is there so=
me problems?<br>
=A0<br>can sb. tell me why?<br>thanks:)<br>-- <br>- Luit @ Parallel Process=
ing Institute, Fudan University=A0<br></p>

--20cf303bf65c1d322804aefc4059--


--===============2107972712==
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

--===============2107972712==--


From xen-devel-bounces@lists.xensource.com Mon Oct 10 20:11:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 20: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 1RDSkb-0006Qb-L6; Mon, 10 Oct 2011 20:11:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDSih-0006CP-Ra
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 20:10:10 -0700
X-Env-Sender: bsingharora@gmail.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318302568!18955439!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18857 invoked from network); 11 Oct 2011 03:09:28 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-3.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 03:09:28 -0000
Received: by bkas6 with SMTP id s6so12030775bka.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 20:09:28 -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=nA2p2ccyYECArF7NxJ1vAYgHSSzEPJaXl7r/YjGKXno=;
	b=hslo3V9dajW0yZAEyHW2U0ckCIL2LidGcNTOiAY59NXlHQnhh0cgNACbrhm4hzQGBD
	hB+LzyFWbDMSdOUvktHZWZVk45MiLaXr62zhRwfIox3EJEUsIt0NE1mUbZ7qecOyAVT7
	7HaX4MNi2pzwSdbA3ZGh7hC5d5FUHtOu8IHDQ=
MIME-Version: 1.0
Received: by 10.223.75.137 with SMTP id y9mr36485563faj.14.1318302568357; Mon,
	10 Oct 2011 20:09:28 -0700 (PDT)
Received: by 10.152.41.233 with HTTP; Mon, 10 Oct 2011 20:09:28 -0700 (PDT)
Date: Tue, 11 Oct 2011 08:39:28 +0530
Message-ID: <CAKTCnzkyYASOH_gaf+4pQoGqM4q=1r=mfLHcoP-5oy59yyHbXw@mail.gmail.com>
From: Balbir Singh <bsingharora@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] Trap flags, debug and emulation - xen 4.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

Hi,

 I've been trying a simple experiment on my intel box (along the lines
 of http://web.archiveorange.com/archive/v/tXSRN8SPX0sXRutnvOCu). I
 have a system with VMX but no EPT, it falls back on shadow page tables
 and I disable super pages. The VM itself is a 32 bit OS. I am using
 xen-4.1.1 on ubuntu.

 Quoting from the link above

 "First, I mark a guest page "not present" inside the shadow page table
 so that I could intercept any operation that involves this page. When
 the guest tries to access that page, it faults and control goes to Xen
 (sh_page_fault function). There, I emulate that operation and return
 the control to guest to execute next instruction. I could get my first
 part working.

 In the second part after emulating the instruction inside Xen, I want
 to perform single-step execution from next instruction onwards so that
 I could monitor further execution of guest from that point.

 To achieve that I did following: After emulating an instruction inside
 Xen and before sending the control back to guest OS, I set the
 EFLAGS's trap bit set by doing following operation:

 regs->eflag |= X86_EFLAGS_TF

 And return the control from sh_page_fault function by saying "return
 EFAULT_FIXED".

 I am doing something very similar. I do get the fault and I can set
 the trap, but I don't see any form of single stepping take place as I
 do not get the TRAP_debug exception back. My exception_bitmap has
 TRAP_no_device, TRAP_page_fault, TRAP_debug and TRAP_int3 set.

 I've tried debugging the issue with xentrace and printks, but sadly I
 could not track down the issue. The CPU does have
 cpu_has_monitor_trap_flag set to true.

 Could anyone give me clues on how to track down why I did not get a
 TRAP_debug exception via a VMEXIT?

 Balbir Singh

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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 20:13:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 20:13:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDSmv-0006or-KI; Mon, 10 Oct 2011 20:13:54 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDSm5-0006cO-Kb
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 20:13:02 -0700
X-Env-Sender: matthew.hook@otoy.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1318302776!16780718!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21674 invoked from network); 11 Oct 2011 03:12:57 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 03:12:57 -0000
Received: by vcbfo13 with SMTP id fo13so7547816vcb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 20:12:56 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.52.94.97 with SMTP id db1mr15826456vdb.67.1318302775990; Mon,
	10 Oct 2011 20:12:55 -0700 (PDT)
Received: by 10.52.113.233 with HTTP; Mon, 10 Oct 2011 20:12:55 -0700 (PDT)
Date: Tue, 11 Oct 2011 11:12:55 +0800
Message-ID: <CAMrHX2X3Xb_fwjEgCfT0SDKxR-L9GEi1Kquwo+4bbkRGVovN6w@mail.gmail.com>
From: Matthew Hook <matthew.hook@otoy.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] blktap2 test harness
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0704122197=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0704122197==
Content-Type: multipart/alternative; boundary=20cf307cff38ab58a204aefd4890

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

Hi I'm new to this list.

I'm just wondering if anyone has available a standalone test harness for
testing blktap2 drivers.
Something where you can drop in your driver file, link it up and the test
harness will test it.
I see there are such tools for other parts of xen but I can't see anything
in the code for blktap2.

Regards, Matt

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

<div>Hi I&#39;m new to this list.</div><div><br></div>I&#39;m just wonderin=
g if anyone has available a standalone test harness for testing blktap2 dri=
vers.<div><div>Something where you can drop in your driver file, link it up=
 and the test harness will test it.</div>
<div>I see there are such tools for other parts of xen but I can&#39;t see =
anything in the code for blktap2.</div><div><br></div><div>Regards,=A0Matt<=
/div></div>

--20cf307cff38ab58a204aefd4890--


--===============0704122197==
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

--===============0704122197==--


From xen-devel-bounces@lists.xensource.com Mon Oct 10 20:16:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 20:16:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDSpS-0007JO-31; Mon, 10 Oct 2011 20:16:30 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDSox-00076h-Bm
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 20:15:59 -0700
X-Env-Sender: zhenzhong.duan@oracle.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1318302954!475194!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9789 invoked from network); 11 Oct 2011 03:15:56 -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; 11 Oct 2011 03:15:56 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9B3FpuH015774
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Tue, 11 Oct 2011 03:15:52 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9B3Flpc012434
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 03:15:48 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
	p9B3Fel9019669; Mon, 10 Oct 2011 22:15:40 -0500
Received: from zhenzhong2.localdomain (/10.182.38.239)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 10 Oct 2011 20:15:40 -0700
Message-ID: <4E93B51A.4020204@oracle.com>
Date: Tue, 11 Oct 2011 11:16:42 +0800
From: DuanZhenzhong <zhenzhong.duan@oracle.com>
Organization: Oracle Corporation
User-Agent: Thunderbird 2.0.0.24 (X11/20101209)
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <ce19ea02-45e6-465a-a4c8-b5d74bf8c2ad@default>
	<20111010155319.GA29140@phenom.oracle.com>
	<4E934EC9.5030909@goop.org>
In-Reply-To: <4E934EC9.5030909@goop.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090204.4E93B4E9.0024,ss=1,re=0.000,fgs=0
Cc: linux-kernel@vger.kernel.org, xen-devel@lists.xensource.com,
	Joe Jin <joe.jin@oracle.com>, linux-x86_64@vger.kernel.org,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH] cpu idle ticks show twice in xen pvm 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

Jeremy Fitzhardinge wrote:
> On 10/10/2011 08:53 AM, Konrad Rzeszutek Wilk wrote:
>   
>> On Wed, Oct 05, 2011 at 10:11:58PM -0700, Zhenzhong Duan wrote:
>>     
>>> Run below test on xen pvm.
>>> # x=$(cat /proc/stat | grep cpu0 | awk '{print $5}') && sleep 60  \
>>> && y=$(cat /proc/stat | grep cpu0 | awk '{print $5}') \
>>> && echo -e  "X:$x\nY:$y\nIDLE:" $(echo "scale=3; ($y-$x)/6000*100" | bc)
>>>
>>> @ X:58562301
>>> @ Y:58574282
>>> @ IDLE: 199.600
>>>
>>> Normal idle percent should be around 100%.
>>> xen_timer_interrupt called account_idle_ticks to account hypervisor stolen idle ticks 
>>> but these ticks will be accounted again when idle ticks restarted.
>>>
>>> Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
>>> Signed-off-by: Joe Jin <joe.jin@oracle.com>
>>>       
>> Please in the future also CC the maintainers (you can get that using
>> the scripts/get_maintainer.pl).
>>
>> Jeremy, any thoughts?
>>     
>
> Does this affect the accounting of stolen ticks?  If it does, that's not
> necessarily a showstopper for this patch, but we'll need to do some more
> thinking about it.  Certainly, accurate accounting for idleness is
> important.
>
>     J
>
>   
Thanks Konrad for point out that.
In Original kernel, tick_nohz_restart_sched_tick and 
do_stolen_accounting both called account_idle_ticks.
For a idle pvm, idle/iowait maybe doubled apparently.
Normally Y-X should get close to 6000 in idle system, but in my test 
it's 11981.
But I am still not sure if patch has any impact to other part. Thanks
>>> diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
>>> index 163b467..5dcbc91 100644
>>> --- a/arch/x86/xen/time.c
>>> +++ b/arch/x86/xen/time.c
>>> @@ -151,7 +151,6 @@ static void do_stolen_accounting(void)
>>>  
>>>  	ticks = iter_div_u64_rem(blocked, NS_PER_TICK, &blocked);
>>>  	__this_cpu_write(xen_residual_blocked, blocked);
>>> -	account_idle_ticks(ticks);
>>>  }
>>>  
>>>  /* Get the TSC speed from Xen */
>>> --
>>> 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/
>>>       
>
>   


-- 
Regards
zhenzhong
--
Oracle Building, No.24 Building, Zhongguancun Software Park
Haidian District, Beijing 100193, China


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

From xen-devel-bounces@lists.xensource.com Mon Oct 10 21:02:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 21:02:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDTYA-0000tH-Hv; Mon, 10 Oct 2011 21:02:42 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDTU4-0000dY-Bz
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 20:58:43 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318305505!18957450!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 790 invoked from network); 11 Oct 2011 03:58:25 -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;
	11 Oct 2011 03:58:25 -0000
X-IronPort-AV: E=Sophos;i="4.68,521,1312156800"; 
   d="scan'208";a="8315608"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Oct 2011 03:58: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; Tue, 11 Oct 2011 04:58:24 +0100
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 1RDTU0-00088T-3C;
	Tue, 11 Oct 2011 03:58:24 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RDTTz-0000Mw-UN;
	Tue, 11 Oct 2011 04:58:23 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9244-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 11 Oct 2011 04:58:23 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9244: 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 9244 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9244/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-i386-i386-win           14 guest-start.2                fail pass in 9239

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 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     14 guest-localmigrate/x10       fail    like 9239
 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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check       fail in 9239 never pass

version targeted for testing:
 xen                  b8b413d8b2df
baseline version:
 xen                  b8b413d8b2df

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 Oct 10 23:05:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 10 Oct 2011 23:05:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDVTB-0004SB-4z; Mon, 10 Oct 2011 23:05:41 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDVSK-0004Fi-Gn
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 23:04:48 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-12.tower-21.messagelabs.com!1318313068!53352987!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32389 invoked from network); 11 Oct 2011 06:04:28 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-12.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Oct 2011 06:04:28 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1318313085; l=452;
	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=u9blqfHp0qNPhgC99I5bXYsfWHM=;
	b=Jho/LvVBakAyoyhIKz9076XcBXMr+IAaknN3WxKaIiGBC1LJsYrCDwSP5yj6EpqPL9s
	bTP3wH+xEXYyIW/3ZhqKTbXMk8jRxeFWUUmQhKNhXyxJxCm3mu3SFz0tKwEkhZTlepoRJ
	YCdEMhl7U5q1qNQZHSQZRnwjuzMdYefIoLc=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjzoQFXLy
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-119-065.pools.arcor-ip.net [88.65.119.65])
	by smtp.strato.de (jimi mo14) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id d04d88n9B3ZoFx ;
	Tue, 11 Oct 2011 08:04:41 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 52FD018891; Tue, 11 Oct 2011 08:04:40 +0200 (CEST)
Date: Tue, 11 Oct 2011 08:04:40 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Andres Lagar Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] Re: Re: mapping problems in xenpaging
Message-ID: <20111011060440.GA7848@aepfle.de>
References: <20111010092111.GB31800@ocelot.phlegethon.org>
	<CAB8821A.2291B%keir.xen@gmail.com>
	<CADzFZPt5vVLnx1qZ0ffiT9ynkj9asdH-ts_nKtsyDCY9_0EL=w@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <CADzFZPt5vVLnx1qZ0ffiT9ynkj9asdH-ts_nKtsyDCY9_0EL=w@mail.gmail.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: zhen shi <bickys1986@gmail.com>, Keir Fraser <keir.xen@gmail.com>,
	Tim Deegan <tim@xen.org>, xen-devel@lists.xensource.com,
	Adin Scannell <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, Oct 10, Andres Lagar Cavilla wrote:

> Pigybacking another question: ultimately, if we get p2m sync correct,
> paging can introduce arbitrary waits. Currently the code bails out,
> rather ungracefully (e.g. hvm_copy). Is this what wait queues were
> introduced for? Hasn't that been implemented purely out of lack of
> cycles, or something more fundamental awaits?

I did not have the time yet to make use of that new feature.

Olaf

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 00:08:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 00:08:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDWRg-0006A7-1F; Tue, 11 Oct 2011 00:08:12 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDWQt-0005xo-Lx
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 00:07:24 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1318316821!46006670!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8839 invoked from network); 11 Oct 2011 07:07:01 -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; 11 Oct 2011 07:07:01 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 08:07:19 +0100
Message-Id: <4E940744020000780005A9F9@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 08:07:16 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "rush" <rush1503@gmail.com>,
	"Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Re: BUG: unable to handle kernel paging
	request at ffff8803bb6ad000
References: <1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
	<CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
	<1317460798.11991.2.camel@dagon.hellion.org.uk>
	<CA+rvmv+yU0=nEuvLSqkE44RFqeaQw504MkD-sxjXV3D3nkme_g@mail.gmail.com>
	<20111003184722.GB15608@phenom.oracle.com>
	<1317667984.11991.6.camel@dagon.hellion.org.uk>
	<CA+rvmvJ_i4Ta+GV5PQ0U7+2yPxT2oJXtnE_fq0j8Faa7GcUxqw@mail.gmail.com>
	<20111010164920.GA30351@phenom.oracle.com>
In-Reply-To: <20111010164920.GA30351@phenom.oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Jonathan Nieder <jrnieder@gmail.com>, 642154@bugs.debian.org,
	xen-devel <xen-devel@lists.xensource.com>,
	Ben Hutchings <ben@decadent.org.uk>, Ian Campbell <ijc@hellion.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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 10.10.11 at 18:49, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> =
wrote:
> On Sat, Oct 08, 2011 at 10:13:14AM +0400, rush wrote:
>> OK, I tried it again, but Oops didn't gone.
> .. snip..
>>         echo    'Loading Xen 4.0-amd64 ...'
>>         multiboot       /boot/xen-4.0-amd64.gz placeholder xsave=3D0
> .. snip..
>> Was it right?
>=20
> Yup. I think.. this is a bit embarrassing. It took a bit of time for =
Intel
> folks to get the xsave part right and I remember seeing this error about =
a
> year ago with xsave on a Dell Optiplex 780. Hence I wonder if the fixes =
that
> ultimately went in 4.1.1 did not get ported over to 4.0 and you are just
> hitting that.
>=20
> Can I ask you to do one more thing? Can you upgrade to the xen-4.1.1 in
> the testing and try with the xsave (or without) and see if it works?
>=20
> <holds his fingers hoping it is the xsave feature>

Are both of you certain this isn't the problem of the kernel only
looking at the xsaveopt feature flag (implying that this means
xsave is also available)? I found it necessary to force-clear that
flag in the kernel when OSXSAVE is not set (by calling
x86_xsave_setup() when !cpu_has_xsave, which in turn was
modified to look at X86_FEATURE_OSXSAVE rather than
X86_FEATURE_XSAVE under Xen - all of which I'm afraid would
need to be done differently in pv-ops).

If it is, the problem could be worked around by *en*abling xsave
in Xen (which is off by default prior to 4.2), assuming none of the
incomplete functionality would cause other headaches.

But yes, the CPUID handling code in 4.1.1 should properly hide
XSAVEOPT when XSAVE is disabled, so just using this version
ought to also get things going.

Jan


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 00:26:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 00: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 1RDWjU-0006rE-QM; Tue, 11 Oct 2011 00:26:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDWik-0006eK-3i
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 00:25:50 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1318317927!47677104!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7918 invoked from network); 11 Oct 2011 07:25:28 -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; 11 Oct 2011 07:25:28 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 08:25:46 +0100
Message-Id: <4E940B99020000780005AA12@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 08:25:45 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>,
	"Dong Yang Li" <lidongyang@suse.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-3-git-send-email-konrad.wilk@oracle.com>
In-Reply-To: <1318260494-27985-3-git-send-email-konrad.wilk@oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: hch@infradead.org, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org
Subject: [Xen-devel] Re: [PATCH 2/3] xen/blkback: Fix the inhibition to map
	pages when discarding sector ranges.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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.10.11 at 17:28, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> =
wrote:
> The 'operation' parameters are the ones provided to the bio layer while
> the req->operation are the ones passed in between the backend and
> frontend. We used the wrong 'operation' value to squash the
> call to map pages when processing the discard operation resulting
> in mapping the pages unnecessarily.
>=20
> CC: Li Dongyang <lidongyang@novell.com>
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> ---
>  drivers/block/xen-blkback/blkback.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
>=20
> diff --git a/drivers/block/xen-blkback/blkback.c=20
> b/drivers/block/xen-blkback/blkback.c
> index 184b133..3da9a40 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -707,7 +707,7 @@ static int dispatch_rw_block_io(struct xen_blkif =
*blkif,
>  	 * the hypercall to unmap the grants - that is all done in
>  	 * xen_blkbk_unmap.
>  	 */
> -	if (operation !=3D BLKIF_OP_DISCARD &&
> +	if (operation !=3D REQ_DISCARD &&

Why is that check necessary in the first place? xen_blkbk_map() doesn't
do any harm when req->nr_segments is zero (as could also be the case
on WRITE_FLUSH ones).

Jan

>  			xen_blkbk_map(req, pending_req, seg))
>  		goto fail_flush;
> =20





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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 00:33:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 00: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 1RDWqd-0007LO-Bv; Tue, 11 Oct 2011 00:33:59 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDWq6-00079d-IS
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 00:33:26 -0700
X-Env-Sender: lidongyang@novell.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1318318383!62392462!1
X-Originating-IP: [137.65.250.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3638 invoked from network); 11 Oct 2011 07:33:05 -0000
Received: from victor.provo.novell.com (HELO victor.provo.novell.com)
	(137.65.250.26)
	by server-8.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Oct 2011 07:33:05 -0000
Received: from mail-ey0-f171.google.com (prv-ext-foundry1int.gns.novell.com
	[137.65.251.240])
	by victor.provo.novell.com with ESMTP (TLS encrypted);
	Tue, 11 Oct 2011 01:33:14 -0600
Received: by eyb6 with SMTP id 6so4484409eyb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 00:33:11 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.223.77.69 with SMTP id f5mr37911573fak.3.1318318391316; Tue,
	11 Oct 2011 00:33:11 -0700 (PDT)
Received: by 10.152.6.65 with HTTP; Tue, 11 Oct 2011 00:33:11 -0700 (PDT)
In-Reply-To: <4E940B99020000780005AA12@victor.provo.novell.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-3-git-send-email-konrad.wilk@oracle.com>
	<4E940B99020000780005AA12@victor.provo.novell.com>
Date: Tue, 11 Oct 2011 15:33:11 +0800
Message-ID: <CAKH3R4-HJZBE-yWk=Dwkuwy13z1vdUrgEoJ9zFhTJgXgYfHHfA@mail.gmail.com>
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: hch@infradead.org, Dong Yang Li <lidongyang@suse.com>,
	xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH 2/3] xen/blkback: Fix the inhibition to map
 pages when discarding sector ranges.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, Oct 11, 2011 at 3:25 PM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 10.10.11 at 17:28, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> w=
rote:
>> The 'operation' parameters are the ones provided to the bio layer while
>> the req->operation are the ones passed in between the backend and
>> frontend. We used the wrong 'operation' value to squash the
>> call to map pages when processing the discard operation resulting
>> in mapping the pages unnecessarily.
>>
>> CC: Li Dongyang <lidongyang@novell.com>
>> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>> ---
>> =A0drivers/block/xen-blkback/blkback.c | =A0 =A02 +-
>> =A01 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/block/xen-blkback/blkback.c
>> b/drivers/block/xen-blkback/blkback.c
>> index 184b133..3da9a40 100644
>> --- a/drivers/block/xen-blkback/blkback.c
>> +++ b/drivers/block/xen-blkback/blkback.c
>> @@ -707,7 +707,7 @@ static int dispatch_rw_block_io(struct xen_blkif *bl=
kif,
>> =A0 =A0 =A0 =A0* the hypercall to unmap the grants - that is all done in
>> =A0 =A0 =A0 =A0* xen_blkbk_unmap.
>> =A0 =A0 =A0 =A0*/
>> - =A0 =A0 if (operation !=3D BLKIF_OP_DISCARD &&
>> + =A0 =A0 if (operation !=3D REQ_DISCARD &&
>
> Why is that check necessary in the first place? xen_blkbk_map() doesn't
> do any harm when req->nr_segments is zero (as could also be the case
> on WRITE_FLUSH ones).
>
Ah, you are right, we could remove this check then, Thanks
> Jan
>
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 xen_blkbk_map(req, pending_r=
eq, seg))
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto fail_flush;
>>
>
>
>
>

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 00:37:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 00:37:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDWtd-0007kj-O4; Tue, 11 Oct 2011 00:37:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDWtD-0007YU-Jw
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 00:36:39 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318318596!34768994!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22235 invoked from network); 11 Oct 2011 07:36:36 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-13.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Oct 2011 07:36:36 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 08:36:35 +0100
Message-Id: <4E940E21020000780005AA29@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 08:36:33 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance
	discard support with secure erasing support.
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
In-Reply-To: <20111010195749.GA5755@phenom.oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "hch@infradead.org" <hch@infradead.org>, Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@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.10.11 at 21:57, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> =
wrote:
> On Mon, Oct 10, 2011 at 08:20:02PM +0100, Ian Campbell wrote:
>> On Mon, 2011-10-10 at 17:42 +0100, Konrad Rzeszutek Wilk wrote:
>> > On Mon, Oct 10, 2011 at 05:13:07PM +0100, Ian Campbell wrote:
>>=20
>> > > In any case it should also be posted against the canonical =
inter-guest
>> > > interface definition in the xen tree for review with that in mind.
>> >=20
>> > Yes! But I was thinking to first let this one rattle a bit and see =
what
>> > folks thought about it before submitting the xen-devel.
>>=20
>> It's a good idea to get ABI changes out for review before the
>> implementation rattles around so much that changing it becomes hard.
>=20
> OK, lets drop this until we get that straigthen out. I've posted
> http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00642.html =
the=20
> changes to
> Xen ABI.

Yeah, but that didn't get adjusted after IanC's comments (structure
alignment, BLKIF_OP_DISCARD_FLAG_SECURE value).

Further I wonder why you don't use the "reserved" field instead of
extending the structure at the end.

Jan


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 00:50:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 00:50:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDX6d-00007Z-7G; Tue, 11 Oct 2011 00:50:31 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDX60-0008MH-Qf
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 00:49:53 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318319371!46095400!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22474 invoked from network); 11 Oct 2011 07:49:31 -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;
	11 Oct 2011 07:49:31 -0000
X-IronPort-AV: E=Sophos;i="4.68,522,1312156800"; 
   d="scan'208";a="8318009"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Oct 2011 07:49: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;
	Tue, 11 Oct 2011 08:49:49 +0100
Subject: Re: [Xen-devel] Fwd: xentop reporting zero written sectors
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Tue, 11 Oct 2011 08:49:44 +0100
In-Reply-To: <20111010163129.GF28646@phenom.oracle.com>
References: <CAE1-PRdq9BWjTTHPPBPvESr-ULcdjHgPMTABcCO6+wCLJ1UYog@mail.gmail.com>
	<CAE1-PReA8E-kSif=BU=s-vzOqi-4F4LotxqofH7EEw+dYLtpUA@mail.gmail.com>
	<20111010163129.GF28646@phenom.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: <1318319389.21903.476.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Andy Burns <xen.lists@burns.me.uk>,
	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 Mon, 2011-10-10 at 17:31 +0100, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 10, 2011 at 04:16:04PM +0100, Andy Burns wrote:
> > No response in xen-users, asking developers ....
> > 
> > ---------- Forwarded message ----------
> > 
> > Just moving a chunk of files from one filesysstem on xvba to another
> > on xvdb, and was monitoring with xentop as it was taking longer than
> > expected.
> > 
> > The VBD_RD  and VBD_WR counters were both clocking-up as expected, as
> > was the VBD_RSECT counter, but the VBD_WSECT counter was stuck on
> > zero, I toggled on the individual VBD device counters and these showed
> > the same (with the RD and WR counters correctly split between my
> > source and destination disks)
> 
> Huh. Imagine that!
> > 
> > Is this a long standing "feature" that I've never noticed before or a
> > problem that should be reported?
> 
> Must be a feature. We would never write code with bugs. Never :-)
> 
> I think this new "feature" below will fix it for you:
> 
> 
> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> index 0bd7143..3e2ca68 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -778,7 +778,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
>  
>  	if (operation == READ)
>  		blkif->st_rd_sect += preq.nr_sects;
> -	else if (operation == WRITE || operation == WRITE_FLUSH)
> +	else if (operation == WRITE_ODIRECT || operation == WRITE_FLUSH)

Would it be sane to key this off req->operation and BLKIF_OP_* instead
of first encoding them as block layer operations and then decoding back
again? The use of operation here just seems to be adding a layer of
indirection which we don't want or need.

Or maybe (operation & WRITE) instead of == ?

Ian.

>  		blkif->st_wr_sect += preq.nr_sects;
>  
>  	return 0;
> 
> 
> Thanks for reporting it!
> 
> _______________________________________________
> 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 Oct 11 01:05:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 01:05:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDXLD-0000p5-QS; Tue, 11 Oct 2011 01:05:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDXIt-0000bG-J1
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 01:03:20 -0700
X-Env-Sender: ijc@hellion.org.uk
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318320187!486380!1
X-Originating-IP: [80.68.92.230]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14466 invoked from network); 11 Oct 2011 08:03:08 -0000
Received: from aaar.vm.bytemark.co.uk (HELO aaar.vm.bytemark.co.uk)
	(80.68.92.230) by server-4.tower-216.messagelabs.com with SMTP;
	11 Oct 2011 08:03:08 -0000
Received: from localhost (unknown [127.0.0.1])
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id 3AED013C765;
	Tue, 11 Oct 2011 08:03:04 +0000 (UTC)
Received: from aaar.vm.bytemark.co.uk ([127.0.0.1])
	by localhost (aaar.vm.bytemark.co.uk [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id WjmC5oNNRpPq; Tue, 11 Oct 2011 09:03:01 +0100 (BST)
Received: from hopkins.hellion.org.uk
	(cpc2-cmbg14-2-0-cust125.5-4.cable.virginmedia.com [86.26.0.126])
	(using TLSv1 with cipher AES256-SHA (256/256 bits))
	(No client certificate requested)
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id 3219A13A76D;
	Tue, 11 Oct 2011 09:03:01 +0100 (BST)
Received: from firewall.ctxuk.citrix.com ([62.200.22.2] helo=[10.80.2.42])
	by hopkins.hellion.org.uk with esmtpsa (SSL3.0:RSA_AES_256_CBC_SHA1:32)
	(Exim 4.72) (envelope-from <ijc@hellion.org.uk>)
	id 1RDXIc-0008QJ-Lg; Tue, 11 Oct 2011 09:03:00 +0100
From: Ian Campbell <ijc@hellion.org.uk>
To: Jan Beulich <JBeulich@suse.com>
Date: Tue, 11 Oct 2011 09:02:48 +0100
In-Reply-To: <4E940744020000780005A9F9@nat28.tlf.novell.com>
References: <1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
	<CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
	<1317460798.11991.2.camel@dagon.hellion.org.uk>
	<CA+rvmv+yU0=nEuvLSqkE44RFqeaQw504MkD-sxjXV3D3nkme_g@mail.gmail.com>
	<20111003184722.GB15608@phenom.oracle.com>
	<1317667984.11991.6.camel@dagon.hellion.org.uk>
	<CA+rvmvJ_i4Ta+GV5PQ0U7+2yPxT2oJXtnE_fq0j8Faa7GcUxqw@mail.gmail.com>
	<20111010164920.GA30351@phenom.oracle.com>
	<4E940744020000780005A9F9@nat28.tlf.novell.com>
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318320174.21903.485.camel@zakaz.uk.xensource.com>
Mime-Version: 1.0
X-SA-Exim-Connect-IP: 62.200.22.2
X-SA-Exim-Mail-From: ijc@hellion.org.uk
Subject: Re: [Xen-devel] Re: BUG: unable to handle kernel paging	request at
	ffff8803bb6ad000
X-SA-Exim-Version: 4.2.1 (built Mon, 22 Mar 2010 06:51:10 +0000)
X-SA-Exim-Scanned: Yes (on hopkins.hellion.org.uk)
Cc: xen-devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	rush <rush1503@gmail.com>, Jonathan Nieder <jrnieder@gmail.com>,
	"642154@bugs.debian.org" <642154@bugs.debian.org>,
	Ben Hutchings <ben@decadent.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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-10-11 at 08:07 +0100, Jan Beulich wrote:
> >>> On 10.10.11 at 18:49, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> > On Sat, Oct 08, 2011 at 10:13:14AM +0400, rush wrote:
> >> OK, I tried it again, but Oops didn't gone.
> > .. snip..
> >>         echo    'Loading Xen 4.0-amd64 ...'
> >>         multiboot       /boot/xen-4.0-amd64.gz placeholder xsave=0
> > .. snip..
> >> Was it right?
> > 
> > Yup. I think.. this is a bit embarrassing. It took a bit of time for Intel
> > folks to get the xsave part right and I remember seeing this error about a
> > year ago with xsave on a Dell Optiplex 780. Hence I wonder if the fixes that
> > ultimately went in 4.1.1 did not get ported over to 4.0 and you are just
> > hitting that.
> > 
> > Can I ask you to do one more thing? Can you upgrade to the xen-4.1.1 in
> > the testing and try with the xsave (or without) and see if it works?
> > 
> > <holds his fingers hoping it is the xsave feature>
> 
> Are both of you certain this isn't the problem of the kernel only
> looking at the xsaveopt feature flag (implying that this means
> xsave is also available)? I found it necessary to force-clear that
> flag in the kernel when OSXSAVE is not set (by calling
> x86_xsave_setup() when !cpu_has_xsave, which in turn was
> modified to look at X86_FEATURE_OSXSAVE rather than
> X86_FEATURE_XSAVE under Xen - all of which I'm afraid would
> need to be done differently in pv-ops).

That all sounds familiar... In mainline we have (in
xen_init_cpuid_mask):

	...
        xsave_mask =
                (1 << (X86_FEATURE_XSAVE % 32)) |
                (1 << (X86_FEATURE_OSXSAVE % 32));

        /* Xen will set CR4.OSXSAVE if supported and not disabled by force */
        if ((cx & xsave_mask) != xsave_mask)
                cpuid_leaf1_ecx_mask &= ~xsave_mask; /* disable XSAVE & OSXSAVE */

Which I think implements something similar to what you describe? IOW
unless both XSAVE and OSXSAVE are available both are forcibly disabled.

While grepping I noticed that the kernel command line parameter to
disable xsave appears to be "noxsave" rather than "xsave=0", Rush is
that something you could try? (GRUB_CMDLINE_LINUX is the place to add
it)

Ian.

> If it is, the problem could be worked around by *en*abling xsave
> in Xen (which is off by default prior to 4.2), assuming none of the
> incomplete functionality would cause other headaches.
> 
> But yes, the CPUID handling code in 4.1.1 should properly hide
> XSAVEOPT when XSAVE is disabled, so just using this version
> ought to also get things going.
> 
> Jan
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

-- 
Ian Campbell
Current Noise: Zyklon - Hammer Revelation

The ultimate game show will be the one where somebody gets killed at the end.
		-- Chuck Barris, creator of "The Gong Show"


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 01:10:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 01:10:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDXPq-0001Gh-R2; Tue, 11 Oct 2011 01:10:22 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDXP9-00013o-Is
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 01:09:40 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1318320552!39394282!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16625 invoked from network); 11 Oct 2011 08:09:12 -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;
	11 Oct 2011 08:09:12 -0000
X-IronPort-AV: E=Sophos;i="4.68,522,1312156800"; 
   d="scan'208";a="8318635"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Oct 2011 08:09: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, 11 Oct 2011 09:09:36 +0100
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance	 discard
	support with secure erasing support.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Tue, 11 Oct 2011 09:09:35 +0100
In-Reply-To: <4E940E21020000780005AA29@nat28.tlf.novell.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
	<4E940E21020000780005AA29@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: <1318320575.21903.490.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "hch@infradead.org" <hch@infradead.org>, Dong Yang Li <lidongyang@suse.com>,
	"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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-10-11 at 08:36 +0100, Jan Beulich wrote:
> >>> On 10.10.11 at 21:57, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> > On Mon, Oct 10, 2011 at 08:20:02PM +0100, Ian Campbell wrote:
> >> On Mon, 2011-10-10 at 17:42 +0100, Konrad Rzeszutek Wilk wrote:
> >> > On Mon, Oct 10, 2011 at 05:13:07PM +0100, Ian Campbell wrote:
> >> 
> >> > > In any case it should also be posted against the canonical inter-guest
> >> > > interface definition in the xen tree for review with that in mind.
> >> > 
> >> > Yes! But I was thinking to first let this one rattle a bit and see what
> >> > folks thought about it before submitting the xen-devel.
> >> 
> >> It's a good idea to get ABI changes out for review before the
> >> implementation rattles around so much that changing it becomes hard.
> > 
> > OK, lets drop this until we get that straigthen out. I've posted
> > http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00642.html the 
> > changes to
> > Xen ABI.
> 
> Yeah, but that didn't get adjusted after IanC's comments (structure
> alignment, BLKIF_OP_DISCARD_FLAG_SECURE value).
> 
> Further I wonder why you don't use the "reserved" field instead of
> extending the structure at the end.

I hadn't noticed that field, yes using that would be preferable since it
retains ABI compatibility.

> 
> Jan
> 



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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 01:12:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 01:12:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDXSM-0001fC-8p; Tue, 11 Oct 2011 01:12:58 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDXRs-0001Sv-Pm
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 01:12:29 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-11.tower-21.messagelabs.com!1318320726!46018167!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6556 invoked from network); 11 Oct 2011 08:12:06 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Oct 2011 08:12:06 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RDXRm-000N6j-V6; Tue, 11 Oct 2011 08:12:23 +0000
Date: Tue, 11 Oct 2011 09:12:21 +0100
From: Tim Deegan <tim@xen.org>
To: AP <apxeng@gmail.com>
Subject: Re: [Xen-devel] nested xen on domU?
Message-ID: <20111011081221.GA88076@ocelot.phlegethon.org>
References: <3DDB718A-0E09-486A-810D-05DF7D790C22@gmail.com>
	<CAGU+autfuFcgxCOSxyEPOtJ6ZQjnqb6nfbZzzJoUGZnbxONXmw@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAGU+autfuFcgxCOSxyEPOtJ6ZQjnqb6nfbZzzJoUGZnbxONXmw@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Cc: xen-devel@lists.xensource.com, Eddie Dong <eddie.dong@intel.com>,
	Jun Nakajima <jun.nakajima@intel.com>, Hyo J Lee <hyo747@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

At 14:35 -0700 on 10 Oct (1318257332), AP wrote:
> On Oct 9, 2011 9:11 AM, "Hyo J Lee" <hyo747@gmail.com> wrote:
> >
> > Hi all
> >
> > I wonder if there's any way that I can do nested xen on domU not dom0.
> > This is what I plan.
> >
> >             | dom0_T| |domU1_T| |domU2_T|
> >             ----------------------------- (domU1_B)
> > |dom0_B|    |       xen top             |
> > -----------------------------------------
> > |             xen bottom                |
> >
> 
> I tried this recently on an Intel platform and was unable to bring up
> DomU1_T. The bios screen wouldn't come up. Do let me know if you have better
> luck.

ISTR that the last time I tried it I ended up using KVM as the nested
hypervisor (for other reasons).

Cc'ing the author and maintainer of the Intel nested-HVM code.

Eddie, can you help please?  Is this meant to work?

Tim.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 01:16:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 01:16:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDXVk-00024j-R4; Tue, 11 Oct 2011 01:16:28 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDXVI-0001sQ-VV
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 01:16:01 -0700
X-Env-Sender: jinsong.liu@intel.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1318320956!16765392!1
X-Originating-IP: [192.55.52.93]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1023 invoked from network); 11 Oct 2011 08:15:57 -0000
Received: from mga11.intel.com (HELO mga11.intel.com) (192.55.52.93)
	by server-7.tower-182.messagelabs.com with SMTP;
	11 Oct 2011 08:15:57 -0000
Received: from fmsmga002.fm.intel.com ([10.253.24.26])
	by fmsmga102.fm.intel.com with ESMTP; 11 Oct 2011 01:15:56 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,522,1312182000"; d="scan'208";a="76855972"
Received: from pgsmsx601.gar.corp.intel.com ([10.221.43.69])
	by fmsmga002.fm.intel.com with ESMTP; 11 Oct 2011 01:15:55 -0700
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; Tue, 11 Oct 2011 16:15:26 +0800
Received: from shsmsx601.ccr.corp.intel.com (10.239.4.112) by
	PGSMSX104.gar.corp.intel.com (10.221.44.91) with Microsoft SMTP Server
	(TLS) id 14.1.323.3; Tue, 11 Oct 2011 16:15:25 +0800
Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by
	shsmsx601.ccr.corp.intel.com ([10.239.4.112]) with mapi;
	Tue, 11 Oct 2011 16:15:23 +0800
From: "Liu, Jinsong" <jinsong.liu@intel.com>
To: Jan Beulich <JBeulich@suse.com>, "Jiang, Yunhong" <yunhong.jiang@intel.com>
Date: Tue, 11 Oct 2011 16:15:30 +0800
Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Topic: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Index: AcyHI2PJ7bYhqi7WRyGL80xsVTeSvAAsi7NQ
Message-ID: <BC00F5384FCFC9499AF06F92E8B78A9E2693B8F9FB@shsmsx502.ccr.corp.intel.com>
References: <BC00F5384FCFC9499AF06F92E8B78A9E263B557B77@shsmsx502.ccr.corp.intel.com>
	<4E84ADF70200007800058882@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D2366A9B@shsmsx501.ccr.corp.intel.com>
	<4E858AF30200007800058A64@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D23D3B7D@shsmsx501.ccr.corp.intel.com>
	<4E92C369020000780005A68B@nat28.tlf.novell.com>
In-Reply-To: <4E92C369020000780005A68B@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: "keir.xen@gmail.com" <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

Jan Beulich wrote:
>>>> On 08.10.11 at 10:29, "Jiang, Yunhong" <yunhong.jiang@intel.com>
>>>> wrote:=20
>=20
>>=20
>>> -----Original Message-----
>>> From: Jan Beulich [mailto:JBeulich@suse.com]
>>> Sent: Friday, September 30, 2011 3:25 PM
>>> To: Liu, Jinsong; Jiang, Yunhong
>>> Cc: keir.xen@gmail.com; xen-devel@lists.xensource.com
>>> Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
>>>=20
>>>>>> On 30.09.11 at 04:51, "Jiang, Yunhong" <yunhong.jiang@intel.com>
>>>>>> wrote:=20
>>>=20
>>>>=20
>>>>> -----Original Message-----
>>>>> From: Jan Beulich [mailto:JBeulich@suse.com]
>>>>> This made me look at the current source, and there I see in
>>>>> mce_urgent_action()=20
>>>>>=20
>>>>>     if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))     =20
>>>>> return -1;=20
>>>>>=20
>>>>> which I think should say ... _EIPV and use || instead. Thoughts?
>>>>=20
>>>> I think this code means, if the error happens in hypervisor mode
>>>> (i.e. !guest_mode()), and RIPV indicate the RIP in stack can't be
>>>> restarted, we have to panic.
>>>=20
>>> Then the guest_mode() check still lacks an extra check of EIPV, like
>>>=20
>>>      if ( !(gstatus & MCG_STATUS_RIPV) &&
>>>           (!(gstatus & MCG_STATUS_EIPV) || !guest_mode(regs)))    =20
>>> return -1;=20
>>>=20
>>=20
>> The RIPV is not related to the EIPV. RIPV means the context saved in
>> the stack can't be restarted anymore. According to the SDM, RIPV
>> means "execution can be restarted reliably at the instruction
>> pointed to by the instruction pointer pushed on the stack". It's not
>> about error happened synchronously or asynchronously. The point is,
>> if the program is running in hypervisor context, and RIPV tells us
>> that the program can't be restarted, we can't do anything but panic,
>> because we can't switch context while we are in xen. So this code
>> have nothing to do with EIPV.=20
>=20
> I continue to disagree (including the statement in your other
> response): RIPV only tells us whether we can resume, not in which
> context the error occurred. EIPV tells us whether, by looking at the
> saved registers, we can determine the context that the error occurred
> in. Since with !RIPV=20
> we have to determine in what context the error occurred in order to
> decide whether to panic or just kill a guest, we can't ignore EIPV
> (and if it's not set we have to assume the worst case, since even if
> the registers indicate guest mode the error may have occurred in
> hypervisor context or accessing hypervisor structures [consider e.g. a
> data load error during a GDT access]).
>=20
> Jan

Yes, I agree EIPV=3D0 may indicate async error, but I think your solution *=
overkilled* most cases (i.e. the real guest instruction fetch error).

Our idea is,
  * xen mce would flush prefetched instruction so we can delay handle it un=
til if real need;
  * a h/w error will not disappear, but if it was not being *consumed*, it'=
s OK for system keep going (like SRAO error which do not need s/w handle im=
mediately);

Suppose an async instruction fetch error (RIVP=3DEIVP=3D0), triggered at gu=
est context but instruction prefetch hypervisor context. The scenario is,
  * at xen mce, the prefetched instruction has been flushed. xen mce handle=
r needn't panic, instead it mark the page as broken page, then trigger vmce=
 to guest;
  * guest may kill app, kernel thread, guest itself, or whatever;

The error is still an error, w/ 2 possibilities in the future:
  1. it may not be consumed as an SRAR error, system keep going, h/w mechan=
ism may detect a SRAO error (i.e. memroy scrub) at some time point and hand=
led then;
  2. it may be consumed at some time point and a SRAR error triggered again=
. At this time,
   1). if srar occurred at hypervisor context, xen will panic. or,=20
   2). if srar occurred at guest context, xen kill the guest as a malicious=
 one (as what the 2nd patch do), and move the page to broken page list;

Considering the rare possibility of the above case, I think it's acceptable=
 to handle it in this way.
Thoughts?

Thanks,
Jinsong=

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 01:19:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 01:19:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDXYQ-0002Tk-Aw; Tue, 11 Oct 2011 01:19:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDXXm-0002HQ-OQ
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 01:18:35 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318321100!41098646!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18681 invoked from network); 11 Oct 2011 08:18:21 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Oct 2011 08:18:21 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RDXXi-000N8h-4v; Tue, 11 Oct 2011 08:18:30 +0000
Date: Tue, 11 Oct 2011 09:18:29 +0100
From: Tim Deegan <tim@xen.org>
To: cc Luit <universalbillow@gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulation() in page_fault
Message-ID: <20111011081829.GB88076@ocelot.phlegethon.org>
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

At 09:39 +0800 on 11 Oct (1318325957), cc Luit wrote:
> Hi, everyone, I have a question,
> in the shadow_page_fault or ept mechanism, xen will use the x86_emulation
> for some instructions, I'm wondering why it must use it, if after we fix the
> SPT or EPT table, just VMEntry to HVM to re-excute this instruction  but not
> emulate in xen, is there some problems?

In the shadow pagetable code, we keep the shadows up-to-date by:
 1 - making all shadowed pagetables read-only;
 2 - intercepting the page faults when the guest writes to them; and
 3 - updating the guest pagetable and the shadow at the same time, 
     with whatever change the guest was making. 

For step 3 we need to emulate the instruction that caused the pagefault
so that we can tell what was being written. 

There are other reasons for the emulator to be called (emulating MMIO
instructions, emulating real-mode &c) but that's why the shadow
pagetable code uses it. 

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 Oct 11 01:26:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 01:26:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDXfs-0002xl-9y; Tue, 11 Oct 2011 01:26:57 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDXfN-0002m1-3l
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 01:26:25 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-13.tower-182.messagelabs.com!1318321581!21636970!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24494 invoked from network); 11 Oct 2011 08:26:22 -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; 11 Oct 2011 08:26:22 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RDXfH-000NCB-Nr; Tue, 11 Oct 2011 08:26:19 +0000
Date: Tue, 11 Oct 2011 09:26:18 +0100
From: Tim Deegan <tim@xen.org>
To: Balbir Singh <bsingharora@gmail.com>
Subject: Re: [Xen-devel] Trap flags, debug and emulation - xen 4.1.1
Message-ID: <20111011082618.GC88076@ocelot.phlegethon.org>
References: <CAKTCnzkyYASOH_gaf+4pQoGqM4q=1r=mfLHcoP-5oy59yyHbXw@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAKTCnzkyYASOH_gaf+4pQoGqM4q=1r=mfLHcoP-5oy59yyHbXw@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

Hi, 

At 08:39 +0530 on 11 Oct (1318322368), Balbir Singh wrote:
>  I am doing something very similar. I do get the fault and I can set
>  the trap, but I don't see any form of single stepping take place as I
>  do not get the TRAP_debug exception back. My exception_bitmap has
>  TRAP_no_device, TRAP_page_fault, TRAP_debug and TRAP_int3 set.
> 
>  I've tried debugging the issue with xentrace and printks, but sadly I
>  could not track down the issue. The CPU does have
>  cpu_has_monitor_trap_flag set to true.
> 
>  Could anyone give me clues on how to track down why I did not get a
>  TRAP_debug exception via a VMEXIT?

It sounds like you're doing the right thing - just a question of looking
for the bug. :)  I would try checking for the TF flag as close as
possible to the vmenter (maybe even in the assembly - you could call out
to a special C function if it's set), and for the debug vmexit right at the
top of the vmexit handler to make sure that some other clever debugging
code isn't consuming it.   Probably also worth double-chjecking that
nothing else ois overwriting the exception bitmap before the vmenter. 

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 Oct 11 01:33:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 01:33:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDXly-0003ZG-ED; Tue, 11 Oct 2011 01:33:14 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDXlK-0003FP-VY
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 01:32:35 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1318321951!21638152!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15513 invoked from network); 11 Oct 2011 08:32:31 -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;
	11 Oct 2011 08:32:31 -0000
X-IronPort-AV: E=Sophos;i="4.68,522,1312156800"; 
   d="scan'208";a="8319223"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Oct 2011 08:32: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;
	Tue, 11 Oct 2011 09:32:12 +0100
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andy Burns <xen.lists@burns.me.uk>
Date: Tue, 11 Oct 2011 09:32:11 +0100
In-Reply-To: <CAE1-PRcQxQ4vmOn5zYLRCXLPLqoMqO+CKNJVrpnJ3QX3bd+OyA@mail.gmail.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRcQxQ4vmOn5zYLRCXLPLqoMqO+CKNJVrpnJ3QX3bd+OyA@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: <1318321932.21903.496.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 Mon, 2011-10-10 at 23:02 +0100, Andy Burns wrote:
> [Resent from subscribed address]
> 
> Recently had passthrough of 2xPCI DVB-T cards and 1xPCIe DVB-S2 card working,
> the last know config that was *certainly* working was
> 
> dom0
> xen-4.1.1-3.fc16.x86_64
> kernel-3.1.0-0.rc7.git0.0.fc16.x86_64
> 
> domU
> kernel-3.1.0-0.rc8.git0.0.fc16.x86_64
> 
> Since then I've updated
> 
> xen-4.1.1-6.fc16.x86_64 on dom0
> 
> kernel-3.1.0-0.rc9.git0.0.fc16.x86_64 on dom0 and domU
> 
> and updated all other packages to current F16 updates-testing,
> also lots of fiddling with grub2 and systemd on the domU
> 
> Only today did I realise that only the PCIe card is now working, not
> the PCI ones, and have since spent several hours trying to get back to
> a working configuration :-(
> 
> I've rolled my xen packages back from 4.1.1-6 to 4.1.1-3
> tried booting various combinations of 3.1.0-rc7/rc8/rc9 as dom0 and domU
> 
> made sure I still have "pci=resource_alignment" for all the relevant
> PCI devices on the dom0
> made sure I still have "iommu=soft" on the domU
> made sure pci-back is happy with "xm pci-list-assignable-devices"
> made sure devices really have been assigned with "xm pci-list mythf16"
> made sure the devices and drivers show in the domU with "lspci",
> "lsusb" and "lsmod"
> checked "xm dmesg" on dom0 and "dmesg" on dom0 and domU that drivers
> see the hardware and load firmware OK
> scandvb goes through the motions of tuning, but finds no stations,
> this  *feels* as though the issue is lack of DMA transfers.
> 
> How can I tell if the iommu=soft is taking effect?
> Anything stupid I sound like I've forgotten?

It looks as if you have been pretty thorough. 

One thing which is not clear is if you also downgraded all the Xen
utilities/tools packages when you say "Xen packages" or just the
hypervisor itself. (You probably downgraded everything, but I have to
ask).

Does Fedora (yum?) log which packages which it is upgrading? Is it
possible that e.g. scandvb or the firmware package has also been
upgraded (I admit this is slightly straw-clutching).

If you don't passthrough a device are you able to drive it from dom0?

It would probably be useful to post full dmesg output for hypervisor and
both kernels.

Ian.



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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 01:37:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 01:37:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDXqM-00045s-8X; Tue, 11 Oct 2011 01:37:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDXpl-0003u0-3f
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 01:37:09 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318322198!52293688!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13240 invoked from network); 11 Oct 2011 08:36:38 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Oct 2011 08:36:38 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 09:37:05 +0100
Message-Id: <4E941C48020000780005AA80@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 09:36:56 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Ian Campbell" <ijc@hellion.org.uk>
Subject: Re: [Xen-devel] Re: BUG: unable to handle kernel
	paging	request at ffff8803bb6ad000
References: <1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
	<CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
	<1317460798.11991.2.camel@dagon.hellion.org.uk>
	<CA+rvmv+yU0=nEuvLSqkE44RFqeaQw504MkD-sxjXV3D3nkme_g@mail.gmail.com>
	<20111003184722.GB15608@phenom.oracle.com>
	<1317667984.11991.6.camel@dagon.hellion.org.uk>
	<CA+rvmvJ_i4Ta+GV5PQ0U7+2yPxT2oJXtnE_fq0j8Faa7GcUxqw@mail.gmail.com>
	<20111010164920.GA30351@phenom.oracle.com>
	<4E940744020000780005A9F9@nat28.tlf.novell.com>
	<1318320174.21903.485.camel@zakaz.uk.xensource.com>
In-Reply-To: <1318320174.21903.485.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 <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	rush <rush1503@gmail.com>, Jonathan Nieder <jrnieder@gmail.com>,
	"642154@bugs.debian.org" <642154@bugs.debian.org>,
	Ben Hutchings <ben@decadent.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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 11.10.11 at 10:02, Ian Campbell <ijc@hellion.org.uk> wrote:
> On Tue, 2011-10-11 at 08:07 +0100, Jan Beulich wrote:
>> >>> On 10.10.11 at 18:49, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>=
 wrote:
>> > On Sat, Oct 08, 2011 at 10:13:14AM +0400, rush wrote:
>> >> OK, I tried it again, but Oops didn't gone.
>> > .. snip..
>> >>         echo    'Loading Xen 4.0-amd64 ...'
>> >>         multiboot       /boot/xen-4.0-amd64.gz placeholder xsave=3D0
>> > .. snip..
>> >> Was it right?
>> >=20
>> > Yup. I think.. this is a bit embarrassing. It took a bit of time for =
Intel
>> > folks to get the xsave part right and I remember seeing this error =
about a
>> > year ago with xsave on a Dell Optiplex 780. Hence I wonder if the =
fixes=20
> that
>> > ultimately went in 4.1.1 did not get ported over to 4.0 and you are =
just
>> > hitting that.
>> >=20
>> > Can I ask you to do one more thing? Can you upgrade to the xen-4.1.1 =
in
>> > the testing and try with the xsave (or without) and see if it works?
>> >=20
>> > <holds his fingers hoping it is the xsave feature>
>>=20
>> Are both of you certain this isn't the problem of the kernel only
>> looking at the xsaveopt feature flag (implying that this means
>> xsave is also available)? I found it necessary to force-clear that
>> flag in the kernel when OSXSAVE is not set (by calling
>> x86_xsave_setup() when !cpu_has_xsave, which in turn was
>> modified to look at X86_FEATURE_OSXSAVE rather than
>> X86_FEATURE_XSAVE under Xen - all of which I'm afraid would
>> need to be done differently in pv-ops).
>=20
> That all sounds familiar... In mainline we have (in
> xen_init_cpuid_mask):
>=20
> 	...
>         xsave_mask =3D
>                 (1 << (X86_FEATURE_XSAVE % 32)) |
>                 (1 << (X86_FEATURE_OSXSAVE % 32));
>=20
>         /* Xen will set CR4.OSXSAVE if supported and not disabled by =
force=20
> */
>         if ((cx & xsave_mask) !=3D xsave_mask)
>                 cpuid_leaf1_ecx_mask &=3D ~xsave_mask; /* disable XSAVE =
&=20
> OSXSAVE */
>=20
> Which I think implements something similar to what you describe? IOW
> unless both XSAVE and OSXSAVE are available both are forcibly disabled.

Apart from the need to disable XSAVEOPT, yes.

> While grepping I noticed that the kernel command line parameter to
> disable xsave appears to be "noxsave" rather than "xsave=3D0", Rush is
> that something you could try? (GRUB_CMDLINE_LINUX is the place to add
> it)

Or "noxsaveopt" (if that's the problem, i.e. Rush's CPUs have that
capability).

Jan

> Ian.
>=20
>> If it is, the problem could be worked around by *en*abling xsave
>> in Xen (which is off by default prior to 4.2), assuming none of the
>> incomplete functionality would cause other headaches.
>>=20
>> But yes, the CPUID handling code in 4.1.1 should properly hide
>> XSAVEOPT when XSAVE is disabled, so just using this version
>> ought to also get things going.
>>=20
>> Jan
>>=20
>>=20
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com=20
>> http://lists.xensource.com/xen-devel=20
>=20
> --=20
> Ian Campbell
> Current Noise: Zyklon - Hammer Revelation
>=20
> The ultimate game show will be the one where somebody gets killed at =
the=20
> end.
> 		-- Chuck Barris, creator of "The Gong Show"




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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 01:41:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 01:41:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDXte-0004Y6-LI; Tue, 11 Oct 2011 01:41:11 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDXt7-0004Lh-Sy
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 01:40:39 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1318322432!37531332!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4506 invoked from network); 11 Oct 2011 08:40: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;
	11 Oct 2011 08:40:32 -0000
X-IronPort-AV: E=Sophos;i="4.68,522,1312156800"; 
   d="scan'208";a="8319472"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Oct 2011 08:40:34 +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, 11 Oct 2011 09:40:34 +0100
Subject: Re: [Xen-devel] [PATCH 5 of 9] libxl: only use interactive PyGrub
	mode when a console is attached
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Tue, 11 Oct 2011 09:40:34 +0100
In-Reply-To: <CAPLaKK7ZBR9twbU=6nt1RXPh0a5uzw_jBRHMi1V4YLVuTxghqA@mail.gmail.com>
References: <patchbomb.1317386580@loki> <84a27a9f39f29194a734.1317386585@loki>
	<20109.55057.491612.998568@mariner.uk.xensource.com>
	<CAPLaKK5AwPnrvfoPdbc8Ap6pyFqiBuvEWfFUmqSeN_-QR-TZQw@mail.gmail.com>
	<20115.499.220667.547225@mariner.uk.xensource.com>
	<CAPLaKK7ZBR9twbU=6nt1RXPh0a5uzw_jBRHMi1V4YLVuTxghqA@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1318322434.21903.504.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 Mon, 2011-10-10 at 15:51 +0100, Roger Pau MonnÃ© wrote:
> > That sounds unfortunate.  I agree with you.
> 
> Well Ian Campbell proposed to use a timeout in select and drop data
> when the timeout is hit, that what I've implemented in
> 
> libxl: drop bootloader output if xenconsole file descriptor is not
> available for writing
> 
> The patch is quite simple and solves the problem, I don't think it
> interferes with normal boot process, since a 1s timeout is quite high
> for data to be delivered from xenconsoled_fd to the user if the
> console is attached.

The case where a user types
	xl create /a/domain
	xl console adomain

might have a reasonably long delay in it before the console is
connected. Increasing the libxl buffer size would mitigate that but
you'd still have the problem of not reading from an fd if the cons is !=
0.

Can you print out the actual values of the various producers and
consumers at the point of the hang? (maybe track total bytes too for
debug?)

Perhaps where we have:
        if (xenconsoled_prod == xenconsoled_cons)
            xenconsoled_prod = xenconsoled_cons = 0;
        if (bootloader_prod == bootloader_cons)
            bootloader_prod = bootloader_cons = 0;
We could also add some suitable memmoves and associated prod/cons
manipulation, such that the unconsumed data is always pulled to the head
of the buffer. That might be a reasonably simple way to improve things
and allow larger buffers to be used? More often than not the memmove
won't be getting called since either XXX_prod == XXX_cons or XXX_cons is
already 0, IOW having a partially consumed buffer would be unusual?

Once we have a larger buffer which we always try to fill discarding data
after a timeout when the buffer is full won't be so critical.

>  The other option would be to modify xenconsole
> daemon, but I think that's far too complicated for a problem that can
> be solved easily.
> 
> _______________________________________________
> 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 Oct 11 01:43:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 01:43:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDXvp-0004zM-7E; Tue, 11 Oct 2011 01:43:25 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDXvJ-0004mr-AP
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 01:42:53 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1318322569!34759845!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21036 invoked from network); 11 Oct 2011 08:42:50 -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; 11 Oct 2011 08:42:50 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 09:42:49 +0100
Message-Id: <4E941DA6020000780005AA9B@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 09:42:46 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jinsong Liu" <jinsong.liu@intel.com>,
	"Yunhong Jiang" <yunhong.jiang@intel.com>
Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
References: <BC00F5384FCFC9499AF06F92E8B78A9E263B557B77@shsmsx502.ccr.corp.intel.com>
	<4E84ADF70200007800058882@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D2366A9B@shsmsx501.ccr.corp.intel.com>
	<4E858AF30200007800058A64@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D23D3B7D@shsmsx501.ccr.corp.intel.com>
	<4E92C369020000780005A68B@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E2693B8F9FB@shsmsx502.ccr.corp.intel.com>
In-Reply-To: <BC00F5384FCFC9499AF06F92E8B78A9E2693B8F9FB@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: "keir.xen@gmail.com" <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 11.10.11 at 10:15, "Liu, Jinsong" <jinsong.liu@intel.com> wrote:
> Jan Beulich wrote:
>>>>> On 08.10.11 at 10:29, "Jiang, Yunhong" <yunhong.jiang@intel.com>
>>>>> wrote:=20
>>=20
>>>=20
>>>> -----Original Message-----
>>>> From: Jan Beulich [mailto:JBeulich@suse.com]=20
>>>> Sent: Friday, September 30, 2011 3:25 PM
>>>> To: Liu, Jinsong; Jiang, Yunhong
>>>> Cc: keir.xen@gmail.com; xen-devel@lists.xensource.com=20
>>>> Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
>>>>=20
>>>>>>> On 30.09.11 at 04:51, "Jiang, Yunhong" <yunhong.jiang@intel.com>
>>>>>>> wrote:=20
>>>>=20
>>>>>=20
>>>>>> -----Original Message-----
>>>>>> From: Jan Beulich [mailto:JBeulich@suse.com]=20
>>>>>> This made me look at the current source, and there I see in
>>>>>> mce_urgent_action()=20
>>>>>>=20
>>>>>>     if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))     =20
>>>>>> return -1;=20
>>>>>>=20
>>>>>> which I think should say ... _EIPV and use || instead. Thoughts?
>>>>>=20
>>>>> I think this code means, if the error happens in hypervisor mode
>>>>> (i.e. !guest_mode()), and RIPV indicate the RIP in stack can't be
>>>>> restarted, we have to panic.
>>>>=20
>>>> Then the guest_mode() check still lacks an extra check of EIPV, like
>>>>=20
>>>>      if ( !(gstatus & MCG_STATUS_RIPV) &&
>>>>           (!(gstatus & MCG_STATUS_EIPV) || !guest_mode(regs)))    =20
>>>> return -1;=20
>>>>=20
>>>=20
>>> The RIPV is not related to the EIPV. RIPV means the context saved in
>>> the stack can't be restarted anymore. According to the SDM, RIPV
>>> means "execution can be restarted reliably at the instruction
>>> pointed to by the instruction pointer pushed on the stack". It's not
>>> about error happened synchronously or asynchronously. The point is,
>>> if the program is running in hypervisor context, and RIPV tells us
>>> that the program can't be restarted, we can't do anything but panic,
>>> because we can't switch context while we are in xen. So this code
>>> have nothing to do with EIPV.=20
>>=20
>> I continue to disagree (including the statement in your other
>> response): RIPV only tells us whether we can resume, not in which
>> context the error occurred. EIPV tells us whether, by looking at the
>> saved registers, we can determine the context that the error occurred
>> in. Since with !RIPV=20
>> we have to determine in what context the error occurred in order to
>> decide whether to panic or just kill a guest, we can't ignore EIPV
>> (and if it's not set we have to assume the worst case, since even if
>> the registers indicate guest mode the error may have occurred in
>> hypervisor context or accessing hypervisor structures [consider e.g. a
>> data load error during a GDT access]).
>>=20
>> Jan
>=20
> Yes, I agree EIPV=3D0 may indicate async error, but I think your =
solution=20
> *overkilled* most cases (i.e. the real guest instruction fetch error).
>=20
> Our idea is,
>   * xen mce would flush prefetched instruction so we can delay handle =
it=20
> until if real need;
>   * a h/w error will not disappear, but if it was not being *consumed*, =
it's=20
> OK for system keep going (like SRAO error which do not need s/w =
handle=20
> immediately);
>=20
> Suppose an async instruction fetch error (RIVP=3DEIVP=3D0), triggered at =
guest=20
> context but instruction prefetch hypervisor context. The scenario is,
>   * at xen mce, the prefetched instruction has been flushed. xen mce =
handler=20
> needn't panic, instead it mark the page as broken page, then trigger =
vmce to=20
> guest;

If the prefetch was from Xen space (only in guest context), delivering a
vMCE to the guest is pointless (and perhaps confusing to the guest).

>   * guest may kill app, kernel thread, guest itself, or whatever;
>=20
> The error is still an error, w/ 2 possibilities in the future:
>   1. it may not be consumed as an SRAR error, system keep going, h/w=20
> mechanism may detect a SRAO error (i.e. memroy scrub) at some time point =
and=20
> handled then;
>   2. it may be consumed at some time point and a SRAR error triggered =
again.=20
> At this time,
>    1). if srar occurred at hypervisor context, xen will panic. or,=20
>    2). if srar occurred at guest context, xen kill the guest as a =
malicious=20
> one (as what the 2nd patch do), and move the page to broken page list;
>=20
> Considering the rare possibility of the above case, I think it's =
acceptable=20
> to handle it in this way.
> Thoughts?

You're only discussing instruction fetches (which can be discarded), but
you're not covering the other example I gave (GDT access from guest
context - just like this is a ring-0 operations from the paging unit's =
pov,
this ought to be an out-of-context operation from MCE's perspective).

Jan

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 01:44:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 01:44:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDXwo-0005QE-Vy; Tue, 11 Oct 2011 01:44:27 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDXwI-0005Df-E6
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 01:43:54 -0700
X-Env-Sender: ijc@hellion.org.uk
X-Msg-Ref: server-13.tower-21.messagelabs.com!1318322624!52367159!1
X-Originating-IP: [80.68.92.230]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29277 invoked from network); 11 Oct 2011 08:43:44 -0000
Received: from aaar.vm.bytemark.co.uk (HELO aaar.vm.bytemark.co.uk)
	(80.68.92.230) by server-13.tower-21.messagelabs.com with SMTP;
	11 Oct 2011 08:43:44 -0000
Received: from localhost (unknown [127.0.0.1])
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id D7C6013B88F;
	Tue, 11 Oct 2011 08:43:49 +0000 (UTC)
Received: from aaar.vm.bytemark.co.uk ([127.0.0.1])
	by localhost (aaar.vm.bytemark.co.uk [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id ORPJbmbBZiDg; Tue, 11 Oct 2011 09:43:48 +0100 (BST)
Received: from hopkins.hellion.org.uk
	(cpc2-cmbg14-2-0-cust125.5-4.cable.virginmedia.com [86.26.0.126])
	(using TLSv1 with cipher AES256-SHA (256/256 bits))
	(No client certificate requested)
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id 896D213A76D;
	Tue, 11 Oct 2011 09:43:48 +0100 (BST)
Received: from firewall.ctxuk.citrix.com ([62.200.22.2] helo=[10.80.2.42])
	by hopkins.hellion.org.uk with esmtpsa (SSL3.0:RSA_AES_256_CBC_SHA1:32)
	(Exim 4.72) (envelope-from <ijc@hellion.org.uk>)
	id 1RDXw4-000050-BK; Tue, 11 Oct 2011 09:43:46 +0100
From: Ian Campbell <ijc@hellion.org.uk>
To: Jan Beulich <JBeulich@suse.com>
Date: Tue, 11 Oct 2011 09:43:34 +0100
In-Reply-To: <4E941C48020000780005AA80@nat28.tlf.novell.com>
References: <1316524835.4122.8.camel@deadeye>
	<1316526058.3891.65.camel@zakaz.uk.xensource.com>
	<20110922190018.GA16678@phenom.oracle.com>
	<20111001025030.GA5198@elie.sbx02827.chicail.wayport.net>
	<CA+rvmvLkBVseDCKyfbd_mGSCrRUvov5Km_2Uoo6CZPZOG7ybvA@mail.gmail.com>
	<1317460798.11991.2.camel@dagon.hellion.org.uk>
	<CA+rvmv+yU0=nEuvLSqkE44RFqeaQw504MkD-sxjXV3D3nkme_g@mail.gmail.com>
	<20111003184722.GB15608@phenom.oracle.com>
	<1317667984.11991.6.camel@dagon.hellion.org.uk>
	<CA+rvmvJ_i4Ta+GV5PQ0U7+2yPxT2oJXtnE_fq0j8Faa7GcUxqw@mail.gmail.com>
	<20111010164920.GA30351@phenom.oracle.com>
	<4E940744020000780005A9F9@nat28.tlf.novell.com>
	<1318320174.21903.485.camel@zakaz.uk.xensource.com>
	<4E941C48020000780005AA80@nat28.tlf.novell.com>
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318322620.21903.507.camel@zakaz.uk.xensource.com>
Mime-Version: 1.0
X-SA-Exim-Connect-IP: 62.200.22.2
X-SA-Exim-Mail-From: ijc@hellion.org.uk
Subject: Re: [Xen-devel] Re: BUG: unable to handle kernel	paging	request at
	ffff8803bb6ad000
X-SA-Exim-Version: 4.2.1 (built Mon, 22 Mar 2010 06:51:10 +0000)
X-SA-Exim-Scanned: Yes (on hopkins.hellion.org.uk)
Cc: xen-devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	rush <rush1503@gmail.com>, Jonathan Nieder <jrnieder@gmail.com>,
	"642154@bugs.debian.org" <642154@bugs.debian.org>,
	Ben Hutchings <ben@decadent.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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-10-11 at 09:36 +0100, Jan Beulich wrote:
> >>> On 11.10.11 at 10:02, Ian Campbell <ijc@hellion.org.uk> wrote:
> > On Tue, 2011-10-11 at 08:07 +0100, Jan Beulich wrote:
> >> >>> On 10.10.11 at 18:49, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> >> > On Sat, Oct 08, 2011 at 10:13:14AM +0400, rush wrote:
> >> >> OK, I tried it again, but Oops didn't gone.
> >> > .. snip..
> >> >>         echo    'Loading Xen 4.0-amd64 ...'
> >> >>         multiboot       /boot/xen-4.0-amd64.gz placeholder xsave=0
> >> > .. snip..
> >> >> Was it right?
> >> > 
> >> > Yup. I think.. this is a bit embarrassing. It took a bit of time for Intel
> >> > folks to get the xsave part right and I remember seeing this error about a
> >> > year ago with xsave on a Dell Optiplex 780. Hence I wonder if the fixes 
> > that
> >> > ultimately went in 4.1.1 did not get ported over to 4.0 and you are just
> >> > hitting that.
> >> > 
> >> > Can I ask you to do one more thing? Can you upgrade to the xen-4.1.1 in
> >> > the testing and try with the xsave (or without) and see if it works?
> >> > 
> >> > <holds his fingers hoping it is the xsave feature>
> >> 
> >> Are both of you certain this isn't the problem of the kernel only
> >> looking at the xsaveopt feature flag (implying that this means
> >> xsave is also available)? I found it necessary to force-clear that
> >> flag in the kernel when OSXSAVE is not set (by calling
> >> x86_xsave_setup() when !cpu_has_xsave, which in turn was
> >> modified to look at X86_FEATURE_OSXSAVE rather than
> >> X86_FEATURE_XSAVE under Xen - all of which I'm afraid would
> >> need to be done differently in pv-ops).
> > 
> > That all sounds familiar... In mainline we have (in
> > xen_init_cpuid_mask):
> > 
> > 	...
> >         xsave_mask =
> >                 (1 << (X86_FEATURE_XSAVE % 32)) |
> >                 (1 << (X86_FEATURE_OSXSAVE % 32));
> > 
> >         /* Xen will set CR4.OSXSAVE if supported and not disabled by force 
> > */
> >         if ((cx & xsave_mask) != xsave_mask)
> >                 cpuid_leaf1_ecx_mask &= ~xsave_mask; /* disable XSAVE & 
> > OSXSAVE */
> > 
> > Which I think implements something similar to what you describe? IOW
> > unless both XSAVE and OSXSAVE are available both are forcibly disabled.
> 
> Apart from the need to disable XSAVEOPT, yes.

Oh, right, I hadn't noticed it was a different/third flag.

> > While grepping I noticed that the kernel command line parameter to
> > disable xsave appears to be "noxsave" rather than "xsave=0", Rush is
> > that something you could try? (GRUB_CMDLINE_LINUX is the place to add
> > it)
> 
> Or "noxsaveopt" (if that's the problem, i.e. Rush's CPUs have that
> capability).

Right, Rush can you try both "noxsave" and "noxsaveopt" independently
please. If those work then we need to update the above logic to mask
xsaveopt as well.

Thanks,
Ian.

> 
> Jan
> 
> > Ian.
> > 
> >> If it is, the problem could be worked around by *en*abling xsave
> >> in Xen (which is off by default prior to 4.2), assuming none of the
> >> incomplete functionality would cause other headaches.
> >> 
> >> But yes, the CPUID handling code in 4.1.1 should properly hide
> >> XSAVEOPT when XSAVE is disabled, so just using this version
> >> ought to also get things going.
> >> 
> >> Jan
> >> 
> >> 
> >> _______________________________________________
> >> Xen-devel mailing list
> >> Xen-devel@lists.xensource.com 
> >> http://lists.xensource.com/xen-devel 
> > 
> > -- 
> > Ian Campbell
> > Current Noise: Zyklon - Hammer Revelation
> > 
> > The ultimate game show will be the one where somebody gets killed at the 
> > end.
> > 		-- Chuck Barris, creator of "The Gong Show"
> 
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

-- 
Ian Campbell
Current Noise: Zyklon - Transcendental War - Battle Between Gods

If you tell the truth you don't have to remember anything.
		-- Mark Twain


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 02:29:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 02:29:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDYe4-0006h7-CK; Tue, 11 Oct 2011 02:29:08 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDYcv-0006TR-UK
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 02:27:58 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318325273!517274!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32067 invoked from network); 11 Oct 2011 09:27:54 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 09:27:54 -0000
Received: by iaqq3 with SMTP id q3so10778792iaq.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 02:27:53 -0700 (PDT)
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:cc:content-type:content-transfer-encoding;
	bh=wzOxv9nfxwCw9n/diap1hKmIwiUN16u0Czvk3gIudwk=;
	b=nStVSoyw3OAl3M0zgldAEfPVK5PePqMOGZP2UvmvUuvnOgY7nCseoZQkmaQjwr9G2R
	wDLhUmsnV0fo2mdYg59w1UBnjaDCI2sfUr53vfKqrSPQ3H2bRtvF7ESYrvm/vpkujUVf
	WzhPLApdBrbRJHNqKLvYRvQJs3bBtZccVtXVU=
MIME-Version: 1.0
Received: by 10.231.73.139 with SMTP id q11mr9732962ibj.97.1318325273368; Tue,
	11 Oct 2011 02:27:53 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Tue, 11 Oct 2011 02:27:53 -0700 (PDT)
Date: Tue, 11 Oct 2011 10:27:53 +0100
X-Google-Sender-Auth: xIU4ETJ2XCW0KjLAVCCYP9NoTmE
Message-ID: <CAFLBxZbLcqpcJfFRSnT_C=5krhen44EzMD5pKcDNGhvLYmck=g@mail.gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulat ion() in page_fault
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: cc Luit <universalbillow@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

The comments in xen/arch/mm/shadow/multi.c:sh_page_fault() about emulation =
say:
    /* Need to emulate accesses to page tables */
and
    /* In HVM guests, we force CR0.WP always to be set, so that the
     * pagetables are always write-protected.  If the guest thinks
     * CR0.WP is clear, we must emulate faulting supervisor writes to
     * allow the guest to write through read-only PTEs.  Emulate if the
     * fault was a non-user write to a present page.  */

Do you have some question about these?

Regarding NPT/EPT, as far as I know, the only reason to do emulation
is when the guest is doing MMIO.  The whole point of MMIO is to
emulate access to devices.

 -George

On Tue, Oct 11, 2011 at 2:58 AM, cc Luit <universalbillow@gmail.com> wrote:
> Hi, everyone, I have a question,
> in the shadow_page_fault or ept mechanism, xen will use the x86_emulation
> for some instructions, I'm wondering why it must use it, if after we fix =
the
> SPT or EPT table, just VMEntry to HVM to re-excute this instruction=A0 bu=
t not
> emulate in xen, is there some problems?
>
> can sb. tell me why?
> thanks:)
> --
> - Luit @ Parallel Processing Institute, Fudan 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 Tue Oct 11 02:35:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 02:35:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDYkD-0007yH-8l; Tue, 11 Oct 2011 02:35:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RD4Xc-0006WW-0M
	for xen-devel@lists.xensource.com; Sun, 09 Oct 2011 18:20:28 -0700
X-Env-Sender: andres.lagarcavilla@gmail.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318209624!20566482!1
X-Originating-IP: [74.125.82.41]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16005 invoked from network); 10 Oct 2011 01:20:25 -0000
Received: from mail-ww0-f41.google.com (HELO mail-ww0-f41.google.com)
	(74.125.82.41)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 01:20:25 -0000
Received: by wwf10 with SMTP id 10so3065616wwf.0
	for <xen-devel@lists.xensource.com>;
	Sun, 09 Oct 2011 18:20:24 -0700 (PDT)
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:content-transfer-encoding;
	bh=njnhNwKZf0CBKxLHFHe2ZDcfswHwvVGqd80asss8nyA=;
	b=YYCDAplnlkIIuDsstKSzXRPbDQhiMZDgMPCDOc73CVNn0n7cChC1UCq6WHaSBL0E1U
	bBGnl/lTpguDDKqkyWxj9/vvbG2QicbRXrPyhuNX4rXb6CsdbAL59s8Q2tSV6ahxvAz7
	ANQ3M2zM/W8pAgIqVn2jQ4ijwOn6mDfCq9ils=
MIME-Version: 1.0
Received: by 10.216.134.217 with SMTP id s67mr5169498wei.101.1318209624518;
	Sun, 09 Oct 2011 18:20:24 -0700 (PDT)
Received: by 10.216.20.134 with HTTP; Sun, 9 Oct 2011 18:20:24 -0700 (PDT)
Date: Sun, 9 Oct 2011 21:20:24 -0400
X-Google-Sender-Auth: 7DOXHvWf3CEESOtTlJfu1ZB2Pm0
Message-ID: <CADzFZPsJ2--PQCVH1QGJ-L1q5k4bokBrZeaaAt=BSD7QU9cbOA@mail.gmail.com>
From: Andres Lagar Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com, Tim Deegan <tim@xen.org>, 
	Olaf Hering <olaf@aepfle.de>, Adin Scannell <adin@gridcentric.ca>,
	zhen shi <bickys1986@gmail.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
X-Mailman-Approved-At: Tue, 11 Oct 2011 02:34:57 -0700
Cc: 
Subject: [Xen-devel] Re: Re: mapping problems in 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

I have a proposal. I'd like to hear from the list what they think.

- 1. change p2m lock to a read/write lock
- 2. Make lookups (gfn_to_mfn_* family) take a read lock. All current
callers of p2m_lock will become write lockers.
- 3. Change the gfn_to_mfn_* family to get_page on the mfn obtained,
while holding the read lock.
- 4. Have all lookup callers put_page on the obtained mfn, once done.

Rationale: rwlock will prevent races between lookups and async p2m
modifications by paging, sharing, or feature X. The lookup routine
will be protected from races and able to atomically get_page on the
obtained mfn. The lookup caller will be able to work on this mfn
knowing it won't disappear underneath (as in the case currently
brought forward by Zhen)

I'm somewhat wary of having all callers required to put_page, but I
don't think it's a big deal because it's perfectly reasonable.

I'm more wary that turning p2m locking into read/write will result in
code deadlocking itself: taking a read lock first and a write lock
later. Possibly the current rwlock implementation could be improved to
keep a cpumask of read-lockers, and provide an atomic "promote from
read to write" atomic operation (something along the lines of wait
until you're the only reader in the cpumask, and then cmpxchg(lock,
-1, WRITE_BIAS))

Hope that made sense. Thoughts?

Andres

> Date: Mon, 10 Oct 2011 00:40:32 +0800
> From: zhen shi <bickys1986@gmail.com>
> Subject: Re: [Xen-devel] Re: mapping problems in xenpaging
> To: Tim Deegan <tim@xen.org>, Olaf Hering <olaf@aepfle.de>, =A0 =A0 Adin
> =A0 =A0 =A0 =A0Scannell <adin@gridcentric.ca>
> Cc: xen-devel@lists.xensource.com
> Message-ID:
> =A0 =A0 =A0 =A0<CACavRyA+Djzr3AVwgaZQu1-doPiMkAZ-NpdVR1nXjiiW_74PqQ@mail.=
gmail.com>
> Content-Type: text/plain; charset=3D"iso-8859-1"
>
> 2011/10/6 Tim Deegan <tim@xen.org>
>
>> At 16:56 +0200 on 03 Oct (1317660976), Olaf Hering wrote:
>> > On Fri, Sep 30, Adin Scannell wrote:
>> >
>> > > >> =A0When we analyze and test xenpaging,we found there are some
>> problems between
>> > > >> mapping and xenpaging.
>> > > >> =A01) When mapping firstly, then do xenpaging,and the code paths =
have
>> resolved
>> > > >> the problems.It's OK.
>> > > >> =A02) The problems exists if we do address mapping firstly then g=
o to
>> > > >> xenpaging,and our confusions are as followings:
>> > > >> =A0 =A0a) If the domU's memory is directly mapped to dom0,such as=
 the
>> hypercall
>> > > >> from pv driver,then it will build a related page-table in dom0,wh=
ich
>> will not
>> > > >> change p2m-type.
>> > > >> =A0 =A0 =A0 and then do the xenpaging to page out the domU's memo=
ry pages
>> whose gfn
>> > > >> address have been already mapped to dom0;So it will cause some
>> problems when
>> > > >> dom0
>> > > >> =A0 =A0 =A0 accesses these pages.Because these pages are paged-ou=
t,and
>> dom0 cannot
>> > > >> tell the p2mt before access the pages.
>> > > >
>> > > > I'm not entirely sure what you do. xenpaging runs in dom0 and is a=
ble
>> to
>> > > > map paged-out pages. It uses that to trigger a page-in, see
>> > > > tools/xenpaging/pagein.c in xen-unstable.hg
>> > >
>> > > Here's my take...
>> > >
>> > > Xenpaging doesn't allow selection of pages that have been mapped by
>> > > other domains (as in p2m.c):
>> > >
>> > > =A0669 int p2m_mem_paging_nominate(struct domain *d, unsigned long g=
fn)
>> > > ....
>> > > =A0693 =A0 =A0 /* Check page count and type */
>> > > =A0694 =A0 =A0 page =3D mfn_to_page(mfn);
>> > > =A0695 =A0 =A0 if ( (page->count_info & (PGC_count_mask | PGC_alloca=
ted)) !=3D
>> > > =A0696 =A0 =A0 =A0 =A0 =A0(1 | PGC_allocated) )
>> > > =A0697 =A0 =A0 =A0 =A0 goto out;
>>
>> =A0 =A0 I wonder if pages have been mapped by other domains,then the
> page->count_info will be added.I have analyzed =A0xc_map_foreign_pages()
> function,and have not figured out how to add the page->count_info
> by xc_map_foreign_pages().and the page->count_info decreases in munmap().
>
>
>> > > *However*, I think that the problem Zhen is describing still exists:
>> > > 1) xenpaging nominates a page, it is successful.
>> > > 2) dom0 maps the same page (a process other than xenpaging, which wi=
ll
>> > > also map it).
>> > > 3) xenpaging evicts the page, successfully.
>> > >
>> > > I've experienced a few nasty crashes, and I think this could account
>> > > for a couple (but certainly not all)... I think that the solution ma=
y
>> > > be to repeat the refcount check in paging_evict, and roll back the
>> > > nomination gracefully if the race is detected. Thoughts?
>>
>
>
>> > Are there really code paths that touch a mfn without going through the
>> > p2m functions? If so I will copy the check and update xenpaging.
>>
>> >No, but there are race conditions where CPU A could to the p2m lookup,
>> >then CPU B nominates the page and changes its p2m entry, then CPU A
>> >completes the mapping. =A0In the extreme case, detecting this in the
>> >eviction code is also subject to the same race; some sort of atomic
>> >lookup-and-get-reference operation seems like a better fix.
>>
>
> =A0Tim , Olaf and Adin, do you have any good ideas about the above
> situation.
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: http://lists.xensource.com/archives/html/xen-devel/attachments/20111=
010/55486330/attachment.html
>
> ------------------------------
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>
>
> End of Xen-devel Digest, Vol 80, Issue 104
> ******************************************
>

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 02:36:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 02:36:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDYlI-0008Oq-F6; Tue, 11 Oct 2011 02:36:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDGP6-0006QN-5h
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 07:00:50 -0700
X-Env-Sender: balbirsmail@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318255204!46002460!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24393 invoked from network); 10 Oct 2011 14:00:06 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 14:00:06 -0000
Received: by iaqq3 with SMTP id q3so9538983iaq.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 07:00:23 -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=xriSXS73Xde6ohdrFa4yFDyE8iI/k6I7a3LTNYH6ZaA=;
	b=AR/MGhOGRjoBLgVGj+H+afRPJGynpcOo9QuaS9W7QQebGdx09fMWzKiil0fjTTrnfa
	C/weYgDG+448dLELJaU07AGCcScEkr8SgRBcNnAcEmQQGp5iIJe2vCadvMPkvqHv4SKR
	0XCvWgmGXj5l3oH4HKr7rHNkKz2tvxG3DuYcI=
MIME-Version: 1.0
Received: by 10.231.84.196 with SMTP id k4mr8459597ibl.45.1318255222906; Mon,
	10 Oct 2011 07:00:22 -0700 (PDT)
Received: by 10.231.17.7 with HTTP; Mon, 10 Oct 2011 07:00:22 -0700 (PDT)
Date: Mon, 10 Oct 2011 19:30:22 +0530
Message-ID: <CACNKaAHEfMoEdZ6Ru1_rO_SJ6snurjSK3nnaiBSLDVdA6ZON=g@mail.gmail.com>
From: Balbir Singh <balbirsmail@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
X-Mailman-Approved-At: Tue, 11 Oct 2011 02:34:57 -0700
Subject: [Xen-devel] Trap flags, debug and emulation - xen 4.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

Hi,

I've been trying a simple experiment on my intel box (along the lines
of http://web.archiveorange.com/archive/v/tXSRN8SPX0sXRutnvOCu). I
have a system with VMX but no EPT, it falls back on shadow page tables
and I disable super pages. The VM itself is a 32 bit OS. I am using
xen-4.1.1 on ubuntu.

Quoting from the link above

"First, I mark a guest page "not present" inside the shadow page table
so that I could intercept any operation that involves this page. When
the guest tries to access that page, it faults and control goes to Xen
(sh_page_fault function). There, I emulate that operation and return
the control to guest to execute next instruction. I could get my first
part working.

In the second part after emulating the instruction inside Xen, I want
to perform single-step execution from next instruction onwards so that
I could monitor further execution of guest from that point.

To achieve that I did following: After emulating an instruction inside
Xen and before sending the control back to guest OS, I set the
EFLAGS's trap bit set by doing following operation:

regs->eflag |= X86_EFLAGS_TF

And return the control from sh_page_fault function by saying "return
EFAULT_FIXED".

I am doing something very similar. I do get the fault and I can set
the trap, but I don't see any form of single stepping take place as I
do not get the TRAP_debug exception back. My exception_bitmap has
TRAP_no_device, TRAP_page_fault, TRAP_debug and TRAP_int3 set.

I've tried debugging the issue with xentrace and printks, but sadly I
could not track down the issue. The CPU does have
cpu_has_monitor_trap_flag set to true.

Could anyone give me clues on how to track down why I did not get a
TRAP_debug exception via a VMEXIT?

Balbir Singh

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 02:37:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 02:37:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDYmD-0000Rv-VN; Tue, 11 Oct 2011 02:37:33 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDLMF-0006Ed-J7
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 12:17:52 -0700
X-Env-Sender: andres.lagarcavilla@gmail.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1318274268!21582133!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8020 invoked from network); 10 Oct 2011 19:17:48 -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;
	10 Oct 2011 19:17:48 -0000
Received: by wyh13 with SMTP id 13so8380874wyh.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 12:17:48 -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=8nDcfM3JS2kFH+P1puoFgP+Z10rTTL4LKR3Rs36CVFI=;
	b=I3UU3x2cNV9PYoDWm43WuDIpXr8F2yyg3cwtalXrP7GHR9tTSIRRnYaPcjJ3XWYFxv
	OV6wUVLf5Oldusg1/dVe/QoZ9Qt4sT3A+h/Og78QTehXPx4qkf/AZHwF2NcC1RXQ50/c
	XYZ+tOswuYFsy4tNGM399zN3x+krWOWB07YL0=
MIME-Version: 1.0
Received: by 10.216.190.131 with SMTP id e3mr6924464wen.48.1318274267702; Mon,
	10 Oct 2011 12:17:47 -0700 (PDT)
Received: by 10.216.51.198 with HTTP; Mon, 10 Oct 2011 12:17:47 -0700 (PDT)
In-Reply-To: <20111010092111.GB31800@ocelot.phlegethon.org>
References: <CADzFZPsJ2--PQCVH1QGJ-L1q5k4bokBrZeaaAt=BSD7QU9cbOA@mail.gmail.com>
	<20111010092111.GB31800@ocelot.phlegethon.org>
Date: Mon, 10 Oct 2011 15:17:47 -0400
X-Google-Sender-Auth: FuuRnprdrbyGpo1aMVo_Tj6UiOQ
Message-ID: <CADzFZPscgJ6TWXNjyeEjbOnMrEpCE7zS6BTGxfJ+yibpz-Ds_w@mail.gmail.com>
From: Andres Lagar Cavilla <andres@lagarcavilla.org>
To: Tim Deegan <tim@xen.org>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
X-Mailman-Approved-At: Tue, 11 Oct 2011 02:34:57 -0700
Cc: Olaf Hering <olaf@aepfle.de>, xen-devel@lists.xensource.com,
	zhen shi <bickys1986@gmail.com>, Adin Scannell <adin@gridcentric.ca>
Subject: [Xen-devel] Re: Re: mapping problems in 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

Hi Tim,

On Mon, Oct 10, 2011 at 5:21 AM, Tim Deegan <tim@xen.org> wrote:
> At 21:20 -0400 on 09 Oct (1318195224), Andres Lagar Cavilla wrote:
>> I have a proposal. I'd like to hear from the list what they think.
>>
>> - 1. change p2m lock to a read/write lock
>> - 2. Make lookups (gfn_to_mfn_* family) take a read lock. All current
>> callers of p2m_lock will become write lockers.
>> - 3. Change the gfn_to_mfn_* family to get_page on the mfn obtained,
>> while holding the read lock.
>> - 4. Have all lookup callers put_page on the obtained mfn, once done.
>
> This seems like a step in the right direction, but if we're going to
> make this big an interface change there might be better interfaces to
> end up with.
Agree, and hopefully we can converge towards something awesome.

> A few issues I can see with it:
> =A0- p2m lookups are on some very performance-sensitive paths
> =A0 (e.g. multiple times in any pagetable walk or instruction emulation
> =A0 in a HVM guest) so adding the rwlock might have a noticeable impact.
>
> =A0- This fixes one class of races (page gets freed-to-xen underfoot) but
> =A0 leaves another one (gfn -> mfn map changes underfoot) untouched. =A0I=
n
> =A0 particular it doesn't solve the race where a foreign mapper
> =A0 gets a r/w map of what's meant to be a read-only frame.

Can you elaborate a bit? Under what situations does the gfn->mfn map
change underfoot (other than sharing, paging in or superpage
sharding)? Wouldn't those two be taking a writer lock, and thus be
mutually ecxluded from lookups?

Also, the second problem you mention (foregin rw map of ro page) seems
to be a tad different. That fix should go into get_page_from_l1e,
right? Isn't qemu allowed to do this all the time?

> I think that to fix things properly we need to have some refcount
> associated with the p2m mapping itself. =A0That would be taken by all
> lookups (or at least some - we could have a flag to the p2m lookup) and
> released as you suggest, but more importantly it would block all p2m chan=
ges
> while the count was raised. =A0(I think that a least in the common case w=
e
> could encode such a refcount using the existing typecount).

Assuming mapping means "entry in p2m", multiple mappings would have
their ref count collapse in the page typecount. Isn't that a problem?
Do we need per-mapping refcounts, or rather, per mapping mutual
exclusion? My feel is that page refcounts are necessary to prevent the
page from disappearing, and mappings need to have their lookups and
modifications synchronized.

> One problem then is how to make all the callers of the p2m update
> functions handle failure, either by waiting (new deadlock risk?) or
> returning EAGAIN at the hypercall interface. =A0Paths where the update
> isn't caused by an explicit request (like log-dirty and the mem-event
> rx-to-rw conversion) would be particularly tricky.

Callers already wait on lock_p2m. They'll wait longer :)

On failure, to cite a specific example, if paging was trying to swap
something out that got foreign-mapped by somebody else, then yeah,
there's no other option than failing that call.

How would log-dirty and x^w fail (if the refcount increases before
they get exclusive access to the mapping)? They're not trying to
change the mapping and/or make a page go away, rather they're changing
the p2m permission.

> More seriously, it introduces another round of the sort of priority
> inversion we already get with the existing refcounts - a foreign
> mapping, caused by a user-space program in another VM, could arbitrarily
> delay a p2m update (and so prevent a VCPU from making progress), without
> any mechanism to even request that the mapping be removed.

Yeah, that's tricky. I do not know if there is a fix at all.
Fundamentally, the foreign mapper (some dom0 sharing/paging/foo
utility) is completely async to the domain. Even if we were to revoke
the foreign mapping as you suggest below, that would involve an upcall
into the foreign-mapper-guest-OS to have it cleanly neuter the mapping
and drop the refcount. That's not at all trivial! Perhaps foreign
mapping vma's should be taught to patiently re-establish mappings if
they disappear under their feet? Event then, you need to keep track of
those foreign l1e's, and nothing short of a list will do.

Because this is performance rather than correctness I'm inclined to
not poke the beast.

> Any ideas how to avoid that? =A0Potentially with some extra bookkeeping o=
n
> foreign mappings we could revoke or redirect them when the p2m changes.
> That would fit nicely with the abstraction in the interfaces where HVM
> domains' memory is always indexed by pfn. =A0I can imagine it being quite
> tricky though.
>
>> I'm more wary that turning p2m locking into read/write will result in
>> code deadlocking itself: taking a read lock first and a write lock
>> later. Possibly the current rwlock implementation could be improved to
>> keep a cpumask of read-lockers, and provide an atomic "promote from
>> read to write" atomic operation (something along the lines of wait
>> until you're the only reader in the cpumask, and then cmpxchg(lock,
>> -1, WRITE_BIAS))
>
> I think that would deadlock if two cpus tried it at once.

If you keep a cpumask of all read lockers, and only try to promote if
you're the only read locker, it wouldn't. But then you'd have to
protect the cpumask from races with another spinlock. Yuk.

Which brings me to another question: p2m_locked_by_me (and others)
check on the physical cpu (lock->holder =3D=3D curent->processor,
roughly). Well, what if you lock and then the vcpu migrates? Are vcpu
migrations prevented if you hold any locks? Or is there some other
magic going on?

Thanks!
Andres
>
> Tim.
>

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 02:38:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 02:38:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDYn2-0000or-IQ; Tue, 11 Oct 2011 02:38:24 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDLZ9-0007c7-9G
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 12:31:11 -0700
X-Env-Sender: andres.lagarcavilla@gmail.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318275067!21024901!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31321 invoked from network); 10 Oct 2011 19:31:08 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 19:31:08 -0000
Received: by wyh13 with SMTP id 13so8393964wyh.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 12:31:07 -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=35G2AC0oPAqazRJjWoEGQo9i8COluMeGq0UHUw31GpI=;
	b=h3KRpqCtF1j/2uaKkrKNO/7Y0FYOMZPcR0i2bCYK5WXrilDviS2lfvVZ1MstB7epln
	+oVv6F3oTBGMZxhgFfElBwmvkQHzP/J/Iq4XFHvCnez+ammqcG2Q8xeM6mwOYFSUJMds
	qJRNoQNEhomy7cDB12KOV/krnPwKMVDsQ7GpU=
MIME-Version: 1.0
Received: by 10.216.190.131 with SMTP id e3mr6939574wen.48.1318275067520; Mon,
	10 Oct 2011 12:31:07 -0700 (PDT)
Received: by 10.216.51.198 with HTTP; Mon, 10 Oct 2011 12:31:06 -0700 (PDT)
In-Reply-To: <CAB8821A.2291B%keir.xen@gmail.com>
References: <20111010092111.GB31800@ocelot.phlegethon.org>
	<CAB8821A.2291B%keir.xen@gmail.com>
Date: Mon, 10 Oct 2011 15:31:06 -0400
X-Google-Sender-Auth: MecFlvxeoNJ0PKGsNIjthCpMOL0
Message-ID: <CADzFZPt5vVLnx1qZ0ffiT9ynkj9asdH-ts_nKtsyDCY9_0EL=w@mail.gmail.com>
Subject: Re: [Xen-devel] Re: Re: mapping problems in xenpaging
From: Andres Lagar Cavilla <andres@lagarcavilla.org>
To: Keir Fraser <keir.xen@gmail.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
X-Mailman-Approved-At: Tue, 11 Oct 2011 02:34:58 -0700
Cc: Olaf Hering <olaf@aepfle.de>, xen-devel@lists.xensource.com,
	Tim Deegan <tim@xen.org>, zhen shi <bickys1986@gmail.com>,
	Adin Scannell <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

Keir,

On Mon, Oct 10, 2011 at 6:06 AM, Keir Fraser <keir.xen@gmail.com> wrote:
> On 10/10/2011 10:21, "Tim Deegan" <tim@xen.org> wrote:
>
>> At 21:20 -0400 on 09 Oct (1318195224), Andres Lagar Cavilla wrote:
>>> I have a proposal. I'd like to hear from the list what they think.
>>>
>>> - 1. change p2m lock to a read/write lock
>>> - 2. Make lookups (gfn_to_mfn_* family) take a read lock. All current
>>> callers of p2m_lock will become write lockers.
>>> - 3. Change the gfn_to_mfn_* family to get_page on the mfn obtained,
>>> while holding the read lock.
>>> - 4. Have all lookup callers put_page on the obtained mfn, once done.
>>
>> This seems like a step in the right direction, but if we're going to
>> make this big an interface change there might be better interfaces to
>> end up with.
>>
>> A few issues I can see with it:
>> =A0- p2m lookups are on some very performance-sensitive paths
>> =A0 =A0(e.g. multiple times in any pagetable walk or instruction emulati=
on
>> =A0 =A0in a HVM guest) so adding the rwlock might have a noticeable impa=
ct.
>
> If the read sections are short, may as well use a plain spinlock.
>
> The best (but hard) way to make the locking cheaper is to work out a way =
to
> use finer-grained locks (e.g., per-page / per-mapping) or avoid locks
> altogether (e.g., RCU).
No clue about RCU. But the p2m tree structure lends itself naturally
to fine-grained locking. In fact, hierarchical locking given 2M and 1G
superpages.

Now, this moves all the locking into the specific p2m implementations,
ept and traditional pt. Do you think a test_and_set-style spinlock
could fit in the unused bits of a p2m entry. It would have scarce
debug information :) I don't know if ept would freak out with someone
spinning on an entry it has loaded in the translation hardware.
Probably.

So, perhaps the most decent idea is to have a tree/array of locks on
the side. This would not have to live inside the ept/pt
implementation-specific layer. Although locking unaligned,
arbitrarily-sized ranges of pages (Does anyone do that? PoD?) would
become a big headache.

>
> Multi-reader locks are rarely going to be a good choice in the hypervisor=
.
>
> A good first step anyhow would be to make the p2m_ synchronisation correc=
t,
> and then optimise it. Sounds like that is hard enough. :-)

Pigybacking another question: ultimately, if we get p2m sync correct,
paging can introduce arbitrary waits. Currently the code bails out,
rather ungracefully (e.g. hvm_copy). Is this what wait queues were
introduced for? Hasn't that been implemented purely out of lack of
cycles, or something more fundamental awaits?

Thanks!
Andres
>
> =A0-- Keir
>
>> =A0- This fixes one class of races (page gets freed-to-xen underfoot) bu=
t
>> =A0 =A0leaves another one (gfn -> mfn map changes underfoot) untouched. =
=A0In
>> =A0 =A0particular it doesn't solve the race where a foreign mapper
>> =A0 =A0gets a r/w map of what's meant to be a read-only frame.
>>
>> I think that to fix things properly we need to have some refcount
>> associated with the p2m mapping itself. =A0That would be taken by all
>> lookups (or at least some - we could have a flag to the p2m lookup) and
>> released as you suggest, but more importantly it would block all p2m cha=
nges
>> while the count was raised. =A0(I think that a least in the common case =
we
>> could encode such a refcount using the existing typecount).
>>
>> One problem then is how to make all the callers of the p2m update
>> functions handle failure, either by waiting (new deadlock risk?) or
>> returning EAGAIN at the hypercall interface. =A0Paths where the update
>> isn't caused by an explicit request (like log-dirty and the mem-event
>> rx-to-rw conversion) would be particularly tricky.
>>
>> More seriously, it introduces another round of the sort of priority
>> inversion we already get with the existing refcounts - a foreign
>> mapping, caused by a user-space program in another VM, could arbitrarily
>> delay a p2m update (and so prevent a VCPU from making progress), without
>> any mechanism to even request that the mapping be removed.
>>
>> Any ideas how to avoid that? =A0Potentially with some extra bookkeeping =
on
>> foreign mappings we could revoke or redirect them when the p2m changes.
>> That would fit nicely with the abstraction in the interfaces where HVM
>> domains' memory is always indexed by pfn. =A0I can imagine it being quit=
e
>> tricky though.
>>
>>> I'm more wary that turning p2m locking into read/write will result in
>>> code deadlocking itself: taking a read lock first and a write lock
>>> later. Possibly the current rwlock implementation could be improved to
>>> keep a cpumask of read-lockers, and provide an atomic "promote from
>>> read to write" atomic operation (something along the lines of wait
>>> until you're the only reader in the cpumask, and then cmpxchg(lock,
>>> -1, WRITE_BIAS))
>>
>> I think that would deadlock if two cpus tried it at once.
>>
>> Tim.
>>
>> _______________________________________________
>> 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 Oct 11 02:39:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 02: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 1RDYnr-0001Bh-Jr; Tue, 11 Oct 2011 02:39:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDLmm-0008Ca-BC
	for xen-devel@lists.xensource.com; Mon, 10 Oct 2011 12:45:17 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1318275912!31008832!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4121 invoked from network); 10 Oct 2011 19:45:13 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Oct 2011 19:45:13 -0000
Received: by vws13 with SMTP id 13so7242939vws.30
	for <xen-devel@lists.xensource.com>;
	Mon, 10 Oct 2011 12:45: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=LRzMB4DuiAk5ZGKbSBHYQ0OQH7Qj/C8kzNt98hUbh7I=;
	b=vCQYN3xd4JHkTnQy4+uT23AvYEmqpdbOKiHLw2zUi9Eh2DCPsuUF0nQS/qFXCIKTWb
	fFm8Tv6RNMnV3u2RpbTJo3kLlpYvWOieBKeEfh+WNZpbz+6AEoIqfWgcb6BoI+9UNUUb
	oBNw0b3eucm9fxM3SgHgYCJ0gqzjQuA+thpMQ=
MIME-Version: 1.0
Received: by 10.52.28.200 with SMTP id d8mr15366392vdh.56.1318275911802; Mon,
	10 Oct 2011 12:45:11 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Mon, 10 Oct 2011 12:45:11 -0700 (PDT)
Date: Mon, 10 Oct 2011 20:45:11 +0100
Message-ID: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
From: Andy Burns <burns.me.uk@gmail.com>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1
X-Mailman-Approved-At: Tue, 11 Oct 2011 02:34:57 -0700
Subject: [Xen-devel] PCI passthrough stopped working, brainache!
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Recently had passthrough of 2xPCI DVB-T cards and 1xPCIe DVB-S2 card working,
the last know config that was *certainly* working was

dom0
xen-4.1.1-3.fc16.x86_64
kernel-3.1.0-0.rc7.git0.0.fc16.x86_64

domU
kernel-3.1.0-0.rc8.git0.0.fc16.x86_64

Since then I've updated

xen-4.1.1-6.fc16.x86_64 on dom0

kernel-3.1.0-0.rc9.git0.0.fc16.x86_64 on dom0 and domU

and updated all other packages to current F16 updates-testing,
also lots of fiddling with grub2 and systemd on the domU

Only today did I realise that only the PCIe card is now working, not
the PCI ones, and have since spent several hours trying to get back to
a working configuration :-(

I've rolled my xen packages back from 4.1.1-6 to 4.1.1-3
tried booting various combinations of 3.1.0-rc7/rc8/rc9 as dom0 and domU

made sure I still have "pci=resource_alignment" for all the relevant
PCI devices on the dom0
made sure I still have "iommu=soft" on the domU
made sure pci-back is happy with "xm pci-list-assignable-devices"
made sure devices really have been assigned with "xm pci-list mythf16"
made sure the devices and drivers show in the domU with "lspci",
"lsusb" and "lsmod"
checked "xm dmesg" on dom0 and "dmesg" on dom0 and domU that drivers
see the hardware and load firmware OK
scandvb goes through the motions of tuning, but finds no stations,
this  *feels* as though the issue is lack of DMA transfers.

How can I tell if the iommu=soft is taking effect?
Anything stupid I sound like I've forgotten?

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 02:49:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 02:49:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDYxg-0001no-Qu; Tue, 11 Oct 2011 02:49:24 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDYwr-0001ak-PU
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 02:48:34 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-7.tower-21.messagelabs.com!1318326477!58294598!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31562 invoked from network); 11 Oct 2011 09:47:57 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Oct 2011 09:47:57 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RDYwo-000NZ2-2I; Tue, 11 Oct 2011 09:48:30 +0000
Date: Tue, 11 Oct 2011 10:48:30 +0100
From: Tim Deegan <tim@xen.org>
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH] xenpaging: clear page content after evict
Message-ID: <20111011094830.GE88076@ocelot.phlegethon.org>
References: <f67616df0e0891ddddba.1318058133@probook.site>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <f67616df0e0891ddddba.1318058133@probook.site>
User-Agent: Mutt/1.4.2.1i
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

At 09:15 +0200 on 08 Oct (1318065333), Olaf Hering wrote:
> xenpaging: clear page content after evict
> 
> If the guest happens to read from the gfn while xenpaging is in the process of
> evicting the page, the guest may read zeros instead of actual data.
> Also if eviction fails the page content will be corrupted and xenpaging wont
> attempt to restore the page.
> 
> Remove page scrubbing from pager and do it after successful eviction.
> 
> Signed-off-by: Olaf Hering <olaf@aepfle.de>

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 Oct 11 02:52:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 02:52:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDZ15-0002DN-1k; Tue, 11 Oct 2011 02:52:55 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDZ0H-00020n-9a
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 02:52:05 -0700
X-Env-Sender: jinsong.liu@intel.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318326721!520458!1
X-Originating-IP: [134.134.136.24]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28880 invoked from network); 11 Oct 2011 09:52:01 -0000
Received: from mga09.intel.com (HELO mga09.intel.com) (134.134.136.24)
	by server-13.tower-216.messagelabs.com with SMTP;
	11 Oct 2011 09:52:01 -0000
Received: from orsmga002.jf.intel.com ([10.7.209.21])
	by orsmga102.jf.intel.com with ESMTP; 11 Oct 2011 02:52:00 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,351,1309762800"; d="scan'208";a="62046704"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by orsmga002.jf.intel.com with ESMTP; 11 Oct 2011 02:51:59 -0700
Received: from shsmsx602.ccr.corp.intel.com (10.239.4.104) by
	pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Tue, 11 Oct 2011 17:51:50 +0800
Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by
	SHSMSX602.ccr.corp.intel.com ([10.239.4.104]) with mapi;
	Tue, 11 Oct 2011 17:51:49 +0800
From: "Liu, Jinsong" <jinsong.liu@intel.com>
To: Jan Beulich <JBeulich@suse.com>, "Jiang, Yunhong" <yunhong.jiang@intel.com>
Date: Tue, 11 Oct 2011 17:51:56 +0800
Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Topic: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Index: AcyH8cc1MZXHp7EFQ+atzw3eBDiTWQABnt4Q
Message-ID: <BC00F5384FCFC9499AF06F92E8B78A9E269B10E0CA@shsmsx502.ccr.corp.intel.com>
References: <BC00F5384FCFC9499AF06F92E8B78A9E263B557B77@shsmsx502.ccr.corp.intel.com>
	<4E84ADF70200007800058882@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D2366A9B@shsmsx501.ccr.corp.intel.com>
	<4E858AF30200007800058A64@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D23D3B7D@shsmsx501.ccr.corp.intel.com>
	<4E92C369020000780005A68B@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E2693B8F9FB@shsmsx502.ccr.corp.intel.com>
	<4E941DA6020000780005AA9B@nat28.tlf.novell.com>
In-Reply-To: <4E941DA6020000780005AA9B@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: "keir.xen@gmail.com" <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

Jan Beulich wrote:
>>>> On 11.10.11 at 10:15, "Liu, Jinsong" <jinsong.liu@intel.com> wrote:
>> Jan Beulich wrote:
>>>>>> On 08.10.11 at 10:29, "Jiang, Yunhong" <yunhong.jiang@intel.com>
>>>>>> wrote:
>>>=20
>>>>=20
>>>>> -----Original Message-----
>>>>> From: Jan Beulich [mailto:JBeulich@suse.com]
>>>>> Sent: Friday, September 30, 2011 3:25 PM
>>>>> To: Liu, Jinsong; Jiang, Yunhong
>>>>> Cc: keir.xen@gmail.com; xen-devel@lists.xensource.com
>>>>> Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
>>>>>=20
>>>>>>>> On 30.09.11 at 04:51, "Jiang, Yunhong"
>>>>>>>> <yunhong.jiang@intel.com> wrote:
>>>>>=20
>>>>>>=20
>>>>>>> -----Original Message-----
>>>>>>> From: Jan Beulich [mailto:JBeulich@suse.com]
>>>>>>> This made me look at the current source, and there I see in
>>>>>>> mce_urgent_action()=20
>>>>>>>=20
>>>>>>>     if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))
>>>>>>> return -1;=20
>>>>>>>=20
>>>>>>> which I think should say ... _EIPV and use || instead. Thoughts?
>>>>>>=20
>>>>>> I think this code means, if the error happens in hypervisor mode
>>>>>> (i.e. !guest_mode()), and RIPV indicate the RIP in stack can't be
>>>>>> restarted, we have to panic.
>>>>>=20
>>>>> Then the guest_mode() check still lacks an extra check of EIPV,
>>>>> like=20
>>>>>=20
>>>>>      if ( !(gstatus & MCG_STATUS_RIPV) &&
>>>>>           (!(gstatus & MCG_STATUS_EIPV) || !guest_mode(regs)))
>>>>> return -1;=20
>>>>>=20
>>>>=20
>>>> The RIPV is not related to the EIPV. RIPV means the context saved
>>>> in the stack can't be restarted anymore. According to the SDM, RIPV
>>>> means "execution can be restarted reliably at the instruction
>>>> pointed to by the instruction pointer pushed on the stack". It's
>>>> not about error happened synchronously or asynchronously. The
>>>> point is, if the program is running in hypervisor context, and
>>>> RIPV tells us that the program can't be restarted, we can't do
>>>> anything but panic, because we can't switch context while we are
>>>> in xen. So this code have nothing to do with EIPV.
>>>=20
>>> I continue to disagree (including the statement in your other
>>> response): RIPV only tells us whether we can resume, not in which
>>> context the error occurred. EIPV tells us whether, by looking at the
>>> saved registers, we can determine the context that the error
>>> occurred in. Since with !RIPV we have to determine in what context
>>> the error occurred in order to decide whether to panic or just kill
>>> a guest, we can't ignore EIPV (and if it's not set we have to
>>> assume the worst case, since even if the registers indicate guest
>>> mode the error may have occurred in hypervisor context or accessing
>>> hypervisor structures [consider e.g. a data load error during a GDT
>>> access]).=20
>>>=20
>>> Jan
>>=20
>> Yes, I agree EIPV=3D0 may indicate async error, but I think your
>> solution *overkilled* most cases (i.e. the real guest instruction
>> fetch error).=20
>>=20
>> Our idea is,
>>   * xen mce would flush prefetched instruction so we can delay
>> handle it until if real need;=20
>>   * a h/w error will not disappear, but if it was not being
>> *consumed*, it's OK for system keep going (like SRAO error which do
>> not need s/w handle immediately);=20
>>=20
>> Suppose an async instruction fetch error (RIVP=3DEIVP=3D0), triggered at
>> guest context but instruction prefetch hypervisor context. The
>>   scenario is, * at xen mce, the prefetched instruction has been
>> flushed. xen mce handler needn't panic, instead it mark the page as
>> broken page, then trigger vmce to guest;
>=20
> If the prefetch was from Xen space (only in guest context),
> delivering a vMCE to the guest is pointless (and perhaps confusing to
> the guest).=20
>=20

Yes, exactly. how about delay handle it as:
* at mce isr
	if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))
		xen panic;
* at mce softirq
	if ( (srar error) && (EIPV =3D=3D0) && (broken page owned by hypervisor) )
		xen panic;

>>   * guest may kill app, kernel thread, guest itself, or whatever;
>>=20
>> The error is still an error, w/ 2 possibilities in the future:
>>   1. it may not be consumed as an SRAR error, system keep going, h/w
>> mechanism may detect a SRAO error (i.e. memroy scrub) at some time
>> point and handled then;=20
>>   2. it may be consumed at some time point and a SRAR error
>>    triggered again. At this time, 1). if srar occurred at hypervisor
>>    context, xen will panic. or, 2). if srar occurred at guest
>> context, xen kill the guest as a malicious one (as what the 2nd
>> patch do), and move the page to broken page list;=20
>>=20
>> Considering the rare possibility of the above case, I think it's
>> acceptable to handle it in this way. Thoughts?
>=20
> You're only discussing instruction fetches (which can be discarded),
> but you're not covering the other example I gave (GDT access from
> guest context - just like this is a ring-0 operations from the paging
> unit's pov, this ought to be an out-of-context operation from MCE's
> perspective).=20
>=20
> Jan

That would be data load error (EIPV=3D1), a sync error.

Thanks,
Jinsong


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 03:14:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 03:14:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDZLZ-00032s-OV; Tue, 11 Oct 2011 03:14:05 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDZJm-0002og-G5
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 03:12:29 -0700
X-Env-Sender: universalbillow@gmail.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318327930!517774!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2240 invoked from network); 11 Oct 2011 10:12:11 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 10:12:11 -0000
Received: by ggnk4 with SMTP id k4so9541833ggn.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 03:12:10 -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=gIwp7fRBIHB/mAijoEDXr0BVcDeYXCPlcTeQcDhcvYM=;
	b=JxrsW0KGHk3TjzsQv7J/wLQCv9ptjhkz/6EjYMP/VpMgXDMbhWYGaAuw12qRFIUgI7
	d1ByxUy4ePfy7HTAYWiDndhYv4mI0IgX8xl/1/hO1VOFjDh1TMLLuBtxYfgz9fVoZijG
	2e85s+9x4Hq2oYaLMyVCsgnlazg2+kXlbVKVQ=
MIME-Version: 1.0
Received: by 10.236.187.73 with SMTP id x49mr5397604yhm.121.1318327929861;
	Tue, 11 Oct 2011 03:12:09 -0700 (PDT)
Received: by 10.236.69.230 with HTTP; Tue, 11 Oct 2011 03:12:09 -0700 (PDT)
In-Reply-To: <CAFLBxZbLcqpcJfFRSnT_C=5krhen44EzMD5pKcDNGhvLYmck=g@mail.gmail.com>
References: <CAFLBxZbLcqpcJfFRSnT_C=5krhen44EzMD5pKcDNGhvLYmck=g@mail.gmail.com>
Date: Tue, 11 Oct 2011 18:12:09 +0800
Message-ID: <CADWh-PF1BOSN22-Ua41fuRDP9HsHJ3j=T9j7_Kc2Un8XnVMKOQ@mail.gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulat ion() in page_fault
From: cc Luit <universalbillow@gmail.com>
To: George Dunlap <George.Dunlap@eu.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="===============0547279793=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0547279793==
Content-Type: multipart/alternative; boundary=20cf30563035f4f8fe04af03231d

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

Sorry about that:-)
Yeah, I've seen this comments, I understand what it says in the before part,
but not the last sentence, what does it mean by "non-user write"? and what's
more, in the code following is:
    if ( is_hvm_domain(d)
         && unlikely(!hvm_wp_enabled(v))
         && regs->error_code == (PFEC_write_access|PFEC_page_present)
         && mfn_valid(gmfn) )
    {
        perfc_incr(shadow_fault_emulate_wp);
        goto emulate;
    }

there is not opinion show that the guest is to write through read-only PTEs,
but just a hvm_wp_enabled but mfn_valid address, does it because only the
PTE is hvm_wp_enabled?

another question is that if for some reasons I want to design that the Guest
PTE is not read-only, which means in the page_fault situation I don't want
xen to emulate, is there any functionability or feasibility problems?

thanks for your answer:)

On Tue, Oct 11, 2011 at 5:27 PM, George Dunlap
<George.Dunlap@eu.citrix.com>wrote:

> The comments in xen/arch/mm/shadow/multi.c:sh_page_fault() about emulation
> say:
>    /* Need to emulate accesses to page tables */
> and
>    /* In HVM guests, we force CR0.WP always to be set, so that the
>     * pagetables are always write-protected.  If the guest thinks
>     * CR0.WP is clear, we must emulate faulting supervisor writes to
>     * allow the guest to write through read-only PTEs.  Emulate if the
>     * fault was a non-user write to a present page.  */
>
> Do you have some question about these?
>
> Regarding NPT/EPT, as far as I know, the only reason to do emulation
> is when the guest is doing MMIO.  The whole point of MMIO is to
> emulate access to devices.
>
>  -George
>
> On Tue, Oct 11, 2011 at 2:58 AM, cc Luit <universalbillow@gmail.com>
> wrote:
> > Hi, everyone, I have a question,
> > in the shadow_page_fault or ept mechanism, xen will use the x86_emulation
> > for some instructions, I'm wondering why it must use it, if after we fix
> the
> > SPT or EPT table, just VMEntry to HVM to re-excute this instruction  but
> not
> > emulate in xen, is there some problems?
> >
> > can sb. tell me why?
> > thanks:)
> > --
> > - Luit @ Parallel Processing Institute, Fudan University
> >
> > _______________________________________________
> > Xen-devel mailing list
> > Xen-devel@lists.xensource.com
> > http://lists.xensource.com/xen-devel
> >
> >
>



-- 
- Luit @ Parallel Processing Institute, Fudan University

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

<div>Sorry about that:-)</div>
<div>Yeah, I&#39;ve seen this comments, I understand what it says in the be=
fore part, but not the last sentence, what does it mean by &quot;non-user w=
rite&quot;? and what&#39;s more, in the code following is:=A0 <br>=A0=A0=A0=
 if ( is_hvm_domain(d) <br>
=A0=A0=A0=A0=A0=A0=A0=A0 &amp;&amp; unlikely(!hvm_wp_enabled(v)) <br>=A0=A0=
=A0=A0=A0=A0=A0=A0 &amp;&amp; regs-&gt;error_code =3D=3D (PFEC_write_access=
|PFEC_page_present)<br>=A0=A0=A0=A0=A0=A0=A0=A0 &amp;&amp; mfn_valid(gmfn) =
)<br>=A0=A0=A0 {<br>=A0=A0=A0=A0=A0=A0=A0 perfc_incr(shadow_fault_emulate_w=
p);<br>
=A0=A0=A0=A0=A0=A0=A0 goto emulate;<br>=A0=A0=A0 }</div>
<p>there is not opinion show that the guest is to write through read-only P=
TEs, but just a hvm_wp_enabled but mfn_valid address, does it because only =
the PTE is hvm_wp_enabled?<br>=A0<br>another question is that if for some r=
easons I want to design that the Guest PTE is not read-only, which means in=
 the page_fault situation I don&#39;t want xen to emulate, is there any fun=
ctionability or feasibility problems?<br>
=A0<br>thanks for your answer:)<br><br></p>
<div class=3D"gmail_quote">On Tue, Oct 11, 2011 at 5:27 PM, George Dunlap <=
span dir=3D"ltr">&lt;<a href=3D"mailto:George.Dunlap@eu.citrix.com">George.=
Dunlap@eu.citrix.com</a>&gt;</span> wrote:<br>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">The comments in xen/arch/mm/shad=
ow/multi.c:sh_page_fault() about emulation say:<br>=A0 =A0/* Need to emulat=
e accesses to page tables */<br>
and<br>=A0 =A0/* In HVM guests, we force CR0.WP always to be set, so that t=
he<br>=A0 =A0 * pagetables are always write-protected. =A0If the guest thin=
ks<br>=A0 =A0 * CR0.WP is clear, we must emulate faulting supervisor writes=
 to<br>=A0 =A0 * allow the guest to write through read-only PTEs. =A0Emulat=
e if the<br>
=A0 =A0 * fault was a non-user write to a present page. =A0*/<br><br>Do you=
 have some question about these?<br><br>Regarding NPT/EPT, as far as I know=
, the only reason to do emulation<br>is when the guest is doing MMIO. =A0Th=
e whole point of MMIO is to<br>
emulate access to devices.<br><br>=A0-George<br>
<div class=3D"im"><br>On Tue, Oct 11, 2011 at 2:58 AM, cc Luit &lt;<a href=
=3D"mailto:universalbillow@gmail.com">universalbillow@gmail.com</a>&gt; wro=
te:<br>&gt; Hi, everyone, I have a question,<br>&gt; in the shadow_page_fau=
lt or ept mechanism, xen will use the x86_emulation<br>
&gt; for some instructions, I&#39;m wondering why it must use it, if after =
we fix the<br>&gt; SPT or EPT table, just VMEntry to HVM to re-excute this =
instruction=A0 but not<br>&gt; emulate in xen, is there some problems?<br>
&gt;<br></div>
<div class=3D"im">&gt; can sb. tell me why?<br>&gt; thanks:)<br>&gt; --<br>=
&gt; - Luit @ Parallel Processing Institute, Fudan University<br>&gt;<br></=
div>&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" targe=
t=3D"_blank">http://lists.xensource.com/xen-devel</a><br>&gt;<br>&gt;<br></=
blockquote>
</div><br><br clear=3D"all"><br>-- <br>- Luit @ Parallel Processing Institu=
te, Fudan University=A0<br>

--20cf30563035f4f8fe04af03231d--


--===============0547279793==
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

--===============0547279793==--


From xen-devel-bounces@lists.xensource.com Tue Oct 11 03:16:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 03: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 1RDZNf-0003RC-4N; Tue, 11 Oct 2011 03:16:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDZKg-0002sE-Bl
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 03:13:12 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1318327987!21650898!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23376 invoked from network); 11 Oct 2011 10:13:07 -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; 11 Oct 2011 10:13:07 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 11:13:06 +0100
Message-Id: <4E9432CF020000780005AADF@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 11:13:03 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jinsong Liu" <jinsong.liu@intel.com>,
	"Yunhong Jiang" <yunhong.jiang@intel.com>
Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
References: <BC00F5384FCFC9499AF06F92E8B78A9E263B557B77@shsmsx502.ccr.corp.intel.com>
	<4E84ADF70200007800058882@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D2366A9B@shsmsx501.ccr.corp.intel.com>
	<4E858AF30200007800058A64@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D23D3B7D@shsmsx501.ccr.corp.intel.com>
	<4E92C369020000780005A68B@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E2693B8F9FB@shsmsx502.ccr.corp.intel.com>
	<4E941DA6020000780005AA9B@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E269B10E0CA@shsmsx502.ccr.corp.intel.com>
In-Reply-To: <BC00F5384FCFC9499AF06F92E8B78A9E269B10E0CA@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: "keir.xen@gmail.com" <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 11.10.11 at 11:51, "Liu, Jinsong" <jinsong.liu@intel.com> wrote:
> Jan Beulich wrote:
>> If the prefetch was from Xen space (only in guest context),
>> delivering a vMCE to the guest is pointless (and perhaps confusing to
>> the guest).=20
>>=20
>=20
> Yes, exactly. how about delay handle it as:
> * at mce isr
> 	if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs))
> 		xen panic;
> * at mce softirq
> 	if ( (srar error) && (EIPV =3D=3D0) && (broken page owned by =
hypervisor) )
> 		xen panic;

Possible, but I'm not convinced.

>>>   * guest may kill app, kernel thread, guest itself, or whatever;
>>>=20
>>> The error is still an error, w/ 2 possibilities in the future:
>>>   1. it may not be consumed as an SRAR error, system keep going, h/w
>>> mechanism may detect a SRAO error (i.e. memroy scrub) at some time
>>> point and handled then;=20
>>>   2. it may be consumed at some time point and a SRAR error
>>>    triggered again. At this time, 1). if srar occurred at hypervisor
>>>    context, xen will panic. or, 2). if srar occurred at guest
>>> context, xen kill the guest as a malicious one (as what the 2nd
>>> patch do), and move the page to broken page list;=20
>>>=20
>>> Considering the rare possibility of the above case, I think it's
>>> acceptable to handle it in this way. Thoughts?
>>=20
>> You're only discussing instruction fetches (which can be discarded),
>> but you're not covering the other example I gave (GDT access from
>> guest context - just like this is a ring-0 operations from the paging
>> unit's pov, this ought to be an out-of-context operation from MCE's
>> perspective).=20
>=20
> That would be data load error (EIPV=3D1), a sync error.

If indeed implemented that way in hardware, that would make the
handling ambiguous: A GDT access must not (unconditionally) be
attributed to the (pv) guest, as it is not a problem the guest can
(necessarily) deal with (considering the split page ownership of
what constitutes the GDT under Xen, the guest should only be
accountable for the non-reserved part of the GDT, the rest should
be attributed back to Xen).

The same would go for (perhaps speculative) page table walks.

Furthermore, data prefetching is possible too - how would a problem
there get reported?

Jan


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 03:17:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 03: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 1RDZOo-0003oR-TS; Tue, 11 Oct 2011 03:17:27 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDZLr-00036M-Um
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 03:14:24 -0700
X-Env-Sender: universalbillow@gmail.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1318328038!41713031!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21330 invoked from network); 11 Oct 2011 10:13:59 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 10:13:59 -0000
Received: by ywt32 with SMTP id 32so5495628ywt.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 03:14: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:date:message-id:subject:from:to
	:cc:content-type;
	bh=idIs9mM/Ryr+69mjgIUF1ofC13GihiMCWeyGJ2WZzv0=;
	b=ZlWJ5GuKWe2LFdDQZ+WZ7ara0TjKlPLK97ooU0r5R7JPC+dCuHzwxTRGyGImoJKPCl
	ABKFoDkoAhfG9g87qcV7OVOpE1mYY6nLL5TxatWbMhIoyJkgvXLmXPnYTPvOlrPBBjh6
	Y4pKu+hevVWwIsDYoRb7cuKzoIX2qFn5KlFIU=
MIME-Version: 1.0
Received: by 10.236.187.73 with SMTP id x49mr5409008yhm.121.1318328059298;
	Tue, 11 Oct 2011 03:14:19 -0700 (PDT)
Received: by 10.236.69.230 with HTTP; Tue, 11 Oct 2011 03:14:19 -0700 (PDT)
In-Reply-To: <20111011081829.GB88076@ocelot.phlegethon.org>
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
	<20111011081829.GB88076@ocelot.phlegethon.org>
Date: Tue, 11 Oct 2011 18:14:19 +0800
Message-ID: <CADWh-PGgZ1imeq5Zf4ngwPsLXw3nb2jrExEcSDVkFZT5UWggmg@mail.gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulation() in page_fault
From: cc Luit <universalbillow@gmail.com>
To: Tim Deegan <tim@xen.org>
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="===============1311803189=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1311803189==
Content-Type: multipart/alternative; boundary=20cf30563035ac01b004af032bf5

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

On Tue, Oct 11, 2011 at 4:18 PM, Tim Deegan <tim@xen.org> wrote:

> At 09:39 +0800 on 11 Oct (1318325957), cc Luit wrote:
> > Hi, everyone, I have a question,
> > in the shadow_page_fault or ept mechanism, xen will use the x86_emulation
> > for some instructions, I'm wondering why it must use it, if after we fix
> the
> > SPT or EPT table, just VMEntry to HVM to re-excute this instruction  but
> not
> > emulate in xen, is there some problems?
>
> > In the shadow pagetable code, we keep the shadows up-to-date by:
> > 1 - making all shadowed pagetables read-only;
> > 2 - intercepting the page faults when the guest writes to them; and
> > 3 - updating the guest pagetable and the shadow at the same time,
> >   with whatever change the guest was making.
>
> > For step 3 we need to emulate the instruction that caused the pagefault
> > so that we can tell what was being written.
>
> > There are other reasons for the emulator to be called (emulating MMIO
> > instructions, emulating real-mode &c) but that's why the shadow
> > pagetable code uses it.
>
> Thanks first of all, I know now it is the Eager mode that SPT is sync up
with GPT when guest want to change the page table using the instructions
emulator,  but if for some reason I don't want xen to emulate such an
instruction, but just VMEntry to HVM to retry, is there any feasibility
problems? in other words, in the old time, the shadow page is the Lazy mode,
that xen will not emulate, and the GPT and SPT is out of sync for some time,
besides the lose in performance, is there other problems?

> > Cheers,
>
> Tim.
>



-- 
- Luit @ Parallel Processing Institute, Fudan University

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

<br>
<div class=3D"gmail_quote">On Tue, Oct 11, 2011 at 4:18 PM, Tim Deegan <spa=
n dir=3D"ltr">&lt;<a href=3D"mailto:tim@xen.org">tim@xen.org</a>&gt;</span>=
 wrote:<br>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">
<div class=3D"im">At 09:39 +0800 on 11 Oct (1318325957), cc Luit wrote:<br>=
&gt; Hi, everyone, I have a question,<br>&gt; in the shadow_page_fault or e=
pt mechanism, xen will use the x86_emulation<br>&gt; for some instructions,=
 I&#39;m wondering why it must use it, if after we fix the<br>
&gt; SPT or EPT table, just VMEntry to HVM to re-excute this instruction =
=A0but not<br>&gt; emulate in xen, is there some problems?<br><br></div>&gt=
; In the shadow pagetable code, we keep the shadows up-to-date by:<br>&gt;=
=A01 - making all shadowed pagetables read-only;<br>
&gt;=A02 - intercepting the page faults when the guest writes to them; and<=
br>&gt;=A03 - updating the guest pagetable and the shadow at the same time,=
<br>&gt; =A0 with whatever change the guest was making.<br><br>&gt; For ste=
p 3 we need to emulate the instruction that caused the pagefault<br>
&gt; so that we can tell what was being written.<br><br>&gt; There are othe=
r reasons for the emulator to be called (emulating MMIO<br>&gt; instruction=
s, emulating real-mode &amp;c) but that&#39;s why the shadow<br>&gt; pageta=
ble code uses it.<br>
<br></blockquote>
<div>Thanks first of all, I know now it is the Eager mode that SPT is sync =
up with GPT when guest want to change the page table using the instructions=
 emulator,=A0 but if for some reason I don&#39;t want xen to emulate such a=
n instruction, but just VMEntry to HVM to retry, is there any feasibility p=
roblems? in other words, in the old time, the shadow page is the Lazy mode,=
 that xen will not emulate, and the GPT and SPT is out of sync for some tim=
e, besides the lose in performance, is there other problems?<br>
</div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">&gt; Cheers,<br><font color=3D"#=
888888"><br>Tim.<br></font></blockquote></div><br><br clear=3D"all"><br>-- =
<br>
- Luit @ Parallel Processing Institute, Fudan University=A0<br>

--20cf30563035ac01b004af032bf5--


--===============1311803189==
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

--===============1311803189==--


From xen-devel-bounces@lists.xensource.com Tue Oct 11 03:46:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 03:46:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDZqx-0004wD-69; Tue, 11 Oct 2011 03:46:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDZqG-0004jE-UF
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 03:45:49 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1318329944!19994584!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3611 invoked from network); 11 Oct 2011 10:45:45 -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;
	11 Oct 2011 10:45:45 -0000
Received: by ggnk4 with SMTP id k4so9579585ggn.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 03:45:44 -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=UtjyK5NzVmuBl+DlGUMXIhdSmTD2F1Q+UvtCOWBtzE8=;
	b=bdWs/95sZbYlQ0Sg0/0XLooWJQTtaTfmJZWao9c91eqNbFZ4gsy1WiduLVyzjNDi+l
	cVloblWw5v6yngfYbU48A70fRzA7EviFce32r+nwdMbhNMzxNTWNIXBZmOe1038Shmu6
	x87YD3BcDx7cRzoK/zFU6WHIR2nlOz38X92IQ=
MIME-Version: 1.0
Received: by 10.68.36.105 with SMTP id p9mr30056448pbj.3.1318329944188; Tue,
	11 Oct 2011 03:45:44 -0700 (PDT)
Received: by 10.142.225.20 with HTTP; Tue, 11 Oct 2011 03:45:44 -0700 (PDT)
In-Reply-To: <1318322434.21903.504.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317386580@loki> <84a27a9f39f29194a734.1317386585@loki>
	<20109.55057.491612.998568@mariner.uk.xensource.com>
	<CAPLaKK5AwPnrvfoPdbc8Ap6pyFqiBuvEWfFUmqSeN_-QR-TZQw@mail.gmail.com>
	<20115.499.220667.547225@mariner.uk.xensource.com>
	<CAPLaKK7ZBR9twbU=6nt1RXPh0a5uzw_jBRHMi1V4YLVuTxghqA@mail.gmail.com>
	<1318322434.21903.504.camel@zakaz.uk.xensource.com>
Date: Tue, 11 Oct 2011 12:45:44 +0200
X-Google-Sender-Auth: Rs5QANm0n2UYzGJYuNdH5Oyileo
Message-ID: <CAPLaKK53N11Q4w_LWc3Hq+-RdGrJ4jB8MBpU7baqzoCt8yzHTQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 5 of 9] libxl: only use interactive PyGrub
	mode when a console is attached
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
Content-Transfer-Encoding: quoted-printable
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

2011/10/11 Ian Campbell <Ian.Campbell@citrix.com>:
> On Mon, 2011-10-10 at 15:51 +0100, Roger Pau Monn=C3=A9 wrote:
>> > That sounds unfortunate. =C2=A0I agree with you.
>>
>> Well Ian Campbell proposed to use a timeout in select and drop data
>> when the timeout is hit, that what I've implemented in
>>
>> libxl: drop bootloader output if xenconsole file descriptor is not
>> available for writing
>>
>> The patch is quite simple and solves the problem, I don't think it
>> interferes with normal boot process, since a 1s timeout is quite high
>> for data to be delivered from xenconsoled_fd to the user if the
>> console is attached.
>
> The case where a user types
> =C2=A0 =C2=A0 =C2=A0 =C2=A0xl create /a/domain
> =C2=A0 =C2=A0 =C2=A0 =C2=A0xl console adomain
>
> might have a reasonably long delay in it before the console is
> connected. Increasing the libxl buffer size would mitigate that but
> you'd still have the problem of not reading from an fd if the cons is !=
=3D
> 0.
>
> Can you print out the actual values of the various producers and
> consumers at the point of the hang? (maybe track total bytes too for
> debug?)


The process gets stuck after writing 1022 bytes to xenconsole_fd, and
the buffer is 24 consumed 48 produced (although that varies, sometimes
I get ~700 produced and ~20 consumed, but the total written bits is
1022 always).

> Perhaps where we have:
> =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod =3D=3D xenconsoled_cons)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xenconsoled_prod =3D xenconsoled=
_cons =3D 0;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod =3D=3D bootloader_cons)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bootloader_prod =3D bootloader_c=
ons =3D 0;
> We could also add some suitable memmoves and associated prod/cons
> manipulation, such that the unconsumed data is always pulled to the head
> of the buffer. That might be a reasonably simple way to improve things
> and allow larger buffers to be used? More often than not the memmove
> won't be getting called since either XXX_prod =3D=3D XXX_cons or XXX_cons=
 is
> already 0, IOW having a partially consumed buffer would be unusual?

I don't really like moving memory around, since it's slow, but I think
implementing a circular buffer would really complicate things. I will
post a new patch that implements the following:

1. Increase buffer.
2. Use memmove to move memory to the head of the buffer and fill it
until the buffer is full.
3. On timeout and full buffer, drop data from the head of the buffer
(older data) and fill it with new data (move the buffer and append new
data at the end).

Do you thing this should be applied to both xenconsoled and
bootloader? since the only one giving problems is xenconsoled.

> Once we have a larger buffer which we always try to fill discarding data
> after a timeout when the buffer is full won't be so critical.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 04:05:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 04:05:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDa9V-0005ju-9E; Tue, 11 Oct 2011 04:05:42 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDa7E-0005VC-VG
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 04:03:22 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318330997!21811804!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4424 invoked from network); 11 Oct 2011 11:03:17 -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 Oct 2011 11:03:17 -0000
X-IronPort-AV: E=Sophos;i="4.68,522,1312156800"; 
   d="scan'208";a="8323305"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Oct 2011 11:03: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, 11 Oct 2011 12:03:17 +0100
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
	1RDa7B-00022v-6G; Tue, 11 Oct 2011 11:03:17 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RDa7B-0002Au-4Z;
	Tue, 11 Oct 2011 12:03:17 +0100
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: <20116.8821.125966.192458@mariner.uk.xensource.com>
Date: Tue, 11 Oct 2011 12:03:17 +0100
To: Guido =?iso-8859-1?Q?G=FCnther?= <agx@sigxcpu.org>
Subject: Re: [Xen-devel] [PATCH] pygrub: add debug flag
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <20111007113317.GA12379@bogon.sigxcpu.org>
References: <20111007084506.GA23628@bogon.sigxcpu.org>
	<1317980004.21903.315.camel@zakaz.uk.xensource.com>
	<20111007113317.GA12379@bogon.sigxcpu.org>
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

Guido Günther writes ("Re: [Xen-devel] [PATCH] pygrub: add debug flag"):
> New version with Signed-off attached.

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 Tue Oct 11 04:07:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 04:07:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDaBK-00067s-IK; Tue, 11 Oct 2011 04:07:34 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDa6z-0005UP-FV
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 04:03:17 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1318330981!34782958!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9771 invoked from network); 11 Oct 2011 11:03:02 -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;
	11 Oct 2011 11:03:02 -0000
X-IronPort-AV: E=Sophos;i="4.68,522,1312156800"; 
   d="scan'208";a="8323295"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Oct 2011 11:02:45 +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, 11 Oct 2011 12:02:45 +0100
Subject: Re: [Xen-devel] [PATCH 5 of 9] libxl: only use interactive PyGrub
	mode when a console is attached
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Tue, 11 Oct 2011 12:02:44 +0100
In-Reply-To: <CAPLaKK53N11Q4w_LWc3Hq+-RdGrJ4jB8MBpU7baqzoCt8yzHTQ@mail.gmail.com>
References: <patchbomb.1317386580@loki> <84a27a9f39f29194a734.1317386585@loki>
	<20109.55057.491612.998568@mariner.uk.xensource.com>
	<CAPLaKK5AwPnrvfoPdbc8Ap6pyFqiBuvEWfFUmqSeN_-QR-TZQw@mail.gmail.com>
	<20115.499.220667.547225@mariner.uk.xensource.com>
	<CAPLaKK7ZBR9twbU=6nt1RXPh0a5uzw_jBRHMi1V4YLVuTxghqA@mail.gmail.com>
	<1318322434.21903.504.camel@zakaz.uk.xensource.com>
	<CAPLaKK53N11Q4w_LWc3Hq+-RdGrJ4jB8MBpU7baqzoCt8yzHTQ@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1318330964.21903.546.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 Tue, 2011-10-11 at 11:45 +0100, Roger Pau MonnÃ© wrote:
> 2011/10/11 Ian Campbell <Ian.Campbell@citrix.com>:
> > On Mon, 2011-10-10 at 15:51 +0100, Roger Pau MonnÃ© wrote:
> >> > That sounds unfortunate.  I agree with you.
> >>
> >> Well Ian Campbell proposed to use a timeout in select and drop data
> >> when the timeout is hit, that what I've implemented in
> >>
> >> libxl: drop bootloader output if xenconsole file descriptor is not
> >> available for writing
> >>
> >> The patch is quite simple and solves the problem, I don't think it
> >> interferes with normal boot process, since a 1s timeout is quite high
> >> for data to be delivered from xenconsoled_fd to the user if the
> >> console is attached.
> >
> > The case where a user types
> >        xl create /a/domain
> >        xl console adomain
> >
> > might have a reasonably long delay in it before the console is
> > connected. Increasing the libxl buffer size would mitigate that but
> > you'd still have the problem of not reading from an fd if the cons is !=
> > 0.
> >
> > Can you print out the actual values of the various producers and
> > consumers at the point of the hang? (maybe track total bytes too for
> > debug?)
> 
> 
> The process gets stuck after writing 1022 bytes to xenconsole_fd, and
> the buffer is 24 consumed 48 produced (although that varies, sometimes
> I get ~700 produced and ~20 consumed, but the total written bits is
> 1022 always).

Thanks.

> 
> > Perhaps where we have:
> >        if (xenconsoled_prod == xenconsoled_cons)
> >            xenconsoled_prod = xenconsoled_cons = 0;
> >        if (bootloader_prod == bootloader_cons)
> >            bootloader_prod = bootloader_cons = 0;
> > We could also add some suitable memmoves and associated prod/cons
> > manipulation, such that the unconsumed data is always pulled to the head
> > of the buffer. That might be a reasonably simple way to improve things
> > and allow larger buffers to be used? More often than not the memmove
> > won't be getting called since either XXX_prod == XXX_cons or XXX_cons is
> > already 0, IOW having a partially consumed buffer would be unusual?
> 
> I don't really like moving memory around, since it's slow, but I think
> implementing a circular buffer would really complicate things.

I suspect that under normal use the move will never happen because we
will always have either written the entire buffer (so cons==prod,
cheaply reset both to zero) or none of it (so cons==0 and there is
nothing to do).

In the case you are suffering from I expect it will happen exactly once
and then we will be in the cons==0 state from then on unless we become
able to write something.

If that is correct then I don't think the move will be a problem in
practice. Also the buffers aren't all that big so moving them cant bee
all that expensive in the grand scheme of things.

libxl configures xenconsoled to have a limit of 1048576
(LIBXL_XENCONSOLE_LIMIT) by default. Hopefully we can get away with
something smaller for the bootloader interactions.

>  I will
> post a new patch that implements the following:
> 
> 1. Increase buffer.
> 2. Use memmove to move memory to the head of the buffer and fill it
> until the buffer is full.
> 3. On timeout and full buffer, drop data from the head of the buffer
> (older data) and fill it with new data (move the buffer and append new
> data at the end).

This sounds good.

When xenconsoled drops guest console data it seems to drop data from the
middle. I'm not sure why though. The checkin comment of 2b8efe11096b8
doesn't really go into detail on that aspect.

> Do you thing this should be applied to both xenconsoled and
> bootloader? since the only one giving problems is xenconsoled.

The bootloader buffer is currently larger so we probably don't see any
problems but in theory it's just as vulnerable? We probably don't need
to increase the buffer any further but the other changes probably make
sense.

> > Once we have a larger buffer which we always try to fill discarding data
> > after a timeout when the buffer is full won't be so critical.



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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 04:24:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 04:24:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDaRL-0007Qx-Uh; Tue, 11 Oct 2011 04:24:07 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDaQT-0007EE-1E; Tue, 11 Oct 2011 04:23:13 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318332189!34815749!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4085 invoked from network); 11 Oct 2011 11:23:09 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 11:23:09 -0000
Received: by wyh13 with SMTP id 13so9212047wyh.30
	for <multiple recipients>; Tue, 11 Oct 2011 04:23:09 -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:subject
	:content-type:content-transfer-encoding;
	bh=H6ia5BXbdG1IkB4L8/eAZLPFTdmSmXIbo3gnOHZQqtA=;
	b=xWizZsDme0irvmt68l0NjWWzLi+8NJY1Tr9frT0J/MELcDWdUEqL7jCUG69RtCgurN
	5d/hr2fvD8rJO8qrsJNgKHNe8MLnXPNhJ2Ecm8z9+gZ3WXDFyOq0hU0Lo7TUtGBM9Z78
	uIOMOiJG4Et+Cxtg9/DJYsQYbITN85vYlHcC0=
Received: by 10.216.187.146 with SMTP id y18mr720791wem.100.1318332188871;
	Tue, 11 Oct 2011 04:23:08 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id g20sm1144332wbp.13.2011.10.11.04.23.06
	(version=SSLv3 cipher=OTHER); Tue, 11 Oct 2011 04:23:07 -0700 (PDT)
Message-ID: <4E942719.50904@xen.org>
Date: Tue, 11 Oct 2011 12:23:05 +0100
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
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: 
Subject: [Xen-devel] XenSummit Asia Update, Open for Registration
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 everybody,
just to let you know that you can register for XenSummit Asia 
(http://xen.org/community/xensummit.html). All speakers, except for 
Samsung speakers are listed on the page. Hopefully I will get final 
confirmation of the Samsung speakers and topics  and can publish a 
finalized agenda later this week.
Best Regards
Lars

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 04:30:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 04:30:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDaXH-000078-Gl; Tue, 11 Oct 2011 04:30:15 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDaW8-0008LK-2C
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 04:29:04 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318332540!536494!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4000 invoked from network); 11 Oct 2011 11:29:01 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-13.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Oct 2011 11:29:01 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RDaW4-000NpG-E7; Tue, 11 Oct 2011 11:29:00 +0000
Date: Tue, 11 Oct 2011 12:29:00 +0100
From: Tim Deegan <tim@xen.org>
To: cc Luit <universalbillow@gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulation() in page_fault
Message-ID: <20111011112900.GF88076@ocelot.phlegethon.org>
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
	<20111011081829.GB88076@ocelot.phlegethon.org>
	<CADWh-PGgZ1imeq5Zf4ngwPsLXw3nb2jrExEcSDVkFZT5UWggmg@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CADWh-PGgZ1imeq5Zf4ngwPsLXw3nb2jrExEcSDVkFZT5UWggmg@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

At 18:14 +0800 on 11 Oct (1318356859), cc Luit wrote:
> On Tue, Oct 11, 2011 at 4:18 PM, Tim Deegan <tim@xen.org> wrote:
> 
> > At 09:39 +0800 on 11 Oct (1318325957), cc Luit wrote:
> > > Hi, everyone, I have a question,
> > > in the shadow_page_fault or ept mechanism, xen will use the x86_emulation
> > > for some instructions, I'm wondering why it must use it, if after we fix
> > the
> > > SPT or EPT table, just VMEntry to HVM to re-excute this instruction  but
> > not
> > > emulate in xen, is there some problems?
> >
> > > In the shadow pagetable code, we keep the shadows up-to-date by:
> > > 1 - making all shadowed pagetables read-only;
> > > 2 - intercepting the page faults when the guest writes to them; and
> > > 3 - updating the guest pagetable and the shadow at the same time,
> > >   with whatever change the guest was making.
> >
> > > For step 3 we need to emulate the instruction that caused the pagefault
> > > so that we can tell what was being written.
> >
> > > There are other reasons for the emulator to be called (emulating MMIO
> > > instructions, emulating real-mode &c) but that's why the shadow
> > > pagetable code uses it.
> >
> > Thanks first of all, I know now it is the Eager mode that SPT is sync up
> with GPT when guest want to change the page table using the instructions
> emulator,  but if for some reason I don't want xen to emulate such an
> instruction, but just VMEntry to HVM to retry, is there any feasibility
> problems?

The emulation can be avoided - in fact the current shadow pagetable
sometimes lets guests write to shadowed pages and fixes up the shadows
afterwards (this is called out-of-sync or oos in the code).

But if you just return to the guest and retry, the guest will take the
same fault again unless you have done something to change that.  If you
_have_ done something to make it OK, then just returning
EXCRET_fault_fixed from sh_page_fault will return to the guest and
retry the instruction.

Why do you want to avoid calling the emulator? What is your overall goal?
It might be that tinkering in the shadow pagetables isn't the best way
to acheive it.

> in other words, in the old time, the shadow page is the Lazy mode,
> that xen will not emulate, and the GPT and SPT is out of sync for some time,
> besides the lose in performance, is there other problems?

No, it was really about the performance cost of syncing up all the
shadows on a TLB flush.  In retrospect, having fixed some nasty bugs in
the OOS code, I suspect the old shadow code was also incorrect in some
ways but that was an implementation detail, noit architectural.

Tim.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 04:40:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 04:40:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDahD-0000hH-4p; Tue, 11 Oct 2011 04:40:31 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDagQ-0000U7-6r
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 04:39:42 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318333177!538210!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3453 invoked from network); 11 Oct 2011 11:39:39 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 11:39:39 -0000
Received: by iaqq3 with SMTP id q3so10931071iaq.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 04:39:37 -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=2xg8cr01oJ5P8+FBc3GhWI68Ozb3EK56n0zEeY1r0tU=;
	b=rHGWvrgHM47y93liyuP25M/zb96xjjuRaNMYtsxDoL9CnAgRzH7rKcPaOMOehVZJBw
	BK68Y4vpSA7MPzZEseb9PmsDH93mL3g59Kne/YqAspFKAKSN2c/HaLcSK2y12QQA30YC
	tBw+y7JxQ0CiqrcO3YZ1PeFpDKxivpEyqZKD4=
MIME-Version: 1.0
Received: by 10.42.176.74 with SMTP id bd10mr24930523icb.27.1318333177663;
	Tue, 11 Oct 2011 04:39:37 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Tue, 11 Oct 2011 04:39:37 -0700 (PDT)
In-Reply-To: <CADWh-PF1BOSN22-Ua41fuRDP9HsHJ3j=T9j7_Kc2Un8XnVMKOQ@mail.gmail.com>
References: <CAFLBxZbLcqpcJfFRSnT_C=5krhen44EzMD5pKcDNGhvLYmck=g@mail.gmail.com>
	<CADWh-PF1BOSN22-Ua41fuRDP9HsHJ3j=T9j7_Kc2Un8XnVMKOQ@mail.gmail.com>
Date: Tue, 11 Oct 2011 12:39:37 +0100
X-Google-Sender-Auth: 7TVzhKnMxNrjPBz1odv05cIGvs0
Message-ID: <CAFLBxZZ4vqiQjGONJHKmRZqES5SJv71A9_kUkux6qjvo3407Ng@mail.gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulat ion() in page_fault
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: cc Luit <universalbillow@gmail.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 Tue, Oct 11, 2011 at 11:12 AM, cc Luit <universalbillow@gmail.com> wrote:
> Yeah, I've seen this comments, I understand what it says in the before part,
> but not the last sentence, what does it mean by "non-user write"?

As you know, pagetables have a write-protect bit, such that writes to
that virtual address will cause a fault.

But there's an option in CR0 that can make the WP bit only work in
user mode, and not kernel mode.

So if the guest has CR0.WP clear, and the guest PTE is read-only, the
guest needs to see this:
1. In user mode, writes cause a page fault
2. In kernel mode, writes do not cause a page fault

But Xen needs to protect pagetables to detect changes to them.  So
what Xen needs is this:
1. In user mode, writes cause a page fault to be delivered to the guest
2. In kernel mode, writes to non-PTs do not cause a page fault to be
delivered to the guest
3. In kernel mode, writes to PTs cause a trap to xen, but do not cause
a page fault to be delivered to the guest

Unfortunately, there's no way to cause traps to xen in the case of #3
without also causing traps to Xen in case #2.  So the if statement is
designed to handle case #2.

> another question is that if for some reasons I want to design that the Guest
> PTE is not read-only, which means in the page_fault situation I don't want
> xen to emulate, is there any functionability or feasibility problems?

The basic problem is that in shadow mode, changes to the guest's
pagetables need to be propagated into the shadow pagetables.  If you
can figure out how to make that happen without trapping to Xen and
emulating, all the better. :-)

> thanks for your answer:)

bu ke qi! ;-)

 -George

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 05:02:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:02:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDb1x-0002II-Dm; Tue, 11 Oct 2011 05:01:58 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDays-00022o-MX
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 04:59:35 -0700
X-Env-Sender: jinsong.liu@intel.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1318334300!46060432!1
X-Originating-IP: [143.182.124.37]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8363 invoked from network); 11 Oct 2011 11:58:21 -0000
Received: from mga14.intel.com (HELO mga14.intel.com) (143.182.124.37)
	by server-11.tower-21.messagelabs.com with SMTP;
	11 Oct 2011 11:58:21 -0000
Received: from azsmga002.ch.intel.com ([10.2.17.35])
	by azsmga102.ch.intel.com with ESMTP; 11 Oct 2011 04:58:39 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.68,522,1312182000"; d="scan'208";a="25175856"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by AZSMGA002.ch.intel.com with ESMTP; 11 Oct 2011 04:58:38 -0700
Received: from pgsmsx101.gar.corp.intel.com (10.221.44.78) by
	pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Tue, 11 Oct 2011 19:58:37 +0800
Received: from shsmsx601.ccr.corp.intel.com (10.239.4.112) by
	PGSMSX101.gar.corp.intel.com (10.221.44.78) with Microsoft SMTP Server
	(TLS) id 14.1.323.3; Tue, 11 Oct 2011 19:58:37 +0800
Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by
	shsmsx601.ccr.corp.intel.com ([10.239.4.112]) with mapi;
	Tue, 11 Oct 2011 19:58:36 +0800
From: "Liu, Jinsong" <jinsong.liu@intel.com>
To: Jan Beulich <JBeulich@suse.com>, "Jiang, Yunhong" <yunhong.jiang@intel.com>
Date: Tue, 11 Oct 2011 19:58:43 +0800
Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Topic: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
Thread-Index: AcyH/mDw13VJnyA7TqaEOs2Jqz/4GAAAwoKw
Message-ID: <BC00F5384FCFC9499AF06F92E8B78A9E269B10E109@shsmsx502.ccr.corp.intel.com>
References: <BC00F5384FCFC9499AF06F92E8B78A9E263B557B77@shsmsx502.ccr.corp.intel.com>
	<4E84ADF70200007800058882@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D2366A9B@shsmsx501.ccr.corp.intel.com>
	<4E858AF30200007800058A64@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D23D3B7D@shsmsx501.ccr.corp.intel.com>
	<4E92C369020000780005A68B@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E2693B8F9FB@shsmsx502.ccr.corp.intel.com>
	<4E941DA6020000780005AA9B@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E269B10E0CA@shsmsx502.ccr.corp.intel.com>
	<4E9432CF020000780005AADF@nat28.tlf.novell.com>
In-Reply-To: <4E9432CF020000780005AADF@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: "keir.xen@gmail.com" <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

Jan Beulich wrote:
>>>> On 11.10.11 at 11:51, "Liu, Jinsong" <jinsong.liu@intel.com> wrote:
>> Jan Beulich wrote:
>>> If the prefetch was from Xen space (only in guest context),
>>> delivering a vMCE to the guest is pointless (and perhaps confusing
>>> to the guest).=20
>>>=20
>>=20
>> Yes, exactly. how about delay handle it as:
>> * at mce isr
>> 	if ( !(gstatus & MCG_STATUS_RIPV) && !guest_mode(regs)) 		xen panic;
>> * at mce softirq
>> 	if ( (srar error) && (EIPV =3D=3D0) && (broken page owned by
>> 		hypervisor) ) xen panic;
>=20
> Possible, but I'm not convinced.
>=20
>>>>   * guest may kill app, kernel thread, guest itself, or whatever;
>>>>=20
>>>> The error is still an error, w/ 2 possibilities in the future:
>>>>   1. it may not be consumed as an SRAR error, system keep going,
>>>> h/w mechanism may detect a SRAO error (i.e. memroy scrub) at some
>>>> time point and handled then;=20
>>>>   2. it may be consumed at some time point and a SRAR error
>>>>    triggered again. At this time, 1). if srar occurred at
>>>>    hypervisor context, xen will panic. or, 2). if srar occurred at
>>>> guest=20
>>>> context, xen kill the guest as a malicious one (as what the 2nd
>>>> patch do), and move the page to broken page list;
>>>>=20
>>>> Considering the rare possibility of the above case, I think it's
>>>> acceptable to handle it in this way. Thoughts?
>>>=20
>>> You're only discussing instruction fetches (which can be discarded),
>>> but you're not covering the other example I gave (GDT access from
>>> guest context - just like this is a ring-0 operations from the
>>> paging unit's pov, this ought to be an out-of-context operation
>>> from MCE's perspective).
>>=20
>> That would be data load error (EIPV=3D1), a sync error.
>=20
> If indeed implemented that way in hardware, that would make the
> handling ambiguous: A GDT access must not (unconditionally) be
> attributed to the (pv) guest, as it is not a problem the guest can
> (necessarily) deal with (considering the split page ownership of
> what constitutes the GDT under Xen, the guest should only be
> accountable for the non-reserved part of the GDT, the rest should
> be attributed back to Xen).
>=20
> The same would go for (perhaps speculative) page table walks.
>=20

Seems not ambiguous here: who own, who take.
If error caused by hypervisor access broken page, xen panic;
If error caused by guest access, guest would handle it (I guess normally ki=
ll itself);
If guest maliciously access again, it would be killed by hypervisor.

> Furthermore, data prefetching is possible too - how would a problem
> there get reported?
>=20

It may be reported as unkown error, or nothing, but not as srar data load e=
rror w/ EIPV=3D1.

Thanks,
Jinsong

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 05:08:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:08:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDb8P-0003WM-Sr; Tue, 11 Oct 2011 05:08:37 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDb3q-0002VW-OB
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:04:07 -0700
X-Env-Sender: universalbillow@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318334616!43752993!1
X-Originating-IP: [209.85.160.175]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18956 invoked from network); 11 Oct 2011 12:03:37 -0000
Received: from mail-gy0-f175.google.com (HELO mail-gy0-f175.google.com)
	(209.85.160.175)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 12:03:37 -0000
Received: by gyg8 with SMTP id 8so6510370gyg.6
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 05:03: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:date:message-id:subject:from:to
	:cc:content-type;
	bh=cDR4dZsJVOURn+1Cuq7YYEULaBBLQBNAnTTbs93atYQ=;
	b=Srw4ysr7dsN+8k2L/g27xAc/C1S/8rx18upNFw9BBmyCFGTQvu95bXhxpG3ub36gwZ
	VYTpc2l5V0SMPa3XrPnE0LpTHxCAWslyRj6mBb/0O/tT+afOALn/1NIxPhIaOElNk4uJ
	0GroKoN2b+AK0iFVxsX67RT0yF0IKD/f9f4t4=
MIME-Version: 1.0
Received: by 10.236.76.38 with SMTP id a26mr29925045yhe.53.1318334629886; Tue,
	11 Oct 2011 05:03:49 -0700 (PDT)
Received: by 10.236.69.230 with HTTP; Tue, 11 Oct 2011 05:03:49 -0700 (PDT)
In-Reply-To: <20111011112900.GF88076@ocelot.phlegethon.org>
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
	<20111011081829.GB88076@ocelot.phlegethon.org>
	<CADWh-PGgZ1imeq5Zf4ngwPsLXw3nb2jrExEcSDVkFZT5UWggmg@mail.gmail.com>
	<20111011112900.GF88076@ocelot.phlegethon.org>
Date: Tue, 11 Oct 2011 20:03:49 +0800
Message-ID: <CADWh-PFLM4ngx9Nyje1r2kpjaEgBRUQhQ01MDV1Lj0C5jtTJHQ@mail.gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulation() in page_fault
From: cc Luit <universalbillow@gmail.com>
To: Tim Deegan <tim@xen.org>
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="===============1311266334=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1311266334==
Content-Type: multipart/alternative; boundary=20cf303bf65c4f3c6a04af04b30d

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

On Tue, Oct 11, 2011 at 7:29 PM, Tim Deegan <tim@xen.org> wrote:

>  At 18:14 +0800 on 11 Oct (1318356859), cc Luit wrote:
> > On Tue, Oct 11, 2011 at 4:18 PM, Tim Deegan <tim@xen.org> wrote:
> >
> > > At 09:39 +0800 on 11 Oct (1318325957), cc Luit wrote:
> > > > Hi, everyone, I have a question,
> > > > in the shadow_page_fault or ept mechanism, xen will use the
> x86_emulation
> > > > for some instructions, I'm wondering why it must use it, if after we
> fix
> > > the
> > > > SPT or EPT table, just VMEntry to HVM to re-excute this instruction
>  but
> > > not
> > > > emulate in xen, is there some problems?
> > >
> > > > In the shadow pagetable code, we keep the shadows up-to-date by:
> > > > 1 - making all shadowed pagetables read-only;
> > > > 2 - intercepting the page faults when the guest writes to them; and
> > > > 3 - updating the guest pagetable and the shadow at the same time,
> > > >   with whatever change the guest was making.
> > >
> > > > For step 3 we need to emulate the instruction that caused the
> pagefault
> > > > so that we can tell what was being written.
> > >
> > > > There are other reasons for the emulator to be called (emulating MMIO
> > > > instructions, emulating real-mode &c) but that's why the shadow
> > > > pagetable code uses it.
> > >
> > > Thanks first of all, I know now it is the Eager mode that SPT is sync
> up
> > with GPT when guest want to change the page table using the instructions
> > emulator,  but if for some reason I don't want xen to emulate such an
> > instruction, but just VMEntry to HVM to retry, is there any feasibility
> > problems?
>
> > The emulation can be avoided - in fact the current shadow pagetable
> > sometimes lets guests write to shadowed pages and fixes up the shadows
> > afterwards (this is called out-of-sync or oos in the code).
>
> > But if you just return to the guest and retry, the guest will take the
> > same fault again unless you have done something to change that.  If you
> > _have_ done something to make it OK, then just returning
> > EXCRET_fault_fixed from sh_page_fault will return to the guest and
> > retry the instruction.
>
I've read a slide said that in Lazy mode:
 when guest os modify the GPT, do not emulate (there is no
write-protected PTE, so guest can directly modify it)
 1) when the access right ascension, the guest OS will INVLPG to shootdown
TLB, so hypervisor can catch the INPLPG inst to sync  up the SPT/GPT
   2) when access right down, when guest OS access this page it will trap to
xen, xen will catch #PF to sync up SPT/GPT,

I'm not sure if this can work?


> Why do you want to avoid calling the emulator? What is your overall goal?
> It might be that tinkering in the shadow pagetables isn't the best way
> to acheive it.

because we're doing some research of security aspect about xen, what's our
goal is avoid xen to access the HVM's memory in the page fault situation,
it's hard to say it out in short words, we have thought a lot of ways but
there is no a simpler one than avoiding the emulation in page_fault.

Thanks

>
> > in other words, in the old time, the shadow page is the Lazy mode,
> > that xen will not emulate, and the GPT and SPT is out of sync for some
> time,
> > besides the lose in performance, is there other problems?
>
> No, it was really about the performance cost of syncing up all the
> shadows on a TLB flush.  In retrospect, having fixed some nasty bugs in
> the OOS code, I suspect the old shadow code was also incorrect in some
> ways but that was an implementation detail, noit architectural.
>
> Tim.
>



-- 
- Luit @ Parallel Processing Institute, Fudan University

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

<br><br>
<div class=3D"gmail_quote">On Tue, Oct 11, 2011 at 7:29 PM, Tim Deegan <spa=
n dir=3D"ltr">&lt;<a href=3D"mailto:tim@xen.org">tim@xen.org</a>&gt;</span>=
 wrote:<br>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">
<div>
<div></div>
<div class=3D"h5">At 18:14 +0800 on 11 Oct (1318356859), cc Luit wrote:<br>=
&gt; On Tue, Oct 11, 2011 at 4:18 PM, Tim Deegan &lt;<a href=3D"mailto:tim@=
xen.org">tim@xen.org</a>&gt; wrote:<br>&gt;<br>&gt; &gt; At 09:39 +0800 on =
11 Oct (1318325957), cc Luit wrote:<br>
&gt; &gt; &gt; Hi, everyone, I have a question,<br>&gt; &gt; &gt; in the sh=
adow_page_fault or ept mechanism, xen will use the x86_emulation<br>&gt; &g=
t; &gt; for some instructions, I&#39;m wondering why it must use it, if aft=
er we fix<br>
&gt; &gt; the<br>&gt; &gt; &gt; SPT or EPT table, just VMEntry to HVM to re=
-excute this instruction =A0but<br>&gt; &gt; not<br>&gt; &gt; &gt; emulate =
in xen, is there some problems?<br>&gt; &gt;<br>&gt; &gt; &gt; In the shado=
w pagetable code, we keep the shadows up-to-date by:<br>
&gt; &gt; &gt; 1 - making all shadowed pagetables read-only;<br>&gt; &gt; &=
gt; 2 - intercepting the page faults when the guest writes to them; and<br>=
&gt; &gt; &gt; 3 - updating the guest pagetable and the shadow at the same =
time,<br>
&gt; &gt; &gt; =A0 with whatever change the guest was making.<br>&gt; &gt;<=
br>&gt; &gt; &gt; For step 3 we need to emulate the instruction that caused=
 the pagefault<br>&gt; &gt; &gt; so that we can tell what was being written=
.<br>
&gt; &gt;<br>&gt; &gt; &gt; There are other reasons for the emulator to be =
called (emulating MMIO<br>&gt; &gt; &gt; instructions, emulating real-mode =
&amp;c) but that&#39;s why the shadow<br>&gt; &gt; &gt; pagetable code uses=
 it.<br>
&gt; &gt;<br>&gt; &gt; Thanks first of all, I know now it is the Eager mode=
 that SPT is sync up<br>&gt; with GPT when guest want to change the page ta=
ble using the instructions<br>&gt; emulator, =A0but if for some reason I do=
n&#39;t want xen to emulate such an<br>
&gt; instruction, but just VMEntry to HVM to retry, is there any feasibilit=
y<br>&gt; problems?<br><br></div></div>&gt; The emulation can be avoided - =
in fact the current shadow pagetable<br>&gt; sometimes lets guests write to=
 shadowed pages and fixes up the shadows<br>
&gt; afterwards (this is called out-of-sync or oos in the code).<br><br>&gt=
; But if you just return to the guest and retry, the guest will take the<br=
>&gt; same fault again unless you have done something to change that. =A0If=
 you<br>
&gt; _have_ done something to make it OK, then just returning<br>&gt; EXCRE=
T_fault_fixed from sh_page_fault will return to the guest and<br>&gt; retry=
 the instruction.<br></blockquote>
<div>I&#39;ve read a slide said that in Lazy mode:</div>
<div>=A0when guest os modify the GPT, do not emulate (there is no write-pro=
tected=A0PTE, so guest can directly modify it)</div>
<div>=A01) when the access right ascension, the guest=A0OS will INVLPG to s=
hootdown TLB, so hypervisor can=A0catch the INPLPG inst to sync=A0 up the S=
PT/GPT</div>
<div>=A0=A0 2) when access right down, when guest OS access this page it wi=
ll trap to xen, xen will catch #PF to sync up SPT/GPT, </div>
<div>=A0</div>
<div>I&#39;m not sure if this can work?</div>
<div>=A0</div>
<div><br>&gt; Why do you want to avoid calling the emulator? What is your o=
verall goal?<br>&gt; It might be that tinkering in the shadow pagetables is=
n&#39;t the best way<br>&gt; to acheive it.</div>
<div>=A0</div>
<div>because we&#39;re doing some research of security aspect about xen, wh=
at&#39;s our goal is avoid xen to=A0access=A0the HVM&#39;s memory in the pa=
ge fault situation, it&#39;s hard to say it out in short words, we have tho=
ught a lot of ways but there is no a simpler one than avoiding the emulatio=
n in page_fault.</div>

<div>=A0</div>
<div>Thanks</div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">
<div class=3D"im"><br>&gt; in other words, in the old time, the shadow page=
 is the Lazy mode,<br>&gt; that xen will not emulate, and the GPT and SPT i=
s out of sync for some time,<br>&gt; besides the lose in performance, is th=
ere other problems?<br>
<br></div>No, it was really about the performance cost of syncing up all th=
e<br>shadows on a TLB flush. =A0In retrospect, having fixed some nasty bugs=
 in<br>the OOS code, I suspect the old shadow code was also incorrect in so=
me<br>
ways but that was an implementation detail, noit architectural.<br><font co=
lor=3D"#888888"><br>Tim.<br></font></blockquote></div><br><br clear=3D"all"=
><br>-- <br>- Luit @ Parallel Processing Institute, Fudan University=A0<br>

--20cf303bf65c4f3c6a04af04b30d--


--===============1311266334==
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

--===============1311266334==--


From xen-devel-bounces@lists.xensource.com Tue Oct 11 05:09:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:09:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDb9L-0003td-VI; Tue, 11 Oct 2011 05:09:35 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDb49-0002ZB-Tr
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:04:15 -0700
X-Env-Sender: zhengwang.ruan@gmail.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318334649!542373!1
X-Originating-IP: [209.85.210.65]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12209 invoked from network); 11 Oct 2011 12:04:10 -0000
Received: from mail-pz0-f65.google.com (HELO mail-pz0-f65.google.com)
	(209.85.210.65)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 12:04:10 -0000
Received: by pzk5 with SMTP id 5so5074951pzk.0
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 05:04:08 -0700 (PDT)
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:content-type:content-transfer-encoding;
	bh=VmRZ/IvoY+/aRBS3ogh47TahOGkPh9UmZ5VnvPB2RW0=;
	b=gFLNLArL7VQEbmH+Gey9+dpa3YN6dnwetkmIHYj0YuqM6TQGFZke2i+EHzCYTtRWfm
	SusCC2j1xcFCfWsvbupUEzJtdNUrvqtTMOGwm4hDVJU8eEwR+PRHMLMCD57fWQ5rx/w9
	juYto9RJEH6gOQfdNMMmfABTCEoknDK4BzsCo=
Received: by 10.68.30.199 with SMTP id u7mr35218156pbh.74.1318334648715;
	Tue, 11 Oct 2011 05:04:08 -0700 (PDT)
Received: from [192.168.1.106] ([180.184.200.59])
	by mx.google.com with ESMTPS id v7sm36074832pbr.10.2011.10.11.05.04.07
	(version=SSLv3 cipher=OTHER); Tue, 11 Oct 2011 05:04:08 -0700 (PDT)
Message-ID: <4E9430B5.70608@gmail.com>
Date: Tue, 11 Oct 2011 20:04:05 +0800
From: "Zhengwang Ruan (Royo)" <zhengwang.ruan@gmail.com>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN;
	rv:1.9.2.23) Gecko/20110920 Thunderbird/3.1.15
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] why xen use x86_emulation() in page_fault
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
	<20111011081829.GB88076@ocelot.phlegethon.org>
In-Reply-To: <20111011081829.GB88076@ocelot.phlegethon.org>
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

Hi Tim,

I am a freshman to this member-list and interested in some contents in 
your reply, looking forward to your answer. :)


At 2011-10-11 16:18, Tim Deegan wrote:
> At 09:39 +0800 on 11 Oct (1318325957), cc Luit wrote:
>> Hi, everyone, I have a question,
>> in the shadow_page_fault or ept mechanism, xen will use the x86_emulation
>> for some instructions, I'm wondering why it must use it, if after we fix the
>> SPT or EPT table, just VMEntry to HVM to re-excute this instruction  but not
>> emulate in xen, is there some problems?
> In the shadow pagetable code, we keep the shadows up-to-date by:
>   1 - making all shadowed pagetables read-only;
>   2 - intercepting the page faults when the guest writes to them; and
>   3 - updating the guest pagetable and the shadow at the same time,
>       with whatever change the guest was making.
>
> For step 3 we need to emulate the instruction that caused the pagefault
> so that we can tell what was being written.
>
> There are other reasons for the emulator to be called (emulating MMIO
> instructions, emulating real-mode&c) but that's why the shadow
> pagetable code uses it.

1, Does this emulator set up a emulation environment to execute 
instructions for a VM(guest OS)?
2, Real-mode code you talked above is used to execute the first 16-bit 
initial code of a guest OS? Does it have other usages in current Xen 
implementation?

Thanks,
Royo (Zhengwang)

> Cheers,
>
> Tim.
>
> _______________________________________________
> 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 Oct 11 05:11:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:11:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDbBc-0004Ng-Nc; Tue, 11 Oct 2011 05:11:56 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbB8-0004BU-QU
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:11:27 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-21.messagelabs.com!1318335080!37569328!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19310 invoked from network); 11 Oct 2011 12:11:21 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-2.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Oct 2011 12:11:21 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1318335083; l=474;
	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=aYCxWJgxr/0A0vkN1OQgUYQAXnQ=;
	b=JHC/f4cgq2nzR7H30Iw9kAA8WVGLi0JoFqMVJTNk9LuUSypkwvobHfl13nNcEKehDNW
	ChvqDwyGUYqQ22v42TsbjhQYpCbSuSgtk7+DYJS4CWcS95KDZteaKRO3mgdAZy7AqqMOV
	cvPXHkmyCWc4qii9LuzYRHiaC1Fz6CTA6xQ=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjzoQFXLy
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-119-065.pools.arcor-ip.net [88.65.119.65])
	by smtp.strato.de (jimi mo5) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id Y067d3n9BB73l1
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 14:11:06 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 3230118890
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 14:11:05 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 5a5181b8c31983ff2f465f85a41df784a5397ed5
Message-Id: <5a5181b8c31983ff2f46.1318335064@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 11 Oct 2011 14:11:04 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] check for 'flex' before starting tools 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

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1318335031 -7200
# Node ID 5a5181b8c31983ff2f465f85a41df784a5397ed5
# Parent  4b0907c6a08c348962bd976c2976257b412408be
check for 'flex' before starting tools build.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 4b0907c6a08c -r 5a5181b8c319 tools/check/check_flex
--- /dev/null
+++ b/tools/check/check_flex
@@ -0,0 +1,6 @@
+#!/bin/sh
+# CHECK-BUILD
+
+. ./funcs.sh
+
+has_or_fail flex

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 05:20:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:20:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDbJf-0004ra-S9; Tue, 11 Oct 2011 05:20:15 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbJ0-0004f4-El
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:19:34 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-6.tower-21.messagelabs.com!1318335550!41735602!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28854 invoked from network); 11 Oct 2011 12:19:10 -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 DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Oct 2011 12:19:10 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1318335570; l=570;
	s=domk; d=aepfle.de;
	h=In-Reply-To:Content-Type:MIME-Version:References:Subject:To:From:
	Date:X-RZG-CLASS-ID:X-RZG-AUTH;
	bh=DkE9EP0kYxWdz3TdPVqVqAFxzzE=;
	b=jLpvUnJ0y2qnbAsqWOEngtw4CtEVvMWtVgOjUOUsOe7BXmr9twUKe3rIekTXfKVBBKr
	7iwaZqWgNSS/QVIFiU0wa9GmVjX5p6Tm5C687fuGhJwHwwxFiYp1f6cgFwZD1/CE7W5lM
	D1BNCZ/GmoRqPMycJu6Qhvghz76sLnZHbwY=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjzoQFXLy
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-119-065.pools.arcor-ip.net [88.65.119.65])
	by smtp.strato.de (cohen mo53) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id 2055dcn9BCDeen
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 14:19:18 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id F0C8A18B6F; Tue, 11 Oct 2011 14:19:17 +0200 (CEST)
Date: Tue, 11 Oct 2011 14:19:17 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] [PATCH] check for 'flex' before starting tools build
Message-ID: <20111011121917.GA6381@aepfle.de>
References: <5a5181b8c31983ff2f46.1318335064@probook.site>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <5a5181b8c31983ff2f46.1318335064@probook.site>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, Oct 11, Olaf Hering wrote:

> # HG changeset patch
> # User Olaf Hering <olaf@aepfle.de>
> # Date 1318335031 -7200
> # Node ID 5a5181b8c31983ff2f465f85a41df784a5397ed5
> # Parent  4b0907c6a08c348962bd976c2976257b412408be
> check for 'flex' before starting tools build.

A similar check should be added for bison.

After todays 'hg pull -u' and 'make tools xen', two files were modified:

 # hg st
M tools/libxl/libxlu_disk_l.c
M tools/libxl/libxlu_disk_l.h

Shouldnt they be generated files in the first place,
and not part of the SCM?

Olaf

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 05:21:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:21:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDbL8-0005Ep-M9; Tue, 11 Oct 2011 05:21:46 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbKZ-00052n-66
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:21:11 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-4.tower-21.messagelabs.com!1318335629!63693764!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25332 invoked from network); 11 Oct 2011 12:20:29 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-4.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Oct 2011 12:20:29 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RDbKV-000O2H-T2; Tue, 11 Oct 2011 12:21:07 +0000
Date: Tue, 11 Oct 2011 13:21:07 +0100
From: Tim Deegan <tim@xen.org>
To: cc Luit <universalbillow@gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulation() in page_fault
Message-ID: <20111011122107.GG88076@ocelot.phlegethon.org>
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
	<20111011081829.GB88076@ocelot.phlegethon.org>
	<CADWh-PGgZ1imeq5Zf4ngwPsLXw3nb2jrExEcSDVkFZT5UWggmg@mail.gmail.com>
	<20111011112900.GF88076@ocelot.phlegethon.org>
	<CADWh-PFLM4ngx9Nyje1r2kpjaEgBRUQhQ01MDV1Lj0C5jtTJHQ@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CADWh-PFLM4ngx9Nyje1r2kpjaEgBRUQhQ01MDV1Lj0C5jtTJHQ@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

At 20:03 +0800 on 11 Oct (1318363429), cc Luit wrote:
> I've read a slide said that in Lazy mode:
>  when guest os modify the GPT, do not emulate (there is no
> write-protected PTE, so guest can directly modify it)
>  1) when the access right ascension, the guest OS will INVLPG to shootdown
> TLB, so hypervisor can catch the INPLPG inst to sync  up the SPT/GPT
>    2) when access right down, when guest OS access this page it will trap to
> xen, xen will catch #PF to sync up SPT/GPT,
> 
> I'm not sure if this can work?

I don't quite understand your English, but yes, you can let the guest
write to page tables and sync up the shadows afterwards.  You need to
sync the shadows whenever real hardware would re-read pagetables.  That
is, at least: 
 - When the guest executes INVLPG
 - When the guest writes to CR3
 - When the shadowing code adds a new l2e, l3e or l4e that points to an
   existing shadow. 
(and possibly some other cases I don;t remember right now).  

> > Why do you want to avoid calling the emulator? What is your overall goal?
> > It might be that tinkering in the shadow pagetables isn't the best way
> > to acheive it.
> 
> because we're doing some research of security aspect about xen, what's our
> goal is avoid xen to access the HVM's memory in the page fault situation,
> it's hard to say it out in short words, we have thought a lot of ways but
> there is no a simpler one than avoiding the emulation in page_fault.

Ah, I see - this is following on from the CloudVisor work, is it? 

Why don't you just use EPT/NPT instead of shadow pagetables?  That code
is a lot simpler and the end result is easier to validate than shadow
pagetables are.  Is it particularly important to support shadow pagetables?

In either case, there are some instructions that Xen will always
emulate - for example: 
 - MMIO accesses to emulated hardware
 - Some real-mode instructions on older Intel hardware

so even if you rewrote the shadow pagetable code not to emulate PT writes
you still have to handle those.  

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 Oct 11 05:28:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:28:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDbRP-0005hO-Ix; Tue, 11 Oct 2011 05:28:16 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbQt-0005Ur-G8
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:27:44 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1318336059!21675195!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30216 invoked from network); 11 Oct 2011 12:27:40 -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;
	11 Oct 2011 12:27:40 -0000
Received: by wyh13 with SMTP id 13so9292351wyh.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 05:27:39 -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:user-agent:date:from:to:cc;
	bh=TneUHqekAsDv5D8bX6rxra81j0JDW0erfFoMVhcMEKs=;
	b=xcmLf65ZNSXMeQyvdC3FdCl0QmFcpULAxYRu9yUelug75wP/fwZB6f8zByUxdXaU/r
	SchkL8tfzJPZMsc+fTzeTFZECVhqKYHLU0EzH0A5hQ0TZJ1uChK05q5diRcTWcsWA7kc
	lB5bNe6M9YnxrYDYY/ATn/zVMn9Izul+vD1Rg=
Received: by 10.216.141.143 with SMTP id g15mr461465wej.10.1318336059768;
	Tue, 11 Oct 2011 05:27:39 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id h39sm38310439wbo.0.2011.10.11.05.27.37
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 11 Oct 2011 05:27:38 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 2fb4bf8c16cd35ddc0bf7ddc7ff8fda4b9678211
Message-Id: <2fb4bf8c16cd35ddc0bf.1318336005@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Tue, 11 Oct 2011 14:26:45 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH] libxl: reimplement buffer for bootloading and
 drop data if buffer 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 Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1318335991 -7200
# Node ID 2fb4bf8c16cd35ddc0bf7ddc7ff8fda4b9678211
# Parent  64f17c7e6c33e5f1c22711ae9cbdcbe191c20062
libxl: reimplement buffer for bootloading and drop data if buffer is full.

Implement a buffer for the bootloading process that appends data to the end until it's full. Drop output from bootloader if a timeout has occurred and the buffer is full. Prevents the bootloader from getting stuck when using ptys with small buffers.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 64f17c7e6c33 -r 2fb4bf8c16cd tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Tue Oct 11 10:26:32 2011 +0200
+++ b/tools/libxl/libxl_bootloader.c	Tue Oct 11 14:26:31 2011 +0200
@@ -21,6 +21,7 @@
 
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/ioctl.h>
 
 #include "libxl.h"
 #include "libxl_internal.h"
@@ -28,7 +29,8 @@
 #include "flexarray.h"
 
 #define XENCONSOLED_BUF_SIZE 16
-#define BOOTLOADER_BUF_SIZE 1024
+#define BOOTLOADER_BUF_SIZE 4096
+#define BOOTLOADER_TIMEOUT 1
 
 static char **make_bootloader_args(libxl__gc *gc,
                                    libxl_domain_build_info *info,
@@ -165,10 +167,11 @@ static pid_t fork_exec_bootloader(int *m
  */
 static char * bootloader_interact(libxl__gc *gc, int xenconsoled_fd, int bootloader_fd, int fifo_fd)
 {
-    int ret;
+    int ret, read_ahead, timeout = 0;
 
     size_t nr_out = 0, size_out = 0;
     char *output = NULL;
+    struct timeval wait;
 
     /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
     int xenconsoled_prod = 0, xenconsoled_cons = 0;
@@ -177,6 +180,10 @@ static char * bootloader_interact(libxl_
     int bootloader_prod = 0, bootloader_cons = 0;
     char bootloader_buf[BOOTLOADER_BUF_SIZE];
 
+    /* Set timeout to 1s before starting to discard data */
+    wait.tv_sec = BOOTLOADER_TIMEOUT;
+    wait.tv_usec = 0;
+
     while(1) {
         fd_set wsel, rsel;
         int nfds;
@@ -185,15 +192,26 @@ static char * bootloader_interact(libxl_
             xenconsoled_prod = xenconsoled_cons = 0;
         if (bootloader_prod == bootloader_cons)
             bootloader_prod = bootloader_cons = 0;
+        /* Move buffers around to drop already consumed data */
+        if (xenconsoled_prod > 0) {
+            xenconsoled_prod -= xenconsoled_cons;
+            memmove(xenconsoled_buf, &xenconsoled_buf[xenconsoled_cons], xenconsoled_prod);
+            xenconsoled_cons = 0;
+        }
+        if (bootloader_prod > 0) {
+            bootloader_prod -= bootloader_cons;
+            memmove(bootloader_buf, &bootloader_buf[bootloader_cons], bootloader_prod);
+            bootloader_cons = 0;
+        }
 
         FD_ZERO(&rsel);
         FD_SET(fifo_fd, &rsel);
         nfds = fifo_fd + 1;
-        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0)) {
+        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0) || timeout) {
             FD_SET(xenconsoled_fd, &rsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
         }
-        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0)) {
+        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0) || timeout) {
             FD_SET(bootloader_fd, &rsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
@@ -208,12 +226,23 @@ static char * bootloader_interact(libxl_
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
-        ret = select(nfds, &rsel, &wsel, NULL, NULL);
+        ret = select(nfds, &rsel, &wsel, NULL, &wait);
         if (ret < 0)
             goto out_err;
+        if (ret == 0) {
+            timeout = 1;
+            continue;
+        }
+        timeout = 0;
 
         /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
         if (FD_ISSET(xenconsoled_fd, &rsel)) {
+            if (xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
+                if (ioctl(xenconsoled_fd, FIONREAD, &read_ahead) < 0)
+                    goto out_err;
+                memmove(xenconsoled_buf, &xenconsoled_buf[read_ahead], XENCONSOLED_BUF_SIZE - read_ahead);
+                xenconsoled_prod -= read_ahead;
+            }
             ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;
@@ -230,6 +259,12 @@ static char * bootloader_interact(libxl_
 
         /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
         if (FD_ISSET(bootloader_fd, &rsel)) {
+            if (bootloader_prod == BOOTLOADER_BUF_SIZE) {
+                if (ioctl(bootloader_fd, FIONREAD, &read_ahead) < 0)
+                    goto out_err;
+                memmove(bootloader_buf, &bootloader_buf[read_ahead], BOOTLOADER_BUF_SIZE - read_ahead);
+                bootloader_prod -= read_ahead;
+            }
             ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 05:36:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05: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 1RDbZg-0007mw-17; Tue, 11 Oct 2011 05:36:48 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbZB-0007bB-Vi
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:36:18 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318336547!41399470!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26984 invoked from network); 11 Oct 2011 12:35:47 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-3.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 11 Oct 2011 12:35:47 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1318336574; l=7149;
	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=dCwmgzune2RcV4daKvl+QaKfmKU=;
	b=AjCNwS6XJTX5MgkXAKM7y/p331uHmxd3lDbzwGRszK4BjtVS4g1BhTPdB6xTdMHNGwU
	DjJkFCaWxxukEQODt1rPdcIuN+QV4BdaHvlMbn9o8eVq3bmsUhBu8vyY5VAaRjRNqJtpJ
	uO1boOwU8cX5NL0cmXU3nnnlako//SErnMw=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjzoQFXLy
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-119-065.pools.arcor-ip.net [88.65.119.65])
	by smtp.strato.de (klopstock mo10) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 9009ban9BC9Ukg
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 14:36:12 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 402F718B6E
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 14:36:11 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: bdd49540f1e1c803d01c88adb67c6ce01e2d00d8
Message-Id: <bdd49540f1e1c803d01c.1318336570@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 11 Oct 2011 14:36:10 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] xenpaging: handle evict failures
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318336551 -7200
# Node ID bdd49540f1e1c803d01c88adb67c6ce01e2d00d8
# Parent  4b0907c6a08c348962bd976c2976257b412408be
xenpaging: handle evict failures

Evict of a nominated gfn must fail if some other process mapped the
page without checking the p2mt of that gfn first.
Add a check to cancel eviction if the page usage count is not 1.

Handle the possible eviction failure in the page-in paths.
After nominate and before evict, something may check the p2mt and call
populate. Handle this case and let the gfn enter the page-in path. The
gfn may still be connected to a mfn, so there is no need to allocate a
new page in prep.

Adjust do_mmu_update to return -ENOENT only if the gfn has entered the
page-in path and if it is not yet connected to a mfn. Otherwise
linux_privcmd_map_foreign_bulk() may loop forever.

Add MEM_EVENT_FLAG_EVICT_FAIL to inform pager that a page-in request for
a possible not-evicted page was sent. xenpaging does currently not need
that flag because failure to evict a gfn will be caught.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 4b0907c6a08c -r bdd49540f1e1 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -734,10 +734,12 @@ int main(int argc, char *argv[])
             }
             else
             {
-                DPRINTF("page already populated (domain = %d; vcpu = %d;"
-                        " gfn = %"PRIx64"; paused = %d)\n",
-                        paging->mem_event.domain_id, req.vcpu_id,
-                        req.gfn, req.flags & MEM_EVENT_FLAG_VCPU_PAUSED);
+                DPRINTF("page %s populated (domain = %d; vcpu = %d;"
+                        " gfn = %"PRIx64"; paused = %d; evict_fail = %d)\n",
+                        req.flags & MEM_EVENT_FLAG_EVICT_FAIL ? "not" : "already",
+                        paging->mem_event.domain_id, req.vcpu_id, req.gfn,
+                        !!(req.flags & MEM_EVENT_FLAG_VCPU_PAUSED) ,
+                        !!(req.flags & MEM_EVENT_FLAG_EVICT_FAIL) );
 
                 /* Tell Xen to resume the vcpu */
                 /* XXX: Maybe just check if the vcpu was paused? */
diff -r 4b0907c6a08c -r bdd49540f1e1 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -3532,7 +3532,7 @@ int do_mmu_update(
                         rc = -ENOENT;
                         break;
                     }
-                    else if ( p2m_ram_paging_in_start == l1e_p2mt )
+                    else if ( p2m_ram_paging_in_start == l1e_p2mt && !mfn_valid(mfn) )
                     {
                         rc = -ENOENT;
                         break;
@@ -3572,7 +3572,7 @@ int do_mmu_update(
                         rc = -ENOENT;
                         break;
                     }
-                    else if ( p2m_ram_paging_in_start == l2e_p2mt )
+                    else if ( p2m_ram_paging_in_start == l2e_p2mt && !mfn_valid(mfn) )
                     {
                         rc = -ENOENT;
                         break;
@@ -3600,7 +3600,7 @@ int do_mmu_update(
                         rc = -ENOENT;
                         break;
                     }
-                    else if ( p2m_ram_paging_in_start == l3e_p2mt )
+                    else if ( p2m_ram_paging_in_start == l3e_p2mt && !mfn_valid(mfn) )
                     {
                         rc = -ENOENT;
                         break;
@@ -3628,7 +3628,7 @@ int do_mmu_update(
                         rc = -ENOENT;
                         break;
                     }
-                    else if ( p2m_ram_paging_in_start == l4e_p2mt )
+                    else if ( p2m_ram_paging_in_start == l4e_p2mt && !mfn_valid(mfn) )
                     {
                         rc = -ENOENT;
                         break;
diff -r 4b0907c6a08c -r bdd49540f1e1 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -731,15 +731,24 @@ int p2m_mem_paging_evict(struct domain *
     if ( unlikely(!mfn_valid(mfn)) )
         goto out;
 
-    if ( (p2mt == p2m_ram_paged) || (p2mt == p2m_ram_paging_in) ||
-         (p2mt == p2m_ram_paging_in_start) )
+    /* Allow only nominated pages */
+    if ( p2mt != p2m_ram_paging_out )
         goto out;
 
+    ret = -EBUSY;
     /* Get the page so it doesn't get modified under Xen's feet */
     page = mfn_to_page(mfn);
     if ( unlikely(!get_page(page, d)) )
         goto out;
 
+    /* Check page count and type once more */
+    if ( (page->count_info & (PGC_count_mask | PGC_allocated)) !=
+         (2 | PGC_allocated) )
+        goto out_put;
+
+    if ( (page->u.inuse.type_info & PGT_type_mask) != PGT_none )
+        goto out_put;
+
     /* Decrement guest domain's ref count of the page */
     if ( test_and_clear_bit(_PGC_allocated, &page->count_info) )
         put_page(page);
@@ -751,14 +760,15 @@ int p2m_mem_paging_evict(struct domain *
     /* Clear content before returning the page to Xen */
     scrub_one_page(page);
 
-    /* Put the page back so it gets freed */
-    put_page(page);
-
     /* Track number of paged gfns */
     atomic_inc(&d->paged_pages);
 
     ret = 0;
 
+ out_put:
+    /* Put the page back so it gets freed */
+    put_page(page);
+
  out:
     p2m_unlock(p2m);
     return ret;
@@ -788,6 +798,7 @@ void p2m_mem_paging_populate(struct doma
     mem_event_request_t req;
     p2m_type_t p2mt;
     p2m_access_t a;
+    mfn_t mfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
     /* Check that there's space on the ring for this request */
@@ -799,21 +810,26 @@ void p2m_mem_paging_populate(struct doma
 
     /* Fix p2m mapping */
     p2m_lock(p2m);
-    p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
-    if ( p2mt == p2m_ram_paged )
+    mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
+    /* Allow only nominated or evicted pages to enter page-in path */
+    if ( p2mt == p2m_ram_paging_out || p2mt == p2m_ram_paged )
     {
-        set_p2m_entry(p2m, gfn, _mfn(INVALID_MFN), 0, 
-                      p2m_ram_paging_in_start, a);
+        /* Evict will fail now, tag this request for pager */
+        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);
         audit_p2m(p2m, 1);
     }
     p2m_unlock(p2m);
 
-    /* Pause domain */
-    if ( v->domain->domain_id == d->domain_id )
+    /* Pause domain if request came from guest and gfn has paging type */
+    if (  p2m_is_paging(p2mt) && v->domain->domain_id == d->domain_id )
     {
         vcpu_pause_nosync(v);
         req.flags |= MEM_EVENT_FLAG_VCPU_PAUSED;
     }
+    /* No need to inform pager if the gfn is not in the page-out path */
     else if ( p2mt != p2m_ram_paging_out && p2mt != p2m_ram_paged )
     {
         /* gfn is already on its way back and vcpu is not paused */
@@ -834,20 +850,26 @@ int p2m_mem_paging_prep(struct domain *d
     struct page_info *page;
     p2m_type_t p2mt;
     p2m_access_t a;
+    mfn_t mfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     int ret = -ENOMEM;
 
     p2m_lock(p2m);
 
-    p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
+    mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
 
-    /* Get a free page */
-    page = alloc_domheap_page(p2m->domain, 0);
-    if ( unlikely(page == NULL) )
-        goto out;
+    /* Allocate a page if the gfn does not have one yet */
+    if ( !mfn_valid(mfn) )
+    {
+        /* Get a free page */
+        page = alloc_domheap_page(p2m->domain, 0);
+        if ( unlikely(page == NULL) )
+            goto out;
+        mfn = page_to_mfn(page);
+    }
 
     /* Fix p2m mapping */
-    set_p2m_entry(p2m, gfn, page_to_mfn(page), 0, p2m_ram_paging_in, a);
+    set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_paging_in, a);
     audit_p2m(p2m, 1);
 
     atomic_dec(&d->paged_pages);
diff -r 4b0907c6a08c -r bdd49540f1e1 xen/include/public/mem_event.h
--- a/xen/include/public/mem_event.h
+++ b/xen/include/public/mem_event.h
@@ -38,6 +38,7 @@
 /* Memory event flags */
 #define MEM_EVENT_FLAG_VCPU_PAUSED  (1 << 0)
 #define MEM_EVENT_FLAG_DROP_PAGE    (1 << 1)
+#define MEM_EVENT_FLAG_EVICT_FAIL   (1 << 2)
 
 /* Reasons for the memory event request */
 #define MEM_EVENT_REASON_UNKNOWN     0    /* typical reason */

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 05:43:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:43:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDbg3-0008HS-Sr; Tue, 11 Oct 2011 05:43:23 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbfW-000858-VM
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:42:51 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318336967!21831715!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8281 invoked from network); 11 Oct 2011 12:42:47 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-4.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Oct 2011 12:42:47 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1318336967; l=2033;
	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=kf4V/FAdkxXhkOjvOh6LqaNxHm8=;
	b=VH8uXg3hi+c1M2U3GCizopDhIpDI5KEasy1g3A/Lc7rRsJ4UCIaEUWo/AmZLwjMtKuc
	C7Ci2j4ZTgh7hn52qLDxzzIr6zlZwZU+eBvMWpDFGyM4AHfASA6S/91poS0s3yTqNTir3
	To7QzuoqZ0NQnF4CUrkFaj4g4BOki386Lhg=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjzoQFXLy
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-119-065.pools.arcor-ip.net [88.65.119.65])
	by smtp.strato.de (cohen mo58) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id p05995n9BBYnc5
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 14:42:33 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id AFDD518B6E
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 14:42:32 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: bc64a435d572680efb221445c28583d03d4eb175
Message-Id: <bc64a435d572680efb22.1318336951@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Tue, 11 Oct 2011 14:42:31 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] xenpaging: check p2mt in p2m_mem_paging
	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 Olaf Hering <olaf@aepfle.de>
# Date 1318336928 -7200
# Node ID bc64a435d572680efb221445c28583d03d4eb175
# Parent  bdd49540f1e1c803d01c88adb67c6ce01e2d00d8
xenpaging: check p2mt in p2m_mem_paging functions

Add checks to forward the p2m_ram_paging* state properly during page-in.

Resume can be called several times if several vcpus called populate for
the gfn. Finish resume only once and print some debug for other cases.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r bdd49540f1e1 -r bc64a435d572 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -852,16 +852,22 @@ int p2m_mem_paging_prep(struct domain *d
     p2m_access_t a;
     mfn_t mfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
-    int ret = -ENOMEM;
+    int ret;
 
     p2m_lock(p2m);
 
     mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
 
+    ret = -ENOENT;
+    /* Allow only missing pages */
+    if ( p2mt != p2m_ram_paging_in_start )
+        goto out;
+
     /* Allocate a page if the gfn does not have one yet */
     if ( !mfn_valid(mfn) )
     {
         /* Get a free page */
+        ret = -ENOMEM;
         page = alloc_domheap_page(p2m->domain, 0);
         if ( unlikely(page == NULL) )
             goto out;
@@ -897,9 +903,16 @@ void p2m_mem_paging_resume(struct domain
     {
         p2m_lock(p2m);
         mfn = p2m->get_entry(p2m, rsp.gfn, &p2mt, &a, p2m_query, NULL);
-        set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
-        set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
-        audit_p2m(p2m, 1);
+        /* 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, 0, p2m_ram_rw, a);
+            set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
+            audit_p2m(p2m, 1);
+        /* May be called more than once if the gfn was populate from different vcpus */
+        } else if ( p2mt != p2m_ram_rw ) {
+            printk("resume: %d %lx %x %lx\n", d->domain_id, rsp.gfn, p2mt, mfn_x(mfn));
+        }
         p2m_unlock(p2m);
     }
 

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 05:48:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:48:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDbki-0000N5-9U; Tue, 11 Oct 2011 05:48:12 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbk3-0000AF-9C
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:47:31 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318337248!550538!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10104 invoked from network); 11 Oct 2011 12:47:28 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 12:47:28 -0000
Received: by wyh13 with SMTP id 13so9320073wyh.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 05:47:28 -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:cc; bh=wRSAKohTk4hQxs6rmNwsx//6Od5dqwGNsIfZY4hftFQ=;
	b=UV2gZMMa94W8e6+wm/Y0j8/6mIOGl+f8slE4VqP6AErbHH7H6gvBWkeGyfuH0+ZalA
	hlr601/49ZO7azZSpM/n9NJQV84vWYX0PorNhEVNKGNuEl24X4MvmCAra8n6eJhNE4d4
	a0TdU6ayYVAALchrIJpMC2dBCO8Jg2BBUaAWg=
Received: by 10.216.194.30 with SMTP id l30mr7384125wen.67.1318337247866;
	Tue, 11 Oct 2011 05:47:27 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id
	fy13sm38315396wbb.18.2011.10.11.05.47.25
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 11 Oct 2011 05:47:26 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a0b8b4fb418af35cd2e2d34b11883f8250c40a35
Message-Id: <a0b8b4fb418af35cd2e2.1318337248@loki>
In-Reply-To: <2fb4bf8c16cd35ddc0bf.1318336005@loki>
References: <2fb4bf8c16cd35ddc0bf.1318336005@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Tue, 11 Oct 2011 14:47:28 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH v2] libxl: reimplement buffer for bootloading
 and drop data if buffer 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 Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1318337123 -7200
# Node ID a0b8b4fb418af35cd2e2d34b11883f8250c40a35
# Parent  64f17c7e6c33e5f1c22711ae9cbdcbe191c20062
libxl: reimplement buffer for bootloading and drop data if buffer is full.

Implement a buffer for the bootloading process that appends data to the end until it's full. Drop output from bootloader if a timeout has occurred and the buffer is full. Prevents the bootloader from getting stuck when using ptys with small buffers.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 64f17c7e6c33 -r a0b8b4fb418a tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Tue Oct 11 10:26:32 2011 +0200
+++ b/tools/libxl/libxl_bootloader.c	Tue Oct 11 14:45:23 2011 +0200
@@ -21,6 +21,7 @@
 
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/ioctl.h>
 
 #include "libxl.h"
 #include "libxl_internal.h"
@@ -28,7 +29,8 @@
 #include "flexarray.h"
 
 #define XENCONSOLED_BUF_SIZE 16
-#define BOOTLOADER_BUF_SIZE 1024
+#define BOOTLOADER_BUF_SIZE 4096
+#define BOOTLOADER_TIMEOUT 1
 
 static char **make_bootloader_args(libxl__gc *gc,
                                    libxl_domain_build_info *info,
@@ -165,10 +167,11 @@ static pid_t fork_exec_bootloader(int *m
  */
 static char * bootloader_interact(libxl__gc *gc, int xenconsoled_fd, int bootloader_fd, int fifo_fd)
 {
-    int ret;
+    int ret, read_ahead, timeout = 0;
 
     size_t nr_out = 0, size_out = 0;
     char *output = NULL;
+    struct timeval wait;
 
     /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
     int xenconsoled_prod = 0, xenconsoled_cons = 0;
@@ -177,6 +180,10 @@ static char * bootloader_interact(libxl_
     int bootloader_prod = 0, bootloader_cons = 0;
     char bootloader_buf[BOOTLOADER_BUF_SIZE];
 
+    /* Set timeout to 1s before starting to discard data */
+    wait.tv_sec = BOOTLOADER_TIMEOUT;
+    wait.tv_usec = 0;
+
     while(1) {
         fd_set wsel, rsel;
         int nfds;
@@ -185,15 +192,26 @@ static char * bootloader_interact(libxl_
             xenconsoled_prod = xenconsoled_cons = 0;
         if (bootloader_prod == bootloader_cons)
             bootloader_prod = bootloader_cons = 0;
+        /* Move buffers around to drop already consumed data */
+        if (xenconsoled_cons > 0) {
+            xenconsoled_prod -= xenconsoled_cons;
+            memmove(xenconsoled_buf, &xenconsoled_buf[xenconsoled_cons], xenconsoled_prod);
+            xenconsoled_cons = 0;
+        }
+        if (bootloader_cons > 0) {
+            bootloader_prod -= bootloader_cons;
+            memmove(bootloader_buf, &bootloader_buf[bootloader_cons], bootloader_prod);
+            bootloader_cons = 0;
+        }
 
         FD_ZERO(&rsel);
         FD_SET(fifo_fd, &rsel);
         nfds = fifo_fd + 1;
-        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0)) {
+        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0) || timeout) {
             FD_SET(xenconsoled_fd, &rsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
         }
-        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0)) {
+        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0) || timeout) {
             FD_SET(bootloader_fd, &rsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
@@ -208,12 +226,23 @@ static char * bootloader_interact(libxl_
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
-        ret = select(nfds, &rsel, &wsel, NULL, NULL);
+        ret = select(nfds, &rsel, &wsel, NULL, &wait);
         if (ret < 0)
             goto out_err;
+        if (ret == 0) {
+            timeout = 1;
+            continue;
+        }
+        timeout = 0;
 
         /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
         if (FD_ISSET(xenconsoled_fd, &rsel)) {
+            if (xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
+                if (ioctl(xenconsoled_fd, FIONREAD, &read_ahead) < 0)
+                    goto out_err;
+                memmove(xenconsoled_buf, &xenconsoled_buf[read_ahead], XENCONSOLED_BUF_SIZE - read_ahead);
+                xenconsoled_prod -= read_ahead;
+            }
             ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;
@@ -230,6 +259,12 @@ static char * bootloader_interact(libxl_
 
         /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
         if (FD_ISSET(bootloader_fd, &rsel)) {
+            if (bootloader_prod == BOOTLOADER_BUF_SIZE) {
+                if (ioctl(bootloader_fd, FIONREAD, &read_ahead) < 0)
+                    goto out_err;
+                memmove(bootloader_buf, &bootloader_buf[read_ahead], BOOTLOADER_BUF_SIZE - read_ahead);
+                bootloader_prod -= read_ahead;
+            }
             ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 05:52:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:52:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDboO-0001Vx-9V; Tue, 11 Oct 2011 05:52:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbnc-0001Dm-D0
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:51:12 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1318337444!39449804!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 986 invoked from network); 11 Oct 2011 12:50:45 -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; 11 Oct 2011 12:50:45 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 13:51:08 +0100
Message-Id: <4E9457D9020000780005AB8D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 13:51:05 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jinsong Liu" <jinsong.liu@intel.com>,
	"Yunhong Jiang" <yunhong.jiang@intel.com>
Subject: RE: [Xen-devel] [PATCH] X86 MCE: Add SRAR handler
References: <BC00F5384FCFC9499AF06F92E8B78A9E263B557B77@shsmsx502.ccr.corp.intel.com>
	<4E84ADF70200007800058882@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D2366A9B@shsmsx501.ccr.corp.intel.com>
	<4E858AF30200007800058A64@nat28.tlf.novell.com>
	<789F9655DD1B8F43B48D77C5D306597312D23D3B7D@shsmsx501.ccr.corp.intel.com>
	<4E92C369020000780005A68B@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E2693B8F9FB@shsmsx502.ccr.corp.intel.com>
	<4E941DA6020000780005AA9B@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E269B10E0CA@shsmsx502.ccr.corp.intel.com>
	<4E9432CF020000780005AADF@nat28.tlf.novell.com>
	<BC00F5384FCFC9499AF06F92E8B78A9E269B10E109@shsmsx502.ccr.corp.intel.com>
In-Reply-To: <BC00F5384FCFC9499AF06F92E8B78A9E269B10E109@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: "keir.xen@gmail.com" <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 11.10.11 at 13:58, "Liu, Jinsong" <jinsong.liu@intel.com> wrote:
> Jan Beulich wrote:
>>>>> On 11.10.11 at 11:51, "Liu, Jinsong" <jinsong.liu@intel.com> wrote:
>>> That would be data load error (EIPV=3D1), a sync error.
>>=20
>> If indeed implemented that way in hardware, that would make the
>> handling ambiguous: A GDT access must not (unconditionally) be
>> attributed to the (pv) guest, as it is not a problem the guest can
>> (necessarily) deal with (considering the split page ownership of
>> what constitutes the GDT under Xen, the guest should only be
>> accountable for the non-reserved part of the GDT, the rest should
>> be attributed back to Xen).
>>=20
>> The same would go for (perhaps speculative) page table walks.
>>=20
>=20
> Seems not ambiguous here: who own, who take.
> If error caused by hypervisor access broken page, xen panic;
> If error caused by guest access, guest would handle it (I guess =
normally=20
> kill itself);

If a guest accesses the hypervisor part of the GDT or page tables, or
some other shared data structure owned by the hypervisor (like the
M2P table), its handler may get utterly confused by being presented
an address it doesn't own and knows nothing about (i.e. in violation
of your "who own, who take").

And even from a theoretical pov, a hypervisor should panic if one of
its data structures got corrupted, no matter whether that was due to
its own or a guest's access. Delaying the panic here will only lead to
the situation becoming worse. (The same would go for a "normal"
kernel: If an application causes an MCE due to e.g. a GDT access, it
shouldn't be just the application that gets killed. Of course, with the
interesting GDT descriptors all being located close to each other,
there's little chance the kernel would be able to handle that, but
that's an implementation aspect of the kernel, not something that
should matter to the hardware design.)

Jan


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 05:55:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:55:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDbrf-0001wI-Ci; Tue, 11 Oct 2011 05:55:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbqt-0001jO-DC
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:54:36 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1318337648!48601543!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22638 invoked from network); 11 Oct 2011 12:54:08 -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; 11 Oct 2011 12:54:08 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 13:54:31 +0100
Message-Id: <4E9458A5020000780005AB99@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 13:54:29 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Allen M Kay" <allen.m.kay@intel.com>
References: <4E4E48360200007800051F65@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B5E@orsmsx505.amr.corp.intel.com>
	<4E8EC8A80200007800059E3B@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE70A446@orsmsx505.amr.corp.intel.com>
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301EE70A446@orsmsx505.amr.corp.intel.com>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part1B34CC95.1__="
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--=__Part1B34CC95.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

>>> On 08.10.11 at 04:09, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
>> For which I'd like to understand why this is being done in the places =
it is=20
> now
>>(not the least why this is done in VT-d specific code in the first =
place).
>=20
> The reason it is call by reassign_device_ownership() is because FLR =
clears=20
> ATS enabling bit on the device - I forgot about it when I wrote the last =
email=20
> so we still need to re-enable ATS on the device for each device =
assignment. =20
> To summarize:
>=20
> 1) Reason for difference in ATS and ACS handling
>     a. ATS capability is in the PCIe endpoint - enabling bit is cleared =
by=20
> device FLR on the passthrough device.
>     b. ACS capability is in the PCIe switch - not affected by FLR on =
the=20
> passthrough device.
>=20
> 2) ATS enabling requirement
>     a. VT-d engine serving the device has to be ATS capable.
>     b. device has to be ATS capable

Okay, so how about the below then (with an attached prerequisite
cleanup patch)?

Jan

--- 2011-09-20.orig/xen/drivers/passthrough/iommu.c
+++ 2011-09-20/xen/drivers/passthrough/iommu.c
@@ -150,6 +150,23 @@ int iommu_add_device(struct pci_dev *pde
     return hd->platform_ops->add_device(pdev);
 }
=20
+int iommu_enable_device(struct pci_dev *pdev)
+{
+    struct hvm_iommu *hd;
+
+    if ( !pdev->domain )
+        return -EINVAL;
+
+    ASSERT(spin_is_locked(&pcidevs_lock));
+
+    hd =3D domain_hvm_iommu(pdev->domain);
+    if ( !iommu_enabled || !hd->platform_ops ||
+         !hd->platform_ops->enable_device )
+        return 0;
+
+    return hd->platform_ops->enable_device(pdev);
+}
+
 int iommu_remove_device(struct pci_dev *pdev)
 {
     struct hvm_iommu *hd;
--- 2011-09-20.orig/xen/drivers/passthrough/pci.c
+++ 2011-09-20/xen/drivers/passthrough/pci.c
@@ -258,7 +258,7 @@ struct pci_dev *pci_get_pdev_by_domain(
  * pci_enable_acs - enable ACS if hardware support it
  * @dev: the PCI device
  */
-void pci_enable_acs(struct pci_dev *pdev)
+static void pci_enable_acs(struct pci_dev *pdev)
 {
     int pos;
     u16 cap, ctrl, seg =3D pdev->seg;
@@ -409,8 +409,11 @@ int pci_add_device(u16 seg, u8 bus, u8 d
         }
=20
         list_add(&pdev->domain_list, &dom0->arch.pdev_list);
-        pci_enable_acs(pdev);
     }
+    else
+        iommu_enable_device(pdev);
+
+    pci_enable_acs(pdev);
=20
 out:
     spin_unlock(&pcidevs_lock);
--- 2011-09-20.orig/xen/drivers/passthrough/vtd/iommu.c
+++ 2011-09-20/xen/drivers/passthrough/vtd/iommu.c
@@ -1901,6 +1901,19 @@ static int intel_iommu_add_device(struct
     return ret;
 }
=20
+static int intel_iommu_enable_device(struct pci_dev *pdev)
+{
+    struct acpi_drhd_unit *drhd =3D acpi_find_matched_drhd_unit(pdev);
+    int ret =3D drhd ? ats_device(pdev, drhd) : -ENODEV;
+
+    if ( ret <=3D 0 )
+        return ret;
+
+    ret =3D enable_ats_device(pdev->seg, pdev->bus, pdev->devfn);
+
+    return ret >=3D 0 ? 0 : ret;
+}
+
 static int intel_iommu_remove_device(struct pci_dev *pdev)
 {
     struct acpi_rmrr_unit *rmrr;
@@ -1931,7 +1944,6 @@ static int intel_iommu_remove_device(str
 static void __init setup_dom0_device(struct pci_dev *pdev)
 {
     domain_context_mapping(pdev->domain, pdev->seg, pdev->bus, pdev->devfn=
);
-    pci_enable_acs(pdev);
     pci_vtd_quirk(pdev);
 }
=20
@@ -2302,6 +2314,7 @@ const struct iommu_ops intel_iommu_ops =3D
     .init =3D intel_iommu_domain_init,
     .dom0_init =3D intel_iommu_dom0_init,
     .add_device =3D intel_iommu_add_device,
+    .enable_device =3D intel_iommu_enable_device,
     .remove_device =3D intel_iommu_remove_device,
     .assign_device  =3D intel_iommu_assign_device,
     .teardown =3D iommu_domain_teardown,
--- 2011-09-20.orig/xen/include/xen/iommu.h
+++ 2011-09-20/xen/include/xen/iommu.h
@@ -70,6 +70,7 @@ int iommu_enable_x2apic_IR(void);
 void iommu_disable_x2apic_IR(void);
=20
 int iommu_add_device(struct pci_dev *pdev);
+int iommu_enable_device(struct pci_dev *pdev);
 int iommu_remove_device(struct pci_dev *pdev);
 int iommu_domain_init(struct domain *d);
 void iommu_dom0_init(struct domain *d);
@@ -120,6 +121,7 @@ struct iommu_ops {
     int (*init)(struct domain *d);
     void (*dom0_init)(struct domain *d);
     int (*add_device)(struct pci_dev *pdev);
+    int (*enable_device)(struct pci_dev *pdev);
     int (*remove_device)(struct pci_dev *pdev);
     int (*assign_device)(struct domain *d, u16 seg, u8 bus, u8 devfn);
     void (*teardown)(struct domain *d);
--- 2011-09-20.orig/xen/include/xen/pci.h
+++ 2011-09-20/xen/include/xen/pci.h
@@ -134,6 +134,5 @@ struct pirq;
 int msixtbl_pt_register(struct domain *, struct pirq *, uint64_t gtable);
 void msixtbl_pt_unregister(struct domain *, struct pirq *);
 void msixtbl_pt_cleanup(struct domain *d);
-void pci_enable_acs(struct pci_dev *pdev);
=20
 #endif /* __XEN_PCI_H__ */


--=__Part1B34CC95.1__=
Content-Type: text/plain; name="vtd-ats-cleanup.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="vtd-ats-cleanup.patch"

--- 2011-09-20.orig/xen/drivers/passthrough/vtd/dmar.c	2011-09-21 =
17:55:19.000000000 +0200=0A+++ 2011-09-20/xen/drivers/passthrough/vtd/dmar.=
c	2011-10-11 13:35:05.000000000 +0200=0A@@ -160,7 +160,7 @@ static =
int __init acpi_register_atsr_uni=0A     return 0;=0A }=0A =0A-struct =
acpi_drhd_unit * acpi_find_matched_drhd_unit(struct pci_dev *pdev)=0A+struc=
t acpi_drhd_unit *acpi_find_matched_drhd_unit(const struct pci_dev =
*pdev)=0A {=0A     u8 bus, devfn;=0A     struct acpi_drhd_unit *drhd;=0A@@ =
-204,19 +204,26 @@ struct acpi_drhd_unit * acpi_find_matche=0A     return =
include_all;=0A }=0A =0A-struct acpi_atsr_unit * acpi_find_matched_atsr_uni=
t(u16 seg, u8 bus, u8 devfn)=0A+struct acpi_atsr_unit *acpi_find_matched_at=
sr_unit(const struct pci_dev *pdev)=0A {=0A     struct acpi_atsr_unit =
*atsr;=0A     struct acpi_atsr_unit *all_ports =3D NULL;=0A+    u16 bdf =
=3D PCI_BDF2(pdev->bus, pdev->devfn);=0A =0A     list_for_each_entry ( =
atsr, &acpi_atsr_units, list )=0A     {=0A-        if ( atsr->segment !=3D =
seg )=0A+        unsigned int i;=0A+=0A+        if ( atsr->segment !=3D =
pdev->seg )=0A             continue;=0A =0A-        if ( test_bit(bus, =
atsr->scope.buses) )=0A+        if ( test_bit(pdev->bus, atsr->scope.buses)=
 )=0A             return atsr;=0A =0A+        for ( i =3D 0; i < atsr->scop=
e.devices_cnt; ++i )=0A+            if ( atsr->scope.devices[i] =3D=3D bdf =
)=0A+                return atsr;=0A+=0A         if ( atsr->all_ports )=0A =
            all_ports =3D atsr;=0A     }=0A--- 2011-09-20.orig/xen/drivers/=
passthrough/vtd/dmar.h	2011-08-25 15:06:43.000000000 +0200=0A+++ =
2011-09-20/xen/drivers/passthrough/vtd/dmar.h	2011-10-11 13:30:30.0000000=
00 +0200=0A@@ -86,8 +86,8 @@ struct acpi_rhsa_unit {=0A         for (idx =
=3D 0; (bdf =3D rmrr->scope.devices[idx]) && \=0A                  idx < =
rmrr->scope.devices_cnt; idx++)=0A =0A-struct acpi_drhd_unit * acpi_find_ma=
tched_drhd_unit(struct pci_dev *pdev);=0A-struct acpi_atsr_unit * =
acpi_find_matched_atsr_unit(u16 seg, u8 bus, u8 devfn);=0A+struct =
acpi_drhd_unit *acpi_find_matched_drhd_unit(const struct pci_dev *);=0A+str=
uct acpi_atsr_unit *acpi_find_matched_atsr_unit(const struct pci_dev =
*);=0A =0A #define DMAR_TYPE 1=0A #define RMRR_TYPE 2=0A--- 2011-09-20.orig=
/xen/drivers/passthrough/vtd/extern.h	2011-04-11 08:33:59.000000000 =
+0200=0A+++ 2011-09-20/xen/drivers/passthrough/vtd/extern.h	2011-10-11 =
13:56:00.000000000 +0200=0A@@ -61,10 +61,9 @@ extern bool_t ats_enabled;=0A=
 =0A struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);=0A =
=0A-int ats_device(int seg, int bus, int devfn);=0A+int ats_device(const =
struct pci_dev *, const struct acpi_drhd_unit *);=0A int enable_ats_device(=
int seg, int bus, int devfn);=0A void disable_ats_device(int seg, int bus, =
int devfn);=0A-int invalidate_ats_tcs(struct iommu *iommu);=0A =0A int =
dev_invalidate_iotlb(struct iommu *iommu, u16 did,=0A                      =
    u64 addr, unsigned int size_order, u64 type);=0A@@ -76,7 +75,8 @@ =
static inline struct acpi_drhd_unit *fin=0A     return NULL;=0A }=0A =
=0A-static inline int ats_device(int seg, int bus, int devfn)=0A+static =
inline int ats_device(const struct pci_dev *pdev,=0A+                      =
       const struct acpi_drhd_unit *drhd)=0A {=0A     return 0;=0A }=0A--- =
2011-09-20.orig/xen/drivers/passthrough/vtd/iommu.c	2011-09-21 =
17:56:24.000000000 +0200=0A+++ 2011-09-20/xen/drivers/passthrough/vtd/iommu=
.c	2011-10-11 14:03:23.000000000 +0200=0A@@ -1411,7 +1411,7 @@ static =
int domain_context_mapping(=0A                     domain->domain_id, seg, =
bus,=0A                     PCI_SLOT(devfn), PCI_FUNC(devfn));=0A         =
ret =3D domain_context_mapping_one(domain, drhd->iommu, bus, devfn);=0A-   =
     if ( !ret && ats_device(seg, bus, devfn) )=0A+        if ( !ret && =
ats_device(pdev, drhd) > 0 )=0A             enable_ats_device(seg, bus, =
devfn);=0A =0A         break;=0A@@ -1542,7 +1542,7 @@ static int domain_con=
text_unmap(=0A                     domain->domain_id, seg, bus,=0A         =
            PCI_SLOT(devfn), PCI_FUNC(devfn));=0A         ret =3D =
domain_context_unmap_one(domain, iommu, bus, devfn);=0A-        if ( !ret =
&& ats_device(seg, bus, devfn) )=0A+        if ( !ret && ats_device(pdev, =
drhd) > 0 )=0A             disable_ats_device(seg, bus, devfn);=0A =0A     =
    break;=0A--- 2011-09-20.orig/xen/drivers/passthrough/vtd/x86/ats.c	=
2011-08-25 15:13:05.000000000 +0200=0A+++ 2011-09-20/xen/drivers/passthroug=
h/vtd/x86/ats.c	2011-10-11 14:03:00.000000000 +0200=0A@@ -83,40 +83,32 @@ =
struct acpi_drhd_unit * find_ats_dev_drh=0A     return NULL;=0A }=0A =
=0A-int ats_device(int seg, int bus, int devfn)=0A+int ats_device(const =
struct pci_dev *pdev, const struct acpi_drhd_unit *drhd)=0A {=0A-    =
struct acpi_drhd_unit *drhd, *ats_drhd, *new_drhd;=0A-    struct pci_dev =
*pdev;=0A-    int pos =3D 0;=0A+    struct acpi_drhd_unit *ats_drhd;=0A+   =
 int pos;=0A =0A     if ( !ats_enabled || !iommu_qinval )=0A         =
return 0;=0A =0A-    pdev =3D pci_get_pdev(seg, bus, devfn);=0A-    if ( =
!pdev )=0A-        return 0;=0A-=0A-    drhd =3D acpi_find_matched_drhd_uni=
t(pdev);=0A-    if ( !drhd )=0A-        return 0;=0A-=0A     if ( =
!ecap_queued_inval(drhd->iommu->ecap) ||=0A          !ecap_dev_iotlb(drhd->=
iommu->ecap) )=0A         return 0;=0A =0A-    if ( !acpi_find_matched_atsr=
_unit(seg, bus, devfn) )=0A+    if ( !acpi_find_matched_atsr_unit(pdev) =
)=0A         return 0;=0A =0A     ats_drhd =3D find_ats_dev_drhd(drhd->iomm=
u);=0A-    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_=
ATS);=0A+    pos =3D pci_find_ext_capability(pdev->seg, pdev->bus, =
pdev->devfn,=0A+                                  PCI_EXT_CAP_ID_ATS);=0A =
=0A     if ( pos && (ats_drhd =3D=3D NULL) )=0A     {=0A-        new_drhd =
=3D xmalloc(struct acpi_drhd_unit);=0A-        if ( !new_drhd )=0A-        =
    return 0;=0A-        memcpy(new_drhd, drhd, sizeof(struct acpi_drhd_uni=
t));=0A-        list_add_tail(&new_drhd->list, &ats_dev_drhd_units);=0A+   =
     ats_drhd =3D xmalloc(struct acpi_drhd_unit);=0A+        if ( =
!ats_drhd )=0A+            return -ENOMEM;=0A+        *ats_drhd =3D =
*drhd;=0A+        list_add_tail(&ats_drhd->list, &ats_dev_drhd_units);=0A  =
   }=0A     return pos;=0A }=0A
--=__Part1B34CC95.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

--=__Part1B34CC95.1__=--


From xen-devel-bounces@lists.xensource.com Tue Oct 11 05:59:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 05:59:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDbvr-0002Oc-AV; Tue, 11 Oct 2011 05:59:43 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbto-0002Al-Mz
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:57:38 -0700
X-Env-Sender: universalbillow@gmail.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1318337849!37577759!1
X-Originating-IP: [209.85.213.65]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23502 invoked from network); 11 Oct 2011 12:57:30 -0000
Received: from mail-yw0-f65.google.com (HELO mail-yw0-f65.google.com)
	(209.85.213.65)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 12:57:30 -0000
Received: by ywb6 with SMTP id 6so915459ywb.0
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 05:57:32 -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=rDCaesPGYkQBYJnS6i10+hxuqWAC+sKR6wVUfv22PJ8=;
	b=ooCjK7lbp6wfCXQnofa9Lf3WxBkYH7q95cR4utzdtNa0rrkj4VmS74F9C1zo+aCm6U
	nlTiU7rcUbCQJoi5BhX7nx0eTvPQB3+AUm7GI3028wr5qC1i0TxXJI4aeycUlmlWv7gL
	VeK3mXLnXuuwp0wjHDg66YDexUkkSo74MNCNw=
MIME-Version: 1.0
Received: by 10.236.155.170 with SMTP id j30mr29804086yhk.19.1318337851966;
	Tue, 11 Oct 2011 05:57:31 -0700 (PDT)
Received: by 10.236.69.230 with HTTP; Tue, 11 Oct 2011 05:57:31 -0700 (PDT)
In-Reply-To: <CAFLBxZZ4vqiQjGONJHKmRZqES5SJv71A9_kUkux6qjvo3407Ng@mail.gmail.com>
References: <CAFLBxZbLcqpcJfFRSnT_C=5krhen44EzMD5pKcDNGhvLYmck=g@mail.gmail.com>
	<CADWh-PF1BOSN22-Ua41fuRDP9HsHJ3j=T9j7_Kc2Un8XnVMKOQ@mail.gmail.com>
	<CAFLBxZZ4vqiQjGONJHKmRZqES5SJv71A9_kUkux6qjvo3407Ng@mail.gmail.com>
Date: Tue, 11 Oct 2011 20:57:31 +0800
Message-ID: <CADWh-PE=dPG4BJNUJkdr40f0d57brJvu+8wq6aEsd++mK6kAZQ@mail.gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulat ion() in page_fault
From: cc Luit <universalbillow@gmail.com>
To: George Dunlap <George.Dunlap@eu.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="===============0715841035=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0715841035==
Content-Type: multipart/alternative; boundary=20cf302d49845c43ee04af0573bd

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

On Tue, Oct 11, 2011 at 7:39 PM, George Dunlap
<George.Dunlap@eu.citrix.com>wrote:

> On Tue, Oct 11, 2011 at 11:12 AM, cc Luit <universalbillow@gmail.com>
> wrote:
> > Yeah, I've seen this comments, I understand what it says in the before
> part,
> > but not the last sentence, what does it mean by "non-user write"?
>
> > As you know, pagetables have a write-protect bit, such that writes to
> > that virtual address will cause a fault.
>
> > But there's an option in CR0 that can make the WP bit only work in
> > user mode, and not kernel mode.
>
> > So if the guest has CR0.WP clear, and the guest PTE is read-only, the
> > guest needs to see this:

> 1. In user mode, writes cause a page fault
> > 2. In kernel mode, writes do not cause a page fault


> > But Xen needs to protect pagetables to detect changes to them.  So
> > what Xen needs is this:
> > 1. In user mode, writes cause a page fault to be delivered to the guest
> > 2. In kernel mode, writes to non-PTs do not cause a page fault to be
> > delivered to the guest
> > 3. In kernel mode, writes to PTs cause a trap to xen, but do not cause
> > a page fault to be delivered to the guest
>
> > Unfortunately, there's no way to cause traps to xen in the case of #3
> > without also causing traps to Xen in case #2.  So the if statement is
> > designed to handle case #2.
>

> another question is that if for some reasons I want to design that the
Guest
> PTE is not read-only, which means in the page_fault situation I don't want
> xen to emulate, is there any functionability or feasibility problems?

> The basic problem is that in shadow mode, changes to the guest's
> > pagetables need to be propagated into the shadow pagetables.  If you
> > can figure out how to make that happen without trapping to Xen and
> > emulating, all the better. :-)
>
appreciate your explanation so much, that's really detail and helpfull!
but I think for the propagate from GPT to SPT, it's not always need the sync
all the time, I know in the early version of xen there is not need to do
that, but just the Lazy mode, which means (just what I understand, but not
sure):
 when guest os modify the GPT, do not emulate (there is no write-protected
PTE, so guest can directly modify it)
 1) when the access right ascension, the guest OS will INVLPG to shootdown
TLB, so hypervisor can catch the INPLPG inst to sync  up the SPT/GPT
 2) when access right down, when guest OS access this page it will trap to
xen, xen will catch #PF to sync up SPT/GPT,

have you ever heard of that before, I'm not sure if it is right, what's your
opinion?



>
> > thanks for your answer:)
>
> > bu ke qi! ;-)
>
feel kind and amazed to see the Chinese Pinyin, really feel kind of you:-)

>
>  -George
>



-- 
- Luit @ Parallel Processing Institute, Fudan University

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

<br>
<div class=3D"gmail_quote">On Tue, Oct 11, 2011 at 7:39 PM, George Dunlap <=
span dir=3D"ltr">&lt;<a href=3D"mailto:George.Dunlap@eu.citrix.com">George.=
Dunlap@eu.citrix.com</a>&gt;</span> wrote:<br>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">
<div class=3D"im">On Tue, Oct 11, 2011 at 11:12 AM, cc Luit &lt;<a href=3D"=
mailto:universalbillow@gmail.com">universalbillow@gmail.com</a>&gt; wrote:<=
br>&gt; Yeah, I&#39;ve seen this comments, I understand what it says in the=
 before part,<br>
&gt; but not the last sentence, what does it mean by &quot;non-user write&q=
uot;?<br><br></div>&gt; As you know, pagetables have a write-protect bit, s=
uch that writes to<br>&gt; that virtual address will cause a fault.<br>
<br>&gt; But there&#39;s an option in CR0 that can make the WP bit only wor=
k in<br>&gt; user mode, and not kernel mode.<br><br>&gt; So if the guest ha=
s CR0.WP clear, and the guest PTE is read-only, the<br>&gt; guest needs to =
see this:</blockquote>

<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">&gt; 1. In user mode, writes cau=
se a page fault<br>&gt; 2. In kernel mode, writes do not cause a page fault=
</blockquote>

<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote"><br>&gt; But Xen needs to protec=
t pagetables to detect changes to them. =A0So<br>&gt; what Xen needs is thi=
s:<br>
&gt; 1. In user mode, writes cause a page fault to be delivered to the gues=
t<br>&gt; 2. In kernel mode, writes to non-PTs do not cause a page fault to=
 be<br>&gt; delivered to the guest<br>&gt; 3. In kernel mode, writes to PTs=
 cause a trap to xen, but do not cause<br>
&gt; a page fault to be delivered to the guest<br><br>&gt; Unfortunately, t=
here&#39;s no way to cause traps to xen in the case of #3<br>&gt; without a=
lso causing traps to Xen in case #2. =A0So the if statement is<br>&gt; desi=
gned to handle case #2.<br>
</blockquote>
<div>=A0</div>
<div>&gt; another question is that if for some reasons I want to design tha=
t the Guest<br>&gt; PTE is not read-only, which means in the page_fault sit=
uation I don&#39;t want<br>&gt; xen to emulate, is there any functionabilit=
y or feasibility problems?<br>
<br></div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">&gt; The basic problem is that i=
n shadow mode, changes to the guest&#39;s<br>&gt; pagetables need to be pro=
pagated into the shadow pagetables. =A0If you<br>
&gt; can figure out how to make that happen without trapping to Xen and<br>=
&gt; emulating, all the better. :-)<br></blockquote>
<div>appreciate your explanation so much, that&#39;s really detail and help=
full!</div>
<div>but I think for the propagate from GPT to SPT, it&#39;s not always nee=
d the sync all the time, I know in the early version of xen there is not ne=
ed to do that, but just the Lazy mode, which means (just what I understand,=
 but not sure):</div>

<div>=A0when guest os modify the GPT, do not emulate (there is no write-pro=
tected PTE, so guest can directly modify it)<br>=A01) when the access right=
 ascension, the guest OS will INVLPG to shootdown TLB, so hypervisor can ca=
tch the INPLPG inst to sync=A0 up the SPT/GPT<br>
=A02) when access right down, when guest OS access this page it will trap t=
o xen, xen will catch #PF to sync up SPT/GPT, </div>
<div>=A0</div>
<div>have you ever heard of that before, I&#39;m not sure if it is right, w=
hat&#39;s your opinion?</div>
<div>=A0</div>
<div>=A0</div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">
<div class=3D"im"><br>&gt; thanks for your answer:)<br><br></div>&gt; bu ke=
 qi! ;-)<br></blockquote>
<div>feel kind and amazed to see the Chinese Pinyin, really feel kind of yo=
u:-)</div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote"><font color=3D"#888888"><br>=A0-=
George<br></font></blockquote></div><br><br clear=3D"all"><br>-- <br>- Luit=
 @ Parallel Processing Institute, Fudan University=A0<br>

--20cf302d49845c43ee04af0573bd--


--===============0715841035==
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

--===============0715841035==--


From xen-devel-bounces@lists.xensource.com Tue Oct 11 06:04:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 06:04:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDc07-0002us-DV; Tue, 11 Oct 2011 06:04:07 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbvR-0002Ko-VX
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 05:59:19 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1318337950!547286!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24883 invoked from network); 11 Oct 2011 12:59:11 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 12:59:11 -0000
Received: by vcbfo13 with SMTP id fo13so7993049vcb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 05:59: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=JlFPiZLROguzKaSSBQUs8GkLvetvvFbE+T7BtOZPvuY=;
	b=mg2VUwYZ4i7PJaalUMQOPRSzYRACM4RpZTubeeO0ebv3zS0NQ6VlPivLB+xvvtkzBP
	YyTJaXGLmLgeQYegpLdoyZYWXYSUalKnFyMJphaNajKcfIxkpaw2WKh8D4DE66hrTxF/
	LyVvOWToIwF29sbtgEBvnkGMecKx7i9L/b+aw=
MIME-Version: 1.0
Received: by 10.68.11.138 with SMTP id q10mr45316327pbb.37.1318337949779; Tue,
	11 Oct 2011 05:59:09 -0700 (PDT)
Received: by 10.142.225.20 with HTTP; Tue, 11 Oct 2011 05:59:09 -0700 (PDT)
In-Reply-To: <1317721138.21903.103.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<7c845e974def74de73f6.1317389595@localhost.localdomain>
	<81A73678E76EA642801C8F2E4823AD21BC2EE2FCCD@LONPMAILBOX01.citrite.net>
	<1317721138.21903.103.camel@zakaz.uk.xensource.com>
Date: Tue, 11 Oct 2011 14:59:09 +0200
X-Google-Sender-Auth: h3N6HL0ND1-Y_e5Ks3zp-4QSCMg
Message-ID: <CAPLaKK64ucxWSSzfigubic3FBheoXnAiXiYVGyO2Qhkxs47i_Q@mail.gmail.com>
Subject: Re: [Xen-devel] RE: [PATCH 02 of 23] libxl: add a comment describing
	the device interfaces
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Cc: Mike McClurg <mike.mcclurg@citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Dave Scott <Dave.Scott@eu.citrix.com>, Jim Fehlig <jfehlig@novell.com>,
	Jonathan Ludlam <Jonathan.Ludlam@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

Hello,

I've applied this patches to my tree and modified my NetBSD hotplug
and phy backend patches to conform to the new API. From what I can see
the patches work ok, except for the small bugs that I've commented on
some individual patches.

Should I wait for this patches to be committed to the Xen repository
before sending my own, or is it fine to post them for review now?

Regards, Roger.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 06:09:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 06:09:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDc5O-0003Nw-9v; Tue, 11 Oct 2011 06:09:35 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDbzv-0002so-Gg
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 06:04:07 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1318338232!20636856!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21012 invoked from network); 11 Oct 2011 13:03:52 -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 Oct 2011 13:03:52 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 14:03:52 +0100
Message-Id: <4E945AD6020000780005ABBF@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 14:03:50 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Olaf Hering" <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH] check for 'flex' before starting tools build
References: <5a5181b8c31983ff2f46.1318335064@probook.site>
	<20111011121917.GA6381@aepfle.de>
In-Reply-To: <20111011121917.GA6381@aepfle.de>
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.10.11 at 14:19, Olaf Hering <olaf@aepfle.de> wrote:
> On Tue, Oct 11, Olaf Hering wrote:
>=20
>> # HG changeset patch
>> # User Olaf Hering <olaf@aepfle.de>
>> # Date 1318335031 -7200
>> # Node ID 5a5181b8c31983ff2f465f85a41df784a5397ed5
>> # Parent  4b0907c6a08c348962bd976c2976257b412408be
>> check for 'flex' before starting tools build.
>=20
> A similar check should be added for bison.
>=20
> After todays 'hg pull -u' and 'make tools xen', two files were modified:
>=20
>  # hg st
> M tools/libxl/libxlu_disk_l.c
> M tools/libxl/libxlu_disk_l.h
>=20
> Shouldnt they be generated files in the first place,
> and not part of the SCM?

Correct - this had happened once already. And neither flex nor
bison should be required (or if they were, likely a minimum version
would also need to be enforced, and the overridable $(FLEX) and
$(BISON) values would also need to be taken into consideration -
when this happened first, I had to use privately built variants on
SLE10 for things to work out properly).

Jan


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 06:11:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 06:11:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDc7i-0003pe-NE; Tue, 11 Oct 2011 06:11:58 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDc3C-00037a-Li
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 06:07:34 -0700
X-Env-Sender: universalbillow@gmail.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318338433!34800901!1
X-Originating-IP: [209.85.213.65]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14588 invoked from network); 11 Oct 2011 13:07:14 -0000
Received: from mail-yw0-f65.google.com (HELO mail-yw0-f65.google.com)
	(209.85.213.65)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 13:07:14 -0000
Received: by ywb6 with SMTP id 6so917088ywb.0
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 06:07:13 -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=kt0jNC0FyGenYlSMNrDGDuu2W3hOfekyYweJmu16LZ8=;
	b=lYXkjHreiQC5UknU3FdFDccekGDzfsasO63PWNN8VIZwRggYRfvymh1jYg7nSRm27P
	Jp9wKN8vgCOPpgiUnIjpyT1u0iQH0LZcnmZgpytFJmb8P+6th/e9lhjozjvogSrJQuGi
	TSd55LyziywDLKZqhOeuqdBsQWU6959KDQAmE=
MIME-Version: 1.0
Received: by 10.236.192.231 with SMTP id i67mr29786761yhn.87.1318338433305;
	Tue, 11 Oct 2011 06:07:13 -0700 (PDT)
Received: by 10.236.69.230 with HTTP; Tue, 11 Oct 2011 06:07:13 -0700 (PDT)
In-Reply-To: <20111011122107.GG88076@ocelot.phlegethon.org>
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
	<20111011081829.GB88076@ocelot.phlegethon.org>
	<CADWh-PGgZ1imeq5Zf4ngwPsLXw3nb2jrExEcSDVkFZT5UWggmg@mail.gmail.com>
	<20111011112900.GF88076@ocelot.phlegethon.org>
	<CADWh-PFLM4ngx9Nyje1r2kpjaEgBRUQhQ01MDV1Lj0C5jtTJHQ@mail.gmail.com>
	<20111011122107.GG88076@ocelot.phlegethon.org>
Date: Tue, 11 Oct 2011 21:07:13 +0800
Message-ID: <CADWh-PFDKaSQa39hG8bf_Son1bRtv51G1zcQfeqk4wSQCmT5pQ@mail.gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulation() in page_fault
From: cc Luit <universalbillow@gmail.com>
To: Tim Deegan <tim@xen.org>
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="===============1652531357=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1652531357==
Content-Type: multipart/alternative; boundary=20cf3056431b02cbf004af05960f

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

On Tue, Oct 11, 2011 at 8:21 PM, Tim Deegan <tim@xen.org> wrote:

> At 20:03 +0800 on 11 Oct (1318363429), cc Luit wrote:
> > I've read a slide said that in Lazy mode:
> >  when guest os modify the GPT, do not emulate (there is no
> > write-protected PTE, so guest can directly modify it)
> >  1) when the access right ascension, the guest OS will INVLPG to
> shootdown
> > TLB, so hypervisor can catch the INPLPG inst to sync  up the SPT/GPT
> >    2) when access right down, when guest OS access this page it will trap
> to
> > xen, xen will catch #PF to sync up SPT/GPT,
> >
> > I'm not sure if this can work?
>
> > I don't quite understand your English, but yes, you can let the guest
> > write to page tables and sync up the shadows afterwards.  You need to
> > sync the shadows whenever real hardware would re-read pagetables.  That
> > is, at least:
> >  - When the guest executes INVLPG
> >  - When the guest writes to CR3
> >  - When the shadowing code adds a new l2e, l3e or l4e that points to an
> >   existing shadow.
> > (and possibly some other cases I don;t remember right now).
>
really sorry about my poor english:-) I will consider your suggestions
carefully~ thanks!

>
> > > Why do you want to avoid calling the emulator? What is your overall
> goal?
> > > It might be that tinkering in the shadow pagetables isn't the best way
> > > to acheive it.
> >
> > because we're doing some research of security aspect about xen, what's
> our
> > goal is avoid xen to access the HVM's memory in the page fault situation,
> > it's hard to say it out in short words, we have thought a lot of ways but
> > there is no a simpler one than avoiding the emulation in page_fault.
>
> > Ah, I see - this is following on from the CloudVisor work, is it?
>
yeah~ CloudVisor was just our lab's work, but ours is a little different:-)

>
> > Why don't you just use EPT/NPT instead of shadow pagetables?  That code
> > is a lot simpler and the end result is easier to validate than shadow
> > pagetables are.  Is it particularly important to support shadow
> pagetables?
>
yeah, we have consider that, and of course the EPT is much more convenient,
BTW, do you know is there any simulator that can well support EPT of xen?
the shadow page's problem is a little relevent to the selection of
simulator~

>
> > In either case, there are some instructions that Xen will always
> > emulate - for example:
> >  - MMIO accesses to emulated hardware
> >  - Some real-mode instructions on older Intel hardware
>
yeah, that's true, and we are also considering it:-)

>
> > so even if you rewrote the shadow pagetable code not to emulate PT writes
> > you still have to handle those.
>
> Cheers,
>
> Tim.
>



-- 
- Luit @ Parallel Processing Institute, Fudan University

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

<br><br>
<div class=3D"gmail_quote">On Tue, Oct 11, 2011 at 8:21 PM, Tim Deegan <spa=
n dir=3D"ltr">&lt;<a href=3D"mailto:tim@xen.org">tim@xen.org</a>&gt;</span>=
 wrote:<br>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">
<div class=3D"im">At 20:03 +0800 on 11 Oct (1318363429), cc Luit wrote:<br>=
&gt; I&#39;ve read a slide said that in Lazy mode:<br>&gt; =A0when guest os=
 modify the GPT, do not emulate (there is no<br>&gt; write-protected PTE, s=
o guest can directly modify it)<br>
&gt; =A01) when the access right ascension, the guest OS will INVLPG to sho=
otdown<br>&gt; TLB, so hypervisor can catch the INPLPG inst to sync =A0up t=
he SPT/GPT<br>&gt; =A0 =A02) when access right down, when guest OS access t=
his page it will trap to<br>
&gt; xen, xen will catch #PF to sync up SPT/GPT,<br>&gt;<br>&gt; I&#39;m no=
t sure if this can work?<br><br></div>&gt; I don&#39;t quite understand you=
r English, but yes, you can let the guest<br>&gt; write to page tables and =
sync up the shadows afterwards. =A0You need to<br>
&gt; sync the shadows whenever real hardware would re-read pagetables. =A0T=
hat<br>&gt; is, at least:<br>&gt; =A0- When the guest executes INVLPG<br>&g=
t; =A0- When the guest writes to CR3<br>&gt; =A0- When the shadowing code a=
dds a new l2e, l3e or l4e that points to an<br>
&gt; =A0 existing shadow.<br>&gt; (and possibly some other cases I don;t re=
member right now).<br></blockquote>
<div>really sorry about my poor english:-) I will consider your suggestions=
 carefully~ thanks!</div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">
<div class=3D"im"><br>&gt; &gt; Why do you want to avoid calling the emulat=
or? What is your overall goal?<br>&gt; &gt; It might be that tinkering in t=
he shadow pagetables isn&#39;t the best way<br>&gt; &gt; to acheive it.<br>
&gt;<br>&gt; because we&#39;re doing some research of security aspect about=
 xen, what&#39;s our<br>&gt; goal is avoid xen to access the HVM&#39;s memo=
ry in the page fault situation,<br>&gt; it&#39;s hard to say it out in shor=
t words, we have thought a lot of ways but<br>
&gt; there is no a simpler one than avoiding the emulation in page_fault.<b=
r><br></div>&gt; Ah, I see - this is following on from the CloudVisor work,=
 is it?<br></blockquote>
<div>yeah~=A0CloudVisor=A0was just=A0our lab&#39;s work, but ours is a litt=
le different:-)</div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote"><br>&gt; Why don&#39;t you just =
use EPT/NPT instead of shadow pagetables? =A0That code<br>&gt; is a lot sim=
pler and the end result is easier to validate than shadow<br>
&gt; pagetables are. =A0Is it particularly important to support shadow page=
tables?<br></blockquote>
<div>yeah, we have consider that, and of course the EPT is much more conven=
ient, BTW, do you know is there any simulator that can well support EPT of =
xen? the shadow page&#39;s problem is a little relevent to the selection of=
 simulator~</div>

<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote"><br>&gt; In either case, there a=
re some instructions that Xen will always<br>&gt; emulate - for example:<br=
>
&gt;=A0 - MMIO accesses to emulated hardware<br>&gt; =A0- Some real-mode in=
structions on older Intel hardware<br></blockquote>
<div>yeah, that&#39;s true, and we are also considering it:-)</div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote"><br>&gt; so even if you rewrote =
the shadow pagetable code not to emulate PT writes<br>&gt; you still have t=
o handle those.<br>
<br>Cheers,<br><font color=3D"#888888"><br>Tim.<br></font></blockquote></di=
v><br><br clear=3D"all"><br>-- <br>- Luit @ Parallel Processing Institute, =
Fudan University=A0<br>

--20cf3056431b02cbf004af05960f--


--===============1652531357==
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

--===============1652531357==--


From xen-devel-bounces@lists.xensource.com Tue Oct 11 06:21:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 06:21:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDcGw-0004P0-Rf; Tue, 11 Oct 2011 06:21:30 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDcG6-0004CO-NH
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 06:20:41 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1318339227!52416173!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16205 invoked from network); 11 Oct 2011 13:20:28 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 13:20:28 -0000
Received: by iaqq3 with SMTP id q3so11064818iaq.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 06:20:34 -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=ns0OG0SxYGeLswFRRDlt5i8mkevS0w29ihcLDUm/1Nc=;
	b=rxjqfoArgDg0XL1meIlpRCQRG/OO8pjXlOxxodBtVhgL7uWf4hjTdAYnELb52+YDQV
	GWrFWYh5gTDoyk1fBNTIH8oUtzCC443fxfNDVw0wjgamaA5JLRJn5P4XsCFpAg6vIcOa
	nyUkoQ4l3o3AG2GYxHepcwwdJCEoL9pYW1W+M=
MIME-Version: 1.0
Received: by 10.231.73.139 with SMTP id q11mr10085754ibj.97.1318339234187;
	Tue, 11 Oct 2011 06:20:34 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Tue, 11 Oct 2011 06:20:34 -0700 (PDT)
In-Reply-To: <CADWh-PE=dPG4BJNUJkdr40f0d57brJvu+8wq6aEsd++mK6kAZQ@mail.gmail.com>
References: <CAFLBxZbLcqpcJfFRSnT_C=5krhen44EzMD5pKcDNGhvLYmck=g@mail.gmail.com>
	<CADWh-PF1BOSN22-Ua41fuRDP9HsHJ3j=T9j7_Kc2Un8XnVMKOQ@mail.gmail.com>
	<CAFLBxZZ4vqiQjGONJHKmRZqES5SJv71A9_kUkux6qjvo3407Ng@mail.gmail.com>
	<CADWh-PE=dPG4BJNUJkdr40f0d57brJvu+8wq6aEsd++mK6kAZQ@mail.gmail.com>
Date: Tue, 11 Oct 2011 14:20:34 +0100
X-Google-Sender-Auth: 2R7GeVBPMXFzRzYyzWxFTv-Nj74
Message-ID: <CAFLBxZbZpZj+2am1uJ4UTy6GX4+hzAOAw5=12V2mF68g+=sf0g@mail.gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulat ion() in page_fault
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: cc Luit <universalbillow@gmail.com>, Tim Deegan <tim@xen.org>
Content-Type: text/plain; charset=UTF-8
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 Tue, Oct 11, 2011 at 1:57 PM, cc Luit <universalbillow@gmail.com> wrote:
> appreciate your explanation so much, that's really detail and helpfull!
> but I think for the propagate from GPT to SPT, it's not always need the s=
ync
> all the time, I know in the early version of xen there is not need to do
> that, but just the Lazy mode, which means (just what I understand, but no=
t
> sure):
> =C2=A0when guest os modify the GPT, do not emulate (there is no write-pro=
tected
> PTE, so guest can directly modify it)
> =C2=A01) when the access right ascension, the guest OS will INVLPG to sho=
otdown
> TLB, so hypervisor can catch the INPLPG inst to sync=C2=A0 up the SPT/GPT
> =C2=A02) when access right down, when guest OS access this page it will t=
rap to
> xen, xen will catch #PF to sync up SPT/GPT,

We already do something like this for L1 pages; search for "SHOPT_OUT_OF_SY=
NC".

But when you start to do this for higher-level pages (L2 and above),
then you get into a lot of very tricky corner-cases.  Because changes
to higher-level PTs are less common, we went with the simpler route of
simply emulating all accesses to them.

It could be done -- IIRC, version 1 of the shadow code did this
(because there was very limited hypervisor emulation).  But to get it
correct *and* working quickly will be kind of difficult.

>> > bu ke qi! ;-)
>
> feel kind and amazed to see the Chinese Pinyin, really feel kind of you:-=
)

=E6=88=91=E5=AD=A6=E4=BA=86=E4=B8=AD=E6=96=87=E5=AD=A6=E4=BA=86=E4=B8=A4=E5=
=B9=B4=E3=80=82=E6=88=91=E5=B8=B8=E5=B8=B8=E8=A6=81=E7=94=A8=E9=82=A3=E4=B8=
=AA! :-)

 -George

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 06:22:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 06:22:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDcIC-0004mx-W9; Tue, 11 Oct 2011 06:22:49 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDcGp-0004Ml-J1
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 06:21:25 -0700
X-Env-Sender: zhengwang.ruan@gmail.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318339255!52717585!1
X-Originating-IP: [209.85.210.65]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9088 invoked from network); 11 Oct 2011 13:20:57 -0000
Received: from mail-pz0-f65.google.com (HELO mail-pz0-f65.google.com)
	(209.85.210.65)
	by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 13:20:57 -0000
Received: by pzk5 with SMTP id 5so5118379pzk.0
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 06:21:18 -0700 (PDT)
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
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=wCU7005d6Tcix8RTyIT07r2xPZogVSWCTPXweYMwVRk=;
	b=ZxaEK3XehDKZuQiZ2Lii/dIT+3xUrti/0QWa76Ml1XsFIZ0mxyqhxG/F+V0gkCt8r7
	6HHs2NUfWrwrFrHrOcVaO19gN3F80vOtwabGJyUBOL12VL9/kwwoPPihIvYoWZa/UVnO
	MKO+60iMZlA+LiYcEW4mlMQZe5GjHIHBLGf78=
Received: by 10.68.12.104 with SMTP id x8mr45630313pbb.79.1318339278384;
	Tue, 11 Oct 2011 06:21:18 -0700 (PDT)
Received: from [192.168.1.106] ([180.184.200.59])
	by mx.google.com with ESMTPS id z1sm79237697pbl.5.2011.10.11.06.21.15
	(version=SSLv3 cipher=OTHER); Tue, 11 Oct 2011 06:21:17 -0700 (PDT)
Message-ID: <4E9442C4.7010903@gmail.com>
Date: Tue, 11 Oct 2011 21:21:08 +0800
From: "Zhengwang Ruan (Royo)" <zhengwang.ruan@gmail.com>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN;
	rv:1.9.2.23) Gecko/20110920 Thunderbird/3.1.15
MIME-Version: 1.0
To: Tim Deegan <tim@xen.org>
Subject: Re: [Xen-devel] why xen use x86_emulation() in page_fault
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
	<20111011081829.GB88076@ocelot.phlegethon.org>
In-Reply-To: <20111011081829.GB88076@ocelot.phlegethon.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: cc Luit <universalbillow@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

Hi Tim,

I am a freshman to this member-list and interested in some contents in
your reply, looking forward to your answer. :)


At 2011-10-11 16:18, Tim Deegan wrote:
> At 09:39 +0800 on 11 Oct (1318325957), cc Luit wrote:
>> Hi, everyone, I have a question,
>> in the shadow_page_fault or ept mechanism, xen will use the x86_emulation
>> for some instructions, I'm wondering why it must use it, if after we fix the
>> SPT or EPT table, just VMEntry to HVM to re-excute this instruction  but not
>> emulate in xen, is there some problems?
> In the shadow pagetable code, we keep the shadows up-to-date by:
>   1 - making all shadowed pagetables read-only;
>   2 - intercepting the page faults when the guest writes to them; and
>   3 - updating the guest pagetable and the shadow at the same time,
>       with whatever change the guest was making.
>
> For step 3 we need to emulate the instruction that caused the pagefault
> so that we can tell what was being written.
>
> There are other reasons for the emulator to be called (emulating MMIO
> instructions, emulating real-mode&c) but that's why the shadow
> pagetable code uses it.

1, Does this emulator set up a emulation environment to execute
instructions for a VM(guest OS)?
2, Real-mode code you talked above is used to execute the first 16-bit
initial code of a guest OS? Does it have other usages in current Xen
implementation?

Thanks,
Royo (Zhengwang)


> Cheers,
>
> Tim.
>
> _______________________________________________
> 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 Oct 11 06:39:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 06: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 1RDcYP-0005hY-BH; Tue, 11 Oct 2011 06:39:33 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDcXY-0005Un-KV
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 06:38:47 -0700
X-Env-Sender: universalbillow@gmail.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318340316!558589!1
X-Originating-IP: [209.85.213.65]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31918 invoked from network); 11 Oct 2011 13:38:37 -0000
Received: from mail-yw0-f65.google.com (HELO mail-yw0-f65.google.com)
	(209.85.213.65)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 13:38:37 -0000
Received: by ywb6 with SMTP id 6so921944ywb.0
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 06:38:35 -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=2274LOttgpm+lfdr5/noGaVeF6oSUdCxRYR56OpmVM8=;
	b=Vwsw05G4WkvItHOgzpsVruXBT/izwpumjN6EBsyEMyk8mgpplMWsiZ8mWcfOONtdF0
	V/LSQzmh/7fSMp1UwhIr1TBUycLcWtsn5flvDygxBQ29RtLxPJJwBy4gBXDjUevqzUx7
	+JijT+s+r9d/zjvh80BxXaaHZe75GRZBaNy4c=
MIME-Version: 1.0
Received: by 10.236.22.33 with SMTP id s21mr30764112yhs.70.1318340315597; Tue,
	11 Oct 2011 06:38:35 -0700 (PDT)
Received: by 10.236.69.230 with HTTP; Tue, 11 Oct 2011 06:38:35 -0700 (PDT)
In-Reply-To: <CAFLBxZbZpZj+2am1uJ4UTy6GX4+hzAOAw5=12V2mF68g+=sf0g@mail.gmail.com>
References: <CAFLBxZbLcqpcJfFRSnT_C=5krhen44EzMD5pKcDNGhvLYmck=g@mail.gmail.com>
	<CADWh-PF1BOSN22-Ua41fuRDP9HsHJ3j=T9j7_Kc2Un8XnVMKOQ@mail.gmail.com>
	<CAFLBxZZ4vqiQjGONJHKmRZqES5SJv71A9_kUkux6qjvo3407Ng@mail.gmail.com>
	<CADWh-PE=dPG4BJNUJkdr40f0d57brJvu+8wq6aEsd++mK6kAZQ@mail.gmail.com>
	<CAFLBxZbZpZj+2am1uJ4UTy6GX4+hzAOAw5=12V2mF68g+=sf0g@mail.gmail.com>
Date: Tue, 11 Oct 2011 21:38:35 +0800
Message-ID: <CADWh-PE-=QupM9LmUDkp4X2pcqOyW+Na4+6raN+ryp1zf+2bkQ@mail.gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulat ion() in page_fault
From: cc Luit <universalbillow@gmail.com>
To: George Dunlap <George.Dunlap@eu.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="===============1969013454=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1969013454==
Content-Type: multipart/alternative; boundary=e89a8f647823344c2504af0606e0

--e89a8f647823344c2504af0606e0
Content-Type: text/plain; charset=GB2312
Content-Transfer-Encoding: quoted-printable

On Tue, Oct 11, 2011 at 9:20 PM, George Dunlap
<George.Dunlap@eu.citrix.com>wrote:

> On Tue, Oct 11, 2011 at 1:57 PM, cc Luit <universalbillow@gmail.com>
> wrote:
> > appreciate your explanation so much, that's really detail and helpfull!
> > but I think for the propagate from GPT to SPT, it's not always need the
> sync
> > all the time, I know in the early version of xen there is not need to d=
o
> > that, but just the Lazy mode, which means (just what I understand, but
> not
> > sure):
> >  when guest os modify the GPT, do not emulate (there is no
> write-protected
> > PTE, so guest can directly modify it)
> >  1) when the access right ascension, the guest OS will INVLPG to
> shootdown
> > TLB, so hypervisor can catch the INPLPG inst to sync  up the SPT/GPT
> >  2) when access right down, when guest OS access this page it will trap
> to
> > xen, xen will catch #PF to sync up SPT/GPT,
>
> > We already do something like this for L1 pages; search for
> "SHOPT_OUT_OF_SYNC".
>
> > But when you start to do this for higher-level pages (L2 and above),
> > then you get into a lot of very tricky corner-cases.  Because changes
> > to higher-level PTs are less common, we went with the simpler route of
> > simply emulating all accesses to them.
>
> > It could be done -- IIRC, version 1 of the shadow code did this
> > (because there was very limited hypervisor emulation).  But to get it
> > correct *and* working quickly will be kind of difficult.
>

Yeah, I see~

>
> >> > bu ke qi! ;-)
> >
> > feel kind and amazed to see the Chinese Pinyin, really feel kind of
> you:-)
>
> =CE=D2=D1=A7=C1=CB=D6=D0=CE=C4=D1=A7=C1=CB=C1=BD=C4=EA=A1=A3=CE=D2=B3=A3=
=B3=A3=D2=AA=D3=C3=C4=C7=B8=F6! :-)
>
haha~=C4=E3=BE=B9=C8=BB=BB=E1=D3=C3=B5=BD=D6=D0=CE=C4=A3=AC=B5=DA=D2=BB=B4=
=CE=D4=DAXen-devel=C9=CF=BF=B4=B5=BD=D6=D0=CE=C4=BA=C3=D0=CB=B7=DC=B0=A1=A1=
=A3=A1=A3=A1=A3

>
>  -George
>



--=20
- Luit @ Parallel Processing Institute, Fudan University

--e89a8f647823344c2504af0606e0
Content-Type: text/html; charset=GB2312
Content-Transfer-Encoding: quoted-printable

<br><br>
<div class=3D"gmail_quote">On Tue, Oct 11, 2011 at 9:20 PM, George Dunlap <=
span dir=3D"ltr">&lt;<a href=3D"mailto:George.Dunlap@eu.citrix.com">George.=
Dunlap@eu.citrix.com</a>&gt;</span> wrote:<br>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">
<div class=3D"im">On Tue, Oct 11, 2011 at 1:57 PM, cc Luit &lt;<a href=3D"m=
ailto:universalbillow@gmail.com">universalbillow@gmail.com</a>&gt; wrote:<b=
r>&gt; appreciate your explanation so much, that&#39;s really detail and he=
lpfull!<br>
&gt; but I think for the propagate from GPT to SPT, it&#39;s not always nee=
d the sync<br>&gt; all the time, I know in the early version of xen there i=
s not need to do<br>&gt; that, but just the Lazy mode, which means (just wh=
at I understand, but not<br>
&gt; sure):<br>&gt; &nbsp;when guest os modify the GPT, do not emulate (the=
re is no write-protected<br>&gt; PTE, so guest can directly modify it)<br>&=
gt; &nbsp;1) when the access right ascension, the guest OS will INVLPG to s=
hootdown<br>
&gt; TLB, so hypervisor can catch the INPLPG inst to sync&nbsp; up the SPT/=
GPT<br>&gt; &nbsp;2) when access right down, when guest OS access this page=
 it will trap to<br>&gt; xen, xen will catch #PF to sync up SPT/GPT,<br><br=
></div>
&gt; We already do something like this for L1 pages; search for &quot;SHOPT=
_OUT_OF_SYNC&quot;.<br><br>&gt; But when you start to do this for higher-le=
vel pages (L2 and above),<br>&gt; then you get into a lot of very tricky co=
rner-cases. &nbsp;Because changes<br>
&gt; to higher-level PTs are less common, we went with the simpler route of=
<br>&gt; simply emulating all accesses to them.<br><br>&gt; It could be don=
e -- IIRC, version 1 of the shadow code did this<br>&gt; (because there was=
 very limited hypervisor emulation). &nbsp;But to get it<br>
&gt; correct *and* working quickly will be kind of difficult.<br></blockquo=
te>
<div>&nbsp;</div>
<div>Yeah, I see~</div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">
<div class=3D"im"><br>&gt;&gt; &gt; bu ke qi! ;-)<br>&gt;<br>&gt; feel kind=
 and amazed to see the Chinese Pinyin, really feel kind of you:-)<br><br></=
div>=CE=D2=D1=A7=C1=CB=D6=D0=CE=C4=D1=A7=C1=CB=C1=BD=C4=EA=A1=A3=CE=D2=B3=
=A3=B3=A3=D2=AA=D3=C3=C4=C7=B8=F6! :-)<br></blockquote>
<div>haha~=C4=E3=BE=B9=C8=BB=BB=E1=D3=C3=B5=BD=D6=D0=CE=C4=A3=AC=B5=DA=D2=
=BB=B4=CE=D4=DAXen-devel=C9=CF=BF=B4=B5=BD=D6=D0=CE=C4=BA=C3=D0=CB=B7=DC=B0=
=A1=A1=A3=A1=A3=A1=A3</div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote"><font color=3D"#888888"><br>&nbs=
p;-George<br></font></blockquote></div><br><br clear=3D"all"><br>-- <br>- L=
uit @ Parallel Processing Institute, Fudan University&nbsp;<br>

--e89a8f647823344c2504af0606e0--


--===============1969013454==
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

--===============1969013454==--


From xen-devel-bounces@lists.xensource.com Tue Oct 11 06:42:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 06:42:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDcbN-0006C2-Gx; Tue, 11 Oct 2011 06:42:37 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDcal-0005zh-0z
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 06:41:59 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318340515!559913!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17366 invoked from network); 11 Oct 2011 13:41:56 -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 Oct 2011 13:41:56 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 14:41:55 +0100
Message-Id: <4E9463C1020000780005ABE9@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 14:41:53 +0100
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] linux-2.6.18: improve floppy behavior
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Timing is significantly different from native both because Xen traps
I/O port accesses and since DMA use is not possible (without intrusive
changes). Due to the overhead of trapped port accesses, I/O is already
slow enough (and Xen doesn't run on very old hardware anyway), so the
situation can easily be improved by not enforcing REALLY_SLOW_IO.

This doesn't completely address the issue - Xen just cannot guarantee
scheduling of a particular vCPU with a maximum latency of about 80us
(needed for the default FIFO threshold value of 10). The only complete
solution would require making ISA DMA usable on Xen.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/drivers/block/floppy.c
+++ b/drivers/block/floppy.c
@@ -146,7 +146,9 @@
 #define FLOPPY_SANITY_CHECK
 #undef  FLOPPY_SILENT_DCL_CLEAR
=20
+#ifndef CONFIG_XEN
 #define REALLY_SLOW_IO
+#endif
=20
 #define DEBUGT 2
 #define DCL_DEBUG		/* debug disk change line */




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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 06:45:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 06:45:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDceN-0006ct-UQ; Tue, 11 Oct 2011 06:45:43 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDcdn-0006Qh-SU
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 06:45:08 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1318340703!34797853!1
X-Originating-IP: [216.32.181.186]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32545 invoked from network); 11 Oct 2011 13:45:04 -0000
Received: from ch1ehsobe006.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.186)
	by server-7.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	11 Oct 2011 13:45:04 -0000
Received: from mail48-ch1-R.bigfish.com (10.43.68.246) by
	CH1EHSOBE014.bigfish.com (10.43.70.64) with Microsoft SMTP Server id
	14.1.225.22; Tue, 11 Oct 2011 13:45:03 +0000
Received: from mail48-ch1 (localhost.localdomain [127.0.0.1])	by
	mail48-ch1-R.bigfish.com (Postfix) with ESMTP id 01B7311D00FE	for
	<xen-devel@lists.xensource.com>; Tue, 11 Oct 2011 13:45:03 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzc85dhzz1202hzz8275bhz32i668h839h34h)
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,13,
Received: from mail48-ch1 (localhost.localdomain [127.0.0.1]) by mail48-ch1
	(MessageSwitch) id 1318340660962075_21369;
	Tue, 11 Oct 2011 13:44:20 +0000 (UTC)
Received: from CH1EHSMHS011.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.241])	by mail48-ch1.bigfish.com (Postfix) with ESMTP id
	DBEB3A40053 for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 13:44:20 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS011.bigfish.com (10.43.70.11) with Microsoft SMTP Server id
	14.1.225.22; Tue, 11 Oct 2011 13:44:16 +0000
X-WSS-ID: 0LSWM5P-02-A25-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 232BDC80EA	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 08:44:13 -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, 11 Oct 2011 08:44:23 -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, 11 Oct 2011 08:44:15 -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, 11 Oct 2011
	09:43:51 -0400
Message-ID: <4E944816.2030409@amd.com>
Date: Tue, 11 Oct 2011 15:43:50 +0200
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>
Content-Type: multipart/mixed; boundary="------------010405040906010201000308"
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH] xen viridian: cleanup
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

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


Simplify accesses into viridian structures.

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

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

diff -r 04fbcc0c1ec5 xen/arch/x86/hvm/viridian.c
--- a/xen/arch/x86/hvm/viridian.c	Wed Sep 28 12:09:13 2011 +0200
+++ b/xen/arch/x86/hvm/viridian.c	Wed Sep 28 12:45:39 2011 +0200
@@ -98,37 +98,43 @@ int cpuid_viridian_leaves(unsigned int l
 
 void dump_guest_os_id(struct domain *d)
 {
+    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
+
     gdprintk(XENLOG_INFO, "GUEST_OS_ID:\n");
     gdprintk(XENLOG_INFO, "\tvendor: %x\n",
-            d->arch.hvm_domain.viridian.guest_os_id.fields.vendor);
+            vd->guest_os_id.fields.vendor);
     gdprintk(XENLOG_INFO, "\tos: %x\n",
-            d->arch.hvm_domain.viridian.guest_os_id.fields.os);
+            vd->guest_os_id.fields.os);
     gdprintk(XENLOG_INFO, "\tmajor: %x\n",
-            d->arch.hvm_domain.viridian.guest_os_id.fields.major);
+            vd->guest_os_id.fields.major);
     gdprintk(XENLOG_INFO, "\tminor: %x\n",
-            d->arch.hvm_domain.viridian.guest_os_id.fields.minor);
+            vd->guest_os_id.fields.minor);
     gdprintk(XENLOG_INFO, "\tsp: %x\n",
-            d->arch.hvm_domain.viridian.guest_os_id.fields.service_pack);
+            vd->guest_os_id.fields.service_pack);
     gdprintk(XENLOG_INFO, "\tbuild: %x\n",
-            d->arch.hvm_domain.viridian.guest_os_id.fields.build_number);
+            vd->guest_os_id.fields.build_number);
 }
 
 void dump_hypercall(struct domain *d)
 {
+    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
+
     gdprintk(XENLOG_INFO, "HYPERCALL:\n");
     gdprintk(XENLOG_INFO, "\tenabled: %x\n",
-            d->arch.hvm_domain.viridian.hypercall_gpa.fields.enabled);
+            vd->hypercall_gpa.fields.enabled);
     gdprintk(XENLOG_INFO, "\tpfn: %lx\n",
-            (unsigned long)d->arch.hvm_domain.viridian.hypercall_gpa.fields.pfn);
+            (unsigned long)vd->hypercall_gpa.fields.pfn);
 }
 
 void dump_apic_assist(struct vcpu *v)
 {
+    struct viridian_vcpu *vv = &v->arch.hvm_vcpu.viridian;
+
     gdprintk(XENLOG_INFO, "APIC_ASSIST[%d]:\n", v->vcpu_id);
     gdprintk(XENLOG_INFO, "\tenabled: %x\n",
-            v->arch.hvm_vcpu.viridian.apic_assist.fields.enabled);
+            vv->apic_assist.fields.enabled);
     gdprintk(XENLOG_INFO, "\tpfn: %lx\n",
-            (unsigned long)v->arch.hvm_vcpu.viridian.apic_assist.fields.pfn);
+            (unsigned long)vv->apic_assist.fields.pfn);
 }
 
 static void enable_hypercall_page(struct domain *d)
@@ -201,6 +207,8 @@ int wrmsr_viridian_regs(uint32_t idx, ui
 {
     struct vcpu *v = current;
     struct domain *d = v->domain;
+    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
+    struct viridian_vcpu *vv = &v->arch.hvm_vcpu.viridian;
 
     if ( !is_viridian_domain(d) )
         return 0;
@@ -209,15 +217,15 @@ int wrmsr_viridian_regs(uint32_t idx, ui
     {
     case VIRIDIAN_MSR_GUEST_OS_ID:
         perfc_incr(mshv_wrmsr_osid);
-        d->arch.hvm_domain.viridian.guest_os_id.raw = val;
+        vd->guest_os_id.raw = val;
         dump_guest_os_id(d);
         break;
 
     case VIRIDIAN_MSR_HYPERCALL:
         perfc_incr(mshv_wrmsr_hc_page);
-        d->arch.hvm_domain.viridian.hypercall_gpa.raw = val;
+        vd->hypercall_gpa.raw = val;
         dump_hypercall(d);
-        if ( d->arch.hvm_domain.viridian.hypercall_gpa.fields.enabled )
+        if ( vd->hypercall_gpa.fields.enabled )
             enable_hypercall_page(d);
         break;
 
@@ -249,9 +257,9 @@ int wrmsr_viridian_regs(uint32_t idx, ui
 
     case VIRIDIAN_MSR_APIC_ASSIST:
         perfc_incr(mshv_wrmsr_apic_msr);
-        v->arch.hvm_vcpu.viridian.apic_assist.raw = val;
+        vv->apic_assist.raw = val;
         dump_apic_assist(v);
-        if (v->arch.hvm_vcpu.viridian.apic_assist.fields.enabled)
+        if (vv->apic_assist.fields.enabled)
             initialize_apic_assist(v);
         break;
 
@@ -266,6 +274,8 @@ int rdmsr_viridian_regs(uint32_t idx, ui
 {
     struct vcpu *v = current;
     struct domain *d = v->domain;
+    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
+    struct viridian_vcpu *vv = &v->arch.hvm_vcpu.viridian;
     
     if ( !is_viridian_domain(d) )
         return 0;
@@ -274,12 +284,12 @@ int rdmsr_viridian_regs(uint32_t idx, ui
     {
     case VIRIDIAN_MSR_GUEST_OS_ID:
         perfc_incr(mshv_rdmsr_osid);
-        *val = d->arch.hvm_domain.viridian.guest_os_id.raw;
+        *val = vd->guest_os_id.raw;
         break;
 
     case VIRIDIAN_MSR_HYPERCALL:
         perfc_incr(mshv_rdmsr_hc_page);
-        *val = d->arch.hvm_domain.viridian.hypercall_gpa.raw;
+        *val = vd->hypercall_gpa.raw;
         break;
 
     case VIRIDIAN_MSR_VP_INDEX:
@@ -300,7 +310,7 @@ int rdmsr_viridian_regs(uint32_t idx, ui
 
     case VIRIDIAN_MSR_APIC_ASSIST:
         perfc_incr(mshv_rdmsr_apic_msr);
-        *val = v->arch.hvm_vcpu.viridian.apic_assist.raw;
+        *val = vv->apic_assist.raw;
         break;
 
     default:
@@ -390,12 +400,13 @@ out:
 static int viridian_save_domain_ctxt(struct domain *d, hvm_domain_context_t *h)
 {
     struct hvm_viridian_domain_context ctxt;
+    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
 
     if ( !is_viridian_domain(d) )
         return 0;
 
-    ctxt.hypercall_gpa = d->arch.hvm_domain.viridian.hypercall_gpa.raw;
-    ctxt.guest_os_id   = d->arch.hvm_domain.viridian.guest_os_id.raw;
+    ctxt.hypercall_gpa = vd->hypercall_gpa.raw;
+    ctxt.guest_os_id   = vd->guest_os_id.raw;
 
     return (hvm_save_entry(VIRIDIAN_DOMAIN, 0, h, &ctxt) != 0);
 }
@@ -403,12 +414,13 @@ static int viridian_save_domain_ctxt(str
 static int viridian_load_domain_ctxt(struct domain *d, hvm_domain_context_t *h)
 {
     struct hvm_viridian_domain_context ctxt;
+    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
 
     if ( hvm_load_entry(VIRIDIAN_DOMAIN, h, &ctxt) != 0 )
         return -EINVAL;
 
-    d->arch.hvm_domain.viridian.hypercall_gpa.raw = ctxt.hypercall_gpa;
-    d->arch.hvm_domain.viridian.guest_os_id.raw   = ctxt.guest_os_id;
+    vd->hypercall_gpa.raw = ctxt.hypercall_gpa;
+    vd->guest_os_id.raw   = ctxt.guest_os_id;
 
     return 0;
 }

--------------010405040906010201000308
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

--------------010405040906010201000308--


From xen-devel-bounces@lists.xensource.com Tue Oct 11 06:46:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 06:46:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDcfM-00070l-UJ; Tue, 11 Oct 2011 06:46:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDcen-0006mK-72
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 06:46:09 -0700
X-Env-Sender: universalbillow@gmail.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1318340731!58337400!1
X-Originating-IP: [209.85.160.193]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15892 invoked from network); 11 Oct 2011 13:45:32 -0000
Received: from mail-gy0-f193.google.com (HELO mail-gy0-f193.google.com)
	(209.85.160.193)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 13:45:32 -0000
Received: by gyc15 with SMTP id 15so87833gyc.0
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 06:46:04 -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=ljjxo3ltxruUZMX+ygZI+nH7SJpGLjEOvtxDnexferM=;
	b=eY/7Y5sya7G2ZoXSeiSJ6hpTlO1x2FCb5RyfTf8d9tjjA+/1/7qa7Z6vNcSLX2JCeD
	/wpTyYJTB/HaBpE34UxQtO00jIM8INNiKL3q6bmCYhqwNthAKsDLscsBUO2jUJ2l3yo3
	QsQfSctc4ESkvIUpKcyW4bTZknq8kz8WWQmlY=
MIME-Version: 1.0
Received: by 10.236.76.38 with SMTP id a26mr30615465yhe.53.1318340764576; Tue,
	11 Oct 2011 06:46:04 -0700 (PDT)
Received: by 10.236.69.230 with HTTP; Tue, 11 Oct 2011 06:46:04 -0700 (PDT)
In-Reply-To: <4E9430B5.70608@gmail.com>
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
	<20111011081829.GB88076@ocelot.phlegethon.org>
	<4E9430B5.70608@gmail.com>
Date: Tue, 11 Oct 2011 21:46:04 +0800
Message-ID: <CADWh-PFHiiW1tOWqn8PmHvLSFTLMEvDhamCAxQUniehVhtSBZw@mail.gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulation() in page_fault
From: cc Luit <universalbillow@gmail.com>
To: "Zhengwang Ruan (Royo)" <zhengwang.ruan@gmail.com>
Cc: xen-devel@lists.xensource.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>
Content-Type: multipart/mixed; boundary="===============1846147700=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1846147700==
Content-Type: multipart/alternative; boundary=20cf303bf65cf72afe04af0620d1

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

On Tue, Oct 11, 2011 at 8:04 PM, Zhengwang Ruan (Royo) <
zhengwang.ruan@gmail.com> wrote:

> Hi Tim,
>
> I am a freshman to this member-list and interested in some contents in your
> reply, looking forward to your answer. :)
>
>
>
> At 2011-10-11 16:18, Tim Deegan wrote:
>
>>  At 09:39 +0800 on 11 Oct (1318325957), cc Luit wrote:
>>
>>> Hi, everyone, I have a question,
>>> in the shadow_page_fault or ept mechanism, xen will use the x86_emulation
>>> for some instructions, I'm wondering why it must use it, if after we fix
>>> the
>>> SPT or EPT table, just VMEntry to HVM to re-excute this instruction  but
>>> not
>>> emulate in xen, is there some problems?
>>>
>> In the shadow pagetable code, we keep the shadows up-to-date by:
>>  1 - making all shadowed pagetables read-only;
>>  2 - intercepting the page faults when the guest writes to them; and
>>  3 - updating the guest pagetable and the shadow at the same time,
>>      with whatever change the guest was making.
>>
>> For step 3 we need to emulate the instruction that caused the pagefault
>> so that we can tell what was being written.
>>
>> There are other reasons for the emulator to be called (emulating MMIO
>> instructions, emulating real-mode&c) but that's why the shadow
>> pagetable code uses it.
>>
>
> 1, Does this emulator set up a emulation environment to execute
> instructions for a VM(guest OS)?
>
there is a x86_emulate() in xen/arch/x86/x86_emulate/x86_emulate.c(my
version is xen-4.0.1), and it will emulate some instructions (I think both
guest OS and Domain-0) in some conditions(like what Tim said)


> 2, Real-mode code you talked above is used to execute the first 16-bit
> initial code of a guest OS? Does it have other usages in current Xen
> implementation?
>
I'm also curious about the real-mode, looking forward to the replay~

>
> Thanks,
> Royo (Zhengwang)
>
> Cheers,
>>
>> Tim.
>>
>>
>> ______________________________**_________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/**xen-devel<http://lists.xensource.com/xen-devel>
>>
>
> ______________________________**_________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/**xen-devel<http://lists.xensource.com/xen-devel>
>



-- 
- Luit @ Parallel Processing Institute, Fudan University

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

<br><br>
<div class=3D"gmail_quote">On Tue, Oct 11, 2011 at 8:04 PM, Zhengwang Ruan =
(Royo) <span dir=3D"ltr">&lt;<a href=3D"mailto:zhengwang.ruan@gmail.com">zh=
engwang.ruan@gmail.com</a>&gt;</span> wrote:<br>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">Hi Tim,<br><br>I am a freshman t=
o this member-list and interested in some contents in your reply, looking f=
orward to your answer. :)=20
<div>
<div></div>
<div class=3D"h5"><br><br><br>At 2011-10-11 16:18, Tim Deegan wrote:<br></d=
iv></div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">
<div>
<div></div>
<div class=3D"h5">At 09:39 +0800 on 11 Oct (1318325957), cc Luit wrote:<br>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">Hi, everyone, I have a question,=
<br>in the shadow_page_fault or ept mechanism, xen will use the x86_emulati=
on<br>
for some instructions, I&#39;m wondering why it must use it, if after we fi=
x the<br>SPT or EPT table, just VMEntry to HVM to re-excute this instructio=
n =A0but not<br>emulate in xen, is there some problems?<br></blockquote>In =
the shadow pagetable code, we keep the shadows up-to-date by:<br>
=A01 - making all shadowed pagetables read-only;<br>=A02 - intercepting the=
 page faults when the guest writes to them; and<br>=A03 - updating the gues=
t pagetable and the shadow at the same time,<br>=A0 =A0 =A0with whatever ch=
ange the guest was making.<br>
<br>For step 3 we need to emulate the instruction that caused the pagefault=
<br>so that we can tell what was being written.<br><br>There are other reas=
ons for the emulator to be called (emulating MMIO<br></div></div>instructio=
ns, emulating real-mode&amp;c) but that&#39;s why the shadow<br>
pagetable code uses it.<br></blockquote><br>1, Does this emulator set up a =
emulation environment to execute instructions for a VM(guest OS)?<br></bloc=
kquote>
<div>there is a x86_emulate() in xen/arch/x86/x86_emulate/x86_emulate.c(my =
version is xen-4.0.1), and it will emulate some instructions (I think both =
guest OS and Domain-0) in some conditions(like what Tim said)</div>
<div>=A0</div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">2, Real-mode code you talked abo=
ve is used to execute the first 16-bit initial code of a guest OS? Does it =
have other usages in current Xen implementation?<br>
</blockquote>
<div>I&#39;m also curious about the real-mode, looking forward to the repla=
y~</div>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote"><br>Thanks,<br>Royo (Zhengwang)<=
br><br>
<blockquote style=3D"BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex=
; PADDING-LEFT: 1ex" class=3D"gmail_quote">Cheers,<br><br>Tim.=20
<div class=3D"im"><br><br>______________________________<u></u>____________=
_____<br>Xen-devel mailing list<br><a href=3D"mailto:Xen-devel@lists.xensou=
rce.com" target=3D"_blank">Xen-devel@lists.xensource.com</a><br><a href=3D"=
http://lists.xensource.com/xen-devel" target=3D"_blank">http://lists.xensou=
rce.com/<u></u>xen-devel</a><br>
</div></blockquote>
<div>
<div></div>
<div class=3D"h5"><br>______________________________<u></u>________________=
_<br>Xen-devel mailing list<br><a href=3D"mailto:Xen-devel@lists.xensource.=
com" target=3D"_blank">Xen-devel@lists.xensource.com</a><br><a href=3D"http=
://lists.xensource.com/xen-devel" target=3D"_blank">http://lists.xensource.=
com/<u></u>xen-devel</a><br>
</div></div></blockquote></div><br><br clear=3D"all"><br>-- <br>- Luit @ Pa=
rallel Processing Institute, Fudan University=A0<br>

--20cf303bf65cf72afe04af0620d1--


--===============1846147700==
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

--===============1846147700==--


From xen-devel-bounces@lists.xensource.com Tue Oct 11 07:04:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 07:04:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDcwv-0007fV-Fj; Tue, 11 Oct 2011 07:04:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDcrm-0007Ov-6h
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 07:00:22 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1318341563!52423807!1
X-Originating-IP: [213.199.154.205]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2430 invoked from network); 11 Oct 2011 13:59:23 -0000
Received: from am1ehsobe002.messaging.microsoft.com (HELO
	AM1EHSOBE002.bigfish.com) (213.199.154.205)
	by server-13.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	11 Oct 2011 13:59:23 -0000
Received: from mail89-am1-R.bigfish.com (10.3.201.246) by
	AM1EHSOBE002.bigfish.com (10.3.204.22) with Microsoft SMTP Server id
	14.1.225.22; Tue, 11 Oct 2011 13:59:30 +0000
Received: from mail89-am1 (localhost.localdomain [127.0.0.1])	by
	mail89-am1-R.bigfish.com (Postfix) with ESMTP id 731841318463	for
	<xen-devel@lists.xensource.com>; Tue, 11 Oct 2011 13:59:30 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzc85dhzz1202hzz8275bhz32i668h839h34h61h)
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 mail89-am1 (localhost.localdomain [127.0.0.1]) by mail89-am1
	(MessageSwitch) id 1318341515571504_21041;
	Tue, 11 Oct 2011 13:58:35 +0000 (UTC)
Received: from AM1EHSMHS018.bigfish.com (unknown [10.3.201.244])	by
	mail89-am1.bigfish.com (Postfix) with ESMTP id CAF726D81F2	for
	<xen-devel@lists.xensource.com>; Tue, 11 Oct 2011 13:57:41 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	AM1EHSMHS018.bigfish.com (10.3.206.21) with Microsoft SMTP Server id
	14.1.225.22; Tue, 11 Oct 2011 13:57:37 +0000
X-WSS-ID: 0LSWMRY-01-8X2-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 292A510280BB	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 08:57:33 -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, 11 Oct 2011 08:57:43 -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, 11 Oct 2011 08:57:35 -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, 11 Oct 2011
	09:57:34 -0400
Message-ID: <4E944B4D.3060704@amd.com>
Date: Tue, 11 Oct 2011 15:57:33 +0200
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>
Content-Type: multipart/mixed; boundary="------------080100090603060100050809"
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH] nestedsvm: fix HSAVE_PA MSR
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

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


Accessing HSAVE_PA MSR does not require SVM to be enabled nor any
special guest paging mode.
But accessing HSAVE_PA MSR requires the address to be 4k aligned.

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

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

diff -r a1fcb77b2ccb xen/arch/x86/hvm/svm/nestedsvm.c
--- a/xen/arch/x86/hvm/svm/nestedsvm.c	Fri Sep 09 10:22:40 2011 +0200
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c	Tue Oct 11 15:56:44 2011 +0200
@@ -51,7 +51,8 @@ nestedsvm_vcpu_stgi(struct vcpu *v)
 static int
 nestedsvm_vmcb_isvalid(struct vcpu *v, uint64_t vmcxaddr)
 {
-    if ( !hvm_svm_enabled(v) || hvm_guest_x86_mode(v) < 2 )
+    /* Address must be 4k aligned */
+    if ( (vmcxaddr & ~PAGE_MASK) != 0 )
         return 0;
 
     /* Maximum valid physical address.

--------------080100090603060100050809
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

--------------080100090603060100050809--


From xen-devel-bounces@lists.xensource.com Tue Oct 11 07:06:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 07:06:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDcyf-00083L-Hs; Tue, 11 Oct 2011 07:06:41 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDcst-0007Ps-EE
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 07:00:48 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318341526!39850196!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19887 invoked from network); 11 Oct 2011 13:58:47 -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; 11 Oct 2011 13:58:47 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 15:00:40 +0100
Message-Id: <4E946826020000780005AC02@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 15:00:38 +0100
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] linux-2.6.18: streamline clearing of memory in
	a few places
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 kzalloc() in favor of kmalloc()+memset() in one more spot
- use clear_page() in favor of memset(, 0, PAGE_SIZE) (also use
  copy_page() in favor of memcpy(, , PAGE_SIZE))
- don't redundantly clear memory

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/arch/i386/mm/init-xen.c
+++ b/arch/i386/mm/init-xen.c
@@ -558,7 +558,7 @@ void __init paging_init(void)
 	 * dummy page. */
 	set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info);
 	HYPERVISOR_shared_info =3D (shared_info_t *)fix_to_virt(FIX_SHARED_=
INFO);
-	memset(empty_zero_page, 0, sizeof(empty_zero_page));
+	clear_page(empty_zero_page);
=20
 	/* Setup mapping of lower 1st MB */
 	for (i =3D 0; i < NR_FIX_ISAMAPS; i++)
--- a/arch/x86_64/mm/init-xen.c
+++ b/arch/x86_64/mm/init-xen.c
@@ -218,7 +218,7 @@ static __init void *spp_getpage(void)
 	else if (start_pfn < table_end) {
 		ptr =3D __va(start_pfn << PAGE_SHIFT);
 		start_pfn++;
-		memset(ptr, 0, PAGE_SIZE);
+		clear_page(ptr);
 	} else
 		ptr =3D alloc_bootmem_pages(PAGE_SIZE);
 	if (!ptr || ((unsigned long)ptr & ~PAGE_MASK))
@@ -376,7 +376,7 @@ static __meminit void *alloc_static_page
=20
 	*phys =3D start_pfn << PAGE_SHIFT;
 	start_pfn++;
-	memset((void *)va, 0, PAGE_SIZE);
+	clear_page((void *)va);
 	return (void *)va;
 }=20
=20
@@ -728,7 +728,7 @@ static void xen_finish_init_mapping(void
 	/* Switch to the real shared_info page, and clear the dummy page. =
*/
 	set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info);
 	HYPERVISOR_shared_info =3D (shared_info_t *)fix_to_virt(FIX_SHARED_=
INFO);
-	memset(empty_zero_page, 0, sizeof(empty_zero_page));
+	clear_page(empty_zero_page);
=20
 	/* Set up mapping of lowest 1MB of physical memory. */
 	for (i =3D 0; i < NR_FIX_ISAMAPS; i++)
--- a/drivers/xen/core/gnttab.c
+++ b/drivers/xen/core/gnttab.c
@@ -543,7 +543,7 @@ int gnttab_copy_grant_page(grant_ref_t r
=20
 	new_addr =3D page_address(new_page);
 	addr =3D page_address(page);
-	memcpy(new_addr, addr, PAGE_SIZE);
+	copy_page(new_addr, addr);
=20
 	pfn =3D page_to_pfn(page);
 	mfn =3D pfn_to_mfn(pfn);
--- a/drivers/xen/core/machine_reboot.c
+++ b/drivers/xen/core/machine_reboot.c
@@ -89,7 +89,7 @@ static void post_suspend(int suspend_can
 		BUG();
 	HYPERVISOR_shared_info =3D (shared_info_t *)fix_to_virt(FIX_SHARED_=
INFO);
=20
-	memset(empty_zero_page, 0, PAGE_SIZE);
+	clear_page(empty_zero_page);
=20
 	fpp =3D PAGE_SIZE/sizeof(unsigned long);
 	for (i =3D 0, j =3D 0, k =3D -1; i < max_pfn; i +=3D fpp, j++) {
--- a/drivers/xen/core/smpboot.c
+++ b/drivers/xen/core/smpboot.c
@@ -198,17 +198,12 @@ static void __cpuinit cpu_initialize_con
 	ctxt.flags =3D VGCF_IN_KERNEL;
 	ctxt.user_regs.ds =3D __USER_DS;
 	ctxt.user_regs.es =3D __USER_DS;
-	ctxt.user_regs.fs =3D 0;
-	ctxt.user_regs.gs =3D 0;
 	ctxt.user_regs.ss =3D __KERNEL_DS;
 	ctxt.user_regs.eip =3D (unsigned long)cpu_bringup_and_idle;
 	ctxt.user_regs.eflags =3D X86_EFLAGS_IF | 0x1000; /* IOPL_RING1 */
=20
-	memset(&ctxt.fpu_ctxt, 0, sizeof(ctxt.fpu_ctxt));
-
 	smp_trap_init(ctxt.trap_ctxt);
=20
-	ctxt.ldt_ents =3D 0;
=20
 	ctxt.gdt_frames[0] =3D virt_to_mfn(gdt_descr->address);
 	ctxt.gdt_ents      =3D gdt_descr->size / 8;
--- a/drivers/xen/netback/interface.c
+++ b/drivers/xen/netback/interface.c
@@ -236,7 +236,6 @@ netif_t *netif_alloc(struct device *pare
 	SET_NETDEV_DEV(dev, parent);
=20
 	netif =3D netdev_priv(dev);
-	memset(netif, 0, sizeof(*netif));
 	netif->domid  =3D domid;
 	netif->handle =3D handle;
 	netif->can_sg =3D 1;
--- a/drivers/xen/sfc_netutil/accel_cuckoo_hash.c
+++ b/drivers/xen/sfc_netutil/accel_cuckoo_hash.c
@@ -76,7 +76,7 @@ int cuckoo_hash_init(cuckoo_hash_table *
 	BUG_ON(length_bits >=3D sizeof(unsigned) * 8);
 	BUG_ON(key_length > sizeof(cuckoo_hash_key));
=20
-	table_mem =3D kmalloc(sizeof(cuckoo_hash_entry) * 2 * length, =
GFP_KERNEL);
+	table_mem =3D kzalloc(sizeof(cuckoo_hash_entry) * 2 * length, =
GFP_KERNEL);
=20
 	if (table_mem =3D=3D NULL)
 		return -ENOMEM;
@@ -92,9 +92,6 @@ int cuckoo_hash_init(cuckoo_hash_table *
=20
 	set_hash_parameters(hashtab);
=20
-	/* Zero the table */
-	memset(hashtab->table0, 0, length * 2 * sizeof(cuckoo_hash_entry));=

-
 	return 0;
 }
 EXPORT_SYMBOL_GPL(cuckoo_hash_init);
--- a/drivers/xen/tpmback/interface.c
+++ b/drivers/xen/tpmback/interface.c
@@ -93,7 +93,7 @@ int tpmif_map(tpmif_t *tpmif, grant_ref_
 	tpmif->tx_area =3D area;
=20
 	tpmif->tx =3D (tpmif_tx_interface_t *)area->addr;
-	memset(tpmif->tx, 0, PAGE_SIZE);
+	clear_page(tpmif->tx);
=20
 	err =3D bind_interdomain_evtchn_to_irqhandler(
 		tpmif->domid, evtchn, tpmif_be_int, 0, tpmif->devname, =
tpmif);



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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 07:12:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 07:12:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDd3q-0000mT-VT; Tue, 11 Oct 2011 07:12:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDd1K-0008Lj-2V
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 07:09:26 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318342162!558357!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6927 invoked from network); 11 Oct 2011 14:09:23 -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 Oct 2011 14:09:23 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 15:09:22 +0100
Message-Id: <4E946A31020000780005AC11@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 15:09:21 +0100
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] linux-2.6.18: don't build firmware bits for
	non-privileged 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

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/arch/i386/Kconfig
+++ b/arch/i386/Kconfig
@@ -452,7 +452,9 @@ source "net/Kconfig"
 	bool
 	default n
=20
+if !XEN_UNPRIVILEGED_GUEST
 source "drivers/firmware/Kconfig"
+endif
=20
 choice
 	prompt "High Memory Support"
--- a/arch/x86_64/Kconfig
+++ b/arch/x86_64/Kconfig
@@ -682,7 +682,9 @@ source "net/Kconfig"
=20
 source drivers/Kconfig
=20
+if !XEN_UNPRIVILEGED_GUEST
 source "drivers/firmware/Kconfig"
+endif
=20
 source fs/Kconfig
=20
--- a/drivers/xen/core/Makefile
+++ b/drivers/xen/core/Makefile
@@ -2,9 +2,10 @@
 # Makefile for the linux kernel.
 #
=20
-obj-y :=3D evtchn.o gnttab.o features.o reboot.o machine_reboot.o =
firmware.o
+obj-y :=3D evtchn.o gnttab.o features.o reboot.o machine_reboot.o
=20
 obj-$(CONFIG_PCI)		+=3D pci.o
+obj-$(CONFIG_XEN_PRIVILEGED_GUEST) +=3D firmware.o
 obj-$(CONFIG_PROC_FS)		+=3D xen_proc.o
 obj-$(CONFIG_SYS_HYPERVISOR)	+=3D hypervisor_sysfs.o
 obj-$(CONFIG_HOTPLUG_CPU)	+=3D cpu_hotplug.o
--- a/include/xen/firmware.h
+++ b/include/xen/firmware.h
@@ -5,6 +5,10 @@
 void copy_edd(void);
 #endif
=20
+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
 void copy_edid(void);
+#else
+static inline void copy_edid(void) {}
+#endif
=20
 #endif /* __XEN_FIRMWARE_H__ */




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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 07:13:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 07:13:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDd59-0001D9-7v; Tue, 11 Oct 2011 07:13:23 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDd4e-00010p-CH
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 07:12:52 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1318342369!562313!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12971 invoked from network); 11 Oct 2011 14:12:49 -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;
	11 Oct 2011 14:12:49 -0000
X-IronPort-AV: E=Sophos;i="4.68,523,1312156800"; 
   d="scan'208";a="8328952"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Oct 2011 14:12: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; Tue, 11 Oct 2011 15:12:07 +0100
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 1RDd3v-00037F-C9;
	Tue, 11 Oct 2011 14:12:07 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RDd3v-0004fs-8W;
	Tue, 11 Oct 2011 15:12:07 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9245-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 11 Oct 2011 15:12:07 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9245: 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 9245 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9245/

Failures :-/ but no regressions.

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

version targeted for testing:
 xen                  1185ae04b5aa
baseline version:
 xen                  b8b413d8b2df

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Olaf Hering <olaf@aepfle.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                                     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=1185ae04b5aa
+ . 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 1185ae04b5aa
+ branch=xen-unstable
+ revision=1185ae04b5aa
+ . 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 1185ae04b5aa 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 Tue Oct 11 07:14:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 07:14:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDd6O-0001ah-Vp; Tue, 11 Oct 2011 07:14:41 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDd5s-0001Ob-9R
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 07:14:08 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318342426!46174813!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31550 invoked from network); 11 Oct 2011 14:13:46 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Oct 2011 14:13:46 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Tue, 11 Oct 2011 15:14:04 +0100
Message-Id: <4E946B4A020000780005AC1A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Tue, 11 Oct 2011 15:14:02 +0100
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] linux-2.6.18/x86-64/MCE: eliminate redundant
	setting of interface version
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 already gets done in HYPERVISOR_mca().

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/arch/x86_64/kernel/mce_dom0.c
+++ b/arch/x86_64/kernel/mce_dom0.c
@@ -61,7 +61,6 @@ static irqreturn_t mce_dom0_interrupt(in
=20
 	printk(KERN_DEBUG "MCE_DOM0_LOG: enter dom0 mce vIRQ handler\n");
 	mc_op.cmd =3D XEN_MC_fetch;
-	mc_op.interface_version =3D XEN_MCA_INTERFACE_VERSION;
 	set_xen_guest_handle(mc_op.u.mc_fetch.data, g_mi);
 urgent:
 	mc_op.u.mc_fetch.flags =3D XEN_MC_URGENT;




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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 07:53:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 07:53:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDdiE-0003S1-R9; Tue, 11 Oct 2011 07:53:46 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDdgw-00031C-6t
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 07:52:28 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-9.tower-21.messagelabs.com!1318344694!51916257!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2659 invoked from network); 11 Oct 2011 14:51:35 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-9.tower-21.messagelabs.com with SMTP;
	11 Oct 2011 14:51:35 -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
	p9BEqECJ001015; Tue, 11 Oct 2011 14:52:15 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 p9BEqDZl017432; 
	Tue, 11 Oct 2011 10:52:13 -0400
Message-ID: <4E94582C.4060305@tycho.nsa.gov>
Date: Tue, 11 Oct 2011 10:52:28 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming
	domain 0
References: <1317824920-639-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20109.60188.905267.410813@mariner.uk.xensource.com>
	<4E8DF425.9000807@tycho.nsa.gov>
	<1317973956.21903.281.camel@zakaz.uk.xensource.com>
	<4E8F2AD0.2060904@tycho.nsa.gov>
	<1318251283.21903.424.camel@zakaz.uk.xensource.com>
In-Reply-To: <1318251283.21903.424.camel@zakaz.uk.xensource.com>
X-Enigmail-Version: 1.3
Content-Type: text/plain; charset=UTF-8
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 10/10/2011 08:54 AM, Ian Campbell wrote:
> On Fri, 2011-10-07 at 17:37 +0100, Daniel De Graaf wrote:
>> On 10/07/2011 03:52 AM, Ian Campbell wrote:
>>> On Thu, 2011-10-06 at 19:32 +0100, Daniel De Graaf wrote:
>>>> On 10/06/2011 01:53 PM, Ian Jackson wrote:
>>>>> Daniel De Graaf writes ("[Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming domain 0"):
>>>>>> The xenbus event channel established in xenbus_init is intended to be a
>>>>>> loopback channel, but the remote domain was hardcoded to 0; this will
>>>>>> cause the channel to be unusable when xenstore is not being run in
>>>>>> domain 0.
>>>>>
>>>>> I'm not sure I understand this.
>>>>>
>>>>> ...
>>>>>>  		/* Next allocate a local port which xenstored can bind to */
>>>>>>  		alloc_unbound.dom        = DOMID_SELF;
>>>>>> -		alloc_unbound.remote_dom = 0;
>>>>>> +		alloc_unbound.remote_dom = DOMID_SELF;
>>>>>
>>>>> The comment doesn't suggest that this is supposedly a loopback channel
>>>>> (ie one for use by the xenbus client for signalling to itself,
>>>>> somehow).
>>>>
>>>> The event channel being changed here is a loopback event channel exposed in
>>>> /proc/xen/xsd_port, which xenstored binds to. This code is only used for the
>>>> initial domain; otherwise, the shared info page is used.
>>>
>>> How does this change impact the regular dom0? It will be expecting a
>>> xenstored to startup locally when in reality it actually needs to wait
>>> for another domain and then connect to that.
>>
>> This change does not attempt to address the regular dom0, except for not
>> breaking existing setups where xenstored resides in dom0.
>>
>>> Diego Ongaro did some work several years ago on this issue, it was most
>>> recently re-posted by Alex Zeffert, patches against xen-unstable and the
>>> linux-2.6.18 tree:
>>> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01484.html
>>> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01488.html
>>>
>>> Part of the trick was to fixup the kernel side in a way which was
>>> compatible with both existing Xen releases while also supporting new
>>> releases which support both stub and non-stub xenstore. To do this Diego
>>> setup a lazy xenbus initialisation with a state machine to track which
>>> case was active, with transitions triggered either from the local-mmap
>>> of /proc/xen/xenbus_xsd (so was backwards compatible) or an ioctl called
>>> by the tool which builds the stub domain to tell the dom0 xenbus code
>>> which domain/mfn/evtchn contains the xenstored and dom0's connection to
>>> it (the patcheset includes a cut-down builder which works without
>>> xenstore).
>>>
>>> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01487.html
>>> is the key kernel side patch in that regard.
>>>
>>> Diego did some initial work with xenstored in a Linux domU, but I think
>>> the final patchset was stub-xenstored (i.e. ocaml xenstored on minios,
>>> possibly C xenstored on minios too), so I'm not sure about the xenstored
>>> in Linux domU use case.
>>>
>>> Some of the more trivial bits of this series were committed but the real
>>> meat wasn't really pushed through.
>>>
>>
>> Thanks for pointing out that series; I hadn't seen it yet. The setup I am
>> currently using has a non-Linux dom0, so the state machine in dom0 was not
>> required. A separate minios-based xenstored is the eventual goal; this patch
>> just avoids creating a broken event channel in an initial domain whose
>> domain ID is not 0.
> 
> Although I suspect it was envisaged when the API was written I don't
> think SIF_INITDOMAIN can actually be used (or redefined) to mean
> anything other than dom0 in practice without a whole host of knock-on
> effects and breakage.
> 
> Setting SIF_INITDOMAIN has effects other than xenstore setup on a Linux
> domU, grepping for other uses of xen_initial_domain() shows loads of
> them. e.g. the selection of host vs. pseudo-physical e820, various
> driver setup stuff, some pagetable features, how the console works etc.

Yes; splitting up driver domains requires changing a number of users of
xen_initial_domain to become more fine-grained. Some disaggregation work[1]
requires splitting the SIF_INITDOMAIN flag into a series of finer-grained
flags that includes one for xenstore; this becomes unnecessary if xenstore
detection code does not check SIF_INITDOMAIN.

This patch covers a few cases:

1) Dom0 is Linux, xenstored runs in Dom0
2) Dom0 is domain builder, creating another SIF_INITDOMAIN Linux domain with
   a nonzero domain ID that runs xenstore and other functions
3) Dom0 is domain builder, creating xenstore and a SIF_INITDOMAIN Linux
   domain that uses the external xenstore.

The second and third case require fairly intrusive hypervisor patches, but
the only Linux change required for the second case is the posted fix to the
loopback event channel.

[1] "Breaking Up is Hard to Do: Security and Functionality in a Commodity
Hypervisor" (SOSP 11)

> 
>> I do have a more complex version of this patch that replaces the initial
>> domain check with a check on the start_info structure so that an initial
>> domain can have xenstore information placed in its start_info field like
>> any other domain; would this be of interest?
> 
> If you already have something then it would be interesting to see.
> 
> Ian.
> 

This patch eliminates xen_initial_domain() checks when initializing
xenstore, replacing them with checks on the event channel in the
start_info page.

---

diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
index bd2f90c..cef9b0b 100644
--- a/drivers/xen/xenbus/xenbus_probe.c
+++ b/drivers/xen/xenbus/xenbus_probe.c
@@ -684,64 +684,74 @@ static int __init xenbus_probe_initcall(void)
 
 device_initcall(xenbus_probe_initcall);
 
-static int __init xenbus_init(void)
+/* Set up event channel for xenstored which is run as a local process
+ * (this is normally used only in dom0)
+ */
+static int __init xenstored_local_init(void)
 {
 	int err = 0;
 	unsigned long page = 0;
+	struct evtchn_alloc_unbound alloc_unbound;
 
-	DPRINTK("");
+	/* Allocate Xenstore page */
+	page = get_zeroed_page(GFP_KERNEL);
+	if (!page)
+		goto out_err;
 
-	err = -ENODEV;
-	if (!xen_domain())
-		return err;
+	xen_store_mfn = xen_start_info->store_mfn =
+		pfn_to_mfn(virt_to_phys((void *)page) >>
+			   PAGE_SHIFT);
 
-	/*
-	 * Domain0 doesn't have a store_evtchn or store_mfn yet.
-	 */
-	if (xen_initial_domain()) {
-		struct evtchn_alloc_unbound alloc_unbound;
+	/* Next allocate a local port which xenstored can bind to */
+	alloc_unbound.dom        = DOMID_SELF;
+	alloc_unbound.remote_dom = DOMID_SELF;
 
-		/* Allocate Xenstore page */
-		page = get_zeroed_page(GFP_KERNEL);
-		if (!page)
-			goto out_error;
+	err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
+					  &alloc_unbound);
+	if (err == -ENOSYS)
+		goto out_err;
 
-		xen_store_mfn = xen_start_info->store_mfn =
-			pfn_to_mfn(virt_to_phys((void *)page) >>
-				   PAGE_SHIFT);
+	BUG_ON(err);
+	xen_store_evtchn = xen_start_info->store_evtchn =
+		alloc_unbound.port;
 
-		/* Next allocate a local port which xenstored can bind to */
-		alloc_unbound.dom        = DOMID_SELF;
-		alloc_unbound.remote_dom = 0;
+	return 0;
 
-		err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
-						  &alloc_unbound);
-		if (err == -ENOSYS)
-			goto out_error;
+ out_err:
+	if (page != 0)
+		free_page(page);
+	return err;
+}
 
-		BUG_ON(err);
-		xen_store_evtchn = xen_start_info->store_evtchn =
-			alloc_unbound.port;
+static int __init xenbus_init(void)
+{
+	int err = 0;
 
-		xen_store_interface = mfn_to_virt(xen_store_mfn);
+	if (!xen_domain())
+		return -ENODEV;
+
+	if (xen_hvm_domain()) {
+		uint64_t v = 0;
+		err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
+		if (err)
+			goto out_error;
+		xen_store_evtchn = (int)v;
+		err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v);
+		if (err)
+			goto out_error;
+		xen_store_mfn = (unsigned long)v;
+		xen_store_interface = ioremap(xen_store_mfn << PAGE_SHIFT, PAGE_SIZE);
 	} else {
-		if (xen_hvm_domain()) {
-			uint64_t v = 0;
-			err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
-			if (err)
-				goto out_error;
-			xen_store_evtchn = (int)v;
-			err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v);
+		xen_store_evtchn = xen_start_info->store_evtchn;
+		xen_store_mfn = xen_start_info->store_mfn;
+		if (xen_store_evtchn)
+			xenstored_ready = 1;
+		else {
+			err = xenstored_local_init();
 			if (err)
 				goto out_error;
-			xen_store_mfn = (unsigned long)v;
-			xen_store_interface = ioremap(xen_store_mfn << PAGE_SHIFT, PAGE_SIZE);
-		} else {
-			xen_store_evtchn = xen_start_info->store_evtchn;
-			xen_store_mfn = xen_start_info->store_mfn;
-			xen_store_interface = mfn_to_virt(xen_store_mfn);
-			xenstored_ready = 1;
 		}
+		xen_store_interface = mfn_to_virt(xen_store_mfn);
 	}
 
 	/* Initialize the interface to xenstore. */
@@ -760,12 +770,7 @@ static int __init xenbus_init(void)
 	proc_mkdir("xen", NULL);
 #endif
 
-	return 0;
-
-  out_error:
-	if (page != 0)
-		free_page(page);
-
+ out_error:
 	return err;
 }
 


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 08:19:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 08:19:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDe74-0004IN-18; Tue, 11 Oct 2011 08:19:26 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDe63-00045N-6h
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 08:18:24 -0700
X-Env-Sender: caker@theshore.net
X-Msg-Ref: server-5.tower-21.messagelabs.com!1318346262!51630581!1
X-Originating-IP: [67.18.92.50]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8608 invoked from network); 11 Oct 2011 15:17:43 -0000
Received: from ns.theshore.net (HELO www.theshore.net) (67.18.92.50)
	by server-5.tower-21.messagelabs.com with SMTP;
	11 Oct 2011 15:17:43 -0000
Received: from [192.168.200.106] (c-69-248-252-23.hsd1.nj.comcast.net
	[69.248.252.23])
	by www.theshore.net (8.13.6/8.9.1) with ESMTP id p9BFIH55010810;
	Tue, 11 Oct 2011 11:18:17 -0400
Subject: Re: [Xen-devel] vmalloc_sync_all() patch problems?
Mime-Version: 1.0 (Apple Message framework v1084)
Content-Type: text/plain; charset=us-ascii
From: "Christopher S. Aker" <caker@theshore.net>
In-Reply-To: <20111010155110.GA29026@phenom.oracle.com>
Date: Tue, 11 Oct 2011 11:18:12 -0400
Content-Transfer-Encoding: quoted-printable
Message-Id: <B7DFE1B1-2506-422C-B5C0-F4334BF700F8@theshore.net>
References: <4E832F1A.3030209@theshore.net> <4E83330A.3030509@citrix.com>
	<4E834519.3090300@theshore.net> <4E8353B1.9070007@citrix.com>
	<4E85E26F.1030202@theshore.net>
	<20111010155110.GA29026@phenom.oracle.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-Mailer: Apple Mail (2.1084)
Cc: xen devel <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 Oct 10, 2011, at 11:51 AM, Konrad Rzeszutek Wilk wrote:
> On Fri, Sep 30, 2011 at 11:38:23AM -0400, Christopher S. Aker wrote:
>> On 9/28/11 1:04 PM, David Vrabel wrote:
>>> On 28/09/11 17:02, Christopher S. Aker wrote:
>>>> I've restarted the tests to see if I can reproduce, but I'm certain =
that
>>>> if it happened once, it'll happen again.
>>=20
>> I was able to reproduce it.
>>=20
>>> Instead of the vmalloc_sync_all() patch you could try this series =
instead.
>>>=20
>>> =
http://lists.xensource.com/archives/html/xen-devel/2011-09/msg01343.html
>>=20
>> I'll rebuild using this series and reset the tests.  Will let you =
know!
>=20
> ping?

With that patchset applied: 6 days of thrashing, 30000 domains cycled, =
and no crashes.  I'd say it worked.

Cheers,
-Chris=

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 08:52:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 08:52:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDedG-0005PP-F9; Tue, 11 Oct 2011 08:52:42 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDecg-0005Dd-71
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 08:52:06 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1318348319!37605605!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9284 invoked from network); 11 Oct 2011 15:52:00 -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; 11 Oct 2011 15:52:00 -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
	p9BFpqTc012448
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 11 Oct 2011 15:51:54 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
	p9BFppER024890
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 15:51:52 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9BFpk9X031828; Tue, 11 Oct 2011 10:51:46 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 08:51:45 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id DBB3B157D; Tue, 11 Oct 2011 11:51:33 -0400 (EDT)
Date: Tue, 11 Oct 2011 11:51:33 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
Message-ID: <20111011155133.GC29349@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
	<4E940E21020000780005AA29@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E940E21020000780005AA29@nat28.tlf.novell.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.0A090205.4E94661A.01F1:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "hch@infradead.org" <hch@infradead.org>, Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@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 Tue, Oct 11, 2011 at 08:36:33AM +0100, Jan Beulich wrote:
> >>> On 10.10.11 at 21:57, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> > On Mon, Oct 10, 2011 at 08:20:02PM +0100, Ian Campbell wrote:
> >> On Mon, 2011-10-10 at 17:42 +0100, Konrad Rzeszutek Wilk wrote:
> >> > On Mon, Oct 10, 2011 at 05:13:07PM +0100, Ian Campbell wrote:
> >> 
> >> > > In any case it should also be posted against the canonical inter-guest
> >> > > interface definition in the xen tree for review with that in mind.
> >> > 
> >> > Yes! But I was thinking to first let this one rattle a bit and see what
> >> > folks thought about it before submitting the xen-devel.
> >> 
> >> It's a good idea to get ABI changes out for review before the
> >> implementation rattles around so much that changing it becomes hard.
> > 
> > OK, lets drop this until we get that straigthen out. I've posted
> > http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00642.html the 
> > changes to
> > Xen ABI.
> 
> Yeah, but that didn't get adjusted after IanC's comments (structure
> alignment, BLKIF_OP_DISCARD_FLAG_SECURE value).

My later response to it should include it:
http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00652.html

> 
> Further I wonder why you don't use the "reserved" field instead of
> extending the structure at the end.

<blinks> I completly missed it. That would definitly work as well.

Let me redo it with that in mind.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 08:55:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 08:55:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDefi-0005tX-Ob; Tue, 11 Oct 2011 08:55:14 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDef8-0005hC-Ux
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 08:54:39 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1318348435!63730024!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14699 invoked from network); 11 Oct 2011 15:53:56 -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; 11 Oct 2011 15:53:56 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9BFsTM1016202
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Tue, 11 Oct 2011 15:54:31 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9BFmWUj026496
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 15:48:33 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
	p9BFsN5Q024355; Tue, 11 Oct 2011 10:54:23 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 08:54:23 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 5A512157D; Tue, 11 Oct 2011 11:54:11 -0400 (EDT)
Date: Tue, 11 Oct 2011 11:54:11 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
Message-ID: <20111011155411.GD29349@phenom.oracle.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRcQxQ4vmOn5zYLRCXLPLqoMqO+CKNJVrpnJ3QX3bd+OyA@mail.gmail.com>
	<1318321932.21903.496.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318321932.21903.496.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090205.4E9466B7.01BB,ss=1,re=0.000,fgs=0
Cc: Andy Burns <xen.lists@burns.me.uk>,
	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

> > How can I tell if the iommu=soft is taking effect?
> > Anything stupid I sound like I've forgotten?
> 
> It looks as if you have been pretty thorough. 
> 
> One thing which is not clear is if you also downgraded all the Xen
> utilities/tools packages when you say "Xen packages" or just the
> hypervisor itself. (You probably downgraded everything, but I have to
> ask).
> 
> Does Fedora (yum?) log which packages which it is upgrading? Is it
> possible that e.g. scandvb or the firmware package has also been
> upgraded (I admit this is slightly straw-clutching).
> 
> If you don't passthrough a device are you able to drive it from dom0?
> 
> It would probably be useful to post full dmesg output for hypervisor and
> both kernels.

Andy,

I am going to try to see if I can pass in some of my TV cards in
my guest too. Perhaps that might shed some light.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 08:56:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 08:56:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDeh7-0006Gv-GK; Tue, 11 Oct 2011 08:56:41 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDege-00065A-9T
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 08:56:12 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1318348567!28805379!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 341 invoked from network); 11 Oct 2011 15:56:09 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Oct 2011 15:56:09 -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
	p9BFu3bi018471
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 11 Oct 2011 15:56:04 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
	p9BFtwnw002046
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 15:56:02 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
	p9BFtrer002780; Tue, 11 Oct 2011 10:55:53 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 08:55:53 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 67A914DE; Tue, 11 Oct 2011 11:47:36 -0400 (EDT)
Date: Tue, 11 Oct 2011 11:47:36 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Fwd: xentop reporting zero written sectors
Message-ID: <20111011154736.GB29349@phenom.oracle.com>
References: <CAE1-PRdq9BWjTTHPPBPvESr-ULcdjHgPMTABcCO6+wCLJ1UYog@mail.gmail.com>
	<CAE1-PReA8E-kSif=BU=s-vzOqi-4F4LotxqofH7EEw+dYLtpUA@mail.gmail.com>
	<20111010163129.GF28646@phenom.oracle.com>
	<1318319389.21903.476.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318319389.21903.476.camel@zakaz.uk.xensource.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.4E946715.0089:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Andy Burns <xen.lists@burns.me.uk>,
	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 Tue, Oct 11, 2011 at 08:49:44AM +0100, Ian Campbell wrote:
> On Mon, 2011-10-10 at 17:31 +0100, Konrad Rzeszutek Wilk wrote:
> > On Mon, Oct 10, 2011 at 04:16:04PM +0100, Andy Burns wrote:
> > > No response in xen-users, asking developers ....
> > > 
> > > ---------- Forwarded message ----------
> > > 
> > > Just moving a chunk of files from one filesysstem on xvba to another
> > > on xvdb, and was monitoring with xentop as it was taking longer than
> > > expected.
> > > 
> > > The VBD_RD  and VBD_WR counters were both clocking-up as expected, as
> > > was the VBD_RSECT counter, but the VBD_WSECT counter was stuck on
> > > zero, I toggled on the individual VBD device counters and these showed
> > > the same (with the RD and WR counters correctly split between my
> > > source and destination disks)
> > 
> > Huh. Imagine that!
> > > 
> > > Is this a long standing "feature" that I've never noticed before or a
> > > problem that should be reported?
> > 
> > Must be a feature. We would never write code with bugs. Never :-)
> > 
> > I think this new "feature" below will fix it for you:
> > 
> > 
> > diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> > index 0bd7143..3e2ca68 100644
> > --- a/drivers/block/xen-blkback/blkback.c
> > +++ b/drivers/block/xen-blkback/blkback.c
> > @@ -778,7 +778,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
> >  
> >  	if (operation == READ)
> >  		blkif->st_rd_sect += preq.nr_sects;
> > -	else if (operation == WRITE || operation == WRITE_FLUSH)
> > +	else if (operation == WRITE_ODIRECT || operation == WRITE_FLUSH)
> 
> Would it be sane to key this off req->operation and BLKIF_OP_* instead
> of first encoding them as block layer operations and then decoding back
> again? The use of operation here just seems to be adding a layer of
> indirection which we don't want or need.
> 
> Or maybe (operation & WRITE) instead of == ?

I am not really sure why we do all of those 'operation' thingies.

I think I will do a lookup function that will do the proper
lookup give it to the bio layer once it is required instead of doing
this ... extra work.

But lets do that in the next set of patches and just treat this
one as a bug-fix.


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 09:30:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 09:30:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDfDL-0007Ag-Mi; Tue, 11 Oct 2011 09:29:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDfCJ-0006xm-2B; Tue, 11 Oct 2011 09:28:55 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318350531!19066626!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12075 invoked from network); 11 Oct 2011 16:28:51 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 16:28:51 -0000
Received: by wyh13 with SMTP id 13so9654121wyh.30
	for <multiple recipients>; Tue, 11 Oct 2011 09:28:51 -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=Q43+6Nf7urnC1IECq33Sb2QPmOgoGronmLVIXWugBNI=;
	b=GLvZty4I8x/zYWEDgntSoOBBP2pOmXyNY2J70RoZlNdQkq2uibo5L5Yjzw6TUCIC4q
	g/EhgAjnP3jyF5i0ah9BzaYg5hGBGGwAuIoRmih6yZEKrHX6mbvno8KnxTZjG6uxNbvr
	uDkOtDBoIgPchOERnFg86R4ZyJ3Hjny2nkTzQ=
Received: by 10.227.25.197 with SMTP id a5mr4309216wbc.71.1318350531308;
	Tue, 11 Oct 2011 09:28:51 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id
	gg21sm39357564wbb.15.2011.10.11.09.28.43
	(version=SSLv3 cipher=OTHER); Tue, 11 Oct 2011 09:28:49 -0700 (PDT)
Message-ID: <4E946EB9.7050209@xen.org>
Date: Tue, 11 Oct 2011 17:28:41 +0100
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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Xen document day (Oct 12 or 26)
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org>
	<20111003185309.GC15608@phenom.oracle.com>
	<4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
In-Reply-To: <20111010160404.GB28646@phenom.oracle.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Joseph Glanville <joseph.glanville@orionvm.com.au>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

OK, 26th of October it is: I'll come up with some ideas and share them 
early next week
Lars

On 10/10/2011 17:04, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 10, 2011 at 12:33:29PM +0100, Lars Kurth wrote:
>> Looks like me being maxed out means we are too close to Oct 12th
>> now. Does anybody object to doing this on the 26th?
> I am OK.
>> How long will the day be? An afternoon? A whole day with rolling
>> time-zones?
> One day. As much as people can do I would think.
>
>>> In lots of ways. There is a lot of things that we want to do - but
>> I don't think we can do
>>> _all_ of them. Can you help us determine what ought to have a
>> higher priority?
>> In a nutshell:
>> - We should focus on some of the shortfalls we identified at the Hackathon
>>    (CLI guides, man pages, etc.)?
>> - We should also do a quick Wiki sanity check (i.e. identify
>> important pages, which are wrong)
>>    I can help guide this
>>
>> Maybe we can split into two groups
> <nods>


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 09:53:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 09: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 1RDfZn-0000Ud-PB; Tue, 11 Oct 2011 09:53:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDfYw-0000Hg-2O
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 09:52:18 -0700
X-Env-Sender: bsingharora@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318351916!46197464!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23828 invoked from network); 11 Oct 2011 16:51:56 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 16:51:56 -0000
Received: by eyb6 with SMTP id 6so5366226eyb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 09:52:14 -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:content-transfer-encoding;
	bh=a3+8I6pPozrRGAy+RzqGrC8arvx2MPGj2m9K50M2H54=;
	b=NL9F37Qzkh7t/G3Y1nO1b0vGwYNKYgjpQBIKKeGTRM8WXhUVZZCtnKnCtm+nGiEQcn
	SAjmuEdG3vpfNS5GLXdkHCH6x8/8i6ptLbb5xnuM+j4PMb8HnMeJLFCIjE+W8jCfjZmp
	1cSJFnAooWnxiSvoVTzIagD4fg9YUOPKoO9B8=
MIME-Version: 1.0
Received: by 10.223.65.68 with SMTP id h4mr39952235fai.24.1318351934535; Tue,
	11 Oct 2011 09:52:14 -0700 (PDT)
Received: by 10.152.41.233 with HTTP; Tue, 11 Oct 2011 09:52:14 -0700 (PDT)
In-Reply-To: <20111011082618.GC88076@ocelot.phlegethon.org>
References: <CAKTCnzkyYASOH_gaf+4pQoGqM4q=1r=mfLHcoP-5oy59yyHbXw@mail.gmail.com>
	<20111011082618.GC88076@ocelot.phlegethon.org>
Date: Tue, 11 Oct 2011 22:22:14 +0530
Message-ID: <CAKTCnzkYrxaammwm12==7O5bxxbhdtjREWi+WsKsLd9mDrQm4w@mail.gmail.com>
Subject: Re: [Xen-devel] Trap flags, debug and emulation - xen 4.1.1
From: Balbir Singh <bsingharora@gmail.com>
To: Tim Deegan <tim@xen.org>
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 Tue, Oct 11, 2011 at 1:56 PM, Tim Deegan <tim@xen.org> wrote:
> Hi,
>
> At 08:39 +0530 on 11 Oct (1318322368), Balbir Singh wrote:
>> =A0I am doing something very similar. I do get the fault and I can set
>> =A0the trap, but I don't see any form of single stepping take place as I
>> =A0do not get the TRAP_debug exception back. My exception_bitmap has
>> =A0TRAP_no_device, TRAP_page_fault, TRAP_debug and TRAP_int3 set.
>>
>> =A0I've tried debugging the issue with xentrace and printks, but sadly I
>> =A0could not track down the issue. The CPU does have
>> =A0cpu_has_monitor_trap_flag set to true.
>>
>> =A0Could anyone give me clues on how to track down why I did not get a
>> =A0TRAP_debug exception via a VMEXIT?
>
> It sounds like you're doing the right thing - just a question of looking
> for the bug. :) =A0I would try checking for the TF flag as close as
> possible to the vmenter (maybe even in the assembly - you could call out
> to a special C function if it's set), and for the debug vmexit right at t=
he
> top of the vmexit handler to make sure that some other clever debugging
> code isn't consuming it. =A0 Probably also worth double-chjecking that
> nothing else ois overwriting the exception bitmap before the vmenter.
>

Hi, Tim,

Thanks, I am taking the debugging to entry.S, I can see the flags
(UREGS_eflags) have the bit set on VMENTRY, but mostly disabled on
VMEXIT. I wonder if the guest operating system is playing with the
bit, I doubt it though. I'll continue debugging

Balbir Singh

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 10:14:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 10:14:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDfup-0001pf-MM; Tue, 11 Oct 2011 10:14:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDftg-0001c6-Ka
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 10:13:49 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318353221!19070870!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10345 invoked from network); 11 Oct 2011 17:13:41 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-2.tower-182.messagelabs.com with SMTP;
	11 Oct 2011 17:13:41 -0000
Received: from [83.211.179.105] (account d.faggioli@sssup.it HELO
	[192.168.0.3]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72329039 for xen-devel@lists.xensource.com;
	Tue, 11 Oct 2011 19:13:39 +0200
From: Dario Faggioli <raistlin@linux.it>
To: xen-devel <xen-devel@lists.xensource.com>
Date: Tue, 11 Oct 2011 19:13:38 +0200
Face: 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
X-Mailer: Evolution 3.0.3 (3.0.3-1.fc15) 
Message-ID: <1318353219.21925.80.camel@Palantir>
Mime-Version: 1.0
Subject: [Xen-devel] BUG: sleeping function called from invalid 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>
Content-Type: multipart/mixed; boundary="===============1878746814=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============1878746814==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-1uM0+RDnxMUvpGfV/Wyv"


--=-1uM0+RDnxMUvpGfV/Wyv
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hello everyone,

Since I really plan to spend some time here, let me introduce myself
first. My name is Dario Faggioli and I just joined the Citrix Platform
Team in Cambridge (although I'll be working from Italy). I've some
experience in Linux kernel (mainly scheduling) and not that much
experience in Xen or virtualization in general, but I really want to
learn and be able to contribute ASAP!

In fact, while "doing my homework", I stumbled against the following
BUG(). I'm able to reproduce it with xen-unstable and by just by
enabling spinlock and mutex debug checks in linus' Linux
(65112dccf8a113737684366349d7f9ec373ddc47) _iff_ using 'tap:qcow2' disk
image, while no such thing happens with 'phy:'.

[  996.282544] BUG: sleeping function called from invalid context at /local=
/scratch/dariof/linux/kernel/mutex.c:271
[  996.282570] in_atomic(): 1, irqs_disabled(): 0, pid: 3256, name: qemu-dm
[  996.282581] 1 lock held by qemu-dm/3256:
[  996.282589]  #0:  (&(&priv->lock)->rlock){......}, at: [<ffffffff813223d=
a>] gntdev_ioctl+0x2bd/0x4d5
[  996.282628] Pid: 3256, comm: qemu-dm Tainted: G        W   3.1.0-rc8+ #5
[  996.282638] Call Trace:
[  996.282687]  [<ffffffff81054594>] __might_sleep+0x131/0x135
[  996.282704]  [<ffffffff816bd64f>] mutex_lock_nested+0x25/0x45
[  996.282721]  [<ffffffff8131c7c8>] free_xenballooned_pages+0x20/0xb1
[  996.282735]  [<ffffffff8132194d>] gntdev_put_map+0xa8/0xdb
[  996.282749]  [<ffffffff816be546>] ? _raw_spin_lock+0x71/0x7a
[  996.282763]  [<ffffffff813223da>] ? gntdev_ioctl+0x2bd/0x4d5
[  996.282776]  [<ffffffff8132243c>] gntdev_ioctl+0x31f/0x4d5
[  996.282790]  [<ffffffff81007d62>] ? check_events+0x12/0x20
[  996.282804]  [<ffffffff811433bc>] do_vfs_ioctl+0x488/0x4d7
[  996.282818]  [<ffffffff81007d4f>] ? xen_restore_fl_direct_reloc+0x4/0x4
[  996.282832]  [<ffffffff8109168b>] ? lock_release+0x21c/0x229
[  996.282847]  [<ffffffff81135cdd>] ? rcu_read_unlock+0x21/0x32
[  996.282860]  [<ffffffff81143452>] sys_ioctl+0x47/0x6a
[  996.282873]  [<ffffffff816bfd82>] system_call_fastpath+0x16/0x1b

This seems to be due to free_xenballooned_pages(), called by
gntdev_put_map(), taking balloon_mutex, with the latter that can be
called within a spin_lock() (e.g., in gntdev_release()).

I'm not enough confident with the code do attempt fixing it, but I
thought it was worth to at least point it out!

Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-1uM0+RDnxMUvpGfV/Wyv
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

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

iEYEABECAAYFAk6UeUIACgkQk4XaBE3IOsR2QQCgrd7Sv98EwSTgWA42BdHGOkkW
6yIAmwbbhz7Zm2/J1Apig+q+m6zCBAeL
=++5F
-----END PGP SIGNATURE-----

--=-1uM0+RDnxMUvpGfV/Wyv--



--===============1878746814==
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

--===============1878746814==--



From xen-devel-bounces@lists.xensource.com Tue Oct 11 10:16:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 10:16:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDfwB-0002DE-CV; Tue, 11 Oct 2011 10:16:19 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDfuC-0001gR-Sn
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 10:14:17 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318353236!57633158!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14854 invoked from network); 11 Oct 2011 17:13:57 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 11 Oct 2011 17:13:57 -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 89513916D;
	Tue, 11 Oct 2011 10:14:11 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 7FEB820586;
	Tue, 11 Oct 2011 10:14:09 -0700 (PDT)
Message-ID: <4E947961.1050604@goop.org>
Date: Tue, 11 Oct 2011 10:14:09 -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: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] linux-2.6.18: improve floppy behavior
References: <4E9463C1020000780005ABE9@nat28.tlf.novell.com>
In-Reply-To: <4E9463C1020000780005ABE9@nat28.tlf.novell.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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 06:41 AM, Jan Beulich wrote:
> Timing is significantly different from native both because Xen traps
> I/O port accesses and since DMA use is not possible (without intrusive
> changes). Due to the overhead of trapped port accesses, I/O is already
> slow enough (and Xen doesn't run on very old hardware anyway), so the
> situation can easily be improved by not enforcing REALLY_SLOW_IO.
>
> This doesn't completely address the issue - Xen just cannot guarantee
> scheduling of a particular vCPU with a maximum latency of about 80us
> (needed for the default FIFO threshold value of 10). The only complete
> solution would require making ISA DMA usable on Xen.

Just out of curiosity, was this in response to a real bug report or
something?

    J


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 10:29:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 10:29:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDg90-0003cz-F5; Tue, 11 Oct 2011 10:29:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDg8N-0003QX-C9
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 10:28:55 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318354120!41198899!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12757 invoked from network); 11 Oct 2011 17:28:41 -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; 11 Oct 2011 17:28:41 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9BHSlEU027668
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Tue, 11 Oct 2011 17:28:49 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9BHMo3T007288
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 17:22:50 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
	p9BHSf2N013408; Tue, 11 Oct 2011 12:28:41 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 10:28:41 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 84AE14DE; Tue, 11 Oct 2011 13:28:38 -0400 (EDT)
Date: Tue, 11 Oct 2011 13:28:38 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Christopher S. Aker" <caker@theshore.net>
Subject: Re: [Xen-devel] vmalloc_sync_all() patch problems?
Message-ID: <20111011172838.GA32406@phenom.oracle.com>
References: <4E832F1A.3030209@theshore.net> <4E83330A.3030509@citrix.com>
	<4E834519.3090300@theshore.net> <4E8353B1.9070007@citrix.com>
	<4E85E26F.1030202@theshore.net>
	<20111010155110.GA29026@phenom.oracle.com>
	<B7DFE1B1-2506-422C-B5C0-F4334BF700F8@theshore.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <B7DFE1B1-2506-422C-B5C0-F4334BF700F8@theshore.net>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090205.4E947CD1.0155,ss=1,re=0.000,fgs=0
Cc: xen devel <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 Tue, Oct 11, 2011 at 11:18:12AM -0400, Christopher S. Aker wrote:
> On Oct 10, 2011, at 11:51 AM, Konrad Rzeszutek Wilk wrote:
> > On Fri, Sep 30, 2011 at 11:38:23AM -0400, Christopher S. Aker wrote:
> >> On 9/28/11 1:04 PM, David Vrabel wrote:
> >>> On 28/09/11 17:02, Christopher S. Aker wrote:
> >>>> I've restarted the tests to see if I can reproduce, but I'm certain that
> >>>> if it happened once, it'll happen again.
> >> 
> >> I was able to reproduce it.
> >> 
> >>> Instead of the vmalloc_sync_all() patch you could try this series instead.
> >>> 
> >>> http://lists.xensource.com/archives/html/xen-devel/2011-09/msg01343.html
> >> 
> >> I'll rebuild using this series and reset the tests.  Will let you know!
> > 
> > ping?
> 
> With that patchset applied: 6 days of thrashing, 30000 domains cycled, and no crashes.  I'd say it worked.

Excellent. You got any more bugs that we should be aware off ? (hopefully not).

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 10:31:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 10:31:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDgAj-000417-UH; Tue, 11 Oct 2011 10:31:22 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDgAJ-0003oj-Fu
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 10:30:56 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318354252!19078434!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27707 invoked from network); 11 Oct 2011 17:30: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;
	11 Oct 2011 17:30:52 -0000
X-IronPort-AV: E=Sophos;i="4.68,524,1312156800"; 
   d="scan'208";a="8334249"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Oct 2011 17:30: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; Tue, 11 Oct 2011 18:30:52 +0100
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 1RDgAF-0004EY-KX;
	Tue, 11 Oct 2011 17:30:51 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RDgAF-0003ff-Gw;
	Tue, 11 Oct 2011 18:30:51 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9246-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 11 Oct 2011 18:30:51 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9246: 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 9246 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9246/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10     fail REGR. vs. 9245

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

version targeted for testing:
 xen                  4b0907c6a08c
baseline version:
 xen                  1185ae04b5aa

------------------------------------------------------------
People who touched revisions under test:
  Guido Gunther <agx@sigxcpu.org>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Olaf Hering <olaf@aepfle.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


Not pushing.

------------------------------------------------------------
changeset:   23944:4b0907c6a08c
tag:         tip
user:        Guido Gunther <agx@sigxcpu.org>
date:        Tue Oct 11 12:02:58 2011 +0100
    
    pygrub: add debug flag
    
    Debugging config file errors is tedious so help a bit by not silently
    dropping parsing exceptions when --debug is given. Also intialize the
    logging API at debug level in this case.
    
    Signed-off-by: Guido Gunther <agx@sigxcpu.org>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23943:1185ae04b5aa
user:        Olaf Hering <olaf@aepfle.de>
date:        Tue Oct 11 10:46:28 2011 +0100
    
    xenpaging: clear page content after evict
    
    If the guest happens to read from the gfn while xenpaging is in the process of
    evicting the page, the guest may read zeros instead of actual data.
    Also if eviction fails the page content will be corrupted and xenpaging wont
    attempt to restore the page.
    
    Remove page scrubbing from pager and do it after successful eviction.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
========================================
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 Tue Oct 11 10:33:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 10:33:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDgCs-0004Tg-TL; Tue, 11 Oct 2011 10:33:34 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDgCI-0004HL-P3
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 10:32:59 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318354374!34837434!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29745 invoked from network); 11 Oct 2011 17:32:55 -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 Oct 2011 17:32:55 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9BHWmI5000456
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Tue, 11 Oct 2011 17:32:50 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9BHQoOY015882
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 17:26:50 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
	p9BHWf06016760; Tue, 11 Oct 2011 12:32:41 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 10:32:40 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 067204DE; Tue, 11 Oct 2011 13:32:28 -0400 (EDT)
Date: Tue, 11 Oct 2011 13:32:28 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Dario Faggioli <raistlin@linux.it>, dgdegra@tycho.nsa.gov
Subject: Re: [Xen-devel] BUG: sleeping function called from invalid context
Message-ID: <20111011173228.GB32406@phenom.oracle.com>
References: <1318353219.21925.80.camel@Palantir>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318353219.21925.80.camel@Palantir>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090206.4E947DC2.00D0,ss=1,re=0.000,fgs=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 Tue, Oct 11, 2011 at 07:13:38PM +0200, Dario Faggioli wrote:
> Hello everyone,
> 
> Since I really plan to spend some time here, let me introduce myself
> first. My name is Dario Faggioli and I just joined the Citrix Platform
> Team in Cambridge (although I'll be working from Italy). I've some
> experience in Linux kernel (mainly scheduling) and not that much
> experience in Xen or virtualization in general, but I really want to
> learn and be able to contribute ASAP!
> 
> In fact, while "doing my homework", I stumbled against the following
> BUG(). I'm able to reproduce it with xen-unstable and by just by
> enabling spinlock and mutex debug checks in linus' Linux
> (65112dccf8a113737684366349d7f9ec373ddc47) _iff_ using 'tap:qcow2' disk
> image, while no such thing happens with 'phy:'.

Aha.. I saw that at some point but never narrowed it down to the
right combination. Thank you for tracking this down.

I am CC Daniel who might have some patches for this or ideas.
> 
> [  996.282544] BUG: sleeping function called from invalid context at /local/scratch/dariof/linux/kernel/mutex.c:271
> [  996.282570] in_atomic(): 1, irqs_disabled(): 0, pid: 3256, name: qemu-dm
> [  996.282581] 1 lock held by qemu-dm/3256:
> [  996.282589]  #0:  (&(&priv->lock)->rlock){......}, at: [<ffffffff813223da>] gntdev_ioctl+0x2bd/0x4d5
> [  996.282628] Pid: 3256, comm: qemu-dm Tainted: G        W   3.1.0-rc8+ #5
> [  996.282638] Call Trace:
> [  996.282687]  [<ffffffff81054594>] __might_sleep+0x131/0x135
> [  996.282704]  [<ffffffff816bd64f>] mutex_lock_nested+0x25/0x45
> [  996.282721]  [<ffffffff8131c7c8>] free_xenballooned_pages+0x20/0xb1
> [  996.282735]  [<ffffffff8132194d>] gntdev_put_map+0xa8/0xdb
> [  996.282749]  [<ffffffff816be546>] ? _raw_spin_lock+0x71/0x7a
> [  996.282763]  [<ffffffff813223da>] ? gntdev_ioctl+0x2bd/0x4d5
> [  996.282776]  [<ffffffff8132243c>] gntdev_ioctl+0x31f/0x4d5
> [  996.282790]  [<ffffffff81007d62>] ? check_events+0x12/0x20
> [  996.282804]  [<ffffffff811433bc>] do_vfs_ioctl+0x488/0x4d7
> [  996.282818]  [<ffffffff81007d4f>] ? xen_restore_fl_direct_reloc+0x4/0x4
> [  996.282832]  [<ffffffff8109168b>] ? lock_release+0x21c/0x229
> [  996.282847]  [<ffffffff81135cdd>] ? rcu_read_unlock+0x21/0x32
> [  996.282860]  [<ffffffff81143452>] sys_ioctl+0x47/0x6a
> [  996.282873]  [<ffffffff816bfd82>] system_call_fastpath+0x16/0x1b
> 
> This seems to be due to free_xenballooned_pages(), called by
> gntdev_put_map(), taking balloon_mutex, with the latter that can be
> called within a spin_lock() (e.g., in gntdev_release()).
> 
> I'm not enough confident with the code do attempt fixing it, but I
> thought it was worth to at least point it out!

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 11:29:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 11: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 1RDh5N-0005r9-8j; Tue, 11 Oct 2011 11:29:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDh4G-0005ee-0K
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 11:28:44 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318357719!593280!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7432 invoked from network); 11 Oct 2011 18:28:40 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-12.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Oct 2011 18:28:40 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9BIRpOW011668
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Tue, 11 Oct 2011 18:27:53 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9BILsMT022629
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 18:21:55 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9BIRitW027589; Tue, 11 Oct 2011 13:27:44 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 11:27:44 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 2C5A74DE; Tue, 11 Oct 2011 14:27:41 -0400 (EDT)
Date: Tue, 11 Oct 2011 14:27:41 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Jackson@eu.citrix.com,
	Ian.Campbell@citrix.com, lidongyang@novell.com, owen.smith@citrix.com, 
	paul.durrant@citrix.com, pasik@iki.fi, JBeulich@novell.com,
	JBeulich@suse.com
Subject: Re: [Xen-devel] [PATCH 1 of 1] interface: BLKIF_OP_TRIM ->
	BLKIF_OP_DISCARD
Message-ID: <20111011182741.GA1530@phenom.oracle.com>
References: <patchbomb.1318269010@localhost6.localdomain6>
	<d17ab29f2f9ad29a7b8a.1318269011@localhost6.localdomain6>
	<20111010195842.GB5755@phenom.oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111010195842.GB5755@phenom.oracle.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090209.4E948AAA.0006,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

On Mon, Oct 10, 2011 at 03:58:42PM -0400, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 10, 2011 at 01:50:11PM -0400, Konrad Rzeszutek Wilk wrote:

Per Ian and Jan's suggestion (note, the structure is 4-byte aligned
so we do not need to pad it):

# HG changeset patch
# Parent 72f339bc600d7a9629d3f9eb8a279fbf8be25b12
interface: BLKIF_OP_TRIM -> BLKIF_OP_DISCARD

The name 'trim' is specific to the ATA discard implementation.
The name 'scsi unmap' is specific to the SCSI discard implementation.

We should really use a generic name - and the name 'discard'
looks to be the most generic of them all. Also update the description
to mention the other parameters that the frontend can query the
backend for: discard-aligment, discard-granularity, and
discard-secure. We also utilize per Jan Beulich keen suggestion,
the 8-bit reserved field to use as a flag value. Currently the only
flag that can be passed for a discard operation is secure delete:
BLKIF_OP_DISCARD_FLAG_SECURE.

CC: lidongyang@novell.com
CC: owen.smith@citrix.com
CC: Pasi K=E4rkk=E4inen <pasik@iki.fi>
CC: JBeulich@novell.com
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff -r 72f339bc600d xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h	Mon Oct 10 11:21:51 2011 +0100
+++ b/xen/include/public/io/blkif.h	Tue Oct 11 14:10:33 2011 -0400
@@ -82,26 +82,47 @@
  */
 #define BLKIF_OP_RESERVED_1        4
 /*
- * Recognised only if "feature-trim" is present in backend xenbus info.
- * The "feature-trim" node contains a boolean indicating whether trim
- * requests are likely to succeed or fail. Either way, a trim request
+ * Recognised only if "feature-discard" is present in backend xenbus inf=
o.
+ * The "feature-discard" node contains a boolean indicating whether trim
+ * (ATA) or unmap (SCSI) - conviently called discard requests are likely
+ * to succeed or fail. Either way, a discard request
  * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported b=
y
  * the underlying block-device hardware. The boolean simply indicates wh=
ether
- * or not it is worthwhile for the frontend to attempt trim requests.
- * If a backend does not recognise BLKIF_OP_TRIM, it should *not*
- * create the "feature-trim" node!
- *=20
- * Trim operation is a request for the underlying block device to mark
- * extents to be erased. Trim operations are passed with sector_number a=
s the
- * sector index to begin trim operations at and nr_sectors as the number=
 of
- * sectors to be trimmed. The specified sectors should be trimmed if the
- * underlying block device supports trim operations, or a BLKIF_RSP_EOPN=
OTSUPP
- * should be returned. More information about trim operations at:
+ * or not it is worthwhile for the frontend to attempt discard requests.
+ * If a backend does not recognise BLKIF_OP_DISCARD, it should *not*
+ * create the "feature-discard" node!
+ *
+ * Discard operation is a request for the underlying block device to mar=
k
+ * extents to be erased. However, discard does not guarantee that the bl=
ocks
+ * will be erased from the device - it is just a hint to the device
+ * controller that these blocks are no longer in use. What the device
+ * controller does with that information is left to the controller.
+ * Discard operations are passed with sector_number as the
+ * sector index to begin discard operations at and nr_sectors as the num=
ber of
+ * sectors to be discarded. The specified sectors should be discarded if=
 the
+ * underlying block device supports trim (ATA) or unmap (SCSI) operation=
s,
+ * or a BLKIF_RSP_EOPNOTSUPP  should be returned.
+ * More information about trim/unmap operations at:
  * http://t13.org/Documents/UploadedDocuments/docs2008/
  *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
+ * http://www.seagate.com/staticfiles/support/disc/manuals/
+ *     Interface%20manuals/100293068c.pdf
+ * The backend can optionally provide three extra XenBus attributes to
+ * further optimize the discard functionality:
+ * 'discard-aligment' - Devices that support discard functionality may
+ * internally allocate space in units that are bigger than the exported
+ * logical block size. The discard-alignment parameter indicates how man=
y bytes
+ * the beginning of the partition is offset from the internal allocation=
 unit's
+ * natural alignment.
+ * 'discard-granularity'  - Devices that support discard functionality m=
ay
+ * internally allocate space using units that are bigger than the logica=
l block
+ * size. The discard-granularity parameter indicates the size of the int=
ernal
+ * allocation unit in bytes if reported by the device. Otherwise the
+ * discard-granularity will be set to match the device's physical block =
size.
+ * 'discard-secure' - All copies of the discarded sectors (potentially c=
reated by
+ * garbage collection) must also be erased.
  */
-#define BLKIF_OP_TRIM              5
-
+#define BLKIF_OP_DISCARD           5
 /*
  * Maximum scatter/gather segments per request.
  * This is carefully chosen so that sizeof(blkif_ring_t) <=3D PAGE_SIZE.
@@ -134,18 +155,20 @@ struct blkif_request {
 typedef struct blkif_request blkif_request_t;
=20
 /*
- * Cast to this structure when blkif_request.operation =3D=3D BLKIF_OP_T=
RIM
- * sizeof(struct blkif_request_trim) <=3D sizeof(struct blkif_request)
+ * Cast to this structure when blkif_request.operation =3D=3D BLKIF_OP_D=
ISCARD
+ * sizeof(struct blkif_request_discard) <=3D sizeof(struct blkif_request=
)
  */
-struct blkif_request_trim {
-    uint8_t        operation;    /* BLKIF_OP_TRIM                       =
 */
-    uint8_t        reserved;     /*                                     =
 */
+struct blkif_request_discard {
+    uint8_t        operation;    /* BLKIF_OP_DISCARD                    =
 */
+                                 /* ignored if 'discard-secure=3D0'     =
   */
+#define BLKIF_OP_DISCARD_FLAG_SECURE (1<<0)
+    uint8_t        flag;         /* BLKIF_OP_DISCARD_FLAG_SECURE or 0   =
 */
     blkif_vdev_t   handle;       /* same as for read/write requests     =
 */
     uint64_t       id;           /* private guest value, echoed in resp =
 */
     blkif_sector_t sector_number;/* start sector idx on disk            =
 */
     uint64_t       nr_sectors;   /* number of contiguous sectors to trim=
 */
 };
-typedef struct blkif_request_trim blkif_request_trim_t;
+typedef struct blkif_request_discard blkif_request_discard_t;
=20
 struct blkif_response {
     uint64_t        id;              /* copied from request */

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 11:47:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 11:47:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDhMG-0006Wi-6g; Tue, 11 Oct 2011 11:47:20 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDhLJ-0006Jt-DZ
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 11:46:22 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1318358776!28820574!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15204 invoked from network); 11 Oct 2011 18:46:18 -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; 11 Oct 2011 18:46:18 -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
	p9BIkA2Q001939
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 11 Oct 2011 18:46: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
	p9BIk9ZQ024645
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 18:46:10 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
	p9BIk3j6032458; Tue, 11 Oct 2011 13:46:03 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 11:46:03 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 02F704DE; Tue, 11 Oct 2011 14:39:09 -0400 (EDT)
Date: Tue, 11 Oct 2011 14:39:09 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Li Dongyang <lidongyang@novell.com>
Subject: Re: [Xen-devel] Re: [PATCH 2/3] xen/blkback: Fix the inhibition to
	map pages when discarding sector ranges.
Message-ID: <20111011183909.GA2357@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-3-git-send-email-konrad.wilk@oracle.com>
	<4E940B99020000780005AA12@victor.provo.novell.com>
	<CAKH3R4-HJZBE-yWk=Dwkuwy13z1vdUrgEoJ9zFhTJgXgYfHHfA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAKH3R4-HJZBE-yWk=Dwkuwy13z1vdUrgEoJ9zFhTJgXgYfHHfA@mail.gmail.com>
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.0A090207.4E948EF4.0189:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: hch@infradead.org, Dong Yang Li <lidongyang@suse.com>,
	xen-devel@lists.xensource.com, linux-kernel@vger.kernel.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 Tue, Oct 11, 2011 at 03:33:11PM +0800, Li Dongyang wrote:
> On Tue, Oct 11, 2011 at 3:25 PM, Jan Beulich <JBeulich@suse.com> wrote:
> >>>> On 10.10.11 at 17:28, Konrad Rzeszutek Wilk <konrad.wilk@oracle.co=
m> wrote:
> >> The 'operation' parameters are the ones provided to the bio layer wh=
ile
> >> the req->operation are the ones passed in between the backend and
> >> frontend. We used the wrong 'operation' value to squash the
> >> call to map pages when processing the discard operation resulting
> >> in mapping the pages unnecessarily.
> >>
> >> CC: Li Dongyang <lidongyang@novell.com>
> >> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> >> ---
> >> =A0drivers/block/xen-blkback/blkback.c | =A0 =A02 +-
> >> =A01 files changed, 1 insertions(+), 1 deletions(-)
> >>
> >> diff --git a/drivers/block/xen-blkback/blkback.c
> >> b/drivers/block/xen-blkback/blkback.c
> >> index 184b133..3da9a40 100644
> >> --- a/drivers/block/xen-blkback/blkback.c
> >> +++ b/drivers/block/xen-blkback/blkback.c
> >> @@ -707,7 +707,7 @@ static int dispatch_rw_block_io(struct xen_blkif=
 *blkif,
> >> =A0 =A0 =A0 =A0* the hypercall to unmap the grants - that is all don=
e in
> >> =A0 =A0 =A0 =A0* xen_blkbk_unmap.
> >> =A0 =A0 =A0 =A0*/
> >> - =A0 =A0 if (operation !=3D BLKIF_OP_DISCARD &&
> >> + =A0 =A0 if (operation !=3D REQ_DISCARD &&
> >
> > Why is that check necessary in the first place? xen_blkbk_map() doesn=
't
> > do any harm when req->nr_segments is zero (as could also be the case
> > on WRITE_FLUSH ones).
> >
> Ah, you are right, we could remove this check then, Thanks

Except that req->nr_segments for blkif__request_discard is actually
the reserved field.

See:

struct blkif_request {
    uint8_t        operation;    /* BLKIF_OP_???                         =
*/
    uint8_t        nr_segments;  /* number of segments                   =
*/
    blkif_vdev_t   handle;       /* only for read/write requests         =
*/
.. snip..

and:
struct blkif_request_discard {
    uint8_t        operation;    /* BLKIF_OP_DISCARD                     =
*/
                                 /* ignored if 'discard-secure=3D0'      =
  */
#define BLKIF_OP_DISCARD_FLAG_SECURE (1<<0)
    uint8_t        flag;         /* BLKIF_OP_DISCARD_FLAG_SECURE or 0    =
*/
    blkif_vdev_t   handle;       /* same as for read/write requests      =
*/

which will throw off the logic for nr_segments all wrong since for some
discard operations it would read the nr_segments as 1.

So we do need some logic in there to work with this.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 12:17:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 12:17:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDhox-0007q7-P2; Tue, 11 Oct 2011 12:17:00 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDhnz-0007dK-UX
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 12:16:02 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318360556!579687!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9587 invoked from network); 11 Oct 2011 19:15:56 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-4.tower-216.messagelabs.com with SMTP;
	11 Oct 2011 19:15:56 -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
	p9BJFqWo000408; Tue, 11 Oct 2011 19:15:53 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 p9BJFqxj001559; 
	Tue, 11 Oct 2011 15:15:52 -0400
Message-ID: <4E9495F6.4070301@tycho.nsa.gov>
Date: Tue, 11 Oct 2011 15:16:06 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <1318353219.21925.80.camel@Palantir>
	<20111011173228.GB32406@phenom.oracle.com>
In-Reply-To: <20111011173228.GB32406@phenom.oracle.com>
X-Enigmail-Version: 1.3
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: xen-devel <xen-devel@lists.xensource.com>,
	Dario Faggioli <raistlin@linux.it>
Subject: [Xen-devel] [PATCH] xen/gntdev: Fix sleep-inside-spinlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 01:32 PM, Konrad Rzeszutek Wilk wrote:
> On Tue, Oct 11, 2011 at 07:13:38PM +0200, Dario Faggioli wrote:
>> Hello everyone,
>>
>> Since I really plan to spend some time here, let me introduce myself
>> first. My name is Dario Faggioli and I just joined the Citrix Platform
>> Team in Cambridge (although I'll be working from Italy). I've some
>> experience in Linux kernel (mainly scheduling) and not that much
>> experience in Xen or virtualization in general, but I really want to
>> learn and be able to contribute ASAP!
>>
>> In fact, while "doing my homework", I stumbled against the following
>> BUG(). I'm able to reproduce it with xen-unstable and by just by
>> enabling spinlock and mutex debug checks in linus' Linux
>> (65112dccf8a113737684366349d7f9ec373ddc47) _iff_ using 'tap:qcow2' disk
>> image, while no such thing happens with 'phy:'.
> 
> Aha.. I saw that at some point but never narrowed it down to the
> right combination. Thank you for tracking this down.
> 
> I am CC Daniel who might have some patches for this or ideas.
>>
>> [  996.282544] BUG: sleeping function called from invalid context at /local/scratch/dariof/linux/kernel/mutex.c:271
>> [  996.282570] in_atomic(): 1, irqs_disabled(): 0, pid: 3256, name: qemu-dm
>> [  996.282581] 1 lock held by qemu-dm/3256:
>> [  996.282589]  #0:  (&(&priv->lock)->rlock){......}, at: [<ffffffff813223da>] gntdev_ioctl+0x2bd/0x4d5
>> [  996.282628] Pid: 3256, comm: qemu-dm Tainted: G        W   3.1.0-rc8+ #5
>> [  996.282638] Call Trace:
>> [  996.282687]  [<ffffffff81054594>] __might_sleep+0x131/0x135
>> [  996.282704]  [<ffffffff816bd64f>] mutex_lock_nested+0x25/0x45
>> [  996.282721]  [<ffffffff8131c7c8>] free_xenballooned_pages+0x20/0xb1
>> [  996.282735]  [<ffffffff8132194d>] gntdev_put_map+0xa8/0xdb
>> [  996.282749]  [<ffffffff816be546>] ? _raw_spin_lock+0x71/0x7a
>> [  996.282763]  [<ffffffff813223da>] ? gntdev_ioctl+0x2bd/0x4d5
>> [  996.282776]  [<ffffffff8132243c>] gntdev_ioctl+0x31f/0x4d5
>> [  996.282790]  [<ffffffff81007d62>] ? check_events+0x12/0x20
>> [  996.282804]  [<ffffffff811433bc>] do_vfs_ioctl+0x488/0x4d7
>> [  996.282818]  [<ffffffff81007d4f>] ? xen_restore_fl_direct_reloc+0x4/0x4
>> [  996.282832]  [<ffffffff8109168b>] ? lock_release+0x21c/0x229
>> [  996.282847]  [<ffffffff81135cdd>] ? rcu_read_unlock+0x21/0x32
>> [  996.282860]  [<ffffffff81143452>] sys_ioctl+0x47/0x6a
>> [  996.282873]  [<ffffffff816bfd82>] system_call_fastpath+0x16/0x1b
>>
>> This seems to be due to free_xenballooned_pages(), called by
>> gntdev_put_map(), taking balloon_mutex, with the latter that can be
>> called within a spin_lock() (e.g., in gntdev_release()).
>>
>> I'm not enough confident with the code do attempt fixing it, but I
>> thought it was worth to at least point it out!
> 

It looks like gntdev_release doesn't need to take the spinlock at all, since
it's a per-file lock on the file's release path. The unmap ioctl looks like
it'll also trigger this message; that's also fixed here. Compile tested only.

-------------------------------------------------------->8

gntdev_put_map tries to acquire a mutex when freeing pages back to the
xenballoon pool, so it cannot be called with a spinlock held. In
gntdev_release, the spinlock is not needed as we are freeing the
structure later; in the ioctl, only the list manipulation needs to be
under the lock.

Reported-By: Dario Faggioli <raistlin@linux.it>
Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/gntdev.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index f914b26..23b1c83 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -462,13 +462,11 @@ static int gntdev_release(struct inode *inode, struct file *flip)
 
 	pr_debug("priv %p\n", priv);
 
-	spin_lock(&priv->lock);
 	while (!list_empty(&priv->maps)) {
 		map = list_entry(priv->maps.next, struct grant_map, next);
 		list_del(&map->next);
 		gntdev_put_map(map);
 	}
-	spin_unlock(&priv->lock);
 
 	if (use_ptemod)
 		mmu_notifier_unregister(&priv->mn, priv->mm);
@@ -532,10 +530,11 @@ static long gntdev_ioctl_unmap_grant_ref(struct gntdev_priv *priv,
 	map = gntdev_find_map_index(priv, op.index >> PAGE_SHIFT, op.count);
 	if (map) {
 		list_del(&map->next);
-		gntdev_put_map(map);
 		err = 0;
 	}
 	spin_unlock(&priv->lock);
+	if (map)
+		gntdev_put_map(map);
 	return err;
 }
 
-- 
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 Oct 11 12:28:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 12:28:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDhzt-0008NY-Tc; Tue, 11 Oct 2011 12:28:17 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDhz3-0008Ab-6w
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 12:27:26 -0700
X-Env-Sender: linux@eikelenboom.it
X-Msg-Ref: server-3.tower-174.messagelabs.com!1318361242!28806968!1
X-Originating-IP: [188.40.164.121]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1732 invoked from network); 11 Oct 2011 19:27:22 -0000
Received: from static.121.164.40.188.clients.your-server.de (HELO
	smtp.eikelenboom.it) (188.40.164.121)
	by server-3.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	11 Oct 2011 19:27:22 -0000
Received: from 171-69-ftth.onsneteindhoven.nl ([88.159.69.171]:51445
	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 1RDhwT-0001hV-8u; Tue, 11 Oct 2011 21:24:45 +0200
Date: Tue, 11 Oct 2011 21:27:20 +0200
From: Sander Eikelenboom <linux@eikelenboom.it>
Organization: Eikelenboom IT services
X-Priority: 3 (Normal)
Message-ID: <1201361330.20111011212720@eikelenboom.it>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] acpi-cpufreq missing on roadmap ?
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

I have updated my kernel to you linux-next branch with latest upstream 3.1r=
c patches pulled on that.
Since still have to pull your devel/acpi-cpufreq branch as well to be able =
to use Xen PM, I took a look at the wiki:
http://wiki.xen.org/xenwiki/XenParavirtOps but noticed only acpi/s3 suspend=
/resume seemed to be on the roadmap (for 3.3).

Any possibility the acpi-cpufreq patches can come with that ?

--
Sander


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 12:55:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 12:55:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDiQF-0000j3-1T; Tue, 11 Oct 2011 12:55:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDiP5-0000Vi-2F
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 12:54:19 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1318362817!51654656!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7020 invoked from network); 11 Oct 2011 19:53:39 -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; 11 Oct 2011 19:53: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
	p9BJs9j7001864
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 11 Oct 2011 19:54:11 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
	p9BJs92l028306
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 19:54:09 GMT
Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9BJs4SA018631; Tue, 11 Oct 2011 14:54:04 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 12:54:03 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 17A871361; Tue, 11 Oct 2011 15:53:58 -0400 (EDT)
Date: Tue, 11 Oct 2011 15:53:58 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Sander Eikelenboom <linux@eikelenboom.it>
Message-ID: <20111011195358.GA21669@phenom.oracle.com>
References: <1201361330.20111011212720@eikelenboom.it>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1201361330.20111011212720@eikelenboom.it>
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.4E949EE4.0039:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: acpi-cpufreq missing on roadmap ?
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, Oct 11, 2011 at 09:27:20PM +0200, Sander Eikelenboom wrote:
> Hi Konrad,
> 
> I have updated my kernel to you linux-next branch with latest upstream 3.1rc patches pulled on that.
> Since still have to pull your devel/acpi-cpufreq branch as well to be able to use Xen PM, I took a look at the wiki:
> http://wiki.xen.org/xenwiki/XenParavirtOps but noticed only acpi/s3 suspend/resume seemed to be on the roadmap (for 3.3).
> 
> Any possibility the acpi-cpufreq patches can come with that ?

Yes. We are working on it right now - let me update the Wiki. Thx!
> 
> --
> Sander

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 13:27:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 13:27:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDivH-0002WX-0K; Tue, 11 Oct 2011 13:27:35 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDiuk-0002K0-DX
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 13:27:02 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318364818!594204!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26779 invoked from network); 11 Oct 2011 20:26:59 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-10.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 11 Oct 2011 20:26:59 -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
	p9BKQ4t0028960
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 11 Oct 2011 20:26:06 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
	p9BKQ2Vn019708
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 20:26:02 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
	p9BKPsAh013720; Tue, 11 Oct 2011 15:25:55 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 13:25:54 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 4E0BD1361; Tue, 11 Oct 2011 16:08:41 -0400 (EDT)
Date: Tue, 11 Oct 2011 16:08:41 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, rjw@sisk.pl, tglx@linutronix.de,
	hpa@zytor.com, x86@kernel.org, len.brown@intel.com,
	joseph.cihula@intel.com, shane.wang@intel.com,
	xen-devel@lists.xensource.com, linux-pm@lists.linux-foundation.org,
	tboot-devel@lists.sourceforge.net, linux-acpi@vger.kernel.org,
	liang.tang@oracle.com, ke.yu@intel.com, kevin.tian@intel.com,
	jeremy@goop.org
Message-ID: <20111011200841.GA21943@phenom.oracle.com>
References: <1317327414-24072-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: <1317327414-24072-1-git-send-email-konrad.wilk@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.0A090206.4E94A65F.024E:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: 
Subject: [Xen-devel] Re: [PATCH v2] ACPI S3 to work under 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, Sep 29, 2011 at 04:16:46PM -0400, Konrad Rzeszutek Wilk wrote:
> Attached is an [v2] set of patches to enable S3 to work with the Xen hypervisor.
> 
> Changes since the RFC posting [http://comments.gmane.org/gmane.linux.acpi.devel/50701] by
> Liang Tang:
>  - 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.

Rafael, Len,

Any chance you could take look at the patches - the parts that touch the ACPI
generic components are couple of lines? Much appreciated.

Joseph was OK with the tboot sections.

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 13:35:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 13:35:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDj3I-000369-5v; Tue, 11 Oct 2011 13:35:52 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDj2c-0002ts-Uz
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 13:35:11 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1318365309!54106474!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24984 invoked from network); 11 Oct 2011 20:35:09 -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;
	11 Oct 2011 20:35:09 -0000
X-IronPort-AV: E=Sophos;i="4.68,525,1312156800"; 
   d="scan'208";a="8335788"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Oct 2011 20:35: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; Tue, 11 Oct 2011 21:35:07 +0100
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 1RDj2Z-0005Ff-HD;
	Tue, 11 Oct 2011 20:35:07 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RDj2Z-0001eB-GZ;
	Tue, 11 Oct 2011 21:35:07 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9247-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 11 Oct 2011 21:35:07 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9247: 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 9247 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9247/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10     fail REGR. vs. 9245

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

version targeted for testing:
 xen                  4b0907c6a08c
baseline version:
 xen                  1185ae04b5aa

------------------------------------------------------------
People who touched revisions under test:
  Guido Gunther <agx@sigxcpu.org>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Olaf Hering <olaf@aepfle.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


Not pushing.

------------------------------------------------------------
changeset:   23944:4b0907c6a08c
tag:         tip
user:        Guido Gunther <agx@sigxcpu.org>
date:        Tue Oct 11 12:02:58 2011 +0100
    
    pygrub: add debug flag
    
    Debugging config file errors is tedious so help a bit by not silently
    dropping parsing exceptions when --debug is given. Also intialize the
    logging API at debug level in this case.
    
    Signed-off-by: Guido Gunther <agx@sigxcpu.org>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23943:1185ae04b5aa
user:        Olaf Hering <olaf@aepfle.de>
date:        Tue Oct 11 10:46:28 2011 +0100
    
    xenpaging: clear page content after evict
    
    If the guest happens to read from the gfn while xenpaging is in the process of
    evicting the page, the guest may read zeros instead of actual data.
    Also if eviction fails the page content will be corrupted and xenpaging wont
    attempt to restore the page.
    
    Remove page scrubbing from pager and do it after successful eviction.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
========================================
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 Tue Oct 11 13:51:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 13:51:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDjIt-0003nr-Hs; Tue, 11 Oct 2011 13:51:59 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDjI2-0003bx-8y
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 13:51:07 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318366234!52403292!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29746 invoked from network); 11 Oct 2011 20:50:35 -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; 11 Oct 2011 20:50: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
	p9BKosaO008852
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 11 Oct 2011 20:50:56 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
	p9BKor43026821
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 20:50:54 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
	p9BKom1L007350; Tue, 11 Oct 2011 15:50:48 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 13:50:47 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 079A11361; Tue, 11 Oct 2011 16:50:36 -0400 (EDT)
Date: Tue, 11 Oct 2011 16:50:35 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Li Dongyang <lidongyang@novell.com>
Subject: Re: [Xen-devel] Re: [PATCH 2/3] xen/blkback: Fix the inhibition to
	map pages when discarding sector ranges.
Message-ID: <20111011205035.GA22668@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-3-git-send-email-konrad.wilk@oracle.com>
	<4E940B99020000780005AA12@victor.provo.novell.com>
	<CAKH3R4-HJZBE-yWk=Dwkuwy13z1vdUrgEoJ9zFhTJgXgYfHHfA@mail.gmail.com>
	<20111011183909.GA2357@phenom.oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111011183909.GA2357@phenom.oracle.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.0A090201.4E94AC31.00A4:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: hch@infradead.org, Dong Yang Li <lidongyang@suse.com>,
	xen-devel@lists.xensource.com, linux-kernel@vger.kernel.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 Tue, Oct 11, 2011 at 02:39:09PM -0400, Konrad Rzeszutek Wilk wrote:
> On Tue, Oct 11, 2011 at 03:33:11PM +0800, Li Dongyang wrote:
> > On Tue, Oct 11, 2011 at 3:25 PM, Jan Beulich <JBeulich@suse.com> wrot=
e:
> > >>>> On 10.10.11 at 17:28, Konrad Rzeszutek Wilk <konrad.wilk@oracle.=
com> wrote:
> > >> The 'operation' parameters are the ones provided to the bio layer =
while
> > >> the req->operation are the ones passed in between the backend and
> > >> frontend. We used the wrong 'operation' value to squash the
> > >> call to map pages when processing the discard operation resulting
> > >> in mapping the pages unnecessarily.
> > >>
> > >> CC: Li Dongyang <lidongyang@novell.com>
> > >> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > >> ---
> > >> =A0drivers/block/xen-blkback/blkback.c | =A0 =A02 +-
> > >> =A01 files changed, 1 insertions(+), 1 deletions(-)
> > >>
> > >> diff --git a/drivers/block/xen-blkback/blkback.c
> > >> b/drivers/block/xen-blkback/blkback.c
> > >> index 184b133..3da9a40 100644
> > >> --- a/drivers/block/xen-blkback/blkback.c
> > >> +++ b/drivers/block/xen-blkback/blkback.c
> > >> @@ -707,7 +707,7 @@ static int dispatch_rw_block_io(struct xen_blk=
if *blkif,
> > >> =A0 =A0 =A0 =A0* the hypercall to unmap the grants - that is all d=
one in
> > >> =A0 =A0 =A0 =A0* xen_blkbk_unmap.
> > >> =A0 =A0 =A0 =A0*/
> > >> - =A0 =A0 if (operation !=3D BLKIF_OP_DISCARD &&
> > >> + =A0 =A0 if (operation !=3D REQ_DISCARD &&
> > >
> > > Why is that check necessary in the first place? xen_blkbk_map() doe=
sn't
> > > do any harm when req->nr_segments is zero (as could also be the cas=
e
> > > on WRITE_FLUSH ones).
> > >
> > Ah, you are right, we could remove this check then, Thanks
>=20
> Except that req->nr_segments for blkif__request_discard is actually
> the reserved field.
>=20
> See:
>=20
> struct blkif_request {
>     uint8_t        operation;    /* BLKIF_OP_???                       =
  */
>     uint8_t        nr_segments;  /* number of segments                 =
  */
>     blkif_vdev_t   handle;       /* only for read/write requests       =
  */
> .. snip..
>=20
> and:
> struct blkif_request_discard {
>     uint8_t        operation;    /* BLKIF_OP_DISCARD                   =
  */
>                                  /* ignored if 'discard-secure=3D0'    =
    */
> #define BLKIF_OP_DISCARD_FLAG_SECURE (1<<0)
>     uint8_t        flag;         /* BLKIF_OP_DISCARD_FLAG_SECURE or 0  =
  */
>     blkif_vdev_t   handle;       /* same as for read/write requests    =
  */
>=20
> which will throw off the logic for nr_segments all wrong since for some
> discard operations it would read the nr_segments as 1.
>=20
> So we do need some logic in there to work with this.


So a patch like this (and there is another on top that moves the setting
of nseg) should do it.


commit 12679b29b2f828454f833e17e9090ed576c63afc
Author: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date:   Mon Oct 10 00:47:49 2011 -0400

    xen/blkback: Fix the inhibition to map pages when discarding sector r=
anges.
   =20
    The 'operation' parameters are the ones provided to the bio layer whi=
le
    the req->operation are the ones passed in between the backend and
    frontend. We used the wrong 'operation' value to squash the
    call to map pages when processing the discard operation resulting
    in an hypercall that did nothing. Lets guard against going in the
    mapping function by checking for the amount of segments.
   =20
    CC: Li Dongyang <lidongyang@novell.com>
    Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkb=
ack/blkback.c
index c15c559..94e659d 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -707,8 +707,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blk=
if,
 	 * the hypercall to unmap the grants - that is all done in
 	 * xen_blkbk_unmap.
 	 */
-	if (operation !=3D BLKIF_OP_DISCARD &&
-			xen_blkbk_map(req, pending_req, seg))
+	if (nseg && xen_blkbk_map(req, pending_req, seg))
 		goto fail_flush;
=20
 	/*

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 14:02:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 14: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 1RDjSq-0004PU-IS; Tue, 11 Oct 2011 14:02:16 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDjOy-0004A8-GY
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 13:58:38 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1318366629!51948282!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26571 invoked from network); 11 Oct 2011 20:57:11 -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; 11 Oct 2011 20:57:11 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9BKvmdG016993
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Tue, 11 Oct 2011 20:57:50 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9BKvlpK011493
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 11 Oct 2011 20:57:48 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
	p9BKvgox002504; Tue, 11 Oct 2011 15:57:42 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 13:57:41 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id C16971361; Tue, 11 Oct 2011 16:57:29 -0400 (EDT)
Date: Tue, 11 Oct 2011 16:57:29 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
Message-ID: <20111011205729.GB22668@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
	<4E940E21020000780005AA29@nat28.tlf.novell.com>
	<20111011155133.GC29349@phenom.oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111011155133.GC29349@phenom.oracle.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090205.4E94ADCF.00A9,ss=1,re=-2.300,fgs=0
Cc: "hch@infradead.org" <hch@infradead.org>, Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@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

> My later response to it should include it:
> http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00652.html
> 
> > 
> > Further I wonder why you don't use the "reserved" field instead of
> > extending the structure at the end.
> 
> <blinks> I completly missed it. That would definitly work as well.
> 
> Let me redo it with that in mind.

I've posted the Xen hypervisor ABI one that thread above. The implementation
of that looks as follow:

commit ae33f998d66c5982af533bda25c2b6c4f863789f
Author: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date:   Mon Oct 10 10:58:40 2011 -0400

    xen/blk[front|back]: Enhance discard support with secure erasing support.
    
    Part of the blkdev_issue_discard(xx) operation is that it can also
    issue a secure discard operation that will permanantly remove the
    sectors in question. We advertise that we can support that via the
    'discard-secure' attribute and on the request, if the 'secure' bit
    is set, we will attempt to pass in REQ_DISCARD | REQ_SECURE.
    
    CC: Li Dongyang <lidongyang@novell.com>
    [v1: Used 'flag' instead of 'secure:1' bit]
    [v2: Use 'reserved 'uint8_t' as a flag]
    Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index 94e659d..4f33c13 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -362,7 +362,7 @@ static int xen_blkbk_map(struct blkif_request *req,
 {
 	struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST];
 	int i;
-	int nseg = req->nr_segments;
+	int nseg = req->u1.nr_segments;
 	int ret = 0;
 
 	/*
@@ -422,13 +422,16 @@ 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)
+	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY) {
+		unsigned long secure = (blkif->vbd.discard_secure &&
+			(req->u1.flag & BLKIF_OP_DISCARD_FLAG_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, 0);
-	else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
+				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;
@@ -618,6 +621,9 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
 	struct blk_plug plug;
 	bool drain = false;
 
+	/* Check that the number of segments is sane. */
+	nseg = req->u1.nr_segments;
+
 	switch (req->operation) {
 	case BLKIF_OP_READ:
 		blkif->st_rd_req++;
@@ -636,6 +642,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
 	case BLKIF_OP_DISCARD:
 		blkif->st_ds_req++;
 		operation = REQ_DISCARD;
+		nseg = 0; /* The nr_segments and flag share the same space. */
 		break;
 	default:
 		operation = 0; /* make gcc happy */
@@ -643,8 +650,6 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
 		break;
 	}
 
-	/* Check that the number of segments is sane. */
-	nseg = req->nr_segments;
 	if (unlikely(nseg == 0 && operation != WRITE_FLUSH &&
 				operation != REQ_DISCARD) ||
 	    unlikely(nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST)) {
diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
index e638457..c6a5462 100644
--- a/drivers/block/xen-blkback/common.h
+++ b/drivers/block/xen-blkback/common.h
@@ -76,7 +76,10 @@ struct blkif_x86_32_request_discard {
 
 struct blkif_x86_32_request {
 	uint8_t        operation;    /* BLKIF_OP_???                         */
-	uint8_t        nr_segments;  /* number of segments                   */
+	union {
+		uint8_t	nr_segments; /* number of segments                   */
+		uint8_t flag;        /* flag for blkif_x86_32_request_discard*/
+	} u1;
 	blkif_vdev_t   handle;       /* only for read/write requests         */
 	uint64_t       id;           /* private guest value, echoed in resp  */
 	union {
@@ -105,7 +108,10 @@ struct blkif_x86_64_request_discard {
 
 struct blkif_x86_64_request {
 	uint8_t        operation;    /* BLKIF_OP_???                         */
-	uint8_t        nr_segments;  /* number of segments                   */
+	union {
+		uint8_t	nr_segments; /* number of segments                   */
+		uint8_t flag;        /* for blkif_x86_64_request_discard     */
+	} u1;
 	blkif_vdev_t   handle;       /* only for read/write requests         */
 	uint64_t       __attribute__((__aligned__(8))) id;
 	union {
@@ -157,6 +163,7 @@ struct xen_vbd {
 	/* Cached size parameter. */
 	sector_t		size;
 	bool			flush_support;
+	bool			discard_secure;
 };
 
 struct backend_info;
@@ -241,7 +248,7 @@ static inline void blkif_get_x86_32_req(struct blkif_request *dst,
 {
 	int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
 	dst->operation = src->operation;
-	dst->nr_segments = src->nr_segments;
+	dst->u1.nr_segments = src->u1.nr_segments;
 	dst->handle = src->handle;
 	dst->id = src->id;
 	switch (src->operation) {
@@ -251,14 +258,16 @@ static inline void blkif_get_x86_32_req(struct blkif_request *dst,
 	case BLKIF_OP_FLUSH_DISKCACHE:
 		dst->u.rw.sector_number = src->u.rw.sector_number;
 		barrier();
-		if (n > dst->nr_segments)
-			n = dst->nr_segments;
+		if (n > dst->u1.nr_segments)
+			n = dst->u1.nr_segments;
 		for (i = 0; i < n; i++)
 			dst->u.rw.seg[i] = src->u.rw.seg[i];
 		break;
 	case BLKIF_OP_DISCARD:
 		dst->u.discard.sector_number = src->u.discard.sector_number;
 		dst->u.discard.nr_sectors = src->u.discard.nr_sectors;
+		/* We should be doing "dst->u1.flag = src->u1.flag;" but the
+		 * copying of u1.nr_segments does it for us already. */
 		break;
 	default:
 		break;
@@ -270,7 +279,7 @@ static inline void blkif_get_x86_64_req(struct blkif_request *dst,
 {
 	int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
 	dst->operation = src->operation;
-	dst->nr_segments = src->nr_segments;
+	dst->u1.nr_segments = src->u1.nr_segments;
 	dst->handle = src->handle;
 	dst->id = src->id;
 	switch (src->operation) {
@@ -280,14 +289,16 @@ static inline void blkif_get_x86_64_req(struct blkif_request *dst,
 	case BLKIF_OP_FLUSH_DISKCACHE:
 		dst->u.rw.sector_number = src->u.rw.sector_number;
 		barrier();
-		if (n > dst->nr_segments)
-			n = dst->nr_segments;
+		if (n > dst->u1.nr_segments)
+			n = dst->u1.nr_segments;
 		for (i = 0; i < n; i++)
 			dst->u.rw.seg[i] = src->u.rw.seg[i];
 		break;
 	case BLKIF_OP_DISCARD:
 		dst->u.discard.sector_number = src->u.discard.sector_number;
 		dst->u.discard.nr_sectors = src->u.discard.nr_sectors;
+		/* We should be doing "dst->u1.flag = src->u1.flag;" but the
+		 * copying of u1.nr_segments does it for us already. */
 		break;
 	default:
 		break;
diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index a6d4303..0c0ce39 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -378,6 +378,9 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
 	if (q && q->flush_flags)
 		vbd->flush_support = true;
 
+	if (q && blk_queue_secdiscard(q))
+		vbd->discard_secure = true;
+
 	DPRINTK("Successful creation of handle=%04x (dom=%u)\n",
 		handle, blkif->domid);
 	return 0;
@@ -460,6 +463,15 @@ int xen_blkbk_discard(struct xenbus_transaction xbt, struct backend_info *be)
 				state = 1;
 				blkif->blk_backend_type = BLKIF_BACKEND_PHY;
 			}
+			/* Optional. */
+			err = xenbus_printf(xbt, dev->nodename,
+				"discard-secure", "%d",
+				blkif->vbd.discard_secure);
+			if (err) {
+				xenbus_dev_fatal(dev, err,
+					"writting discard-secure");
+				goto kfree;
+			}
 		}
 	} else {
 		err = PTR_ERR(type);
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 7b2ec59..f7e6ca5 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -98,7 +98,8 @@ struct blkfront_info
 	unsigned long shadow_free;
 	unsigned int feature_flush;
 	unsigned int flush_op;
-	unsigned int feature_discard;
+	unsigned int feature_discard:1;
+	unsigned int feature_secdiscard:1;
 	unsigned int discard_granularity;
 	unsigned int discard_alignment;
 	int is_ready;
@@ -305,16 +306,19 @@ static int blkif_queue_request(struct request *req)
 		ring_req->operation = info->flush_op;
 	}
 
-	if (unlikely(req->cmd_flags & REQ_DISCARD)) {
+	if (unlikely(req->cmd_flags & (REQ_DISCARD | REQ_SECURE))) {
 		/* id, sector_number and handle are set above. */
 		ring_req->operation = BLKIF_OP_DISCARD;
-		ring_req->nr_segments = 0;
+		ring_req->u1.flag = 0;
 		ring_req->u.discard.nr_sectors = blk_rq_sectors(req);
+		if ((req->cmd_flags & REQ_SECURE) && info->feature_secdiscard)
+			ring_req->u1.flag = BLKIF_OP_DISCARD_FLAG_SECURE;
 	} else {
-		ring_req->nr_segments = blk_rq_map_sg(req->q, req, info->sg);
-		BUG_ON(ring_req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST);
+		ring_req->u1.nr_segments = blk_rq_map_sg(req->q, req, info->sg);
+		BUG_ON(ring_req->u1.nr_segments >
+			BLKIF_MAX_SEGMENTS_PER_REQUEST);
 
-		for_each_sg(info->sg, sg, ring_req->nr_segments, i) {
+		for_each_sg(info->sg, sg, ring_req->u1.nr_segments, i) {
 			buffer_mfn = pfn_to_mfn(page_to_pfn(sg_page(sg)));
 			fsect = sg->offset >> 9;
 			lsect = fsect + (sg->length >> 9) - 1;
@@ -424,6 +428,8 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
 		blk_queue_max_discard_sectors(rq, get_capacity(gd));
 		rq->limits.discard_granularity = info->discard_granularity;
 		rq->limits.discard_alignment = info->discard_alignment;
+		if (info->feature_secdiscard)
+			queue_flag_set_unlocked(QUEUE_FLAG_SECDISCARD, rq);
 	}
 
 	/* Hard sector size and max sectors impersonate the equiv. hardware. */
@@ -705,7 +711,7 @@ static void blkif_free(struct blkfront_info *info, int suspend)
 static void blkif_completion(struct blk_shadow *s)
 {
 	int i;
-	for (i = 0; i < s->req.nr_segments; i++)
+	for (i = 0; i < s->req.u1.nr_segments; i++)
 		gnttab_end_foreign_access(s->req.u.rw.seg[i].gref, 0, 0UL);
 }
 
@@ -749,7 +755,9 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 					   info->gd->disk_name);
 				error = -EOPNOTSUPP;
 				info->feature_discard = 0;
+				info->feature_secdiscard = 0;
 				queue_flag_clear(QUEUE_FLAG_DISCARD, rq);
+				queue_flag_clear(QUEUE_FLAG_SECDISCARD, rq);
 			}
 			__blk_end_request_all(req, error);
 			break;
@@ -763,7 +771,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
 				error = -EOPNOTSUPP;
 			}
 			if (unlikely(bret->status == BLKIF_RSP_ERROR &&
-				     info->shadow[id].req.nr_segments == 0)) {
+				info->shadow[id].req.u1.nr_segments == 0)) {
 				printk(KERN_WARNING "blkfront: %s: empty write %s op failed\n",
 				       info->flush_op == BLKIF_OP_WRITE_BARRIER ?
 				       "barrier" :  "flush disk cache",
@@ -1038,7 +1046,7 @@ static int blkif_recover(struct blkfront_info *info)
 		memcpy(&info->shadow[req->id], &copy[i], sizeof(copy[i]));
 
 		/* Rewrite any grant references invalidated by susp/resume. */
-		for (j = 0; j < req->nr_segments; j++)
+		for (j = 0; j < req->u1.nr_segments; j++)
 			gnttab_grant_foreign_access_ref(
 				req->u.rw.seg[j].gref,
 				info->xbdev->otherend_id,
@@ -1135,11 +1143,13 @@ static void blkfront_setup_discard(struct blkfront_info *info)
 	char *type;
 	unsigned int discard_granularity;
 	unsigned int discard_alignment;
+	unsigned int discard_secure;
 
 	type = xenbus_read(XBT_NIL, info->xbdev->otherend, "type", NULL);
 	if (IS_ERR(type))
 		return;
 
+	info->feature_secdiscard = 0;
 	if (strncmp(type, "phy", 3) == 0) {
 		err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
 			"discard-granularity", "%u", &discard_granularity,
@@ -1150,6 +1160,12 @@ static void blkfront_setup_discard(struct blkfront_info *info)
 			info->discard_granularity = discard_granularity;
 			info->discard_alignment = discard_alignment;
 		}
+		err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
+			    "discard-secure", "%d", &discard_secure,
+			    NULL);
+		if (!err)
+			info->feature_secdiscard = discard_secure;
+
 	} else if (strncmp(type, "file", 4) == 0)
 		info->feature_discard = 1;
 
diff --git a/include/xen/interface/io/blkif.h b/include/xen/interface/io/blkif.h
index 9324488..4a01e71 100644
--- a/include/xen/interface/io/blkif.h
+++ b/include/xen/interface/io/blkif.h
@@ -84,6 +84,20 @@ typedef uint64_t blkif_sector_t;
  *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
  * http://www.seagate.com/staticfiles/support/disc/manuals/
  *     Interface%20manuals/100293068c.pdf
+ * The backend can optionally provide three extra XenBus attributes to
+ * further optimize the discard functionality:
+ * 'discard-aligment' - Devices that support discard functionality may
+ * internally allocate space in units that are bigger than the exported
+ * logical block size. The discard-alignment parameter indicates how many bytes
+ * the beginning of the partition is offset from the internal allocation unit's
+ * natural alignment.
+ * 'discard-granularity'  - Devices that support discard functionality may
+ * internally allocate space using units that are bigger than the logical block
+ * size. The discard-granularity parameter indicates the size of the internal
+ * allocation unit in bytes if reported by the device. Otherwise the
+ * discard-granularity will be set to match the device's physical block size.
+ * 'discard-secure' - All copies of the discarded sectors (potentially created
+ * by garbage collection) must also be erased.
  */
 #define BLKIF_OP_DISCARD           5
 
@@ -111,7 +125,11 @@ struct blkif_request_discard {
 
 struct blkif_request {
 	uint8_t        operation;    /* BLKIF_OP_???                         */
-	uint8_t        nr_segments;  /* number of segments                   */
+	union {
+		uint8_t nr_segments; /* number of segments                   */
+		uint8_t	flag;        /* flag for blkif_request_discard       */
+#define BLKIF_OP_DISCARD_FLAG_SECURE	(1<<0) /* ignored if discard-secure=0 */
+	} u1;
 	blkif_vdev_t   handle;       /* only for read/write requests         */
 	uint64_t       id;           /* private guest value, echoed in resp  */
 	union {


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 14:25:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 14:25:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDjpg-0005kj-I4; Tue, 11 Oct 2011 14:25:52 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDjpA-0005Yu-Of
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 14:25:21 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1318368299!53479602!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24554 invoked from network); 11 Oct 2011 21:25:00 -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;
	11 Oct 2011 21:25:00 -0000
Received: by vcbfo13 with SMTP id fo13so27941vcb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 14:25:16 -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:content-type;
	bh=JflE0v9wIw05Ovd4MpiPXQpO7TTFQZMeHohdjWJWvbQ=;
	b=tnHOMrLBrKazhfSpDE1N5E3e15hjYyD527FC4cCsFlcZQDQDTdyhGrgc/1HHZcqM9K
	PgML5mS1vQDEXsc3loZzSVtc7ZhQ74l6FrCq5xtoKDM0CPvkan0Q36SEt8LzqFLFuuTa
	y/X7GS9+rppsvzJ3Z0Hegy/vFRCl6Q0nOjeWc=
MIME-Version: 1.0
Received: by 10.52.27.208 with SMTP id v16mr20795208vdg.22.1318368316309; Tue,
	11 Oct 2011 14:25:16 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Tue, 11 Oct 2011 14:25:16 -0700 (PDT)
In-Reply-To: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
Date: Tue, 11 Oct 2011 22:25:16 +0100
X-Google-Sender-Auth: Z1ll8dPl_teBut2m63O2gublycQ
Message-ID: <CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] Re: PCI passthrough stopped working, brainache!
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 October 2011 20:45, Andy Burns <burns.me.uk@gmail.com> wrote:

> Anything stupid I sound like I've forgotten?

Well, I have it partly working again, I've not tied it down precisely
yet (because I'm trying multiple things at once of course!) but I
think it's either ...

Using "com1=115200,8n1 console=com1" on the hypervisor command with
"console=hvc0" on the dom0 kernel command
which I think would be a WTF? if that turns out to be the cause.

or

It works with only two PCI cards passed at once, which could be an
interrupt sharing issue or pciback issue I suppose.

or

it depends on the order of unbinding/binding devices from
     sys/bus/pci/drivers/ohci_hcd
     sys/bus/pci/drivers/ehci_hcd
     sys/bus/pci/drivers/pciback

I'll report back as I discover more ...

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 14:50:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 14: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 1RDkDa-0006VQ-Rv; Tue, 11 Oct 2011 14:50:34 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDkCj-0006Ih-Q1
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 14:49:42 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318369777!604624!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27812 invoked from network); 11 Oct 2011 21:49:38 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	11 Oct 2011 21:49:38 -0000
Received: by vcbfo13 with SMTP id fo13so51661vcb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 11 Oct 2011 14:49:37 -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:content-type;
	bh=a9z7iq2eJg/gsjXemB5HwzpA7iJooLERFSr13JDe7/0=;
	b=CdhVR9o9ZCzh1MYDc7uxhY4hiDFoB60FvIYcdmZtMDDiWz4o9cFMSBlXjBByF+R7Jq
	PcpaONKzhjaK6pnCpiktf6J7L8LaK7Ikp2zZyGLNq2et8nvYq6zGJD+DlQlfV/oRYyqI
	mGKt/9alZwopTt1i2FjVqRarCpz835JkOQ3Ds=
MIME-Version: 1.0
Received: by 10.52.92.132 with SMTP id cm4mr20925278vdb.5.1318369777506; Tue,
	11 Oct 2011 14:49:37 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Tue, 11 Oct 2011 14:49:37 -0700 (PDT)
In-Reply-To: <CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
Date: Tue, 11 Oct 2011 22:49:37 +0100
X-Google-Sender-Auth: Ya_mjKoP3rKkx3H-E5E5676hpoY
Message-ID: <CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] Re: PCI passthrough stopped working, brainache!
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 October 2011 22:25, Andy Burns <xen.lists@burns.me.uk> wrote:

> Well, I have it partly working again
> I think it's either ...
>
> Using "com1=115200,8n1 console=com1" on the hypervisor command with
> "console=hvc0" on the dom0 kernel command
> which I think would be a WTF? if that turns out to be the cause.

And the winner is  .......... WTF?

I'd enabled serial console for catching some crashers around the
3.1.0-rc5 and -rc6 releases, once Konrad's fixes made it upstream I'd
left the console serial enabled with -rc7 and -rc8, but I reverted to
VGA console with -rc9 as I was no longer seeing any crashers!

The motherboard is an X38 chipset, but doesn't have VT-d due to lack
of BIOS support (thanks ASUS) so there's no VGA passthrough going on.

Any educated guesses as to what's the cause?

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 16:46:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 16:46:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDm1v-0002iX-3F; Tue, 11 Oct 2011 16:46:39 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDm0u-0002Jp-08
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 16:45:36 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318376732!20874921!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3460 invoked from network); 11 Oct 2011 23:45:32 -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;
	11 Oct 2011 23:45:32 -0000
X-IronPort-AV: E=Sophos;i="4.68,526,1312156800"; 
   d="scan'208";a="8336966"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	11 Oct 2011 23:45: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, 12 Oct 2011 00:45:32 +0100
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 1RDm0p-0006IT-W4;
	Tue, 11 Oct 2011 23:45:32 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RDm0p-0007nC-Qr;
	Wed, 12 Oct 2011 00:45:31 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9251-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 12 Oct 2011 00:45:31 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9251: 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 9251 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9251/

Failures :-/ but no regressions.

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

version targeted for testing:
 xen                  4b0907c6a08c
baseline version:
 xen                  1185ae04b5aa

------------------------------------------------------------
People who touched revisions under test:
  Guido Gunther <agx@sigxcpu.org>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Olaf Hering <olaf@aepfle.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                                     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=4b0907c6a08c
+ . 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 4b0907c6a08c
+ branch=xen-unstable
+ revision=4b0907c6a08c
+ . 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 4b0907c6a08c 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 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 Tue Oct 11 17:41:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 17: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 1RDmsd-0006LW-5B; Tue, 11 Oct 2011 17:41:07 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDmrl-000691-O0
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 17:40:14 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-9.tower-174.messagelabs.com!1318380008!28840609!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14039 invoked from network); 12 Oct 2011 00:40:10 -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; 12 Oct 2011 00:40:10 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:b887:38ff:fe0c:f58b])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id A5A2A973D;
	Tue, 11 Oct 2011 17:40:07 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 67C3320258;
	Tue, 11 Oct 2011 17:40:05 -0700 (PDT)
Message-ID: <4E94E1E5.4070505@goop.org>
Date: Tue, 11 Oct 2011 17:40:05 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>, Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 09/26/2011 11:17 AM, Jeremy Fitzhardinge 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
>


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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 20:57:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 20:57:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDpwK-00023i-NX; Tue, 11 Oct 2011 20:57:08 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDpvW-0001qG-6F
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 20:56:18 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318391773!20888749!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18290 invoked from network); 12 Oct 2011 03:56:14 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-15.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 03:56:14 -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
	p9C3u9iW032497
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 12 Oct 2011 03:56:10 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
	p9C3u8GR010940
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 03:56:08 GMT
Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9C3u2Sg022420; Tue, 11 Oct 2011 22:56:02 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 11 Oct 2011 20:56:02 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 3ABC0157E; Tue, 11 Oct 2011 23:50:32 -0400 (EDT)
Date: Tue, 11 Oct 2011 23:50:32 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andy Burns <xen.lists@burns.me.uk>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
Message-ID: <20111012035032.GB26092@phenom.oracle.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@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.0A090202.4E950FDB.0035:SCFMA922111,ss=1,re=-4.000,fgs=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 Tue, Oct 11, 2011 at 10:49:37PM +0100, Andy Burns wrote:
> On 11 October 2011 22:25, Andy Burns <xen.lists@burns.me.uk> wrote:
> 
> > Well, I have it partly working again
> > I think it's either ...
> >
> > Using "com1=115200,8n1 console=com1" on the hypervisor command with
> > "console=hvc0" on the dom0 kernel command
> > which I think would be a WTF? if that turns out to be the cause.
> 
> And the winner is  .......... WTF?
> 
> I'd enabled serial console for catching some crashers around the
> 3.1.0-rc5 and -rc6 releases, once Konrad's fixes made it upstream I'd
> left the console serial enabled with -rc7 and -rc8, but I reverted to
> VGA console with -rc9 as I was no longer seeing any crashers!
> 
> The motherboard is an X38 chipset, but doesn't have VT-d due to lack
> of BIOS support (thanks ASUS) so there's no VGA passthrough going on.
> 
> Any educated guesses as to what's the cause?

So it works now right? Did you turn off the machine in between your
reboots - when you went back from CentOS to F16?

(Yes, I did encounter a bug where it would program an hardware interface
that would retain its state after a reboot and cause the newly built kernel
to go wrongly. Spent couple of good days trying to narrow that one down).

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

From xen-devel-bounces@lists.xensource.com Tue Oct 11 21:18:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 21: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 1RDqHN-0003OG-7H; Tue, 11 Oct 2011 21:18:53 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDqGq-0003CM-Tk
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 21:18:21 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1318393086!50606468!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12838 invoked from network); 12 Oct 2011 04:18:06 -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;
	12 Oct 2011 04:18:06 -0000
X-IronPort-AV: E=Sophos;i="4.68,527,1312156800"; 
   d="scan'208";a="8338138"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 04:18: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; Wed, 12 Oct 2011 05:18:17 +0100
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 1RDqGn-0007nf-9R;
	Wed, 12 Oct 2011 04:18:17 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RDqGn-0004om-68;
	Wed, 12 Oct 2011 05:18:17 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9252-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 12 Oct 2011 05:18:17 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9252: 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 9252 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9252/

Failures :-/ but no regressions.

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

version targeted for testing:
 xen                  4b0907c6a08c
baseline version:
 xen                  4b0907c6a08c

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


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 Oct 11 22:40:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 11 Oct 2011 22:40:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDrYI-00062T-IN; Tue, 11 Oct 2011 22:40:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDrXn-0005pr-4o
	for xen-devel@lists.xensource.com; Tue, 11 Oct 2011 22:39:55 -0700
X-Env-Sender: donduq@i2pmail.org
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318397991!20744494!1
X-Originating-IP: [82.103.129.142]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23731 invoked from network); 12 Oct 2011 05:39:52 -0000
Received: from e82-103-129-142s.easyspeedy.com (HELO b.mx.i2pmail.org)
	(82.103.129.142) by server-8.tower-182.messagelabs.com with SMTP;
	12 Oct 2011 05:39:52 -0000
X-Mailer: smtp.postman.i2p - Official I2P Mailer
From: "D. Duckworth" <donduq@i2pmail.org>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] XEN - networking and performance
In-Reply-To: <20111010170359.DF487AE08F@smtp.postman.i2p>
References: <20111006203821.CD70CE9342@kermit.internecto.net>
	<20111008190701.50DFBAE098@smtp.postman.i2p>
	<20111010170359.DF487AE08F@smtp.postman.i2p>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Message-Id: <20111012045004.EEDCCAE0AC@smtp.postman.i2p>
Date: Wed, 12 Oct 2011 04:50:04 +0000 (UTC)
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've removed xen-users, the subject seems appropriate for xen-devel now.

> > I tried to use xl with xen4 for a while but due to bugs and missing
> > features I had to go back to xm and xend. This is where the fun
> > begins. In the past I used xend with network-bridge and for some
> > strange reason (voodoo probably) I blindly accepted that script in
> > the past and blamed myself for not appreciating it. But let's be
> > blunt and honest: the scripts, in particular the script that
> > *modifies dom0 networking during xend startup* is the biggest piece
> > of sh!# idea I have ever seen in Xen. It creates bridges, takes
> > eth0 down, tortures dom0 with occult ip addr/route, brctl, sysctl
> > and iptables awk/sed manipulations and then it has you looking at
> > your screen yearning for the moment that ping timeouts become ping
> > replies, telling you that your box is reachable again. This script
> > is a malevolent demon from the sewers of Norman the Golgothan and
> > the worst part is that network-bridge is also still the
> 
> <laughs>
> > recommended default!
> 
> Can you point me to where it mentions that please?

Sorry for the word flood & glad you had to laugh at my cynicism, I had
wanted to use my Norman comparison at least once somewhere and this was
the perfect opportunity. I'll explain the subtlety of the above problem.

So in late 2008 installed xen, then went through xend-config.sxp a
couple of times and came across bridges as the documented feature and
then two non-descriptive oneliners of alternatives. No need for NAT in
my situation but I skipped routing due to a lack of understanding on my
side. Heh what can I say, "know thine limitations?" I did search for
info about the routing option and it did not make sense to me at the
time. I think there was no such thing on the wiki back then either. So
i shelved the idea for later consideration and a few months later there
was a wiki update that did vaguely mention routing. But I already had a
working bridge setup, a tentative one due to the mysterious voodoo
happening somewhere on the machine. I probably have made this point
enough now but if it happens to me it probably happens to others too. I
had no clue why arp was being disabled, why the mac got
fe:ff:ff:ff:ff:ff. I do now thanks to other puzzled people who emailed
their questions and got them answered.

> We realized that the networking setup is quite complex and would be
> best left in the hands of the admins. The problem is that..
> > 
> > It surely seems so. Xen's /etc/xen/scripts (another design fail, why
> > not /usr?) and udev scripts are confusing ad-hoc bloatware routines
> > and are not transparent at all. With the current xen4 I saw the
> > premature advice to more or less 'prepare for migration from xm to
> > xl'. Yet, xl supports less and is conflicting: there is no vifname,
> > no 'xl new/delete', no more python, no relocation and suddenly there
> > is a conflict between 'xm start domain' versus 'xl start
> > /etc/xen/domain'.
> > 
> > So new features emerge, adding to the confusion of the end user,
> > while old problems are not being fixed properly. I wonder why,
> > especially because it does not seem that xm and xend are the broken
> > parts that need to be replaced by an unstable interface.
> > 
> > What needs attention first and foremost are two things, first of
> > which is real and wise effort into one simple, minimal script that
> > just handles the minimum in a transparent way e.g. control the
> > hypervisor, manage vms, manage the backend. Of course networking can
> > be done on domain start too, but this has happen in an entirely
> > different way from what it does and how it does it. This is so
> > important because it gives more control to the user that runs Xen.
> > It's also a good moment to build in proper and mature support for
> > IPv6.
> > 
> > Secondly, the website and documentation should be cleaned up and
> > revised where appropriate. The current situation is a mess that has
> > a much too steep and incompatible learning curve right now - for
> > example, a bridge should just not be named eth0 and a physical
> > device should not be renamed at all. It's fundamentally wrong,
> > stupid, mad as hell and a PR failure for Xen to do it this way out
> > of the box. No matter how often and detailed it has been documented
> > on the website. 
> 
> .. the documentation and setup is sometimes quite hard. BTW, we are
> going to do on Oct 26th a Documentation Day to clean up some of this
> mess. Would you be intereted in helping along - perhaps in the
> networking Wiki?

Interested yes, perhaps. Could you please send me the details? As for
the notion that documentation and setup can be hard, that's exactly why
I, like you, suggest to move away from OS configuration as much as
possible -- obviously the hypervisor and kernel integration are the
primary domain. Daily commits by committed people seem to support this
theory.

Moving away from OS integration narrows the scope of the Xen project
which means less specific documentation needs to be maintained while
making it easier for everyone to invoke their own methods. OS
integration, even udev scripts, should move to the distribution's
developers and they can leave the rest up to the end user. Supporting
everything from within Xen is like trying to be everybody's friend. An
impossible task, just ask Ghandi, he tried it and got shot.

So take vif-nat. It does stuff with dhcp with all kinds of assumptions.
I don't even use ISC's dhcpd, I use dnsmasq. And this script does stuff
with iptables. I use shorewall and shreeked when I noticed a sudden
change in my tables. A fast but not fun two or three hours later I
found what did do it... after having searched through /usr and the domU.
So I found this whole script an abomination. Here's one other example
from the function dhcp_arg_add_entry (!)

# handle Red Hat, SUSE, and Debian styles, with or without quotes

Just...don't do this. These might be three big distributions but I
wonder whether they outnumber all users of all other distributions. And
the BSD camp doesn't seem to be really fond of Xen at the moment either.
In fact to me it seems like Xen's arrows all focus on Linux while a
bigger arrow marked KVM points towards the same direction. But I'm not
deeply involved with any project's development and never have been, so I
could be totally wrong. I don't even know Xen's project roadmap, future
outlook et cetera. I'll even admit I'm just a boob!

Still, it seems only logical to move to a more generic way of
doing things while OS/distribution devs and admins take care of their
respective domains. (Is this even remotely making sense to anyone?)

> > 
> > I propose something like the following for xen networking:
> > 
> > * Xen will not manipulate non-xen devices or a firewall under any
> >   circumstance, it might only add or substract routes and/or rules
> > from the routing tables,
> 
> Uh, what is 'non-xen' devices? Like bridges?

Yes. If I would use a Xen created bridge it has STP disabled, more
occult features, It's evil. So Xen must not create or touch those and
also not touch the routing/iptables with automated scripts. It is
clearly a much better idea to create transparent per-domain networking
options. Can be done in different ways like with pre/post-up/down
networking scripts that the dev/admin has to write. It still allows for
Xen to supply examples and suggest sane defaults. This time
transparently, making it all easier to maintain for everyone because
more modular. There can be a syntax check that spawns a warning if a
vif is configured without configured settings/scripts etc...

> 
> > * Allow for networking configuration per domU. For example let
> >   networking per device be nat, routed, bridged or custom, where
> >   all name the interface and bring it up; nat only adds the ip to
> > the routing table; routed could be an array of routes and rules
> > that need to be added or subtracted from various routing tables and
> > it might support proxyarp; bridged turns off arp, sets the mac on
> > the vif and then adds the interface to a bridge that should already
> > be created by the user; and custom is a custom set of unmanaged
> > commands after creating and destroying a domain.
> 
> You lost me. <sigh> I am using a bridge configuration and just
> do:
> 
> auto lo
> iface lo inet loopback
> 
> auto switch
> iface switch inet static
> 	address 192.168.101.16
> 	netmask 255.255.255.0
> 	gateway 192.168.101.1
> 	bridge_ports eth2
> 
> And just use that 'bridge=switch' in all my configuration. And that
> seems to work just fine - wouldn't that be best way of providing
> the first network setup to users? I would think the majority of folks
> do something akin to this?

Well I said a lot of things but not that it's broken. :) Not that I
couldn't, though. The above stuff works in Debian, but Arch Linux has no
ifup, neither does bsd. So those maintainers have to port Xen's code
with patches making it time expensive (and painfully dull). Instead the
whole routine that removes interfaces, adds new bridges, sets iptables,
etc. should simply be deleted. Not Xen's business; makes grown men cry.
How the majority of users handles it is not really relevant imho
because they are also bound to what Xen supplies. A lot of good people
see no obvious choice and a lot of good people have no clue about STP.
Consequently you'll find a lot of the same help requests on various
forums and lists when searching for clues. 

I tried to make sense of the minimum that the xen scripts do (with
xenstore, vif creation, device and udev interaction etc.) but the jungle
of 118 functions (grep '()' /etc/xen/scripts/* | wc -l, take or leave a
few) was not helping. I'd appreciate it if someone would write me a
detailed step by step hierarchy that explains what happens right in a
Xen4.2 dom0 from when a domain is created until it's running, what might
happen in between, and what happens from a domain's shutdown or crash to
domain deletion.

> > So, with that off my chest and the second line of my network-bridge
> > being the words "exit 0" Xen lets my dom0 configuration alone
> > like it is supposed to do. While KVM is becoming a 'next cool
> > thing' for many people I would still prefer a separate hypervisor
> > so now the fat just has to be removed from Xen.
> > 
> 
> I am all for removing fat. Do you have links to some of particularly
> bad Wiki pages that should be heavily audited?

I would be more entertained to see how far I can take this plan and
if/how discussion will shape it into a workable form. I think that the
entire networking section and more can be wholly rewritten together
with new scripts. Mind that I am only talking about core Xen and not
about XCP/libvirt/foo/bar, in fact I don't even have experience with
any of that and I simply assume that they handle stuff in their own way.

One question that has been bugging me is the xm/xl thing. What are the
exact plans, will xl indeed be phased in while xm will be phased out and
what will/won't be supported by xl? Or did I misinterpret it. Imho
a suggestion to switch over should only be come out when xl becomes
'distribution-grade stable'.

Right now it's just a tool worth testing.
(-That's what "she" said..)

_donduq.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 00:14:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 00:14:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDt1K-00083K-Ib; Wed, 12 Oct 2011 00:14:30 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDt0X-0007r2-Ux
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 00:13:42 -0700
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1318403618!32765177!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2130 invoked from network); 12 Oct 2011 07:13:38 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-6.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2011 07:13:38 -0000
Received: by eyb6 with SMTP id 6so584094eyb.30
	for <xen-devel@lists.xensource.com>;
	Wed, 12 Oct 2011 00:13:35 -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
	:content-transfer-encoding;
	bh=w7avXAdlujgmXEjG1vqjkyS+K/pSmV3IcuwxPpo7eE8=;
	b=Vvut/jZ7pSO27RoW8ZNzdaoRavlNZt9DRc69BaR+6SKY9bZggbxwJpOTzhLQgLy1o6
	a+WDG8qRixtyRD+keRJTVJmxgq1sBQyQ4wNkmw+MVmRfCypUz4B5qsIoczqMXg9a8aUz
	l0BgEVG8HETn1h3AgZw/Nvp/IEkTFe5QgFj2s=
MIME-Version: 1.0
Received: by 10.223.17.3 with SMTP id q3mr20890608faa.28.1318403615322; Wed,
	12 Oct 2011 00:13:35 -0700 (PDT)
Received: by 10.223.72.205 with HTTP; Wed, 12 Oct 2011 00:13:35 -0700 (PDT)
Date: Wed, 12 Oct 2011 16:13:35 +0900
Message-ID: <CAP2B85-UdKBazkis6Ga1QSX=PLfuk_LMLwh1RnQ2oMsi10wvHQ@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] Front-end back-end connection
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 All,

I am in the process of conecting my front-end to my back end.
The process is like this:
1. Set up xenstore conection
2. initiate front rings
3. Initiate gran table
4. Take my rings mfn address and set it up as a entry (more on this)
5. create a unbound port for front-back ring communication (more on this )
5.1 I start by changing state to XenbusStateInitialising
5.2 ring-ref entry (step 4)
5.3 port entry (step 5)
5.4 backend state is XenbusStateInitWait
5.4 change state to XenbusStateInitialised
5.5 back end state is XenbusStateClosing meaning there is an error or
something is missing.
6. on sucess end

More on step 4: I got my grant page table like this:
	struct gnttab_setup_table gst;
	grant_entries =3D (struct grant_entry_v1 *) memalign_high(4096, 4096);
//asume malloc
	memset(grant_entries,0,4096);
	gst.dom =3D DOMID_SELF; //&me
	gst.nr_frames =3D 1; //a single page
	//gst.frame_list =3D grant_entries; (I have no idea how to handle this :P =
)
	res =3D hypercall_grant_table_op(GNTTABOP_map_grant_ref, &gst, 1);
I think this works, but maybe I am wrong. This is needed on step 5, so..
More on step 5:
I consider the grant table an array of type struct grant_entry_v1.
So I simply do grant_entry_v1[0] for my first grant entry, and so
forth. For this case I read on the list some time ago that entry 0 did
not work, so I work with entry 1, like this:
grant_entries[aval_grant].domid =3D ext_domid;
grant_entries[aval_grant].frame =3D _frame; where frame is: (u32)sring
>> PAGE_SHIFT //meaning mfn of my rings.
grant_entries[aval_grant].flags =3D GTF_permit_access;

These last two steps I described may be wrong... I know this because
the backend state is not XenbusStateConnected.
I think my mistake is on step 5, so can someone please shed some light
on this small issue.

And thank you very much for taking the time to read.

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 Oct 12 00:36:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 00:36:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDtN1-0000ey-AU; Wed, 12 Oct 2011 00:36:55 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDtMG-0000Sw-US
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 00:36:09 -0700
X-Env-Sender: mingo@elte.hu
X-Msg-Ref: server-11.tower-182.messagelabs.com!1318404965!20114806!1
X-Originating-IP: [157.181.151.9]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20675 invoked from network); 12 Oct 2011 07:36:05 -0000
Received: from mx2.mail.elte.hu (HELO mx2.mail.elte.hu) (157.181.151.9)
	by server-11.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 07:36:05 -0000
Received: from elvis.elte.hu ([157.181.1.14])
	by mx2.mail.elte.hu with esmtp (Exim) id 1RDtLt-0006ZW-R7
	from <mingo@elte.hu>; Wed, 12 Oct 2011 09:35:51 +0200
Received: by elvis.elte.hu (Postfix, from userid 1004)
	id E725A3E25A6; Wed, 12 Oct 2011 09:35:29 +0200 (CEST)
Date: Wed, 12 Oct 2011 09:34:03 +0200
From: Ingo Molnar <mingo@elte.hu>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111012073402.GJ18618@elte.hu>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
	<619c66d6da63aa086e2eac017e7aed216cc8ddc3.1317755691.git.jeremy.fitzhardinge@citrix.com>
	<8762k4grwy.fsf@rustcorp.com.au> <20111010073405.GC29035@elte.hu>
	<4E934F37.2020300@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E934F37.2020300@goop.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
Received-SPF: neutral (mx2.mail.elte.hu: 157.181.1.14 is neither permitted nor
	denied by domain of elte.hu) client-ip=157.181.1.14;
	envelope-from=mingo@elte.hu; helo=elvis.elte.hu; 
X-ELTE-SpamScore: -2.0
X-ELTE-SpamLevel: 
X-ELTE-SpamCheck: no
X-ELTE-SpamVersion: ELTE 2.0 
X-ELTE-SpamCheck-Details: score=-2.0 required=5.9 tests=AWL,
	BAYES_00 autolearn=no SpamAssassin version=3.3.1
	-2.0 BAYES_00               BODY: Bayes spam probability is 0 to 1%
	[score: 0.0000]
	0.0 AWL AWL: From: address is in the auto white-list
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	Rusty Russell <rusty@rustcorp.com.au>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V3 2/8] stop_machine: make stop_machine
 safe and efficient to call early
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Fitzhardinge <jeremy@goop.org> wrote:

> On 10/10/2011 12:34 AM, Ingo Molnar wrote:
> > * Rusty Russell <rusty@rustcorp.com.au> wrote:
> >
> >> On Tue,  4 Oct 2011 12:18:03 -0700, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
> >>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> >>>
> >>> Make stop_machine() safe to call early in boot, before stop_machine()
> >>> has been set up, by simply calling the callback function directly if
> >>> there's only one CPU online.
> >> Not that you need this, since it's >90% Tejun's code now, but:
> >>
> >> Acked-by: Rusty Russell <rusty@rustcorp.com.au>
> > hey, extra review is always useful.
> >
> > Jeremy, Tejun, what's the expected merge path of these changes?
> 
> Andrew has already picked up the stop_machine patch, I think.  But it's
> pretty settled now, so it shouldn't cause any problem if it gets via
> multiple paths.
> 
> What about the jump-label stuff?  Has that been going via tip.git in the
> past, or by some other path?

If it has Jason's and PeterZ's ack then it can go via any other tree 
in this cycle - we are not carrying jump label patches right now.

But those acks are very much desired.

Thanks,

	Ingo

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 00:47:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 00:47:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDtX0-0001BG-U4; Wed, 12 Oct 2011 00:47:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDtW9-0000yx-49
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 00:46:21 -0700
X-Env-Sender: a.p.zijlstra@chello.nl
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318405558!46264368!1
X-Originating-IP: [205.233.59.134]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28221 invoked from network); 12 Oct 2011 07:45:59 -0000
Received: from merlin.infradead.org (HELO merlin.infradead.org)
	(205.233.59.134)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 07:45:59 -0000
Received: from canuck.infradead.org ([2001:4978:20e::1])
	by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux))
	id 1RDtVf-0005Rk-O0; Wed, 12 Oct 2011 07:45:51 +0000
Received: from j77219.upc-j.chello.nl ([24.132.77.219] helo=twins)
	by canuck.infradead.org with esmtpsa (Exim 4.76 #1 (Red Hat Linux))
	id 1RDtVe-0003Az-Tc; Wed, 12 Oct 2011 07:45:51 +0000
Received: by twins (Postfix, from userid 1000)
	id 3D4F380DBA3A; Wed, 12 Oct 2011 09:45:48 +0200 (CEST)
From: Peter Zijlstra <a.p.zijlstra@chello.nl>
To: Ingo Molnar <mingo@elte.hu>
Date: Wed, 12 Oct 2011 09:45:48 +0200
In-Reply-To: <20111012073402.GJ18618@elte.hu>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
	<619c66d6da63aa086e2eac017e7aed216cc8ddc3.1317755691.git.jeremy.fitzhardinge@citrix.com>
	<8762k4grwy.fsf@rustcorp.com.au> <20111010073405.GC29035@elte.hu>
	<4E934F37.2020300@goop.org> <20111012073402.GJ18618@elte.hu>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Mailer: Evolution 3.0.3- 
Message-ID: <1318405548.3968.7.camel@twins>
Mime-Version: 1.0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, maintainers <x86@kernel.org>, Jeremy,
	Andrew Morton <akpm@linux-foundation.org>,
	Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	David Daney <david.daney@cavium.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	Rusty Russell <rusty@rustcorp.com.au>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, the,
	"H. Peter Anvin" <hpa@linux.intel.com>, "David S.
	Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V3 2/8] stop_machine: make stop_machine
 safe and efficient to call early
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-12 at 09:34 +0200, Ingo Molnar wrote:
>=20
> If it has Jason's and PeterZ's ack then it can go via any other tree=20
> in this cycle - we are not carrying jump label patches right now.

I don't seem to have them in my inbox, just one or two patches of a
larger series.



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 01:05:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 01:05:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDtp6-0002U3-JG; Wed, 12 Oct 2011 01:05:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDtlL-0002En-MN
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 01:02:26 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318406519!19134950!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7101 invoked from network); 12 Oct 2011 08:02:00 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2011 08:02:00 -0000
Received: by vws13 with SMTP id 13so473167vws.30
	for <xen-devel@lists.xensource.com>;
	Wed, 12 Oct 2011 01:01:58 -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:content-type;
	bh=L0GQiEBwWGmWpRsvzhfZMrAtQWLdW95yzIUWG3lFNdQ=;
	b=pUFmz2aI2OvedH1HHB+14GEMj4mCufJYKhENqAKowpr+X6R7UfeKRKLGYFeQstcQ+L
	x1ANIPsCiPtPZvD/XnUJxV9PpbXs7xnpLn1X19NcjtMrf46E34aiMPL/EdgUccbo/s7V
	Jh1Is0qIhsVA+oBmjxx+qdCelTJ0e2O0JoAjQ=
MIME-Version: 1.0
Received: by 10.52.184.106 with SMTP id et10mr5348238vdc.107.1318406518887;
	Wed, 12 Oct 2011 01:01:58 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Wed, 12 Oct 2011 01:01:58 -0700 (PDT)
In-Reply-To: <20111012035032.GB26092@phenom.oracle.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
Date: Wed, 12 Oct 2011 09:01:58 +0100
X-Google-Sender-Auth: p17yVKF5UslBkKYLsx9QHorK7Rg
Message-ID: <CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-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

Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:

> So it works now right?

No.  When I went to bed last night I was convinced it was working,
having seen it work three times in a row where it hadn't at all for
the past 24 hours, albeit not knowing why serial console should make
it work.

I left the machines updating to latest Fedora16 branch, but this
morning it's not working again.

> Did you turn off the machine in between your
> reboots - when you went back from CentOS to F16?

I've not booted CentOS for a few weeks now, machine has certainly been
physically powered off since then,both when working and when faiing.

I do know that for the test above where I posted dmesg results as
requested by Ian, the machine was physically powered off and
passthrough  failed.

I didn't turn the machine physically off for every test, sometimes I
rebooted it from within the dom0, sometimes powered it down to S5
state (which doesn't always work) and re-woke with WOL, sometimes it
hung and  I used the reset button, sometines it hung and I'd press and
hold the power button.

> I did encounter a bug where it would program an hardware interface
> that would retain its state after a reboot and cause the newly built kernel
> to go wrongly. Spent couple of good days trying to narrow that one down

I'll make sure I always physically turn it off until I find the true
cause, back to older  hypervisor and kernel packages again for more
tests ...

I think I remember what was the test I did before the boot that
started working again , but honestly can't remember whether I rebooted
or powered off after that.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 02:20:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 02:20:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDuzQ-0005iX-NZ; Wed, 12 Oct 2011 02:20:40 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDuyR-0005Vk-T3
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 02:19:40 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1318410714!658309!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2079 invoked from network); 12 Oct 2011 09:11:54 -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;
	12 Oct 2011 09:11:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,333,1315180800"; 
   d="scan'208";a="8342312"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 09:11:53 +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, 12 Oct 2011 10:11:53 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Date: Wed, 12 Oct 2011 10:11:53 +0100
In-Reply-To: <2fb4bf8c16cd35ddc0bf.1318336005@loki>
References: <2fb4bf8c16cd35ddc0bf.1318336005@loki>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318410713.21903.598.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>
Subject: [Xen-devel] Re: [PATCH] libxl: reimplement buffer for bootloading
 and drop data if buffer 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

On Tue, 2011-10-11 at 13:26 +0100, Roger Pau Monne wrote:
> # HG changeset patch
> # User Roger Pau Monne <roger.pau@entel.upc.edu>
> # Date 1318335991 -7200
> # Node ID 2fb4bf8c16cd35ddc0bf7ddc7ff8fda4b9678211
> # Parent  64f17c7e6c33e5f1c22711ae9cbdcbe191c20062
> libxl: reimplement buffer for bootloading and drop data if buffer is full.
> 
> Implement a buffer for the bootloading process that appends data to the end until it's full. Drop output from bootloader if a timeout has occurred and the buffer is full. Prevents the bootloader from getting stuck when using ptys with small buffers.
> 
> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
> 
> diff -r 64f17c7e6c33 -r 2fb4bf8c16cd tools/libxl/libxl_bootloader.c
> --- a/tools/libxl/libxl_bootloader.c	Tue Oct 11 10:26:32 2011 +0200
> +++ b/tools/libxl/libxl_bootloader.c	Tue Oct 11 14:26:31 2011 +0200
> @@ -21,6 +21,7 @@
>  
>  #include <sys/stat.h>
>  #include <sys/types.h>
> +#include <sys/ioctl.h>
>  
>  #include "libxl.h"
>  #include "libxl_internal.h"
> @@ -28,7 +29,8 @@
>  #include "flexarray.h"
>  
>  #define XENCONSOLED_BUF_SIZE 16
> -#define BOOTLOADER_BUF_SIZE 1024
> +#define BOOTLOADER_BUF_SIZE 4096
> +#define BOOTLOADER_TIMEOUT 1
>  
>  static char **make_bootloader_args(libxl__gc *gc,
>                                     libxl_domain_build_info *info,
> @@ -165,10 +167,11 @@ static pid_t fork_exec_bootloader(int *m
>   */
>  static char * bootloader_interact(libxl__gc *gc, int xenconsoled_fd, int bootloader_fd, int fifo_fd)
>  {
> -    int ret;
> +    int ret, read_ahead, timeout = 0;
>  
>      size_t nr_out = 0, size_out = 0;
>      char *output = NULL;
> +    struct timeval wait;
>  
>      /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
>      int xenconsoled_prod = 0, xenconsoled_cons = 0;
> @@ -177,6 +180,10 @@ static char * bootloader_interact(libxl_
>      int bootloader_prod = 0, bootloader_cons = 0;
>      char bootloader_buf[BOOTLOADER_BUF_SIZE];
>  
> +    /* Set timeout to 1s before starting to discard data */
> +    wait.tv_sec = BOOTLOADER_TIMEOUT;
> +    wait.tv_usec = 0;

There are some portability snaggles with the timeout argument to a
select (IIRC Linux can modify it). I think it would be wise to
reinitialise this right before each select call. 

> +
>      while(1) {
>          fd_set wsel, rsel;
>          int nfds;
> @@ -185,15 +192,26 @@ static char * bootloader_interact(libxl_
>              xenconsoled_prod = xenconsoled_cons = 0;
>          if (bootloader_prod == bootloader_cons)
>              bootloader_prod = bootloader_cons = 0;
> +        /* Move buffers around to drop already consumed data */
> +        if (xenconsoled_prod > 0) {
> +            xenconsoled_prod -= xenconsoled_cons;
> +            memmove(xenconsoled_buf, &xenconsoled_buf[xenconsoled_cons], xenconsoled_prod);
> +            xenconsoled_cons = 0;
> +        }
> +        if (bootloader_prod > 0) {
> +            bootloader_prod -= bootloader_cons;
> +            memmove(bootloader_buf, &bootloader_buf[bootloader_cons], bootloader_prod);
> +            bootloader_cons = 0;
> +        }

If the timeout occurs then we will drop through and each of the FD_ISSET
will fail and we will loop back round to the top and do this processing
before trying again, which will ensure that xenconsoled_cons == 0.

I think this removes the need for the timeout var you added, as well as
the associated continue statement and (I think) makes the control flow
simpler.

>          FD_ZERO(&rsel);
>          FD_SET(fifo_fd, &rsel);
>          nfds = fifo_fd + 1;
> -        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0)) {
> +        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0) || timeout) {

If you've had a timeout there will be data pending on this FD won't
there, so this change essentially means that after the first timeout the
timeout on the select becomes effectively zero?

Can you just make this:
	   if (xenconsoled_prod == 0 || xenconsoled_cons == 0) {

The previous memmove will ensure we hit this case. Then inside the if
FD_ISSET(xenconsoled_fd) you can check for prod == BOOTLOADER_BUF_SIZE
and discard from the buffer (e.g. we can discard the tail just by
modifying prod?).

Hmm. that might discard a bit too aggressively, perhaps leaving this
check as it was and doing the discard if (ret == 0 && xenconsoled_prod
== BOOTLOADER_BUF_SIZE) in the else clause if the FD_ISSET works?

>              FD_SET(xenconsoled_fd, &rsel);
>              nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
>          }
> -        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0)) {
> +        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0) || timeout) {
>              FD_SET(bootloader_fd, &rsel);
>              nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
>          }
> @@ -208,12 +226,23 @@ static char * bootloader_interact(libxl_
>              nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
>          }
>  
> -        ret = select(nfds, &rsel, &wsel, NULL, NULL);
> +        ret = select(nfds, &rsel, &wsel, NULL, &wait);
>          if (ret < 0)
>              goto out_err;
> +        if (ret == 0) {
> +            timeout = 1;
> +            continue;
> +        }
> +        timeout = 0;
>  
>          /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
>          if (FD_ISSET(xenconsoled_fd, &rsel)) {
> +            if (xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
> +                if (ioctl(xenconsoled_fd, FIONREAD, &read_ahead) < 0)

I think we can avoid this as described above, but if not then you need
to be wary of the case where read_ahead > XENCONSOLED_BUF_SIZE.

> +                    goto out_err;
> +                memmove(xenconsoled_buf, &xenconsoled_buf[read_ahead], XENCONSOLED_BUF_SIZE - read_ahead);
> +                xenconsoled_prod -= read_ahead;
> +            }
>              ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled_prod);
>              if (ret < 0 && errno != EIO && errno != EAGAIN)
>                  goto out_err;
> @@ -230,6 +259,12 @@ static char * bootloader_interact(libxl_
>  
>          /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
>          if (FD_ISSET(bootloader_fd, &rsel)) {
> +            if (bootloader_prod == BOOTLOADER_BUF_SIZE) {
> +                if (ioctl(bootloader_fd, FIONREAD, &read_ahead) < 0)
> +                    goto out_err;
> +                memmove(bootloader_buf, &bootloader_buf[read_ahead], BOOTLOADER_BUF_SIZE - read_ahead);
> +                bootloader_prod -= read_ahead;
> +            }
>              ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod);
>              if (ret < 0 && errno != EIO && errno != EAGAIN)
>                  goto out_err;



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 02:24:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 02:24:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDv3X-00068V-4t; Wed, 12 Oct 2011 02:24:55 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDv2w-0005wF-29
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 02:24:18 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318411454!21247034!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28060 invoked from network); 12 Oct 2011 09:24:14 -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;
	12 Oct 2011 09:24:14 -0000
X-IronPort-AV: E=Sophos;i="4.69,333,1315180800"; 
   d="scan'208";a="8342646"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 09:24:14 +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, 12 Oct 2011 10:24:14 +0100
Subject: Re: [Xen-devel] reg dom0 console
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Prasad B <netlogic.xen@gmail.com>
Date: Wed, 12 Oct 2011 10:24:14 +0100
In-Reply-To: <CAPw52B_-K5Hy+Wo3UnarYoAb85WLhxTb4KtfByMPpL5_g+COVQ@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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318411454.21903.606.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 Sat, 2011-10-08 at 03:22 +0100, Prasad B wrote:
> On Wed, Oct 5, 2011 at 11:54 PM, Ian Campbell
> <Ian.Campbell@citrix.com> wrote:
>         > After a few months of hiatus, we have resumed working on
>         mips port of
>         > Xen. We are at the point of booting dom0 userland (init
>         process and
>         > its children).
>         
>         
>         That sounds awesome! Are you close to having any initial
>         patches for
>         submission?
> 
> We are working with 3.4.0 which is really old. So, we would like to
> run a few heavyweight applications on Linux, forward port our MIPS
> changes to 4.1.0 and then submit the patches along with our PV Linux.
> We are using 2.6.34 Linux kernel and have not been working with pvops
> interface. So, there might have to be some collective effort to move
> our MIPS Linux changes into the pvops framework.
> 
> 
>  
>         > The init process gets spawned and in turn forks off
>         processes to run
>         > commands in /etc/rc.d/init.d/rcS. However, the getty process
>         does not
>         > seem to run subsequently and hence the login prompt is not
>         displayed.
>         > Dom 0 does not use the uart and uses the hvc0 driver.
>         >
>         > I searched the web for hints and there were suggestions to
>         add
>         > directives such as
>         >
>         > 1:2345:respawn:/sbin/getty 38400 hvc0
>         >
>         > to /etc/inittab file. But that does not seem to help.
>         >
>         > Could you please give any pointers to get getty talk to the
>         console
>         > driver correctly ?
>         
>         
>         Do you have something which is creating the actual /dev/hvc0
>         node? You
>         can probably boot with init=/bin/sh in order to get a shell to
>         poke
>         around and check this with, run the getty by hand etc.
> 
> replacing /sbin/init with /bin/sh displays the following output:
> 
> "BusyBox v1.14.0 (2009-05-01 15:38:41 PDT) built-in shell (ash)
> Enter 'help' for a list of built-in commands.
> 
> /bin/sh: can't access tty; job control turned of"
> 
> and input/commands could not be fed to the shell.
> 
> 
>         I had a vague recollection that the busybox inittab syntax was
>         a little
>         different to standard sysvinit but google threw up various
>         things which
>         suggest that what you've got is OK. Are you maybe in runlevel
>         1? You
>         could try changing the 2345->12345 to be sure. You probably
>         want this
>         getty in single user mode anyway. Alternatively lots of
>         example busybox
>         configurations I see on google seems to omit the runlevels,
>         which I
>         guess means "all"?
> 
> created an hvc device in /dev and played with different runlevels. But
> getty process is either dormant or dead and the cpu_idle() function
> kicks in.

I'm afraid I've not got any real ideas. Do you think that event channels
are working correctly? In particular you will need to be able to receive
VIRQ_CONSOLE.

Hopefully the stuff in drivers/tty/hvc/hvc_xen.c:xen_hvc_init is taking
the correct xen_initial_domain paths and not the domU ones. I think this
must be correct, or you wouldn't get any output at all, but adding a
printk or two to confirm might be handy.

I'm not 100% sure but it looks like passing xen_irq == -1 to hvc_alloc
might force things into a polled mode? That might be a useful debugging
step.

Ian.


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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 02:55:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 02:55:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDvWx-0007Ao-IW; Wed, 12 Oct 2011 02:55:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDvW9-0006y6-0h
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 02:54:29 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1318413265!675381!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14320 invoked from network); 12 Oct 2011 09:54:26 -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; 12 Oct 2011 09:54:26 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 12 Oct 2011 10:54:25 +0100
Message-Id: <4E957FF0020000780005ADA7@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 12 Oct 2011 10:54:24 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Jeremy Fitzhardinge" <jeremy@goop.org>
Subject: Re: [Xen-devel] [PATCH] linux-2.6.18: improve floppy behavior
References: <4E9463C1020000780005ABE9@nat28.tlf.novell.com>
	<4E947961.1050604@goop.org>
In-Reply-To: <4E947961.1050604@goop.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 11.10.11 at 19:14, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
> On 10/11/2011 06:41 AM, Jan Beulich wrote:
>> Timing is significantly different from native both because Xen traps
>> I/O port accesses and since DMA use is not possible (without intrusive
>> changes). Due to the overhead of trapped port accesses, I/O is already
>> slow enough (and Xen doesn't run on very old hardware anyway), so the
>> situation can easily be improved by not enforcing REALLY_SLOW_IO.
>>
>> This doesn't completely address the issue - Xen just cannot guarantee
>> scheduling of a particular vCPU with a maximum latency of about 80us
>> (needed for the default FIFO threshold value of 10). The only complete
>> solution would require making ISA DMA usable on Xen.
>=20
> Just out of curiosity, was this in response to a real bug report or
> something?

Indeed, it was, and I was immediately able to repro the problem. Floppy
access, at least on newer kernels (it got reported against 2.6.32.x), did
at best work very sluggishly. 2.6.16.x kernels (on Xen 3.2.x) worked
fine even without the change iirc, and while I recall that I even tried
running the older kernel on newer Xen, I'm not entirely sure anymore
that the problem was really tied to the heavier I/O port access overhead
in newer Xen.

Jan


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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 03:09:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 03:09:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDvkg-0007q9-M5; Wed, 12 Oct 2011 03:09:30 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDvjc-0007dU-OG
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 03:08:25 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318414073!52847593!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8922 invoked from network); 12 Oct 2011 10:07:53 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-6.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 10:07:53 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 12 Oct 2011 11:08:16 +0100
Message-Id: <4E95832F020000780005ADB8@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 12 Oct 2011 11:08:15 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH 1 of 1] interface: BLKIF_OP_TRIM ->
	BLKIF_OP_DISCARD
References: <patchbomb.1318269010@localhost6.localdomain6>
	<d17ab29f2f9ad29a7b8a.1318269011@localhost6.localdomain6>
	<20111010195842.GB5755@phenom.oracle.com>
	<20111011182741.GA1530@phenom.oracle.com>
In-Reply-To: <20111011182741.GA1530@phenom.oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Content-Disposition: inline
Cc: Dong Yang Li <lidongyang@suse.com>, xen-devel@lists.xensource.com,
	Ian.Campbell@citrix.com, Ian.Jackson@eu.citrix.com,
	paul.durrant@citrix.com, owen.smith@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.10.11 at 20:27, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> On Mon, Oct 10, 2011 at 03:58:42PM -0400, Konrad Rzeszutek Wilk wrote:
>> On Mon, Oct 10, 2011 at 01:50:11PM -0400, Konrad Rzeszutek Wilk wrote:
> 
> Per Ian and Jan's suggestion (note, the structure is 4-byte aligned
> so we do not need to pad it):
> 
> # HG changeset patch
> # Parent 72f339bc600d7a9629d3f9eb8a279fbf8be25b12
> interface: BLKIF_OP_TRIM -> BLKIF_OP_DISCARD
> 
> The name 'trim' is specific to the ATA discard implementation.
> The name 'scsi unmap' is specific to the SCSI discard implementation.
> 
> We should really use a generic name - and the name 'discard'
> looks to be the most generic of them all. Also update the description
> to mention the other parameters that the frontend can query the
> backend for: discard-aligment, discard-granularity, and
> discard-secure. We also utilize per Jan Beulich keen suggestion,
> the 8-bit reserved field to use as a flag value. Currently the only
> flag that can be passed for a discard operation is secure delete:
> BLKIF_OP_DISCARD_FLAG_SECURE.
> 
> CC: lidongyang@novell.com 
> CC: owen.smith@citrix.com 
> CC: Pasi KÃ¤rkkÃ¤inen <pasik@iki.fi>
> CC: JBeulich@novell.com 
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> 
> diff -r 72f339bc600d xen/include/public/io/blkif.h
> --- a/xen/include/public/io/blkif.h	Mon Oct 10 11:21:51 2011 +0100
> +++ b/xen/include/public/io/blkif.h	Tue Oct 11 14:10:33 2011 -0400
> @@ -82,26 +82,47 @@
>   */
>  #define BLKIF_OP_RESERVED_1        4
>  /*
> - * Recognised only if "feature-trim" is present in backend xenbus info.
> - * The "feature-trim" node contains a boolean indicating whether trim
> - * requests are likely to succeed or fail. Either way, a trim request
> + * Recognised only if "feature-discard" is present in backend xenbus info.
> + * The "feature-discard" node contains a boolean indicating whether trim
> + * (ATA) or unmap (SCSI) - conviently called discard requests are likely
> + * to succeed or fail. Either way, a discard request
>   * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by
>   * the underlying block-device hardware. The boolean simply indicates 
> whether
> - * or not it is worthwhile for the frontend to attempt trim requests.
> - * If a backend does not recognise BLKIF_OP_TRIM, it should *not*
> - * create the "feature-trim" node!
> - * 
> - * Trim operation is a request for the underlying block device to mark
> - * extents to be erased. Trim operations are passed with sector_number as 
> the
> - * sector index to begin trim operations at and nr_sectors as the number of
> - * sectors to be trimmed. The specified sectors should be trimmed if the
> - * underlying block device supports trim operations, or a 
> BLKIF_RSP_EOPNOTSUPP
> - * should be returned. More information about trim operations at:
> + * or not it is worthwhile for the frontend to attempt discard requests.
> + * If a backend does not recognise BLKIF_OP_DISCARD, it should *not*
> + * create the "feature-discard" node!
> + *
> + * Discard operation is a request for the underlying block device to mark
> + * extents to be erased. However, discard does not guarantee that the 
> blocks
> + * will be erased from the device - it is just a hint to the device
> + * controller that these blocks are no longer in use. What the device
> + * controller does with that information is left to the controller.
> + * Discard operations are passed with sector_number as the
> + * sector index to begin discard operations at and nr_sectors as the number 
> of
> + * sectors to be discarded. The specified sectors should be discarded if 
> the
> + * underlying block device supports trim (ATA) or unmap (SCSI) operations,
> + * or a BLKIF_RSP_EOPNOTSUPP  should be returned.
> + * More information about trim/unmap operations at:
>   * http://t13.org/Documents/UploadedDocuments/docs2008/ 
>   *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
> + * http://www.seagate.com/staticfiles/support/disc/manuals/ 
> + *     Interface%20manuals/100293068c.pdf
> + * The backend can optionally provide three extra XenBus attributes to
> + * further optimize the discard functionality:
> + * 'discard-aligment' - Devices that support discard functionality may
> + * internally allocate space in units that are bigger than the exported
> + * logical block size. The discard-alignment parameter indicates how many 
> bytes
> + * the beginning of the partition is offset from the internal allocation 
> unit's
> + * natural alignment.
> + * 'discard-granularity'  - Devices that support discard functionality may
> + * internally allocate space using units that are bigger than the logical 
> block
> + * size. The discard-granularity parameter indicates the size of the 
> internal
> + * allocation unit in bytes if reported by the device. Otherwise the
> + * discard-granularity will be set to match the device's physical block 
> size.
> + * 'discard-secure' - All copies of the discarded sectors (potentially 
> created by
> + * garbage collection) must also be erased.
>   */
> -#define BLKIF_OP_TRIM              5
> -
> +#define BLKIF_OP_DISCARD           5
>  /*
>   * Maximum scatter/gather segments per request.
>   * This is carefully chosen so that sizeof(blkif_ring_t) <= PAGE_SIZE.
> @@ -134,18 +155,20 @@ struct blkif_request {
>  typedef struct blkif_request blkif_request_t;
>  
>  /*
> - * Cast to this structure when blkif_request.operation == BLKIF_OP_TRIM
> - * sizeof(struct blkif_request_trim) <= sizeof(struct blkif_request)
> + * Cast to this structure when blkif_request.operation == BLKIF_OP_DISCARD
> + * sizeof(struct blkif_request_discard) <= sizeof(struct blkif_request)
>   */
> -struct blkif_request_trim {
> -    uint8_t        operation;    /* BLKIF_OP_TRIM                        */
> -    uint8_t        reserved;     /*                                      */
> +struct blkif_request_discard {
> +    uint8_t        operation;    /* BLKIF_OP_DISCARD                     */
> +                                 /* ignored if 'discard-secure=0'        */
> +#define BLKIF_OP_DISCARD_FLAG_SECURE (1<<0)

I'd like to have the _OP in here dropped - BLKIF_OP_* should be
"reserved" to express actual operations.

With that change,
Acked-by: Jan Beulich <jbeulich@suse.com>

(I'd also consider the _FLAG part to be sort of redundant.)

Jan

> +    uint8_t        flag;         /* BLKIF_OP_DISCARD_FLAG_SECURE or 0    */
>      blkif_vdev_t   handle;       /* same as for read/write requests      */
>      uint64_t       id;           /* private guest value, echoed in resp  */
>      blkif_sector_t sector_number;/* start sector idx on disk             */
>      uint64_t       nr_sectors;   /* number of contiguous sectors to trim */
>  };
> -typedef struct blkif_request_trim blkif_request_trim_t;
> +typedef struct blkif_request_discard blkif_request_discard_t;
>  
>  struct blkif_response {
>      uint64_t        id;              /* copied from request */



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 03:13:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 03:13:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDvod-0008HW-Bw; Wed, 12 Oct 2011 03:13:35 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDvo1-00084W-05
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 03:12:57 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318414373!34956483!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11978 invoked from network); 12 Oct 2011 10:12:53 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2011 10:12:53 -0000
X-IronPort-AV: E=Sophos;i="4.69,333,1315180800"; 
   d="scan'208";a="8343950"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 10:12:53 +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, 12 Oct 2011 11:12:53 +0100
Subject: Re: [Xen-devel] Front-end back-end connection
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
Date: Wed, 12 Oct 2011 11:12:52 +0100
In-Reply-To: <CAP2B85-UdKBazkis6Ga1QSX=PLfuk_LMLwh1RnQ2oMsi10wvHQ@mail.gmail.com>
References: <CAP2B85-UdKBazkis6Ga1QSX=PLfuk_LMLwh1RnQ2oMsi10wvHQ@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: <1318414373.21903.637.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 Wed, 2011-10-12 at 08:13 +0100, Daniel Castro wrote:
> Hello All,
> 
> I am in the process of conecting my front-end to my back end.
> The process is like this:
> 1. Set up xenstore conection
> 2. initiate front rings
> 3. Initiate gran table
> 4. Take my rings mfn address and set it up as a entry (more on this)
> 5. create a unbound port for front-back ring communication (more on this )
> 5.1 I start by changing state to XenbusStateInitialising
> 5.2 ring-ref entry (step 4)
> 5.3 port entry (step 5)
> 5.4 backend state is XenbusStateInitWait
> 5.4 change state to XenbusStateInitialised
> 5.5 back end state is XenbusStateClosing meaning there is an error or
> something is missing.
> 6. on sucess end
> 
> More on step 4: I got my grant page table like this:
> 	struct gnttab_setup_table gst;
> 	grant_entries = (struct grant_entry_v1 *) memalign_high(4096, 4096);
> //asume malloc
> 	memset(grant_entries,0,4096);
> 	gst.dom = DOMID_SELF; //&me
> 	gst.nr_frames = 1; //a single page
> 	//gst.frame_list = grant_entries; (I have no idea how to handle this :P )
> 	res = hypercall_grant_table_op(GNTTABOP_map_grant_ref, &gst, 1);
> I think this works, but maybe I am wrong.

I'm afraid you are.

For one thing simply not initialising one of the fields in the argument
structure is unlikely to be correct.

Secondly the argument to GNTTABOP_map_grant_ref is a pointer to "struct
gnttab_map_grant_ref" not "struct gnttab_setup_table", likewise "struct
gnttab_setup_table" goes with GNTTABOP_setup_table. I think this should
be pretty clear from the way the GNTTABOP_* and struct definitions are
laid out in xen/include/public/grant_table.h and the naming convention
what goes with what. There are also comments in that header describing
each operation.

If you are trying to setup the grant table itself then
GNTTABOP_setup_table is what you want. GNTTABOP_map_grant_ref is used
for mapping a grant reference which you have been given by another
domain.

drivers/xen/grant-table.c:gnttab_map should provide a rough idea how
this needs to be done. Because this is an HVM domain you need to do a
XENMEM_add_to_physmap of XENMAPSPACE_grant_table before you do the
GNTTABOP_setup_table.

>  This is needed on step 5, so..
> More on step 5:
> I consider the grant table an array of type struct grant_entry_v1.
> So I simply do grant_entry_v1[0] for my first grant entry, and so
> forth. For this case I read on the list some time ago that entry 0 did
> not work, so I work with entry 1, like this:
> grant_entries[aval_grant].domid = ext_domid;
> grant_entries[aval_grant].frame = _frame; where frame is: (u32)sring
> >> PAGE_SHIFT //meaning mfn of my rings.
> grant_entries[aval_grant].flags = GTF_permit_access;

This looks approximately correct _if_ you were actually writing to some
memory which was your grant table but due to the above I think you are
not.

> These last two steps I described may be wrong... I know this because
> the backend state is not XenbusStateConnected.

That fact alone can't tell you much other than _something_ went wrong.

Since the backend will have transitioned to XenbusStateClosing by
calling xenbus_dev_fatal() it will have written some error information
to xenstore and the dom0 console which should hint at what actually went
wrong. I expect you will see the message "mapping ring-ref %lu port %u"
because xen_blkif_map will have failed during map_frontend_page().

> I think my mistake is on step 5, so can someone please shed some light
> on this small issue.
> 
> And thank you very much for taking the time to read.
> 
> Daniel
> 



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 03:19:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 03:19:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDvuF-0000Hm-0N; Wed, 12 Oct 2011 03:19:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDvtR-00004r-Qc
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 03:18:34 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318414696!43899079!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17033 invoked from network); 12 Oct 2011 10:18:16 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 10:18:16 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 12 Oct 2011 11:18:30 +0100
Message-Id: <4E958594020000780005ADCB@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 12 Oct 2011 11:18:28 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Re: [PATCH 2/3] xen/blkback: Fix the
	inhibition to map pages when discarding sector ranges.
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-3-git-send-email-konrad.wilk@oracle.com>
	<4E940B99020000780005AA12@victor.provo.novell.com>
	<CAKH3R4-HJZBE-yWk=Dwkuwy13z1vdUrgEoJ9zFhTJgXgYfHHfA@mail.gmail.com>
	<20111011183909.GA2357@phenom.oracle.com>
	<20111011205035.GA22668@phenom.oracle.com>
In-Reply-To: <20111011205035.GA22668@phenom.oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: hch@infradead.org, Dong Yang Li <lidongyang@suse.com>,
	xen-devel@lists.xensource.com, linux-kernel@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 11.10.11 at 22:50, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> =
wrote:
> On Tue, Oct 11, 2011 at 02:39:09PM -0400, Konrad Rzeszutek Wilk wrote:
>> On Tue, Oct 11, 2011 at 03:33:11PM +0800, Li Dongyang wrote:
>> > On Tue, Oct 11, 2011 at 3:25 PM, Jan Beulich <JBeulich@suse.com> =
wrote:
>> > >>>> On 10.10.11 at 17:28, Konrad Rzeszutek Wilk <konrad.wilk@oracle.c=
om> wrote:
>> > >> The 'operation' parameters are the ones provided to the bio layer =
while
>> > >> the req->operation are the ones passed in between the backend and
>> > >> frontend. We used the wrong 'operation' value to squash the
>> > >> call to map pages when processing the discard operation resulting
>> > >> in mapping the pages unnecessarily.
>> > >>
>> > >> CC: Li Dongyang <lidongyang@novell.com>
>> > >> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>> > >> ---
>> > >>  drivers/block/xen-blkback/blkback.c |    2 +-
>> > >>  1 files changed, 1 insertions(+), 1 deletions(-)
>> > >>
>> > >> diff --git a/drivers/block/xen-blkback/blkback.c
>> > >> b/drivers/block/xen-blkback/blkback.c
>> > >> index 184b133..3da9a40 100644
>> > >> --- a/drivers/block/xen-blkback/blkback.c
>> > >> +++ b/drivers/block/xen-blkback/blkback.c
>> > >> @@ -707,7 +707,7 @@ static int dispatch_rw_block_io(struct =
xen_blkif=20
> *blkif,
>> > >>        * the hypercall to unmap the grants - that is all done in
>> > >>        * xen_blkbk_unmap.
>> > >>        */
>> > >> -     if (operation !=3D BLKIF_OP_DISCARD &&
>> > >> +     if (operation !=3D REQ_DISCARD &&
>> > >
>> > > Why is that check necessary in the first place? xen_blkbk_map() =
doesn't
>> > > do any harm when req->nr_segments is zero (as could also be the =
case
>> > > on WRITE_FLUSH ones).
>> > >
>> > Ah, you are right, we could remove this check then, Thanks
>>=20
>> Except that req->nr_segments for blkif__request_discard is actually
>> the reserved field.
>>=20
>> See:
>>=20
>> struct blkif_request {
>>     uint8_t        operation;    /* BLKIF_OP_???                        =
 */
>>     uint8_t        nr_segments;  /* number of segments                  =
 */
>>     blkif_vdev_t   handle;       /* only for read/write requests        =
 */
>> .. snip..
>>=20
>> and:
>> struct blkif_request_discard {
>>     uint8_t        operation;    /* BLKIF_OP_DISCARD                    =
 */
>>                                  /* ignored if 'discard-secure=3D0'     =
   */
>> #define BLKIF_OP_DISCARD_FLAG_SECURE (1<<0)
>>     uint8_t        flag;         /* BLKIF_OP_DISCARD_FLAG_SECURE or 0   =
 */
>>     blkif_vdev_t   handle;       /* same as for read/write requests     =
 */
>>=20
>> which will throw off the logic for nr_segments all wrong since for some
>> discard operations it would read the nr_segments as 1.
>>=20
>> So we do need some logic in there to work with this.
>=20
>=20
> So a patch like this (and there is another on top that moves the setting
> of nseg) should do it.

With that later patch, you should then probably also check that none
of the so far unassigned bits in u1.flag are being set.

Jan

> commit 12679b29b2f828454f833e17e9090ed576c63afc
> Author: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> Date:   Mon Oct 10 00:47:49 2011 -0400
>=20
>     xen/blkback: Fix the inhibition to map pages when discarding =
sector=20
> ranges.
>    =20
>     The 'operation' parameters are the ones provided to the bio layer =
while
>     the req->operation are the ones passed in between the backend and
>     frontend. We used the wrong 'operation' value to squash the
>     call to map pages when processing the discard operation resulting
>     in an hypercall that did nothing. Lets guard against going in the
>     mapping function by checking for the amount of segments.
>    =20
>     CC: Li Dongyang <lidongyang@novell.com>
>     Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
>=20
> diff --git a/drivers/block/xen-blkback/blkback.c=20
> b/drivers/block/xen-blkback/blkback.c
> index c15c559..94e659d 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -707,8 +707,7 @@ static int dispatch_rw_block_io(struct xen_blkif =
*blkif,
>  	 * the hypercall to unmap the grants - that is all done in
>  	 * xen_blkbk_unmap.
>  	 */
> -	if (operation !=3D BLKIF_OP_DISCARD &&
> -			xen_blkbk_map(req, pending_req, seg))
> +	if (nseg && xen_blkbk_map(req, pending_req, seg))
>  		goto fail_flush;
> =20
>  	/*



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 03:31:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 03:31:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDw5t-0000qA-E8; Wed, 12 Oct 2011 03:31:25 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDw4z-0000d8-BF
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 03:30:29 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1318415426!20150036!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4944 invoked from network); 12 Oct 2011 10:30:26 -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;
	12 Oct 2011 10:30:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,333,1315180800"; 
   d="scan'208";a="8344372"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 10:30:25 +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, 12 Oct 2011 11:30:25 +0100
Subject: Re: [Xen-devel] Re: [PATCH 2/3] xen/blkback: Fix the inhibition to
	map pages when discarding sector ranges.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Wed, 12 Oct 2011 11:30:25 +0100
In-Reply-To: <20111011205035.GA22668@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-3-git-send-email-konrad.wilk@oracle.com>
	<4E940B99020000780005AA12@victor.provo.novell.com>
	<CAKH3R4-HJZBE-yWk=Dwkuwy13z1vdUrgEoJ9zFhTJgXgYfHHfA@mail.gmail.com>
	<20111011183909.GA2357@phenom.oracle.com>
	<20111011205035.GA22668@phenom.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: <1318415425.21903.652.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	Li Dongyang <lidongyang@novell.com>,
	"hch@infradead.org" <hch@infradead.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 Tue, 2011-10-11 at 21:50 +0100, Konrad Rzeszutek Wilk wrote:
> On Tue, Oct 11, 2011 at 02:39:09PM -0400, Konrad Rzeszutek Wilk wrote:
> > On Tue, Oct 11, 2011 at 03:33:11PM +0800, Li Dongyang wrote:
> > > On Tue, Oct 11, 2011 at 3:25 PM, Jan Beulich <JBeulich@suse.com> wrote:
> > > >>>> On 10.10.11 at 17:28, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> > > >> The 'operation' parameters are the ones provided to the bio layer while
> > > >> the req->operation are the ones passed in between the backend and
> > > >> frontend. We used the wrong 'operation' value to squash the
> > > >> call to map pages when processing the discard operation resulting
> > > >> in mapping the pages unnecessarily.
> > > >>
> > > >> CC: Li Dongyang <lidongyang@novell.com>
> > > >> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > > >> ---
> > > >>  drivers/block/xen-blkback/blkback.c |    2 +-
> > > >>  1 files changed, 1 insertions(+), 1 deletions(-)
> > > >>
> > > >> diff --git a/drivers/block/xen-blkback/blkback.c
> > > >> b/drivers/block/xen-blkback/blkback.c
> > > >> index 184b133..3da9a40 100644
> > > >> --- a/drivers/block/xen-blkback/blkback.c
> > > >> +++ b/drivers/block/xen-blkback/blkback.c
> > > >> @@ -707,7 +707,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
> > > >>        * the hypercall to unmap the grants - that is all done in
> > > >>        * xen_blkbk_unmap.
> > > >>        */
> > > >> -     if (operation != BLKIF_OP_DISCARD &&
> > > >> +     if (operation != REQ_DISCARD &&
> > > >
> > > > Why is that check necessary in the first place? xen_blkbk_map() doesn't
> > > > do any harm when req->nr_segments is zero (as could also be the case
> > > > on WRITE_FLUSH ones).
> > > >
> > > Ah, you are right, we could remove this check then, Thanks
> > 
> > Except that req->nr_segments for blkif__request_discard is actually
> > the reserved field.

Either this field is nr_segments for op==DISCARD or it is not.

If it is then it should be named nr_segments and treated as such.

If it is not then it is a bug for anything to look at those bits in
memory and treat them as nr_segments.

There was a patch (from Own Smith) at one point to use a union in the
blkif request data type, would doing that help to make it clear which
fields overlap and which do not?

> > See:
> > 
> > struct blkif_request {
> >     uint8_t        operation;    /* BLKIF_OP_???                         */
> >     uint8_t        nr_segments;  /* number of segments                   */
> >     blkif_vdev_t   handle;       /* only for read/write requests         */
> > .. snip..
> > 
> > and:
> > struct blkif_request_discard {
> >     uint8_t        operation;    /* BLKIF_OP_DISCARD                     */
> >                                  /* ignored if 'discard-secure=0'        */
> > #define BLKIF_OP_DISCARD_FLAG_SECURE (1<<0)
> >     uint8_t        flag;         /* BLKIF_OP_DISCARD_FLAG_SECURE or 0    */
> >     blkif_vdev_t   handle;       /* same as for read/write requests      */
> > 
> > which will throw off the logic for nr_segments all wrong since for some
> > discard operations it would read the nr_segments as 1.

> > 
> > So we do need some logic in there to work with this.
> 
> 
> So a patch like this (and there is another on top that moves the setting
> of nseg) should do it.
> 
> 
> commit 12679b29b2f828454f833e17e9090ed576c63afc
> Author: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> Date:   Mon Oct 10 00:47:49 2011 -0400
> 
>     xen/blkback: Fix the inhibition to map pages when discarding sector ranges.
>     
>     The 'operation' parameters are the ones provided to the bio layer while
>     the req->operation are the ones passed in between the backend and
>     frontend. We used the wrong 'operation' value to squash the
>     call to map pages when processing the discard operation resulting
>     in an hypercall that did nothing. Lets guard against going in the
>     mapping function by checking for the amount of segments.
>     
>     CC: Li Dongyang <lidongyang@novell.com>
>     Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> 
> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> index c15c559..94e659d 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -707,8 +707,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
>  	 * the hypercall to unmap the grants - that is all done in
>  	 * xen_blkbk_unmap.
>  	 */
> -	if (operation != BLKIF_OP_DISCARD &&
> -			xen_blkbk_map(req, pending_req, seg))
> +	if (nseg && xen_blkbk_map(req, pending_req, seg))

nseg == reg->nr_segments, so as above either referencing nseg when
operation == BLKIF_OP_DISCARD is a bug or the field is badly named.

Ian.

>  		goto fail_flush;
>  
>  	/*
> 
> _______________________________________________
> 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 Oct 12 03:41:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 03:41:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDwFE-0001Ov-Q5; Wed, 12 Oct 2011 03:41:04 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDwEK-0001Ak-VC
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 03:40:09 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1318416005!680010!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17810 invoked from network); 12 Oct 2011 10:40:05 -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;
	12 Oct 2011 10:40:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,333,1315180800"; 
   d="scan'208";a="8344601"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 10:40: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, 12 Oct 2011 11:40:04 +0100
Subject: Re: [Xen-devel] [PATCH 1 of 1] interface: BLKIF_OP_TRIM ->
	BLKIF_OP_DISCARD
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Wed, 12 Oct 2011 11:40:04 +0100
In-Reply-To: <20111011182741.GA1530@phenom.oracle.com>
References: <patchbomb.1318269010@localhost6.localdomain6>
	<d17ab29f2f9ad29a7b8a.1318269011@localhost6.localdomain6>
	<20111010195842.GB5755@phenom.oracle.com>
	<20111011182741.GA1530@phenom.oracle.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1318416004.21903.659.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Owen Smith <owen.smith@citrix.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>,
	Paul Durrant <Paul.Durrant@citrix.com>,
	"JBeulich@novell.com" <JBeulich@novell.com>,
	"lidongyang@novell.com" <lidongyang@novell.com>,
	"JBeulich@suse.com" <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 Tue, 2011-10-11 at 19:27 +0100, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 10, 2011 at 03:58:42PM -0400, Konrad Rzeszutek Wilk wrote:
> > On Mon, Oct 10, 2011 at 01:50:11PM -0400, Konrad Rzeszutek Wilk wrote:
> 
> Per Ian and Jan's suggestion (note, the structure is 4-byte aligned
> so we do not need to pad it):
> 
> # HG changeset patch
> # Parent 72f339bc600d7a9629d3f9eb8a279fbf8be25b12
> interface: BLKIF_OP_TRIM -> BLKIF_OP_DISCARD
> 
> The name 'trim' is specific to the ATA discard implementation.
> The name 'scsi unmap' is specific to the SCSI discard implementation.
> 
> We should really use a generic name - and the name 'discard'
> looks to be the most generic of them all. Also update the description
> to mention the other parameters that the frontend can query the
> backend for: discard-aligment, discard-granularity, and
> discard-secure. We also utilize per Jan Beulich keen suggestion,
> the 8-bit reserved field to use as a flag value. Currently the only
> flag that can be passed for a discard operation is secure delete:
> BLKIF_OP_DISCARD_FLAG_SECURE.

This change seems to be conflating a large rename with new data fields,
changes to the documentation in the comments and other bits and bobs,
which makes it pretty hard to review it's actual impact. Can we get them
separately?

Ian.

> 
> CC: lidongyang@novell.com
> CC: owen.smith@citrix.com
> CC: Pasi KÃ¤rkkÃ¤inen <pasik@iki.fi>
> CC: JBeulich@novell.com
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> 
> diff -r 72f339bc600d xen/include/public/io/blkif.h
> --- a/xen/include/public/io/blkif.h	Mon Oct 10 11:21:51 2011 +0100
> +++ b/xen/include/public/io/blkif.h	Tue Oct 11 14:10:33 2011 -0400
> @@ -82,26 +82,47 @@
>   */
>  #define BLKIF_OP_RESERVED_1        4
>  /*
> - * Recognised only if "feature-trim" is present in backend xenbus info.
> - * The "feature-trim" node contains a boolean indicating whether trim
> - * requests are likely to succeed or fail. Either way, a trim request
> + * Recognised only if "feature-discard" is present in backend xenbus info.
> + * The "feature-discard" node contains a boolean indicating whether trim
> + * (ATA) or unmap (SCSI) - conviently called discard requests are likely
> + * to succeed or fail. Either way, a discard request
>   * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by
>   * the underlying block-device hardware. The boolean simply indicates whether
> - * or not it is worthwhile for the frontend to attempt trim requests.
> - * If a backend does not recognise BLKIF_OP_TRIM, it should *not*
> - * create the "feature-trim" node!
> - * 
> - * Trim operation is a request for the underlying block device to mark
> - * extents to be erased. Trim operations are passed with sector_number as the
> - * sector index to begin trim operations at and nr_sectors as the number of
> - * sectors to be trimmed. The specified sectors should be trimmed if the
> - * underlying block device supports trim operations, or a BLKIF_RSP_EOPNOTSUPP
> - * should be returned. More information about trim operations at:
> + * or not it is worthwhile for the frontend to attempt discard requests.
> + * If a backend does not recognise BLKIF_OP_DISCARD, it should *not*
> + * create the "feature-discard" node!
> + *
> + * Discard operation is a request for the underlying block device to mark
> + * extents to be erased. However, discard does not guarantee that the blocks
> + * will be erased from the device - it is just a hint to the device
> + * controller that these blocks are no longer in use. What the device
> + * controller does with that information is left to the controller.
> + * Discard operations are passed with sector_number as the
> + * sector index to begin discard operations at and nr_sectors as the number of
> + * sectors to be discarded. The specified sectors should be discarded if the
> + * underlying block device supports trim (ATA) or unmap (SCSI) operations,
> + * or a BLKIF_RSP_EOPNOTSUPP  should be returned.
> + * More information about trim/unmap operations at:
>   * http://t13.org/Documents/UploadedDocuments/docs2008/
>   *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
> + * http://www.seagate.com/staticfiles/support/disc/manuals/
> + *     Interface%20manuals/100293068c.pdf
> + * The backend can optionally provide three extra XenBus attributes to
> + * further optimize the discard functionality:
> + * 'discard-aligment' - Devices that support discard functionality may
> + * internally allocate space in units that are bigger than the exported
> + * logical block size. The discard-alignment parameter indicates how many bytes
> + * the beginning of the partition is offset from the internal allocation unit's
> + * natural alignment.
> + * 'discard-granularity'  - Devices that support discard functionality may
> + * internally allocate space using units that are bigger than the logical block
> + * size. The discard-granularity parameter indicates the size of the internal
> + * allocation unit in bytes if reported by the device. Otherwise the
> + * discard-granularity will be set to match the device's physical block size.
> + * 'discard-secure' - All copies of the discarded sectors (potentially created by
> + * garbage collection) must also be erased.
>   */
> -#define BLKIF_OP_TRIM              5
> -
> +#define BLKIF_OP_DISCARD           5
>  /*
>   * Maximum scatter/gather segments per request.
>   * This is carefully chosen so that sizeof(blkif_ring_t) <= PAGE_SIZE.
> @@ -134,18 +155,20 @@ struct blkif_request {
>  typedef struct blkif_request blkif_request_t;
>  
>  /*
> - * Cast to this structure when blkif_request.operation == BLKIF_OP_TRIM
> - * sizeof(struct blkif_request_trim) <= sizeof(struct blkif_request)
> + * Cast to this structure when blkif_request.operation == BLKIF_OP_DISCARD
> + * sizeof(struct blkif_request_discard) <= sizeof(struct blkif_request)
>   */
> -struct blkif_request_trim {
> -    uint8_t        operation;    /* BLKIF_OP_TRIM                        */
> -    uint8_t        reserved;     /*                                      */
> +struct blkif_request_discard {
> +    uint8_t        operation;    /* BLKIF_OP_DISCARD                     */
> +                                 /* ignored if 'discard-secure=0'        */
> +#define BLKIF_OP_DISCARD_FLAG_SECURE (1<<0)
> +    uint8_t        flag;         /* BLKIF_OP_DISCARD_FLAG_SECURE or 0    */
>      blkif_vdev_t   handle;       /* same as for read/write requests      */
>      uint64_t       id;           /* private guest value, echoed in resp  */
>      blkif_sector_t sector_number;/* start sector idx on disk             */
>      uint64_t       nr_sectors;   /* number of contiguous sectors to trim */
>  };
> -typedef struct blkif_request_trim blkif_request_trim_t;
> +typedef struct blkif_request_discard blkif_request_discard_t;
>  
>  struct blkif_response {
>      uint64_t        id;              /* copied from request */



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 03:54:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 03:54:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDwSe-0002qx-0h; Wed, 12 Oct 2011 03:54:56 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDwRp-0002ex-Rl
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 03:54:06 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318416842!34966739!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13174 invoked from network); 12 Oct 2011 10:54:02 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2011 10:54:02 -0000
X-IronPort-AV: E=Sophos;i="4.69,333,1315180800"; 
   d="scan'208";a="8344943"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 10:54: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;
	Wed, 12 Oct 2011 11:54:02 +0100
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Wed, 12 Oct 2011 11:54:02 +0100
In-Reply-To: <20111011205729.GB22668@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
	<4E940E21020000780005AA29@nat28.tlf.novell.com>
	<20111011155133.GC29349@phenom.oracle.com>
	<20111011205729.GB22668@phenom.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: <1318416842.21903.674.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "hch@infradead.org" <hch@infradead.org>, Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.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 Tue, 2011-10-11 at 21:57 +0100, Konrad Rzeszutek Wilk wrote:
> > My later response to it should include it:
> > http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00652.html
> >
> > >
> > > Further I wonder why you don't use the "reserved" field instead of
> > > extending the structure at the end.
> >
> > <blinks> I completly missed it. That would definitly work as well.
> >
> > Let me redo it with that in mind.
> 
> I've posted the Xen hypervisor ABI one that thread above. The implementation
> of that looks as follow:

Ian.

> 
> commit ae33f998d66c5982af533bda25c2b6c4f863789f
> Author: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> Date:   Mon Oct 10 10:58:40 2011 -0400
> 
>     xen/blk[front|back]: Enhance discard support with secure erasing support.
> 
>     Part of the blkdev_issue_discard(xx) operation is that it can also
>     issue a secure discard operation that will permanantly remove the
>     sectors in question. We advertise that we can support that via the
>     'discard-secure' attribute and on the request, if the 'secure' bit
>     is set, we will attempt to pass in REQ_DISCARD | REQ_SECURE.
> 
>     CC: Li Dongyang <lidongyang@novell.com>
>     [v1: Used 'flag' instead of 'secure:1' bit]
>     [v2: Use 'reserved 'uint8_t' as a flag]
>     Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> 
> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> index 94e659d..4f33c13 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -362,7 +362,7 @@ static int xen_blkbk_map(struct blkif_request *req,
>  {
>         struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST];
>         int i;
> -       int nseg = req->nr_segments;
> +       int nseg = req->u1.nr_segments;
>         int ret = 0;
> 
>         /*
> @@ -422,13 +422,16 @@ 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)
> +       if (blkif->blk_backend_type == BLKIF_BACKEND_PHY) {
> +               unsigned long secure = (blkif->vbd.discard_secure &&
> +                       (req->u1.flag & BLKIF_OP_DISCARD_FLAG_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, 0);
> -       else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
> +                               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;
> @@ -618,6 +621,9 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
>         struct blk_plug plug;
>         bool drain = false;
> 
> +       /* Check that the number of segments is sane. */
> +       nseg = req->u1.nr_segments;

This field is invalid (at least with these semantics) if req->operation
== BLKIF_OP_DISCARD so reading it here and clearing it later when you
decide it is invalid is just confusing. Why not read it inside the
switch iff it is valid?

> +
>         switch (req->operation) {
>         case BLKIF_OP_READ:
>                 blkif->st_rd_req++;
> @@ -636,6 +642,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
>         case BLKIF_OP_DISCARD:
>                 blkif->st_ds_req++;
>                 operation = REQ_DISCARD;
> +               nseg = 0; /* The nr_segments and flag share the same space. */
>                 break;
>         default:
>                 operation = 0; /* make gcc happy */
> @@ -643,8 +650,6 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
>                 break;
>         }
> 
> -       /* Check that the number of segments is sane. */
> -       nseg = req->nr_segments;
>         if (unlikely(nseg == 0 && operation != WRITE_FLUSH &&
>                                 operation != REQ_DISCARD) ||
>             unlikely(nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST)) {
> diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
> index e638457..c6a5462 100644
> --- a/drivers/block/xen-blkback/common.h
> +++ b/drivers/block/xen-blkback/common.h
> @@ -76,7 +76,10 @@ struct blkif_x86_32_request_discard {
> 
>  struct blkif_x86_32_request {
>         uint8_t        operation;    /* BLKIF_OP_???                         */
> -       uint8_t        nr_segments;  /* number of segments                   */
> +       union {
> +               uint8_t nr_segments; /* number of segments                   */
> +               uint8_t flag;        /* flag for blkif_x86_32_request_discard*/
> +       } u1;

this is a bit of a mess, it sucks that common fields and per-operation
ones are all mixed up like this, but 
	union {
		struct {
			nr_segments;
		} rw;
		struct {
			flags;
		} discard;
	} u
would at least make it more obvious what was what in the code
dereferencing these fields.

Having seen the confusion which arises from reusing this reserved field
I'm not convinced that it is worthwhile. If we don't do that then we can
have a more sane layout which makes it more explicit what is what:

struct blkif_request {
    uint8_t        operation;    /* BLKIF_OP_???                         */
    uint8_t        nr_segments;  /* number of segments                   */
    blkif_vdev_t   handle;       /* only for read/write requests         */
    uint64_t       id;           /* private guest value, echoed in resp  */
    union {
	struct {
	    blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
	    struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
	} rw;
	struct {
	    whatever;
	    flags;
	} discard;
	struct {

	    somethign else
        } anotherop;
    } u;
};

handle isn't really only r/w, is it? If it is then I think we should
just repeat the id fields within the union and pad so the offset is
correct:

struct blkif_request {
    uint8_t        operation;    /* BLKIF_OP_???                         */
    union {
	struct {
	    uint8_t        nr_segments;  /* number of segments                   */
	    blkif_vdev_t   handle;
	    uint64_t       id;           /* private guest value, echoed in resp  */
	    blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
	    struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
	} rw;
	struct {
	    uint8_t        flags;
	    blkif_vdev_t   __pad;       /* was "handle: only for read/write requests */
	    uint64_t       id;           /* private guest value, echoed in resp  */
	} discard;
	struct {
	    somethign else;
            padding
            id;
        } anotherop;
    } u;
};

it's lame but it avoid relying on "only for op xx, yy" type comments to
get things right.



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 05:04:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 05:04:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDxXZ-0008Dz-Fz; Wed, 12 Oct 2011 05:04:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDxWS-0007wU-VE
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 05:02:57 -0700
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1318420972!28927193!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7444 invoked from network); 12 Oct 2011 12:02:53 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2011 12:02:53 -0000
Received: by gyg13 with SMTP id 13so230174gyg.30
	for <xen-devel@lists.xensource.com>;
	Wed, 12 Oct 2011 05:02:52 -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:content-transfer-encoding;
	bh=bIuoG9biWWZUud9W/WhRInY5AQ5hRN1Q6/xk04oUTEc=;
	b=kGpKFRUFZ9GTZ7SJZ1J10F0PO+2uw5N9mUEUNKqpGqHdpkImAzY+0PoY2PQmxFRr3/
	E4DUkrqkKGINNoX+9NToTqr5UXne2JJ8Zm0mWH732NO0xk5CeLK87S1W933JqbR1CJtQ
	B0udbq8AV0SEvS7bZrlSkIB5F0G+cqNbC+plY=
MIME-Version: 1.0
Received: by 10.223.60.73 with SMTP id o9mr28810866fah.18.1318420971956; Wed,
	12 Oct 2011 05:02:51 -0700 (PDT)
Received: by 10.223.72.205 with HTTP; Wed, 12 Oct 2011 05:02:51 -0700 (PDT)
In-Reply-To: <1318414373.21903.637.camel@zakaz.uk.xensource.com>
References: <CAP2B85-UdKBazkis6Ga1QSX=PLfuk_LMLwh1RnQ2oMsi10wvHQ@mail.gmail.com>
	<1318414373.21903.637.camel@zakaz.uk.xensource.com>
Date: Wed, 12 Oct 2011 21:02:51 +0900
Message-ID: <CAP2B85_zhnY9DVmD3fWE7j2XkHgd8eKiryr8GSLLo8Bm8UHuTw@mail.gmail.com>
Subject: Re: [Xen-devel] Front-end back-end connection
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 Wed, Oct 12, 2011 at 7:12 PM, Ian Campbell <Ian.Campbell@citrix.com> wro=
te:
> On Wed, 2011-10-12 at 08:13 +0100, Daniel Castro wrote:
>> Hello All,
>>
>> I am in the process of conecting my front-end to my back end.
>> The process is like this:
>> 1. Set up xenstore conection
>> 2. initiate front rings
>> 3. Initiate gran table
>> 4. Take my rings mfn address and set it up as a entry (more on this)
>> 5. create a unbound port for front-back ring communication (more on this=
 )
>> 5.1 I start by changing state to XenbusStateInitialising
>> 5.2 ring-ref entry (step 4)
>> 5.3 port entry (step 5)
>> 5.4 backend state is XenbusStateInitWait
>> 5.4 change state to XenbusStateInitialised
>> 5.5 back end state is XenbusStateClosing meaning there is an error or
>> something is missing.
>> 6. on sucess end
>>
>> More on step 4: I got my grant page table like this:
>> =A0 =A0 =A0 struct gnttab_setup_table gst;
>> =A0 =A0 =A0 grant_entries =3D (struct grant_entry_v1 *) memalign_high(40=
96, 4096);
>> //asume malloc
>> =A0 =A0 =A0 memset(grant_entries,0,4096);
>> =A0 =A0 =A0 gst.dom =3D DOMID_SELF; //&me
>> =A0 =A0 =A0 gst.nr_frames =3D 1; //a single page
>> =A0 =A0 =A0 //gst.frame_list =3D grant_entries; (I have no idea how to h=
andle this :P )
>> =A0 =A0 =A0 res =3D hypercall_grant_table_op(GNTTABOP_map_grant_ref, &gs=
t, 1);
>> I think this works, but maybe I am wrong.
>
> I'm afraid you are.
>
> For one thing simply not initialising one of the fields in the argument
> structure is unlikely to be correct.
>
> Secondly the argument to GNTTABOP_map_grant_ref is a pointer to "struct
> gnttab_map_grant_ref" not "struct gnttab_setup_table", likewise "struct
> gnttab_setup_table" goes with GNTTABOP_setup_table. I think this should
> be pretty clear from the way the GNTTABOP_* and struct definitions are
> laid out in xen/include/public/grant_table.h and the naming convention
> what goes with what. There are also comments in that header describing
> each operation.
>
> If you are trying to setup the grant table itself then
> GNTTABOP_setup_table is what you want. GNTTABOP_map_grant_ref is used
> for mapping a grant reference which you have been given by another
> domain.
>
> drivers/xen/grant-table.c:gnttab_map should provide a rough idea how
> this needs to be done. Because this is an HVM domain you need to do a
> XENMEM_add_to_physmap of XENMAPSPACE_grant_table before you do the
> GNTTABOP_setup_table.

Fixed. Yet, how can I confirm that the grant table was correctly
mapped? The hypercall returned 0 and the status in the struct is also
0.
After the mapping I am printing this:
allocated grant_entries at 12 bytes at 0x0f7fc000, gpfn 0xf7fc
GNTTABOP_setup_table return 0 status:0
allocated shared info 2584 bytes at 0x0f7fa000, gpfn 0xf7fa

I also found that the port I get from the EVTCHNOP_alloc_unbound is 4,
but lsevtchn gets me this:
  42: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 2
  43: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 3
  44: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 1
Port 4 is not listed, is it because it is not connected yet?

I get no errors in xl dmesg, and in dmesg I get:
vbd vbd-5-768: 2 reading /local/domain/5/device/vbd/768/ring-ref and
event-channel
I guess there are the keys I write in the front-end, so they are being read=
.

Thanks for the help, I feel we are getting closer to the other side...

Daniel

>
>> =A0This is needed on step 5, so..
>> More on step 5:
>> I consider the grant table an array of type struct grant_entry_v1.
>> So I simply do grant_entry_v1[0] for my first grant entry, and so
>> forth. For this case I read on the list some time ago that entry 0 did
>> not work, so I work with entry 1, like this:
>> grant_entries[aval_grant].domid =3D ext_domid;
>> grant_entries[aval_grant].frame =3D _frame; where frame is: (u32)sring
>> >> PAGE_SHIFT //meaning mfn of my rings.
>> grant_entries[aval_grant].flags =3D GTF_permit_access;
>
> This looks approximately correct _if_ you were actually writing to some
> memory which was your grant table but due to the above I think you are
> not.
>
>> These last two steps I described may be wrong... I know this because
>> the backend state is not XenbusStateConnected.
>
> That fact alone can't tell you much other than _something_ went wrong.
>
> Since the backend will have transitioned to XenbusStateClosing by
> calling xenbus_dev_fatal() it will have written some error information
> to xenstore and the dom0 console which should hint at what actually went
> wrong. I expect you will see the message "mapping ring-ref %lu port %u"
> because xen_blkif_map will have failed during map_frontend_page().
>
>> I think my mistake is on step 5, so can someone please shed some light
>> on this small issue.
>>
>> And thank you very much for taking the time to read.
>>
>> 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 Oct 12 06:48:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 06:48:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDzAS-0003Xb-VV; Wed, 12 Oct 2011 06:48:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDz9f-0003L6-O8
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 06:47:32 -0700
X-Env-Sender: ml-xen-devel@hfp.de
X-Msg-Ref: server-16.tower-216.messagelabs.com!1318427238!709298!1
X-Originating-IP: [88.205.101.6]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30411 invoked from network); 12 Oct 2011 13:47:18 -0000
Received: from rootsrv.hfp.de (HELO rootsrv.hfp.de) (88.205.101.6)
	by server-16.tower-216.messagelabs.com with SMTP;
	12 Oct 2011 13:47:18 -0000
Received: from localhost (localhost [127.0.0.1])
	by rootsrv.hfp.de (Postfix) with ESMTP id 142011A9A21;
	Wed, 12 Oct 2011 15:47:17 +0200 (CEST)
X-Virus-Scanned: amavisd-new/ClamAV at rootsrv.hfp.de
Received: from rootsrv.hfp.de ([127.0.0.1])
	by localhost (rootsrv.hfp.de [127.0.0.1]) (amavisd-new, port 10026)
	with ESMTP id ybMEWyEsQ4T0; Wed, 12 Oct 2011 15:47:16 +0200 (CEST)
Received: from [192.168.240.1] (p4FD4FD34.dip.t-dialin.net [79.212.253.52])
	by rootsrv.hfp.de (Postfix) with ESMTPA;
	Wed, 12 Oct 2011 15:47:16 +0200 (CEST)
Message-ID: <4E959A57.208@hfp.de>
Date: Wed, 12 Oct 2011 15:47:03 +0200
From: Andreas Kinzler <ml-xen-devel@hfp.de>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US;
	rv:1.9.2.18) Gecko/20110616 Thunderbird/3.1.11
MIME-Version: 1.0
To: James Harper <james.harper@bendigoit.com.au>, 
	xen-devel@lists.xensource.com
Content-Type: multipart/mixed; boundary="------------030801000707030202010009"
Cc: 
Subject: [Xen-devel] Stability GPLPV - new test results
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.
--------------030801000707030202010009
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hello James,

something quite interesting happened during my stability tests. GPLPV 
0.11.0.213 which I consider stable, showed the same hang as the newer 
GPLPV versions. I now try to find out why even the stable 0.11.0.213 
hangs when it was and is stable on our production systems. There are 3 
possible causes: Xen 4.1.1 vs Xen 4.0.1, dom0 2.6.32.36 vs 2.6.32.18 and 
CPU Xeon E3-1230 vs Xeon X3450 [and board X9SCM-F vs. X8SIL-F].

The attached log show debugkeys for the hang. I find lines 64-66 quite 
interesting where is shows that there is an event channel upcall pending 
on the hung VM2, no problems on VM1 (line 52-54). Could that be a hint 
to the real problem?

Regards Andreas


--------------030801000707030202010009
Content-Type: text/plain;
 name="x3450-xen"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="x3450-xen"

'e' pressed -> dumping event-channel info
(XEN) Event channel information for domain 0:
(XEN) Polling vCPUs: {No periodic timer}
(XEN)     port [p/m]
(XEN)        1 [0/0]: s=5 n=0 v=0 x=0
(XEN)        2 [0/0]: s=6 n=0 x=0
(XEN)        3 [0/0]: s=6 n=0 x=0
(XEN)        4 [0/0]: s=5 n=0 v=1 x=0
(XEN)        5 [0/0]: s=6 n=0 x=0
(XEN)        6 [0/0]: s=5 n=1 v=0 x=0
(XEN)        7 [0/0]: s=6 n=1 x=0
(XEN)        8 [0/0]: s=6 n=1 x=0
(XEN)        9 [0/0]: s=5 n=1 v=1 x=0
(XEN)       10 [0/0]: s=6 n=1 x=0
(XEN)       11 [0/0]: s=3 n=0 d=0 p=25 x=0
(XEN)       12 [0/0]: s=5 n=0 v=9 x=0
(XEN)       13 [0/0]: s=4 n=0 p=9 x=0
(XEN)       14 [0/1]: s=5 n=0 v=2 x=0
(XEN)       15 [0/0]: s=4 n=0 p=16 x=0
(XEN)       16 [0/0]: s=4 n=0 p=279 x=0
(XEN)       17 [0/0]: s=4 n=0 p=21 x=0
(XEN)       18 [0/0]: s=4 n=0 p=23 x=0
(XEN)       19 [0/0]: s=4 n=0 p=12 x=0
(XEN)       20 [0/0]: s=4 n=0 p=1 x=0
(XEN)       21 [0/0]: s=4 n=0 p=278 x=0
(XEN)       22 [0/0]: s=4 n=0 p=277 x=0
(XEN)       23 [0/0]: s=4 n=0 p=276 x=0
(XEN)       24 [0/0]: s=4 n=0 p=275 x=0
(XEN)       25 [0/0]: s=3 n=0 d=0 p=11 x=0
(XEN)       26 [0/0]: s=5 n=0 v=3 x=0
(XEN)       27 [0/0]: s=3 n=0 d=1 p=3 x=0
(XEN)       28 [0/0]: s=3 n=0 d=1 p=1 x=0
(XEN)       29 [0/0]: s=3 n=0 d=1 p=2 x=0
(XEN)       30 [0/0]: s=3 n=0 d=2 p=3 x=0
(XEN)       31 [0/0]: s=3 n=0 d=2 p=1 x=0
(XEN)       32 [0/0]: s=3 n=0 d=2 p=2 x=0
(XEN)       33 [0/0]: s=3 n=0 d=1 p=7 x=0
(XEN)       34 [0/0]: s=3 n=0 d=1 p=8 x=0
(XEN)       35 [0/0]: s=3 n=0 d=2 p=7 x=0
(XEN)       36 [0/0]: s=3 n=0 d=2 p=8 x=0
(XEN)       37 [0/0]: s=3 n=0 d=1 p=9 x=0
(XEN)       38 [0/0]: s=3 n=0 d=2 p=9 x=0
(XEN) Event channel information for domain 1:
(XEN) Polling vCPUs: {No periodic timer}
(XEN)     port [p/m]
(XEN)        1 [0/1]: s=3 n=0 d=0 p=28 x=1
(XEN)        2 [0/1]: s=3 n=1 d=0 p=29 x=1
(XEN)        3 [0/0]: s=3 n=0 d=0 p=27 x=0
(XEN)        4 [0/1]: s=2 n=0 d=0 x=0
(XEN)        5 [0/0]: s=6 n=0 x=0
(XEN)        6 [0/0]: s=2 n=0 d=0 x=0
(XEN)        7 [0/0]: s=3 n=0 d=0 p=33 x=0
(XEN)        8 [0/0]: s=3 n=0 d=0 p=34 x=0
(XEN)        9 [0/0]: s=3 n=0 d=0 p=37 x=0
(XEN) Event channel information for domain 2:
(XEN) Polling vCPUs: {No periodic timer}
(XEN)     port [p/m]
(XEN)        1 [0/1]: s=3 n=0 d=0 p=31 x=1
(XEN)        2 [0/1]: s=3 n=1 d=0 p=32 x=1
(XEN)        3 [0/0]: s=3 n=0 d=0 p=30 x=0
(XEN)        4 [0/1]: s=2 n=0 d=0 x=0
(XEN)        5 [0/0]: s=6 n=0 x=0
(XEN)        6 [0/0]: s=2 n=0 d=0 x=0
(XEN)        7 [1/0]: s=3 n=0 d=0 p=35 x=0
(XEN)        8 [1/0]: s=3 n=0 d=0 p=36 x=0
(XEN)        9 [1/0]: s=3 n=0 d=0 p=38 x=0

gnttab_usage_print_all [ key 'g' pressed
(XEN)       -------- active --------       -------- shared --------
(XEN) [ref] localdom mfn      pin          localdom gmfn     flags
(XEN) grant-table for remote domain:    0 ... no active grant table entries
(XEN)       -------- active --------       -------- shared --------
(XEN) [ref] localdom mfn      pin          localdom gmfn     flags
(XEN) grant-table for remote domain:    1 (v1)
(XEN) [15453]        0 0x1ac492 0x00000001          0 0x08fe92 0x19
(XEN) [15461]        0 0x19f2a7 0x00000100          0 0x09d0a7 0x09
(XEN) [15480]        0 0x1ab528 0x00000001          0 0x090f28 0x19
(XEN) [15483]        0 0x19fa2a 0x00000100          0 0x09c82a 0x09
(XEN) [15492]        0 0x1ac8a9 0x00000001          0 0x08faa9 0x19
(XEN) [15575]        0 0x19f2a7 0x00000100          0 0x09d0a7 0x09
(XEN) [15637]        0 0x1ab927 0x00000001          0 0x090b27 0x19
(XEN) [15663]        0 0x1ac993 0x00000001          0 0x08fb93 0x19
(XEN) [15755]        0 0x1aca14 0x00000001          0 0x08f814 0x19
(XEN) [15763]        0 0x1ac3a8 0x00000100          0 0x0901a8 0x09
(XEN) [15781]        0 0x1abf26 0x00000001          0 0x090526 0x19
(XEN) [15782]        0 0x1ad115 0x00000001          0 0x08f315 0x19
(XEN) [15801]        0 0x1ac492 0x00000001          0 0x08fe92 0x19
(XEN) [15804]        0 0x1ac029 0x00000100          0 0x090229 0x09
(XEN) [16156]        0 0x180471 0x00000001          0 0x0bbe71 0x19
(XEN) [16262]        0 0x180467 0x00000001          0 0x0bbe67 0x19
(XEN) [16371]        0 0x1800ae 0x00000001          0 0x0bc2ae 0x19
(XEN) [16383]        0 0x180098 0x00000001          0 0x0bc298 0x19
(XEN)       -------- active --------       -------- shared --------
(XEN) [ref] localdom mfn      pin          localdom gmfn     flags
(XEN) grant-table for remote domain:    2 (v1)
(XEN) [16287]        0 0x08bc68 0x00000001          0 0x0bbe68 0x19
(XEN) [16345]        0 0x08bc69 0x00000001          0 0x0bbe69 0x19
(XEN) [16371]        0 0x08b67b 0x00000001          0 0x0bc47b 0x19
(XEN) [16383]        0 0x08b664 0x00000001          0 0x0bc464 0x19
(XEN) gnttab_usage_print_all ] done

'q' pressed -> dumping domain info (now=0x1C578:AC3FDB38)
(XEN) General information for domain 0:
(XEN)     refcnt=3 dying=0 nr_pages=195681 xenheap_pages=5 dirty_cpus={0,2} max_pages=4294967295
(XEN)     handle=00000000-0000-0000-0000-000000000000 vm_assist=0000000d
(XEN) Rangesets belonging to domain 0:
(XEN)     I/O Ports  { 0-1f, 22-3f, 44-60, 62-9f, a2-807, 80c-cfb, d00-ffff }
(XEN)     Interrupts { 0-279 }
(XEN)     I/O Memory { 0-febff, fec01-fedff, fee01-ffffffffffffffff }
(XEN) Memory pages belonging to domain 0:
(XEN)     DomPage list too long to display
(XEN)     XenPage 000000000023f40c: caf=c000000000000002, taf=7400000000000002
(XEN)     XenPage 000000000023f40b: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000023f40a: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000023f409: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000000bf4bd: caf=c000000000000002, taf=7400000000000002
(XEN) VCPU information and callbacks for domain 0:
(XEN)     VCPU0: CPU0 [has=T] flags=0 poll=0 upcall_pend = 01, upcall_mask = 00 dirty_cpus={0} cpu_affinity={0-127}
(XEN)     No periodic timer
(XEN)     VCPU1: CPU2 [has=F] flags=1 poll=0 upcall_pend = 00, upcall_mask = 00 dirty_cpus={2} cpu_affinity={0-127}
(XEN)     No periodic timer
(XEN) General information for domain 1:
(XEN)     refcnt=3 dying=0 nr_pages=773080 xenheap_pages=34 dirty_cpus={1,3} max_pages=774400
(XEN)     handle=b1726fc7-dd8a-43b7-93b3-e6275d0611db vm_assist=00000000
(XEN)     paging assistance: hap refcounts translate external 
(XEN) Rangesets belonging to domain 1:
(XEN)     I/O Ports  { }
(XEN)     Interrupts { }
(XEN)     I/O Memory { }
(XEN) Memory pages belonging to domain 1:
(XEN)     DomPage list too long to display
(XEN)     PoD entries=0 cachesize=0
(XEN)     XenPage 000000000021a269: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000021a268: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000021a267: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000021a266: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000000bf2f0: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000021a120: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050bd: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050bc: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050bb: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050ba: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050b9: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050b8: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050b7: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050b6: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050b5: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050b4: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050b3: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050b2: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050b1: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050b0: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050af: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050ae: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050ad: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050ac: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050ab: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050aa: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050a9: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050a8: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050a7: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050a6: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050a5: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050a4: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050a3: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000002050a2: caf=c000000000000001, taf=7400000000000001
(XEN) VCPU information and callbacks for domain 1:
(XEN)     VCPU0: CPU1 [has=F] flags=1 poll=0 upcall_pend = 00, upcall_mask = 00 dirty_cpus={1} cpu_affinity={0-127}
(XEN)     paging assistance: hap, 4 levels
(XEN)     No periodic timer
(XEN)     VCPU1: CPU3 [has=T] flags=0 poll=0 upcall_pend = 00, upcall_mask = 00 dirty_cpus={3} cpu_affinity={0-127}
(XEN)     paging assistance: hap, 4 levels
(XEN)     No periodic timer
(XEN) General information for domain 2:
(XEN)     refcnt=3 dying=0 nr_pages=773080 xenheap_pages=34 dirty_cpus={} max_pages=774400
(XEN)     handle=fca5ebe7-0b9d-4bc5-9e35-fad9ba95f9a9 vm_assist=00000000
(XEN)     paging assistance: hap refcounts log_dirty translate external 
(XEN) Rangesets belonging to domain 2:
(XEN)     I/O Ports  { }
(XEN)     Interrupts { }
(XEN)     I/O Memory { }
(XEN) Memory pages belonging to domain 2:
(XEN)     DomPage list too long to display
(XEN)     PoD entries=0 cachesize=0
(XEN)     XenPage 0000000000200c0b: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 0000000000200c2a: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 0000000000201577: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000020156c: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 00000000000bf473: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 0000000000204847: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f015: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f014: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f013: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f012: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f011: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f010: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f00f: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f00e: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f00d: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f00c: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f00b: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f00a: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f009: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f008: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f007: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f006: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f005: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f004: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f003: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f002: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f001: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f000: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f47f: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f47e: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f47d: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f47c: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f47b: caf=c000000000000001, taf=7400000000000001
(XEN)     XenPage 000000000022f47a: caf=c000000000000001, taf=7400000000000001
(XEN) VCPU information and callbacks for domain 2:
(XEN)     VCPU0: CPU0 [has=F] flags=1 poll=0 upcall_pend = 01, upcall_mask = 00 dirty_cpus={} cpu_affinity={0-127}
(XEN)     paging assistance: hap, 4 levels
(XEN)     No periodic timer
(XEN)     VCPU1: CPU2 [has=F] flags=1 poll=0 upcall_pend = 00, upcall_mask = 00 dirty_cpus={} cpu_affinity={0-127}
(XEN)     paging assistance: hap, 4 levels
(XEN)     No periodic timer
(XEN) Notifying guest 0:0 (virq 1, port 4, stat 0/0/-1)
(XEN) Notifying guest 0:1 (virq 1, port 9, stat 0/0/0)
(XEN) Notifying guest 1:0 (virq 1, port 0, stat 0/-1/0)
(XEN) Notifying guest 1:1 (virq 1, port 0, stat 0/-1/0)
(XEN) Notifying guest 2:0 (virq 1, port 0, stat 0/-1/-1)
(XEN) Notifying guest 2:1 (virq 1, port 0, stat 0/-1/0)

--------------030801000707030202010009
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

--------------030801000707030202010009--


From xen-devel-bounces@lists.xensource.com Wed Oct 12 06:56:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 06:56:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RDzIo-00048z-UN; Wed, 12 Oct 2011 06:56:58 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RDzI4-0003wZ-Kc
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 06:56:13 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1318427769!20811011!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15839 invoked from network); 12 Oct 2011 13:56:09 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2011 13:56:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,334,1315180800"; 
   d="scan'208";a="8349490"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 13:56:09 +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, 12 Oct 2011 14:56:09 +0100
Subject: Re: [Xen-devel] Front-end back-end connection
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
Date: Wed, 12 Oct 2011 14:56:08 +0100
In-Reply-To: <CAP2B85_zhnY9DVmD3fWE7j2XkHgd8eKiryr8GSLLo8Bm8UHuTw@mail.gmail.com>
References: <CAP2B85-UdKBazkis6Ga1QSX=PLfuk_LMLwh1RnQ2oMsi10wvHQ@mail.gmail.com>
	<1318414373.21903.637.camel@zakaz.uk.xensource.com>
	<CAP2B85_zhnY9DVmD3fWE7j2XkHgd8eKiryr8GSLLo8Bm8UHuTw@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: <1318427768.21903.718.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 Wed, 2011-10-12 at 13:02 +0100, Daniel Castro wrote:
> On Wed, Oct 12, 2011 at 7:12 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Wed, 2011-10-12 at 08:13 +0100, Daniel Castro wrote:
> >> Hello All,
> >>
> >> I am in the process of conecting my front-end to my back end.
> >> The process is like this:
> >> 1. Set up xenstore conection
> >> 2. initiate front rings
> >> 3. Initiate gran table
> >> 4. Take my rings mfn address and set it up as a entry (more on this)
> >> 5. create a unbound port for front-back ring communication (more on this )
> >> 5.1 I start by changing state to XenbusStateInitialising
> >> 5.2 ring-ref entry (step 4)
> >> 5.3 port entry (step 5)
> >> 5.4 backend state is XenbusStateInitWait
> >> 5.4 change state to XenbusStateInitialised
> >> 5.5 back end state is XenbusStateClosing meaning there is an error or
> >> something is missing.
> >> 6. on sucess end
> >>
> >> More on step 4: I got my grant page table like this:
> >>       struct gnttab_setup_table gst;
> >>       grant_entries = (struct grant_entry_v1 *) memalign_high(4096, 4096);
> >> //asume malloc
> >>       memset(grant_entries,0,4096);
> >>       gst.dom = DOMID_SELF; //&me
> >>       gst.nr_frames = 1; //a single page
> >>       //gst.frame_list = grant_entries; (I have no idea how to handle this :P )
> >>       res = hypercall_grant_table_op(GNTTABOP_map_grant_ref, &gst, 1);
> >> I think this works, but maybe I am wrong.
> >
> > I'm afraid you are.
> >
> > For one thing simply not initialising one of the fields in the argument
> > structure is unlikely to be correct.
> >
> > Secondly the argument to GNTTABOP_map_grant_ref is a pointer to "struct
> > gnttab_map_grant_ref" not "struct gnttab_setup_table", likewise "struct
> > gnttab_setup_table" goes with GNTTABOP_setup_table. I think this should
> > be pretty clear from the way the GNTTABOP_* and struct definitions are
> > laid out in xen/include/public/grant_table.h and the naming convention
> > what goes with what. There are also comments in that header describing
> > each operation.
> >
> > If you are trying to setup the grant table itself then
> > GNTTABOP_setup_table is what you want. GNTTABOP_map_grant_ref is used
> > for mapping a grant reference which you have been given by another
> > domain.
> >
> > drivers/xen/grant-table.c:gnttab_map should provide a rough idea how
> > this needs to be done. Because this is an HVM domain you need to do a
> > XENMEM_add_to_physmap of XENMAPSPACE_grant_table before you do the
> > GNTTABOP_setup_table.
> 
> Fixed. Yet, how can I confirm that the grant table was correctly
> mapped? The hypercall returned 0 and the status in the struct is also
> 0.
> After the mapping I am printing this:
> allocated grant_entries at 12 bytes at 0x0f7fc000, gpfn 0xf7fc
> GNTTABOP_setup_table return 0 status:0
> allocated shared info 2584 bytes at 0x0f7fa000, gpfn 0xf7fa

Did you also call XENMEM_add_to_physmap somewhere?

I'm afraid these messages are pretty meaningless without the
corresponding code, but you should certainly have already setup the
table before you start allocating grant_entries in it (or more
importantly writing to them). These messages suggest that is not the
case?

> I also found that the port I get from the EVTCHNOP_alloc_unbound is 4,
> but lsevtchn gets me this:
>   42: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 2
>   43: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 3
>   44: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 1
> Port 4 is not listed, is it because it is not connected yet?

If this is lsevtchn for dom0 then most likely yes. You should be able to
see the guest's state with lsevtchn <domid>.

In the backend the evtchn gets bound after the frontend's shared ring is
mapped so the fact that the evtchn didn't get bound suggests an error
before that point.

> I get no errors in xl dmesg, and in dmesg I get:
> vbd vbd-5-768: 2 reading /local/domain/5/device/vbd/768/ring-ref and
> event-channel

Do you see anything else in xenstore? 

> I guess there are the keys I write in the front-end, so they are being read.
> 
> Thanks for the help, I feel we are getting closer to the other side...
> 
> Daniel
> 
> >
> >>  This is needed on step 5, so..
> >> More on step 5:
> >> I consider the grant table an array of type struct grant_entry_v1.
> >> So I simply do grant_entry_v1[0] for my first grant entry, and so
> >> forth. For this case I read on the list some time ago that entry 0 did
> >> not work, so I work with entry 1, like this:
> >> grant_entries[aval_grant].domid = ext_domid;
> >> grant_entries[aval_grant].frame = _frame; where frame is: (u32)sring
> >> >> PAGE_SHIFT //meaning mfn of my rings.
> >> grant_entries[aval_grant].flags = GTF_permit_access;
> >
> > This looks approximately correct _if_ you were actually writing to some
> > memory which was your grant table but due to the above I think you are
> > not.
> >
> >> These last two steps I described may be wrong... I know this because
> >> the backend state is not XenbusStateConnected.
> >
> > That fact alone can't tell you much other than _something_ went wrong.
> >
> > Since the backend will have transitioned to XenbusStateClosing by
> > calling xenbus_dev_fatal() it will have written some error information
> > to xenstore and the dom0 console which should hint at what actually went
> > wrong. I expect you will see the message "mapping ring-ref %lu port %u"
> > because xen_blkif_map will have failed during map_frontend_page().
> >
> >> I think my mistake is on step 5, so can someone please shed some light
> >> on this small issue.
> >>
> >> And thank you very much for taking the time to read.
> >>
> >> Daniel
> >>
> >
> >
> >
> 
> 
> 



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:22:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:22:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE0dw-0006Bv-Ml; Wed, 12 Oct 2011 08:22:52 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0d0-0005yb-Lk
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:21:55 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318432910!19221486!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20462 invoked from network); 12 Oct 2011 15:21:51 -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; 12 Oct 2011 15:21:51 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9CFLkhS018202
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Wed, 12 Oct 2011 15:21:47 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9CFFm2l009556
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 15:15:48 GMT
Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9CFLduA016615; Wed, 12 Oct 2011 10:21:39 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 12 Oct 2011 08:21:39 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id EE17A1580; Wed, 12 Oct 2011 11:21:25 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c8ee79dee3fe29c5fb9d211ed46c4c65ec24430b
Message-Id: <c8ee79dee3fe29c5fb9d.1318432719@localhost6.localdomain6>
In-Reply-To: <patchbomb.1318432718@localhost6.localdomain6>
References: <patchbomb.1318432718@localhost6.localdomain6>
User-Agent: Mercurial-patchbomb/1.9.1
Date: Wed, 12 Oct 2011 11:18:39 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: JBeulich@suse.com, xen-devel@lists.xensource.com, Ian.Campbell@citrix.com
Status: RO
Lines: 90
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A020201.4E95B08C.00E0,ss=1,re=0.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 1 of 2] interface: BLKIF_OP_TRIM ->
	BLKIF_OP_DISCARD
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318432717 14400
# Node ID c8ee79dee3fe29c5fb9d211ed46c4c65ec24430b
# Parent  72f339bc600d7a9629d3f9eb8a279fbf8be25b12
interface: BLKIF_OP_TRIM -> BLKIF_OP_DISCARD

The name 'trim' is specific to the ATA discard implementation, but the
operation is not specific to ATA. We could name it on the 'scsi unmap'
for the SCSI discard implementation but that would be more confusing.

Instead lets use a generic name, which also Linux choose, and that
is 'discard'. Furthermore, we flesh out the description to include
extra details on what is expected of 'feature-flush' and what are
some of the extra parameters that the frontend can read from the
backend. Those extra parameters are: : discard-aligment,
discard-granularity, and discard-secure.


Acked-by: Jan Beulich <JBeulich@suse.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff -r 72f339bc600d -r c8ee79dee3fe xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h	Mon Oct 10 11:21:51 2011 +0100
+++ b/xen/include/public/io/blkif.h	Wed Oct 12 11:18:37 2011 -0400
@@ -82,26 +82,48 @@
  */
 #define BLKIF_OP_RESERVED_1        4
 /*
- * Recognised only if "feature-trim" is present in backend xenbus info.
- * The "feature-trim" node contains a boolean indicating whether trim
- * requests are likely to succeed or fail. Either way, a trim request
+ * Recognised only if "feature-discard" is present in backend xenbus info.
+ * The "feature-discard" node contains a boolean indicating whether trim
+ * (ATA) or unmap (SCSI) - conviently called discard requests are likely
+ * to succeed or fail. Either way, a discard request
  * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by
  * the underlying block-device hardware. The boolean simply indicates whether
- * or not it is worthwhile for the frontend to attempt trim requests.
- * If a backend does not recognise BLKIF_OP_TRIM, it should *not*
- * create the "feature-trim" node!
- * 
- * Trim operation is a request for the underlying block device to mark
- * extents to be erased. Trim operations are passed with sector_number as the
- * sector index to begin trim operations at and nr_sectors as the number of
- * sectors to be trimmed. The specified sectors should be trimmed if the
- * underlying block device supports trim operations, or a BLKIF_RSP_EOPNOTSUPP
- * should be returned. More information about trim operations at:
+ * or not it is worthwhile for the frontend to attempt discard requests.
+ * If a backend does not recognise BLKIF_OP_DISCARD, it should *not*
+ * create the "feature-discard" node!
+ *
+ * Discard operation is a request for the underlying block device to mark
+ * extents to be erased. However, discard does not guarantee that the blocks
+ * will be erased from the device - it is just a hint to the device
+ * controller that these blocks are no longer in use. What the device
+ * controller does with that information is left to the controller.
+ * Discard operations are passed with sector_number as the
+ * sector index to begin discard operations at and nr_sectors as the number of
+ * sectors to be discarded. The specified sectors should be discarded if the
+ * underlying block device supports trim (ATA) or unmap (SCSI) operations,
+ * or a BLKIF_RSP_EOPNOTSUPP  should be returned.
+ * More information about trim/unmap operations at:
  * http://t13.org/Documents/UploadedDocuments/docs2008/
  *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
+ * http://www.seagate.com/staticfiles/support/disc/manuals/
+ *     Interface%20manuals/100293068c.pdf
+ * The backend can optionally provide three extra XenBus attributes to
+ * further optimize the discard functionality:
+ * 'discard-aligment' - Devices that support discard functionality may
+ * internally allocate space in units that are bigger than the exported
+ * logical block size. The discard-alignment parameter indicates how many bytes
+ * the beginning of the partition is offset from the internal allocation unit's
+ * natural alignment.
+ * 'discard-granularity'  - Devices that support discard functionality may
+ * internally allocate space using units that are bigger than the logical block
+ * size. The discard-granularity parameter indicates the size of the internal
+ * allocation unit in bytes if reported by the device. Otherwise the
+ * discard-granularity will be set to match the device's physical block size.
+ * 'discard-secure' - All copies of the discarded sectors (potentially created
+ * by garbage collection) must also be erased. To use this feature, the flag
+ * BLKIF_DISCARD_SECURE must be set in the blkif_request_trim.
  */
-#define BLKIF_OP_TRIM              5
-
+#define BLKIF_OP_DISCARD           5
 /*
  * Maximum scatter/gather segments per request.
  * This is carefully chosen so that sizeof(blkif_ring_t) <= PAGE_SIZE.



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:24:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:24:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE0f2-0006Z0-8g; Wed, 12 Oct 2011 08:24:00 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0d1-0005ye-DX
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:21:56 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318432910!19221488!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20498 invoked from network); 12 Oct 2011 15:21:52 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-2.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 15:21:52 -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
	p9CFLkGZ004300
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 12 Oct 2011 15:21:48 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
	p9CFLjKw028860
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 15:21:45 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
	p9CFLdCh027061; Wed, 12 Oct 2011 10:21:40 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 12 Oct 2011 08:21:39 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id E86FB157E; Wed, 12 Oct 2011 11:21:25 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1318432718@localhost6.localdomain6>
User-Agent: Mercurial-patchbomb/1.9.1
Date: Wed, 12 Oct 2011 11:18:38 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: JBeulich@suse.com, xen-devel@lists.xensource.com, Ian.Campbell@citrix.com
Status: RO
Lines: 10
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4E95B08D.0066:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 0 of 2] Patches to alter BLKIF_OP_TRIM to
	BLKIF_OP_DISCARD (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 is the v3 of the patches. I've split the patch in two to cover just
the documentation, and then the structure change. The structure change
is the same, except the name of the 'secure' flag is BLKIF_DISCARD_SECURE
now.

I've also taken the liberty of applying Acked-by: Jan Beulich on both
of the patches.

Please apply these two patches to the tree at your convience. Thanks.



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:25:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:25:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE0g7-0006wd-Sy; Wed, 12 Oct 2011 08:25:08 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0d1-0005yf-G1
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:21:56 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1318432910!729258!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2925 invoked from network); 12 Oct 2011 15:21:52 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-6.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 15:21:52 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9CFLkHP004299
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Wed, 12 Oct 2011 15:21:48 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9CFLjPR022319
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 15:21: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
	p9CFLeqO027062; Wed, 12 Oct 2011 10:21:40 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 12 Oct 2011 08:21:39 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id F24DF1582; Wed, 12 Oct 2011 11:21:25 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: de77bf1b00c20d22e0f9976c7f35ae1404994342
Message-Id: <de77bf1b00c20d22e0f9.1318432720@localhost6.localdomain6>
In-Reply-To: <patchbomb.1318432718@localhost6.localdomain6>
References: <patchbomb.1318432718@localhost6.localdomain6>
User-Agent: Mercurial-patchbomb/1.9.1
Date: Wed, 12 Oct 2011 11:18:40 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: JBeulich@suse.com, xen-devel@lists.xensource.com, Ian.Campbell@citrix.com
Status: RO
Lines: 46
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090201.4E95B08D.007F,ss=1,re=0.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 2 of 2] interface:
	blkif_request_trim->blkif_request_discard
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318432717 14400
# Node ID de77bf1b00c20d22e0f9976c7f35ae1404994342
# Parent  c8ee79dee3fe29c5fb9d211ed46c4c65ec24430b
interface: blkif_request_trim->blkif_request_discard

Change the naming of the structure and as well alter the 'reserved'
uint8_t to be used a 'flag'. We use only for one flag: BLKIF_DISCARD_SECURE.

That flag can only be set if the backend has set 'discard-secure' to one.
If backend has not set 'discard-secure' to one, that flag will have no
effect.

Acked-by: Jan Beulich <JBeulich@suse.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff -r c8ee79dee3fe -r de77bf1b00c2 xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h	Wed Oct 12 11:18:37 2011 -0400
+++ b/xen/include/public/io/blkif.h	Wed Oct 12 11:18:37 2011 -0400
@@ -157,17 +157,19 @@ typedef struct blkif_request blkif_reque
 
 /*
  * Cast to this structure when blkif_request.operation == BLKIF_OP_TRIM
- * sizeof(struct blkif_request_trim) <= sizeof(struct blkif_request)
+ * sizeof(struct blkif_request_discard) <= sizeof(struct blkif_request)
  */
-struct blkif_request_trim {
+struct blkif_request_discard {
     uint8_t        operation;    /* BLKIF_OP_TRIM                        */
-    uint8_t        reserved;     /*                                      */
+    uint8_t        flag;         /* BLKIF_DISCARD_SECURE or 0            */
+                                 /* ignored if 'discard-secure=0'        */
+#define BLKIF_DISCARD_SECURE       (1<<0)
     blkif_vdev_t   handle;       /* same as for read/write requests      */
     uint64_t       id;           /* private guest value, echoed in resp  */
     blkif_sector_t sector_number;/* start sector idx on disk             */
-    uint64_t       nr_sectors;   /* number of contiguous sectors to trim */
+    uint64_t       nr_sectors;   /* number of contiguous sectors to discard */
 };
-typedef struct blkif_request_trim blkif_request_trim_t;
+typedef struct blkif_request_discard blkif_request_discard_t;
 
 struct blkif_response {
     uint64_t        id;              /* copied from request */



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:26:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:26:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE0hT-0007Js-6v; Wed, 12 Oct 2011 08:26:31 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0e9-0006Fd-3c
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:23:05 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1318432960!44192703!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29400 invoked from network); 12 Oct 2011 15:22:40 -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;
	12 Oct 2011 15:22:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,335,1315180800"; 
   d="scan'208";a="8352298"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 15:23:01 +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, 12 Oct 2011 16:23:01 +0100
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
	1RE0e5-00039R-85; Wed, 12 Oct 2011 15:23:01 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RE0e5-0008Sf-6Z;
	Wed, 12 Oct 2011 16:23:01 +0100
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: <20117.45269.184117.26739@mariner.uk.xensource.com>
Date: Wed, 12 Oct 2011 16:23:01 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 2 of 3] libxl: fixup incorrect indentation
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <ea75a1765a4a8da26089.1317996524@cosworth.uk.xensource.com>
References: <patchbomb.1317996522@cosworth.uk.xensource.com>
	<ea75a1765a4a8da26089.1317996524@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 2 of 3] libxl: fixup incorrect indentation"):
> libxl: fixup incorrect indentation

Applied all 3.  3/3 contained a change to libxl_json.h which seems to
have gone missing, but it builds fine without.

Ian.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:27:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:27:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE0iV-0007gn-6a; Wed, 12 Oct 2011 08:27:35 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0eY-0006MX-B2
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:23:30 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318433005!20851810!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10555 invoked from network); 12 Oct 2011 15:23:27 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 15:23:27 -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
	p9CFNAHn020482
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 12 Oct 2011 15:23:11 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
	p9CFN9AK007968
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 15:23:09 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
	p9CFN4fN028686; Wed, 12 Oct 2011 10:23:04 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 12 Oct 2011 08:23:04 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 3843E157E; Wed, 12 Oct 2011 11:22:56 -0400 (EDT)
Date: Wed, 12 Oct 2011 11:22:56 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1 of 1] interface: BLKIF_OP_TRIM ->
	BLKIF_OP_DISCARD
Message-ID: <20111012152256.GA1732@phenom.oracle.com>
References: <patchbomb.1318269010@localhost6.localdomain6>
	<d17ab29f2f9ad29a7b8a.1318269011@localhost6.localdomain6>
	<20111010195842.GB5755@phenom.oracle.com>
	<20111011182741.GA1530@phenom.oracle.com>
	<1318416004.21903.659.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318416004.21903.659.camel@zakaz.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.0A020205.4E95B0E0.010B:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Owen Smith <owen.smith@citrix.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Paul Durrant <Paul.Durrant@citrix.com>,
	"JBeulich@novell.com" <JBeulich@novell.com>,
	"lidongyang@novell.com" <lidongyang@novell.com>,
	"JBeulich@suse.com" <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 Wed, Oct 12, 2011 at 11:40:04AM +0100, Ian Campbell wrote:
> On Tue, 2011-10-11 at 19:27 +0100, Konrad Rzeszutek Wilk wrote:
> > On Mon, Oct 10, 2011 at 03:58:42PM -0400, Konrad Rzeszutek Wilk wrote:
> > > On Mon, Oct 10, 2011 at 01:50:11PM -0400, Konrad Rzeszutek Wilk wrote:
> > 
> > Per Ian and Jan's suggestion (note, the structure is 4-byte aligned
> > so we do not need to pad it):
> > 
> > # HG changeset patch
> > # Parent 72f339bc600d7a9629d3f9eb8a279fbf8be25b12
> > interface: BLKIF_OP_TRIM -> BLKIF_OP_DISCARD
> > 
> > The name 'trim' is specific to the ATA discard implementation.
> > The name 'scsi unmap' is specific to the SCSI discard implementation.
> > 
> > We should really use a generic name - and the name 'discard'
> > looks to be the most generic of them all. Also update the description
> > to mention the other parameters that the frontend can query the
> > backend for: discard-aligment, discard-granularity, and
> > discard-secure. We also utilize per Jan Beulich keen suggestion,
> > the 8-bit reserved field to use as a flag value. Currently the only
> > flag that can be passed for a discard operation is secure delete:
> > BLKIF_OP_DISCARD_FLAG_SECURE.
> 
> This change seems to be conflating a large rename with new data fields,
> changes to the documentation in the comments and other bits and bobs,
> which makes it pretty hard to review it's actual impact. Can we get them
> separately?

Of course. Sent them along with Jan's Acked-by flag.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:29:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:29:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE0k1-0008A3-5H; Wed, 12 Oct 2011 08:29:09 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0h2-0007Co-EH
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:26:05 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318433137!52910020!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22253 invoked from network); 12 Oct 2011 15:25:38 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-6.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 15:25:38 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1318433161; l=872;
	s=domk; d=aepfle.de;
	h=Content-Type:MIME-Version:Subject:To:From:Date:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=JSAybTg65A/gfbcjfhtkxmq3pQQ=;
	b=XFHrADRymiwTUJqLl0NkShEfH5nefifDuMHF0gK4CwypeVOoBHy0fyB+37OMvjO0Dz2
	m5VAavFWD7PMpXfQyBGlazLUD2w9om6DILBT9um0ghzg7XmUmwD1AWomyYVo34hh0tkFC
	agKZypVxxmyjJPCdtCAycfk6BLGMqtiSQM0=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjzcQEczvfA==
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-114-206.pools.arcor-ip.net [88.65.114.206])
	by smtp.strato.de (cohen mo62) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id v05cbdn9CDaYxY
	for <xen-devel@lists.xensource.com>;
	Wed, 12 Oct 2011 17:25:40 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 5DDDC18B65; Wed, 12 Oct 2011 17:25:39 +0200 (CEST)
Date: Wed, 12 Oct 2011 17:25:39 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Message-ID: <20111012152539.GA9763@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] updating xl monitor process via xenstore
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


Currently the xl monitor process does not receive updates made by the
various xl commands.
For example 'xl mem-max' updates the guests d->max_pages but neither
"memory/static-max" nor the monitor process gets notified of such a
change.

Shouldn't each xl command which tweaks the guests runtime state also
propagate that change to xenstore and the monitor process? There are no
watches in xl other than the guest shutdown and cd eject.

I implemented this in my xenpaging patch. If the config option to start
xenpaging was missing in the config file, its possible to start paging
later. The xl monitoring process has a watch, which will start xenpaging
when xl mem-FOO updates that value.

After a guest reboot (and maybe during migration) the changes made with
xl <somecommand> will remain. Right now the values from the config file
are used.

Olaf

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:30:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08: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 1RE0lB-00005h-0T; Wed, 12 Oct 2011 08:30:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0j8-0007r9-2X
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:28:14 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1318433290!729633!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18360 invoked from network); 12 Oct 2011 15:28:10 -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;
	12 Oct 2011 15:28:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,335,1315180800"; 
   d="scan'208";a="8352436"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 15:27:43 +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, 12 Oct 2011 16:27:42 +0100
Subject: Re: [Xen-devel] RE: [PATCH 02 of 23] libxl: add a comment
	describing the device interfaces
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 12 Oct 2011 16:27:42 +0100
In-Reply-To: <CAPLaKK64ucxWSSzfigubic3FBheoXnAiXiYVGyO2Qhkxs47i_Q@mail.gmail.com>
References: <patchbomb.1317389593@localhost.localdomain>
	<7c845e974def74de73f6.1317389595@localhost.localdomain>
	<81A73678E76EA642801C8F2E4823AD21BC2EE2FCCD@LONPMAILBOX01.citrite.net>
	<1317721138.21903.103.camel@zakaz.uk.xensource.com>
	<CAPLaKK64ucxWSSzfigubic3FBheoXnAiXiYVGyO2Qhkxs47i_Q@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1318433262.21903.729.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Mike McClurg <mike.mcclurg@citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Dave Scott <Dave.Scott@eu.citrix.com>,
	Jim Fehlig <jfehlig@novell.com>, Jonathan
	Ludlam <Jonathan.Ludlam@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-10-11 at 13:59 +0100, Roger Pau MonnÃ© wrote:
> Hello,
> 
> I've applied this patches to my tree and modified my NetBSD hotplug
> and phy backend patches to conform to the new API. From what I can see
> the patches work ok, except for the small bugs that I've commented on
> some individual patches.
> 
> Should I wait for this patches to be committed to the Xen repository
> before sending my own, or is it fine to post them for review now?

I would post them for review. I do have a second revision which I'm
about to post, which is mainly a change to the IDL type destructors to
"dispose" instead of "destroy" and  "s/force_remove/destroy/" but that
needn't stop us reviewing your changes.

Ian.



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:36:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:36:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE0r4-0000aG-QL; Wed, 12 Oct 2011 08:36:26 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0qI-0000MK-Vw
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:35:39 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318433717!46360253!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31155 invoked from network); 12 Oct 2011 15:35:17 -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;
	12 Oct 2011 15:35:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,335,1315180800"; 
   d="scan'208";a="8352989"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 15:35:35 +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, 12 Oct 2011 16:35:35 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Wed, 12 Oct 2011 16:35:35 +0100
In-Reply-To: <patchbomb.1318432718@localhost6.localdomain6>
References: <patchbomb.1318432718@localhost6.localdomain6>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318433735.21903.735.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"JBeulich@suse.com" <JBeulich@suse.com>
Subject: [Xen-devel] Re: [PATCH 0 of 2] Patches to alter BLKIF_OP_TRIM to
 BLKIF_OP_DISCARD (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

On Wed, 2011-10-12 at 16:18 +0100, Konrad Rzeszutek Wilk wrote:
> This is the v3 of the patches. I've split the patch in two to cover just
> the documentation, and then the structure change. The structure change
> is the same, except the name of the 'secure' flag is BLKIF_DISCARD_SECURE
> now.

What I meant was to post the s/trim/discard/ (of both the docs and the
struct) as a separate patch with no other non-mechanical changes first.
As it stands the docs patch is unreadable because basically every line
has changed _and_ you've simultaneously added new content. The stuff
which has been added is the interesting bit WRT reviewing it, the rename
itself can be reviewed just by understanding the old and new names.

Once you've done the rename then you can add the docs and datastructures
relating to secure discard as a single patch, the stuff to do with
granularity as a patch etc etc. Currently you modify the datastructure
in your 2/2 patch but document the meaning of the new fields all mixed
up in patch 1/2.

> 
> I've also taken the liberty of applying Acked-by: Jan Beulich on both
> of the patches.
> 
> Please apply these two patches to the tree at your convience. Thanks.
> 
> 



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:37:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:37:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE0sG-00010o-Jg; Wed, 12 Oct 2011 08:37:40 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0ra-0000mf-2w
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:36:58 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318433814!720079!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18902 invoked from network); 12 Oct 2011 15:36:55 -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;
	12 Oct 2011 15:36:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,335,1315180800"; 
   d="scan'208";a="8353057"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 15:36: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, 12 Oct 2011 16:36:54 +0100
Subject: Re: [Xen-devel] XEN - networking and performance
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "D. Duckworth" <donduq@i2pmail.org>
Date: Wed, 12 Oct 2011 16:36:54 +0100
In-Reply-To: <20111012045004.EEDCCAE0AC@smtp.postman.i2p>
References: <20111006203821.CD70CE9342@kermit.internecto.net>
	<20111008190701.50DFBAE098@smtp.postman.i2p>
	<20111010170359.DF487AE08F@smtp.postman.i2p>
	<20111012045004.EEDCCAE0AC@smtp.postman.i2p>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318433814.21903.736.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 Wed, 2011-10-12 at 05:50 +0100, D. Duckworth wrote:
> > auto lo
> > iface lo inet loopback
> >
> > auto switch
> > iface switch inet static
> >       address 192.168.101.16
> >       netmask 255.255.255.0
> >       gateway 192.168.101.1
> >       bridge_ports eth2
> >
> > And just use that 'bridge=switch' in all my configuration. And that
> > seems to work just fine - wouldn't that be best way of providing
> > the first network setup to users? I would think the majority of
> folks
> > do something akin to this?
> 
> Well I said a lot of things but not that it's broken. :) Not that I
> couldn't, though. The above stuff works in Debian, but Arch Linux has
> no ifup, neither does bsd. 

If you know how to setup a bridge on those systems please could you
update http://wiki.xen.org/xenwiki/HostConfiguration/Networking to add
links to the relevant Arch / BSD documentation. A couple of simple
examples for the most common case would also be useful.

> So those maintainers have to port Xen's code with patches making it
> time expensive (and painfully dull). Instead the whole routine that
> removes interfaces, adds new bridges, sets iptables, etc. should
> simply be deleted.

We agree and this is why with the xl toolstack we do not support the use
of these scripts or ever call out to them automatically (they haven't
actually been deleted, since xend still uses them). With xl we recommend
that folks use their distribution provided mechanisms to setup the host
network configuration. 

We made some attempt mitigate the network-* insanity for xend users, by
making it such that the script will only do the mad things if it is
(heuristically) detected that the admin hasn't already set something up
themselves, it's not clear how effective this strategy was in practice,
even better is to just comment out the relevant line in your
xend-config.sxp IMHO. Hopefully it is explained below why we aren't
doing any wholesale reworking of how xend does things.

None of that really addresses the complexity of the existing vif-*
scripts. I suspect that deprecating the network-* ones for xl has
effectively deprecated all but the vif-bridge one since e.g. vif-nat
depends quite heavily on the setup which network-nat has done.

There is probably scope for providing a much simpler vif-bridge script
for use with xl, the existing one does have some odd stuff in it.

For more complex scenarios like nat etc there is certainly value in
having examples of how people have done stuff and as James suggested
we'd certainly like to see people posting (or writing up on the wiki)
their own configurations and scripts etc.

> One question that has been bugging me is the xm/xl thing. What are the
> exact plans, will xl indeed be phased in while xm will be phased out
> and what will/won't be supported by xl? Or did I misinterpret it. Imho
> a suggestion to switch over should only be come out when xl becomes
> 'distribution-grade stable'.

xend has been effectively unmaintained for several releases now and
there is nobody who is willing to step up and support it. Unless someone
steps up as a maintainer it will become more deprecated with time and in
a few releases I expect it will be removed from the tree.

On the other hand we are actively developing xl and supporting it.

In 4.1 we recommended that people try xl and report the bugs and missing
features which would prevent them from transitioning from xend. We are
doing our best to address these bugs and short-comings as they are
reported to us. It is our hope that we can fully recommend xl in the 4.2
or 4.3 time scale. Obviously if people delay trying xl until we've
switched to it then there is something of a chicken and egg problem wrt
making sure it supports their needs.

It seems that you have several issues which are impacting you but I'm
having trouble digesting them all out of your mails. Posting
individually about any the specific issues which you have that are
preventing you from using xl (or indeed Xen generally) will ensure a
much greater chance that someone will notice and do something about
them. I'm sorry to say that posting long rants is unlikely to have the
same effect...

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 Oct 12 08:39:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:39:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE0uH-0001Ok-4W; Wed, 12 Oct 2011 08:39:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0tp-0001Cy-3d
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:39:17 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-8.tower-27.messagelabs.com!1318433933!47944591!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16027 invoked from network); 12 Oct 2011 15:38:54 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 15:38:54 -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 A8C8092D9;
	Wed, 12 Oct 2011 08:39:11 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 1F9CE20C36;
	Wed, 12 Oct 2011 08:39:11 -0700 (PDT)
Message-ID: <4E95B49F.5060408@goop.org>
Date: Wed, 12 Oct 2011 08:39:11 -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: Borislav Petkov <bp@amd64.org>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
In-Reply-To: <20111012101615.GA14966@aftab>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: "Tian, Kevin" <kevin.tian@intel.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 03:16 AM, Borislav Petkov wrote:
> On Tue, Oct 11, 2011 at 08:40:05PM -0400, Jeremy Fitzhardinge wrote:
>> Ping?
>>
>> On 09/26/2011 11:17 AM, Jeremy Fitzhardinge 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.
> Err,
>
> wait a sec, last time the suggestion was that _because_ xen supports the
> multiboot protocol, implementing an early solution would be even easier
> for you:
>
> http://marc.info/?l=linux-kernel&m=129667641316947&w=2
>
> Why would a xen microcode solution would even be contingent on how
> upstream Linux solves it (and when)?
>
> AFAICT, you want to hand off the microcode image from the bootloader to
> the hypervisor and update ucode there - no need for dom0 changes...

I don't want a Xen-specific solution to this.  If Linux overall moves to
a boot-time microcode loading scheme, then I'm happy to support it.  But
in the meantime, I want a Xen system to Just Work in the same manner as
a non-Xen one, without requiring special support from all the distros.

    J

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:40:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:40:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE0vC-0001mh-1k; Wed, 12 Oct 2011 08:40:42 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0uV-0001Tv-13
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:40:00 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318433968!52539607!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31307 invoked from network); 12 Oct 2011 15:39:28 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 15:39:28 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 12 Oct 2011 16:39:55 +0100
Message-Id: <4E95D0EB020000780005AE7D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 12 Oct 2011 16:39:55 +0100
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] ns16550: fix poll handling regression
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Prior to c/s 23811:f1349a968a5a LSR_THRE was checked only once, while
there it got promoted into the surrounding loop's condition. Since that
bit may not clear for an extended period of time (i.e. when no new
output is generated), it must not be used in this way indefinitely.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/char/ns16550.c
+++ b/xen/drivers/char/ns16550.c
@@ -157,15 +157,18 @@ static void __ns16550_poll(struct cpu_us
 {
     struct serial_port *port =3D this_cpu(poll_port);
     struct ns16550 *uart =3D port->uart;
-    char lsr;
+    unsigned char lsr, mask =3D LSR_DR | LSR_THRE;
=20
     if ( uart->intr_works )
         return; /* Interrupts work - no more polling */
=20
-    while ( (lsr =3D ns_read_reg(uart, LSR)) & (LSR_DR|LSR_THRE) )
+    while ( (lsr =3D ns_read_reg(uart, LSR)) & mask )
     {
         if ( lsr & LSR_THRE )
+        {
             serial_tx_interrupt(port, regs);
+            mask &=3D ~LSR_THRE;
+        }
         if ( lsr & LSR_DR )
             serial_rx_interrupt(port, regs);
     }




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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:44:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:44:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE0yx-0002Gv-Sx; Wed, 12 Oct 2011 08:44:35 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE0yU-000239-Da
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:44:06 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-11.tower-174.messagelabs.com!1318434241!34980458!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3093 invoked from network); 12 Oct 2011 15:44:03 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 15:44:03 -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 CB2F292F3;
	Wed, 12 Oct 2011 08:44:00 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 3C11B20257;
	Wed, 12 Oct 2011 08:44:00 -0700 (PDT)
Message-ID: <4E95B5C0.10606@goop.org>
Date: Wed, 12 Oct 2011 08:44:00 -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: Ingo Molnar <mingo@elte.hu>
References: <cover.1317755691.git.jeremy.fitzhardinge@citrix.com>
	<619c66d6da63aa086e2eac017e7aed216cc8ddc3.1317755691.git.jeremy.fitzhardinge@citrix.com>
	<8762k4grwy.fsf@rustcorp.com.au>
	<20111010073405.GC29035@elte.hu> <4E934F37.2020300@goop.org>
	<20111012073402.GJ18618@elte.hu>
In-Reply-To: <20111012073402.GJ18618@elte.hu>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	Rusty Russell <rusty@rustcorp.com.au>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V3 2/8] stop_machine: make stop_machine
 safe and efficient to call early
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 12:34 AM, Ingo Molnar wrote:
> * Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>
>> On 10/10/2011 12:34 AM, Ingo Molnar wrote:
>>> * Rusty Russell <rusty@rustcorp.com.au> wrote:
>>>
>>>> On Tue,  4 Oct 2011 12:18:03 -0700, Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>>>>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>>>>
>>>>> Make stop_machine() safe to call early in boot, before stop_machine()
>>>>> has been set up, by simply calling the callback function directly if
>>>>> there's only one CPU online.
>>>> Not that you need this, since it's >90% Tejun's code now, but:
>>>>
>>>> Acked-by: Rusty Russell <rusty@rustcorp.com.au>
>>> hey, extra review is always useful.
>>>
>>> Jeremy, Tejun, what's the expected merge path of these changes?
>> Andrew has already picked up the stop_machine patch, I think.  But it's
>> pretty settled now, so it shouldn't cause any problem if it gets via
>> multiple paths.
>>
>> What about the jump-label stuff?  Has that been going via tip.git in the
>> past, or by some other path?
> If it has Jason's and PeterZ's ack then it can go via any other tree 
> in this cycle - we are not carrying jump label patches right now.
>
> But those acks are very much desired.

Jason has already Acked it, but then pointed out a couple of problems to
address.

I'll add PeterZ to the next repost.

    J

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 08:46:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 08:46:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE110-0002jK-EM; Wed, 12 Oct 2011 08:46:42 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE10Y-0002XC-Ed
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 08:46:14 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318434342!52540627!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16812 invoked from network); 12 Oct 2011 15:45:43 -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; 12 Oct 2011 15:45:43 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9CFk11P006462
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Wed, 12 Oct 2011 15:46:03 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9CFe3OM027124
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 15:40:04 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
	p9CFjsOT017311; Wed, 12 Oct 2011 10:45:54 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 12 Oct 2011 08:45:54 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id A76D6157E; Wed, 12 Oct 2011 11:45:49 -0400 (EDT)
Date: Wed, 12 Oct 2011 11:45:49 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
Message-ID: <20111012154549.GB1732@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
	<4E940E21020000780005AA29@nat28.tlf.novell.com>
	<20111011155133.GC29349@phenom.oracle.com>
	<20111011205729.GB22668@phenom.oracle.com>
	<1318416842.21903.674.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318416842.21903.674.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090202.4E95B63C.0084,ss=1,re=0.000,fgs=0
Cc: "hch@infradead.org" <hch@infradead.org>, Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.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 Wed, Oct 12, 2011 at 11:54:02AM +0100, Ian Campbell wrote:
> On Tue, 2011-10-11 at 21:57 +0100, Konrad Rzeszutek Wilk wrote:
> > > My later response to it should include it:
> > > http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00652.html
> > >
> > > >
> > > > Further I wonder why you don't use the "reserved" field instead of
> > > > extending the structure at the end.
> > >
> > > <blinks> I completly missed it. That would definitly work as well.
> > >
> > > Let me redo it with that in mind.
> > 
> > I've posted the Xen hypervisor ABI one that thread above. The implementation
> > of that looks as follow:
> 
> Ian.
> 
> > 
> > commit ae33f998d66c5982af533bda25c2b6c4f863789f
> > Author: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > Date:   Mon Oct 10 10:58:40 2011 -0400
> > 
> >     xen/blk[front|back]: Enhance discard support with secure erasing support.
> > 
> >     Part of the blkdev_issue_discard(xx) operation is that it can also
> >     issue a secure discard operation that will permanantly remove the
> >     sectors in question. We advertise that we can support that via the
> >     'discard-secure' attribute and on the request, if the 'secure' bit
> >     is set, we will attempt to pass in REQ_DISCARD | REQ_SECURE.
> > 
> >     CC: Li Dongyang <lidongyang@novell.com>
> >     [v1: Used 'flag' instead of 'secure:1' bit]
> >     [v2: Use 'reserved 'uint8_t' as a flag]
> >     Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > 
> > diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> > index 94e659d..4f33c13 100644
> > --- a/drivers/block/xen-blkback/blkback.c
> > +++ b/drivers/block/xen-blkback/blkback.c
> > @@ -362,7 +362,7 @@ static int xen_blkbk_map(struct blkif_request *req,
> >  {
> >         struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST];
> >         int i;
> > -       int nseg = req->nr_segments;
> > +       int nseg = req->u1.nr_segments;
> >         int ret = 0;
> > 
> >         /*
> > @@ -422,13 +422,16 @@ 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)
> > +       if (blkif->blk_backend_type == BLKIF_BACKEND_PHY) {
> > +               unsigned long secure = (blkif->vbd.discard_secure &&
> > +                       (req->u1.flag & BLKIF_OP_DISCARD_FLAG_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, 0);
> > -       else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
> > +                               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;
> > @@ -618,6 +621,9 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
> >         struct blk_plug plug;
> >         bool drain = false;
> > 
> > +       /* Check that the number of segments is sane. */
> > +       nseg = req->u1.nr_segments;
> 
> This field is invalid (at least with these semantics) if req->operation
> == BLKIF_OP_DISCARD so reading it here and clearing it later when you
> decide it is invalid is just confusing. Why not read it inside the
> switch iff it is valid?

The problem was that 'nseg' would be read after the switch, so it would
contain the flag value. Which would throw off a lot of the loops which
would try to enumerate "(for (i = 0; i < nseg;...)".


Hence moving it to the top would make it valid for all the operations
except the BLKIF_OP_DISCARD. And BLKIF_OP_DISCARD would sensibly set it
nseg to zero so that we would not trip on those 'for (i = 0').

But I think you idea of making it an if statement would do, like:


> > @@ -643,8 +650,6 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
> >                 break;
> >         }
> > 
            if (operation != REQ_DISCARD)
              /* Check that the number of segments is sane. */
         	nseg = req->nr_segments;
	    else
		nseg = 0;

> >         if (unlikely(nseg == 0 && operation != WRITE_FLUSH &&
> >                                 operation != REQ_DISCARD) ||

And I guess we can also skip the REQ_DISCARD test here.

> >             unlikely(nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST)) {

.. snip..
> handle isn't really only r/w, is it? If it is then I think we should
> just repeat the id fields within the union and pad so the offset is
> correct:
> 
> struct blkif_request {
>     uint8_t        operation;    /* BLKIF_OP_???                         */
>     union {
> 	struct {
> 	    uint8_t        nr_segments;  /* number of segments                   */
> 	    blkif_vdev_t   handle;
> 	    uint64_t       id;           /* private guest value, echoed in resp  */
> 	    blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
> 	    struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
> 	} rw;
> 	struct {
> 	    uint8_t        flags;
> 	    blkif_vdev_t   __pad;       /* was "handle: only for read/write requests */
> 	    uint64_t       id;           /* private guest value, echoed in resp  */
            blkif_sector_t sectore_number;
	    uint64_t nr_sectors;
> 	} discard;

I like that. So much easier to comprehend. Let me spin up a patch for that.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 09:16:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 09:16:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE1Tk-0004LW-Hx; Wed, 12 Oct 2011 09:16:24 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE1Rg-00047b-8v
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 09:14:17 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1318436053!21884350!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22270 invoked from network); 12 Oct 2011 16:14:13 -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;
	12 Oct 2011 16:14:13 -0000
Received: by wyh13 with SMTP id 13so1091495wyh.30
	for <xen-devel@lists.xensource.com>;
	Wed, 12 Oct 2011 09:14:12 -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=KDvrVFeXO/eFXocNCdZKV7Rw91x8zkXeLxlYIikdQ9c=;
	b=r51eiCeuy/N43vVZXWDTAVomB81K1NyHAqsraHom+H6cqtIOzaPOJ0tv/Wq/gn20Cq
	S+7Wz1zsTsgZ4zkhsBIJ9Q1qXonRd1WfT92/EqfRbvrps+rjft6vbUc5K9IFvWGRadQM
	2kkJDmvc1wScLm9TFcNza1A2lyEVCfknnrkCQ=
Received: by 10.216.51.148 with SMTP id b20mr2602770wec.86.1318436052628;
	Wed, 12 Oct 2011 09:14:12 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id o7sm828109wbh.8.2011.10.12.09.14.10
	(version=SSLv3 cipher=OTHER); Wed, 12 Oct 2011 09:14:11 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Wed, 12 Oct 2011 17:14:08 +0100
Subject: Re: [Xen-devel] [PATCH] ns16550: fix poll handling regression
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CABB7B60.326FE%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] ns16550: fix poll handling regression
Thread-Index: AcyI+fg+kjpy6lqo9EKfR8gS06CCTA==
In-Reply-To: <4E95D0EB020000780005AE7D@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 12/10/2011 16:39, "Jan Beulich" <JBeulich@suse.com> wrote:

> Prior to c/s 23811:f1349a968a5a LSR_THRE was checked only once, while
> there it got promoted into the surrounding loop's condition. Since that
> bit may not clear for an extended period of time (i.e. when no new
> output is generated), it must not be used in this way indefinitely.

That particular part of 23811 was gratuitous on my part, as well as being
wrong. I've simply reverted it, as c/s 23948. Thanks for spotting it or
tracking it down!

 -- Keir

> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> --- a/xen/drivers/char/ns16550.c
> +++ b/xen/drivers/char/ns16550.c
> @@ -157,15 +157,18 @@ static void __ns16550_poll(struct cpu_us
>  {
>      struct serial_port *port = this_cpu(poll_port);
>      struct ns16550 *uart = port->uart;
> -    char lsr;
> +    unsigned char lsr, mask = LSR_DR | LSR_THRE;
>  
>      if ( uart->intr_works )
>          return; /* Interrupts work - no more polling */
>  
> -    while ( (lsr = ns_read_reg(uart, LSR)) & (LSR_DR|LSR_THRE) )
> +    while ( (lsr = ns_read_reg(uart, LSR)) & mask )
>      {
>          if ( lsr & LSR_THRE )
> +        {
>              serial_tx_interrupt(port, regs);
> +            mask &= ~LSR_THRE;
> +        }
>          if ( lsr & LSR_DR )
>              serial_rx_interrupt(port, regs);
>      }
> 
> 
> 
> 
> _______________________________________________
> 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 Oct 12 09:17:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 09:17:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE1Uu-0004kN-M9; Wed, 12 Oct 2011 09:17:36 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE1SP-00048D-Ou
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 09:15:06 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1318436098!20204506!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8418 invoked from network); 12 Oct 2011 16:14:58 -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;
	12 Oct 2011 16:14:58 -0000
X-IronPort-AV: E=Sophos;i="4.69,335,1315180800"; 
   d="scan'208";a="8354121"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 16:14:57 +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, 12 Oct 2011 17:14:57 +0100
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Wed, 12 Oct 2011 17:14:57 +0100
In-Reply-To: <20111012154549.GB1732@phenom.oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
	<4E940E21020000780005AA29@nat28.tlf.novell.com>
	<20111011155133.GC29349@phenom.oracle.com>
	<20111011205729.GB22668@phenom.oracle.com>
	<1318416842.21903.674.camel@zakaz.uk.xensource.com>
	<20111012154549.GB1732@phenom.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: <1318436097.21903.762.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "hch@infradead.org" <hch@infradead.org>, Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.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 Wed, 2011-10-12 at 16:45 +0100, Konrad Rzeszutek Wilk wrote:
> On Wed, Oct 12, 2011 at 11:54:02AM +0100, Ian Campbell wrote:
> > On Tue, 2011-10-11 at 21:57 +0100, Konrad Rzeszutek Wilk wrote:
> > > > My later response to it should include it:
> > > > http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00652.html
> > > >
> > > > >
> > > > > Further I wonder why you don't use the "reserved" field instead of
> > > > > extending the structure at the end.
> > > >
> > > > <blinks> I completly missed it. That would definitly work as well.
> > > >
> > > > Let me redo it with that in mind.
> > > 
> > > I've posted the Xen hypervisor ABI one that thread above. The implementation
> > > of that looks as follow:
> > 
> > Ian.
> > 
> > > 
> > > commit ae33f998d66c5982af533bda25c2b6c4f863789f
> > > Author: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > > Date:   Mon Oct 10 10:58:40 2011 -0400
> > > 
> > >     xen/blk[front|back]: Enhance discard support with secure erasing support.
> > > 
> > >     Part of the blkdev_issue_discard(xx) operation is that it can also
> > >     issue a secure discard operation that will permanantly remove the
> > >     sectors in question. We advertise that we can support that via the
> > >     'discard-secure' attribute and on the request, if the 'secure' bit
> > >     is set, we will attempt to pass in REQ_DISCARD | REQ_SECURE.
> > > 
> > >     CC: Li Dongyang <lidongyang@novell.com>
> > >     [v1: Used 'flag' instead of 'secure:1' bit]
> > >     [v2: Use 'reserved 'uint8_t' as a flag]
> > >     Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > > 
> > > diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> > > index 94e659d..4f33c13 100644
> > > --- a/drivers/block/xen-blkback/blkback.c
> > > +++ b/drivers/block/xen-blkback/blkback.c
> > > @@ -362,7 +362,7 @@ static int xen_blkbk_map(struct blkif_request *req,
> > >  {
> > >         struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST];
> > >         int i;
> > > -       int nseg = req->nr_segments;
> > > +       int nseg = req->u1.nr_segments;
> > >         int ret = 0;
> > > 
> > >         /*
> > > @@ -422,13 +422,16 @@ 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)
> > > +       if (blkif->blk_backend_type == BLKIF_BACKEND_PHY) {
> > > +               unsigned long secure = (blkif->vbd.discard_secure &&
> > > +                       (req->u1.flag & BLKIF_OP_DISCARD_FLAG_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, 0);
> > > -       else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
> > > +                               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;
> > > @@ -618,6 +621,9 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
> > >         struct blk_plug plug;
> > >         bool drain = false;
> > > 
> > > +       /* Check that the number of segments is sane. */
> > > +       nseg = req->u1.nr_segments;
> > 
> > This field is invalid (at least with these semantics) if req->operation
> > == BLKIF_OP_DISCARD so reading it here and clearing it later when you
> > decide it is invalid is just confusing. Why not read it inside the
> > switch iff it is valid?
> 
> The problem was that 'nseg' would be read after the switch, so it would
> contain the flag value. Which would throw off a lot of the loops which
> would try to enumerate "(for (i = 0; i < nseg;...)".
> 
> 
> Hence moving it to the top would make it valid for all the operations
> except the BLKIF_OP_DISCARD. And BLKIF_OP_DISCARD would sensibly set it
> nseg to zero so that we would not trip on those 'for (i = 0').

I think this is the crux of the problem: setting nsegs to an invalid
value just so you can clear it again later when you check the op is
completely backwards and confusing to any reader of the code.

> But I think you idea of making it an if statement would do, like:
> 
> 
> > > @@ -643,8 +650,6 @@ static int dispatch_rw_block_io(struct xen_blkif *blkif,
> > >                 break;
> > >         }
> > > 
>             if (operation != REQ_DISCARD)
>               /* Check that the number of segments is sane. */
>          	nseg = req->nr_segments;
> 	    else
> 		nseg = 0;

Right above this hunk is a switch statement over the req->operation. The
value of req->operation precisely defines the semantics/validity or
otherwise of the req->nr_segments field and whether or not it contains
the nr of segments or (due to the aliasing) something else. Why not set
nsegs inside that switch statement (and explicitly zero it in the other
cases) so that this obvious connection is retained?

> > >         if (unlikely(nseg == 0 && operation != WRITE_FLUSH &&
> > >                                 operation != REQ_DISCARD) ||
> 
> And I guess we can also skip the REQ_DISCARD test here.

I don't think so, if nseg == 0 and operation == REQ_DISCARD that is
fine, right? The fact that there is all this "operation != xx &&
operation != yy" conditional stuff suggests this would also be cleaner
if it was also pulled up into the existing switch over req->operation.
IOW overall you end up with:

	switch (req->operation) {
	case BLKIF_OP_READ:
		blkif->st_rd_req++;
		operation = READ;
		nseg = req->nr_segments;
		if (unlikely(nseg == 0 || nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST)) {
			pr_debug(DRV_PFX "Bad number of segments in read request (%d)\n",
				 nseg);
			/* Haven't submitted any bio's yet. */
			goto fail_response;
		}
		break;
	case BLKIF_OP_WRITE:
		blkif->st_wr_req++;
		operation = WRITE_ODIRECT;
		nseg = req->nr_segments;
		if (unlikely(nseg == 0 || nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST)) {
			pr_debug(DRV_PFX "Bad number of segments in write request (%d)\n",
				 nseg);
			/* Haven't submitted any bio's yet. */
			goto fail_response;
		}
		break;
	case BLKIF_OP_FLUSH_DISKCACHE:
		blkif->st_f_req++;
		operation = WRITE_FLUSH;
		nseg = req->nr_segments;
		/* nseg == 0 is ok here */
		if (unlikely(nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST)) {
			pr_debug(DRV_PFX "Bad number of segments in write/flush-cache request (%d)\n",
				 nseg);
			/* Haven't submitted any bio's yet. */
			goto fail_response;
		}
		break;
	case BLKIF_OP_DISCARD:
		blkif->st_some_stat++;
		operation = REQ_DISCARD;
		nseg = 0; /* No data associated with a discard */
		break;
	case BLKIF_OP_WRITE_BARRIER:
	default:
		operation = 0; /* make gcc happy */
		goto fail_response;
		break;
	}

(I think I'm right that BLKIF_OP_FLUSH_DISKCACHE can have associated
data or not)

However do discard and r/w really have so much in common that handling
them all in dispatch_rw_block_io() and relying on nsegs == 0 when the
operation is discard makes sense?

Would it be clearer if the caller (__do_block_io_op) had this switch
over req->operation and called dispatch_rw_block_io(req, WRITE_FLUSH,
nsegs), dispatch_discard(req) etc as appropriate?

Ian.


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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 09:34:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 09:34:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE1ko-0005PC-BR; Wed, 12 Oct 2011 09:34:02 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE1jS-0005Ah-Oe
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 09:32:41 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1318437155!35000980!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23507 invoked from network); 12 Oct 2011 16:32:35 -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;
	12 Oct 2011 16:32:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,335,1315180800"; 
   d="scan'208";a="8354447"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 16:32: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;
	Wed, 12 Oct 2011 17:32:11 +0100
Subject: Re: [Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming
	domain 0
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Wed, 12 Oct 2011 17:32:11 +0100
In-Reply-To: <4E94582C.4060305@tycho.nsa.gov>
References: <1317824920-639-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20109.60188.905267.410813@mariner.uk.xensource.com>
	<4E8DF425.9000807@tycho.nsa.gov>
	<1317973956.21903.281.camel@zakaz.uk.xensource.com>
	<4E8F2AD0.2060904@tycho.nsa.gov>
	<1318251283.21903.424.camel@zakaz.uk.xensource.com>
	<4E94582C.4060305@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318437131.21903.775.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 Tue, 2011-10-11 at 15:52 +0100, Daniel De Graaf wrote:
> On 10/10/2011 08:54 AM, Ian Campbell wrote:
> > On Fri, 2011-10-07 at 17:37 +0100, Daniel De Graaf wrote:
> >> On 10/07/2011 03:52 AM, Ian Campbell wrote:
> >>> On Thu, 2011-10-06 at 19:32 +0100, Daniel De Graaf wrote:
> >>>> On 10/06/2011 01:53 PM, Ian Jackson wrote:
> >>>>> Daniel De Graaf writes ("[Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming domain 0"):
> >>>>>> The xenbus event channel established in xenbus_init is intended to be a
> >>>>>> loopback channel, but the remote domain was hardcoded to 0; this will
> >>>>>> cause the channel to be unusable when xenstore is not being run in
> >>>>>> domain 0.
> >>>>>
> >>>>> I'm not sure I understand this.
> >>>>>
> >>>>> ...
> >>>>>>  		/* Next allocate a local port which xenstored can bind to */
> >>>>>>  		alloc_unbound.dom        = DOMID_SELF;
> >>>>>> -		alloc_unbound.remote_dom = 0;
> >>>>>> +		alloc_unbound.remote_dom = DOMID_SELF;
> >>>>>
> >>>>> The comment doesn't suggest that this is supposedly a loopback channel
> >>>>> (ie one for use by the xenbus client for signalling to itself,
> >>>>> somehow).
> >>>>
> >>>> The event channel being changed here is a loopback event channel exposed in
> >>>> /proc/xen/xsd_port, which xenstored binds to. This code is only used for the
> >>>> initial domain; otherwise, the shared info page is used.
> >>>
> >>> How does this change impact the regular dom0? It will be expecting a
> >>> xenstored to startup locally when in reality it actually needs to wait
> >>> for another domain and then connect to that.
> >>
> >> This change does not attempt to address the regular dom0, except for not
> >> breaking existing setups where xenstored resides in dom0.
> >>
> >>> Diego Ongaro did some work several years ago on this issue, it was most
> >>> recently re-posted by Alex Zeffert, patches against xen-unstable and the
> >>> linux-2.6.18 tree:
> >>> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01484.html
> >>> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01488.html
> >>>
> >>> Part of the trick was to fixup the kernel side in a way which was
> >>> compatible with both existing Xen releases while also supporting new
> >>> releases which support both stub and non-stub xenstore. To do this Diego
> >>> setup a lazy xenbus initialisation with a state machine to track which
> >>> case was active, with transitions triggered either from the local-mmap
> >>> of /proc/xen/xenbus_xsd (so was backwards compatible) or an ioctl called
> >>> by the tool which builds the stub domain to tell the dom0 xenbus code
> >>> which domain/mfn/evtchn contains the xenstored and dom0's connection to
> >>> it (the patcheset includes a cut-down builder which works without
> >>> xenstore).
> >>>
> >>> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01487.html
> >>> is the key kernel side patch in that regard.
> >>>
> >>> Diego did some initial work with xenstored in a Linux domU, but I think
> >>> the final patchset was stub-xenstored (i.e. ocaml xenstored on minios,
> >>> possibly C xenstored on minios too), so I'm not sure about the xenstored
> >>> in Linux domU use case.
> >>>
> >>> Some of the more trivial bits of this series were committed but the real
> >>> meat wasn't really pushed through.
> >>>
> >>
> >> Thanks for pointing out that series; I hadn't seen it yet. The setup I am
> >> currently using has a non-Linux dom0, so the state machine in dom0 was not
> >> required. A separate minios-based xenstored is the eventual goal; this patch
> >> just avoids creating a broken event channel in an initial domain whose
> >> domain ID is not 0.
> > 
> > Although I suspect it was envisaged when the API was written I don't
> > think SIF_INITDOMAIN can actually be used (or redefined) to mean
> > anything other than dom0 in practice without a whole host of knock-on
> > effects and breakage.
> > 
> > Setting SIF_INITDOMAIN has effects other than xenstore setup on a Linux
> > domU, grepping for other uses of xen_initial_domain() shows loads of
> > them. e.g. the selection of host vs. pseudo-physical e820, various
> > driver setup stuff, some pagetable features, how the console works etc.
> 
> Yes; splitting up driver domains requires changing a number of users of
> xen_initial_domain to become more fine-grained. Some disaggregation work[1]
> requires splitting the SIF_INITDOMAIN flag into a series of finer-grained
> flags that includes one for xenstore; this becomes unnecessary if xenstore
> detection code does not check SIF_INITDOMAIN.
> 
> This patch covers a few cases:
> 
> 1) Dom0 is Linux, xenstored runs in Dom0
> 2) Dom0 is domain builder, creating another SIF_INITDOMAIN Linux domain with
>    a nonzero domain ID that runs xenstore and other functions
> 3) Dom0 is domain builder, creating xenstore and a SIF_INITDOMAIN Linux
>    domain that uses the external xenstore.
> 
> The second and third case require fairly intrusive hypervisor patches,

What sort of hypervisor patches?

I'm not convinced that the concept of "another SIF_INITDOMAIN" is
possible. Certainly you might have other domains which have some
privileges which have previously been associated with the domain whose
ID is 0, but that does not imply that you should/can literally pass
SIF_INITDOMAIN to those domains.

>  but
> the only Linux change required for the second case is the posted fix to the
> loopback event channel.

Unless dom0 is also running Linux? In which case it has no way to talk
to the xenstored in the second domain?

Does the kernel the the "another SIF_INITDOMAIN" not get quite upset wrt
it's ability to see physical hardware and such, which it will be
confused about because you've given it SIF_INITDOMAIN?

> [1] "Breaking Up is Hard to Do: Security and Functionality in a Commodity
> Hypervisor" (SOSP 11)
> 
> > 
> >> I do have a more complex version of this patch that replaces the initial
> >> domain check with a check on the start_info structure so that an initial
> >> domain can have xenstore information placed in its start_info field like
> >> any other domain; would this be of interest?
> > 
> > If you already have something then it would be interesting to see.
> > 
> > Ian.
> > 
> 
> This patch eliminates xen_initial_domain() checks when initializing
> xenstore, replacing them with checks on the event channel in the
> start_info page.

In your scenario 2 and 3 then with this patch the dom0 kernel will see
no evtchn in start_info page but there appears to be no mechanism for
poking down the evtchn/mfn for dom0 to use to communicate with the
xenstored domain.

I think that a combination of this patch and Diego's stuff (reapplied to
your xenstored_local_init case) would catch all those combinations and
work for both the real dom0 (with or without xenstored in it) and also a
domN Linux domain running xenstored too. I think this patch by itself
doesn't make any existing cases wrong nor make adding Diego's stuff in
the future any harder.

How does the xenstored running in the second domain get the necessary
page/evtchn numbers to allow it to communicate with dom0?
 
I assume it is guaranteed that xen_start_info->store_evtchn == 0 (and
presumably xen_start_info->store_mfn == 0) for the real dom0?

Ian.

> 
> ---
> 
> diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
> index bd2f90c..cef9b0b 100644
> --- a/drivers/xen/xenbus/xenbus_probe.c
> +++ b/drivers/xen/xenbus/xenbus_probe.c
> @@ -684,64 +684,74 @@ static int __init xenbus_probe_initcall(void)
>  
>  device_initcall(xenbus_probe_initcall);
>  
> -static int __init xenbus_init(void)
> +/* Set up event channel for xenstored which is run as a local process
> + * (this is normally used only in dom0)
> + */
> +static int __init xenstored_local_init(void)
>  {
>  	int err = 0;
>  	unsigned long page = 0;
> +	struct evtchn_alloc_unbound alloc_unbound;
>  
> -	DPRINTK("");
> +	/* Allocate Xenstore page */
> +	page = get_zeroed_page(GFP_KERNEL);
> +	if (!page)
> +		goto out_err;
>  
> -	err = -ENODEV;
> -	if (!xen_domain())
> -		return err;
> +	xen_store_mfn = xen_start_info->store_mfn =
> +		pfn_to_mfn(virt_to_phys((void *)page) >>
> +			   PAGE_SHIFT);
>  
> -	/*
> -	 * Domain0 doesn't have a store_evtchn or store_mfn yet.
> -	 */
> -	if (xen_initial_domain()) {
> -		struct evtchn_alloc_unbound alloc_unbound;
> +	/* Next allocate a local port which xenstored can bind to */
> +	alloc_unbound.dom        = DOMID_SELF;
> +	alloc_unbound.remote_dom = DOMID_SELF;
>  
> -		/* Allocate Xenstore page */
> -		page = get_zeroed_page(GFP_KERNEL);
> -		if (!page)
> -			goto out_error;
> +	err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
> +					  &alloc_unbound);
> +	if (err == -ENOSYS)
> +		goto out_err;
>  
> -		xen_store_mfn = xen_start_info->store_mfn =
> -			pfn_to_mfn(virt_to_phys((void *)page) >>
> -				   PAGE_SHIFT);
> +	BUG_ON(err);
> +	xen_store_evtchn = xen_start_info->store_evtchn =
> +		alloc_unbound.port;
>  
> -		/* Next allocate a local port which xenstored can bind to */
> -		alloc_unbound.dom        = DOMID_SELF;
> -		alloc_unbound.remote_dom = 0;
> +	return 0;
>  
> -		err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
> -						  &alloc_unbound);
> -		if (err == -ENOSYS)
> -			goto out_error;
> + out_err:
> +	if (page != 0)
> +		free_page(page);
> +	return err;
> +}
>  
> -		BUG_ON(err);
> -		xen_store_evtchn = xen_start_info->store_evtchn =
> -			alloc_unbound.port;
> +static int __init xenbus_init(void)
> +{
> +	int err = 0;
>  
> -		xen_store_interface = mfn_to_virt(xen_store_mfn);
> +	if (!xen_domain())
> +		return -ENODEV;
> +
> +	if (xen_hvm_domain()) {
> +		uint64_t v = 0;
> +		err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
> +		if (err)
> +			goto out_error;
> +		xen_store_evtchn = (int)v;
> +		err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v);
> +		if (err)
> +			goto out_error;
> +		xen_store_mfn = (unsigned long)v;
> +		xen_store_interface = ioremap(xen_store_mfn << PAGE_SHIFT, PAGE_SIZE);
>  	} else {
> -		if (xen_hvm_domain()) {
> -			uint64_t v = 0;
> -			err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
> -			if (err)
> -				goto out_error;
> -			xen_store_evtchn = (int)v;
> -			err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v);
> +		xen_store_evtchn = xen_start_info->store_evtchn;
> +		xen_store_mfn = xen_start_info->store_mfn;
> +		if (xen_store_evtchn)
> +			xenstored_ready = 1;
> +		else {
> +			err = xenstored_local_init();
>  			if (err)
>  				goto out_error;
> -			xen_store_mfn = (unsigned long)v;
> -			xen_store_interface = ioremap(xen_store_mfn << PAGE_SHIFT, PAGE_SIZE);
> -		} else {
> -			xen_store_evtchn = xen_start_info->store_evtchn;
> -			xen_store_mfn = xen_start_info->store_mfn;
> -			xen_store_interface = mfn_to_virt(xen_store_mfn);
> -			xenstored_ready = 1;
>  		}
> +		xen_store_interface = mfn_to_virt(xen_store_mfn);
>  	}
>  
>  	/* Initialize the interface to xenstore. */
> @@ -760,12 +770,7 @@ static int __init xenbus_init(void)
>  	proc_mkdir("xen", NULL);
>  #endif
>  
> -	return 0;
> -
> -  out_error:
> -	if (page != 0)
> -		free_page(page);
> -
> + out_error:
>  	return err;
>  }
>  
> 



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 09:57:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 09:57:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE27m-00074A-Tn; Wed, 12 Oct 2011 09:57:46 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE26p-0006qI-Q6
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 09:56:48 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1318438603!34989440!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28196 invoked from network); 12 Oct 2011 16:56:44 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2011 16:56:44 -0000
Received: by qabg14 with SMTP id g14so1464102qab.30
	for <xen-devel@lists.xensource.com>;
	Wed, 12 Oct 2011 09:56:43 -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
	:content-transfer-encoding;
	bh=NjhDpsSn9C8pW6Ip9O0ctAwaNWlVmo7Zwv8951OmBrw=;
	b=LVZjHQ/XZja3jM5DOb92IKiFK+CnF6HVu7PIOcfDSP/2FyT/AN3ECjSlSukVcO79WH
	oZPCYnqoDhcgMJQO59dm2DyG2uAF/NJSvpDRkuyytK1YKv0bkREDoeiLddV6gTxRy3qV
	KFm4MJVJUNFSQSx1oXyieS3nunwBS/2oLAn9M=
Received: by 10.224.111.77 with SMTP id r13mr19645479qap.28.1318438603102;
	Wed, 12 Oct 2011 09:56:43 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.224.28.142 with HTTP; Wed, 12 Oct 2011 09:56:13 -0700 (PDT)
In-Reply-To: <4E8B4EA5.8060800@web.de>
References: <1317739882-4809-1-git-send-email-anthony.perard@citrix.com>
	<1317739882-4809-2-git-send-email-anthony.perard@citrix.com>
	<4E8B4EA5.8060800@web.de>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Wed, 12 Oct 2011 17:56:13 +0100
X-Google-Sender-Auth: iChBUpHrF_CZ5-xxRbftPwg7PGk
Message-ID: <CAJJyHjJhrhJipsiqDGQ55VUcU2++hq_mpnGg4uNLL5WRtW_RPQ@mail.gmail.com>
To: Jan Kiszka <jan.kiszka@web.de>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Alex Williamson <alex.williamson@redhat.com>,
	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 RFC V1 01/11] Introduce
 HostPCIDevice to access a pci device on the 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

On Tue, Oct 4, 2011 at 19:21, Jan Kiszka <jan.kiszka@web.de> wrote:
> This wasn't run through checkpatch.pl, I bet.
>
> On 2011-10-04 16:51, Anthony PERARD wrote:
>> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>> ---
>> =C2=A0hw/host-pci-device.c | =C2=A0192 +++++++++++++++++++++++++++++++++=
+++++++++++++++++
>> =C2=A0hw/host-pci-device.h | =C2=A0 36 +++++++++
>> =C2=A02 files changed, 228 insertions(+), 0 deletions(-)
>> =C2=A0create mode 100644 hw/host-pci-device.c
>> =C2=A0create mode 100644 hw/host-pci-device.h
>>
>> diff --git a/hw/host-pci-device.c b/hw/host-pci-device.c
>> new file mode 100644
>> index 0000000..b3f2899
>> --- /dev/null
>> +++ b/hw/host-pci-device.c
>> @@ -0,0 +1,192 @@
>> +#include "qemu-common.h"
>> +#include "host-pci-device.h"
>> +
>> +static int path_to(const HostPCIDevice *d,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 const c=
har *name, char *buf, ssize_t size)
>> +{
>> + =C2=A0 =C2=A0return snprintf(buf, size, "/sys/bus/pci/devices/%04x:%02=
x:%02x.%x/%s",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d=
->domain, d->bus, d->dev, d->func, name);
>> +}
>> +
>> +static int get_resource(HostPCIDevice *d)
>> +{
>> + =C2=A0 =C2=A0int i;
>> + =C2=A0 =C2=A0FILE *f;
>> + =C2=A0 =C2=A0char path[PATH_MAX];
>> + =C2=A0 =C2=A0unsigned long long start, end, flags, size;
>> +
>> + =C2=A0 =C2=A0path_to(d, "resource", 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;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0for (i =3D 0; i < PCI_NUM_REGIONS; i++) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (fscanf(f, "%llx %llx %llx", &start, &en=
d, &flags) !=3D 3) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, "Error: Synta=
x error in %s\n", path);
>> + =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=A0if (start) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0size =3D end - start + 1;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0size =3D 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0flags &=3D 0xf;
>
> No magic numbers please.
>
> It also looks a bit strange to me: It's the resource type encoded in the
> second byte? Aren't you interested in it?

Actually, we are interessted to have the BAR with the different flags
(IO/MEM, prefetch, size) like the value in the config space. Because
the base_address value will be given to the VM (by the function
pt_bar_reg_read). But I can later merge the values (start | (flags &
~pci_base_address_io/mem_mask)), and have the right value to give
back.

So here, I will keep seperate the base address, and the flags.

>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (i < PCI_ROM_SLOT) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d->base_addr[i] =3D start | f=
lags;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d->size[i] =3D size;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d->rom_base_addr =3D start | =
flags;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d->rom_size =3D size;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0fclose(f);
>> + =C2=A0 =C2=A0return 0;
>> +}
>> +
>> +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;
>> + =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;
>> +}
>> +
>> +static int host_pci_config_fd(HostPCIDevice *d)
>
> [ We will also need the reverse: pass in open file descriptors that
> HostPCIDevice should use. Can be added later. ]
>
>> +{
>> + =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_read_byte(HostPCIDevice *d, int pos)
>> +{
>> + =C2=A0uint8_t buf;
>> + =C2=A0host_pci_config_read(d, pos, &buf, 1);
>> + =C2=A0return buf;
>> +}
>> +uint16_t host_pci_read_word(HostPCIDevice *d, int pos)
>> +{
>> + =C2=A0uint16_t buf;
>> + =C2=A0host_pci_config_read(d, pos, &buf, 2);
>> + =C2=A0return le16_to_cpu(buf);
>> +}
>> +uint32_t host_pci_read_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_read_block(HostPCIDevice *d, int pos, uint8_t *buf, int le=
n)
>> +{
>> + =C2=A0return host_pci_config_read(d, pos, buf, len);
>> +}
>> +
>> +int host_pci_write_byte(HostPCIDevice *d, int pos, uint8_t data)
>> +{
>> + =C2=A0return host_pci_config_write(d, pos, &data, 1);
>> +}
>> +int host_pci_write_word(HostPCIDevice *d, int pos, uint16_t data)
>> +{
>> + =C2=A0return host_pci_config_write(d, pos, &data, 2);
>
> You adjust endianess on read, but not on write.

Will fix that.

>> +}
>> +int host_pci_write_long(HostPCIDevice *d, int pos, uint32_t data)
>> +{
>> + =C2=A0return host_pci_config_write(d, pos, &data, 4);
>> +}
>> +int host_pci_write_block(HostPCIDevice *d, int pos, uint8_t *buf, int l=
en)
>> +{
>> + =C2=A0return host_pci_config_write(d, pos, buf, len);
>> +}
>> +
>> +HostPCIDevice *host_pci_device_get(uint8_t bus, uint8_t dev, uint8_t fu=
nc)
>> +{
>> + =C2=A0 =C2=A0HostPCIDevice *d =3D NULL;
>> +
>> + =C2=A0 =C2=A0d =3D g_new0(HostPCIDevice, 1);
>> +
>> + =C2=A0 =C2=A0d->config_fd =3D -1;
>> + =C2=A0 =C2=A0d->domain =3D 0;
>> + =C2=A0 =C2=A0d->bus =3D bus;
>> + =C2=A0 =C2=A0d->dev =3D dev;
>> + =C2=A0 =C2=A0d->func =3D func;
>> +
>> + =C2=A0 =C2=A0if (host_pci_config_fd(d) =3D=3D -1)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto error;
>> + =C2=A0 =C2=A0if (get_resource(d) =3D=3D -1)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto error;
>> +
>> + =C2=A0 =C2=A0d->vendor_id =3D get_value(d, "vendor");
>> + =C2=A0 =C2=A0d->device_id =3D get_value(d, "device");
>> + =C2=A0 =C2=A0d->is_virtfn =3D pci_dev_is_virtfn(d);
>> +
>> + =C2=A0 =C2=A0return d;
>> +error:
>> + =C2=A0 =C2=A0if (d->config_fd >=3D 0)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0close(d->config_fd);
>> + =C2=A0 =C2=A0g_free(d);
>> + =C2=A0 =C2=A0return NULL;
>> +}
>> diff --git a/hw/host-pci-device.h b/hw/host-pci-device.h
>> new file mode 100644
>> index 0000000..0137507
>> --- /dev/null
>> +++ b/hw/host-pci-device.h
>> @@ -0,0 +1,36 @@
>> +#ifndef HW_HOST_PCI_DEVICE
>> +# =C2=A0define HW_HOST_PCI_DEVICE
>> +
>> +#include "pci.h"
>> +
>> +typedef struct HostPCIDevice {
>> + =C2=A0 =C2=A0uint16_t domain;
>> + =C2=A0 =C2=A0uint8_t bus;
>> + =C2=A0 =C2=A0uint8_t dev;
>> + =C2=A0 =C2=A0uint8_t func;
>> +
>> + =C2=A0 =C2=A0uint16_t vendor_id;
>> + =C2=A0 =C2=A0uint16_t device_id;
>> +
>> + =C2=A0 =C2=A0pcibus_t base_addr[PCI_NUM_REGIONS - 1];
>> + =C2=A0 =C2=A0pcibus_t size[PCI_NUM_REGIONS - 1];
>> + =C2=A0 =C2=A0pcibus_t rom_base_addr;
>> + =C2=A0 =C2=A0pcibus_t rom_size;
>
> Regions deserve their own type IMHO. In KVM we have
>
> typedef struct {
> =C2=A0 =C2=A0int type; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Memory or po=
rt I/O */
> =C2=A0 =C2=A0int valid;
> =C2=A0 =C2=A0uint32_t base_addr;
> =C2=A0 =C2=A0uint32_t size; =C2=A0 =C2=A0/* size of the region */
> =C2=A0 =C2=A0int resource_fd;
> } PCIRegion;
>
> Should probably become HostPCIIORegion (vs. virtual PCIIORegion), and
> our field types need some cleanups.

I will do that, but I think to have only base_addr, size and flags.
flags will be the flags given by the sysfs resource file. Is that OK ?

>> +
>> + =C2=A0 =C2=A0bool is_virtfn;
>> +
>> + =C2=A0 =C2=A0int config_fd;
>> +} HostPCIDevice;
>> +
>> +HostPCIDevice *host_pci_device_get(uint8_t bus, uint8_t dev, uint8_t fu=
nc);
>
> And what about some host_pci_device_put when we're done with it?

Will do it.

>> +
>> +uint8_t host_pci_read_byte(HostPCIDevice *d, int pos);
>> +uint16_t host_pci_read_word(HostPCIDevice *d, int pos);
>> +uint32_t host_pci_read_long(HostPCIDevice *d, int pos);
>> +int host_pci_read_block(HostPCIDevice *d, int pos, uint8_t *buf, int le=
n);
>> +int host_pci_write_byte(HostPCIDevice *d, int pos, uint8_t data);
>> +int host_pci_write_word(HostPCIDevice *d, int pos, uint16_t data);
>> +int host_pci_write_long(HostPCIDevice *d, int pos, uint32_t data);
>> +int host_pci_write_block(HostPCIDevice *d, int pos, uint8_t *buf, int l=
en);
>
> I think these should be analogous to our pci layer:
> host_pci_get/set_byte/word/long/quad.

Yes, I will change that.

> Looks like it's generally useful for KVM as well.

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 Wed Oct 12 10:31:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 10:31:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE2ee-0000Hl-4W; Wed, 12 Oct 2011 10:31:44 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE2e9-00005r-3O
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 10:31:13 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1318440668!35007721!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5385 invoked from network); 12 Oct 2011 17:31:09 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 17:31:09 -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
	p9CHUwYw025373
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 12 Oct 2011 17:31:00 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
	p9CHUvEQ026012
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 17:30:58 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
	p9CHUq8j025171; Wed, 12 Oct 2011 12:30:52 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 12 Oct 2011 10:30:52 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id F41B91582; Wed, 12 Oct 2011 13:21:30 -0400 (EDT)
Date: Wed, 12 Oct 2011 13:21:30 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
Message-ID: <20111012172130.GC1732@phenom.oracle.com>
References: <1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
	<4E940E21020000780005AA29@nat28.tlf.novell.com>
	<20111011155133.GC29349@phenom.oracle.com>
	<20111011205729.GB22668@phenom.oracle.com>
	<1318416842.21903.674.camel@zakaz.uk.xensource.com>
	<20111012154549.GB1732@phenom.oracle.com>
	<1318436097.21903.762.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318436097.21903.762.camel@zakaz.uk.xensource.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.0A090202.4E95CED5.009D:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "hch@infradead.org" <hch@infradead.org>, Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.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

> >             if (operation != REQ_DISCARD)
> >               /* Check that the number of segments is sane. */
> >          	nseg = req->nr_segments;
> > 	    else
> > 		nseg = 0;
> 
> Right above this hunk is a switch statement over the req->operation. The
> value of req->operation precisely defines the semantics/validity or
> otherwise of the req->nr_segments field and whether or not it contains
> the nr of segments or (due to the aliasing) something else. Why not set
> nsegs inside that switch statement (and explicitly zero it in the other
> cases) so that this obvious connection is retained?

Sure.
> 
> > > >         if (unlikely(nseg == 0 && operation != WRITE_FLUSH &&
> > > >                                 operation != REQ_DISCARD) ||
> > 
> > And I guess we can also skip the REQ_DISCARD test here.
> 
> I don't think so, if nseg == 0 and operation == REQ_DISCARD that is
> fine, right? The fact that there is all this "operation != xx &&

<nods>

..snip..
> (I think I'm right that BLKIF_OP_FLUSH_DISKCACHE can have associated
> data or not)

You are right.
> 
> However do discard and r/w really have so much in common that handling
> them all in dispatch_rw_block_io() and relying on nsegs == 0 when the
> operation is discard makes sense?
> 
> Would it be clearer if the caller (__do_block_io_op) had this switch
> over req->operation and called dispatch_rw_block_io(req, WRITE_FLUSH,
> nsegs), dispatch_discard(req) etc as appropriate?

Potentially. It would cut down on this functions bloated size so that
is a definite plus.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 11:20:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 11:20:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE3PM-0002Nc-7d; Wed, 12 Oct 2011 11:20:00 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE3Ow-0002Bb-F3
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 11:19:34 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318443569!753446!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30304 invoked from network); 12 Oct 2011 18:19:31 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-14.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 18:19:31 -0000
Received: from tazenda.hos.anvin.org ([IPv6:2001:470:861f::feed:face:f00d])
	(authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9CIIKmm025897
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 11:18:21 -0700
Message-ID: <4E95D9E7.6090304@zytor.com>
Date: Wed, 12 Oct 2011 11:18:15 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Borislav Petkov <bp@amd64.org>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
In-Reply-To: <20111012101615.GA14966@aftab>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 03:16 AM, Borislav Petkov wrote:
> 
> Why would a xen microcode solution would even be contingent on how
> upstream Linux solves it (and when)?
> 

Agreed... especially since Xen is "special" when it comes to booting anyway.

	-hpa

-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 11:45:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 11:45:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE3oB-0003Mh-3l; Wed, 12 Oct 2011 11:45:40 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE3n7-00039X-Ef; Wed, 12 Oct 2011 11:44:33 -0700
X-Env-Sender: joseph.glanville@orionvm.com.au
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318445068!740110!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13188 invoked from network); 12 Oct 2011 18:44:29 -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;
	12 Oct 2011 18:44:29 -0000
Received: by iaen33 with SMTP id n33so424026iae.30
	for <multiple recipients>; Wed, 12 Oct 2011 11:44:28 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.231.0.217 with SMTP id 25mr141755ibc.4.1318445067925; Wed, 12
	Oct 2011 11:44:27 -0700 (PDT)
Received: by 10.231.202.211 with HTTP; Wed, 12 Oct 2011 11:44:27 -0700 (PDT)
X-Originating-IP: [59.167.234.130]
In-Reply-To: <4E946EB9.7050209@xen.org>
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org>
	<20111003185309.GC15608@phenom.oracle.com>
	<4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
Date: Thu, 13 Oct 2011 05:44:27 +1100
Message-ID: <CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
Subject: Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Joseph Glanville <joseph.glanville@orionvm.com.au>
To: Lars Kurth <lars.kurth@xen.org>
Cc: xen-devel@lists.xensource.com, xen-users@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="===============1787926011=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1787926011==
Content-Type: multipart/alternative; boundary=00151773e4f0edf8b904af1e698c

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

Sounds good, 26th works.

Real-time colab on IRC would be nice to get organised maybe #xendocday on
freenode?

Joseph.

On 12 October 2011 03:28, Lars Kurth <lars.kurth@xen.org> wrote:

> OK, 26th of October it is: I'll come up with some ideas and share them
> early next week
> Lars
>
>
> On 10/10/2011 17:04, Konrad Rzeszutek Wilk wrote:
>
>> On Mon, Oct 10, 2011 at 12:33:29PM +0100, Lars Kurth wrote:
>>
>>> Looks like me being maxed out means we are too close to Oct 12th
>>> now. Does anybody object to doing this on the 26th?
>>>
>> I am OK.
>>
>>> How long will the day be? An afternoon? A whole day with rolling
>>> time-zones?
>>>
>> One day. As much as people can do I would think.
>>
>>  In lots of ways. There is a lot of things that we want to do - but
>>>>
>>> I don't think we can do
>>>
>>>> _all_ of them. Can you help us determine what ought to have a
>>>>
>>> higher priority?
>>> In a nutshell:
>>> - We should focus on some of the shortfalls we identified at the
>>> Hackathon
>>>   (CLI guides, man pages, etc.)?
>>> - We should also do a quick Wiki sanity check (i.e. identify
>>> important pages, which are wrong)
>>>   I can help guide this
>>>
>>> Maybe we can split into two groups
>>>
>> <nods>
>>
>
>


-- 
*
Founder | Director | VP Research
Orion Virtualisation Solutions* | www.orionvm.com.au | Phone: 1300 56 99 52
| Mobile: 0428 754 846

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

Sounds good, 26th works.<br><br>Real-time colab on IRC would be nice to get=
 organised maybe #xendocday on freenode?<br><br>Joseph.<br><br><div class=
=3D"gmail_quote">On 12 October 2011 03:28, Lars Kurth <span dir=3D"ltr">&lt=
;<a href=3D"mailto:lars.kurth@xen.org">lars.kurth@xen.org</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;">OK, 26th of October it is: I&#39;ll come up=
 with some ideas and share them early next week<br><font color=3D"#888888">
Lars</font><div><div></div><div class=3D"h5"><br>
<br>
On 10/10/2011 17:04, Konrad Rzeszutek Wilk wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
On Mon, Oct 10, 2011 at 12:33:29PM +0100, Lars Kurth wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
Looks like me being maxed out means we are too close to Oct 12th<br>
now. Does anybody object to doing this on the 26th?<br>
</blockquote>
I am OK.<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
How long will the day be? An afternoon? A whole day with rolling<br>
time-zones?<br>
</blockquote>
One day. As much as people can do I would think.<br>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><blockquote class=3D"gmail_quote" style=3D"m=
argin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
In lots of ways. There is a lot of things that we want to do - but<br>
</blockquote>
I don&#39;t think we can do<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
_all_ of them. Can you help us determine what ought to have a<br>
</blockquote>
higher priority?<br>
In a nutshell:<br>
- We should focus on some of the shortfalls we identified at the Hackathon<=
br>
 =A0 (CLI guides, man pages, etc.)?<br>
- We should also do a quick Wiki sanity check (i.e. identify<br>
important pages, which are wrong)<br>
 =A0 I can help guide this<br>
<br>
Maybe we can split into two groups<br>
</blockquote>
&lt;nods&gt;<br>
</blockquote>
<br>
</div></div></blockquote></div><br><br clear=3D"all"><br>-- <br><span style=
=3D"font-family:arial,sans-serif;font-size:13px;border-collapse:collapse"><=
b><i><font color=3D"#0000ff"><div><font color=3D"#000000"><span style=3D"fo=
nt-style:normal;font-weight:normal">Founder | Director | VP Research<br>
</span></font></div>Orion Virtualisation Solutions</font></i></b>=A0|=A0<fo=
nt color=3D"#0000ff"><a href=3D"http://www.orionvm.com.au/" style=3D"color:=
rgb(42, 93, 176)" target=3D"_blank">www.orionvm.com.au</a></font>=A0| Phone=
: 1300 56 99 52 | Mobile: 0428 754 846</span><br>


--00151773e4f0edf8b904af1e698c--


--===============1787926011==
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

--===============1787926011==--


From xen-devel-bounces@lists.xensource.com Wed Oct 12 11:48:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 11:48:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE3rA-0004Qs-LF; Wed, 12 Oct 2011 11:48:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RE3pU-0003in-3J
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 11:47:01 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318445202!43980193!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23698 invoked from network); 12 Oct 2011 18:46:42 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-13.tower-27.messagelabs.com with SMTP;
	12 Oct 2011 18:46:42 -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
	p9CIkrSW009294; Wed, 12 Oct 2011 18:46:53 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 p9CIkrnD024755; 
	Wed, 12 Oct 2011 14:46:53 -0400
Message-ID: <4E95E0AB.5010901@tycho.nsa.gov>
Date: Wed, 12 Oct 2011 14:47:07 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming
	domain 0
References: <1317824920-639-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20109.60188.905267.410813@mariner.uk.xensource.com>
	<4E8DF425.9000807@tycho.nsa.gov>
	<1317973956.21903.281.camel@zakaz.uk.xensource.com>
	<4E8F2AD0.2060904@tycho.nsa.gov>
	<1318251283.21903.424.camel@zakaz.uk.xensource.com>
	<4E94582C.4060305@tycho.nsa.gov>
	<1318437131.21903.775.camel@zakaz.uk.xensource.com>
In-Reply-To: <1318437131.21903.775.camel@zakaz.uk.xensource.com>
X-Enigmail-Version: 1.3
Content-Type: text/plain; charset=UTF-8
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 10/12/2011 12:32 PM, Ian Campbell wrote:
> On Tue, 2011-10-11 at 15:52 +0100, Daniel De Graaf wrote:
>> On 10/10/2011 08:54 AM, Ian Campbell wrote:
>>> On Fri, 2011-10-07 at 17:37 +0100, Daniel De Graaf wrote:
>>>> On 10/07/2011 03:52 AM, Ian Campbell wrote:
>>>>> On Thu, 2011-10-06 at 19:32 +0100, Daniel De Graaf wrote:
>>>>>> On 10/06/2011 01:53 PM, Ian Jackson wrote:
>>>>>>> Daniel De Graaf writes ("[Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming domain 0"):
>>>>>>>> The xenbus event channel established in xenbus_init is intended to be a
>>>>>>>> loopback channel, but the remote domain was hardcoded to 0; this will
>>>>>>>> cause the channel to be unusable when xenstore is not being run in
>>>>>>>> domain 0.
>>>>>>>
>>>>>>> I'm not sure I understand this.
>>>>>>>
>>>>>>> ...
>>>>>>>>  		/* Next allocate a local port which xenstored can bind to */
>>>>>>>>  		alloc_unbound.dom        = DOMID_SELF;
>>>>>>>> -		alloc_unbound.remote_dom = 0;
>>>>>>>> +		alloc_unbound.remote_dom = DOMID_SELF;
>>>>>>>
>>>>>>> The comment doesn't suggest that this is supposedly a loopback channel
>>>>>>> (ie one for use by the xenbus client for signalling to itself,
>>>>>>> somehow).
>>>>>>
>>>>>> The event channel being changed here is a loopback event channel exposed in
>>>>>> /proc/xen/xsd_port, which xenstored binds to. This code is only used for the
>>>>>> initial domain; otherwise, the shared info page is used.
>>>>>
>>>>> How does this change impact the regular dom0? It will be expecting a
>>>>> xenstored to startup locally when in reality it actually needs to wait
>>>>> for another domain and then connect to that.
>>>>
>>>> This change does not attempt to address the regular dom0, except for not
>>>> breaking existing setups where xenstored resides in dom0.
>>>>
>>>>> Diego Ongaro did some work several years ago on this issue, it was most
>>>>> recently re-posted by Alex Zeffert, patches against xen-unstable and the
>>>>> linux-2.6.18 tree:
>>>>> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01484.html
>>>>> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01488.html
>>>>>
>>>>> Part of the trick was to fixup the kernel side in a way which was
>>>>> compatible with both existing Xen releases while also supporting new
>>>>> releases which support both stub and non-stub xenstore. To do this Diego
>>>>> setup a lazy xenbus initialisation with a state machine to track which
>>>>> case was active, with transitions triggered either from the local-mmap
>>>>> of /proc/xen/xenbus_xsd (so was backwards compatible) or an ioctl called
>>>>> by the tool which builds the stub domain to tell the dom0 xenbus code
>>>>> which domain/mfn/evtchn contains the xenstored and dom0's connection to
>>>>> it (the patcheset includes a cut-down builder which works without
>>>>> xenstore).
>>>>>
>>>>> http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01487.html
>>>>> is the key kernel side patch in that regard.
>>>>>
>>>>> Diego did some initial work with xenstored in a Linux domU, but I think
>>>>> the final patchset was stub-xenstored (i.e. ocaml xenstored on minios,
>>>>> possibly C xenstored on minios too), so I'm not sure about the xenstored
>>>>> in Linux domU use case.
>>>>>
>>>>> Some of the more trivial bits of this series were committed but the real
>>>>> meat wasn't really pushed through.
>>>>>
>>>>
>>>> Thanks for pointing out that series; I hadn't seen it yet. The setup I am
>>>> currently using has a non-Linux dom0, so the state machine in dom0 was not
>>>> required. A separate minios-based xenstored is the eventual goal; this patch
>>>> just avoids creating a broken event channel in an initial domain whose
>>>> domain ID is not 0.
>>>
>>> Although I suspect it was envisaged when the API was written I don't
>>> think SIF_INITDOMAIN can actually be used (or redefined) to mean
>>> anything other than dom0 in practice without a whole host of knock-on
>>> effects and breakage.
>>>
>>> Setting SIF_INITDOMAIN has effects other than xenstore setup on a Linux
>>> domU, grepping for other uses of xen_initial_domain() shows loads of
>>> them. e.g. the selection of host vs. pseudo-physical e820, various
>>> driver setup stuff, some pagetable features, how the console works etc.
>>
>> Yes; splitting up driver domains requires changing a number of users of
>> xen_initial_domain to become more fine-grained. Some disaggregation work[1]
>> requires splitting the SIF_INITDOMAIN flag into a series of finer-grained
>> flags that includes one for xenstore; this becomes unnecessary if xenstore
>> detection code does not check SIF_INITDOMAIN.
>>
>> This patch covers a few cases:
>>
>> 1) Dom0 is Linux, xenstored runs in Dom0
>> 2) Dom0 is domain builder, creating another SIF_INITDOMAIN Linux domain with
>>    a nonzero domain ID that runs xenstore and other functions
>> 3) Dom0 is domain builder, creating xenstore and a SIF_INITDOMAIN Linux
>>    domain that uses the external xenstore.
>>
>> The second and third case require fairly intrusive hypervisor patches,
> 
> What sort of hypervisor patches?
> 
> I'm not convinced that the concept of "another SIF_INITDOMAIN" is
> possible. Certainly you might have other domains which have some
> privileges which have previously been associated with the domain whose
> ID is 0, but that does not imply that you should/can literally pass
> SIF_INITDOMAIN to those domains.
> 

The patches add a "hardware domain" parameter which is passed control of the
hardware instead of dom0. This domain is in charge of most of the ACPI and
other nonspecific hardware devices, while individual PCI devices will be
passed to other driver domains (that are not SIF_INITDOMAIN).

The domain with ID 0 only acts as a domain builder here: it does not directly
access the hardware, only creating and activating other domains. This allows
domains (including xenstore and a few others) to start before the Linux domain
accessing the hardware has started any part of userspace.

>>  but
>> the only Linux change required for the second case is the posted fix to the
>> loopback event channel.
> 
> Unless dom0 is also running Linux? In which case it has no way to talk
> to the xenstored in the second domain?

Correct; I am not addressing this problem as dom0 is not running Linux here.
The other patches you pointed to do address that possibility with the ioctl,
which seems a good solution if you want to also run Linux in dom0 - although
in that case, dom0 may need to be marked as not SIF_INITDOMAIN to avoid trying
to set up hardware twice.
 
> Does the kernel the the "another SIF_INITDOMAIN" not get quite upset wrt
> it's ability to see physical hardware and such, which it will be
> confused about because you've given it SIF_INITDOMAIN?

The hypervisor patches actually give it the access required.

>> [1] "Breaking Up is Hard to Do: Security and Functionality in a Commodity
>> Hypervisor" (SOSP 11)
>>
>>>
>>>> I do have a more complex version of this patch that replaces the initial
>>>> domain check with a check on the start_info structure so that an initial
>>>> domain can have xenstore information placed in its start_info field like
>>>> any other domain; would this be of interest?
>>>
>>> If you already have something then it would be interesting to see.
>>>
>>> Ian.
>>>
>>
>> This patch eliminates xen_initial_domain() checks when initializing
>> xenstore, replacing them with checks on the event channel in the
>> start_info page.
> 
> In your scenario 2 and 3 then with this patch the dom0 kernel will see
> no evtchn in start_info page but there appears to be no mechanism for
> poking down the evtchn/mfn for dom0 to use to communicate with the
> xenstored domain.
> 
> I think that a combination of this patch and Diego's stuff (reapplied to
> your xenstored_local_init case) would catch all those combinations and
> work for both the real dom0 (with or without xenstored in it) and also a
> domN Linux domain running xenstored too. I think this patch by itself
> doesn't make any existing cases wrong nor make adding Diego's stuff in
> the future any harder.
> 
> How does the xenstored running in the second domain get the necessary
> page/evtchn numbers to allow it to communicate with dom0?

In my setup, it doesn't ever communicate with dom0 as dom0 dies once it
has set up the boot domains. For a more general case, the page/evtchn
numbers could be passed in a normal introduce message if they are made
available outside dom0 (perhaps by command-line parameters or via another
mechanism like v4v).
  
> I assume it is guaranteed that xen_start_info->store_evtchn == 0 (and
> presumably xen_start_info->store_mfn == 0) for the real dom0?

Yes; the start_info page is zeroed prior to filling it in for dom0, and
these fields are not filled in.

-- 
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 Wed Oct 12 12:19:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 12:19:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE4Km-0005hd-Fj; Wed, 12 Oct 2011 12:19:20 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE4Jx-0005UZ-VR
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 12:18:30 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-11.tower-174.messagelabs.com!1318447105!35001468!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5559 invoked from network); 12 Oct 2011 19:18:26 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 19:18:26 -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 873C93D6;
	Wed, 12 Oct 2011 12:18:24 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 9CC4220257;
	Wed, 12 Oct 2011 12:18:22 -0700 (PDT)
Message-ID: <4E95E7FE.6050302@goop.org>
Date: Wed, 12 Oct 2011 12:18:22 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com>
In-Reply-To: <4E95D9E7.6090304@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	the arch/x86 maintainers <x86@kernel.org>, Borislav Petkov <bp@amd64.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 11:18 AM, H. Peter Anvin wrote:
> On 10/12/2011 03:16 AM, Borislav Petkov wrote:
>> Why would a xen microcode solution would even be contingent on how
>> upstream Linux solves it (and when)?
>>
> Agreed... especially since Xen is "special" when it comes to booting anyway.

"Special" only in the sense that you need a new line in grub.

But doing boot-time microcode is a lot more "special" since it would
require distros to move the microcode files to /boot.  That would either
mean having two sets of microcode packages, or also changing the way
that Linux does its microcode loading (if only by changing the paths,
but I have no idea what that implies since its all tied up with the rest
of the firmware loading stuff).

The whole thrust of the Xen upstreaming work has been to minimize the
amount of arbitrary "specialness" so that its as easy as possibly for
people and distros to deploy and use Xen.

With respect to microcode loading, this patch means that users and
distros just don't need to worry about microcode any more.  It packages
and operates exactly like it would for native Linux, which is exactly
how we like it.

While doing the whole boot time multiboot thing may offer some small
hypothetical technical advantages, it has the significant cost of just
complicating the whole deployment and use story.

If there were a general shift to "this is how we're going to do
microcode in the future", then Xen will happily go along for the ride. 
But for right now, this patch seems like the pragmatic solution.

I think the real question is where there's something objectionable about
the patch itself?

Thanks,
    J

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

From xen-api-bounces@lists.xensource.com Wed Oct 12 12:25:43 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 12:25:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE4Qx-00061P-Cm; Wed, 12 Oct 2011 12:25:43 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE4Ql-0005yL-6m; Wed, 12 Oct 2011 12:25:31 -0700
X-Env-Sender: mike.mcclurg@citrix.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1318447525!32887202!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31744 invoked from network); 12 Oct 2011 19:25:27 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-6.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2011 19:25:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,336,1315195200"; d="scan'208";a="18169001"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 15:25:25 -0400
Received: from [IPv6:::1] (10.80.16.67) by smtprelay.citrix.com (10.13.107.66)
	with Microsoft SMTP Server id 8.3.137.0;
	Wed, 12 Oct 2011 15:25:25 -0400
Message-ID: <4E95E9BD.7020408@citrix.com>
Date: Wed, 12 Oct 2011 20:25:49 +0100
From: Mike McClurg <mike.mcclurg@citrix.com>
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20110807 Icedove/5.0
MIME-Version: 1.0
To: "xen-api@lists.xensource.com" <xen-api@lists.xensource.com>, 
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset="windows-1252"; format=flowed
Content-Transfer-Encoding: 8bit
Cc: 
Subject: [Xen-API] Announcing the release of XCP 1.1
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 Xen users,

The XCP team is happy to announce that XCP 1.1 has been released! I'd 
like to thank community members who have tested RC1 and wanted to let 
you know that no significant issues have been found. Thus, we promoted 
the XCP 1.1 RC1 release candidate to final release status. So if you’ve 
already installed the RC1 release, there is no reason to upgrade.

Please see the Xen.org blog for more information 
(http://blog.xen.org/index.php/2011/10/12/xcp-1-1-final-release/).

Mike

_______________________________________________
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 Oct 12 12:35:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 12:35:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE4ag-0007Ut-98; Wed, 12 Oct 2011 12:35:46 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RE4Zx-0007GM-Ql
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 12:35:02 -0700
X-Env-Sender: caker@theshore.net
X-Msg-Ref: server-7.tower-182.messagelabs.com!1318448098!17031475!1
X-Originating-IP: [67.18.92.50]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1496 invoked from network); 12 Oct 2011 19:34:58 -0000
Received: from ns.theshore.net (HELO www.theshore.net) (67.18.92.50)
	by server-7.tower-182.messagelabs.com with SMTP;
	12 Oct 2011 19:34:58 -0000
Received: from beefcake.linlan
	(173-161-199-49-Philadelphia.hfc.comcastbusiness.net
	[173.161.199.49])
	by www.theshore.net (8.13.6/8.9.1) with ESMTP id p9CJYl0Z005843
	for <xen-devel@lists.xensource.com>; Wed, 12 Oct 2011 15:34:47 -0400
Message-ID: <4E95EBD6.7010400@theshore.net>
Date: Wed, 12 Oct 2011 15:34:46 -0400
From: "Christopher S. Aker" <caker@theshore.net>
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US;
	rv:1.9.2.23) Gecko/20110920 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: xen devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Xen 4 occasionally hangs during boot
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 I started playing with Xen 4 (vs 3.x), machines often hang during 
reboot at exactly the same place:

	(XEN) HVM: Hardware Assisted Paging detected.
	(

... and then nothing.  I have to RPC bounce them.  On some occasions it 
takes four or five attempts to get beyond this point.  A normal boot 
looks like this:

	(XEN) HVM: Hardware Assisted Paging detected.
	(XEN) Brought up 16 CPUs

4.1.2-rc @ 23159.  All of the Xen 4.x I've tried have done this, but I'd 
need to dig up which ones those are.

-Chris

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 12:38:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 12:38:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE4cq-0007tK-5j; Wed, 12 Oct 2011 12:38:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RE4cJ-0007hR-SC
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 12:37:28 -0700
X-Env-Sender: caker@theshore.net
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318448216!41633067!1
X-Originating-IP: [67.18.92.50]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18429 invoked from network); 12 Oct 2011 19:36:57 -0000
Received: from ns.theshore.net (HELO www.theshore.net) (67.18.92.50)
	by server-3.tower-27.messagelabs.com with SMTP;
	12 Oct 2011 19:36:57 -0000
Received: from beefcake.linlan
	(173-161-199-49-Philadelphia.hfc.comcastbusiness.net
	[173.161.199.49])
	by www.theshore.net (8.13.6/8.9.1) with ESMTP id p9CJbNux006343;
	Wed, 12 Oct 2011 15:37:24 -0400
Message-ID: <4E95EC73.4050605@theshore.net>
Date: Wed, 12 Oct 2011 15:37:23 -0400
From: "Christopher S. Aker" <caker@theshore.net>
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US;
	rv:1.9.2.23) Gecko/20110920 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] vmalloc_sync_all() patch problems?
References: <4E832F1A.3030209@theshore.net> <4E83330A.3030509@citrix.com>
	<4E834519.3090300@theshore.net> <4E8353B1.9070007@citrix.com>
	<4E85E26F.1030202@theshore.net>
	<20111010155110.GA29026@phenom.oracle.com>
	<B7DFE1B1-2506-422C-B5C0-F4334BF700F8@theshore.net>
	<20111011172838.GA32406@phenom.oracle.com>
In-Reply-To: <20111011172838.GA32406@phenom.oracle.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
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 10/11/11 1:28 PM, Konrad Rzeszutek Wilk wrote:
>> With that patchset applied: 6 days of thrashing, 30000 domains
>> cycled, and no crashes.  I'd say it worked.
>
> Excellent. You got any more bugs that we should be aware off ?
> (hopefully not).

Always! I'll gather the info and author posts over the next couple of days.

-Chris

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 12:45:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 12:45:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE4kO-0008Nx-4r; Wed, 12 Oct 2011 12:45:48 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE4jh-0008Bf-5T
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 12:45:05 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318448701!20878995!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29979 invoked from network); 12 Oct 2011 19:45:02 -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;
	12 Oct 2011 19:45:02 -0000
X-IronPort-AV: E=Sophos;i="4.69,336,1315180800"; 
   d="scan'208";a="8356426"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	12 Oct 2011 19:45:01 +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, 12 Oct 2011 20:45:01 +0100
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 1RE4jd-0004ho-8N;
	Wed, 12 Oct 2011 19:45:01 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RE4jd-0007H1-7n;
	Wed, 12 Oct 2011 20:45:01 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9253-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 12 Oct 2011 20:45:01 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9253: 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 9253 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9253/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     13 guest-localmigrate.2       fail REGR. vs. 9252

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

version targeted for testing:
 xen                  dcb2bd283dca
baseline version:
 xen                  4b0907c6a08c

------------------------------------------------------------
People who touched revisions under test:
  Guido Gunther <agx@sigxcpu.org>
  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:   23948:dcb2bd283dca
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Wed Oct 12 17:11:28 2011 +0100
    
    Revert part of 23811:f1349a968a5a "ns16550: Simplify UART..."
    
    The change to poll LSR.THRE in a loop from __ns16550_poll is a bug.
    We can loop indefinitely if there are no chars to transmit.
    
    Thanks to Jan for spotting it.
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23947:48aa733d0767
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Wed Oct 12 16:21:32 2011 +0100
    
    libxl: fixup incorrect indentation
    
    Several places which were previsously indented using hard tabs are now
    incorrectly indented. Fix them up.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23946:e65977f3fa86
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Oct 11 14:34:07 2011 +0100
    
    libxl: fixup incorrect indentation
    
    Several places which were previsously indented using hard tabs are now
    incorrectly indented. Fix them up.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23945:c5f8c3597cae
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Oct 11 14:26:00 2011 +0100
    
    libxl: expand hard tab stops
    
    I ran the following and committed the result. ^I is an actual hard tab
    
    for i in $(grep -l --exclude=*_[ly].\[ch\] '^I' tools/libxl/*.[ch]) ; do
         cat $i | expand | sponge $i
    done
    
    There are some actually wrong indentations too, I'll fix those up
    manually.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23944:4b0907c6a08c
user:        Guido Gunther <agx@sigxcpu.org>
date:        Tue Oct 11 12:02:58 2011 +0100
    
    pygrub: add debug flag
    
    Debugging config file errors is tedious so help a bit by not silently
    dropping parsing exceptions when --debug is given. Also intialize the
    logging API at debug level in this case.
    
    Signed-off-by: Guido Gunther <agx@sigxcpu.org>
    Acked-by: Ian Campbell <ian.campbell@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 Oct 12 13:25:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 13:25:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE5NG-0002fm-Pm; Wed, 12 Oct 2011 13:25:58 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE5Ki-0001wQ-H1
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 13:23:21 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318450976!46389823!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13171 invoked from network); 12 Oct 2011 20:22:58 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 20:22:58 -0000
Received: from hanvin-mobl6.amr.corp.intel.com (fmdmzpr03-ext.fm.intel.com
	[192.55.54.38]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9CKMgqL029874
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 13:22:43 -0700
Message-ID: <4E95F711.2090004@zytor.com>
Date: Wed, 12 Oct 2011 13:22:41 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
In-Reply-To: <4E95E7FE.6050302@goop.org>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	the arch/x86 maintainers <x86@kernel.org>, Borislav Petkov <bp@amd64.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 12:18 PM, Jeremy Fitzhardinge wrote:
> If there were a general shift to "this is how we're going to do
> microcode in the future", then Xen will happily go along for the ride.

It *is* how we want to do microcode in the future.  There is a prototype 
for the Intel hardware side here; we just haven't had time to finalize 
it partly because I got pulled onto the kernel.org situation.

> But for right now, this patch seems like the pragmatic solution.

No.

> I think the real question is where there's something objectionable about
> the patch itself?

"It does something that is slightly broken on real hardware and totally 
broken for a hypervisor and perpetuates it, while still needing enabling?"

	-hpa


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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 13:41:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 13:41:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE5cG-0004BH-TH; Wed, 12 Oct 2011 13:41:29 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE5bD-0003yJ-8H
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 13:40:25 -0700
X-Env-Sender: K.Brink@cs.ru.nl
X-Msg-Ref: server-14.tower-174.messagelabs.com!1318452019!35024732!1
X-Originating-IP: [131.174.16.143]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17749 invoked from network); 12 Oct 2011 20:40:20 -0000
Received: from smeltpunt.science.ru.nl (HELO smeltpunt.science.ru.nl)
	(131.174.16.143)
	by server-14.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 20:40:20 -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 p9CKeBQV011365; 
	Wed, 12 Oct 2011 22:40:11 +0200 (MEST)
Date: Wed, 12 Oct 2011 22:40:11 +0200
From: Kasper Brink <K.Brink@cs.ru.nl>
To: xen-devel@lists.xensource.com
Message-ID: <20111012204011.GA7518@lilo2.science.ru.nl>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="zhXaljGHf11kAtnf"
Content-Disposition: inline
User-Agent: Mutt/1.5.20 (2009-06-14)
X-Spam-Score: -0.831 () ALL_TRUSTED,AWL,BAYES_50,FB_WORD1_END_DOLLAR
X-Scanned-By: MIMEDefang 2.63 on 131.174.16.143
Subject: [Xen-devel] pv-grub Solaris 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


--zhXaljGHf11kAtnf
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hello all,

I've patched pv-grub to allow it to boot a Solaris PV domU using an
unmodified menu.lst. The attached patch has been tested with various
Solaris versions (Solaris 11 Express, OpenIndiana 151a, OpenSolaris 134,
Nexenta Core 3.0.1; all 64-bit). I appreciate your feedback.

The patch consists mainly of Oracle's grub modifications, which add ZFS
support and Solaris-specific builtins (findroot, bootfs, kernel$, and
module$). I took the relevant code from the "Oracle Solaris 11 Express
2010.11 GPL Source, Part 2" package, downloaded from: 
  http://dlc.sun.com/opensourcecode/solaris/sol-11-exp-201011-GPLSource_2.zip
The kernel$ and module$ builtins were modified to boot Xen PV Solaris
kernels.

The patch is against current xen-unstable. I built and tested pv-grub under 
Xen version 4.0.1 (Debian 4.0.1-2) amd64, with a Linux 2.6.32-5-xen-amd64
(Debian Squeeze) dom0. The location of menu.lst in the domU was specified
with the "extra" variable (e.g. extra="(hd0,0,a)/boot/grub/menu.lst").

Note: I had to create a symlink "xen/include/xen/libelf -> ." (not in the
patch) to build stubdom/libxc-x86_64 succesfully. Is this a bug, or is
there something wrong in my setup?

If you think this code is useful for other users, I'd be happy to see it
included in the Xen repository. Please let me know if there's anything that
needs to be changed.

Best,

Kasper

--zhXaljGHf11kAtnf
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="pv-grub_solaris.patch"

diff -r 4b0907c6a08c stubdom/grub.patches/60zfs_solaris.diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stubdom/grub.patches/60zfs_solaris.diff	Wed Oct 12 20:06:15 2011 +0200
@@ -0,0 +1,4793 @@
+This patch adds ZFS support, and the Solaris-specific builtins findroot, bootfs,
+kernel$, and module$, to pv-grub.
+
+It includes the relevant parts of Oracle's changes to grub-0.97, which were
+taken from the "osnet/src/grub-0.97" directory in 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
+
+The kernel$ and module$ builtins were modified to boot Xen PV Solaris kernels.
+
+    2011-10-12  Kasper Brink  <K.Brink@cs.ru.nl>
+
+
+diff -urN grub.patch50/AUTHORS grub.zfs_solaris/AUTHORS
+--- grub.patch50/AUTHORS	2011-10-12 19:58:28.795922895 +0200
++++ grub.zfs_solaris/AUTHORS	2011-10-12 19:58:28.951921541 +0200
+@@ -1,7 +1,16 @@
++
++ZFS support added by Sun Microsystems.
++Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
++Use is subject to license terms.
++
+ VaX#n8 (real name unknown) wrote shared_src/fsys_ext2fs.c.
+ 
+ Heiko Schroeder rewrote shared_src/stage1.S to be more readable.
+ 
++Solaris VTOC and UFS support added by Sun Microsystems.
++Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
++Use is subject to license terms.
++
+ The following authors assigned copyright on their work to the Free
+ Software Foundation:
+ 
+diff -urN grub.patch50/stage2/builtins.c grub.zfs_solaris/stage2/builtins.c
+--- grub.patch50/stage2/builtins.c	2011-10-12 19:58:28.871922077 +0200
++++ grub.zfs_solaris/stage2/builtins.c	2011-10-12 19:58:29.027921196 +0200
+@@ -109,6 +109,12 @@
+   fallback_entryno = -1;
+   fallback_entries[0] = -1;
+   grub_timeout = -1;
++  current_rootpool[0] = '\0';
++  current_bootfs[0] = '\0';
++  current_bootpath[0] = '\0';
++  current_bootfs_obj = 0;
++  current_devid[0] = '\0';
++  is_zfs_mount = 0;
+ }
+ 
+ /* Check a password for correctness.  Returns 0 if password was
+@@ -1467,16 +1473,56 @@
+ };
+ 
+ 
+-/* find */
+-/* Search for the filename ARG in all of partitions.  */
++
++void
++set_root (char *root, unsigned long drive, unsigned long part)
++{
++  int bsd_part = (part >> 8) & 0xFF;
++  int pc_slice = part >> 16;
++
++  if (bsd_part == 0xFF) {
++    grub_sprintf (root, "(hd%d,%d)\n", drive - 0x80, pc_slice);
++  } else {
++    grub_sprintf (root, "(hd%d,%d,%c)\n",
++		 drive - 0x80, pc_slice, bsd_part + 'a');
++  }
++}
++
+ static int
+-find_func (char *arg, int flags)
++find_common (char *arg, char *root, int for_root, int flags)
+ {
+-  char *filename = arg;
++  char *filename = NULL;
++  static char argpart[32];
++  static char device[32];
++  char *tmp_argpart = NULL;
+   unsigned long drive;
+   unsigned long tmp_drive = saved_drive;
+   unsigned long tmp_partition = saved_partition;
+   int got_file = 0;
++  static char bootsign[BOOTSIGN_LEN];
++
++  /*
++   * If argument has partition information (findroot command only), then
++   * it can't be a floppy
++   */
++  if (for_root && arg[0] == '(') {
++	tmp_argpart = grub_strchr(arg + 1, ',');
++        if (tmp_argpart == NULL)
++		goto out;
++	grub_strcpy(argpart, tmp_argpart);
++	*tmp_argpart = '\0';
++	arg++;
++        grub_sprintf(bootsign, "%s/%s", BOOTSIGN_DIR, arg);
++	filename = bootsign;
++	goto harddisk;
++  } else if (for_root && !grub_strchr(arg, '/')) {
++	/* Boot signature without partition/slice information */
++        grub_sprintf(bootsign, "%s/%s", BOOTSIGN_DIR, arg);
++	filename = bootsign;
++  } else {
++	/* plain vanilla find cmd */
++	filename = arg;
++  }
+   
+   /* Floppies.  */
+   for (drive = 0; drive < 8; drive++)
+@@ -1491,14 +1537,19 @@
+ 	  if (grub_open (filename))
+ 	    {
+ 	      grub_close ();
+-	      grub_printf (" (fd%d)\n", drive);
+ 	      got_file = 1;
++	      if (for_root) {
++		 grub_sprintf(root, "(fd%d)", drive);
++		 goto out;
++	      } else
++	         grub_printf (" (fd%d)\n", drive);
+ 	    }
+ 	}
+ 
+       errnum = ERR_NONE;
+     }
+ 
++harddisk:
+   /* Hard disks.  */
+   for (drive = 0x80; drive < 0x88; drive++)
+     {
+@@ -1507,6 +1558,30 @@
+       int type, entry;
+       char buf[SECTOR_SIZE];
+ 
++      if (for_root && tmp_argpart) {
++	grub_sprintf(device, "(hd%d%s", drive - 0x80, argpart);
++	set_device(device);
++        errnum = ERR_NONE;
++	part = current_partition;
++	if (open_device ()) {
++	   saved_drive = current_drive;
++	   saved_partition = current_partition;
++           errnum = ERR_NONE;
++	   if (grub_open (filename)) {
++	      grub_close ();
++	      got_file = 1;
++	      if (is_zfs_mount == 0) {
++	        set_root(root, current_drive, current_partition);
++	        goto out;
++	      } else {
++		best_drive = current_drive;
++		best_part = current_partition;
++	      }
++           }
++	}
++        errnum = ERR_NONE;
++	continue;
++      }
+       current_drive = drive;
+       while (next_partition (drive, 0xFFFFFF, &part, &type,
+ 			     &start, &len, &offset, &entry,
+@@ -1523,19 +1598,22 @@
+ 		  saved_partition = current_partition;
+ 		  if (grub_open (filename))
+ 		    {
+-		      int bsd_part = (part >> 8) & 0xFF;
+-		      int pc_slice = part >> 16;
+-		      
+-		      grub_close ();
+-		      
+-		      if (bsd_part == 0xFF)
+-			grub_printf (" (hd%d,%d)\n",
+-				     drive - 0x80, pc_slice);
+-		      else
+-			grub_printf (" (hd%d,%d,%c)\n",
+-				     drive - 0x80, pc_slice, bsd_part + 'a');
++		      char tmproot[32];
+ 
++		      grub_close ();
+ 		      got_file = 1;
++		      set_root(tmproot, drive, part);
++		      if (for_root) {
++		 	grub_memcpy(root, tmproot, sizeof(tmproot));
++			if (is_zfs_mount == 0) {
++			      goto out;
++			} else {
++			      best_drive = current_drive;
++			      best_part = current_partition;
++			}
++		      } else {
++			grub_printf("%s", tmproot);
++		      }
+ 		    }
+ 		}
+ 	    }
+@@ -1549,8 +1627,16 @@
+       errnum = ERR_NONE;
+     }
+ 
+-  saved_drive = tmp_drive;
+-  saved_partition = tmp_partition;
++out:
++  if (is_zfs_mount && for_root) {
++        set_root(root, best_drive, best_part);
++	buf_drive = -1;
++  } else {
++	saved_drive = tmp_drive;
++	saved_partition = tmp_partition;
++  }
++  if (tmp_argpart)
++	*tmp_argpart = ',';
+ 
+   if (got_file)
+     {
+@@ -1562,6 +1648,14 @@
+   return 1;
+ }
+ 
++/* find */
++/* Search for the filename ARG in all of partitions.  */
++static int
++find_func (char *arg, int flags)
++{
++	return (find_common(arg, NULL, 0, flags));
++}
++
+ static struct builtin builtin_find =
+ {
+   "find",
+@@ -2619,6 +2713,117 @@
+ 
+ 
+ 
++/*
++ * To boot from a ZFS root filesystem, the kernel$ or module$ commands
++ * must include "-B $ZFS-BOOTFS" to expand to the zfs-bootfs, bootpath,
++ * and diskdevid boot property values for passing to the kernel:
++ *
++ * e.g.
++ * kernel$ /platform/i86pc/kernel/$ISADIR/unix -B $ZFS-BOOTFS,console=ttya
++ *
++ * $ZFS-BOOTFS is expanded to
++ *
++ *    zfs-bootfs=<rootpool-name/zfs-rootfilesystem-object-num>,
++ *    bootpath=<device phys path>,
++ *    diskdevid=<device id>
++ *
++ * if both bootpath and diskdevid can be found.
++ * e.g
++ *    zfs-bootfs=rpool/85,
++ *    bootpath="/pci@0,0/pci1022,7450@a/pci17c2,10@4/sd@0,0:a",
++ *    diskdevid="id1,sd@SSEAGATE_ST336607LC______3JA0LNHE0000741326W6/a"
++ */
++static int
++expand_dollar_bootfs(char *in, char *out)
++{
++	char *token, *tmpout = out;
++	int outlen, blen;
++	int postcomma = 0;
++
++	/* no op if this is not zfs */
++	if (is_zfs_mount == 0)
++		return (0);
++
++	if (current_bootpath[0] == '\0' && current_devid[0] == '\0') {
++		errnum = ERR_NO_BOOTPATH;
++		return (1);
++	}
++
++	outlen = strlen(in);
++	blen = current_bootfs_obj == 0 ? strlen(current_rootpool) :
++	    strlen(current_rootpool) + 11;
++
++	out[0] = '\0';
++	while (token = strstr(in, "$ZFS-BOOTFS")) {
++
++		if ((outlen += blen) >= MAX_CMDLINE) {
++			errnum = ERR_WONT_FIT;
++			return (1);
++		}
++
++		token[0] = '\0';	
++		grub_sprintf(tmpout, "%s", in);
++		token[0] = '$';
++		in = token + 11; /* skip over $ZFS-BOOTFS */
++		tmpout = out + strlen(out);
++
++		/* Note: %u only fits 32 bit integer; */ 
++		if (current_bootfs_obj > 0)
++			grub_sprintf(tmpout, "zfs-bootfs=%s/%u",
++			    current_rootpool, current_bootfs_obj);
++		else
++			grub_sprintf(tmpout, "zfs-bootfs=%s",
++			    current_rootpool);
++		tmpout = out + strlen(out); 
++	}
++
++	/*
++	 * Check to see if 'zfs-bootfs' was explicitly specified on the command
++	 * line so that we can insert the 'bootpath' property.
++	 */
++	if ((tmpout == out) && (token = strstr(in, "zfs-bootfs")) != NULL) {
++		token[0] = '\0';
++		grub_strcpy(tmpout, in);
++		token[0] = 'z';
++		in = token;
++
++		tmpout = out + strlen(out);
++		postcomma = 1;
++	}
++
++	/*
++	 * Set the 'bootpath' property if a ZFS dataset was specified, either
++	 * through '$ZFS-BOOTFS' or an explicit 'zfs-bootfs' setting.
++	 */
++	if (tmpout != out) {
++		if (current_bootpath[0] != '\0') {
++			if ((outlen += 12 + strlen(current_bootpath))
++			    >= MAX_CMDLINE) {
++				errnum = ERR_WONT_FIT;
++				return (1);
++			}
++			grub_sprintf(tmpout,
++			    postcomma ? "bootpath=\"%s\"," : ",bootpath=\"%s\"",
++			    current_bootpath);
++			tmpout = out + strlen(out);
++		}
++
++		if (current_devid[0] != '\0') {
++			if ((outlen += 13 + strlen(current_devid))
++			    >= MAX_CMDLINE) {
++				errnum = ERR_WONT_FIT;
++				return (1);
++			}
++			grub_sprintf(tmpout,
++			    postcomma ? "diskdevid=\"%s\"," : ",diskdevid=\"%s\"",
++			    current_devid);
++		}
++	}
++
++	strncat(out, in, MAX_CMDLINE);
++	return (0);
++}
++
+ /* kernel */
+ static int
+ kernel_func (char *arg, int flags)
+@@ -2707,6 +2912,141 @@
+   " Linux's mem option automatically."
+ };
+ 
++int
++isamd64()
++{
++	static int ret = 0;
++
++#ifdef __x86_64__
++    ret = 1;
++#endif
++
++	return (ret);
++}
++
++static void
++expand_arch (char *arg, char *newarg)
++{
++  char *index;
++
++  newarg[0] = '\0';
++
++  while ((index = strstr(arg, "$ISADIR")) != NULL) {
++
++    index[0] = '\0';
++    strncat(newarg, arg, MAX_CMDLINE);
++    index[0] = '$';
++
++    if (isamd64())
++      strncat(newarg, "amd64", MAX_CMDLINE);
++
++    arg = index + 7;
++  }
++
++  strncat(newarg, arg, MAX_CMDLINE);
++  return;
++}
++
++static int
++substitute_platform_i86xpv (char *arg, char *newarg)
++{
++  char *index;
++
++  newarg[0] = '\0';
++
++  while ((index = strstr(arg, "i86pc")) != NULL) {
++
++    index[0] = '\0';
++    if (!strncat(newarg, arg, MAX_CMDLINE)
++        || !strncat(newarg, "i86xpv", MAX_CMDLINE)) {
++      errnum = ERR_WONT_FIT;
++      return (1);
++    }
++    index[0] = 'i';
++
++    arg = index + 5;  /* length of "i86pc" */
++  }
++
++  if (!strncat(newarg, arg, MAX_CMDLINE)) {
++    errnum = ERR_WONT_FIT;
++    return (1);
++  }
++
++  return (0);
++}
++
++/* kernel$ */
++static int
++kernel_dollar_func (char *arg, int flags)
++{
++  char newarg[MAX_CMDLINE];	/* everything boils down to MAX_CMDLINE */
++#ifdef __MINIOS__
++  char tmparg[MAX_CMDLINE];	
++#endif
++
++  grub_printf("loading '%s' ...\n", arg);
++  expand_arch(arg, newarg);
++
++#ifdef __MINIOS__
++  /* replace "i86pc" by "i86xpv" in the kernel filename,
++     to enable pv-grub to use an unmodified menu.lst */
++  if (substitute_platform_i86xpv(newarg,tmparg))
++      return (1);
++
++  /* on ZFS, grub_open the kernel to set the value of current_bootfs_obj */
++  grub_strcpy(newarg,tmparg);
++  nul_terminate(newarg);
++  if (is_zfs_mount) {
++      if (!grub_open(newarg))
++          return (1);
++      grub_close();
++  }
++
++  /* the kernel filename is duplicated as the first argument to the kernel */
++  if (!strncat(newarg, " ", MAX_CMDLINE)
++      || !strncat(newarg, tmparg, MAX_CMDLINE)) {
++      errnum = ERR_WONT_FIT;
++      return (1);
++  }
++
++  grub_strcpy(tmparg,newarg);
++  if (expand_dollar_bootfs(tmparg, newarg)) {
++      grub_printf("cannot expand $ZFS-BOOTFS for dataset %s\n",
++          current_bootfs);
++      return (1);
++  }
++
++  if (kernel_func(newarg, flags))
++      return (1);
++
++  grub_printf("'%s' is loaded\n", newarg);
++#else  /* ! __MINIOS__ */
++  if (kernel_func(newarg, flags))
++	return (1);
++
++  mb_cmdline = (char *)MB_CMDLINE_BUF;
++  if (expand_dollar_bootfs(newarg, mb_cmdline)) {
++	grub_printf("cannot expand $ZFS-BOOTFS for dataset %s\n",
++	    current_bootfs);
++	return (1);
++  }
++
++  grub_printf("'%s' is loaded\n", mb_cmdline);
++  mb_cmdline += grub_strlen(mb_cmdline) + 1;
++#endif /* ! __MINIOS__ */
++
++  return (0);
++}
++
++static struct builtin builtin_kernel_dollar =
++{
++  "kernel$",
++  kernel_dollar_func,
++  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
++  "kernel$ [--no-mem-option] [--type=TYPE] FILE [ARG ...]",
++  " Just like kernel, but with $ISADIR expansion."
++};
++
+ 
+ /* lock */
+ static int
+@@ -2922,6 +3262,50 @@
+   " the `kernel' command."
+ };
+ 
++/* module$ */
++static int
++module_dollar_func (char *arg, int flags)
++{
++  char newarg[MAX_CMDLINE];	/* everything boils down to MAX_CMDLINE */
++  char *cmdline_sav;
++
++  grub_printf("loading '%s' ...\n", arg);
++  expand_arch(arg, newarg);
++
++/* Xen PV Solaris kernels ("i86xpv") are not Multiboot-compliant, and expect
++   to receive the boot archive as a Linux-style initial ramdisk. */
++#ifdef __MINIOS__
++  if (initrd_func(newarg, flags))
++	return (1);
++
++  grub_printf("'%s' is loaded\n", newarg);
++#else /* ! __MINIOS__ */
++  cmdline_sav = (char *)mb_cmdline;
++  if (module_func(newarg, flags))
++	return (1);
++
++  if (expand_dollar_bootfs(newarg, cmdline_sav)) {
++	grub_printf("cannot expand $ZFS-BOOTFS for dataset %s\n",
++	    current_bootfs);
++	return (1);
++  }
++
++  grub_printf("'%s' is loaded\n", (char *)cmdline_sav);
++  mb_cmdline += grub_strlen(cmdline_sav) + 1;
++#endif /* ! __MINIOS__ */
++
++  return (0);
++}
++
++static struct builtin builtin_module_dollar =
++{
++  "module$",
++  module_dollar_func,
++  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
++  "module FILE [ARG ...]",
++  " Just like module, but with $ISADIR expansion."
++};
++
+ 
+ /* modulenounzip */
+ static int
+@@ -3469,6 +3853,7 @@
+ static int
+ root_func (char *arg, int flags)
+ {
++  is_zfs_mount = 0;
+   return real_root_func (arg, 1);
+ }
+ 
+@@ -3491,6 +3876,101 @@
+ };
+ 
+ 
++/* findroot */
++int
++findroot_func (char *arg, int flags)
++{
++  int ret;
++  char root[32];
++
++  if (grub_strlen(arg) >= BOOTSIGN_ARGLEN) {
++  	errnum = ERR_BAD_ARGUMENT;
++	return 1;
++  }
++
++  if (arg[0] == '\0') {
++  	errnum = ERR_BAD_ARGUMENT;
++	return 1;
++  }
++
++  find_best_root = 1;
++  best_drive = 0;
++  best_part = 0;
++  ret = find_common(arg, root, 1, flags);
++  if (ret != 0)
++	return (ret);
++  find_best_root = 0;
++
++  return real_root_func (root, 1);
++}
++
++static struct builtin builtin_findroot =
++{
++  "findroot",
++  findroot_func,
++  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
++  "findroot  <SIGNATURE | (SIGNATURE,partition[,slice])>",
++  "Searches across all partitions for the file name SIGNATURE."
++  " GRUB looks only in the directory /boot/grub/bootsign for the"
++  " filename and it stops as soon as it finds the first instance of"
++  " the file - so to be useful the name of the signature file must be"
++  " unique across all partitions. Once the signature file is found,"
++  " GRUB invokes the \"root\" command on that partition."
++  " An optional partition and slice may be specified to optimize the search."
++};
++
++
++/*
++ * COMMAND to override the default root filesystem for ZFS
++ *	bootfs pool/fs
++ */
++static int
++bootfs_func (char *arg, int flags)
++{
++	int hdbias = 0;
++	char *biasptr;
++	char *next;
++
++	if (! *arg) {
++	    if (current_bootfs[0] != '\0')
++		grub_printf ("The zfs boot filesystem is set to '%s'.\n",
++				current_bootfs);
++	    else if (current_rootpool[0] != 0 && current_bootfs_obj != 0)
++		grub_printf("The zfs boot filesystem is <default: %s/%u>.",
++				current_rootpool, current_bootfs_obj);
++	    else
++		grub_printf ("The zfs boot filesystem will be derived from "
++			"the default bootfs pool property.\n");
++
++	    return (1);
++	}
++
++	/* Verify the zfs filesystem name */
++	if (arg[0] == '/' || arg[0] == '\0') {
++		errnum = ERR_BAD_ARGUMENT;
++		return 0;
++	}
++	if (current_rootpool[0] != 0 && grub_strncmp(arg,
++	    current_rootpool, strlen(current_rootpool))) {
++		errnum = ERR_BAD_ARGUMENT;
++		return 0;
++	}
++
++	grub_memmove(current_bootfs, arg, MAXNAMELEN);
++
++	return (1);
++}
++
++static struct builtin builtin_bootfs =
++{
++  "bootfs",
++  bootfs_func,
++  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
++  "bootfs [ZFSBOOTFS]",
++  "Set the current zfs boot filesystem to ZFSBOOTFS (rootpool/rootfs)."
++};
++
++
+ /* rootnoverify */
+ static int
+ rootnoverify_func (char *arg, int flags)
+@@ -3630,6 +4110,11 @@
+   int saved_offsets[2];
+   int saved_lengths[2];
+ 
++  /* not supported for zfs root */
++  if (is_zfs_mount == 1) {
++	return (0); /* no-op */
++  }
++
+   /* Save sector information about at most two sectors.  */
+   auto void disk_read_savesect_func (int sector, int offset, int length);
+   void disk_read_savesect_func (int sector, int offset, int length)
+@@ -5213,6 +5698,7 @@
+ #endif
+   &builtin_blocklist,
+   &builtin_boot,
++  &builtin_bootfs,
+ #ifdef SUPPORT_NETBOOT
+   &builtin_bootp,
+ #endif /* SUPPORT_NETBOOT */
+@@ -5241,6 +5727,7 @@
+   &builtin_embed,
+   &builtin_fallback,
+   &builtin_find,
++  &builtin_findroot,
+ #ifdef SUPPORT_GRAPHICS
+   &builtin_foreground,
+ #endif
+@@ -5258,6 +5745,7 @@
+   &builtin_install,
+   &builtin_ioprobe,
+   &builtin_kernel,
++  &builtin_kernel_dollar,
+   &builtin_lock,
+   &builtin_makeactive,
+   &builtin_map,
+@@ -5265,6 +5753,7 @@
+   &builtin_md5crypt,
+ #endif /* USE_MD5_PASSWORDS */
+   &builtin_module,
++  &builtin_module_dollar,
+   &builtin_modulenounzip,
+   &builtin_pager,
+   &builtin_partnew,
+diff -urN grub.patch50/stage2/char_io.c grub.zfs_solaris/stage2/char_io.c
+--- grub.patch50/stage2/char_io.c	2011-10-12 19:58:28.871922077 +0200
++++ grub.zfs_solaris/stage2/char_io.c	2011-10-12 19:58:29.027921196 +0200
+@@ -17,6 +17,10 @@
+  *  along with this program; if not, write to the Free Software
+  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+  */
++/*
++ * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
+ 
+ #include <shared.h>
+ #include <term.h>
+@@ -217,7 +221,7 @@
+     }
+ }
+ 
+-#ifndef STAGE1_5
++#if !defined(STAGE1_5) || defined(FSYS_ZFS)
+ int
+ grub_sprintf (char *buffer, const char *format, ...)
+ {
+@@ -261,8 +265,10 @@
+   *bp = 0;
+   return bp - buffer;
+ }
++#endif /* !defined(STAGE1_5) || defined(FSYS_ZFS) */
+ 
+ 
++#ifndef STAGE1_5
+ void
+ init_page (void)
+ {
+@@ -1013,7 +1019,10 @@
+    a static library supporting minimal standard C functions and link
+    each image with the library. Complicated things should be left to
+    computer, definitely. -okuji  */
+-#if !defined(STAGE1_5) || defined(FSYS_VSTAFS)
++
++/* Make some grub_str* routines available to ZFS plug-in as well */
++
++#if !defined(STAGE1_5) || defined(FSYS_VSTAFS) || defined(FSYS_ZFS)
+ int
+ grub_strcmp (const char *s1, const char *s2)
+ {
+@@ -1029,7 +1038,20 @@
+ 
+   return 0;
+ }
+-#endif /* ! STAGE1_5 || FSYS_VSTAFS */
++
++int
++grub_strncmp(const char *s1, const char *s2, int n)
++{
++        if (s1 == s2)
++                return (0);
++        n++;
++        while (--n != 0 && *s1 == *s2++)
++                if (*s1++ == '\0')
++                        return (0);
++        return ((n == 0) ? 0 : *(unsigned char *)s1 - *(unsigned char *)--s2);
++}
++
++#endif /* ! STAGE1_5 || FSYS_VSTAFS || defined(FSYS_ZFS) */
+ 
+ #ifndef STAGE1_5
+ /* Wait for a keypress and return its code.  */
+@@ -1195,7 +1217,9 @@
+   *str = 0;
+   return ch;
+ }
++#endif
+ 
++#if !defined(STAGE1_5) || defined(FSYS_ZFS)
+ char *
+ grub_strstr (const char *s1, const char *s2)
+ {
+@@ -1228,6 +1252,16 @@
+ 
+   return len;
+ }
++#endif /* !defined(STAGE1_5) || defined(FSYS_ZFS) */
++
++#ifndef STAGE1_5
++char *
++grub_strchr (char *str, char c)
++{
++  for (; *str && (*str != c); str++);
++
++  return (*str ? str : NULL);
++}
+ #endif /* ! STAGE1_5 */
+ 
+ int
+diff -urN grub.patch50/stage2/common.c grub.zfs_solaris/stage2/common.c
+--- grub.patch50/stage2/common.c	2011-10-12 19:58:28.871922077 +0200
++++ grub.zfs_solaris/stage2/common.c	2011-10-12 19:58:29.027921196 +0200
+@@ -88,6 +88,10 @@
+   [ERR_UNRECOGNIZED] = "Unrecognized command",
+   [ERR_WONT_FIT] = "Selected item cannot fit into memory",
+   [ERR_WRITE] = "Disk write error",
++  [ERR_FILESYSTEM_NOT_FOUND] = "File System not found",
++    /* this zfs file system is not found in the pool of the device */
++  [ERR_NO_BOOTPATH] = "No valid boot path found in the zfs label. This may be caused by attempting to boot from an off-lined device.",
++  [ERR_NEWER_VERSION] = "Newer on-disk pool version",
+ };
+ 
+ 
+diff -urN grub.patch50/stage2/disk_io.c grub.zfs_solaris/stage2/disk_io.c
+--- grub.patch50/stage2/disk_io.c	2011-10-12 19:58:28.875921314 +0200
++++ grub.zfs_solaris/stage2/disk_io.c	2011-10-12 19:58:29.031921885 +0200
+@@ -75,6 +75,9 @@
+ # ifdef FSYS_UFS2
+   {"ufs2", ufs2_mount, ufs2_read, ufs2_dir, 0, ufs2_embed},
+ # endif
++# ifdef FSYS_ZFS
++  {"zfs", zfs_mount, zfs_read, zfs_open, 0, zfs_embed},
++# endif
+ # ifdef FSYS_ISO9660
+   {"iso9660", iso9660_mount, iso9660_read, iso9660_dir, 0, 0},
+ # endif
+@@ -118,6 +121,17 @@
+ 
+ int current_slice;
+ 
++/* ZFS root filesystem for booting */
++char current_rootpool[MAXNAMELEN];
++char current_bootfs[MAXNAMELEN];
++unsigned long long current_bootfs_obj;
++char current_bootpath[MAXPATHLEN];
++char current_devid[MAXPATHLEN];
++int is_zfs_mount;
++unsigned long best_drive;
++unsigned long best_part;
++int find_best_root;
++
+ /* disk buffer parameters */
+ int buf_drive = -1;
+ int buf_track;
+@@ -404,7 +418,7 @@
+ 	  || current_drive == cdrom_drive)
+       && (current_partition & 0xFF) == 0xFF
+       && ((current_partition & 0xFF00) == 0xFF00
+-	  || (current_partition & 0xFF00) < 0x800)
++	  || (current_partition & 0xFF00) < 0x1000)
+       && ((current_partition >> 16) == 0xFF
+ 	  || (current_drive & 0x80)))
+     return 1;
+@@ -581,6 +595,7 @@
+ {
+   /* Forward declarations.  */
+   auto int next_bsd_partition (void);
++  auto int next_solaris_partition(void);
+   auto int next_pc_slice (void);
+ 
+   /* Get next BSD partition in current PC slice.  */
+@@ -640,6 +655,56 @@
+       return 0;
+     }
+ 
++  /* Get next Solaris partition in current PC slice.  */
++  int next_solaris_partition (void)
++    {
++      static unsigned long pcs_start;
++      int i;
++      int sol_part_no = (*partition & 0xFF00) >> 8;
++
++      /* If this is the first time...  */
++      if (sol_part_no == 0xFF)
++	{
++	  /* Check if the Solaris label is within current PC slice.  */
++	  if (*len < SOL_LABEL_LOC + 1)
++	    {
++	      errnum = ERR_BAD_PART_TABLE;
++	      return 0;
++	    }
++
++	  /* Read the Solaris label.  */
++	  if (! rawread (drive, *start + SOL_LABEL_LOC, 0, SECTOR_SIZE, buf))
++	    return 0;
++
++	  /* Check if it is valid.  */
++	  if (! SOL_LABEL_CHECK_MAG (buf))
++	    {
++	      errnum = ERR_BAD_PART_TABLE;
++	      return 0;
++	    }
++	  
++	  sol_part_no = -1;
++	  pcs_start = *start;	/* save the start of pc slice */
++	}
++
++      /* Search next valid Solaris partition.  */
++      for (i = sol_part_no + 1; i < SOL_LABEL_NPARTS; i++)
++	{
++	  if (SOL_PART_EXISTS (buf, i))
++	    {
++	      /* SOL_PART_START is relative to fdisk partition */
++	      *start = SOL_PART_START (buf, i) + pcs_start;
++	      *len = SOL_PART_LENGTH (buf, i);
++	      *partition = (*partition & 0xFF00FF) | (i << 8);
++
++	      return 1;
++	    }
++	}
++
++      errnum = ERR_NO_PART;
++      return 0;
++    }
++
+   /* Get next PC slice. Be careful of that this function may return
+      an empty PC slice (i.e. a partition whose type is zero) as well.  */
+   int next_pc_slice (void)
+@@ -717,6 +782,14 @@
+     return 0;
+ #endif
+ 
++  /* check for Solaris partition */
++  if (*partition != 0xFFFFFF && IS_PC_SLICE_TYPE_SOLARIS (*type & 0xff))
++    {
++      if (next_solaris_partition ())
++	return 1;
++      errnum = ERR_NONE;
++    }
++
+   /* If previous partition is a BSD partition or a PC slice which
+      contains BSD partitions...  */
+   if ((*partition != 0xFFFFFF && IS_PC_SLICE_TYPE_BSD (*type & 0xff))
+@@ -830,7 +903,8 @@
+ 		    grub_printf ("   Partition num: %d, ",
+ 				 current_partition >> 16);
+ 
+-		  if (! IS_PC_SLICE_TYPE_BSD (current_slice))
++		  if (! IS_PC_SLICE_TYPE_BSD (current_slice) &&
++		      ! IS_PC_SLICE_TYPE_SOLARIS (current_slice))
+ 		    check_and_print_mount ();
+ 		  else
+ 		    {
+@@ -844,17 +918,17 @@
+ 			  
+ 			  if (! got_part)
+ 			    {
+-			      grub_printf ("[BSD sub-partitions immediately follow]\n");
++			      grub_printf ("[BSD/SOLARIS sub-partitions immediately follow]\n");
+ 			      got_part = 1;
+ 			    }
+ 			  
+-			  grub_printf ("     BSD Partition num: \'%c\', ",
++			  grub_printf ("     BSD/SOLARIS Partition num: \'%c\', ",
+ 				       bsd_part + 'a');
+ 			  check_and_print_mount ();
+ 			}
+ 
+ 		      if (! got_part)
+-			grub_printf (" No BSD sub-partition found, partition type 0x%x\n",
++			grub_printf (" No BSD/SOLARIS sub-partition found, partition type 0x%x\n",
+ 				     saved_slice);
+ 		      
+ 		      if (errnum)
+@@ -880,7 +954,8 @@
+ 				      pc_slice, bsd_part + 'a');
+ 		      print_a_completion (str);
+ 		    }
+-		  else if (! IS_PC_SLICE_TYPE_BSD (current_slice))
++		  else if (! IS_PC_SLICE_TYPE_BSD (current_slice) &&
++		      ! IS_PC_SLICE_TYPE_SOLARIS (current_slice))
+ 		    {
+ 		      char str[8];
+ 		      
+@@ -1038,7 +1113,7 @@
+ 	}
+       else if (*device == ',')
+ 	{
+-	  /* Either an absolute PC or BSD partition. */
++	  /* Either an absolute PC, BSD, or Solaris partition. */
+ 	  disk_choice = 0;
+ 	  part_choice ++;
+ 	  device++;
+@@ -1061,13 +1136,13 @@
+ 	      if (*device == ',')
+ 		device++;
+ 	      
+-	      if (*device >= 'a' && *device <= 'h')
++	      if (*device >= 'a' && *device <= 'p')
+ 		{
+ 		  current_partition = (((*(device++) - 'a') << 8)
+ 				       | (current_partition & 0xFF00FF));
+ 		}
+ 	    }
+-	  else if (*device >= 'a' && *device <= 'h')
++	  else if (*device >= 'a' && *device <= 'p')
+ 	    {
+ 	      part_choice ++;
+ 	      current_partition = ((*(device++) - 'a') << 8) | 0xFF00FF;
+diff -urN grub.patch50/stage2/filesys.h grub.zfs_solaris/stage2/filesys.h
+--- grub.patch50/stage2/filesys.h	2011-10-12 19:58:28.875921314 +0200
++++ grub.zfs_solaris/stage2/filesys.h	2011-10-12 19:58:29.031921885 +0200
+@@ -40,6 +40,16 @@
+ #define FSYS_UFS2_NUM 0
+ #endif
+ 
++#ifdef FSYS_ZFS
++#define FSYS_ZFS_NUM 1
++int zfs_mount (void);
++int zfs_read (char *buf, int len);
++int zfs_open (char *dirname);
++int zfs_embed (int *start_sector, int needed_sectors);
++#else
++#define FSYS_ZFS_NUM 0
++#endif
++
+ #ifdef FSYS_FAT
+ #define FSYS_FAT_NUM 1
+ int fat_mount (void);
+@@ -128,7 +138,7 @@
+ #define NUM_FSYS	\
+   (FSYS_FFS_NUM + FSYS_FAT_NUM + FSYS_EXT2FS_NUM + FSYS_MINIX_NUM	\
+    + FSYS_REISERFS_NUM + FSYS_VSTAFS_NUM + FSYS_JFS_NUM + FSYS_XFS_NUM	\
+-   + FSYS_TFTP_NUM + FSYS_ISO9660_NUM + FSYS_UFS2_NUM)
++   + FSYS_TFTP_NUM + FSYS_ISO9660_NUM + FSYS_UFS2_NUM + FSYS_ZFS_NUM)
+ #endif
+ 
+ /* defines for the block filesystem info area */
+diff -urN grub.patch50/stage2/fsys_zfs.c grub.zfs_solaris/stage2/fsys_zfs.c
+--- grub.patch50/stage2/fsys_zfs.c	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/fsys_zfs.c	2011-10-12 19:58:29.035921285 +0200
+@@ -0,0 +1,1545 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
++ */
++
++/*
++ * The zfs plug-in routines for GRUB are:
++ *
++ * zfs_mount() - locates a valid uberblock of the root pool and reads
++ *		in its MOS at the memory address MOS.
++ *
++ * zfs_open() - locates a plain file object by following the MOS
++ *		and places its dnode at the memory address DNODE.
++ *
++ * zfs_read() - read in the data blocks pointed by the DNODE.
++ *
++ * ZFS_SCRATCH is used as a working area.
++ *
++ * (memory addr)   MOS      DNODE	ZFS_SCRATCH
++ *		    |         |          |
++ *	    +-------V---------V----------V---------------+
++ *   memory |       | dnode   | dnode    |  scratch      |
++ *	    |       | 512B    | 512B     |  area         |
++ *	    +--------------------------------------------+
++ */
++
++#ifdef	FSYS_ZFS
++
++#include "shared.h"
++#include "filesys.h"
++#include "fsys_zfs.h"
++
++/* cache for a file block of the currently zfs_open()-ed file */
++static void *file_buf = NULL;
++static uint64_t file_start = 0;
++static uint64_t file_end = 0;
++
++/* cache for a dnode block */
++static dnode_phys_t *dnode_buf = NULL;
++static dnode_phys_t *dnode_mdn = NULL;
++static uint64_t dnode_start = 0;
++static uint64_t dnode_end = 0;
++
++static uint64_t pool_guid = 0;
++static uberblock_t current_uberblock;
++static char *stackbase;
++
++decomp_entry_t decomp_table[ZIO_COMPRESS_FUNCTIONS] =
++{
++	{"inherit", 0},			/* ZIO_COMPRESS_INHERIT */
++	{"on", lzjb_decompress}, 	/* ZIO_COMPRESS_ON */
++	{"off", 0},			/* ZIO_COMPRESS_OFF */
++	{"lzjb", lzjb_decompress},	/* ZIO_COMPRESS_LZJB */
++	{"empty", 0}			/* ZIO_COMPRESS_EMPTY */
++};
++
++static int zio_read_data(blkptr_t *bp, void *buf, char *stack);
++
++/*
++ * Our own version of bcmp().
++ */
++static int
++zfs_bcmp(const void *s1, const void *s2, size_t n)
++{
++	const uchar_t *ps1 = s1;
++	const uchar_t *ps2 = s2;
++
++	if (s1 != s2 && n != 0) {
++		do {
++			if (*ps1++ != *ps2++)
++				return (1);
++		} while (--n != 0);
++	}
++
++	return (0);
++}
++
++/*
++ * Our own version of log2().  Same thing as highbit()-1.
++ */
++static int
++zfs_log2(uint64_t num)
++{
++	int i = 0;
++
++	while (num > 1) {
++		i++;
++		num = num >> 1;
++	}
++
++	return (i);
++}
++
++/* Checksum Functions */
++static void
++zio_checksum_off(const void *buf, uint64_t size, zio_cksum_t *zcp)
++{
++	ZIO_SET_CHECKSUM(zcp, 0, 0, 0, 0);
++}
++
++/* Checksum Table and Values */
++zio_checksum_info_t zio_checksum_table[ZIO_CHECKSUM_FUNCTIONS] = {
++	NULL,			NULL,			0, 0,	"inherit",
++	NULL,			NULL,			0, 0,	"on",
++	zio_checksum_off,	zio_checksum_off,	0, 0,	"off",
++	zio_checksum_SHA256,	zio_checksum_SHA256,	1, 1,	"label",
++	zio_checksum_SHA256,	zio_checksum_SHA256,	1, 1,	"gang_header",
++	NULL,			NULL,			0, 0,	"zilog",
++	fletcher_2_native,	fletcher_2_byteswap,	0, 0,	"fletcher2",
++	fletcher_4_native,	fletcher_4_byteswap,	1, 0,	"fletcher4",
++	zio_checksum_SHA256,	zio_checksum_SHA256,	1, 0,	"SHA256",
++	NULL,			NULL,			0, 0,	"zilog2",
++};
++
++/*
++ * zio_checksum_verify: Provides support for checksum verification.
++ *
++ * Fletcher2, Fletcher4, and SHA256 are supported.
++ *
++ * Return:
++ * 	-1 = Failure
++ *	 0 = Success
++ */
++static int
++zio_checksum_verify(blkptr_t *bp, char *data, int size)
++{
++	zio_cksum_t zc = bp->blk_cksum;
++	uint32_t checksum = BP_GET_CHECKSUM(bp);
++	int byteswap = BP_SHOULD_BYTESWAP(bp);
++	zio_eck_t *zec = (zio_eck_t *)(data + size) - 1;
++	zio_checksum_info_t *ci = &zio_checksum_table[checksum];
++	zio_cksum_t actual_cksum, expected_cksum;
++
++	/* byteswap is not supported */
++	if (byteswap)
++		return (-1);
++
++	if (checksum >= ZIO_CHECKSUM_FUNCTIONS || ci->ci_func[0] == NULL)
++		return (-1);
++
++	if (ci->ci_eck) {
++		expected_cksum = zec->zec_cksum;
++		zec->zec_cksum = zc;
++		ci->ci_func[0](data, size, &actual_cksum);
++		zec->zec_cksum = expected_cksum;
++		zc = expected_cksum;
++
++	} else {
++		ci->ci_func[byteswap](data, size, &actual_cksum);
++	}
++
++	if ((actual_cksum.zc_word[0] - zc.zc_word[0]) |
++	    (actual_cksum.zc_word[1] - zc.zc_word[1]) |
++	    (actual_cksum.zc_word[2] - zc.zc_word[2]) |
++	    (actual_cksum.zc_word[3] - zc.zc_word[3]))
++		return (-1);
++
++	return (0);
++}
++
++/*
++ * vdev_label_start returns the physical disk offset (in bytes) of
++ * label "l".
++ */
++static uint64_t
++vdev_label_start(uint64_t psize, int l)
++{
++	return (l * sizeof (vdev_label_t) + (l < VDEV_LABELS / 2 ?
++	    0 : psize - VDEV_LABELS * sizeof (vdev_label_t)));
++}
++
++/*
++ * vdev_uberblock_compare takes two uberblock structures and returns an integer
++ * indicating the more recent of the two.
++ * 	Return Value = 1 if ub2 is more recent
++ * 	Return Value = -1 if ub1 is more recent
++ * The most recent uberblock is determined using its transaction number and
++ * timestamp.  The uberblock with the highest transaction number is
++ * considered "newer".  If the transaction numbers of the two blocks match, the
++ * timestamps are compared to determine the "newer" of the two.
++ */
++static int
++vdev_uberblock_compare(uberblock_t *ub1, uberblock_t *ub2)
++{
++	if (ub1->ub_txg < ub2->ub_txg)
++		return (-1);
++	if (ub1->ub_txg > ub2->ub_txg)
++		return (1);
++
++	if (ub1->ub_timestamp < ub2->ub_timestamp)
++		return (-1);
++	if (ub1->ub_timestamp > ub2->ub_timestamp)
++		return (1);
++
++	return (0);
++}
++
++/*
++ * Three pieces of information are needed to verify an uberblock: the magic
++ * number, the version number, and the checksum.
++ *
++ * Currently Implemented: version number, magic number
++ * Need to Implement: checksum
++ *
++ * Return:
++ *     0 - Success
++ *    -1 - Failure
++ */
++static int
++uberblock_verify(uberblock_phys_t *ub, uint64_t offset)
++{
++
++	uberblock_t *uber = &ub->ubp_uberblock;
++	blkptr_t bp;
++
++	BP_ZERO(&bp);
++	BP_SET_CHECKSUM(&bp, ZIO_CHECKSUM_LABEL);
++	BP_SET_BYTEORDER(&bp, ZFS_HOST_BYTEORDER);
++	ZIO_SET_CHECKSUM(&bp.blk_cksum, offset, 0, 0, 0);
++
++	if (zio_checksum_verify(&bp, (char *)ub, UBERBLOCK_SIZE) != 0)
++		return (-1);
++
++	if (uber->ub_magic == UBERBLOCK_MAGIC &&
++	    uber->ub_version > 0 && uber->ub_version <= SPA_VERSION)
++		return (0);
++
++	return (-1);
++}
++
++/*
++ * Find the best uberblock.
++ * Return:
++ *    Success - Pointer to the best uberblock.
++ *    Failure - NULL
++ */
++static uberblock_phys_t *
++find_bestub(uberblock_phys_t *ub_array, uint64_t sector)
++{
++	uberblock_phys_t *ubbest = NULL;
++	uint64_t offset;
++	int i;
++
++	for (i = 0; i < (VDEV_UBERBLOCK_RING >> VDEV_UBERBLOCK_SHIFT); i++) {
++		offset = (sector << SPA_MINBLOCKSHIFT) +
++		    VDEV_UBERBLOCK_OFFSET(i);
++		if (uberblock_verify(&ub_array[i], offset) == 0) {
++			if (ubbest == NULL) {
++				ubbest = &ub_array[i];
++			} else if (vdev_uberblock_compare(
++			    &(ub_array[i].ubp_uberblock),
++			    &(ubbest->ubp_uberblock)) > 0) {
++				ubbest = &ub_array[i];
++			}
++		}
++	}
++
++	return (ubbest);
++}
++
++/*
++ * Read a block of data based on the gang block address dva,
++ * and put its data in buf.
++ *
++ * Return:
++ *	0 - success
++ *	1 - failure
++ */
++static int
++zio_read_gang(blkptr_t *bp, dva_t *dva, void *buf, char *stack)
++{
++	zio_gbh_phys_t *zio_gb;
++	uint64_t offset, sector;
++	blkptr_t tmpbp;
++	int i;
++
++	zio_gb = (zio_gbh_phys_t *)stack;
++	stack += SPA_GANGBLOCKSIZE;
++	offset = DVA_GET_OFFSET(dva);
++	sector =  DVA_OFFSET_TO_PHYS_SECTOR(offset);
++
++	/* read in the gang block header */
++	if (devread(sector, 0, SPA_GANGBLOCKSIZE, (char *)zio_gb) == 0) {
++		grub_printf("failed to read in a gang block header\n");
++		return (1);
++	}
++
++	/* self checksuming the gang block header */
++	BP_ZERO(&tmpbp);
++	BP_SET_CHECKSUM(&tmpbp, ZIO_CHECKSUM_GANG_HEADER);
++	BP_SET_BYTEORDER(&tmpbp, ZFS_HOST_BYTEORDER);
++	ZIO_SET_CHECKSUM(&tmpbp.blk_cksum, DVA_GET_VDEV(dva),
++	    DVA_GET_OFFSET(dva), bp->blk_birth, 0);
++	if (zio_checksum_verify(&tmpbp, (char *)zio_gb, SPA_GANGBLOCKSIZE)) {
++		grub_printf("failed to checksum a gang block header\n");
++		return (1);
++	}
++
++	for (i = 0; i < SPA_GBH_NBLKPTRS; i++) {
++		if (zio_gb->zg_blkptr[i].blk_birth == 0)
++			continue;
++
++		if (zio_read_data(&zio_gb->zg_blkptr[i], buf, stack))
++			return (1);
++		buf += BP_GET_PSIZE(&zio_gb->zg_blkptr[i]);
++	}
++
++	return (0);
++}
++
++/*
++ * Read in a block of raw data to buf.
++ *
++ * Return:
++ *	0 - success
++ *	1 - failure
++ */
++static int
++zio_read_data(blkptr_t *bp, void *buf, char *stack)
++{
++	int i, psize;
++
++	psize = BP_GET_PSIZE(bp);
++
++	/* pick a good dva from the block pointer */
++	for (i = 0; i < SPA_DVAS_PER_BP; i++) {
++		uint64_t offset, sector;
++
++		if (bp->blk_dva[i].dva_word[0] == 0 &&
++		    bp->blk_dva[i].dva_word[1] == 0)
++			continue;
++
++		if (DVA_GET_GANG(&bp->blk_dva[i])) {
++			if (zio_read_gang(bp, &bp->blk_dva[i], buf, stack) == 0)
++				return (0);
++		} else {
++			/* read in a data block */
++			offset = DVA_GET_OFFSET(&bp->blk_dva[i]);
++			sector =  DVA_OFFSET_TO_PHYS_SECTOR(offset);
++			if (devread(sector, 0, psize, buf))
++				return (0);
++		}
++	}
++
++	return (1);
++}
++
++/*
++ * Read in a block of data, verify its checksum, decompress if needed,
++ * and put the uncompressed data in buf.
++ *
++ * Return:
++ *	0 - success
++ *	errnum - failure
++ */
++static int
++zio_read(blkptr_t *bp, void *buf, char *stack)
++{
++	int lsize, psize, comp;
++	char *retbuf;
++
++	comp = BP_GET_COMPRESS(bp);
++	lsize = BP_GET_LSIZE(bp);
++	psize = BP_GET_PSIZE(bp);
++
++	if ((unsigned int)comp >= ZIO_COMPRESS_FUNCTIONS ||
++	    (comp != ZIO_COMPRESS_OFF &&
++	    decomp_table[comp].decomp_func == NULL)) {
++		grub_printf("compression algorithm not supported\n");
++		return (ERR_FSYS_CORRUPT);
++	}
++
++	if ((char *)buf < stack && ((char *)buf) + lsize > stack) {
++		grub_printf("not enough memory allocated\n");
++		return (ERR_WONT_FIT);
++	}
++
++	retbuf = buf;
++	if (comp != ZIO_COMPRESS_OFF) {
++		buf = stack;
++		stack += psize;
++	}
++
++	if (zio_read_data(bp, buf, stack)) {
++		grub_printf("zio_read_data failed\n");
++		return (ERR_FSYS_CORRUPT);
++	}
++
++	if (zio_checksum_verify(bp, buf, psize) != 0) {
++		grub_printf("checksum verification failed\n");
++		return (ERR_FSYS_CORRUPT);
++	}
++
++	if (comp != ZIO_COMPRESS_OFF)
++		decomp_table[comp].decomp_func(buf, retbuf, psize, lsize);
++
++	return (0);
++}
++
++/*
++ * Get the block from a block id.
++ * push the block onto the stack.
++ *
++ * Return:
++ * 	0 - success
++ * 	errnum - failure
++ */
++static int
++dmu_read(dnode_phys_t *dn, uint64_t blkid, void *buf, char *stack)
++{
++	int idx, level;
++	blkptr_t *bp_array = dn->dn_blkptr;
++	int epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
++	blkptr_t *bp, *tmpbuf;
++
++	bp = (blkptr_t *)stack;
++	stack += sizeof (blkptr_t);
++
++	tmpbuf = (blkptr_t *)stack;
++	stack += 1<<dn->dn_indblkshift;
++
++	for (level = dn->dn_nlevels - 1; level >= 0; level--) {
++		idx = (blkid >> (epbs * level)) & ((1<<epbs)-1);
++		*bp = bp_array[idx];
++		if (level == 0)
++			tmpbuf = buf;
++		if (BP_IS_HOLE(bp)) {
++			grub_memset(buf, 0,
++			    dn->dn_datablkszsec << SPA_MINBLOCKSHIFT);
++			break;
++		} else if (errnum = zio_read(bp, tmpbuf, stack)) {
++			return (errnum);
++		}
++
++		bp_array = tmpbuf;
++	}
++
++	return (0);
++}
++
++/*
++ * mzap_lookup: Looks up property described by "name" and returns the value
++ * in "value".
++ *
++ * Return:
++ *	0 - success
++ *	errnum - failure
++ */
++static int
++mzap_lookup(mzap_phys_t *zapobj, int objsize, char *name,
++	uint64_t *value)
++{
++	int i, chunks;
++	mzap_ent_phys_t *mzap_ent = zapobj->mz_chunk;
++
++	chunks = objsize/MZAP_ENT_LEN - 1;
++	for (i = 0; i < chunks; i++) {
++		if (grub_strcmp(mzap_ent[i].mze_name, name) == 0) {
++			*value = mzap_ent[i].mze_value;
++			return (0);
++		}
++	}
++
++	return (ERR_FSYS_CORRUPT);
++}
++
++static uint64_t
++zap_hash(uint64_t salt, const char *name)
++{
++	static uint64_t table[256];
++	const uint8_t *cp;
++	uint8_t c;
++	uint64_t crc = salt;
++
++	if (table[128] == 0) {
++		uint64_t *ct;
++		int i, j;
++		for (i = 0; i < 256; i++) {
++			for (ct = table + i, *ct = i, j = 8; j > 0; j--)
++				*ct = (*ct >> 1) ^ (-(*ct & 1) &
++				    ZFS_CRC64_POLY);
++		}
++	}
++
++	if (crc == 0 || table[128] != ZFS_CRC64_POLY) {
++		errnum = ERR_FSYS_CORRUPT;
++		return (0);
++	}
++
++	for (cp = (const uint8_t *)name; (c = *cp) != '\0'; cp++)
++		crc = (crc >> 8) ^ table[(crc ^ c) & 0xFF];
++
++	/*
++	 * Only use 28 bits, since we need 4 bits in the cookie for the
++	 * collision differentiator.  We MUST use the high bits, since
++	 * those are the onces that we first pay attention to when
++	 * chosing the bucket.
++	 */
++	crc &= ~((1ULL << (64 - 28)) - 1);
++
++	return (crc);
++}
++
++/*
++ * Only to be used on 8-bit arrays.
++ * array_len is actual len in bytes (not encoded le_value_length).
++ * buf is null-terminated.
++ */
++static int
++zap_leaf_array_equal(zap_leaf_phys_t *l, int blksft, int chunk,
++    int array_len, const char *buf)
++{
++	int bseen = 0;
++
++	while (bseen < array_len) {
++		struct zap_leaf_array *la =
++		    &ZAP_LEAF_CHUNK(l, blksft, chunk).l_array;
++		int toread = MIN(array_len - bseen, ZAP_LEAF_ARRAY_BYTES);
++
++		if (chunk >= ZAP_LEAF_NUMCHUNKS(blksft))
++			return (0);
++
++		if (zfs_bcmp(la->la_array, buf + bseen, toread) != 0)
++			break;
++		chunk = la->la_next;
++		bseen += toread;
++	}
++	return (bseen == array_len);
++}
++
++/*
++ * Given a zap_leaf_phys_t, walk thru the zap leaf chunks to get the
++ * value for the property "name".
++ *
++ * Return:
++ *	0 - success
++ *	errnum - failure
++ */
++static int
++zap_leaf_lookup(zap_leaf_phys_t *l, int blksft, uint64_t h,
++    const char *name, uint64_t *value)
++{
++	uint16_t chunk;
++	struct zap_leaf_entry *le;
++
++	/* Verify if this is a valid leaf block */
++	if (l->l_hdr.lh_block_type != ZBT_LEAF)
++		return (ERR_FSYS_CORRUPT);
++	if (l->l_hdr.lh_magic != ZAP_LEAF_MAGIC)
++		return (ERR_FSYS_CORRUPT);
++
++	for (chunk = l->l_hash[LEAF_HASH(blksft, h)];
++	    chunk != CHAIN_END; chunk = le->le_next) {
++
++		if (chunk >= ZAP_LEAF_NUMCHUNKS(blksft))
++			return (ERR_FSYS_CORRUPT);
++
++		le = ZAP_LEAF_ENTRY(l, blksft, chunk);
++
++		/* Verify the chunk entry */
++		if (le->le_type != ZAP_CHUNK_ENTRY)
++			return (ERR_FSYS_CORRUPT);
++
++		if (le->le_hash != h)
++			continue;
++
++		if (zap_leaf_array_equal(l, blksft, le->le_name_chunk,
++		    le->le_name_length, name)) {
++
++			struct zap_leaf_array *la;
++			uint8_t *ip;
++
++			if (le->le_int_size != 8 || le->le_value_length != 1)
++				return (ERR_FSYS_CORRUPT);
++
++			/* get the uint64_t property value */
++			la = &ZAP_LEAF_CHUNK(l, blksft,
++			    le->le_value_chunk).l_array;
++			ip = la->la_array;
++
++			*value = (uint64_t)ip[0] << 56 | (uint64_t)ip[1] << 48 |
++			    (uint64_t)ip[2] << 40 | (uint64_t)ip[3] << 32 |
++			    (uint64_t)ip[4] << 24 | (uint64_t)ip[5] << 16 |
++			    (uint64_t)ip[6] << 8 | (uint64_t)ip[7];
++
++			return (0);
++		}
++	}
++
++	return (ERR_FSYS_CORRUPT);
++}
++
++/*
++ * Fat ZAP lookup
++ *
++ * Return:
++ *	0 - success
++ *	errnum - failure
++ */
++static int
++fzap_lookup(dnode_phys_t *zap_dnode, zap_phys_t *zap,
++    char *name, uint64_t *value, char *stack)
++{
++	zap_leaf_phys_t *l;
++	uint64_t hash, idx, blkid;
++	int blksft = zfs_log2(zap_dnode->dn_datablkszsec << DNODE_SHIFT);
++
++	/* Verify if this is a fat zap header block */
++	if (zap->zap_magic != (uint64_t)ZAP_MAGIC ||
++	    zap->zap_flags != 0)
++		return (ERR_FSYS_CORRUPT);
++
++	hash = zap_hash(zap->zap_salt, name);
++	if (errnum)
++		return (errnum);
++
++	/* get block id from index */
++	if (zap->zap_ptrtbl.zt_numblks != 0) {
++		/* external pointer tables not supported */
++		return (ERR_FSYS_CORRUPT);
++	}
++	idx = ZAP_HASH_IDX(hash, zap->zap_ptrtbl.zt_shift);
++	blkid = ((uint64_t *)zap)[idx + (1<<(blksft-3-1))];
++
++	/* Get the leaf block */
++	l = (zap_leaf_phys_t *)stack;
++	stack += 1<<blksft;
++	if ((1<<blksft) < sizeof (zap_leaf_phys_t))
++		return (ERR_FSYS_CORRUPT);
++	if (errnum = dmu_read(zap_dnode, blkid, l, stack))
++		return (errnum);
++
++	return (zap_leaf_lookup(l, blksft, hash, name, value));
++}
++
++/*
++ * Read in the data of a zap object and find the value for a matching
++ * property name.
++ *
++ * Return:
++ *	0 - success
++ *	errnum - failure
++ */
++static int
++zap_lookup(dnode_phys_t *zap_dnode, char *name, uint64_t *val, char *stack)
++{
++	uint64_t block_type;
++	int size;
++	void *zapbuf;
++
++	/* Read in the first block of the zap object data. */
++	zapbuf = stack;
++	size = zap_dnode->dn_datablkszsec << SPA_MINBLOCKSHIFT;
++	stack += size;
++
++	if (errnum = dmu_read(zap_dnode, 0, zapbuf, stack))
++		return (errnum);
++
++	block_type = *((uint64_t *)zapbuf);
++
++	if (block_type == ZBT_MICRO) {
++		return (mzap_lookup(zapbuf, size, name, val));
++	} else if (block_type == ZBT_HEADER) {
++		/* this is a fat zap */
++		return (fzap_lookup(zap_dnode, zapbuf, name,
++		    val, stack));
++	}
++
++	return (ERR_FSYS_CORRUPT);
++}
++
++/*
++ * Get the dnode of an object number from the metadnode of an object set.
++ *
++ * Input
++ *	mdn - metadnode to get the object dnode
++ *	objnum - object number for the object dnode
++ *	buf - data buffer that holds the returning dnode
++ *	stack - scratch area
++ *
++ * Return:
++ *	0 - success
++ *	errnum - failure
++ */
++static int
++dnode_get(dnode_phys_t *mdn, uint64_t objnum, uint8_t type, dnode_phys_t *buf,
++	char *stack)
++{
++	uint64_t blkid, blksz; /* the block id this object dnode is in */
++	int epbs; /* shift of number of dnodes in a block */
++	int idx; /* index within a block */
++	dnode_phys_t *dnbuf;
++
++	blksz = mdn->dn_datablkszsec << SPA_MINBLOCKSHIFT;
++	epbs = zfs_log2(blksz) - DNODE_SHIFT;
++	blkid = objnum >> epbs;
++	idx = objnum & ((1<<epbs)-1);
++
++	if (dnode_buf != NULL && dnode_mdn == mdn &&
++	    objnum >= dnode_start && objnum < dnode_end) {
++		grub_memmove(buf, &dnode_buf[idx], DNODE_SIZE);
++		VERIFY_DN_TYPE(buf, type);
++		return (0);
++	}
++
++	if (dnode_buf && blksz == 1<<DNODE_BLOCK_SHIFT) {
++		dnbuf = dnode_buf;
++		dnode_mdn = mdn;
++		dnode_start = blkid << epbs;
++		dnode_end = (blkid + 1) << epbs;
++	} else {
++		dnbuf = (dnode_phys_t *)stack;
++		stack += blksz;
++	}
++
++	if (errnum = dmu_read(mdn, blkid, (char *)dnbuf, stack))
++		return (errnum);
++
++	grub_memmove(buf, &dnbuf[idx], DNODE_SIZE);
++	VERIFY_DN_TYPE(buf, type);
++
++	return (0);
++}
++
++/*
++ * Check if this is a special file that resides at the top
++ * dataset of the pool. Currently this is the GRUB menu,
++ * boot signature and boot signature backup.
++ * str starts with '/'.
++ */
++static int
++is_top_dataset_file(char *str)
++{
++	char *tptr;
++
++	if ((tptr = grub_strstr(str, "menu.lst")) &&
++	    (tptr[8] == '\0' || tptr[8] == ' ') &&
++	    *(tptr-1) == '/')
++		return (1);
++
++	if (grub_strncmp(str, BOOTSIGN_DIR"/",
++	    grub_strlen(BOOTSIGN_DIR) + 1) == 0)
++		return (1);
++
++	if (grub_strcmp(str, BOOTSIGN_BACKUP) == 0)
++		return (1);
++
++	return (0);
++}
++
++/*
++ * Get the file dnode for a given file name where mdn is the meta dnode
++ * for this ZFS object set. When found, place the file dnode in dn.
++ * The 'path' argument will be mangled.
++ *
++ * Return:
++ *	0 - success
++ *	errnum - failure
++ */
++static int
++dnode_get_path(dnode_phys_t *mdn, char *path, dnode_phys_t *dn,
++    char *stack)
++{
++	uint64_t objnum, version;
++	char *cname, ch;
++
++	if (errnum = dnode_get(mdn, MASTER_NODE_OBJ, DMU_OT_MASTER_NODE,
++	    dn, stack))
++		return (errnum);
++
++	if (errnum = zap_lookup(dn, ZPL_VERSION_STR, &version, stack))
++		return (errnum);
++	if (version > ZPL_VERSION)
++		return (-1);
++
++	if (errnum = zap_lookup(dn, ZFS_ROOT_OBJ, &objnum, stack))
++		return (errnum);
++
++	if (errnum = dnode_get(mdn, objnum, DMU_OT_DIRECTORY_CONTENTS,
++	    dn, stack))
++		return (errnum);
++
++	/* skip leading slashes */
++	while (*path == '/')
++		path++;
++
++	while (*path && !isspace(*path)) {
++
++		/* get the next component name */
++		cname = path;
++		while (*path && !isspace(*path) && *path != '/')
++			path++;
++		ch = *path;
++		*path = 0;   /* ensure null termination */
++
++		if (errnum = zap_lookup(dn, cname, &objnum, stack))
++			return (errnum);
++
++		objnum = ZFS_DIRENT_OBJ(objnum);
++		if (errnum = dnode_get(mdn, objnum, 0, dn, stack))
++			return (errnum);
++
++		*path = ch;
++		while (*path == '/')
++			path++;
++	}
++
++	/* We found the dnode for this file. Verify if it is a plain file. */
++	VERIFY_DN_TYPE(dn, DMU_OT_PLAIN_FILE_CONTENTS);
++
++	return (0);
++}
++
++/*
++ * Get the default 'bootfs' property value from the rootpool.
++ *
++ * Return:
++ *	0 - success
++ *	errnum -failure
++ */
++static int
++get_default_bootfsobj(dnode_phys_t *mosmdn, uint64_t *obj, char *stack)
++{
++	uint64_t objnum = 0;
++	dnode_phys_t *dn = (dnode_phys_t *)stack;
++	stack += DNODE_SIZE;
++
++	if (errnum = dnode_get(mosmdn, DMU_POOL_DIRECTORY_OBJECT,
++	    DMU_OT_OBJECT_DIRECTORY, dn, stack))
++		return (errnum);
++
++	/*
++	 * find the object number for 'pool_props', and get the dnode
++	 * of the 'pool_props'.
++	 */
++	if (zap_lookup(dn, DMU_POOL_PROPS, &objnum, stack))
++		return (ERR_FILESYSTEM_NOT_FOUND);
++
++	if (errnum = dnode_get(mosmdn, objnum, DMU_OT_POOL_PROPS, dn, stack))
++		return (errnum);
++
++	if (zap_lookup(dn, ZPOOL_PROP_BOOTFS, &objnum, stack))
++		return (ERR_FILESYSTEM_NOT_FOUND);
++
++	if (!objnum)
++		return (ERR_FILESYSTEM_NOT_FOUND);
++
++	*obj = objnum;
++	return (0);
++}
++
++/*
++ * Given a MOS metadnode, get the metadnode of a given filesystem name (fsname),
++ * e.g. pool/rootfs, or a given object number (obj), e.g. the object number
++ * of pool/rootfs.
++ *
++ * If no fsname and no obj are given, return the DSL_DIR metadnode.
++ * If fsname is given, return its metadnode and its matching object number.
++ * If only obj is given, return the metadnode for this object number.
++ *
++ * Return:
++ *	0 - success
++ *	errnum - failure
++ */
++static int
++get_objset_mdn(dnode_phys_t *mosmdn, char *fsname, uint64_t *obj,
++    dnode_phys_t *mdn, char *stack)
++{
++	uint64_t objnum, headobj;
++	char *cname, ch;
++	blkptr_t *bp;
++	objset_phys_t *osp;
++	int issnapshot = 0;
++	char *snapname;
++
++	if (fsname == NULL && obj) {
++		headobj = *obj;
++		goto skip;
++	}
++
++	if (errnum = dnode_get(mosmdn, DMU_POOL_DIRECTORY_OBJECT,
++	    DMU_OT_OBJECT_DIRECTORY, mdn, stack))
++		return (errnum);
++
++	if (errnum = zap_lookup(mdn, DMU_POOL_ROOT_DATASET, &objnum,
++	    stack))
++		return (errnum);
++
++	if (errnum = dnode_get(mosmdn, objnum, DMU_OT_DSL_DIR, mdn, stack))
++		return (errnum);
++
++	if (fsname == NULL) {
++		headobj =
++		    ((dsl_dir_phys_t *)DN_BONUS(mdn))->dd_head_dataset_obj;
++		goto skip;
++	}
++
++	/* take out the pool name */
++	while (*fsname && !isspace(*fsname) && *fsname != '/')
++		fsname++;
++
++	while (*fsname && !isspace(*fsname)) {
++		uint64_t childobj;
++
++		while (*fsname == '/')
++			fsname++;
++
++		cname = fsname;
++		while (*fsname && !isspace(*fsname) && *fsname != '/')
++			fsname++;
++		ch = *fsname;
++		*fsname = 0;
++
++		snapname = cname;
++		while (*snapname && !isspace(*snapname) && *snapname != '@')
++			snapname++;
++		if (*snapname == '@') {
++			issnapshot = 1;
++			*snapname = 0;
++		}
++		childobj =
++		    ((dsl_dir_phys_t *)DN_BONUS(mdn))->dd_child_dir_zapobj;
++		if (childobj == 0)
++			return (ERR_FILESYSTEM_NOT_FOUND);
++		if (errnum = dnode_get(mosmdn, childobj,
++		    DMU_OT_DSL_DIR_CHILD_MAP, mdn, stack))
++			return (errnum);
++
++		if (zap_lookup(mdn, cname, &objnum, stack))
++			return (ERR_FILESYSTEM_NOT_FOUND);
++
++		if (errnum = dnode_get(mosmdn, objnum, DMU_OT_DSL_DIR,
++		    mdn, stack))
++			return (errnum);
++
++		*fsname = ch;
++		if (issnapshot)
++			*snapname = '@';
++	}
++	headobj = ((dsl_dir_phys_t *)DN_BONUS(mdn))->dd_head_dataset_obj;
++	if (obj)
++		*obj = headobj;
++
++skip:
++	if (errnum = dnode_get(mosmdn, headobj, DMU_OT_DSL_DATASET, mdn, stack))
++		return (errnum);
++	if (issnapshot) {
++		uint64_t snapobj;
++
++		snapobj = ((dsl_dataset_phys_t *)DN_BONUS(mdn))->
++		    ds_snapnames_zapobj;
++
++		if (errnum = dnode_get(mosmdn, snapobj,
++		    DMU_OT_DSL_DS_SNAP_MAP, mdn, stack))
++			return (errnum);
++		if (zap_lookup(mdn, snapname + 1, &headobj, stack))
++			return (ERR_FILESYSTEM_NOT_FOUND);
++		if (errnum = dnode_get(mosmdn, headobj,
++		    DMU_OT_DSL_DATASET, mdn, stack))
++			return (errnum);
++		if (obj)
++			*obj = headobj;
++	}
++
++	bp = &((dsl_dataset_phys_t *)DN_BONUS(mdn))->ds_bp;
++	osp = (objset_phys_t *)stack;
++	stack += sizeof (objset_phys_t);
++	if (errnum = zio_read(bp, osp, stack))
++		return (errnum);
++
++	grub_memmove((char *)mdn, (char *)&osp->os_meta_dnode, DNODE_SIZE);
++
++	return (0);
++}
++
++/*
++ * For a given XDR packed nvlist, verify the first 4 bytes and move on.
++ *
++ * An XDR packed nvlist is encoded as (comments from nvs_xdr_create) :
++ *
++ *      encoding method/host endian     (4 bytes)
++ *      nvl_version                     (4 bytes)
++ *      nvl_nvflag                      (4 bytes)
++ *	encoded nvpairs:
++ *		encoded size of the nvpair      (4 bytes)
++ *		decoded size of the nvpair      (4 bytes)
++ *		name string size                (4 bytes)
++ *		name string data                (sizeof(NV_ALIGN4(string))
++ *		data type                       (4 bytes)
++ *		# of elements in the nvpair     (4 bytes)
++ *		data
++ *      2 zero's for the last nvpair
++ *		(end of the entire list)	(8 bytes)
++ *
++ * Return:
++ *	0 - success
++ *	1 - failure
++ */
++static int
++nvlist_unpack(char *nvlist, char **out)
++{
++	/* Verify if the 1st and 2nd byte in the nvlist are valid. */
++	if (nvlist[0] != NV_ENCODE_XDR || nvlist[1] != HOST_ENDIAN)
++		return (1);
++
++	nvlist += 4;
++	*out = nvlist;
++	return (0);
++}
++
++static char *
++nvlist_array(char *nvlist, int index)
++{
++	int i, encode_size;
++
++	for (i = 0; i < index; i++) {
++		/* skip the header, nvl_version, and nvl_nvflag */
++		nvlist = nvlist + 4 * 2;
++
++		while (encode_size = BSWAP_32(*(uint32_t *)nvlist))
++			nvlist += encode_size; /* goto the next nvpair */
++
++		nvlist = nvlist + 4 * 2; /* skip the ending 2 zeros - 8 bytes */
++	}
++
++	return (nvlist);
++}
++
++static int
++nvlist_lookup_value(char *nvlist, char *name, void *val, int valtype,
++    int *nelmp)
++{
++	int name_len, type, slen, encode_size;
++	char *nvpair, *nvp_name, *strval = val;
++	uint64_t *intval = val;
++
++	/* skip the header, nvl_version, and nvl_nvflag */
++	nvlist = nvlist + 4 * 2;
++
++	/*
++	 * Loop thru the nvpair list
++	 * The XDR representation of an integer is in big-endian byte order.
++	 */
++	while (encode_size = BSWAP_32(*(uint32_t *)nvlist))  {
++
++		nvpair = nvlist + 4 * 2; /* skip the encode/decode size */
++
++		name_len = BSWAP_32(*(uint32_t *)nvpair);
++		nvpair += 4;
++
++		nvp_name = nvpair;
++		nvpair = nvpair + ((name_len + 3) & ~3); /* align */
++
++		type = BSWAP_32(*(uint32_t *)nvpair);
++		nvpair += 4;
++
++		if ((grub_strncmp(nvp_name, name, name_len) == 0) &&
++		    type == valtype) {
++			int nelm;
++
++			if ((nelm = BSWAP_32(*(uint32_t *)nvpair)) < 1)
++				return (1);
++			nvpair += 4;
++
++			switch (valtype) {
++			case DATA_TYPE_STRING:
++				slen = BSWAP_32(*(uint32_t *)nvpair);
++				nvpair += 4;
++				grub_memmove(strval, nvpair, slen);
++				strval[slen] = '\0';
++				return (0);
++
++			case DATA_TYPE_UINT64:
++				*intval = BSWAP_64(*(uint64_t *)nvpair);
++				return (0);
++
++			case DATA_TYPE_NVLIST:
++				*(void **)val = (void *)nvpair;
++				return (0);
++
++			case DATA_TYPE_NVLIST_ARRAY:
++				*(void **)val = (void *)nvpair;
++				if (nelmp)
++					*nelmp = nelm;
++				return (0);
++			}
++		}
++
++		nvlist += encode_size; /* goto the next nvpair */
++	}
++
++	return (1);
++}
++
++/*
++ * Check if this vdev is online and is in a good state.
++ */
++static int
++vdev_validate(char *nv)
++{
++	uint64_t ival;
++
++	if (nvlist_lookup_value(nv, ZPOOL_CONFIG_OFFLINE, &ival,
++	    DATA_TYPE_UINT64, NULL) == 0 ||
++	    nvlist_lookup_value(nv, ZPOOL_CONFIG_FAULTED, &ival,
++	    DATA_TYPE_UINT64, NULL) == 0 ||
++	    nvlist_lookup_value(nv, ZPOOL_CONFIG_REMOVED, &ival,
++	    DATA_TYPE_UINT64, NULL) == 0)
++		return (ERR_DEV_VALUES);
++
++	return (0);
++}
++
++/*
++ * Get a valid vdev pathname/devid from the boot device.
++ * The caller should already allocate MAXPATHLEN memory for bootpath and devid.
++ */
++static int
++vdev_get_bootpath(char *nv, uint64_t inguid, char *devid, char *bootpath,
++    int is_spare)
++{
++	char type[16];
++
++	if (nvlist_lookup_value(nv, ZPOOL_CONFIG_TYPE, &type, DATA_TYPE_STRING,
++	    NULL))
++		return (ERR_FSYS_CORRUPT);
++
++	if (strcmp(type, VDEV_TYPE_DISK) == 0) {
++		uint64_t guid;
++
++		if (vdev_validate(nv) != 0)
++			return (ERR_NO_BOOTPATH);
++
++		if (nvlist_lookup_value(nv, ZPOOL_CONFIG_GUID,
++		    &guid, DATA_TYPE_UINT64, NULL) != 0)
++			return (ERR_NO_BOOTPATH);
++
++		if (guid != inguid)
++			return (ERR_NO_BOOTPATH);
++
++		/* for a spare vdev, pick the disk labeled with "is_spare" */
++		if (is_spare) {
++			uint64_t spare = 0;
++			(void) nvlist_lookup_value(nv, ZPOOL_CONFIG_IS_SPARE,
++			    &spare, DATA_TYPE_UINT64, NULL);
++			if (!spare)
++				return (ERR_NO_BOOTPATH);
++		}
++
++		if (nvlist_lookup_value(nv, ZPOOL_CONFIG_PHYS_PATH,
++		    bootpath, DATA_TYPE_STRING, NULL) != 0)
++			bootpath[0] = '\0';
++
++		if (nvlist_lookup_value(nv, ZPOOL_CONFIG_DEVID,
++		    devid, DATA_TYPE_STRING, NULL) != 0)
++			devid[0] = '\0';
++
++		if (strlen(bootpath) >= MAXPATHLEN ||
++		    strlen(devid) >= MAXPATHLEN)
++			return (ERR_WONT_FIT);
++
++		return (0);
++
++	} else if (strcmp(type, VDEV_TYPE_MIRROR) == 0 ||
++	    strcmp(type, VDEV_TYPE_REPLACING) == 0 ||
++	    (is_spare = (strcmp(type, VDEV_TYPE_SPARE) == 0))) {
++		int nelm, i;
++		char *child;
++
++		if (nvlist_lookup_value(nv, ZPOOL_CONFIG_CHILDREN, &child,
++		    DATA_TYPE_NVLIST_ARRAY, &nelm))
++			return (ERR_FSYS_CORRUPT);
++
++		for (i = 0; i < nelm; i++) {
++			char *child_i;
++
++			child_i = nvlist_array(child, i);
++			if (vdev_get_bootpath(child_i, inguid, devid,
++			    bootpath, is_spare) == 0)
++				return (0);
++		}
++	}
++
++	return (ERR_NO_BOOTPATH);
++}
++
++/*
++ * Check the disk label information and retrieve needed vdev name-value pairs.
++ *
++ * Return:
++ *	0 - success
++ *	ERR_* - failure
++ */
++int
++check_pool_label(uint64_t sector, char *stack, char *outdevid,
++    char *outpath, uint64_t *outguid)
++{
++	vdev_phys_t *vdev;
++	uint64_t pool_state, txg = 0;
++	char *nvlist, *nv;
++	uint64_t diskguid;
++	uint64_t version;
++
++	sector += (VDEV_SKIP_SIZE >> SPA_MINBLOCKSHIFT);
++
++	/* Read in the vdev name-value pair list (112K). */
++	if (devread(sector, 0, VDEV_PHYS_SIZE, stack) == 0)
++		return (ERR_READ);
++
++	vdev = (vdev_phys_t *)stack;
++	stack += sizeof (vdev_phys_t);
++
++	if (nvlist_unpack(vdev->vp_nvlist, &nvlist))
++		return (ERR_FSYS_CORRUPT);
++
++	if (nvlist_lookup_value(nvlist, ZPOOL_CONFIG_POOL_STATE, &pool_state,
++	    DATA_TYPE_UINT64, NULL))
++		return (ERR_FSYS_CORRUPT);
++
++	if (pool_state == POOL_STATE_DESTROYED)
++		return (ERR_FILESYSTEM_NOT_FOUND);
++
++	if (nvlist_lookup_value(nvlist, ZPOOL_CONFIG_POOL_NAME,
++	    current_rootpool, DATA_TYPE_STRING, NULL))
++		return (ERR_FSYS_CORRUPT);
++
++	if (nvlist_lookup_value(nvlist, ZPOOL_CONFIG_POOL_TXG, &txg,
++	    DATA_TYPE_UINT64, NULL))
++		return (ERR_FSYS_CORRUPT);
++
++	/* not an active device */
++	if (txg == 0)
++		return (ERR_NO_BOOTPATH);
++
++	if (nvlist_lookup_value(nvlist, ZPOOL_CONFIG_VERSION, &version,
++	    DATA_TYPE_UINT64, NULL))
++		return (ERR_FSYS_CORRUPT);
++	if (version > SPA_VERSION)
++		return (ERR_NEWER_VERSION);
++	if (nvlist_lookup_value(nvlist, ZPOOL_CONFIG_VDEV_TREE, &nv,
++	    DATA_TYPE_NVLIST, NULL))
++		return (ERR_FSYS_CORRUPT);
++	if (nvlist_lookup_value(nvlist, ZPOOL_CONFIG_GUID, &diskguid,
++	    DATA_TYPE_UINT64, NULL))
++		return (ERR_FSYS_CORRUPT);
++	if (vdev_get_bootpath(nv, diskguid, outdevid, outpath, 0))
++		return (ERR_NO_BOOTPATH);
++	if (nvlist_lookup_value(nvlist, ZPOOL_CONFIG_POOL_GUID, outguid,
++	    DATA_TYPE_UINT64, NULL))
++		return (ERR_FSYS_CORRUPT);
++	return (0);
++}
++
++/*
++ * zfs_mount() locates a valid uberblock of the root pool and read in its MOS
++ * to the memory address MOS.
++ *
++ * Return:
++ *	1 - success
++ *	0 - failure
++ */
++int
++zfs_mount(void)
++{
++	char *stack;
++	int label = 0;
++	uberblock_phys_t *ub_array, *ubbest;
++	objset_phys_t *osp;
++	char tmp_bootpath[MAXNAMELEN];
++	char tmp_devid[MAXNAMELEN];
++	uint64_t tmp_guid;
++	uint64_t adjpl = (uint64_t)part_length << SPA_MINBLOCKSHIFT;
++	int err = errnum; /* preserve previous errnum state */
++
++	/* if it's our first time here, zero the best uberblock out */
++	if (best_drive == 0 && best_part == 0 && find_best_root) {
++		grub_memset(&current_uberblock, 0, sizeof (uberblock_t));
++		pool_guid = 0;
++	}
++
++	stackbase = ZFS_SCRATCH;
++	stack = stackbase;
++	ub_array = (uberblock_phys_t *)stack;
++	stack += VDEV_UBERBLOCK_RING;
++
++	osp = (objset_phys_t *)stack;
++	stack += sizeof (objset_phys_t);
++	adjpl = P2ALIGN(adjpl, (uint64_t)sizeof (vdev_label_t));
++
++	for (label = 0; label < VDEV_LABELS; label++) {
++
++		/*
++		 * some eltorito stacks don't give us a size and
++		 * we end up setting the size to MAXUINT, further
++		 * some of these devices stop working once a single
++		 * read past the end has been issued. Checking
++		 * for a maximum part_length and skipping the backup
++		 * labels at the end of the slice/partition/device
++		 * avoids breaking down on such devices.
++		 */
++		if (part_length == MAXUINT && label == 2)
++			break;
++
++		uint64_t sector = vdev_label_start(adjpl,
++		    label) >> SPA_MINBLOCKSHIFT;
++
++		/* Read in the uberblock ring (128K). */
++		if (devread(sector  +
++		    ((VDEV_SKIP_SIZE + VDEV_PHYS_SIZE) >>
++		    SPA_MINBLOCKSHIFT), 0, VDEV_UBERBLOCK_RING,
++		    (char *)ub_array) == 0)
++			continue;
++
++		if ((ubbest = find_bestub(ub_array, sector)) != NULL &&
++		    zio_read(&ubbest->ubp_uberblock.ub_rootbp, osp, stack)
++		    == 0) {
++
++			VERIFY_OS_TYPE(osp, DMU_OST_META);
++
++			if (check_pool_label(sector, stack, tmp_devid,
++			    tmp_bootpath, &tmp_guid))
++				continue;
++			if (pool_guid == 0)
++				pool_guid = tmp_guid;
++
++			if (find_best_root && ((pool_guid != tmp_guid) ||
++			    vdev_uberblock_compare(&ubbest->ubp_uberblock,
++			    &(current_uberblock)) <= 0))
++				continue;
++
++			/* Got the MOS. Save it at the memory addr MOS. */
++			grub_memmove(MOS, &osp->os_meta_dnode, DNODE_SIZE);
++			grub_memmove(&current_uberblock,
++			    &ubbest->ubp_uberblock, sizeof (uberblock_t));
++			grub_memmove(current_bootpath, tmp_bootpath,
++			    MAXNAMELEN);
++			grub_memmove(current_devid, tmp_devid,
++			    grub_strlen(tmp_devid));
++			is_zfs_mount = 1;
++			return (1);
++		}
++	}
++
++	/*
++	 * While some fs impls. (tftp) rely on setting and keeping
++	 * global errnums set, others won't reset it and will break
++	 * when issuing rawreads. The goal here is to simply not
++	 * have zfs mount attempts impact the previous state.
++	 */
++	errnum = err;
++	return (0);
++}
++
++/*
++ * zfs_open() locates a file in the rootpool by following the
++ * MOS and places the dnode of the file in the memory address DNODE.
++ *
++ * Return:
++ *	1 - success
++ *	0 - failure
++ */
++int
++zfs_open(char *filename)
++{
++	char *stack;
++	dnode_phys_t *mdn;
++
++	file_buf = NULL;
++	stackbase = ZFS_SCRATCH;
++	stack = stackbase;
++
++	mdn = (dnode_phys_t *)stack;
++	stack += sizeof (dnode_phys_t);
++
++	dnode_mdn = NULL;
++	dnode_buf = (dnode_phys_t *)stack;
++	stack += 1<<DNODE_BLOCK_SHIFT;
++
++	/*
++	 * menu.lst is placed at the root pool filesystem level,
++	 * do not goto 'current_bootfs'.
++	 */
++	if (is_top_dataset_file(filename)) {
++		if (errnum = get_objset_mdn(MOS, NULL, NULL, mdn, stack))
++			return (0);
++
++		current_bootfs_obj = 0;
++	} else {
++		if (current_bootfs[0] == '\0') {
++			/* Get the default root filesystem object number */
++			if (errnum = get_default_bootfsobj(MOS,
++			    &current_bootfs_obj, stack))
++				return (0);
++
++			if (errnum = get_objset_mdn(MOS, NULL,
++			    &current_bootfs_obj, mdn, stack))
++				return (0);
++		} else {
++			if (errnum = get_objset_mdn(MOS, current_bootfs,
++			    &current_bootfs_obj, mdn, stack)) {
++				grub_memset(current_bootfs, 0, MAXNAMELEN);
++				return (0);
++			}
++		}
++	}
++
++	if (dnode_get_path(mdn, filename, DNODE, stack)) {
++		errnum = ERR_FILE_NOT_FOUND;
++		return (0);
++	}
++
++	/* get the file size and set the file position to 0 */
++
++	/*
++	 * For DMU_OT_SA we will need to locate the SIZE attribute
++	 * attribute, which could be either in the bonus buffer
++	 * or the "spill" block.
++	 */
++	if (DNODE->dn_bonustype == DMU_OT_SA) {
++		sa_hdr_phys_t *sahdrp;
++		int hdrsize;
++
++		if (DNODE->dn_bonuslen != 0) {
++			sahdrp = (sa_hdr_phys_t *)DN_BONUS(DNODE);
++		} else {
++			if (DNODE->dn_flags & DNODE_FLAG_SPILL_BLKPTR) {
++				blkptr_t *bp = &DNODE->dn_spill;
++				void *buf;
++
++				buf = (void *)stack;
++				stack += BP_GET_LSIZE(bp);
++
++				/* reset errnum to rawread() failure */
++				errnum = 0;
++				if (zio_read(bp, buf, stack) != 0) {
++					return (0);
++				}
++				sahdrp = buf;
++			} else {
++				errnum = ERR_FSYS_CORRUPT;
++				return (0);
++			}
++		}
++		hdrsize = SA_HDR_SIZE(sahdrp);
++		filemax = *(uint64_t *)((char *)sahdrp + hdrsize +
++		    SA_SIZE_OFFSET);
++	} else {
++		filemax = ((znode_phys_t *)DN_BONUS(DNODE))->zp_size;
++	}
++	filepos = 0;
++
++	dnode_buf = NULL;
++	return (1);
++}
++
++/*
++ * zfs_read reads in the data blocks pointed by the DNODE.
++ *
++ * Return:
++ *	len - the length successfully read in to the buffer
++ *	0   - failure
++ */
++int
++zfs_read(char *buf, int len)
++{
++	char *stack;
++	char *tmpbuf;
++	int blksz, length, movesize;
++
++	if (file_buf == NULL) {
++		file_buf = stackbase;
++		stackbase += SPA_MAXBLOCKSIZE;
++		file_start = file_end = 0;
++	}
++	stack = stackbase;
++
++	/*
++	 * If offset is in memory, move it into the buffer provided and return.
++	 */
++	if (filepos >= file_start && filepos+len <= file_end) {
++		grub_memmove(buf, file_buf + filepos - file_start, len);
++		filepos += len;
++		return (len);
++	}
++
++	blksz = DNODE->dn_datablkszsec << SPA_MINBLOCKSHIFT;
++
++	/*
++	 * Entire Dnode is too big to fit into the space available.  We
++	 * will need to read it in chunks.  This could be optimized to
++	 * read in as large a chunk as there is space available, but for
++	 * now, this only reads in one data block at a time.
++	 */
++	length = len;
++	while (length) {
++		/*
++		 * Find requested blkid and the offset within that block.
++		 */
++		uint64_t blkid = filepos / blksz;
++
++		if (errnum = dmu_read(DNODE, blkid, file_buf, stack))
++			return (0);
++
++		file_start = blkid * blksz;
++		file_end = file_start + blksz;
++
++		movesize = MIN(length, file_end - filepos);
++
++		grub_memmove(buf, file_buf + filepos - file_start,
++		    movesize);
++		buf += movesize;
++		length -= movesize;
++		filepos += movesize;
++	}
++
++	return (len);
++}
++
++/*
++ * No-Op
++ */
++int
++zfs_embed(int *start_sector, int needed_sectors)
++{
++	return (1);
++}
++
++#endif /* FSYS_ZFS */
+diff -urN grub.patch50/stage2/fsys_zfs.h grub.zfs_solaris/stage2/fsys_zfs.h
+--- grub.patch50/stage2/fsys_zfs.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/fsys_zfs.h	2011-10-12 19:58:29.039922403 +0200
+@@ -0,0 +1,205 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++#ifndef _FSYS_ZFS_H
++#define	_FSYS_ZFS_H
++
++#ifdef	FSYS_ZFS
++
++#ifndef	FSIMAGE
++typedef unsigned long long uint64_t;
++typedef unsigned int uint32_t;
++typedef unsigned short uint16_t;
++typedef unsigned char uint8_t;
++typedef unsigned char uchar_t;
++
++#if defined(_LP64) || defined(_I32LPx)
++typedef	unsigned long size_t;
++#else
++typedef	unsigned int size_t;
++#endif
++#else
++#include "fsi_zfs.h"
++#endif	/* !FSIMAGE */
++
++#include <zfs-include/zfs.h>
++#include <zfs-include/dmu.h>
++#include <zfs-include/spa.h>
++#include <zfs-include/zio.h>
++#include <zfs-include/zio_checksum.h>
++#include <zfs-include/vdev_impl.h>
++#include <zfs-include/zap_impl.h>
++#include <zfs-include/zap_leaf.h>
++#include <zfs-include/uberblock_impl.h>
++#include <zfs-include/dnode.h>
++#include <zfs-include/dsl_dir.h>
++#include <zfs-include/zfs_acl.h>
++#include <zfs-include/zfs_znode.h>
++#include <zfs-include/dsl_dataset.h>
++#include <zfs-include/zil.h>
++#include <zfs-include/dmu_objset.h>
++#include <zfs-include/sa_impl.h>
++
++/*
++ * Global Memory addresses to store MOS and DNODE data
++ */
++#define	MOS		((dnode_phys_t *) ZFS_ADDR)
++#define	DNODE		(MOS+1) /* move sizeof(dnode_phys_t) bytes */
++#define	ZFS_SCRATCH	((char *)(DNODE+1))
++
++/*
++ * Verify dnode type.
++ * Can only be used in functions returning non-0 for failure.
++ */
++#define	VERIFY_DN_TYPE(dnp, type) \
++	if (type && (dnp)->dn_type != type) { \
++		return (ERR_FSYS_CORRUPT); \
++	}
++
++/*
++ * Verify object set type.
++ * Can only be used in functions returning 0 for failure.
++ */
++#define	VERIFY_OS_TYPE(osp, type) \
++	if (type && (osp)->os_type != type) { \
++		errnum = ERR_FSYS_CORRUPT; \
++		return (0); \
++	}
++
++#define	ZPOOL_PROP_BOOTFS		"bootfs"
++
++/* General macros */
++#define	BSWAP_8(x)	((x) & 0xff)
++#define	BSWAP_16(x)	((BSWAP_8(x) << 8) | BSWAP_8((x) >> 8))
++#define	BSWAP_32(x)	((BSWAP_16(x) << 16) | BSWAP_16((x) >> 16))
++#define	BSWAP_64(x)	((BSWAP_32(x) << 32) | BSWAP_32((x) >> 32))
++#define	P2ROUNDUP(x, align)	(-(-(x) & -(align)))
++
++/*
++ * XXX Match these macro up with real zfs once we have nvlist support so that we
++ * can support large sector disks.
++ */
++#define	UBERBLOCK_SIZE		(1ULL << UBERBLOCK_SHIFT)
++#undef	offsetof
++#define	offsetof(t, m)   ((int)&(((t *)0)->m))
++#define	VDEV_UBERBLOCK_SHIFT	UBERBLOCK_SHIFT
++#define	VDEV_UBERBLOCK_OFFSET(n) \
++offsetof(vdev_label_t, vl_uberblock[(n) << VDEV_UBERBLOCK_SHIFT])
++
++typedef struct uberblock uberblock_t;
++
++/* XXX Uberblock_phys_t is no longer in the kernel zfs */
++typedef struct uberblock_phys {
++	uberblock_t	ubp_uberblock;
++	char		ubp_pad[UBERBLOCK_SIZE - sizeof (uberblock_t) -
++				sizeof (zio_eck_t)];
++	zio_eck_t	ubp_zec;
++} uberblock_phys_t;
++
++/*
++ * Macros to get fields in a bp or DVA.
++ */
++#define	P2PHASE(x, align)		((x) & ((align) - 1))
++#define	DVA_OFFSET_TO_PHYS_SECTOR(offset) \
++	((offset + VDEV_LABEL_START_SIZE) >> SPA_MINBLOCKSHIFT)
++
++/*
++ * return x rounded down to an align boundary
++ * eg, P2ALIGN(1200, 1024) == 1024 (1*align)
++ * eg, P2ALIGN(1024, 1024) == 1024 (1*align)
++ * eg, P2ALIGN(0x1234, 0x100) == 0x1200 (0x12*align)
++ * eg, P2ALIGN(0x5600, 0x100) == 0x5600 (0x56*align)
++ */
++#define	P2ALIGN(x, align)		((x) & -(align))
++
++/*
++ * For nvlist manipulation. (from nvpair.h)
++ */
++#define	NV_ENCODE_NATIVE	0
++#define	NV_ENCODE_XDR		1
++#define	HOST_ENDIAN		1	/* for x86 machine */
++#define	DATA_TYPE_UINT64	8
++#define	DATA_TYPE_STRING	9
++#define	DATA_TYPE_NVLIST	19
++#define	DATA_TYPE_NVLIST_ARRAY	20
++
++/*
++ * Decompression Entry - lzjb
++ */
++#ifndef	NBBY
++#define	NBBY	8
++#endif
++
++typedef int zfs_decomp_func_t(void *s_start, void *d_start, size_t s_len,
++			size_t d_len);
++typedef struct decomp_entry {
++	char *name;
++	zfs_decomp_func_t *decomp_func;
++} decomp_entry_t;
++
++/*
++ * FAT ZAP data structures
++ */
++#define	ZFS_CRC64_POLY 0xC96C5795D7870F42ULL /* ECMA-182, reflected form */
++#define	ZAP_HASH_IDX(hash, n)	(((n) == 0) ? 0 : ((hash) >> (64 - (n))))
++#define	CHAIN_END	0xffff	/* end of the chunk chain */
++
++/*
++ * The amount of space within the chunk available for the array is:
++ * chunk size - space for type (1) - space for next pointer (2)
++ */
++#define	ZAP_LEAF_ARRAY_BYTES (ZAP_LEAF_CHUNKSIZE - 3)
++
++#define	ZAP_LEAF_HASH_SHIFT(bs)	(bs - 5)
++#define	ZAP_LEAF_HASH_NUMENTRIES(bs) (1 << ZAP_LEAF_HASH_SHIFT(bs))
++#define	LEAF_HASH(bs, h) \
++	((ZAP_LEAF_HASH_NUMENTRIES(bs)-1) & \
++	((h) >> (64 - ZAP_LEAF_HASH_SHIFT(bs)-l->l_hdr.lh_prefix_len)))
++
++/*
++ * The amount of space available for chunks is:
++ * block size shift - hash entry size (2) * number of hash
++ * entries - header space (2*chunksize)
++ */
++#define	ZAP_LEAF_NUMCHUNKS(bs) \
++	(((1<<bs) - 2*ZAP_LEAF_HASH_NUMENTRIES(bs)) / \
++	ZAP_LEAF_CHUNKSIZE - 2)
++
++/*
++ * The chunks start immediately after the hash table.  The end of the
++ * hash table is at l_hash + HASH_NUMENTRIES, which we simply cast to a
++ * chunk_t.
++ */
++#define	ZAP_LEAF_CHUNK(l, bs, idx) \
++	((zap_leaf_chunk_t *)(l->l_hash + ZAP_LEAF_HASH_NUMENTRIES(bs)))[idx]
++#define	ZAP_LEAF_ENTRY(l, bs, idx) (&ZAP_LEAF_CHUNK(l, bs, idx).l_entry)
++
++extern void fletcher_2_native(const void *, uint64_t, zio_cksum_t *);
++extern void fletcher_2_byteswap(const void *, uint64_t, zio_cksum_t *);
++extern void fletcher_4_native(const void *, uint64_t, zio_cksum_t *);
++extern void fletcher_4_byteswap(const void *, uint64_t, zio_cksum_t *);
++extern void zio_checksum_SHA256(const void *, uint64_t, zio_cksum_t *);
++extern int lzjb_decompress(void *, void *, size_t, size_t);
++
++#endif	/* FSYS_ZFS */
++
++#endif /* !_FSYS_ZFS_H */
+diff -urN grub.patch50/stage2/pc_slice.h grub.zfs_solaris/stage2/pc_slice.h
+--- grub.patch50/stage2/pc_slice.h	2011-10-12 19:58:28.887921351 +0200
++++ grub.zfs_solaris/stage2/pc_slice.h	2011-10-12 19:58:29.043921841 +0200
+@@ -111,9 +111,12 @@
+ #define PC_SLICE_TYPE_EZD        	0x55
+ #define PC_SLICE_TYPE_MINIX		0x80
+ #define PC_SLICE_TYPE_LINUX_MINIX	0x81
++#define PC_SLICE_TYPE_SOLARIS		0x82	/* also Linux swap! */
+ #define PC_SLICE_TYPE_EXT2FS       	0x83
+ #define PC_SLICE_TYPE_LINUX_EXTENDED	0x85
+ #define PC_SLICE_TYPE_VSTAFS		0x9e
++#define PC_SLICE_TYPE_SOLARIS_BOOT	0xbe	/* Solaris boot (fat) */
++#define PC_SLICE_TYPE_SOLARIS2		0xbf	/* new Solaris type */
+ #define PC_SLICE_TYPE_DELL_UTIL		0xde
+ #define PC_SLICE_TYPE_LINUX_RAID	0xfd
+ 
+@@ -129,6 +132,7 @@
+      || _type == PC_SLICE_TYPE_FAT16_LBA \
+      || _type == PC_SLICE_TYPE_FAT32 \
+      || _type == PC_SLICE_TYPE_FAT32_LBA \
++     || _type == PC_SLICE_TYPE_SOLARIS_BOOT \
+      || _type == PC_SLICE_TYPE_DELL_UTIL; })
+ 
+ #define IS_PC_SLICE_TYPE_EXTENDED(type)	\
+@@ -154,6 +158,9 @@
+ 
+ #define IS_PC_SLICE_TYPE_BSD(type)	IS_PC_SLICE_TYPE_BSD_WITH_FS(type,0)
+ 
++#define IS_PC_SLICE_TYPE_SOLARIS(type)	\
++  (((type) == PC_SLICE_TYPE_SOLARIS) || ((type) == PC_SLICE_TYPE_SOLARIS2))
++
+ /*
+  *  *BSD-style disklabel & partition definitions.
+  *
+@@ -248,4 +255,29 @@
+ #define	FS_EXT2FS	17	/* Linux Extended 2 file system */
+ 
+ 
++/*
++ *  Solaris LABEL definitions. All definitions are relative to the
++ *  current PC_SLICE.
++ */
++#define SOL_LABEL_LOC	1
++#define SOL_LABEL_SIZE	512
++#define SOL_LABEL_MAGIC	0xdabe
++#define SOL_LABEL_MAGIC_OFFSET 0x1fc
++#define SOL_LABEL_NPARTS 0x10
++
++#define SOL_PART_OFFSET 0x48
++
++#define SOL_LABEL_CHECK_MAG(l_ptr) \
++  (*((unsigned short *) (((int) l_ptr) + SOL_LABEL_MAGIC_OFFSET)) \
++   == ((unsigned short) SOL_LABEL_MAGIC ))
++
++#define SOL_PART_START(l_ptr, p) \
++  (*((unsigned long *) (((int) l_ptr) + SOL_PART_OFFSET + (p) * 0xc + 4)))
++
++#define SOL_PART_LENGTH(l_ptr, p) \
++  (*((unsigned long *) (((int) l_ptr) + SOL_PART_OFFSET + (p) * 0xc + 8)))
++
++#define SOL_PART_EXISTS(l_ptr, p) (SOL_PART_LENGTH(l_ptr, p) != 0)
++
++
+ #endif /* _PC_SLICE_H */
+diff -urN grub.patch50/stage2/shared.h grub.zfs_solaris/stage2/shared.h
+--- grub.patch50/stage2/shared.h	2011-10-12 19:58:28.891921946 +0200
++++ grub.zfs_solaris/stage2/shared.h	2011-10-12 19:58:29.047921884 +0200
+@@ -44,11 +44,29 @@
+ # define RAW_SEG(x) (x)
+ #endif
+ 
++/* ZFS will use the top 4 Meg of domain memory for scratch */
++#define ZFS_ADDR         RAW_ADDR((mbi.mem_lower << 10) - ZFS_SCRATCH_SIZE)
++#define ZFS_SCRATCH_SIZE 0x400000
++
++#ifndef MAXPATHLEN
++#define	MAXPATHLEN	1024
++#endif
++
++#define	MAXNAMELEN	256
++#define MIN(x, y) ((x) < (y) ? (x) : (y))
++
++/* Boot signature related defines for the findroot command */
++#define	BOOTSIGN_DIR	"/boot/grub/bootsign"
++#define	BOOTSIGN_ARGLEN	(MAXNAMELEN + 10)	/* (<sign>,0,d) */
++#define	BOOTSIGN_LEN	(sizeof (BOOTSIGN_DIR) + 1 + BOOTSIGN_ARGLEN)
++#define	BOOTSIGN_BACKUP	"/etc/bootsign"
++
+ /*
+  *  Integer sizes
+  */
+ 
+ #define MAXINT     0x7FFFFFFF
++#define	MAXUINT		0xFFFFFFFF
+ 
+ /* Maximum command line size. Before you blindly increase this value,
+    see the comment in char_io.c (get_cmdline).  */
+@@ -212,6 +230,7 @@
+ #define STAGE2_ID_XFS_STAGE1_5		8
+ #define STAGE2_ID_ISO9660_STAGE1_5	9
+ #define STAGE2_ID_UFS2_STAGE1_5		10
++#define STAGE2_ID_ZFS_STAGE1_5		12
+ 
+ #ifndef STAGE1_5
+ # define STAGE2_ID	STAGE2_ID_STAGE2
+@@ -236,6 +255,8 @@
+ #  define STAGE2_ID	STAGE2_ID_ISO9660_STAGE1_5
+ # elif defined(FSYS_UFS2)
+ #  define STAGE2_ID	STAGE2_ID_UFS2_STAGE1_5
++# elif defined(FSYS_ZFS)
++#  define STAGE2_ID	STAGE2_ID_ZFS_STAGE1_5
+ # else
+ #  error "unknown Stage 2"
+ # endif
+@@ -549,6 +570,9 @@
+   ERR_DEV_NEED_INIT,
+   ERR_NO_DISK_SPACE,
+   ERR_NUMBER_OVERFLOW,
++  ERR_FILESYSTEM_NOT_FOUND,
++  ERR_NO_BOOTPATH,
++  ERR_NEWER_VERSION,
+ 
+   MAX_ERR_NUM
+ } grub_error_t;
+@@ -635,6 +659,15 @@
+ 
+ extern unsigned long current_drive;
+ extern unsigned long current_partition;
++extern char current_rootpool[MAXNAMELEN];
++extern char current_bootfs[MAXNAMELEN];
++extern unsigned long long current_bootfs_obj;
++extern char current_bootpath[MAXPATHLEN];
++extern char current_devid[MAXPATHLEN];
++extern int is_zfs_mount;
++extern unsigned long best_drive;
++extern unsigned long best_part;
++extern int find_best_root;
+ 
+ extern int fsys_type;
+ 
+@@ -889,6 +922,7 @@
+ int grub_strcmp (const char *s1, const char *s2);
+ int grub_strlen (const char *str);
+ char *grub_strcpy (char *dest, const char *src);
++char *grub_strchr (char *str, char c);
+ 
+ #ifndef GRUB_UTIL
+ typedef unsigned long grub_jmp_buf[6];
+diff -urN grub.patch50/stage2/stage2.c grub.zfs_solaris/stage2/stage2.c
+--- grub.patch50/stage2/stage2.c	2011-10-12 19:58:28.891921946 +0200
++++ grub.zfs_solaris/stage2/stage2.c	2011-10-12 19:58:29.047921884 +0200
+@@ -871,6 +871,7 @@
+   return pos;
+ }
+ 
++extern int findroot_func (char *arg, int flags);
+ 
+ /* This is the starting function in C.  */
+ void
+@@ -961,11 +962,21 @@
+ 	      if (! is_opened)
+ 		{
+ 		  is_opened = grub_open (config_file);
+-		  errnum = ERR_NONE;
+ 		}
++	      /*
++	       * we're not going to get very far if we weren't able to
++	       * open the config file and this isn't a valid filesystem,
++	       * so look for the config file somewhere else
++	       */
++	      if (!is_opened && errnum == ERR_FSYS_MOUNT &&
++		(findroot_func(config_file, 0) == 0)) {
++		  is_opened = grub_open (config_file);
++	      }
+ 
+-	      if (! is_opened)
++	      if (! is_opened) {
++	        errnum = ERR_NONE;
+ 		break;
++	      }
+ 
+ 	      /* This is necessary, because the menu must be overrided.  */
+ 	      reset ();
+diff -urN grub.patch50/stage2/zfs-include/dmu.h grub.zfs_solaris/stage2/zfs-include/dmu.h
+--- grub.patch50/stage2/zfs-include/dmu.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/dmu.h	2011-10-12 19:58:29.055921310 +0200
+@@ -0,0 +1,120 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef	_SYS_DMU_H
++#define	_SYS_DMU_H
++
++/*
++ * This file describes the interface that the DMU provides for its
++ * consumers.
++ *
++ * The DMU also interacts with the SPA.  That interface is described in
++ * dmu_spa.h.
++ */
++typedef enum dmu_object_type {
++	DMU_OT_NONE,
++	/* general: */
++	DMU_OT_OBJECT_DIRECTORY,	/* ZAP */
++	DMU_OT_OBJECT_ARRAY,		/* UINT64 */
++	DMU_OT_PACKED_NVLIST,		/* UINT8 (XDR by nvlist_pack/unpack) */
++	DMU_OT_PACKED_NVLIST_SIZE,	/* UINT64 */
++	DMU_OT_BPLIST,			/* UINT64 */
++	DMU_OT_BPLIST_HDR,		/* UINT64 */
++	/* spa: */
++	DMU_OT_SPACE_MAP_HEADER,	/* UINT64 */
++	DMU_OT_SPACE_MAP,		/* UINT64 */
++	/* zil: */
++	DMU_OT_INTENT_LOG,		/* UINT64 */
++	/* dmu: */
++	DMU_OT_DNODE,			/* DNODE */
++	DMU_OT_OBJSET,			/* OBJSET */
++	/* dsl: */
++	DMU_OT_DSL_DIR,			/* UINT64 */
++	DMU_OT_DSL_DIR_CHILD_MAP,	/* ZAP */
++	DMU_OT_DSL_DS_SNAP_MAP,		/* ZAP */
++	DMU_OT_DSL_PROPS,		/* ZAP */
++	DMU_OT_DSL_DATASET,		/* UINT64 */
++	/* zpl: */
++	DMU_OT_ZNODE,			/* ZNODE */
++	DMU_OT_OLDACL,			/* OLD ACL */
++	DMU_OT_PLAIN_FILE_CONTENTS,	/* UINT8 */
++	DMU_OT_DIRECTORY_CONTENTS,	/* ZAP */
++	DMU_OT_MASTER_NODE,		/* ZAP */
++	DMU_OT_UNLINKED_SET,		/* ZAP */
++	/* zvol: */
++	DMU_OT_ZVOL,			/* UINT8 */
++	DMU_OT_ZVOL_PROP,		/* ZAP */
++	/* other; for testing only! */
++	DMU_OT_PLAIN_OTHER,		/* UINT8 */
++	DMU_OT_UINT64_OTHER,		/* UINT64 */
++	DMU_OT_ZAP_OTHER,		/* ZAP */
++	/* new object types: */
++	DMU_OT_ERROR_LOG,		/* ZAP */
++	DMU_OT_SPA_HISTORY,		/* UINT8 */
++	DMU_OT_SPA_HISTORY_OFFSETS,	/* spa_his_phys_t */
++	DMU_OT_POOL_PROPS,		/* ZAP */
++	DMU_OT_DSL_PERMS,		/* ZAP */
++	DMU_OT_ACL,			/* ACL */
++	DMU_OT_SYSACL,			/* SYSACL */
++	DMU_OT_FUID,			/* FUID table (Packed NVLIST UINT8) */
++	DMU_OT_FUID_SIZE,		/* FUID table size UINT64 */
++	DMU_OT_NEXT_CLONES,		/* ZAP */
++	DMU_OT_SCRUB_QUEUE,		/* ZAP */
++	DMU_OT_USERGROUP_USED,		/* ZAP */
++	DMU_OT_USERGROUP_QUOTA,		/* ZAP */
++	DMU_OT_USERREFS,		/* ZAP */
++	DMU_OT_DDT_ZAP,			/* ZAP */
++	DMU_OT_DDT_STATS,		/* ZAP */
++	DMU_OT_SA,			/* System attr */
++	DMU_OT_SA_MASTER_NODE,		/* ZAP */
++	DMU_OT_SA_ATTR_REGISTRATION,	/* ZAP */
++	DMU_OT_SA_ATTR_LAYOUTS,		/* ZAP */
++	DMU_OT_NUMTYPES
++} dmu_object_type_t;
++
++typedef enum dmu_objset_type {
++	DMU_OST_NONE,
++	DMU_OST_META,
++	DMU_OST_ZFS,
++	DMU_OST_ZVOL,
++	DMU_OST_OTHER,			/* For testing only! */
++	DMU_OST_ANY,			/* Be careful! */
++	DMU_OST_NUMTYPES
++} dmu_objset_type_t;
++
++/*
++ * The names of zap entries in the DIRECTORY_OBJECT of the MOS.
++ */
++#define	DMU_POOL_DIRECTORY_OBJECT	1
++#define	DMU_POOL_CONFIG			"config"
++#define	DMU_POOL_ROOT_DATASET		"root_dataset"
++#define	DMU_POOL_SYNC_BPLIST		"sync_bplist"
++#define	DMU_POOL_ERRLOG_SCRUB		"errlog_scrub"
++#define	DMU_POOL_ERRLOG_LAST		"errlog_last"
++#define	DMU_POOL_SPARES			"spares"
++#define	DMU_POOL_DEFLATE		"deflate"
++#define	DMU_POOL_HISTORY		"history"
++#define	DMU_POOL_PROPS			"pool_props"
++#define	DMU_POOL_L2CACHE		"l2cache"
++
++#endif	/* _SYS_DMU_H */
+diff -urN grub.patch50/stage2/zfs-include/dmu_objset.h grub.zfs_solaris/stage2/zfs-include/dmu_objset.h
+--- grub.patch50/stage2/zfs-include/dmu_objset.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/dmu_objset.h	2011-10-12 19:58:29.055921310 +0200
+@@ -0,0 +1,38 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef	_SYS_DMU_OBJSET_H
++#define	_SYS_DMU_OBJSET_H
++
++typedef struct objset_phys {
++	dnode_phys_t os_meta_dnode;
++	zil_header_t os_zil_header;
++	uint64_t os_type;
++	uint64_t os_flags;
++	char os_pad[2048 - sizeof (dnode_phys_t)*3 -
++	    sizeof (zil_header_t) - sizeof (uint64_t)*2];
++	dnode_phys_t os_userused_dnode;
++	dnode_phys_t os_groupused_dnode;
++} objset_phys_t;
++
++#endif /* _SYS_DMU_OBJSET_H */
+diff -urN grub.patch50/stage2/zfs-include/dnode.h grub.zfs_solaris/stage2/zfs-include/dnode.h
+--- grub.patch50/stage2/zfs-include/dnode.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/dnode.h	2011-10-12 19:58:29.055921310 +0200
+@@ -0,0 +1,79 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef	_SYS_DNODE_H
++#define	_SYS_DNODE_H
++
++/*
++ * Fixed constants.
++ */
++#define	DNODE_SHIFT		9	/* 512 bytes */
++#define	DN_MIN_INDBLKSHIFT	10	/* 1k */
++#define	DN_MAX_INDBLKSHIFT	14	/* 16k */
++#define	DNODE_BLOCK_SHIFT	14	/* 16k */
++#define	DNODE_CORE_SIZE		64	/* 64 bytes for dnode sans blkptrs */
++#define	DN_MAX_OBJECT_SHIFT	48	/* 256 trillion (zfs_fid_t limit) */
++#define	DN_MAX_OFFSET_SHIFT	64	/* 2^64 bytes in a dnode */
++
++/*
++ * Derived constants.
++ */
++#define	DNODE_SIZE	(1 << DNODE_SHIFT)
++#define	DN_MAX_NBLKPTR	((DNODE_SIZE - DNODE_CORE_SIZE) >> SPA_BLKPTRSHIFT)
++#define	DN_MAX_BONUSLEN	(DNODE_SIZE - DNODE_CORE_SIZE - (1 << SPA_BLKPTRSHIFT))
++#define	DN_MAX_OBJECT	(1ULL << DN_MAX_OBJECT_SHIFT)
++
++#define	DNODES_PER_BLOCK_SHIFT	(DNODE_BLOCK_SHIFT - DNODE_SHIFT)
++#define	DNODES_PER_BLOCK	(1ULL << DNODES_PER_BLOCK_SHIFT)
++#define	DNODES_PER_LEVEL_SHIFT	(DN_MAX_INDBLKSHIFT - SPA_BLKPTRSHIFT)
++
++#define	DNODE_FLAG_SPILL_BLKPTR (1<<2)
++
++#define	DN_BONUS(dnp)	((void*)((dnp)->dn_bonus + \
++	(((dnp)->dn_nblkptr - 1) * sizeof (blkptr_t))))
++
++typedef struct dnode_phys {
++	uint8_t dn_type;		/* dmu_object_type_t */
++	uint8_t dn_indblkshift;		/* ln2(indirect block size) */
++	uint8_t dn_nlevels;		/* 1=dn_blkptr->data blocks */
++	uint8_t dn_nblkptr;		/* length of dn_blkptr */
++	uint8_t dn_bonustype;		/* type of data in bonus buffer */
++	uint8_t	dn_checksum;		/* ZIO_CHECKSUM type */
++	uint8_t	dn_compress;		/* ZIO_COMPRESS type */
++	uint8_t dn_flags;		/* DNODE_FLAG_* */
++	uint16_t dn_datablkszsec;	/* data block size in 512b sectors */
++	uint16_t dn_bonuslen;		/* length of dn_bonus */
++	uint8_t dn_pad2[4];
++
++	/* accounting is protected by dn_dirty_mtx */
++	uint64_t dn_maxblkid;		/* largest allocated block ID */
++	uint64_t dn_used;		/* bytes (or sectors) of disk space */
++
++	uint64_t dn_pad3[4];
++
++	blkptr_t dn_blkptr[1];
++	uint8_t dn_bonus[DN_MAX_BONUSLEN - sizeof (blkptr_t)];
++	blkptr_t dn_spill;
++} dnode_phys_t;
++
++#endif	/* _SYS_DNODE_H */
+diff -urN grub.patch50/stage2/zfs-include/dsl_dataset.h grub.zfs_solaris/stage2/zfs-include/dsl_dataset.h
+--- grub.patch50/stage2/zfs-include/dsl_dataset.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/dsl_dataset.h	2011-10-12 19:58:29.055921310 +0200
+@@ -0,0 +1,55 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef	_SYS_DSL_DATASET_H
++#define	_SYS_DSL_DATASET_H
++
++#pragma ident	"%Z%%M%	%I%	%E% SMI"
++
++typedef struct dsl_dataset_phys {
++	uint64_t ds_dir_obj;
++	uint64_t ds_prev_snap_obj;
++	uint64_t ds_prev_snap_txg;
++	uint64_t ds_next_snap_obj;
++	uint64_t ds_snapnames_zapobj;	/* zap obj of snaps; ==0 for snaps */
++	uint64_t ds_num_children;	/* clone/snap children; ==0 for head */
++	uint64_t ds_creation_time;	/* seconds since 1970 */
++	uint64_t ds_creation_txg;
++	uint64_t ds_deadlist_obj;
++	uint64_t ds_used_bytes;
++	uint64_t ds_compressed_bytes;
++	uint64_t ds_uncompressed_bytes;
++	uint64_t ds_unique_bytes;	/* only relevant to snapshots */
++	/*
++	 * The ds_fsid_guid is a 56-bit ID that can change to avoid
++	 * collisions.  The ds_guid is a 64-bit ID that will never
++	 * change, so there is a small probability that it will collide.
++	 */
++	uint64_t ds_fsid_guid;
++	uint64_t ds_guid;
++	uint64_t ds_flags;
++	blkptr_t ds_bp;
++	uint64_t ds_pad[8]; /* pad out to 320 bytes for good measure */
++} dsl_dataset_phys_t;
++
++#endif /* _SYS_DSL_DATASET_H */
+diff -urN grub.patch50/stage2/zfs-include/dsl_dir.h grub.zfs_solaris/stage2/zfs-include/dsl_dir.h
+--- grub.patch50/stage2/zfs-include/dsl_dir.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/dsl_dir.h	2011-10-12 19:58:29.055921310 +0200
+@@ -0,0 +1,51 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef	_SYS_DSL_DIR_H
++#define	_SYS_DSL_DIR_H
++
++#pragma ident	"%Z%%M%	%I%	%E% SMI"
++
++typedef struct dsl_dir_phys {
++	uint64_t dd_creation_time; /* not actually used */
++	uint64_t dd_head_dataset_obj;
++	uint64_t dd_parent_obj;
++	uint64_t dd_clone_parent_obj;
++	uint64_t dd_child_dir_zapobj;
++	/*
++	 * how much space our children are accounting for; for leaf
++	 * datasets, == physical space used by fs + snaps
++	 */
++	uint64_t dd_used_bytes;
++	uint64_t dd_compressed_bytes;
++	uint64_t dd_uncompressed_bytes;
++	/* Administrative quota setting */
++	uint64_t dd_quota;
++	/* Administrative reservation setting */
++	uint64_t dd_reserved;
++	uint64_t dd_props_zapobj;
++	uint64_t dd_deleg_zapobj;	/* dataset permissions */
++	uint64_t dd_pad[20]; /* pad out to 256 bytes for good measure */
++} dsl_dir_phys_t;
++
++#endif /* _SYS_DSL_DIR_H */
+diff -urN grub.patch50/stage2/zfs-include/sa_impl.h grub.zfs_solaris/stage2/zfs-include/sa_impl.h
+--- grub.patch50/stage2/zfs-include/sa_impl.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/sa_impl.h	2011-10-12 19:58:29.055921310 +0200
+@@ -0,0 +1,35 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++#ifndef	_SYS_SA_IMPL_H
++#define	_SYS_SA_IMPL_H
++
++typedef struct sa_hdr_phys {
++	uint32_t sa_magic;
++	uint16_t sa_layout_info;
++	uint16_t sa_lengths[1];
++} sa_hdr_phys_t;
++
++#define	SA_HDR_SIZE(hdr)	BF32_GET_SB(hdr->sa_layout_info, 10, 16, 3, 0)
++#define	SA_SIZE_OFFSET	0x8
++
++#endif	/* _SYS_SA_IMPL_H */
+diff -urN grub.patch50/stage2/zfs-include/spa.h grub.zfs_solaris/stage2/zfs-include/spa.h
+--- grub.patch50/stage2/zfs-include/spa.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/spa.h	2011-10-12 19:58:29.055921310 +0200
+@@ -0,0 +1,352 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
++ */
++
++#ifndef _SYS_SPA_H
++#define	_SYS_SPA_H
++
++/*
++ * General-purpose 32-bit and 64-bit bitfield encodings.
++ */
++#define	BF32_DECODE(x, low, len)	P2PHASE((x) >> (low), 1U << (len))
++#define	BF64_DECODE(x, low, len)	P2PHASE((x) >> (low), 1ULL << (len))
++#define	BF32_ENCODE(x, low, len)	(P2PHASE((x), 1U << (len)) << (low))
++#define	BF64_ENCODE(x, low, len)	(P2PHASE((x), 1ULL << (len)) << (low))
++
++#define	BF32_GET(x, low, len)		BF32_DECODE(x, low, len)
++#define	BF64_GET(x, low, len)		BF64_DECODE(x, low, len)
++
++#define	BF32_SET(x, low, len, val)	\
++	((x) ^= BF32_ENCODE((x >> low) ^ (val), low, len))
++#define	BF64_SET(x, low, len, val)	\
++	((x) ^= BF64_ENCODE((x >> low) ^ (val), low, len))
++
++#define	BF32_GET_SB(x, low, len, shift, bias)	\
++	((BF32_GET(x, low, len) + (bias)) << (shift))
++#define	BF64_GET_SB(x, low, len, shift, bias)	\
++	((BF64_GET(x, low, len) + (bias)) << (shift))
++
++#define	BF32_SET_SB(x, low, len, shift, bias, val)	\
++	BF32_SET(x, low, len, ((val) >> (shift)) - (bias))
++#define	BF64_SET_SB(x, low, len, shift, bias, val)	\
++	BF64_SET(x, low, len, ((val) >> (shift)) - (bias))
++
++/*
++ * We currently support nine block sizes, from 512 bytes to 128K.
++ * We could go higher, but the benefits are near-zero and the cost
++ * of COWing a giant block to modify one byte would become excessive.
++ */
++#define	SPA_MINBLOCKSHIFT	9
++#define	SPA_MAXBLOCKSHIFT	17
++#define	SPA_MINBLOCKSIZE	(1ULL << SPA_MINBLOCKSHIFT)
++#define	SPA_MAXBLOCKSIZE	(1ULL << SPA_MAXBLOCKSHIFT)
++
++#define	SPA_BLOCKSIZES		(SPA_MAXBLOCKSHIFT - SPA_MINBLOCKSHIFT + 1)
++
++/*
++ * Size of block to hold the configuration data (a packed nvlist)
++ */
++#define	SPA_CONFIG_BLOCKSIZE	(1 << 14)
++
++/*
++ * The DVA size encodings for LSIZE and PSIZE support blocks up to 32MB.
++ * The ASIZE encoding should be at least 64 times larger (6 more bits)
++ * to support up to 4-way RAID-Z mirror mode with worst-case gang block
++ * overhead, three DVAs per bp, plus one more bit in case we do anything
++ * else that expands the ASIZE.
++ */
++#define	SPA_LSIZEBITS		16	/* LSIZE up to 32M (2^16 * 512)	*/
++#define	SPA_PSIZEBITS		16	/* PSIZE up to 32M (2^16 * 512)	*/
++#define	SPA_ASIZEBITS		24	/* ASIZE up to 64 times larger	*/
++
++/*
++ * All SPA data is represented by 128-bit data virtual addresses (DVAs).
++ * The members of the dva_t should be considered opaque outside the SPA.
++ */
++typedef struct dva {
++	uint64_t	dva_word[2];
++} dva_t;
++
++/*
++ * Each block has a 256-bit checksum -- strong enough for cryptographic hashes.
++ */
++typedef struct zio_cksum {
++	uint64_t	zc_word[4];
++} zio_cksum_t;
++
++/*
++ * Each block is described by its DVAs, time of birth, checksum, etc.
++ * The word-by-word, bit-by-bit layout of the blkptr is as follows:
++ *
++ *	64	56	48	40	32	24	16	8	0
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * 0	|		vdev1		|ncopy|L|	  ASIZE		|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * 1	|G|			 offset1				|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * 2	|		vdev2		|ncopy|L|	  ASIZE		|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * 3	|G|			 offset2				|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * 4	|		vdev3		|ncopy|L|	  ASIZE		|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * 5	|G|			 offset3				|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * 6	|BDE|lvl| type	| cksum | comp	|     PSIZE	|     LSIZE	|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * 7	|                       padding                                 |
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * 8	|			padding					|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * 9	|			physical birth txg			|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * a	|			logical birth txg			|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * b	|			fill count				|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * c	|			checksum[0]				|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * d	|			checksum[1]				|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * e	|			checksum[2]				|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ * f	|			checksum[3]				|
++ *	+-------+-------+-------+-------+-------+-------+-------+-------+
++ *
++ * Legend:
++ *
++ * vdev		virtual device ID
++ * offset	offset into virtual device
++ * LSIZE	logical size
++ * PSIZE	physical size (after compression)
++ * ASIZE	allocated size (including RAID-Z parity and gang block headers)
++ * L		layout (e.g. standard vs. RAID-Z/mirror hybrid)
++ * ncopy	number of copies if RAID-Z, otherwise 1
++ * cksum	checksum function
++ * comp		compression function
++ * G		gang block indicator
++ * B		byteorder (endianness)
++ * D		dedup
++ * E		encryption
++ * lvl		level of indirection
++ * type		DMU object type
++ * phys birth	txg of block allocation; zero if same as logical birth txg
++ * log. birth	transaction group in which the block was logically born
++ * fill count	number of non-zero blocks under this bp
++ * checksum[4]	256-bit checksum of the data this bp describes
++ *
++ * Special notes for encryption:
++ *
++ * A single bit is used to indicate if the block is encrypted.  This is
++ * sufficient since all blocks in a dataset always share the same encryption
++ * algorithm-keylen-mode.
++ *
++ * When encryption is enabled blk_dva[2] holds the IV.
++ * When encryption is enabled level 0 blocks checksum[2] and checksum[3] hold
++ * the MAC output from the encryption and the normal checksum is truncated
++ * and stored in checksum[0] and checksum[1].
++ *
++ */
++#define	SPA_BLKPTRSHIFT	7		/* blkptr_t is 128 bytes	*/
++#define	SPA_DVAS_PER_BP	3		/* Number of DVAs in a bp	*/
++
++typedef struct blkptr {
++	dva_t		blk_dva[SPA_DVAS_PER_BP]; /* Data Virtual Addresses */
++	uint64_t	blk_prop;	/* size, compression, type, etc	    */
++	uint64_t	blk_pad[2];	/* Extra space for the future	    */
++	uint64_t	blk_phys_birth;	/* txg when block was allocated	    */
++	uint64_t	blk_birth;	/* transaction group at birth	    */
++	uint64_t	blk_fill;	/* fill count			    */
++	zio_cksum_t	blk_cksum;	/* 256-bit checksum		    */
++} blkptr_t;
++
++/*
++ * DVA layouts.  Normally mirror vdevs contain mirrored data, RAID-Z vdevs
++ * contain RAID-Z data, etc.  However, for latency-sensitive metadata,
++ * we can use a mirrored layout across the children of a RAID-Z vdev.
++ * This ensures that such metadata can be read in a single I/O.
++ */
++typedef enum dva_layout {
++	DVA_LAYOUT_STANDARD = 0,
++	DVA_LAYOUT_RAIDZ_MIRROR
++} dva_layout_t;
++
++/*
++ * Macros to get and set fields in a bp or DVA.
++ */
++#define	DVA_GET_ASIZE(dva)	\
++	BF64_GET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0)
++#define	DVA_SET_ASIZE(dva, x)	\
++	BF64_SET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0, x)
++
++#define	DVA_GET_LAYOUT(dva)	BF64_GET((dva)->dva_word[0], 24, 2)
++#define	DVA_SET_LAYOUT(dva, x)	BF64_SET((dva)->dva_word[0], 24, 2, x)
++
++#define	DVA_GET_COPIES(dva)	BF64_GET_SB((dva)->dva_word[0], 26, 6, 0, 1)
++#define	DVA_SET_COPIES(dva, x)	BF64_SET_SB((dva)->dva_word[0], 26, 6, 0, 1, x)
++
++#define	DVA_MAX_COPIES		(1ULL << 6)
++#define	DVA_MAX_INFLATION	(4ULL)
++
++#define	DVA_GET_VDEV(dva)	BF64_GET((dva)->dva_word[0], 32, 32)
++#define	DVA_SET_VDEV(dva, x)	BF64_SET((dva)->dva_word[0], 32, 32, x)
++
++#define	DVA_GET_OFFSET(dva)	\
++	BF64_GET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0)
++#define	DVA_SET_OFFSET(dva, x)	\
++	BF64_SET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0, x)
++
++#define	DVA_GET_GANG(dva)	BF64_GET((dva)->dva_word[1], 63, 1)
++#define	DVA_SET_GANG(dva, x)	BF64_SET((dva)->dva_word[1], 63, 1, x)
++
++#define	DVA_EQUAL(dva1, dva2)	\
++	((dva1)->dva_word[1] == (dva2)->dva_word[1] && \
++	(dva1)->dva_word[0] == (dva2)->dva_word[0])
++
++#define	DVA_IS_VALID(dva)	(DVA_GET_ASIZE(dva) != 0)
++
++#define	DVA_VALID_COPIES(dva)	\
++	(DVA_IS_VALID(dva) ? DVA_GET_COPIES(dva) : 0)
++
++#define	BP_GET_LSIZE(bp)	\
++	BF64_GET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1)
++#define	BP_SET_LSIZE(bp, x)	\
++	BF64_SET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1, x)
++
++#define	BP_GET_PSIZE(bp)	\
++	BF64_GET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1)
++#define	BP_SET_PSIZE(bp, x)	\
++	BF64_SET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1, x)
++
++#define	BP_GET_COMPRESS(bp)		BF64_GET((bp)->blk_prop, 32, 8)
++#define	BP_SET_COMPRESS(bp, x)		BF64_SET((bp)->blk_prop, 32, 8, x)
++
++#define	BP_GET_CHECKSUM(bp)		BF64_GET((bp)->blk_prop, 40, 8)
++#define	BP_SET_CHECKSUM(bp, x)		BF64_SET((bp)->blk_prop, 40, 8, x)
++
++#define	BP_GET_TYPE(bp)			BF64_GET((bp)->blk_prop, 48, 8)
++#define	BP_SET_TYPE(bp, x)		BF64_SET((bp)->blk_prop, 48, 8, x)
++
++#define	BP_GET_LEVEL(bp)		BF64_GET((bp)->blk_prop, 56, 5)
++#define	BP_SET_LEVEL(bp, x)		BF64_SET((bp)->blk_prop, 56, 5, x)
++
++#define	BP_GET_CRYPT(bp)		BF64_GET((bp)->blk_prop, 61, 1)
++#define	BP_SET_CRYPT(bp, x)		BF64_SET((bp)->blk_prop, 61, 1, x)
++#define	BP_IS_ENCRYPTED(bp)		(0 - BP_GET_CRYPT_FLAG(bp))
++
++#define	BP_GET_DEDUP(bp)		BF64_GET((bp)->blk_prop, 62, 1)
++#define	BP_SET_DEDUP(bp, x)		BF64_SET((bp)->blk_prop, 62, 1, x)
++
++#define	BP_GET_BYTEORDER(bp)		(0 - BF64_GET((bp)->blk_prop, 63, 1))
++#define	BP_SET_BYTEORDER(bp, x)		BF64_SET((bp)->blk_prop, 63, 1, x)
++
++#define	BP_PHYSICAL_BIRTH(bp)		\
++	((bp)->blk_phys_birth ? (bp)->blk_phys_birth : (bp)->blk_birth)
++
++#define	BP_SET_BIRTH(bp, logical, physical)	\
++{						\
++	(bp)->blk_birth = (logical);		\
++	(bp)->blk_phys_birth = ((logical) == (physical) ? 0 : (physical)); \
++}
++
++#define	BP_GET_UCSIZE(bp) \
++	((BP_GET_LEVEL(bp) > 0 || dmu_ot[BP_GET_TYPE(bp)].ot_metadata) ? \
++	BP_GET_PSIZE(bp) : BP_GET_LSIZE(bp))
++
++#define	BP_GET_ASIZE(bp)			\
++	(DVA_GET_ASIZE(&(bp)->blk_dva[0]) +	\
++	DVA_GET_ASIZE(&(bp)->blk_dva[1]) +	\
++	(BP_IS_ENCRYPTED(bp) ? 0 : DVA_GET_ASIZE(&(bp)->blk_dva[2])))
++
++#define	BP_GET_NDVAS(bp)			\
++	(DVA_IS_VALID(&(bp)->blk_dva[0]) +	\
++	DVA_IS_VALID(&(bp)->blk_dva[1]) +	\
++	(BP_IS_ENCRYPTED(bp) ? 0 : DVA_IS_VALID(&(bp)->blk_dva[2])))
++
++#define	BP_GET_COPIES(bp)			\
++	(DVA_VALID_COPIES(&(bp)->blk_dva[0]) +	\
++	DVA_VALID_COPIES(&(bp)->blk_dva[1]) +	\
++	(BP_IS_ENCRYPTED(bp) ? 0 : DVA_VALID_COPIES(&(bp)->blk_dva[2])))
++
++#define	BP_COUNT_GANG(bp)			\
++	(DVA_GET_GANG(&(bp)->blk_dva[0]) +	\
++	DVA_GET_GANG(&(bp)->blk_dva[1]) +	\
++	(BP_IS_ENCRYPTED(bp) ? 0 : DVA_GET_GANG(&(bp)->blk_dva[2])))
++
++#define	BP_EQUAL(bp1, bp2)	\
++	(BP_PHYSICAL_BIRTH(bp1) == BP_PHYSICAL_BIRTH(bp2) &&	\
++	DVA_EQUAL(&(bp1)->blk_dva[0], &(bp2)->blk_dva[0]) &&	\
++	DVA_EQUAL(&(bp1)->blk_dva[1], &(bp2)->blk_dva[1]) &&	\
++	DVA_EQUAL(&(bp1)->blk_dva[2], &(bp2)->blk_dva[2]))
++
++#define	ZIO_CHECKSUM_EQUAL(zc1, zc2) \
++	(0 == (((zc1).zc_word[0] - (zc2).zc_word[0]) | \
++	((zc1).zc_word[1] - (zc2).zc_word[1]) | \
++	((zc1).zc_word[2] - (zc2).zc_word[2]) | \
++	((zc1).zc_word[3] - (zc2).zc_word[3])))
++
++#define	ZIO_SET_CHECKSUM(zcp, w0, w1, w2, w3)	\
++{						\
++	(zcp)->zc_word[0] = w0;			\
++	(zcp)->zc_word[1] = w1;			\
++	(zcp)->zc_word[2] = w2;			\
++	(zcp)->zc_word[3] = w3;			\
++}
++
++#define	BP_IDENTITY(bp)		(&(bp)->blk_dva[0])
++#define	BP_IS_GANG(bp)		DVA_GET_GANG(BP_IDENTITY(bp))
++#define	BP_IS_HOLE(bp)		((bp)->blk_birth == 0)
++
++/* BP_IS_RAIDZ(bp) assumes no block compression */
++#define	BP_IS_RAIDZ(bp)		(DVA_GET_ASIZE(&(bp)->blk_dva[0]) > \
++				BP_GET_PSIZE(bp))
++
++#define	BP_ZERO(bp)				\
++{						\
++	(bp)->blk_dva[0].dva_word[0] = 0;	\
++	(bp)->blk_dva[0].dva_word[1] = 0;	\
++	(bp)->blk_dva[1].dva_word[0] = 0;	\
++	(bp)->blk_dva[1].dva_word[1] = 0;	\
++	(bp)->blk_dva[2].dva_word[0] = 0;	\
++	(bp)->blk_dva[2].dva_word[1] = 0;	\
++	(bp)->blk_prop = 0;			\
++	(bp)->blk_pad[0] = 0;			\
++	(bp)->blk_pad[1] = 0;			\
++	(bp)->blk_phys_birth = 0;		\
++	(bp)->blk_birth = 0;			\
++	(bp)->blk_fill = 0;			\
++	ZIO_SET_CHECKSUM(&(bp)->blk_cksum, 0, 0, 0, 0);	\
++}
++/*
++ * Note: the byteorder is either 0 or -1, both of which are palindromes.
++ * This simplifies the endianness handling a bit.
++ */
++#ifdef _BIG_ENDIAN
++#define	ZFS_HOST_BYTEORDER	(0ULL)
++#else
++#define	ZFS_HOST_BYTEORDER	(-1ULL)
++#endif
++
++#define	BP_SHOULD_BYTESWAP(bp)	(BP_GET_BYTEORDER(bp) != ZFS_HOST_BYTEORDER)
++
++#define	BP_SPRINTF_LEN	360
++
++#endif	/* _SYS_SPA_H */
+diff -urN grub.patch50/stage2/zfs-include/uberblock_impl.h grub.zfs_solaris/stage2/zfs-include/uberblock_impl.h
+--- grub.patch50/stage2/zfs-include/uberblock_impl.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/uberblock_impl.h	2011-10-12 19:58:29.055921310 +0200
+@@ -0,0 +1,51 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef _SYS_UBERBLOCK_IMPL_H
++#define	_SYS_UBERBLOCK_IMPL_H
++
++#pragma ident	"%Z%%M%	%I%	%E% SMI"
++
++/*
++ * The uberblock version is incremented whenever an incompatible on-disk
++ * format change is made to the SPA, DMU, or ZAP.
++ *
++ * Note: the first two fields should never be moved.  When a storage pool
++ * is opened, the uberblock must be read off the disk before the version
++ * can be checked.  If the ub_version field is moved, we may not detect
++ * version mismatch.  If the ub_magic field is moved, applications that
++ * expect the magic number in the first word won't work.
++ */
++#define	UBERBLOCK_MAGIC		0x00bab10c		/* oo-ba-bloc!	*/
++#define	UBERBLOCK_SHIFT		10			/* up to 1K	*/
++
++struct uberblock {
++	uint64_t	ub_magic;	/* UBERBLOCK_MAGIC		*/
++	uint64_t	ub_version;	/* ZFS_VERSION			*/
++	uint64_t	ub_txg;		/* txg of last sync		*/
++	uint64_t	ub_guid_sum;	/* sum of all vdev guids	*/
++	uint64_t	ub_timestamp;	/* UTC time of last sync	*/
++	blkptr_t	ub_rootbp;	/* MOS objset_phys_t		*/
++};
++
++#endif	/* _SYS_UBERBLOCK_IMPL_H */
+diff -urN grub.patch50/stage2/zfs-include/vdev_impl.h grub.zfs_solaris/stage2/zfs-include/vdev_impl.h
+--- grub.patch50/stage2/zfs-include/vdev_impl.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/vdev_impl.h	2011-10-12 19:58:29.055921310 +0200
+@@ -0,0 +1,59 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef _SYS_VDEV_IMPL_H
++#define	_SYS_VDEV_IMPL_H
++
++#define	VDEV_PAD_SIZE 		(8 << 10)
++/* 2 padding areas (vl_pad1 and vl_pad2) to skip */
++#define	VDEV_SKIP_SIZE		VDEV_PAD_SIZE * 2
++#define	VDEV_PHYS_SIZE		(112 << 10)
++#define	VDEV_UBERBLOCK_RING	(128 << 10)
++
++typedef struct vdev_phys {
++	char		vp_nvlist[VDEV_PHYS_SIZE - sizeof (zio_eck_t)];
++	zio_eck_t	vp_zbt;
++} vdev_phys_t;
++
++typedef struct vdev_label {
++	char		vl_pad1[VDEV_PAD_SIZE];			/*  8K	*/
++	char		vl_pad2[VDEV_PAD_SIZE];			/*  8K	*/
++	vdev_phys_t	vl_vdev_phys;				/* 112K	*/
++	char		vl_uberblock[VDEV_UBERBLOCK_RING];	/* 128K	*/
++} vdev_label_t;							/* 256K total */
++
++/*
++ * Size and offset of embedded boot loader region on each label.
++ * The total size of the first two labels plus the boot area is 4MB.
++ */
++#define	VDEV_BOOT_OFFSET	(2 * sizeof (vdev_label_t))
++#define	VDEV_BOOT_SIZE		(7ULL << 19)			/* 3.5M	*/
++
++/*
++ * Size of label regions at the start and end of each leaf device.
++ */
++#define	VDEV_LABEL_START_SIZE	(2 * sizeof (vdev_label_t) + VDEV_BOOT_SIZE)
++#define	VDEV_LABEL_END_SIZE	(2 * sizeof (vdev_label_t))
++#define	VDEV_LABELS		4
++
++#endif	/* _SYS_VDEV_IMPL_H */
+diff -urN grub.patch50/stage2/zfs-include/zap_impl.h grub.zfs_solaris/stage2/zfs-include/zap_impl.h
+--- grub.patch50/stage2/zfs-include/zap_impl.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/zap_impl.h	2011-10-12 19:58:29.059921869 +0200
+@@ -0,0 +1,111 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef	_SYS_ZAP_IMPL_H
++#define	_SYS_ZAP_IMPL_H
++
++#define	ZAP_MAGIC 0x2F52AB2ABULL
++
++#define	MZAP_ENT_LEN		64
++#define	MZAP_NAME_LEN		(MZAP_ENT_LEN - 8 - 4 - 2)
++#define	MZAP_MAX_BLKSHIFT	SPA_MAXBLOCKSHIFT
++#define	MZAP_MAX_BLKSZ		(1 << MZAP_MAX_BLKSHIFT)
++
++typedef struct mzap_ent_phys {
++	uint64_t mze_value;
++	uint32_t mze_cd;
++	uint16_t mze_pad;	/* in case we want to chain them someday */
++	char mze_name[MZAP_NAME_LEN];
++} mzap_ent_phys_t;
++
++typedef struct mzap_phys {
++	uint64_t mz_block_type;	/* ZBT_MICRO */
++	uint64_t mz_salt;
++	uint64_t mz_pad[6];
++	mzap_ent_phys_t mz_chunk[1];
++	/* actually variable size depending on block size */
++} mzap_phys_t;
++
++/*
++ * The (fat) zap is stored in one object. It is an array of
++ * 1<<FZAP_BLOCK_SHIFT byte blocks. The layout looks like one of:
++ *
++ * ptrtbl fits in first block:
++ * 	[zap_phys_t zap_ptrtbl_shift < 6] [zap_leaf_t] ...
++ *
++ * ptrtbl too big for first block:
++ * 	[zap_phys_t zap_ptrtbl_shift >= 6] [zap_leaf_t] [ptrtbl] ...
++ *
++ */
++
++#define	ZBT_LEAF		((1ULL << 63) + 0)
++#define	ZBT_HEADER		((1ULL << 63) + 1)
++#define	ZBT_MICRO		((1ULL << 63) + 3)
++/* any other values are ptrtbl blocks */
++
++/*
++ * the embedded pointer table takes up half a block:
++ * block size / entry size (2^3) / 2
++ */
++#define	ZAP_EMBEDDED_PTRTBL_SHIFT(zap) (FZAP_BLOCK_SHIFT(zap) - 3 - 1)
++
++/*
++ * The embedded pointer table starts half-way through the block.  Since
++ * the pointer table itself is half the block, it starts at (64-bit)
++ * word number (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)).
++ */
++#define	ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) \
++	((uint64_t *)(zap)->zap_f.zap_phys) \
++	[(idx) + (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap))]
++
++/*
++ * TAKE NOTE:
++ * If zap_phys_t is modified, zap_byteswap() must be modified.
++ */
++typedef struct zap_phys {
++	uint64_t zap_block_type;	/* ZBT_HEADER */
++	uint64_t zap_magic;		/* ZAP_MAGIC */
++
++	struct zap_table_phys {
++		uint64_t zt_blk;	/* starting block number */
++		uint64_t zt_numblks;	/* number of blocks */
++		uint64_t zt_shift;	/* bits to index it */
++		uint64_t zt_nextblk;	/* next (larger) copy start block */
++		uint64_t zt_blks_copied; /* number source blocks copied */
++	} zap_ptrtbl;
++
++	uint64_t zap_freeblk;		/* the next free block */
++	uint64_t zap_num_leafs;		/* number of leafs */
++	uint64_t zap_num_entries;	/* number of entries */
++	uint64_t zap_salt;		/* salt to stir into hash function */
++	uint64_t zap_normflags;		/* flags for u8_textprep_str() */
++	uint64_t zap_flags;		/* zap_flag_t */
++	/*
++	 * This structure is followed by padding, and then the embedded
++	 * pointer table.  The embedded pointer table takes up second
++	 * half of the block.  It is accessed using the
++	 * ZAP_EMBEDDED_PTRTBL_ENT() macro.
++	 */
++} zap_phys_t;
++
++#endif /* _SYS_ZAP_IMPL_H */
+diff -urN grub.patch50/stage2/zfs-include/zap_leaf.h grub.zfs_solaris/stage2/zfs-include/zap_leaf.h
+--- grub.patch50/stage2/zfs-include/zap_leaf.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/zap_leaf.h	2011-10-12 19:58:29.059921869 +0200
+@@ -0,0 +1,102 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef	_SYS_ZAP_LEAF_H
++#define	_SYS_ZAP_LEAF_H
++
++#pragma ident	"%Z%%M%	%I%	%E% SMI"
++
++#define	ZAP_LEAF_MAGIC 0x2AB1EAF
++
++/* chunk size = 24 bytes */
++#define	ZAP_LEAF_CHUNKSIZE 24
++
++/*
++ * The amount of space within the chunk available for the array is:
++ * chunk size - space for type (1) - space for next pointer (2)
++ */
++#define	ZAP_LEAF_ARRAY_BYTES (ZAP_LEAF_CHUNKSIZE - 3)
++
++typedef enum zap_chunk_type {
++	ZAP_CHUNK_FREE = 253,
++	ZAP_CHUNK_ENTRY = 252,
++	ZAP_CHUNK_ARRAY = 251,
++	ZAP_CHUNK_TYPE_MAX = 250
++} zap_chunk_type_t;
++
++/*
++ * TAKE NOTE:
++ * If zap_leaf_phys_t is modified, zap_leaf_byteswap() must be modified.
++ */
++typedef struct zap_leaf_phys {
++	struct zap_leaf_header {
++		uint64_t lh_block_type;		/* ZBT_LEAF */
++		uint64_t lh_pad1;
++		uint64_t lh_prefix;		/* hash prefix of this leaf */
++		uint32_t lh_magic;		/* ZAP_LEAF_MAGIC */
++		uint16_t lh_nfree;		/* number free chunks */
++		uint16_t lh_nentries;		/* number of entries */
++		uint16_t lh_prefix_len;		/* num bits used to id this */
++
++/* above is accessable to zap, below is zap_leaf private */
++
++		uint16_t lh_freelist;		/* chunk head of free list */
++		uint8_t lh_pad2[12];
++	} l_hdr; /* 2 24-byte chunks */
++
++	/*
++	 * The header is followed by a hash table with
++	 * ZAP_LEAF_HASH_NUMENTRIES(zap) entries.  The hash table is
++	 * followed by an array of ZAP_LEAF_NUMCHUNKS(zap)
++	 * zap_leaf_chunk structures.  These structures are accessed
++	 * with the ZAP_LEAF_CHUNK() macro.
++	 */
++
++	uint16_t l_hash[1];
++} zap_leaf_phys_t;
++
++typedef union zap_leaf_chunk {
++	struct zap_leaf_entry {
++		uint8_t le_type; 		/* always ZAP_CHUNK_ENTRY */
++		uint8_t le_int_size;		/* size of ints */
++		uint16_t le_next;		/* next entry in hash chain */
++		uint16_t le_name_chunk;		/* first chunk of the name */
++		uint16_t le_name_length;	/* bytes in name, incl null */
++		uint16_t le_value_chunk;	/* first chunk of the value */
++		uint16_t le_value_length;	/* value length in ints */
++		uint32_t le_cd;			/* collision differentiator */
++		uint64_t le_hash;		/* hash value of the name */
++	} l_entry;
++	struct zap_leaf_array {
++		uint8_t la_type;		/* always ZAP_CHUNK_ARRAY */
++		uint8_t la_array[ZAP_LEAF_ARRAY_BYTES];
++		uint16_t la_next;		/* next blk or CHAIN_END */
++	} l_array;
++	struct zap_leaf_free {
++		uint8_t lf_type;		/* always ZAP_CHUNK_FREE */
++		uint8_t lf_pad[ZAP_LEAF_ARRAY_BYTES];
++		uint16_t lf_next;	/* next in free list, or CHAIN_END */
++	} l_free;
++} zap_leaf_chunk_t;
++
++#endif /* _SYS_ZAP_LEAF_H */
+diff -urN grub.patch50/stage2/zfs-include/zfs.h grub.zfs_solaris/stage2/zfs-include/zfs.h
+--- grub.patch50/stage2/zfs-include/zfs.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/zfs.h	2011-10-12 19:58:29.059921869 +0200
+@@ -0,0 +1,107 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
++ */
++
++#ifndef	_SYS_FS_ZFS_H
++#define	_SYS_FS_ZFS_H
++
++/*
++ * On-disk version number.
++ */
++#define	SPA_VERSION			31ULL
++
++/*
++ * The following are configuration names used in the nvlist describing a pool's
++ * configuration.
++ */
++#define	ZPOOL_CONFIG_VERSION		"version"
++#define	ZPOOL_CONFIG_POOL_NAME		"name"
++#define	ZPOOL_CONFIG_POOL_STATE		"state"
++#define	ZPOOL_CONFIG_POOL_TXG		"txg"
++#define	ZPOOL_CONFIG_POOL_GUID		"pool_guid"
++#define	ZPOOL_CONFIG_CREATE_TXG		"create_txg"
++#define	ZPOOL_CONFIG_TOP_GUID		"top_guid"
++#define	ZPOOL_CONFIG_VDEV_TREE		"vdev_tree"
++#define	ZPOOL_CONFIG_TYPE		"type"
++#define	ZPOOL_CONFIG_CHILDREN		"children"
++#define	ZPOOL_CONFIG_ID			"id"
++#define	ZPOOL_CONFIG_GUID		"guid"
++#define	ZPOOL_CONFIG_PATH		"path"
++#define	ZPOOL_CONFIG_DEVID		"devid"
++#define	ZPOOL_CONFIG_METASLAB_ARRAY	"metaslab_array"
++#define	ZPOOL_CONFIG_METASLAB_SHIFT	"metaslab_shift"
++#define	ZPOOL_CONFIG_ASHIFT		"ashift"
++#define	ZPOOL_CONFIG_ASIZE		"asize"
++#define	ZPOOL_CONFIG_DTL		"DTL"
++#define	ZPOOL_CONFIG_STATS		"stats"
++#define	ZPOOL_CONFIG_WHOLE_DISK		"whole_disk"
++#define	ZPOOL_CONFIG_ERRCOUNT		"error_count"
++#define	ZPOOL_CONFIG_NOT_PRESENT	"not_present"
++#define	ZPOOL_CONFIG_SPARES		"spares"
++#define	ZPOOL_CONFIG_IS_SPARE		"is_spare"
++#define	ZPOOL_CONFIG_NPARITY		"nparity"
++#define	ZPOOL_CONFIG_PHYS_PATH		"phys_path"
++#define	ZPOOL_CONFIG_L2CACHE		"l2cache"
++#define	ZPOOL_CONFIG_HOLE_ARRAY		"hole_array"
++#define	ZPOOL_CONFIG_VDEV_CHILDREN	"vdev_children"
++#define	ZPOOL_CONFIG_IS_HOLE		"is_hole"
++#define	ZPOOL_CONFIG_DDT_HISTOGRAM	"ddt_histogram"
++#define	ZPOOL_CONFIG_DDT_OBJ_STATS	"ddt_object_stats"
++#define	ZPOOL_CONFIG_DDT_STATS		"ddt_stats"
++/*
++ * The persistent vdev state is stored as separate values rather than a single
++ * 'vdev_state' entry.  This is because a device can be in multiple states, such
++ * as offline and degraded.
++ */
++#define	ZPOOL_CONFIG_OFFLINE		"offline"
++#define	ZPOOL_CONFIG_FAULTED		"faulted"
++#define	ZPOOL_CONFIG_DEGRADED		"degraded"
++#define	ZPOOL_CONFIG_REMOVED		"removed"
++
++#define	VDEV_TYPE_ROOT			"root"
++#define	VDEV_TYPE_MIRROR		"mirror"
++#define	VDEV_TYPE_REPLACING		"replacing"
++#define	VDEV_TYPE_RAIDZ			"raidz"
++#define	VDEV_TYPE_DISK			"disk"
++#define	VDEV_TYPE_FILE			"file"
++#define	VDEV_TYPE_MISSING		"missing"
++#define	VDEV_TYPE_HOLE			"hole"
++#define	VDEV_TYPE_SPARE			"spare"
++#define	VDEV_TYPE_L2CACHE		"l2cache"
++
++/*
++ * pool state.  The following states are written to disk as part of the normal
++ * SPA lifecycle: ACTIVE, EXPORTED, DESTROYED, SPARE, L2CACHE.  The remaining
++ * states are software abstractions used at various levels to communicate pool
++ * state.
++ */
++typedef enum pool_state {
++	POOL_STATE_ACTIVE = 0,		/* In active use		*/
++	POOL_STATE_EXPORTED,		/* Explicitly exported		*/
++	POOL_STATE_DESTROYED,		/* Explicitly destroyed		*/
++	POOL_STATE_SPARE,		/* Reserved for hot spare use	*/
++	POOL_STATE_L2CACHE,		/* Level 2 ARC device		*/
++	POOL_STATE_UNINITIALIZED,	/* Internal spa_t state		*/
++	POOL_STATE_UNAVAIL,		/* Internal libzfs state	*/
++	POOL_STATE_POTENTIALLY_ACTIVE	/* Internal libzfs state	*/
++} pool_state_t;
++
++#endif	/* _SYS_FS_ZFS_H */
+diff -urN grub.patch50/stage2/zfs-include/zfs_acl.h grub.zfs_solaris/stage2/zfs-include/zfs_acl.h
+--- grub.patch50/stage2/zfs-include/zfs_acl.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/zfs_acl.h	2011-10-12 19:58:29.059921869 +0200
+@@ -0,0 +1,64 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef	_SYS_FS_ZFS_ACL_H
++#define	_SYS_FS_ZFS_ACL_H
++
++#pragma ident	"%Z%%M%	%I%	%E% SMI"
++
++#ifndef __MINIOS__
++#ifndef _UID_T
++#define	_UID_T
++typedef	unsigned int uid_t;			/* UID type */
++#endif /* _UID_T */
++#endif /* __MINIOS__ */
++
++typedef struct zfs_oldace {
++	uint32_t	z_fuid;		/* "who" */
++	uint32_t	z_access_mask;  /* access mask */
++	uint16_t	z_flags;	/* flags, i.e inheritance */
++	uint16_t	z_type;		/* type of entry allow/deny */
++} zfs_oldace_t;
++
++#define	ACE_SLOT_CNT	6
++
++typedef struct zfs_znode_acl_v0 {
++	uint64_t	z_acl_extern_obj;	  /* ext acl pieces */
++	uint32_t	z_acl_count;		  /* Number of ACEs */
++	uint16_t	z_acl_version;		  /* acl version */
++	uint16_t	z_acl_pad;		  /* pad */
++	zfs_oldace_t	z_ace_data[ACE_SLOT_CNT]; /* 6 standard ACEs */
++} zfs_znode_acl_v0_t;
++
++#define	ZFS_ACE_SPACE	(sizeof (zfs_oldace_t) * ACE_SLOT_CNT)
++
++typedef struct zfs_znode_acl {
++	uint64_t	z_acl_extern_obj;	  /* ext acl pieces */
++	uint32_t	z_acl_size;		  /* Number of bytes in ACL */
++	uint16_t	z_acl_version;		  /* acl version */
++	uint16_t	z_acl_count;		  /* ace count */
++	uint8_t		z_ace_data[ZFS_ACE_SPACE]; /* space for embedded ACEs */
++} zfs_znode_acl_t;
++
++
++#endif	/* _SYS_FS_ZFS_ACL_H */
+diff -urN grub.patch50/stage2/zfs-include/zfs_znode.h grub.zfs_solaris/stage2/zfs-include/zfs_znode.h
+--- grub.patch50/stage2/zfs-include/zfs_znode.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/zfs_znode.h	2011-10-12 19:58:29.059921869 +0200
+@@ -0,0 +1,69 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef	_SYS_FS_ZFS_ZNODE_H
++#define	_SYS_FS_ZFS_ZNODE_H
++
++#define	MASTER_NODE_OBJ	1
++#define	ZFS_ROOT_OBJ		"ROOT"
++#define	ZPL_VERSION_STR		"VERSION"
++#define	ZFS_SA_ATTRS		"SA_ATTRS"
++
++#define	ZPL_VERSION		5ULL
++
++#define	ZFS_DIRENT_OBJ(de) BF64_GET(de, 0, 48)
++
++/*
++ * This is the persistent portion of the znode.  It is stored
++ * in the "bonus buffer" of the file.  Short symbolic links
++ * are also stored in the bonus buffer.
++ */
++typedef struct znode_phys {
++	uint64_t zp_atime[2];		/*  0 - last file access time */
++	uint64_t zp_mtime[2];		/* 16 - last file modification time */
++	uint64_t zp_ctime[2];		/* 32 - last file change time */
++	uint64_t zp_crtime[2];		/* 48 - creation time */
++	uint64_t zp_gen;		/* 64 - generation (txg of creation) */
++	uint64_t zp_mode;		/* 72 - file mode bits */
++	uint64_t zp_size;		/* 80 - size of file */
++	uint64_t zp_parent;		/* 88 - directory parent (`..') */
++	uint64_t zp_links;		/* 96 - number of links to file */
++	uint64_t zp_xattr;		/* 104 - DMU object for xattrs */
++	uint64_t zp_rdev;		/* 112 - dev_t for VBLK & VCHR files */
++	uint64_t zp_flags;		/* 120 - persistent flags */
++	uint64_t zp_uid;		/* 128 - file owner */
++	uint64_t zp_gid;		/* 136 - owning group */
++	uint64_t zp_pad[4];		/* 144 - future */
++	zfs_znode_acl_t zp_acl;		/* 176 - 263 ACL */
++	/*
++	 * Data may pad out any remaining bytes in the znode buffer, eg:
++	 *
++	 * |<---------------------- dnode_phys (512) ------------------------>|
++	 * |<-- dnode (192) --->|<----------- "bonus" buffer (320) ---------->|
++	 *			|<---- znode (264) ---->|<---- data (56) ---->|
++	 *
++	 * At present, we only use this space to store symbolic links.
++	 */
++} znode_phys_t;
++
++#endif	/* _SYS_FS_ZFS_ZNODE_H */
+diff -urN grub.patch50/stage2/zfs-include/zil.h grub.zfs_solaris/stage2/zfs-include/zil.h
+--- grub.patch50/stage2/zfs-include/zil.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/zil.h	2011-10-12 19:58:29.059921869 +0200
+@@ -0,0 +1,57 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef	_SYS_ZIL_H
++#define	_SYS_ZIL_H
++
++/*
++ * Intent log format:
++ *
++ * Each objset has its own intent log.  The log header (zil_header_t)
++ * for objset N's intent log is kept in the Nth object of the SPA's
++ * intent_log objset.  The log header points to a chain of log blocks,
++ * each of which contains log records (i.e., transactions) followed by
++ * a log block trailer (zil_trailer_t).  The format of a log record
++ * depends on the record (or transaction) type, but all records begin
++ * with a common structure that defines the type, length, and txg.
++ */
++
++/*
++ * Intent log header - this on disk structure holds fields to manage
++ * the log.  All fields are 64 bit to easily handle cross architectures.
++ */
++typedef struct zil_header {
++	uint64_t zh_claim_txg;	/* txg in which log blocks were claimed */
++	uint64_t zh_replay_seq;	/* highest replayed sequence number */
++	blkptr_t zh_log;	/* log chain */
++	uint64_t zh_claim_seq;	/* highest claimed sequence number */
++	uint64_t zh_flags;	/* header flags */
++	uint64_t zh_pad[4];
++} zil_header_t;
++
++/*
++ * zh_flags bit settings
++ */
++#define	ZIL_REPLAY_NEEDED 0x1	/* replay needed - internal only */
++
++#endif	/* _SYS_ZIL_H */
+diff -urN grub.patch50/stage2/zfs-include/zio.h grub.zfs_solaris/stage2/zfs-include/zio.h
+--- grub.patch50/stage2/zfs-include/zio.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/zio.h	2011-10-12 19:58:29.059921869 +0200
+@@ -0,0 +1,79 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
++ */
++
++#ifndef _ZIO_H
++#define	_ZIO_H
++
++#define	ZEC_MAGIC	0x210da7ab10c7a11ULL	/* zio data bloc tail */
++
++typedef struct zio_eck {
++	uint64_t	zec_magic;	/* for validation, endianness	*/
++	zio_cksum_t	zec_cksum;	/* 256-bit checksum		*/
++} zio_eck_t;
++
++/*
++ * Gang block headers are self-checksumming and contain an array
++ * of block pointers.
++ */
++#define	SPA_GANGBLOCKSIZE	SPA_MINBLOCKSIZE
++#define	SPA_GBH_NBLKPTRS	((SPA_GANGBLOCKSIZE - \
++	sizeof (zio_eck_t)) / sizeof (blkptr_t))
++#define	SPA_GBH_FILLER		((SPA_GANGBLOCKSIZE - \
++	sizeof (zio_eck_t) - \
++	(SPA_GBH_NBLKPTRS * sizeof (blkptr_t))) /\
++	sizeof (uint64_t))
++
++#define	ZIO_GET_IOSIZE(zio)	\
++	(BP_IS_GANG((zio)->io_bp) ? \
++	SPA_GANGBLOCKSIZE : BP_GET_PSIZE((zio)->io_bp))
++
++typedef struct zio_gbh {
++	blkptr_t		zg_blkptr[SPA_GBH_NBLKPTRS];
++	uint64_t		zg_filler[SPA_GBH_FILLER];
++	zio_eck_t		zg_tail;
++} zio_gbh_phys_t;
++
++enum zio_checksum {
++	ZIO_CHECKSUM_INHERIT = 0,
++	ZIO_CHECKSUM_ON,
++	ZIO_CHECKSUM_OFF,
++	ZIO_CHECKSUM_LABEL,
++	ZIO_CHECKSUM_GANG_HEADER,
++	ZIO_CHECKSUM_ZILOG,
++	ZIO_CHECKSUM_FLETCHER_2,
++	ZIO_CHECKSUM_FLETCHER_4,
++	ZIO_CHECKSUM_SHA256,
++	ZIO_CHECKSUM_ZILOG2,
++	ZIO_CHECKSUM_SHA256_MAC,
++	ZIO_CHECKSUM_FUNCTIONS
++};
++
++enum zio_compress {
++	ZIO_COMPRESS_INHERIT = 0,
++	ZIO_COMPRESS_ON,
++	ZIO_COMPRESS_OFF,
++	ZIO_COMPRESS_LZJB,
++	ZIO_COMPRESS_EMPTY,
++	ZIO_COMPRESS_FUNCTIONS
++};
++
++#endif	/* _ZIO_H */
+diff -urN grub.patch50/stage2/zfs-include/zio_checksum.h grub.zfs_solaris/stage2/zfs-include/zio_checksum.h
+--- grub.patch50/stage2/zfs-include/zio_checksum.h	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs-include/zio_checksum.h	2011-10-12 19:58:29.059921869 +0200
+@@ -0,0 +1,42 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#ifndef _SYS_ZIO_CHECKSUM_H
++#define	_SYS_ZIO_CHECKSUM_H
++
++/*
++ * Signature for checksum functions.
++ */
++typedef void zio_checksum_t(const void *data, uint64_t size, zio_cksum_t *zcp);
++
++/*
++ * Information about each checksum function.
++ */
++typedef struct zio_checksum_info {
++	zio_checksum_t	*ci_func[2]; /* checksum function for each byteorder */
++	int		ci_correctable;	/* number of correctable bits	*/
++	int		ci_eck;		/* uses zio embedded checksum? */
++	char		*ci_name;	/* descriptive name */
++} zio_checksum_info_t;
++
++#endif	/* _SYS_ZIO_CHECKSUM_H */
+diff -urN grub.patch50/stage2/zfs_fletcher.c grub.zfs_solaris/stage2/zfs_fletcher.c
+--- grub.patch50/stage2/zfs_fletcher.c	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs_fletcher.c	2011-10-12 19:58:29.059921869 +0200
+@@ -0,0 +1,95 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#pragma ident	"%Z%%M%	%I%	%E% SMI"
++
++#include "fsys_zfs.h"
++
++
++void
++fletcher_2_native(const void *buf, uint64_t size, zio_cksum_t *zcp)
++{
++	const uint64_t *ip = buf;
++	const uint64_t *ipend = ip + (size / sizeof (uint64_t));
++	uint64_t a0, b0, a1, b1;
++
++	for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
++		a0 += ip[0];
++		a1 += ip[1];
++		b0 += a0;
++		b1 += a1;
++	}
++
++	ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
++}
++
++void
++fletcher_2_byteswap(const void *buf, uint64_t size, zio_cksum_t *zcp)
++{
++	const uint64_t *ip = buf;
++	const uint64_t *ipend = ip + (size / sizeof (uint64_t));
++	uint64_t a0, b0, a1, b1;
++
++	for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
++		a0 += BSWAP_64(ip[0]);
++		a1 += BSWAP_64(ip[1]);
++		b0 += a0;
++		b1 += a1;
++	}
++
++	ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
++}
++
++void
++fletcher_4_native(const void *buf, uint64_t size, zio_cksum_t *zcp)
++{
++	const uint32_t *ip = buf;
++	const uint32_t *ipend = ip + (size / sizeof (uint32_t));
++	uint64_t a, b, c, d;
++
++	for (a = b = c = d = 0; ip < ipend; ip++) {
++		a += ip[0];
++		b += a;
++		c += b;
++		d += c;
++	}
++
++	ZIO_SET_CHECKSUM(zcp, a, b, c, d);
++}
++
++void
++fletcher_4_byteswap(const void *buf, uint64_t size, zio_cksum_t *zcp)
++{
++	const uint32_t *ip = buf;
++	const uint32_t *ipend = ip + (size / sizeof (uint32_t));
++	uint64_t a, b, c, d;
++
++	for (a = b = c = d = 0; ip < ipend; ip++) {
++		a += BSWAP_32(ip[0]);
++		b += a;
++		c += b;
++		d += c;
++	}
++
++	ZIO_SET_CHECKSUM(zcp, a, b, c, d);
++}
+diff -urN grub.patch50/stage2/zfs_lzjb.c grub.zfs_solaris/stage2/zfs_lzjb.c
+--- grub.patch50/stage2/zfs_lzjb.c	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs_lzjb.c	2011-10-12 19:58:29.059921869 +0200
+@@ -0,0 +1,61 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#pragma ident	"%Z%%M%	%I%	%E% SMI"
++
++#include "fsys_zfs.h"
++
++#define	MATCH_BITS	6
++#define	MATCH_MIN	3
++#define	OFFSET_MASK	((1 << (16 - MATCH_BITS)) - 1)
++
++
++/*ARGSUSED*/
++int
++lzjb_decompress(void *s_start, void *d_start, size_t s_len, size_t d_len)
++{
++	uchar_t *src = s_start;
++	uchar_t *dst = d_start;
++	uchar_t *d_end = (uchar_t *)d_start + d_len;
++	uchar_t *cpy, copymap;
++	int copymask = 1 << (NBBY - 1);
++
++	while (dst < d_end) {
++		if ((copymask <<= 1) == (1 << NBBY)) {
++			copymask = 1;
++			copymap = *src++;
++		}
++		if (copymap & copymask) {
++			int mlen = (src[0] >> (NBBY - MATCH_BITS)) + MATCH_MIN;
++			int offset = ((src[0] << NBBY) | src[1]) & OFFSET_MASK;
++			src += 2;
++			if ((cpy = dst - offset) < (uchar_t *)d_start)
++				return (-1);
++			while (--mlen >= 0 && dst < d_end)
++				*dst++ = *cpy++;
++		} else {
++			*dst++ = *src++;
++		}
++	}
++	return (0);
++}
+diff -urN grub.patch50/stage2/zfs_sha256.c grub.zfs_solaris/stage2/zfs_sha256.c
+--- grub.patch50/stage2/zfs_sha256.c	1970-01-01 01:00:00.000000000 +0100
++++ grub.zfs_solaris/stage2/zfs_sha256.c	2011-10-12 19:58:29.059921869 +0200
+@@ -0,0 +1,126 @@
++/*
++ *  GRUB  --  GRand Unified Bootloader
++ *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
++ *
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License as published by
++ *  the Free Software Foundation; either version 2 of the License, or
++ *  (at your option) any later version.
++ *
++ *  This program 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.
++ */
++/*
++ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
++ * Use is subject to license terms.
++ */
++
++#pragma ident	"%Z%%M%	%I%	%E% SMI"
++
++#include "fsys_zfs.h"
++
++/*
++ * SHA-256 checksum, as specified in FIPS 180-2, available at:
++ * http://csrc.nist.gov/cryptval
++ *
++ * This is a very compact implementation of SHA-256.
++ * It is designed to be simple and portable, not to be fast.
++ */
++
++/*
++ * The literal definitions according to FIPS180-2 would be:
++ *
++ * 	Ch(x, y, z)     (((x) & (y)) ^ ((~(x)) & (z)))
++ * 	Maj(x, y, z)    (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
++ *
++ * We use logical equivalents which require one less op.
++ */
++#define	Ch(x, y, z)	((z) ^ ((x) & ((y) ^ (z))))
++#define	Maj(x, y, z)	(((x) & (y)) ^ ((z) & ((x) ^ (y))))
++#define	Rot32(x, s)	(((x) >> s) | ((x) << (32 - s)))
++#define	SIGMA0(x)	(Rot32(x, 2) ^ Rot32(x, 13) ^ Rot32(x, 22))
++#define	SIGMA1(x)	(Rot32(x, 6) ^ Rot32(x, 11) ^ Rot32(x, 25))
++#define	sigma0(x)	(Rot32(x, 7) ^ Rot32(x, 18) ^ ((x) >> 3))
++#define	sigma1(x)	(Rot32(x, 17) ^ Rot32(x, 19) ^ ((x) >> 10))
++
++static const uint32_t SHA256_K[64] = {
++	0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
++	0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
++	0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
++	0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
++	0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
++	0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
++	0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
++	0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
++	0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
++	0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
++	0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
++	0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
++	0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
++	0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
++	0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
++	0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
++};
++
++static void
++SHA256Transform(uint32_t *H, const uint8_t *cp)
++{
++	uint32_t a, b, c, d, e, f, g, h, t, T1, T2, W[64];
++
++	for (t = 0; t < 16; t++, cp += 4)
++		W[t] = (cp[0] << 24) | (cp[1] << 16) | (cp[2] << 8) | cp[3];
++
++	for (t = 16; t < 64; t++)
++		W[t] = sigma1(W[t - 2]) + W[t - 7] +
++		    sigma0(W[t - 15]) + W[t - 16];
++
++	a = H[0]; b = H[1]; c = H[2]; d = H[3];
++	e = H[4]; f = H[5]; g = H[6]; h = H[7];
++
++	for (t = 0; t < 64; t++) {
++		T1 = h + SIGMA1(e) + Ch(e, f, g) + SHA256_K[t] + W[t];
++		T2 = SIGMA0(a) + Maj(a, b, c);
++		h = g; g = f; f = e; e = d + T1;
++		d = c; c = b; b = a; a = T1 + T2;
++	}
++
++	H[0] += a; H[1] += b; H[2] += c; H[3] += d;
++	H[4] += e; H[5] += f; H[6] += g; H[7] += h;
++}
++
++void
++zio_checksum_SHA256(const void *buf, uint64_t size, zio_cksum_t *zcp)
++{
++	uint32_t H[8] = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
++	    0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 };
++	uint8_t pad[128];
++	int padsize = size & 63;
++	int i;
++
++	for (i = 0; i < size - padsize; i += 64)
++		SHA256Transform(H, (uint8_t *)buf + i);
++
++	for (i = 0; i < padsize; i++)
++		pad[i] = ((uint8_t *)buf)[i];
++
++	for (pad[padsize++] = 0x80; (padsize & 63) != 56; padsize++)
++		pad[padsize] = 0;
++
++	for (i = 0; i < 8; i++)
++		pad[padsize++] = (size << 3) >> (56 - 8 * i);
++
++	for (i = 0; i < padsize; i += 64)
++		SHA256Transform(H, pad + i);
++
++	ZIO_SET_CHECKSUM(zcp,
++	    (uint64_t)H[0] << 32 | H[1],
++	    (uint64_t)H[2] << 32 | H[3],
++	    (uint64_t)H[4] << 32 | H[5],
++	    (uint64_t)H[6] << 32 | H[7]);
++}
diff -r 4b0907c6a08c stubdom/grub/Makefile
--- a/stubdom/grub/Makefile	Tue Oct 11 12:02:58 2011 +0100
+++ b/stubdom/grub/Makefile	Wed Oct 12 20:06:15 2011 +0200
@@ -54,6 +54,9 @@
 STAGE2_SOURCES+=fsys_xfs.c
 CPPFLAGS += -DFSYS_XFS=1
 
+STAGE2_SOURCES+=fsys_zfs.c zfs_fletcher.c zfs_lzjb.c zfs_sha256.c
+CPPFLAGS += -DFSYS_ZFS=1
+
 STAGE2_SOURCES:=$(addprefix stage2/,$(STAGE2_SOURCES))
 NETBOOT_SOURCES:=$(addprefix netboot/,$(NETBOOT_SOURCES))
 

--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 Wed Oct 12 13:52:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 13:52:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE5n6-0004pD-Tr; Wed, 12 Oct 2011 13:52:40 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE5m6-0004cC-M5
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 13:51:39 -0700
X-Env-Sender: fajar@fajar.net
X-Msg-Ref: server-12.tower-174.messagelabs.com!1318452694!35024261!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11562 invoked from network); 12 Oct 2011 20:51:35 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	12 Oct 2011 20:51:35 -0000
Received: by ywt32 with SMTP id 32so678779ywt.30
	for <xen-devel@lists.xensource.com>;
	Wed, 12 Oct 2011 13:51:34 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.43.49.131 with SMTP id va3mr1194532icb.51.1318452693895; Wed,
	12 Oct 2011 13:51:33 -0700 (PDT)
Received: by 10.42.241.2 with HTTP; Wed, 12 Oct 2011 13:51:33 -0700 (PDT)
In-Reply-To: <20111012204011.GA7518@lilo2.science.ru.nl>
References: <20111012204011.GA7518@lilo2.science.ru.nl>
Date: Thu, 13 Oct 2011 03:51:33 +0700
Message-ID: <CAG1y0seUb5ySka1SnMOMuD8AnP5DGJUdFcJpcDsL+3VCK4U_6A@mail.gmail.com>
Subject: Re: [Xen-devel] pv-grub Solaris support
From: "Fajar A. Nugraha" <list@fajar.net>
To: Kasper Brink <K.Brink@cs.ru.nl>
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 Thu, Oct 13, 2011 at 3:40 AM, Kasper Brink <K.Brink@cs.ru.nl> wrote:
> Hello all,
>
> I've patched pv-grub to allow it to boot a Solaris PV domU using an
> unmodified menu.lst. The attached patch has been tested with various
> Solaris versions (Solaris 11 Express, OpenIndiana 151a, OpenSolaris 134,
> Nexenta Core 3.0.1; all 64-bit). I appreciate your feedback.

Awesome :D

Can you also create a patch for pygrub?

Your patch style looks weird though. You're creating a new patch file,
stubdom/grub.patches/60zfs_solaris.diff, which patches other patch
files? Or is it simply manual merging problem?

-- 
Fajar

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 13:53:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 13: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 1RE5oI-0005CK-Dy; Wed, 12 Oct 2011 13:53:54 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE5n2-0004nQ-MQ
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 13:52:36 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318452638!40065972!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21586 invoked from network); 12 Oct 2011 20:50:39 -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; 12 Oct 2011 20:50:39 -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
	p9CKp1D1015658
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 12 Oct 2011 20:51:03 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
	p9CKp0FC009723
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 20:51:01 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
	p9CKosse018683; Wed, 12 Oct 2011 15:50:54 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 12 Oct 2011 13:50:54 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 9D071120E; Wed, 12 Oct 2011 16:40:48 -0400 (EDT)
Date: Wed, 12 Oct 2011 16:40:48 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Borislav Petkov <bp@amd64.org>
Message-ID: <20111012204048.GA22260@phenom.oracle.com>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111012194543.GD14966@aftab>
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.4E95FDB9.0025:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	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>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 12, 2011 at 09:45:43PM +0200, Borislav Petkov wrote:
> On Wed, Oct 12, 2011 at 03:18:22PM -0400, Jeremy Fitzhardinge wrote:
> > While doing the whole boot time multiboot thing may offer some small
> > hypothetical technical advantages, it has the significant cost of just
> > complicating the whole deployment and use story.
> 
> You simply can't call the need to apply ucode as early as possible a
> "hypothetical techical advantage." Other issues like how to handle ucode
> images and how to put them together and how distros distribute them
> and whether xen minimizes the amount of "specialness" or not are only
> secondary.

Why is it paramount to do it as early as possible? As in, even doing
it before Linux kernel is invoked is preferred than during initrd runtime?

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 14:33:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 14:33:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE6QU-0007Yb-3k; Wed, 12 Oct 2011 14:33:22 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE6Pr-0007M0-Tb
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 14:32:44 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1318455159!765550!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23992 invoked from network); 12 Oct 2011 21:32:40 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-15.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 21:32:40 -0000
Received: from hanvin-mobl6.amr.corp.intel.com (jfdmzpr03-ext.jf.intel.com
	[134.134.139.72]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9CLW2CT032173
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 14:32:02 -0700
Message-ID: <4E960746.90805@zytor.com>
Date: Wed, 12 Oct 2011 14:31:50 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
In-Reply-To: <20111012204048.GA22260@phenom.oracle.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 01:40 PM, Konrad Rzeszutek Wilk wrote:
> Why is it paramount to do it as early as possible? As in, even doing
> it before Linux kernel is invoked is preferred than during initrd runtime?

It is paramount to do it as early as possible *because the CPU is 
broken*.  That's why there is a microcode update at all.  It is 
*supposed* to be installed by BIOS, but for whatever reason it wasn't 
(including user doesn't want to update the BIOS), so the very fact that 
this is done in the OS at all is a bit of a fail.

Doing it in the bootloader is messy because bootloaders typically aren't 
SMP-aware (and really shouldn't need to be), which leaves the OS.  On 
native hardware it should ideally be done as early in the processor 
bringup as possible.

	-hpa

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 14:36:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 14: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 1RE6Tm-00085E-Qz; Wed, 12 Oct 2011 14:36:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE6TI-0007si-Sp
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 14:36:17 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318455358!43994973!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4846 invoked from network); 12 Oct 2011 21:35:59 -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;
	12 Oct 2011 21:35:59 -0000
Received: by vws13 with SMTP id 13so625760vws.30
	for <xen-devel@lists.xensource.com>;
	Wed, 12 Oct 2011 14:36:12 -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:content-type;
	bh=LXNgzjmzocSw/T1VXIToYmh0tZx1Oi0rV4df3IcC+y8=;
	b=HnhdBAu8X5ZF07UWjJBowOz2gCxBl1hhnERuAIRO1F2geBpz2PFNXCM+e1fHw39ku2
	8E2yq1TkGfvXKtaclu8mqzqXFyTVwi83b4wV619kjPTxXwNOm/qk2pY9qZ5lpzYJmIKm
	Z/ZRrrnouwIf6t3OMXTd6m8HxknSP7YpXJz1A=
MIME-Version: 1.0
Received: by 10.52.67.84 with SMTP id l20mr956872vdt.73.1318455372692; Wed, 12
	Oct 2011 14:36:12 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Wed, 12 Oct 2011 14:36:12 -0700 (PDT)
In-Reply-To: <CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
Date: Wed, 12 Oct 2011 22:36:12 +0100
X-Google-Sender-Auth: cAM05vmtH0m6BMFPzuKm5LCNixg
Message-ID: <CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-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 12 October 2011 09:01, Andy Burns <xen.lists@burns.me.uk> wrote:

> Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
>
>> So it works now right?
>
> No.
>
> I think I remember what was the test I did before the boot that
> started working again

I didn't get much time to test this today ... reverted to same Xen and
kernel versions that worked briefly last night.

I discovered that (despite what I answered earlier) the PCI tuners
don't work in dom0 under Xen, they only work if the dom0 is booted  as
baremetal.

If I reboot from dom0 from baremetal with the PCI cards working into
Xen without powering off, it doesn't "magically" leave the PCI cards
in a state that allows them to work in the domU.

The thing which *seemed* to put it into a good mood last night was
booting dom0 with serial console and the domU with the PIC cards but
without the PCIe card, but that made no difference today.

I'm beginning to follow Konrad's thoughts that there is a specific
sequence of events, that persists in hardware state across soft
reboots, occasionally ending up with functioning PCI cards.

Is the fact that the PCI cards fail in dom0 under Xen a hint?  Any
debugging I can do with the tuners from the dom0 rather than the domU
with passthrough?

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 14:55:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 14:55:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE6mL-0000PV-7U; Wed, 12 Oct 2011 14:55:57 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE6la-0000CY-6N
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 14:55:10 -0700
X-Env-Sender: K.Brink@cs.ru.nl
X-Msg-Ref: server-5.tower-216.messagelabs.com!1318456506!766326!1
X-Originating-IP: [131.174.16.143]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22474 invoked from network); 12 Oct 2011 21:55:07 -0000
Received: from smeltpunt.science.ru.nl (HELO smeltpunt.science.ru.nl)
	(131.174.16.143)
	by server-5.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 21:55:07 -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 p9CLt5AS012637; 
	Wed, 12 Oct 2011 23:55:05 +0200 (MEST)
Date: Wed, 12 Oct 2011 23:55:05 +0200
From: Kasper Brink <K.Brink@cs.ru.nl>
To: "Fajar A. Nugraha" <list@fajar.net>
Subject: Re: [Xen-devel] pv-grub Solaris support
Message-ID: <20111012215504.GA14881@lilo2.science.ru.nl>
References: <20111012204011.GA7518@lilo2.science.ru.nl>
	<CAG1y0seUb5ySka1SnMOMuD8AnP5DGJUdFcJpcDsL+3VCK4U_6A@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAG1y0seUb5ySka1SnMOMuD8AnP5DGJUdFcJpcDsL+3VCK4U_6A@mail.gmail.com>
User-Agent: Mutt/1.5.20 (2009-06-14)
X-Spam-Score: -1.289 () ALL_TRUSTED,AWL,BAYES_50
X-Scanned-By: MIMEDefang 2.63 on 131.174.16.143
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

Hi Fajar,

On Thu, Oct 13, 2011 at 03:51:33AM +0700, Fajar A. Nugraha wrote:
> Can you also create a patch for pygrub?

I haven't tested it, but it seems as though pygrub should already support
ZFS via libfsimage, and it also contains some Solaris-detection logic.
Perhaps the the ZFS version in libfsimage needs updating, though. 

> Your patch style looks weird though. You're creating a new patch file,
> stubdom/grub.patches/60zfs_solaris.diff, which patches other patch
> files? Or is it simply manual merging problem?

Yes, I agree this is a bit awkward. I tried to stick to the way that
pv-grub is currently built: the Makefile downloads the original upstream
sources of grub-0.97 from GNU's ftp site, and then applies the set of
patches in stubdom/grub.patches to it.

The patch attached to my email (pv-grub_solaris.patch) creates a new file
stubdom/grub.patches/60zfs_solaris.diff (which contains the Solaris-related
changes to grub-0.97), and modifies stubdom/grub/Makefile (to include
several new source files into pv-grub). Sorry if I didn't make this clear!

Best,

Kasper

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:17:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:17:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE77F-00018c-Cn; Wed, 12 Oct 2011 15:17:33 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE75Z-0000ui-7o
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:15:50 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318457744!21350999!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24797 invoked from network); 12 Oct 2011 22:15:46 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 22:15:46 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9CMFfZ4030013
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Wed, 12 Oct 2011 22:15:43 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9CM9hXh024323
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 22:09:44 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9CMFYNu010047; Wed, 12 Oct 2011 17:15:35 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 12 Oct 2011 15:15:34 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 347BA120E; Wed, 12 Oct 2011 18:15:21 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1318457565@localhost6.localdomain6>
User-Agent: Mercurial-patchbomb/1.9.1
Date: Wed, 12 Oct 2011 18:12:45 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com, JBeulich@suse.com
Status: RO
Lines: 6
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090203.4E96118F.002C,ss=1,re=0.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 0 of 3] Patches to alter BLKIF_OP_TRIM to
	BLKIF_OP_DISCARD (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

This is the v4 patches which is broken in three parts and does:

 1). rename trim->discard
 2). flesh out the description
 3). add the secure-discard option.



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:18:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:18:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE78I-0001W7-Me; Wed, 12 Oct 2011 15:18:38 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE75Z-0000uh-32
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:15:50 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318457716!52575341!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6938 invoked from network); 12 Oct 2011 22:15:18 -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; 12 Oct 2011 22:15:18 -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
	p9CMFev4030003
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 12 Oct 2011 22:15:42 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
	p9CMFelg023498
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 22:15:40 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
	p9CMFZel010048; Wed, 12 Oct 2011 17:15:35 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 12 Oct 2011 15:15:34 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 3EECC157E; Wed, 12 Oct 2011 18:15:21 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 15c2d70dbac3e31c2d74b6700e1bb5f8a7d8256e
Message-Id: <15c2d70dbac3e31c2d74.1318457567@localhost6.localdomain6>
In-Reply-To: <patchbomb.1318457565@localhost6.localdomain6>
References: <patchbomb.1318457565@localhost6.localdomain6>
User-Agent: Mercurial-patchbomb/1.9.1
Date: Wed, 12 Oct 2011 18:12:47 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com, JBeulich@suse.com
Status: RO
Lines: 68
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4E96118F.001B:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 2 of 3] interface: Flesh out the
	BLKIF_OP_DISCARD 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

# HG changeset patch
# User Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
# Date 1318457227 14400
# Node ID 15c2d70dbac3e31c2d74b6700e1bb5f8a7d8256e
# Parent  88b7814df143169a1cf946a9881ae2ecea9693bd
interface: Flesh out the BLKIF_OP_DISCARD description.

We flesh out details on what is expected of 'feature-flush' and
what are some of the extra parameters that the frontend can read
from the backend. Those extra parameters are: : discard-aligment,
and discard-granularity.

Acked-by: Jan Beulich <JBeulich@suse.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff -r 88b7814df143 -r 15c2d70dbac3 xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h	Wed Oct 12 18:07:04 2011 -0400
+++ b/xen/include/public/io/blkif.h	Wed Oct 12 18:07:07 2011 -0400
@@ -83,22 +83,42 @@
 #define BLKIF_OP_RESERVED_1        4
 /*
  * Recognised only if "feature-discard" is present in backend xenbus info.
- * The "feature-discard" node contains a boolean indicating whether discard
- * requests are likely to succeed or fail. Either way, a discard request
+ * The "feature-discard" node contains a boolean indicating whether trim
+ * (ATA) or unmap (SCSI) - conviently called discard requests are likely
+ * to succeed or fail. Either way, a discard request
  * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by
  * the underlying block-device hardware. The boolean simply indicates whether
  * or not it is worthwhile for the frontend to attempt discard requests.
  * If a backend does not recognise BLKIF_OP_DISCARD, it should *not*
  * create the "feature-discard" node!
- * 
+ *
  * Discard operation is a request for the underlying block device to mark
- * extents to be erased. Discard operations are passed with sector_number as the
+ * extents to be erased. However, discard does not guarantee that the blocks
+ * will be erased from the device - it is just a hint to the device
+ * controller that these blocks are no longer in use. What the device
+ * controller does with that information is left to the controller.
+ * Discard operations are passed with sector_number as the
  * sector index to begin discard operations at and nr_sectors as the number of
  * sectors to be discarded. The specified sectors should be discarded if the
- * underlying block device supports discard operations, or a BLKIF_RSP_EOPNOTSUPP
- * should be returned. More information about discard operations at:
+ * underlying block device supports trim (ATA) or unmap (SCSI) operations,
+ * or a BLKIF_RSP_EOPNOTSUPP  should be returned.
+ * More information about trim/unmap operations at:
  * http://t13.org/Documents/UploadedDocuments/docs2008/
  *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
+ * http://www.seagate.com/staticfiles/support/disc/manuals/
+ *     Interface%20manuals/100293068c.pdf
+ * The backend can optionally provide two extra XenBus attributes to
+ * further optimize the discard functionality:
+ * 'discard-aligment' - Devices that support discard functionality may
+ * internally allocate space in units that are bigger than the exported
+ * logical block size. The discard-alignment parameter indicates how many bytes
+ * the beginning of the partition is offset from the internal allocation unit's
+ * natural alignment.
+ * 'discard-granularity'  - Devices that support discard functionality may
+ * internally allocate space using units that are bigger than the logical block
+ * size. The discard-granularity parameter indicates the size of the internal
+ * allocation unit in bytes if reported by the device. Otherwise the
+ * discard-granularity will be set to match the device's physical block size.
  */
 #define BLKIF_OP_DISCARD           5
 



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:19:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:19:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE79A-0001tW-Nl; Wed, 12 Oct 2011 15:19:32 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE75a-0000uj-6D
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:15:50 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1318457745!20245317!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24142 invoked from network); 12 Oct 2011 22:15:46 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-11.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 22:15:46 -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
	p9CMFedZ012910
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 12 Oct 2011 22:15:42 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
	p9CMFeOd014739
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 22:15:40 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
	p9CMFZD3031619; Wed, 12 Oct 2011 17:15:35 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 12 Oct 2011 15:15:34 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 4524C1580; Wed, 12 Oct 2011 18:15:21 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 50850daec7f0486ee7ca69b3d4cb58b4d340a5a7
Message-Id: <50850daec7f0486ee7ca.1318457568@localhost6.localdomain6>
In-Reply-To: <patchbomb.1318457565@localhost6.localdomain6>
References: <patchbomb.1318457565@localhost6.localdomain6>
User-Agent: Mercurial-patchbomb/1.9.1
Date: Wed, 12 Oct 2011 18:12:48 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com, JBeulich@suse.com
Status: RO
Lines: 50
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090202.4E96118F.003E:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 3 of 3] interface: add 'discard-secure' and
 BLKIF_DISCARD_SECURE
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318457231 14400
# Node ID 50850daec7f0486ee7ca69b3d4cb58b4d340a5a7
# Parent  15c2d70dbac3e31c2d74b6700e1bb5f8a7d8256e
interface: add 'discard-secure' and BLKIF_DISCARD_SECURE

Alter the 'reserved' uint8_t to be used a 'flag'. We use only for
one flag: BLKIF_DISCARD_SECURE.

That flag can only be set if the backend has set 'discard-secure' to one.
If backend has not set 'discard-secure' to one, that flag will have no
effect.

Acked-by: Jan Beulich <JBeulich@suse.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff -r 15c2d70dbac3 -r 50850daec7f0 xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h	Wed Oct 12 18:07:07 2011 -0400
+++ b/xen/include/public/io/blkif.h	Wed Oct 12 18:07:11 2011 -0400
@@ -107,7 +107,7 @@
  *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
  * http://www.seagate.com/staticfiles/support/disc/manuals/
  *     Interface%20manuals/100293068c.pdf
- * The backend can optionally provide two extra XenBus attributes to
+ * The backend can optionally provide three extra XenBus attributes to
  * further optimize the discard functionality:
  * 'discard-aligment' - Devices that support discard functionality may
  * internally allocate space in units that are bigger than the exported
@@ -119,6 +119,9 @@
  * size. The discard-granularity parameter indicates the size of the internal
  * allocation unit in bytes if reported by the device. Otherwise the
  * discard-granularity will be set to match the device's physical block size.
+ * 'discard-secure' - All copies of the discarded sectors (potentially created
+ * by garbage collection) must also be erased.  To use this feature, the flag
+ * BLKIF_DISCARD_SECURE must be set in the blkif_request_trim.
  */
 #define BLKIF_OP_DISCARD           5
 
@@ -159,7 +162,8 @@ typedef struct blkif_request blkif_reque
  */
 struct blkif_request_discard {
     uint8_t        operation;    /* BLKIF_OP_DISCARD                     */
-    uint8_t        reserved;     /*                                      */
+    uint8_t        flag;         /* BLKIF_DISCARD_SECURE or zero         */
+#define BLKIF_DISCARD_SECURE (1<<0)  /* ignored if discard-secure=0      */
     blkif_vdev_t   handle;       /* same as for read/write requests      */
     uint64_t       id;           /* private guest value, echoed in resp  */
     blkif_sector_t sector_number;/* start sector idx on disk             */



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:20:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:20:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE7A4-0002H6-JB; Wed, 12 Oct 2011 15:20:28 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE75a-0000uk-7G
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:15:51 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1318457745!17043137!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30818 invoked from network); 12 Oct 2011 22:15:46 -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; 12 Oct 2011 22:15:46 -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
	p9CMFfBD012913
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 12 Oct 2011 22:15:42 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
	p9CMFeem014752
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 22:15:40 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
	p9CMFZh4002172; Wed, 12 Oct 2011 17:15:35 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 12 Oct 2011 15:15:34 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 391EF1F1; Wed, 12 Oct 2011 18:15:21 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 88b7814df143169a1cf946a9881ae2ecea9693bd
Message-Id: <88b7814df143169a1cf9.1318457566@localhost6.localdomain6>
In-Reply-To: <patchbomb.1318457565@localhost6.localdomain6>
References: <patchbomb.1318457565@localhost6.localdomain6>
User-Agent: Mercurial-patchbomb/1.9.1
Date: Wed, 12 Oct 2011 18:12:46 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com, JBeulich@suse.com
Status: RO
Lines: 82
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090207.4E96118F.005A:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 1 of 3] interface: rename of trim to discard in
	blkif.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

# HG changeset patch
# User Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
# Date 1318457224 14400
# Node ID 88b7814df143169a1cf946a9881ae2ecea9693bd
# Parent  4b0907c6a08c348962bd976c2976257b412408be
interface: rename of trim to discard in blkif.h

Just a simple sed s/trim/discard/. We are ignoring the comments
which are incorrect.

The reason for the name change is that TRIM is specific to ATA
while the operation can be done on top of SCSI interfaces too.
Hence the rename to something more generic.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff -r 4b0907c6a08c -r 88b7814df143 xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h	Tue Oct 11 12:02:58 2011 +0100
+++ b/xen/include/public/io/blkif.h	Wed Oct 12 18:07:04 2011 -0400
@@ -82,25 +82,25 @@
  */
 #define BLKIF_OP_RESERVED_1        4
 /*
- * Recognised only if "feature-trim" is present in backend xenbus info.
- * The "feature-trim" node contains a boolean indicating whether trim
- * requests are likely to succeed or fail. Either way, a trim request
+ * Recognised only if "feature-discard" is present in backend xenbus info.
+ * The "feature-discard" node contains a boolean indicating whether discard
+ * requests are likely to succeed or fail. Either way, a discard request
  * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by
  * the underlying block-device hardware. The boolean simply indicates whether
- * or not it is worthwhile for the frontend to attempt trim requests.
- * If a backend does not recognise BLKIF_OP_TRIM, it should *not*
- * create the "feature-trim" node!
+ * or not it is worthwhile for the frontend to attempt discard requests.
+ * If a backend does not recognise BLKIF_OP_DISCARD, it should *not*
+ * create the "feature-discard" node!
  * 
- * Trim operation is a request for the underlying block device to mark
- * extents to be erased. Trim operations are passed with sector_number as the
- * sector index to begin trim operations at and nr_sectors as the number of
- * sectors to be trimmed. The specified sectors should be trimmed if the
- * underlying block device supports trim operations, or a BLKIF_RSP_EOPNOTSUPP
- * should be returned. More information about trim operations at:
+ * Discard operation is a request for the underlying block device to mark
+ * extents to be erased. Discard operations are passed with sector_number as the
+ * sector index to begin discard operations at and nr_sectors as the number of
+ * sectors to be discarded. The specified sectors should be discarded if the
+ * underlying block device supports discard operations, or a BLKIF_RSP_EOPNOTSUPP
+ * should be returned. More information about discard operations at:
  * http://t13.org/Documents/UploadedDocuments/docs2008/
  *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
  */
-#define BLKIF_OP_TRIM              5
+#define BLKIF_OP_DISCARD           5
 
 /*
  * Maximum scatter/gather segments per request.
@@ -135,17 +135,17 @@ typedef struct blkif_request blkif_reque
 
 /*
  * Cast to this structure when blkif_request.operation == BLKIF_OP_TRIM
- * sizeof(struct blkif_request_trim) <= sizeof(struct blkif_request)
+ * sizeof(struct blkif_request_discard) <= sizeof(struct blkif_request)
  */
-struct blkif_request_trim {
-    uint8_t        operation;    /* BLKIF_OP_TRIM                        */
+struct blkif_request_discard {
+    uint8_t        operation;    /* BLKIF_OP_DISCARD                     */
     uint8_t        reserved;     /*                                      */
     blkif_vdev_t   handle;       /* same as for read/write requests      */
     uint64_t       id;           /* private guest value, echoed in resp  */
     blkif_sector_t sector_number;/* start sector idx on disk             */
-    uint64_t       nr_sectors;   /* number of contiguous sectors to trim */
+    uint64_t       nr_sectors;   /* number of contiguous sectors to discard*/
 };
-typedef struct blkif_request_trim blkif_request_trim_t;
+typedef struct blkif_request_discard blkif_request_discard_t;
 
 struct blkif_response {
     uint64_t        id;              /* copied from request */



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:21:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:21:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE7BB-0002kh-7J; Wed, 12 Oct 2011 15:21:37 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE7AE-0002KK-6X
	for Xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:20:38 -0700
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1318458033!20863941!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13910 invoked from network); 12 Oct 2011 22:20:35 -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; 12 Oct 2011 22:20:35 -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
	p9CMKRC9018089
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 12 Oct 2011 22:20:29 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
	p9CMKQpl022115
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 22:20:27 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
	p9CMKKM2005195; Wed, 12 Oct 2011 17:20:21 -0500
MIME-Version: 1.0
Message-ID: <372657c9-02c3-4a9d-a283-86e655db8916@default>
Date: Wed, 12 Oct 2011 15:20:19 -0700 (PDT)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: Larry Bassel <lbassel@codeaurora.org>, Seth Jennings
	<sjenning@linux.vnet.ibm.com>
Subject: RE: [Xen-devel] Re: RFC -- new zone type
References: <20110928180909.GA7007@labbmf-linux.qualcomm.comCAOFJiu1_HaboUMqtjowA2xKNmGviDE55GUV4OD1vN2hXUf4-kQ@mail.gmail.com>
	<c2d9add1-0095-4319-8936-db1b156559bf@default20111005165643.GE7007@labbmf-linux.qualcomm.com>
	<cc1256f9-4808-4d74-a321-6a3ec129cc05@default20111006230348.GF7007@labbmf-linux.qualcomm.com>
	<4d0a5da4-00de-40dd-8d75-8ed6e3d0831c@default>
	<4E8F2242.3030406@linux.vnet.ibm.com
	20111007171958.GG7007@labbmf-linux.qualcomm.com>
In-Reply-To: <20111007171958.GG7007@labbmf-linux.qualcomm.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: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090204.4E9612AE.009F:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: linux-mm@kvack.org, 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: Larry Bassel [mailto:lbassel@codeaurora.org]
>=20
> As this area must be very large and contiguous, I can't use kmalloc or si=
milar
> allocation APIs -- I imagine I'll carve it out early in boot with
> memblock_remove() -- luckily this area is of fixed size. If this memory
> were in ZONE_HIGHMEM, I'd just have to use kmap to get a temporary mappin=
g
> to use when the page is copied to or from "normal" system memory (or am
> I missing something here?). Whether this area is in highmem or not, I ima=
gine
> I'll need to write an allocator to allocate/free pages from the "dual-pur=
pose"
> memory when it is cleancache.

Yep.  It would also be very nice if you could allocate the
metadata (tmem data structures) from the same "dual-purpose"
memory as then all of the data structures can simply be discarded
when you need the memory for the "big-100MB-block" purpose.
Zeroing a single pointer would be enough to "free" all
data and metadata.

Sadly I don't think this will work when the dual-purpose memory
is in highmem... you will need to walk the metadata and
free it all up when you free the cleancache pages.
=20
> > I did write a patch a while back that allows xvmalloc to use highmem
> > pages in it's storage pool.  Although, from looking at the history of t=
his
> > conversation, you'd be writing a different backend for tmem and not usi=
ng
> > zcache anyway.
>=20
> We're going to want a backend which is (at least to a
> first approximation) a simplification of zcache
> -- no compression and no frontswap is needed.
> Possibly we'll start with zcache and remove things we don't need.

Agree that's your best bet.  Let us know how it goes, especially if
you eventually plan for the driver to be submitted upstream.

> > Currently the tmem code is in the zcache driver.  However, if there are
> > going to be other backends designed for it, we may need to move it into=
 its
> > own module so it can be shared.

I think the longterm home for tmem.c/tmem.h should be in the "lib"
subdirectory of the linux tree, but it will require another driver
or two to use it before the linux maintainers will consider that.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:28:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:28:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE7I7-0003IA-Ch; Wed, 12 Oct 2011 15:28:47 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE7HP-00034V-T7
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:28:04 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-5.tower-216.messagelabs.com!1318458479!768178!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23903 invoked from network); 12 Oct 2011 22:28:00 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-5.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 22:28:00 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 44A0A8A6A;
	Wed, 12 Oct 2011 15:27:58 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id D28462025F;
	Wed, 12 Oct 2011 15:27:56 -0700 (PDT)
Message-ID: <4E96146C.5070701@goop.org>
Date: Wed, 12 Oct 2011 15:27:56 -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: Borislav Petkov <bp@amd64.org>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
In-Reply-To: <20111012194543.GD14966@aftab>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 12:45 PM, Borislav Petkov wrote:
> On Wed, Oct 12, 2011 at 03:18:22PM -0400, Jeremy Fitzhardinge wrote:
>> While doing the whole boot time multiboot thing may offer some small
>> hypothetical technical advantages, it has the significant cost of just
>> complicating the whole deployment and use story.
> You simply can't call the need to apply ucode as early as possible a
> "hypothetical techical advantage."

The current scheme has worked pretty well so far; there doesn't seem to
be a huge concern about it.  Have there been actual observed failures
with the current mechanism, or is the drive to make it earlier driven by
an aesthetic desire to make it "as it should be"?

>  Other issues like how to handle ucode
> images and how to put them together and how distros distribute them
> and whether xen minimizes the amount of "specialness" or not are only
> secondary.

No, they're not.  If users end up with a broken setup then they get no
microcode updates at all, which makes everything else moot.  It has to
be deployed correctly for it to be worth anything at all.

What is secondary, or rather, completely irrelevant is whether Xen is
involved or not.

    J

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:30:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:30:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE7JX-0003gl-Kr; Wed, 12 Oct 2011 15:30:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE7J1-0003Tp-02
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:29:43 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1318458578!17043964!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17410 invoked from network); 12 Oct 2011 22:29:39 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-7.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 22:29:39 -0000
Received: from hanvin-mobl6.amr.corp.intel.com (jfdmzpr03-ext.jf.intel.com
	[134.134.139.72]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9CMT47m001471
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 15:29:04 -0700
Message-ID: <4E9614AE.1060508@zytor.com>
Date: Wed, 12 Oct 2011 15:29:02 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab> <4E96146C.5070701@goop.org>
In-Reply-To: <4E96146C.5070701@goop.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	the arch/x86 maintainers <x86@kernel.org>, Borislav Petkov <bp@amd64.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 03:27 PM, Jeremy Fitzhardinge wrote:
>
> The current scheme has worked pretty well so far; there doesn't seem to
> be a huge concern about it.  Have there been actual observed failures
> with the current mechanism, or is the drive to make it earlier driven by
> an aesthetic desire to make it "as it should be"?
>

Yes, there has.  There is at least one case where we have to print an 
error message saying "update your BIOS" because our current microcode 
update is too late.

	-hpa

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:34:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:34:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE7NI-00047O-10; Wed, 12 Oct 2011 15:34:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE7Mm-0003ua-72
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:33:36 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-12.tower-174.messagelabs.com!1318458811!35030407!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16855 invoked from network); 12 Oct 2011 22:33:33 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 12 Oct 2011 22:33:33 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id B882C8A6D;
	Wed, 12 Oct 2011 15:33:30 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id DE7B22025F;
	Wed, 12 Oct 2011 15:33:28 -0700 (PDT)
Message-ID: <4E9615B8.6010507@goop.org>
Date: Wed, 12 Oct 2011 15:33:28 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab> <4E96146C.5070701@goop.org>
	<4E9614AE.1060508@zytor.com>
In-Reply-To: <4E9614AE.1060508@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	the arch/x86 maintainers <x86@kernel.org>, Borislav Petkov <bp@amd64.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 03:29 PM, H. Peter Anvin wrote:
> On 10/12/2011 03:27 PM, Jeremy Fitzhardinge wrote:
>>
>> The current scheme has worked pretty well so far; there doesn't seem to
>> be a huge concern about it.  Have there been actual observed failures
>> with the current mechanism, or is the drive to make it earlier driven by
>> an aesthetic desire to make it "as it should be"?
>>
>
> Yes, there has.  There is at least one case where we have to print an
> error message saying "update your BIOS" because our current microcode
> update is too late.

Is that K8 errata 93 or something else?

    J

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:35:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:35:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE7OI-0004Uy-Cz; Wed, 12 Oct 2011 15:35:10 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE7NU-0004Bj-3R
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:34:20 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-4.tower-27.messagelabs.com!1318458834!44232122!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30051 invoked from network); 12 Oct 2011 22:33:55 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-4.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 22:33:55 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 024008A6D;
	Wed, 12 Oct 2011 15:34:15 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 8EA092025F;
	Wed, 12 Oct 2011 15:34:13 -0700 (PDT)
Message-ID: <4E9615E5.9050208@goop.org>
Date: Wed, 12 Oct 2011 15:34: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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<4E95F711.2090004@zytor.com>
In-Reply-To: <4E95F711.2090004@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	the arch/x86 maintainers <x86@kernel.org>, Borislav Petkov <bp@amd64.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 01:22 PM, H. Peter Anvin wrote:
> On 10/12/2011 12:18 PM, Jeremy Fitzhardinge wrote:
>> If there were a general shift to "this is how we're going to do
>> microcode in the future", then Xen will happily go along for the ride.
>
> It *is* how we want to do microcode in the future.  There is a
> prototype for the Intel hardware side here; we just haven't had time
> to finalize it partly because I got pulled onto the kernel.org situation.

OK, great!  Has there been any public discussion about this?

    J

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:36:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:36:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE7P7-0004sI-2C; Wed, 12 Oct 2011 15:36:01 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE7OT-0004Yf-96
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:35:21 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318458892!52949500!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21039 invoked from network); 12 Oct 2011 22:34:54 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-6.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 22:34:54 -0000
Received: from hanvin-mobl6.amr.corp.intel.com (fmdmzpr04-ext.fm.intel.com
	[192.55.55.39]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9CMYnDB001643
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 15:34:50 -0700
Message-ID: <4E961608.6060802@zytor.com>
Date: Wed, 12 Oct 2011 15:34:48 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab> <4E96146C.5070701@goop.org>
	<4E9614AE.1060508@zytor.com> <4E9615B8.6010507@goop.org>
In-Reply-To: <4E9615B8.6010507@goop.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	the arch/x86 maintainers <x86@kernel.org>, Borislav Petkov <bp@amd64.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 03:33 PM, Jeremy Fitzhardinge wrote:
>>
>> Yes, there has.  There is at least one case where we have to print an
>> error message saying "update your BIOS" because our current microcode
>> update is too late.
>
> Is that K8 errata 93 or something else?
>

The one I'm thinking about is an Atom erratum, but it's entirely 
possible there are others.

	-hpa



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:37:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:37:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE7Qo-0005JY-AC; Wed, 12 Oct 2011 15:37:46 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE7QM-000563-Gn
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:37:18 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318459033!19263706!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16922 invoked from network); 12 Oct 2011 22:37:15 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 22:37:15 -0000
Received: from hanvin-mobl6.amr.corp.intel.com (fmdmzpr04-ext.fm.intel.com
	[192.55.55.39]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9CMapli001711
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 15:36:51 -0700
Message-ID: <4E961682.8070903@zytor.com>
Date: Wed, 12 Oct 2011 15:36:50 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<4E95F711.2090004@zytor.com> <4E9615E5.9050208@goop.org>
In-Reply-To: <4E9615E5.9050208@goop.org>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	the arch/x86 maintainers <x86@kernel.org>, Borislav Petkov <bp@amd64.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 03:34 PM, Jeremy Fitzhardinge wrote:
>>
>> It *is* how we want to do microcode in the future.  There is a
>> prototype for the Intel hardware side here; we just haven't had time
>> to finalize it partly because I got pulled onto the kernel.org situation.
>
> OK, great!  Has there been any public discussion about this?
>

I don't remember.

	-hpa



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 15:50:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 15:50:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE7db-00067H-Jr; Wed, 12 Oct 2011 15:50:59 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE7cw-0005uw-J7
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:50:18 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318459814!767389!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8024 invoked from network); 12 Oct 2011 22:50:15 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-7.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 22:50:15 -0000
Received: from hanvin-mobl6.amr.corp.intel.com (jfdmzpr03-ext.jf.intel.com
	[134.134.139.72]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9CMnrT6002091
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 15:49:53 -0700
Message-ID: <4E96198F.4030906@zytor.com>
Date: Wed, 12 Oct 2011 15:49:51 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Borislav Petkov <bp@amd64.org>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
In-Reply-To: <20111012214013.GD28723@aftab>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.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>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 stickiest part of all of this is where to leave the microcode so the 
kernel can get to it way early.  We could use the linked list, but that 
would mean bootloader enabling; another idea was to stick it as a prefix 
to the initramfs identified by a signature.

	-hpa


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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 16:13:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 16:13:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE7zL-000700-Gf; Wed, 12 Oct 2011 16:13:28 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RE7xx-0006mO-5A
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 16:12:01 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-11.tower-216.messagelabs.com!1318461117!771362!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7387 invoked from network); 12 Oct 2011 23:11:58 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-11.tower-216.messagelabs.com with SMTP;
	12 Oct 2011 23:11:58 -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
	p9CNBtji022589; Wed, 12 Oct 2011 23:11:55 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 p9CNBs3M005630; 
	Wed, 12 Oct 2011 19:11:55 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: xen-devel@lists.xensource.com, Stefano.Stabellini@eu.citrix.com
Date: Wed, 12 Oct 2011 19:12:07 -0400
Message-Id: <1318461127-6684-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>
Subject: [Xen-devel] [PATCH] xl: Support backend domain ID for disks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Allow specification of backend domains for disks, either in the config
file or via block-attach

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 tools/libxl/libxlu_disk.c   |    3 ++-
 tools/libxl/libxlu_disk_i.h |    3 ++-
 tools/libxl/libxlu_disk_l.l |    8 ++++++++
 tools/libxl/libxlutil.h     |    2 +-
 tools/libxl/xl_cmdimpl.c    |    2 +-
 5 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/tools/libxl/libxlu_disk.c b/tools/libxl/libxlu_disk.c
index f8a1ba3..3342099 100644
--- a/tools/libxl/libxlu_disk.c
+++ b/tools/libxl/libxlu_disk.c
@@ -47,7 +47,7 @@ static void dpc_dispose(DiskParseContext *dpc) {
 
 int xlu_disk_parse(XLU_Config *cfg,
                    int nspecs, const char *const *specs,
-                   libxl_device_disk *disk) {
+                   libxl_device_disk *disk, libxl_ctx *ctx) {
     DiskParseContext dpc;
     int i, e;
 
@@ -55,6 +55,7 @@ int xlu_disk_parse(XLU_Config *cfg,
     dpc.cfg = cfg;
     dpc.scanner = 0;
     dpc.disk = disk;
+    dpc.ctx = ctx;
 
     disk->readwrite = 1;
 
diff --git a/tools/libxl/libxlu_disk_i.h b/tools/libxl/libxlu_disk_i.h
index 578920a..00988fa 100644
--- a/tools/libxl/libxlu_disk_i.h
+++ b/tools/libxl/libxlu_disk_i.h
@@ -2,7 +2,7 @@
 #define LIBXLU_DISK_I_H
 
 #include "libxlu_internal.h"
-
+#include "libxl_utils.h"
 
 typedef struct {
     XLU_Config *cfg;
@@ -12,6 +12,7 @@ typedef struct {
     libxl_device_disk *disk;
     int access_set, had_depr_prefix;
     const char *spec;
+    libxl_ctx *ctx;
 } DiskParseContext;
 
 void xlu__disk_err(DiskParseContext *dpc, const char *erroneous,
diff --git a/tools/libxl/libxlu_disk_l.l b/tools/libxl/libxlu_disk_l.l
index a3e7180..446ea65 100644
--- a/tools/libxl/libxlu_disk_l.l
+++ b/tools/libxl/libxlu_disk_l.l
@@ -108,6 +108,13 @@ static void setbackendtype(DiskParseContext *dpc, const char *str) {
     else xlu__disk_err(dpc,str,"unknown value for backendtype");
 }
 
+/* Sets ->backend_domid from the string. */
+static void setbackend(DiskParseContext *dpc, const char *str) {
+    if (libxl_name_to_domid(dpc->ctx, str, &dpc->disk->backend_domid)) {
+        xlu__disk_err(dpc,str,"unknown domain for backend");
+    }
+}
+
 #define DEPRECATE(usewhatinstead) /* not currently reported */
 
 %}
@@ -140,6 +147,7 @@ devtype=[^,]*,?	{ xlu__disk_err(DPC,yytext,"unknown value for type"); }
 
 access=[^,]*,?	{ STRIP(','); setaccess(DPC, FROMEQUALS); }
 backendtype=[^,]*,? { STRIP(','); setbackendtype(DPC,FROMEQUALS); }
+backend=[^,]*,? { STRIP(','); setbackend(DPC,FROMEQUALS); }
 
 vdev=[^,]*,?	{ STRIP(','); SAVESTRING("vdev", vdev, FROMEQUALS); }
 script=[^,]*,?	{ STRIP(','); SAVESTRING("script", script, FROMEQUALS); }
diff --git a/tools/libxl/libxlutil.h b/tools/libxl/libxlutil.h
index c20de1d..482c5a0 100644
--- a/tools/libxl/libxlutil.h
+++ b/tools/libxl/libxlutil.h
@@ -64,7 +64,7 @@ const char *xlu_cfg_get_listitem(const XLU_ConfigList*, int entry);
  */
 
 int xlu_disk_parse(XLU_Config *cfg, int nspecs, const char *const *specs,
-		   libxl_device_disk *disk);
+		   libxl_device_disk *disk, libxl_ctx *ctx);
   /* disk must have been initialised.
    *
    * On error, returns errno value.  Bad strings cause EINVAL and
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 99e3c49..d2749da 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -501,7 +501,7 @@ static void parse_disk_config_multistring(XLU_Config **config,
 	if (!*config) { perror("xlu_cfg_init"); exit(-1); }
     }
 
-    e = xlu_disk_parse(*config, nspecs, specs, disk);
+    e = xlu_disk_parse(*config, nspecs, specs, disk, ctx);
     if (e == EINVAL) exit(-1);
     if (e) {
 	fprintf(stderr,"xlu_disk_parse failed: %s\n",strerror(errno));
-- 
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 Oct 12 16:41:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 16:41:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE8Qr-0007qv-6d; Wed, 12 Oct 2011 16:41:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8Py-0007dr-Fc
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 16:40:58 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-216.messagelabs.com!1318462853!779606!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5249 invoked from network); 12 Oct 2011 23:40:55 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 23:40:55 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id ADCB68E77;
	Wed, 12 Oct 2011 16:40:52 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 038BD20258;
	Wed, 12 Oct 2011 16:40:49 -0700 (PDT)
Message-ID: <4E962581.2000605@goop.org>
Date: Wed, 12 Oct 2011 16:40:49 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E96198F.4030906@zytor.com>
In-Reply-To: <4E96198F.4030906@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>, Xen Devel <xen-devel@lists.xensource.com>,
	Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 03:49 PM, H. Peter Anvin wrote:
> The stickiest part of all of this is where to leave the microcode so
> the kernel can get to it way early.  We could use the linked list, but
> that would mean bootloader enabling; another idea was to stick it as a
> prefix to the initramfs identified by a signature.

I think it would be easiest for the multiboot case if it were a separate
file, but I don't feel I'm really up on all the details.

    J

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 16:56:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 16:56:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE8ez-0000j9-IF; Wed, 12 Oct 2011 16:56:29 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8e3-0000SV-5b
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 16:55:32 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318463711!44001460!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8311 invoked from network); 12 Oct 2011 23:55:13 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 12 Oct 2011 23:55:13 -0000
Received: from hanvin-mobl6.amr.corp.intel.com (fmdmzpr01-ext.fm.intel.com
	[192.55.54.36]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9CNt2UB003407
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 16:55:02 -0700
Message-ID: <4E9628D4.1000605@zytor.com>
Date: Wed, 12 Oct 2011 16:55:00 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E96198F.4030906@zytor.com> <4E962581.2000605@goop.org>
In-Reply-To: <4E962581.2000605@goop.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>, Xen Devel <xen-devel@lists.xensource.com>,
	Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 04:40 PM, Jeremy Fitzhardinge wrote:
> On 10/12/2011 03:49 PM, H. Peter Anvin wrote:
>> The stickiest part of all of this is where to leave the microcode so
>> the kernel can get to it way early.  We could use the linked list, but
>> that would mean bootloader enabling; another idea was to stick it as a
>> prefix to the initramfs identified by a signature.
>
> I think it would be easiest for the multiboot case if it were a separate
> file, but I don't feel I'm really up on all the details.

For the multiboot case, yes of course.

Some bootloaders allow initramfs to be concatenated from multiple files; 
unfortunately I'm not sure if Grub ever grew that capability.  Sigh.

	-hpa



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 17:04:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:04:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE8mZ-0001Ef-S0; Wed, 12 Oct 2011 17:04:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8jF-0000yt-4m
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:01:01 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-15.tower-216.messagelabs.com!1318464048!774387!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30219 invoked from network); 13 Oct 2011 00:00:49 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-15.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 00:00:49 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id B4BDD8ED4;
	Wed, 12 Oct 2011 17:00:46 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 978A920258;
	Wed, 12 Oct 2011 17:00:39 -0700 (PDT)
Message-ID: <4E962A27.4090509@goop.org>
Date: Wed, 12 Oct 2011 17:00:39 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E96198F.4030906@zytor.com> <4E962581.2000605@goop.org>
	<4E9628D4.1000605@zytor.com>
In-Reply-To: <4E9628D4.1000605@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>, Xen Devel <xen-devel@lists.xensource.com>,
	Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 04:55 PM, H. Peter Anvin wrote:
> On 10/12/2011 04:40 PM, Jeremy Fitzhardinge wrote:
>> On 10/12/2011 03:49 PM, H. Peter Anvin wrote:
>>> The stickiest part of all of this is where to leave the microcode so
>>> the kernel can get to it way early.  We could use the linked list, but
>>> that would mean bootloader enabling; another idea was to stick it as a
>>> prefix to the initramfs identified by a signature.
>>
>> I think it would be easiest for the multiboot case if it were a separate
>> file, but I don't feel I'm really up on all the details.
>
> For the multiboot case, yes of course.
>
> Some bootloaders allow initramfs to be concatenated from multiple
> files; unfortunately I'm not sure if Grub ever grew that capability. 
> Sigh.

Presumably we'd want some way to make all possible microcode files
available to the hypervisor/kernel so that there's no need to construct
the bootloader config for a specific CPU vendor (or worse, CPU model). 
So that would need either some way of specifying multiple files, or a
wrapper which can contain multiple files?

    J


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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 17:07:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:07:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE8p9-0001dP-Tm; Wed, 12 Oct 2011 17:06:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8mh-0001FA-S7
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:04:29 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1318464262!21903458!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12197 invoked from network); 13 Oct 2011 00:04:24 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-14.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 00:04:24 -0000
Received: from hanvin-mobl6.amr.corp.intel.com ([192.55.55.41])
	(authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9D03ppx003618
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Wed, 12 Oct 2011 17:03:52 -0700
Message-ID: <4E962AE6.1060505@zytor.com>
Date: Wed, 12 Oct 2011 17:03:50 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E96198F.4030906@zytor.com> <4E962581.2000605@goop.org>
	<4E9628D4.1000605@zytor.com> <4E962A27.4090509@goop.org>
In-Reply-To: <4E962A27.4090509@goop.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>, Xen Devel <xen-devel@lists.xensource.com>,
	Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 05:00 PM, Jeremy Fitzhardinge wrote:
>
> Presumably we'd want some way to make all possible microcode files
> available to the hypervisor/kernel so that there's no need to construct
> the bootloader config for a specific CPU vendor (or worse, CPU model).
> So that would need either some way of specifying multiple files, or a
> wrapper which can contain multiple files?
>

I have been thinking a "bundle" format with a per-vendor header followed 
by the microcode in the appropriate format for each vendor.

	-hpa



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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 17:09:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:09:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE8re-00023U-78; Wed, 12 Oct 2011 17:09:34 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8qw-0001q4-2y
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:08:50 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318464525!763457!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17733 invoked from network); 13 Oct 2011 00:08:47 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:08:47 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 8293F8ED4;
	Wed, 12 Oct 2011 17:08:43 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id C637320FCF; Wed, 12 Oct 2011 17:08:41 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 12 Oct 2011 17:08:31 -0700
Message-Id: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V4 00/10] jump-label: allow early
	jump_label_enable()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

[ Change from V3: Move jump_label_init() much earlier, so that the
  jump_label mechanism will be reliabily initialized before use. ]

While trying to use the jump-label stuff for my PV ticketlock changes,
I had some problems using jump labels early in the kernel's lifetime
(pre-SMP).

The basic problem is that even if I enable a jump_label_key, the
jump_label_init() initializer ends up nopping out all the code sites.

This series enables early use of jump labels by making
jump_label_init() respect already-enabled keys.

To do this, I've dropped arch_jump_label_poke_text_early() and
replaced it with arch_jump_label_transform(), allowing it to either
insert an optimal nop, or leave the jump in place.

Part of this series makes sure that stop_machine() is safe to call
in an early pre-SMP environment, by making it just call the function
with interrupts disabled.

git://github.com/jsgf/linux-xen upstream/jump-label-noearly

Jeremy Fitzhardinge (10):
  jump_label: use proper atomic_t initializer
  stop_machine: make stop_machine safe and efficient to call early
  jump_label: if a key has already been initialized, don't nop it out
  x86/jump_label: drop arch_jump_label_text_poke_early()
  sparc/jump_label: drop arch_jump_label_text_poke_early()
  jump_label: add arch_jump_label_transform_static() to optimise
    non-live code updates
  s390/jump-label: add arch_jump_label_transform_static()
  x86/jump_label: add arch_jump_label_transform_static()
  x86/jump_label: use GENERIC_NOP5_ATOMIC instead of jmp5 +0
  jump-label: initialize jump-label subsystem much earlier

 arch/s390/kernel/jump_label.c     |   51 ++++++++++++++++++++++--------------
 arch/sparc/kernel/jump_label.c    |    8 ------
 arch/x86/include/asm/jump_label.h |    3 +-
 arch/x86/kernel/jump_label.c      |   20 ++++++++++----
 include/linux/jump_label.h        |   23 ++++++++++------
 init/main.c                       |    1 +
 kernel/jump_label.c               |   37 +++++++++++++++-----------
 kernel/stop_machine.c             |   22 ++++++++++++++++
 8 files changed, 105 insertions(+), 60 deletions(-)

-- 
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 Oct 12 17:10:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17: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 1RE8st-0002Qj-6S; Wed, 12 Oct 2011 17:10:51 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8r2-0001qx-6P
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:08:57 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318464503!41650239!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25435 invoked from network); 13 Oct 2011 00:08:25 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:08:25 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 1BAB78F0E;
	Wed, 12 Oct 2011 17:08:46 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 3CD6E21114; Wed, 12 Oct 2011 17:08:43 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 12 Oct 2011 17:08:34 -0700
Message-Id: <1c95e9f57ce8a5c07f096abffa1ac215b9c47370.1318464413.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V4 03/10] jump_label: if a key has already
	been initialized, don't nop it out
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

If a key has been enabled before jump_label_init() is called, don't
nop it out.

This removes arch_jump_label_text_poke_early() (which can only nop
out a site) and uses arch_jump_label_transform() instead.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by: Jason Baron <jbaron@redhat.com>
---
 include/linux/jump_label.h |    3 +--
 kernel/jump_label.c        |   20 ++++++++------------
 2 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 1213e9d..12e804e 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -44,8 +44,7 @@ extern struct jump_entry __stop___jump_table[];
 extern void jump_label_lock(void);
 extern void jump_label_unlock(void);
 extern void arch_jump_label_transform(struct jump_entry *entry,
-				 enum jump_label_type type);
-extern void arch_jump_label_text_poke_early(jump_label_t addr);
+				      enum jump_label_type type);
 extern int jump_label_text_reserved(void *start, void *end);
 extern void jump_label_inc(struct jump_label_key *key);
 extern void jump_label_dec(struct jump_label_key *key);
diff --git a/kernel/jump_label.c b/kernel/jump_label.c
index a8ce450..059202d5 100644
--- a/kernel/jump_label.c
+++ b/kernel/jump_label.c
@@ -121,13 +121,6 @@ static void __jump_label_update(struct jump_label_key *key,
 	}
 }
 
-/*
- * Not all archs need this.
- */
-void __weak arch_jump_label_text_poke_early(jump_label_t addr)
-{
-}
-
 static __init int jump_label_init(void)
 {
 	struct jump_entry *iter_start = __start___jump_table;
@@ -139,12 +132,15 @@ static __init int jump_label_init(void)
 	jump_label_sort_entries(iter_start, iter_stop);
 
 	for (iter = iter_start; iter < iter_stop; iter++) {
-		arch_jump_label_text_poke_early(iter->code);
-		if (iter->key == (jump_label_t)(unsigned long)key)
+		struct jump_label_key *iterk;
+
+		iterk = (struct jump_label_key *)(unsigned long)iter->key;
+		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
+					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
+		if (iterk == key)
 			continue;
 
-		key = (struct jump_label_key *)(unsigned long)iter->key;
-		atomic_set(&key->enabled, 0);
+		key = iterk;
 		key->entries = iter;
 #ifdef CONFIG_MODULES
 		key->next = NULL;
@@ -212,7 +208,7 @@ void jump_label_apply_nops(struct module *mod)
 		return;
 
 	for (iter = iter_start; iter < iter_stop; iter++)
-		arch_jump_label_text_poke_early(iter->code);
+		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
 }
 
 static int jump_label_add_module(struct module *mod)
-- 
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 Oct 12 17:11:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:11:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE8to-0002o4-0o; Wed, 12 Oct 2011 17:11:48 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8r1-0001qh-VZ
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:08:57 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318464517!44002246!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27217 invoked from network); 13 Oct 2011 00:08:38 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:08:38 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 4C8648F12;
	Wed, 12 Oct 2011 17:08:47 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 3371420FD4; Wed, 12 Oct 2011 17:08:43 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 12 Oct 2011 17:08:32 -0700
Message-Id: <133adee3846e281d68cb7c2a03294af2e6fb73c6.1318464413.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V4 01/10] jump_label: use proper atomic_t
	initializer
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

ATOMIC_INIT() is the proper thing to use.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by: Jason Baron <jbaron@redhat.com>
---
 include/linux/jump_label.h |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 66f23dc..1213e9d 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -28,9 +28,9 @@ struct module;
 #ifdef HAVE_JUMP_LABEL
 
 #ifdef CONFIG_MODULES
-#define JUMP_LABEL_INIT {{ 0 }, NULL, NULL}
+#define JUMP_LABEL_INIT {ATOMIC_INIT(0), NULL, NULL}
 #else
-#define JUMP_LABEL_INIT {{ 0 }, NULL}
+#define JUMP_LABEL_INIT {ATOMIC_INIT(0), NULL}
 #endif
 
 static __always_inline bool static_branch(struct jump_label_key *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 Wed Oct 12 17:13:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:13:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE8vE-0003Hu-V0; Wed, 12 Oct 2011 17:13:16 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8r5-0001rz-R3
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:09:00 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318464535!773504!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11810 invoked from network); 13 Oct 2011 00:08:56 -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; 13 Oct 2011 00:08:56 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 0FCE28F18;
	Wed, 12 Oct 2011 17:08:47 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 411A921116; Wed, 12 Oct 2011 17:08:43 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 12 Oct 2011 17:08:35 -0700
Message-Id: <07d7a349087d253549be9946d6fe8e3219492cda.1318464413.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V4 04/10] x86/jump_label: drop
	arch_jump_label_text_poke_early()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

It is no longer used.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by: Jason Baron <jbaron@redhat.com>
---
 arch/x86/kernel/jump_label.c |    6 ------
 1 files changed, 0 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
index 3fee346..2ad0298 100644
--- a/arch/x86/kernel/jump_label.c
+++ b/arch/x86/kernel/jump_label.c
@@ -42,10 +42,4 @@ void arch_jump_label_transform(struct jump_entry *entry,
 	put_online_cpus();
 }
 
-void arch_jump_label_text_poke_early(jump_label_t addr)
-{
-	text_poke_early((void *)addr, ideal_nops[NOP_ATOMIC5],
-			JUMP_LABEL_NOP_SIZE);
-}
-
 #endif
-- 
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 Oct 12 17:14:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17: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 1RE8wB-0003f5-PY; Wed, 12 Oct 2011 17:14:15 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8r5-0001rs-MS
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:09:00 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-16.tower-216.messagelabs.com!1318464534!771660!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25299 invoked from network); 13 Oct 2011 00:08:56 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-16.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 00:08:56 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id E2BF18F10;
	Wed, 12 Oct 2011 17:08:46 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 38C3221112; Wed, 12 Oct 2011 17:08:43 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 12 Oct 2011 17:08:33 -0700
Message-Id: <838519059293cb6340bdea9b1bae4d866e2a4c65.1318464413.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V4 02/10] stop_machine: make stop_machine
	safe and efficient to call early
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Make stop_machine() safe to call early in boot, before stop_machine()
has been set up, by simply calling the callback function directly if
there's only one CPU online.

[ Fixes from AKPM:
   - add comment
   - local_irq_flags, not save_flags
   - also call hard_irq_disable() for systems which need it

  Tejun suggested using an explicit flag rather than just looking at
  the online cpu count. ]

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by: Tejun Heo <tj@kernel.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: H. Peter Anvin <hpa@linux.intel.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
---
 kernel/stop_machine.c |   22 ++++++++++++++++++++++
 1 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/kernel/stop_machine.c b/kernel/stop_machine.c
index ba5070c..d3f960a 100644
--- a/kernel/stop_machine.c
+++ b/kernel/stop_machine.c
@@ -41,6 +41,7 @@ struct cpu_stopper {
 };
 
 static DEFINE_PER_CPU(struct cpu_stopper, cpu_stopper);
+static bool stop_machine_initialized = false;
 
 static void cpu_stop_init_done(struct cpu_stop_done *done, unsigned int nr_todo)
 {
@@ -386,6 +387,8 @@ static int __init cpu_stop_init(void)
 	cpu_stop_cpu_callback(&cpu_stop_cpu_notifier, CPU_ONLINE, bcpu);
 	register_cpu_notifier(&cpu_stop_cpu_notifier);
 
+	stop_machine_initialized = true;
+
 	return 0;
 }
 early_initcall(cpu_stop_init);
@@ -485,6 +488,25 @@ int __stop_machine(int (*fn)(void *), void *data, const struct cpumask *cpus)
 					    .num_threads = num_online_cpus(),
 					    .active_cpus = cpus };
 
+	if (!stop_machine_initialized) {
+		/*
+		 * Handle the case where stop_machine() is called
+		 * early in boot before stop_machine() has been
+		 * initialized.
+		 */
+ 		unsigned long flags;
+		int ret;
+
+		WARN_ON_ONCE(smdata.num_threads != 1);
+
+		local_irq_save(flags);
+		hard_irq_disable();
+		ret = (*fn)(data);
+		local_irq_restore(flags);
+
+		return ret;
+	}
+
 	/* Set the initial state and stop all online cpus. */
 	set_state(&smdata, STOPMACHINE_PREPARE);
 	return stop_cpus(cpu_online_mask, stop_machine_cpu_stop, &smdata);
-- 
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 Oct 12 17:15:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:15:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE8x1-00042P-RJ; Wed, 12 Oct 2011 17:15:07 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8r7-0001sZ-4G
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:09:02 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318464536!779401!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32581 invoked from network); 13 Oct 2011 00:08:58 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:08:58 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id AA28E8F16;
	Wed, 12 Oct 2011 17:08:47 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 46AEC21157; Wed, 12 Oct 2011 17:08:43 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 12 Oct 2011 17:08:36 -0700
Message-Id: <d01b6d0db1cd0e25797065982e06a38f5d6caf7f.1318464413.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V4 05/10] sparc/jump_label: drop
	arch_jump_label_text_poke_early()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

It is no longer used.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by: Jason Baron <jbaron@redhat.com>
Cc: David Miller <davem@davemloft.net>
---
 arch/sparc/kernel/jump_label.c |    8 --------
 1 files changed, 0 insertions(+), 8 deletions(-)

diff --git a/arch/sparc/kernel/jump_label.c b/arch/sparc/kernel/jump_label.c
index ea2dafc..971fd43 100644
--- a/arch/sparc/kernel/jump_label.c
+++ b/arch/sparc/kernel/jump_label.c
@@ -36,12 +36,4 @@ void arch_jump_label_transform(struct jump_entry *entry,
 	put_online_cpus();
 }
 
-void arch_jump_label_text_poke_early(jump_label_t addr)
-{
-	u32 *insn_p = (u32 *) (unsigned long) addr;
-
-	*insn_p = 0x01000000;
-	flushi(insn_p);
-}
-
 #endif
-- 
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 Oct 12 17:15:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:15:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE8xm-0004PC-Mk; Wed, 12 Oct 2011 17:15:54 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8r8-0001sj-1C
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:09:02 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318464526!41400472!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4077 invoked from network); 13 Oct 2011 00:08:48 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:08:48 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 57A068F1A;
	Wed, 12 Oct 2011 17:08:47 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 4C72621159; Wed, 12 Oct 2011 17:08:43 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 12 Oct 2011 17:08:37 -0700
Message-Id: <16f652166605c973e9817177b6ba6a081e3e5b3f.1318464413.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V4 06/10] jump_label: add
	arch_jump_label_transform_static() to optimise non-live code updates
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

When updating a newly loaded module, the code is definitely not yet
executing on any processor, so it can be updated with no need for any
heavyweight synchronization.

This patch adds arch_jump_label_static() which is implemented as
arch_jump_label_transform() by default, but architectures can override
it if it avoids, say, a call to stop_machine().

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by: Jason Baron <jbaron@redhat.com>
---
 include/linux/jump_label.h |    2 ++
 kernel/jump_label.c        |   18 +++++++++++++++---
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 12e804e..56594e4 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -45,6 +45,8 @@ extern void jump_label_lock(void);
 extern void jump_label_unlock(void);
 extern void arch_jump_label_transform(struct jump_entry *entry,
 				      enum jump_label_type type);
+extern void arch_jump_label_transform_static(struct jump_entry *entry,
+					     enum jump_label_type type);
 extern int jump_label_text_reserved(void *start, void *end);
 extern void jump_label_inc(struct jump_label_key *key);
 extern void jump_label_dec(struct jump_label_key *key);
diff --git a/kernel/jump_label.c b/kernel/jump_label.c
index 059202d5..ff2028f 100644
--- a/kernel/jump_label.c
+++ b/kernel/jump_label.c
@@ -104,6 +104,18 @@ static int __jump_label_text_reserved(struct jump_entry *iter_start,
 	return 0;
 }
 
+/* 
+ * Update code which is definitely not currently executing.
+ * Architectures which need heavyweight synchronization to modify
+ * running code can override this to make the non-live update case
+ * cheaper.
+ */
+void __weak arch_jump_label_transform_static(struct jump_entry *entry,
+					    enum jump_label_type type)
+{
+	arch_jump_label_transform(entry, type);	
+}
+
 static void __jump_label_update(struct jump_label_key *key,
 				struct jump_entry *entry,
 				struct jump_entry *stop, int enable)
@@ -135,8 +147,8 @@ static __init int jump_label_init(void)
 		struct jump_label_key *iterk;
 
 		iterk = (struct jump_label_key *)(unsigned long)iter->key;
-		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
-					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
+		arch_jump_label_transform_static(iter, jump_label_enabled(iterk) ?
+						 JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
 		if (iterk == key)
 			continue;
 
@@ -208,7 +220,7 @@ void jump_label_apply_nops(struct module *mod)
 		return;
 
 	for (iter = iter_start; iter < iter_stop; iter++)
-		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
+		arch_jump_label_transform_static(iter, JUMP_LABEL_DISABLE);
 }
 
 static int jump_label_add_module(struct module *mod)
-- 
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 Oct 12 17:16:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:16:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE8yX-0004mF-AY; Wed, 12 Oct 2011 17:16:41 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8r7-0001si-VY
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:09:02 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-15.tower-216.messagelabs.com!1318464537!774936!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5223 invoked from network); 13 Oct 2011 00:08:58 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-15.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 00:08:58 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 4F5338F22;
	Wed, 12 Oct 2011 17:08:50 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 512042115B; Wed, 12 Oct 2011 17:08:43 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 12 Oct 2011 17:08:38 -0700
Message-Id: <ff5332d27906a8f0e58f39211884a245bedaf93c.1318464413.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V4 07/10] s390/jump-label: add
	arch_jump_label_transform_static()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

This allows jump-label entries to be cheaply updated on code which is
not yet live.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by: Jason Baron <jbaron@redhat.com>
Cc: Jan Glauber <jang@linux.vnet.ibm.com>
---
 arch/s390/kernel/jump_label.c |   51 +++++++++++++++++++++++++----------------
 1 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/arch/s390/kernel/jump_label.c b/arch/s390/kernel/jump_label.c
index 44cc06b..b987ab2 100644
--- a/arch/s390/kernel/jump_label.c
+++ b/arch/s390/kernel/jump_label.c
@@ -18,26 +18,15 @@ struct insn {
 } __packed;
 
 struct insn_args {
-	unsigned long *target;
-	struct insn *insn;
-	ssize_t size;
+	struct jump_entry *entry;
+	enum jump_label_type type;
 };
 
-static int __arch_jump_label_transform(void *data)
+static void __jump_label_transform(struct jump_entry *entry,
+				   enum jump_label_type type)
 {
-	struct insn_args *args = data;
-	int rc;
-
-	rc = probe_kernel_write(args->target, args->insn, args->size);
-	WARN_ON_ONCE(rc < 0);
-	return 0;
-}
-
-void arch_jump_label_transform(struct jump_entry *entry,
-			       enum jump_label_type type)
-{
-	struct insn_args args;
 	struct insn insn;
+	int rc;
 
 	if (type == JUMP_LABEL_ENABLE) {
 		/* brcl 15,offset */
@@ -49,11 +38,33 @@ void arch_jump_label_transform(struct jump_entry *entry,
 		insn.offset = 0;
 	}
 
-	args.target = (void *) entry->code;
-	args.insn = &insn;
-	args.size = JUMP_LABEL_NOP_SIZE;
+	rc = probe_kernel_write((void *)entry->code, &insn, JUMP_LABEL_NOP_SIZE);
+	WARN_ON_ONCE(rc < 0);
+}
 
-	stop_machine(__arch_jump_label_transform, &args, NULL);
+static int __sm_arch_jump_label_transform(void *data)
+{
+	struct insn_args *args = data;
+
+	__jump_label_transform(args->entry, args->type);
+	return 0;
+}
+
+void arch_jump_label_transform(struct jump_entry *entry,
+			       enum jump_label_type type)
+{
+	struct insn_args args;
+
+	args.entry = entry;
+	args.type = type;
+
+	stop_machine(__sm_arch_jump_label_transform, &args, NULL);
+}
+
+void arch_jump_label_transform_static(struct jump_entry *entry,
+				      enum jump_label_type type)
+{
+	__jump_label_transform(entry, type);
 }
 
 #endif
-- 
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 Oct 12 17:17:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17: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 1RE8zH-00059d-01; Wed, 12 Oct 2011 17:17:27 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8rA-0001t8-H8
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:09:04 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318464512!52580920!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20306 invoked from network); 13 Oct 2011 00:08:33 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:08:33 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 4F3AC8F1E;
	Wed, 12 Oct 2011 17:08:50 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 592232115C; Wed, 12 Oct 2011 17:08:43 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 12 Oct 2011 17:08:39 -0700
Message-Id: <d438943704881d46c8f73318d2b1705a5e2809d7.1318464413.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V4 08/10] x86/jump_label: add
	arch_jump_label_transform_static()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

This allows jump-label entries to be cheaply updated on code which is
not yet live.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Acked-by: Jason Baron <jbaron@redhat.com>
---
 arch/x86/kernel/jump_label.c |   20 +++++++++++++++++---
 1 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
index 2ad0298..ea9d5f2f 100644
--- a/arch/x86/kernel/jump_label.c
+++ b/arch/x86/kernel/jump_label.c
@@ -24,8 +24,9 @@ union jump_code_union {
 	} __attribute__((packed));
 };
 
-void arch_jump_label_transform(struct jump_entry *entry,
-			       enum jump_label_type type)
+static void __jump_label_transform(struct jump_entry *entry,
+				   enum jump_label_type type,
+				   void *(*poker)(void *, const void *, size_t))
 {
 	union jump_code_union code;
 
@@ -35,11 +36,24 @@ void arch_jump_label_transform(struct jump_entry *entry,
 				(entry->code + JUMP_LABEL_NOP_SIZE);
 	} else
 		memcpy(&code, ideal_nops[NOP_ATOMIC5], JUMP_LABEL_NOP_SIZE);
+
+	(*poker)((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
+}
+
+void arch_jump_label_transform(struct jump_entry *entry,
+			       enum jump_label_type type)
+{
 	get_online_cpus();
 	mutex_lock(&text_mutex);
-	text_poke_smp((void *)entry->code, &code, JUMP_LABEL_NOP_SIZE);
+	__jump_label_transform(entry, type, text_poke_smp);
 	mutex_unlock(&text_mutex);
 	put_online_cpus();
 }
 
+void arch_jump_label_transform_static(struct jump_entry *entry,
+				      enum jump_label_type type)
+{
+	__jump_label_transform(entry, type, text_poke_early);
+}
+
 #endif
-- 
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 Oct 12 17:18:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:18:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE8zx-0005X1-QR; Wed, 12 Oct 2011 17:18:09 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8rB-0001tJ-65
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:09:05 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-15.tower-27.messagelabs.com!1318464529!50769995!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14211 invoked from network); 13 Oct 2011 00:08:51 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-15.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:08:51 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 422D28F24;
	Wed, 12 Oct 2011 17:08:51 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 63F8C21160; Wed, 12 Oct 2011 17:08:43 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 12 Oct 2011 17:08:41 -0700
Message-Id: <c133180533d7e520bb1e818e987117811a666fbc.1318464413.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V4 10/10] jump-label: initialize jump-label
	subsystem much 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

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Initialize jump_labels much earlier, we can use them.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 include/linux/jump_label.h |   14 +++++++++-----
 init/main.c                |    1 +
 kernel/jump_label.c        |    5 +----
 3 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 56594e4..388b0d4 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -16,7 +16,7 @@ struct jump_label_key {
 
 # include <asm/jump_label.h>
 # define HAVE_JUMP_LABEL
-#endif
+#endif	/* CC_HAVE_ASM_GOTO && CONFIG_JUMP_LABEL */
 
 enum jump_label_type {
 	JUMP_LABEL_DISABLE = 0,
@@ -41,6 +41,7 @@ static __always_inline bool static_branch(struct jump_label_key *key)
 extern struct jump_entry __start___jump_table[];
 extern struct jump_entry __stop___jump_table[];
 
+extern void jump_label_init(void);
 extern void jump_label_lock(void);
 extern void jump_label_unlock(void);
 extern void arch_jump_label_transform(struct jump_entry *entry,
@@ -53,7 +54,7 @@ extern void jump_label_dec(struct jump_label_key *key);
 extern bool jump_label_enabled(struct jump_label_key *key);
 extern void jump_label_apply_nops(struct module *mod);
 
-#else
+#else  /* !HAVE_JUMP_LABEL */
 
 #include <linux/atomic.h>
 
@@ -63,6 +64,10 @@ struct jump_label_key {
 	atomic_t enabled;
 };
 
+static __always_inline void jump_label_init(void)
+{
+}
+
 static __always_inline bool static_branch(struct jump_label_key *key)
 {
 	if (unlikely(atomic_read(&key->enabled)))
@@ -97,7 +102,6 @@ static inline int jump_label_apply_nops(struct module *mod)
 {
 	return 0;
 }
+#endif	/* HAVE_JUMP_LABEL */
 
-#endif
-
-#endif
+#endif	/* _LINUX_JUMP_LABEL_H */
diff --git a/init/main.c b/init/main.c
index 2a9b88a..f4094ed 100644
--- a/init/main.c
+++ b/init/main.c
@@ -637,6 +637,7 @@ asmlinkage void __init start_kernel(void)
 	acpi_early_init(); /* before LAPIC and SMP init */
 	sfi_init_late();
 
+	jump_label_init();
 	ftrace_init();
 
 	/* Do the rest non-__init'ed, we're now alive */
diff --git a/kernel/jump_label.c b/kernel/jump_label.c
index ff2028f..bbdfe2a 100644
--- a/kernel/jump_label.c
+++ b/kernel/jump_label.c
@@ -133,7 +133,7 @@ static void __jump_label_update(struct jump_label_key *key,
 	}
 }
 
-static __init int jump_label_init(void)
+void __init jump_label_init(void)
 {
 	struct jump_entry *iter_start = __start___jump_table;
 	struct jump_entry *iter_stop = __stop___jump_table;
@@ -159,10 +159,7 @@ static __init int jump_label_init(void)
 #endif
 	}
 	jump_label_unlock();
-
-	return 0;
 }
-early_initcall(jump_label_init);
 
 #ifdef CONFIG_MODULES
 
-- 
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 Oct 12 17:18:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:18:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE90g-0005td-4q; Wed, 12 Oct 2011 17:18:54 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE8rB-0001tK-7G
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:09:05 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-12.tower-182.messagelabs.com!1318464540!21911410!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10946 invoked from network); 13 Oct 2011 00:09:02 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 00:09:02 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 4F4488F20;
	Wed, 12 Oct 2011 17:08:50 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 5E0442115E; Wed, 12 Oct 2011 17:08:43 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Steven Rostedt <rostedt@goodmis.org>
Date: Wed, 12 Oct 2011 17:08:40 -0700
Message-Id: <34ede5db1571d541a5c3fc49923bb353a37dd431.1318464413.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464413.git.jeremy.fitzhardinge@citrix.com>
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] [PATCH RFC V4 09/10] x86/jump_label: use
	GENERIC_NOP5_ATOMIC instead of jmp5 +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

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

GENERIC_NOP5_ATOMIC should make a better nop.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/include/asm/jump_label.h |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h
index a32b18c..189100e 100644
--- a/arch/x86/include/asm/jump_label.h
+++ b/arch/x86/include/asm/jump_label.h
@@ -4,12 +4,13 @@
 #ifdef __KERNEL__
 
 #include <linux/types.h>
+#include <linux/stringify.h>
 #include <asm/nops.h>
 #include <asm/asm.h>
 
 #define JUMP_LABEL_NOP_SIZE 5
 
-#define JUMP_LABEL_INITIAL_NOP ".byte 0xe9 \n\t .long 0\n\t"
+#define JUMP_LABEL_INITIAL_NOP ".byte " __stringify(GENERIC_NOP5_ATOMIC) "\n\t"
 
 static __always_inline bool arch_static_branch(struct jump_label_key *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 Wed Oct 12 17:39:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:39:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE9KV-0006nl-OW; Wed, 12 Oct 2011 17:39:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Jl-0006ag-Bs
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:38:37 -0700
X-Env-Sender: samuel.thibault@ens-lyon.org
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318466303!41402128!1
X-Originating-IP: [80.67.169.19]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4003 invoked from network); 13 Oct 2011 00:38:23 -0000
Received: from solo.fdn.fr (HELO solo.fdn.fr) (80.67.169.19)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:38:23 -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 C711945C9F;
	Thu, 13 Oct 2011 02:38:33 +0200 (CEST)
Received: from samy by type.ipv6 with local (Exim 4.76)
	(envelope-from <samuel.thibault@ens-lyon.org>)
	id 1RE9Jg-0007km-Qu; Thu, 13 Oct 2011 02:38:32 +0200
Date: Thu, 13 Oct 2011 02:38:32 +0200
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
To: Kasper Brink <K.Brink@cs.ru.nl>
Subject: Re: [Xen-devel] pv-grub Solaris support
Message-ID: <20111013003832.GR4326@type.famille.thibault.fr>
Mail-Followup-To: Samuel Thibault <samuel.thibault@ens-lyon.org>,
	Kasper Brink <K.Brink@cs.ru.nl>, xen-devel@lists.xensource.com
References: <20111012204011.GA7518@lilo2.science.ru.nl>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20111012204011.GA7518@lilo2.science.ru.nl>
User-Agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)
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

Hello,

Kasper Brink, le Wed 12 Oct 2011 22:40:11 +0200, a écrit :
> I've patched pv-grub to allow it to boot a Solaris PV domU using an
> unmodified menu.lst.

Great!

I don't have time to review the patch in details, but the shape looks
good to me.

> The attached patch has been tested with various
> Solaris versions (Solaris 11 Express, OpenIndiana 151a, OpenSolaris 134,
> Nexenta Core 3.0.1; all 64-bit). I appreciate your feedback.

Could you also check that Linux configurations also still work?

Samuel

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 17:52:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17: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 1RE9XG-00088S-EI; Wed, 12 Oct 2011 17:52:34 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Wa-0007vE-EU
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:52 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-12.tower-174.messagelabs.com!1318467107!35037590!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7287 invoked from network); 13 Oct 2011 00:51:49 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 00:51:49 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id C68CC8F7B;
	Wed, 12 Oct 2011 17:51:46 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 310B921116; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:36 -0700
Message-Id: <7db4506ad0a64e20ccd9e258f30c026295a19552.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V5 04/11] xen: defer spinlock setup until
	boot CPU setup
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

There's no need to do it at very early init, and doing it there
makes it impossible to use the jump_label machinery.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/xen/smp.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index e79dbb9..4dec905 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -200,6 +200,7 @@ static void __init xen_smp_prepare_boot_cpu(void)
 
 	xen_filter_cpu_maps();
 	xen_setup_vcpu_info_placement();
+	xen_init_spinlocks();
 }
 
 static void __init xen_smp_prepare_cpus(unsigned int max_cpus)
@@ -513,7 +514,6 @@ void __init xen_smp_init(void)
 {
 	smp_ops = xen_smp_ops;
 	xen_fill_possible_map();
-	xen_init_spinlocks();
 }
 
 static void __init xen_hvm_smp_prepare_cpus(unsigned int max_cpus)
-- 
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 Oct 12 17:53:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:53:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE9YJ-0008W2-4P; Wed, 12 Oct 2011 17:53:39 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Wa-0007vF-MI
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:53 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-15.tower-174.messagelabs.com!1318467107!28686371!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9592 invoked from network); 13 Oct 2011 00:51:49 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-15.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 00:51:49 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 0F8488F7D;
	Wed, 12 Oct 2011 17:51:47 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 1DE1420FCF; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:32 -0700
Message-Id: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

[ Changes since last posting: 
  - Use "lock add" for unlock operation rather than "lock xadd"; it is
    equivalent to "add; mfence", but more efficient than both "lock
    xadd" and "mfence".

  I think this version is ready for submission.
]

NOTE: this series is available in:
      git://github.com/jsgf/linux-xen.git upstream/pvticketlock-slowflag
and is based on the previously posted ticketlock cleanup series in
      git://github.com/jsgf/linux-xen.git upstream/ticketlock-cleanup

This series replaces the existing paravirtualized spinlock mechanism
with a paravirtualized ticketlock mechanism.

Ticket locks have an inherent problem in a virtualized case, because
the vCPUs are scheduled rather than running concurrently (ignoring
gang scheduled vCPUs).  This can result in catastrophic performance
collapses when the vCPU scheduler doesn't schedule the correct "next"
vCPU, and ends up scheduling a vCPU which burns its entire timeslice
spinning.  (Note that this is not the same problem as lock-holder
preemption, which this series also addresses; that's also a problem,
but not catastrophic).

(See Thomas Friebel's talk "Prevent Guests from Spinning Around"
http://www.xen.org/files/xensummitboston08/LHP.pdf for more details.)

Currently we deal with this by having PV spinlocks, which adds a layer
of indirection in front of all the spinlock functions, and defining a
completely new implementation for Xen (and for other pvops users, but
there are none at present).

PV ticketlocks keeps the existing ticketlock implemenentation
(fastpath) as-is, but adds a couple of pvops for the slow paths:

- If a CPU has been waiting for a spinlock for SPIN_THRESHOLD
  iterations, then call out to the __ticket_lock_spinning() pvop,
  which allows a backend to block the vCPU rather than spinning.  This
  pvop can set the lock into "slowpath state".

- When releasing a lock, if it is in "slowpath state", the call
  __ticket_unlock_kick() to kick the next vCPU in line awake.  If the
  lock is no longer in contention, it also clears the slowpath flag.

The "slowpath state" is stored in the LSB of the within the lock tail
ticket.  This has the effect of reducing the max number of CPUs by
half (so, a "small ticket" can deal with 128 CPUs, and "large ticket"
32768).

This series provides a Xen implementation, but it should be
straightforward to add a KVM implementation as well.

Overall, it results in a large reduction in code, it makes the native
and virtualized cases closer, and it removes a layer of indirection
around all the spinlock functions.

The fast path (taking an uncontended lock which isn't in "slowpath"
state) is optimal, identical to the non-paravirtualized case.

The inner part of ticket lock code becomes:
	inc = xadd(&lock->tickets, inc);
	inc.tail &= ~TICKET_SLOWPATH_FLAG;

	if (likely(inc.head == inc.tail))
		goto out;

	for (;;) {
		unsigned count = SPIN_THRESHOLD;

		do {
			if (ACCESS_ONCE(lock->tickets.head) == inc.tail)
				goto out;
			cpu_relax();
		} while (--count);
		__ticket_lock_spinning(lock, inc.tail);
	}
out:	barrier();

which results in:
	push   %rbp
	mov    %rsp,%rbp

	mov    $0x200,%eax
	lock xadd %ax,(%rdi)
	movzbl %ah,%edx
	cmp    %al,%dl
	jne    1f	# Slowpath if lock in contention

	pop    %rbp
	retq   

	### SLOWPATH START
1:	and    $-2,%edx
	movzbl %dl,%esi

2:	mov    $0x800,%eax
	jmp    4f

3:	pause  
	sub    $0x1,%eax
	je     5f

4:	movzbl (%rdi),%ecx
	cmp    %cl,%dl
	jne    3b

	pop    %rbp
	retq   

5:	callq  *__ticket_lock_spinning
	jmp    2b
	### SLOWPATH END

with CONFIG_PARAVIRT_SPINLOCKS=n, the code has changed slightly, where
the fastpath case is straight through (taking the lock without
contention), and the spin loop is out of line:

	push   %rbp
	mov    %rsp,%rbp

	mov    $0x100,%eax
	lock xadd %ax,(%rdi)
	movzbl %ah,%edx
	cmp    %al,%dl
	jne    1f

	pop    %rbp
	retq   

	### SLOWPATH START
1:	pause  
	movzbl (%rdi),%eax
	cmp    %dl,%al
	jne    1b

	pop    %rbp
	retq   
	### SLOWPATH END

The unlock code is complicated by the need to both add to the lock's
"head" and fetch the slowpath flag from "tail".  This version of the
patch uses a locked add to do this, followed by a test to see if the
slowflag is set.  The lock prefix acts as a full memory barrier, so we
can be sure that other CPUs will have seen the unlock before we read
the flag (without the barrier the read could be fetched from the
store queue before it hits memory, which could result in a deadlock).

This is is all unnecessary complication if you're not using PV ticket
locks, it also uses the jump-label machinery to use the standard
"add"-based unlock in the non-PV case.

	if (TICKET_SLOWPATH_FLAG &&
	    unlikely(static_branch(&paravirt_ticketlocks_enabled))) {
		arch_spinlock_t prev;

		prev = *lock;
		add_smp(&lock->tickets.head, TICKET_LOCK_INC);

		/* add_smp() is a full mb() */

		if (unlikely(lock->tickets.tail & TICKET_SLOWPATH_FLAG))
			__ticket_unlock_slowpath(lock, prev);
	} else
		__add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX);

which generates:
	push   %rbp
	mov    %rsp,%rbp

	nop5	# replaced by 5-byte jmp 2f when PV enabled

	# non-PV unlock
	addb   $0x2,(%rdi)

1:	pop    %rbp
	retq   

### PV unlock ###
2:	movzwl (%rdi),%esi	# Fetch prev

	lock addb $0x2,(%rdi)	# Do unlock

	testb  $0x1,0x1(%rdi)	# Test flag
	je     1b		# Finished if not set

### Slow path ###
	add    $2,%sil		# Add "head" in old lock state
	mov    %esi,%edx
	and    $0xfe,%dh	# clear slowflag for comparison
	movzbl %dh,%eax
	cmp    %dl,%al		# If head == tail (uncontended)
	je     4f		# clear slowpath flag

	# Kick next CPU waiting for lock
3:	movzbl %sil,%esi
	callq  *pv_lock_ops.kick

	pop    %rbp
	retq   

	# Lock no longer contended - clear slowflag
4:	mov    %esi,%eax
	lock cmpxchg %dx,(%rdi)	# cmpxchg to clear flag
	cmp    %si,%ax
	jne    3b		# If clear failed, then kick

	pop    %rbp
	retq   

So when not using PV ticketlocks, the unlock sequence just has a
5-byte nop added to it, and the PV case is reasonable straightforward
aside from requiring a "lock add".

Thoughts? Comments? Suggestions?

Jeremy Fitzhardinge (10):
  x86/spinlock: replace pv spinlocks with pv ticketlocks
  x86/ticketlock: don't inline _spin_unlock when using paravirt
    spinlocks
  x86/ticketlock: collapse a layer of functions
  xen: defer spinlock setup until boot CPU setup
  xen/pvticketlock: Xen implementation for PV ticket locks
  xen/pvticketlocks: add xen_nopvspin parameter to disable xen pv
    ticketlocks
  x86/pvticketlock: use callee-save for lock_spinning
  x86/pvticketlock: when paravirtualizing ticket locks, increment by 2
  x86/ticketlock: add slowpath logic
  xen/pvticketlock: allow interrupts to be enabled while blocking

Stefano Stabellini (1):
  xen: enable PV ticketlocks on HVM Xen

 arch/x86/Kconfig                      |    3 +
 arch/x86/include/asm/paravirt.h       |   30 +---
 arch/x86/include/asm/paravirt_types.h |   10 +-
 arch/x86/include/asm/spinlock.h       |  126 +++++++++----
 arch/x86/include/asm/spinlock_types.h |   16 +-
 arch/x86/kernel/paravirt-spinlocks.c  |   18 +--
 arch/x86/xen/smp.c                    |    3 +-
 arch/x86/xen/spinlock.c               |  331 ++++++++++-----------------------
 kernel/Kconfig.locks                  |    2 +-
 9 files changed, 210 insertions(+), 329 deletions(-)

-- 
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 Oct 12 17:54:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17: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 1RE9Z9-0000S3-0U; Wed, 12 Oct 2011 17:54:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Wb-0007vG-1D
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:53 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318467108!19265133!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3785 invoked from network); 13 Oct 2011 00:51:49 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-2.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:51:49 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 89F8A8F7F;
	Wed, 12 Oct 2011 17:51:47 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 2693421112; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:34 -0700
Message-Id: <b6d44e8e22a3ccf6fca1ea574b72f988aa327009.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V5 02/11] x86/ticketlock: don't inline
	_spin_unlock when using paravirt 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

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

The code size expands somewhat, and its probably better to just call
a function rather than inline it.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/Kconfig     |    3 +++
 kernel/Kconfig.locks |    2 +-
 2 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 6a47bb2..1f03f82 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -585,6 +585,9 @@ config PARAVIRT_SPINLOCKS
 
 	  If you are unsure how to answer this question, answer N.
 
+config ARCH_NOINLINE_SPIN_UNLOCK
+       def_bool PARAVIRT_SPINLOCKS
+
 config PARAVIRT_CLOCK
 	bool
 
diff --git a/kernel/Kconfig.locks b/kernel/Kconfig.locks
index 5068e2a..584637b 100644
--- a/kernel/Kconfig.locks
+++ b/kernel/Kconfig.locks
@@ -125,7 +125,7 @@ config INLINE_SPIN_LOCK_IRQSAVE
 		 ARCH_INLINE_SPIN_LOCK_IRQSAVE
 
 config INLINE_SPIN_UNLOCK
-	def_bool !DEBUG_SPINLOCK && (!PREEMPT || ARCH_INLINE_SPIN_UNLOCK)
+	def_bool !DEBUG_SPINLOCK && (!PREEMPT || ARCH_INLINE_SPIN_UNLOCK) && !ARCH_NOINLINE_SPIN_UNLOCK
 
 config INLINE_SPIN_UNLOCK_BH
 	def_bool !DEBUG_SPINLOCK && ARCH_INLINE_SPIN_UNLOCK_BH
-- 
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 Oct 12 17:55:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:55:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE9aC-0000ps-Gb; Wed, 12 Oct 2011 17:55:36 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Wb-0007vI-V5
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:54 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318467109!20897239!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27665 invoked from network); 13 Oct 2011 00:51:50 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:51:50 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 4D3778F85;
	Wed, 12 Oct 2011 17:51:48 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 216EF20542; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:33 -0700
Message-Id: <33228d356eca9cdbd0448e82ef4bc14f00877500.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V5 01/11] x86/spinlock: replace pv spinlocks
	with pv ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Rather than outright replacing the entire spinlock implementation in
order to paravirtualize it, keep the ticket lock implementation but add
a couple of pvops hooks on the slow patch (long spin on lock, unlocking
a contended lock).

Ticket locks have a number of nice properties, but they also have some
surprising behaviours in virtual environments.  They enforce a strict
FIFO ordering on cpus trying to take a lock; however, if the hypervisor
scheduler does not schedule the cpus in the correct order, the system can
waste a huge amount of time spinning until the next cpu can take the lock.

(See Thomas Friebel's talk "Prevent Guests from Spinning Around"
http://www.xen.org/files/xensummitboston08/LHP.pdf for more details.)

To address this, we add two hooks:
 - __ticket_spin_lock which is called after the cpu has been
   spinning on the lock for a significant number of iterations but has
   failed to take the lock (presumably because the cpu holding the lock
   has been descheduled).  The lock_spinning pvop is expected to block
   the cpu until it has been kicked by the current lock holder.
 - __ticket_spin_unlock, which on releasing a contended lock
   (there are more cpus with tail tickets), it looks to see if the next
   cpu is blocked and wakes it if so.

When compiled with CONFIG_PARAVIRT_SPINLOCKS disabled, a set of stub
functions causes all the extra code to go away.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/include/asm/paravirt.h       |   30 ++-----------------
 arch/x86/include/asm/paravirt_types.h |   10 ++----
 arch/x86/include/asm/spinlock.h       |   50 ++++++++++++++++++++++++++------
 arch/x86/include/asm/spinlock_types.h |    4 --
 arch/x86/kernel/paravirt-spinlocks.c  |   15 +--------
 arch/x86/xen/spinlock.c               |    7 ++++-
 6 files changed, 56 insertions(+), 60 deletions(-)

diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index a7d2db9..76cae7a 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -750,36 +750,14 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
 
 #if defined(CONFIG_SMP) && defined(CONFIG_PARAVIRT_SPINLOCKS)
 
-static inline int arch_spin_is_locked(struct arch_spinlock *lock)
+static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, __ticket_t ticket)
 {
-	return PVOP_CALL1(int, pv_lock_ops.spin_is_locked, lock);
+	PVOP_VCALL2(pv_lock_ops.lock_spinning, lock, ticket);
 }
 
-static inline int arch_spin_is_contended(struct arch_spinlock *lock)
+static __always_inline void ____ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
 {
-	return PVOP_CALL1(int, pv_lock_ops.spin_is_contended, lock);
-}
-#define arch_spin_is_contended	arch_spin_is_contended
-
-static __always_inline void arch_spin_lock(struct arch_spinlock *lock)
-{
-	PVOP_VCALL1(pv_lock_ops.spin_lock, lock);
-}
-
-static __always_inline void arch_spin_lock_flags(struct arch_spinlock *lock,
-						  unsigned long flags)
-{
-	PVOP_VCALL2(pv_lock_ops.spin_lock_flags, lock, flags);
-}
-
-static __always_inline int arch_spin_trylock(struct arch_spinlock *lock)
-{
-	return PVOP_CALL1(int, pv_lock_ops.spin_trylock, lock);
-}
-
-static __always_inline void arch_spin_unlock(struct arch_spinlock *lock)
-{
-	PVOP_VCALL1(pv_lock_ops.spin_unlock, lock);
+	PVOP_VCALL2(pv_lock_ops.unlock_kick, lock, ticket);
 }
 
 #endif
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 8e8b9a4..005e24d 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -327,13 +327,11 @@ struct pv_mmu_ops {
 };
 
 struct arch_spinlock;
+#include <asm/spinlock_types.h>
+
 struct pv_lock_ops {
-	int (*spin_is_locked)(struct arch_spinlock *lock);
-	int (*spin_is_contended)(struct arch_spinlock *lock);
-	void (*spin_lock)(struct arch_spinlock *lock);
-	void (*spin_lock_flags)(struct arch_spinlock *lock, unsigned long flags);
-	int (*spin_trylock)(struct arch_spinlock *lock);
-	void (*spin_unlock)(struct arch_spinlock *lock);
+	void (*lock_spinning)(struct arch_spinlock *lock, __ticket_t ticket);
+	void (*unlock_kick)(struct arch_spinlock *lock, __ticket_t ticket);
 };
 
 /* This contains all the paravirt structures: we get a convenient
diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index a82c2bf..5efd2f9 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -37,6 +37,32 @@
 # define UNLOCK_LOCK_PREFIX
 #endif
 
+/* How long a lock should spin before we consider blocking */
+#define SPIN_THRESHOLD	(1 << 11)
+
+#ifndef CONFIG_PARAVIRT_SPINLOCKS
+
+static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, __ticket_t ticket)
+{
+}
+
+static __always_inline void ____ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
+{
+}
+
+#endif	/* CONFIG_PARAVIRT_SPINLOCKS */
+
+
+/* 
+ * If a spinlock has someone waiting on it, then kick the appropriate
+ * waiting cpu.
+ */
+static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t next)
+{
+	if (unlikely(lock->tickets.tail != next))
+		____ticket_unlock_kick(lock, next);
+}
+
 /*
  * Ticket locks are conceptually two parts, one indicating the current head of
  * the queue, and the other indicating the current tail. The lock is acquired
@@ -50,19 +76,24 @@
  * in the high part, because a wide xadd increment of the low part would carry
  * up and contaminate the high part.
  */
-static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)
+static __always_inline void __ticket_spin_lock(struct arch_spinlock *lock)
 {
 	register struct __raw_tickets inc = { .tail = 1 };
 
 	inc = xadd(&lock->tickets, inc);
 
 	for (;;) {
-		if (inc.head == inc.tail)
-			break;
-		cpu_relax();
-		inc.head = ACCESS_ONCE(lock->tickets.head);
+		unsigned count = SPIN_THRESHOLD;
+
+		do {
+			if (inc.head == inc.tail)
+				goto out;
+			cpu_relax();
+			inc.head = ACCESS_ONCE(lock->tickets.head);
+		} while (--count);
+		__ticket_lock_spinning(lock, inc.tail);
 	}
-	barrier();		/* make sure nothing creeps before the lock is taken */
+out:	barrier();		/* make sure nothing creeps before the lock is taken */
 }
 
 static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
@@ -81,7 +112,10 @@ static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
 
 static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
 {
+	__ticket_t next = lock->tickets.head + 1;
+
 	__add(&lock->tickets.head, 1, UNLOCK_LOCK_PREFIX);
+	__ticket_unlock_kick(lock, next);
 }
 
 static inline int __ticket_spin_is_locked(arch_spinlock_t *lock)
@@ -98,8 +132,6 @@ static inline int __ticket_spin_is_contended(arch_spinlock_t *lock)
 	return ((tmp.tail - tmp.head) & TICKET_MASK) > 1;
 }
 
-#ifndef CONFIG_PARAVIRT_SPINLOCKS
-
 static inline int arch_spin_is_locked(arch_spinlock_t *lock)
 {
 	return __ticket_spin_is_locked(lock);
@@ -132,8 +164,6 @@ static __always_inline void arch_spin_lock_flags(arch_spinlock_t *lock,
 	arch_spin_lock(lock);
 }
 
-#endif	/* CONFIG_PARAVIRT_SPINLOCKS */
-
 static inline void arch_spin_unlock_wait(arch_spinlock_t *lock)
 {
 	while (arch_spin_is_locked(lock))
diff --git a/arch/x86/include/asm/spinlock_types.h b/arch/x86/include/asm/spinlock_types.h
index 8ebd5df..dbe223d 100644
--- a/arch/x86/include/asm/spinlock_types.h
+++ b/arch/x86/include/asm/spinlock_types.h
@@ -1,10 +1,6 @@
 #ifndef _ASM_X86_SPINLOCK_TYPES_H
 #define _ASM_X86_SPINLOCK_TYPES_H
 
-#ifndef __LINUX_SPINLOCK_TYPES_H
-# error "please don't include this file directly"
-#endif
-
 #include <linux/types.h>
 
 #if (CONFIG_NR_CPUS < 256)
diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c
index 676b8c7..c2e010e 100644
--- a/arch/x86/kernel/paravirt-spinlocks.c
+++ b/arch/x86/kernel/paravirt-spinlocks.c
@@ -7,21 +7,10 @@
 
 #include <asm/paravirt.h>
 
-static inline void
-default_spin_lock_flags(arch_spinlock_t *lock, unsigned long flags)
-{
-	arch_spin_lock(lock);
-}
-
 struct pv_lock_ops pv_lock_ops = {
 #ifdef CONFIG_SMP
-	.spin_is_locked = __ticket_spin_is_locked,
-	.spin_is_contended = __ticket_spin_is_contended,
-
-	.spin_lock = __ticket_spin_lock,
-	.spin_lock_flags = default_spin_lock_flags,
-	.spin_trylock = __ticket_spin_trylock,
-	.spin_unlock = __ticket_spin_unlock,
+	.lock_spinning = paravirt_nop,
+	.unlock_kick = paravirt_nop,
 #endif
 };
 EXPORT_SYMBOL(pv_lock_ops);
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index cc9b1e1..23af06a 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -121,6 +121,9 @@ struct xen_spinlock {
 	unsigned short spinners;	/* count of waiting cpus */
 };
 
+static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
+
+#if 0
 static int xen_spin_is_locked(struct arch_spinlock *lock)
 {
 	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
@@ -148,7 +151,6 @@ static int xen_spin_trylock(struct arch_spinlock *lock)
 	return old == 0;
 }
 
-static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
 static DEFINE_PER_CPU(struct xen_spinlock *, lock_spinners);
 
 /*
@@ -338,6 +340,7 @@ static void xen_spin_unlock(struct arch_spinlock *lock)
 	if (unlikely(xl->spinners))
 		xen_spin_unlock_slow(xl);
 }
+#endif
 
 static irqreturn_t dummy_handler(int irq, void *dev_id)
 {
@@ -373,12 +376,14 @@ void xen_uninit_lock_cpu(int cpu)
 
 void __init xen_init_spinlocks(void)
 {
+#if 0
 	pv_lock_ops.spin_is_locked = xen_spin_is_locked;
 	pv_lock_ops.spin_is_contended = xen_spin_is_contended;
 	pv_lock_ops.spin_lock = xen_spin_lock;
 	pv_lock_ops.spin_lock_flags = xen_spin_lock_flags;
 	pv_lock_ops.spin_trylock = xen_spin_trylock;
 	pv_lock_ops.spin_unlock = xen_spin_unlock;
+#endif
 }
 
 #ifdef CONFIG_XEN_DEBUG_FS
-- 
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 Oct 12 17:56:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:56:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE9b2-0001DL-J0; Wed, 12 Oct 2011 17:56:28 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Wb-0007vH-Pu
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:54 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-12.tower-174.messagelabs.com!1318467108!35037593!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7310 invoked from network); 13 Oct 2011 00:51:50 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 00:51:50 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 3D76E8F81;
	Wed, 12 Oct 2011 17:51:48 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 2AA7821114; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:35 -0700
Message-Id: <6dbb707b0b761afa090c899d20c4198a6873fc7a.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V5 03/11] x86/ticketlock: collapse a layer
	of 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

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Now that the paravirtualization layer doesn't exist at the spinlock
level any more, we can collapse the __ticket_ functions into the arch_
functions.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/include/asm/spinlock.h |   35 +++++------------------------------
 1 files changed, 5 insertions(+), 30 deletions(-)

diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index 5efd2f9..f0d6a59 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -76,7 +76,7 @@ static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __t
  * in the high part, because a wide xadd increment of the low part would carry
  * up and contaminate the high part.
  */
-static __always_inline void __ticket_spin_lock(struct arch_spinlock *lock)
+static __always_inline void arch_spin_lock(struct arch_spinlock *lock)
 {
 	register struct __raw_tickets inc = { .tail = 1 };
 
@@ -96,7 +96,7 @@ static __always_inline void __ticket_spin_lock(struct arch_spinlock *lock)
 out:	barrier();		/* make sure nothing creeps before the lock is taken */
 }
 
-static __always_inline int __ticket_spin_trylock(arch_spinlock_t *lock)
+static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
 {
 	arch_spinlock_t old, new;
 
@@ -110,7 +110,7 @@ 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;
 }
 
-static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
+static __always_inline void arch_spin_unlock(arch_spinlock_t *lock)
 {
 	__ticket_t next = lock->tickets.head + 1;
 
@@ -118,46 +118,21 @@ static __always_inline void __ticket_spin_unlock(arch_spinlock_t *lock)
 	__ticket_unlock_kick(lock, next);
 }
 
-static inline int __ticket_spin_is_locked(arch_spinlock_t *lock)
+static inline int arch_spin_is_locked(arch_spinlock_t *lock)
 {
 	struct __raw_tickets tmp = ACCESS_ONCE(lock->tickets);
 
 	return !!(tmp.tail ^ tmp.head);
 }
 
-static inline int __ticket_spin_is_contended(arch_spinlock_t *lock)
+static inline int arch_spin_is_contended(arch_spinlock_t *lock)
 {
 	struct __raw_tickets tmp = ACCESS_ONCE(lock->tickets);
 
 	return ((tmp.tail - tmp.head) & TICKET_MASK) > 1;
 }
-
-static inline int arch_spin_is_locked(arch_spinlock_t *lock)
-{
-	return __ticket_spin_is_locked(lock);
-}
-
-static inline int arch_spin_is_contended(arch_spinlock_t *lock)
-{
-	return __ticket_spin_is_contended(lock);
-}
 #define arch_spin_is_contended	arch_spin_is_contended
 
-static __always_inline void arch_spin_lock(arch_spinlock_t *lock)
-{
-	__ticket_spin_lock(lock);
-}
-
-static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
-{
-	return __ticket_spin_trylock(lock);
-}
-
-static __always_inline void arch_spin_unlock(arch_spinlock_t *lock)
-{
-	__ticket_spin_unlock(lock);
-}
-
 static __always_inline void arch_spin_lock_flags(arch_spinlock_t *lock,
 						  unsigned long flags)
 {
-- 
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 Oct 12 17:57:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 17:57:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE9bq-0001d5-US; Wed, 12 Oct 2011 17:57:18 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Wc-0007vJ-6m
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:54 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318467081!41652548!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3364 invoked from network); 13 Oct 2011 00:51:23 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:51:23 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id BA5038F89;
	Wed, 12 Oct 2011 17:51:48 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 3DBC221159; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:38 -0700
Message-Id: <58ca1ea5c2cd3a0d6ee6d20fae17bf4a813e8b06.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V5 06/11] xen/pvticketlocks: add
	xen_nopvspin parameter to disable xen pv ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/xen/spinlock.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index f6133c5..1e21c99 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -195,12 +195,26 @@ void xen_uninit_lock_cpu(int cpu)
 	unbind_from_irqhandler(per_cpu(lock_kicker_irq, cpu), NULL);
 }
 
+static bool xen_pvspin __initdata = true;
+
 void __init xen_init_spinlocks(void)
 {
+	if (!xen_pvspin) {
+		printk(KERN_DEBUG "xen: PV spinlocks disabled\n");
+		return;
+	}
+
 	pv_lock_ops.lock_spinning = xen_lock_spinning;
 	pv_lock_ops.unlock_kick = xen_unlock_kick;
 }
 
+static __init int xen_parse_nopvspin(char *arg)
+{
+	xen_pvspin = false;
+	return 0;
+}
+early_param("xen_nopvspin", xen_parse_nopvspin);
+
 #ifdef CONFIG_XEN_DEBUG_FS
 
 static struct dentry *d_spin_debug;
-- 
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 Oct 12 18:00:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 18:00:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE9ea-00023a-Eg; Wed, 12 Oct 2011 18:00:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Wc-0007vL-Po
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:55 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318467110!782128!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14296 invoked from network); 13 Oct 2011 00:51:51 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:51:51 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 781C28F8F;
	Wed, 12 Oct 2011 17:51:49 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 505062115E; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:41 -0700
Message-Id: <5ae3e4b686a993630fca8c79d455af779a7a0f04.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stephan Diestelhorst <stephan.diestelhorst@amd.com>
Subject: [Xen-devel] [PATCH RFC V5 09/11] x86/ticketlock: add slowpath 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

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Maintain a flag in the LSB of the ticket lock tail which indicates
whether anyone is in the lock slowpath and may need kicking when
the current holder unlocks.  The flags are set when the first locker
enters the slowpath, and cleared when unlocking to an empty queue (ie,
no contention).

In the specific implementation of lock_spinning(), make sure to set
the slowpath flags on the lock just before blocking.  We must do
this before the last-chance pickup test to prevent a deadlock
with the unlocker:

Unlocker			Locker
				test for lock pickup
					-> fail
unlock
test slowpath
	-> false
				set slowpath flags
				block

Whereas this works in any ordering:

Unlocker			Locker
				set slowpath flags
				test for lock pickup
					-> fail
				block
unlock
test slowpath
	-> true, kick

If the unlocker finds that the lock has the slowpath flag set but it is
actually uncontended (ie, head == tail, so nobody is waiting), then it
clears the slowpath flag.

The unlock code uses a locked add to update the head counter.  This also
acts as a full memory barrier so that its safe to subsequently
read back the slowflag state, knowing that the updated lock is visible
to the other CPUs.  If it were an unlocked add, then the flag read may
just be forwarded from the store buffer before it was visible to the other
CPUs, which could result in a deadlock.

Unfortunately this means we need to do a locked instruction when
unlocking with PV ticketlocks.  However, if PV ticketlocks are not
enabled, then the old non-locked "add" is the only unlocking code.

Note: this code relies on gcc making sure that unlikely() code is out of
line of the fastpath, which only happens when OPTIMIZE_SIZE=n.  If it
doesn't the generated code isn't too bad, but its definitely suboptimal.

Thanks to Srivatsa Vaddagiri for providing a bugfix to the original
version of this change, which has been folded in.
Thanks to Stephan Diestelhorst for commenting on some code which relied
on an inaccurate reading of the x86 memory ordering rules.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Cc: Stephan Diestelhorst <stephan.diestelhorst@amd.com>
---
 arch/x86/include/asm/paravirt.h       |    2 +-
 arch/x86/include/asm/spinlock.h       |   79 ++++++++++++++++++++++++--------
 arch/x86/include/asm/spinlock_types.h |    2 +
 arch/x86/kernel/paravirt-spinlocks.c  |    3 +
 arch/x86/xen/spinlock.c               |    6 +++
 5 files changed, 71 insertions(+), 21 deletions(-)

diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index 50281c7..13b3d8b 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -755,7 +755,7 @@ static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, _
 	PVOP_VCALLEE2(pv_lock_ops.lock_spinning, lock, ticket);
 }
 
-static __always_inline void ____ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
+static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
 {
 	PVOP_VCALL2(pv_lock_ops.unlock_kick, lock, ticket);
 }
diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index dd155f7..8e0b9cf 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -1,11 +1,14 @@
 #ifndef _ASM_X86_SPINLOCK_H
 #define _ASM_X86_SPINLOCK_H
 
+#include <linux/jump_label.h>
 #include <linux/atomic.h>
 #include <asm/page.h>
 #include <asm/processor.h>
 #include <linux/compiler.h>
 #include <asm/paravirt.h>
+#include <asm/bitops.h>
+
 /*
  * Your basic SMP spinlocks, allowing only a single CPU anywhere
  *
@@ -40,29 +43,27 @@
 /* How long a lock should spin before we consider blocking */
 #define SPIN_THRESHOLD	(1 << 11)
 
-#ifndef CONFIG_PARAVIRT_SPINLOCKS
+extern struct jump_label_key paravirt_ticketlocks_enabled;
+
+#ifdef CONFIG_PARAVIRT_SPINLOCKS
 
-static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, __ticket_t ticket)
+static inline void __ticket_enter_slowpath(arch_spinlock_t *lock)
 {
+	set_bit(0, (volatile unsigned long *)&lock->tickets.tail);
 }
 
-static __always_inline void ____ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
+#else  /* !CONFIG_PARAVIRT_SPINLOCKS */
+static __always_inline void __ticket_lock_spinning(arch_spinlock_t *lock, __ticket_t ticket)
 {
 }
 
-#endif	/* CONFIG_PARAVIRT_SPINLOCKS */
-
-
-/* 
- * If a spinlock has someone waiting on it, then kick the appropriate
- * waiting cpu.
- */
-static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t next)
+static inline void __ticket_unlock_kick(arch_spinlock_t *lock, __ticket_t ticket)
 {
-	if (unlikely(lock->tickets.tail != next))
-		____ticket_unlock_kick(lock, next);
 }
 
+#endif	/* CONFIG_PARAVIRT_SPINLOCKS */
+
+
 /*
  * Ticket locks are conceptually two parts, one indicating the current head of
  * the queue, and the other indicating the current tail. The lock is acquired
@@ -76,20 +77,22 @@ static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __t
  * in the high part, because a wide xadd increment of the low part would carry
  * up and contaminate the high part.
  */
-static __always_inline void arch_spin_lock(struct arch_spinlock *lock)
+static __always_inline void arch_spin_lock(arch_spinlock_t *lock)
 {
 	register struct __raw_tickets inc = { .tail = TICKET_LOCK_INC };
 
 	inc = xadd(&lock->tickets, inc);
+	if (likely(inc.head == inc.tail))
+		goto out;
 
+	inc.tail &= ~TICKET_SLOWPATH_FLAG;
 	for (;;) {
 		unsigned count = SPIN_THRESHOLD;
 
 		do {
-			if (inc.head == inc.tail)
+			if (ACCESS_ONCE(lock->tickets.head) == inc.tail)
 				goto out;
 			cpu_relax();
-			inc.head = ACCESS_ONCE(lock->tickets.head);
 		} while (--count);
 		__ticket_lock_spinning(lock, inc.tail);
 	}
@@ -101,7 +104,7 @@ static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
 	arch_spinlock_t old, new;
 
 	old.tickets = ACCESS_ONCE(lock->tickets);
-	if (old.tickets.head != old.tickets.tail)
+	if (old.tickets.head != (old.tickets.tail & ~TICKET_SLOWPATH_FLAG))
 		return 0;
 
 	new.head_tail = old.head_tail + (TICKET_LOCK_INC << TICKET_SHIFT);
@@ -110,12 +113,48 @@ static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
 	return cmpxchg(&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail;
 }
 
+static inline void __ticket_unlock_slowpath(arch_spinlock_t *lock,
+					    arch_spinlock_t old)
+{
+	arch_spinlock_t new;
+
+	BUILD_BUG_ON(((__ticket_t)NR_CPUS) != NR_CPUS);
+
+	/* Perform the unlock on the "before" copy */
+	old.tickets.head += TICKET_LOCK_INC;
+
+	/* Clear the slowpath flag */
+	new.head_tail = old.head_tail & ~(TICKET_SLOWPATH_FLAG << TICKET_SHIFT);
+
+	/*
+	 * If the lock is uncontended, clear the flag - use cmpxchg in
+	 * case it changes behind our back though.
+	 */
+	if (new.tickets.head != new.tickets.tail ||
+	    cmpxchg(&lock->head_tail, old.head_tail, new.head_tail) != old.head_tail) {
+		/*
+		 * Lock still has someone queued for it, so wake up an
+		 * appropriate waiter.
+		 */
+		__ticket_unlock_kick(lock, old.tickets.head);
+	}
+}
+
 static __always_inline void arch_spin_unlock(arch_spinlock_t *lock)
 {
-	__ticket_t next = lock->tickets.head + TICKET_LOCK_INC;
+	if (TICKET_SLOWPATH_FLAG &&
+	    unlikely(static_branch(&paravirt_ticketlocks_enabled))) {
+		arch_spinlock_t prev;
+
+		prev = *lock;
+		add_smp(&lock->tickets.head, TICKET_LOCK_INC);
+
+		/* add_smp() is a full mb() */
 
-	__add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX);
-	__ticket_unlock_kick(lock, next);
+		if (unlikely(lock->tickets.tail & TICKET_SLOWPATH_FLAG))
+			__ticket_unlock_slowpath(lock, prev);
+	} else
+		__add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX);
 }
 
 static inline int arch_spin_is_locked(arch_spinlock_t *lock)
diff --git a/arch/x86/include/asm/spinlock_types.h b/arch/x86/include/asm/spinlock_types.h
index aa9a205..407f7f7 100644
--- a/arch/x86/include/asm/spinlock_types.h
+++ b/arch/x86/include/asm/spinlock_types.h
@@ -5,8 +5,10 @@
 
 #ifdef CONFIG_PARAVIRT_SPINLOCKS
 #define __TICKET_LOCK_INC	2
+#define TICKET_SLOWPATH_FLAG	((__ticket_t)1)
 #else
 #define __TICKET_LOCK_INC	1
+#define TICKET_SLOWPATH_FLAG	((__ticket_t)0)
 #endif
 
 #if (CONFIG_NR_CPUS < (256 / __TICKET_LOCK_INC))
diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c
index 4251c1d..6ca1d33 100644
--- a/arch/x86/kernel/paravirt-spinlocks.c
+++ b/arch/x86/kernel/paravirt-spinlocks.c
@@ -4,6 +4,7 @@
  */
 #include <linux/spinlock.h>
 #include <linux/module.h>
+#include <linux/jump_label.h>
 
 #include <asm/paravirt.h>
 
@@ -15,3 +16,5 @@ struct pv_lock_ops pv_lock_ops = {
 };
 EXPORT_SYMBOL(pv_lock_ops);
 
+struct jump_label_key paravirt_ticketlocks_enabled = JUMP_LABEL_INIT;
+EXPORT_SYMBOL(paravirt_ticketlocks_enabled);
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 431d231..0a552ec 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -124,6 +124,10 @@ static void xen_lock_spinning(struct arch_spinlock *lock, __ticket_t want)
 	/* Only check lock once pending cleared */
 	barrier();
 
+	/* Mark entry to slowpath before doing the pickup test to make
+	   sure we don't deadlock with an unlocker. */
+	__ticket_enter_slowpath(lock);
+
 	/* check again make sure it didn't become free while
 	   we weren't looking  */
 	if (ACCESS_ONCE(lock->tickets.head) == want) {
@@ -205,6 +209,8 @@ void __init xen_init_spinlocks(void)
 		return;
 	}
 
+	jump_label_inc(&paravirt_ticketlocks_enabled);
+
 	pv_lock_ops.lock_spinning = PV_CALLEE_SAVE(xen_lock_spinning);
 	pv_lock_ops.unlock_kick = xen_unlock_kick;
 }
-- 
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 Oct 12 18:02:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 18:02:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE9gw-0002Rk-Tp; Wed, 12 Oct 2011 18:02:35 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Wc-0007vK-F2
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:55 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-9.tower-216.messagelabs.com!1318467109!777382!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6110 invoked from network); 13 Oct 2011 00:51:51 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-9.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:51:51 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id B7CE68F87;
	Wed, 12 Oct 2011 17:51:48 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 3798721157; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:37 -0700
Message-Id: <91538058f37a3b48ed037fb78b46a3225492103c.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V5 05/11] xen/pvticketlock: Xen
	implementation for PV ticket locks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Replace the old Xen implementation of PV spinlocks with and implementation
of xen_lock_spinning and xen_unlock_kick.

xen_lock_spinning simply registers the cpu in its entry in lock_waiting,
adds itself to the waiting_cpus set, and blocks on an event channel
until the channel becomes pending.

xen_unlock_kick searches the cpus in waiting_cpus looking for the one
which next wants this lock with the next ticket, if any.  If found,
it kicks it by making its event channel pending, which wakes it up.

We need to make sure interrupts are disabled while we're relying on the
contents of the per-cpu lock_waiting values, otherwise an interrupt
handler could come in, try to take some other lock, block, and overwrite
our values.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/xen/spinlock.c |  287 +++++++----------------------------------------
 1 files changed, 43 insertions(+), 244 deletions(-)

diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 23af06a..f6133c5 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -19,32 +19,21 @@
 #ifdef CONFIG_XEN_DEBUG_FS
 static struct xen_spinlock_stats
 {
-	u64 taken;
 	u32 taken_slow;
-	u32 taken_slow_nested;
 	u32 taken_slow_pickup;
 	u32 taken_slow_spurious;
-	u32 taken_slow_irqenable;
 
-	u64 released;
 	u32 released_slow;
 	u32 released_slow_kicked;
 
 #define HISTO_BUCKETS	30
-	u32 histo_spin_total[HISTO_BUCKETS+1];
-	u32 histo_spin_spinning[HISTO_BUCKETS+1];
 	u32 histo_spin_blocked[HISTO_BUCKETS+1];
 
-	u64 time_total;
-	u64 time_spinning;
 	u64 time_blocked;
 } spinlock_stats;
 
 static u8 zero_stats;
 
-static unsigned lock_timeout = 1 << 10;
-#define TIMEOUT lock_timeout
-
 static inline void check_zero(void)
 {
 	if (unlikely(zero_stats)) {
@@ -73,22 +62,6 @@ static void __spin_time_accum(u64 delta, u32 *array)
 		array[HISTO_BUCKETS]++;
 }
 
-static inline void spin_time_accum_spinning(u64 start)
-{
-	u32 delta = xen_clocksource_read() - start;
-
-	__spin_time_accum(delta, spinlock_stats.histo_spin_spinning);
-	spinlock_stats.time_spinning += delta;
-}
-
-static inline void spin_time_accum_total(u64 start)
-{
-	u32 delta = xen_clocksource_read() - start;
-
-	__spin_time_accum(delta, spinlock_stats.histo_spin_total);
-	spinlock_stats.time_total += delta;
-}
-
 static inline void spin_time_accum_blocked(u64 start)
 {
 	u32 delta = xen_clocksource_read() - start;
@@ -105,214 +78,84 @@ static inline u64 spin_time_start(void)
 	return 0;
 }
 
-static inline void spin_time_accum_total(u64 start)
-{
-}
-static inline void spin_time_accum_spinning(u64 start)
-{
-}
 static inline void spin_time_accum_blocked(u64 start)
 {
 }
 #endif  /* CONFIG_XEN_DEBUG_FS */
 
-struct xen_spinlock {
-	unsigned char lock;		/* 0 -> free; 1 -> locked */
-	unsigned short spinners;	/* count of waiting cpus */
+struct xen_lock_waiting {
+	struct arch_spinlock *lock;
+	__ticket_t want;
 };
 
 static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
+static DEFINE_PER_CPU(struct xen_lock_waiting, lock_waiting);
+static cpumask_t waiting_cpus;
 
-#if 0
-static int xen_spin_is_locked(struct arch_spinlock *lock)
-{
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-
-	return xl->lock != 0;
-}
-
-static int xen_spin_is_contended(struct arch_spinlock *lock)
+static void xen_lock_spinning(struct arch_spinlock *lock, __ticket_t want)
 {
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-
-	/* Not strictly true; this is only the count of contended
-	   lock-takers entering the slow path. */
-	return xl->spinners != 0;
-}
-
-static int xen_spin_trylock(struct arch_spinlock *lock)
-{
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-	u8 old = 1;
-
-	asm("xchgb %b0,%1"
-	    : "+q" (old), "+m" (xl->lock) : : "memory");
-
-	return old == 0;
-}
-
-static DEFINE_PER_CPU(struct xen_spinlock *, lock_spinners);
-
-/*
- * Mark a cpu as interested in a lock.  Returns the CPU's previous
- * lock of interest, in case we got preempted by an interrupt.
- */
-static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl)
-{
-	struct xen_spinlock *prev;
-
-	prev = __this_cpu_read(lock_spinners);
-	__this_cpu_write(lock_spinners, xl);
-
-	wmb();			/* set lock of interest before count */
-
-	asm(LOCK_PREFIX " incw %0"
-	    : "+m" (xl->spinners) : : "memory");
-
-	return prev;
-}
-
-/*
- * Mark a cpu as no longer interested in a lock.  Restores previous
- * lock of interest (NULL for none).
- */
-static inline void unspinning_lock(struct xen_spinlock *xl, struct xen_spinlock *prev)
-{
-	asm(LOCK_PREFIX " decw %0"
-	    : "+m" (xl->spinners) : : "memory");
-	wmb();			/* decrement count before restoring lock */
-	__this_cpu_write(lock_spinners, prev);
-}
-
-static noinline int xen_spin_lock_slow(struct arch_spinlock *lock, bool irq_enable)
-{
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-	struct xen_spinlock *prev;
 	int irq = __this_cpu_read(lock_kicker_irq);
-	int ret;
+	struct xen_lock_waiting *w = &__get_cpu_var(lock_waiting);
+	int cpu = smp_processor_id();
 	u64 start;
+	unsigned long flags;
 
 	/* If kicker interrupts not initialized yet, just spin */
 	if (irq == -1)
-		return 0;
+		return;
 
 	start = spin_time_start();
 
-	/* announce we're spinning */
-	prev = spinning_lock(xl);
+	/* Make sure interrupts are disabled to ensure that these
+	   per-cpu values are not overwritten. */
+	local_irq_save(flags);
+
+	w->want = want;
+	w->lock = lock;
+
+	/* This uses set_bit, which atomic and therefore a barrier */
+	cpumask_set_cpu(cpu, &waiting_cpus);
 
 	ADD_STATS(taken_slow, 1);
-	ADD_STATS(taken_slow_nested, prev != NULL);
-
-	do {
-		unsigned long flags;
-
-		/* clear pending */
-		xen_clear_irq_pending(irq);
-
-		/* check again make sure it didn't become free while
-		   we weren't looking  */
-		ret = xen_spin_trylock(lock);
-		if (ret) {
-			ADD_STATS(taken_slow_pickup, 1);
-
-			/*
-			 * If we interrupted another spinlock while it
-			 * was blocking, make sure it doesn't block
-			 * without rechecking the lock.
-			 */
-			if (prev != NULL)
-				xen_set_irq_pending(irq);
-			goto out;
-		}
 
-		flags = arch_local_save_flags();
-		if (irq_enable) {
-			ADD_STATS(taken_slow_irqenable, 1);
-			raw_local_irq_enable();
-		}
+	/* clear pending */
+	xen_clear_irq_pending(irq);
 
-		/*
-		 * Block until irq becomes pending.  If we're
-		 * interrupted at this point (after the trylock but
-		 * before entering the block), then the nested lock
-		 * handler guarantees that the irq will be left
-		 * pending if there's any chance the lock became free;
-		 * xen_poll_irq() returns immediately if the irq is
-		 * pending.
-		 */
-		xen_poll_irq(irq);
+	/* Only check lock once pending cleared */
+	barrier();
 
-		raw_local_irq_restore(flags);
+	/* check again make sure it didn't become free while
+	   we weren't looking  */
+	if (ACCESS_ONCE(lock->tickets.head) == want) {
+		ADD_STATS(taken_slow_pickup, 1);
+		goto out;
+	}
 
-		ADD_STATS(taken_slow_spurious, !xen_test_irq_pending(irq));
-	} while (!xen_test_irq_pending(irq)); /* check for spurious wakeups */
+	/* Block until irq becomes pending (or perhaps a spurious wakeup) */
+	xen_poll_irq(irq);
+	ADD_STATS(taken_slow_spurious, !xen_test_irq_pending(irq));
 
 	kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq));
 
 out:
-	unspinning_lock(xl, prev);
-	spin_time_accum_blocked(start);
-
-	return ret;
-}
-
-static inline void __xen_spin_lock(struct arch_spinlock *lock, bool irq_enable)
-{
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-	unsigned timeout;
-	u8 oldval;
-	u64 start_spin;
-
-	ADD_STATS(taken, 1);
-
-	start_spin = spin_time_start();
-
-	do {
-		u64 start_spin_fast = spin_time_start();
-
-		timeout = TIMEOUT;
+	cpumask_clear_cpu(cpu, &waiting_cpus);
+	w->lock = NULL;
 
-		asm("1: xchgb %1,%0\n"
-		    "   testb %1,%1\n"
-		    "   jz 3f\n"
-		    "2: rep;nop\n"
-		    "   cmpb $0,%0\n"
-		    "   je 1b\n"
-		    "   dec %2\n"
-		    "   jnz 2b\n"
-		    "3:\n"
-		    : "+m" (xl->lock), "=q" (oldval), "+r" (timeout)
-		    : "1" (1)
-		    : "memory");
+	local_irq_restore(flags);
 
-		spin_time_accum_spinning(start_spin_fast);
-
-	} while (unlikely(oldval != 0 &&
-			  (TIMEOUT == ~0 || !xen_spin_lock_slow(lock, irq_enable))));
-
-	spin_time_accum_total(start_spin);
-}
-
-static void xen_spin_lock(struct arch_spinlock *lock)
-{
-	__xen_spin_lock(lock, false);
-}
-
-static void xen_spin_lock_flags(struct arch_spinlock *lock, unsigned long flags)
-{
-	__xen_spin_lock(lock, !raw_irqs_disabled_flags(flags));
+	spin_time_accum_blocked(start);
 }
 
-static noinline void xen_spin_unlock_slow(struct xen_spinlock *xl)
+static void xen_unlock_kick(struct arch_spinlock *lock, __ticket_t next)
 {
 	int cpu;
 
 	ADD_STATS(released_slow, 1);
 
-	for_each_online_cpu(cpu) {
-		/* XXX should mix up next cpu selection */
-		if (per_cpu(lock_spinners, cpu) == xl) {
+	for_each_cpu(cpu, &waiting_cpus) {
+		const struct xen_lock_waiting *w = &per_cpu(lock_waiting, cpu);
+
+		if (w->lock == lock && w->want == next) {
 			ADD_STATS(released_slow_kicked, 1);
 			xen_send_IPI_one(cpu, XEN_SPIN_UNLOCK_VECTOR);
 			break;
@@ -320,28 +163,6 @@ static noinline void xen_spin_unlock_slow(struct xen_spinlock *xl)
 	}
 }
 
-static void xen_spin_unlock(struct arch_spinlock *lock)
-{
-	struct xen_spinlock *xl = (struct xen_spinlock *)lock;
-
-	ADD_STATS(released, 1);
-
-	smp_wmb();		/* make sure no writes get moved after unlock */
-	xl->lock = 0;		/* release lock */
-
-	/*
-	 * Make sure unlock happens before checking for waiting
-	 * spinners.  We need a strong barrier to enforce the
-	 * write-read ordering to different memory locations, as the
-	 * CPU makes no implied guarantees about their ordering.
-	 */
-	mb();
-
-	if (unlikely(xl->spinners))
-		xen_spin_unlock_slow(xl);
-}
-#endif
-
 static irqreturn_t dummy_handler(int irq, void *dev_id)
 {
 	BUG();
@@ -376,14 +197,8 @@ void xen_uninit_lock_cpu(int cpu)
 
 void __init xen_init_spinlocks(void)
 {
-#if 0
-	pv_lock_ops.spin_is_locked = xen_spin_is_locked;
-	pv_lock_ops.spin_is_contended = xen_spin_is_contended;
-	pv_lock_ops.spin_lock = xen_spin_lock;
-	pv_lock_ops.spin_lock_flags = xen_spin_lock_flags;
-	pv_lock_ops.spin_trylock = xen_spin_trylock;
-	pv_lock_ops.spin_unlock = xen_spin_unlock;
-#endif
+	pv_lock_ops.lock_spinning = xen_lock_spinning;
+	pv_lock_ops.unlock_kick = xen_unlock_kick;
 }
 
 #ifdef CONFIG_XEN_DEBUG_FS
@@ -401,37 +216,21 @@ static int __init xen_spinlock_debugfs(void)
 
 	debugfs_create_u8("zero_stats", 0644, d_spin_debug, &zero_stats);
 
-	debugfs_create_u32("timeout", 0644, d_spin_debug, &lock_timeout);
-
-	debugfs_create_u64("taken", 0444, d_spin_debug, &spinlock_stats.taken);
 	debugfs_create_u32("taken_slow", 0444, d_spin_debug,
 			   &spinlock_stats.taken_slow);
-	debugfs_create_u32("taken_slow_nested", 0444, d_spin_debug,
-			   &spinlock_stats.taken_slow_nested);
 	debugfs_create_u32("taken_slow_pickup", 0444, d_spin_debug,
 			   &spinlock_stats.taken_slow_pickup);
 	debugfs_create_u32("taken_slow_spurious", 0444, d_spin_debug,
 			   &spinlock_stats.taken_slow_spurious);
-	debugfs_create_u32("taken_slow_irqenable", 0444, d_spin_debug,
-			   &spinlock_stats.taken_slow_irqenable);
 
-	debugfs_create_u64("released", 0444, d_spin_debug, &spinlock_stats.released);
 	debugfs_create_u32("released_slow", 0444, d_spin_debug,
 			   &spinlock_stats.released_slow);
 	debugfs_create_u32("released_slow_kicked", 0444, d_spin_debug,
 			   &spinlock_stats.released_slow_kicked);
 
-	debugfs_create_u64("time_spinning", 0444, d_spin_debug,
-			   &spinlock_stats.time_spinning);
 	debugfs_create_u64("time_blocked", 0444, d_spin_debug,
 			   &spinlock_stats.time_blocked);
-	debugfs_create_u64("time_total", 0444, d_spin_debug,
-			   &spinlock_stats.time_total);
 
-	xen_debugfs_create_u32_array("histo_total", 0444, d_spin_debug,
-				     spinlock_stats.histo_spin_total, HISTO_BUCKETS + 1);
-	xen_debugfs_create_u32_array("histo_spinning", 0444, d_spin_debug,
-				     spinlock_stats.histo_spin_spinning, HISTO_BUCKETS + 1);
 	xen_debugfs_create_u32_array("histo_blocked", 0444, d_spin_debug,
 				     spinlock_stats.histo_spin_blocked, HISTO_BUCKETS + 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 Wed Oct 12 18:05:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 18:05:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE9ja-0002qx-5t; Wed, 12 Oct 2011 18:05:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Wd-0007vM-03
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:55 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318467110!35029232!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22613 invoked from network); 13 Oct 2011 00:51:51 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-10.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 00:51:51 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 54B3B8F8D;
	Wed, 12 Oct 2011 17:51:49 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 47B312115C; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:40 -0700
Message-Id: <79ae0a17bf2b10eb8d89102ede53b6c2d08dfe94.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V5 08/11] x86/pvticketlock: when
	paravirtualizing ticket locks, increment by 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

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Increment ticket head/tails by 2 rather than 1 to leave the LSB free
to store a "is in slowpath state" bit.  This halves the number
of possible CPUs for a given ticket size, but this shouldn't matter
in practice - kernels built for 32k+ CPU systems are probably
specially built for the hardware rather than a generic distro
kernel.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/include/asm/spinlock.h       |   10 +++++-----
 arch/x86/include/asm/spinlock_types.h |   10 +++++++++-
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h
index f0d6a59..dd155f7 100644
--- a/arch/x86/include/asm/spinlock.h
+++ b/arch/x86/include/asm/spinlock.h
@@ -78,7 +78,7 @@ static __always_inline void __ticket_unlock_kick(struct arch_spinlock *lock, __t
  */
 static __always_inline void arch_spin_lock(struct arch_spinlock *lock)
 {
-	register struct __raw_tickets inc = { .tail = 1 };
+	register struct __raw_tickets inc = { .tail = TICKET_LOCK_INC };
 
 	inc = xadd(&lock->tickets, inc);
 
@@ -104,7 +104,7 @@ static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
 	if (old.tickets.head != old.tickets.tail)
 		return 0;
 
-	new.head_tail = old.head_tail + (1 << TICKET_SHIFT);
+	new.head_tail = old.head_tail + (TICKET_LOCK_INC << TICKET_SHIFT);
 
 	/* cmpxchg is a full barrier, so nothing can move before it */
 	return cmpxchg(&lock->head_tail, old.head_tail, new.head_tail) == old.head_tail;
@@ -112,9 +112,9 @@ static __always_inline int arch_spin_trylock(arch_spinlock_t *lock)
 
 static __always_inline void arch_spin_unlock(arch_spinlock_t *lock)
 {
-	__ticket_t next = lock->tickets.head + 1;
+	__ticket_t next = lock->tickets.head + TICKET_LOCK_INC;
 
-	__add(&lock->tickets.head, 1, UNLOCK_LOCK_PREFIX);
+	__add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX);
 	__ticket_unlock_kick(lock, next);
 }
 
@@ -129,7 +129,7 @@ static inline int arch_spin_is_contended(arch_spinlock_t *lock)
 {
 	struct __raw_tickets tmp = ACCESS_ONCE(lock->tickets);
 
-	return ((tmp.tail - tmp.head) & TICKET_MASK) > 1;
+	return ((tmp.tail - tmp.head) & TICKET_MASK) > TICKET_LOCK_INC;
 }
 #define arch_spin_is_contended	arch_spin_is_contended
 
diff --git a/arch/x86/include/asm/spinlock_types.h b/arch/x86/include/asm/spinlock_types.h
index dbe223d..aa9a205 100644
--- a/arch/x86/include/asm/spinlock_types.h
+++ b/arch/x86/include/asm/spinlock_types.h
@@ -3,7 +3,13 @@
 
 #include <linux/types.h>
 
-#if (CONFIG_NR_CPUS < 256)
+#ifdef CONFIG_PARAVIRT_SPINLOCKS
+#define __TICKET_LOCK_INC	2
+#else
+#define __TICKET_LOCK_INC	1
+#endif
+
+#if (CONFIG_NR_CPUS < (256 / __TICKET_LOCK_INC))
 typedef u8  __ticket_t;
 typedef u16 __ticketpair_t;
 #else
@@ -11,6 +17,8 @@ typedef u16 __ticket_t;
 typedef u32 __ticketpair_t;
 #endif
 
+#define TICKET_LOCK_INC	((__ticket_t)__TICKET_LOCK_INC)
+
 #define TICKET_SHIFT	(sizeof(__ticket_t) * 8)
 #define TICKET_MASK	((__ticket_t)((1 << TICKET_SHIFT) - 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 Wed Oct 12 18:09:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 18:09:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE9n8-0003Gp-JF; Wed, 12 Oct 2011 18:08:59 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Wd-0007vP-7R
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:56 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-15.tower-216.messagelabs.com!1318467110!777357!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17724 invoked from network); 13 Oct 2011 00:51:52 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-15.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 00:51:52 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id C59528F91;
	Wed, 12 Oct 2011 17:51:49 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 5539E21160; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:42 -0700
Message-Id: <33ca794b624865721ef86b341411aec97069ad43.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V5 10/11] xen/pvticketlock: allow interrupts
	to be enabled while blocking
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

If interrupts were enabled when taking the spinlock, we can leave them
enabled while blocking to get the lock.

If we can enable interrupts while waiting for the lock to become
available, and we take an interrupt before entering the poll,
and the handler takes a spinlock which ends up going into
the slow state (invalidating the per-cpu "lock" and "want" values),
then when the interrupt handler returns the event channel will
remain pending so the poll will return immediately, causing it to
return out to the main spinlock loop.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/xen/spinlock.c |   48 ++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 41 insertions(+), 7 deletions(-)

diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 0a552ec..fc506e6 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -106,11 +106,28 @@ static void xen_lock_spinning(struct arch_spinlock *lock, __ticket_t want)
 
 	start = spin_time_start();
 
-	/* Make sure interrupts are disabled to ensure that these
-	   per-cpu values are not overwritten. */
+	/*
+	 * Make sure an interrupt handler can't upset things in a
+	 * partially setup state.
+	 */
 	local_irq_save(flags);
 
+	/*
+	 * We don't really care if we're overwriting some other
+	 * (lock,want) pair, as that would mean that we're currently
+	 * in an interrupt context, and the outer context had
+	 * interrupts enabled.  That has already kicked the VCPU out
+	 * of xen_poll_irq(), so it will just return spuriously and
+	 * retry with newly setup (lock,want).
+	 *
+	 * The ordering protocol on this is that the "lock" pointer
+	 * may only be set non-NULL if the "want" ticket is correct.
+	 * If we're updating "want", we must first clear "lock".
+	 */
+	w->lock = NULL;
+	smp_wmb();
 	w->want = want;
+	smp_wmb();
 	w->lock = lock;
 
 	/* This uses set_bit, which atomic and therefore a barrier */
@@ -124,21 +141,36 @@ static void xen_lock_spinning(struct arch_spinlock *lock, __ticket_t want)
 	/* Only check lock once pending cleared */
 	barrier();
 
-	/* Mark entry to slowpath before doing the pickup test to make
-	   sure we don't deadlock with an unlocker. */
+	/*
+	 * Mark entry to slowpath before doing the pickup test to make
+	 * sure we don't deadlock with an unlocker.
+	 */
 	__ticket_enter_slowpath(lock);
 
-	/* check again make sure it didn't become free while
-	   we weren't looking  */
+	/*
+	 * check again make sure it didn't become free while
+	 * we weren't looking 
+	 */
 	if (ACCESS_ONCE(lock->tickets.head) == want) {
 		ADD_STATS(taken_slow_pickup, 1);
 		goto out;
 	}
 
+	/* Allow interrupts while blocked */
+	local_irq_restore(flags);
+
+	/*
+	 * If an interrupt happens here, it will leave the wakeup irq
+	 * pending, which will cause xen_poll_irq() to return
+	 * immediately.
+	 */
+
 	/* Block until irq becomes pending (or perhaps a spurious wakeup) */
 	xen_poll_irq(irq);
 	ADD_STATS(taken_slow_spurious, !xen_test_irq_pending(irq));
 
+	local_irq_save(flags);
+
 	kstat_incr_irqs_this_cpu(irq, irq_to_desc(irq));
 
 out:
@@ -160,7 +192,9 @@ static void xen_unlock_kick(struct arch_spinlock *lock, __ticket_t next)
 	for_each_cpu(cpu, &waiting_cpus) {
 		const struct xen_lock_waiting *w = &per_cpu(lock_waiting, cpu);
 
-		if (w->lock == lock && w->want == next) {
+		/* Make sure we read lock before want */
+		if (ACCESS_ONCE(w->lock) == lock &&
+		    ACCESS_ONCE(w->want) == next) {
 			ADD_STATS(released_slow_kicked, 1);
 			xen_send_IPI_one(cpu, XEN_SPIN_UNLOCK_VECTOR);
 			break;
-- 
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 Oct 12 18:11:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 18:11:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE9pU-0003gW-ES; Wed, 12 Oct 2011 18:11:24 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9Wd-0007vQ-DL
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:56 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318467110!21048810!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23819 invoked from network); 13 Oct 2011 00:51:52 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-15.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 00:51:52 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 3BCD08F93;
	Wed, 12 Oct 2011 17:51:50 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 5AE4921161; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:43 -0700
Message-Id: <600bd2872f3265a393a46ad96942f93a4467b062.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V5 11/11] xen: enable PV ticketlocks on HVM
	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

From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/xen/smp.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index 4dec905..2d01aeb 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -552,4 +552,5 @@ void __init xen_hvm_smp_init(void)
 	smp_ops.cpu_die = xen_hvm_cpu_die;
 	smp_ops.send_call_func_ipi = xen_smp_send_call_function_ipi;
 	smp_ops.send_call_func_single_ipi = xen_smp_send_call_function_single_ipi;
+	xen_init_spinlocks();
 }
-- 
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 Oct 12 18:13:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 18:13:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RE9rX-000468-HW; Wed, 12 Oct 2011 18:13:31 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RE9We-0007vf-Eb
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 17:51:56 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318467111!21358508!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11267 invoked from network); 13 Oct 2011 00:51:53 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 00:51:53 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3006:a1ff:fe6a:48be])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id EF72A8F95;
	Wed, 12 Oct 2011 17:51:50 -0700 (PDT)
Received: by saboo.goop.org (Postfix, from userid 500)
	id 42E222115B; Wed, 12 Oct 2011 17:51:45 -0700 (PDT)
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Wed, 12 Oct 2011 17:51:39 -0700
Message-Id: <3c2d4b131254f8e6565f4e8c7a0427d06f244b01.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH RFC V5 07/11] x86/pvticketlock: use callee-save
	for lock_spinning
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

Although the lock_spinning calls in the spinlock code are on the
uncommon path, their presence can cause the compiler to generate many
more register save/restores in the function pre/postamble, which is in
the fast path.  To avoid this, convert it to using the pvops callee-save
calling convention, which defers all the save/restores until the actual
function is called, keeping the fastpath clean.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
---
 arch/x86/include/asm/paravirt.h       |    2 +-
 arch/x86/include/asm/paravirt_types.h |    2 +-
 arch/x86/kernel/paravirt-spinlocks.c  |    2 +-
 arch/x86/xen/spinlock.c               |    3 ++-
 4 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h
index 76cae7a..50281c7 100644
--- a/arch/x86/include/asm/paravirt.h
+++ b/arch/x86/include/asm/paravirt.h
@@ -752,7 +752,7 @@ static inline void __set_fixmap(unsigned /* enum fixed_addresses */ idx,
 
 static __always_inline void __ticket_lock_spinning(struct arch_spinlock *lock, __ticket_t ticket)
 {
-	PVOP_VCALL2(pv_lock_ops.lock_spinning, lock, ticket);
+	PVOP_VCALLEE2(pv_lock_ops.lock_spinning, lock, ticket);
 }
 
 static __always_inline void ____ticket_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
diff --git a/arch/x86/include/asm/paravirt_types.h b/arch/x86/include/asm/paravirt_types.h
index 005e24d..5e0c138 100644
--- a/arch/x86/include/asm/paravirt_types.h
+++ b/arch/x86/include/asm/paravirt_types.h
@@ -330,7 +330,7 @@ struct arch_spinlock;
 #include <asm/spinlock_types.h>
 
 struct pv_lock_ops {
-	void (*lock_spinning)(struct arch_spinlock *lock, __ticket_t ticket);
+	struct paravirt_callee_save lock_spinning;
 	void (*unlock_kick)(struct arch_spinlock *lock, __ticket_t ticket);
 };
 
diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c
index c2e010e..4251c1d 100644
--- a/arch/x86/kernel/paravirt-spinlocks.c
+++ b/arch/x86/kernel/paravirt-spinlocks.c
@@ -9,7 +9,7 @@
 
 struct pv_lock_ops pv_lock_ops = {
 #ifdef CONFIG_SMP
-	.lock_spinning = paravirt_nop,
+	.lock_spinning = __PV_IS_CALLEE_SAVE(paravirt_nop),
 	.unlock_kick = paravirt_nop,
 #endif
 };
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index 1e21c99..431d231 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -145,6 +145,7 @@ out:
 
 	spin_time_accum_blocked(start);
 }
+PV_CALLEE_SAVE_REGS_THUNK(xen_lock_spinning);
 
 static void xen_unlock_kick(struct arch_spinlock *lock, __ticket_t next)
 {
@@ -204,7 +205,7 @@ void __init xen_init_spinlocks(void)
 		return;
 	}
 
-	pv_lock_ops.lock_spinning = xen_lock_spinning;
+	pv_lock_ops.lock_spinning = PV_CALLEE_SAVE(xen_lock_spinning);
 	pv_lock_ops.unlock_kick = xen_unlock_kick;
 }
 
-- 
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 Oct 12 18:25:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 18:25:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REA2f-0004um-S9; Wed, 12 Oct 2011 18:25:01 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REA1p-0004fw-4E
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 18:24:09 -0700
X-Env-Sender: james.harper@bendigoit.com.au
X-Msg-Ref: server-16.tower-216.messagelabs.com!1318469042!776151!1
X-Originating-IP: [203.16.224.4]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18472 invoked from network); 13 Oct 2011 01:24:05 -0000
Received: from smtp1.bendigoit.com.au (HELO smtp1.bendigoit.com.au)
	(203.16.224.4)
	by server-16.tower-216.messagelabs.com with AES256-SHA encrypted SMTP;
	13 Oct 2011 01:24:05 -0000
Received: from mail.bendigoit.com.au ([203.16.207.99])
	by smtp1.bendigoit.com.au with esmtp (Exim 4.69)
	(envelope-from <james.harper@bendigoit.com.au>)
	id 1REA1e-0003yh-2Y; Thu, 13 Oct 2011 12:23:58 +1100
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
X-MimeOLE: Produced By Microsoft Exchange V6.5
Date: Thu, 13 Oct 2011 12:23:57 +1100
Message-ID: <AEC6C66638C05B468B556EA548C1A77D01E5E5C2@trantor>
In-Reply-To: <4E959A57.208@hfp.de>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: Stability GPLPV - new test results
Thread-Index: AcyI5XzwrJ/8KO2cQXGQvBFZOuVCeQAYN3QQ
References: <4E959A57.208@hfp.de>
From: "James Harper" <james.harper@bendigoit.com.au>
To: "Andreas Kinzler" <ml-xen-devel@hfp.de>,
	<xen-devel@lists.xensource.com>
X-Really-From-Bendigo-IT: magichashvalue
Cc: 
Subject: [Xen-devel] RE: Stability GPLPV - new test results
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 James,
>=20
> something quite interesting happened during my stability tests. GPLPV
> 0.11.0.213 which I consider stable, showed the same hang as the newer
> GPLPV versions. I now try to find out why even the stable 0.11.0.213
hangs
> when it was and is stable on our production systems. There are 3
possible
> causes: Xen 4.1.1 vs Xen 4.0.1, dom0 2.6.32.36 vs 2.6.32.18 and CPU
Xeon E3-
> 1230 vs Xeon X3450 [and board X9SCM-F vs. X8SIL-F].
>=20
> The attached log show debugkeys for the hang. I find lines 64-66 quite
> interesting where is shows that there is an event channel upcall
pending on
> the hung VM2, no problems on VM1 (line 52-54). Could that be a hint to
the
> real problem?
>=20

Could be, or it could just be a side effect - eg the machine has hung
and can't process any further events that come through.

One thing I thought of... virtualisation gives an interesting
opportunity to exaggerate race conditions. If you have 8 vCPU's in a
DomU but only let one or two physical CPUs service those 8 vCPU's, then
it can give rise to race conditions which could only be rarely seen (or
never seen) in normal operation. It's awful for performance but if you
could try that and see if it gives rise to crashes a bit more frequently
it might help us track down the problem.

Thanks

James


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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 19:51:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 19:51:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REBOE-0007Sq-5w; Wed, 12 Oct 2011 19:51:22 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REBNL-0007Fk-3c
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 19:50:27 -0700
X-Env-Sender: james.harper@bendigoit.com.au
X-Msg-Ref: server-15.tower-174.messagelabs.com!1318474220!28692626!1
X-Originating-IP: [203.16.207.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11673 invoked from network); 13 Oct 2011 02:50:23 -0000
Received: from mail.bendigoit.com.au (HELO smtp2.bendigoit.com.au)
	(203.16.207.99)
	by server-15.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	13 Oct 2011 02:50:23 -0000
Received: from trantor.int.sbss.com.au ([192.168.200.206]
	helo=mail.bendigoit.com.au)
	by smtp2.bendigoit.com.au with esmtp (Exim 4.72)
	(envelope-from <james.harper@bendigoit.com.au>)
	id 1REBN6-0000VC-Kl; Thu, 13 Oct 2011 13:50:12 +1100
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
X-MimeOLE: Produced By Microsoft Exchange V6.5
Subject: RE: [Xen-devel] [PATCH RFC V5 00/11] Paravirtualized ticketlocks
Date: Thu, 13 Oct 2011 13:50:12 +1100
Message-ID: <AEC6C66638C05B468B556EA548C1A77D01E5E5CA@trantor>
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: [Xen-devel] [PATCH RFC V5 00/11] Paravirtualized ticketlocks
Thread-Index: AcyJQpw52njk7j3FTUi55AHRQL/vEwAD+QZw
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
From: "James Harper" <james.harper@bendigoit.com.au>
To: "Jeremy Fitzhardinge" <jeremy@goop.org>
X-Really-From-Bendigo-IT: magichashvalue
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

>=20
> Thoughts? Comments? Suggestions?
>=20

I am lead to believe that Hyper-V guests provide some sort of spinlock
notification (a commit to KVM seems to suggest it). Has that been
considered at all here, if such notification can be exposed to Xen?

James

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

From xen-devel-bounces@lists.xensource.com Wed Oct 12 23:42:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 12 Oct 2011 23:42:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REF0B-0004o0-4u; Wed, 12 Oct 2011 23:42:47 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REEzK-0004ar-Hj
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 23:41:54 -0700
X-Env-Sender: K.Brink@cs.ru.nl
X-Msg-Ref: server-5.tower-216.messagelabs.com!1318488111!801480!1
X-Originating-IP: [131.174.16.143]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23511 invoked from network); 13 Oct 2011 06:41:51 -0000
Received: from smeltpunt.science.ru.nl (HELO smeltpunt.science.ru.nl)
	(131.174.16.143)
	by server-5.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 06:41:51 -0000
Received: from squirrel.science.ru.nl (wacht.science.ru.nl [131.174.30.22])
	by smeltpunt.science.ru.nl (8.13.7/5.31) with ESMTP id p9D6fdux021068; 
	Thu, 13 Oct 2011 08:41:39 +0200 (MEST)
Received: from 80.187.209.68 (SquirrelMail authenticated user kbrink)
	by squirrel.science.ru.nl with HTTP; Thu, 13 Oct 2011 08:41:39 +0200
Message-ID: <d854b40af2f092d5d99539253e578f09.squirrel@squirrel.science.ru.nl>
In-Reply-To: <20111013003832.GR4326@type.famille.thibault.fr>
References: <20111012204011.GA7518@lilo2.science.ru.nl>
	<20111013003832.GR4326@type.famille.thibault.fr>
Date: Thu, 13 Oct 2011 08:41:39 +0200
Subject: Re: [Xen-devel] pv-grub Solaris support
From: "Kasper Brink" <K.Brink@cs.ru.nl>
To: "Samuel Thibault" <samuel.thibault@ens-lyon.org>
User-Agent: SquirrelMail/1.4.20-2.fc11
MIME-Version: 1.0
Content-Type: text/plain;charset=iso-8859-1
Content-Transfer-Encoding: 8bit
X-Priority: 3 (Normal)
Importance: Normal
X-Spam-Score: -1.364 () ALL_TRUSTED,AWL,BAYES_50
X-Scanned-By: MIMEDefang 2.63 on 131.174.16.143
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

>> The attached patch has been tested with various
>> Solaris versions (Solaris 11 Express, OpenIndiana 151a, OpenSolaris 134,
>> Nexenta Core 3.0.1; all 64-bit). I appreciate your feedback.
>
> Could you also check that Linux configurations also still work?

Sure, I'll post the results here later.

Kasper


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 00:06:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 00:06:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REFMv-0006Cn-Ih; Thu, 13 Oct 2011 00:06:18 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REFJs-0005xX-Rw
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:03:24 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318489381!803477!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24944 invoked from network); 13 Oct 2011 07:03:03 -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; 13 Oct 2011 07:03:03 -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 521D794C0;
	Thu, 13 Oct 2011 00:03:01 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 7ED5C20258;
	Thu, 13 Oct 2011 00:03:00 -0700 (PDT)
Message-ID: <4E968D24.8040509@goop.org>
Date: Thu, 13 Oct 2011 00:03:00 -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: James Harper <james.harper@bendigoit.com.au>
Subject: Re: [Xen-devel] [PATCH RFC V5 00/11] Paravirtualized ticketlocks
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<AEC6C66638C05B468B556EA548C1A77D01E5E5CA@trantor>
In-Reply-To: <AEC6C66638C05B468B556EA548C1A77D01E5E5CA@trantor>
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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/12/2011 07:50 PM, James Harper wrote:
>> Thoughts? Comments? Suggestions?
>>
> I am lead to believe that Hyper-V guests provide some sort of spinlock
> notification (a commit to KVM seems to suggest it). Has that been
> considered at all here, if such notification can be exposed to Xen?
>

Yes, that's basically what this series is about: a mechanism for Linux
to tell Xen "I'm stuck in a spinlock".

    J

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 00:09:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 00:09:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REFPr-0006hx-HB; Thu, 13 Oct 2011 00:09:20 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REFLO-0005zQ-GA
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:04:47 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1318489478!35063862!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6747 invoked from network); 13 Oct 2011 07:04:39 -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; 13 Oct 2011 07:04:39 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 08:04:38 +0100
Message-Id: <4E96A9A4020000780005B077@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 08:04:36 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Christopher S. Aker" <caker@theshore.net>
Subject: Re: [Xen-devel] Xen 4 occasionally hangs during boot
References: <4E95EBD6.7010400@theshore.net>
In-Reply-To: <4E95EBD6.7010400@theshore.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
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 12.10.11 at 21:34, "Christopher S. Aker" <caker@theshore.net> =
wrote:
> Since I started playing with Xen 4 (vs 3.x), machines often hang =
during=20
> reboot at exactly the same place:

Do those machines have something in common hardware-wise? As you
would certainly assume, this isn't a problem generally, and hence telling
us on what hardware you observe this might help guessing... Also, any
chance you could try recent -unstable?

Jan

>=20
> 	(XEN) HVM: Hardware Assisted Paging detected.
> 	(
>=20
> ... and then nothing.  I have to RPC bounce them.  On some occasions =
it=20
> takes four or five attempts to get beyond this point.  A normal boot=20
> looks like this:
>=20
> 	(XEN) HVM: Hardware Assisted Paging detected.
> 	(XEN) Brought up 16 CPUs
>=20
> 4.1.2-rc @ 23159.  All of the Xen 4.x I've tried have done this, but =
I'd=20
> need to dig up which ones those are.
>=20
> -Chris
>=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 Oct 13 00:16:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 00:16:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REFXF-0007Bs-4V; Thu, 13 Oct 2011 00:16:57 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REFWi-0006zP-JN
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:16:24 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318490181!19298205!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19512 invoked from network); 13 Oct 2011 07:16:21 -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; 13 Oct 2011 07:16:21 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 08:16:20 +0100
Message-Id: <4E96AC64020000780005B08A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 08:16:20 +0100
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] constify vcpu_set_affinity()'s second parameter
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

None of the callers actually make use of the function's returning of
the old affinity through its second parameter, and eliminating this
capability allows some callers to no longer use a local variable here,
reducing their stack footprint significantly when building with large
NR_CPUS.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/cpu/mcheck/vmce.c
+++ b/xen/arch/x86/cpu/mcheck/vmce.c
@@ -304,7 +304,6 @@ int vmce_wrmsr(u32 msr, u64 val)
 int inject_vmce(struct domain *d)
 {
     int cpu =3D smp_processor_id();
-    cpumask_t affinity;
=20
     /* PV guest and HVM guest have different vMCE# injection methods. */
     if ( !test_and_set_bool(d->vcpu[0]->mce_pending) )
@@ -323,11 +322,9 @@ int inject_vmce(struct domain *d)
             {
                 cpumask_copy(d->vcpu[0]->cpu_affinity_tmp,
                              d->vcpu[0]->cpu_affinity);
-                cpus_clear(affinity);
-                cpu_set(cpu, affinity);
                 mce_printk(MCE_VERBOSE, "MCE: CPU%d set affinity, old =
%d\n",
                            cpu, d->vcpu[0]->processor);
-                vcpu_set_affinity(d->vcpu[0], &affinity);
+                vcpu_set_affinity(d->vcpu[0], cpumask_of(cpu));
                 vcpu_kick(d->vcpu[0]);
             }
             else
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -3113,7 +3113,6 @@ static void nmi_mce_softirq(void)
 {
     int cpu =3D smp_processor_id();
     struct softirq_trap *st =3D &per_cpu(softirq_trap, cpu);
-    cpumask_t affinity;
=20
     BUG_ON(st =3D=3D NULL);
     BUG_ON(st->vcpu =3D=3D NULL);
@@ -3129,9 +3128,7 @@ static void nmi_mce_softirq(void)
          * Make sure to wakeup the vcpu on the
          * specified processor.
          */
-        cpus_clear(affinity);
-        cpu_set(st->processor, affinity);
-        vcpu_set_affinity(st->vcpu, &affinity);
+        vcpu_set_affinity(st->vcpu, cpumask_of(st->processor));
=20
         /* Affinity is restored in the iret hypercall. */
     }
@@ -3201,14 +3198,11 @@ void async_exception_cleanup(struct vcpu
                  !test_and_set_bool(curr->mce_pending) )
             {
                 int cpu =3D smp_processor_id();
-                cpumask_t affinity;
=20
                 cpumask_copy(curr->cpu_affinity_tmp, curr->cpu_affinity);
-                cpus_clear(affinity);
-                cpu_set(cpu, affinity);
                 printk(XENLOG_DEBUG "MCE: CPU%d set affinity, old %d\n",
                        cpu, curr->processor);
-                vcpu_set_affinity(curr, &affinity);
+                vcpu_set_affinity(curr, cpumask_of(cpu));
             }
         }
     }
--- a/xen/common/schedule.c
+++ b/xen/common/schedule.c
@@ -587,9 +587,9 @@ int cpu_disable_scheduler(unsigned int c
     return ret;
 }
=20
-int vcpu_set_affinity(struct vcpu *v, cpumask_t *affinity)
+int vcpu_set_affinity(struct vcpu *v, const cpumask_t *affinity)
 {
-    cpumask_t online_affinity, old_affinity;
+    cpumask_t online_affinity;
     cpumask_t *online;
=20
     if ( v->domain->is_pinned )
@@ -601,9 +601,7 @@ int vcpu_set_affinity(struct vcpu *v, cp
=20
     vcpu_schedule_lock_irq(v);
=20
-    cpumask_copy(&old_affinity, v->cpu_affinity);
     cpumask_copy(v->cpu_affinity, affinity);
-    cpumask_copy(affinity, &old_affinity);
     if ( !cpumask_test_cpu(v->processor, v->cpu_affinity) )
         set_bit(_VPF_migrating, &v->pause_flags);
=20
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -617,7 +617,7 @@ void scheduler_free(struct scheduler *sc
 int schedule_cpu_switch(unsigned int cpu, struct cpupool *c);
 void vcpu_force_reschedule(struct vcpu *v);
 int cpu_disable_scheduler(unsigned int cpu);
-int vcpu_set_affinity(struct vcpu *v, cpumask_t *affinity);
+int vcpu_set_affinity(struct vcpu *v, const cpumask_t *affinity);
=20
 void vcpu_runstate_get(struct vcpu *v, struct vcpu_runstate_info =
*runstate);
 uint64_t get_cpu_idle_time(unsigned int cpu);




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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 00:22:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 00:22:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REFcn-0007eR-6B; Thu, 13 Oct 2011 00:22:41 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REFbs-0007RZ-Lu
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:21:44 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318490486!44032839!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12073 invoked from network); 13 Oct 2011 07:21:27 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 07:21:27 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 08:21:40 +0100
Message-Id: <4E96ADA3020000780005B093@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 08:21:39 +0100
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] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 IDTs being exactly a page in size, using xmalloc() here is rather
inefficient, as this requires double the amount to be allocated (with
almost an entire page wasted). For hot plugged CPUs, this at once
eliminates one more non-order-zero runtime allocation.

For x86-32, however, the IDT is exactly half a page, so allocating a
full page seems wasteful here, so it continues to use xmalloc() as
before.

With most of the affected functions' bodies now being inside #ifdef-s,
it might be reasonable to split those parts out into subarch-specific
code...

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -639,9 +639,6 @@ static void cpu_smpboot_free(unsigned in
 {
     unsigned int order;
=20
-    xfree(idt_tables[cpu]);
-    idt_tables[cpu] =3D NULL;
-
     order =3D get_order_from_pages(NR_RESERVED_GDT_PAGES);
 #ifdef __x86_64__
     if ( per_cpu(compat_gdt_table, cpu) )
@@ -650,10 +647,15 @@ static void cpu_smpboot_free(unsigned in
         free_domheap_pages(virt_to_page(per_cpu(compat_gdt_table, cpu)),
                            order);
     per_cpu(compat_gdt_table, cpu) =3D NULL;
+    order =3D get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
+    if ( idt_tables[cpu] )
+        free_domheap_pages(virt_to_page(idt_tables[cpu]), order);
 #else
     free_xenheap_pages(per_cpu(gdt_table, cpu), order);
+    xfree(idt_tables[cpu]);
 #endif
     per_cpu(gdt_table, cpu) =3D NULL;
+    idt_tables[cpu] =3D NULL;
=20
     if ( stack_base[cpu] !=3D NULL )
     {
@@ -691,19 +693,25 @@ static int cpu_smpboot_alloc(unsigned in
     if ( !page )
         goto oom;
     per_cpu(gdt_table, cpu) =3D gdt =3D page_to_virt(page);
+    order =3D get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
+    page =3D alloc_domheap_pages(NULL, order,
+                               MEMF_node(cpu_to_node(cpu)));
+    if ( !page )
+        goto oom;
+    idt_tables[cpu] =3D page_to_virt(page);
 #else
     per_cpu(gdt_table, cpu) =3D gdt =3D alloc_xenheap_pages(order, 0);
     if ( !gdt )
         goto oom;
+    idt_tables[cpu] =3D xmalloc_array(idt_entry_t, IDT_ENTRIES);
+    if ( idt_tables[cpu] =3D=3D NULL )
+        goto oom;
 #endif
     memcpy(gdt, boot_cpu_gdt_table,
            NR_RESERVED_GDT_PAGES * PAGE_SIZE);
     BUILD_BUG_ON(NR_CPUS > 0x10000);
     gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a =3D cpu;
=20
-    idt_tables[cpu] =3D xmalloc_array(idt_entry_t, IDT_ENTRIES);
-    if ( idt_tables[cpu] =3D=3D NULL )
-        goto oom;
     memcpy(idt_tables[cpu], idt_table,
            IDT_ENTRIES*sizeof(idt_entry_t));
=20




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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 00:28:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 00: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 1REFiW-00086w-S7; Thu, 13 Oct 2011 00:28:37 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REFht-0007u3-6A
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:27:57 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318490859!44033891!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3940 invoked from network); 13 Oct 2011 07:27:39 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 07:27:39 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 08:27:53 +0100
Message-Id: <4E96AF16020000780005B0A0@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 08:27:50 +0100
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] xmalloc: return unused full pages on multi-page
	allocations
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Certain (boot time) allocations are relatively large (particularly when
building with high NR_CPUS), but can also happen to be pretty far away
from a power-of-two size. Utilize the page allocator's (other than
Linux'es) capability of allowing to return space from higher-order
allocations in smaller pieces to return the unused parts immediately.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/xmalloc_tlsf.c
+++ b/xen/common/xmalloc_tlsf.c
@@ -527,13 +527,21 @@ static void xmalloc_pool_put(void *p)
 static void *xmalloc_whole_pages(unsigned long size)
 {
     struct bhdr *b;
-    unsigned int pageorder =3D get_order_from_bytes(size + BHDR_OVERHEAD);=

+    unsigned int i, pageorder =3D get_order_from_bytes(size + BHDR_OVERHEA=
D);
+    char *p;
=20
     b =3D alloc_xenheap_pages(pageorder, 0);
     if ( b =3D=3D NULL )
         return NULL;
=20
-    b->size =3D (1 << (pageorder + PAGE_SHIFT));
+    b->size =3D PAGE_ALIGN(size + BHDR_OVERHEAD);
+    for ( p =3D (char *)b + b->size, i =3D 0; i < pageorder; ++i )
+        if ( (unsigned long)p & (PAGE_SIZE << i) )
+        {
+            free_xenheap_pages(p, i);
+            p +=3D PAGE_SIZE << i;
+        }
+
     return (void *)b->ptr.buffer;
 }
=20
@@ -611,7 +619,20 @@ void xfree(void *p)
     }
=20
     if ( b->size >=3D PAGE_SIZE )
-        free_xenheap_pages((void *)b, get_order_from_bytes(b->size));
+    {
+        unsigned int i, order =3D get_order_from_bytes(b->size);
+
+        BUG_ON((unsigned long)b & ((PAGE_SIZE << order) - 1));
+        for ( i =3D 0; ; ++i )
+        {
+            if ( !(b->size & (PAGE_SIZE << i)) )
+                continue;
+            b->size -=3D PAGE_SIZE << i;
+            free_xenheap_pages((void *)b + b->size, i);
+            if ( i + 1 >=3D order )
+                break;
+        }
+    }
     else
         xmem_pool_free(p, xenpool);
 }




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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 00:46:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 00:46:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REFzr-0001HU-2s; Thu, 13 Oct 2011 00:46:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REFzB-00014X-Cw
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:45:50 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1318491946!21946031!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20806 invoked from network); 13 Oct 2011 07:45:46 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 07:45:46 -0000
Received: by wwf27 with SMTP id 27so985842wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 00:45:46 -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=mkIKOt83aDIdFB/tQtm2ji/2cLiuG7pr4u1SXB3/Zm4=;
	b=U6CPXeQs/vakCgS8YSoc8rIGAPF6MXiaeELdVlXHusCeOH8nkHzSwF7XjmiXBI5rsa
	3inPFL9jBFa9GLlQ27YKIrGG8iRC1R7CeYz4WEW/Wbc3tkku64Q6cN9sT+DJHf5msr5R
	7SXlPKa6xNHqNYzCpO97FviDd7/3Z7/oTnr2Y=
Received: by 10.216.229.80 with SMTP id g58mr3537322weq.43.1318491946131;
	Thu, 13 Oct 2011 00:45:46 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id n21sm4448833wbp.2.2011.10.13.00.45.43
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 00:45:45 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 08:45:39 +0100
Subject: Re: [Xen-devel] [PATCH] constify vcpu_set_affinity()'s second
	parameter
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CABC55B3.3275A%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] constify vcpu_set_affinity()'s second
	parameter
Thread-Index: AcyJfBngSJV8xlxumEaTHeiaY38Mkw==
In-Reply-To: <4E96AC64020000780005B08A@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

Acked-by: Keir Fraser <keir@xen.org>

On 13/10/2011 08:16, "Jan Beulich" <JBeulich@suse.com> wrote:

> None of the callers actually make use of the function's returning of
> the old affinity through its second parameter, and eliminating this
> capability allows some callers to no longer use a local variable here,
> reducing their stack footprint significantly when building with large
> NR_CPUS.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> --- a/xen/arch/x86/cpu/mcheck/vmce.c
> +++ b/xen/arch/x86/cpu/mcheck/vmce.c
> @@ -304,7 +304,6 @@ int vmce_wrmsr(u32 msr, u64 val)
>  int inject_vmce(struct domain *d)
>  {
>      int cpu = smp_processor_id();
> -    cpumask_t affinity;
>  
>      /* PV guest and HVM guest have different vMCE# injection methods. */
>      if ( !test_and_set_bool(d->vcpu[0]->mce_pending) )
> @@ -323,11 +322,9 @@ int inject_vmce(struct domain *d)
>              {
>                  cpumask_copy(d->vcpu[0]->cpu_affinity_tmp,
>                               d->vcpu[0]->cpu_affinity);
> -                cpus_clear(affinity);
> -                cpu_set(cpu, affinity);
>                  mce_printk(MCE_VERBOSE, "MCE: CPU%d set affinity, old %d\n",
>                             cpu, d->vcpu[0]->processor);
> -                vcpu_set_affinity(d->vcpu[0], &affinity);
> +                vcpu_set_affinity(d->vcpu[0], cpumask_of(cpu));
>                  vcpu_kick(d->vcpu[0]);
>              }
>              else
> --- a/xen/arch/x86/traps.c
> +++ b/xen/arch/x86/traps.c
> @@ -3113,7 +3113,6 @@ static void nmi_mce_softirq(void)
>  {
>      int cpu = smp_processor_id();
>      struct softirq_trap *st = &per_cpu(softirq_trap, cpu);
> -    cpumask_t affinity;
>  
>      BUG_ON(st == NULL);
>      BUG_ON(st->vcpu == NULL);
> @@ -3129,9 +3128,7 @@ static void nmi_mce_softirq(void)
>           * Make sure to wakeup the vcpu on the
>           * specified processor.
>           */
> -        cpus_clear(affinity);
> -        cpu_set(st->processor, affinity);
> -        vcpu_set_affinity(st->vcpu, &affinity);
> +        vcpu_set_affinity(st->vcpu, cpumask_of(st->processor));
>  
>          /* Affinity is restored in the iret hypercall. */
>      }
> @@ -3201,14 +3198,11 @@ void async_exception_cleanup(struct vcpu
>                   !test_and_set_bool(curr->mce_pending) )
>              {
>                  int cpu = smp_processor_id();
> -                cpumask_t affinity;
>  
>                  cpumask_copy(curr->cpu_affinity_tmp, curr->cpu_affinity);
> -                cpus_clear(affinity);
> -                cpu_set(cpu, affinity);
>                  printk(XENLOG_DEBUG "MCE: CPU%d set affinity, old %d\n",
>                         cpu, curr->processor);
> -                vcpu_set_affinity(curr, &affinity);
> +                vcpu_set_affinity(curr, cpumask_of(cpu));
>              }
>          }
>      }
> --- a/xen/common/schedule.c
> +++ b/xen/common/schedule.c
> @@ -587,9 +587,9 @@ int cpu_disable_scheduler(unsigned int c
>      return ret;
>  }
>  
> -int vcpu_set_affinity(struct vcpu *v, cpumask_t *affinity)
> +int vcpu_set_affinity(struct vcpu *v, const cpumask_t *affinity)
>  {
> -    cpumask_t online_affinity, old_affinity;
> +    cpumask_t online_affinity;
>      cpumask_t *online;
>  
>      if ( v->domain->is_pinned )
> @@ -601,9 +601,7 @@ int vcpu_set_affinity(struct vcpu *v, cp
>  
>      vcpu_schedule_lock_irq(v);
>  
> -    cpumask_copy(&old_affinity, v->cpu_affinity);
>      cpumask_copy(v->cpu_affinity, affinity);
> -    cpumask_copy(affinity, &old_affinity);
>      if ( !cpumask_test_cpu(v->processor, v->cpu_affinity) )
>          set_bit(_VPF_migrating, &v->pause_flags);
>  
> --- a/xen/include/xen/sched.h
> +++ b/xen/include/xen/sched.h
> @@ -617,7 +617,7 @@ void scheduler_free(struct scheduler *sc
>  int schedule_cpu_switch(unsigned int cpu, struct cpupool *c);
>  void vcpu_force_reschedule(struct vcpu *v);
>  int cpu_disable_scheduler(unsigned int cpu);
> -int vcpu_set_affinity(struct vcpu *v, cpumask_t *affinity);
> +int vcpu_set_affinity(struct vcpu *v, const cpumask_t *affinity);
>  
>  void vcpu_runstate_get(struct vcpu *v, struct vcpu_runstate_info *runstate);
>  uint64_t get_cpu_idle_time(unsigned 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 Thu Oct 13 00:47:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 00:47:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REG18-0001fl-Ib; Thu, 13 Oct 2011 00:47:50 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REFzW-0001AU-0j
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:46:10 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1318491966!17082462!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11111 invoked from network); 13 Oct 2011 07:46:07 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 07:46:07 -0000
Received: by wyh13 with SMTP id 13so1851715wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 00:46:06 -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=s6v4thR02UetvuAJEWPSpHH0m/1FtL5/5sbMkHFl/40=;
	b=VvTKwLAlTZSzedLZ5RWg6bZaJdEts7W9rP/Twne8bFGF5DqjmSyB9Q5oqR4tfq/Z04
	LVPHBJsrvQOD2P923z2iU8qmX0w99g/Y+qYEdOAjbCvFvj12QjCzw9vdnsMdbSkUS1ly
	j2zaGANxXpgfYUhd/N9r8QioLpx6+3rw9jI60=
Received: by 10.227.55.2 with SMTP id s2mr850204wbg.56.1318491966755;
	Thu, 13 Oct 2011 00:46:06 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id j18sm4437654wbo.6.2011.10.13.00.46.02
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 00:46:05 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 08:46:00 +0100
Subject: Re: [Xen-devel] [PATCH] xmalloc: return unused full pages on
	multi-page allocations
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CABC55C8.3275B%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] xmalloc: return unused full pages on
	multi-page allocations
Thread-Index: AcyJfCZkbEMBNWLm5kyTsCMcXQbWbw==
In-Reply-To: <4E96AF16020000780005B0A0@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 13/10/2011 08:27, "Jan Beulich" <JBeulich@suse.com> wrote:

> Certain (boot time) allocations are relatively large (particularly when
> building with high NR_CPUS), but can also happen to be pretty far away
> from a power-of-two size. Utilize the page allocator's (other than
> Linux'es) capability of allowing to return space from higher-order
> allocations in smaller pieces to return the unused parts immediately.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/common/xmalloc_tlsf.c
> +++ b/xen/common/xmalloc_tlsf.c
> @@ -527,13 +527,21 @@ static void xmalloc_pool_put(void *p)
>  static void *xmalloc_whole_pages(unsigned long size)
>  {
>      struct bhdr *b;
> -    unsigned int pageorder = get_order_from_bytes(size + BHDR_OVERHEAD);
> +    unsigned int i, pageorder = get_order_from_bytes(size + BHDR_OVERHEAD);
> +    char *p;
>  
>      b = alloc_xenheap_pages(pageorder, 0);
>      if ( b == NULL )
>          return NULL;
>  
> -    b->size = (1 << (pageorder + PAGE_SHIFT));
> +    b->size = PAGE_ALIGN(size + BHDR_OVERHEAD);
> +    for ( p = (char *)b + b->size, i = 0; i < pageorder; ++i )
> +        if ( (unsigned long)p & (PAGE_SIZE << i) )
> +        {
> +            free_xenheap_pages(p, i);
> +            p += PAGE_SIZE << i;
> +        }
> +
>      return (void *)b->ptr.buffer;
>  }
>  
> @@ -611,7 +619,20 @@ void xfree(void *p)
>      }
>  
>      if ( b->size >= PAGE_SIZE )
> -        free_xenheap_pages((void *)b, get_order_from_bytes(b->size));
> +    {
> +        unsigned int i, order = get_order_from_bytes(b->size);
> +
> +        BUG_ON((unsigned long)b & ((PAGE_SIZE << order) - 1));
> +        for ( i = 0; ; ++i )
> +        {
> +            if ( !(b->size & (PAGE_SIZE << i)) )
> +                continue;
> +            b->size -= PAGE_SIZE << i;
> +            free_xenheap_pages((void *)b + b->size, i);
> +            if ( i + 1 >= order )
> +                break;
> +        }
> +    }
>      else
>          xmem_pool_free(p, xenpool);
>  }
> 
> 
> 
> 
> _______________________________________________
> 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 Oct 13 00:52:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 00:52:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REG5I-00027F-5a; Thu, 13 Oct 2011 00:52:08 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REG4I-0001uD-3x
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:51:06 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1318492263!17083295!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26534 invoked from network); 13 Oct 2011 07:51:03 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 07:51:03 -0000
Received: by wyh13 with SMTP id 13so1856789wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 00:51:02 -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=Lvo+rIMDb4d5Rh4M7pyBwBeZmbFNrm+zUDJH8Ip+t4U=;
	b=ZDrjUsO/PFNlitOKLTlcPCYI6ilGyk3zxJZDRRv+z9o5IC6JuP3er8CDUXjpKtlHYr
	2+vS7OYPEEJ3g2pYPLjeVC/6qtLFXYiUoFIOCDKRbwrPlnKs83d/cH9uGUJFYjbCymLS
	IEAIZU0AbSDazBDkMV5gVPJEfi0Vtcpla+D+8=
Received: by 10.227.155.84 with SMTP id r20mr829964wbw.107.1318492262845;
	Thu, 13 Oct 2011 00:51:02 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id fy13sm4413875wbb.18.2011.10.13.00.51.01
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 00:51:02 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 08:50:53 +0100
Subject: Re: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CABC56ED.3276A%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
Thread-Index: AcyJfNUJHvFSXjMQm0aMwAU/cZA69g==
In-Reply-To: <4E96ADA3020000780005B093@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 13/10/2011 08:21, "Jan Beulich" <JBeulich@suse.com> wrote:

> The IDTs being exactly a page in size, using xmalloc() here is rather
> inefficient, as this requires double the amount to be allocated (with
> almost an entire page wasted). For hot plugged CPUs, this at once
> eliminates one more non-order-zero runtime allocation.
> 
> For x86-32, however, the IDT is exactly half a page, so allocating a
> full page seems wasteful here, so it continues to use xmalloc() as
> before.
> 
> With most of the affected functions' bodies now being inside #ifdef-s,
> it might be reasonable to split those parts out into subarch-specific
> code...

Well, there is also opportunity for code merging. There is generally no
reason for x86-64 to use alloc_domheap_pages where x86-32 uses
alloc_xenheap_pages (e.g., for allocating per_cpu(gdt_table)) -- both
architectures can use alloc_xenheap_pages in this case.

Also we might get rid of some further ifdef'ery if we added an alloc/free
interface where *both* functions take a size parameter. We could then decide
whether to use xmalloc or alloc_xenheap_pages dynamically based on that
parameter. Knowing size on free would allow us to easily free such
allocations too.

Finally, I'm not sure about more x86-64 code movement: I'd like to kill
x86-32 entirely really.

Anyway, despite all this...

> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/arch/x86/smpboot.c
> +++ b/xen/arch/x86/smpboot.c
> @@ -639,9 +639,6 @@ static void cpu_smpboot_free(unsigned in
>  {
>      unsigned int order;
>  
> -    xfree(idt_tables[cpu]);
> -    idt_tables[cpu] = NULL;
> -
>      order = get_order_from_pages(NR_RESERVED_GDT_PAGES);
>  #ifdef __x86_64__
>      if ( per_cpu(compat_gdt_table, cpu) )
> @@ -650,10 +647,15 @@ static void cpu_smpboot_free(unsigned in
>          free_domheap_pages(virt_to_page(per_cpu(compat_gdt_table, cpu)),
>                             order);
>      per_cpu(compat_gdt_table, cpu) = NULL;
> +    order = get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
> +    if ( idt_tables[cpu] )
> +        free_domheap_pages(virt_to_page(idt_tables[cpu]), order);
>  #else
>      free_xenheap_pages(per_cpu(gdt_table, cpu), order);
> +    xfree(idt_tables[cpu]);
>  #endif
>      per_cpu(gdt_table, cpu) = NULL;
> +    idt_tables[cpu] = NULL;
>  
>      if ( stack_base[cpu] != NULL )
>      {
> @@ -691,19 +693,25 @@ static int cpu_smpboot_alloc(unsigned in
>      if ( !page )
>          goto oom;
>      per_cpu(gdt_table, cpu) = gdt = page_to_virt(page);
> +    order = get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
> +    page = alloc_domheap_pages(NULL, order,
> +                               MEMF_node(cpu_to_node(cpu)));
> +    if ( !page )
> +        goto oom;
> +    idt_tables[cpu] = page_to_virt(page);
>  #else
>      per_cpu(gdt_table, cpu) = gdt = alloc_xenheap_pages(order, 0);
>      if ( !gdt )
>          goto oom;
> +    idt_tables[cpu] = xmalloc_array(idt_entry_t, IDT_ENTRIES);
> +    if ( idt_tables[cpu] == NULL )
> +        goto oom;
>  #endif
>      memcpy(gdt, boot_cpu_gdt_table,
>             NR_RESERVED_GDT_PAGES * PAGE_SIZE);
>      BUILD_BUG_ON(NR_CPUS > 0x10000);
>      gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a = cpu;
>  
> -    idt_tables[cpu] = xmalloc_array(idt_entry_t, IDT_ENTRIES);
> -    if ( idt_tables[cpu] == NULL )
> -        goto oom;
>      memcpy(idt_tables[cpu], idt_table,
>             IDT_ENTRIES*sizeof(idt_entry_t));
>  
> 
> 
> 
> 
> _______________________________________________
> 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 Oct 13 00:56:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 00:56:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REG9E-0002df-JR; Thu, 13 Oct 2011 00:56:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REG8d-0002QV-SK
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:55:36 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318492509!52990611!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16002 invoked from network); 13 Oct 2011 07:55:09 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-6.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 07:55:09 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 08:55:32 +0100
Message-Id: <4E96B593020000780005B0CE@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 08:55:31 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
References: <4E96ADA3020000780005B093@nat28.tlf.novell.com>
	<CABC56ED.3276A%keir@xen.org>
In-Reply-To: <CABC56ED.3276A%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 13.10.11 at 09:50, Keir Fraser <keir@xen.org> wrote:
> Finally, I'm not sure about more x86-64 code movement: I'd like to kill
> x86-32 entirely really.

I know, but you got pushed back each time you tried...

Jan


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 01:00:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 01:00:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REGDX-00036l-OG; Thu, 13 Oct 2011 01:00:39 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REGB8-0002sB-3a
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:58:11 -0700
X-Env-Sender: maillists.shan@gmail.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1318492685!28721545!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8165 invoked from network); 13 Oct 2011 07:58:07 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 07:58:07 -0000
Received: by qabg14 with SMTP id g14so2097239qab.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 00:58:05 -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:content-transfer-encoding;
	bh=MxxKYvFCzH2yFlHhBPAz5A2ZwcB6ycnKjAtf1LeKJq0=;
	b=QGIq25SW79/Fm+yRuSFr/seV/gruZyNwd7TjM8ONP/enxm8rL0rUJIRH2gwxeQVzdu
	fNsQ3QB/xSZzQj/0DpK/LTGZadI+ENxTxCDaU4Rt3nn4wQi0QK9IW6GxoNC+aIA7zuHs
	3d2oFgqKI2R2HDqbCFfR14kyot+FderaIacqI=
MIME-Version: 1.0
Received: by 10.68.1.230 with SMTP id 6mr7309018pbp.27.1318492685254; Thu, 13
	Oct 2011 00:58:05 -0700 (PDT)
Received: by 10.142.154.21 with HTTP; Thu, 13 Oct 2011 00:58:05 -0700 (PDT)
In-Reply-To: <CAB0B40B.31C70%keir@xen.org>
References: <4E8B0AE60200007800059289@nat28.tlf.novell.com>
	<CAB0B40B.31C70%keir@xen.org>
Date: Thu, 13 Oct 2011 15:58:05 +0800
Message-ID: <CAFQ2Z+eJXbgBrL3bw21LVQRoaq3GkCP76DPYmaQ+4Dt4_qMq8g@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] VMX: extend last branch MSR info to cover
	newer CPU models
From: Haitao Shan <maillists.shan@gmail.com>
To: Keir Fraser <keir@xen.org>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: "Nakajima, Jun" <jun.nakajima@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Donald D Dugger <donald.d.dugger@intel.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

Hi, Keir, Jan,

I will ACK to Jan's patch.
Concernng Jan's question, I am not sure whether the specific model is
NHM or SNB. But I can confirm they are all NHM/SNB. I think this is
not important to last branch record, though.

Shan Haitao

2011/10/4 Keir Fraser <keir@xen.org>:
> On 04/10/2011 12:32, "Jan Beulich" <JBeulich@suse.com> wrote:
>
>> There are still a couple of family 6 models missing here: 37, 44, 46,
>> and 47 (according to SDM doc changes May 2011); presumably they would
>> all go into the Nehalem/Sandy Bridge group. Intel?
>>
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>
> A nod or Ack from someone at Intel would be nice for this patch.
>
> =A0-- Keir
>
>> --- a/xen/arch/x86/hvm/vmx/vmx.c
>> +++ b/xen/arch/x86/hvm/vmx/vmx.c
>> @@ -1693,6 +1693,20 @@ static const struct lbr_info {
>> =A0 =A0 =A0{ MSR_C2_LASTBRANCH_0_FROM_IP, =A0NUM_MSR_C2_LASTBRANCH_FROM_=
TO },
>> =A0 =A0 =A0{ MSR_C2_LASTBRANCH_0_TO_IP, =A0 =A0NUM_MSR_C2_LASTBRANCH_FRO=
M_TO },
>> =A0 =A0 =A0{ 0, 0 }
>> +}, nh_lbr[] =3D {
>> + =A0 =A0{ MSR_IA32_LASTINTFROMIP, =A0 =A0 =A0 1 },
>> + =A0 =A0{ MSR_IA32_LASTINTTOIP, =A0 =A0 =A0 =A0 1 },
>> + =A0 =A0{ MSR_C2_LASTBRANCH_TOS, =A0 =A0 =A0 =A01 },
>> + =A0 =A0{ MSR_P4_LASTBRANCH_0_FROM_LIP, NUM_MSR_P4_LASTBRANCH_FROM_TO }=
,
>> + =A0 =A0{ MSR_P4_LASTBRANCH_0_TO_LIP, =A0 NUM_MSR_P4_LASTBRANCH_FROM_TO=
 },
>> + =A0 =A0{ 0, 0 }
>> +}, at_lbr[] =3D {
>> + =A0 =A0{ MSR_IA32_LASTINTFROMIP, =A0 =A0 =A0 1 },
>> + =A0 =A0{ MSR_IA32_LASTINTTOIP, =A0 =A0 =A0 =A0 1 },
>> + =A0 =A0{ MSR_C2_LASTBRANCH_TOS, =A0 =A0 =A0 =A01 },
>> + =A0 =A0{ MSR_C2_LASTBRANCH_0_FROM_IP, =A0NUM_MSR_ATOM_LASTBRANCH_FROM_=
TO },
>> + =A0 =A0{ MSR_C2_LASTBRANCH_0_TO_IP, =A0 =A0NUM_MSR_ATOM_LASTBRANCH_FRO=
M_TO },
>> + =A0 =A0{ 0, 0 }
>> =A0#ifdef __i386__
>> =A0}, pm_lbr[] =3D {
>> =A0 =A0 =A0{ MSR_IA32_LASTINTFROMIP, =A0 =A0 =A0 1 },
>> @@ -1720,8 +1734,20 @@ static const struct lbr_info *last_branc
>> =A0#endif
>> =A0 =A0 =A0 =A0 =A0/* Core2 Duo */
>> =A0 =A0 =A0 =A0 =A0case 15:
>> + =A0 =A0 =A0 =A0/* Enhanced Core */
>> + =A0 =A0 =A0 =A0case 23:
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0return c2_lbr;
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0break;
>> + =A0 =A0 =A0 =A0/* Nehalem */
>> + =A0 =A0 =A0 =A0case 26: case 30: case 31: case 46:
>> + =A0 =A0 =A0 =A0/* Sandy Bridge */
>> + =A0 =A0 =A0 =A0case 42: case 45:
>> + =A0 =A0 =A0 =A0 =A0 =A0return nh_lbr;
>> + =A0 =A0 =A0 =A0 =A0 =A0break;
>> + =A0 =A0 =A0 =A0/* Atom */
>> + =A0 =A0 =A0 =A0case 28:
>> + =A0 =A0 =A0 =A0 =A0 =A0return at_lbr;
>> + =A0 =A0 =A0 =A0 =A0 =A0break;
>> =A0 =A0 =A0 =A0 =A0}
>> =A0 =A0 =A0 =A0 =A0break;
>>
>> --- a/xen/include/asm-x86/msr-index.h
>> +++ b/xen/include/asm-x86/msr-index.h
>> @@ -472,11 +472,12 @@
>> =A0#define MSR_PM_LASTBRANCH_0 =A00x00000040
>> =A0#define NUM_MSR_PM_LASTBRANCH =A08
>>
>> -/* Core 2 last-branch recording */
>> +/* Core 2 and Atom last-branch recording */
>> =A0#define MSR_C2_LASTBRANCH_TOS =A00x000001c9
>> =A0#define MSR_C2_LASTBRANCH_0_FROM_IP 0x00000040
>> =A0#define MSR_C2_LASTBRANCH_0_TO_IP 0x00000060
>> =A0#define NUM_MSR_C2_LASTBRANCH_FROM_TO 4
>> +#define NUM_MSR_ATOM_LASTBRANCH_FROM_TO 8
>>
>> =A0/* Intel Core-based CPU performance counters */
>> =A0#define MSR_CORE_PERF_FIXED_CTR0 0x00000309
>>
>>
>>
>>
>> _______________________________________________
>> 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 Oct 13 01:03:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 01:03:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REGGh-0003WB-1g; Thu, 13 Oct 2011 01:03:55 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REGCS-0002uv-KC
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:59:36 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318492769!820162!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16348 invoked from network); 13 Oct 2011 07:59:29 -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;
	13 Oct 2011 07:59:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315180800"; 
   d="scan'208";a="8361724"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 07:59:29 +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, 13 Oct 2011 08:59:29 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 13 Oct 2011 08:59:28 +0100
In-Reply-To: <50850daec7f0486ee7ca.1318457568@localhost6.localdomain6>
References: <patchbomb.1318457565@localhost6.localdomain6>
	<50850daec7f0486ee7ca.1318457568@localhost6.localdomain6>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318492769.21903.788.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"JBeulich@suse.com" <JBeulich@suse.com>
Subject: [Xen-devel] Re: [PATCH 3 of 3] interface: add 'discard-secure' and
 BLKIF_DISCARD_SECURE
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-12 at 23:12 +0100, Konrad Rzeszutek Wilk wrote:
> # HG changeset patch
> # User Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> # Date 1318457231 14400
> # Node ID 50850daec7f0486ee7ca69b3d4cb58b4d340a5a7
> # Parent  15c2d70dbac3e31c2d74b6700e1bb5f8a7d8256e
> interface: add 'discard-secure' and BLKIF_DISCARD_SECURE
> 
> Alter the 'reserved' uint8_t to be used a 'flag'. We use only for
> one flag: BLKIF_DISCARD_SECURE.
> 
> That flag can only be set if the backend has set 'discard-secure' to one.
> If backend has not set 'discard-secure' to one, that flag will have no
> effect.
> 
> Acked-by: Jan Beulich <JBeulich@suse.com>
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> 
> diff -r 15c2d70dbac3 -r 50850daec7f0 xen/include/public/io/blkif.h
> --- a/xen/include/public/io/blkif.h	Wed Oct 12 18:07:07 2011 -0400
> +++ b/xen/include/public/io/blkif.h	Wed Oct 12 18:07:11 2011 -0400
> @@ -107,7 +107,7 @@
>   *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
>   * http://www.seagate.com/staticfiles/support/disc/manuals/
>   *     Interface%20manuals/100293068c.pdf
> - * The backend can optionally provide two extra XenBus attributes to
> + * The backend can optionally provide three extra XenBus attributes to
                                         these

avoids patching (or more likely forgetting to patch) this line every
time we add an attribute.

>   * further optimize the discard functionality:
>   * 'discard-aligment' - Devices that support discard functionality may
>   * internally allocate space in units that are bigger than the exported
> @@ -119,6 +119,9 @@
>   * size. The discard-granularity parameter indicates the size of the internal
>   * allocation unit in bytes if reported by the device. Otherwise the
>   * discard-granularity will be set to match the device's physical block size.
> + * 'discard-secure' - All copies of the discarded sectors (potentially created
> + * by garbage collection) must also be erased.  To use this feature, the flag
> + * BLKIF_DISCARD_SECURE must be set in the blkif_request_trim.

Stray "trim" here.

>   */
>  #define BLKIF_OP_DISCARD           5

It just occurred to me that if reusing the reserved field is going to
prove a problem we could have had BLKIF_OP_DISCARD_SECURE. I think we've
got things under control though.

>  
> @@ -159,7 +162,8 @@ typedef struct blkif_request blkif_reque
>   */
>  struct blkif_request_discard {
>      uint8_t        operation;    /* BLKIF_OP_DISCARD                     */
> -    uint8_t        reserved;     /*                                      */
> +    uint8_t        flag;         /* BLKIF_DISCARD_SECURE or zero         */
> +#define BLKIF_DISCARD_SECURE (1<<0)  /* ignored if discard-secure=0      */
>      blkif_vdev_t   handle;       /* same as for read/write requests      */
>      uint64_t       id;           /* private guest value, echoed in resp  */
>      blkif_sector_t sector_number;/* start sector idx on disk             */
> 
> 



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 01:07:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 01:07:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REGJg-0003va-Nb; Thu, 13 Oct 2011 01:07:00 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REGD6-00032P-CR
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 01:00:14 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318492809!812843!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16647 invoked from network); 13 Oct 2011 08:00:09 -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;
	13 Oct 2011 08:00:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315180800"; 
   d="scan'208";a="8361750"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 08:00:07 +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, 13 Oct 2011 09:00:07 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 13 Oct 2011 09:00:07 +0100
In-Reply-To: <15c2d70dbac3e31c2d74.1318457567@localhost6.localdomain6>
References: <patchbomb.1318457565@localhost6.localdomain6>
	<15c2d70dbac3e31c2d74.1318457567@localhost6.localdomain6>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318492807.21903.789.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"JBeulich@suse.com" <JBeulich@suse.com>
Subject: [Xen-devel] Re: [PATCH 2 of 3] interface: Flesh out the
 BLKIF_OP_DISCARD 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

Thanks for splitting these out.

On Wed, 2011-10-12 at 23:12 +0100, Konrad Rzeszutek Wilk wrote:
[...]
> + * The backend can optionally provide two extra XenBus attributes to
> + * further optimize the discard functionality:
> + * 'discard-aligment' - Devices that support discard functionality may
> + * internally allocate space in units that are bigger than the exported
> + * logical block size. The discard-alignment parameter indicates how many bytes
> + * the beginning of the partition is offset from the internal allocation unit's
> + * natural alignment.

So this is to account for the case where a physical device can discard
e.g. 128K blocks at a time but the VBD (a better term than "partition"
in the context, I think) starts at e.g. offset 64K within that
underlying device?

Does this mean that the virtual device can discard the first 64K (and
thereafter in 128K chunks), or that it cannot because that would overlap
the first 64K of that block which belongs to something else? Or that it
can try but it may or may not succeed. What about if the secure flag is
set? 

Could we simplify and say that blkback won't expose discard support
unless the underlying block device is correctly aligned for it? i.e.
encourage people to align their underlying storage correctly? Presumably
doing that has other benefits?

> + * 'discard-granularity'  - Devices that support discard functionality may
> + * internally allocate space using units that are bigger than the logical block
> + * size. The discard-granularity parameter indicates the size of the internal
> + * allocation unit in bytes if reported by the device. Otherwise the
> + * discard-granularity will be set to match the device's physical block size.

This is effectively the minimum size you can discard? (modulo the
sub-block at the front arising from discard-alignment).

Presumably the granularity sized blocks are self aligned to that same ?
(again modulo the sub-block at the beginning).

Would there be any benefit to having both these numbers in logical-block
sized units instead of bytes? The rest of the interface typically uses
sectors/segments.

Ian.

>   */
>  #define BLKIF_OP_DISCARD           5
>  
> 
> 



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 01:17:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 01: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 1REGTT-0004TL-BM; Thu, 13 Oct 2011 01:17:07 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REGSG-0004FV-Fm
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 01:15:54 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318493749!21397542!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30239 invoked from network); 13 Oct 2011 08:15:49 -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;
	13 Oct 2011 08:15:49 -0000
Received: by wwf27 with SMTP id 27so1021328wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 01:15:49 -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=gBQODl8f/SseloixiIqrbrIAkvlcaI4zzKmPljnhJ2U=;
	b=mZZWJK4fHwcZ+iVieIQ72y/nsHCgaRdBoLhx0rUdd2mN3sYGuROXc7enQH0t3oo8hy
	DlTTRTHHdcV/ZUK4FQf4T6ZaBNVtTc3Z9FNrWihfsAYq6cJqdbLyVDx3gCRLE67VGUXn
	A9ubmvlYkh7C5Z1IW3UzAfxRKl1NQJ6hpnRVk=
Received: by 10.216.131.193 with SMTP id m43mr809061wei.114.1318493748867;
	Thu, 13 Oct 2011 01:15:48 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id i29sm4506788wbp.22.2011.10.13.01.15.47
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 01:15:48 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 09:15:41 +0100
Subject: Re: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CABC5CBD.32774%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
Thread-Index: AcyJgEvzwfjejcjH2Ea+70ftE5uFBw==
In-Reply-To: <4E96B593020000780005B0CE@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/10/2011 08:55, "Jan Beulich" <JBeulich@suse.com> wrote:

>>>> On 13.10.11 at 09:50, Keir Fraser <keir@xen.org> wrote:
>> Finally, I'm not sure about more x86-64 code movement: I'd like to kill
>> x86-32 entirely really.
> 
> I know, but you got pushed back each time you tried...

I think we're stuck with it for 4.2. Will try again when we open development
for 4.3. The argument last time was the low-powered Atoms, used in low-end
netbooks; but there's no evidence that anyone is using Xen on such
platforms. I can't imagine it would be very worthwhile.

 -- 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 Oct 13 01:19:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 01:19:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REGVj-0004sB-0b; Thu, 13 Oct 2011 01:19:27 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REGV1-0004fH-Tc
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 01:18:44 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1318493899!48521082!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18249 invoked from network); 13 Oct 2011 08:18:20 -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; 13 Oct 2011 08:18:20 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 09:18:40 +0100
Message-Id: <4E96BAFE020000780005B101@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 09:18:38 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Haitao Shan" <maillists.shan@gmail.com>
Subject: Re: [Xen-devel] [PATCH] VMX: extend last branch MSR info to
	cover newer CPU models
References: <4E8B0AE60200007800059289@nat28.tlf.novell.com>
	<CAB0B40B.31C70%keir@xen.org>
	<CAFQ2Z+eJXbgBrL3bw21LVQRoaq3GkCP76DPYmaQ+4Dt4_qMq8g@mail.gmail.com>
In-Reply-To: <CAFQ2Z+eJXbgBrL3bw21LVQRoaq3GkCP76DPYmaQ+4Dt4_qMq8g@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>,
	Keir Fraser <keir@xen.org>, Jun Nakajima <jun.nakajima@intel.com>,
	Donald D Dugger <donald.d.dugger@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 13.10.11 at 09:58, Haitao Shan <maillists.shan@gmail.com> wrote:
> Concernng Jan's question, I am not sure whether the specific model is
> NHM or SNB. But I can confirm they are all NHM/SNB. I think this is
> not important to last branch record, though.

So this would be the follow-up patch then:

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 Oct 13 01:43:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 01:43:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REGtN-0006PA-Gt; Thu, 13 Oct 2011 01:43:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REGsc-0006D0-D2
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 01:43:07 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318495382!830276!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11944 invoked from network); 13 Oct 2011 08:43:03 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 08:43:03 -0000
Received: by qabg14 with SMTP id g14so2133142qab.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 01:43:02 -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=iEz8V1QpVMT3NEPFxHhSo9ACTuhzihm3NiDIbfc2eMM=;
	b=DZepE5qIoyzi5WTGOwZvk7IEspuebvH9lcFAm3XFrAI5kyxp3suE91wPXpU5rjKfyk
	7RgrTVlY5wSK+cw4S95Qb+5qJRmwt9V1SHvGaSMAUi+U2z6LI3S+7GnmWS1YkC2BtpoO
	IzC8Ze029HtDQ2gjn5+7pjn+zngZtO+xiT9lA=
MIME-Version: 1.0
Received: by 10.68.74.33 with SMTP id q1mr7308934pbv.71.1318495381117; Thu, 13
	Oct 2011 01:43:01 -0700 (PDT)
Received: by 10.142.225.20 with HTTP; Thu, 13 Oct 2011 01:43:01 -0700 (PDT)
In-Reply-To: <1318410713.21903.598.camel@zakaz.uk.xensource.com>
References: <2fb4bf8c16cd35ddc0bf.1318336005@loki>
	<1318410713.21903.598.camel@zakaz.uk.xensource.com>
Date: Thu, 13 Oct 2011 10:43:01 +0200
X-Google-Sender-Auth: DsArHWp44YFB2RTg_sleOZNdyFU
Message-ID: <CAPLaKK5QiyxxOL8XwTvEpFN1F7iJHOayFB2aqq3Vo=v3gBNyfw@mail.gmail.com>
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
Content-Transfer-Encoding: quoted-printable
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH] libxl: reimplement buffer for bootloading
 and drop data if buffer 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

2011/10/12 Ian Campbell <Ian.Campbell@citrix.com>:
> On Tue, 2011-10-11 at 13:26 +0100, Roger Pau Monne wrote:
>> # HG changeset patch
>> # User Roger Pau Monne <roger.pau@entel.upc.edu>
>> # Date 1318335991 -7200
>> # Node ID 2fb4bf8c16cd35ddc0bf7ddc7ff8fda4b9678211
>> # Parent =C2=A064f17c7e6c33e5f1c22711ae9cbdcbe191c20062
>> libxl: reimplement buffer for bootloading and drop data if buffer is ful=
l.
>>
>> Implement a buffer for the bootloading process that appends data to the =
end until it's full. Drop output from bootloader if a timeout has occurred =
and the buffer is full. Prevents the bootloader from getting stuck when usi=
ng ptys with small buffers.
>>
>> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
>>
>> diff -r 64f17c7e6c33 -r 2fb4bf8c16cd tools/libxl/libxl_bootloader.c
>> --- a/tools/libxl/libxl_bootloader.c =C2=A0Tue Oct 11 10:26:32 2011 +020=
0
>> +++ b/tools/libxl/libxl_bootloader.c =C2=A0Tue Oct 11 14:26:31 2011 +020=
0
>> @@ -21,6 +21,7 @@
>>
>> =C2=A0#include <sys/stat.h>
>> =C2=A0#include <sys/types.h>
>> +#include <sys/ioctl.h>
>>
>> =C2=A0#include "libxl.h"
>> =C2=A0#include "libxl_internal.h"
>> @@ -28,7 +29,8 @@
>> =C2=A0#include "flexarray.h"
>>
>> =C2=A0#define XENCONSOLED_BUF_SIZE 16
>> -#define BOOTLOADER_BUF_SIZE 1024
>> +#define BOOTLOADER_BUF_SIZE 4096
>> +#define BOOTLOADER_TIMEOUT 1
>>
>> =C2=A0static char **make_bootloader_args(libxl__gc *gc,
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 libxl_domain_build_=
info *info,
>> @@ -165,10 +167,11 @@ static pid_t fork_exec_bootloader(int *m
>> =C2=A0 */
>> =C2=A0static char * bootloader_interact(libxl__gc *gc, int xenconsoled_f=
d, int bootloader_fd, int fifo_fd)
>> =C2=A0{
>> - =C2=A0 =C2=A0int ret;
>> + =C2=A0 =C2=A0int ret, read_ahead, timeout =3D 0;
>>
>> =C2=A0 =C2=A0 =C2=A0size_t nr_out =3D 0, size_out =3D 0;
>> =C2=A0 =C2=A0 =C2=A0char *output =3D NULL;
>> + =C2=A0 =C2=A0struct timeval wait;
>>
>> =C2=A0 =C2=A0 =C2=A0/* input from xenconsole. read on xenconsoled_fd wri=
te to bootloader_fd */
>> =C2=A0 =C2=A0 =C2=A0int xenconsoled_prod =3D 0, xenconsoled_cons =3D 0;
>> @@ -177,6 +180,10 @@ static char * bootloader_interact(libxl_
>> =C2=A0 =C2=A0 =C2=A0int bootloader_prod =3D 0, bootloader_cons =3D 0;
>> =C2=A0 =C2=A0 =C2=A0char bootloader_buf[BOOTLOADER_BUF_SIZE];
>>
>> + =C2=A0 =C2=A0/* Set timeout to 1s before starting to discard data */
>> + =C2=A0 =C2=A0wait.tv_sec =3D BOOTLOADER_TIMEOUT;
>> + =C2=A0 =C2=A0wait.tv_usec =3D 0;
>
> There are some portability snaggles with the timeout argument to a
> select (IIRC Linux can modify it). I think it would be wise to
> reinitialise this right before each select call.

Yes, I didn't remember Linux can modify the timeout struct when
returning from select, fixed it.

>> +
>> =C2=A0 =C2=A0 =C2=A0while(1) {
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fd_set wsel, rsel;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int nfds;
>> @@ -185,15 +192,26 @@ static char * bootloader_interact(libxl_
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xenconsoled_prod =3D xen=
consoled_cons =3D 0;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod =3D=3D bootloader_=
cons)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bootloader_prod =3D boot=
loader_cons =3D 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Move buffers around to drop already cons=
umed data */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod > 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xenconsoled_prod -=3D xencons=
oled_cons;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memmove(xenconsoled_buf, &xen=
consoled_buf[xenconsoled_cons], xenconsoled_prod);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xenconsoled_cons =3D 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod > 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bootloader_prod -=3D bootload=
er_cons;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memmove(bootloader_buf, &boot=
loader_buf[bootloader_cons], bootloader_prod);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bootloader_cons =3D 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>
> If the timeout occurs then we will drop through and each of the FD_ISSET
> will fail and we will loop back round to the top and do this processing
> before trying again, which will ensure that xenconsoled_cons =3D=3D 0.
>
> I think this removes the need for the timeout var you added, as well as
> the associated continue statement and (I think) makes the control flow
> simpler.
>
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_ZERO(&rsel);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_SET(fifo_fd, &rsel);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D fifo_fd + 1;
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod =3D=3D 0 || (xenconsol=
ed_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons =3D=3D 0)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod =3D=3D 0 || (xenconsol=
ed_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons =3D=3D 0) || timeout) {
>
> If you've had a timeout there will be data pending on this FD won't
> there, so this change essentially means that after the first timeout the
> timeout on the select becomes effectively zero?

Well, I cannot know this for sure, but it's the most likely situation.

> Can you just make this:
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (xenconsoled_prod =3D=3D 0 || xenco=
nsoled_cons =3D=3D 0) {

I don't think there's any need for this pair of "ifs", since they will
always be hit, because xenconsoled_cons and bootloader_cons is always
0 at this point, I agree with you that this might be dropping data to
aggressively, since the timeout will not be needed. Something like
this might be more suitable:

if (bootloader_prod =3D=3D 0 || ret =3D=3D 0) {

The "timeout" variable is not really needed, I've just added it to
make the code cleaner and easier to understand, but ret can be used in
the same way. From my point of view, we should only add the file
descriptors with a full buffer to the select set after a timeout has
occurred, since checking for a timeout (ret =3D=3D 0) in the FD_ISSET may
make us enter an infinite loop (because there's data pending on the
file descriptor, and the timeout is not hit).

>
> The previous memmove will ensure we hit this case. Then inside the if
> FD_ISSET(xenconsoled_fd) you can check for prod =3D=3D BOOTLOADER_BUF_SIZ=
E
> and discard from the buffer (e.g. we can discard the tail just by
> modifying prod?).

We are discarding from the tail? I'm not sure it's the best way to do
it, pygrub uses curses control sequences, and I think it's best to try
to keep the stream as clean as possible, dropping the tail would
really mess up with screen printing (maybe just mess up a frame, but
the output will be rubbish).

> Hmm. that might discard a bit too aggressively, perhaps leaving this
> check as it was and doing the discard if (ret =3D=3D 0 && xenconsoled_pro=
d
> =3D=3D BOOTLOADER_BUF_SIZE) in the else clause if the FD_ISSET works?

This might make the select loop too fast, since we add all the
descriptors to the set, and it's a strong possibility that the timeout
will never be hit, so ret will never be 0 and we will be looping
forever.

>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_SET(xenconsoled_fd, &=
rsel);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D xenconsoled_fd =
+ 1 > nfds ? xenconsoled_fd + 1 : nfds;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod =3D=3D 0 || (bootloader=
_prod < BOOTLOADER_BUF_SIZE && bootloader_cons =3D=3D 0)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod =3D=3D 0 || (bootloader=
_prod < BOOTLOADER_BUF_SIZE && bootloader_cons =3D=3D 0) || timeout) {
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_SET(bootloader_fd, &r=
sel);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D bootloader_fd +=
 1 > nfds ? bootloader_fd + 1 : nfds;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> @@ -208,12 +226,23 @@ static char * bootloader_interact(libxl_
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D bootloader_fd +=
 1 > nfds ? bootloader_fd + 1 : nfds;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>>
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D select(nfds, &rsel, &wsel, NULL, NU=
LL);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D select(nfds, &rsel, &wsel, NULL, &w=
ait);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out_err;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret =3D=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0timeout =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=A0timeout =3D 0;
>>
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Input from xenconsole, read xencons=
oled_fd, write bootloader_fd */
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (FD_ISSET(xenconsoled_fd, &rsel)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod =3D=3D X=
ENCONSOLED_BUF_SIZE) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ioctl(xenco=
nsoled_fd, FIONREAD, &read_ahead) < 0)
>
> I think we can avoid this as described above, but if not then you need
> to be wary of the case where read_ahead > XENCONSOLED_BUF_SIZE.

Yes, I've also missed that one, this should be checked to avoid
passing a negative integer to read or moving memory regions outside of
the buffer.

>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0g=
oto out_err;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memmove(xencons=
oled_buf, &xenconsoled_buf[read_ahead], XENCONSOLED_BUF_SIZE - read_ahead);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xenconsoled_pro=
d -=3D read_ahead;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D read(xenconsoled=
_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled=
_prod);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0 && errno !=
=3D EIO && errno !=3D EAGAIN)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out_e=
rr;
>> @@ -230,6 +259,12 @@ static char * bootloader_interact(libxl_
>>
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Input from bootloader, read bootloa=
der_fd, write xenconsoled_fd */
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (FD_ISSET(bootloader_fd, &rsel)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod =3D=3D BO=
OTLOADER_BUF_SIZE) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ioctl(bootl=
oader_fd, FIONREAD, &read_ahead) < 0)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0g=
oto out_err;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memmove(bootloa=
der_buf, &bootloader_buf[read_ahead], BOOTLOADER_BUF_SIZE - read_ahead);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bootloader_prod=
 -=3D read_ahead;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D read(bootloader_=
fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod=
);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0 && errno !=
=3D EIO && errno !=3D EAGAIN)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out_e=
rr;
>
>
>

I'm wrapping another patch which I will send right now.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 01:58:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 01:58:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REH74-00078u-C5; Thu, 13 Oct 2011 01:58:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REH5t-0006tf-7I
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 01:56:50 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318496206!817952!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31910 invoked from network); 13 Oct 2011 08:56:46 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 08:56:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315180800"; 
   d="scan'208";a="8363436"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 08:56:46 +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, 13 Oct 2011 09:56:45 +0100
Subject: Re: [Xen-devel] [PATCH 1 of 6] [OCAML] Rename the ocaml libraries
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jon Ludlam <jonathan.ludlam@eu.citrix.com>
Date: Thu, 13 Oct 2011 09:56:44 +0100
In-Reply-To: <ffbc5e9929d52531a9ec.1317983159@snoosnoo2.uk.xensource.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
	<ffbc5e9929d52531a9ec.1317983159@snoosnoo2.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: <1318496205.21903.799.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

Bit late but:

On Fri, 2011-10-07 at 11:25 +0100, Jon Ludlam wrote:
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/Makefile
> --- a/tools/ocaml/libs/xb/Makefile
> +++ b/tools/ocaml/libs/xb/Makefile
> @@ -25,22 +26,30 @@
[...]
> +xenbus.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
> +       $(E) " CMX       $@"
> +       $(OCAMLOPT) -pack -o $@ $^
> +
> +xenbus.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
> +       $(E) " CMO       $@"
> +       $(OCAMLC) -pack -o $@ $^
> [...]
> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/Makefile
> --- a/tools/ocaml/libs/xs/Makefile
> +++ b/tools/ocaml/libs/xs/Makefile
> @@ -20,18 +21,27 @@
[...]
> +xenstore.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
> +       $(E) " CMX      $@"
> +       $(Q)$(OCAMLOPT) -pack -o $@ $^
> +
> +xenstore.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
> +       $(E) " CMO      $@"
> +       $(Q)$(OCAMLC) -pack -o $@ $^
> +

These can't use the generic rules in tools/ocaml/Makefile.rules?

I noticed because:

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318496187 -3600
# Node ID 333fef90be8250379c294daf15d12b234d95f824
# Parent  9738d92a3625d6b6b3c49badc0ca9e95a67b2bbd
ocaml: align build output

Fix:
 MLI       op.mli
 MLI      op.cmi
 MLI       partial.mli
 MLI      partial.cmi
 MLI       packet.mli


Signed-off-by: Ian Cmpabell <ian.campbell@citrix.com>

diff -r 9738d92a3625 -r 333fef90be82 tools/ocaml/libs/xb/Makefile
--- a/tools/ocaml/libs/xb/Makefile	Thu Oct 13 09:45:09 2011 +0100
+++ b/tools/ocaml/libs/xb/Makefile	Thu Oct 13 09:56:27 2011 +0100
@@ -31,15 +31,15 @@ xenbus_C_OBJS = xs_ring_stubs xenbus_stu
 OCAML_LIBRARY = xenbus
 
 xenbus.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
-	$(E) " CMX       $@"
+	$(E) " CMX      $@"
 	$(OCAMLOPT) -pack -o $@ $^
 
 xenbus.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
-	$(E) " CMO       $@"
+	$(E) " CMO      $@"
 	$(OCAMLC) -pack -o $@ $^
 
 %.mli: %.ml
-	$(E) " MLI       $@"
+	$(E) " MLI      $@"
 	$(Q)$(OCAMLC) $(OCAMLINCLUDE) -i $< $o
 
 .PHONY: install



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 02:08:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:08:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REHHI-0007gW-JD; Thu, 13 Oct 2011 02:08:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHEs-0007Rw-AF
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:06:09 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318496762!834991!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2812 invoked from network); 13 Oct 2011 09:06:03 -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;
	13 Oct 2011 09:06:03 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315180800"; 
   d="scan'208";a="8363697"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 09:06: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, 13 Oct 2011 10:06:02 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Thu, 13 Oct 2011 10:06:02 +0100
In-Reply-To: <CAPLaKK5QiyxxOL8XwTvEpFN1F7iJHOayFB2aqq3Vo=v3gBNyfw@mail.gmail.com>
References: <2fb4bf8c16cd35ddc0bf.1318336005@loki>
	<1318410713.21903.598.camel@zakaz.uk.xensource.com>
	<CAPLaKK5QiyxxOL8XwTvEpFN1F7iJHOayFB2aqq3Vo=v3gBNyfw@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1318496762.21903.806.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>
Subject: [Xen-devel] Re: [PATCH] libxl: reimplement buffer for bootloading
 and drop data if buffer 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

On Thu, 2011-10-13 at 09:43 +0100, Roger Pau MonnÃ© wrote:

> >>          FD_ZERO(&rsel);
> >>          FD_SET(fifo_fd, &rsel);
> >>          nfds = fifo_fd + 1;
> >> -        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0)) {
> >> +        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0) || timeout) {
> >
> > If you've had a timeout there will be data pending on this FD won't
> > there, so this change essentially means that after the first timeout the
> > timeout on the select becomes effectively zero?
> 
> Well, I cannot know this for sure, but it's the most likely situation.
> 
> > Can you just make this:
> >           if (xenconsoled_prod == 0 || xenconsoled_cons == 0) {
> 
> I don't think there's any need for this pair of "ifs", since they will
> always be hit, because xenconsoled_cons and bootloader_cons is always
> 0 at this point, I agree with you that this might be dropping data to
> aggressively, since the timeout will not be needed. Something like
> this might be more suitable:
> 
> if (bootloader_prod == 0 || ret == 0) {
> 
> The "timeout" variable is not really needed, I've just added it to
> make the code cleaner and easier to understand,

Actually, the timeout variable was ok my concern was more the use of
continue and the code flow it seemed to create which wasn't easy to
follow.

>  but ret can be used in
> the same way. From my point of view, we should only add the file
> descriptors with a full buffer to the select set after a timeout has
> occurred, since checking for a timeout (ret == 0) in the FD_ISSET may
> make us enter an infinite loop (because there's data pending on the
> file descriptor, and the timeout is not hit).

If the buffer is full and we therefore don't add it to the select then
either
      * some other file descriptor in the select becomes read for
        read/write as appropriate, in which case some progress will be
        made, - or -
      * the timeout will fire and we will discard some data, such that
        next time round the loop we can make progress.

Do we need to care about the case where no fd's get added to the select?

> > The previous memmove will ensure we hit this case. Then inside the if
> > FD_ISSET(xenconsoled_fd) you can check for prod == BOOTLOADER_BUF_SIZE
> > and discard from the buffer (e.g. we can discard the tail just by
> > modifying prod?).
> 
> We are discarding from the tail? I'm not sure it's the best way to do
> it, pygrub uses curses control sequences, and I think it's best to try
> to keep the stream as clean as possible, dropping the tail would
> really mess up with screen printing (maybe just mess up a frame, but
> the output will be rubbish).

Doesn't dropping any part of the data stream have that same property? Is
dropping the tail somehow worse?

> 
> > Hmm. that might discard a bit too aggressively, perhaps leaving this
> > check as it was and doing the discard if (ret == 0 && xenconsoled_prod
> > == BOOTLOADER_BUF_SIZE) in the else clause if the FD_ISSET works?
> 
> This might make the select loop too fast, since we add all the
> descriptors to the set, and it's a strong possibility that the timeout
> will never be hit, so ret will never be 0 and we will be looping
> forever.

That's why we should not add fd's to the set which we cannot make
progress with if they become/are ready.

Ian.

> 
> >>              FD_SET(xenconsoled_fd, &rsel);
> >>              nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
> >>          }
> >> -        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0)) {
> >> +        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0) || timeout) {
> >>              FD_SET(bootloader_fd, &rsel);
> >>              nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
> >>          }
> >> @@ -208,12 +226,23 @@ static char * bootloader_interact(libxl_
> >>              nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
> >>          }
> >>
> >> -        ret = select(nfds, &rsel, &wsel, NULL, NULL);
> >> +        ret = select(nfds, &rsel, &wsel, NULL, &wait);
> >>          if (ret < 0)
> >>              goto out_err;
> >> +        if (ret == 0) {
> >> +            timeout = 1;
> >> +            continue;
> >> +        }
> >> +        timeout = 0;
> >>
> >>          /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
> >>          if (FD_ISSET(xenconsoled_fd, &rsel)) {
> >> +            if (xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
> >> +                if (ioctl(xenconsoled_fd, FIONREAD, &read_ahead) < 0)
> >
> > I think we can avoid this as described above, but if not then you need
> > to be wary of the case where read_ahead > XENCONSOLED_BUF_SIZE.
> 
> Yes, I've also missed that one, this should be checked to avoid
> passing a negative integer to read or moving memory regions outside of
> the buffer.
> 
> >> +                    goto out_err;
> >> +                memmove(xenconsoled_buf, &xenconsoled_buf[read_ahead], XENCONSOLED_BUF_SIZE - read_ahead);
> >> +                xenconsoled_prod -= read_ahead;
> >> +            }
> >>              ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled_prod);
> >>              if (ret < 0 && errno != EIO && errno != EAGAIN)
> >>                  goto out_err;
> >> @@ -230,6 +259,12 @@ static char * bootloader_interact(libxl_
> >>
> >>          /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
> >>          if (FD_ISSET(bootloader_fd, &rsel)) {
> >> +            if (bootloader_prod == BOOTLOADER_BUF_SIZE) {
> >> +                if (ioctl(bootloader_fd, FIONREAD, &read_ahead) < 0)
> >> +                    goto out_err;
> >> +                memmove(bootloader_buf, &bootloader_buf[read_ahead], BOOTLOADER_BUF_SIZE - read_ahead);
> >> +                bootloader_prod -= read_ahead;
> >> +            }
> >>              ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod);
> >>              if (ret < 0 && errno != EIO && errno != EAGAIN)
> >>                  goto out_err;
> >
> >
> >
> 
> I'm wrapping another patch which I will send right now.



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 02:25:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:25:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REHXe-0008Kp-3l; Thu, 13 Oct 2011 02:25:30 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHWn-00087o-RK
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:24:38 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1318497874!35078498!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9067 invoked from network); 13 Oct 2011 09:24:34 -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;
	13 Oct 2011 09:24:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315180800"; 
   d="scan'208";a="8364266"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 09:24:34 +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, 13 Oct 2011 10:24:34 +0100
Subject: Re: [Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming
	domain 0
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Thu, 13 Oct 2011 10:24:34 +0100
In-Reply-To: <4E95E0AB.5010901@tycho.nsa.gov>
References: <1317824920-639-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20109.60188.905267.410813@mariner.uk.xensource.com>
	<4E8DF425.9000807@tycho.nsa.gov>
	<1317973956.21903.281.camel@zakaz.uk.xensource.com>
	<4E8F2AD0.2060904@tycho.nsa.gov>
	<1318251283.21903.424.camel@zakaz.uk.xensource.com>
	<4E94582C.4060305@tycho.nsa.gov>
	<1318437131.21903.775.camel@zakaz.uk.xensource.com>
	<4E95E0AB.5010901@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318497874.21903.812.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

> >>  but
> >> the only Linux change required for the second case is the posted fix to the
> >> loopback event channel.
> > 
> > Unless dom0 is also running Linux? In which case it has no way to talk
> > to the xenstored in the second domain?
> 
> Correct; I am not addressing this problem as dom0 is not running Linux here.

Sure, my concern was that we don't paint ourselves into a corner wrt
future moves in this direction. I think I'm now convinced that this
isn't the case and that everything is fine (thanks!).

> The other patches you pointed to do address that possibility with the ioctl,
> which seems a good solution if you want to also run Linux in dom0

Agreed, I think the ioctl path will fit into your
"xenstored_local_init()" path just the same as it fits into the current
code.

> > How does the xenstored running in the second domain get the necessary
> > page/evtchn numbers to allow it to communicate with dom0?
> 
> In my setup, it doesn't ever communicate with dom0 as dom0 dies once it
> has set up the boot domains. For a more general case, the page/evtchn
> numbers could be passed in a normal introduce message if they are made
> available outside dom0 (perhaps by command-line parameters or via another
> mechanism like v4v).

That rings a bell -- I think Deigo had them on the xenstored domain
command line.

> > I assume it is guaranteed that xen_start_info->store_evtchn == 0 (and
> > presumably xen_start_info->store_mfn == 0) for the real dom0?
> 
> Yes; the start_info page is zeroed prior to filling it in for dom0, and
> these fields are not filled in.

Great.

The representation of your changes which diff chose was not terribly
helpful for seeing the trees in the woods but I applied it and reviewed
the result and it looks ok to me.

Ian.



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 02:29:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:29:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REHbc-0000zl-D0; Thu, 13 Oct 2011 02:29:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHb1-0000l3-2t
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:28:59 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318498111!53012434!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7605 invoked from network); 13 Oct 2011 09:28:32 -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;
	13 Oct 2011 09:28:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166710289"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:28: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; Thu, 13 Oct 2011 05:28:54 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9SqLB023693; Thu, 13 Oct 2011 02:28:53 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: bc9cab33404f16214945ab907ad17b9a6711b6ba
Message-ID: <bc9cab33404f16214945.1318498132@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:28:52 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@citrix.com
Subject: [Xen-devel] [PATCH] libxl: correctly propagate errors from
	libxl_domain_resume
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318495026 -3600
# Node ID bc9cab33404f16214945ab907ad17b9a6711b6ba
# Parent  ba246bb8a7f57e24937082e0d272fdb66def0fa6
libxl: correctly propagate errors from libxl_domain_resume

currently it return success no matter what.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r ba246bb8a7f5 -r bc9cab33404f tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 09:37:06 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 09:37:06 2011 +0100
@@ -261,7 +261,7 @@ int libxl_domain_resume(libxl_ctx *ctx, 
     }
 out:
     libxl__free_all(&gc);
-    return 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 Thu Oct 13 02:32:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:32:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REHe8-0001Qm-Me; Thu, 13 Oct 2011 02:32:12 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHda-0001Cw-1b
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:31:38 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318498294!35087904!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 432 invoked from network); 13 Oct 2011 09:31:35 -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;
	13 Oct 2011 09:31:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315180800"; 
   d="scan'208";a="8364476"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 09:31:34 +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, 13 Oct 2011 10:31:34 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Thu, 13 Oct 2011 10:31:34 +0100
In-Reply-To: <patchbomb.1317983270@cosworth.uk.xensource.com>
References: <patchbomb.1317983270@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: <1318498294.21903.814.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Subject: [Xen-devel] Re: [PATCH 0 of 4 v2] libxl: support json for pretty
 printing objects
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-07 at 11:27 +0100, Ian Campbell wrote:
> Now that Anthony's QMP series is in we can build upon the use of YAJL
> to add support for pretty printing libxl objects as JSON.
> 
> Also includes a user in xl (to print disks on dry run) and an
> associated fix to the check-xl-disk-parse test script.


In my V1 posting of this series I also included "libxl: probe disk
backend type in libxl_device_disk_add" but forgot it in the repost, so
here is patch 5/4:

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318498260 -3600
# Node ID 29bd271877873f4a38217de89f8f4f74405496b5
# Parent  98cb420b606bf69e3e3177ebe8b16b529c5ed0ed
libxl: probe disk backend type in libxl_device_disk_add

Without this "xl block-attach" does not work. On create do_domain_create already
catches this.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 98cb420b606b -r 29bd27187787 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:31:00 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:31:00 2011 +0100
@@ -929,6 +929,9 @@ int libxl_device_disk_add(libxl_ctx *ctx
     rc = libxl__device_disk_set_backend(&gc, disk);
     if (rc) goto out;
 
+    rc = libxl__device_disk_set_backend(&gc, disk);
+    if (rc) goto out;
+
     front = flexarray_make(16, 1);
     if (!front) {
         rc = ERROR_NOMEM;



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 02:33:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:33:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REHfD-0001sS-KI; Thu, 13 Oct 2011 02:33:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHef-0001cm-5M
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:32:45 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318498360!832703!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26893 invoked from network); 13 Oct 2011 09:32:42 -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;
	13 Oct 2011 09:32:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166710594"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:32:40 -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; Thu, 13 Oct 2011 05:32:40 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9WcIj023696; Thu, 13 Oct 2011 02:32:39 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ae737bfccb2e584ec29ed0de9a8f3c3e0b9cfee6
Message-ID: <ae737bfccb2e584ec29e.1318498358@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:32:38 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@citrix.com
Subject: [Xen-devel] [PATCH] libxl: libxl__e820_alloc must take a libxl__gc
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318498329 -3600
# Node ID ae737bfccb2e584ec29ed0de9a8f3c3e0b9cfee6
# Parent  0345e59b99b7a281b62b3d8bfc001a1508ef2f97
libxl: libxl__e820_alloc must take a libxl__gc.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 0345e59b99b7 -r ae737bfccb2e tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c	Thu Oct 13 10:32:08 2011 +0100
+++ b/tools/libxl/libxl_create.c	Thu Oct 13 10:32:09 2011 +0100
@@ -601,7 +601,7 @@ static int do_domain_create(libxl__gc *g
     if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV &&
         d_config->b_info.u.pv.e820_host) {
         int rc;
-        rc = libxl__e820_alloc(ctx, domid, d_config);
+        rc = libxl__e820_alloc(gc, domid, d_config);
         if (rc)
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
                       "Failed while collecting E820 with: %d (errno:%d)\n",
diff -r 0345e59b99b7 -r ae737bfccb2e tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Thu Oct 13 10:32:08 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Thu Oct 13 10:32:09 2011 +0100
@@ -424,7 +424,7 @@ _hidden int libxl__file_reference_map(li
 _hidden int libxl__file_reference_unmap(libxl_file_reference *f);
 _hidden int libxl__fd_set_cloexec(int fd);
 
-_hidden int libxl__e820_alloc(libxl_ctx *ctx, uint32_t domid, libxl_domain_config *d_config);
+_hidden int libxl__e820_alloc(libxl__gc *gc, uint32_t domid, libxl_domain_config *d_config);
 
 /* parse the string @s as a sequence of 6 colon separated bytes in to @mac */
 _hidden int libxl__parse_mac(const char *s, libxl_mac mac);
diff -r 0345e59b99b7 -r ae737bfccb2e tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Thu Oct 13 10:32:08 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Thu Oct 13 10:32:09 2011 +0100
@@ -1269,8 +1269,9 @@ static int e820_sanitize(libxl_ctx *ctx,
     return 0;
 }
 
-int libxl__e820_alloc(libxl_ctx *ctx, uint32_t domid, libxl_domain_config *d_config)
+int libxl__e820_alloc(libxl__gc *gc, uint32_t domid, libxl_domain_config *d_config)
 {
+    libxl_ctx *ctx = libxl__gc_owner(gc);
     int rc;
     uint32_t nr;
     struct e820entry map[E820MAX];

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 02:34:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:34:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REHfy-0002GR-Eq; Thu, 13 Oct 2011 02:34:06 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHem-0001eM-96
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:32:52 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1318498367!20299002!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3136 invoked from network); 13 Oct 2011 09:32:48 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:32:48 -0000
Received: by qyg14 with SMTP id 14so985901qyg.9
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 02:32: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
	:content-transfer-encoding;
	bh=26HPzfm3EhspWEPcZEG6okoxvQJ2uUerUAAAH5yeHpg=;
	b=vhHhR8RPIKVHlGKePakHrA1bezH6twsrVJmU7lDGSoOC9gihd2u8qawNXxADJSCY8r
	GU3hXFTCUsCYwXa+xohcFMXCXuCmwTFR+i3MS8Jpxxeo/T5zY1SxGGshikDttexCXi9k
	fxtAxMyZ+X7U0lkVK5T4cHZFTSK3JG6nLmjJY=
MIME-Version: 1.0
Received: by 10.68.74.33 with SMTP id q1mr7558398pbv.71.1318498367273; Thu, 13
	Oct 2011 02:32:47 -0700 (PDT)
Received: by 10.142.225.20 with HTTP; Thu, 13 Oct 2011 02:32:47 -0700 (PDT)
In-Reply-To: <1318496762.21903.806.camel@zakaz.uk.xensource.com>
References: <2fb4bf8c16cd35ddc0bf.1318336005@loki>
	<1318410713.21903.598.camel@zakaz.uk.xensource.com>
	<CAPLaKK5QiyxxOL8XwTvEpFN1F7iJHOayFB2aqq3Vo=v3gBNyfw@mail.gmail.com>
	<1318496762.21903.806.camel@zakaz.uk.xensource.com>
Date: Thu, 13 Oct 2011 11:32:47 +0200
X-Google-Sender-Auth: EqqsEmRsnILb3fj9h3l4sNOBNSM
Message-ID: <CAPLaKK7nsRm=U_OtTjVwBqttmc=6SR0uyviq-d+bKipQwiDW2A@mail.gmail.com>
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
Content-Transfer-Encoding: quoted-printable
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH] libxl: reimplement buffer for bootloading
 and drop data if buffer 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

2011/10/13 Ian Campbell <Ian.Campbell@citrix.com>:
> On Thu, 2011-10-13 at 09:43 +0100, Roger Pau Monn=C3=A9 wrote:
>
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_ZERO(&rsel);
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_SET(fifo_fd, &rsel);
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D fifo_fd + 1;
>> >> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod =3D=3D 0 || (xencon=
soled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons =3D=3D 0)) {
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod =3D=3D 0 || (xencon=
soled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons =3D=3D 0) || timeout) =
{
>> >
>> > If you've had a timeout there will be data pending on this FD won't
>> > there, so this change essentially means that after the first timeout t=
he
>> > timeout on the select becomes effectively zero?
>>
>> Well, I cannot know this for sure, but it's the most likely situation.
>>
>> > Can you just make this:
>> > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (xenconsoled_prod =3D=3D 0 || xe=
nconsoled_cons =3D=3D 0) {
>>
>> I don't think there's any need for this pair of "ifs", since they will
>> always be hit, because xenconsoled_cons and bootloader_cons is always
>> 0 at this point, I agree with you that this might be dropping data to
>> aggressively, since the timeout will not be needed. Something like
>> this might be more suitable:
>>
>> if (bootloader_prod =3D=3D 0 || ret =3D=3D 0) {
>>
>> The "timeout" variable is not really needed, I've just added it to
>> make the code cleaner and easier to understand,
>
> Actually, the timeout variable was ok my concern was more the use of
> continue and the code flow it seemed to create which wasn't easy to
> follow.

Ok, I think I've managed to write it in a more friendly way.

> If the buffer is full and we therefore don't add it to the select then
> either
> =C2=A0 =C2=A0 =C2=A0* some other file descriptor in the select becomes re=
ad for
> =C2=A0 =C2=A0 =C2=A0 =C2=A0read/write as appropriate, in which case some =
progress will be
> =C2=A0 =C2=A0 =C2=A0 =C2=A0made, - or -
> =C2=A0 =C2=A0 =C2=A0* the timeout will fire and we will discard some data=
, such that
> =C2=A0 =C2=A0 =C2=A0 =C2=A0next time round the loop we can make progress.
>
> Do we need to care about the case where no fd's get added to the select?

I don't think it's possible, since read fd's get added when there's
space in the buffer, and write fd's gets added when there's data in
the buffer, so either way there will be fd's in select.

buffer empty: read fd's are added
buffer contains data but it's not full: read & write fd's are added
buffer full: write fd's are added.

> Doesn't dropping any part of the data stream have that same property? Is
> dropping the tail somehow worse?

Dropping from the head and adding data to the tail makes the data
stream in the buffer contiguous, there are no breaks inside it. On the
other hand, rewriting data in the tail (or the head) introduces one
(or possible more) breaks in the data stream. What I mean with "break"
is that the data is no longer in the same order as it came from the
fd.

>>
>> > Hmm. that might discard a bit too aggressively, perhaps leaving this
>> > check as it was and doing the discard if (ret =3D=3D 0 && xenconsoled_=
prod
>> > =3D=3D BOOTLOADER_BUF_SIZE) in the else clause if the FD_ISSET works?
>>
>> This might make the select loop too fast, since we add all the
>> descriptors to the set, and it's a strong possibility that the timeout
>> will never be hit, so ret will never be 0 and we will be looping
>> forever.
>
> That's why we should not add fd's to the set which we cannot make
> progress with if they become/are ready.
>
> Ian.
>
>>
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_SET(xenconsoled_fd=
, &rsel);
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D xenconsoled_=
fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> >> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod =3D=3D 0 || (bootloa=
der_prod < BOOTLOADER_BUF_SIZE && bootloader_cons =3D=3D 0)) {
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod =3D=3D 0 || (bootloa=
der_prod < BOOTLOADER_BUF_SIZE && bootloader_cons =3D=3D 0) || timeout) {
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_SET(bootloader_fd,=
 &rsel);
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D bootloader_f=
d + 1 > nfds ? bootloader_fd + 1 : nfds;
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> >> @@ -208,12 +226,23 @@ static char * bootloader_interact(libxl_
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D bootloader_f=
d + 1 > nfds ? bootloader_fd + 1 : nfds;
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> >>
>> >> - =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D select(nfds, &rsel, &wsel, NULL,=
 NULL);
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D select(nfds, &rsel, &wsel, NULL,=
 &wait);
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0)
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out_err;
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret =3D=3D 0) {
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0timeout =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=A0timeout =3D 0;
>> >>
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Input from xenconsole, read xenc=
onsoled_fd, write bootloader_fd */
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (FD_ISSET(xenconsoled_fd, &rsel)=
) {
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod =3D=
=3D XENCONSOLED_BUF_SIZE) {
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ioctl(xe=
nconsoled_fd, FIONREAD, &read_ahead) < 0)
>> >
>> > I think we can avoid this as described above, but if not then you need
>> > to be wary of the case where read_ahead > XENCONSOLED_BUF_SIZE.
>>
>> Yes, I've also missed that one, this should be checked to avoid
>> passing a negative integer to read or moving memory regions outside of
>> the buffer.
>>
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0goto out_err;
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memmove(xenc=
onsoled_buf, &xenconsoled_buf[read_ahead], XENCONSOLED_BUF_SIZE - read_ahea=
d);
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xenconsoled_=
prod -=3D read_ahead;
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D read(xenconso=
led_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconso=
led_prod);
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0 && errno =
!=3D EIO && errno !=3D EAGAIN)
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto ou=
t_err;
>> >> @@ -230,6 +259,12 @@ static char * bootloader_interact(libxl_
>> >>
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Input from bootloader, read boot=
loader_fd, write xenconsoled_fd */
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (FD_ISSET(bootloader_fd, &rsel))=
 {
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod =3D=3D=
 BOOTLOADER_BUF_SIZE) {
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ioctl(bo=
otloader_fd, FIONREAD, &read_ahead) < 0)
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0goto out_err;
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memmove(boot=
loader_buf, &bootloader_buf[read_ahead], BOOTLOADER_BUF_SIZE - read_ahead);
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bootloader_p=
rod -=3D read_ahead;
>> >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D read(bootload=
er_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_p=
rod);
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0 && errno =
!=3D EIO && errno !=3D EAGAIN)
>> >> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto ou=
t_err;
>> >
>> >
>> >
>>
>> I'm wrapping another patch which I will send right now.
>
>
>

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 02:35:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:35:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REHhL-0002kG-4p; Thu, 13 Oct 2011 02:35:31 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHfF-0001rb-4a
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:33:21 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1318498373!48907901!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7232 invoked from network); 13 Oct 2011 09:32:54 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:32:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166710636"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:33:16 -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; Thu, 13 Oct 2011 05:33:16 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9XEJN023699; Thu, 13 Oct 2011 02:33:15 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c4c4e2768341b3003734e0ce83cab59d05f4ebac
Message-ID: <c4c4e2768341b3003734.1318498394@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:33:14 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@citrix.com
Subject: [Xen-devel] [PATCH] libxc: osdep: report missing backends in 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

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318498329 -3600
# Node ID c4c4e2768341b3003734e0ce83cab59d05f4ebac
# Parent  b8c4238b870225d00fec8a7cbba9387d213a02e5
libxc: osdep: report missing backends in common code

Backends were inconsistent about reporting and it's a pain to edit them all
when adding a new class of osdep.

Signed-off-by: Ian Campbell <Ian.campbell@citrix.com>
---
Requires Daniel De Graaf's "libxc: add xc_gntshr_* functions"

diff -r b8c4238b8702 -r c4c4e2768341 tools/libxc/xc_netbsd.c
--- a/tools/libxc/xc_netbsd.c	Thu Oct 13 10:32:09 2011 +0100
+++ b/tools/libxc/xc_netbsd.c	Thu Oct 13 10:32:09 2011 +0100
@@ -386,9 +386,6 @@ static struct xc_osdep_ops *netbsd_osdep
         return &netbsd_privcmd_ops;
     case XC_OSDEP_EVTCHN:
         return &netbsd_evtchn_ops;
-    case XC_OSDEP_GNTTAB:
-        ERROR("GNTTAB interface not supported on this platform");
-        return NULL;
     default:
         return NULL;
     }
diff -r b8c4238b8702 -r c4c4e2768341 tools/libxc/xc_private.c
--- a/tools/libxc/xc_private.c	Thu Oct 13 10:32:09 2011 +0100
+++ b/tools/libxc/xc_private.c	Thu Oct 13 10:32:09 2011 +0100
@@ -111,6 +111,18 @@ static void xc_osdep_put(xc_osdep_info_t
 #endif
 }
 
+static const char *xc_osdep_type_name(enum xc_osdep_type type)
+{
+    switch ( type )
+    {
+    case XC_OSDEP_PRIVCMD: return "privcmd";
+    case XC_OSDEP_EVTCHN:  return "evtchn";
+    case XC_OSDEP_GNTTAB:  return "gnttab";
+    case XC_OSDEP_GNTSHR:  return "gntshr";
+    }
+    return "unknown";
+}
+
 static struct xc_interface_core *xc_interface_open_common(xentoollog_logger *logger,
                                                           xentoollog_logger *dombuild_logger,
                                                           unsigned open_flags,
@@ -161,7 +173,11 @@ static struct xc_interface_core *xc_inte
 
         xch->ops = xch->osdep.init(xch, type);
         if ( xch->ops == NULL )
+        {
+            ERROR("OSDEP: interface %d (%s) not supported on this platform",
+                  type, xc_osdep_type_name(type));
             goto err_put_iface;
+        }
 
         xch->ops_handle = xch->ops->open(xch);
         if (xch->ops_handle == XC_OSDEP_OPEN_ERROR)
diff -r b8c4238b8702 -r c4c4e2768341 tools/libxc/xc_solaris.c
--- a/tools/libxc/xc_solaris.c	Thu Oct 13 10:32:09 2011 +0100
+++ b/tools/libxc/xc_solaris.c	Thu Oct 13 10:32:09 2011 +0100
@@ -322,9 +322,6 @@ static struct xc_osdep_ops *solaris_osde
         return &solaris_privcmd_ops;
     case XC_OSDEP_EVTCHN:
         return &solaris_evtchn_ops;
-    case XC_OSDEP_GNTTAB:
-        ERROR("GNTTAB interface not supported on this platform");
-        return NULL;
     default:
         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 Oct 13 02:36:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:36:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REHiR-00037O-Jg; Thu, 13 Oct 2011 02:36:39 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHgC-0002LR-Sm
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:34:21 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318498439!46464313!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2405 invoked from network); 13 Oct 2011 09:33:59 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:33:59 -0000
Received: by wyh13 with SMTP id 13so1974330wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 02:34:17 -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=QKaq+dqNib1sultWlLtRvrjOBVY4KHX6xOX1IcfuH6I=;
	b=LCQdO0/CrfNhu+UD6OLq1BdrY+eL9hcBXH9R1uwUe8gJRoDcUJgzT7+eWJtv7YtkEd
	YcqBPkqa0SdAFURK6bSkcHdXGmLj2qUl6Fa+lF/3QHH1NnZ8C78uETNTRCt/uyxrASRF
	Rg9VJR3u/jEj7SErP6nJPCh1D6yk0FLb59qTI=
Received: by 10.227.57.208 with SMTP id d16mr998278wbh.55.1318498457638;
	Thu, 13 Oct 2011 02:34:17 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id e7sm4887721wbh.12.2011.10.13.02.34.15
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 02:34:16 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 10:34:08 +0100
Subject: Re: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CABC6F20.32780%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
Thread-Index: AcyJfNUJHvFSXjMQm0aMwAU/cZA69gADmyDR
In-Reply-To: <CABC56ED.3276A%keir@xen.org>
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 13/10/2011 08:50, "Keir Fraser" <keir@xen.org> wrote:

> On 13/10/2011 08:21, "Jan Beulich" <JBeulich@suse.com> wrote:
> 
>> The IDTs being exactly a page in size, using xmalloc() here is rather
>> inefficient, as this requires double the amount to be allocated (with
>> almost an entire page wasted). For hot plugged CPUs, this at once
>> eliminates one more non-order-zero runtime allocation.
>> 
>> For x86-32, however, the IDT is exactly half a page, so allocating a
>> full page seems wasteful here, so it continues to use xmalloc() as
>> before.
>> 
>> With most of the affected functions' bodies now being inside #ifdef-s,
>> it might be reasonable to split those parts out into subarch-specific
>> code...
> 
> Well, there is also opportunity for code merging. There is generally no
> reason for x86-64 to use alloc_domheap_pages where x86-32 uses
> alloc_xenheap_pages (e.g., for allocating per_cpu(gdt_table)) -- both
> architectures can use alloc_xenheap_pages in this case.
> 
> Also we might get rid of some further ifdef'ery if we added an alloc/free
> interface where *both* functions take a size parameter. We could then decide
> whether to use xmalloc or alloc_xenheap_pages dynamically based on that
> parameter. Knowing size on free would allow us to easily free such
> allocations too.
> 
> Finally, I'm not sure about more x86-64 code movement: I'd like to kill
> x86-32 entirely really.

Given our antipathy to the x86-32 hypervisor, and the fact that any
remaining users of it are unlikely to be running MP systems at all let alone
large MP systems, how about this cleanup patch?... (It looks quite confusing
as a patch, actually, but does the obvious thing).

 -- Keir

x86: Simplify smpboot_alloc by merging x86-{32,64} code as far as possible.

We still need one ifdef, as x86-32 does not have a compat_gdt_table.

On x86-32 there is 1/2-page wastage due to allocating a whole page for
the per-CPU IDT, however we expect very few users of the x86-32
hypervisor. Those that cannot move to the 64-bit hypervisor are likely
using old single-processor systems or new single-procesor netbooks. On
UP and small MP systems, the wastage is insignificant.

Signed-off-by: Keir Fraser <keir@xen.org>
diff -r 1515484353c6 xen/arch/x86/smpboot.c
--- a/xen/arch/x86/smpboot.c    Thu Oct 13 10:09:28 2011 +0200
+++ b/xen/arch/x86/smpboot.c    Thu Oct 13 10:25:01 2011 +0100
@@ -640,21 +640,16 @@ static void cpu_smpboot_free(unsigned in
     unsigned int order;
 
     order = get_order_from_pages(NR_RESERVED_GDT_PAGES);
+    free_xenheap_pages(per_cpu(gdt_table, cpu), order);
+    per_cpu(gdt_table, cpu) = NULL;
+
 #ifdef __x86_64__
-    if ( per_cpu(compat_gdt_table, cpu) )
-        free_domheap_pages(virt_to_page(per_cpu(gdt_table, cpu)), order);
-    if ( per_cpu(gdt_table, cpu) )
-        free_domheap_pages(virt_to_page(per_cpu(compat_gdt_table, cpu)),
-                           order);
+    free_xenheap_pages(per_cpu(compat_gdt_table, cpu), order);
     per_cpu(compat_gdt_table, cpu) = NULL;
-    order = get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
-    if ( idt_tables[cpu] )
-        free_domheap_pages(virt_to_page(idt_tables[cpu]), order);
-#else
-    free_xenheap_pages(per_cpu(gdt_table, cpu), order);
-    xfree(idt_tables[cpu]);
 #endif
-    per_cpu(gdt_table, cpu) = NULL;
+
+    order = get_order_from_bytes(IDT_ENTRIES * sizeof(idt_entry_t));
+    free_xenheap_pages(idt_tables[cpu], order);
     idt_tables[cpu] = NULL;
 
     if ( stack_base[cpu] != NULL )
@@ -669,9 +664,6 @@ static int cpu_smpboot_alloc(unsigned in
 {
     unsigned int order;
     struct desc_struct *gdt;
-#ifdef __x86_64__
-    struct page_info *page;
-#endif
 
     stack_base[cpu] = alloc_xenheap_pages(STACK_ORDER, 0);
     if ( stack_base[cpu] == NULL )
@@ -679,41 +671,28 @@ static int cpu_smpboot_alloc(unsigned in
     memguard_guard_stack(stack_base[cpu]);
 
     order = get_order_from_pages(NR_RESERVED_GDT_PAGES);
-#ifdef __x86_64__
-    page = alloc_domheap_pages(NULL, order,
-                               MEMF_node(cpu_to_node(cpu)));
-    if ( !page )
+    per_cpu(gdt_table, cpu) = gdt =
+        alloc_xenheap_pages(order, MEMF_node(cpu_to_node(cpu)));
+    if ( gdt == NULL )
         goto oom;
-    per_cpu(compat_gdt_table, cpu) = gdt = page_to_virt(page);
-    memcpy(gdt, boot_cpu_compat_gdt_table,
-           NR_RESERVED_GDT_PAGES * PAGE_SIZE);
-    gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a = cpu;
-    page = alloc_domheap_pages(NULL, order,
-                               MEMF_node(cpu_to_node(cpu)));
-    if ( !page )
-        goto oom;
-    per_cpu(gdt_table, cpu) = gdt = page_to_virt(page);
-    order = get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
-    page = alloc_domheap_pages(NULL, order,
-                               MEMF_node(cpu_to_node(cpu)));
-    if ( !page )
-        goto oom;
-    idt_tables[cpu] = page_to_virt(page);
-#else
-    per_cpu(gdt_table, cpu) = gdt = alloc_xenheap_pages(order, 0);
-    if ( !gdt )
-        goto oom;
-    idt_tables[cpu] = xmalloc_array(idt_entry_t, IDT_ENTRIES);
-    if ( idt_tables[cpu] == NULL )
-        goto oom;
-#endif
-    memcpy(gdt, boot_cpu_gdt_table,
-           NR_RESERVED_GDT_PAGES * PAGE_SIZE);
+    memcpy(gdt, boot_cpu_gdt_table, NR_RESERVED_GDT_PAGES * PAGE_SIZE);
     BUILD_BUG_ON(NR_CPUS > 0x10000);
     gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a = cpu;
 
-    memcpy(idt_tables[cpu], idt_table,
-           IDT_ENTRIES*sizeof(idt_entry_t));
+#ifdef __x86_64__
+    per_cpu(compat_gdt_table, cpu) = gdt =
+        alloc_xenheap_pages(order, MEMF_node(cpu_to_node(cpu)));
+    if ( gdt == NULL )
+        goto oom;
+    memcpy(gdt, boot_cpu_compat_gdt_table, NR_RESERVED_GDT_PAGES *
PAGE_SIZE);
+    gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a = cpu;
+#endif
+
+    order = get_order_from_bytes(IDT_ENTRIES * sizeof(idt_entry_t));
+    idt_tables[cpu] = alloc_xenheap_pages(order,
MEMF_node(cpu_to_node(cpu)));
+    if ( idt_tables[cpu] == NULL )
+        goto oom;
+    memcpy(idt_tables[cpu], idt_table, IDT_ENTRIES * sizeof(idt_entry_t));
 
     return 0;
 

> Anyway, despite all this...
> 
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> Acked-by: Keir Fraser <keir@xen.org>
> 
>> --- a/xen/arch/x86/smpboot.c
>> +++ b/xen/arch/x86/smpboot.c
>> @@ -639,9 +639,6 @@ static void cpu_smpboot_free(unsigned in
>>  {
>>      unsigned int order;
>>  
>> -    xfree(idt_tables[cpu]);
>> -    idt_tables[cpu] = NULL;
>> -
>>      order = get_order_from_pages(NR_RESERVED_GDT_PAGES);
>>  #ifdef __x86_64__
>>      if ( per_cpu(compat_gdt_table, cpu) )
>> @@ -650,10 +647,15 @@ static void cpu_smpboot_free(unsigned in
>>          free_domheap_pages(virt_to_page(per_cpu(compat_gdt_table, cpu)),
>>                             order);
>>      per_cpu(compat_gdt_table, cpu) = NULL;
>> +    order = get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
>> +    if ( idt_tables[cpu] )
>> +        free_domheap_pages(virt_to_page(idt_tables[cpu]), order);
>>  #else
>>      free_xenheap_pages(per_cpu(gdt_table, cpu), order);
>> +    xfree(idt_tables[cpu]);
>>  #endif
>>      per_cpu(gdt_table, cpu) = NULL;
>> +    idt_tables[cpu] = NULL;
>>  
>>      if ( stack_base[cpu] != NULL )
>>      {
>> @@ -691,19 +693,25 @@ static int cpu_smpboot_alloc(unsigned in
>>      if ( !page )
>>          goto oom;
>>      per_cpu(gdt_table, cpu) = gdt = page_to_virt(page);
>> +    order = get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
>> +    page = alloc_domheap_pages(NULL, order,
>> +                               MEMF_node(cpu_to_node(cpu)));
>> +    if ( !page )
>> +        goto oom;
>> +    idt_tables[cpu] = page_to_virt(page);
>>  #else
>>      per_cpu(gdt_table, cpu) = gdt = alloc_xenheap_pages(order, 0);
>>      if ( !gdt )
>>          goto oom;
>> +    idt_tables[cpu] = xmalloc_array(idt_entry_t, IDT_ENTRIES);
>> +    if ( idt_tables[cpu] == NULL )
>> +        goto oom;
>>  #endif
>>      memcpy(gdt, boot_cpu_gdt_table,
>>             NR_RESERVED_GDT_PAGES * PAGE_SIZE);
>>      BUILD_BUG_ON(NR_CPUS > 0x10000);
>>      gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a = cpu;
>>  
>> -    idt_tables[cpu] = xmalloc_array(idt_entry_t, IDT_ENTRIES);
>> -    if ( idt_tables[cpu] == NULL )
>> -        goto oom;
>>      memcpy(idt_tables[cpu], idt_table,
>>             IDT_ENTRIES*sizeof(idt_entry_t));
>>  
>> 
>> 
>> 
>> 
>> _______________________________________________
>> 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 Oct 13 02:43:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:43:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REHp0-0003bZ-2k; Thu, 13 Oct 2011 02:43:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHoY-0003PB-C2
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:42:58 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1318498974!21965687!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29182 invoked from network); 13 Oct 2011 09:42:55 -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; 13 Oct 2011 09:42:55 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 10:42:54 +0100
Message-Id: <4E96CEBD020000780005B151@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 10:42:53 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "George Dunlap" <George.Dunlap@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" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] credit2 data structures
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

George,

while hunting down direct assignments of cpumask_t variables (which I'm
trying to eliminate so that hypervisor binaries built for many CPUs won't
have undue memory overhead on "normal" [smaller] systems), I stumbled
across memory references that at the first glance looked buggy to me
due to their huge immediates. As it turns out, they're not buggy but a
result of credit2's struct csched_private - particularly having a NR_CPUS
sized array of struct csched_runqueue_data, which in turn has three
cpumask_t-s, totaling to a structure size of about 6.5Mb when building
for 4095 CPUs (the current upper limit in Xen).

Apart from the possibility of allocating the arrays (and maybe also the
cpumask_t-s) separately (for which I can come up with a patch on top
of what I' currently putting together) - is it really necessary to have
all these, the more that there can be multiple instances of the structure
with CPU pools?

Jan


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 02:47:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02: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 1REHsk-00042I-O2; Thu, 13 Oct 2011 02:47:18 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHsC-0003pg-Td
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:46:45 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1318499200!20302015!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26542 invoked from network); 13 Oct 2011 09:46:41 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:46:41 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166711680"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:46:40 -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; Thu, 13 Oct 2011 05:46:40 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9kcdD023747; Thu, 13 Oct 2011 02:46:39 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 82b2eeea91d059dd79cf7621d487a0cf7d29933e
Message-ID: <82b2eeea91d059dd79cf.1318499198@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:46:38 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH] build: error out on non-absolute $(XEN_ROOT)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499065 -3600
# Node ID 82b2eeea91d059dd79cf7621d487a0cf7d29933e
# Parent  e5cc23098360f3ff137da9b128b02114468c5654
build: error out on non-absolute $(XEN_ROOT)

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r e5cc23098360 -r 82b2eeea91d0 Config.mk
--- a/Config.mk	Thu Oct 13 10:44:03 2011 +0100
+++ b/Config.mk	Thu Oct 13 10:44:25 2011 +0100
@@ -4,6 +4,10 @@ ifeq ($(filter /%,$(XEN_ROOT)),)
 $(error XEN_ROOT must be absolute)
 endif
 
+ifeq ($(filter /%,$(XEN_ROOT)),)
+$(error XEN_ROOT must be absolute)
+endif
+
 -include $(XEN_ROOT)/.config
 
 # A debug build of Xen and tools?

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 02:48:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02: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 1REHtW-0004Pl-7y; Thu, 13 Oct 2011 02:48:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHsj-00040Y-88
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:47:17 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1318499208!39756794!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21204 invoked from network); 13 Oct 2011 09:46:49 -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;
	13 Oct 2011 09:46:49 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184357"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:47:12 -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; Thu, 13 Oct 2011 05:47:12 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9lBYM023750; Thu, 13 Oct 2011 02:47:11 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 6ca28d551fd5f3d7d7849b6b95d3beda5b9cd10e
Message-ID: <6ca28d551fd5f3d7d784.1318499230@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:47:10 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Anthony.Perard@citrix.com, Ian.Jackson@citrix.com
Subject: [Xen-devel] [PATCH] libxl: remove QMP warning when no pty style
 serial device is configured
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499067 -3600
# Node ID 6ca28d551fd5f3d7d7849b6b95d3beda5b9cd10e
# Parent  82b2eeea91d059dd79cf7621d487a0cf7d29933e
libxl: remove QMP warning when no pty style serial device is configured

If the serial device is not "pty" then there is nothing to do but this is not
an error. Removes a spurious warning if e.g. serial="file:/tmp/serial.log" is used:

libxl: error: libxl_qmp.c:137:register_serials_chardev_callback: Failed to store serial port information in xenstore: No such file or directory


Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 82b2eeea91d0 -r 6ca28d551fd5 tools/libxl/libxl_qmp.c
--- a/tools/libxl/libxl_qmp.c	Thu Oct 13 10:44:25 2011 +0100
+++ b/tools/libxl/libxl_qmp.c	Thu Oct 13 10:44:27 2011 +0100
@@ -87,7 +87,7 @@ static int store_serial_port_info(libxl_
     int ret = 0;
 
     if (!(chardev && strncmp("pty:", chardev, 4) == 0)) {
-        return -1;
+        return 0;
     }
 
     path = libxl__xs_get_dompath(&gc, qmp->domid);

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 02:54:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:54:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REHzf-0004vF-Ew; Thu, 13 Oct 2011 02:54:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyo-0004gG-El
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:34 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318499609!707369!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 909 invoked from network); 13 Oct 2011 09:53:30 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712228"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:29 -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; Thu, 13 Oct 2011 05:53:29 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhG023753; Thu, 13 Oct 2011 02:53:28 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:25 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 00 of 27 v2] libxl: rationalise libxl_device_*
	APIs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 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.

This is broadly speaking the changes I discussed in [0]

One of the early patches adds a big comment describing the API. It
would be useful if this got a particularly close eye with a view to
supporting it long term -- especially from actual and potential
consumers of the API (of who I've CC a few who sprang to mind).

Along the way I filed some rough edges of the internal implementation
of this stuff but my primary concern is to make the public facing API
one that we can commit to keeping stable.

One aspect which is missing is the ability to do asynchronous
add/remove etc. This requires the overhaul of the libxl event system
which Ian Jackson described at [1]. I did bear this in mind so
hopefully I have provided the majority of the necessary moving parts
internally.

Changes since last time:
  - Rename type "destructor" functions to "dispose" freeing up the
    verb "destroy" to mean, uh, destroying things, such as a forcible
    remove of a device or destroying a domain.
  - Use this new found freedom to s/force_remove/destroy/.
  - Added a flags parameter to libxl_ctx_alloc. Might as well have one
    for future flexibility
  - Updated language bindings to use new scheme.

[0] http://www.gossamer-threads.com/lists/xen/devel/204668
[1] http://www.gossamer-threads.com/lists/xen/devel/212580
 &  http://www.gossamer-threads.com/lists/xen/devel/212578
 &  http://www.gossamer-threads.com/lists/xen/devel/212579
 &  http://www.gossamer-threads.com/lists/xen/devel/212581

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 02:55:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:55:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REI12-0005Kg-H9; Thu, 13 Oct 2011 02:55:52 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyo-0004gH-M2
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:35 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318499609!707369!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 937 invoked from network); 13 Oct 2011 09:53:31 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712230"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:31 -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; Thu, 13 Oct 2011 05:53:31 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhI023753; Thu, 13 Oct 2011 02:53:30 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ed9950395a62c6077abf71a2e6d2a6502e0c59b4
Message-ID: <ed9950395a62c6077abf.1318499607@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:27 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 02 of 27 v2] libxl: remove generated file
	testidl.c on 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

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318499238 -3600
# Node ID ed9950395a62c6077abf71a2e6d2a6502e0c59b4
# Parent  1d8b47158206a15c035e794f6bc28e9e7066a2c0
libxl: remove generated file testidl.c on clean

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 1d8b47158206 -r ed9950395a62 tools/libxl/Makefile
--- a/tools/libxl/Makefile	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/Makefile	Thu Oct 13 10:47:18 2011 +0100
@@ -150,6 +150,7 @@ install: all
 clean:
 	$(RM) -f _*.h *.o *.so* *.a $(CLIENTS) $(DEPS)
 	$(RM) -f _*.c *.pyc _libxl_paths.*.tmp
+	$(RM) -f testidl.c.new testidl.c
 #	$(RM) -f $(AUTOSRCS) $(AUTOINCS)
 
 distclean: clean

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 02:56:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 02:56:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REI23-0005iL-MH; Thu, 13 Oct 2011 02:56:55 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyo-0004gI-V8
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:35 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18787 invoked from network); 13 Oct 2011 09:53:31 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184468"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:30 -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; Thu, 13 Oct 2011 05:53:30 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhH023753; Thu, 13 Oct 2011 02:53:29 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1d8b47158206a15c035e794f6bc28e9e7066a2c0
Message-ID: <1d8b47158206a15c035e.1318499606@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:26 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 01 of 27 v2] libxl: add missing "break;
	" to do_pci_remove
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499238 -3600
# Node ID 1d8b47158206a15c035e794f6bc28e9e7066a2c0
# Parent  6ca28d551fd5f3d7d7849b6b95d3beda5b9cd10e
libxl: add missing "break;" to do_pci_remove

Otherwise we erroneously fall through the LIBXL_DOMAIN_TYPE_PV case into the
"default: abort()".

(I'm sure we fixed this once already...)

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 6ca28d551fd5 -r 1d8b47158206 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Thu Oct 13 10:44:27 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Thu Oct 13 10:47:18 2011 +0100
@@ -930,6 +930,7 @@ skip1:
             }
         }
         fclose(f);
+        break;
     }
     default:
         abort();

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:00:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:00:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REI5U-0006Gx-Fu; Thu, 13 Oct 2011 03:00:28 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyq-0004gM-E8
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:36 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318499609!707369!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1103 invoked from network); 13 Oct 2011 09:53:33 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712232"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:32 -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; Thu, 13 Oct 2011 05:53:32 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhK023753; Thu, 13 Oct 2011 02:53:31 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a09c576e4445f8071e681b19ed531f24ea7ec095
Message-ID: <a09c576e4445f8071e68.1318499609@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:29 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 04 of 27 v2] libxl: libxl_destroy_cpumap becomes
 libxl_cpumap_destroy
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499238 -3600
# Node ID a09c576e4445f8071e681b19ed531f24ea7ec095
# Parent  6bc67c8ad63e80f40003a2e3564e97e2f14942ef
libxl: libxl_destroy_cpumap becomes libxl_cpumap_destroy

Now that IDL type destructors are no longer libxl_*_destroy we can use the more
common libxl_NOUN_VERB structure here.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 6bc67c8ad63e -r a09c576e4445 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:47:18 2011 +0100
@@ -2775,7 +2775,7 @@ int libxl_create_cpupool(libxl_ctx *ctx,
             if (rc) {
                 LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
                     "Error moving cpu to cpupool");
-                libxl_destroy_cpupool(ctx, *poolid);
+                libxl_cpupool_destroy(ctx, *poolid);
                 libxl__free_all(&gc);
                 return ERROR_FAIL;
             }
@@ -2799,7 +2799,7 @@ int libxl_create_cpupool(libxl_ctx *ctx,
     }
 }
 
-int libxl_destroy_cpupool(libxl_ctx *ctx, uint32_t poolid)
+int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     int rc, i;
diff -r 6bc67c8ad63e -r a09c576e4445 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Oct 13 10:47:18 2011 +0100
@@ -503,7 +503,7 @@ int libxl_get_freecpus(libxl_ctx *ctx, l
 int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
                          libxl_cpumap cpumap, libxl_uuid *uuid,
                          uint32_t *poolid);
-int libxl_destroy_cpupool(libxl_ctx *ctx, uint32_t poolid);
+int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid);
 int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid);
 int libxl_cpupool_cpuadd(libxl_ctx *ctx, uint32_t poolid, int cpu);
 int libxl_cpupool_cpuadd_node(libxl_ctx *ctx, uint32_t poolid, int node, int *cpus);
diff -r 6bc67c8ad63e -r a09c576e4445 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:47:18 2011 +0100
@@ -4954,7 +4954,7 @@ int main_cpupooldestroy(int argc, char *
         return -ERROR_FAIL;
     }
 
-    return -libxl_destroy_cpupool(ctx, poolid);
+    return -libxl_cpupool_destroy(ctx, poolid);
 }
 
 int main_cpupoolrename(int argc, char **argv)

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:02:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:02:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REI7u-0006fN-SX; Thu, 13 Oct 2011 03:02:58 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyr-0004gO-47
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:37 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318499609!707369!4
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1245 invoked from network); 13 Oct 2011 09:53:33 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712234"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:33 -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; Thu, 13 Oct 2011 05:53:33 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhL023753; Thu, 13 Oct 2011 02:53:32 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 3ebd2ec3ff8054a1b7b0995dc0b79a16a866a96f
Message-ID: <3ebd2ec3ff8054a1b7b0.1318499610@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:30 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 05 of 27 v2] libxl: add a comment describing the
 device interfaces
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499553 -3600
# Node ID 3ebd2ec3ff8054a1b7b0995dc0b79a16a866a96f
# Parent  a09c576e4445f8071e681b19ed531f24ea7ec095
libxl: add a comment describing the device interfaces.

Subsequent patches will endevour to make reality match this defined
interface.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r a09c576e4445 -r 3ebd2ec3ff80 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Oct 13 10:52:33 2011 +0100
@@ -379,6 +379,65 @@ libxl_dominfo * libxl_list_domain(libxl_
 libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx*, int *nb_pool);
 libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm);
 
+/*
+ * Devices
+ * =======
+ *
+ * Each device is represented by a libxl_device_<TYPE> data structure
+ * which is defined via the IDL. In addition some devices have an
+ * additional data type libxl_device_<TYPE>_getinfo which contains
+ * further runtime information about the device.
+ *
+ * A common set of methods are available for each device type. These
+ * are described below.
+ *
+ * Querying
+ * --------
+ *
+ * libxl_device_<type>_list(ctx, domid, nr):
+ *
+ *   Returns an array of libxl_device_<type> length nr representing
+ *   the devices attached to the specified domain.
+ *
+ * libxl_device_<type>_getinfo(ctx, domid, device, info):
+ *
+ *   Initialises info with details of the given device which must be
+ *   attached to the specified domain.
+ *
+ * Creation / Control
+ * ------------------
+ *
+ * libxl_device_<type>_init(ctx, device):
+ *
+ *    Initalises device to a default configuration.
+ *
+ * libxl_device_<type>_add(ctx, domid, device):
+ *
+ *   Adds the given device to the specified domain. This can be called
+ *   while the guest is running (hotplug) or before boot (coldplug).
+ *
+ *   This function only sets up the device but does not wait for the
+ *   domain to connect to the device and therefore cannot block on the
+ *   guest.
+ *
+ * libxl_device_<type>_remove(ctx, domid, device):
+ *
+ *   Removes the given device from the specified domain by performing
+ *   an orderly unplug with guest co-operation. This requires that the
+ *   guest is running.
+ *
+ *   This method is currently synchronous and therefore can block
+ *   while interacting with the guest.
+ *
+ * libxl_device_<type>_destroy(ctx, domid, device):
+ *
+ *   Removes the given device from the specified domain without guest
+ *   co-operation. It is guest specific what affect this will have on
+ *   a running guest.
+ *
+ *   This function does not interact with the guest and therefore
+ *   cannot block on the guest.
+ */
 int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);
 int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, int wait);
 libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num);

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:05:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:05:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIAb-00074k-Pc; Thu, 13 Oct 2011 03:05:46 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyq-0004gN-Gr
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:37 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18868 invoked from network); 13 Oct 2011 09:53:32 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184469"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:32 -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; Thu, 13 Oct 2011 05:53:32 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhJ023753; Thu, 13 Oct 2011 02:53:30 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 6bc67c8ad63e80f40003a2e3564e97e2f14942ef
Message-ID: <6bc67c8ad63e80f40003.1318499608@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:28 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 03 of 27 v2] libxl: idl: use "dispose" rather
 than "destroy" for function to free IDL types
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499238 -3600
# Node ID 6bc67c8ad63e80f40003a2e3564e97e2f14942ef
# Parent  ed9950395a62c6077abf71a2e6d2a6502e0c59b4
libxl: idl: use "dispose" rather than "destroy" for function to free IDL types

Destroy is an overloaded term which would commonly like to be used for actual
destructive operations, such as destroying a domain etc.

Dispose isn't a great term but it does the job.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r ed9950395a62 -r 6bc67c8ad63e tools/libxl/gentest.py
--- a/tools/libxl/gentest.py	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/gentest.py	Thu Oct 13 10:47:18 2011 +0100
@@ -256,8 +256,8 @@ int main(int argc, char **argv)
         f.write("    printf(\"%%s: %%s\\n\", \"%s\", s);\n" % ty.typename)
         f.write("    if (s == NULL) abort();\n")
         f.write("    free(s);\n")
-        if ty.destructor_fn is not None:
-            f.write("    %s(&%s_val);\n" % (ty.destructor_fn, ty.typename))
+        if ty.dispose_fn is not None:
+            f.write("    %s(&%s_val);\n" % (ty.dispose_fn, ty.typename))
         f.write("\n")
 
     f.write("    printf(\"Testing Enumerations\\n\");\n")
diff -r ed9950395a62 -r 6bc67c8ad63e tools/libxl/gentypes.py
--- a/tools/libxl/gentypes.py	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/gentypes.py	Thu Oct 13 10:47:18 2011 +0100
@@ -74,7 +74,7 @@ def libxl_C_type_define(ty, indent = "")
         raise NotImplementedError("%s" % type(ty))
     return s.replace("\n", "\n%s" % indent)
 
-def libxl_C_type_destroy(ty, v, indent = "    ", parent = None):
+def libxl_C_type_dispose(ty, v, indent = "    ", parent = None):
     s = ""
     if isinstance(ty, libxltypes.KeyedUnion):
         if parent is None:
@@ -83,16 +83,16 @@ def libxl_C_type_destroy(ty, v, indent =
         for f in ty.fields:
             (nparent,fexpr) = ty.member(v, f, parent is None)
             s += "case %s:\n" % f.enumname
-            s += libxl_C_type_destroy(f.type, fexpr, indent + "    ", nparent)
+            s += libxl_C_type_dispose(f.type, fexpr, indent + "    ", nparent)
             s += "    break;\n"
         s += "}\n"
-    elif isinstance(ty, libxltypes.Struct) and (parent is None or ty.destructor_fn is None):
+    elif isinstance(ty, libxltypes.Struct) and (parent is None or ty.dispose_fn is None):
         for f in [f for f in ty.fields if not f.const]:
             (nparent,fexpr) = ty.member(v, f, parent is None)
-            s += libxl_C_type_destroy(f.type, fexpr, "", nparent)
+            s += libxl_C_type_dispose(f.type, fexpr, "", nparent)
     else:
-        if ty.destructor_fn is not None:
-            s += "%s(%s);\n" % (ty.destructor_fn, ty.pass_arg(v, parent is None))
+        if ty.dispose_fn is not None:
+            s += "%s(%s);\n" % (ty.dispose_fn, ty.pass_arg(v, parent is None))
 
     if s != "":
         s = indent + s
@@ -217,8 +217,8 @@ if __name__ == '__main__':
 
     for ty in types:
         f.write(libxl_C_type_define(ty) + ";\n")
-        if ty.destructor_fn is not None:
-            f.write("void %s(%s);\n" % (ty.destructor_fn, ty.make_arg("p")))
+        if ty.dispose_fn is not None:
+            f.write("void %s(%s);\n" % (ty.dispose_fn, ty.make_arg("p")))
         if ty.json_fn is not None:
             f.write("char *%s_to_json(libxl_ctx *ctx, %s);\n" % (ty.typename, ty.make_arg("p")))
         if isinstance(ty, libxltypes.Enumeration):
@@ -277,10 +277,10 @@ if __name__ == '__main__':
 
 """ % " ".join(sys.argv))
 
-    for ty in [t for t in types if t.destructor_fn is not None and t.autogenerate_destructor]:
-        f.write("void %s(%s)\n" % (ty.destructor_fn, ty.make_arg("p")))
+    for ty in [t for t in types if t.dispose_fn is not None and t.autogenerate_dispose_fn]:
+        f.write("void %s(%s)\n" % (ty.dispose_fn, ty.make_arg("p")))
         f.write("{\n")
-        f.write(libxl_C_type_destroy(ty, "p"))
+        f.write(libxl_C_type_dispose(ty, "p"))
         f.write("    memset(p, LIBXL_DTOR_POISON, sizeof(*p));\n")
         f.write("}\n")
         f.write("\n")
diff -r ed9950395a62 -r 6bc67c8ad63e tools/libxl/idl.txt
--- a/tools/libxl/idl.txt	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/idl.txt	Thu Oct 13 10:47:18 2011 +0100
@@ -39,14 +39,14 @@ Type.passby: (default: libxltypes.PASS_B
    libxltypes.PASS_BY_VALUE
    libxltypes.PASS_BY_REFERENCE
 
-Type.destructor_fn: (default: typename + "_destroy" or None if type == None)
+Type.dispose_fn: (default: typename + "_dispose" or None if type == None)
 
  The name of the C function which will free all dynamically allocated
  memory contained within this type (but not the type itself).
 
-Type.autogenerate_destructor: (default: True)
+Type.autogenerate_dispose_fn: (default: True)
 
- Indicates if the above named Type.destructor_fn should be
+ Indicates if the above named Type.dispose_fn should be
  autogenerated.
 
 Type.json_fn: (default: typename + "_gen_json" or None if type == None)
diff -r ed9950395a62 -r 6bc67c8ad63e tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:47:18 2011 +0100
@@ -87,12 +87,12 @@ int libxl_ctx_free(libxl_ctx *ctx)
 {
     if (!ctx) return 0;
     if (ctx->xch) xc_interface_close(ctx->xch);
-    libxl_version_info_destroy(&ctx->version_info);
+    libxl_version_info_dispose(&ctx->version_info);
     if (ctx->xsh) xs_daemon_close(ctx->xsh);
     return 0;
 }
 
-void libxl_string_list_destroy(libxl_string_list *psl)
+void libxl_string_list_dispose(libxl_string_list *psl)
 {
     int i;
     libxl_string_list sl = *psl;
@@ -105,7 +105,7 @@ void libxl_string_list_destroy(libxl_str
     free(sl);
 }
 
-void libxl_key_value_list_destroy(libxl_key_value_list *pkvl)
+void libxl_key_value_list_dispose(libxl_key_value_list *pkvl)
 {
     int i;
     libxl_key_value_list kvl = *pkvl;
@@ -767,7 +767,7 @@ int libxl_domain_destroy(libxl_ctx *ctx,
         libxl__qmp_cleanup(&gc, domid);
     }
     if (libxl__devices_destroy(&gc, domid, force) < 0)
-        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_destroy_devices failed for %d", domid);
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_devices_dispose failed for %d", domid);
 
     vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path));
     if (vm_path)
@@ -1641,7 +1641,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u
     }
 out:
     for (i = 0; i < num; i++)
-        libxl_device_disk_destroy(&disks[i]);
+        libxl_device_disk_dispose(&disks[i]);
     free(disks);
     return ret;
 }
@@ -2241,7 +2241,7 @@ fail:
     xc_hypercall_buffer_free(ctx->xch, coremap);
     xc_hypercall_buffer_free(ctx->xch, socketmap);
     xc_hypercall_buffer_free(ctx->xch, nodemap);
-    libxl_topologyinfo_destroy(info);
+    libxl_topologyinfo_dispose(info);
     return ERROR_FAIL;
 }
 
@@ -2722,7 +2722,7 @@ int libxl_tmem_freeable(libxl_ctx *ctx)
     return rc;
 }
 
-void libxl_file_reference_destroy(libxl_file_reference *f)
+void libxl_file_reference_dispose(libxl_file_reference *f)
 {
     libxl__file_reference_unmap(f);
     free(f->path);
@@ -2852,7 +2852,7 @@ int libxl_destroy_cpupool(libxl_ctx *ctx
     rc = 0;
 
 out1:
-    libxl_cpumap_destroy(&cpumap);
+    libxl_cpumap_dispose(&cpumap);
 out:
     xc_cpupool_infofree(ctx->xch, info);
     libxl__free_all(&gc);
@@ -2941,10 +2941,10 @@ int libxl_cpupool_cpuadd_node(libxl_ctx 
         }
     }
 
-    libxl_topologyinfo_destroy(&topology);
+    libxl_topologyinfo_dispose(&topology);
 
 out:
-    libxl_cpumap_destroy(&freemap);
+    libxl_cpumap_dispose(&freemap);
     return rc;
 }
 
@@ -2993,11 +2993,11 @@ int libxl_cpupool_cpuremove_node(libxl_c
         }
     }
 
-    libxl_topologyinfo_destroy(&topology);
+    libxl_topologyinfo_dispose(&topology);
 
 out:
     for (p = 0; p < n_pools; p++) {
-        libxl_cpupoolinfo_destroy(poolinfo + p);
+        libxl_cpupoolinfo_dispose(poolinfo + p);
     }
 
     return ret;
diff -r ed9950395a62 -r 6bc67c8ad63e tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Oct 13 10:47:18 2011 +0100
@@ -144,10 +144,10 @@ typedef uint8_t libxl_mac[6];
 #define LIBXL_MAC_BYTES(mac) mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]
 
 typedef char **libxl_string_list;
-void libxl_string_list_destroy(libxl_string_list *sl);
+void libxl_string_list_dispose(libxl_string_list *sl);
 
 typedef char **libxl_key_value_list;
-void libxl_key_value_list_destroy(libxl_key_value_list *kvl);
+void libxl_key_value_list_dispose(libxl_key_value_list *kvl);
 
 typedef uint32_t libxl_hwcap[8];
 
@@ -155,14 +155,14 @@ typedef struct {
     uint32_t size;          /* number of bytes in map */
     uint8_t *map;
 } libxl_cpumap;
-void libxl_cpumap_destroy(libxl_cpumap *map);
+void libxl_cpumap_dispose(libxl_cpumap *map);
 
 typedef struct {
     uint32_t entries;
     uint32_t *array;
 } libxl_cpuarray;
 #define LIBXL_CPUARRAY_INVALID_ENTRY  ~0
-void libxl_cpuarray_destroy(libxl_cpuarray *array);
+void libxl_cpuarray_dispose(libxl_cpuarray *array);
 
 typedef struct {
     /*
@@ -174,7 +174,7 @@ typedef struct {
     void * data;
     size_t size;
 } libxl_file_reference;
-void libxl_file_reference_destroy(libxl_file_reference *p);
+void libxl_file_reference_dispose(libxl_file_reference *p);
 
 /* libxl_cpuid_policy_list is a dynamic array storing CPUID policies
  * for multiple leafs. It is terminated with an entry holding
@@ -182,7 +182,7 @@ void libxl_file_reference_destroy(libxl_
  */
 typedef struct libxl__cpuid_policy libxl_cpuid_policy;
 typedef libxl_cpuid_policy * libxl_cpuid_policy_list;
-void libxl_cpuid_destroy(libxl_cpuid_policy_list *cpuid_list);
+void libxl_cpuid_dispose(libxl_cpuid_policy_list *cpuid_list);
 
 #define LIBXL_PCI_FUNC_ALL (~0U)
 
@@ -261,7 +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);
-void libxl_domain_config_destroy(libxl_domain_config *d_config);
+void libxl_domain_config_dispose(libxl_domain_config *d_config);
 int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info,
                           uint32_t domid, int fd);
 int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid);
diff -r ed9950395a62 -r 6bc67c8ad63e tools/libxl/libxl_cpuid.c
--- a/tools/libxl/libxl_cpuid.c	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/libxl_cpuid.c	Thu Oct 13 10:47:18 2011 +0100
@@ -16,7 +16,7 @@
 #include "libxl_osdeps.h"
 #include "libxl_internal.h"
 
-void libxl_cpuid_destroy(libxl_cpuid_policy_list *p_cpuid_list)
+void libxl_cpuid_dispose(libxl_cpuid_policy_list *p_cpuid_list)
 {
     int i, j;
     libxl_cpuid_policy_list cpuid_list = *p_cpuid_list;
diff -r ed9950395a62 -r 6bc67c8ad63e tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/libxl_create.c	Thu Oct 13 10:47:18 2011 +0100
@@ -31,33 +31,33 @@
 #include "libxl_internal.h"
 #include "flexarray.h"
 
-void libxl_domain_config_destroy(libxl_domain_config *d_config)
+void libxl_domain_config_dispose(libxl_domain_config *d_config)
 {
     int i;
 
     for (i=0; i<d_config->num_disks; i++)
-        libxl_device_disk_destroy(&d_config->disks[i]);
+        libxl_device_disk_dispose(&d_config->disks[i]);
     free(d_config->disks);
 
     for (i=0; i<d_config->num_vifs; i++)
-        libxl_device_nic_destroy(&d_config->vifs[i]);
+        libxl_device_nic_dispose(&d_config->vifs[i]);
     free(d_config->vifs);
 
     for (i=0; i<d_config->num_pcidevs; i++)
-        libxl_device_pci_destroy(&d_config->pcidevs[i]);
+        libxl_device_pci_dispose(&d_config->pcidevs[i]);
     free(d_config->pcidevs);
 
     for (i=0; i<d_config->num_vfbs; i++)
-        libxl_device_vfb_destroy(&d_config->vfbs[i]);
+        libxl_device_vfb_dispose(&d_config->vfbs[i]);
     free(d_config->vfbs);
 
     for (i=0; i<d_config->num_vkbs; i++)
-        libxl_device_vkb_destroy(&d_config->vkbs[i]);
+        libxl_device_vkb_dispose(&d_config->vkbs[i]);
     free(d_config->vkbs);
 
-    libxl_domain_create_info_destroy(&d_config->c_info);
-    libxl_domain_build_info_destroy(&d_config->b_info);
-    libxl_device_model_info_destroy(&d_config->dm_info);
+    libxl_domain_create_info_dispose(&d_config->c_info);
+    libxl_domain_build_info_dispose(&d_config->b_info);
+    libxl_device_model_info_dispose(&d_config->dm_info);
 }
 
 int libxl_init_create_info(libxl_ctx *ctx, libxl_domain_create_info *c_info)
@@ -512,7 +512,7 @@ static int do_domain_create(libxl__gc *g
         if ( ret )
             goto error_out;
         libxl__device_console_add(gc, domid, &console, &state);
-        libxl_device_console_destroy(&console);
+        libxl_device_console_dispose(&console);
 
         dm_info->domid = domid;
         ret = libxl__create_device_model(gc, dm_info,
@@ -549,7 +549,7 @@ static int do_domain_create(libxl__gc *g
              console.consback = LIBXL_CONSOLE_BACKEND_IOEMU;
 
         libxl__device_console_add(gc, domid, &console, &state);
-        libxl_device_console_destroy(&console);
+        libxl_device_console_dispose(&console);
 
         if (need_qemu) {
             /* only copy those useful configs */
diff -r ed9950395a62 -r 6bc67c8ad63e tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/libxl_types.idl	Thu Oct 13 10:47:18 2011 +0100
@@ -8,13 +8,13 @@ namespace("libxl_")
 libxl_domid = Builtin("domid", json_fn = "yajl_gen_integer", autogenerate_json = False)
 libxl_uuid = Builtin("uuid", passby=PASS_BY_REFERENCE)
 libxl_mac = Builtin("mac", passby=PASS_BY_REFERENCE)
-libxl_cpumap = Builtin("cpumap", destructor_fn="libxl_cpumap_destroy", passby=PASS_BY_REFERENCE)
-libxl_cpuarray = Builtin("cpuarray", destructor_fn="libxl_cpuarray_destroy", passby=PASS_BY_REFERENCE)
-libxl_cpuid_policy_list = Builtin("cpuid_policy_list", destructor_fn="libxl_cpuid_destroy", passby=PASS_BY_REFERENCE)
+libxl_cpumap = Builtin("cpumap", dispose_fn="libxl_cpumap_dispose", passby=PASS_BY_REFERENCE)
+libxl_cpuarray = Builtin("cpuarray", dispose_fn="libxl_cpuarray_dispose", passby=PASS_BY_REFERENCE)
+libxl_cpuid_policy_list = Builtin("cpuid_policy_list", dispose_fn="libxl_cpuid_dispose", passby=PASS_BY_REFERENCE)
 
-libxl_string_list = Builtin("string_list", destructor_fn="libxl_string_list_destroy", passby=PASS_BY_REFERENCE)
-libxl_key_value_list = Builtin("key_value_list", destructor_fn="libxl_key_value_list_destroy", passby=PASS_BY_REFERENCE)
-libxl_file_reference = Builtin("file_reference", destructor_fn="libxl_file_reference_destroy", passby=PASS_BY_REFERENCE)
+libxl_string_list = Builtin("string_list", dispose_fn="libxl_string_list_dispose", passby=PASS_BY_REFERENCE)
+libxl_key_value_list = Builtin("key_value_list", dispose_fn="libxl_key_value_list_dispose", passby=PASS_BY_REFERENCE)
+libxl_file_reference = Builtin("file_reference", dispose_fn="libxl_file_reference_dispose", passby=PASS_BY_REFERENCE)
 
 libxl_hwcap = Builtin("hwcap", passby=PASS_BY_REFERENCE)
 
@@ -109,7 +109,7 @@ SHUTDOWN_* constant."""),
     ("cpu_time",    uint64),
     ("vcpu_max_id", uint32),
     ("vcpu_online", uint32),
-    ], destructor_fn=None)
+    ], dispose_fn=None)
 
 libxl_cpupoolinfo = Struct("cpupoolinfo", [
     ("poolid",      uint32),
@@ -121,7 +121,7 @@ libxl_cpupoolinfo = Struct("cpupoolinfo"
 libxl_vminfo = Struct("vminfo", [
     ("uuid", libxl_uuid),
     ("domid", libxl_domid),
-    ], destructor_fn=None)
+    ], dispose_fn=None)
 
 libxl_version_info = Struct("version_info", [
     ("xen_version_major", integer),
@@ -362,7 +362,7 @@ libxl_physinfo = Struct("physinfo", [
     ("nr_nodes", uint32),
     ("hw_cap", libxl_hwcap),
     ("phys_cap", uint32),
-    ], destructor_fn=None, dir=DIR_OUT)
+    ], dispose_fn=None, dir=DIR_OUT)
 
 libxl_topologyinfo = Struct("topologyinfo", [
     ("coremap", libxl_cpuarray,   False, "cpu to core map"),
@@ -373,4 +373,4 @@ libxl_topologyinfo = Struct("topologyinf
 libxl_sched_credit = Struct("sched_credit", [
     ("weight", integer),
     ("cap", integer),
-    ], destructor_fn=None)
+    ], dispose_fn=None)
diff -r ed9950395a62 -r 6bc67c8ad63e tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Thu Oct 13 10:47:18 2011 +0100
@@ -157,7 +157,7 @@ int libxl_name_to_cpupoolid(libxl_ctx *c
             }
             free(poolname);
         }
-        libxl_cpupoolinfo_destroy(poolinfo + i);
+        libxl_cpupoolinfo_dispose(poolinfo + i);
     }
     free(poolinfo);
     return ret;
@@ -478,7 +478,7 @@ int libxl_mac_to_device_nic(libxl_ctx *c
     }
 
     for (i=0; i<nb; i++)
-        libxl_nicinfo_destroy(&nics[i]);
+        libxl_nicinfo_dispose(&nics[i]);
     free(nics);
     return rc;
 }
@@ -579,7 +579,7 @@ int libxl_cpumap_alloc(libxl_ctx *ctx, l
     return 0;
 }
 
-void libxl_cpumap_destroy(libxl_cpumap *map)
+void libxl_cpumap_dispose(libxl_cpumap *map)
 {
     free(map->map);
 }
@@ -624,7 +624,7 @@ int libxl_cpuarray_alloc(libxl_ctx *ctx,
     return 0;
 }
 
-void libxl_cpuarray_destroy(libxl_cpuarray *array)
+void libxl_cpuarray_dispose(libxl_cpuarray *array)
 {
     free(array->array);
 }
diff -r ed9950395a62 -r 6bc67c8ad63e tools/libxl/libxltypes.py
--- a/tools/libxl/libxltypes.py	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/libxltypes.py	Thu Oct 13 10:47:18 2011 +0100
@@ -44,11 +44,11 @@ class Type(object):
             self.rawname = typename
 
         if self.typename is not None:
-            self.destructor_fn = kwargs.setdefault('destructor_fn', self.typename + "_destroy")
+            self.dispose_fn = kwargs.setdefault('dispose_fn', self.typename + "_dispose")
         else:
-            self.destructor_fn = kwargs.setdefault('destructor_fn', None)
+            self.dispose_fn = kwargs.setdefault('dispose_fn', None)
 
-        self.autogenerate_destructor = kwargs.setdefault('autogenerate_destructor', True)
+        self.autogenerate_dispose_fn = kwargs.setdefault('autogenerate_dispose_fn', True)
 
         if self.typename is not None:
             self.json_fn = kwargs.setdefault('json_fn', self.typename + "_gen_json")
@@ -88,15 +88,15 @@ class Type(object):
 class Builtin(Type):
     """Builtin type"""
     def __init__(self, typename, **kwargs):
-        kwargs.setdefault('destructor_fn', None)
-        kwargs.setdefault('autogenerate_destructor', False)
+        kwargs.setdefault('dispose_fn', None)
+        kwargs.setdefault('autogenerate_dispose_fn', False)
         kwargs.setdefault('autogenerate_json', False)
         Type.__init__(self, typename, **kwargs)
 
 class Number(Builtin):
     def __init__(self, ctype, **kwargs):
         kwargs.setdefault('namespace', None)
-        kwargs.setdefault('destructor_fn', None)
+        kwargs.setdefault('dispose_fn', None)
         kwargs.setdefault('signed', False)
         kwargs.setdefault('json_fn', "yajl_gen_integer")
         self.signed = kwargs['signed']
@@ -105,7 +105,7 @@ class Number(Builtin):
 class UInt(Number):
     def __init__(self, w, **kwargs):
         kwargs.setdefault('namespace', None)
-        kwargs.setdefault('destructor_fn', None)
+        kwargs.setdefault('dispose_fn', None)
         Number.__init__(self, "uint%d_t" % w, **kwargs)
 
         self.width = w
@@ -122,7 +122,7 @@ class EnumerationValue(object):
 
 class Enumeration(Type):
     def __init__(self, typename, values, **kwargs):
-        kwargs.setdefault('destructor_fn', None)
+        kwargs.setdefault('dispose_fn', None)
         Type.__init__(self, typename, **kwargs)
 
         self.values = []
@@ -205,7 +205,7 @@ class Union(Aggregate):
         # union therefore any specific instance of this class will
         # need to provide an explicit destructor function.
         kwargs.setdefault('passby', PASS_BY_REFERENCE)
-        kwargs.setdefault('destructor_fn', None)
+        kwargs.setdefault('dispose_fn', None)
         Aggregate.__init__(self, "union", name, fields, **kwargs)
 
 class KeyedUnion(Aggregate):
@@ -244,7 +244,7 @@ uint16 = UInt(16)
 uint32 = UInt(32)
 uint64 = UInt(64)
 
-string = Builtin("char *", namespace = None, destructor_fn = "free",
+string = Builtin("char *", namespace = None, dispose_fn = "free",
                  json_fn = "libxl__string_gen_json",
                  autogenerate_json = False)
 
diff -r ed9950395a62 -r 6bc67c8ad63e tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:47:18 2011 +0100
@@ -1685,7 +1685,7 @@ start:
             case LIBXL_EVENT_TYPE_DISK_EJECT:
                 if (libxl_event_get_disk_eject_info(ctx, domid, &event, &disk)) {
                     libxl_cdrom_insert(ctx, domid, &disk);
-                    libxl_device_disk_destroy(&disk);
+                    libxl_device_disk_dispose(&disk);
                 }
                 break;
         }
@@ -1701,7 +1701,7 @@ out:
     if (logfile != 2)
         close(logfile);
 
-    libxl_domain_config_destroy(&d_config);
+    libxl_domain_config_dispose(&d_config);
 
     free(config_data);
 
@@ -2047,7 +2047,7 @@ static void pcilist(const char *dom)
         printf("%02x.%01x %04x:%02x:%02x.%01x\n",
                (pcidevs[i].vdevfn >> 3) & 0x1f, pcidevs[i].vdevfn & 0x7,
                pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func);
-        libxl_device_pci_destroy(&pcidevs[i]);
+        libxl_device_pci_dispose(&pcidevs[i]);
     }
     free(pcidevs);
 }
@@ -2078,7 +2078,7 @@ static void pcidetach(const char *dom, c
         exit(2);
     }
     libxl_device_pci_remove(ctx, domid, &pcidev, force);
-    libxl_device_pci_destroy(&pcidev);
+    libxl_device_pci_dispose(&pcidev);
 }
 
 int main_pcidetach(int argc, char **argv)
@@ -2115,7 +2115,7 @@ static void pciattach(const char *dom, c
         exit(2);
     }
     libxl_device_pci_add(ctx, domid, &pcidev);
-    libxl_device_pci_destroy(&pcidev);
+    libxl_device_pci_dispose(&pcidev);
 }
 
 int main_pciattach(int argc, char **argv)
@@ -2231,7 +2231,7 @@ static void list_domains_details(const l
         memset(&d_config, 0x00, sizeof(d_config));
         parse_config_data(config_file, (char *)data, len, &d_config, &dm_info);
         printf_info(info[i].domid, &d_config, &dm_info);
-        libxl_domain_config_destroy(&d_config);
+        libxl_domain_config_dispose(&d_config);
         free(data);
         free(config_file);
     }
@@ -3323,7 +3323,7 @@ static void print_domain_vcpuinfo(uint32
 
     for (i = 0; i < nb_vcpu; i++) {
         print_vcpuinfo(domid, &vcpuinfo[i], nr_cpus);
-        libxl_vcpuinfo_destroy(&vcpuinfo[i]);
+        libxl_vcpuinfo_dispose(&vcpuinfo[i]);
     }
 
     free(vcpuinfo);
@@ -3445,7 +3445,7 @@ static void vcpupin(const char *d, const
         }
     }
   vcpupin_out1:
-    libxl_cpumap_destroy(&cpumap);
+    libxl_cpumap_dispose(&cpumap);
   vcpupin_out:
     ;
 }
@@ -3485,7 +3485,7 @@ static void vcpuset(const char *d, const
     if (libxl_set_vcpuonline(ctx, domid, &cpumap) < 0)
         fprintf(stderr, "libxl_set_vcpuonline failed domid=%d max_vcpus=%d\n", domid, max_vcpus);
 
-    libxl_cpumap_destroy(&cpumap);
+    libxl_cpumap_dispose(&cpumap);
 }
 
 int main_vcpuset(int argc, char **argv)
@@ -3609,7 +3609,7 @@ static void output_topologyinfo(void)
 
     printf("numa_info              : none\n");
 
-    libxl_topologyinfo_destroy(&info);
+    libxl_topologyinfo_dispose(&info);
 
     return;
 }
@@ -4018,7 +4018,7 @@ int main_networkattach(int argc, char **
         fprintf(stderr, "libxl_device_nic_add failed.\n");
         return 1;
     }
-    libxl_device_nic_destroy(&nic);
+    libxl_device_nic_dispose(&nic);
     return 0;
 }
 
@@ -4051,7 +4051,7 @@ int main_networklist(int argc, char **ar
             printf("%6d %5d %6d %5d/%-11d %-30s\n",
                    nics[i].devid, nics[i].state, nics[i].evtch,
                    nics[i].rref_tx, nics[i].rref_rx, nics[i].backend);
-            libxl_nicinfo_destroy(&nics[i]);
+            libxl_nicinfo_dispose(&nics[i]);
         }
         free(nics);
     }
@@ -4086,7 +4086,7 @@ int main_networkdetach(int argc, char **
         fprintf(stderr, "libxl_device_nic_del failed.\n");
         return 1;
     }
-    libxl_device_nic_destroy(&nic);
+    libxl_device_nic_dispose(&nic);
     return 0;
 }
 
@@ -4152,9 +4152,9 @@ int main_blocklist(int argc, char **argv
                 printf("%-5d %-3d %-6d %-5d %-6d %-8d %-30s\n",
                        diskinfo.devid, diskinfo.backend_id, diskinfo.frontend_id,
                        diskinfo.state, diskinfo.evtch, diskinfo.rref, diskinfo.backend);
-                libxl_diskinfo_destroy(&diskinfo);
+                libxl_diskinfo_dispose(&diskinfo);
             }
-            libxl_device_disk_destroy(&disks[i]);
+            libxl_device_disk_dispose(&disks[i]);
         }
         free(disks);
     }
@@ -4791,7 +4791,7 @@ int main_cpupoolcreate(int argc, char **
             n_nodes++;
         }
 
-        libxl_topologyinfo_destroy(&topology);
+        libxl_topologyinfo_dispose(&topology);
 
         if (n_cpus == 0) {
             fprintf(stderr, "no free cpu found\n");
@@ -4931,7 +4931,7 @@ int main_cpupoollist(int argc, char **ar
                 printf("\n");
             }
         }
-        libxl_cpupoolinfo_destroy(poolinfo + p);
+        libxl_cpupoolinfo_dispose(poolinfo + p);
     }
 
     return ret;
@@ -5132,7 +5132,7 @@ int main_cpupoolnumasplit(int argc, char
     poolid = poolinfo[0].poolid;
     schedid = poolinfo[0].sched_id;
     for (p = 0; p < n_pools; p++) {
-        libxl_cpupoolinfo_destroy(poolinfo + p);
+        libxl_cpupoolinfo_dispose(poolinfo + p);
     }
     if (n_pools > 1) {
         fprintf(stderr, "splitting not possible, already cpupools in use\n");
@@ -5146,7 +5146,7 @@ int main_cpupoolnumasplit(int argc, char
 
     if (libxl_cpumap_alloc(ctx, &cpumap)) {
         fprintf(stderr, "Failed to allocate cpumap\n");
-        libxl_topologyinfo_destroy(&topology);
+        libxl_topologyinfo_dispose(&topology);
         return -ERROR_FAIL;
     }
 
@@ -5229,8 +5229,8 @@ int main_cpupoolnumasplit(int argc, char
     }
 
 out:
-    libxl_topologyinfo_destroy(&topology);
-    libxl_cpumap_destroy(&cpumap);
+    libxl_topologyinfo_dispose(&topology);
+    libxl_cpumap_dispose(&cpumap);
 
     return ret;
 }
diff -r ed9950395a62 -r 6bc67c8ad63e tools/python/genwrap.py
--- a/tools/python/genwrap.py	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/python/genwrap.py	Thu Oct 13 10:47:18 2011 +0100
@@ -100,8 +100,8 @@ def py_attrib_set(ty, f):
 
 def py_object_def(ty):
     l = []
-    if ty.destructor_fn is not None:
-        dtor = '    %s(&self->obj);\n'%ty.destructor_fn
+    if ty.dispose_fn is not None:
+        dtor = '    %s(&self->obj);\n'%ty.dispose_fn
     else:
         dtor = ''
 
diff -r ed9950395a62 -r 6bc67c8ad63e tools/python/xen/lowlevel/xl/xl.c
--- a/tools/python/xen/lowlevel/xl/xl.c	Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/python/xen/lowlevel/xl/xl.c	Thu Oct 13 10:47:18 2011 +0100
@@ -246,7 +246,7 @@ int attrib__libxl_hwcap_set(PyObject *v,
 int attrib__libxl_key_value_list_set(PyObject *v, libxl_key_value_list *pptr)
 {
     if ( *pptr ) {
-        libxl_key_value_list_destroy(pptr);
+        libxl_key_value_list_dispose(pptr);
         *pptr = NULL;
     }
     if ( v == Py_None )

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:09:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:09:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIDt-0007Ui-TA; Thu, 13 Oct 2011 03:09:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyr-0004gT-WC
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:38 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19169 invoked from network); 13 Oct 2011 09:53:34 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184472"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:34 -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; Thu, 13 Oct 2011 05:53:34 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhM023753; Thu, 13 Oct 2011 02:53:33 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: cd3c10775e17705a736e8c0efd2b302ef4b6866d
Message-ID: <cd3c10775e17705a736e.1318499611@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:31 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 06 of 27 v2] libxl: various fixes to
 libxl_device_disk_list (and internals)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499565 -3600
# Node ID cd3c10775e17705a736e8c0efd2b302ef4b6866d
# Parent  3ebd2ec3ff8054a1b7b0995dc0b79a16a866a96f
libxl: various fixes to libxl_device_disk_list (and internals)

- handle realloc errors
- remove redundancy of libxl__append_disk_list_of_type return value
  and ndisks paramter.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 3ebd2ec3ff80 -r cd3c10775e17 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:33 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -1505,11 +1505,11 @@ int libxl_device_vkb_hard_shutdown(libxl
     return ERROR_NI;
 }
 
-static unsigned int libxl__append_disk_list_of_type(libxl__gc *gc,
-                                                    uint32_t domid,
-                                                    const char *type,
-                                                    libxl_device_disk **disks,
-                                                    unsigned int *ndisks)
+static int libxl__append_disk_list_of_type(libxl__gc *gc,
+                                           uint32_t domid,
+                                           const char *type,
+                                           libxl_device_disk **disks,
+                                           int *ndisks)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     char *be_path = NULL;
@@ -1523,11 +1523,16 @@ static unsigned int libxl__append_disk_l
     dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n);
     if (dir) {
         char *removable;
-        *disks = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
+        libxl_device_disk *tmp;
+        tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
+        if (tmp == NULL)
+            return ERROR_NOMEM;
+        *disks = tmp;
         pdisk = *disks + *ndisks;
         *ndisks += n;
         pdisk_end = *disks + *ndisks;
         for (; pdisk < pdisk_end; pdisk++, dir++) {
+            memset(pdisk, 0, sizeof(*pdisk));
             pdisk->backend_domid = 0;
             physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/params", be_path, *dir), &len);
             if (physpath_tmp && strchr(physpath_tmp, ':')) {
@@ -1555,22 +1560,37 @@ static unsigned int libxl__append_disk_l
             pdisk->format = LIBXL_DISK_FORMAT_UNKNOWN;
         }
     }
-
-    return n;
+    return 0;
 }
 
 libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     libxl_device_disk *disks = NULL;
-    unsigned int ndisks = 0;
-
-    *num = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, &ndisks);
-    *num += libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, &ndisks);
-    *num += libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, &ndisks);
+    int rc;
+
+    *num = 0;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num);
+    if (rc) goto out_err;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num);
+    if (rc) goto out_err;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num);
+    if (rc) goto out_err;
 
     libxl__free_all(&gc);
     return disks;
+
+out_err:
+    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list disks");
+    while (disks && *num) {
+        (*num)--;
+        libxl_device_disk_dispose(&disks[*num]);
+    }
+    free(disks);
+    return NULL;
 }
 
 int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:11:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:11:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIGJ-0007tM-Lt; Thu, 13 Oct 2011 03:11:39 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyt-0004gc-0k
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:39 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318499609!707369!5
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1343 invoked from network); 13 Oct 2011 09:53:35 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712236"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:35 -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; Thu, 13 Oct 2011 05:53:35 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhN023753; Thu, 13 Oct 2011 02:53:34 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1960247c5d873a4aede18c1aefcc28e78e6ea7dd
Message-ID: <1960247c5d873a4aede1.1318499612@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:32 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 07 of 27 v2] libxl: refactor code to construct
 disk from xenstore backend
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499565 -3600
# Node ID 1960247c5d873a4aede18c1aefcc28e78e6ea7dd
# Parent  cd3c10775e17705a736e8c0efd2b302ef4b6866d
libxl: refactor code to construct disk from xenstore backend

Temporarily retain unsafe behaviour of reading f.e. directory.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r cd3c10775e17 -r 1960247c5d87 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -1505,24 +1505,69 @@ int libxl_device_vkb_hard_shutdown(libxl
     return ERROR_NI;
 }
 
+static void libxl__device_disk_from_xs_be(libxl__gc *gc,
+                                          const char *be_path,
+                                          libxl_device_disk *disk)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    unsigned int len;
+    char *tmp;
+    const char *fe_path; /* XXX unsafe */
+
+    memset(disk, 0, sizeof(*disk));
+
+    tmp = xs_read(ctx->xsh, XBT_NULL,
+                  libxl__sprintf(gc, "%s/params", be_path), &len);
+    if (tmp && strchr(tmp, ':')) {
+        disk->pdev_path = strdup(strchr(tmp, ':') + 1);
+        free(tmp);
+    } else {
+        disk->pdev_path = tmp;
+    }
+    libxl_string_to_backend(ctx,
+                        libxl__xs_read(gc, XBT_NULL,
+                                       libxl__sprintf(gc, "%s/type", be_path)),
+                        &(disk->backend));
+    disk->vdev = xs_read(ctx->xsh, XBT_NULL,
+                         libxl__sprintf(gc, "%s/dev", be_path), &len);
+    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf
+                         (gc, "%s/removable", be_path));
+
+    if (tmp)
+        disk->removable = atoi(tmp);
+    else
+        disk->removable = 0;
+
+    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", be_path));
+    if (!strcmp(tmp, "w"))
+        disk->readwrite = 1;
+    else
+        disk->readwrite = 0;
+
+    fe_path = libxl__xs_read(gc, XBT_NULL,
+                             libxl__sprintf(gc, "%s/frontend", be_path));
+    tmp = libxl__xs_read(gc, XBT_NULL,
+                         libxl__sprintf(gc, "%s/device-type", fe_path));
+    disk->is_cdrom = !strcmp(tmp, "cdrom");
+
+    disk->format = LIBXL_DISK_FORMAT_UNKNOWN;
+}
+
 static int libxl__append_disk_list_of_type(libxl__gc *gc,
                                            uint32_t domid,
                                            const char *type,
                                            libxl_device_disk **disks,
                                            int *ndisks)
 {
-    libxl_ctx *ctx = libxl__gc_owner(gc);
     char *be_path = NULL;
     char **dir = NULL;
-    unsigned int n = 0, len = 0;
+    unsigned int n = 0;
     libxl_device_disk *pdisk = NULL, *pdisk_end = NULL;
-    char *physpath_tmp = NULL;
 
     be_path = libxl__sprintf(gc, "%s/backend/%s/%d",
                              libxl__xs_get_dompath(gc, 0), type, domid);
     dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n);
     if (dir) {
-        char *removable;
         libxl_device_disk *tmp;
         tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
         if (tmp == NULL)
@@ -1532,32 +1577,10 @@ static int libxl__append_disk_list_of_ty
         *ndisks += n;
         pdisk_end = *disks + *ndisks;
         for (; pdisk < pdisk_end; pdisk++, dir++) {
-            memset(pdisk, 0, sizeof(*pdisk));
+            const char *p;
+            p = libxl__sprintf(gc, "%s/%s", be_path, *dir);
+            libxl__device_disk_from_xs_be(gc, p, pdisk);
             pdisk->backend_domid = 0;
-            physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/params", be_path, *dir), &len);
-            if (physpath_tmp && strchr(physpath_tmp, ':')) {
-                pdisk->pdev_path = strdup(strchr(physpath_tmp, ':') + 1);
-                free(physpath_tmp);
-            } else {
-                pdisk->pdev_path = physpath_tmp;
-            }
-            libxl_string_to_backend(ctx, libxl__xs_read(gc, XBT_NULL,
-                libxl__sprintf(gc, "%s/%s/type", be_path, *dir)),
-                &(pdisk->backend));
-            pdisk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/dev", be_path, *dir), &len);
-            removable = libxl__xs_read(gc, XBT_NULL, libxl__sprintf
-                                       (gc, "%s/%s/removable", be_path, *dir));
-            if (removable)
-                pdisk->removable = atoi(removable);
-            else
-                pdisk->removable = 0;
-            if (!strcmp(libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s/mode", be_path, *dir)), "w"))
-                pdisk->readwrite = 1;
-            else
-                pdisk->readwrite = 0;
-            type = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/device-type", libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s/frontend", be_path, *dir))));
-            pdisk->is_cdrom = !strcmp(type, "cdrom");
-            pdisk->format = LIBXL_DISK_FORMAT_UNKNOWN;
         }
     }
     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 Oct 13 03:15:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:15:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIJx-0008Jx-1T; Thu, 13 Oct 2011 03:15:25 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyt-0004gj-Pp
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:40 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19337 invoked from network); 13 Oct 2011 09:53:36 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184473"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:36 -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; Thu, 13 Oct 2011 05:53:36 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhO023753; Thu, 13 Oct 2011 02:53:35 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c6c7a393fe4a6223df6952cc5fed04379166dc38
Message-ID: <c6c7a393fe4a6223df69.1318499613@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:33 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 08 of 27 v2] libxl: do not read f.e. xenstore
 dir in disk list 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 Ian Campbell <ian.campbell@citrix.com>
# Date 1318499565 -3600
# Node ID c6c7a393fe4a6223df6952cc5fed04379166dc38
# Parent  1960247c5d873a4aede18c1aefcc28e78e6ea7dd
libxl: do not read f.e. xenstore dir in disk list function

Instead store a duplicate of the "device-type" node in the backend dir
and use that instead.

This maintains the invariant that the list function is always "safe".

XXX I'm not sure this is an actual issue. The entries in the frontend device
XXX area are writeable by the guest but maybe the solution is to restrict that?

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 1960247c5d87 -r c6c7a393fe4a tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -1018,6 +1018,8 @@ int libxl_device_disk_add(libxl_ctx *ctx
     flexarray_append(back, libxl__device_disk_string_of_backend(disk->backend));
     flexarray_append(back, "mode");
     flexarray_append(back, disk->readwrite ? "w" : "r");
+    flexarray_append(back, "device-type");
+    flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
 
     flexarray_append(front, "backend-id");
     flexarray_append(front, libxl__sprintf(&gc, "%d", disk->backend_domid));
@@ -1512,7 +1514,6 @@ static void libxl__device_disk_from_xs_b
     libxl_ctx *ctx = libxl__gc_owner(gc);
     unsigned int len;
     char *tmp;
-    const char *fe_path; /* XXX unsafe */
 
     memset(disk, 0, sizeof(*disk));
 
@@ -1544,10 +1545,8 @@ static void libxl__device_disk_from_xs_b
     else
         disk->readwrite = 0;
 
-    fe_path = libxl__xs_read(gc, XBT_NULL,
-                             libxl__sprintf(gc, "%s/frontend", be_path));
     tmp = libxl__xs_read(gc, XBT_NULL,
-                         libxl__sprintf(gc, "%s/device-type", fe_path));
+                         libxl__sprintf(gc, "%s/device-type", be_path));
     disk->is_cdrom = !strcmp(tmp, "cdrom");
 
     disk->format = LIBXL_DISK_FORMAT_UNKNOWN;

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:18:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:18:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIMu-0000Nk-MA; Thu, 13 Oct 2011 03:18:28 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyv-0004hH-CX
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:41 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!5
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19483 invoked from network); 13 Oct 2011 09:53:38 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184474"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53: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; Thu, 13 Oct 2011 05:53:38 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhQ023753; Thu, 13 Oct 2011 02:53:36 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0ffea6ba20dddbf2a79cfed884a5444446c196ba
Message-ID: <0ffea6ba20dddbf2a79c.1318499615@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:35 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 10 of 27 v2] libxl: reimplement devid->nic in
 terms of from_xs_be 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 Ian Campbell <ian.campbell@citrix.com>
# Date 1318499565 -3600
# Node ID 0ffea6ba20dddbf2a79cfed884a5444446c196ba
# Parent  32a1ea4a0b13f2b9bdc9385cc175ed28086d5681
libxl: reimplement devid->nic in terms of from_xs_be function.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 32a1ea4a0b13 -r 0ffea6ba20dd tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -1315,7 +1315,7 @@ static void libxl__device_nic_from_xs_be
                   libxl__sprintf(gc, "%s/mac", be_path), &len);
     rc = libxl__parse_mac(tmp, nic->mac);
     if (rc)
-            memset(nic->mac, 0, sizeof(nic->mac));
+        memset(nic->mac, 0, sizeof(nic->mac));
 
     nic->ip = xs_read(ctx->xsh, XBT_NULL,
                       libxl__sprintf(gc, "%s/ip", be_path), &len);
@@ -1332,6 +1332,32 @@ static void libxl__device_nic_from_xs_be
     nic->ifname = NULL; /* XXX Only for TYPE_IOEMU */
 }
 
+int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
+                              const char *devid, libxl_device_nic *nic)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *dompath, *path;
+    int rc = ERROR_FAIL;
+
+    memset(nic, 0, sizeof (libxl_device_nic));
+    dompath = libxl__xs_get_dompath(&gc, domid);
+    if (!dompath)
+        goto out;
+
+    path = libxl__xs_read(&gc, XBT_NULL,
+                          libxl__sprintf(&gc, "%s/device/vif/%s/backend",
+                                         dompath, devid));
+    if (!path)
+        goto out;
+
+    libxl__device_nic_from_xs_be(&gc, path, nic);
+
+    rc = 0;
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
 static int libxl__append_nic_list_of_type(libxl__gc *gc,
                                            uint32_t domid,
                                            const char *type,
diff -r 32a1ea4a0b13 -r 0ffea6ba20dd tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Thu Oct 13 10:52:45 2011 +0100
@@ -483,41 +483,6 @@ int libxl_mac_to_device_nic(libxl_ctx *c
     return rc;
 }
 
-int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
-                              const char *devid, libxl_device_nic *nic)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *val;
-    char *dompath, *nic_path_fe, *nic_path_be;
-    int rc = ERROR_FAIL;
-
-    memset(nic, 0, sizeof (libxl_device_nic));
-    dompath = libxl__xs_get_dompath(&gc, domid);
-    if (!dompath) {
-        goto out;
-    }
-    nic_path_fe = libxl__sprintf(&gc, "%s/device/vif/%s", dompath, devid);
-    nic_path_be = libxl__xs_read(&gc, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", nic_path_fe));
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nic_path_fe));
-    if ( NULL == val ) {
-        goto out;
-    }
-    nic->backend_domid = strtoul(val, NULL, 10);
-    nic->devid = strtoul(devid, NULL, 10);
-
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", nic_path_fe));
-    rc = libxl__parse_mac(val, nic->mac);
-    if (rc)
-        goto out;
-
-    nic->script = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/script", nic_path_be), NULL);
-    rc = 0;
-out:
-    libxl__free_all(&gc);
-    return rc;
-}
-
 int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
                                const char *devid, libxl_device_disk *disk)
 {

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:21:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:21:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIPm-0000nl-GD; Thu, 13 Oct 2011 03:21:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyu-0004hG-SN
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:42 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318499609!707369!6
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1479 invoked from network); 13 Oct 2011 09:53:37 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:37 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712237"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53: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; Thu, 13 Oct 2011 05:53:37 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhP023753; Thu, 13 Oct 2011 02:53:36 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 32a1ea4a0b13f2b9bdc9385cc175ed28086d5681
Message-ID: <32a1ea4a0b13f2b9bdc9.1318499614@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:34 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 09 of 27 v2] libxl: update nic list API to use
 common device API style
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499565 -3600
# Node ID 32a1ea4a0b13f2b9bdc9385cc175ed28086d5681
# Parent  c6c7a393fe4a6223df6952cc5fed04379166dc38
libxl: update nic list API to use common device API style

libxl_device_nic_list returns an array of libxl_device_nic and
libxl_device_nic_getinfo retrieves further information.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r c6c7a393fe4a -r 32a1ea4a0b13 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -1291,60 +1291,138 @@ int libxl_device_nic_del(libxl_ctx *ctx,
     return rc;
 }
 
-libxl_nicinfo *libxl_list_nics(libxl_ctx *ctx, uint32_t domid, unsigned int *nb)
+static void libxl__device_nic_from_xs_be(libxl__gc *gc,
+                                         const char *be_path,
+                                         libxl_device_nic *nic)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    unsigned int len;
+    char *tmp;
+    int rc;
+
+    memset(nic, 0, sizeof(*nic));
+
+    tmp = xs_read(ctx->xsh, XBT_NULL,
+                  libxl__sprintf(gc, "%s/handle", be_path), &len);
+    if ( tmp )
+        nic->devid = atoi(tmp);
+    else
+        nic->devid = 0;
+
+    /* nic->mtu = */
+
+    tmp = xs_read(ctx->xsh, XBT_NULL,
+                  libxl__sprintf(gc, "%s/mac", be_path), &len);
+    rc = libxl__parse_mac(tmp, nic->mac);
+    if (rc)
+            memset(nic->mac, 0, sizeof(nic->mac));
+
+    nic->ip = xs_read(ctx->xsh, XBT_NULL,
+                      libxl__sprintf(gc, "%s/ip", be_path), &len);
+
+    nic->bridge = xs_read(ctx->xsh, XBT_NULL,
+                      libxl__sprintf(gc, "%s/bridge", be_path), &len);
+
+    nic->script = xs_read(ctx->xsh, XBT_NULL,
+                      libxl__sprintf(gc, "%s/script", be_path), &len);
+
+    /* XXX ioemu nics are not in xenstore at all? */
+    nic->nictype = LIBXL_NIC_TYPE_VIF;
+    nic->model = NULL; /* XXX Only for TYPE_IOEMU */
+    nic->ifname = NULL; /* XXX Only for TYPE_IOEMU */
+}
+
+static int libxl__append_nic_list_of_type(libxl__gc *gc,
+                                           uint32_t domid,
+                                           const char *type,
+                                           libxl_device_nic **nics,
+                                           int *nnics)
+{
+    char *be_path = NULL;
+    char **dir = NULL;
+    unsigned int n = 0;
+    libxl_device_nic *pnic = NULL, *pnic_end = NULL;
+
+    be_path = libxl__sprintf(gc, "%s/backend/%s/%d",
+                             libxl__xs_get_dompath(gc, 0), type, domid);
+    dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n);
+    if (dir) {
+        libxl_device_nic *tmp;
+        tmp = realloc(*nics, sizeof (libxl_device_nic) * (*nnics + n));
+        if (tmp == NULL)
+            return ERROR_NOMEM;
+        *nics = tmp;
+        pnic = *nics + *nnics;
+        *nnics += n;
+        pnic_end = *nics + *nnics;
+        for (; pnic < pnic_end; pnic++, dir++) {
+            const char *p;
+            p = libxl__sprintf(gc, "%s/%s", be_path, *dir);
+            libxl__device_nic_from_xs_be(gc, p, pnic);
+            pnic->backend_domid = 0;
+        }
+    }
+    return 0;
+}
+
+libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath, *nic_path_fe;
-    char **l, **list;
-    char *val, *tok;
-    unsigned int nb_nics, i;
-    libxl_nicinfo *res, *nics;
+    libxl_device_nic *nics = NULL;
+    int rc;
+
+    *num = 0;
+
+    rc = libxl__append_nic_list_of_type(&gc, domid, "vif", &nics, num);
+    if (rc) goto out_err;
+
+    libxl__free_all(&gc);
+    return nics;
+
+out_err:
+    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list nics");
+    while (*num) {
+        (*num)--;
+        libxl_device_nic_dispose(&nics[*num]);
+    }
+    free(nics);
+    return NULL;
+}
+
+int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_nic *nic, libxl_nicinfo *nicinfo)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *dompath, *nicpath;
+    char *val;
 
     dompath = libxl__xs_get_dompath(&gc, domid);
-    if (!dompath)
-        goto err;
-    list = l = libxl__xs_directory(&gc, XBT_NULL,
-                           libxl__sprintf(&gc, "%s/device/vif", dompath), &nb_nics);
-    if (!l)
-        goto err;
-    nics = res = calloc(nb_nics, sizeof (libxl_nicinfo));
-    if (!res)
-        goto err;
-    for (*nb = nb_nics; nb_nics > 0; --nb_nics, ++l, ++nics) {
-        nic_path_fe = libxl__sprintf(&gc, "%s/device/vif/%s", dompath, *l);
-
-        nics->backend = xs_read(ctx->xsh, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", nic_path_fe), NULL);
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nic_path_fe));
-        nics->backend_id = val ? strtoul(val, NULL, 10) : -1;
-
-        nics->devid = strtoul(*l, NULL, 10);
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nic_path_fe));
-        nics->state = val ? strtoul(val, NULL, 10) : -1;
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", nic_path_fe));
-        for (i = 0, tok = strtok(val, ":"); tok && (i < 6);
-             ++i, tok = strtok(NULL, ":")) {
-            nics->mac[i] = strtoul(tok, NULL, 16);
-        }
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nic_path_fe));
-        nics->evtch = val ? strtol(val, NULL, 10) : -1;
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nic_path_fe));
-        nics->rref_tx = val ? strtol(val, NULL, 10) : -1;
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nic_path_fe));
-        nics->rref_rx = val ? strtol(val, NULL, 10) : -1;
-        nics->frontend = xs_read(ctx->xsh, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/frontend", nics->backend), NULL);
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nics->backend));
-        nics->frontend_id = val ? strtoul(val, NULL, 10) : -1;
-        nics->script = xs_read(ctx->xsh, XBT_NULL,
-                               libxl__sprintf(&gc, "%s/script", nics->backend), NULL);
+    nicinfo->devid = nic->devid;
+
+    nicpath = libxl__sprintf(&gc, "%s/device/vif/%d", dompath, nicinfo->devid);
+    nicinfo->backend = xs_read(ctx->xsh, XBT_NULL,
+                                libxl__sprintf(&gc, "%s/backend", nicpath), NULL);
+    if (!nicinfo->backend) {
+        libxl__free_all(&gc);
+        return ERROR_FAIL;
     }
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nicpath));
+    nicinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nicpath));
+    nicinfo->state = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nicpath));
+    nicinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nicpath));
+    nicinfo->rref_tx = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nicpath));
+    nicinfo->rref_rx = val ? strtoul(val, NULL, 10) : -1;
+    nicinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
+                                 libxl__sprintf(&gc, "%s/frontend", nicinfo->backend), NULL);
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nicinfo->backend));
+    nicinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
 
     libxl__free_all(&gc);
-    return res;
-err:
-    libxl__free_all(&gc);
-    return NULL;
+    return 0;
 }
 
 /******************************************************************************/
diff -r c6c7a393fe4a -r 32a1ea4a0b13 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Oct 13 10:52:45 2011 +0100
@@ -454,7 +454,9 @@ int libxl_device_disk_local_detach(libxl
 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);
 int libxl_device_nic_del(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, int wait);
-libxl_nicinfo *libxl_list_nics(libxl_ctx *ctx, uint32_t domid, unsigned int *nb);
+libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num);
+int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_nic *nic, libxl_nicinfo *nicinfo);
 
 int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid, libxl_device_console *console);
 
diff -r c6c7a393fe4a -r 32a1ea4a0b13 tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_types.idl	Thu Oct 13 10:52:45 2011 +0100
@@ -330,8 +330,6 @@ libxl_nicinfo = Struct("nicinfo", [
     ("frontend_id", uint32),
     ("devid", integer),
     ("state", integer),
-    ("script", string),
-    ("mac", libxl_mac),
     ("evtch", integer),
     ("rref_tx", integer),
     ("rref_rx", integer),
diff -r c6c7a393fe4a -r 32a1ea4a0b13 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Thu Oct 13 10:52:45 2011 +0100
@@ -451,15 +451,15 @@ int libxl_pipe(libxl_ctx *ctx, int pipes
 int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid,
                             const char *mac, libxl_device_nic *nic)
 {
-    libxl_nicinfo *nics;
-    unsigned int nb, rc, i;
+    libxl_device_nic *nics;
+    int nb, rc, i;
     libxl_mac mac_n;
 
     rc = libxl__parse_mac(mac, mac_n);
     if (rc)
         return rc;
 
-    nics = libxl_list_nics(ctx, domid, &nb);
+    nics = libxl_device_nic_list(ctx, domid, &nb);
     if (!nics)
         return ERROR_FAIL;
 
@@ -468,17 +468,17 @@ int libxl_mac_to_device_nic(libxl_ctx *c
     rc = ERROR_INVAL;
     for (i = 0; i < nb; ++i) {
         if (!libxl__compare_macs(&mac_n, &nics[i].mac)) {
-            nic->backend_domid = nics[i].backend_id;
-            nic->devid = nics[i].devid;
-            memcpy(nic->mac, nics[i].mac, sizeof (nic->mac));
-            nic->script = strdup(nics[i].script);
+            *nic = nics[i];
             rc = 0;
+            i++; /* Do not dispose this NIC on exit path */
             break;
         }
+        libxl_device_nic_dispose(&nics[i]);
     }
 
-    for (i=0; i<nb; i++)
-        libxl_nicinfo_dispose(&nics[i]);
+    for (; i<nb; i++)
+        libxl_device_nic_dispose(&nics[i]);
+
     free(nics);
     return rc;
 }
diff -r c6c7a393fe4a -r 32a1ea4a0b13 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -4025,8 +4025,9 @@ int main_networkattach(int argc, char **
 int main_networklist(int argc, char **argv)
 {
     int opt;
-    libxl_nicinfo *nics;
-    unsigned int nb, i;
+    libxl_device_nic *nics;
+    libxl_nicinfo nicinfo;
+    int nb, i;
 
     if ((opt = def_getopt(argc, argv, "", "network-list", 1)) != -1)
         return opt;
@@ -4039,19 +4040,23 @@ int main_networklist(int argc, char **ar
             fprintf(stderr, "%s is an invalid domain identifier\n", *argv);
             continue;
         }
-        if (!(nics = libxl_list_nics(ctx, domid, &nb))) {
+        nics = libxl_device_nic_list(ctx, domid, &nb);
+        if (!nics) {
             continue;
         }
         for (i = 0; i < nb; ++i) {
-            /* Idx BE */
-            printf("%-3d %-2d ", nics[i].devid, nics[i].backend_id);
-            /* MAC */
-            printf(LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nics[i].mac));
-            /* Hdl  Sta  evch txr/rxr  BE-path */
-            printf("%6d %5d %6d %5d/%-11d %-30s\n",
-                   nics[i].devid, nics[i].state, nics[i].evtch,
-                   nics[i].rref_tx, nics[i].rref_rx, nics[i].backend);
-            libxl_nicinfo_dispose(&nics[i]);
+            if (!libxl_device_nic_getinfo(ctx, domid, &nics[i], &nicinfo)) {
+                /* Idx BE */
+                printf("%-3d %-2d ", nicinfo.devid, nicinfo.backend_id);
+                /* MAC */
+                printf(LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nics[i].mac));
+                /* Hdl  Sta  evch txr/rxr  BE-path */
+                printf("%6d %5d %6d %5d/%-11d %-30s\n",
+                       nicinfo.devid, nicinfo.state, nicinfo.evtch,
+                       nicinfo.rref_tx, nicinfo.rref_rx, nicinfo.backend);
+                libxl_nicinfo_dispose(&nicinfo);
+            }
+            libxl_device_nic_dispose(&nics[i]);
         }
         free(nics);
     }

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:22:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:22:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIR4-0001BZ-DK; Thu, 13 Oct 2011 03:22:46 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyw-0004hl-DY
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:42 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318499609!707369!7
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1630 invoked from network); 13 Oct 2011 09:53:39 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712240"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:38 -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; Thu, 13 Oct 2011 05:53:38 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhR023753; Thu, 13 Oct 2011 02:53:37 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 521f9749c03271cc3de0b95e2bf1ea574080fd90
Message-ID: <521f9749c03271cc3de0.1318499616@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:36 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 11 of 27 v2] libxl: reimplement devid->disk in
 terms of from_xs_be 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 Ian Campbell <ian.campbell@citrix.com>
# Date 1318499565 -3600
# Node ID 521f9749c03271cc3de0b95e2bf1ea574080fd90
# Parent  0ffea6ba20dddbf2a79cfed884a5444446c196ba
libxl: reimplement devid->disk in terms of from_xs_be function.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 0ffea6ba20dd -r 521f9749c032 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -1656,6 +1656,33 @@ static void libxl__device_disk_from_xs_b
     disk->format = LIBXL_DISK_FORMAT_UNKNOWN;
 }
 
+int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
+                               const char *devid, libxl_device_disk *disk)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *dompath, *path;
+    int rc = ERROR_FAIL;
+
+    memset(disk, 0, sizeof (libxl_device_disk));
+    dompath = libxl__xs_get_dompath(&gc, domid);
+    if (!dompath) {
+        goto out;
+    }
+    path = libxl__xs_read(&gc, XBT_NULL,
+                          libxl__sprintf(&gc, "%s/device/vbd/%s/backend",
+                                         dompath, devid));
+    if (!path)
+        goto out;
+
+    libxl__device_disk_from_xs_be(&gc, path, disk);
+
+    rc = 0;
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
+
 static int libxl__append_disk_list_of_type(libxl__gc *gc,
                                            uint32_t domid,
                                            const char *type,
diff -r 0ffea6ba20dd -r 521f9749c032 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Thu Oct 13 10:52:45 2011 +0100
@@ -483,50 +483,6 @@ int libxl_mac_to_device_nic(libxl_ctx *c
     return rc;
 }
 
-int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
-                               const char *devid, libxl_device_disk *disk)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *val;
-    char *dompath, *diskpath, *be_path;
-    unsigned int devid_n;
-    int rc = ERROR_INVAL;
-
-    devid_n = libxl__device_disk_dev_number(devid, NULL, NULL);
-    if (devid_n < 0) {
-        goto out;
-    }
-    rc = ERROR_FAIL;
-    dompath = libxl__xs_get_dompath(&gc, domid);
-    diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, devid_n);
-    if (!diskpath) {
-        goto out;
-    }
-
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath));
-    if (!val)
-        goto out;
-    disk->backend_domid = strtoul(val, NULL, 10);
-    be_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", diskpath));
-    disk->pdev_path = xs_read(ctx->xsh, XBT_NULL,
-                              libxl__sprintf(&gc, "%s/params", be_path), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/type", be_path));
-    libxl_string_to_backend(ctx, val, &(disk->backend));
-    disk->vdev = xs_read(ctx->xsh, XBT_NULL,
-                         libxl__sprintf(&gc, "%s/dev", be_path), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/removable", be_path));
-    disk->removable = !strcmp(val, "1");
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mode", be_path));
-    disk->readwrite = !!strcmp(val, "w");
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/device-type", diskpath));
-    disk->is_cdrom = !strcmp(val, "cdrom");
-    rc = 0;
-
-out:
-    libxl__free_all(&gc);
-    return rc;
-}
-
 int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap)
 {
     int max_cpus;

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:23:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:23:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REISD-0001ZV-6S; Thu, 13 Oct 2011 03:23:57 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyx-0004hm-7L
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:43 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!6
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19737 invoked from network); 13 Oct 2011 09:53:40 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184475"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:39 -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; Thu, 13 Oct 2011 05:53:39 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhS023753; Thu, 13 Oct 2011 02:53:38 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: b8b0e5d41f320124c13bd8d39627b9366ff270f1
Message-ID: <b8b0e5d41f320124c13b.1318499617@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:37 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 12 of 27 v2] libxl: libxl_devid_to_* should take
 an integer device id
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499565 -3600
# Node ID b8b0e5d41f320124c13bd8d39627b9366ff270f1
# Parent  521f9749c03271cc3de0b95e2bf1ea574080fd90
libxl: libxl_devid_to_* should take an integer device id

Currently takes a string.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 521f9749c032 -r b8b0e5d41f32 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -1333,7 +1333,7 @@ static void libxl__device_nic_from_xs_be
 }
 
 int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
-                              const char *devid, libxl_device_nic *nic)
+                              int devid, libxl_device_nic *nic)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     char *dompath, *path;
@@ -1345,7 +1345,7 @@ int libxl_devid_to_device_nic(libxl_ctx 
         goto out;
 
     path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vif/%s/backend",
+                          libxl__sprintf(&gc, "%s/device/vif/%d/backend",
                                          dompath, devid));
     if (!path)
         goto out;
@@ -1657,7 +1657,7 @@ static void libxl__device_disk_from_xs_b
 }
 
 int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
-                               const char *devid, libxl_device_disk *disk)
+                               int devid, libxl_device_disk *disk)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     char *dompath, *path;
@@ -1669,7 +1669,7 @@ int libxl_devid_to_device_disk(libxl_ctx
         goto out;
     }
     path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vbd/%s/backend",
+                          libxl__sprintf(&gc, "%s/device/vbd/%d/backend",
                                          dompath, devid));
     if (!path)
         goto out;
diff -r 521f9749c032 -r b8b0e5d41f32 tools/libxl/libxl_utils.h
--- a/tools/libxl/libxl_utils.h	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_utils.h	Thu Oct 13 10:52:45 2011 +0100
@@ -60,11 +60,11 @@ void libxl_report_child_exitstatus(libxl
 
 int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid,
                             const char *mac, libxl_device_nic *nic);
-int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
-                              const char *devid, libxl_device_nic *nic);
+int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid, int devid,
+                              libxl_device_nic *nic);
 
-int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
-                               const char *devid, libxl_device_disk *disk);
+int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid, int devid,
+                               libxl_device_disk *disk);
 
 int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap);
 int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu);
diff -r 521f9749c032 -r b8b0e5d41f32 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -4077,7 +4077,7 @@ int main_networkdetach(int argc, char **
     }
 
     if (!strchr(argv[optind+1], ':')) {
-        if (libxl_devid_to_device_nic(ctx, domid, argv[optind+1], &nic)) {
+        if (libxl_devid_to_device_nic(ctx, domid, atoi(argv[optind+1]), &nic)) {
             fprintf(stderr, "Unknown device %s.\n", argv[optind+1]);
             return 1;
         }
@@ -4178,7 +4178,7 @@ int main_blockdetach(int argc, char **ar
         fprintf(stderr, "%s is an invalid domain identifier\n", argv[optind]);
         return 1;
     }
-    if (libxl_devid_to_device_disk(ctx, domid, argv[optind+1], &disk)) {
+    if (libxl_devid_to_device_disk(ctx, domid, atoi(argv[optind+1]), &disk)) {
         fprintf(stderr, "Error: Device %s not connected.\n", argv[optind+1]);
         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 Oct 13 03:25:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:25:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIU9-00024Q-JS; Thu, 13 Oct 2011 03:25:57 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyy-0004i9-Vj
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:45 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!7
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19942 invoked from network); 13 Oct 2011 09:53:41 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:41 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184476"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:41 -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; Thu, 13 Oct 2011 05:53:41 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhU023753; Thu, 13 Oct 2011 02:53:40 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 7e4dde7f0acccd73ef1296f4d8ce58d5ac0b2571
Message-ID: <7e4dde7f0acccd73ef12.1318499619@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:39 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 14 of 27 v2] libxl: split forced and non-forced
 uses of libxl__device_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

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318499565 -3600
# Node ID 7e4dde7f0acccd73ef1296f4d8ce58d5ac0b2571
# Parent  0584450afaf8c1236f0c0b870fc16629c1233662
libxl: split forced and non-forced uses of libxl__device_del

Most forced users can now simply call libxl__device_destroy directly.

libxl__devices_destroy is something of a special case, it is really
just iterating over an opaque set of xenstore directories and removing
them. Until this can be refactored just do the force-remove case
manually, doing otherwise led to too much entanglement with the other
callers of libxl__device_destroy which do know about specific device
types.

For the time being do the same in libxl__device_pci_remove_xenstore.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 0584450afaf8 -r 7e4dde7f0acc tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -1074,7 +1074,10 @@ int libxl_device_disk_del(libxl_ctx *ctx
     device.domid            = domid;
     device.devid            = devid;
     device.kind             = DEVICE_VBD;
-    rc = libxl__device_del(&gc, &device, wait);
+    if (wait)
+        rc = libxl__device_del(&gc, &device);
+    else
+        rc = libxl__device_destroy(&gc, &device);
 out_free:
     libxl__free_all(&gc);
     return rc;
@@ -1286,7 +1289,11 @@ int libxl_device_nic_del(libxl_ctx *ctx,
     device.domid            = domid;
     device.kind             = DEVICE_VIF;
 
-    rc = libxl__device_del(&gc, &device, wait);
+    if (wait)
+        rc = libxl__device_del(&gc, &device);
+    else
+        rc = libxl__device_destroy(&gc, &device);
+
     libxl__free_all(&gc);
     return rc;
 }
diff -r 0584450afaf8 -r 7e4dde7f0acc tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
@@ -401,11 +401,17 @@ out:
     return rc;
 }
 
-int libxl__device_destroy(libxl__gc *gc, char *be_path)
+int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *be_path = libxl__device_backend_path(gc, dev);
+    char *fe_path = libxl__device_frontend_path(gc, dev);
+
     xs_rm(ctx->xsh, XBT_NULL, be_path);
+    xs_rm(ctx->xsh, XBT_NULL, fe_path);
+
     libxl__device_destroy_tapdisk(gc, be_path);
+
     return 0;
 }
 
@@ -466,10 +472,14 @@ int libxl__devices_destroy(libxl__gc *gc
             fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]);
             be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
             if (be_path != NULL) {
-                int rc = force ? libxl__device_destroy(gc, be_path)
-                               : libxl__device_remove(gc, be_path);
-                if (rc > 0)
-                    n_watches++;
+                if (force) {
+                    xs_rm(ctx->xsh, XBT_NULL, be_path);
+                    xs_rm(ctx->xsh, XBT_NULL, fe_path);
+                    libxl__device_destroy_tapdisk(gc, be_path);
+                } else {
+                    if (libxl__device_remove(gc, be_path) > 0)
+                        n_watches++;
+                }
             } else {
                 xs_rm(ctx->xsh, XBT_NULL, path);
             }
@@ -480,10 +490,13 @@ int libxl__devices_destroy(libxl__gc *gc
     fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid);
     be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
     if (be_path && strcmp(be_path, "")) {
-        int rc = force ? libxl__device_destroy(gc, be_path)
-                       : libxl__device_remove(gc, be_path);
-        if (rc > 0)
-            n_watches++;
+        if (force) {
+            xs_rm(ctx->xsh, XBT_NULL, be_path);
+            xs_rm(ctx->xsh, XBT_NULL, fe_path);
+        } else {
+            if (libxl__device_remove(gc, be_path) > 0)
+                n_watches++;
+        }
     }
 
     if (!force) {
@@ -507,29 +520,24 @@ out:
     return 0;
 }
 
-int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait)
+int libxl__device_del(libxl__gc *gc, libxl__device *dev)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
+    struct timeval tv;
     char *backend_path;
     int rc;
 
     backend_path = libxl__device_backend_path(gc, dev);
 
-    if (wait)
-        rc = libxl__device_remove(gc, backend_path);
-    else
-        rc = libxl__device_destroy(gc, backend_path);
+    rc = libxl__device_remove(gc, backend_path);
     if (rc == -1) {
         rc = ERROR_FAIL;
         goto out;
     }
 
-    if (wait) {
-        struct timeval tv;
-        tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
-        tv.tv_usec = 0;
-        (void)wait_for_dev_destroy(gc, &tv);
-    }
+    tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
+    tv.tv_usec = 0;
+    (void)wait_for_dev_destroy(gc, &tv);
 
     xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
     rc = 0;
diff -r 0584450afaf8 -r 7e4dde7f0acc tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:45 2011 +0100
@@ -252,9 +252,9 @@ _hidden int libxl__device_generic_add(li
                              char **bents, char **fents);
 _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device);
 _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device);
-_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait);
+_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
 _hidden int libxl__device_remove(libxl__gc *gc, char *be_path);
-_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path);
+_hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev);
 _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
 _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);
 
diff -r 0584450afaf8 -r 7e4dde7f0acc tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Thu Oct 13 10:52:45 2011 +0100
@@ -411,7 +411,7 @@ retry_transaction2:
 
     if (num == 1) {
         char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path));
-        libxl__device_destroy(gc, be_path);
+        xs_rm(ctx->xsh, XBT_NULL, be_path);
         xs_rm(ctx->xsh, XBT_NULL, fe_path);
         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 Oct 13 03:26:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03: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 1REIUx-0002Rz-Iq; Thu, 13 Oct 2011 03:26:48 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHyz-0004iG-6G
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:46 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318499609!707369!8
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1723 invoked from network); 13 Oct 2011 09:53:40 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712242"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:40 -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; Thu, 13 Oct 2011 05:53:40 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhT023753; Thu, 13 Oct 2011 02:53:39 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0584450afaf8c1236f0c0b870fc16629c1233662
Message-ID: <0584450afaf8c1236f0c.1318499618@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:38 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 13 of 27 v2] libxl: separate forced and
 non-forced device remove
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499565 -3600
# Node ID 0584450afaf8c1236f0c0b870fc16629c1233662
# Parent  b8b0e5d41f320124c13bd8d39627b9366ff270f1
libxl: separate forced and non-forced device remove.

The function libxl__device_destroy currently takes a force parameter however:

  * in the forced case we initiate a graceful shutdown and then immediately
    nuke the backend directory, quite likely before anyone got a chance to react.
  * the callers all have a "wait" variable and pass in "!wait" as the force
    argument which is confusing since not waiting is not really the same thing
    as forcing the destroy.

Therefore split the function into libxl__device_remove and
libxl__device_destroy. The former initiates a graceful shutdown which
the latter simply nukes the backend directory.

This makes some of the callers look a bit odd but that should fall out as I
continue to pull this piece of string.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r b8b0e5d41f32 -r 0584450afaf8 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
@@ -365,7 +365,7 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
-int libxl__device_destroy(libxl__gc *gc, char *be_path, int force)
+int libxl__device_remove(libxl__gc *gc, char *be_path)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     xs_transaction_t t;
@@ -393,17 +393,22 @@ retry_transaction:
             goto out;
         }
     }
-    if (!force) {
-        xs_watch(ctx->xsh, state_path, be_path);
-        rc = 1;
-    } else {
-        xs_rm(ctx->xsh, XBT_NULL, be_path);
-    }
+
+    xs_watch(ctx->xsh, state_path, be_path);
     libxl__device_destroy_tapdisk(gc, be_path);
+    rc = 1;
 out:
     return rc;
 }
 
+int libxl__device_destroy(libxl__gc *gc, char *be_path)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    xs_rm(ctx->xsh, XBT_NULL, be_path);
+    libxl__device_destroy_tapdisk(gc, be_path);
+    return 0;
+}
+
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -461,7 +466,9 @@ int libxl__devices_destroy(libxl__gc *gc
             fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]);
             be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
             if (be_path != NULL) {
-                if (libxl__device_destroy(gc, be_path, force) > 0)
+                int rc = force ? libxl__device_destroy(gc, be_path)
+                               : libxl__device_remove(gc, be_path);
+                if (rc > 0)
                     n_watches++;
             } else {
                 xs_rm(ctx->xsh, XBT_NULL, path);
@@ -473,7 +480,9 @@ int libxl__devices_destroy(libxl__gc *gc
     fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid);
     be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
     if (be_path && strcmp(be_path, "")) {
-        if (libxl__device_destroy(gc, be_path, force) > 0)
+        int rc = force ? libxl__device_destroy(gc, be_path)
+                       : libxl__device_remove(gc, be_path);
+        if (rc > 0)
             n_watches++;
     }
 
@@ -506,7 +515,10 @@ int libxl__device_del(libxl__gc *gc, lib
 
     backend_path = libxl__device_backend_path(gc, dev);
 
-    rc = libxl__device_destroy(gc, backend_path, !wait);
+    if (wait)
+        rc = libxl__device_remove(gc, backend_path);
+    else
+        rc = libxl__device_destroy(gc, backend_path);
     if (rc == -1) {
         rc = ERROR_FAIL;
         goto out;
diff -r b8b0e5d41f32 -r 0584450afaf8 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:45 2011 +0100
@@ -253,7 +253,8 @@ _hidden int libxl__device_generic_add(li
 _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device);
 _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device);
 _hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait);
-_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path, int force);
+_hidden int libxl__device_remove(libxl__gc *gc, char *be_path);
+_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path);
 _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
 _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);
 
diff -r b8b0e5d41f32 -r 0584450afaf8 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Thu Oct 13 10:52:45 2011 +0100
@@ -411,8 +411,7 @@ retry_transaction2:
 
     if (num == 1) {
         char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path));
-        libxl__device_destroy(gc, be_path, 1);
-        xs_rm(ctx->xsh, XBT_NULL, be_path);
+        libxl__device_destroy(gc, be_path);
         xs_rm(ctx->xsh, XBT_NULL, fe_path);
         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 Oct 13 03:27:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:27:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIVm-0002pP-SJ; Thu, 13 Oct 2011 03:27:38 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz0-0004ip-Ml
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:47 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!8
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20136 invoked from network); 13 Oct 2011 09:53:43 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184477"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53: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; Thu, 13 Oct 2011 05:53:43 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhW023753; Thu, 13 Oct 2011 02:53:41 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c0636269da0c480e9f9a1a6c2d9126ad0e43a1ec
Message-ID: <c0636269da0c480e9f9a.1318499621@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:41 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 16 of 27 v2] libxl: do not remove unidentified
 frontend paths in libxl__devices_destroy
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499565 -3600
# Node ID c0636269da0c480e9f9a1a6c2d9126ad0e43a1ec
# Parent  98711982a532f09a7722fdd5af4e704562561b25
libxl: do not remove unidentified frontend paths in libxl__devices_destroy

Currently this appears to only include "/local/domain/<domid>/device/suspend".
Ultimately the caller will nuke the whole guest directory anyway but not having
this function remove things which don't look like devices seems less
surprising.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 98711982a532 -r c0636269da0c tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
@@ -463,8 +463,6 @@ int libxl__devices_destroy(libxl__gc *gc
                     if (libxl__device_remove(gc, be_path) > 0)
                         n_watches++;
                 }
-            } else {
-                xs_rm(ctx->xsh, XBT_NULL, path);
             }
         }
     }

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:29:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:29:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIXD-0003Gb-As; Thu, 13 Oct 2011 03:29:08 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz2-0004j8-GZ
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:49 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!9
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20291 invoked from network); 13 Oct 2011 09:53:45 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184480"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:44 -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; Thu, 13 Oct 2011 05:53:44 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhY023753; Thu, 13 Oct 2011 02:53:43 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 95b2f3977d439bba3a01db4a4403a4307f238377
Message-ID: <95b2f3977d439bba3a01.1318499623@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:43 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 18 of 27 v2] libxl: merge libxl__device_del into
 libxl__device_remove
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499565 -3600
# Node ID 95b2f3977d439bba3a01db4a4403a4307f238377
# Parent  f60954a04df9acbddf68af4f2d46c3910f3b0afc
libxl: merge libxl__device_del into libxl__device_remove

Note that the "wait" parameter added to libxl_device_remove is different to the
wait paramter previously used by similar functions. In the past not-wait meant
forced whereas now in means wait for a graceful shutdown, as opposed to setting
off a graceful shutdown but not waiting.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r f60954a04df9 -r 95b2f3977d43 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -1075,7 +1075,7 @@ int libxl_device_disk_del(libxl_ctx *ctx
     device.devid            = devid;
     device.kind             = LIBXL__DEVICE_KIND_VBD;
     if (wait)
-        rc = libxl__device_del(&gc, &device);
+        rc = libxl__device_remove(&gc, &device, wait);
     else
         rc = libxl__device_destroy(&gc, &device);
 out_free:
@@ -1290,7 +1290,7 @@ int libxl_device_nic_del(libxl_ctx *ctx,
     device.kind             = LIBXL__DEVICE_KIND_VIF;
 
     if (wait)
-        rc = libxl__device_del(&gc, &device);
+        rc = libxl__device_remove(&gc, &device, wait);
     else
         rc = libxl__device_destroy(&gc, &device);
 
diff -r f60954a04df9 -r 95b2f3977d43 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
@@ -367,57 +367,6 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
-int libxl__device_remove(libxl__gc *gc, libxl__device *dev)
-{
-    libxl_ctx *ctx = libxl__gc_owner(gc);
-    xs_transaction_t t;
-    char *be_path = libxl__device_backend_path(gc, dev);
-    char *state_path = libxl__sprintf(gc, "%s/state", be_path);
-    char *state = libxl__xs_read(gc, XBT_NULL, state_path);
-    int rc = 0;
-
-    if (!state)
-        goto out;
-    if (atoi(state) != 4) {
-        libxl__device_destroy_tapdisk(gc, be_path);
-        xs_rm(ctx->xsh, XBT_NULL, be_path);
-        goto out;
-    }
-
-retry_transaction:
-    t = xs_transaction_start(ctx->xsh);
-    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", strlen("0"));
-    xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
-    if (!xs_transaction_end(ctx->xsh, t, 0)) {
-        if (errno == EAGAIN)
-            goto retry_transaction;
-        else {
-            rc = -1;
-            goto out;
-        }
-    }
-
-    xs_watch(ctx->xsh, state_path, be_path);
-    libxl__device_destroy_tapdisk(gc, be_path);
-    rc = 1;
-out:
-    return rc;
-}
-
-int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
-{
-    libxl_ctx *ctx = libxl__gc_owner(gc);
-    char *be_path = libxl__device_backend_path(gc, dev);
-    char *fe_path = libxl__device_frontend_path(gc, dev);
-
-    xs_rm(ctx->xsh, XBT_NULL, be_path);
-    xs_rm(ctx->xsh, XBT_NULL, fe_path);
-
-    libxl__device_destroy_tapdisk(gc, be_path);
-
-    return 0;
-}
-
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -446,6 +395,67 @@ static int wait_for_dev_destroy(libxl__g
     return rc;
 }
 
+/* Returns 0 on success, ERROR_* on fail */
+int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    xs_transaction_t t;
+    char *be_path = libxl__device_backend_path(gc, dev);
+    char *state_path = libxl__sprintf(gc, "%s/state", be_path);
+    char *state = libxl__xs_read(gc, XBT_NULL, state_path);
+    int rc = 0;
+
+    if (!state)
+        goto out;
+    if (atoi(state) != 4) {
+        libxl__device_destroy_tapdisk(gc, be_path);
+        xs_rm(ctx->xsh, XBT_NULL, be_path);
+        goto out;
+    }
+
+retry_transaction:
+    t = xs_transaction_start(ctx->xsh);
+    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", strlen("0"));
+    xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
+    if (!xs_transaction_end(ctx->xsh, t, 0)) {
+        if (errno == EAGAIN)
+            goto retry_transaction;
+        else {
+            rc = ERROR_FAIL;
+            goto out;
+        }
+    }
+
+    xs_watch(ctx->xsh, state_path, be_path);
+    libxl__device_destroy_tapdisk(gc, be_path);
+
+    if (wait) {
+        struct timeval tv;
+        tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
+        tv.tv_usec = 0;
+        (void)wait_for_dev_destroy(gc, &tv);
+        xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
+    }
+
+    rc = 0;
+out:
+    return rc;
+}
+
+int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *be_path = libxl__device_backend_path(gc, dev);
+    char *fe_path = libxl__device_frontend_path(gc, dev);
+
+    xs_rm(ctx->xsh, XBT_NULL, be_path);
+    xs_rm(ctx->xsh, XBT_NULL, fe_path);
+
+    libxl__device_destroy_tapdisk(gc, be_path);
+
+    return 0;
+}
+
 int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -485,7 +495,7 @@ int libxl__devices_destroy(libxl__gc *gc
                 if (force) {
                     libxl__device_destroy(gc, &dev);
                 } else {
-                    if (libxl__device_remove(gc, &dev) > 0)
+                    if (libxl__device_remove(gc, &dev, 0) == 0)
                         n_watches++;
                 }
             }
@@ -504,7 +514,7 @@ int libxl__devices_destroy(libxl__gc *gc
         if (force) {
             libxl__device_destroy(gc, &dev);
         } else {
-            if (libxl__device_remove(gc, &dev) > 0)
+            if (libxl__device_remove(gc, &dev, 0) == 0)
                 n_watches++;
         }
     }
@@ -530,29 +540,6 @@ out:
     return 0;
 }
 
-int libxl__device_del(libxl__gc *gc, libxl__device *dev)
-{
-    libxl_ctx *ctx = libxl__gc_owner(gc);
-    struct timeval tv;
-    int rc;
-
-    rc = libxl__device_remove(gc, dev);
-    if (rc == -1) {
-        rc = ERROR_FAIL;
-        goto out;
-    }
-
-    tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
-    tv.tv_usec = 0;
-    (void)wait_for_dev_destroy(gc, &tv);
-
-    xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
-    rc = 0;
-
-out:
-    return rc;
-}
-
 int libxl__wait_for_device_model(libxl__gc *gc,
                                  uint32_t domid, char *state,
                                  libxl__spawn_starting *spawning,
diff -r f60954a04df9 -r 95b2f3977d43 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:45 2011 +0100
@@ -242,8 +242,7 @@ _hidden char *libxl__device_backend_path
 _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device);
 _hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path,
                                       libxl__device *dev);
-_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
-_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev);
+_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait);
 _hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev);
 _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
 _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:30:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:30:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIYY-0003eM-V0; Thu, 13 Oct 2011 03:30:31 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz2-0004j7-GE
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:48 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318499600!53018542!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1373 invoked from network); 13 Oct 2011 09:53:21 -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;
	13 Oct 2011 09:53:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712245"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53: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; Thu, 13 Oct 2011 05:53:44 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhX023753; Thu, 13 Oct 2011 02:53:42 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f60954a04df9acbddf68af4f2d46c3910f3b0afc
Message-ID: <f60954a04df9acbddf68.1318499622@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:42 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 17 of 27 v2] libxl: use libxl__device in
 libxl_devices_destroy and libxl__device_pci_remove_xenstore
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499565 -3600
# Node ID f60954a04df9acbddf68af4f2d46c3910f3b0afc
# Parent  c0636269da0c480e9f9a1a6c2d9126ad0e43a1ec
libxl: use libxl__device in libxl_devices_destroy and libxl__device_pci_remove_xenstore

Doing this allows us to use the common functions for removing devices.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r c0636269da0c -r f60954a04df9 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
@@ -49,6 +49,25 @@ char *libxl__device_backend_path(libxl__
                           device->domid, device->devid);
 }
 
+int libxl__parse_backend_path(libxl__gc *gc,
+                              const char *path,
+                              libxl__device *dev)
+{
+    /* /local/domain/<domid>/backend/<kind>/<domid>/<devid> */
+    char strkind[16]; /* Longest is actually "console" */
+    uint32_t domain;
+    int rc = sscanf(path, "/local/domain/%d/backend/%15[^/]/%d/%d",
+                    &dev->backend_domid,
+                    strkind,
+                    &domain,
+                    &dev->backend_devid);
+
+    if (rc != 4)
+        return ERROR_FAIL;
+
+    return libxl__device_kind_from_string(strkind, &dev->backend_kind);
+}
+
 int libxl__device_generic_add(libxl__gc *gc, libxl__device *device,
                              char **bents, char **fents)
 {
@@ -348,10 +367,11 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
-int libxl__device_remove(libxl__gc *gc, char *be_path)
+int libxl__device_remove(libxl__gc *gc, libxl__device *dev)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     xs_transaction_t t;
+    char *be_path = libxl__device_backend_path(gc, dev);
     char *state_path = libxl__sprintf(gc, "%s/state", be_path);
     char *state = libxl__xs_read(gc, XBT_NULL, state_path);
     int rc = 0;
@@ -429,10 +449,12 @@ static int wait_for_dev_destroy(libxl__g
 int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
-    char *path, *be_path, *fe_path;
+    char *path;
     unsigned int num1, num2;
     char **l1 = NULL, **l2 = NULL;
     int i, j, n_watches = 0;
+    libxl__device dev;
+    libxl__device_kind kind;
 
     path = libxl__sprintf(gc, "/local/domain/%d/device", domid);
     l1 = libxl__xs_directory(gc, XBT_NULL, path, &num1);
@@ -445,22 +467,25 @@ int libxl__devices_destroy(libxl__gc *gc
         num1 = 0;
     }
     for (i = 0; i < num1; i++) {
-        if (!strcmp("vfs", l1[i]))
+        if (libxl__device_kind_from_string(l1[i], &kind))
             continue;
         path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, l1[i]);
         l2 = libxl__xs_directory(gc, XBT_NULL, path, &num2);
         if (!l2)
             continue;
         for (j = 0; j < num2; j++) {
-            fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]);
-            be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
-            if (be_path != NULL) {
+            path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s/backend",
+                                  domid, l1[i], l2[j]);
+            path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, path));
+            if (path && libxl__parse_backend_path(gc, path, &dev) == 0) {
+                dev.domid = domid;
+                dev.kind = kind;
+                dev.devid = atoi(l2[j]);
+
                 if (force) {
-                    xs_rm(ctx->xsh, XBT_NULL, be_path);
-                    xs_rm(ctx->xsh, XBT_NULL, fe_path);
-                    libxl__device_destroy_tapdisk(gc, be_path);
+                    libxl__device_destroy(gc, &dev);
                 } else {
-                    if (libxl__device_remove(gc, be_path) > 0)
+                    if (libxl__device_remove(gc, &dev) > 0)
                         n_watches++;
                 }
             }
@@ -468,14 +493,18 @@ int libxl__devices_destroy(libxl__gc *gc
     }
 
     /* console 0 frontend directory is not under /local/domain/<domid>/device */
-    fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid);
-    be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
-    if (be_path && strcmp(be_path, "")) {
+    path = libxl__sprintf(gc, "/local/domain/%d/console/backend", domid);
+    path = libxl__xs_read(gc, XBT_NULL, path);
+    if (path && strcmp(path, "") &&
+        libxl__parse_backend_path(gc, path, &dev) == 0) {
+        dev.domid = domid;
+        dev.kind = LIBXL__DEVICE_KIND_CONSOLE;
+        dev.devid = 0;
+
         if (force) {
-            xs_rm(ctx->xsh, XBT_NULL, be_path);
-            xs_rm(ctx->xsh, XBT_NULL, fe_path);
+            libxl__device_destroy(gc, &dev);
         } else {
-            if (libxl__device_remove(gc, be_path) > 0)
+            if (libxl__device_remove(gc, &dev) > 0)
                 n_watches++;
         }
     }
@@ -505,12 +534,9 @@ int libxl__device_del(libxl__gc *gc, lib
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     struct timeval tv;
-    char *backend_path;
     int rc;
 
-    backend_path = libxl__device_backend_path(gc, dev);
-
-    rc = libxl__device_remove(gc, backend_path);
+    rc = libxl__device_remove(gc, dev);
     if (rc == -1) {
         rc = ERROR_FAIL;
         goto out;
diff -r c0636269da0c -r f60954a04df9 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:45 2011 +0100
@@ -240,8 +240,10 @@ _hidden int libxl__device_generic_add(li
                              char **bents, char **fents);
 _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device);
 _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device);
+_hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path,
+                                      libxl__device *dev);
 _hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
-_hidden int libxl__device_remove(libxl__gc *gc, char *be_path);
+_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev);
 _hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev);
 _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
 _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);
diff -r c0636269da0c -r f60954a04df9 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Thu Oct 13 10:52:45 2011 +0100
@@ -410,9 +410,15 @@ retry_transaction2:
             goto retry_transaction2;
 
     if (num == 1) {
-        char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path));
-        xs_rm(ctx->xsh, XBT_NULL, be_path);
-        xs_rm(ctx->xsh, XBT_NULL, fe_path);
+        libxl__device dev;
+        if (libxl__parse_backend_path(gc, be_path, &dev) != 0)
+            return ERROR_FAIL;
+
+        dev.domid = domid;
+        dev.kind = LIBXL__DEVICE_KIND_PCI;
+        dev.devid = 0;
+
+        libxl__device_destroy(gc, &dev);
         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 Oct 13 03:31:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:31:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIZv-00042R-HA; Thu, 13 Oct 2011 03:31:55 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz3-0004j9-0s
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:49 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318499600!53018542!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1431 invoked from network); 13 Oct 2011 09:53:22 -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;
	13 Oct 2011 09:53:22 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712249"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:45 -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; Thu, 13 Oct 2011 05:53:45 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhZ023753; Thu, 13 Oct 2011 02:53:44 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 53e6814c01f5e12baacc4d04e36904403e88ffbe
Message-ID: <53e6814c01f5e12baacc.1318499624@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:44 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 19 of 27 v2] libxl: use more descriptive
 variable names in libxl__devices_destroy
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499565 -3600
# Node ID 53e6814c01f5e12baacc4d04e36904403e88ffbe
# Parent  95b2f3977d439bba3a01db4a4403a4307f238377
libxl: use more descriptive variable names in libxl__devices_destroy.

It's not immediately clear that "l1" iterates over device types and "l2"
iterates over individual devices. Name things in a way which makes this more
obvious.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 95b2f3977d43 -r 53e6814c01f5 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
@@ -460,37 +460,38 @@ int libxl__devices_destroy(libxl__gc *gc
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     char *path;
-    unsigned int num1, num2;
-    char **l1 = NULL, **l2 = NULL;
+    unsigned int num_kinds, num_devs;
+    char **kinds = NULL, **devs = NULL;
     int i, j, n_watches = 0;
     libxl__device dev;
     libxl__device_kind kind;
 
     path = libxl__sprintf(gc, "/local/domain/%d/device", domid);
-    l1 = libxl__xs_directory(gc, XBT_NULL, path, &num1);
-    if (!l1) {
+    kinds = libxl__xs_directory(gc, XBT_NULL, path, &num_kinds);
+    if (!kinds) {
         if (errno != ENOENT) {
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unable to get xenstore"
                              " device listing %s", path);
             goto out;
         }
-        num1 = 0;
+        num_kinds = 0;
     }
-    for (i = 0; i < num1; i++) {
-        if (libxl__device_kind_from_string(l1[i], &kind))
+    for (i = 0; i < num_kinds; i++) {
+        if (libxl__device_kind_from_string(kinds[i], &kind))
             continue;
-        path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, l1[i]);
-        l2 = libxl__xs_directory(gc, XBT_NULL, path, &num2);
-        if (!l2)
+
+        path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, kinds[i]);
+        devs = libxl__xs_directory(gc, XBT_NULL, path, &num_devs);
+        if (!devs)
             continue;
-        for (j = 0; j < num2; j++) {
+        for (j = 0; j < num_devs; j++) {
             path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s/backend",
-                                  domid, l1[i], l2[j]);
+                                  domid, kinds[i], devs[j]);
             path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, path));
             if (path && libxl__parse_backend_path(gc, path, &dev) == 0) {
                 dev.domid = domid;
                 dev.kind = kind;
-                dev.devid = atoi(l2[j]);
+                dev.devid = atoi(devs[j]);
 
                 if (force) {
                     libxl__device_destroy(gc, &dev);

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:33:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:33:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIbR-0004XC-Ji; Thu, 13 Oct 2011 03:33:30 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz3-0004jN-O3
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:50 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318499609!707369!9
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1821 invoked from network); 13 Oct 2011 09:53:42 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712243"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:42 -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; Thu, 13 Oct 2011 05:53:42 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhV023753; Thu, 13 Oct 2011 02:53:41 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 98711982a532f09a7722fdd5af4e704562561b25
Message-ID: <98711982a532f09a7722.1318499620@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:40 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 15 of 27 v2] libxl: use IDL to define device
 front- and back-end kinds
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499565 -3600
# Node ID 98711982a532f09a7722fdd5af4e704562561b25
# Parent  7e4dde7f0acccd73ef1296f4d8ce58d5ac0b2571
libxl: use IDL to define device front- and back-end kinds

I'd like to use the from_string functionality...

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 7e4dde7f0acc -r 98711982a532 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
@@ -962,7 +962,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
     device.backend_domid = disk->backend_domid;
     device.devid = devid;
     device.domid = domid;
-    device.kind = DEVICE_VBD;
+    device.kind = LIBXL__DEVICE_KIND_VBD;
 
     switch (disk->backend) {
         case LIBXL_DISK_BACKEND_PHY:
@@ -975,7 +975,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
             flexarray_append(back, "params");
             flexarray_append(back, dev);
 
-            device.backend_kind = DEVICE_VBD;
+            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
             break;
         case LIBXL_DISK_BACKEND_TAP:
             dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format);
@@ -994,7 +994,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
             flexarray_append(back, "params");
             flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
                           libxl__device_disk_string_of_format(disk->format), disk->pdev_path));
-            device.backend_kind = DEVICE_QDISK;
+            device.backend_kind = LIBXL__DEVICE_KIND_QDISK;
             break;
         default:
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend);
@@ -1057,13 +1057,13 @@ int libxl_device_disk_del(libxl_ctx *ctx
 
     switch (disk->backend) {
         case LIBXL_DISK_BACKEND_PHY:
-            device.backend_kind = DEVICE_VBD;
+            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
             break;
         case LIBXL_DISK_BACKEND_TAP:
-            device.backend_kind = DEVICE_VBD;
+            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
             break;
         case LIBXL_DISK_BACKEND_QDISK:
-            device.backend_kind = DEVICE_QDISK;
+            device.backend_kind = LIBXL__DEVICE_KIND_QDISK;
             break;
         default:
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n",
@@ -1073,7 +1073,7 @@ int libxl_device_disk_del(libxl_ctx *ctx
     }
     device.domid            = domid;
     device.devid            = devid;
-    device.kind             = DEVICE_VBD;
+    device.kind             = LIBXL__DEVICE_KIND_VBD;
     if (wait)
         rc = libxl__device_del(&gc, &device);
     else
@@ -1221,10 +1221,10 @@ int libxl_device_nic_add(libxl_ctx *ctx,
 
     device.backend_devid = nic->devid;
     device.backend_domid = nic->backend_domid;
-    device.backend_kind = DEVICE_VIF;
+    device.backend_kind = LIBXL__DEVICE_KIND_VIF;
     device.devid = nic->devid;
     device.domid = domid;
-    device.kind = DEVICE_VIF;
+    device.kind = LIBXL__DEVICE_KIND_VIF;
 
     flexarray_append(back, "frontend-id");
     flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
@@ -1284,10 +1284,10 @@ int libxl_device_nic_del(libxl_ctx *ctx,
 
     device.backend_devid    = nic->devid;
     device.backend_domid    = nic->backend_domid;
-    device.backend_kind     = DEVICE_VIF;
+    device.backend_kind     = LIBXL__DEVICE_KIND_VIF;
     device.devid            = nic->devid;
     device.domid            = domid;
-    device.kind             = DEVICE_VIF;
+    device.kind             = LIBXL__DEVICE_KIND_VIF;
 
     if (wait)
         rc = libxl__device_del(&gc, &device);
@@ -1486,10 +1486,10 @@ int libxl__device_console_add(libxl__gc 
 
     device.backend_devid = console->devid;
     device.backend_domid = console->backend_domid;
-    device.backend_kind = DEVICE_CONSOLE;
+    device.backend_kind = LIBXL__DEVICE_KIND_CONSOLE;
     device.devid = console->devid;
     device.domid = domid;
-    device.kind = DEVICE_CONSOLE;
+    device.kind = LIBXL__DEVICE_KIND_CONSOLE;
 
     flexarray_append(back, "frontend-id");
     flexarray_append(back, libxl__sprintf(gc, "%d", domid));
@@ -1577,10 +1577,10 @@ int libxl_device_vkb_add(libxl_ctx *ctx,
 
     device.backend_devid = vkb->devid;
     device.backend_domid = vkb->backend_domid;
-    device.backend_kind = DEVICE_VKBD;
+    device.backend_kind = LIBXL__DEVICE_KIND_VKBD;
     device.devid = vkb->devid;
     device.domid = domid;
-    device.kind = DEVICE_VKBD;
+    device.kind = LIBXL__DEVICE_KIND_VKBD;
 
     flexarray_append(back, "frontend-id");
     flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
@@ -1864,10 +1864,10 @@ int libxl_device_vfb_add(libxl_ctx *ctx,
 
     device.backend_devid = vfb->devid;
     device.backend_domid = vfb->backend_domid;
-    device.backend_kind = DEVICE_VFB;
+    device.backend_kind = LIBXL__DEVICE_KIND_VFB;
     device.devid = vfb->devid;
     device.domid = domid;
-    device.kind = DEVICE_VFB;
+    device.kind = LIBXL__DEVICE_KIND_VFB;
 
     flexarray_append_pair(back, "frontend-id", libxl__sprintf(&gc, "%d", domid));
     flexarray_append_pair(back, "online", "1");
diff -r 7e4dde7f0acc -r 98711982a532 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_device.c	Thu Oct 13 10:52:45 2011 +0100
@@ -24,30 +24,20 @@
 #include <unistd.h>
 #include <fcntl.h>
 
-
 #include "libxl.h"
 #include "libxl_internal.h"
 
-static const char *string_of_kinds[] = {
-    [DEVICE_VIF] = "vif",
-    [DEVICE_VBD] = "vbd",
-    [DEVICE_QDISK] = "qdisk",
-    [DEVICE_PCI] = "pci",
-    [DEVICE_VFB] = "vfb",
-    [DEVICE_VKBD] = "vkbd",
-    [DEVICE_CONSOLE] = "console",
-};
-
 char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device)
 {
     char *dom_path = libxl__xs_get_dompath(gc, device->domid);
 
     /* Console 0 is a special case */
-    if (device->kind == DEVICE_CONSOLE && device->devid == 0)
+    if (device->kind == LIBXL__DEVICE_KIND_CONSOLE && device->devid == 0)
         return libxl__sprintf(gc, "%s/console", dom_path);
 
     return libxl__sprintf(gc, "%s/device/%s/%d", dom_path,
-                          string_of_kinds[device->kind], device->devid);
+                          libxl__device_kind_to_string(device->kind),
+                          device->devid);
 }
 
 char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device)
@@ -55,7 +45,7 @@ char *libxl__device_backend_path(libxl__
     char *dom_path = libxl__xs_get_dompath(gc, device->backend_domid);
 
     return libxl__sprintf(gc, "%s/backend/%s/%u/%d", dom_path,
-                          string_of_kinds[device->backend_kind],
+                          libxl__device_kind_to_string(device->backend_kind),
                           device->domid, device->devid);
 }
 
@@ -67,12 +57,6 @@ int libxl__device_generic_add(libxl__gc 
     xs_transaction_t t;
     struct xs_permissions frontend_perms[2];
     struct xs_permissions backend_perms[2];
-    int rc;
-
-    if (!is_valid_device_kind(device->backend_kind) || !is_valid_device_kind(device->kind)) {
-        rc = ERROR_INVAL;
-        goto out;
-    }
 
     frontend_path = libxl__device_frontend_path(gc, device);
     backend_path = libxl__device_backend_path(gc, device);
@@ -113,9 +97,8 @@ retry_transaction:
         else
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs transaction failed");
     }
-    rc = 0;
-out:
-    return rc;
+
+    return 0;
 }
 
 typedef struct {
diff -r 7e4dde7f0acc -r 98711982a532 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:45 2011 +0100
@@ -97,25 +97,13 @@ struct libxl__ctx {
     libxl_version_info version_info;
 };
 
-typedef enum {
-    DEVICE_VIF = 1,
-    DEVICE_VBD,
-    DEVICE_QDISK,
-    DEVICE_PCI,
-    DEVICE_VFB,
-    DEVICE_VKBD,
-    DEVICE_CONSOLE,
-} libxl__device_kinds;
-
-#define is_valid_device_kind(kind) (((kind) >= DEVICE_VIF) && ((kind) <= DEVICE_CONSOLE))
-
 typedef struct {
     uint32_t backend_devid;
     uint32_t backend_domid;
     uint32_t devid;
     uint32_t domid;
-    libxl__device_kinds backend_kind;
-    libxl__device_kinds kind;
+    libxl__device_kind backend_kind;
+    libxl__device_kind kind;
 } libxl__device;
 
 #define XC_PCI_BDF             "0x%x, 0x%x, 0x%x, 0x%x"
diff -r 7e4dde7f0acc -r 98711982a532 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Thu Oct 13 10:52:45 2011 +0100
@@ -244,10 +244,10 @@ int libxl__create_pci_backend(libxl__gc 
     /* add pci device */
     device.backend_devid = 0;
     device.backend_domid = 0;
-    device.backend_kind = DEVICE_PCI;
+    device.backend_kind = LIBXL__DEVICE_KIND_PCI;
     device.devid = 0;
     device.domid = domid;
-    device.kind = DEVICE_PCI;
+    device.kind = LIBXL__DEVICE_KIND_PCI;
 
     flexarray_append_pair(back, "frontend-id", libxl__sprintf(gc, "%d", domid));
     flexarray_append_pair(back, "online", "1");
diff -r 7e4dde7f0acc -r 98711982a532 tools/libxl/libxl_types_internal.idl
--- a/tools/libxl/libxl_types_internal.idl	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl_types_internal.idl	Thu Oct 13 10:52:45 2011 +0100
@@ -1,9 +1,19 @@
 namespace("libxl__")
 
-libxl__qmp_message_type  = Enumeration("qmp_message_type", [
+libxl__qmp_message_type = Enumeration("qmp_message_type", [
     (1, "QMP"),
     (2, "return"),
     (3, "error"),
     (4, "event"),
     (5, "invalid"),
     ])
+
+libxl__device_kind = Enumeration("device_kind", [
+    (1, "VIF"),
+    (2, "VBD"),
+    (3, "QDISK"),
+    (4, "PCI"),
+    (5, "VFB"),
+    (6, "VKBD"),
+    (7, "CONSOLE"),
+    ])

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:34:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:34:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIcV-0004ub-Gp; Thu, 13 Oct 2011 03:34:35 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz4-0004jO-47
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:51 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!10
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20457 invoked from network); 13 Oct 2011 09:53:46 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184481"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:46 -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; Thu, 13 Oct 2011 05:53:46 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRha023753; Thu, 13 Oct 2011 02:53:45 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 2e302d27c6cac6c7a650b050366ce200e8cab50e
Message-ID: <2e302d27c6cac6c7a650.1318499625@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:45 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 20 of 27 v2] libxl: convert disk handling to
	device API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499566 -3600
# Node ID 2e302d27c6cac6c7a650b050366ce200e8cab50e
# Parent  53e6814c01f5e12baacc4d04e36904403e88ffbe
libxl: convert disk handling to device API

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 53e6814c01f5 -r 2e302d27c6ca tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -916,13 +916,58 @@ int libxl_vncviewer_exec(libxl_ctx *ctx,
 
 /******************************************************************************/
 
+int libxl_device_disk_init(libxl_ctx *ctx, libxl_device_disk *disk)
+{
+    memset(disk, 0x00, sizeof(libxl_device_disk));
+    return 0;
+}
+
+static int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
+                                   libxl_device_disk *disk,
+                                   libxl__device *device)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    int devid;
+
+    devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
+    if (devid==-1) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported"
+               " virtual disk identifier %s", disk->vdev);
+        return ERROR_INVAL;
+    }
+
+    device->backend_domid = disk->backend_domid;
+    device->backend_devid = devid;
+
+    switch (disk->backend) {
+        case LIBXL_DISK_BACKEND_PHY:
+            device->backend_kind = LIBXL__DEVICE_KIND_VBD;
+            break;
+        case LIBXL_DISK_BACKEND_TAP:
+            device->backend_kind = LIBXL__DEVICE_KIND_VBD;
+            break;
+        case LIBXL_DISK_BACKEND_QDISK:
+            device->backend_kind = LIBXL__DEVICE_KIND_QDISK;
+            break;
+        default:
+            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n",
+                       disk->backend);
+            return ERROR_INVAL;
+    }
+
+    device->domid = domid;
+    device->devid = devid;
+    device->kind  = LIBXL__DEVICE_KIND_VBD;
+
+    return 0;
+}
+
 int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     flexarray_t *front;
     flexarray_t *back;
     char *dev;
-    int devid;
     libxl__device device;
     int major, minor, rc;
 
@@ -950,20 +995,13 @@ int libxl_device_disk_add(libxl_ctx *ctx
         goto out_free;
     }
 
-    devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
-    if (devid==-1) {
+    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    if (rc != 0) {
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported"
                " virtual disk identifier %s", disk->vdev);
-        rc = ERROR_INVAL;
         goto out_free;
     }
 
-    device.backend_devid = devid;
-    device.backend_domid = disk->backend_domid;
-    device.devid = devid;
-    device.domid = domid;
-    device.kind = LIBXL__DEVICE_KIND_VBD;
-
     switch (disk->backend) {
         case LIBXL_DISK_BACKEND_PHY:
             dev = disk->pdev_path;
@@ -975,7 +1013,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
             flexarray_append(back, "params");
             flexarray_append(back, dev);
 
-            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
+            assert(device.backend_kind == LIBXL__DEVICE_KIND_VBD);
             break;
         case LIBXL_DISK_BACKEND_TAP:
             dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format);
@@ -994,7 +1032,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
             flexarray_append(back, "params");
             flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
                           libxl__device_disk_string_of_format(disk->format), disk->pdev_path));
-            device.backend_kind = LIBXL__DEVICE_KIND_QDISK;
+            assert(device.backend_kind == LIBXL__DEVICE_KIND_QDISK);
             break;
         default:
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend);
@@ -1026,7 +1064,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
     flexarray_append(front, "state");
     flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
     flexarray_append(front, "virtual-device");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", devid));
+    flexarray_append(front, libxl__sprintf(&gc, "%d", device.devid));
     flexarray_append(front, "device-type");
     flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk");
 
@@ -1044,45 +1082,37 @@ out:
     return rc;
 }
 
-int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid,
-                          libxl_device_disk *disk, int wait)
+int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid,
+                             libxl_device_disk *disk)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     libxl__device device;
-    int devid, rc;
-
-    devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
-    device.backend_domid    = disk->backend_domid;
-    device.backend_devid    = devid;
-
-    switch (disk->backend) {
-        case LIBXL_DISK_BACKEND_PHY:
-            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
-            break;
-        case LIBXL_DISK_BACKEND_TAP:
-            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
-            break;
-        case LIBXL_DISK_BACKEND_QDISK:
-            device.backend_kind = LIBXL__DEVICE_KIND_QDISK;
-            break;
-        default:
-            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n",
-                       disk->backend);
-            rc = ERROR_INVAL;
-            goto out_free;
-    }
-    device.domid            = domid;
-    device.devid            = devid;
-    device.kind             = LIBXL__DEVICE_KIND_VBD;
-    if (wait)
-        rc = libxl__device_remove(&gc, &device, wait);
-    else
-        rc = libxl__device_destroy(&gc, &device);
-out_free:
+    int rc;
+
+    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_remove(&gc, &device, 1);
+out:
     libxl__free_all(&gc);
     return rc;
 }
 
+int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_disk *disk)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_destroy(&gc, &device);
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
 char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
@@ -1626,7 +1656,7 @@ static void libxl__device_disk_from_xs_b
     unsigned int len;
     char *tmp;
 
-    memset(disk, 0, sizeof(*disk));
+    libxl_device_disk_init(ctx, disk);
 
     tmp = xs_read(ctx->xsh, XBT_NULL,
                   libxl__sprintf(gc, "%s/params", be_path), &len);
@@ -1670,7 +1700,8 @@ int libxl_devid_to_device_disk(libxl_ctx
     char *dompath, *path;
     int rc = ERROR_FAIL;
 
-    memset(disk, 0, sizeof (libxl_device_disk));
+    libxl_device_disk_init(ctx, disk);
+
     dompath = libxl__xs_get_dompath(&gc, domid);
     if (!dompath) {
         goto out;
@@ -1812,11 +1843,11 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u
 
     ret = 0;
 
-    libxl_device_disk_del(ctx, domid, disks + i, 1);
+    libxl_device_disk_remove(ctx, domid, disks + i);
     libxl_device_disk_add(ctx, domid, disk);
     stubdomid = libxl_get_stubdom_id(ctx, domid);
     if (stubdomid) {
-        libxl_device_disk_del(ctx, stubdomid, disks + i, 1);
+        libxl_device_disk_remove(ctx, stubdomid, disks + i);
         libxl_device_disk_add(ctx, stubdomid, disk);
     }
 out:
diff -r 53e6814c01f5 -r 2e302d27c6ca tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
@@ -438,15 +438,27 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *
  *   This function does not interact with the guest and therefore
  *   cannot block on the guest.
  */
+
+/* Disks */
+int libxl_device_disk_init(libxl_ctx *ctx, libxl_device_disk *disk);
 int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);
-int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, int wait);
+int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);
+int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_disk *disk);
+
 libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num);
 int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_disk *disk, libxl_diskinfo *diskinfo);
+
+/*
+ * Insert a CD-ROM device. A device corresponding to disk must already
+ * be attached to the guest.
+ */
 int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);
 
 /*
- * Make a disk available in this domain. Returns path to a device.
+ * Make a disk available in this (the control) 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);
diff -r 53e6814c01f5 -r 2e302d27c6ca tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -494,7 +494,7 @@ static void parse_disk_config_multistrin
 {
     int e;
 
-    memset(disk, 0, sizeof(*disk));
+    libxl_device_disk_init(ctx, disk);
 
     if (!*config) {
         *config = xlu_cfg_init(stderr, "command line");
@@ -1893,6 +1893,8 @@ static void cd_insert(const char *dom, c
     disk.backend_domid = 0;
 
     libxl_cdrom_insert(ctx, domid, &disk);
+
+    libxl_device_disk_dispose(&disk);
     free(buf);
 }
 
@@ -4182,8 +4184,8 @@ int main_blockdetach(int argc, char **ar
         fprintf(stderr, "Error: Device %s not connected.\n", argv[optind+1]);
         return 1;
     }
-    if (libxl_device_disk_del(ctx, domid, &disk, 1)) {
-        fprintf(stderr, "libxl_device_disk_del failed.\n");
+    if (libxl_device_disk_remove(ctx, domid, &disk)) {
+        fprintf(stderr, "libxl_device_disk_remove failed.\n");
     }
     return 0;
 }
diff -r 53e6814c01f5 -r 2e302d27c6ca tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:46 2011 +0100
@@ -16,6 +16,11 @@ builtins = {
     "libxl_hwcap":          ("int32 array",            None,                                "Val_hwcap(&%(c)s)"),
     }
 
+DEVICE_FUNCTIONS = [ ("add",            ["t", "domid", "unit"]),
+                     ("remove",         ["t", "domid", "unit"]),
+                     ("destroy",        ["t", "domid", "unit"]),
+                   ]
+
 functions = { # ( name , [type1,type2,....] )
     "device_vfb":     [ ("add",            ["t", "domid", "unit"]),
                         ("clean_shutdown", ["domid", "unit"]),
@@ -27,9 +32,7 @@ functions = { # ( name , [type1,type2,..
                       ],
     "device_console": [ ("add",            ["t", "domid", "unit"]),
                       ],
-    "device_disk":    [ ("add",            ["t", "domid", "unit"]),
-                        ("del",            ["t", "domid", "unit"]),
-                      ],
+    "device_disk":    DEVICE_FUNCTIONS,
     "device_nic":     [ ("add",            ["t", "domid", "unit"]),
                         ("del",            ["t", "domid", "unit"]),
                       ],
diff -r 53e6814c01f5 -r 2e302d27c6ca tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:45 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
@@ -247,7 +247,7 @@ value stub_xl_device_disk_del(value info
 	device_disk_val(&gc, &lg, &c_info, info);
 
 	INIT_CTX();
-	ret = libxl_device_disk_del(ctx, Int_val(domid), &c_info, 0);
+	ret = libxl_device_disk_remove(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("disk_del", &lg);
 	FREE_CTX();

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:36:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:36:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIds-0005OI-Tm; Thu, 13 Oct 2011 03:36:01 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz5-0004jl-M0
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:53 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318499613!44066946!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2068 invoked from network); 13 Oct 2011 09:53:34 -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;
	13 Oct 2011 09:53:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712250"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:47 -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; Thu, 13 Oct 2011 05:53:47 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhb023753; Thu, 13 Oct 2011 02:53:46 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 35a5d67ba9c81d489208786fe9f6ee803c67c82c
Message-ID: <35a5d67ba9c81d489208.1318499626@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:46 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 21 of 27 v2] libxl: convert NIC handling to
	device API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499566 -3600
# Node ID 35a5d67ba9c81d489208786fe9f6ee803c67c82c
# Parent  2e302d27c6cac6c7a650b050366ce200e8cab50e
libxl: convert NIC handling to device API

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 2e302d27c6ca -r 35a5d67ba9c8 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -1187,32 +1187,46 @@ int libxl_device_disk_local_detach(libxl
 }
 
 /******************************************************************************/
-int libxl_device_nic_init(libxl_device_nic *nic_info, int devnum)
+int libxl_device_nic_init(libxl_ctx *ctx, libxl_device_nic *nic)
 {
     const uint8_t *r;
     libxl_uuid uuid;
 
     libxl_uuid_generate(&uuid);
     r = libxl_uuid_bytearray(&uuid);
-    memset(nic_info, '\0', sizeof(*nic_info));
-
-    nic_info->backend_domid = 0;
-    nic_info->devid = devnum;
-    nic_info->mtu = 1492;
-    nic_info->model = strdup("rtl8139");
-    nic_info->mac[0] = 0x00;
-    nic_info->mac[1] = 0x16;
-    nic_info->mac[2] = 0x3e;
-    nic_info->mac[3] = r[0] & 0x7f;
-    nic_info->mac[4] = r[1];
-    nic_info->mac[5] = r[2];
-    nic_info->ifname = NULL;
-    nic_info->bridge = strdup("xenbr0");
-    nic_info->ip = NULL;
-    if ( asprintf(&nic_info->script, "%s/vif-bridge",
+    memset(nic, '\0', sizeof(*nic));
+
+    nic->backend_domid = 0;
+    nic->devid = -1;
+    nic->mtu = 1492;
+    nic->model = strdup("rtl8139");
+    nic->mac[0] = 0x00;
+    nic->mac[1] = 0x16;
+    nic->mac[2] = 0x3e;
+    nic->mac[3] = r[0] & 0x7f;
+    nic->mac[4] = r[1];
+    nic->mac[5] = r[2];
+    nic->ifname = NULL;
+    nic->bridge = strdup("xenbr0");
+    nic->ip = NULL;
+    if ( asprintf(&nic->script, "%s/vif-bridge",
                libxl_xen_script_dir_path()) < 0 )
         return ERROR_FAIL;
-    nic_info->nictype = LIBXL_NIC_TYPE_IOEMU;
+    nic->nictype = LIBXL_NIC_TYPE_IOEMU;
+    return 0;
+}
+
+static int libxl__device_from_nic(libxl__gc *gc, uint32_t domid,
+                                  libxl_device_nic *nic,
+                                  libxl__device *device)
+{
+    device->backend_devid    = nic->devid;
+    device->backend_domid    = nic->backend_domid;
+    device->backend_kind     = LIBXL__DEVICE_KIND_VIF;
+    device->devid            = nic->devid;
+    device->domid            = domid;
+    device->kind             = LIBXL__DEVICE_KIND_VIF;
+
     return 0;
 }
 
@@ -1249,12 +1263,8 @@ int libxl_device_nic_add(libxl_ctx *ctx,
         }
     }
 
-    device.backend_devid = nic->devid;
-    device.backend_domid = nic->backend_domid;
-    device.backend_kind = LIBXL__DEVICE_KIND_VIF;
-    device.devid = nic->devid;
-    device.domid = domid;
-    device.kind = LIBXL__DEVICE_KIND_VIF;
+    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    if ( rc != 0 ) goto out_free;
 
     flexarray_append(back, "frontend-id");
     flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
@@ -1305,29 +1315,37 @@ out:
     return rc;
 }
 
-int libxl_device_nic_del(libxl_ctx *ctx, uint32_t domid,
-                         libxl_device_nic *nic, int wait)
+int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid,
+                            libxl_device_nic *nic)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     libxl__device device;
     int rc;
 
-    device.backend_devid    = nic->devid;
-    device.backend_domid    = nic->backend_domid;
-    device.backend_kind     = LIBXL__DEVICE_KIND_VIF;
-    device.devid            = nic->devid;
-    device.domid            = domid;
-    device.kind             = LIBXL__DEVICE_KIND_VIF;
-
-    if (wait)
-        rc = libxl__device_remove(&gc, &device, wait);
-    else
-        rc = libxl__device_destroy(&gc, &device);
-
+    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_remove(&gc, &device, 1);
+out:
     libxl__free_all(&gc);
     return rc;
 }
 
+int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_device_nic *nic)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_destroy(&gc, &device);
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
 static void libxl__device_nic_from_xs_be(libxl__gc *gc,
                                          const char *be_path,
                                          libxl_device_nic *nic)
diff -r 2e302d27c6ca -r 35a5d67ba9c8 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
@@ -463,9 +463,12 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u
 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_nic_init(libxl_device_nic *nic, int dev_num);
+/* Network Interfaces */
+int libxl_device_nic_init(libxl_ctx *ctx, libxl_device_nic *nic);
 int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic);
-int libxl_device_nic_del(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, int wait);
+int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic);
+int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic);
+
 libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num);
 int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_nic *nic, libxl_nicinfo *nicinfo);
diff -r 2e302d27c6ca -r 35a5d67ba9c8 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -762,7 +762,8 @@ static void parse_config_data(const char
 
             d_config->vifs = (libxl_device_nic *) realloc(d_config->vifs, sizeof (libxl_device_nic) * (d_config->num_vifs+1));
             nic = d_config->vifs + d_config->num_vifs;
-            CHK_ERRNO( libxl_device_nic_init(nic, d_config->num_vifs) );
+            CHK_ERRNO( libxl_device_nic_init(ctx, nic) );
+            nic->devid = d_config->num_vifs;
 
             if (default_vifscript) {
                 free(nic->script);
@@ -3972,7 +3973,7 @@ int main_networkattach(int argc, char **
         fprintf(stderr, "%s is an invalid domain identifier\n", argv[optind]);
         return 1;
     }
-    libxl_device_nic_init(&nic, -1);
+    libxl_device_nic_init(ctx, &nic);
     for (argv += optind+1, argc -= optind+1; argc > 0; ++argv, --argc) {
         if (MATCH_OPTION("type", *argv, oparg)) {
             if (!strcmp("vif", oparg)) {
@@ -4089,7 +4090,7 @@ int main_networkdetach(int argc, char **
             return 1;
         }
     }
-    if (libxl_device_nic_del(ctx, domid, &nic, 1)) {
+    if (libxl_device_nic_remove(ctx, domid, &nic)) {
         fprintf(stderr, "libxl_device_nic_del failed.\n");
         return 1;
     }
diff -r 2e302d27c6ca -r 35a5d67ba9c8 tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:46 2011 +0100
@@ -33,9 +33,7 @@ functions = { # ( name , [type1,type2,..
     "device_console": [ ("add",            ["t", "domid", "unit"]),
                       ],
     "device_disk":    DEVICE_FUNCTIONS,
-    "device_nic":     [ ("add",            ["t", "domid", "unit"]),
-                        ("del",            ["t", "domid", "unit"]),
-                      ],
+    "device_nic":     DEVICE_FUNCTIONS,
     "device_pci":     [ ("add",            ["t", "domid", "unit"]),
                         ("remove",         ["t", "domid", "unit"]),
                         ("shutdown",       ["domid", "unit"]),
diff -r 2e302d27c6ca -r 35a5d67ba9c8 tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
@@ -281,7 +281,7 @@ value stub_xl_device_nic_del(value info,
 	device_nic_val(&gc, &lg, &c_info, info);
 
 	INIT_CTX();
-	ret = libxl_device_nic_del(ctx, Int_val(domid), &c_info, 0);
+	ret = libxl_device_nic_remove(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("nic_del", &lg);
 	FREE_CTX();

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:37:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:37:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIfC-0005m9-Gh; Thu, 13 Oct 2011 03:37:22 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz5-0004jj-Ii
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:53 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!11
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20703 invoked from network); 13 Oct 2011 09:53:48 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184482"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:48 -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; Thu, 13 Oct 2011 05:53:48 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhc023753; Thu, 13 Oct 2011 02:53:47 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 17b83c16a9a6b3ca77be2d42f8d1275c9c28e570
Message-ID: <17b83c16a9a6b3ca77be.1318499627@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:47 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 22 of 27 v2] libxl: remove
	libxl_device_console_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

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318499566 -3600
# Node ID 17b83c16a9a6b3ca77be2d42f8d1275c9c28e570
# Parent  35a5d67ba9c81d489208786fe9f6ee803c67c82c
libxl: remove libxl_device_console_add.

It has no callers, the only code which adds consoles in internal to libxl and
uses libxl__device_console_add directly.

Rather than worrying about what the public API should look like in this case
simply remove it, adding new APIs is much easier than fixing broken ones...

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 35a5d67ba9c8 -r 17b83c16a9a6 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -1585,18 +1585,6 @@ out:
     return rc;
 }
 
-int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid,
-                              libxl_device_console *console)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    int rc = ERROR_INVAL;
-
-    rc = libxl__device_console_add(&gc, domid, console, NULL);
-
-    libxl__free_all(&gc);
-    return rc;
-}
-
 /******************************************************************************/
 void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num)
 {
diff -r 35a5d67ba9c8 -r 17b83c16a9a6 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
@@ -473,8 +473,6 @@ libxl_device_nic *libxl_device_nic_list(
 int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_nic *nic, libxl_nicinfo *nicinfo);
 
-int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid, libxl_device_console *console);
-
 void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num);
 int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
 int libxl_device_vkb_clean_shutdown(libxl_ctx *ctx, uint32_t domid);
diff -r 35a5d67ba9c8 -r 17b83c16a9a6 tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:46 2011 +0100
@@ -30,8 +30,6 @@ functions = { # ( name , [type1,type2,..
                         ("clean_shutdown", ["domid", "unit"]),
                         ("hard_shutdown",  ["domid", "unit"]),
                       ],
-    "device_console": [ ("add",            ["t", "domid", "unit"]),
-                      ],
     "device_disk":    DEVICE_FUNCTIONS,
     "device_nic":     DEVICE_FUNCTIONS,
     "device_pci":     [ ("add",            ["t", "domid", "unit"]),
diff -r 35a5d67ba9c8 -r 17b83c16a9a6 tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
@@ -288,23 +288,6 @@ value stub_xl_device_nic_del(value info,
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_console_add(value info, value domid)
-{
-	CAMLparam2(info, domid);
-	libxl_device_console c_info;
-	int ret;
-	INIT_STRUCT();
-
-	device_console_val(&gc, &lg, &c_info, info);
-
-	INIT_CTX();
-	ret = libxl_device_console_add(ctx, Int_val(domid), &c_info);
-	if (ret != 0)
-		failwith_xl("console_add", &lg);
-	FREE_CTX();
-	CAMLreturn(Val_unit);
-}
-
 value stub_xl_device_vkb_add(value info, value domid)
 {
 	CAMLparam2(info, domid);

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:38:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03: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 1REIgD-00069s-RB; Thu, 13 Oct 2011 03:38:25 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz7-0004kE-Ew
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:53 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!12
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20863 invoked from network); 13 Oct 2011 09:53:50 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184483"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:49 -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; Thu, 13 Oct 2011 05:53:49 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhe023753; Thu, 13 Oct 2011 02:53:48 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 9abeaa8b4d3c1f21c4e1695211fa0ad2639eb586
Message-ID: <9abeaa8b4d3c1f21c4e1.1318499629@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:49 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 24 of 27 v2] libxl: convert VFB handling to
	device API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499566 -3600
# Node ID 9abeaa8b4d3c1f21c4e1695211fa0ad2639eb586
# Parent  e161facb4c6a32411c5e3a73d5fdcf015f8a8591
libxl: convert VFB handling to device API

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r e161facb4c6a -r 9abeaa8b4d3c tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -1896,10 +1896,9 @@ out:
 }
 
 /******************************************************************************/
-void libxl_device_vfb_init(libxl_device_vfb *vfb, int dev_num)
+int libxl_device_vfb_init(libxl_ctx *ctx, libxl_device_vfb *vfb)
 {
     memset(vfb, 0x00, sizeof(libxl_device_vfb));
-    vfb->devid = dev_num;
     vfb->display = NULL;
     vfb->xauthority = NULL;
     vfb->vnc = 1;
@@ -1910,6 +1909,20 @@ void libxl_device_vfb_init(libxl_device_
     vfb->keymap = NULL;
     vfb->sdl = 0;
     vfb->opengl = 0;
+    return 0;
+}
+
+static int libxl__device_from_vfb(libxl__gc *gc, uint32_t domid,
+                                  libxl_device_vfb *vfb,
+                                  libxl__device *device)
+{
+    device->backend_devid = vfb->devid;
+    device->backend_domid = vfb->backend_domid;
+    device->backend_kind = LIBXL__DEVICE_KIND_VFB;
+    device->devid = vfb->devid;
+    device->domid = domid;
+    device->kind = LIBXL__DEVICE_KIND_VFB;
+    return 0;
 }
 
 int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
@@ -1931,12 +1944,8 @@ int libxl_device_vfb_add(libxl_ctx *ctx,
         goto out_free;
     }
 
-    device.backend_devid = vfb->devid;
-    device.backend_domid = vfb->backend_domid;
-    device.backend_kind = LIBXL__DEVICE_KIND_VFB;
-    device.devid = vfb->devid;
-    device.domid = domid;
-    device.kind = LIBXL__DEVICE_KIND_VFB;
+    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    if (rc != 0) goto out_free;
 
     flexarray_append_pair(back, "frontend-id", libxl__sprintf(&gc, "%d", domid));
     flexarray_append_pair(back, "online", "1");
@@ -1971,6 +1980,38 @@ out:
     return rc;
 }
 
+int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid,
+                            libxl_device_vfb *vfb)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_remove(&gc, &device, 1);
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
+int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_device_vfb *vfb)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_destroy(&gc, &device);
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
 /******************************************************************************/
 
 int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
diff -r e161facb4c6a -r 9abeaa8b4d3c tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
@@ -479,10 +479,11 @@ int libxl_device_vkb_add(libxl_ctx *ctx,
 int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
 int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
 
-void libxl_device_vfb_init(libxl_device_vfb *vfb, int dev_num);
+/* Framebuffer */
+int libxl_device_vfb_init(libxl_ctx *ctx, libxl_device_vfb *vfb);
 int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
-int libxl_device_vfb_clean_shutdown(libxl_ctx *ctx, uint32_t domid);
-int libxl_device_vfb_hard_shutdown(libxl_ctx *ctx, uint32_t domid);
+int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
+int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
 
 int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev);
 int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev, int force);
diff -r e161facb4c6a -r 9abeaa8b4d3c tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -853,7 +853,8 @@ skip:
 
             d_config->vfbs = (libxl_device_vfb *) realloc(d_config->vfbs, sizeof(libxl_device_vfb) * (d_config->num_vfbs + 1));
             vfb = d_config->vfbs + d_config->num_vfbs;
-            libxl_device_vfb_init(vfb, d_config->num_vfbs);
+            libxl_device_vfb_init(ctx, vfb);
+            vfb->devid = d_config->num_vfbs;
 
             d_config->vkbs = (libxl_device_vkb *) realloc(d_config->vkbs, sizeof(libxl_device_vkb) * (d_config->num_vkbs + 1));
             vkb = d_config->vkbs + d_config->num_vkbs;
diff -r e161facb4c6a -r 9abeaa8b4d3c tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:46 2011 +0100
@@ -22,10 +22,7 @@ DEVICE_FUNCTIONS = [ ("add",            
                    ]
 
 functions = { # ( name , [type1,type2,....] )
-    "device_vfb":     [ ("add",            ["t", "domid", "unit"]),
-                        ("clean_shutdown", ["domid", "unit"]),
-                        ("hard_shutdown",  ["domid", "unit"]),
-                      ],
+    "device_vfb":     DEVICE_FUNCTIONS,
     "device_vkb":     DEVICE_FUNCTIONS,
     "device_disk":    DEVICE_FUNCTIONS,
     "device_nic":     DEVICE_FUNCTIONS,
diff -r e161facb4c6a -r 9abeaa8b4d3c tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
@@ -360,14 +360,17 @@ value stub_xl_device_vfb_add(value info,
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_vfb_clean_shutdown(value domid)
+value stub_xl_device_vfb_remove(value info, value domid)
 {
 	CAMLparam1(domid);
+	libxl_device_vfb c_info;
 	int ret;
 	INIT_STRUCT();
 
+	device_vfb_val(&gc, &lg, &c_info, info);
+
 	INIT_CTX();
-	ret = libxl_device_vfb_clean_shutdown(ctx, Int_val(domid));
+	ret = libxl_device_vfb_remove(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("vfb_clean_shutdown", &lg);
 	FREE_CTX();
@@ -375,14 +378,17 @@ value stub_xl_device_vfb_clean_shutdown(
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_vfb_hard_shutdown(value domid)
+value stub_xl_device_vfb_destroy(value info, value domid)
 {
 	CAMLparam1(domid);
+	libxl_device_vfb c_info;
 	int ret;
 	INIT_STRUCT();
 
+	device_vfb_val(&gc, &lg, &c_info, info);
+
 	INIT_CTX();
-	ret = libxl_device_vfb_hard_shutdown(ctx, Int_val(domid));
+	ret = libxl_device_vfb_destroy(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("vfb_hard_shutdown", &lg);
 	FREE_CTX();

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:39:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:39:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIhC-0006XE-Bg; Thu, 13 Oct 2011 03:39:26 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz6-0004kD-K8
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:53 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318499613!44066946!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2120 invoked from network); 13 Oct 2011 09:53:35 -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;
	13 Oct 2011 09:53:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712251"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:49 -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; Thu, 13 Oct 2011 05:53:49 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhd023753; Thu, 13 Oct 2011 02:53:47 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: e161facb4c6a32411c5e3a73d5fdcf015f8a8591
Message-ID: <e161facb4c6a32411c5e.1318499628@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:48 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 23 of 27 v2] libxl: convert VKB handling to
	device API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499566 -3600
# Node ID e161facb4c6a32411c5e3a73d5fdcf015f8a8591
# Parent  17b83c16a9a6b3ca77be2d42f8d1275c9c28e570
libxl: convert VKB handling to device API

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 17b83c16a9a6 -r e161facb4c6a tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -1586,10 +1586,24 @@ out:
 }
 
 /******************************************************************************/
-void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num)
+int libxl_device_vkb_init(libxl_ctx *ctx, libxl_device_vkb *vkb)
 {
     memset(vkb, 0x00, sizeof(libxl_device_vkb));
-    vkb->devid = dev_num;
+    return 0;
+}
+
+static int libxl__device_from_vkb(libxl__gc *gc, uint32_t domid,
+                                  libxl_device_vkb *vkb,
+                                  libxl__device *device)
+{
+    device->backend_devid = vkb->devid;
+    device->backend_domid = vkb->backend_domid;
+    device->backend_kind = LIBXL__DEVICE_KIND_VKBD;
+    device->devid = vkb->devid;
+    device->domid = domid;
+    device->kind = LIBXL__DEVICE_KIND_VKBD;
+
+    return 0;
 }
 
 int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb)
@@ -1611,12 +1625,8 @@ int libxl_device_vkb_add(libxl_ctx *ctx,
         goto out_free;
     }
 
-    device.backend_devid = vkb->devid;
-    device.backend_domid = vkb->backend_domid;
-    device.backend_kind = LIBXL__DEVICE_KIND_VKBD;
-    device.devid = vkb->devid;
-    device.domid = domid;
-    device.kind = LIBXL__DEVICE_KIND_VKBD;
+    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    if (rc != 0) goto out_free;
 
     flexarray_append(back, "frontend-id");
     flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
@@ -1644,14 +1654,36 @@ out:
     return rc;
 }
 
-int libxl_device_vkb_clean_shutdown(libxl_ctx *ctx, uint32_t domid)
+int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid,
+                            libxl_device_vkb *vkb)
 {
-    return ERROR_NI;
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_remove(&gc, &device, 1);
+out:
+    libxl__free_all(&gc);
+    return rc;
 }
 
-int libxl_device_vkb_hard_shutdown(libxl_ctx *ctx, uint32_t domid)
+int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_device_vkb *vkb)
 {
-    return ERROR_NI;
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_destroy(&gc, &device);
+out:
+    libxl__free_all(&gc);
+    return rc;
 }
 
 static void libxl__device_disk_from_xs_be(libxl__gc *gc,
@@ -1939,16 +1971,6 @@ out:
     return rc;
 }
 
-int libxl_device_vfb_clean_shutdown(libxl_ctx *ctx, uint32_t domid)
-{
-    return ERROR_NI;
-}
-
-int libxl_device_vfb_hard_shutdown(libxl_ctx *ctx, uint32_t domid)
-{
-    return ERROR_NI;
-}
-
 /******************************************************************************/
 
 int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
diff -r 17b83c16a9a6 -r e161facb4c6a tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
@@ -473,10 +473,11 @@ libxl_device_nic *libxl_device_nic_list(
 int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_nic *nic, libxl_nicinfo *nicinfo);
 
-void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num);
+/* Keyboard */
+int libxl_device_vkb_init(libxl_ctx *ctx, libxl_device_vkb *vkb);
 int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
-int libxl_device_vkb_clean_shutdown(libxl_ctx *ctx, uint32_t domid);
-int libxl_device_vkb_hard_shutdown(libxl_ctx *ctx, uint32_t domid);
+int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
+int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
 
 void libxl_device_vfb_init(libxl_device_vfb *vfb, int dev_num);
 int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
diff -r 17b83c16a9a6 -r e161facb4c6a tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -857,7 +857,8 @@ skip:
 
             d_config->vkbs = (libxl_device_vkb *) realloc(d_config->vkbs, sizeof(libxl_device_vkb) * (d_config->num_vkbs + 1));
             vkb = d_config->vkbs + d_config->num_vkbs;
-            libxl_device_vkb_init(vkb, d_config->num_vkbs);
+            libxl_device_vkb_init(ctx, vkb);
+            vkb->devid = d_config->num_vkbs;
 
             p = strtok(buf2, ",");
             if (!p)
diff -r 17b83c16a9a6 -r e161facb4c6a tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:46 2011 +0100
@@ -26,10 +26,7 @@ functions = { # ( name , [type1,type2,..
                         ("clean_shutdown", ["domid", "unit"]),
                         ("hard_shutdown",  ["domid", "unit"]),
                       ],
-    "device_vkb":     [ ("add",            ["t", "domid", "unit"]),
-                        ("clean_shutdown", ["domid", "unit"]),
-                        ("hard_shutdown",  ["domid", "unit"]),
-                      ],
+    "device_vkb":     DEVICE_FUNCTIONS,
     "device_disk":    DEVICE_FUNCTIONS,
     "device_nic":     DEVICE_FUNCTIONS,
     "device_pci":     [ ("add",            ["t", "domid", "unit"]),
diff -r 17b83c16a9a6 -r e161facb4c6a tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
@@ -306,14 +306,17 @@ value stub_xl_device_vkb_add(value info,
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_vkb_clean_shutdown(value domid)
+value stub_xl_device_vkb_remove(value info, value domid)
 {
 	CAMLparam1(domid);
+	libxl_device_vkb c_info;
 	int ret;
 	INIT_STRUCT();
 
+	device_vkb_val(&gc, &lg, &c_info, info);
+
 	INIT_CTX();
-	ret = libxl_device_vkb_clean_shutdown(ctx, Int_val(domid));
+	ret = libxl_device_vkb_remove(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("vkb_clean_shutdown", &lg);
 	FREE_CTX();
@@ -321,14 +324,17 @@ value stub_xl_device_vkb_clean_shutdown(
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_vkb_hard_shutdown(value domid)
+value stub_xl_device_vkb_destroy(value info, value domid)
 {
 	CAMLparam1(domid);
+	libxl_device_vkb c_info;
 	int ret;
 	INIT_STRUCT();
 
+	device_vkb_val(&gc, &lg, &c_info, info);
+
 	INIT_CTX();
-	ret = libxl_device_vkb_hard_shutdown(ctx, Int_val(domid));
+	ret = libxl_device_vkb_destroy(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("vkb_hard_shutdown", &lg);
 	FREE_CTX();

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:40:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 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 1REIiR-0006wB-0d; Thu, 13 Oct 2011 03:40:43 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz8-0004kW-C6
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:55 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318499613!44066946!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2256 invoked from network); 13 Oct 2011 09:53:36 -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;
	13 Oct 2011 09:53:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712254"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:50 -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; Thu, 13 Oct 2011 05:53:50 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhf023753; Thu, 13 Oct 2011 02:53:49 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 5dcc40da135e09a00fcf8371dc452b4334fb6397
Message-ID: <5dcc40da135e09a00fcf.1318499630@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:50 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 25 of 27 v2] libxl: reorder device functions to
 put functions for each device together
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499566 -3600
# Node ID 5dcc40da135e09a00fcf8371dc452b4334fb6397
# Parent  9abeaa8b4d3c1f21c4e1695211fa0ad2639eb586
libxl: reorder device functions to put functions for each device together.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 9abeaa8b4d3c -r 5dcc40da135e tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -1113,6 +1113,216 @@ out:
     libxl__free_all(&gc);
     return rc;
 }
+
+static void libxl__device_disk_from_xs_be(libxl__gc *gc,
+                                          const char *be_path,
+                                          libxl_device_disk *disk)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    unsigned int len;
+    char *tmp;
+
+    libxl_device_disk_init(ctx, disk);
+
+    tmp = xs_read(ctx->xsh, XBT_NULL,
+                  libxl__sprintf(gc, "%s/params", be_path), &len);
+    if (tmp && strchr(tmp, ':')) {
+        disk->pdev_path = strdup(strchr(tmp, ':') + 1);
+        free(tmp);
+    } else {
+        disk->pdev_path = tmp;
+    }
+    libxl_string_to_backend(ctx,
+                        libxl__xs_read(gc, XBT_NULL,
+                                       libxl__sprintf(gc, "%s/type", be_path)),
+                        &(disk->backend));
+    disk->vdev = xs_read(ctx->xsh, XBT_NULL,
+                         libxl__sprintf(gc, "%s/dev", be_path), &len);
+    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf
+                         (gc, "%s/removable", be_path));
+
+    if (tmp)
+        disk->removable = atoi(tmp);
+    else
+        disk->removable = 0;
+
+    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", be_path));
+    if (!strcmp(tmp, "w"))
+        disk->readwrite = 1;
+    else
+        disk->readwrite = 0;
+
+    tmp = libxl__xs_read(gc, XBT_NULL,
+                         libxl__sprintf(gc, "%s/device-type", be_path));
+    disk->is_cdrom = !strcmp(tmp, "cdrom");
+
+    disk->format = LIBXL_DISK_FORMAT_UNKNOWN;
+}
+
+int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
+                               int devid, libxl_device_disk *disk)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *dompath, *path;
+    int rc = ERROR_FAIL;
+
+    libxl_device_disk_init(ctx, disk);
+
+    dompath = libxl__xs_get_dompath(&gc, domid);
+    if (!dompath) {
+        goto out;
+    }
+    path = libxl__xs_read(&gc, XBT_NULL,
+                          libxl__sprintf(&gc, "%s/device/vbd/%d/backend",
+                                         dompath, devid));
+    if (!path)
+        goto out;
+
+    libxl__device_disk_from_xs_be(&gc, path, disk);
+
+    rc = 0;
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
+
+static int libxl__append_disk_list_of_type(libxl__gc *gc,
+                                           uint32_t domid,
+                                           const char *type,
+                                           libxl_device_disk **disks,
+                                           int *ndisks)
+{
+    char *be_path = NULL;
+    char **dir = NULL;
+    unsigned int n = 0;
+    libxl_device_disk *pdisk = NULL, *pdisk_end = NULL;
+
+    be_path = libxl__sprintf(gc, "%s/backend/%s/%d",
+                             libxl__xs_get_dompath(gc, 0), type, domid);
+    dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n);
+    if (dir) {
+        libxl_device_disk *tmp;
+        tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
+        if (tmp == NULL)
+            return ERROR_NOMEM;
+        *disks = tmp;
+        pdisk = *disks + *ndisks;
+        *ndisks += n;
+        pdisk_end = *disks + *ndisks;
+        for (; pdisk < pdisk_end; pdisk++, dir++) {
+            const char *p;
+            p = libxl__sprintf(gc, "%s/%s", be_path, *dir);
+            libxl__device_disk_from_xs_be(gc, p, pdisk);
+            pdisk->backend_domid = 0;
+        }
+    }
+    return 0;
+}
+
+libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl_device_disk *disks = NULL;
+    int rc;
+
+    *num = 0;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num);
+    if (rc) goto out_err;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num);
+    if (rc) goto out_err;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num);
+    if (rc) goto out_err;
+
+    libxl__free_all(&gc);
+    return disks;
+
+out_err:
+    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list disks");
+    while (disks && *num) {
+        (*num)--;
+        libxl_device_disk_dispose(&disks[*num]);
+    }
+    free(disks);
+    return NULL;
+}
+
+int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_disk *disk, libxl_diskinfo *diskinfo)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *dompath, *diskpath;
+    char *val;
+
+    dompath = libxl__xs_get_dompath(&gc, domid);
+    diskinfo->devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
+
+    /* tap devices entries in xenstore are written as vbd devices. */
+    diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
+    diskinfo->backend = xs_read(ctx->xsh, XBT_NULL,
+                                libxl__sprintf(&gc, "%s/backend", diskpath), NULL);
+    if (!diskinfo->backend) {
+        libxl__free_all(&gc);
+        return ERROR_FAIL;
+    }
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath));
+    diskinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", diskpath));
+    diskinfo->state = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", diskpath));
+    diskinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/ring-ref", diskpath));
+    diskinfo->rref = val ? strtoul(val, NULL, 10) : -1;
+    diskinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
+                                 libxl__sprintf(&gc, "%s/frontend", diskinfo->backend), NULL);
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", diskinfo->backend));
+    diskinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
+
+    libxl__free_all(&gc);
+    return 0;
+}
+
+int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
+{
+    int num, i;
+    uint32_t stubdomid;
+    libxl_device_disk *disks;
+    int ret = ERROR_FAIL;
+
+    if (!disk->pdev_path) {
+        disk->pdev_path = strdup("");
+        disk->format = LIBXL_DISK_FORMAT_EMPTY;
+    }
+    disks = libxl_device_disk_list(ctx, domid, &num);
+    for (i = 0; i < num; i++) {
+        if (disks[i].is_cdrom && !strcmp(disk->vdev, disks[i].vdev))
+            /* found */
+            break;
+    }
+    if (i == num) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Virtual device not found");
+        goto out;
+    }
+
+    ret = 0;
+
+    libxl_device_disk_remove(ctx, domid, disks + i);
+    libxl_device_disk_add(ctx, domid, disk);
+    stubdomid = libxl_get_stubdom_id(ctx, domid);
+    if (stubdomid) {
+        libxl_device_disk_remove(ctx, stubdomid, disks + i);
+        libxl_device_disk_add(ctx, stubdomid, disk);
+    }
+out:
+    for (i = 0; i < num; i++)
+        libxl_device_disk_dispose(&disks[i]);
+    free(disks);
+    return ret;
+}
+
 char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
@@ -1346,6 +1556,7 @@ out:
     libxl__free_all(&gc);
     return rc;
 }
+
 static void libxl__device_nic_from_xs_be(libxl__gc *gc,
                                          const char *be_path,
                                          libxl_device_nic *nic)
@@ -1686,215 +1897,6 @@ out:
     return rc;
 }
 
-static void libxl__device_disk_from_xs_be(libxl__gc *gc,
-                                          const char *be_path,
-                                          libxl_device_disk *disk)
-{
-    libxl_ctx *ctx = libxl__gc_owner(gc);
-    unsigned int len;
-    char *tmp;
-
-    libxl_device_disk_init(ctx, disk);
-
-    tmp = xs_read(ctx->xsh, XBT_NULL,
-                  libxl__sprintf(gc, "%s/params", be_path), &len);
-    if (tmp && strchr(tmp, ':')) {
-        disk->pdev_path = strdup(strchr(tmp, ':') + 1);
-        free(tmp);
-    } else {
-        disk->pdev_path = tmp;
-    }
-    libxl_string_to_backend(ctx,
-                        libxl__xs_read(gc, XBT_NULL,
-                                       libxl__sprintf(gc, "%s/type", be_path)),
-                        &(disk->backend));
-    disk->vdev = xs_read(ctx->xsh, XBT_NULL,
-                         libxl__sprintf(gc, "%s/dev", be_path), &len);
-    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf
-                         (gc, "%s/removable", be_path));
-
-    if (tmp)
-        disk->removable = atoi(tmp);
-    else
-        disk->removable = 0;
-
-    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", be_path));
-    if (!strcmp(tmp, "w"))
-        disk->readwrite = 1;
-    else
-        disk->readwrite = 0;
-
-    tmp = libxl__xs_read(gc, XBT_NULL,
-                         libxl__sprintf(gc, "%s/device-type", be_path));
-    disk->is_cdrom = !strcmp(tmp, "cdrom");
-
-    disk->format = LIBXL_DISK_FORMAT_UNKNOWN;
-}
-
-int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
-                               int devid, libxl_device_disk *disk)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath, *path;
-    int rc = ERROR_FAIL;
-
-    libxl_device_disk_init(ctx, disk);
-
-    dompath = libxl__xs_get_dompath(&gc, domid);
-    if (!dompath) {
-        goto out;
-    }
-    path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vbd/%d/backend",
-                                         dompath, devid));
-    if (!path)
-        goto out;
-
-    libxl__device_disk_from_xs_be(&gc, path, disk);
-
-    rc = 0;
-out:
-    libxl__free_all(&gc);
-    return rc;
-}
-
-
-static int libxl__append_disk_list_of_type(libxl__gc *gc,
-                                           uint32_t domid,
-                                           const char *type,
-                                           libxl_device_disk **disks,
-                                           int *ndisks)
-{
-    char *be_path = NULL;
-    char **dir = NULL;
-    unsigned int n = 0;
-    libxl_device_disk *pdisk = NULL, *pdisk_end = NULL;
-
-    be_path = libxl__sprintf(gc, "%s/backend/%s/%d",
-                             libxl__xs_get_dompath(gc, 0), type, domid);
-    dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n);
-    if (dir) {
-        libxl_device_disk *tmp;
-        tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
-        if (tmp == NULL)
-            return ERROR_NOMEM;
-        *disks = tmp;
-        pdisk = *disks + *ndisks;
-        *ndisks += n;
-        pdisk_end = *disks + *ndisks;
-        for (; pdisk < pdisk_end; pdisk++, dir++) {
-            const char *p;
-            p = libxl__sprintf(gc, "%s/%s", be_path, *dir);
-            libxl__device_disk_from_xs_be(gc, p, pdisk);
-            pdisk->backend_domid = 0;
-        }
-    }
-    return 0;
-}
-
-libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    libxl_device_disk *disks = NULL;
-    int rc;
-
-    *num = 0;
-
-    rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num);
-    if (rc) goto out_err;
-
-    rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num);
-    if (rc) goto out_err;
-
-    rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num);
-    if (rc) goto out_err;
-
-    libxl__free_all(&gc);
-    return disks;
-
-out_err:
-    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list disks");
-    while (disks && *num) {
-        (*num)--;
-        libxl_device_disk_dispose(&disks[*num]);
-    }
-    free(disks);
-    return NULL;
-}
-
-int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
-                              libxl_device_disk *disk, libxl_diskinfo *diskinfo)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath, *diskpath;
-    char *val;
-
-    dompath = libxl__xs_get_dompath(&gc, domid);
-    diskinfo->devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
-
-    /* tap devices entries in xenstore are written as vbd devices. */
-    diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
-    diskinfo->backend = xs_read(ctx->xsh, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", diskpath), NULL);
-    if (!diskinfo->backend) {
-        libxl__free_all(&gc);
-        return ERROR_FAIL;
-    }
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath));
-    diskinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", diskpath));
-    diskinfo->state = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", diskpath));
-    diskinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/ring-ref", diskpath));
-    diskinfo->rref = val ? strtoul(val, NULL, 10) : -1;
-    diskinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/frontend", diskinfo->backend), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", diskinfo->backend));
-    diskinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
-
-    libxl__free_all(&gc);
-    return 0;
-}
-
-int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
-{
-    int num, i;
-    uint32_t stubdomid;
-    libxl_device_disk *disks;
-    int ret = ERROR_FAIL;
-
-    if (!disk->pdev_path) {
-        disk->pdev_path = strdup("");
-        disk->format = LIBXL_DISK_FORMAT_EMPTY;
-    }
-    disks = libxl_device_disk_list(ctx, domid, &num);
-    for (i = 0; i < num; i++) {
-        if (disks[i].is_cdrom && !strcmp(disk->vdev, disks[i].vdev))
-            /* found */
-            break;
-    }
-    if (i == num) {
-        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Virtual device not found");
-        goto out;
-    }
-
-    ret = 0;
-
-    libxl_device_disk_remove(ctx, domid, disks + i);
-    libxl_device_disk_add(ctx, domid, disk);
-    stubdomid = libxl_get_stubdom_id(ctx, domid);
-    if (stubdomid) {
-        libxl_device_disk_remove(ctx, stubdomid, disks + i);
-        libxl_device_disk_add(ctx, stubdomid, disk);
-    }
-out:
-    for (i = 0; i < num; i++)
-        libxl_device_disk_dispose(&disks[i]);
-    free(disks);
-    return ret;
-}
-
 /******************************************************************************/
 int libxl_device_vfb_init(libxl_ctx *ctx, libxl_device_vfb *vfb)
 {

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:41:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:41:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIjR-0007Jc-0E; Thu, 13 Oct 2011 03:41:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz9-0004kf-Tw
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:57 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318499613!44066946!4
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2423 invoked from network); 13 Oct 2011 09:53:38 -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;
	13 Oct 2011 09:53:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="166712257"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53: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; Thu, 13 Oct 2011 05:53:52 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhh023753; Thu, 13 Oct 2011 02:53:51 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ed4bd6824e5e4f751bf1b77a70a514111aaa077e
Message-ID: <ed4bd6824e5e4f751bf1.1318499632@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:52 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 27 of 27 v2] imported patch
	libxl-flags-on-ctx-alloc.patch
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499566 -3600
# Node ID ed4bd6824e5e4f751bf1b77a70a514111aaa077e
# Parent  090e45b2fdcadd82d7373db52d84d1c0e5442a29
imported patch libxl-flags-on-ctx-alloc.patch

diff -r 090e45b2fdca -r ed4bd6824e5e tools/libxl/gentest.py
--- a/tools/libxl/gentest.py	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/gentest.py	Thu Oct 13 10:52:46 2011 +0100
@@ -239,7 +239,7 @@ int main(int argc, char **argv)
     logger = xtl_createlogger_stdiostream(stderr, XTL_DETAIL, 0);
     if (!logger) exit(1);
 
-    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, (xentoollog_logger*)logger)) {
+    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (xentoollog_logger*)logger)) {
         fprintf(stderr, "cannot init xl context\\n");
         exit(1);
     }
diff -r 090e45b2fdca -r ed4bd6824e5e tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -39,7 +39,8 @@
 #define PAGE_TO_MEMKB(pages) ((pages) * 4)
 #define BACKEND_STRING_SIZE 5
 
-int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
+int libxl_ctx_alloc(libxl_ctx **pctx, int version,
+                    unsigned flags, xentoollog_logger * lg)
 {
     libxl_ctx *ctx;
     struct stat stat_buf;
diff -r 090e45b2fdca -r ed4bd6824e5e tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
@@ -245,7 +245,9 @@ typedef struct {
 } libxl_domain_config;
 
 /* context functions */
-int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger *lg);
+int libxl_ctx_alloc(libxl_ctx **pctx, int version,
+                    unsigned flags /* none currently defined */,
+                    xentoollog_logger *lg);
 int libxl_ctx_free(libxl_ctx *ctx /* 0 is OK */);
 int libxl_ctx_postfork(libxl_ctx *ctx);
 
diff -r 090e45b2fdca -r ed4bd6824e5e tools/libxl/xl.c
--- a/tools/libxl/xl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/xl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -116,7 +116,7 @@ int main(int argc, char **argv)
     logger = xtl_createlogger_stdiostream(stderr, minmsglevel,  0);
     if (!logger) exit(1);
 
-    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, (xentoollog_logger*)logger)) {
+    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (xentoollog_logger*)logger)) {
         fprintf(stderr, "cannot init xl context\n");
         exit(1);
     }
diff -r 090e45b2fdca -r ed4bd6824e5e tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
@@ -59,7 +59,7 @@ static void log_destroy(struct xentoollo
 	lg.logger.destroy = log_destroy; \
 	lg.logger.progress = NULL; \
 	caml_enter_blocking_section(); \
-	ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, (struct xentoollog_logger *) &lg); \
+	ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (struct xentoollog_logger *) &lg); \
 	if (ret != 0) \
 		failwith_xl("cannot init context", &lg);
 
diff -r 090e45b2fdca -r ed4bd6824e5e tools/python/xen/lowlevel/xl/xl.c
--- a/tools/python/xen/lowlevel/xl/xl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/python/xen/lowlevel/xl/xl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -687,7 +687,7 @@ PyXl_init(XlObject *self, PyObject *args
         return -1;
     }
 
-    if ( libxl_ctx_alloc(&self->ctx, LIBXL_VERSION,
+    if ( libxl_ctx_alloc(&self->ctx, LIBXL_VERSION, 0,
                 (xentoollog_logger*)self->logger) ) {
         PyErr_SetString(xl_error_obj, "cannot init xl context");
         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 Oct 13 03:42:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:42:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIkX-0007hM-At; Thu, 13 Oct 2011 03:42:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REHz9-0004ke-GD
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:53:57 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318499610!837677!13
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21018 invoked from network); 13 Oct 2011 09:53:51 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 09:53:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315195200"; d="scan'208";a="18184484"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 05:53:51 -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; Thu, 13 Oct 2011 05:53:51 -0400
Received: from localhost.localdomain (cosworth.uk.xensource.com [10.80.16.52])
	by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id
	p9D9rRhg023753; Thu, 13 Oct 2011 02:53:50 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 090e45b2fdcadd82d7373db52d84d1c0e5442a29
Message-ID: <090e45b2fdcadd82d737.1318499631@localhost.localdomain>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 13 Oct 2011 10:53:51 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 26 of 27 v2] libxl: convert PCI device handling
	to device API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318499566 -3600
# Node ID 090e45b2fdcadd82d7373db52d84d1c0e5442a29
# Parent  5dcc40da135e09a00fcf8371dc452b4334fb6397
libxl: convert PCI device handling to device API

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 5dcc40da135e -r 090e45b2fdca tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -754,7 +754,7 @@ int libxl_domain_destroy(libxl_ctx *ctx,
         goto out;
     }
 
-    if (libxl_device_pci_shutdown(ctx, domid) < 0)
+    if (libxl__device_pci_destroy_all(&gc, domid) < 0)
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "pci shutdown failed for domid %d", domid);
     rc = xc_domain_pause(ctx->xch, domid);
     if (rc < 0) {
diff -r 5dcc40da135e -r 090e45b2fdca tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
@@ -485,12 +485,28 @@ int libxl_device_vfb_add(libxl_ctx *ctx,
 int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
 int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
 
+/* PCI Passthrough */
+int libxl_device_pci_init(libxl_ctx *ctx, libxl_device_pci *pci);
 int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev);
-int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev, int force);
-int libxl_device_pci_shutdown(libxl_ctx *ctx, uint32_t domid);
-int libxl_device_pci_list_assigned(libxl_ctx *ctx, libxl_device_pci **list, uint32_t domid, int *num);
-int libxl_device_pci_list_assignable(libxl_ctx *ctx, libxl_device_pci **list, int *num);
-int libxl_device_pci_parse_bdf(libxl_ctx *ctx, libxl_device_pci *pcidev, const char *str);
+int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev);
+int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev);
+libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num);
+
+/*
+ * Parse a PCI BDF into a PCI device structure.
+ */
+int libxl_device_pci_parse_bdf(libxl_ctx *ctx,
+                               libxl_device_pci *pcidev,
+                               const char *str);
+
+/*
+ * Similar to libxl_device_pci_list but returns all devices which
+ * could be assigned to a domain (i.e. are bound to the backend
+ * driver) but are not currently.
+ */
+libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num);
+
+/* CPUID handling */
 int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str);
 int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid,
                                   const char* str);
diff -r 5dcc40da135e -r 090e45b2fdca tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Thu Oct 13 10:52:46 2011 +0100
@@ -252,6 +252,7 @@ _hidden int libxl__wait_for_backend(libx
 _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting);
 _hidden int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid,
                                       libxl_device_pci *pcidev, int num);
+_hidden int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid);
 
 /* xl_exec */
 
diff -r 5dcc40da135e -r 090e45b2fdca tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Thu Oct 13 10:52:46 2011 +0100
@@ -486,7 +486,7 @@ static int is_assigned(libxl_device_pci 
     return 0;
 }
 
-int libxl_device_pci_list_assignable(libxl_ctx *ctx, libxl_device_pci **list, int *num)
+libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     libxl_device_pci *pcidevs = NULL, *new, *assigned;
@@ -495,13 +495,10 @@ int libxl_device_pci_list_assignable(lib
     int rc, num_assigned;
 
     *num = 0;
-    *list = NULL;
 
     rc = get_all_assigned_devices(&gc, &assigned, &num_assigned);
-    if ( rc ) {
-        libxl__free_all(&gc);
-        return rc;
-    }
+    if ( rc )
+        goto out;
 
     dir = opendir(SYSFS_PCIBACK_DRIVER);
     if ( NULL == dir ) {
@@ -510,8 +507,7 @@ int libxl_device_pci_list_assignable(lib
         }else{
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Couldn't open %s", SYSFS_PCIBACK_DRIVER);
         }
-        libxl__free_all(&gc);
-        return ERROR_FAIL;
+        goto out_closedir;
     }
 
     while( (de = readdir(dir)) ) {
@@ -534,10 +530,11 @@ int libxl_device_pci_list_assignable(lib
         (*num)++;
     }
 
+out_closedir:
     closedir(dir);
-    *list = pcidevs;
+out:
     libxl__free_all(&gc);
-    return 0;
+    return pcidevs;
 }
 
 /*
@@ -846,21 +843,25 @@ static int do_pci_remove(libxl__gc *gc, 
     int hvm = 0, rc, num;
     int stubdomid = 0;
 
-    if ( !libxl_device_pci_list_assigned(ctx, &assigned, domid, &num) ) {
-        if ( !is_assigned(assigned, num, pcidev->domain,
-                         pcidev->bus, pcidev->dev, pcidev->func) ) {
-            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "PCI device not attached to this domain");
-            return ERROR_INVAL;
-        }
+    assigned = libxl_device_pci_list(ctx, domid, &num);
+    if ( assigned == NULL )
+        return ERROR_FAIL;
+
+    rc = ERROR_INVAL;
+    if ( !is_assigned(assigned, num, pcidev->domain,
+                      pcidev->bus, pcidev->dev, pcidev->func) ) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "PCI device not attached to this domain");
+        goto out_fail;
     }
 
+    rc = ERROR_FAIL;
     switch (libxl__domain_type(gc, domid)) {
     case LIBXL_DOMAIN_TYPE_HVM:
         hvm = 1;
         if (libxl__wait_for_device_model(gc, domid, "running",
-                                         NULL, NULL, NULL) < 0) {
-            return ERROR_FAIL;
-        }
+                                         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);
@@ -879,7 +880,7 @@ static int do_pci_remove(libxl__gc *gc, 
                  * SCI, if it doesn't respond in time then we may wish to
                  * force the removal.
                  */
-                return ERROR_FAIL;
+                goto out_fail;
             }
         }
         path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
@@ -955,25 +956,31 @@ out:
     stubdomid = libxl_get_stubdom_id(ctx, domid);
     if (stubdomid != 0) {
         libxl_device_pci pcidev_s = *pcidev;
-        libxl_device_pci_remove(ctx, stubdomid, &pcidev_s, force);
+        if (force)
+                libxl_device_pci_destroy(ctx, stubdomid, &pcidev_s);
+        else
+                libxl_device_pci_remove(ctx, stubdomid, &pcidev_s);
     }
 
     libxl__device_pci_remove_xenstore(gc, domid, pcidev);
 
-    return 0;
+    rc = 0;
+out_fail:
+    free(assigned);
+    return rc;
+
 }
 
-int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid,
-                            libxl_device_pci *pcidev, int force)
+static int libxl__device_pci_remove_common(libxl__gc *gc, uint32_t domid,
+                                           libxl_device_pci *pcidev, int force)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
     unsigned int orig_vdev, pfunc_mask;
     int i, rc;
 
     orig_vdev = pcidev->vdevfn & ~7U;
 
     if ( pcidev->vfunc_mask == LIBXL_PCI_FUNC_ALL ) {
-        if ( pci_multifunction_check(&gc, pcidev, &pfunc_mask) ) {
+        if ( pci_multifunction_check(gc, pcidev, &pfunc_mask) ) {
             rc = ERROR_FAIL;
             goto out;
         }
@@ -990,81 +997,118 @@ int libxl_device_pci_remove(libxl_ctx *c
             }else{
                 pcidev->vdevfn = orig_vdev;
             }
-            if ( do_pci_remove(&gc, domid, pcidev, force) )
+            if ( do_pci_remove(gc, domid, pcidev, force) )
                 rc = ERROR_FAIL;
         }
     }
 
 out:
+    return rc;
+}
+
+int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    int rc;
+
+    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 0);
+
     libxl__free_all(&gc);
     return rc;
 }
 
-int libxl_device_pci_list_assigned(libxl_ctx *ctx, libxl_device_pci **list, uint32_t domid, int *num)
+int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_device_pci *pcidev)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *be_path, *num_devs, *xsdev, *xsvdevfn, *xsopts;
+    int rc;
+
+    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 1);
+
+    libxl__free_all(&gc);
+    return rc;
+}
+
+static void libxl__device_pci_from_xs_be(libxl__gc *gc,
+                                         const char *be_path,
+                                         libxl_device_pci *pci,
+                                         int nr)
+{
+    char *s;
+    unsigned int domain = 0, bus = 0, dev = 0, func = 0, vdevfn = 0;
+
+    s = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/dev-%d", be_path, nr));
+    sscanf(s, PCI_BDF, &domain, &bus, &dev, &func);
+
+    s = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/vdevfn-%d", be_path, nr));
+    if (s)
+        vdevfn = strtol(s, (char **) NULL, 16);
+
+    pcidev_init(pci, domain, bus, dev, func, vdevfn);
+
+    s = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/opts-%d", be_path, nr));
+    if (s) {
+        char *saveptr;
+        char *p = strtok_r(s, ",=", &saveptr);
+        do {
+            while (*p == ' ')
+                p++;
+            if (!strcmp(p, "msitranslate")) {
+                p = strtok_r(NULL, ",=", &saveptr);
+                pci->msitranslate = atoi(p);
+            } else if (!strcmp(p, "power_mgmt")) {
+                p = strtok_r(NULL, ",=", &saveptr);
+                pci->power_mgmt = atoi(p);
+            }
+        } while ((p = strtok_r(NULL, ",=", &saveptr)) != NULL);
+    }
+}
+
+libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *be_path, *num_devs;
     int n, i;
-    unsigned int domain = 0, bus = 0, dev = 0, func = 0, vdevfn = 0;
-    libxl_device_pci *pcidevs;
+    libxl_device_pci *pcidevs = NULL;
+
+    *num = 0;
 
     be_path = libxl__sprintf(&gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(&gc, 0), domid);
     num_devs = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/num_devs", be_path));
-    if (!num_devs) {
-        *num = 0;
-        *list = NULL;
-        libxl__free_all(&gc);
-        return 0;
-    }
+    if (!num_devs)
+        goto out;
+
     n = atoi(num_devs);
     pcidevs = calloc(n, sizeof(libxl_device_pci));
+
+    for (i = 0; i < n; i++)
+        libxl__device_pci_from_xs_be(&gc, be_path, pcidevs + i, i);
+
     *num = n;
-
-    for (i = 0; i < n; i++) {
-        xsdev = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/dev-%d", be_path, i));
-        sscanf(xsdev, PCI_BDF, &domain, &bus, &dev, &func);
-        xsvdevfn = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vdevfn-%d", be_path, i));
-        if (xsvdevfn)
-            vdevfn = strtol(xsvdevfn, (char **) NULL, 16);
-        pcidev_init(pcidevs + i, domain, bus, dev, func, vdevfn);
-        xsopts = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/opts-%d", be_path, i));
-        if (xsopts) {
-            char *saveptr;
-            char *p = strtok_r(xsopts, ",=", &saveptr);
-            do {
-                while (*p == ' ')
-                    p++;
-                if (!strcmp(p, "msitranslate")) {
-                    p = strtok_r(NULL, ",=", &saveptr);
-                    pcidevs[i].msitranslate = atoi(p);
-                } else if (!strcmp(p, "power_mgmt")) {
-                    p = strtok_r(NULL, ",=", &saveptr);
-                    pcidevs[i].power_mgmt = atoi(p);
-                }
-            } while ((p = strtok_r(NULL, ",=", &saveptr)) != NULL);
-        }
-    }
-    *list = pcidevs;
+out:
     libxl__free_all(&gc);
-    return 0;
+    return pcidevs;
 }
 
-int libxl_device_pci_shutdown(libxl_ctx *ctx, uint32_t domid)
+int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid)
 {
+    libxl_ctx *ctx = libxl__gc_owner(gc);
     libxl_device_pci *pcidevs;
-    int num, i, rc;
+    int num, i, rc = 0;
 
-    rc = libxl_device_pci_list_assigned(ctx, &pcidevs, domid, &num);
-    if ( rc )
-        return rc;
+    pcidevs = libxl_device_pci_list(ctx, domid, &num);
+    if ( pcidevs == NULL )
+        return ERROR_FAIL;
+
     for (i = 0; i < num; i++) {
         /* Force remove on shutdown since, on HVM, qemu will not always
          * respond to SCI interrupt because the guest kernel has shut down the
          * devices by the time we even get here!
          */
-        if (libxl_device_pci_remove(ctx, domid, pcidevs + i, 1) < 0)
-            return ERROR_FAIL;
+        if (libxl_device_pci_destroy(ctx, domid, pcidevs + i) < 0)
+            rc = ERROR_FAIL;
     }
+
     free(pcidevs);
     return 0;
 }
diff -r 5dcc40da135e -r 090e45b2fdca tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -2018,11 +2018,14 @@ static void pcilist_assignable(void)
     libxl_device_pci *pcidevs;
     int num, i;
 
-    if ( libxl_device_pci_list_assignable(ctx, &pcidevs, &num) )
+    pcidevs = libxl_device_pci_list_assignable(ctx, &num);
+
+    if ( pcidevs == NULL )
         return;
     for (i = 0; i < num; i++) {
         printf("%04x:%02x:%02x.%01x\n",
-                pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func);
+               pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func);
+        libxl_device_pci_dispose(&pcidevs[i]);
     }
     free(pcidevs);
 }
@@ -2045,7 +2048,8 @@ static void pcilist(const char *dom)
 
     find_domain(dom);
 
-    if (libxl_device_pci_list_assigned(ctx, &pcidevs, domid, &num))
+    pcidevs = libxl_device_pci_list(ctx, domid, &num);
+    if (pcidevs == NULL)
         return;
     printf("Vdev Device\n");
     for (i = 0; i < num; i++) {
@@ -2082,7 +2086,10 @@ static void pcidetach(const char *dom, c
         fprintf(stderr, "pci-detach: malformed BDF specification \"%s\"\n", bdf);
         exit(2);
     }
-    libxl_device_pci_remove(ctx, domid, &pcidev, force);
+    if (force)
+        libxl_device_pci_destroy(ctx, domid, &pcidev);
+    else
+        libxl_device_pci_remove(ctx, domid, &pcidev);
     libxl_device_pci_dispose(&pcidev);
 }
 
diff -r 5dcc40da135e -r 090e45b2fdca tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Thu Oct 13 10:52:46 2011 +0100
@@ -26,10 +26,7 @@ functions = { # ( name , [type1,type2,..
     "device_vkb":     DEVICE_FUNCTIONS,
     "device_disk":    DEVICE_FUNCTIONS,
     "device_nic":     DEVICE_FUNCTIONS,
-    "device_pci":     [ ("add",            ["t", "domid", "unit"]),
-                        ("remove",         ["t", "domid", "unit"]),
-                        ("shutdown",       ["domid", "unit"]),
-                      ],
+    "device_pci":     DEVICE_FUNCTIONS,
     "physinfo":       [ ("get",            ["unit", "t"]),
                       ],
     "sched_credit":   [ ("domain_get",     ["domid", "t"]),
diff -r 5dcc40da135e -r 090e45b2fdca tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
@@ -424,7 +424,7 @@ value stub_xl_device_pci_remove(value in
 	device_pci_val(&gc, &lg, &c_info, info);
 
 	INIT_CTX();
-	ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info, 0);
+	ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("pci_remove", &lg);
 	FREE_CTX();
@@ -432,21 +432,6 @@ value stub_xl_device_pci_remove(value in
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_pci_shutdown(value domid)
-{
-	CAMLparam1(domid);
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_device_pci_shutdown(ctx, Int_val(domid));
-	if (ret != 0)
-		failwith_xl("pci_shutdown", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
 value stub_xl_button_press(value domid, value button)
 {
 	CAMLparam2(domid, button);
diff -r 5dcc40da135e -r 090e45b2fdca tools/python/xen/lowlevel/xl/xl.c
--- a/tools/python/xen/lowlevel/xl/xl.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/python/xen/lowlevel/xl/xl.c	Thu Oct 13 10:52:46 2011 +0100
@@ -521,9 +521,16 @@ static PyObject *pyxl_pci_del(XlObject *
         return NULL;
     }
     pci = (Py_device_pci *)obj;
-    if ( libxl_device_pci_remove(self->ctx, domid, &pci->obj, force) ) {
-        PyErr_SetString(xl_error_obj, "cannot remove pci device");
-        return NULL;
+    if ( force ) {
+        if ( libxl_device_pci_destroy(self->ctx, domid, &pci->obj) ) {
+            PyErr_SetString(xl_error_obj, "cannot remove pci device");
+            return NULL;
+        }
+    } else {
+        if ( libxl_device_pci_remove(self->ctx, domid, &pci->obj) ) {
+            PyErr_SetString(xl_error_obj, "cannot remove pci device");
+            return NULL;
+        }
     }
     Py_INCREF(Py_None);
     return Py_None;
@@ -558,7 +565,8 @@ static PyObject *pyxl_pci_list_assignabl
     PyObject *list;
     int nr_dev, i;
 
-    if ( libxl_device_pci_list_assignable(self->ctx, &dev, &nr_dev) ) {
+    dev = libxl_device_pci_list_assignable(self->ctx, &nr_dev);
+    if ( dev == NULL ) {
         PyErr_SetString(xl_error_obj, "Cannot list assignable devices");
         return NULL;
     }
@@ -594,7 +602,8 @@ static PyObject *pyxl_pci_list(XlObject 
     if ( !PyArg_ParseTuple(args, "i", &domid) )
         return NULL;
 
-    if ( libxl_device_pci_list_assigned(self->ctx, &dev, domid, &nr_dev) ) {
+    dev = libxl_device_pci_list(self->ctx, domid, &nr_dev);
+    if ( dev == NULL ) {
         PyErr_SetString(xl_error_obj, "Cannot list assignable devices");
         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 Oct 13 03:45:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:45:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REImb-0008Ka-OR; Thu, 13 Oct 2011 03:45:02 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REI0J-00054j-0W
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:55:07 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1318499684!48049220!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3174 invoked from network); 13 Oct 2011 09:54:44 -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;
	13 Oct 2011 09:54:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315180800"; 
   d="scan'208";a="8365176"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 09:55: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;
	Thu, 13 Oct 2011 10:55:03 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Thu, 13 Oct 2011 10:55:03 +0100
In-Reply-To: <ed4bd6824e5e4f751bf1.1318499632@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
	<ed4bd6824e5e4f751bf1.1318499632@localhost.localdomain>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318499703.21903.815.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Subject: [Xen-devel] Re: [PATCH 27 of 27 v2] imported patch
 libxl-flags-on-ctx-alloc.patch
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-13 at 10:53 +0100, Ian Campbell wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1318499566 -3600
> # Node ID ed4bd6824e5e4f751bf1b77a70a514111aaa077e
> # Parent  090e45b2fdcadd82d7373db52d84d1c0e5442a29
> imported patch libxl-flags-on-ctx-alloc.patch

Hmm. seems the comment for this one didn't get done right. Ignore it for
now, it was more of an addendum anyway.

> 
> diff -r 090e45b2fdca -r ed4bd6824e5e tools/libxl/gentest.py
> --- a/tools/libxl/gentest.py	Thu Oct 13 10:52:46 2011 +0100
> +++ b/tools/libxl/gentest.py	Thu Oct 13 10:52:46 2011 +0100
> @@ -239,7 +239,7 @@ int main(int argc, char **argv)
>      logger = xtl_createlogger_stdiostream(stderr, XTL_DETAIL, 0);
>      if (!logger) exit(1);
>  
> -    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, (xentoollog_logger*)logger)) {
> +    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (xentoollog_logger*)logger)) {
>          fprintf(stderr, "cannot init xl context\\n");
>          exit(1);
>      }
> diff -r 090e45b2fdca -r ed4bd6824e5e tools/libxl/libxl.c
> --- a/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
> +++ b/tools/libxl/libxl.c	Thu Oct 13 10:52:46 2011 +0100
> @@ -39,7 +39,8 @@
>  #define PAGE_TO_MEMKB(pages) ((pages) * 4)
>  #define BACKEND_STRING_SIZE 5
>  
> -int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
> +int libxl_ctx_alloc(libxl_ctx **pctx, int version,
> +                    unsigned flags, xentoollog_logger * lg)
>  {
>      libxl_ctx *ctx;
>      struct stat stat_buf;
> diff -r 090e45b2fdca -r ed4bd6824e5e tools/libxl/libxl.h
> --- a/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
> +++ b/tools/libxl/libxl.h	Thu Oct 13 10:52:46 2011 +0100
> @@ -245,7 +245,9 @@ typedef struct {
>  } libxl_domain_config;
>  
>  /* context functions */
> -int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger *lg);
> +int libxl_ctx_alloc(libxl_ctx **pctx, int version,
> +                    unsigned flags /* none currently defined */,
> +                    xentoollog_logger *lg);
>  int libxl_ctx_free(libxl_ctx *ctx /* 0 is OK */);
>  int libxl_ctx_postfork(libxl_ctx *ctx);
>  
> diff -r 090e45b2fdca -r ed4bd6824e5e tools/libxl/xl.c
> --- a/tools/libxl/xl.c	Thu Oct 13 10:52:46 2011 +0100
> +++ b/tools/libxl/xl.c	Thu Oct 13 10:52:46 2011 +0100
> @@ -116,7 +116,7 @@ int main(int argc, char **argv)
>      logger = xtl_createlogger_stdiostream(stderr, minmsglevel,  0);
>      if (!logger) exit(1);
>  
> -    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, (xentoollog_logger*)logger)) {
> +    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (xentoollog_logger*)logger)) {
>          fprintf(stderr, "cannot init xl context\n");
>          exit(1);
>      }
> diff -r 090e45b2fdca -r ed4bd6824e5e tools/ocaml/libs/xl/xenlight_stubs.c
> --- a/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
> +++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Thu Oct 13 10:52:46 2011 +0100
> @@ -59,7 +59,7 @@ static void log_destroy(struct xentoollo
>  	lg.logger.destroy = log_destroy; \
>  	lg.logger.progress = NULL; \
>  	caml_enter_blocking_section(); \
> -	ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, (struct xentoollog_logger *) &lg); \
> +	ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (struct xentoollog_logger *) &lg); \
>  	if (ret != 0) \
>  		failwith_xl("cannot init context", &lg);
>  
> diff -r 090e45b2fdca -r ed4bd6824e5e tools/python/xen/lowlevel/xl/xl.c
> --- a/tools/python/xen/lowlevel/xl/xl.c	Thu Oct 13 10:52:46 2011 +0100
> +++ b/tools/python/xen/lowlevel/xl/xl.c	Thu Oct 13 10:52:46 2011 +0100
> @@ -687,7 +687,7 @@ PyXl_init(XlObject *self, PyObject *args
>          return -1;
>      }
>  
> -    if ( libxl_ctx_alloc(&self->ctx, LIBXL_VERSION,
> +    if ( libxl_ctx_alloc(&self->ctx, LIBXL_VERSION, 0,
>                  (xentoollog_logger*)self->logger) ) {
>          PyErr_SetString(xl_error_obj, "cannot init xl context");
>          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 Oct 13 03:46:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:46:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIoH-0000Ue-5X; Thu, 13 Oct 2011 03:46:45 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REIA8-00070q-SD
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:05:20 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318500313!847968!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9682 invoked from network); 13 Oct 2011 10:05:13 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 10:05:13 -0000
Received: by wwf27 with SMTP id 27so1157676wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 03:05: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=p6AkW1gMd5kcYjIOCxaMXvCJ2jN5K3gEXHGF5WT8M2Q=;
	b=bE54TdfusRDShl1HpJkrgkchk+X9u0F5H2Na482ffZyQKqK0U6jTGA5UdPh5z3DAlH
	PqBZhIQ6SP0U0LJGf5DJus8uBwbQSlbPmrl/r/+yFn8jOaDwZG/NDXTn0uXbUXgCqYvk
	gNr0wCabceAaka/tV64iUPdyVcmb1WHAoYZtE=
Received: by 10.227.137.82 with SMTP id v18mr1075075wbt.7.1318500312429;
	Thu, 13 Oct 2011 03:05:12 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id ek13sm5060821wbb.3.2011.10.13.03.05.11
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 03:05:12 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 11:05:09 +0100
Subject: Re: [Xen-devel] [PATCH] build: error out on non-absolute $(XEN_ROOT)
From: Keir Fraser <keir@xen.org>
To: Ian Campbell <ian.campbell@citrix.com>,
	<xen-devel@lists.xensource.com>
Message-ID: <CABC7665.32797%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] build: error out on non-absolute $(XEN_ROOT)
Thread-Index: AcyJj5bJGYrrXT3wlUyb9cBUFt5OMQ==
In-Reply-To: <82b2eeea91d059dd79cf.1318499198@localhost.localdomain>
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 13/10/2011 10:46, "Ian Campbell" <ian.campbell@citrix.com> wrote:

> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1318499065 -3600
> # Node ID 82b2eeea91d059dd79cf7621d487a0cf7d29933e
> # Parent  e5cc23098360f3ff137da9b128b02114468c5654
> build: error out on non-absolute $(XEN_ROOT)

Notice something about the surrounding context of this diff? ;-)

 -- Keir

> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> 
> diff -r e5cc23098360 -r 82b2eeea91d0 Config.mk
> --- a/Config.mk Thu Oct 13 10:44:03 2011 +0100
> +++ b/Config.mk Thu Oct 13 10:44:25 2011 +0100
> @@ -4,6 +4,10 @@ ifeq ($(filter /%,$(XEN_ROOT)),)
>  $(error XEN_ROOT must be absolute)
>  endif
>  
> +ifeq ($(filter /%,$(XEN_ROOT)),)
> +$(error XEN_ROOT must be absolute)
> +endif
> +
>  -include $(XEN_ROOT)/.config
>  
>  # A debug build of Xen and tools?
> 
> _______________________________________________
> 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 Oct 13 03:47:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:47:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIpK-0000yD-NU; Thu, 13 Oct 2011 03:47:50 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REIGe-0007xJ-Fw
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:12:02 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318500716!711587!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16178 invoked from network); 13 Oct 2011 10:11:57 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 10:11:57 -0000
Received: by gyg13 with SMTP id 13so2000766gyg.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 03:11: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=fw3BcqQu8VvXhaUSz8isaDNa7Eak1Wv8jzXZw7PDMec=;
	b=VZFgW9uB+MUC0qoA+SXasnorWgt+ner5QsCusDE09hyqkBs7zZAz6qisPG52luWlhg
	OQiL5IMf2YOB6+huqhHz6U5UpLX/Gs4OdniRthPXFFt+0qwgQy51ej/X8+VJWQS4ILrL
	yfooupUABqDVxnbHppkyO54lKzb5wdj0h4/QU=
MIME-Version: 1.0
Received: by 10.42.136.196 with SMTP id v4mr6124505ict.3.1318500716073; Thu,
	13 Oct 2011 03:11:56 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Thu, 13 Oct 2011 03:11:56 -0700 (PDT)
In-Reply-To: <4E96CEBD020000780005B151@nat28.tlf.novell.com>
References: <4E96CEBD020000780005B151@nat28.tlf.novell.com>
Date: Thu, 13 Oct 2011 11:11:56 +0100
X-Google-Sender-Auth: IPjVA06rukxkZ_rvDvFD8i4_jbc
Message-ID: <CAFLBxZaHwav97=PVvZDTKzBVaeGc9FYh4xs9mj3cC=WbEzTZtw@mail.gmail.com>
Subject: Re: [Xen-devel] credit2 data structures
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Jan Beulich <JBeulich@suse.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

On Thu, Oct 13, 2011 at 10:42 AM, Jan Beulich <JBeulich@suse.com> wrote:
> Apart from the possibility of allocating the arrays (and maybe also the
> cpumask_t-s) separately (for which I can come up with a patch on top
> of what I' currently putting together) - is it really necessary to have
> all these, the more that there can be multiple instances of the structure
> with CPU pools?

I'm not quite sure what it is that you're asking.  Do you mean, are
all of the things in each runqueue structure necessary?  Specifically,
I guess, the cpumask_t structures (because the rest of the structure
isn't significantly larger than the per-cpu structure for credit1)?

At first blush, all of those cpu masks are necessary.  The assignment
of cpus to runqueues may be arbitrary, so we need a cpu mask for that.
 In theory, "idle" and "tickled" only need bits for the cpus actually
assigned to this runqueue (which should be 2-8 under normal
circumstances).  But then we would need some kind of mechanism to
translate "mask just for these cpus" to "mask of all cpus" in order to
use the normal cpumask mechanisms, which seems like a lot of extra
complexity just to save a few bytes.  Surely a system with 4096
logical cpus can afford 6 megabytes of memory for scheduling?

For one thing, the number of runqueues in credit2 is actually meant to
be smaller than the number of logical cpus -- it's meant to be one per
L2 cache, which should have between 2 and 8 logical cpus, depending on
the architecture.  I just put NR_CPUS because it was easier to get
working.  Making that an array of pointers, which is allocated on an
as-needed basis, should reduce that requirement a great deal.

 -George

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:49:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:49:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIqV-0001Ot-7L; Thu, 13 Oct 2011 03:49:03 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REIL1-0008Va-RO
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:16:34 -0700
X-Env-Sender: peterz@infradead.org
X-Msg-Ref: server-12.tower-182.messagelabs.com!1318500987!21979954!1
X-Originating-IP: [205.233.59.134]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24068 invoked from network); 13 Oct 2011 10:16:28 -0000
Received: from merlin.infradead.org (HELO merlin.infradead.org)
	(205.233.59.134)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 10:16:28 -0000
Received: from canuck.infradead.org ([2001:4978:20e::1])
	by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux))
	id 1REIKb-00029C-Sw; Thu, 13 Oct 2011 10:16:05 +0000
Received: from j77219.upc-j.chello.nl ([24.132.77.219] helo=twins)
	by canuck.infradead.org with esmtpsa (Exim 4.76 #1 (Red Hat Linux))
	id 1REIKb-0008F9-EA; Thu, 13 Oct 2011 10:16:05 +0000
Received: by twins (Postfix, from userid 1000)
	id 04DB88174E35; Thu, 13 Oct 2011 12:16:00 +0200 (CEST)
From: Peter Zijlstra <peterz@infradead.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
In-Reply-To: <07d7a349087d253549be9946d6fe8e3219492cda.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<07d7a349087d253549be9946d6fe8e3219492cda.1318464413.git.jeremy.fitzhardinge@citrix.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Date: Thu, 13 Oct 2011 12:15:52 +0200
Message-ID: <1318500952.19425.4.camel@twins>
Mime-Version: 1.0
X-Mailer: Evolution 3.0.3- 
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>, Michael,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, "H. Peter
	Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 04/10] x86/jump_label: drop
 arch_jump_label_text_poke_early()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-12 at 17:08 -0700, Jeremy Fitzhardinge wrote:
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>=20
> It is no longer used.
>=20
> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> Acked-by: Jason Baron <jbaron@redhat.com>
> ---
>  arch/x86/kernel/jump_label.c |    6 ------
>  1 files changed, 0 insertions(+), 6 deletions(-)
>=20
> diff --git a/arch/x86/kernel/jump_label.c b/arch/x86/kernel/jump_label.c
> index 3fee346..2ad0298 100644
> --- a/arch/x86/kernel/jump_label.c
> +++ b/arch/x86/kernel/jump_label.c
> @@ -42,10 +42,4 @@ void arch_jump_label_transform(struct jump_entry *entr=
y,
>  	put_online_cpus();
>  }
> =20
> -void arch_jump_label_text_poke_early(jump_label_t addr)
> -{
> -	text_poke_early((void *)addr, ideal_nops[NOP_ATOMIC5],
> -			JUMP_LABEL_NOP_SIZE);
> -}
> -
>  #endif

This was the (first and) last usage site outside of alternative.c, so at
the very least we should clean up arch/x86/include/asm/alternative.h.

However, since stop_machine now works early, is there any reason to keep
text_poke_early() itself? Shouldn't we also convert alternative.c's use
of text_poke_early and simply kill the thing off?

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:50:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:50:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIrZ-0001oE-4k; Thu, 13 Oct 2011 03:50:09 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REIbC-0004Qt-HD
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:33:14 -0700
X-Env-Sender: peterz@infradead.org
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318501877!40150619!1
X-Originating-IP: [85.118.1.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4147 invoked from network); 13 Oct 2011 10:31:18 -0000
Received: from casper.infradead.org (HELO casper.infradead.org) (85.118.1.10)
	by server-14.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 10:31:18 -0000
Received: from j77219.upc-j.chello.nl ([24.132.77.219] helo=twins)
	by casper.infradead.org with esmtpsa (Exim 4.76 #1 (Red Hat Linux))
	id 1REIae-0003tZ-K7; Thu, 13 Oct 2011 10:32:40 +0000
Received: by twins (Postfix, from userid 1000)
	id CF0648174E3D; Thu, 13 Oct 2011 12:32:34 +0200 (CEST)
From: Peter Zijlstra <peterz@infradead.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Thu, 13 Oct 2011 12:32:34 +0200
In-Reply-To: <16f652166605c973e9817177b6ba6a081e3e5b3f.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<16f652166605c973e9817177b6ba6a081e3e5b3f.1318464413.git.jeremy.fitzhardinge@citrix.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Mailer: Evolution 3.0.3- 
Message-ID: <1318501954.24856.5.camel@twins>
Mime-Version: 1.0
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>, Michael,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, "H. Peter
	Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 06/10] jump_label: add
 arch_jump_label_transform_static() to optimise non-live code updates
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-12 at 17:08 -0700, Jeremy Fitzhardinge wrote:
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>=20
> When updating a newly loaded module, the code is definitely not yet
> executing on any processor, so it can be updated with no need for any
> heavyweight synchronization.
>=20
> This patch adds arch_jump_label_static() which is implemented as
> arch_jump_label_transform() by default, but architectures can override
> it if it avoids, say, a call to stop_machine().
>=20
> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> Acked-by: Jason Baron <jbaron@redhat.com>
> ---
>  include/linux/jump_label.h |    2 ++
>  kernel/jump_label.c        |   18 +++++++++++++++---
>  2 files changed, 17 insertions(+), 3 deletions(-)
>=20
> diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
> index 12e804e..56594e4 100644
> --- a/include/linux/jump_label.h
> +++ b/include/linux/jump_label.h
> @@ -45,6 +45,8 @@ extern void jump_label_lock(void);
>  extern void jump_label_unlock(void);
>  extern void arch_jump_label_transform(struct jump_entry *entry,
>  				      enum jump_label_type type);
> +extern void arch_jump_label_transform_static(struct jump_entry *entry,
> +					     enum jump_label_type type);
>  extern int jump_label_text_reserved(void *start, void *end);
>  extern void jump_label_inc(struct jump_label_key *key);
>  extern void jump_label_dec(struct jump_label_key *key);
> diff --git a/kernel/jump_label.c b/kernel/jump_label.c
> index 059202d5..ff2028f 100644
> --- a/kernel/jump_label.c
> +++ b/kernel/jump_label.c
> @@ -104,6 +104,18 @@ static int __jump_label_text_reserved(struct jump_en=
try *iter_start,
>  	return 0;
>  }
> =20
> +/*=20
> + * Update code which is definitely not currently executing.
> + * Architectures which need heavyweight synchronization to modify
> + * running code can override this to make the non-live update case
> + * cheaper.
> + */
> +void __weak arch_jump_label_transform_static(struct jump_entry *entry,
> +					    enum jump_label_type type)
> +{
> +	arch_jump_label_transform(entry, type);=09
> +}
> +
>  static void __jump_label_update(struct jump_label_key *key,
>  				struct jump_entry *entry,
>  				struct jump_entry *stop, int enable)
> @@ -135,8 +147,8 @@ static __init int jump_label_init(void)
>  		struct jump_label_key *iterk;
> =20
>  		iterk =3D (struct jump_label_key *)(unsigned long)iter->key;
> -		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
> -					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
> +		arch_jump_label_transform_static(iter, jump_label_enabled(iterk) ?
> +						 JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
>  		if (iterk =3D=3D key)
>  			continue;
> =20
> @@ -208,7 +220,7 @@ void jump_label_apply_nops(struct module *mod)
>  		return;
> =20
>  	for (iter =3D iter_start; iter < iter_stop; iter++)
> -		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
> +		arch_jump_label_transform_static(iter, JUMP_LABEL_DISABLE);
>  }
> =20

So I got myself a little confused wrt the early jump_label_apply_nops()
call and the MODULE_COMING notifiers.

It looks to me like jump_label_apply_nops() is called way early and is
in fact called before _any_ of the module code has had a chance of
running. However it simply NOPs out all jump_labels.

The jump_label_add_module() thing, which is ran on the MODULE_COMING
callback will then set up stuff and do the proper patch-up.

Now the only bit of the module text that can be ran between those two
calls appears to be the module argument parsing stuff, but since
jump_labels are non-functional it can't rely on them, so why do we do
the early patch up again?



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:50:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:50:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIsN-0002Bf-Qe; Thu, 13 Oct 2011 03:50:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REIcn-00050z-71
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:34:54 -0700
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1318502089!22121855!1
X-Originating-IP: [209.85.220.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24333 invoked from network); 13 Oct 2011 10:34:50 -0000
Received: from mail-dy0-f43.google.com (HELO mail-dy0-f43.google.com)
	(209.85.220.43)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 10:34:50 -0000
Received: by dyj3 with SMTP id 3so71346dyj.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 03:34:49 -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:content-transfer-encoding;
	bh=iZl2OILZ2E2X15v0Go3/296SwHHw24a32xFMO5Qteyk=;
	b=T80ecX0BfouOnnKqttqM5Fvic+H7dsnATdmsdqen2ih3Ry2olk+bwqMom5o6Zjn1rM
	HGU0qP6D6IepqrOY4MojpQkh28nmsBmqZVQu/RU+qVDiOlt9BU5loAeRSEGVY4LEEjCb
	1hvcOV5YLh9E2XtPy/DQZ0T9QDlJEljy3B+hI=
MIME-Version: 1.0
Received: by 10.223.77.69 with SMTP id f5mr5359221fak.3.1318502089488; Thu, 13
	Oct 2011 03:34:49 -0700 (PDT)
Received: by 10.223.72.205 with HTTP; Thu, 13 Oct 2011 03:34:49 -0700 (PDT)
In-Reply-To: <1318427768.21903.718.camel@zakaz.uk.xensource.com>
References: <CAP2B85-UdKBazkis6Ga1QSX=PLfuk_LMLwh1RnQ2oMsi10wvHQ@mail.gmail.com>
	<1318414373.21903.637.camel@zakaz.uk.xensource.com>
	<CAP2B85_zhnY9DVmD3fWE7j2XkHgd8eKiryr8GSLLo8Bm8UHuTw@mail.gmail.com>
	<1318427768.21903.718.camel@zakaz.uk.xensource.com>
Date: Thu, 13 Oct 2011 19:34:49 +0900
Message-ID: <CAP2B8589fYo-gB_omV5yNKZc_YtK6oTpq06H0V0dCK6ShvrJYw@mail.gmail.com>
Subject: Re: [Xen-devel] Front-end back-end connection
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 Wed, Oct 12, 2011 at 10:56 PM, Ian Campbell <Ian.Campbell@citrix.com> wr=
ote:
> On Wed, 2011-10-12 at 13:02 +0100, Daniel Castro wrote:
>> On Wed, Oct 12, 2011 at 7:12 PM, Ian Campbell <Ian.Campbell@citrix.com> =
wrote:
>> > On Wed, 2011-10-12 at 08:13 +0100, Daniel Castro wrote:
>> >> Hello All,
>> >>
>> >> I am in the process of conecting my front-end to my back end.
>> >> The process is like this:
>> >> 1. Set up xenstore conection
>> >> 2. initiate front rings
>> >> 3. Initiate gran table
>> >> 4. Take my rings mfn address and set it up as a entry (more on this)
>> >> 5. create a unbound port for front-back ring communication (more on t=
his )
>> >> 5.1 I start by changing state to XenbusStateInitialising
>> >> 5.2 ring-ref entry (step 4)
>> >> 5.3 port entry (step 5)
>> >> 5.4 backend state is XenbusStateInitWait
>> >> 5.4 change state to XenbusStateInitialised
>> >> 5.5 back end state is XenbusStateClosing meaning there is an error or
>> >> something is missing.
>> >> 6. on sucess end
>> >>
>> >> More on step 4: I got my grant page table like this:
>> >> =A0 =A0 =A0 struct gnttab_setup_table gst;
>> >> =A0 =A0 =A0 grant_entries =3D (struct grant_entry_v1 *) memalign_high=
(4096, 4096);
>> >> //asume malloc
>> >> =A0 =A0 =A0 memset(grant_entries,0,4096);
>> >> =A0 =A0 =A0 gst.dom =3D DOMID_SELF; //&me
>> >> =A0 =A0 =A0 gst.nr_frames =3D 1; //a single page
>> >> =A0 =A0 =A0 //gst.frame_list =3D grant_entries; (I have no idea how t=
o handle this :P )
>> >> =A0 =A0 =A0 res =3D hypercall_grant_table_op(GNTTABOP_map_grant_ref, =
&gst, 1);
>> >> I think this works, but maybe I am wrong.
>> >
>> > I'm afraid you are.
>> >
>> > For one thing simply not initialising one of the fields in the argumen=
t
>> > structure is unlikely to be correct.
>> >
>> > Secondly the argument to GNTTABOP_map_grant_ref is a pointer to "struc=
t
>> > gnttab_map_grant_ref" not "struct gnttab_setup_table", likewise "struc=
t
>> > gnttab_setup_table" goes with GNTTABOP_setup_table. I think this shoul=
d
>> > be pretty clear from the way the GNTTABOP_* and struct definitions are
>> > laid out in xen/include/public/grant_table.h and the naming convention
>> > what goes with what. There are also comments in that header describing
>> > each operation.
>> >
>> > If you are trying to setup the grant table itself then
>> > GNTTABOP_setup_table is what you want. GNTTABOP_map_grant_ref is used
>> > for mapping a grant reference which you have been given by another
>> > domain.
>> >
>> > drivers/xen/grant-table.c:gnttab_map should provide a rough idea how
>> > this needs to be done. Because this is an HVM domain you need to do a
>> > XENMEM_add_to_physmap of XENMAPSPACE_grant_table before you do the
>> > GNTTABOP_setup_table.
>>
>> Fixed. Yet, how can I confirm that the grant table was correctly
>> mapped? The hypercall returned 0 and the status in the struct is also
>> 0.
>> After the mapping I am printing this:
>> allocated grant_entries at 12 bytes at 0x0f7fc000, gpfn 0xf7fc
>> GNTTABOP_setup_table return 0 status:0
>> allocated shared info 2584 bytes at 0x0f7fa000, gpfn 0xf7fa
>
> Did you also call XENMEM_add_to_physmap somewhere?
Its working now after the changes, and also I noticed that back-end
does not read  key "port", instead read "event-channel" so I left both
in case.

For completeness and future references to the list here is my code:
static struct grant_entry_v1 *grant_entries =3D NULL;
    struct xen_add_to_physmap xatp;
    if(grant_entries!=3DNULL)
		return grant_entries;
    xatp.domid =3D DOMID_SELF;
    xatp.space =3D XENMAPSPACE_grant_table;
    xatp.idx   =3D 0;
    grant_entries =3D (struct grant_entry_v1 *) memalign_high(PAGE_SIZE,
PAGE_SIZE);
    memset(grant_entries, 0, PAGE_SIZE);
    xatp.gpfn  =3D ((unsigned long)grant_entries >> PAGE_SHIFT);
    dprintf(1, "allocated grant_entries at %d bytes at %p, gpfn
0x%lx\n",sizeof(*grant_entries), grant_entries, xatp.gpfn);
    if (hypercall_memory_op(XENMEM_add_to_physmap, &xatp) !=3D 0)
    	panic("MAP grant_entries info page fail");
    return grant_entries;

struct gnttab_setup_table gst;
	grant_entries =3D (struct grant_entry_v1 *) get_grant_table();
	gst.dom =3D DOMID_SELF;
	gst.nr_frames =3D 1;
	//gst.frame_list =3D (struct grant_entry_v1 *) grant_entries;
	res =3D hypercall_grant_table_op(GNTTABOP_setup_table, &gst, 1);
	if(res!=3D0){
		dprintf(1,"Error Mapping Grant Table... Abort...\n");
		panic("Map Grant Table Failed\n");
	}
	dprintf(1,"GNTTABOP_setup_table return %d status:%d\n",res,gst.status);

After this two pieces of code I create the grant entry for the rings
as previously discussed.
Must fill in device details from xenstore, and, now that the back and
front connect I have to handle requests, read and write.

I guess is a matter of copy from buffer to ring, and from ring to buffer...

>
> I'm afraid these messages are pretty meaningless without the
> corresponding code, but you should certainly have already setup the
> table before you start allocating grant_entries in it (or more
> importantly writing to them). These messages suggest that is not the
> case?
>
>> I also found that the port I get from the EVTCHNOP_alloc_unbound is 4,
>> but lsevtchn gets me this:
>> =A0 42: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 2
>> =A0 43: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 3
>> =A0 44: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 1
>> Port 4 is not listed, is it because it is not connected yet?
>
> If this is lsevtchn for dom0 then most likely yes. You should be able to
> see the guest's state with lsevtchn <domid>.
>
> In the backend the evtchn gets bound after the frontend's shared ring is
> mapped so the fact that the evtchn didn't get bound suggests an error
> before that point.
>
>> I get no errors in xl dmesg, and in dmesg I get:
>> vbd vbd-5-768: 2 reading /local/domain/5/device/vbd/768/ring-ref and
>> event-channel
>
> Do you see anything else in xenstore?
>
>> I guess there are the keys I write in the front-end, so they are being r=
ead.
>>
>> Thanks for the help, I feel we are getting closer to the other side...
>>
>> Daniel
>>
>> >
>> >> =A0This is needed on step 5, so..
>> >> More on step 5:
>> >> I consider the grant table an array of type struct grant_entry_v1.
>> >> So I simply do grant_entry_v1[0] for my first grant entry, and so
>> >> forth. For this case I read on the list some time ago that entry 0 di=
d
>> >> not work, so I work with entry 1, like this:
>> >> grant_entries[aval_grant].domid =3D ext_domid;
>> >> grant_entries[aval_grant].frame =3D _frame; where frame is: (u32)srin=
g
>> >> >> PAGE_SHIFT //meaning mfn of my rings.
>> >> grant_entries[aval_grant].flags =3D GTF_permit_access;
>> >
>> > This looks approximately correct _if_ you were actually writing to som=
e
>> > memory which was your grant table but due to the above I think you are
>> > not.
>> >
>> >> These last two steps I described may be wrong... I know this because
>> >> the backend state is not XenbusStateConnected.
>> >
>> > That fact alone can't tell you much other than _something_ went wrong.
>> >
>> > Since the backend will have transitioned to XenbusStateClosing by
>> > calling xenbus_dev_fatal() it will have written some error information
>> > to xenstore and the dom0 console which should hint at what actually we=
nt
>> > wrong. I expect you will see the message "mapping ring-ref %lu port %u=
"
>> > because xen_blkif_map will have failed during map_frontend_page().
>> >
>> >> I think my mistake is on step 5, so can someone please shed some ligh=
t
>> >> on this small issue.
>> >>
>> >> And thank you very much for taking the time to read.
>> >>
>> >> 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 Thu Oct 13 03:51:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03: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 1REItB-0002Zb-PS; Thu, 13 Oct 2011 03:51:50 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REIf4-0005ij-IO
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:37:14 -0700
X-Env-Sender: peterz@infradead.org
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318502231!848734!1
X-Originating-IP: [85.118.1.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27406 invoked from network); 13 Oct 2011 10:37:11 -0000
Received: from casper.infradead.org (HELO casper.infradead.org) (85.118.1.10)
	by server-13.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 10:37:11 -0000
Received: from j77219.upc-j.chello.nl ([24.132.77.219] helo=twins)
	by casper.infradead.org with esmtpsa (Exim 4.76 #1 (Red Hat Linux))
	id 1REIel-000406-Vi; Thu, 13 Oct 2011 10:36:56 +0000
Received: by twins (Postfix, from userid 1000)
	id 94E498178F96; Thu, 13 Oct 2011 12:36:51 +0200 (CEST)
From: Peter Zijlstra <peterz@infradead.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Thu, 13 Oct 2011 12:36:51 +0200
In-Reply-To: <d438943704881d46c8f73318d2b1705a5e2809d7.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<d438943704881d46c8f73318d2b1705a5e2809d7.1318464413.git.jeremy.fitzhardinge@citrix.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Mailer: Evolution 3.0.3- 
Message-ID: <1318502211.24856.6.camel@twins>
Mime-Version: 1.0
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>, Michael,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, "H. Peter
	Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 08/10] x86/jump_label: add
 arch_jump_label_transform_static()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-12 at 17:08 -0700, Jeremy Fitzhardinge wrote:
> +       __jump_label_transform(entry, type, text_poke_early);

Ah, a new text_poke_early() user, ignore my earlier comment on it.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:52:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:52:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIuC-00034J-PY; Thu, 13 Oct 2011 03:52:52 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REIm3-0008AS-JG
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:44:28 -0700
X-Env-Sender: peterz@infradead.org
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318502663!19341888!1
X-Originating-IP: [205.233.59.134]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6515 invoked from network); 13 Oct 2011 10:44:24 -0000
Received: from merlin.infradead.org (HELO merlin.infradead.org)
	(205.233.59.134)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 10:44:24 -0000
Received: from canuck.infradead.org ([2001:4978:20e::1])
	by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux))
	id 1REIlW-0004Ey-2g; Thu, 13 Oct 2011 10:43:54 +0000
Received: from j77219.upc-j.chello.nl ([24.132.77.219] helo=twins)
	by canuck.infradead.org with esmtpsa (Exim 4.76 #1 (Red Hat Linux))
	id 1REIlV-0000GP-BL; Thu, 13 Oct 2011 10:43:53 +0000
Received: by twins (Postfix, from userid 1000)
	id 481F781797DB; Thu, 13 Oct 2011 12:43:48 +0200 (CEST)
From: Peter Zijlstra <peterz@infradead.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Thu, 13 Oct 2011 12:43:48 +0200
In-Reply-To: <c133180533d7e520bb1e818e987117811a666fbc.1318464413.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<c133180533d7e520bb1e818e987117811a666fbc.1318464413.git.jeremy.fitzhardinge@citrix.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Mailer: Evolution 3.0.3- 
Message-ID: <1318502628.24856.10.camel@twins>
Mime-Version: 1.0
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>, Michael,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, "H. Peter
	Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 10/10] jump-label: initialize
 jump-label subsystem much 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-10-12 at 17:08 -0700, Jeremy Fitzhardinge wrote:
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>=20
> Initialize jump_labels much earlier, we can use them.

We can use them, where? how? what?, that sentence just begs for more.

> diff --git a/init/main.c b/init/main.c
> index 2a9b88a..f4094ed 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -637,6 +637,7 @@ asmlinkage void __init start_kernel(void)
>  	acpi_early_init(); /* before LAPIC and SMP init */
>  	sfi_init_late();
> =20
> +	jump_label_init();
>  	ftrace_init();
> =20
>  	/* Do the rest non-__init'ed, we're now alive */

Can we push them much earlier still? If possible I'd like them to be
before sched_init() so that I might use them there, if not possible, at
the very least before enabling interrupts would be nice.



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:53:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:53:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIv0-0003SX-Mv; Thu, 13 Oct 2011 03:53:42 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REImF-0008DV-P3
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:44:40 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318502652!53030414!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6464 invoked from network); 13 Oct 2011 10:44:12 -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;
	13 Oct 2011 10:44:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315180800"; 
   d="scan'208";a="8366595"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 10:44:35 +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, 13 Oct 2011 11:44:35 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Thu, 13 Oct 2011 11:44:35 +0100
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318502675.21903.820.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Subject: [Xen-devel] libxl stable API work left (Was: Re: [PATCH 00 of 27
 v2] libxl: rationalise libxl_device_* APIs)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-13 at 10:53 +0100, Ian Campbell wrote:
> Along the way I filed some rough edges of the internal implementation
> of this stuff but my primary concern is to make the public facing API
> one that we can commit to keeping stable.

Speaking of which, my laundry list for things which need to happen to
libxl's API to make it stable contains:
      * The stuff this series addresses
      * Fixup the event API (IanJ)
      * Block script support (IanJ?)
      * The topologyinfo datastructure should be a list of tuples, not a
        tuple of lists.

I've also got:
        I've also been wondering what can/should be done about the split
        between libxl_domain_create_info, libxl_domain_build_info and
        libxl_device_model_info now that they are all bundled together
        in libxl_domain_config and not exposed directly in the API
        (since the related functions became internal, that was before
        4.1). It seems like there ought to be scope for collapsing those
        datastructures somewhat but I'm not sure how yet.
        
But I think this conflicts with the need to do certain bits
asynchronously (primarily for script calling support on create) which I
expect will necessitate splitting libxl_domain_create up again.

If you are (or are going to be) a consumer of the libxl API you would be
well advised to have a read through libxl.h and make sure you are happy
with the rest of it.

Ian.


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:55:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:55:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIwX-0003sY-1s; Thu, 13 Oct 2011 03:55:17 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REIoW-0000aD-CI
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:47:01 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-13.tower-182.messagelabs.com!1318502817!21993351!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11835 invoked from network); 13 Oct 2011 10:46: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; 13 Oct 2011 10:46:57 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1REIoQ-000C7c-Gj; Thu, 13 Oct 2011 10:46:54 +0000
Date: Thu, 13 Oct 2011 11:46:54 +0100
From: Tim Deegan <tim@xen.org>
To: "Christopher S. Aker" <caker@theshore.net>
Subject: Re: [Xen-devel] Xen 4 occasionally hangs during boot
Message-ID: <20111013104654.GB44937@ocelot.phlegethon.org>
References: <4E95EBD6.7010400@theshore.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4E95EBD6.7010400@theshore.net>
User-Agent: Mutt/1.4.2.1i
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

At 15:34 -0400 on 12 Oct (1318433686), Christopher S. Aker wrote:
> Since I started playing with Xen 4 (vs 3.x), machines often hang during 
> reboot at exactly the same place:
> 
> 	(XEN) HVM: Hardware Assisted Paging detected.
> 	(
> 
> ... and then nothing.  I have to RPC bounce them.  On some occasions it 
> takes four or five attempts to get beyond this point.  A normal boot 
> looks like this:
> 
> 	(XEN) HVM: Hardware Assisted Paging detected.
> 	(XEN) Brought up 16 CPUs

:(  If you add "cpuinfo" to the xen commend-line arguments does it print
anything more useful?

Tim.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 03:56:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:56:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIxr-0004Gw-3s; Thu, 13 Oct 2011 03:56:39 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REIql-0001V4-RE
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:49:20 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318502956!849519!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15096 invoked from network); 13 Oct 2011 10:49:16 -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;
	13 Oct 2011 10:49:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315180800"; 
   d="scan'208";a="8366744"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 10:49:16 +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, 13 Oct 2011 11:49:16 +0100
Subject: Re: [Xen-devel] [PATCH] build: error out on non-absolute $(XEN_ROOT)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Keir Fraser <keir@xen.org>
Date: Thu, 13 Oct 2011 11:49:16 +0100
In-Reply-To: <CABC7665.32797%keir@xen.org>
References: <CABC7665.32797%keir@xen.org>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318502956.21903.823.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-10-13 at 11:05 +0100, Keir Fraser wrote:
> On 13/10/2011 10:46, "Ian Campbell" <ian.campbell@citrix.com> wrote:
> 
> > # HG changeset patch
> > # User Ian Campbell <ian.campbell@citrix.com>
> > # Date 1318499065 -3600
> > # Node ID 82b2eeea91d059dd79cf7621d487a0cf7d29933e
> > # Parent  e5cc23098360f3ff137da9b128b02114468c5654
> > build: error out on non-absolute $(XEN_ROOT)
> 
> Notice something about the surrounding context of this diff? ;-)

Ah yes, I even wondered about it cause I thought I'd seen it go in.

> 
>  -- Keir
> 
> > Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> > 
> > diff -r e5cc23098360 -r 82b2eeea91d0 Config.mk
> > --- a/Config.mk Thu Oct 13 10:44:03 2011 +0100
> > +++ b/Config.mk Thu Oct 13 10:44:25 2011 +0100
> > @@ -4,6 +4,10 @@ ifeq ($(filter /%,$(XEN_ROOT)),)
> >  $(error XEN_ROOT must be absolute)
> >  endif
> >  
> > +ifeq ($(filter /%,$(XEN_ROOT)),)
> > +$(error XEN_ROOT must be absolute)
> > +endif
> > +
> >  -include $(XEN_ROOT)/.config
> >  
> >  # A debug build of Xen and tools?
> > 
> > _______________________________________________
> > 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 Oct 13 03:58:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 03:58:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REIzT-0004mI-AW; Thu, 13 Oct 2011 03:58:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REIvp-0003gH-Oz
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:54:34 -0700
X-Env-Sender: peterz@infradead.org
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318503270!858142!1
X-Originating-IP: [85.118.1.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11480 invoked from network); 13 Oct 2011 10:54:30 -0000
Received: from casper.infradead.org (HELO casper.infradead.org) (85.118.1.10)
	by server-14.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 10:54:30 -0000
Received: from j77219.upc-j.chello.nl ([24.132.77.219] helo=twins)
	by casper.infradead.org with esmtpsa (Exim 4.76 #1 (Red Hat Linux))
	id 1REIvR-0004JU-Ig; Thu, 13 Oct 2011 10:54:09 +0000
Received: by twins (Postfix, from userid 1000)
	id 2E49981797DB; Thu, 13 Oct 2011 12:54:05 +0200 (CEST)
From: Peter Zijlstra <peterz@infradead.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Thu, 13 Oct 2011 12:54:05 +0200
In-Reply-To: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Mailer: Evolution 3.0.3- 
Message-ID: <1318503245.24856.12.camel@twins>
Mime-Version: 1.0
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Nick Piggin <npiggin@kernel.dk>, KVM <kvm@vger.kernel.org>,
	maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>, the
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-12 at 17:51 -0700, Jeremy Fitzhardinge wrote:
>=20
> This is is all unnecessary complication if you're not using PV ticket
> locks, it also uses the jump-label machinery to use the standard
> "add"-based unlock in the non-PV case.
>=20
>         if (TICKET_SLOWPATH_FLAG &&
>             unlikely(static_branch(&paravirt_ticketlocks_enabled))) {
>                 arch_spinlock_t prev;
>=20
>                 prev =3D *lock;
>                 add_smp(&lock->tickets.head, TICKET_LOCK_INC);
>=20
>                 /* add_smp() is a full mb() */
>=20
>                 if (unlikely(lock->tickets.tail & TICKET_SLOWPATH_FLAG))
>                         __ticket_unlock_slowpath(lock, prev);
>         } else
>                 __add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_P=
REFIX);=20

Not that I mind the jump_label usage, but didn't paravirt have an
existing alternative() thingy to do things like this? Or is the
alternative() stuff not flexible enough to express this?

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 04:01:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:01:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJ2w-0005GJ-7Z; Thu, 13 Oct 2011 04:01:54 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REIzH-0004hS-3c
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:58:07 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318503483!851264!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16637 invoked from network); 13 Oct 2011 10:58:04 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 10:58:04 -0000
Received: by eyb6 with SMTP id 6so2567599eyb.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 03:58:03 -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=65lpkMDxwk466GOqb4bfZb0/ViLVB6BpDrhb22l56kU=;
	b=Zc+CmvcSLYHmfK/N7JeXGve464BFFl18VdHZdMORIqLnOa6wlAagPXkk18XwisLSQR
	fQ/SiyiEYkyA1eKTI8MEnl/TTNSFAQ2Es5DHbaTOMFGtRlGTWpJgg2sACQzhIFXrEffe
	w0oSTt48s1tlxVSAYfBAG1ziHwmWN7eOvsgo4=
Received: by 10.216.132.136 with SMTP id o8mr3885175wei.84.1318503483690;
	Thu, 13 Oct 2011 03:58:03 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id k26sm5245504wbo.16.2011.10.13.03.58.02
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 03:58:03 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 11:57:59 +0100
Subject: Re: [Xen-devel] credit2 data structures
From: Keir Fraser <keir@xen.org>
To: George Dunlap <George.Dunlap@eu.citrix.com>,
	Jan Beulich <JBeulich@suse.com>
Message-ID: <CABC82C7.329CD%keir@xen.org>
Thread-Topic: [Xen-devel] credit2 data structures
Thread-Index: AcyJlvhAVIszOCaKiUSjtTZQz3MHjw==
In-Reply-To: <CAFLBxZaHwav97=PVvZDTKzBVaeGc9FYh4xs9mj3cC=WbEzTZtw@mail.gmail.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 13/10/2011 11:11, "George Dunlap" <George.Dunlap@eu.citrix.com> wrote:

> For one thing, the number of runqueues in credit2 is actually meant to
> be smaller than the number of logical cpus -- it's meant to be one per
> L2 cache, which should have between 2 and 8 logical cpus, depending on
> the architecture.  I just put NR_CPUS because it was easier to get
> working.  Making that an array of pointers, which is allocated on an
> as-needed basis, should reduce that requirement a great deal.

That would suffice. If we can put per-cpu stuff in the per_cpu() data area
then even better. The fact that credit2 burns a couple of kB per CPU isn't a
problem at all, as long as it does it only for active CPUs.

 -- Keir



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 04:07:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:07:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJ8S-0005md-Iz; Thu, 13 Oct 2011 04:07:36 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJ5C-0005X2-OQ
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:04:40 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318503850!35138326!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20794 invoked from network); 13 Oct 2011 11:04:11 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 11:04:11 -0000
Received: by wyh13 with SMTP id 13so2077144wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 04:04:10 -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:user-agent:date:from:to:cc;
	bh=Z5aZaktU44Mg/JkcnNyqnkFpNnDvjB8eUJYYmmg6Nso=;
	b=sB8XTi7fRV7fneCP7qR2lj7SvPXTU5IJWU3xWGjTC9oMTyayTPPYbovnyntDs3WlwA
	PpdRIOIF6nJQuu9XfPWTNj0AzWOgMd0dsFScNe1FsA5inj9pQTX45NHAvOGMzgA7B9pg
	lvTp1e7ei5V6/203ac5+pru8dStkvnEuViRg8=
Received: by 10.216.132.9 with SMTP id n9mr3928248wei.22.1318503849563;
	Thu, 13 Oct 2011 04:04:09 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id a12sm5304512wbo.9.2011.10.13.04.04.07
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 13 Oct 2011 04:04:08 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 72ef13cb4609c97a26efd4931e65c9798fe22572
Message-Id: <72ef13cb4609c97a26ef.1318503856@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Thu, 13 Oct 2011 13:04:16 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH v2] libxl: reimplement buffer for bootloading
 and drop data if buffer 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 Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1318503503 -7200
# Node ID 72ef13cb4609c97a26efd4931e65c9798fe22572
# Parent  64f17c7e6c33e5f1c22711ae9cbdcbe191c20062
libxl: reimplement buffer for bootloading and drop data if buffer is full.

Implement a buffer for the bootloading process that appends data to the end until it's full. Drop output from bootloader if a timeout has occurred and the buffer is full. Prevents the bootloader from getting stuck when using ptys with small buffers.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 64f17c7e6c33 -r 72ef13cb4609 tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Tue Oct 11 10:26:32 2011 +0200
+++ b/tools/libxl/libxl_bootloader.c	Thu Oct 13 12:58:23 2011 +0200
@@ -21,6 +21,7 @@
 
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/ioctl.h>
 
 #include "libxl.h"
 #include "libxl_internal.h"
@@ -28,7 +29,8 @@
 #include "flexarray.h"
 
 #define XENCONSOLED_BUF_SIZE 16
-#define BOOTLOADER_BUF_SIZE 1024
+#define BOOTLOADER_BUF_SIZE 4096
+#define BOOTLOADER_TIMEOUT 1
 
 static char **make_bootloader_args(libxl__gc *gc,
                                    libxl_domain_build_info *info,
@@ -165,10 +167,11 @@ static pid_t fork_exec_bootloader(int *m
  */
 static char * bootloader_interact(libxl__gc *gc, int xenconsoled_fd, int bootloader_fd, int fifo_fd)
 {
-    int ret;
+    int ret, read_ahead, timeout;
 
     size_t nr_out = 0, size_out = 0;
     char *output = NULL;
+    struct timeval wait;
 
     /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
     int xenconsoled_prod = 0, xenconsoled_cons = 0;
@@ -181,39 +184,64 @@ static char * bootloader_interact(libxl_
         fd_set wsel, rsel;
         int nfds;
 
+        /* Set timeout to 1s before starting to discard data */
+        wait.tv_sec = BOOTLOADER_TIMEOUT;
+        wait.tv_usec = 0;
+
         if (xenconsoled_prod == xenconsoled_cons)
             xenconsoled_prod = xenconsoled_cons = 0;
         if (bootloader_prod == bootloader_cons)
             bootloader_prod = bootloader_cons = 0;
+        /* Move buffers around to drop already consumed data */
+        if (xenconsoled_cons > 0) {
+            xenconsoled_prod -= xenconsoled_cons;
+            memmove(xenconsoled_buf, &xenconsoled_buf[xenconsoled_cons], xenconsoled_prod);
+            xenconsoled_cons = 0;
+        }
+        if (bootloader_cons > 0) {
+            bootloader_prod -= bootloader_cons;
+            memmove(bootloader_buf, &bootloader_buf[bootloader_cons], bootloader_prod);
+            bootloader_cons = 0;
+        }
 
         FD_ZERO(&rsel);
         FD_SET(fifo_fd, &rsel);
         nfds = fifo_fd + 1;
-        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0)) {
+        if (xenconsoled_prod < XENCONSOLED_BUF_SIZE) {
             FD_SET(xenconsoled_fd, &rsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
         }
-        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0)) {
+        if (bootloader_prod < BOOTLOADER_BUF_SIZE) {
             FD_SET(bootloader_fd, &rsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
         FD_ZERO(&wsel);
-        if (bootloader_prod != bootloader_cons) {
+        if (bootloader_prod > 0) {
             FD_SET(xenconsoled_fd, &wsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
         }
-        if (xenconsoled_prod != xenconsoled_cons) {
+        if (xenconsoled_prod > 0) {
             FD_SET(bootloader_fd, &wsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
-        ret = select(nfds, &rsel, &wsel, NULL, NULL);
+        ret = select(nfds, &rsel, &wsel, NULL, &wait);
         if (ret < 0)
             goto out_err;
+        timeout = ret == 0 ? 1 : 0;
 
         /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
-        if (FD_ISSET(xenconsoled_fd, &rsel)) {
+        if (FD_ISSET(xenconsoled_fd, &rsel) || timeout) {
+            if (xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
+                if (ioctl(xenconsoled_fd, FIONREAD, &read_ahead) < 0)
+                    goto out_err;
+                if (read_ahead >= XENCONSOLED_BUF_SIZE) /* The whole buffer will be overwritten */
+                    read_ahead = XENCONSOLED_BUF_SIZE;
+                else
+                    memmove(xenconsoled_buf, &xenconsoled_buf[read_ahead], XENCONSOLED_BUF_SIZE - read_ahead);
+                xenconsoled_prod -= read_ahead;
+            }
             ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;
@@ -229,7 +257,16 @@ static char * bootloader_interact(libxl_
         }
 
         /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
-        if (FD_ISSET(bootloader_fd, &rsel)) {
+        if (FD_ISSET(bootloader_fd, &rsel) || timeout) {
+            if (bootloader_prod == BOOTLOADER_BUF_SIZE) {
+                if (ioctl(bootloader_fd, FIONREAD, &read_ahead) < 0)
+                    goto out_err;
+                if (read_ahead >= BOOTLOADER_BUF_SIZE) /* The whole buffer will be overwritten */
+                    read_ahead = BOOTLOADER_BUF_SIZE;
+                else
+                    memmove(bootloader_buf, &bootloader_buf[read_ahead], BOOTLOADER_BUF_SIZE - read_ahead);
+                bootloader_prod -= read_ahead;
+            }
             ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 04:11:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:11:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJCd-0006HK-O5; Thu, 13 Oct 2011 04:11:55 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJ9h-00061m-SQ
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:09:00 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1318504130!854563!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23551 invoked from network); 13 Oct 2011 11:08:50 -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;
	13 Oct 2011 11:08:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,339,1315180800"; 
   d="scan'208";a="8367333"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 11:08:50 +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, 13 Oct 2011 12:08:50 +0100
Subject: Re: [Xen-devel] Front-end back-end connection
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
Date: Thu, 13 Oct 2011 12:08:50 +0100
In-Reply-To: <CAP2B8589fYo-gB_omV5yNKZc_YtK6oTpq06H0V0dCK6ShvrJYw@mail.gmail.com>
References: <CAP2B85-UdKBazkis6Ga1QSX=PLfuk_LMLwh1RnQ2oMsi10wvHQ@mail.gmail.com>
	<1318414373.21903.637.camel@zakaz.uk.xensource.com>
	<CAP2B85_zhnY9DVmD3fWE7j2XkHgd8eKiryr8GSLLo8Bm8UHuTw@mail.gmail.com>
	<1318427768.21903.718.camel@zakaz.uk.xensource.com>
	<CAP2B8589fYo-gB_omV5yNKZc_YtK6oTpq06H0V0dCK6ShvrJYw@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: <1318504130.21903.826.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-10-13 at 11:34 +0100, Daniel Castro wrote:
> On Wed, Oct 12, 2011 at 10:56 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Wed, 2011-10-12 at 13:02 +0100, Daniel Castro wrote:
> >> On Wed, Oct 12, 2011 at 7:12 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> >> > On Wed, 2011-10-12 at 08:13 +0100, Daniel Castro wrote:
> >> >> Hello All,
> >> >>
> >> >> I am in the process of conecting my front-end to my back end.
> >> >> The process is like this:
> >> >> 1. Set up xenstore conection
> >> >> 2. initiate front rings
> >> >> 3. Initiate gran table
> >> >> 4. Take my rings mfn address and set it up as a entry (more on this)
> >> >> 5. create a unbound port for front-back ring communication (more on this )
> >> >> 5.1 I start by changing state to XenbusStateInitialising
> >> >> 5.2 ring-ref entry (step 4)
> >> >> 5.3 port entry (step 5)
> >> >> 5.4 backend state is XenbusStateInitWait
> >> >> 5.4 change state to XenbusStateInitialised
> >> >> 5.5 back end state is XenbusStateClosing meaning there is an error or
> >> >> something is missing.
> >> >> 6. on sucess end
> >> >>
> >> >> More on step 4: I got my grant page table like this:
> >> >>       struct gnttab_setup_table gst;
> >> >>       grant_entries = (struct grant_entry_v1 *) memalign_high(4096, 4096);
> >> >> //asume malloc
> >> >>       memset(grant_entries,0,4096);
> >> >>       gst.dom = DOMID_SELF; //&me
> >> >>       gst.nr_frames = 1; //a single page
> >> >>       //gst.frame_list = grant_entries; (I have no idea how to handle this :P )
> >> >>       res = hypercall_grant_table_op(GNTTABOP_map_grant_ref, &gst, 1);
> >> >> I think this works, but maybe I am wrong.
> >> >
> >> > I'm afraid you are.
> >> >
> >> > For one thing simply not initialising one of the fields in the argument
> >> > structure is unlikely to be correct.
> >> >
> >> > Secondly the argument to GNTTABOP_map_grant_ref is a pointer to "struct
> >> > gnttab_map_grant_ref" not "struct gnttab_setup_table", likewise "struct
> >> > gnttab_setup_table" goes with GNTTABOP_setup_table. I think this should
> >> > be pretty clear from the way the GNTTABOP_* and struct definitions are
> >> > laid out in xen/include/public/grant_table.h and the naming convention
> >> > what goes with what. There are also comments in that header describing
> >> > each operation.
> >> >
> >> > If you are trying to setup the grant table itself then
> >> > GNTTABOP_setup_table is what you want. GNTTABOP_map_grant_ref is used
> >> > for mapping a grant reference which you have been given by another
> >> > domain.
> >> >
> >> > drivers/xen/grant-table.c:gnttab_map should provide a rough idea how
> >> > this needs to be done. Because this is an HVM domain you need to do a
> >> > XENMEM_add_to_physmap of XENMAPSPACE_grant_table before you do the
> >> > GNTTABOP_setup_table.
> >>
> >> Fixed. Yet, how can I confirm that the grant table was correctly
> >> mapped? The hypercall returned 0 and the status in the struct is also
> >> 0.
> >> After the mapping I am printing this:
> >> allocated grant_entries at 12 bytes at 0x0f7fc000, gpfn 0xf7fc
> >> GNTTABOP_setup_table return 0 status:0
> >> allocated shared info 2584 bytes at 0x0f7fa000, gpfn 0xf7fa
> >
> > Did you also call XENMEM_add_to_physmap somewhere?
> Its working now after the changes, and also I noticed that back-end
> does not read  key "port", instead read "event-channel" so I left both
> in case.

You only need to fill in the one which the backend reads. That is
"event-channel". 

> For completeness and future references to the list here is my code:
> static struct grant_entry_v1 *grant_entries = NULL;
>     struct xen_add_to_physmap xatp;
>     if(grant_entries!=NULL)
> 		return grant_entries;
>     xatp.domid = DOMID_SELF;
>     xatp.space = XENMAPSPACE_grant_table;
>     xatp.idx   = 0;
>     grant_entries = (struct grant_entry_v1 *) memalign_high(PAGE_SIZE,
> PAGE_SIZE);
>     memset(grant_entries, 0, PAGE_SIZE);
>     xatp.gpfn  = ((unsigned long)grant_entries >> PAGE_SHIFT);
>     dprintf(1, "allocated grant_entries at %d bytes at %p, gpfn
> 0x%lx\n",sizeof(*grant_entries), grant_entries, xatp.gpfn);
>     if (hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0)
>     	panic("MAP grant_entries info page fail");
>     return grant_entries;
> 
> struct gnttab_setup_table gst;
> 	grant_entries = (struct grant_entry_v1 *) get_grant_table();
> 	gst.dom = DOMID_SELF;
> 	gst.nr_frames = 1;
> 	//gst.frame_list = (struct grant_entry_v1 *) grant_entries;

This isn't needed? That would surprise me...

> 	res = hypercall_grant_table_op(GNTTABOP_setup_table, &gst, 1);
> 	if(res!=0){
> 		dprintf(1,"Error Mapping Grant Table... Abort...\n");
> 		panic("Map Grant Table Failed\n");
> 	}
> 	dprintf(1,"GNTTABOP_setup_table return %d status:%d\n",res,gst.status);
> 
> After this two pieces of code I create the grant entry for the rings
> as previously discussed.
> Must fill in device details from xenstore, and, now that the back and
> front connect I have to handle requests, read and write.
> 
> I guess is a matter of copy from buffer to ring, and from ring to buffer...

The block protocol involves granting the buffer and putting the ref on
the ring, not putting data inline in the ring.

However for simplicity I would suggest granting a static buffer to the
backend and copying from the SeaBIOS buffer to that.

> 
> >
> > I'm afraid these messages are pretty meaningless without the
> > corresponding code, but you should certainly have already setup the
> > table before you start allocating grant_entries in it (or more
> > importantly writing to them). These messages suggest that is not the
> > case?
> >
> >> I also found that the port I get from the EVTCHNOP_alloc_unbound is 4,
> >> but lsevtchn gets me this:
> >>   42: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 2
> >>   43: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 3
> >>   44: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 1
> >> Port 4 is not listed, is it because it is not connected yet?
> >
> > If this is lsevtchn for dom0 then most likely yes. You should be able to
> > see the guest's state with lsevtchn <domid>.
> >
> > In the backend the evtchn gets bound after the frontend's shared ring is
> > mapped so the fact that the evtchn didn't get bound suggests an error
> > before that point.
> >
> >> I get no errors in xl dmesg, and in dmesg I get:
> >> vbd vbd-5-768: 2 reading /local/domain/5/device/vbd/768/ring-ref and
> >> event-channel
> >
> > Do you see anything else in xenstore?
> >
> >> I guess there are the keys I write in the front-end, so they are being read.
> >>
> >> Thanks for the help, I feel we are getting closer to the other side...
> >>
> >> Daniel
> >>
> >> >
> >> >>  This is needed on step 5, so..
> >> >> More on step 5:
> >> >> I consider the grant table an array of type struct grant_entry_v1.
> >> >> So I simply do grant_entry_v1[0] for my first grant entry, and so
> >> >> forth. For this case I read on the list some time ago that entry 0 did
> >> >> not work, so I work with entry 1, like this:
> >> >> grant_entries[aval_grant].domid = ext_domid;
> >> >> grant_entries[aval_grant].frame = _frame; where frame is: (u32)sring
> >> >> >> PAGE_SHIFT //meaning mfn of my rings.
> >> >> grant_entries[aval_grant].flags = GTF_permit_access;
> >> >
> >> > This looks approximately correct _if_ you were actually writing to some
> >> > memory which was your grant table but due to the above I think you are
> >> > not.
> >> >
> >> >> These last two steps I described may be wrong... I know this because
> >> >> the backend state is not XenbusStateConnected.
> >> >
> >> > That fact alone can't tell you much other than _something_ went wrong.
> >> >
> >> > Since the backend will have transitioned to XenbusStateClosing by
> >> > calling xenbus_dev_fatal() it will have written some error information
> >> > to xenstore and the dom0 console which should hint at what actually went
> >> > wrong. I expect you will see the message "mapping ring-ref %lu port %u"
> >> > because xen_blkif_map will have failed during map_frontend_page().
> >> >
> >> >> I think my mistake is on step 5, so can someone please shed some light
> >> >> on this small issue.
> >> >>
> >> >> And thank you very much for taking the time to read.
> >> >>
> >> >> Daniel
> >> >>
> >> >
> >> >
> >> >
> >>
> >>
> >>
> >
> >
> >
> 
> 
> 



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 04:23:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:23:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJNu-0006z8-P0; Thu, 13 Oct 2011 04:23:34 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJN6-0006ks-Fw
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:22:44 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-11.tower-174.messagelabs.com!1318504961!35105609!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21635 invoked from network); 13 Oct 2011 11:22:41 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 11:22:41 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1REJN2-000CFD-4I; Thu, 13 Oct 2011 11:22:40 +0000
Date: Thu, 13 Oct 2011 12:22:40 +0100
From: Tim Deegan <tim@xen.org>
To: Christoph Egger <Christoph.Egger@amd.com>
Subject: Re: [Xen-devel] [PATCH] nestedsvm: fix HSAVE_PA MSR
Message-ID: <20111013112240.GC44937@ocelot.phlegethon.org>
References: <4E944B4D.3060704@amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4E944B4D.3060704@amd.com>
User-Agent: Mutt/1.4.2.1i
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

At 15:57 +0200 on 11 Oct (1318348653), Christoph Egger wrote:
> Accessing HSAVE_PA MSR does not require SVM to be enabled nor any
> special guest paging mode.
> But accessing HSAVE_PA MSR requires the address to be 4k aligned.
> 
> Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

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 Thu Oct 13 04:24:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:24:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJPE-0007Mt-Ec; Thu, 13 Oct 2011 04:24:56 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJOg-0007AL-VC
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:24:23 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318505059!35110867!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30758 invoked from network); 13 Oct 2011 11:24:20 -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; 13 Oct 2011 11:24:20 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1REJOc-000CFe-TU; Thu, 13 Oct 2011 11:24:18 +0000
Date: Thu, 13 Oct 2011 12:24:18 +0100
From: Tim Deegan <tim@xen.org>
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH] xenpaging: handle evict failures
Message-ID: <20111013112418.GD44937@ocelot.phlegethon.org>
References: <bdd49540f1e1c803d01c.1318336570@probook.site>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <bdd49540f1e1c803d01c.1318336570@probook.site>
User-Agent: Mutt/1.4.2.1i
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

At 14:36 +0200 on 11 Oct (1318343770), Olaf Hering wrote:
> xenpaging: handle evict failures
> 
> Evict of a nominated gfn must fail if some other process mapped the
> page without checking the p2mt of that gfn first.
> Add a check to cancel eviction if the page usage count is not 1.
> 
> Handle the possible eviction failure in the page-in paths.
> After nominate and before evict, something may check the p2mt and call
> populate. Handle this case and let the gfn enter the page-in path. The
> gfn may still be connected to a mfn, so there is no need to allocate a
> new page in prep.
> 
> Adjust do_mmu_update to return -ENOENT only if the gfn has entered the
> page-in path and if it is not yet connected to a mfn. Otherwise
> linux_privcmd_map_foreign_bulk() may loop forever.
> 
> Add MEM_EVENT_FLAG_EVICT_FAIL to inform pager that a page-in request for
> a possible not-evicted page was sent. xenpaging does currently not need
> that flag because failure to evict a gfn will be caught.
> 
> Signed-off-by: Olaf Hering <olaf@aepfle.de>

This doesn't completely close off that race condition (that will require
the p2m refcounting that's being discussed in another thread) but it's a
big improvement so I've applied it.

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 Oct 13 04:27:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:27:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJRq-0007mm-Vc; Thu, 13 Oct 2011 04:27:38 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJR4-0007ZZ-Or
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:26:51 -0700
X-Env-Sender: james.harper@bendigoit.com.au
X-Msg-Ref: server-2.tower-174.messagelabs.com!1318505204!35117289!1
X-Originating-IP: [203.16.224.4]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10189 invoked from network); 13 Oct 2011 11:26:47 -0000
Received: from smtp1.bendigoit.com.au (HELO smtp1.bendigoit.com.au)
	(203.16.224.4)
	by server-2.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	13 Oct 2011 11:26:47 -0000
Received: from mail.bendigoit.com.au ([203.16.207.99])
	by smtp1.bendigoit.com.au with esmtp (Exim 4.69)
	(envelope-from <james.harper@bendigoit.com.au>)
	id 1REJQp-0007uz-61; Thu, 13 Oct 2011 22:26:35 +1100
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
X-MimeOLE: Produced By Microsoft Exchange V6.5
Subject: RE: [Xen-devel] [PATCH RFC V5 00/11] Paravirtualized ticketlocks
Date: Thu, 13 Oct 2011 22:26:34 +1100
Message-ID: <AEC6C66638C05B468B556EA548C1A77D01E5E604@trantor>
In-Reply-To: <4E968D24.8040509@goop.org>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: [Xen-devel] [PATCH RFC V5 00/11] Paravirtualized ticketlocks
Thread-Index: AcyJdmJUdmxuGd8BQoiAHlh10NLiEAAIPiZQ
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<AEC6C66638C05B468B556EA548C1A77D01E5E5CA@trantor>
	<4E968D24.8040509@goop.org>
From: "James Harper" <james.harper@bendigoit.com.au>
To: "Jeremy Fitzhardinge" <jeremy@goop.org>
X-Really-From-Bendigo-IT: magichashvalue
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

>=20
> On 10/12/2011 07:50 PM, James Harper wrote:
> >> Thoughts? Comments? Suggestions?
> >>
> > I am lead to believe that Hyper-V guests provide some sort of
spinlock
> > notification (a commit to KVM seems to suggest it). Has that been
> > considered at all here, if such notification can be exposed to Xen?
> >
>=20
> Yes, that's basically what this series is about: a mechanism for Linux
to tell
> Xen "I'm stuck in a spinlock".
>=20

Has it actually been implemented for Hyper-V though? It would appear
that a Hyper-V "HvNotifyLongSpinWait" hypercall is required to convey
spinlock information from the Windows DomU to Xen... AFAIK we don't
support any Hyper-V hypercalls right?

James


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 04:28:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:28:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJSx-0008Aq-Lc; Thu, 13 Oct 2011 04:28:47 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJRF-0007b1-1l
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:27:01 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318505216!726091!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28491 invoked from network); 13 Oct 2011 11:26:57 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 11:26:57 -0000
Received: by qabg14 with SMTP id g14so2299056qab.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 04:26: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=f/zCWIjmcOWBmdCLaP6GDxxOPWZP4jtl1qQgJOs5KNA=;
	b=HbTOou8YeyQEDx4LhS9E44hb6oB0aPuEFCf+wRqBRUp9K6/EUm6ILTFVX5F4iJu3tk
	UbZ4Z1MJ4yYqsjvO5SqbxWoBdTNqV1NcdQnO1gBhlkxmjTyGM2OABm4gcUuFxnQXmork
	kNaQrbzQ7hKSFwQe5RZj+A7ua+5mY1iX87ysI=
MIME-Version: 1.0
Received: by 10.68.36.105 with SMTP id p9mr8492019pbj.3.1318505216476; Thu, 13
	Oct 2011 04:26:56 -0700 (PDT)
Received: by 10.142.225.20 with HTTP; Thu, 13 Oct 2011 04:26:56 -0700 (PDT)
In-Reply-To: <6bc67c8ad63e80f40003.1318499608@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
	<6bc67c8ad63e80f40003.1318499608@localhost.localdomain>
Date: Thu, 13 Oct 2011 13:26:56 +0200
X-Google-Sender-Auth: lD6viOhyRp4w7bHiPcsHxwHdKWw
Message-ID: <CAPLaKK7-2LxN6kgE14WEVXN+6QvZZVN_qYybemZ7+CdTWPXJMw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 03 of 27 v2] libxl: idl: use "dispose" rather
	than "destroy" for function to free IDL types
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
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

This patch doesn't apply clearly on current xen-unstable, gentest.py
complains about:

--- gentest.py
+++ gentest.py
@@ -256,8 +256,8 @@ int main(int argc, char **argv)
         f.write("    printf(\"%%s: %%s\\n\", \"%s\", s);\n" % ty.typename)
         f.write("    if (s == NULL) abort();\n")
         f.write("    free(s);\n")
-        if ty.destructor_fn is not None:
-            f.write("    %s(&%s_val);\n" % (ty.destructor_fn, ty.typename))
+        if ty.dispose_fn is not None:
+            f.write("    %s(&%s_val);\n" % (ty.dispose_fn, ty.typename))
         f.write("\n")

     f.write("    printf(\"Testing Enumerations\\n\");\n")

And I had to apply the following to gentypes.py and libxltypes.py,
since some hunks failed:

diff -r eedf352110c5 tools/libxl/gentypes.py
--- a/tools/libxl/gentypes.py   Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/gentypes.py   Thu Oct 13 13:19:39 2011 +0200
@@ -75,7 +75,7 @@ def libxl_C_type_define(ty, indent = "")
         raise NotImplementedError("%s" % type(ty))
     return s.replace("\n", "\n%s" % indent)

-def libxl_C_type_destroy(ty, v, indent = "    ", parent = None):
+def libxl_C_type_dispose(ty, v, indent = "    ", parent = None):

     s = ""
     if isinstance(ty, libxltypes.KeyedUnion):
@@ -165,8 +165,8 @@ if __name__ == '__main__':

     for ty in types:
         f.write(libxl_C_type_define(ty) + ";\n")
-        if ty.destructor_fn is not None:
-            f.write("void %s(%s);\n" % (ty.destructor_fn, ty.make_arg("p")))
+        if ty.dispose_fn is not None:
+            f.write("void %s(%s);\n" % (ty.dispose_fn, ty.make_arg("p")))
         if isinstance(ty, libxltypes.Enumeration):
             f.write("const char *%s_to_string(%s);\n" % (ty.typename,
ty.make_arg("p")))
             f.write("int %s_from_string(const char *s, %s);\n" %
(ty.typename, ty.make_arg("e", passby=libxltypes.PASS_BY_REFERENCE)))
[51310 refs]
loki# hg qdiff
diff -r eedf352110c5 tools/libxl/gentypes.py
--- a/tools/libxl/gentypes.py   Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/gentypes.py   Thu Oct 13 13:25:30 2011 +0200
@@ -75,7 +75,7 @@ def libxl_C_type_define(ty, indent = "")
         raise NotImplementedError("%s" % type(ty))
     return s.replace("\n", "\n%s" % indent)

-def libxl_C_type_destroy(ty, v, indent = "    ", parent = None):
+def libxl_C_type_dispose(ty, v, indent = "    ", parent = None):

     s = ""
     if isinstance(ty, libxltypes.KeyedUnion):
@@ -165,8 +165,8 @@ if __name__ == '__main__':

     for ty in types:
         f.write(libxl_C_type_define(ty) + ";\n")
-        if ty.destructor_fn is not None:
-            f.write("void %s(%s);\n" % (ty.destructor_fn, ty.make_arg("p")))
+        if ty.dispose_fn is not None:
+            f.write("void %s(%s);\n" % (ty.dispose_fn, ty.make_arg("p")))
         if isinstance(ty, libxltypes.Enumeration):
             f.write("const char *%s_to_string(%s);\n" % (ty.typename,
ty.make_arg("p")))
             f.write("int %s_from_string(const char *s, %s);\n" %
(ty.typename, ty.make_arg("e", passby=libxltypes.PASS_BY_REFERENCE)))
diff -r eedf352110c5 tools/libxl/libxltypes.py
--- a/tools/libxl/libxltypes.py Thu Oct 13 10:47:18 2011 +0100
+++ b/tools/libxl/libxltypes.py Thu Oct 13 13:25:30 2011 +0200
@@ -81,14 +81,14 @@ class Type(object):
 class Builtin(Type):
     """Builtin type"""
     def __init__(self, typename, **kwargs):
-        kwargs.setdefault('destructor_fn', None)
-        kwargs.setdefault('autogenerate_destructor', False)
+        kwargs.setdefault('dispose_fn', None)
+        kwargs.setdefault('autogenerate_dispose_fn', False)
         Type.__init__(self, typename, **kwargs)

 class Number(Builtin):
     def __init__(self, ctype, **kwargs):
         kwargs.setdefault('namespace', None)
-        kwargs.setdefault('destructor_fn', None)
+        kwargs.setdefault('dispose_fn', None)
         kwargs.setdefault('signed', False)
         self.signed = kwargs['signed']
         Builtin.__init__(self, ctype, **kwargs)
@@ -230,7 +230,9 @@ uint16 = UInt(16)
 uint32 = UInt(32)
 uint64 = UInt(64)

-string = Builtin("char *", namespace = None, destructor_fn = "free")
+string = Builtin("char *", namespace = None, dispose_fn = "free",
+                  json_fn = "libxl__string_gen_json",
+                  autogenerate_json = False)

 class OrderedDict(dict):
     """A dictionary which remembers insertion order.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 04:29:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:29:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJTv-00006R-MB; Thu, 13 Oct 2011 04:29:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJSB-0007sx-Hl
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:28:00 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-5.tower-27.messagelabs.com!1318505252!48933875!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14341 invoked from network); 13 Oct 2011 11:27:32 -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; 13 Oct 2011 11:27:32 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1REJS7-000CGg-Nl; Thu, 13 Oct 2011 11:27:55 +0000
Date: Thu, 13 Oct 2011 12:27:55 +0100
From: Tim Deegan <tim@xen.org>
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH] xenpaging: check p2mt in p2m_mem_paging
	functions
Message-ID: <20111013112755.GE44937@ocelot.phlegethon.org>
References: <bc64a435d572680efb22.1318336951@probook.site>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <bc64a435d572680efb22.1318336951@probook.site>
User-Agent: Mutt/1.4.2.1i
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

Hi, 

At 14:42 +0200 on 11 Oct (1318344151), Olaf Hering wrote:
> @@ -897,9 +903,16 @@ void p2m_mem_paging_resume(struct domain
>      {
>          p2m_lock(p2m);
>          mfn = p2m->get_entry(p2m, rsp.gfn, &p2mt, &a, p2m_query, NULL);
> -        set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
> -        set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
> -        audit_p2m(p2m, 1);
> +        /* 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 ) )

Wouldn't a nominated-but-not-evicted page have type p2m_ram_paging_out?

> +        {
> +            set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
> +            set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
> +            audit_p2m(p2m, 1);
> +        /* May be called more than once if the gfn was populate from different vcpus */
> +        } else if ( p2mt != p2m_ram_rw ) {
> +            printk("resume: %d %lx %x %lx\n", d->domain_id, rsp.gfn, p2mt, mfn_x(mfn));

This should be a gdprintk of some kind, probably XENLOG_WARNING unless
it happens a lot. 

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 Oct 13 04:32:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:32:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJWs-0000cO-AB; Thu, 13 Oct 2011 04:32:50 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJW5-0000Jj-Up
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:32:02 -0700
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318505517!19352710!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11660 invoked from network); 13 Oct 2011 11:31:58 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-3.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 11:31:58 -0000
Received: by ggnk4 with SMTP id k4so3187241ggn.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 04:31:57 -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:content-transfer-encoding;
	bh=DpZndUxkDhnzy+gcI+3QhgwU5HtT6tZkdkArWT/zB0U=;
	b=LS4QJ9/btbYeD7n2oxRKBMh5CSYFt376AuAmw48Z0Dtz3yi1biFFDYzBpUZbnYDsDt
	K277IszbB/LQDBb8vhICktE4ZH1pQlt/39UEt5+h3vCc4QQY3x0SFjG3z9RLPcvbGXut
	5jXmOeTSPIJ8vW8PuTHOl8AnF72XIDQ7MoExk=
MIME-Version: 1.0
Received: by 10.223.85.134 with SMTP id o6mr5599097fal.8.1318505517185; Thu,
	13 Oct 2011 04:31:57 -0700 (PDT)
Received: by 10.223.72.205 with HTTP; Thu, 13 Oct 2011 04:31:57 -0700 (PDT)
In-Reply-To: <1318504130.21903.826.camel@zakaz.uk.xensource.com>
References: <CAP2B85-UdKBazkis6Ga1QSX=PLfuk_LMLwh1RnQ2oMsi10wvHQ@mail.gmail.com>
	<1318414373.21903.637.camel@zakaz.uk.xensource.com>
	<CAP2B85_zhnY9DVmD3fWE7j2XkHgd8eKiryr8GSLLo8Bm8UHuTw@mail.gmail.com>
	<1318427768.21903.718.camel@zakaz.uk.xensource.com>
	<CAP2B8589fYo-gB_omV5yNKZc_YtK6oTpq06H0V0dCK6ShvrJYw@mail.gmail.com>
	<1318504130.21903.826.camel@zakaz.uk.xensource.com>
Date: Thu, 13 Oct 2011 20:31:57 +0900
Message-ID: <CAP2B859gKeqycL2TEDbqCnQ-K1QVNn5rMQFuu0b=JWPWe=dH5w@mail.gmail.com>
Subject: Re: [Xen-devel] Front-end back-end connection
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, Oct 13, 2011 at 8:08 PM, Ian Campbell <Ian.Campbell@citrix.com> wro=
te:
> On Thu, 2011-10-13 at 11:34 +0100, Daniel Castro wrote:
>> On Wed, Oct 12, 2011 at 10:56 PM, Ian Campbell <Ian.Campbell@citrix.com>=
 wrote:
>> > On Wed, 2011-10-12 at 13:02 +0100, Daniel Castro wrote:
>> >> On Wed, Oct 12, 2011 at 7:12 PM, Ian Campbell <Ian.Campbell@citrix.co=
m> wrote:
>> >> > On Wed, 2011-10-12 at 08:13 +0100, Daniel Castro wrote:
>> >> >> Hello All,
>> >> >>
>> >> >> I am in the process of conecting my front-end to my back end.
>> >> >> The process is like this:
>> >> >> 1. Set up xenstore conection
>> >> >> 2. initiate front rings
>> >> >> 3. Initiate gran table
>> >> >> 4. Take my rings mfn address and set it up as a entry (more on thi=
s)
>> >> >> 5. create a unbound port for front-back ring communication (more o=
n this )
>> >> >> 5.1 I start by changing state to XenbusStateInitialising
>> >> >> 5.2 ring-ref entry (step 4)
>> >> >> 5.3 port entry (step 5)
>> >> >> 5.4 backend state is XenbusStateInitWait
>> >> >> 5.4 change state to XenbusStateInitialised
>> >> >> 5.5 back end state is XenbusStateClosing meaning there is an error=
 or
>> >> >> something is missing.
>> >> >> 6. on sucess end
>> >> >>
>> >> >> More on step 4: I got my grant page table like this:
>> >> >> =A0 =A0 =A0 struct gnttab_setup_table gst;
>> >> >> =A0 =A0 =A0 grant_entries =3D (struct grant_entry_v1 *) memalign_h=
igh(4096, 4096);
>> >> >> //asume malloc
>> >> >> =A0 =A0 =A0 memset(grant_entries,0,4096);
>> >> >> =A0 =A0 =A0 gst.dom =3D DOMID_SELF; //&me
>> >> >> =A0 =A0 =A0 gst.nr_frames =3D 1; //a single page
>> >> >> =A0 =A0 =A0 //gst.frame_list =3D grant_entries; (I have no idea ho=
w to handle this :P )
>> >> >> =A0 =A0 =A0 res =3D hypercall_grant_table_op(GNTTABOP_map_grant_re=
f, &gst, 1);
>> >> >> I think this works, but maybe I am wrong.
>> >> >
>> >> > I'm afraid you are.
>> >> >
>> >> > For one thing simply not initialising one of the fields in the argu=
ment
>> >> > structure is unlikely to be correct.
>> >> >
>> >> > Secondly the argument to GNTTABOP_map_grant_ref is a pointer to "st=
ruct
>> >> > gnttab_map_grant_ref" not "struct gnttab_setup_table", likewise "st=
ruct
>> >> > gnttab_setup_table" goes with GNTTABOP_setup_table. I think this sh=
ould
>> >> > be pretty clear from the way the GNTTABOP_* and struct definitions =
are
>> >> > laid out in xen/include/public/grant_table.h and the naming convent=
ion
>> >> > what goes with what. There are also comments in that header describ=
ing
>> >> > each operation.
>> >> >
>> >> > If you are trying to setup the grant table itself then
>> >> > GNTTABOP_setup_table is what you want. GNTTABOP_map_grant_ref is us=
ed
>> >> > for mapping a grant reference which you have been given by another
>> >> > domain.
>> >> >
>> >> > drivers/xen/grant-table.c:gnttab_map should provide a rough idea ho=
w
>> >> > this needs to be done. Because this is an HVM domain you need to do=
 a
>> >> > XENMEM_add_to_physmap of XENMAPSPACE_grant_table before you do the
>> >> > GNTTABOP_setup_table.
>> >>
>> >> Fixed. Yet, how can I confirm that the grant table was correctly
>> >> mapped? The hypercall returned 0 and the status in the struct is also
>> >> 0.
>> >> After the mapping I am printing this:
>> >> allocated grant_entries at 12 bytes at 0x0f7fc000, gpfn 0xf7fc
>> >> GNTTABOP_setup_table return 0 status:0
>> >> allocated shared info 2584 bytes at 0x0f7fa000, gpfn 0xf7fa
>> >
>> > Did you also call XENMEM_add_to_physmap somewhere?
>> Its working now after the changes, and also I noticed that back-end
>> does not read =A0key "port", instead read "event-channel" so I left both
>> in case.
>
> You only need to fill in the one which the backend reads. That is
> "event-channel".
>
>> For completeness and future references to the list here is my code:
>> static struct grant_entry_v1 *grant_entries =3D NULL;
>> =A0 =A0 struct xen_add_to_physmap xatp;
>> =A0 =A0 if(grant_entries!=3DNULL)
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 return grant_entries;
>> =A0 =A0 xatp.domid =3D DOMID_SELF;
>> =A0 =A0 xatp.space =3D XENMAPSPACE_grant_table;
>> =A0 =A0 xatp.idx =A0 =3D 0;
>> =A0 =A0 grant_entries =3D (struct grant_entry_v1 *) memalign_high(PAGE_S=
IZE,
>> PAGE_SIZE);
>> =A0 =A0 memset(grant_entries, 0, PAGE_SIZE);
>> =A0 =A0 xatp.gpfn =A0=3D ((unsigned long)grant_entries >> PAGE_SHIFT);
>> =A0 =A0 dprintf(1, "allocated grant_entries at %d bytes at %p, gpfn
>> 0x%lx\n",sizeof(*grant_entries), grant_entries, xatp.gpfn);
>> =A0 =A0 if (hypercall_memory_op(XENMEM_add_to_physmap, &xatp) !=3D 0)
>> =A0 =A0 =A0 panic("MAP grant_entries info page fail");
>> =A0 =A0 return grant_entries;
>>
>> struct gnttab_setup_table gst;
>> =A0 =A0 =A0 grant_entries =3D (struct grant_entry_v1 *) get_grant_table(=
);
>> =A0 =A0 =A0 gst.dom =3D DOMID_SELF;
>> =A0 =A0 =A0 gst.nr_frames =3D 1;
>> =A0 =A0 =A0 //gst.frame_list =3D (struct grant_entry_v1 *) grant_entries=
;
>
> This isn't needed? That would surprise me...
Its part of the " OUT parameters. " in the struct, so I did not fill it out=
...
>
>> =A0 =A0 =A0 res =3D hypercall_grant_table_op(GNTTABOP_setup_table, &gst,=
 1);
>> =A0 =A0 =A0 if(res!=3D0){
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 dprintf(1,"Error Mapping Grant Table... Abor=
t...\n");
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 panic("Map Grant Table Failed\n");
>> =A0 =A0 =A0 }
>> =A0 =A0 =A0 dprintf(1,"GNTTABOP_setup_table return %d status:%d\n",res,g=
st.status);
>>
>> After this two pieces of code I create the grant entry for the rings
>> as previously discussed.
>> Must fill in device details from xenstore, and, now that the back and
>> front connect I have to handle requests, read and write.
>>
>> I guess is a matter of copy from buffer to ring, and from ring to buffer=
...
>
> The block protocol involves granting the buffer and putting the ref on
> the ring, not putting data inline in the ring.
>
> However for simplicity I would suggest granting a static buffer to the
> backend and copying from the SeaBIOS buffer to that.
So would it be better to create another static buffer get a gref for
it and copy from disk_op_s->buf_fl when reading and copy to when
writing?

BTW what are segments in SeaBIOS and whats the use for it? in Xen is
only 32 Bit flat right? so I do not have to use any of the segment
macros, right?

Thanks for the help :)

>
>>
>> >
>> > I'm afraid these messages are pretty meaningless without the
>> > corresponding code, but you should certainly have already setup the
>> > table before you start allocating grant_entries in it (or more
>> > importantly writing to them). These messages suggest that is not the
>> > case?
>> >
>> >> I also found that the port I get from the EVTCHNOP_alloc_unbound is 4=
,
>> >> but lsevtchn gets me this:
>> >> =A0 42: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 2
>> >> =A0 43: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 3
>> >> =A0 44: VCPU 0: Interdomain (Connected) - Remote Domain 5, Port 1
>> >> Port 4 is not listed, is it because it is not connected yet?
>> >
>> > If this is lsevtchn for dom0 then most likely yes. You should be able =
to
>> > see the guest's state with lsevtchn <domid>.
>> >
>> > In the backend the evtchn gets bound after the frontend's shared ring =
is
>> > mapped so the fact that the evtchn didn't get bound suggests an error
>> > before that point.
>> >
>> >> I get no errors in xl dmesg, and in dmesg I get:
>> >> vbd vbd-5-768: 2 reading /local/domain/5/device/vbd/768/ring-ref and
>> >> event-channel
>> >
>> > Do you see anything else in xenstore?
>> >
>> >> I guess there are the keys I write in the front-end, so they are bein=
g read.
>> >>
>> >> Thanks for the help, I feel we are getting closer to the other side..=
.
>> >>
>> >> Daniel
>> >>
>> >> >
>> >> >> =A0This is needed on step 5, so..
>> >> >> More on step 5:
>> >> >> I consider the grant table an array of type struct grant_entry_v1.
>> >> >> So I simply do grant_entry_v1[0] for my first grant entry, and so
>> >> >> forth. For this case I read on the list some time ago that entry 0=
 did
>> >> >> not work, so I work with entry 1, like this:
>> >> >> grant_entries[aval_grant].domid =3D ext_domid;
>> >> >> grant_entries[aval_grant].frame =3D _frame; where frame is: (u32)s=
ring
>> >> >> >> PAGE_SHIFT //meaning mfn of my rings.
>> >> >> grant_entries[aval_grant].flags =3D GTF_permit_access;
>> >> >
>> >> > This looks approximately correct _if_ you were actually writing to =
some
>> >> > memory which was your grant table but due to the above I think you =
are
>> >> > not.
>> >> >
>> >> >> These last two steps I described may be wrong... I know this becau=
se
>> >> >> the backend state is not XenbusStateConnected.
>> >> >
>> >> > That fact alone can't tell you much other than _something_ went wro=
ng.
>> >> >
>> >> > Since the backend will have transitioned to XenbusStateClosing by
>> >> > calling xenbus_dev_fatal() it will have written some error informat=
ion
>> >> > to xenstore and the dom0 console which should hint at what actually=
 went
>> >> > wrong. I expect you will see the message "mapping ring-ref %lu port=
 %u"
>> >> > because xen_blkif_map will have failed during map_frontend_page().
>> >> >
>> >> >> I think my mistake is on step 5, so can someone please shed some l=
ight
>> >> >> on this small issue.
>> >> >>
>> >> >> And thank you very much for taking the time to read.
>> >> >>
>> >> >> 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 Thu Oct 13 04:38:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:38:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJcM-0001PN-Qn; Thu, 13 Oct 2011 04:38:30 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJbi-0001CN-2J
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:37:50 -0700
X-Env-Sender: Paul.Durrant@citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1318505866!862063!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21385 invoked from network); 13 Oct 2011 11:37:46 -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;
	13 Oct 2011 11:37:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,340,1315180800"; 
   d="scan'208";a="8368080"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 11:37:33 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.161]) by
	LONPMAILMX01.citrite.net ([10.30.203.162]) with mapi; Thu, 13 Oct 2011
	12:37:33 +0100
From: Paul Durrant <Paul.Durrant@citrix.com>
To: James Harper <james.harper@bendigoit.com.au>, Jeremy Fitzhardinge
	<jeremy@goop.org>
Date: Thu, 13 Oct 2011 12:37:35 +0100
Subject: RE: [Xen-devel] [PATCH RFC V5 00/11] Paravirtualized ticketlocks
Thread-Topic: [Xen-devel] [PATCH RFC V5 00/11] Paravirtualized ticketlocks
Thread-Index: AcyJdmJUdmxuGd8BQoiAHlh10NLiEAAIPiZQAAFDPPA=
Message-ID: <291EDFCB1E9E224A99088639C4762022B450ED3018@LONPMAILBOX01.citrite.net>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<AEC6C66638C05B468B556EA548C1A77D01E5E5CA@trantor>
	<4E968D24.8040509@goop.org>
	<AEC6C66638C05B468B556EA548C1A77D01E5E604@trantor>
In-Reply-To: <AEC6C66638C05B468B556EA548C1A77D01E5E604@trantor>
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 <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

Check the code in viridian.c. I think you'll find we do.

  Paul

> -----Original Message-----
> From: xen-devel-bounces@lists.xensource.com [mailto:xen-devel-
> bounces@lists.xensource.com] On Behalf Of James Harper
> Sent: 13 October 2011 12:27
> To: Jeremy Fitzhardinge
> Cc: Xen Devel
> Subject: RE: [Xen-devel] [PATCH RFC V5 00/11] Paravirtualized
> ticketlocks
>=20
> >
> > On 10/12/2011 07:50 PM, James Harper wrote:
> > >> Thoughts? Comments? Suggestions?
> > >>
> > > I am lead to believe that Hyper-V guests provide some sort of
> spinlock
> > > notification (a commit to KVM seems to suggest it). Has that
> been
> > > considered at all here, if such notification can be exposed to
> Xen?
> > >
> >
> > Yes, that's basically what this series is about: a mechanism for
> Linux
> to tell
> > Xen "I'm stuck in a spinlock".
> >
>=20
> Has it actually been implemented for Hyper-V though? It would appear
> that a Hyper-V "HvNotifyLongSpinWait" hypercall is required to
> convey spinlock information from the Windows DomU to Xen... AFAIK we
> don't support any Hyper-V hypercalls right?
>=20
> James
>=20
>=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 Oct 13 04:40:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:40:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJe3-0001o5-75; Thu, 13 Oct 2011 04:40:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJdL-0001b4-Tw
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:39:32 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318505968!35114050!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25265 invoked from network); 13 Oct 2011 11:39:28 -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; 13 Oct 2011 11:39:28 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1REJdH-000CJy-DL; Thu, 13 Oct 2011 11:39:27 +0000
Date: Thu, 13 Oct 2011 12:39:27 +0100
From: Tim Deegan <tim@xen.org>
To: Christoph Egger <Christoph.Egger@amd.com>
Subject: Re: [Xen-devel] [PATCH] xen viridian: cleanup
Message-ID: <20111013113927.GF44937@ocelot.phlegethon.org>
References: <4E944816.2030409@amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4E944816.2030409@amd.com>
User-Agent: Mutt/1.4.2.1i
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

At 15:43 +0200 on 11 Oct (1318347830), Christoph Egger wrote:
> 
> Simplify accesses into viridian structures.

I'm afraid this looks like a bunch of code churn for not much benefit;
unless anyone else wants it I don't think I'll apply it.

Cheers,

Tim.

> 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

Content-Description: xen_viridian.diff
> diff -r 04fbcc0c1ec5 xen/arch/x86/hvm/viridian.c
> --- a/xen/arch/x86/hvm/viridian.c	Wed Sep 28 12:09:13 2011 +0200
> +++ b/xen/arch/x86/hvm/viridian.c	Wed Sep 28 12:45:39 2011 +0200
> @@ -98,37 +98,43 @@ int cpuid_viridian_leaves(unsigned int l
>  
>  void dump_guest_os_id(struct domain *d)
>  {
> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
> +
>      gdprintk(XENLOG_INFO, "GUEST_OS_ID:\n");
>      gdprintk(XENLOG_INFO, "\tvendor: %x\n",
> -            d->arch.hvm_domain.viridian.guest_os_id.fields.vendor);
> +            vd->guest_os_id.fields.vendor);
>      gdprintk(XENLOG_INFO, "\tos: %x\n",
> -            d->arch.hvm_domain.viridian.guest_os_id.fields.os);
> +            vd->guest_os_id.fields.os);
>      gdprintk(XENLOG_INFO, "\tmajor: %x\n",
> -            d->arch.hvm_domain.viridian.guest_os_id.fields.major);
> +            vd->guest_os_id.fields.major);
>      gdprintk(XENLOG_INFO, "\tminor: %x\n",
> -            d->arch.hvm_domain.viridian.guest_os_id.fields.minor);
> +            vd->guest_os_id.fields.minor);
>      gdprintk(XENLOG_INFO, "\tsp: %x\n",
> -            d->arch.hvm_domain.viridian.guest_os_id.fields.service_pack);
> +            vd->guest_os_id.fields.service_pack);
>      gdprintk(XENLOG_INFO, "\tbuild: %x\n",
> -            d->arch.hvm_domain.viridian.guest_os_id.fields.build_number);
> +            vd->guest_os_id.fields.build_number);
>  }
>  
>  void dump_hypercall(struct domain *d)
>  {
> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
> +
>      gdprintk(XENLOG_INFO, "HYPERCALL:\n");
>      gdprintk(XENLOG_INFO, "\tenabled: %x\n",
> -            d->arch.hvm_domain.viridian.hypercall_gpa.fields.enabled);
> +            vd->hypercall_gpa.fields.enabled);
>      gdprintk(XENLOG_INFO, "\tpfn: %lx\n",
> -            (unsigned long)d->arch.hvm_domain.viridian.hypercall_gpa.fields.pfn);
> +            (unsigned long)vd->hypercall_gpa.fields.pfn);
>  }
>  
>  void dump_apic_assist(struct vcpu *v)
>  {
> +    struct viridian_vcpu *vv = &v->arch.hvm_vcpu.viridian;
> +
>      gdprintk(XENLOG_INFO, "APIC_ASSIST[%d]:\n", v->vcpu_id);
>      gdprintk(XENLOG_INFO, "\tenabled: %x\n",
> -            v->arch.hvm_vcpu.viridian.apic_assist.fields.enabled);
> +            vv->apic_assist.fields.enabled);
>      gdprintk(XENLOG_INFO, "\tpfn: %lx\n",
> -            (unsigned long)v->arch.hvm_vcpu.viridian.apic_assist.fields.pfn);
> +            (unsigned long)vv->apic_assist.fields.pfn);
>  }
>  
>  static void enable_hypercall_page(struct domain *d)
> @@ -201,6 +207,8 @@ int wrmsr_viridian_regs(uint32_t idx, ui
>  {
>      struct vcpu *v = current;
>      struct domain *d = v->domain;
> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
> +    struct viridian_vcpu *vv = &v->arch.hvm_vcpu.viridian;
>  
>      if ( !is_viridian_domain(d) )
>          return 0;
> @@ -209,15 +217,15 @@ int wrmsr_viridian_regs(uint32_t idx, ui
>      {
>      case VIRIDIAN_MSR_GUEST_OS_ID:
>          perfc_incr(mshv_wrmsr_osid);
> -        d->arch.hvm_domain.viridian.guest_os_id.raw = val;
> +        vd->guest_os_id.raw = val;
>          dump_guest_os_id(d);
>          break;
>  
>      case VIRIDIAN_MSR_HYPERCALL:
>          perfc_incr(mshv_wrmsr_hc_page);
> -        d->arch.hvm_domain.viridian.hypercall_gpa.raw = val;
> +        vd->hypercall_gpa.raw = val;
>          dump_hypercall(d);
> -        if ( d->arch.hvm_domain.viridian.hypercall_gpa.fields.enabled )
> +        if ( vd->hypercall_gpa.fields.enabled )
>              enable_hypercall_page(d);
>          break;
>  
> @@ -249,9 +257,9 @@ int wrmsr_viridian_regs(uint32_t idx, ui
>  
>      case VIRIDIAN_MSR_APIC_ASSIST:
>          perfc_incr(mshv_wrmsr_apic_msr);
> -        v->arch.hvm_vcpu.viridian.apic_assist.raw = val;
> +        vv->apic_assist.raw = val;
>          dump_apic_assist(v);
> -        if (v->arch.hvm_vcpu.viridian.apic_assist.fields.enabled)
> +        if (vv->apic_assist.fields.enabled)
>              initialize_apic_assist(v);
>          break;
>  
> @@ -266,6 +274,8 @@ int rdmsr_viridian_regs(uint32_t idx, ui
>  {
>      struct vcpu *v = current;
>      struct domain *d = v->domain;
> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
> +    struct viridian_vcpu *vv = &v->arch.hvm_vcpu.viridian;
>      
>      if ( !is_viridian_domain(d) )
>          return 0;
> @@ -274,12 +284,12 @@ int rdmsr_viridian_regs(uint32_t idx, ui
>      {
>      case VIRIDIAN_MSR_GUEST_OS_ID:
>          perfc_incr(mshv_rdmsr_osid);
> -        *val = d->arch.hvm_domain.viridian.guest_os_id.raw;
> +        *val = vd->guest_os_id.raw;
>          break;
>  
>      case VIRIDIAN_MSR_HYPERCALL:
>          perfc_incr(mshv_rdmsr_hc_page);
> -        *val = d->arch.hvm_domain.viridian.hypercall_gpa.raw;
> +        *val = vd->hypercall_gpa.raw;
>          break;
>  
>      case VIRIDIAN_MSR_VP_INDEX:
> @@ -300,7 +310,7 @@ int rdmsr_viridian_regs(uint32_t idx, ui
>  
>      case VIRIDIAN_MSR_APIC_ASSIST:
>          perfc_incr(mshv_rdmsr_apic_msr);
> -        *val = v->arch.hvm_vcpu.viridian.apic_assist.raw;
> +        *val = vv->apic_assist.raw;
>          break;
>  
>      default:
> @@ -390,12 +400,13 @@ out:
>  static int viridian_save_domain_ctxt(struct domain *d, hvm_domain_context_t *h)
>  {
>      struct hvm_viridian_domain_context ctxt;
> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
>  
>      if ( !is_viridian_domain(d) )
>          return 0;
>  
> -    ctxt.hypercall_gpa = d->arch.hvm_domain.viridian.hypercall_gpa.raw;
> -    ctxt.guest_os_id   = d->arch.hvm_domain.viridian.guest_os_id.raw;
> +    ctxt.hypercall_gpa = vd->hypercall_gpa.raw;
> +    ctxt.guest_os_id   = vd->guest_os_id.raw;
>  
>      return (hvm_save_entry(VIRIDIAN_DOMAIN, 0, h, &ctxt) != 0);
>  }
> @@ -403,12 +414,13 @@ static int viridian_save_domain_ctxt(str
>  static int viridian_load_domain_ctxt(struct domain *d, hvm_domain_context_t *h)
>  {
>      struct hvm_viridian_domain_context ctxt;
> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
>  
>      if ( hvm_load_entry(VIRIDIAN_DOMAIN, h, &ctxt) != 0 )
>          return -EINVAL;
>  
> -    d->arch.hvm_domain.viridian.hypercall_gpa.raw = ctxt.hypercall_gpa;
> -    d->arch.hvm_domain.viridian.guest_os_id.raw   = ctxt.guest_os_id;
> +    vd->hypercall_gpa.raw = ctxt.hypercall_gpa;
> +    vd->guest_os_id.raw   = ctxt.guest_os_id;
>  
>      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 Thu Oct 13 04:41:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:41:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJf3-0002BI-7L; Thu, 13 Oct 2011 04:41:17 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJdZ-0001do-5Z
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:39:45 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318505982!867563!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21967 invoked from network); 13 Oct 2011 11:39:42 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 11:39:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,340,1315180800"; 
   d="scan'208";a="8368145"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 11:39:42 +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, 13 Oct 2011 12:39:42 +0100
Subject: Re: [Xen-devel] [PATCH 03 of 27 v2] libxl: idl: use "dispose"
	rather than "destroy" for function to free IDL types
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Thu, 13 Oct 2011 12:39:41 +0100
In-Reply-To: <CAPLaKK7-2LxN6kgE14WEVXN+6QvZZVN_qYybemZ7+CdTWPXJMw@mail.gmail.com>
References: <patchbomb.1318499605@localhost.localdomain>
	<6bc67c8ad63e80f40003.1318499608@localhost.localdomain>
	<CAPLaKK7-2LxN6kgE14WEVXN+6QvZZVN_qYybemZ7+CdTWPXJMw@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1318505981.21903.832.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-10-13 at 12:26 +0100, Roger Pau MonnÃ© wrote:
> Hello,
> 
> This patch doesn't apply clearly on current xen-unstable, gentest.py
> complains about:

Sorry, I forgot to mention that this depends (textually, not
functionally) on the "libxl: support json for pretty printing
objects" (v2) series which I posted on Friday.

Ian.
> 
> --- gentest.py
> +++ gentest.py
> @@ -256,8 +256,8 @@ int main(int argc, char **argv)
>          f.write("    printf(\"%%s: %%s\\n\", \"%s\", s);\n" % ty.typename)
>          f.write("    if (s == NULL) abort();\n")
>          f.write("    free(s);\n")
> -        if ty.destructor_fn is not None:
> -            f.write("    %s(&%s_val);\n" % (ty.destructor_fn, ty.typename))
> +        if ty.dispose_fn is not None:
> +            f.write("    %s(&%s_val);\n" % (ty.dispose_fn, ty.typename))
>          f.write("\n")
> 
>      f.write("    printf(\"Testing Enumerations\\n\");\n")
> 
> And I had to apply the following to gentypes.py and libxltypes.py,
> since some hunks failed:
> 
> diff -r eedf352110c5 tools/libxl/gentypes.py
> --- a/tools/libxl/gentypes.py   Thu Oct 13 10:47:18 2011 +0100
> +++ b/tools/libxl/gentypes.py   Thu Oct 13 13:19:39 2011 +0200
> @@ -75,7 +75,7 @@ def libxl_C_type_define(ty, indent = "")
>          raise NotImplementedError("%s" % type(ty))
>      return s.replace("\n", "\n%s" % indent)
> 
> -def libxl_C_type_destroy(ty, v, indent = "    ", parent = None):
> +def libxl_C_type_dispose(ty, v, indent = "    ", parent = None):
> 
>      s = ""
>      if isinstance(ty, libxltypes.KeyedUnion):
> @@ -165,8 +165,8 @@ if __name__ == '__main__':
> 
>      for ty in types:
>          f.write(libxl_C_type_define(ty) + ";\n")
> -        if ty.destructor_fn is not None:
> -            f.write("void %s(%s);\n" % (ty.destructor_fn, ty.make_arg("p")))
> +        if ty.dispose_fn is not None:
> +            f.write("void %s(%s);\n" % (ty.dispose_fn, ty.make_arg("p")))
>          if isinstance(ty, libxltypes.Enumeration):
>              f.write("const char *%s_to_string(%s);\n" % (ty.typename,
> ty.make_arg("p")))
>              f.write("int %s_from_string(const char *s, %s);\n" %
> (ty.typename, ty.make_arg("e", passby=libxltypes.PASS_BY_REFERENCE)))
> [51310 refs]
> loki# hg qdiff
> diff -r eedf352110c5 tools/libxl/gentypes.py
> --- a/tools/libxl/gentypes.py   Thu Oct 13 10:47:18 2011 +0100
> +++ b/tools/libxl/gentypes.py   Thu Oct 13 13:25:30 2011 +0200
> @@ -75,7 +75,7 @@ def libxl_C_type_define(ty, indent = "")
>          raise NotImplementedError("%s" % type(ty))
>      return s.replace("\n", "\n%s" % indent)
> 
> -def libxl_C_type_destroy(ty, v, indent = "    ", parent = None):
> +def libxl_C_type_dispose(ty, v, indent = "    ", parent = None):
> 
>      s = ""
>      if isinstance(ty, libxltypes.KeyedUnion):
> @@ -165,8 +165,8 @@ if __name__ == '__main__':
> 
>      for ty in types:
>          f.write(libxl_C_type_define(ty) + ";\n")
> -        if ty.destructor_fn is not None:
> -            f.write("void %s(%s);\n" % (ty.destructor_fn, ty.make_arg("p")))
> +        if ty.dispose_fn is not None:
> +            f.write("void %s(%s);\n" % (ty.dispose_fn, ty.make_arg("p")))
>          if isinstance(ty, libxltypes.Enumeration):
>              f.write("const char *%s_to_string(%s);\n" % (ty.typename,
> ty.make_arg("p")))
>              f.write("int %s_from_string(const char *s, %s);\n" %
> (ty.typename, ty.make_arg("e", passby=libxltypes.PASS_BY_REFERENCE)))
> diff -r eedf352110c5 tools/libxl/libxltypes.py
> --- a/tools/libxl/libxltypes.py Thu Oct 13 10:47:18 2011 +0100
> +++ b/tools/libxl/libxltypes.py Thu Oct 13 13:25:30 2011 +0200
> @@ -81,14 +81,14 @@ class Type(object):
>  class Builtin(Type):
>      """Builtin type"""
>      def __init__(self, typename, **kwargs):
> -        kwargs.setdefault('destructor_fn', None)
> -        kwargs.setdefault('autogenerate_destructor', False)
> +        kwargs.setdefault('dispose_fn', None)
> +        kwargs.setdefault('autogenerate_dispose_fn', False)
>          Type.__init__(self, typename, **kwargs)
> 
>  class Number(Builtin):
>      def __init__(self, ctype, **kwargs):
>          kwargs.setdefault('namespace', None)
> -        kwargs.setdefault('destructor_fn', None)
> +        kwargs.setdefault('dispose_fn', None)
>          kwargs.setdefault('signed', False)
>          self.signed = kwargs['signed']
>          Builtin.__init__(self, ctype, **kwargs)
> @@ -230,7 +230,9 @@ uint16 = UInt(16)
>  uint32 = UInt(32)
>  uint64 = UInt(64)
> 
> -string = Builtin("char *", namespace = None, destructor_fn = "free")
> +string = Builtin("char *", namespace = None, dispose_fn = "free",
> +                  json_fn = "libxl__string_gen_json",
> +                  autogenerate_json = False)
> 
>  class OrderedDict(dict):
>      """A dictionary which remembers insertion order.



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 04:42:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:42:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJg9-0002ZA-QS; Thu, 13 Oct 2011 04:42:25 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJeI-0001sW-SI
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:40:31 -0700
X-Env-Sender: james.harper@bendigoit.com.au
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318505996!52668170!1
X-Originating-IP: [203.16.224.4]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16091 invoked from network); 13 Oct 2011 11:39:59 -0000
Received: from smtp1.bendigoit.com.au (HELO smtp1.bendigoit.com.au)
	(203.16.224.4)
	by server-7.tower-27.messagelabs.com with AES256-SHA encrypted SMTP;
	13 Oct 2011 11:39:59 -0000
Received: from smtp2.bendigoit.com.au ([203.16.207.99]
	helo=mail.bendigoit.com.au)
	by smtp1.bendigoit.com.au with esmtp (Exim 4.69)
	(envelope-from <james.harper@bendigoit.com.au>)
	id 1REJe7-0007zN-Cu; Thu, 13 Oct 2011 22:40:19 +1100
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
X-MimeOLE: Produced By Microsoft Exchange V6.5
Subject: RE: [Xen-devel] [PATCH RFC V5 00/11] Paravirtualized ticketlocks
Date: Thu, 13 Oct 2011 22:40:18 +1100
Message-ID: <AEC6C66638C05B468B556EA548C1A77D01E5E605@trantor>
In-Reply-To: <291EDFCB1E9E224A99088639C4762022B450ED3018@LONPMAILBOX01.citrite.net>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: [Xen-devel] [PATCH RFC V5 00/11] Paravirtualized ticketlocks
Thread-Index: AcyJdmJUdmxuGd8BQoiAHlh10NLiEAAIPiZQAAFDPPAAAByCEA==
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com><AEC6C66638C05B468B556EA548C1A77D01E5E5CA@trantor><4E968D24.8040509@goop.org>
	<AEC6C66638C05B468B556EA548C1A77D01E5E604@trantor>
	<291EDFCB1E9E224A99088639C4762022B450ED3018@LONPMAILBOX01.citrite.net>
From: "James Harper" <james.harper@bendigoit.com.au>
To: "Paul Durrant" <Paul.Durrant@citrix.com>,
	"Jeremy Fitzhardinge" <jeremy@goop.org>
X-Really-From-Bendigo-IT: magichashvalue
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

>=20
> Check the code in viridian.c. I think you'll find we do.
>=20

... and there it is!

Thanks

James

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 04:48:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04: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 1REJle-00036S-MZ; Thu, 13 Oct 2011 04:48:06 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJkw-0002t7-2K
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:47:22 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318506438!21134823!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31488 invoked from network); 13 Oct 2011 11:47:19 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 11:47:19 -0000
Received: by qyg14 with SMTP id 14so1117816qyg.9
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 04:47: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;
	bh=dKYCXXxcsAAz60h1GAhsqO/KgySwl60u4lfC3mVHf+Y=;
	b=Ct0hN3v9vI3DTYC1YmASOD2Il7CY/OJ7IdzgHlRMsedvu708U+qRB/X+271Q6sxgkH
	PQ4UubYNaXTMv70OZeEDiSLLK8evEOAZr7W/0UgC1m1M1wetZN7goeJ5Rhr6U2tzVmNB
	fwUJf61No9WQt4AZ8HjCVM6witD+YclKf7FpQ=
MIME-Version: 1.0
Received: by 10.68.12.162 with SMTP id z2mr8304760pbb.122.1318506437604; Thu,
	13 Oct 2011 04:47:17 -0700 (PDT)
Received: by 10.142.225.20 with HTTP; Thu, 13 Oct 2011 04:47:17 -0700 (PDT)
In-Reply-To: <1318505981.21903.832.camel@zakaz.uk.xensource.com>
References: <patchbomb.1318499605@localhost.localdomain>
	<6bc67c8ad63e80f40003.1318499608@localhost.localdomain>
	<CAPLaKK7-2LxN6kgE14WEVXN+6QvZZVN_qYybemZ7+CdTWPXJMw@mail.gmail.com>
	<1318505981.21903.832.camel@zakaz.uk.xensource.com>
Date: Thu, 13 Oct 2011 13:47:17 +0200
X-Google-Sender-Auth: uN7JT0O9yav-n_YE807eN_kukVI
Message-ID: <CAPLaKK5Ais-eQbdMRo2=XD=L=+7Wk3SUnCMWFpwb+eiBh231fQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 03 of 27 v2] libxl: idl: use "dispose" rather
	than "destroy" for function to free IDL types
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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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, I forgot to mention that this depends (textually, not
> functionally) on the "libxl: support json for pretty printing
> objects" (v2) series which I posted on Friday.

Ok, I was having some trouble applying those patches, I hope that
applying JSON ones first will solve it.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 04:49:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04:49:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REJn5-0003Ys-Ga; Thu, 13 Oct 2011 04:49:35 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJlU-00031W-PL
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:47:57 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318506473!19356069!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10110 invoked from network); 13 Oct 2011 11:47:53 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 11:47:53 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1REJlQ-000CMA-Sy; Thu, 13 Oct 2011 11:47:52 +0000
Date: Thu, 13 Oct 2011 12:47:52 +0100
From: Tim Deegan <tim@xen.org>
To: cc Luit <universalbillow@gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulation() in page_fault
Message-ID: <20111013114752.GG44937@ocelot.phlegethon.org>
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
	<20111011081829.GB88076@ocelot.phlegethon.org>
	<CADWh-PGgZ1imeq5Zf4ngwPsLXw3nb2jrExEcSDVkFZT5UWggmg@mail.gmail.com>
	<20111011112900.GF88076@ocelot.phlegethon.org>
	<CADWh-PFLM4ngx9Nyje1r2kpjaEgBRUQhQ01MDV1Lj0C5jtTJHQ@mail.gmail.com>
	<20111011122107.GG88076@ocelot.phlegethon.org>
	<CADWh-PFDKaSQa39hG8bf_Son1bRtv51G1zcQfeqk4wSQCmT5pQ@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CADWh-PFDKaSQa39hG8bf_Son1bRtv51G1zcQfeqk4wSQCmT5pQ@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

At 21:07 +0800 on 11 Oct (1318367233), cc Luit wrote:
> > > Why don't you just use EPT/NPT instead of shadow pagetables?  That code
> > > is a lot simpler and the end result is easier to validate than shadow
> > > pagetables are.  Is it particularly important to support shadow
> > pagetables?
> >
> yeah, we have consider that, and of course the EPT is much more convenient,
> BTW, do you know is there any simulator that can well support EPT of xen?
> the shadow page's problem is a little relevent to the selection of
> simulator~

There's experimental support in Xen itself for running a hypervisor
inside a HVM guest.  On AMD, that includes (and indeed requires) NPT in
the guest hypervisor.  Unfortunately, on Intel it does not include EPT.

There may be some other simulators that have EPT/NPT - I don't know. 

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 Oct 13 04:54:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 04: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 1REJro-00046r-Jg; Thu, 13 Oct 2011 04:54:28 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REJr7-0003tQ-Cs
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 04:53:45 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318506822!21136297!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24944 invoked from network); 13 Oct 2011 11:53:42 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-15.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 11:53:42 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1REJr3-000CNR-Qg; Thu, 13 Oct 2011 11:53:41 +0000
Date: Thu, 13 Oct 2011 12:53:41 +0100
From: Tim Deegan <tim@xen.org>
To: cc Luit <universalbillow@gmail.com>
Subject: Re: [Xen-devel] why xen use x86_emulation() in page_fault
Message-ID: <20111013115341.GH44937@ocelot.phlegethon.org>
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>
	<20111011081829.GB88076@ocelot.phlegethon.org>
	<4E9430B5.70608@gmail.com>
	<CADWh-PFHiiW1tOWqn8PmHvLSFTLMEvDhamCAxQUniehVhtSBZw@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CADWh-PFHiiW1tOWqn8PmHvLSFTLMEvDhamCAxQUniehVhtSBZw@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Cc: xen-devel@lists.xensource.com,
	"Zhengwang Ruan \(Royo\)" <zhengwang.ruan@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

Hi, 

At 21:46 +0800 on 11 Oct (1318369564), cc Luit wrote:
> On Tue, Oct 11, 2011 at 8:04 PM, Zhengwang Ruan (Royo) <zhengwang.ruan@gmail.com> wrote:
> > 2, Real-mode code you talked above is used to execute the first 16-bit
> > initial code of a guest OS? Does it have other usages in current Xen
> > implementation?
> >
> I'm also curious about the real-mode, looking forward to the replay~

It is used whenever the guest OS runs in real mode.  That's usually just
for a short while in the boot loader and the start of the kernel, but
that would depend on what OS you run in the guest.  DOS, for example,
would use it all the time. :) 

Linux (like most modern OSes) avoids real mode once it's booted, but if
it ever needs to reset a CPU (e.g. if you support CPU hotplug) then that
CPU will run in real mode briefly after it's reset.

Tim.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 05:15:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 05:15:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REKC5-00058k-TJ; Thu, 13 Oct 2011 05:15:25 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REKB6-0004v4-R9
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 05:14:26 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318508061!21450611!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26947 invoked from network); 13 Oct 2011 12:14:21 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 12:14:21 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 13:14:21 +0100
Message-Id: <4E96F23B020000780005B28A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 13:14:19 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
References: <CABC56ED.3276A%keir@xen.org> <CABC6F20.32780%keir@xen.org>
In-Reply-To: <CABC6F20.32780%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 13.10.11 at 11:34, Keir Fraser <keir@xen.org> wrote:
> Given our antipathy to the x86-32 hypervisor, and the fact that any
> remaining users of it are unlikely to be running MP systems at all let =
alone
> large MP systems, how about this cleanup patch?... (It looks quite =
confusing
> as a patch, actually, but does the obvious thing).

Looks good to me - I was actually considering to convert the x86-64
code back to alloc_xenheap_pages() too (for we'll need to do that
eventually anyway when we want to support more than 5Tb of memory)
when I put together that earlier patch, but then refrained from doing so
to keep the patch size down.

Jan

> x86: Simplify smpboot_alloc by merging x86-{32,64} code as far as =
possible.
>=20
> We still need one ifdef, as x86-32 does not have a compat_gdt_table.
>=20
> On x86-32 there is 1/2-page wastage due to allocating a whole page for
> the per-CPU IDT, however we expect very few users of the x86-32
> hypervisor. Those that cannot move to the 64-bit hypervisor are likely
> using old single-processor systems or new single-procesor netbooks. On
> UP and small MP systems, the wastage is insignificant.
>=20
> Signed-off-by: Keir Fraser <keir@xen.org>
> diff -r 1515484353c6 xen/arch/x86/smpboot.c
> --- a/xen/arch/x86/smpboot.c    Thu Oct 13 10:09:28 2011 +0200
> +++ b/xen/arch/x86/smpboot.c    Thu Oct 13 10:25:01 2011 +0100
> @@ -640,21 +640,16 @@ static void cpu_smpboot_free(unsigned in
>      unsigned int order;
> =20
>      order =3D get_order_from_pages(NR_RESERVED_GDT_PAGES);
> +    free_xenheap_pages(per_cpu(gdt_table, cpu), order);
> +    per_cpu(gdt_table, cpu) =3D NULL;
> +
>  #ifdef __x86_64__
> -    if ( per_cpu(compat_gdt_table, cpu) )
> -        free_domheap_pages(virt_to_page(per_cpu(gdt_table, cpu)), =
order);
> -    if ( per_cpu(gdt_table, cpu) )
> -        free_domheap_pages(virt_to_page(per_cpu(compat_gdt_table, =
cpu)),
> -                           order);
> +    free_xenheap_pages(per_cpu(compat_gdt_table, cpu), order);
>      per_cpu(compat_gdt_table, cpu) =3D NULL;
> -    order =3D get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
> -    if ( idt_tables[cpu] )
> -        free_domheap_pages(virt_to_page(idt_tables[cpu]), order);
> -#else
> -    free_xenheap_pages(per_cpu(gdt_table, cpu), order);
> -    xfree(idt_tables[cpu]);
>  #endif
> -    per_cpu(gdt_table, cpu) =3D NULL;
> +
> +    order =3D get_order_from_bytes(IDT_ENTRIES * sizeof(idt_entry_t));
> +    free_xenheap_pages(idt_tables[cpu], order);
>      idt_tables[cpu] =3D NULL;
> =20
>      if ( stack_base[cpu] !=3D NULL )
> @@ -669,9 +664,6 @@ static int cpu_smpboot_alloc(unsigned in
>  {
>      unsigned int order;
>      struct desc_struct *gdt;
> -#ifdef __x86_64__
> -    struct page_info *page;
> -#endif
> =20
>      stack_base[cpu] =3D alloc_xenheap_pages(STACK_ORDER, 0);
>      if ( stack_base[cpu] =3D=3D NULL )
> @@ -679,41 +671,28 @@ static int cpu_smpboot_alloc(unsigned in
>      memguard_guard_stack(stack_base[cpu]);
> =20
>      order =3D get_order_from_pages(NR_RESERVED_GDT_PAGES);
> -#ifdef __x86_64__
> -    page =3D alloc_domheap_pages(NULL, order,
> -                               MEMF_node(cpu_to_node(cpu)));
> -    if ( !page )
> +    per_cpu(gdt_table, cpu) =3D gdt =3D
> +        alloc_xenheap_pages(order, MEMF_node(cpu_to_node(cpu)));
> +    if ( gdt =3D=3D NULL )
>          goto oom;
> -    per_cpu(compat_gdt_table, cpu) =3D gdt =3D page_to_virt(page);
> -    memcpy(gdt, boot_cpu_compat_gdt_table,
> -           NR_RESERVED_GDT_PAGES * PAGE_SIZE);
> -    gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a =3D cpu;
> -    page =3D alloc_domheap_pages(NULL, order,
> -                               MEMF_node(cpu_to_node(cpu)));
> -    if ( !page )
> -        goto oom;
> -    per_cpu(gdt_table, cpu) =3D gdt =3D page_to_virt(page);
> -    order =3D get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
> -    page =3D alloc_domheap_pages(NULL, order,
> -                               MEMF_node(cpu_to_node(cpu)));
> -    if ( !page )
> -        goto oom;
> -    idt_tables[cpu] =3D page_to_virt(page);
> -#else
> -    per_cpu(gdt_table, cpu) =3D gdt =3D alloc_xenheap_pages(order, 0);
> -    if ( !gdt )
> -        goto oom;
> -    idt_tables[cpu] =3D xmalloc_array(idt_entry_t, IDT_ENTRIES);
> -    if ( idt_tables[cpu] =3D=3D NULL )
> -        goto oom;
> -#endif
> -    memcpy(gdt, boot_cpu_gdt_table,
> -           NR_RESERVED_GDT_PAGES * PAGE_SIZE);
> +    memcpy(gdt, boot_cpu_gdt_table, NR_RESERVED_GDT_PAGES * PAGE_SIZE);
>      BUILD_BUG_ON(NR_CPUS > 0x10000);
>      gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a =3D cpu;
> =20
> -    memcpy(idt_tables[cpu], idt_table,
> -           IDT_ENTRIES*sizeof(idt_entry_t));
> +#ifdef __x86_64__
> +    per_cpu(compat_gdt_table, cpu) =3D gdt =3D
> +        alloc_xenheap_pages(order, MEMF_node(cpu_to_node(cpu)));
> +    if ( gdt =3D=3D NULL )
> +        goto oom;
> +    memcpy(gdt, boot_cpu_compat_gdt_table, NR_RESERVED_GDT_PAGES *
> PAGE_SIZE);
> +    gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a =3D cpu;
> +#endif
> +
> +    order =3D get_order_from_bytes(IDT_ENTRIES * sizeof(idt_entry_t));
> +    idt_tables[cpu] =3D alloc_xenheap_pages(order,
> MEMF_node(cpu_to_node(cpu)));
> +    if ( idt_tables[cpu] =3D=3D NULL )
> +        goto oom;
> +    memcpy(idt_tables[cpu], idt_table, IDT_ENTRIES * sizeof(idt_entry_t)=
);
> =20
>      return 0;
> =20
>=20
>> Anyway, despite all this...
>>=20
>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>=20
>> Acked-by: Keir Fraser <keir@xen.org>
>>=20
>>> --- a/xen/arch/x86/smpboot.c
>>> +++ b/xen/arch/x86/smpboot.c
>>> @@ -639,9 +639,6 @@ static void cpu_smpboot_free(unsigned in
>>>  {
>>>      unsigned int order;
>>> =20
>>> -    xfree(idt_tables[cpu]);
>>> -    idt_tables[cpu] =3D NULL;
>>> -
>>>      order =3D get_order_from_pages(NR_RESERVED_GDT_PAGES);
>>>  #ifdef __x86_64__
>>>      if ( per_cpu(compat_gdt_table, cpu) )
>>> @@ -650,10 +647,15 @@ static void cpu_smpboot_free(unsigned in
>>>          free_domheap_pages(virt_to_page(per_cpu(compat_gdt_table, =
cpu)),
>>>                             order);
>>>      per_cpu(compat_gdt_table, cpu) =3D NULL;
>>> +    order =3D get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables))=
;
>>> +    if ( idt_tables[cpu] )
>>> +        free_domheap_pages(virt_to_page(idt_tables[cpu]), order);
>>>  #else
>>>      free_xenheap_pages(per_cpu(gdt_table, cpu), order);
>>> +    xfree(idt_tables[cpu]);
>>>  #endif
>>>      per_cpu(gdt_table, cpu) =3D NULL;
>>> +    idt_tables[cpu] =3D NULL;
>>> =20
>>>      if ( stack_base[cpu] !=3D NULL )
>>>      {
>>> @@ -691,19 +693,25 @@ static int cpu_smpboot_alloc(unsigned in
>>>      if ( !page )
>>>          goto oom;
>>>      per_cpu(gdt_table, cpu) =3D gdt =3D page_to_virt(page);
>>> +    order =3D get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables))=
;
>>> +    page =3D alloc_domheap_pages(NULL, order,
>>> +                               MEMF_node(cpu_to_node(cpu)));
>>> +    if ( !page )
>>> +        goto oom;
>>> +    idt_tables[cpu] =3D page_to_virt(page);
>>>  #else
>>>      per_cpu(gdt_table, cpu) =3D gdt =3D alloc_xenheap_pages(order, =
0);
>>>      if ( !gdt )
>>>          goto oom;
>>> +    idt_tables[cpu] =3D xmalloc_array(idt_entry_t, IDT_ENTRIES);
>>> +    if ( idt_tables[cpu] =3D=3D NULL )
>>> +        goto oom;
>>>  #endif
>>>      memcpy(gdt, boot_cpu_gdt_table,
>>>             NR_RESERVED_GDT_PAGES * PAGE_SIZE);
>>>      BUILD_BUG_ON(NR_CPUS > 0x10000);
>>>      gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a =3D cpu;
>>> =20
>>> -    idt_tables[cpu] =3D xmalloc_array(idt_entry_t, IDT_ENTRIES);
>>> -    if ( idt_tables[cpu] =3D=3D NULL )
>>> -        goto oom;
>>>      memcpy(idt_tables[cpu], idt_table,
>>>             IDT_ENTRIES*sizeof(idt_entry_t));
>>> =20
>>>=20
>>>=20
>>>=20
>>>=20
>>> _______________________________________________
>>> Xen-devel mailing list
>>> Xen-devel@lists.xensource.com=20
>>> http://lists.xensource.com/xen-devel=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 Thu Oct 13 05:16:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 05:16:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REKDB-0005bQ-NF; Thu, 13 Oct 2011 05:16:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REKBA-0004v7-LM
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 05:14:29 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318508050!44098227!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2677 invoked from network); 13 Oct 2011 12:14:11 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-13.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 13 Oct 2011 12:14:11 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1318508064; l=1417;
	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=0qHq/m0HXp1r4nKWmIJLlw79zpM=;
	b=xAOuxUKw346DOy6ox3zFdwryb/rWH3QGIfFfcvJwz3MZumpTPhGt40jyy7DA7Is5XcC
	1KGQoWbw7+MoRn+zzazm+DHJM931rZtdRdAJW64rDb+LNb6D2YkdUGuYL1l49eZXp033C
	jTAubU9ty7LhptCIzCvc/OcEzFMWZwwz7Kg=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjDQQEk7YYg==
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-127-199.pools.arcor-ip.net [88.65.127.199])
	by smtp.strato.de (fruni mo49) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id Y04d4fn9DAqBWn ;
	Thu, 13 Oct 2011 14:14:03 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 108C918B65; Thu, 13 Oct 2011 14:14:02 +0200 (CEST)
Date: Thu, 13 Oct 2011 14:14:02 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Tim Deegan <tim@xen.org>
Subject: Re: [Xen-devel] [PATCH] xenpaging: check p2mt in p2m_mem_paging
	functions
Message-ID: <20111013121402.GA20431@aepfle.de>
References: <bc64a435d572680efb22.1318336951@probook.site>
	<20111013112755.GE44937@ocelot.phlegethon.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <20111013112755.GE44937@ocelot.phlegethon.org>
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 Thu, Oct 13, Tim Deegan wrote:

> Hi, 
> 
> At 14:42 +0200 on 11 Oct (1318344151), Olaf Hering wrote:
> > @@ -897,9 +903,16 @@ void p2m_mem_paging_resume(struct domain
> >      {
> >          p2m_lock(p2m);
> >          mfn = p2m->get_entry(p2m, rsp.gfn, &p2mt, &a, p2m_query, NULL);
> > -        set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
> > -        set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
> > -        audit_p2m(p2m, 1);
> > +        /* 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 ) )
> 
> Wouldn't a nominated-but-not-evicted page have type p2m_ram_paging_out?

Yes, but in the page-in path it will be p2m_ram_paging_in_start with a
valid mfn.

> > +        {
> > +            set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
> > +            set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
> > +            audit_p2m(p2m, 1);
> > +        /* May be called more than once if the gfn was populate from different vcpus */
> > +        } else if ( p2mt != p2m_ram_rw ) {
> > +            printk("resume: %d %lx %x %lx\n", d->domain_id, rsp.gfn, p2mt, mfn_x(mfn));
> 
> This should be a gdprintk of some kind, probably XENLOG_WARNING unless
> it happens a lot. 

Its just debug, perhaps that gfn was already use for something else
while the pager processed multiple page-in requests from different
vcpus.

Do you want me to resend this patch?

Olaf

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 05:18:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 05:18:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REKF1-00062T-3O; Thu, 13 Oct 2011 05:18:27 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REKES-0005pQ-DE
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 05:17:52 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1318508269!35117154!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23305 invoked from network); 13 Oct 2011 12:17:49 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 12:17:49 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 13:17:48 +0100
Message-Id: <4E96F30C020000780005B298@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 13:17:48 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "George Dunlap" <George.Dunlap@eu.citrix.com>, "Keir Fraser" <keir@xen.org>
Subject: Re: [Xen-devel] credit2 data structures
References: <CAFLBxZaHwav97=PVvZDTKzBVaeGc9FYh4xs9mj3cC=WbEzTZtw@mail.gmail.com>
	<CABC82C7.329CD%keir@xen.org>
In-Reply-To: <CABC82C7.329CD%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 13.10.11 at 12:57, Keir Fraser <keir@xen.org> wrote:
> On 13/10/2011 11:11, "George Dunlap" <George.Dunlap@eu.citrix.com> =
wrote:
>=20
>> For one thing, the number of runqueues in credit2 is actually meant to
>> be smaller than the number of logical cpus -- it's meant to be one per
>> L2 cache, which should have between 2 and 8 logical cpus, depending on
>> the architecture.  I just put NR_CPUS because it was easier to get
>> working.  Making that an array of pointers, which is allocated on an
>> as-needed basis, should reduce that requirement a great deal.
>=20
> That would suffice. If we can put per-cpu stuff in the per_cpu() data =
area
> then even better.

That might not be possible, as there can be more than one instance of
that scheduler.

> The fact that credit2 burns a couple of kB per CPU isn't a
> problem at all, as long as it does it only for active CPUs.

Fully agree.

Jan


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 05:23:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 05:23:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REKJP-0006Ul-Tk; Thu, 13 Oct 2011 05:22:59 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REKIU-0006GH-BM
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 05:22:02 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1318508517!35118111!1
X-Originating-IP: [216.32.181.182]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9077 invoked from network); 13 Oct 2011 12:21:58 -0000
Received: from ch1ehsobe002.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.182)
	by server-11.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	13 Oct 2011 12:21:58 -0000
Received: from mail87-ch1-R.bigfish.com (10.43.68.254) by
	CH1EHSOBE013.bigfish.com (10.43.70.63) with Microsoft SMTP Server id
	14.1.225.22; Thu, 13 Oct 2011 12:21:57 +0000
Received: from mail87-ch1 (localhost.localdomain [127.0.0.1])	by
	mail87-ch1-R.bigfish.com (Postfix) with ESMTP id 6E029C40068;
	Thu, 13 Oct 2011 12:21:57 +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 mail87-ch1 (localhost.localdomain [127.0.0.1]) by mail87-ch1
	(MessageSwitch) id 1318508517297540_22713;
	Thu, 13 Oct 2011 12:21:57 +0000 (UTC)
Received: from CH1EHSMHS017.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.241])	by mail87-ch1.bigfish.com (Postfix) with ESMTP id
	444C21580052;	Thu, 13 Oct 2011 12:21:57 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS017.bigfish.com (10.43.70.17) with Microsoft SMTP Server id
	14.1.225.22; Thu, 13 Oct 2011 12:21:53 +0000
X-WSS-ID: 0LT07OD-02-JDZ-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 2F8CFC811C;	Thu, 13 Oct 2011 07:21:48 -0500 (CDT)
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;
	Thu, 13 Oct 2011 07:22:05 -0500
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;
	Thu, 13 Oct 2011 07:21:51 -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, 13 Oct 2011
	08:21:50 -0400
Message-ID: <4E96D7DC.8010807@amd.com>
Date: Thu, 13 Oct 2011 14:21:48 +0200
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] why xen use x86_emulation() in page_fault
References: <CADWh-PE3tdCP5UshkwH0VX9J0aJaxBLfQdiN1u9WF+Q--x4ejA@mail.gmail.com>	<20111011081829.GB88076@ocelot.phlegethon.org>	<CADWh-PGgZ1imeq5Zf4ngwPsLXw3nb2jrExEcSDVkFZT5UWggmg@mail.gmail.com>	<20111011112900.GF88076@ocelot.phlegethon.org>	<CADWh-PFLM4ngx9Nyje1r2kpjaEgBRUQhQ01MDV1Lj0C5jtTJHQ@mail.gmail.com>	<20111011122107.GG88076@ocelot.phlegethon.org>	<CADWh-PFDKaSQa39hG8bf_Son1bRtv51G1zcQfeqk4wSQCmT5pQ@mail.gmail.com>
	<20111013114752.GG44937@ocelot.phlegethon.org>
In-Reply-To: <20111013114752.GG44937@ocelot.phlegethon.org>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: cc Luit <universalbillow@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 10/13/11 13:47, Tim Deegan wrote:
> At 21:07 +0800 on 11 Oct (1318367233), cc Luit wrote:
>>>> Why don't you just use EPT/NPT instead of shadow pagetables?  That code
>>>> is a lot simpler and the end result is easier to validate than shadow
>>>> pagetables are.  Is it particularly important to support shadow
>>> pagetables?
>>>
>> yeah, we have consider that, and of course the EPT is much more convenient,
>> BTW, do you know is there any simulator that can well support EPT of xen?
>> the shadow page's problem is a little relevent to the selection of
>> simulator~
>
> There's experimental support in Xen itself for running a hypervisor
> inside a HVM guest.  On AMD, that includes (and indeed requires) NPT in
> the guest hypervisor.

Not quite right: guest hypervisor can use NPT but this is not required.
It may use shadow paging. But an AMD cpu with NPT capability is
required since shadow-on-shadow is not supported.

 >  Unfortunately, on Intel it does not include EPT.
>
> There may be some other simulators that have EPT/NPT - I don't know.
>
> Cheers,
>
> Tim.


-- 
---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 Oct 13 05:24:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 05:24:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REKKY-0006si-07; Thu, 13 Oct 2011 05:24:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REKJY-0006Wb-JE
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 05:23:09 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318508585!876171!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23284 invoked from network); 13 Oct 2011 12:23:05 -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;
	13 Oct 2011 12:23:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,340,1315180800"; 
   d="scan'208";a="8370373"
Received: from lonpmailmx02.citrite.net ([10.30.203.163])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 12:22:57 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.161]) by
	LONPMAILMX02.citrite.net ([10.30.203.163]) with mapi; Thu, 13 Oct 2011
	13:22:57 +0100
From: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Date: Thu, 13 Oct 2011 13:23:42 +0100
Subject: Re: [Xen-devel] [PATCH 1 of 6] [OCAML] Rename the ocaml libraries
Thread-Topic: [Xen-devel] [PATCH 1 of 6] [OCAML] Rename the ocaml libraries
Thread-Index: AcyJotdonmlkEOTEQEKHTgyYTFAwtg==
Message-ID: <9A6470A5-458E-49EF-A1AF-CB80120D94DB@eu.citrix.com>
References: <patchbomb.1317983158@snoosnoo2.uk.xensource.com>
	<ffbc5e9929d52531a9ec.1317983159@snoosnoo2.uk.xensource.com>
	<1318496205.21903.799.camel@zakaz.uk.xensource.com>
In-Reply-To: <1318496205.21903.799.camel@zakaz.uk.xensource.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

They are slightly different from the current rules; the idea is to pack the=
 already compiled cmx files into another cmx file, but in principle we coul=
d add these rules into the generic Makefile.rules to avoid some duplication=
.

I thought about making a new template for packed libs, but that seemed a bi=
t overkill.

Jon

Sent from my iPad

On 13 Oct 2011, at 09:56, "Ian Campbell" <Ian.Campbell@citrix.com> wrote:

> Bit late but:
>=20
> On Fri, 2011-10-07 at 11:25 +0100, Jon Ludlam wrote:
>> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xb/Makefile
>> --- a/tools/ocaml/libs/xb/Makefile
>> +++ b/tools/ocaml/libs/xb/Makefile
>> @@ -25,22 +26,30 @@
> [...]
>> +xenbus.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
>> +       $(E) " CMX       $@"
>> +       $(OCAMLOPT) -pack -o $@ $^
>> +
>> +xenbus.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
>> +       $(E) " CMO       $@"
>> +       $(OCAMLC) -pack -o $@ $^
>> [...]
>> diff -r 3d1664cc9e45 -r ffbc5e9929d5 tools/ocaml/libs/xs/Makefile
>> --- a/tools/ocaml/libs/xs/Makefile
>> +++ b/tools/ocaml/libs/xs/Makefile
>> @@ -20,18 +21,27 @@
> [...]
>> +xenstore.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
>> +       $(E) " CMX      $@"
>> +       $(Q)$(OCAMLOPT) -pack -o $@ $^
>> +
>> +xenstore.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
>> +       $(E) " CMO      $@"
>> +       $(Q)$(OCAMLC) -pack -o $@ $^
>> +
>=20
> These can't use the generic rules in tools/ocaml/Makefile.rules?
>=20
> I noticed because:
>=20
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1318496187 -3600
> # Node ID 333fef90be8250379c294daf15d12b234d95f824
> # Parent  9738d92a3625d6b6b3c49badc0ca9e95a67b2bbd
> ocaml: align build output
>=20
> Fix:
> MLI       op.mli
> MLI      op.cmi
> MLI       partial.mli
> MLI      partial.cmi
> MLI       packet.mli
>=20
>=20
> Signed-off-by: Ian Cmpabell <ian.campbell@citrix.com>
>=20
> diff -r 9738d92a3625 -r 333fef90be82 tools/ocaml/libs/xb/Makefile
> --- a/tools/ocaml/libs/xb/Makefile    Thu Oct 13 09:45:09 2011 +0100
> +++ b/tools/ocaml/libs/xb/Makefile    Thu Oct 13 09:56:27 2011 +0100
> @@ -31,15 +31,15 @@ xenbus_C_OBJS =3D xs_ring_stubs xenbus_stu
> OCAML_LIBRARY =3D xenbus
>=20
> xenbus.cmx : $(foreach obj, $(OBJS), $(obj).cmx)
> -    $(E) " CMX       $@"
> +    $(E) " CMX      $@"
>    $(OCAMLOPT) -pack -o $@ $^
>=20
> xenbus.cmo : $(foreach obj, $(OBJS), $(obj).cmo)
> -    $(E) " CMO       $@"
> +    $(E) " CMO      $@"
>    $(OCAMLC) -pack -o $@ $^
>=20
> %.mli: %.ml
> -    $(E) " MLI       $@"
> +    $(E) " MLI      $@"
>    $(Q)$(OCAMLC) $(OCAMLINCLUDE) -i $< $o
>=20
> .PHONY: install
>=20
>=20

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 05:25:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 05:25:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REKLT-0007G4-NP; Thu, 13 Oct 2011 05:25:07 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REKKe-0006to-FK
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 05:24:16 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318508653!21452492!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31850 invoked from network); 13 Oct 2011 12:24:13 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 12:24:13 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 13:24:12 +0100
Message-Id: <4E96F48A020000780005B2A3@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 13:24:10 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "George Dunlap" <George.Dunlap@eu.citrix.com>
Subject: Re: [Xen-devel] credit2 data structures
References: <4E96CEBD020000780005B151@nat28.tlf.novell.com>
	<CAFLBxZaHwav97=PVvZDTKzBVaeGc9FYh4xs9mj3cC=WbEzTZtw@mail.gmail.com>
In-Reply-To: <CAFLBxZaHwav97=PVvZDTKzBVaeGc9FYh4xs9mj3cC=WbEzTZtw@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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.10.11 at 12:11, George Dunlap <George.Dunlap@eu.citrix.com> =
wrote:
> On Thu, Oct 13, 2011 at 10:42 AM, Jan Beulich <JBeulich@suse.com> wrote:
>> Apart from the possibility of allocating the arrays (and maybe also the
>> cpumask_t-s) separately (for which I can come up with a patch on top
>> of what I' currently putting together) - is it really necessary to have
>> all these, the more that there can be multiple instances of the =
structure
>> with CPU pools?
>=20
> I'm not quite sure what it is that you're asking.  Do you mean, are
> all of the things in each runqueue structure necessary?  Specifically,
> I guess, the cpumask_t structures (because the rest of the structure
> isn't significantly larger than the per-cpu structure for credit1)?

No, it's really the NR_CPUS-sized array of struct csched_runqueue_data.
Credit1 otoh has *no* NR_CPUS sized arrays at all.

> At first blush, all of those cpu masks are necessary.  The assignment
> of cpus to runqueues may be arbitrary, so we need a cpu mask for that.
>  In theory, "idle" and "tickled" only need bits for the cpus actually
> assigned to this runqueue (which should be 2-8 under normal
> circumstances).  But then we would need some kind of mechanism to
> translate "mask just for these cpus" to "mask of all cpus" in order to
> use the normal cpumask mechanisms, which seems like a lot of extra
> complexity just to save a few bytes.  Surely a system with 4096
> logical cpus can afford 6 megabytes of memory for scheduling?

I'm not concerned about the total amount if run on a system that
large. I'm more concerned about this being a single chunk (possibly
allocated post-boot, where we're really aiming at having no
allocations larger than a page at all) and this size being allocated
even when running on a much smaller system (i.e. depending only
on compile time parameters).

> For one thing, the number of runqueues in credit2 is actually meant to
> be smaller than the number of logical cpus -- it's meant to be one per
> L2 cache, which should have between 2 and 8 logical cpus, depending on
> the architecture.  I just put NR_CPUS because it was easier to get
> working.  Making that an array of pointers, which is allocated on an
> as-needed basis, should reduce that requirement a great deal.

That would help, but would probably not suffice (since a NR_CPUS
sized array of pointers is still going to be larger than a page). We
may need to introduce dynamic per-CPU data allocation for this...

Jan


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 05:34:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 05:34:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REKUi-0007zJ-5r; Thu, 13 Oct 2011 05:34:40 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REKUA-0007nH-Pq
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 05:34:07 -0700
X-Env-Sender: Philippe.Simonet@swisscom.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1318509243!20989794!1
X-Originating-IP: [193.222.81.100]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21933 invoked from network); 13 Oct 2011 12:34:03 -0000
Received: from outmail100.swisscom.com (HELO mail.swisscom.com)
	(193.222.81.100)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 12:34:03 -0000
Received: by mail.swisscom.com; Thu, 13 Oct 2011 14:34:03 +0200
From: <Philippe.Simonet@swisscom.com>
To: <xen-devel@lists.xensource.com>
Thread-Topic: openvswitch and vlan, big size packets dropped
Thread-Index: AcyJo8b3aIBiG2XRSfWRRq9Tv0SKNg==
Date: Thu, 13 Oct 2011 12:34:02 +0000
Message-ID: <FF93AF260AC2BB499A119CC65B092CF73116D01E@sg000713.corproot.net>
Accept-Language: en-US, de-CH
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
x-originating-ip: [10.65.122.32]
MIME-Version: 1.0
Subject: [Xen-devel] openvswitch and vlan, big size packets dropped
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0391459042=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0391459042==
Content-Language: en-US
Content-Type: multipart/alternative;
	boundary="_000_FF93AF260AC2BB499A119CC65B092CF73116D01Esg000713corproo_"

--_000_FF93AF260AC2BB499A119CC65B092CF73116D01Esg000713corproo_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Hi

i have the following setting :

xen-hypervisor-4.1-amd64                  4.1.1-2
linux-image-3.0.0-1-amd64                 3.0.0-3  as dom0

network(cisco switch,mode trunk) ---- eth10 (dom0 phys) ---- xbr10 ---- vif=
32.0 ---- eth0(domu)
eth10 is connect on a cisco switch, 802.1q trunk, with 5 vlans (10,20,30,40=
,50)

I use openvswitch to build the bridge, like that :

ovs-vsctl add-br xbr10
ovs-vsctl add-port xbr10 eth10

I use following script as vif-bridge :
http://dev.slackverse.org/slackbuilds/13.37/openvswitch/xen/vif-openvswitch

and following config in my cfg :

vif             =3D [
                        'bridge=3Dxbr10.10',
                ]

all is working well, but packst of bigger size as 1468 bytes (based on ping=
 -s 1468)
are dropped (somewhere), in fact tcpdump on domu indicates that only the
last fragmented packet  is arriving, other not.

8: eth10: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc mq state=
 UP qlen 1000
    link/ether f4:ce:46:a5:79:0a brd ff:ff:ff:ff:ff:ff
75: xbr10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state U=
NKNOWN
    link/ether f4:ce:46:a5:79:0a brd ff:ff:ff:ff:ff:ff
92: vif32.0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast st=
ate UP qlen 32
    link/ether fe:ff:ff:ff:ff:ff brd ff:ff:ff:ff:ff:ff

any suggestions ?

thanks and regards

Philippe



--_000_FF93AF260AC2BB499A119CC65B092CF73116D01Esg000713corproo_
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:x=3D"urn:schemas-microsoft-com:office:excel" xmlns:m=3D"http://schema=
s.microsoft.com/office/2004/12/omml" xmlns=3D"http://www.w3.org/TR/REC-html=
40">
<head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dus-ascii"=
>
<meta name=3D"Generator" content=3D"Microsoft Word 14 (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:0cm;
	margin-bottom:.0001pt;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-fareast-language:EN-US;}
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;
	font-family:"Calibri","sans-serif";
	mso-fareast-language:EN-US;}
@page WordSection1
	{size:612.0pt 792.0pt;
	margin:70.85pt 70.85pt 70.85pt 70.85pt;}
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=3D"FR-CH" link=3D"blue" vlink=3D"purple">
<div class=3D"WordSection1">
<p class=3D"MsoNormal">Hi<o:p></o:p></p>
<p class=3D"MsoNormal"><o:p>&nbsp;</o:p></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">i have the following setting&nb=
sp;: <o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">xen-hypervisor-4.1-amd64&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp; 4.1.1-2<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">linux-image-3.0.0-1-amd64&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp; 3.0.0-3&nbsp; as dom0<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">network(cisco switch,mode trunk=
) ---- eth10 (dom0 phys) ---- xbr10 ---- vif32.0 ---- eth0(domu)<o:p></o:p>=
</span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">eth10 is connect on a cisco swi=
tch, 802.1q trunk, with 5 vlans (10,20,30,40,50)<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">I use openvswitch to build the =
bridge, like that :
<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">ovs-vsctl add-br xbr10<o:p></o:=
p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">ovs-vsctl add-port xbr10 eth10<=
o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">I use following script as vif-b=
ridge : <o:p>
</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><a href=3D"http://dev.slackvers=
e.org/slackbuilds/13.37/openvswitch/xen/vif-openvswitch">http://dev.slackve=
rse.org/slackbuilds/13.37/openvswitch/xen/vif-openvswitch</a><o:p></o:p></s=
pan></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">and following config in my cfg =
: <o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">vif&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =3D [ <o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'bridge=3Dxbr10.10',<o:p></o:p></span=
></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]<o:p></o:p></s=
pan></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">all is working well, but packst=
 of bigger size as 1468 bytes (based on ping &#8211;s 1468)<o:p></o:p></spa=
n></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">are dropped (somewhere), in fac=
t tcpdump on domu indicates that only the
<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">last fragmented packet&nbsp; is=
 arriving, other not.<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">8: eth10: &lt;BROADCAST,MULTICA=
ST,PROMISC,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP qlen 1000<o:p></o:p><=
/span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp; link/ether f=
4:ce:46:a5:79:0a brd ff:ff:ff:ff:ff:ff<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">75: xbr10: &lt;BROADCAST,MULTIC=
AST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UNKNOWN
<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp;&nbsp;link/et=
her f4:ce:46:a5:79:0a brd ff:ff:ff:ff:ff:ff<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">92: vif32.0: &lt;BROADCAST,MULT=
ICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 32<o:p></o:p>=
</span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">&nbsp;&nbsp;&nbsp; link/ether f=
e:ff:ff:ff:ff:ff brd ff:ff:ff:ff:ff:ff<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">any suggestions ?<o:p></o:p></s=
pan></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">thanks and regards<o:p></o:p></=
span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US">Philippe<o:p></o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
<p class=3D"MsoNormal"><span lang=3D"EN-US"><o:p>&nbsp;</o:p></span></p>
</div>
</body>
</html>

--_000_FF93AF260AC2BB499A119CC65B092CF73116D01Esg000713corproo_--


--===============0391459042==
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

--===============0391459042==--


From xen-devel-bounces@lists.xensource.com Thu Oct 13 05:55:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 05:55:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REKod-0000WZ-GH; Thu, 13 Oct 2011 05:55:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REKnq-0000IB-Gb
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 05:54:26 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1318510463!22021429!1
X-Originating-IP: [80.70.172.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15820 invoked from network); 13 Oct 2011 12:54:23 -0000
Received: from dgate10.ts.fujitsu.com (HELO dgate10.ts.fujitsu.com)
	(80.70.172.49)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 12:54:23 -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=sfipYv3unIkSL5khOf6JwgRVpyezROGKWRSony+UQfWKL+Bew50UfyFa
	rllL4RxbJ3amJyXzd7QwUh+SevR2FHTdBrq4QiLgJxDrJCum5UKU4byGR
	DosfL75rslyOZzhCcETYJ46YJDD2L1hQntX6xTlCKLIxvL7iLkUAfd2oS
	Ir3ixja3mqII2apxW+4CldPnBRGWmF1AIxqn2a90sJQ2mN9w9kfA5UYRf
	Bnze2sB6cpkUnHjRmQpOka1lwLvr9;
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=1318510463; x=1350046463;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=NLiR2f9xS4ZIwF76fuUkWmmqLZiPdJWF58G0+bkS7uE=;
	b=mjrtm8bmPF9mFYU9G/SZxUyhvCsyg3FnBpNTMQIelS2mX83uTigAWU99
	iO+XQ/soAcH7fCwD3e5zrc7PtrlhHHummP1jjfjVjmHTP67OHE3+br3Dj
	ca8KkW+oVmY5YDCJmA/FIMGhi9rQYYZAYkRhOGueB+63S/bdNoYSXj2Gd
	bFSSC7luvWODlczIwCH9tQnaPNY04sZ2uazC9hRv/H/jpHUscd7UAptZC
	CzG38LwH2NaVllYORBx9EIOn3I9DZ;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,339,1315173600"; d="scan'208";a="90159576"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate10u.abg.fsc.net with ESMTP; 13 Oct 2011 14:54:19 +0200
X-IronPort-AV: E=Sophos;i="4.69,339,1315173600"; d="scan'208";a="121707519"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 13 Oct 2011 14:54:19 +0200
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 7194E95A0C1;
	Thu, 13 Oct 2011 14:54:19 +0200 (CEST)
Message-ID: <4E96DF7B.5060502@ts.fujitsu.com>
Date: Thu, 13 Oct 2011 14:54:19 +0200
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.21) Gecko/20110831 Iceowl/1.0b2 Icedove/3.1.13
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] credit2 data structures
References: <4E96CEBD020000780005B151@nat28.tlf.novell.com>	<CAFLBxZaHwav97=PVvZDTKzBVaeGc9FYh4xs9mj3cC=WbEzTZtw@mail.gmail.com>
	<4E96F48A020000780005B2A3@nat28.tlf.novell.com>
In-Reply-To: <4E96F48A020000780005B2A3@nat28.tlf.novell.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: George Dunlap <George.Dunlap@eu.citrix.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 10/13/2011 02:24 PM, Jan Beulich wrote:
>>>> On 13.10.11 at 12:11, George Dunlap<George.Dunlap@eu.citrix.com>  wrote:
>> On Thu, Oct 13, 2011 at 10:42 AM, Jan Beulich<JBeulich@suse.com>  wrote:
>>> Apart from the possibility of allocating the arrays (and maybe also the
>>> cpumask_t-s) separately (for which I can come up with a patch on top
>>> of what I' currently putting together) - is it really necessary to have
>>> all these, the more that there can be multiple instances of the structure
>>> with CPU pools?
>> I'm not quite sure what it is that you're asking.  Do you mean, are
>> all of the things in each runqueue structure necessary?  Specifically,
>> I guess, the cpumask_t structures (because the rest of the structure
>> isn't significantly larger than the per-cpu structure for credit1)?
> No, it's really the NR_CPUS-sized array of struct csched_runqueue_data.
> Credit1 otoh has *no* NR_CPUS sized arrays at all.
>
>> At first blush, all of those cpu masks are necessary.  The assignment
>> of cpus to runqueues may be arbitrary, so we need a cpu mask for that.
>>   In theory, "idle" and "tickled" only need bits for the cpus actually
>> assigned to this runqueue (which should be 2-8 under normal
>> circumstances).  But then we would need some kind of mechanism to
>> translate "mask just for these cpus" to "mask of all cpus" in order to
>> use the normal cpumask mechanisms, which seems like a lot of extra
>> complexity just to save a few bytes.  Surely a system with 4096
>> logical cpus can afford 6 megabytes of memory for scheduling?
> I'm not concerned about the total amount if run on a system that
> large. I'm more concerned about this being a single chunk (possibly
> allocated post-boot, where we're really aiming at having no
> allocations larger than a page at all) and this size being allocated
> even when running on a much smaller system (i.e. depending only
> on compile time parameters).
>
>> For one thing, the number of runqueues in credit2 is actually meant to
>> be smaller than the number of logical cpus -- it's meant to be one per
>> L2 cache, which should have between 2 and 8 logical cpus, depending on
>> the architecture.  I just put NR_CPUS because it was easier to get
>> working.  Making that an array of pointers, which is allocated on an
>> as-needed basis, should reduce that requirement a great deal.
> That would help, but would probably not suffice (since a NR_CPUS
> sized array of pointers is still going to be larger than a page). We
> may need to introduce dynamic per-CPU data allocation for this...

Couldn't the run-queue data be dynamically allocated and the pcpu-data of
credit2 contain a pointer to it?


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 Thu Oct 13 06:06:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 06:06:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REKzs-00018h-L8; Thu, 13 Oct 2011 06:06:52 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REKxG-0000u9-PL
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 06:04:32 -0700
X-Env-Sender: james.harper@bendigoit.com.au
X-Msg-Ref: server-2.tower-174.messagelabs.com!1318511043!35136909!1
X-Originating-IP: [203.16.207.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8124 invoked from network); 13 Oct 2011 13:04:06 -0000
Received: from smtp2.bendigoit.com.au (HELO smtp2.bendigoit.com.au)
	(203.16.207.99)
	by server-2.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	13 Oct 2011 13:04:06 -0000
Received: from trantor.int.sbss.com.au ([192.168.200.206]
	helo=mail.bendigoit.com.au)
	by smtp2.bendigoit.com.au with esmtp (Exim 4.72)
	(envelope-from <james.harper@bendigoit.com.au>)
	id 1REKx5-0002dt-Uz; Fri, 14 Oct 2011 00:04:00 +1100
Content-class: urn:content-classes:message
MIME-Version: 1.0
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
X-MimeOLE: Produced By Microsoft Exchange V6.5
Subject: RE: [Xen-devel] openvswitch and vlan, big size packets dropped
Date: Fri, 14 Oct 2011 00:03:59 +1100
Message-ID: <AEC6C66638C05B468B556EA548C1A77D01E5E60B@trantor>
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
Thread-Topic: openvswitch and vlan, big size packets dropped
Thread-Index: AcyJo8b3aIBiG2XRSfWRRq9Tv0SKNgABLZFA
From: "James Harper" <james.harper@bendigoit.com.au>
To: <Philippe.Simonet@swisscom.com>,
	<xen-devel@lists.xensource.com>
X-Really-From-Bendigo-IT: magichashvalue
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

> all is working well, but packst of bigger size as 1468 bytes (based on
ping -s
> 1468)
>=20

Increase the MTU on eth10 to 1504.

James


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 06:25:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 06:25:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RELI0-0002Tl-LD; Thu, 13 Oct 2011 06:25:36 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RELGu-0002Gl-Mk
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 06:24:29 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318512265!22173813!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26075 invoked from network); 13 Oct 2011 13:24:25 -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;
	13 Oct 2011 13:24:25 -0000
Received: by wwf27 with SMTP id 27so1412188wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 06:24:25 -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:user-agent:date:from:to;
	bh=CGbvpcpyqRU6ADP/9wglyHrqejnNICAYhLYclJynHt0=;
	b=rZtkvCHrT30sq1lf1oyOMghEw+q+DjqQHTtynoBU4N1H6nMqEe2jcdepEZdEdNaNji
	1lMiWJDRgFyn4xyr8RKU+ROtOmhuJbB0xKvU7xNIkKz9jqhvu2Y/U9TtnTfzXjNeyqoW
	u2UuwRHbsLXWg8edBTOuXmGWR9PzyANCmX3zo=
Received: by 10.227.57.208 with SMTP id d16mr1277952wbh.55.1318512265328;
	Thu, 13 Oct 2011 06:24:25 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id ek13sm5975847wbb.3.2011.10.13.06.24.23
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 13 Oct 2011 06:24:24 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 8fe2ca552de44aa679be3184b1f98f50a00507e2
Message-Id: <8fe2ca552de44aa679be.1318512275@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Thu, 13 Oct 2011 15:24:35 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] tools/check: check for headers and libraries in
 EXTRA_INCLUDES and EXTRA_LIB
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318512213 -7200
# Node ID 8fe2ca552de44aa679be3184b1f98f50a00507e2
# Parent  8d316acde60f93cc8563a3c18950e9cbc3ab7fa8
tools/check: check for headers and libraries in EXTRA_INCLUDES and EXTRA_LIB

Parse EXTRA_INCLUDES and EXTRA_LIB during checks, to search for required files.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 8d316acde60f -r 8fe2ca552de4 tools/check/Makefile
--- a/tools/check/Makefile	Thu Oct 13 13:59:02 2011 +0200
+++ b/tools/check/Makefile	Thu Oct 13 15:23:33 2011 +0200
@@ -7,12 +7,12 @@ 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
+	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) EXTRA_INCLUDES=$(EXTRA_INCLUDES) EXTRA_LIB=$(EXTRA_LIB) ./chk build
 
 # Check this machine is OK for installing on.
 .PHONY: check-install
 check-install:
-	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) ./chk install
+	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) EXTRA_INCLUDES=$(EXTRA_INCLUDES) EXTRA_LIB=$(EXTRA_LIB) ./chk install
 
 .PHONY: clean
 clean:
diff -r 8d316acde60f -r 8fe2ca552de4 tools/check/funcs.sh
--- a/tools/check/funcs.sh	Thu Oct 13 13:59:02 2011 +0200
+++ b/tools/check/funcs.sh	Thu Oct 13 15:23:33 2011 +0200
@@ -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 ${EXTRA_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="$EXTRA_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 Oct 13 06:40:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 06:40:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RELWS-0003C2-1j; Thu, 13 Oct 2011 06:40:32 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RELVq-0002za-IM
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 06:39:54 -0700
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1318513190!35131281!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14734 invoked from network); 13 Oct 2011 13:39:51 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-7.tower-174.messagelabs.com with SMTP;
	13 Oct 2011 13:39:51 -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 p9DDdno2010278
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <xen-devel@lists.xensource.com>; Thu, 13 Oct 2011 09:39:50 -0400
Received: from [10.34.1.169] (dhcp-1-169.brq.redhat.com [10.34.1.169])
	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9DDdmlC024076
	for <xen-devel@lists.xensource.com>; Thu, 13 Oct 2011 09:39:49 -0400
Message-ID: <4E96EA7F.5050309@redhat.com>
Date: Thu, 13 Oct 2011 15:41:19 +0200
From: Laszlo Ersek <lersek@redhat.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.20) Gecko/20110817 Fedora/3.1.12-1.fc14
	Lightning/1.0b3pre Mnenhy/0.8.4 Thunderbird/3.1.12
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
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
Subject: [Xen-devel] domain pause vs. watchdog timer
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

if a domain is paused (= not scheduled), its process that keeps 
otherwise kicking /dev/watchdog and (thusly the hypervisor) "freezes" 
too. Should pausing a domain suspend (or "inactivate") its watchdog_timers?

(I believe this must have been considered and the answer is "you 
shouldn't do that", but a confirmation/refutation would be nice.)

Thanks
L.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 06:47:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 06:47:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RELdN-0003fY-1X; Thu, 13 Oct 2011 06:47:41 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RELcg-0003T5-HS
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 06:46:58 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1318513615!886876!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13558 invoked from network); 13 Oct 2011 13:46:55 -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 Oct 2011 13:46:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,340,1315180800"; 
   d="scan'208";a="8372993"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 13:46: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;
	Thu, 13 Oct 2011 14:46:55 +0100
Subject: Re: [Xen-devel] Front-end back-end connection
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
Date: Thu, 13 Oct 2011 14:46:54 +0100
In-Reply-To: <CAP2B859gKeqycL2TEDbqCnQ-K1QVNn5rMQFuu0b=JWPWe=dH5w@mail.gmail.com>
References: <CAP2B85-UdKBazkis6Ga1QSX=PLfuk_LMLwh1RnQ2oMsi10wvHQ@mail.gmail.com>
	<1318414373.21903.637.camel@zakaz.uk.xensource.com>
	<CAP2B85_zhnY9DVmD3fWE7j2XkHgd8eKiryr8GSLLo8Bm8UHuTw@mail.gmail.com>
	<1318427768.21903.718.camel@zakaz.uk.xensource.com>
	<CAP2B8589fYo-gB_omV5yNKZc_YtK6oTpq06H0V0dCK6ShvrJYw@mail.gmail.com>
	<1318504130.21903.826.camel@zakaz.uk.xensource.com>
	<CAP2B859gKeqycL2TEDbqCnQ-K1QVNn5rMQFuu0b=JWPWe=dH5w@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: <1318513614.21903.850.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-10-13 at 12:31 +0100, Daniel Castro wrote:

> >> struct gnttab_setup_table gst;
> >>       grant_entries = (struct grant_entry_v1 *) get_grant_table();
> >>       gst.dom = DOMID_SELF;
> >>       gst.nr_frames = 1;
> >>       //gst.frame_list = (struct grant_entry_v1 *) grant_entries;
> >
> > This isn't needed? That would surprise me...
> Its part of the " OUT parameters. " in the struct, so I did not fill it out...

Isn't it the buffer to which the out parameters are written?

Maybe since you don't need to remap them in SeaBIOs (since the memory is
already mapped) it's actually irrelevant. On Linux e.g. this array
becomes the parameter to arch_gnttab_map_shared which actually maps the
pages.

> > However for simplicity I would suggest granting a static buffer to the
> > backend and copying from the SeaBIOS buffer to that.
> So would it be better to create another static buffer get a gref for
> it and copy from disk_op_s->buf_fl when reading and copy to when
> writing?

Not necessarily better, but simpler and sufficient for this use since it
avoids having to manage lots of grant references.

> BTW what are segments in SeaBIOS and whats the use for it? in Xen is
> only 32 Bit flat right? so I do not have to use any of the segment
> macros, right?

Segments are an X86-ism. You can find a chapter about that stuff in the
Intel Software Developer's Manual, I think. It's pretty early on.

All the code you are writing in SeaBIOS should, I think, be in the
32-bit flat part of SeaBIOS and so you don't need to worry about that.

Ian.



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 06:53:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 06:53:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RELih-0004tR-Kv; Thu, 13 Oct 2011 06:53:11 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RELi7-0004dw-GW
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 06:52:35 -0700
X-Env-Sender: Philippe.Simonet@swisscom.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318513937!44119014!1
X-Originating-IP: [193.222.81.110]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16250 invoked from network); 13 Oct 2011 13:52:18 -0000
Received: from outmail110.swisscom.com (HELO mail.swisscom.com)
	(193.222.81.110)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 13:52:18 -0000
Received: by mail.swisscom.com; Thu, 13 Oct 2011 15:51:07 +0200
From: <Philippe.Simonet@swisscom.com>
To: <james.harper@bendigoit.com.au>, <xen-devel@lists.xensource.com>
Subject: RE: [Xen-devel] openvswitch and vlan, big size packets dropped
Thread-Topic: [Xen-devel] openvswitch and vlan, big size packets dropped
Thread-Index: AcyJo8b3aIBiG2XRSfWRRq9Tv0SKNgABLZFAAAGm/tA=
Date: Thu, 13 Oct 2011 13:51:06 +0000
Message-ID: <FF93AF260AC2BB499A119CC65B092CF73116D071@sg000713.corproot.net>
References: <AEC6C66638C05B468B556EA548C1A77D01E5E60B@trantor>
In-Reply-To: <AEC6C66638C05B468B556EA548C1A77D01E5E60B@trantor>
Accept-Language: en-US, de-CH
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
x-originating-ip: [10.65.122.32]
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

yes, it worked, many thanks !

> -----Original Message-----
> From: James Harper [mailto:james.harper@bendigoit.com.au]
> Sent: Thursday, October 13, 2011 3:04 PM
> To: Simonet Philippe, ITS-SDL-EIS-CNV-DLE-TLC; xen-
> devel@lists.xensource.com
> Subject: RE: [Xen-devel] openvswitch and vlan, big size packets dropped
>=20
> > all is working well, but packst of bigger size as 1468 bytes (based on
> ping -s
> > 1468)
> >
>=20
> Increase the MTU on eth10 to 1504.
>=20
> James


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 06:55:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 06:55:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RELlM-0005JP-1B; Thu, 13 Oct 2011 06:55:56 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RELkt-00057A-Oj
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 06:55:28 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1318514124!896074!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15986 invoked from network); 13 Oct 2011 13:55:24 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-3.tower-216.messagelabs.com with SMTP;
	13 Oct 2011 13:55:24 -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 p9DDshm5012019
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 09:54:43 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9DDsedd032382; Thu, 13 Oct 2011 09:54:40 -0400
Date: Thu, 13 Oct 2011 09:54:40 -0400
From: Jason Baron <jbaron@redhat.com>
To: Peter Zijlstra <peterz@infradead.org>
Message-ID: <20111013135439.GA2455@redhat.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<16f652166605c973e9817177b6ba6a081e3e5b3f.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<1318501954.24856.5.camel@twins>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318501954.24856.5.camel@twins>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 06/10] jump_label: add
 arch_jump_label_transform_static() to optimise non-live code updates
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 13, 2011 at 12:32:34PM +0200, Peter Zijlstra wrote:
> On Wed, 2011-10-12 at 17:08 -0700, Jeremy Fitzhardinge wrote:
> > From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> > 
> > When updating a newly loaded module, the code is definitely not yet
> > executing on any processor, so it can be updated with no need for any
> > heavyweight synchronization.
> > 
> > This patch adds arch_jump_label_static() which is implemented as
> > arch_jump_label_transform() by default, but architectures can override
> > it if it avoids, say, a call to stop_machine().
> > 
> > Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> > Acked-by: Jason Baron <jbaron@redhat.com>
> > ---
> >  include/linux/jump_label.h |    2 ++
> >  kernel/jump_label.c        |   18 +++++++++++++++---
> >  2 files changed, 17 insertions(+), 3 deletions(-)
> > 
> > diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
> > index 12e804e..56594e4 100644
> > --- a/include/linux/jump_label.h
> > +++ b/include/linux/jump_label.h
> > @@ -45,6 +45,8 @@ extern void jump_label_lock(void);
> >  extern void jump_label_unlock(void);
> >  extern void arch_jump_label_transform(struct jump_entry *entry,
> >  				      enum jump_label_type type);
> > +extern void arch_jump_label_transform_static(struct jump_entry *entry,
> > +					     enum jump_label_type type);
> >  extern int jump_label_text_reserved(void *start, void *end);
> >  extern void jump_label_inc(struct jump_label_key *key);
> >  extern void jump_label_dec(struct jump_label_key *key);
> > diff --git a/kernel/jump_label.c b/kernel/jump_label.c
> > index 059202d5..ff2028f 100644
> > --- a/kernel/jump_label.c
> > +++ b/kernel/jump_label.c
> > @@ -104,6 +104,18 @@ static int __jump_label_text_reserved(struct jump_entry *iter_start,
> >  	return 0;
> >  }
> >  
> > +/* 
> > + * Update code which is definitely not currently executing.
> > + * Architectures which need heavyweight synchronization to modify
> > + * running code can override this to make the non-live update case
> > + * cheaper.
> > + */
> > +void __weak arch_jump_label_transform_static(struct jump_entry *entry,
> > +					    enum jump_label_type type)
> > +{
> > +	arch_jump_label_transform(entry, type);	
> > +}
> > +
> >  static void __jump_label_update(struct jump_label_key *key,
> >  				struct jump_entry *entry,
> >  				struct jump_entry *stop, int enable)
> > @@ -135,8 +147,8 @@ static __init int jump_label_init(void)
> >  		struct jump_label_key *iterk;
> >  
> >  		iterk = (struct jump_label_key *)(unsigned long)iter->key;
> > -		arch_jump_label_transform(iter, jump_label_enabled(iterk) ?
> > -					  JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
> > +		arch_jump_label_transform_static(iter, jump_label_enabled(iterk) ?
> > +						 JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
> >  		if (iterk == key)
> >  			continue;
> >  
> > @@ -208,7 +220,7 @@ void jump_label_apply_nops(struct module *mod)
> >  		return;
> >  
> >  	for (iter = iter_start; iter < iter_stop; iter++)
> > -		arch_jump_label_transform(iter, JUMP_LABEL_DISABLE);
> > +		arch_jump_label_transform_static(iter, JUMP_LABEL_DISABLE);
> >  }
> >  
> 
> So I got myself a little confused wrt the early jump_label_apply_nops()
> call and the MODULE_COMING notifiers.
> 
> It looks to me like jump_label_apply_nops() is called way early and is
> in fact called before _any_ of the module code has had a chance of
> running. However it simply NOPs out all jump_labels.
> 

yes.

> The jump_label_add_module() thing, which is ran on the MODULE_COMING
> callback will then set up stuff and do the proper patch-up.
> 

yes, only for the enabled ones.

> Now the only bit of the module text that can be ran between those two
> calls appears to be the module argument parsing stuff, but since
> jump_labels are non-functional it can't rely on them, so why do we do
> the early patch up again?
> 
> 

The 'early patch' is for putting in the 'ideal' no-ops into the module
code. These 'ideal' no-ops are discovered at run-time, not boot-time.

The code is optimized (hopefully) for the most common case. The
jump labels are by nature expected to be off, and by patching them early
like this, at least for x86, we can avoid the stop machine calls. So its
the combination of most are expected to be off and no sense to call extra
stop machines that lead the code to its present state.

Thanks,

-Jason

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 07:03:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 07:03:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RELsN-0005qW-4N; Thu, 13 Oct 2011 07:03:11 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RELpY-0005bG-5h
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 07:00:30 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1318514411!20355124!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5715 invoked from network); 13 Oct 2011 14:00:11 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-9.tower-182.messagelabs.com with SMTP;
	13 Oct 2011 14:00:11 -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 p9DDxlVo027813
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 09:59:47 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9DDxlHf026049; Thu, 13 Oct 2011 09:59:47 -0400
Date: Thu, 13 Oct 2011 09:59:47 -0400
From: Jason Baron <jbaron@redhat.com>
To: Peter Zijlstra <peterz@infradead.org>
Message-ID: <20111013135945.GB2455@redhat.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<c133180533d7e520bb1e818e987117811a666fbc.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<1318502628.24856.10.camel@twins>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318502628.24856.10.camel@twins>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 10/10] jump-label: initialize
 jump-label subsystem much 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, Oct 13, 2011 at 12:43:48PM +0200, Peter Zijlstra wrote:
> On Wed, 2011-10-12 at 17:08 -0700, Jeremy Fitzhardinge wrote:
> > From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> > 
> > Initialize jump_labels much earlier, we can use them.
> 
> We can use them, where? how? what?, that sentence just begs for more.
> 
> > diff --git a/init/main.c b/init/main.c
> > index 2a9b88a..f4094ed 100644
> > --- a/init/main.c
> > +++ b/init/main.c
> > @@ -637,6 +637,7 @@ asmlinkage void __init start_kernel(void)
> >  	acpi_early_init(); /* before LAPIC and SMP init */
> >  	sfi_init_late();
> >  
> > +	jump_label_init();
> >  	ftrace_init();
> >  
> >  	/* Do the rest non-__init'ed, we're now alive */
> 
> Can we push them much earlier still? If possible I'd like them to be
> before sched_init() so that I might use them there, if not possible, at
> the very least before enabling interrupts would be nice.
> 
> 

Yes, earlier still would be good. Also, it still bothers me a bit that
jump_label_inc()/dec() could be called and the branch not updated until
the jump label initialization. I feel like there should be a WARN() for
this case...ie:

jump_label_inc()/dec() {
	if (!jump_label_initialized)
		WARN("calling branch update before subsystem initialization");
}






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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 07:13:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 07:13:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REM2B-0007h6-8o; Thu, 13 Oct 2011 07:13:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REM1h-0007Uy-AN
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 07:12:51 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1318515164!894630!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13394 invoked from network); 13 Oct 2011 14:12:46 -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; 13 Oct 2011 14:12:46 -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
	p9DECfF9004939
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 14:12:42 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
	p9DECexv003422
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 14:12:41 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
	p9DECZZK017637; Thu, 13 Oct 2011 09:12:35 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 07:12:34 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id A9BA91EA; Thu, 13 Oct 2011 10:12:21 -0400 (EDT)
Date: Thu, 13 Oct 2011 10:12:21 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Message-ID: <20111013141221.GA9820@phenom.oracle.com>
References: <patchbomb.1318457565@localhost6.localdomain6>
	<50850daec7f0486ee7ca.1318457568@localhost6.localdomain6>
	<1318492769.21903.788.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318492769.21903.788.camel@zakaz.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.0A090207.4E96F1DB.0113:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"JBeulich@suse.com" <JBeulich@suse.com>
Subject: [Xen-devel] Re: [PATCH 3 of 3] interface: add 'discard-secure' and
 BLKIF_DISCARD_SECURE
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 13, 2011 at 08:59:28AM +0100, Ian Campbell wrote:
> On Wed, 2011-10-12 at 23:12 +0100, Konrad Rzeszutek Wilk wrote:
> > # HG changeset patch
> > # User Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > # Date 1318457231 14400
> > # Node ID 50850daec7f0486ee7ca69b3d4cb58b4d340a5a7
> > # Parent  15c2d70dbac3e31c2d74b6700e1bb5f8a7d8256e
> > interface: add 'discard-secure' and BLKIF_DISCARD_SECURE
> > 
> > Alter the 'reserved' uint8_t to be used a 'flag'. We use only for
> > one flag: BLKIF_DISCARD_SECURE.
> > 
> > That flag can only be set if the backend has set 'discard-secure' to one.
> > If backend has not set 'discard-secure' to one, that flag will have no
> > effect.
> > 
> > Acked-by: Jan Beulich <JBeulich@suse.com>
> > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > 
> > diff -r 15c2d70dbac3 -r 50850daec7f0 xen/include/public/io/blkif.h
> > --- a/xen/include/public/io/blkif.h	Wed Oct 12 18:07:07 2011 -0400
> > +++ b/xen/include/public/io/blkif.h	Wed Oct 12 18:07:11 2011 -0400
> > @@ -107,7 +107,7 @@
> >   *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
> >   * http://www.seagate.com/staticfiles/support/disc/manuals/
> >   *     Interface%20manuals/100293068c.pdf
> > - * The backend can optionally provide two extra XenBus attributes to
> > + * The backend can optionally provide three extra XenBus attributes to
>                                          these
> 
> avoids patching (or more likely forgetting to patch) this line every
> time we add an attribute.
> 
> >   * further optimize the discard functionality:
> >   * 'discard-aligment' - Devices that support discard functionality may
> >   * internally allocate space in units that are bigger than the exported
> > @@ -119,6 +119,9 @@
> >   * size. The discard-granularity parameter indicates the size of the internal
> >   * allocation unit in bytes if reported by the device. Otherwise the
> >   * discard-granularity will be set to match the device's physical block size.
> > + * 'discard-secure' - All copies of the discarded sectors (potentially created
> > + * by garbage collection) must also be erased.  To use this feature, the flag
> > + * BLKIF_DISCARD_SECURE must be set in the blkif_request_trim.
> 
> Stray "trim" here.

Duh!
> 
> >   */
> >  #define BLKIF_OP_DISCARD           5
> 
> It just occurred to me that if reusing the reserved field is going to
> prove a problem we could have had BLKIF_OP_DISCARD_SECURE. I think we've
> got things under control though.

Yeah, I think the reserved->flag attribute worked out nicely.
> 
> >  
> > @@ -159,7 +162,8 @@ typedef struct blkif_request blkif_reque
> >   */
> >  struct blkif_request_discard {
> >      uint8_t        operation;    /* BLKIF_OP_DISCARD                     */
> > -    uint8_t        reserved;     /*                                      */
> > +    uint8_t        flag;         /* BLKIF_DISCARD_SECURE or zero         */
> > +#define BLKIF_DISCARD_SECURE (1<<0)  /* ignored if discard-secure=0      */
> >      blkif_vdev_t   handle;       /* same as for read/write requests      */
> >      uint64_t       id;           /* private guest value, echoed in resp  */
> >      blkif_sector_t sector_number;/* start sector idx on disk             */
> > 
> > 
> 

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 07:18:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 07:18:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REM75-00088Q-RU; Thu, 13 Oct 2011 07:18:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REM6d-0007vy-9B
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 07:17:55 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318515457!44124799!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8366 invoked from network); 13 Oct 2011 14:17:37 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 14:17:37 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 15:17:51 +0100
Message-Id: <4E970F2E020000780005B2F8@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 15:17:50 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Juergen Gross" <juergen.gross@ts.fujitsu.com>
Subject: Re: [Xen-devel] credit2 data structures
References: <4E96CEBD020000780005B151@nat28.tlf.novell.com>
	<CAFLBxZaHwav97=PVvZDTKzBVaeGc9FYh4xs9mj3cC=WbEzTZtw@mail.gmail.com>
	<4E96F48A020000780005B2A3@nat28.tlf.novell.com>
	<4E96DF7B.5060502@ts.fujitsu.com>
In-Reply-To: <4E96DF7B.5060502@ts.fujitsu.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>,
	"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 13.10.11 at 14:54, Juergen Gross <juergen.gross@ts.fujitsu.com> =
wrote:
> On 10/13/2011 02:24 PM, Jan Beulich wrote:
>>>>> On 13.10.11 at 12:11, George Dunlap<George.Dunlap@eu.citrix.com>  =
wrote:
>>> On Thu, Oct 13, 2011 at 10:42 AM, Jan Beulich<JBeulich@suse.com>  =
wrote:
>>>> Apart from the possibility of allocating the arrays (and maybe also =
the
>>>> cpumask_t-s) separately (for which I can come up with a patch on top
>>>> of what I' currently putting together) - is it really necessary to =
have
>>>> all these, the more that there can be multiple instances of the =
structure
>>>> with CPU pools?
>>> I'm not quite sure what it is that you're asking.  Do you mean, are
>>> all of the things in each runqueue structure necessary?  Specifically,
>>> I guess, the cpumask_t structures (because the rest of the structure
>>> isn't significantly larger than the per-cpu structure for credit1)?
>> No, it's really the NR_CPUS-sized array of struct csched_runqueue_data.
>> Credit1 otoh has *no* NR_CPUS sized arrays at all.
>>
>>> At first blush, all of those cpu masks are necessary.  The assignment
>>> of cpus to runqueues may be arbitrary, so we need a cpu mask for that.
>>>   In theory, "idle" and "tickled" only need bits for the cpus actually
>>> assigned to this runqueue (which should be 2-8 under normal
>>> circumstances).  But then we would need some kind of mechanism to
>>> translate "mask just for these cpus" to "mask of all cpus" in order to
>>> use the normal cpumask mechanisms, which seems like a lot of extra
>>> complexity just to save a few bytes.  Surely a system with 4096
>>> logical cpus can afford 6 megabytes of memory for scheduling?
>> I'm not concerned about the total amount if run on a system that
>> large. I'm more concerned about this being a single chunk (possibly
>> allocated post-boot, where we're really aiming at having no
>> allocations larger than a page at all) and this size being allocated
>> even when running on a much smaller system (i.e. depending only
>> on compile time parameters).
>>
>>> For one thing, the number of runqueues in credit2 is actually meant to
>>> be smaller than the number of logical cpus -- it's meant to be one per
>>> L2 cache, which should have between 2 and 8 logical cpus, depending on
>>> the architecture.  I just put NR_CPUS because it was easier to get
>>> working.  Making that an array of pointers, which is allocated on an
>>> as-needed basis, should reduce that requirement a great deal.
>> That would help, but would probably not suffice (since a NR_CPUS
>> sized array of pointers is still going to be larger than a page). We
>> may need to introduce dynamic per-CPU data allocation for this...
>=20
> Couldn't the run-queue data be dynamically allocated and the pcpu-data =
of
> credit2 contain a pointer to it?

Not if the per-CPU data is also per scheduler instance (which I can't
easily tell whether it is).

Jan


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 07:22:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 07:22:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REMAq-00007W-3P; Thu, 13 Oct 2011 07:22:16 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REMAR-0008Ml-TA
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 07:21:52 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1318515683!39814367!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3668 invoked from network); 13 Oct 2011 14:21:24 -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; 13 Oct 2011 14:21:24 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 15:21:48 +0100
Message-Id: <4E97101A020000780005B303@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 15:21:46 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Laszlo Ersek" <lersek@redhat.com>
Subject: Re: [Xen-devel] domain pause vs. watchdog timer
References: <4E96EA7F.5050309@redhat.com>
In-Reply-To: <4E96EA7F.5050309@redhat.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 13.10.11 at 15:41, Laszlo Ersek <lersek@redhat.com> wrote:
> if a domain is paused (=3D not scheduled), its process that keeps=20
> otherwise kicking /dev/watchdog and (thusly the hypervisor) "freezes"=20
> too. Should pausing a domain suspend (or "inactivate") its watchdog_timer=
s?

I would say yes it should. And you say it doesn't?

> (I believe this must have been considered and the answer is "you=20
> shouldn't do that", but a confirmation/refutation would be nice.)

If a domain gets paused from the tools stack, it's not very reasonable
to expect the operator there to know whether a particular domain
has a watchdog timer activated.

Jan


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 07:28:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 07:28:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REMGn-0000bk-91; Thu, 13 Oct 2011 07:28:25 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REMFz-0000Op-Ck
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 07:27:35 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-6.tower-174.messagelabs.com!1318516051!33024957!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11205 invoked from network); 13 Oct 2011 14:27:32 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-6.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 14:27:32 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1REMFv-000Cs9-BX; Thu, 13 Oct 2011 14:27:31 +0000
Date: Thu, 13 Oct 2011 15:27:31 +0100
From: Tim Deegan <tim@xen.org>
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH] xenpaging: check p2mt in p2m_mem_paging
	functions
Message-ID: <20111013142731.GI44937@ocelot.phlegethon.org>
References: <bc64a435d572680efb22.1318336951@probook.site>
	<20111013112755.GE44937@ocelot.phlegethon.org>
	<20111013121402.GA20431@aepfle.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111013121402.GA20431@aepfle.de>
User-Agent: Mutt/1.4.2.1i
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

At 14:14 +0200 on 13 Oct (1318515242), Olaf Hering wrote:
> On Thu, Oct 13, Tim Deegan wrote:
> 
> > Hi, 
> > 
> > At 14:42 +0200 on 11 Oct (1318344151), Olaf Hering wrote:
> > > @@ -897,9 +903,16 @@ void p2m_mem_paging_resume(struct domain
> > >      {
> > >          p2m_lock(p2m);
> > >          mfn = p2m->get_entry(p2m, rsp.gfn, &p2mt, &a, p2m_query, NULL);
> > > -        set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
> > > -        set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
> > > -        audit_p2m(p2m, 1);
> > > +        /* 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 ) )
> > 
> > Wouldn't a nominated-but-not-evicted page have type p2m_ram_paging_out?
> 
> Yes, but in the page-in path it will be p2m_ram_paging_in_start with a
> valid mfn.

Eurgh.  OK, in that case this comment should probably explain why. :)

> > > +        {
> > > +            set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
> > > +            set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
> > > +            audit_p2m(p2m, 1);
> > > +        /* May be called more than once if the gfn was populate from different vcpus */
> > > +        } else if ( p2mt != p2m_ram_rw ) {
> > > +            printk("resume: %d %lx %x %lx\n", d->domain_id, rsp.gfn, p2mt, mfn_x(mfn));
> > 
> > This should be a gdprintk of some kind, probably XENLOG_WARNING unless
> > it happens a lot. 
> 
> Its just debug, perhaps that gfn was already use for something else
> while the pager processed multiple page-in requests from different
> vcpus.

OK, so should it be removed entirely?

> Do you want me to resend this patch?

Yes, please.

Tim.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 07:33:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 07:33:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REMLg-0001ol-Uk; Thu, 13 Oct 2011 07:33:28 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REMLG-0001bv-Kk
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 07:33:03 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318516377!35150262!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30701 invoked from network); 13 Oct 2011 14:32:59 -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; 13 Oct 2011 14:32:59 -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
	p9DEWr3O025931
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 14:32:55 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
	p9DEWq3T015920
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 14:32:53 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
	p9DEWl51024874; Thu, 13 Oct 2011 09:32:47 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 07:32:47 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id E828A1EA; Thu, 13 Oct 2011 10:32:33 -0400 (EDT)
Date: Thu, 13 Oct 2011 10:32:33 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Message-ID: <20111013143233.GB9820@phenom.oracle.com>
References: <patchbomb.1318457565@localhost6.localdomain6>
	<15c2d70dbac3e31c2d74.1318457567@localhost6.localdomain6>
	<1318492807.21903.789.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318492807.21903.789.camel@zakaz.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.0A090207.4E96F698.00B0:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"JBeulich@suse.com" <JBeulich@suse.com>
Subject: [Xen-devel] Re: [PATCH 2 of 3] interface: Flesh out the
 BLKIF_OP_DISCARD 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

On Thu, Oct 13, 2011 at 09:00:07AM +0100, Ian Campbell wrote:
> Thanks for splitting these out.
> 
> On Wed, 2011-10-12 at 23:12 +0100, Konrad Rzeszutek Wilk wrote:
> [...]
> > + * The backend can optionally provide two extra XenBus attributes to
> > + * further optimize the discard functionality:
> > + * 'discard-aligment' - Devices that support discard functionality may
> > + * internally allocate space in units that are bigger than the exported
> > + * logical block size. The discard-alignment parameter indicates how many bytes
> > + * the beginning of the partition is offset from the internal allocation unit's
> > + * natural alignment.
> 

[note: I copied the Documentation/ABI/testing/sysfs-block contents]

> So this is to account for the case where a physical device can discard
> e.g. 128K blocks at a time but the VBD (a better term than "partition"
> in the context, I think) starts at e.g. offset 64K within that
> underlying device?

Yes. And the tools, such as 'fdisk/gparted' can take advantage of that
and create the partitions^H^H^VBDs at the proper spots.

> 
> Does this mean that the virtual device can discard the first 64K (and
> thereafter in 128K chunks), or that it cannot because that would overlap
> the first 64K of that block which belongs to something else? Or that it
> can try but it may or may not succeed. What about if the secure flag is
> set? 

They are all "best try, but we might fail."
> 
> Could we simplify and say that blkback won't expose discard support
> unless the underlying block device is correctly aligned for it? i.e.

I am not sure how we would do that? The discard support works for
full devices, not LVMs, not partitions. So if the user does not
setup the partitions correctly it will try to discard but not do a very
good job.

The current way that Linux does report that the aligment is off is by
by exporting the discard-aligment flag as -1 if it is improperly aligned.
(/sys/block/sda/discard_aligment)

> encourage people to align their underlying storage correctly? Presumably
> doing that has other benefits?

It does that automatically if the user uses the newly found tools
like parted/fdisk..
> 
> > + * 'discard-granularity'  - Devices that support discard functionality may
> > + * internally allocate space using units that are bigger than the logical block
> > + * size. The discard-granularity parameter indicates the size of the internal
> > + * allocation unit in bytes if reported by the device. Otherwise the
> > + * discard-granularity will be set to match the device's physical block size.
> 
> This is effectively the minimum size you can discard? (modulo the
> sub-block at the front arising from discard-alignment).

Yes.
> 
> Presumably the granularity sized blocks are self aligned to that same ?
> (again modulo the sub-block at the beginning).

Yes.

> 
> Would there be any benefit to having both these numbers in logical-block
> sized units instead of bytes? The rest of the interface typically uses
> sectors/segments.

Uhh, I would prefer not too - as we would have to convert those values
back to bytes when providing it to the block API. And the backend would
have to convert from bytes to sectors/segments again.

But this got me thinking - I don't think we actually figure out the
correct block size. Meaning we just hard-code 512.. But then I am not
sure what Linux is doing either:

scsi 2:0:0:0: Direct-Access     ATA      INTEL SSDSA2M080 2CV1 PQ: 0 ANSI: 5
sd 2:0:0:0: [sda] 156301488 512-byte logical blocks: (80.0 GB/74.5 GiB)
sd 2:0:0:0: Attached scsi generic sg0 type 0
scsi 3:0:0:0: Direct-Access     ATA      ST3250410AS      3.AA PQ: 0 ANSI: 5
sd 3:0:0:0: [sdb] 488397168 512-byte logical blocks: (250 GB/232 GiB)
sd 3:0:0:0: Attached scsi generic sg1 type 0

And logical_block_size 512, discard_granularity is 512, and discard_alignment
is zero.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 07:38:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 07:38:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REMQL-0002JL-RW; Thu, 13 Oct 2011 07:38:17 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1REMPQ-00025l-CK
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 07:37:20 -0700
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318516636!21169453!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26001 invoked from network); 13 Oct 2011 14:37:16 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-15.tower-182.messagelabs.com with SMTP;
	13 Oct 2011 14:37:16 -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 p9DEbFPi006144
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 10:37:15 -0400
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 p9DEbDXm001923; Thu, 13 Oct 2011 10:37:14 -0400
Message-ID: <4E96F7F4.70701@redhat.com>
Date: Thu, 13 Oct 2011 16:38:44 +0200
From: Laszlo Ersek <lersek@redhat.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.20) Gecko/20110817 Fedora/3.1.12-1.fc14
	Lightning/1.0b3pre Mnenhy/0.8.4 Thunderbird/3.1.12
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] domain pause vs. watchdog timer
References: <4E96EA7F.5050309@redhat.com>
	<4E97101A020000780005B303@nat28.tlf.novell.com>
In-Reply-To: <4E97101A020000780005B303@nat28.tlf.novell.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: Igor Mammedov <imammedo@redhat.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 10/13/11 16:21, Jan Beulich wrote:
>>>> On 13.10.11 at 15:41, Laszlo Ersek<lersek@redhat.com>  wrote:
>> if a domain is paused (= not scheduled), its process that keeps
>> otherwise kicking /dev/watchdog and (thusly the hypervisor) "freezes"
>> too. Should pausing a domain suspend (or "inactivate") its watchdog_timers?
>
> I would say yes it should. And you say it doesn't?

I must have missed a changeset (or a hunk?) related to pausing:

https://bugzilla.redhat.com/show_bug.cgi?id=742880#c1

I backported 21529 from xen-unstable to the RHEL-5 hypervisor version, 
and Igor tested pausing a Fedora 16 HVM guest. The domU was destroyed 
while it was paused.

Thanks!
L.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 07:42:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 07:42:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REMUB-0003Um-Fz; Thu, 13 Oct 2011 07:42:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REMS5-0002uc-QN
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 07:40:07 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318516802!19384650!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24483 invoked from network); 13 Oct 2011 14:40:02 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 14:40:02 -0000
Received: by wwf27 with SMTP id 27so1538461wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 07:40:02 -0700 (PDT)
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=ZPFc32XmM1ZL0MEt5nqoNkDugzmXptQJlmwM6hxSiuM=;
	b=mHrU0Yp0BJFswrJKolifyT71gojdWADPpCsDYv91QZVKz3EpiMjtvrr2cgWcr0GzX9
	Kg/2q7pvfI1Bcpd+D3ZQwwc54+1+LibeyvMKqTMKEh6K4/OKqX4hG74FJP3alOXEfjZZ
	HqEmvchcBffEmaHpQQxG2Hv0vpNniV32fTmV8=
Received: by 10.227.112.207 with SMTP id x15mr1315215wbp.104.1318516802684;
	Thu, 13 Oct 2011 07:40:02 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id e7sm6290038wbh.12.2011.10.13.07.40.01
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 07:40:02 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 15:39:59 +0100
Subject: Re: [Xen-devel] domain pause vs. watchdog timer
From: Keir Fraser <keir.xen@gmail.com>
To: Laszlo Ersek <lersek@redhat.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CABCB6CF.22C4C%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] domain pause vs. watchdog timer
Thread-Index: AcyJtfuXc1rMrNtpp0ijDaHVzgmiAQ==
In-Reply-To: <4E96EA7F.5050309@redhat.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 13/10/2011 14:41, "Laszlo Ersek" <lersek@redhat.com> wrote:

> Hi,
> 
> if a domain is paused (= not scheduled), its process that keeps
> otherwise kicking /dev/watchdog and (thusly the hypervisor) "freezes"
> too. Should pausing a domain suspend (or "inactivate") its watchdog_timers?
> 
> (I believe this must have been considered and the answer is "you
> shouldn't do that", but a confirmation/refutation would be nice.)

Yes, the ability to pause a domain from the toolstack command line was added
way back in the beginning largely because... Well, because it could be done,
and it was easy! It's not actually a very good idea. You won't actually find
the toolstack itself automatically pausing a domain in very many places at
all -- most places where it does are debug/diagnostic code, or where a
domain is about to be destroyed anyway.

So, yes, in short: don't do that! :-)

 -- Keir

> Thanks
> L.
> 
> _______________________________________________
> 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 Oct 13 07:45:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 07:45:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REMXJ-0003v7-70; Thu, 13 Oct 2011 07:45:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REMWl-0003hi-BP
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 07:44:55 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1318517092!17215297!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21852 invoked from network); 13 Oct 2011 14:44:52 -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;
	13 Oct 2011 14:44:52 -0000
Received: by wyh13 with SMTP id 13so2386956wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 07:44:52 -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=nUROs2NbsHdY3MGa6aimEcRLzjWPCXBkmsqeyTOvk00=;
	b=XP5saKbt6YLl0J3wF4gPjx1M4Cfa6rXYgfH6n5Im1Ry/cqDPMZNNLJzTWWVZkbYLtF
	7xw07I4AG//Sf/dJ7G2Mtqxn58L8V1j6gxdKU9UNYGvGWzxvLni2umLHReRucNB7JLOK
	CzgPlEGkqYlS+7V0Vl/Ji1U/k/Yul30DhPeZo=
Received: by 10.216.221.162 with SMTP id r34mr19306wep.35.1318517091965;
	Thu, 13 Oct 2011 07:44:51 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id q16sm6301222wbo.15.2011.10.13.07.44.45
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 07:44:51 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 15:44:30 +0100
Subject: Re: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CABCB7DE.22C4F%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
Thread-Index: AcyJtp0eGTayRLp0+kimkS00cn4PRQ==
In-Reply-To: <4E96F23B020000780005B28A@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/10/2011 13:14, "Jan Beulich" <JBeulich@suse.com> wrote:

>>>> On 13.10.11 at 11:34, Keir Fraser <keir@xen.org> wrote:
>> Given our antipathy to the x86-32 hypervisor, and the fact that any
>> remaining users of it are unlikely to be running MP systems at all let alone
>> large MP systems, how about this cleanup patch?... (It looks quite confusing
>> as a patch, actually, but does the obvious thing).
> 
> Looks good to me - I was actually considering to convert the x86-64
> code back to alloc_xenheap_pages() too (for we'll need to do that
> eventually anyway when we want to support more than 5Tb of memory)
> when I put together that earlier patch, but then refrained from doing so
> to keep the patch size down.

You mean there's a 5TB limit for alloc_domheap_pages() allocations??

I only switched to alloc_xenheap_pages() because it's safe for x86-32 too...

 -- Keir

> Jan
> 
>> x86: Simplify smpboot_alloc by merging x86-{32,64} code as far as possible.
>> 
>> We still need one ifdef, as x86-32 does not have a compat_gdt_table.
>> 
>> On x86-32 there is 1/2-page wastage due to allocating a whole page for
>> the per-CPU IDT, however we expect very few users of the x86-32
>> hypervisor. Those that cannot move to the 64-bit hypervisor are likely
>> using old single-processor systems or new single-procesor netbooks. On
>> UP and small MP systems, the wastage is insignificant.
>> 
>> Signed-off-by: Keir Fraser <keir@xen.org>
>> diff -r 1515484353c6 xen/arch/x86/smpboot.c
>> --- a/xen/arch/x86/smpboot.c    Thu Oct 13 10:09:28 2011 +0200
>> +++ b/xen/arch/x86/smpboot.c    Thu Oct 13 10:25:01 2011 +0100
>> @@ -640,21 +640,16 @@ static void cpu_smpboot_free(unsigned in
>>      unsigned int order;
>>  
>>      order = get_order_from_pages(NR_RESERVED_GDT_PAGES);
>> +    free_xenheap_pages(per_cpu(gdt_table, cpu), order);
>> +    per_cpu(gdt_table, cpu) = NULL;
>> +
>>  #ifdef __x86_64__
>> -    if ( per_cpu(compat_gdt_table, cpu) )
>> -        free_domheap_pages(virt_to_page(per_cpu(gdt_table, cpu)), order);
>> -    if ( per_cpu(gdt_table, cpu) )
>> -        free_domheap_pages(virt_to_page(per_cpu(compat_gdt_table, cpu)),
>> -                           order);
>> +    free_xenheap_pages(per_cpu(compat_gdt_table, cpu), order);
>>      per_cpu(compat_gdt_table, cpu) = NULL;
>> -    order = get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
>> -    if ( idt_tables[cpu] )
>> -        free_domheap_pages(virt_to_page(idt_tables[cpu]), order);
>> -#else
>> -    free_xenheap_pages(per_cpu(gdt_table, cpu), order);
>> -    xfree(idt_tables[cpu]);
>>  #endif
>> -    per_cpu(gdt_table, cpu) = NULL;
>> +
>> +    order = get_order_from_bytes(IDT_ENTRIES * sizeof(idt_entry_t));
>> +    free_xenheap_pages(idt_tables[cpu], order);
>>      idt_tables[cpu] = NULL;
>>  
>>      if ( stack_base[cpu] != NULL )
>> @@ -669,9 +664,6 @@ static int cpu_smpboot_alloc(unsigned in
>>  {
>>      unsigned int order;
>>      struct desc_struct *gdt;
>> -#ifdef __x86_64__
>> -    struct page_info *page;
>> -#endif
>>  
>>      stack_base[cpu] = alloc_xenheap_pages(STACK_ORDER, 0);
>>      if ( stack_base[cpu] == NULL )
>> @@ -679,41 +671,28 @@ static int cpu_smpboot_alloc(unsigned in
>>      memguard_guard_stack(stack_base[cpu]);
>>  
>>      order = get_order_from_pages(NR_RESERVED_GDT_PAGES);
>> -#ifdef __x86_64__
>> -    page = alloc_domheap_pages(NULL, order,
>> -                               MEMF_node(cpu_to_node(cpu)));
>> -    if ( !page )
>> +    per_cpu(gdt_table, cpu) = gdt =
>> +        alloc_xenheap_pages(order, MEMF_node(cpu_to_node(cpu)));
>> +    if ( gdt == NULL )
>>          goto oom;
>> -    per_cpu(compat_gdt_table, cpu) = gdt = page_to_virt(page);
>> -    memcpy(gdt, boot_cpu_compat_gdt_table,
>> -           NR_RESERVED_GDT_PAGES * PAGE_SIZE);
>> -    gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a = cpu;
>> -    page = alloc_domheap_pages(NULL, order,
>> -                               MEMF_node(cpu_to_node(cpu)));
>> -    if ( !page )
>> -        goto oom;
>> -    per_cpu(gdt_table, cpu) = gdt = page_to_virt(page);
>> -    order = get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
>> -    page = alloc_domheap_pages(NULL, order,
>> -                               MEMF_node(cpu_to_node(cpu)));
>> -    if ( !page )
>> -        goto oom;
>> -    idt_tables[cpu] = page_to_virt(page);
>> -#else
>> -    per_cpu(gdt_table, cpu) = gdt = alloc_xenheap_pages(order, 0);
>> -    if ( !gdt )
>> -        goto oom;
>> -    idt_tables[cpu] = xmalloc_array(idt_entry_t, IDT_ENTRIES);
>> -    if ( idt_tables[cpu] == NULL )
>> -        goto oom;
>> -#endif
>> -    memcpy(gdt, boot_cpu_gdt_table,
>> -           NR_RESERVED_GDT_PAGES * PAGE_SIZE);
>> +    memcpy(gdt, boot_cpu_gdt_table, NR_RESERVED_GDT_PAGES * PAGE_SIZE);
>>      BUILD_BUG_ON(NR_CPUS > 0x10000);
>>      gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a = cpu;
>>  
>> -    memcpy(idt_tables[cpu], idt_table,
>> -           IDT_ENTRIES*sizeof(idt_entry_t));
>> +#ifdef __x86_64__
>> +    per_cpu(compat_gdt_table, cpu) = gdt =
>> +        alloc_xenheap_pages(order, MEMF_node(cpu_to_node(cpu)));
>> +    if ( gdt == NULL )
>> +        goto oom;
>> +    memcpy(gdt, boot_cpu_compat_gdt_table, NR_RESERVED_GDT_PAGES *
>> PAGE_SIZE);
>> +    gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a = cpu;
>> +#endif
>> +
>> +    order = get_order_from_bytes(IDT_ENTRIES * sizeof(idt_entry_t));
>> +    idt_tables[cpu] = alloc_xenheap_pages(order,
>> MEMF_node(cpu_to_node(cpu)));
>> +    if ( idt_tables[cpu] == NULL )
>> +        goto oom;
>> +    memcpy(idt_tables[cpu], idt_table, IDT_ENTRIES * sizeof(idt_entry_t));
>>  
>>      return 0;
>>  
>> 
>>> Anyway, despite all this...
>>> 
>>>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>> 
>>> Acked-by: Keir Fraser <keir@xen.org>
>>> 
>>>> --- a/xen/arch/x86/smpboot.c
>>>> +++ b/xen/arch/x86/smpboot.c
>>>> @@ -639,9 +639,6 @@ static void cpu_smpboot_free(unsigned in
>>>>  {
>>>>      unsigned int order;
>>>>  
>>>> -    xfree(idt_tables[cpu]);
>>>> -    idt_tables[cpu] = NULL;
>>>> -
>>>>      order = get_order_from_pages(NR_RESERVED_GDT_PAGES);
>>>>  #ifdef __x86_64__
>>>>      if ( per_cpu(compat_gdt_table, cpu) )
>>>> @@ -650,10 +647,15 @@ static void cpu_smpboot_free(unsigned in
>>>>          free_domheap_pages(virt_to_page(per_cpu(compat_gdt_table, cpu)),
>>>>                             order);
>>>>      per_cpu(compat_gdt_table, cpu) = NULL;
>>>> +    order = get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
>>>> +    if ( idt_tables[cpu] )
>>>> +        free_domheap_pages(virt_to_page(idt_tables[cpu]), order);
>>>>  #else
>>>>      free_xenheap_pages(per_cpu(gdt_table, cpu), order);
>>>> +    xfree(idt_tables[cpu]);
>>>>  #endif
>>>>      per_cpu(gdt_table, cpu) = NULL;
>>>> +    idt_tables[cpu] = NULL;
>>>>  
>>>>      if ( stack_base[cpu] != NULL )
>>>>      {
>>>> @@ -691,19 +693,25 @@ static int cpu_smpboot_alloc(unsigned in
>>>>      if ( !page )
>>>>          goto oom;
>>>>      per_cpu(gdt_table, cpu) = gdt = page_to_virt(page);
>>>> +    order = get_order_from_bytes(IDT_ENTRIES * sizeof(**idt_tables));
>>>> +    page = alloc_domheap_pages(NULL, order,
>>>> +                               MEMF_node(cpu_to_node(cpu)));
>>>> +    if ( !page )
>>>> +        goto oom;
>>>> +    idt_tables[cpu] = page_to_virt(page);
>>>>  #else
>>>>      per_cpu(gdt_table, cpu) = gdt = alloc_xenheap_pages(order, 0);
>>>>      if ( !gdt )
>>>>          goto oom;
>>>> +    idt_tables[cpu] = xmalloc_array(idt_entry_t, IDT_ENTRIES);
>>>> +    if ( idt_tables[cpu] == NULL )
>>>> +        goto oom;
>>>>  #endif
>>>>      memcpy(gdt, boot_cpu_gdt_table,
>>>>             NR_RESERVED_GDT_PAGES * PAGE_SIZE);
>>>>      BUILD_BUG_ON(NR_CPUS > 0x10000);
>>>>      gdt[PER_CPU_GDT_ENTRY - FIRST_RESERVED_GDT_ENTRY].a = cpu;
>>>>  
>>>> -    idt_tables[cpu] = xmalloc_array(idt_entry_t, IDT_ENTRIES);
>>>> -    if ( idt_tables[cpu] == NULL )
>>>> -        goto oom;
>>>>      memcpy(idt_tables[cpu], idt_table,
>>>>             IDT_ENTRIES*sizeof(idt_entry_t));
>>>>  
>>>> 
>>>> 
>>>> 
>>>> 
>>>> _______________________________________________
>>>> 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 Oct 13 07:47:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 07:47:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REMZ6-0004JW-NX; Thu, 13 Oct 2011 07:47:20 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REMYV-00046d-G7
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 07:46:46 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318517200!898164!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7624 invoked from network); 13 Oct 2011 14:46:40 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 14:46:40 -0000
Received: by wwf27 with SMTP id 27so1550626wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 07:46:40 -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=hggQUX0KUzgYukJD/PrWnjPPO6+Q/igUkorXKIUGy6I=;
	b=eJuGmSPvwThkfpiaWD667FWP1EOJUGqeZ3TeF4/QTwf/kNzouxpQ5LTJvODv9xYQXq
	e54IIcLwYQcnHh12yIc6r5KaDnpnwXdNyi6t03UQnMihC+edJalJeNMtlZA+2kjb3xJy
	qXW2iRqu3vwfHag1A82YeAidEYmQBfry5MU2Y=
Received: by 10.216.180.132 with SMTP id j4mr2413787wem.75.1318517199908;
	Thu, 13 Oct 2011 07:46:39 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id j18sm6347956wbo.6.2011.10.13.07.46.32
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 07:46:39 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 15:46:26 +0100
Subject: Re: [Xen-devel] [PATCH] xen viridian: cleanup
From: Keir Fraser <keir.xen@gmail.com>
To: Tim Deegan <tim@xen.org>,
	Christoph Egger <Christoph.Egger@amd.com>
Message-ID: <CABCB852.22C50%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] xen viridian: cleanup
Thread-Index: AcyJtuJDK5OadZU8okmpU62Z2djwgw==
In-Reply-To: <20111013113927.GF44937@ocelot.phlegethon.org>
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 13/10/2011 12:39, "Tim Deegan" <tim@xen.org> wrote:

> At 15:43 +0200 on 11 Oct (1318347830), Christoph Egger wrote:
>> 
>> Simplify accesses into viridian structures.
> 
> I'm afraid this looks like a bunch of code churn for not much benefit;
> unless anyone else wants it I don't think I'll apply it.

Well, it looks like a reasonable cleanup to me, but if we're doing it then I
think we should use the shorthand forms idiomatically in every function in
viridian.c, even where only one field access occurs for example.

 -- Keir

> Cheers,
> 
> Tim.
> 
>> 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
> 
> Content-Description: xen_viridian.diff
>> diff -r 04fbcc0c1ec5 xen/arch/x86/hvm/viridian.c
>> --- a/xen/arch/x86/hvm/viridian.c Wed Sep 28 12:09:13 2011 +0200
>> +++ b/xen/arch/x86/hvm/viridian.c Wed Sep 28 12:45:39 2011 +0200
>> @@ -98,37 +98,43 @@ int cpuid_viridian_leaves(unsigned int l
>>  
>>  void dump_guest_os_id(struct domain *d)
>>  {
>> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
>> +
>>      gdprintk(XENLOG_INFO, "GUEST_OS_ID:\n");
>>      gdprintk(XENLOG_INFO, "\tvendor: %x\n",
>> -            d->arch.hvm_domain.viridian.guest_os_id.fields.vendor);
>> +            vd->guest_os_id.fields.vendor);
>>      gdprintk(XENLOG_INFO, "\tos: %x\n",
>> -            d->arch.hvm_domain.viridian.guest_os_id.fields.os);
>> +            vd->guest_os_id.fields.os);
>>      gdprintk(XENLOG_INFO, "\tmajor: %x\n",
>> -            d->arch.hvm_domain.viridian.guest_os_id.fields.major);
>> +            vd->guest_os_id.fields.major);
>>      gdprintk(XENLOG_INFO, "\tminor: %x\n",
>> -            d->arch.hvm_domain.viridian.guest_os_id.fields.minor);
>> +            vd->guest_os_id.fields.minor);
>>      gdprintk(XENLOG_INFO, "\tsp: %x\n",
>> -            d->arch.hvm_domain.viridian.guest_os_id.fields.service_pack);
>> +            vd->guest_os_id.fields.service_pack);
>>      gdprintk(XENLOG_INFO, "\tbuild: %x\n",
>> -            d->arch.hvm_domain.viridian.guest_os_id.fields.build_number);
>> +            vd->guest_os_id.fields.build_number);
>>  }
>>  
>>  void dump_hypercall(struct domain *d)
>>  {
>> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
>> +
>>      gdprintk(XENLOG_INFO, "HYPERCALL:\n");
>>      gdprintk(XENLOG_INFO, "\tenabled: %x\n",
>> -            d->arch.hvm_domain.viridian.hypercall_gpa.fields.enabled);
>> +            vd->hypercall_gpa.fields.enabled);
>>      gdprintk(XENLOG_INFO, "\tpfn: %lx\n",
>> -            (unsigned
>> long)d->arch.hvm_domain.viridian.hypercall_gpa.fields.pfn);
>> +            (unsigned long)vd->hypercall_gpa.fields.pfn);
>>  }
>>  
>>  void dump_apic_assist(struct vcpu *v)
>>  {
>> +    struct viridian_vcpu *vv = &v->arch.hvm_vcpu.viridian;
>> +
>>      gdprintk(XENLOG_INFO, "APIC_ASSIST[%d]:\n", v->vcpu_id);
>>      gdprintk(XENLOG_INFO, "\tenabled: %x\n",
>> -            v->arch.hvm_vcpu.viridian.apic_assist.fields.enabled);
>> +            vv->apic_assist.fields.enabled);
>>      gdprintk(XENLOG_INFO, "\tpfn: %lx\n",
>> -            (unsigned
>> long)v->arch.hvm_vcpu.viridian.apic_assist.fields.pfn);
>> +            (unsigned long)vv->apic_assist.fields.pfn);
>>  }
>>  
>>  static void enable_hypercall_page(struct domain *d)
>> @@ -201,6 +207,8 @@ int wrmsr_viridian_regs(uint32_t idx, ui
>>  {
>>      struct vcpu *v = current;
>>      struct domain *d = v->domain;
>> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
>> +    struct viridian_vcpu *vv = &v->arch.hvm_vcpu.viridian;
>>  
>>      if ( !is_viridian_domain(d) )
>>          return 0;
>> @@ -209,15 +217,15 @@ int wrmsr_viridian_regs(uint32_t idx, ui
>>      {
>>      case VIRIDIAN_MSR_GUEST_OS_ID:
>>          perfc_incr(mshv_wrmsr_osid);
>> -        d->arch.hvm_domain.viridian.guest_os_id.raw = val;
>> +        vd->guest_os_id.raw = val;
>>          dump_guest_os_id(d);
>>          break;
>>  
>>      case VIRIDIAN_MSR_HYPERCALL:
>>          perfc_incr(mshv_wrmsr_hc_page);
>> -        d->arch.hvm_domain.viridian.hypercall_gpa.raw = val;
>> +        vd->hypercall_gpa.raw = val;
>>          dump_hypercall(d);
>> -        if ( d->arch.hvm_domain.viridian.hypercall_gpa.fields.enabled )
>> +        if ( vd->hypercall_gpa.fields.enabled )
>>              enable_hypercall_page(d);
>>          break;
>>  
>> @@ -249,9 +257,9 @@ int wrmsr_viridian_regs(uint32_t idx, ui
>>  
>>      case VIRIDIAN_MSR_APIC_ASSIST:
>>          perfc_incr(mshv_wrmsr_apic_msr);
>> -        v->arch.hvm_vcpu.viridian.apic_assist.raw = val;
>> +        vv->apic_assist.raw = val;
>>          dump_apic_assist(v);
>> -        if (v->arch.hvm_vcpu.viridian.apic_assist.fields.enabled)
>> +        if (vv->apic_assist.fields.enabled)
>>              initialize_apic_assist(v);
>>          break;
>>  
>> @@ -266,6 +274,8 @@ int rdmsr_viridian_regs(uint32_t idx, ui
>>  {
>>      struct vcpu *v = current;
>>      struct domain *d = v->domain;
>> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
>> +    struct viridian_vcpu *vv = &v->arch.hvm_vcpu.viridian;
>>      
>>      if ( !is_viridian_domain(d) )
>>          return 0;
>> @@ -274,12 +284,12 @@ int rdmsr_viridian_regs(uint32_t idx, ui
>>      {
>>      case VIRIDIAN_MSR_GUEST_OS_ID:
>>          perfc_incr(mshv_rdmsr_osid);
>> -        *val = d->arch.hvm_domain.viridian.guest_os_id.raw;
>> +        *val = vd->guest_os_id.raw;
>>          break;
>>  
>>      case VIRIDIAN_MSR_HYPERCALL:
>>          perfc_incr(mshv_rdmsr_hc_page);
>> -        *val = d->arch.hvm_domain.viridian.hypercall_gpa.raw;
>> +        *val = vd->hypercall_gpa.raw;
>>          break;
>>  
>>      case VIRIDIAN_MSR_VP_INDEX:
>> @@ -300,7 +310,7 @@ int rdmsr_viridian_regs(uint32_t idx, ui
>>  
>>      case VIRIDIAN_MSR_APIC_ASSIST:
>>          perfc_incr(mshv_rdmsr_apic_msr);
>> -        *val = v->arch.hvm_vcpu.viridian.apic_assist.raw;
>> +        *val = vv->apic_assist.raw;
>>          break;
>>  
>>      default:
>> @@ -390,12 +400,13 @@ out:
>>  static int viridian_save_domain_ctxt(struct domain *d, hvm_domain_context_t
>> *h)
>>  {
>>      struct hvm_viridian_domain_context ctxt;
>> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
>>  
>>      if ( !is_viridian_domain(d) )
>>          return 0;
>>  
>> -    ctxt.hypercall_gpa = d->arch.hvm_domain.viridian.hypercall_gpa.raw;
>> -    ctxt.guest_os_id   = d->arch.hvm_domain.viridian.guest_os_id.raw;
>> +    ctxt.hypercall_gpa = vd->hypercall_gpa.raw;
>> +    ctxt.guest_os_id   = vd->guest_os_id.raw;
>>  
>>      return (hvm_save_entry(VIRIDIAN_DOMAIN, 0, h, &ctxt) != 0);
>>  }
>> @@ -403,12 +414,13 @@ static int viridian_save_domain_ctxt(str
>>  static int viridian_load_domain_ctxt(struct domain *d, hvm_domain_context_t
>> *h)
>>  {
>>      struct hvm_viridian_domain_context ctxt;
>> +    struct viridian_domain *vd = &d->arch.hvm_domain.viridian;
>>  
>>      if ( hvm_load_entry(VIRIDIAN_DOMAIN, h, &ctxt) != 0 )
>>          return -EINVAL;
>>  
>> -    d->arch.hvm_domain.viridian.hypercall_gpa.raw = ctxt.hypercall_gpa;
>> -    d->arch.hvm_domain.viridian.guest_os_id.raw   = ctxt.guest_os_id;
>> +    vd->hypercall_gpa.raw = ctxt.hypercall_gpa;
>> +    vd->guest_os_id.raw   = ctxt.guest_os_id;
>>  
>>      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



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 07:57:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 07:57:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REMiv-0005mh-MP; Thu, 13 Oct 2011 07:57:29 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REMiI-0005X4-Ku
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 07:56:50 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318517779!41782429!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9410 invoked from network); 13 Oct 2011 14:56:19 -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;
	13 Oct 2011 14:56:19 -0000
Received: by wyh13 with SMTP id 13so2405265wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 07:56: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:cc:message-id:thread-topic
	:thread-index:in-reply-to:mime-version:content-type
	:content-transfer-encoding;
	bh=ini3ncNa2S29EsxYwX9q/upUojnpu86pbZbfI5Pb2WI=;
	b=i0pf47r2Lw7eHvDshw/mQJWClGgzt0291CFHdDUZtzqLNuNWrdMyASmlHljn3Kv333
	BurcmcfUg/SLzXGqV154Yw+ZQtBQoZdMYruBz2mVmLKZg1lsIkgX7R3Z9025W1CAdqFi
	n+c5fXBBq20r7PIgqQ+wJkgIN745Ec7xrq7mc=
Received: by 10.216.204.150 with SMTP id h22mr1289671weo.103.1318517807179;
	Thu, 13 Oct 2011 07:56:47 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id gd6sm6414615wbb.1.2011.10.13.07.56.42
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 07:56:46 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 15:56:33 +0100
Subject: Re: [Xen-devel] domain pause vs. watchdog timer
From: Keir Fraser <keir@xen.org>
To: Laszlo Ersek <lersek@redhat.com>,
	Jan Beulich <JBeulich@suse.com>
Message-ID: <CABCBAB1.32A07%keir@xen.org>
Thread-Topic: [Xen-devel] domain pause vs. watchdog timer
Thread-Index: AcyJuEwP7QW+Ojd6Z0+SwkcjWPLGZg==
In-Reply-To: <4E96F7F4.70701@redhat.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: Igor Mammedov <imammedo@redhat.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 13/10/2011 15:38, "Laszlo Ersek" <lersek@redhat.com> wrote:

> On 10/13/11 16:21, Jan Beulich wrote:
>>>>> On 13.10.11 at 15:41, Laszlo Ersek<lersek@redhat.com>  wrote:
>>> if a domain is paused (= not scheduled), its process that keeps
>>> otherwise kicking /dev/watchdog and (thusly the hypervisor) "freezes"
>>> too. Should pausing a domain suspend (or "inactivate") its watchdog_timers?
>> 
>> I would say yes it should. And you say it doesn't?
> 
> I must have missed a changeset (or a hunk?) related to pausing:
> 
> https://bugzilla.redhat.com/show_bug.cgi?id=742880#c1
> 
> I backported 21529 from xen-unstable to the RHEL-5 hypervisor version,
> and Igor tested pausing a Fedora 16 HVM guest. The domU was destroyed
> while it was paused.

You are just as likely to upset a watchdog implemented entirely internally
to the guest, and which we have no chance to disable/suspend when a domain
is paused. Domain pausing from the dom0 command line really doesn't have a
production use case afaik -- just don't do it is my helpful suggestion.

 -- Keir



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 08:05:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 08:05:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REMqB-0006Ko-CL; Thu, 13 Oct 2011 08:04:59 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REMnr-00064X-QJ
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 08:02:37 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-11.tower-174.messagelabs.com!1318518152!35152598!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29175 invoked from network); 13 Oct 2011 15:02:32 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 15:02:32 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1REMnl-000Czg-5E; Thu, 13 Oct 2011 15:02:29 +0000
Date: Thu, 13 Oct 2011 16:02:29 +0100
From: Tim Deegan <tim@xen.org>
To: Andres Lagar Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] Re: Re: mapping problems in xenpaging
Message-ID: <20111013150229.GJ44937@ocelot.phlegethon.org>
References: <CADzFZPsJ2--PQCVH1QGJ-L1q5k4bokBrZeaaAt=BSD7QU9cbOA@mail.gmail.com>
	<20111010092111.GB31800@ocelot.phlegethon.org>
	<CADzFZPscgJ6TWXNjyeEjbOnMrEpCE7zS6BTGxfJ+yibpz-Ds_w@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: <CADzFZPscgJ6TWXNjyeEjbOnMrEpCE7zS6BTGxfJ+yibpz-Ds_w@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Cc: Olaf Hering <olaf@aepfle.de>, xen-devel@lists.xensource.com,
	zhen shi <bickys1986@gmail.com>, Adin Scannell <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 15:17 -0400 on 10 Oct (1318259867), Andres Lagar Cavilla wrote:
> On Mon, Oct 10, 2011 at 5:21 AM, Tim Deegan <tim@xen.org> wrote:
> > A few issues I can see with it:
> >  - p2m lookups are on some very performance-sensitive paths
> >   (e.g. multiple times in any pagetable walk or instruction emulation
> >   in a HVM guest) so adding the rwlock might have a noticeable impact.
> >
> >  - This fixes one class of races (page gets freed-to-xen underfoot) but
> >   leaves another one (gfn -> mfn map changes underfoot) untouched.  In
> >   particular it doesn't solve the race where a foreign mapper
> >   gets a r/w map of what's meant to be a read-only frame.
> 
> Can you elaborate a bit? Under what situations does the gfn->mfn map
> change underfoot (other than sharing, paging in or superpage
> sharding)? Wouldn't those two be taking a writer lock, and thus be
> mutually ecxluded from lookups?

Once CPU A has done a p2m lookup but before it is finished using the
result (so, maybe it has established a mapping, or is about to establish
a mapping, or is going to do some other thing like shadow a pagetable):
 - CPU B might run a log-dirty clean that makes the pfn read-only. 
   This is actually handled, for historical reasons, by having all 
   possible callers be aware of log-dirty - that son't scale to 
   all other p2m actions, though. :(
 - CPU B might remove the p2m mapping entirely and free the page. 
   This is the case that your suggestion handles, by holding 
   a refcount on the old MFN.
 - CPU B might make the page read-only so it can be shared with another
   VM.
 - CPU B might move the MFN to another PFN (this happens with emulated 
   video RAM, I believe).


> > I think that to fix things properly we need to have some refcount
> > associated with the p2m mapping itself.  That would be taken by all
> > lookups (or at least some - we could have a flag to the p2m lookup) and
> > released as you suggest, but more importantly it would block all p2m changes
> > while the count was raised.  (I think that a least in the common case we
> > could encode such a refcount using the existing typecount).
> 
> Assuming mapping means "entry in p2m", multiple mappings would have
> their ref count collapse in the page typecount. Isn't that a problem?

It might be.  I think the only case where multiple p2m mappings point to
the same MFN is page-sharing, which is already a special case; but it
might make sense to have the refcounts per-pfn anyway, just for
clarity.  

> Do we need per-mapping refcounts, or rather, per mapping mutual
> exclusion? My feel is that page refcounts are necessary to prevent the
> page from disappearing, and mappings need to have their lookups and
> modifications synchronized.
> 
> > One problem then is how to make all the callers of the p2m update
> > functions handle failure, either by waiting (new deadlock risk?) or
> > returning EAGAIN at the hypercall interface.  Paths where the update
> > isn't caused by an explicit request (like log-dirty and the mem-event
> > rx-to-rw conversion) would be particularly tricky.
> 
> Callers already wait on lock_p2m. They'll wait longer :)

:) 

> On failure, to cite a specific example, if paging was trying to swap
> something out that got foreign-mapped by somebody else, then yeah,
> there's no other option than failing that call.
> 
> How would log-dirty and x^w fail (if the refcount increases before
> they get exclusive access to the mapping)? They're not trying to
> change the mapping and/or make a page go away, rather they're changing
> the p2m permission.

Good point.  But x^w would have to fail (or at least wait) if
x86_emulate on another CPU was doing an instruction-fetch.  Otherwise
there's a race where the page becomes writeable and is written to before
the instruction fetch completes.

> > More seriously, it introduces another round of the sort of priority
> > inversion we already get with the existing refcounts - a foreign
> > mapping, caused by a user-space program in another VM, could arbitrarily
> > delay a p2m update (and so prevent a VCPU from making progress), without
> > any mechanism to even request that the mapping be removed.
> 
> Yeah, that's tricky. I do not know if there is a fix at all.
> Fundamentally, the foreign mapper (some dom0 sharing/paging/foo
> utility) is completely async to the domain. Even if we were to revoke
> the foreign mapping as you suggest below, that would involve an upcall
> into the foreign-mapper-guest-OS to have it cleanly neuter the mapping
> and drop the refcount. That's not at all trivial! Perhaps foreign
> mapping vma's should be taught to patiently re-establish mappings if
> they disappear under their feet? Event then, you need to keep track of
> those foreign l1e's, and nothing short of a list will do.
> 
> Because this is performance rather than correctness I'm inclined to
> not poke the beast.

I'm inclined to agree.  Maybe the right thing to do is implement it and
see whether serious problems arise. 

> >> I'm more wary that turning p2m locking into read/write will result in
> >> code deadlocking itself: taking a read lock first and a write lock
> >> later. Possibly the current rwlock implementation could be improved to
> >> keep a cpumask of read-lockers, and provide an atomic "promote from
> >> read to write" atomic operation (something along the lines of wait
> >> until you're the only reader in the cpumask, and then cmpxchg(lock,
> >> -1, WRITE_BIAS))
> >
> > I think that would deadlock if two cpus tried it at once.
> 
> If you keep a cpumask of all read lockers, and only try to promote if
> you're the only read locker, it wouldn't. But then you'd have to
> protect the cpumask from races with another spinlock. Yuk.

If two CPUs both take read locks and both want to promote, they'll
deadlock waiting for each other to go away.  

> Which brings me to another question: p2m_locked_by_me (and others)
> check on the physical cpu (lock->holder == curent->processor,
> roughly). Well, what if you lock and then the vcpu migrates? Are vcpu
> migrations prevented if you hold any locks? Or is there some other
> magic going on?

When that code was written, vcpus could not be preempted in the
hypervisor (except in the scheduler softirq handler).  Now they can
voluntarily preempt, but not while holding any locks, so it's still OK.

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 Oct 13 08:08:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 08:08:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REMtE-0006lE-8K; Thu, 13 Oct 2011 08:08:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REMpr-0006II-GO
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 08:04:39 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318518274!21486570!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3372 invoked from network); 13 Oct 2011 15:04:36 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 15:04:36 -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
	p9DF4Tc4008811
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 15:04:31 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
	p9DF4Q4S023715
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 15:04:28 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
	p9DF4LqE032071; Thu, 13 Oct 2011 10:04:21 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 08:04:20 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 9BE391EA; Thu, 13 Oct 2011 11:04:07 -0400 (EDT)
Date: Thu, 13 Oct 2011 11:04:07 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Message-ID: <20111013150407.GC9820@phenom.oracle.com>
References: <patchbomb.1318457565@localhost6.localdomain6>
	<15c2d70dbac3e31c2d74.1318457567@localhost6.localdomain6>
	<1318492807.21903.789.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318492807.21903.789.camel@zakaz.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.0A090204.4E96FDFF.0292:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"JBeulich@suse.com" <JBeulich@suse.com>
Subject: [Xen-devel] Re: [PATCH 2 of 3] interface: Flesh out the
 BLKIF_OP_DISCARD 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

On Thu, Oct 13, 2011 at 09:00:07AM +0100, Ian Campbell wrote:
> Thanks for splitting these out.
> 
> On Wed, 2011-10-12 at 23:12 +0100, Konrad Rzeszutek Wilk wrote:
> [...]
> > + * The backend can optionally provide two extra XenBus attributes to
> > + * further optimize the discard functionality:
> > + * 'discard-aligment' - Devices that support discard functionality may
> > + * internally allocate space in units that are bigger than the exported
> > + * logical block size. The discard-alignment parameter indicates how many bytes
> > + * the beginning of the partition is offset from the internal allocation unit's
> > + * natural alignment.
> 
> So this is to account for the case where a physical device can discard
> e.g. 128K blocks at a time but the VBD (a better term than "partition"
> in the context, I think) starts at e.g. offset 64K within that
> underlying device?
> 
> Does this mean that the virtual device can discard the first 64K (and
> thereafter in 128K chunks), or that it cannot because that would overlap

[edit: I don't think I answered this question]
Yes.
> the first 64K of that block which belongs to something else? Or that it
> can try but it may or may not succeed. What about if the secure flag is

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 08:10:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 08:10:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REMvT-0007A0-Rq; Thu, 13 Oct 2011 08:10:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REMu6-0006wK-Pb
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 08:09:03 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318518538!893879!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24954 invoked from network); 13 Oct 2011 15:08:59 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 15:08:59 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1REMu1-000D0w-Gc; Thu, 13 Oct 2011 15:08:57 +0000
Date: Thu, 13 Oct 2011 16:08:57 +0100
From: Tim Deegan <tim@xen.org>
To: Andres Lagar Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] Re: Re: mapping problems in xenpaging
Message-ID: <20111013150857.GK44937@ocelot.phlegethon.org>
References: <20111010092111.GB31800@ocelot.phlegethon.org>
	<CAB8821A.2291B%keir.xen@gmail.com>
	<CADzFZPt5vVLnx1qZ0ffiT9ynkj9asdH-ts_nKtsyDCY9_0EL=w@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CADzFZPt5vVLnx1qZ0ffiT9ynkj9asdH-ts_nKtsyDCY9_0EL=w@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Cc: zhen shi <bickys1986@gmail.com>, Olaf Hering <olaf@aepfle.de>,
	Keir Fraser <keir.xen@gmail.com>, xen-devel@lists.xensource.com,
	Adin Scannell <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 15:31 -0400 on 10 Oct (1318260666), Andres Lagar Cavilla wrote:
> On Mon, Oct 10, 2011 at 6:06 AM, Keir Fraser <keir.xen@gmail.com> wrote:
> > On 10/10/2011 10:21, "Tim Deegan" <tim@xen.org> wrote:
> > The best (but hard) way to make the locking cheaper is to work out a way to
> > use finer-grained locks (e.g., per-page / per-mapping) or avoid locks
> > altogether (e.g., RCU).
> No clue about RCU. But the p2m tree structure lends itself naturally
> to fine-grained locking. In fact, hierarchical locking given 2M and 1G
> superpages.
> 
> Now, this moves all the locking into the specific p2m implementations,
> ept and traditional pt. Do you think a test_and_set-style spinlock
> could fit in the unused bits of a p2m entry. It would have scarce
> debug information :) I don't know if ept would freak out with someone
> spinning on an entry it has loaded in the translation hardware.
> Probably.

I think it would be OK on EPT and on 64-bit, where there are enough
available bits in a PTE.  32-bit PTEs are full, though.  It might clash
with the AMD IOMMU as well.  ISTR that they use a different set of avail
bits so when you're using the same table for both NPT and IOMMU you have
very few spare bits. 

> So, perhaps the most decent idea is to have a tree/array of locks on
> the side. This would not have to live inside the ept/pt
> implementation-specific layer. Although locking unaligned,
> arbitrarily-sized ranges of pages (Does anyone do that? PoD?) would
> become a big headache.

I don't think anything does that, so having a tree of locks should work
fine (but might be a bit delicate to get right).  But as Keir says, we
can implement the refcounting of p2m entries first, with a single p2m
lock, and optimise afterwards -- I'm sure there will be some good way of
reducing contention.

Tim.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 08:17:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 08:17:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REN2J-0007eL-8x; Thu, 13 Oct 2011 08:17:31 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REN1m-0007Rl-Dl
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 08:16:58 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318519014!35158141!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28770 invoked from network); 13 Oct 2011 15:16:55 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-10.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 15:16:55 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 16:16:54 +0100
Message-Id: <4E971D06020000780005B352@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 16:16:54 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
References: <4E96F23B020000780005B28A@nat28.tlf.novell.com>
	<CABCB7DE.22C4F%keir.xen@gmail.com>
In-Reply-To: <CABCB7DE.22C4F%keir.xen@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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.10.11 at 16:44, Keir Fraser <keir.xen@gmail.com> wrote:
> On 13/10/2011 13:14, "Jan Beulich" <JBeulich@suse.com> wrote:
>=20
>>>>> On 13.10.11 at 11:34, Keir Fraser <keir@xen.org> wrote:
>>> Given our antipathy to the x86-32 hypervisor, and the fact that any
>>> remaining users of it are unlikely to be running MP systems at all let =
alone
>>> large MP systems, how about this cleanup patch?... (It looks quite =
confusing
>>> as a patch, actually, but does the obvious thing).
>>=20
>> Looks good to me - I was actually considering to convert the x86-64
>> code back to alloc_xenheap_pages() too (for we'll need to do that
>> eventually anyway when we want to support more than 5Tb of memory)
>> when I put together that earlier patch, but then refrained from doing =
so
>> to keep the patch size down.
>=20
> You mean there's a 5TB limit for alloc_domheap_pages() allocations??

No, I mean that currently we can't use more than 5Tb on any system.
Due to address space limitations, going beyond that will require to
introduce split domain and Xen heaps (including map_domain_page() etc)
and hence the consistent use of alloc_xenheap_pages() vs.
alloc_domheap_pages() (which currently isn't the case - you fixed just
one group of them). Remember talking about that on the summit?

> I only switched to alloc_xenheap_pages() because it's safe for x86-32 =
too...

Sure, I just wanted to point out that this needs to be done at some point
anyway.

Jan


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 08:24:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 08:24:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REN8z-00087u-MJ; Thu, 13 Oct 2011 08:24:25 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REN8V-0007vB-G9
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 08:23:55 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318519413!46540236!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32681 invoked from network); 13 Oct 2011 15:23:33 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 15:23:33 -0000
Received: by wyh13 with SMTP id 13so2444630wyh.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 08:23:52 -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=wbVr7D8v7Cam+8onZeUsrrHF8mdsOHrWEnVx4FYKlL8=;
	b=RRc8t6fBCCFYIrR0XG5jq4PFn/DdEQ7NxP9sO//88AKfD8wIZJ9Trv/4VxkzFzq0zQ
	FkfylGpHT6Y4zNC/Df2I6DfWJ3sG1u3ShkWch3N8xaGMNO71U8YpYGxmjsA3Waptubur
	hZBVm8PoL+ZWjjj9xwe+LI+zXyFOg7Zw5330c=
Received: by 10.216.183.70 with SMTP id p48mr1298416wem.109.1318519432103;
	Thu, 13 Oct 2011 08:23:52 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id g20sm6496648wbp.13.2011.10.13.08.23.46
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 08:23:51 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 13 Oct 2011 16:23:32 +0100
Subject: Re: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CABCC104.32A10%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
Thread-Index: AcyJvBEPgsgYIqgogkmMRikE5V3jnA==
In-Reply-To: <4E971D06020000780005B352@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/10/2011 16:16, "Jan Beulich" <JBeulich@suse.com> wrote:

>>> Looks good to me - I was actually considering to convert the x86-64
>>> code back to alloc_xenheap_pages() too (for we'll need to do that
>>> eventually anyway when we want to support more than 5Tb of memory)
>>> when I put together that earlier patch, but then refrained from doing so
>>> to keep the patch size down.
>> 
>> You mean there's a 5TB limit for alloc_domheap_pages() allocations??
> 
> No, I mean that currently we can't use more than 5Tb on any system.
> Due to address space limitations, going beyond that will require to
> introduce split domain and Xen heaps (including map_domain_page() etc)
> and hence the consistent use of alloc_xenheap_pages() vs.
> alloc_domheap_pages() (which currently isn't the case - you fixed just
> one group of them). Remember talking about that on the summit?

Ah yes, I do remember now!

 K.



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 08:30:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 08:30:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RENEl-000091-LH; Thu, 13 Oct 2011 08:30:23 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RENEI-0008Nl-DZ
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 08:29:54 -0700
X-Env-Sender: peterz@infradead.org
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318519790!21490919!1
X-Originating-IP: [85.118.1.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24639 invoked from network); 13 Oct 2011 15:29:50 -0000
Received: from casper.infradead.org (HELO casper.infradead.org) (85.118.1.10)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 15:29:50 -0000
Received: from j77219.upc-j.chello.nl ([24.132.77.219] helo=twins)
	by casper.infradead.org with esmtpsa (Exim 4.76 #1 (Red Hat Linux))
	id 1RENDn-0001IL-0g; Thu, 13 Oct 2011 15:29:23 +0000
Received: by twins (Postfix, from userid 1000)
	id 29BC8819EC82; Thu, 13 Oct 2011 17:29:18 +0200 (CEST)
From: Peter Zijlstra <peterz@infradead.org>
To: Jason Baron <jbaron@redhat.com>
Date: Thu, 13 Oct 2011 17:29:17 +0200
In-Reply-To: <20111013135439.GA2455@redhat.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<16f652166605c973e9817177b6ba6a081e3e5b3f.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<1318501954.24856.5.camel@twins> <20111013135439.GA2455@redhat.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Mailer: Evolution 3.0.3- 
Message-ID: <1318519758.27731.15.camel@twins>
Mime-Version: 1.0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Daney <david.daney@cavium.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, David,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, Linux,
	Ingo Molnar <mingo@elte.hu>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 06/10] jump_label: add
 arch_jump_label_transform_static() to optimise non-live code updates
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-13 at 09:54 -0400, Jason Baron wrote:
>=20
> > So I got myself a little confused wrt the early jump_label_apply_nops()
> > call and the MODULE_COMING notifiers.
> >=20
> > It looks to me like jump_label_apply_nops() is called way early and is
> > in fact called before _any_ of the module code has had a chance of
> > running. However it simply NOPs out all jump_labels.
> >=20
>=20
> yes.
>=20
> > The jump_label_add_module() thing, which is ran on the MODULE_COMING
> > callback will then set up stuff and do the proper patch-up.
> >=20
>=20
> yes, only for the enabled ones.

But we could make it nop out the disabled ones quite trivially.

> > Now the only bit of the module text that can be ran between those two
> > calls appears to be the module argument parsing stuff, but since
> > jump_labels are non-functional it can't rely on them, so why do we do
> > the early patch up again?
> >=20
> >=20
>=20
> The 'early patch' is for putting in the 'ideal' no-ops into the module
> code. These 'ideal' no-ops are discovered at run-time, not boot-time.

Sure, but since we can't use static_branch() and friends from very early
module code (arg parsing) anyway, it doesn't matter what NOP they
encounter, so we might as well do something like the below, right?

> The code is optimized (hopefully) for the most common case. The
> jump labels are by nature expected to be off,=20

I actually need them to be either way.. no preference between on or off
just a means of very _very_ infrequent runtime change in behaviour.

If we can push jump_label init to before sched_init() all I need is a
static_branch() without the unlikely() in to avoid GCC out-of-lining the
branch.

> and by patching them early
> like this, at least for x86, we can avoid the stop machine calls. So its
> the combination of most are expected to be off and no sense to call extra
> stop machines that lead the code to its present state.

But we could use arch_jump_label_transform_static because its before we
actually execute any module text (sans the arg crap) which is
stomp-machine free, removing that obstacle.

Or am I confused more?

---
 arch/mips/kernel/module.c  |    3 ---
 arch/sparc/kernel/module.c |    3 ---
 arch/x86/kernel/module.c   |    3 ---
 include/linux/jump_label.h |    6 ------
 kernel/jump_label.c        |   22 +++++++++++++---------
 5 files changed, 13 insertions(+), 24 deletions(-)

Index: linux-2.6/arch/mips/kernel/module.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- linux-2.6.orig/arch/mips/kernel/module.c
+++ linux-2.6/arch/mips/kernel/module.c
@@ -368,9 +368,6 @@ int module_finalize(const Elf_Ehdr *hdr,
 	const Elf_Shdr *s;
 	char *secstrings =3D (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
=20
-	/* Make jump label nops. */
-	jump_label_apply_nops(me);
-
 	INIT_LIST_HEAD(&me->arch.dbe_list);
 	for (s =3D sechdrs; s < sechdrs + hdr->e_shnum; s++) {
 		if (strcmp("__dbe_table", secstrings + s->sh_name) !=3D 0)
Index: linux-2.6/arch/sparc/kernel/module.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- linux-2.6.orig/arch/sparc/kernel/module.c
+++ linux-2.6/arch/sparc/kernel/module.c
@@ -207,9 +207,6 @@ int module_finalize(const Elf_Ehdr *hdr,
 		    const Elf_Shdr *sechdrs,
 		    struct module *me)
 {
-	/* make jump label nops */
-	jump_label_apply_nops(me);
-
 	/* Cheetah's I-cache is fully coherent.  */
 	if (tlb_type =3D=3D spitfire) {
 		unsigned long va;
Index: linux-2.6/arch/x86/kernel/module.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- linux-2.6.orig/arch/x86/kernel/module.c
+++ linux-2.6/arch/x86/kernel/module.c
@@ -194,9 +194,6 @@ int module_finalize(const Elf_Ehdr *hdr,
 		apply_paravirt(pseg, pseg + para->sh_size);
 	}
=20
-	/* make jump label nops */
-	jump_label_apply_nops(me);
-
 	return 0;
 }
=20
Index: linux-2.6/include/linux/jump_label.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- linux-2.6.orig/include/linux/jump_label.h
+++ linux-2.6/include/linux/jump_label.h
@@ -52,7 +52,6 @@ extern int jump_label_text_reserved(void
 extern void jump_label_inc(struct jump_label_key *key);
 extern void jump_label_dec(struct jump_label_key *key);
 extern bool jump_label_enabled(struct jump_label_key *key);
-extern void jump_label_apply_nops(struct module *mod);
=20
 #else  /* !HAVE_JUMP_LABEL */
=20
@@ -97,11 +96,6 @@ static inline bool jump_label_enabled(st
 {
 	return !!atomic_read(&key->enabled);
 }
-
-static inline int jump_label_apply_nops(struct module *mod)
-{
-	return 0;
-}
 #endif	/* HAVE_JUMP_LABEL */
=20
 #endif	/* _LINUX_JUMP_LABEL_H */
Index: linux-2.6/kernel/jump_label.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- linux-2.6.orig/kernel/jump_label.c
+++ linux-2.6/kernel/jump_label.c
@@ -116,9 +116,15 @@ void __weak arch_jump_label_transform_st
 	arch_jump_label_transform(entry, type);=09
 }
=20
+static inline enum jump_label_type jump_label_dyn_type(struct jump_label_k=
ey *key)
+{
+	return jump_label_enabled(key) ? JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE;
+}
+
 static void __jump_label_update(struct jump_label_key *key,
 				struct jump_entry *entry,
-				struct jump_entry *stop, int enable)
+				struct jump_entry *stop, int enable,
+				void (*transform)(struct jump_entry *, enum jump_label_type))
 {
 	for (; (entry < stop) &&
 	      (entry->key =3D=3D (jump_label_t)(unsigned long)key);
@@ -129,7 +135,7 @@ static void __jump_label_update(struct j
 		 * init code, see jump_label_invalidate_module_init().
 		 */
 		if (entry->code && kernel_text_address(entry->code))
-			arch_jump_label_transform(entry, enable);
+			transform(entry, enable);
 	}
 }
=20
@@ -147,8 +153,7 @@ void __init jump_label_init(void)
 		struct jump_label_key *iterk;
=20
 		iterk =3D (struct jump_label_key *)(unsigned long)iter->key;
-		arch_jump_label_transform_static(iter, jump_label_enabled(iterk) ?
-						 JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
+		arch_jump_label_transform_static(iter, jump_label_dyn_type(iterk));
 		if (iterk =3D=3D key)
 			continue;
=20
@@ -193,7 +198,7 @@ static void __jump_label_mod_update(stru
=20
 		__jump_label_update(key, mod->entries,
 				    m->jump_entries + m->num_jump_entries,
-				    enable);
+				    enable, arch_jump_label_transform);
 		mod =3D mod->next;
 	}
 }
@@ -256,9 +261,8 @@ static int jump_label_add_module(struct
 		jlm->next =3D key->next;
 		key->next =3D jlm;
=20
-		if (jump_label_enabled(key))
-			__jump_label_update(key, iter, iter_stop,
-					    JUMP_LABEL_ENABLE);
+		__jump_label_update(key, iter, iter_stop, jump_label_dyn_type(key),
+				arch_jump_label_transform_static);
 	}
=20
 	return 0;
@@ -392,7 +396,7 @@ static void jump_label_update(struct jum
 #endif
 	/* if there are no users, entry can be NULL */
 	if (entry)
-		__jump_label_update(key, entry, stop, enable);
+		__jump_label_update(key, entry, stop, enable, arch_jump_label_transform)=
;
 }
=20
 #endif


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 08:33:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 08: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 1RENHp-0000g3-6J; Thu, 13 Oct 2011 08:33:33 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RENHL-0000T8-Rz
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 08:33:04 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1318519979!17223821!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28026 invoked from network); 13 Oct 2011 15:33:00 -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; 13 Oct 2011 15:33:00 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9DFWsKS025894
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Thu, 13 Oct 2011 15:32:56 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9DFWr02020835
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 15:32:54 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
	p9DFWm04024777; Thu, 13 Oct 2011 10:32:48 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 08:32:48 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 099D541B; Thu, 13 Oct 2011 11:32:35 -0400 (EDT)
Date: Thu, 13 Oct 2011 11:32:34 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Other things we need to do with backend/blkfront Was:Re: [Xen-devel]
	Re: [PATCH 2 of 3] interface: Flesh out the BLKIF_OP_DISCARD
	description
Message-ID: <20111013153234.GD9820@phenom.oracle.com>
References: <patchbomb.1318457565@localhost6.localdomain6>
	<15c2d70dbac3e31c2d74.1318457567@localhost6.localdomain6>
	<1318492807.21903.789.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318492807.21903.789.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090202.4E9704A9.0071,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"JBeulich@suse.com" <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

> Could we simplify and say that blkback won't expose discard support
> unless the underlying block device is correctly aligned for it? i.e.
> encourage people to align their underlying storage correctly? Presumably
> doing that has other benefits?

It got me thinking that we could do this - but I do not think that should
be spelled out in the interface. Rather it is up to the backend to either
expose it or not. The check for -1 in backend for that should do it. Keep
in mind that the discard operation is a hint, nothing else.

It also got me thinking about the aligment offset - which we do not
expose to the frontend. That is the one where the 63 sector DOS partition
ends up skewing up the whole disk layout. That is seperate from discard
operations.

It is more of a XenBus attribute. Then there is also the device serial
number which we don't expose either.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 08:42:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 08:42:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RENQF-0001Ch-N5; Thu, 13 Oct 2011 08:42:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RENPR-000103-K2
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 08:41:25 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318520480!35195527!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20508 invoked from network); 13 Oct 2011 15:41:22 -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; 13 Oct 2011 15:41:22 -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
	p9DFfD5a029408
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 15:41:15 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
	p9DFfCYj001466
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 15:41:12 GMT
Received: from abhmt111.oracle.com (abhmt111.oracle.com [141.146.116.63])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9DFf6it021058; Thu, 13 Oct 2011 10:41:06 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 08:41:06 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 2A7361EA; Thu, 13 Oct 2011 11:40:53 -0400 (EDT)
Date: Thu, 13 Oct 2011 11:40:53 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>, raistlin@linux.it
Message-ID: <20111013154053.GA12588@phenom.oracle.com>
References: <1318353219.21925.80.camel@Palantir>
	<20111011173228.GB32406@phenom.oracle.com>
	<4E9495F6.4070301@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9495F6.4070301@tycho.nsa.gov>
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.4E97069C.0015:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel <xen-devel@lists.xensource.com>,
	Dario Faggioli <raistlin@linux.it>
Subject: [Xen-devel] Re: [PATCH] xen/gntdev: Fix sleep-inside-spinlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, Oct 11, 2011 at 03:16:06PM -0400, Daniel De Graaf wrote:
> On 10/11/2011 01:32 PM, Konrad Rzeszutek Wilk wrote:
> > On Tue, Oct 11, 2011 at 07:13:38PM +0200, Dario Faggioli wrote:
> >> Hello everyone,

Dario, does the patch fix the problem for you?

.. snip..
> it'll also trigger this message; that's also fixed here. Compile tested only.
> 
> -------------------------------------------------------->8
> 
> gntdev_put_map tries to acquire a mutex when freeing pages back to the
> xenballoon pool, so it cannot be called with a spinlock held. In
> gntdev_release, the spinlock is not needed as we are freeing the
> structure later; in the ioctl, only the list manipulation needs to be
> under the lock.
> 
> Reported-By: Dario Faggioli <raistlin@linux.it>
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
>  drivers/xen/gntdev.c |    5 ++---
>  1 files changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
> index f914b26..23b1c83 100644
> --- a/drivers/xen/gntdev.c
> +++ b/drivers/xen/gntdev.c
> @@ -462,13 +462,11 @@ static int gntdev_release(struct inode *inode, struct file *flip)
>  
>  	pr_debug("priv %p\n", priv);
>  
> -	spin_lock(&priv->lock);
>  	while (!list_empty(&priv->maps)) {
>  		map = list_entry(priv->maps.next, struct grant_map, next);
>  		list_del(&map->next);
>  		gntdev_put_map(map);
>  	}
> -	spin_unlock(&priv->lock);
>  
>  	if (use_ptemod)
>  		mmu_notifier_unregister(&priv->mn, priv->mm);
> @@ -532,10 +530,11 @@ static long gntdev_ioctl_unmap_grant_ref(struct gntdev_priv *priv,
>  	map = gntdev_find_map_index(priv, op.index >> PAGE_SHIFT, op.count);
>  	if (map) {
>  		list_del(&map->next);
> -		gntdev_put_map(map);
>  		err = 0;
>  	}
>  	spin_unlock(&priv->lock);
> +	if (map)
> +		gntdev_put_map(map);
>  	return err;
>  }
>  
> -- 
> 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 Oct 13 08:43:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 08:43:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RENRE-0001aj-W1; Thu, 13 Oct 2011 08:43:17 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RENPd-00012J-SN
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 08:41:38 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1318520493!20373999!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9152 invoked from network); 13 Oct 2011 15:41:34 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 15:41:34 -0000
Received: from tazenda.hos.anvin.org ([IPv6:2001:470:861f::feed:face:f00d])
	(authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9DFelIK027789
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 08:40:49 -0700
Message-ID: <4E97067A.2070305@zytor.com>
Date: Thu, 13 Oct 2011 08:40:42 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<34ede5db1571d541a5c3fc49923bb353a37dd431.1318464413.git.jeremy.fitzhardinge@citrix.com>
In-Reply-To: <34ede5db1571d541a5c3fc49923bb353a37dd431.1318464413.git.jeremy.fitzhardinge@citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 09/10] x86/jump_label: use
 GENERIC_NOP5_ATOMIC instead of jmp5 +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 10/12/2011 05:08 PM, Jeremy Fitzhardinge wrote:
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> 
> GENERIC_NOP5_ATOMIC should make a better nop.
> 

On 32 bits, yes.  On 64 bits you should use P6_NOP5_ATOMIC.

	-hpa

-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 08:51:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 08:51:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RENZd-0002H2-Mp; Thu, 13 Oct 2011 08:51:57 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RENZB-00025G-Fw
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 08:51:29 -0700
X-Env-Sender: zhengwang.ruan@gmail.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318521085!21494668!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1288 invoked from network); 13 Oct 2011 15:51:26 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 15:51:26 -0000
Received: by qabg14 with SMTP id g14so195167qab.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 08:51:25 -0700 (PDT)
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
	:content-type:content-transfer-encoding;
	bh=74Z3g/WHoEox/jA/Q9ZeYZs2HIlWZZNAAHuiZHpWHpg=;
	b=lD9UdT1vEymfgfMm/Si6jUmxnsvPllNZSIPcE8ormsAn7Oy7AstqLDC3tRCgcbf2P1
	Y2XgFYfBa8vNXpIoXtERYCE0kGeG62uFnK3izatRKANGeBKu89pCxqONeY+eg/K8QVgJ
	vgVV3rJ08hoW3ZPOs52RNv0e0uP8J7YZT266U=
Received: by 10.68.0.136 with SMTP id 8mr9941897pbe.46.1318521083799;
	Thu, 13 Oct 2011 08:51:23 -0700 (PDT)
Received: from [192.168.1.102] ([180.184.200.59])
	by mx.google.com with ESMTPS id ji3sm12687899pbc.2.2011.10.13.08.51.21
	(version=SSLv3 cipher=OTHER); Thu, 13 Oct 2011 08:51:23 -0700 (PDT)
Message-ID: <4E9708E5.9060104@gmail.com>
Date: Thu, 13 Oct 2011 23:51:01 +0800
From: "Zhengwang Ruan (Royo)" <zhengwang.ruan@gmail.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110922 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
Subject: [Xen-devel] Several questions from a freshman to 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 Guys,

I am new man with some confusions to this amazing technology, hope you 
guys give answers to help me better understand Xen. :)

1, You guys have been working on developing many releases, do you guys 
have agreements on developing every source code based on a fixed linux 
kernel version before starting a new release? If so, how could I know 
the corresponding kernel version to a given xen release? I tried to find 
answer for myself on the following wiki page, but it is not latest enough.

http://wiki.xen.org/xenwiki/DistributionSupport

2, I found some interesting source files in xen-4.1.1 release, I listed 
them below:

$ ll
drwx------ 4 royo royo 16384 2011-10-12 00:20 arch/
drwx------ 5 royo royo 16384 2011-06-15 00:03 common/
-rw-r--r-- 1 royo royo 19185 2011-06-15 00:03 COPYING
drwx------ 2 royo royo 16384 2011-06-15 00:03 crypto/
drwx------ 8 royo royo 16384 2011-06-15 00:03 drivers/
drwx------ 9 royo royo 16384 2011-06-15 00:03 include/
-rw-r--r-- 1 royo royo  5529 2011-06-15 00:03 Makefile
-rw-r--r-- 1 royo royo  3498 2011-06-15 00:03 Rules.mk
drwx------ 3 royo royo 16384 2011-06-15 00:03 tools/
drwx------ 4 royo royo 16384 2011-06-15 00:03 xsm/

Are these files going to replace or be added to linux kernel source 
while making dm0? I am amazed that this release can be installed to many 
linux distributions with different kernel, how could you guys achieve this?

Thanks,
Royo


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 08:57:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 08:57:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RENea-0002jZ-St; Thu, 13 Oct 2011 08:57:04 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RENe4-0002Wz-22
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 08:56:32 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318521360!52717679!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28530 invoked from network); 13 Oct 2011 15:56:00 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-7.tower-27.messagelabs.com with SMTP;
	13 Oct 2011 15:56:00 -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 p9DFtvek027211
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 11:55:57 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9DFtr6g025229; Thu, 13 Oct 2011 11:55:54 -0400
Date: Thu, 13 Oct 2011 11:55:53 -0400
From: Jason Baron <jbaron@redhat.com>
To: Peter Zijlstra <peterz@infradead.org>
Message-ID: <20111013155553.GD2455@redhat.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<16f652166605c973e9817177b6ba6a081e3e5b3f.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<1318501954.24856.5.camel@twins> <20111013135439.GA2455@redhat.com>
	<1318519758.27731.15.camel@twins>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318519758.27731.15.camel@twins>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, rth@redhat.com,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 06/10] jump_label: add
 arch_jump_label_transform_static() to optimise non-live code updates
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 13, 2011 at 05:29:17PM +0200, Peter Zijlstra wrote:
> On Thu, 2011-10-13 at 09:54 -0400, Jason Baron wrote:
> > 
> > > So I got myself a little confused wrt the early jump_label_apply_nops()
> > > call and the MODULE_COMING notifiers.
> > > 
> > > It looks to me like jump_label_apply_nops() is called way early and is
> > > in fact called before _any_ of the module code has had a chance of
> > > running. However it simply NOPs out all jump_labels.
> > > 
> > 
> > yes.
> > 
> > > The jump_label_add_module() thing, which is ran on the MODULE_COMING
> > > callback will then set up stuff and do the proper patch-up.
> > > 
> > 
> > yes, only for the enabled ones.
> 
> But we could make it nop out the disabled ones quite trivially.
> 
> > > Now the only bit of the module text that can be ran between those two
> > > calls appears to be the module argument parsing stuff, but since
> > > jump_labels are non-functional it can't rely on them, so why do we do
> > > the early patch up again?
> > > 
> > > 
> > 
> > The 'early patch' is for putting in the 'ideal' no-ops into the module
> > code. These 'ideal' no-ops are discovered at run-time, not boot-time.
> 
> Sure, but since we can't use static_branch() and friends from very early
> module code (arg parsing) anyway, it doesn't matter what NOP they
> encounter, so we might as well do something like the below, right?
> 
> > The code is optimized (hopefully) for the most common case. The
> > jump labels are by nature expected to be off, 
> 
> I actually need them to be either way.. no preference between on or off
> just a means of very _very_ infrequent runtime change in behaviour.
> 

ok, this is a new use case, all the current users are biased with gcc
out-of-lining the infrequent case.

> If we can push jump_label init to before sched_init() all I need is a
> static_branch() without the unlikely() in to avoid GCC out-of-lining the
> branch.
> 

hmmm....the current code (I believe) is biased  b/c gcc sees the
branch as always false, see: arch_static_branch() - its not b/c we have
an unlikely there. Without open coding the label, like we had before
everybody hated, I'll have to play around and see what will create an
unbiased branch...perhaps, somebody has an idea? 

> > and by patching them early
> > like this, at least for x86, we can avoid the stop machine calls. So its
> > the combination of most are expected to be off and no sense to call extra
> > stop machines that lead the code to its present state.
> 
> But we could use arch_jump_label_transform_static because its before we
> actually execute any module text (sans the arg crap) which is
> stomp-machine free, removing that obstacle.
> 
> Or am I confused more?
> 

The MODULE_COMING callback happens *after* the call to flush_module_icache(mod),
so I'm not sure that is safe...

thanks,

-Jason


> ---
>  arch/mips/kernel/module.c  |    3 ---
>  arch/sparc/kernel/module.c |    3 ---
>  arch/x86/kernel/module.c   |    3 ---
>  include/linux/jump_label.h |    6 ------
>  kernel/jump_label.c        |   22 +++++++++++++---------
>  5 files changed, 13 insertions(+), 24 deletions(-)
> 
> Index: linux-2.6/arch/mips/kernel/module.c
> ===================================================================
> --- linux-2.6.orig/arch/mips/kernel/module.c
> +++ linux-2.6/arch/mips/kernel/module.c
> @@ -368,9 +368,6 @@ int module_finalize(const Elf_Ehdr *hdr,
>  	const Elf_Shdr *s;
>  	char *secstrings = (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
>  
> -	/* Make jump label nops. */
> -	jump_label_apply_nops(me);
> -
>  	INIT_LIST_HEAD(&me->arch.dbe_list);
>  	for (s = sechdrs; s < sechdrs + hdr->e_shnum; s++) {
>  		if (strcmp("__dbe_table", secstrings + s->sh_name) != 0)
> Index: linux-2.6/arch/sparc/kernel/module.c
> ===================================================================
> --- linux-2.6.orig/arch/sparc/kernel/module.c
> +++ linux-2.6/arch/sparc/kernel/module.c
> @@ -207,9 +207,6 @@ int module_finalize(const Elf_Ehdr *hdr,
>  		    const Elf_Shdr *sechdrs,
>  		    struct module *me)
>  {
> -	/* make jump label nops */
> -	jump_label_apply_nops(me);
> -
>  	/* Cheetah's I-cache is fully coherent.  */
>  	if (tlb_type == spitfire) {
>  		unsigned long va;
> Index: linux-2.6/arch/x86/kernel/module.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/kernel/module.c
> +++ linux-2.6/arch/x86/kernel/module.c
> @@ -194,9 +194,6 @@ int module_finalize(const Elf_Ehdr *hdr,
>  		apply_paravirt(pseg, pseg + para->sh_size);
>  	}
>  
> -	/* make jump label nops */
> -	jump_label_apply_nops(me);
> -
>  	return 0;
>  }
>  
> Index: linux-2.6/include/linux/jump_label.h
> ===================================================================
> --- linux-2.6.orig/include/linux/jump_label.h
> +++ linux-2.6/include/linux/jump_label.h
> @@ -52,7 +52,6 @@ extern int jump_label_text_reserved(void
>  extern void jump_label_inc(struct jump_label_key *key);
>  extern void jump_label_dec(struct jump_label_key *key);
>  extern bool jump_label_enabled(struct jump_label_key *key);
> -extern void jump_label_apply_nops(struct module *mod);
>  
>  #else  /* !HAVE_JUMP_LABEL */
>  
> @@ -97,11 +96,6 @@ static inline bool jump_label_enabled(st
>  {
>  	return !!atomic_read(&key->enabled);
>  }
> -
> -static inline int jump_label_apply_nops(struct module *mod)
> -{
> -	return 0;
> -}
>  #endif	/* HAVE_JUMP_LABEL */
>  
>  #endif	/* _LINUX_JUMP_LABEL_H */
> Index: linux-2.6/kernel/jump_label.c
> ===================================================================
> --- linux-2.6.orig/kernel/jump_label.c
> +++ linux-2.6/kernel/jump_label.c
> @@ -116,9 +116,15 @@ void __weak arch_jump_label_transform_st
>  	arch_jump_label_transform(entry, type);	
>  }
>  
> +static inline enum jump_label_type jump_label_dyn_type(struct jump_label_key *key)
> +{
> +	return jump_label_enabled(key) ? JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE;
> +}
> +
>  static void __jump_label_update(struct jump_label_key *key,
>  				struct jump_entry *entry,
> -				struct jump_entry *stop, int enable)
> +				struct jump_entry *stop, int enable,
> +				void (*transform)(struct jump_entry *, enum jump_label_type))
>  {
>  	for (; (entry < stop) &&
>  	      (entry->key == (jump_label_t)(unsigned long)key);
> @@ -129,7 +135,7 @@ static void __jump_label_update(struct j
>  		 * init code, see jump_label_invalidate_module_init().
>  		 */
>  		if (entry->code && kernel_text_address(entry->code))
> -			arch_jump_label_transform(entry, enable);
> +			transform(entry, enable);
>  	}
>  }
>  
> @@ -147,8 +153,7 @@ void __init jump_label_init(void)
>  		struct jump_label_key *iterk;
>  
>  		iterk = (struct jump_label_key *)(unsigned long)iter->key;
> -		arch_jump_label_transform_static(iter, jump_label_enabled(iterk) ?
> -						 JUMP_LABEL_ENABLE : JUMP_LABEL_DISABLE);
> +		arch_jump_label_transform_static(iter, jump_label_dyn_type(iterk));
>  		if (iterk == key)
>  			continue;
>  
> @@ -193,7 +198,7 @@ static void __jump_label_mod_update(stru
>  
>  		__jump_label_update(key, mod->entries,
>  				    m->jump_entries + m->num_jump_entries,
> -				    enable);
> +				    enable, arch_jump_label_transform);
>  		mod = mod->next;
>  	}
>  }
> @@ -256,9 +261,8 @@ static int jump_label_add_module(struct
>  		jlm->next = key->next;
>  		key->next = jlm;
>  
> -		if (jump_label_enabled(key))
> -			__jump_label_update(key, iter, iter_stop,
> -					    JUMP_LABEL_ENABLE);
> +		__jump_label_update(key, iter, iter_stop, jump_label_dyn_type(key),
> +				arch_jump_label_transform_static);
>  	}
>  
>  	return 0;
> @@ -392,7 +396,7 @@ static void jump_label_update(struct jum
>  #endif
>  	/* if there are no users, entry can be NULL */
>  	if (entry)
> -		__jump_label_update(key, entry, stop, enable);
> +		__jump_label_update(key, entry, stop, enable, arch_jump_label_transform);
>  }
>  
>  #endif
> 

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 09:05:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 09:05:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RENmQ-0003FO-Kj; Thu, 13 Oct 2011 09:05:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RENjX-00030j-7b
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 09:02:12 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318521728!911434!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8232 invoked from network); 13 Oct 2011 16:02:08 -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; 13 Oct 2011 16:02:08 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 13 Oct 2011 17:02:07 +0100
Message-Id: <4E97279E020000780005B3B2@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 13 Oct 2011 17:02:06 +0100
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] shared_cpu_map member never initialized but possibly
	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

Mark,

in c/s 20361:51b031b0737e you removed the only place where this
member got initialized, yet the powernow driver does actually read that
field (at least theoretically). Assuming only RevF processors actually
used sharing, shouldn't the code reading the field and the field itself be
deleted (amending said c/s)?

Thanks, Jan

--- a/xen/arch/x86/acpi/cpufreq/powernow.c
+++ b/xen/arch/x86/acpi/cpufreq/powernow.c
@@ -199,17 +199,7 @@ static int powernow_cpufreq_cpu_init(str
=20
     perf =3D data->acpi_data;
     policy->shared_type =3D perf->shared_type;
-
-    /*
-     * 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
-    }
+    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 Oct 13 09:27:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 09: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 1REO83-0003wD-J5; Thu, 13 Oct 2011 09:27:31 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1REO75-0003jc-S2
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 09:26:32 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318523188!920555!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10370 invoked from network); 13 Oct 2011 16:26:28 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-12.tower-216.messagelabs.com with SMTP;
	13 Oct 2011 16:26:28 -0000
Received: from [83.211.179.105] (account d.faggioli@sssup.it HELO
	[192.168.0.3]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72383816; Thu, 13 Oct 2011 18:26:27 +0200
From: Dario Faggioli <raistlin@linux.it>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 13 Oct 2011 18:26:26 +0200
In-Reply-To: <20111013154053.GA12588@phenom.oracle.com>
References: <1318353219.21925.80.camel@Palantir>
	<20111011173228.GB32406@phenom.oracle.com>
	<4E9495F6.4070301@tycho.nsa.gov>
	<20111013154053.GA12588@phenom.oracle.com>
Face: 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
X-Mailer: Evolution 3.0.3 (3.0.3-1.fc15) 
Message-ID: <1318523187.5062.8.camel@Palantir>
Mime-Version: 1.0
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	xen-devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH] xen/gntdev: Fix sleep-inside-spinlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0116986909=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============0116986909==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-F3DaolTThZGn+LYM6TRj"


--=-F3DaolTThZGn+LYM6TRj
Content-Type: multipart/mixed; boundary="=-HSqUwF/soyAIBr8f77RL"


--=-HSqUwF/soyAIBr8f77RL
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, 2011-10-13 at 11:40 -0400, Konrad Rzeszutek Wilk wrote:
> Dario, does the patch fix the problem for you?
>=20
Here I am, and sorry for being late, I had issues with a testbox and
needed to setup a new one.

Actually, I was just trying to check that, but I'm now hitting this when
trying to boot a PV-guest:
[    6.129478] BUG: scheduling while atomic: swapper/0/0x10000002
[    6.129483] no locks held by swapper/0.
[    6.129487] Pid: 0, comm: swapper Not tainted 3.1.0-rc9+ #14
[    6.129492] Call Trace:
[    6.129504]  [<ffffffff81054550>] __schedule_bug+0x80/0x85
[    6.129513]  [<ffffffff81b7fc73>] __schedule+0xa5/0x6ad
[    6.129520]  [<ffffffff8105aed1>] __cond_resched+0x2a/0x35
[    6.129525]  [<ffffffff81b802f6>] _cond_resched+0x2c/0x37
[    6.129533]  [<ffffffff810dedce>] __alloc_pages_nodemask+0xa5/0x73a
[    6.129542]  [<ffffffff810082c5>] ? p2m_top_index+0x9/0x1f
[    6.129547]  [<ffffffff8100849b>] ? get_phys_to_machine+0x1f/0x62
[    6.129556]  [<ffffffff8143ee6d>] ? trace_hardirqs_off_thunk+0x3a/0x3c
[    6.129562]  [<ffffffff8143ee2e>] ? trace_hardirqs_on_thunk+0x3a/0x3f
[    6.129568]  [<ffffffff81b831b4>] ? retint_restore_args+0x13/0x13
[    6.129573]  [<ffffffff810082c5>] ? p2m_top_index+0x9/0x1f
[    6.129581]  [<ffffffff8110d445>] alloc_page_interleave+0x39/0x86
[    6.129587]  [<ffffffff81004e0d>] ? xen_make_pte+0x8a/0x8e
[    6.129592]  [<ffffffff8110d501>] alloc_pages_current+0x6f/0xbf
[    6.129598]  [<ffffffff810dd92a>] __get_free_pages+0xe/0x3d
[    6.129605]  [<ffffffff8103acc0>] pte_alloc_one_kernel+0x15/0x17
[    6.129611]  [<ffffffff810f56d9>] __pte_alloc_kernel+0x1b/0xf4
[    6.129617]  [<ffffffff8110292a>] vmap_page_range_noflush+0x1c5/0x317
[    6.129623]  [<ffffffff81102aae>] ? map_vm_area+0x32/0x46
[    6.129629]  [<ffffffff8100763d>] ? xen_force_evtchn_callback+0xd/0xf
[    6.129634]  [<ffffffff81102aae>] map_vm_area+0x32/0x46
[    6.129640]  [<ffffffff81103a94>] __vmalloc_node_range+0x194/0x1d6
[    6.129648]  [<ffffffff8254a0a5>] ? alloc_large_system_hash+0x14c/0x203
[    6.129654]  [<ffffffff81007d4f>] ? xen_restore_fl_direct_reloc+0x4/0x4
[    6.129660]  [<ffffffff81103b0b>] __vmalloc_node+0x35/0x37
[    6.129666]  [<ffffffff8254a0a5>] ? alloc_large_system_hash+0x14c/0x203
[    6.129672]  [<ffffffff81103cd3>] __vmalloc+0x20/0x22
[    6.129677]  [<ffffffff8254a0a5>] alloc_large_system_hash+0x14c/0x203
[    6.129683]  [<ffffffff8254e4bb>] vfs_caches_init+0x9d/0x10f
[    6.129690]  [<ffffffff82529da9>] start_kernel+0x378/0x3b5
[    6.129696]  [<ffffffff825292cd>] x86_64_start_reservations+0xb8/0xbc
[    6.129702]  [<ffffffff8252cfc7>] xen_start_kernel+0x5ab/0x5b2

So, am I doing something stupid (e.g., VM config file, which is
attached) or this is a different thing as a whole? :-O

I have to say that I updated both Linux and xen-unstable in these days.

Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-HSqUwF/soyAIBr8f77RL
Content-Disposition: attachment; filename="Debian-squeeze.pv"
Content-Transfer-Encoding: base64
Content-Type: text/plain; name="Debian-squeeze.pv"; charset="UTF-8"

Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgS2VybmVsIGltYWdlIGZpbGUuDQprZXJuZWwgPSAiL2Jv
b3Qvdm1saW51ei0zLjEuMC1yYzkiDQpleHRyYSA9ICJyb290PS9kZXYvc2RhMSBybyINCg0KIyBP
cHRpb25hbCByYW1kaXNrLg0KI3JhbWRpc2sgPSAiL2Jvb3QvaW5pdHJkLmd6Ig0KDQojIFRoZSBk
b21haW4gYnVpbGQgZnVuY3Rpb24uIERlZmF1bHQgaXMgJ2xpbnV4Jy4NCiNidWlsZGVyPSdsaW51
eCcNCg0KIyBJbml0aWFsIG1lbW9yeSBhbGxvY2F0aW9uIChpbiBtZWdhYnl0ZXMpIGZvciB0aGUg
bmV3IGRvbWFpbi4NCiMNCiMgV0FSTklORzogQ3JlYXRpbmcgYSBkb21haW4gd2l0aCBpbnN1ZmZp
Y2llbnQgbWVtb3J5IG1heSBjYXVzZSBvdXQgb2YNCiMgICAgICAgICAgbWVtb3J5IGVycm9ycy4g
VGhlIGRvbWFpbiBuZWVkcyBlbm91Z2ggbWVtb3J5IHRvIGJvb3Qga2VybmVsDQojICAgICAgICAg
IGFuZCBtb2R1bGVzLiBBbGxvY2F0aW5nIGxlc3MgdGhhbiAzMk1CcyBpcyBub3QgcmVjb21tZW5k
ZWQuDQptZW1vcnkgPSAxMjgNCg0KIyBTaGFkb3cgcGFnZXRhYmxlIG1lbW9yeSBmb3IgdGhlIGRv
bWFpbiwgaW4gTUIuDQojIElmIG5vdCBleHBsaWNpY3RseSBzZXQsIHhlbmQgd2lsbCBwaWNrIGFu
IGFwcHJvcHJpYXRlIHZhbHVlLiAgDQojIFNob3VsZCBiZSBhdCBsZWFzdCAyS0IgcGVyIE1CIG9m
IGRvbWFpbiBtZW1vcnksIHBsdXMgYSBmZXcgTUIgcGVyIHZjcHUuDQojIHNoYWRvd19tZW1vcnkg
PSA4DQoNCiMgV2hldGhlciB0byB0cmFuc3BhcmVudGx5IHNoYXJlIHRoaXMgZG9tYWluJ3MgbWVt
b3J5IHdpdGggb3RoZXIgZG9tYWlucy4NCiMgZGVmYXVsdCA9IDANCiMgbWVtb3J5X3NoYXJpbmcg
PSAwDQoNCiMgQSBuYW1lIGZvciB5b3VyIGRvbWFpbi4gQWxsIGRvbWFpbnMgbXVzdCBoYXZlIGRp
ZmZlcmVudCBuYW1lcy4NCm5hbWUgPSAiRGViaWFuLXN1cWVlemVfcHYiDQoNCiMgMTI4LWJpdCBV
VUlEIGZvciB0aGUgZG9tYWluLiAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gZ2VuZXJhdGUg
YSBuZXcgVVVJRA0KIyBvbiBlYWNoIGNhbGwgdG8gJ3htIGNyZWF0ZScuDQojdXVpZCA9ICIwNmVk
MDBmZS0xMTYyLTRmYzQtYjVkOC0xMTk5M2VlNGE4YjkiDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQ0KIyBUaGUgbnVtYmVyIG9mIGNwdXMgZ3Vlc3QgcGxhdGZvcm0gaGFzLCBkZWZhdWx0PTENCnZj
cHVzPTENCg0KIyBFbmFibGUvZGlzYWJsZSBIVk0gZ3Vlc3QgUEFFLCBkZWZhdWx0PTEgKGVuYWJs
ZWQpDQojcGFlPTENCg0KIyBFbmFibGUvZGlzYWJsZSBIVk0gZ3Vlc3QgQUNQSSwgZGVmYXVsdD0x
IChlbmFibGVkKQ0KI2FjcGk9MQ0KDQojIEVuYWJsZS9kaXNhYmxlIEhWTSBBUElDIG1vZGUsIGRl
ZmF1bHQ9MSAoZW5hYmxlZCkNCiMgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYg
dmNwdXMgPiAxDQojYXBpYz0xDQoNCiMgRW5hYmxlL2Rpc2FibGUgZXh0ZW5kZWQgcG93ZXIgbWFu
YWdlbWVudCBzdXBwb3J0IHdpdGhpbiBIVk0gZ3Vlc3QsIGkuZS4sIGJleW9uZA0KIyBTMywgUzQs
IFM1IHdpdGhpbiBndWVzdCBsaWtlIGV4cG9zaW5nIGJhdHRlcnkgbWV0ZXIuDQojIDAgKGRlZmF1
bHQgb3B0aW9uLCBleHRlbmRlZCBwb3dlciBtYW5hZ2VtZW50IHN1cHBvcnQgZGlzYWJsZWQpDQoj
IDEgKHBhc3MtdGhyb3VnaCBtb2RlOyB1c2VzIHBhc3MtdGhyb3VnaCBhcyBuZWVkZWQ7IGVmZmlj
aWVudCBidXQgbGltaXRlZCBpbiBzY29wZSkNCiMgMiAobm9uIHBhc3MtdGhyb3VnaCBtb2RlOyBl
eHRlbmRlZCBzY29wZSwgbGlrZWx5IHRvIHdvcmsgb24gYWxsIGFwcGxpY2FibGUgZW52aXJvbm1l
bnQNCiMgICAgYnV0IGNvbXBhcml0aXZlbHkgbGVzcyBlZmZpY2llbnQgdGhhbiBwYXNzLXRocm91
Z2ggbW9kZSkNCiMgeGVuX2V4dGVuZGVkX3Bvd2VyX21nbXQ9MA0KDQojIExpc3Qgb2Ygd2hpY2gg
Q1BVUyB0aGlzIGRvbWFpbiBpcyBhbGxvd2VkIHRvIHVzZSwgZGVmYXVsdCBYZW4gcGlja3MNCiNj
cHVzID0gIiIgICAgICAgICAjIGxlYXZlIHRvIFhlbiB0byBwaWNrDQojY3B1cyA9ICIwIiAgICAg
ICAgIyBhbGwgdmNwdXMgcnVuIG9uIENQVTANCiNjcHVzID0gIjAtMyw1LF4xIiAjIGFsbCB2Y3B1
cyBydW4gb24gY3B1cyAwLDIsMyw1DQojY3B1cyA9IFsiMiIsICIzIl0gIyBWQ1BVMCBydW5zIG9u
IENQVTIsIFZDUFUxIHJ1bnMgb24gQ1BVMw0KDQojIE9wdGlvbmFsbHkgZGVmaW5lIG1hYyBhbmQv
b3IgYnJpZGdlIGZvciB0aGUgbmV0d29yayBpbnRlcmZhY2VzLg0KIyBSYW5kb20gTUFDcyBhcmUg
YXNzaWduZWQgaWYgbm90IGdpdmVuLg0KI3ZpZiA9IFsgJ3R5cGU9aW9lbXUsIG1hYz0wMDoxNjoz
ZTowMDowMDoxMSwgYnJpZGdlPXhlbmJyMCwgbW9kZWw9bmUya19wY2knIF0NCiMgdHlwZT1pb2Vt
dSBzcGVjaWZ5IHRoZSBOSUMgaXMgYW4gaW9lbXUgZGV2aWNlIG5vdCBuZXRmcm9udA0KdmlmID0g
WyAndHlwZT1pb2VtdSwgYnJpZGdlPXhlbmJyMCcgXQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K
IyBEZWZpbmUgdGhlIGRpc2sgZGV2aWNlcyB5b3Ugd2FudCB0aGUgZG9tYWluIHRvIGhhdmUgYWNj
ZXNzIHRvLCBhbmQNCiMgd2hhdCB5b3Ugd2FudCB0aGVtIGFjY2Vzc2libGUgYXMuDQojIEVhY2gg
ZGlzayBlbnRyeSBpcyBvZiB0aGUgZm9ybSBwaHk6VU5BTUUsREVWLE1PREUNCiMgd2hlcmUgVU5B
TUUgaXMgdGhlIGRldmljZSwgREVWIGlzIHRoZSBkZXZpY2UgbmFtZSB0aGUgZG9tYWluIHdpbGwg
c2VlLA0KIyBhbmQgTU9ERSBpcyByIGZvciByZWFkLW9ubHksIHcgZm9yIHJlYWQtd3JpdGUuDQoN
CiNkaXNrID0gWyAncGh5OmhkYTEsaGRhMSxyJyBdDQojZGlzayA9IFsgJ3ZkZXY9eHZkYSwgYWNj
ZXNzPXJ3LCB0YXJnZXQ9L2Rldi9sb29wMCcgXQ0KZGlzayA9IFsgJ2Zvcm1hdD1xY293MiwgdmRl
dj1oZGEsIGFjY2Vzcz1ydywgdGFyZ2V0PS9yb290L3hlbi9WTXMvZGViaWFuX3NxdWVlemVfYW1k
NjRfc3RhbmRhcmQucWNvdzInIF0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQ29uZmlndXJl
IHRoZSBiZWhhdmlvdXIgd2hlbiBhIGRvbWFpbiBleGl0cy4gIFRoZXJlIGFyZSB0aHJlZSAncmVh
c29ucycNCiMgZm9yIGEgZG9tYWluIHRvIHN0b3A6IHBvd2Vyb2ZmLCByZWJvb3QsIGFuZCBjcmFz
aC4gIEZvciBlYWNoIG9mIHRoZXNlIHlvdQ0KIyBtYXkgc3BlY2lmeToNCiMNCiMgICAiZGVzdHJv
eSIsICAgICAgICBtZWFuaW5nIHRoYXQgdGhlIGRvbWFpbiBpcyBjbGVhbmVkIHVwIGFzIG5vcm1h
bDsNCiMgICAicmVzdGFydCIsICAgICAgICBtZWFuaW5nIHRoYXQgYSBuZXcgZG9tYWluIGlzIHN0
YXJ0ZWQgaW4gcGxhY2Ugb2YgdGhlIG9sZA0KIyAgICAgICAgICAgICAgICAgICAgIG9uZTsNCiMg
ICAicHJlc2VydmUiLCAgICAgICBtZWFuaW5nIHRoYXQgbm8gY2xlYW4tdXAgaXMgZG9uZSB1bnRp
bCB0aGUgZG9tYWluIGlzDQojICAgICAgICAgICAgICAgICAgICAgbWFudWFsbHkgZGVzdHJveWVk
ICh1c2luZyB4bSBkZXN0cm95LCBmb3IgZXhhbXBsZSk7IG9yDQojICAgInJlbmFtZS1yZXN0YXJ0
IiwgbWVhbmluZyB0aGF0IHRoZSBvbGQgZG9tYWluIGlzIG5vdCBjbGVhbmVkIHVwLCBidXQgaXMN
CiMgICAgICAgICAgICAgICAgICAgICByZW5hbWVkIGFuZCBhIG5ldyBkb21haW4gc3RhcnRlZCBp
biBpdHMgcGxhY2UuDQojDQojIEluIHRoZSBldmVudCBhIGRvbWFpbiBzdG9wcyBkdWUgdG8gYSBj
cmFzaCwgeW91IGhhdmUgdGhlIGFkZGl0aW9uYWwgb3B0aW9uczoNCiMNCiMgICAiY29yZWR1bXAt
ZGVzdHJveSIsIG1lYW5pbmcgZHVtcCB0aGUgY3Jhc2hlZCBkb21haW4ncyBjb3JlIGFuZCB0aGVu
IGRlc3Ryb3k7DQojICAgImNvcmVkdW1wLXJlc3RhcnQnLCBtZWFuaW5nIGR1bXAgdGhlIGNyYXNo
ZWQgZG9tYWluJ3MgY29yZSBhbmQgdGhlIHJlc3RhcnQuDQojDQojIFRoZSBkZWZhdWx0IGlzDQoj
DQojICAgb25fcG93ZXJvZmYgPSAnZGVzdHJveScNCiMgICBvbl9yZWJvb3QgICA9ICdyZXN0YXJ0
Jw0KIyAgIG9uX2NyYXNoICAgID0gJ3Jlc3RhcnQnDQojDQojIEZvciBiYWNrd2FyZHMgY29tcGF0
aWJpbGl0eSB3ZSBhbHNvIHN1cHBvcnQgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uIHJlc3RhcnQNCiMN
CiMgcmVzdGFydCA9ICdvbnJlYm9vdCcgbWVhbnMgb25fcG93ZXJvZmYgPSAnZGVzdHJveScNCiMg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fcmVib290ICAgPSAncmVzdGFydCcNCiMgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgb25fY3Jhc2ggICAgPSAnZGVzdHJveScNCiMNCiMgcmVz
dGFydCA9ICdhbHdheXMnICAgbWVhbnMgb25fcG93ZXJvZmYgPSAncmVzdGFydCcNCiMgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgb25fcmVib290ICAgPSAncmVzdGFydCcNCiMgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgb25fY3Jhc2ggICAgPSAncmVzdGFydCcNCiMNCiMgcmVzdGFydCA9
ICduZXZlcicgICAgbWVhbnMgb25fcG93ZXJvZmYgPSAnZGVzdHJveScNCiMgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgb25fcmVib290ICAgPSAnZGVzdHJveScNCiMgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgb25fY3Jhc2ggICAgPSAnZGVzdHJveScNCg0KI29uX3Bvd2Vyb2ZmID0gJ2Rl
c3Ryb3knDQojb25fcmVib290ICAgPSAncmVzdGFydCcNCiNvbl9jcmFzaCAgICA9ICdyZXN0YXJ0
Jw0KDQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQojIERldmljZSBNb2RlbCB0byBiZSB1c2VkDQpk
ZXZpY2VfbW9kZWwgPSAncWVtdS1kbScNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIGJvb3Qg
b24gZmxvcHB5IChhKSwgaGFyZCBkaXNrIChjKSwgTmV0d29yayAobikgb3IgQ0QtUk9NIChkKSAN
CiMgZGVmYXVsdDogaGFyZCBkaXNrLCBjZC1yb20sIGZsb3BweQ0KI2Jvb3Q9ImNkYSINCg0KIy0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tDQojICB3cml0ZSB0byB0ZW1wb3JhcnkgZmlsZXMgaW5zdGVhZCBv
ZiBkaXNrIGltYWdlIGZpbGVzDQojc25hcHNob3Q9MQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K
IyBlbmFibGUgU0RMIGxpYnJhcnkgZm9yIGdyYXBoaWNzLCBkZWZhdWx0ID0gMA0Kc2RsPTANCg0K
Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgZW5hYmxlIE9wZW5HTCBmb3IgdGV4dHVyZSByZW5kZXJp
bmcgaW5zaWRlIHRoZSBTREwgd2luZG93LCBkZWZhdWx0ID0gMQ0KIyB2YWxpZCBvbmx5IGlmIHNk
bCBpcyBlbmFibGVkLg0Kb3BlbmdsPTENCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgZW5hYmxl
IFZOQyBsaWJyYXJ5IGZvciBncmFwaGljcywgZGVmYXVsdCA9IDENCnZuYz0xDQoNCiMtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tDQojIGFkZHJlc3MgdGhhdCBzaG91bGQgYmUgbGlzdGVuZWQgb24gZm9yIHRo
ZSBWTkMgc2VydmVyIGlmIHZuYyBpcyBzZXQuDQojIGRlZmF1bHQgaXMgdG8gdXNlICd2bmMtbGlz
dGVuJyBzZXR0aW5nIGZyb20NCiMgYXV4YmluLnhlbl9jb25maWdkaXIoKSArIC94ZW5kLWNvbmZp
Zy5zeHANCiN2bmNsaXN0ZW49IjEyNy4wLjAuMSINCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMg
c2V0IFZOQyBkaXNwbGF5IG51bWJlciwgZGVmYXVsdCA9IGRvbWlkDQojdm5jZGlzcGxheT0xDQoN
CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIHRyeSB0byBmaW5kIGFuIHVudXNlZCBwb3J0IGZvciB0
aGUgVk5DIHNlcnZlciwgZGVmYXVsdCA9IDENCiN2bmN1bnVzZWQ9MQ0KDQojLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQ0KIyBzZXQgcGFzc3dvcmQgZm9yIGRvbWFpbidzIFZOQyBjb25zb2xlDQojIGRlZmF1
bHQgaXMgZGVwZW50cyBvbiB2bmNwYXNzd2QgaW4geGVuZC1jb25maWcuc3hwDQp2bmNwYXNzd2Q9
JycNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgbm8gZ3JhcGhpY3MsIHVzZSBzZXJpYWwgcG9y
dA0KI25vZ3JhcGhpYz0wDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIGVuYWJsZSBzdGR2Z2Es
IGRlZmF1bHQgPSAwICh1c2UgY2lycnVzIGxvZ2ljIGRldmljZSBtb2RlbCkNCnN0ZHZnYT0wDQoN
CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgIHNlcmlhbCBwb3J0IHJlLWRpcmVjdCB0byBwdHkg
ZGVpdmNlLCAvZGV2L3B0cy9uIA0KIyAgIHRoZW4geG0gY29uc29sZSBvciBtaW5pY29tIGNhbiBj
b25uZWN0DQpzZXJpYWw9J3B0eScNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgICB0c2NfbW9k
ZSA6IFRTQyBtb2RlICgwPWRlZmF1bHQsIDE9bmF0aXZlIFRTQywgMj1uZXZlciBlbXVsYXRlLCAz
PXB2cmR0c2NwKQ0KIyAgIGVtdWxhdGUgVFNDIHByb3ZpZGVzIHN5bmNlZCBUU0MgZm9yIGFsbCB2
Y3B1cywgYnV0IGxvc2UgcGVyZm9tcmFuY2UuDQojICAgbmF0aXZlIFRTQyBsZXZlcmFnZXMgaGFy
ZHdhcmUncyBUU0Mobm8gcGVyZiBsb3NzKSwgYnV0IHZjcHUncyBUU0MgbWF5IGxvc2UNCiMgICAg
c3luYyBkdWUgdG8gaGFyZHdhcmUncyB1bnJlbGlhYmxlL3Vuc3luY2VkIFRTQyBiZXR3ZWVuIENQ
VXMuDQojICAgZGVmYXVsdCBpbnRlbGxpZ2VudGx5IHVzZXMgbmF0aXZlIFRTQyBvbiBtYWNoaW5l
cyB3aGVyZSBpdCBpcyBzYWZlLCBidXQNCiMgICAgc3dpdGNoZXMgdG8gZW11bGF0ZWQgaWYgbmVj
ZXNzYXJ5IGFmdGVyIHNhdmUvcmVzdG9yZS9taWdyYXRpb24NCiMgICBwdnJkdHNjcCBpcyBmb3Ig
aW50ZWxsaWdlbnQgYXBwcyB0aGF0IHVzZSBzcGVjaWFsIFhlbi1vbmx5IHBhcmF2aXJ0dWFsaXpl
ZA0KIyAgICBjcHVpZCBpbnN0cnVjdGlvbnMgdG8gb2J0YWluIG9mZnNldC9zY2FsaW5nL21pZ3Jh
dGlvbiBpbmZvIGFuZCBtYXhpbWl6ZQ0KIyAgICBwZXJmb3JtYW5jZSB3aXRoaW4gcG9vbHMgb2Yg
bWFjaGluZXMgdGhhdCBzdXBwb3J0IHRoZSByZHRzY3AgaW5zdHJ1Y3Rpb24NCnRzY19tb2RlPTAN
Cg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICAgUWVtdSBNb25pdG9yLCBkZWZhdWx0IGlzIGRp
c2FibGUNCiMgICBVc2UgY3RybC1hbHQtMiB0byBjb25uZWN0DQojbW9uaXRvcj0xDQoNCg0KIy0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tDQojICAgZW5hYmxlIHNvdW5kIGNhcmQgc3VwcG9ydCwgW3NiMTZ8
ZXMxMzcwfGFsbHwuLiwuLl0sIGRlZmF1bHQgbm9uZQ0KI3NvdW5kaHc9J3NiMTYnDQoNCg0KIy0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tDQojICAgIHNldCB0aGUgcmVhbCB0aW1lIGNsb2NrIHRvIGxvY2Fs
IHRpbWUgW2RlZmF1bHQ9MCBpLmUuIHNldCB0byB1dGNdDQojbG9jYWx0aW1lPTENCg0KDQojLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0NCiMgICAgc2V0IHRoZSByZWFsIHRpbWUgY2xvY2sgb2Zmc2V0IGlu
IHNlY29uZHMgW2RlZmF1bHQ9MCBpLmUuIHNhbWUgYXMgZG9tMF0NCiNydGNfdGltZW9mZnNldD0z
NjAwDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgICBzdGFydCBpbiBmdWxsIHNjcmVlbg0K
I2Z1bGwtc2NyZWVuPTEgICANCg0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgICBFbmFibGUg
VVNCIHN1cHBvcnQgKHNwZWNpZmljIGRldmljZXMgc3BlY2lmaWVkIGF0IHJ1bnRpbWUgdGhyb3Vn
aCB0aGUNCiMJCQltb25pdG9yIHdpbmRvdykNCiN1c2I9MQ0KDQojICAgRW5hYmxlIFVTQiBtb3Vz
ZSBzdXBwb3J0IChvbmx5IGVuYWJsZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgYG1vdXNlJyBmb3IN
CiMJCQkgICAgICBQUy8yIHByb3RvY29sIHJlbGF0aXZlIG1vdXNlLCBgdGFibGV0JyBmb3INCiMJ
CQkgICAgICBhYnNvbHV0ZSBtb3VzZSkNCiN1c2JkZXZpY2U9J21vdXNlJw0KI3VzYmRldmljZT0n
dGFibGV0Jw0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgICBTZXQga2V5Ym9hcmQgbGF5b3V0
LCBkZWZhdWx0IGlzIGVuLXVzIGtleWJvYXJkLiANCiNrZXltYXA9J2phJw0KDQojLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0NCiMgICBFbmFibGUvZGlzYWJsZSB4ZW4gcGxhdGZvcm0gUENJIGRldmljZSwg
ZGVmYXVsdD0xIChlbmFibGVkKQ0KI3hlbl9wbGF0Zm9ybV9wY2k9MQ0KDQojLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0NCiMgICBDb25maWd1cmUgZ3Vlc3QgQ1BVSUQgcmVzcG9uc2VzOg0KIw0KI2NwdWlk
PVsgJzE6ZWN4PXh4eHh4eHh4eHh4MDB4eHh4eHh4eHh4eHh4eHh4eHh4LA0KIyAgICAgICAgICAg
ZWF4PXh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4JyBdDQojIC0gVW5zZXQgdGhlIFNT
RTQgZmVhdHVyZXMgKENQVUlELjFbRUNYXVsyMC0xOV0pDQojIC0gRGVmYXVsdCBiZWhhdmlvdXIg
Zm9yIGFsbCBvdGhlciBiaXRzIGluIEVDWCBBbmQgRUFYIHJlZ2lzdGVycy4NCiMgDQojIEVhY2gg
c3VjY2Vzc2l2ZSBjaGFyYWN0ZXIgcmVwcmVzZW50IGEgbGVzc2VyLXNpZ25pZmljYW50IGJpdDoN
CiMgICcxJyAtPiBmb3JjZSB0aGUgY29ycmVzcG9uZGluZyBiaXQgdG8gMQ0KIyAgJzAnIC0+IGZv
cmNlIHRvIDANCiMgICd4JyAtPiBHZXQgYSBzYWZlIHZhbHVlIChwYXNzIHRocm91Z2ggYW5kIG1h
c2sgd2l0aCB0aGUgZGVmYXVsdCBwb2xpY3kpDQojICAnaycgLT4gcGFzcyB0aHJvdWdoIHRoZSBo
b3N0IGJpdCB2YWx1ZQ0KIyAgJ3MnIC0+IGFzICdrJyBidXQgcHJlc2VydmUgYWNyb3NzIHNhdmUv
cmVzdG9yZSBhbmQgbWlncmF0aW9uDQojIA0KIyAgIEV4cG9zZSB0byB0aGUgZ3Vlc3QgbXVsdGkt
Y29yZSBjcHUgaW5zdGVhZCBvZiBtdWx0aXBsZSBwcm9jZXNzb3JzDQojIEV4YW1wbGUgZm9yIGlu
dGVsLCBleHBvc2UgYSA4LWNvcmUgcHJvY2Vzc29yIDoNCiNjcHVpZD1bJzE6ZWR4PXh4eDF4eHh4
eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4LA0KIyAgICAgICAgICBlYng9eHh4eHh4eHgwMDAxMDAw
MHh4eHh4eHh4eHh4eHh4eHgnLA0KIyAgICAgJzQsMDplYXg9MDAxMTExeHh4eHh4eHh4eHh4eHh4
eHh4eHh4eHh4eHgnXQ0KIyAgLSBDUFVJRC4xW0VEWF1bSFRdIDogRW5hYmxlIEhUDQojICAtIENQ
VUlELjFbRUJYXSA6IE51bWJlciBvZiB2Y3B1cyAqIDINCiMgIC0gQ1BVSUQuNCwwW0VBWF0gOiBO
dW1iZXIgb2YgdmNwdXMgKiAyIC0gMQ0KI3ZjcHVzPTgNCiMNCiMgRXhhbXBsZSBmb3IgYW1kLCBl
eHBvc2UgYSA1LWNvcmUgcHJvY2Vzc29yIDoNCiMgY3B1aWQgPSBbJzE6ZWJ4PXh4eHh4eHh4MDAw
MDEwMTB4eHh4eHh4eHh4eHh4eHh4LA0KIyAgICAgICAgICAgICBlZHg9eHh4MXh4eHh4eHh4eHh4
eHh4eHh4eHh4eHh4eHh4eHgnLA0KIyAnMHg4MDAwMDAwMTplY3g9eHh4eHh4eHh4eHh4eHh4eHh4
eHh4eHh4eHh4eHh4MXgnLA0KIyAnMHg4MDAwMDAwODplY3g9eHh4eHh4eHh4eHh4eHh4eHh4eHh4
eHh4eHgwMDEwMDEnXQ0KIyAgIC0gQ1BVSUQuMVtFQlhdIDogVGhyZWFkcyBwZXIgQ29yZSAqIENv
cmVzIHBlciBTb2NrZXQgKDIgKiAjdmNwdXMpDQojICAgLSBDUFVJRC4xW0VEWF1bSFRdIDogRW5h
YmxlIEhUDQojICAgLSBDUFVJRC4weDgwMDAwMDAxW0NtcExlZ2FjeV0gOiBVc2UgbGVnYWN5IG1l
dGhvZA0KIyAgIC0gQ1BVSUQuMHg4MDAwMDAwOFtFQ1hdIDogI3ZjcHVzICogMiAtIDENCiN2Y3B1
cz01DQojDQojICBEb3duZ3JhZGUgdGhlIGNwdWlkIHRvIG1ha2UgYSBiZXR0ZXIgY29tcGF0aWJp
bGl0eSBmb3IgbWlncmF0aW9uIDoNCiMgTG9vayBsaWtlIGEgZ2VuZXJpYyA2ODYgOg0KIyBjcHVp
ZCA9IFsgJzA6ZWF4PTB4MyxlYng9MHgwLGVjeD0weDAsZWR4PTB4MCcsDQojICAgICAgICAgICAn
MTplYXg9MHgwNmIxLA0KIyAgICAgICAgICAgICAgZWN4PXh4eHh4eHh4eHh4MDAwMHh4MDB4eHgw
MDAwMDAweHgwLA0KIyAgICAgICAgICAgICAgZWR4PXh4eDAwMDAweHh4eHh4eDB4eHh4eHh4eHgw
eHh4eHh4JywNCiMgICAgICAgICAgICc0OmVheD0weDMsZWJ4PTB4MCxlY3g9MHgwLGVkeD0weDAn
LA0KIyAgJzB4ODAwMDAwMDA6ZWF4PTB4MyxlYng9MHgwLGVjeD0weDAsZWR4PTB4MCddDQojICB3
aXRoIHRoZSBoaWdoZXN0IGxlYWYNCiMgIC0gQ1BVSUQuMFtFQVhdIDogU2V0IHRoZSBoaWdoZXN0
IGxlYWYNCiMgIC0gQ1BVSUQuMVtFQVhdIDogNjg2IA0KIyAgLSBDUFVJRC4xW0VDWF0gOiBNYXNr
IHNvbWUgZmVhdHVyZXMNCiMgIC0gQ1BVSUQuMVtFRFhdIDogTWFzayBzb21lIGZlYXR1cmVzDQoj
ICAtIENQVUlELjQgOiBSZXBseSBsaWtlIHRoZSBoaWdoZXN0IGxlYWYsIGluIG91ciBjYXNlIENQ
VUlELjMNCiMgIC0gQ1BVSUQuMHg4MDAwMDAwMCA6IE5vIGV4dGVuc2lvbiB3ZSBhcmUgb24gYSBQ
ZW50aXVtIElJSSwgcmVwbHkgbGlrZSB0aGUNCiMgIGhpZ2hlc3QgbGVhZiAoQ1BVSUQuMykuDQoj
DQojICAgQ29uZmlndXJlIGhvc3QgQ1BVSUQgY29uc2lzdGVuY3kgY2hlY2tzLCB3aGljaCBtdXN0
IGJlIHNhdGlzZmllZCBmb3IgdGhpcw0KIyAgIFZNIHRvIGJlIGFsbG93ZWQgdG8gcnVuIG9uIHRo
aXMgaG9zdCdzIHByb2Nlc3NvciB0eXBlOg0KI2NwdWlkX2NoZWNrPVsgJzE6ZWN4PXh4eHh4eHh4
eHh4eHh4eHh4eHh4eHh4eHh4MXh4eHh4JyBdDQojIC0gSG9zdCBtdXN0IGhhdmUgVk1YIGZlYXR1
cmUgZmxhZyBzZXQNCiMNCiMgVGhlIGZvcm1hdCBpcyBzaW1pbGFyIHRvIHRoZSBhYm92ZSBmb3Ig
J2NwdWlkJzoNCiMgICcxJyAtPiB0aGUgYml0IG11c3QgYmUgJzEnDQojICAnMCcgLT4gdGhlIGJp
dCBtdXN0IGJlICcwJw0KIyAgJ3gnIC0+IHdlIGRvbid0IGNhcmUgKGRvIG5vdCBjaGVjaykNCiMg
ICdzJyAtPiB0aGUgYml0IG11c3QgYmUgdGhlIHNhbWUgYXMgb24gdGhlIGhvc3QgdGhhdCBzdGFy
dGVkIHRoaXMgVk0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICAgQ29uZmlndXJlIHBhc3N0
aHJvdWdoIFBDSXssLVgsZX0gZGV2aWNlczoNCiMNCiMgICBwY2k9WyAnW1NTU1M6XUJCOkRELkZb
LG9wdGlvbjFbLG9wdGlvbjJbLi4uXV1dJywgLi4uIF0NCiMNCiMgICBbU1NTU106QkI6REQuRiAg
ImJ1cyBzZWdtZW50OmJ1czpkZXZpY2UuZnVuY3Rpb24iKDEpIG9mIHRoZSBkZXZpY2UgdG8NCiMg
ICAgICAgICAgICAgICAgICAgYmUgYXNzaWduZWQsIGJ1cyBzZWdtZW50IGlzIG9wdGlvbmFsLiBB
bGwgZmllbGRzIGFyZQ0KIyAgICAgICAgICAgICAgICAgICBpbiBoZXhhZGVjaW1hbCBhbmQgbm8g
ZmllbGQgc2hvdWxkIGJlIGxvbmdlciB0aGFuIHRoYXQNCiMgICAgICAgICAgICAgICAgICAgYXMg
c2hvd24gaW4gdGhlIHBhdHRlcm4uIFN1Y2Nlc3NmdWwgYXNzaWdubWVudCBtYXkgbmVlZA0KIyAg
ICAgICAgICAgICAgICAgICBjZXJ0YWluIGhhcmR3YXJlIHN1cHBvcnQgYW5kIGFkZGl0aW9uYWwg
Y29uZmlndXJhdGlvbnMNCiMgICAgICAgICAgICAgICAgICAgKGUuZy4gVlQtZCwgc2VlIGRvY3Mv
bWlzYy92dGQudHh0IGZvciBtb3JlIGRldGFpbHMpLg0KIw0KIyAgICAgICAoMSkgYnVzIHNlZ21l
bnQgaXMgc29tZXRpbWVzIGFsc28gcmVmZXJyZWQgdG8gYXMgdGhlIFBDSSAiZG9tYWluIiwNCiMg
ICAgICAgICAgIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIFhlbiBkb21haW4uDQojDQojDQojICAg
b3B0aW9uTiAgICAgICAgIHBlci1kZXZpY2Ugb3B0aW9ucyBpbiAia2V5PXZhbCIgZm9ybWF0LiBD
dXJyZW50DQojICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBvcHRpb25zIGFyZToNCiMgICAg
ICAgICAgICAgICAgICAgLSBtc2l0cmFuc2xhdGU9MHwxDQojICAgICAgICAgICAgICAgICAgICAg
IHBlci1kZXZpY2Ugb3ZlcnJpZGVuIG9mIHBjaV9tc2l0cmFuc2xhdGUsIHNlZSBiZWxvdw0KIyAg
ICAgICAgICAgICAgICAgICAtIHBvd2VyX21nbXQ9MHwxDQojICAgICAgICAgICAgICAgICAgICAg
IHBlci1kZXZpY2Ugb3ZlcnJpZGVuIG9mIHBjaV9wb3dlcl9tZ210LCBzZWUgYmVsb3cNCiMNCiNw
Y2k9WyAnMDc6MDAuMCcsICcwNzowMC4xJyBdDQoNCiMgICBNU0ktSU5UeCB0cmFuc2xhdGlvbiBm
b3IgTVNJIGNhcGFibGUgZGV2aWNlczoNCiMNCiMgICBJZiBpdCdzIHNldCwgWGVuIHdpbGwgZW5h
YmxlIE1TSSBmb3IgdGhlIGRldmljZSB0aGF0IHN1cHBvcnRzIGl0IGV2ZW4NCiMgaWYgdGhlIGd1
ZXN0IGRvbid0IHVzZSBNU0kuIEluIHRoZSBjYXNlLCBhbiBJTy1BUElDIHR5cGUgaW50ZXJydXB0
IHdpbGwNCiMgYmUgaW5qZWN0ZWQgdG8gdGhlIGd1ZXN0IGV2ZXJ5IHRpbWUgYSBjb3JyZXNwb25k
aW5nIE1TSSBtZXNzYWdlIGlzDQojIHJlY2VpdmVkLg0KIyAgIElmIHRoZSBndWVzdCBlbmFibGVz
IE1TSSBvciBNU0ktWCwgdGhlIHRyYW5zbGF0aW9uIGlzIGF1dG9tYXRpY2FsbHkNCiMgdHVybmVk
IG9mZi4NCiMgDQojcGNpX21zaXRyYW5zbGF0ZT0xDQoNCiMgICBQQ0kgUG93ZXIgTWFuYWdlbWVu
dDoNCiMNCiMgICBJZiBpdCdzIHNldCwgdGhlIGd1ZXN0IE9TIHdpbGwgYmUgYWJsZSB0byBwcm9n
cmFtIEQwLUQzaG90IHN0YXRlcyBvZiB0aGUNCiMgUENJIGRldmljZSBmb3IgdGhlIHB1cnBvc2Ug
b2YgbG93IHBvd2VyIGNvbnN1bXB0aW9uLg0KIyANCiNwY2lfcG93ZXJfbWdtdD0wDQoNCiMgICBF
bmFibGUgZ3JhcGhpY3MgcGFzc3Rocm91Z2g6DQojDQojICAgSWYgaXQncyBzZXQsIGFuZCBzcGVj
aWZ5IGdyYXBjaGlzIGRldmljZSBCREYgaW4gcGNpIHBhc3N0aHJvdWdoIG9wdGlvbiwNCiMgbGlr
ZSBwY2k9Wyd4eDp4eC54J10sIGl0IGVuYWJsZXMgZ3JhcGhpY3MgcGFzc3Rocm91Z2gsIGRlZmF1
bHQ9MCAoZGlzYWJsZWQpDQojZ2Z4X3Bhc3N0aHJ1PTANCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
DQojICAgQ29uZmlndXJlIFBWU0NTSSBkZXZpY2VzOg0KIw0KI3ZzY3NpPVsgJ1BERVYsIFZERVYn
IF0NCiMNCiMgICBQREVWICAgZ2l2ZXMgcGh5c2ljYWwgU0NTSSBkZXZpY2UgdG8gYmUgYXR0YWNo
ZWQgdG8gc3BlY2lmaWVkIGd1ZXN0DQojICAgICAgICAgIGRvbWFpbiBieSBvbmUgb2YgdGhlIGZv
bGxvd2luZyBpZGVudGlmaWVyIGZvcm1hdC4NCiMgICAgICAgICAgLSBYWDpYWDpYWDpYWCAoNC10
dXBsZXMgd2l0aCBkZWNpbWFsIG5vdGF0aW9uIHdoaWNoIHNob3dzDQojICAgICAgICAgICAgICAg
ICAgICAgICAgICAiaG9zdDpjaGFubmVsOnRhcmdldDpsdW4iKQ0KIyAgICAgICAgICAtIC9kZXYv
c2R4eCBvciBzZHgNCiMgICAgICAgICAgLSAvZGV2L3N0eHggb3Igc3R4DQojICAgICAgICAgIC0g
L2Rldi9zZ3h4IG9yIHNneA0KIyAgICAgICAgICAtIHJlc3VsdCBvZiAnc2NzaV9pZCAtZ3UgLXMn
Lg0KIyAgICAgICAgICAgIGV4LiAjIHNjc2lfaWQgLWd1IC1zIC9ibG9jay9zZGINCiMgICAgICAg
ICAgICAgICAgICAzNjAwMGI1ZDAwMDZhMDAwMDAwNmEwMjU3MDA0YzAwMDANCiMNCiMgICBWREVW
ICAgZ2l2ZXMgdmlydHVhbCBTQ1NJIGRldmljZSBieSA0LXR1cGxlcyAoWFg6WFg6WFg6WFgpIGFz
IA0KIyAgICAgICAgICB3aGljaCB0aGUgc3BlY2lmaWVkIGd1ZXN0IGRvbWFpbiByZWNvZ25pemUu
DQojDQoNCiN2c2NzaSA9IFsgJy9kZXYvc2R4LCAwOjA6MDowJyBdDQo=


--=-HSqUwF/soyAIBr8f77RL--

--=-F3DaolTThZGn+LYM6TRj
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

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

iEYEABECAAYFAk6XETIACgkQk4XaBE3IOsSiLgCfXKgzZKH4SeFWczwFKqoiBvns
haIAn1daQQPWb8NTxC+kO6xBTLoJLRf9
=yEMS
-----END PGP SIGNATURE-----

--=-F3DaolTThZGn+LYM6TRj--



--===============0116986909==
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

--===============0116986909==--



From xen-devel-bounces@lists.xensource.com Thu Oct 13 09:33:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 09:33:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REODh-0004V9-RD; Thu, 13 Oct 2011 09:33:21 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REOD0-0004I8-QJ
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 09:32:39 -0700
X-Env-Sender: peterz@infradead.org
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318523525!59070702!1
X-Originating-IP: [85.118.1.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8357 invoked from network); 13 Oct 2011 16:32:05 -0000
Received: from casper.infradead.org (HELO casper.infradead.org) (85.118.1.10)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 16:32:05 -0000
Received: from j77219.upc-j.chello.nl ([24.132.77.219] helo=twins)
	by casper.infradead.org with esmtpsa (Exim 4.76 #1 (Red Hat Linux))
	id 1REOCZ-0002kX-BK; Thu, 13 Oct 2011 16:32:11 +0000
Received: by twins (Postfix, from userid 1000)
	id 2278C819FC15; Thu, 13 Oct 2011 18:32:06 +0200 (CEST)
From: Peter Zijlstra <peterz@infradead.org>
To: Jason Baron <jbaron@redhat.com>
Date: Thu, 13 Oct 2011 18:32:05 +0200
In-Reply-To: <20111013155553.GD2455@redhat.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<16f652166605c973e9817177b6ba6a081e3e5b3f.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<1318501954.24856.5.camel@twins> <20111013135439.GA2455@redhat.com>
	<1318519758.27731.15.camel@twins> <20111013155553.GD2455@redhat.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Mailer: Evolution 3.0.3- 
Message-ID: <1318523526.27731.18.camel@twins>
Mime-Version: 1.0
Cc: rth@redhat.com, Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Daney <david.daney@cavium.com>, Jan Glauber <jang@linux.vnet.ibm.com>,
	Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, David,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, Linux,
	Ingo Molnar <mingo@elte.hu>, "David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 06/10] jump_label: add
 arch_jump_label_transform_static() to optimise non-live code updates
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-13 at 11:55 -0400, Jason Baron wrote:
> > I actually need them to be either way.. no preference between on or off
> > just a means of very _very_ infrequent runtime change in behaviour.
> >=20
>=20
> ok, this is a new use case, all the current users are biased with gcc
> out-of-lining the infrequent case.

Right,=20

> > If we can push jump_label init to before sched_init() all I need is a
> > static_branch() without the unlikely() in to avoid GCC out-of-lining th=
e
> > branch.
> >=20
>=20
> hmmm....the current code (I believe) is biased  b/c gcc sees the
> branch as always false, see: arch_static_branch() - its not b/c we have
> an unlikely there. Without open coding the label, like we had before
> everybody hated, I'll have to play around and see what will create an
> unbiased branch...perhaps, somebody has an idea?=20

Fix gcc and stick an unlikely in static_branch() ? :-)

> > > and by patching them early
> > > like this, at least for x86, we can avoid the stop machine calls. So =
its
> > > the combination of most are expected to be off and no sense to call e=
xtra
> > > stop machines that lead the code to its present state.
> >=20
> > But we could use arch_jump_label_transform_static because its before we
> > actually execute any module text (sans the arg crap) which is
> > stomp-machine free, removing that obstacle.
> >=20
> > Or am I confused more?
> >=20
>=20
> The MODULE_COMING callback happens *after* the call to flush_module_icach=
e(mod),
> so I'm not sure that is safe...=20

We can issue another one of those?

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 09:46:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 09:46:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REOQm-0005sg-Oh; Thu, 13 Oct 2011 09:46:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REOOl-0005CA-KU
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 09:44:47 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318524259!53101731!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1886 invoked from network); 13 Oct 2011 16:44:20 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-6.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 16:44:20 -0000
Received: from tazenda.hos.anvin.org ([IPv6:2001:470:861f::feed:face:f00d])
	(authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9DGiCRX030132
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 09:44:13 -0700
Message-ID: <4E971557.1050706@zytor.com>
Date: Thu, 13 Oct 2011 09:44:07 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Borislav Petkov <bp@amd64.org>
References: <4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E96198F.4030906@zytor.com> <20111013073352.GB501@aftab>
	<20111013095708.GA1862@aftab>
In-Reply-To: <20111013095708.GA1862@aftab>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.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>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/13/2011 02:57 AM, Borislav Petkov wrote:
> On Thu, Oct 13, 2011 at 03:33:52AM -0400, Borislav Petkov wrote:
>> Bottomline is, extending initrd handling to deal with multiple initrd
>> images might turn out to be easier to do than the linked list deal.
> 
> Alternatively and IMHO, we could avoid the bootloader enabling by
> making the ucode part of the initramfs and pull up some of the
> prepare_namespace() work in kernel_init() before smp_init() so that we
> can have it ready for when bootstrapping the cores.
> 

I think that is really ugly, and it also makes it much harder to get the
microcode patch in early on the BSP.  There are enough issues where we
would like to get the microcode in early even on the BSP.

	-hpa

-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 09:49:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 09:49:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REOSt-0006H9-6B; Thu, 13 Oct 2011 09:49:03 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REOSS-00064O-0b
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 09:48:36 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1318524512!919376!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10847 invoked from network); 13 Oct 2011 16:48:33 -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;
	13 Oct 2011 16:48:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,341,1315180800"; 
   d="scan'208";a="8380331"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 16:48: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; Thu, 13 Oct 2011 17:48:33 +0100
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 1REOSO-0003Pe-G7;
	Thu, 13 Oct 2011 16:48:32 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1REOSO-0005BN-Fb;
	Thu, 13 Oct 2011 17:48:32 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9275-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 13 Oct 2011 17:48:32 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9275: 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 9275 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9275/

Regressions :-(

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

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

version targeted for testing:
 xen                  c1bd53fac3d5
baseline version:
 xen                  4b0907c6a08c

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Guido Gunther <agx@sigxcpu.org>
  Haitao Shan <maillists.shan@gmail.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.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


Not pushing.

------------------------------------------------------------
changeset:   23954:c1bd53fac3d5
tag:         tip
user:        Christoph Egger <Christoph.Egger@amd.com>
date:        Thu Oct 13 12:21:10 2011 +0100
    
    nestedsvm: fix checks of guest writes to HSAVE_PA MSR
    
    Accessing HSAVE_PA MSR does not require SVM to be enabled nor any
    special guest paging mode.
    But accessing HSAVE_PA MSR requires the address to be 4k aligned.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23953:eda18b27de6e
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 13 12:21:10 2011 +0100
    
    xenpaging: handle evict failures
    
    Evict of a nominated gfn must fail if some other process mapped the
    page without checking the p2mt of that gfn first.
    Add a check to cancel eviction if the page usage count is not 1.
    
    Handle the possible eviction failure in the page-in paths.
    After nominate and before evict, something may check the p2mt and call
    populate. Handle this case and let the gfn enter the page-in path. The
    gfn may still be connected to a mfn, so there is no need to allocate a
    new page in prep.
    
    Adjust do_mmu_update to return -ENOENT only if the gfn has entered the
    page-in path and if it is not yet connected to a mfn. Otherwise
    linux_privcmd_map_foreign_bulk() may loop forever.
    
    Add MEM_EVENT_FLAG_EVICT_FAIL to inform pager that a page-in request for
    a possible not-evicted page was sent. xenpaging does currently not need
    that flag because failure to evict a gfn will be caught.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23952:1515484353c6
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Oct 13 10:09:28 2011 +0200
    
    VMX: extend last branch MSR info to cover newer CPU models
    
    There are still a couple of family 6 models missing here: 37, 44, 46,
    and 47 (according to SDM doc changes May 2011); presumably they would
    all go into the Nehalem/Sandy Bridge group. Intel?
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Haitao Shan <maillists.shan@gmail.com>
    
    
changeset:   23951:8c1e7830112f
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Oct 13 10:03:43 2011 +0200
    
    xmalloc: return unused full pages on multi-page allocations
    
    Certain (boot time) allocations are relatively large (particularly when
    building with high NR_CPUS), but can also happen to be pretty far away
    from a power-of-two size. Utilize the page allocator's (other than
    Linux'es) capability of allowing to return space from higher-order
    allocations in smaller pieces to return the unused parts immediately.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23950:46ca8ea42d4c
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Oct 13 10:02:34 2011 +0200
    
    x86-64: don't use xmalloc_array() for allocation of the (per-CPU) IDTs
    
    The IDTs being exactly a page in size, using xmalloc() here is rather
    inefficient, as this requires double the amount to be allocated (with
    almost an entire page wasted). For hot plugged CPUs, this at once
    eliminates one more non-order-zero runtime allocation.
    
    For x86-32, however, the IDT is exactly half a page, so allocating a
    full page seems wasteful here, so it continues to use xmalloc() as
    before.
    
    With most of the affected functions' bodies now being inside #ifdef-s,
    it might be reasonable to split those parts out into subarch-specific
    code...
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23949:39df16923958
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Oct 13 10:00:13 2011 +0200
    
    constify vcpu_set_affinity()'s second parameter
    
    None of the callers actually make use of the function's returning of
    the old affinity through its second parameter, and eliminating this
    capability allows some callers to no longer use a local variable here,
    reducing their stack footprint significantly when building with large
    NR_CPUS.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23948:dcb2bd283dca
user:        Keir Fraser <keir@xen.org>
date:        Wed Oct 12 17:11:28 2011 +0100
    
    Revert part of 23811:f1349a968a5a "ns16550: Simplify UART..."
    
    The change to poll LSR.THRE in a loop from __ns16550_poll is a bug.
    We can loop indefinitely if there are no chars to transmit.
    
    Thanks to Jan for spotting it.
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23947:48aa733d0767
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Wed Oct 12 16:21:32 2011 +0100
    
    libxl: fixup incorrect indentation
    
    Several places which were previsously indented using hard tabs are now
    incorrectly indented. Fix them up.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23946:e65977f3fa86
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Oct 11 14:34:07 2011 +0100
    
    libxl: fixup incorrect indentation
    
    Several places which were previsously indented using hard tabs are now
    incorrectly indented. Fix them up.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23945:c5f8c3597cae
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Oct 11 14:26:00 2011 +0100
    
    libxl: expand hard tab stops
    
    I ran the following and committed the result. ^I is an actual hard tab
    
    for i in $(grep -l --exclude=*_[ly].\[ch\] '^I' tools/libxl/*.[ch]) ; do
         cat $i | expand | sponge $i
    done
    
    There are some actually wrong indentations too, I'll fix those up
    manually.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23944:4b0907c6a08c
user:        Guido Gunther <agx@sigxcpu.org>
date:        Tue Oct 11 12:02:58 2011 +0100
    
    pygrub: add debug flag
    
    Debugging config file errors is tedious so help a bit by not silently
    dropping parsing exceptions when --debug is given. Also intialize the
    logging API at debug level in this case.
    
    Signed-off-by: Guido Gunther <agx@sigxcpu.org>
    Acked-by: Ian Campbell <ian.campbell@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 Thu Oct 13 10:11:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 10: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 1REOon-0006zp-OP; Thu, 13 Oct 2011 10:11:41 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1REOn4-0006m3-UM
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 10:10:21 -0700
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1318525771!48135866!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1116 invoked from network); 13 Oct 2011 17:09:31 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-8.tower-27.messagelabs.com with SMTP;
	13 Oct 2011 17:09:31 -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 p9DH9oYD027339
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 13:09:50 -0400
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 p9DH9mYa030100; Thu, 13 Oct 2011 13:09:49 -0400
Message-ID: <4E971BB6.5040700@redhat.com>
Date: Thu, 13 Oct 2011 19:11:18 +0200
From: Laszlo Ersek <lersek@redhat.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.20) Gecko/20110817 Fedora/3.1.12-1.fc14
	Lightning/1.0b3pre Mnenhy/0.8.4 Thunderbird/3.1.12
MIME-Version: 1.0
To: Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] domain pause vs. watchdog timer
References: <CABCBAB1.32A07%keir@xen.org>
In-Reply-To: <CABCBAB1.32A07%keir@xen.org>
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: Igor Mammedov <imammedo@redhat.com>,
	"xen-devel@lists.xensource.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 10/13/11 16:56, Keir Fraser wrote:
> On 13/10/2011 15:38, "Laszlo Ersek"<lersek@redhat.com>  wrote:
>
>> On 10/13/11 16:21, Jan Beulich wrote:
>>>>>> On 13.10.11 at 15:41, Laszlo Ersek<lersek@redhat.com>   wrote:
>>>> if a domain is paused (= not scheduled), its process that keeps
>>>> otherwise kicking /dev/watchdog and (thusly the hypervisor) "freezes"
>>>> too. Should pausing a domain suspend (or "inactivate") its watchdog_timers?
>>>
>>> I would say yes it should. And you say it doesn't?
>>
>> I must have missed a changeset (or a hunk?) related to pausing:
>>
>> https://bugzilla.redhat.com/show_bug.cgi?id=742880#c1
>>
>> I backported 21529 from xen-unstable to the RHEL-5 hypervisor version,
>> and Igor tested pausing a Fedora 16 HVM guest. The domU was destroyed
>> while it was paused.
>
> You are just as likely to upset a watchdog implemented entirely internally
> to the guest, and which we have no chance to disable/suspend when a domain
> is paused. Domain pausing from the dom0 command line really doesn't have a
> production use case afaik -- just don't do it is my helpful suggestion.

Thank you both for the answers.
L.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 10:19:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 10: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 1REOwV-0007TU-0v; Thu, 13 Oct 2011 10:19:39 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REOvl-0007GQ-PG
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 10:18:54 -0700
X-Env-Sender: amscanne@gridcentric.ca
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318526300!59076124!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23842 invoked from network); 13 Oct 2011 17:18:20 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 17:18:20 -0000
Received: by bkas6 with SMTP id s6so2016349bka.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 10:18:50 -0700 (PDT)
Received: by 10.223.1.131 with SMTP id 3mr7509194faf.30.1318526330153; Thu, 13
	Oct 2011 10:18:50 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.223.144.133 with HTTP; Thu, 13 Oct 2011 10:18:30 -0700 (PDT)
In-Reply-To: <20111006110715.GC21091@ocelot.phlegethon.org>
References: <CAAJKtqoPDzEEY7xLQbFyOXrwNhBUJyV274LzRT-=0fPMbYjWkw@mail.gmail.com>
	<20111006110715.GC21091@ocelot.phlegethon.org>
From: Adin Scannell <adin@gridcentric.com>
Date: Thu, 13 Oct 2011 13:18:30 -0400
X-Google-Sender-Auth: 9aq_TCg6F8zyOth8bqsbsHqgdnU
Message-ID: <CAAJKtqrNiYWteenCYv2-bgC6kPCyUmxihLP6TtDg-09ki=NgeQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 1/2] enable event channel wake-up for
	mem_event interfaces
To: Tim Deegan <tim@xen.org>
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

I'll rework the patches incorporating the feedback and resend the
modified patches.

I've got a couple of quick notes, inline below.

>> @@ -135,16 +166,28 @@ void mem_event_put_request(struct domain
>> + =A0 =A0/*
>> + =A0 =A0 * We ensure that each vcpu can put at least *one* event -- bec=
ause some
>> + =A0 =A0 * events are not repeatable, such as dropping a page. =A0This =
will ensure no
>> + =A0 =A0 * vCPU is left with an event that they must place on the ring,=
 but cannot.
>> + =A0 =A0 * They will be paused after the event is placed.
>> + =A0 =A0 * See large comment below in mem_event_unpause_vcpus().
>> + =A0 =A0 */
>> + =A0 =A0if( current->domain->domain_id =3D=3D d->domain_id &&
>> + =A0 =A0 =A0 =A0mem_event_ring_free(d, med) < d->max_vcpus )
>> + =A0 =A0 =A0 =A0mem_event_mark_and_pause(current, med);
>> +
>
> This idiom of comparing domain-ids cropped up in the earlier mem-event
> patches and seems to be spreading, but the right check is just
> (current->domain =3D=3D d).
>
> Also: are there cases where current->domain !=3D d? =A0If so, can't those=
 cases
> cause the ring to fill up?

Yes, I believe there are there are cases where a different domain
(i.e. the domain w/ the device model) can map a page generating an
event (mapping a paged-out page, writeable mappings of pages with
non-writable access bits, etc.).  Unfortunately, we can't pause any
vcpu in those cases.

This is something that I intend to revisit, as guaranteeing that
absolutely no events are lost may be quite complicated (especially
when there are certain events which are not repeatable). I'm
considering the use of the new wait queues or other mechanisms to wait
for the ring to clear up while in the same context.... but that is
another sort of tricky.

I'm quite glad you pointed this out, because I believe the
mem_event_mark_and_pause following the 'possible lost mem_event for
domain' is incorrect.  If this is a different domain generating the
event, this line is very wrong.

>> + =A0 =A0for_each_vcpu ( d, v )
>> + =A0 =A0{
>> + =A0 =A0 =A0 =A0if ( !(med->blocked) || online >=3D mem_event_ring_free=
(d, med) )
>> + =A0 =A0 =A0 =A0 =A0 =A0break;
>
> Is there a risk that under heavy mem-event loads vcpu 0 might starve
> other vcpus entirely because they're never allowed to unpause here?

Unfortunately, yes.  With heavy mem event load (& a dom0 that isn't
taking them off the ring fast enough).  I think there are two fair
alternatives:
1) Unpausing a vcpu at random.
2) Waiting until the ring reaches a watermark and unpausing all vCPUs.

Any thoughts on these?

>> + =A0 =A0if ( !test_bit(_VPF_mem_event, &v->pause_flags) )
>> + =A0 =A0{
>> + =A0 =A0 =A0 =A0set_bit(_VPF_mem_event, &v->pause_flags);
>
> Does this need to be an atomic test-and-set?

I believe that it is currently always called within a locked
(mem_event_ring_lock) context, but it should be atomic test-and-set
anyways in case it's not.


Cheers!
-Adin

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 10:30:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 10:30:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REP6t-00085y-T8; Thu, 13 Oct 2011 10:30:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REP63-0007tK-6B
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 10:29:31 -0700
X-Env-Sender: amscanne@gridcentric.ca
X-Msg-Ref: server-5.tower-27.messagelabs.com!1318526943!48999761!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16314 invoked from network); 13 Oct 2011 17:29:04 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 17:29:04 -0000
Received: by ggnk4 with SMTP id k4so362157ggn.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 10:29:26 -0700 (PDT)
Received: by 10.223.16.76 with SMTP id n12mr7543986faa.25.1318526966411; Thu,
	13 Oct 2011 10:29:26 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.223.144.133 with HTTP; Thu, 13 Oct 2011 10:29:06 -0700 (PDT)
In-Reply-To: <20110930224636.GC62963@ocelot.phlegethon.org>
References: <CAAJKtqq0Qoxh1KazXXdZaVb1qZ6pcP1LNXk1bD1tgsKEV7g_iQ@mail.gmail.com>
	<20110930224636.GC62963@ocelot.phlegethon.org>
From: Adin Scannell <adin@gridcentric.com>
Date: Thu, 13 Oct 2011 13:29:06 -0400
X-Google-Sender-Auth: NZdH_tPBX4bf5oNdrL91VOQ_BTk
Message-ID: <CAAJKtqoQJcu4OyQ+gG3vR4f-pV-wgqEqr2K+WsAQLf-_t91iZw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH RFC] memory sharing questions
To: Tim Deegan <tim@xen.org>
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

Hi Tim,

> The handle isn't a count of how many times the page has been nominated,
> it's a global counter, incremented to be sure that the handles are
> unique. =A0The versioning avoids race conditions where the page gets
> unshared and re-shared. =A0Since the intended caller was the block
> backend, short-cutting a read from disk by sharing the last copy read,
> it's important that the mfn not have been unshared, changed and
> re-shared in the meantime.
>
> In the current system there's only one memory-sharing caller but there
> could easily be more, and it should be possible to recover from a
> crashed client too.
>
> AIUI the caller shouldn't have to be aware of the _meaning_ of the
> handle. =A0And there's no reason that the hash table couldn't be improved
> or replaced, if there's another way around the question of whether the
> page has changed since you last shared it.

Ah -- I understand.  This race condition (and the handle) makes sense
in the context of multiple callers. I still feel that the constant
storing and looking up of handles in a data structure is likely to be
problematic however (other than possibly a simple list for
debugging/audit).  What if the interface were changed to something
like the following:

handle_t mem_sharing_nominate(mfn_t mfn);
int mem_sharing_page_share(mfn_t one, handle_t one_version, mfn_t two,
handle_t two_handle);

In this case, the handle can be the same global counter as per before,
except it can be stored in a saved structure alongside the associated
domain gfns and used only for a safety check. When calling
mem_sharing_page_share, xen would no longer need to lookup a handle in
a data structure -- but could still enforce the check that the version
matches and avoid the nominate, unshare, nominate (by someone else)
race condition.

I believe that caller would still store the same amount of
information, it would just pass down the mfns as well as the handle /
version.

Thoughts?

Cheers!
-Adin

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 10:32:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 10:32:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REP8n-0008VW-Ax; Thu, 13 Oct 2011 10:32:21 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REP8G-0008IA-0w
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 10:31:48 -0700
X-Env-Sender: amscanne@gridcentric.ca
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318527084!46556446!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3189 invoked from network); 13 Oct 2011 17:31:24 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 17:31:24 -0000
Received: by bkas6 with SMTP id s6so2032162bka.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 10:31:43 -0700 (PDT)
Received: by 10.223.1.131 with SMTP id 3mr7575244faf.30.1318527103137; Thu, 13
	Oct 2011 10:31:43 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.223.144.133 with HTTP; Thu, 13 Oct 2011 10:31:23 -0700 (PDT)
In-Reply-To: <CAAJKtqoQJcu4OyQ+gG3vR4f-pV-wgqEqr2K+WsAQLf-_t91iZw@mail.gmail.com>
References: <CAAJKtqq0Qoxh1KazXXdZaVb1qZ6pcP1LNXk1bD1tgsKEV7g_iQ@mail.gmail.com>
	<20110930224636.GC62963@ocelot.phlegethon.org>
	<CAAJKtqoQJcu4OyQ+gG3vR4f-pV-wgqEqr2K+WsAQLf-_t91iZw@mail.gmail.com>
From: Adin Scannell <adin@gridcentric.com>
Date: Thu, 13 Oct 2011 13:31:23 -0400
X-Google-Sender-Auth: OULyfXarrJjq67J3gCh78RLt_VU
Message-ID: <CAAJKtqqaGM2gDcB_1oG107+KvZxPK7bwJXKdSXD=T0gfmc_+ug@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH RFC] memory sharing questions
To: Tim Deegan <tim@xen.org>
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

handle_t mem_sharing_nominate(mfn_t mfn);
int mem_sharing_page_share(mfn_t one, handle_t one_version, mfn_t two,
handle_t two_version);

Sorry, wrong parameter name might be confusing.  As per the naming,
the handles are especially globally unique 'versions'.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 10:55:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 10:55:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REPUl-0001Ze-Qp; Thu, 13 Oct 2011 10:55:03 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REPUE-0001Mn-8m
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 10:54:30 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1318528467!33053810!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9562 invoked from network); 13 Oct 2011 17:54:27 -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;
	13 Oct 2011 17:54:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,341,1315180800"; 
   d="scan'208";a="8381503"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 17:54: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; Thu, 13 Oct 2011 18:54:26 +0100
Date: Thu, 13 Oct 2011 18:54:29 +0100
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 v7 0/5] build upstream qemu and seabios by
	default
In-Reply-To: <20115.7187.664787.960964@mariner.uk.xensource.com>
Message-ID: <alpine.DEB.2.00.1110131830580.3519@kaball-desktop>
References: <alpine.DEB.2.00.1109301514460.3519@kaball-desktop>
	<20115.7187.664787.960964@mariner.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>,
	"Keir \(Xen.org\)" <keir@xen.org>, 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, 10 Oct 2011, Ian Jackson wrote:
> Stefano Stabellini writes ("[Xen-devel] [PATCH v7 0/5] build upstream qemu and seabios by default"):
> > this is the sixth version of the patch series to introduce upstream qemu
> > and seabios in the xen-unstable build system.
> 
> I did this (on my workstation, running Debian squeeze i386):
> 
>  * hg clean --all
>  * Apply this series (it applied cleanly)
>  * cp ../.config .  (see below)
>  * in the referenced qemu-iwj.git dir, git-clean -xdf
>  * (make -j4 && echo ok.) 2>&1 | tee ../log
> 
> My ../.config contains only
>  
> CONFIG_QEMU=/u/iwj/work/1/qemu-iwj.git
> 
> and the referenced directory is at git changeset
> 25378e0a76b282127e9ab8933a4defbc91db3862.
> 
> The result was the error you see below.
> 
> After this, the directory "tools/qemu-xen-dir-remote" is at
> 6dd84c71dff047f9e492d67e7c99928d09202760.
> 
> IIRC this is the same problem that v5 and v6 had.  Please come back
> when you've actually fixed it.
> 
> Ian.
> 
> 
> make[1]: Leaving directory `/u/iwj/work/xen-unstable-tools.hg/xen'
> Switched to a new branch 'dummy'
> cd qemu-xen-dir; \
>         ./configure --enable-xen --target-list=i386-softmmu \
>                 --source-path=$ROOT \
>                 --extra-cflags="-I/u/iwj/work/xen-unstable-tools.hg/tools/../tools/include \
>                 -I/u/iwj/work/xen-unstable-tools.hg/tools/../tools/libxc \
>                 -I/u/iwj/work/xen-unstable-tools.hg/tools/../tools/xenstore" \
>                 --extra-ldflags="-L/u/iwj/work/xen-unstable-tools.hg/tools/../tools/libxc \
>                 -L/u/iwj/work/xen-unstable-tools.hg/tools/../tools/libxenstore" \
>                 --bindir=/usr/lib/xen/bin \
>                 --disable-kvm \
> 
> ERROR
> ERROR: User requested feature xen
> ERROR: configure was not able to find it
> ERROR
> make[1]: *** [qemu-xen-dir-find] Error 1
> make[1]: Leaving directory `/u/iwj/work/xen-unstable-tools.hg/tools'
> make: *** [tools/qemu-xen-dir] Error 2
> 

I have just realized that I did all my tests on a box that has xen
properly installed under /usr so it doesn't need all the --extra-cflags
and --extra-ldflags runes.
Changing dev box made me uncover two bugs:

- a typo in tools/Makefile (libxenstore instead of xenstore);

- a dependency problem: qemu's configure script needs libxc and xenstore
to be already built but we are calling it before building them. The
solution is to move the call to configure after we build libxc and xenstore.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:04:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:04:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REPdj-0002AQ-8d; Thu, 13 Oct 2011 11:04:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REPbR-0001tv-SZ
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:02:10 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-6.tower-216.messagelabs.com!1318528912!926808!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19290 invoked from network); 13 Oct 2011 18:01:54 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-6.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 18:01:54 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3c9b:e4ff:feec:ae58])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id C75DE9A2A;
	Thu, 13 Oct 2011 11:01:51 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id A356B2046E;
	Thu, 13 Oct 2011 09:44:48 -0700 (PDT)
Message-ID: <4E971580.6030300@goop.org>
Date: Thu, 13 Oct 2011 09:44:48 -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: Peter Zijlstra <peterz@infradead.org>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins>
In-Reply-To: <1318503245.24856.12.camel@twins>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/13/2011 03:54 AM, Peter Zijlstra wrote:
> On Wed, 2011-10-12 at 17:51 -0700, Jeremy Fitzhardinge wrote:
>> This is is all unnecessary complication if you're not using PV ticket
>> locks, it also uses the jump-label machinery to use the standard
>> "add"-based unlock in the non-PV case.
>>
>>         if (TICKET_SLOWPATH_FLAG &&
>>             unlikely(static_branch(&paravirt_ticketlocks_enabled))) {
>>                 arch_spinlock_t prev;
>>
>>                 prev = *lock;
>>                 add_smp(&lock->tickets.head, TICKET_LOCK_INC);
>>
>>                 /* add_smp() is a full mb() */
>>
>>                 if (unlikely(lock->tickets.tail & TICKET_SLOWPATH_FLAG))
>>                         __ticket_unlock_slowpath(lock, prev);
>>         } else
>>                 __add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX); 
> Not that I mind the jump_label usage, but didn't paravirt have an
> existing alternative() thingy to do things like this? Or is the
> alternative() stuff not flexible enough to express this?

Yeah, that's a good question.  There are three mechanisms with somewhat
overlapping concerns:

  * alternative()
  * pvops patching
  * jump_labels

Alternative() is for low-level instruction substitution, and really only
makes sense at the assembler level with one or two instructions.

pvops is basically a collection of ordinary _ops structures full of
function pointers, but it has a layer of patching to help optimise it. 
In the common case, this just replaces an indirect call with a direct
one, but in some special cases it can inline code.  This is used for
small, extremely performance-critical things like cli/sti, but it
awkward to use in general because you have to specify the inlined code
as a parameterless asm.

Jump_labels is basically an efficient way of doing conditionals
predicated on rarely-changed booleans - so it's similar to pvops in that
it is effectively a very ordinary C construct optimised by dynamic code
patching.


So for _arch_spin_unlock(), what I'm trying to go for is that if you're
not using PV ticketlocks, then the unlock sequence is unchanged from
normal.  But also, even if you are using PV ticketlocks, I want the
fastpath to be inlined, with the call out to a special function only
happening on the slow path.  So the result is that if().  If the
static_branch is false, then the executed code sequence is:

	nop5
	addb $2, (lock)
	ret

which is pretty much ideal.  If the static_branch is true, then it ends
up being:

	jmp5 1f
	[...]

1:	lock add $2, (lock)
	test $1, (lock.tail)
	jne slowpath
	ret
slowpath:...

which is also pretty good, given all the other constraints.

While I could try use inline patching to get a simply add for the non-PV
unlock case (it would be awkward without asm parameters), but I wouldn't
be able to also get the PV unlock fastpath code to be (near) inline. 
Hence jump_label.

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 Oct 13 11:08:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:08:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REPhL-0002aP-TZ; Thu, 13 Oct 2011 11:08:04 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REPcj-000211-7D; Thu, 13 Oct 2011 11:03:19 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318528992!35211042!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10546 invoked from network); 13 Oct 2011 18:03:13 -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; 13 Oct 2011 18:03: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
	p9DI36Q9030597
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 18:03:08 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
	p9DI35UQ016191
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 18:03:05 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
	p9DI2wqR006069; Thu, 13 Oct 2011 13:02:59 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 11:02:58 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id DE2911EA; Thu, 13 Oct 2011 14:02:44 -0400 (EDT)
Date: Thu, 13 Oct 2011 14:02:44 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Joseph Glanville <joseph.glanville@orionvm.com.au>
Subject: Re: [Xen-devel] Xen document day (Oct 12 or 26)
Message-ID: <20111013180244.GC15499@phenom.oracle.com>
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org>
	<20111003185309.GC15608@phenom.oracle.com>
	<4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@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.0A020209.4E9727DC.0171:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Lars Kurth <lars.kurth@xen.org>, 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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, Oct 13, 2011 at 05:44:27AM +1100, Joseph Glanville wrote:
> Sounds good, 26th works.
> 
> Real-time colab on IRC would be nice to get organised maybe #xendocday on
> freenode?

Yes, will be on #xendocday.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:14:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:14:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REPo3-0003kI-Ik; Thu, 13 Oct 2011 11:14:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REPea-0002GB-K9
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:05:13 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318529108!22216374!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28280 invoked from network); 13 Oct 2011 18:05:09 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-4.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 18:05:09 -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
	p9DI52Be024817
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 18:05:04 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
	p9DI517f020279
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 18:05:01 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
	p9DI4tPt014979; Thu, 13 Oct 2011 13:04:55 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 11:04:55 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id C9EC31EA; Thu, 13 Oct 2011 14:04:51 -0400 (EDT)
Date: Thu, 13 Oct 2011 14:04:51 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "D. Duckworth" <donduq@i2pmail.org>
Subject: Re: [Xen-devel] XEN - networking and performance
Message-ID: <20111013180451.GD15499@phenom.oracle.com>
References: <20111006203821.CD70CE9342@kermit.internecto.net>
	<20111008190701.50DFBAE098@smtp.postman.i2p>
	<20111010170359.DF487AE08F@smtp.postman.i2p>
	<20111012045004.EEDCCAE0AC@smtp.postman.i2p>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111012045004.EEDCCAE0AC@smtp.postman.i2p>
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.4E972850.018E:SCFMA922111,ss=1,re=-4.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

> > .. the documentation and setup is sometimes quite hard. BTW, we are
> > going to do on Oct 26th a Documentation Day to clean up some of this
> > mess. Would you be intereted in helping along - perhaps in the
> > networking Wiki?
> 
> Interested yes, perhaps. Could you please send me the details? As for

 http://lists.xensource.com/archives/html/xen-users/2011-09/msg00494.html

and #xendocday on Oct 26th.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:17:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:17:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REPq8-0004BV-OU; Thu, 13 Oct 2011 11:17:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REPl8-00033i-Nh
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:11:59 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318529485!52733659!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25651 invoked from network); 13 Oct 2011 18:11:27 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 18:11:27 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3c9b:e4ff:feec:ae58])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id C39109AE5;
	Thu, 13 Oct 2011 11:11:52 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id B1B5A207F3;
	Thu, 13 Oct 2011 09:50:00 -0700 (PDT)
Message-ID: <4E9716B8.8050406@goop.org>
Date: Thu, 13 Oct 2011 09:50:00 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<34ede5db1571d541a5c3fc49923bb353a37dd431.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<4E97067A.2070305@zytor.com>
In-Reply-To: <4E97067A.2070305@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 09/10] x86/jump_label: use
 GENERIC_NOP5_ATOMIC instead of jmp5 +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 10/13/2011 08:40 AM, H. Peter Anvin wrote:
> On 10/12/2011 05:08 PM, Jeremy Fitzhardinge wrote:
>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>
>> GENERIC_NOP5_ATOMIC should make a better nop.
>>
> On 32 bits, yes.  On 64 bits you should use P6_NOP5_ATOMIC.

So the cleanest way of fixing that is to make the GENERIC_NOP*  be
defined to P6_NOP* on 64-bit then?  Assuming I'm correct in guessing
that the intent of GENERIC_NOP* is "a basically good-enough NOP that
will work on any x86".

    J

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:18:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11: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 1REPr9-0004YW-F8; Thu, 13 Oct 2011 11:18:11 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REPp5-0003wo-8E
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:16:04 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318529758!21510219!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28474 invoked from network); 13 Oct 2011 18:15:59 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 18:15: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
	p9DIFrhw019985
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 18:15:55 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
	p9DIFqg3019190
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 18:15:53 GMT
Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9DIFlhN012405; Thu, 13 Oct 2011 13:15:47 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 11:15:47 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 282981EA; Thu, 13 Oct 2011 14:15:43 -0400 (EDT)
Date: Thu, 13 Oct 2011 14:15:43 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andy Burns <xen.lists@burns.me.uk>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
Message-ID: <20111013181543.GF15499@phenom.oracle.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@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.0A090206.4E972ADB.00F6:SCFMA922111,ss=1,re=-4.000,fgs=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, Oct 12, 2011 at 10:36:12PM +0100, Andy Burns wrote:
> On 12 October 2011 09:01, Andy Burns <xen.lists@burns.me.uk> wrote:
> 
> > Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> >
> >> So it works now right?
> >
> > No.

<Grumble>
> >
> > I think I remember what was the test I did before the boot that
> > started working again
> 
> I didn't get much time to test this today ... reverted to same Xen and
> kernel versions that worked briefly last night.
> 
> I discovered that (despite what I answered earlier) the PCI tuners
> don't work in dom0 under Xen, they only work if the dom0 is booted  as
> baremetal.
> 
> If I reboot from dom0 from baremetal with the PCI cards working into
> Xen without powering off, it doesn't "magically" leave the PCI cards
> in a state that allows them to work in the domU.
> 
> The thing which *seemed* to put it into a good mood last night was
> booting dom0 with serial console and the domU with the PIC cards but
> without the PCIe card, but that made no difference today.
> 
> I'm beginning to follow Konrad's thoughts that there is a specific
> sequence of events, that persists in hardware state across soft
> reboots, occasionally ending up with functioning PCI cards.
> 
> Is the fact that the PCI cards fail in dom0 under Xen a hint?  Any
> debugging I can do with the tuners from the dom0 rather than the domU
> with passthrough?

That is. That would imply it is not the PCI passthrough code (good!).
It is something related to the driver (as I presume your network card
works in that box). Perhaps it is the VM_IO bug that sometimes creeps
up.. Can you give me the lsmod output please? I want to see which
drivers are loaded for this TV card and I can dig a bit in the
driver to see if there is something fishy.

I saw something about I2C, is there a knob in the driver to _not_
use I2C?

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:19:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:19:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REPsK-00051Y-R0; Thu, 13 Oct 2011 11:19:24 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REPpw-000480-85
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:16:56 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-9.tower-174.messagelabs.com!1318529811!29158547!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 911 invoked from network); 13 Oct 2011 18:16:53 -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; 13 Oct 2011 18:16:53 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3c9b:e4ff:feec:ae58])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id AA9909AE8;
	Thu, 13 Oct 2011 11:16:50 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id AB88F20FD4;
	Thu, 13 Oct 2011 09:56:45 -0700 (PDT)
Message-ID: <4E97184D.8020109@goop.org>
Date: Thu, 13 Oct 2011 09:56:45 -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: Peter Zijlstra <peterz@infradead.org>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<c133180533d7e520bb1e818e987117811a666fbc.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<1318502628.24856.10.camel@twins>
In-Reply-To: <1318502628.24856.10.camel@twins>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 10/10] jump-label: initialize
 jump-label subsystem much 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 10/13/2011 03:43 AM, Peter Zijlstra wrote:
> On Wed, 2011-10-12 at 17:08 -0700, Jeremy Fitzhardinge wrote:
>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>
>> Initialize jump_labels much earlier, we can use them.
> We can use them, where? how? what?, that sentence just begs for more.

Er, yeah, looks like I committed it without actually finishing the sentence.

    J

>> diff --git a/init/main.c b/init/main.c
>> index 2a9b88a..f4094ed 100644
>> --- a/init/main.c
>> +++ b/init/main.c
>> @@ -637,6 +637,7 @@ asmlinkage void __init start_kernel(void)
>>  	acpi_early_init(); /* before LAPIC and SMP init */
>>  	sfi_init_late();
>>  
>> +	jump_label_init();
>>  	ftrace_init();
>>  
>>  	/* Do the rest non-__init'ed, we're now alive */
> Can we push them much earlier still? If possible I'd like them to be
> before sched_init() so that I might use them there, if not possible, at
> the very least before enabling interrupts would be nice.
>
>


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:22:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:22:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REPvN-0005RE-MS; Thu, 13 Oct 2011 11:22:33 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REPum-0005E2-E2
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:21:56 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318530111!793290!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17364 invoked from network); 13 Oct 2011 18:21:53 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-2.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 18:21:53 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:3c9b:e4ff:feec:ae58])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id AFBCD9AEE;
	Thu, 13 Oct 2011 11:21:50 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 828D021114;
	Thu, 13 Oct 2011 09:57:46 -0700 (PDT)
Message-ID: <4E97188A.6040400@goop.org>
Date: Thu, 13 Oct 2011 09:57:46 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<34ede5db1571d541a5c3fc49923bb353a37dd431.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<4E97067A.2070305@zytor.com>
In-Reply-To: <4E97067A.2070305@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 09/10] x86/jump_label: use
 GENERIC_NOP5_ATOMIC instead of jmp5 +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 10/13/2011 08:40 AM, H. Peter Anvin wrote:
> On 10/12/2011 05:08 PM, Jeremy Fitzhardinge wrote:
>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>
>> GENERIC_NOP5_ATOMIC should make a better nop.
>>
> On 32 bits, yes.  On 64 bits you should use P6_NOP5_ATOMIC.

Something like this?

From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Date: Thu, 13 Oct 2011 09:55:25 -0700
Subject: [PATCH] x86/nop: we can use P6 as generic NOP on 64-bit

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

diff --git a/arch/x86/include/asm/nops.h b/arch/x86/include/asm/nops.h
index 405b403..f9fead9 100644
--- a/arch/x86/include/asm/nops.h
+++ b/arch/x86/include/asm/nops.h
@@ -19,15 +19,15 @@
    6: leal 0x00000000(%esi),%esi
    7: leal 0x00000000(,%esi,1),%esi
 */
-#define GENERIC_NOP1 0x90
-#define GENERIC_NOP2 0x89,0xf6
-#define GENERIC_NOP3 0x8d,0x76,0x00
-#define GENERIC_NOP4 0x8d,0x74,0x26,0x00
-#define GENERIC_NOP5 GENERIC_NOP1,GENERIC_NOP4
-#define GENERIC_NOP6 0x8d,0xb6,0x00,0x00,0x00,0x00
-#define GENERIC_NOP7 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00
-#define GENERIC_NOP8 GENERIC_NOP1,GENERIC_NOP7
-#define GENERIC_NOP5_ATOMIC NOP_DS_PREFIX,GENERIC_NOP4
+#define GAS_NOP1 0x90
+#define GAS_NOP2 0x89,0xf6
+#define GAS_NOP3 0x8d,0x76,0x00
+#define GAS_NOP4 0x8d,0x74,0x26,0x00
+#define GAS_NOP5 GENERIC_NOP1,GENERIC_NOP4
+#define GAS_NOP6 0x8d,0xb6,0x00,0x00,0x00,0x00
+#define GAS_NOP7 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00
+#define GAS_NOP8 GENERIC_NOP1,GENERIC_NOP7
+#define GAS_NOP5_ATOMIC NOP_DS_PREFIX,GENERIC_NOP4
 
 /* Opteron 64bit nops
    1: nop
@@ -87,6 +87,28 @@
 #define P6_NOP8	0x0f,0x1f,0x84,0x00,0,0,0,0
 #define P6_NOP5_ATOMIC P6_NOP5
 
+#ifdef CONFIG_X86_32
+#define GENERIC_NOP1		GAS_NOP1
+#define GENERIC_NOP2		GAS_NOP2
+#define GENERIC_NOP3		GAS_NOP3
+#define GENERIC_NOP4		GAS_NOP4
+#define GENERIC_NOP5		GAS_NOP5
+#define GENERIC_NOP6		GAS_NOP6
+#define GENERIC_NOP7		GAS_NOP7
+#define GENERIC_NOP8		GAS_NOP8
+#define GENERIC_NOP5_ATOMIC	GAS_NOP5_ATOMIC
+#else
+#define GENERIC_NOP1		P6_NOP1
+#define GENERIC_NOP2		P6_NOP2
+#define GENERIC_NOP3		P6_NOP3
+#define GENERIC_NOP4		P6_NOP4
+#define GENERIC_NOP5		P6_NOP5
+#define GENERIC_NOP6		P6_NOP6
+#define GENERIC_NOP7		P6_NOP7
+#define GENERIC_NOP8		P6_NOP8
+#define GENERIC_NOP5_ATOMIC	P6_NOP5_ATOMIC
+#endif
+
 #define _ASM_MK_NOP(x) ".byte " __stringify(x) "\n"
 
 #if defined(CONFIG_MK7)



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:37:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:37:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQAI-00064s-2J; Thu, 13 Oct 2011 11:37:58 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1REQ9V-0005s7-9A
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:37:09 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318531025!934776!1
X-Originating-IP: [71.74.56.123]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11999 invoked from network); 13 Oct 2011 18:37:06 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.123) by server-14.tower-216.messagelabs.com with SMTP;
	13 Oct 2011 18:37:06 -0000
X-Authority-Analysis: v=1.1 cv=XWD5/VRj2HUJOhsR8cgmvPBlhMACpZXxseY1Kn/ehQI=
	c=1 sm=0 a=jVLHYovT1_cA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=ZycB6UtQUfgMyuk2+PxD7w==:17 a=tHz9FfFoAAAA:8
	a=hCfZMxHQRGL6TjOjB64A:9 a=PUjeQqilurYA:10 a=6O0IECtVFhoA:10
	a=ZycB6UtQUfgMyuk2+PxD7w==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.80.29
Received: from [74.67.80.29] ([74.67.80.29:43022] helo=[192.168.23.10])
	by hrndva-oedge02.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 57/E4-07715-ECF279E4; Thu, 13 Oct 2011 18:37:05 +0000
Message-ID: <1318531022.12224.13.camel@gandalf.stny.rr.com>
From: Steven Rostedt <rostedt@goodmis.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Thu, 13 Oct 2011 14:37:02 -0400
In-Reply-To: <4E97188A.6040400@goop.org>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<34ede5db1571d541a5c3fc49923bb353a37dd431.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<4E97067A.2070305@zytor.com> <4E97188A.6040400@goop.org>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
Mime-Version: 1.0
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>, Michael,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 09/10] x86/jump_label: use
 GENERIC_NOP5_ATOMIC instead of jmp5 +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 Thu, 2011-10-13 at 09:57 -0700, Jeremy Fitzhardinge wrote:
> On 10/13/2011 08:40 AM, H. Peter Anvin wrote:
> > On 10/12/2011 05:08 PM, Jeremy Fitzhardinge wrote:
> >> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> >>
> >> GENERIC_NOP5_ATOMIC should make a better nop.
> >>
> > On 32 bits, yes.  On 64 bits you should use P6_NOP5_ATOMIC.
> 
> Something like this?
> 

No, we only care about 5byte nops here. Look at ideal_nop in
alterative.c

-- Steve



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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:43:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:43:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQFV-0006ar-Pc; Thu, 13 Oct 2011 11:43:21 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REQEw-0006Nk-IV
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:42:46 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318531361!19414359!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12971 invoked from network); 13 Oct 2011 18:42:43 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-2.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 18:42:43 -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
	p9DIgcBj010844
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 18:42: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
	p9DIgbkI027218
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 18:42:38 GMT
Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9DIgWMM032717; Thu, 13 Oct 2011 13:42:32 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 11:42:32 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 869D3157E; Thu, 13 Oct 2011 14:42:28 -0400 (EDT)
Date: Thu, 13 Oct 2011 14:42:28 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Zhengwang Ruan (Royo)" <zhengwang.ruan@gmail.com>
Subject: Re: [Xen-devel] Several questions from a freshman to Xen
Message-ID: <20111013184228.GK15499@phenom.oracle.com>
References: <4E9708E5.9060104@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9708E5.9060104@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.0A090204.4E973120.015B:SCFMA922111,ss=1,re=-4.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, Oct 13, 2011 at 11:51:01PM +0800, Zhengwang Ruan (Royo) wrote:
> Hi Guys,
> 
> I am new man with some confusions to this amazing technology, hope
> you guys give answers to help me better understand Xen. :)
> 
> 1, You guys have been working on developing many releases, do you
> guys have agreements on developing every source code based on a
> fixed linux kernel version before starting a new release? If so, how

No.
> could I know the corresponding kernel version to a given xen
> release? I tried to find answer for myself on the following wiki
> page, but it is not latest enough.

Anything past 3.0 kernel should work. Every Linux kernel release
we fix bugs and add new features.

Look in Paravirt Wiki for the roadmap of what we want to
have in 3.2 and 3.3 Linux kernel.
> 
> http://wiki.xen.org/xenwiki/DistributionSupport
> 
> 2, I found some interesting source files in xen-4.1.1 release, I
> listed them below:
> 
> $ ll
> drwx------ 4 royo royo 16384 2011-10-12 00:20 arch/
> drwx------ 5 royo royo 16384 2011-06-15 00:03 common/
> -rw-r--r-- 1 royo royo 19185 2011-06-15 00:03 COPYING
> drwx------ 2 royo royo 16384 2011-06-15 00:03 crypto/
> drwx------ 8 royo royo 16384 2011-06-15 00:03 drivers/
> drwx------ 9 royo royo 16384 2011-06-15 00:03 include/
> -rw-r--r-- 1 royo royo  5529 2011-06-15 00:03 Makefile
> -rw-r--r-- 1 royo royo  3498 2011-06-15 00:03 Rules.mk
> drwx------ 3 royo royo 16384 2011-06-15 00:03 tools/
> drwx------ 4 royo royo 16384 2011-06-15 00:03 xsm/
> 
> Are these files going to replace or be added to linux kernel source
> while making dm0? I am amazed that this release can be installed to

Why would they?

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:44:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:44:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQGP-0006yY-8X; Thu, 13 Oct 2011 11:44:17 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REQFT-0006Z9-I2
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:43:19 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1318531373!44397886!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28649 invoked from network); 13 Oct 2011 18:42:54 -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; 13 Oct 2011 18:42:54 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9DIhCj0011608
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Thu, 13 Oct 2011 18:43:13 GMT
Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9DIhB9U016558
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 18:43:11 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
	p9DIh5Ku000623; Thu, 13 Oct 2011 13:43:05 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 11:43:05 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id C99C3A13; Thu, 13 Oct 2011 14:36:31 -0400 (EDT)
Date: Thu, 13 Oct 2011 14:36:31 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH] x86-64: don't use xmalloc_array() for
	allocation of the (per-CPU) IDTs
Message-ID: <20111013183631.GJ15499@phenom.oracle.com>
References: <4E96B593020000780005B0CE@nat28.tlf.novell.com>
	<CABC5CBD.32774%keir@xen.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CABC5CBD.32774%keir@xen.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090201.4E973142.0087,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.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, Oct 13, 2011 at 09:15:41AM +0100, Keir Fraser wrote:
> On 13/10/2011 08:55, "Jan Beulich" <JBeulich@suse.com> wrote:
> 
> >>>> On 13.10.11 at 09:50, Keir Fraser <keir@xen.org> wrote:
> >> Finally, I'm not sure about more x86-64 code movement: I'd like to kill
> >> x86-32 entirely really.
> > 
> > I know, but you got pushed back each time you tried...
> 
> I think we're stuck with it for 4.2. Will try again when we open development
> for 4.3. The argument last time was the low-powered Atoms, used in low-end
> netbooks; but there's no evidence that anyone is using Xen on such
> platforms. I can't imagine it would be very worthwhile.

I've actually been using Xen 4.1.1 on them. But the Atom I've is 64-bit capable.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:45:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:45:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQHK-0007ML-76; Thu, 13 Oct 2011 11:45:14 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REQFY-0006b1-PY
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:43:25 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1318531400!29160614!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12194 invoked from network); 13 Oct 2011 18:43:21 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 18:43:21 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9DIhCUZ011637
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Thu, 13 Oct 2011 18:43:14 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9DIhBHl016568
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 18:43:11 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
	p9DIh5gU011590; Thu, 13 Oct 2011 13:43:06 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 11:43:05 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id CDE141EA; Thu, 13 Oct 2011 14:24:26 -0400 (EDT)
Date: Thu, 13 Oct 2011 14:24:26 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] xenbus: Fix loopback event channel assuming
	domain 0
Message-ID: <20111013182426.GG15499@phenom.oracle.com>
References: <1317824920-639-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20109.60188.905267.410813@mariner.uk.xensource.com>
	<4E8DF425.9000807@tycho.nsa.gov>
	<1317973956.21903.281.camel@zakaz.uk.xensource.com>
	<4E8F2AD0.2060904@tycho.nsa.gov>
	<1318251283.21903.424.camel@zakaz.uk.xensource.com>
	<4E94582C.4060305@tycho.nsa.gov>
	<1318437131.21903.775.camel@zakaz.uk.xensource.com>
	<4E95E0AB.5010901@tycho.nsa.gov>
	<1318497874.21903.812.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318497874.21903.812.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090201.4E973142.0223,ss=1,re=0.000,fgs=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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 13, 2011 at 10:24:34AM +0100, Ian Campbell wrote:
> > >>  but
> > >> the only Linux change required for the second case is the posted fix to the
> > >> loopback event channel.
> > > 
> > > Unless dom0 is also running Linux? In which case it has no way to talk
> > > to the xenstored in the second domain?
> > 
> > Correct; I am not addressing this problem as dom0 is not running Linux here.
> 
> Sure, my concern was that we don't paint ourselves into a corner wrt
> future moves in this direction. I think I'm now convinced that this
> isn't the case and that everything is fine (thanks!).
> 
> > The other patches you pointed to do address that possibility with the ioctl,
> > which seems a good solution if you want to also run Linux in dom0
> 
> Agreed, I think the ioctl path will fit into your
> "xenstored_local_init()" path just the same as it fits into the current
> code.
> 
> > > How does the xenstored running in the second domain get the necessary
> > > page/evtchn numbers to allow it to communicate with dom0?
> > 
> > In my setup, it doesn't ever communicate with dom0 as dom0 dies once it
> > has set up the boot domains. For a more general case, the page/evtchn
> > numbers could be passed in a normal introduce message if they are made
> > available outside dom0 (perhaps by command-line parameters or via another
> > mechanism like v4v).
> 
> That rings a bell -- I think Deigo had them on the xenstored domain
> command line.
> 
> > > I assume it is guaranteed that xen_start_info->store_evtchn == 0 (and
> > > presumably xen_start_info->store_mfn == 0) for the real dom0?
> > 
> > Yes; the start_info page is zeroed prior to filling it in for dom0, and
> > these fields are not filled in.
> 
> Great.
> 
> The representation of your changes which diff chose was not terribly
> helpful for seeing the trees in the woods but I applied it and reviewed
> the result and it looks ok to me.

Daniel,

Could you please repost these two patches with Ian's Reviewed-by and rebase
it on top of 3.1-rc9 please?


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:46:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11: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 1REQI6-0007jM-Q6; Thu, 13 Oct 2011 11:46:02 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REQFi-0006fJ-2d
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:43:34 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1318531410!17201864!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14560 invoked from network); 13 Oct 2011 18:43:31 -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 Oct 2011 18:43:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,341,1315180800"; 
   d="scan'208";a="8382309"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 18:43:30 +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, 13 Oct 2011 19:43:30 +0100
Date: Thu, 13 Oct 2011 19:43:33 +0100
From: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <alpine.DEB.2.00.1110131909250.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: Ian Campbell <Ian.Campbell@eu.citrix.com>, Keir Fraser <keir@xen.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH v8 0/6] build upstream qemu and seabios 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

Hi all,
this is the eighth version of the patch series to introduce upstream qemu
and seabios in the xen-unstable build system.


Changes to v7:

- call upstream qemu's configure script right before building qemu and
after building libxc and xenstore because it needs them;

- introduce a new patch to move the call to xen-setup after building
libxc and xenstore for consistency with upstream qemu;

- fix a typo in tools/Makefile (patch #4);


Changes to v6:

- add "set -e" to git-checkout.sh;

- add argument count check to git-checkout.sh;

- remove spurious semicolons in git-checkout.sh.


Changes to v5:

- use $GIT in git-checkout.sh;

- add an http mirror for seabios;

- use $(LIBEXEC) to configure upstream qemu;

- append a patch for libxenlight to find the upstream qemu binary under
$(LIBEXEC).


Changes to v4:

- remove an obsolete comment;

- use /bin/sh to execute git-checkout.sh rathen than /bin/bash.


Changes to v3:

- reduce the scope of git-checkout.sh, now it only does what the name
says; calling "configure" is responsibility of the caller. As a result
of this change, the build still works when the user specifies a local
directory in the CONFIG_QEMU environmental variable;

- use a more official qemu repository hosted on xenbits;

- use a changeset as QEMU_UPSTREAM_TAG rather than a branch name.



Changes to v2:

- move tools/git-checkout.sh to scripts/git-checkout.sh;

- use git-checkout.sh for seabios;

- improve seabios integration with tools/firmware make system;

- add qemu-xen-traditional, qemu-xen and seabios dir entries to
.hgignore.



Changes to v1:

- always build upstream qemu and seabios, rather than introducing them
as an option.


Cheers,

Stefano

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:47:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11: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 1REQJ6-000871-CB; Thu, 13 Oct 2011 11:47:04 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REQGQ-0006yB-P9
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:44:19 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318531454!35182781!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30493 invoked from network); 13 Oct 2011 18:44:15 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 18:44:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,341,1315195200"; d="scan'208";a="166802449"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 14:44:13 -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; Thu, 13 Oct 2011 14:44:14 -0400
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 p9DIi6h8025379;
	Thu, 13 Oct 2011 11:44:06 -0700
From: <stefano.stabellini@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 13 Oct 2011 19:44:17 +0100
Message-ID: <1318531462-5889-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.1110131909250.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110131909250.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain
Cc: keir@xen.org, Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com,
	Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH v8 1/6] Introduce git-checkout.sh
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Introduce a script to perform git checkout on an external git tree; use
git-checkout.sh in ioemu-dir-find.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -291,7 +291,7 @@
 ^tools/xm-test/lib/XmTestLib/config.py$
 ^tools/xm-test/lib/XmTestReport/xmtest.py$
 ^tools/xm-test/tests/.*\.test$
-^tools/ioemu-remote
+^tools/ioemu-dir-remote
 ^tools/ioemu-dir$
 ^tools/ocaml/.*/.*\.annot$
 ^tools/ocaml/.*/.*\.cmx?a$
diff --git a/scripts/git-checkout.sh b/scripts/git-checkout.sh
new file mode 100755
--- /dev/null
+++ b/scripts/git-checkout.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+if test $# -lt 3; then
+	echo "Usage: $0 <tree> <tag> <dir>"
+	exit 1
+fi
+
+TREE=$1
+TAG=$2
+DIR=$3
+
+set -e
+
+if test \! -d $DIR-remote; then
+	rm -rf $DIR-remote $DIR-remote.tmp
+	mkdir $DIR-remote.tmp; rmdir $DIR-remote.tmp
+	$GIT clone $TREE $DIR-remote.tmp
+	if test "$TAG" ; then
+		cd $DIR-remote.tmp
+		$GIT branch -D dummy >/dev/null 2>&1 ||:
+		$GIT checkout -b dummy $TAG
+		cd ..
+	fi
+	mv $DIR-remote.tmp $DIR-remote
+fi
+rm -f $DIR
+ln -sf $DIR-remote $DIR
diff --git a/tools/Makefile b/tools/Makefile
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -70,7 +70,7 @@ clean: subdirs-clean
 
 .PHONY: distclean
 distclean: subdirs-distclean
-	rm -rf ioemu-dir ioemu-remote
+	rm -rf ioemu-dir ioemu-dir-remote
 
 ifneq ($(XEN_COMPILE_ARCH),$(XEN_TARGET_ARCH))
 IOEMU_CONFIGURE_CROSS ?= --cpu=$(XEN_TARGET_ARCH) \
@@ -88,20 +88,8 @@ ioemu-dir-find:
 	if test -d $(CONFIG_QEMU); then \
 		mkdir -p ioemu-dir; \
 	else \
-		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; \
-			if [ "$(QEMU_TAG)" ]; then			\
-				cd ioemu-remote.tmp;			\
-				$(GIT) branch -D dummy >/dev/null 2>&1 ||:; \
-				$(GIT) checkout -b dummy $(QEMU_TAG);	\
-				cd ..;					\
-			fi;						\
-			mv ioemu-remote.tmp ioemu-remote; \
-		fi; \
-		rm -f ioemu-dir; \
-		ln -sf ioemu-remote ioemu-dir; \
+		export GIT=$(GIT); \
+		$(XEN_ROOT)/scripts/git-checkout.sh $(CONFIG_QEMU) $(QEMU_TAG) ioemu-dir; \
 	fi
 	set -e; \
 		$(buildmakevars2shellvars); \
@@ -112,7 +100,7 @@ ioemu-dir-find:
 ioemu-dir-force-update:
 	set -ex; \
 	if [ "$(QEMU_TAG)" ]; then \
-		cd ioemu-remote; \
+		cd ioemu-dir-remote; \
 		$(GIT) fetch origin; \
 		$(GIT) reset --hard $(QEMU_TAG); \
 	fi

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:48:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11: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 1REQKw-00008z-BI; Thu, 13 Oct 2011 11:48:58 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REQGV-0006zh-GN
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:44:23 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318531454!35182781!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30659 invoked from network); 13 Oct 2011 18:44:20 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 18:44:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,341,1315195200"; d="scan'208";a="166802462"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 14:44:19 -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; Thu, 13 Oct 2011 14:44:19 -0400
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 p9DIi6hC025379;
	Thu, 13 Oct 2011 11:44:13 -0700
From: <stefano.stabellini@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 13 Oct 2011 19:44:21 +0100
Message-ID: <1318531462-5889-5-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <alpine.DEB.2.00.1110131909250.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110131909250.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain
Cc: keir@xen.org, Ian Campbell <ian.campbell@citrix.com>,
	Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com,
	Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH v8 6/6] libxl: use new qemu at the location
	where xen-unstable installs 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

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

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 75f27929ad92 tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c	Fri Sep 23 11:22:23 2011 +0000
+++ b/tools/libxl/libxl_dm.c	Fri Sep 23 11:22:39 2011 +0000
@@ -55,7 +55,7 @@ const char *libxl__domain_device_model(l
             dm = libxl__abs_path(gc, "qemu-dm", libxl_libexec_path());
             break;
         case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
-            dm = libxl__strdup(gc, "/usr/bin/qemu");
+            dm = libxl__abs_path(gc, "qemu", libxl_libexec_path());
             break;
         default:
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR,

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:50:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:50:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQM9-0000XW-Eo; Thu, 13 Oct 2011 11:50:13 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REQGX-00070K-Dr
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:44:25 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1318531460!29144339!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30542 invoked from network); 13 Oct 2011 18:44:22 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 18:44:22 -0000
X-IronPort-AV: E=Sophos;i="4.69,341,1315195200"; d="scan'208";a="18206435"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 14:44:20 -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; Thu, 13 Oct 2011 14:44:20 -0400
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 p9DIi6h9025379;
	Thu, 13 Oct 2011 11:44:08 -0700
From: <stefano.stabellini@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 13 Oct 2011 19:44:18 +0100
Message-ID: <1318531462-5889-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.1110131909250.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110131909250.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain
Cc: keir@xen.org, Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com,
	Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH v8 2/6] Rename ioemu-dir as
	qemu-xen-traditional-dir
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

diff -r 9d2f56b25845 .hgignore
--- a/.hgignore	Fri Sep 23 11:35:23 2011 +0000
+++ b/.hgignore	Fri Sep 23 11:36:44 2011 +0000
@@ -291,8 +291,8 @@
 ^tools/xm-test/lib/XmTestLib/config.py$
 ^tools/xm-test/lib/XmTestReport/xmtest.py$
 ^tools/xm-test/tests/.*\.test$
-^tools/ioemu-dir-remote
-^tools/ioemu-dir$
+^tools/qemu-xen-traditional-dir-remote
+^tools/qemu-xen-traditional-dir$
 ^tools/ocaml/.*/.*\.annot$
 ^tools/ocaml/.*/.*\.cmx?a$
 ^tools/ocaml/.*/META$
diff -r 9d2f56b25845 Makefile
--- a/Makefile	Fri Sep 23 11:35:23 2011 +0000
+++ b/Makefile	Fri Sep 23 11:36:44 2011 +0000
@@ -70,7 +70,7 @@ install-tools:
 	$(MAKE) -C tools install
 
 ifeq ($(CONFIG_IOEMU),y)
-install-tools: tools/ioemu-dir
+install-tools: tools/qemu-xen-traditional-dir
 endif
 
 .PHONY: install-kernels
@@ -78,18 +78,18 @@ install-kernels:
 	for i in $(XKERNELS) ; do $(MAKE) $$i-install || exit 1; done
 
 .PHONY: install-stubdom
-install-stubdom: tools/ioemu-dir install-tools
+install-stubdom: tools/qemu-xen-traditional-dir install-tools
 	$(MAKE) -C stubdom install
 ifeq (x86_64,$(XEN_TARGET_ARCH))
 	XEN_TARGET_ARCH=x86_32 $(MAKE) -C stubdom install-grub
 endif
 
-tools/ioemu-dir:
-	$(MAKE) -C tools ioemu-dir-find
+tools/qemu-xen-traditional-dir:
+	$(MAKE) -C tools qemu-xen-traditional-dir-find
 
-.PHONY: tools/ioemu-dir-force-update
-tools/ioemu-dir-force-update:
-	$(MAKE) -C tools ioemu-dir-force-update
+.PHONY: tools/qemu-xen-traditional-dir-force-update
+tools/qemu-xen-traditional-dir-force-update:
+	$(MAKE) -C tools qemu-xen-traditional-dir-force-update
 
 .PHONY: install-docs
 install-docs:
diff -r 9d2f56b25845 stubdom/Makefile
--- a/stubdom/Makefile	Fri Sep 23 11:35:23 2011 +0000
+++ b/stubdom/Makefile	Fri Sep 23 11:36:44 2011 +0000
@@ -218,15 +218,15 @@ cross-ocaml: $(OCAML_STAMPFILE)
 QEMU_ROOT := $(shell if [ -d "$(CONFIG_QEMU)" ]; then echo "$(CONFIG_QEMU)"; else echo .; fi)
 
 ifeq ($(QEMU_ROOT),.)
-$(XEN_ROOT)/tools/ioemu-dir:
-	$(CROSS_MAKE) -C $(XEN_ROOT)/tools ioemu-dir-find
+$(XEN_ROOT)/tools/qemu-xen-traditional-dir:
+	$(CROSS_MAKE) -C $(XEN_ROOT)/tools qemu-xen-traditional-dir-find
 
-ioemu/linkfarm.stamp: $(XEN_ROOT)/tools/ioemu-dir
+ioemu/linkfarm.stamp: $(XEN_ROOT)/tools/qemu-xen-traditional-dir
 	mkdir -p ioemu
 	set -e;									\
 	$(buildmakevars2shellvars);						\
 	cd ioemu;								\
-	src="$$XEN_ROOT/tools/ioemu-dir"; export src;				\
+	src="$$XEN_ROOT/tools/qemu-xen-traditional-dir"; export src;		\
 	(cd $$src && find * -type d -print) | xargs mkdir -p;			\
 	(cd $$src && find *	! -type l  -type f  $(addprefix ! -name ,	\
 			'*.[oda1]' 'config-*' config.mak qemu-dm qemu-img-xen	\
diff -r 9d2f56b25845 tools/Makefile
--- a/tools/Makefile	Fri Sep 23 11:35:23 2011 +0000
+++ b/tools/Makefile	Fri Sep 23 11:36:44 2011 +0000
@@ -30,7 +30,7 @@ SUBDIRS-$(LIBXENAPI_BINDINGS) += libxen
 
 # do not recurse in to a dir we are about to delete
 ifneq "$(MAKECMDGOALS)" "distclean"
-SUBDIRS-$(CONFIG_IOEMU) += ioemu-dir
+SUBDIRS-$(CONFIG_IOEMU) += qemu-xen-traditional-dir
 endif
 
 SUBDIRS-y += xenpmd
@@ -70,7 +70,7 @@ clean: subdirs-clean
 
 .PHONY: distclean
 distclean: subdirs-distclean
-	rm -rf ioemu-dir ioemu-dir-remote
+	rm -rf qemu-xen-traditional-dir qemu-xen-traditional-dir-remote
 
 ifneq ($(XEN_COMPILE_ARCH),$(XEN_TARGET_ARCH))
 IOEMU_CONFIGURE_CROSS ?= --cpu=$(XEN_TARGET_ARCH) \
@@ -83,34 +83,34 @@ ifneq ($(QEMU_ROOT),.)
 export QEMU_ROOT
 endif
 
-ioemu-dir-find:
+qemu-xen-traditional-dir-find:
 	set -ex; \
 	if test -d $(CONFIG_QEMU); then \
-		mkdir -p ioemu-dir; \
+		mkdir -p qemu-xen-traditional-dir; \
 	else \
 		export GIT=$(GIT); \
-		$(XEN_ROOT)/scripts/git-checkout.sh $(CONFIG_QEMU) $(QEMU_TAG) ioemu-dir; \
+		$(XEN_ROOT)/scripts/git-checkout.sh $(CONFIG_QEMU) $(QEMU_TAG) qemu-xen-traditional-dir; \
 	fi
 	set -e; \
 		$(buildmakevars2shellvars); \
-		cd ioemu-dir; \
+		cd qemu-xen-traditional-dir; \
 		$(QEMU_ROOT)/xen-setup $(IOEMU_CONFIGURE_CROSS)
 
-.PHONY: ioemu-dir-force-update
-ioemu-dir-force-update:
+.PHONY: qemu-xen-traditional-dir-force-update
+qemu-xen-traditional-dir-force-update:
 	set -ex; \
 	if [ "$(QEMU_TAG)" ]; then \
-		cd ioemu-dir-remote; \
+		cd qemu-xen-traditional-dir-remote; \
 		$(GIT) fetch origin; \
 		$(GIT) reset --hard $(QEMU_TAG); \
 	fi
 
-subdir-all-ioemu-dir subdir-install-ioemu-dir: ioemu-dir-find
+subdir-all-qemu-xen-traditional-dir subdir-install-qemu-xen-traditional-dir: qemu-xen-traditional-dir-find
 
-subdir-clean-ioemu-dir:
-	set -e; if test -d ioemu-dir/.; then \
+subdir-clean-qemu-xen-traditional-dir:
+	set -e; if test -d qemu-xen-traditional-dir/.; then \
 		$(buildmakevars2shellvars); \
-		$(MAKE) -C ioemu-dir clean; \
+		$(MAKE) -C qemu-xen-traditional-dir clean; \
 	fi
 
 subdir-clean-debugger/gdbsx subdir-distclean-debugger/gdbsx: .phony

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:51:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:51:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQN1-0000ui-Bo; Thu, 13 Oct 2011 11:51:07 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REQGX-00070e-Tm
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:44:26 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318531454!35182781!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30696 invoked from network); 13 Oct 2011 18:44:22 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 18:44:22 -0000
X-IronPort-AV: E=Sophos;i="4.69,341,1315195200"; d="scan'208";a="166802473"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 14:44:22 -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; Thu, 13 Oct 2011 14:44:22 -0400
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 p9DIi6hA025379;
	Thu, 13 Oct 2011 11:44:10 -0700
From: <stefano.stabellini@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 13 Oct 2011 19:44:19 +0100
Message-ID: <1318531462-5889-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.1110131909250.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110131909250.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain
Cc: keir@xen.org, Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com,
	Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH v8 4/6] Clone and build upstream Qemu 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

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

diff -r f1159080e60a .hgignore
--- a/.hgignore	Thu Oct 13 17:57:35 2011 +0000
+++ b/.hgignore	Thu Oct 13 17:57:59 2011 +0000
@@ -294,6 +294,8 @@
 ^tools/xm-test/tests/.*\.test$
 ^tools/qemu-xen-traditional-dir-remote
 ^tools/qemu-xen-traditional-dir$
+^tools/qemu-xen-dir-remote
+^tools/qemu-xen-dir$
 ^tools/ocaml/.*/.*\.annot$
 ^tools/ocaml/.*/.*\.cmx?a$
 ^tools/ocaml/.*/META$
diff -r f1159080e60a Config.mk
--- a/Config.mk	Thu Oct 13 17:57:35 2011 +0000
+++ b/Config.mk	Thu Oct 13 17:57:59 2011 +0000
@@ -196,6 +196,13 @@ else
 QEMU_REMOTE=git://xenbits.xensource.com/qemu-xen-unstable.git
 endif
 
+ifeq ($(GIT_HTTP),y)
+QEMU_UPSTREAM_URL ?= http://xenbits.xensource.com/git-http/qemu-upstream-unstable.git
+else
+QEMU_UPSTREAM_URL ?= git://xenbits.xensource.com/qemu-upstream-unstable.git
+endif
+QEMU_UPSTREAM_TAG ?= 6dd84c71dff047f9e492d67e7c99928d09202760
+
 # Specify which qemu-dm to use. This may be `ioemu' to use the old
 # Mercurial in-tree version, or a local directory, or a git URL.
 # CONFIG_QEMU ?= `pwd`/$(XEN_ROOT)/../qemu-xen.git
diff -r f1159080e60a Makefile
--- a/Makefile	Thu Oct 13 17:57:35 2011 +0000
+++ b/Makefile	Thu Oct 13 17:57:59 2011 +0000
@@ -70,7 +70,7 @@ install-tools:
 	$(MAKE) -C tools install
 
 ifeq ($(CONFIG_IOEMU),y)
-install-tools: tools/qemu-xen-traditional-dir
+install-tools: tools/qemu-xen-traditional-dir tools/qemu-xen-dir
 endif
 
 .PHONY: install-kernels
@@ -91,6 +91,9 @@ tools/qemu-xen-traditional-dir:
 tools/qemu-xen-traditional-dir-force-update:
 	$(MAKE) -C tools qemu-xen-traditional-dir-force-update
 
+tools/qemu-xen-dir:
+	$(MAKE) -C tools qemu-xen-dir-find
+
 .PHONY: install-docs
 install-docs:
 	sh ./docs/check_pkgs && $(MAKE) -C docs install || true
diff -r f1159080e60a tools/Makefile
--- a/tools/Makefile	Thu Oct 13 17:57:35 2011 +0000
+++ b/tools/Makefile	Thu Oct 13 17:57:59 2011 +0000
@@ -32,6 +32,7 @@ SUBDIRS-y += libvchan
 # do not recurse in to a dir we are about to delete
 ifneq "$(MAKECMDGOALS)" "distclean"
 SUBDIRS-$(CONFIG_IOEMU) += qemu-xen-traditional-dir
+SUBDIRS-$(CONFIG_IOEMU) += qemu-xen-dir
 endif
 
 SUBDIRS-y += xenpmd
@@ -72,6 +73,7 @@ clean: subdirs-clean
 .PHONY: distclean
 distclean: subdirs-distclean
 	rm -rf qemu-xen-traditional-dir qemu-xen-traditional-dir-remote
+	rm -rf qemu-xen-dir qemu-xen-dir-remote
 
 ifneq ($(XEN_COMPILE_ARCH),$(XEN_TARGET_ARCH))
 IOEMU_CONFIGURE_CROSS ?= --cpu=$(XEN_TARGET_ARCH) \
@@ -93,6 +95,14 @@ qemu-xen-traditional-dir-find:
 		$(XEN_ROOT)/scripts/git-checkout.sh $(CONFIG_QEMU) $(QEMU_TAG) qemu-xen-traditional-dir; \
 	fi
 
+qemu-xen-dir-find:
+	if test -d $(QEMU_UPSTREAM_URL) ; then \
+		ln -sf $(QEMU_UPSTREAM_URL) qemu-xen-dir; \
+	else \
+		export GIT=$(GIT); \
+		$(XEN_ROOT)/scripts/git-checkout.sh $(QEMU_UPSTREAM_URL) $(QEMU_UPSTREAM_TAG) qemu-xen-dir ; \
+	fi
+
 .PHONY: qemu-xen-traditional-dir-force-update
 qemu-xen-traditional-dir-force-update:
 	set -ex; \
@@ -114,6 +124,25 @@ subdir-clean-qemu-xen-traditional-dir:
 		$(MAKE) -C qemu-xen-traditional-dir clean; \
 	fi
 
+subdir-all-qemu-xen-dir subdir-install-qemu-xen-dir: qemu-xen-dir-find
+	cd qemu-xen-dir; \
+	./configure --enable-xen --target-list=i386-softmmu \
+		--source-path=$$ROOT \
+		--extra-cflags="-I$(XEN_ROOT)/tools/include \
+		-I$(XEN_ROOT)/tools/libxc \
+		-I$(XEN_ROOT)/tools/xenstore" \
+		--extra-ldflags="-L$(XEN_ROOT)/tools/libxc \
+		-L$(XEN_ROOT)/tools/xenstore" \
+		--bindir=$(LIBEXEC) \
+		--disable-kvm \
+		$(IOEMU_CONFIGURE_CROSS)
+
+subdir-clean-qemu-xen-dir:
+	set -e; if test -d qemu-xen-dir/.; then \
+		$(buildmakevars2shellvars); \
+		$(MAKE) -C qemu-xen-dir clean; \
+	fi
+
 subdir-clean-debugger/gdbsx subdir-distclean-debugger/gdbsx: .phony
 	$(MAKE) -C debugger/gdbsx clean
 

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:52:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11:52:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQO0-0001I1-K6; Thu, 13 Oct 2011 11:52:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REQGZ-00071K-85
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:44:27 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1318531460!29144339!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30556 invoked from network); 13 Oct 2011 18:44:23 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 18:44:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,341,1315195200"; d="scan'208";a="18206436"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 14:44:23 -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; Thu, 13 Oct 2011 14:44:23 -0400
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 p9DIi6hB025379;
	Thu, 13 Oct 2011 11:44:11 -0700
From: <stefano.stabellini@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 13 Oct 2011 19:44:20 +0100
Message-ID: <1318531462-5889-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.1110131909250.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110131909250.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain
Cc: keir@xen.org, Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com,
	Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH v8 5/6] Clone and build Seabios 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

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

diff -r 294b63f68602 .hgignore
--- a/.hgignore	Fri Sep 23 11:37:09 2011 +0000
+++ b/.hgignore	Fri Sep 23 11:51:06 2011 +0000
@@ -295,6 +295,8 @@
 ^tools/qemu-xen-traditional-dir$
 ^tools/qemu-xen-dir-remote
 ^tools/qemu-xen-dir$
+^tools/tools/firmware/seabios-dir-remote
+^tools/tools/firmware/seabios-dir$
 ^tools/ocaml/.*/.*\.annot$
 ^tools/ocaml/.*/.*\.cmx?a$
 ^tools/ocaml/.*/META$
diff -r 294b63f68602 Config.mk
--- a/Config.mk	Fri Sep 23 11:37:09 2011 +0000
+++ b/Config.mk	Fri Sep 23 11:51:06 2011 +0000
@@ -194,10 +194,13 @@ endif
 
 ifeq ($(GIT_HTTP),y)
 QEMU_UPSTREAM_URL ?= http://xenbits.xensource.com/git-http/qemu-upstream-unstable.git
+SEABIOS_UPSTREAM_URL ?= http://git.qemu.org/git/seabios.git
 else
 QEMU_UPSTREAM_URL ?= git://xenbits.xensource.com/qemu-upstream-unstable.git
+SEABIOS_UPSTREAM_URL ?= git://git.qemu.org/seabios.git
 endif
 QEMU_UPSTREAM_TAG ?= 6dd84c71dff047f9e492d67e7c99928d09202760
+SEABIOS_UPSTREAM_TAG ?= 7fc039e9c262b4199fab497f3e12f4e425c37560
 
 # Specify which qemu-dm to use. This may be `ioemu' to use the old
 # Mercurial in-tree version, or a local directory, or a git URL.
@@ -211,15 +214,6 @@ QEMU_TAG ?= cd776ee9408ff127f934a707c1a3
 # Short answer -- do not enable this unless you know what you are
 # doing and are prepared for some pain.
 
-# SeaBIOS integration is a work in progress. Before enabling this
-# option you must clone git://git.qemu.org/seabios.git/, possibly add
-# some development patches and then build it yourself before pointing
-# this variable to it (using an absolute path).
-#
-# Note that using SeaBIOS requires the use the upstream qemu as the
-# device model.
-SEABIOS_DIR ?= 
-
 # Optional components
 XENSTAT_XENTOP     ?= y
 VTPM_TOOLS         ?= n
diff -r 294b63f68602 tools/firmware/Makefile
--- a/tools/firmware/Makefile	Fri Sep 23 11:37:09 2011 +0000
+++ b/tools/firmware/Makefile	Fri Sep 23 11:51:06 2011 +0000
@@ -6,13 +6,18 @@ TARGET      := hvmloader/hvmloader
 INST_DIR := $(DESTDIR)$(XENFIRMWAREDIR)
 
 SUBDIRS :=
+SUBDIRS += seabios-dir
 SUBDIRS += rombios
 SUBDIRS += vgabios
 SUBDIRS += etherboot
 SUBDIRS += hvmloader
 
+seabios-dir:
+	GIT=$(GIT) $(XEN_ROOT)/scripts/git-checkout.sh $(SEABIOS_UPSTREAM_URL) $(SEABIOS_UPSTREAM_TAG) seabios-dir
+	cp seabios-config seabios-dir/.config;
+
 .PHONY: all
-all:
+all: seabios-dir
 	@set -e; if [ $$((`( bcc -v 2>&1 | grep version || echo 0.0.0 ) | cut -d' ' -f 3 | awk -F. '{ printf "0x%02x%02x%02x", $$1, $$2, $$3}'`)) -lt $$((0x00100e)) ] ; then \
 	echo "==========================================================================="; \
 	echo "Require dev86 rpm or bin86 & bcc debs version >= 0.16.14 to build firmware!"; \
@@ -35,4 +40,7 @@ clean: subdirs-clean
 distclean: subdirs-distclean
 
 subdir-distclean-etherboot: .phony
-	$(MAKE) -C etherboot distclean
\ No newline at end of file
+	$(MAKE) -C etherboot distclean
+
+subdir-distclean-seabios-dir: .phony
+	rm -rf seabios-dir seabios-dir-remote
diff -r 294b63f68602 tools/firmware/hvmloader/Makefile
--- a/tools/firmware/hvmloader/Makefile	Fri Sep 23 11:37:09 2011 +0000
+++ b/tools/firmware/hvmloader/Makefile	Fri Sep 23 11:51:06 2011 +0000
@@ -44,6 +44,7 @@ CFLAGS += -DENABLE_ROMBIOS
 ROMBIOS_ROM := $(ROMBIOS_DIR)/BIOS-bochs-latest
 endif
 
+SEABIOS_DIR := ../seabios-dir
 ifneq ($(SEABIOS_DIR),)
 OBJS += seabios.o
 CFLAGS += -DENABLE_SEABIOS
diff -r 294b63f68602 tools/firmware/seabios-config
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/firmware/seabios-config	Fri Sep 23 11:51:06 2011 +0000
@@ -0,0 +1,73 @@
+#
+# Automatically generated make config: don't edit
+# SeaBIOS Configuration
+# Wed Sep  7 13:03:21 2011
+#
+
+#
+# General Features
+#
+# CONFIG_COREBOOT is not set
+CONFIG_XEN=y
+CONFIG_THREADS=y
+# CONFIG_THREAD_OPTIONROMS is not set
+CONFIG_RELOCATE_INIT=y
+CONFIG_BOOTMENU=y
+# CONFIG_BOOTSPLASH is not set
+CONFIG_BOOTORDER=y
+
+#
+# Hardware support
+#
+CONFIG_ATA=y
+CONFIG_ATA_DMA=y
+CONFIG_ATA_PIO32=y
+CONFIG_AHCI=y
+CONFIG_VIRTIO_BLK=y
+CONFIG_FLOPPY=y
+CONFIG_PS2PORT=y
+CONFIG_USB=y
+CONFIG_USB_UHCI=y
+CONFIG_USB_OHCI=y
+CONFIG_USB_EHCI=y
+CONFIG_USB_MSC=y
+CONFIG_USB_HUB=y
+CONFIG_USB_KEYBOARD=y
+CONFIG_USB_MOUSE=y
+CONFIG_SERIAL=y
+CONFIG_LPT=y
+# CONFIG_USE_SMM is not set
+CONFIG_MTRR_INIT=y
+
+#
+# BIOS interfaces
+#
+CONFIG_DRIVES=y
+CONFIG_CDROM_BOOT=y
+CONFIG_CDROM_EMU=y
+CONFIG_PCIBIOS=y
+CONFIG_APMBIOS=y
+CONFIG_PNPBIOS=y
+CONFIG_OPTIONROMS=y
+# CONFIG_OPTIONROMS_DEPLOYED is not set
+CONFIG_PMM=y
+CONFIG_BOOT=y
+CONFIG_KEYBOARD=y
+CONFIG_KBD_CALL_INT15_4F=y
+CONFIG_MOUSE=y
+CONFIG_S3_RESUME=y
+# CONFIG_DISABLE_A20 is not set
+
+#
+# BIOS Tables
+#
+CONFIG_PIRTABLE=y
+CONFIG_MPTABLE=y
+CONFIG_SMBIOS=y
+CONFIG_ACPI=y
+
+#
+# Debugging
+#
+CONFIG_DEBUG_LEVEL=1
+# CONFIG_DEBUG_SERIAL is not set

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 11:53:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 11: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 1REQOq-0001ee-7k; Thu, 13 Oct 2011 11:53:00 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REQGc-00072Y-1l
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:44:30 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318531454!35182781!4
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30858 invoked from network); 13 Oct 2011 18:44:26 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 18:44:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,341,1315195200"; d="scan'208";a="166802485"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	13 Oct 2011 14:44:26 -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; Thu, 13 Oct 2011 14:44:26 -0400
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 p9DIi6hD025379;
	Thu, 13 Oct 2011 11:44:14 -0700
From: <stefano.stabellini@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 13 Oct 2011 19:44:22 +0100
Message-ID: <1318531462-5889-6-git-send-email-stefano.stabellini@eu.citrix.com>
X-Mailer: git-send-email 1.7.0.4
In-Reply-To: <alpine.DEB.2.00.1110131909250.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110131909250.3519@kaball-desktop>
MIME-Version: 1.0
Content-Type: text/plain
Cc: keir@xen.org, Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com,
	Stefano.Stabellini@eu.citrix.com
Subject: [Xen-devel] [PATCH v8 3/6] move the call to xen-setup after libxc
	and xenstore are built
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Move the call to xen-setup, the wrapper script to configure
qemu-xen-traditional, right before building qemu-xen-traditional and
after libxc and xenstore are already built.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

diff -r 263577291cc6 tools/Makefile
--- a/tools/Makefile	Thu Oct 13 17:57:03 2011 +0000
+++ b/tools/Makefile	Thu Oct 13 17:57:35 2011 +0000
@@ -92,10 +92,6 @@ qemu-xen-traditional-dir-find:
 		export GIT=$(GIT); \
 		$(XEN_ROOT)/scripts/git-checkout.sh $(CONFIG_QEMU) $(QEMU_TAG) qemu-xen-traditional-dir; \
 	fi
-	set -e; \
-		$(buildmakevars2shellvars); \
-		cd qemu-xen-traditional-dir; \
-		$(QEMU_ROOT)/xen-setup $(IOEMU_CONFIGURE_CROSS)
 
 .PHONY: qemu-xen-traditional-dir-force-update
 qemu-xen-traditional-dir-force-update:
@@ -107,6 +103,10 @@ qemu-xen-traditional-dir-force-update:
 	fi
 
 subdir-all-qemu-xen-traditional-dir subdir-install-qemu-xen-traditional-dir: qemu-xen-traditional-dir-find
+	set -e; \
+		$(buildmakevars2shellvars); \
+		cd qemu-xen-traditional-dir; \
+		$(QEMU_ROOT)/xen-setup $(IOEMU_CONFIGURE_CROSS)
 
 subdir-clean-qemu-xen-traditional-dir:
 	set -e; if test -d qemu-xen-traditional-dir/.; then \

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 12:09:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 12:09:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQf4-0002je-Ek; Thu, 13 Oct 2011 12:09:46 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REQd2-0002Qt-NQ
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 12:07:42 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-13.tower-182.messagelabs.com!1318532856!22075352!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7694 invoked from network); 13 Oct 2011 19:07:37 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-13.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 19:07:37 -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 4B41A13DE;
	Thu, 13 Oct 2011 22:07:36 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 25FAB200ED; Thu, 13 Oct 2011 22:07:36 +0300 (EEST)
Date: Thu, 13 Oct 2011 22:07:36 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: "Zhengwang Ruan (Royo)" <zhengwang.ruan@gmail.com>
Subject: Re: [Xen-devel] Several questions from a freshman to Xen
Message-ID: <20111013190735.GM12984@reaktio.net>
References: <4E9708E5.9060104@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9708E5.9060104@gmail.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
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, Oct 13, 2011 at 11:51:01PM +0800, Zhengwang Ruan (Royo) wrote:
> Hi Guys,
>

Hello,

> I am new man with some confusions to this amazing technology, hope you  
> guys give answers to help me better understand Xen. :)
>

Maybe this wiki page gives some general info about Xen:
http://wiki.xen.org/xenwiki/XenOverview


And these PDFs:
http://xen.org/files/Marketing/WhatisXen.pdf
http://xen.org/files/Marketing/WhyXen.pdf


> 1, You guys have been working on developing many releases, do you guys  
> have agreements on developing every source code based on a fixed linux  
> kernel version before starting a new release? If so, how could I know  
> the corresponding kernel version to a given xen release? I tried to find  
> answer for myself on the following wiki page, but it is not latest 
> enough.
>

Are you talking about dom0 kernel? or domU kernel?

Xen hypervisor (xen.gz) is the compatibility layer,
so dom0 and domUs (VMs) can all have different Linux kernel versions.

> http://wiki.xen.org/xenwiki/DistributionSupport
>
> 2, I found some interesting source files in xen-4.1.1 release, I listed  
> them below:
>
> $ ll
> drwx------ 4 royo royo 16384 2011-10-12 00:20 arch/
> drwx------ 5 royo royo 16384 2011-06-15 00:03 common/
> -rw-r--r-- 1 royo royo 19185 2011-06-15 00:03 COPYING
> drwx------ 2 royo royo 16384 2011-06-15 00:03 crypto/
> drwx------ 8 royo royo 16384 2011-06-15 00:03 drivers/
> drwx------ 9 royo royo 16384 2011-06-15 00:03 include/
> -rw-r--r-- 1 royo royo  5529 2011-06-15 00:03 Makefile
> -rw-r--r-- 1 royo royo  3498 2011-06-15 00:03 Rules.mk
> drwx------ 3 royo royo 16384 2011-06-15 00:03 tools/
> drwx------ 4 royo royo 16384 2011-06-15 00:03 xsm/
>
> Are these files going to replace or be added to linux kernel source  
> while making dm0? I am amazed that this release can be installed to many  
> linux distributions with different kernel, how could you guys achieve 
> this?
>

Xen hypervisor (xen.gz) is a totally separate binary, it's not "mixed" to/with Linux kernel.

- For Xen dom0 you need to use a Linux kernel that has Xen dom0 support enabled.
- For Xen PV domUs (VMs) you need to use a Linux kernel that has Xen PV domU support enabled.
- For Xen HVM VMs you don't need a special kernel, but having Xen PVHVM drivers in the kernel will boost disk/net performance.

Xen related features in different Linux kernel versions:
http://wiki.xen.org/xenwiki/XenParavirtOps


-- Pasi


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 12:11:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 12:11:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQgY-0003Ao-Io; Thu, 13 Oct 2011 12:11:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQfU-0002pf-UJ; Thu, 13 Oct 2011 12:10:13 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318533008!35216622!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25430 invoked from network); 13 Oct 2011 19:10:09 -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; 13 Oct 2011 19:10:09 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9DJA6ot011126
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Thu, 13 Oct 2011 19:10:07 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9DJA5qs028826
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 19:10:05 GMT
Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9DJA0lx023888; Thu, 13 Oct 2011 14:10:00 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 12:09:59 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 997101EA; Thu, 13 Oct 2011 15:09:46 -0400 (EDT)
Date: Thu, 13 Oct 2011 15:09:46 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, xen-users@lists.xensource.com
Message-ID: <20111013190946.GA16336@phenom.oracle.com>
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: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090205.4E97378F.0185,ss=1,re=0.000,fgs=0
Cc: 
Subject: [Xen-devel] Features and bug fixes for Linux kernel 3.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

Hey,

Please keep in mind that there is some outstanding work going on which
could make it in 3.2 depending on when the merge window opens. I will
enumerate those in the next email.

Anyhow, for 3.2 Linux kernel we have these items loaded and ready to go:

 - A new mechanism to parse the E820 resulting in better ballooning.
 - hwclock support. Meaning you can do 'date XX' and it will be saved by machine.
 - Support for PCI multi-segmented machines (big big iron boxes)
 - Optimizations in DMA API.
 - "feature-barrier" in the xen-blkback so that older kernels (SLES10)
   can issue those.
 - "feature-discard" so that TRIM/SCSI UNMAP operations can be utilized.
 - kexec/kdump support for PVonHVM.
 - Cleanups in the code (mostly scripts/cleanpatch.pl)
 - Static analyzer (smatch) run results fixing bugs.
 - Tons of bug fixes.

If you think I missed something - please please email me immediately.


The list is as follow.

Dan Carpenter (1):
      xen/pciback: double lock typo

David Vrabel (9):
      xen/balloon: account for pages released during memory setup
      xen/balloon: simplify test for the end of usable RAM
      xen: allow balloon driver to use more than one memory region
      xen: allow extra memory to be in multiple regions
      xen: release all pages within 1-1 p2m mappings
      xen: use generic functions instead of xen_{alloc, free}_vm_area()
      block: xen-blkback: use API provided by xenbus module to map rings
      net: xen-netback: use API provided by xenbus module to map rings
      xen: map foreign pages for shared rings by updating the PTEs directly

Jan Beulich (5):
      xen/pci: make bus notifier handler return sane values
      xen/pciback: use mutex rather than spinlock in passthrough backend
      xen/pciback: miscellaneous adjustments
      xen/pci: support multi-segment systems
      xen-blkback: use kzalloc() in favor of kmalloc()+memset()

Jeremy Fitzhardinge (2):
      xen: add dom0_op hypercall
      xen/dom0: set wallclock time in Xen

Joe Jin (1):
      xen-blkback: fixed indentation and comments

Konrad Rzeszutek Wilk (24):
      Revert "xen/debug: WARN_ON when identity PFN has no _PAGE_IOMAP flag set."
      xen-pcifront: Update warning comment to use 'e820_host' option.
      xen-swiotlb: Retry up three times to allocate Xen-SWIOTLB
      xen-swiotlb: Fix wrong panic.
      xen-swiotlb: When doing coherent alloc/dealloc check before swizzling the MFNs.
      xen/pciback: Use mutexes when working with Xenbus state transitions.
      xen/pciback: use mutex rather than spinlock in vpci backend
      xen/p2m: Make debug/xen/mmu/p2m visible again.
      xen/p2m: Use SetPagePrivate and its friends for M2P overrides.
      x86/paravirt: Partially revert "remove lazy mode in interrupts"
      xen/pv-on-hvm:kexec: Fix implicit declaration of function 'xen_hvm_domain'
      xen/pciback: Do not dereference psdev during printk when it is NULL.
      xen-blkfront: If no barrier or flush is supported, use invalid operation.
      xen/blkback: Support 'feature-barrier' aka old-style BARRIER requests.
      xen/blkback: Report VBD_WSECT (wr_sect) properly.
      xen/blkback: Fix the inhibition to map pages when discarding sector ranges.
      xen/pciback: Check if the device is found instead of blindly assuming so.
      xen/events: BUG() when we can't allocate our event->irq array.
      xen/events: Don't check the info for NULL as it is already done.
      xen/irq: If we fail during msi_capability_init return proper error code.
      xen/xenbus: Remove the unnecessary check.
      xen/enlighten: Fix compile warnings and set cx to known value.
      xen/p2m/debugfs: Fix potential pointer exception.
      xen/p2m/debugfs: Make type_name more obvious.

Laszlo Ersek (1):
      xen-blkfront: plug device number leak in xlblk_init() error path

Li Dongyang (4):
      xen-blkfront: add BLKIF_OP_DISCARD and discard request struct
      xen-blkback: Implement discard requests ('feature-discard')
      xen-blkfront: Handle discard requests.
      xen-blkfront: fix a deadlock while handling discard response

Olaf Hering (6):
      xen: use static initializers in xen-balloon.c
      xen/pv-on-hvm kexec: prevent crash in xenwatch_thread() when stale watch events arrive
      xen/pv-on-hvm kexec: rebind virqs to existing eventchannel ports
      xen/pv-on-hvm kexec+kdump: reset PV devices in kexec or crash kernel
      xen/pv-on-hvm kexec: update xs_wire.h:xsd_sockmsg_type from xen-unstable
      xen/pv-on-hvm kexec: add xs_reset_watches to shutdown watches from old kernel

Randy Dunlap (1):
      xen-swiotlb: fix printk and panic args

Ruslan Pisarev (6):
      Xen: fix whitespaces,tabs coding style issue in drivers/xen/balloon.c
      Xen: fix whitespaces,tabs coding style issue in drivers/xen/events.c
      Xen: fix braces coding style issue in gntdev.c and grant-table.c
      Xen: fix whitespaces,tabs coding style issue in drivers/xen/pci.c
      Xen: fix braces coding style issue in xenbus_probe.h
      Xen: fix braces and tabs coding style issue in xenbus_probe.c

Stefano Stabellini (4):
      xen: add an "highmem" parameter to alloc_xenballooned_pages
      xen: modify kernel mappings corresponding to granted pages
      xen: XEN_PVHVM depends on PCI
      xen: remove XEN_PLATFORM_PCI config option

Thomas Meyer (1):
      xen/pciback: use resource_size()

Yu Ke (1):
      xen/acpi: Domain0 acpi parser related platform hypercall


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 12:22:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 12:22:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQqy-0004NR-KQ; Thu, 13 Oct 2011 12:22:04 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REQqD-0004AT-Tx; Thu, 13 Oct 2011 12:21:18 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318533673!928123!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14394 invoked from network); 13 Oct 2011 19:21:14 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-7.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 19:21:14 -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
	p9DJLABT001387
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 13 Oct 2011 19:21:11 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
	p9DJL9Km029920
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 19:21:09 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
	p9DJL4Av006466; Thu, 13 Oct 2011 14:21:04 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 12:21:04 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id BF6F93F7; Thu, 13 Oct 2011 15:20:59 -0400 (EDT)
Date: Thu, 13 Oct 2011 15:20:59 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, xen-users@lists.xensource.com
Message-ID: <20111013192059.GB16336@phenom.oracle.com>
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: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090203.4E973A28.0048:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: 
Subject: [Xen-devel] Features and bug fixes that went in Linux 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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hey,

3.1 is going to be released shortly, I hope. The 3.1 release saw:

 - Xen-pciback module included in.
 - Support for udev to autoload Xen backend modules.
 - Blkback decreasing latency on I/Os.
 - VGA dom0 text support (which also went in 3.0.4)
 - Frontswap support and self-ballooning (for tmem)
 - Replacing Xen debugfs with a general tracing facility
 - PVonHVM saw PV keyboard driver being enabled and PV spinlocks
   disabled (enabling it introduced a serious bug that will be fixed
   in 3.3)
 - Fixing some nasty bugs that existed since 2.6.27 and 2.6.37!
 - Bug-fixes!

The full credit list is as follow:


Andy Lutomirski (2):
      x86-64, xen: Enable the vvar mapping
      x86-64: Add user_64bit_mode paravirt op

Bastian Blank (4):
      xen: Populate xenbus device attributes
      xen: Add module alias to autoload backend drivers
      xen/blkback: Add module alias for autoloading
      xen/netback: Add module alias for autoloading

Clemens Ladisch (1):
      mm: fix wrong vmap address calculations with odd NR_CPUS values

Dan Magenheimer (2):
      xen: prepare tmem shim to handle frontswap
      xen: tmem: self-ballooning and frontswap-selfshrinking

Daniel Kiper (2):
      mm: extend memory hotplug API to allow memory hotplug in virtual machines
      xen/balloon: memory hotplug support for Xen balloon driver

Daniel Stodden (1):
      xen/blkback: Don't let in-flight requests defer pending ones.

David Vrabel (3):
      xen: use maximum reservation to limit amount of usable RAM
      xen/e820: if there is no dom0_mem=, don't tweak extra_pages.
      mm: sync vmalloc address space page tables in alloc_vm_area()

Huang Weiyi (2):
      xen/pciback: remove duplicated #include
      xen/pciback: remove duplicated #include

Ian Campbell (1):
      xen: rename pciback module to xen-pciback.

Igor Mammedov (3):
      xen: Fix printk() format in xen/setup.c
      xen: Fix misleading WARN message at xen_release_chunk
      xen: x86_32: do not enable iterrupts when returning from exception in interrupt context


Jan Beulich (2):
      xen/x86: replace order-based range checking of M2P table by linear one
      xen/i386: follow-up to "replace order-based range checking of M2P table by linear one"

Jeremy Fitzhardinge (22):
      xen: allow enable use of VGA console on dom0
      trace/xen: add skeleton for Xen trace events
      xen/multicalls: remove debugfs stats
      xen/trace: set up tracepoint skeleton
      xen/trace: add multicall tracing
      xen/trace: add mmu tracepoints
      xen/trace: add ptpage alloc/release tracepoints
      xen/trace: add xen_pgd_(un)pin tracepoints
      xen/trace: add segment desc tracing
      xen/trace: add tlb flush tracepoints
      xen/mmu: use extend_args for more mmuext updates
      xen/mmu: tune pgtable alloc/release
      xen/multicalls: disable MC_DEBUG
      xen/multicalls: add unlikely around slowpath in __xen_mc_entry()
      xen/multicall: special-case singleton hypercalls
      xen/multicall: move *idx fields to start of mc_buffer
      xen/trace: convert mmu events to use DECLARE_EVENT_CLASS()/DEFINE_EVENT()
      xen/trace: use class for multicall trace
      xen/tracing: fix compile errors when tracing is disabled.
      xen/tracing: it looks like we wanted CONFIG_FTRACE
      xen/tracing: Fix tracing config option properly
      xen: use non-tracing preempt in xen_clocksource_read()

Joe Jin (2):
      xen-blkback: Don't disconnect backend until state switched to XenbusStateClosed.
      xen-blkback: fixed indentation and comments

Joe Perches (1):
      xen: Add __attribute__((format(printf... where appropriate

Konrad Rzeszutek Wilk (31):
      ttm: Fix spelling mistakes and remove unused #ifdef
      xen/pci: Shuffle code around.
      xen/pci: Update comments and fix empty spaces.
      xen/pci: Provide #ifdef CONFIG_ACPI to easy code squashing.
      xen/pci: In xen_register_pirq bind the GSI to the IRQ after the hypercall.
      xen/pci: Use the xen_register_pirq for HVM and initial domain users
      xen/pci: Squash pci_xen_initial_domain and xen_setup_pirqs together.
      xen/pci: Move the allocation of IRQs when there are no IOAPIC's to the end
      xen/pci: Retire unnecessary #ifdef CONFIG_ACPI
      xen/pci: Remove 'xen_allocate_pirq_gsi'.
      xen/pci: Use 'acpi_gsi_to_irq' value unconditionally.
      xen/pciback: xen pci backend driver.
      xen/pciback: Cleanup the driver based on checkpatch warnings and errors.
      xen/pciback: Register the owner (domain) of the PCI device.
      xen/pciback: Disable MSI/MSI-X when reseting a device
      xen/pciback: Allocate IRQ handler for device that is shared with guest.
      xen/pciback: Fine-grain the spinlocks and fix BUG: scheduling while atomic cases.
      xen/pciback: Don't setup an fake IRQ handler for SR-IOV devices.
      xen/pciback: Print out the MSI/MSI-X (PIRQ) values
      xen/pciback: Drop two backends, squash and cleanup some code.
      xen/pciback: Remove the DEBUG option.
      xen/pciback: Have 'passthrough' option instead of XEN_PCIDEV_BACKEND_PASS and XEN_PCIDEV_BACKEND_VPCI
      xen/grant: Fix compile warning.
      xen/balloon: Fix compile errors - missing header files.
      xen/grant: Fix compile warning.
      xen/balloon: Fix compile errors - missing header files.
      xen/self-balloon: Add dependency on tmem.
      xen/trace: Fix compile error when CONFIG_XEN_PRIVILEGED_GUEST is not set
      xen/blkback: Make description more obvious.
      xen/smp: Warn user why they keel over - nosmp or noapic and what to use instead.
      xen/irq: Alter the locking to use a mutex instead of a spinlock.

Len Brown (1):
      cpuidle: replace xen access to x86 pm_idle and default_idle

Raghavendra D Prabhu (1):
      xen:pvhvm: Modpost section mismatch fix

Randy Dunlap (2):
      xen: xen-selfballoon.c needs more header files
      xen: self-balloon needs module.h


Stefan Bader (2):
      xen-blkfront: Drop name and minor adjustments for emulated scsi devices
      xen-blkfront: Fix one off warning about name clash

Stefano Stabellini (3):
      Input: xen-kbdfront - enable driver for HVM guests
      xen: Do not enable PV IPIs when vector callback not present
      xen: disable PV spinlocks on HVM

Zhao, Yu (1):
      xen/pciback: guest SR-IOV support for PV guest


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 12:33:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 12:33:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RER1o-0005bz-B0; Thu, 13 Oct 2011 12:33:16 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RER1F-0005PB-Jf; Thu, 13 Oct 2011 12:32:41 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318534357!931583!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5949 invoked from network); 13 Oct 2011 19:32:38 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-10.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 19:32:38 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9DJWYEH015114
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Thu, 13 Oct 2011 19:32:36 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9DJWXJk002186
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 19:32:34 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
	p9DJWSgY006739; Thu, 13 Oct 2011 14:32:28 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 12:32:28 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 0E7751EA; Thu, 13 Oct 2011 15:32:15 -0400 (EDT)
Date: Thu, 13 Oct 2011 15:32:15 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, xen-users@lists.xensource.com
Message-ID: <20111013193214.GC16336@phenom.oracle.com>
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: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090207.4E973CD4.016D,ss=1,re=0.000,fgs=0
Cc: 
Subject: [Xen-devel] Features for Linux kernel 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


This is what is being currently developed and reviewed. Some of it
might be done before 3.2 merge windows opens so it could become part
of 3.2:

 - PV spinlocks. Jeremy has been tirelessly working on this and every time
   it looks like it is ready somebody comes out and points out a bug
   in generic code that impacts his work. So this has mushroomed to now
   include jump_label support (for tracing), compare and exchange atomic
   operations (for everything), and then the PV spinlocks patches.

 - ACPI S3 support. The code is going through a review and we need
   some eyes from the ACPI folks to make sure nothing is wrong.

 - Graphic support for radeon/nouveau for 32-bit cards (enterprise type).
   Also known as "TTM DMA pool" code.

 - Blkback/blkfront features. Expanding the blkback to do amazing things.
   Like make the code easier to read, expanding the discard support to support
   REQ_DISCARD_SECURE and also do multipage rings (to allow more I/Os).

 - microcode update. Well, this one is complex. The x86 maintainers
   want to re-write how it is done, so the Xen microcode is shelved for
   right now until that is complete.

 - cleancache. This is the last piece of tmem - it allows the swap disk
   to use the temporary memory pool that tmem provides to make the guest
   run even faster.

 - Xen ACPI cpufreq patches. They are not yet ready to be posted, but they
   are slowly taking shape.

If I missed somebody's current work, please point me out to it.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 12:52:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 12:52:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RERKF-0008Px-Lh; Thu, 13 Oct 2011 12:52:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RERJo-0008DG-Rc
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 12:51:53 -0700
X-Env-Sender: K.Brink@cs.ru.nl
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318535509!926240!1
X-Originating-IP: [131.174.16.143]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31609 invoked from network); 13 Oct 2011 19:51:49 -0000
Received: from smeltpunt.science.ru.nl (HELO smeltpunt.science.ru.nl)
	(131.174.16.143)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 19:51:49 -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 p9DJpm0r014300; 
	Thu, 13 Oct 2011 21:51:48 +0200 (MEST)
Date: Thu, 13 Oct 2011 21:51:48 +0200
From: Kasper Brink <K.Brink@cs.ru.nl>
To: Michael Li <Qin.L.Li@oracle.com>
Subject: Re: [Xen-devel] pv-grub Solaris support
Message-ID: <20111013195148.GA5974@lilo2.science.ru.nl>
References: <20111012204011.GA7518@lilo2.science.ru.nl>
	<4E9697EB.4000204@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9697EB.4000204@oracle.com>
User-Agent: Mutt/1.5.20 (2009-06-14)
X-Spam-Score: -1.497 () ALL_TRUSTED,AWL,BAYES_50
X-Scanned-By: MIMEDefang 2.63 on 131.174.16.143
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

Hello Michael,

On Thu, Oct 13, 2011 at 03:48:59PM +0800, Michael Li wrote:
> Thank you! How can I test your utility in OVM3.0.2 platorm, I have
> Solaris latest  running as Guest OS, would like you activate the PV
> domU with your tool.

I haven't used Oracle VM myself, but hopefully the hypervisor is sufficiently
similar to vanilla Xen 4.0 that the instructions below will work.


=== Building pv-grub ===

To build a patched pv-grub, you'll need a Linux system with developer tools
installed; I used Debian Squeeze, but another distribution should be fine.
You should build pv-grub on the same arch (i386 or amd64) as the domU you
intend to run. Steps:

hg clone http://xenbits.xen.org/hg/xen-unstable.hg/
patch -p1 -d xen-unstable.hg < pv-grub_solaris.patch
cd xen-unstable.hg
# I also needed the following symlink:
ln -s . xen/include/xen/libelf
make -C stubdom pv-grub
# if the build succeeds, pv-grub will be in stubdom/mini-os-$ARCH-grub, e.g.:
cp stubdom/mini-os-x86_64-grub/mini-os.gz ../pv-grub.patched.gz


=== Converting an existing HVM domU to PV ===

There was a thread on xen-discuss about converting a HVM domU to PV:
  http://mail.opensolaris.org/pipermail/xen-discuss/2010-February/005768.html
The post above uses pygrub; with a patched pv-grub the process is similar.

The tricky part is that the root pool of the domU holds information about
the physical device paths of its vdevs, which is no longer correct when we
switch to a PV domain. This causes the domU kernel to panic when it tries
to mount the root pool. To prevent this, you must first boot the PV domain
from a Solaris installation cd (iso image), and import and export the root
pool: this writes the correct device paths to the pool.

First, download a Solaris iso image that is at least as recent your root
pool version (e.g. Solaris 11 Express).

Edit the vm.cfg file of your domU: 
# remove "builder=..." and "device_model=..." parameters 
# modify "kernel", "disk" and "extra" as follows:
kernel = '/path/to/pv-grub.patched.gz'
disk   = [ 'file:/path/to/domU/System.img,xvda,w',
           'file:/path/to/domU/sol-11-exp-201011-text-x86.iso,xvdc:cdrom,r'
         ]
# (initially, boot from the iso)
extra  ='(hd1)/boot/grub/menu.lst'

Start the domain and attach the console. Depending on how quick you are,
you should see either a countdown timer, or a "Selected disk does not
exist" error. Press "Esc" to enter the menu. Now you must edit the default
menu entry to add a "root" command (I have a separate patch to pv-grub that
fixes this, but that's not really Solaris-related).
Select edit > new line before > edit > enter "root (hd1)" > boot.

The Solaris iso should now boot. Run the following in a shell (option 3 in
the SX11 text installer):

zpool import -f rpool
# verify that the import succeeded
zpool status
zpool export rpool
# verify that the export succeeded
zpool status 

At this point you can destroy the VM. Now edit the vm.cfg to read:
  extra='(hd0,0,a)/boot/grub/menu.lst'
and optionally remove the Solaris iso from the "disk" parameter.
Start the vm again, and if all went correctly, you should see the grub
menu, and be able to boot your PV domain into the boot environment of your
choice.


=== Creating a new PV domU ===

Just follow the steps above, but instead of opening a shell for the zpool
import & export step, choose "Install Solaris".


I hope this works for you. Success/failure reports are welcome!

Best,

Kasper

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 13:07:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 13:07:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RERZD-0001TV-Lq; Thu, 13 Oct 2011 13:07:47 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RERVr-0001Db-1c; Thu, 13 Oct 2011 13:04:29 -0700
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1318536254!937676!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27021 invoked from network); 13 Oct 2011 20:04:15 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-6.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 20:04:15 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9DK4Bdi020422
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Thu, 13 Oct 2011 20:04:13 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9DK4Bij019676
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 13 Oct 2011 20:04:11 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
	p9DK45W1003841; Thu, 13 Oct 2011 15:04:05 -0500
MIME-Version: 1.0
Message-ID: <85f0fea6-a4d3-4732-b238-d838b8c87b6a@default>
Date: Thu, 13 Oct 2011 13:04:03 -0700 (PDT)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: Konrad Wilk <konrad.wilk@oracle.com>, xen-devel@lists.xensource.com,
	xen-users@lists.xensource.com
Subject: RE: [Xen-devel] Features for Linux kernel 3.3.
References: <20111013193214.GC16336@phenom.oracle.com>
In-Reply-To: <20111013193214.GC16336@phenom.oracle.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: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090203.4E97443D.015F,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

> From: Konrad Rzeszutek Wilk
> Sent: Thursday, October 13, 2011 1:32 PM
> To: xen-devel@lists.xensource.com; xen-users@lists.xensource.com
> Subject: [Xen-devel] Features for Linux kernel 3.3.
>=20
>=20
> This is what is being currently developed and reviewed. Some of it
> might be done before 3.2 merge windows opens so it could become part
> of 3.2:
>=20
>  - PV spinlocks. Jeremy has been tirelessly working on this and every tim=
e
>    it looks like it is ready somebody comes out and points out a bug
>    in generic code that impacts his work. So this has mushroomed to now
>    include jump_label support (for tracing), compare and exchange atomic
>    operations (for everything), and then the PV spinlocks patches.
>=20
>  - ACPI S3 support. The code is going through a review and we need
>    some eyes from the ACPI folks to make sure nothing is wrong.
>=20
>  - Graphic support for radeon/nouveau for 32-bit cards (enterprise type).
>    Also known as "TTM DMA pool" code.
>=20
>  - Blkback/blkfront features. Expanding the blkback to do amazing things.
>    Like make the code easier to read, expanding the discard support to su=
pport
>    REQ_DISCARD_SECURE and also do multipage rings (to allow more I/Os).
>=20
>  - microcode update. Well, this one is complex. The x86 maintainers
>    want to re-write how it is done, so the Xen microcode is shelved for
>    right now until that is complete.
>=20
>  - cleancache. This is the last piece of tmem - it allows the swap disk
>    to use the temporary memory pool that tmem provides to make the guest
>    run even faster.

Correction.  *Frontswap* is the last piece of tmem.  (Cleancache went
in at 3.0.)
=20
>  - Xen ACPI cpufreq patches. They are not yet ready to be posted, but the=
y
>    are slowly taking shape.
>=20
> If I missed somebody's current work, please point me out to it.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 13:10:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 13:10:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RERcC-0002XQ-IG; Thu, 13 Oct 2011 13:10:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RERYV-0001LJ-FE
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 13:07:09 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318536392!52743068!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16149 invoked from network); 13 Oct 2011 20:06:32 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-7.tower-27.messagelabs.com with SMTP;
	13 Oct 2011 20:06:32 -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
	p9DK6uQ9025470; Thu, 13 Oct 2011 20:06:56 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 p9DK6uG0023459; 
	Thu, 13 Oct 2011 16:06:56 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 13 Oct 2011 16:07:08 -0400
Message-Id: <1318536428-29341-2-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1318536428-29341-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <20111013182426.GG15499@phenom.oracle.com>
	<1318536428-29341-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com,
	Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 2/2] xenbus: don't rely on xen_initial_domain to
	detect local xenstore
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 xenstore daemon does not have to run in the xen initial domain;
however, Linux currently uses xen_initial_domain to test if a loopback
event channel should be used instead of the event channel provided in
Xen's start_info structure. Instead, if the event channel passed in the
start_info structure is not valid, assume that this domain will run
xenstored locally and set up the event channel.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Reviewed-by: Ian Campbell <Ian.Campbell@citrix.com>
---
 drivers/xen/xenbus/xenbus_probe.c |  101 +++++++++++++++++++-----------------
 1 files changed, 53 insertions(+), 48 deletions(-)

diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
index 82bf38c..cef9b0b 100644
--- a/drivers/xen/xenbus/xenbus_probe.c
+++ b/drivers/xen/xenbus/xenbus_probe.c
@@ -684,64 +684,74 @@ static int __init xenbus_probe_initcall(void)
 
 device_initcall(xenbus_probe_initcall);
 
-static int __init xenbus_init(void)
+/* Set up event channel for xenstored which is run as a local process
+ * (this is normally used only in dom0)
+ */
+static int __init xenstored_local_init(void)
 {
 	int err = 0;
 	unsigned long page = 0;
+	struct evtchn_alloc_unbound alloc_unbound;
 
-	DPRINTK("");
+	/* Allocate Xenstore page */
+	page = get_zeroed_page(GFP_KERNEL);
+	if (!page)
+		goto out_err;
 
-	err = -ENODEV;
-	if (!xen_domain())
-		return err;
+	xen_store_mfn = xen_start_info->store_mfn =
+		pfn_to_mfn(virt_to_phys((void *)page) >>
+			   PAGE_SHIFT);
 
-	/*
-	 * Domain0 doesn't have a store_evtchn or store_mfn yet.
-	 */
-	if (xen_initial_domain()) {
-		struct evtchn_alloc_unbound alloc_unbound;
+	/* Next allocate a local port which xenstored can bind to */
+	alloc_unbound.dom        = DOMID_SELF;
+	alloc_unbound.remote_dom = DOMID_SELF;
 
-		/* Allocate Xenstore page */
-		page = get_zeroed_page(GFP_KERNEL);
-		if (!page)
-			goto out_error;
+	err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
+					  &alloc_unbound);
+	if (err == -ENOSYS)
+		goto out_err;
 
-		xen_store_mfn = xen_start_info->store_mfn =
-			pfn_to_mfn(virt_to_phys((void *)page) >>
-				   PAGE_SHIFT);
+	BUG_ON(err);
+	xen_store_evtchn = xen_start_info->store_evtchn =
+		alloc_unbound.port;
 
-		/* Next allocate a local port which xenstored can bind to */
-		alloc_unbound.dom        = DOMID_SELF;
-		alloc_unbound.remote_dom = DOMID_SELF;
+	return 0;
 
-		err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
-						  &alloc_unbound);
-		if (err == -ENOSYS)
-			goto out_error;
+ out_err:
+	if (page != 0)
+		free_page(page);
+	return err;
+}
 
-		BUG_ON(err);
-		xen_store_evtchn = xen_start_info->store_evtchn =
-			alloc_unbound.port;
+static int __init xenbus_init(void)
+{
+	int err = 0;
 
-		xen_store_interface = mfn_to_virt(xen_store_mfn);
+	if (!xen_domain())
+		return -ENODEV;
+
+	if (xen_hvm_domain()) {
+		uint64_t v = 0;
+		err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
+		if (err)
+			goto out_error;
+		xen_store_evtchn = (int)v;
+		err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v);
+		if (err)
+			goto out_error;
+		xen_store_mfn = (unsigned long)v;
+		xen_store_interface = ioremap(xen_store_mfn << PAGE_SHIFT, PAGE_SIZE);
 	} else {
-		if (xen_hvm_domain()) {
-			uint64_t v = 0;
-			err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
-			if (err)
-				goto out_error;
-			xen_store_evtchn = (int)v;
-			err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v);
+		xen_store_evtchn = xen_start_info->store_evtchn;
+		xen_store_mfn = xen_start_info->store_mfn;
+		if (xen_store_evtchn)
+			xenstored_ready = 1;
+		else {
+			err = xenstored_local_init();
 			if (err)
 				goto out_error;
-			xen_store_mfn = (unsigned long)v;
-			xen_store_interface = ioremap(xen_store_mfn << PAGE_SHIFT, PAGE_SIZE);
-		} else {
-			xen_store_evtchn = xen_start_info->store_evtchn;
-			xen_store_mfn = xen_start_info->store_mfn;
-			xen_store_interface = mfn_to_virt(xen_store_mfn);
-			xenstored_ready = 1;
 		}
+		xen_store_interface = mfn_to_virt(xen_store_mfn);
 	}
 
 	/* Initialize the interface to xenstore. */
@@ -760,12 +770,7 @@ static int __init xenbus_init(void)
 	proc_mkdir("xen", NULL);
 #endif
 
-	return 0;
-
-  out_error:
-	if (page != 0)
-		free_page(page);
-
+ out_error:
 	return err;
 }
 
-- 
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 Oct 13 13:11:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 13: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 1RERd3-0002v8-W2; Thu, 13 Oct 2011 13:11:46 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RERYV-0001LR-MQ
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 13:07:09 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-7.tower-182.messagelabs.com!1318536420!17207638!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3983 invoked from network); 13 Oct 2011 20:07:00 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-7.tower-182.messagelabs.com with SMTP;
	13 Oct 2011 20:07: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
	p9DK6uQ9025469; Thu, 13 Oct 2011 20:06:56 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 p9DK6uFx023459; 
	Thu, 13 Oct 2011 16:06:56 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 13 Oct 2011 16:07:07 -0400
Message-Id: <1318536428-29341-1-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <20111013182426.GG15499@phenom.oracle.com>
References: <20111013182426.GG15499@phenom.oracle.com>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com,
	Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH 1/2] xenbus: Fix loopback event channel assuming
	domain 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

The xenbus event channel established in xenbus_init is intended to be a
loopback channel, but the remote domain was hardcoded to 0; this will
cause the channel to be unusable when xenstore is not being run in
domain 0.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Reviewed-by: Ian Campbell <Ian.Campbell@citrix.com>
---
 drivers/xen/xenbus/xenbus_probe.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c
index bd2f90c..82bf38c 100644
--- a/drivers/xen/xenbus/xenbus_probe.c
+++ b/drivers/xen/xenbus/xenbus_probe.c
@@ -712,7 +712,7 @@ static int __init xenbus_init(void)
 
 		/* Next allocate a local port which xenstored can bind to */
 		alloc_unbound.dom        = DOMID_SELF;
-		alloc_unbound.remote_dom = 0;
+		alloc_unbound.remote_dom = DOMID_SELF;
 
 		err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
 						  &alloc_unbound);
-- 
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 Oct 13 13:12:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 13:12:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RERdq-0003JN-0S; Thu, 13 Oct 2011 13:12:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RERZ9-0001Rl-PA; Thu, 13 Oct 2011 13:07:44 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318536431!41818163!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18455 invoked from network); 13 Oct 2011 20:07:12 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 20:07:12 -0000
Received: by vcbfk13 with SMTP id fk13so528058vcb.30
	for <multiple recipients>; Thu, 13 Oct 2011 13:07:39 -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:content-type;
	bh=E2ry/z/UXmIyS/sNhe0JOawfsWrU/TV5MhOJYLRp+F4=;
	b=iy+ARDSBsBAEH7VGnQ2bHq3KBPPaz1Foba1yKgtLpJrxFgsmndpA2gN86PbpiLO0MS
	Y5Mg7WTLUPzKY6g7JMHSG9653ocTTRjmjMMUqg4twV1qNNlRil6mX4t6Mo/OggWkZbDm
	t4ST3lagIzFID0EOzYAp20RwbqPjG4zaOz7AA=
MIME-Version: 1.0
Received: by 10.52.96.161 with SMTP id dt1mr5561218vdb.124.1318536459349; Thu,
	13 Oct 2011 13:07:39 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Thu, 13 Oct 2011 13:07:39 -0700 (PDT)
In-Reply-To: <20111013193214.GC16336@phenom.oracle.com>
References: <20111013193214.GC16336@phenom.oracle.com>
Date: Thu, 13 Oct 2011 21:07:39 +0100
X-Google-Sender-Auth: l12E9k6GfueyaX14E4t6PjDbbF4
Message-ID: <CAE1-PRcg6m1o6hGyZvyTP5z5=RcSFja80-wF4uLbC5zZc+7wwA@mail.gmail.com>
Subject: Re: [Xen-devel] Features for Linux kernel 3.3.
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel@lists.xensource.com, xen-users@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
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 13 October 2011 20:32, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:

> This is what is being currently developed and reviewed. Some of it
> might be done before 3.2 merge windows opens so it could become part
> of 3.2:

Thanks, it's useful to see these summaries ... and worthwhile for
members of both lists I hope.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 13:23:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 13:23:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RERoH-0004bt-JV; Thu, 13 Oct 2011 13:23:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RERnf-0004Oe-8z
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 13:22:43 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318537358!935443!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20023 invoked from network); 13 Oct 2011 20:22:39 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 20:22:39 -0000
Received: by vws13 with SMTP id 13so618299vws.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 13:22:38 -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:content-type;
	bh=iwvqbOn2OCKFDYs1VDAfqso9AubVHcgNlOg7fttEMW4=;
	b=P2xeaI0IQOVlYkcc9YRQ5O1rCsbihb+v4OJAfi5Sm64U/zdsnJceKBJZ0QU8ACYqOz
	dQZOuWzKj7d7vfpElLTkjvpP1ao41xOb0oWFBENQxnJPhKYirsluWU8L/YjZ1piNJC0V
	KGOVTDoPxjKuNfIXbVVdvGDrM0JNi3WD3mmQw=
MIME-Version: 1.0
Received: by 10.52.96.161 with SMTP id dt1mr5617497vdb.124.1318537358514; Thu,
	13 Oct 2011 13:22:38 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Thu, 13 Oct 2011 13:22:38 -0700 (PDT)
In-Reply-To: <20111013181543.GF15499@phenom.oracle.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
Date: Thu, 13 Oct 2011 21:22:38 +0100
X-Google-Sender-Auth: w-q9COqBfaAwjK208GxYdXoLSzw
Message-ID: <CAE1-PRdCXM+ZDeT6-D3Q-vLidpaRodLQdnUCUkCkMhJvHita-w@mail.gmail.com>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-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

Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:

> Andy Burns wrote:
>
>> Is the fact that the PCI cards fail in dom0 under Xen a hint?
>
> That is. That would imply it is not the PCI passthrough code (good!).
> It is something related to the driver (as I presume your network card
> works in that box).

Yes, two onboard sky2 gigabit ports and a supermicro 64bit PCI-X JBOD
card with 8 SATA disks

> Perhaps it is the VM_IO bug that sometimes creeps
> up.. Can you give me the lsmod output please? I want to see which
> drivers are loaded for this TV card and I can dig a bit in the
> driver to see if there is something fishy.

Here is an lsmod (from within the domU, but the same modules get used
if it's in dom0 and same kernel 3.1.0-rc9 everywhere now.

Module                  Size  Used by
ds3000                 12827  2
dvb_usb_dw2102         41753  27
dvb_usb                14988  1 dvb_usb_dw2102
lockd                  70080  0
ip6t_REJECT             3992  2
nf_conntrack_ipv6       7730  2
nf_defrag_ipv6          9083  1 nf_conntrack_ipv6
xt_state                1306  2
nf_conntrack           67597  2 nf_conntrack_ipv6,xt_state
ip6table_filter         1655  1
ip6_tables             16792  1 ip6table_filter
tda1004x               14722  2
saa7134_dvb            27032  12
videobuf_dvb            5146  1 saa7134_dvb
dvb_core               87211  2 dvb_usb,videobuf_dvb
firewire_ohci          26101  0
ir_lirc_codec           4214  0
lirc_dev               12904  1 ir_lirc_codec
firewire_core          49303  1 firewire_ohci
ir_mce_kbd_decoder      4208  0
ir_sony_decoder         2109  0
ir_jvc_decoder          2218  0
ir_rc6_decoder          2682  0
ir_rc5_decoder          2138  0
rc_videomate_tv_pvr     1289  0
ir_nec_decoder          2570  0
saa7134               159679  1 saa7134_dvb
crc_itu_t               1547  1 firewire_core
rc_core                17136  12
dvb_usb,ir_lirc_codec,ir_mce_kbd_decoder,ir_sony_decoder,ir_jvc_decoder,ir_rc6_decoder,ir_rc5_decoder,rc_videomate_tv_pvr,ir_nec_decoder,saa7134
videobuf_dma_sg         8462  2 saa7134_dvb,saa7134
videobuf_core          15780  3 videobuf_dvb,saa7134,videobuf_dma_sg
v4l2_common             6905  1 saa7134
videodev               78689  2 saa7134,v4l2_common
media                  11511  1 videodev
v4l2_compat_ioctl32     7665  1 videodev
tveeprom               13045  1 saa7134
i2c_core               25728  9
ds3000,dvb_usb_dw2102,dvb_usb,tda1004x,saa7134_dvb,saa7134,v4l2_common,videodev,tveeprom
sunrpc                200831  2 lockd
xen_pcifront           12182  0
xen_netfront           16358  0
xen_blkfront           12741  4

Specifically the tuner drivers are

ds3000  and  dvb_usb_dw2102  for the DVB-S2 PCIe that works

tveeprom,  saa7134,  saa7134_dvb   and  tda1004x  for the troublesome
DVB-T PCI cards

> I saw something about I2C, is there a knob in the driver to _not_
> use I2C?

I can certainly live without all the LIRC stuff by blacklisting all
the ir_xxx_decoder stuff, I'll check modinfo of the drivers to see
what options exist.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 13:30:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 13:30:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RERv7-0005mR-K0; Thu, 13 Oct 2011 13:30:25 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RERtM-0005DL-M2
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 13:28:37 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318537599!40244793!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3747 invoked from network); 13 Oct 2011 20:26:40 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 20:26:40 -0000
Received: by vws13 with SMTP id 13so624396vws.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 13:28:32 -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=rZs9dT40gSYZryO63y5AC/Gy8nTX9AgI2bevy1XRxiY=;
	b=f1ycdwAV89q68EWl9tIOM7Q445KiTyvfDLnF2UTjo9AwPSmnAhqNsfM0cf8JbKxM7N
	suRj7pU/MzPRrtx9V/XZ1kQy3g//tKw5AX9OEeH6Wh9Hf7DJhtLcvayAjycH5TMB7VTe
	1QZ+11NgYZf7xZLfonzr2SEEsnTdmANnCQ3UY=
MIME-Version: 1.0
Received: by 10.52.92.132 with SMTP id cm4mr5784861vdb.5.1318537712445; Thu,
	13 Oct 2011 13:28:32 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Thu, 13 Oct 2011 13:28:32 -0700 (PDT)
In-Reply-To: <20111013181543.GF15499@phenom.oracle.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
Date: Thu, 13 Oct 2011 21:28:32 +0100
X-Google-Sender-Auth: 37ebE1qbL1mquK7cBOkU-b62XRs
Message-ID: <CAE1-PRekj_LifVEOS=ZsDYc0ZOi=j9K4B5U0LJpKDtHP6h_-OA@mail.gmail.com>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Andy Burns <xen.lists@burns.me.uk>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1
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

Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:

> would imply it is not the PCI passthrough code (good!).
> It is something related to the driver
> Perhaps it is the VM_IO bug that sometimes creeps
> up..

I can try *NOT* using pci=resource_realignment=(blah), but I always
had to do that (or rather the old reassigndev equivalent) under
xenified 2.6.18 kernels as the BARs of the PCI cards were smaller than
the page size and I think the drivers for the two instances of the
DVB-T card used to trample all over each other without it.

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 14:11:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 14:11:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RESZB-00074K-GM; Thu, 13 Oct 2011 14:11:49 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RESY0-0006qw-30
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 14:10:36 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318540231!35224600!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25959 invoked from network); 13 Oct 2011 21:10:32 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	13 Oct 2011 21:10:32 -0000
Received: by vcbfk13 with SMTP id fk13so596001vcb.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 14:10:31 -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=xial9RLsPXvJ014jBFdxN1gkdzJH3llPHq618RyMKuw=;
	b=Xw0RqyMoIttiGQ5DHJ9lmZJYRkc3Fq5td6qdknwgMDwTMeUu4DorObAdVnfVXYDH8/
	zKCoN/dwT1L3ufFwFqScc0zEfBf8zgyofctXBAdmzOdYSuOFxIVcPbEtEtcdZNlyX9my
	Az+XlXBEclZw8iBSJPjO7rT5wLDA7887NsJLY=
MIME-Version: 1.0
Received: by 10.52.96.161 with SMTP id dt1mr5799204vdb.124.1318540231418; Thu,
	13 Oct 2011 14:10:31 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Thu, 13 Oct 2011 14:10:31 -0700 (PDT)
In-Reply-To: <20111010163129.GF28646@phenom.oracle.com>
References: <CAE1-PRdq9BWjTTHPPBPvESr-ULcdjHgPMTABcCO6+wCLJ1UYog@mail.gmail.com>
	<CAE1-PReA8E-kSif=BU=s-vzOqi-4F4LotxqofH7EEw+dYLtpUA@mail.gmail.com>
	<20111010163129.GF28646@phenom.oracle.com>
Date: Thu, 13 Oct 2011 22:10:31 +0100
X-Google-Sender-Auth: _lUow33opt9d9gyflZGX87_3hn8
Message-ID: <CAE1-PReC7R0VkGErsaVf5OoPrQbXh03fH+kE3e6s8b6EEqL4gw@mail.gmail.com>
Subject: Re: [Xen-devel] Fwd: xentop reporting zero written sectors
From: Andy Burns <xen.lists@burns.me.uk>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
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 10 October 2011 17:31, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wr=
ote:

> I think this new "feature" below will fix it for you:
>
> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkb=
ack/blkback.c
> index 0bd7143..3e2ca68 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -778,7 +778,7 @@ static int dispatch_rw_block_io(struct xen_blkif *blk=
if,
>
> =A0 =A0 =A0 =A0if (operation =3D=3D READ)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0blkif->st_rd_sect +=3D preq.nr_sects;
> - =A0 =A0 =A0 else if (operation =3D=3D WRITE || operation =3D=3D WRITE_F=
LUSH)
> + =A0 =A0 =A0 else if (operation =3D=3D WRITE_ODIRECT || operation =3D=3D=
 WRITE_FLUSH)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0blkif->st_wr_sect +=3D preq.nr_sects;
>
> =A0 =A0 =A0 =A0return 0;

What kernel version is that patch based on?  It won't apply on top of
3.1.0-rc9 for me, but looks like the starting line number is 685
rather than 778 in Fedora's source ... but even by tweaking it I can't
get rpmbuild to apply the patch :-(

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 16:50:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 16:50:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REV2R-0002mK-V0; Thu, 13 Oct 2011 16:50:11 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REV1K-0002Yp-If
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 16:49:03 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-12.tower-21.messagelabs.com!1318549737!22456!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16255 invoked from network); 13 Oct 2011 23:48:59 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-12.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	13 Oct 2011 23:48: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
	p9DNmpEQ005407; Thu, 13 Oct 2011 16:48:51 -0700
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id p9DNmpbl005404;
	Thu, 13 Oct 2011 16:48:51 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Thu, 13 Oct 2011 16:47:51 -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 3 V3] 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.

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. A revised compression stream format 
2. Changed the xc_remus_* interface to a generic xc_compression_* format
3. Fixed issues like unaligned access, missing bounds check, etc
4. General code cleanups.


Shriram


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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 16:51:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 16:51:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REV3S-00039u-En; Thu, 13 Oct 2011 16:51:14 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REV1K-0002Yo-7f
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 16:49:03 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318549737!22237501!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28564 invoked from network); 13 Oct 2011 23:48:58 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-4.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 23:48:58 -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
	p9DNmpqM005428; Thu, 13 Oct 2011 16:48:51 -0700
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id p9DNmpuB005425;
	Thu, 13 Oct 2011 16:48:51 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 37fa1bdbecacd8fefcc382183ad25fd6c76300c3
Message-Id: <37fa1bdbecacd8fefcc3.1318549674@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
References: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Thu, 13 Oct 2011 16:47:54 -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 3 of 3 V3] tools/libxc: Document checkpoint
	compression in xg_save_restore.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

# HG changeset patch
# User Shriram Rajagopalan <rshriram@cs.ubc.ca>
# Date 1318545418 25200
# Node ID 37fa1bdbecacd8fefcc382183ad25fd6c76300c3
# Parent  32c4d844813aa22ca05df0b855857a607ac4c056
tools/libxc: Document checkpoint compression in xg_save_restore.h

Add comments to xg_save_restore.h explaining changes in Remus
wire protocol when checkpoint compression is enabled.

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>

diff -r 32c4d844813a -r 37fa1bdbecac tools/libxc/xg_save_restore.h
--- a/tools/libxc/xg_save_restore.h	Thu Oct 13 15:36:55 2011 -0700
+++ b/tools/libxc/xg_save_restore.h	Thu Oct 13 15:36:58 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
  * ----------
  *

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

From xen-devel-bounces@lists.xensource.com Thu Oct 13 16:52:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 16:52:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REV4u-0003hZ-1h; Thu, 13 Oct 2011 16:52:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REV1K-0002Yq-Sf
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 16:49:05 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-15.tower-27.messagelabs.com!1318549726!50943350!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19282 invoked from network); 13 Oct 2011 23:48:48 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-15.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 23:48:48 -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
	p9DNmpjS005414; Thu, 13 Oct 2011 16:48:51 -0700
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id p9DNmpqS005411;
	Thu, 13 Oct 2011 16:48:51 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 47fdd52af616131142ac5faeacd83f40786da59a
Message-Id: <47fdd52af616131142ac.1318549672@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
References: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Thu, 13 Oct 2011 16:47:52 -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 3 V3] 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 1318545413 25200
# Node ID 47fdd52af616131142ac5faeacd83f40786da59a
# 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 47fdd52af616 tools/libxc/Makefile
--- a/tools/libxc/Makefile	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/Makefile	Thu Oct 13 15:36:53 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 47fdd52af616 tools/libxc/xc_compression.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xc_compression.c	Thu Oct 13 15:36:53 2011 -0700
@@ -0,0 +1,545 @@
+/******************************************************************************
+ * 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 */
+    uint8_t *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 ((uint8_t)128)
+#define FLAGMASK SKIPFLAG
+#define LENMASK ((uint8_t)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)
+{
+    uint8_t *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)
+{
+    uint8_t *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;
+
+    uint8_t 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
+int uncompress_page(xc_interface *xch, char *destpage,
+                    unsigned long *compbuf_pos, uint8_t *compbuf,
+                    unsigned long compbuf_size)
+{
+    uint8_t *src;
+    int pagepos = 0;
+    uint8_t flag, len;
+
+    unsigned long 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;
+    }
+
+    src = (compbuf + pos);
+    if (src[0] == EMPTY_PAGE)
+    {
+        pos++;
+    }
+    else if (src[0] == FULL_PAGE)
+    {
+        pos += FULL_PAGE_SIZE;
+
+        /* Make sure that the input buffer actually has a full 4K page */
+        if (pos > 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, &src[1], XC_PAGE_SIZE);
+    }
+    else
+    {
+        while (pagepos < XC_PAGE_SIZE)
+        {
+            if ((pos + 1) > compbuf_size)
+            {
+                ERROR("Out of bounds exception in compression buffer (c):"
+                      "read ptr %lu, bufsize = %lu\n",
+                      pos, compbuf_size);
+                return -1;
+            }
+
+            flag = *src & FLAGMASK;
+            len = *src & LENMASK;
+            pos++;
+            src++;
+
+            if (flag == RUNFLAG)
+            {
+                if ((pos + len * sizeof(uint32_t)) > compbuf_size)
+                {
+                    ERROR("Out of bounds exception in compression buffer (d):"
+                          "read ptr %lu, runlen = %u, bufsize = %lu\n",
+                          pos, len * sizeof(uint32_t), compbuf_size);
+                    return -1;
+                }
+
+                memcpy(&destpage[pagepos], src, len * sizeof(uint32_t));
+                pos += len * sizeof(uint32_t);
+                src += len * sizeof(uint32_t);
+            }
+            pagepos += len * sizeof(uint32_t);
+        }
+    }
+
+    *compbuf_pos = pos;
+    return 0;
+}
+
+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 = (uint8_t *)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 *dest)
+{
+    return uncompress_page(xch, dest, compbuf_pos,
+                           (uint8_t *)compbuf, compbuf_size);
+}
+
+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));
+
+    if (posix_memalign((void **)&ctx->inputbuf,
+                       XC_PAGE_SIZE, PAGE_BUFFER_SIZE))
+    {
+        ERROR("Failed to allocate page buffer\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));
+
+    if (posix_memalign((void **)&ctx->cache_base,
+                       XC_PAGE_SIZE, DELTA_CACHE_SIZE))
+    {
+        ERROR("Failed to allocate delta cache\n");
+        goto error;
+    }
+
+    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 47fdd52af616 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 Oct 13 15:36:53 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 47fdd52af616 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 Oct 13 15:36:53 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,19 @@
 
     unsigned long mfn;
 
-    struct outbuf ob;
+    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 +887,7 @@
         return 1;
     }
 
-    outbuf_init(xch, &ob, OUTBUF_SIZE);
+    outbuf_init(xch, &ob_pagebuf, OUTBUF_SIZE);
 
     memset(ctx, 0, sizeof(*ctx));
 
@@ -917,6 +975,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 +1093,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 +1340,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 +1375,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 +1419,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 +1554,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 +1662,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 +1925,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;
+        }
+        /* Copy the tailbuf data into 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 +1998,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 47fdd52af616 tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/xenctrl.h	Thu Oct 13 15:36:53 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 47fdd52af616 tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/xenguest.h	Thu Oct 13 15:36:53 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 47fdd52af616 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 Oct 13 15:36:53 2011 -0700
@@ -134,6 +134,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 Oct 13 16:53:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 16:53:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REV5v-00045u-0b; Thu, 13 Oct 2011 16:53:47 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REV1L-0002Ys-DH
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 16:49:05 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-14.tower-174.messagelabs.com!1318549737!35190625!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8351 invoked from network); 13 Oct 2011 23:48:59 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-14.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 13 Oct 2011 23:48: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
	p9DNmpYd005421; Thu, 13 Oct 2011 16:48:51 -0700
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id p9DNmp8U005418;
	Thu, 13 Oct 2011 16:48:51 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 32c4d844813aa22ca05df0b855857a607ac4c056
Message-Id: <32c4d844813aa22ca05d.1318549673@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
References: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Thu, 13 Oct 2011 16:47:53 -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 3 V3] remus: command line switche 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 1318545415 25200
# Node ID 32c4d844813aa22ca05df0b855857a607ac4c056
# Parent  47fdd52af616131142ac5faeacd83f40786da59a
remus: command line switche 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 47fdd52af616 -r 32c4d844813a tools/python/xen/lowlevel/checkpoint/checkpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Thu Oct 13 15:36:53 2011 -0700
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Thu Oct 13 15:36:55 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 47fdd52af616 -r 32c4d844813a tools/python/xen/lowlevel/checkpoint/checkpoint.h
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Thu Oct 13 15:36:53 2011 -0700
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Thu Oct 13 15:36:55 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 47fdd52af616 -r 32c4d844813a tools/python/xen/lowlevel/checkpoint/libcheckpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Thu Oct 13 15:36:53 2011 -0700
+++ b/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Thu Oct 13 15:36:55 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 47fdd52af616 -r 32c4d844813a tools/python/xen/remus/save.py
--- a/tools/python/xen/remus/save.py	Thu Oct 13 15:36:53 2011 -0700
+++ b/tools/python/xen/remus/save.py	Thu Oct 13 15:36:55 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 47fdd52af616 -r 32c4d844813a tools/remus/remus
--- a/tools/remus/remus	Thu Oct 13 15:36:53 2011 -0700
+++ b/tools/remus/remus	Thu Oct 13 15:36:55 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 Oct 13 17:21:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 17:21:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REVWP-00050N-Hm; Thu, 13 Oct 2011 17:21:09 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REVVT-0004nJ-Br
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 17:20:11 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1318551606!959810!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6327 invoked from network); 14 Oct 2011 00:20:07 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-3.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 00:20:07 -0000
Received: by vws13 with SMTP id 13so795040vws.30
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 17:20:06 -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:content-type;
	bh=4O8LI63XeT2Ygv1w5Kjb+9CwutI9dY5u0rrKIYXGcew=;
	b=xM/ioeB7i1InVFaU/f7IcqD+4r7cBr4HspQJ4dZkylZpo8Nxq/FEfFytpm78MBYG0u
	zZ3H2MSoFD1D+P5/JleRy/190QFA+GiEMe6j8f2vue3QiEMgWcg5Nq1B0/MV4TtFCm+p
	gs0ZLe1937fdN5vaWrvHP0D9piBWKnmQzu8p0=
MIME-Version: 1.0
Received: by 10.52.184.106 with SMTP id et10mr6394952vdc.107.1318551606074;
	Thu, 13 Oct 2011 17:20:06 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Thu, 13 Oct 2011 17:20:05 -0700 (PDT)
In-Reply-To: <CAE1-PReC7R0VkGErsaVf5OoPrQbXh03fH+kE3e6s8b6EEqL4gw@mail.gmail.com>
References: <CAE1-PRdq9BWjTTHPPBPvESr-ULcdjHgPMTABcCO6+wCLJ1UYog@mail.gmail.com>
	<CAE1-PReA8E-kSif=BU=s-vzOqi-4F4LotxqofH7EEw+dYLtpUA@mail.gmail.com>
	<20111010163129.GF28646@phenom.oracle.com>
	<CAE1-PReC7R0VkGErsaVf5OoPrQbXh03fH+kE3e6s8b6EEqL4gw@mail.gmail.com>
Date: Fri, 14 Oct 2011 01:20:05 +0100
X-Google-Sender-Auth: nqtMQNjBNfBWaJAzP5jKiJBPjL8
Message-ID: <CAE1-PRd9Rt86CgA3_mNW-KMEMMTMH8knmJMbj+4FVeVi4zrvGw@mail.gmail.com>
Subject: Re: [Xen-devel] Fwd: xentop reporting zero written sectors
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-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 13 October 2011 22:10, Andy Burns <xen.lists@burns.me.uk> wrote:

> On 10 October 2011 17:31, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
>
>> I think this new "feature" below will fix it for you:
> What kernel version is that patch based on?

I did eventually build a kernel with a lightly tweaked version of that
patch, to allow for Fedora's patched vanilla 3.0 plus rc9 patches

my VBD_WSECT counters are now merricly clocking up, so feel free to add

Acked-by: Andy Burns <andy@burns.net>

--- a/drivers/block/xen-blkback/blkback.c
--- b/drivers/block/xen-blkback/blkback.c
@@ -685,7 +685,7 @@

        if (operation == READ)
                blkif->st_rd_sect += preq.nr_sects;
-       else if (operation == WRITE || operation == WRITE_FLUSH)
+       else if (operation == WRITE_ODIRECT || operation == WRITE_FLUSH)
                blkif->st_wr_sect += preq.nr_sects;

        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 Oct 13 18:20:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 18:20:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REWRg-0006Yj-UG; Thu, 13 Oct 2011 18:20:20 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REWQY-0006LE-9a
	for Xen-devel@lists.xensource.com; Thu, 13 Oct 2011 18:19:10 -0700
X-Env-Sender: mukesh.rathor@oracle.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1318555145!22088490!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24373 invoked from network); 14 Oct 2011 01:19:07 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Oct 2011 01:19:07 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9E1J1AK011477
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Fri, 14 Oct 2011 01:19:03 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9E1J1Tc007171
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 01:19:01 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
	p9E1IteC026511; Thu, 13 Oct 2011 20:18:55 -0500
Received: from mantra.us.oracle.com (/130.35.68.95)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 13 Oct 2011 18:18:54 -0700
Date: Thu, 13 Oct 2011 18:18:53 -0700
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>, Ian
	Campbell <Ian.Campbell@citrix.com>, Keir Fraser <keir.xen@gmail.com>
Message-ID: <20111013181853.15381ef5@mantra.us.oracle.com>
Organization: Oracle Corporation
X-Mailer: Claws Mail 3.7.6 (GTK+ 2.18.9; x86_64-redhat-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090201.4E978E07.016B,ss=1,re=0.000,fgs=0
Cc: 
Subject: [Xen-devel] HYBRID: gnttab_map() to map shared frames..
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 figure how to make gnttab_map() work for Hybrid with EPT.
The only way I am coming up is the HVM way, where I would have to get
mmio_addr via pci_resource_start() which means registering xen-platform-pci
driver. I know there will be implications later with migration, but thats 
later.

I can't think of any other way since the grant frames are coming from
xen heap and not in p2m table, other than some sort of
xen-heap-p2m-table or something ugly.

Am I on right track, or any other ideas?

thanks,
Mukesh


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

From xen-users-bounces@lists.xensource.com Thu Oct 13 20:45:03 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 20:45:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REYhi-0001Ps-Pj; Thu, 13 Oct 2011 20:45:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REYg4-00015J-JI; Thu, 13 Oct 2011 20:43:20 -0700
X-Env-Sender: rulerof@gmail.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318563795!971492!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20758 invoked from network); 14 Oct 2011 03:43:17 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 03:43:17 -0000
Received: by pzk34 with SMTP id 34so4315382pzk.8
	for <multiple recipients>; Thu, 13 Oct 2011 20:43:15 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=references:from:in-reply-to:mime-version:date:message-id:subject:to
	:cc:content-type;
	bh=tEX+AlgGAv2N5r04kJMMBY4+yVy1UWNpWVMuSsOQtGg=;
	b=t29T5zyWD2dCBa+YOAQgI0+Qssjt9+cN80htiEciDYnqYgBUa060cxARYLm70TXQ2R
	mWW4BKzYT44/l23KV6s48HXjeFLglyl7jG98HcivWIoUxP8whAMMp0J9cr1a0YL6oudR
	VJEh0mL4aTJcMyClV8/LAEkxKuHn8yegaayGw=
Received: by 10.68.8.233 with SMTP id u9mr13767530pba.30.1318563794917; Thu,
	13 Oct 2011 20:43:14 -0700 (PDT)
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org> <20111003185309.GC15608@phenom.oracle.com>
	<4E92D809.9000504@xen.org> <20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
From: Andrew Bobulsky <rulerof@gmail.com>
In-Reply-To: <20111013180244.GC15499@phenom.oracle.com>
Mime-Version: 1.0 (iPhone Mail 8J2)
Date: Thu, 13 Oct 2011 23:43:12 -0400
Message-ID: <5400260811821008556@unknownmsgid>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: Joseph Glanville <joseph.glanville@orionvm.com.au>,
	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

Hello folks,

I wish I could say that I have loads of technical Xen knowledge to
contribute, but I unfortunately do not.  However, I've got a soft spot
for well documented F/OSS projects and would like to help if I can.
If your manpower requirements aren't of a strictly technical nature, I
could perform other tasks related to this endeavor, like edit new
docs, test procedures, and so on.

Should I simply hop on IRC in the next few days to see if that would
be the case?

Cheers,
Andrew Bobulsky

On Oct 13, 2011, at 2:12 PM, Konrad Rzeszutek Wilk
<konrad.wilk@oracle.com> wrote:

> On Thu, Oct 13, 2011 at 05:44:27AM +1100, Joseph Glanville wrote:
>> Sounds good, 26th works.
>>
>> Real-time colab on IRC would be nice to get organised maybe #xendocday on
>> freenode?
>
> Yes, will be on #xendocday.
>
> _______________________________________________
> 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 Thu Oct 13 21:12:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 21:12:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REZ8g-0002Zg-Je; Thu, 13 Oct 2011 21:12:54 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REZ7I-0002Mg-Ay
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 21:11:30 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318565457!41844162!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9627 invoked from network); 14 Oct 2011 04:10:57 -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;
	14 Oct 2011 04:10:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,344,1315180800"; 
   d="scan'208";a="8386502"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Oct 2011 04:11: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; Fri, 14 Oct 2011 05:11:24 +0100
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 1REZ7E-0007IS-EP;
	Fri, 14 Oct 2011 04:11:24 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1REZ7E-00052i-Dm;
	Fri, 14 Oct 2011 05:11:24 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9292-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 14 Oct 2011 05:11:24 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9292: 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 9292 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9292/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     16 guest-start.2              fail REGR. vs. 9252

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

version targeted for testing:
 xen                  a65693f9fb12
baseline version:
 xen                  4b0907c6a08c

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Guido Gunther <agx@sigxcpu.org>
  Haitao Shan <maillists.shan@gmail.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Shan Haitao <haitao.shan@intel.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:   23956:a65693f9fb12
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 13 15:59:22 2011 +0100
    
    x86: Simplify smpboot_alloc by merging x86-{32,64} code as far as
    possible.
    
    We still need one ifdef, as x86-32 does not have a compat_gdt_table.
    
    On x86-32 there is 1/2-page wastage due to allocating a whole page for
    the per-CPU IDT, however we expect very few users of the x86-32
    hypervisor. Those that cannot move to the 64-bit hypervisor are likely
    using old single-processor systems or new single-procesor netbooks. On
    UP and small MP systems, the wastage is insignificant.
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23955:bbde1453cbd9
user:        Shan Haitao <haitao.shan@intel.com>
date:        Thu Oct 13 15:58:55 2011 +0100
    
    x86: Further fixes for xsave leaf in pv_cpuid().
    
    Signed-off-by: Shan Haitao <haitao.shan@intel.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23954:c1bd53fac3d5
user:        Christoph Egger <Christoph.Egger@amd.com>
date:        Thu Oct 13 12:21:10 2011 +0100
    
    nestedsvm: fix checks of guest writes to HSAVE_PA MSR
    
    Accessing HSAVE_PA MSR does not require SVM to be enabled nor any
    special guest paging mode.
    But accessing HSAVE_PA MSR requires the address to be 4k aligned.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23953:eda18b27de6e
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 13 12:21:10 2011 +0100
    
    xenpaging: handle evict failures
    
    Evict of a nominated gfn must fail if some other process mapped the
    page without checking the p2mt of that gfn first.
    Add a check to cancel eviction if the page usage count is not 1.
    
    Handle the possible eviction failure in the page-in paths.
    After nominate and before evict, something may check the p2mt and call
    populate. Handle this case and let the gfn enter the page-in path. The
    gfn may still be connected to a mfn, so there is no need to allocate a
    new page in prep.
    
    Adjust do_mmu_update to return -ENOENT only if the gfn has entered the
    page-in path and if it is not yet connected to a mfn. Otherwise
    linux_privcmd_map_foreign_bulk() may loop forever.
    
    Add MEM_EVENT_FLAG_EVICT_FAIL to inform pager that a page-in request for
    a possible not-evicted page was sent. xenpaging does currently not need
    that flag because failure to evict a gfn will be caught.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23952:1515484353c6
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Oct 13 10:09:28 2011 +0200
    
    VMX: extend last branch MSR info to cover newer CPU models
    
    There are still a couple of family 6 models missing here: 37, 44, 46,
    and 47 (according to SDM doc changes May 2011); presumably they would
    all go into the Nehalem/Sandy Bridge group. Intel?
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Haitao Shan <maillists.shan@gmail.com>
    
    
changeset:   23951:8c1e7830112f
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Oct 13 10:03:43 2011 +0200
    
    xmalloc: return unused full pages on multi-page allocations
    
    Certain (boot time) allocations are relatively large (particularly when
    building with high NR_CPUS), but can also happen to be pretty far away
    from a power-of-two size. Utilize the page allocator's (other than
    Linux'es) capability of allowing to return space from higher-order
    allocations in smaller pieces to return the unused parts immediately.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23950:46ca8ea42d4c
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Oct 13 10:02:34 2011 +0200
    
    x86-64: don't use xmalloc_array() for allocation of the (per-CPU) IDTs
    
    The IDTs being exactly a page in size, using xmalloc() here is rather
    inefficient, as this requires double the amount to be allocated (with
    almost an entire page wasted). For hot plugged CPUs, this at once
    eliminates one more non-order-zero runtime allocation.
    
    For x86-32, however, the IDT is exactly half a page, so allocating a
    full page seems wasteful here, so it continues to use xmalloc() as
    before.
    
    With most of the affected functions' bodies now being inside #ifdef-s,
    it might be reasonable to split those parts out into subarch-specific
    code...
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23949:39df16923958
user:        Jan Beulich <jbeulich@suse.com>
date:        Thu Oct 13 10:00:13 2011 +0200
    
    constify vcpu_set_affinity()'s second parameter
    
    None of the callers actually make use of the function's returning of
    the old affinity through its second parameter, and eliminating this
    capability allows some callers to no longer use a local variable here,
    reducing their stack footprint significantly when building with large
    NR_CPUS.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23948:dcb2bd283dca
user:        Keir Fraser <keir@xen.org>
date:        Wed Oct 12 17:11:28 2011 +0100
    
    Revert part of 23811:f1349a968a5a "ns16550: Simplify UART..."
    
    The change to poll LSR.THRE in a loop from __ns16550_poll is a bug.
    We can loop indefinitely if there are no chars to transmit.
    
    Thanks to Jan for spotting it.
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23947:48aa733d0767
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Wed Oct 12 16:21:32 2011 +0100
    
    libxl: fixup incorrect indentation
    
    Several places which were previsously indented using hard tabs are now
    incorrectly indented. Fix them up.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23946:e65977f3fa86
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Oct 11 14:34:07 2011 +0100
    
    libxl: fixup incorrect indentation
    
    Several places which were previsously indented using hard tabs are now
    incorrectly indented. Fix them up.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23945:c5f8c3597cae
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Oct 11 14:26:00 2011 +0100
    
    libxl: expand hard tab stops
    
    I ran the following and committed the result. ^I is an actual hard tab
    
    for i in $(grep -l --exclude=*_[ly].\[ch\] '^I' tools/libxl/*.[ch]) ; do
         cat $i | expand | sponge $i
    done
    
    There are some actually wrong indentations too, I'll fix those up
    manually.
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23944:4b0907c6a08c
user:        Guido Gunther <agx@sigxcpu.org>
date:        Tue Oct 11 12:02:58 2011 +0100
    
    pygrub: add debug flag
    
    Debugging config file errors is tedious so help a bit by not silently
    dropping parsing exceptions when --debug is given. Also intialize the
    logging API at debug level in this case.
    
    Signed-off-by: Guido Gunther <agx@sigxcpu.org>
    Acked-by: Ian Campbell <ian.campbell@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 Thu Oct 13 21:36:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 13 Oct 2011 21: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 1REZVk-0003Rt-1C; Thu, 13 Oct 2011 21:36:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REZUs-0003F9-9R
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 21:35:50 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318566935!41590804!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5097 invoked from network); 14 Oct 2011 04:35:36 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 04:35:36 -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=NcuFX40d9IfOasohcCsnhze3gMw+yXBVQRF3NZtsf6GGAGv8bxQgMuRO
	qwV0KRUtEeAUcGniVl+Hjp4bFXTXxAHFg336sUhOJfE2zwaztbtgKyix+
	k6zIvJPxoEZNzAQ29Bi/QsqC2RaYujTkSF7XVwJLqjQmR5JKHt/UCSKe5
	HFrrL5U03HDjIo8wxGlXDILRXKqNtIyeA6mCkaZILv2ConCECee04vXwZ
	lk9099JmtVVUaJTZ4l83IYFAjr+bL;
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=1318566947; x=1350102947;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=JvSELwk+8t3/+GT0aiZ5TUhRiUJGuGHRjaG/lmatwk8=;
	b=KdnRxlsfDCJ0GK8IWmNNe2z8tGkq1RHyoexa+M0/6mTvOPHvL4qBzWwg
	+J1boO92XNWxE46TdqHaRHGDNZcBxGfp1ERXalngrsIMM72MsV2gy5+sR
	IZr0InclUGgtVW2sCQEoRWgL61lymdfusi8T9Nggfi8YtZh6/nn9zZuWZ
	EO5tMhrJ/20gujhDOnBU4QdLC4dyfXNeZuFXIrUoRfB/qM8XoBBLCP7+i
	31BU0MOx1Wwn5rXLvcZOCycMYsW2g;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,343,1315173600"; d="scan'208";a="76674133"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate20u.abg.fsc.net with ESMTP; 14 Oct 2011 06:35:46 +0200
X-IronPort-AV: E=Sophos;i="4.69,343,1315173600"; d="scan'208";a="121735084"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 14 Oct 2011 06:35:46 +0200
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 87408859E;
	Fri, 14 Oct 2011 06:35:46 +0200 (CEST)
Message-ID: <4E97BC22.5060003@ts.fujitsu.com>
Date: Fri, 14 Oct 2011 06:35:46 +0200
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.21) Gecko/20110831 Iceowl/1.0b2 Icedove/3.1.13
MIME-Version: 1.0
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] credit2 data structures
References: <4E96CEBD020000780005B151@nat28.tlf.novell.com>	<CAFLBxZaHwav97=PVvZDTKzBVaeGc9FYh4xs9mj3cC=WbEzTZtw@mail.gmail.com>	<4E96F48A020000780005B2A3@nat28.tlf.novell.com>	<4E96DF7B.5060502@ts.fujitsu.com>
	<4E970F2E020000780005B2F8@nat28.tlf.novell.com>
In-Reply-To: <4E970F2E020000780005B2F8@nat28.tlf.novell.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: George Dunlap <George.Dunlap@eu.citrix.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 10/13/2011 04:17 PM, Jan Beulich wrote:
>>>> On 13.10.11 at 14:54, Juergen Gross<juergen.gross@ts.fujitsu.com>  wrote:
>> On 10/13/2011 02:24 PM, Jan Beulich wrote:
>>>>>> On 13.10.11 at 12:11, George Dunlap<George.Dunlap@eu.citrix.com>   wrote:
>>>> On Thu, Oct 13, 2011 at 10:42 AM, Jan Beulich<JBeulich@suse.com>   wrote:
>>>>> Apart from the possibility of allocating the arrays (and maybe also the
>>>>> cpumask_t-s) separately (for which I can come up with a patch on top
>>>>> of what I' currently putting together) - is it really necessary to have
>>>>> all these, the more that there can be multiple instances of the structure
>>>>> with CPU pools?
>>>> I'm not quite sure what it is that you're asking.  Do you mean, are
>>>> all of the things in each runqueue structure necessary?  Specifically,
>>>> I guess, the cpumask_t structures (because the rest of the structure
>>>> isn't significantly larger than the per-cpu structure for credit1)?
>>> No, it's really the NR_CPUS-sized array of struct csched_runqueue_data.
>>> Credit1 otoh has *no* NR_CPUS sized arrays at all.
>>>
>>>> At first blush, all of those cpu masks are necessary.  The assignment
>>>> of cpus to runqueues may be arbitrary, so we need a cpu mask for that.
>>>>    In theory, "idle" and "tickled" only need bits for the cpus actually
>>>> assigned to this runqueue (which should be 2-8 under normal
>>>> circumstances).  But then we would need some kind of mechanism to
>>>> translate "mask just for these cpus" to "mask of all cpus" in order to
>>>> use the normal cpumask mechanisms, which seems like a lot of extra
>>>> complexity just to save a few bytes.  Surely a system with 4096
>>>> logical cpus can afford 6 megabytes of memory for scheduling?
>>> I'm not concerned about the total amount if run on a system that
>>> large. I'm more concerned about this being a single chunk (possibly
>>> allocated post-boot, where we're really aiming at having no
>>> allocations larger than a page at all) and this size being allocated
>>> even when running on a much smaller system (i.e. depending only
>>> on compile time parameters).
>>>
>>>> For one thing, the number of runqueues in credit2 is actually meant to
>>>> be smaller than the number of logical cpus -- it's meant to be one per
>>>> L2 cache, which should have between 2 and 8 logical cpus, depending on
>>>> the architecture.  I just put NR_CPUS because it was easier to get
>>>> working.  Making that an array of pointers, which is allocated on an
>>>> as-needed basis, should reduce that requirement a great deal.
>>> That would help, but would probably not suffice (since a NR_CPUS
>>> sized array of pointers is still going to be larger than a page). We
>>> may need to introduce dynamic per-CPU data allocation for this...
>> Couldn't the run-queue data be dynamically allocated and the pcpu-data of
>> credit2 contain a pointer to it?
> Not if the per-CPU data is also per scheduler instance (which I can't
> easily tell whether it is).

Each cpu has only one dynamically allocated scheduler pcpu-data area which is
anchored in the per_cpu area of that cpu.


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 Oct 14 00:11:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 00:11:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REbvS-0006bS-Ly; Fri, 14 Oct 2011 00:11:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REbuc-0006Od-Pw
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 00:10:35 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318576231!988357!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7654 invoked from network); 14 Oct 2011 07:10:31 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Oct 2011 07:10:31 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 14 Oct 2011 08:10:31 +0100
Message-Id: <4E97FC86020000780005B541@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 14 Oct 2011 08:10:30 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "George Dunlap" <George.Dunlap@eu.citrix.com>,
	<ian.jackson@eu.citrix.com>,"Keir Fraser" <keir@xen.org>
Subject: Re: [Xen-devel] [xen-unstable test] 9292: regressions - FAIL
References: <osstest-9292-mainreport@xen.org>
In-Reply-To: <osstest-9292-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 14.10.11 at 06:11, xen.org <ian.jackson@eu.citrix.com> wrote:
> flight 9292 xen-unstable real [real]
> http://www.chiark.greenend.org.uk/~xensrcts/logs/9292/=20
>=20
> Regressions :-(
>=20
> Tests which did not succeed and are blocking:
>  test-amd64-amd64-xl-sedf     16 guest-start.2              fail REGR. =
vs. 9252

This particular test appears to be failing every now and then, hinting at
some further bit rot problem in sedf. Therefore I wonder whether
sedf needs some more serious looking at or whether we should simply
drop it (and with it the test).

Jan

> Tests which did not succeed, but are not blocking,
> including regressions (tests previously passed) regarded as allowable:
>  test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   =
never pass
>  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-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-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                  a65693f9fb12
> baseline version:
>  xen                  4b0907c6a08c


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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 00:25:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 00:25:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REc90-0007xy-DH; Fri, 14 Oct 2011 00:25:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REc8a-0007lO-Jt
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 00:25:00 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318577097!984859!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15539 invoked from network); 14 Oct 2011 07:24:57 -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; 14 Oct 2011 07:24:57 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 14 Oct 2011 08:24:57 +0100
Message-Id: <4E97FFE8020000780005B54C@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 14 Oct 2011 08:24:56 +0100
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] cpufreq: error path 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 fixes an actual bug (failure to exit from a function after an
allocation failure), an inconsistency (not removing the cpufreq_dom
list member upon failure), and a latent bug (not clearing the current
governor upon governor initialization failure when there was no old
one; latent because the only current code path leading to this
situation frees the policy upon failure and hence the governor not
getting cleared is benign).

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/drivers/cpufreq/cpufreq.c
+++ b/xen/drivers/cpufreq/cpufreq.c
@@ -176,8 +176,10 @@ int cpufreq_add_cpu(unsigned int cpu)
=20
     if (!domexist || hw_all) {
         policy =3D xzalloc(struct cpufreq_policy);
-        if (!policy)
+        if (!policy) {
             ret =3D -ENOMEM;
+            goto err0;
+        }
=20
         policy->cpu =3D cpu;
         per_cpu(cpufreq_cpu_policy, cpu) =3D policy;
@@ -186,7 +188,7 @@ int cpufreq_add_cpu(unsigned int cpu)
         if (ret) {
             xfree(policy);
             per_cpu(cpufreq_cpu_policy, cpu) =3D NULL;
-            return ret;
+            goto err0;
         }
         if (cpufreq_verbose)
             printk("CPU %u initialization completed\n", cpu);
@@ -243,7 +245,7 @@ err1:
         cpufreq_driver->exit(policy);
         xfree(policy);
     }
-
+err0:
     if (cpus_empty(cpufreq_dom->map)) {
         list_del(&cpufreq_dom->node);
         xfree(cpufreq_dom);
--- a/xen/drivers/cpufreq/utility.c
+++ b/xen/drivers/cpufreq/utility.c
@@ -458,8 +458,8 @@ int __cpufreq_set_policy(struct cpufreq_
                                  data->governor->name);
=20
             /* new governor failed, so re-start old one */
+            data->governor =3D old_gov;
             if (old_gov) {
-                data->governor =3D old_gov;
                 __cpufreq_governor(data, CPUFREQ_GOV_START);
                 printk(KERN_WARNING "Still stay at %s governor\n",
                                      data->governor->name);




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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 00:26:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 00:26:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REcAD-0008Lm-Tv; Fri, 14 Oct 2011 00:26:41 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REc9o-00089l-5E
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 00:26:16 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318577172!19468035!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18057 invoked from network); 14 Oct 2011 07:26:13 -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; 14 Oct 2011 07:26:13 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 14 Oct 2011 08:26:12 +0100
Message-Id: <4E980034020000780005B559@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 14 Oct 2011 08:26:12 +0100
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] p2m: use xzalloc() for struct p2m_domain allocation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -71,7 +71,6 @@ boolean_param("hap_2mb", opt_hap_2mb);
 /* Init the datastructures for later use by the p2m code */
 static void p2m_initialise(struct domain *d, struct p2m_domain *p2m)
 {
-    memset(p2m, 0, sizeof(*p2m));
     mm_lock_init(&p2m->lock);
     INIT_LIST_HEAD(&p2m->np2m_list);
     INIT_PAGE_LIST_HEAD(&p2m->pages);
@@ -100,7 +99,7 @@ p2m_init_nestedp2m(struct domain *d)
=20
     mm_lock_init(&d->arch.nested_p2m_lock);
     for (i =3D 0; i < MAX_NESTEDP2M; i++) {
-        d->arch.nested_p2m[i] =3D p2m =3D xmalloc(struct p2m_domain);
+        d->arch.nested_p2m[i] =3D p2m =3D xzalloc(struct p2m_domain);
         if (p2m =3D=3D NULL)
             return -ENOMEM;
         p2m_initialise(d, p2m);
@@ -115,7 +114,7 @@ int p2m_init(struct domain *d)
 {
     struct p2m_domain *p2m;
=20
-    p2m_get_hostp2m(d) =3D p2m =3D xmalloc(struct p2m_domain);
+    p2m_get_hostp2m(d) =3D p2m =3D xzalloc(struct p2m_domain);
     if ( p2m =3D=3D NULL )
         return -ENOMEM;
     p2m_initialise(d, p2m);




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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 00:51:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 00:51:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REcY2-0000hp-Bv; Fri, 14 Oct 2011 00:51:18 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REcXE-0000U7-P1
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 00:50:29 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318578625!19471676!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19860 invoked from network); 14 Oct 2011 07:50:25 -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; 14 Oct 2011 07:50:25 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 14 Oct 2011 08:50:25 +0100
Message-Id: <4E9805E0020000780005B56F@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 14 Oct 2011 08:50:24 +0100
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] rcu: move private declarations and definitions
	from header to 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

No consumer of RCU should need to see these, and there's also no need
to clutter the global name space with them.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/common/rcupdate.c
+++ b/xen/common/rcupdate.c
@@ -46,15 +46,50 @@
 #include <xen/cpu.h>
 #include <xen/stop_machine.h>
=20
-/* Definition for rcupdate control block. */
-struct rcu_ctrlblk rcu_ctrlblk =3D {
+/* Global control variables for rcupdate callback mechanism. */
+static struct rcu_ctrlblk {
+    long cur;           /* Current batch number.                      */
+    long completed;     /* Number of the last completed batch         */
+    int  next_pending;  /* Is the next batch already waiting?         */
+
+    spinlock_t  lock __cacheline_aligned;
+    cpumask_t   cpumask; /* CPUs that need to switch in order    */
+    /* for current batch to proceed.        */
+} __cacheline_aligned rcu_ctrlblk =3D {
     .cur =3D -300,
     .completed =3D -300,
     .lock =3D SPIN_LOCK_UNLOCKED,
     .cpumask =3D CPU_MASK_NONE,
 };
=20
-DEFINE_PER_CPU(struct rcu_data, rcu_data);
+/*
+ * Per-CPU data for Read-Copy Update.
+ * nxtlist - new callbacks are added here
+ * curlist - current batch for which quiescent cycle started if any
+ */
+struct rcu_data {
+    /* 1) quiescent state handling : */
+    long quiescbatch;    /* Batch # for grace period */
+    int  qs_pending;     /* core waits for quiesc state */
+
+    /* 2) batch handling */
+    long            batch;            /* Batch # for current RCU batch */
+    struct rcu_head *nxtlist;
+    struct rcu_head **nxttail;
+    long            qlen;             /* # of queued callbacks */
+    struct rcu_head *curlist;
+    struct rcu_head **curtail;
+    struct rcu_head *donelist;
+    struct rcu_head **donetail;
+    long            blimit;           /* Upper limit on a processed batch =
*/
+    int cpu;
+    struct rcu_head barrier;
+#ifdef CONFIG_SMP
+    long            last_rs_qlen;     /* qlen during the last resched */
+#endif
+};
+
+static DEFINE_PER_CPU(struct rcu_data, rcu_data);
=20
 static int blimit =3D 10;
 static int qhimark =3D 10000;
@@ -104,6 +139,18 @@ int rcu_barrier(void)
     return stop_machine_run(rcu_barrier_action, &cpu_count, NR_CPUS);
 }
=20
+/* Is batch a before batch b ? */
+static inline int rcu_batch_before(long a, long b)
+{
+    return (a - b) < 0;
+}
+
+/* Is batch a after batch b ? */
+static inline int rcu_batch_after(long a, long b)
+{
+    return (a - b) > 0;
+}
+
 static void force_quiescent_state(struct rcu_data *rdp,
                                   struct rcu_ctrlblk *rcp)
 {
--- a/xen/include/xen/rcupdate.h
+++ b/xen/include/xen/rcupdate.h
@@ -57,60 +57,6 @@ struct rcu_head {
 } while (0)
=20
=20
-
-/* Global control variables for rcupdate callback mechanism. */
-struct rcu_ctrlblk {
-    long cur;           /* Current batch number.                      */
-    long completed;     /* Number of the last completed batch         */
-    int  next_pending;  /* Is the next batch already waiting?         */
-
-    spinlock_t  lock __cacheline_aligned;
-    cpumask_t   cpumask; /* CPUs that need to switch in order    */
-    /* for current batch to proceed.        */
-} __cacheline_aligned;
-
-/* Is batch a before batch b ? */
-static inline int rcu_batch_before(long a, long b)
-{
-    return (a - b) < 0;
-}
-
-/* Is batch a after batch b ? */
-static inline int rcu_batch_after(long a, long b)
-{
-    return (a - b) > 0;
-}
-
-/*
- * Per-CPU data for Read-Copy Update.
- * nxtlist - new callbacks are added here
- * curlist - current batch for which quiescent cycle started if any
- */
-struct rcu_data {
-    /* 1) quiescent state handling : */
-    long quiescbatch;    /* Batch # for grace period */
-    int  qs_pending;     /* core waits for quiesc state */
-
-    /* 2) batch handling */
-    long            batch;            /* Batch # for current RCU batch */
-    struct rcu_head *nxtlist;
-    struct rcu_head **nxttail;
-    long            qlen;             /* # of queued callbacks */
-    struct rcu_head *curlist;
-    struct rcu_head **curtail;
-    struct rcu_head *donelist;
-    struct rcu_head **donetail;
-    long            blimit;           /* Upper limit on a processed batch =
*/
-    int cpu;
-    struct rcu_head barrier;
-#ifdef CONFIG_SMP
-    long            last_rs_qlen;     /* qlen during the last resched */
-#endif
-};
-
-DECLARE_PER_CPU(struct rcu_data, rcu_data);
-extern struct rcu_ctrlblk rcu_ctrlblk;
-
 int rcu_pending(int cpu);
 int rcu_needs_cpu(int cpu);
=20



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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 00:52:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 00:52:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REcZ9-00017U-7D; Fri, 14 Oct 2011 00:52:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REcXS-0000WA-DT
	for Xen-devel@lists.xensource.com; Fri, 14 Oct 2011 00:50:43 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318578639!994617!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14661 invoked from network); 14 Oct 2011 07:50:39 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 07:50:39 -0000
Received: by wyh13 with SMTP id 13so3381069wyh.30
	for <Xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 00:50:39 -0700 (PDT)
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=fI+Bi46HCpuGQbDAPLrouamfAudwEwV/Tze0kI1CBe4=;
	b=ec08l27talSP2wpYzQK7WYbz3tVpsMVD21jywmtwE/+kjFHe6YD+LiwtexZlYrmEUQ
	2kROxoEqELLfeWjWR6/+DqmcprkkOaTW/T40dP/v3mUyALNMb0ENYOFIHRbbZzC+MZEf
	rCLVmuotlp1sDZtpbfhm3IXnUT2zaVtw9pfbU=
Received: by 10.216.143.153 with SMTP id l25mr1136656wej.24.1318578638830;
	Fri, 14 Oct 2011 00:50:38 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id es5sm12652542wbb.11.2011.10.14.00.50.36
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 00:50:37 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 14 Oct 2011 08:50:33 +0100
From: Keir Fraser <keir.xen@gmail.com>
To: Mukesh Rathor <mukesh.rathor@oracle.com>,
	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>
Message-ID: <CABDA859.22DA3%keir.xen@gmail.com>
Thread-Topic: HYBRID: gnttab_map() to map shared frames..
Thread-Index: AcyKRfOHhniqDUYpukW543arLtJpng==
In-Reply-To: <20111013181853.15381ef5@mantra.us.oracle.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
Subject: [Xen-devel] Re: HYBRID: gnttab_map() to map shared frames..
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 you are running without autotranslate paging mode then the p2m will be
1:1 and there is no problem. If you are running autotranslate then yes you
probably need the HVM style of mapping.

 -- Keir

On 14/10/2011 02:18, "Mukesh Rathor" <mukesh.rathor@oracle.com> wrote:

> Hi,
> 
> I am trying to figure how to make gnttab_map() work for Hybrid with EPT.
> The only way I am coming up is the HVM way, where I would have to get
> mmio_addr via pci_resource_start() which means registering xen-platform-pci
> driver. I know there will be implications later with migration, but thats
> later.
> 
> I can't think of any other way since the grant frames are coming from
> xen heap and not in p2m table, other than some sort of
> xen-heap-p2m-table or something ugly.
> 
> Am I on right track, or any other ideas?
> 
> thanks,
> Mukesh
> 



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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 00:53:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 00:53:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REca2-0001Uu-BF; Fri, 14 Oct 2011 00:53:22 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REcYa-0000tA-IP
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 00:51:52 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318578709!986852!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24867 invoked from network); 14 Oct 2011 07:51:49 -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; 14 Oct 2011 07:51:49 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 14 Oct 2011 08:51:49 +0100
Message-Id: <4E980634020000780005B580@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 14 Oct 2011 08:51:48 +0100
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] x86: remove dead member from struct _cpuid4_info
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/cpu/intel_cacheinfo.c
+++ b/xen/arch/x86/cpu/intel_cacheinfo.c
@@ -124,7 +124,6 @@ struct _cpuid4_info {
 	union _cpuid4_leaf_ebx ebx;
 	union _cpuid4_leaf_ecx ecx;
 	unsigned long size;
-	cpumask_t shared_cpu_map;
 };
=20
 unsigned short			num_cache_leaves;




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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 01:02:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 01:02:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REcjH-000271-6z; Fri, 14 Oct 2011 01:02:55 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REcgT-0001rx-Dz
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 01:00:12 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1318579197!20444784!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30910 invoked from network); 14 Oct 2011 07:59:57 -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;
	14 Oct 2011 07:59:57 -0000
Received: by wyh13 with SMTP id 13so3394366wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 00:59:57 -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=48ZB1UhhWCmlKP3/l6rjgEQwRDpAfD37ms/l/D30wGk=;
	b=hNplEP6Ls0Ed68p2KUvrJOn3wYaYHQ/0NbbpuH6FyBuFRd2KgvC/Qx6fJ+aZXos+d3
	dFaYxMngea0Ae3gyEEdX6Amo/wEnvG7OqdUSD1EfvBVeLcqifjBuIO2CICdsVe66iGPT
	sLgdjn65ZLmIOiaMr0yLFvzUiDt118ErPQCwg=
Received: by 10.227.36.229 with SMTP id u37mr2641419wbd.21.1318579196857;
	Fri, 14 Oct 2011 00:59:56 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id y10sm12686506wbm.14.2011.10.14.00.59.55
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 00:59:56 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 14 Oct 2011 08:59:52 +0100
Subject: Re: [Xen-devel] p2m: use xzalloc() for struct p2m_domain allocation
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: <CABDAA88.22EDE%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] p2m: use xzalloc() for struct p2m_domain allocation
Thread-Index: AcyKR0C3ZojxaI9EkkWk540yngkuNA==
In-Reply-To: <4E980034020000780005B559@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 14/10/2011 08:26, "Jan Beulich" <JBeulich@suse.com> wrote:

> Signed-off-by: Jan Beulich <jbeulich@suse.com>

I'll leave this one for Tim to ack/nack.

> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -71,7 +71,6 @@ boolean_param("hap_2mb", opt_hap_2mb);
>  /* Init the datastructures for later use by the p2m code */
>  static void p2m_initialise(struct domain *d, struct p2m_domain *p2m)
>  {
> -    memset(p2m, 0, sizeof(*p2m));
>      mm_lock_init(&p2m->lock);
>      INIT_LIST_HEAD(&p2m->np2m_list);
>      INIT_PAGE_LIST_HEAD(&p2m->pages);
> @@ -100,7 +99,7 @@ p2m_init_nestedp2m(struct domain *d)
>  
>      mm_lock_init(&d->arch.nested_p2m_lock);
>      for (i = 0; i < MAX_NESTEDP2M; i++) {
> -        d->arch.nested_p2m[i] = p2m = xmalloc(struct p2m_domain);
> +        d->arch.nested_p2m[i] = p2m = xzalloc(struct p2m_domain);
>          if (p2m == NULL)
>              return -ENOMEM;
>          p2m_initialise(d, p2m);
> @@ -115,7 +114,7 @@ int p2m_init(struct domain *d)
>  {
>      struct p2m_domain *p2m;
>  
> -    p2m_get_hostp2m(d) = p2m = xmalloc(struct p2m_domain);
> +    p2m_get_hostp2m(d) = p2m = xzalloc(struct p2m_domain);
>      if ( p2m == NULL )
>          return -ENOMEM;
>      p2m_initialise(d, p2m);
> 
> 
> 
> 
> _______________________________________________
> 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 Oct 14 01:06:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 01:06:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REcn5-0002ZJ-Bh; Fri, 14 Oct 2011 01:06:51 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REcfe-0001rc-E9
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 00:59:58 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318579147!995970!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10125 invoked from network); 14 Oct 2011 07:59:07 -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;
	14 Oct 2011 07:59:07 -0000
Received: by wwf27 with SMTP id 27so2457392wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 00:59:07 -0700 (PDT)
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=DXoRpiWbGiho8OaAffKSOzHhR+E1VhVhMTPYeXuCnAM=;
	b=qRH1eR9BaOvl8VSkJC7MOxn5ApNWJtmUain9jCMoqrv2Slyc0yHmIDgiPk69iwuXWm
	pxRLTrTctgk87P6+JmMOv+x5Yt+/nNrrKD80xhwfHO+Z4vUY9jAQO16tJNSG/PuF87Rj
	ZFBT90NfrA9iK5e9purofdaqciVLIRjUMdYng=
Received: by 10.227.58.84 with SMTP id f20mr2934571wbh.9.1318579146884;
	Fri, 14 Oct 2011 00:59:06 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id l40sm12698489wbm.10.2011.10.14.00.59.04
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 00:59:05 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 14 Oct 2011 08:59:01 +0100
Subject: Re: [Xen-devel] [PATCH] cpufreq: error path fixes
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: <CABDAA55.22EDD%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] cpufreq: error path fixes
Thread-Index: AcyKRyJRSzmf4Iq0YUi0rbF82fH0lw==
In-Reply-To: <4E97FFE8020000780005B54C@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 14/10/2011 08:24, "Jan Beulich" <JBeulich@suse.com> wrote:

> This fixes an actual bug (failure to exit from a function after an
> allocation failure), an inconsistency (not removing the cpufreq_dom
> list member upon failure), and a latent bug (not clearing the current
> governor upon governor initialization failure when there was no old
> one; latent because the only current code path leading to this
> situation frees the policy upon failure and hence the governor not
> getting cleared is benign).
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/drivers/cpufreq/cpufreq.c
> +++ b/xen/drivers/cpufreq/cpufreq.c
> @@ -176,8 +176,10 @@ int cpufreq_add_cpu(unsigned int cpu)
>  
>      if (!domexist || hw_all) {
>          policy = xzalloc(struct cpufreq_policy);
> -        if (!policy)
> +        if (!policy) {
>              ret = -ENOMEM;
> +            goto err0;
> +        }
>  
>          policy->cpu = cpu;
>          per_cpu(cpufreq_cpu_policy, cpu) = policy;
> @@ -186,7 +188,7 @@ int cpufreq_add_cpu(unsigned int cpu)
>          if (ret) {
>              xfree(policy);
>              per_cpu(cpufreq_cpu_policy, cpu) = NULL;
> -            return ret;
> +            goto err0;
>          }
>          if (cpufreq_verbose)
>              printk("CPU %u initialization completed\n", cpu);
> @@ -243,7 +245,7 @@ err1:
>          cpufreq_driver->exit(policy);
>          xfree(policy);
>      }
> -
> +err0:
>      if (cpus_empty(cpufreq_dom->map)) {
>          list_del(&cpufreq_dom->node);
>          xfree(cpufreq_dom);
> --- a/xen/drivers/cpufreq/utility.c
> +++ b/xen/drivers/cpufreq/utility.c
> @@ -458,8 +458,8 @@ int __cpufreq_set_policy(struct cpufreq_
>                                   data->governor->name);
>  
>              /* new governor failed, so re-start old one */
> +            data->governor = old_gov;
>              if (old_gov) {
> -                data->governor = old_gov;
>                  __cpufreq_governor(data, CPUFREQ_GOV_START);
>                  printk(KERN_WARNING "Still stay at %s governor\n",
>                                       data->governor->name);
> 
> 
> 
> 
> _______________________________________________
> 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 Oct 14 01:08:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 01:08:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REcok-0002y8-No; Fri, 14 Oct 2011 01:08:34 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REcgq-0001t0-MB
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 01:00:28 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318579221!19473179!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16000 invoked from network); 14 Oct 2011 08:00:21 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-3.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 08:00:21 -0000
Received: by wwf27 with SMTP id 27so2458807wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 01:00:21 -0700 (PDT)
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=BZdEtsLAah/Y2xyyYGb0pMCRjiNjzHnk4tEYwkGluCE=;
	b=M+W8NQGX1lI+b0EKGMiDVeoAne+0gjtl4gs1gpDkSGyOCdQ38uucsR5seWF46ZXwfq
	ccg+612PUBwhKelyDe+2r4O+VzoCbT083tVBA0KJ7H3QJp5mMowQDxm62tLLcdGHAtbW
	O8qr7WL5xuy4GHpAML2S8mYuOKAsdgD3ksIvo=
Received: by 10.216.190.69 with SMTP id d47mr2465642wen.51.1318579221104;
	Fri, 14 Oct 2011 01:00:21 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id h39sm12740222wbo.0.2011.10.14.01.00.18
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 01:00:20 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 14 Oct 2011 09:00:15 +0100
Subject: Re: [Xen-devel] [PATCH] rcu: move private declarations and
	definitions from header to implementation
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: <CABDAA9F.22EE1%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] rcu: move private declarations and
	definitions from header to implementation
Thread-Index: AcyKR05tTejMS8/ZIk25Fs4RxpFKRA==
In-Reply-To: <4E9805E0020000780005B56F@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 14/10/2011 08:50, "Jan Beulich" <JBeulich@suse.com> wrote:

> No consumer of RCU should need to see these, and there's also no need
> to clutter the global name space with them.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/common/rcupdate.c
> +++ b/xen/common/rcupdate.c
> @@ -46,15 +46,50 @@
>  #include <xen/cpu.h>
>  #include <xen/stop_machine.h>
>  
> -/* Definition for rcupdate control block. */
> -struct rcu_ctrlblk rcu_ctrlblk = {
> +/* Global control variables for rcupdate callback mechanism. */
> +static struct rcu_ctrlblk {
> +    long cur;           /* Current batch number.                      */
> +    long completed;     /* Number of the last completed batch         */
> +    int  next_pending;  /* Is the next batch already waiting?         */
> +
> +    spinlock_t  lock __cacheline_aligned;
> +    cpumask_t   cpumask; /* CPUs that need to switch in order    */
> +    /* for current batch to proceed.        */
> +} __cacheline_aligned rcu_ctrlblk = {
>      .cur = -300,
>      .completed = -300,
>      .lock = SPIN_LOCK_UNLOCKED,
>      .cpumask = CPU_MASK_NONE,
>  };
>  
> -DEFINE_PER_CPU(struct rcu_data, rcu_data);
> +/*
> + * Per-CPU data for Read-Copy Update.
> + * nxtlist - new callbacks are added here
> + * curlist - current batch for which quiescent cycle started if any
> + */
> +struct rcu_data {
> +    /* 1) quiescent state handling : */
> +    long quiescbatch;    /* Batch # for grace period */
> +    int  qs_pending;     /* core waits for quiesc state */
> +
> +    /* 2) batch handling */
> +    long            batch;            /* Batch # for current RCU batch */
> +    struct rcu_head *nxtlist;
> +    struct rcu_head **nxttail;
> +    long            qlen;             /* # of queued callbacks */
> +    struct rcu_head *curlist;
> +    struct rcu_head **curtail;
> +    struct rcu_head *donelist;
> +    struct rcu_head **donetail;
> +    long            blimit;           /* Upper limit on a processed batch */
> +    int cpu;
> +    struct rcu_head barrier;
> +#ifdef CONFIG_SMP
> +    long            last_rs_qlen;     /* qlen during the last resched */
> +#endif
> +};
> +
> +static DEFINE_PER_CPU(struct rcu_data, rcu_data);
>  
>  static int blimit = 10;
>  static int qhimark = 10000;
> @@ -104,6 +139,18 @@ int rcu_barrier(void)
>      return stop_machine_run(rcu_barrier_action, &cpu_count, NR_CPUS);
>  }
>  
> +/* Is batch a before batch b ? */
> +static inline int rcu_batch_before(long a, long b)
> +{
> +    return (a - b) < 0;
> +}
> +
> +/* Is batch a after batch b ? */
> +static inline int rcu_batch_after(long a, long b)
> +{
> +    return (a - b) > 0;
> +}
> +
>  static void force_quiescent_state(struct rcu_data *rdp,
>                                    struct rcu_ctrlblk *rcp)
>  {
> --- a/xen/include/xen/rcupdate.h
> +++ b/xen/include/xen/rcupdate.h
> @@ -57,60 +57,6 @@ struct rcu_head {
>  } while (0)
>  
>  
> -
> -/* Global control variables for rcupdate callback mechanism. */
> -struct rcu_ctrlblk {
> -    long cur;           /* Current batch number.                      */
> -    long completed;     /* Number of the last completed batch         */
> -    int  next_pending;  /* Is the next batch already waiting?         */
> -
> -    spinlock_t  lock __cacheline_aligned;
> -    cpumask_t   cpumask; /* CPUs that need to switch in order    */
> -    /* for current batch to proceed.        */
> -} __cacheline_aligned;
> -
> -/* Is batch a before batch b ? */
> -static inline int rcu_batch_before(long a, long b)
> -{
> -    return (a - b) < 0;
> -}
> -
> -/* Is batch a after batch b ? */
> -static inline int rcu_batch_after(long a, long b)
> -{
> -    return (a - b) > 0;
> -}
> -
> -/*
> - * Per-CPU data for Read-Copy Update.
> - * nxtlist - new callbacks are added here
> - * curlist - current batch for which quiescent cycle started if any
> - */
> -struct rcu_data {
> -    /* 1) quiescent state handling : */
> -    long quiescbatch;    /* Batch # for grace period */
> -    int  qs_pending;     /* core waits for quiesc state */
> -
> -    /* 2) batch handling */
> -    long            batch;            /* Batch # for current RCU batch */
> -    struct rcu_head *nxtlist;
> -    struct rcu_head **nxttail;
> -    long            qlen;             /* # of queued callbacks */
> -    struct rcu_head *curlist;
> -    struct rcu_head **curtail;
> -    struct rcu_head *donelist;
> -    struct rcu_head **donetail;
> -    long            blimit;           /* Upper limit on a processed batch */
> -    int cpu;
> -    struct rcu_head barrier;
> -#ifdef CONFIG_SMP
> -    long            last_rs_qlen;     /* qlen during the last resched */
> -#endif
> -};
> -
> -DECLARE_PER_CPU(struct rcu_data, rcu_data);
> -extern struct rcu_ctrlblk rcu_ctrlblk;
> -
>  int rcu_pending(int cpu);
>  int rcu_needs_cpu(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 Fri Oct 14 01:10:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 01: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 1REcqf-0003N3-MY; Fri, 14 Oct 2011 01:10:33 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REch2-0001t7-MD
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 01:00:37 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318579233!985557!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10646 invoked from network); 14 Oct 2011 08:00:33 -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;
	14 Oct 2011 08:00:33 -0000
Received: by wyh13 with SMTP id 13so3395367wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 01:00:33 -0700 (PDT)
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=j/XC6ArVWMedyPlseHUezdfiEAjNJXnxrzoreQjRqVI=;
	b=tXkOD+Rv4E9NUr5Jxo45k7LXknKxJOxaWqcx/Ewu8B2d8QV6NwwpEfPxrwUbPkLfZ2
	czAwgSpco24NUmCrqFoifhuvGCW+DwrDxnvorn3lBfwvIJ0SyPkVHZgYH0lXIhIIbxBd
	uDUbisx1LI1ruLsp+7YsVlnMwJUzT6yVfS0cs=
Received: by 10.227.20.3 with SMTP id d3mr644969wbb.46.1318579233319;
	Fri, 14 Oct 2011 01:00:33 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id o7sm12708765wbh.8.2011.10.14.01.00.32
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 01:00:32 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 14 Oct 2011 09:00:29 +0100
Subject: Re: [Xen-devel] [PATCH] x86: remove dead member from struct
	_cpuid4_info
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: <CABDAAAD.22EE2%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] x86: remove dead member from struct
	_cpuid4_info
Thread-Index: AcyKR1bFxWP3dRkHD0uYZh/l0dVB4A==
In-Reply-To: <4E980634020000780005B580@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 14/10/2011 08:51, "Jan Beulich" <JBeulich@suse.com> wrote:

> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/arch/x86/cpu/intel_cacheinfo.c
> +++ b/xen/arch/x86/cpu/intel_cacheinfo.c
> @@ -124,7 +124,6 @@ struct _cpuid4_info {
> union _cpuid4_leaf_ebx ebx;
> union _cpuid4_leaf_ecx ecx;
> unsigned long size;
> - cpumask_t shared_cpu_map;
>  };
>  
>  unsigned short   num_cache_leaves;
> 
> 
> 
> 
> _______________________________________________
> 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 Oct 14 02:01:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 02:01:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REde9-0004ze-Sh; Fri, 14 Oct 2011 02:01:41 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REdaX-0004ia-27
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 01:57:59 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318582637!59151287!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9274 invoked from network); 14 Oct 2011 08:57:17 -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; 14 Oct 2011 08:57:17 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 14 Oct 2011 09:57:47 +0100
Message-Id: <4E9815A8020000780005B5DA@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 14 Oct 2011 09:57:44 +0100
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] x86: clean up physid_mask_t 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

This eliminates passing and returning by value of this type (making it
unnecessary for the compiler to create temporary variables for doing so
on the stack), thus dramatically reducing the stack frame sizes of a
couple of functions (was in one case over 12k for a 4095-CPU build).

In one case a local variable gets converted to a static one, possible
because the function gets called at most once (during early boot).

Some accessors get eliminated altogether as being unused or as being
equally well open coded at the place of use.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/apic.c
+++ b/xen/arch/x86/apic.c
@@ -1464,7 +1464,8 @@ int __init APIC_init_uniprocessor (void)
 #ifdef CONFIG_CRASH_DUMP
     boot_cpu_physical_apicid =3D get_apic_id();
 #endif
-    phys_cpu_present_map =3D physid_mask_of_physid(boot_cpu_physical_apici=
d);
+    physids_clear(phys_cpu_present_map);
+    physid_set(boot_cpu_physical_apicid, phys_cpu_present_map);
=20
     setup_local_APIC();
=20
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -1463,7 +1463,7 @@ void disable_IO_APIC(void)
 static void __init setup_ioapic_ids_from_mpc(void)
 {
     union IO_APIC_reg_00 reg_00;
-    physid_mask_t phys_id_present_map;
+    static physid_mask_t __initdata phys_id_present_map;
     int apic;
     int i;
     unsigned char old_id;
@@ -1481,7 +1481,7 @@ static void __init setup_ioapic_ids_from
      * This is broken; anything with a real cpu count has to
      * circumvent this idiocy regardless.
      */
-    phys_id_present_map =3D ioapic_phys_id_map(phys_cpu_present_map);
+    ioapic_phys_id_map(&phys_id_present_map);
=20
     /*
      * Set the IOAPIC ID to the value stored in the MPC table.
@@ -1508,7 +1508,7 @@ static void __init setup_ioapic_ids_from
          * system must have a unique ID or we get lots of nice
          * 'stuck on smp_invalidate_needed IPI wait' messages.
          */
-        if (check_apicid_used(phys_id_present_map,
+        if (check_apicid_used(&phys_id_present_map,
                               mp_ioapics[apic].mpc_apicid)) {
             printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already =
used!...\n",
                    apic, mp_ioapics[apic].mpc_apicid);
@@ -1519,17 +1519,13 @@ static void __init setup_ioapic_ids_from
                 panic("Max APIC ID exceeded!\n");
             printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n"=
,
                    i);
-            physid_set(i, phys_id_present_map);
             mp_ioapics[apic].mpc_apicid =3D i;
         } else {
-            physid_mask_t tmp;
-            tmp =3D apicid_to_cpu_present(mp_ioapics[apic].mpc_apicid);
             apic_printk(APIC_VERBOSE, "Setting %d in the "
                         "phys_id_present_map\n",
                         mp_ioapics[apic].mpc_apicid);
-            physids_or(phys_id_present_map, phys_id_present_map, tmp);
         }
-
+        set_apicid(mp_ioapics[apic].mpc_apicid, &phys_id_present_map);
=20
         /*
          * We need to adjust the IRQ routing table
@@ -2195,7 +2191,6 @@ int __init io_apic_get_unique_id (int io
 {
     union IO_APIC_reg_00 reg_00;
     static physid_mask_t __initdata apic_id_map =3D PHYSID_MASK_NONE;
-    physid_mask_t tmp;
     unsigned long flags;
     int i =3D 0;
=20
@@ -2209,7 +2204,7 @@ int __init io_apic_get_unique_id (int io
      */
=20
     if (physids_empty(apic_id_map))
-        apic_id_map =3D ioapic_phys_id_map(phys_cpu_present_map);
+        ioapic_phys_id_map(&apic_id_map);
=20
     spin_lock_irqsave(&ioapic_lock, flags);
     reg_00.raw =3D io_apic_read(ioapic, 0);
@@ -2225,10 +2220,10 @@ int __init io_apic_get_unique_id (int io
      * Every APIC in a system must have a unique ID or we get lots of =
nice=20
      * 'stuck on smp_invalidate_needed IPI wait' messages.
      */
-    if (check_apicid_used(apic_id_map, apic_id)) {
+    if (check_apicid_used(&apic_id_map, apic_id)) {
=20
         for (i =3D 0; i < get_physical_broadcast(); i++) {
-            if (!check_apicid_used(apic_id_map, i))
+            if (!check_apicid_used(&apic_id_map, i))
                 break;
         }
=20
@@ -2241,8 +2236,7 @@ int __init io_apic_get_unique_id (int io
         apic_id =3D i;
     }=20
=20
-    tmp =3D apicid_to_cpu_present(apic_id);
-    physids_or(apic_id_map, apic_id_map, tmp);
+    set_apicid(apic_id, &apic_id_map);
=20
     if (reg_00.bits.ID !=3D apic_id) {
         reg_00.bits.ID =3D apic_id;
--- a/xen/arch/x86/mpparse.c
+++ b/xen/arch/x86/mpparse.c
@@ -89,7 +89,6 @@ static int __devinit MP_processor_info_x
 					 u32 apicidx, bool_t hotplug)
 {
  	int ver, apicid, cpu =3D 0;
-	physid_mask_t phys_cpu;
  =09
 	if (!(m->mpc_cpuflag & CPU_ENABLED))
 		return -EINVAL;
@@ -114,8 +113,7 @@ static int __devinit MP_processor_info_x
 	}
 	apic_version[apicid] =3D ver;
=20
-	phys_cpu =3D apicid_to_cpu_present(apicid);
-	physids_or(phys_cpu_present_map, phys_cpu_present_map, phys_cpu);
+	set_apicid(apicid, &phys_cpu_present_map);
=20
 	if (num_processors >=3D NR_CPUS) {
 		printk(KERN_WARNING "WARNING: NR_CPUS limit of %i =
reached."
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -752,7 +752,8 @@ void __init smp_prepare_cpus(unsigned in
     {
         printk(KERN_NOTICE "SMP motherboard not detected.\n");
     init_uniprocessor:
-        phys_cpu_present_map =3D physid_mask_of_physid(0);
+        physids_clear(phys_cpu_present_map);
+        physid_set(0, phys_cpu_present_map);
         if (APIC_init_uniprocessor())
             printk(KERN_NOTICE "Local APIC not detected."
                    " Using dummy APIC emulation.\n");
@@ -767,7 +768,7 @@ void __init smp_prepare_cpus(unsigned in
      * CPU too, but we do it for the sake of robustness anyway.
      * Makes no sense to do this check in clustered apic mode, so skip it
      */
-    if ( !check_phys_apicid_present(boot_cpu_physical_apicid) )
+    if ( !check_apicid_present(boot_cpu_physical_apicid) )
     {
         printk("weird, boot CPU (#%d) not listed by the BIOS.\n",
                boot_cpu_physical_apicid);
--- a/xen/include/asm-x86/mach-generic/mach_apic.h
+++ b/xen/include/asm-x86/mach-generic/mach_apic.h
@@ -58,29 +58,24 @@ static inline int apic_id_registered(voi
 			    phys_cpu_present_map);
 }
=20
-static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
+static inline void ioapic_phys_id_map(physid_mask_t *map)
 {
-	return phys_map;
+	*map =3D phys_cpu_present_map;
 }
=20
-static inline unsigned long check_apicid_used(physid_mask_t bitmap, int =
apicid)
+static inline int check_apicid_used(const physid_mask_t *map, int apicid)
 {
-	return physid_isset(apicid, bitmap);
+	return physid_isset(apicid, *map);
 }
=20
-static inline unsigned long check_apicid_present(int apicid)
+static inline int check_apicid_present(int apicid)
 {
 	return physid_isset(apicid, phys_cpu_present_map);
 }
=20
-static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
+static inline void set_apicid(int phys_apicid, physid_mask_t *map)
 {
-	return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map)=
;
-}
-
-static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
-{
-	return physid_mask_of_physid(phys_apicid);
+	physid_set(phys_apicid, *map);
 }
=20
 #endif /* __ASM_MACH_APIC_H */
--- a/xen/include/asm-x86/mpspec.h
+++ b/xen/include/asm-x86/mpspec.h
@@ -50,23 +50,6 @@ typedef struct physid_mask physid_mask_t
 #define physids_empty(map)			bitmap_empty((map).mask, =
MAX_APICS)
 #define physids_equal(map1, map2)		bitmap_equal((map1).mask, =
(map2).mask, MAX_APICS)
 #define physids_weight(map)			bitmap_weight((map).mask, =
MAX_APICS)
-#define physids_shift_right(d, s, n)		bitmap_shift_right((d).mask=
, (s).mask, n, MAX_APICS)
-#define physids_shift_left(d, s, n)		bitmap_shift_left((d).mask,=
 (s).mask, n, MAX_APICS)
-#define physids_coerce(map)			((map).mask[0])
-
-#define physids_promote(physids)						=
\
-	({									=
\
-		physid_mask_t __physid_mask =3D PHYSID_MASK_NONE;		=
	\
-		__physid_mask.mask[0] =3D physids;				=
\
-		__physid_mask;							=
\
-	})
-
-#define physid_mask_of_physid(physid)						=
\
-	({									=
\
-		physid_mask_t __physid_mask =3D PHYSID_MASK_NONE;		=
	\
-		physid_set(physid, __physid_mask);				=
\
-		__physid_mask;							=
\
-	})
=20
 #define PHYSID_MASK_ALL		{ {[0 ... PHYSID_ARRAY_SIZE-1] =3D =
~0UL} }
 #define PHYSID_MASK_NONE	{ {[0 ... PHYSID_ARRAY_SIZE-1] =3D 0UL} }



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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 02:04:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 02:04:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REdga-0005S7-JK; Fri, 14 Oct 2011 02:04:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REdcE-0004mg-MU
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 01:59:45 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318582751!41879334!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30526 invoked from network); 14 Oct 2011 08:59:11 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Oct 2011 08:59:11 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1REdc8-000IwE-A0; Fri, 14 Oct 2011 08:59:36 +0000
Date: Fri, 14 Oct 2011 09:59:36 +0100
From: Tim Deegan <tim@xen.org>
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] p2m: use xzalloc() for struct p2m_domain allocation
Message-ID: <20111014085936.GB72702@ocelot.phlegethon.org>
References: <4E980034020000780005B559@nat28.tlf.novell.com>
	<CABDAA88.22EDE%keir.xen@gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CABDAA88.22EDE%keir.xen@gmail.com>
User-Agent: Mutt/1.4.2.1i
Cc: "xen-devel@lists.xensource.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

At 08:59 +0100 on 14 Oct (1318582792), Keir Fraser wrote:
> On 14/10/2011 08:26, "Jan Beulich" <JBeulich@suse.com> wrote:
> 
> > Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> I'll leave this one for Tim to ack/nack.

Acked-by: Tim Deegan <tim@xen.org>

> > --- a/xen/arch/x86/mm/p2m.c
> > +++ b/xen/arch/x86/mm/p2m.c
> > @@ -71,7 +71,6 @@ boolean_param("hap_2mb", opt_hap_2mb);
> >  /* Init the datastructures for later use by the p2m code */
> >  static void p2m_initialise(struct domain *d, struct p2m_domain *p2m)
> >  {
> > -    memset(p2m, 0, sizeof(*p2m));
> >      mm_lock_init(&p2m->lock);
> >      INIT_LIST_HEAD(&p2m->np2m_list);
> >      INIT_PAGE_LIST_HEAD(&p2m->pages);
> > @@ -100,7 +99,7 @@ p2m_init_nestedp2m(struct domain *d)
> >  
> >      mm_lock_init(&d->arch.nested_p2m_lock);
> >      for (i = 0; i < MAX_NESTEDP2M; i++) {
> > -        d->arch.nested_p2m[i] = p2m = xmalloc(struct p2m_domain);
> > +        d->arch.nested_p2m[i] = p2m = xzalloc(struct p2m_domain);
> >          if (p2m == NULL)
> >              return -ENOMEM;
> >          p2m_initialise(d, p2m);
> > @@ -115,7 +114,7 @@ int p2m_init(struct domain *d)
> >  {
> >      struct p2m_domain *p2m;
> >  
> > -    p2m_get_hostp2m(d) = p2m = xmalloc(struct p2m_domain);
> > +    p2m_get_hostp2m(d) = p2m = xzalloc(struct p2m_domain);
> >      if ( p2m == NULL )
> >          return -ENOMEM;
> >      p2m_initialise(d, p2m);
> > 
> > 
> > 
> > 
> > _______________________________________________
> > 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 Oct 14 02:12:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 02:12:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REdow-0006ED-Na; Fri, 14 Oct 2011 02:12:50 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REdkz-0005vf-6C
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 02:08:55 -0700
X-Env-Sender: silverbottlep@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318583287!59153781!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30139 invoked from network); 14 Oct 2011 09:08:08 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 09:08:08 -0000
Received: by gyg13 with SMTP id 13so2415988gyg.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 02:08:37 -0700 (PDT)
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
	:content-type:content-transfer-encoding;
	bh=anx72C4CT0FW7k45ai48ZBvDSGU251b5ZysKPgC84yg=;
	b=FM9NBZr3becQGhkMCE9ULDAle11EGomQfgbbn83fkwuELuWCjC70i8ARYDmbfNHuZZ
	zjsvxCPCVtzh5nEKR3ylOwoF4VbsFAvYX1mp9NzNF4cvUdOSX8jHB1INO0Lbvd0tMvLX
	cegJmb2ydoDY6T5hN0Zk2H8UjDb0hhBeCHOts=
Received: by 10.68.35.97 with SMTP id g1mr15680738pbj.38.1318583317125;
	Fri, 14 Oct 2011 02:08:37 -0700 (PDT)
Received: from [192.168.2.124] ([112.169.222.30])
	by mx.google.com with ESMTPS id w4sm20902436pbf.6.2011.10.14.02.08.34
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 02:08:36 -0700 (PDT)
Message-ID: <4E97FC2A.8080004@gmail.com>
Date: Fri, 14 Oct 2011 18:08:58 +0900
From: Eunbyung Park <silverbottlep@gmail.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: george.dunlap@eu.citrix.com
Content-Type: text/plain; charset=EUC-KR
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] deadlock in the 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

IMHO, it seems to be deadlock when changing dom0's weight in credit2
scheduler.

when the sched_adjust() in schedule.c is called, it grabs the
schedule_lock after pausing all of the vcpus

and then, csched_dom_cntl in sched_credit2.c, it also grab the
schedule_lock by using vcpu_schedule_lock_irq().

In the credit2, all of the percpu schedule_lock points out same runqueue
lock if they belong to same runqueue.

Eventually, all of vcpu are paused except for itself running the code,
and it try to grab schedule_lock that was grabbed by itself.

Am I right? If I was wrong, please tell me my misunderstanding.

And, I have a question about the code, where are in sched_adjust() in
schedule.c

if ( d == current->domain )
vcpu_schedule_lock_irq(current);

It was very hard to understan for me..:) What does it exactly mean?

I would be very grateful for any comments

-- 
Best Regards,
Eunbyung Park


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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 02:16:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 02:16:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REdsK-0006kH-Pp; Fri, 14 Oct 2011 02:16:20 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REdr8-0006Ww-TF
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 02:15:09 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1318583703!31569159!1
X-Originating-IP: [74.125.82.41]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17232 invoked from network); 14 Oct 2011 09:15:03 -0000
Received: from mail-ww0-f41.google.com (HELO mail-ww0-f41.google.com)
	(74.125.82.41)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 09:15:03 -0000
Received: by wwf10 with SMTP id 10so1366223wwf.0
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 02:15:03 -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=bpg7JvRYl+WGi2xgpyzpb7puQ0il3rtjeHpvY/FmtT0=;
	b=M6JxwNaczjPW+HilkCeZgqyaQ2jN28gN8IUhfIO1ghadztwij/6nmSC3hlj+A38edo
	MzJPq0od1OXJR6ZVt7fTztvMzVHigm4miFES/wMXodGZj14PigAWkpqeX1HAdlEJ/np6
	KcEzk4FudF8v6pIJ+4sUc9KSfbgqm/W7EvExM=
Received: by 10.216.163.202 with SMTP id a52mr2486995wel.91.1318583703340;
	Fri, 14 Oct 2011 02:15:03 -0700 (PDT)
Received: from [192.168.1.3] (host86-129-236-135.range86-129.btcentralplus.com.
	[86.129.236.135])
	by mx.google.com with ESMTPS id l9sm13054310wba.5.2011.10.14.02.15.01
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 02:15:02 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 14 Oct 2011 10:14:55 +0100
Subject: Re: [Xen-devel] [PATCH] x86: clean up physid_mask_t handling
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CABDBC1F.32A74%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] x86: clean up physid_mask_t handling
Thread-Index: AcyKUby3PLTcww6jnkCxXoHRGeGZ6w==
In-Reply-To: <4E9815A8020000780005B5DA@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 14/10/2011 09:57, "Jan Beulich" <JBeulich@suse.com> wrote:

> This eliminates passing and returning by value of this type (making it
> unnecessary for the compiler to create temporary variables for doing so
> on the stack), thus dramatically reducing the stack frame sizes of a
> couple of functions (was in one case over 12k for a 4095-CPU build).
> 
> In one case a local variable gets converted to a static one, possible
> because the function gets called at most once (during early boot).
> 
> Some accessors get eliminated altogether as being unused or as being
> equally well open coded at the place of use.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

> --- a/xen/arch/x86/apic.c
> +++ b/xen/arch/x86/apic.c
> @@ -1464,7 +1464,8 @@ int __init APIC_init_uniprocessor (void)
>  #ifdef CONFIG_CRASH_DUMP
>      boot_cpu_physical_apicid = get_apic_id();
>  #endif
> -    phys_cpu_present_map = physid_mask_of_physid(boot_cpu_physical_apicid);
> +    physids_clear(phys_cpu_present_map);
> +    physid_set(boot_cpu_physical_apicid, phys_cpu_present_map);
>  
>      setup_local_APIC();
>  
> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -1463,7 +1463,7 @@ void disable_IO_APIC(void)
>  static void __init setup_ioapic_ids_from_mpc(void)
>  {
>      union IO_APIC_reg_00 reg_00;
> -    physid_mask_t phys_id_present_map;
> +    static physid_mask_t __initdata phys_id_present_map;
>      int apic;
>      int i;
>      unsigned char old_id;
> @@ -1481,7 +1481,7 @@ static void __init setup_ioapic_ids_from
>       * This is broken; anything with a real cpu count has to
>       * circumvent this idiocy regardless.
>       */
> -    phys_id_present_map = ioapic_phys_id_map(phys_cpu_present_map);
> +    ioapic_phys_id_map(&phys_id_present_map);
>  
>      /*
>       * Set the IOAPIC ID to the value stored in the MPC table.
> @@ -1508,7 +1508,7 @@ static void __init setup_ioapic_ids_from
>           * system must have a unique ID or we get lots of nice
>           * 'stuck on smp_invalidate_needed IPI wait' messages.
>           */
> -        if (check_apicid_used(phys_id_present_map,
> +        if (check_apicid_used(&phys_id_present_map,
>                                mp_ioapics[apic].mpc_apicid)) {
>              printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already
> used!...\n",
>                     apic, mp_ioapics[apic].mpc_apicid);
> @@ -1519,17 +1519,13 @@ static void __init setup_ioapic_ids_from
>                  panic("Max APIC ID exceeded!\n");
>              printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
>                     i);
> -            physid_set(i, phys_id_present_map);
>              mp_ioapics[apic].mpc_apicid = i;
>          } else {
> -            physid_mask_t tmp;
> -            tmp = apicid_to_cpu_present(mp_ioapics[apic].mpc_apicid);
>              apic_printk(APIC_VERBOSE, "Setting %d in the "
>                          "phys_id_present_map\n",
>                          mp_ioapics[apic].mpc_apicid);
> -            physids_or(phys_id_present_map, phys_id_present_map, tmp);
>          }
> -
> +        set_apicid(mp_ioapics[apic].mpc_apicid, &phys_id_present_map);
>  
>          /*
>           * We need to adjust the IRQ routing table
> @@ -2195,7 +2191,6 @@ int __init io_apic_get_unique_id (int io
>  {
>      union IO_APIC_reg_00 reg_00;
>      static physid_mask_t __initdata apic_id_map = PHYSID_MASK_NONE;
> -    physid_mask_t tmp;
>      unsigned long flags;
>      int i = 0;
>  
> @@ -2209,7 +2204,7 @@ int __init io_apic_get_unique_id (int io
>       */
>  
>      if (physids_empty(apic_id_map))
> -        apic_id_map = ioapic_phys_id_map(phys_cpu_present_map);
> +        ioapic_phys_id_map(&apic_id_map);
>  
>      spin_lock_irqsave(&ioapic_lock, flags);
>      reg_00.raw = io_apic_read(ioapic, 0);
> @@ -2225,10 +2220,10 @@ int __init io_apic_get_unique_id (int io
>       * Every APIC in a system must have a unique ID or we get lots of nice
>       * 'stuck on smp_invalidate_needed IPI wait' messages.
>       */
> -    if (check_apicid_used(apic_id_map, apic_id)) {
> +    if (check_apicid_used(&apic_id_map, apic_id)) {
>  
>          for (i = 0; i < get_physical_broadcast(); i++) {
> -            if (!check_apicid_used(apic_id_map, i))
> +            if (!check_apicid_used(&apic_id_map, i))
>                  break;
>          }
>  
> @@ -2241,8 +2236,7 @@ int __init io_apic_get_unique_id (int io
>          apic_id = i;
>      } 
>  
> -    tmp = apicid_to_cpu_present(apic_id);
> -    physids_or(apic_id_map, apic_id_map, tmp);
> +    set_apicid(apic_id, &apic_id_map);
>  
>      if (reg_00.bits.ID != apic_id) {
>          reg_00.bits.ID = apic_id;
> --- a/xen/arch/x86/mpparse.c
> +++ b/xen/arch/x86/mpparse.c
> @@ -89,7 +89,6 @@ static int __devinit MP_processor_info_x
> u32 apicidx, bool_t hotplug)
>  {
> int ver, apicid, cpu = 0;
> - physid_mask_t phys_cpu;
> 
> if (!(m->mpc_cpuflag & CPU_ENABLED))
> return -EINVAL;
> @@ -114,8 +113,7 @@ static int __devinit MP_processor_info_x
> }
> apic_version[apicid] = ver;
>  
> - phys_cpu = apicid_to_cpu_present(apicid);
> - physids_or(phys_cpu_present_map, phys_cpu_present_map, phys_cpu);
> + set_apicid(apicid, &phys_cpu_present_map);
>  
> if (num_processors >= NR_CPUS) {
> printk(KERN_WARNING "WARNING: NR_CPUS limit of %i reached."
> --- a/xen/arch/x86/smpboot.c
> +++ b/xen/arch/x86/smpboot.c
> @@ -752,7 +752,8 @@ void __init smp_prepare_cpus(unsigned in
>      {
>          printk(KERN_NOTICE "SMP motherboard not detected.\n");
>      init_uniprocessor:
> -        phys_cpu_present_map = physid_mask_of_physid(0);
> +        physids_clear(phys_cpu_present_map);
> +        physid_set(0, phys_cpu_present_map);
>          if (APIC_init_uniprocessor())
>              printk(KERN_NOTICE "Local APIC not detected."
>                     " Using dummy APIC emulation.\n");
> @@ -767,7 +768,7 @@ void __init smp_prepare_cpus(unsigned in
>       * CPU too, but we do it for the sake of robustness anyway.
>       * Makes no sense to do this check in clustered apic mode, so skip it
>       */
> -    if ( !check_phys_apicid_present(boot_cpu_physical_apicid) )
> +    if ( !check_apicid_present(boot_cpu_physical_apicid) )
>      {
>          printk("weird, boot CPU (#%d) not listed by the BIOS.\n",
>                 boot_cpu_physical_apicid);
> --- a/xen/include/asm-x86/mach-generic/mach_apic.h
> +++ b/xen/include/asm-x86/mach-generic/mach_apic.h
> @@ -58,29 +58,24 @@ static inline int apic_id_registered(voi
>    phys_cpu_present_map);
>  }
>  
> -static inline physid_mask_t ioapic_phys_id_map(physid_mask_t phys_map)
> +static inline void ioapic_phys_id_map(physid_mask_t *map)
>  {
> - return phys_map;
> + *map = phys_cpu_present_map;
>  }
>  
> -static inline unsigned long check_apicid_used(physid_mask_t bitmap, int
> apicid)
> +static inline int check_apicid_used(const physid_mask_t *map, int apicid)
>  {
> - return physid_isset(apicid, bitmap);
> + return physid_isset(apicid, *map);
>  }
>  
> -static inline unsigned long check_apicid_present(int apicid)
> +static inline int check_apicid_present(int apicid)
>  {
> return physid_isset(apicid, phys_cpu_present_map);
>  }
>  
> -static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
> +static inline void set_apicid(int phys_apicid, physid_mask_t *map)
>  {
> - return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map);
> -}
> -
> -static inline physid_mask_t apicid_to_cpu_present(int phys_apicid)
> -{
> - return physid_mask_of_physid(phys_apicid);
> + physid_set(phys_apicid, *map);
>  }
>  
>  #endif /* __ASM_MACH_APIC_H */
> --- a/xen/include/asm-x86/mpspec.h
> +++ b/xen/include/asm-x86/mpspec.h
> @@ -50,23 +50,6 @@ typedef struct physid_mask physid_mask_t
>  #define physids_empty(map)   bitmap_empty((map).mask, MAX_APICS)
>  #define physids_equal(map1, map2)  bitmap_equal((map1).mask, (map2).mask,
> MAX_APICS)
>  #define physids_weight(map)   bitmap_weight((map).mask, MAX_APICS)
> -#define physids_shift_right(d, s, n)  bitmap_shift_right((d).mask, (s).mask,
> n, MAX_APICS)
> -#define physids_shift_left(d, s, n)  bitmap_shift_left((d).mask, (s).mask, n,
> MAX_APICS)
> -#define physids_coerce(map)   ((map).mask[0])
> -
> -#define physids_promote(physids)      \
> - ({         \
> -  physid_mask_t __physid_mask = PHYSID_MASK_NONE;   \
> -  __physid_mask.mask[0] = physids;    \
> -  __physid_mask;       \
> - })
> -
> -#define physid_mask_of_physid(physid)      \
> - ({         \
> -  physid_mask_t __physid_mask = PHYSID_MASK_NONE;   \
> -  physid_set(physid, __physid_mask);    \
> -  __physid_mask;       \
> - })
>  
>  #define PHYSID_MASK_ALL  { {[0 ... PHYSID_ARRAY_SIZE-1] = ~0UL} }
>  #define PHYSID_MASK_NONE { {[0 ... PHYSID_ARRAY_SIZE-1] = 0UL} }
> 
> 
> 
> _______________________________________________
> 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 Oct 14 02:59:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 02:59:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REeXq-0000A3-Vg; Fri, 14 Oct 2011 02:59:15 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1REeVq-0008Nx-Or
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 02:57:11 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-5.tower-21.messagelabs.com!1318586227!110402!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9465 invoked from network); 14 Oct 2011 09:57:07 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-5.tower-21.messagelabs.com with SMTP;
	14 Oct 2011 09:57:07 -0000
Received: from [213.136.142.20] (account d.faggioli@sssup.it HELO
	[192.168.0.3]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72398123; Fri, 14 Oct 2011 11:57:06 +0200
From: Dario Faggioli <raistlin@linux.it>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Fri, 14 Oct 2011 11:57:05 +0200
In-Reply-To: <4E9495F6.4070301@tycho.nsa.gov>
References: <1318353219.21925.80.camel@Palantir>
	<20111011173228.GB32406@phenom.oracle.com>
	<4E9495F6.4070301@tycho.nsa.gov>
Face: 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
X-Mailer: Evolution 3.0.3 (3.0.3-1.fc15) 
Message-ID: <1318586226.5062.21.camel@Palantir>
Mime-Version: 1.0
Cc: xen-devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH] xen/gntdev: Fix sleep-inside-spinlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============2002520731=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============2002520731==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-JD1zMBVXNDYqoiLXabL2"


--=-JD1zMBVXNDYqoiLXabL2
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Tue, 2011-10-11 at 15:16 -0400, Daniel De Graaf wrote:
> gntdev_put_map tries to acquire a mutex when freeing pages back to the
> xenballoon pool, so it cannot be called with a spinlock held. In
> gntdev_release, the spinlock is not needed as we are freeing the
> structure later; in the ioctl, only the list manipulation needs to be
> under the lock.
>=20
> Reported-By: Dario Faggioli <raistlin@linux.it>
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
>
Ok, I finally manage in testing this, and it actually cures the issue
here!

You can add a tested-by tag if you like. Just, if you don't mind, use my
corp. e-mail for (both?) the tag(s): <dario.faggioli@citrix.com>

Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-JD1zMBVXNDYqoiLXabL2
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

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

iEYEABECAAYFAk6YB3EACgkQk4XaBE3IOsTWOgCgh3Omp3d71blo4KRnomJHcBE9
twUAoKFRdGI0PVRXhgNNmm9VX+wYa84r
=nqFl
-----END PGP SIGNATURE-----

--=-JD1zMBVXNDYqoiLXabL2--



--===============2002520731==
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

--===============2002520731==--



From xen-devel-bounces@lists.xensource.com Fri Oct 14 03:02:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 03:02:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REeb6-0000c0-MN; Fri, 14 Oct 2011 03:02:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1REeZK-0000Lo-6z
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 03:00:52 -0700
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318586442!1006009!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11095 invoked from network); 14 Oct 2011 10:00:42 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-7.tower-216.messagelabs.com with SMTP;
	14 Oct 2011 10:00:42 -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 p9EA0fTV016764
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <xen-devel@lists.xensource.com>; Fri, 14 Oct 2011 06:00:41 -0400
Received: from [10.34.1.169] (dhcp-1-169.brq.redhat.com [10.34.1.169])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9EA0eXA016451
	for <xen-devel@lists.xensource.com>; Fri, 14 Oct 2011 06:00:41 -0400
Message-ID: <4E9808A3.9090501@redhat.com>
Date: Fri, 14 Oct 2011 12:02:11 +0200
From: Laszlo Ersek <lersek@redhat.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.20) Gecko/20110817 Fedora/3.1.12-1.fc14
	Lightning/1.0b3pre Mnenhy/0.8.4 Thunderbird/3.1.12
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Content-Type: multipart/mixed; boundary="------------090001020003000609000206"
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
Subject: [Xen-devel] [RFC PATCH] return -EINVAL when trying to kick/kill a
 nonexistent domain watchdog
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.
--------------090001020003000609000206
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

... to be more in-line with the NR_DOMAIN_WATCHDOG_TIMERS check at the 
top of domain_watchdog(), and also to follow the timer_(delete|settime) 
POSIX API's EINVAL return value.

Signed-off-by: Laszlo Ersek <lersek@redhat.com>

--------------090001020003000609000206
Content-Type: text/plain;
 name="einval_upstream.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="einval_upstream.patch"

diff -r 4b0907c6a08c xen/common/schedule.c
--- a/xen/common/schedule.c	Tue Oct 11 12:02:58 2011 +0100
+++ b/xen/common/schedule.c	Fri Oct 14 11:55:00 2011 +0200
@@ -763,7 +763,7 @@ static long domain_watchdog(struct domai
     if ( !test_bit(id, &d->watchdog_inuse_map) )
     {
         spin_unlock(&d->watchdog_lock);
-        return -EEXIST;
+        return -EINVAL;
     }
 
     if ( timeout == 0 )

--------------090001020003000609000206
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

--------------090001020003000609000206--


From xen-devel-bounces@lists.xensource.com Fri Oct 14 03:25:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 03:25:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REexJ-0001Kw-BZ; Fri, 14 Oct 2011 03:25:33 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REewW-000183-BW
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 03:24:44 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1318587880!1014872!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29236 invoked from network); 14 Oct 2011 10:24:41 -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; 14 Oct 2011 10:24:41 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 14 Oct 2011 11:24:39 +0100
Message-Id: <4E982A07020000780005B629@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 14 Oct 2011 11:24:39 +0100
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] x86/MSI: drop local cpumask_t variable from
	msi_compose_msg()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 function gets called only during initialization/resume (when no
other CPUs are running) or with the IRQ descriptor lock held, so
there's no way for the CPU mask to change under its feet.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/msi.c
+++ b/xen/arch/x86/msi.c
@@ -123,18 +123,16 @@ static void msix_put_fixmap(struct pci_d
 void msi_compose_msg(struct irq_desc *desc, struct msi_msg *msg)
 {
     unsigned dest;
-    cpumask_t domain;
     struct irq_cfg *cfg =3D desc->chip_data;
     int vector =3D cfg->vector;
-    domain =3D cfg->cpu_mask;
=20
-    if ( cpus_empty( domain ) ) {
+    if ( cpus_empty(cfg->cpu_mask) ) {
         dprintk(XENLOG_ERR,"%s, compose msi message error!!\n", __func__);=

-	    return;
+        return;
     }
=20
     if ( vector ) {
-        dest =3D cpu_mask_to_apicid(&domain);
+        dest =3D cpu_mask_to_apicid(&cfg->cpu_mask);
=20
         msg->address_hi =3D MSI_ADDR_BASE_HI;
         msg->address_lo =3D




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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 04:20:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 04:20:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REfoI-0004Ip-Nl; Fri, 14 Oct 2011 04:20:18 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1REfnJ-00045P-7T
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 04:19:17 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-11.tower-182.messagelabs.com!1318591153!20491340!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9385 invoked from network); 14 Oct 2011 11:19:14 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-11.tower-182.messagelabs.com with SMTP;
	14 Oct 2011 11:19:14 -0000
Received: from [213.136.142.20] (account d.faggioli@sssup.it HELO
	[192.168.0.3]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72400856; Fri, 14 Oct 2011 13:19:13 +0200
Subject: Re: [Xen-devel] Re: [PATCH] xen/gntdev: Fix sleep-inside-spinlock
From: Dario Faggioli <raistlin@linux.it>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Fri, 14 Oct 2011 13:18:50 +0200
In-Reply-To: <1318523187.5062.8.camel@Palantir>
References: <1318353219.21925.80.camel@Palantir>
	<20111011173228.GB32406@phenom.oracle.com>
	<4E9495F6.4070301@tycho.nsa.gov>
	<20111013154053.GA12588@phenom.oracle.com>
	<1318523187.5062.8.camel@Palantir>
Face: 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
X-Mailer: Evolution 3.0.3 (3.0.3-1.fc15) 
Message-ID: <1318591153.5062.28.camel@Palantir>
Mime-Version: 1.0
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	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>
Content-Type: multipart/mixed; boundary="===============0803074853=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============0803074853==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-oZVlkqIXtcMzAZxhjX9C"


--=-oZVlkqIXtcMzAZxhjX9C
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Thu, 2011-10-13 at 18:26 +0200, Dario Faggioli wrote:
> On Thu, 2011-10-13 at 11:40 -0400, Konrad Rzeszutek Wilk wrote:
> > Dario, does the patch fix the problem for you?
> >=20
> Here I am, and sorry for being late, I had issues with a testbox and
> needed to setup a new one.
>
> [    6.129478] BUG: scheduling while atomic: swapper/0/0x10000002
> [    6.129483] no locks held by swapper/0.
> [    6.129487] Pid: 0, comm: swapper Not tainted 3.1.0-rc9+ #14
> [    6.129492] Call Trace:
> [ ... ]
>
For the records, this is still there for baremetal and dom0 kernel, but
it doesn't bother any longer my pv-domU. Actually, it is complaining
about something different now, but it is able to boot and run.

I'll dig it a bit more and start a new thread if that will be the case.

Thanks and Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-oZVlkqIXtcMzAZxhjX9C
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

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

iEYEABECAAYFAk6YGpoACgkQk4XaBE3IOsSH2wCgkcKc4i7ILjm0u9I4YieHFniI
gxwAoInOEf6HCx8sBRRDx22hjMhdNe9R
=Bd2M
-----END PGP SIGNATURE-----

--=-oZVlkqIXtcMzAZxhjX9C--



--===============0803074853==
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

--===============0803074853==--



From xen-devel-bounces@lists.xensource.com Fri Oct 14 04:47:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 04:47:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REgF5-0005Ew-16; Fri, 14 Oct 2011 04:47:59 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REgEE-00052x-Qr
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 04:47:07 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318592822!1034392!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15121 invoked from network); 14 Oct 2011 11:47:03 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 11:47:03 -0000
Received: by iaen33 with SMTP id n33so3242056iae.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 04:47:02 -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=CdxYVNLmtnTMkbe6f3FZ/kCveTRE/Q7QagRlU32OwrM=;
	b=Ta4poGLyCykIZgw4UwMKGo3N+Kl2plcjRcQCInxS1YiGD6RVegYg++JYSKH0LErIkw
	BONsxD4JG3sKVzgMffhWo23ZyFNMA6bi0yRlg0BO+hfikuJoTDsF7P2svKh1Vcpk528X
	Tom2eBmf6d6MK6k2C7/wFr0TbwidI9CzC/qW0=
MIME-Version: 1.0
Received: by 10.43.130.133 with SMTP id hm5mr15646550icc.11.1318592822370;
	Fri, 14 Oct 2011 04:47:02 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Fri, 14 Oct 2011 04:47:02 -0700 (PDT)
In-Reply-To: <4E97FC2A.8080004@gmail.com>
References: <4E97FC2A.8080004@gmail.com>
Date: Fri, 14 Oct 2011 12:47:02 +0100
X-Google-Sender-Auth: YH_-XTvLzgEBpApnJNfwhNJTFCM
Message-ID: <CAFLBxZZfH88_-+4i_j8dz3qTh+grxc2wUxuh0e6f7jiV4t9zzQ@mail.gmail.com>
Subject: Re: [Xen-devel] deadlock in the credit2
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Eunbyung Park <silverbottlep@gmail.com>, Keir Fraser <keir@xen.org>
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

2011/10/14 Eunbyung Park <silverbottlep@gmail.com>:
> IMHO, it seems to be deadlock when changing dom0's weight in credit2
> scheduler.
>
> when the sched_adjust() in schedule.c is called, it grabs the
> schedule_lock after pausing all of the vcpus
>
> and then, csched_dom_cntl in sched_credit2.c, it also grab the
> schedule_lock by using vcpu_schedule_lock_irq().
>
> In the credit2, all of the percpu schedule_lock points out same runqueue
> lock if they belong to same runqueue.
>
> Eventually, all of vcpu are paused except for itself running the code,
> and it try to grab schedule_lock that was grabbed by itself.
>
> Am I right? If I was wrong, please tell me my misunderstanding.

Hmm, I think you may have discovered the source of a bug that people
have been reporting but I haven't had time to look into yet.

Keir, I think that lock in schedule.c around SCHED(adjust) must be
wrong.  By the time we grab that lock, grabbing it will be completely
pointless.  What are we going to be racing against?  In any case, the
actual scheduler should be responsible for grabbing locks; there's no
reason that the scheduler can't grab whatever lock it needs inside
that function.  I haven't done a deep analysis, but my initial
instinct is to just get rid of it.  What do you think?

> if ( d == current->domain )
> vcpu_schedule_lock_irq(current);
>
> It was very hard to understan for me..:) What does it exactly mean?

You're asking what "current" means?  "current" is a macro that always
resolves to the vcpu which is running on the current processor.

sched_adjust() seems to be trying to avoid scheduling races in general
by pausing all vcpus before calling the per-scheduler function.  But
if a VM is calling the op on itself, the vcpu making the hypercall
can't pause itself.  So in that case (current->domain == d) will be
true, so sched_adjust() grab the schedule lock of that vm instead.

But really all that locking should be handled in the scheduler
function, not by the generic code.  It knows best what needs to be
locked when.

 -George

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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 05:07:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 05:07:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REgYG-00063E-1W; Fri, 14 Oct 2011 05:07:48 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1REgWh-0005q7-4W
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 05:06:28 -0700
X-Env-Sender: imammedo@redhat.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318593967!898860!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4347 invoked from network); 14 Oct 2011 12:06:07 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-2.tower-216.messagelabs.com with SMTP;
	14 Oct 2011 12:06:07 -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 p9EC66YW032338
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <xen-devel@lists.xensource.com>; Fri, 14 Oct 2011 08:06:06 -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 p9EC66Z2011072
	for <xen-devel@lists.xensource.com>; Fri, 14 Oct 2011 08:06:06 -0400
Received: from nial.usersys.redhat.com (dhcp-1-247.brq.redhat.com
	[10.34.1.247])
	by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id p9EC653F018511
	for <xen-devel@lists.xensource.com>; Fri, 14 Oct 2011 08:06:05 -0400
Message-ID: <4E9825AC.9050708@redhat.com>
Date: Fri, 14 Oct 2011 14:06:04 +0200
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
Subject: Re: [Xen-devel] Features and bug fixes for Linux kernel 3.2.
References: <20111013190946.GA16336@phenom.oracle.com>
In-Reply-To: <20111013190946.GA16336@phenom.oracle.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.12
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/13/2011 09:09 PM, Konrad Rzeszutek Wilk wrote:
> Hey,
>
> Please keep in mind that there is some outstanding work going on which
> could make it in 3.2 depending on when the merge window opens. I will
> enumerate those in the next email.
>
> Anyhow, for 3.2 Linux kernel we have these items loaded and ready to go:
>
>   - A new mechanism to parse the E820 resulting in better ballooning.
>   - hwclock support. Meaning you can do 'date XX' and it will be saved by machine.
>   - Support for PCI multi-segmented machines (big big iron boxes)
>   - Optimizations in DMA API.
>   - "feature-barrier" in the xen-blkback so that older kernels (SLES10)
>     can issue those.
>   - "feature-discard" so that TRIM/SCSI UNMAP operations can be utilized.
>   - kexec/kdump support for PVonHVM.
>   - Cleanups in the code (mostly scripts/cleanpatch.pl)
>   - Static analyzer (smatch) run results fixing bugs.
>   - Tons of bug fixes.
>
> If you think I missed something - please please email me immediately.
>
>
> The list is as follow.
>
> Dan Carpenter (1):
>        xen/pciback: double lock typo
>
> David Vrabel (9):
>        xen/balloon: account for pages released during memory setup
>        xen/balloon: simplify test for the end of usable RAM
>        xen: allow balloon driver to use more than one memory region
>        xen: allow extra memory to be in multiple regions
>        xen: release all pages within 1-1 p2m mappings
>        xen: use generic functions instead of xen_{alloc, free}_vm_area()
>        block: xen-blkback: use API provided by xenbus module to map rings
>        net: xen-netback: use API provided by xenbus module to map rings
>        xen: map foreign pages for shared rings by updating the PTEs directly
>
> Jan Beulich (5):
>        xen/pci: make bus notifier handler return sane values
>        xen/pciback: use mutex rather than spinlock in passthrough backend
>        xen/pciback: miscellaneous adjustments
>        xen/pci: support multi-segment systems
>        xen-blkback: use kzalloc() in favor of kmalloc()+memset()
>
> Jeremy Fitzhardinge (2):
>        xen: add dom0_op hypercall
>        xen/dom0: set wallclock time in Xen
>
> Joe Jin (1):
>        xen-blkback: fixed indentation and comments
>
> Konrad Rzeszutek Wilk (24):
>        Revert "xen/debug: WARN_ON when identity PFN has no _PAGE_IOMAP flag set."
>        xen-pcifront: Update warning comment to use 'e820_host' option.
>        xen-swiotlb: Retry up three times to allocate Xen-SWIOTLB
>        xen-swiotlb: Fix wrong panic.
>        xen-swiotlb: When doing coherent alloc/dealloc check before swizzling the MFNs.
>        xen/pciback: Use mutexes when working with Xenbus state transitions.
>        xen/pciback: use mutex rather than spinlock in vpci backend
>        xen/p2m: Make debug/xen/mmu/p2m visible again.
>        xen/p2m: Use SetPagePrivate and its friends for M2P overrides.
>        x86/paravirt: Partially revert "remove lazy mode in interrupts"

Have You meant ^^^ "x86/paravirt: PTE updates in k(un)map_atomic need to be synchronous, regardless of lazy_mmu mode" there?

>        xen/pv-on-hvm:kexec: Fix implicit declaration of function 'xen_hvm_domain'
>        xen/pciback: Do not dereference psdev during printk when it is NULL.
>        xen-blkfront: If no barrier or flush is supported, use invalid operation.
>        xen/blkback: Support 'feature-barrier' aka old-style BARRIER requests.
>        xen/blkback: Report VBD_WSECT (wr_sect) properly.
>        xen/blkback: Fix the inhibition to map pages when discarding sector ranges.
>        xen/pciback: Check if the device is found instead of blindly assuming so.
>        xen/events: BUG() when we can't allocate our event->irq array.
>        xen/events: Don't check the info for NULL as it is already done.
>        xen/irq: If we fail during msi_capability_init return proper error code.
>        xen/xenbus: Remove the unnecessary check.
>        xen/enlighten: Fix compile warnings and set cx to known value.
>        xen/p2m/debugfs: Fix potential pointer exception.
>        xen/p2m/debugfs: Make type_name more obvious.
>
> Laszlo Ersek (1):
>        xen-blkfront: plug device number leak in xlblk_init() error path
>
> Li Dongyang (4):
>        xen-blkfront: add BLKIF_OP_DISCARD and discard request struct
>        xen-blkback: Implement discard requests ('feature-discard')
>        xen-blkfront: Handle discard requests.
>        xen-blkfront: fix a deadlock while handling discard response
>
> Olaf Hering (6):
>        xen: use static initializers in xen-balloon.c
>        xen/pv-on-hvm kexec: prevent crash in xenwatch_thread() when stale watch events arrive
>        xen/pv-on-hvm kexec: rebind virqs to existing eventchannel ports
>        xen/pv-on-hvm kexec+kdump: reset PV devices in kexec or crash kernel
>        xen/pv-on-hvm kexec: update xs_wire.h:xsd_sockmsg_type from xen-unstable
>        xen/pv-on-hvm kexec: add xs_reset_watches to shutdown watches from old kernel
>
> Randy Dunlap (1):
>        xen-swiotlb: fix printk and panic args
>
> Ruslan Pisarev (6):
>        Xen: fix whitespaces,tabs coding style issue in drivers/xen/balloon.c
>        Xen: fix whitespaces,tabs coding style issue in drivers/xen/events.c
>        Xen: fix braces coding style issue in gntdev.c and grant-table.c
>        Xen: fix whitespaces,tabs coding style issue in drivers/xen/pci.c
>        Xen: fix braces coding style issue in xenbus_probe.h
>        Xen: fix braces and tabs coding style issue in xenbus_probe.c
>
> Stefano Stabellini (4):
>        xen: add an "highmem" parameter to alloc_xenballooned_pages
>        xen: modify kernel mappings corresponding to granted pages
>        xen: XEN_PVHVM depends on PCI
>        xen: remove XEN_PLATFORM_PCI config option
>
> Thomas Meyer (1):
>        xen/pciback: use resource_size()
>
> Yu Ke (1):
>        xen/acpi: Domain0 acpi parser related platform hypercall
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel

-- 
Thanks,
  Igor

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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 05:09:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 05:09:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REgZX-0006RQ-BY; Fri, 14 Oct 2011 05:09:07 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REgYj-0006Bi-UX
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 05:08:19 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318594094!132428!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23603 invoked from network); 14 Oct 2011 12:08:14 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 12:08:14 -0000
Received: by wyh13 with SMTP id 13so3775154wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 05:08:13 -0700 (PDT)
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=24c4RVpN+lkRoVkxCDxpUK2+nb72b/9rcx2rsXKJPdE=;
	b=s2lSUptwyXe80S4GRpNllxUWbnAHwcBP2QFKAbJC0eA9D7//bzFQTq041V6B8l1Lq0
	9RR4Z9VbZW4V3M1g+vhGKyGgT3uoqF/+iAIgSik5sf6NoZJKEywFVIPWxMFyn7nfRNEE
	oUHleJH4/fx+TuyBZZVcNbBsPU9PAjQ109esQ=
Received: by 10.216.131.135 with SMTP id m7mr1429356wei.77.1318594093759;
	Fri, 14 Oct 2011 05:08:13 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id p2sm13806372wbo.17.2011.10.14.05.08.12
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 05:08:12 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 14 Oct 2011 13:08:10 +0100
Subject: Re: [Xen-devel] [PATCH] x86/MSI: drop local cpumask_t variable from
	msi_compose_msg()
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: <CABDE4BA.22EF0%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] x86/MSI: drop local cpumask_t variable from
	msi_compose_msg()
Thread-Index: AcyKafCeZ4z9YG0rvkypt4E5MmxgDw==
In-Reply-To: <4E982A07020000780005B629@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 14/10/2011 11:24, "Jan Beulich" <JBeulich@suse.com> wrote:

> The function gets called only during initialization/resume (when no
> other CPUs are running) or with the IRQ descriptor lock held, so
> there's no way for the CPU mask to change under its feet.
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Keir Fraser <keir@xen.org>

I wonder whether the cpus_empty() check should be a BUG_ON. Or an ASSERT
pushed into cpu_mask_to_apicid.

 -- Keir

> --- a/xen/arch/x86/msi.c
> +++ b/xen/arch/x86/msi.c
> @@ -123,18 +123,16 @@ static void msix_put_fixmap(struct pci_d
>  void msi_compose_msg(struct irq_desc *desc, struct msi_msg *msg)
>  {
>      unsigned dest;
> -    cpumask_t domain;
>      struct irq_cfg *cfg = desc->chip_data;
>      int vector = cfg->vector;
> -    domain = cfg->cpu_mask;
>  
> -    if ( cpus_empty( domain ) ) {
> +    if ( cpus_empty(cfg->cpu_mask) ) {
>          dprintk(XENLOG_ERR,"%s, compose msi message error!!\n", __func__);
> -     return;
> +        return;
>      }
>  
>      if ( vector ) {
> -        dest = cpu_mask_to_apicid(&domain);
> +        dest = cpu_mask_to_apicid(&cfg->cpu_mask);
>  
>          msg->address_hi = MSI_ADDR_BASE_HI;
>          msg->address_lo =
> 
> 
> 
> 
> _______________________________________________
> 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 Oct 14 05:11:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 05:11:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REgbz-0006vd-RM; Fri, 14 Oct 2011 05:11:39 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REgbW-0006i4-CV
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 05:11:10 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1318594247!48246631!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18290 invoked from network); 14 Oct 2011 12:10:47 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 12:10:47 -0000
Received: by wwf27 with SMTP id 27so2756387wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 05:11:07 -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=7sMs+4xRmuxSnrA3u5SNhlknafJhT/yKS0ISrtVqvu8=;
	b=kCRnKNtp0xa9vfHk/V7AO7WB9EpMxKKtVBIlMZubwYOCWk2gmgif3cY4R1z5tiyfQ7
	/V5+5YfGwjKixCCrw9a885/JZXAhfwWaVptZT5+XD2Px2/WQqyDr/meM+rAdRwoWqTZi
	2azXetUc3c63S8Xw76yI9XrqJjdTWcjLZyI9E=
Received: by 10.227.208.137 with SMTP id gc9mr2780551wbb.100.1318594267165;
	Fri, 14 Oct 2011 05:11:07 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id g20sm13835934wbp.13.2011.10.14.05.11.03
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 05:11:06 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 14 Oct 2011 13:11:01 +0100
Subject: Re: [Xen-devel] deadlock in the credit2
From: Keir Fraser <keir.xen@gmail.com>
To: George Dunlap <George.Dunlap@eu.citrix.com>,
	Eunbyung Park <silverbottlep@gmail.com>
Message-ID: <CABDE565.22EF3%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] deadlock in the credit2
Thread-Index: AcyKalaK4cbIPVc/mECCJItmqaFuUg==
In-Reply-To: <CAFLBxZZfH88_-+4i_j8dz3qTh+grxc2wUxuh0e6f7jiV4t9zzQ@mail.gmail.com>
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 14/10/2011 12:47, "George Dunlap" <George.Dunlap@eu.citrix.com> wrote:

> 2011/10/14 Eunbyung Park <silverbottlep@gmail.com>:
>> IMHO, it seems to be deadlock when changing dom0's weight in credit2
>> scheduler.
>> 
>> when the sched_adjust() in schedule.c is called, it grabs the
>> schedule_lock after pausing all of the vcpus
>> 
>> and then, csched_dom_cntl in sched_credit2.c, it also grab the
>> schedule_lock by using vcpu_schedule_lock_irq().
>> 
>> In the credit2, all of the percpu schedule_lock points out same runqueue
>> lock if they belong to same runqueue.
>> 
>> Eventually, all of vcpu are paused except for itself running the code,
>> and it try to grab schedule_lock that was grabbed by itself.
>> 
>> Am I right? If I was wrong, please tell me my misunderstanding.
> 
> Hmm, I think you may have discovered the source of a bug that people
> have been reporting but I haven't had time to look into yet.
> 
> Keir, I think that lock in schedule.c around SCHED(adjust) must be
> wrong.  By the time we grab that lock, grabbing it will be completely
> pointless.  What are we going to be racing against?  In any case, the
> actual scheduler should be responsible for grabbing locks; there's no
> reason that the scheduler can't grab whatever lock it needs inside
> that function.  I haven't done a deep analysis, but my initial
> instinct is to just get rid of it.  What do you think?

Fine by me. The synchronisation in that function looks pretty fragile. It's
probably outdated too.

 -- Keir

>> if ( d == current->domain )
>> vcpu_schedule_lock_irq(current);
>> 
>> It was very hard to understan for me..:) What does it exactly mean?
> 
> You're asking what "current" means?  "current" is a macro that always
> resolves to the vcpu which is running on the current processor.
> 
> sched_adjust() seems to be trying to avoid scheduling races in general
> by pausing all vcpus before calling the per-scheduler function.  But
> if a VM is calling the op on itself, the vcpu making the hypercall
> can't pause itself.  So in that case (current->domain == d) will be
> true, so sched_adjust() grab the schedule lock of that vm instead.
> 
> But really all that locking should be handled in the scheduler
> function, not by the generic code.  It knows best what needs to be
> locked when.
> 
>  -George



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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 05:17:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 05:17:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REgi7-0007RG-AB; Fri, 14 Oct 2011 05:17:59 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REghU-0007F9-7i
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 05:17:21 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318594636!1036089!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32646 invoked from network); 14 Oct 2011 12:17:16 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 12:17:16 -0000
Received: by wyh13 with SMTP id 13so3787998wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 05:17:16 -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:user-agent:date:from:to;
	bh=kdpRG9Q+i9eZeyRw+l5kaA3UVzD+FWReaV79rTKY6nA=;
	b=xkM+0jzie7i47YqU4/53Whzoz/rzfIFnp8S0jI8qX3qH623JsMmwGpOAWOlKKysM58
	RpToVuyK2uoTewqWUNYX/97s+38U9ZAT8NUGHi/8DsaJsaQMZ+VdL8/VHwHAdbkb+OrN
	Z/yJK107A/PihkJ0hYpLVdkl835bUgQsn1e/g=
Received: by 10.216.190.137 with SMTP id e9mr2964974wen.111.1318594636228;
	Fri, 14 Oct 2011 05:17:16 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fo7sm13832371wbb.20.2011.10.14.05.17.14
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 14 Oct 2011 05:17:15 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ae251a2f9490dfa98553837d54b502a2606c566e
Message-Id: <ae251a2f9490dfa98553.1318594610@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 14 Oct 2011 14:16:50 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] tools/build: append user includes and libraries
 at the end of the compile flags
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318594517 -7200
# Node ID ae251a2f9490dfa98553837d54b502a2606c566e
# Parent  064c3cd0ec161e3e4671c7c0c8c0795ce226bca8
tools/build: append user includes and libraries at the end of the compile flags

Appending EXTRA_LIB and EXTRA_INCLUDES to LDFLAGS and CFLAGS respectively made the compiler and linker choose the libraries and header files present in the user's local folder rather than the ones present in the Xen build folder. EXTRA_LIB and EXTRA_INCLUDES are now appended at the end to prevent this.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 064c3cd0ec16 -r ae251a2f9490 Config.mk
--- a/Config.mk	Fri Oct 14 13:38:30 2011 +0200
+++ b/Config.mk	Fri Oct 14 14:15:17 2011 +0200
@@ -169,8 +169,8 @@ CFLAGS-$(clang) += -Wno-parentheses -Wno
 $(call cc-option-add,CFLAGS,CC,-Wdeclaration-after-statement)
 $(call cc-option-add,CFLAGS,CC,-Wno-unused-but-set-variable)
 
-LDFLAGS += $(foreach i, $(EXTRA_LIB), -L$(i)) 
-CFLAGS += $(foreach i, $(EXTRA_INCLUDES), -I$(i))
+USER_LDFLAGS += $(foreach i, $(EXTRA_LIB), -L$(i))
+USER_CFLAGS += $(foreach i, $(EXTRA_INCLUDES), -I$(i))
 
 EMBEDDED_EXTRA_CFLAGS := -nopie -fno-stack-protector -fno-stack-protector-all
 EMBEDDED_EXTRA_CFLAGS += -fno-exceptions
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/Rules.mk
--- a/tools/Rules.mk	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/Rules.mk	Fri Oct 14 14:15:17 2011 +0200
@@ -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 $@ $< $(USER_CFLAGS)
 
 %.o: %.c
-	$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_$*.o) -c -o $@ $<
+	$(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_$*.o) -c -o $@ $< $(USER_CFLAGS)
 
 %.o: %.cc
-	$(CC) $(CPPFLAGS) $(CXXFLAGS) $(CXXFLAGS_$*.o) -c -o $@ $<
+	$(CC) $(CPPFLAGS) $(CXXFLAGS) $(CXXFLAGS_$*.o) -c -o $@ $< $(USER_CFLAGS)
 
 %.o: %.S
-	$(CC) $(CFLAGS) $(CFLAGS_$*.o) -c $< -o $@
+	$(CC) $(CFLAGS) $(CFLAGS_$*.o) -c $< -o $@ $(USER_CFLAGS)
 %.opic: %.S
-	$(CC) $(CPPFLAGS) -DPIC $(CFLAGS) $(CFLAGS.opic) -fPIC -c -o $@ $<
+	$(CC) $(CPPFLAGS) -DPIC $(CFLAGS) $(CFLAGS.opic) -fPIC -c -o $@ $< $(USER_CFLAGS)
 
 subdirs-all subdirs-clean subdirs-install subdirs-distclean: .phony
 	@set -e; for subdir in $(SUBDIRS) $(SUBDIRS-y); do \
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/console/Makefile
--- a/tools/console/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/console/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -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) $(USER_LDFLAGS)
 
 xenconsole: $(patsubst %.c,%.o,$(wildcard client/*.c))
-	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(LDLIBS_xenconsole)
+	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS) $(LDLIBS_xenconsole) $(USER_LDFLAGS)
 
 .PHONY: install
 install: $(BIN)
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/libfsimage/Rules.mk
--- a/tools/libfsimage/Rules.mk	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libfsimage/Rules.mk	Fri Oct 14 14:15:17 2011 +0200
@@ -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) $(USER_LDFLAGS)
 
 clean distclean:
 	rm -f $(PIC_OBJS) $(FSLIB) $(DEPS)
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/libvchan/Makefile
--- a/tools/libvchan/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libvchan/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -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) $(USER_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) $(USER_LDFLAGS)
 
 vchan-node2: $(NODE2_OBJS) libxenvchan.so
-	$(CC) $(LDFLAGS) -o $@ $(NODE2_OBJS) $(LDLIBS_libxenvchan)
+	$(CC) $(LDFLAGS) -o $@ $(NODE2_OBJS) $(LDLIBS_libxenvchan) $(USER_LDFLAGS)
 
 .PHONY: install
 install: all
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/libxc/Makefile
--- a/tools/libxc/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxc/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -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) $(USER_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) $(USER_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) $(USER_LDFLAGS)
 
 -include $(DEPS)
 
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/libxen/Makefile
--- a/tools/libxen/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxen/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -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 $@ $^ $(USER_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 $(USER_LDFLAGS)
 
 
 .PHONY: install
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/libxl/Makefile
--- a/tools/libxl/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -108,7 +108,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) $(USER_LDFLAGS)
 
 libxenlight.a: $(LIBXL_OBJS)
 	$(AR) rcs libxenlight.a $^
@@ -120,16 +120,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) $(USER_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) $(USER_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) $(USER_LDFLAGS)
 
 .PHONY: install
 install: all
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/misc/Makefile
--- a/tools/misc/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/misc/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -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) $(USER_LDFLAGS)
 
 xen-hvmcrash: xen-hvmcrash.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(USER_LDFLAGS)
 
 xenperf: xenperf.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(USER_LDFLAGS)
 
 xenpm: xenpm.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(USER_LDFLAGS)
 
 gtracestat: gtracestat.o
 	$(CC) $(LDFLAGS) -o $@ $<
 
 xenlockprof: xenlockprof.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(USER_LDFLAGS)
 
 xen-hptool: xen-hptool.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(USER_LDFLAGS)
 
 xenwatchdogd: xenwatchdogd.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(USER_LDFLAGS)
 
 gtraceview: gtraceview.o
-	$(CC) $(LDFLAGS) -o $@ $< $(CURSES_LIBS)
+	$(CC) $(LDFLAGS) -o $@ $< $(CURSES_LIBS) $(USER_LDFLAGS)
 
 -include $(DEPS)
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/xcutils/Makefile
--- a/tools/xcutils/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/xcutils/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -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) $(USER_LDFLAGS)
 
 xc_save: xc_save.o
-	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore)
+	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(LDLIBS_libxenstore) $(USER_LDFLAGS)
 
 readnotes: readnotes.o
-	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest)
+	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest) $(USER_LDFLAGS)
 
 lsevtchn: lsevtchn.o
-	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl)
+	$(CC) $(LDFLAGS) $^ -o $@ $(LDLIBS_libxenctrl) $(USER_LDFLAGS)
 
 .PHONY: install
 install: build
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/xenbackendd/Makefile
--- a/tools/xenbackendd/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/xenbackendd/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -33,6 +33,6 @@ clean:
 	rm -f $(DEPS)
 
 xenbackendd: xenbackendd.o
-	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS)
+	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS) $(USER_LDFLAGS)
 
 -include $(DEPS)
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/xenmon/Makefile
--- a/tools/xenmon/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/xenmon/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -41,9 +41,9 @@ clean:
 	$(RM) -f xentrace_setmake setmask.o
 
 xenbaked: xenbaked.o Makefile
-	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS)
+	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS) $(USER_LDFLAGS)
 
 xentrace_setmask: setmask.o Makefile
-	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS)
+	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS) $(USER_LDFLAGS)
 
 -include $(DEPS)
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/xenpaging/Makefile
--- a/tools/xenpaging/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/xenpaging/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -20,7 +20,7 @@ IBINS    = xenpaging
 all: $(IBINS)
 
 xenpaging: $(OBJS)
-	$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+	$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) $(USER_LDFLAGS)
 
 install: all
 	$(INSTALL_DIR) $(DESTDIR)/var/lib/xen/xenpaging
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/xenpmd/Makefile
--- a/tools/xenpmd/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/xenpmd/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -19,6 +19,6 @@ clean:
 	$(RM) -f xenpmd xenpmd.o $(DEPS)
 
 xenpmd: xenpmd.o Makefile
-	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS)
+	$(CC) $(LDFLAGS) $< -o $@ $(LDLIBS) $(USER_LDFLAGS)
 
 -include $(DEPS)
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/xenstat/libxenstat/Makefile
--- a/tools/xenstat/libxenstat/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/xenstat/libxenstat/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -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) $(USER_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 $@ $< $(USER_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 $@ $< $(USER_LDFLAGS)
 
 .PHONY: perl-bindings
 perl-bindings: $(PERLLIB) $(PERLMOD)
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/xenstore/Makefile
--- a/tools/xenstore/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/xenstore/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -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 $@ $(USER_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 $@ $(USER_LDFLAGS)
 
 xenstore-control: xenstore_control.o $(LIBXENSTORE)
-	$(CC) $(LDFLAGS) $< $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@
+	$(CC) $(LDFLAGS) $< $(LDLIBS_libxenstore) $(SOCKET_LIBS) -o $@ $(USER_LDFLAGS)
 
 xs_tdb_dump: xs_tdb_dump.o utils.o tdb.o talloc.o
-	$(CC) $(LDFLAGS) $^ -o $@
+	$(CC) $(LDFLAGS) $^ -o $@ $(USER_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 $(USER_LDFLAGS)
 
 libxenstore.a: xs.o xs_lib.o
 	$(AR) rcs $@ $^
diff -r 064c3cd0ec16 -r ae251a2f9490 tools/xentrace/Makefile
--- a/tools/xentrace/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/xentrace/Makefile	Fri Oct 14 14:15:17 2011 +0200
@@ -35,13 +35,13 @@ clean:
 	$(RM) *.a *.so *.o *.rpm $(BIN) $(LIBBIN) $(DEPS)
 
 xentrace: xentrace.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) $(USER_LDFLAGS)
 
 xenctx: xenctx.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) $(USER_LDFLAGS)
 
 xentrace_setsize: setsize.o
-	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS)
+	$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS) $(USER_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 Fri Oct 14 05:43:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 05: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 1REh77-0008Md-FN; Fri, 14 Oct 2011 05:43:49 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REh6E-00089a-L3
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 05:42:55 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1318596171!31603695!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27709 invoked from network); 14 Oct 2011 12:42:51 -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; 14 Oct 2011 12:42:51 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 14 Oct 2011 13:42:50 +0100
Message-Id: <4E984A69020000780005B67D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 14 Oct 2011 13:42:49 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH] x86/MSI: drop local cpumask_t variable
	from msi_compose_msg()
References: <4E982A07020000780005B629@nat28.tlf.novell.com>
	<CABDE4BA.22EF0%keir.xen@gmail.com>
In-Reply-To: <CABDE4BA.22EF0%keir.xen@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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.10.11 at 14:08, Keir Fraser <keir.xen@gmail.com> wrote:
> On 14/10/2011 11:24, "Jan Beulich" <JBeulich@suse.com> wrote:
>=20
>> The function gets called only during initialization/resume (when no
>> other CPUs are running) or with the IRQ descriptor lock held, so
>> there's no way for the CPU mask to change under its feet.
>>=20
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>=20
> Acked-by: Keir Fraser <keir@xen.org>
>=20
> I wonder whether the cpus_empty() check should be a BUG_ON. Or an ASSERT
> pushed into cpu_mask_to_apicid.

An ASSERT may be reasonable, but simply dropping the check here
may be too - no other code path invoking cpu_mask_to_apicid() has
a similar check.

Jan

>  -- Keir
>=20
>> --- a/xen/arch/x86/msi.c
>> +++ b/xen/arch/x86/msi.c
>> @@ -123,18 +123,16 @@ static void msix_put_fixmap(struct pci_d
>>  void msi_compose_msg(struct irq_desc *desc, struct msi_msg *msg)
>>  {
>>      unsigned dest;
>> -    cpumask_t domain;
>>      struct irq_cfg *cfg =3D desc->chip_data;
>>      int vector =3D cfg->vector;
>> -    domain =3D cfg->cpu_mask;
>> =20
>> -    if ( cpus_empty( domain ) ) {
>> +    if ( cpus_empty(cfg->cpu_mask) ) {
>>          dprintk(XENLOG_ERR,"%s, compose msi message error!!\n", =
__func__);
>> -     return;
>> +        return;
>>      }
>> =20
>>      if ( vector ) {
>> -        dest =3D cpu_mask_to_apicid(&domain);
>> +        dest =3D cpu_mask_to_apicid(&cfg->cpu_mask);
>> =20
>>          msg->address_hi =3D MSI_ADDR_BASE_HI;
>>          msg->address_lo =3D
>>=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 Fri Oct 14 05:56:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 05:56:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REhJZ-0000WT-4q; Fri, 14 Oct 2011 05:56:41 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhIi-0000JG-D8
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 05:55:49 -0700
X-Env-Sender: zhengwang.ruan@gmail.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1318596943!35288146!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11089 invoked from network); 14 Oct 2011 12:55:45 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 12:55:45 -0000
Received: by vcbfk13 with SMTP id fk13so1726267vcb.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 05:55:43 -0700 (PDT)
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
	:references:in-reply-to:content-type;
	bh=RXji2W36NO3qozLWhAvyOYPh6DvFYs12ZAAMrtiReAw=;
	b=W7mqPCId0wFFP+yXKiMo4ehinsTXj8Wf0lt9Gs1Y5Loc28WKyiEmezENtfMHR3zWXJ
	zV1TUgZjCoBgaE8lAi0RC2yTHG00DUER9TbK3LIxo+wtEWrpYhOkzz4wuddoKtBqQqkC
	pUSQlPOIUFGdqvJb0nfNpAaLrDBgqGo4uWkXA=
Received: by 10.68.6.197 with SMTP id d5mr16858746pba.129.1318596943329;
	Fri, 14 Oct 2011 05:55:43 -0700 (PDT)
Received: from [192.168.1.102] ([180.184.200.59])
	by mx.google.com with ESMTPS id v7sm22742809pbr.10.2011.10.14.05.55.41
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 05:55:42 -0700 (PDT)
Message-ID: <4E983137.5070905@gmail.com>
Date: Fri, 14 Oct 2011 20:55:19 +0800
From: "Zhengwang Ruan (Royo)" <zhengwang.ruan@gmail.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110922 Thunderbird/3.1.15
MIME-Version: 1.0
To: =?ISO-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
Subject: Re: [Xen-devel] Several questions from a freshman to Xen
References: <4E9708E5.9060104@gmail.com> <20111013190735.GM12984@reaktio.net>
In-Reply-To: <20111013190735.GM12984@reaktio.net>
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="===============0492622563=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============0492622563==
Content-Type: multipart/alternative;
	boundary="------------090802040501000102090205"

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



On 2011?10?14? 03:07, Pasi Kärkkäinen wrote:
> On Thu, Oct 13, 2011 at 11:51:01PM +0800, Zhengwang Ruan (Royo) wrote:
>> Hi Guys,
>>
> Hello,
>
>> I am new man with some confusions to this amazing technology, hope you
>> guys give answers to help me better understand Xen. :)
>>
> Maybe this wiki page gives some general info about Xen:
> http://wiki.xen.org/xenwiki/XenOverview
>
>
> And these PDFs:
> http://xen.org/files/Marketing/WhatisXen.pdf
> http://xen.org/files/Marketing/WhyXen.pdf
>
>
>> 1, You guys have been working on developing many releases, do you guys
>> have agreements on developing every source code based on a fixed linux
>> kernel version before starting a new release? If so, how could I know
>> the corresponding kernel version to a given xen release? I tried to find
>> answer for myself on the following wiki page, but it is not latest
>> enough.
>>
> Are you talking about dom0 kernel? or domU kernel?
>
> Xen hypervisor (xen.gz) is the compatibility layer,
> so dom0 and domUs (VMs) can all have different Linux kernel versions.

Hi Pasi,


I refer to dom0 here. I got many details on wiki 
http://wiki.xen.org/xenwiki/XenParavirtOps , it helps me understand some.

 From this page, I know you guys developed xen-3.x based on 
linux-2.6.18, and and xen-4.x on 2.6.32, am I right? So these two 
versions of kernel should be supported mostly, right?

For domU, each kernel from kernel.org should be working as a guest?


<http://wiki.xen.org/xenwiki/XenParavirtOps>
>> http://wiki.xen.org/xenwiki/DistributionSupport
>>
>> 2, I found some interesting source files in xen-4.1.1 release, I listed
>> them below:
>>
>> $ ll
>> drwx------ 4 royo royo 16384 2011-10-12 00:20 arch/
>> drwx------ 5 royo royo 16384 2011-06-15 00:03 common/
>> -rw-r--r-- 1 royo royo 19185 2011-06-15 00:03 COPYING
>> drwx------ 2 royo royo 16384 2011-06-15 00:03 crypto/
>> drwx------ 8 royo royo 16384 2011-06-15 00:03 drivers/
>> drwx------ 9 royo royo 16384 2011-06-15 00:03 include/
>> -rw-r--r-- 1 royo royo  5529 2011-06-15 00:03 Makefile
>> -rw-r--r-- 1 royo royo  3498 2011-06-15 00:03 Rules.mk
>> drwx------ 3 royo royo 16384 2011-06-15 00:03 tools/
>> drwx------ 4 royo royo 16384 2011-06-15 00:03 xsm/
>>
>> Are these files going to replace or be added to linux kernel source
>> while making dm0? I am amazed that this release can be installed to many
>> linux distributions with different kernel, how could you guys achieve
>> this?
>>
> Xen hypervisor (xen.gz) is a totally separate binary, it's not "mixed" to/with Linux kernel.

And, xen-4.1.1 is compiled to generate xen.gz which is started by dom0 
and running on/inside dom0 as Hypervisor?

> - For Xen dom0 you need to use a Linux kernel that has Xen dom0 support enabled.
> - For Xen PV domUs (VMs) you need to use a Linux kernel that has Xen PV domU support enabled.
> - For Xen HVM VMs you don't need a special kernel, but having Xen PVHVM drivers in the kernel will boost disk/net

PVHVM drivers are implemented using xenbus? The drivers in xenbus/ 
directory are you called PVHVM drivers?

Thanks,
Royo

> performance.
>
> Xen related features in different Linux kernel versions:
> http://wiki.xen.org/xenwiki/XenParavirtOps
>
>
> -- Pasi
>

--------------090802040501000102090205
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 text="#000000" bgcolor="#ffffff">
    <br>
    <br>
    On 2011&#24180;10&#26376;14&#26085; 03:07, Pasi K&auml;rkk&auml;inen wrote:
    <blockquote cite="mid:20111013190735.GM12984@reaktio.net"
      type="cite">
      <pre wrap="">On Thu, Oct 13, 2011 at 11:51:01PM +0800, Zhengwang Ruan (Royo) wrote:
</pre>
      <blockquote type="cite">
        <pre wrap="">Hi Guys,

</pre>
      </blockquote>
      <pre wrap="">
Hello,

</pre>
      <blockquote type="cite">
        <pre wrap="">I am new man with some confusions to this amazing technology, hope you  
guys give answers to help me better understand Xen. :)

</pre>
      </blockquote>
      <pre wrap="">
Maybe this wiki page gives some general info about Xen:
<a class="moz-txt-link-freetext" href="http://wiki.xen.org/xenwiki/XenOverview">http://wiki.xen.org/xenwiki/XenOverview</a>


And these PDFs:
<a class="moz-txt-link-freetext" href="http://xen.org/files/Marketing/WhatisXen.pdf">http://xen.org/files/Marketing/WhatisXen.pdf</a>
<a class="moz-txt-link-freetext" href="http://xen.org/files/Marketing/WhyXen.pdf">http://xen.org/files/Marketing/WhyXen.pdf</a>


</pre>
      <blockquote type="cite">
        <pre wrap="">1, You guys have been working on developing many releases, do you guys  
have agreements on developing every source code based on a fixed linux  
kernel version before starting a new release? If so, how could I know  
the corresponding kernel version to a given xen release? I tried to find  
answer for myself on the following wiki page, but it is not latest 
enough.

</pre>
      </blockquote>
      <pre wrap="">
</pre>
    </blockquote>
    <blockquote cite="mid:20111013190735.GM12984@reaktio.net"
      type="cite">
      <pre wrap="">Are you talking about dom0 kernel? or domU kernel?

Xen hypervisor (xen.gz) is the compatibility layer,
so dom0 and domUs (VMs) can all have different Linux kernel versions.
</pre>
    </blockquote>
    <br>
    Hi Pasi,<br>
    <br>
    <br>
    I refer to dom0 here. I got many details on wiki <a
      href="http://wiki.xen.org/xenwiki/XenParavirtOps">http://wiki.xen.org/xenwiki/XenParavirtOps</a>
    , it helps me understand some. <br>
    <br>
    From this page, I know you guys developed xen-3.x based on
    linux-2.6.18, and and xen-4.x on 2.6.32, am I right? So these two
    versions of kernel should be supported mostly, right? <br>
    <br>
    For domU, each kernel from kernel.org should be working as a guest?<br>
    <br>
    <br>
    <a href="http://wiki.xen.org/xenwiki/XenParavirtOps"></a>
    <blockquote cite="mid:20111013190735.GM12984@reaktio.net"
      type="cite">
      <pre wrap=""></pre>
      <blockquote type="cite">
        <pre wrap=""><a class="moz-txt-link-freetext" href="http://wiki.xen.org/xenwiki/DistributionSupport">http://wiki.xen.org/xenwiki/DistributionSupport</a>

2, I found some interesting source files in xen-4.1.1 release, I listed  
them below:

$ ll
drwx------ 4 royo royo 16384 2011-10-12 00:20 arch/
drwx------ 5 royo royo 16384 2011-06-15 00:03 common/
-rw-r--r-- 1 royo royo 19185 2011-06-15 00:03 COPYING
drwx------ 2 royo royo 16384 2011-06-15 00:03 crypto/
drwx------ 8 royo royo 16384 2011-06-15 00:03 drivers/
drwx------ 9 royo royo 16384 2011-06-15 00:03 include/
-rw-r--r-- 1 royo royo  5529 2011-06-15 00:03 Makefile
-rw-r--r-- 1 royo royo  3498 2011-06-15 00:03 Rules.mk
drwx------ 3 royo royo 16384 2011-06-15 00:03 tools/
drwx------ 4 royo royo 16384 2011-06-15 00:03 xsm/

Are these files going to replace or be added to linux kernel source  
while making dm0? I am amazed that this release can be installed to many  
linux distributions with different kernel, how could you guys achieve 
this?

</pre>
      </blockquote>
      <pre wrap="">
Xen hypervisor (xen.gz) is a totally separate binary, it's not "mixed" to/with Linux kernel.
</pre>
    </blockquote>
    <br>
    And, xen-4.1.1 is compiled to generate xen.gz which is started by
    dom0 and running on/inside dom0 as Hypervisor?<br>
    <br>
    <blockquote cite="mid:20111013190735.GM12984@reaktio.net"
      type="cite">
      <pre wrap="">- For Xen dom0 you need to use a Linux kernel that has Xen dom0 support enabled.
- For Xen PV domUs (VMs) you need to use a Linux kernel that has Xen PV domU support enabled.
- For Xen HVM VMs you don't need a special kernel, but having Xen PVHVM drivers in the kernel will boost disk/net </pre>
    </blockquote>
    <br>
    PVHVM drivers are implemented using xenbus? The drivers in xenbus/
    directory are you called PVHVM drivers? <br>
    <br>
    Thanks,<br>
    Royo<br>
    <br>
    <blockquote cite="mid:20111013190735.GM12984@reaktio.net"
      type="cite">
      <pre wrap="">performance.

Xen related features in different Linux kernel versions:
<a class="moz-txt-link-freetext" href="http://wiki.xen.org/xenwiki/XenParavirtOps">http://wiki.xen.org/xenwiki/XenParavirtOps</a>


-- Pasi

</pre>
    </blockquote>
  </body>
</html>

--------------090802040501000102090205--


--===============0492622563==
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

--===============0492622563==--


From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:06:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:06:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REhSk-00016L-I2; Fri, 14 Oct 2011 06:06:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhQw-0000ri-TY
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:04:21 -0700
X-Env-Sender: zhengwang.ruan@gmail.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318597454!1046570!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5116 invoked from network); 14 Oct 2011 13:04:15 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 13:04:15 -0000
Received: by vcbfk13 with SMTP id fk13so1744943vcb.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 06:04:14 -0700 (PDT)
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
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=7ezd1zJcgOhW1Rtr4JOuiC3zy2TkVeDkVl8KrDX8+g4=;
	b=SWkx2ICQwD2DAFTccOunJ3Qkz5je6+E4fYUogxGtWxkaLOtFmBn2sU4MXUCY3a1oXs
	bz1mpHCRoVZy6eFbccZeUNqU9gGkanWd5Uvclwii7q2ORAJ6ya6jRdo2ahNtB38iss7Y
	S/h9UBVUhVrUPCcS1OCeeO34arcRcJYHCkrC4=
Received: by 10.68.209.37 with SMTP id mj5mr16671937pbc.123.1318597453781;
	Fri, 14 Oct 2011 06:04:13 -0700 (PDT)
Received: from [192.168.1.102] ([180.184.200.59])
	by mx.google.com with ESMTPS id w4sm22846867pbf.6.2011.10.14.06.04.11
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 06:04:13 -0700 (PDT)
Message-ID: <4E983344.8060907@gmail.com>
Date: Fri, 14 Oct 2011 21:04:04 +0800
From: "Zhengwang Ruan (Royo)" <zhengwang.ruan@gmail.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110922 Thunderbird/3.1.15
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Several questions from a freshman to Xen
References: <4E9708E5.9060104@gmail.com>
	<20111013184228.GK15499@phenom.oracle.com>
In-Reply-To: <20111013184228.GK15499@phenom.oracle.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
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 2011å¹´10æœˆ14æ—¥ 02:42, Konrad Rzeszutek Wilk wrote:
> On Thu, Oct 13, 2011 at 11:51:01PM +0800, Zhengwang Ruan (Royo) wrote:
>> Hi Guys,
>>
>> I am new man with some confusions to this amazing technology, hope
>> you guys give answers to help me better understand Xen. :)
>>
>> 1, You guys have been working on developing many releases, do you
>> guys have agreements on developing every source code based on a
>> fixed linux kernel version before starting a new release? If so, how
> No.
>> could I know the corresponding kernel version to a given xen
>> release? I tried to find answer for myself on the following wiki
>> page, but it is not latest enough.
> Anything past 3.0 kernel should work. Every Linux kernel release
> we fix bugs and add new features.

They are the kernel releases in the git repository

http://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git

?


> Look in Paravirt Wiki for the roadmap of what we want to
> have in 3.2 and 3.3 Linux kernel.

See, really good roadmap!


>> http://wiki.xen.org/xenwiki/DistributionSupport
>>
>> 2, I found some interesting source files in xen-4.1.1 release, I
>> listed them below:
>>
>> $ ll
>> drwx------ 4 royo royo 16384 2011-10-12 00:20 arch/
>> drwx------ 5 royo royo 16384 2011-06-15 00:03 common/
>> -rw-r--r-- 1 royo royo 19185 2011-06-15 00:03 COPYING
>> drwx------ 2 royo royo 16384 2011-06-15 00:03 crypto/
>> drwx------ 8 royo royo 16384 2011-06-15 00:03 drivers/
>> drwx------ 9 royo royo 16384 2011-06-15 00:03 include/
>> -rw-r--r-- 1 royo royo  5529 2011-06-15 00:03 Makefile
>> -rw-r--r-- 1 royo royo  3498 2011-06-15 00:03 Rules.mk
>> drwx------ 3 royo royo 16384 2011-06-15 00:03 tools/
>> drwx------ 4 royo royo 16384 2011-06-15 00:03 xsm/
>>
>> Are these files going to replace or be added to linux kernel source
>> while making dm0? I am amazed that this release can be installed to
> Why would they?

Sorry, I misunderstood xen-4.1.1 as part of dom0, and would be merged 
into kernel to produce a dom0, but I know I was wrong. :)

Thanks,
Royo


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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:20:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:20:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REhgH-0002O1-9G; Fri, 14 Oct 2011 06:20:09 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhe2-0001lj-Nw
	for Xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:17:51 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1318598243!49120737!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21985 invoked from network); 14 Oct 2011 13:17:23 -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;
	14 Oct 2011 13:17:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,346,1315180800"; 
   d="scan'208";a="8396999"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Oct 2011 13:17:29 +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, 14 Oct 2011 14:17:29 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Keir Fraser <keir.xen@gmail.com>
Date: Fri, 14 Oct 2011 14:17:29 +0100
In-Reply-To: <CABDA859.22DA3%keir.xen@gmail.com>
References: <CABDA859.22DA3%keir.xen@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: <1318598249.21903.885.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: HYBRID: gnttab_map() to map shared frames..
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-14 at 08:50 +0100, Keir Fraser wrote:
> If you are running without autotranslate paging mode then the p2m will be
> 1:1 and there is no problem. If you are running autotranslate then yes you
> probably need the HVM style of mapping.

The issue is that with an HVM guest there is no guest visibility of MFN
space and PFN space is not managed by the hypervisor, so you need an
add_to_physmap style call in order to point the hypervisor at some PFN
space which it can use as the grant table. You then get this same PFN
space back from GNTTABOP_setup_table and from then on PV and HVM look
much the same. (I'm sure you know this, I'm just thinking out loud).

For a hybrid guest it's not quite true that PFN space is not managed by
the hypervisor -- we could, at least in theory, use the hypervisor hole
and "allocate" ourselves some pfn space for the grant table in there.
Couldn't we?

Ian.

> 
>  -- Keir
> 
> On 14/10/2011 02:18, "Mukesh Rathor" <mukesh.rathor@oracle.com> wrote:
> 
> > Hi,
> > 
> > I am trying to figure how to make gnttab_map() work for Hybrid with EPT.
> > The only way I am coming up is the HVM way, where I would have to get
> > mmio_addr via pci_resource_start() which means registering xen-platform-pci
> > driver. I know there will be implications later with migration, but thats
> > later.
> > 
> > I can't think of any other way since the grant frames are coming from
> > xen heap and not in p2m table, other than some sort of
> > xen-heap-p2m-table or something ugly.
> > 
> > Am I on right track, or any other ideas?
> > 
> > thanks,
> > Mukesh
> > 
> 
> 



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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:25:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:25:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REhlD-0002rM-4x; Fri, 14 Oct 2011 06:25:15 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhk0-0002dS-Ri
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:24:02 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318598637!144624!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5999 invoked from network); 14 Oct 2011 13:23:57 -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;
	14 Oct 2011 13:23:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,346,1315180800"; 
   d="scan'208";a="8397181"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Oct 2011 13:23:57 +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, 14 Oct 2011 14:23:57 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Thomas Gleixner <tglx@linutronix.de>
Date: Fri, 14 Oct 2011 14:23:57 +0100
In-Reply-To: <1318251990.21903.433.camel@zakaz.uk.xensource.com>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
	<1317668908.11991.20.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110032229250.1489@ionos>
	<1318001583.21903.355.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110071822160.3240@ionos>
	<1318251990.21903.433.camel@zakaz.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: <1318598637.21903.889.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	xen-devel <xen-devel@lists.xensource.com>, Konrad Rzeszutek
	Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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? The original issue has made it into longterm-2.6.32.y and then
onto Debian (bug #644604) so people keep asking me about it...

Ian.

On Mon, 2011-10-10 at 14:06 +0100, Ian Campbell wrote:
> From dc8a8329f3e97f30e1290c898c816250aa7e8957 Mon Sep 17 00:00:00 2001
> From: Ian Campbell <ian.campbell@citrix.com>
> Date: Mon, 3 Oct 2011 15:37:00 +0100
> Subject: [PATCH] irq: add IRQF_RESUME_EARLY and resume such IRQs earlier in the process
> 
> 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: Thomas Gleixner <tglx@linutronix.de>
> Cc: Rafael J. Wysocki <rjw@sisk.pl>
> Cc: Jeremy Fitzhardinge <jeremy@goop.org>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> Cc: xen-devel <xen-devel@lists.xensource.com>
> Cc: stable@kernel.org (at least to 2.6.32.y)
> ---
>  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 7523719..44490de 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 a103732..f51a81b 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..86bcd79 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 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 Fri Oct 14 06:36:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:36:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REhvq-0003cP-B5; Fri, 14 Oct 2011 06:36:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1REhv3-0003KS-Pb
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:35:26 -0700
X-Env-Sender: anthony@overnetdata.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1318599297!39964472!1
X-Originating-IP: [81.137.131.225]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22072 invoked from network); 14 Oct 2011 13:34:57 -0000
Received: from host81-137-131-225.in-addr.btopenworld.com (HELO
	zimbra.overnetdata.com) (81.137.131.225)
	by server-10.tower-27.messagelabs.com with SMTP;
	14 Oct 2011 13:34:57 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by zimbra.overnetdata.com (Postfix) with ESMTP id 8ACB81609E0
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 14:35:22 +0100 (BST)
X-Virus-Scanned: amavisd-new at overnetdata.com
Received: from zimbra.overnetdata.com ([127.0.0.1])
	by localhost (zimbra.overnetdata.com [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id G5SLfFZVTYbm for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 14:35:16 +0100 (BST)
Received: from [192.168.1.59] (unknown [192.168.1.59])
	by zimbra.overnetdata.com (Postfix) with ESMTPSA id E55871609DF
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 14:35:15 +0100 (BST)
Message-ID: <4E983A91.8040409@overnetdata.com>
Date: Fri, 14 Oct 2011 14:35:13 +0100
From: Anthony Wright <anthony@overnetdata.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	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>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Para-Virt DomU + HVM DomU with xen 4.1.1 & linux 3.0.6
	locks up system
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 have xen 4.1.1 running with a 3.0.6 linux kernel, both 32 bit.

If I run 2 x para-virtualized DomUs they run fine. If I run 2 x HVM
DomUs they run fine. If I run 1 x para-virtualized and 1 x HVM DomU (it
doesn't matter which one is run first & which second), the system locks
up just after I start the second DomU.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:38:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:38:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REhy9-00043N-4z; Fri, 14 Oct 2011 06:38:37 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhxZ-0003pf-Sy
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:38:02 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318599478!22330356!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31052 invoked from network); 14 Oct 2011 13:37:59 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 13:37:59 -0000
Received: by wyh13 with SMTP id 13so3901391wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 06:37:58 -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=GL1yXJAvXj84QEtQ45hGp19ZS0AO8hftxBKNPjuYZvM=;
	b=Exa83DWUqoQFOyPVTZP3GX56R1YDK3BP7JfXET6tVN4M0YwjpgAWQtmRB4IrBkN7tl
	a8si+A+hT3ZThIcT8m59AtDmIaYpIt2Bt+uT6He+LtIcvCTfzz8dwwoH9KBC4jR9niGg
	H9c81iOTBfa+50eGnpMUUENrtQemsmpg5ytrs=
Received: by 10.227.24.8 with SMTP id t8mr2826699wbb.72.1318599478646;
	Fri, 14 Oct 2011 06:37:58 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id h39sm14299709wbo.0.2011.10.14.06.37.56
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 14 Oct 2011 06:37:57 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1318599332@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 14 Oct 2011 15:35:32 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 0 of 9] Call hotplug scripts from libxl for
	NetBSD
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 adds support for NetBSD to call hotplug scripts directly from libxl, instead of relying on xenbackendd. Also some patches contain general bug fixes that apply to both NetBSD and Linux. Currently Linux hotplug script call functions are empty, so Linux continues to use udev rules to call hotplug scripts. This patch should be applied after Ian Campbell's "libxl: rationalise libxl_device_* APIs" series.

Please review, Roger.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:39:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:39:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REhzQ-0004R7-Rg; Fri, 14 Oct 2011 06:39:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhxb-0003pl-Kg
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:38:04 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318599478!22330356!2
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31154 invoked from network); 14 Oct 2011 13:38:00 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 13:38:00 -0000
Received: by mail-wy0-f171.google.com with SMTP id 13so3901391wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 06:38:00 -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=MHnIc6Bc+c0TXjyBlWdsarCLe+TkC0NQsVycmUDrxXU=;
	b=Ecqzx2BnD9kZX7Jqt5QZ80RbeoVKB6GpoAhBVn6hZvbWHkp+39BznabBf9RKWZsA3f
	f5nqG7axih0VdDCbty3wZa/jnU69e2tzOMrxP3xdlV2PhQZse6fHDjN61o5Eu2812Edl
	hbvFvE+q+UZysVmxY7oNEw7bFnGs8GHrHhiqk=
Received: by 10.227.155.81 with SMTP id r17mr2960936wbw.93.1318599480622;
	Fri, 14 Oct 2011 06:38:00 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id h39sm14299709wbo.0.2011.10.14.06.37.58
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 14 Oct 2011 06:37:59 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: deb93254ad05ffa13caa64f0159800f04c82666b
Message-Id: <deb93254ad05ffa13caa.1318599333@loki>
In-Reply-To: <patchbomb.1318599332@loki>
References: <patchbomb.1318599332@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 14 Oct 2011 15:35:33 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 1 of 9] xenbackendd: pass type of block device
 to hotplug script
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317386335 -7200
# Node ID deb93254ad05ffa13caa64f0159800f04c82666b
# Parent  c9c228ec718a4c2d22b58ce306f269868af0d12f
xenbackendd: pass type of block device to hotplug script

Pass the type of block device to attach to the block script instead of reading it from xenstore, since new Xen versions don't make a difference between a block device or an image.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r c9c228ec718a -r deb93254ad05 tools/hotplug/NetBSD/block
--- a/tools/hotplug/NetBSD/block	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/hotplug/NetBSD/block	Fri Sep 30 14:38:55 2011 +0200
@@ -19,7 +19,7 @@ error() {
 
 xpath=$1
 xstatus=$2
-xtype=$(xenstore-read "$xpath/type")
+xtype=$3
 xparams=$(xenstore-read "$xpath/params")
 
 case $xstatus in
diff -r c9c228ec718a -r deb93254ad05 tools/xenbackendd/xenbackendd.c
--- a/tools/xenbackendd/xenbackendd.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/xenbackendd/xenbackendd.c	Fri Sep 30 14:38:55 2011 +0200
@@ -89,15 +89,15 @@ dodebug(const char *fmt, ...)
 }
 
 static void
-doexec(const char *cmd, const char *arg1, const char *arg2)
+doexec(const char *cmd, const char *arg1, const char *arg2, const char *arg3)
 {
-	dodebug("exec %s %s %s", cmd, arg1, arg2);
+	dodebug("exec %s %s %s %s", cmd, arg1, arg2, arg3);
 	switch(vfork()) {
 	case -1:
 		dolog(LOG_ERR, "can't vfork: %s", strerror(errno));
 		break;
 	case 0:
-		execl(cmd, cmd, arg1, arg2, NULL);
+		execl(cmd, cmd, arg1, arg2, arg3, NULL);
 		dolog(LOG_ERR, "can't exec %s: %s", cmd, strerror(errno));
 		exit(EXIT_FAILURE);
 		/* NOTREACHED */
@@ -145,11 +145,14 @@ xen_setup(void)
 int
 main(int argc, char * const argv[])
 {
+	struct stat stab;
 	char **vec;
 	unsigned int num;
 	char *s;
 	int state;
 	char *sstate;
+	char *stype;
+	char *params;
 	char *p;
 	char buf[80];
 	int type;
@@ -297,11 +300,38 @@ main(int argc, char * const argv[])
 				    strerror(errno));
 				goto next2;
 			}
-			doexec(s, vec[XS_WATCH_PATH], sstate);
+			doexec(s, vec[XS_WATCH_PATH], sstate, NULL);
 			break;
 
 		case DEVTYPE_VBD:
-			doexec(vbd_script, vec[XS_WATCH_PATH], sstate);
+			/* check if given file is a block device or a raw image */
+			snprintf(buf, sizeof(buf), "%s/params", vec[XS_WATCH_PATH]);
+			params = xs_read(xs, XBT_NULL, buf, 0);
+			if(params == NULL) {
+				dolog(LOG_ERR,
+					"Failed to read %s (%s)", buf, strerror(errno));
+				goto next2;
+			}
+			if (stat(params, &stab) < 0) {
+				dolog(LOG_ERR,
+					"Failed to get info about %s (%s)", params,
+					strerror(errno));
+				goto next3;
+			}
+			stype = NULL;
+			if (S_ISBLK(stab.st_mode))
+				stype = "phy";
+			if (S_ISREG(stab.st_mode))
+				stype = "file";
+			if (stype == NULL) {
+				dolog(LOG_ERR,
+					"Failed to attach %s (not a block device or raw image)",
+					params, strerror(errno));
+				goto next3;
+			}
+			doexec(vbd_script, vec[XS_WATCH_PATH], sstate, stype);
+next3:
+			free(params);
 			break;
 
 		default:

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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:40:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:40:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REi0N-0004qE-IC; Fri, 14 Oct 2011 06:40:55 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhxg-0003rP-BH
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:38:09 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318599478!22330356!3
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31509 invoked from network); 14 Oct 2011 13:38:05 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 13:38:05 -0000
Received: by mail-wy0-f171.google.com with SMTP id 13so3901391wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 06:38:05 -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=rwvA1BUMdpNpr3FJkbSbyJBfgpCxJcd3k11y3quntqw=;
	b=Nw9p7WhnKKQKyuZJutlQjziUtOGbAosldfYD3of1Il1QQXIo8lBcGt+9AqImbvjhvo
	dCWTBnwxNdvkl7h4hWQGsF0WGSZFKhhjZIOCkmVgAEZUd86XrpdaFY5tIawfkgvpyEGI
	V9xTr4kL4eK6ysS+Ht+kvXj/XW6KU4Tgf9VGs=
Received: by 10.227.28.4 with SMTP id k4mr3002517wbc.21.1318599485262;
	Fri, 14 Oct 2011 06:38:05 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id h39sm14299709wbo.0.2011.10.14.06.38.03
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 14 Oct 2011 06:38:03 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0865f90beac01012dd0ff4a86b07d8fb62575163
Message-Id: <0865f90beac01012dd0f.1318599335@loki>
In-Reply-To: <patchbomb.1318599332@loki>
References: <patchbomb.1318599332@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 14 Oct 2011 15:35:35 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 3 of 9] libxl: add support for image files for
	NetBSD
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317386335 -7200
# Node ID 0865f90beac01012dd0ff4a86b07d8fb62575163
# Parent  873e4a1309ce5da0305611ce2e2b460df052019b
libxl: add support for image files for NetBSD

Created a helper function to detect if the OS is capable of using image files as phy backends. Create two OS specific files, and changed the Makefile to choose the correct one at compile time.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 873e4a1309ce -r 0865f90beac0 tools/libxl/Makefile
--- a/tools/libxl/Makefile	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/libxl/Makefile	Fri Sep 30 14:38:55 2011 +0200
@@ -31,6 +31,8 @@ LIBXL_OBJS-y += libxl_noblktap2.o
 endif
 LIBXL_OBJS-$(CONFIG_X86) += libxl_cpuid.o
 LIBXL_OBJS-$(CONFIG_IA64) += libxl_nocpuid.o
+LIBXL_OBJS-$(CONFIG_NetBSD) += libxl_phybackend.o
+LIBXL_OBJS-$(CONFIG_Linux) += libxl_nophybackend.o
 
 LIBXL_LIBS += -lyajl
 
diff -r 873e4a1309ce -r 0865f90beac0 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/libxl/libxl_device.c	Fri Sep 30 14:38:55 2011 +0200
@@ -138,15 +138,14 @@ static int disk_try_backend(disk_try_bac
               a->disk->format == LIBXL_DISK_FORMAT_EMPTY)) {
             goto bad_format;
         }
-        if (a->disk->format != LIBXL_DISK_FORMAT_EMPTY &&
-            !S_ISBLK(a->stab.st_mode)) {
-            LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Disk vdev=%s, backend phy"
-                       " unsuitable as phys path not a block device",
-                       a->disk->vdev);
-            return 0;
-        }
 
-        return backend;
+        if (try_phy_backend(a->stab.st_mode))
+            return backend;
+
+        LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Disk vdev=%s, backend phy"
+                   " unsuitable as phys path not a block device",
+                   a->disk->vdev);
+        return 0;
 
     case LIBXL_DISK_BACKEND_TAP:
         if (!libxl__blktap_enabled(a->gc)) {
diff -r 873e4a1309ce -r 0865f90beac0 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	Fri Sep 30 14:38:55 2011 +0200
@@ -247,6 +247,9 @@ _hidden int libxl__device_destroy(libxl_
 _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
 _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);
 
+/* OS dependant helper function */
+_hidden int try_phy_backend(mode_t st_mode);
+
 /* from libxl_pci */
 
 _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting);
diff -r 873e4a1309ce -r 0865f90beac0 tools/libxl/libxl_nophybackend.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxl/libxl_nophybackend.c	Fri Sep 30 14:38:55 2011 +0200
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2011
+ * Author Roger Pau Monne <roger.pau@entel.upc.edu>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+ 
+#include <sys/stat.h>
+
+#include "libxl_internal.h"
+ 
+int try_phy_backend(mode_t st_mode)
+{
+    if (!S_ISBLK(st_mode)) {
+        return 0;
+    }
+
+    return 1;
+}
diff -r 873e4a1309ce -r 0865f90beac0 tools/libxl/libxl_phybackend.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxl/libxl_phybackend.c	Fri Sep 30 14:38:55 2011 +0200
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2011
+ * Author Roger Pau Monne <roger.pau@entel.upc.edu>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+ 
+#include <sys/stat.h>
+
+#include "libxl_internal.h"
+ 
+int try_phy_backend(mode_t st_mode)
+{
+    if (S_ISREG(st_mode) || S_ISBLK(st_mode))
+        return 1;
+
+    return 0;
+}

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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:41:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:41:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REi1H-0005Gu-DV; Fri, 14 Oct 2011 06:41:51 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhxi-0003s7-GM
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:38:12 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318599478!22330356!4
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31698 invoked from network); 14 Oct 2011 13:38:07 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 13:38:07 -0000
Received: by mail-wy0-f171.google.com with SMTP id 13so3901391wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 06:38:07 -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=A2fOxr3fYG4+eD8RD3hu8GZbTH+eQW9lE9pyuP/01D4=;
	b=foI1yJyFonEhsnI9eTfNAV21n5XX3y707CWTH7HStgLI+Hi5zIxSqmZAUzBRQcqtM7
	imkpe3kWwPj49PS1qJjbMpBrkWAq9DVsMnLC11OP/eu4mA5eIl1x4HXtoM2G/D1JZCQh
	G2AB+zbMQR+L4jCt8MM+szSyEgPRIiHp6ueqs=
Received: by 10.216.14.223 with SMTP id d73mr1556477wed.55.1318599487500;
	Fri, 14 Oct 2011 06:38:07 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id h39sm14299709wbo.0.2011.10.14.06.38.05
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 14 Oct 2011 06:38:06 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0235e192a519e29ac3d77e91fe59b38e6a6f06ef
Message-Id: <0235e192a519e29ac3d7.1318599336@loki>
In-Reply-To: <patchbomb.1318599332@loki>
References: <patchbomb.1318599332@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 14 Oct 2011 15:35:36 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 4 of 9] libxl: add libxl__forkexec to execute
	hotplug scripts
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318592310 -7200
# Node ID 0235e192a519e29ac3d77e91fe59b38e6a6f06ef
# Parent  0865f90beac01012dd0ff4a86b07d8fb62575163
libxl: add libxl__forkexec to execute hotplug scripts

Add a new function to libxl_exec that performs a vfork and executes the passed arguments using libxl__exec.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 0865f90beac0 -r 0235e192a519 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	Fri Oct 14 13:38:30 2011 +0200
@@ -308,3 +308,25 @@ int libxl__spawn_check(libxl__gc *gc, vo
     for_spawn->intermediate = 0;
     return ERROR_FAIL;
 }
+
+int libxl__forkexec(libxl__gc *gc, int stdinfd, int stdoutfd,
+                    int stderrfd, char **args)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+
+    switch (vfork()) {
+    case -1:
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to vfork\n");
+        return -1;
+    case 0:
+        libxl__exec(stdinfd, stdoutfd, stderrfd, args[0], args);
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to execute %s\n",
+                         args[0]);
+        exit(EXIT_FAILURE);
+        break;
+    default:
+        wait(NULL);
+        break;
+    }
+    return 0;
+}
diff -r 0865f90beac0 -r 0235e192a519 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	Fri Oct 14 13:38:30 2011 +0200
@@ -342,6 +342,8 @@ _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
+_hidden int libxl__forkexec(libxl__gc *gc, int stdinfd, int stdoutfd,
+                            int stderrfd, char **args);
 _hidden void libxl__log_child_exitstatus(libxl__gc *gc,
                                 const char *what, pid_t pid, int status);
 

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

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:42:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:42:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REi22-0005e7-VJ; Fri, 14 Oct 2011 06:42:39 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhxl-0003tD-P0
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:38:14 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1318599490!116293!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24933 invoked from network); 14 Oct 2011 13:38:10 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 13:38:10 -0000
Received: by wwf27 with SMTP id 27so2864651wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 06:38:10 -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=vvqRTeKvl/jjA6gBtgr9tWYgKuUU8EBsfZ4MI62HhHo=;
	b=nUmhTX9Hk0e3WmobM7UYQgYN4zv6N/sUTZOIwWtYptWi+DrHKU8tZZdRr6mPYELr6C
	DNcd4hMZOrzR/+/3sIiKWEZdnEFug5eBrRddLetkAYywfxrG+HX1FVfWwMRUSlzTPBmF
	bGNGW8pV/m0cD4PUph79IaPY5HmSEjru/SYa4=
Received: by 10.227.37.155 with SMTP id x27mr2993943wbd.54.1318599490293;
	Fri, 14 Oct 2011 06:38:10 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id h39sm14299709wbo.0.2011.10.14.06.38.07
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 14 Oct 2011 06:38:08 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: d14479efe33c3955dcf41783a1b02c8d2bb572e6
Message-Id: <d14479efe33c3955dcf4.1318599337@loki>
In-Reply-To: <patchbomb.1318599332@loki>
References: <patchbomb.1318599332@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 14 Oct 2011 15:35:37 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 5 of 9] libxl: wait for devices to initialize
 upon addition to the 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

# HG changeset patch
# User Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1318592310 -7200
# Node ID d14479efe33c3955dcf41783a1b02c8d2bb572e6
# Parent  0235e192a519e29ac3d77e91fe59b38e6a6f06ef
libxl: wait for devices to initialize upon addition to the domain.

Block waiting for devices to initialize (switch to state 2).

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 0235e192a519 -r d14479efe33c tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl.c	Fri Oct 14 13:38:30 2011 +0200
@@ -1070,6 +1070,11 @@ int libxl_device_disk_add(libxl_ctx *ctx
                              libxl__xs_kvs_of_flexarray(&gc, back, back->count),
                              libxl__xs_kvs_of_flexarray(&gc, front, front->count));
 
+    if (libxl__wait_for_device_initialization(&gc, &device) < 0) {
+        rc = -1;
+        goto out_free;
+    }
+
     rc = 0;
 
 out_free:
@@ -1513,7 +1518,11 @@ int libxl_device_nic_add(libxl_ctx *ctx,
                              libxl__xs_kvs_of_flexarray(&gc, back, back->count),
                              libxl__xs_kvs_of_flexarray(&gc, front, front->count));
 
-    /* FIXME: wait for plug */
+    if (libxl__wait_for_device_initialization(&gc, &device) < 0) {
+        rc = -1;
+        goto out_free;
+    }
+
     rc = 0;
 out_free:
     flexarray_free(back);
diff -r 0235e192a519 -r d14479efe33c tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl_device.c	Fri Oct 14 13:38:30 2011 +0200
@@ -366,6 +366,38 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
+int libxl__wait_for_device_initialization(libxl__gc *gc, libxl__device *device)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *be_path = libxl__device_backend_path(gc, device);
+    char *state_path = libxl__sprintf(gc, "%s/state", be_path);
+    char *state = libxl__xs_read(gc, XBT_NULL, state_path);
+    int rc = -1;
+    char **l1 = NULL;
+    unsigned int n;
+    
+    if (atoi(state) == 2) {
+        rc = 0;
+        goto out;
+    }
+
+    xs_watch(ctx->xsh, state_path, be_path);
+    while (atoi(state) != 2) {
+        l1 = xs_read_watch(ctx->xsh, &n);
+        if (l1 == NULL) {
+            goto out;
+        }
+        state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
+        if (state == NULL) {
+            goto out;
+        }
+    }
+    rc = 0;
+
+out:
+    return rc;
+}
+
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
diff -r 0235e192a519 -r d14479efe33c tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl_internal.h	Fri Oct 14 13:38:30 2011 +0200
@@ -231,7 +231,7 @@ _hidden int libxl__device_disk_set_backe
 _hidden int libxl__device_physdisk_major_minor(const char *physpath, int *major, int *minor);
 _hidden int libxl__device_disk_dev_number(const char *virtpath,
                                           int *pdisk, int *ppartition);
-
+_hidden int libxl__wait_for_device_initialization(libxl__gc *gc, libxl__device *device);
 _hidden int libxl__device_console_add(libxl__gc *gc, uint32_t domid,
                                       libxl_device_console *console,
                                       libxl__domain_build_state *state);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:43:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:43:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REi3C-000621-EA; Fri, 14 Oct 2011 06:43:50 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhxn-0003tk-B6
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:38:16 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1318599490!116293!2
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24974 invoked from network); 14 Oct 2011 13:38:12 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 13:38:12 -0000
Received: by mail-ww0-f43.google.com with SMTP id 27so2864651wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 06:38:12 -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=p8QJqbd4FmUUsN7okq6ARRDU1UrAOXlTl2/mYA/k+Q0=;
	b=JFGn2ZGlEf4xyvHWzde7QKHjGhXhSbUDdVt/LI54jDxa/DuPNnyKZL7TfjeUcfXlSA
	bG0bf55Tp6LV6gqNeNUBGyWzrS96YirSzvHgH//7bxlickMQG/80/pO3ibwF2zf8mrfF
	X2QO+NUEeKaGPH/28un5TOx4P9IG9KL2p9I+c=
Received: by 10.216.160.75 with SMTP id t53mr1658370wek.29.1318599492327;
	Fri, 14 Oct 2011 06:38:12 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id h39sm14299709wbo.0.2011.10.14.06.38.10
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 14 Oct 2011 06:38:11 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 8800c37a5acba9e95ac8005ea123d3e9954be001
Message-Id: <8800c37a5acba9e95ac8.1318599338@loki>
In-Reply-To: <patchbomb.1318599332@loki>
References: <patchbomb.1318599332@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 14 Oct 2011 15:35:38 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 6 of 9] libxl: execute hotplug scripts directly
	from libxl
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317386335 -7200
# Node ID 8800c37a5acba9e95ac8005ea123d3e9954be001
# Parent  d14479efe33c3955dcf41783a1b02c8d2bb572e6
libxl: execute hotplug scripts directly from libxl.

Added the necessary handlers to execute hotplug scripts when necessary from libxl. Split NetBSD from Linux hotplug calls into two separate files, because parameters for hotplug scripts are different. Linux has empty functions, since the calling of hotplug scripts is still done using udev.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r d14479efe33c -r 8800c37a5acb tools/libxl/Makefile
--- a/tools/libxl/Makefile	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/Makefile	Fri Sep 30 14:38:55 2011 +0200
@@ -33,6 +33,8 @@ LIBXL_OBJS-$(CONFIG_X86) += libxl_cpuid.
 LIBXL_OBJS-$(CONFIG_IA64) += libxl_nocpuid.o
 LIBXL_OBJS-$(CONFIG_NetBSD) += libxl_phybackend.o
 LIBXL_OBJS-$(CONFIG_Linux) += libxl_nophybackend.o
+LIBXL_OBJS-$(CONFIG_NetBSD) += hotplug_netbsd.o
+LIBXL_OBJS-$(CONFIG_Linux) += hotplug_linux.o
 
 LIBXL_LIBS += -lyajl
 
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/hotplug_linux.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxl/hotplug_linux.c	Fri Sep 30 14:38:55 2011 +0200
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2011
+ * Author Roger Pau Monne <roger.pau@entel.upc.edu>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+
+#include "libxl_internal.h"
+
+int libxl_disk_hotplug(libxl__gc *gc, libxl__device *dev)
+{
+    return 0;
+}
+
+int libxl_nic_hotplug_connect(libxl__gc *gc, libxl__device *dev)
+{
+    return 0;
+}
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/hotplug_netbsd.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxl/hotplug_netbsd.c	Fri Sep 30 14:38:55 2011 +0200
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2011
+ * Author Roger Pau Monne <roger.pau@entel.upc.edu>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+
+#include <sys/stat.h>
+
+#include "libxl_internal.h"
+
+int libxl__disk_hotplug(libxl__gc *gc, libxl__device *dev)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *be_path = libxl__device_backend_path(gc, dev);
+    struct stat stab;
+    char *stype, *sstate, *script, *params;
+    char **args;
+    int nr = 0;
+    flexarray_t *f_args;
+
+    script = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s", be_path, "script"));
+    if (!script) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to read script from %s",
+                   be_path);
+        return -1;
+    }
+
+    params = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s", be_path, "params"));
+    if (!params)
+        return -1;
+
+    sstate = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s", be_path, "state"));
+    if (!sstate) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to read state from %s",
+                   be_path);
+        return -1;
+    }
+
+    if (stat(params, &stab) < 0) {
+        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to get stat info\n");
+        return -1;
+    }
+    if (S_ISBLK(stab.st_mode))
+        stype = "phy";
+    if (S_ISREG(stab.st_mode))
+        stype = "file";
+    if (stype == NULL) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Not block or regular file");
+        return -1;
+    }
+
+    f_args = flexarray_make(5, 1);
+    if (!f_args)
+        return -1;
+
+    flexarray_set(f_args, nr++, script);
+    flexarray_set(f_args, nr++, be_path);
+    flexarray_set(f_args, nr++, sstate);
+    flexarray_set(f_args, nr++, stype);
+    flexarray_set(f_args, nr++, NULL);
+
+    args = (char **) flexarray_contents(f_args);
+
+    LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Calling disk hotplug script: %s %s %s %s",
+               args[0], args[1], args[2], args[3]);
+    if (libxl__forkexec(gc, -1, -1, -1, args) < 0) {
+        free(args);
+        return -1;
+    }
+
+    free(args);
+    return 0;
+}
+
+int libxl__nic_hotplug(libxl__gc *gc, libxl__device *dev)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *be_path = libxl__device_backend_path(gc, dev);
+    char *sstate, *script;
+    char **args;
+    int nr = 0;
+    int rc = -1;
+    flexarray_t *f_args;
+
+    script = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s", be_path, "script"));
+    if (!script) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to read script from %s",
+                   be_path);
+        return -1;
+    }
+
+    sstate = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s", be_path, "state"));
+    if (!sstate) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to read state from %s",
+                   be_path);
+        return -1;
+    }
+
+    f_args = flexarray_make(4, 1);
+    if (!f_args)
+        return -1;
+
+    flexarray_set(f_args, nr++, script);
+    flexarray_set(f_args, nr++, be_path);
+    flexarray_set(f_args, nr++, sstate);
+    flexarray_set(f_args, nr++, NULL);
+
+    args = (char **) flexarray_contents(f_args);
+
+    LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Calling nic hotplug script: %s %s %s",
+               args[0], args[1], args[2]);
+    if (libxl__forkexec(gc, -1, -1, -1, args) < 0) {
+        goto out;
+    }
+    rc = 0;
+
+out:
+    free(args);
+    return rc;
+}
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl.c	Fri Sep 30 14:38:55 2011 +0200
@@ -1056,6 +1056,10 @@ int libxl_device_disk_add(libxl_ctx *ctx
     flexarray_append(back, disk->readwrite ? "w" : "r");
     flexarray_append(back, "device-type");
     flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
+    flexarray_append(back, "script");
+    flexarray_append(back, libxl__sprintf(&gc, "%s/%s",
+                                          libxl_xen_script_dir_path(),
+                                          "block"));
 
     flexarray_append(front, "backend-id");
     flexarray_append(front, libxl__sprintf(&gc, "%d", disk->backend_domid));
@@ -1075,6 +1079,14 @@ int libxl_device_disk_add(libxl_ctx *ctx
         goto out_free;
     }
 
+    /* Call hotplug scripts to attach device */
+    if (libxl__device_execute_hotplug(&gc, &device) < 0) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unable to execute hotplug script for disk: %s\n",
+                   disk->pdev_path);
+        rc = -1;
+        goto out_free;
+    }
+
     rc = 0;
 
 out_free:
@@ -1523,6 +1535,14 @@ int libxl_device_nic_add(libxl_ctx *ctx,
         goto out_free;
     }
 
+    /* Call hotplug scripts to attach device */
+    if (libxl__device_execute_hotplug(&gc, &device) < 0) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unable to execute hotplug script for nic: %s\n",
+                   nic->ifname);
+        rc = -1;
+        goto out_free;       
+    }
+
     rc = 0;
 out_free:
     flexarray_free(back);
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl_device.c	Fri Sep 30 14:38:55 2011 +0200
@@ -68,6 +68,24 @@ int libxl__parse_backend_path(libxl__gc 
     return libxl__device_kind_from_string(strkind, &dev->backend_kind);
 }
 
+int libxl__device_execute_hotplug(libxl__gc *gc, libxl__device *dev)
+{
+    int rc = 0;
+
+    switch(dev->kind) {
+    case LIBXL__DEVICE_KIND_VIF:
+        rc = libxl__nic_hotplug(gc, dev);
+        break;
+    case LIBXL__DEVICE_KIND_VBD:
+        rc = libxl__disk_hotplug(gc, dev);
+        break;
+    default:
+        break;
+    }
+
+    return rc;
+}
+
 int libxl__device_generic_add(libxl__gc *gc, libxl__device *device,
                              char **bents, char **fents)
 {
@@ -405,6 +423,7 @@ static int wait_for_dev_destroy(libxl__g
     unsigned int n;
     fd_set rfds;
     char **l1 = NULL;
+    libxl__device dev;
 
     rc = 1;
     nfds = xs_fileno(ctx->xsh) + 1;
@@ -416,6 +435,8 @@ static int wait_for_dev_destroy(libxl__g
             char *state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
             if (!state || atoi(state) == 6) {
                 xs_unwatch(ctx->xsh, l1[0], l1[1]);
+                libxl__parse_backend_path(gc, l1[XS_WATCH_PATH], &dev);
+                libxl__device_execute_hotplug(gc, &dev);
                 xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
                 LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Destroyed device backend at %s", l1[XS_WATCH_TOKEN]);
                 rc = 0;
@@ -442,6 +463,7 @@ int libxl__device_remove(libxl__gc *gc, 
     if (!state)
         goto out;
     if (atoi(state) != 4) {
+        libxl__device_execute_hotplug(gc, dev);
         libxl__device_destroy_tapdisk(gc, be_path);
         xs_rm(ctx->xsh, XBT_NULL, be_path);
         goto out;
@@ -462,6 +484,7 @@ retry_transaction:
 
     xs_watch(ctx->xsh, state_path, be_path);
     libxl__device_destroy_tapdisk(gc, be_path);
+    libxl__device_execute_hotplug(gc, dev);
 
     if (wait) {
         struct timeval tv;
@@ -482,6 +505,12 @@ int libxl__device_destroy(libxl__gc *gc,
     char *be_path = libxl__device_backend_path(gc, dev);
     char *fe_path = libxl__device_frontend_path(gc, dev);
 
+    /* 
+     * Run hotplug scripts, which will probably not be able to
+     * execute successfully since the device may still be plugged
+     */
+    libxl__device_execute_hotplug(gc, dev);
+
     xs_rm(ctx->xsh, XBT_NULL, be_path);
     xs_rm(ctx->xsh, XBT_NULL, fe_path);
 
diff -r d14479efe33c -r 8800c37a5acb tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Fri Oct 14 13:38:30 2011 +0200
+++ b/tools/libxl/libxl_internal.h	Fri Sep 30 14:38:55 2011 +0200
@@ -250,6 +250,11 @@ _hidden int libxl__wait_for_backend(libx
 /* OS dependant helper function */
 _hidden int try_phy_backend(mode_t st_mode);
 
+/* hotplug functions */
+_hidden int libxl__device_execute_hotplug(libxl__gc *gc, libxl__device *dev);
+_hidden int libxl__disk_hotplug(libxl__gc *gc, libxl__device *dev);
+_hidden int libxl__nic_hotplug(libxl__gc *gc, libxl__device *dev);
+
 /* from libxl_pci */
 
 _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:45:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:45:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REi57-0006WB-6c; Fri, 14 Oct 2011 06:45:49 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhxp-0003uR-If
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:38:18 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318599478!22330356!5
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32181 invoked from network); 14 Oct 2011 13:38:14 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 13:38:14 -0000
Received: by mail-wy0-f171.google.com with SMTP id 13so3901391wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 06:38:14 -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=+2nquKbI/fN4GkVtEE7EnqCfJYBq5K3nhJV11dXZhuc=;
	b=Te8VOVctxQiRxX6Ych2VkLNeLnep+sZoYjYH39229/G0mmEDv/+e7Zbyu/W4dyzlRa
	OCyrWgnFRThgiEqdp6NKyjKcetrxcyyL5kXCBq3tC4sAK1fXlXcK3p+23kVx263z1KGN
	41Ssc0UJY0IM0ngAM7nbZGtFjtrECOADg4i74=
Received: by 10.216.9.141 with SMTP id 13mr883245wet.79.1318599494455;
	Fri, 14 Oct 2011 06:38:14 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id h39sm14299709wbo.0.2011.10.14.06.38.12
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 14 Oct 2011 06:38:13 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 2a7a580b84556a11e26be0f15864704ae5a7f0c0
Message-Id: <2a7a580b84556a11e26b.1318599339@loki>
In-Reply-To: <patchbomb.1318599332@loki>
References: <patchbomb.1318599332@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 14 Oct 2011 15:35:39 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 7 of 9] hotplug NetBSD: detach devices when
	state is 5 or 6
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317386335 -7200
# Node ID 2a7a580b84556a11e26be0f15864704ae5a7f0c0
# Parent  8800c37a5acba9e95ac8005ea123d3e9954be001
hotplug NetBSD: detach devices when state is 5 or 6

With the move of hotplug calls from xenbackendd to libxl, we can detach devices when the state is 5 or 6.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 8800c37a5acb -r 2a7a580b8455 tools/hotplug/NetBSD/block
--- a/tools/hotplug/NetBSD/block	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/hotplug/NetBSD/block	Fri Sep 30 14:38:55 2011 +0200
@@ -23,7 +23,7 @@ xtype=$3
 xparams=$(xenstore-read "$xpath/params")
 
 case $xstatus in
-6)
+5|6)
 	# device removed
 	case $xtype in
 	file)
diff -r 8800c37a5acb -r 2a7a580b8455 tools/hotplug/NetBSD/vif-bridge
--- a/tools/hotplug/NetBSD/vif-bridge	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/hotplug/NetBSD/vif-bridge	Fri Sep 30 14:38:55 2011 +0200
@@ -14,7 +14,7 @@ xpath=$1
 xstatus=$2
 
 case $xstatus in
-6)
+5|6)
 	# device removed
 	xenstore-rm $xpath
 	exit 0
diff -r 8800c37a5acb -r 2a7a580b8455 tools/hotplug/NetBSD/vif-ip
--- a/tools/hotplug/NetBSD/vif-ip	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/hotplug/NetBSD/vif-ip	Fri Sep 30 14:38:55 2011 +0200
@@ -14,7 +14,7 @@ xpath=$1
 xstatus=$2
 
 case $xstatus in
-6)
+5|6)
 	# device removed
 	xenstore-rm $xpath
 	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 Oct 14 06:46:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:46:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REi69-0006tZ-WD; Fri, 14 Oct 2011 06:46:54 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhxr-0003vP-W1
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:38:20 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318599478!22330356!6
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32282 invoked from network); 14 Oct 2011 13:38:17 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 13:38:17 -0000
Received: by mail-wy0-f171.google.com with SMTP id 13so3901391wyh.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 06:38:17 -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=ENws5XvbsSax0oUcrqbKic3a/RPNz4tt93l1nPGNb7c=;
	b=ugwZSC4pO3j5zeRSSKSWTh3bffmERmBFtwiVgnZEy/k5Zy0FkX+4aNrhhm+8nd9nnV
	K8PuA36hb0KWhxDUZq+M8cRpzuidGZAVE3lWo/azXuBi9uh1j3941INsMXzaajgQT5QZ
	sV0q9ynRguMeCGSwIHnVKZ2aFCIRf+RVrFHnM=
Received: by 10.227.11.147 with SMTP id t19mr2926464wbt.72.1318599496943;
	Fri, 14 Oct 2011 06:38:16 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id h39sm14299709wbo.0.2011.10.14.06.38.14
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 14 Oct 2011 06:38:15 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 07502345baca44478e3086515a071b24c5aa9a33
Message-Id: <07502345baca44478e30.1318599340@loki>
In-Reply-To: <patchbomb.1318599332@loki>
References: <patchbomb.1318599332@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 14 Oct 2011 15:35:40 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 8 of 9] hotplug: remove debug messages from
 NetBSD hotplug scripts
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318595892 -7200
# Node ID 07502345baca44478e3086515a071b24c5aa9a33
# Parent  2a7a580b84556a11e26be0f15864704ae5a7f0c0
hotplug: remove debug messages from NetBSD hotplug scripts

Remove unecessary debug messages from NetBSD hotplug scripts, left error messages only.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 2a7a580b8455 -r 07502345baca tools/hotplug/NetBSD/block
--- a/tools/hotplug/NetBSD/block	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/hotplug/NetBSD/block	Fri Oct 14 14:38:12 2011 +0200
@@ -64,14 +64,12 @@ 2)
 			if [ "$status" = "free" ] && \
 			    vnconfig /dev/${disk}d $xparams >/dev/null; then
 				device=/dev/${disk}d
-				echo vnconfig /dev/${disk}d $xparams
 				break	
 			fi
 		done
 		if [ x$device = x ] ; then
 			error "no available vnd device"
 		fi
-		echo xenstore-write $xpath/vnd $device
 		xenstore-write $xpath/vnd $device
 		;;
 	phy)
@@ -79,9 +77,7 @@ 2)
 		;;
 	esac
 	physical_device=$(stat -f '%r' "$device")
-	echo xenstore-write $xpath/physical-device $physical_device
 	xenstore-write $xpath/physical-device $physical_device
-	echo xenstore-write $xpath/hotplug-status connected
 	xenstore-write $xpath/hotplug-status connected
 	exit 0
 	;;
diff -r 2a7a580b8455 -r 07502345baca tools/hotplug/NetBSD/vif-bridge
--- a/tools/hotplug/NetBSD/vif-bridge	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/hotplug/NetBSD/vif-bridge	Fri Oct 14 14:38:12 2011 +0200
@@ -24,12 +24,9 @@ 2)
 	xfid=$(xenstore-read "$xpath/frontend-id")
 	xhandle=$(xenstore-read "$xpath/handle")
 	iface=$(xenstore-read "$xpath/vifname")
-	echo ifconfig $iface up
 	ifconfig $iface up
 	brconfig $xbridge add $iface
-	echo brconfig $xbridge add $iface
 	xenstore-write $xpath/hotplug-status connected
-	echo xenstore-write $xpath/hotplug-status connected
 	exit 0
 	;;
 *)
diff -r 2a7a580b8455 -r 07502345baca tools/hotplug/NetBSD/vif-ip
--- a/tools/hotplug/NetBSD/vif-ip	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/hotplug/NetBSD/vif-ip	Fri Oct 14 14:38:12 2011 +0200
@@ -24,10 +24,8 @@ 2)
 	xfid=$(xenstore-read "$xpath/frontend-id")
 	xhandle=$(xenstore-read "$xpath/handle")
 	iface=$(xenstore-read "$xpath/vifname")
-	echo ifconfig $iface $xip up
 	ifconfig $iface $xip up
 	xenstore-write $xpath/hotplug-status connected
-	echo xenstore-write $xpath/hotplug-status connected
 	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 Oct 14 06:47:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:47:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REi72-0007GZ-91; Fri, 14 Oct 2011 06:47:48 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhxu-0003wF-Mc
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:38:23 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318599499!1053959!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8220 invoked from network); 14 Oct 2011 13:38:19 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 13:38:19 -0000
Received: by eyb6 with SMTP id 6so1914296eyb.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 06:38:19 -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=cw52vnaBmoiRJ3ogEj3JIqphBiRZL5hCTD6dPQCosYM=;
	b=HfgxULNRgipDhpXUJp2NO0h2g+NiVW5zqxASsl/Tj9jwbfEBx3U3er1LFlJcxqhj+v
	jRAgi8ObtIBmlbaT6WUUGAR6t/u/1HohiVPzl36ssB1TfW/aBBNa8gSjEHxGSBdvlUNR
	O5rWxH+GjlirevMx1UNb9UiL6rlKo3fsuc+sc=
Received: by 10.216.160.72 with SMTP id t50mr2912469wek.10.1318599499412;
	Fri, 14 Oct 2011 06:38:19 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id h39sm14299709wbo.0.2011.10.14.06.38.17
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 14 Oct 2011 06:38:18 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 40f928cba711eed3823158bc6aa1c8f5ea54bfb1
Message-Id: <40f928cba711eed38231.1318599341@loki>
In-Reply-To: <patchbomb.1318599332@loki>
References: <patchbomb.1318599332@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 14 Oct 2011 15:35:41 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 9 of 9] rc.d NetBSD: don't start xenbackendd by
 default, only when xend needs 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

# HG changeset patch
# User Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1317386335 -7200
# Node ID 40f928cba711eed3823158bc6aa1c8f5ea54bfb1
# Parent  07502345baca44478e3086515a071b24c5aa9a33
rc.d NetBSD: don't start xenbackendd by default, only when xend needs it.

With the move of hotplug scripts from xenbackendd to libxl xenbackendd is no longer needed by libxl, only start it when xend is started.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 07502345baca -r 40f928cba711 tools/hotplug/NetBSD/rc.d/xenbackendd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/hotplug/NetBSD/rc.d/xenbackendd	Fri Sep 30 14:38:55 2011 +0200
@@ -0,0 +1,27 @@
+#!/bin/sh
+#
+# PROVIDE: xenbackendd
+# REQUIRE: xencommons
+
+. /etc/rc.subr
+
+DIR=$(dirname "$0")
+. "${DIR}/xen-hotplugpath.sh"
+
+LD_LIBRARY_PATH="${LIBDIR}"
+export LD_LIBRARY_PATH PYTHONPATH
+PATH="${PATH}:${SBINDIR}"
+export PATH
+
+name="xenbackendd"
+rcvar=$name
+command="${SBINDIR}/xenbackendd"
+if [ -n "${XENBACKENDD_DEBUG}" ]; then
+	command_args="${XENBACKENDD_ARGS} -d"
+else
+	command_args="${XENBACKENDD_ARGS}"
+fi
+
+load_rc_config $name
+run_rc_command "$1"
+
diff -r 07502345baca -r 40f928cba711 tools/hotplug/NetBSD/rc.d/xencommons
--- a/tools/hotplug/NetBSD/rc.d/xencommons	Fri Oct 14 14:38:12 2011 +0200
+++ b/tools/hotplug/NetBSD/rc.d/xencommons	Fri Sep 30 14:38:55 2011 +0200
@@ -22,8 +22,6 @@ required_files="/kern/xen/privcmd"
 
 XENSTORED_PIDFILE="/var/run/xenstored.pid"
 XENCONSOLED_PIDFILE="/var/run/xenconsoled.pid"
-XENBACKENDD_PIDFILE="/var/run/xenbackendd.pid"
-#XENBACKENDD_DEBUG=1
 #XENCONSOLED_TRACE="/var/log/xen/xenconsole-trace.log"
 #XENSTORED_TRACE="/var/log/xen/xenstore-trace.log"
 
@@ -46,7 +44,7 @@ xen_startcmd()
 			XENSTORED_ROOTDIR="/var/lib/xenstored"
 		fi
 		rm -f ${XENSTORED_ROOTDIR}/tdb* >/dev/null 2>&1
-		printf "Starting xenservices: xenstored, xenconsoled, xenbackendd."
+		printf "Starting xenservices: xenstored, xenconsoled."
 		XENSTORED_ARGS=" --pid-file ${XENSTORED_PIDFILE}"
 		if [ -n "${XENSTORED_TRACE}" ]; then
 			XENSTORED_ARGS="${XENSTORED_ARGS} -T /var/log/xen/xenstored-trace.log"
@@ -58,7 +56,7 @@ xen_startcmd()
 			sleep 1
 		done
 	else
-		printf "Starting xenservices: xenconsoled, xenbackendd."
+		printf "Starting xenservices: xenconsoled."
 	fi
 
 	XENCONSOLED_ARGS=""
@@ -68,13 +66,6 @@ xen_startcmd()
 
 	${SBINDIR}/xenconsoled ${XENCONSOLED_ARGS}
 
-	XENBACKENDD_ARGS=""
-	if [ -n "${XENBACKENDD_DEBUG}" ]; then
-		XENBACKENDD_ARGS="${XENBACKENDD_ARGS} -d"
-	fi
-
-	${SBINDIR}/xenbackendd ${XENBACKENDD_ARGS}
-
 	printf "\n"
 
 	printf "Setting domain 0 name.\n"
@@ -87,8 +78,6 @@ xen_stop()
 	printf "Stopping xencommons.\n"
 	printf "WARNING: Not stopping xenstored, as it cannot be restarted.\n"
 
-	rc_pid=$(check_pidfile ${XENBACKENDD_PIDFILE} ${SBINDIR}/xenbackendd)
-	pids="$pids $rc_pid"
 	rc_pid=$(check_pidfile ${XENCONSOLED_PIDFILE} ${SBINDIR}/xenconsoled)
 	pids="$pids $rc_pid"
 
@@ -108,17 +97,12 @@ xen_status()
 		pids="$pids $xenconsoled_pid"
 	fi
 
-	xenbackend_pid=$(check_pidfile ${XENBACKENDD_PIDFILE} ${SBINDIR}/xenbackendd)
-	if test -n ${xenbackend_pid}; then
-		pids="$pids $xenbackend_pid"
-	fi
-
-	if test -n "$xenbackend_pid" -a -n "$xenconsoled_pid" -a -n "$xenstored_pid";
+	if test -n "$xenconsoled_pid" -a -n "$xenstored_pid";
 	then
 		echo "xencommons are running as pids $pids."
 		return 0
 	fi
-	if test -z "$xenbackend_pid" -a -z "$xenconsoled_pid" -a -z "$xenstored_pid";
+	if test -z "$xenconsoled_pid" -a -z "$xenstored_pid";
 	then
 		echo "xencommons are not running."
 		return 0
@@ -134,11 +118,6 @@ xen_status()
 	else
 		echo "xenconsoled is not running."
 	fi
-	if test -n $xenbackend_pid; then
-		echo "xenbackendd is running as pid $xenbackend_pid."
-	else
-		echo "xenbackendd is not running."
-	fi
 }
 
 load_rc_config $name
diff -r 07502345baca -r 40f928cba711 tools/hotplug/NetBSD/rc.d/xend
--- a/tools/hotplug/NetBSD/rc.d/xend	Fri Oct 14 14:38:12 2011 +0200
+++ b/tools/hotplug/NetBSD/rc.d/xend	Fri Sep 30 14:38:55 2011 +0200
@@ -1,7 +1,7 @@
 #!/bin/sh
 #
 # PROVIDE: xend
-# REQUIRE: xencommons
+# REQUIRE: xencommons xenbackendd
 
 . /etc/rc.subr
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:48:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:48:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REi7z-0007l9-Cm; Fri, 14 Oct 2011 06:48:47 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REhy5-00040d-Ez
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:38:33 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1318599490!116293!3
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26030 invoked from network); 14 Oct 2011 13:38:30 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 13:38:30 -0000
Received: by mail-ww0-f43.google.com with SMTP id 27so2864651wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 06:38:30 -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=8XhRQhXo85UjpNKHQ8Jqad5D88lp18oM8klXGX6o76Q=;
	b=pNVgtQ01jPzdh6XFUppBZuzmpcDtc/Rz/S0LeqG3HbnN3GHOP30SPMPG680AEPB8kZ
	JSf26sn8NqFcCZ9dJ2O8ugvwiX58oX8TEE+PybUeSs1tknYjjDhvZs0o0zUd6bHSLOCC
	IyUWvtYOYTRUM75C65LK3Qp9xH9pX8XSzwa4g=
Received: by 10.227.195.196 with SMTP id ed4mr2959193wbb.96.1318599482968;
	Fri, 14 Oct 2011 06:38:02 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id h39sm14299709wbo.0.2011.10.14.06.38.00
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 14 Oct 2011 06:38:01 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 873e4a1309ce5da0305611ce2e2b460df052019b
Message-Id: <873e4a1309ce5da03056.1318599334@loki>
In-Reply-To: <patchbomb.1318599332@loki>
References: <patchbomb.1318599332@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Fri, 14 Oct 2011 15:35:34 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 2 of 9] libxl: fix for libxl not waiting for
 devices to disconnect
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1317386335 -7200
# Node ID 873e4a1309ce5da0305611ce2e2b460df052019b
# Parent  deb93254ad05ffa13caa64f0159800f04c82666b
libxl: fix for libxl not waiting for devices to disconnect

libxl was ignoring the timeout and the number of devices to wait before destroying them.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r deb93254ad05 -r 873e4a1309ce tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Fri Sep 30 14:38:55 2011 +0200
+++ b/tools/libxl/libxl_device.c	Fri Sep 30 14:38:55 2011 +0200
@@ -391,6 +391,9 @@ static int wait_for_dev_destroy(libxl__g
             }
             free(l1);
         }
+    } else {
+        /* timeout reached */
+        rc = 0;
     }
     return rc;
 }
@@ -531,7 +534,7 @@ int libxl__devices_destroy(libxl__gc *gc
         tv.tv_usec = 0;
         while (n_watches > 0) {
             if (wait_for_dev_destroy(gc, &tv)) {
-                break;
+                continue;
             } else {
                 n_watches--;
             }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:55:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:55:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REiEr-0008HJ-5w; Fri, 14 Oct 2011 06:55:53 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REiEL-000859-BI
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:55:21 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1318600516!31614992!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5133 invoked from network); 14 Oct 2011 13:55:18 -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; 14 Oct 2011 13:55:18 -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
	p9EDtA13010094
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 14 Oct 2011 13:55:12 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
	p9EDt9KI006294
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 13:55:09 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9EDt0CR003360; Fri, 14 Oct 2011 08:55:01 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 14 Oct 2011 06:55:00 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id EE9041BE; Fri, 14 Oct 2011 09:54:59 -0400 (EDT)
Date: Fri, 14 Oct 2011 09:54:59 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Dario Faggioli <raistlin@linux.it>
Subject: Re: [Xen-devel] Re: [PATCH] xen/gntdev: Fix sleep-inside-spinlock
Message-ID: <20111014135459.GA4577@phenom.oracle.com>
References: <1318353219.21925.80.camel@Palantir>
	<20111011173228.GB32406@phenom.oracle.com>
	<4E9495F6.4070301@tycho.nsa.gov>
	<1318586226.5062.21.camel@Palantir>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318586226.5062.21.camel@Palantir>
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.4E983F41.0096:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	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 Fri, Oct 14, 2011 at 11:57:05AM +0200, Dario Faggioli wrote:
> On Tue, 2011-10-11 at 15:16 -0400, Daniel De Graaf wrote:
> > gntdev_put_map tries to acquire a mutex when freeing pages back to the
> > xenballoon pool, so it cannot be called with a spinlock held. In
> > gntdev_release, the spinlock is not needed as we are freeing the
> > structure later; in the ioctl, only the list manipulation needs to be
> > under the lock.
> > 
> > Reported-By: Dario Faggioli <raistlin@linux.it>
> > Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> >
> Ok, I finally manage in testing this, and it actually cures the issue
> here!
> 
> You can add a tested-by tag if you like. Just, if you don't mind, use my
> corp. e-mail for (both?) the tag(s): <dario.faggioli@citrix.com>

Sure. Thx for checking it.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 06:57:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 06:57:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REiGH-0000Fm-QA; Fri, 14 Oct 2011 06:57:21 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REiFc-0008SX-T8
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:56:41 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1318600596!22177172!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7050 invoked from network); 14 Oct 2011 13:56:37 -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 Oct 2011 13:56: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
	p9EDuXuR011942
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 14 Oct 2011 13:56:35 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
	p9EDuXvv009196
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 13:56:33 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
	p9EDuRps015609; Fri, 14 Oct 2011 08:56:28 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 14 Oct 2011 06:56:28 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 34F501BE; Fri, 14 Oct 2011 09:56:27 -0400 (EDT)
Date: Fri, 14 Oct 2011 09:56:27 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Igor Mammedov <imammedo@redhat.com>
Subject: Re: [Xen-devel] Features and bug fixes for Linux kernel 3.2.
Message-ID: <20111014135627.GC4577@phenom.oracle.com>
References: <20111013190946.GA16336@phenom.oracle.com>
	<4E9825AC.9050708@redhat.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9825AC.9050708@redhat.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.0A090202.4E983F94.000D:SCFMA922111,ss=1,re=-4.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 Fri, Oct 14, 2011 at 02:06:04PM +0200, Igor Mammedov wrote:
> On 10/13/2011 09:09 PM, Konrad Rzeszutek Wilk wrote:
> >Hey,
> >
> >Please keep in mind that there is some outstanding work going on which
> >could make it in 3.2 depending on when the merge window opens. I will
> >enumerate those in the next email.
> >
> >Anyhow, for 3.2 Linux kernel we have these items loaded and ready to go:
> >
> >  - A new mechanism to parse the E820 resulting in better ballooning.
> >  - hwclock support. Meaning you can do 'date XX' and it will be saved by machine.
> >  - Support for PCI multi-segmented machines (big big iron boxes)
> >  - Optimizations in DMA API.
> >  - "feature-barrier" in the xen-blkback so that older kernels (SLES10)
> >    can issue those.
> >  - "feature-discard" so that TRIM/SCSI UNMAP operations can be utilized.
> >  - kexec/kdump support for PVonHVM.
> >  - Cleanups in the code (mostly scripts/cleanpatch.pl)
> >  - Static analyzer (smatch) run results fixing bugs.
> >  - Tons of bug fixes.
> >
> >If you think I missed something - please please email me immediately.
> >
> >
> >The list is as follow.
> >
> >Dan Carpenter (1):
> >       xen/pciback: double lock typo
> >
> >David Vrabel (9):
> >       xen/balloon: account for pages released during memory setup
> >       xen/balloon: simplify test for the end of usable RAM
> >       xen: allow balloon driver to use more than one memory region
> >       xen: allow extra memory to be in multiple regions
> >       xen: release all pages within 1-1 p2m mappings
> >       xen: use generic functions instead of xen_{alloc, free}_vm_area()
> >       block: xen-blkback: use API provided by xenbus module to map rings
> >       net: xen-netback: use API provided by xenbus module to map rings
> >       xen: map foreign pages for shared rings by updating the PTEs directly
> >
> >Jan Beulich (5):
> >       xen/pci: make bus notifier handler return sane values
> >       xen/pciback: use mutex rather than spinlock in passthrough backend
> >       xen/pciback: miscellaneous adjustments
> >       xen/pci: support multi-segment systems
> >       xen-blkback: use kzalloc() in favor of kmalloc()+memset()
> >
> >Jeremy Fitzhardinge (2):
> >       xen: add dom0_op hypercall
> >       xen/dom0: set wallclock time in Xen
> >
> >Joe Jin (1):
> >       xen-blkback: fixed indentation and comments
> >
> >Konrad Rzeszutek Wilk (24):
> >       Revert "xen/debug: WARN_ON when identity PFN has no _PAGE_IOMAP flag set."
> >       xen-pcifront: Update warning comment to use 'e820_host' option.
> >       xen-swiotlb: Retry up three times to allocate Xen-SWIOTLB
> >       xen-swiotlb: Fix wrong panic.
> >       xen-swiotlb: When doing coherent alloc/dealloc check before swizzling the MFNs.
> >       xen/pciback: Use mutexes when working with Xenbus state transitions.
> >       xen/pciback: use mutex rather than spinlock in vpci backend
> >       xen/p2m: Make debug/xen/mmu/p2m visible again.
> >       xen/p2m: Use SetPagePrivate and its friends for M2P overrides.
> >       x86/paravirt: Partially revert "remove lazy mode in interrupts"
> 
> Have You meant ^^^ "x86/paravirt: PTE updates in k(un)map_atomic need to be synchronous, regardless of lazy_mmu mode" there?

Ah, yes, and I believe that patch is actually carried by Andrew Morton,
so let me drop it here.

Thanks for spotting that!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 07:01:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 07:01:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REiKh-0000hx-Df; Fri, 14 Oct 2011 07:01:55 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REiHt-0000SV-R0
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 06:59:18 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318600721!41679297!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31137 invoked from network); 14 Oct 2011 13:58:42 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2011 13:58:42 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9EDwjSv014902
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Fri, 14 Oct 2011 13:58:47 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9EDwith007806
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 13:58:45 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
	p9EDwdZb017186; Fri, 14 Oct 2011 08:58:39 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 14 Oct 2011 06:58:39 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id C7E7E1BE; Fri, 14 Oct 2011 09:58:38 -0400 (EDT)
Date: Fri, 14 Oct 2011 09:58:38 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Zhengwang Ruan (Royo)" <zhengwang.ruan@gmail.com>
Subject: Re: [Xen-devel] Several questions from a freshman to Xen
Message-ID: <20111014135838.GE4577@phenom.oracle.com>
References: <4E9708E5.9060104@gmail.com>
	<20111013184228.GK15499@phenom.oracle.com>
	<4E983344.8060907@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <4E983344.8060907@gmail.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: quoted-printable
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090205.4E984017.00F0,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 Fri, Oct 14, 2011 at 09:04:04PM +0800, Zhengwang Ruan (Royo) wrote:
>=20
>=20
> On 2011=E5=B9=B410=E6=9C=8814=E6=97=A5 02:42, Konrad Rzeszutek Wilk wro=
te:
> >On Thu, Oct 13, 2011 at 11:51:01PM +0800, Zhengwang Ruan (Royo) wrote:
> >>Hi Guys,
> >>
> >>I am new man with some confusions to this amazing technology, hope
> >>you guys give answers to help me better understand Xen. :)
> >>
> >>1, You guys have been working on developing many releases, do you
> >>guys have agreements on developing every source code based on a
> >>fixed linux kernel version before starting a new release? If so, how
> >No.
> >>could I know the corresponding kernel version to a given xen
> >>release? I tried to find answer for myself on the following wiki
> >>page, but it is not latest enough.
> >Anything past 3.0 kernel should work. Every Linux kernel release
> >we fix bugs and add new features.
>=20
> They are the kernel releases in the git repository
>=20
> http://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git

Well, not yet since the git.kernel.org had an issue. Instead use
the upstream kernel which has all of those features.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 07:05:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 07:05:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REiOT-0001Eh-Qe; Fri, 14 Oct 2011 07:05:49 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REiJZ-0000Wb-JG
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 07:00:48 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318600813!41935084!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30053 invoked from network); 14 Oct 2011 14:00:14 -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; 14 Oct 2011 14:00:14 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9EE0cUE025841
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Fri, 14 Oct 2011 14:00:40 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9EDsbHR006090
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 13:54:37 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
	p9EE0VD1018803; Fri, 14 Oct 2011 09:00:31 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 14 Oct 2011 07:00:31 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id AFDFD1BE; Fri, 14 Oct 2011 10:00:30 -0400 (EDT)
Date: Fri, 14 Oct 2011 10:00:30 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Anthony Wright <anthony@overnetdata.com>
Subject: Re: [Xen-devel] Para-Virt DomU + HVM DomU with xen 4.1.1 & linux
	3.0.6 locks up system
Message-ID: <20111014140030.GF4577@phenom.oracle.com>
References: <4E983A91.8040409@overnetdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E983A91.8040409@overnetdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090203.4E984088.0149,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 Fri, Oct 14, 2011 at 02:35:13PM +0100, Anthony Wright wrote:
> I have xen 4.1.1 running with a 3.0.6 linux kernel, both 32 bit.
> 
> If I run 2 x para-virtualized DomUs they run fine. If I run 2 x HVM
> DomUs they run fine. If I run 1 x para-virtualized and 1 x HVM DomU (it
> doesn't matter which one is run first & which second), the system locks
> up just after I start the second DomU.

Locks up you say? When you launch the second guest, can you
also run 'while (true); do; xl list; sleep 1; done' to see if the memory
for Dom0 is going down to unreasonable amount?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 07:12:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 07:12:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REiVC-0001jX-Qk; Fri, 14 Oct 2011 07:12:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REiU4-0001WG-0h
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 07:11:37 -0700
X-Env-Sender: zhengwang.ruan@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318601461!59207924!1
X-Originating-IP: [209.85.216.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18386 invoked from network); 14 Oct 2011 14:11:02 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 14:11:02 -0000
Received: by qyk29 with SMTP id 29so1382560qyk.9
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 07:11:31 -0700 (PDT)
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
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=dh3qoExsc9RKMAzmY0MepoDXF4CHQy4ri8B7FFr3BD0=;
	b=JWEcNjwP4fRN00PNMMg1WAGEEQGWbKXSKaGay2ffXAVnWFaeBglF3U9e71DRxVJVro
	BljGbkVn81PsUzTajHMFVVar6/ujKl1ltXPv1zI3k1TcwbFajMtQaT7XWl7V4ksfpOqM
	EOF5FLzON0DKnNpi6jlP5dE91JsQSLnTkADZo=
Received: by 10.68.22.195 with SMTP id g3mr16981809pbf.108.1318601491369;
	Fri, 14 Oct 2011 07:11:31 -0700 (PDT)
Received: from [192.168.1.102] ([180.184.200.59])
	by mx.google.com with ESMTPS id z1sm23386176pbl.5.2011.10.14.07.11.29
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 07:11:30 -0700 (PDT)
Message-ID: <4E984303.3080906@gmail.com>
Date: Fri, 14 Oct 2011 22:11:15 +0800
From: "Zhengwang Ruan (Royo)" <zhengwang.ruan@gmail.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110922 Thunderbird/3.1.15
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Several questions from a freshman to Xen
References: <4E9708E5.9060104@gmail.com>
	<20111013184228.GK15499@phenom.oracle.com>
	<4E983344.8060907@gmail.com>
	<20111014135838.GE4577@phenom.oracle.com>
In-Reply-To: <20111014135838.GE4577@phenom.oracle.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
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 2011å¹´10æœˆ14æ—¥ 21:58, Konrad Rzeszutek Wilk wrote:
> On Fri, Oct 14, 2011 at 09:04:04PM +0800, Zhengwang Ruan (Royo) wrote:
>>
>> On 2011å¹´10æœˆ14æ—¥ 02:42, Konrad Rzeszutek Wilk wrote:
>>> On Thu, Oct 13, 2011 at 11:51:01PM +0800, Zhengwang Ruan (Royo) wrote:
>>>> Hi Guys,
>>>>
>>>> I am new man with some confusions to this amazing technology, hope
>>>> you guys give answers to help me better understand Xen. :)
>>>>
>>>> 1, You guys have been working on developing many releases, do you
>>>> guys have agreements on developing every source code based on a
>>>> fixed linux kernel version before starting a new release? If so, how
>>> No.
>>>> could I know the corresponding kernel version to a given xen
>>>> release? I tried to find answer for myself on the following wiki
>>>> page, but it is not latest enough.
>>> Anything past 3.0 kernel should work. Every Linux kernel release
>>> we fix bugs and add new features.
>> They are the kernel releases in the git repository
>>
>> http://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git
> Well, not yet since the git.kernel.org had an issue. Instead use
> the upstream kernel which has all of those features.

Ok, thank you very much!


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 07:19:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 07: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 1REibJ-0002Cq-EJ; Fri, 14 Oct 2011 07:19:05 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1REiai-0001zw-Fn
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 07:18:28 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318601890!44284894!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2083 invoked from network); 14 Oct 2011 14:18:10 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-13.tower-27.messagelabs.com with SMTP;
	14 Oct 2011 14:18:10 -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 p9EEH3f1003372
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 14 Oct 2011 10:17:03 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9EEH1hZ000771; Fri, 14 Oct 2011 10:17:02 -0400
Date: Fri, 14 Oct 2011 10:17:01 -0400
From: Jason Baron <jbaron@redhat.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111014141701.GA2433@redhat.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins> <4E971580.6030300@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E971580.6030300@goop.org>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, konrad.wilk@oracle.com,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 13, 2011 at 09:44:48AM -0700, Jeremy Fitzhardinge wrote:
> On 10/13/2011 03:54 AM, Peter Zijlstra wrote:
> > On Wed, 2011-10-12 at 17:51 -0700, Jeremy Fitzhardinge wrote:
> >> This is is all unnecessary complication if you're not using PV ticket
> >> locks, it also uses the jump-label machinery to use the standard
> >> "add"-based unlock in the non-PV case.
> >>
> >>         if (TICKET_SLOWPATH_FLAG &&
> >>             unlikely(static_branch(&paravirt_ticketlocks_enabled))) {
> >>                 arch_spinlock_t prev;
> >>
> >>                 prev = *lock;
> >>                 add_smp(&lock->tickets.head, TICKET_LOCK_INC);
> >>
> >>                 /* add_smp() is a full mb() */
> >>
> >>                 if (unlikely(lock->tickets.tail & TICKET_SLOWPATH_FLAG))
> >>                         __ticket_unlock_slowpath(lock, prev);
> >>         } else
> >>                 __add(&lock->tickets.head, TICKET_LOCK_INC, UNLOCK_LOCK_PREFIX); 
> > Not that I mind the jump_label usage, but didn't paravirt have an
> > existing alternative() thingy to do things like this? Or is the
> > alternative() stuff not flexible enough to express this?
> 
> Yeah, that's a good question.  There are three mechanisms with somewhat
> overlapping concerns:
> 
>   * alternative()
>   * pvops patching
>   * jump_labels
> 
> Alternative() is for low-level instruction substitution, and really only
> makes sense at the assembler level with one or two instructions.
> 
> pvops is basically a collection of ordinary _ops structures full of
> function pointers, but it has a layer of patching to help optimise it. 
> In the common case, this just replaces an indirect call with a direct
> one, but in some special cases it can inline code.  This is used for
> small, extremely performance-critical things like cli/sti, but it
> awkward to use in general because you have to specify the inlined code
> as a parameterless asm.
> 

I haven't look at the pvops patching (probably should), but I was
wondering if jump labels could be used for it? Or is there something
that the pvops patching is doing that jump labels can't handle?


> Jump_labels is basically an efficient way of doing conditionals
> predicated on rarely-changed booleans - so it's similar to pvops in that
> it is effectively a very ordinary C construct optimised by dynamic code
> patching.
> 

Another thing is that it can be changed at run-time...Can pvops be
adjusted at run-time as opposed to just boot-time?

thanks,

-Jason

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 07:43:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 07:43:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REiz5-0003hK-55; Fri, 14 Oct 2011 07:43:39 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REiyS-0003Tj-I4
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 07:43:01 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-11.tower-216.messagelabs.com!1318603377!1058296!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18960 invoked from network); 14 Oct 2011 14:42:57 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-11.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Oct 2011 14:42:57 -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 517B62272;
	Fri, 14 Oct 2011 17:42:56 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 38330200EF; Fri, 14 Oct 2011 17:42:56 +0300 (EEST)
Date: Fri, 14 Oct 2011 17:42:56 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Para-Virt DomU + HVM DomU with xen 4.1.1 & linux
	3.0.6 locks up system
Message-ID: <20111014144255.GN12984@reaktio.net>
References: <4E983A91.8040409@overnetdata.com>
	<20111014140030.GF4577@phenom.oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111014140030.GF4577@phenom.oracle.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Anthony Wright <anthony@overnetdata.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 14, 2011 at 10:00:30AM -0400, Konrad Rzeszutek Wilk wrote:
> On Fri, Oct 14, 2011 at 02:35:13PM +0100, Anthony Wright wrote:
> > I have xen 4.1.1 running with a 3.0.6 linux kernel, both 32 bit.
> > 
> > If I run 2 x para-virtualized DomUs they run fine. If I run 2 x HVM
> > DomUs they run fine. If I run 1 x para-virtualized and 1 x HVM DomU (it
> > doesn't matter which one is run first & which second), the system locks
> > up just after I start the second DomU.
> 
> Locks up you say? When you launch the second guest, can you
> also run 'while (true); do; xl list; sleep 1; done' to see if the memory
> for Dom0 is going down to unreasonable amount?
> 

Also are you using dom0_mem= for Xen? and did you disable dom0 ballooning?

Try enabling serial console and capturing all the Xen+dom0 console output..
http://wiki.xen.org/xenwiki/XenSerialConsole

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 07:56:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 07:56:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REjB8-0004Ht-9w; Fri, 14 Oct 2011 07:56:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REjAF-00044o-Qd
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 07:55:12 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318604089!46692343!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30129 invoked from network); 14 Oct 2011 14:54:50 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 14:54:50 -0000
Received: by wwf27 with SMTP id 27so2966361wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 07:55:08 -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=9BWwt/l95zCcSJRtaxcSsv2V0Kj9bUBHGgAsTV3EqUA=;
	b=rYu3ECSlcYC1fgglu6qpTFnR3Z11TXbhHf5EP7GrVJe1Smf41vbB+7JusjByJ6iJTw
	hw3TsejpdQjOy2HvhKr/v712DO4dQ40b8B2Vcz4LxFwQ5uUiQjRjkF6xr31LpQO9RlnU
	Tt0AiNhjUYwKT8DAJnwRwq8m9u5RMu4uZO/is=
Received: by 10.227.157.18 with SMTP id z18mr2988436wbw.85.1318604108607;
	Fri, 14 Oct 2011 07:55:08 -0700 (PDT)
Received: from [192.168.1.71]
	(host86-129-236-135.range86-129.btcentralplus.com. [86.129.236.135])
	by mx.google.com with ESMTPS id e7sm14616926wbh.12.2011.10.14.07.55.07
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 07:55:07 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 14 Oct 2011 15:55:04 +0100
Subject: Re: [Xen-devel] [PATCH] x86/MSI: drop local cpumask_t variable from
	msi_compose_msg()
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CABE0BD8.22F1D%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] x86/MSI: drop local cpumask_t variable from
	msi_compose_msg()
Thread-Index: AcyKgUFtpaeCjEX3XkGqfPtWG6G1/A==
In-Reply-To: <4E984A69020000780005B67D@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/10/2011 13:42, "Jan Beulich" <JBeulich@suse.com> wrote:

>> I wonder whether the cpus_empty() check should be a BUG_ON. Or an ASSERT
>> pushed into cpu_mask_to_apicid.
> 
> An ASSERT may be reasonable, but simply dropping the check here
> may be too - no other code path invoking cpu_mask_to_apicid() has
> a similar check.

It is certainly not valid to call cpu_mask_to_apicid with an empty mask.
Hence an ASSERT would check that precondition, and for all callers.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 08:02:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 08:02:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REjH2-0004mk-EU; Fri, 14 Oct 2011 08:02:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REjDJ-0004WW-Mj; Fri, 14 Oct 2011 07:59:03 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318604295!19535492!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2853 invoked from network); 14 Oct 2011 14:58:15 -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;
	14 Oct 2011 14:58:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,346,1315180800"; 
   d="scan'208";a="8399933"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Oct 2011 14:58:15 +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, 14 Oct 2011 15:58:15 +0100
Subject: Re: [Xen-devel] Features and bug fixes for Linux kernel 3.2.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Fri, 14 Oct 2011 15:58:15 +0100
In-Reply-To: <20111013190946.GA16336@phenom.oracle.com>
References: <20111013190946.GA16336@phenom.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: <1318604295.21903.891.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

On Thu, 2011-10-13 at 20:09 +0100, Konrad Rzeszutek Wilk wrote:
> Hey,
> 
> Please keep in mind that there is some outstanding work going on which
> could make it in 3.2 depending on when the merge window opens. I will
> enumerate those in the next email.
> 
> Anyhow, for 3.2 Linux kernel we have these items loaded and ready to go:
> 
>  - A new mechanism to parse the E820 resulting in better ballooning.
>  - hwclock support. Meaning you can do 'date XX' and it will be saved by machine.
>  - Support for PCI multi-segmented machines (big big iron boxes)
>  - Optimizations in DMA API.
>  - "feature-barrier" in the xen-blkback so that older kernels (SLES10)
>    can issue those.
>  - "feature-discard" so that TRIM/SCSI UNMAP operations can be utilized.
>  - kexec/kdump support for PVonHVM.
>  - Cleanups in the code (mostly scripts/cleanpatch.pl)
>  - Static analyzer (smatch) run results fixing bugs.
>  - Tons of bug fixes.
> 
> If you think I missed something - please please email me immediately.

It's more a precursor to a Xen thing but the ground work for SKB
fragment lifecycle tracking should be going in via the networking tree
in the next merge window.

That work will eventually lead to the reintroduction of the mapping mode
of guest network tx as opposed to the copy mode we have in upstream
right now. That's more like 3.3 or 3.4 material though.

Ian.

> 
> 
> The list is as follow.
> 
> Dan Carpenter (1):
>       xen/pciback: double lock typo
> 
> David Vrabel (9):
>       xen/balloon: account for pages released during memory setup
>       xen/balloon: simplify test for the end of usable RAM
>       xen: allow balloon driver to use more than one memory region
>       xen: allow extra memory to be in multiple regions
>       xen: release all pages within 1-1 p2m mappings
>       xen: use generic functions instead of xen_{alloc, free}_vm_area()
>       block: xen-blkback: use API provided by xenbus module to map rings
>       net: xen-netback: use API provided by xenbus module to map rings
>       xen: map foreign pages for shared rings by updating the PTEs directly
> 
> Jan Beulich (5):
>       xen/pci: make bus notifier handler return sane values
>       xen/pciback: use mutex rather than spinlock in passthrough backend
>       xen/pciback: miscellaneous adjustments
>       xen/pci: support multi-segment systems
>       xen-blkback: use kzalloc() in favor of kmalloc()+memset()
> 
> Jeremy Fitzhardinge (2):
>       xen: add dom0_op hypercall
>       xen/dom0: set wallclock time in Xen
> 
> Joe Jin (1):
>       xen-blkback: fixed indentation and comments
> 
> Konrad Rzeszutek Wilk (24):
>       Revert "xen/debug: WARN_ON when identity PFN has no _PAGE_IOMAP flag set."
>       xen-pcifront: Update warning comment to use 'e820_host' option.
>       xen-swiotlb: Retry up three times to allocate Xen-SWIOTLB
>       xen-swiotlb: Fix wrong panic.
>       xen-swiotlb: When doing coherent alloc/dealloc check before swizzling the MFNs.
>       xen/pciback: Use mutexes when working with Xenbus state transitions.
>       xen/pciback: use mutex rather than spinlock in vpci backend
>       xen/p2m: Make debug/xen/mmu/p2m visible again.
>       xen/p2m: Use SetPagePrivate and its friends for M2P overrides.
>       x86/paravirt: Partially revert "remove lazy mode in interrupts"
>       xen/pv-on-hvm:kexec: Fix implicit declaration of function 'xen_hvm_domain'
>       xen/pciback: Do not dereference psdev during printk when it is NULL.
>       xen-blkfront: If no barrier or flush is supported, use invalid operation.
>       xen/blkback: Support 'feature-barrier' aka old-style BARRIER requests.
>       xen/blkback: Report VBD_WSECT (wr_sect) properly.
>       xen/blkback: Fix the inhibition to map pages when discarding sector ranges.
>       xen/pciback: Check if the device is found instead of blindly assuming so.
>       xen/events: BUG() when we can't allocate our event->irq array.
>       xen/events: Don't check the info for NULL as it is already done.
>       xen/irq: If we fail during msi_capability_init return proper error code.
>       xen/xenbus: Remove the unnecessary check.
>       xen/enlighten: Fix compile warnings and set cx to known value.
>       xen/p2m/debugfs: Fix potential pointer exception.
>       xen/p2m/debugfs: Make type_name more obvious.
> 
> Laszlo Ersek (1):
>       xen-blkfront: plug device number leak in xlblk_init() error path
> 
> Li Dongyang (4):
>       xen-blkfront: add BLKIF_OP_DISCARD and discard request struct
>       xen-blkback: Implement discard requests ('feature-discard')
>       xen-blkfront: Handle discard requests.
>       xen-blkfront: fix a deadlock while handling discard response
> 
> Olaf Hering (6):
>       xen: use static initializers in xen-balloon.c
>       xen/pv-on-hvm kexec: prevent crash in xenwatch_thread() when stale watch events arrive
>       xen/pv-on-hvm kexec: rebind virqs to existing eventchannel ports
>       xen/pv-on-hvm kexec+kdump: reset PV devices in kexec or crash kernel
>       xen/pv-on-hvm kexec: update xs_wire.h:xsd_sockmsg_type from xen-unstable
>       xen/pv-on-hvm kexec: add xs_reset_watches to shutdown watches from old kernel
> 
> Randy Dunlap (1):
>       xen-swiotlb: fix printk and panic args
> 
> Ruslan Pisarev (6):
>       Xen: fix whitespaces,tabs coding style issue in drivers/xen/balloon.c
>       Xen: fix whitespaces,tabs coding style issue in drivers/xen/events.c
>       Xen: fix braces coding style issue in gntdev.c and grant-table.c
>       Xen: fix whitespaces,tabs coding style issue in drivers/xen/pci.c
>       Xen: fix braces coding style issue in xenbus_probe.h
>       Xen: fix braces and tabs coding style issue in xenbus_probe.c
> 
> Stefano Stabellini (4):
>       xen: add an "highmem" parameter to alloc_xenballooned_pages
>       xen: modify kernel mappings corresponding to granted pages
>       xen: XEN_PVHVM depends on PCI
>       xen: remove XEN_PLATFORM_PCI config option
> 
> Thomas Meyer (1):
>       xen/pciback: use resource_size()
> 
> Yu Ke (1):
>       xen/acpi: Domain0 acpi parser related platform hypercall
> 
> 
> _______________________________________________
> 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 Oct 14 08:16:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 08:16:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REjUf-0006qJ-2I; Fri, 14 Oct 2011 08:16:17 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REjTm-0006dM-V2
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 08:15:23 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1318605319!161834!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 976 invoked from network); 14 Oct 2011 15:15:20 -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;
	14 Oct 2011 15:15:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,346,1315180800"; 
   d="scan'208";a="8400536"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Oct 2011 15:15:19 +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; Fri, 14 Oct 2011 16:15:19 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a112f0afefc7567b91feef8b6d46d0e403b53123
Message-ID: <a112f0afefc7567b91fe.1318605319@andrewcoop.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 14 Oct 2011 16:15:19 +0100
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Subject: [Xen-devel] [PATCH] hvmloader: Don't set hpet->header.length twice
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 redundant.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

diff -r 4b0907c6a08c -r a112f0afefc7 tools/firmware/hvmloader/acpi/build.c
--- a/tools/firmware/hvmloader/acpi/build.c	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/firmware/hvmloader/acpi/build.c	Fri Oct 14 16:14:26 2011 +0100
@@ -186,8 +186,7 @@ static struct acpi_20_hpet *construct_hp
     hpet->addr.address        = ACPI_HPET_ADDRESS;
 
     hpet->header.length = sizeof(*hpet);
-    set_checksum(hpet, offsetof(struct acpi_header, checksum),
-                 hpet->header.length = sizeof(*hpet));
+    set_checksum(hpet, offsetof(struct acpi_header, checksum), sizeof(*hpet));
     return hpet;
 }
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 08:17:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 08:17:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REjW8-0007Dr-IS; Fri, 14 Oct 2011 08:17:48 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REjVW-00071O-3H
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 08:17:10 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318605426!19538259!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32587 invoked from network); 14 Oct 2011 15:17:06 -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;
	14 Oct 2011 15:17:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,346,1315180800"; 
   d="scan'208";a="8400589"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Oct 2011 15:17:06 +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; Fri, 14 Oct 2011 16:17:06 +0100
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 52783753dea27a52bf5b779e14f1da74443ca598
Message-ID: <52783753dea27a52bf5b.1318605425@andrewcoop.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Fri, 14 Oct 2011 16:17:05 +0100
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: <xen-devel@lists.xensource.com>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Subject: [Xen-devel] [PATCH] hvmloader: Add the WAET since Microsoft are
	demanding it for Windows 8
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Paul Durrant <paul.durrant@citrix.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

diff -r 4b0907c6a08c -r 52783753dea2 tools/firmware/hvmloader/acpi/acpi2_0.h
--- a/tools/firmware/hvmloader/acpi/acpi2_0.h	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/firmware/hvmloader/acpi/acpi2_0.h	Fri Oct 14 16:16:33 2011 +0100
@@ -297,6 +297,14 @@ struct acpi_20_hpet {
 #define ACPI_HPET_ADDRESS 0xFED00000UL
 
 /*
+ * WAET Description Table
+ */
+struct acpi_20_waet {
+    struct acpi_header header;
+    uint32_t           flags;
+};
+
+/*
  * Multiple APIC Flags.
  */
 #define ACPI_PCAT_COMPAT (1 << 0)
@@ -366,6 +374,7 @@ struct acpi_20_madt_intsrcovr {
 #define ACPI_2_0_XSDT_SIGNATURE ASCII32('X','S','D','T')
 #define ACPI_2_0_TCPA_SIGNATURE ASCII32('T','C','P','A')
 #define ACPI_2_0_HPET_SIGNATURE ASCII32('H','P','E','T')
+#define ACPI_2_0_WAET_SIGNATURE ASCII32('W','A','E','T')
 
 /*
  * Table revision numbers.
@@ -377,6 +386,7 @@ struct acpi_20_madt_intsrcovr {
 #define ACPI_2_0_XSDT_REVISION 0x01
 #define ACPI_2_0_TCPA_REVISION 0x02
 #define ACPI_2_0_HPET_REVISION 0x01
+#define ACPI_2_0_WAET_REVISION 0x01
 #define ACPI_1_0_FADT_REVISION 0x01
 
 #pragma pack ()
diff -r 4b0907c6a08c -r 52783753dea2 tools/firmware/hvmloader/acpi/build.c
--- a/tools/firmware/hvmloader/acpi/build.c	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/firmware/hvmloader/acpi/build.c	Fri Oct 14 16:16:33 2011 +0100
@@ -30,6 +30,7 @@ extern struct acpi_20_rsdt Rsdt;
 extern struct acpi_20_xsdt Xsdt;
 extern struct acpi_20_fadt Fadt;
 extern struct acpi_20_facs Facs;
+extern struct acpi_20_waet Waet;
 
 /*
  * Located at ACPI_INFO_PHYSICAL_ADDRESS.
@@ -191,12 +192,28 @@ static struct acpi_20_hpet *construct_hp
     return hpet;
 }
 
+static struct acpi_20_waet *construct_waet(void)
+{
+    struct acpi_20_waet *waet;
+
+    waet = mem_alloc(sizeof(*waet), 16);
+    if (!waet) return NULL;
+
+    memcpy(waet, &Waet, sizeof(*waet));
+
+    waet->header.length = sizeof(*waet);
+    set_checksum(waet, offsetof(struct acpi_header, checksum), sizeof(*waet));
+
+    return waet;
+}
+
 static int construct_secondary_tables(unsigned long *table_ptrs,
                                       struct acpi_info *info)
 {
     int nr_tables = 0;
     struct acpi_20_madt *madt;
     struct acpi_20_hpet *hpet;
+    struct acpi_20_waet *waet;
     struct acpi_20_tcpa *tcpa;
     unsigned char *ssdt;
     static const uint16_t tis_signature[] = {0x0001, 0x0001, 0x0001};
@@ -217,6 +234,11 @@ static int construct_secondary_tables(un
     if (!hpet) return -1;
     table_ptrs[nr_tables++] = (unsigned long)hpet;
 
+    /* WAET. */
+    waet = construct_waet();
+    if (!waet) return -1;
+    table_ptrs[nr_tables++] = (unsigned long)waet;
+
     if ( battery_port_exists() )
     {
         ssdt = mem_alloc(sizeof(ssdt_pm), 16);
diff -r 4b0907c6a08c -r 52783753dea2 tools/firmware/hvmloader/acpi/static_tables.c
--- a/tools/firmware/hvmloader/acpi/static_tables.c	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/firmware/hvmloader/acpi/static_tables.c	Fri Oct 14 16:16:33 2011 +0100
@@ -136,6 +136,26 @@ struct acpi_20_rsdp Rsdp = {
     .length    = sizeof(struct acpi_20_rsdp)
 };
 
+#define ACPI_WAET_RTC_GOOD      0x00000001
+#define ACPI_WAET_PM_TIMER_GOOD 0x00000002
+
+#define ACPI_WAET_FLAGS (ACPI_WAET_RTC_GOOD | \
+                         ACPI_WAET_PM_TIMER_GOOD)
+
+struct acpi_20_waet Waet = {
+    .header = {
+        .signature    = ACPI_2_0_WAET_SIGNATURE,
+        .length       = sizeof(struct acpi_20_waet),
+        .revision     = ACPI_2_0_WAET_REVISION,
+        .oem_id       = ACPI_OEM_ID, 
+        .oem_table_id = ACPI_OEM_TABLE_ID,
+        .oem_revision = ACPI_OEM_REVISION,
+        .creator_id   = ACPI_CREATOR_ID,
+        .creator_revision = ACPI_CREATOR_REVISION
+    },
+    .flags = ACPI_WAET_FLAGS
+};
+
 /*
  * Local variables:
  * mode: C

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 08:20:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 08:20:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REjYJ-0007jX-5b; Fri, 14 Oct 2011 08:20:03 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1REjVe-00072R-I2
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 08:17:19 -0700
X-Env-Sender: anthony@overnetdata.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1318605435!1060470!1
X-Originating-IP: [81.137.131.225]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18076 invoked from network); 14 Oct 2011 15:17:15 -0000
Received: from host81-137-131-225.in-addr.btopenworld.com (HELO
	zimbra.overnetdata.com) (81.137.131.225)
	by server-5.tower-216.messagelabs.com with SMTP;
	14 Oct 2011 15:17:15 -0000
Received: from localhost (localhost.localdomain [127.0.0.1])
	by zimbra.overnetdata.com (Postfix) with ESMTP id D3FA91616C8;
	Fri, 14 Oct 2011 16:17:14 +0100 (BST)
X-Virus-Scanned: amavisd-new at overnetdata.com
Received: from zimbra.overnetdata.com ([127.0.0.1])
	by localhost (zimbra.overnetdata.com [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id dSVTI9NbzfUP; Fri, 14 Oct 2011 16:17:14 +0100 (BST)
Received: from [192.168.2.100] (unknown [82.68.241.78])
	by zimbra.overnetdata.com (Postfix) with ESMTPSA id 5A4C01609DF;
	Fri, 14 Oct 2011 16:17:13 +0100 (BST)
Message-ID: <4E98526A.7090007@overnetdata.com>
Date: Fri, 14 Oct 2011 16:16:58 +0100
From: Anthony Wright <anthony@overnetdata.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Para-Virt DomU + HVM DomU with xen 4.1.1 & linux
	3.0.6 locks up system
References: <4E983A91.8040409@overnetdata.com>
	<20111014140030.GF4577@phenom.oracle.com>
In-Reply-To: <20111014140030.GF4577@phenom.oracle.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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/10/2011 15:00, Konrad Rzeszutek Wilk wrote:
> On Fri, Oct 14, 2011 at 02:35:13PM +0100, Anthony Wright wrote:
>> I have xen 4.1.1 running with a 3.0.6 linux kernel, both 32 bit.
>>
>> If I run 2 x para-virtualized DomUs they run fine. If I run 2 x HVM
>> DomUs they run fine. If I run 1 x para-virtualized and 1 x HVM DomU (it
>> doesn't matter which one is run first & which second), the system locks
>> up just after I start the second DomU.
> Locks up you say? When you launch the second guest, can you
> also run 'while (true); do; xl list; sleep 1; done' to see if the memory
> for Dom0 is going down to unreasonable amount?
It behaves as if it's run out of memory as you say, but I did 'while
true; do; xl list; sleep 0.2 ; done' on one session while I started the
other DomU, and the system locked so quickly that the xl list didn't see
any drop in Dom0 memory or the DomU even start.

I have given Dom0 1000MB, and the HVM DomU also uses 1000MB (though it
gets reported as 995MB). The para-virtual DomU uses 2000MB, and the
machine has 8GB. Before I start the para-virtual DomU the commited
AS_limit is around 141MB

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 08:44:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 08:44:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REjvh-0000MJ-UA; Fri, 14 Oct 2011 08:44:13 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REjv2-00009f-HY
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 08:43:32 -0700
X-Env-Sender: mightydreams@gmail.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1318607008!165297!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11937 invoked from network); 14 Oct 2011 15:43:29 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 15:43:29 -0000
Received: by iaen33 with SMTP id n33so3578595iae.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 08:43:27 -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
	:content-type; bh=p9Ud0oYxqch7qNhYkXyotHktRZHbHPw2i/4tEYPpyOg=;
	b=AW+GhiiF1A+iQR9Fa5oW+3e/NCox//iZv0jyymB8gijih1ZCKW4LHzIAkitQ4V0c4p
	hm70ChsnxEjwNSA42HQZ4E+RACQp9iec34zUjZ7oJzvyZT1KPYKi2P3x5DxeSohkpkFU
	5ktjRB3vQ+FAyWDCMgvP+7HCJsEa2AdnEaCxU=
MIME-Version: 1.0
Received: by 10.231.44.196 with SMTP id b4mr3880938ibf.82.1318607007846; Fri,
	14 Oct 2011 08:43:27 -0700 (PDT)
Received: by 10.231.35.6 with HTTP; Fri, 14 Oct 2011 08:43:27 -0700 (PDT)
In-Reply-To: <CALKraOZKGQjWag0Jk1-xZ_9o9Xh1N8pwBhdEhXOAT_dWpQA66Q@mail.gmail.com>
References: <CALKraOZKGQjWag0Jk1-xZ_9o9Xh1N8pwBhdEhXOAT_dWpQA66Q@mail.gmail.com>
Date: Fri, 14 Oct 2011 21:13:27 +0530
Message-ID: <CALKraObo-k_QiE1RAVP0B=buQdAET-tF7e=zJRS-NXny=kVZMg@mail.gmail.com>
From: Tapas Mishra <mightydreams@gmail.com>
To: Xen List <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] how hypervisor separates assembly 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

As far as my understanding goes a CPU gets Assembly instructions to work and
upon those instructions it works. These assembly instructions come
from the OS running on top of bare metal.
I have some understanding of hypercalls.
So what does a hypercall implement that it is able to separate the
different Assembly instructions
coming from different Guest OSeS or in other words how does the
hypervisor separates the Assembly instructions which should be run for
different Guest OSeS running on top of hypervisor.I want to know it
technically not theoretically.

--
------------------------------

Tapas

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 08:53:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 08: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 1REk4Y-0000rk-Ey; Fri, 14 Oct 2011 08:53:22 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REk43-0000f6-9m
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 08:52:51 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1318607566!35312210!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24850 invoked from network); 14 Oct 2011 15:52:48 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 15:52:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,346,1315195200"; d="scan'208";a="18232547"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Oct 2011 11:52:46 -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; Fri, 14 Oct 2011
	11:52:46 -0400
Message-ID: <4E985ACD.3020808@citrix.com>
Date: Fri, 14 Oct 2011 16:52:45 +0100
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] how hypervisor separates assembly instructions
References: <CALKraOZKGQjWag0Jk1-xZ_9o9Xh1N8pwBhdEhXOAT_dWpQA66Q@mail.gmail.com>
	<CALKraObo-k_QiE1RAVP0B=buQdAET-tF7e=zJRS-NXny=kVZMg@mail.gmail.com>
In-Reply-To: <CALKraObo-k_QiE1RAVP0B=buQdAET-tF7e=zJRS-NXny=kVZMg@mail.gmail.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 14/10/11 16:43, Tapas Mishra wrote:
> As far as my understanding goes a CPU gets Assembly instructions to work

The CPU reads computer opcode from memory.  (Assembly instructions are
the name for the mnemonics, not the binary representation which the CPU
actually runs)

>  and
> upon those instructions it works. These assembly instructions come
> from the OS running on top of bare metal.

Not really.  All programs are just opcode which the CPU can run.  OS's
are the same as regular programs in this regard.

> I have some understanding of hypercalls.
> So what does a hypercall implement that it is able to separate the
> different Assembly instructions
> coming from different Guest OSeS or in other words how does the
> hypervisor separates the Assembly instructions which should be run for
> different Guest OSeS running on top of hypervisor.I want to know it
> technically not theoretically.

The hypervisor "separates" different operating systems in the same way
that regular operating systems separate different processes.

> --
> ------------------------------
>
> Tapas
>
> _______________________________________________
> 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 Fri Oct 14 08:56:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 08:56:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REk79-0001Go-UJ; Fri, 14 Oct 2011 08:56:03 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REk6d-00014N-V9
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 08:55:32 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1318607727!22205923!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13587 invoked from network); 14 Oct 2011 15:55:28 -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; 14 Oct 2011 15:55: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
	p9EFtNNB018562
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 14 Oct 2011 15:55:24 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
	p9EFtM2s000428
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 15:55:22 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9EFtHst015527; Fri, 14 Oct 2011 10:55:17 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 14 Oct 2011 08:55:17 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id 62D211BE; Fri, 14 Oct 2011 11:55:16 -0400 (EDT)
Date: Fri, 14 Oct 2011 11:55:16 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Andy Burns <xen.lists@burns.me.uk>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
Message-ID: <20111014155516.GB27171@phenom.oracle.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
	<CAE1-PRekj_LifVEOS=ZsDYc0ZOi=j9K4B5U0LJpKDtHP6h_-OA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAE1-PRekj_LifVEOS=ZsDYc0ZOi=j9K4B5U0LJpKDtHP6h_-OA@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.0A090208.4E985B6D.0015:SCFMA922111,ss=1,re=-4.000,fgs=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 Thu, Oct 13, 2011 at 09:28:32PM +0100, Andy Burns wrote:
> Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> 
> > would imply it is not the PCI passthrough code (good!).
> > It is something related to the driver
> > Perhaps it is the VM_IO bug that sometimes creeps
> > up..
> 
> I can try *NOT* using pci=resource_realignment=(blah), but I always
> had to do that (or rather the old reassigndev equivalent) under
> xenified 2.6.18 kernels as the BARs of the PCI cards were smaller than
> the page size and I think the drivers for the two instances of the
> DVB-T card used to trample all over each other without it.

Is there a good application you use to test this? xawtv?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 08:56:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 08:56:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REk80-0001dp-1m; Fri, 14 Oct 2011 08:56:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REk7F-0001IR-6A
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 08:56:09 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1318607764!22193969!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11086 invoked from network); 14 Oct 2011 15:56:06 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 15:56:06 -0000
Received: by iaen33 with SMTP id n33so3592403iae.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 08:56:04 -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=JdeDera4sr++DsaJaSZN5Bz5/MZR9HJS2yjrjpoAG64=;
	b=oWycof2koLokuGU+obZRZ5m7+tyu79MjwbnIzH4+PproulDtIAjn9AvwkoxP2SYINf
	ElHzkwYROCFI6WNq+20YScWNZ4aZBZl77PensfdJhJF1tp52q5v2hffXgZvvmoq3gzJa
	fo3NSbNkMF9mGY+OH4tY+Y3EiqkFrs7E5iteg=
MIME-Version: 1.0
Received: by 10.43.130.133 with SMTP id hm5mr17204315icc.11.1318607764395;
	Fri, 14 Oct 2011 08:56:04 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Fri, 14 Oct 2011 08:56:04 -0700 (PDT)
In-Reply-To: <4E97FC86020000780005B541@nat28.tlf.novell.com>
References: <osstest-9292-mainreport@xen.org>
	<4E97FC86020000780005B541@nat28.tlf.novell.com>
Date: Fri, 14 Oct 2011 16:56:04 +0100
X-Google-Sender-Auth: yoLI7nxK1o-hV7bUq7_Uif9y3ac
Message-ID: <CAFLBxZZvuoWhXKQk-TKm+NTAY8BxYpCHwN6kHQfzWL_3f2ZKOg@mail.gmail.com>
Subject: Re: [Xen-devel] [xen-unstable test] 9292: regressions - FAIL
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Jan Beulich <JBeulich@suse.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: Keir Fraser <keir@xen.org>, 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 Fri, Oct 14, 2011 at 8:10 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 14.10.11 at 06:11, xen.org <ian.jackson@eu.citrix.com> wrote:
>> flight 9292 xen-unstable real [real]
>> http://www.chiark.greenend.org.uk/~xensrcts/logs/9292/
>>
>> Regressions :-(
>>
>> Tests which did not succeed and are blocking:
>> =A0test-amd64-amd64-xl-sedf =A0 =A0 16 guest-start.2 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0fail REGR. vs. 9252
>
> This particular test appears to be failing every now and then, hinting at
> some further bit rot problem in sedf. Therefore I wonder whether
> sedf needs some more serious looking at or whether we should simply
> drop it (and with it the test).

We do still occasionally get people using sedf, reporting bugs, and so
on.  I get the feeling people would miss it when it's gone.

But then again, I'm not sure I'll have the time to look at it any time soon=
...

 -George



>
> Jan
>
>> Tests which did not succeed, but are not blocking,
>> including regressions (tests previously passed) regarded as allowable:
>> =A0test-amd64-i386-rhel6hvm-amd =A09 guest-start.2 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0fail =A0 never pass
>> =A0test-amd64-amd64-xl-pcipt-intel =A09 guest-start =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 fail never pass
>> =A0test-amd64-i386-rhel6hvm-intel =A09 guest-start.2 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0fail never pass
>> =A0test-amd64-i386-win-vcpus1 =A0 16 leak-check/check =A0 =A0 =A0 =A0 =
=A0 =A0 fail =A0 never pass
>> =A0test-amd64-i386-xl-win-vcpus1 13 guest-stop =A0 =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 fail =A0never pass
>> =A0test-amd64-i386-win =A0 =A0 =A0 =A0 =A016 leak-check/check =A0 =A0 =
=A0 =A0 =A0 =A0 fail =A0 never pass
>> =A0test-amd64-amd64-win =A0 =A0 =A0 =A0 16 leak-check/check =A0 =A0 =A0 =
=A0 =A0 =A0 fail =A0 never pass
>> =A0test-amd64-amd64-xl-win =A0 =A0 =A013 guest-stop =A0 =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 fail =A0 never pass
>> =A0test-i386-i386-xl-win =A0 =A0 =A0 =A013 guest-stop =A0 =A0 =A0 =A0 =
=A0 =A0 =A0 =A0 =A0 fail =A0 never pass
>> =A0test-i386-i386-win =A0 =A0 =A0 =A0 =A0 16 leak-check/check =A0 =A0 =
=A0 =A0 =A0 =A0 fail =A0 never pass
>>
>> version targeted for testing:
>> =A0xen =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0a65693f9fb12
>> baseline version:
>> =A0xen =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A04b0907c6a08c
>
>
> _______________________________________________
> 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 Oct 14 09:39:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 09:39:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REknX-0002t2-5C; Fri, 14 Oct 2011 09:39:51 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REkmQ-0002ck-BV
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 09:38:42 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318610289!52857294!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28288 invoked from network); 14 Oct 2011 16:38:10 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 16:38:10 -0000
Received: by vws13 with SMTP id 13so2067444vws.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 09:38:38 -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:content-type;
	bh=Z10rLch/iC2g037XYau+xk1amfLS45zsv0Hl2M2BRDE=;
	b=IZrr0m9Yh0x6iVvKDxqHftdgm1hepRgLkKnitq5HhLBb6UJUHozCM2RwvHbpZcCWG9
	SQjHYxZDN78Jm6sZ5C9G89/252CkSpyeWVnyoFRWW4IfDB+RuhuWC8czOfdAeB1+UPG0
	WwW7gW7B8BMZw0ZBR4Bm1JcBZ6+WmGagSi34I=
MIME-Version: 1.0
Received: by 10.52.27.208 with SMTP id v16mr9809821vdg.22.1318610317972; Fri,
	14 Oct 2011 09:38:37 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Fri, 14 Oct 2011 09:38:37 -0700 (PDT)
In-Reply-To: <20111014155516.GB27171@phenom.oracle.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
	<CAE1-PRekj_LifVEOS=ZsDYc0ZOi=j9K4B5U0LJpKDtHP6h_-OA@mail.gmail.com>
	<20111014155516.GB27171@phenom.oracle.com>
Date: Fri, 14 Oct 2011 17:38:37 +0100
X-Google-Sender-Auth: IQ7GDFx1EQg7PqCiba-1mPxOuHo
Message-ID: <CAE1-PRcmivQq+S5F3B0aRPVvQJH6gQXmavESp0-Ny3UnLmq6Bw@mail.gmail.com>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-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 14 October 2011 16:55, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:

> Is there a good application you use to test this? xawtv?

Yeah, mythtv *is* a bit too heavy for testing :-P

 FOr quick tests I just use scandvb (sometimes known as "dvbscan" or
"scan" depending on distro) but it needs some "seed" information
that's geographically sensitive to start searching for stations e.g.
for me ...

scandvb -a0 /usr/share/dvb-apps/dvb-t/uk-Waltham

I've no idea where you're located and whether you have
DVB-T/DVB-S/ATSC tuners ...

if your distro provides it then "w_scan" is easier as it will go off
and do a brute force scan by itself, you just need to tell it if
you're using terrestrial or satellite, and prefereably a hint to which
country and off it goes ...

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 10:12:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 10:12:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RElIw-0004r8-HR; Fri, 14 Oct 2011 10:12:18 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REl7d-0003Uk-HB
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 10:00:38 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318611634!19561714!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15753 invoked from network); 14 Oct 2011 17:00:34 -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;
	14 Oct 2011 17:00:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,347,1315180800"; 
   d="scan'208";a="8402194"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Oct 2011 17:00: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, 14 Oct 2011 18:00:34 +0100
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 1REl7a-00038v-3U;
	Fri, 14 Oct 2011 17:00:34 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1REl7a-0007lP-14;
	Fri, 14 Oct 2011 18:00:34 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9339-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 14 Oct 2011 18:00:34 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9339: 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 9339 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9339/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 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-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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  f63528cc5060
baseline version:
 xen                  4b0907c6a08c

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Guido Gunther <agx@sigxcpu.org>
  Haitao Shan <maillists.shan@gmail.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Olaf Hering <olaf@aepfle.de>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Shan Haitao <haitao.shan@intel.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                                     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=f63528cc5060
+ . 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 f63528cc5060
+ branch=xen-unstable
+ revision=f63528cc5060
+ . 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 f63528cc5060 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 18 changesets with 88 changes to 69 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 10:14:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 10:14:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RElKm-0005Mx-5J; Fri, 14 Oct 2011 10:14:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REl9e-0003ZK-O3
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 10:02:54 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-15.tower-27.messagelabs.com!1318611747!51066329!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6187 invoked from network); 14 Oct 2011 17:02:28 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-15.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2011 17:02:28 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:b854:f2ff:fe56:93c8])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 570FD95EC;
	Fri, 14 Oct 2011 10:02:37 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id F17F620220;
	Fri, 14 Oct 2011 10:02:35 -0700 (PDT)
Message-ID: <4E986B2B.60803@goop.org>
Date: Fri, 14 Oct 2011 10:02:35 -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: Jason Baron <jbaron@redhat.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins> <4E971580.6030300@goop.org>
	<20111014141701.GA2433@redhat.com>
In-Reply-To: <20111014141701.GA2433@redhat.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, konrad.wilk@oracle.com,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/14/2011 07:17 AM, Jason Baron wrote:
> On Thu, Oct 13, 2011 at 09:44:48AM -0700, Jeremy Fitzhardinge wrote:
>> pvops is basically a collection of ordinary _ops structures full of
>> function pointers, but it has a layer of patching to help optimise it. 
>> In the common case, this just replaces an indirect call with a direct
>> one, but in some special cases it can inline code.  This is used for
>> small, extremely performance-critical things like cli/sti, but it
>> awkward to use in general because you have to specify the inlined code
>> as a parameterless asm.
>>
> I haven't look at the pvops patching (probably should), but I was
> wondering if jump labels could be used for it? Or is there something
> that the pvops patching is doing that jump labels can't handle?

Jump labels are essentially binary: you can use path A or path B.  pvops
are multiway: there's no limit to the number of potential number of
paravirtualized hypervisor implementations.  At the moment we have 4:
native, Xen, KVM and lguest.

As I said, pvops patching is very general since it allows a particular
op site to be either patched with a direct call/jump to the target code,
or have code inserted inline at the site.  In fact, it probably wouldn't
take very much to allow it to implement jump labels.

And the pvops patching mechanism is certainly general to any *ops style
structure which is initialized once (or rarely) and could be optimised. 
LSM, perhaps?

>> Jump_labels is basically an efficient way of doing conditionals
>> predicated on rarely-changed booleans - so it's similar to pvops in that
>> it is effectively a very ordinary C construct optimised by dynamic code
>> patching.
>>
> Another thing is that it can be changed at run-time...Can pvops be
> adjusted at run-time as opposed to just boot-time?

No.  In general that wouldn't really make sense, because once you've
booted on one hypervisor you're stuck there (though hypothetically you
could consider migration between machines with different hypervisors). 
In some cases it might make sense though, such as switching on PV
ticketlocks if the host system becomes overcommitted, but leaving the
native ticketlocks enabled if not.

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 10:15:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 10:15:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RElM5-0005l7-UG; Fri, 14 Oct 2011 10:15:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RElBc-0003qe-Gb; Fri, 14 Oct 2011 10:04:52 -0700
X-Env-Sender: konrad@oracle.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318611849!59230081!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4556 invoked from network); 14 Oct 2011 17:04:10 -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 Oct 2011 17:04:10 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9EH4auP007007
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Fri, 14 Oct 2011 17:04:38 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9EGwb57017164
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 16:58:37 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
	p9EH4UbP029070; Fri, 14 Oct 2011 12:04:31 -0500
Received: from oracle.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 14 Oct 2011 10:04:30 -0700
Received: by oracle.com (Postfix, from userid 1000)
	id E5CFED77; Fri, 14 Oct 2011 13:04:29 -0400 (EDT)
Date: Fri, 14 Oct 2011 13:04:29 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, xen-users@lists.xensource.com
Subject: Re: [Xen-devel] Features and bug fixes for Linux kernel 3.2.
Message-ID: <20111014170429.GA9314@phenom.oracle.com>
References: <20111013190946.GA16336@phenom.oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111013190946.GA16336@phenom.oracle.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090204.4E986BA7.0005,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

On Thu, Oct 13, 2011 at 03:09:46PM -0400, Konrad Rzeszutek Wilk wrote:
> Hey,
> 
> Please keep in mind that there is some outstanding work going on which
> could make it in 3.2 depending on when the merge window opens. I will
> enumerate those in the next email.
> 
> Anyhow, for 3.2 Linux kernel we have these items loaded and ready to go:
> 
>  - A new mechanism to parse the E820 resulting in better ballooning.
>  - hwclock support. Meaning you can do 'date XX' and it will be saved by machine.
>  - Support for PCI multi-segmented machines (big big iron boxes)
>  - Optimizations in DMA API.
>  - "feature-barrier" in the xen-blkback so that older kernels (SLES10)
>    can issue those.
>  - "feature-discard" so that TRIM/SCSI UNMAP operations can be utilized.
>  - kexec/kdump support for PVonHVM.
>  - Cleanups in the code (mostly scripts/cleanpatch.pl)
>  - Static analyzer (smatch) run results fixing bugs.
>  - Tons of bug fixes.
> 
> If you think I missed something - please please email me immediately.

These are some extra ones I put in since yesterday:

Dan Magenheimer (1):
      xen: Fix selfballooning and ensure it doesn't go too far

Daniel De Graaf (3):
      xenbus: Fix loopback event channel assuming domain 0
      xenbus: don't rely on xen_initial_domain to detect local xenstore
      xen/gntdev: Fix sleep-inside-spinlock

Konrad Rzeszutek Wilk (1):
      xen/blkback: Check for proper operation.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 11:37:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 11:37:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REmcu-00004x-Hf; Fri, 14 Oct 2011 11:37:00 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1REmc9-0008IS-51
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 11:36:13 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318617369!1086473!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23003 invoked from network); 14 Oct 2011 18:36:09 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-12.tower-216.messagelabs.com with SMTP;
	14 Oct 2011 18:36:09 -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 p9EIZeiT026889
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 14 Oct 2011 14:35:40 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9EIZdHm008450; Fri, 14 Oct 2011 14:35:40 -0400
Date: Fri, 14 Oct 2011 14:35:39 -0400
From: Jason Baron <jbaron@redhat.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111014183539.GE2433@redhat.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins> <4E971580.6030300@goop.org>
	<20111014141701.GA2433@redhat.com> <4E986B2B.60803@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E986B2B.60803@goop.org>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, konrad.wilk@oracle.com,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	rth@redhat.com, Andi Kleen <andi@firstfloor.org>,
	Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 14, 2011 at 10:02:35AM -0700, Jeremy Fitzhardinge wrote:
> On 10/14/2011 07:17 AM, Jason Baron wrote:
> > On Thu, Oct 13, 2011 at 09:44:48AM -0700, Jeremy Fitzhardinge wrote:
> >> pvops is basically a collection of ordinary _ops structures full of
> >> function pointers, but it has a layer of patching to help optimise it. 
> >> In the common case, this just replaces an indirect call with a direct
> >> one, but in some special cases it can inline code.  This is used for
> >> small, extremely performance-critical things like cli/sti, but it
> >> awkward to use in general because you have to specify the inlined code
> >> as a parameterless asm.
> >>
> > I haven't look at the pvops patching (probably should), but I was
> > wondering if jump labels could be used for it? Or is there something
> > that the pvops patching is doing that jump labels can't handle?
> 
> Jump labels are essentially binary: you can use path A or path B.  pvops
> are multiway: there's no limit to the number of potential number of
> paravirtualized hypervisor implementations.  At the moment we have 4:
> native, Xen, KVM and lguest.
> 

Yes, they are binary using the static_branch() interface. But in
general, the asm goto() construct, allows branching to any number of
labels. I have implemented the boolean static_branch() b/c it seems like
the most common interface for jump labels, but I imagine we will
introduce new interfaces as time goes on. You could of course nest
static_branch() calls, although I can't say I've tried it.

We could have an interface, that allowed static branch(), to specifiy an
arbitrary number of no-ops such that call-site itself could look anyway
we want, if we don't know the bias at compile time. This, of course
means potentially greater than 1 no-op in the fast path. I assume the
pvops can have greater than 1 no-op in the fast path. Or is there a
better solution here?

> As I said, pvops patching is very general since it allows a particular
> op site to be either patched with a direct call/jump to the target code,
> or have code inserted inline at the site.  In fact, it probably wouldn't
> take very much to allow it to implement jump labels.
> 
> And the pvops patching mechanism is certainly general to any *ops style
> structure which is initialized once (or rarely) and could be optimised. 
> LSM, perhaps?
> 
> >> Jump_labels is basically an efficient way of doing conditionals
> >> predicated on rarely-changed booleans - so it's similar to pvops in that
> >> it is effectively a very ordinary C construct optimised by dynamic code
> >> patching.
> >>
> > Another thing is that it can be changed at run-time...Can pvops be
> > adjusted at run-time as opposed to just boot-time?
> 
> No.  In general that wouldn't really make sense, because once you've
> booted on one hypervisor you're stuck there (though hypothetically you
> could consider migration between machines with different hypervisors). 
> In some cases it might make sense though, such as switching on PV
> ticketlocks if the host system becomes overcommitted, but leaving the
> native ticketlocks enabled if not.
> 
>     J

A nice featuer of jump labels, is that it allows the various branches
(currently we only support 2), to be written in c code (as opposed to asm),
which means you can write your code as you normally would and access any
parameters as you normally would - hopefully, making the code pretty
readable as well.

I hope this better clarifies the use-cases for the various mechanisms.

Thanks,

-Jason

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 11:39:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 11:39:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REmex-0000UD-JB; Fri, 14 Oct 2011 11:39:07 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REmeK-0000Gy-W8
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 11:38:29 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1318617503!182547!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5903 invoked from network); 14 Oct 2011 18:38:25 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-6.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	14 Oct 2011 18:38:25 -0000
Received: from anacreon.sc.intel.com (jfdmzpr04-ext.jf.intel.com
	[134.134.137.73]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9EIbcut007026
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 11:37:39 -0700
Message-ID: <4E98815F.6080105@zytor.com>
Date: Fri, 14 Oct 2011 11:37:19 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins> <4E971580.6030300@goop.org>
	<20111014141701.GA2433@redhat.com> <4E986B2B.60803@goop.org>
In-Reply-To: <4E986B2B.60803@goop.org>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, konrad.wilk@oracle.com,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/14/2011 10:02 AM, Jeremy Fitzhardinge wrote:
> 
> Jump labels are essentially binary: you can use path A or path B.  pvops
> are multiway: there's no limit to the number of potential number of
> paravirtualized hypervisor implementations.  At the moment we have 4:
> native, Xen, KVM and lguest.
> 

This isn't (or shouldn't be) really true... it should be possible to do
an N-way jump label even if the current mechanism doesn't.

	-hpa


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 11:40:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 11:40:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REmg9-0000s4-7e; Fri, 14 Oct 2011 11:40:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REmf5-0000W0-F8
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 11:39:16 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1318617550!29283699!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21938 invoked from network); 14 Oct 2011 18:39:11 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-3.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2011 18:39:11 -0000
Received: from anacreon.sc.intel.com (jfdmzpr04-ext.jf.intel.com
	[134.134.137.73]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9EIcn4c007088
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 11:38:50 -0700
Message-ID: <4E9881A6.9050106@zytor.com>
Date: Fri, 14 Oct 2011 11:38:30 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jason Baron <jbaron@redhat.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins> <4E971580.6030300@goop.org>
	<20111014141701.GA2433@redhat.com> <4E986B2B.60803@goop.org>
	<20111014183539.GE2433@redhat.com>
In-Reply-To: <20111014183539.GE2433@redhat.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Nick Piggin <npiggin@kernel.dk>, KVM <kvm@vger.kernel.org>,
	konrad.wilk@oracle.com, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	rth@redhat.com, Andi Kleen <andi@firstfloor.org>,
	Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/14/2011 11:35 AM, Jason Baron wrote:
> 
> A nice featuer of jump labels, is that it allows the various branches
> (currently we only support 2), to be written in c code (as opposed to asm),
> which means you can write your code as you normally would and access any
> parameters as you normally would - hopefully, making the code pretty
> readable as well.
> 
> I hope this better clarifies the use-cases for the various mechanisms.
> 

There is an important subcase which might be handy which would be to
allow direct patching of call instructions instead of using indirect calls.

	-hpa


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 11:52:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 11:52:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REms2-0001QK-8Y; Fri, 14 Oct 2011 11:52:38 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REmrJ-0001Dg-4g
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 11:51:53 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318618297!41711889!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19078 invoked from network); 14 Oct 2011 18:51:39 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2011 18:51:39 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:b854:f2ff:fe56:93c8])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 7EF90969A;
	Fri, 14 Oct 2011 11:51:47 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 20C7D20363;
	Fri, 14 Oct 2011 11:51:46 -0700 (PDT)
Message-ID: <4E9884C2.3090803@goop.org>
Date: Fri, 14 Oct 2011 11:51:46 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins> <4E971580.6030300@goop.org>
	<20111014141701.GA2433@redhat.com> <4E986B2B.60803@goop.org>
	<20111014183539.GE2433@redhat.com> <4E9881A6.9050106@zytor.com>
In-Reply-To: <4E9881A6.9050106@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, konrad.wilk@oracle.com,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	rth@redhat.com, Andi Kleen <andi@firstfloor.org>,
	Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/14/2011 11:38 AM, H. Peter Anvin wrote:
> On 10/14/2011 11:35 AM, Jason Baron wrote:
>> A nice featuer of jump labels, is that it allows the various branches
>> (currently we only support 2), to be written in c code (as opposed to asm),
>> which means you can write your code as you normally would and access any
>> parameters as you normally would - hopefully, making the code pretty
>> readable as well.
>>
>> I hope this better clarifies the use-cases for the various mechanisms.
>>
> There is an important subcase which might be handy which would be to
> allow direct patching of call instructions instead of using indirect calls.

Right, that's how the pvops patching is primarily used.

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 12:05:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 12:05:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REn4l-0002KK-ET; Fri, 14 Oct 2011 12:05:47 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REn1u-0001qe-Sr
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 12:02:52 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-12.tower-182.messagelabs.com!1318618966!22209167!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28502 invoked from network); 14 Oct 2011 19:02:47 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-12.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Oct 2011 19:02:47 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:b854:f2ff:fe56:93c8])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id DF7EB96B9;
	Fri, 14 Oct 2011 12:02:44 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 2F8E820586;
	Fri, 14 Oct 2011 12:02:43 -0700 (PDT)
Message-ID: <4E988753.1080201@goop.org>
Date: Fri, 14 Oct 2011 12:02:43 -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: Jason Baron <jbaron@redhat.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins> <4E971580.6030300@goop.org>
	<20111014141701.GA2433@redhat.com> <4E986B2B.60803@goop.org>
	<20111014183539.GE2433@redhat.com>
In-Reply-To: <20111014183539.GE2433@redhat.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, konrad.wilk@oracle.com,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	rth@redhat.com, Andi Kleen <andi@firstfloor.org>,
	Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/14/2011 11:35 AM, Jason Baron wrote:
> On Fri, Oct 14, 2011 at 10:02:35AM -0700, Jeremy Fitzhardinge wrote:
>> On 10/14/2011 07:17 AM, Jason Baron wrote:
>>> On Thu, Oct 13, 2011 at 09:44:48AM -0700, Jeremy Fitzhardinge wrote:
>>>> pvops is basically a collection of ordinary _ops structures full of
>>>> function pointers, but it has a layer of patching to help optimise it. 
>>>> In the common case, this just replaces an indirect call with a direct
>>>> one, but in some special cases it can inline code.  This is used for
>>>> small, extremely performance-critical things like cli/sti, but it
>>>> awkward to use in general because you have to specify the inlined code
>>>> as a parameterless asm.
>>>>
>>> I haven't look at the pvops patching (probably should), but I was
>>> wondering if jump labels could be used for it? Or is there something
>>> that the pvops patching is doing that jump labels can't handle?
>> Jump labels are essentially binary: you can use path A or path B.  pvops
>> are multiway: there's no limit to the number of potential number of
>> paravirtualized hypervisor implementations.  At the moment we have 4:
>> native, Xen, KVM and lguest.
>>
> Yes, they are binary using the static_branch() interface. But in
> general, the asm goto() construct, allows branching to any number of
> labels. I have implemented the boolean static_branch() b/c it seems like
> the most common interface for jump labels, but I imagine we will
> introduce new interfaces as time goes on. You could of course nest
> static_branch() calls, although I can't say I've tried it.

At the moment we're using pvops to optimise things like:

	(*pv_mmu_ops.set_pte)(...);

To do that with some kind of multiway jump label thing, then that would
need to expand out to something akin to:

	if (static_branch(is_xen))
		xen_set_pte(...);
	else if (static_branch(is_kvm))
		kvm_set_pte(...);
	else if (static_branch(is_lguest))
		lguest_set_pte(...);
	else
		native_set_pte(...);

or something similar with an actual jump table.  But I don't see how it
offers much scope for improvement.

If there were something like:

	STATIC_INDIRECT_CALL(&pv_mmu_ops.set_pte)(...);

where the apparently indirect call is actually patched to be a direct
call, then that would offer a large subset of what we do with pvops.

However, to completely replace pvops patching, the static branch / jump
label mechanism would also need to work in assembler code, and be
capable of actually patching callsites with instructions rather than
just calls (sti/cli/pushf/popf being the most important).

We also keep track of the live registers at the callsite, and compare
that to what registers the target functions will clobber in order to
optimise the amount of register save/restore is needed.  And as a result
we have some pvops functions with non-standard calling conventions to
minimise save/restores on critical paths.

> We could have an interface, that allowed static branch(), to specifiy an
> arbitrary number of no-ops such that call-site itself could look anyway
> we want, if we don't know the bias at compile time. This, of course
> means potentially greater than 1 no-op in the fast path. I assume the
> pvops can have greater than 1 no-op in the fast path. Or is there a
> better solution here?

See above.  But pvops patching is pretty well tuned for its job.

However, I definitely think its worth investigating some way to reduce
the number of patching mechanisms, and if pvops patching doesn't stretch
static jumps in unnatural ways, then perhaps that's the way to go.

Thanks,
    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 12:11:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 12:11:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REn9y-0002mR-2m; Fri, 14 Oct 2011 12:11:10 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REn9U-0002Zt-L4
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 12:10:40 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318619435!19570116!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7366 invoked from network); 14 Oct 2011 19:10:37 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2011 19:10:37 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:b854:f2ff:fe56:93c8])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id CD1CA96BF;
	Fri, 14 Oct 2011 12:10:34 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 64C8120351;
	Fri, 14 Oct 2011 12:10:33 -0700 (PDT)
Message-ID: <4E988929.8040801@goop.org>
Date: Fri, 14 Oct 2011 12:10:33 -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: "H. Peter Anvin" <hpa@zytor.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins> <4E971580.6030300@goop.org>
	<20111014141701.GA2433@redhat.com> <4E986B2B.60803@goop.org>
	<4E98815F.6080105@zytor.com>
In-Reply-To: <4E98815F.6080105@zytor.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, konrad.wilk@oracle.com,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/14/2011 11:37 AM, H. Peter Anvin wrote:
> On 10/14/2011 10:02 AM, Jeremy Fitzhardinge wrote:
>> Jump labels are essentially binary: you can use path A or path B.  pvops
>> are multiway: there's no limit to the number of potential number of
>> paravirtualized hypervisor implementations.  At the moment we have 4:
>> native, Xen, KVM and lguest.
>>
> This isn't (or shouldn't be) really true... it should be possible to do
> an N-way jump label even if the current mechanism doesn't.

We probably don't want all those implementations (near) inline, so they
would end up being plain function calls anyway.

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 12:13:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 12:13:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REnCd-0003As-FT; Fri, 14 Oct 2011 12:13:55 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REnCA-0002yx-CF
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 12:13:26 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1318619601!1082288!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25135 invoked from network); 14 Oct 2011 19:13:23 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-15.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Oct 2011 19:13:23 -0000
Received: from anacreon.sc.intel.com (fmdmzpr02-ext.fm.intel.com
	[192.55.55.37]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9EJD63f009680
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 12:13:06 -0700
Message-ID: <4E9889AF.1050106@zytor.com>
Date: Fri, 14 Oct 2011 12:12:47 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins> <4E971580.6030300@goop.org>
	<20111014141701.GA2433@redhat.com> <4E986B2B.60803@goop.org>
	<4E98815F.6080105@zytor.com> <4E988929.8040801@goop.org>
In-Reply-To: <4E988929.8040801@goop.org>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, konrad.wilk@oracle.com,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/14/2011 12:10 PM, Jeremy Fitzhardinge wrote:
> 
> We probably don't want all those implementations (near) inline, so they
> would end up being plain function calls anyway.
> 

I would not object if the native one was closer, though; especially in
term of source text (the current level of macroization of some
operations is horrific.)

	-hpa



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 14:52:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 14:52:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REpgD-00071v-Vb; Fri, 14 Oct 2011 14:52:38 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REpfL-0006ov-PU
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 14:51:44 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318629098!19577286!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27489 invoked from network); 14 Oct 2011 21:51:40 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2011 21:51:40 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:b888:60ff:fedc:2b8c])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id D01DF97AB;
	Fri, 14 Oct 2011 14:51:32 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 150482063C;
	Fri, 14 Oct 2011 14:51:25 -0700 (PDT)
Message-ID: <4E98AEDD.4010503@goop.org>
Date: Fri, 14 Oct 2011 14:51:25 -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: Peter Zijlstra <peterz@infradead.org>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<c133180533d7e520bb1e818e987117811a666fbc.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<1318502628.24856.10.camel@twins>
In-Reply-To: <1318502628.24856.10.camel@twins>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 10/10] jump-label: initialize
 jump-label subsystem much 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 10/13/2011 03:43 AM, Peter Zijlstra wrote:
> On Wed, 2011-10-12 at 17:08 -0700, Jeremy Fitzhardinge wrote:
>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>
>> Initialize jump_labels much earlier, we can use them.
> We can use them, where? how? what?, that sentence just begs for more.

How about this?  Proper comment and much earlier init.

    J

>From 62720522d512ffce8f4be9140f73fefbdfd2872e Mon Sep 17 00:00:00 2001
From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Date: Wed, 12 Oct 2011 16:17:54 -0700
Subject: [PATCH] jump-label: initialize jump-label subsystem much earlier

Initialize jump_labels much, much earlier, so they're available for use
during system setup.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>

diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 56594e4..388b0d4 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -16,7 +16,7 @@ struct jump_label_key {
 
 # include <asm/jump_label.h>
 # define HAVE_JUMP_LABEL
-#endif
+#endif	/* CC_HAVE_ASM_GOTO && CONFIG_JUMP_LABEL */
 
 enum jump_label_type {
 	JUMP_LABEL_DISABLE = 0,
@@ -41,6 +41,7 @@ static __always_inline bool static_branch(struct jump_label_key *key)
 extern struct jump_entry __start___jump_table[];
 extern struct jump_entry __stop___jump_table[];
 
+extern void jump_label_init(void);
 extern void jump_label_lock(void);
 extern void jump_label_unlock(void);
 extern void arch_jump_label_transform(struct jump_entry *entry,
@@ -53,7 +54,7 @@ extern void jump_label_dec(struct jump_label_key *key);
 extern bool jump_label_enabled(struct jump_label_key *key);
 extern void jump_label_apply_nops(struct module *mod);
 
-#else
+#else  /* !HAVE_JUMP_LABEL */
 
 #include <linux/atomic.h>
 
@@ -63,6 +64,10 @@ struct jump_label_key {
 	atomic_t enabled;
 };
 
+static __always_inline void jump_label_init(void)
+{
+}
+
 static __always_inline bool static_branch(struct jump_label_key *key)
 {
 	if (unlikely(atomic_read(&key->enabled)))
@@ -97,7 +102,6 @@ static inline int jump_label_apply_nops(struct module *mod)
 {
 	return 0;
 }
+#endif	/* HAVE_JUMP_LABEL */
 
-#endif
-
-#endif
+#endif	/* _LINUX_JUMP_LABEL_H */
diff --git a/init/main.c b/init/main.c
index 2a9b88a..29d8d84 100644
--- a/init/main.c
+++ b/init/main.c
@@ -515,6 +515,9 @@ asmlinkage void __init start_kernel(void)
 	parse_args("Booting kernel", static_command_line, __start___param,
 		   __stop___param - __start___param,
 		   &unknown_bootoption);
+
+	jump_label_init();
+
 	/*
 	 * These use large bootmem allocations and must precede
 	 * kmem_cache_init()
diff --git a/kernel/jump_label.c b/kernel/jump_label.c
index ff2028f..bbdfe2a 100644
--- a/kernel/jump_label.c
+++ b/kernel/jump_label.c
@@ -133,7 +133,7 @@ static void __jump_label_update(struct jump_label_key *key,
 	}
 }
 
-static __init int jump_label_init(void)
+void __init jump_label_init(void)
 {
 	struct jump_entry *iter_start = __start___jump_table;
 	struct jump_entry *iter_stop = __stop___jump_table;
@@ -159,10 +159,7 @@ static __init int jump_label_init(void)
 #endif
 	}
 	jump_label_unlock();
-
-	return 0;
 }
-early_initcall(jump_label_init);
 
 #ifdef CONFIG_MODULES
 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 14:53:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 14:53:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REphQ-0007PN-Sb; Fri, 14 Oct 2011 14:53:52 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REpgZ-00076F-0x
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 14:53:00 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318629174!194527!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8776 invoked from network); 14 Oct 2011 21:52:55 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-3.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	14 Oct 2011 21:52:55 -0000
Received: from anacreon.sc.intel.com (fmdmzpr03-ext.fm.intel.com
	[192.55.54.38]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9ELqSLV013830
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 14:52:28 -0700
Message-ID: <4E98AF09.6040306@zytor.com>
Date: Fri, 14 Oct 2011 14:52:09 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<34ede5db1571d541a5c3fc49923bb353a37dd431.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<4E97067A.2070305@zytor.com> <4E9716B8.8050406@goop.org>
In-Reply-To: <4E9716B8.8050406@goop.org>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 09/10] x86/jump_label: use
 GENERIC_NOP5_ATOMIC instead of jmp5 +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 10/13/2011 09:50 AM, Jeremy Fitzhardinge wrote:
> On 10/13/2011 08:40 AM, H. Peter Anvin wrote:
>> On 10/12/2011 05:08 PM, Jeremy Fitzhardinge wrote:
>>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>>
>>> GENERIC_NOP5_ATOMIC should make a better nop.
>>>
>> On 32 bits, yes.  On 64 bits you should use P6_NOP5_ATOMIC.
> 
> So the cleanest way of fixing that is to make the GENERIC_NOP*  be
> defined to P6_NOP* on 64-bit then?  Assuming I'm correct in guessing
> that the intent of GENERIC_NOP* is "a basically good-enough NOP that
> will work on any x86".
> 

No, GENERIC_NOPs are not valid on 64 bits at all.

	-hpa


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 14:55:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 14:55:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REpig-0007nk-TY; Fri, 14 Oct 2011 14:55:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REphs-0007a2-KR
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 14:54:21 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318629255!35363859!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10398 invoked from network); 14 Oct 2011 21:54:17 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-4.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2011 21:54:17 -0000
Received: from anacreon.sc.intel.com (fmdmzpr03-ext.fm.intel.com
	[192.55.54.38]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9ELrsu6013897
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 14:53:55 -0700
Message-ID: <4E98AF5F.9060300@zytor.com>
Date: Fri, 14 Oct 2011 14:53:35 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<34ede5db1571d541a5c3fc49923bb353a37dd431.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<4E97067A.2070305@zytor.com> <4E97188A.6040400@goop.org>
In-Reply-To: <4E97188A.6040400@goop.org>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 09/10] x86/jump_label: use
 GENERIC_NOP5_ATOMIC instead of jmp5 +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 10/13/2011 09:57 AM, Jeremy Fitzhardinge wrote:
> 
> Something like this?
> 
> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> Date: Thu, 13 Oct 2011 09:55:25 -0700
> Subject: [PATCH] x86/nop: we can use P6 as generic NOP on 64-bit
> 
> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> 
> diff --git a/arch/x86/include/asm/nops.h b/arch/x86/include/asm/nops.h
> index 405b403..f9fead9 100644
> --- a/arch/x86/include/asm/nops.h
> +++ b/arch/x86/include/asm/nops.h
> @@ -19,15 +19,15 @@
>     6: leal 0x00000000(%esi),%esi
>     7: leal 0x00000000(,%esi,1),%esi
>  */
> -#define GENERIC_NOP1 0x90
> -#define GENERIC_NOP2 0x89,0xf6
> -#define GENERIC_NOP3 0x8d,0x76,0x00
> -#define GENERIC_NOP4 0x8d,0x74,0x26,0x00
> -#define GENERIC_NOP5 GENERIC_NOP1,GENERIC_NOP4
> -#define GENERIC_NOP6 0x8d,0xb6,0x00,0x00,0x00,0x00
> -#define GENERIC_NOP7 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00
> -#define GENERIC_NOP8 GENERIC_NOP1,GENERIC_NOP7
> -#define GENERIC_NOP5_ATOMIC NOP_DS_PREFIX,GENERIC_NOP4
> +#define GAS_NOP1 0x90
> +#define GAS_NOP2 0x89,0xf6
> +#define GAS_NOP3 0x8d,0x76,0x00
> +#define GAS_NOP4 0x8d,0x74,0x26,0x00
> +#define GAS_NOP5 GENERIC_NOP1,GENERIC_NOP4
> +#define GAS_NOP6 0x8d,0xb6,0x00,0x00,0x00,0x00
> +#define GAS_NOP7 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00
> +#define GAS_NOP8 GENERIC_NOP1,GENERIC_NOP7
> +#define GAS_NOP5_ATOMIC NOP_DS_PREFIX,GENERIC_NOP4
>  

They're not really the gas nops, either.  If you want to rename them I
would suggest GENERIC32_*

>  /* Opteron 64bit nops
>     1: nop
> @@ -87,6 +87,28 @@
>  #define P6_NOP8	0x0f,0x1f,0x84,0x00,0,0,0,0
>  #define P6_NOP5_ATOMIC P6_NOP5
>  
> +#ifdef CONFIG_X86_32
> +#define GENERIC_NOP1		GAS_NOP1
> +#define GENERIC_NOP2		GAS_NOP2
> +#define GENERIC_NOP3		GAS_NOP3
> +#define GENERIC_NOP4		GAS_NOP4
> +#define GENERIC_NOP5		GAS_NOP5
> +#define GENERIC_NOP6		GAS_NOP6
> +#define GENERIC_NOP7		GAS_NOP7
> +#define GENERIC_NOP8		GAS_NOP8
> +#define GENERIC_NOP5_ATOMIC	GAS_NOP5_ATOMIC
> +#else
> +#define GENERIC_NOP1		P6_NOP1
> +#define GENERIC_NOP2		P6_NOP2
> +#define GENERIC_NOP3		P6_NOP3
> +#define GENERIC_NOP4		P6_NOP4
> +#define GENERIC_NOP5		P6_NOP5
> +#define GENERIC_NOP6		P6_NOP6
> +#define GENERIC_NOP7		P6_NOP7
> +#define GENERIC_NOP8		P6_NOP8
> +#define GENERIC_NOP5_ATOMIC	P6_NOP5_ATOMIC
> +#endif
> +

Make sure you change all the downstream users too.

	-hpa


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 14:56:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 14:56:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REpjY-0008B4-NO; Fri, 14 Oct 2011 14:56:04 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REpiM-0007hT-5Y
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 14:54:54 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1318629284!1100844!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30517 invoked from network); 14 Oct 2011 21:54:45 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2011 21:54:45 -0000
Received: from anacreon.sc.intel.com (fmdmzpr03-ext.fm.intel.com
	[192.55.54.38]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9ELsCSC013915
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 14:54:12 -0700
Message-ID: <4E98AF71.40303@zytor.com>
Date: Fri, 14 Oct 2011 14:53:53 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Steven Rostedt <rostedt@goodmis.org>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<34ede5db1571d541a5c3fc49923bb353a37dd431.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<4E97067A.2070305@zytor.com> <4E97188A.6040400@goop.org>
	<1318531022.12224.13.camel@gandalf.stny.rr.com>
In-Reply-To: <1318531022.12224.13.camel@gandalf.stny.rr.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 09/10] x86/jump_label: use
 GENERIC_NOP5_ATOMIC instead of jmp5 +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 10/13/2011 11:37 AM, Steven Rostedt wrote:
> On Thu, 2011-10-13 at 09:57 -0700, Jeremy Fitzhardinge wrote:
>> On 10/13/2011 08:40 AM, H. Peter Anvin wrote:
>>> On 10/12/2011 05:08 PM, Jeremy Fitzhardinge wrote:
>>>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
>>>>
>>>> GENERIC_NOP5_ATOMIC should make a better nop.
>>>>
>>> On 32 bits, yes.  On 64 bits you should use P6_NOP5_ATOMIC.
>>
>> Something like this?
>>
> 
> No, we only care about 5byte nops here. Look at ideal_nop in
> alterative.c
> 

He needs a compile-time alternative.

	-hpa


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 15:19:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 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 1REq5m-0000a2-K8; Fri, 14 Oct 2011 15:19:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REq4d-0000Mg-LZ
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 15:17:52 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318630668!1087122!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22971 invoked from network); 14 Oct 2011 22:17:48 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	14 Oct 2011 22:17:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,348,1315180800"; 
   d="scan'208";a="8404364"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	14 Oct 2011 22:17: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, 14 Oct 2011 23:17:47 +0100
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 1REq4Z-0004yv-Fq;
	Fri, 14 Oct 2011 22:17:47 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1REq4Z-0001JL-B0;
	Fri, 14 Oct 2011 23:17:47 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9341-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 14 Oct 2011 23:17:47 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9341: 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 9341 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9341/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 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-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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  6880bfc48504
baseline version:
 xen                  f63528cc5060

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Laszlo Ersek <lersek@redhat.com>
  Paul Durrant <paul.durrant@citrix.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                                     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=6880bfc48504
+ . 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 6880bfc48504
+ branch=xen-unstable
+ revision=6880bfc48504
+ . 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 6880bfc48504 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 5 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 Fri Oct 14 16:03:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 16:03:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REqmb-000252-Gu; Fri, 14 Oct 2011 16:03:17 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REqjh-0001px-7m
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 16:00:17 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-10.tower-27.messagelabs.com!1318633187!40012119!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11215 invoked from network); 14 Oct 2011 22:59:48 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2011 22:59:48 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:b888:60ff:fedc:2b8c])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id B1307983F;
	Fri, 14 Oct 2011 16:00:10 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 7BEBA204F3;
	Fri, 14 Oct 2011 16:00:05 -0700 (PDT)
Message-ID: <4E98BEF5.10801@goop.org>
Date: Fri, 14 Oct 2011 16:00:05 -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: Maxim Uvarov <maxim.uvarov@oracle.com>
References: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
In-Reply-To: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com
Subject: [Xen-devel] Re: [PATCH] XEN_DOMAIN_MEMORY 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 10/14/2011 03:36 PM, Maxim Uvarov wrote:
> Hello,
>
> Please find here patches for XEN_MAX_DOMAIN_MEMORY:
>
> [PATCH 1/2] xen: Fix XEN_MAX_DOMAIN_MEMORY to be selectable
> [PATCH 2/2] xen: Make XEN_MAX_DOMAIN_MEMORY have more sensible defaults for 32-bit builds

What's the rationale?

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 16:42:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 16:42:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RErOi-00039s-7A; Fri, 14 Oct 2011 16:42:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RErNr-0002xI-G4
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 16:41:48 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318635674!41981568!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9461 invoked from network); 14 Oct 2011 23:41:16 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 14 Oct 2011 23:41:16 -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 459AE988B;
	Fri, 14 Oct 2011 16:41:42 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id D0ECD20363;
	Fri, 14 Oct 2011 16:41:37 -0700 (PDT)
Message-ID: <4E98C8B1.20304@goop.org>
Date: Fri, 14 Oct 2011 16:41:37 -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: Maxim Uvarov <maxim.uvarov@oracle.com>
References: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
	<4E98BEF5.10801@goop.org> <4E98C6CE.4020508@oracle.com>
In-Reply-To: <4E98C6CE.4020508@oracle.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com
Subject: [Xen-devel] Re: [PATCH] XEN_DOMAIN_MEMORY 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 10/14/2011 04:33 PM, Maxim Uvarov wrote:
> On 10/14/2011 04:00 PM, Jeremy Fitzhardinge wrote:
>> On 10/14/2011 03:36 PM, Maxim Uvarov wrote:
>>> Hello,
>>>
>>> Please find here patches for XEN_MAX_DOMAIN_MEMORY:
>>>
>>> [PATCH 1/2] xen: Fix XEN_MAX_DOMAIN_MEMORY to be selectable
>>> [PATCH 2/2] xen: Make XEN_MAX_DOMAIN_MEMORY have more sensible
>>> defaults for 32-bit builds
>>
>> What's the rationale?
>>
>>      J
>
> The first patch is actually bug fix. You can not define just "int"
> without description in Kconfig. As the result this option will not be
> visible in menuconfig. Even if you will change it in .config make
> oldconfig will set it up for default value. So you need to add any
> description to it as all others int options have.

No, that was deliberate, because I don't really think there's a need to
change it.

>
> Second patch is more optional and it's just suggestion to use for 32
> bit more corresponding value.

While it would be very silly to put 128GB of actual RAM on a 32-bit
machine, systems can have non-contiguous RAM placed at high addresses,
which would no longer be accessible.

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 17:24:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 17:24:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REs2t-0004LF-Id; Fri, 14 Oct 2011 17:24:11 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1REs1E-00046m-JN
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 17:22:30 -0700
X-Env-Sender: rostedt@goodmis.org
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318638144!1106956!1
X-Originating-IP: [71.74.56.124]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16455 invoked from network); 15 Oct 2011 00:22:25 -0000
Received: from hrndva-omtalb.mail.rr.com (HELO hrndva-omtalb.mail.rr.com)
	(71.74.56.124) by server-14.tower-216.messagelabs.com with SMTP;
	15 Oct 2011 00:22:25 -0000
X-Authority-Analysis: v=1.1 cv=agqPq5NoKwAPC9P66H7dbYUCjxvmT73as08i4x3aqAA=
	c=1 sm=0 a=jVLHYovT1_cA:10 a=5SG0PmZfjMsA:10 a=Q9fys5e9bTEA:10
	a=ZycB6UtQUfgMyuk2+PxD7w==:17 a=tHz9FfFoAAAA:8
	a=6onK2RP5Y43qiiEBcqsA:9 a=PUjeQqilurYA:10 a=6O0IECtVFhoA:10
	a=ZycB6UtQUfgMyuk2+PxD7w==:117
X-Cloudmark-Score: 0
X-Originating-IP: 74.67.80.29
Received: from [74.67.80.29] ([74.67.80.29:52054] helo=[192.168.23.10])
	by hrndva-oedge01.mail.rr.com (envelope-from <rostedt@goodmis.org>)
	(ecelerity 2.2.3.46 r()) with ESMTP
	id 8D/75-12608-D32D89E4; Sat, 15 Oct 2011 00:22:24 +0000
Message-ID: <1318638140.12224.81.camel@gandalf.stny.rr.com>
From: Steven Rostedt <rostedt@goodmis.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Date: Fri, 14 Oct 2011 20:22:20 -0400
In-Reply-To: <4E98AF71.40303@zytor.com>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<34ede5db1571d541a5c3fc49923bb353a37dd431.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<4E97067A.2070305@zytor.com> <4E97188A.6040400@goop.org>
	<1318531022.12224.13.camel@gandalf.stny.rr.com>
	<4E98AF71.40303@zytor.com>
Content-Type: text/plain; charset="ISO-8859-15"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
Mime-Version: 1.0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>, Michael,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 09/10] x86/jump_label: use
 GENERIC_NOP5_ATOMIC instead of jmp5 +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 Fri, 2011-10-14 at 14:53 -0700, H. Peter Anvin wrote:
> On 10/13/2011 11:37 AM, Steven Rostedt wrote:
> > On Thu, 2011-10-13 at 09:57 -0700, Jeremy Fitzhardinge wrote:
> >> On 10/13/2011 08:40 AM, H. Peter Anvin wrote:
> >>> On 10/12/2011 05:08 PM, Jeremy Fitzhardinge wrote:
> >>>> From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> >>>>
> >>>> GENERIC_NOP5_ATOMIC should make a better nop.
> >>>>
> >>> On 32 bits, yes.  On 64 bits you should use P6_NOP5_ATOMIC.
> >>
> >> Something like this?
> >>
> > 
> > No, we only care about 5byte nops here. Look at ideal_nop in
> > alterative.c
> > 
> 
> He needs a compile-time alternative.

I didn't explain this well. I actually just meant something like:

#ifdef CONFIG_X86_64
# define IDEAL_NOP5	P6_NOP5_ATOMIC
#else
# define IDEAL_NOP5	GENERIC_NOP5_ATOMIC
#endif

That is, we know we are using this for a 5byte jump. Just keep it simple
for that. Do you envision needing other nops too? Well, we could do 2
byte nops, but I think we could use the same for both. Can't we?

-- Steve



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 17:25:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 17:25:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REs4L-0004jB-T1; Fri, 14 Oct 2011 17:25:41 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REs2H-0004Cu-Jz
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 17:23:34 -0700
X-Env-Sender: mightydreams@gmail.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1318638208!204193!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10778 invoked from network); 15 Oct 2011 00:23:30 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Oct 2011 00:23:30 -0000
Received: by iaen33 with SMTP id n33so4066737iae.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 17:23:28 -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
	:content-type; bh=8nvTXzmTSC4/3GkYve3hfS5XkOobX0rLaXrjJhdCEPY=;
	b=Op+Z7gZe0bYVnQ9rVJdXtRzp2QHxvwjQ26KUym/xxIErj6/NpNVuIYcM5lOJQgLr+3
	3Rif84wN6Oez6809CbSjHA8KEHLZoydtrz8+a18CsmhWaWYpP79usHzZvWnkuIuuYimD
	z8rsHgUOQojjpNVaHA+0448aFnUwQQIMIrt6o=
MIME-Version: 1.0
Received: by 10.231.21.10 with SMTP id h10mr4530801ibb.69.1318638208292; Fri,
	14 Oct 2011 17:23:28 -0700 (PDT)
Received: by 10.231.35.6 with HTTP; Fri, 14 Oct 2011 17:23:28 -0700 (PDT)
In-Reply-To: <4E985ACD.3020808@citrix.com>
References: <CALKraOZKGQjWag0Jk1-xZ_9o9Xh1N8pwBhdEhXOAT_dWpQA66Q@mail.gmail.com>
	<CALKraObo-k_QiE1RAVP0B=buQdAET-tF7e=zJRS-NXny=kVZMg@mail.gmail.com>
	<4E985ACD.3020808@citrix.com>
Date: Sat, 15 Oct 2011 05:53:28 +0530
Message-ID: <CALKraOZM_ohAg+ma27=38Y9nEDVs6zT=dUUTN54Rv3G9fAThug@mail.gmail.com>
Subject: Re: [Xen-devel] how hypervisor separates assembly instructions
From: Tapas Mishra <mightydreams@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-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 Fri, Oct 14, 2011 at 9:22 PM, Andrew Cooper
<andrew.cooper3@citrix.com> wrote:

> The hypervisor "separates" different operating systems in the same way
> that regular operating systems separate different processes.
>

Hi,
thanks for your message I want to understand this last 2 lines in
detail.As how does the hypervisor separates different OS and things
"run."

-- 
------------------------------

Tapas

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 18:04:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 18:04:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REsg4-00061z-Vj; Fri, 14 Oct 2011 18:04:41 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1REscc-0005mO-IS
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 18:01:11 -0700
X-Env-Sender: andreas.olsowski@leuphana.de
X-Msg-Ref: server-5.tower-182.messagelabs.com!1318640463!17402534!1
X-Originating-IP: [193.174.46.71]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22217 invoked from network); 15 Oct 2011 01:01:03 -0000
Received: from mailhost.leuphana.de (HELO leuphana.de) (193.174.46.71)
	by server-5.tower-182.messagelabs.com with SMTP;
	15 Oct 2011 01:01:03 -0000
Received: from [195.37.28.33] (account aolsowsk@leuphana.de [195.37.28.33]
	verified) by leuphana.de (CommuniGate Pro SMTP 5.4.1e)
	with ESMTPSA id 45815420; Sat, 15 Oct 2011 03:01:02 +0200
Message-ID: <4E98DB4D.6060900@leuphana.de>
Date: Sat, 15 Oct 2011 03:01:01 +0200
From: Andreas Olsowski <andreas.olsowski@leuphana.de>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.21) Gecko/20110831 Icedove/3.1.13
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] XL: pv guests dont reboot after migration
	(xen-4.1.2-rc3) libc-2.11.2 segfault
References: <4E785FDD.40209@leuphana.de>	<1316546621.5182.23.camel@dagon.hellion.org.uk>	<4E7C37D6.7050109@leuphana.de>	<1316764843.23371.103.camel@zakaz.uk.xensource.com>	<4E7C4E45.5080509@leuphana.de>
	<20098.2654.689536.265060@mariner.uk.xensource.com>
In-Reply-To: <20098.2654.689536.265060@mariner.uk.xensource.com>
Cc: Ian.Jackson@eu.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>
Content-Type: multipart/mixed; boundary="===============0203964109=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a cryptographically signed message in MIME format.

--===============0203964109==
Content-Type: multipart/signed; protocol="application/pkcs7-signature";
	micalg=sha1; boundary="------------ms080600050702030107090400"

This is a cryptographically signed message in MIME format.

--------------ms080600050702030107090400
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable

Hi all.

If you recall i created a similar discussion last month and working=20
patches were replied and tested.


Now i finally got around to updating my systems to the latest testing=20
release and it would seem something else is preventing a clean reboot now=
=2E

pv guests dont reboot after migration,
just when xl should reboot the machine syslog shows:


Oct 15 02:46:32 netcatarina kernel: xl[14986]: segfault at 7f0ec70a3008=20
ip 00007f0ec7d517f9 sp 00007fff366cf100 error 4 in=20
libc-2.11.2.so[7f0ec7cdb000+158000]



I am running debian squueze and havent made any changes to it since
4.1.2-rc2-pre with the patches from my previous thread worked fine.


root@netcatarina:~# locate libc-2.
/lib/libc-2.11.2.so
/lib32/libc-2.11.2.so
root@netcatarina:~# dpkg -l |grep libc6
ii  libc6                               2.11.2-10=20
Embedded GNU C Library: Shared libraries
ii  libc6-dev                           2.11.2-10=20
Embedded GNU C Library: Development Libraries and Header Files
ii  libc6-i386                          2.11.2-10=20
Embedded GNU C Library: 32-bit shared libraries for AMD64
root@netcatarina:~# ldd /usr/sbin/xl
	linux-vdso.so.1 =3D>  (0x00007fffa33c9000)
	libxlutil.so.1.0 =3D> /usr/lib/libxlutil.so.1.0 (0x00007f6815a23000)
	libxenlight.so.1.0 =3D> /usr/lib/libxenlight.so.1.0 (0x00007f68157fb000)=

	libxenctrl.so.4.0 =3D> /usr/lib/libxenctrl.so.4.0 (0x00007f68155d8000)
	libdl.so.2 =3D> /lib/libdl.so.2 (0x00007f68153d4000)
	libxenguest.so.4.0 =3D> /usr/lib/libxenguest.so.4.0 (0x00007f68151af000)=

	libxenstore.so.3.0 =3D> /usr/lib/libxenstore.so.3.0 (0x00007f6814fa5000)=

	libblktapctl.so.1.0 =3D> /usr/lib/libblktapctl.so.1.0 (0x00007f6814d9e00=
0)
	libutil.so.1 =3D> /lib/libutil.so.1 (0x00007f6814b9b000)
	libuuid.so.1 =3D> /lib/libuuid.so.1 (0x00007f6814996000)
	libc.so.6 =3D> /lib/libc.so.6 (0x00007f6814635000)
	libpthread.so.0 =3D> /lib/libpthread.so.0 (0x00007f6814419000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f6815c32000)
	libz.so.1 =3D> /usr/lib/libz.so.1 (0x00007f6814201000)

root@netcatarina:~# ls -la /lib/libc.so.6
lrwxrwxrwx 1 root root 14 May 23 13:04 /lib/libc.so.6 -> libc-2.11.2.so

So its not the fact that i do have a additional 32bit version installed=20
(this is a 64bit system).



This patch is the main reason i even bothered to update the servers so=20
it would be nice if you could post a patch to this problem as well.

It happens more frequently than i would like that people reboot their=20
servers.
And since i migrate them to a different server when i do maintenance=20
this problem pretty much affects all of my 60 virtual machines.



With best regards


---
Andreas


--------------ms080600050702030107090400
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIU3TCC
BCEwggMJoAMCAQICAgDHMA0GCSqGSIb3DQEBBQUAMHExCzAJBgNVBAYTAkRFMRwwGgYDVQQK
ExNEZXV0c2NoZSBUZWxla29tIEFHMR8wHQYDVQQLExZULVRlbGVTZWMgVHJ1c3QgQ2VudGVy
MSMwIQYDVQQDExpEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMjAeFw0wNjEyMTkxMDI5MDBa
Fw0xOTA2MzAyMzU5MDBaMFoxCzAJBgNVBAYTAkRFMRMwEQYDVQQKEwpERk4tVmVyZWluMRAw
DgYDVQQLEwdERk4tUEtJMSQwIgYDVQQDExtERk4tVmVyZWluIFBDQSBHbG9iYWwgLSBHMDEw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDpm8NnhfkNrvWNVMOWUDU9YuluTO2U
1wBblSJ01CDrNI/W7MAxBAuZgeKmFNJSoCgjhIt0iQReW+DieMF4yxbLKDU5ey2QRdDtoAB6
fL9KDhsAw4bpXCsxEXsM84IkQ4wcOItqaACa7txPeKvSxhObdq3u3ibo7wGvdA/BCaL2a869
080UME/15eOkyGKbghoDJzANAmVgTe3RCSMqljVYJ9N2xnG2kB3E7f81hn1vM7PbD8URwoqD
oZRdQWvY0hD1TP3KUazZve+Sg7va64sWVlZDz+HVEz2mHycwzUlU28kTNJpxdcVs6qcLmPkh
nSevPqM5OUhqjK3JmfvDEvK9AgMBAAGjgdkwgdYwcAYDVR0fBGkwZzBloGOgYYZfaHR0cDov
L3BraS50ZWxlc2VjLmRlL2NnaS1iaW4vc2VydmljZS9hZl9Eb3dubG9hZEFSTC5jcmw/LWNy
bF9mb3JtYXQ9WF81MDkmLWlzc3Vlcj1EVF9ST09UX0NBXzIwHQYDVR0OBBYEFEm3xs/oPR9/
6kR7Eyn38QpwPt5kMB8GA1UdIwQYMBaAFDHDeRu69VPXF+CJei0XbAqzK50zMA4GA1UdDwEB
/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMA0GCSqGSIb3DQEBBQUAA4IBAQA74Vp3wEgX
3KkY7IGvWonwvSiSpspZGBJw7Cjy565/lizn8l0ZMfYTK3S9vYCyufdnyTmieTvhERHua3iR
M347XyYndVNljjNj7s9zw7CSI0khUHUjoR8Y4pSFPT8z6XcgjaK95qGFKUD2P3MyWA0Ja6ba
hWzAP7uNZmRWJE6uDT8yNQFb6YyC2XJZT7GGhfF0hVblw/hc843uR7NTBXDn5U2KaYMo4RMJ
hp5eyOpYHgwf+aTUWgRo/Sg+iwK2WLX2oSw3VwBnqyNojWOl75lrXP1LVvarQIc01BGSbOyH
xQoLBzNytG8MHVQs2FHHzL8w00Ny8TK/jM5JY6gA9/IcMIIFXjCCBEagAwIBAgIEC8pR1jAN
BgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4G
A1UECxMHREZOLVBLSTEkMCIGA1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4X
DTA4MDIwNzA5NTAwMFoXDTE5MDYzMDAwMDAwMFowgdMxCzAJBgNVBAYTAkRFMRYwFAYDVQQI
Ew1OaWVkZXJzYWNoc2VuMRIwEAYDVQQHEwlMdWVuZWJ1cmcxKDAmBgNVBAoTH0xldXBoYW5h
IFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcxIjAgBgNVBAsTGVJlY2hlbi0gdW5kIE1lZGllbnpl
bnRydW0xKzApBgNVBAMTIkxldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcgQ0ExHTAb
BgkqhkiG9w0BCQEWDmNhQGxldXBoYW5hLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAqJ+JpHih32+icKiQ2IkbhmFLjAcnK0vrnyOKbn7+1xywhvL3zkraqhQlrqEltTDy
711vIEadOVfhIx8xZYYJ/zg1OCwKUxNbIbjcsIFiOKNbWxI3/yMOsaZpXsCLW7GfHLlLADW1
Cv2gUAdnjJUATcUF3a25Bgr9Lbv+GI+3bY9ydMkGnhFYSL96LLqLxAXzGXL/MAM5t/xK8cc8
+6+mWxHAqO+85Jn+UvS1khVTtZfACrYZKFnAsVHOMM/WRugohq4ue6Jfp65exMM7HKWNPrKn
UV0hotcInKFBYywcZrIa2r/6m63nOxl1gHrewxiFWEBvpgMkQ+a7PHhXsMkPdQIDAQABo4IB
sDCCAawwEgYDVR0TAQH/BAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPThaBk7
GUPHATbRNGKW8/UDoQeMMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMBkGA1Ud
EQQSMBCBDmNhQGxldXBoYW5hLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEu
cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0
cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB
ogYIKwYBBQUHAQEEgZUwgZIwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUv
Z2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRw
Oi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNy
dDANBgkqhkiG9w0BAQUFAAOCAQEAmSFLUEnTM1zmNRfF4TTDRB53iHmBY0OYTlaPJvXXy4f7
jc1Dpz00HiVyFohY9gqo+jbIAm5avSCmhbL9glEWubE/BNZz9l9lyTCMMxFES0TCiC6W86Ev
o9E4C5IEqxZAOlvRyM3w3u8ItBO9cG190/XMi1Ouk3iBfwRVvFINy9Favq+/8HWFwkFrphpy
6JR90AbbjtE7b7owcMxusgFtPi8A1uyc3cpR21f51K7qgmGbsyXso+U9c/8Fak0IM0qQTN7p
GPmI1lfJ0x1r/QusHVYSFojAT2vQamfGeCNVELg/gH4tlTGkDbHW5QhInkASQv4obBYewNfR
rLG4wgPz5TCCBacwggSPoAMCAQICBBDuKTAwDQYJKoZIhvcNAQEFBQAwgdMxCzAJBgNVBAYT
AkRFMRYwFAYDVQQIEw1OaWVkZXJzYWNoc2VuMRIwEAYDVQQHEwlMdWVuZWJ1cmcxKDAmBgNV
BAoTH0xldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcxIjAgBgNVBAsTGVJlY2hlbi0g
dW5kIE1lZGllbnplbnRydW0xKzApBgNVBAMTIkxldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVu
ZWJ1cmcgQ0ExHTAbBgkqhkiG9w0BCQEWDmNhQGxldXBoYW5hLmRlMB4XDTEwMTEwMTExNTky
OVoXDTEzMTAzMTExNTkyOVowajELMAkGA1UEBhMCREUxKDAmBgNVBAoTH0xldXBoYW5hIFVu
aXZlcnNpdGFldCBMdWVuZWJ1cmcxFjAUBgNVBAsTDVJlY2hlbnplbnRydW0xGTAXBgNVBAMT
EEFuZHJlYXMgT2xzb3dza2kwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBzfnZ
7pbsecrmresa6JNTMmgoBFpwyr7k7U5O+j7QlFvMlePF/Tz7TeULaEevf7H68IiA/6oGZQvg
NReD/64PYXxbKfsJydY6W1K+jq2karofhW5bk5p210DEQv4qyV6M+aJRKxW0Hp32OeLk5QUH
9T2780PELXGn222r+NCSmBKLP0MHsUa6CFI+jRqztB60v+wc9TD6crMEB37ddckq7mS3QWk1
m2/68bmCsHWRLTpWn9hT4S8eBSL/3YLR9DF8kfWl0wEgy8/tJY1nz5IlSI3S2v1ys7rwXBAp
YHRpeHM/WNNNV4kiH09g2vlxFebQN0xTyoO1+PX6iPeAh0NbAgMBAAGjggHpMIIB5TAJBgNV
HRMEAjAAMAsGA1UdDwQEAwIF4DApBgNVHSUEIjAgBggrBgEFBQcDAgYIKwYBBQUHAwQGCisG
AQQBgjcUAgIwHQYDVR0OBBYEFMrca499fLnPczMLjRm2Nck06YCyMB8GA1UdIwQYMBaAFPTh
aBk7GUPHATbRNGKW8/UDoQeMMCcGA1UdEQQgMB6BHGFuZHJlYXMub2xzb3dza2lAbGV1cGhh
bmEuZGUwgY0GA1UdHwSBhTCBgjA/oD2gO4Y5aHR0cDovL2NkcDEucGNhLmRmbi5kZS91bmkt
bHVlbmVidXJnLWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD+gPaA7hjlodHRwOi8vY2RwMi5wY2Eu
ZGZuLmRlL3VuaS1sdWVuZWJ1cmctY2EvcHViL2NybC9jYWNybC5jcmwwgaYGCCsGAQUFBwEB
BIGZMIGWMEkGCCsGAQUFBzAChj1odHRwOi8vY2RwMS5wY2EuZGZuLmRlL3VuaS1sdWVuZWJ1
cmctY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEkGCCsGAQUFBzAChj1odHRwOi8vY2RwMi5w
Y2EuZGZuLmRlL3VuaS1sdWVuZWJ1cmctY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqG
SIb3DQEBBQUAA4IBAQANa3ZG/UAmpRcAXqOFOKXBfzN9vZilIdAUxSaXzN9gmXBNptDEcLfD
ccoA228Qc0BSdpvqMdE/21ahqE6oYI1CTfqbuYdoi/cmGoXo6+MdKCKxAD9LokkHdZFhr8re
NrsVkqxyY++Cek777HKZWn1Ft9864LA6vDar3K/sUHlBNxO6VhVzt09NQIFrA50lCkNd6iCG
7Hji624SI49aWjzysBOBdcP68tzSYM+nJLod1NZ3S/W3v+IlPlMeu1JZ5hRnzoTC5qHKKdoQ
kwSmQmv8/uXD46TXutmLXxH3SyBUIM4ks6RN8+VbJ9+61nOQjtazZzvgz9cnYquQC9Dm2s+q
MIIFpzCCBI+gAwIBAgIEEO4pMDANBgkqhkiG9w0BAQUFADCB0zELMAkGA1UEBhMCREUxFjAU
BgNVBAgTDU5pZWRlcnNhY2hzZW4xEjAQBgNVBAcTCUx1ZW5lYnVyZzEoMCYGA1UEChMfTGV1
cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZzEiMCAGA1UECxMZUmVjaGVuLSB1bmQgTWVk
aWVuemVudHJ1bTErMCkGA1UEAxMiTGV1cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZyBD
QTEdMBsGCSqGSIb3DQEJARYOY2FAbGV1cGhhbmEuZGUwHhcNMTAxMTAxMTE1OTI5WhcNMTMx
MDMxMTE1OTI5WjBqMQswCQYDVQQGEwJERTEoMCYGA1UEChMfTGV1cGhhbmEgVW5pdmVyc2l0
YWV0IEx1ZW5lYnVyZzEWMBQGA1UECxMNUmVjaGVuemVudHJ1bTEZMBcGA1UEAxMQQW5kcmVh
cyBPbHNvd3NraTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMHN+dnulux5yuat
6xrok1MyaCgEWnDKvuTtTk76PtCUW8yV48X9PPtN5QtoR69/sfrwiID/qgZlC+A1F4P/rg9h
fFsp+wnJ1jpbUr6OraRquh+FbluTmnbXQMRC/irJXoz5olErFbQenfY54uTlBQf1PbvzQ8Qt
cafbbav40JKYEos/QwexRroIUj6NGrO0HrS/7Bz1MPpyswQHft11ySruZLdBaTWbb/rxuYKw
dZEtOlaf2FPhLx4FIv/dgtH0MXyR9aXTASDLz+0ljWfPkiVIjdLa/XKzuvBcEClgdGl4cz9Y
001XiSIfT2Da+XEV5tA3TFPKg7X49fqI94CHQ1sCAwEAAaOCAekwggHlMAkGA1UdEwQCMAAw
CwYDVR0PBAQDAgXgMCkGA1UdJQQiMCAGCCsGAQUFBwMCBggrBgEFBQcDBAYKKwYBBAGCNxQC
AjAdBgNVHQ4EFgQUytxrj318uc9zMwuNGbY1yTTpgLIwHwYDVR0jBBgwFoAU9OFoGTsZQ8cB
NtE0Ypbz9QOhB4wwJwYDVR0RBCAwHoEcYW5kcmVhcy5vbHNvd3NraUBsZXVwaGFuYS5kZTCB
jQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vY2RwMS5wY2EuZGZuLmRlL3VuaS1sdWVuZWJ1
cmctY2EvcHViL2NybC9jYWNybC5jcmwwP6A9oDuGOWh0dHA6Ly9jZHAyLnBjYS5kZm4uZGUv
dW5pLWx1ZW5lYnVyZy1jYS9wdWIvY3JsL2NhY3JsLmNybDCBpgYIKwYBBQUHAQEEgZkwgZYw
SQYIKwYBBQUHMAKGPWh0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvdW5pLWx1ZW5lYnVyZy1jYS9w
dWIvY2FjZXJ0L2NhY2VydC5jcnQwSQYIKwYBBQUHMAKGPWh0dHA6Ly9jZHAyLnBjYS5kZm4u
ZGUvdW5pLWx1ZW5lYnVyZy1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQEF
BQADggEBAA1rdkb9QCalFwBeo4U4pcF/M329mKUh0BTFJpfM32CZcE2m0MRwt8NxygDbbxBz
QFJ2m+ox0T/bVqGoTqhgjUJN+pu5h2iL9yYahejr4x0oIrEAP0uiSQd1kWGvyt42uxWSrHJj
74J6TvvscplafUW33zrgsDq8Nqvcr+xQeUE3E7pWFXO3T01AgWsDnSUKQ13qIIbseOLrbhIj
j1paPPKwE4F1w/ry3NJgz6ckuh3U1ndL9be/4iU+Ux67UlnmFGfOhMLmocop2hCTBKZCa/z+
5cPjpNe62YtfEfdLIFQgziSzpE3z5Vsn37rWc5CO1rNnO+DP1ydiq5AL0Obaz6oxggSoMIIE
pAIBATCB3DCB0zELMAkGA1UEBhMCREUxFjAUBgNVBAgTDU5pZWRlcnNhY2hzZW4xEjAQBgNV
BAcTCUx1ZW5lYnVyZzEoMCYGA1UEChMfTGV1cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVy
ZzEiMCAGA1UECxMZUmVjaGVuLSB1bmQgTWVkaWVuemVudHJ1bTErMCkGA1UEAxMiTGV1cGhh
bmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZyBDQTEdMBsGCSqGSIb3DQEJARYOY2FAbGV1cGhh
bmEuZGUCBBDuKTAwCQYFKw4DAhoFAKCCAqAwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
BgkqhkiG9w0BCQUxDxcNMTExMDE1MDEwMTAxWjAjBgkqhkiG9w0BCQQxFgQUT3+9DCCZlxy8
rknntb6FaMzyKJMwXwYJKoZIhvcNAQkPMVIwUDALBglghkgBZQMEAQIwCgYIKoZIhvcNAwcw
DgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgEo
MIHtBgkrBgEEAYI3EAQxgd8wgdwwgdMxCzAJBgNVBAYTAkRFMRYwFAYDVQQIEw1OaWVkZXJz
YWNoc2VuMRIwEAYDVQQHEwlMdWVuZWJ1cmcxKDAmBgNVBAoTH0xldXBoYW5hIFVuaXZlcnNp
dGFldCBMdWVuZWJ1cmcxIjAgBgNVBAsTGVJlY2hlbi0gdW5kIE1lZGllbnplbnRydW0xKzAp
BgNVBAMTIkxldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcgQ0ExHTAbBgkqhkiG9w0B
CQEWDmNhQGxldXBoYW5hLmRlAgQQ7ikwMIHvBgsqhkiG9w0BCRACCzGB36CB3DCB0zELMAkG
A1UEBhMCREUxFjAUBgNVBAgTDU5pZWRlcnNhY2hzZW4xEjAQBgNVBAcTCUx1ZW5lYnVyZzEo
MCYGA1UEChMfTGV1cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZzEiMCAGA1UECxMZUmVj
aGVuLSB1bmQgTWVkaWVuemVudHJ1bTErMCkGA1UEAxMiTGV1cGhhbmEgVW5pdmVyc2l0YWV0
IEx1ZW5lYnVyZyBDQTEdMBsGCSqGSIb3DQEJARYOY2FAbGV1cGhhbmEuZGUCBBDuKTAwDQYJ
KoZIhvcNAQEBBQAEggEADbG2d3+GMzBMPsdY7FNq3+c28kQVPh5n7Co1Q4XgPEGVDWAc9ZUz
wU/gVDNPVaDnD4ooOk/rU7eaUuUmPvJyeTJuOtC5HHimHE9L/0UNI4jswfaajMqhs7r6wGw2
2CGFIhl++HmI4fFQpSWyHJT0nOaodOpCEK3pSUYSt4L+ZuBTQQGa6H7W/PktJh6fW+bNeHIa
pOVdvbqq5Er4zK0EGyvUIDKywUhvBcUN/hzDwxIwf+Z83BbEueC2pH8DgI06hzM/IpWWLiJ8
qiB7oefa6a7mj2+tYhzzWIUXSwiFXpgHiDOVqlxFXr90r13k85O6WpSVEKg5GsEGnVI8nkeO
PwAAAAAAAA==
--------------ms080600050702030107090400--


--===============0203964109==
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

--===============0203964109==--


From xen-devel-bounces@lists.xensource.com Fri Oct 14 18:19:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 18:19:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REsu6-0006ie-Qj; Fri, 14 Oct 2011 18:19:10 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1REstC-0006Vv-Ra
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 18:18:15 -0700
X-Env-Sender: andreas.olsowski@leuphana.de
X-Msg-Ref: server-14.tower-21.messagelabs.com!1318641491!178718!1
X-Originating-IP: [193.174.46.71]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17470 invoked from network); 15 Oct 2011 01:18:11 -0000
Received: from mailhost.leuphana.de (HELO leuphana.de) (193.174.46.71)
	by server-14.tower-21.messagelabs.com with SMTP;
	15 Oct 2011 01:18:11 -0000
Received: from [195.37.28.33] (account aolsowsk@leuphana.de [195.37.28.33]
	verified) by leuphana.de (CommuniGate Pro SMTP 5.4.1e)
	with ESMTPSA id 45815460; Sat, 15 Oct 2011 03:18:10 +0200
Message-ID: <4E98DF51.9070907@leuphana.de>
Date: Sat, 15 Oct 2011 03:18:09 +0200
From: Andreas Olsowski <andreas.olsowski@leuphana.de>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.21) Gecko/20110831 Icedove/3.1.13
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: Re: [Xen-devel] pv guests die after failed migration
References: <4E786015.80603@leuphana.de>	<1316546879.5182.26.camel@dagon.hellion.org.uk>	<4E7C37BD.2000706@leuphana.de>	<1316764045.23371.100.camel@zakaz.uk.xensource.com>	<4E7C4E44.70508@leuphana.de>
	<1317225159.26672.87.camel@zakaz.uk.xensource.com>
In-Reply-To: <1317225159.26672.87.camel@zakaz.uk.xensource.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="===============1550885390=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a cryptographically signed message in MIME format.

--===============1550885390==
Content-Type: multipart/signed; protocol="application/pkcs7-signature";
	micalg=sha1; boundary="------------ms080402050901070902030500"

This is a cryptographically signed message in MIME format.

--------------ms080402050901070902030500
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: quoted-printable

It seems this still has not made it into 4.1-testing.



root@memoryana:~# xl info |grep xen_extra
xen_extra              : .2-rc3

root@memoryana:~# xl -vv migrate testmig netcatarina
migration target: Ready to receive domain.
Saving to migration stream new xl format (info 0x0/0x0/365)
Loading new save file incoming migration stream (new xl fmt info=20
0x0/0x0/365)
  Savefile contains xl domain config
xc: detail: Had 0 unexplained entries in p2m table
xc: Saving memory: iter 0 (last sent 0 skipped 0): 133120/133120  100%
xc: detail: delta 8283ms, dom0 86%, target 0%, sent 516Mb/s, dirtied=20
2Mb/s 508 pages
xc: Saving memory: iter 1 (last sent 130590 skipped 482): 133120/133120=20
  100%
xc: detail: delta 25ms, dom0 60%, target 0%, sent 665Mb/s, dirtied=20
44Mb/s 34 pages
xc: Saving memory: iter 2 (last sent 508 skipped 0): 133120/133120  100% =


xc: detail: Start last iteration
xc: detail: SUSPEND shinfo 000bee3c
xc: detail: delta 204ms, dom0 3%, target 0%, sent 5Mb/s, dirtied 26Mb/s=20
162 pages
xc: Saving memory: iter 3 (last sent 34 skipped 0): 133120/133120  100%
xc: detail: delta 1ms, dom0 0%, target 0%, sent 5308Mb/s, dirtied=20
5308Mb/s 162 pages
xc: detail: Total pages sent=3D 131294 (0.99x)
xc: detail: (of which 0 were fixups)
xc: detail: All memory is saved
xc: detail: Save exit rc=3D0
libxl: error: libxl.c:900:validate_virtual_disk failed to stat=20
/dev/xen-data/testmig-root: No such file or directory
cannot add disk 0 to domain: -6
migration target: Domain creation failed (code -3).
libxl: error: libxl_utils.c:408:libxl_read_exactly file/stream truncated =

reading ready message from migration receiver stream
libxl: info: libxl_exec.c:72:libxl_report_child_exitstatus migration=20
target process [13420] exited with error status 3
Migration failed, resuming at sender.
root@memoryana:~# xl console testmig
PM: freeze of devices complete after 0.099 msecs
PM: late freeze of devices complete after 0.025 msecs
------------[ cut here ]------------
kernel BUG at drivers/xen/events.c:1466!
invalid opcode: 0000 [#1] SMP
CPU 0
Modules linked in:

Pid: 6, comm: migration/0 Not tainted 3.0.4-xenU #6
RIP: e030:[<ffffffff8140d574>]  [<ffffffff8140d574>]=20
xen_irq_resume+0x224/0x370
RSP: e02b:ffff88001f9fbce0  EFLAGS: 00010082
RAX: ffffffffffffffef RBX: 0000000000000000 RCX: 0000000000000000
RDX: ffff88001f809ea8 RSI: ffff88001f9fbd00 RDI: 0000000000000001
RBP: 0000000000000010 R08: ffffffff81859a00 R09: 0000000000000000
R10: 0000000000000000 R11: 09f911029d74e35b R12: 0000000000000000
R13: 000000000000f0a0 R14: 0000000000000000 R15: ffff88001f9fbd00
FS:  00007f49f928b700(0000) GS:ffff88001fec6000(0000) knlGS:0000000000000=
000
CS:  e033 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: 00007f89fb1a89f0 CR3: 000000001e4cf000 CR4: 0000000000002660
DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
Process migration/0 (pid: 6, threadinfo ffff88001f9fa000, task=20
ffff88001f9f7170)
Stack:
  ffff88001f9fbd34 ffff88001f9fbd54 0000000000000003 000000000000f100
  0000000000000000 0000000000000003 0000000000000000 0000000000000003
  ffff88001fa6fdb0 ffffffff8140aa20 ffffffff81859a08 0000000000000000
Call Trace:
  [<ffffffff8140aa20>] ? gnttab_map+0x100/0x130
  [<ffffffff815c2765>] ? _raw_spin_lock+0x5/0x10
  [<ffffffff81083e01>] ? cpu_stopper_thread+0x101/0x190
  [<ffffffff8140e1f5>] ? xen_suspend+0x75/0xa0
  [<ffffffff81083f1b>] ? stop_machine_cpu_stop+0x8b/0xd0
  [<ffffffff81083e90>] ? cpu_stopper_thread+0x190/0x190
  [<ffffffff81083dd0>] ? cpu_stopper_thread+0xd0/0x190
  [<ffffffff815c0870>] ? schedule+0x270/0x6c0
  [<ffffffff81083d00>] ? copy_pid_ns+0x2a0/0x2a0
  [<ffffffff81065846>] ? kthread+0x96/0xa0
  [<ffffffff815c4024>] ? kernel_thread_helper+0x4/0x10
  [<ffffffff815c3436>] ? int_ret_from_sys_call+0x7/0x1b
  [<ffffffff815c2be1>] ? retint_restore_args+0x5/0x6
  [<ffffffff815c4020>] ? gs_change+0x13/0x13
Code: e8 f2 e9 ff ff 8b 44 24 10 44 89 e6 89 c7 e8 64 e8 ff ff ff c3 83=20
fb 04 0f 84 95 fe ff ff 4a 8b 14 f5 20 95 85 81 e9 68 ff ff ff <0f> 0b=20
eb fe 0f 0b eb fe 48 8b 1d fd 00 42 00 4c 8d 6c 24 20 eb
RIP  [<ffffffff8140d574>] xen_irq_resume+0x224/0x370
  RSP <ffff88001f9fbce0>
---[ end trace 67ddba38000aae42 ]---



--=20
Andreas


--------------ms080402050901070902030500
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIU3TCC
BCEwggMJoAMCAQICAgDHMA0GCSqGSIb3DQEBBQUAMHExCzAJBgNVBAYTAkRFMRwwGgYDVQQK
ExNEZXV0c2NoZSBUZWxla29tIEFHMR8wHQYDVQQLExZULVRlbGVTZWMgVHJ1c3QgQ2VudGVy
MSMwIQYDVQQDExpEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMjAeFw0wNjEyMTkxMDI5MDBa
Fw0xOTA2MzAyMzU5MDBaMFoxCzAJBgNVBAYTAkRFMRMwEQYDVQQKEwpERk4tVmVyZWluMRAw
DgYDVQQLEwdERk4tUEtJMSQwIgYDVQQDExtERk4tVmVyZWluIFBDQSBHbG9iYWwgLSBHMDEw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDpm8NnhfkNrvWNVMOWUDU9YuluTO2U
1wBblSJ01CDrNI/W7MAxBAuZgeKmFNJSoCgjhIt0iQReW+DieMF4yxbLKDU5ey2QRdDtoAB6
fL9KDhsAw4bpXCsxEXsM84IkQ4wcOItqaACa7txPeKvSxhObdq3u3ibo7wGvdA/BCaL2a869
080UME/15eOkyGKbghoDJzANAmVgTe3RCSMqljVYJ9N2xnG2kB3E7f81hn1vM7PbD8URwoqD
oZRdQWvY0hD1TP3KUazZve+Sg7va64sWVlZDz+HVEz2mHycwzUlU28kTNJpxdcVs6qcLmPkh
nSevPqM5OUhqjK3JmfvDEvK9AgMBAAGjgdkwgdYwcAYDVR0fBGkwZzBloGOgYYZfaHR0cDov
L3BraS50ZWxlc2VjLmRlL2NnaS1iaW4vc2VydmljZS9hZl9Eb3dubG9hZEFSTC5jcmw/LWNy
bF9mb3JtYXQ9WF81MDkmLWlzc3Vlcj1EVF9ST09UX0NBXzIwHQYDVR0OBBYEFEm3xs/oPR9/
6kR7Eyn38QpwPt5kMB8GA1UdIwQYMBaAFDHDeRu69VPXF+CJei0XbAqzK50zMA4GA1UdDwEB
/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMA0GCSqGSIb3DQEBBQUAA4IBAQA74Vp3wEgX
3KkY7IGvWonwvSiSpspZGBJw7Cjy565/lizn8l0ZMfYTK3S9vYCyufdnyTmieTvhERHua3iR
M347XyYndVNljjNj7s9zw7CSI0khUHUjoR8Y4pSFPT8z6XcgjaK95qGFKUD2P3MyWA0Ja6ba
hWzAP7uNZmRWJE6uDT8yNQFb6YyC2XJZT7GGhfF0hVblw/hc843uR7NTBXDn5U2KaYMo4RMJ
hp5eyOpYHgwf+aTUWgRo/Sg+iwK2WLX2oSw3VwBnqyNojWOl75lrXP1LVvarQIc01BGSbOyH
xQoLBzNytG8MHVQs2FHHzL8w00Ny8TK/jM5JY6gA9/IcMIIFXjCCBEagAwIBAgIEC8pR1jAN
BgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4G
A1UECxMHREZOLVBLSTEkMCIGA1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4X
DTA4MDIwNzA5NTAwMFoXDTE5MDYzMDAwMDAwMFowgdMxCzAJBgNVBAYTAkRFMRYwFAYDVQQI
Ew1OaWVkZXJzYWNoc2VuMRIwEAYDVQQHEwlMdWVuZWJ1cmcxKDAmBgNVBAoTH0xldXBoYW5h
IFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcxIjAgBgNVBAsTGVJlY2hlbi0gdW5kIE1lZGllbnpl
bnRydW0xKzApBgNVBAMTIkxldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcgQ0ExHTAb
BgkqhkiG9w0BCQEWDmNhQGxldXBoYW5hLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAqJ+JpHih32+icKiQ2IkbhmFLjAcnK0vrnyOKbn7+1xywhvL3zkraqhQlrqEltTDy
711vIEadOVfhIx8xZYYJ/zg1OCwKUxNbIbjcsIFiOKNbWxI3/yMOsaZpXsCLW7GfHLlLADW1
Cv2gUAdnjJUATcUF3a25Bgr9Lbv+GI+3bY9ydMkGnhFYSL96LLqLxAXzGXL/MAM5t/xK8cc8
+6+mWxHAqO+85Jn+UvS1khVTtZfACrYZKFnAsVHOMM/WRugohq4ue6Jfp65exMM7HKWNPrKn
UV0hotcInKFBYywcZrIa2r/6m63nOxl1gHrewxiFWEBvpgMkQ+a7PHhXsMkPdQIDAQABo4IB
sDCCAawwEgYDVR0TAQH/BAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPThaBk7
GUPHATbRNGKW8/UDoQeMMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMBkGA1Ud
EQQSMBCBDmNhQGxldXBoYW5hLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEu
cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0
cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB
ogYIKwYBBQUHAQEEgZUwgZIwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUv
Z2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRw
Oi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNy
dDANBgkqhkiG9w0BAQUFAAOCAQEAmSFLUEnTM1zmNRfF4TTDRB53iHmBY0OYTlaPJvXXy4f7
jc1Dpz00HiVyFohY9gqo+jbIAm5avSCmhbL9glEWubE/BNZz9l9lyTCMMxFES0TCiC6W86Ev
o9E4C5IEqxZAOlvRyM3w3u8ItBO9cG190/XMi1Ouk3iBfwRVvFINy9Favq+/8HWFwkFrphpy
6JR90AbbjtE7b7owcMxusgFtPi8A1uyc3cpR21f51K7qgmGbsyXso+U9c/8Fak0IM0qQTN7p
GPmI1lfJ0x1r/QusHVYSFojAT2vQamfGeCNVELg/gH4tlTGkDbHW5QhInkASQv4obBYewNfR
rLG4wgPz5TCCBacwggSPoAMCAQICBBDuKTAwDQYJKoZIhvcNAQEFBQAwgdMxCzAJBgNVBAYT
AkRFMRYwFAYDVQQIEw1OaWVkZXJzYWNoc2VuMRIwEAYDVQQHEwlMdWVuZWJ1cmcxKDAmBgNV
BAoTH0xldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcxIjAgBgNVBAsTGVJlY2hlbi0g
dW5kIE1lZGllbnplbnRydW0xKzApBgNVBAMTIkxldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVu
ZWJ1cmcgQ0ExHTAbBgkqhkiG9w0BCQEWDmNhQGxldXBoYW5hLmRlMB4XDTEwMTEwMTExNTky
OVoXDTEzMTAzMTExNTkyOVowajELMAkGA1UEBhMCREUxKDAmBgNVBAoTH0xldXBoYW5hIFVu
aXZlcnNpdGFldCBMdWVuZWJ1cmcxFjAUBgNVBAsTDVJlY2hlbnplbnRydW0xGTAXBgNVBAMT
EEFuZHJlYXMgT2xzb3dza2kwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBzfnZ
7pbsecrmresa6JNTMmgoBFpwyr7k7U5O+j7QlFvMlePF/Tz7TeULaEevf7H68IiA/6oGZQvg
NReD/64PYXxbKfsJydY6W1K+jq2karofhW5bk5p210DEQv4qyV6M+aJRKxW0Hp32OeLk5QUH
9T2780PELXGn222r+NCSmBKLP0MHsUa6CFI+jRqztB60v+wc9TD6crMEB37ddckq7mS3QWk1
m2/68bmCsHWRLTpWn9hT4S8eBSL/3YLR9DF8kfWl0wEgy8/tJY1nz5IlSI3S2v1ys7rwXBAp
YHRpeHM/WNNNV4kiH09g2vlxFebQN0xTyoO1+PX6iPeAh0NbAgMBAAGjggHpMIIB5TAJBgNV
HRMEAjAAMAsGA1UdDwQEAwIF4DApBgNVHSUEIjAgBggrBgEFBQcDAgYIKwYBBQUHAwQGCisG
AQQBgjcUAgIwHQYDVR0OBBYEFMrca499fLnPczMLjRm2Nck06YCyMB8GA1UdIwQYMBaAFPTh
aBk7GUPHATbRNGKW8/UDoQeMMCcGA1UdEQQgMB6BHGFuZHJlYXMub2xzb3dza2lAbGV1cGhh
bmEuZGUwgY0GA1UdHwSBhTCBgjA/oD2gO4Y5aHR0cDovL2NkcDEucGNhLmRmbi5kZS91bmkt
bHVlbmVidXJnLWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD+gPaA7hjlodHRwOi8vY2RwMi5wY2Eu
ZGZuLmRlL3VuaS1sdWVuZWJ1cmctY2EvcHViL2NybC9jYWNybC5jcmwwgaYGCCsGAQUFBwEB
BIGZMIGWMEkGCCsGAQUFBzAChj1odHRwOi8vY2RwMS5wY2EuZGZuLmRlL3VuaS1sdWVuZWJ1
cmctY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEkGCCsGAQUFBzAChj1odHRwOi8vY2RwMi5w
Y2EuZGZuLmRlL3VuaS1sdWVuZWJ1cmctY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqG
SIb3DQEBBQUAA4IBAQANa3ZG/UAmpRcAXqOFOKXBfzN9vZilIdAUxSaXzN9gmXBNptDEcLfD
ccoA228Qc0BSdpvqMdE/21ahqE6oYI1CTfqbuYdoi/cmGoXo6+MdKCKxAD9LokkHdZFhr8re
NrsVkqxyY++Cek777HKZWn1Ft9864LA6vDar3K/sUHlBNxO6VhVzt09NQIFrA50lCkNd6iCG
7Hji624SI49aWjzysBOBdcP68tzSYM+nJLod1NZ3S/W3v+IlPlMeu1JZ5hRnzoTC5qHKKdoQ
kwSmQmv8/uXD46TXutmLXxH3SyBUIM4ks6RN8+VbJ9+61nOQjtazZzvgz9cnYquQC9Dm2s+q
MIIFpzCCBI+gAwIBAgIEEO4pMDANBgkqhkiG9w0BAQUFADCB0zELMAkGA1UEBhMCREUxFjAU
BgNVBAgTDU5pZWRlcnNhY2hzZW4xEjAQBgNVBAcTCUx1ZW5lYnVyZzEoMCYGA1UEChMfTGV1
cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZzEiMCAGA1UECxMZUmVjaGVuLSB1bmQgTWVk
aWVuemVudHJ1bTErMCkGA1UEAxMiTGV1cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZyBD
QTEdMBsGCSqGSIb3DQEJARYOY2FAbGV1cGhhbmEuZGUwHhcNMTAxMTAxMTE1OTI5WhcNMTMx
MDMxMTE1OTI5WjBqMQswCQYDVQQGEwJERTEoMCYGA1UEChMfTGV1cGhhbmEgVW5pdmVyc2l0
YWV0IEx1ZW5lYnVyZzEWMBQGA1UECxMNUmVjaGVuemVudHJ1bTEZMBcGA1UEAxMQQW5kcmVh
cyBPbHNvd3NraTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMHN+dnulux5yuat
6xrok1MyaCgEWnDKvuTtTk76PtCUW8yV48X9PPtN5QtoR69/sfrwiID/qgZlC+A1F4P/rg9h
fFsp+wnJ1jpbUr6OraRquh+FbluTmnbXQMRC/irJXoz5olErFbQenfY54uTlBQf1PbvzQ8Qt
cafbbav40JKYEos/QwexRroIUj6NGrO0HrS/7Bz1MPpyswQHft11ySruZLdBaTWbb/rxuYKw
dZEtOlaf2FPhLx4FIv/dgtH0MXyR9aXTASDLz+0ljWfPkiVIjdLa/XKzuvBcEClgdGl4cz9Y
001XiSIfT2Da+XEV5tA3TFPKg7X49fqI94CHQ1sCAwEAAaOCAekwggHlMAkGA1UdEwQCMAAw
CwYDVR0PBAQDAgXgMCkGA1UdJQQiMCAGCCsGAQUFBwMCBggrBgEFBQcDBAYKKwYBBAGCNxQC
AjAdBgNVHQ4EFgQUytxrj318uc9zMwuNGbY1yTTpgLIwHwYDVR0jBBgwFoAU9OFoGTsZQ8cB
NtE0Ypbz9QOhB4wwJwYDVR0RBCAwHoEcYW5kcmVhcy5vbHNvd3NraUBsZXVwaGFuYS5kZTCB
jQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vY2RwMS5wY2EuZGZuLmRlL3VuaS1sdWVuZWJ1
cmctY2EvcHViL2NybC9jYWNybC5jcmwwP6A9oDuGOWh0dHA6Ly9jZHAyLnBjYS5kZm4uZGUv
dW5pLWx1ZW5lYnVyZy1jYS9wdWIvY3JsL2NhY3JsLmNybDCBpgYIKwYBBQUHAQEEgZkwgZYw
SQYIKwYBBQUHMAKGPWh0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvdW5pLWx1ZW5lYnVyZy1jYS9w
dWIvY2FjZXJ0L2NhY2VydC5jcnQwSQYIKwYBBQUHMAKGPWh0dHA6Ly9jZHAyLnBjYS5kZm4u
ZGUvdW5pLWx1ZW5lYnVyZy1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQEF
BQADggEBAA1rdkb9QCalFwBeo4U4pcF/M329mKUh0BTFJpfM32CZcE2m0MRwt8NxygDbbxBz
QFJ2m+ox0T/bVqGoTqhgjUJN+pu5h2iL9yYahejr4x0oIrEAP0uiSQd1kWGvyt42uxWSrHJj
74J6TvvscplafUW33zrgsDq8Nqvcr+xQeUE3E7pWFXO3T01AgWsDnSUKQ13qIIbseOLrbhIj
j1paPPKwE4F1w/ry3NJgz6ckuh3U1ndL9be/4iU+Ux67UlnmFGfOhMLmocop2hCTBKZCa/z+
5cPjpNe62YtfEfdLIFQgziSzpE3z5Vsn37rWc5CO1rNnO+DP1ydiq5AL0Obaz6oxggSoMIIE
pAIBATCB3DCB0zELMAkGA1UEBhMCREUxFjAUBgNVBAgTDU5pZWRlcnNhY2hzZW4xEjAQBgNV
BAcTCUx1ZW5lYnVyZzEoMCYGA1UEChMfTGV1cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVy
ZzEiMCAGA1UECxMZUmVjaGVuLSB1bmQgTWVkaWVuemVudHJ1bTErMCkGA1UEAxMiTGV1cGhh
bmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZyBDQTEdMBsGCSqGSIb3DQEJARYOY2FAbGV1cGhh
bmEuZGUCBBDuKTAwCQYFKw4DAhoFAKCCAqAwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
BgkqhkiG9w0BCQUxDxcNMTExMDE1MDExODA5WjAjBgkqhkiG9w0BCQQxFgQUxOtqmJK1jqfI
C/3OPKR7WH3Pds0wXwYJKoZIhvcNAQkPMVIwUDALBglghkgBZQMEAQIwCgYIKoZIhvcNAwcw
DgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgEo
MIHtBgkrBgEEAYI3EAQxgd8wgdwwgdMxCzAJBgNVBAYTAkRFMRYwFAYDVQQIEw1OaWVkZXJz
YWNoc2VuMRIwEAYDVQQHEwlMdWVuZWJ1cmcxKDAmBgNVBAoTH0xldXBoYW5hIFVuaXZlcnNp
dGFldCBMdWVuZWJ1cmcxIjAgBgNVBAsTGVJlY2hlbi0gdW5kIE1lZGllbnplbnRydW0xKzAp
BgNVBAMTIkxldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcgQ0ExHTAbBgkqhkiG9w0B
CQEWDmNhQGxldXBoYW5hLmRlAgQQ7ikwMIHvBgsqhkiG9w0BCRACCzGB36CB3DCB0zELMAkG
A1UEBhMCREUxFjAUBgNVBAgTDU5pZWRlcnNhY2hzZW4xEjAQBgNVBAcTCUx1ZW5lYnVyZzEo
MCYGA1UEChMfTGV1cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZzEiMCAGA1UECxMZUmVj
aGVuLSB1bmQgTWVkaWVuemVudHJ1bTErMCkGA1UEAxMiTGV1cGhhbmEgVW5pdmVyc2l0YWV0
IEx1ZW5lYnVyZyBDQTEdMBsGCSqGSIb3DQEJARYOY2FAbGV1cGhhbmEuZGUCBBDuKTAwDQYJ
KoZIhvcNAQEBBQAEggEAGYpYatvTVZi/EtLz+Ck6lOkbJhh1E8dXzR3EEqbfyelizP7+6UPG
L3EC8vSU/6Hk4id2pG/3Mv+Uj4aKK4cAxjOTVkUFf4D0ufHJJmdTEfaxJa0Pl/Ibxqlrn/WQ
kJAwIRurHY6baT6eDl89TFUrRDve6HkTJnJvX45zyRl5oYREQPahp4dr72JtIKi1ieQ3psRy
h+HxNCNJS1y10yQeRf4VLCdRzBdj5y8SlnpeGfU/CJjFsmyS7iXANp/JDDGxyZA96W+pRZOF
exotIDj2aOrK3uon/gt3WmUg7LC4k6CCutrTtwcAxW1YWLKKqKjQg9FJJAJH4PCT9YekN16b
4QAAAAAAAA==
--------------ms080402050901070902030500--


--===============1550885390==
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

--===============1550885390==--


From xen-devel-bounces@lists.xensource.com Fri Oct 14 21:01:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 21:01:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REvRZ-0003NG-AP; Fri, 14 Oct 2011 21:01:53 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REvQq-0003Am-0S
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 21:01:08 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1318651245!48320702!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18116 invoked from network); 15 Oct 2011 04:00:45 -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;
	15 Oct 2011 04:00:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,349,1315180800"; 
   d="scan'208";a="8405152"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Oct 2011 04:01: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, 15 Oct 2011 05:01:04 +0100
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 1REvQm-0006qj-8O;
	Sat, 15 Oct 2011 04:01:04 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1REvQl-0002b9-Ul;
	Sat, 15 Oct 2011 05:01:04 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9342-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 15 Oct 2011 05:01:03 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9342: 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 9342 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9342/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 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-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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  6880bfc48504
baseline version:
 xen                  6880bfc48504

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


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 Oct 14 21:49:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 21:49:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REwBc-0004Xr-O8; Fri, 14 Oct 2011 21:49:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REwAn-0004Ki-Iz
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 21:48:37 -0700
X-Env-Sender: silverbottlep@gmail.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318654112!21369685!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13775 invoked from network); 15 Oct 2011 04:48:34 -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;
	15 Oct 2011 04:48:34 -0000
Received: by pzk32 with SMTP id 32so1293384pzk.8
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 21:48:32 -0700 (PDT)
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
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=PaKh2+v/KnbqvatksG3G9eDt+UoM/K1tlOT/p1Sf1nc=;
	b=xZtIEnM7HyeGsTPQABqaxu7DNK7nncUoXAlKE/uqL1V8MUZh88oJ18YCA0XuRcx42m
	xhHWi2LT2MVO3tbwyZGgcDsnEUJtmBoYy/MDcOacAlB8oqBZWn19STR1VC6sxIqALro/
	cUu4k6G2VP8Aaj8h5TAvXfi4qAHTG37gsDcu4=
Received: by 10.68.44.134 with SMTP id e6mr21832575pbm.5.1318654112308;
	Fri, 14 Oct 2011 21:48:32 -0700 (PDT)
Received: from [192.168.2.124] ([112.169.222.30])
	by mx.google.com with ESMTPS id v8sm30207946pbf.8.2011.10.14.21.48.30
	(version=SSLv3 cipher=OTHER); Fri, 14 Oct 2011 21:48:31 -0700 (PDT)
Message-ID: <4E9910A0.5030002@gmail.com>
Date: Sat, 15 Oct 2011 13:48:32 +0900
From: Eunbyung Park <silverbottlep@gmail.com>
User-Agent: Mozilla/5.0 (Windows NT 6.1;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] deadlock in the credit2
References: <CABDE565.22EF3%keir.xen@gmail.com>
In-Reply-To: <CABDE565.22EF3%keir.xen@gmail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: George Dunlap <George.Dunlap@eu.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


>>> if ( d == current->domain )
>>> vcpu_schedule_lock_irq(current);
>>>
>>> It was very hard to understan for me..:) What does it exactly mean?
>> You're asking what "current" means?  "current" is a macro that always
>> resolves to the vcpu which is running on the current processor.
>>
>> sched_adjust() seems to be trying to avoid scheduling races in general
>> by pausing all vcpus before calling the per-scheduler function.  But
>> if a VM is calling the op on itself, the vcpu making the hypercall
>> can't pause itself.  So in that case (current->domain == d) will be
>> true, so sched_adjust() grab the schedule lock of that vm instead.
>>
>> But really all that locking should be handled in the scheduler
>> function, not by the generic code.  It knows best what needs to be
>> locked when.
This was what I really wanted to ask about.
Now I can understand what the generic scheduler code was going to say.
Thanks for your kindness.

--
Best Regards,
Eunbyung Park

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 22:46:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 22:46:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REx4W-0005zl-Sj; Fri, 14 Oct 2011 22:46:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REx3P-0005lu-Kr
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 22:45:05 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1318657500!17413527!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32028 invoked from network); 15 Oct 2011 05:45:00 -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;
	15 Oct 2011 05:45:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,350,1315180800"; 
   d="scan'208";a="8405494"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Oct 2011 05:44:59 +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;
	Sat, 15 Oct 2011 06:44:59 +0100
Subject: Re: [Xen-devel] pv guests die after failed migration
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andreas Olsowski <andreas.olsowski@leuphana.de>
In-Reply-To: <4E98DF51.9070907@leuphana.de>
References: <4E786015.80603@leuphana.de>
	<1316546879.5182.26.camel@dagon.hellion.org.uk>
	<4E7C37BD.2000706@leuphana.de>
	<1316764045.23371.100.camel@zakaz.uk.xensource.com>
	<4E7C4E44.70508@leuphana.de>
	<1317225159.26672.87.camel@zakaz.uk.xensource.com>
	<4E98DF51.9070907@leuphana.de>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Sat, 15 Oct 2011 06:44:59 +0100
Message-ID: <1318657499.11016.12.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 Sat, 2011-10-15 at 02:18 +0100, Andreas Olsowski wrote:
> It seems this still has not made it into 4.1-testing.

I'm afraid I've not had time to "figure out how to automatically select
which guests are capable of a cooperative resume and which are not." so
it hasn't been fixed in xen-unstable either AFAIK.

I'm also still interested in confirmation to the question I asked in the
mail you just replied to.

> 
> 
> 
> root@memoryana:~# xl info |grep xen_extra
> xen_extra              : .2-rc3
> 
> root@memoryana:~# xl -vv migrate testmig netcatarina
> migration target: Ready to receive domain.
> Saving to migration stream new xl format (info 0x0/0x0/365)
> Loading new save file incoming migration stream (new xl fmt info 
> 0x0/0x0/365)
>   Savefile contains xl domain config
> xc: detail: Had 0 unexplained entries in p2m table
> xc: Saving memory: iter 0 (last sent 0 skipped 0): 133120/133120  100%
> xc: detail: delta 8283ms, dom0 86%, target 0%, sent 516Mb/s, dirtied 
> 2Mb/s 508 pages
> xc: Saving memory: iter 1 (last sent 130590 skipped 482): 133120/133120 
>   100%
> xc: detail: delta 25ms, dom0 60%, target 0%, sent 665Mb/s, dirtied 
> 44Mb/s 34 pages
> xc: Saving memory: iter 2 (last sent 508 skipped 0): 133120/133120  100% 
> 
> xc: detail: Start last iteration
> xc: detail: SUSPEND shinfo 000bee3c
> xc: detail: delta 204ms, dom0 3%, target 0%, sent 5Mb/s, dirtied 26Mb/s 
> 162 pages
> xc: Saving memory: iter 3 (last sent 34 skipped 0): 133120/133120  100%
> xc: detail: delta 1ms, dom0 0%, target 0%, sent 5308Mb/s, dirtied 
> 5308Mb/s 162 pages
> xc: detail: Total pages sent= 131294 (0.99x)
> xc: detail: (of which 0 were fixups)
> xc: detail: All memory is saved
> xc: detail: Save exit rc=0
> libxl: error: libxl.c:900:validate_virtual_disk failed to stat 
> /dev/xen-data/testmig-root: No such file or directory
> cannot add disk 0 to domain: -6
> migration target: Domain creation failed (code -3).
> libxl: error: libxl_utils.c:408:libxl_read_exactly file/stream truncated 
> reading ready message from migration receiver stream
> libxl: info: libxl_exec.c:72:libxl_report_child_exitstatus migration 
> target process [13420] exited with error status 3
> Migration failed, resuming at sender.
> root@memoryana:~# xl console testmig
> PM: freeze of devices complete after 0.099 msecs
> PM: late freeze of devices complete after 0.025 msecs
> ------------[ cut here ]------------
> kernel BUG at drivers/xen/events.c:1466!
> invalid opcode: 0000 [#1] SMP
> CPU 0
> Modules linked in:
> 
> Pid: 6, comm: migration/0 Not tainted 3.0.4-xenU #6
> RIP: e030:[<ffffffff8140d574>]  [<ffffffff8140d574>] 
> xen_irq_resume+0x224/0x370
> RSP: e02b:ffff88001f9fbce0  EFLAGS: 00010082
> RAX: ffffffffffffffef RBX: 0000000000000000 RCX: 0000000000000000
> RDX: ffff88001f809ea8 RSI: ffff88001f9fbd00 RDI: 0000000000000001
> RBP: 0000000000000010 R08: ffffffff81859a00 R09: 0000000000000000
> R10: 0000000000000000 R11: 09f911029d74e35b R12: 0000000000000000
> R13: 000000000000f0a0 R14: 0000000000000000 R15: ffff88001f9fbd00
> FS:  00007f49f928b700(0000) GS:ffff88001fec6000(0000) knlGS:0000000000000000
> CS:  e033 DS: 0000 ES: 0000 CR0: 000000008005003b
> CR2: 00007f89fb1a89f0 CR3: 000000001e4cf000 CR4: 0000000000002660
> DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
> Process migration/0 (pid: 6, threadinfo ffff88001f9fa000, task 
> ffff88001f9f7170)
> Stack:
>   ffff88001f9fbd34 ffff88001f9fbd54 0000000000000003 000000000000f100
>   0000000000000000 0000000000000003 0000000000000000 0000000000000003
>   ffff88001fa6fdb0 ffffffff8140aa20 ffffffff81859a08 0000000000000000
> Call Trace:
>   [<ffffffff8140aa20>] ? gnttab_map+0x100/0x130
>   [<ffffffff815c2765>] ? _raw_spin_lock+0x5/0x10
>   [<ffffffff81083e01>] ? cpu_stopper_thread+0x101/0x190
>   [<ffffffff8140e1f5>] ? xen_suspend+0x75/0xa0
>   [<ffffffff81083f1b>] ? stop_machine_cpu_stop+0x8b/0xd0
>   [<ffffffff81083e90>] ? cpu_stopper_thread+0x190/0x190
>   [<ffffffff81083dd0>] ? cpu_stopper_thread+0xd0/0x190
>   [<ffffffff815c0870>] ? schedule+0x270/0x6c0
>   [<ffffffff81083d00>] ? copy_pid_ns+0x2a0/0x2a0
>   [<ffffffff81065846>] ? kthread+0x96/0xa0
>   [<ffffffff815c4024>] ? kernel_thread_helper+0x4/0x10
>   [<ffffffff815c3436>] ? int_ret_from_sys_call+0x7/0x1b
>   [<ffffffff815c2be1>] ? retint_restore_args+0x5/0x6
>   [<ffffffff815c4020>] ? gs_change+0x13/0x13
> Code: e8 f2 e9 ff ff 8b 44 24 10 44 89 e6 89 c7 e8 64 e8 ff ff ff c3 83 
> fb 04 0f 84 95 fe ff ff 4a 8b 14 f5 20 95 85 81 e9 68 ff ff ff <0f> 0b 
> eb fe 0f 0b eb fe 48 8b 1d fd 00 42 00 4c 8d 6c 24 20 eb
> RIP  [<ffffffff8140d574>] xen_irq_resume+0x224/0x370
>   RSP <ffff88001f9fbce0>
> ---[ end trace 67ddba38000aae42 ]---
> 
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 14 22:47:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 14 Oct 2011 22:47:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REx64-0006SX-8t; Fri, 14 Oct 2011 22:47:48 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REx4F-0005uw-4e
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 22:45:55 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1318657551!192956!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5207 invoked from network); 15 Oct 2011 05:45:51 -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;
	15 Oct 2011 05:45:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,350,1315180800"; 
   d="scan'208";a="8405499"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Oct 2011 05:45:51 +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;
	Sat, 15 Oct 2011 06:45:51 +0100
Subject: Re: [Xen-devel] XL: pv guests dont reboot after migration
	(xen-4.1.2-rc3) libc-2.11.2 segfault
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andreas Olsowski <andreas.olsowski@leuphana.de>
In-Reply-To: <4E98DB4D.6060900@leuphana.de>
References: <4E785FDD.40209@leuphana.de>
	<1316546621.5182.23.camel@dagon.hellion.org.uk>
	<4E7C37D6.7050109@leuphana.de>
	<1316764843.23371.103.camel@zakaz.uk.xensource.com>
	<4E7C4E45.5080509@leuphana.de>
	<20098.2654.689536.265060@mariner.uk.xensource.com>
	<4E98DB4D.6060900@leuphana.de>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Sat, 15 Oct 2011 06:45:50 +0100
Message-ID: <1318657550.11016.13.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Ian, "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Jackson <Ian.Jackson@eu.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 Sat, 2011-10-15 at 02:01 +0100, Andreas Olsowski wrote:

> pv guests dont reboot after migration,
> just when xl should reboot the machine syslog shows:
> 
> 
> Oct 15 02:46:32 netcatarina kernel: xl[14986]: segfault at 7f0ec70a3008 
> ip 00007f0ec7d517f9 sp 00007fff366cf100 error 4 in 
> libc-2.11.2.so[7f0ec7cdb000+158000]

Can you run under gdb and get a backtrace? Or perhaps core file is
dropped somewhere?

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 00:35:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 00:35:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REylx-0000Vk-P0; Sat, 15 Oct 2011 00:35:09 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REykj-0000HE-K0
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 00:33:54 -0700
X-Env-Sender: fbcyborg@gmail.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1318664029!35349466!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26924 invoked from network); 15 Oct 2011 07:33:50 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-7.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Oct 2011 07:33:50 -0000
Received: by vws13 with SMTP id 13so2619678vws.30
	for <xen-devel@lists.xensource.com>;
	Sat, 15 Oct 2011 00:33:49 -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
	:content-type; bh=5HSiy/FVARLpodNanzJqIlT3d0QMfYFHK7sciDhqHy4=;
	b=dhWAmCFh0fVIvvmeRSCo6COnd9DZVw2G4ESjMNiHRH4ZAubv8keZKWr0xMY3Oxbfxn
	+wJsXUpRrpyU6h6xbBhyuJmLTpuBAxKC6N75wMTS0YTGF3ChD/IworujUzkLVJaPnBtS
	jUEhF/9EVWDpFLu87Zn6AZfgTolvkQFS6/qTA=
Received: by 10.52.175.228 with SMTP id cd4mr11976656vdc.98.1318664029081;
	Sat, 15 Oct 2011 00:33:49 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.52.187.133 with HTTP; Sat, 15 Oct 2011 00:33:29 -0700 (PDT)
In-Reply-To: <CAP8Jb=o1j2=e85J_aCab=zr7hyxU5VHVtuFUOyNBkrki8eA2hQ@mail.gmail.com>
References: <CAP8Jb=rKu5RFW0tuvHtD819Dz6Jy2HB5OT-d86T1tEk2OP=dtA@mail.gmail.com>
	<CAP8Jb=pX3mq7vebZ+CKGyh-YM+QH0Vr+Fphaqug_bEgNGLafBg@mail.gmail.com>
	<1315907178.2892.7.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qfMa1c8w10inO_gt6-RCscaAsdQ_SyjTxfjSuTAfDMOw@mail.gmail.com>
	<1316001435.2892.24.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qrdraJ0c7CLEYEug2nQjxCTvokfGQB4CjNgaacON_DPg@mail.gmail.com>
	<1316007936.2892.35.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=rabtnD05T2ZQdkzw47ZkctYXMcEbrLPj_0LJHWyLegFw@mail.gmail.com>
	<1316009344.2892.38.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qm=kjU8cyCU+G9sht6NqeNyFK+R-P-41bkOiha1iGhYw@mail.gmail.com>
	<CAP8Jb=o1j2=e85J_aCab=zr7hyxU5VHVtuFUOyNBkrki8eA2hQ@mail.gmail.com>
From: Flavio <fbcyborg@gmail.com>
Date: Sat, 15 Oct 2011 09:33:29 +0200
Message-ID: <CAP8Jb=qTNoG7_YKDEpo9ichNjE+x50jtKmCh-a-Z=5PZ4676Sw@mail.gmail.com>
Subject: Re: [Xen-devel] Help with the migration to XEN-4.1 please
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-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,

Here again with a similar problem, when the xen_gntdev module is loaded:
Parsing config file /mnt/dati/xen/vmstore/gentoo-10.0/gentoo-10.0.x86-64.cfg
xenconsole: Could not read tty from store: No such file or directory
libxl: error: libxl_device.c:476:libxl__wait_for_device_model Device
Model not ready
xl: fatal error: libxl_create.c:535, rc=-1: libxl__confirm_device_model_startup

I don't know what happened but I've got that error starting the two linux domU
guest I have on my disk.

What has happened?

Flavio

On 14 September 2011 16:16, Flavio <fbcyborg@gmail.com> wrote:
> On 14 September 2011 16:09, Ian Campbell <Ian.Campbell@citrix.com> wrote:
>> On Wed, 2011-09-14 at 10:05 -0400, Flavio wrote:
>>
>>> xen be core: xen be core: can't open gnttab device
>>> can't open gnttab device
>>
>> This is probably the issue. You need /dev/xen/gntdev, I think you need
>> to enable CONFIG_XEN_GNTDEV.
> YESSSSSSSSSSSSS!
> Actually it was compiled as module but it wasn't running.
> Also the xen-gntalloc module is present but it is not running.
> Now, simply modprobing the xen-gntdev module, the vm has started, and
> the console is available!
> Only one problem now: the guest machine doesn't get any IP when dhcp runs.
>
>>
>>> > The file:/mnt/data/xen/vmstore/gentoo-10.0/gentoo-10.0.x86-64.img (and
>>> > the other one) is interesting.
>>> As you see I use loop files for the root filesystems.
>>
>> That's the thing -- you aren't, you are using img files.
> It was my mistake! I thought they were loop files too.
>
>> Under xend
>> these would be setup as loop devices for you but under xl you insteasd
>> get a userspace block backend (tap if it is available, qdisk from
>> qemu-d, if not).
> OK, now I understand.
>
> THANK YOU SO MUCH Ian.



-- 
Flavio

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 01:44:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 01:44:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1REzqx-0002L4-5u; Sat, 15 Oct 2011 01:44:23 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REzpv-000281-3I
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 01:43:20 -0700
X-Env-Sender: peterz@infradead.org
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318668195!21382102!1
X-Originating-IP: [85.118.1.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21976 invoked from network); 15 Oct 2011 08:43:16 -0000
Received: from casper.infradead.org (HELO casper.infradead.org) (85.118.1.10)
	by server-15.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Oct 2011 08:43:16 -0000
Received: from j77219.upc-j.chello.nl ([24.132.77.219] helo=twins)
	by casper.infradead.org with esmtpsa (Exim 4.76 #1 (Red Hat Linux))
	id 1REzpH-00077q-Vj; Sat, 15 Oct 2011 08:42:40 +0000
Received: by twins (Postfix, from userid 1000)
	id 55BB78142E02; Sat, 15 Oct 2011 10:42:38 +0200 (CEST)
From: Peter Zijlstra <peterz@infradead.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Sat, 15 Oct 2011 10:42:38 +0200
In-Reply-To: <4E98AEDD.4010503@goop.org>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<c133180533d7e520bb1e818e987117811a666fbc.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<1318502628.24856.10.camel@twins> <4E98AEDD.4010503@goop.org>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Mailer: Evolution 3.0.3- 
Message-ID: <1318668158.6594.0.camel@twins>
Mime-Version: 1.0
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>, Michael,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, "H. Peter
	Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 10/10] jump-label: initialize
 jump-label subsystem much 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 Fri, 2011-10-14 at 14:51 -0700, Jeremy Fitzhardinge wrote:
> How about this?  Proper comment and much earlier init.

Looks good to me, thanks!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 03:02:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 03:02:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF149-0004J2-Rr; Sat, 15 Oct 2011 03:02:05 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RF137-00044z-Kl
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 03:01:02 -0700
X-Env-Sender: davidtecher@yahoo.fr
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318672842!44358090!1
X-Originating-IP: [216.139.236.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25657 invoked from network); 15 Oct 2011 10:00:43 -0000
Received: from sam.nabble.com (HELO sam.nabble.com) (216.139.236.26)
	by server-13.tower-27.messagelabs.com with AES256-SHA encrypted SMTP;
	15 Oct 2011 10:00:43 -0000
Received: from [192.168.236.26] (helo=sam.nabble.com)
	by sam.nabble.com with esmtp (Exim 4.72)
	(envelope-from <davidtecher@yahoo.fr>) id 1RF132-0001FH-ES
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 03:00:56 -0700
Date: Sat, 15 Oct 2011 03:00:56 -0700 (PDT)
From: David TECHER <davidtecher@yahoo.fr>
To: xen-devel@lists.xensource.com
Message-ID: <1318672856439-4904945.post@n5.nabble.com>
In-Reply-To: <20110923172115.GI12984@reaktio.net>
References: <1316616001843-4826614.post@n5.nabble.com>
	<1316616472579-4826635.post@n5.nabble.com>
	<1316616757871-4826655.post@n5.nabble.com>
	<1316618006.67296.YahooMailNeo@web29818.mail.ird.yahoo.com>
	<1316693722029-4829929.post@n5.nabble.com>
	<20110922182705.GE12984@reaktio.net>
	<1316728444821-4831624.post@n5.nabble.com>
	<1316777654598-4833174.post@n5.nabble.com>
	<1316786412428-4833637.post@n5.nabble.com>
	<20110923172115.GI12984@reaktio.net>
Subject: Re: Re : Re : Re : Re : [Xen-devel] Re: Patches for VGA-Passthrough
	XEN 4.2 unstable
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
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

Hi

Finally I succeeded to use my graphic card EVGA GTX 460 SE 1024M with Xen
4.2 unstable.

Before I was using my MSI GT 440.

Kernel ---> 3.1.0-rc9 downloaded from
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=summary


My kernel's config is attached to this mail.

About Xen:

Download Xen

hg clone -r 23965 http://xenbits.xensource.com/staging/xen-unstable.hg/
xen-unstable.hg-rev-23965-ok

Make a first init build for tools

cd xen-unstable.hg-rev-23965-ok/tools
make -j4
make clean
cd ..

Apply the patches attached to this mail (patch -p0 < ....)

Copy the VGA BIOS extracted using nvlfash 5.100

cp /path/to/VGABIOS.ROM tools/firmware/vgabios/vgabios-pt.bin

Compil again

make -j4 tools

Install

make -j4 install-tools PYTHON_PREFIX_ARG= 

Since my old domU XP 64 bits was using GT 440, I replaced my old graphic
card with the EVGA GTX 460 SE.

Everything was OK (except that it is impossible to restart the domU withtout
restarting the dom0 as usual)

About dsdt.asl.patch file
=========================

For your information concerning the patch for dsd (I've already give the
informations in an other mail but I will give it again)

Get the identifier for your graphic card
root@mercury:/opt/tmp/gfx_patchs_gtx-460-se-evga# lspci |grep VGA
01:00.0 VGA compatible controller: nVidia Corporation Device 0e23 (rev a1)

Use dmesg to get the required ranges
root@mercury:/opt/tmp/gfx_patchs_gtx-460-se-evga# dmesg | grep 01:00.0 |
grep BAR
[    2.481779] pci 0000:01:00.0: BAR 0: reserving [mem 0xf8000000-0xf9ffffff
flags 0x40200] (d=0, p=0)
[    2.481782] pci 0000:01:00.0: BAR 1: reserving [mem 0xd0000000-0xd7ffffff
flags 0x14220c] (d=0, p=0)
[    2.481784] pci 0000:01:00.0: BAR 3: reserving [mem 0xd8000000-0xdbffffff
flags 0x14220c] (d=0, p=0)
[    2.481787] pci 0000:01:00.0: BAR 5: reserving [io  0xe000-0xe07f flags
0x40101] (d=0, p=0)


The 3 ranges [0xf8000000-0xf9fffff], [0xd0000000-0xd7ffffff],
[0xd8000000-0xdbfffff] need to be specify in dsdt.asl.patch

Moreover you need to use the formula

Maximum - Minimum + 1 for the difference.

As a example: for the first range [0xf8000000-0xf9fffff]

Maximum = (0xf9fffff) / Minimum = 0xf8000000 => Difference = 4194303999 -
4160749568 + 1 = 33554432 => hexadecimal = 0x02000000

That the reason why that in the patch, there are

+                        0xF8000000,
+                        0xF9FFFFFF,
                         0x00000000,
-                        0x05000000,
-                        ,, _Y01)
+                        0x02000000)

Do the same for the others ranges

Hope this help.

I do not make test for Windows 7.  I do not plan to try.

David








http://xen.1045712.n5.nabble.com/file/n4904945/config-3.1.0-rc9
config-3.1.0-rc9 
http://xen.1045712.n5.nabble.com/file/n4904945/dsdt.asl.patch dsdt.asl.patch 
http://xen.1045712.n5.nabble.com/file/n4904945/hvmloader.c.patch
hvmloader.c.patch 
http://xen.1045712.n5.nabble.com/file/n4904945/Makefile.patch Makefile.patch 
http://xen.1045712.n5.nabble.com/file/n4904945/pass-through.c.patch
pass-through.c.patch 
http://xen.1045712.n5.nabble.com/file/n4904945/pci.c.patch pci.c.patch 

--
View this message in context: http://xen.1045712.n5.nabble.com/Patches-for-VGA-Passthrough-XEN-4-2-unstable-tp4406265p4904945.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 Sat Oct 15 03:08:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 03:08:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF1A8-0004mm-26; Sat, 15 Oct 2011 03:08:16 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RF19K-0004Ze-PE
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 03:07:27 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318673227!44358392!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2871 invoked from network); 15 Oct 2011 10:07:08 -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;
	15 Oct 2011 10:07:08 -0000
Received: by vws13 with SMTP id 13so2673863vws.30
	for <xen-devel@lists.xensource.com>;
	Sat, 15 Oct 2011 03:07:22 -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=HUqBaSWCOGheK/7L9HRq4amMWF3flScvvrq5Iad6I6E=;
	b=lahznSZ73AHLNB/d16CCzgfzk8a4CXQt4owmebZJ5ISR0aa/eipy+OKC/Eemg17Ywy
	HnTUWezjkWgBskZG3MkI1kDjl1mISX2bDD0pyGNrbosWxDBrqg+Ed5NOHrnzrDnAWtH/
	Lmrb/ZTVKmTwA2hyrB56Ko4dKl0Bv7+OFpkG0=
MIME-Version: 1.0
Received: by 10.52.184.106 with SMTP id et10mr12785578vdc.107.1318673242329;
	Sat, 15 Oct 2011 03:07:22 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Sat, 15 Oct 2011 03:07:22 -0700 (PDT)
In-Reply-To: <20111013181543.GF15499@phenom.oracle.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
Date: Sat, 15 Oct 2011 11:07:22 +0100
X-Google-Sender-Auth: oCa0B1gYLVeimoFXPOZM_18R7V4
Message-ID: <CAE1-PRfGTxeQ59jmHfB6bKKk2+B5bNnKhAvXoV-5P__+nkhgKQ@mail.gmail.com>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Andy Burns <xen.lists@burns.me.uk>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
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 13 October 2011 19:15, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wr=
ote:

> On Wed, Oct 12, 2011 at 10:36:12PM +0100, Andy Burns wrote:
>
>> I discovered that the PCI tuners don't work in dom0 under Xen,
>> they only work if the dom0 is booted =A0as baremetal.
>
> That would imply it is not the PCI passthrough code (good!).
> It is something related to the driver

I've been having a go at getting the card running in dom0 rather than
domU, no more success yet.

I've stopped using the PCI resource realignment for now, and enabled
debugging knobs in the tuner modules, seems the I2C transfers used to
program the tuner and receive status bits back from it are working OK,
I can see the driver queueing up DMA using a succession of transfer
buffers, and apparently interrupts signalling their completion.

Presume it's correct that within the dom0, the buffers should *NOT* be
within the SWIOTLB range?

# dmesg | grep ffff8800

[    0.000000] found SMP MP-table at [ffff8800000ff780] ff780
[    0.000000] Base memory trampoline at [ffff880000097000] 97000 size 2048=
0
[    0.000000] PERCPU: Embedded 27 pages/cpu @ffff88001fe43000 s81024
r8192 d21376 u110592
[    0.000000] Placing 64MB software IO TLB between ffff880015c00000 -
ffff880019c00000

... snip ...

[ 1539.146723] saa7130[0]/ts: buffer_activate [ffff88000c25ca00]
[ 1539.146726] saa7130[0]/ts: - [top]     buf=3Dffff88000c25ca00
next=3Dffff88000959c800
[ 1539.146737] saa7130[0]/core: buffer_next #2
prev=3Dffff8800041f8440/next=3Dffff88000959c840
[ 1539.146790] saa7130[0]/core: buffer_queue ffff88000c25c000
[ 1539.154693] saa7130[0]/core: buffer_finish ffff88000c25ca00
[ 1539.154698] saa7130[0]/core: buffer_next ffff88000959c800
[prev=3Dffff88000c25c040/next=3Dffff88000959c840]
[ 1539.154702] saa7130[0]/ts: buffer_activate [ffff88000959c800]
[ 1539.154705] saa7130[0]/ts: - [bottom]  buf=3Dffff88000959c800
next=3Dffff88000959c600
[ 1539.154716] saa7130[0]/core: buffer_next #2
prev=3Dffff88000c25c040/next=3Dffff88000959c640
[ 1540.156114] saa7130[0]/core: timeout on ffff88000959c800
[ 1540.156118] saa7130[0]/core: buffer_finish ffff88000959c800

I assume no meaningful transport stream contents are contained in the
buffers following the transfers, as no stations are found.

Hypervisor, dom0 (and domU when I was using it) are all 64bit, the
tuner device is 32bit, is this likely to be an issue with DMA
transfers? Any extra logging for Xen?

09:00.0 Multimedia controller: Philips Semiconductors SAA7130 Video
Broadcast Decoder (rev 01)
        Subsystem: Compro Technology, Inc. Videomate DVB-T200
        Flags: bus master, medium devsel, latency 64, IRQ 16
        Memory at febffc00 (32-bit, non-prefetchable) [size=3D1K]
        Capabilities: [40] Power Management version 1
        Kernel driver in use: saa7134
        Kernel modules: saa7134

09:01.0 Multimedia controller: Philips Semiconductors SAA7130 Video
Broadcast Decoder (rev 01)
        Subsystem: Compro Technology, Inc. Videomate DVB-T200
        Flags: bus master, medium devsel, latency 64, IRQ 17
        Memory at febff800 (32-bit, non-prefetchable) [size=3D1K]
        Capabilities: [40] Power Management version 1
        Kernel driver in use: saa7134
        Kernel modules: saa7134

> Perhaps it is the VM_IO bug that sometimes creeps up..

Any pointers to previous cases of that bug, or the methods to discover it?

> I saw something about I2C, is there a knob in the driver to _not_ use I2C=
?

Not for my tuner, I've added modprobe options to blacklist devices
that I don't need and turn on debugging for the tuner modules

# cat /etc/modprobe.d/dvb.conf

blacklist ds3000
blacklist dvb_usb_dw2102
blacklist firewire_ehci
blacklist firewire_ohci
options saa7134 disable_ir=3D1 video_debug=3D1 ts_debug=3D1 i2c_debug=3D1
i2c_scan=3D1 irq_debug=3D1 core_debug=3D1 gpio_tracking=3D1
options saa7134-dvb debug=3D1
options tda1004x debug=3D1

# lsmod
Module                  Size  Used by
lockd                  70080  0
bridge                 72368  0
stp                     1927  1 bridge
llc                     4738  2 bridge,stp
ip6t_REJECT             3992  2
nf_conntrack_ipv6       7730  2
nf_defrag_ipv6          9083  1 nf_conntrack_ipv6
xt_state                1306  2
nf_conntrack           67597  2 nf_conntrack_ipv6,xt_state
ip6table_filter         1655  1
ip6_tables             16792  1 ip6table_filter
snd_hda_codec_realtek   312621  1
raid456                54497  1
async_raid6_recov       5358  1 raid456
async_pq                4339  2 raid456,async_raid6_recov
raid6_pq               78299  2 async_raid6_recov,async_pq
async_xor               3255  3 raid456,async_raid6_recov,async_pq
xor                     4793  1 async_xor
async_memcpy            1845  2 raid456,async_raid6_recov
async_tx                2702  5
raid456,async_raid6_recov,async_pq,async_xor,async_memcpy
tda1004x               14722  2
snd_hda_intel          24072  0
snd_hda_codec          85181  2 snd_hda_codec_realtek,snd_hda_intel
snd_hwdep               6264  1 snd_hda_codec
saa7134_dvb            27032  0
videobuf_dvb            5146  1 saa7134_dvb
dvb_core               87211  1 videobuf_dvb
snd_seq                52186  0
snd_seq_device          5941  1 snd_seq
iTCO_wdt               12024  0
snd_pcm                78514  2 snd_hda_intel,snd_hda_codec
saa7134               159679  1 saa7134_dvb
rc_core                17136  1 saa7134
videobuf_dma_sg         8462  2 saa7134_dvb,saa7134
videobuf_core          15780  3 videobuf_dvb,saa7134,videobuf_dma_sg
v4l2_common             6905  1 saa7134
videodev               78689  2 saa7134,v4l2_common
media                  11511  1 videodev
v4l2_compat_ioctl32     7665  1 videodev
shpchp                 24554  0
i2c_i801                9237  0
serio_raw               4298  0
iTCO_vendor_support     2578  1 iTCO_wdt
sky2                   42923  0
snd_timer              19372  2 snd_seq,snd_pcm
snd                    63124  8
snd_hda_codec_realtek,snd_hda_intel,snd_hda_codec,snd_hwdep,snd_seq,snd_seq=
_device,snd_pcm,snd_timer
soundcore               6267  1 snd
snd_page_alloc          7311  2 snd_hda_intel,snd_pcm
tveeprom               13045  1 saa7134
asus_atk0110           12395  0
x38_edac                3159  0
edac_core              40154  2 x38_edac
xen_netback            23987  0 [permanent]
xen_blkback            17924  0 [permanent]
xen_gntdev              9019  0
xen_evtchn              5032  1
sunrpc                200831  2 lockd
xenfs                   9621  1
raid1                  22676  2
ata_generic             3587  0
uas                     7775  0
pata_acpi               3419  0
usb_storage            46027  0
sata_mv                24941  8
pata_marvell            3240  0
radeon                690803  1
ttm                    54997  1 radeon
drm_kms_helper         26490  1 radeon
drm                   194532  3 radeon,ttm,drm_kms_helper
i2c_algo_bit            4958  1 radeon
i2c_core               25728  11
tda1004x,saa7134_dvb,saa7134,v4l2_common,videodev,i2c_i801,tveeprom,radeon,=
drm_kms_helper,drm,i2c_algo_bit
[root@xen ~]# lsmod|more
Module                  Size  Used by
lockd                  70080  0
bridge                 72368  0
stp                     1927  1 bridge
llc                     4738  2 bridge,stp
ip6t_REJECT             3992  2
nf_conntrack_ipv6       7730  2
nf_defrag_ipv6          9083  1 nf_conntrack_ipv6
xt_state                1306  2
nf_conntrack           67597  2 nf_conntrack_ipv6,xt_state
ip6table_filter         1655  1
ip6_tables             16792  1 ip6table_filter
snd_hda_codec_realtek   312621  1
raid456                54497  1
async_raid6_recov       5358  1 raid456
async_pq                4339  2 raid456,async_raid6_recov
raid6_pq               78299  2 async_raid6_recov,async_pq
async_xor               3255  3 raid456,async_raid6_recov,async_pq
xor                     4793  1 async_xor
async_memcpy            1845  2 raid456,async_raid6_recov
async_tx                2702  5
raid456,async_raid6_recov,async_pq,async_xor,async_memcpy
tda1004x               14722  2
snd_hda_intel          24072  0
snd_hda_codec          85181  2 snd_hda_codec_realtek,snd_hda_intel
snd_hwdep               6264  1 snd_hda_codec
saa7134_dvb            27032  0
videobuf_dvb            5146  1 saa7134_dvb
dvb_core               87211  1 videobuf_dvb
snd_seq                52186  0
snd_seq_device          5941  1 snd_seq
iTCO_wdt               12024  0
snd_pcm                78514  2 snd_hda_intel,snd_hda_codec
saa7134               159679  1 saa7134_dvb
rc_core                17136  1 saa7134
videobuf_dma_sg         8462  2 saa7134_dvb,saa7134
videobuf_core          15780  3 videobuf_dvb,saa7134,videobuf_dma_sg
v4l2_common             6905  1 saa7134
videodev               78689  2 saa7134,v4l2_common
media                  11511  1 videodev
v4l2_compat_ioctl32     7665  1 videodev
shpchp                 24554  0
i2c_i801                9237  0
serio_raw               4298  0
iTCO_vendor_support     2578  1 iTCO_wdt
sky2                   42923  0
snd_timer              19372  2 snd_seq,snd_pcm
snd                    63124  8
snd_hda_codec_realtek,snd_hda_intel,snd_hda_codec,snd_hwdep,snd_seq,snd_seq=
_device,snd_pcm,snd_timer
soundcore               6267  1 snd
snd_page_alloc          7311  2 snd_hda_intel,snd_pcm
tveeprom               13045  1 saa7134
asus_atk0110           12395  0
x38_edac                3159  0
edac_core              40154  2 x38_edac
xen_netback            23987  0 [permanent]
xen_blkback            17924  0 [permanent]
xen_gntdev              9019  0
xen_evtchn              5032  1
sunrpc                200831  2 lockd
xenfs                   9621  1
raid1                  22676  2
ata_generic             3587  0
uas                     7775  0
pata_acpi               3419  0
usb_storage            46027  0
sata_mv                24941  8
pata_marvell            3240  0
radeon                690803  1
ttm                    54997  1 radeon
drm_kms_helper         26490  1 radeon
drm                   194532  3 radeon,ttm,drm_kms_helper
i2c_algo_bit            4958  1 radeon
i2c_core               25728  11
tda1004x,saa7134_dvb,saa7134,v4l2_common,videodev,i2c_i801,tveeprom,radeon,=
drm_kms_helper,drm,i2c_algo_bit

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 03:36:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 03:36:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF1bd-0005do-DA; Sat, 15 Oct 2011 03:36:41 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RF1at-0005Qz-Lv
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 03:35:55 -0700
X-Env-Sender: andreas.olsowski@leuphana.de
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318674924!42013286!1
X-Originating-IP: [193.174.46.71]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6597 invoked from network); 15 Oct 2011 10:35:24 -0000
Received: from mailhost.leuphana.de (HELO leuphana.de) (193.174.46.71)
	by server-3.tower-27.messagelabs.com with SMTP;
	15 Oct 2011 10:35:24 -0000
Received: from [195.37.28.33] (account aolsowsk@leuphana.de [195.37.28.33]
	verified) by leuphana.de (CommuniGate Pro SMTP 5.4.1e)
	with ESMTPSA id 45817975; Sat, 15 Oct 2011 12:35:52 +0200
Message-ID: <4E996206.4050500@leuphana.de>
Date: Sat, 15 Oct 2011 12:35:50 +0200
From: Andreas Olsowski <andreas.olsowski@leuphana.de>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.21) Gecko/20110831 Icedove/3.1.13
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] pv guests die after failed migration
References: <4E786015.80603@leuphana.de>	<1316546879.5182.26.camel@dagon.hellion.org.uk>	<4E7C37BD.2000706@leuphana.de>	<1316764045.23371.100.camel@zakaz.uk.xensource.com>	<4E7C4E44.70508@leuphana.de>	<1317225159.26672.87.camel@zakaz.uk.xensource.com>	<4E98DF51.9070907@leuphana.de>
	<1318657499.11016.12.camel@dagon.hellion.org.uk>
In-Reply-To: <1318657499.11016.12.camel@dagon.hellion.org.uk>
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 10/15/2011 07:44 AM, Ian Campbell wrote:
> On Sat, 2011-10-15 at 02:18 +0100, Andreas Olsowski wrote:
>> It seems this still has not made it into 4.1-testing.
>
> I'm afraid I've not had time to "figure out how to automatically select
> which guests are capable of a cooperative resume and which are not." so
> it hasn't been fixed in xen-unstable either AFAIK.
>
Wouldnt just assuming all of them do fix a bigger percentage of systems 
than leaving it the way it is?

> I'm also still interested in confirmation to the question I asked in the
> mail you just replied to.
>

Oh, i thought i allready did.

 > Are you saying that you don't see the "failed for domain %u" message
 > immediately after the xc_domain_resume call?
 >
 > +    if (xc_domain_resume(ctx->xch, domid, 1)) {
 >            LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
 >                            "xc_domain_resume failed for domain %u",
 >                            domid);
 >
 > That would be pretty odd...

Yes that is what i am saying:

root@memoryana:/var/log/xen# cat xl-testmig.log
Waiting for domain testmig (domid 2) to die [pid 13349]
Domain 2 is dead
Done. Exiting now

-- 
Andreas

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 03:38:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 03:38:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF1dC-00068U-Sy; Sat, 15 Oct 2011 03:38:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RF1bK-0005Xy-1o
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 03:36:22 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318674978!1143442!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31838 invoked from network); 15 Oct 2011 10:36:18 -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;
	15 Oct 2011 10:36:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,350,1315180800"; 
   d="scan'208";a="8406612"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Oct 2011 10:36: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;
	Sat, 15 Oct 2011 11:36:17 +0100
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andy Burns <xen.lists@burns.me.uk>
In-Reply-To: <CAE1-PRfGTxeQ59jmHfB6bKKk2+B5bNnKhAvXoV-5P__+nkhgKQ@mail.gmail.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
	<CAE1-PRfGTxeQ59jmHfB6bKKk2+B5bNnKhAvXoV-5P__+nkhgKQ@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Sat, 15 Oct 2011 11:36:16 +0100
Message-ID: <1318674976.11016.24.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>,
	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 Sat, 2011-10-15 at 11:07 +0100, Andy Burns wrote:
> On 13 October 2011 19:15, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> 
> > On Wed, Oct 12, 2011 at 10:36:12PM +0100, Andy Burns wrote:
> >
> >> I discovered that the PCI tuners don't work in dom0 under Xen,
> >> they only work if the dom0 is booted  as baremetal.
> >
> > That would imply it is not the PCI passthrough code (good!).
> > It is something related to the driver
> 
> I've been having a go at getting the card running in dom0 rather than
> domU, no more success yet.
> 
> I've stopped using the PCI resource realignment for now, and enabled
> debugging knobs in the tuner modules, seems the I2C transfers used to
> program the tuner and receive status bits back from it are working OK,
> I can see the driver queueing up DMA using a succession of transfer
> buffers, and apparently interrupts signalling their completion.
> 
> Presume it's correct that within the dom0, the buffers should *NOT* be
> within the SWIOTLB range?

In general if a driver is correctly using the DMA API things should
never be within the swiotlb.

[...]
> Hypervisor, dom0 (and domU when I was using it) are all 64bit, the
> tuner device is 32bit, is this likely to be an issue with DMA
> transfers? Any extra logging for Xen?

I think you've got 8G of RAM so one thing which might be worth trying is
to give "mem=2G" (or perhaps 3G) on the hypervisor command line. That
ought to rule out addresses which are too high. (just a datapoint, not a
solution)

I wonder if the hypervisor's "dma_bits" option has any relevance here?
Might be worth a go?

For a domU (but not dom0, AFAICT) you can limit the machine addresses
allocated to a guest using "machine_address_size" in the cfg file. Only
seems to be supported by xend and not xl at the moment. That might be
another worthwhile experiment.

> > I saw something about I2C, is there a knob in the driver to _not_ use I2C?
> 
> Not for my tuner

In general I think these sorts cards use I2C extensively, i.e. the tuner
etc is on an i2c bus, so I wouldn't expect anything to work at all
without it.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 03:47:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 03:47:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF1mP-0006ft-24; Sat, 15 Oct 2011 03:47:49 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RF1lt-0006U8-3l
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 03:47:17 -0700
X-Env-Sender: andreas.olsowski@leuphana.de
X-Msg-Ref: server-14.tower-182.messagelabs.com!1318675633!22249331!1
X-Originating-IP: [193.174.46.71]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2317 invoked from network); 15 Oct 2011 10:47:13 -0000
Received: from mailhost.leuphana.de (HELO leuphana.de) (193.174.46.71)
	by server-14.tower-182.messagelabs.com with SMTP;
	15 Oct 2011 10:47:13 -0000
Received: from [195.37.28.33] (account aolsowsk@leuphana.de [195.37.28.33]
	verified) by leuphana.de (CommuniGate Pro SMTP 5.4.1e)
	with ESMTPSA id 45818122; Sat, 15 Oct 2011 12:47:14 +0200
Message-ID: <4E9964B0.6000001@leuphana.de>
Date: Sat, 15 Oct 2011 12:47:12 +0200
From: Andreas Olsowski <andreas.olsowski@leuphana.de>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.21) Gecko/20110831 Icedove/3.1.13
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] XL: pv guests dont reboot after migration
	(xen-4.1.2-rc3) libc-2.11.2 segfault
References: <4E785FDD.40209@leuphana.de>	
	<1316546621.5182.23.camel@dagon.hellion.org.uk>	
	<4E7C37D6.7050109@leuphana.de>	
	<1316764843.23371.103.camel@zakaz.uk.xensource.com>	
	<4E7C4E45.5080509@leuphana.de>	
	<20098.2654.689536.265060@mariner.uk.xensource.com>	
	<4E98DB4D.6060900@leuphana.de>
	<1318657550.11016.13.camel@dagon.hellion.org.uk>
In-Reply-To: <1318657550.11016.13.camel@dagon.hellion.org.uk>
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.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>
Content-Type: multipart/mixed; boundary="===============0843557967=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a cryptographically signed message in MIME format.

--===============0843557967==
Content-Type: multipart/signed; protocol="application/pkcs7-signature";
	micalg=sha1; boundary="------------ms070405060302000406040005"

This is a cryptographically signed message in MIME format.

--------------ms070405060302000406040005
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable

On 10/15/2011 07:45 AM, Ian Campbell wrote:
> On Sat, 2011-10-15 at 02:01 +0100, Andreas Olsowski wrote:
>
>> pv guests dont reboot after migration,
>> just when xl should reboot the machine syslog shows:
>>
>>
>> Oct 15 02:46:32 netcatarina kernel: xl[14986]: segfault at 7f0ec70a300=
8
>> ip 00007f0ec7d517f9 sp 00007fff366cf100 error 4 in
>> libc-2.11.2.so[7f0ec7cdb000+158000]
>
> Can you run under gdb and get a backtrace? Or perhaps core file is
> dropped somewhere?
How? xl migrate-receive is not started by hand. Can you point me to the=20
location within the code that calls it so i can put a "gdb" infront of it=
?


 > Or perhaps core file is dropped somewhere?
Wouldnt i have to run a debugging enabled build of xen for that?

I found this in the log dir:


root@netcatarina:/var/log/xen# cat xl-testmig--incoming.log
Waiting for domain testmig--incoming (domid 67) to die [pid 3429]
Domain 67 is dead
Action for shutdown reason code 1 is restart
Domain 67 needs to be cleaned up: destroying the domain
Done. Rebooting now
xc: error: 0-length read: Internal error
xc: error: read_exact_timed failed (read rc: 0, errno: 0): Internal error=

xc: error: read: p2m_size (0 =3D Success): Internal error




--=20
Andreas


--------------ms070405060302000406040005
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIU3TCC
BCEwggMJoAMCAQICAgDHMA0GCSqGSIb3DQEBBQUAMHExCzAJBgNVBAYTAkRFMRwwGgYDVQQK
ExNEZXV0c2NoZSBUZWxla29tIEFHMR8wHQYDVQQLExZULVRlbGVTZWMgVHJ1c3QgQ2VudGVy
MSMwIQYDVQQDExpEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMjAeFw0wNjEyMTkxMDI5MDBa
Fw0xOTA2MzAyMzU5MDBaMFoxCzAJBgNVBAYTAkRFMRMwEQYDVQQKEwpERk4tVmVyZWluMRAw
DgYDVQQLEwdERk4tUEtJMSQwIgYDVQQDExtERk4tVmVyZWluIFBDQSBHbG9iYWwgLSBHMDEw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDpm8NnhfkNrvWNVMOWUDU9YuluTO2U
1wBblSJ01CDrNI/W7MAxBAuZgeKmFNJSoCgjhIt0iQReW+DieMF4yxbLKDU5ey2QRdDtoAB6
fL9KDhsAw4bpXCsxEXsM84IkQ4wcOItqaACa7txPeKvSxhObdq3u3ibo7wGvdA/BCaL2a869
080UME/15eOkyGKbghoDJzANAmVgTe3RCSMqljVYJ9N2xnG2kB3E7f81hn1vM7PbD8URwoqD
oZRdQWvY0hD1TP3KUazZve+Sg7va64sWVlZDz+HVEz2mHycwzUlU28kTNJpxdcVs6qcLmPkh
nSevPqM5OUhqjK3JmfvDEvK9AgMBAAGjgdkwgdYwcAYDVR0fBGkwZzBloGOgYYZfaHR0cDov
L3BraS50ZWxlc2VjLmRlL2NnaS1iaW4vc2VydmljZS9hZl9Eb3dubG9hZEFSTC5jcmw/LWNy
bF9mb3JtYXQ9WF81MDkmLWlzc3Vlcj1EVF9ST09UX0NBXzIwHQYDVR0OBBYEFEm3xs/oPR9/
6kR7Eyn38QpwPt5kMB8GA1UdIwQYMBaAFDHDeRu69VPXF+CJei0XbAqzK50zMA4GA1UdDwEB
/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMA0GCSqGSIb3DQEBBQUAA4IBAQA74Vp3wEgX
3KkY7IGvWonwvSiSpspZGBJw7Cjy565/lizn8l0ZMfYTK3S9vYCyufdnyTmieTvhERHua3iR
M347XyYndVNljjNj7s9zw7CSI0khUHUjoR8Y4pSFPT8z6XcgjaK95qGFKUD2P3MyWA0Ja6ba
hWzAP7uNZmRWJE6uDT8yNQFb6YyC2XJZT7GGhfF0hVblw/hc843uR7NTBXDn5U2KaYMo4RMJ
hp5eyOpYHgwf+aTUWgRo/Sg+iwK2WLX2oSw3VwBnqyNojWOl75lrXP1LVvarQIc01BGSbOyH
xQoLBzNytG8MHVQs2FHHzL8w00Ny8TK/jM5JY6gA9/IcMIIFXjCCBEagAwIBAgIEC8pR1jAN
BgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJERTETMBEGA1UEChMKREZOLVZlcmVpbjEQMA4G
A1UECxMHREZOLVBLSTEkMCIGA1UEAxMbREZOLVZlcmVpbiBQQ0EgR2xvYmFsIC0gRzAxMB4X
DTA4MDIwNzA5NTAwMFoXDTE5MDYzMDAwMDAwMFowgdMxCzAJBgNVBAYTAkRFMRYwFAYDVQQI
Ew1OaWVkZXJzYWNoc2VuMRIwEAYDVQQHEwlMdWVuZWJ1cmcxKDAmBgNVBAoTH0xldXBoYW5h
IFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcxIjAgBgNVBAsTGVJlY2hlbi0gdW5kIE1lZGllbnpl
bnRydW0xKzApBgNVBAMTIkxldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcgQ0ExHTAb
BgkqhkiG9w0BCQEWDmNhQGxldXBoYW5hLmRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAqJ+JpHih32+icKiQ2IkbhmFLjAcnK0vrnyOKbn7+1xywhvL3zkraqhQlrqEltTDy
711vIEadOVfhIx8xZYYJ/zg1OCwKUxNbIbjcsIFiOKNbWxI3/yMOsaZpXsCLW7GfHLlLADW1
Cv2gUAdnjJUATcUF3a25Bgr9Lbv+GI+3bY9ydMkGnhFYSL96LLqLxAXzGXL/MAM5t/xK8cc8
+6+mWxHAqO+85Jn+UvS1khVTtZfACrYZKFnAsVHOMM/WRugohq4ue6Jfp65exMM7HKWNPrKn
UV0hotcInKFBYywcZrIa2r/6m63nOxl1gHrewxiFWEBvpgMkQ+a7PHhXsMkPdQIDAQABo4IB
sDCCAawwEgYDVR0TAQH/BAgwBgEB/wIBATALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPThaBk7
GUPHATbRNGKW8/UDoQeMMB8GA1UdIwQYMBaAFEm3xs/oPR9/6kR7Eyn38QpwPt5kMBkGA1Ud
EQQSMBCBDmNhQGxldXBoYW5hLmRlMIGIBgNVHR8EgYAwfjA9oDugOYY3aHR0cDovL2NkcDEu
cGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDA9oDugOYY3aHR0
cDovL2NkcDIucGNhLmRmbi5kZS9nbG9iYWwtcm9vdC1jYS9wdWIvY3JsL2NhY3JsLmNybDCB
ogYIKwYBBQUHAQEEgZUwgZIwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jZHAxLnBjYS5kZm4uZGUv
Z2xvYmFsLXJvb3QtY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEcGCCsGAQUFBzAChjtodHRw
Oi8vY2RwMi5wY2EuZGZuLmRlL2dsb2JhbC1yb290LWNhL3B1Yi9jYWNlcnQvY2FjZXJ0LmNy
dDANBgkqhkiG9w0BAQUFAAOCAQEAmSFLUEnTM1zmNRfF4TTDRB53iHmBY0OYTlaPJvXXy4f7
jc1Dpz00HiVyFohY9gqo+jbIAm5avSCmhbL9glEWubE/BNZz9l9lyTCMMxFES0TCiC6W86Ev
o9E4C5IEqxZAOlvRyM3w3u8ItBO9cG190/XMi1Ouk3iBfwRVvFINy9Favq+/8HWFwkFrphpy
6JR90AbbjtE7b7owcMxusgFtPi8A1uyc3cpR21f51K7qgmGbsyXso+U9c/8Fak0IM0qQTN7p
GPmI1lfJ0x1r/QusHVYSFojAT2vQamfGeCNVELg/gH4tlTGkDbHW5QhInkASQv4obBYewNfR
rLG4wgPz5TCCBacwggSPoAMCAQICBBDuKTAwDQYJKoZIhvcNAQEFBQAwgdMxCzAJBgNVBAYT
AkRFMRYwFAYDVQQIEw1OaWVkZXJzYWNoc2VuMRIwEAYDVQQHEwlMdWVuZWJ1cmcxKDAmBgNV
BAoTH0xldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcxIjAgBgNVBAsTGVJlY2hlbi0g
dW5kIE1lZGllbnplbnRydW0xKzApBgNVBAMTIkxldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVu
ZWJ1cmcgQ0ExHTAbBgkqhkiG9w0BCQEWDmNhQGxldXBoYW5hLmRlMB4XDTEwMTEwMTExNTky
OVoXDTEzMTAzMTExNTkyOVowajELMAkGA1UEBhMCREUxKDAmBgNVBAoTH0xldXBoYW5hIFVu
aXZlcnNpdGFldCBMdWVuZWJ1cmcxFjAUBgNVBAsTDVJlY2hlbnplbnRydW0xGTAXBgNVBAMT
EEFuZHJlYXMgT2xzb3dza2kwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBzfnZ
7pbsecrmresa6JNTMmgoBFpwyr7k7U5O+j7QlFvMlePF/Tz7TeULaEevf7H68IiA/6oGZQvg
NReD/64PYXxbKfsJydY6W1K+jq2karofhW5bk5p210DEQv4qyV6M+aJRKxW0Hp32OeLk5QUH
9T2780PELXGn222r+NCSmBKLP0MHsUa6CFI+jRqztB60v+wc9TD6crMEB37ddckq7mS3QWk1
m2/68bmCsHWRLTpWn9hT4S8eBSL/3YLR9DF8kfWl0wEgy8/tJY1nz5IlSI3S2v1ys7rwXBAp
YHRpeHM/WNNNV4kiH09g2vlxFebQN0xTyoO1+PX6iPeAh0NbAgMBAAGjggHpMIIB5TAJBgNV
HRMEAjAAMAsGA1UdDwQEAwIF4DApBgNVHSUEIjAgBggrBgEFBQcDAgYIKwYBBQUHAwQGCisG
AQQBgjcUAgIwHQYDVR0OBBYEFMrca499fLnPczMLjRm2Nck06YCyMB8GA1UdIwQYMBaAFPTh
aBk7GUPHATbRNGKW8/UDoQeMMCcGA1UdEQQgMB6BHGFuZHJlYXMub2xzb3dza2lAbGV1cGhh
bmEuZGUwgY0GA1UdHwSBhTCBgjA/oD2gO4Y5aHR0cDovL2NkcDEucGNhLmRmbi5kZS91bmkt
bHVlbmVidXJnLWNhL3B1Yi9jcmwvY2FjcmwuY3JsMD+gPaA7hjlodHRwOi8vY2RwMi5wY2Eu
ZGZuLmRlL3VuaS1sdWVuZWJ1cmctY2EvcHViL2NybC9jYWNybC5jcmwwgaYGCCsGAQUFBwEB
BIGZMIGWMEkGCCsGAQUFBzAChj1odHRwOi8vY2RwMS5wY2EuZGZuLmRlL3VuaS1sdWVuZWJ1
cmctY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MEkGCCsGAQUFBzAChj1odHRwOi8vY2RwMi5w
Y2EuZGZuLmRlL3VuaS1sdWVuZWJ1cmctY2EvcHViL2NhY2VydC9jYWNlcnQuY3J0MA0GCSqG
SIb3DQEBBQUAA4IBAQANa3ZG/UAmpRcAXqOFOKXBfzN9vZilIdAUxSaXzN9gmXBNptDEcLfD
ccoA228Qc0BSdpvqMdE/21ahqE6oYI1CTfqbuYdoi/cmGoXo6+MdKCKxAD9LokkHdZFhr8re
NrsVkqxyY++Cek777HKZWn1Ft9864LA6vDar3K/sUHlBNxO6VhVzt09NQIFrA50lCkNd6iCG
7Hji624SI49aWjzysBOBdcP68tzSYM+nJLod1NZ3S/W3v+IlPlMeu1JZ5hRnzoTC5qHKKdoQ
kwSmQmv8/uXD46TXutmLXxH3SyBUIM4ks6RN8+VbJ9+61nOQjtazZzvgz9cnYquQC9Dm2s+q
MIIFpzCCBI+gAwIBAgIEEO4pMDANBgkqhkiG9w0BAQUFADCB0zELMAkGA1UEBhMCREUxFjAU
BgNVBAgTDU5pZWRlcnNhY2hzZW4xEjAQBgNVBAcTCUx1ZW5lYnVyZzEoMCYGA1UEChMfTGV1
cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZzEiMCAGA1UECxMZUmVjaGVuLSB1bmQgTWVk
aWVuemVudHJ1bTErMCkGA1UEAxMiTGV1cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZyBD
QTEdMBsGCSqGSIb3DQEJARYOY2FAbGV1cGhhbmEuZGUwHhcNMTAxMTAxMTE1OTI5WhcNMTMx
MDMxMTE1OTI5WjBqMQswCQYDVQQGEwJERTEoMCYGA1UEChMfTGV1cGhhbmEgVW5pdmVyc2l0
YWV0IEx1ZW5lYnVyZzEWMBQGA1UECxMNUmVjaGVuemVudHJ1bTEZMBcGA1UEAxMQQW5kcmVh
cyBPbHNvd3NraTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMHN+dnulux5yuat
6xrok1MyaCgEWnDKvuTtTk76PtCUW8yV48X9PPtN5QtoR69/sfrwiID/qgZlC+A1F4P/rg9h
fFsp+wnJ1jpbUr6OraRquh+FbluTmnbXQMRC/irJXoz5olErFbQenfY54uTlBQf1PbvzQ8Qt
cafbbav40JKYEos/QwexRroIUj6NGrO0HrS/7Bz1MPpyswQHft11ySruZLdBaTWbb/rxuYKw
dZEtOlaf2FPhLx4FIv/dgtH0MXyR9aXTASDLz+0ljWfPkiVIjdLa/XKzuvBcEClgdGl4cz9Y
001XiSIfT2Da+XEV5tA3TFPKg7X49fqI94CHQ1sCAwEAAaOCAekwggHlMAkGA1UdEwQCMAAw
CwYDVR0PBAQDAgXgMCkGA1UdJQQiMCAGCCsGAQUFBwMCBggrBgEFBQcDBAYKKwYBBAGCNxQC
AjAdBgNVHQ4EFgQUytxrj318uc9zMwuNGbY1yTTpgLIwHwYDVR0jBBgwFoAU9OFoGTsZQ8cB
NtE0Ypbz9QOhB4wwJwYDVR0RBCAwHoEcYW5kcmVhcy5vbHNvd3NraUBsZXVwaGFuYS5kZTCB
jQYDVR0fBIGFMIGCMD+gPaA7hjlodHRwOi8vY2RwMS5wY2EuZGZuLmRlL3VuaS1sdWVuZWJ1
cmctY2EvcHViL2NybC9jYWNybC5jcmwwP6A9oDuGOWh0dHA6Ly9jZHAyLnBjYS5kZm4uZGUv
dW5pLWx1ZW5lYnVyZy1jYS9wdWIvY3JsL2NhY3JsLmNybDCBpgYIKwYBBQUHAQEEgZkwgZYw
SQYIKwYBBQUHMAKGPWh0dHA6Ly9jZHAxLnBjYS5kZm4uZGUvdW5pLWx1ZW5lYnVyZy1jYS9w
dWIvY2FjZXJ0L2NhY2VydC5jcnQwSQYIKwYBBQUHMAKGPWh0dHA6Ly9jZHAyLnBjYS5kZm4u
ZGUvdW5pLWx1ZW5lYnVyZy1jYS9wdWIvY2FjZXJ0L2NhY2VydC5jcnQwDQYJKoZIhvcNAQEF
BQADggEBAA1rdkb9QCalFwBeo4U4pcF/M329mKUh0BTFJpfM32CZcE2m0MRwt8NxygDbbxBz
QFJ2m+ox0T/bVqGoTqhgjUJN+pu5h2iL9yYahejr4x0oIrEAP0uiSQd1kWGvyt42uxWSrHJj
74J6TvvscplafUW33zrgsDq8Nqvcr+xQeUE3E7pWFXO3T01AgWsDnSUKQ13qIIbseOLrbhIj
j1paPPKwE4F1w/ry3NJgz6ckuh3U1ndL9be/4iU+Ux67UlnmFGfOhMLmocop2hCTBKZCa/z+
5cPjpNe62YtfEfdLIFQgziSzpE3z5Vsn37rWc5CO1rNnO+DP1ydiq5AL0Obaz6oxggSoMIIE
pAIBATCB3DCB0zELMAkGA1UEBhMCREUxFjAUBgNVBAgTDU5pZWRlcnNhY2hzZW4xEjAQBgNV
BAcTCUx1ZW5lYnVyZzEoMCYGA1UEChMfTGV1cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVy
ZzEiMCAGA1UECxMZUmVjaGVuLSB1bmQgTWVkaWVuemVudHJ1bTErMCkGA1UEAxMiTGV1cGhh
bmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZyBDQTEdMBsGCSqGSIb3DQEJARYOY2FAbGV1cGhh
bmEuZGUCBBDuKTAwCQYFKw4DAhoFAKCCAqAwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAc
BgkqhkiG9w0BCQUxDxcNMTExMDE1MTA0NzEyWjAjBgkqhkiG9w0BCQQxFgQUG7y+JaQ+O5fw
3lAhe1HOA00yZrIwXwYJKoZIhvcNAQkPMVIwUDALBglghkgBZQMEAQIwCgYIKoZIhvcNAwcw
DgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsOAwIHMA0GCCqGSIb3DQMCAgEo
MIHtBgkrBgEEAYI3EAQxgd8wgdwwgdMxCzAJBgNVBAYTAkRFMRYwFAYDVQQIEw1OaWVkZXJz
YWNoc2VuMRIwEAYDVQQHEwlMdWVuZWJ1cmcxKDAmBgNVBAoTH0xldXBoYW5hIFVuaXZlcnNp
dGFldCBMdWVuZWJ1cmcxIjAgBgNVBAsTGVJlY2hlbi0gdW5kIE1lZGllbnplbnRydW0xKzAp
BgNVBAMTIkxldXBoYW5hIFVuaXZlcnNpdGFldCBMdWVuZWJ1cmcgQ0ExHTAbBgkqhkiG9w0B
CQEWDmNhQGxldXBoYW5hLmRlAgQQ7ikwMIHvBgsqhkiG9w0BCRACCzGB36CB3DCB0zELMAkG
A1UEBhMCREUxFjAUBgNVBAgTDU5pZWRlcnNhY2hzZW4xEjAQBgNVBAcTCUx1ZW5lYnVyZzEo
MCYGA1UEChMfTGV1cGhhbmEgVW5pdmVyc2l0YWV0IEx1ZW5lYnVyZzEiMCAGA1UECxMZUmVj
aGVuLSB1bmQgTWVkaWVuemVudHJ1bTErMCkGA1UEAxMiTGV1cGhhbmEgVW5pdmVyc2l0YWV0
IEx1ZW5lYnVyZyBDQTEdMBsGCSqGSIb3DQEJARYOY2FAbGV1cGhhbmEuZGUCBBDuKTAwDQYJ
KoZIhvcNAQEBBQAEggEAX7UzhwGpK0SLLv/WLHUk8OCUCO7M0eA901NAdFDzSAEpvs0X8kLD
0BZPORv49F6+puAH7piLanRZlW2EQj6I6KaJC0RE/5sQz2HjG9XImAOka9Y45j45rA3wPgSK
xON3tsgu/MaJd4MGIwR3bxDV4g5Le3EUl2Fsg/OsLXmUfVzIKEHTPcIfrdhw48FfLQDDgRSd
p/oPttW1aylaj0Ap/VyLtPTwMBEAr8S/z+EKU8vy/tYoGzliZ4aBRkuoG4ff58lJUPZ+GMKp
Z9Lnl5OfFedYy9LU+0UFfaJ32TxePv2sfdhicd0VV8ZIxjyd6qS2EAuWA5MGlcmaGgJf7ETb
swAAAAAAAA==
--------------ms070405060302000406040005--


--===============0843557967==
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

--===============0843557967==--


From xen-devel-bounces@lists.xensource.com Sat Oct 15 03:55:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 03:55:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF1u7-0007F4-Pa; Sat, 15 Oct 2011 03:55:47 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RF1sV-00070k-It
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 03:54:07 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1318676043!211542!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16319 invoked from network); 15 Oct 2011 10:54:04 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Oct 2011 10:54:04 -0000
Received: by vws13 with SMTP id 13so2692331vws.30
	for <xen-devel@lists.xensource.com>;
	Sat, 15 Oct 2011 03:54:03 -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=qyT5LsYE+kYAvPWxPr3zcW6b4Z2MwRKO5VL65oT3taU=;
	b=niuywuUNAj9hOlTmoKVBUdImDrEVBtxaO85G3hCeuL5Lsgs9j6R8HtHuFsrl9SxzzZ
	GlEYa9ywuCmjYpf0lm6oxgLIZpVoHEs2elWzYJVf2lPa4Fb561tCq5awK7R+a1bPai+n
	MIJehnv634ZMrZltGwo3RyQYKG2n+uPJtxxgA=
MIME-Version: 1.0
Received: by 10.52.19.110 with SMTP id d14mr7039242vde.124.1318676043401; Sat,
	15 Oct 2011 03:54:03 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Sat, 15 Oct 2011 03:54:03 -0700 (PDT)
In-Reply-To: <1318674976.11016.24.camel@dagon.hellion.org.uk>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
	<CAE1-PRfGTxeQ59jmHfB6bKKk2+B5bNnKhAvXoV-5P__+nkhgKQ@mail.gmail.com>
	<1318674976.11016.24.camel@dagon.hellion.org.uk>
Date: Sat, 15 Oct 2011 11:54:03 +0100
X-Google-Sender-Auth: NWbOgoabqky6KHlXGcwdAzTSMhs
Message-ID: <CAE1-PRf8ySeBVYFqxoc6Wd_K4fK=UCLYx+sOzDgNwUU5XhiR2Q@mail.gmail.com>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Andy Burns <xen.lists@burns.me.uk>
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: xen-devel <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 15 October 2011 11:36, Ian Campbell <Ian.Campbell@citrix.com> wrote:

> In general if a driver is correctly using the DMA API things should
> never be within the swiotlb.

OK, they just looked coincidentally similar.

> I think you've got 8G of RAM so one thing which might be worth trying is
> to give "mem=2G" (or perhaps 3G) on the hypervisor command line.

Yes I do have 8GB, will give it a try.

> I wonder if the hypervisor's "dma_bits" option has any relevance here?
> Might be worth a go?

I noticed that parameter, but couldn't see much indication of sensible
values, something a few bits less than 32 perhaps?

> In general I think these sorts cards use I2C extensively, i.e. the tuner
> etc is on an i2c bus, so I wouldn't expect anything to work at all
> without it.

Yes, that part of the card is working, w_scan can control the tuner
and detect when it latches onto valid muxes, receiving the bulk
datastream from the demodulator is the problem.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 04:28:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 04: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 1RF2Q3-0000iz-6X; Sat, 15 Oct 2011 04:28:47 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RF2PJ-0000VR-T9
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 04:28:02 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318678077!21703931!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16738 invoked from network); 15 Oct 2011 11:27:58 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Oct 2011 11:27:58 -0000
Received: by vcbfk13 with SMTP id fk13so2627689vcb.30
	for <xen-devel@lists.xensource.com>;
	Sat, 15 Oct 2011 04:27:57 -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:content-type;
	bh=WDprjzBG1TbsrdAeO4mYlKORVV3e2A7PulcfISF43So=;
	b=wIiIJaBCDm3H7QCEuZWd8IN78U2CX1s2ggEcuI2gPyqUFzBtF+1OoFLlSqy2+9cRyx
	Hp0c2xPtJptm9cZdk7ZTVcHDrf7whp6LsyeAK6nxurwyY2nCeROd4UFeKS5QZZ730xvV
	0AnFosphMrfg+T26LgGixCrmx7WlERVjuQwZA=
MIME-Version: 1.0
Received: by 10.52.68.79 with SMTP id u15mr2470960vdt.5.1318678077453; Sat, 15
	Oct 2011 04:27:57 -0700 (PDT)
Received: by 10.52.160.9 with HTTP; Sat, 15 Oct 2011 04:27:57 -0700 (PDT)
In-Reply-To: <1318674976.11016.24.camel@dagon.hellion.org.uk>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
	<CAE1-PRfGTxeQ59jmHfB6bKKk2+B5bNnKhAvXoV-5P__+nkhgKQ@mail.gmail.com>
	<1318674976.11016.24.camel@dagon.hellion.org.uk>
Date: Sat, 15 Oct 2011 12:27:57 +0100
X-Google-Sender-Auth: SO308uX1fV1o34pl60ow0kH5fG4
Message-ID: <CAE1-PRe3FZknxdCLkhkGbzd-i=y5eGMAwY+yoa36j61oHNcRSw@mail.gmail.com>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Andy Burns <xen.lists@burns.me.uk>
To: Ian Campbell <Ian.Campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, 
	xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1
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 October 2011 11:36, Ian Campbell <Ian.Campbell@citrix.com> wrote:

> I think you've got 8G of RAM so one thing which might be worth trying is
> to give "mem=2G" (or perhaps 3G) on the hypervisor command line. That
> ought to rule out addresses which are too high. (just a datapoint, not a
> solution)

A coconut for the gentleman!

Working in dom0 and (with page-alignment of the PCI BARs) in the domU,
I did check a couple of reboots and a cold start too, just in case!

So what's to look at for the real cause?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 05:16:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 05:16:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF3AB-0002E4-O4; Sat, 15 Oct 2011 05:16:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RF39H-00021M-CV
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 05:15:32 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1318680927!1157525!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16077 invoked from network); 15 Oct 2011 12:15:27 -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;
	15 Oct 2011 12:15:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,350,1315180800"; 
   d="scan'208";a="8407039"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Oct 2011 12:15:27 +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;
	Sat, 15 Oct 2011 13:15:27 +0100
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andy Burns <xen.lists@burns.me.uk>
In-Reply-To: <CAE1-PRf8ySeBVYFqxoc6Wd_K4fK=UCLYx+sOzDgNwUU5XhiR2Q@mail.gmail.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
	<CAE1-PRfGTxeQ59jmHfB6bKKk2+B5bNnKhAvXoV-5P__+nkhgKQ@mail.gmail.com>
	<1318674976.11016.24.camel@dagon.hellion.org.uk>
	<CAE1-PRf8ySeBVYFqxoc6Wd_K4fK=UCLYx+sOzDgNwUU5XhiR2Q@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Sat, 15 Oct 2011 13:15:26 +0100
Message-ID: <1318680926.11016.30.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>,
	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 Sat, 2011-10-15 at 11:54 +0100, Andy Burns wrote:
> On 15 October 2011 11:36, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> 
> > In general if a driver is correctly using the DMA API things should
> > never be within the swiotlb.
> 
> OK, they just looked coincidentally similar.
> 
> > I think you've got 8G of RAM so one thing which might be worth trying is
> > to give "mem=2G" (or perhaps 3G) on the hypervisor command line.
> 
> Yes I do have 8GB, will give it a try.
> 
> > I wonder if the hypervisor's "dma_bits" option has any relevance here?
> > Might be worth a go?
> 
> I noticed that parameter, but couldn't see much indication of sensible
> values, something a few bits less than 32 perhaps?

Anything <32 would be a good guess, maybe try 30? Even 32 might be
worthwhile to try (not sure what you are getting by default).

Ian.

> > In general I think these sorts cards use I2C extensively, i.e. the tuner
> > etc is on an i2c bus, so I wouldn't expect anything to work at all
> > without it.
> 
> Yes, that part of the card is working, w_scan can control the tuner
> and detect when it latches onto valid muxes, receiving the bulk
> datastream from the demodulator is the problem.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 05:18:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 05:18:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF3C6-0002cl-03; Sat, 15 Oct 2011 05:18:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RF3BZ-0002Q5-QB
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 05:17:54 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318681070!1151640!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29976 invoked from network); 15 Oct 2011 12:17:50 -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 Oct 2011 12:17:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,350,1315180800"; 
   d="scan'208";a="8407056"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Oct 2011 12:17:44 +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;
	Sat, 15 Oct 2011 13:17:44 +0100
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andy Burns <xen.lists@burns.me.uk>
In-Reply-To: <CAE1-PRe3FZknxdCLkhkGbzd-i=y5eGMAwY+yoa36j61oHNcRSw@mail.gmail.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
	<CAE1-PRfGTxeQ59jmHfB6bKKk2+B5bNnKhAvXoV-5P__+nkhgKQ@mail.gmail.com>
	<1318674976.11016.24.camel@dagon.hellion.org.uk>
	<CAE1-PRe3FZknxdCLkhkGbzd-i=y5eGMAwY+yoa36j61oHNcRSw@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Sat, 15 Oct 2011 13:17:44 +0100
Message-ID: <1318681064.11016.32.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>,
	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 Sat, 2011-10-15 at 12:27 +0100, Andy Burns wrote:
> On 15 October 2011 11:36, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> 
> > I think you've got 8G of RAM so one thing which might be worth trying is
> > to give "mem=2G" (or perhaps 3G) on the hypervisor command line. That
> > ought to rule out addresses which are too high. (just a datapoint, not a
> > solution)
> 
> A coconut for the gentleman!
> 
> Working in dom0 and (with page-alignment of the PCI BARs) in the domU,
> I did check a couple of reboots and a cold start too, just in case!

Excellent. I should read the whole thread before replying.

> So what's to look at for the real cause?

Will have to have a think on Monday.

The VM_IO stuff which Konrad mentioned and perhaps the DMA mask of the
device spring to mind.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 06:07:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 06:07:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF3xJ-00047o-RI; Sat, 15 Oct 2011 06:07:14 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RF3wA-0003uP-2U
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 06:06:02 -0700
X-Env-Sender: darnok@68k.org
X-Msg-Ref: server-16.tower-216.messagelabs.com!1318683957!1144759!1
X-Originating-IP: [206.212.254.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1489 invoked from network); 15 Oct 2011 13:05:58 -0000
Received: from andromeda.dapyr.net (HELO andromeda.dapyr.net) (206.212.254.10)
	by server-16.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 15 Oct 2011 13:05:58 -0000
Received: from andromeda.dapyr.net (darnok@localhost [127.0.0.1])
	by andromeda.dapyr.net (8.13.4/8.13.4/Debian-3sarge3) with ESMTP id
	p9FD5tro020917
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT);
	Sat, 15 Oct 2011 09:05:55 -0400
Received: (from darnok@localhost)
	by andromeda.dapyr.net (8.13.4/8.13.4/Submit) id p9FD5qEQ020915;
	Sat, 15 Oct 2011 09:05:52 -0400
Date: Sat, 15 Oct 2011 09:05:52 -0400
From: Konrad Rzeszutek Wilk <konrad@darnok.org>
To: Maxim Uvarov <maxim.uvarov@oracle.com>
Message-ID: <20111015130552.GC18864@andromeda.dapyr.net>
References: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
	<4E98BEF5.10801@goop.org> <4E98C6CE.4020508@oracle.com>
	<4E98C8B1.20304@goop.org> <4E98D739.4000705@oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E98D739.4000705@oracle.com>
User-Agent: Mutt/1.5.9i
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org, konrad.wilk@oracle.com
Subject: [Xen-devel] Re: [PATCH] XEN_DOMAIN_MEMORY 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 Fri, Oct 14, 2011 at 05:43:37PM -0700, Maxim Uvarov wrote:
> On 10/14/2011 04:41 PM, Jeremy Fitzhardinge wrote:
> >On 10/14/2011 04:33 PM, Maxim Uvarov wrote:
> >>On 10/14/2011 04:00 PM, Jeremy Fitzhardinge wrote:
> >>>On 10/14/2011 03:36 PM, Maxim Uvarov wrote:
> >>>>Hello,
> >>>>
> >>>>Please find here patches for XEN_MAX_DOMAIN_MEMORY:
> >>>>
> >>>>[PATCH 1/2] xen: Fix XEN_MAX_DOMAIN_MEMORY to be selectable
> >>>>[PATCH 2/2] xen: Make XEN_MAX_DOMAIN_MEMORY have more sensible
> >>>>defaults for 32-bit builds
> >>>
> >>>What's the rationale?
> >>>
> >>>      J
> >>
> >>The first patch is actually bug fix. You can not define just "int"
> >>without description in Kconfig. As the result this option will not be
> >>visible in menuconfig. Even if you will change it in .config make
> >>oldconfig will set it up for default value. So you need to add any
> >>description to it as all others int options have.
> >
> >No, that was deliberate, because I don't really think there's a need to
> >change it.
> >
> 
> From that point of view it's not clear why this option is still in Kconfig?

Well, we do need to alter it to 512GB. Actually -  putting that extra
burden on initial pagetables to reserve extra 384 pages might be a bit
too much. Even thought later on we reclaim it if we do not use it.

Either way, we should be able to boot a PV guest with 512GB, so why not
just make that the default for 64-bit?
> 
> Jeremy, can you please share more details about this? I see people are 
> having troubles with this option and in different kernels I see 
> different work arounds  for it. For example:
> http://lists.xensource.com/archives/html/xen-devel/2011-01/msg01841.html

.. which ultimately was due to bugs in the initial page tables setup in
the generic code and in the Xen MMU (fixed in 2.6.39):

279b706 x86,xen: introduce x86_init.mapping.pagetable_reserve
b9269dc xen: mask_rw_pte mark RO all pagetable pages up to pgt_buf_top
ee17645 xen: mask_rw_pte: do not apply the early_ioremap checks on x86_32
d8aa5ec xen: update mask_rw_pte after kernel page tables init changes
e5f15b4 x86: Cleanup highmap after brk is conclude

What are the "I see people are having troubles with this option" ?
(Anything before 2.6.39 is very much related to those bug-fixes I
just pointed out).

> 
> Maxim.
> >>
> >>Second patch is more optional and it's just suggestion to use for 32
> >>bit more corresponding value.
> >
> >While it would be very silly to put 128GB of actual RAM on a 32-bit
> >machine, systems can have non-contiguous RAM placed at high addresses,
> >which would no longer be accessible.

Do you have some ideas of which machines that might be?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 06:08:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 06:08:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF3ym-0004W4-Fn; Sat, 15 Oct 2011 06:08:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RF3y1-0004FD-Px
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 06:07:58 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318684046!52923928!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31405 invoked from network); 15 Oct 2011 13:07:26 -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;
	15 Oct 2011 13:07:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,350,1315180800"; 
   d="scan'208";a="8407309"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Oct 2011 13:07:49 +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;
	Sat, 15 Oct 2011 14:07:49 +0100
Subject: Re: [Xen-devel] XL: pv guests dont reboot after migration
	(xen-4.1.2-rc3) libc-2.11.2 segfault
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andreas Olsowski <andreas.olsowski@leuphana.de>
In-Reply-To: <4E9964B0.6000001@leuphana.de>
References: <4E785FDD.40209@leuphana.de>
	<1316546621.5182.23.camel@dagon.hellion.org.uk>
	<4E7C37D6.7050109@leuphana.de>
	<1316764843.23371.103.camel@zakaz.uk.xensource.com>
	<4E7C4E45.5080509@leuphana.de>
	<20098.2654.689536.265060@mariner.uk.xensource.com>
	<4E98DB4D.6060900@leuphana.de>
	<1318657550.11016.13.camel@dagon.hellion.org.uk>
	<4E9964B0.6000001@leuphana.de>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Sat, 15 Oct 2011 14:07:48 +0100
Message-ID: <1318684068.11016.39.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>,
	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 Sat, 2011-10-15 at 11:47 +0100, Andreas Olsowski wrote:
> On 10/15/2011 07:45 AM, Ian Campbell wrote:
> > On Sat, 2011-10-15 at 02:01 +0100, Andreas Olsowski wrote:
> >
> >> pv guests dont reboot after migration,
> >> just when xl should reboot the machine syslog shows:
> >>
> >>
> >> Oct 15 02:46:32 netcatarina kernel: xl[14986]: segfault at 7f0ec70a3008
> >> ip 00007f0ec7d517f9 sp 00007fff366cf100 error 4 in
> >> libc-2.11.2.so[7f0ec7cdb000+158000]
> >
> > Can you run under gdb and get a backtrace? Or perhaps core file is
> > dropped somewhere?
> How? xl migrate-receive is not started by hand. Can you point me to the 
> location within the code that calls it so i can put a "gdb" infront of it?

tools/libxl/xl_cmdimpl.c, main_migrate().

Or you can attach gdb to a running xl migrate receive ("gdb -p
<pid> /path/xl"?). I think you can also control the remove command which
is run using the -e option to "xl migrate", maybe. Not so sure about
that last one.

>  > Or perhaps core file is dropped somewhere?
> Wouldnt i have to run a debugging enabled build of xen for that?
> 
> I found this in the log dir:
> 
> 
> root@netcatarina:/var/log/xen# cat xl-testmig--incoming.log
> Waiting for domain testmig--incoming (domid 67) to die [pid 3429]
> Domain 67 is dead
> Action for shutdown reason code 1 is restart
> Domain 67 needs to be cleaned up: destroying the domain
> Done. Rebooting now
> xc: error: 0-length read: Internal error

Interesting. That suggests we've gone back round to the migrate/restore
path, but all the uses after the start: label (where we go back to on
reboot) in create_domain seem to be gated on restore_file != NULL. I
must be missing something...

Adding some logging in create_domain wherever a *fd variable is used
might be interesting, perhaps on the exit paths too.

I notice that we don't appear to close restore_fd in the child process.
That probably isn't related to this problem but would be worth doing I
suspect.

> xc: error: read_exact_timed failed (read rc: 0, errno: 0): Internal error
> xc: error: read: p2m_size (0 = Success): Internal error


> 
> 
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 08:13:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 08:13:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF5vg-0007Zy-Fj; Sat, 15 Oct 2011 08:13:40 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RF5uv-0007Mv-Qq
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 08:12:54 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318691570!1174234!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22277 invoked from network); 15 Oct 2011 15:12:50 -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;
	15 Oct 2011 15:12:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,350,1315180800"; 
   d="scan'208";a="8407706"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Oct 2011 15:12:50 +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;
	Sat, 15 Oct 2011 16:12:50 +0100
Subject: Re: [Xen-devel] pv guests die after failed migration
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andreas Olsowski <andreas.olsowski@leuphana.de>
In-Reply-To: <4E996206.4050500@leuphana.de>
References: <4E786015.80603@leuphana.de>
	<1316546879.5182.26.camel@dagon.hellion.org.uk>
	<4E7C37BD.2000706@leuphana.de>
	<1316764045.23371.100.camel@zakaz.uk.xensource.com>
	<4E7C4E44.70508@leuphana.de>
	<1317225159.26672.87.camel@zakaz.uk.xensource.com>
	<4E98DF51.9070907@leuphana.de>
	<1318657499.11016.12.camel@dagon.hellion.org.uk>
	<4E996206.4050500@leuphana.de>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Sat, 15 Oct 2011 16:12:49 +0100
Message-ID: <1318691569.11016.42.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 Sat, 2011-10-15 at 11:35 +0100, Andreas Olsowski wrote:
> On 10/15/2011 07:44 AM, Ian Campbell wrote:
> > On Sat, 2011-10-15 at 02:18 +0100, Andreas Olsowski wrote:
> >> It seems this still has not made it into 4.1-testing.
> >
> > I'm afraid I've not had time to "figure out how to automatically select
> > which guests are capable of a cooperative resume and which are not." so
> > it hasn't been fixed in xen-unstable either AFAIK.
> >
> Wouldnt just assuming all of them do fix a bigger percentage of systems 
> than leaving it the way it is?

I don't know -- that's really the point.

> > I'm also still interested in confirmation to the question I asked in the
> > mail you just replied to.
> >
> 
> Oh, i thought i allready did.
> 
>  > Are you saying that you don't see the "failed for domain %u" message
>  > immediately after the xc_domain_resume call?
>  >
>  > +    if (xc_domain_resume(ctx->xch, domid, 1)) {
>  >            LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
>  >                            "xc_domain_resume failed for domain %u",
>  >                            domid);
>  >
>  > That would be pretty odd...
> 
> Yes that is what i am saying:

Oh wait, that's right -- as far as the toolstack is concerned the resume
was successful -- the subsequent crash is within the guest.

Ian.

> 
> root@memoryana:/var/log/xen# cat xl-testmig.log
> Waiting for domain testmig (domid 2) to die [pid 13349]
> Domain 2 is dead
> Done. Exiting now
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 08:33:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 08:33:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF6F1-0008PX-CD; Sat, 15 Oct 2011 08:33:39 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RF6ED-0008Bw-Kv
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 08:32:49 -0700
X-Env-Sender: carsten@schiers.de
X-Msg-Ref: server-5.tower-182.messagelabs.com!1318692766!17457087!1
X-Originating-IP: [194.117.254.36]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25533 invoked from network); 15 Oct 2011 15:32:46 -0000
Received: from www.zeus06.de (HELO mail.zeus06.de) (194.117.254.36)
	by server-5.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 15 Oct 2011 15:32:46 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=simple; d=mail.zeus06.de; h=date:
	from:to:cc:message-id:in-reply-to:subject:mime-version:
	content-type:content-transfer-encoding; q=dns/txt; s=beta; bh=J1
	EZdcnDtZFnhcMkuVplbPaif1/ljBTd6BIKiPM35fc=; b=HqI0Q6K3F/8jtZuWkG
	5hiIeGdmH6Zb8z1zwQp7poGFPGdiV5FK73yUCCFv0xjBfsPm2krPbmV4hlzPS3mJ
	Q/OBA9DhWpPylgdOCSXussSfQndkW3U0mRge6j0f2m9/vIg1Qar2M6YjcDspKieN
	50NDQuLbQlLelD06iBnamR7h4=
Received: (qmail 6599 invoked from network); 15 Oct 2011 17:32:45 +0200
Received: from unknown (HELO uhura.space.zz) (l3s6271p1@46.59.153.41)
	by mail.zeus06.de with ESMTPSA (DHE-RSA-AES256-SHA encrypted,
	authenticated); 15 Oct 2011 17:32:45 +0200
Received: from localhost (localhost [127.0.0.1])
	by uhura.space.zz (8.14.3/8.14.3/Debian-5+lenny1) with ESMTP id
	p9FFbSRZ012846; Sat, 15 Oct 2011 17:37:28 +0200
X-Virus-Scanned: Debian amavisd-new at schiers.de
Received: from uhura.space.zz ([127.0.0.1])
	by localhost (uhura.space.zz [127.0.0.1]) (amavisd-new, port 10024)
	with LMTP id qHZvaLnQEEoV; Sat, 15 Oct 2011 17:37:22 +0200 (CEST)
Received: from uhura.space.zz (localhost [127.0.0.1])
	by uhura.space.zz (8.14.3/8.14.3/Debian-5) with ESMTP id p9FFbLrZ012830;
	Sat, 15 Oct 2011 17:37:21 +0200
Date: Sat, 15 Oct 2011 17:37:20 +0200
From: "Carsten Schiers" <carsten@schiers.de>
To: "konrad.wilk" <konrad.wilk@oracle.com>
Message-ID: <H0000067000c72b1.1318693040.uhura.space.zz@MHS>
In-Reply-To: <CAE1-PRe3FZknxdCLkhkGbzd-i=y5eGMAwY+yoa36j61oHNcRSw@mail.gmail.com>
Subject: AW: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
x-scalix-Hops: 1
MIME-Version: 1.0
Content-Type: text/plain;
	charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "xen.lists" <xen.lists@burns.me.uk>,
	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

Interesting. Konrad, do you remember that one of my DVB cards did=20
consume double CPU time=20
as compared to a) old Xenified 2.6.18 b) Xenified 2.6.34 and c) mem=3D2G=20
Dom0? Maybe these
observations are somehow connected.

It did work, though... Unfortunately, I sold these cards to have only=20
one, which is=20

Carsten.

-----Urspr=FCngliche Nachricht-----
Von: Andy Burns [mailto:xen.lists@burns.me.uk]=20
Gesendet: Samstag, 15. Oktober 2011 13:28
An: Ian Campbell; Konrad Rzeszutek Wilk; xen-devel
Betreff: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!

On 15 October 2011 11:36, Ian Campbell <Ian.Campbell@citrix.com> wrote:

> I think you've got 8G of RAM so one thing which might be worth trying=20
is
> to give "mem=3D2G" (or perhaps 3G) on the hypervisor command line. That=

> ought to rule out addresses which are too high. (just a datapoint, not=20
a
> solution)

A coconut for the gentleman!

Working in dom0 and (with page-alignment of the PCI BARs) in the domU,
I did check a couple of reboots and a cold start too, just in case!

So what's to look at for the real cause?

_______________________________________________
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 Sat Oct 15 09:44:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 09:44:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RF7LS-0001kp-M2; Sat, 15 Oct 2011 09:44:22 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RF7KG-0001WD-ST
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 09:43:10 -0700
X-Env-Sender: ijc@hellion.org.uk
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318696985!277774!1
X-Originating-IP: [80.68.92.230]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15557 invoked from network); 15 Oct 2011 16:43:05 -0000
Received: from aaar.vm.bytemark.co.uk (HELO aaar.vm.bytemark.co.uk)
	(80.68.92.230) by server-3.tower-21.messagelabs.com with SMTP;
	15 Oct 2011 16:43:05 -0000
Received: from localhost (unknown [127.0.0.1])
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id 07A09144BF3;
	Sat, 15 Oct 2011 16:43:02 +0000 (UTC)
Received: from aaar.vm.bytemark.co.uk ([127.0.0.1])
	by localhost (aaar.vm.bytemark.co.uk [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id Y9VcYTVFZ3KN; Sat, 15 Oct 2011 17:42:58 +0100 (BST)
Received: from hopkins.hellion.org.uk
	(cpc2-cmbg14-2-0-cust125.5-4.cable.virginmedia.com [86.26.0.126])
	(using TLSv1 with cipher AES256-SHA (256/256 bits))
	(No client certificate requested)
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id 0DDE6144BBF;
	Sat, 15 Oct 2011 17:42:58 +0100 (BST)
Received: from dagon.hellion.org.uk ([192.168.1.7])
	by hopkins.hellion.org.uk with esmtps (SSL3.0:RSA_AES_256_CBC_SHA1:32)
	(Exim 4.72) (envelope-from <ijc@hellion.org.uk>)
	id 1RF7Jx-0007Ek-Ae; Sat, 15 Oct 2011 17:42:51 +0100
From: Ian Campbell <ijc@hellion.org.uk>
To: Konrad Rzeszutek Wilk <konrad@darnok.org>
In-Reply-To: <20111015130552.GC18864@andromeda.dapyr.net>
References: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
	<4E98BEF5.10801@goop.org> <4E98C6CE.4020508@oracle.com>
	<4E98C8B1.20304@goop.org> <4E98D739.4000705@oracle.com>
	<20111015130552.GC18864@andromeda.dapyr.net>
Date: Sat, 15 Oct 2011 17:42:48 +0100
Message-ID: <1318696968.11016.47.camel@dagon.hellion.org.uk>
Mime-Version: 1.0
X-Mailer: Evolution 2.32.3 
X-SA-Exim-Connect-IP: 192.168.1.7
X-SA-Exim-Mail-From: ijc@hellion.org.uk
X-SA-Exim-Version: 4.2.1 (built Mon, 22 Mar 2010 06:51:10 +0000)
X-SA-Exim-Scanned: Yes (on hopkins.hellion.org.uk)
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org, konrad.wilk@oracle.com,
	Maxim Uvarov <maxim.uvarov@oracle.com>
Subject: [Xen-devel] Re: [PATCH] XEN_DOMAIN_MEMORY 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>
Content-Type: multipart/mixed; boundary="===============1464050982=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============1464050982==
Content-Type: multipart/signed; micalg="pgp-sha512";
	protocol="application/pgp-signature";
	boundary="=-jyMsMYRhBxLV/SbWJa8f"


--=-jyMsMYRhBxLV/SbWJa8f
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable

On Sat, 2011-10-15 at 09:05 -0400, Konrad Rzeszutek Wilk wrote:
> > On 10/14/2011 04:41 PM, Jeremy Fitzhardinge wrote:

> > >While it would be very silly to put 128GB of actual RAM on a 32-bit
> > >machine, systems can have non-contiguous RAM placed at high addresses,
> > >which would no longer be accessible.
>=20
> Do you have some ideas of which machines that might be?

Even if you were on such a machine, the discontiguity
(discontiguousness?) wouldn't ever be reflected in the pseudo-physical
memory map, would it? So since this variable controls the maximum size
of the p2m (rather than the m2p) it doesn't need to be larger than the
maximum sane 32 bit guest size (<64G).

Ian.
--=20
Ian Campbell


Every improvement in communication makes the bore more terrible.
		-- Frank Moore Colby

--=-jyMsMYRhBxLV/SbWJa8f
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iQIcBAABCgAGBQJOmbgIAAoJEOxjaZd5B0+onZcP/jYk5JvIVJGoZJ/P+Q775Rp3
SwPvVWy0SV63/uHn1Z3BJzu3DxnCzCQ7zgQvHCBJOJJ9lHDru2voGI/Zit0wY+Ds
ZZXAEcjZg8RWx7+UL6uChgkem3IIhXJNUG+gipBHZmr5wPui7gA+kPyy/YXOn+0v
xAkk8aMuKlX+wSm1rX87p42B5p7YDbefQ3NjVrxp723wFE+HGSjyOZnj3pg20fFR
Pgu8hYYaMK+bDZZ+IAD4GFzDsz8ASaG6YlcFfo3GjAGehu9RRpRJz04jNaGYl/Rp
pMltWnrE+hT8oCJvq0x6Oxo1Al9esc6jlEjEzTX78wxzdP8AjI+bqvXnvHeQbZYl
2pFkVGYi1uIwFImeSucs8eWw+lC4PYS3R0PLAXR74j4jrCvvJRC5ZF/9g5fPiEbr
6ldyASACb3al2amgmMnTgYMWosn/zCXXt6aj2S0sZ4SA7aVNv8cPbqTKZZJH2ZZ8
4Xa3WyllvLZNWAJekzeWsyDA/aITeq7th+OntAXi2rugWi5vR3fHH/rLDjS4X1/D
Ip6Seddyzp3mU3Cs84rCzzWonaVtYjpRXq8U7ZfSMJ7BrUOVME0rmnmGeA3EQ005
6bndcd3V7zeilDsJt2xVNSPwgit91+c5DkXNWt5lfFDS2AzY+qz6Vnqj7cxk7ItG
FhQIUpl4/N8JWVxTIQJv
=4w19
-----END PGP SIGNATURE-----

--=-jyMsMYRhBxLV/SbWJa8f--



--===============1464050982==
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

--===============1464050982==--



From xen-devel-bounces@lists.xensource.com Sat Oct 15 14:15:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 14:15:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFBZX-0000Ns-4I; Sat, 15 Oct 2011 14:15:11 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFBYj-0000Ax-U2
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 14:14:22 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1318713258!293988!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3052 invoked from network); 15 Oct 2011 21:14:18 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Oct 2011 21:14:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,351,1315180800"; 
   d="scan'208";a="8408469"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	15 Oct 2011 21:14:18 +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;
	Sat, 15 Oct 2011 22:14:17 +0100
Subject: Re: [Xen-devel] Re: xen: IPI interrupts not resumed early enough
	on suspend/resume
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Thomas Gleixner <tglx@linutronix.de>
In-Reply-To: <1318598637.21903.889.camel@zakaz.uk.xensource.com>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
	<1317668908.11991.20.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110032229250.1489@ionos>
	<1318001583.21903.355.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110071822160.3240@ionos>
	<1318251990.21903.433.camel@zakaz.uk.xensource.com>
	<1318598637.21903.889.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset="UTF-8"
Organization: Citrix Systems, Inc.
Date: Sat, 15 Oct 2011 22:14:13 +0100
Message-ID: <1318713254.11016.52.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 8bit
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	linux-kernel <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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Fri, 2011-10-14 at 14:23 +0100, Ian Campbell wrote:
> Ping? The original issue has made it into longterm-2.6.32.y and then
> onto Debian (bug #644604) so people keep asking me about it...

Sorry, the previous version had a warning in it (was missing the return
type for resume_irqs), fixed up version follows.

I noticed that the backport to longterm 2.6.32 won't work since syscore
isn't available back then. I think one approach for the backport would
be to call irq_pm_syscore_resume() directly from sysdev_resume(), does
that sound sensible?

Ian.

8<------------------------------

>From cac68962d009cd916cc66b4d870630adc49c1e1e Mon Sep 17 00:00:00 2001
From: Ian Campbell <ian.campbell@citrix.com>
Date: Mon, 3 Oct 2011 15:37:00 +0100
Subject: [PATCH] irq: add IRQF_RESUME_EARLY and resume such IRQs earlier in the process
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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: Thomas Gleixner <tglx@linutronix.de>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: xen-devel <xen-devel@lists.xensource.com>
Cc: stable@kernel.org (at least to 2.6.32.y)
[v2: refactor common code in irq_pm_syscore_resume and resume_device_irqs]
[v3: resume_irqs returns void, "fixing warning: return type defaults to â€˜intâ€™"]
---
 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 7523719..44490de 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 a103732..f51a81b 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.2.5




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 18:54:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 18:54:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFFvS-0000ou-D4; Sat, 15 Oct 2011 18:54:06 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFFuT-0000c4-TP
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 18:53:06 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318729981!1217377!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8118 invoked from network); 16 Oct 2011 01:53:02 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-12.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 16 Oct 2011 01:53:02 -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 6D17BA231;
	Sat, 15 Oct 2011 18:53:00 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id E037B203B3;
	Sat, 15 Oct 2011 18:52:58 -0700 (PDT)
Message-ID: <4E9A38FA.7030504@goop.org>
Date: Sat, 15 Oct 2011 18:52: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: Peter Zijlstra <peterz@infradead.org>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<c133180533d7e520bb1e818e987117811a666fbc.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<1318502628.24856.10.camel@twins> <4E98AEDD.4010503@goop.org>
	<1318668158.6594.0.camel@twins>
In-Reply-To: <1318668158.6594.0.camel@twins>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 10/10] jump-label: initialize
 jump-label subsystem much 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 10/15/2011 01:42 AM, Peter Zijlstra wrote:
> On Fri, 2011-10-14 at 14:51 -0700, Jeremy Fitzhardinge wrote:
>> How about this?  Proper comment and much earlier init.
> Looks good to me, thanks!

Should I take that as an ACK on the series?

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 15 20:41:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 15 Oct 2011 20:41:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFHbH-0003xB-MH; Sat, 15 Oct 2011 20:41:23 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFHaM-0003jp-NL
	for xen-devel@lists.xensource.com; Sat, 15 Oct 2011 20:40:27 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318736423!1211345!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10073 invoked from network); 16 Oct 2011 03:40:23 -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;
	16 Oct 2011 03:40:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,352,1315180800"; 
   d="scan'208";a="8409291"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	16 Oct 2011 03:40: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; Sun, 16 Oct 2011 04:40:22 +0100
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 1RFHaI-00068t-9a;
	Sun, 16 Oct 2011 03:40:22 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RFHaI-0006Q0-60;
	Sun, 16 Oct 2011 04:40:22 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9343-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 16 Oct 2011 04:40:22 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9343: 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 9343 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9343/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail pass in 9342

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 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-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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  6880bfc48504
baseline version:
 xen                  6880bfc48504

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 Sun Oct 16 05:36:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 16 Oct 2011 05:36:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFPx6-0000C4-RA; Sun, 16 Oct 2011 05:36:28 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFPwR-0008RL-VQ
	for xen-devel@lists.xensource.com; Sun, 16 Oct 2011 05:35:48 -0700
X-Env-Sender: davidoftheold@gmail.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1318768544!20661331!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6456 invoked from network); 16 Oct 2011 12:35:44 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Oct 2011 12:35:44 -0000
Received: by bke17 with SMTP id 17so4945606bke.30
	for <xen-devel@lists.xensource.com>;
	Sun, 16 Oct 2011 05:35:44 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=mime-version:sender:from:date:x-google-sender-auth:message-id
	:subject:to:content-type;
	bh=z9ioFXdq7WgUEaHNuPXr4TxJpjIrQOnvRfIkU/JoyBY=;
	b=POF9FLbPTDQxnVcY7wqqjvINahKfl+qa6Dg2nkHK4oFUHKcWfTU3M3RaMhVH9hZ0YD
	ZgmiytIT9hv/5VEGzBZ+gPHg9r+AV0hsXfkgMWXYnq2VA+05YDlAUlod0aLervVZRhq2
	y66naE+r2z/lOWTEmuAaePIq0pPQGEbvRyJrA=
Received: by 10.223.7.18 with SMTP id b18mr17405476fab.31.1318768543107; Sun,
	16 Oct 2011 05:35:43 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.223.58.73 with HTTP; Sun, 16 Oct 2011 05:35:23 -0700 (PDT)
From: David Della Vecchia <ddv@darkholdings.com>
Date: Sun, 16 Oct 2011 08:35:23 -0400
X-Google-Sender-Auth: tkiVaN60scsMmFeAmLXkaTOG0pU
Message-ID: <CAEGWhjEEMwaP4U4LWxmbQB2vK2zkRuN0zNf7_aZ7EWc2abm7zA@mail.gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] Missing blktap(2) driver in
	kernel-2.6.32-*.el6.xendom0.x86_64.rpm
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============1691922112=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1691922112==
Content-Type: multipart/alternative; boundary=0015174784ee8d897e04af69ba8a

--0015174784ee8d897e04af69ba8a
Content-Type: text/plain; charset=ISO-8859-1

I'm not sure if this belongs here, but someone in the ##xen channel in
irc.freenode.net told me to message this list and let people know about
and/or inquire as to why the blktap (or better yet blktap2) driver is not
included in M A Young's aforementioned kernels, blkbackend is there but it
does not allow for tap:aio disks in the domU's.

Thanks,
David

--0015174784ee8d897e04af69ba8a
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

I&#39;m not sure if this belongs here, but someone in the ##xen channel in =
<a href=3D"http://irc.freenode.net">irc.freenode.net</a> told me to message=
 this list and let people know about and/or inquire as to why the blktap (o=
r better yet blktap2) driver is not included in M A Young&#39;s aforementio=
ned kernels, blkbackend is there but it does not allow for tap:aio disks in=
 the domU&#39;s.<div>

<br></div><div>Thanks,</div><div>David=A0</div>

--0015174784ee8d897e04af69ba8a--


--===============1691922112==
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

--===============1691922112==--


From xen-devel-bounces@lists.xensource.com Sun Oct 16 10:46:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 16 Oct 2011 10:46:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFUn7-0000XA-8f; Sun, 16 Oct 2011 10:46:29 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFUmN-0000Je-7a
	for xen-devel@lists.xensource.com; Sun, 16 Oct 2011 10:45:43 -0700
X-Env-Sender: K.Brink@cs.ru.nl
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318787139!21795736!1
X-Originating-IP: [131.174.16.143]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15360 invoked from network); 16 Oct 2011 17:45:40 -0000
Received: from smeltpunt.science.ru.nl (HELO smeltpunt.science.ru.nl)
	(131.174.16.143)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Oct 2011 17:45:40 -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 p9GHjRo1027858; 
	Sun, 16 Oct 2011 19:45:27 +0200 (MEST)
Date: Sun, 16 Oct 2011 19:45:27 +0200
From: Kasper Brink <K.Brink@cs.ru.nl>
To: Samuel Thibault <samuel.thibault@ens-lyon.org>
Subject: Re: [Xen-devel] pv-grub Solaris support
Message-ID: <20111016174527.GA4445@lilo2.science.ru.nl>
References: <20111012204011.GA7518@lilo2.science.ru.nl>
	<20111013003832.GR4326@type.famille.thibault.fr>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111013003832.GR4326@type.famille.thibault.fr>
User-Agent: Mutt/1.5.20 (2009-06-14)
X-Spam-Score: -1.536 () ALL_TRUSTED,AWL,BAYES_50
X-Scanned-By: MIMEDefang 2.63 on 131.174.16.143
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

Hello  Samuel,

On Thu, Oct 13, 2011 at 02:38:32AM +0200, Samuel Thibault wrote:
> > The attached patch has been tested with various
> > Solaris versions (Solaris 11 Express, OpenIndiana 151a, OpenSolaris 134,
> > Nexenta Core 3.0.1; all 64-bit). I appreciate your feedback.
> 
> Could you also check that Linux configurations also still work?

I can confirm that pv-grub with the Solaris patch still works correctly for
Linux domUs. This was tested with the following distributions: Debian 6.0,
Ubuntu 11.10 Server, Fedora 15, and CentOS 6 (all 64-bit).

For each of these domains I used a whole-disk block device (xvda), and let
the OS installer create a partition structure on it (which is probably not
how you would typically do it with pygrub, but for pv-grub this is more
convenient). I tested both a layout with a single (ext3) partition, and
with a separate /boot partition (ext2 and ext3). I didn't notice any
differences between the unpatched and patched versions of pv-grub when
booting these domains.

Incidentally, I was pleasantly surprised that the installers of all the
mentioned distributions work just fine in a PV domU, with the exception of
Ubuntu 11.10 (for which I had to manually add Xen modules to the initrd).
For the others, I just added the installer iso as device "xvdb", booted into
the grubdom commandline, located the kernel and initrd via tab-completion,
booted these, and was then able to do the installation as normal. 

Kasper

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Oct 16 13:18:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 16 Oct 2011 13:18:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFXAY-0005cn-DU; Sun, 16 Oct 2011 13:18:50 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFX9m-0005QF-Lj
	for xen-devel@lists.xensource.com; Sun, 16 Oct 2011 13:18:03 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318796279!1293959!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1145 invoked from network); 16 Oct 2011 20:17:59 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Oct 2011 20:17:59 -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 3478A12FC;
	Sun, 16 Oct 2011 23:17:58 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id BFD9A200F0; Sun, 16 Oct 2011 23:17:57 +0300 (EEST)
Date: Sun, 16 Oct 2011 23:17:57 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: David Della Vecchia <ddv@darkholdings.com>
Subject: Re: [Xen-devel] Missing blktap(2) driver in
	kernel-2.6.32-*.el6.xendom0.x86_64.rpm
Message-ID: <20111016201757.GT12984@reaktio.net>
References: <CAEGWhjEEMwaP4U4LWxmbQB2vK2zkRuN0zNf7_aZ7EWc2abm7zA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAEGWhjEEMwaP4U4LWxmbQB2vK2zkRuN0zNf7_aZ7EWc2abm7zA@mail.gmail.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen-devel@lists.xensource.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 Sun, Oct 16, 2011 at 08:35:23AM -0400, David Della Vecchia wrote:
>    I'm not sure if this belongs here, but someone in the ##xen channel in
>    [1]irc.freenode.net told me to message this list and let people know about
>    and/or inquire as to why the blktap (or better yet blktap2) driver is not
>    included in M A Young's aforementioned kernels, blkbackend is there but it
>    does not allow for tap:aio disks in the domU's.
>    Thanks,

Hello,

Added Michael as CC ..

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Oct 16 13:46:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 16 Oct 2011 13:46:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFXbF-0006Ys-2J; Sun, 16 Oct 2011 13:46:25 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFXaQ-0006ME-U3
	for xen-devel@lists.xensource.com; Sun, 16 Oct 2011 13:45:35 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318797931!346002!1
X-Originating-IP: [129.234.248.1]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2306 invoked from network); 16 Oct 2011 20:45:31 -0000
Received: from hermes1.dur.ac.uk (HELO hermes1.dur.ac.uk) (129.234.248.1)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 16 Oct 2011 20:45:31 -0000
Received: from smtphost4.dur.ac.uk (smtphost4.dur.ac.uk [129.234.252.4])
	by hermes1.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9GKjFPu027309
	for <xen-devel@lists.xensource.com>; Sun, 16 Oct 2011 21:45:19 +0100
Received: from vega-c.dur.ac.uk (vega-c.dur.ac.uk [129.234.250.135])
	by smtphost4.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9GKj1ou007756
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO)
	for <xen-devel@lists.xensource.com>; Sun, 16 Oct 2011 21:45:01 +0100
Received: from vega-c.dur.ac.uk (localhost [127.0.0.1])
	by vega-c.dur.ac.uk (8.14.3/8.11.1) with ESMTP id p9GKj1xq001006
	for <xen-devel@lists.xensource.com>; Sun, 16 Oct 2011 21:45:01 +0100
Received: from localhost (dcl0may@localhost)
	by vega-c.dur.ac.uk (8.14.3/8.14.3/Submit) with ESMTP id p9GKj1Xm001002
	for <xen-devel@lists.xensource.com>; Sun, 16 Oct 2011 21:45:01 +0100
Date: Sun, 16 Oct 2011 21:45:00 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: xen-devel@lists.xensource.com
Message-ID: <alpine.DEB.2.00.1110162117190.27361@vega-c.dur.ac.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-509437451-1318797901=:27361"
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9GKjFPu027309
Subject: [Xen-devel] [PATCH] Improve GPT support in pygrub
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--8323329-509437451-1318797901=:27361
Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII

This patch is part of a fix I applied to Fedora 16 to get pygrub to boot 
a Fedora 16 guest (see https://bugzilla.redhat.com/show_bug.cgi?id=745335 
). By default Fedora 16 installs a Bios boot partition as the first GPT 
partition to contain grub2 boot code, and the grub2 configuration files 
are in the GPT second partition. Pygrub currently only checks the first 
partition, so the attached patch tells it to check all the GPT partitions 
for grub configuration.

 	Michael Young
--8323329-509437451-1318797901=:27361
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=pygrub.gpt.patch
Content-Transfer-Encoding: BASE64
Content-Description: 
Content-Disposition: attachment; filename=pygrub.gpt.patch

Q2hlY2sgYWxsIEdQVCBwYXJ0aXRpb25zIGZvciBncnViIGNvbmZpZ3VyYXRp
b24sIG5vdCBqdXN0IHRoZSBmaXJzdA0KU2lnbmVkLW9mZi1ieTogTWljaGFl
bCBZb3VuZyA8bS5hLnlvdW5nQGR1cmhhbS5hYy51az4NCg0KLS0tIGEvdG9v
bHMvcHlncnViL3NyYy9weWdydWIJMjAxMS0xMC0xNiAyMDo1ODowMi4wMDAw
MDAwMDAgKzAxMDANCisrKyBiL3Rvb2xzL3B5Z3J1Yi9zcmMvcHlncnViCTIw
MTEtMTAtMTYgMjA6NTk6NTIuMDAwMDAwMDAwICswMTAwDQpAQCAtNzgsOSAr
NzgsMTcgQEANCiBkZWYgZ2V0X2ZzX29mZnNldF9ncHQoZmlsZSk6DQogICAg
IGZkID0gb3Mub3BlbihmaWxlLCBvcy5PX1JET05MWSkNCiAgICAgIyBhc3N1
bWUgdGhlIGZpcnN0IHBhcnRpdGlvbiBpcyBhbiBFRkkgc3lzdGVtIHBhcnRp
dGlvbi4NCi0gICAgb3MubHNlZWsoZmQsIFNFQ1RPUl9TSVpFICogMiwgMCkN
CisgICAgb3MubHNlZWsoZmQsIFNFQ1RPUl9TSVpFLCAwKQ0KICAgICBidWYg
PSBvcy5yZWFkKGZkLCA1MTIpDQotICAgIHJldHVybiBzdHJ1Y3QudW5wYWNr
KCI8USIsIGJ1ZlszMjo0MF0pWzBdICogU0VDVE9SX1NJWkUNCisgICAgcGFy
dGNvdW50ID0gc3RydWN0LnVucGFjaygiPEwiLCBidWZbODA6ODRdKVswXQ0K
KyAgICBwYXJ0c2l6ZSA9IHN0cnVjdC51bnBhY2soIjxMIiwgYnVmWzg0Ojg4
XSlbMF0NCisgICAgaSA9IHBhcnRjb3VudA0KKyAgICBvZmZzZXRzID0gW10N
CisgICAgd2hpbGUgaT4wOg0KKyAgICAgICAgYnVmID0gb3MucmVhZChmZCwg
cGFydHNpemUpDQorICAgICAgICBvZmZzZXRzLmFwcGVuZChzdHJ1Y3QudW5w
YWNrKCI8USIsIGJ1ZlszMjo0MF0pWzBdICogU0VDVE9SX1NJWkUpDQorICAg
ICAgICBpIC09IDENCisgICAgcmV0dXJuIG9mZnNldHMNCiANCiBGRElTS19Q
QVJUX1NPTEFSSVM9MHhiZg0KIEZESVNLX1BBUlRfU09MQVJJU19PTEQ9MHg4
Mg0KQEAgLTExNCw3ICsxMjIsOSBAQA0KICAgICAgICAgICAgICAgICBjb250
aW51ZSAjIG5vIHNvbGFyaXMgbWFnaWMgYXQgdGhhdCBvZmZzZXQsIGlnbm9y
ZSBwYXJ0aXRpb24NCiANCiAgICAgICAgIGlmIHR5cGUgPT0gRkRJU0tfUEFS
VF9HUFQ6DQotICAgICAgICAgICAgb2Zmc2V0ID0gZ2V0X2ZzX29mZnNldF9n
cHQoZmlsZSkNCisgICAgICAgICAgICBmb3Igb2Zmc2V0IGluIGdldF9mc19v
ZmZzZXRfZ3B0KGZpbGUpOg0KKyAgICAgICAgICAgICAgICBwYXJ0X29mZnMu
YXBwZW5kKG9mZnNldCkNCisgICAgICAgICAgICBicmVhaw0KIA0KICAgICAg
ICAgIyBBY3RpdmUgcGFydGl0aW9uIGhhcyAweDgwIGFzIHRoZSBmaXJzdCBi
eXRlLg0KICAgICAgICAgIyBJZiBhY3RpdmUsIHByZXBlbmQgdG8gZnJvbnQg
b2YgbGlzdCwgb3RoZXJ3aXNlIGFwcGVuZCB0byBiYWNrLg0K

--8323329-509437451-1318797901=:27361
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-509437451-1318797901=:27361--


From xen-devel-bounces@lists.xensource.com Sun Oct 16 20:41:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 16 Oct 2011 20:41:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFe4k-0000lJ-1D; Sun, 16 Oct 2011 20:41:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFe4B-0000Yh-8U
	for xen-devel@lists.xensource.com; Sun, 16 Oct 2011 20:40:43 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318822839!35487883!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7709 invoked from network); 17 Oct 2011 03:40:40 -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;
	17 Oct 2011 03:40:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,356,1315180800"; 
   d="scan'208";a="8413224"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 03:40: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; Mon, 17 Oct 2011 04:40:39 +0100
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 1RFe47-0005bd-7Z;
	Mon, 17 Oct 2011 03:40:39 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RFe46-0003PN-Vi;
	Mon, 17 Oct 2011 04:40:39 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9344-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 17 Oct 2011 04:40:39 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9344: 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 9344 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9344/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf      7 debian-install               fail pass in 9343
 test-amd64-amd64-xl-sedf   14 guest-localmigrate/x10 fail in 9343 pass in 9342

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 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-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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  6880bfc48504
baseline version:
 xen                  6880bfc48504

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 Oct 17 00:41:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 00:41:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFhpM-0007Kd-Mk; Mon, 17 Oct 2011 00:41:40 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFhof-000789-SL
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 00:40:58 -0700
X-Env-Sender: pbonzini@redhat.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318837254!417304!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9134 invoked from network); 17 Oct 2011 07:40:54 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-3.tower-21.messagelabs.com with SMTP;
	17 Oct 2011 07:40:54 -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 p9H7erB8005357
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <xen-devel@lists.xensource.com>; Mon, 17 Oct 2011 03:40:53 -0400
Received: from yakj.usersys.redhat.com (ovpn-112-16.ams2.redhat.com
	[10.36.112.16])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9H7epEb025179
	for <xen-devel@lists.xensource.com>; Mon, 17 Oct 2011 03:40:52 -0400
From: Paolo Bonzini <pbonzini@redhat.com>
To: xen-devel@lists.xensource.com
Date: Mon, 17 Oct 2011 09:40:49 +0200
Message-Id: <1318837249-19483-1-git-send-email-pbonzini@redhat.com>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
Subject: [Xen-devel] (no subject)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


Writing [PATCH] netback: disable features not supported by netfront ...
ntent-Transfer-Encoding: 7bit
Subject: [PATCH] netback: disable features not supported by netfront
X-Mercurial-Node: eb896361fc70b60b9a257d0c82e19633a11b9d41
Message-Id: <eb896361fc70b60b9a25.1318837062@yakj.usersys.redhat.com>
User-Agent: Mercurial-patchbomb/1.9.1
Date: Mon, 17 Oct 2011 09:37:42 +0200
From: pbonzini@redhat.com
To: pbonzini@redhat.com

# HG changeset patch
# User Paolo Bonzini <pbonzini@redhat.com>
# Date 1318837036 -7200
# Node ID eb896361fc70b60b9a257d0c82e19633a11b9d41
# Parent  3c900d6a5f6a51ff1547f21fef30ab8b92feccc9
netback: disable features not supported by netfront

Netback works by first setting all possible features, and then
resetting some after connection, if the front-end didn't negotiate them.
Except that in the old 2.6.18 tree the "resetting" part was missing.
In the pvops tree, this should work correctly through the fix_features
mechanism.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

diff --git a/drivers/xen/netback/interface.c b/drivers/xen/netback/interface.c
--- a/drivers/xen/netback/interface.c
+++ b/drivers/xen/netback/interface.c
@@ -98,8 +98,9 @@ static int netbk_change_mtu(struct net_d
 void netif_set_features(netif_t *netif)
 {
 	struct net_device *dev = netif->dev;
-	int features = dev->features;
+	int features;
 
+	features = dev->features & ~(NETIF_F_SG|NETIF_F_TSO|NETIF_F_IP_CSUM);
 	if (netif->can_sg)
 		features |= NETIF_F_SG;
 	if (netif->gso)



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 00:42:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 00:42:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFhqY-0007qO-So; Mon, 17 Oct 2011 00:42:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFhpG-0007IM-37
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 00:41:34 -0700
X-Env-Sender: pbonzini@redhat.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1318837290!418596!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17762 invoked from network); 17 Oct 2011 07:41:30 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-4.tower-21.messagelabs.com with SMTP;
	17 Oct 2011 07:41:30 -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 p9H7fU3U019644
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <xen-devel@lists.xensource.com>; Mon, 17 Oct 2011 03:41:30 -0400
Received: from yakj.usersys.redhat.com (ovpn-112-16.ams2.redhat.com
	[10.36.112.16])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9H7fSpw024027; Mon, 17 Oct 2011 03:41:29 -0400
From: Paolo Bonzini <pbonzini@redhat.com>
To: xen-devel@lists.xensource.com, pbonzini@redhat.com
Date: Mon, 17 Oct 2011 09:41:26 +0200
Message-Id: <eb896361fc70b60b9a25.1318837062@yakj.usersys.redhat.com>
X-Mercurial-Node: eb896361fc70b60b9a257d0c82e19633a11b9d41
User-Agent: Mercurial-patchbomb/1.9.1
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
Cc: 
Subject: [Xen-devel] [PATCH] netback: disable features not supported by
	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: pbonzini@redhat.com

# HG changeset patch
# User Paolo Bonzini <pbonzini@redhat.com>
# Date 1318837036 -7200
# Node ID eb896361fc70b60b9a257d0c82e19633a11b9d41
# Parent  3c900d6a5f6a51ff1547f21fef30ab8b92feccc9
netback: disable features not supported by netfront

Netback works by first setting all possible features, and then
resetting some after connection, if the front-end didn't negotiate them.
Except that in the old 2.6.18 tree the "resetting" part was missing.
In the pvops tree, this should work correctly through the fix_features
mechanism.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

diff --git a/drivers/xen/netback/interface.c b/drivers/xen/netback/interface.c
--- a/drivers/xen/netback/interface.c
+++ b/drivers/xen/netback/interface.c
@@ -98,8 +98,9 @@ static int netbk_change_mtu(struct net_d
 void netif_set_features(netif_t *netif)
 {
 	struct net_device *dev = netif->dev;
-	int features = dev->features;
+	int features;
 
+	features = dev->features & ~(NETIF_F_SG|NETIF_F_TSO|NETIF_F_IP_CSUM);
 	if (netif->can_sg)
 		features |= NETIF_F_SG;
 	if (netif->gso)



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 01:22:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 01:22:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFiSP-0001id-Lm; Mon, 17 Oct 2011 01:22:01 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFiRS-0001VT-0J
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 01:21:02 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318839628!59437588!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2004 invoked from network); 17 Oct 2011 08:20:28 -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; 17 Oct 2011 08:20:28 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 17 Oct 2011 09:20:58 +0100
Message-Id: <4E9C0186020000780005B9B0@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 17 Oct 2011 09:20:54 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: <pbonzini@redhat.com>
Subject: Re: [Xen-devel] [PATCH] netback: disable features not
	supported by netfront
References: <eb896361fc70b60b9a25.1318837062@yakj.usersys.redhat.com>
In-Reply-To: <eb896361fc70b60b9a25.1318837062@yakj.usersys.redhat.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 17.10.11 at 09:41, Paolo Bonzini <pbonzini@redhat.com> wrote:
> From: pbonzini@redhat.com=20
>=20
> # HG changeset patch
> # User Paolo Bonzini <pbonzini@redhat.com>
> # Date 1318837036 -7200
> # Node ID eb896361fc70b60b9a257d0c82e19633a11b9d41
> # Parent  3c900d6a5f6a51ff1547f21fef30ab8b92feccc9
> netback: disable features not supported by netfront
>=20
> Netback works by first setting all possible features, and then
> resetting some after connection, if the front-end didn't negotiate them.
> Except that in the old 2.6.18 tree the "resetting" part was missing.

Indeed - I always wondered about that. Applied, thanks!

Jan

> In the pvops tree, this should work correctly through the fix_features
> mechanism.
>=20
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>=20
> diff --git a/drivers/xen/netback/interface.c b/drivers/xen/netback/interf=
ace.c
> --- a/drivers/xen/netback/interface.c
> +++ b/drivers/xen/netback/interface.c
> @@ -98,8 +98,9 @@ static int netbk_change_mtu(struct net_d
>  void netif_set_features(netif_t *netif)
>  {
>  	struct net_device *dev =3D netif->dev;
> -	int features =3D dev->features;
> +	int features;
> =20
> +	features =3D dev->features & ~(NETIF_F_SG|NETIF_F_TSO|NETIF_F_IP_CS=
UM);
>  	if (netif->can_sg)
>  		features |=3D NETIF_F_SG;
>  	if (netif->gso)
>=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 Mon Oct 17 01:52:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 01:52:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFivT-0002lR-B0; Mon, 17 Oct 2011 01:52:03 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFiuf-0002YW-TA
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 01:51:14 -0700
X-Env-Sender: tglx@linutronix.de
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318841441!53073590!1
X-Originating-IP: [62.245.132.108]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30537 invoked from network); 17 Oct 2011 08:50:41 -0000
Received: from www.linutronix.de (HELO Galois.linutronix.de) (62.245.132.108)
	by server-7.tower-27.messagelabs.com with AES256-SHA encrypted SMTP;
	17 Oct 2011 08:50:41 -0000
Received: from localhost ([127.0.0.1]) by Galois.linutronix.de with esmtps
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.72)
	(envelope-from <tglx@linutronix.de>)
	id 1RFiuZ-0000uW-0a; Mon, 17 Oct 2011 10:51:07 +0200
Date: Mon, 17 Oct 2011 10:51:06 +0200 (CEST)
From: Thomas Gleixner <tglx@linutronix.de>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
In-Reply-To: <1318713254.11016.52.camel@dagon.hellion.org.uk>
Message-ID: <alpine.LFD.2.02.1110171049440.3240@ionos>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
	<1317668908.11991.20.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110032229250.1489@ionos>
	<1318001583.21903.355.camel@zakaz.uk.xensource.com> 
	<alpine.LFD.2.02.1110071822160.3240@ionos>
	<1318251990.21903.433.camel@zakaz.uk.xensource.com>
	<1318598637.21903.889.camel@zakaz.uk.xensource.com>
	<1318713254.11016.52.camel@dagon.hellion.org.uk>
User-Agent: Alpine 2.02 (LFD 1266 2009-07-14)
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-Linutronix-Spam-Score: -1.0
X-Linutronix-Spam-Level: -
X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,
	SHORTCIRCUIT=-0.0001
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	linux-kernel <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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Sat, 15 Oct 2011, Ian Campbell wrote:

> On Fri, 2011-10-14 at 14:23 +0100, Ian Campbell wrote:
> > Ping? The original issue has made it into longterm-2.6.32.y and then
> > onto Debian (bug #644604) so people keep asking me about it...
> 
> Sorry, the previous version had a warning in it (was missing the return
> type for resume_irqs), fixed up version follows.
> 
> I noticed that the backport to longterm 2.6.32 won't work since syscore
> isn't available back then. I think one approach for the backport would
> be to call irq_pm_syscore_resume() directly from sysdev_resume(), does
> that sound sensible?

I think so. Can you please add a description (or the five lines patch)
for the stable folks to the changelog, so they don't have to dig
around ?
 
Thanks,

	tglx

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 02:26:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 02:26:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFjSa-0003fT-UZ; Mon, 17 Oct 2011 02:26:18 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFjRU-0003S3-Nn
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 02:25:09 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1318843505!1352535!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9896 invoked from network); 17 Oct 2011 09:25: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;
	17 Oct 2011 09:25:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,358,1315180800"; 
   d="scan'208";a="8417741"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 09:25: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, 17 Oct 2011 10:25:04 +0100
Subject: Re: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Thomas Gleixner <tglx@linutronix.de>
Date: Mon, 17 Oct 2011 10:25:03 +0100
In-Reply-To: <alpine.LFD.2.02.1110171049440.3240@ionos>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
	<1317668908.11991.20.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110032229250.1489@ionos>
	<1318001583.21903.355.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110071822160.3240@ionos>
	<1318251990.21903.433.camel@zakaz.uk.xensource.com>
	<1318598637.21903.889.camel@zakaz.uk.xensource.com>
	<1318713254.11016.52.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110171049440.3240@ionos>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318843504.16132.1.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	linux-kernel <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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 2011-10-17 at 09:51 +0100, Thomas Gleixner wrote:
> On Sat, 15 Oct 2011, Ian Campbell wrote:
> 
> > On Fri, 2011-10-14 at 14:23 +0100, Ian Campbell wrote:
> > > Ping? The original issue has made it into longterm-2.6.32.y and then
> > > onto Debian (bug #644604) so people keep asking me about it...
> > 
> > Sorry, the previous version had a warning in it (was missing the return
> > type for resume_irqs), fixed up version follows.
> > 
> > I noticed that the backport to longterm 2.6.32 won't work since syscore
> > isn't available back then. I think one approach for the backport would
> > be to call irq_pm_syscore_resume() directly from sysdev_resume(), does
> > that sound sensible?
> 
> I think so. Can you please add a description (or the five lines patch)
> for the stable folks to the changelog, so they don't have to dig
> around ?

If you are happy with the mainline version I'll send out a backported
version to stable@.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 02:40:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 02:40:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFjgV-0004Qh-5I; Mon, 17 Oct 2011 02:40:39 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFjfU-0004Dz-TC
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 02:39:37 -0700
X-Env-Sender: tglx@linutronix.de
X-Msg-Ref: server-15.tower-216.messagelabs.com!1318844373!1353421!1
X-Originating-IP: [62.245.132.108]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7364 invoked from network); 17 Oct 2011 09:39:33 -0000
Received: from www.linutronix.de (HELO Galois.linutronix.de) (62.245.132.108)
	by server-15.tower-216.messagelabs.com with AES256-SHA encrypted
	SMTP; 17 Oct 2011 09:39:33 -0000
Received: from localhost ([127.0.0.1]) by Galois.linutronix.de with esmtps
	(TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.72)
	(envelope-from <tglx@linutronix.de>)
	id 1RFjfP-0001Eq-SD; Mon, 17 Oct 2011 11:39:32 +0200
Date: Mon, 17 Oct 2011 11:39:30 +0200 (CEST)
From: Thomas Gleixner <tglx@linutronix.de>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
In-Reply-To: <1318843504.16132.1.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.LFD.2.02.1110171139040.3240@ionos>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
	<1317668908.11991.20.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110032229250.1489@ionos>
	<1318001583.21903.355.camel@zakaz.uk.xensource.com> 
	<alpine.LFD.2.02.1110071822160.3240@ionos>
	<1318251990.21903.433.camel@zakaz.uk.xensource.com>
	<1318598637.21903.889.camel@zakaz.uk.xensource.com>
	<1318713254.11016.52.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110171049440.3240@ionos>
	<1318843504.16132.1.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.02 (LFD 1266 2009-07-14)
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
X-Linutronix-Spam-Score: -1.0
X-Linutronix-Spam-Level: -
X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,
	SHORTCIRCUIT=-0.0001
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	linux-kernel <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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 17 Oct 2011, Ian Campbell wrote:

> On Mon, 2011-10-17 at 09:51 +0100, Thomas Gleixner wrote:
> > On Sat, 15 Oct 2011, Ian Campbell wrote:
> > 
> > > On Fri, 2011-10-14 at 14:23 +0100, Ian Campbell wrote:
> > > > Ping? The original issue has made it into longterm-2.6.32.y and then
> > > > onto Debian (bug #644604) so people keep asking me about it...
> > > 
> > > Sorry, the previous version had a warning in it (was missing the return
> > > type for resume_irqs), fixed up version follows.
> > > 
> > > I noticed that the backport to longterm 2.6.32 won't work since syscore
> > > isn't available back then. I think one approach for the backport would
> > > be to call irq_pm_syscore_resume() directly from sysdev_resume(), does
> > > that sound sensible?
> > 
> > I think so. Can you please add a description (or the five lines patch)
> > for the stable folks to the changelog, so they don't have to dig
> > around ?
> 
> If you are happy with the mainline version I'll send out a backported
> version to stable@.

Fine. I queue the other one for 3.2

Thanks,

	tglx

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:29:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:29:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkRa-0005d1-BK; Mon, 17 Oct 2011 03:29:18 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REI62-0006Ku-MF
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 03:01:04 -0700
X-Env-Sender: pasztor@linux.gyakg.u-szeged.hu
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318500059!832449!1
X-Originating-IP: [160.114.120.248]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10496 invoked from network); 13 Oct 2011 10:00:59 -0000
Received: from eos.fwall.u-szeged.hu (HELO eos.fwall.u-szeged.hu)
	(160.114.120.248)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 13 Oct 2011 10:00:59 -0000
Received: from [192.168.105.4] (helo=esym.fwall.u-szeged.hu)
	by eos.fwall.u-szeged.hu with esmtp (Exim 4.63)
	(envelope-from <pasztor@linux.gyakg.u-szeged.hu>) id 1REI5y-0006Op-NF
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 12:00:58 +0200
X-AuditID: a07278f7-b7f4c6d000001091-97-4e96b6da08af
Received: from eos.fwall.u-szeged.hu (eos.intra [192.168.105.3])
	by esym.fwall.u-szeged.hu (Symantec Messaging Gateway) with SMTP id
	E8.A8.04241.AD6B69E4; Thu, 13 Oct 2011 12:00:58 +0200 (CEST)
Received: from sagv5.gyakg.u-szeged.hu ([160.114.18.70])
	by eos.fwall.u-szeged.hu with esmtp (Exim 4.63)
	(envelope-from <pasztor@linux.gyakg.u-szeged.hu>) id 1REI5y-0006PP-Ij
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 12:00:58 +0200
Received: by linux.gyakg.u-szeged.hu (Postfix, from userid 1000)
	id 7AFC380099; Thu, 13 Oct 2011 12:00:58 +0200 (CEST)
Date: Thu, 13 Oct 2011 12:00:58 +0200
From: =?iso-8859-2?Q?P=C1SZTOR_Gy=F6rgy?= <pasztor@linux.gyakg.u-szeged.hu>
To: xen-devel@lists.xensource.com
Message-ID: <20111013100058.GF11846@linux.gyakg.u-szeged.hu>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="NzB8fVQJ5HfG6fxh"
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
User-Agent: Mutt/1.5.9i
X-SZTE-local: YES
X-SZTE-HU-local: YES
X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrOLMWRmVeSWpSXmKPExsVyYEUms+6tbdP8DPbf1LS4N+U9uwOjx/a+
	XewBjFFcNimpOZllqUX6dglcGdsPvWYrOCpdsaFxOmsD4zLxLkZODgkBE4mHTz+yQ9hiEhfu
	rWfrYuTiEBI4zCjRsKiJEcL5ySixds4hNpAqIYEKiVU/JjKB2CwCqhKH2nvAutkEvCVu79nB
	CmKLCChKrFv9jgXEFhYwk/i4/h5YPa+AjcSx8/uB5nAA2YISf3cIg4SZBawkdl3+ygwSZhaQ
	llj+jwMiLC/RvHU2WFhUQFxixk9PEFMCqHHxHD6Ii0UkFrx8xTSBUXAWwshZSEbOQhg5C8lI
	CFtHou3zQia8StQkpvR/YYOw3SW+zfkEFVeUmNL9kH0BI9cqRrHU4spcvbTyxJwcvVLd4qrU
	9NQUvYzSTYzAyFlQVPF9B+OZWXqHGAU4GJV4eBXcpvkJsSaWAbUcYpTgYFYS4TVKBwrxpiRW
	VqUW5ccXleakFh9iZOLglGpg7Mz3flQc8Cv8Z8jGv8WPvxVGXVui86arX23W0adds6ZE/M+/
	mBOR7HVj8ZHdH84rfrnzRaHxyPxlumr73aJ0kgwm38px3zx95wNL75f//GplsnYIR+XPnrDB
	p+MjwwoBx5zf8wu6flkzuV/Y8tfut8XHiCmqU95duSnM0KQSONHq7vSnvW/5tyuxFGckGmox
	FxUnAgATKQQbegIAAA==
X-SZTE-AVcheck: YES
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:16 -0700
Subject: [Xen-devel] [FWD] [Xen-users] Jumbo frame support for 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


--NzB8fVQJ5HfG6fxh
Content-Type: text/plain; charset=iso-8859-2
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

Hi,

I just got some hint, to forward my original mail to this list too.

Cheers,
----- Forwarded message from PÁSZTOR György <pasztor@linux.gyakg.u-szeged.hu> -----

Hi,

I had to use bridge interfaces with mtu other than 9000, so I started to
google for a solution. Then I found this thread:
http://web.archiveorange.com/archive/v/ZvO4j2ymSAvyo8GNrwhY

But, It didn't work, as the original author says.
I tried to find an easier way, to setup this, so as I found out: If you
configure a vif's mtu, the logical solution is to use the same mtu as the
bridge interface -> So I wrote a smaller, nicer, and... a working patch.

The "trick" is that, I don't use the xen's bridge creation scripts, I
preconfigure my bridge interfaces from my Debian configuration, far before
the xen things would start.
bridge entry from my /etc/network/interfaces:
auto br201
iface br201 inet static
	address 10.0.3.5
	netmask 255.255.0.0
	network 10.0.0.0
	broadcast 10.0.255.255
	mtu 9000
	bridge_ports bond0.201
	bridge_fd 0
	bridge_maxwait 0

This iface config pre-creates the vlan if on my bonding if, creates the
bridge, add the bond.vlan into my bridge interface, and every mtu is OK,
until xen starts...
Then, with my patched xen scripts,... work again, still, whatever you want:
It's just work! ;-)

Use it wise, and for your own risk!

The patch:

diff -urN /etc/xen/scripts.orig/vif-bridge /etc/xen/scripts/vif-bridge
--- /etc/xen/scripts.orig/vif-bridge	2011-04-14 15:24:51.000000000 +0200
+++ /etc/xen/scripts/vif-bridge	2011-10-12 18:13:13.873102049 +0200
@@ -82,6 +82,7 @@
 case "$command" in
     online)
 	setup_bridge_port "$vif"
+	set_vif_mtu "$vif" "$(get_if_mtu $bridge)"
 	add_to_bridge "$bridge" "$vif"
         ;;
 
diff -urN /etc/xen/scripts.orig/xen-network-common.sh /etc/xen/scripts/xen-network-common.sh
--- /etc/xen/scripts.orig/xen-network-common.sh	2010-06-21 15:46:02.000000000 +0200
+++ /etc/xen/scripts/xen-network-common.sh	2011-10-12 18:07:00.456909410 +0200
@@ -116,3 +116,19 @@
     ip link set ${dev} up
 }
 
+get_if_mtu () {
+    local dev=$1
+    local line
+    ip link show $dev | \
+	( read line
+	line="${line##*mtu }"
+	line="${line%% *}"
+	echo $line
+	cat >/dev/null )
+}
+
+set_vif_mtu () {
+    local vif=$1
+    local mtu=$2
+    ip link set "$vif" mtu "$mtu"
+}

Cheers!


_______________________________________________
Xen-users mailing list
Xen-users@lists.xensource.com
http://lists.xensource.com/xen-users

----- End forwarded message -----

--NzB8fVQJ5HfG6fxh
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="xen-bridge-fix-mtu.patch.gz"
Content-Transfer-Encoding: base64

H4sICNC8lU4CA3hlbi1icmlkZ2UtZml4LW10dS5wYXRjaACNUn9vgjAQ/dt+igtjia4rtIio
LC58gn2CJYRBVSJSwo9tieO77zpwIep0DemV13fvLveapOs1sKZ8AVvWsf0pc7uKy7SoK0uV
6cZ+T9fsrUyTjTwjDO4IY+ymwMjhQjDuMuGCmPmO68+ExY8LKHc4J5TSa4U6DcGZcEAsfDHF
z1rMpwKT3WWvEQTAFs6jBxT3OQQBgTiqJBhmrPb7KE8MSHMCeqk8S3M5ITCqZN0UYVclLFRZ
Ix3rGoTqqxCP4b5uehDDeINoD5pd2sRAnShJwlr1QsjrDsZRDY7r6YkASW5MHwGWy/pDlTum
e1e5VW3P53ORdsWTi3w9Ws64xxyh7XE9nzv/s+dPuYFTfO5zbrkzb8mXruADp4TwHqdAdRDL
H7P0SgtAZ3aAswfzkMj3FpqCQItDo4PJjydwIFQnZCqOMkDiyhRDRPvb/f9KbtUHmMiEL3hF
e8dQyijpiSMdVoZ50PHu7kEXaY0T/P4eHn5AGW8VmH1mHNXwbKOunTdZBhNCW0IJHb6e03YR
P2kXWSvTOWlYHh8jdE8Qd0OrfwPucr5EvQMAAA==

--NzB8fVQJ5HfG6fxh
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

--NzB8fVQJ5HfG6fxh--


From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:30:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:30:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkSp-00060u-Rm; Mon, 17 Oct 2011 03:30:35 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REPZS-0001rm-Kr
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 11:00:03 -0700
X-Env-Sender: andres.lagarcavilla@gmail.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1318528791!29157113!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2199 invoked from network); 13 Oct 2011 17:59:51 -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;
	13 Oct 2011 17:59:51 -0000
Received: by wwf27 with SMTP id 27so1837755wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 13 Oct 2011 10:59:51 -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=jqO9DHVgRHj4Zgo4turHWQCwZ8tbxgbPvayo3GpgIVI=;
	b=pDaM5B8hEiYEjiztJCa2CIs1cG5ubFyBTYbxyVMccqm8xG3uvtfv9B2on+mfKGavdN
	RspXFgzZ3llKVwP0mRYAKgCTz+XLjWfsuXTLVWPcOZsgaeE0aTmC3Anr2HVbUmCtiamS
	bQS94scqWQEYAw3RtPH69MhOI3FFGO4schIio=
MIME-Version: 1.0
Received: by 10.216.157.131 with SMTP id o3mr265094wek.48.1318528791162; Thu,
	13 Oct 2011 10:59:51 -0700 (PDT)
Received: by 10.216.51.198 with HTTP; Thu, 13 Oct 2011 10:59:50 -0700 (PDT)
In-Reply-To: <20111013150229.GJ44937@ocelot.phlegethon.org>
References: <CADzFZPsJ2--PQCVH1QGJ-L1q5k4bokBrZeaaAt=BSD7QU9cbOA@mail.gmail.com>
	<20111010092111.GB31800@ocelot.phlegethon.org>
	<CADzFZPscgJ6TWXNjyeEjbOnMrEpCE7zS6BTGxfJ+yibpz-Ds_w@mail.gmail.com>
	<20111013150229.GJ44937@ocelot.phlegethon.org>
Date: Thu, 13 Oct 2011 13:59:50 -0400
X-Google-Sender-Auth: a8iM3TGHhzN0keC2Sl0wVhzEqpc
Message-ID: <CADzFZPusJN7e2jG147q68RA3ZQ1PGs-xFNk+jjLRDAR7xboVjQ@mail.gmail.com>
Subject: Re: [Xen-devel] Re: Re: mapping problems in xenpaging
From: Andres Lagar Cavilla <andres@lagarcavilla.org>
To: Tim Deegan <tim@xen.org>, Keir Fraser <keir.xen@gmail.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:16 -0700
Cc: Olaf Hering <olaf@aepfle.de>, xen-devel@lists.xensource.com,
	zhen shi <bickys1986@gmail.com>, Adin Scannell <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

Good stuff Tim, let me summarize:


- The key is to obtain exclusive access to a p2m entry, or range [gfn,
gfn + 1<<order). This exclusive access lasts beyond the actual lookup,
until the caller is finished with modifications, to prevent the p2m
mapping changing underfoot.

- bits for either fine-grain locks or refcounts need to be set aside.
Stuffing those bits in actual p2m entries will be very error prone/not
possible, given all existing implementations (NPT+IOMMU, 32bit, etc).
So, we're stuck with extra space overhead for a fine-grained p2m
concurrency control structure.

- Unless the recount collapses into the page_info struct. Even then
there is a critical section "get p2m_entry then get_page" that needs
to execute atomically.

- foreign mappings can block p2m actions for arbitrarily long. This
doesn't usually happen, but the risk is latent. This is "hard to
solve", for now.

question 1: I still don't see the need for refcounts. If you want to
prevent changes underfoot, you need to lock the entry, and that's it.
In all the cases you explained, somebody would have to wait until the
refcount on the entry drops to reflect they are the only holder. This
is akin to being locked out.

question 2: although internal hypervisor code paths do not seem to act
on unaligned p2m ranges, external calls (e.g. MEMF_populate_on_demand)
could possibly pass unaligned ranges. These complicate fine-grain
concurrency. Should we fail those? With so many toolstacks out there,
I feel very hesitant.

question 3: is there any way to know a priori the max gfn a domain
will have? Can we pre-allocate the concurrency control structure as
opposed to demand allocating it?

suggestion 1: bake exclusive access in the current calls. A p2m
lookup, followed by a p2m set_entry, delimit a critical section for
that range of p2m mappings. p2m lookups without closing set_entry will
have to issue a call to drop exclusive access on the range of
mappings.

suggestion 2: limit fine granularity (if locking, not refcounting), to
2MB superpages. Saves space. 512 neighbours can surely coexist without
locking each other out :)

Thanks,
Andres

On Thu, Oct 13, 2011 at 11:02 AM, Tim Deegan <tim@xen.org> wrote:
> Hi,
>
> At 15:17 -0400 on 10 Oct (1318259867), Andres Lagar Cavilla wrote:
>> On Mon, Oct 10, 2011 at 5:21 AM, Tim Deegan <tim@xen.org> wrote:
>> > A few issues I can see with it:
>> > =A0- p2m lookups are on some very performance-sensitive paths
>> > =A0 (e.g. multiple times in any pagetable walk or instruction emulatio=
n
>> > =A0 in a HVM guest) so adding the rwlock might have a noticeable impac=
t.
>> >
>> > =A0- This fixes one class of races (page gets freed-to-xen underfoot) =
but
>> > =A0 leaves another one (gfn -> mfn map changes underfoot) untouched. =
=A0In
>> > =A0 particular it doesn't solve the race where a foreign mapper
>> > =A0 gets a r/w map of what's meant to be a read-only frame.
>>
>> Can you elaborate a bit? Under what situations does the gfn->mfn map
>> change underfoot (other than sharing, paging in or superpage
>> sharding)? Wouldn't those two be taking a writer lock, and thus be
>> mutually ecxluded from lookups?
>
> Once CPU A has done a p2m lookup but before it is finished using the
> result (so, maybe it has established a mapping, or is about to establish
> a mapping, or is going to do some other thing like shadow a pagetable):
> =A0- CPU B might run a log-dirty clean that makes the pfn read-only.
> =A0 This is actually handled, for historical reasons, by having all
> =A0 possible callers be aware of log-dirty - that son't scale to
> =A0 all other p2m actions, though. :(
> =A0- CPU B might remove the p2m mapping entirely and free the page.
> =A0 This is the case that your suggestion handles, by holding
> =A0 a refcount on the old MFN.
> =A0- CPU B might make the page read-only so it can be shared with another
> =A0 VM.
> =A0- CPU B might move the MFN to another PFN (this happens with emulated
> =A0 video RAM, I believe).
>
>
>> > I think that to fix things properly we need to have some refcount
>> > associated with the p2m mapping itself. =A0That would be taken by all
>> > lookups (or at least some - we could have a flag to the p2m lookup) an=
d
>> > released as you suggest, but more importantly it would block all p2m c=
hanges
>> > while the count was raised. =A0(I think that a least in the common cas=
e we
>> > could encode such a refcount using the existing typecount).
>>
>> Assuming mapping means "entry in p2m", multiple mappings would have
>> their ref count collapse in the page typecount. Isn't that a problem?
>
> It might be. =A0I think the only case where multiple p2m mappings point t=
o
> the same MFN is page-sharing, which is already a special case; but it
> might make sense to have the refcounts per-pfn anyway, just for
> clarity.
>
>> Do we need per-mapping refcounts, or rather, per mapping mutual
>> exclusion? My feel is that page refcounts are necessary to prevent the
>> page from disappearing, and mappings need to have their lookups and
>> modifications synchronized.
>>
>> > One problem then is how to make all the callers of the p2m update
>> > functions handle failure, either by waiting (new deadlock risk?) or
>> > returning EAGAIN at the hypercall interface. =A0Paths where the update
>> > isn't caused by an explicit request (like log-dirty and the mem-event
>> > rx-to-rw conversion) would be particularly tricky.
>>
>> Callers already wait on lock_p2m. They'll wait longer :)
>
> :)
>
>> On failure, to cite a specific example, if paging was trying to swap
>> something out that got foreign-mapped by somebody else, then yeah,
>> there's no other option than failing that call.
>>
>> How would log-dirty and x^w fail (if the refcount increases before
>> they get exclusive access to the mapping)? They're not trying to
>> change the mapping and/or make a page go away, rather they're changing
>> the p2m permission.
>
> Good point. =A0But x^w would have to fail (or at least wait) if
> x86_emulate on another CPU was doing an instruction-fetch. =A0Otherwise
> there's a race where the page becomes writeable and is written to before
> the instruction fetch completes.
>
>> > More seriously, it introduces another round of the sort of priority
>> > inversion we already get with the existing refcounts - a foreign
>> > mapping, caused by a user-space program in another VM, could arbitrari=
ly
>> > delay a p2m update (and so prevent a VCPU from making progress), witho=
ut
>> > any mechanism to even request that the mapping be removed.
>>
>> Yeah, that's tricky. I do not know if there is a fix at all.
>> Fundamentally, the foreign mapper (some dom0 sharing/paging/foo
>> utility) is completely async to the domain. Even if we were to revoke
>> the foreign mapping as you suggest below, that would involve an upcall
>> into the foreign-mapper-guest-OS to have it cleanly neuter the mapping
>> and drop the refcount. That's not at all trivial! Perhaps foreign
>> mapping vma's should be taught to patiently re-establish mappings if
>> they disappear under their feet? Event then, you need to keep track of
>> those foreign l1e's, and nothing short of a list will do.
>>
>> Because this is performance rather than correctness I'm inclined to
>> not poke the beast.
>
> I'm inclined to agree. =A0Maybe the right thing to do is implement it and
> see whether serious problems arise.
>
>> >> I'm more wary that turning p2m locking into read/write will result in
>> >> code deadlocking itself: taking a read lock first and a write lock
>> >> later. Possibly the current rwlock implementation could be improved t=
o
>> >> keep a cpumask of read-lockers, and provide an atomic "promote from
>> >> read to write" atomic operation (something along the lines of wait
>> >> until you're the only reader in the cpumask, and then cmpxchg(lock,
>> >> -1, WRITE_BIAS))
>> >
>> > I think that would deadlock if two cpus tried it at once.
>>
>> If you keep a cpumask of all read lockers, and only try to promote if
>> you're the only read locker, it wouldn't. But then you'd have to
>> protect the cpumask from races with another spinlock. Yuk.
>
> If two CPUs both take read locks and both want to promote, they'll
> deadlock waiting for each other to go away.
>
>> Which brings me to another question: p2m_locked_by_me (and others)
>> check on the physical cpu (lock->holder =3D=3D curent->processor,
>> roughly). Well, what if you lock and then the vcpu migrates? Are vcpu
>> migrations prevented if you hold any locks? Or is there some other
>> magic going on?
>
> When that code was written, vcpus could not be preempted in the
> hypervisor (except in the scheduler softirq handler). =A0Now they can
> voluntarily preempt, but not while holding any locks, so it's still OK.
>
> Cheers,
>
> Tim.
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:32:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:32:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkUo-0006q8-Ko; Mon, 17 Oct 2011 03:32:38 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1REd5j-0003xw-UZ
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 01:26:08 -0700
X-Env-Sender: cyliu@suse.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1318580762!62713!1
X-Originating-IP: [137.65.248.33]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13703 invoked from network); 14 Oct 2011 08:26:03 -0000
Received: from novprvlin0050.provo.novell.com (HELO
	novprvlin0050.provo.novell.com) (137.65.248.33)
	by server-15.tower-21.messagelabs.com with SMTP;
	14 Oct 2011 08:26:03 -0000
Received: from INET-PRV1-MTA by novprvlin0050.provo.novell.com
	with Novell_GroupWise; Fri, 14 Oct 2011 02:26:02 -0600
Message-Id: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Fri, 14 Oct 2011 02:25:54 -0600
From: "Chun Yan Liu" <cyliu@suse.com>
To: <xen-devel@lists.xensource.com>
Subject: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part416E9502.0__="
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:15 -0700
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--=__Part416E9502.0__=
Content-Type: multipart/alternative; boundary="=__Part416E9502.1__="

--=__Part416E9502.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

Hi, List,

I'm trying xl create a pv guest with qcow/qcow2 image, it always fails at =
libxl_device_disk_local_attach.=20
#xl create pv_config_file
libxl: error: libxl.c:1119:libxl_device_disk_local_attach: cannot locally =
attach a qdisk image if the format is not raw
libxl: error: libxl_create.c:467:do_domain_create: failed to run bootloader=
: -3

disk configuration is:
disk=3D[ 'tap:qcow2:/var/lib/xen/images/sles11pv/disk0.qcow2,xvda,w', ]

Is there any way to make it work?

Thanks,
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel





--=__Part416E9502.1__=
Content-Type: text/html; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

<html><head><meta http-equiv=3DContent-Type content=3D"text/html; =
charset=3Dutf-8"><META name=3D"Author" content=3D"Novell GroupWise =
WebAccess"></head><body style=3D'font-family: Tahoma, sans-serif; =
font-size: 13px; '>Hi, List,<br><br>I'm trying xl create a pv guest with =
qcow/qcow2 image, it always fails at libxl_device_disk_local_attach. =
<br>#xl create pv_config_file<br>libxl: error: libxl.c:1119:libxl_device_di=
sk_local_attach: cannot locally attach a qdisk image if the format is not =
raw<br>libxl: error: libxl_create.c:467:do_domain_create: failed to run =
bootloader: -3<br><br>disk configuration is:<br>disk=3D[ 'tap:qcow2:/var/li=
b/xen/images/sles11pv/disk0.qcow2,xvda,w', ]<br><br>Is there any way to =
make it work?<br><br>Thanks,<br>___________________________________________=
____<br>Xen-devel mailing list<br>Xen-devel@lists.xensource.com<br><a =
class=3D"weblink" href=3D"http://lists.xensource.com/xen-devel" target=3D"b=
rowserView">http://lists.xensource.com/xen-devel</a><br><br><br><br></body>=
</html>

--=__Part416E9502.1__=--

--=__Part416E9502.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

--=__Part416E9502.0__=--


From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:33:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:33:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkVf-0007DR-38; Mon, 17 Oct 2011 03:33:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RDvrS-0008Ug-Cd
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 03:16:30 -0700
X-Env-Sender: bp@amd64.org
X-Msg-Ref: server-5.tower-182.messagelabs.com!1318414587!16993096!1
X-Originating-IP: [87.106.30.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16908 invoked from network); 12 Oct 2011 10:16:27 -0000
Received: from s15228384.onlinehome-server.info (HELO mail.x86-64.org)
	(87.106.30.177) by server-5.tower-182.messagelabs.com with SMTP;
	12 Oct 2011 10:16:27 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.x86-64.org (Postfix) with ESMTP id AB36113D02;
	Wed, 12 Oct 2011 12:16:26 +0200 (CEST)
X-Virus-Scanned: Nedap ESD1 at mail.x86-64.org
Received: from mail.x86-64.org ([127.0.0.1])
	by localhost (s15228384.onlinehome-server.info [127.0.0.1])
	(amavisd-new, port 10024)
	with ESMTP id 5EBFrf3gcVMF; Wed, 12 Oct 2011 12:16:26 +0200 (CEST)
Received: from gwo.osrc.amd.com (gwo.osrc.amd.com [10.97.0.252])
	by mail.x86-64.org (Postfix) with ESMTP;
	Wed, 12 Oct 2011 12:16:26 +0200 (CEST)
Received: from aftab (aftab.osrc.amd.com [165.204.15.109])
	by gwo.osrc.amd.com (Postfix) with ESMTP id 49A7E49C1FF;
	Wed, 12 Oct 2011 11:16:26 +0100 (BST)
Date: Wed, 12 Oct 2011 12:16:16 +0200
From: Borislav Petkov <bp@amd64.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111012101615.GA14966@aftab>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E94E1E5.4070505@goop.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:16 -0700
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, Oct 11, 2011 at 08:40:05PM -0400, Jeremy Fitzhardinge wrote:
> Ping?
> 
> On 09/26/2011 11:17 AM, Jeremy Fitzhardinge 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.

Err,

wait a sec, last time the suggestion was that _because_ xen supports the
multiboot protocol, implementing an early solution would be even easier
for you:

http://marc.info/?l=linux-kernel&m=129667641316947&w=2

Why would a xen microcode solution would even be contingent on how
upstream Linux solves it (and when)?

AFAICT, you want to hand off the microcode image from the bootloader to
the hypervisor and update ucode there - no need for dom0 changes...

-- 
Regards/Gruss,
Boris.

Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach
GM: Alberto Bozzo
Reg: Dornach, Landkreis Muenchen
HRB Nr. 43632 WEEE Registernr: 129 19551

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:34:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03: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 1RFkWT-0007ab-Nl; Mon, 17 Oct 2011 03:34:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RE4kX-0008RN-Tp
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 12:45:58 -0700
X-Env-Sender: bp@amd64.org
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318448754!761439!1
X-Originating-IP: [87.106.30.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7482 invoked from network); 12 Oct 2011 19:45:54 -0000
Received: from s15228384.onlinehome-server.info (HELO mail.x86-64.org)
	(87.106.30.177) by server-14.tower-216.messagelabs.com with SMTP;
	12 Oct 2011 19:45:54 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.x86-64.org (Postfix) with ESMTP id 9B67F13DD7;
	Wed, 12 Oct 2011 21:45:54 +0200 (CEST)
X-Virus-Scanned: Nedap ESD1 at mail.x86-64.org
Received: from mail.x86-64.org ([127.0.0.1])
	by localhost (s15228384.onlinehome-server.info [127.0.0.1])
	(amavisd-new, port 10024)
	with ESMTP id OvBpjLBkQPWH; Wed, 12 Oct 2011 21:45:54 +0200 (CEST)
Received: from gwo.osrc.amd.com (gwo.osrc.amd.com [10.97.0.252])
	by mail.x86-64.org (Postfix) with ESMTP;
	Wed, 12 Oct 2011 21:45:54 +0200 (CEST)
Received: from aftab (aftab.osrc.amd.com [165.204.15.109])
	by gwo.osrc.amd.com (Postfix) with ESMTP id 45E1F49C1FF;
	Wed, 12 Oct 2011 20:45:54 +0100 (BST)
Date: Wed, 12 Oct 2011 21:45:43 +0200
From: Borislav Petkov <bp@amd64.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111012194543.GD14966@aftab>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E95E7FE.6050302@goop.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:16 -0700
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 12, 2011 at 03:18:22PM -0400, Jeremy Fitzhardinge wrote:
> While doing the whole boot time multiboot thing may offer some small
> hypothetical technical advantages, it has the significant cost of just
> complicating the whole deployment and use story.

You simply can't call the need to apply ucode as early as possible a
"hypothetical techical advantage." Other issues like how to handle ucode
images and how to put them together and how distros distribute them
and whether xen minimizes the amount of "specialness" or not are only
secondary.

-- 
Regards/Gruss,
Boris.

Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach
GM: Alberto Bozzo
Reg: Dornach, Landkreis Muenchen
HRB Nr. 43632 WEEE Registernr: 129 19551

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:35:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 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 1RFkXH-0007yR-2R; Mon, 17 Oct 2011 03:35:11 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RE6XM-0008Jf-8X
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 14:40:28 -0700
X-Env-Sender: bp@amd64.org
X-Msg-Ref: server-4.tower-27.messagelabs.com!1318455603!44229435!1
X-Originating-IP: [87.106.30.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8506 invoked from network); 12 Oct 2011 21:40:03 -0000
Received: from s15228384.onlinehome-server.info (HELO mail.x86-64.org)
	(87.106.30.177) by server-4.tower-27.messagelabs.com with SMTP;
	12 Oct 2011 21:40:03 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.x86-64.org (Postfix) with ESMTP id 98BFD13DD7;
	Wed, 12 Oct 2011 23:40:24 +0200 (CEST)
X-Virus-Scanned: Nedap ESD1 at mail.x86-64.org
Received: from mail.x86-64.org ([127.0.0.1])
	by localhost (s15228384.onlinehome-server.info [127.0.0.1])
	(amavisd-new, port 10024)
	with ESMTP id PDhAkK3qQRCg; Wed, 12 Oct 2011 23:40:24 +0200 (CEST)
Received: from gwo.osrc.amd.com (gwo.osrc.amd.com [10.97.0.252])
	by mail.x86-64.org (Postfix) with ESMTP;
	Wed, 12 Oct 2011 23:40:24 +0200 (CEST)
Received: from aftab (aftab.osrc.amd.com [165.204.15.109])
	by gwo.osrc.amd.com (Postfix) with ESMTP id 5110E49C1FF;
	Wed, 12 Oct 2011 22:40:24 +0100 (BST)
Date: Wed, 12 Oct 2011 23:40:13 +0200
From: Borislav Petkov <bp@amd64.org>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"H. Peter Anvin" <hpa@zytor.com>
Message-ID: <20111012214013.GD28723@aftab>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E960746.90805@zytor.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:16 -0700
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 12, 2011 at 05:31:50PM -0400, H. Peter Anvin wrote:
> On 10/12/2011 01:40 PM, Konrad Rzeszutek Wilk wrote:
> > Why is it paramount to do it as early as possible? As in, even doing
> > it before Linux kernel is invoked is preferred than during initrd runtime?
> 
> It is paramount to do it as early as possible *because the CPU is 
> broken*.  That's why there is a microcode update at all.  It is 
> *supposed* to be installed by BIOS, but for whatever reason it wasn't 
> (including user doesn't want to update the BIOS), so the very fact that 
> this is done in the OS at all is a bit of a fail.

Oh, that's easy: you know how OEMs support a platform for a while and
then move on to something new and stop updating BIOSen, including ucode
images contained in them?

Well, in that case, the OS is the last possible place where we want to
be able to apply the ucode. And, we want to apply it as _early_ _as_
_possible_. Bootloader doesn't cut it as hpa says below, so next comes
SMP cores bootup code. That's it.

> Doing it in the bootloader is messy because bootloaders typically
> aren't SMP-aware (and really shouldn't need to be), which leaves the
> OS. On native hardware it should ideally be done as early in the
> processor bringup as possible.

Yep.

-- 
Regards/Gruss,
Boris.

Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach
GM: Alberto Bozzo
Reg: Dornach, Landkreis Muenchen
HRB Nr. 43632 WEEE Registernr: 129 19551

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:36:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:36:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkY7-0008M8-Di; Mon, 17 Oct 2011 03:36:03 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RE7Rs-0005cS-IT
	for xen-devel@lists.xensource.com; Wed, 12 Oct 2011 15:38:52 -0700
X-Env-Sender: bp@amd64.org
X-Msg-Ref: server-5.tower-216.messagelabs.com!1318459129!768857!1
X-Originating-IP: [87.106.30.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1803 invoked from network); 12 Oct 2011 22:38:49 -0000
Received: from s15228384.onlinehome-server.info (HELO mail.x86-64.org)
	(87.106.30.177) by server-5.tower-216.messagelabs.com with SMTP;
	12 Oct 2011 22:38:49 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.x86-64.org (Postfix) with ESMTP id 5CA1A13DD7;
	Thu, 13 Oct 2011 00:38:48 +0200 (CEST)
X-Virus-Scanned: Nedap ESD1 at mail.x86-64.org
Received: from mail.x86-64.org ([127.0.0.1])
	by localhost (s15228384.onlinehome-server.info [127.0.0.1])
	(amavisd-new, port 10024)
	with ESMTP id gojJFWodHSO9; Thu, 13 Oct 2011 00:38:48 +0200 (CEST)
Received: from gwo.osrc.amd.com (gwo.osrc.amd.com [10.97.0.252])
	by mail.x86-64.org (Postfix) with ESMTP;
	Thu, 13 Oct 2011 00:38:48 +0200 (CEST)
Received: from aftab (aftab.osrc.amd.com [165.204.15.109])
	by gwo.osrc.amd.com (Postfix) with ESMTP id E432749C1FF;
	Wed, 12 Oct 2011 23:38:47 +0100 (BST)
Date: Thu, 13 Oct 2011 00:38:37 +0200
From: Borislav Petkov <bp@amd64.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111012223836.GA29740@aftab>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab> <4E96146C.5070701@goop.org>
	<4E9614AE.1060508@zytor.com> <4E9615B8.6010507@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9615B8.6010507@goop.org>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:16 -0700
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 12, 2011 at 06:33:28PM -0400, Jeremy Fitzhardinge wrote:
> On 10/12/2011 03:29 PM, H. Peter Anvin wrote:
> > On 10/12/2011 03:27 PM, Jeremy Fitzhardinge wrote:
> >>
> >> The current scheme has worked pretty well so far; there doesn't seem to
> >> be a huge concern about it.  Have there been actual observed failures
> >> with the current mechanism, or is the drive to make it earlier driven by
> >> an aesthetic desire to make it "as it should be"?
> >>
> >
> > Yes, there has.  There is at least one case where we have to print an
> > error message saying "update your BIOS" because our current microcode
> > update is too late.
> 
> Is that K8 errata 93 or something else?

AFAIR, that was an Atom erratum fix.

-- 
Regards/Gruss,
Boris.

Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach
GM: Alberto Bozzo
Reg: Dornach, Landkreis Muenchen
HRB Nr. 43632 WEEE Registernr: 129 19551

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:36:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:36:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkZ1-0000HD-GI; Mon, 17 Oct 2011 03:36:59 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1REFHv-0005vs-5t
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:01:42 -0700
X-Env-Sender: bp@amd64.org
X-Msg-Ref: server-3.tower-216.messagelabs.com!1318489262!812648!1
X-Originating-IP: [87.106.30.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8852 invoked from network); 13 Oct 2011 07:01:02 -0000
Received: from s15228384.onlinehome-server.info (HELO mail.x86-64.org)
	(87.106.30.177) by server-3.tower-216.messagelabs.com with SMTP;
	13 Oct 2011 07:01:02 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.x86-64.org (Postfix) with ESMTP id AD05613D2F;
	Thu, 13 Oct 2011 09:01:01 +0200 (CEST)
X-Virus-Scanned: Nedap ESD1 at mail.x86-64.org
Received: from mail.x86-64.org ([127.0.0.1])
	by localhost (s15228384.onlinehome-server.info [127.0.0.1])
	(amavisd-new, port 10024)
	with ESMTP id 4jj06Swbttao; Thu, 13 Oct 2011 09:01:01 +0200 (CEST)
Received: from gwo.osrc.amd.com (gwo.osrc.amd.com [10.97.0.252])
	by mail.x86-64.org (Postfix) with ESMTP;
	Thu, 13 Oct 2011 09:01:01 +0200 (CEST)
Received: from aftab (aftab.osrc.amd.com [165.204.15.109])
	by gwo.osrc.amd.com (Postfix) with ESMTP id 7673B49C108;
	Thu, 13 Oct 2011 08:01:01 +0100 (BST)
Date: Thu, 13 Oct 2011 09:00:50 +0200
From: Borislav Petkov <bp@amd64.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Message-ID: <20111013070050.GA501@aftab>
References: <4E95E7FE.6050302@goop.org> <20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E96198F.4030906@zytor.com> <4E962581.2000605@goop.org>
	<4E9628D4.1000605@zytor.com> <4E962A27.4090509@goop.org>
	<4E962AE6.1060505@zytor.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E962AE6.1060505@zytor.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:16 -0700
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 12, 2011 at 08:03:50PM -0400, H. Peter Anvin wrote:
> On 10/12/2011 05:00 PM, Jeremy Fitzhardinge wrote:
> >
> > Presumably we'd want some way to make all possible microcode files
> > available to the hypervisor/kernel so that there's no need to construct
> > the bootloader config for a specific CPU vendor (or worse, CPU model).
> > So that would need either some way of specifying multiple files, or a
> > wrapper which can contain multiple files?
> >
> 
> I have been thinking a "bundle" format with a per-vendor header followed 
> by the microcode in the appropriate format for each vendor.

Yes, makes sense. Keep it as simple as possible.

-- 
Regards/Gruss,
Boris.

Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach
GM: Alberto Bozzo
Reg: Dornach, Landkreis Muenchen
HRB Nr. 43632 WEEE Registernr: 129 19551

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:37:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:37:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkZn-0000fD-0o; Mon, 17 Oct 2011 03:37:47 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1REFnr-0008Mq-D4
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 00:34:07 -0700
X-Env-Sender: bp@amd64.org
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318491244!35060852!1
X-Originating-IP: [87.106.30.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9657 invoked from network); 13 Oct 2011 07:34:04 -0000
Received: from s15228384.onlinehome-server.info (HELO mail.x86-64.org)
	(87.106.30.177) by server-10.tower-174.messagelabs.com with SMTP;
	13 Oct 2011 07:34:04 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.x86-64.org (Postfix) with ESMTP id F3FF513D2F;
	Thu, 13 Oct 2011 09:34:03 +0200 (CEST)
X-Virus-Scanned: Nedap ESD1 at mail.x86-64.org
Received: from mail.x86-64.org ([127.0.0.1])
	by localhost (s15228384.onlinehome-server.info [127.0.0.1])
	(amavisd-new, port 10024)
	with ESMTP id mjN93ULaZvck; Thu, 13 Oct 2011 09:34:03 +0200 (CEST)
Received: from gwo.osrc.amd.com (gwo.osrc.amd.com [10.97.0.252])
	by mail.x86-64.org (Postfix) with ESMTP;
	Thu, 13 Oct 2011 09:34:03 +0200 (CEST)
Received: from aftab (aftab.osrc.amd.com [165.204.15.109])
	by gwo.osrc.amd.com (Postfix) with ESMTP id A2A7349C108;
	Thu, 13 Oct 2011 08:34:03 +0100 (BST)
Date: Thu, 13 Oct 2011 09:33:52 +0200
From: Borislav Petkov <bp@amd64.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Message-ID: <20111013073352.GB501@aftab>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E96198F.4030906@zytor.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E96198F.4030906@zytor.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:16 -0700
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.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>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 12, 2011 at 06:49:51PM -0400, H. Peter Anvin wrote:
> The stickiest part of all of this is where to leave the microcode so the 
> kernel can get to it way early.  We could use the linked list, but that 
> would mean bootloader enabling;

Yep, started looking at that and it means grub legacy and grub2 enabling
at least.

> another idea was to stick it as a prefix 
> to the initramfs identified by a signature.

https://bugzilla.redhat.com/show_bug.cgi?id=179127

with the patch there you can do

initrd /initramfs-image1.gz /initramfs-image2.gz

which is exactly what we want.

Bottomline is, extending initrd handling to deal with multiple initrd
images might turn out to be easier to do than the linked list deal.

-- 
Regards/Gruss,
Boris.

Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach
GM: Alberto Bozzo
Reg: Dornach, Landkreis Muenchen
HRB Nr. 43632 WEEE Registernr: 129 19551

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:38:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:38:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkaY-00012d-Dz; Mon, 17 Oct 2011 03:38:34 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1REI2V-0005sn-SD
	for xen-devel@lists.xensource.com; Thu, 13 Oct 2011 02:57:24 -0700
X-Env-Sender: bp@amd64.org
X-Msg-Ref: server-12.tower-182.messagelabs.com!1318499840!21975219!1
X-Originating-IP: [87.106.30.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25503 invoked from network); 13 Oct 2011 09:57:20 -0000
Received: from s15228384.onlinehome-server.info (HELO mail.x86-64.org)
	(87.106.30.177) by server-12.tower-182.messagelabs.com with SMTP;
	13 Oct 2011 09:57:20 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.x86-64.org (Postfix) with ESMTP id 5EB4D13D2F;
	Thu, 13 Oct 2011 11:57:20 +0200 (CEST)
X-Virus-Scanned: Nedap ESD1 at mail.x86-64.org
Received: from mail.x86-64.org ([127.0.0.1])
	by localhost (s15228384.onlinehome-server.info [127.0.0.1])
	(amavisd-new, port 10024)
	with ESMTP id trVzlcsqdZDE; Thu, 13 Oct 2011 11:57:20 +0200 (CEST)
Received: from gwo.osrc.amd.com (gwo.osrc.amd.com [10.97.0.252])
	by mail.x86-64.org (Postfix) with ESMTP;
	Thu, 13 Oct 2011 11:57:20 +0200 (CEST)
Received: from aftab (aftab.osrc.amd.com [165.204.15.109])
	by gwo.osrc.amd.com (Postfix) with ESMTP id 0D2AC49C108;
	Thu, 13 Oct 2011 10:57:20 +0100 (BST)
Date: Thu, 13 Oct 2011 11:57:08 +0200
From: Borislav Petkov <bp@amd64.org>
To: "H. Peter Anvin" <hpa@zytor.com>
Message-ID: <20111013095708.GA1862@aftab>
References: <4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E96198F.4030906@zytor.com> <20111013073352.GB501@aftab>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111013073352.GB501@aftab>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:16 -0700
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.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>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
 update in Xen dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 13, 2011 at 03:33:52AM -0400, Borislav Petkov wrote:
> Bottomline is, extending initrd handling to deal with multiple initrd
> images might turn out to be easier to do than the linked list deal.

Alternatively and IMHO, we could avoid the bootloader enabling by
making the ucode part of the initramfs and pull up some of the
prepare_namespace() work in kernel_init() before smp_init() so that we
can have it ready for when bootstrapping the cores.

-- 
Regards/Gruss,
Boris.

Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach
GM: Alberto Bozzo
Reg: Dornach, Landkreis Muenchen
HRB Nr. 43632 WEEE Registernr: 129 19551

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:39:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:39:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkbJ-0001Q4-Ve; Mon, 17 Oct 2011 03:39:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REmPd-0007yO-BJ
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 11:23:17 -0700
X-Env-Sender: fbcyborg@gmail.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1318616593!1078571!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21850 invoked from network); 14 Oct 2011 18:23:14 -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 Oct 2011 18:23:14 -0000
Received: by vws13 with SMTP id 13so2181162vws.30
	for <xen-devel@lists.xensource.com>;
	Fri, 14 Oct 2011 11:23:13 -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=NI01Dxz/0xQJ0yNpYtASejT58bES4b5YeslqfaKJaXc=;
	b=iC56mtHN7Lgg2+1M8lwn/N5wk3c0QDcFumNZYl7/z5rJIbocn8RS85UOAImKiyrz69
	luaUjvmFKuyktZN2AZWNesYxEYdZp6XZ8AeKnVH8yWMtenIy0BbFkiZ8UNXwlyh/XzuE
	1ZmVQIwQXhPalTmoIJEJIWpD2JV4VhohLObB0=
Received: by 10.52.32.195 with SMTP id l3mr10077612vdi.30.1318616593110; Fri,
	14 Oct 2011 11:23:13 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.52.187.133 with HTTP; Fri, 14 Oct 2011 11:22:53 -0700 (PDT)
In-Reply-To: <CAP8Jb=qm=kjU8cyCU+G9sht6NqeNyFK+R-P-41bkOiha1iGhYw@mail.gmail.com>
References: <CAP8Jb=rKu5RFW0tuvHtD819Dz6Jy2HB5OT-d86T1tEk2OP=dtA@mail.gmail.com>
	<CAP8Jb=pX3mq7vebZ+CKGyh-YM+QH0Vr+Fphaqug_bEgNGLafBg@mail.gmail.com>
	<1315907178.2892.7.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qfMa1c8w10inO_gt6-RCscaAsdQ_SyjTxfjSuTAfDMOw@mail.gmail.com>
	<1316001435.2892.24.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qrdraJ0c7CLEYEug2nQjxCTvokfGQB4CjNgaacON_DPg@mail.gmail.com>
	<1316007936.2892.35.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=rabtnD05T2ZQdkzw47ZkctYXMcEbrLPj_0LJHWyLegFw@mail.gmail.com>
	<1316009344.2892.38.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qm=kjU8cyCU+G9sht6NqeNyFK+R-P-41bkOiha1iGhYw@mail.gmail.com>
From: Flavio <fbcyborg@gmail.com>
Date: Fri, 14 Oct 2011 20:22:53 +0200
Message-ID: <CAP8Jb=o1j2=e85J_aCab=zr7hyxU5VHVtuFUOyNBkrki8eA2hQ@mail.gmail.com>
Subject: Re: [Xen-devel] Help with the migration to XEN-4.1 please
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:16 -0700
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

Hello,

Here again with a similar problem, when the xen_gntdev module is loaded:
Parsing config file /mnt/dati/xen/vmstore/gentoo-10.0/gentoo-10.0.x86-64.cfg
xenconsole: Could not read tty from store: No such file or directory
libxl: error: libxl_device.c:476:libxl__wait_for_device_model Device
Model not ready
xl: fatal error: libxl_create.c:535, rc=-1: libxl__confirm_device_model_startup

I don't know what happened but I've got that error starting the two linux domU
guest I have on my disk.

What has happened?

Flavio

On 14 September 2011 16:16, Flavio <fbcyborg@gmail.com> wrote:
> On 14 September 2011 16:09, Ian Campbell <Ian.Campbell@citrix.com> wrote:
>> On Wed, 2011-09-14 at 10:05 -0400, Flavio wrote:
>>
>>> xen be core: xen be core: can't open gnttab device
>>> can't open gnttab device
>>
>> This is probably the issue. You need /dev/xen/gntdev, I think you need
>> to enable CONFIG_XEN_GNTDEV.
> YESSSSSSSSSSSSS!
> Actually it was compiled as module but it wasn't running.
> Also the xen-gntalloc module is present but it is not running.
> Now, simply modprobing the xen-gntdev module, the vm has started, and
> the console is available!
> Only one problem now: the guest machine doesn't get any IP when dhcp runs.
>
>>
>>> > The file:/mnt/data/xen/vmstore/gentoo-10.0/gentoo-10.0.x86-64.img (and
>>> > the other one) is interesting.
>>> As you see I use loop files for the root filesystems.
>>
>> That's the thing -- you aren't, you are using img files.
> It was my mistake! I thought they were loop files too.
>
>> Under xend
>> these would be setup as loop devices for you but under xl you insteasd
>> get a userspace block backend (tap if it is available, qdisk from
>> qemu-d, if not).
> OK, now I understand.
>
> THANK YOU SO MUCH Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:40:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:40:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkc4-0001nT-19; Mon, 17 Oct 2011 03:40:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REqOJ-0001Lu-8U
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 15:38:11 -0700
X-Env-Sender: maxim.uvarov@oracle.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1318631886!168864!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5425 invoked from network); 14 Oct 2011 22:38:08 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-15.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	14 Oct 2011 22:38:08 -0000
Received: from ucsinet23.oracle.com (ucsinet23.oracle.com [156.151.31.71])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9EMc3qB004395
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Fri, 14 Oct 2011 22:38:04 GMT
Received: from acsmt358.oracle.com (acsmt358.oracle.com [141.146.40.158])
	by ucsinet23.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9EMc29i027848
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 22:38:02 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
	p9EMbuR2016858; Fri, 14 Oct 2011 17:37:56 -0500
Received: from maxim-desktop.us.oracle.com (/130.35.70.13)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 14 Oct 2011 15:37:55 -0700
From: Maxim Uvarov <maxim.uvarov@oracle.com>
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com, jeremy@goop.org
Date: Fri, 14 Oct 2011 15:36:50 -0700
Message-Id: <1318631811-21559-2-git-send-email-maxim.uvarov@oracle.com>
X-Mailer: git-send-email 1.7.4.1
In-Reply-To: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
References: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
X-Source-IP: ucsinet23.oracle.com [156.151.31.71]
X-CT-RefId: str=0001.0A090204.4E98B9CD.0039,ss=1,re=0.000,fgs=0
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:15 -0700
Cc: Maxim Uvarov <maxim.uvarov@oracle.com>
Subject: [Xen-devel] [PATCH 1/2] xen: Fix XEN_MAX_DOMAIN_MEMORY to be
	selectable
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 'int' parameter also needs a description. Otherwise
it cannot be selected by the user.

Signed-off-by: Maxim Uvarov <maxim.uvarov@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/x86/xen/Kconfig |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig
index 7cbcbd1..0b452c7 100644
--- a/arch/x86/xen/Kconfig
+++ b/arch/x86/xen/Kconfig
@@ -28,7 +28,7 @@ config XEN_PVHVM
 	depends on XEN && PCI && X86_LOCAL_APIC
 
 config XEN_MAX_DOMAIN_MEMORY
-       int
+       int "Maximum allowed size of a domain in gigabytes"
        default 128
        depends on XEN
        help
-- 
1.7.4.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:40:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:40:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkcq-0002AP-Fy; Mon, 17 Oct 2011 03:40:56 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REqOJ-0001Lt-8O
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 15:38:11 -0700
X-Env-Sender: maxim.uvarov@oracle.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1318631886!168863!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5426 invoked from network); 14 Oct 2011 22:38:08 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-15.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	14 Oct 2011 22:38:08 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9EMc3jI004394
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Fri, 14 Oct 2011 22:38:04 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9EMW1gZ012698
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 22:32:02 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
	p9EMbuuL024009; Fri, 14 Oct 2011 17:37:56 -0500
Received: from maxim-desktop.us.oracle.com (/130.35.70.13)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 14 Oct 2011 15:37:56 -0700
From: Maxim Uvarov <maxim.uvarov@oracle.com>
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com, jeremy@goop.org
Date: Fri, 14 Oct 2011 15:36:51 -0700
Message-Id: <1318631811-21559-3-git-send-email-maxim.uvarov@oracle.com>
X-Mailer: git-send-email 1.7.4.1
In-Reply-To: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
References: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090209.4E98B9CD.0060,ss=1,re=0.000,fgs=0
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:15 -0700
Cc: Maxim Uvarov <maxim.uvarov@oracle.com>
Subject: [Xen-devel] [PATCH 2/2] xen: Make XEN_MAX_DOMAIN_MEMORY have more
	sensible defaults for 32-bit builds
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 is that 128GB is not going to happen with 32-bit PV DomU.
Lets use something more realistic.

Signed-off-by: Maxim Uvarov <maxim.uvarov@oracle.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/x86/xen/Kconfig |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig
index 0b452c7..6d90ac8 100644
--- a/arch/x86/xen/Kconfig
+++ b/arch/x86/xen/Kconfig
@@ -29,7 +29,8 @@ config XEN_PVHVM
 
 config XEN_MAX_DOMAIN_MEMORY
        int "Maximum allowed size of a domain in gigabytes"
-       default 128
+       default 128 if X86_64
+       default 64 if X86_32
        depends on XEN
        help
          This only affects the sizing of some bss arrays, the unused
-- 
1.7.4.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:41:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:41:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkdd-0002Xz-9r; Mon, 17 Oct 2011 03:41:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REqOJ-0001Ls-7Y
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 15:38:11 -0700
X-Env-Sender: maxim.uvarov@oracle.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1318631886!160814!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32349 invoked from network); 14 Oct 2011 22:38:08 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-16.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	14 Oct 2011 22:38: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
	p9EMc2Wt004393
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 14 Oct 2011 22:38:04 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
	p9EMc11q024208
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 22:38:02 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
	p9EMbt2O012637; Fri, 14 Oct 2011 17:37:55 -0500
Received: from maxim-desktop.us.oracle.com (/130.35.70.13)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 14 Oct 2011 15:37:55 -0700
From: Maxim Uvarov <maxim.uvarov@oracle.com>
To: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com, jeremy@goop.org
Date: Fri, 14 Oct 2011 15:36:49 -0700
Message-Id: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
X-Mailer: git-send-email 1.7.4.1
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090209.4E98B9CD.004D:SCFMA922111,ss=1,re=-4.000,fgs=0
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:15 -0700
Cc: 
Subject: [Xen-devel] [PATCH] XEN_DOMAIN_MEMORY 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

Hello,

Please find here patches for XEN_MAX_DOMAIN_MEMORY:

[PATCH 1/2] xen: Fix XEN_MAX_DOMAIN_MEMORY to be selectable
[PATCH 2/2] xen: Make XEN_MAX_DOMAIN_MEMORY have more sensible defaults for 32-bit builds

Best regards,
Maxim Uvarov.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:42:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:42:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkeR-0002yE-O9; Mon, 17 Oct 2011 03:42:35 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RErH0-0002pn-KW
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 16:34:44 -0700
X-Env-Sender: maxim.uvarov@oracle.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1318635277!1089180!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16173 invoked from network); 14 Oct 2011 23:34:39 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-16.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 14 Oct 2011 23:34:39 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9ENYYQS017053
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Fri, 14 Oct 2011 23:34:36 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9ENSXpr026798
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Fri, 14 Oct 2011 23:28:34 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
	p9ENYRMZ018328; Fri, 14 Oct 2011 18:34:27 -0500
Received: from [130.35.70.13] (/130.35.70.13)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 14 Oct 2011 16:34:27 -0700
Message-ID: <4E98C6CE.4020508@oracle.com>
Date: Fri, 14 Oct 2011 16:33:34 -0700
From: Maxim Uvarov <maxim.uvarov@oracle.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.21) Gecko/20110831 Thunderbird/3.1.13
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
	<4E98BEF5.10801@goop.org>
In-Reply-To: <4E98BEF5.10801@goop.org>
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090209.4E98C70C.00D4,ss=1,re=0.000,fgs=0
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:15 -0700
Cc: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com
Subject: [Xen-devel] Re: [PATCH] XEN_DOMAIN_MEMORY 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 10/14/2011 04:00 PM, Jeremy Fitzhardinge wrote:
> On 10/14/2011 03:36 PM, Maxim Uvarov wrote:
>> Hello,
>>
>> Please find here patches for XEN_MAX_DOMAIN_MEMORY:
>>
>> [PATCH 1/2] xen: Fix XEN_MAX_DOMAIN_MEMORY to be selectable
>> [PATCH 2/2] xen: Make XEN_MAX_DOMAIN_MEMORY have more sensible defaults for 32-bit builds
>
> What's the rationale?
>
>      J

The first patch is actually bug fix. You can not define just "int" 
without description in Kconfig. As the result this option will not be 
visible in menuconfig. Even if you will change it in .config make 
oldconfig will set it up for default value. So you need to add any 
description to it as all others int options have.

Second patch is more optional and it's just suggestion to use for 32 bit 
more corresponding value.

Maxim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:43:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:43:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkfk-0003O6-S3; Mon, 17 Oct 2011 03:43:56 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1REsMo-0005O4-IW
	for xen-devel@lists.xensource.com; Fri, 14 Oct 2011 17:44:54 -0700
X-Env-Sender: maxim.uvarov@oracle.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318639482!970224!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3839 invoked from network); 15 Oct 2011 00:44:43 -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; 15 Oct 2011 00:44:43 -0000
Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67])
	by rcsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id
	p9F0icDo008702
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL);
	Sat, 15 Oct 2011 00:44:40 GMT
Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156])
	by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9F0caZH015694
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Sat, 15 Oct 2011 00:38:37 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
	p9F0iUfi015372; Fri, 14 Oct 2011 19:44:30 -0500
Received: from [130.35.70.13] (/130.35.70.13)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Fri, 14 Oct 2011 17:44:30 -0700
Message-ID: <4E98D739.4000705@oracle.com>
Date: Fri, 14 Oct 2011 17:43:37 -0700
From: Maxim Uvarov <maxim.uvarov@oracle.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.21) Gecko/20110831 Thunderbird/3.1.13
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
	<4E98BEF5.10801@goop.org> <4E98C6CE.4020508@oracle.com>
	<4E98C8B1.20304@goop.org>
In-Reply-To: <4E98C8B1.20304@goop.org>
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet24.oracle.com [156.151.31.67]
X-CT-RefId: str=0001.0A090201.4E98D778.012C,ss=1,re=0.000,fgs=0
X-Mailman-Approved-At: Mon, 17 Oct 2011 03:28:15 -0700
Cc: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	konrad.wilk@oracle.com
Subject: [Xen-devel] Re: [PATCH] XEN_DOMAIN_MEMORY 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 10/14/2011 04:41 PM, Jeremy Fitzhardinge wrote:
> On 10/14/2011 04:33 PM, Maxim Uvarov wrote:
>> On 10/14/2011 04:00 PM, Jeremy Fitzhardinge wrote:
>>> On 10/14/2011 03:36 PM, Maxim Uvarov wrote:
>>>> Hello,
>>>>
>>>> Please find here patches for XEN_MAX_DOMAIN_MEMORY:
>>>>
>>>> [PATCH 1/2] xen: Fix XEN_MAX_DOMAIN_MEMORY to be selectable
>>>> [PATCH 2/2] xen: Make XEN_MAX_DOMAIN_MEMORY have more sensible
>>>> defaults for 32-bit builds
>>>
>>> What's the rationale?
>>>
>>>       J
>>
>> The first patch is actually bug fix. You can not define just "int"
>> without description in Kconfig. As the result this option will not be
>> visible in menuconfig. Even if you will change it in .config make
>> oldconfig will set it up for default value. So you need to add any
>> description to it as all others int options have.
>
> No, that was deliberate, because I don't really think there's a need to
> change it.
>

 From that point of view it's not clear why this option is still in Kconfig?

Jeremy, can you please share more details about this? I see people are 
having troubles with this option and in different kernels I see 
different work arounds  for it. For example:
http://lists.xensource.com/archives/html/xen-devel/2011-01/msg01841.html

Maxim.
>>
>> Second patch is more optional and it's just suggestion to use for 32
>> bit more corresponding value.
>
> While it would be very silly to put 128GB of actual RAM on a 32-bit
> machine, systems can have non-contiguous RAM placed at high addresses,
> which would no longer be accessible.
>
>      J


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 03:55:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 03:55:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFkrO-00048t-2v; Mon, 17 Oct 2011 03:55:58 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFkqa-0003vk-5E
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 03:55:08 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-16.tower-21.messagelabs.com!1318848904!416572!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7471 invoked from network); 17 Oct 2011 10:55:04 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-16.tower-21.messagelabs.com with SMTP;
	17 Oct 2011 10:55:04 -0000
Received: from [213.136.142.250] (account d.faggioli@sssup.it HELO
	[192.168.0.3]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72453242; Mon, 17 Oct 2011 12:54:55 +0200
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
From: Dario Faggioli <raistlin@linux.it>
To: Chun Yan Liu <cyliu@suse.com>
Date: Mon, 17 Oct 2011 12:54:45 +0200
In-Reply-To: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
References: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
Face: 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
X-Mailer: Evolution 3.0.3 (3.0.3-1.fc15) 
Message-ID: <1318848895.25056.19.camel@Palantir>
Mime-Version: 1.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>
Content-Type: multipart/mixed; boundary="===============1339726873=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============1339726873==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-1BH3TEuZ2uB9bqnMGVJb"


--=-1BH3TEuZ2uB9bqnMGVJb
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, 2011-10-14 at 02:25 -0600, Chun Yan Liu wrote:
> Hi, List,
>
Hi,

> disk configuration is:
> disk=3D[ 'tap:qcow2:/var/lib/xen/images/sles11pv/disk0.qcow2,xvda,w', ]
>
> Is there any way to make it work?
>
I'm using this and it's working for me:

disk =3D [ 'format=3Dqcow2, vdev=3Dhda, access=3Drw, target=3D/root/xen/VMs=
/debian_squeeze_amd64_standard.qcow2' ]

For more info you can check here
"docs/misc/xl-disk-configuration.txt" (if you happen to have the sources
handy).

Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-1BH3TEuZ2uB9bqnMGVJb
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk6cCXUACgkQk4XaBE3IOsRsLgCgludv9WN5Gz1HMdofSIp5QMxz
gfYAnj6rMYcPoxMO53E+gviICc+n7fSq
=VwNK
-----END PGP SIGNATURE-----

--=-1BH3TEuZ2uB9bqnMGVJb--



--===============1339726873==
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

--===============1339726873==--



From xen-devel-bounces@lists.xensource.com Mon Oct 17 04:05:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 04:05:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFl0Z-0004pZ-EY; Mon, 17 Oct 2011 04:05:27 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFkur-0004Uf-3s
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 04:00:16 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318849137!59467912!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22748 invoked from network); 17 Oct 2011 10:58:57 -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;
	17 Oct 2011 10:58:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,358,1315180800"; 
   d="scan'208";a="8420454"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 10:59:27 +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, 17 Oct 2011 11:59:27 +0100
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: Mon, 17 Oct 2011 11:59:27 +0100
In-Reply-To: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
References: <4E988CC30200006600005222@novprvlin0050.provo.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: <1318849167.16132.5.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-10-14 at 09:25 +0100, Chun Yan Liu wrote:
> Hi, List,
> 
> I'm trying xl create a pv guest with qcow/qcow2 image, it always fails
> at libxl_device_disk_local_attach. 
> #xl create pv_config_file
> libxl: error: libxl.c:1119:libxl_device_disk_local_attach: cannot
> locally attach a qdisk image if the format is not raw
> libxl: error: libxl_create.c:467:do_domain_create: failed to run
> bootloader: -3

Unfortunately non-raw disks are currently incompatible with using pygrub
in xl.

I expect that the correct solution would be to patch
libxl_device_disk_local_attach() to start qemu-nbd and make that device
available in the local domain.

Ian.

> 
> disk configuration is:
> disk=[ 'tap:qcow2:/var/lib/xen/images/sles11pv/disk0.qcow2,xvda,w', ]
> 
> Is there any way to make it work?
> 
> 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 Mon Oct 17 04:37:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 04:37:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFlVF-0002GX-6R; Mon, 17 Oct 2011 04:37:09 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFlUa-00023d-9f
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 04:36:28 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318851384!1382436!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16936 invoked from network); 17 Oct 2011 11:36: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; 17 Oct 2011 11:36:24 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 17 Oct 2011 12:36:24 +0100
Message-Id: <4E9C2F52020000780005BA4C@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 17 Oct 2011 12:36:18 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-2-git-send-email-konrad.wilk@oracle.com>
In-Reply-To: <1318260494-27985-2-git-send-email-konrad.wilk@oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: hch@infradead.org, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org
Subject: [Xen-devel] Re: [PATCH 1/3] xen/blkback: Support 'feature-barrier'
	aka old-style BARRIER requests.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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.10.11 at 17:28, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> =
wrote:
> @@ -481,6 +503,10 @@ static void __end_block_io_op(struct pending_req=20
> *pending_req, int error)
>  			      pending_req->operation, pending_req->status);=

>  		xen_blkif_put(pending_req->blkif);
>  		free_req(pending_req);
> +		if (atomic_read(&pending_req->blkif->refcnt) <=3D 2) {
> +			if (atomic_read(&pending_req->blkif->drain))
> +				complete(&pending_req->blkif->drain_complet=
e);
> +		}

Shouldn't this be done *before* the call the free_req()? Or
alternatively a local copy of pending_req->blkif be obtained before
freeing pending_req (which could be used in a couple more places
in this function)?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 05:28:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 05:28:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFmId-0003b3-5N; Mon, 17 Oct 2011 05:28:11 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFmHg-0003Nu-7x
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 05:27:12 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1318854428!19793792!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7488 invoked from network); 17 Oct 2011 12:27:09 -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; 17 Oct 2011 12:27:09 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 17 Oct 2011 13:27:08 +0100
Message-Id: <4E9C3B39020000780005BA5D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 17 Oct 2011 13:27:05 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-2-git-send-email-konrad.wilk@oracle.com>
In-Reply-To: <1318260494-27985-2-git-send-email-konrad.wilk@oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: hch@infradead.org, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org
Subject: [Xen-devel] Re: [PATCH 1/3] xen/blkback: Support 'feature-barrier'
	aka old-style BARRIER requests.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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.10.11 at 17:28, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> =
wrote:
> We emulate the barrier requests by draining the outstanding bio's
> and then sending the WRITE_FLUSH command. To drain the I/Os
> we use the refcnt that is used during disconnect to wait for all
> the I/Os before disconnecting from the frontend. We latch on its
> value and if it reaches either the threshold for disconnect or when
> there are no more outstanding I/Os, then we have drained all I/Os.
>=20
> Suggested-by: Christopher Hellwig <hch@infradead.org>
> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> ---
>  drivers/block/xen-blkback/blkback.c |   37 +++++++++++++++++++++++++++++=
++++-
>  drivers/block/xen-blkback/common.h  |    5 ++++
>  drivers/block/xen-blkback/xenbus.c  |   18 +++++++++++++++++
>  3 files changed, 58 insertions(+), 2 deletions(-)
>=20
> diff --git a/drivers/block/xen-blkback/blkback.c=20
> b/drivers/block/xen-blkback/blkback.c
> index e0dab61..184b133 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -452,6 +452,23 @@ static void xen_blk_discard(struct xen_blkif =
*blkif,=20
> struct blkif_request *req)
>  	make_response(blkif, req->id, req->operation, status);
>  }
> =20
> +static void xen_blk_drain_io(struct xen_blkif *blkif)
> +{
> +	atomic_set(&blkif->drain, 1);
> +	do {
> +		wait_for_completion_interruptible_timeout(
> +				&blkif->drain_complete, HZ);
> +
> +		if (!atomic_read(&blkif->drain))
> +			break;
> +		/* The initial value is one, and one refcnt taken at the
> +		 * start of the xen_blkif_schedule thread. */
> +		if (atomic_read(&blkif->refcnt) <=3D 2)
> +			break;

Shouldn't this test be done the very first thing in the loop? It looks
racy the way it's placed now, and it would incur a 1 sec stall if this
was the only request currently being processed (as no completion
of ane earlier request could signal completion).

Jan

> +	} while (!kthread_should_stop());
> +	atomic_set(&blkif->drain, 0);
> +}



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 06:24:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 06:24:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFnAk-00054r-Kr; Mon, 17 Oct 2011 06:24:06 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFn9o-0004rQ-CV
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 06:23:08 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318857784!35598212!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17042 invoked from network); 17 Oct 2011 13:23:05 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-4.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 17 Oct 2011 13:23:05 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 17 Oct 2011 14:23:04 +0100
Message-Id: <4E9C4855020000780005BA73@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 17 Oct 2011 14:23:01 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Konrad Rzeszutek Wilk" <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance
	discard support with secure erasing support.
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
	<4E940E21020000780005AA29@nat28.tlf.novell.com>
	<20111011155133.GC29349@phenom.oracle.com>
	<20111011205729.GB22668@phenom.oracle.com>
In-Reply-To: <20111011205729.GB22668@phenom.oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: "hch@infradead.org" <hch@infradead.org>, Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@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 11.10.11 at 22:57, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> =
wrote:
> --- a/drivers/block/xen-blkfront.c
> +++ b/drivers/block/xen-blkfront.c
>...
> @@ -705,7 +711,7 @@ static void blkif_free(struct blkfront_info *info, =
int suspend)
>  static void blkif_completion(struct blk_shadow *s)
>  {
>  	int i;

This function gets called for all types of requests, and hence must filter
discard ones now that what would be nr_segments can be non-zero,
e.g.

	if (s->req.operation =3D=3D BLKIF_OP_DISCARD)
		return;

Jan

> -	for (i =3D 0; i < s->req.nr_segments; i++)
> +	for (i =3D 0; i < s->req.u1.nr_segments; i++)
>  		gnttab_end_foreign_access(s->req.u.rw.seg[i].gref, 0, =
0UL);
>  }
> =20



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 06:25:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 06:25:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFnCI-0005U3-76; Mon, 17 Oct 2011 06:25:42 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFnAt-00056w-Ca
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 06:24:16 -0700
X-Env-Sender: jasonsmr@hotmail.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318857851!1395762!1
X-Originating-IP: [65.55.34.14]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7514 invoked from network); 17 Oct 2011 13:24:12 -0000
Received: from col0-omc1-s4.col0.hotmail.com (HELO
	col0-omc1-s4.col0.hotmail.com) (65.55.34.14)
	by server-8.tower-216.messagelabs.com with SMTP;
	17 Oct 2011 13:24:12 -0000
Received: from COL124-W22 ([65.55.34.8]) by col0-omc1-s4.col0.hotmail.com with
	Microsoft SMTPSVC(6.0.3790.4675); Mon, 17 Oct 2011 06:24:11 -0700
Message-ID: <COL124-W220B9C05F3248A74CE0B0CDAE40@phx.gbl>
X-Originating-IP: [85.74.214.26]
From: =?euc-kr?B?q7irp6ukq72r8yBKYXNvbiCr66vXq+mrpKvIIFJ1cHJpZ2h0?=
	<jasonsmr@hotmail.com>
To: <tyrolschool@kfa.biglobe.ne.jp>, <saiyo-va@valinux.co.jp>,
	<recruit11@wil.co.jp>, <wirwilj@fsuimail.ferris.edu>,
	<xen-devel@lists.xensource.com>, <wuyuan@msu.edu>, <yukie@hotmail.com>
Date: Mon, 17 Oct 2011 22:24:09 +0900
Importance: Normal
MIME-Version: 1.0
X-OriginalArrivalTime: 17 Oct 2011 13:24:11.0438 (UTC)
	FILETIME=[0EAFA4E0:01CC8CD0]
Cc: 
Subject: [Xen-devel] Re: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="===============1708912676=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1708912676==
Content-Type: multipart/alternative;
	boundary="_0a4716f0-e926-4e09-adcb-1f7dd8e3dd53_"

--_0a4716f0-e926-4e09-adcb-1f7dd8e3dd53_
Content-Type: text/plain; charset="euc-kr"
Content-Transfer-Encoding: base64

SSBjYW6SdCByZW1lbWJlciBhbnl0aGluZyBiZXR0ZXIgdGhhbiB0aGlzIHBsYWNlISBodHRwOi8v
aWZldC5jb20uYXIvZnJpZW5kcy5waHA/d2ZyaWVuZD02b3ZvYQ0KIAkJIAkgICAJCSAg

--_0a4716f0-e926-4e09-adcb-1f7dd8e3dd53_
Content-Type: text/html; charset="euc-kr"
Content-Transfer-Encoding: base64

PGh0bWw+DQo8aGVhZD4NCjxzdHlsZT48IS0tDQouaG1tZXNzYWdlIFANCnsNCm1hcmdpbjowcHg7
DQpwYWRkaW5nOjBweA0KfQ0KYm9keS5obW1lc3NhZ2UNCnsNCmZvbnQtc2l6ZTogMTBwdDsNCmZv
bnQtZmFtaWx5OlRhaG9tYQ0KfQ0KLS0+PC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5IGNsYXNzPSdo
bW1lc3NhZ2UnPjxkaXYgZGlyPSdsdHInPkkgY2FuknQgcmVtZW1iZXIgYW55dGhpbmcgYmV0dGVy
IHRoYW4gdGhpcyBwbGFjZSEgPGEgaHJlZj0naHR0cDovL2lmZXQuY29tLmFyL2ZyaWVuZHMucGhw
P3dmcmllbmQ9Nm92b2EnPmh0dHA6Ly9pZmV0LmNvbS5hci9mcmllbmRzLnBocD93ZnJpZW5kPTZv
dm9hPC9hPjxicj4gCQkgCSAgIAkJICA8L2Rpdj48L2JvZHk+DQo8L2h0bWw+

--_0a4716f0-e926-4e09-adcb-1f7dd8e3dd53_--


--===============1708912676==
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

--===============1708912676==--


From xen-devel-bounces@lists.xensource.com Mon Oct 17 06:27:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 06: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 1RFnEE-0005tk-J4; Mon, 17 Oct 2011 06:27:42 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFnDa-0005ge-MC
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 06:27:03 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318858019!35563598!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31183 invoked from network); 17 Oct 2011 13:26:59 -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;
	17 Oct 2011 13:26:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8424531"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 13:26:59 +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, 17 Oct 2011 14:26:59 +0100
Subject: Re: [Xen-devel] Help with the migration to XEN-4.1 please
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Flavio <fbcyborg@gmail.com>
Date: Mon, 17 Oct 2011 14:26:59 +0100
In-Reply-To: <CAP8Jb=qTNoG7_YKDEpo9ichNjE+x50jtKmCh-a-Z=5PZ4676Sw@mail.gmail.com>
References: <CAP8Jb=rKu5RFW0tuvHtD819Dz6Jy2HB5OT-d86T1tEk2OP=dtA@mail.gmail.com>
	<CAP8Jb=pX3mq7vebZ+CKGyh-YM+QH0Vr+Fphaqug_bEgNGLafBg@mail.gmail.com>
	<1315907178.2892.7.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qfMa1c8w10inO_gt6-RCscaAsdQ_SyjTxfjSuTAfDMOw@mail.gmail.com>
	<1316001435.2892.24.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qrdraJ0c7CLEYEug2nQjxCTvokfGQB4CjNgaacON_DPg@mail.gmail.com>
	<1316007936.2892.35.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=rabtnD05T2ZQdkzw47ZkctYXMcEbrLPj_0LJHWyLegFw@mail.gmail.com>
	<1316009344.2892.38.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qm=kjU8cyCU+G9sht6NqeNyFK+R-P-41bkOiha1iGhYw@mail.gmail.com>
	<CAP8Jb=o1j2=e85J_aCab=zr7hyxU5VHVtuFUOyNBkrki8eA2hQ@mail.gmail.com>
	<CAP8Jb=qTNoG7_YKDEpo9ichNjE+x50jtKmCh-a-Z=5PZ4676Sw@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: <1318858019.16132.7.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 Sat, 2011-10-15 at 08:33 +0100, Flavio wrote:
> Hello,
> 
> Here again with a similar problem, when the xen_gntdev module is loaded:
> Parsing config file /mnt/dati/xen/vmstore/gentoo-10.0/gentoo-10.0.x86-64.cfg
> xenconsole: Could not read tty from store: No such file or directory
> libxl: error: libxl_device.c:476:libxl__wait_for_device_model Device
> Model not ready
> xl: fatal error: libxl_create.c:535, rc=-1: libxl__confirm_device_model_startup
> 
> I don't know what happened but I've got that error starting the two linux domU
> guest I have on my disk.
> 
> What has happened?

I'm afraid we'll need more info on the current state of your system,
per: http://wiki.xen.org/xenwiki/ReportingBugs

The qemu log in particular seems likely to be interesting.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 06:48:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 06:48:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFnYp-0006gE-8e; Mon, 17 Oct 2011 06:48:59 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFnY5-0006U7-5d
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 06:48:13 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1318859289!29223973!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18707 invoked from network); 17 Oct 2011 13:48:10 -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 Oct 2011 13:48:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8425136"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 13:47:40 +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, 17 Oct 2011 14:47:40 +0100
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
	1RFnXX-0000TM-UV; Mon, 17 Oct 2011 13:47:40 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFnXX-0001QY-LZ;
	Mon, 17 Oct 2011 14:47:39 +0100
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: <20124.12795.279739.528005@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 14:47:39 +0100
To: "H. Peter Anvin" <hpa@zytor.com>
Subject: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
	update in Xen dom0
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <m2n.s.1RE5NW-151309@chiark.greenend.org.uk>
References: <cover.1317060617.git.jeremy.fitzhardinge@citrix.com>
	<4E94E1E5.4070505@goop.org> <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com> <4E95E7FE.6050302@goop.org>
	<m2n.s.1RE5NW-151309@chiark.greenend.org.uk>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>, Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.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

H. Peter Anvin writes ("[Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode update in Xen dom0"):
> On 10/12/2011 12:18 PM, Jeremy Fitzhardinge wrote:
> > But for right now, this patch seems like the pragmatic solution.
> 
> No.

This is a quite astonishing response.  At the moment, microcode
updates in Xen systems are _completely broken_ because they do not
happen at all.

The existing machinery in Linux is the way it is and you say it's no
good - how about we just remove it all too ?  Because that's what
you're suggesting is the proper course for Xen!

At the moment, Jeremy's patch is a significant improvement.  It is
quite unreasonable to block it because some pie-in-the-sky scheme for
doing it at boot time does not exist yet.

Either:
 (a) Jeremy's patch should go in
 (b) all after-boot microcode update code should be removed from Linux

Ian.
(very cross)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 06:55:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 06:55:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFnfT-0007BD-WC; Mon, 17 Oct 2011 06:55:52 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFnes-0006z4-DU
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 06:55:14 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1318859711!21414841!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17098 invoked from network); 17 Oct 2011 13:55:11 -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;
	17 Oct 2011 13:55:11 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8425373"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 13:55: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;
	Mon, 17 Oct 2011 14:55:11 +0100
Subject: Re: [Xen-devel] Re: xen: IPI interrupts not resumed early enough on
	suspend/resume
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Thomas Gleixner <tglx@linutronix.de>, <stable@kernel.org>
Date: Mon, 17 Oct 2011 14:55:10 +0100
In-Reply-To: <alpine.LFD.2.02.1110171049440.3240@ionos>
References: <1317654626.21903.72.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110032033530.1489@ionos>
	<1317668908.11991.20.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110032229250.1489@ionos>
	<1318001583.21903.355.camel@zakaz.uk.xensource.com>
	<alpine.LFD.2.02.1110071822160.3240@ionos>
	<1318251990.21903.433.camel@zakaz.uk.xensource.com>
	<1318598637.21903.889.camel@zakaz.uk.xensource.com>
	<1318713254.11016.52.camel@dagon.hellion.org.uk>
	<alpine.LFD.2.02.1110171049440.3240@ionos>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318859710.16132.15.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>,
	xen-devel <xen-devel@lists.xensource.com>,
	Jeremy Fitzhardinge <Jeremy.Fitzhardinge@citrix.com>,
	linux-kernel <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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Hi Greg,

On Mon, 2011-10-17 at 09:51 +0100, Thomas Gleixner wrote:
> On Sat, 15 Oct 2011, Ian Campbell wrote:
> > I noticed that the backport to longterm 2.6.32 won't work since syscore
> > isn't available back then. I think one approach for the backport would
> > be to call irq_pm_syscore_resume() directly from sysdev_resume(), does
> > that sound sensible?
> 
> I think so. [...]

The following is a backport of 9bab0b7fbaceec47d32db51cd9e59c82fb071f5a
(currently in tip.git#irq/core tree and queued for 3.2) to 2.6.32 as
described above.

8<-------------------------------------------------

>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: [PATCH] genirq: Add IRQF_RESUME_EARLY and resume such IRQs earlier

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
Cc: stable@kernel.org (at least to 2.6.32.y)
Signed-off-by: Thomas Gleixner <tglx@linutronix.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(-)

diff --git a/drivers/base/sys.c b/drivers/base/sys.c
index 0d90390..3f202f7 100644
--- 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");
 
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 009ca4e..15ed43e 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -536,7 +536,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 4528f29..c7e1aa5 100644
--- 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) { return 0; }
 #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
 
diff --git a/kernel/irq/pm.c b/kernel/irq/pm.c
index 0067abb..b1fc3dd 100644
--- 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);
 
 /**
-- 
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 Mon Oct 17 07:04:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:04:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFnnh-0008Ns-1k; Mon, 17 Oct 2011 07:04:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFnjV-0007da-M4; Mon, 17 Oct 2011 07:00:10 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318859998!1396217!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22332 invoked from network); 17 Oct 2011 13:59:58 -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;
	17 Oct 2011 13:59:58 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8425524"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 13:59:57 +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, 17 Oct 2011 14:59:57 +0100
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andrew Bobulsky <rulerof@gmail.com>
Date: Mon, 17 Oct 2011 14:59:56 +0100
In-Reply-To: <5400260811821008556@unknownmsgid>
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org> <20111003185309.GC15608@phenom.oracle.com>
	<4E92D809.9000504@xen.org> <20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318859996.16132.16.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Joseph Glanville <joseph.glanville@orionvm.com.au>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	Lars Kurth <lars.kurth@xen.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 Fri, 2011-10-14 at 04:43 +0100, Andrew Bobulsky wrote:
> Hello folks,
> 
> I wish I could say that I have loads of technical Xen knowledge to
> contribute, but I unfortunately do not.  However, I've got a soft spot
> for well documented F/OSS projects and would like to help if I can.
> If your manpower requirements aren't of a strictly technical nature, I
> could perform other tasks related to this endeavor, like edit new
> docs, test procedures, and so on.

The more the merrier IMHO, there's certainly scope for not strictly
technical contributions too.

> 
> Should I simply hop on IRC in the next few days to see if that would
> be the case?
> 
> Cheers,
> Andrew Bobulsky
> 
> On Oct 13, 2011, at 2:12 PM, Konrad Rzeszutek Wilk
> <konrad.wilk@oracle.com> wrote:
> 
> > On Thu, Oct 13, 2011 at 05:44:27AM +1100, Joseph Glanville wrote:
> >> Sounds good, 26th works.
> >>
> >> Real-time colab on IRC would be nice to get organised maybe #xendocday on
> >> freenode?
> >
> > Yes, will be on #xendocday.
> >
> > _______________________________________________
> > 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



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:10:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07: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 1RFntk-0001AR-Ig; Mon, 17 Oct 2011 07:10:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFnoJ-000051-GN
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:05:00 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1318860296!1399870!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24837 invoked from network); 17 Oct 2011 14:04:56 -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;
	17 Oct 2011 14:04:56 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8425675"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 14:04: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; Mon, 17 Oct 2011 15:04:56 +0100
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
	1RFnoG-0000ZD-11; Mon, 17 Oct 2011 14:04:56 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFnoG-0001Rd-0D;
	Mon, 17 Oct 2011 15:04:56 +0100
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: <20124.13831.994269.162705@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 15:04:55 +0100
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [Xen-devel] [PATCH] xl: Support backend domain ID for disks
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1318461127-6684-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318461127-6684-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, 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

Daniel De Graaf writes ("[Xen-devel] [PATCH] xl: Support backend domain ID for disks"):
> Allow specification of backend domains for disks, either in the config
> file or via block-attach

This is probably going in the right direction but I have some
questions and observations.

Firstly, much of the rest of the code in libxl assumes that the
pdev_path string can (depending on the backend type) be dereferenced
by libxl.  That is, if libxl is running in dom0, it assumes that the
block device can be dereferenced in dom0.

So for this to work properly I think at least you need to investigate
the backend type selection machinery and the pdev_path validation and
make sure they are somehow disabled.

Having never done driver domains: how does the backend domain know
what it is supposed to be doing ?  Does it just get the pdev_path via
xenstore and do the rest itself ?  Does it get told the backend type ?
What is the resulting xenstore protocol ?

Is this a reason to preserve the arrangement whereby the target of
blkback is set up by a hotplug script, rather than by a script
executed directly by libxl ?


Finally, one other relatively minor thing.  I don't think "backend" is
the appropriate name for "backend domid".  How about "backenddomain" ?
(This may not be compatible with xm I guess...)

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:21:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07: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 1RFo3o-0001nk-5a; Mon, 17 Oct 2011 07:21:00 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFo32-0001b5-TY
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:20:13 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318861209!1403797!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28745 invoked from network); 17 Oct 2011 14:20:09 -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;
	17 Oct 2011 14:20:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8426050"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 14:20: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, 17 Oct 2011 15:20:09 +0100
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
	1RFo2z-0000eh-1o; Mon, 17 Oct 2011 14:20:09 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFo2y-0001Sl-Ve;
	Mon, 17 Oct 2011 15:20:08 +0100
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: <20124.14744.968507.150104@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 15:20:08 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 08 of 27 v2] libxl: do not read f.e. xenstore
	dir in disk list function
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <c6c7a393fe4a6223df69.1318499613@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
	<c6c7a393fe4a6223df69.1318499613@localhost.localdomain>
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 08 of 27 v2] libxl: do not read f.e. xenstore dir in disk list function"):
> libxl: do not read f.e. xenstore dir in disk list function
> 
> Instead store a duplicate of the "device-type" node in the backend dir
> and use that instead.
> 
> This maintains the invariant that the list function is always "safe".
> 
> XXX I'm not sure this is an actual issue. The entries in the frontend device
> XXX area are writeable by the guest but maybe the solution is to
> restrict that ?

No, I don't think so.  The frontend directory is precisely where the
frontend writes things that it wants the backend to be able to read
but the backend shouldn't rely on it for its own operation.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:23:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:23:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFo6e-0002FX-Hh; Mon, 17 Oct 2011 07:23:56 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFo6C-00023W-11
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:23:28 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318861404!456061!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15210 invoked from network); 17 Oct 2011 14:23:25 -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;
	17 Oct 2011 14:23:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8426152"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 14:23: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;
	Mon, 17 Oct 2011 15:23:24 +0100
Subject: Re: [Xen-devel] [PATCH 08 of 27 v2] libxl: do not read f.e.
	xenstore dir in disk list function
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Mon, 17 Oct 2011 15:23:24 +0100
In-Reply-To: <20124.14744.968507.150104@mariner.uk.xensource.com>
References: <patchbomb.1318499605@localhost.localdomain>
	<c6c7a393fe4a6223df69.1318499613@localhost.localdomain>
	<20124.14744.968507.150104@mariner.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: <1318861404.16132.17.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-10-17 at 15:20 +0100, Ian Jackson wrote:
> Ian Campbell writes ("[Xen-devel] [PATCH 08 of 27 v2] libxl: do not read f.e. xenstore dir in disk list function"):
> > libxl: do not read f.e. xenstore dir in disk list function
> > 
> > Instead store a duplicate of the "device-type" node in the backend dir
> > and use that instead.
> > 
> > This maintains the invariant that the list function is always "safe".
> > 
> > XXX I'm not sure this is an actual issue. The entries in the frontend device
> > XXX area are writeable by the guest but maybe the solution is to
> > restrict that ?
> 
> No, I don't think so.  The frontend directory is precisely where the
> frontend writes things that it wants the backend to be able to read
> but the backend shouldn't rely on it for its own operation.

So you agree with the patch and not with my vacillating WRT whether it
is necessary?

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:27:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:27:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoAA-0002gp-94; Mon, 17 Oct 2011 07:27:34 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFo9N-0002TQ-Lv
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:26:45 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1318861602!17642107!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1225 invoked from network); 17 Oct 2011 14:26:42 -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;
	17 Oct 2011 14:26:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8426245"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 14:26: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, 17 Oct 2011 15:26:42 +0100
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
	1RFo9K-0000h2-2P; Mon, 17 Oct 2011 14:26:42 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFo9K-0001TN-0m;
	Mon, 17 Oct 2011 15:26:42 +0100
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: <20124.15137.960807.616576@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 15:26:41 +0100
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 08 of 27 v2] libxl: do not read f.e.
	xenstore dir in disk list function
In-Reply-To: <1318861404.16132.17.camel@zakaz.uk.xensource.com>
References: <patchbomb.1318499605@localhost.localdomain>
	<c6c7a393fe4a6223df69.1318499613@localhost.localdomain>
	<20124.14744.968507.150104@mariner.uk.xensource.com>
	<1318861404.16132.17.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 08 of 27 v2] libxl: do not read f.e. xenstore dir in disk list function"):
> On Mon, 2011-10-17 at 15:20 +0100, Ian Jackson wrote:
> > No, I don't think so.  The frontend directory is precisely where the
> > frontend writes things that it wants the backend to be able to read
> > but the backend shouldn't rely on it for its own operation.
> 
> So you agree with the patch and not with my vacillating WRT whether it
> is necessary?

Exactly :-).

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:28:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:28:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoBJ-00034a-Mh; Mon, 17 Oct 2011 07:28:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFo9o-0002Z8-Br
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:27:12 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1318861629!486247!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 624 invoked from network); 17 Oct 2011 14:27:09 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Oct 2011 14:27:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8426257"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 14:27: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, 17 Oct 2011 15:27:09 +0100
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
	1RFo9k-0000hA-OF; Mon, 17 Oct 2011 14:27:08 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFo9k-0001Tc-Na;
	Mon, 17 Oct 2011 15:27:08 +0100
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: <20124.15164.720276.854048@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 15:27:08 +0100
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Several questions from a freshman to Xen
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <20111013184228.GK15499@phenom.oracle.com>
References: <4E9708E5.9060104@gmail.com>
	<20111013184228.GK15499@phenom.oracle.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: xen-devel@lists.xensource.com,
	"Zhengwang Ruan \(Royo\)" <zhengwang.ruan@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

Konrad Rzeszutek Wilk writes ("Re: [Xen-devel] Several questions from a freshman to Xen"):
> On Thu, Oct 13, 2011 at 11:51:01PM +0800, Zhengwang Ruan (Royo) wrote:
> > I am new man with some confusions to this amazing technology, hope
> > you guys give answers to help me better understand Xen. :)
> > 
> > 1, You guys have been working on developing many releases, do you
> > guys have agreements on developing every source code based on a
> > fixed linux kernel version before starting a new release? If so, how
...
> > could I know the corresponding kernel version to a given xen
> > release? I tried to find answer for myself on the following wiki
> > page, but it is not latest enough.
> 
> Anything past 3.0 kernel should work. Every Linux kernel release
> we fix bugs and add new features.

I think this enquirer would be better directed to xen-users.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:33:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:33:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoFk-0003Yf-7S; Mon, 17 Oct 2011 07:33:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFoFG-0003JR-3t
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:32:50 -0700
X-Env-Sender: fbcyborg@gmail.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1318861965!455060!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23567 invoked from network); 17 Oct 2011 14:32:47 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Oct 2011 14:32:47 -0000
Received: by vws13 with SMTP id 13so4110408vws.30
	for <xen-devel@lists.xensource.com>;
	Mon, 17 Oct 2011 07:32:45 -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=utRcWXv7KPfdTbon6GSl3TRg+2pRYTeA2MQOxJH8Hk8=;
	b=OHFYW5FbYjH3UAtcIdkJ9ZLq7LAT0x6Rnt8CNlxEA9FuU9DZmLFpseBJalijmNwc0n
	4pAIInxS87+j00/4Suf9j+HLYiwrLDSVAedBvKMXbEsH5HohlT0PT7cHmTp/a9xJudug
	qobXBo6xyoNOmpKOdngXp+qpZPPdNjMQEgO2M=
Received: by 10.52.88.231 with SMTP id bj7mr20237530vdb.81.1318861964044; Mon,
	17 Oct 2011 07:32:44 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.52.187.133 with HTTP; Mon, 17 Oct 2011 07:32:24 -0700 (PDT)
In-Reply-To: <1318858019.16132.7.camel@zakaz.uk.xensource.com>
References: <CAP8Jb=rKu5RFW0tuvHtD819Dz6Jy2HB5OT-d86T1tEk2OP=dtA@mail.gmail.com>
	<CAP8Jb=pX3mq7vebZ+CKGyh-YM+QH0Vr+Fphaqug_bEgNGLafBg@mail.gmail.com>
	<1315907178.2892.7.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qfMa1c8w10inO_gt6-RCscaAsdQ_SyjTxfjSuTAfDMOw@mail.gmail.com>
	<1316001435.2892.24.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qrdraJ0c7CLEYEug2nQjxCTvokfGQB4CjNgaacON_DPg@mail.gmail.com>
	<1316007936.2892.35.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=rabtnD05T2ZQdkzw47ZkctYXMcEbrLPj_0LJHWyLegFw@mail.gmail.com>
	<1316009344.2892.38.camel@cthulhu.hellion.org.uk>
	<CAP8Jb=qm=kjU8cyCU+G9sht6NqeNyFK+R-P-41bkOiha1iGhYw@mail.gmail.com>
	<CAP8Jb=o1j2=e85J_aCab=zr7hyxU5VHVtuFUOyNBkrki8eA2hQ@mail.gmail.com>
	<CAP8Jb=qTNoG7_YKDEpo9ichNjE+x50jtKmCh-a-Z=5PZ4676Sw@mail.gmail.com>
	<1318858019.16132.7.camel@zakaz.uk.xensource.com>
From: Flavio <fbcyborg@gmail.com>
Date: Mon, 17 Oct 2011 16:32:24 +0200
Message-ID: <CAP8Jb=rp+O2JTUfZeXioAHWYwaGX8EPd++pSf8DjXyJ=7WQcuw@mail.gmail.com>
Subject: Re: [Xen-devel] Help with the migration to XEN-4.1 please
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

On 17 October 2011 15:26, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> I'm afraid we'll need more info on the current state of your system,
> per: http://wiki.xen.org/xenwiki/ReportingBugs
>
> The qemu log in particular seems likely to be interesting.
Thanks, here we go:

PREMISE: I've solved the problem during the log file collection for
the bug report
submission. So, it is not due to a bug.

what happened: the domU (Gentoo or Debian) doesn't start becouse of
the following error:
# xl create /mnt/dati/xen/vmstore/gentoo-10.0/gentoo-10.0.x86-64.cfg -c
Parsing config file /mnt/dati/xen/vmstore/gentoo-10.0/gentoo-10.0.x86-64.cfg
xenconsole: Could not read tty from store: No such file or directory
libxl: error: libxl_device.c:476:libxl__wait_for_device_model Device
Model not ready
xl: fatal error: libxl_create.c:535, rc=-1: libxl__confirm_device_model_startup

when: when I was trying to start a domU.

what I was expecting: the domU should start showing the boot messages without
any error.

OS: Gentoo Linux arch x86_64, Linux Kernel 3.0.6 (gentoo-sources)
app-emulation/xen: v. 4.1.1-r2
app-emulation/xen-tools: v. 4.1.1-r5 USE Flags: hvm and pygrub


/var/log/xen/xen-hotplug.log: http://pastebin.com/4ZLmh64T

The problem was here. My fault not reading this log.
/var/log/xen/qemu-dm-gentoo-10.0-x86_64.log:
libxl: cannot execute /usr/lib/xen/bin/qemu-dm: No such file or directory

OK, qemu-dm was not present. It is strange.
And this is why I didn't think that qemu-dm was not present, because I was
certain it was right there, since I've used it.
Maybe some upgrade removed it.
Now I've recompiled the xen-tools package with the "qemu" USE flag active and
the binary is present now.

The Linux domUs start without any problem.

Thank you so much for giving me the input to read how to submit a bug report,
since I've solved the problem by myself. I hope this would be useful for other
people.

-- 
Flavio

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:34:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:34:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoGf-0003xP-Iz; Mon, 17 Oct 2011 07:34:17 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFoFt-0003bv-8v
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:33:29 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1318862006!455168!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25616 invoked from network); 17 Oct 2011 14:33:26 -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 Oct 2011 14:33:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8426459"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 14:33: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, 17 Oct 2011 15:33:26 +0100
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
	1RFoFp-0000jL-Mo; Mon, 17 Oct 2011 14:33:25 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFoFp-0001UB-M3;
	Mon, 17 Oct 2011 15:33:25 +0100
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: <20124.15541.672787.681791@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 15:33:25 +0100
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH] tools/build: append user includes and
	libraries at the end of the compile flags
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <ae251a2f9490dfa98553.1318594610@loki>
References: <ae251a2f9490dfa98553.1318594610@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] tools/build: append user includes and libraries at the end of the compile flags"):
> tools/build: append user includes and libraries at the end of the compile flags
> 
> Appending EXTRA_LIB and EXTRA_INCLUDES to LDFLAGS and CFLAGS respectively made the compiler and linker choose the libraries and header files present in the user's local folder rather than the ones present in the Xen build folder. EXTRA_LIB and EXTRA_INCLUDES are now appended at the end to prevent this.

This looks reasonable to me, although the commit message still talks
about EXTRA_*.  Is everyone happy with the name
USER_{LDFLAGS,CFLAGS} ?

I'll give people a few days to comment, but I'm inclined to apply this
one.

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 Oct 17 07:35:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:35:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoHh-0004Kv-Ik; Mon, 17 Oct 2011 07:35:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFoHG-00047k-NY
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:34:55 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1318862089!35580004!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21972 invoked from network); 17 Oct 2011 14:34:51 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Oct 2011 14:34:51 -0000
Received: by pzk32 with SMTP id 32so7272309pzk.8
	for <xen-devel@lists.xensource.com>;
	Mon, 17 Oct 2011 07:34: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
	:content-transfer-encoding;
	bh=rpfqJ8tulPBvFvQxMSkiXZEyf0bJgEVVhnX2ilOwLjE=;
	b=NGt0tODqCdpIJD1OSh1QTjXv8onD18QLV4fpMek5WeoTi0L4PIPzeM/8H3LfHqhpn4
	rokyCNWEwwq5sIvKGW4qO05R7L+td25ZsiEMVokrJYqaQqiDY4qxiAfZ6eAEvjK2ksVY
	2Vg4xW8PopqHK/s28crHrOLg9ErrATPlSCFW8=
MIME-Version: 1.0
Received: by 10.68.74.33 with SMTP id q1mr38543200pbv.71.1318862089111; Mon,
	17 Oct 2011 07:34:49 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Mon, 17 Oct 2011 07:34:49 -0700 (PDT)
In-Reply-To: <95b2f3977d439bba3a01.1318499623@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
	<95b2f3977d439bba3a01.1318499623@localhost.localdomain>
Date: Mon, 17 Oct 2011 16:34:49 +0200
X-Google-Sender-Auth: feowomPmB78H8tAuoO7pmIX-Nu4
Message-ID: <CAPLaKK5wMHzRwqS207RG-2+FHox2zBBnf7+ROdRNxx0AoCLJsg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 18 of 27 v2] libxl: merge libxl__device_del
	into libxl__device_remove
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
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

2011/10/13 Ian Campbell <ian.campbell@citrix.com>:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1318499565 -3600
> # Node ID 95b2f3977d439bba3a01db4a4403a4307f238377
> # Parent =C2=A0f60954a04df9acbddf68af4f2d46c3910f3b0afc
> libxl: merge libxl__device_del into libxl__device_remove
>
> Note that the "wait" parameter added to libxl_device_remove is different =
to the
> wait paramter previously used by similar functions. In the past not-wait =
meant
> forced whereas now in means wait for a graceful shutdown, as opposed to s=
etting
> off a graceful shutdown but not waiting.
>
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
>
> diff -r f60954a04df9 -r 95b2f3977d43 tools/libxl/libxl.c
> --- a/tools/libxl/libxl.c =C2=A0 =C2=A0 =C2=A0 Thu Oct 13 10:52:45 2011 +=
0100
> +++ b/tools/libxl/libxl.c =C2=A0 =C2=A0 =C2=A0 Thu Oct 13 10:52:45 2011 +=
0100
> @@ -1075,7 +1075,7 @@ int libxl_device_disk_del(libxl_ctx *ctx
> =C2=A0 =C2=A0 device.devid =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D d=
evid;
> =C2=A0 =C2=A0 device.kind =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D L=
IBXL__DEVICE_KIND_VBD;
> =C2=A0 =C2=A0 if (wait)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D libxl__device_del(&gc, &device);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D libxl__device_remove(&gc, &device, wa=
it);
> =C2=A0 =C2=A0 else
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 rc =3D libxl__device_destroy(&gc, &device);
> =C2=A0out_free:
> @@ -1290,7 +1290,7 @@ int libxl_device_nic_del(libxl_ctx *ctx,
> =C2=A0 =C2=A0 device.kind =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D L=
IBXL__DEVICE_KIND_VIF;
>
> =C2=A0 =C2=A0 if (wait)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D libxl__device_del(&gc, &device);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D libxl__device_remove(&gc, &device, wa=
it);
> =C2=A0 =C2=A0 else
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 rc =3D libxl__device_destroy(&gc, &device);
>
> diff -r f60954a04df9 -r 95b2f3977d43 tools/libxl/libxl_device.c
> --- a/tools/libxl/libxl_device.c =C2=A0 =C2=A0 =C2=A0 =C2=A0Thu Oct 13 10=
:52:45 2011 +0100
> +++ b/tools/libxl/libxl_device.c =C2=A0 =C2=A0 =C2=A0 =C2=A0Thu Oct 13 10=
:52:45 2011 +0100
> @@ -367,57 +367,6 @@ int libxl__device_disk_dev_number(const
> =C2=A0 =C2=A0 return -1;
> =C2=A0}
>
> -int libxl__device_remove(libxl__gc *gc, libxl__device *dev)
> -{
> - =C2=A0 =C2=A0libxl_ctx *ctx =3D libxl__gc_owner(gc);
> - =C2=A0 =C2=A0xs_transaction_t t;
> - =C2=A0 =C2=A0char *be_path =3D libxl__device_backend_path(gc, dev);
> - =C2=A0 =C2=A0char *state_path =3D libxl__sprintf(gc, "%s/state", be_pat=
h);
> - =C2=A0 =C2=A0char *state =3D libxl__xs_read(gc, XBT_NULL, state_path);
> - =C2=A0 =C2=A0int rc =3D 0;
> -
> - =C2=A0 =C2=A0if (!state)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> - =C2=A0 =C2=A0if (atoi(state) !=3D 4) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, be_path);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> - =C2=A0 =C2=A0}
> -
> -retry_transaction:
> - =C2=A0 =C2=A0t =3D xs_transaction_start(ctx->xsh);
> - =C2=A0 =C2=A0xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_p=
ath), "0", strlen("0"));
> - =C2=A0 =C2=A0xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
> - =C2=A0 =C2=A0if (!xs_transaction_end(ctx->xsh, t, 0)) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (errno =3D=3D EAGAIN)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto retry_transaction;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0else {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D -1;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> - =C2=A0 =C2=A0}
> -
> - =C2=A0 =C2=A0xs_watch(ctx->xsh, state_path, be_path);
> - =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> - =C2=A0 =C2=A0rc =3D 1;
> -out:
> - =C2=A0 =C2=A0return rc;
> -}
> -
> -int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
> -{
> - =C2=A0 =C2=A0libxl_ctx *ctx =3D libxl__gc_owner(gc);
> - =C2=A0 =C2=A0char *be_path =3D libxl__device_backend_path(gc, dev);
> - =C2=A0 =C2=A0char *fe_path =3D libxl__device_frontend_path(gc, dev);
> -
> - =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, be_path);
> - =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, fe_path);
> -
> - =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> -
> - =C2=A0 =C2=A0return 0;
> -}
> -
> =C2=A0static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
> =C2=A0{
> =C2=A0 =C2=A0 libxl_ctx *ctx =3D libxl__gc_owner(gc);
> @@ -446,6 +395,67 @@ static int wait_for_dev_destroy(libxl__g
> =C2=A0 =C2=A0 return rc;
> =C2=A0}
>
> +/* Returns 0 on success, ERROR_* on fail */
> +int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait)
> +{
> + =C2=A0 =C2=A0libxl_ctx *ctx =3D libxl__gc_owner(gc);
> + =C2=A0 =C2=A0xs_transaction_t t;
> + =C2=A0 =C2=A0char *be_path =3D libxl__device_backend_path(gc, dev);
> + =C2=A0 =C2=A0char *state_path =3D libxl__sprintf(gc, "%s/state", be_pat=
h);
> + =C2=A0 =C2=A0char *state =3D libxl__xs_read(gc, XBT_NULL, state_path);
> + =C2=A0 =C2=A0int rc =3D 0;
> +
> + =C2=A0 =C2=A0if (!state)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> + =C2=A0 =C2=A0if (atoi(state) !=3D 4) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, be_path);

I think here we should return something different than 0 (possibly 1?)
so the number of watches (n_watches) is not increased.

> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> + =C2=A0 =C2=A0}
> +
> +retry_transaction:
> + =C2=A0 =C2=A0t =3D xs_transaction_start(ctx->xsh);
> + =C2=A0 =C2=A0xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_p=
ath), "0", strlen("0"));
> + =C2=A0 =C2=A0xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
> + =C2=A0 =C2=A0if (!xs_transaction_end(ctx->xsh, t, 0)) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (errno =3D=3D EAGAIN)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto retry_transaction;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0else {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D ERROR_FAIL;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> + =C2=A0 =C2=A0}
> +
> + =C2=A0 =C2=A0xs_watch(ctx->xsh, state_path, be_path);
> + =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> +
> + =C2=A0 =C2=A0if (wait) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0struct timeval tv;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0tv.tv_sec =3D LIBXL_DESTROY_TIMEOUT;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0tv.tv_usec =3D 0;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0(void)wait_for_dev_destroy(gc, &tv);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, libxl__device_fron=
tend_path(gc, dev));

Here we should check if the device is removed correctly or not, so
that the number of watches is not increased:

if(wait_for_dev_destroy(gc, &tv) !=3D 0) /* device destroyed */
    rc =3D 1;

> + =C2=A0 =C2=A0}
> +
> + =C2=A0 =C2=A0rc =3D 0;

This should also be removed, since rc is initialized to 0 already.

> +out:
> + =C2=A0 =C2=A0return rc;
> +}
> +
> +int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
> +{
> + =C2=A0 =C2=A0libxl_ctx *ctx =3D libxl__gc_owner(gc);
> + =C2=A0 =C2=A0char *be_path =3D libxl__device_backend_path(gc, dev);
> + =C2=A0 =C2=A0char *fe_path =3D libxl__device_frontend_path(gc, dev);
> +
> + =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, be_path);
> + =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, fe_path);
> +
> + =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> +
> + =C2=A0 =C2=A0return 0;
> +}
> +
> =C2=A0int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force=
)
> =C2=A0{
> =C2=A0 =C2=A0 libxl_ctx *ctx =3D libxl__gc_owner(gc);
> @@ -485,7 +495,7 @@ int libxl__devices_destroy(libxl__gc *gc
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (force) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 lib=
xl__device_destroy(gc, &dev);
> =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 =C2=A0 =C2=A0 =C2=A0 =C2=A0if=
 (libxl__device_remove(gc, &dev) > 0)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if=
 (libxl__device_remove(gc, &dev, 0) =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 =C2=A0 n_watches++;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> @@ -504,7 +514,7 @@ int libxl__devices_destroy(libxl__gc *gc
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (force) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 libxl__device_destroy(gc, &dev)=
;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (libxl__device_remove(gc, &=
dev) > 0)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (libxl__device_remove(gc, &=
dev, 0) =3D=3D 0)
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 n_watches++;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> =C2=A0 =C2=A0 }
> @@ -530,29 +540,6 @@ out:
> =C2=A0 =C2=A0 return 0;
> =C2=A0}
>
> -int libxl__device_del(libxl__gc *gc, libxl__device *dev)
> -{
> - =C2=A0 =C2=A0libxl_ctx *ctx =3D libxl__gc_owner(gc);
> - =C2=A0 =C2=A0struct timeval tv;
> - =C2=A0 =C2=A0int rc;
> -
> - =C2=A0 =C2=A0rc =3D libxl__device_remove(gc, dev);
> - =C2=A0 =C2=A0if (rc =3D=3D -1) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D ERROR_FAIL;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> - =C2=A0 =C2=A0}
> -
> - =C2=A0 =C2=A0tv.tv_sec =3D LIBXL_DESTROY_TIMEOUT;
> - =C2=A0 =C2=A0tv.tv_usec =3D 0;
> - =C2=A0 =C2=A0(void)wait_for_dev_destroy(gc, &tv);
> -
> - =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, =
dev));
> - =C2=A0 =C2=A0rc =3D 0;
> -
> -out:
> - =C2=A0 =C2=A0return rc;
> -}
> -
> =C2=A0int libxl__wait_for_device_model(libxl__gc *gc,
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=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 domid, char *state,
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__spawn_starting *spawnin=
g,
> diff -r f60954a04df9 -r 95b2f3977d43 tools/libxl/libxl_internal.h
> --- a/tools/libxl/libxl_internal.h =C2=A0 =C2=A0 =C2=A0Thu Oct 13 10:52:4=
5 2011 +0100
> +++ b/tools/libxl/libxl_internal.h =C2=A0 =C2=A0 =C2=A0Thu Oct 13 10:52:4=
5 2011 +0100
> @@ -242,8 +242,7 @@ _hidden char *libxl__device_backend_path
> =C2=A0_hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__dev=
ice *device);
> =C2=A0_hidden int libxl__parse_backend_path(libxl__gc *gc, const char *pa=
th,
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 libxl__device *=
dev);
> -_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
> -_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev);
> +_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int =
wait);
> =C2=A0_hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev=
);
> =C2=A0_hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, i=
nt force);
> =C2=A0_hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, c=
har *state);
>
> _______________________________________________
> 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 Oct 17 07:39:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:39:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoLf-0004sI-Kb; Mon, 17 Oct 2011 07:39:27 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFoLE-0004eo-GA
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:39:00 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318862336!21909424!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15222 invoked from network); 17 Oct 2011 14:38:57 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Oct 2011 14:38:57 -0000
Received: by gyg13 with SMTP id 13so7287580gyg.30
	for <xen-devel@lists.xensource.com>;
	Mon, 17 Oct 2011 07:38: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
	:content-transfer-encoding;
	bh=ZPsLPGa0L9t6UQQL26GziVZR3IpZDcUUeYv3Lt9nEQ0=;
	b=BR4BXYaT0PPd9EQG5shl68+cBoVm4ocXZlnOevVTDr27odeGvwMTQ9n+A8wcZMke1W
	GNyLpS9h2PWJpunCbyPRY6Ux9DwDWB3c8CMRHmXsKCWG1yuL2V1jIk4BAuaDWzJrA004
	rc3gky2Q4B7haQIgixPH/dMAZJm2TkRl3HEmQ=
MIME-Version: 1.0
Received: by 10.68.11.138 with SMTP id q10mr38816341pbb.37.1318862335773; Mon,
	17 Oct 2011 07:38:55 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Mon, 17 Oct 2011 07:38:55 -0700 (PDT)
In-Reply-To: <20124.15541.672787.681791@mariner.uk.xensource.com>
References: <ae251a2f9490dfa98553.1318594610@loki>
	<20124.15541.672787.681791@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 16:38:55 +0200
X-Google-Sender-Auth: NAqRtGMScB9bFWnDS7ISjIv_J4A
Message-ID: <CAPLaKK7NH6AZ8urX5yAmV3L_zt06NDJa3kgZUgZ8c3hFQG49Pg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] tools/build: append user includes and
	libraries at the end of the compile flags
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
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

> This looks reasonable to me, although the commit message still talks
> about EXTRA_*. =C2=A0Is everyone happy with the name
> USER_{LDFLAGS,CFLAGS} ?

In .config extra libraries and includes should be defined with
EXTRA_INCLUDES and EXTRA_LIB (the same way it is now), USER_LDFLAGS
and USER_CFLAGS is an internal make variable, and should not be set
directly by the user. Notice the lines:

+USER_LDFLAGS +=3D $(foreach i, $(EXTRA_LIB), -L$(i))
+USER_CFLAGS +=3D $(foreach i, $(EXTRA_INCLUDES), -I$(i))

EXTRA_LIB and EXTRA_INCLUDES is added to USER_LDFLAGS and USER_CFLAGS
instead of LDFLAGS and CFLAGS.

> I'll give people a few days to comment, but I'm inclined to apply this
> one.
>
> 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 Oct 17 07:40:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:40:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoMi-0005GT-7t; Mon, 17 Oct 2011 07:40:32 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFoLy-000506-JC
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:39:56 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1318862383!21602094!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20804 invoked from network); 17 Oct 2011 14:39:43 -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;
	17 Oct 2011 14:39:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8426645"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 14:39: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, 17 Oct 2011 15:39:43 +0100
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
	1RFoLv-0000lW-1c; Mon, 17 Oct 2011 14:39:43 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFoLv-0001Ut-0u;
	Mon, 17 Oct 2011 15:39:43 +0100
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: <20124.15919.17456.44148@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 15:39:43 +0100
To: Tapas Mishra <mightydreams@gmail.com>
Subject: Re: [Xen-devel] how hypervisor separates assembly instructions
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CALKraOZM_ohAg+ma27=38Y9nEDVs6zT=dUUTN54Rv3G9fAThug@mail.gmail.com>
References: <CALKraOZKGQjWag0Jk1-xZ_9o9Xh1N8pwBhdEhXOAT_dWpQA66Q@mail.gmail.com>
	<CALKraObo-k_QiE1RAVP0B=buQdAET-tF7e=zJRS-NXny=kVZMg@mail.gmail.com>
	<4E985ACD.3020808@citrix.com>
	<CALKraOZM_ohAg+ma27=38Y9nEDVs6zT=dUUTN54Rv3G9fAThug@mail.gmail.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

Tapas Mishra writes ("Re: [Xen-devel] how hypervisor separates assembly instructions"):
> thanks for your message I want to understand this last 2 lines in
> detail.As how does the hypervisor separates different OS and things
> "run."

I think your questions would best be dealt with by you attending a
basic course in computer architecture.  If you aren't already on one,
that is.

In any case xen-devel is not the appropriate please for this
conversation, I'm afraid.  Please would others not respond; it may
seem helpful, but actually it just attracts more inappropriate
questions, particularly at this time of year.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:41:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 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 1RFoO4-0005ii-3z; Mon, 17 Oct 2011 07:41:56 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFoNa-0005WR-1I
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:41:26 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1318862482!454843!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26453 invoked from network); 17 Oct 2011 14:41:23 -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;
	17 Oct 2011 14:41:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8426691"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 14:41: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, 17 Oct 2011 15:41:22 +0100
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
	1RFoNW-0000mB-4j; Mon, 17 Oct 2011 14:41:22 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFoNW-0001V3-40;
	Mon, 17 Oct 2011 15:41:22 +0100
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: <20124.16018.111545.330437@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 15:41:22 +0100
To: Roger Pau =?iso-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH] tools/build: append user includes and
	libraries at the end of the compile flags
In-Reply-To: <CAPLaKK7NH6AZ8urX5yAmV3L_zt06NDJa3kgZUgZ8c3hFQG49Pg@mail.gmail.com>
References: <ae251a2f9490dfa98553.1318594610@loki>
	<20124.15541.672787.681791@mariner.uk.xensource.com>
	<CAPLaKK7NH6AZ8urX5yAmV3L_zt06NDJa3kgZUgZ8c3hFQG49Pg@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

Roger Pau Monné writes ("Re: [Xen-devel] [PATCH] tools/build: append user includes and libraries at the end of the compile flags"):
> In .config extra libraries and includes should be defined with
> EXTRA_INCLUDES and EXTRA_LIB (the same way it is now), USER_LDFLAGS
> and USER_CFLAGS is an internal make variable, and should not be set
> directly by the user. Notice the lines:
> 
> +USER_LDFLAGS += $(foreach i, $(EXTRA_LIB), -L$(i))
> +USER_CFLAGS += $(foreach i, $(EXTRA_INCLUDES), -I$(i))
> 
> EXTRA_LIB and EXTRA_INCLUDES is added to USER_LDFLAGS and USER_CFLAGS
> instead of LDFLAGS and CFLAGS.

Oh, sorry, I didn't spot that.

In that case I think it's not correct because that's changing the
semantics of the existing EXTRA_* variables.  In particular, some
people might currently set EXTRA_* expecting them to come first.

We should have a new variable for the new semantics.  I confess I
didn't read your patch closely enough to spot that you hadn't done
that...

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:44:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:44:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoQT-000686-4r; Mon, 17 Oct 2011 07:44:25 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFoPx-0005vY-Pf
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:43:54 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318862598!59509349!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9261 invoked from network); 17 Oct 2011 14:43:20 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Oct 2011 14:43:20 -0000
Received: by ggnv5 with SMTP id v5so2773215ggn.30
	for <xen-devel@lists.xensource.com>;
	Mon, 17 Oct 2011 07:43: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
	:content-transfer-encoding;
	bh=SJse62mfByfeGNdn/SGJh3BgospjrH+FA2YLBXTKJW0=;
	b=aDE9rFrs0X/G7wwzn83fWPuKbL6g77d7JHmtds1UTde06o+NzC19u2sUD7GxKszUo6
	5FzmmrZHWtwTHcA7ECKQF4qD81tCaQD4saooxBgXZpE47h9QXg/HRB96ttOuyaCtvF+6
	kgxcGJ2ZbtM6pdvOmUZpETiGphNraR7KY2RGw=
MIME-Version: 1.0
Received: by 10.68.34.138 with SMTP id z10mr38643235pbi.105.1318862629100;
	Mon, 17 Oct 2011 07:43:49 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Mon, 17 Oct 2011 07:43:49 -0700 (PDT)
In-Reply-To: <20124.16018.111545.330437@mariner.uk.xensource.com>
References: <ae251a2f9490dfa98553.1318594610@loki>
	<20124.15541.672787.681791@mariner.uk.xensource.com>
	<CAPLaKK7NH6AZ8urX5yAmV3L_zt06NDJa3kgZUgZ8c3hFQG49Pg@mail.gmail.com>
	<20124.16018.111545.330437@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 16:43:49 +0200
X-Google-Sender-Auth: 6lUvmAaUQwOXU3xfsC1sbqQcB2Y
Message-ID: <CAPLaKK43qoajKpaydqYFP4b0ewXp98txzwH6K9sVeX7pJzAgQg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] tools/build: append user includes and
	libraries at the end of the compile flags
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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/10/17 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> Roger Pau Monn=C3=A9 writes ("Re: [Xen-devel] [PATCH] tools/build: append=
 user includes and libraries at the end of the compile flags"):
>> In .config extra libraries and includes should be defined with
>> EXTRA_INCLUDES and EXTRA_LIB (the same way it is now), USER_LDFLAGS
>> and USER_CFLAGS is an internal make variable, and should not be set
>> directly by the user. Notice the lines:
>>
>> +USER_LDFLAGS +=3D $(foreach i, $(EXTRA_LIB), -L$(i))
>> +USER_CFLAGS +=3D $(foreach i, $(EXTRA_INCLUDES), -I$(i))
>>
>> EXTRA_LIB and EXTRA_INCLUDES is added to USER_LDFLAGS and USER_CFLAGS
>> instead of LDFLAGS and CFLAGS.
>
> Oh, sorry, I didn't spot that.
>
> In that case I think it's not correct because that's changing the
> semantics of the existing EXTRA_* variables. =C2=A0In particular, some
> people might currently set EXTRA_* expecting them to come first.
>
> We should have a new variable for the new semantics. =C2=A0I confess I
> didn't read your patch closely enough to spot that you hadn't done
> that...

Ok, in that case I think we should define a new variable called
USER_CFLAGS and USER_LDFLAGS if everyone is comfortable with that. I
will send a new version with this changes.

>
> Ian.
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:45:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:45:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoRS-0006WH-NW; Mon, 17 Oct 2011 07:45:26 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFoQ7-0005xS-5f
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:44:03 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1318862639!33453770!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16053 invoked from network); 17 Oct 2011 14:43:59 -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;
	17 Oct 2011 14:43:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8426772"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 14:43:59 +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, 17 Oct 2011 15:43:59 +0100
Subject: Re: [Xen-devel] [PATCH 18 of 27 v2] libxl: merge libxl__device_del
	into libxl__device_remove
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Mon, 17 Oct 2011 15:43:59 +0100
In-Reply-To: <CAPLaKK5wMHzRwqS207RG-2+FHox2zBBnf7+ROdRNxx0AoCLJsg@mail.gmail.com>
References: <patchbomb.1318499605@localhost.localdomain>
	<95b2f3977d439bba3a01.1318499623@localhost.localdomain>
	<CAPLaKK5wMHzRwqS207RG-2+FHox2zBBnf7+ROdRNxx0AoCLJsg@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1318862639.16132.21.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-10-17 at 15:34 +0100, Roger Pau MonnÃ© wrote:

> > @@ -446,6 +395,67 @@ static int wait_for_dev_destroy(libxl__g
> >     return rc;
> >  }
> >
> > +/* Returns 0 on success, ERROR_* on fail */
> > +int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait)
> > +{
> > +    libxl_ctx *ctx = libxl__gc_owner(gc);
> > +    xs_transaction_t t;
> > +    char *be_path = libxl__device_backend_path(gc, dev);
> > +    char *state_path = libxl__sprintf(gc, "%s/state", be_path);
> > +    char *state = libxl__xs_read(gc, XBT_NULL, state_path);
> > +    int rc = 0;
> > +
> > +    if (!state)
> > +        goto out;
> > +    if (atoi(state) != 4) {
> > +        libxl__device_destroy_tapdisk(gc, be_path);
> > +        xs_rm(ctx->xsh, XBT_NULL, be_path);
> 
> I think here we should return something different than 0 (possibly 1?)
> so the number of watches (n_watches) is not increased.

Yes, I think you are correct. We need to distinguish 3 cases: error,
success--event pending and success--no event pending. But this patch
only considers 2 of them.

Previously there was a model of returning the number of events which are
pending which I think makes sense (I understand what that was for
now ;-)), so the returns would become ERROR_* (all -ve), 0 (success--no
event pending) and 1 (success--event pending).

> > +        goto out;
> > +    }
> > +
> > +retry_transaction:
> > +    t = xs_transaction_start(ctx->xsh);
> > +    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", strlen("0"));
> > +    xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
> > +    if (!xs_transaction_end(ctx->xsh, t, 0)) {
> > +        if (errno == EAGAIN)
> > +            goto retry_transaction;
> > +        else {
> > +            rc = ERROR_FAIL;
> > +            goto out;
> > +        }
> > +    }
> > +
> > +    xs_watch(ctx->xsh, state_path, be_path);
> > +    libxl__device_destroy_tapdisk(gc, be_path);
> > +
> > +    if (wait) {
> > +        struct timeval tv;
> > +        tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
> > +        tv.tv_usec = 0;
> > +        (void)wait_for_dev_destroy(gc, &tv);
> > +        xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
> 
> Here we should check if the device is removed correctly or not, so
> that the number of watches is not increased:
> 
> if(wait_for_dev_destroy(gc, &tv) != 0) /* device destroyed */
>     rc = 1;

Agreed.

> > +    }
> > +
> > +    rc = 0;
> 
> This should also be removed, since rc is initialized to 0 already.

Right. Thanks for your review.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:48:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:48:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoUn-0006y7-Kb; Mon, 17 Oct 2011 07:48:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFoUG-0006lO-Ed
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:48:20 -0700
X-Env-Sender: fbcyborg@gmail.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318862896!1399558!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14345 invoked from network); 17 Oct 2011 14:48:17 -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;
	17 Oct 2011 14:48:17 -0000
Received: by vcbfk13 with SMTP id fk13so4041853vcb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 17 Oct 2011 07:48:16 -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
	:content-type; bh=NXSI3uxqM3gbpyGsokSH8gQjK27nXq1FqmLgJXGeOLU=;
	b=gN2FPAXoWy2nd/dy3fVP7fAFsw3GsNusnI/A0BBZmfpiQZ/hX74Ya56HlpMb70CqI4
	M77pyRc0ffNt8OsZVt4lL4rXee560TBJMt+2MUIa7WEfnBWh/nxj1v/X5OdUULVviHHG
	u+3xE6kuGS/FJiyav9qD9v5mt2L1l1fUojvMM=
Received: by 10.52.36.234 with SMTP id t10mr20013075vdj.115.1318862896080;
	Mon, 17 Oct 2011 07:48:16 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.52.187.133 with HTTP; Mon, 17 Oct 2011 07:47:56 -0700 (PDT)
In-Reply-To: <CAP8Jb=q1DQ88K6T73YzadiNQ9FRJx2JWVZfLZ9bGFU-PDtSQhg@mail.gmail.com>
References: <CAP8Jb=q1DQ88K6T73YzadiNQ9FRJx2JWVZfLZ9bGFU-PDtSQhg@mail.gmail.com>
From: Flavio <fbcyborg@gmail.com>
Date: Mon, 17 Oct 2011 16:47:56 +0200
Message-ID: <CAP8Jb=qKrr31CzLR2ckFBCpgLhdxUZZ_5nigtY3ZgPDUahFJwg@mail.gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] Help with Windows guest and vncviewer
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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'm having some trouble running a windows guest after the migration to
the new XEN tool stack.
Note that I am running XEN on a Desktop Environment now, using the
gentoo-sources-3.0.6 kernel.
All the Linux guests are running without any problem at the moment.
I access to my Linux box as a normal user and when I need to start a
VM I become root and issue
the needed commands to start a domU with the xl toolstack.

Well, the problem is that when I start the windows guest, having the
following configuration file

kernel = "/usr/lib/xen/boot/hvmloader"
builder='hvm'
memory = 1024
shadow_memory = 8
name = "windows-7"
vif = [ 'type=ioemu, mac=00:16:3e:00:00:02, bridge=xenbr0' ]
acpi = 1
apic = 1
disk = [ 'file:/mnt/data/xen/vmstore/windows-7/xenwin7.img,xvda,w',
'file:/mnt/data/xen/vmstore/windows-7/Windows-7.iso,hdc:cdrom,r' ]
boot="dc"
sdl=0
vnc=1
vncconsole=1
vncpasswd=''
serial='pty'
usbdevice='tablet'

the guest starts but I can't start vncviewer.

# xl vncviewer 1

VNC Viewer Free Edition 4.1.3 for X - built Feb 16 2011 13:13:42
Copyright (C) 2002-2008 RealVNC Ltd.
See http://www.realvnc.com for information on VNC.
Invalid MIT-MAGIC-COOKIE-1 keyvncviewer: unable to open display ":0"

Is this problem solvable? I've read something about this in Internet
but I didn't understand
if it is possible to solve it or not.

Cheers,

-- 
Flavio

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 07:53:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 07:53:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoZR-0007Pg-A5; Mon, 17 Oct 2011 07:53:41 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFoYw-0007DM-3k
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:53:10 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1318863175!51345852!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6796 invoked from network); 17 Oct 2011 14:52:55 -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;
	17 Oct 2011 14:52:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8427035"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 14:52: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, 17 Oct 2011 15:52:46 +0100
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
	1RFoYX-0000q3-Q0; Mon, 17 Oct 2011 14:52:45 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFoYX-0001Vz-PE;
	Mon, 17 Oct 2011 15:52:45 +0100
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: <20124.16701.770037.22002@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 15:52:45 +0100
To: Flavio <fbcyborg@gmail.com>
Subject: Re: [Xen-devel] Help with Windows guest and vncviewer
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CAP8Jb=qKrr31CzLR2ckFBCpgLhdxUZZ_5nigtY3ZgPDUahFJwg@mail.gmail.com>
References: <CAP8Jb=q1DQ88K6T73YzadiNQ9FRJx2JWVZfLZ9bGFU-PDtSQhg@mail.gmail.com>
	<CAP8Jb=qKrr31CzLR2ckFBCpgLhdxUZZ_5nigtY3ZgPDUahFJwg@mail.gmail.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

Flavio writes ("[Xen-devel] Help with Windows guest and vncviewer"):
> # xl vncviewer 1
> 
> VNC Viewer Free Edition 4.1.3 for X - built Feb 16 2011 13:13:42
> Copyright (C) 2002-2008 RealVNC Ltd.
> See http://www.realvnc.com for information on VNC.
> Invalid MIT-MAGIC-COOKIE-1 keyvncviewer: unable to open display ":0"

Can you start "xterm" (or similar) at the root prompt ?  If not, then
fix that first and I think you will find that xl vncviewer will work.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 08:03:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 08:03:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoiW-00082f-3f; Mon, 17 Oct 2011 08:03:04 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFoeh-0007m6-6K
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 07:59:12 -0700
X-Env-Sender: jbaron@redhat.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318863543!1409384!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22658 invoked from network); 17 Oct 2011 14:59:03 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-13.tower-216.messagelabs.com with SMTP;
	17 Oct 2011 14:59:03 -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 p9HEwjJs023517
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 17 Oct 2011 10:58:45 -0400
Received: from redhat.com (dhcp-100-19-188.bos.redhat.com [10.16.19.188])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9HEwgGh030015; Mon, 17 Oct 2011 10:58:44 -0400
Date: Mon, 17 Oct 2011 10:58:42 -0400
From: Jason Baron <jbaron@redhat.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111017145842.GA2658@redhat.com>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins> <4E971580.6030300@goop.org>
	<20111014141701.GA2433@redhat.com> <4E986B2B.60803@goop.org>
	<20111014183539.GE2433@redhat.com> <4E988753.1080201@goop.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E988753.1080201@goop.org>
User-Agent: Mutt/1.5.20 (2009-12-10)
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, konrad.wilk@oracle.com,
	Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	rth@redhat.com, Andi Kleen <andi@firstfloor.org>,
	Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 14, 2011 at 12:02:43PM -0700, Jeremy Fitzhardinge wrote:
> On 10/14/2011 11:35 AM, Jason Baron wrote:
> > On Fri, Oct 14, 2011 at 10:02:35AM -0700, Jeremy Fitzhardinge wrote:
> >> On 10/14/2011 07:17 AM, Jason Baron wrote:
> >>> On Thu, Oct 13, 2011 at 09:44:48AM -0700, Jeremy Fitzhardinge wrote:
> >>>> pvops is basically a collection of ordinary _ops structures full of
> >>>> function pointers, but it has a layer of patching to help optimise it. 
> >>>> In the common case, this just replaces an indirect call with a direct
> >>>> one, but in some special cases it can inline code.  This is used for
> >>>> small, extremely performance-critical things like cli/sti, but it
> >>>> awkward to use in general because you have to specify the inlined code
> >>>> as a parameterless asm.
> >>>>
> >>> I haven't look at the pvops patching (probably should), but I was
> >>> wondering if jump labels could be used for it? Or is there something
> >>> that the pvops patching is doing that jump labels can't handle?
> >> Jump labels are essentially binary: you can use path A or path B.  pvops
> >> are multiway: there's no limit to the number of potential number of
> >> paravirtualized hypervisor implementations.  At the moment we have 4:
> >> native, Xen, KVM and lguest.
> >>
> > Yes, they are binary using the static_branch() interface. But in
> > general, the asm goto() construct, allows branching to any number of
> > labels. I have implemented the boolean static_branch() b/c it seems like
> > the most common interface for jump labels, but I imagine we will
> > introduce new interfaces as time goes on. You could of course nest
> > static_branch() calls, although I can't say I've tried it.
> 
> At the moment we're using pvops to optimise things like:
> 
> 	(*pv_mmu_ops.set_pte)(...);
> 
> To do that with some kind of multiway jump label thing, then that would
> need to expand out to something akin to:
> 
> 	if (static_branch(is_xen))
> 		xen_set_pte(...);
> 	else if (static_branch(is_kvm))
> 		kvm_set_pte(...);
> 	else if (static_branch(is_lguest))
> 		lguest_set_pte(...);
> 	else
> 		native_set_pte(...);
> 
> or something similar with an actual jump table.  But I don't see how it
> offers much scope for improvement.
> 
> If there were something like:
> 
> 	STATIC_INDIRECT_CALL(&pv_mmu_ops.set_pte)(...);
> 
> where the apparently indirect call is actually patched to be a direct
> call, then that would offer a large subset of what we do with pvops.
> 
> However, to completely replace pvops patching, the static branch / jump
> label mechanism would also need to work in assembler code, and be
> capable of actually patching callsites with instructions rather than
> just calls (sti/cli/pushf/popf being the most important).
> 
> We also keep track of the live registers at the callsite, and compare
> that to what registers the target functions will clobber in order to
> optimise the amount of register save/restore is needed.  And as a result
> we have some pvops functions with non-standard calling conventions to
> minimise save/restores on critical paths.
> 
> > We could have an interface, that allowed static branch(), to specifiy an
> > arbitrary number of no-ops such that call-site itself could look anyway
> > we want, if we don't know the bias at compile time. This, of course
> > means potentially greater than 1 no-op in the fast path. I assume the
> > pvops can have greater than 1 no-op in the fast path. Or is there a
> > better solution here?
> 
> See above.  But pvops patching is pretty well tuned for its job.
> 
> However, I definitely think its worth investigating some way to reduce
> the number of patching mechanisms, and if pvops patching doesn't stretch
> static jumps in unnatural ways, then perhaps that's the way to go.
> 
> Thanks,
>     J

ok, as things are now, I don't think jump labels are well suited for
replacing indirect calls. They could be used to have a single no-op that
is replaced with a jmp to the proper direct call...but at that point
you've taken an extra jump. That doesn't make sense to me.

Jump labels are well suited as mentioned for if/else type control flow,
while the indirect call table, at least to me, seems like a bit of a
different use-case...

Thanks,

-Jason

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 08:10:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 08:10:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFopm-0000FQ-GW; Mon, 17 Oct 2011 08:10:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFolh-0008NW-CT
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 08:06:21 -0700
X-Env-Sender: fbcyborg@gmail.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1318863966!51348105!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22248 invoked from network); 17 Oct 2011 15:06:07 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Oct 2011 15:06:07 -0000
Received: by vws13 with SMTP id 13so4155886vws.30
	for <xen-devel@lists.xensource.com>;
	Mon, 17 Oct 2011 08:06:17 -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=zr1ECHJpk9+2+ccPpA/YqHCHCMdbhQII4+EYm+6DNok=;
	b=TKPAWz/yB9AL762hs+TDcTTTFSMku0g0+wMXimjbR7KRPd0pdBBDts6VACbN5DXlFi
	ZT80jB+oFddRL7WqVNk3BtgyPlT4/gtwIzNXBRxD7GqKHRiJxDZ3BjU+wQMp+epP8ONZ
	DUNesGGDO+AvbmJA3IlX55BA1z0DsfaRaRFog=
Received: by 10.52.175.228 with SMTP id cd4mr20147016vdc.98.1318863977200;
	Mon, 17 Oct 2011 08:06:17 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.52.187.133 with HTTP; Mon, 17 Oct 2011 08:05:57 -0700 (PDT)
In-Reply-To: <20124.16701.770037.22002@mariner.uk.xensource.com>
References: <CAP8Jb=q1DQ88K6T73YzadiNQ9FRJx2JWVZfLZ9bGFU-PDtSQhg@mail.gmail.com>
	<CAP8Jb=qKrr31CzLR2ckFBCpgLhdxUZZ_5nigtY3ZgPDUahFJwg@mail.gmail.com>
	<20124.16701.770037.22002@mariner.uk.xensource.com>
From: Flavio <fbcyborg@gmail.com>
Date: Mon, 17 Oct 2011 17:05:57 +0200
Message-ID: <CAP8Jb=qAwyJR4YyoVWa9H3QetTJML6-BpKtq+7GyjmVOWTGM1A@mail.gmail.com>
Subject: Re: [Xen-devel] Help with Windows guest and vncviewer
To: Ian Jackson <Ian.Jackson@eu.citrix.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 17 October 2011 16:52, Ian Jackson <Ian.Jackson@eu.citrix.com> wrote:
> Can you start "xterm" (or similar) at the root prompt ? =A0If not, then
> fix that first and I think you will find that xl vncviewer will work.
Actually no. I can't start xterm at least in this way. I usually fix
this problem using this method:

sudo su - -c "xauth merge $HOME/.Xauthority;export DISPLAY=3D:0.0 && xterm"
as a normal user. And it works.

So, if I put "xl vncviewer" in place of "xterm" in the command above,
I can start it.

This problem has been introduced about 2 years ago on Linux systems with th=
e new
Xorg and it comes when you are not the root user (in the sense that
you logged in as
a normal user and use "su" to issue the xl commands etc.).

So I was wandering if there would be another solution to this problem
in addiction to
the one I've just posted above.

Thanks!

--=20
Flavio

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 08:13:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 08:13:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoss-0000hV-QG; Mon, 17 Oct 2011 08:13:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoob-00007r-8L; Mon, 17 Oct 2011 08:09:22 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318864124!59512860!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20811 invoked from network); 17 Oct 2011 15:08:44 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Oct 2011 15:08:44 -0000
Received: by wyi11 with SMTP id 11so1799320wyi.30
	for <multiple recipients>; Mon, 17 Oct 2011 08:09:14 -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=J9MKmjL98XAoeLGlKG7fV9aLxS6fGEAbR5uYQq5F89g=;
	b=ursA/UNkJMD49mWlJOTR9g0lV7SkQd/QG7im7yrIp553ICs0lPPFu3TID3GHaTujJY
	kyofe6kdgIYZOm+NkEx6OfIT86/72P1Tjb0U3P2Y+GhWh8kaSWDOp+gRh2P7bQkZSGOa
	I27eHVYRYVib9tbRnoC38aa+NnD1AUUAmmg1k=
Received: by 10.216.134.80 with SMTP id r58mr6715290wei.63.1318864154566;
	Mon, 17 Oct 2011 08:09:14 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id y10sm31590162wbm.14.2011.10.17.08.09.11
	(version=SSLv3 cipher=OTHER); Mon, 17 Oct 2011 08:09:12 -0700 (PDT)
Message-ID: <4E9C4516.2070902@xen.org>
Date: Mon, 17 Oct 2011 16:09:10 +0100
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: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org>
	<20111003185309.GC15608@phenom.oracle.com>
	<4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
In-Reply-To: <1318859996.16132.16.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	Joseph Glanville <joseph.glanville@orionvm.com.au>,
	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

Hi everybody.

We probably lost track of the discussion a little. I started summarizing 
by taking the key points and resources mentioned in this thread and 
added to http://openetherpad.org/TSPGIEOBiS

I am going to spend a bit more time tomorrow doing a bit more research. 
I also installed some wiki plug-ins for attention boxes that should help 
better maintain the pages and make things more manageable once we did 
the first cleanup.

Have a look, add to the etherpad page and I will publish more widely 
(e.g. blog, etc.)

Also, who will create the IRC channel

Lars


On 17/10/2011 14:59, Ian Campbell wrote:
> On Fri, 2011-10-14 at 04:43 +0100, Andrew Bobulsky wrote:
>> Hello folks,
>>
>> I wish I could say that I have loads of technical Xen knowledge to
>> contribute, but I unfortunately do not.  However, I've got a soft spot
>> for well documented F/OSS projects and would like to help if I can.
>> If your manpower requirements aren't of a strictly technical nature, I
>> could perform other tasks related to this endeavor, like edit new
>> docs, test procedures, and so on.
> The more the merrier IMHO, there's certainly scope for not strictly
> technical contributions too.
>
>> Should I simply hop on IRC in the next few days to see if that would
>> be the case?
>>
>> Cheers,
>> Andrew Bobulsky
>>
>> On Oct 13, 2011, at 2:12 PM, Konrad Rzeszutek Wilk
>> <konrad.wilk@oracle.com>  wrote:
>>
>>> On Thu, Oct 13, 2011 at 05:44:27AM +1100, Joseph Glanville wrote:
>>>> Sounds good, 26th works.
>>>>
>>>> Real-time colab on IRC would be nice to get organised maybe #xendocday on
>>>> freenode?
>>> Yes, will be on #xendocday.
>>>
>>> _______________________________________________
>>> 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
>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 08:18:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 08:18:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFoxi-0001rN-BC; Mon, 17 Oct 2011 08:18:46 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFox8-0001f1-0Z; Mon, 17 Oct 2011 08:18:10 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1318864686!466375!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21290 invoked from network); 17 Oct 2011 15:18:06 -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;
	17 Oct 2011 15:18:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8427658"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 15:17:47 +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, 17 Oct 2011 16:17:47 +0100
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Lars Kurth <lars.kurth@xen.org>
Date: Mon, 17 Oct 2011 16:17:46 +0100
In-Reply-To: <4E9C4516.2070902@xen.org>
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org> <20111003185309.GC15608@phenom.oracle.com>
	<4E92D809.9000504@xen.org> <20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318864667.16132.22.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	Joseph Glanville <joseph.glanville@orionvm.com.au>,
	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

> Also, who will create the IRC channel

They just pop onto being if you join them.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 08:24:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 08:24:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFp3A-0002zx-GQ; Mon, 17 Oct 2011 08:24:24 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFoy1-0001vx-L4
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 08:19:06 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1318864739!19829676!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13510 invoked from network); 17 Oct 2011 15:18:59 -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;
	17 Oct 2011 15:18:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8427694"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 15:18: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, 17 Oct 2011 16:18:59 +0100
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
	1RFoxv-00010m-2P; Mon, 17 Oct 2011 15:18:59 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFoxv-0001Xq-1F;
	Mon, 17 Oct 2011 16:18:59 +0100
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: <20124.18275.27223.829053@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 16:18:59 +0100
To: Flavio <fbcyborg@gmail.com>
Subject: Re: [Xen-devel] Help with Windows guest and vncviewer
In-Reply-To: <CAP8Jb=qAwyJR4YyoVWa9H3QetTJML6-BpKtq+7GyjmVOWTGM1A@mail.gmail.com>
References: <CAP8Jb=q1DQ88K6T73YzadiNQ9FRJx2JWVZfLZ9bGFU-PDtSQhg@mail.gmail.com>
	<CAP8Jb=qKrr31CzLR2ckFBCpgLhdxUZZ_5nigtY3ZgPDUahFJwg@mail.gmail.com>
	<20124.16701.770037.22002@mariner.uk.xensource.com>
	<CAP8Jb=qAwyJR4YyoVWa9H3QetTJML6-BpKtq+7GyjmVOWTGM1A@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

Flavio writes ("Re: [Xen-devel] Help with Windows guest and vncviewer"):
> Actually no. I can't start xterm at least in this way. I usually fix
> this problem using this method:
...
> So I was wandering if there would be another solution to this
> problem in addiction to the one I've just posted above.

You would have to ask your Linux distro about that.  This is not
something that the Xen project can fix.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 08:46:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 08:46:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFpOL-0004PM-Vq; Mon, 17 Oct 2011 08:46:18 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFp3e-00032y-M4
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 08:24:55 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318865091!465300!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26223 invoked from network); 17 Oct 2011 15:24:51 -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;
	17 Oct 2011 15:24:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8427854"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 15:24: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, 17 Oct 2011 16:24:51 +0100
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
	1RFp3b-000130-3h; Mon, 17 Oct 2011 15:24:51 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFp3b-0000AV-2a;
	Mon, 17 Oct 2011 16:24:51 +0100
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: <20124.18627.12215.753412@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 16:24:51 +0100
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] Re: [PATCH 0 of 4 v2] libxl: support json for pretty
	printing objects
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1318498294.21903.814.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317983270@cosworth.uk.xensource.com>
	<1318498294.21903.814.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 0 of 4 v2] libxl: support json for > In my V1 posting of this series I also included "libxl: probe disk
> backend type in libxl_device_disk_add" but forgot it in the repost, so
> here is patch 5/4:

Thanks, acked and applied all 5.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 08:50:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 08:50:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFpRi-0004v9-DV; Mon, 17 Oct 2011 08:49:46 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFp3v-00034k-8Y
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 08:25:11 -0700
X-Env-Sender: fbcyborg@gmail.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1318865101!29541600!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1668 invoked from network); 17 Oct 2011 15:25:02 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Oct 2011 15:25:02 -0000
Received: by vws13 with SMTP id 13so4180336vws.30
	for <xen-devel@lists.xensource.com>;
	Mon, 17 Oct 2011 08:25: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:content-transfer-encoding;
	bh=KHllAagsII50qEtp4vWKWwphHpUGWT845WScOtMdg/U=;
	b=k4a+6Kmvztd7new88ZU+IIyIYR4aQKkF47Kny6ZgwBlLSmSjh/WAIz99zI7bevCVJD
	L5rKmjHJuEZNbNtofGX1LV9UK0kLOcTLSMgFbBhgqgfATuLQmys1JqOZWloybFemOQJ9
	eIKR5lNn3JpiLPizk2E1WawXOOhHcYi0yyyDk=
Received: by 10.52.29.9 with SMTP id f9mr6756774vdh.30.1318865101421; Mon, 17
	Oct 2011 08:25:01 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.52.187.133 with HTTP; Mon, 17 Oct 2011 08:24:41 -0700 (PDT)
In-Reply-To: <20124.18275.27223.829053@mariner.uk.xensource.com>
References: <CAP8Jb=q1DQ88K6T73YzadiNQ9FRJx2JWVZfLZ9bGFU-PDtSQhg@mail.gmail.com>
	<CAP8Jb=qKrr31CzLR2ckFBCpgLhdxUZZ_5nigtY3ZgPDUahFJwg@mail.gmail.com>
	<20124.16701.770037.22002@mariner.uk.xensource.com>
	<CAP8Jb=qAwyJR4YyoVWa9H3QetTJML6-BpKtq+7GyjmVOWTGM1A@mail.gmail.com>
	<20124.18275.27223.829053@mariner.uk.xensource.com>
From: Flavio <fbcyborg@gmail.com>
Date: Mon, 17 Oct 2011 17:24:41 +0200
Message-ID: <CAP8Jb=rjRFw53Tjzy-fGnfy-KL2msmfHg6w9iWs-yh-Zmzs5wQ@mail.gmail.com>
Subject: Re: [Xen-devel] Help with Windows guest and vncviewer
To: Ian Jackson <Ian.Jackson@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 October 2011 17:18, Ian Jackson <Ian.Jackson@eu.citrix.com> wrote:
>
> You would have to ask your Linux distro about that. =A0This is not
> something that the Xen project can fix.
You are right and please apologize me for taking your time in this
circumstance.

Anyway let me thank you again for your exemplary support.

--=20
Flavio

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:11:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:11:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFpmr-0006aS-Hu; Mon, 17 Oct 2011 09:11:37 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFpEw-00049z-Qj
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 08:36:35 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-10.tower-27.messagelabs.com!1318865766!40254598!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2256 invoked from network); 17 Oct 2011 15:36:06 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-10.tower-27.messagelabs.com with SMTP;
	17 Oct 2011 15:36:06 -0000
Received: from [213.136.142.250] (account d.faggioli@sssup.it HELO
	[192.168.0.3]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72461758 for xen-devel@lists.xensource.com;
	Mon, 17 Oct 2011 17:36:30 +0200
From: Dario Faggioli <raistlin@linux.it>
To: xen-devel <xen-devel@lists.xensource.com>
Date: Mon, 17 Oct 2011 17:36:27 +0200
Face: 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
X-Mailer: Evolution 3.0.3 (3.0.3-1.fc15) 
Message-ID: <1318865791.25056.28.camel@Palantir>
Mime-Version: 1.0
Subject: [Xen-devel] Issue with PCI-passthrough and pvops
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============1417779320=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============1417779320==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-U+wNTk24haY51Uv2BD5C"


--=-U+wNTk24haY51Uv2BD5C
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hi everyone,

I'm trying to setup PCI-passthrough for a network card on a testbox.
With HVM, everything seems to work, while if I try with a pv-guest the
domain crashes!

Here's the thing:
--
# xl pci-list-assignable-devices=20
0000:07:00.0
0000:07:00.1

# cat xen/VMs/Debian-squeeze.pv | grep pci=3D
#   pci=3D[ '[SSSS:]BB:DD.F[,option1[,option2[...]]]', ... ]
pci=3D[ '07:00.0' ]

# xl create xen/VMs/Debian-squeeze.pv
Parsing config file xen/VMs/Debian-squeeze.pv
Daemon running with PID 5588

# xl list
Name                                        ID   Mem VCPUs	State	Time(s)
Domain-0                                     0   750    16     r-----    22=
05.3
Debian-squeeze_pv                            3   128     2     ---sc-      =
19.8
--

Again, the very same config and PCI device for an HVM domain starts, and
I can see and bring up the NIC.

What am I doing wrong?

Thanks and Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-U+wNTk24haY51Uv2BD5C
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk6cS30ACgkQk4XaBE3IOsSxRACfXp+KY72iwa5Diy/CnyZ54UQN
e6oAoIx7H/vDi7ygz5s/a+PiTMK6scsr
=X5K8
-----END PGP SIGNATURE-----

--=-U+wNTk24haY51Uv2BD5C--



--===============1417779320==
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

--===============1417779320==--



From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:24:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:24:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFpyb-0007Dw-Rx; Mon, 17 Oct 2011 09:23:47 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFpFl-0004Be-9E; Mon, 17 Oct 2011 08:37:25 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318865839!467171!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26622 invoked from network); 17 Oct 2011 15:37:19 -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;
	17 Oct 2011 15:37:19 -0000
Received: by wyi11 with SMTP id 11so1836392wyi.30
	for <multiple recipients>; Mon, 17 Oct 2011 08:37:19 -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=dp6cuGYakurHFV9VLgvRykJZkWmuqg7cN5spBw6OSBo=;
	b=RgQCBPvFv7q6upL/ndU/OasZnmcmdhaKswTtlqKbLPDJLUop9bR/2/qWXj1nHIIFlt
	qLgmBjnFatT08uK8TRXl+APsGLa95JkaUBNKUsQQxkdBvGnZ7ybaiaXzgJBv2b7MgT3w
	qhUJBbJR2NudGOAaV3r4u6UZQZ/vyOq+8z5f0=
Received: by 10.227.24.8 with SMTP id t8mr6768429wbb.72.1318865838861;
	Mon, 17 Oct 2011 08:37:18 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id i29sm31698977wbp.22.2011.10.17.08.37.16
	(version=SSLv3 cipher=OTHER); Mon, 17 Oct 2011 08:37:17 -0700 (PDT)
Message-ID: <4E9C4BAB.9020605@xen.org>
Date: Mon, 17 Oct 2011 16:37:15 +0100
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: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
References: <20110922130618.GA13238@phenom.oracle.com>
	<20110929141317.GX12984@reaktio.net>
	<CAOzFzEieWhgoBWEXQFjqr8PYoVOAcU20rtA2Q3OhyA+=dD9Atg@mail.gmail.com>
	<4E85A9B7.7040605@xen.org>
	<20111003185309.GC15608@phenom.oracle.com>
	<4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
In-Reply-To: <1318864667.16132.22.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	Joseph Glanville <joseph.glanville@orionvm.com.au>,
	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

Cool.

I am wondering what people think about archiving vs deleting wiki pages. 
Obviously some pages can be deleted (stuff about events, job listings, 
old TODO lists, etc.).

Others may still be valuable to legacy users. See 
http://wiki.xen.org/xenwiki/Archive_Page : the problem right now is that 
archived pages aren't identifiable and thus confusing. One way of fixing 
this would be to rename the page from FooBar to Archived/FooBar

Views are welcome

Lars

On 17/10/2011 16:17, Ian Campbell wrote:
>> Also, who will create the IRC channel
> They just pop onto being if you join them.
>
>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:35:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:35:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqAB-0008Ub-HW; Mon, 17 Oct 2011 09:35:43 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFpIE-0004Dy-RO
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 08:39:59 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1318865992!465253!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18948 invoked from network); 17 Oct 2011 15:39:55 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Oct 2011 15:39:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8428159"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 15:39: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; Mon, 17 Oct 2011 16:39:52 +0100
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
	1RFpI7-0001Ap-PY; Mon, 17 Oct 2011 15:39:51 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFpI7-0000Bo-NB;
	Mon, 17 Oct 2011 16:39:51 +0100
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: <20124.19527.706498.819017@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 16:39:51 +0100
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH] tools/check: check for headers and libraries
	in EXTRA_INCLUDES and EXTRA_LIB
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <8fe2ca552de44aa679be.1318512275@loki>
References: <8fe2ca552de44aa679be.1318512275@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] tools/check: check for headers and libraries in EXTRA_INCLUDES and EXTRA_LIB"):
> tools/check: check for headers and libraries in EXTRA_INCLUDES and EXTRA_LIB

Thanks, but:

>  check-build:
> -	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) ./chk build
> +	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) EXTRA_INCLUDES=$(EXTRA_INCLUDES) EXTRA_LIB=$(EXTRA_LIB) ./chk build

Perhaps this would be more easily achieved with "export" ?

>  has_header() {
> +	check_sys_root || return 1
> +

The check_sys_root stuff seems unrelated ?  Or at least, it's not
mentioned in your commit message.  I'm not sure if it should be
disentangled but it should definitely be mentioned.  (I'm not much of
an expert on tools/check.)

Also, I should probably wait with applying this until after your
revised USER_* flags variables patch, since you probably want to do a
similar job for USER_ ?

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:36:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:36:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqB9-0000SW-2B; Mon, 17 Oct 2011 09:36:43 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFpLK-0004IG-Nc
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 08:43:11 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1318866124!29557798!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2722 invoked from network); 17 Oct 2011 15:42:04 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 17 Oct 2011 15:42:04 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Mon, 17 Oct 2011 16:42:03 +0100
Message-Id: <4E9C68E8020000780005BB1A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Mon, 17 Oct 2011 16:42:00 +0100
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: mark.langsdorf@amd.com
Subject: [Xen-devel] [PATCH] 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

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 Mon Oct 17 09:37:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:37:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqCM-0000ra-RH; Mon, 17 Oct 2011 09:37:58 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFpNH-0004KE-4i
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 08:45:11 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-5.tower-182.messagelabs.com!1318865889!17652613!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6069 invoked from network); 17 Oct 2011 15:38:09 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-5.tower-182.messagelabs.com with SMTP;
	17 Oct 2011 15:38:09 -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
	p9HFc62G029495; Mon, 17 Oct 2011 15:38:06 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 p9HFb5AJ009160; 
	Mon, 17 Oct 2011 11:37:05 -0400
Message-ID: <4E9C4BB1.1060506@tycho.nsa.gov>
Date: Mon, 17 Oct 2011 11:37:21 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] xl: Support backend domain ID for disks
References: <1318461127-6684-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20124.13831.994269.162705@mariner.uk.xensource.com>
In-Reply-To: <20124.13831.994269.162705@mariner.uk.xensource.com>
X-Enigmail-Version: 1.3
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: 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 10/17/2011 10:04 AM, Ian Jackson wrote:
> Daniel De Graaf writes ("[Xen-devel] [PATCH] xl: Support backend domain ID for disks"):
>> Allow specification of backend domains for disks, either in the config
>> file or via block-attach
> 
> This is probably going in the right direction but I have some
> questions and observations.
> 
> Firstly, much of the rest of the code in libxl assumes that the
> pdev_path string can (depending on the backend type) be dereferenced
> by libxl.  That is, if libxl is running in dom0, it assumes that the
> block device can be dereferenced in dom0.
> 
> So for this to work properly I think at least you need to investigate
> the backend type selection machinery and the pdev_path validation and
> make sure they are somehow disabled.

Adding the ability to disable the stat() in libxl__device_disk_set_backend
seems like it would be useful separate from setting the backend in order
to support formats where the pdev_path is not a file. Do the iscsi/nbd
backend types already do this somehow?

> 
> Having never done driver domains: how does the backend domain know
> what it is supposed to be doing ?  Does it just get the pdev_path via
> xenstore and do the rest itself ?  Does it get told the backend type ?
> What is the resulting xenstore protocol ?
> 
> Is this a reason to preserve the arrangement whereby the target of
> blkback is set up by a hotplug script, rather than by a script
> executed directly by libxl ?

For the "phy" backend type, libxl can populate this correctly from outside 
the backend as long as it can determine proper device major/minor numbers 
for the backend's kernel (perhaps by sharing the backend's /dev via NFS). 
Other backend types like blktap2 that require scripts to be started will 
require switching back to starting the devices via hotplug. I do think
running the script directly from libxl when possible is a good idea as this
makes it easier to debug.

> Finally, one other relatively minor thing.  I don't think "backend" is
> the appropriate name for "backend domid".  How about "backenddomain" ?
> (This may not be compatible with xm I guess...)
> 

This was chosen to match the backend specification for network devices,
but for disks it is confusing with "backendtype" already taken. Since
smashed-together names are hard to read, would "backend_domain" be a
better choice?

-- 
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 Mon Oct 17 09:39:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:39:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqDM-0001G6-35; Mon, 17 Oct 2011 09:39:00 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFpR2-0004m0-Uu
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 08:49:05 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1318866142!465564!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24347 invoked from network); 17 Oct 2011 15:42:22 -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 Oct 2011 15:42:22 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8428219"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 15:42: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; Mon, 17 Oct 2011 16:42:21 +0100
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
	1RFpKX-0001Cz-8u; Mon, 17 Oct 2011 15:42:21 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFpKX-0000Bz-86;
	Mon, 17 Oct 2011 16:42:21 +0100
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: <20124.19677.239702.693620@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 16:42:21 +0100
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [Xen-devel] [PATCH] xl: Support backend domain ID for disks
In-Reply-To: <4E9C4BB1.1060506@tycho.nsa.gov>
References: <1318461127-6684-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20124.13831.994269.162705@mariner.uk.xensource.com>
	<4E9C4BB1.1060506@tycho.nsa.gov>
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>,
	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

Daniel De Graaf writes ("Re: [Xen-devel] [PATCH] xl: Support backend domain ID for disks"):
> Adding the ability to disable the stat() in libxl__device_disk_set_backend
> seems like it would be useful separate from setting the backend in order
> to support formats where the pdev_path is not a file. Do the iscsi/nbd
> backend types already do this somehow?

No, but they don't currently work, either :-/.  This is certainly
needed.

> For the "phy" backend type, libxl can populate this correctly from outside 
> the backend as long as it can determine proper device major/minor numbers 
> for the backend's kernel (perhaps by sharing the backend's /dev via NFS). 

OMG, that's horrible.

> Other backend types like blktap2 that require scripts to be started will 
> require switching back to starting the devices via hotplug. I do think
> running the script directly from libxl when possible is a good idea as this
> makes it easier to debug.

I think that in the New World Order, a driver domain should be told
the pdev_path and left to get on with it.  So something in the driver
domain needs to watch xenstore.  Perhaps a BSD-style backendd ?

> This was chosen to match the backend specification for network devices,
> but for disks it is confusing with "backendtype" already taken. Since
> smashed-together names are hard to read, would "backend_domain" be a
> better choice?

If we have "backendtype" then we already have squashed together names.
But let's see what other people say about the colour of this bikeshed.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:40:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:40:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqEj-0001iT-H8; Mon, 17 Oct 2011 09:40:25 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFpjw-0006IN-5O
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 09:08:37 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318867701!470774!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29763 invoked from network); 17 Oct 2011 16:08:22 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-10.tower-21.messagelabs.com with SMTP;
	17 Oct 2011 16:08:22 -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
	p9HG8Jd9022078; Mon, 17 Oct 2011 16:08:19 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 p9HG7i8C011247; 
	Mon, 17 Oct 2011 12:07:44 -0400
Message-ID: <4E9C52E0.8080809@tycho.nsa.gov>
Date: Mon, 17 Oct 2011 12:08:00 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] xl: Support backend domain ID for disks
References: <1318461127-6684-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20124.13831.994269.162705@mariner.uk.xensource.com>
	<4E9C4BB1.1060506@tycho.nsa.gov>
	<20124.19677.239702.693620@mariner.uk.xensource.com>
In-Reply-To: <20124.19677.239702.693620@mariner.uk.xensource.com>
X-Enigmail-Version: 1.3
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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/17/2011 11:42 AM, Ian Jackson wrote:
> Daniel De Graaf writes ("Re: [Xen-devel] [PATCH] xl: Support backend domain ID for disks"):
>> Adding the ability to disable the stat() in libxl__device_disk_set_backend
>> seems like it would be useful separate from setting the backend in order
>> to support formats where the pdev_path is not a file. Do the iscsi/nbd
>> backend types already do this somehow?
> 
> No, but they don't currently work, either :-/.  This is certainly
> needed.
> 

If we change the stat() so that it's only done on types that require a file,
then all that is required is to create a "remote-phy" type that does not do
the stat locally. This type would also avoid trying to fill in nodes like
"physical-device" that are derived from the stat(), leaving those to be
filled in by the backend domain.

>> For the "phy" backend type, libxl can populate this correctly from outside 
>> the backend as long as it can determine proper device major/minor numbers 
>> for the backend's kernel (perhaps by sharing the backend's /dev via NFS). 
> 
> OMG, that's horrible.

Agreed, it's not a viable solution for anything long-term.

>> Other backend types like blktap2 that require scripts to be started will 
>> require switching back to starting the devices via hotplug. I do think
>> running the script directly from libxl when possible is a good idea as this
>> makes it easier to debug.
> 
> I think that in the New World Order, a driver domain should be told
> the pdev_path and left to get on with it.  So something in the driver
> domain needs to watch xenstore.  Perhaps a BSD-style backendd ?
> 

That would make the most sense. Linux does get events when this part of
xenstore is updated, so it may be possible to fire off the needed events
from udev/hotplug depending on what can be picked up there.

>> This was chosen to match the backend specification for network devices,
>> but for disks it is confusing with "backendtype" already taken. Since
>> smashed-together names are hard to read, would "backend_domain" be a
>> better choice?
> 
> If we have "backendtype" then we already have squashed together names.
> But let's see what other people say about the colour of this bikeshed.
> 
> Ian.
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:41:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:41:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqFl-00026l-4t; Mon, 17 Oct 2011 09:41:29 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFpkr-0006Nm-Bg
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 09:09:36 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1318867770!500910!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1716 invoked from network); 17 Oct 2011 16:09:30 -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;
	17 Oct 2011 16:09:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8429128"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 16:09: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; Mon, 17 Oct 2011 17:09:30 +0100
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
	1RFpkn-0001Vr-Qj; Mon, 17 Oct 2011 16:09:29 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFpkn-0005fr-M1;
	Mon, 17 Oct 2011 17:09:29 +0100
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: <20124.21305.639644.204339@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 17:09:29 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1 of 6] [OCAML] Rename the ocaml libraries
	[and 4 more messages]
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1318496205.21903.799.camel@zakaz.uk.xensource.com>,
	<bc9cab33404f16214945.1318498132@localhost.localdomain>,
	<ae737bfccb2e584ec29e.1318498358@localhost.localdomain>,
	<c4c4e2768341b3003734.1318498394@localhost.localdomain>,
	<6ca28d551fd5f3d7d784.1318499230@localhost.localdomain>
References: <6ca28d551fd5f3d7d784.1318499230@localhost.localdomain>
	<c4c4e2768341b3003734.1318498394@localhost.localdomain>
	<ae737bfccb2e584ec29e.1318498358@localhost.localdomain>
	<bc9cab33404f16214945.1318498132@localhost.localdomain>
	<patchbomb.1317983158@snoosnoo2.uk.xensource.com>
	<ffbc5e9929d52531a9ec.1317983159@snoosnoo2.uk.xensource.com>
	<1318496205.21903.799.camel@zakaz.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Anthony.Perard@citrix.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Jon Ludlam <jonathan.ludlam@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 of 6] [OCAML] Rename the ocaml libraries"):
> ocaml: align build output

> libxl: correctly propagate errors from libxl_domain_resume

> libxl: libxl__e820_alloc must take a libxl__gc.

> libxc: osdep: report missing backends in common code

> libxl: remove QMP warning when no pty style serial device is configured

Acked and applied all five of these.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:42:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:42:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqGf-0002UI-BB; Mon, 17 Oct 2011 09:42:25 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFplW-0006QR-1c
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 09:10:15 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1318867810!1418924!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26995 invoked from network); 17 Oct 2011 16:10:10 -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;
	17 Oct 2011 16:10:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8429144"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 16:10: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, 17 Oct 2011 17:10:10 +0100
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
	1RFplR-0001WA-VH; Mon, 17 Oct 2011 16:10:10 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFplR-0005g0-U6;
	Mon, 17 Oct 2011 17:10:09 +0100
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: <20124.21345.919555.526429@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 17:10:09 +0100
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [Xen-devel] [PATCH] xl: Support backend domain ID for disks
In-Reply-To: <4E9C52E0.8080809@tycho.nsa.gov>
References: <1318461127-6684-1-git-send-email-dgdegra@tycho.nsa.gov>
	<20124.13831.994269.162705@mariner.uk.xensource.com>
	<4E9C4BB1.1060506@tycho.nsa.gov>
	<20124.19677.239702.693620@mariner.uk.xensource.com>
	<4E9C52E0.8080809@tycho.nsa.gov>
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>,
	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

Daniel De Graaf writes ("Re: [Xen-devel] [PATCH] xl: Support backend domain ID for disks"):
> If we change the stat() so that it's only done on types that require a file,
> then all that is required is to create a "remote-phy" type that does not do
> the stat locally. This type would also avoid trying to fill in nodes like
> "physical-device" that are derived from the stat(), leaving those to be
> filled in by the backend domain.

Right, that seems like a good approach.

> > I think that in the New World Order, a driver domain should be told
> > the pdev_path and left to get on with it.  So something in the driver
> > domain needs to watch xenstore.  Perhaps a BSD-style backendd ?
> 
> That would make the most sense. Linux does get events when this part of
> xenstore is updated, so it may be possible to fire off the needed events
> from udev/hotplug depending on what can be picked up there.

Right.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:44:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09: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 1RFqIJ-000338-Ej; Mon, 17 Oct 2011 09:44:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFpxG-0007B8-VT
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 09:22:23 -0700
X-Env-Sender: deepak.s@hcl.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318868508!53152530!1
X-Originating-IP: [203.105.186.23]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9578 invoked from network); 17 Oct 2011 16:21:50 -0000
Received: from gws07.hcl.com (HELO gws07.hcl.com) (203.105.186.23)
	by server-7.tower-27.messagelabs.com with AES256-SHA encrypted SMTP;
	17 Oct 2011 16:21:50 -0000
Received: from chn-hclin-ht01.CORP.HCL.IN (10.249.64.35) by
	CHN-HCLIN-EDGE3.HCL.COM (10.249.64.140) with Microsoft SMTP Server id
	8.2.254.0; Mon, 17 Oct 2011 21:49:53 +0530
Received: from CHN-HCLT-HT03.HCLT.CORP.HCL.IN (10.108.45.35) by
	chn-hclin-ht01.CORP.HCL.IN (10.249.64.35) with Microsoft SMTP Server
	(TLS) id 8.2.254.0; Mon, 17 Oct 2011 21:52:15 +0530
Received: from CHN-HCLT-EVS07.HCLT.CORP.HCL.IN ([fe80::f46b:fdf2:3218:985d])
	by CHN-HCLT-HT03.HCLT.CORP.HCL.IN ([::1]) with mapi; Mon, 17 Oct 2011
	21:52:15 +0530
From: "Deepak  Kr. Sharma - ERS, HCL Tech" <deepak.s@hcl.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Mon, 17 Oct 2011 21:50:08 +0530
Thread-Topic: HXen compilation
Thread-Index: AQHMjOjuc5LKCN+/JU6R8100d03jKQ==
Message-ID: <90F0F47595235141A4380FCF01B0185B224144E217@CHN-HCLT-EVS07.HCLT.CORP.HCL.IN>
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] HXen compilation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 All,

I am trying to compile HXen on windows but facing issues. I have tried usin=
g nmake and mingw.

Is anyone aware of the how the HXen code compiles on windows?

Regards,
Deepak

::DISCLAIMER::
---------------------------------------------------------------------------=
--------------------------------------------

The contents of this e-mail and any attachment(s) are confidential and inte=
nded for the named recipient(s) only.
It shall not attach any liability on the originator or HCL or its affiliate=
s. Any views or opinions presented in
this email are solely those of the author and may not necessarily reflect t=
he opinions of HCL or its affiliates.
Any form of reproduction, dissemination, copying, disclosure, modification,=
 distribution and / or publication of
this message without the prior written consent of the author of this e-mail=
 is strictly prohibited. If you have
received this email in error please delete it and notify the sender immedia=
tely. Before opening any mail and
attachments please check them for viruses and defect.

---------------------------------------------------------------------------=
--------------------------------------------

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:46:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:46:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqKv-0004GV-LC; Mon, 17 Oct 2011 09:46:49 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFpzb-0007Gu-0C
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 09:24:47 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1318868224!22619846!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10917 invoked from network); 17 Oct 2011 16:17:04 -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;
	17 Oct 2011 16:17:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,359,1315180800"; 
   d="scan'208";a="8429317"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 16:17: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, 17 Oct 2011 17:17:04 +0100
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
	1RFps7-0001aF-Io; Mon, 17 Oct 2011 16:17:03 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RFps7-0005ga-GR;
	Mon, 17 Oct 2011 17:17:03 +0100
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: <20124.21759.342541.404863@mariner.uk.xensource.com>
Date: Mon, 17 Oct 2011 17:17:03 +0100
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH v2] libxl: reimplement buffer for bootloading
	and drop data if buffer is full
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <72ef13cb4609c97a26ef.1318503856@loki>
References: <72ef13cb4609c97a26ef.1318503856@loki>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: 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

Roger Pau Monne writes ("[Xen-devel] [PATCH v2] libxl: reimplement buffer for bootloading and drop data if buffer is full"):
> +        /* Move buffers around to drop already consumed data */
> +        if (xenconsoled_cons > 0) {
> +            xenconsoled_prod -= xenconsoled_cons;
> +            memmove(xenconsoled_buf, &xenconsoled_buf[xenconsoled_cons], xenconsoled_prod);

This has quite a few overly-long lines.  Can you keep them to 75ish
please ?

> -        ret = select(nfds, &rsel, &wsel, NULL, NULL);
> +        ret = select(nfds, &rsel, &wsel, NULL, &wait);
>          if (ret < 0)
>              goto out_err;

This needs to handle EINTR.  Ie, if EINTR happens, just loop again.
(A better implementation would actually subtract the timeout but
let's not do that now).

> +        timeout = ret == 0 ? 1 : 0;

This seems a slightly odd approach.  How about
  if (ret==0) {
     empty the ring buffer
     continue;
  }
?

And you should avoid setting a timeout if the buffer is empty, so that
a completely idle setup just sits and waits rather than polling every
second.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:47:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:47:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqLj-0004jv-T0; Mon, 17 Oct 2011 09:47:39 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFq92-00083b-Or
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 09:34:33 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1318869267!1422053!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19339 invoked from network); 17 Oct 2011 16:34:29 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-6.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 17 Oct 2011 16:34:29 -0000
Received: from tazenda.hos.anvin.org ([IPv6:2001:470:861f::feed:face:f00d])
	(authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9HGXVTk030818
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Mon, 17 Oct 2011 09:33:49 -0700
Message-ID: <4E9C58D6.9010103@zytor.com>
Date: Mon, 17 Oct 2011 09:33:26 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <cover.1318466916.git.jeremy.fitzhardinge@citrix.com>
	<1318503245.24856.12.camel@twins> <4E971580.6030300@goop.org>
In-Reply-To: <4E971580.6030300@goop.org>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Nick Piggin <npiggin@kernel.dk>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Andi Kleen <andi@firstfloor.org>, Avi Kivity <avi@redhat.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH RFC V5 00/11] Paravirtualized ticketlocks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/13/2011 09:44 AM, Jeremy Fitzhardinge wrote:
> 
> Yeah, that's a good question.  There are three mechanisms with somewhat
> overlapping concerns:
> 
>   * alternative()
>   * pvops patching
>   * jump_labels
> 
> Alternative() is for low-level instruction substitution, and really only
> makes sense at the assembler level with one or two instructions.
> 
> pvops is basically a collection of ordinary _ops structures full of
> function pointers, but it has a layer of patching to help optimise it. 
> In the common case, this just replaces an indirect call with a direct
> one, but in some special cases it can inline code.  This is used for
> small, extremely performance-critical things like cli/sti, but it
> awkward to use in general because you have to specify the inlined code
> as a parameterless asm.
> 
> Jump_labels is basically an efficient way of doing conditionals
> predicated on rarely-changed booleans - so it's similar to pvops in that
> it is effectively a very ordinary C construct optimised by dynamic code
> patching.

Then there is static_cpu_has(), which is basically jump labels
implemented using the alternatives mechanism.

If nothing else it would be good to:

1. Make more general use of ops patching;
2. Merge mechanisms where practical.

	-hpa

-- 
H. Peter Anvin, Intel Open Source Technology Center
I work for Intel.  I don't speak on their behalf.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:48:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:48:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqMV-0005A0-0o; Mon, 17 Oct 2011 09:48:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFqEw-0001nH-Ks
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 09:40:39 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1318869634!1426536!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29898 invoked from network); 17 Oct 2011 16:40:35 -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; 17 Oct 2011 16:40:35 -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
	p9HGeSP5020627
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 17 Oct 2011 16:40:30 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
	p9HGSKTL007541
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 17 Oct 2011 16:28: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
	p9HGeMQq026499; Mon, 17 Oct 2011 11:40:22 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 17 Oct 2011 09:40:21 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id F3DD1823D4; Mon, 17 Oct 2011 12:40:20 -0400 (EDT)
Date: Mon, 17 Oct 2011 12:40:20 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Dario Faggioli <raistlin@linux.it>
Subject: Re: [Xen-devel] Issue with PCI-passthrough and pvops
Message-ID: <20111017164020.GE19684@phenom.dumpdata.com>
References: <1318865791.25056.28.camel@Palantir>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318865791.25056.28.camel@Palantir>
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.4E9C5A7E.009E,ss=1,re=0.000,fgs=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 Mon, Oct 17, 2011 at 05:36:27PM +0200, Dario Faggioli wrote:
> Hi everyone,
> 
> I'm trying to setup PCI-passthrough for a network card on a testbox.
> With HVM, everything seems to work, while if I try with a pv-guest the
> domain crashes!
> 
> Here's the thing:
> --
> # xl pci-list-assignable-devices 
> 0000:07:00.0
> 0000:07:00.1
> 
> # cat xen/VMs/Debian-squeeze.pv | grep pci=
> #   pci=[ '[SSSS:]BB:DD.F[,option1[,option2[...]]]', ... ]
> pci=[ '07:00.0' ]
> 
> # xl create xen/VMs/Debian-squeeze.pv
> Parsing config file xen/VMs/Debian-squeeze.pv
> Daemon running with PID 5588
> 
> # xl list
> Name                                        ID   Mem VCPUs	State	Time(s)
> Domain-0                                     0   750    16     r-----    2205.3
> Debian-squeeze_pv                            3   128     2     ---sc-      19.8
> --
> 
> Again, the very same config and PCI device for an HVM domain starts, and
> I can see and bring up the NIC.
> 
> What am I doing wrong?

Do you have 'iommu=soft' in your guest config?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:50:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:50:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqOx-0005fu-An; Mon, 17 Oct 2011 09:50:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFqOX-0005Sw-Ma
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 09:50:34 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1318870229!22640047!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21000 invoked from network); 17 Oct 2011 16:50:30 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-4.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 17 Oct 2011 16:50:30 -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
	p9HGoJPj011801
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 17 Oct 2011 16:50:21 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
	p9HGgItB024343
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 17 Oct 2011 16:42:18 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
	p9HGoCcO007233; Mon, 17 Oct 2011 11:50:12 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 17 Oct 2011 09:50:12 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 6A0C5823D4; Mon, 17 Oct 2011 12:50:11 -0400 (EDT)
Date: Mon, 17 Oct 2011 12:50:11 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <20111017165011.GA19724@phenom.dumpdata.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-2-git-send-email-konrad.wilk@oracle.com>
	<4E9C2F52020000780005BA4C@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9C2F52020000780005BA4C@nat28.tlf.novell.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.0A090202.4E9C5CCD.00CD,ss=1,re=0.000,fgs=0
Cc: hch@infradead.org, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org
Subject: [Xen-devel] Re: [PATCH 1/3] xen/blkback: Support 'feature-barrier'
 aka old-style BARRIER requests.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 17, 2011 at 12:36:18PM +0100, Jan Beulich wrote:
> >>> On 10.10.11 at 17:28, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> > @@ -481,6 +503,10 @@ static void __end_block_io_op(struct pending_req 
> > *pending_req, int error)
> >  			      pending_req->operation, pending_req->status);
> >  		xen_blkif_put(pending_req->blkif);
> >  		free_req(pending_req);
> > +		if (atomic_read(&pending_req->blkif->refcnt) <= 2) {
> > +			if (atomic_read(&pending_req->blkif->drain))
> > +				complete(&pending_req->blkif->drain_complete);
> > +		}
> 
> Shouldn't this be done *before* the call the free_req()? Or

Yes, otherwise we could referencing somebody's else blkif->refcnt.

Thanks for spotting that.
> alternatively a local copy of pending_req->blkif be obtained before
> freeing pending_req (which could be used in a couple more places
> in this function)?
> 
> Jan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 09:53:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 09:53:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqRU-0006Bz-98; Mon, 17 Oct 2011 09:53:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFqR0-0005wz-41
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 09:53:06 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318870381!1428508!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29533 invoked from network); 17 Oct 2011 16:53:02 -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; 17 Oct 2011 16:53:02 -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
	p9HGqsUG003566
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 17 Oct 2011 16:52:56 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
	p9HGisgv028327
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 17 Oct 2011 16:44: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
	p9HGqm0Q009264; Mon, 17 Oct 2011 11:52:48 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 17 Oct 2011 09:52:48 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 5A5A7823D4; Mon, 17 Oct 2011 12:52:47 -0400 (EDT)
Date: Mon, 17 Oct 2011 12:52:47 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <20111017165247.GB19724@phenom.dumpdata.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-2-git-send-email-konrad.wilk@oracle.com>
	<4E9C3B39020000780005BA5D@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9C3B39020000780005BA5D@nat28.tlf.novell.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.4E9C5D69.00DF,ss=1,re=0.000,fgs=0
Cc: hch@infradead.org, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org
Subject: [Xen-devel] Re: [PATCH 1/3] xen/blkback: Support 'feature-barrier'
 aka old-style BARRIER requests.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 17, 2011 at 01:27:05PM +0100, Jan Beulich wrote:
> >>> On 10.10.11 at 17:28, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> > We emulate the barrier requests by draining the outstanding bio's
> > and then sending the WRITE_FLUSH command. To drain the I/Os
> > we use the refcnt that is used during disconnect to wait for all
> > the I/Os before disconnecting from the frontend. We latch on its
> > value and if it reaches either the threshold for disconnect or when
> > there are no more outstanding I/Os, then we have drained all I/Os.
> > 
> > Suggested-by: Christopher Hellwig <hch@infradead.org>
> > Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> > ---
> >  drivers/block/xen-blkback/blkback.c |   37 +++++++++++++++++++++++++++++++++-
> >  drivers/block/xen-blkback/common.h  |    5 ++++
> >  drivers/block/xen-blkback/xenbus.c  |   18 +++++++++++++++++
> >  3 files changed, 58 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/block/xen-blkback/blkback.c 
> > b/drivers/block/xen-blkback/blkback.c
> > index e0dab61..184b133 100644
> > --- a/drivers/block/xen-blkback/blkback.c
> > +++ b/drivers/block/xen-blkback/blkback.c
> > @@ -452,6 +452,23 @@ static void xen_blk_discard(struct xen_blkif *blkif, 
> > struct blkif_request *req)
> >  	make_response(blkif, req->id, req->operation, status);
> >  }
> >  
> > +static void xen_blk_drain_io(struct xen_blkif *blkif)
> > +{
> > +	atomic_set(&blkif->drain, 1);
> > +	do {
> > +		wait_for_completion_interruptible_timeout(
> > +				&blkif->drain_complete, HZ);
> > +
> > +		if (!atomic_read(&blkif->drain))
> > +			break;
> > +		/* The initial value is one, and one refcnt taken at the
> > +		 * start of the xen_blkif_schedule thread. */
> > +		if (atomic_read(&blkif->refcnt) <= 2)
> > +			break;
> 
> Shouldn't this test be done the very first thing in the loop? It looks
> racy the way it's placed now, and it would incur a 1 sec stall if this
> was the only request currently being processed (as no completion
> of ane earlier request could signal completion).

Sure does. An earlier version of this (not posted), had this check right
before going in the loop as all of the requests might have been already
processed.

I accidently dropped that logic as I moved this whole code into a function.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 10:07:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 10:07:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqfI-0006y7-3T; Mon, 17 Oct 2011 10:07:52 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFqbY-0006gU-EF
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 10:04:24 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318871036!477705!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14719 invoked from network); 17 Oct 2011 17:03:57 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 17 Oct 2011 17:03:57 -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
	p9HH3ZWM016999
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 17 Oct 2011 17:03:37 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
	p9HH3YXK024817
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 17 Oct 2011 17:03:34 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
	p9HH3S5o017489; Mon, 17 Oct 2011 12:03:28 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 17 Oct 2011 10:03:28 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 83FF6823D4; Mon, 17 Oct 2011 13:03:27 -0400 (EDT)
Date: Mon, 17 Oct 2011 13:03:27 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: M A Young <m.a.young@durham.ac.uk>,
	Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] Improve GPT support in pygrub
Message-ID: <20111017170327.GC19756@phenom.dumpdata.com>
References: <alpine.DEB.2.00.1110162117190.27361@vega-c.dur.ac.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1110162117190.27361@vega-c.dur.ac.uk>
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.4E9C5FE9.0156:SCFMA922111,ss=1,re=-4.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, Oct 16, 2011 at 09:45:00PM +0100, M A Young wrote:
> This patch is part of a fix I applied to Fedora 16 to get pygrub to
> boot a Fedora 16 guest (see
> https://bugzilla.redhat.com/show_bug.cgi?id=745335 ). By default
> Fedora 16 installs a Bios boot partition as the first GPT partition
> to contain grub2 boot code, and the grub2 configuration files are in
> the GPT second partition. Pygrub currently only checks the first
> partition, so the attached patch tells it to check all the GPT
> partitions for grub configuration.
> 
> 	Michael Young

> Check all GPT partitions for grub configuration, not just the first
> Signed-off-by: Michael Young <m.a.young@durham.ac.uk>

Tested-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

> 
> --- a/tools/pygrub/src/pygrub	2011-10-16 20:58:02.000000000 +0100
> +++ b/tools/pygrub/src/pygrub	2011-10-16 20:59:52.000000000 +0100
> @@ -78,9 +78,17 @@
>  def get_fs_offset_gpt(file):
>      fd = os.open(file, os.O_RDONLY)
>      # assume the first partition is an EFI system partition.
> -    os.lseek(fd, SECTOR_SIZE * 2, 0)
> +    os.lseek(fd, SECTOR_SIZE, 0)
>      buf = os.read(fd, 512)
> -    return struct.unpack("<Q", buf[32:40])[0] * SECTOR_SIZE
> +    partcount = struct.unpack("<L", buf[80:84])[0]
> +    partsize = struct.unpack("<L", buf[84:88])[0]
> +    i = partcount
> +    offsets = []
> +    while i>0:
> +        buf = os.read(fd, partsize)
> +        offsets.append(struct.unpack("<Q", buf[32:40])[0] * SECTOR_SIZE)
> +        i -= 1
> +    return offsets
>  
>  FDISK_PART_SOLARIS=0xbf
>  FDISK_PART_SOLARIS_OLD=0x82
> @@ -114,7 +122,9 @@
>                  continue # no solaris magic at that offset, ignore partition
>  
>          if type == FDISK_PART_GPT:
> -            offset = get_fs_offset_gpt(file)
> +            for offset in get_fs_offset_gpt(file):
> +                part_offs.append(offset)
> +            break
>  
>          # Active partition has 0x80 as the first byte.
>          # If active, prepend to front of list, otherwise append to back.

> _______________________________________________
> 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 Oct 17 10:11:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 10: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 1RFqiY-0007Pw-PC; Mon, 17 Oct 2011 10:11:15 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFqcA-0006hN-Nz
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 10:05:03 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1318871045!42257772!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26902 invoked from network); 17 Oct 2011 17:04:06 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	17 Oct 2011 17:04:06 -0000
Received: by ywm13 with SMTP id 13so1823553ywm.30
	for <xen-devel@lists.xensource.com>;
	Mon, 17 Oct 2011 10:04:33 -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=uvsk4UhkE/+snp6x852g+qsmKMcukxIqQeBZvipqMis=;
	b=rpedZd7EcRLl0ia/6HBCEav52AW14NCdljQuaYGxOp2frvl0FL64jrXMhhOiWKMT5E
	egXs8YaIQFowSgBjBrId5cx/iKtmXb+tTMkwZOkW3NhQUpOnCuqfwZFG/CurNvXgmRpL
	CWfHxM82hGhlyepOMPz9AjlXSS0NRG6qWFfZ8=
MIME-Version: 1.0
Received: by 10.68.17.194 with SMTP id q2mr39298432pbd.88.1318871073323; Mon,
	17 Oct 2011 10:04:33 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Mon, 17 Oct 2011 10:04:33 -0700 (PDT)
In-Reply-To: <CAPLaKK43qoajKpaydqYFP4b0ewXp98txzwH6K9sVeX7pJzAgQg@mail.gmail.com>
References: <ae251a2f9490dfa98553.1318594610@loki>
	<20124.15541.672787.681791@mariner.uk.xensource.com>
	<CAPLaKK7NH6AZ8urX5yAmV3L_zt06NDJa3kgZUgZ8c3hFQG49Pg@mail.gmail.com>
	<20124.16018.111545.330437@mariner.uk.xensource.com>
	<CAPLaKK43qoajKpaydqYFP4b0ewXp98txzwH6K9sVeX7pJzAgQg@mail.gmail.com>
Date: Mon, 17 Oct 2011 19:04:33 +0200
X-Google-Sender-Auth: N8Ys4J7WywwBQTZRPsYPgqhAwlA
Message-ID: <CAPLaKK7Ob7qazk=eoTRyEy42R-14Gt_fYv-fBGxvFPM2ksqzFA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] tools/build: append user includes and
	libraries at the end of the compile flags
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
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 second through, I think it would be appropriate to rename EXTRA_LIB
and EXTRA_INCLUDES to PREPEND_LIB and PREPEND_INCLUDES, and create two
new variables called APPEND_INCLUDES and APPEND_LIB that perform the
same task as USER_CFLAGS and USER_LDFLAGS (append at the end). I think
it would be much more clearer using descriptive variable names, since
USER_ and EXTRA_ can lead to confusion.

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 Oct 17 10:13:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 10:13:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqkx-0007v5-Du; Mon, 17 Oct 2011 10:13:43 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFqdS-0006is-9U
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 10:06:00 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1318871152!35587705!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7016 invoked from network); 17 Oct 2011 17:05:54 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 17 Oct 2011 17:05:54 -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
	p9HH5kfs019781
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 17 Oct 2011 17:05: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
	p9HGrckH019160
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 17 Oct 2011 16:53:39 GMT
Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9HH5eBK013183; Mon, 17 Oct 2011 12:05:40 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 17 Oct 2011 10:05:40 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id A722F823D4; Mon, 17 Oct 2011 13:05:39 -0400 (EDT)
Date: Mon, 17 Oct 2011 13:05:39 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Paolo Bonzini <pbonzini@redhat.com>,
	Ian Campbell <Ian.Campbell@eu.citrix.com>
Subject: Re: [Xen-devel] (no subject)
Message-ID: <20111017170539.GD19756@phenom.dumpdata.com>
References: <1318837249-19483-1-git-send-email-pbonzini@redhat.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318837249-19483-1-git-send-email-pbonzini@redhat.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.0A090203.4E9C606E.019E,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 Mon, Oct 17, 2011 at 09:40:49AM +0200, Paolo Bonzini wrote:

Something went wrong with your patchbomb..

anyhow, lets CC Ian here since he is the maintainer.

> 
> Writing [PATCH] netback: disable features not supported by netfront ...
> ntent-Transfer-Encoding: 7bit
> Subject: [PATCH] netback: disable features not supported by netfront
> X-Mercurial-Node: eb896361fc70b60b9a257d0c82e19633a11b9d41
> Message-Id: <eb896361fc70b60b9a25.1318837062@yakj.usersys.redhat.com>
> User-Agent: Mercurial-patchbomb/1.9.1
> Date: Mon, 17 Oct 2011 09:37:42 +0200
> From: pbonzini@redhat.com
> To: pbonzini@redhat.com
> 
> # HG changeset patch
> # User Paolo Bonzini <pbonzini@redhat.com>
> # Date 1318837036 -7200
> # Node ID eb896361fc70b60b9a257d0c82e19633a11b9d41
> # Parent  3c900d6a5f6a51ff1547f21fef30ab8b92feccc9
> netback: disable features not supported by netfront
> 
> Netback works by first setting all possible features, and then
> resetting some after connection, if the front-end didn't negotiate them.
> Except that in the old 2.6.18 tree the "resetting" part was missing.
> In the pvops tree, this should work correctly through the fix_features
> mechanism.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> 
> diff --git a/drivers/xen/netback/interface.c b/drivers/xen/netback/interface.c
> --- a/drivers/xen/netback/interface.c
> +++ b/drivers/xen/netback/interface.c
> @@ -98,8 +98,9 @@ static int netbk_change_mtu(struct net_d
>  void netif_set_features(netif_t *netif)
>  {
>  	struct net_device *dev = netif->dev;
> -	int features = dev->features;
> +	int features;
>  
> +	features = dev->features & ~(NETIF_F_SG|NETIF_F_TSO|NETIF_F_IP_CSUM);
>  	if (netif->can_sg)
>  		features |= NETIF_F_SG;
>  	if (netif->gso)
> 
> 
> 
> _______________________________________________
> 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 Oct 17 10:15:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 10:15:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqn5-0008Lm-I2; Mon, 17 Oct 2011 10:15:55 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFqhU-0007EM-SR
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 10:10:12 -0700
X-Env-Sender: brendan@cs.ubc.ca
X-Msg-Ref: server-2.tower-174.messagelabs.com!1318871405!35596202!1
X-Originating-IP: [198.162.52.68]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2812 invoked from network); 17 Oct 2011 17:10:05 -0000
Received: from zakopane.cs.ubc.ca (HELO mail.quuxuum.com) (198.162.52.68)
	by server-2.tower-174.messagelabs.com with SMTP;
	17 Oct 2011 17:10:05 -0000
Received: from zanzibar.kublai.com (kremvax.cs.ubc.ca [198.162.52.67])
	by mail.quuxuum.com (Postfix) with ESMTPSA id 287C85FE00;
	Mon, 17 Oct 2011 10:09:48 -0700 (PDT)
Date: Mon, 17 Oct 2011 10:10:01 -0700
From: Brendan Cully <brendan@cs.ubc.ca>
To: rshriram@cs.ubc.ca
Subject: Re: [Xen-devel] [PATCH 1 of 3 V3] tools/libxc: Remus Checkpoint
	Compression
Message-ID: <20111017171000.GA23874@kremvax.cs.ubc.ca>
Mail-Followup-To: rshriram@cs.ubc.ca, xen-devel@lists.xensource.com,
	ian.jackson@eu.citrix.com
References: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
	<47fdd52af616131142ac.1318549672@athos.nss.cs.ubc.ca>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <47fdd52af616131142ac.1318549672@athos.nss.cs.ubc.ca>
X-Operating-System: Darwin 11.2.0 i386
User-Agent: Mutt/1.5.21+46 (b01d63af6fea) (2011-07-01)
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 Thursday, 13 October 2011 at 16:47, rshriram@cs.ubc.ca wrote:
> # HG changeset patch
> # User Shriram Rajagopalan <rshriram@cs.ubc.ca>
> # Date 1318545413 25200
> # Node ID 47fdd52af616131142ac5faeacd83f40786da59a
> # 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>

Acked-by: Brendan Cully <brendan@cs.ubc.ca>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 10:17:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 10:17:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqoS-0000JH-Uz; Mon, 17 Oct 2011 10:17:21 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFqi3-0007Is-52
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 10:10:45 -0700
X-Env-Sender: brendan@cs.ubc.ca
X-Msg-Ref: server-10.tower-27.messagelabs.com!1318871414!40265728!1
X-Originating-IP: [198.162.52.68]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9084 invoked from network); 17 Oct 2011 17:10:14 -0000
Received: from zakopane.cs.ubc.ca (HELO mail.quuxuum.com) (198.162.52.68)
	by server-10.tower-27.messagelabs.com with SMTP;
	17 Oct 2011 17:10:14 -0000
Received: from zanzibar.kublai.com (kremvax.cs.ubc.ca [198.162.52.67])
	by mail.quuxuum.com (Postfix) with ESMTPSA id 6C9925FE00;
	Mon, 17 Oct 2011 10:10:25 -0700 (PDT)
Date: Mon, 17 Oct 2011 10:10:38 -0700
From: Brendan Cully <brendan@cs.ubc.ca>
To: rshriram@cs.ubc.ca
Subject: Re: [Xen-devel] [PATCH 2 of 3 V3] remus: command line switche to
	enable/disable checkpoint compression
Message-ID: <20111017171038.GB23874@zanzibar.kublai.com>
Mail-Followup-To: rshriram@cs.ubc.ca, xen-devel@lists.xensource.com,
	ian.jackson@eu.citrix.com
References: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
	<32c4d844813aa22ca05d.1318549673@athos.nss.cs.ubc.ca>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <32c4d844813aa22ca05d.1318549673@athos.nss.cs.ubc.ca>
X-Operating-System: Darwin 11.2.0 i386
User-Agent: Mutt/1.5.21+46 (b01d63af6fea) (2011-07-01)
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 Thursday, 13 October 2011 at 16:47, rshriram@cs.ubc.ca wrote:
> # HG changeset patch
> # User Shriram Rajagopalan <rshriram@cs.ubc.ca>
> # Date 1318545415 25200
> # Node ID 32c4d844813aa22ca05df0b855857a607ac4c056
> # Parent  47fdd52af616131142ac5faeacd83f40786da59a
> remus: command line switche 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>

Acked-by: Brendan Cully <brendan@cs.ubc.ca>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 10:18:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 10:18:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqpS-0000hC-HW; Mon, 17 Oct 2011 10:18:22 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFqiL-0007MC-Lb
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 10:11:02 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1318871457!1426635!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21549 invoked from network); 17 Oct 2011 17:10:58 -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; 17 Oct 2011 17:10:58 -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
	p9HH945o024157
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 17 Oct 2011 17:09:05 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
	p9HH12hm026515
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 17 Oct 2011 17:01:03 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
	p9HH8t1J022593; Mon, 17 Oct 2011 12:08:56 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 17 Oct 2011 10:08:55 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 3EFA7823D4; Mon, 17 Oct 2011 13:08:54 -0400 (EDT)
Date: Mon, 17 Oct 2011 13:08:54 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Borislav Petkov <bp@amd64.org>
Subject: Re: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
	update in Xen dom0
Message-ID: <20111017170854.GE19756@phenom.dumpdata.com>
References: <20111012101615.GA14966@aftab> <4E95D9E7.6090304@zytor.com>
	<4E95E7FE.6050302@goop.org> <20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E96198F.4030906@zytor.com> <20111013073352.GB501@aftab>
	<20111013095708.GA1862@aftab>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111013095708.GA1862@aftab>
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.4E9C6132.02E6,ss=1,re=0.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	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>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.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 Thu, Oct 13, 2011 at 11:57:08AM +0200, Borislav Petkov wrote:
> On Thu, Oct 13, 2011 at 03:33:52AM -0400, Borislav Petkov wrote:
> > Bottomline is, extending initrd handling to deal with multiple initrd
> > images might turn out to be easier to do than the linked list deal.
> 
> Alternatively and IMHO, we could avoid the bootloader enabling by
> making the ucode part of the initramfs and pull up some of the
> prepare_namespace() work in kernel_init() before smp_init() so that we
> can have it ready for when bootstrapping the cores.

<scratches his head>
You are still using the microcode API (the existing one) to
program the CPUs right? It is just that you are fetching the images
much much earlier than it currently is done?


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 10:19:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 10:19:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFqqN-00014a-5C; Mon, 17 Oct 2011 10:19:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFqjB-0007Xl-Gq
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 10:11:54 -0700
X-Env-Sender: brendan@cs.ubc.ca
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318871509!35594985!1
X-Originating-IP: [198.162.52.68]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2792 invoked from network); 17 Oct 2011 17:11:50 -0000
Received: from zakopane.cs.ubc.ca (HELO mail.quuxuum.com) (198.162.52.68)
	by server-10.tower-174.messagelabs.com with SMTP;
	17 Oct 2011 17:11:50 -0000
Received: from zanzibar.kublai.com (kremvax.cs.ubc.ca [198.162.52.67])
	by mail.quuxuum.com (Postfix) with ESMTPSA id 1C0AF5FE00;
	Mon, 17 Oct 2011 10:11:36 -0700 (PDT)
Date: Mon, 17 Oct 2011 10:11:49 -0700
From: Brendan Cully <brendan@cs.ubc.ca>
To: rshriram@cs.ubc.ca
Subject: Re: [Xen-devel] [PATCH 3 of 3 V3] tools/libxc: Document checkpoint
	compression in xg_save_restore.h
Message-ID: <20111017171149.GC23874@zanzibar.kublai.com>
Mail-Followup-To: rshriram@cs.ubc.ca, xen-devel@lists.xensource.com,
	ian.jackson@eu.citrix.com
References: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
	<37fa1bdbecacd8fefcc3.1318549674@athos.nss.cs.ubc.ca>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <37fa1bdbecacd8fefcc3.1318549674@athos.nss.cs.ubc.ca>
X-Operating-System: Darwin 11.2.0 i386
User-Agent: Mutt/1.5.21+46 (b01d63af6fea) (2011-07-01)
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 Thursday, 13 October 2011 at 16:47, rshriram@cs.ubc.ca wrote:
> # HG changeset patch
> # User Shriram Rajagopalan <rshriram@cs.ubc.ca>
> # Date 1318545418 25200
> # Node ID 37fa1bdbecacd8fefcc382183ad25fd6c76300c3
> # Parent  32c4d844813aa22ca05df0b855857a607ac4c056
> tools/libxc: Document checkpoint compression in xg_save_restore.h
> 
> Add comments to xg_save_restore.h explaining changes in Remus
> wire protocol when checkpoint compression is enabled.
> 
> Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>

Acked-by: Brendan Cully <brendan@cs.ubc.ca>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 10:41:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 10:41:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFrBy-0002tS-7P; Mon, 17 Oct 2011 10:41:38 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFrBS-0002fo-8x
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 10:41:06 -0700
X-Env-Sender: dkiper@net-space.pl
X-Msg-Ref: server-14.tower-182.messagelabs.com!1318873262!22487196!1
X-Originating-IP: [89.174.63.77]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8544 invoked from network); 17 Oct 2011 17:41:03 -0000
Received: from router-fw.net-space.pl (HELO router-fw.net-space.pl)
	(89.174.63.77)
	by server-14.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 17 Oct 2011 17:41:03 -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 S1600385Ab1JQRkg (ORCPT <rfc822;xen-devel@lists.xensource.com>);
	Mon, 17 Oct 2011 19:40:36 +0200
Date: Mon, 17 Oct 2011 19:40:36 +0200
From: Daniel Kiper <dkiper@net-space.pl>
To: xen-devel@lists.xensource.com, konrad.wilk@oracle.com,
	ian.jackson@eu.citrix.com, ian.campbell@eu.citrix.com,
	jeremy@goop.org, v.tolstov@selfip.ru
Message-ID: <20111017174036.GD29445@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: 
Subject: [Xen-devel] Strange (???) xl behavior for save,
	migrate and migrate-receive
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

During work on memory hotplug for Xen I have received some notices
that it breaks machine migration. I had some time and I done some
tests a few days ago. It looks that source of this problem is
xl command itself. I discovered that generic save/restore mechanism
is used for machine migration. xl save store machine config which
was used at machine startup with current machine state. It means
that it does not take into account any config changes which were made
during machine run. This behavior does not allow migrating domain,
on which memory hotplug was used, to restore on destination host
because current size of memory allocated for machine is larger than
size of memory allocated at startup by memory option. Yes, it is
memory option not maxmem option. However, it is not important here
because I think that generic behavior of xl save, migrate and migrate-receive
should be changed (fix for memory hotplug case is workaround for the
generic problem which will return sooner or later). I think that xl save,
migrate and migrate-receive should use current machine state and __CURRENT__
config (from xenstore ???) to do their tasks. However, I am aware that
this change could have large impact on current users. That is why I decided
to ask you about your opinion and suggested solutions in that case
(in general not memory hotplug only).

Currently, these problems could be workaround by passing
path to config file with current config to xl command.

I have done tests on Xen Ver. 4.1.2-rc3. I have not done tests
on xm command, however, I suppose that it has similar behavior.

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 10:42:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 10:42:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFrDE-0003Jp-Sq; Mon, 17 Oct 2011 10:42:56 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFrBn-0002oX-Ji
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 10:41:27 -0700
X-Env-Sender: hpa@zytor.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318873282!1430955!1
X-Originating-IP: [198.137.202.10]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25880 invoked from network); 17 Oct 2011 17:41:24 -0000
Received: from terminus.zytor.com (HELO mail.zytor.com) (198.137.202.10)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 17 Oct 2011 17:41:24 -0000
Received: from anacreon.sc.intel.com ([134.134.139.76]) (authenticated bits=0)
	by mail.zytor.com (8.14.5/8.14.5) with ESMTP id p9HHelIm001809
	(version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO);
	Mon, 17 Oct 2011 10:40:47 -0700
Message-ID: <4E9C6886.20600@zytor.com>
Date: Mon, 17 Oct 2011 10:40:22 -0700
From: "H. Peter Anvin" <hpa@zytor.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
	update in Xen dom0
References: <20111012101615.GA14966@aftab> <4E95D9E7.6090304@zytor.com>
	<4E95E7FE.6050302@goop.org> <20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E96198F.4030906@zytor.com> <20111013073352.GB501@aftab>
	<20111013095708.GA1862@aftab>
	<20111017170854.GE19756@phenom.dumpdata.com>
In-Reply-To: <20111017170854.GE19756@phenom.dumpdata.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>, Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.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 10/17/2011 10:08 AM, Konrad Rzeszutek Wilk wrote:
> 
> <scratches his head>
> You are still using the microcode API (the existing one) to
> program the CPUs right? It is just that you are fetching the images
> much much earlier than it currently is done?
> 

No, the goal is to ditch the existing API and load the CPUs very early
in the start path.

	-hpa

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 11:45:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 11:45:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFsCF-0005kC-2x; Mon, 17 Oct 2011 11:45:59 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFsBe-0005YD-NZ
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 11:45:23 -0700
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318877103!44616378!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11067 invoked from network); 17 Oct 2011 18:45:04 -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; 17 Oct 2011 18:45:04 -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
	p9HIjAkh027855
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 17 Oct 2011 18:45:12 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
	p9HIb56F000208
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 17 Oct 2011 18:37:05 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
	p9HIivQH023390; Mon, 17 Oct 2011 13:44:57 -0500
MIME-Version: 1.0
Message-ID: <4ffd9c88-88d2-437f-9af1-f3f0149334d9@default>
Date: Mon, 17 Oct 2011 11:44:51 -0700 (PDT)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: Daniel Kiper <dkiper@net-space.pl>, xen-devel@lists.xensource.com, Konrad
	Wilk <konrad.wilk@oracle.com>, ian.jackson@eu.citrix.com,
	ian.campbell@eu.citrix.com, jeremy@goop.org, v.tolstov@selfip.ru
Subject: RE: [Xen-devel] Strange (???) xl behavior for save, migrate and
	migrate-receive
References: <20111017174036.GD29445@router-fw-old.local.net-space.pl>
In-Reply-To: <20111017174036.GD29445@router-fw-old.local.net-space.pl>
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.0A090202.4E9C77B9.0099,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

> From: Daniel Kiper [mailto:dkiper@net-space.pl]
> Subject: [Xen-devel] Strange (???) xl behavior for save, migrate and migr=
ate-receive
>=20
> During work on memory hotplug for Xen I have received some notices
> that it breaks machine migration. I had some time and I done some
> tests a few days ago. It looks that source of this problem is
> xl command itself. I discovered that generic save/restore mechanism
> is used for machine migration. xl save store machine config which
> was used at machine startup with current machine state. It means
> that it does not take into account any config changes which were made
> during machine run. This behavior does not allow migrating domain,
> on which memory hotplug was used, to restore on destination host
> because current size of memory allocated for machine is larger than
> size of memory allocated at startup by memory option. Yes, it is
> memory option not maxmem option. However, it is not important here
> because I think that generic behavior of xl save, migrate and migrate-rec=
eive
> should be changed (fix for memory hotplug case is workaround for the
> generic problem which will return sooner or later). I think that xl save,
> migrate and migrate-receive should use current machine state and __CURREN=
T__
> config (from xenstore ???) to do their tasks. However, I am aware that
> this change could have large impact on current users. That is why I decid=
ed
> to ask you about your opinion and suggested solutions in that case
> (in general not memory hotplug only).
>=20
> Currently, these problems could be workaround by passing
> path to config file with current config to xl command.
>=20
> I have done tests on Xen Ver. 4.1.2-rc3. I have not done tests
> on xm command, however, I suppose that it has similar behavior.

Hi Daniel --

In a recent internal discussion at Oracle, we were thinking about
whether to enable hotplug functionality in a guest kernel and it
raised some concerns about manageability.  I think right now
the system administrator of the guest can arbitrarily increase
memory size beyond maxmem... that is really the whole point
of your implementation, right?  But this may be unacceptable to
the "data center administrator" (the admin who runs the "cloud"
and determines such things as vcpus and maxmem across all guests)
since multiple guests may try to do this semi-maliciously to grab
as much RAM as they can. And Xen has no way to discourage this,
so will just hand out the RAM first-come-first-serve, right?

I was thinking one way to handle this problem would be
to have a new vm.cfg parameter, e.g. "maxmem_hotplug".
If unspecified (or zero), there are no constraints placed
on the guest.  If specified (in MB), Xen/xl will disallow
hotplug memory requests beyond this maximum.

I suspect, if implemented properly, this might also eliminate
your live migration issue.

Apologies if something like this was previously discussed or
is already working in your implementation.

Dan

P.S. Also FYI, selfballooning is implemented in Oracle's kernel
so we should work to ensure that selfballooning and hotplug
work properly together.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 12:13:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 12:13:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFscm-0007fj-9x; Mon, 17 Oct 2011 12:13:24 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFscE-0007Sm-0p
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 12:12:50 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318878747!47021438!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1624 invoked from network); 17 Oct 2011 19:12:27 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 17 Oct 2011 19:12:27 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1318878766; l=1610;
	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=DfthFbqfU3+dfSdwakVG5177qGY=;
	b=B+fSfsDhYLweKfnNOBDY15EtKa30Pk7h5PdfEUu8DX7zliE/IORY2sHI+h+nqSSp2B6
	QOs8N6lJsX1mGou+Oe5CvJg0aJgOwsTsLZs0hh3y3ltGSWu++Okk+DKIxmkgKnJ6+xddG
	/RnUQg9CKMqWpDiRPuZWNctDip4topD2uRk=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFGiy0PFnbJ
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-085-152.pools.arcor-ip.net [88.65.85.152])
	by smtp.strato.de (jimi mo15) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id U01824n9HHGbnl ;
	Mon, 17 Oct 2011 21:12:12 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id B5D3C18B65; Mon, 17 Oct 2011 21:12:05 +0200 (CEST)
Date: Mon, 17 Oct 2011 21:12:05 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Daniel Kiper <dkiper@net-space.pl>
Subject: Re: [Xen-devel] Strange (???) xl behavior for save, migrate and
	migrate-receive
Message-ID: <20111017191205.GA16667@aepfle.de>
References: <20111017174036.GD29445@router-fw-old.local.net-space.pl>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <20111017174036.GD29445@router-fw-old.local.net-space.pl>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: jeremy@goop.org, xen-devel@lists.xensource.com, konrad.wilk@oracle.com,
	ian.jackson@eu.citrix.com, v.tolstov@selfip.ru, ian.campbell@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, Oct 17, Daniel Kiper wrote:

> During work on memory hotplug for Xen I have received some notices
> that it breaks machine migration. I had some time and I done some
> tests a few days ago. It looks that source of this problem is
> xl command itself. I discovered that generic save/restore mechanism
> is used for machine migration. xl save store machine config which
> was used at machine startup with current machine state. It means
> that it does not take into account any config changes which were made
> during machine run. This behavior does not allow migrating domain,
> on which memory hotplug was used, to restore on destination host
> because current size of memory allocated for machine is larger than
> size of memory allocated at startup by memory option. Yes, it is
> memory option not maxmem option. However, it is not important here
> because I think that generic behavior of xl save, migrate and migrate-receive
> should be changed (fix for memory hotplug case is workaround for the
> generic problem which will return sooner or later). I think that xl save,
> migrate and migrate-receive should use current machine state and __CURRENT__
> config (from xenstore ???) to do their tasks. However, I am aware that
> this change could have large impact on current users. That is why I decided
> to ask you about your opinion and suggested solutions in that case
> (in general not memory hotplug only).

Its easy to implement in xl by throwing some xenstore watches into the
code.

http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00778.html

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 12:46:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 12:46:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFt8y-0000wJ-TV; Mon, 17 Oct 2011 12:46:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFt7g-0000Tp-5h
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 12:45:20 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318880685!59548906!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25345 invoked from network); 17 Oct 2011 19:44:46 -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;
	17 Oct 2011 19:44:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,360,1315180800"; 
   d="scan'208";a="8431761"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 19:45: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; Mon, 17 Oct 2011 20:45:16 +0100
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 1RFt7c-0002sC-6v;
	Mon, 17 Oct 2011 19:45:16 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RFt7c-0007jk-25;
	Mon, 17 Oct 2011 20:45:16 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9345-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 17 Oct 2011 20:45:16 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9345: 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 9345 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9345/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 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     14 guest-localmigrate/x10       fail    like 9343
 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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  a33af75083c7
baseline version:
 xen                  6880bfc48504

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Cmpabell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Keir Fraser <keir@xen.org>
  Paul Durrant <paul.durrant@citrix.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


Pushing revision :

+ branch=xen-unstable
+ revision=a33af75083c7
+ . 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 a33af75083c7
+ branch=xen-unstable
+ revision=a33af75083c7
+ . 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 a33af75083c7 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 10 changesets with 24 changes to 20 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 14:04:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 14:04:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFuLq-0004Eg-SV; Mon, 17 Oct 2011 14:04:03 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFuL1-00041Y-Px
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 14:03:12 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318885388!35654741!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17674 invoked from network); 17 Oct 2011 21:03:08 -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;
	17 Oct 2011 21:03:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,361,1315180800"; 
   d="scan'208";a="8432246"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	17 Oct 2011 21:02: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;
	Mon, 17 Oct 2011 22:02:40 +0100
Subject: Re: [Xen-devel] (no subject)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
In-Reply-To: <20111017170539.GD19756@phenom.dumpdata.com>
References: <1318837249-19483-1-git-send-email-pbonzini@redhat.com>
	<20111017170539.GD19756@phenom.dumpdata.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Mon, 17 Oct 2011 22:02:39 +0100
Message-ID: <1318885359.11016.54.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Paolo Bonzini <pbonzini@redhat.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, 2011-10-17 at 18:05 +0100, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 17, 2011 at 09:40:49AM +0200, Paolo Bonzini wrote:
> 
> Something went wrong with your patchbomb..
> 
> anyhow, lets CC Ian here since he is the maintainer.

This is a 2.6.18-xen patch. I'm not especially interested in that tree
-- Jan looks after it though and picked up this patch from the resend.

Ian.

> 
> > 
> > Writing [PATCH] netback: disable features not supported by netfront ...
> > ntent-Transfer-Encoding: 7bit
> > Subject: [PATCH] netback: disable features not supported by netfront
> > X-Mercurial-Node: eb896361fc70b60b9a257d0c82e19633a11b9d41
> > Message-Id: <eb896361fc70b60b9a25.1318837062@yakj.usersys.redhat.com>
> > User-Agent: Mercurial-patchbomb/1.9.1
> > Date: Mon, 17 Oct 2011 09:37:42 +0200
> > From: pbonzini@redhat.com
> > To: pbonzini@redhat.com
> > 
> > # HG changeset patch
> > # User Paolo Bonzini <pbonzini@redhat.com>
> > # Date 1318837036 -7200
> > # Node ID eb896361fc70b60b9a257d0c82e19633a11b9d41
> > # Parent  3c900d6a5f6a51ff1547f21fef30ab8b92feccc9
> > netback: disable features not supported by netfront
> > 
> > Netback works by first setting all possible features, and then
> > resetting some after connection, if the front-end didn't negotiate them.
> > Except that in the old 2.6.18 tree the "resetting" part was missing.
> > In the pvops tree, this should work correctly through the fix_features
> > mechanism.
> > 
> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> > 
> > diff --git a/drivers/xen/netback/interface.c b/drivers/xen/netback/interface.c
> > --- a/drivers/xen/netback/interface.c
> > +++ b/drivers/xen/netback/interface.c
> > @@ -98,8 +98,9 @@ static int netbk_change_mtu(struct net_d
> >  void netif_set_features(netif_t *netif)
> >  {
> >  	struct net_device *dev = netif->dev;
> > -	int features = dev->features;
> > +	int features;
> >  
> > +	features = dev->features & ~(NETIF_F_SG|NETIF_F_TSO|NETIF_F_IP_CSUM);
> >  	if (netif->can_sg)
> >  		features |= NETIF_F_SG;
> >  	if (netif->gso)
> > 
> > 
> > 
> > _______________________________________________
> > 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 Oct 17 15:31:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 15:31:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFvi6-0008Kn-PZ; Mon, 17 Oct 2011 15:31:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RFvhX-00087j-Ch
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 15:30:31 -0700
X-Env-Sender: jasonsmr@hotmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318890596!59559622!1
X-Originating-IP: [65.55.34.16]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8199 invoked from network); 17 Oct 2011 22:29:57 -0000
Received: from col0-omc1-s6.col0.hotmail.com (HELO
	col0-omc1-s6.col0.hotmail.com) (65.55.34.16)
	by server-2.tower-27.messagelabs.com with SMTP;
	17 Oct 2011 22:29:57 -0000
Received: from COL124-W60 ([65.55.34.7]) by col0-omc1-s6.col0.hotmail.com with
	Microsoft SMTPSVC(6.0.3790.4675); Mon, 17 Oct 2011 15:30:27 -0700
Message-ID: <COL124-W60EE90D708B44DCC256575DAE40@phx.gbl>
X-Originating-IP: [201.58.140.166]
From: =?euc-kr?B?q7irp6ukq72r8yBKYXNvbiCr66vXq+mrpKvIIFJ1cHJpZ2h0?=
	<jasonsmr@hotmail.com>
To: <tyrolschool@kfa.biglobe.ne.jp>, <saiyo-va@valinux.co.jp>,
	<recruit11@wil.co.jp>, <wirwilj@fsuimail.ferris.edu>,
	<xen-devel@lists.xensource.com>, <wuyuan@msu.edu>, <yukie@hotmail.com>
Date: Tue, 18 Oct 2011 07:30:26 +0900
Importance: Normal
MIME-Version: 1.0
X-OriginalArrivalTime: 17 Oct 2011 22:30:27.0114 (UTC)
	FILETIME=[5E82E8A0:01CC8D1C]
Cc: 
Subject: [Xen-devel] Re: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="===============1686903095=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1686903095==
Content-Type: multipart/alternative;
	boundary="_858a41a1-48a6-4dcf-a524-19b734fb055e_"

--_858a41a1-48a6-4dcf-a524-19b734fb055e_
Content-Type: text/plain; charset="euc-kr"
Content-Transfer-Encoding: base64

RG9uknQgYmUgYSBsb3NlciEgWW91IGNhbiBtaXNzIGFsbCBob3QgcHJvcG9zYWxzISBodHRwOi8v
Z29sbHVjZS5jb20vZnJpZW5kcy5waHA/aHRvcGljaWQ9MTV2NA0KIAkJIAkgICAJCSAg

--_858a41a1-48a6-4dcf-a524-19b734fb055e_
Content-Type: text/html; charset="euc-kr"
Content-Transfer-Encoding: base64

PGh0bWw+DQo8aGVhZD4NCjxzdHlsZT48IS0tDQouaG1tZXNzYWdlIFANCnsNCm1hcmdpbjowcHg7
DQpwYWRkaW5nOjBweA0KfQ0KYm9keS5obW1lc3NhZ2UNCnsNCmZvbnQtc2l6ZTogMTBwdDsNCmZv
bnQtZmFtaWx5OlRhaG9tYQ0KfQ0KLS0+PC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5IGNsYXNzPSdo
bW1lc3NhZ2UnPjxkaXYgZGlyPSdsdHInPkRvbpJ0IGJlIGEgbG9zZXIhIFlvdSBjYW4gbWlzcyBh
bGwgaG90IHByb3Bvc2FscyEgPGEgaHJlZj0naHR0cDovL2dvbGx1Y2UuY29tL2ZyaWVuZHMucGhw
P2h0b3BpY2lkPTE1djQnPmh0dHA6Ly9nb2xsdWNlLmNvbS9mcmllbmRzLnBocD9odG9waWNpZD0x
NXY0PC9hPjxicj4gCQkgCSAgIAkJICA8L2Rpdj48L2JvZHk+DQo8L2h0bWw+

--_858a41a1-48a6-4dcf-a524-19b734fb055e_--


--===============1686903095==
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

--===============1686903095==--


From xen-devel-bounces@lists.xensource.com Mon Oct 17 18:12:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 18:12:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFyEl-00059o-Mn; Mon, 17 Oct 2011 18:12:59 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFyDs-0004xS-2v
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 18:12:04 -0700
X-Env-Sender: hmh@hmh.eng.br
X-Msg-Ref: server-3.tower-216.messagelabs.com!1318900320!1472027!1
X-Originating-IP: [66.111.4.29]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4197 invoked from network); 18 Oct 2011 01:12:01 -0000
Received: from out5.smtp.messagingengine.com (HELO
	out5.smtp.messagingengine.com) (66.111.4.29)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 18 Oct 2011 01:12:01 -0000
Received: from compute4.internal (compute4.nyi.mail.srv.osa [10.202.2.44])
	by gateway1.nyi.mail.srv.osa (Postfix) with ESMTP id 23F30206F1;
	Mon, 17 Oct 2011 21:12:00 -0400 (EDT)
Received: from frontend1.nyi.mail.srv.osa ([10.202.2.160])
	by compute4.internal (MEProxy); Mon, 17 Oct 2011 21:12:00 -0400
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=hmh.eng.br; h=date
	:from:to:cc:subject:message-id:references:mime-version
	:content-type:in-reply-to; s=mesmtp; bh=qvF2HnhC/X5plGLQcATKTfmd
	+9k=; b=C0fGUgaC6WQLwTzJOnXr9aaX6ImCmYdv656cxuHBCbINlD93sOkqqBsG
	U6s5qQjPzBjuLPH1/+2rhUYeki3BeaSkDcRZ50oILZL5t7Mp/NzNh1F2Uf8mVfgv
	AzIa8XWgCkRnCQoyR2+wAymoirz4mNP4Wp/97kdQPiytuK9aUSY=
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=qvF2HnhC/X5plGLQcATKTfmd+9k=; b=Otzb/yWIJyeuaQlMr1/ZLRczGhKS
	uDUxHs1afCMt3+p6dKhWXPraMZJUBTWo2knmzyZ0rjUmQfxvxayV7yYtXt2trBK0
	7ehcl5k3HHBHB+4+Uq6vMhoC0viThwL5VzmvGbg3gJ7CD88pvIL9hg7iyItrlQ5d
	pj3GKCj02Z1qAA8=
X-Sasl-enc: 6YDehgtuNPxRsaGL8gjk9t8jRH1bYB7jgB671NaVrCTH 1318900319
Received: from khazad-dum.debian.net (unknown [201.82.73.183])
	by mail.messagingengine.com (Postfix) with ESMTPSA id BF919406BE9;
	Mon, 17 Oct 2011 21:11:59 -0400 (EDT)
Received: from localhost (localhost [127.0.0.1])
	by localhost.khazad-dum.debian.net (Postfix) with ESMTP id 467F1E00D8; 
	Mon, 17 Oct 2011 23:11:57 -0200 (BRST)
X-Virus-Scanned: Debian amavisd-new at khazad-dum.debian.net
Received: from khazad-dum.debian.net ([127.0.0.1])
	by localhost (khazad-dum2.khazad-dum.debian.net [127.0.0.1])
	(amavisd-new, port 10024)
	with LMTP id pV3xD9F1b3LE; Mon, 17 Oct 2011 23:11:56 -0200 (BRST)
Received: by khazad-dum.debian.net (Postfix, from userid 1000)
	id 88FB9E1AED; Mon, 17 Oct 2011 23:11:56 -0200 (BRST)
Date: Mon, 17 Oct 2011 23:11:56 -0200
From: Henrique de Moraes Holschuh <hmh@hmh.eng.br>
To: "H. Peter Anvin" <hpa@zytor.com>
Subject: Re: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for
	microcode update in Xen dom0
Message-ID: <20111018011156.GA20291@khazad-dum.debian.net>
References: <4E95E7FE.6050302@goop.org> <20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E96198F.4030906@zytor.com> <20111013073352.GB501@aftab>
	<20111013095708.GA1862@aftab>
	<20111017170854.GE19756@phenom.dumpdata.com>
	<4E9C6886.20600@zytor.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9C6886.20600@zytor.com>
X-GPG-Fingerprint: 1024D/1CDB0FE3 5422 5C61 F6B7 06FB 7E04  3738 EE25 DE3F
	1CDB 0FE3
User-Agent: Mutt/1.5.20 (2009-06-14)
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.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 Mon, 17 Oct 2011, H. Peter Anvin wrote:
> On 10/17/2011 10:08 AM, Konrad Rzeszutek Wilk wrote:
> > <scratches his head>
> > You are still using the microcode API (the existing one) to
> > program the CPUs right? It is just that you are fetching the images
> > much much earlier than it currently is done?
> > 
> 
> No, the goal is to ditch the existing API and load the CPUs very early
> in the start path.

And how do we apply new microcode at runtime?  A new API?

-- 
  "One disk to rule them all, One disk to find them. One disk to bring
  them all and in the darkness grind them. In the Land of Redmond
  where the shadows lie." -- The Silicon Valley Tarot
  Henrique Holschuh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 19:19:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 19:19:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RFzHI-0007aE-Vf; Mon, 17 Oct 2011 19:19:41 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RFzGA-0007Mz-UV
	for Xen-devel@lists.xensource.com; Mon, 17 Oct 2011 19:18:31 -0700
X-Env-Sender: mukesh.rathor@oracle.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1318904306!555584!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31550 invoked from network); 18 Oct 2011 02:18:27 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 18 Oct 2011 02:18:27 -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
	p9I2IKdL005016
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 18 Oct 2011 02:18:22 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
	p9I2IJDl012924
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 18 Oct 2011 02:18:19 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
	p9I2ICIk007868; Mon, 17 Oct 2011 21:18:12 -0500
Received: from mantra.us.oracle.com (/130.35.68.95)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 17 Oct 2011 19:18:11 -0700
Date: Mon, 17 Oct 2011 19:18:10 -0700
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Keir Fraser <keir.xen@gmail.com>
Message-ID: <20111017191810.28876947@mantra.us.oracle.com>
In-Reply-To: <CABDA859.22DA3%keir.xen@gmail.com>
References: <20111013181853.15381ef5@mantra.us.oracle.com>
	<CABDA859.22DA3%keir.xen@gmail.com>
Organization: Oracle Corporation
X-Mailer: Claws Mail 3.7.6 (GTK+ 2.18.9; x86_64-redhat-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090204.4E9CE1EF.004A:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Ian, Jeremy Fitzhardinge <jeremy@goop.org>,
	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] Re: HYBRID: gnttab_map() to map shared frames..
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Jeremy,

You have any thoughts on this? This is basically for hybrid running 
autotranslate paging mode.  I am trying to figure how to get unmapped
pfns to map shared grant table page/s from xen. HVM does this via
pci_resource_start() and gets io remapped address. However, in case of
pure PV, I am not sure how feasible this approach would be.

Is there way I can reserve few pfn's above max_pfn and use those
for my XENMAPSPACE_grant_table call?

thanks,
Mukesh

On Fri, 14 Oct 2011 08:50:33 +0100
Keir Fraser <keir.xen@gmail.com> wrote:

> If you are running without autotranslate paging mode then the p2m
> will be 1:1 and there is no problem. If you are running autotranslate
> then yes you probably need the HVM style of mapping.
> 
>  -- Keir
> 
> On 14/10/2011 02:18, "Mukesh Rathor" <mukesh.rathor@oracle.com> wrote:
> 
> > Hi,
> > 
> > I am trying to figure how to make gnttab_map() work for Hybrid with
> > EPT. The only way I am coming up is the HVM way, where I would have
> > to get mmio_addr via pci_resource_start() which means registering
> > xen-platform-pci driver. I know there will be implications later
> > with migration, but thats later.
> > 
> > I can't think of any other way since the grant frames are coming
> > from xen heap and not in p2m table, other than some sort of
> > xen-heap-p2m-table or something ugly.
> > 
> > Am I on right track, or any other ideas?
> > 
> > thanks,
> > Mukesh
> > 
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 17 21:11:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 17 Oct 2011 21:11:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG11a-0001mk-R8; Mon, 17 Oct 2011 21:11:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG10R-0001Za-MQ
	for xen-devel@lists.xensource.com; Mon, 17 Oct 2011 21:10:24 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1318911005!44653916!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10667 invoked from network); 18 Oct 2011 04:10:05 -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;
	18 Oct 2011 04:10:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,363,1315180800"; 
   d="scan'208";a="8434140"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 04:10: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; Tue, 18 Oct 2011 05:10:19 +0100
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 1RG10N-0005do-LB;
	Tue, 18 Oct 2011 04:10:19 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RG10N-0005gE-89;
	Tue, 18 Oct 2011 05:10:19 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9346-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 18 Oct 2011 05:10:19 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9346: 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 9346 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9346/

Failures :-/ but no regressions.

Tests which did not succeed, but are not blocking,
including regressions (tests previously passed) regarded as allowable:
 test-amd64-i386-rhel6hvm-amd  9 guest-start.2                fail   never pass
 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     14 guest-localmigrate/x10       fail    like 9345
 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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  a33af75083c7
baseline version:
 xen                  a33af75083c7

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 Tue Oct 18 00:14:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 00:14:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG3sN-0007Kd-77; Tue, 18 Oct 2011 00:14:15 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RG3rV-00077T-Cv
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 00:13:21 -0700
X-Env-Sender: pbonzini@redhat.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1318921997!580232!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8205 invoked from network); 18 Oct 2011 07:13:18 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-9.tower-21.messagelabs.com with SMTP;
	18 Oct 2011 07:13:18 -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 p9I7DDVT011234
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 18 Oct 2011 03:13:13 -0400
Received: from yakj.usersys.redhat.com (ovpn-112-17.ams2.redhat.com
	[10.36.112.17])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9I7DBiD007757; Tue, 18 Oct 2011 03:13:12 -0400
Message-ID: <4E9D2706.5050207@redhat.com>
Date: Tue, 18 Oct 2011 09:13:10 +0200
From: Paolo Bonzini <pbonzini@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] (no subject)
References: <1318837249-19483-1-git-send-email-pbonzini@redhat.com>
	<20111017170539.GD19756@phenom.dumpdata.com>
In-Reply-To: <20111017170539.GD19756@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.23
Cc: Ian Campbell <Ian.Campbell@eu.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

On 10/17/2011 07:05 PM, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 17, 2011 at 09:40:49AM +0200, Paolo Bonzini wrote:
>
> Something went wrong with your patchbomb..
>
> anyhow, lets CC Ian here since he is the maintainer.

Already resent, and acked by Jan. :)

Paolo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 01:15:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 01:15:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG4pX-0001Fp-9u; Tue, 18 Oct 2011 01:15:23 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG4nV-00011a-FK
	for Xen-devel@lists.xensource.com; Tue, 18 Oct 2011 01:13:17 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1318925593!598646!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23332 invoked from network); 18 Oct 2011 08:13:14 -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;
	18 Oct 2011 08:13:14 -0000
X-IronPort-AV: E=Sophos;i="4.69,364,1315180800"; 
   d="scan'208";a="8437162"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08: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;
	Tue, 18 Oct 2011 09:13:02 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Mukesh Rathor <mukesh.rathor@oracle.com>
Date: Tue, 18 Oct 2011 09:13:02 +0100
In-Reply-To: <20111017191810.28876947@mantra.us.oracle.com>
References: <20111013181853.15381ef5@mantra.us.oracle.com>
	<CABDA859.22DA3%keir.xen@gmail.com>
	<20111017191810.28876947@mantra.us.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: <1318925582.16132.31.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Keir Fraser <keir.xen@gmail.com>, Jeremy Fitzhardinge <jeremy@goop.org>
Subject: [Xen-devel] Re: HYBRID: gnttab_map() to map shared frames..
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-18 at 03:18 +0100, Mukesh Rathor wrote:
> Hi Jeremy,
> 
> You have any thoughts on this? This is basically for hybrid running 
> autotranslate paging mode.  I am trying to figure how to get unmapped
> pfns to map shared grant table page/s from xen. HVM does this via
> pci_resource_start() and gets io remapped address. However, in case of
> pure PV, I am not sure how feasible this approach would be.
> 
> Is there way I can reserve few pfn's above max_pfn and use those
> for my XENMAPSPACE_grant_table call?

I think we should avoid exposing any sort of magic PCI bus to PV/hybrid
guests.

Could GNTTABOP_setup_table return GFNs from the very top of the GFN
space? Perhaps even above what would be architecturally valid, although
perhaps that is incompatible with HAP. Anything above max_pfn would seem
to be valid for the hypervisor to place "magic" mappings in?

Another approach might be to take advantage of the fact that a modern PV
kernel will call XENMEM_memory_map to obtain an e820 describing its
pseudo-physical address space. You could arrange for there to be some
reserved space returned in that.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 01:19:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 01:19:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG4tx-0002Lm-K8; Tue, 18 Oct 2011 01:19:57 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG4t6-00029b-Q1
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 01:19:05 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1318925941!35676885!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19283 invoked from network); 18 Oct 2011 08:19:01 -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;
	18 Oct 2011 08:19:01 -0000
X-IronPort-AV: E=Sophos;i="4.69,364,1315180800"; 
   d="scan'208";a="8437375"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:19: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;
	Tue, 18 Oct 2011 09:19:01 +0100
Subject: RE: [Xen-devel] Strange (???) xl behavior for save, migrate and
	migrate-receive
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Dan Magenheimer <dan.magenheimer@oracle.com>
Date: Tue, 18 Oct 2011 09:19:01 +0100
In-Reply-To: <4ffd9c88-88d2-437f-9af1-f3f0149334d9@default>
References: <20111017174036.GD29445@router-fw-old.local.net-space.pl>
	<4ffd9c88-88d2-437f-9af1-f3f0149334d9@default>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318925941.16132.36.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 <konrad.wilk@oracle.com>, Ian
	Jackson <Ian.Jackson@eu.citrix.com>,
	"v.tolstov@selfip.ru" <v.tolstov@selfip.ru>,
	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 Mon, 2011-10-17 at 19:44 +0100, Dan Magenheimer wrote:
> In a recent internal discussion at Oracle, we were thinking about
> whether to enable hotplug functionality in a guest kernel and it
> raised some concerns about manageability.  I think right now
> the system administrator of the guest can arbitrarily increase
> memory size beyond maxmem...

The memory limit for a guest is ultimately controlled by the host
administrator/toolstack. The in-guest admin cannot exceed that, even
using hotplug. I think that limit is currently always set to the current
balloon target.

AIUI Daniel's work only allows a guest admin to take advantage of new
memory above maxmem _after_ the host admin has provisioned that RAM to
the guest. IOW it only allows the guest to take advantage of new memory
given to it and does not allow the guest to acquire new memory of its
own accord.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 02:03:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 02:03:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG5Zv-0004O6-Nk; Tue, 18 Oct 2011 02:03:19 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG5VI-00046T-OG
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 01:59:00 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1318928299!583076!1
X-Originating-IP: [213.199.154.207]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12700 invoked from network); 18 Oct 2011 08:58:19 -0000
Received: from am1ehsobe004.messaging.microsoft.com (HELO
	AM1EHSOBE004.bigfish.com) (213.199.154.207)
	by server-13.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	18 Oct 2011 08:58:19 -0000
Received: from mail107-am1-R.bigfish.com (10.3.201.244) by
	AM1EHSOBE004.bigfish.com (10.3.204.24) with Microsoft SMTP Server id
	14.1.225.22; Tue, 18 Oct 2011 08:58:18 +0000
Received: from mail107-am1 (localhost.localdomain [127.0.0.1])	by
	mail107-am1-R.bigfish.com (Postfix) with ESMTP id 6937D18281AE;
	Tue, 18 Oct 2011 08:58:18 +0000 (UTC)
X-SpamScore: -14
X-BigFish: VPS-14(zzbb2dK9371K1432N98dKzz1202hzzz32i668h839h93fh61h)
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 mail107-am1 (localhost.localdomain [127.0.0.1]) by mail107-am1
	(MessageSwitch) id 1318928298245314_19079;
	Tue, 18 Oct 2011 08:58:18 +0000 (UTC)
Received: from AM1EHSMHS004.bigfish.com (unknown [10.3.201.254])	by
	mail107-am1.bigfish.com (Postfix) with ESMTP id 2DACE1420051;
	Tue, 18 Oct 2011 08:58:18 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	AM1EHSMHS004.bigfish.com (10.3.207.104) with Microsoft SMTP Server id
	14.1.225.22; Tue, 18 Oct 2011 08:58:17 +0000
X-WSS-ID: 0LT97L1-01-1E4-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 2F0621028173;	Tue, 18 Oct 2011 03:58:12 -0500 (CDT)
Received: from SAUSEXDAG02.amd.com (163.181.55.2) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Tue, 18 Oct 2011 03:58:21 -0500
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, 18 Oct 2011 03:58:13 -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; Tue, 18 Oct 2011
	04:56:24 -0400
Message-ID: <4E9D3F36.6070201@amd.com>
Date: Tue, 18 Oct 2011 10:56:22 +0200
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: "H. Peter Anvin" <hpa@zytor.com>
Subject: Re: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
	update in Xen dom0
References: <20111012101615.GA14966@aftab>
	<4E95D9E7.6090304@zytor.com>	<4E95E7FE.6050302@goop.org>
	<20111012194543.GD14966@aftab>	<20111012204048.GA22260@phenom.oracle.com>	<4E960746.90805@zytor.com>
	<20111012214013.GD28723@aftab>	<4E96198F.4030906@zytor
In-Reply-To: <4E9C6886.20600@zytor.com>
Content-Type: text/plain; charset="UTF-8"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>, Xen Devel <xen-devel@lists.xensource.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>, the,
	Ingo Molnar <mingo@elte.hu>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/17/11 19:40, H. Peter Anvin wrote:
> On 10/17/2011 10:08 AM, Konrad Rzeszutek Wilk wrote:
>>
>> <scratches his head>
>> You are still using the microcode API (the existing one) to
>> program the CPUs right? It is just that you are fetching the images
>> much much earlier than it currently is done?
>>
>
> No, the goal is to ditch the existing API and load the CPUs very early
> in the start path.
>
> 	-hpa

I think this approach is good to get the microcode applied as
early as possible at boot time. But on servers you usually do not want
to reboot the machine unless you do a BIOS update which will apply
the new microcode anyway. So for applying the microcode update
at runtime I would like to keep the existing API.

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 Tue Oct 18 02:20:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 02:20:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG5qt-0006Lw-PU; Tue, 18 Oct 2011 02:20:51 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG5qJ-00069M-TQ
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 02:20:16 -0700
X-Env-Sender: cartercheng@gmail.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318929611!22039!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10342 invoked from network); 18 Oct 2011 09:20:12 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 09:20:12 -0000
Received: by vcbfk13 with SMTP id fk13so435716vcb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 02:20: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=ktUv1DcUvB6g1MLl6Nko9KRhRpnu0km8ZF28MaCOsGs=;
	b=yAl6sjOQN8io7a8d44h7rLdLA2nhqVsw7zav5iK2pY5wNh2NHMXpxZLMF8w8QaB6Bh
	gHoA/12FTnOI62ZDgba0AUKl2wFQ26227TA07Jx343myV9LOJ5leDc0UmkGFZYrbn4cX
	zNscJ2QkHznR9YkP0SwAwCQdpfVA9NT6E/U+A=
MIME-Version: 1.0
Received: by 10.52.68.240 with SMTP id z16mr1360536vdt.120.1318929611487; Tue,
	18 Oct 2011 02:20:11 -0700 (PDT)
Received: by 10.220.190.74 with HTTP; Tue, 18 Oct 2011 02:20:11 -0700 (PDT)
Date: Tue, 18 Oct 2011 17:20:11 +0800
Message-ID: <CALS6=qXEkUaSSeCAnqZCd1nYEnBqDfOPTj5z0ULwLkNfWp5oEA@mail.gmail.com>
From: Carter Cheng <cartercheng@gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] oprofile and 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="===============0939503970=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0939503970==
Content-Type: multipart/alternative; boundary=20cf3079bf42f9fa4704af8f3a77

--20cf3079bf42f9fa4704af8f3a77
Content-Type: text/plain; charset=ISO-8859-1

Hello,

I was wondering if xen currently works well with oprofile. I saw some patch
out there put together by an HP engineer but it does not work with the
current version of the code. Does anyone know how much change there has been
in the code and whether it would take much effort to modify the patch?

Thanks,

Carter

--20cf3079bf42f9fa4704af8f3a77
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hello,<div><br></div><div>I was wondering if xen currently works well with =
oprofile. I saw some patch out there put together by an HP engineer but it =
does not work with the current version of the code. Does anyone know how mu=
ch change there has been in the code and whether it would take much effort =
to modify the patch?</div>
<div><br></div><div>Thanks,</div><div><br></div><div>Carter</div>

--20cf3079bf42f9fa4704af8f3a77--


--===============0939503970==
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

--===============0939503970==--


From xen-devel-bounces@lists.xensource.com Tue Oct 18 02:22:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 02:22:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG5s5-0006ju-0L; Tue, 18 Oct 2011 02:22:05 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG5r5-0006PP-T4
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 02:21:04 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318929659!22985!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6929 invoked from network); 18 Oct 2011 09:21:00 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 09:21:00 -0000
Received: by gyg13 with SMTP id 13so550357gyg.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 02:20:59 -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=uZsyCZjYq5DREKa61Xs//rYiLt9/+bckx8EpoVNQ55I=;
	b=aAjsDN4UzeJSqU4H99pBeo4OHbavosMfwJfWXpgvJHtWllCt6N1VI/QGUNelVGm+G8
	70q7n10/2EFOEiPjVVViOT+JGPBPnYha3AUFbvu9SR+rVxkmcUUw8Ki8xsbeimvOod4k
	KiXff1y/Kofs/U1CYtltkyJk1SvwGEKcrX3SY=
MIME-Version: 1.0
Received: by 10.68.31.4 with SMTP id w4mr3828171pbh.20.1318929659076; Tue, 18
	Oct 2011 02:20:59 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Tue, 18 Oct 2011 02:20:59 -0700 (PDT)
In-Reply-To: <20124.19527.706498.819017@mariner.uk.xensource.com>
References: <8fe2ca552de44aa679be.1318512275@loki>
	<20124.19527.706498.819017@mariner.uk.xensource.com>
Date: Tue, 18 Oct 2011 11:20:59 +0200
X-Google-Sender-Auth: m2acWAWQI02HlxCymCr8EEnRlo8
Message-ID: <CAPLaKK6=nU4R62KvxK++XGNx0zff89TNYZkTFizZ1wDbMqUBNg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] tools/check: check for headers and libraries
	in EXTRA_INCLUDES and EXTRA_LIB
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
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

2011/10/17 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> Roger Pau Monne writes ("[Xen-devel] [PATCH] tools/check: check for heade=
rs and libraries in EXTRA_INCLUDES and EXTRA_LIB"):
>> tools/check: check for headers and libraries in EXTRA_INCLUDES and EXTRA=
_LIB
>
> Thanks, but:
>
>> =C2=A0check-build:
>> - =C2=A0 =C2=A0 PYTHON=3D$(PYTHON) LIBXENAPI_BINDINGS=3D$(LIBXENAPI_BIND=
INGS) ./chk build
>> + =C2=A0 =C2=A0 PYTHON=3D$(PYTHON) LIBXENAPI_BINDINGS=3D$(LIBXENAPI_BIND=
INGS) EXTRA_INCLUDES=3D$(EXTRA_INCLUDES) EXTRA_LIB=3D$(EXTRA_LIB) ./chk bui=
ld
>
> Perhaps this would be more easily achieved with "export" ?

Exported variables are not passed to the called program (chk in this case).

>> =C2=A0has_header() {
>> + =C2=A0 =C2=A0 check_sys_root || return 1
>> +
>
> The check_sys_root stuff seems unrelated ? =C2=A0Or at least, it's not
> mentioned in your commit message. =C2=A0I'm not sure if it should be
> disentangled but it should definitely be mentioned. =C2=A0(I'm not much o=
f
> an expert on tools/check.)

The check_sys_root call was already there, just moved it to the top,
but I don't know if it's really necessary.

> Also, I should probably wait with applying this until after your
> revised USER_* flags variables patch, since you probably want to do a
> similar job for USER_ ?

I'm going to send a series now with the two patches.

Roger.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 02:31:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 02:31:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG618-0007Im-86; Tue, 18 Oct 2011 02:31:26 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG60O-00075c-45
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 02:30:40 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1318930212!49557432!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30090 invoked from network); 18 Oct 2011 09:30:12 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 09:30:12 -0000
Received: by wyi11 with SMTP id 11so480599wyi.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 02:30:36 -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:cc;
	bh=oWpTltgRS55gpGg1KYe8Uo6e2nhy5rO7qqoO02JWXvw=;
	b=SPxGQYqQ0KLrYPXj7u0CSNpYNKbVpqqox1zKJB9mz5TUgDuMdQzTBTbSXYt1VBIWVZ
	b2/0pY/a2wISsKV5WfbU/canFR4yfHVaO/eYBdGBOl3+C/gtpvQbhqC+I+jeMqyyqKLg
	KSEl/ZGdbywTp/q3PJySB4qyfV+aPKUKw/+TY=
Received: by 10.216.135.34 with SMTP id t34mr5193308wei.62.1318930236803;
	Tue, 18 Oct 2011 02:30:36 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id ff1sm2399857wbb.8.2011.10.18.02.30.34
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 18 Oct 2011 02:30:35 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1318930196@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Tue, 18 Oct 2011 11:29:56 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@eu.citrix.com
Subject: [Xen-devel] [PATCH 0 of 2 v2] 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 passed them to the check scripts, so libraries and includes are searched there also.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 02:32:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 02:32:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG62Z-0007it-6z; Tue, 18 Oct 2011 02:32:55 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG60Q-00075e-O3
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 02:30:43 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1318930239!35695025!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6874 invoked from network); 18 Oct 2011 09:30:39 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 09:30:39 -0000
Received: by wwf10 with SMTP id 10so454497wwf.24
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 02:30:39 -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:cc; bh=KCSTWOXPvJYjl07y/C+FejuGG4dOWk3fzmiD6QJ/Iag=;
	b=Hrjdw9CTLFk0B1nL87izd3ZxiaW3/0byqpcbhQdYJv2IE2flEc62NvDMZ/cpbkVOGS
	2bj7Smz8Q2s8oHd+4aKQoXHv0wXnMdQLozqgfp9TSXETAKY7mKihnJyzUREm4qsYmApk
	1gxWfTZHuTQCDtDwBVTMVp8yrS+kgZSGAZMH4=
Received: by 10.227.202.135 with SMTP id fe7mr603276wbb.14.1318930239086;
	Tue, 18 Oct 2011 02:30:39 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id ff1sm2399857wbb.8.2011.10.18.02.30.36
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 18 Oct 2011 02:30:37 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 8e4ffea9c9d0e41c0887b476aa34f305cf241b55
Message-Id: <8e4ffea9c9d0e41c0887.1318930197@loki>
In-Reply-To: <patchbomb.1318930196@loki>
References: <patchbomb.1318930196@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Tue, 18 Oct 2011 11:29:57 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@eu.citrix.com
Subject: [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
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318929988 -7200
# Node ID 8e4ffea9c9d0e41c0887b476aa34f305cf241b55
# Parent  f3e94220364b30e49c3324100622a0b241880123
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 f3e94220364b -r 8e4ffea9c9d0 Config.mk
--- a/Config.mk	Mon Oct 17 16:23:54 2011 +0200
+++ b/Config.mk	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/Rules.mk
--- a/tools/Rules.mk	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/Rules.mk	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/console/Makefile
--- a/tools/console/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/console/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/libfsimage/Rules.mk
--- a/tools/libfsimage/Rules.mk	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/libfsimage/Rules.mk	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/libvchan/Makefile
--- a/tools/libvchan/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/libvchan/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/libxc/Makefile
--- a/tools/libxc/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/libxc/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/libxen/Makefile
--- a/tools/libxen/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/libxen/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/libxl/Makefile
--- a/tools/libxl/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/libxl/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -108,7 +108,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 $^
@@ -120,16 +120,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 f3e94220364b -r 8e4ffea9c9d0 tools/misc/Makefile
--- a/tools/misc/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/misc/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/xcutils/Makefile
--- a/tools/xcutils/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/xcutils/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/xenbackendd/Makefile
--- a/tools/xenbackendd/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/xenbackendd/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/xenmon/Makefile
--- a/tools/xenmon/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/xenmon/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/xenpaging/Makefile
--- a/tools/xenpaging/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/xenpaging/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/xenpmd/Makefile
--- a/tools/xenpmd/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/xenpmd/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/xenstat/libxenstat/Makefile
--- a/tools/xenstat/libxenstat/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/xenstat/libxenstat/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/xenstore/Makefile
--- a/tools/xenstore/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/xenstore/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 f3e94220364b -r 8e4ffea9c9d0 tools/xentrace/Makefile
--- a/tools/xentrace/Makefile	Mon Oct 17 16:23:54 2011 +0200
+++ b/tools/xentrace/Makefile	Tue Oct 18 11:26:28 2011 +0200
@@ -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 Tue Oct 18 02:34:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 02:34:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG63g-0008Au-NA; Tue, 18 Oct 2011 02:34:04 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG60S-00075l-C0
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 02:30:44 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1318930212!49557432!2
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30493 invoked from network); 18 Oct 2011 09:30:16 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 09:30:16 -0000
Received: by mail-wy0-f171.google.com with SMTP id 11so480599wyi.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 02:30:41 -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:cc; bh=YMbaCj+4tdWfUn5kVXorqb2OjPlgufeLRHjRw+EJBag=;
	b=ikwdQEhvHlQoHUFnsNUd1dccbJUOE29N+e/XwZ/YnPSzVILT8A2MmFRReG1BapWF6W
	DTaQBgLPRTSAhQUXG46ZFsK+fbwq1M17I2FrFYG9UyV/35lIpbiqWaM454vmltIArl7O
	ArsYQnfk+54f/t09i1bL6rVzuk4SueS52qBfM=
Received: by 10.216.221.31 with SMTP id q31mr1614821wep.37.1318930241202;
	Tue, 18 Oct 2011 02:30:41 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id ff1sm2399857wbb.8.2011.10.18.02.30.39
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 18 Oct 2011 02:30:40 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0a720316685a73e2d5aee56c1572b9ee8d98ab4e
Message-Id: <0a720316685a73e2d5ae.1318930198@loki>
In-Reply-To: <patchbomb.1318930196@loki>
References: <patchbomb.1318930196@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Tue, 18 Oct 2011 11:29:58 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@eu.citrix.com
Subject: [Xen-devel] [PATCH 2 of 2 v2] 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 1318930003 -7200
# Node ID 0a720316685a73e2d5aee56c1572b9ee8d98ab4e
# Parent  8e4ffea9c9d0e41c0887b476aa34f305cf241b55
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 8e4ffea9c9d0 -r 0a720316685a Config.mk
--- a/Config.mk	Tue Oct 18 11:26:28 2011 +0200
+++ b/Config.mk	Tue Oct 18 11:26:43 2011 +0200
@@ -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 8e4ffea9c9d0 -r 0a720316685a tools/check/Makefile
--- a/tools/check/Makefile	Tue Oct 18 11:26:28 2011 +0200
+++ b/tools/check/Makefile	Tue Oct 18 11:26:43 2011 +0200
@@ -7,12 +7,12 @@ 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
+	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) CHECK_INCLUDES="$(CHECK_INCLUDES)" CHECK_LIB="$(CHECK_LIB)" ./chk build
 
 # Check this machine is OK for installing on.
 .PHONY: check-install
 check-install:
-	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) ./chk install
+	PYTHON=$(PYTHON) LIBXENAPI_BINDINGS=$(LIBXENAPI_BINDINGS) CHECK_INCLUDES="$(CHECK_INCLUDES)" CHECK_LIB="$(CHECK_LIB)" ./chk install
 
 .PHONY: clean
 clean:
diff -r 8e4ffea9c9d0 -r 0a720316685a tools/check/funcs.sh
--- a/tools/check/funcs.sh	Tue Oct 18 11:26:28 2011 +0200
+++ b/tools/check/funcs.sh	Tue Oct 18 11:26:43 2011 +0200
@@ -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 Tue Oct 18 02:52:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 02:52:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG6LE-0000g7-3v; Tue, 18 Oct 2011 02:52:12 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG6KO-0000ST-Ku
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 02:51:21 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1318931476!29814!1
X-Originating-IP: [216.32.181.185]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24816 invoked from network); 18 Oct 2011 09:51:17 -0000
Received: from ch1ehsobe005.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.185)
	by server-11.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	18 Oct 2011 09:51:17 -0000
Received: from mail215-ch1-R.bigfish.com (10.43.68.242) by
	CH1EHSOBE008.bigfish.com (10.43.70.58) with Microsoft SMTP Server id
	14.1.225.22; Tue, 18 Oct 2011 09:51:16 +0000
Received: from mail215-ch1 (localhost.localdomain [127.0.0.1])	by
	mail215-ch1-R.bigfish.com (Postfix) with ESMTP id 0F08D1280182;
	Tue, 18 Oct 2011 09:51:16 +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: 0,13,
Received: from mail215-ch1 (localhost.localdomain [127.0.0.1]) by mail215-ch1
	(MessageSwitch) id 1318931475774265_15247;
	Tue, 18 Oct 2011 09:51:15 +0000 (UTC)
Received: from CH1EHSMHS016.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.246])	by mail215-ch1.bigfish.com (Postfix) with ESMTP id
	B565EA6004E;	Tue, 18 Oct 2011 09:51:15 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS016.bigfish.com (10.43.70.16) with Microsoft SMTP Server id
	14.1.225.22; Tue, 18 Oct 2011 09:51:15 +0000
X-WSS-ID: 0LT9A1C-02-35G-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 2F84FC818D;	Tue, 18 Oct 2011 04:51:12 -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;
	Tue, 18 Oct 2011 04:51: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;
	Tue, 18 Oct 2011 04:51:14 -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; Tue, 18 Oct 2011
	05:49:41 -0400
Message-ID: <4E9D4BB1.6070207@amd.com>
Date: Tue, 18 Oct 2011 11:49:37 +0200
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: Borislav Petkov <bp@amd64.org>
Subject: Re: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
	update in Xen dom0
References: <20111012101615.GA14966@aftab> <4E95D9E7.6090304@zytor.com>
	<4E95E7FE.6050302@goop.org> <20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E9D3F36.6070201@amd.com> <20111018093534.GA17076@aftab>
In-Reply-To: <20111018093534.GA17076@aftab>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Fitzhardinge <jeremy.fitzhardinge@citrix.com>, Jeremy,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.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 10/18/11 11:35, Borislav Petkov wrote:
> On Tue, Oct 18, 2011 at 04:56:22AM -0400, Christoph Egger wrote:
>> I think this approach is good to get the microcode applied as
>> early as possible at boot time. But on servers you usually do not want
>> to reboot the machine unless you do a BIOS update which will apply
>> the new microcode anyway. So for applying the microcode update
>> at runtime I would like to keep the existing API.
>
> No, you don't want to keep the existing API and you know it. I've
> explained to you last week why.
>

By "existing API" I mean the xen hypercall. Sorry for the confusion.

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 Tue Oct 18 03:36:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 03:36:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG71w-0001oq-Hh; Tue, 18 Oct 2011 03:36:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG70q-0001Xn-RN
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 03:35:13 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1318934108!35716221!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27715 invoked from network); 18 Oct 2011 10:35:09 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 10:35:09 -0000
Received: by gyg13 with SMTP id 13so632410gyg.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 03:35:08 -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=aOmvREhGd5RQM4DQCnQrJkAYJo3mZPzziw5NK0fW3ss=;
	b=IivQKY7dInDO9b29P7b409cLLDHK3zqv+kzAK0fJ8T22QnupZaF7fioU5bZSqJY0ua
	5qFBwb2lo4Jxa5VectdSSFsPMj4vIHg0DcjOBxbgzGbKlmRvGHvG3bT0bk3tsWtHKiW0
	RIF4nRc21aYLKJba98L6wISl7WyWbe5CMiuaU=
MIME-Version: 1.0
Received: by 10.68.38.132 with SMTP id g4mr835822pbk.122.1318934108210; Tue,
	18 Oct 2011 03:35:08 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Tue, 18 Oct 2011 03:35:08 -0700 (PDT)
In-Reply-To: <20124.21759.342541.404863@mariner.uk.xensource.com>
References: <72ef13cb4609c97a26ef.1318503856@loki>
	<20124.21759.342541.404863@mariner.uk.xensource.com>
Date: Tue, 18 Oct 2011 12:35:08 +0200
X-Google-Sender-Auth: TafGnyIIJ8pzC8mR4WYfVdlEcS0
Message-ID: <CAPLaKK7Zbv2Cwz57fH5RhjTWJ9-i=LTXBn4Duc-0wOmk1yNWOA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH v2] libxl: reimplement buffer for bootloading
	and drop data if buffer is full
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: 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

2011/10/17 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> Roger Pau Monne writes ("[Xen-devel] [PATCH v2] libxl: reimplement buffer=
 for bootloading and drop data if buffer is full"):
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Move buffers around to drop already cons=
umed data */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_cons > 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xenconsoled_prod -=3D xencons=
oled_cons;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memmove(xenconsoled_buf, &xen=
consoled_buf[xenconsoled_cons], xenconsoled_prod);
>
> This has quite a few overly-long lines. =C2=A0Can you keep them to 75ish
> please ?
>
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D select(nfds, &rsel, &wsel, NULL, NU=
LL);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D select(nfds, &rsel, &wsel, NULL, &w=
ait);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out_err;
>
> This needs to handle EINTR. =C2=A0Ie, if EINTR happens, just loop again.
> (A better implementation would actually subtract the timeout but
> let's not do that now).
>
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0timeout =3D ret =3D=3D 0 ? 1 : 0;
>
> This seems a slightly odd approach. =C2=A0How about
> =C2=A0if (ret=3D=3D0) {
> =C2=A0 =C2=A0 empty the ring buffer

When talking with Ian Campbell we decided to avoid cleaning the whole
buffer, and instead append data at the end, to prevent loosing more
output than necessary.

> =C2=A0 =C2=A0 continue;
> =C2=A0}
> ?
>
> And you should avoid setting a timeout if the buffer is empty, so that
> a completely idle setup just sits and waits rather than polling every
> second.

Yes, will fix that.

> Ian.
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-api-bounces@lists.xensource.com Tue Oct 18 03:37:10 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 03:37:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG72j-00023S-Mm; Tue, 18 Oct 2011 03:37:09 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG71L-0001e4-MZ; Tue, 18 Oct 2011 03:35:44 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1318934140!631721!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25657 invoked from network); 18 Oct 2011 10:35:40 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 10:35:40 -0000
Received: by wwf10 with SMTP id 10so533567wwf.24
	for <multiple recipients>; Tue, 18 Oct 2011 03:35:39 -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:subject
	:references:in-reply-to:content-type;
	bh=4VHd6kTWaQKLjfMuGoR0K/xuLtq9eM17/Lnd4Br1JtA=;
	b=ch24q27G6KAhNsb4azRikwgknInEYsIEwMJdBN+DZMoeAINMC2bCF+Y66gOjRFZkTu
	zBtuNcriDQbJTMtpW9GUE0HRHwnrPJ+9865KSt8RdhX+SQX5I4LyAxRULzwUr2UNJnZv
	zv64wl5MwU14fWxjmXMplbnqDLmwr98sH8lgE=
Received: by 10.216.229.161 with SMTP id h33mr1275201weq.3.1318934139640;
	Tue, 18 Oct 2011 03:35:39 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id e7sm2694858wbh.12.2011.10.18.03.35.37
	(version=SSLv3 cipher=OTHER); Tue, 18 Oct 2011 03:35:37 -0700 (PDT)
Message-ID: <4E9D5676.5020605@xen.org>
Date: Tue, 18 Oct 2011 11:35:34 +0100
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-api@lists.xensource.com" <xen-api@lists.xensource.com>,
	xen-arm@lists.xensource.com
References: <4E89ADA1.1000409@xen.org>
In-Reply-To: <4E89ADA1.1000409@xen.org>
Cc: 
Subject: [Xen-API] Re: Bugs in the Project Governance : proposed fixes
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>
Content-Type: multipart/mixed; boundary="===============0603289413=="
Sender: xen-api-bounces@lists.xensource.com
Errors-To: xen-api-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============0603289413==
Content-Type: multipart/alternative;
	boundary="------------050607090509080600060400"

This is a multi-part message in MIME format.
--------------050607090509080600060400
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

No controversy, so the proposal is considered approved

On 03/10/2011 13:42, Lars Kurth wrote:
> Dear Developers,
>
> last week, I mentioned that we had some minor bugs in project 
> governance <http://www.xen.org/projects/governance.html> that needed 
> correction. A revision can be found at revised project governance 
> <http://www.xen.org/projects/governance-rev.html> (changes marked in 
> italics). If you have any feedback, please reply to this thread or 
> post on xen-devel <mailto:xen-devel@lists.xensource.com> with *project 
> governance proposal feedback* in the title of the e-mail. Feedback 
> must be given by next Monday 18:00 GMT.
>
> Best Regards
> Lars


--------------050607090509080600060400
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    No controversy, so the proposal is considered approved<br>
    <br>
    On 03/10/2011 13:42, Lars Kurth wrote:
    <blockquote cite="mid:4E89ADA1.1000409@xen.org" type="cite">
      <meta http-equiv="content-type" content="text/html;
        charset=ISO-8859-1">
      Dear Developers,<br>
      <br>
      last week, I mentioned that we had some minor bugs in <a
        moz-do-not-send="true"
        href="http://www.xen.org/projects/governance.html">project
        governance</a> that needed correction. A revision can be found
      at <a moz-do-not-send="true"
        href="http://www.xen.org/projects/governance-rev.html">revised
        project governance</a> (changes marked in italics). If you have
      any feedback, please reply to this thread or post on <a
        moz-do-not-send="true"
        href="mailto:xen-devel@lists.xensource.com">xen-devel</a> with <strong>project

        governance proposal feedback</strong> in the title of the
      e-mail. Feedback must be given by next Monday 18:00 GMT.<br>
      <br>
      Best Regards<br>
      Lars<br>
    </blockquote>
    <br>
  </body>
</html>

--------------050607090509080600060400--


--===============0603289413==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

--===============0603289413==--


From xen-devel-bounces@lists.xensource.com Tue Oct 18 03:41:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 03:41:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG77C-0002n1-9P; Tue, 18 Oct 2011 03:41:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG76f-0002b6-FK
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 03:41:14 -0700
X-Env-Sender: cmkim@core.kaist.ac.kr
X-Msg-Ref: server-5.tower-27.messagelabs.com!1318934442!49576644!1
X-Originating-IP: [143.248.147.118]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29536 invoked from network); 18 Oct 2011 10:40:45 -0000
Received: from core.kaist.ac.kr (HELO core.kaist.ac.kr) (143.248.147.118)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 18 Oct 2011 10:40:45 -0000
Received: from CHULMINKIMPC (az.kaist.ac.kr [143.248.165.115])
	by core.kaist.ac.kr (8.14.4/8.14.4) with ESMTP id p9IAZxcp019127;
	Tue, 18 Oct 2011 19:35:59 +0900
From: "Chulmin Kim" <cmkim@core.kaist.ac.kr>
To: "'Carter Cheng'" <cartercheng@gmail.com>
References: <CALS6=qXEkUaSSeCAnqZCd1nYEnBqDfOPTj5z0ULwLkNfWp5oEA@mail.gmail.com>
In-Reply-To: <CALS6=qXEkUaSSeCAnqZCd1nYEnBqDfOPTj5z0ULwLkNfWp5oEA@mail.gmail.com>
Subject: RE: [Xen-devel] oprofile and xen
Date: Tue, 18 Oct 2011 19:41:09 +0900
Message-ID: <014901cc8d82$72b1edb0$5815c910$@core.kaist.ac.kr>
MIME-Version: 1.0
X-Mailer: Microsoft Outlook 14.0
Thread-Index: AQIYLy0Hvj+cD1aqPgMw82KuHkeJbZTqpPLw
Content-Language: ko
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="===============1692768030=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multipart message in MIME format.

--===============1692768030==
Content-Type: multipart/alternative;
	boundary="----=_NextPart_000_014A_01CC8DCD.E29D3F30"
Content-Language: ko

This is a multipart message in MIME format.

------=_NextPart_000_014A_01CC8DCD.E29D3F30
Content-Type: text/plain;
	charset="us-ascii"
Content-Transfer-Encoding: 7bit

As I know, you mean xenoprof, right? 

 

In my experience, it works with my xen4.0.1 and 2.6.18 linux dom0 kernel.
(intel xeon)

 

I don't know which parts of xen source code are modified, 

but I guess the most parts related with xenoprof are not modified. 

 

Did you test the recent xenoprof on the recent xen and dom0? 

 

Please post your result if it is possible.

 

Thanks.

 

Chulmin

 

 

 

 

 

From: xen-devel-bounces@lists.xensource.com
[mailto:xen-devel-bounces@lists.xensource.com] On Behalf Of Carter Cheng
Sent: Tuesday, October 18, 2011 6:20 PM
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] oprofile and xen

 

Hello,

 

I was wondering if xen currently works well with oprofile. I saw some patch
out there put together by an HP engineer but it does not work with the
current version of the code. Does anyone know how much change there has been
in the code and whether it would take much effort to modify the patch?

 

Thanks,

 

Carter


------=_NextPart_000_014A_01CC8DCD.E29D3F30
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: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 14 =
(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:"Malgun Gothic";
	panose-1:2 11 5 3 2 0 0 2 0 4;}
@font-face
	{font-family:Tahoma;
	panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
	{font-family:"Malgun Gothic";
	panose-1:2 11 5 3 2 0 0 2 0 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.EmailStyle17
	{mso-style-type:personal-reply;
	font-family:"Malgun Gothic";
	color:#1F497D;}
.MsoChpDefault
	{mso-style-type:export-only;
	font-family:"Malgun Gothic";}
@page WordSection1
	{size:612.0pt 792.0pt;
	margin:3.0cm 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=3DKO link=3Dblue =
vlink=3Dpurple><div class=3DWordSection1><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun Gothic"'>As I know, you =
mean xenoprof, right? <o:p></o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun Gothic"'>In my experience, =
it works with my xen4.0.1 and 2.6.18 linux dom0 kernel. (intel =
xeon)<o:p></o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun Gothic"'>I don&#8217;t =
know which parts of xen source code are modified, =
<o:p></o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun Gothic"'>but I guess the =
most parts related with xenoprof are not modified. =
<o:p></o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun Gothic"'>Did you test the =
recent xenoprof on the recent xen and dom0? <o:p></o:p></span></p><p =
class=3DMsoNormal style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun Gothic"'>Please post your =
result if it is possible.<o:p></o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'>Thanks.<o:p></o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'>Chulmin<o:p></o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'><o:p>&nbsp;</o:p></span></p><p class=3DMsoNormal =
style=3D'word-break:break-hangul'><span lang=3DEN-US =
style=3D'font-size:10.0pt;font-family:"Malgun =
Gothic"'><o:p>&nbsp;</o:p></span></p><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-family:"Tahoma","sans-serif"'> =
xen-devel-bounces@lists.xensource.com =
[mailto:xen-devel-bounces@lists.xensource.com] <b>On Behalf Of =
</b>Carter Cheng<br><b>Sent:</b> Tuesday, October 18, 2011 6:20 =
PM<br><b>To:</b> xen-devel@lists.xensource.com<br><b>Subject:</b> =
[Xen-devel] oprofile and xen<o:p></o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US><o:p>&nbsp;</o:p></span></p><p =
class=3DMsoNormal><span lang=3DEN-US>Hello,<o:p></o:p></span></p><div><p =
class=3DMsoNormal><span =
lang=3DEN-US><o:p>&nbsp;</o:p></span></p></div><div><p =
class=3DMsoNormal><span lang=3DEN-US>I was wondering if xen currently =
works well with oprofile. I saw some patch out there put together by an =
HP engineer but it does not work with the current version of the code. =
Does anyone know how much change there has been in the code and whether =
it would take much effort to modify the =
patch?<o:p></o:p></span></p></div><div><p class=3DMsoNormal><span =
lang=3DEN-US><o:p>&nbsp;</o:p></span></p></div><div><p =
class=3DMsoNormal><span =
lang=3DEN-US>Thanks,<o:p></o:p></span></p></div><div><p =
class=3DMsoNormal><span =
lang=3DEN-US><o:p>&nbsp;</o:p></span></p></div><div><p =
class=3DMsoNormal><span =
lang=3DEN-US>Carter<o:p></o:p></span></p></div></div></body></html>
------=_NextPart_000_014A_01CC8DCD.E29D3F30--



--===============1692768030==
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

--===============1692768030==--



From xen-devel-bounces@lists.xensource.com Tue Oct 18 03:54:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 03:54:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG7J3-0003TR-Ut; Tue, 18 Oct 2011 03:54:01 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG7IM-0003HH-LB
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 03:53:18 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1318935195!29371022!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2568 invoked from network); 18 Oct 2011 10:53:15 -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;
	18 Oct 2011 10:53:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,364,1315180800"; 
   d="scan'208";a="8442169"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 10:53: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, 18 Oct 2011 11:53:03 +0100
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
	1RG7I6-0007qx-S7; Tue, 18 Oct 2011 10:53:02 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RG7I6-0006LU-QX;
	Tue, 18 Oct 2011 11:53:02 +0100
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: <20125.23182.625048.833144@mariner.uk.xensource.com>
Date: Tue, 18 Oct 2011 11:53:02 +0100
To: Roger Pau =?iso-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH] tools/build: append user includes and
	libraries at the end of the compile flags
In-Reply-To: <CAPLaKK7Ob7qazk=eoTRyEy42R-14Gt_fYv-fBGxvFPM2ksqzFA@mail.gmail.com>
References: <ae251a2f9490dfa98553.1318594610@loki>
	<20124.15541.672787.681791@mariner.uk.xensource.com>
	<CAPLaKK7NH6AZ8urX5yAmV3L_zt06NDJa3kgZUgZ8c3hFQG49Pg@mail.gmail.com>
	<20124.16018.111545.330437@mariner.uk.xensource.com>
	<CAPLaKK43qoajKpaydqYFP4b0ewXp98txzwH6K9sVeX7pJzAgQg@mail.gmail.com>
	<CAPLaKK7Ob7qazk=eoTRyEy42R-14Gt_fYv-fBGxvFPM2ksqzFA@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

Roger Pau Monné writes ("Re: [Xen-devel] [PATCH] tools/build: append user includes and libraries at the end of the compile flags"):
> On second through, I think it would be appropriate to rename EXTRA_LIB
> and EXTRA_INCLUDES to PREPEND_LIB and PREPEND_INCLUDES, and create two
> new variables called APPEND_INCLUDES and APPEND_LIB that perform the
> same task as USER_CFLAGS and USER_LDFLAGS (append at the end). I think
> it would be much more clearer using descriptive variable names, since
> USER_ and EXTRA_ can lead to confusion.

That would be neater, but I don't think it's helpful to people for us
to be renaming our build variables.

Anyone who is repackaging Xen (distros, XCP, ...) would prefer the
variables to say the same even if the names aren't ideal.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 03:55:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 03:55:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG7Ko-0003sI-Ls; Tue, 18 Oct 2011 03:55:50 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RG7KH-0003gP-Uz
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 03:55:18 -0700
X-Env-Sender: ijc@hellion.org.uk
X-Msg-Ref: server-4.tower-21.messagelabs.com!1318935311!636286!1
X-Originating-IP: [80.68.92.230]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13551 invoked from network); 18 Oct 2011 10:55:11 -0000
Received: from aaar.vm.bytemark.co.uk (HELO aaar.vm.bytemark.co.uk)
	(80.68.92.230) by server-4.tower-21.messagelabs.com with SMTP;
	18 Oct 2011 10:55:11 -0000
Received: from localhost (unknown [127.0.0.1])
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id 9E8FD143C32;
	Tue, 18 Oct 2011 10:55:07 +0000 (UTC)
Received: from aaar.vm.bytemark.co.uk ([127.0.0.1])
	by localhost (aaar.vm.bytemark.co.uk [127.0.0.1]) (amavisd-new,
	port 10024)
	with ESMTP id 7TI5WzJUed2J; Tue, 18 Oct 2011 11:55:04 +0100 (BST)
Received: from hopkins.hellion.org.uk
	(cpc2-cmbg14-2-0-cust125.5-4.cable.virginmedia.com [86.26.0.126])
	(using TLSv1 with cipher AES256-SHA (256/256 bits))
	(No client certificate requested)
	by aaar.vm.bytemark.co.uk (Postfix) with ESMTP id 8F78113A9DF;
	Tue, 18 Oct 2011 11:55:04 +0100 (BST)
Received: from firewall.ctxuk.citrix.com ([62.200.22.2] helo=[10.80.2.42])
	by hopkins.hellion.org.uk with esmtpsa (SSL3.0:RSA_AES_256_CBC_SHA1:32)
	(Exim 4.72) (envelope-from <ijc@hellion.org.uk>)
	id 1RG7K1-0006ZN-Gh; Tue, 18 Oct 2011 11:55:04 +0100
From: Ian Campbell <ijc@hellion.org.uk>
To: Giuseppe Sacco <giuseppe@eppesuigoccas.homedns.org>
Date: Tue, 18 Oct 2011 11:54:55 +0100
In-Reply-To: <1314347333.4595.27.camel@scarafaggio>
References: <1313577856.13030.17.camel@scarafaggio>
	<1314003611.5010.400.camel@zakaz.uk.xensource.com>
	<20110824202400.GA27448@dumpdata.com>
	<1314221049.17978.709.camel@dagon.hellion.org.uk>
	<1314255147.4943.5.camel@scarafaggio>
	<1314255400.17978.724.camel@dagon.hellion.org.uk>
	<1314343540.31709.4.camel@dagon.hellion.org.uk>
	<1314347333.4595.27.camel@scarafaggio>
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318935301.3385.1.camel@zakaz.uk.xensource.com>
Mime-Version: 1.0
X-SA-Exim-Connect-IP: 62.200.22.2
X-SA-Exim-Mail-From: ijc@hellion.org.uk
Subject: Re: Bug#638172: [Xen-devel] Re: Bug#638172: BUG: soft lockup -
	CPU#0 stuck for 61s! [qemu-dm:3205]
X-SA-Exim-Version: 4.2.1 (built Mon, 22 Mar 2010 06:51:10 +0000)
X-SA-Exim-Scanned: Yes (on hopkins.hellion.org.uk)
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Ben Hutchings <ben@decadent.org.uk>,
	xen-devel <xen-devel@lists.xensource.com>, 638172@bugs.debian.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 Fri, 2011-08-26 at 10:28 +0200, Giuseppe Sacco wrote:
> I just installed the new kernel and switched to 64bit hypervisor. I'll
> let you know about any news.

Has everything been OK since you switched?

Ian.

> 
> Il giorno ven, 26/08/2011 alle 08.25 +0100, Ian Campbell ha scritto:
> [...]
> > I'm in the process of uploading a kernel to
> > http://xenbits.xen.org/people/ianc/2.6.32-36~xen0/ which has a bunch of
> > patches to the event channel (aka IRQ) subsystem backported. I think the
> > kernel flavour you want is there already please could you give it a go
> > when you get the chance.
> 
> During boot I got this message. Is this related to this bug or to new
> kernel?
> 
> [    0.004000] ------------[ cut here ]------------
> [    0.004000] WARNING: at /tmp/buildd/linux-2.6-2.6.32/debian/build/source_i386_xen/arch/x86/xen/enlighten.c:726 perf_events_lapic_init+0x28/0x29()
> [    0.004000] Hardware name: MS-7368
> [    0.004000] Modules linked in:
> [    0.004000] Pid: 0, comm: swapper Not tainted 2.6.32-5-xen-686 #1
> [    0.004000] Call Trace:
> [    0.004000]  [<c1037839>] ? warn_slowpath_common+0x5e/0x8a
> [    0.004000]  [<c103786f>] ? warn_slowpath_null+0xa/0xc
> [    0.004000]  [<c1011db0>] ? perf_events_lapic_init+0x28/0x29
> [    0.004000]  [<c14033dd>] ? init_hw_perf_events+0x2dd/0x376
> [    0.004000]  [<c1403030>] ? check_bugs+0x8/0xd8
> [    0.004000]  [<c13fb808>] ? start_kernel+0x309/0x31d
> [    0.004000]  [<c13fd410>] ? xen_start_kernel+0x564/0x56b
> [    0.004000]  [<c1409045>] ? check_nmi_watchdog+0xcd/0x1f2
> [    0.004000] ---[ end trace a7919e7f17c0a725 ]---
> 
> Thanks,
> Giuseppe
> 
> 

-- 
Ian Campbell
Current Noise: Anathema - Flying

There's no future in time travel.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 04:03:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 04: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 1RG7Rp-0004Tz-Av; Tue, 18 Oct 2011 04:03:05 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG7Nk-00049S-IX
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 03:59:21 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1318935519!640457!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14837 invoked from network); 18 Oct 2011 10:58:40 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 10:58:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,364,1315180800"; 
   d="scan'208";a="8442316"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 10:58: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;
	Tue, 18 Oct 2011 11:58:10 +0100
Subject: Re: [Xen-devel] [PATCH] tools/build: append user includes and
	libraries at the end of the compile flags
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Tue, 18 Oct 2011 11:58:10 +0100
In-Reply-To: <20125.23182.625048.833144@mariner.uk.xensource.com>
References: <ae251a2f9490dfa98553.1318594610@loki>
	<20124.15541.672787.681791@mariner.uk.xensource.com>
	<CAPLaKK7NH6AZ8urX5yAmV3L_zt06NDJa3kgZUgZ8c3hFQG49Pg@mail.gmail.com>
	<20124.16018.111545.330437@mariner.uk.xensource.com>
	<CAPLaKK43qoajKpaydqYFP4b0ewXp98txzwH6K9sVeX7pJzAgQg@mail.gmail.com>
	<CAPLaKK7Ob7qazk=eoTRyEy42R-14Gt_fYv-fBGxvFPM2ksqzFA@mail.gmail.com>
	<20125.23182.625048.833144@mariner.uk.xensource.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1318935490.3385.4.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <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

On Tue, 2011-10-18 at 11:53 +0100, Ian Jackson wrote:
> Roger Pau MonnÃ© writes ("Re: [Xen-devel] [PATCH] tools/build: append user includes and libraries at the end of the compile flags"):
> > On second through, I think it would be appropriate to rename EXTRA_LIB
> > and EXTRA_INCLUDES to PREPEND_LIB and PREPEND_INCLUDES, and create two
> > new variables called APPEND_INCLUDES and APPEND_LIB that perform the
> > same task as USER_CFLAGS and USER_LDFLAGS (append at the end). I think
> > it would be much more clearer using descriptive variable names, since
> > USER_ and EXTRA_ can lead to confusion.
> 
> That would be neater, but I don't think it's helpful to people for us
> to be renaming our build variables.
> 
> Anyone who is repackaging Xen (distros, XCP, ...) would prefer the
> variables to say the same even if the names aren't ideal.

As long as we keep the old names as well is there harm in adding new,
more descriptive names as well? i.e.
	$(PREPEND_LIB) $(EXTRA_LIB) ... $(APPEND_LIB)
?

or even PREPEND_LIB ?= $(EXTRA_LIB) and "$(PREPEND_LIB) ...
$(APPEND_LIB)". That way things don't break today and when a packager
finds they actually need the distinction they can switch.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 04:06:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 04: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 1RG7Um-0004uU-CS; Tue, 18 Oct 2011 04:06:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG7Nk-00049V-IU
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 03:59:21 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1318935499!49581413!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21961 invoked from network); 18 Oct 2011 10:58:20 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 10:58:20 -0000
Received: by pzk32 with SMTP id 32so1374591pzk.8
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 03:58:43 -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=lsUnFbtODMDC0U/HuqdKCUfPOC2g9T5Z2cs6xufi/Fs=;
	b=OvXr/tHY30wPEVa56yCXBd3xfVrpSXt+kLsOgViDrjXCE5TmXTmh/U0yJODenuiISt
	L3tYQqUFbjlVy0HTYupgxTGYhLKEHoQZi6ms0bIXRKQQjMsffVU99nUELzpKeTcBH413
	vk6nh9yLhxdSAQZNXAZPJGrROZ63AiaPFooM0=
MIME-Version: 1.0
Received: by 10.68.11.138 with SMTP id q10mr4243057pbb.37.1318935523220; Tue,
	18 Oct 2011 03:58:43 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Tue, 18 Oct 2011 03:58:43 -0700 (PDT)
In-Reply-To: <20125.23182.625048.833144@mariner.uk.xensource.com>
References: <ae251a2f9490dfa98553.1318594610@loki>
	<20124.15541.672787.681791@mariner.uk.xensource.com>
	<CAPLaKK7NH6AZ8urX5yAmV3L_zt06NDJa3kgZUgZ8c3hFQG49Pg@mail.gmail.com>
	<20124.16018.111545.330437@mariner.uk.xensource.com>
	<CAPLaKK43qoajKpaydqYFP4b0ewXp98txzwH6K9sVeX7pJzAgQg@mail.gmail.com>
	<CAPLaKK7Ob7qazk=eoTRyEy42R-14Gt_fYv-fBGxvFPM2ksqzFA@mail.gmail.com>
	<20125.23182.625048.833144@mariner.uk.xensource.com>
Date: Tue, 18 Oct 2011 12:58:43 +0200
X-Google-Sender-Auth: 7RAWhNHFdY2Q3rjHXSfdVwMGxEE
Message-ID: <CAPLaKK6aFAg8nejA8kwF0cN-qZOKcNLYJosc2AkM=QG4ByHoYQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] tools/build: append user includes and
	libraries at the end of the compile flags
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
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

> That would be neater, but I don't think it's helpful to people for us
> to be renaming our build variables.
>
> Anyone who is repackaging Xen (distros, XCP, ...) would prefer the
> variables to say the same even if the names aren't ideal.

My new patch include PREPEND_ and APPEND_ while maintaining the old
EXTRA_. Is that fine?

> Ian.
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 04:07:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 04:07:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG7WP-0005Ia-RG; Tue, 18 Oct 2011 04:07:49 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG7QT-0004Ka-UC
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 04:01:46 -0700
X-Env-Sender: giuseppe@eppesuigoccas.homedns.org
X-Msg-Ref: server-13.tower-21.messagelabs.com!1318935698!611968!1
X-Originating-IP: [46.4.16.148]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12365 invoked from network); 18 Oct 2011 11:01:38 -0000
Received: from centrum.lixper.it (HELO centrum.lixper.it) (46.4.16.148)
	by server-13.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	18 Oct 2011 11:01:38 -0000
Received: from host111-228-dynamic.20-79-r.retail.telecomitalia.it
	([79.20.228.111] helo=[192.168.1.5])
	by centrum.lixper.it with esmtpsa (SSL3.0:RSA_AES_256_CBC_SHA1:32)
	(Exim 4.72) (envelope-from <giuseppe@eppesuigoccas.homedns.org>)
	id 1RG7QI-0005rj-1V; Tue, 18 Oct 2011 13:01:30 +0200
Message-ID: <1318935656.4930.11.camel@scarafaggio>
Subject: Re: Bug#638172: [Xen-devel] Re: Bug#638172: BUG: soft lockup -
	CPU#0 stuck for 61s! [qemu-dm:3205]
From: Giuseppe Sacco <giuseppe@eppesuigoccas.homedns.org>
To: Ian Campbell <ijc@hellion.org.uk>
Date: Tue, 18 Oct 2011 13:00:56 +0200
In-Reply-To: <1318935301.3385.1.camel@zakaz.uk.xensource.com>
References: <1313577856.13030.17.camel@scarafaggio>
	<1314003611.5010.400.camel@zakaz.uk.xensource.com>
	<20110824202400.GA27448@dumpdata.com>
	<1314221049.17978.709.camel@dagon.hellion.org.uk>
	<1314255147.4943.5.camel@scarafaggio>
	<1314255400.17978.724.camel@dagon.hellion.org.uk>
	<1314343540.31709.4.camel@dagon.hellion.org.uk>
	<1314347333.4595.27.camel@scarafaggio>
	<1318935301.3385.1.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3-2 
Content-Transfer-Encoding: 7bit
Mime-Version: 1.0
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Ben Hutchings <ben@decadent.org.uk>,
	xen-devel <xen-devel@lists.xensource.com>, 638172@bugs.debian.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

Il giorno mar, 18/10/2011 alle 11.54 +0100, Ian Campbell ha scritto:
> On Fri, 2011-08-26 at 10:28 +0200, Giuseppe Sacco wrote:
> > I just installed the new kernel and switched to 64bit hypervisor. I'll
> > let you know about any news.
> 
> Has everything been OK since you switched?

Yes: no crashes since then.

Thanks,
Giuseppe


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 04:09:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 04:09:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG7Y3-0005lM-JT; Tue, 18 Oct 2011 04:09:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG7RW-0004QD-IT
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 04:02:48 -0700
X-Env-Sender: peterz@infradead.org
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318935762!637206!1
X-Originating-IP: [205.233.59.134]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14429 invoked from network); 18 Oct 2011 11:02:43 -0000
Received: from merlin.infradead.org (HELO merlin.infradead.org)
	(205.233.59.134)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 18 Oct 2011 11:02:43 -0000
Received: from canuck.infradead.org ([2001:4978:20e::1])
	by merlin.infradead.org with esmtps (Exim 4.76 #1 (Red Hat Linux))
	id 1RG7Qw-0007pM-Om; Tue, 18 Oct 2011 11:02:10 +0000
Received: from j77219.upc-j.chello.nl ([24.132.77.219] helo=twins)
	by canuck.infradead.org with esmtpsa (Exim 4.76 #1 (Red Hat Linux))
	id 1RG7Qw-0006RC-6O; Tue, 18 Oct 2011 11:02:10 +0000
Received: by twins (Postfix, from userid 1000)
	id A0A09814B934; Tue, 18 Oct 2011 13:02:00 +0200 (CEST)
From: Peter Zijlstra <peterz@infradead.org>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Date: Tue, 18 Oct 2011 13:02:00 +0200
In-Reply-To: <4E9A38FA.7030504@goop.org>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<c133180533d7e520bb1e818e987117811a666fbc.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<1318502628.24856.10.camel@twins> <4E98AEDD.4010503@goop.org>
	<1318668158.6594.0.camel@twins> <4E9A38FA.7030504@goop.org>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Mailer: Evolution 3.0.3- 
Message-ID: <1318935720.21167.15.camel@twins>
Mime-Version: 1.0
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>, Michael,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>, Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>, "H. Peter
	Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 10/10] jump-label: initialize
 jump-label subsystem much 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 Sat, 2011-10-15 at 18:52 -0700, Jeremy Fitzhardinge wrote:
> On 10/15/2011 01:42 AM, Peter Zijlstra wrote:
> > On Fri, 2011-10-14 at 14:51 -0700, Jeremy Fitzhardinge wrote:
> >> How about this?  Proper comment and much earlier init.
> > Looks good to me, thanks!
>=20
> Should I take that as an ACK on the series?

Yes, I don't see any problems with it,

Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 04:19:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 04:19:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG7ho-00078y-0q; Tue, 18 Oct 2011 04:19:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG7fk-0006u6-GO
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 04:18:21 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1318936622!44970022!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24418 invoked from network); 18 Oct 2011 11:17:03 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 11:17:03 -0000
Received: by eyb6 with SMTP id 6so779154eyb.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 04:17:25 -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:user-agent:date:from:to:cc;
	bh=Y0fDWJHIypKId1pbMzGFIZbNFsVKTGxqoElsXE9sCeU=;
	b=bsL9bRtWWR9a9aTbLTiv+F6aZSVomy3dErAgFu9UPP7r2aiImSeFHowxkHJu0ZzkKK
	OK+597k70/RsdBUadZbDzX0qMC/p6rOKIzUxgt/5bJf+U1w7WHDlkV3HQEcI8YSK848W
	ltDKOU+6xlorP84IUjUFFPZIp6ldenf7RE3j0=
Received: by 10.216.131.12 with SMTP id l12mr2191895wei.95.1318936645029;
	Tue, 18 Oct 2011 04:17:25 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id ff1sm2903953wbb.8.2011.10.18.04.17.22
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 18 Oct 2011 04:17:23 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 4a591584e20718b06f3e9dc72897ee2a87f43c3c
Message-Id: <4a591584e20718b06f3e.1318936637@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Tue, 18 Oct 2011 13:17:17 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@eu.citrix.com
Subject: [Xen-devel] [PATCH v3] libxl: reimplement buffer for bootloading
 and drop data if buffer 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 Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1318936435 -7200
# Node ID 4a591584e20718b06f3e9dc72897ee2a87f43c3c
# Parent  0a720316685a73e2d5aee56c1572b9ee8d98ab4e
libxl: reimplement buffer for bootloading and drop data if buffer is full.

Implement a buffer for the bootloading process that appends data to the end until it's full. Drop output from bootloader if a timeout has occurred and the buffer is full. Prevents the bootloader from getting stuck when using ptys with small buffers.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 0a720316685a -r 4a591584e207 tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Tue Oct 18 11:26:43 2011 +0200
+++ b/tools/libxl/libxl_bootloader.c	Tue Oct 18 13:13:55 2011 +0200
@@ -21,6 +21,7 @@
 
 #include <sys/stat.h>
 #include <sys/types.h>
+#include <sys/ioctl.h>
 
 #include "libxl.h"
 #include "libxl_internal.h"
@@ -28,7 +29,8 @@
 #include "flexarray.h"
 
 #define XENCONSOLED_BUF_SIZE 16
-#define BOOTLOADER_BUF_SIZE 1024
+#define BOOTLOADER_BUF_SIZE 4096
+#define BOOTLOADER_TIMEOUT 1
 
 static char **make_bootloader_args(libxl__gc *gc,
                                    libxl_domain_build_info *info,
@@ -165,10 +167,11 @@ static pid_t fork_exec_bootloader(int *m
  */
 static char * bootloader_interact(libxl__gc *gc, int xenconsoled_fd, int bootloader_fd, int fifo_fd)
 {
-    int ret;
+    int ret, read_ahead;
 
     size_t nr_out = 0, size_out = 0;
     char *output = NULL;
+    struct timeval wait;
 
     /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
     int xenconsoled_prod = 0, xenconsoled_cons = 0;
@@ -181,39 +184,74 @@ static char * bootloader_interact(libxl_
         fd_set wsel, rsel;
         int nfds;
 
+        /* Set timeout to 1s before starting to discard data */
+        wait.tv_sec = BOOTLOADER_TIMEOUT;
+        wait.tv_usec = 0;
+
         if (xenconsoled_prod == xenconsoled_cons)
             xenconsoled_prod = xenconsoled_cons = 0;
         if (bootloader_prod == bootloader_cons)
             bootloader_prod = bootloader_cons = 0;
+        /* Move buffers around to drop already consumed data */
+        if (xenconsoled_cons > 0) {
+            xenconsoled_prod -= xenconsoled_cons;
+            memmove(xenconsoled_buf, &xenconsoled_buf[xenconsoled_cons],
+                    xenconsoled_prod);
+            xenconsoled_cons = 0;
+        }
+        if (bootloader_cons > 0) {
+            bootloader_prod -= bootloader_cons;
+            memmove(bootloader_buf, &bootloader_buf[bootloader_cons],
+                    bootloader_prod);
+            bootloader_cons = 0;
+        }
 
         FD_ZERO(&rsel);
         FD_SET(fifo_fd, &rsel);
         nfds = fifo_fd + 1;
-        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0)) {
+        if (xenconsoled_prod < XENCONSOLED_BUF_SIZE) {
             FD_SET(xenconsoled_fd, &rsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
-        }
-        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0)) {
+        } 
+        if (bootloader_prod < BOOTLOADER_BUF_SIZE) {
             FD_SET(bootloader_fd, &rsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
         FD_ZERO(&wsel);
-        if (bootloader_prod != bootloader_cons) {
+        if (bootloader_prod > 0) {
             FD_SET(xenconsoled_fd, &wsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
         }
-        if (xenconsoled_prod != xenconsoled_cons) {
+        if (xenconsoled_prod > 0) {
             FD_SET(bootloader_fd, &wsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
-        ret = select(nfds, &rsel, &wsel, NULL, NULL);
-        if (ret < 0)
+        if (xenconsoled_prod == XENCONSOLED_BUF_SIZE ||
+            bootloader_prod == BOOTLOADER_BUF_SIZE)
+            ret = select(nfds, &rsel, &wsel, NULL, &wait);
+        else
+            ret = select(nfds, &rsel, &wsel, NULL, NULL);
+        if (ret < 0) {
+            if (errno == EINTR)
+                continue;
             goto out_err;
+        }
 
         /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
-        if (FD_ISSET(xenconsoled_fd, &rsel)) {
+        if (FD_ISSET(xenconsoled_fd, &rsel) || ret == 0) {
+            if (xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
+                if (ioctl(xenconsoled_fd, FIONREAD, &read_ahead) < 0)
+                    goto out_err;
+                if (read_ahead >= XENCONSOLED_BUF_SIZE)
+                    /* The whole buffer will be overwritten */
+                    read_ahead = XENCONSOLED_BUF_SIZE;
+                else
+                    memmove(xenconsoled_buf, &xenconsoled_buf[read_ahead],
+                            XENCONSOLED_BUF_SIZE - read_ahead);
+                xenconsoled_prod -= read_ahead;
+            }
             ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;
@@ -229,7 +267,18 @@ static char * bootloader_interact(libxl_
         }
 
         /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
-        if (FD_ISSET(bootloader_fd, &rsel)) {
+        if (FD_ISSET(bootloader_fd, &rsel) || ret == 0) {
+            if (bootloader_prod == BOOTLOADER_BUF_SIZE) {
+                if (ioctl(bootloader_fd, FIONREAD, &read_ahead) < 0)
+                    goto out_err;
+                if (read_ahead >= BOOTLOADER_BUF_SIZE)
+                    /* The whole buffer will be overwritten */
+                    read_ahead = BOOTLOADER_BUF_SIZE;
+                else
+                    memmove(bootloader_buf, &bootloader_buf[read_ahead],
+                            BOOTLOADER_BUF_SIZE - read_ahead);
+                bootloader_prod -= read_ahead;
+            }
             ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 04:25:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 04:25:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG7nd-0007iK-4v; Tue, 18 Oct 2011 04:25:37 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG7n0-0007VV-92
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 04:24:58 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1318937093!641157!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2905 invoked from network); 18 Oct 2011 11:24:54 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 11:24:54 -0000
Received: by yxl11 with SMTP id 11so692523yxl.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 04:24:53 -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=9uCYMza0g5+vWuL9v8loc0kwdrMgufmi5UYK8rIRhrk=;
	b=TV95mmfhmiEIP3/KJbGtF4//tmisZXUSqPP4VTG+Uj6eq6J3JqVHNlSFECG68yrmLK
	9b0dQKZo7tyVYR64zO/H0jS/ekojvD239Tr199V8M9x0pq4N0hXqQNKhVdIG25ilc1TE
	3HPyRjDdSG+nfBSoeOV6j8fySdi5gbaschJno=
MIME-Version: 1.0
Received: by 10.68.36.232 with SMTP id t8mr4381425pbj.54.1318937092977; Tue,
	18 Oct 2011 04:24:52 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Tue, 18 Oct 2011 04:24:52 -0700 (PDT)
In-Reply-To: <1318935490.3385.4.camel@zakaz.uk.xensource.com>
References: <ae251a2f9490dfa98553.1318594610@loki>
	<20124.15541.672787.681791@mariner.uk.xensource.com>
	<CAPLaKK7NH6AZ8urX5yAmV3L_zt06NDJa3kgZUgZ8c3hFQG49Pg@mail.gmail.com>
	<20124.16018.111545.330437@mariner.uk.xensource.com>
	<CAPLaKK43qoajKpaydqYFP4b0ewXp98txzwH6K9sVeX7pJzAgQg@mail.gmail.com>
	<CAPLaKK7Ob7qazk=eoTRyEy42R-14Gt_fYv-fBGxvFPM2ksqzFA@mail.gmail.com>
	<20125.23182.625048.833144@mariner.uk.xensource.com>
	<1318935490.3385.4.camel@zakaz.uk.xensource.com>
Date: Tue, 18 Oct 2011 13:24:52 +0200
X-Google-Sender-Auth: Bs47WwB681a0VTISG96jD88CjFI
Message-ID: <CAPLaKK7vJp-qj+Ha99ySQVj38jvpQZRFs9iaeG829Q0DRo6bWA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] tools/build: append user includes and
	libraries at the end of the compile flags
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
Content-Transfer-Encoding: quoted-printable
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

2011/10/18 Ian Campbell <Ian.Campbell@citrix.com>:
>> That would be neater, but I don't think it's helpful to people for us
>> to be renaming our build variables.
>>
>> Anyone who is repackaging Xen (distros, XCP, ...) would prefer the
>> variables to say the same even if the names aren't ideal.
>
> As long as we keep the old names as well is there harm in adding new,
> more descriptive names as well? i.e.
> =C2=A0 =C2=A0 =C2=A0 =C2=A0$(PREPEND_LIB) $(EXTRA_LIB) ... $(APPEND_LIB)
> ?
>
> or even PREPEND_LIB ?=3D $(EXTRA_LIB) and "$(PREPEND_LIB) ...
> $(APPEND_LIB)". That way things don't break today and when a packager
> finds they actually need the distinction they can switch.

I've just sent the new patch, it's called

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

Please take a look at that one if possible. I've left EXTRA_LIB and
EXTRA_INCLUDES as they where, so the new patch should be harmless for
people still using those, while adding the new PREPEND_ and APPEND_
variables.

Thanks, Roger.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 05:56:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 05:56:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9DH-0003CY-1S; Tue, 18 Oct 2011 05:56:11 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CC-0002x3-PQ
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:05 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32203 invoked from network); 18 Oct 2011 12:55:01 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:01 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243159"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:54:59 -0400
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, 18 Oct 2011 08:54:58 -0400
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
	p9ICsvB7015846;	Tue, 18 Oct 2011 05:54:58 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:54:55 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 00 of 27 v3] libxl: rationalise libxl_device_*
	APIs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 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.

This is broadly speaking the changes I discussed in [0]

One of the early patches adds a big comment describing the API. It
would be useful if this got a particularly close eye with a view to
supporting it long term -- especially from actual and potential
consumers of the API (of who I've CC a few who sprang to mind).

Along the way I filed some rough edges of the internal implementation
of this stuff but my primary concern is to make the public facing API
one that we can commit to keeping stable.

One aspect which is missing is the ability to do asynchronous
add/remove etc. This requires the overhaul of the libxl event system
which Ian Jackson described at [1]. I did bear this in mind so
hopefully I have provided the majority of the necessary moving parts
internally.

Changes since last time:
  - Correct handling of result of libxl__device_remove wait
    vs. not-wait. We need to indicate to the caller if they need to
    wait or not.
  - Decide it's definitely correct to not trust the frontend dir.

Changes since the time before that:
  - Rename type "destructor" functions to "dispose" freeing up the
    verb "destroy" to mean, uh, destroying things, such as a forcible
    remove of a device or destroying a domain.
  - Use this new found freedom to s/force_remove/destroy/.
  - Added a flags parameter to libxl_ctx_alloc. Might as well have one
    for future flexibility
  - Updated language bindings to use new scheme.

[0] http://www.gossamer-threads.com/lists/xen/devel/204668
[1] http://www.gossamer-threads.com/lists/xen/devel/212580
 &  http://www.gossamer-threads.com/lists/xen/devel/212578
 &  http://www.gossamer-threads.com/lists/xen/devel/212579
 &  http://www.gossamer-threads.com/lists/xen/devel/212581

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 05:57:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 05:57:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9Eo-0003cF-Er; Tue, 18 Oct 2011 05:57:46 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CD-0002xP-2Y
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:05 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318942500!68111!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6201 invoked from network); 18 Oct 2011 12:55:01 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:01 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309434"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:00 -0400
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, 18 Oct 2011 08:54:59 -0400
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
	p9ICsvB8015846;	Tue, 18 Oct 2011 05:54:59 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: e03520648d2c91210d59a90f497b356fd72eb36f
Message-ID: <e03520648d2c91210d59.1318942496@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:54:56 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 01 of 27 v3] libxl: add missing "break;
	" to do_pci_remove
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318930552 -3600
# Node ID e03520648d2c91210d59a90f497b356fd72eb36f
# Parent  955a6c07dc5e9c55316d1678b2b7cc4313f4fd57
libxl: add missing "break;" to do_pci_remove

Otherwise we erroneously fall through the LIBXL_DOMAIN_TYPE_PV case into the
"default: abort()".

(I'm sure we fixed this once already...)

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 955a6c07dc5e -r e03520648d2c tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Tue Oct 18 10:33:32 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Tue Oct 18 10:35:52 2011 +0100
@@ -930,6 +930,7 @@ skip1:
             }
         }
         fclose(f);
+        break;
     }
     default:
         abort();

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:01:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:01:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9IO-000435-OI; Tue, 18 Oct 2011 06:01:28 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CD-0002xQ-Ci
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:06 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32275 invoked from network); 18 Oct 2011 12:55:02 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:02 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243168"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:01 -0400
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, 18 Oct 2011 08:55:00 -0400
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
	p9ICsvB9015846;	Tue, 18 Oct 2011 05:55:00 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 450a1d48932c74e8ca24239ebe88c3f71f1b64e5
Message-ID: <450a1d48932c74e8ca24.1318942497@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:54:57 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 02 of 27 v3] libxl: remove generated file
	testidl.c on 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

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318930555 -3600
# Node ID 450a1d48932c74e8ca24239ebe88c3f71f1b64e5
# Parent  e03520648d2c91210d59a90f497b356fd72eb36f
libxl: remove generated file testidl.c on clean

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r e03520648d2c -r 450a1d48932c tools/libxl/Makefile
--- a/tools/libxl/Makefile	Tue Oct 18 10:35:52 2011 +0100
+++ b/tools/libxl/Makefile	Tue Oct 18 10:35:55 2011 +0100
@@ -150,6 +150,7 @@ install: all
 clean:
 	$(RM) -f _*.h *.o *.so* *.a $(CLIENTS) $(DEPS)
 	$(RM) -f _*.c *.pyc _libxl_paths.*.tmp
+	$(RM) -f testidl.c.new testidl.c
 #	$(RM) -f $(AUTOSRCS) $(AUTOINCS)
 
 distclean: clean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:04:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06: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 1RG9Ks-0004Rm-ML; Tue, 18 Oct 2011 06:04:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CE-0002xS-Ck
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:07 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318942500!68111!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6226 invoked from network); 18 Oct 2011 12:55:02 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:02 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309439"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:02 -0400
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, 18 Oct 2011 08:55:01 -0400
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
	p9ICsvBA015846;	Tue, 18 Oct 2011 05:55:01 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: d71e77d3fbf19c4c986c519f4805dee113f5f622
Message-ID: <d71e77d3fbf19c4c986c.1318942498@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:54:58 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 03 of 27 v3] libxl: idl: use "dispose" rather
 than "destroy" for function to free IDL types
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318930555 -3600
# Node ID d71e77d3fbf19c4c986c519f4805dee113f5f622
# Parent  450a1d48932c74e8ca24239ebe88c3f71f1b64e5
libxl: idl: use "dispose" rather than "destroy" for function to free IDL types

Destroy is an overloaded term which would commonly like to be used for actual
destructive operations, such as destroying a domain etc.

Dispose isn't a great term but it does the job.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/gentest.py
--- a/tools/libxl/gentest.py	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/gentest.py	Tue Oct 18 10:35:55 2011 +0100
@@ -256,8 +256,8 @@ int main(int argc, char **argv)
         f.write("    printf(\"%%s: %%s\\n\", \"%s\", s);\n" % ty.typename)
         f.write("    if (s == NULL) abort();\n")
         f.write("    free(s);\n")
-        if ty.destructor_fn is not None:
-            f.write("    %s(&%s_val);\n" % (ty.destructor_fn, ty.typename))
+        if ty.dispose_fn is not None:
+            f.write("    %s(&%s_val);\n" % (ty.dispose_fn, ty.typename))
         f.write("\n")
 
     f.write("    printf(\"Testing Enumerations\\n\");\n")
diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/gentypes.py
--- a/tools/libxl/gentypes.py	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/gentypes.py	Tue Oct 18 10:35:55 2011 +0100
@@ -74,7 +74,7 @@ def libxl_C_type_define(ty, indent = "")
         raise NotImplementedError("%s" % type(ty))
     return s.replace("\n", "\n%s" % indent)
 
-def libxl_C_type_destroy(ty, v, indent = "    ", parent = None):
+def libxl_C_type_dispose(ty, v, indent = "    ", parent = None):
     s = ""
     if isinstance(ty, libxltypes.KeyedUnion):
         if parent is None:
@@ -83,16 +83,16 @@ def libxl_C_type_destroy(ty, v, indent =
         for f in ty.fields:
             (nparent,fexpr) = ty.member(v, f, parent is None)
             s += "case %s:\n" % f.enumname
-            s += libxl_C_type_destroy(f.type, fexpr, indent + "    ", nparent)
+            s += libxl_C_type_dispose(f.type, fexpr, indent + "    ", nparent)
             s += "    break;\n"
         s += "}\n"
-    elif isinstance(ty, libxltypes.Struct) and (parent is None or ty.destructor_fn is None):
+    elif isinstance(ty, libxltypes.Struct) and (parent is None or ty.dispose_fn is None):
         for f in [f for f in ty.fields if not f.const]:
             (nparent,fexpr) = ty.member(v, f, parent is None)
-            s += libxl_C_type_destroy(f.type, fexpr, "", nparent)
+            s += libxl_C_type_dispose(f.type, fexpr, "", nparent)
     else:
-        if ty.destructor_fn is not None:
-            s += "%s(%s);\n" % (ty.destructor_fn, ty.pass_arg(v, parent is None))
+        if ty.dispose_fn is not None:
+            s += "%s(%s);\n" % (ty.dispose_fn, ty.pass_arg(v, parent is None))
 
     if s != "":
         s = indent + s
@@ -217,8 +217,8 @@ if __name__ == '__main__':
 
     for ty in types:
         f.write(libxl_C_type_define(ty) + ";\n")
-        if ty.destructor_fn is not None:
-            f.write("void %s(%s);\n" % (ty.destructor_fn, ty.make_arg("p")))
+        if ty.dispose_fn is not None:
+            f.write("void %s(%s);\n" % (ty.dispose_fn, ty.make_arg("p")))
         if ty.json_fn is not None:
             f.write("char *%s_to_json(libxl_ctx *ctx, %s);\n" % (ty.typename, ty.make_arg("p")))
         if isinstance(ty, libxltypes.Enumeration):
@@ -277,10 +277,10 @@ if __name__ == '__main__':
 
 """ % " ".join(sys.argv))
 
-    for ty in [t for t in types if t.destructor_fn is not None and t.autogenerate_destructor]:
-        f.write("void %s(%s)\n" % (ty.destructor_fn, ty.make_arg("p")))
+    for ty in [t for t in types if t.dispose_fn is not None and t.autogenerate_dispose_fn]:
+        f.write("void %s(%s)\n" % (ty.dispose_fn, ty.make_arg("p")))
         f.write("{\n")
-        f.write(libxl_C_type_destroy(ty, "p"))
+        f.write(libxl_C_type_dispose(ty, "p"))
         f.write("    memset(p, LIBXL_DTOR_POISON, sizeof(*p));\n")
         f.write("}\n")
         f.write("\n")
diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/idl.txt
--- a/tools/libxl/idl.txt	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/idl.txt	Tue Oct 18 10:35:55 2011 +0100
@@ -39,14 +39,14 @@ Type.passby: (default: libxltypes.PASS_B
    libxltypes.PASS_BY_VALUE
    libxltypes.PASS_BY_REFERENCE
 
-Type.destructor_fn: (default: typename + "_destroy" or None if type == None)
+Type.dispose_fn: (default: typename + "_dispose" or None if type == None)
 
  The name of the C function which will free all dynamically allocated
  memory contained within this type (but not the type itself).
 
-Type.autogenerate_destructor: (default: True)
+Type.autogenerate_dispose_fn: (default: True)
 
- Indicates if the above named Type.destructor_fn should be
+ Indicates if the above named Type.dispose_fn should be
  autogenerated.
 
 Type.json_fn: (default: typename + "_gen_json" or None if type == None)
diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 10:35:55 2011 +0100
@@ -87,12 +87,12 @@ int libxl_ctx_free(libxl_ctx *ctx)
 {
     if (!ctx) return 0;
     if (ctx->xch) xc_interface_close(ctx->xch);
-    libxl_version_info_destroy(&ctx->version_info);
+    libxl_version_info_dispose(&ctx->version_info);
     if (ctx->xsh) xs_daemon_close(ctx->xsh);
     return 0;
 }
 
-void libxl_string_list_destroy(libxl_string_list *psl)
+void libxl_string_list_dispose(libxl_string_list *psl)
 {
     int i;
     libxl_string_list sl = *psl;
@@ -105,7 +105,7 @@ void libxl_string_list_destroy(libxl_str
     free(sl);
 }
 
-void libxl_key_value_list_destroy(libxl_key_value_list *pkvl)
+void libxl_key_value_list_dispose(libxl_key_value_list *pkvl)
 {
     int i;
     libxl_key_value_list kvl = *pkvl;
@@ -767,7 +767,7 @@ int libxl_domain_destroy(libxl_ctx *ctx,
         libxl__qmp_cleanup(&gc, domid);
     }
     if (libxl__devices_destroy(&gc, domid, force) < 0)
-        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_destroy_devices failed for %d", domid);
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_devices_dispose failed for %d", domid);
 
     vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path));
     if (vm_path)
@@ -1641,7 +1641,7 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u
     }
 out:
     for (i = 0; i < num; i++)
-        libxl_device_disk_destroy(&disks[i]);
+        libxl_device_disk_dispose(&disks[i]);
     free(disks);
     return ret;
 }
@@ -2241,7 +2241,7 @@ fail:
     xc_hypercall_buffer_free(ctx->xch, coremap);
     xc_hypercall_buffer_free(ctx->xch, socketmap);
     xc_hypercall_buffer_free(ctx->xch, nodemap);
-    libxl_topologyinfo_destroy(info);
+    libxl_topologyinfo_dispose(info);
     return ERROR_FAIL;
 }
 
@@ -2722,7 +2722,7 @@ int libxl_tmem_freeable(libxl_ctx *ctx)
     return rc;
 }
 
-void libxl_file_reference_destroy(libxl_file_reference *f)
+void libxl_file_reference_dispose(libxl_file_reference *f)
 {
     libxl__file_reference_unmap(f);
     free(f->path);
@@ -2852,7 +2852,7 @@ int libxl_destroy_cpupool(libxl_ctx *ctx
     rc = 0;
 
 out1:
-    libxl_cpumap_destroy(&cpumap);
+    libxl_cpumap_dispose(&cpumap);
 out:
     xc_cpupool_infofree(ctx->xch, info);
     libxl__free_all(&gc);
@@ -2941,10 +2941,10 @@ int libxl_cpupool_cpuadd_node(libxl_ctx 
         }
     }
 
-    libxl_topologyinfo_destroy(&topology);
+    libxl_topologyinfo_dispose(&topology);
 
 out:
-    libxl_cpumap_destroy(&freemap);
+    libxl_cpumap_dispose(&freemap);
     return rc;
 }
 
@@ -2993,11 +2993,11 @@ int libxl_cpupool_cpuremove_node(libxl_c
         }
     }
 
-    libxl_topologyinfo_destroy(&topology);
+    libxl_topologyinfo_dispose(&topology);
 
 out:
     for (p = 0; p < n_pools; p++) {
-        libxl_cpupoolinfo_destroy(poolinfo + p);
+        libxl_cpupoolinfo_dispose(poolinfo + p);
     }
 
     return ret;
diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxl.h	Tue Oct 18 10:35:55 2011 +0100
@@ -144,10 +144,10 @@ typedef uint8_t libxl_mac[6];
 #define LIBXL_MAC_BYTES(mac) mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]
 
 typedef char **libxl_string_list;
-void libxl_string_list_destroy(libxl_string_list *sl);
+void libxl_string_list_dispose(libxl_string_list *sl);
 
 typedef char **libxl_key_value_list;
-void libxl_key_value_list_destroy(libxl_key_value_list *kvl);
+void libxl_key_value_list_dispose(libxl_key_value_list *kvl);
 
 typedef uint32_t libxl_hwcap[8];
 
@@ -155,14 +155,14 @@ typedef struct {
     uint32_t size;          /* number of bytes in map */
     uint8_t *map;
 } libxl_cpumap;
-void libxl_cpumap_destroy(libxl_cpumap *map);
+void libxl_cpumap_dispose(libxl_cpumap *map);
 
 typedef struct {
     uint32_t entries;
     uint32_t *array;
 } libxl_cpuarray;
 #define LIBXL_CPUARRAY_INVALID_ENTRY  ~0
-void libxl_cpuarray_destroy(libxl_cpuarray *array);
+void libxl_cpuarray_dispose(libxl_cpuarray *array);
 
 typedef struct {
     /*
@@ -174,7 +174,7 @@ typedef struct {
     void * data;
     size_t size;
 } libxl_file_reference;
-void libxl_file_reference_destroy(libxl_file_reference *p);
+void libxl_file_reference_dispose(libxl_file_reference *p);
 
 /* libxl_cpuid_policy_list is a dynamic array storing CPUID policies
  * for multiple leafs. It is terminated with an entry holding
@@ -182,7 +182,7 @@ void libxl_file_reference_destroy(libxl_
  */
 typedef struct libxl__cpuid_policy libxl_cpuid_policy;
 typedef libxl_cpuid_policy * libxl_cpuid_policy_list;
-void libxl_cpuid_destroy(libxl_cpuid_policy_list *cpuid_list);
+void libxl_cpuid_dispose(libxl_cpuid_policy_list *cpuid_list);
 
 #define LIBXL_PCI_FUNC_ALL (~0U)
 
@@ -261,7 +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);
-void libxl_domain_config_destroy(libxl_domain_config *d_config);
+void libxl_domain_config_dispose(libxl_domain_config *d_config);
 int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info,
                           uint32_t domid, int fd);
 int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid);
diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl_cpuid.c
--- a/tools/libxl/libxl_cpuid.c	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxl_cpuid.c	Tue Oct 18 10:35:55 2011 +0100
@@ -16,7 +16,7 @@
 #include "libxl_osdeps.h"
 #include "libxl_internal.h"
 
-void libxl_cpuid_destroy(libxl_cpuid_policy_list *p_cpuid_list)
+void libxl_cpuid_dispose(libxl_cpuid_policy_list *p_cpuid_list)
 {
     int i, j;
     libxl_cpuid_policy_list cpuid_list = *p_cpuid_list;
diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxl_create.c	Tue Oct 18 10:35:55 2011 +0100
@@ -31,33 +31,33 @@
 #include "libxl_internal.h"
 #include "flexarray.h"
 
-void libxl_domain_config_destroy(libxl_domain_config *d_config)
+void libxl_domain_config_dispose(libxl_domain_config *d_config)
 {
     int i;
 
     for (i=0; i<d_config->num_disks; i++)
-        libxl_device_disk_destroy(&d_config->disks[i]);
+        libxl_device_disk_dispose(&d_config->disks[i]);
     free(d_config->disks);
 
     for (i=0; i<d_config->num_vifs; i++)
-        libxl_device_nic_destroy(&d_config->vifs[i]);
+        libxl_device_nic_dispose(&d_config->vifs[i]);
     free(d_config->vifs);
 
     for (i=0; i<d_config->num_pcidevs; i++)
-        libxl_device_pci_destroy(&d_config->pcidevs[i]);
+        libxl_device_pci_dispose(&d_config->pcidevs[i]);
     free(d_config->pcidevs);
 
     for (i=0; i<d_config->num_vfbs; i++)
-        libxl_device_vfb_destroy(&d_config->vfbs[i]);
+        libxl_device_vfb_dispose(&d_config->vfbs[i]);
     free(d_config->vfbs);
 
     for (i=0; i<d_config->num_vkbs; i++)
-        libxl_device_vkb_destroy(&d_config->vkbs[i]);
+        libxl_device_vkb_dispose(&d_config->vkbs[i]);
     free(d_config->vkbs);
 
-    libxl_domain_create_info_destroy(&d_config->c_info);
-    libxl_domain_build_info_destroy(&d_config->b_info);
-    libxl_device_model_info_destroy(&d_config->dm_info);
+    libxl_domain_create_info_dispose(&d_config->c_info);
+    libxl_domain_build_info_dispose(&d_config->b_info);
+    libxl_device_model_info_dispose(&d_config->dm_info);
 }
 
 int libxl_init_create_info(libxl_ctx *ctx, libxl_domain_create_info *c_info)
@@ -512,7 +512,7 @@ static int do_domain_create(libxl__gc *g
         if ( ret )
             goto error_out;
         libxl__device_console_add(gc, domid, &console, &state);
-        libxl_device_console_destroy(&console);
+        libxl_device_console_dispose(&console);
 
         dm_info->domid = domid;
         ret = libxl__create_device_model(gc, dm_info,
@@ -549,7 +549,7 @@ static int do_domain_create(libxl__gc *g
              console.consback = LIBXL_CONSOLE_BACKEND_IOEMU;
 
         libxl__device_console_add(gc, domid, &console, &state);
-        libxl_device_console_destroy(&console);
+        libxl_device_console_dispose(&console);
 
         if (need_qemu) {
             /* only copy those useful configs */
diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxl_types.idl	Tue Oct 18 10:35:55 2011 +0100
@@ -8,13 +8,13 @@ namespace("libxl_")
 libxl_domid = Builtin("domid", json_fn = "yajl_gen_integer", autogenerate_json = False)
 libxl_uuid = Builtin("uuid", passby=PASS_BY_REFERENCE)
 libxl_mac = Builtin("mac", passby=PASS_BY_REFERENCE)
-libxl_cpumap = Builtin("cpumap", destructor_fn="libxl_cpumap_destroy", passby=PASS_BY_REFERENCE)
-libxl_cpuarray = Builtin("cpuarray", destructor_fn="libxl_cpuarray_destroy", passby=PASS_BY_REFERENCE)
-libxl_cpuid_policy_list = Builtin("cpuid_policy_list", destructor_fn="libxl_cpuid_destroy", passby=PASS_BY_REFERENCE)
+libxl_cpumap = Builtin("cpumap", dispose_fn="libxl_cpumap_dispose", passby=PASS_BY_REFERENCE)
+libxl_cpuarray = Builtin("cpuarray", dispose_fn="libxl_cpuarray_dispose", passby=PASS_BY_REFERENCE)
+libxl_cpuid_policy_list = Builtin("cpuid_policy_list", dispose_fn="libxl_cpuid_dispose", passby=PASS_BY_REFERENCE)
 
-libxl_string_list = Builtin("string_list", destructor_fn="libxl_string_list_destroy", passby=PASS_BY_REFERENCE)
-libxl_key_value_list = Builtin("key_value_list", destructor_fn="libxl_key_value_list_destroy", passby=PASS_BY_REFERENCE)
-libxl_file_reference = Builtin("file_reference", destructor_fn="libxl_file_reference_destroy", passby=PASS_BY_REFERENCE)
+libxl_string_list = Builtin("string_list", dispose_fn="libxl_string_list_dispose", passby=PASS_BY_REFERENCE)
+libxl_key_value_list = Builtin("key_value_list", dispose_fn="libxl_key_value_list_dispose", passby=PASS_BY_REFERENCE)
+libxl_file_reference = Builtin("file_reference", dispose_fn="libxl_file_reference_dispose", passby=PASS_BY_REFERENCE)
 
 libxl_hwcap = Builtin("hwcap", passby=PASS_BY_REFERENCE)
 
@@ -109,7 +109,7 @@ SHUTDOWN_* constant."""),
     ("cpu_time",    uint64),
     ("vcpu_max_id", uint32),
     ("vcpu_online", uint32),
-    ], destructor_fn=None)
+    ], dispose_fn=None)
 
 libxl_cpupoolinfo = Struct("cpupoolinfo", [
     ("poolid",      uint32),
@@ -121,7 +121,7 @@ libxl_cpupoolinfo = Struct("cpupoolinfo"
 libxl_vminfo = Struct("vminfo", [
     ("uuid", libxl_uuid),
     ("domid", libxl_domid),
-    ], destructor_fn=None)
+    ], dispose_fn=None)
 
 libxl_version_info = Struct("version_info", [
     ("xen_version_major", integer),
@@ -362,7 +362,7 @@ libxl_physinfo = Struct("physinfo", [
     ("nr_nodes", uint32),
     ("hw_cap", libxl_hwcap),
     ("phys_cap", uint32),
-    ], destructor_fn=None, dir=DIR_OUT)
+    ], dispose_fn=None, dir=DIR_OUT)
 
 libxl_topologyinfo = Struct("topologyinfo", [
     ("coremap", libxl_cpuarray,   False, "cpu to core map"),
@@ -373,4 +373,4 @@ libxl_topologyinfo = Struct("topologyinf
 libxl_sched_credit = Struct("sched_credit", [
     ("weight", integer),
     ("cap", integer),
-    ], destructor_fn=None)
+    ], dispose_fn=None)
diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Tue Oct 18 10:35:55 2011 +0100
@@ -157,7 +157,7 @@ int libxl_name_to_cpupoolid(libxl_ctx *c
             }
             free(poolname);
         }
-        libxl_cpupoolinfo_destroy(poolinfo + i);
+        libxl_cpupoolinfo_dispose(poolinfo + i);
     }
     free(poolinfo);
     return ret;
@@ -478,7 +478,7 @@ int libxl_mac_to_device_nic(libxl_ctx *c
     }
 
     for (i=0; i<nb; i++)
-        libxl_nicinfo_destroy(&nics[i]);
+        libxl_nicinfo_dispose(&nics[i]);
     free(nics);
     return rc;
 }
@@ -579,7 +579,7 @@ int libxl_cpumap_alloc(libxl_ctx *ctx, l
     return 0;
 }
 
-void libxl_cpumap_destroy(libxl_cpumap *map)
+void libxl_cpumap_dispose(libxl_cpumap *map)
 {
     free(map->map);
 }
@@ -624,7 +624,7 @@ int libxl_cpuarray_alloc(libxl_ctx *ctx,
     return 0;
 }
 
-void libxl_cpuarray_destroy(libxl_cpuarray *array)
+void libxl_cpuarray_dispose(libxl_cpuarray *array)
 {
     free(array->array);
 }
diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/libxltypes.py
--- a/tools/libxl/libxltypes.py	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxltypes.py	Tue Oct 18 10:35:55 2011 +0100
@@ -44,11 +44,11 @@ class Type(object):
             self.rawname = typename
 
         if self.typename is not None:
-            self.destructor_fn = kwargs.setdefault('destructor_fn', self.typename + "_destroy")
+            self.dispose_fn = kwargs.setdefault('dispose_fn', self.typename + "_dispose")
         else:
-            self.destructor_fn = kwargs.setdefault('destructor_fn', None)
+            self.dispose_fn = kwargs.setdefault('dispose_fn', None)
 
-        self.autogenerate_destructor = kwargs.setdefault('autogenerate_destructor', True)
+        self.autogenerate_dispose_fn = kwargs.setdefault('autogenerate_dispose_fn', True)
 
         if self.typename is not None:
             self.json_fn = kwargs.setdefault('json_fn', self.typename + "_gen_json")
@@ -88,15 +88,15 @@ class Type(object):
 class Builtin(Type):
     """Builtin type"""
     def __init__(self, typename, **kwargs):
-        kwargs.setdefault('destructor_fn', None)
-        kwargs.setdefault('autogenerate_destructor', False)
+        kwargs.setdefault('dispose_fn', None)
+        kwargs.setdefault('autogenerate_dispose_fn', False)
         kwargs.setdefault('autogenerate_json', False)
         Type.__init__(self, typename, **kwargs)
 
 class Number(Builtin):
     def __init__(self, ctype, **kwargs):
         kwargs.setdefault('namespace', None)
-        kwargs.setdefault('destructor_fn', None)
+        kwargs.setdefault('dispose_fn', None)
         kwargs.setdefault('signed', False)
         kwargs.setdefault('json_fn', "yajl_gen_integer")
         self.signed = kwargs['signed']
@@ -105,7 +105,7 @@ class Number(Builtin):
 class UInt(Number):
     def __init__(self, w, **kwargs):
         kwargs.setdefault('namespace', None)
-        kwargs.setdefault('destructor_fn', None)
+        kwargs.setdefault('dispose_fn', None)
         Number.__init__(self, "uint%d_t" % w, **kwargs)
 
         self.width = w
@@ -122,7 +122,7 @@ class EnumerationValue(object):
 
 class Enumeration(Type):
     def __init__(self, typename, values, **kwargs):
-        kwargs.setdefault('destructor_fn', None)
+        kwargs.setdefault('dispose_fn', None)
         Type.__init__(self, typename, **kwargs)
 
         self.values = []
@@ -205,7 +205,7 @@ class Union(Aggregate):
         # union therefore any specific instance of this class will
         # need to provide an explicit destructor function.
         kwargs.setdefault('passby', PASS_BY_REFERENCE)
-        kwargs.setdefault('destructor_fn', None)
+        kwargs.setdefault('dispose_fn', None)
         Aggregate.__init__(self, "union", name, fields, **kwargs)
 
 class KeyedUnion(Aggregate):
@@ -244,7 +244,7 @@ uint16 = UInt(16)
 uint32 = UInt(32)
 uint64 = UInt(64)
 
-string = Builtin("char *", namespace = None, destructor_fn = "free",
+string = Builtin("char *", namespace = None, dispose_fn = "free",
                  json_fn = "libxl__string_gen_json",
                  autogenerate_json = False)
 
diff -r 450a1d48932c -r d71e77d3fbf1 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Tue Oct 18 10:35:55 2011 +0100
@@ -1685,7 +1685,7 @@ start:
             case LIBXL_EVENT_TYPE_DISK_EJECT:
                 if (libxl_event_get_disk_eject_info(ctx, domid, &event, &disk)) {
                     libxl_cdrom_insert(ctx, domid, &disk);
-                    libxl_device_disk_destroy(&disk);
+                    libxl_device_disk_dispose(&disk);
                 }
                 break;
         }
@@ -1701,7 +1701,7 @@ out:
     if (logfile != 2)
         close(logfile);
 
-    libxl_domain_config_destroy(&d_config);
+    libxl_domain_config_dispose(&d_config);
 
     free(config_data);
 
@@ -2047,7 +2047,7 @@ static void pcilist(const char *dom)
         printf("%02x.%01x %04x:%02x:%02x.%01x\n",
                (pcidevs[i].vdevfn >> 3) & 0x1f, pcidevs[i].vdevfn & 0x7,
                pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func);
-        libxl_device_pci_destroy(&pcidevs[i]);
+        libxl_device_pci_dispose(&pcidevs[i]);
     }
     free(pcidevs);
 }
@@ -2078,7 +2078,7 @@ static void pcidetach(const char *dom, c
         exit(2);
     }
     libxl_device_pci_remove(ctx, domid, &pcidev, force);
-    libxl_device_pci_destroy(&pcidev);
+    libxl_device_pci_dispose(&pcidev);
 }
 
 int main_pcidetach(int argc, char **argv)
@@ -2115,7 +2115,7 @@ static void pciattach(const char *dom, c
         exit(2);
     }
     libxl_device_pci_add(ctx, domid, &pcidev);
-    libxl_device_pci_destroy(&pcidev);
+    libxl_device_pci_dispose(&pcidev);
 }
 
 int main_pciattach(int argc, char **argv)
@@ -2231,7 +2231,7 @@ static void list_domains_details(const l
         memset(&d_config, 0x00, sizeof(d_config));
         parse_config_data(config_file, (char *)data, len, &d_config, &dm_info);
         printf_info(info[i].domid, &d_config, &dm_info);
-        libxl_domain_config_destroy(&d_config);
+        libxl_domain_config_dispose(&d_config);
         free(data);
         free(config_file);
     }
@@ -3323,7 +3323,7 @@ static void print_domain_vcpuinfo(uint32
 
     for (i = 0; i < nb_vcpu; i++) {
         print_vcpuinfo(domid, &vcpuinfo[i], nr_cpus);
-        libxl_vcpuinfo_destroy(&vcpuinfo[i]);
+        libxl_vcpuinfo_dispose(&vcpuinfo[i]);
     }
 
     free(vcpuinfo);
@@ -3445,7 +3445,7 @@ static void vcpupin(const char *d, const
         }
     }
   vcpupin_out1:
-    libxl_cpumap_destroy(&cpumap);
+    libxl_cpumap_dispose(&cpumap);
   vcpupin_out:
     ;
 }
@@ -3485,7 +3485,7 @@ static void vcpuset(const char *d, const
     if (libxl_set_vcpuonline(ctx, domid, &cpumap) < 0)
         fprintf(stderr, "libxl_set_vcpuonline failed domid=%d max_vcpus=%d\n", domid, max_vcpus);
 
-    libxl_cpumap_destroy(&cpumap);
+    libxl_cpumap_dispose(&cpumap);
 }
 
 int main_vcpuset(int argc, char **argv)
@@ -3609,7 +3609,7 @@ static void output_topologyinfo(void)
 
     printf("numa_info              : none\n");
 
-    libxl_topologyinfo_destroy(&info);
+    libxl_topologyinfo_dispose(&info);
 
     return;
 }
@@ -4018,7 +4018,7 @@ int main_networkattach(int argc, char **
         fprintf(stderr, "libxl_device_nic_add failed.\n");
         return 1;
     }
-    libxl_device_nic_destroy(&nic);
+    libxl_device_nic_dispose(&nic);
     return 0;
 }
 
@@ -4051,7 +4051,7 @@ int main_networklist(int argc, char **ar
             printf("%6d %5d %6d %5d/%-11d %-30s\n",
                    nics[i].devid, nics[i].state, nics[i].evtch,
                    nics[i].rref_tx, nics[i].rref_rx, nics[i].backend);
-            libxl_nicinfo_destroy(&nics[i]);
+            libxl_nicinfo_dispose(&nics[i]);
         }
         free(nics);
     }
@@ -4086,7 +4086,7 @@ int main_networkdetach(int argc, char **
         fprintf(stderr, "libxl_device_nic_del failed.\n");
         return 1;
     }
-    libxl_device_nic_destroy(&nic);
+    libxl_device_nic_dispose(&nic);
     return 0;
 }
 
@@ -4152,9 +4152,9 @@ int main_blocklist(int argc, char **argv
                 printf("%-5d %-3d %-6d %-5d %-6d %-8d %-30s\n",
                        diskinfo.devid, diskinfo.backend_id, diskinfo.frontend_id,
                        diskinfo.state, diskinfo.evtch, diskinfo.rref, diskinfo.backend);
-                libxl_diskinfo_destroy(&diskinfo);
+                libxl_diskinfo_dispose(&diskinfo);
             }
-            libxl_device_disk_destroy(&disks[i]);
+            libxl_device_disk_dispose(&disks[i]);
         }
         free(disks);
     }
@@ -4791,7 +4791,7 @@ int main_cpupoolcreate(int argc, char **
             n_nodes++;
         }
 
-        libxl_topologyinfo_destroy(&topology);
+        libxl_topologyinfo_dispose(&topology);
 
         if (n_cpus == 0) {
             fprintf(stderr, "no free cpu found\n");
@@ -4931,7 +4931,7 @@ int main_cpupoollist(int argc, char **ar
                 printf("\n");
             }
         }
-        libxl_cpupoolinfo_destroy(poolinfo + p);
+        libxl_cpupoolinfo_dispose(poolinfo + p);
     }
 
     return ret;
@@ -5132,7 +5132,7 @@ int main_cpupoolnumasplit(int argc, char
     poolid = poolinfo[0].poolid;
     schedid = poolinfo[0].sched_id;
     for (p = 0; p < n_pools; p++) {
-        libxl_cpupoolinfo_destroy(poolinfo + p);
+        libxl_cpupoolinfo_dispose(poolinfo + p);
     }
     if (n_pools > 1) {
         fprintf(stderr, "splitting not possible, already cpupools in use\n");
@@ -5146,7 +5146,7 @@ int main_cpupoolnumasplit(int argc, char
 
     if (libxl_cpumap_alloc(ctx, &cpumap)) {
         fprintf(stderr, "Failed to allocate cpumap\n");
-        libxl_topologyinfo_destroy(&topology);
+        libxl_topologyinfo_dispose(&topology);
         return -ERROR_FAIL;
     }
 
@@ -5229,8 +5229,8 @@ int main_cpupoolnumasplit(int argc, char
     }
 
 out:
-    libxl_topologyinfo_destroy(&topology);
-    libxl_cpumap_destroy(&cpumap);
+    libxl_topologyinfo_dispose(&topology);
+    libxl_cpumap_dispose(&cpumap);
 
     return ret;
 }
diff -r 450a1d48932c -r d71e77d3fbf1 tools/python/genwrap.py
--- a/tools/python/genwrap.py	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/python/genwrap.py	Tue Oct 18 10:35:55 2011 +0100
@@ -100,8 +100,8 @@ def py_attrib_set(ty, f):
 
 def py_object_def(ty):
     l = []
-    if ty.destructor_fn is not None:
-        dtor = '    %s(&self->obj);\n'%ty.destructor_fn
+    if ty.dispose_fn is not None:
+        dtor = '    %s(&self->obj);\n'%ty.dispose_fn
     else:
         dtor = ''
 
diff -r 450a1d48932c -r d71e77d3fbf1 tools/python/xen/lowlevel/xl/xl.c
--- a/tools/python/xen/lowlevel/xl/xl.c	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/python/xen/lowlevel/xl/xl.c	Tue Oct 18 10:35:55 2011 +0100
@@ -246,7 +246,7 @@ int attrib__libxl_hwcap_set(PyObject *v,
 int attrib__libxl_key_value_list_set(PyObject *v, libxl_key_value_list *pptr)
 {
     if ( *pptr ) {
-        libxl_key_value_list_destroy(pptr);
+        libxl_key_value_list_dispose(pptr);
         *pptr = NULL;
     }
     if ( v == Py_None )

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:06:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:06:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9NG-0004re-IY; Tue, 18 Oct 2011 06:06:30 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CF-0002xU-0r
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:07 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318942500!68111!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6285 invoked from network); 18 Oct 2011 12:55:03 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:03 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309442"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:02 -0400
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, 18 Oct 2011 08:55:02 -0400
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
	p9ICsvBB015846;	Tue, 18 Oct 2011 05:55:01 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 97a7eac6e0b3ee4284bfabf8ee548db47e5c8ef3
Message-ID: <97a7eac6e0b3ee4284bf.1318942499@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:54:59 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 04 of 27 v3] libxl: libxl_destroy_cpumap becomes
 libxl_cpumap_destroy
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318930555 -3600
# Node ID 97a7eac6e0b3ee4284bfabf8ee548db47e5c8ef3
# Parent  d71e77d3fbf19c4c986c519f4805dee113f5f622
libxl: libxl_destroy_cpumap becomes libxl_cpumap_destroy

Now that IDL type destructors are no longer libxl_*_destroy we can use the more
common libxl_NOUN_VERB structure here.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r d71e77d3fbf1 -r 97a7eac6e0b3 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 10:35:55 2011 +0100
@@ -2775,7 +2775,7 @@ int libxl_create_cpupool(libxl_ctx *ctx,
             if (rc) {
                 LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc,
                     "Error moving cpu to cpupool");
-                libxl_destroy_cpupool(ctx, *poolid);
+                libxl_cpupool_destroy(ctx, *poolid);
                 libxl__free_all(&gc);
                 return ERROR_FAIL;
             }
@@ -2799,7 +2799,7 @@ int libxl_create_cpupool(libxl_ctx *ctx,
     }
 }
 
-int libxl_destroy_cpupool(libxl_ctx *ctx, uint32_t poolid)
+int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     int rc, i;
diff -r d71e77d3fbf1 -r 97a7eac6e0b3 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxl.h	Tue Oct 18 10:35:55 2011 +0100
@@ -503,7 +503,7 @@ int libxl_get_freecpus(libxl_ctx *ctx, l
 int libxl_create_cpupool(libxl_ctx *ctx, const char *name, int schedid,
                          libxl_cpumap cpumap, libxl_uuid *uuid,
                          uint32_t *poolid);
-int libxl_destroy_cpupool(libxl_ctx *ctx, uint32_t poolid);
+int libxl_cpupool_destroy(libxl_ctx *ctx, uint32_t poolid);
 int libxl_cpupool_rename(libxl_ctx *ctx, const char *name, uint32_t poolid);
 int libxl_cpupool_cpuadd(libxl_ctx *ctx, uint32_t poolid, int cpu);
 int libxl_cpupool_cpuadd_node(libxl_ctx *ctx, uint32_t poolid, int node, int *cpus);
diff -r d71e77d3fbf1 -r 97a7eac6e0b3 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Tue Oct 18 10:35:55 2011 +0100
@@ -4954,7 +4954,7 @@ int main_cpupooldestroy(int argc, char *
         return -ERROR_FAIL;
     }
 
-    return -libxl_destroy_cpupool(ctx, poolid);
+    return -libxl_cpupool_destroy(ctx, poolid);
 }
 
 int main_cpupoolrename(int argc, char **argv)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:09:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:09:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9Pj-0005Gf-V5; Tue, 18 Oct 2011 06:09:04 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CF-0002xW-O6
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:08 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1318942500!68111!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6319 invoked from network); 18 Oct 2011 12:55:04 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309445"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:03 -0400
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, 18 Oct 2011 08:55:03 -0400
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
	p9ICsvBC015846;	Tue, 18 Oct 2011 05:55:02 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 520855af77ed20f228d6747c1fb2a4ed8de831fd
Message-ID: <520855af77ed20f228d6.1318942500@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:00 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 05 of 27 v3] libxl: add a comment describing the
 device interfaces
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318930555 -3600
# Node ID 520855af77ed20f228d6747c1fb2a4ed8de831fd
# Parent  97a7eac6e0b3ee4284bfabf8ee548db47e5c8ef3
libxl: add a comment describing the device interfaces.

Subsequent patches will endevour to make reality match this defined
interface.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 97a7eac6e0b3 -r 520855af77ed tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxl.h	Tue Oct 18 10:35:55 2011 +0100
@@ -379,6 +379,65 @@ libxl_dominfo * libxl_list_domain(libxl_
 libxl_cpupoolinfo * libxl_list_cpupool(libxl_ctx*, int *nb_pool);
 libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm);
 
+/*
+ * Devices
+ * =======
+ *
+ * Each device is represented by a libxl_device_<TYPE> data structure
+ * which is defined via the IDL. In addition some devices have an
+ * additional data type libxl_device_<TYPE>_getinfo which contains
+ * further runtime information about the device.
+ *
+ * A common set of methods are available for each device type. These
+ * are described below.
+ *
+ * Querying
+ * --------
+ *
+ * libxl_device_<type>_list(ctx, domid, nr):
+ *
+ *   Returns an array of libxl_device_<type> length nr representing
+ *   the devices attached to the specified domain.
+ *
+ * libxl_device_<type>_getinfo(ctx, domid, device, info):
+ *
+ *   Initialises info with details of the given device which must be
+ *   attached to the specified domain.
+ *
+ * Creation / Control
+ * ------------------
+ *
+ * libxl_device_<type>_init(ctx, device):
+ *
+ *    Initalises device to a default configuration.
+ *
+ * libxl_device_<type>_add(ctx, domid, device):
+ *
+ *   Adds the given device to the specified domain. This can be called
+ *   while the guest is running (hotplug) or before boot (coldplug).
+ *
+ *   This function only sets up the device but does not wait for the
+ *   domain to connect to the device and therefore cannot block on the
+ *   guest.
+ *
+ * libxl_device_<type>_remove(ctx, domid, device):
+ *
+ *   Removes the given device from the specified domain by performing
+ *   an orderly unplug with guest co-operation. This requires that the
+ *   guest is running.
+ *
+ *   This method is currently synchronous and therefore can block
+ *   while interacting with the guest.
+ *
+ * libxl_device_<type>_destroy(ctx, domid, device):
+ *
+ *   Removes the given device from the specified domain without guest
+ *   co-operation. It is guest specific what affect this will have on
+ *   a running guest.
+ *
+ *   This function does not interact with the guest and therefore
+ *   cannot block on the guest.
+ */
 int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);
 int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, int wait);
 libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:11:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:11:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9SN-0005gK-UB; Tue, 18 Oct 2011 06:11:48 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CG-0002xc-CW
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:08 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32613 invoked from network); 18 Oct 2011 12:55:05 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243180"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:04 -0400
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, 18 Oct 2011 08:55:04 -0400
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
	p9ICsvBD015846;	Tue, 18 Oct 2011 05:55:03 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 83cc6057edeceb873c7ecd694bd2766da367ffea
Message-ID: <83cc6057edeceb873c7e.1318942501@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:01 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 06 of 27 v3] libxl: various fixes to
 libxl_device_disk_list (and internals)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318930555 -3600
# Node ID 83cc6057edeceb873c7ecd694bd2766da367ffea
# Parent  520855af77ed20f228d6747c1fb2a4ed8de831fd
libxl: various fixes to libxl_device_disk_list (and internals)

- handle realloc errors
- remove redundancy of libxl__append_disk_list_of_type return value
  and ndisks paramter.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 520855af77ed -r 83cc6057edec tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 10:35:55 2011 +0100
@@ -1505,11 +1505,11 @@ int libxl_device_vkb_hard_shutdown(libxl
     return ERROR_NI;
 }
 
-static unsigned int libxl__append_disk_list_of_type(libxl__gc *gc,
-                                                    uint32_t domid,
-                                                    const char *type,
-                                                    libxl_device_disk **disks,
-                                                    unsigned int *ndisks)
+static int libxl__append_disk_list_of_type(libxl__gc *gc,
+                                           uint32_t domid,
+                                           const char *type,
+                                           libxl_device_disk **disks,
+                                           int *ndisks)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     char *be_path = NULL;
@@ -1523,11 +1523,16 @@ static unsigned int libxl__append_disk_l
     dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n);
     if (dir) {
         char *removable;
-        *disks = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
+        libxl_device_disk *tmp;
+        tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
+        if (tmp == NULL)
+            return ERROR_NOMEM;
+        *disks = tmp;
         pdisk = *disks + *ndisks;
         *ndisks += n;
         pdisk_end = *disks + *ndisks;
         for (; pdisk < pdisk_end; pdisk++, dir++) {
+            memset(pdisk, 0, sizeof(*pdisk));
             pdisk->backend_domid = 0;
             physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/params", be_path, *dir), &len);
             if (physpath_tmp && strchr(physpath_tmp, ':')) {
@@ -1555,22 +1560,37 @@ static unsigned int libxl__append_disk_l
             pdisk->format = LIBXL_DISK_FORMAT_UNKNOWN;
         }
     }
-
-    return n;
+    return 0;
 }
 
 libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     libxl_device_disk *disks = NULL;
-    unsigned int ndisks = 0;
-
-    *num = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, &ndisks);
-    *num += libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, &ndisks);
-    *num += libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, &ndisks);
+    int rc;
+
+    *num = 0;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num);
+    if (rc) goto out_err;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num);
+    if (rc) goto out_err;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num);
+    if (rc) goto out_err;
 
     libxl__free_all(&gc);
     return disks;
+
+out_err:
+    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list disks");
+    while (disks && *num) {
+        (*num)--;
+        libxl_device_disk_dispose(&disks[*num]);
+    }
+    free(disks);
+    return NULL;
 }
 
 int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:14:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06: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 1RG9V8-0006Bp-Oi; Tue, 18 Oct 2011 06:14:39 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CH-0002xl-5c
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:10 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318942479!53714435!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27329 invoked from network); 18 Oct 2011 12:54:41 -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;
	18 Oct 2011 12:54:41 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309447"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:05 -0400
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, 18 Oct 2011 08:55:04 -0400
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
	p9ICsvBE015846;	Tue, 18 Oct 2011 05:55:04 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0bbe2abadf82cb1bd86e1d37b860bb212255964d
Message-ID: <0bbe2abadf82cb1bd86e.1318942502@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:02 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 07 of 27 v3] libxl: refactor code to construct
 disk from xenstore backend
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318930556 -3600
# Node ID 0bbe2abadf82cb1bd86e1d37b860bb212255964d
# Parent  83cc6057edeceb873c7ecd694bd2766da367ffea
libxl: refactor code to construct disk from xenstore backend

Temporarily retain unsafe behaviour of reading f.e. directory.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 83cc6057edec -r 0bbe2abadf82 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 10:35:55 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 10:35:56 2011 +0100
@@ -1505,24 +1505,69 @@ int libxl_device_vkb_hard_shutdown(libxl
     return ERROR_NI;
 }
 
+static void libxl__device_disk_from_xs_be(libxl__gc *gc,
+                                          const char *be_path,
+                                          libxl_device_disk *disk)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    unsigned int len;
+    char *tmp;
+    const char *fe_path; /* XXX unsafe */
+
+    memset(disk, 0, sizeof(*disk));
+
+    tmp = xs_read(ctx->xsh, XBT_NULL,
+                  libxl__sprintf(gc, "%s/params", be_path), &len);
+    if (tmp && strchr(tmp, ':')) {
+        disk->pdev_path = strdup(strchr(tmp, ':') + 1);
+        free(tmp);
+    } else {
+        disk->pdev_path = tmp;
+    }
+    libxl_string_to_backend(ctx,
+                        libxl__xs_read(gc, XBT_NULL,
+                                       libxl__sprintf(gc, "%s/type", be_path)),
+                        &(disk->backend));
+    disk->vdev = xs_read(ctx->xsh, XBT_NULL,
+                         libxl__sprintf(gc, "%s/dev", be_path), &len);
+    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf
+                         (gc, "%s/removable", be_path));
+
+    if (tmp)
+        disk->removable = atoi(tmp);
+    else
+        disk->removable = 0;
+
+    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", be_path));
+    if (!strcmp(tmp, "w"))
+        disk->readwrite = 1;
+    else
+        disk->readwrite = 0;
+
+    fe_path = libxl__xs_read(gc, XBT_NULL,
+                             libxl__sprintf(gc, "%s/frontend", be_path));
+    tmp = libxl__xs_read(gc, XBT_NULL,
+                         libxl__sprintf(gc, "%s/device-type", fe_path));
+    disk->is_cdrom = !strcmp(tmp, "cdrom");
+
+    disk->format = LIBXL_DISK_FORMAT_UNKNOWN;
+}
+
 static int libxl__append_disk_list_of_type(libxl__gc *gc,
                                            uint32_t domid,
                                            const char *type,
                                            libxl_device_disk **disks,
                                            int *ndisks)
 {
-    libxl_ctx *ctx = libxl__gc_owner(gc);
     char *be_path = NULL;
     char **dir = NULL;
-    unsigned int n = 0, len = 0;
+    unsigned int n = 0;
     libxl_device_disk *pdisk = NULL, *pdisk_end = NULL;
-    char *physpath_tmp = NULL;
 
     be_path = libxl__sprintf(gc, "%s/backend/%s/%d",
                              libxl__xs_get_dompath(gc, 0), type, domid);
     dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n);
     if (dir) {
-        char *removable;
         libxl_device_disk *tmp;
         tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
         if (tmp == NULL)
@@ -1532,32 +1577,10 @@ static int libxl__append_disk_list_of_ty
         *ndisks += n;
         pdisk_end = *disks + *ndisks;
         for (; pdisk < pdisk_end; pdisk++, dir++) {
-            memset(pdisk, 0, sizeof(*pdisk));
+            const char *p;
+            p = libxl__sprintf(gc, "%s/%s", be_path, *dir);
+            libxl__device_disk_from_xs_be(gc, p, pdisk);
             pdisk->backend_domid = 0;
-            physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/params", be_path, *dir), &len);
-            if (physpath_tmp && strchr(physpath_tmp, ':')) {
-                pdisk->pdev_path = strdup(strchr(physpath_tmp, ':') + 1);
-                free(physpath_tmp);
-            } else {
-                pdisk->pdev_path = physpath_tmp;
-            }
-            libxl_string_to_backend(ctx, libxl__xs_read(gc, XBT_NULL,
-                libxl__sprintf(gc, "%s/%s/type", be_path, *dir)),
-                &(pdisk->backend));
-            pdisk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/dev", be_path, *dir), &len);
-            removable = libxl__xs_read(gc, XBT_NULL, libxl__sprintf
-                                       (gc, "%s/%s/removable", be_path, *dir));
-            if (removable)
-                pdisk->removable = atoi(removable);
-            else
-                pdisk->removable = 0;
-            if (!strcmp(libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s/mode", be_path, *dir)), "w"))
-                pdisk->readwrite = 1;
-            else
-                pdisk->readwrite = 0;
-            type = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/device-type", libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s/frontend", be_path, *dir))));
-            pdisk->is_cdrom = !strcmp(type, "cdrom");
-            pdisk->format = LIBXL_DISK_FORMAT_UNKNOWN;
         }
     }
     return 0;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:16:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:16:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9WX-0006a0-Rc; Tue, 18 Oct 2011 06:16:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CI-0002xs-4I
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:11 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!4
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32749 invoked from network); 18 Oct 2011 12:55:06 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243183"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:06 -0400
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, 18 Oct 2011 08:55:05 -0400
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
	p9ICsvBF015846;	Tue, 18 Oct 2011 05:55:05 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 70dc8cd5ba46742671166a603937205746248901
Message-ID: <70dc8cd5ba4674267116.1318942503@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:03 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 08 of 27 v3] libxl: do not read f.e. xenstore
 dir in disk list 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 Ian Campbell <ian.campbell@citrix.com>
# Date 1318941375 -3600
# Node ID 70dc8cd5ba46742671166a603937205746248901
# Parent  0bbe2abadf82cb1bd86e1d37b860bb212255964d
libxl: do not read f.e. xenstore dir in disk list function

Instead store a duplicate of the "device-type" node in the backend dir
and use that instead.

This maintains the invariant that the list function is always "safe".

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 0bbe2abadf82 -r 70dc8cd5ba46 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 10:35:56 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:15 2011 +0100
@@ -1018,6 +1018,8 @@ int libxl_device_disk_add(libxl_ctx *ctx
     flexarray_append(back, libxl__device_disk_string_of_backend(disk->backend));
     flexarray_append(back, "mode");
     flexarray_append(back, disk->readwrite ? "w" : "r");
+    flexarray_append(back, "device-type");
+    flexarray_append(back, disk->is_cdrom ? "cdrom" : "disk");
 
     flexarray_append(front, "backend-id");
     flexarray_append(front, libxl__sprintf(&gc, "%d", disk->backend_domid));
@@ -1512,7 +1514,6 @@ static void libxl__device_disk_from_xs_b
     libxl_ctx *ctx = libxl__gc_owner(gc);
     unsigned int len;
     char *tmp;
-    const char *fe_path; /* XXX unsafe */
 
     memset(disk, 0, sizeof(*disk));
 
@@ -1544,10 +1545,8 @@ static void libxl__device_disk_from_xs_b
     else
         disk->readwrite = 0;
 
-    fe_path = libxl__xs_read(gc, XBT_NULL,
-                             libxl__sprintf(gc, "%s/frontend", be_path));
     tmp = libxl__xs_read(gc, XBT_NULL,
-                         libxl__sprintf(gc, "%s/device-type", fe_path));
+                         libxl__sprintf(gc, "%s/device-type", be_path));
     disk->is_cdrom = !strcmp(tmp, "cdrom");
 
     disk->format = LIBXL_DISK_FORMAT_UNKNOWN;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:17:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:17:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9XY-0006xL-Qa; Tue, 18 Oct 2011 06:17:09 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CJ-0002yT-TT
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:12 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!5
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 437 invoked from network); 18 Oct 2011 12:55:08 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243188"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:08 -0400
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, 18 Oct 2011 08:55:07 -0400
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
	p9ICsvBH015846;	Tue, 18 Oct 2011 05:55:07 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 88488c1c2d316b0ab025c40eeec22c4c3e8e2c3b
Message-ID: <88488c1c2d316b0ab025.1318942505@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:05 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 10 of 27 v3] libxl: reimplement devid->nic in
 terms of from_xs_be 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 Ian Campbell <ian.campbell@citrix.com>
# Date 1318941402 -3600
# Node ID 88488c1c2d316b0ab025c40eeec22c4c3e8e2c3b
# Parent  7799bad1a323ea5299f61cd1361833631e018fac
libxl: reimplement devid->nic in terms of from_xs_be function.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 7799bad1a323 -r 88488c1c2d31 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -1315,7 +1315,7 @@ static void libxl__device_nic_from_xs_be
                   libxl__sprintf(gc, "%s/mac", be_path), &len);
     rc = libxl__parse_mac(tmp, nic->mac);
     if (rc)
-            memset(nic->mac, 0, sizeof(nic->mac));
+        memset(nic->mac, 0, sizeof(nic->mac));
 
     nic->ip = xs_read(ctx->xsh, XBT_NULL,
                       libxl__sprintf(gc, "%s/ip", be_path), &len);
@@ -1332,6 +1332,32 @@ static void libxl__device_nic_from_xs_be
     nic->ifname = NULL; /* XXX Only for TYPE_IOEMU */
 }
 
+int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
+                              const char *devid, libxl_device_nic *nic)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *dompath, *path;
+    int rc = ERROR_FAIL;
+
+    memset(nic, 0, sizeof (libxl_device_nic));
+    dompath = libxl__xs_get_dompath(&gc, domid);
+    if (!dompath)
+        goto out;
+
+    path = libxl__xs_read(&gc, XBT_NULL,
+                          libxl__sprintf(&gc, "%s/device/vif/%s/backend",
+                                         dompath, devid));
+    if (!path)
+        goto out;
+
+    libxl__device_nic_from_xs_be(&gc, path, nic);
+
+    rc = 0;
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
 static int libxl__append_nic_list_of_type(libxl__gc *gc,
                                            uint32_t domid,
                                            const char *type,
diff -r 7799bad1a323 -r 88488c1c2d31 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Tue Oct 18 13:36:42 2011 +0100
@@ -483,41 +483,6 @@ int libxl_mac_to_device_nic(libxl_ctx *c
     return rc;
 }
 
-int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
-                              const char *devid, libxl_device_nic *nic)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *val;
-    char *dompath, *nic_path_fe, *nic_path_be;
-    int rc = ERROR_FAIL;
-
-    memset(nic, 0, sizeof (libxl_device_nic));
-    dompath = libxl__xs_get_dompath(&gc, domid);
-    if (!dompath) {
-        goto out;
-    }
-    nic_path_fe = libxl__sprintf(&gc, "%s/device/vif/%s", dompath, devid);
-    nic_path_be = libxl__xs_read(&gc, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", nic_path_fe));
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nic_path_fe));
-    if ( NULL == val ) {
-        goto out;
-    }
-    nic->backend_domid = strtoul(val, NULL, 10);
-    nic->devid = strtoul(devid, NULL, 10);
-
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", nic_path_fe));
-    rc = libxl__parse_mac(val, nic->mac);
-    if (rc)
-        goto out;
-
-    nic->script = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/script", nic_path_be), NULL);
-    rc = 0;
-out:
-    libxl__free_all(&gc);
-    return rc;
-}
-
 int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
                                const char *devid, libxl_device_disk *disk)
 {

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:18:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:18:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9Yl-0007Lj-7L; Tue, 18 Oct 2011 06:18:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CK-0002yW-I9
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:13 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318942479!53714435!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27574 invoked from network); 18 Oct 2011 12:54:44 -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;
	18 Oct 2011 12:54:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309449"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:09 -0400
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, 18 Oct 2011 08:55:08 -0400
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
	p9ICsvBI015846;	Tue, 18 Oct 2011 05:55:07 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a736cdba5d0a091aecbb96ae3696704b492e6728
Message-ID: <a736cdba5d0a091aecbb.1318942506@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:06 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 11 of 27 v3] libxl: reimplement devid->disk in
 terms of from_xs_be 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 Ian Campbell <ian.campbell@citrix.com>
# Date 1318941402 -3600
# Node ID a736cdba5d0a091aecbb96ae3696704b492e6728
# Parent  88488c1c2d316b0ab025c40eeec22c4c3e8e2c3b
libxl: reimplement devid->disk in terms of from_xs_be function.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 88488c1c2d31 -r a736cdba5d0a tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -1656,6 +1656,33 @@ static void libxl__device_disk_from_xs_b
     disk->format = LIBXL_DISK_FORMAT_UNKNOWN;
 }
 
+int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
+                               const char *devid, libxl_device_disk *disk)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *dompath, *path;
+    int rc = ERROR_FAIL;
+
+    memset(disk, 0, sizeof (libxl_device_disk));
+    dompath = libxl__xs_get_dompath(&gc, domid);
+    if (!dompath) {
+        goto out;
+    }
+    path = libxl__xs_read(&gc, XBT_NULL,
+                          libxl__sprintf(&gc, "%s/device/vbd/%s/backend",
+                                         dompath, devid));
+    if (!path)
+        goto out;
+
+    libxl__device_disk_from_xs_be(&gc, path, disk);
+
+    rc = 0;
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
+
 static int libxl__append_disk_list_of_type(libxl__gc *gc,
                                            uint32_t domid,
                                            const char *type,
diff -r 88488c1c2d31 -r a736cdba5d0a tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Tue Oct 18 13:36:42 2011 +0100
@@ -483,50 +483,6 @@ int libxl_mac_to_device_nic(libxl_ctx *c
     return rc;
 }
 
-int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
-                               const char *devid, libxl_device_disk *disk)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *val;
-    char *dompath, *diskpath, *be_path;
-    unsigned int devid_n;
-    int rc = ERROR_INVAL;
-
-    devid_n = libxl__device_disk_dev_number(devid, NULL, NULL);
-    if (devid_n < 0) {
-        goto out;
-    }
-    rc = ERROR_FAIL;
-    dompath = libxl__xs_get_dompath(&gc, domid);
-    diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, devid_n);
-    if (!diskpath) {
-        goto out;
-    }
-
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath));
-    if (!val)
-        goto out;
-    disk->backend_domid = strtoul(val, NULL, 10);
-    be_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", diskpath));
-    disk->pdev_path = xs_read(ctx->xsh, XBT_NULL,
-                              libxl__sprintf(&gc, "%s/params", be_path), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/type", be_path));
-    libxl_string_to_backend(ctx, val, &(disk->backend));
-    disk->vdev = xs_read(ctx->xsh, XBT_NULL,
-                         libxl__sprintf(&gc, "%s/dev", be_path), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/removable", be_path));
-    disk->removable = !strcmp(val, "1");
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mode", be_path));
-    disk->readwrite = !!strcmp(val, "w");
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/device-type", diskpath));
-    disk->is_cdrom = !strcmp(val, "cdrom");
-    rc = 0;
-
-out:
-    libxl__free_all(&gc);
-    return rc;
-}
-
 int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap)
 {
     int max_cpus;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:19:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:19:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9a1-0007jE-W7; Tue, 18 Oct 2011 06:19:42 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CJ-0002yH-4V
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:12 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1318942479!53714435!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27451 invoked from network); 18 Oct 2011 12:54:43 -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;
	18 Oct 2011 12:54:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309448"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:07 -0400
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, 18 Oct 2011 08:55:06 -0400
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
	p9ICsvBG015846;	Tue, 18 Oct 2011 05:55:06 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 7799bad1a323ea5299f61cd1361833631e018fac
Message-ID: <7799bad1a323ea5299f6.1318942504@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:04 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 09 of 27 v3] libxl: update nic list API to use
 common device API style
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941402 -3600
# Node ID 7799bad1a323ea5299f61cd1361833631e018fac
# Parent  70dc8cd5ba46742671166a603937205746248901
libxl: update nic list API to use common device API style

libxl_device_nic_list returns an array of libxl_device_nic and
libxl_device_nic_getinfo retrieves further information.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 70dc8cd5ba46 -r 7799bad1a323 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:15 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -1291,60 +1291,138 @@ int libxl_device_nic_del(libxl_ctx *ctx,
     return rc;
 }
 
-libxl_nicinfo *libxl_list_nics(libxl_ctx *ctx, uint32_t domid, unsigned int *nb)
+static void libxl__device_nic_from_xs_be(libxl__gc *gc,
+                                         const char *be_path,
+                                         libxl_device_nic *nic)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    unsigned int len;
+    char *tmp;
+    int rc;
+
+    memset(nic, 0, sizeof(*nic));
+
+    tmp = xs_read(ctx->xsh, XBT_NULL,
+                  libxl__sprintf(gc, "%s/handle", be_path), &len);
+    if ( tmp )
+        nic->devid = atoi(tmp);
+    else
+        nic->devid = 0;
+
+    /* nic->mtu = */
+
+    tmp = xs_read(ctx->xsh, XBT_NULL,
+                  libxl__sprintf(gc, "%s/mac", be_path), &len);
+    rc = libxl__parse_mac(tmp, nic->mac);
+    if (rc)
+            memset(nic->mac, 0, sizeof(nic->mac));
+
+    nic->ip = xs_read(ctx->xsh, XBT_NULL,
+                      libxl__sprintf(gc, "%s/ip", be_path), &len);
+
+    nic->bridge = xs_read(ctx->xsh, XBT_NULL,
+                      libxl__sprintf(gc, "%s/bridge", be_path), &len);
+
+    nic->script = xs_read(ctx->xsh, XBT_NULL,
+                      libxl__sprintf(gc, "%s/script", be_path), &len);
+
+    /* XXX ioemu nics are not in xenstore at all? */
+    nic->nictype = LIBXL_NIC_TYPE_VIF;
+    nic->model = NULL; /* XXX Only for TYPE_IOEMU */
+    nic->ifname = NULL; /* XXX Only for TYPE_IOEMU */
+}
+
+static int libxl__append_nic_list_of_type(libxl__gc *gc,
+                                           uint32_t domid,
+                                           const char *type,
+                                           libxl_device_nic **nics,
+                                           int *nnics)
+{
+    char *be_path = NULL;
+    char **dir = NULL;
+    unsigned int n = 0;
+    libxl_device_nic *pnic = NULL, *pnic_end = NULL;
+
+    be_path = libxl__sprintf(gc, "%s/backend/%s/%d",
+                             libxl__xs_get_dompath(gc, 0), type, domid);
+    dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n);
+    if (dir) {
+        libxl_device_nic *tmp;
+        tmp = realloc(*nics, sizeof (libxl_device_nic) * (*nnics + n));
+        if (tmp == NULL)
+            return ERROR_NOMEM;
+        *nics = tmp;
+        pnic = *nics + *nnics;
+        *nnics += n;
+        pnic_end = *nics + *nnics;
+        for (; pnic < pnic_end; pnic++, dir++) {
+            const char *p;
+            p = libxl__sprintf(gc, "%s/%s", be_path, *dir);
+            libxl__device_nic_from_xs_be(gc, p, pnic);
+            pnic->backend_domid = 0;
+        }
+    }
+    return 0;
+}
+
+libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath, *nic_path_fe;
-    char **l, **list;
-    char *val, *tok;
-    unsigned int nb_nics, i;
-    libxl_nicinfo *res, *nics;
+    libxl_device_nic *nics = NULL;
+    int rc;
+
+    *num = 0;
+
+    rc = libxl__append_nic_list_of_type(&gc, domid, "vif", &nics, num);
+    if (rc) goto out_err;
+
+    libxl__free_all(&gc);
+    return nics;
+
+out_err:
+    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list nics");
+    while (*num) {
+        (*num)--;
+        libxl_device_nic_dispose(&nics[*num]);
+    }
+    free(nics);
+    return NULL;
+}
+
+int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_nic *nic, libxl_nicinfo *nicinfo)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *dompath, *nicpath;
+    char *val;
 
     dompath = libxl__xs_get_dompath(&gc, domid);
-    if (!dompath)
-        goto err;
-    list = l = libxl__xs_directory(&gc, XBT_NULL,
-                           libxl__sprintf(&gc, "%s/device/vif", dompath), &nb_nics);
-    if (!l)
-        goto err;
-    nics = res = calloc(nb_nics, sizeof (libxl_nicinfo));
-    if (!res)
-        goto err;
-    for (*nb = nb_nics; nb_nics > 0; --nb_nics, ++l, ++nics) {
-        nic_path_fe = libxl__sprintf(&gc, "%s/device/vif/%s", dompath, *l);
-
-        nics->backend = xs_read(ctx->xsh, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", nic_path_fe), NULL);
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nic_path_fe));
-        nics->backend_id = val ? strtoul(val, NULL, 10) : -1;
-
-        nics->devid = strtoul(*l, NULL, 10);
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nic_path_fe));
-        nics->state = val ? strtoul(val, NULL, 10) : -1;
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/mac", nic_path_fe));
-        for (i = 0, tok = strtok(val, ":"); tok && (i < 6);
-             ++i, tok = strtok(NULL, ":")) {
-            nics->mac[i] = strtoul(tok, NULL, 16);
-        }
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nic_path_fe));
-        nics->evtch = val ? strtol(val, NULL, 10) : -1;
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nic_path_fe));
-        nics->rref_tx = val ? strtol(val, NULL, 10) : -1;
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nic_path_fe));
-        nics->rref_rx = val ? strtol(val, NULL, 10) : -1;
-        nics->frontend = xs_read(ctx->xsh, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/frontend", nics->backend), NULL);
-        val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nics->backend));
-        nics->frontend_id = val ? strtoul(val, NULL, 10) : -1;
-        nics->script = xs_read(ctx->xsh, XBT_NULL,
-                               libxl__sprintf(&gc, "%s/script", nics->backend), NULL);
+    nicinfo->devid = nic->devid;
+
+    nicpath = libxl__sprintf(&gc, "%s/device/vif/%d", dompath, nicinfo->devid);
+    nicinfo->backend = xs_read(ctx->xsh, XBT_NULL,
+                                libxl__sprintf(&gc, "%s/backend", nicpath), NULL);
+    if (!nicinfo->backend) {
+        libxl__free_all(&gc);
+        return ERROR_FAIL;
     }
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", nicpath));
+    nicinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", nicpath));
+    nicinfo->state = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", nicpath));
+    nicinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/tx-ring-ref", nicpath));
+    nicinfo->rref_tx = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/rx-ring-ref", nicpath));
+    nicinfo->rref_rx = val ? strtoul(val, NULL, 10) : -1;
+    nicinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
+                                 libxl__sprintf(&gc, "%s/frontend", nicinfo->backend), NULL);
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", nicinfo->backend));
+    nicinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
 
     libxl__free_all(&gc);
-    return res;
-err:
-    libxl__free_all(&gc);
-    return NULL;
+    return 0;
 }
 
 /******************************************************************************/
diff -r 70dc8cd5ba46 -r 7799bad1a323 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 13:36:15 2011 +0100
+++ b/tools/libxl/libxl.h	Tue Oct 18 13:36:42 2011 +0100
@@ -454,7 +454,9 @@ int libxl_device_disk_local_detach(libxl
 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);
 int libxl_device_nic_del(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, int wait);
-libxl_nicinfo *libxl_list_nics(libxl_ctx *ctx, uint32_t domid, unsigned int *nb);
+libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num);
+int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_nic *nic, libxl_nicinfo *nicinfo);
 
 int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid, libxl_device_console *console);
 
diff -r 70dc8cd5ba46 -r 7799bad1a323 tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl	Tue Oct 18 13:36:15 2011 +0100
+++ b/tools/libxl/libxl_types.idl	Tue Oct 18 13:36:42 2011 +0100
@@ -330,8 +330,6 @@ libxl_nicinfo = Struct("nicinfo", [
     ("frontend_id", uint32),
     ("devid", integer),
     ("state", integer),
-    ("script", string),
-    ("mac", libxl_mac),
     ("evtch", integer),
     ("rref_tx", integer),
     ("rref_rx", integer),
diff -r 70dc8cd5ba46 -r 7799bad1a323 tools/libxl/libxl_utils.c
--- a/tools/libxl/libxl_utils.c	Tue Oct 18 13:36:15 2011 +0100
+++ b/tools/libxl/libxl_utils.c	Tue Oct 18 13:36:42 2011 +0100
@@ -451,15 +451,15 @@ int libxl_pipe(libxl_ctx *ctx, int pipes
 int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid,
                             const char *mac, libxl_device_nic *nic)
 {
-    libxl_nicinfo *nics;
-    unsigned int nb, rc, i;
+    libxl_device_nic *nics;
+    int nb, rc, i;
     libxl_mac mac_n;
 
     rc = libxl__parse_mac(mac, mac_n);
     if (rc)
         return rc;
 
-    nics = libxl_list_nics(ctx, domid, &nb);
+    nics = libxl_device_nic_list(ctx, domid, &nb);
     if (!nics)
         return ERROR_FAIL;
 
@@ -468,17 +468,17 @@ int libxl_mac_to_device_nic(libxl_ctx *c
     rc = ERROR_INVAL;
     for (i = 0; i < nb; ++i) {
         if (!libxl__compare_macs(&mac_n, &nics[i].mac)) {
-            nic->backend_domid = nics[i].backend_id;
-            nic->devid = nics[i].devid;
-            memcpy(nic->mac, nics[i].mac, sizeof (nic->mac));
-            nic->script = strdup(nics[i].script);
+            *nic = nics[i];
             rc = 0;
+            i++; /* Do not dispose this NIC on exit path */
             break;
         }
+        libxl_device_nic_dispose(&nics[i]);
     }
 
-    for (i=0; i<nb; i++)
-        libxl_nicinfo_dispose(&nics[i]);
+    for (; i<nb; i++)
+        libxl_device_nic_dispose(&nics[i]);
+
     free(nics);
     return rc;
 }
diff -r 70dc8cd5ba46 -r 7799bad1a323 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:15 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -4025,8 +4025,9 @@ int main_networkattach(int argc, char **
 int main_networklist(int argc, char **argv)
 {
     int opt;
-    libxl_nicinfo *nics;
-    unsigned int nb, i;
+    libxl_device_nic *nics;
+    libxl_nicinfo nicinfo;
+    int nb, i;
 
     if ((opt = def_getopt(argc, argv, "", "network-list", 1)) != -1)
         return opt;
@@ -4039,19 +4040,23 @@ int main_networklist(int argc, char **ar
             fprintf(stderr, "%s is an invalid domain identifier\n", *argv);
             continue;
         }
-        if (!(nics = libxl_list_nics(ctx, domid, &nb))) {
+        nics = libxl_device_nic_list(ctx, domid, &nb);
+        if (!nics) {
             continue;
         }
         for (i = 0; i < nb; ++i) {
-            /* Idx BE */
-            printf("%-3d %-2d ", nics[i].devid, nics[i].backend_id);
-            /* MAC */
-            printf(LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nics[i].mac));
-            /* Hdl  Sta  evch txr/rxr  BE-path */
-            printf("%6d %5d %6d %5d/%-11d %-30s\n",
-                   nics[i].devid, nics[i].state, nics[i].evtch,
-                   nics[i].rref_tx, nics[i].rref_rx, nics[i].backend);
-            libxl_nicinfo_dispose(&nics[i]);
+            if (!libxl_device_nic_getinfo(ctx, domid, &nics[i], &nicinfo)) {
+                /* Idx BE */
+                printf("%-3d %-2d ", nicinfo.devid, nicinfo.backend_id);
+                /* MAC */
+                printf(LIBXL_MAC_FMT, LIBXL_MAC_BYTES(nics[i].mac));
+                /* Hdl  Sta  evch txr/rxr  BE-path */
+                printf("%6d %5d %6d %5d/%-11d %-30s\n",
+                       nicinfo.devid, nicinfo.state, nicinfo.evtch,
+                       nicinfo.rref_tx, nicinfo.rref_rx, nicinfo.backend);
+                libxl_nicinfo_dispose(&nicinfo);
+            }
+            libxl_device_nic_dispose(&nics[i]);
         }
         free(nics);
     }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:21:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:21:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9bN-00087p-Mr; Tue, 18 Oct 2011 06:21:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CL-0002ym-D5
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:13 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!6
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 580 invoked from network); 18 Oct 2011 12:55:10 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243193"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:09 -0400
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, 18 Oct 2011 08:55:09 -0400
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
	p9ICsvBJ015846;	Tue, 18 Oct 2011 05:55:08 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: da6b91661078fcf10247f8aab06a12c2bc2b2eb1
Message-ID: <da6b91661078fcf10247.1318942507@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:07 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 12 of 27 v3] libxl: libxl_devid_to_* should take
 an integer device id
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941402 -3600
# Node ID da6b91661078fcf10247f8aab06a12c2bc2b2eb1
# Parent  a736cdba5d0a091aecbb96ae3696704b492e6728
libxl: libxl_devid_to_* should take an integer device id

Currently takes a string.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r a736cdba5d0a -r da6b91661078 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -1333,7 +1333,7 @@ static void libxl__device_nic_from_xs_be
 }
 
 int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
-                              const char *devid, libxl_device_nic *nic)
+                              int devid, libxl_device_nic *nic)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     char *dompath, *path;
@@ -1345,7 +1345,7 @@ int libxl_devid_to_device_nic(libxl_ctx 
         goto out;
 
     path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vif/%s/backend",
+                          libxl__sprintf(&gc, "%s/device/vif/%d/backend",
                                          dompath, devid));
     if (!path)
         goto out;
@@ -1657,7 +1657,7 @@ static void libxl__device_disk_from_xs_b
 }
 
 int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
-                               const char *devid, libxl_device_disk *disk)
+                               int devid, libxl_device_disk *disk)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     char *dompath, *path;
@@ -1669,7 +1669,7 @@ int libxl_devid_to_device_disk(libxl_ctx
         goto out;
     }
     path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vbd/%s/backend",
+                          libxl__sprintf(&gc, "%s/device/vbd/%d/backend",
                                          dompath, devid));
     if (!path)
         goto out;
diff -r a736cdba5d0a -r da6b91661078 tools/libxl/libxl_utils.h
--- a/tools/libxl/libxl_utils.h	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_utils.h	Tue Oct 18 13:36:42 2011 +0100
@@ -60,11 +60,11 @@ void libxl_report_child_exitstatus(libxl
 
 int libxl_mac_to_device_nic(libxl_ctx *ctx, uint32_t domid,
                             const char *mac, libxl_device_nic *nic);
-int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid,
-                              const char *devid, libxl_device_nic *nic);
+int libxl_devid_to_device_nic(libxl_ctx *ctx, uint32_t domid, int devid,
+                              libxl_device_nic *nic);
 
-int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
-                               const char *devid, libxl_device_disk *disk);
+int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid, int devid,
+                               libxl_device_disk *disk);
 
 int libxl_cpumap_alloc(libxl_ctx *ctx, libxl_cpumap *cpumap);
 int libxl_cpumap_test(libxl_cpumap *cpumap, int cpu);
diff -r a736cdba5d0a -r da6b91661078 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -4077,7 +4077,7 @@ int main_networkdetach(int argc, char **
     }
 
     if (!strchr(argv[optind+1], ':')) {
-        if (libxl_devid_to_device_nic(ctx, domid, argv[optind+1], &nic)) {
+        if (libxl_devid_to_device_nic(ctx, domid, atoi(argv[optind+1]), &nic)) {
             fprintf(stderr, "Unknown device %s.\n", argv[optind+1]);
             return 1;
         }
@@ -4178,7 +4178,7 @@ int main_blockdetach(int argc, char **ar
         fprintf(stderr, "%s is an invalid domain identifier\n", argv[optind]);
         return 1;
     }
-    if (libxl_devid_to_device_disk(ctx, domid, argv[optind+1], &disk)) {
+    if (libxl_devid_to_device_disk(ctx, domid, atoi(argv[optind+1]), &disk)) {
         fprintf(stderr, "Error: Device %s not connected.\n", argv[optind+1]);
         return 1;
     }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:22:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:22:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9cy-0000AM-2g; Tue, 18 Oct 2011 06:22:44 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CO-0002zd-WE
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:17 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!8
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 968 invoked from network); 18 Oct 2011 12:55:13 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243201"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:13 -0400
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, 18 Oct 2011 08:55:12 -0400
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
	p9ICsvBN015846;	Tue, 18 Oct 2011 05:55:12 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 6f8ff4990c5cf5ea9b37ee07df9cc2b118a50c16
Message-ID: <6f8ff4990c5cf5ea9b37.1318942511@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:11 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 16 of 27 v3] libxl: do not remove unidentified
 frontend paths in libxl__devices_destroy
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941402 -3600
# Node ID 6f8ff4990c5cf5ea9b37ee07df9cc2b118a50c16
# Parent  7f1e0391462078ee1bf572722e958b2ed0e966ef
libxl: do not remove unidentified frontend paths in libxl__devices_destroy

Currently this appears to only include "/local/domain/<domid>/device/suspend".
Ultimately the caller will nuke the whole guest directory anyway but not having
this function remove things which don't look like devices seems less
surprising.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 7f1e03914620 -r 6f8ff4990c5c tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
@@ -463,8 +463,6 @@ int libxl__devices_destroy(libxl__gc *gc
                     if (libxl__device_remove(gc, be_path) > 0)
                         n_watches++;
                 }
-            } else {
-                xs_rm(ctx->xsh, XBT_NULL, path);
             }
         }
     }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:23:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:23:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9dt-0000YO-9M; Tue, 18 Oct 2011 06:23:41 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CN-0002zC-HX
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:16 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318942512!35773661!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17039 invoked from network); 18 Oct 2011 12:55:12 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:12 -0000
Received: by wyi11 with SMTP id 11so715917wyi.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 05:55:12 -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:cc; bh=MOpyobnHyWxk21ggtGMWVsLoXYXqg/LBNuk2h0UTwdY=;
	b=IK/Cjn0TGF3Udqlp6kToufhxqyKoUQGrKoH+/IStuAlaq8e7rISutWs1K5Oh1cYXgG
	3qE2d2tfXTgu5Tdj4qyVcvqQSsYgwZI7W3iZD0boW+zY699fUgEFpspp9GkEKyWYeiC6
	WlIX1T/7GJf9OmNl/dcsz/s9lf3Rdb7de5/BI=
Received: by 10.227.61.6 with SMTP id r6mr870986wbh.37.1318942511972;
	Tue, 18 Oct 2011 05:55:11 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id k26sm3373224wbo.16.2011.10.18.05.55.09
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 18 Oct 2011 05:55:10 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 973022eb35ed3c2e58980d8c4482721d4e1d7bab
Message-Id: <973022eb35ed3c2e5898.1318942500@loki>
In-Reply-To: <patchbomb.1318499605@localhost.localdomain>
References: <patchbomb.1318499605@localhost.localdomain>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Tue, 18 Oct 2011 14:55:00 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: ian.campbell@citrix.com
Subject: [Xen-devel] [PATCH] libxl: fix device removal handling of
	wait_for_dev_destroy
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318942350 -7200
# Node ID 973022eb35ed3c2e58980d8c4482721d4e1d7bab
# Parent  c9c228ec718a4c2d22b58ce306f269868af0d12f
libxl: fix device removal handling of wait_for_dev_destroy

This patch is a fix for Ian Campbell's "libxl: rationalise libxl_device_* APIs" and addresses the problem of not handling the return value from destroy functions correctly. The return value can represent three different options, the device is removed correctly, the device is busy or and error occurred.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r c9c228ec718a -r 973022eb35ed tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Thu Oct 13 10:52:46 2011 +0100
+++ b/tools/libxl/libxl_device.c	Tue Oct 18 14:52:30 2011 +0200
@@ -367,6 +367,10 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
+/*
+ * Returns 0 on succesful device removal, 1 if a timeout
+ * happenned and ERROR_* if there was an error
+ */
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -375,27 +379,47 @@ static int wait_for_dev_destroy(libxl__g
     fd_set rfds;
     char **l1 = NULL;
 
+start:
     rc = 1;
     nfds = xs_fileno(ctx->xsh) + 1;
     FD_ZERO(&rfds);
     FD_SET(xs_fileno(ctx->xsh), &rfds);
-    if (select(nfds, &rfds, NULL, NULL, tv) > 0) {
-        l1 = xs_read_watch(ctx->xsh, &n);
-        if (l1 != NULL) {
-            char *state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
-            if (!state || atoi(state) == 6) {
-                xs_unwatch(ctx->xsh, l1[0], l1[1]);
-                xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
-                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Destroyed device backend at %s", l1[XS_WATCH_TOKEN]);
-                rc = 0;
+    switch (select(nfds, &rfds, NULL, NULL, tv)) {
+        case -1:
+            if (errno == EINTR)
+                goto start;
+            rc = ERROR_FAIL;
+            break;
+        case 0:
+            rc = 1;
+            break;
+        case 1:
+            l1 = xs_read_watch(ctx->xsh, &n);
+            if (l1 != NULL) {
+                char *state = libxl__xs_read(gc, XBT_NULL,
+                                             l1[XS_WATCH_PATH]);
+                if (!state || atoi(state) == 6) {
+                    xs_unwatch(ctx->xsh, l1[0], l1[1]);
+                    xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
+                    LIBXL__LOG(ctx, LIBXL__LOG_DEBUG,
+                               "Destroyed device backend at %s",
+                               l1[XS_WATCH_TOKEN]);
+                    rc = 0;
+                }
+                free(l1);
+            } else {
+                rc = ERROR_FAIL;
             }
-            free(l1);
-        }
+            break;
     }
     return rc;
 }
 
-/* Returns 0 on success, ERROR_* on fail */
+/* 
+ * Returns 0 on success, ERROR_* on fail and 1 if there's an event
+ * pending (a device has been added to a watch to wait for
+ * disconnection)
+ */
 int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -428,16 +452,15 @@ retry_transaction:
 
     xs_watch(ctx->xsh, state_path, be_path);
     libxl__device_destroy_tapdisk(gc, be_path);
+    rc = 1;
 
     if (wait) {
         struct timeval tv;
         tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
         tv.tv_usec = 0;
-        (void)wait_for_dev_destroy(gc, &tv);
+        rc = wait_for_dev_destroy(gc, &tv);
         xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
     }
-
-    rc = 0;
 out:
     return rc;
 }
@@ -496,7 +519,7 @@ int libxl__devices_destroy(libxl__gc *gc
                 if (force) {
                     libxl__device_destroy(gc, &dev);
                 } else {
-                    if (libxl__device_remove(gc, &dev, 0) == 0)
+                    if (libxl__device_remove(gc, &dev, 0) == 1)
                         n_watches++;
                 }
             }
@@ -515,7 +538,7 @@ int libxl__devices_destroy(libxl__gc *gc
         if (force) {
             libxl__device_destroy(gc, &dev);
         } else {
-            if (libxl__device_remove(gc, &dev, 0) == 0)
+            if (libxl__device_remove(gc, &dev, 0) == 1)
                 n_watches++;
         }
     }
@@ -531,7 +554,7 @@ int libxl__devices_destroy(libxl__gc *gc
         tv.tv_usec = 0;
         while (n_watches > 0) {
             if (wait_for_dev_destroy(gc, &tv)) {
-                break;
+                continue;
             } else {
                 n_watches--;
             }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:24:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:24:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9eo-0000vo-8v; Tue, 18 Oct 2011 06:24:38 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CN-0002zB-EF
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:16 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!7
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 795 invoked from network); 18 Oct 2011 12:55:12 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243197"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:11 -0400
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, 18 Oct 2011 08:55:10 -0400
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
	p9ICsvBL015846;	Tue, 18 Oct 2011 05:55:10 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 89233ed65eced3ca2ef6cc1cce7abcdd3e5439e9
Message-ID: <89233ed65eced3ca2ef6.1318942509@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:09 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 14 of 27 v3] libxl: split forced and non-forced
 uses of libxl__device_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

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318941402 -3600
# Node ID 89233ed65eced3ca2ef6cc1cce7abcdd3e5439e9
# Parent  16805eff73bdac4758dc84a3507918e5697df30a
libxl: split forced and non-forced uses of libxl__device_del

Most forced users can now simply call libxl__device_destroy directly.

libxl__devices_destroy is something of a special case, it is really
just iterating over an opaque set of xenstore directories and removing
them. Until this can be refactored just do the force-remove case
manually, doing otherwise led to too much entanglement with the other
callers of libxl__device_destroy which do know about specific device
types.

For the time being do the same in libxl__device_pci_remove_xenstore.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 16805eff73bd -r 89233ed65ece tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -1074,7 +1074,10 @@ int libxl_device_disk_del(libxl_ctx *ctx
     device.domid            = domid;
     device.devid            = devid;
     device.kind             = DEVICE_VBD;
-    rc = libxl__device_del(&gc, &device, wait);
+    if (wait)
+        rc = libxl__device_del(&gc, &device);
+    else
+        rc = libxl__device_destroy(&gc, &device);
 out_free:
     libxl__free_all(&gc);
     return rc;
@@ -1286,7 +1289,11 @@ int libxl_device_nic_del(libxl_ctx *ctx,
     device.domid            = domid;
     device.kind             = DEVICE_VIF;
 
-    rc = libxl__device_del(&gc, &device, wait);
+    if (wait)
+        rc = libxl__device_del(&gc, &device);
+    else
+        rc = libxl__device_destroy(&gc, &device);
+
     libxl__free_all(&gc);
     return rc;
 }
diff -r 16805eff73bd -r 89233ed65ece tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
@@ -401,11 +401,17 @@ out:
     return rc;
 }
 
-int libxl__device_destroy(libxl__gc *gc, char *be_path)
+int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *be_path = libxl__device_backend_path(gc, dev);
+    char *fe_path = libxl__device_frontend_path(gc, dev);
+
     xs_rm(ctx->xsh, XBT_NULL, be_path);
+    xs_rm(ctx->xsh, XBT_NULL, fe_path);
+
     libxl__device_destroy_tapdisk(gc, be_path);
+
     return 0;
 }
 
@@ -466,10 +472,14 @@ int libxl__devices_destroy(libxl__gc *gc
             fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]);
             be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
             if (be_path != NULL) {
-                int rc = force ? libxl__device_destroy(gc, be_path)
-                               : libxl__device_remove(gc, be_path);
-                if (rc > 0)
-                    n_watches++;
+                if (force) {
+                    xs_rm(ctx->xsh, XBT_NULL, be_path);
+                    xs_rm(ctx->xsh, XBT_NULL, fe_path);
+                    libxl__device_destroy_tapdisk(gc, be_path);
+                } else {
+                    if (libxl__device_remove(gc, be_path) > 0)
+                        n_watches++;
+                }
             } else {
                 xs_rm(ctx->xsh, XBT_NULL, path);
             }
@@ -480,10 +490,13 @@ int libxl__devices_destroy(libxl__gc *gc
     fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid);
     be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
     if (be_path && strcmp(be_path, "")) {
-        int rc = force ? libxl__device_destroy(gc, be_path)
-                       : libxl__device_remove(gc, be_path);
-        if (rc > 0)
-            n_watches++;
+        if (force) {
+            xs_rm(ctx->xsh, XBT_NULL, be_path);
+            xs_rm(ctx->xsh, XBT_NULL, fe_path);
+        } else {
+            if (libxl__device_remove(gc, be_path) > 0)
+                n_watches++;
+        }
     }
 
     if (!force) {
@@ -507,29 +520,24 @@ out:
     return 0;
 }
 
-int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait)
+int libxl__device_del(libxl__gc *gc, libxl__device *dev)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
+    struct timeval tv;
     char *backend_path;
     int rc;
 
     backend_path = libxl__device_backend_path(gc, dev);
 
-    if (wait)
-        rc = libxl__device_remove(gc, backend_path);
-    else
-        rc = libxl__device_destroy(gc, backend_path);
+    rc = libxl__device_remove(gc, backend_path);
     if (rc == -1) {
         rc = ERROR_FAIL;
         goto out;
     }
 
-    if (wait) {
-        struct timeval tv;
-        tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
-        tv.tv_usec = 0;
-        (void)wait_for_dev_destroy(gc, &tv);
-    }
+    tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
+    tv.tv_usec = 0;
+    (void)wait_for_dev_destroy(gc, &tv);
 
     xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
     rc = 0;
diff -r 16805eff73bd -r 89233ed65ece tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:42 2011 +0100
@@ -252,9 +252,9 @@ _hidden int libxl__device_generic_add(li
                              char **bents, char **fents);
 _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device);
 _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device);
-_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait);
+_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
 _hidden int libxl__device_remove(libxl__gc *gc, char *be_path);
-_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path);
+_hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev);
 _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
 _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);
 
diff -r 16805eff73bd -r 89233ed65ece tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Tue Oct 18 13:36:42 2011 +0100
@@ -411,7 +411,7 @@ retry_transaction2:
 
     if (num == 1) {
         char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path));
-        libxl__device_destroy(gc, be_path);
+        xs_rm(ctx->xsh, XBT_NULL, be_path);
         xs_rm(ctx->xsh, XBT_NULL, fe_path);
         return 0;
     }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:25:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:25:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9fw-0001Jo-AC; Tue, 18 Oct 2011 06:25:48 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CQ-0002zr-Qb
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:19 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!9
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1190 invoked from network); 18 Oct 2011 12:55:15 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243205"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:14 -0400
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, 18 Oct 2011 08:55:14 -0400
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
	p9ICsvBP015846;	Tue, 18 Oct 2011 05:55:13 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 4020531a53fcb1a5579de3225b99a29a7619c7df
Message-ID: <4020531a53fcb1a5579d.1318942513@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:13 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 18 of 27 v3] libxl: merge libxl__device_del into
 libxl__device_remove
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941402 -3600
# Node ID 4020531a53fcb1a5579de3225b99a29a7619c7df
# Parent  5547b8593511cb37b830f6ec73f480e607f639c2
libxl: merge libxl__device_del into libxl__device_remove

Note that the "wait" parameter added to libxl_device_remove is different to the
wait paramter previously used by similar functions. In the past not-wait meant
forced whereas now in means wait for a graceful shutdown, as opposed to setting
off a graceful shutdown but not waiting.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -1075,7 +1075,7 @@ int libxl_device_disk_del(libxl_ctx *ctx
     device.devid            = devid;
     device.kind             = LIBXL__DEVICE_KIND_VBD;
     if (wait)
-        rc = libxl__device_del(&gc, &device);
+        rc = libxl__device_remove(&gc, &device, wait);
     else
         rc = libxl__device_destroy(&gc, &device);
 out_free:
@@ -1290,7 +1290,7 @@ int libxl_device_nic_del(libxl_ctx *ctx,
     device.kind             = LIBXL__DEVICE_KIND_VIF;
 
     if (wait)
-        rc = libxl__device_del(&gc, &device);
+        rc = libxl__device_remove(&gc, &device, wait);
     else
         rc = libxl__device_destroy(&gc, &device);
 
diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
@@ -367,57 +367,6 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
-int libxl__device_remove(libxl__gc *gc, libxl__device *dev)
-{
-    libxl_ctx *ctx = libxl__gc_owner(gc);
-    xs_transaction_t t;
-    char *be_path = libxl__device_backend_path(gc, dev);
-    char *state_path = libxl__sprintf(gc, "%s/state", be_path);
-    char *state = libxl__xs_read(gc, XBT_NULL, state_path);
-    int rc = 0;
-
-    if (!state)
-        goto out;
-    if (atoi(state) != 4) {
-        libxl__device_destroy_tapdisk(gc, be_path);
-        xs_rm(ctx->xsh, XBT_NULL, be_path);
-        goto out;
-    }
-
-retry_transaction:
-    t = xs_transaction_start(ctx->xsh);
-    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", strlen("0"));
-    xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
-    if (!xs_transaction_end(ctx->xsh, t, 0)) {
-        if (errno == EAGAIN)
-            goto retry_transaction;
-        else {
-            rc = -1;
-            goto out;
-        }
-    }
-
-    xs_watch(ctx->xsh, state_path, be_path);
-    libxl__device_destroy_tapdisk(gc, be_path);
-    rc = 1;
-out:
-    return rc;
-}
-
-int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
-{
-    libxl_ctx *ctx = libxl__gc_owner(gc);
-    char *be_path = libxl__device_backend_path(gc, dev);
-    char *fe_path = libxl__device_frontend_path(gc, dev);
-
-    xs_rm(ctx->xsh, XBT_NULL, be_path);
-    xs_rm(ctx->xsh, XBT_NULL, fe_path);
-
-    libxl__device_destroy_tapdisk(gc, be_path);
-
-    return 0;
-}
-
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -446,6 +395,71 @@ static int wait_for_dev_destroy(libxl__g
     return rc;
 }
 
+/*
+ * Returns 0 (device already destroyed) or 1 (caller must
+ * wait_for_dev_destroy) on success, ERROR_* on fail.
+ */
+int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    xs_transaction_t t;
+    char *be_path = libxl__device_backend_path(gc, dev);
+    char *state_path = libxl__sprintf(gc, "%s/state", be_path);
+    char *state = libxl__xs_read(gc, XBT_NULL, state_path);
+    int rc = 0;
+
+    if (!state)
+        goto out;
+    if (atoi(state) != 4) {
+        libxl__device_destroy_tapdisk(gc, be_path);
+        xs_rm(ctx->xsh, XBT_NULL, be_path);
+        goto out;
+    }
+
+retry_transaction:
+    t = xs_transaction_start(ctx->xsh);
+    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", strlen("0"));
+    xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
+    if (!xs_transaction_end(ctx->xsh, t, 0)) {
+        if (errno == EAGAIN)
+            goto retry_transaction;
+        else {
+            rc = ERROR_FAIL;
+            goto out;
+        }
+    }
+
+    xs_watch(ctx->xsh, state_path, be_path);
+    libxl__device_destroy_tapdisk(gc, be_path);
+
+    if (wait) {
+        struct timeval tv;
+        tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
+        tv.tv_usec = 0;
+        (void)wait_for_dev_destroy(gc, &tv);
+        xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
+    } else {
+        rc = 1; /* Caller must wait_for_dev_destroy */
+    }
+
+out:
+    return rc;
+}
+
+int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *be_path = libxl__device_backend_path(gc, dev);
+    char *fe_path = libxl__device_frontend_path(gc, dev);
+
+    xs_rm(ctx->xsh, XBT_NULL, be_path);
+    xs_rm(ctx->xsh, XBT_NULL, fe_path);
+
+    libxl__device_destroy_tapdisk(gc, be_path);
+
+    return 0;
+}
+
 int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -485,8 +499,12 @@ int libxl__devices_destroy(libxl__gc *gc
                 if (force) {
                     libxl__device_destroy(gc, &dev);
                 } else {
-                    if (libxl__device_remove(gc, &dev) > 0)
-                        n_watches++;
+                    int rc = libxl__device_remove(gc, &dev, 0);
+                    if (rc < 0)
+                        LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                                   "cannot remove device %s\n", path);
+                    else
+                        n_watches += rc;
                 }
             }
         }
@@ -504,8 +522,12 @@ int libxl__devices_destroy(libxl__gc *gc
         if (force) {
             libxl__device_destroy(gc, &dev);
         } else {
-            if (libxl__device_remove(gc, &dev) > 0)
-                n_watches++;
+            int rc = libxl__device_remove(gc, &dev, 0);
+            if (rc < 0)
+                LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                           "cannot remove device %s\n", path);
+            else
+                n_watches += rc;
         }
     }
 
@@ -530,29 +552,6 @@ out:
     return 0;
 }
 
-int libxl__device_del(libxl__gc *gc, libxl__device *dev)
-{
-    libxl_ctx *ctx = libxl__gc_owner(gc);
-    struct timeval tv;
-    int rc;
-
-    rc = libxl__device_remove(gc, dev);
-    if (rc == -1) {
-        rc = ERROR_FAIL;
-        goto out;
-    }
-
-    tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
-    tv.tv_usec = 0;
-    (void)wait_for_dev_destroy(gc, &tv);
-
-    xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
-    rc = 0;
-
-out:
-    return rc;
-}
-
 int libxl__wait_for_device_model(libxl__gc *gc,
                                  uint32_t domid, char *state,
                                  libxl__spawn_starting *spawning,
diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:42 2011 +0100
@@ -242,8 +242,7 @@ _hidden char *libxl__device_backend_path
 _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device);
 _hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path,
                                       libxl__device *dev);
-_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
-_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev);
+_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait);
 _hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev);
 _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
 _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:27:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:27:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9hL-0001o7-Re; Tue, 18 Oct 2011 06:27:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CS-00030N-O9
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:21 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!10
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1416 invoked from network); 18 Oct 2011 12:55:17 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243209"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:16 -0400
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, 18 Oct 2011 08:55:16 -0400
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
	p9ICsvBR015846;	Tue, 18 Oct 2011 05:55:15 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c245f495b53be00648e2bae4911675142e72e9c8
Message-ID: <c245f495b53be00648e2.1318942515@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:15 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 20 of 27 v3] libxl: convert disk handling to
	device API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941402 -3600
# Node ID c245f495b53be00648e2bae4911675142e72e9c8
# Parent  26ef64a0ff194c7df3a5f488c1232f6041c6fc02
libxl: convert disk handling to device API

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 26ef64a0ff19 -r c245f495b53b tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -916,13 +916,58 @@ int libxl_vncviewer_exec(libxl_ctx *ctx,
 
 /******************************************************************************/
 
+int libxl_device_disk_init(libxl_ctx *ctx, libxl_device_disk *disk)
+{
+    memset(disk, 0x00, sizeof(libxl_device_disk));
+    return 0;
+}
+
+static int libxl__device_from_disk(libxl__gc *gc, uint32_t domid,
+                                   libxl_device_disk *disk,
+                                   libxl__device *device)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    int devid;
+
+    devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
+    if (devid==-1) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported"
+               " virtual disk identifier %s", disk->vdev);
+        return ERROR_INVAL;
+    }
+
+    device->backend_domid = disk->backend_domid;
+    device->backend_devid = devid;
+
+    switch (disk->backend) {
+        case LIBXL_DISK_BACKEND_PHY:
+            device->backend_kind = LIBXL__DEVICE_KIND_VBD;
+            break;
+        case LIBXL_DISK_BACKEND_TAP:
+            device->backend_kind = LIBXL__DEVICE_KIND_VBD;
+            break;
+        case LIBXL_DISK_BACKEND_QDISK:
+            device->backend_kind = LIBXL__DEVICE_KIND_QDISK;
+            break;
+        default:
+            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n",
+                       disk->backend);
+            return ERROR_INVAL;
+    }
+
+    device->domid = domid;
+    device->devid = devid;
+    device->kind  = LIBXL__DEVICE_KIND_VBD;
+
+    return 0;
+}
+
 int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     flexarray_t *front;
     flexarray_t *back;
     char *dev;
-    int devid;
     libxl__device device;
     int major, minor, rc;
 
@@ -950,20 +995,13 @@ int libxl_device_disk_add(libxl_ctx *ctx
         goto out_free;
     }
 
-    devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
-    if (devid==-1) {
+    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    if (rc != 0) {
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Invalid or unsupported"
                " virtual disk identifier %s", disk->vdev);
-        rc = ERROR_INVAL;
         goto out_free;
     }
 
-    device.backend_devid = devid;
-    device.backend_domid = disk->backend_domid;
-    device.devid = devid;
-    device.domid = domid;
-    device.kind = LIBXL__DEVICE_KIND_VBD;
-
     switch (disk->backend) {
         case LIBXL_DISK_BACKEND_PHY:
             dev = disk->pdev_path;
@@ -975,7 +1013,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
             flexarray_append(back, "params");
             flexarray_append(back, dev);
 
-            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
+            assert(device.backend_kind == LIBXL__DEVICE_KIND_VBD);
             break;
         case LIBXL_DISK_BACKEND_TAP:
             dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format);
@@ -994,7 +1032,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
             flexarray_append(back, "params");
             flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
                           libxl__device_disk_string_of_format(disk->format), disk->pdev_path));
-            device.backend_kind = LIBXL__DEVICE_KIND_QDISK;
+            assert(device.backend_kind == LIBXL__DEVICE_KIND_QDISK);
             break;
         default:
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend);
@@ -1026,7 +1064,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
     flexarray_append(front, "state");
     flexarray_append(front, libxl__sprintf(&gc, "%d", 1));
     flexarray_append(front, "virtual-device");
-    flexarray_append(front, libxl__sprintf(&gc, "%d", devid));
+    flexarray_append(front, libxl__sprintf(&gc, "%d", device.devid));
     flexarray_append(front, "device-type");
     flexarray_append(front, disk->is_cdrom ? "cdrom" : "disk");
 
@@ -1044,45 +1082,37 @@ out:
     return rc;
 }
 
-int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid,
-                          libxl_device_disk *disk, int wait)
+int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid,
+                             libxl_device_disk *disk)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     libxl__device device;
-    int devid, rc;
-
-    devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
-    device.backend_domid    = disk->backend_domid;
-    device.backend_devid    = devid;
-
-    switch (disk->backend) {
-        case LIBXL_DISK_BACKEND_PHY:
-            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
-            break;
-        case LIBXL_DISK_BACKEND_TAP:
-            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
-            break;
-        case LIBXL_DISK_BACKEND_QDISK:
-            device.backend_kind = LIBXL__DEVICE_KIND_QDISK;
-            break;
-        default:
-            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n",
-                       disk->backend);
-            rc = ERROR_INVAL;
-            goto out_free;
-    }
-    device.domid            = domid;
-    device.devid            = devid;
-    device.kind             = LIBXL__DEVICE_KIND_VBD;
-    if (wait)
-        rc = libxl__device_remove(&gc, &device, wait);
-    else
-        rc = libxl__device_destroy(&gc, &device);
-out_free:
+    int rc;
+
+    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_remove(&gc, &device, 1);
+out:
     libxl__free_all(&gc);
     return rc;
 }
 
+int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_disk *disk)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_disk(&gc, domid, disk, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_destroy(&gc, &device);
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
 char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
@@ -1626,7 +1656,7 @@ static void libxl__device_disk_from_xs_b
     unsigned int len;
     char *tmp;
 
-    memset(disk, 0, sizeof(*disk));
+    libxl_device_disk_init(ctx, disk);
 
     tmp = xs_read(ctx->xsh, XBT_NULL,
                   libxl__sprintf(gc, "%s/params", be_path), &len);
@@ -1670,7 +1700,8 @@ int libxl_devid_to_device_disk(libxl_ctx
     char *dompath, *path;
     int rc = ERROR_FAIL;
 
-    memset(disk, 0, sizeof (libxl_device_disk));
+    libxl_device_disk_init(ctx, disk);
+
     dompath = libxl__xs_get_dompath(&gc, domid);
     if (!dompath) {
         goto out;
@@ -1812,11 +1843,11 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u
 
     ret = 0;
 
-    libxl_device_disk_del(ctx, domid, disks + i, 1);
+    libxl_device_disk_remove(ctx, domid, disks + i);
     libxl_device_disk_add(ctx, domid, disk);
     stubdomid = libxl_get_stubdom_id(ctx, domid);
     if (stubdomid) {
-        libxl_device_disk_del(ctx, stubdomid, disks + i, 1);
+        libxl_device_disk_remove(ctx, stubdomid, disks + i);
         libxl_device_disk_add(ctx, stubdomid, disk);
     }
 out:
diff -r 26ef64a0ff19 -r c245f495b53b tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.h	Tue Oct 18 13:36:42 2011 +0100
@@ -438,15 +438,27 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *
  *   This function does not interact with the guest and therefore
  *   cannot block on the guest.
  */
+
+/* Disks */
+int libxl_device_disk_init(libxl_ctx *ctx, libxl_device_disk *disk);
 int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);
-int libxl_device_disk_del(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk, int wait);
+int libxl_device_disk_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);
+int libxl_device_disk_destroy(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_disk *disk);
+
 libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num);
 int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_disk *disk, libxl_diskinfo *diskinfo);
+
+/*
+ * Insert a CD-ROM device. A device corresponding to disk must already
+ * be attached to the guest.
+ */
 int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk);
 
 /*
- * Make a disk available in this domain. Returns path to a device.
+ * Make a disk available in this (the control) 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);
diff -r 26ef64a0ff19 -r c245f495b53b tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -494,7 +494,7 @@ static void parse_disk_config_multistrin
 {
     int e;
 
-    memset(disk, 0, sizeof(*disk));
+    libxl_device_disk_init(ctx, disk);
 
     if (!*config) {
         *config = xlu_cfg_init(stderr, "command line");
@@ -1893,6 +1893,8 @@ static void cd_insert(const char *dom, c
     disk.backend_domid = 0;
 
     libxl_cdrom_insert(ctx, domid, &disk);
+
+    libxl_device_disk_dispose(&disk);
     free(buf);
 }
 
@@ -4182,8 +4184,8 @@ int main_blockdetach(int argc, char **ar
         fprintf(stderr, "Error: Device %s not connected.\n", argv[optind+1]);
         return 1;
     }
-    if (libxl_device_disk_del(ctx, domid, &disk, 1)) {
-        fprintf(stderr, "libxl_device_disk_del failed.\n");
+    if (libxl_device_disk_remove(ctx, domid, &disk)) {
+        fprintf(stderr, "libxl_device_disk_remove failed.\n");
     }
     return 0;
 }
diff -r 26ef64a0ff19 -r c245f495b53b tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:42 2011 +0100
@@ -16,6 +16,11 @@ builtins = {
     "libxl_hwcap":          ("int32 array",            None,                                "Val_hwcap(&%(c)s)"),
     }
 
+DEVICE_FUNCTIONS = [ ("add",            ["t", "domid", "unit"]),
+                     ("remove",         ["t", "domid", "unit"]),
+                     ("destroy",        ["t", "domid", "unit"]),
+                   ]
+
 functions = { # ( name , [type1,type2,....] )
     "device_vfb":     [ ("add",            ["t", "domid", "unit"]),
                         ("clean_shutdown", ["domid", "unit"]),
@@ -27,9 +32,7 @@ functions = { # ( name , [type1,type2,..
                       ],
     "device_console": [ ("add",            ["t", "domid", "unit"]),
                       ],
-    "device_disk":    [ ("add",            ["t", "domid", "unit"]),
-                        ("del",            ["t", "domid", "unit"]),
-                      ],
+    "device_disk":    DEVICE_FUNCTIONS,
     "device_nic":     [ ("add",            ["t", "domid", "unit"]),
                         ("del",            ["t", "domid", "unit"]),
                       ],
diff -r 26ef64a0ff19 -r c245f495b53b tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:42 2011 +0100
@@ -247,7 +247,7 @@ value stub_xl_device_disk_del(value info
 	device_disk_val(&gc, &lg, &c_info, info);
 
 	INIT_CTX();
-	ret = libxl_device_disk_del(ctx, Int_val(domid), &c_info, 0);
+	ret = libxl_device_disk_remove(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("disk_del", &lg);
 	FREE_CTX();

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:28:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:28:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9iS-0002Cd-78; Tue, 18 Oct 2011 06:28:24 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CU-00030T-5I
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:23 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!11
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1611 invoked from network); 18 Oct 2011 12:55:18 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243213"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:18 -0400
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, 18 Oct 2011 08:55:17 -0400
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
	p9ICsvBT015846;	Tue, 18 Oct 2011 05:55:17 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c8eab687999d2927a0a4581a6bf09deeadcbff13
Message-ID: <c8eab687999d2927a0a4.1318942517@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:17 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 22 of 27 v3] libxl: remove
	libxl_device_console_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

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318941403 -3600
# Node ID c8eab687999d2927a0a4581a6bf09deeadcbff13
# Parent  576b80340b0e92360792399d67aa26002b2771fc
libxl: remove libxl_device_console_add.

It has no callers, the only code which adds consoles in internal to libxl and
uses libxl__device_console_add directly.

Rather than worrying about what the public API should look like in this case
simply remove it, adding new APIs is much easier than fixing broken ones...

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 576b80340b0e -r c8eab687999d tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -1585,18 +1585,6 @@ out:
     return rc;
 }
 
-int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid,
-                              libxl_device_console *console)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    int rc = ERROR_INVAL;
-
-    rc = libxl__device_console_add(&gc, domid, console, NULL);
-
-    libxl__free_all(&gc);
-    return rc;
-}
-
 /******************************************************************************/
 void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num)
 {
diff -r 576b80340b0e -r c8eab687999d tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.h	Tue Oct 18 13:36:43 2011 +0100
@@ -473,8 +473,6 @@ libxl_device_nic *libxl_device_nic_list(
 int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_nic *nic, libxl_nicinfo *nicinfo);
 
-int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid, libxl_device_console *console);
-
 void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num);
 int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
 int libxl_device_vkb_clean_shutdown(libxl_ctx *ctx, uint32_t domid);
diff -r 576b80340b0e -r c8eab687999d tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:43 2011 +0100
@@ -30,8 +30,6 @@ functions = { # ( name , [type1,type2,..
                         ("clean_shutdown", ["domid", "unit"]),
                         ("hard_shutdown",  ["domid", "unit"]),
                       ],
-    "device_console": [ ("add",            ["t", "domid", "unit"]),
-                      ],
     "device_disk":    DEVICE_FUNCTIONS,
     "device_nic":     DEVICE_FUNCTIONS,
     "device_pci":     [ ("add",            ["t", "domid", "unit"]),
diff -r 576b80340b0e -r c8eab687999d tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:43 2011 +0100
@@ -288,23 +288,6 @@ value stub_xl_device_nic_del(value info,
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_console_add(value info, value domid)
-{
-	CAMLparam2(info, domid);
-	libxl_device_console c_info;
-	int ret;
-	INIT_STRUCT();
-
-	device_console_val(&gc, &lg, &c_info, info);
-
-	INIT_CTX();
-	ret = libxl_device_console_add(ctx, Int_val(domid), &c_info);
-	if (ret != 0)
-		failwith_xl("console_add", &lg);
-	FREE_CTX();
-	CAMLreturn(Val_unit);
-}
-
 value stub_xl_device_vkb_add(value info, value domid)
 {
 	CAMLparam2(info, domid);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:29:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:29:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9jL-0002Zu-P2; Tue, 18 Oct 2011 06:29:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CW-00030i-0R
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:24 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!12
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1785 invoked from network); 18 Oct 2011 12:55:20 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243218"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:20 -0400
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, 18 Oct 2011 08:55:19 -0400
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
	p9ICsvBV015846;	Tue, 18 Oct 2011 05:55:19 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: e619238cec59fd1439af86043fcdfc2d63f5ab10
Message-ID: <e619238cec59fd1439af.1318942519@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:19 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 24 of 27 v3] libxl: convert VFB handling to
	device API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941403 -3600
# Node ID e619238cec59fd1439af86043fcdfc2d63f5ab10
# Parent  1d28ba74b379c5ebe38b503f8f0dd06c5708b83c
libxl: convert VFB handling to device API

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 1d28ba74b379 -r e619238cec59 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -1896,10 +1896,9 @@ out:
 }
 
 /******************************************************************************/
-void libxl_device_vfb_init(libxl_device_vfb *vfb, int dev_num)
+int libxl_device_vfb_init(libxl_ctx *ctx, libxl_device_vfb *vfb)
 {
     memset(vfb, 0x00, sizeof(libxl_device_vfb));
-    vfb->devid = dev_num;
     vfb->display = NULL;
     vfb->xauthority = NULL;
     vfb->vnc = 1;
@@ -1910,6 +1909,20 @@ void libxl_device_vfb_init(libxl_device_
     vfb->keymap = NULL;
     vfb->sdl = 0;
     vfb->opengl = 0;
+    return 0;
+}
+
+static int libxl__device_from_vfb(libxl__gc *gc, uint32_t domid,
+                                  libxl_device_vfb *vfb,
+                                  libxl__device *device)
+{
+    device->backend_devid = vfb->devid;
+    device->backend_domid = vfb->backend_domid;
+    device->backend_kind = LIBXL__DEVICE_KIND_VFB;
+    device->devid = vfb->devid;
+    device->domid = domid;
+    device->kind = LIBXL__DEVICE_KIND_VFB;
+    return 0;
 }
 
 int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb)
@@ -1931,12 +1944,8 @@ int libxl_device_vfb_add(libxl_ctx *ctx,
         goto out_free;
     }
 
-    device.backend_devid = vfb->devid;
-    device.backend_domid = vfb->backend_domid;
-    device.backend_kind = LIBXL__DEVICE_KIND_VFB;
-    device.devid = vfb->devid;
-    device.domid = domid;
-    device.kind = LIBXL__DEVICE_KIND_VFB;
+    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    if (rc != 0) goto out_free;
 
     flexarray_append_pair(back, "frontend-id", libxl__sprintf(&gc, "%d", domid));
     flexarray_append_pair(back, "online", "1");
@@ -1971,6 +1980,38 @@ out:
     return rc;
 }
 
+int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid,
+                            libxl_device_vfb *vfb)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_remove(&gc, &device, 1);
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
+int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_device_vfb *vfb)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_vfb(&gc, domid, vfb, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_destroy(&gc, &device);
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
 /******************************************************************************/
 
 int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
diff -r 1d28ba74b379 -r e619238cec59 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl.h	Tue Oct 18 13:36:43 2011 +0100
@@ -479,10 +479,11 @@ int libxl_device_vkb_add(libxl_ctx *ctx,
 int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
 int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
 
-void libxl_device_vfb_init(libxl_device_vfb *vfb, int dev_num);
+/* Framebuffer */
+int libxl_device_vfb_init(libxl_ctx *ctx, libxl_device_vfb *vfb);
 int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
-int libxl_device_vfb_clean_shutdown(libxl_ctx *ctx, uint32_t domid);
-int libxl_device_vfb_hard_shutdown(libxl_ctx *ctx, uint32_t domid);
+int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
+int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
 
 int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev);
 int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev, int force);
diff -r 1d28ba74b379 -r e619238cec59 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -853,7 +853,8 @@ skip:
 
             d_config->vfbs = (libxl_device_vfb *) realloc(d_config->vfbs, sizeof(libxl_device_vfb) * (d_config->num_vfbs + 1));
             vfb = d_config->vfbs + d_config->num_vfbs;
-            libxl_device_vfb_init(vfb, d_config->num_vfbs);
+            libxl_device_vfb_init(ctx, vfb);
+            vfb->devid = d_config->num_vfbs;
 
             d_config->vkbs = (libxl_device_vkb *) realloc(d_config->vkbs, sizeof(libxl_device_vkb) * (d_config->num_vkbs + 1));
             vkb = d_config->vkbs + d_config->num_vkbs;
diff -r 1d28ba74b379 -r e619238cec59 tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:43 2011 +0100
@@ -22,10 +22,7 @@ DEVICE_FUNCTIONS = [ ("add",            
                    ]
 
 functions = { # ( name , [type1,type2,....] )
-    "device_vfb":     [ ("add",            ["t", "domid", "unit"]),
-                        ("clean_shutdown", ["domid", "unit"]),
-                        ("hard_shutdown",  ["domid", "unit"]),
-                      ],
+    "device_vfb":     DEVICE_FUNCTIONS,
     "device_vkb":     DEVICE_FUNCTIONS,
     "device_disk":    DEVICE_FUNCTIONS,
     "device_nic":     DEVICE_FUNCTIONS,
diff -r 1d28ba74b379 -r e619238cec59 tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:43 2011 +0100
@@ -360,14 +360,17 @@ value stub_xl_device_vfb_add(value info,
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_vfb_clean_shutdown(value domid)
+value stub_xl_device_vfb_remove(value info, value domid)
 {
 	CAMLparam1(domid);
+	libxl_device_vfb c_info;
 	int ret;
 	INIT_STRUCT();
 
+	device_vfb_val(&gc, &lg, &c_info, info);
+
 	INIT_CTX();
-	ret = libxl_device_vfb_clean_shutdown(ctx, Int_val(domid));
+	ret = libxl_device_vfb_remove(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("vfb_clean_shutdown", &lg);
 	FREE_CTX();
@@ -375,14 +378,17 @@ value stub_xl_device_vfb_clean_shutdown(
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_vfb_hard_shutdown(value domid)
+value stub_xl_device_vfb_destroy(value info, value domid)
 {
 	CAMLparam1(domid);
+	libxl_device_vfb c_info;
 	int ret;
 	INIT_STRUCT();
 
+	device_vfb_val(&gc, &lg, &c_info, info);
+
 	INIT_CTX();
-	ret = libxl_device_vfb_hard_shutdown(ctx, Int_val(domid));
+	ret = libxl_device_vfb_destroy(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("vfb_hard_shutdown", &lg);
 	FREE_CTX();

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:30:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:30:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9kQ-00033H-Kd; Tue, 18 Oct 2011 06:30:26 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CX-00030m-4j
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:26 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!13
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1852 invoked from network); 18 Oct 2011 12:55:21 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243222"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:21 -0400
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, 18 Oct 2011 08:55:20 -0400
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
	p9ICsvBW015846;	Tue, 18 Oct 2011 05:55:19 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 9a75cc1499dacfd7fc8c1430d77a14f218cd6206
Message-ID: <9a75cc1499dacfd7fc8c.1318942520@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:20 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 25 of 27 v3] libxl: reorder device functions to
 put functions for each device together
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941403 -3600
# Node ID 9a75cc1499dacfd7fc8c1430d77a14f218cd6206
# Parent  e619238cec59fd1439af86043fcdfc2d63f5ab10
libxl: reorder device functions to put functions for each device together.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r e619238cec59 -r 9a75cc1499da tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -1113,6 +1113,216 @@ out:
     libxl__free_all(&gc);
     return rc;
 }
+
+static void libxl__device_disk_from_xs_be(libxl__gc *gc,
+                                          const char *be_path,
+                                          libxl_device_disk *disk)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    unsigned int len;
+    char *tmp;
+
+    libxl_device_disk_init(ctx, disk);
+
+    tmp = xs_read(ctx->xsh, XBT_NULL,
+                  libxl__sprintf(gc, "%s/params", be_path), &len);
+    if (tmp && strchr(tmp, ':')) {
+        disk->pdev_path = strdup(strchr(tmp, ':') + 1);
+        free(tmp);
+    } else {
+        disk->pdev_path = tmp;
+    }
+    libxl_string_to_backend(ctx,
+                        libxl__xs_read(gc, XBT_NULL,
+                                       libxl__sprintf(gc, "%s/type", be_path)),
+                        &(disk->backend));
+    disk->vdev = xs_read(ctx->xsh, XBT_NULL,
+                         libxl__sprintf(gc, "%s/dev", be_path), &len);
+    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf
+                         (gc, "%s/removable", be_path));
+
+    if (tmp)
+        disk->removable = atoi(tmp);
+    else
+        disk->removable = 0;
+
+    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", be_path));
+    if (!strcmp(tmp, "w"))
+        disk->readwrite = 1;
+    else
+        disk->readwrite = 0;
+
+    tmp = libxl__xs_read(gc, XBT_NULL,
+                         libxl__sprintf(gc, "%s/device-type", be_path));
+    disk->is_cdrom = !strcmp(tmp, "cdrom");
+
+    disk->format = LIBXL_DISK_FORMAT_UNKNOWN;
+}
+
+int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
+                               int devid, libxl_device_disk *disk)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *dompath, *path;
+    int rc = ERROR_FAIL;
+
+    libxl_device_disk_init(ctx, disk);
+
+    dompath = libxl__xs_get_dompath(&gc, domid);
+    if (!dompath) {
+        goto out;
+    }
+    path = libxl__xs_read(&gc, XBT_NULL,
+                          libxl__sprintf(&gc, "%s/device/vbd/%d/backend",
+                                         dompath, devid));
+    if (!path)
+        goto out;
+
+    libxl__device_disk_from_xs_be(&gc, path, disk);
+
+    rc = 0;
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
+
+
+static int libxl__append_disk_list_of_type(libxl__gc *gc,
+                                           uint32_t domid,
+                                           const char *type,
+                                           libxl_device_disk **disks,
+                                           int *ndisks)
+{
+    char *be_path = NULL;
+    char **dir = NULL;
+    unsigned int n = 0;
+    libxl_device_disk *pdisk = NULL, *pdisk_end = NULL;
+
+    be_path = libxl__sprintf(gc, "%s/backend/%s/%d",
+                             libxl__xs_get_dompath(gc, 0), type, domid);
+    dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n);
+    if (dir) {
+        libxl_device_disk *tmp;
+        tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
+        if (tmp == NULL)
+            return ERROR_NOMEM;
+        *disks = tmp;
+        pdisk = *disks + *ndisks;
+        *ndisks += n;
+        pdisk_end = *disks + *ndisks;
+        for (; pdisk < pdisk_end; pdisk++, dir++) {
+            const char *p;
+            p = libxl__sprintf(gc, "%s/%s", be_path, *dir);
+            libxl__device_disk_from_xs_be(gc, p, pdisk);
+            pdisk->backend_domid = 0;
+        }
+    }
+    return 0;
+}
+
+libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl_device_disk *disks = NULL;
+    int rc;
+
+    *num = 0;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num);
+    if (rc) goto out_err;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num);
+    if (rc) goto out_err;
+
+    rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num);
+    if (rc) goto out_err;
+
+    libxl__free_all(&gc);
+    return disks;
+
+out_err:
+    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list disks");
+    while (disks && *num) {
+        (*num)--;
+        libxl_device_disk_dispose(&disks[*num]);
+    }
+    free(disks);
+    return NULL;
+}
+
+int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
+                              libxl_device_disk *disk, libxl_diskinfo *diskinfo)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *dompath, *diskpath;
+    char *val;
+
+    dompath = libxl__xs_get_dompath(&gc, domid);
+    diskinfo->devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
+
+    /* tap devices entries in xenstore are written as vbd devices. */
+    diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
+    diskinfo->backend = xs_read(ctx->xsh, XBT_NULL,
+                                libxl__sprintf(&gc, "%s/backend", diskpath), NULL);
+    if (!diskinfo->backend) {
+        libxl__free_all(&gc);
+        return ERROR_FAIL;
+    }
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath));
+    diskinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", diskpath));
+    diskinfo->state = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", diskpath));
+    diskinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/ring-ref", diskpath));
+    diskinfo->rref = val ? strtoul(val, NULL, 10) : -1;
+    diskinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
+                                 libxl__sprintf(&gc, "%s/frontend", diskinfo->backend), NULL);
+    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", diskinfo->backend));
+    diskinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
+
+    libxl__free_all(&gc);
+    return 0;
+}
+
+int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
+{
+    int num, i;
+    uint32_t stubdomid;
+    libxl_device_disk *disks;
+    int ret = ERROR_FAIL;
+
+    if (!disk->pdev_path) {
+        disk->pdev_path = strdup("");
+        disk->format = LIBXL_DISK_FORMAT_EMPTY;
+    }
+    disks = libxl_device_disk_list(ctx, domid, &num);
+    for (i = 0; i < num; i++) {
+        if (disks[i].is_cdrom && !strcmp(disk->vdev, disks[i].vdev))
+            /* found */
+            break;
+    }
+    if (i == num) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Virtual device not found");
+        goto out;
+    }
+
+    ret = 0;
+
+    libxl_device_disk_remove(ctx, domid, disks + i);
+    libxl_device_disk_add(ctx, domid, disk);
+    stubdomid = libxl_get_stubdom_id(ctx, domid);
+    if (stubdomid) {
+        libxl_device_disk_remove(ctx, stubdomid, disks + i);
+        libxl_device_disk_add(ctx, stubdomid, disk);
+    }
+out:
+    for (i = 0; i < num; i++)
+        libxl_device_disk_dispose(&disks[i]);
+    free(disks);
+    return ret;
+}
+
 char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
@@ -1346,6 +1556,7 @@ out:
     libxl__free_all(&gc);
     return rc;
 }
+
 static void libxl__device_nic_from_xs_be(libxl__gc *gc,
                                          const char *be_path,
                                          libxl_device_nic *nic)
@@ -1686,215 +1897,6 @@ out:
     return rc;
 }
 
-static void libxl__device_disk_from_xs_be(libxl__gc *gc,
-                                          const char *be_path,
-                                          libxl_device_disk *disk)
-{
-    libxl_ctx *ctx = libxl__gc_owner(gc);
-    unsigned int len;
-    char *tmp;
-
-    libxl_device_disk_init(ctx, disk);
-
-    tmp = xs_read(ctx->xsh, XBT_NULL,
-                  libxl__sprintf(gc, "%s/params", be_path), &len);
-    if (tmp && strchr(tmp, ':')) {
-        disk->pdev_path = strdup(strchr(tmp, ':') + 1);
-        free(tmp);
-    } else {
-        disk->pdev_path = tmp;
-    }
-    libxl_string_to_backend(ctx,
-                        libxl__xs_read(gc, XBT_NULL,
-                                       libxl__sprintf(gc, "%s/type", be_path)),
-                        &(disk->backend));
-    disk->vdev = xs_read(ctx->xsh, XBT_NULL,
-                         libxl__sprintf(gc, "%s/dev", be_path), &len);
-    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf
-                         (gc, "%s/removable", be_path));
-
-    if (tmp)
-        disk->removable = atoi(tmp);
-    else
-        disk->removable = 0;
-
-    tmp = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/mode", be_path));
-    if (!strcmp(tmp, "w"))
-        disk->readwrite = 1;
-    else
-        disk->readwrite = 0;
-
-    tmp = libxl__xs_read(gc, XBT_NULL,
-                         libxl__sprintf(gc, "%s/device-type", be_path));
-    disk->is_cdrom = !strcmp(tmp, "cdrom");
-
-    disk->format = LIBXL_DISK_FORMAT_UNKNOWN;
-}
-
-int libxl_devid_to_device_disk(libxl_ctx *ctx, uint32_t domid,
-                               int devid, libxl_device_disk *disk)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath, *path;
-    int rc = ERROR_FAIL;
-
-    libxl_device_disk_init(ctx, disk);
-
-    dompath = libxl__xs_get_dompath(&gc, domid);
-    if (!dompath) {
-        goto out;
-    }
-    path = libxl__xs_read(&gc, XBT_NULL,
-                          libxl__sprintf(&gc, "%s/device/vbd/%d/backend",
-                                         dompath, devid));
-    if (!path)
-        goto out;
-
-    libxl__device_disk_from_xs_be(&gc, path, disk);
-
-    rc = 0;
-out:
-    libxl__free_all(&gc);
-    return rc;
-}
-
-
-static int libxl__append_disk_list_of_type(libxl__gc *gc,
-                                           uint32_t domid,
-                                           const char *type,
-                                           libxl_device_disk **disks,
-                                           int *ndisks)
-{
-    char *be_path = NULL;
-    char **dir = NULL;
-    unsigned int n = 0;
-    libxl_device_disk *pdisk = NULL, *pdisk_end = NULL;
-
-    be_path = libxl__sprintf(gc, "%s/backend/%s/%d",
-                             libxl__xs_get_dompath(gc, 0), type, domid);
-    dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n);
-    if (dir) {
-        libxl_device_disk *tmp;
-        tmp = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n));
-        if (tmp == NULL)
-            return ERROR_NOMEM;
-        *disks = tmp;
-        pdisk = *disks + *ndisks;
-        *ndisks += n;
-        pdisk_end = *disks + *ndisks;
-        for (; pdisk < pdisk_end; pdisk++, dir++) {
-            const char *p;
-            p = libxl__sprintf(gc, "%s/%s", be_path, *dir);
-            libxl__device_disk_from_xs_be(gc, p, pdisk);
-            pdisk->backend_domid = 0;
-        }
-    }
-    return 0;
-}
-
-libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    libxl_device_disk *disks = NULL;
-    int rc;
-
-    *num = 0;
-
-    rc = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, num);
-    if (rc) goto out_err;
-
-    rc = libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, num);
-    if (rc) goto out_err;
-
-    rc = libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, num);
-    if (rc) goto out_err;
-
-    libxl__free_all(&gc);
-    return disks;
-
-out_err:
-    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to list disks");
-    while (disks && *num) {
-        (*num)--;
-        libxl_device_disk_dispose(&disks[*num]);
-    }
-    free(disks);
-    return NULL;
-}
-
-int libxl_device_disk_getinfo(libxl_ctx *ctx, uint32_t domid,
-                              libxl_device_disk *disk, libxl_diskinfo *diskinfo)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *dompath, *diskpath;
-    char *val;
-
-    dompath = libxl__xs_get_dompath(&gc, domid);
-    diskinfo->devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL);
-
-    /* tap devices entries in xenstore are written as vbd devices. */
-    diskpath = libxl__sprintf(&gc, "%s/device/vbd/%d", dompath, diskinfo->devid);
-    diskinfo->backend = xs_read(ctx->xsh, XBT_NULL,
-                                libxl__sprintf(&gc, "%s/backend", diskpath), NULL);
-    if (!diskinfo->backend) {
-        libxl__free_all(&gc);
-        return ERROR_FAIL;
-    }
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend-id", diskpath));
-    diskinfo->backend_id = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/state", diskpath));
-    diskinfo->state = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/event-channel", diskpath));
-    diskinfo->evtch = val ? strtoul(val, NULL, 10) : -1;
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/ring-ref", diskpath));
-    diskinfo->rref = val ? strtoul(val, NULL, 10) : -1;
-    diskinfo->frontend = xs_read(ctx->xsh, XBT_NULL,
-                                 libxl__sprintf(&gc, "%s/frontend", diskinfo->backend), NULL);
-    val = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/frontend-id", diskinfo->backend));
-    diskinfo->frontend_id = val ? strtoul(val, NULL, 10) : -1;
-
-    libxl__free_all(&gc);
-    return 0;
-}
-
-int libxl_cdrom_insert(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disk)
-{
-    int num, i;
-    uint32_t stubdomid;
-    libxl_device_disk *disks;
-    int ret = ERROR_FAIL;
-
-    if (!disk->pdev_path) {
-        disk->pdev_path = strdup("");
-        disk->format = LIBXL_DISK_FORMAT_EMPTY;
-    }
-    disks = libxl_device_disk_list(ctx, domid, &num);
-    for (i = 0; i < num; i++) {
-        if (disks[i].is_cdrom && !strcmp(disk->vdev, disks[i].vdev))
-            /* found */
-            break;
-    }
-    if (i == num) {
-        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Virtual device not found");
-        goto out;
-    }
-
-    ret = 0;
-
-    libxl_device_disk_remove(ctx, domid, disks + i);
-    libxl_device_disk_add(ctx, domid, disk);
-    stubdomid = libxl_get_stubdom_id(ctx, domid);
-    if (stubdomid) {
-        libxl_device_disk_remove(ctx, stubdomid, disks + i);
-        libxl_device_disk_add(ctx, stubdomid, disk);
-    }
-out:
-    for (i = 0; i < num; i++)
-        libxl_device_disk_dispose(&disks[i]);
-    free(disks);
-    return ret;
-}
-
 /******************************************************************************/
 int libxl_device_vfb_init(libxl_ctx *ctx, libxl_device_vfb *vfb)
 {

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:31:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:31:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9lL-0003Qx-3R; Tue, 18 Oct 2011 06:31:23 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9CY-000310-AA
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:26 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318942500!35773347!14
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1984 invoked from network); 18 Oct 2011 12:55:23 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:23 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="167243226"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:22 -0400
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, 18 Oct 2011 08:55:22 -0400
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
	p9ICsvBY015846;	Tue, 18 Oct 2011 05:55:21 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 12ac478d1b56f0ff4d3242138b780c551a69f107
Message-ID: <12ac478d1b56f0ff4d32.1318942522@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:22 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 27 of 27 v3] libxl: add a flags argument to
	libxl_ctx_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

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318941403 -3600
# Node ID 12ac478d1b56f0ff4d3242138b780c551a69f107
# Parent  0bfe1face70308bbb72d5e3ce46e86f8933466f8
libxl: add a flags argument to libxl_ctx_alloc.

Currently unused but gives us scope for expansion in an ABI compatible manner
in the future.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 0bfe1face703 -r 12ac478d1b56 tools/libxl/gentest.py
--- a/tools/libxl/gentest.py	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/gentest.py	Tue Oct 18 13:36:43 2011 +0100
@@ -239,7 +239,7 @@ int main(int argc, char **argv)
     logger = xtl_createlogger_stdiostream(stderr, XTL_DETAIL, 0);
     if (!logger) exit(1);
 
-    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, (xentoollog_logger*)logger)) {
+    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (xentoollog_logger*)logger)) {
         fprintf(stderr, "cannot init xl context\\n");
         exit(1);
     }
diff -r 0bfe1face703 -r 12ac478d1b56 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -39,7 +39,8 @@
 #define PAGE_TO_MEMKB(pages) ((pages) * 4)
 #define BACKEND_STRING_SIZE 5
 
-int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
+int libxl_ctx_alloc(libxl_ctx **pctx, int version,
+                    unsigned flags, xentoollog_logger * lg)
 {
     libxl_ctx *ctx;
     struct stat stat_buf;
diff -r 0bfe1face703 -r 12ac478d1b56 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl.h	Tue Oct 18 13:36:43 2011 +0100
@@ -245,7 +245,9 @@ typedef struct {
 } libxl_domain_config;
 
 /* context functions */
-int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger *lg);
+int libxl_ctx_alloc(libxl_ctx **pctx, int version,
+                    unsigned flags /* none currently defined */,
+                    xentoollog_logger *lg);
 int libxl_ctx_free(libxl_ctx *ctx /* 0 is OK */);
 int libxl_ctx_postfork(libxl_ctx *ctx);
 
diff -r 0bfe1face703 -r 12ac478d1b56 tools/libxl/xl.c
--- a/tools/libxl/xl.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/xl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -116,7 +116,7 @@ int main(int argc, char **argv)
     logger = xtl_createlogger_stdiostream(stderr, minmsglevel,  0);
     if (!logger) exit(1);
 
-    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, (xentoollog_logger*)logger)) {
+    if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (xentoollog_logger*)logger)) {
         fprintf(stderr, "cannot init xl context\n");
         exit(1);
     }
diff -r 0bfe1face703 -r 12ac478d1b56 tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:43 2011 +0100
@@ -59,7 +59,7 @@ static void log_destroy(struct xentoollo
 	lg.logger.destroy = log_destroy; \
 	lg.logger.progress = NULL; \
 	caml_enter_blocking_section(); \
-	ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, (struct xentoollog_logger *) &lg); \
+	ret = libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (struct xentoollog_logger *) &lg); \
 	if (ret != 0) \
 		failwith_xl("cannot init context", &lg);
 
diff -r 0bfe1face703 -r 12ac478d1b56 tools/python/xen/lowlevel/xl/xl.c
--- a/tools/python/xen/lowlevel/xl/xl.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/python/xen/lowlevel/xl/xl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -687,7 +687,7 @@ PyXl_init(XlObject *self, PyObject *args
         return -1;
     }
 
-    if ( libxl_ctx_alloc(&self->ctx, LIBXL_VERSION,
+    if ( libxl_ctx_alloc(&self->ctx, LIBXL_VERSION, 0,
                 (xentoollog_logger*)self->logger) ) {
         PyErr_SetString(xl_error_obj, "cannot init xl context");
         return -1;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:32:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06: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 1RG9mN-0003v8-I7; Tue, 18 Oct 2011 06:32:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9Cj-000337-HN
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:38 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318942532!57539!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14217 invoked from network); 18 Oct 2011 12:55:34 -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;
	18 Oct 2011 12:55:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309455"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:19 -0400
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, 18 Oct 2011 08:55:18 -0400
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
	p9ICsvBU015846;	Tue, 18 Oct 2011 05:55:18 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1d28ba74b379c5ebe38b503f8f0dd06c5708b83c
Message-ID: <1d28ba74b379c5ebe38b.1318942518@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:18 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 23 of 27 v3] libxl: convert VKB handling to
	device API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941403 -3600
# Node ID 1d28ba74b379c5ebe38b503f8f0dd06c5708b83c
# Parent  c8eab687999d2927a0a4581a6bf09deeadcbff13
libxl: convert VKB handling to device API

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r c8eab687999d -r 1d28ba74b379 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -1586,10 +1586,24 @@ out:
 }
 
 /******************************************************************************/
-void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num)
+int libxl_device_vkb_init(libxl_ctx *ctx, libxl_device_vkb *vkb)
 {
     memset(vkb, 0x00, sizeof(libxl_device_vkb));
-    vkb->devid = dev_num;
+    return 0;
+}
+
+static int libxl__device_from_vkb(libxl__gc *gc, uint32_t domid,
+                                  libxl_device_vkb *vkb,
+                                  libxl__device *device)
+{
+    device->backend_devid = vkb->devid;
+    device->backend_domid = vkb->backend_domid;
+    device->backend_kind = LIBXL__DEVICE_KIND_VKBD;
+    device->devid = vkb->devid;
+    device->domid = domid;
+    device->kind = LIBXL__DEVICE_KIND_VKBD;
+
+    return 0;
 }
 
 int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb)
@@ -1611,12 +1625,8 @@ int libxl_device_vkb_add(libxl_ctx *ctx,
         goto out_free;
     }
 
-    device.backend_devid = vkb->devid;
-    device.backend_domid = vkb->backend_domid;
-    device.backend_kind = LIBXL__DEVICE_KIND_VKBD;
-    device.devid = vkb->devid;
-    device.domid = domid;
-    device.kind = LIBXL__DEVICE_KIND_VKBD;
+    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    if (rc != 0) goto out_free;
 
     flexarray_append(back, "frontend-id");
     flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
@@ -1644,14 +1654,36 @@ out:
     return rc;
 }
 
-int libxl_device_vkb_clean_shutdown(libxl_ctx *ctx, uint32_t domid)
+int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid,
+                            libxl_device_vkb *vkb)
 {
-    return ERROR_NI;
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_remove(&gc, &device, 1);
+out:
+    libxl__free_all(&gc);
+    return rc;
 }
 
-int libxl_device_vkb_hard_shutdown(libxl_ctx *ctx, uint32_t domid)
+int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_device_vkb *vkb)
 {
-    return ERROR_NI;
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_vkb(&gc, domid, vkb, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_destroy(&gc, &device);
+out:
+    libxl__free_all(&gc);
+    return rc;
 }
 
 static void libxl__device_disk_from_xs_be(libxl__gc *gc,
@@ -1939,16 +1971,6 @@ out:
     return rc;
 }
 
-int libxl_device_vfb_clean_shutdown(libxl_ctx *ctx, uint32_t domid)
-{
-    return ERROR_NI;
-}
-
-int libxl_device_vfb_hard_shutdown(libxl_ctx *ctx, uint32_t domid)
-{
-    return ERROR_NI;
-}
-
 /******************************************************************************/
 
 int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t domid, uint32_t max_memkb)
diff -r c8eab687999d -r 1d28ba74b379 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl.h	Tue Oct 18 13:36:43 2011 +0100
@@ -473,10 +473,11 @@ libxl_device_nic *libxl_device_nic_list(
 int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_nic *nic, libxl_nicinfo *nicinfo);
 
-void libxl_device_vkb_init(libxl_device_vkb *vkb, int dev_num);
+/* Keyboard */
+int libxl_device_vkb_init(libxl_ctx *ctx, libxl_device_vkb *vkb);
 int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
-int libxl_device_vkb_clean_shutdown(libxl_ctx *ctx, uint32_t domid);
-int libxl_device_vkb_hard_shutdown(libxl_ctx *ctx, uint32_t domid);
+int libxl_device_vkb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
+int libxl_device_vkb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb);
 
 void libxl_device_vfb_init(libxl_device_vfb *vfb, int dev_num);
 int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
diff -r c8eab687999d -r 1d28ba74b379 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -857,7 +857,8 @@ skip:
 
             d_config->vkbs = (libxl_device_vkb *) realloc(d_config->vkbs, sizeof(libxl_device_vkb) * (d_config->num_vkbs + 1));
             vkb = d_config->vkbs + d_config->num_vkbs;
-            libxl_device_vkb_init(vkb, d_config->num_vkbs);
+            libxl_device_vkb_init(ctx, vkb);
+            vkb->devid = d_config->num_vkbs;
 
             p = strtok(buf2, ",");
             if (!p)
diff -r c8eab687999d -r 1d28ba74b379 tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:43 2011 +0100
@@ -26,10 +26,7 @@ functions = { # ( name , [type1,type2,..
                         ("clean_shutdown", ["domid", "unit"]),
                         ("hard_shutdown",  ["domid", "unit"]),
                       ],
-    "device_vkb":     [ ("add",            ["t", "domid", "unit"]),
-                        ("clean_shutdown", ["domid", "unit"]),
-                        ("hard_shutdown",  ["domid", "unit"]),
-                      ],
+    "device_vkb":     DEVICE_FUNCTIONS,
     "device_disk":    DEVICE_FUNCTIONS,
     "device_nic":     DEVICE_FUNCTIONS,
     "device_pci":     [ ("add",            ["t", "domid", "unit"]),
diff -r c8eab687999d -r 1d28ba74b379 tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:43 2011 +0100
@@ -306,14 +306,17 @@ value stub_xl_device_vkb_add(value info,
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_vkb_clean_shutdown(value domid)
+value stub_xl_device_vkb_remove(value info, value domid)
 {
 	CAMLparam1(domid);
+	libxl_device_vkb c_info;
 	int ret;
 	INIT_STRUCT();
 
+	device_vkb_val(&gc, &lg, &c_info, info);
+
 	INIT_CTX();
-	ret = libxl_device_vkb_clean_shutdown(ctx, Int_val(domid));
+	ret = libxl_device_vkb_remove(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("vkb_clean_shutdown", &lg);
 	FREE_CTX();
@@ -321,14 +324,17 @@ value stub_xl_device_vkb_clean_shutdown(
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_vkb_hard_shutdown(value domid)
+value stub_xl_device_vkb_destroy(value info, value domid)
 {
 	CAMLparam1(domid);
+	libxl_device_vkb c_info;
 	int ret;
 	INIT_STRUCT();
 
+	device_vkb_val(&gc, &lg, &c_info, info);
+
 	INIT_CTX();
-	ret = libxl_device_vkb_hard_shutdown(ctx, Int_val(domid));
+	ret = libxl_device_vkb_destroy(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("vkb_hard_shutdown", &lg);
 	FREE_CTX();

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:33:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:33:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9n8-0004JF-Qd; Tue, 18 Oct 2011 06:33:14 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9Ci-00032y-QN
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:38 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318942532!57539!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14197 invoked from network); 18 Oct 2011 12:55:33 -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;
	18 Oct 2011 12:55:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309454"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:17 -0400
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, 18 Oct 2011 08:55:17 -0400
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
	p9ICsvBS015846;	Tue, 18 Oct 2011 05:55:16 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 576b80340b0e92360792399d67aa26002b2771fc
Message-ID: <576b80340b0e92360792.1318942516@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:16 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 21 of 27 v3] libxl: convert NIC handling to
	device API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941402 -3600
# Node ID 576b80340b0e92360792399d67aa26002b2771fc
# Parent  c245f495b53be00648e2bae4911675142e72e9c8
libxl: convert NIC handling to device API

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r c245f495b53b -r 576b80340b0e tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -1187,32 +1187,46 @@ int libxl_device_disk_local_detach(libxl
 }
 
 /******************************************************************************/
-int libxl_device_nic_init(libxl_device_nic *nic_info, int devnum)
+int libxl_device_nic_init(libxl_ctx *ctx, libxl_device_nic *nic)
 {
     const uint8_t *r;
     libxl_uuid uuid;
 
     libxl_uuid_generate(&uuid);
     r = libxl_uuid_bytearray(&uuid);
-    memset(nic_info, '\0', sizeof(*nic_info));
-
-    nic_info->backend_domid = 0;
-    nic_info->devid = devnum;
-    nic_info->mtu = 1492;
-    nic_info->model = strdup("rtl8139");
-    nic_info->mac[0] = 0x00;
-    nic_info->mac[1] = 0x16;
-    nic_info->mac[2] = 0x3e;
-    nic_info->mac[3] = r[0] & 0x7f;
-    nic_info->mac[4] = r[1];
-    nic_info->mac[5] = r[2];
-    nic_info->ifname = NULL;
-    nic_info->bridge = strdup("xenbr0");
-    nic_info->ip = NULL;
-    if ( asprintf(&nic_info->script, "%s/vif-bridge",
+    memset(nic, '\0', sizeof(*nic));
+
+    nic->backend_domid = 0;
+    nic->devid = -1;
+    nic->mtu = 1492;
+    nic->model = strdup("rtl8139");
+    nic->mac[0] = 0x00;
+    nic->mac[1] = 0x16;
+    nic->mac[2] = 0x3e;
+    nic->mac[3] = r[0] & 0x7f;
+    nic->mac[4] = r[1];
+    nic->mac[5] = r[2];
+    nic->ifname = NULL;
+    nic->bridge = strdup("xenbr0");
+    nic->ip = NULL;
+    if ( asprintf(&nic->script, "%s/vif-bridge",
                libxl_xen_script_dir_path()) < 0 )
         return ERROR_FAIL;
-    nic_info->nictype = LIBXL_NIC_TYPE_IOEMU;
+    nic->nictype = LIBXL_NIC_TYPE_IOEMU;
+    return 0;
+}
+
+static int libxl__device_from_nic(libxl__gc *gc, uint32_t domid,
+                                  libxl_device_nic *nic,
+                                  libxl__device *device)
+{
+    device->backend_devid    = nic->devid;
+    device->backend_domid    = nic->backend_domid;
+    device->backend_kind     = LIBXL__DEVICE_KIND_VIF;
+    device->devid            = nic->devid;
+    device->domid            = domid;
+    device->kind             = LIBXL__DEVICE_KIND_VIF;
+
     return 0;
 }
 
@@ -1249,12 +1263,8 @@ int libxl_device_nic_add(libxl_ctx *ctx,
         }
     }
 
-    device.backend_devid = nic->devid;
-    device.backend_domid = nic->backend_domid;
-    device.backend_kind = LIBXL__DEVICE_KIND_VIF;
-    device.devid = nic->devid;
-    device.domid = domid;
-    device.kind = LIBXL__DEVICE_KIND_VIF;
+    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    if ( rc != 0 ) goto out_free;
 
     flexarray_append(back, "frontend-id");
     flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
@@ -1305,29 +1315,37 @@ out:
     return rc;
 }
 
-int libxl_device_nic_del(libxl_ctx *ctx, uint32_t domid,
-                         libxl_device_nic *nic, int wait)
+int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid,
+                            libxl_device_nic *nic)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     libxl__device device;
     int rc;
 
-    device.backend_devid    = nic->devid;
-    device.backend_domid    = nic->backend_domid;
-    device.backend_kind     = LIBXL__DEVICE_KIND_VIF;
-    device.devid            = nic->devid;
-    device.domid            = domid;
-    device.kind             = LIBXL__DEVICE_KIND_VIF;
-
-    if (wait)
-        rc = libxl__device_remove(&gc, &device, wait);
-    else
-        rc = libxl__device_destroy(&gc, &device);
-
+    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_remove(&gc, &device, 1);
+out:
     libxl__free_all(&gc);
     return rc;
 }
 
+int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_device_nic *nic)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    libxl__device device;
+    int rc;
+
+    rc = libxl__device_from_nic(&gc, domid, nic, &device);
+    if (rc != 0) goto out;
+
+    rc = libxl__device_destroy(&gc, &device);
+out:
+    libxl__free_all(&gc);
+    return rc;
+}
 static void libxl__device_nic_from_xs_be(libxl__gc *gc,
                                          const char *be_path,
                                          libxl_device_nic *nic)
diff -r c245f495b53b -r 576b80340b0e tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.h	Tue Oct 18 13:36:42 2011 +0100
@@ -463,9 +463,12 @@ int libxl_cdrom_insert(libxl_ctx *ctx, u
 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_nic_init(libxl_device_nic *nic, int dev_num);
+/* Network Interfaces */
+int libxl_device_nic_init(libxl_ctx *ctx, libxl_device_nic *nic);
 int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic);
-int libxl_device_nic_del(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic, int wait);
+int libxl_device_nic_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic);
+int libxl_device_nic_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic);
+
 libxl_device_nic *libxl_device_nic_list(libxl_ctx *ctx, uint32_t domid, int *num);
 int libxl_device_nic_getinfo(libxl_ctx *ctx, uint32_t domid,
                               libxl_device_nic *nic, libxl_nicinfo *nicinfo);
diff -r c245f495b53b -r 576b80340b0e tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -762,7 +762,8 @@ static void parse_config_data(const char
 
             d_config->vifs = (libxl_device_nic *) realloc(d_config->vifs, sizeof (libxl_device_nic) * (d_config->num_vifs+1));
             nic = d_config->vifs + d_config->num_vifs;
-            CHK_ERRNO( libxl_device_nic_init(nic, d_config->num_vifs) );
+            CHK_ERRNO( libxl_device_nic_init(ctx, nic) );
+            nic->devid = d_config->num_vifs;
 
             if (default_vifscript) {
                 free(nic->script);
@@ -3972,7 +3973,7 @@ int main_networkattach(int argc, char **
         fprintf(stderr, "%s is an invalid domain identifier\n", argv[optind]);
         return 1;
     }
-    libxl_device_nic_init(&nic, -1);
+    libxl_device_nic_init(ctx, &nic);
     for (argv += optind+1, argc -= optind+1; argc > 0; ++argv, --argc) {
         if (MATCH_OPTION("type", *argv, oparg)) {
             if (!strcmp("vif", oparg)) {
@@ -4089,7 +4090,7 @@ int main_networkdetach(int argc, char **
             return 1;
         }
     }
-    if (libxl_device_nic_del(ctx, domid, &nic, 1)) {
+    if (libxl_device_nic_remove(ctx, domid, &nic)) {
         fprintf(stderr, "libxl_device_nic_del failed.\n");
         return 1;
     }
diff -r c245f495b53b -r 576b80340b0e tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:42 2011 +0100
@@ -33,9 +33,7 @@ functions = { # ( name , [type1,type2,..
     "device_console": [ ("add",            ["t", "domid", "unit"]),
                       ],
     "device_disk":    DEVICE_FUNCTIONS,
-    "device_nic":     [ ("add",            ["t", "domid", "unit"]),
-                        ("del",            ["t", "domid", "unit"]),
-                      ],
+    "device_nic":     DEVICE_FUNCTIONS,
     "device_pci":     [ ("add",            ["t", "domid", "unit"]),
                         ("remove",         ["t", "domid", "unit"]),
                         ("shutdown",       ["domid", "unit"]),
diff -r c245f495b53b -r 576b80340b0e tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:42 2011 +0100
@@ -281,7 +281,7 @@ value stub_xl_device_nic_del(value info,
 	device_nic_val(&gc, &lg, &c_info, info);
 
 	INIT_CTX();
-	ret = libxl_device_nic_del(ctx, Int_val(domid), &c_info, 0);
+	ret = libxl_device_nic_remove(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("nic_del", &lg);
 	FREE_CTX();

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:34:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:34:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9nt-0004hN-HQ; Tue, 18 Oct 2011 06:34:01 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9Cl-00033n-0G
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:39 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318942532!57539!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14332 invoked from network); 18 Oct 2011 12:55:35 -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;
	18 Oct 2011 12:55:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309450"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:10 -0400
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, 18 Oct 2011 08:55:10 -0400
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
	p9ICsvBK015846;	Tue, 18 Oct 2011 05:55:09 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 16805eff73bdac4758dc84a3507918e5697df30a
Message-ID: <16805eff73bdac4758dc.1318942508@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:08 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 13 of 27 v3] libxl: separate forced and
 non-forced device remove
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941402 -3600
# Node ID 16805eff73bdac4758dc84a3507918e5697df30a
# Parent  da6b91661078fcf10247f8aab06a12c2bc2b2eb1
libxl: separate forced and non-forced device remove.

The function libxl__device_destroy currently takes a force parameter however:

  * in the forced case we initiate a graceful shutdown and then immediately
    nuke the backend directory, quite likely before anyone got a chance to react.
  * the callers all have a "wait" variable and pass in "!wait" as the force
    argument which is confusing since not waiting is not really the same thing
    as forcing the destroy.

Therefore split the function into libxl__device_remove and
libxl__device_destroy. The former initiates a graceful shutdown which
the latter simply nukes the backend directory.

This makes some of the callers look a bit odd but that should fall out as I
continue to pull this piece of string.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r da6b91661078 -r 16805eff73bd tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
@@ -365,7 +365,7 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
-int libxl__device_destroy(libxl__gc *gc, char *be_path, int force)
+int libxl__device_remove(libxl__gc *gc, char *be_path)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     xs_transaction_t t;
@@ -393,17 +393,22 @@ retry_transaction:
             goto out;
         }
     }
-    if (!force) {
-        xs_watch(ctx->xsh, state_path, be_path);
-        rc = 1;
-    } else {
-        xs_rm(ctx->xsh, XBT_NULL, be_path);
-    }
+
+    xs_watch(ctx->xsh, state_path, be_path);
     libxl__device_destroy_tapdisk(gc, be_path);
+    rc = 1;
 out:
     return rc;
 }
 
+int libxl__device_destroy(libxl__gc *gc, char *be_path)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    xs_rm(ctx->xsh, XBT_NULL, be_path);
+    libxl__device_destroy_tapdisk(gc, be_path);
+    return 0;
+}
+
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -461,7 +466,9 @@ int libxl__devices_destroy(libxl__gc *gc
             fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]);
             be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
             if (be_path != NULL) {
-                if (libxl__device_destroy(gc, be_path, force) > 0)
+                int rc = force ? libxl__device_destroy(gc, be_path)
+                               : libxl__device_remove(gc, be_path);
+                if (rc > 0)
                     n_watches++;
             } else {
                 xs_rm(ctx->xsh, XBT_NULL, path);
@@ -473,7 +480,9 @@ int libxl__devices_destroy(libxl__gc *gc
     fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid);
     be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
     if (be_path && strcmp(be_path, "")) {
-        if (libxl__device_destroy(gc, be_path, force) > 0)
+        int rc = force ? libxl__device_destroy(gc, be_path)
+                       : libxl__device_remove(gc, be_path);
+        if (rc > 0)
             n_watches++;
     }
 
@@ -506,7 +515,10 @@ int libxl__device_del(libxl__gc *gc, lib
 
     backend_path = libxl__device_backend_path(gc, dev);
 
-    rc = libxl__device_destroy(gc, backend_path, !wait);
+    if (wait)
+        rc = libxl__device_remove(gc, backend_path);
+    else
+        rc = libxl__device_destroy(gc, backend_path);
     if (rc == -1) {
         rc = ERROR_FAIL;
         goto out;
diff -r da6b91661078 -r 16805eff73bd tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:42 2011 +0100
@@ -253,7 +253,8 @@ _hidden int libxl__device_generic_add(li
 _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device);
 _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device);
 _hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait);
-_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path, int force);
+_hidden int libxl__device_remove(libxl__gc *gc, char *be_path);
+_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path);
 _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
 _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);
 
diff -r da6b91661078 -r 16805eff73bd tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Tue Oct 18 13:36:42 2011 +0100
@@ -411,8 +411,7 @@ retry_transaction2:
 
     if (num == 1) {
         char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path));
-        libxl__device_destroy(gc, be_path, 1);
-        xs_rm(ctx->xsh, XBT_NULL, be_path);
+        libxl__device_destroy(gc, be_path);
         xs_rm(ctx->xsh, XBT_NULL, fe_path);
         return 0;
     }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:34:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:34:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9oj-00054d-Jt; Tue, 18 Oct 2011 06:34:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9Ck-00033U-C8
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:39 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318942532!57539!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14295 invoked from network); 18 Oct 2011 12:55:34 -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;
	18 Oct 2011 12:55:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309459"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:21 -0400
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, 18 Oct 2011 08:55:21 -0400
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
	p9ICsvBX015846;	Tue, 18 Oct 2011 05:55:20 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0bfe1face70308bbb72d5e3ce46e86f8933466f8
Message-ID: <0bfe1face70308bbb72d.1318942521@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:21 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 26 of 27 v3] libxl: convert PCI device handling
	to device API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941403 -3600
# Node ID 0bfe1face70308bbb72d5e3ce46e86f8933466f8
# Parent  9a75cc1499dacfd7fc8c1430d77a14f218cd6206
libxl: convert PCI device handling to device API

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 9a75cc1499da -r 0bfe1face703 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -754,7 +754,7 @@ int libxl_domain_destroy(libxl_ctx *ctx,
         goto out;
     }
 
-    if (libxl_device_pci_shutdown(ctx, domid) < 0)
+    if (libxl__device_pci_destroy_all(&gc, domid) < 0)
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "pci shutdown failed for domid %d", domid);
     rc = xc_domain_pause(ctx->xch, domid);
     if (rc < 0) {
diff -r 9a75cc1499da -r 0bfe1face703 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl.h	Tue Oct 18 13:36:43 2011 +0100
@@ -485,12 +485,28 @@ int libxl_device_vfb_add(libxl_ctx *ctx,
 int libxl_device_vfb_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
 int libxl_device_vfb_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb);
 
+/* PCI Passthrough */
+int libxl_device_pci_init(libxl_ctx *ctx, libxl_device_pci *pci);
 int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev);
-int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev, int force);
-int libxl_device_pci_shutdown(libxl_ctx *ctx, uint32_t domid);
-int libxl_device_pci_list_assigned(libxl_ctx *ctx, libxl_device_pci **list, uint32_t domid, int *num);
-int libxl_device_pci_list_assignable(libxl_ctx *ctx, libxl_device_pci **list, int *num);
-int libxl_device_pci_parse_bdf(libxl_ctx *ctx, libxl_device_pci *pcidev, const char *str);
+int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev);
+int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev);
+libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num);
+
+/*
+ * Parse a PCI BDF into a PCI device structure.
+ */
+int libxl_device_pci_parse_bdf(libxl_ctx *ctx,
+                               libxl_device_pci *pcidev,
+                               const char *str);
+
+/*
+ * Similar to libxl_device_pci_list but returns all devices which
+ * could be assigned to a domain (i.e. are bound to the backend
+ * driver) but are not currently.
+ */
+libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num);
+
+/* CPUID handling */
 int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str);
 int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid,
                                   const char* str);
diff -r 9a75cc1499da -r 0bfe1face703 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:43 2011 +0100
@@ -252,6 +252,7 @@ _hidden int libxl__wait_for_backend(libx
 _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting);
 _hidden int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid,
                                       libxl_device_pci *pcidev, int num);
+_hidden int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid);
 
 /* xl_exec */
 
diff -r 9a75cc1499da -r 0bfe1face703 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Tue Oct 18 13:36:43 2011 +0100
@@ -486,7 +486,7 @@ static int is_assigned(libxl_device_pci 
     return 0;
 }
 
-int libxl_device_pci_list_assignable(libxl_ctx *ctx, libxl_device_pci **list, int *num)
+libxl_device_pci *libxl_device_pci_list_assignable(libxl_ctx *ctx, int *num)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
     libxl_device_pci *pcidevs = NULL, *new, *assigned;
@@ -495,13 +495,10 @@ int libxl_device_pci_list_assignable(lib
     int rc, num_assigned;
 
     *num = 0;
-    *list = NULL;
 
     rc = get_all_assigned_devices(&gc, &assigned, &num_assigned);
-    if ( rc ) {
-        libxl__free_all(&gc);
-        return rc;
-    }
+    if ( rc )
+        goto out;
 
     dir = opendir(SYSFS_PCIBACK_DRIVER);
     if ( NULL == dir ) {
@@ -510,8 +507,7 @@ int libxl_device_pci_list_assignable(lib
         }else{
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Couldn't open %s", SYSFS_PCIBACK_DRIVER);
         }
-        libxl__free_all(&gc);
-        return ERROR_FAIL;
+        goto out_closedir;
     }
 
     while( (de = readdir(dir)) ) {
@@ -534,10 +530,11 @@ int libxl_device_pci_list_assignable(lib
         (*num)++;
     }
 
+out_closedir:
     closedir(dir);
-    *list = pcidevs;
+out:
     libxl__free_all(&gc);
-    return 0;
+    return pcidevs;
 }
 
 /*
@@ -846,21 +843,25 @@ static int do_pci_remove(libxl__gc *gc, 
     int hvm = 0, rc, num;
     int stubdomid = 0;
 
-    if ( !libxl_device_pci_list_assigned(ctx, &assigned, domid, &num) ) {
-        if ( !is_assigned(assigned, num, pcidev->domain,
-                         pcidev->bus, pcidev->dev, pcidev->func) ) {
-            LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "PCI device not attached to this domain");
-            return ERROR_INVAL;
-        }
+    assigned = libxl_device_pci_list(ctx, domid, &num);
+    if ( assigned == NULL )
+        return ERROR_FAIL;
+
+    rc = ERROR_INVAL;
+    if ( !is_assigned(assigned, num, pcidev->domain,
+                      pcidev->bus, pcidev->dev, pcidev->func) ) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "PCI device not attached to this domain");
+        goto out_fail;
     }
 
+    rc = ERROR_FAIL;
     switch (libxl__domain_type(gc, domid)) {
     case LIBXL_DOMAIN_TYPE_HVM:
         hvm = 1;
         if (libxl__wait_for_device_model(gc, domid, "running",
-                                         NULL, NULL, NULL) < 0) {
-            return ERROR_FAIL;
-        }
+                                         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);
@@ -879,7 +880,7 @@ static int do_pci_remove(libxl__gc *gc, 
                  * SCI, if it doesn't respond in time then we may wish to
                  * force the removal.
                  */
-                return ERROR_FAIL;
+                goto out_fail;
             }
         }
         path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
@@ -955,25 +956,31 @@ out:
     stubdomid = libxl_get_stubdom_id(ctx, domid);
     if (stubdomid != 0) {
         libxl_device_pci pcidev_s = *pcidev;
-        libxl_device_pci_remove(ctx, stubdomid, &pcidev_s, force);
+        if (force)
+                libxl_device_pci_destroy(ctx, stubdomid, &pcidev_s);
+        else
+                libxl_device_pci_remove(ctx, stubdomid, &pcidev_s);
     }
 
     libxl__device_pci_remove_xenstore(gc, domid, pcidev);
 
-    return 0;
+    rc = 0;
+out_fail:
+    free(assigned);
+    return rc;
+
 }
 
-int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid,
-                            libxl_device_pci *pcidev, int force)
+static int libxl__device_pci_remove_common(libxl__gc *gc, uint32_t domid,
+                                           libxl_device_pci *pcidev, int force)
 {
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
     unsigned int orig_vdev, pfunc_mask;
     int i, rc;
 
     orig_vdev = pcidev->vdevfn & ~7U;
 
     if ( pcidev->vfunc_mask == LIBXL_PCI_FUNC_ALL ) {
-        if ( pci_multifunction_check(&gc, pcidev, &pfunc_mask) ) {
+        if ( pci_multifunction_check(gc, pcidev, &pfunc_mask) ) {
             rc = ERROR_FAIL;
             goto out;
         }
@@ -990,81 +997,118 @@ int libxl_device_pci_remove(libxl_ctx *c
             }else{
                 pcidev->vdevfn = orig_vdev;
             }
-            if ( do_pci_remove(&gc, domid, pcidev, force) )
+            if ( do_pci_remove(gc, domid, pcidev, force) )
                 rc = ERROR_FAIL;
         }
     }
 
 out:
+    return rc;
+}
+
+int libxl_device_pci_remove(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    int rc;
+
+    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 0);
+
     libxl__free_all(&gc);
     return rc;
 }
 
-int libxl_device_pci_list_assigned(libxl_ctx *ctx, libxl_device_pci **list, uint32_t domid, int *num)
+int libxl_device_pci_destroy(libxl_ctx *ctx, uint32_t domid,
+                                  libxl_device_pci *pcidev)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *be_path, *num_devs, *xsdev, *xsvdevfn, *xsopts;
+    int rc;
+
+    rc = libxl__device_pci_remove_common(&gc, domid, pcidev, 1);
+
+    libxl__free_all(&gc);
+    return rc;
+}
+
+static void libxl__device_pci_from_xs_be(libxl__gc *gc,
+                                         const char *be_path,
+                                         libxl_device_pci *pci,
+                                         int nr)
+{
+    char *s;
+    unsigned int domain = 0, bus = 0, dev = 0, func = 0, vdevfn = 0;
+
+    s = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/dev-%d", be_path, nr));
+    sscanf(s, PCI_BDF, &domain, &bus, &dev, &func);
+
+    s = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/vdevfn-%d", be_path, nr));
+    if (s)
+        vdevfn = strtol(s, (char **) NULL, 16);
+
+    pcidev_init(pci, domain, bus, dev, func, vdevfn);
+
+    s = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/opts-%d", be_path, nr));
+    if (s) {
+        char *saveptr;
+        char *p = strtok_r(s, ",=", &saveptr);
+        do {
+            while (*p == ' ')
+                p++;
+            if (!strcmp(p, "msitranslate")) {
+                p = strtok_r(NULL, ",=", &saveptr);
+                pci->msitranslate = atoi(p);
+            } else if (!strcmp(p, "power_mgmt")) {
+                p = strtok_r(NULL, ",=", &saveptr);
+                pci->power_mgmt = atoi(p);
+            }
+        } while ((p = strtok_r(NULL, ",=", &saveptr)) != NULL);
+    }
+}
+
+libxl_device_pci *libxl_device_pci_list(libxl_ctx *ctx, uint32_t domid, int *num)
+{
+    libxl__gc gc = LIBXL_INIT_GC(ctx);
+    char *be_path, *num_devs;
     int n, i;
-    unsigned int domain = 0, bus = 0, dev = 0, func = 0, vdevfn = 0;
-    libxl_device_pci *pcidevs;
+    libxl_device_pci *pcidevs = NULL;
+
+    *num = 0;
 
     be_path = libxl__sprintf(&gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(&gc, 0), domid);
     num_devs = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/num_devs", be_path));
-    if (!num_devs) {
-        *num = 0;
-        *list = NULL;
-        libxl__free_all(&gc);
-        return 0;
-    }
+    if (!num_devs)
+        goto out;
+
     n = atoi(num_devs);
     pcidevs = calloc(n, sizeof(libxl_device_pci));
+
+    for (i = 0; i < n; i++)
+        libxl__device_pci_from_xs_be(&gc, be_path, pcidevs + i, i);
+
     *num = n;
-
-    for (i = 0; i < n; i++) {
-        xsdev = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/dev-%d", be_path, i));
-        sscanf(xsdev, PCI_BDF, &domain, &bus, &dev, &func);
-        xsvdevfn = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vdevfn-%d", be_path, i));
-        if (xsvdevfn)
-            vdevfn = strtol(xsvdevfn, (char **) NULL, 16);
-        pcidev_init(pcidevs + i, domain, bus, dev, func, vdevfn);
-        xsopts = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/opts-%d", be_path, i));
-        if (xsopts) {
-            char *saveptr;
-            char *p = strtok_r(xsopts, ",=", &saveptr);
-            do {
-                while (*p == ' ')
-                    p++;
-                if (!strcmp(p, "msitranslate")) {
-                    p = strtok_r(NULL, ",=", &saveptr);
-                    pcidevs[i].msitranslate = atoi(p);
-                } else if (!strcmp(p, "power_mgmt")) {
-                    p = strtok_r(NULL, ",=", &saveptr);
-                    pcidevs[i].power_mgmt = atoi(p);
-                }
-            } while ((p = strtok_r(NULL, ",=", &saveptr)) != NULL);
-        }
-    }
-    *list = pcidevs;
+out:
     libxl__free_all(&gc);
-    return 0;
+    return pcidevs;
 }
 
-int libxl_device_pci_shutdown(libxl_ctx *ctx, uint32_t domid)
+int libxl__device_pci_destroy_all(libxl__gc *gc, uint32_t domid)
 {
+    libxl_ctx *ctx = libxl__gc_owner(gc);
     libxl_device_pci *pcidevs;
-    int num, i, rc;
+    int num, i, rc = 0;
 
-    rc = libxl_device_pci_list_assigned(ctx, &pcidevs, domid, &num);
-    if ( rc )
-        return rc;
+    pcidevs = libxl_device_pci_list(ctx, domid, &num);
+    if ( pcidevs == NULL )
+        return ERROR_FAIL;
+
     for (i = 0; i < num; i++) {
         /* Force remove on shutdown since, on HVM, qemu will not always
          * respond to SCI interrupt because the guest kernel has shut down the
          * devices by the time we even get here!
          */
-        if (libxl_device_pci_remove(ctx, domid, pcidevs + i, 1) < 0)
-            return ERROR_FAIL;
+        if (libxl_device_pci_destroy(ctx, domid, pcidevs + i) < 0)
+            rc = ERROR_FAIL;
     }
+
     free(pcidevs);
     return 0;
 }
diff -r 9a75cc1499da -r 0bfe1face703 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/xl_cmdimpl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -2018,11 +2018,14 @@ static void pcilist_assignable(void)
     libxl_device_pci *pcidevs;
     int num, i;
 
-    if ( libxl_device_pci_list_assignable(ctx, &pcidevs, &num) )
+    pcidevs = libxl_device_pci_list_assignable(ctx, &num);
+
+    if ( pcidevs == NULL )
         return;
     for (i = 0; i < num; i++) {
         printf("%04x:%02x:%02x.%01x\n",
-                pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func);
+               pcidevs[i].domain, pcidevs[i].bus, pcidevs[i].dev, pcidevs[i].func);
+        libxl_device_pci_dispose(&pcidevs[i]);
     }
     free(pcidevs);
 }
@@ -2045,7 +2048,8 @@ static void pcilist(const char *dom)
 
     find_domain(dom);
 
-    if (libxl_device_pci_list_assigned(ctx, &pcidevs, domid, &num))
+    pcidevs = libxl_device_pci_list(ctx, domid, &num);
+    if (pcidevs == NULL)
         return;
     printf("Vdev Device\n");
     for (i = 0; i < num; i++) {
@@ -2082,7 +2086,10 @@ static void pcidetach(const char *dom, c
         fprintf(stderr, "pci-detach: malformed BDF specification \"%s\"\n", bdf);
         exit(2);
     }
-    libxl_device_pci_remove(ctx, domid, &pcidev, force);
+    if (force)
+        libxl_device_pci_destroy(ctx, domid, &pcidev);
+    else
+        libxl_device_pci_remove(ctx, domid, &pcidev);
     libxl_device_pci_dispose(&pcidev);
 }
 
diff -r 9a75cc1499da -r 0bfe1face703 tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/ocaml/libs/xl/genwrap.py	Tue Oct 18 13:36:43 2011 +0100
@@ -26,10 +26,7 @@ functions = { # ( name , [type1,type2,..
     "device_vkb":     DEVICE_FUNCTIONS,
     "device_disk":    DEVICE_FUNCTIONS,
     "device_nic":     DEVICE_FUNCTIONS,
-    "device_pci":     [ ("add",            ["t", "domid", "unit"]),
-                        ("remove",         ["t", "domid", "unit"]),
-                        ("shutdown",       ["domid", "unit"]),
-                      ],
+    "device_pci":     DEVICE_FUNCTIONS,
     "physinfo":       [ ("get",            ["unit", "t"]),
                       ],
     "sched_credit":   [ ("domain_get",     ["domid", "t"]),
diff -r 9a75cc1499da -r 0bfe1face703 tools/ocaml/libs/xl/xenlight_stubs.c
--- a/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/ocaml/libs/xl/xenlight_stubs.c	Tue Oct 18 13:36:43 2011 +0100
@@ -424,7 +424,7 @@ value stub_xl_device_pci_remove(value in
 	device_pci_val(&gc, &lg, &c_info, info);
 
 	INIT_CTX();
-	ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info, 0);
+	ret = libxl_device_pci_remove(ctx, Int_val(domid), &c_info);
 	if (ret != 0)
 		failwith_xl("pci_remove", &lg);
 	FREE_CTX();
@@ -432,21 +432,6 @@ value stub_xl_device_pci_remove(value in
 	CAMLreturn(Val_unit);
 }
 
-value stub_xl_device_pci_shutdown(value domid)
-{
-	CAMLparam1(domid);
-	int ret;
-	INIT_STRUCT();
-
-	INIT_CTX();
-	ret = libxl_device_pci_shutdown(ctx, Int_val(domid));
-	if (ret != 0)
-		failwith_xl("pci_shutdown", &lg);
-	FREE_CTX();
-
-	CAMLreturn(Val_unit);
-}
-
 value stub_xl_button_press(value domid, value button)
 {
 	CAMLparam2(domid, button);
diff -r 9a75cc1499da -r 0bfe1face703 tools/python/xen/lowlevel/xl/xl.c
--- a/tools/python/xen/lowlevel/xl/xl.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/python/xen/lowlevel/xl/xl.c	Tue Oct 18 13:36:43 2011 +0100
@@ -521,9 +521,16 @@ static PyObject *pyxl_pci_del(XlObject *
         return NULL;
     }
     pci = (Py_device_pci *)obj;
-    if ( libxl_device_pci_remove(self->ctx, domid, &pci->obj, force) ) {
-        PyErr_SetString(xl_error_obj, "cannot remove pci device");
-        return NULL;
+    if ( force ) {
+        if ( libxl_device_pci_destroy(self->ctx, domid, &pci->obj) ) {
+            PyErr_SetString(xl_error_obj, "cannot remove pci device");
+            return NULL;
+        }
+    } else {
+        if ( libxl_device_pci_remove(self->ctx, domid, &pci->obj) ) {
+            PyErr_SetString(xl_error_obj, "cannot remove pci device");
+            return NULL;
+        }
     }
     Py_INCREF(Py_None);
     return Py_None;
@@ -558,7 +565,8 @@ static PyObject *pyxl_pci_list_assignabl
     PyObject *list;
     int nr_dev, i;
 
-    if ( libxl_device_pci_list_assignable(self->ctx, &dev, &nr_dev) ) {
+    dev = libxl_device_pci_list_assignable(self->ctx, &nr_dev);
+    if ( dev == NULL ) {
         PyErr_SetString(xl_error_obj, "Cannot list assignable devices");
         return NULL;
     }
@@ -594,7 +602,8 @@ static PyObject *pyxl_pci_list(XlObject 
     if ( !PyArg_ParseTuple(args, "i", &domid) )
         return NULL;
 
-    if ( libxl_device_pci_list_assigned(self->ctx, &dev, domid, &nr_dev) ) {
+    dev = libxl_device_pci_list(self->ctx, domid, &nr_dev);
+    if ( dev == NULL ) {
         PyErr_SetString(xl_error_obj, "Cannot list assignable devices");
         return NULL;
     }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:35:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:35:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9pW-0005SQ-VB; Tue, 18 Oct 2011 06:35:42 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9Ck-00033m-Uo
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:39 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318942534!632206!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7923 invoked from network); 18 Oct 2011 12:55:35 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309451"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:12 -0400
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, 18 Oct 2011 08:55:11 -0400
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
	p9ICsvBM015846;	Tue, 18 Oct 2011 05:55:11 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 7f1e0391462078ee1bf572722e958b2ed0e966ef
Message-ID: <7f1e0391462078ee1bf5.1318942510@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:10 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 15 of 27 v3] libxl: use IDL to define device
 front- and back-end kinds
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941402 -3600
# Node ID 7f1e0391462078ee1bf572722e958b2ed0e966ef
# Parent  89233ed65eced3ca2ef6cc1cce7abcdd3e5439e9
libxl: use IDL to define device front- and back-end kinds

I'd like to use the from_string functionality...

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 89233ed65ece -r 7f1e03914620 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl.c	Tue Oct 18 13:36:42 2011 +0100
@@ -962,7 +962,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
     device.backend_domid = disk->backend_domid;
     device.devid = devid;
     device.domid = domid;
-    device.kind = DEVICE_VBD;
+    device.kind = LIBXL__DEVICE_KIND_VBD;
 
     switch (disk->backend) {
         case LIBXL_DISK_BACKEND_PHY:
@@ -975,7 +975,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
             flexarray_append(back, "params");
             flexarray_append(back, dev);
 
-            device.backend_kind = DEVICE_VBD;
+            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
             break;
         case LIBXL_DISK_BACKEND_TAP:
             dev = libxl__blktap_devpath(&gc, disk->pdev_path, disk->format);
@@ -994,7 +994,7 @@ int libxl_device_disk_add(libxl_ctx *ctx
             flexarray_append(back, "params");
             flexarray_append(back, libxl__sprintf(&gc, "%s:%s",
                           libxl__device_disk_string_of_format(disk->format), disk->pdev_path));
-            device.backend_kind = DEVICE_QDISK;
+            device.backend_kind = LIBXL__DEVICE_KIND_QDISK;
             break;
         default:
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n", disk->backend);
@@ -1057,13 +1057,13 @@ int libxl_device_disk_del(libxl_ctx *ctx
 
     switch (disk->backend) {
         case LIBXL_DISK_BACKEND_PHY:
-            device.backend_kind = DEVICE_VBD;
+            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
             break;
         case LIBXL_DISK_BACKEND_TAP:
-            device.backend_kind = DEVICE_VBD;
+            device.backend_kind = LIBXL__DEVICE_KIND_VBD;
             break;
         case LIBXL_DISK_BACKEND_QDISK:
-            device.backend_kind = DEVICE_QDISK;
+            device.backend_kind = LIBXL__DEVICE_KIND_QDISK;
             break;
         default:
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend type: %d\n",
@@ -1073,7 +1073,7 @@ int libxl_device_disk_del(libxl_ctx *ctx
     }
     device.domid            = domid;
     device.devid            = devid;
-    device.kind             = DEVICE_VBD;
+    device.kind             = LIBXL__DEVICE_KIND_VBD;
     if (wait)
         rc = libxl__device_del(&gc, &device);
     else
@@ -1221,10 +1221,10 @@ int libxl_device_nic_add(libxl_ctx *ctx,
 
     device.backend_devid = nic->devid;
     device.backend_domid = nic->backend_domid;
-    device.backend_kind = DEVICE_VIF;
+    device.backend_kind = LIBXL__DEVICE_KIND_VIF;
     device.devid = nic->devid;
     device.domid = domid;
-    device.kind = DEVICE_VIF;
+    device.kind = LIBXL__DEVICE_KIND_VIF;
 
     flexarray_append(back, "frontend-id");
     flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
@@ -1284,10 +1284,10 @@ int libxl_device_nic_del(libxl_ctx *ctx,
 
     device.backend_devid    = nic->devid;
     device.backend_domid    = nic->backend_domid;
-    device.backend_kind     = DEVICE_VIF;
+    device.backend_kind     = LIBXL__DEVICE_KIND_VIF;
     device.devid            = nic->devid;
     device.domid            = domid;
-    device.kind             = DEVICE_VIF;
+    device.kind             = LIBXL__DEVICE_KIND_VIF;
 
     if (wait)
         rc = libxl__device_del(&gc, &device);
@@ -1486,10 +1486,10 @@ int libxl__device_console_add(libxl__gc 
 
     device.backend_devid = console->devid;
     device.backend_domid = console->backend_domid;
-    device.backend_kind = DEVICE_CONSOLE;
+    device.backend_kind = LIBXL__DEVICE_KIND_CONSOLE;
     device.devid = console->devid;
     device.domid = domid;
-    device.kind = DEVICE_CONSOLE;
+    device.kind = LIBXL__DEVICE_KIND_CONSOLE;
 
     flexarray_append(back, "frontend-id");
     flexarray_append(back, libxl__sprintf(gc, "%d", domid));
@@ -1577,10 +1577,10 @@ int libxl_device_vkb_add(libxl_ctx *ctx,
 
     device.backend_devid = vkb->devid;
     device.backend_domid = vkb->backend_domid;
-    device.backend_kind = DEVICE_VKBD;
+    device.backend_kind = LIBXL__DEVICE_KIND_VKBD;
     device.devid = vkb->devid;
     device.domid = domid;
-    device.kind = DEVICE_VKBD;
+    device.kind = LIBXL__DEVICE_KIND_VKBD;
 
     flexarray_append(back, "frontend-id");
     flexarray_append(back, libxl__sprintf(&gc, "%d", domid));
@@ -1864,10 +1864,10 @@ int libxl_device_vfb_add(libxl_ctx *ctx,
 
     device.backend_devid = vfb->devid;
     device.backend_domid = vfb->backend_domid;
-    device.backend_kind = DEVICE_VFB;
+    device.backend_kind = LIBXL__DEVICE_KIND_VFB;
     device.devid = vfb->devid;
     device.domid = domid;
-    device.kind = DEVICE_VFB;
+    device.kind = LIBXL__DEVICE_KIND_VFB;
 
     flexarray_append_pair(back, "frontend-id", libxl__sprintf(&gc, "%d", domid));
     flexarray_append_pair(back, "online", "1");
diff -r 89233ed65ece -r 7f1e03914620 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
@@ -24,30 +24,20 @@
 #include <unistd.h>
 #include <fcntl.h>
 
-
 #include "libxl.h"
 #include "libxl_internal.h"
 
-static const char *string_of_kinds[] = {
-    [DEVICE_VIF] = "vif",
-    [DEVICE_VBD] = "vbd",
-    [DEVICE_QDISK] = "qdisk",
-    [DEVICE_PCI] = "pci",
-    [DEVICE_VFB] = "vfb",
-    [DEVICE_VKBD] = "vkbd",
-    [DEVICE_CONSOLE] = "console",
-};
-
 char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device)
 {
     char *dom_path = libxl__xs_get_dompath(gc, device->domid);
 
     /* Console 0 is a special case */
-    if (device->kind == DEVICE_CONSOLE && device->devid == 0)
+    if (device->kind == LIBXL__DEVICE_KIND_CONSOLE && device->devid == 0)
         return libxl__sprintf(gc, "%s/console", dom_path);
 
     return libxl__sprintf(gc, "%s/device/%s/%d", dom_path,
-                          string_of_kinds[device->kind], device->devid);
+                          libxl__device_kind_to_string(device->kind),
+                          device->devid);
 }
 
 char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device)
@@ -55,7 +45,7 @@ char *libxl__device_backend_path(libxl__
     char *dom_path = libxl__xs_get_dompath(gc, device->backend_domid);
 
     return libxl__sprintf(gc, "%s/backend/%s/%u/%d", dom_path,
-                          string_of_kinds[device->backend_kind],
+                          libxl__device_kind_to_string(device->backend_kind),
                           device->domid, device->devid);
 }
 
@@ -67,12 +57,6 @@ int libxl__device_generic_add(libxl__gc 
     xs_transaction_t t;
     struct xs_permissions frontend_perms[2];
     struct xs_permissions backend_perms[2];
-    int rc;
-
-    if (!is_valid_device_kind(device->backend_kind) || !is_valid_device_kind(device->kind)) {
-        rc = ERROR_INVAL;
-        goto out;
-    }
 
     frontend_path = libxl__device_frontend_path(gc, device);
     backend_path = libxl__device_backend_path(gc, device);
@@ -113,9 +97,8 @@ retry_transaction:
         else
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs transaction failed");
     }
-    rc = 0;
-out:
-    return rc;
+
+    return 0;
 }
 
 typedef struct {
diff -r 89233ed65ece -r 7f1e03914620 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:42 2011 +0100
@@ -97,25 +97,13 @@ struct libxl__ctx {
     libxl_version_info version_info;
 };
 
-typedef enum {
-    DEVICE_VIF = 1,
-    DEVICE_VBD,
-    DEVICE_QDISK,
-    DEVICE_PCI,
-    DEVICE_VFB,
-    DEVICE_VKBD,
-    DEVICE_CONSOLE,
-} libxl__device_kinds;
-
-#define is_valid_device_kind(kind) (((kind) >= DEVICE_VIF) && ((kind) <= DEVICE_CONSOLE))
-
 typedef struct {
     uint32_t backend_devid;
     uint32_t backend_domid;
     uint32_t devid;
     uint32_t domid;
-    libxl__device_kinds backend_kind;
-    libxl__device_kinds kind;
+    libxl__device_kind backend_kind;
+    libxl__device_kind kind;
 } libxl__device;
 
 #define XC_PCI_BDF             "0x%x, 0x%x, 0x%x, 0x%x"
diff -r 89233ed65ece -r 7f1e03914620 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Tue Oct 18 13:36:42 2011 +0100
@@ -244,10 +244,10 @@ int libxl__create_pci_backend(libxl__gc 
     /* add pci device */
     device.backend_devid = 0;
     device.backend_domid = 0;
-    device.backend_kind = DEVICE_PCI;
+    device.backend_kind = LIBXL__DEVICE_KIND_PCI;
     device.devid = 0;
     device.domid = domid;
-    device.kind = DEVICE_PCI;
+    device.kind = LIBXL__DEVICE_KIND_PCI;
 
     flexarray_append_pair(back, "frontend-id", libxl__sprintf(gc, "%d", domid));
     flexarray_append_pair(back, "online", "1");
diff -r 89233ed65ece -r 7f1e03914620 tools/libxl/libxl_types_internal.idl
--- a/tools/libxl/libxl_types_internal.idl	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_types_internal.idl	Tue Oct 18 13:36:42 2011 +0100
@@ -1,9 +1,19 @@
 namespace("libxl__")
 
-libxl__qmp_message_type  = Enumeration("qmp_message_type", [
+libxl__qmp_message_type = Enumeration("qmp_message_type", [
     (1, "QMP"),
     (2, "return"),
     (3, "error"),
     (4, "event"),
     (5, "invalid"),
     ])
+
+libxl__device_kind = Enumeration("device_kind", [
+    (1, "VIF"),
+    (2, "VBD"),
+    (3, "QDISK"),
+    (4, "PCI"),
+    (5, "VFB"),
+    (6, "VKBD"),
+    (7, "CONSOLE"),
+    ])

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:36:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:36:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9qF-0005pg-Oz; Tue, 18 Oct 2011 06:36:27 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9Cl-000342-KW
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:40 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1318942534!632206!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7941 invoked from network); 18 Oct 2011 12:55:36 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 12:55:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309452"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:14 -0400
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, 18 Oct 2011 08:55:13 -0400
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
	p9ICsvBO015846;	Tue, 18 Oct 2011 05:55:13 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 5547b8593511cb37b830f6ec73f480e607f639c2
Message-ID: <5547b8593511cb37b830.1318942512@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:12 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 17 of 27 v3] libxl: use libxl__device in
 libxl_devices_destroy and libxl__device_pci_remove_xenstore
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941402 -3600
# Node ID 5547b8593511cb37b830f6ec73f480e607f639c2
# Parent  6f8ff4990c5cf5ea9b37ee07df9cc2b118a50c16
libxl: use libxl__device in libxl_devices_destroy and libxl__device_pci_remove_xenstore

Doing this allows us to use the common functions for removing devices.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 6f8ff4990c5c -r 5547b8593511 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
@@ -49,6 +49,25 @@ char *libxl__device_backend_path(libxl__
                           device->domid, device->devid);
 }
 
+int libxl__parse_backend_path(libxl__gc *gc,
+                              const char *path,
+                              libxl__device *dev)
+{
+    /* /local/domain/<domid>/backend/<kind>/<domid>/<devid> */
+    char strkind[16]; /* Longest is actually "console" */
+    uint32_t domain;
+    int rc = sscanf(path, "/local/domain/%d/backend/%15[^/]/%d/%d",
+                    &dev->backend_domid,
+                    strkind,
+                    &domain,
+                    &dev->backend_devid);
+
+    if (rc != 4)
+        return ERROR_FAIL;
+
+    return libxl__device_kind_from_string(strkind, &dev->backend_kind);
+}
+
 int libxl__device_generic_add(libxl__gc *gc, libxl__device *device,
                              char **bents, char **fents)
 {
@@ -348,10 +367,11 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
-int libxl__device_remove(libxl__gc *gc, char *be_path)
+int libxl__device_remove(libxl__gc *gc, libxl__device *dev)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     xs_transaction_t t;
+    char *be_path = libxl__device_backend_path(gc, dev);
     char *state_path = libxl__sprintf(gc, "%s/state", be_path);
     char *state = libxl__xs_read(gc, XBT_NULL, state_path);
     int rc = 0;
@@ -429,10 +449,12 @@ static int wait_for_dev_destroy(libxl__g
 int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
-    char *path, *be_path, *fe_path;
+    char *path;
     unsigned int num1, num2;
     char **l1 = NULL, **l2 = NULL;
     int i, j, n_watches = 0;
+    libxl__device dev;
+    libxl__device_kind kind;
 
     path = libxl__sprintf(gc, "/local/domain/%d/device", domid);
     l1 = libxl__xs_directory(gc, XBT_NULL, path, &num1);
@@ -445,22 +467,25 @@ int libxl__devices_destroy(libxl__gc *gc
         num1 = 0;
     }
     for (i = 0; i < num1; i++) {
-        if (!strcmp("vfs", l1[i]))
+        if (libxl__device_kind_from_string(l1[i], &kind))
             continue;
         path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, l1[i]);
         l2 = libxl__xs_directory(gc, XBT_NULL, path, &num2);
         if (!l2)
             continue;
         for (j = 0; j < num2; j++) {
-            fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]);
-            be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
-            if (be_path != NULL) {
+            path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s/backend",
+                                  domid, l1[i], l2[j]);
+            path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, path));
+            if (path && libxl__parse_backend_path(gc, path, &dev) == 0) {
+                dev.domid = domid;
+                dev.kind = kind;
+                dev.devid = atoi(l2[j]);
+
                 if (force) {
-                    xs_rm(ctx->xsh, XBT_NULL, be_path);
-                    xs_rm(ctx->xsh, XBT_NULL, fe_path);
-                    libxl__device_destroy_tapdisk(gc, be_path);
+                    libxl__device_destroy(gc, &dev);
                 } else {
-                    if (libxl__device_remove(gc, be_path) > 0)
+                    if (libxl__device_remove(gc, &dev) > 0)
                         n_watches++;
                 }
             }
@@ -468,14 +493,18 @@ int libxl__devices_destroy(libxl__gc *gc
     }
 
     /* console 0 frontend directory is not under /local/domain/<domid>/device */
-    fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid);
-    be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
-    if (be_path && strcmp(be_path, "")) {
+    path = libxl__sprintf(gc, "/local/domain/%d/console/backend", domid);
+    path = libxl__xs_read(gc, XBT_NULL, path);
+    if (path && strcmp(path, "") &&
+        libxl__parse_backend_path(gc, path, &dev) == 0) {
+        dev.domid = domid;
+        dev.kind = LIBXL__DEVICE_KIND_CONSOLE;
+        dev.devid = 0;
+
         if (force) {
-            xs_rm(ctx->xsh, XBT_NULL, be_path);
-            xs_rm(ctx->xsh, XBT_NULL, fe_path);
+            libxl__device_destroy(gc, &dev);
         } else {
-            if (libxl__device_remove(gc, be_path) > 0)
+            if (libxl__device_remove(gc, &dev) > 0)
                 n_watches++;
         }
     }
@@ -505,12 +534,9 @@ int libxl__device_del(libxl__gc *gc, lib
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     struct timeval tv;
-    char *backend_path;
     int rc;
 
-    backend_path = libxl__device_backend_path(gc, dev);
-
-    rc = libxl__device_remove(gc, backend_path);
+    rc = libxl__device_remove(gc, dev);
     if (rc == -1) {
         rc = ERROR_FAIL;
         goto out;
diff -r 6f8ff4990c5c -r 5547b8593511 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_internal.h	Tue Oct 18 13:36:42 2011 +0100
@@ -240,8 +240,10 @@ _hidden int libxl__device_generic_add(li
                              char **bents, char **fents);
 _hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device);
 _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device);
+_hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path,
+                                      libxl__device *dev);
 _hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
-_hidden int libxl__device_remove(libxl__gc *gc, char *be_path);
+_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev);
 _hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev);
 _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
 _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);
diff -r 6f8ff4990c5c -r 5547b8593511 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Tue Oct 18 13:36:42 2011 +0100
@@ -410,9 +410,15 @@ retry_transaction2:
             goto retry_transaction2;
 
     if (num == 1) {
-        char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path));
-        xs_rm(ctx->xsh, XBT_NULL, be_path);
-        xs_rm(ctx->xsh, XBT_NULL, fe_path);
+        libxl__device dev;
+        if (libxl__parse_backend_path(gc, be_path, &dev) != 0)
+            return ERROR_FAIL;
+
+        dev.domid = domid;
+        dev.kind = LIBXL__DEVICE_KIND_PCI;
+        dev.devid = 0;
+
+        libxl__device_destroy(gc, &dev);
         return 0;
     }
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:37:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:37:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9r8-0006DQ-0v; Tue, 18 Oct 2011 06:37:22 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9Cl-000341-KX
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 05:55:40 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1318942532!57539!5
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14353 invoked from network); 18 Oct 2011 12:55:36 -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;
	18 Oct 2011 12:55:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315195200"; d="scan'208";a="18309453"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 08:55:15 -0400
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, 18 Oct 2011 08:55:15 -0400
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
	p9ICsvBQ015846;	Tue, 18 Oct 2011 05:55:14 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 26ef64a0ff194c7df3a5f488c1232f6041c6fc02
Message-ID: <26ef64a0ff194c7df3a5.1318942514@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1318942495@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Tue, 18 Oct 2011 13:55:14 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 19 of 27 v3] libxl: use more descriptive
 variable names in libxl__devices_destroy
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318941402 -3600
# Node ID 26ef64a0ff194c7df3a5f488c1232f6041c6fc02
# Parent  4020531a53fcb1a5579de3225b99a29a7619c7df
libxl: use more descriptive variable names in libxl__devices_destroy.

It's not immediately clear that "l1" iterates over device types and "l2"
iterates over individual devices. Name things in a way which makes this more
obvious.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 4020531a53fc -r 26ef64a0ff19 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
+++ b/tools/libxl/libxl_device.c	Tue Oct 18 13:36:42 2011 +0100
@@ -464,37 +464,38 @@ int libxl__devices_destroy(libxl__gc *gc
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     char *path;
-    unsigned int num1, num2;
-    char **l1 = NULL, **l2 = NULL;
+    unsigned int num_kinds, num_devs;
+    char **kinds = NULL, **devs = NULL;
     int i, j, n_watches = 0;
     libxl__device dev;
     libxl__device_kind kind;
 
     path = libxl__sprintf(gc, "/local/domain/%d/device", domid);
-    l1 = libxl__xs_directory(gc, XBT_NULL, path, &num1);
-    if (!l1) {
+    kinds = libxl__xs_directory(gc, XBT_NULL, path, &num_kinds);
+    if (!kinds) {
         if (errno != ENOENT) {
             LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unable to get xenstore"
                              " device listing %s", path);
             goto out;
         }
-        num1 = 0;
+        num_kinds = 0;
     }
-    for (i = 0; i < num1; i++) {
-        if (libxl__device_kind_from_string(l1[i], &kind))
+    for (i = 0; i < num_kinds; i++) {
+        if (libxl__device_kind_from_string(kinds[i], &kind))
             continue;
-        path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, l1[i]);
-        l2 = libxl__xs_directory(gc, XBT_NULL, path, &num2);
-        if (!l2)
+
+        path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, kinds[i]);
+        devs = libxl__xs_directory(gc, XBT_NULL, path, &num_devs);
+        if (!devs)
             continue;
-        for (j = 0; j < num2; j++) {
+        for (j = 0; j < num_devs; j++) {
             path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s/backend",
-                                  domid, l1[i], l2[j]);
+                                  domid, kinds[i], devs[j]);
             path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, path));
             if (path && libxl__parse_backend_path(gc, path, &dev) == 0) {
                 dev.domid = domid;
                 dev.kind = kind;
-                dev.devid = atoi(l2[j]);
+                dev.devid = atoi(devs[j]);
 
                 if (force) {
                     libxl__device_destroy(gc, &dev);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:39:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:39:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9tD-0006ok-Uc; Tue, 18 Oct 2011 06:39:32 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9MP-0004kc-De
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 06:05:38 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1318943134!631050!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14551 invoked from network); 18 Oct 2011 13:05:34 -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;
	18 Oct 2011 13:05:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315180800"; 
   d="scan'208";a="8445946"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 13:05:33 +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, 18 Oct 2011 14:05:33 +0100
Subject: Re: [Xen-devel] [PATCH v3] libxl: reimplement buffer for
	bootloading and drop data if buffer is full
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Date: Tue, 18 Oct 2011 14:05:33 +0100
In-Reply-To: <4a591584e20718b06f3e.1318936637@loki>
References: <4a591584e20718b06f3e.1318936637@loki>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318943133.3385.11.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 Tue, 2011-10-18 at 12:17 +0100, Roger Pau Monne wrote:
> # HG changeset patch
> # User Roger Pau Monne <roger.pau@entel.upc.edu>
> # Date 1318936435 -7200
> # Node ID 4a591584e20718b06f3e9dc72897ee2a87f43c3c
> # Parent  0a720316685a73e2d5aee56c1572b9ee8d98ab4e
> libxl: reimplement buffer for bootloading and drop data if buffer is full.
> 
> Implement a buffer for the bootloading process that appends data to the end until it's full. Drop output from bootloader if a timeout has occurred and the buffer is full. Prevents the bootloader from getting stuck when using ptys with small buffers.
> 
> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
> 
> diff -r 0a720316685a -r 4a591584e207 tools/libxl/libxl_bootloader.c
> --- a/tools/libxl/libxl_bootloader.c	Tue Oct 18 11:26:43 2011 +0200
> +++ b/tools/libxl/libxl_bootloader.c	Tue Oct 18 13:13:55 2011 +0200
> @@ -21,6 +21,7 @@
>  
>  #include <sys/stat.h>
>  #include <sys/types.h>
> +#include <sys/ioctl.h>
>  
>  #include "libxl.h"
>  #include "libxl_internal.h"
> @@ -28,7 +29,8 @@
>  #include "flexarray.h"
>  
>  #define XENCONSOLED_BUF_SIZE 16
> -#define BOOTLOADER_BUF_SIZE 1024
> +#define BOOTLOADER_BUF_SIZE 4096
> +#define BOOTLOADER_TIMEOUT 1
>  
>  static char **make_bootloader_args(libxl__gc *gc,
>                                     libxl_domain_build_info *info,
> @@ -165,10 +167,11 @@ static pid_t fork_exec_bootloader(int *m
>   */
>  static char * bootloader_interact(libxl__gc *gc, int xenconsoled_fd, int bootloader_fd, int fifo_fd)
>  {
> -    int ret;
> +    int ret, read_ahead;
>  
>      size_t nr_out = 0, size_out = 0;
>      char *output = NULL;
> +    struct timeval wait;
>  
>      /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
>      int xenconsoled_prod = 0, xenconsoled_cons = 0;
> @@ -181,39 +184,74 @@ static char * bootloader_interact(libxl_
>          fd_set wsel, rsel;
>          int nfds;
>  
> +        /* Set timeout to 1s before starting to discard data */
> +        wait.tv_sec = BOOTLOADER_TIMEOUT;
> +        wait.tv_usec = 0;
> +
>          if (xenconsoled_prod == xenconsoled_cons)
>              xenconsoled_prod = xenconsoled_cons = 0;
>          if (bootloader_prod == bootloader_cons)
>              bootloader_prod = bootloader_cons = 0;
> +        /* Move buffers around to drop already consumed data */
> +        if (xenconsoled_cons > 0) {
> +            xenconsoled_prod -= xenconsoled_cons;
> +            memmove(xenconsoled_buf, &xenconsoled_buf[xenconsoled_cons],
> +                    xenconsoled_prod);
> +            xenconsoled_cons = 0;
> +        }
> +        if (bootloader_cons > 0) {
> +            bootloader_prod -= bootloader_cons;
> +            memmove(bootloader_buf, &bootloader_buf[bootloader_cons],
> +                    bootloader_prod);
> +            bootloader_cons = 0;
> +        }
>  
>          FD_ZERO(&rsel);
>          FD_SET(fifo_fd, &rsel);
>          nfds = fifo_fd + 1;
> -        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0)) {
> +        if (xenconsoled_prod < XENCONSOLED_BUF_SIZE) {
>              FD_SET(xenconsoled_fd, &rsel);
>              nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
> -        }
> -        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0)) {
> +        } 
> +        if (bootloader_prod < BOOTLOADER_BUF_SIZE) {
>              FD_SET(bootloader_fd, &rsel);
>              nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
>          }
>  
>          FD_ZERO(&wsel);
> -        if (bootloader_prod != bootloader_cons) {
> +        if (bootloader_prod > 0) {
>              FD_SET(xenconsoled_fd, &wsel);
>              nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
>          }
> -        if (xenconsoled_prod != xenconsoled_cons) {
> +        if (xenconsoled_prod > 0) {
>              FD_SET(bootloader_fd, &wsel);
>              nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
>          }
>  
> -        ret = select(nfds, &rsel, &wsel, NULL, NULL);
> -        if (ret < 0)
> +        if (xenconsoled_prod == XENCONSOLED_BUF_SIZE ||
> +            bootloader_prod == BOOTLOADER_BUF_SIZE)
> +            ret = select(nfds, &rsel, &wsel, NULL, &wait);
> +        else
> +            ret = select(nfds, &rsel, &wsel, NULL, NULL);
> +        if (ret < 0) {
> +            if (errno == EINTR)
> +                continue;
>              goto out_err;
> +        }
>  
>          /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
> -        if (FD_ISSET(xenconsoled_fd, &rsel)) {
> +        if (FD_ISSET(xenconsoled_fd, &rsel) || ret == 0) {

I don't think these tests need to or should be combined. You don't need
to drop data from the buffer if xenconsole_fd is pending since if that
were the case then we must have added it to the select and therefore it
has space. Likewise if we have timed out we don't need to read from the
buffer, indeed we shouldn't because we can't be sure anything will be
available. If there does happen to be data available we will get it next
time.

I'm not sure what using FIONREAD buys us. If we have timed out we might
as well throw the whole buffer away.

IOW for each fd we do:
	if (ret == 0 && xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
		timed out -> drop the buffer
	} else if (FD_ISSET(xenconsoled_fd, &rsel)) {
		read into the buffer
	}

> +            if (xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
> +                if (ioctl(xenconsoled_fd, FIONREAD, &read_ahead) < 0)
> +                    goto out_err;
> +                if (read_ahead >= XENCONSOLED_BUF_SIZE)
> +                    /* The whole buffer will be overwritten */
> +                    read_ahead = XENCONSOLED_BUF_SIZE;
> +                else
> +                    memmove(xenconsoled_buf, &xenconsoled_buf[read_ahead],
> +                            XENCONSOLED_BUF_SIZE - read_ahead);
> +                xenconsoled_prod -= read_ahead;
> +            }
>              ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled_prod);
>              if (ret < 0 && errno != EIO && errno != EAGAIN)
>                  goto out_err;
> @@ -229,7 +267,18 @@ static char * bootloader_interact(libxl_
>          }
>  
>          /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
> -        if (FD_ISSET(bootloader_fd, &rsel)) {
> +        if (FD_ISSET(bootloader_fd, &rsel) || ret == 0) {
> +            if (bootloader_prod == BOOTLOADER_BUF_SIZE) {
> +                if (ioctl(bootloader_fd, FIONREAD, &read_ahead) < 0)
> +                    goto out_err;
> +                if (read_ahead >= BOOTLOADER_BUF_SIZE)
> +                    /* The whole buffer will be overwritten */
> +                    read_ahead = BOOTLOADER_BUF_SIZE;
> +                else
> +                    memmove(bootloader_buf, &bootloader_buf[read_ahead],
> +                            BOOTLOADER_BUF_SIZE - read_ahead);
> +                bootloader_prod -= read_ahead;
> +            }
>              ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod);
>              if (ret < 0 && errno != EIO && errno != EAGAIN)
>                  goto out_err;
> 
> _______________________________________________
> 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 Oct 18 06:40:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:40:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9uT-0007Dh-I3; Tue, 18 Oct 2011 06:40:49 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9Wd-0006bG-9H
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 06:16:12 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1318943768!29704255!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8523 invoked from network); 18 Oct 2011 13:16:08 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 13:16:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315180800"; 
   d="scan'208";a="8446369"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 13:16: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, 18 Oct 2011 14:16:07 +0100
Subject: Re: [Xen-devel] [PATCH 4 of 9] libxl: create pci backend only when
	there are pci devices
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Date: Tue, 18 Oct 2011 14:16:07 +0100
In-Reply-To: <156626fef95b36184ad4.1317386584@loki>
References: <patchbomb.1317386580@loki> <156626fef95b36184ad4.1317386584@loki>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318943767.3385.13.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 Fri, 2011-09-30 at 13:43 +0100, Roger Pau Monne wrote:
> # HG changeset patch
> # User Roger Pau Monne <roger.pau@entel.upc.edu>
> # Date 1317386335 -7200
> # Node ID 156626fef95b36184ad44dfcb049bae2545435f0
> # Parent  31b3caad18ac904a242c5bd1ea2bb0e574cd0453
> libxl: create pci backend only when there are pci devices.
> 
> Creating empty pci entries made Linux DomUs under NetBSD Dom0 wait a
> very long time for devices to initialize during kernel boot.

I think since this change we need the following. This applies after my
big libxl API series:

Ian.

8<------------------------------------------------------


# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1318943709 -3600
# Node ID e6af32ecb4483457d5ad9a7b674c18aaf20cc085
# Parent  12ac478d1b56f0ff4d3242138b780c551a69f107
libxl: libxl__device_pci_destroy_all should succeed if there is no PCI bus on the domain

Since 23915:4c4b72c94bac "" it is possible that no bus exists and this is not
an error. Removes the following spurious warning when destroying a PV domain
with no PCI devices:
    libxl: error: libxl.c:759:libxl_domain_destroy: pci shutdown failed for domid 1005

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 12ac478d1b56 -r e6af32ecb448 tools/libxl/libxl_pci.c
--- a/tools/libxl/libxl_pci.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl_pci.c	Tue Oct 18 14:15:09 2011 +0100
@@ -1098,7 +1098,7 @@ int libxl__device_pci_destroy_all(libxl_
 
     pcidevs = libxl_device_pci_list(ctx, domid, &num);
     if ( pcidevs == NULL )
-        return ERROR_FAIL;
+        return 0;
 
     for (i = 0; i < num; i++) {
         /* Force remove on shutdown since, on HVM, qemu will not always



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:41:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:41:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9vS-0007cb-Bw; Tue, 18 Oct 2011 06:41:50 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9aw-0007vm-FT
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 06:20:39 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318944035!75491!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23514 invoked from network); 18 Oct 2011 13:20:35 -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;
	18 Oct 2011 13:20:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315180800"; 
   d="scan'208";a="8446528"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 13:20: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, 18 Oct 2011 14:20:34 +0100
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
	1RG9as-0000De-Nw; Tue, 18 Oct 2011 13:20:34 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RG9as-0006TR-NM;
	Tue, 18 Oct 2011 14:20:34 +0100
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: <20125.32034.710835.32455@mariner.uk.xensource.com>
Date: Tue, 18 Oct 2011 14:20:34 +0100
To: Roger Pau =?iso-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH] tools/check: check for headers and
	libraries in EXTRA_INCLUDES and EXTRA_LIB
In-Reply-To: <CAPLaKK6=nU4R62KvxK++XGNx0zff89TNYZkTFizZ1wDbMqUBNg@mail.gmail.com>
References: <8fe2ca552de44aa679be.1318512275@loki>
	<20124.19527.706498.819017@mariner.uk.xensource.com>
	<CAPLaKK6=nU4R62KvxK++XGNx0zff89TNYZkTFizZ1wDbMqUBNg@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

Roger Pau Monné writes ("Re: [Xen-devel] [PATCH] tools/check: check for headers and libraries in EXTRA_INCLUDES and EXTRA_LIB"):
> 2011/10/17 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> > Perhaps this would be more easily achieved with "export" ?
> 
> Exported variables are not passed to the called program (chk in this case).

Are you sure ?  One purpose of "export" is to put the variable in the
environment of commands make runs.

> > The check_sys_root stuff seems unrelated ?  Or at least, it's not
> > mentioned in your commit message.  I'm not sure if it should be
> > disentangled but it should definitely be mentioned.  (I'm not much of
> > an expert on tools/check.)
> 
> The check_sys_root call was already there, just moved it to the top,
> but I don't know if it's really necessary.

Why do you move it ?

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:46:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:46:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RG9zb-0000V7-F4; Tue, 18 Oct 2011 06:46:07 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RG9sm-0006ff-Iv
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 06:39:05 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1318945141!673799!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20022 invoked from network); 18 Oct 2011 13:39:01 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 13:39:01 -0000
Received: by wwf10 with SMTP id 10so758486wwf.24
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 06:39:01 -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:user-agent:date:from:to;
	bh=rKs4KUrfJDocuK75ngj68Wvx/aXaUnY4vA8R0jcU7vY=;
	b=v190byJqIMQUmX6SH5fgyfpJCFU33NfMwMH0h+9tpHjcqBeT0KyLorc6/Yc8YtY89M
	BPT5wrZBVfN98XOQjAxNvrYufrPz7J0s7f7IHBduqa3dumpBkQ6yZCUo977TX5nHAiz5
	8kgITgx4bbpofOtgjdHkZvppqFwNMuBZitP50=
Received: by 10.227.156.70 with SMTP id v6mr902831wbw.27.1318945140322;
	Tue, 18 Oct 2011 06:39:00 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fi11sm3614638wbb.9.2011.10.18.06.38.58
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 18 Oct 2011 06:38:59 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f7b311b85973f5862c323fed4e89c20b7af139a8
Message-Id: <f7b311b85973f5862c32.1318945118@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Tue, 18 Oct 2011 15:38:38 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH v4] libxl: reimplement buffer for bootloading
 and drop data if buffer 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 Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1318944898 -7200
# Node ID f7b311b85973f5862c323fed4e89c20b7af139a8
# Parent  6fd16bcdd3e55bf8cc6e6e90e910f32e37654fd7
libxl: reimplement buffer for bootloading and drop data if buffer is full.

Implement a buffer for the bootloading process that appends data to the end until it's full. Drop the whole buffer if a timeout has occurred and the buffer is full. Prevents the bootloader from getting stuck when using ptys with small buffers.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 6fd16bcdd3e5 -r f7b311b85973 tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Tue Oct 18 15:10:04 2011 +0200
+++ b/tools/libxl/libxl_bootloader.c	Tue Oct 18 15:34:58 2011 +0200
@@ -28,7 +28,8 @@
 #include "flexarray.h"
 
 #define XENCONSOLED_BUF_SIZE 16
-#define BOOTLOADER_BUF_SIZE 1024
+#define BOOTLOADER_BUF_SIZE 4096
+#define BOOTLOADER_TIMEOUT 1
 
 static char **make_bootloader_args(libxl__gc *gc,
                                    libxl_domain_build_info *info,
@@ -169,6 +170,7 @@ static char * bootloader_interact(libxl_
 
     size_t nr_out = 0, size_out = 0;
     char *output = NULL;
+    struct timeval wait;
 
     /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
     int xenconsoled_prod = 0, xenconsoled_cons = 0;
@@ -181,39 +183,66 @@ static char * bootloader_interact(libxl_
         fd_set wsel, rsel;
         int nfds;
 
+        /* Set timeout to 1s before starting to discard data */
+        wait.tv_sec = BOOTLOADER_TIMEOUT;
+        wait.tv_usec = 0;
+
         if (xenconsoled_prod == xenconsoled_cons)
             xenconsoled_prod = xenconsoled_cons = 0;
         if (bootloader_prod == bootloader_cons)
             bootloader_prod = bootloader_cons = 0;
+        /* Move buffers around to drop already consumed data */
+        if (xenconsoled_cons > 0) {
+            xenconsoled_prod -= xenconsoled_cons;
+            memmove(xenconsoled_buf, &xenconsoled_buf[xenconsoled_cons],
+                    xenconsoled_prod);
+            xenconsoled_cons = 0;
+        }
+        if (bootloader_cons > 0) {
+            bootloader_prod -= bootloader_cons;
+            memmove(bootloader_buf, &bootloader_buf[bootloader_cons],
+                    bootloader_prod);
+            bootloader_cons = 0;
+        }
 
         FD_ZERO(&rsel);
         FD_SET(fifo_fd, &rsel);
         nfds = fifo_fd + 1;
-        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0)) {
+        if (xenconsoled_prod < XENCONSOLED_BUF_SIZE) {
             FD_SET(xenconsoled_fd, &rsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
-        }
-        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0)) {
+        } 
+        if (bootloader_prod < BOOTLOADER_BUF_SIZE) {
             FD_SET(bootloader_fd, &rsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
         FD_ZERO(&wsel);
-        if (bootloader_prod != bootloader_cons) {
+        if (bootloader_prod > 0) {
             FD_SET(xenconsoled_fd, &wsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
         }
-        if (xenconsoled_prod != xenconsoled_cons) {
+        if (xenconsoled_prod > 0) {
             FD_SET(bootloader_fd, &wsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
-        ret = select(nfds, &rsel, &wsel, NULL, NULL);
-        if (ret < 0)
+        if (xenconsoled_prod == XENCONSOLED_BUF_SIZE ||
+            bootloader_prod == BOOTLOADER_BUF_SIZE)
+            ret = select(nfds, &rsel, &wsel, NULL, &wait);
+        else
+            ret = select(nfds, &rsel, &wsel, NULL, NULL);
+        if (ret < 0) {
+            if (errno == EINTR)
+                continue;
             goto out_err;
+        }
 
         /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
-        if (FD_ISSET(xenconsoled_fd, &rsel)) {
+        if (ret == 0 && xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
+            /* Drop the buffer */
+            xenconsoled_prod = 0;
+        } else if (FD_ISSET(xenconsoled_fd, &rsel)) {
             ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;
@@ -229,7 +258,10 @@ static char * bootloader_interact(libxl_
         }
 
         /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
-        if (FD_ISSET(bootloader_fd, &rsel)) {
+        if (ret == 0 && bootloader_prod == BOOTLOADER_BUF_SIZE) {
+            /* Drop the buffer */
+            bootloader_prod = 0;
+        } else if (FD_ISSET(bootloader_fd, &rsel)) {
             ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 06:54:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 06:54:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGA81-0002jw-8m; Tue, 18 Oct 2011 06:54:49 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGA7H-0002WP-Ia
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 06:54:03 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1318946038!35749417!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4055 invoked from network); 18 Oct 2011 13:53:59 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 13:53:59 -0000
Received: by iaen33 with SMTP id n33so952769iae.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 06:53:58 -0700 (PDT)
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=7UaFeTZvLMYNdIvyn+JK9e5lHH4h8HfEQsKxpvKYt5c=;
	b=lgj65XQYFI4BQAYS+Ty1e/leCHaMQ7FFVVlNL4+adxv9I75LPGWBusbFekHhCsj572
	vWnCYZ+wmJCNcSAIpe5DpQAtZXwy+n9MFB+XmSwrRnqJ/izXRVsXQy5Cof6CYNULWca9
	IUqh3hHcXlvs82NcrDJQSBSe1+JS/6mLo4cKY=
MIME-Version: 1.0
Received: by 10.42.136.196 with SMTP id v4mr5046369ict.3.1318946038272; Tue,
	18 Oct 2011 06:53:58 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Tue, 18 Oct 2011 06:53:58 -0700 (PDT)
Date: Tue, 18 Oct 2011 14:53:58 +0100
X-Google-Sender-Auth: Z3Bbhz50nCCBYlFkkd4YJ5HtXeU
Message-ID: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@mail.gmail.com>
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: xen-devel@lists.xensource.com, Keir Fraser <keir@xen.org>, 
	Jonathan Ludlam <jonathan.ludlam@eu.citrix.com>
Content-Type: multipart/mixed; boundary=90e6ba613c7c16d1be04af930e36
Cc: 
Subject: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--90e6ba613c7c16d1be04af930e36
Content-Type: text/plain; charset=ISO-8859-1

When trying to make a XenServer branch with xen-server, I managed to
get Xen to build, but when I tried to use some of the ocaml output, I
got the following errors:

gcc: /bind/obj/RPM_BUILD_DIRECTORY/xen-4.2.unstable/tools/ocaml/libs/xc/../../../../tools/libxc/libxenctrl.so:
No such file or directory
gcc: /bind/obj/RPM_BUILD_DIRECTORY/xen-4.2.unstable/tools/ocaml/libs/xc/../../../../tools/libxc/libxenguest.so:
No such file or directory


It appears that somehow the change made in 23071:a3466b005017 ended up
putting in a hard-link to the exact directory of the library in the
resulting .ml files, which is only used when someone attempts to
actually use those files.  Since, of course, those exact directories
are gone when the RPM build is over, this doesn't work very well. :-)

The attached patch reverts the parts of 23071 which pertains to
tools/ocaml/libs/xc, and the resulting *.ml files work properly again.
 But I'm not sure what the desired approach is going forward -- I'm
not familiar enough with the ocaml link process to know what a
"proper" fix would be (i.e., one which accomplishes the goal of 23071)

 -George

--90e6ba613c7c16d1be04af930e36
Content-Type: text/plain; charset=US-ASCII;
	name="20111018-ocaml-no-hard-links.diff"
Content-Disposition: attachment; filename="20111018-ocaml-no-hard-links.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gtwym77c0

IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBQYXJlbnQgNGIwOTA3YzZhMDhjMzQ4OTYyYmQ5NzZjMjk3
NjI1N2I0MTI0MDhiZQpEb24ndCB1c2UgaGFyZGxpbmtzIGluIG9jYW1sCgpEYXRlIGFkZGVkOiAy
MDExMTAxMwoKQW4gdXBzdHJlYW0gcGF0Y2ggZXJyb25lb3VzbHkgaW50cm9kdWNlcyBhIGhhcmRs
aW5rIGluIHRoZSBsaWJyYXJ5CnRvIHRoZSBidWlsZCBwYXRoLiAgVW5sZXNzIHRoYXQgZXhhY3Qg
cGF0aCBleGlzdHMgd2hlbiB0aGUgbGlicmFyeSBpcwpsaW5rZWQgbGF0ZXIgKHZlcnkgdW5saWtl
bHkpLCB0aGUgbGF0ZXIgbGluayB3aWxsIGZhaWwuCgpVcHN0cmVhbSBwbGFuOiBOZWVkcyB0byBi
ZSB1cHN0cmVhbWVkIGFzLWlzCgpkaWZmIC1yIDRiMDkwN2M2YTA4YyB0b29scy9vY2FtbC9saWJz
L3hjL01ha2VmaWxlCi0tLSBhL3Rvb2xzL29jYW1sL2xpYnMveGMvTWFrZWZpbGUJVHVlIE9jdCAx
MSAxMjowMjo1OCAyMDExICswMTAwCisrKyBiL3Rvb2xzL29jYW1sL2xpYnMveGMvTWFrZWZpbGUJ
VGh1IE9jdCAxMyAxNzoyODowNiAyMDExICswMTAwCkBAIC05LDcgKzksNyBAQCBPQkpTID0geGVu
Y3RybAogSU5URiA9IHhlbmN0cmwuY21pCiBMSUJTID0geGVuY3RybC5jbWEgeGVuY3RybC5jbXhh
CiAKLUxJQlNfeGVuY3RybCA9ICQoTERMSUJTX2xpYnhlbmN0cmwpICQoTERMSUJTX2xpYnhlbmd1
ZXN0KQorTElCU194ZW5jdHJsID0gLUwkKFhFTl9ST09UKS90b29scy9saWJ4YyAtbHhlbmN0cmwg
LWx4ZW5ndWVzdAogCiB4ZW5jdHJsX09CSlMgPSAkKE9CSlMpCiB4ZW5jdHJsX0NfT0JKUyA9IHhl
bmN0cmxfc3R1YnMK
--90e6ba613c7c16d1be04af930e36
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

--90e6ba613c7c16d1be04af930e36--


From xen-devel-bounces@lists.xensource.com Tue Oct 18 07:01:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 07:01:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGAEm-0003YX-SR; Tue, 18 Oct 2011 07:01:49 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGABp-0003Gk-KE
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 06:58:46 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318946305!1419914!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28944 invoked from network); 18 Oct 2011 13:58:25 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 13:58:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315180800"; 
   d="scan'208";a="8447877"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 13:58:09 +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, 18 Oct 2011 14:58:08 +0100
Subject: Re: [Xen-devel] [PATCH v4] libxl: reimplement buffer for
	bootloading and drop data if buffer is full
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Date: Tue, 18 Oct 2011 14:58:08 +0100
In-Reply-To: <f7b311b85973f5862c32.1318945118@loki>
References: <f7b311b85973f5862c32.1318945118@loki>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1318946288.3385.18.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-10-18 at 14:38 +0100, Roger Pau Monne wrote:
> # HG changeset patch
> # User Roger Pau Monne <roger.pau@entel.upc.edu>
> # Date 1318944898 -7200
> # Node ID f7b311b85973f5862c323fed4e89c20b7af139a8
> # Parent  6fd16bcdd3e55bf8cc6e6e90e910f32e37654fd7
> libxl: reimplement buffer for bootloading and drop data if buffer is full.
> 
> Implement a buffer for the bootloading process that appends data to the end until it's full. Drop the whole buffer if a timeout has occurred and the buffer is full. Prevents the bootloader from getting stuck when using ptys with small buffers.
> 
> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
> 
> diff -r 6fd16bcdd3e5 -r f7b311b85973 tools/libxl/libxl_bootloader.c
> --- a/tools/libxl/libxl_bootloader.c	Tue Oct 18 15:10:04 2011 +0200
> +++ b/tools/libxl/libxl_bootloader.c	Tue Oct 18 15:34:58 2011 +0200
> @@ -28,7 +28,8 @@
>  #include "flexarray.h"
>  
>  #define XENCONSOLED_BUF_SIZE 16
> -#define BOOTLOADER_BUF_SIZE 1024
> +#define BOOTLOADER_BUF_SIZE 4096
> +#define BOOTLOADER_TIMEOUT 1
>  
>  static char **make_bootloader_args(libxl__gc *gc,
>                                     libxl_domain_build_info *info,
> @@ -169,6 +170,7 @@ static char * bootloader_interact(libxl_
>  
>      size_t nr_out = 0, size_out = 0;
>      char *output = NULL;
> +    struct timeval wait;
>  
>      /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
>      int xenconsoled_prod = 0, xenconsoled_cons = 0;
> @@ -181,39 +183,66 @@ static char * bootloader_interact(libxl_
>          fd_set wsel, rsel;
>          int nfds;
>  
> +        /* Set timeout to 1s before starting to discard data */
> +        wait.tv_sec = BOOTLOADER_TIMEOUT;
> +        wait.tv_usec = 0;
> +
>          if (xenconsoled_prod == xenconsoled_cons)
>              xenconsoled_prod = xenconsoled_cons = 0;
>          if (bootloader_prod == bootloader_cons)
>              bootloader_prod = bootloader_cons = 0;
> +        /* Move buffers around to drop already consumed data */
> +        if (xenconsoled_cons > 0) {
> +            xenconsoled_prod -= xenconsoled_cons;
> +            memmove(xenconsoled_buf, &xenconsoled_buf[xenconsoled_cons],
> +                    xenconsoled_prod);
> +            xenconsoled_cons = 0;
> +        }
> +        if (bootloader_cons > 0) {
> +            bootloader_prod -= bootloader_cons;
> +            memmove(bootloader_buf, &bootloader_buf[bootloader_cons],
> +                    bootloader_prod);
> +            bootloader_cons = 0;
> +        }
>  
>          FD_ZERO(&rsel);
>          FD_SET(fifo_fd, &rsel);
>          nfds = fifo_fd + 1;
> -        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0)) {
> +        if (xenconsoled_prod < XENCONSOLED_BUF_SIZE) {
>              FD_SET(xenconsoled_fd, &rsel);
>              nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
> -        }
> -        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0)) {
> +        } 
> +        if (bootloader_prod < BOOTLOADER_BUF_SIZE) {
>              FD_SET(bootloader_fd, &rsel);
>              nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
>          }
>  
>          FD_ZERO(&wsel);
> -        if (bootloader_prod != bootloader_cons) {
> +        if (bootloader_prod > 0) {

It's a little less obvious now that this test means "there is data to
consume", a comment might be appropriate.

>              FD_SET(xenconsoled_fd, &wsel);
>              nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
>          }
> -        if (xenconsoled_prod != xenconsoled_cons) {
> +        if (xenconsoled_prod > 0) {
>              FD_SET(bootloader_fd, &wsel);
>              nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
>          }
>  
> -        ret = select(nfds, &rsel, &wsel, NULL, NULL);
> -        if (ret < 0)
> +        if (xenconsoled_prod == XENCONSOLED_BUF_SIZE ||
> +            bootloader_prod == BOOTLOADER_BUF_SIZE)
> +            ret = select(nfds, &rsel, &wsel, NULL, &wait);
> +        else
> +            ret = select(nfds, &rsel, &wsel, NULL, NULL);
> +        if (ret < 0) {
> +            if (errno == EINTR)
> +                continue;
>              goto out_err;
> +        }
>  
>          /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
> -        if (FD_ISSET(xenconsoled_fd, &rsel)) {
> +        if (ret == 0 && xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
> +            /* Drop the buffer */
> +            xenconsoled_prod = 0;

Do you also need to reset cons here? I expect we could prove it was
always zero anyway but it might be more obvious to just reset it.

Otherwise this looks good, thanks.

> +        } else if (FD_ISSET(xenconsoled_fd, &rsel)) {
>              ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled_prod);
>              if (ret < 0 && errno != EIO && errno != EAGAIN)
>                  goto out_err;
> @@ -229,7 +258,10 @@ static char * bootloader_interact(libxl_
>          }
>  
>          /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
> -        if (FD_ISSET(bootloader_fd, &rsel)) {
> +        if (ret == 0 && bootloader_prod == BOOTLOADER_BUF_SIZE) {
> +            /* Drop the buffer */
> +            bootloader_prod = 0;
> +        } else if (FD_ISSET(bootloader_fd, &rsel)) {
>              ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod);
>              if (ret < 0 && errno != EIO && errno != EAGAIN)
>                  goto out_err;
> 
> _______________________________________________
> 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 Oct 18 07:12:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 07:12:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGAP1-00049e-8Y; Tue, 18 Oct 2011 07:12:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGANp-0003vN-5F
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 07:11:09 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318946951!40847013!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19628 invoked from network); 18 Oct 2011 14:09:12 -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;
	18 Oct 2011 14:09:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315180800"; 
   d="scan'208";a="8448326"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 14:11: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, 18 Oct 2011 15:11:05 +0100
Subject: Re: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
From: Ian Campbell <Ian.Campbell@citrix.com>
To: George Dunlap <George.Dunlap@eu.citrix.com>
Date: Tue, 18 Oct 2011 15:11:05 +0100
In-Reply-To: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@mail.gmail.com>
References: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@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: <1318947065.3385.26.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>,
	Jonathan Ludlam <Jonathan.Ludlam@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-10-18 at 14:53 +0100, George Dunlap wrote:
> When trying to make a XenServer branch with xen-server, I managed to
> get Xen to build, but when I tried to use some of the ocaml output, I
> got the following errors:
> 
> gcc: /bind/obj/RPM_BUILD_DIRECTORY/xen-4.2.unstable/tools/ocaml/libs/xc/../../../../tools/libxc/libxenctrl.so:
> No such file or directory
> gcc: /bind/obj/RPM_BUILD_DIRECTORY/xen-4.2.unstable/tools/ocaml/libs/xc/../../../../tools/libxc/libxenguest.so:
> No such file or directory
> 
> 
> It appears that somehow the change made in 23071:a3466b005017 ended up
> putting in a hard-link to the exact directory of the library in the
> resulting .ml files, which is only used when someone attempts to
> actually use those files.

The use of "hard-link" here is confusing. You presumably mean it bakes
the literal/precise path into the binary.

>   Since, of course, those exact directories
> are gone when the RPM build is over, this doesn't work very well. :-)
> 
> The attached patch reverts the parts of 23071 which pertains to
> tools/ocaml/libs/xc, and the resulting *.ml files work properly again.
>  But I'm not sure what the desired approach is going forward -- I'm
> not familiar enough with the ocaml link process to know what a
> "proper" fix would be (i.e., one which accomplishes the goal of 23071)

> diff -r 4b0907c6a08c tools/ocaml/libs/xc/Makefile
> --- a/tools/ocaml/libs/xc/Makefile      Tue Oct 11 12:02:58 2011 +0100
> +++ b/tools/ocaml/libs/xc/Makefile      Thu Oct 13 17:28:06 2011 +0100
> @@ -9,7 +9,7 @@ OBJS = xenctrl
>  INTF = xenctrl.cmi
>  LIBS = xenctrl.cma xenctrl.cmxa
>  
> -LIBS_xenctrl = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest)

Nowadays this expands to:
	$(XEN_LIBXC)/libxenctrl.so $(XEN_LIBXC)/libxenguest.so
prior to 23921:19d2922bcfb9 it would have been:
	-L$(XEN_LIBXC) -lxenctrl -L$(XEN_LIBXC) -lxenguest

which tree were you working against?

Are you sure 23071:a3466b005017 and not 23921:19d2922bcfb9 is to blame?
The <23931 version doesn't seem materially different to the <21071 one
whereas I can plausibly imagine that 23931 might have made a difference.

If this had been using $(SHLIB_foo) I could have imagined ways in which
that might go wrong.

> +LIBS_xenctrl = -L$(XEN_ROOT)/tools/libxc -lxenctrl -lxenguest

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 07:16:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 07:16:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGASm-0004e2-Nl; Tue, 18 Oct 2011 07:16:16 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGASB-0004QI-5w
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 07:15:39 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318947335!35789372!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9000 invoked from network); 18 Oct 2011 14:15:36 -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;
	18 Oct 2011 14:15:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315180800"; 
   d="scan'208";a="8448476"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 14:15:35 +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, 18 Oct 2011 15:15:35 +0100
Subject: Re: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
From: Ian Campbell <Ian.Campbell@citrix.com>
To: George Dunlap <George.Dunlap@eu.citrix.com>
Date: Tue, 18 Oct 2011 15:15:35 +0100
In-Reply-To: <1318947065.3385.26.camel@zakaz.uk.xensource.com>
References: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@mail.gmail.com>
	<1318947065.3385.26.camel@zakaz.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: <1318947335.3385.29.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>,
	Jonathan Ludlam <Jonathan.Ludlam@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-10-18 at 15:11 +0100, Ian Campbell wrote:
> On Tue, 2011-10-18 at 14:53 +0100, George Dunlap wrote:
> > When trying to make a XenServer branch with xen-server, I managed to
> > get Xen to build, but when I tried to use some of the ocaml output, I
> > got the following errors:
> > 
> > gcc: /bind/obj/RPM_BUILD_DIRECTORY/xen-4.2.unstable/tools/ocaml/libs/xc/../../../../tools/libxc/libxenctrl.so:
> > No such file or directory
> > gcc: /bind/obj/RPM_BUILD_DIRECTORY/xen-4.2.unstable/tools/ocaml/libs/xc/../../../../tools/libxc/libxenguest.so:
> > No such file or directory
> > 
> > 
> > It appears that somehow the change made in 23071:a3466b005017 ended up
> > putting in a hard-link to the exact directory of the library in the
> > resulting .ml files, which is only used when someone attempts to
> > actually use those files.
> 
> The use of "hard-link" here is confusing. You presumably mean it bakes
> the literal/precise path into the binary.
> 
> >   Since, of course, those exact directories
> > are gone when the RPM build is over, this doesn't work very well. :-)
> > 
> > The attached patch reverts the parts of 23071 which pertains to
> > tools/ocaml/libs/xc, and the resulting *.ml files work properly again.
> >  But I'm not sure what the desired approach is going forward -- I'm
> > not familiar enough with the ocaml link process to know what a
> > "proper" fix would be (i.e., one which accomplishes the goal of 23071)
> 
> > diff -r 4b0907c6a08c tools/ocaml/libs/xc/Makefile
> > --- a/tools/ocaml/libs/xc/Makefile      Tue Oct 11 12:02:58 2011 +0100
> > +++ b/tools/ocaml/libs/xc/Makefile      Thu Oct 13 17:28:06 2011 +0100
> > @@ -9,7 +9,7 @@ OBJS = xenctrl
> >  INTF = xenctrl.cmi
> >  LIBS = xenctrl.cma xenctrl.cmxa
> >  
> > -LIBS_xenctrl = $(LDLIBS_libxenctrl) $(LDLIBS_libxenguest)
> 
> Nowadays this expands to:
> 	$(XEN_LIBXC)/libxenctrl.so $(XEN_LIBXC)/libxenguest.so
> prior to 23921:19d2922bcfb9 it would have been:
> 	-L$(XEN_LIBXC) -lxenctrl -L$(XEN_LIBXC) -lxenguest
> 
> which tree were you working against?
> 
> Are you sure 23071:a3466b005017 and not 23921:19d2922bcfb9 is to blame?
> The <23931 version doesn't seem materially different to the <21071 one
> whereas I can plausibly imagine that 23931 might have made a difference.

The rules in tools/ocaml/Makefile.rules use:
         $(foreach lib,$(LIBS_$(1)),-cclib $(lib))
Where -cclib is documented as passing -l<arg> to the linker. Passing "-l
$(XEN_LIBXC)/libxenctrl.so" doesn't seem like it is going to be right.

-ccopt just passes the raw argument in and seems likely to be more
correct (irrespective of any of the changesets mentioned here, since the
variable seems to have always included -L and -l itself). Perhaps that
helps?

> 
> If this had been using $(SHLIB_foo) I could have imagined ways in which
> that might go wrong.
> 
> > +LIBS_xenctrl = -L$(XEN_ROOT)/tools/libxc -lxenctrl -lxenguest
> 
> Ian.
> 
> 
> _______________________________________________
> 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 Oct 18 07:33:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 07:33:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGAjH-0005Wm-Ey; Tue, 18 Oct 2011 07:33:19 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGAiO-0005H6-0A
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 07:32:24 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318948225!40850911!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15919 invoked from network); 18 Oct 2011 14:30:26 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 14:30:26 -0000
Received: by iaen33 with SMTP id n33so1002201iae.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 07:32:19 -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=3gSNLGzpjWhhqrN9tmaZGynpXkKBXMDGJD4XwNC70zE=;
	b=mXS7Nlhp/gtDZS6CctRdPVeDH+alD5WThAabx8i0ComyriIvNuiZW4hHE6auE8oOKm
	9mrj8Rz6qJ4ZJ903C9CZw20L7AW/Sx5jeyERqO0Yjo5omhLIIiahQmbjiIZcZCSRfnfe
	cZ+N7+gPavxiSWaVFBzcaBRse7/9uAJ3UfmGs=
MIME-Version: 1.0
Received: by 10.231.68.130 with SMTP id v2mr1174715ibi.71.1318948339301; Tue,
	18 Oct 2011 07:32:19 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Tue, 18 Oct 2011 07:32:19 -0700 (PDT)
In-Reply-To: <1318947065.3385.26.camel@zakaz.uk.xensource.com>
References: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@mail.gmail.com>
	<1318947065.3385.26.camel@zakaz.uk.xensource.com>
Date: Tue, 18 Oct 2011 15:32:19 +0100
X-Google-Sender-Auth: dB3as8rCA2PSUoa0tZxGFfSlu1U
Message-ID: <CAFLBxZYiM9_yT1+5nQx=5vTUbE6xLXi0cCLPDLVdhUhmDO5-NA@mail.gmail.com>
Subject: Re: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
From: George Dunlap <George.Dunlap@eu.citrix.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>,
	"Keir \(Xen.org\)" <keir@xen.org>,
	Jonathan Ludlam <Jonathan.Ludlam@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, Oct 18, 2011 at 3:11 PM, Ian Campbell <Ian.Campbell@citrix.com> wro=
te:
> The use of "hard-link" here is confusing. You presumably mean it bakes
> the literal/precise path into the binary.

Yes; it hard-codes the full path of the build tree library file.

> Nowadays this expands to:
> =A0 =A0 =A0 =A0$(XEN_LIBXC)/libxenctrl.so $(XEN_LIBXC)/libxenguest.so
> prior to 23921:19d2922bcfb9 it would have been:
> =A0 =A0 =A0 =A0-L$(XEN_LIBXC) -lxenctrl -L$(XEN_LIBXC) -lxenguest
>
> which tree were you working against?

Not sure what you're asking; this is XenServer trunk, with the xen.hg
pulled in from xen-unstable (pulled recently, like Friday or
something).

> Are you sure 23071:a3466b005017 and not 23921:19d2922bcfb9 is to blame?
> The <23931 version doesn't seem materially different to the <21071 one
> whereas I can plausibly imagine that 23931 might have made a difference.

You're right, it's actually 23921 that caused the problem.  I just did
"hg annotate" and found 23071.

> -ccopt just passes the raw argument in and seems likely to be more
> correct (irrespective of any of the changesets mentioned here, since the
> variable seems to have always included -L and -l itself). Perhaps that
> helps?

Sorry, I'm having trouble mentally compling this paragraph into patch.
:-)  (In part no doubt because I don't understand the make syntax you
mention.)  Could you explain what you mean?

Thanks,
 -George

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 07:46:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 07:46:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGAvY-0006J8-M6; Tue, 18 Oct 2011 07:46:00 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGAuh-00065k-0o
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 07:45:07 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1318949103!651575!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17221 invoked from network); 18 Oct 2011 14:45:04 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 14:45:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,365,1315180800"; 
   d="scan'208";a="8449612"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 14:45: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;
	Tue, 18 Oct 2011 15:45:02 +0100
Subject: Re: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
From: Ian Campbell <Ian.Campbell@citrix.com>
To: George Dunlap <George.Dunlap@eu.citrix.com>
Date: Tue, 18 Oct 2011 15:45:02 +0100
In-Reply-To: <CAFLBxZYiM9_yT1+5nQx=5vTUbE6xLXi0cCLPDLVdhUhmDO5-NA@mail.gmail.com>
References: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@mail.gmail.com>
	<1318947065.3385.26.camel@zakaz.uk.xensource.com>
	<CAFLBxZYiM9_yT1+5nQx=5vTUbE6xLXi0cCLPDLVdhUhmDO5-NA@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: <1318949102.3385.45.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>,
	Jonathan Ludlam <Jonathan.Ludlam@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-10-18 at 15:32 +0100, George Dunlap wrote:
> On Tue, Oct 18, 2011 at 3:11 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > The use of "hard-link" here is confusing. You presumably mean it bakes
> > the literal/precise path into the binary.
> 
> Yes; it hard-codes the full path of the build tree library file.
> 
> > Nowadays this expands to:
> >        $(XEN_LIBXC)/libxenctrl.so $(XEN_LIBXC)/libxenguest.so
> > prior to 23921:19d2922bcfb9 it would have been:
> >        -L$(XEN_LIBXC) -lxenctrl -L$(XEN_LIBXC) -lxenguest
> >
> > which tree were you working against?
> 
> Not sure what you're asking; this is XenServer trunk, with the xen.hg
> pulled in from xen-unstable (pulled recently, like Friday or
> something).

I was asking which precise xen-unstable.hg you had pulled in.

> > Are you sure 23071:a3466b005017 and not 23921:19d2922bcfb9 is to blame?
> > The <23931 version doesn't seem materially different to the <21071 one
> > whereas I can plausibly imagine that 23931 might have made a difference.
> 
> You're right, it's actually 23921 that caused the problem.  I just did
> "hg annotate" and found 23071.

OK, that makes more sense, presumably ocaml just ends up embedding the
raw arguments to -cc* in the binary.

> > -ccopt just passes the raw argument in and seems likely to be more
> > correct (irrespective of any of the changesets mentioned here, since the
> > variable seems to have always included -L and -l itself). Perhaps that
> > helps?
> 
> Sorry, I'm having trouble mentally compling this paragraph into patch.
> :-)  (In part no doubt because I don't understand the make syntax you
> mention.)  Could you explain what you mean?

The man page for ocamlopt says:
        -cclib -llibname
                Pass the -llibname option to the linker. This causes the
                given C library to be linked with the program.
        
        -ccopt option
                Pass the given option to the C compiler and linker. For
                instance, -ccopt -Ldir causes the C linker to search for
                C libraries in directory dir.

Which I misread to think that -cclib _added_ the "-l" to its argument
but actually it just passes the argument through, so I think this is a
red-herring.

In case you were wondering I was effectively proposing the following
patch, but I now think that suggestion was wrong.

diff -r e6af32ecb448 tools/ocaml/Makefile.rules
--- a/tools/ocaml/Makefile.rules	Tue Oct 18 14:15:09 2011 +0100
+++ b/tools/ocaml/Makefile.rules	Tue Oct 18 15:37:18 2011 +0100
@@ -59,7 +59,7 @@ mk-caml-lib-stubs = \
 # define a library target <name>.cmxa and <name>.cma
 define OCAML_LIBRARY_template
  $(1).cmxa: lib$(1)_stubs.a $(foreach obj,$($(1)_OBJS),$(obj).cmx)
-	$(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $(foreach obj,$($(1)_OBJS),$(obj).cmx))
+	$(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-ccopt $(lib)), $(foreach obj,$($(1)_OBJS),$(obj).cmx))
  $(1).cma: $(foreach obj,$($(1)_OBJS),$(obj).cmo)
 	$(call mk-caml-lib-bytecode,$$@, -dllib dll$(1)_stubs.so -cclib -l$(1)_stubs, $$+)
  $(1)_stubs.a: $(foreach obj,$$($(1)_C_OBJS),$(obj).o)

> 
> Thanks,
>  -George



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 08:05:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 08:05:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGBEo-0007D5-NA; Tue, 18 Oct 2011 08:05:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGBC6-0006sZ-B5
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 08:03:08 -0700
X-Env-Sender: ml-xen-devel@hfp.de
X-Msg-Ref: server-5.tower-21.messagelabs.com!1318950049!684345!1
X-Originating-IP: [88.205.101.6]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22684 invoked from network); 18 Oct 2011 15:00:49 -0000
Received: from rootsrv.hfp.de (HELO rootsrv.hfp.de) (88.205.101.6)
	by server-5.tower-21.messagelabs.com with SMTP;
	18 Oct 2011 15:00:49 -0000
Received: from localhost (localhost [127.0.0.1])
	by rootsrv.hfp.de (Postfix) with ESMTP id F38741A9D86
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 17:00:47 +0200 (CEST)
X-Virus-Scanned: amavisd-new/ClamAV at rootsrv.hfp.de
Received: from rootsrv.hfp.de ([127.0.0.1])
	by localhost (rootsrv.hfp.de [127.0.0.1]) (amavisd-new, port 10026)
	with ESMTP id zrFeWn9eQk-1 for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 17:00:47 +0200 (CEST)
Received: from [192.168.240.1] (p57ACDEAC.dip.t-dialin.net [87.172.222.172])
	by rootsrv.hfp.de (Postfix) with ESMTPA
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 17:00:47 +0200 (CEST)
Message-ID: <4E9D94A0.10102@hfp.de>
Date: Tue, 18 Oct 2011 17:00:48 +0200
From: Andreas Kinzler <ml-xen-devel@hfp.de>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US;
	rv:1.9.2.21) Gecko/20110830 Thunderbird/3.1.13
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Possible hint for "Clocksource tsc unstable" 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

Hello,

I made an interesting observation related to the "Clocksource tsc 
unstable (delta = -2999660320319 ns)" problem. In the log of ntpd I found:

Oct  5 03:46:35 greenville-dom0 ntpd[4020]: kernel time sync status 
change 6001
Oct  5 04:03:41 greenville-dom0 ntpd[4020]: kernel time sync status 
change 2001
Oct  5 05:29:03 greenville-dom0 ntpd[4020]: kernel time sync status 
change 6001
Oct  5 05:46:09 greenville-dom0 ntpd[4020]: kernel time sync status 
change 2001
Oct  5 06:54:30 greenville-dom0 ntpd[4020]: synchronized to 
192.53.103.104, stratum 1
Oct  5 06:54:30 greenville-dom0 ntpd[4020]: kernel time sync status 
change 6001
Oct  5 07:28:22 greenville-dom0 ntpd[4020]: kernel time sync status 
change 2001
Oct  5 08:19:35 greenville-dom0 ntpd[4020]: synchronized to 
192.53.103.108, stratum 1
Oct  5 10:53:26 greenville-dom0 ntpd[4020]: kernel time sync status 
change 6001
Oct  5 11:27:32 greenville-dom0 ntpd[4020]: kernel time sync status 
change 2001
Oct  5 12:01:41 greenville-dom0 ntpd[4020]: kernel time sync status 
change 6001
Oct  5 12:18:44 greenville-dom0 ntpd[4020]: kernel time sync status 
change 2001
Oct  5 13:09:58 greenville-dom0 ntpd[4020]: kernel time sync status 
change 6001
Oct  5 13:27:04 greenville-dom0 ntpd[4020]: kernel time sync status 
change 2001
Oct  5 15:26:37 greenville-dom0 ntpd[4020]: kernel time sync status 
change 6001
Oct  5 15:43:41 greenville-dom0 ntpd[4020]: kernel time sync status 
change 2001
Oct  5 17:43:11 greenville-dom0 ntpd[4020]: kernel time sync status 
change 6001
Oct  5 19:08:31 greenville-dom0 ntpd[4020]: synchronized to 
192.53.103.104, stratum 1
Oct  5 19:08:31 greenville-dom0 ntpd[4020]: kernel time sync status 
change 2001
Oct  5 21:23:58 greenville-dom0 ntpd[4020]: no servers reachable
Oct  5 21:40:58 greenville-dom0 ntpd[4020]: synchronized to 
192.53.103.104, stratum 1
Oct  5 21:40:58 greenville-dom0 ntpd[4020]: time correction of -3000 
seconds exceeds sanity limit (1000); set clock manually to the correct 
UTC time.

I had the problem twice on different machines but everytime I saw the 
line "no servers reachable". Could ntpd and/or linux kernel make some 
stupid stuff when ntp upstream servers are unreachable?

Regards Andreas


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 08:17:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 08:17:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGBQQ-00083A-GZ; Tue, 18 Oct 2011 08:17:54 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGBPY-0007og-Kf
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 08:17:00 -0700
X-Env-Sender: dkiper@net-space.pl
X-Msg-Ref: server-14.tower-174.messagelabs.com!1318951016!35755536!1
X-Originating-IP: [89.174.63.77]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17851 invoked from network); 18 Oct 2011 15:16:57 -0000
Received: from router-fw.net-space.pl (HELO router-fw.net-space.pl)
	(89.174.63.77)
	by server-14.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 18 Oct 2011 15:16:57 -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 S1598261Ab1JRPQa (ORCPT <rfc822;xen-devel@lists.xensource.com>);
	Tue, 18 Oct 2011 17:16:30 +0200
Date: Tue, 18 Oct 2011 17:16:30 +0200
From: Daniel Kiper <dkiper@net-space.pl>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Strange (???) xl behavior for save,
	migrate and migrate-receive
Message-ID: <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>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318925941.16132.36.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.3.28i
Cc: Dan Magenheimer <dan.magenheimer@oracle.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Wilk <konrad.wilk@oracle.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	"jeremy@goop.org" <jeremy@goop.org>,
	"v.tolstov@selfip.ru" <v.tolstov@selfip.ru>,
	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, Oct 18, 2011 at 09:19:01AM +0100, Ian Campbell wrote:
> On Mon, 2011-10-17 at 19:44 +0100, Dan Magenheimer wrote:
> > In a recent internal discussion at Oracle, we were thinking about
> > whether to enable hotplug functionality in a guest kernel and it
> > raised some concerns about manageability.  I think right now
> > the system administrator of the guest can arbitrarily increase
> > memory size beyond maxmem...
>
> The memory limit for a guest is ultimately controlled by the host
> administrator/toolstack. The in-guest admin cannot exceed that, even
> using hotplug.

Correct.

> I think that limit is currently always set to the current balloon target.

Nope. It is set by maxmem option.

> AIUI Daniel's work only allows a guest admin to take advantage of new
> memory above maxmem _after_ the host admin has provisioned that RAM to
> the guest. IOW it only allows the guest to take advantage of new memory
> given to it and does not allow the guest to acquire new memory of its
> own accord.

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.

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 08:22:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 08:22:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGBV9-000068-V6; Tue, 18 Oct 2011 08:22:47 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGBUX-0008Lh-V6
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 08:22:10 -0700
X-Env-Sender: dkiper@net-space.pl
X-Msg-Ref: server-4.tower-174.messagelabs.com!1318951326!35802533!1
X-Originating-IP: [89.174.63.77]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3622 invoked from network); 18 Oct 2011 15:22:06 -0000
Received: from router-fw.net-space.pl (HELO router-fw.net-space.pl)
	(89.174.63.77)
	by server-4.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 18 Oct 2011 15:22:06 -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 S1574220Ab1JRPWC (ORCPT <rfc822;xen-devel@lists.xensource.com>);
	Tue, 18 Oct 2011 17:22:02 +0200
Date: Tue, 18 Oct 2011 17:22:02 +0200
From: Daniel Kiper <dkiper@net-space.pl>
To: Dan Magenheimer <dan.magenheimer@oracle.com>
Subject: Re: [Xen-devel] Strange (???) xl behavior for save,
	migrate and migrate-receive
Message-ID: <20111018152202.GC9832@router-fw-old.local.net-space.pl>
References: <20111017174036.GD29445@router-fw-old.local.net-space.pl>
	<4ffd9c88-88d2-437f-9af1-f3f0149334d9@default>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4ffd9c88-88d2-437f-9af1-f3f0149334d9@default>
User-Agent: Mutt/1.3.28i
Cc: jeremy@goop.org, xen-devel@lists.xensource.com,
	Konrad Wilk <konrad.wilk@oracle.com>, ian.jackson@eu.citrix.com,
	v.tolstov@selfip.ru, ian.campbell@eu.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 Mon, Oct 17, 2011 at 11:44:51AM -0700, Dan Magenheimer wrote:
> > From: Daniel Kiper [mailto:dkiper@net-space.pl]
> > Subject: [Xen-devel] Strange (???) xl behavior for save, migrate and migrate-receive
> >
> > During work on memory hotplug for Xen I have received some notices
> > that it breaks machine migration. I had some time and I done some
> > tests a few days ago. It looks that source of this problem is
> > xl command itself. I discovered that generic save/restore mechanism
> > is used for machine migration. xl save store machine config which
> > was used at machine startup with current machine state. It means
> > that it does not take into account any config changes which were made
> > during machine run. This behavior does not allow migrating domain,
> > on which memory hotplug was used, to restore on destination host
> > because current size of memory allocated for machine is larger than
> > size of memory allocated at startup by memory option. Yes, it is
> > memory option not maxmem option. However, it is not important here
> > because I think that generic behavior of xl save, migrate and migrate-receive
> > should be changed (fix for memory hotplug case is workaround for the
> > generic problem which will return sooner or later). I think that xl save,
> > migrate and migrate-receive should use current machine state and __CURRENT__
> > config (from xenstore ???) to do their tasks. However, I am aware that
> > this change could have large impact on current users. That is why I decided
> > to ask you about your opinion and suggested solutions in that case
> > (in general not memory hotplug only).
> >
> > Currently, these problems could be workaround by passing
> > path to config file with current config to xl command.
> >
> > I have done tests on Xen Ver. 4.1.2-rc3. I have not done tests
> > on xm command, however, I suppose that it has similar behavior.
>
> Hi Daniel --
>
> In a recent internal discussion at Oracle, we were thinking about
> whether to enable hotplug functionality in a guest kernel and it
> raised some concerns about manageability.  I think right now
> the system administrator of the guest can arbitrarily increase
> memory size beyond maxmem... that is really the whole point
> of your implementation, right?  But this may be unacceptable to
> the "data center administrator" (the admin who runs the "cloud"
> and determines such things as vcpus and maxmem across all guests)
> since multiple guests may try to do this semi-maliciously to grab
> as much RAM as they can. And Xen has no way to discourage this,
> so will just hand out the RAM first-come-first-serve, right?
>
> I was thinking one way to handle this problem would be
> to have a new vm.cfg parameter, e.g. "maxmem_hotplug".
> If unspecified (or zero), there are no constraints placed
> on the guest.  If specified (in MB), Xen/xl will disallow
> hotplug memory requests beyond this maximum.
>
> I suspect, if implemented properly, this might also eliminate
> your live migration issue.
>
> Apologies if something like this was previously discussed or
> is already working in your implementation.

Please look into Ian and my e-mail posted earlier.

> Dan
>
> P.S. Also FYI, selfballooning is implemented in Oracle's kernel
> so we should work to ensure that selfballooning and hotplug
> work properly together.

I am happy to do that, however, I am very busy now.
Could we postpone this 2-3 months ???

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 08:33:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 08:33:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGBfj-0000jY-7z; Tue, 18 Oct 2011 08:33:43 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGBf1-0000WX-Tj
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 08:33:00 -0700
X-Env-Sender: dkiper@net-space.pl
X-Msg-Ref: server-15.tower-174.messagelabs.com!1318951976!29423869!1
X-Originating-IP: [89.174.63.77]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10896 invoked from network); 18 Oct 2011 15:32:56 -0000
Received: from router-fw.net-space.pl (HELO router-fw.net-space.pl)
	(89.174.63.77)
	by server-15.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 18 Oct 2011 15:32: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 S1591986Ab1JRPcp (ORCPT <rfc822;xen-devel@lists.xensource.com>);
	Tue, 18 Oct 2011 17:32:45 +0200
Date: Tue, 18 Oct 2011 17:32:45 +0200
From: Daniel Kiper <dkiper@net-space.pl>
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] Strange (???) xl behavior for save,
	migrate and migrate-receive
Message-ID: <20111018153245.GD9832@router-fw-old.local.net-space.pl>
References: <20111017174036.GD29445@router-fw-old.local.net-space.pl>
	<20111017191205.GA16667@aepfle.de>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111017191205.GA16667@aepfle.de>
User-Agent: Mutt/1.3.28i
Cc: jeremy@goop.org, xen-devel@lists.xensource.com, konrad.wilk@oracle.com,
	ian.jackson@eu.citrix.com, v.tolstov@selfip.ru,
	ian.campbell@eu.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 Mon, Oct 17, 2011 at 09:12:05PM +0200, Olaf Hering wrote:
> On Mon, Oct 17, Daniel Kiper wrote:
>
> > During work on memory hotplug for Xen I have received some notices
> > that it breaks machine migration. I had some time and I done some
> > tests a few days ago. It looks that source of this problem is
> > xl command itself. I discovered that generic save/restore mechanism
> > is used for machine migration. xl save store machine config which
> > was used at machine startup with current machine state. It means
> > that it does not take into account any config changes which were made
> > during machine run. This behavior does not allow migrating domain,
> > on which memory hotplug was used, to restore on destination host
> > because current size of memory allocated for machine is larger than
> > size of memory allocated at startup by memory option. Yes, it is
> > memory option not maxmem option. However, it is not important here
> > because I think that generic behavior of xl save, migrate and migrate-receive
> > should be changed (fix for memory hotplug case is workaround for the
> > generic problem which will return sooner or later). I think that xl save,
> > migrate and migrate-receive should use current machine state and __CURRENT__
> > config (from xenstore ???) to do their tasks. However, I am aware that
> > this change could have large impact on current users. That is why I decided
> > to ask you about your opinion and suggested solutions in that case
> > (in general not memory hotplug only).
>
> Its easy to implement in xl by throwing some xenstore watches into the
> code.
>
> http://lists.xensource.com/archives/html/xen-devel/2011-10/msg00778.html

Thanks. I saw your e-mail eariler, however, I decided to post my one
separetly because it is a bit different case. As you said implementation
is probably easy. However, I do not want break default behavior of
xl without consent with Xen-devel members.

Daniel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 10:34:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 10:34:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGDYI-0001v2-Us; Tue, 18 Oct 2011 10:34:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGDVg-000181-Po
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 10:31:29 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318959085!117434!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26879 invoked from network); 18 Oct 2011 17:31:25 -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;
	18 Oct 2011 17:31:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,366,1315180800"; 
   d="scan'208";a="8453808"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 17:31: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, 18 Oct 2011 18:31:25 +0100
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
	1RGDVc-0001c4-VK; Tue, 18 Oct 2011 17:31:25 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RGDVc-0002ux-QN;
	Tue, 18 Oct 2011 18:31:24 +0100
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: <20125.47084.805207.230744@mariner.uk.xensource.com>
Date: Tue, 18 Oct 2011 18:31:24 +0100
To: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH v8 0/6] build upstream qemu and seabios by
	default
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <alpine.DEB.2.00.1110131909250.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110131909250.3519@kaball-desktop>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Ian, Campbell <Ian.Campbell@eu.citrix.com>,
	"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

Stefano Stabellini writes ("[Xen-devel] [PATCH v8 0/6] build upstream qemu and seabios by default"):
> Hi all,
> this is the eighth version of the patch series to introduce upstream qemu
> and seabios in the xen-unstable build system.

I tried this series.  I built my tree with this in .config
  CONFIG_QEMU=/u/iwj/work/1/qemu-iwj.git
  QEMU_UPSTREAM_URL=/u/iwj/work/1/qemu-upstream-unstable.git

I then found that the directory qemu-upstream-unstable.git contained a
symlink qemu-upstream-unstable.git linking to the directory (by full
pathname).  It also had "linux-headers/asm" which wasn't covered by
.gitignore.

The xen-unstable-tools.hg tree I built it in also ended up with an
awful lot of
 ? tools/firmware/seabios-dir-remote/*


Can you please test:

 * That setting CONFIG_QEMU and QEMU_UPSTREAM_URL and
   SEABIOS_UPSTREAM_URL (work whether they are set to URLs or
   directories)
 * That after building the dists/ tree looks as you would expect
   (compare it with a dists/ tree from before your series)
 * That setting {QEMU_UPSTREAM,SEABIOS_UPSTREAM,QEMU}_TAG still works
   afterwards.
 * That "make clean" cleans up everything that "make" creates except
   for things which you deliberately decide it shouldn't
 * That everything that "make" creates is mentioned in the
   appropriate ignore files
 * That a 2nd "make" doesn't do a lot of needless work
 * That machinery is provided for pulling included trees eg
   analagous to
     make tools/ioemu-dir-force-update


Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 10:42:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 10:42:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGDg2-0003Rb-IO; Tue, 18 Oct 2011 10:42:10 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGDfX-0003FE-RI
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 10:41:40 -0700
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1318959695!681347!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 843 invoked from network); 18 Oct 2011 17:41:36 -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; 18 Oct 2011 17:41:36 -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
	p9IHfUDW026091
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 18 Oct 2011 17:41: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
	p9IHTLmY022667
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 18 Oct 2011 17:29:22 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
	p9IHfNFj031013; Tue, 18 Oct 2011 12:41:23 -0500
MIME-Version: 1.0
Message-ID: <1697aec8-87e5-45a4-99a0-08be699af3f0@default>
Date: Tue, 18 Oct 2011 10:41:17 -0700 (PDT)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: Andreas Kinzler <ml-xen-devel@hfp.de>, xen-devel@lists.xensource.com
Subject: RE: [Xen-devel] Possible hint for "Clocksource tsc unstable" problem
References: <4E9D94A0.10102@hfp.de>
In-Reply-To: <4E9D94A0.10102@hfp.de>
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: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090206.4E9DBA4D.003A,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 had the problem twice on different machines but everytime I saw the
> line "no servers reachable". Could ntpd and/or linux kernel make some
> stupid stuff when ntp upstream servers are unreachable?

Can you reproduce it by disconnecting the LAN and/or
somehow blocking the route to your ntp server?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 11:02:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 11:02:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGDzh-00050c-K2; Tue, 18 Oct 2011 11:02:29 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGDwD-0004kb-BQ
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 10:58:54 -0700
X-Env-Sender: dan.magenheimer@oracle.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1318960713!710028!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20434 invoked from network); 18 Oct 2011 17:58:34 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-2.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 18 Oct 2011 17:58:34 -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
	p9IHwQRo025574
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 18 Oct 2011 17:58:28 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
	p9IHwNeF003189
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 18 Oct 2011 17:58:23 GMT
Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9IHwEMq019169; Tue, 18 Oct 2011 12:58:15 -0500
MIME-Version: 1.0
Message-ID: <ad8104a5-5d0f-4566-92a6-2a0d7114388c@default>
Date: Tue, 18 Oct 2011 10:58:08 -0700 (PDT)
From: Dan Magenheimer <dan.magenheimer@oracle.com>
To: Daniel Kiper <dkiper@net-space.pl>, Ian Campbell <Ian.Campbell@citrix.com>
Subject: RE: [Xen-devel] Strange (???) xl behavior for save, migrate and
	migrate-receive
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>
In-Reply-To: <20111018151630.GB9832@router-fw-old.local.net-space.pl>
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.0A090209.4E9DBE44.00ED:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: jeremy@goop.org, Ian, Konrad Wilk <konrad.wilk@oracle.com>,
	Jackson <Ian.Jackson@eu.citrix.com>, v.tolstov@selfip.ru,
	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: Daniel Kiper [mailto:dkiper@net-space.pl]
> Subject: Re: [Xen-devel] Strange (???) xl behavior for save, migrate and =
migrate-receive
>=20
> On Tue, Oct 18, 2011 at 09:19:01AM +0100, Ian Campbell wrote:
> > On Mon, 2011-10-17 at 19:44 +0100, Dan Magenheimer wrote:
> > > In a recent internal discussion at Oracle, we were thinking about
> > > whether to enable hotplug functionality in a guest kernel and it
> > > raised some concerns about manageability.  I think right now
> > > the system administrator of the guest can arbitrarily increase
> > > memory size beyond maxmem...
> >
> > The memory limit for a guest is ultimately controlled by the host
> > administrator/toolstack. The in-guest admin cannot exceed that, even
> > using hotplug.
>=20
> Correct.
>=20
> > I think that limit is currently always set to the current balloon targe=
t.
>=20
> Nope. It is set by maxmem option.
>=20
> > AIUI Daniel's work only allows a guest admin to take advantage of new
> > memory above maxmem _after_ the host admin has provisioned that RAM to
> > the guest. IOW it only allows the guest to take advantage of new memory
> > given to it and does not allow the guest to acquire new memory of its
> > own accord.
>=20
> Guest/host administartor could allocate for given guest no more memory th=
an
> maxmem (its value could be changed by xl mem-max <domain> <new_size>) all=
ows,
> regardless of mechanism (ballooning or memory hotplug) used for that allo=
cation.
> It means that memory hotplug does not pose any security threat in that ar=
ea.

OK, thanks for the clarification, Daniel and Ian.

> > P.S. Also FYI, selfballooning is implemented in Oracle's kernel
> > so we should work to ensure that selfballooning and hotplug
> > work properly together.
>=20
> I am happy to do that, however, I am very busy now.
> Could we postpone this 2-3 months ???

Sure, that's fine.

Dan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 11:10:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 11:10:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGE7c-0005XB-S3; Tue, 18 Oct 2011 11:10:41 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGE5v-0005Ip-8a
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 11:08:56 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1318961332!119948!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4469 invoked from network); 18 Oct 2011 18:08:52 -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;
	18 Oct 2011 18:08:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,366,1315180800"; 
   d="scan'208";a="8454296"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	18 Oct 2011 18:08: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; Tue, 18 Oct 2011 19:08:52 +0100
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
	1RGE5r-0001ol-Kn; Tue, 18 Oct 2011 18:08:51 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RGE5r-0002xZ-IS;
	Tue, 18 Oct 2011 19:08:51 +0100
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: <20125.49331.560646.906231@mariner.uk.xensource.com>
Date: Tue, 18 Oct 2011 19:08:51 +0100
To: "rshriram@cs.ubc.ca" <rshriram@cs.ubc.ca>
In-Reply-To: <47fdd52af616131142ac.1318549672@athos.nss.cs.ubc.ca>
References: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
	<47fdd52af616131142ac.1318549672@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 1 of 3 V3] 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

rshriram@cs.ubc.ca writes ("[PATCH 1 of 3 V3] tools/libxc: Remus Checkpoint Compression"):
> +            flag = *src & FLAGMASK;
> +            len = *src & LENMASK;
> +            pos++;
> +            src++;
> +
> +            if (flag == RUNFLAG)
> +            {
> +                if ((pos + len * sizeof(uint32_t)) > compbuf_size)
> +                {
> +                    ERROR("Out of bounds exception in compression buffer (d):"
> +                          "read ptr %lu, runlen = %u, bufsize = %lu\n",
> +                          pos, len * sizeof(uint32_t), compbuf_size);
> +                    return -1;
> +                }
> +
> +                memcpy(&destpage[pagepos], src, len * sizeof(uint32_t));

I think this may have a buffer overrun vulnerability.  It seems to me
that it can write beyond destpage + XC_PAGE_SIZE.  Decompressors are
often a source of security vulnerabilities of this kind, so it's
important that we look at it closely.

> +int xc_compression_uncompress_page(xc_interface *xch, char *compbuf,
> +                                   unsigned long compbuf_size,
> +                                   unsigned long *compbuf_pos, char *dest)
> +{
> +    return uncompress_page(xch, dest, compbuf_pos,
> +                           (uint8_t *)compbuf, compbuf_size);
> +}

What is the purpose of this wrapper function ?  All it seems to do is
massage the type and order of arguments.

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 Oct 18 12:01:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 12:01:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGEv5-0008EP-Gm; Tue, 18 Oct 2011 12:01:48 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGEqm-0007g4-PL
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 11:57:21 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318964237!125155!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2579 invoked from network); 18 Oct 2011 18:57:17 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-12.tower-216.messagelabs.com with SMTP;
	18 Oct 2011 18:57:17 -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 15ED8C56101;
	Tue, 18 Oct 2011 19:57:15 +0100 (BST)
Date: Tue, 18 Oct 2011 19:57:15 +0100
From: Alex Bligh <alex@alex.org.uk>
To: xen-devel@lists.xensource.com
Message-ID: <DFC59CD6B72571D62D342F37@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: Alex Bligh <alex@alex.org.uk>
Subject: [Xen-devel] Compilation problems: oldstyle/xenlinux 2.6.38, blktap2
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

I am trying to port Andrew Lyon's oldstyle/xenlinux patches against
2.6.38 to an Ubuntu 2.6.38 Natty kernel.

I am running across this problem, which is in essence that the same
functions are implemented in blktap2 and blktap2-new:

  LD      drivers/xen/built-in.o
drivers/xen/blktap2-new/built-in.o: In function `blktap_ring_init':
/home/amb/xen/ubuntu/git/ubuntu-natty/drivers/xen/blktap2-new/ring.c:521: 
multiple definition of `blktap_ring_init'
drivers/xen/blktap2/built-in.o:/home/amb/xen/ubuntu/git/ubuntu-natty/drivers/xen/blktap2/ring.c:587: 
first defined here
drivers/xen/blktap2-new/built-in.o: In function `blktap_ring_destroy':
/home/amb/xen/ubuntu/git/ubuntu-natty/drivers/xen/blktap2-new/ring.c:459: 
multiple definition of `blktap_ring_destroy'
drivers/xen/blktap2/built-in.o:/home/amb/xen/ubuntu/git/ubuntu-natty/drivers/xen/blktap2/ring.c:557: 
first defined here
drivers/xen/blktap2-new/built-in.o: In function `blktap_device_init':
/home/amb/xen/ubuntu/git/ubuntu-natty/drivers/xen/blktap2-new/device.c:550:
...
[similar snipped]
...
make[2]: *** [drivers/xen/built-in.o] Error 1
make[1]: *** [drivers/xen] Error 2
make: *** [drivers] Error 2


As far as I can tell from the Makefile, both directories are always built:

  obj-$(CONFIG_XEN_BLKDEV_TAP2)           += blktap2/ blktap2-new/

What's the difference between blktap2 and blktap2-new? Should only
one be built? I can't see a config option that switches between them.

I know one option is to just build blktap instead and ignore blktap2.
If I want to run this as a dom0 for Xen 3.3, will I lose anything
by not having blktap2?

-- 
Alex Bligh


CONFIG_X86_XEN_MCE=y
CONFIG_XEN_PCIDEV_FRONTEND=y
# CONFIG_XEN_PCIDEV_FE_DEBUG is not set
CONFIG_NETXEN_NIC=m
# CONFIG_TCG_XEN is not set
# CONFIG_XEN_WDT is not set
CONFIG_XEN=y
CONFIG_XEN_INTERFACE_VERSION=0x00030207
# XEN
CONFIG_XEN_PRIVILEGED_GUEST=y
CONFIG_XEN_PRIVCMD=y
CONFIG_XEN_DOMCTL=y
CONFIG_XEN_XENBUS_DEV=y
CONFIG_XEN_NETDEV_ACCEL_SFC_UTIL=m
CONFIG_XEN_BACKEND=y
CONFIG_XEN_BLKDEV_BACKEND=y
CONFIG_XEN_BLKDEV_TAP=y
CONFIG_XEN_BLKDEV_TAP2=y
CONFIG_XEN_BLKBACK_PAGEMAP=y
CONFIG_XEN_NETDEV_BACKEND=y
CONFIG_XEN_NETDEV_TX_SHIFT=8
# CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER is not set
# CONFIG_XEN_NETDEV_LOOPBACK is not set
CONFIG_XEN_PCIDEV_BACKEND=y
CONFIG_XEN_PCIDEV_BACKEND_VPCI=y
# CONFIG_XEN_PCIDEV_BACKEND_PASS is not set
# CONFIG_XEN_PCIDEV_BACKEND_SLOT is not set
# CONFIG_XEN_PCIDEV_BE_DEBUG is not set
# CONFIG_XEN_TPMDEV_BACKEND is not set
CONFIG_XEN_SCSI_BACKEND=m
CONFIG_XEN_USB_BACKEND=m
CONFIG_XEN_BLKDEV_FRONTEND=m
CONFIG_XEN_NETDEV_FRONTEND=m
CONFIG_XEN_NETDEV_ACCEL_SFC_FRONTEND=m
CONFIG_XEN_SCSI_FRONTEND=m
CONFIG_XEN_USB_FRONTEND=m
CONFIG_XEN_USB_FRONTEND_HCD_STATS=y
# CONFIG_XEN_USB_FRONTEND_HCD_PM is not set
CONFIG_XEN_GRANT_DEV=y
CONFIG_XEN_FRAMEBUFFER=y
CONFIG_XEN_KEYBOARD=y
CONFIG_XEN_DISABLE_SERIAL=y
CONFIG_XEN_SYSFS=y
CONFIG_XEN_NR_GUEST_DEVICES=256
CONFIG_XEN_COMPAT_030002_AND_LATER=y
# CONFIG_XEN_COMPAT_030004_AND_LATER is not set
# CONFIG_XEN_COMPAT_030100_AND_LATER is not set
# CONFIG_XEN_COMPAT_030200_AND_LATER is not set
# CONFIG_XEN_COMPAT_030300_AND_LATER is not set
# CONFIG_XEN_COMPAT_030400_AND_LATER is not set
# CONFIG_XEN_COMPAT_040000_AND_LATER is not set
# CONFIG_XEN_COMPAT_040100_AND_LATER is not set
# CONFIG_XEN_COMPAT_LATEST_ONLY is not set
CONFIG_XEN_COMPAT=0x030002
CONFIG_XEN_SMPBOOT=y
CONFIG_XEN_DEVMEM=y
CONFIG_XEN_BALLOON=y
CONFIG_XEN_SCRUB_PAGES=y
CONFIG_XEN_DEV_EVTCHN=m


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 12:18:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 12:18:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGFBV-0000uQ-Kl; Tue, 18 Oct 2011 12:18:45 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGFAa-0000hj-NF
	for Xen-devel@lists.xensource.com; Tue, 18 Oct 2011 12:17:49 -0700
X-Env-Sender: mukesh.rathor@oracle.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1318965464!127196!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16619 invoked from network); 18 Oct 2011 19:17:45 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 18 Oct 2011 19:17: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
	p9IJHbaY028436
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 18 Oct 2011 19:17:39 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
	p9IJHZVs020111
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 18 Oct 2011 19:17:36 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
	p9IJHS4E013325; Tue, 18 Oct 2011 14:17:28 -0500
Received: from mantra.us.oracle.com (/130.35.68.95)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 18 Oct 2011 12:17:28 -0700
Date: Tue, 18 Oct 2011 12:17:27 -0700
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Message-ID: <20111018121727.27a3f03c@mantra.us.oracle.com>
In-Reply-To: <1318925582.16132.31.camel@zakaz.uk.xensource.com>
References: <20111013181853.15381ef5@mantra.us.oracle.com>
	<CABDA859.22DA3%keir.xen@gmail.com>
	<20111017191810.28876947@mantra.us.oracle.com>
	<1318925582.16132.31.camel@zakaz.uk.xensource.com>
Organization: Oracle Corporation
X-Mailer: Claws Mail 3.7.6 (GTK+ 2.18.9; x86_64-redhat-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
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.4E9DD0D3.00D1:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Keir Fraser <keir.xen@gmail.com>, Jeremy Fitzhardinge <jeremy@goop.org>
Subject: [Xen-devel] Re: HYBRID: gnttab_map() to map shared frames..
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 18 Oct 2011 09:13:02 +0100
Ian Campbell <Ian.Campbell@citrix.com> wrote:
... 
> Could GNTTABOP_setup_table return GFNs from the very top of the GFN
> space? Perhaps even above what would be architecturally valid,
> although perhaps that is incompatible with HAP. Anything above
> max_pfn would seem to be valid for the hypervisor to place "magic"
> mappings in?

Well, what's confusing me for this is that there are few max 
pfn's inside the guest! The nr_pages being one for example, then 
there's max_pfn in shared_info.arch. I'm not sure if these two are in 
sync with max_pfn in mm/bootmem.c. Then, we would need to adjust EPT to add 
these pfns there. So that may put a damper on this.

> Another approach might be to take advantage of the fact that a modern
> PV kernel will call XENMEM_memory_map to obtain an e820 describing its
> pseudo-physical address space. You could arrange for there to be some
> reserved space returned in that.

I saw e820 code last night, and wondered if this might be the best option.
I am glad you mentioned it. I am not much familiar with e820 format, so 
studying it right now.

thanks,
Mukesh


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 13:42:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 13:42:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGGUp-0004W8-CB; Tue, 18 Oct 2011 13:42:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGGTn-0004JU-4d
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 13:41:43 -0700
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1318970488!42224914!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23070 invoked from network); 18 Oct 2011 20:41:28 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-11.tower-27.messagelabs.com with SMTP;
	18 Oct 2011 20:41:28 -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 p9IKfaQ7011725
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 18 Oct 2011 16:41:36 -0400
Received: from lacos-laptop.redhat.com (vpn1-6-77.ams2.redhat.com [10.36.6.77])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9IKfWTp002732; Tue, 18 Oct 2011 16:41:33 -0400
From: Laszlo Ersek <lersek@redhat.com>
To: xen-devel@lists.xensource.com
Date: Tue, 18 Oct 2011 22:42:59 +0200
Message-Id: <1318970579-6282-1-git-send-email-lersek@redhat.com>
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
Cc: Laszlo Ersek <lersek@redhat.com>, Jeremy Fitzhardinge <jeremy@goop.org>,
	Joe Jin <joe.jin@oracle.com>, Zhenzhong Duan <zhenzhong.duan@oracle.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH] remove blocked time accounting from xen
	"clockchip"
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 "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).

The approach may be completely misguided.

[1] https://lkml.org/lkml/2011/10/6/10
[2] http://lists.xensource.com/archives/html/xen-devel/2010-08/msg01068.html

Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---
 arch/x86/xen/time.c |   17 ++---------------
 1 files changed, 2 insertions(+), 15 deletions(-)

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, xen_runstate);
 /* snapshots of runstate info */
 static DEFINE_PER_CPU(struct vcpu_runstate_info, xen_runstate_snapshot);
 
-/* 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);
 
 /* 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;
 
 	get_runstate_snapshot(&state);
@@ -125,7 +124,6 @@ static void do_stolen_accounting(void)
 	snap = &__get_cpu_var(xen_runstate_snapshot);
 
 	/* work out how much time the VCPU has not been runn*ing*  */
-	blocked = state.time[RUNSTATE_blocked] - snap->time[RUNSTATE_blocked];
 	runnable = state.time[RUNSTATE_runnable] - snap->time[RUNSTATE_runnable];
 	offline = state.time[RUNSTATE_offline] - snap->time[RUNSTATE_offline];
 
@@ -141,17 +139,6 @@ static void do_stolen_accounting(void)
 	ticks = 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 += __this_cpu_read(xen_residual_blocked);
-
-	if (blocked < 0)
-		blocked = 0;
-
-	ticks = iter_div_u64_rem(blocked, NS_PER_TICK, &blocked);
-	__this_cpu_write(xen_residual_blocked, blocked);
-	account_idle_ticks(ticks);
 }
 
 /* Get the TSC speed from Xen */
-- 
1.7.4.4


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 14:06:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 14:06:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGGrp-0005Nb-Sk; Tue, 18 Oct 2011 14:06:33 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGGpe-00059c-1e
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 14:04:22 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-12.tower-216.messagelabs.com!1318971854!134097!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24443 invoked from network); 18 Oct 2011 21:04:15 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-12.tower-216.messagelabs.com with SMTP;
	18 Oct 2011 21:04:15 -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
	p9IL4A8f020992; Tue, 18 Oct 2011 21:04:10 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 p9IL49pu001470; 
	Tue, 18 Oct 2011 17:04:10 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Tue, 18 Oct 2011 17:04:10 -0400
Message-Id: <1318971851-12809-2-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Ian.Jackson@eu.citrix.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	keir@xen.org, Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 1/2] xen/event: Add reference counting to 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

Event channels exposed to userspace by the evtchn module may be used by
other modules in an asynchronous manner, which requires that reference
counting be used to prevent the event channel from being closed before
the signals are delivered.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/events.c |   34 ++++++++++++++++++++++++++++++++++
 include/xen/events.h |    6 ++++++
 2 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 7523719..36d3390 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -88,6 +88,7 @@ enum xen_irq_type {
 struct irq_info
 {
 	struct list_head list;
+	atomic_t refcount;
 	enum xen_irq_type type;	/* type */
 	unsigned irq;
 	unsigned short evtchn;	/* event channel */
@@ -407,6 +408,7 @@ static void xen_irq_init(unsigned irq)
 		panic("Unable to allocate metadata for IRQ%d\n", irq);
 
 	info->type = IRQT_UNBOUND;
+	atomic_set(&info->refcount, 1);
 
 	irq_set_handler_data(irq, info);
 
@@ -469,6 +471,8 @@ static void xen_free_irq(unsigned irq)
 
 	irq_set_handler_data(irq, NULL);
 
+	BUG_ON(atomic_read(&info->refcount) > 1);
+
 	kfree(info);
 
 	/* Legacy IRQ descriptors are managed by the arch. */
@@ -912,6 +916,10 @@ static void unbind_from_irq(unsigned int irq)
 {
 	struct evtchn_close close;
 	int evtchn = evtchn_from_irq(irq);
+	struct irq_info *info = irq_get_handler_data(irq);
+
+	if (!atomic_dec_and_test(&info->refcount))
+		return;
 
 	mutex_lock(&irq_mapping_update_lock);
 
@@ -1038,6 +1046,32 @@ void unbind_from_irqhandler(unsigned int irq, void *dev_id)
 }
 EXPORT_SYMBOL_GPL(unbind_from_irqhandler);
 
+int evtchn_get(unsigned int evtchn)
+{
+	int irq = evtchn_to_irq[evtchn];
+	struct irq_info *info;
+
+	if (irq == -1)
+		return -ENOENT;
+
+	info = irq_get_handler_data(irq);
+
+	if (!info)
+		return -ENOENT;
+
+	atomic_inc(&info->refcount);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(evtchn_get);
+
+void evtchn_put(unsigned int evtchn)
+{
+	int irq = evtchn_to_irq[evtchn];
+	unbind_from_irq(irq);
+}
+EXPORT_SYMBOL_GPL(evtchn_put);
+
 void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector)
 {
 	int irq = per_cpu(ipi_to_irq, cpu)[vector];
diff --git a/include/xen/events.h b/include/xen/events.h
index d287997..a459cca 100644
--- a/include/xen/events.h
+++ b/include/xen/events.h
@@ -37,6 +37,12 @@ int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain,
  */
 void unbind_from_irqhandler(unsigned int irq, void *dev_id);
 
+/*
+ * Allow extra references to event channels exposed to userspace by evtchn
+ */
+int evtchn_get(unsigned int evtchn);
+void evtchn_put(unsigned int evtchn);
+
 void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector);
 int resend_irq_on_evtchn(unsigned int irq);
 void rebind_evtchn_irq(int evtchn, int irq);
-- 
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 Oct 18 14:07:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 14:07:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGGt5-0005kt-0k; Tue, 18 Oct 2011 14:07:51 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGGpe-00059e-Bm
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 14:04:22 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318971835!47226914!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20286 invoked from network); 18 Oct 2011 21:03:55 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-12.tower-27.messagelabs.com with SMTP;
	18 Oct 2011 21:03:55 -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
	p9IL4A8f020993; Tue, 18 Oct 2011 21:04:10 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 p9IL49pv001470; 
	Tue, 18 Oct 2011 17:04:10 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Tue, 18 Oct 2011 17:04:11 -0400
Message-Id: <1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Ian.Jackson@eu.citrix.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	keir@xen.org, Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 2/2] xen/gnt{dev,
	alloc}: reserve event channels for notify
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 unmap notify ioctl, the event channel used for
notification needs to be reserved to avoid it being deallocated prior to
sending the notification.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/gntalloc.c |   14 +++++++++++++-
 drivers/xen/gntdev.c   |   11 +++++++++++
 2 files changed, 24 insertions(+), 1 deletions(-)

diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index f6832f4..a739fb1 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -178,8 +178,10 @@ static void __del_gref(struct gntalloc_gref *gref)
 		tmp[gref->notify.pgoff] = 0;
 		kunmap(gref->page);
 	}
-	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
+	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
 		notify_remote_via_evtchn(gref->notify.event);
+		evtchn_put(gref->notify.event);
+	}
 
 	gref->notify.flags = 0;
 
@@ -396,6 +398,16 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
 		goto unlock_out;
 	}
 
+	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
+		if (evtchn_get(op.event_channel_port)) {
+			rc = -EINVAL;
+			goto unlock_out;
+		}
+	}
+
+	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
+		evtchn_put(gref->notify.event);
+
 	gref->notify.flags = op.action;
 	gref->notify.pgoff = pgoff;
 	gref->notify.event = op.event_channel_port;
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index f914b26..cfcc890 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -190,6 +190,7 @@ static void gntdev_put_map(struct grant_map *map)
 
 	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
 		notify_remote_via_evtchn(map->notify.event);
+		evtchn_put(map->notify.event);
 	}
 
 	if (map->pages) {
@@ -596,6 +597,16 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
 		goto unlock_out;
 	}
 
+	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
+		if (evtchn_get(op.event_channel_port)) {
+			rc = -EINVAL;
+			goto unlock_out;
+		}
+	}
+
+	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
+		evtchn_put(map->notify.event);
+
 	map->notify.flags = op.action;
 	map->notify.addr = op.index - (map->index << PAGE_SHIFT);
 	map->notify.event = op.event_channel_port;
-- 
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 Oct 18 14:08:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 14:08:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGGu0-00068N-V1; Tue, 18 Oct 2011 14:08:48 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGGpe-00059d-6h
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 14:04:22 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-7.tower-21.messagelabs.com!1318971854!730176!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15726 invoked from network); 18 Oct 2011 21:04:15 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-7.tower-21.messagelabs.com with SMTP;
	18 Oct 2011 21:04:15 -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
	p9IL4A8f020990; Tue, 18 Oct 2011 21:04:10 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 p9IL49pt001470; 
	Tue, 18 Oct 2011 17:04:09 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Tue, 18 Oct 2011 17:04:09 -0400
Message-Id: <1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Ian.Jackson@eu.citrix.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	keir@xen.org
Subject: [Xen-devel] [PATCH v2 0/2] 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

> 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.
 
Changes since v1:
	Rename evtchn_get/put to match kernel naming conventions
	Use atomic_t for refcount

[PATCH 1/2] xen/event: Add reference counting to event channel
[PATCH 2/2] 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 Tue Oct 18 14:12:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 14:12:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGGxt-0007E4-Bj; Tue, 18 Oct 2011 14:12:49 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGGxL-00071n-2i
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 14:12:15 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-8.tower-27.messagelabs.com!1318972311!48808878!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13977 invoked from network); 18 Oct 2011 21:11:51 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-8.tower-27.messagelabs.com with SMTP;
	18 Oct 2011 21:11:51 -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
	p9ILCB8f022279
	for <xen-devel@lists.xensource.com>; Tue, 18 Oct 2011 21:12:11 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 p9IKQL3q032054; 
	Tue, 18 Oct 2011 16:26:23 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: xen-devel@lists.xensource.com
Date: Tue, 18 Oct 2011 16:26:20 -0400
Message-Id: <1318969583-23902-3-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 2/5] xen/netback: Enable netback 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

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/net/xen-netback/netback.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index f35e07c..38bfd34 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -1678,7 +1678,7 @@ static int __init netback_init(void)
 	int rc = 0;
 	int group;
 
-	if (!xen_pv_domain())
+	if (!xen_domain())
 		return -ENODEV;
 
 	xen_netbk_group_nr = num_online_cpus();
-- 
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 Oct 18 14:13:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 14:13:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGGyf-0007bR-7z; Tue, 18 Oct 2011 14:13:37 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGGxL-00071o-Ur
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 14:12:16 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-10.tower-174.messagelabs.com!1318972332!35804520!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4917 invoked from network); 18 Oct 2011 21:12:12 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-10.tower-174.messagelabs.com with SMTP;
	18 Oct 2011 21:12:12 -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
	p9ILCB8h022279
	for <xen-devel@lists.xensource.com>; Tue, 18 Oct 2011 21:12:11 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 p9IKQL3t032054; 
	Tue, 18 Oct 2011 16:26:24 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: xen-devel@lists.xensource.com
Date: Tue, 18 Oct 2011 16:26:23 -0400
Message-Id: <1318969583-23902-6-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 5/5] xen/blkback: Enable blkback 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

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/block/xen-blkback/blkback.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index d8232e7..7456749 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -762,7 +762,7 @@ static int __init xen_blkif_init(void)
 	int i, mmap_pages;
 	int rc = 0;
 
-	if (!xen_pv_domain())
+	if (!xen_domain())
 		return -ENODEV;
 
 	blkbk = kzalloc(sizeof(struct xen_blkbk), GFP_KERNEL);
-- 
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 Oct 18 14:14:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 14:14:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGGzN-0007yh-Jb; Tue, 18 Oct 2011 14:14:21 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGGxM-00071p-5R
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 14:12:16 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-14.tower-21.messagelabs.com!1318972332!694869!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9888 invoked from network); 18 Oct 2011 21:12:13 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-14.tower-21.messagelabs.com with SMTP;
	18 Oct 2011 21:12:13 -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
	p9ILCB8j022279
	for <xen-devel@lists.xensource.com>; Tue, 18 Oct 2011 21:12:12 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 p9IKQL3s032054; 
	Tue, 18 Oct 2011 16:26:24 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: xen-devel@lists.xensource.com
Date: Tue, 18 Oct 2011 16:26:22 -0400
Message-Id: <1318969583-23902-5-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 4/5] xen/blkback: don't add m2p overrides when
	using autotranslated 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

This is the same logic as used in grant-table.c, which blkback bypasses.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/block/xen-blkback/blkback.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index a0d3cbd..d8232e7 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -336,6 +336,10 @@ static void xen_blkbk_unmap(struct pending_req *req)
 	ret = HYPERVISOR_grant_table_op(
 		GNTTABOP_unmap_grant_ref, unmap, invcount);
 	BUG_ON(ret);
+
+	if (xen_feature(XENFEAT_auto_translated_physmap))
+		return;
+
 	/*
 	 * Note, we use invcount, so nr->pages, so we can't index
 	 * using vaddr(req, i).
@@ -396,6 +400,12 @@ static int xen_blkbk_map(struct blkif_request *req,
 		if (ret)
 			continue;
 
+		seg[i].buf  = map[i].dev_bus_addr |
+			(req->u.rw.seg[i].first_sect << 9);
+
+		if (xen_feature(XENFEAT_auto_translated_physmap))
+			continue;
+
 		ret = m2p_add_override(PFN_DOWN(map[i].dev_bus_addr),
 			blkbk->pending_page(pending_req, i), false);
 		if (ret) {
@@ -404,9 +414,6 @@ static int xen_blkbk_map(struct blkif_request *req,
 			/* We could switch over to GNTTABOP_copy */
 			continue;
 		}
-
-		seg[i].buf  = map[i].dev_bus_addr |
-			(req->u.rw.seg[i].first_sect << 9);
 	}
 	return ret;
 }
-- 
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 Oct 18 14:15:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 14:15:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGH07-0008MF-CG; Tue, 18 Oct 2011 14:15:07 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGGxM-00071q-JZ
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 14:12:16 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-16.tower-216.messagelabs.com!1318972333!134185!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15100 invoked from network); 18 Oct 2011 21:12:13 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-16.tower-216.messagelabs.com with SMTP;
	18 Oct 2011 21:12:13 -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
	p9ILCB8l022279
	for <xen-devel@lists.xensource.com>; Tue, 18 Oct 2011 21:12:12 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 p9IKQL3p032054; 
	Tue, 18 Oct 2011 16:26:23 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: xen-devel@lists.xensource.com
Date: Tue, 18 Oct 2011 16:26:19 -0400
Message-Id: <1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for
	comms
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 proper grant mappings, HVM guests require pages allocated using
alloc_xenballooned_pages instead of alloc_vm_area.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/net/xen-netback/common.h  |    4 ++--
 drivers/net/xen-netback/netback.c |   34 ++++++++++++++++++++--------------
 2 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
index 161f207..d5ee9d1 100644
--- a/drivers/net/xen-netback/common.h
+++ b/drivers/net/xen-netback/common.h
@@ -70,8 +70,8 @@ struct xenvif {
 	/* The shared rings and indexes. */
 	struct xen_netif_tx_back_ring tx;
 	struct xen_netif_rx_back_ring rx;
-	struct vm_struct *tx_comms_area;
-	struct vm_struct *rx_comms_area;
+	struct page *tx_comms_page;
+	struct page *rx_comms_page;
 
 	/* Frontend feature information. */
 	u8 can_sg:1;
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index fd00f25..f35e07c 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -42,6 +42,7 @@
 
 #include <xen/events.h>
 #include <xen/interface/memory.h>
+#include <xen/balloon.h>
 
 #include <asm/xen/hypercall.h>
 #include <asm/xen/page.h>
@@ -1578,9 +1579,11 @@ static int xen_netbk_kthread(void *data)
 void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
 {
 	struct gnttab_unmap_grant_ref op;
+	void *addr;
 
 	if (vif->tx.sring) {
-		gnttab_set_unmap_op(&op, (unsigned long)vif->tx_comms_area->addr,
+		addr = pfn_to_kaddr(page_to_pfn(vif->tx_comms_page));
+		gnttab_set_unmap_op(&op, (unsigned long)addr,
 				    GNTMAP_host_map, vif->tx_shmem_handle);
 
 		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
@@ -1588,16 +1591,17 @@ void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
 	}
 
 	if (vif->rx.sring) {
-		gnttab_set_unmap_op(&op, (unsigned long)vif->rx_comms_area->addr,
+		addr = pfn_to_kaddr(page_to_pfn(vif->rx_comms_page));
+		gnttab_set_unmap_op(&op, (unsigned long)addr,
 				    GNTMAP_host_map, vif->rx_shmem_handle);
 
 		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
 			BUG();
 	}
-	if (vif->rx_comms_area)
-		free_vm_area(vif->rx_comms_area);
-	if (vif->tx_comms_area)
-		free_vm_area(vif->tx_comms_area);
+	if (vif->rx_comms_page)
+		free_xenballooned_pages(1, &vif->rx_comms_page);
+	if (vif->tx_comms_page)
+		free_xenballooned_pages(1, &vif->tx_comms_page);
 }
 
 int xen_netbk_map_frontend_rings(struct xenvif *vif,
@@ -1610,15 +1614,19 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
 
 	int err = -ENOMEM;
 
-	vif->tx_comms_area = alloc_vm_area(PAGE_SIZE);
-	if (vif->tx_comms_area == NULL)
+	if (alloc_xenballooned_pages(1, &vif->tx_comms_page))
 		goto err;
 
-	vif->rx_comms_area = alloc_vm_area(PAGE_SIZE);
-	if (vif->rx_comms_area == NULL)
+	txs = (struct xen_netif_tx_sring *)pfn_to_kaddr(page_to_pfn(
+			vif->tx_comms_page));
+
+	if (alloc_xenballooned_pages(1, &vif->rx_comms_page))
 		goto err;
 
-	gnttab_set_map_op(&op, (unsigned long)vif->tx_comms_area->addr,
+	rxs = (struct xen_netif_rx_sring *)pfn_to_kaddr(page_to_pfn(
+			vif->rx_comms_page));
+
+	gnttab_set_map_op(&op, (unsigned long)txs,
 			  GNTMAP_host_map, tx_ring_ref, vif->domid);
 
 	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
@@ -1635,10 +1643,9 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
 	vif->tx_shmem_ref    = tx_ring_ref;
 	vif->tx_shmem_handle = op.handle;
 
-	txs = (struct xen_netif_tx_sring *)vif->tx_comms_area->addr;
 	BACK_RING_INIT(&vif->tx, txs, PAGE_SIZE);
 
-	gnttab_set_map_op(&op, (unsigned long)vif->rx_comms_area->addr,
+	gnttab_set_map_op(&op, (unsigned long)rxs,
 			  GNTMAP_host_map, rx_ring_ref, vif->domid);
 
 	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
@@ -1656,7 +1663,6 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
 	vif->rx_shmem_handle  = op.handle;
 	vif->rx_req_cons_peek = 0;
 
-	rxs = (struct xen_netif_rx_sring *)vif->rx_comms_area->addr;
 	BACK_RING_INIT(&vif->rx, rxs, PAGE_SIZE);
 
 	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 Oct 18 14:15:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 14: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 1RGH0q-0000Hf-FP; Tue, 18 Oct 2011 14:15:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGGxM-00071s-QY
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 14:12:17 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318972219!40898161!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3616 invoked from network); 18 Oct 2011 21:10:19 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-14.tower-27.messagelabs.com with SMTP;
	18 Oct 2011 21:10:19 -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
	p9ILCB8n022279
	for <xen-devel@lists.xensource.com>; Tue, 18 Oct 2011 21:12:12 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 p9IKQL3r032054; 
	Tue, 18 Oct 2011 16:26:23 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: xen-devel@lists.xensource.com
Date: Tue, 18 Oct 2011 16:26:21 -0400
Message-Id: <1318969583-23902-4-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 3/5] xen/blkback: Use xenballooned pages for
	mapped areas
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 proper grant mappings, HVM guests require pages allocated using
alloc_xenballooned_pages instead of alloc_page or alloc_vm_area.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/block/xen-blkback/blkback.c |   20 +++++++++-----------
 drivers/block/xen-blkback/common.h  |    2 +-
 drivers/block/xen-blkback/xenbus.c  |   22 ++++++++++++----------
 3 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index 2330a9a..a0d3cbd 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -42,6 +42,7 @@
 
 #include <xen/events.h>
 #include <xen/page.h>
+#include <xen/balloon.h>
 #include <asm/xen/hypervisor.h>
 #include <asm/xen/hypercall.h>
 #include "common.h"
@@ -778,14 +779,14 @@ static int __init xen_blkif_init(void)
 		goto out_of_memory;
 	}
 
-	for (i = 0; i < mmap_pages; i++) {
-		blkbk->pending_grant_handles[i] = BLKBACK_INVALID_HANDLE;
-		blkbk->pending_pages[i] = alloc_page(GFP_KERNEL);
-		if (blkbk->pending_pages[i] == NULL) {
-			rc = -ENOMEM;
-			goto out_of_memory;
-		}
+	if (alloc_xenballooned_pages(mmap_pages, blkbk->pending_pages)) {
+		rc = -ENOMEM;
+		goto out_of_memory;
 	}
+
+	for (i = 0; i < mmap_pages; i++)
+		blkbk->pending_grant_handles[i] = BLKBACK_INVALID_HANDLE;
+
 	rc = xen_blkif_interface_init();
 	if (rc)
 		goto failed_init;
@@ -812,10 +813,7 @@ static int __init xen_blkif_init(void)
 	kfree(blkbk->pending_reqs);
 	kfree(blkbk->pending_grant_handles);
 	if (blkbk->pending_pages) {
-		for (i = 0; i < mmap_pages; i++) {
-			if (blkbk->pending_pages[i])
-				__free_page(blkbk->pending_pages[i]);
-		}
+		free_xenballooned_pages(mmap_pages, blkbk->pending_pages);
 		kfree(blkbk->pending_pages);
 	}
 	kfree(blkbk);
diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
index 00c57c9..944857e 100644
--- a/drivers/block/xen-blkback/common.h
+++ b/drivers/block/xen-blkback/common.h
@@ -139,7 +139,7 @@ struct xen_blkif {
 	/* Comms information. */
 	enum blkif_protocol	blk_protocol;
 	union blkif_back_rings	blk_rings;
-	struct vm_struct	*blk_ring_area;
+	struct page	*blk_ring_page;
 	/* The VBD attached to this interface. */
 	struct xen_vbd		vbd;
 	/* Back pointer to the backend_info. */
diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index 5fd2010..49acc17 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -17,6 +17,7 @@
 #include <stdarg.h>
 #include <linux/module.h>
 #include <linux/kthread.h>
+#include <xen/balloon.h>
 #include <xen/events.h>
 #include <xen/grant_table.h>
 #include "common.h"
@@ -123,8 +124,9 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid)
 static int map_frontend_page(struct xen_blkif *blkif, unsigned long shared_page)
 {
 	struct gnttab_map_grant_ref op;
+	void *addr = pfn_to_kaddr(page_to_pfn(blkif->blk_ring_page));
 
-	gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
+	gnttab_set_map_op(&op, (unsigned long)addr,
 			  GNTMAP_host_map, shared_page, blkif->domid);
 
 	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
@@ -144,8 +146,9 @@ static int map_frontend_page(struct xen_blkif *blkif, unsigned long shared_page)
 static void unmap_frontend_page(struct xen_blkif *blkif)
 {
 	struct gnttab_unmap_grant_ref op;
+	void *addr = pfn_to_kaddr(page_to_pfn(blkif->blk_ring_page));
 
-	gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
+	gnttab_set_unmap_op(&op, (unsigned long)addr,
 			    GNTMAP_host_map, blkif->shmem_handle);
 
 	if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
@@ -161,13 +164,12 @@ static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
 	if (blkif->irq)
 		return 0;
 
-	blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE);
-	if (!blkif->blk_ring_area)
+	if (alloc_xenballooned_pages(1, &blkif->blk_ring_page))
 		return -ENOMEM;
 
 	err = map_frontend_page(blkif, shared_page);
 	if (err) {
-		free_vm_area(blkif->blk_ring_area);
+		free_xenballooned_pages(1, &blkif->blk_ring_page);
 		return err;
 	}
 
@@ -175,21 +177,21 @@ static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
 	case BLKIF_PROTOCOL_NATIVE:
 	{
 		struct blkif_sring *sring;
-		sring = (struct blkif_sring *)blkif->blk_ring_area->addr;
+		sring = pfn_to_kaddr(page_to_pfn(blkif->blk_ring_page));
 		BACK_RING_INIT(&blkif->blk_rings.native, sring, PAGE_SIZE);
 		break;
 	}
 	case BLKIF_PROTOCOL_X86_32:
 	{
 		struct blkif_x86_32_sring *sring_x86_32;
-		sring_x86_32 = (struct blkif_x86_32_sring *)blkif->blk_ring_area->addr;
+		sring_x86_32 = pfn_to_kaddr(page_to_pfn(blkif->blk_ring_page));
 		BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, PAGE_SIZE);
 		break;
 	}
 	case BLKIF_PROTOCOL_X86_64:
 	{
 		struct blkif_x86_64_sring *sring_x86_64;
-		sring_x86_64 = (struct blkif_x86_64_sring *)blkif->blk_ring_area->addr;
+		sring_x86_64 = pfn_to_kaddr(page_to_pfn(blkif->blk_ring_page));
 		BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, PAGE_SIZE);
 		break;
 	}
@@ -202,7 +204,7 @@ static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
 						    "blkif-backend", blkif);
 	if (err < 0) {
 		unmap_frontend_page(blkif);
-		free_vm_area(blkif->blk_ring_area);
+		free_xenballooned_pages(1, &blkif->blk_ring_page);
 		blkif->blk_rings.common.sring = NULL;
 		return err;
 	}
@@ -229,7 +231,7 @@ static void xen_blkif_disconnect(struct xen_blkif *blkif)
 
 	if (blkif->blk_rings.common.sring) {
 		unmap_frontend_page(blkif);
-		free_vm_area(blkif->blk_ring_area);
+		free_xenballooned_pages(1, &blkif->blk_ring_page);
 		blkif->blk_rings.common.sring = 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 Tue Oct 18 14:16:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 14:16:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGH1Z-0000fX-Ck; Tue, 18 Oct 2011 14:16:37 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGGxN-00071t-Hj
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 14:12:17 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-7.tower-174.messagelabs.com!1318972333!35793509!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21023 invoked from network); 18 Oct 2011 21:12:14 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-7.tower-174.messagelabs.com with SMTP;
	18 Oct 2011 21:12:14 -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
	p9ILCB8p022279
	for <xen-devel@lists.xensource.com>; Tue, 18 Oct 2011 21:12:13 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 p9IKQL3o032054
	for <xen-devel@lists.xensource.com>; Tue, 18 Oct 2011 16:26:23 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: xen-devel@lists.xensource.com
Date: Tue, 18 Oct 2011 16:26:18 -0400
Message-Id: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
Subject: [Xen-devel] [PATCH 0/5] xen/{net,
	blk}back support for running in 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

In HVM domains (or to be exact, when XENFEAT_auto_translated_physmap is
enabled) it is not valid to request the hypervisor set up a grant
mapping using PFNs referring to valid pages.  The balloon driver
provides alloc_xenballooned_pages to obtain pages without valid PFNs
suitable for grant mappings; use this function when allocating pages for
grant mappings.

This has been tested with a PV domain using block and network devices
exported by an HVM domain.

[PATCH 1/5] xen/netback: Use xenballooned pages for comms
[PATCH 2/5] xen/netback: Enable netback on HVM guests
[PATCH 3/5] xen/blkback: Use xenballooned pages for mapped areas
[PATCH 4/5] xen/blkback: don't add m2p overrides when using
[PATCH 5/5] xen/blkback: Enable blkback on HVM guests

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 14:39:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 14:39:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGHNI-0002Q9-E2; Tue, 18 Oct 2011 14:39:04 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGHMa-0002D8-3i
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 14:38:20 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1318973895!29456114!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7396 invoked from network); 18 Oct 2011 21:38:16 -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; 18 Oct 2011 21:38:16 -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
	p9ILcCAu032436
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 18 Oct 2011 21:38:14 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
	p9ILcBgS025182
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 18 Oct 2011 21:38:12 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
	p9ILc6pT008910; Tue, 18 Oct 2011 16:38:06 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 18 Oct 2011 14:38:06 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 01D3882532; Tue, 18 Oct 2011 09:10:05 -0400 (EDT)
Date: Tue, 18 Oct 2011 09:10:05 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Carter Cheng <cartercheng@gmail.com>
Subject: Re: [Xen-devel] oprofile and xen
Message-ID: <20111018131005.GA9818@phenom.dumpdata.com>
References: <CALS6=qXEkUaSSeCAnqZCd1nYEnBqDfOPTj5z0ULwLkNfWp5oEA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CALS6=qXEkUaSSeCAnqZCd1nYEnBqDfOPTj5z0ULwLkNfWp5oEA@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.0A090209.4E9DF1C6.005E:SCFMA922111,ss=1,re=-4.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, Oct 18, 2011 at 05:20:11PM +0800, Carter Cheng wrote:
> Hello,
> 
> I was wondering if xen currently works well with oprofile. I saw some patch
> out there put together by an HP engineer but it does not work with the
> current version of the code. Does anyone know how much change there has been
> in the code and whether it would take much effort to modify the patch?

http://xen.1045712.n5.nabble.com/OProfile-patch-for-Linux-3-0-td4801192.html

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 14:40:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 14:40:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGHOP-0002py-L2; Tue, 18 Oct 2011 14:40:13 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGHMf-0002Dc-Rv; Tue, 18 Oct 2011 14:38:26 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1318973871!53380207!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15231 invoked from network); 18 Oct 2011 21:37:52 -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; 18 Oct 2011 21:37:52 -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
	p9ILcCf6022832
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 18 Oct 2011 21:38:16 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
	p9ILcBBo005888
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 18 Oct 2011 21:38:12 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
	p9ILc67B008885; Tue, 18 Oct 2011 16:38:06 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 18 Oct 2011 14:38:06 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 80DEA82543; Tue, 18 Oct 2011 09:26:18 -0400 (EDT)
Date: Tue, 18 Oct 2011 09:26:18 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Lars Kurth <lars.kurth@xen.org>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
Message-ID: <20111018132618.GA19611@phenom.dumpdata.com>
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9C4BAB.9020605@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.0A090202.4E9DF1C9.0074:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Joseph Glanville <joseph.glanville@orionvm.com.au>,
	"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, Oct 17, 2011 at 04:37:15PM +0100, Lars Kurth wrote:
> Cool.
> 
> I am wondering what people think about archiving vs deleting wiki
> pages. Obviously some pages can be deleted (stuff about events, job
> listings, old TODO lists, etc.).
> 
> Others may still be valuable to legacy users. See
> http://wiki.xen.org/xenwiki/Archive_Page : the problem right now is
> that archived pages aren't identifiable and thus confusing. One way
> of fixing this would be to rename the page from FooBar to
> Archived/FooBar

Oh, I like that. That is a good idea.
> 
> Views are welcome
> 
> Lars
> 
> On 17/10/2011 16:17, Ian Campbell wrote:
> >>Also, who will create the IRC channel
> >They just pop onto being if you join them.
> >
> >
> 
> 
> _______________________________________________
> 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 Oct 18 15:21:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 15:21:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGI2D-0004Wv-0j; Tue, 18 Oct 2011 15:21:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGI0u-0004Hr-Mw
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 15:20:01 -0700
X-Env-Sender: samuel.thibault@ens-lyon.org
X-Msg-Ref: server-2.tower-174.messagelabs.com!1318976397!35803961!1
X-Originating-IP: [80.67.169.19]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18407 invoked from network); 18 Oct 2011 22:19:57 -0000
Received: from solo.fdn.fr (HELO solo.fdn.fr) (80.67.169.19)
	by server-2.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 18 Oct 2011 22:19:57 -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 B8D1A44E7C;
	Wed, 19 Oct 2011 00:19:56 +0200 (CEST)
Received: from samy by type.ipv6 with local (Exim 4.76)
	(envelope-from <samuel.thibault@ens-lyon.org>)
	id 1RGI0m-00049v-V3; Wed, 19 Oct 2011 00:19:52 +0200
Date: Wed, 19 Oct 2011 00:19:52 +0200
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
To: Kasper Brink <K.Brink@cs.ru.nl>
Subject: Re: [Xen-devel] pv-grub Solaris support
Message-ID: <20111018221952.GS4175@type.famille.thibault.fr>
Mail-Followup-To: Samuel Thibault <samuel.thibault@ens-lyon.org>,
	Kasper Brink <K.Brink@cs.ru.nl>, xen-devel@lists.xensource.com
References: <20111012204011.GA7518@lilo2.science.ru.nl>
	<20111013003832.GR4326@type.famille.thibault.fr>
	<20111016174527.GA4445@lilo2.science.ru.nl>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20111016174527.GA4445@lilo2.science.ru.nl>
User-Agent: Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30)
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

Kasper Brink, le Sun 16 Oct 2011 19:45:27 +0200, a écrit :
> On Thu, Oct 13, 2011 at 02:38:32AM +0200, Samuel Thibault wrote:
> > > The attached patch has been tested with various
> > > Solaris versions (Solaris 11 Express, OpenIndiana 151a, OpenSolaris 134,
> > > Nexenta Core 3.0.1; all 64-bit). I appreciate your feedback.
> > 
> > Could you also check that Linux configurations also still work?
> 
> I can confirm that pv-grub with the Solaris patch still works correctly for
> Linux domUs. This was tested with the following distributions: Debian 6.0,
> Ubuntu 11.10 Server, Fedora 15, and CentOS 6 (all 64-bit).

I'd give an

Acked-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

on it then.

Samuel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 15:37:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 15: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 1RGIHb-0005LD-Vp; Tue, 18 Oct 2011 15:37:16 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGIGx-000561-Kk
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 15:36:36 -0700
X-Env-Sender: apxeng@gmail.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1318977391!35840844!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23763 invoked from network); 18 Oct 2011 22:36:32 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	18 Oct 2011 22:36:32 -0000
Received: by qyg36 with SMTP id 36so1195209qyg.9
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 15:36:31 -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=Mn3zVYx7kl+g8CYqbOTqaJrx9dLujhY7603cTSrwVxk=;
	b=RmL5KCmhMX2YdC6hQ2WWkdRlF3d5A/V71U2b8J/dHwUg75jqWv7m3b4prKqzx+uDl5
	VI69S7m3VKa/uSUrClqTDjq32IV3M6KzkDX1T5OvwbdtRg5b8MrTGvV687i7TjoMZQ1O
	fT8Z3ZahMw8XveF52O6xCCbVBdoKTfTT9RVJM=
MIME-Version: 1.0
Received: by 10.229.63.199 with SMTP id c7mr959840qci.140.1318977391152; Tue,
	18 Oct 2011 15:36:31 -0700 (PDT)
Received: by 10.229.20.12 with HTTP; Tue, 18 Oct 2011 15:36:31 -0700 (PDT)
Date: Tue, 18 Oct 2011 15:36:31 -0700
Message-ID: <CAGU+aut64MmMmf901p9Gsya4O=hep8merZUDfSUuJCJXMVFtrg@mail.gmail.com>
From: AP <apxeng@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] make install not creating lib entries in /usr/lib under
	Ubunu 11.10
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 building xen-unstable (23860:a422e2a4451e) on Ubuntu 11.10. I
noticed that the "make install" does not create lib entries in
/usr/lib/. I see them only in /usr/lib64/. This is causing program
like xenpaging to not find the xenctrl library (error while loading
shared libraries: libxenctrl.so.4.2: cannot open shared object file:
No such file or directory) Is this expected behavior or am I running
in to something funny in the Ubuntu 11.10 environment that is causing
the "make install" script not to create these entries? What is the fix
/ workaround for this?

PS: I did not see this problem on 10.10 or 11.04.

Thanks,
AP

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 15:46:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 15:46:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGIQz-0005ye-8f; Tue, 18 Oct 2011 15:46:57 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGIQK-0005m2-Fo
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 15:46:16 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1318977857!40903681!1
X-Originating-IP: [134.134.136.20]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7047 invoked from network); 18 Oct 2011 22:44:18 -0000
Received: from mga02.intel.com (HELO mga02.intel.com) (134.134.136.20)
	by server-14.tower-27.messagelabs.com with SMTP;
	18 Oct 2011 22:44:18 -0000
Received: from orsmga001.jf.intel.com ([10.7.209.18])
	by orsmga101.jf.intel.com with ESMTP; 18 Oct 2011 15:46:11 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,352,1309762800"; d="scan'208";a="64326336"
Received: from orsmsx602.amr.corp.intel.com ([10.22.226.211])
	by orsmga001.jf.intel.com with ESMTP; 18 Oct 2011 15:46:11 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx602.amr.corp.intel.com ([10.22.226.211]) with mapi;
	Tue, 18 Oct 2011 15:46:11 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Tue, 18 Oct 2011 15:46:15 -0700
Thread-Topic: Resend: RE: enable_ats_device() call site
Thread-Index: AcyIFPOj/fPLa3JwQgeSogMTWxBg7gFz4z+g
Message-ID: <987664A83D2D224EAE907B061CE93D5301F19DB855@orsmsx505.amr.corp.intel.com>
References: <4E4E48360200007800051F65@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B5E@orsmsx505.amr.corp.intel.com>
	<4E8EC8A80200007800059E3B@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE70A446@orsmsx505.amr.corp.intel.com>
	<4E9458A5020000780005AB99@nat28.tlf.novell.com>
In-Reply-To: <4E9458A5020000780005AB99@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: "Tian, Kevin" <kevin.tian@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Shan, Haitao" <haitao.shan@intel.com>, "Dugger,
	Donald D" <donald.d.dugger@intel.com>
Subject: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

Sorry for the late reply, I was trying to close something on another projec=
t.  I have the following questions on the patches after reviewing the pache=
s:

1) In acpi_find_matched_atsr_unit(), you added following code.  The origina=
l code only tries to match the bus number.  What is the purpose of this new=
 additional code? Does it fix a problem on one of your systems?

+        for ( i =3D 0; i < atsr->scope.devices_cnt; ++i )
+            if ( atsr->scope.devices[i] =3D=3D bdf )
+                return atsr;

2)  In pci_add_device() function, the original code calls pci_enable_acs() =
only if pdev->domain is not set.  The new code calls pci_enable_acs() uncon=
ditionally, potentially more than once?  What is the reason for the change?

3) In the same pci_add_device() function, the new code now also calls iommu=
_enable_device() which currently calls enable_ats_device().  This means the=
 new code will enable ATS as it is being discovered by the platform.  Howev=
er, I did not see any code that removing enable_ats_device() call in domain=
_context_mapping().  Is this the intention?  If so, what is the reason?  I =
see the reason the original code is still needed but I don't see why we nee=
d to call enable_ats_device() during platform device discovery since the en=
abling bit will get cleared by FLR.

Allen


-----Original Message-----
From: Jan Beulich [mailto:JBeulich@suse.com]=20
Sent: Tuesday, October 11, 2011 5:54 AM
To: Kay, Allen M
Cc: xen-devel@lists.xensource.com
Subject: RE: Resend: RE: enable_ats_device() call site

>>> On 08.10.11 at 04:09, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
>> For which I'd like to understand why this is being done in the places=20
>> it is
> now
>>(not the least why this is done in VT-d specific code in the first place)=
.
>=20
> The reason it is call by reassign_device_ownership() is because FLR=20
> clears ATS enabling bit on the device - I forgot about it when I wrote=20
> the last email so we still need to re-enable ATS on the device for each d=
evice assignment.
> To summarize:
>=20
> 1) Reason for difference in ATS and ACS handling
>     a. ATS capability is in the PCIe endpoint - enabling bit is=20
> cleared by device FLR on the passthrough device.
>     b. ACS capability is in the PCIe switch - not affected by FLR on=20
> the passthrough device.
>=20
> 2) ATS enabling requirement
>     a. VT-d engine serving the device has to be ATS capable.
>     b. device has to be ATS capable

Okay, so how about the below then (with an attached prerequisite cleanup pa=
tch)?

Jan

--- 2011-09-20.orig/xen/drivers/passthrough/iommu.c
+++ 2011-09-20/xen/drivers/passthrough/iommu.c
@@ -150,6 +150,23 @@ int iommu_add_device(struct pci_dev *pde
     return hd->platform_ops->add_device(pdev);
 }
=20
+int iommu_enable_device(struct pci_dev *pdev) {
+    struct hvm_iommu *hd;
+
+    if ( !pdev->domain )
+        return -EINVAL;
+
+    ASSERT(spin_is_locked(&pcidevs_lock));
+
+    hd =3D domain_hvm_iommu(pdev->domain);
+    if ( !iommu_enabled || !hd->platform_ops ||
+         !hd->platform_ops->enable_device )
+        return 0;
+
+    return hd->platform_ops->enable_device(pdev);
+}
+
 int iommu_remove_device(struct pci_dev *pdev)  {
     struct hvm_iommu *hd;
--- 2011-09-20.orig/xen/drivers/passthrough/pci.c
+++ 2011-09-20/xen/drivers/passthrough/pci.c
@@ -258,7 +258,7 @@ struct pci_dev *pci_get_pdev_by_domain(
  * pci_enable_acs - enable ACS if hardware support it
  * @dev: the PCI device
  */
-void pci_enable_acs(struct pci_dev *pdev)
+static void pci_enable_acs(struct pci_dev *pdev)
 {
     int pos;
     u16 cap, ctrl, seg =3D pdev->seg;
@@ -409,8 +409,11 @@ int pci_add_device(u16 seg, u8 bus, u8 d
         }
=20
         list_add(&pdev->domain_list, &dom0->arch.pdev_list);
-        pci_enable_acs(pdev);
     }
+    else
+        iommu_enable_device(pdev);
+
+    pci_enable_acs(pdev);
=20
 out:
     spin_unlock(&pcidevs_lock);
--- 2011-09-20.orig/xen/drivers/passthrough/vtd/iommu.c
+++ 2011-09-20/xen/drivers/passthrough/vtd/iommu.c
@@ -1901,6 +1901,19 @@ static int intel_iommu_add_device(struct
     return ret;
 }
=20
+static int intel_iommu_enable_device(struct pci_dev *pdev) {
+    struct acpi_drhd_unit *drhd =3D acpi_find_matched_drhd_unit(pdev);
+    int ret =3D drhd ? ats_device(pdev, drhd) : -ENODEV;
+
+    if ( ret <=3D 0 )
+        return ret;
+
+    ret =3D enable_ats_device(pdev->seg, pdev->bus, pdev->devfn);
+
+    return ret >=3D 0 ? 0 : ret;
+}
+
 static int intel_iommu_remove_device(struct pci_dev *pdev)  {
     struct acpi_rmrr_unit *rmrr;
@@ -1931,7 +1944,6 @@ static int intel_iommu_remove_device(str  static void=
 __init setup_dom0_device(struct pci_dev *pdev)  {
     domain_context_mapping(pdev->domain, pdev->seg, pdev->bus, pdev->devfn=
);
-    pci_enable_acs(pdev);
     pci_vtd_quirk(pdev);
 }
=20
@@ -2302,6 +2314,7 @@ const struct iommu_ops intel_iommu_ops =3D
     .init =3D intel_iommu_domain_init,
     .dom0_init =3D intel_iommu_dom0_init,
     .add_device =3D intel_iommu_add_device,
+    .enable_device =3D intel_iommu_enable_device,
     .remove_device =3D intel_iommu_remove_device,
     .assign_device  =3D intel_iommu_assign_device,
     .teardown =3D iommu_domain_teardown,
--- 2011-09-20.orig/xen/include/xen/iommu.h
+++ 2011-09-20/xen/include/xen/iommu.h
@@ -70,6 +70,7 @@ int iommu_enable_x2apic_IR(void);  void iommu_disable_x2a=
pic_IR(void);
=20
 int iommu_add_device(struct pci_dev *pdev);
+int iommu_enable_device(struct pci_dev *pdev);
 int iommu_remove_device(struct pci_dev *pdev);  int iommu_domain_init(stru=
ct domain *d);  void iommu_dom0_init(struct domain *d); @@ -120,6 +121,7 @@=
 struct iommu_ops {
     int (*init)(struct domain *d);
     void (*dom0_init)(struct domain *d);
     int (*add_device)(struct pci_dev *pdev);
+    int (*enable_device)(struct pci_dev *pdev);
     int (*remove_device)(struct pci_dev *pdev);
     int (*assign_device)(struct domain *d, u16 seg, u8 bus, u8 devfn);
     void (*teardown)(struct domain *d);
--- 2011-09-20.orig/xen/include/xen/pci.h
+++ 2011-09-20/xen/include/xen/pci.h
@@ -134,6 +134,5 @@ struct pirq;
 int msixtbl_pt_register(struct domain *, struct pirq *, uint64_t gtable); =
 void msixtbl_pt_unregister(struct domain *, struct pirq *);  void msixtbl_=
pt_cleanup(struct domain *d); -void pci_enable_acs(struct pci_dev *pdev);
=20
 #endif /* __XEN_PCI_H__ */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 16:55:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 16: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 1RGJVD-0007jB-8B; Tue, 18 Oct 2011 16:55:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGJU8-0007Vz-Jj
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 16:54:17 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-12.tower-27.messagelabs.com!1318982033!47236500!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28718 invoked from network); 18 Oct 2011 23:53:53 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-12.tower-27.messagelabs.com with SMTP;
	18 Oct 2011 23:53:53 -0000
Received: from [213.136.170.186] (account d.faggioli@sssup.it HELO
	[192.168.0.3]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72502007; Wed, 19 Oct 2011 01:54:12 +0200
Subject: Re: [Xen-devel] Issue with PCI-passthrough and pvops
From: Dario Faggioli <raistlin@linux.it>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Wed, 19 Oct 2011 01:54:07 +0200
In-Reply-To: <20111017164020.GE19684@phenom.dumpdata.com>
References: <1318865791.25056.28.camel@Palantir>
	<20111017164020.GE19684@phenom.dumpdata.com>
Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAAA3NCSVQICAjb4U/gAAAVx0lEQVRYwzWY6a/d953XP9/tt51zfme/+37t692OtzhxtzTuJFPaTDVt0cDQeTIajToSKBJICBASQkI8Q1Q8ACQEhUGgCsF0OrSkaRLaxknqOl7i9dq++3727bd/Vx5k+CNe7+WFvvkvbvoywAZF1BMYOFNFbqWEW1gho42yB9jJq1QihEGVCh7BxrXpeNlxbJZmcmNvkArIhAIMJd+drlmA0aiXuBbN5x3Pxq6NS6X85l5/rxNnGtJYgAYhgVCa8UxqAwgQIABAGGMD1JWtS7/48Vy0W1k5GxXnmh41br1y6fxXv3LCEPXLu3vv3N3t2kXPAi0EIjTjnDGcKawzHceZl3N0mIExrmfnGS1iSij2pxgDxJhlsOFID8LUsVjecXvNPiJg2ZYySiODGUVcAwBCCAAMAIAhNc82C2xvuLG8uX422VvZfHrx9Mz5P7kRR51wby188YD+8metqQWBLa00F1JIlQk5imIhle+XBsHI9/PVUoFCBp7JOZbSjGiS92mx7IE0SICRkC/Yw2GSZECpIsYYwEmWGkDGIAAAAIQAY4QMEA6Nvc7G6aaYzKQlUs/x/O99VywsZcZd33w++l9/NbN6Z905MSqPGYO10QDYGCI1EIQQGMdzkzCo+G4pb5eY7blWKhKadiZ92yYsFWoYpwhRv0A4h/4oK5Zcl9nGAMLUgEYYMAZAmhBkM6KkoYpVIRjU47SRRUuVlXRlUZ08nxDyi50na+2jV1r9tTjK/DwYqgFRLHMuYdhCMou1bg64a0M15yKiCyCcLJlJspl+e6x3QNtuv1TbKIwHxpHIZDEYorGFh32eK3h+yc06XYqA2MyyLCmk0lobAFC04NsTyCGjOAbrp5svrs/N1sqeRegKscrF2aiz1ZfJweZPjLzojB0fdPcqFcv481592Y15KiKOLBDyd
	OPw1b37JZ3Qosdspk2Eh71iZ3MmJafLE/2l4w/pjBiiRMVJKjOtLItypb18LkxCmSilAIAorQCA0nLl0lGSqY5kyCP55bFpOwvW1vo79+7vb+z5yjSF1Wg9RaNNjKxRlObPnd/c+UurPFMZPzO5cPpcIt/c/HApaZp+Jzoa6FKhcu4kogzZFGmEGgczG6v1O+8uLp1eQ0VdOrXuLFqu0mAwwZkUCBOMmJAKDAIgAJq88f1/NucwtbZqaXP9pfNnFxY++ujmI4OZVzoYHfKtxnrY2PFAS46yuJTPNzvNYXvbDJsvTfr/5PSJl3/676cbhzvPV4ccbN9KTCoHHYa5xQoZRPpglw1SEim5tzN58KSc4b1LFzEmFiMEYwCSca01MsYAAoyRUYrGgjXOXfgbg8aE5hPV8vsPPr7XHJaPn4x6MY0GjsUWvnxy+dLSB7+43W6zN77y9Q/e/3ENvMvI/dO4WftX/xzidDvrO7Mnxqt+P0kshcCyRj2pe89zKSKxVjrWWKs4balUO/s26MwgqZU2JsmkUhjAAPpr0ACA3vjKydHuAa56B2u7Hz59qDFOkD149x1n9VkW81LevvCH54b5ztiY/+rLr7zxu1+TwdEr99deD0Ln1tMw4ixVhVpuemZGYT5W8JQCgyAMR1whY1IGqRI8E1ks0m2pnqq0k6ogUpgRroBLDQgjDBgTjAEUUgDUJI16Se7sbcWdfoxdzrRUwj7aV1I7165Mnjhx+oLz2+CTyclL3/2D74ApfOFr3w4Hf7778/dmSclIzoXKTy6n2QBrjRQyBPdGQ6RVlCQ8TXScMGk8iwWErsV8Z/58J9KZ0IgbBJgQiok2BghBCCFjMACQlesvrzjY/tWtOM0EoZwCU0Ym2ag+VZ5fLOf9xZXph61s8dibtdpYnApmFe3JmX6372UByfg+wKNOt+hYSgHBNjiesW3H9SyhqEKJlE2ZHiSjrVS2c8Xm639nhEoACAzGhDCGKSVKGQ
	AwBgECxQXNuz7uD1QvQFJEeeOm0iiFBbDu/uEzwW8O+P826hu/d6v0/PTx5Y8/ee/l66/lFqdqb9xQ//pRJ+KBwfmp8U1tmkgnXqaxbPd6/V4fJ1kJ6JQhderZ1OvE/aYSfeKBAYSQQVgbI5Q2UgMgBMgYAxgBAE1U6uQKuS9e7310qzwQ2pDUghR4JU3UZji07BfFamHtIF00O839zx7ceeXaFxGY/J1Hz1sHPEGHDlnTreLkyeNXrpQLDgjtBHF+GI6i4VEYfnpwpAejvNBnUdG2qkBdw4w2Bhv0eXeZzwMfIYQ+7zKgc7VynCux73176ktXV//ix6Onq67RxIhEGTDSHybQH4Xt6LU3317f2pycmGJUVxudOZ+o6Zn764dB0YHx6dCwp88eIYSIxpLLIIziLJbSOAKEW9QlZ7Posijv5awsSw1yDMIAGMAgZBBCGGNjDEJGAdCJnI9thwHLFr3pt9+e3Wl2W41fbj1NlD51sHvmxeP1YfqMya9fvfaf//E/3T/cfPP6K8vv3Wz/3w/SxiBPaDFUeGZ6V2Sd7UOtACmkpeRSaI0wMogZYzNk05KfG5Z8q5a9bBeaA90P0kRixGyuPqddY4wwQgKAFosVQjEANjF1lFIz4/1x50g0kyR+uVi79jtf/vmHL4LKhZ7WreYWMbH5b/8zu3vHGkUZlxjrSOkzy/Px/n5fYxAxNUCNIdhIojEhmDFM3By2sWdJNlajeKmUnqiwQNuRZJ0I398LDVBkABPABgEA7o/CMEhlplzHKlZL1WJVY4LB5Ci6+p2rvRv1uxm8evba/Qe/UaPuDUEXP/kNTdJewqtV/+zlK9yQnfWtdrsVp+koEWEmpQELUwcTqrGMVZpEiUqVU43PflUzLR2pbFqkenncKniZsRNjcaAcocRmGQBQh1kIISmllJLrbG/3oCujE7PHahYo8eDu46fUqawsLzx4+vEZN/eHQcJHyVBjz5DqsYWOwDm/nmP52TF
	vY79x1O4bKcp5b7JWIQoNklRhYhvKjBkfCrf3xJ7+ijVKo+TAsQuO4wKlDsMGpRRjlYm8U+wBp57jWrYlpFRKGa7G56b/4i//x0Hj4OKU9/03Tj3e3BuvFvP1QhJmf2Zcuz/UhGiNWK3a7US8Ovvaq7/zcXenmfWqrmdKpTRLGCO9KELGhJmIOHcZLY9XGo3BBTrUJxuzCtJ8refnuDY6EwRjbaRnA3OxjQ0AUK2U4EIZrYw2gIYyzVQyNV48e9wzRt6729p5sl+2ci8/+Gy80x5hMFIBsZOyf4TIrC4Uld05bChP+kpZNo4RywAERgyTPCJgO1bBmfALzb3B5msXrg0UqxaG5QJgy0UMrIxYjAhHZ4HtJVW3uAaCUkYNGAxGKYkBd/pNC2AizxYq/LPHn9hWfb4eFxob59cakhpXmIaCnGu9u7td9MdajTsvnbxAmY94YEFojOEGEcYQAYSY4VEx79J8QQ+yiPlBFq/aE1Gt7BmTwwo7jh5wjDlxGDWKMGKMAgBsW45t2TazGWHI0hs7G1oJIgavXjmTCKcXwJeuXsv+zwexyhLmxoRix3rEUAv0++3tDweHdzafvlZfxH6RS8cYAkAPW/0Xe612t2sAwNC0nz67t+rmcgEPW82+yEgqdZImo2Gnfbge9p6AaliuGsUj5lAAoJQxKYUCDYAEhkEYFPzCXA0q9eLme0m7K6auTgUf3ynYrCzprhJHBSdYnLX3jvSoNwrMzfbW7Y9aIaCwQMHlOS83XvWTRGDLihCkoyTujpiiBAOSYTKAOAjdXAFjLGTWae0/W3skwa3WJiYnpse9BQCgwyhCCAhBwOgoDErVCd1tLc2ge4+fBKHDjJk/fsrR76BhHBoIy6VoeSlFEmxKHNpN0rGJqbDbV9KwgWj3IlWQhGGlTXuUacvKMxtJhA3oLGZJL+Nht1M/eeZaq90wGDtu7tj8cYUsIU3J8yzKAAQVimdSICmlUQ93Xxw1W8cnxhYW
	wkKhY/C8X+ufq891Wy3P4Nsg26eWolx9dLC9P+wpZBKbNnv9AiGWlipNXEP1gGNKjJIFg0lmLJOWmS2UylMU91qWXw663X4nUAYjkNRxX9zd0oj4lclykTNCAIDatqORMVpJhNY21raP9lS0+bdeWd7ePXr8wlqaXiK//qDX3P20Nr41tZASRtSwhSRCUHVsZkO3F9qkgFKJDC4QprRSmcgTSjHFBjEwjtR5hEm7xxzmunkZhL1Od2F5th+2DQJDqF2ezo8vAcbUpABAkyTjUhjJRzrRQe9CsXj9st0ZbDVeDK8M7b+Nk+7qnaevfvVAC8G5ATTx2mtLRt7+d/+WpKHrWEnRO2gPxqUtMU4UV0bbzMKISCmBIKAUAGyAzvZWrmjZ1SJS/OHde/MzE2OVeqHgX3n5qnLHO/3UIO55GAAoF0pppbTuBoOEGkqsGqPXotlLvUp1pto8ffGdXuPFbz+lsSL5YovoW+++c2q8rmyLaocinCN6VLaToZFcYoM0xpHiHFAOU8aIBpAAgFEmZNLpmFpJsk5hciYeDmsTi/fuf7bX2auWx0rjc47v7j2+BXCRUoK4QQDQaB0Zg7SRhVSxx0NfzHWPrzxfXlj76EObxxqhv1p7fOLiJd8Ujp890z46HG5tGNAIKdtloRCJUjnMMAKsMEK4RbhCAhuMElkkdozAjIb5YZToZiDM5XNntQ2u5VKtGzsbe/tbpXye1SbBvkgJAMVYEzIajTyEj83YQ7/104Xhb37WvLGwEm3shUnAMhUiM1AZz9KjVmtydrpFCAeFMaYWtQBpn0mtBpkCpZAFiGLm2KAhHaY5REEjhJUDhAcxx05hLBcnaa1UKjALE+aVqpHIJienbBAAgEt+frxURBZRBkOuNF2lC2P4fif7JXa2uD7Y3+VxQlO5GwfMyecK+Xq1WB8b6yaBJEhqhRBGGGML56s+rnhW3XeqBavoEERFkFmAkdIIQR4wjlMRxx5zUgG3769qo
	U7MzLS7w04QGcs2zPbLPgDg3qAXh8PV7fXEoPm5xWIt543nRe585djS1vN7+MXDwfZGe9Dc63XSRBwcNOIoAgQjkQqGhdGAkNEaaUW0ylnUw9g1BIdKdsK8op4hNiUSa8VFvVI5ff6sSFOG2YOnG0kii26+6BeJxbjRSZpg1wMAbDMgFjxZvb+/u/X81ntJZysYos7hcNbLjy1MPtp6gkbdqD+oF6vFSs3NeTNT04NePwQtsNZAldYGIaUUaIkkRxrCME0GSQk7HmCiDQWEAQMCGcYXjh2zjQShohiGcXb1pQvH5ueLOafgOkaK2bEiAFDFZTcc2CpayMPSWO3kUn5zbXtwNNjfffTW3/9Hd29+mISBkWRhYf7333xzZqKUBaNOp9/ziqUgwSBSJGxqy0xrYUAZLkUUpXVs5zHJQEstkAFsMGNOOgiS++s05AiACp7G8Vi1xMPk5LFjbrGUQzA3UYOHQA1mz7e3D1qDAtNTp+cZNd2B+NaXvtjvqGrRs4pETXuHR73NezcDHTsMX7n2ansYzc2drnO7K5+vzEwqrtf3okAbkxgeZyCMTy0bUY1U9v/FmMUoaHPc5LOZY7/urk9Yo3H2eu+ou1ir/urxqtHZialp98wUAGAA9XhrPaH+SJPKhB+lfL2de//uemblk0hcml34g7feOHN+5eyZk6eXpoP2YaXsdzdXv3ugb9SXSi75va9d+4f/4I+/89aNotb9ILYFnrYLHsYUAUMYGQAD1CCCSd0tfPrg/hwH0ttctgN7dDjGu0sOdqmZKlvnj88SpAGAPtnYyESKVFTP8Zw16rUOW116FOPr5fqz7b2fP36hP+7zWAkplxdmEUEF1748O/7wg59MaOv7J065NzcOnrW8nKeo48lwxStSLi3QgCkiaATYGMMMgNG1QmlfxxO9Xtn1Ro2+UnDz5z+LgzTP0Hgtl7MhzmIAwI/XVgNBAqNXTh2v5Mwwg3Z3wEfJ7OxyHHPb9SNuEi
	64Ed1RmAjm58rbHz85qdCfzi2fHfH67sj+6EX6s0/hoPvW5Mmq5MwimlCikUXtIYOYIYWUz1impU75ve6WzeHK+OKf/+AHYchVKuJRsLrTfHHY6A77AEAnZ6bBXc6ePj+1UOmPntxfkx3t5yzI5Uu7e3sYEDKmXirisisJnqxPH7Q68aD3rYVllkQJF6GUsRQmiE4j9/Wpkz9tHhGtDSUKACgOmcmQdhS1LDvLMoOwjJJ4d/ir4cfP0qaA23pxWc5N0FKhnQiLMQCgFceSFl24dPwLF4s/efe2P3llmoAbB5ZLw3gYxFE/jkdZNl8udA47KyunB72jb1Qn7c5gmGVcqJTzkVbAzY1TV89fvHR398nBYMgNikD5mhSQHWJuXM/OFaJhKLHhowAIWfjGl7b3nwbx8Nw3f9cCEDJjXAeDEQCQOGjFRzsny8FkRe43i0+fH2jIn5qZkxG/fft+rlDNlSYzxOanZxuj/hfPnLu+erCyvquSmKd6oOORkoMw+VTEb37hm6oXzdq5o2DU0akUMnbJhhgUHHeCelRBnGXDLAGDLMcrvHJ58dtvfXC4tdntCQG+bU/MTPl8sD5cIlMztSAOvvX6ceJEO3tHn7z3JG20XJleu3w1ToPdvQ0j+GS9/vWv3Xjl1Onru935W59ClnZGQ4sxi7FA8N+OBs8QOZqvD20z7fpoGDbikIMwMiNSlRG1DVWZiHiCCHUtG1vW+T/6fXDtrfZRnGSDqN8bdMbLpaS909EXaYBYKafPXl367PH9nd0gzTRRoWPnKWJ/81vfPnNy5Yc//OGt28/nHHhjoz03AD4cZdgUixULcJylFnZ7AOlYuXjj5R/9x//033cPr1VnRjKyLUtkkRYyFIJDUsv5DsWI0ZFUr/2977Gx+iCJDnu9IAgRNYVqaTjomFEEOaA2QV//8qLD0t2do62dWChIs2R8cqbgl0DJ4/NLb//dtzvd7kub2xceHQUqjJDqRmHQjQuOqyn
	ZiaKpyoRz4wuXzr70/MTyi8bR+72NEqPVTGL4a1NvIQRK5Cw3MDBz+RI6tpAAhJIzy65WEGOEYEhF5iv6+VE0F05P+f7Ui61Od4iV1hb1p6amM5USQFoh368t5IvjP/m1ylIuJAhFCGXMotQyjGCbbzX39p88Pvyv/8V2XZT3yED2sHYskteYCcIwBg0DwTVzZLkQ1XyTSuvzgUCpEglFVGMMmNSrzpEAim310sWX7j5ZI9Zc5/ARF6w651dqVSllKIWJhxF3is9XaaPNNOQsBkAdLRLCNMbNLBYGIbcgbdJu7iEpjO+aOE45fxIPl73SuFeORBpgaSwmPUp8ZutU89S1LRwazKgyFkLYY7bHnIXp4sNtoCtLtYnx8n/40Y+2d5U21PfL/+YH/5JqY7v5Ti950DksKlV4+CQnpaY441xzJUBigjMpM6N247ANOGKUKAnaOPliRILBsJ8geDDq1ZhjuzatFsMoKlBdMUbE8aDfY5S5tnvp8pWUZzzL0iR2bdbpHALA/wMUjQteOh3xIgAAAABJRU5ErkJggg==
X-Mailer: Evolution 3.0.3 (3.0.3-1.fc15) 
Message-ID: <1318982052.2997.19.camel@Palantir>
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>
Content-Type: multipart/mixed; boundary="===============1493366676=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============1493366676==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-CoV6knQL6wi7ETBpAdXV"


--=-CoV6knQL6wi7ETBpAdXV
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Mon, 2011-10-17 at 12:40 -0400, Konrad Rzeszutek Wilk wrote:
> > Here's the thing:
> > --
> > # xl pci-list-assignable-devices=20
> > 0000:07:00.0
> > 0000:07:00.1
> >=20
> > # cat xen/VMs/Debian-squeeze.pv | grep pci=3D
> > #   pci=3D[ '[SSSS:]BB:DD.F[,option1[,option2[...]]]', ... ]
> > pci=3D[ '07:00.0' ]
> >=20
> > # xl list
> > Name                                        ID   Mem VCPUs	State	Time(s=
)
> > Domain-0                                     0   750    16     r-----  =
  2205.3
> > Debian-squeeze_pv                            3   128     2     ---sc-  =
    19.8
> > --
> >=20
>=20
> Do you have 'iommu=3Dsoft' in your guest config?
>
I do... BTW, it turned out that was an out-of-memory issue, which went
away after increasing VM's memory (although the old amount of RAM was
enough without PCI-passthrough and still is for HVM, but anyway...)

Now I have a pv-guest that boots but here's what the host and the guest
are saying.

# xl list
Name                                        ID   Mem VCPUs	State	Time(s)
Domain-0                                     0   750    16     r-----   458=
07.9
Debian-squeeze_pv                            1   512     2     r-----    21=
16.6

Host:
[42515.533157] pciback 0000:07:00.0: restoring config space at offset 0xf (=
was 0x100, writing 0x10f)
[42515.533194] pciback 0000:07:00.0: restoring config space at offset 0x8 (=
was 0xc, writing 0xd58f800c)
[42515.533209] pciback 0000:07:00.0: restoring config space at offset 0x6 (=
was 0x1, writing 0xecc1)
[42515.533224] pciback 0000:07:00.0: restoring config space at offset 0x4 (=
was 0xc, writing 0xd590000c)
[42515.533290] pciback 0000:07:00.0: BAR 7: set to [mem 0xdf200000-0xdf2fff=
ff 64bit] (PCI address [0xdf200000-0xdf2fffff])
[42515.533302] pciback 0000:07:00.0: BAR 10: set to [mem 0xdf300000-0xdf3ff=
fff 64bit] (PCI address [0xdf300000-0xdf3fffff])
(XEN) [VT-D]iommu.c:1543: d0:PCIe: unmap 0000:07:00.0
(XEN) [VT-D]iommu.c:1412: d1:PCIe: map 0000:07:00.0
[42515.556555] xen-pciback: vpci: 0000:07:00.0: assign to virtual slot 0
mapping kernel into physical memory
about to get started...
[42526.391448] pciback 0000:07:00.0: Driver tried to write to a read-only c=
onfiguration space field at offset 0x168, size 2. This may be harmless, but=
 if you have problems with your device:
[42526.391450] 1) see permissive attribute in sysfs
[42526.391451] 2) report problems to the xen-devel mailing list along with =
details of your device obtained from lspci.

Guest:
[   19.607997] ixgbe: Intel(R) 10 Gigabit PCI Express Network Driver - vers=
ion 3.4.8-k
[   19.608670] ixgbe: Copyright (c) 1999-2011 Intel Corporation.
[   19.609465] ixgbe 0000:00:00.0: device not available (can't reserve [mem=
 0xdf300000-0xe32fffff 64bit])
[   19.610878] ixgbe: probe of 0000:00:00.0 failed with error -22
[   19.611764] ixgbevf: Intel(R) 10 Gigabit PCI Express Virtual Function Ne=
twork Driver - version 2.1.0-k
[   19.612656] Copyright (c) 2009 - 2010 Intel Corporation.
[   19.614144] ixgb: Intel(R) PRO/10GbE Network Driver - version 1.0.135-k2=
-NAPI
[   19.614865] ixgb: Copyright (c) 1999-2008 Intel Corporation.

While in the guest, I can see the NIC with `lspci' but I can't bring it
up. Also, trying to check in /sys/bus/pci/..., the device does not seem
to be claimed by anyone (no driver file present).

Moreover, when trying to kill the domain, the following happens:
# xl destroy 1
libxl: error: libxl_pci.c:925:do_pci_remove: xc_physdev_unmap_pirq irq=3D40
Aborted
root@odyn:~# xl list
Name                                        ID   Mem VCPUs	State	Time(s)
Domain-0                                     0   750    16     r-----    10=
42.4
Debian-squeeze_pv

Thanks and Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-CoV6knQL6wi7ETBpAdXV
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk6eEaMACgkQk4XaBE3IOsR+4ACfSZx8ClTSoY8AZk8oGiU4VXsn
oEIAoKcGwew0eUmhCjr7lgmi0DyxCuWg
=W9yv
-----END PGP SIGNATURE-----

--=-CoV6knQL6wi7ETBpAdXV--



--===============1493366676==
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

--===============1493366676==--



From xen-devel-bounces@lists.xensource.com Tue Oct 18 18:11:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 18:11:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGKhF-00019F-KA; Tue, 18 Oct 2011 18:11:53 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGKg9-0000wI-UC
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 18:10:46 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1318986641!739554!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4228 invoked from network); 19 Oct 2011 01:10:42 -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; 19 Oct 2011 01:10: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
	p9J1AZfr028576
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 01:10:37 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
	p9J1AYG6017199
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 01:10:35 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
	p9J1ATUi004543; Tue, 18 Oct 2011 20:10:29 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 18 Oct 2011 18:10:29 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 44AA081482; Tue, 18 Oct 2011 21:10:28 -0400 (EDT)
Date: Tue, 18 Oct 2011 21:10:28 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Dario Faggioli <raistlin@linux.it>
Subject: Re: [Xen-devel] Issue with PCI-passthrough and pvops
Message-ID: <20111019011028.GA19302@phenom.dumpdata.com>
References: <1318865791.25056.28.camel@Palantir>
	<20111017164020.GE19684@phenom.dumpdata.com>
	<1318982052.2997.19.camel@Palantir>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318982052.2997.19.camel@Palantir>
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.4E9E238D.00AF:SCFMA922111,ss=1,re=-0.101,fgs=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, Oct 19, 2011 at 01:54:07AM +0200, Dario Faggioli wrote:
> On Mon, 2011-10-17 at 12:40 -0400, Konrad Rzeszutek Wilk wrote:
> > > Here's the thing:
> > > --
> > > # xl pci-list-assignable-devices 
> > > 0000:07:00.0
> > > 0000:07:00.1
> > > 
> > > # cat xen/VMs/Debian-squeeze.pv | grep pci=
> > > #   pci=[ '[SSSS:]BB:DD.F[,option1[,option2[...]]]', ... ]
> > > pci=[ '07:00.0' ]
> > > 
> > > # xl list
> > > Name                                        ID   Mem VCPUs	State	Time(s)
> > > Domain-0                                     0   750    16     r-----    2205.3
> > > Debian-squeeze_pv                            3   128     2     ---sc-      19.8
> > > --
> > > 
> > 
> > Do you have 'iommu=soft' in your guest config?
> >
> I do... BTW, it turned out that was an out-of-memory issue, which went
> away after increasing VM's memory (although the old amount of RAM was
> enough without PCI-passthrough and still is for HVM, but anyway...)
> 
> Now I have a pv-guest that boots but here's what the host and the guest
> are saying.
> 
> # xl list
> Name                                        ID   Mem VCPUs	State	Time(s)
> Domain-0                                     0   750    16     r-----   45807.9
> Debian-squeeze_pv                            1   512     2     r-----    2116.6
> 
> Host:
> [42515.533157] pciback 0000:07:00.0: restoring config space at offset 0xf (was 0x100, writing 0x10f)
> [42515.533194] pciback 0000:07:00.0: restoring config space at offset 0x8 (was 0xc, writing 0xd58f800c)
> [42515.533209] pciback 0000:07:00.0: restoring config space at offset 0x6 (was 0x1, writing 0xecc1)
> [42515.533224] pciback 0000:07:00.0: restoring config space at offset 0x4 (was 0xc, writing 0xd590000c)
> [42515.533290] pciback 0000:07:00.0: BAR 7: set to [mem 0xdf200000-0xdf2fffff 64bit] (PCI address [0xdf200000-0xdf2fffff])
> [42515.533302] pciback 0000:07:00.0: BAR 10: set to [mem 0xdf300000-0xdf3fffff 64bit] (PCI address [0xdf300000-0xdf3fffff])
> (XEN) [VT-D]iommu.c:1543: d0:PCIe: unmap 0000:07:00.0
> (XEN) [VT-D]iommu.c:1412: d1:PCIe: map 0000:07:00.0
> [42515.556555] xen-pciback: vpci: 0000:07:00.0: assign to virtual slot 0
> mapping kernel into physical memory
> about to get started...
> [42526.391448] pciback 0000:07:00.0: Driver tried to write to a read-only configuration space field at offset 0x168, size 2. This may be harmless, but if you have problems with your device:
> [42526.391450] 1) see permissive attribute in sysfs
> [42526.391451] 2) report problems to the xen-devel mailing list along with details of your device obtained from lspci.
> 
> Guest:
> [   19.607997] ixgbe: Intel(R) 10 Gigabit PCI Express Network Driver - version 3.4.8-k
> [   19.608670] ixgbe: Copyright (c) 1999-2011 Intel Corporation.
> [   19.609465] ixgbe 0000:00:00.0: device not available (can't reserve [mem 0xdf300000-0xe32fffff 64bit])
> [   19.610878] ixgbe: probe of 0000:00:00.0 failed with error -22

Well, that is the problem.

> [   19.611764] ixgbevf: Intel(R) 10 Gigabit PCI Express Virtual Function Network Driver - version 2.1.0-k
> [   19.612656] Copyright (c) 2009 - 2010 Intel Corporation.
> [   19.614144] ixgb: Intel(R) PRO/10GbE Network Driver - version 1.0.135-k2-NAPI
> [   19.614865] ixgb: Copyright (c) 1999-2008 Intel Corporation.
> 
> While in the guest, I can see the NIC with `lspci' but I can't bring it
> up. Also, trying to check in /sys/bus/pci/..., the device does not seem
> to be claimed by anyone (no driver file present).
> 
> Moreover, when trying to kill the domain, the following happens:
> # xl destroy 1
> libxl: error: libxl_pci.c:925:do_pci_remove: xc_physdev_unmap_pirq irq=40
> Aborted

Ugh, that looks like a bug.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 18:14:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 18:14:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGKjm-0001Yo-9r; Tue, 18 Oct 2011 18:14:30 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGKj2-0001Lu-Dk
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 18:13:44 -0700
X-Env-Sender: apxeng@gmail.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1318986820!741759!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 401 invoked from network); 19 Oct 2011 01:13:41 -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;
	19 Oct 2011 01:13:41 -0000
Received: by qabg1 with SMTP id g1so1139346qab.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 18:13:40 -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
	:content-type; bh=yiL++Jin8eExHk12e6u5ZHR48LBxBE+nFZ6iK4WxDlw=;
	b=Zr6+wfV4DXJbhpYygrLbie3E3w0csrzb/xgfwntO+YgBLOaa/O5cdTdMZd/9nnwJXl
	HiVPrsTJrvjR7uuAWU5lLLpfl+yhh7+YbHSGsJ5Wmz3F3Olhi4lmrMeZfM+r7wc7PqQJ
	od8C2IhB3N/YR01Fk7MWWST8XghpSC+1+NhZM=
MIME-Version: 1.0
Received: by 10.229.188.12 with SMTP id cy12mr1043068qcb.26.1318986820137;
	Tue, 18 Oct 2011 18:13:40 -0700 (PDT)
Received: by 10.229.20.12 with HTTP; Tue, 18 Oct 2011 18:13:40 -0700 (PDT)
In-Reply-To: <CAGU+aut64MmMmf901p9Gsya4O=hep8merZUDfSUuJCJXMVFtrg@mail.gmail.com>
References: <CAGU+aut64MmMmf901p9Gsya4O=hep8merZUDfSUuJCJXMVFtrg@mail.gmail.com>
Date: Tue, 18 Oct 2011 18:13:40 -0700
Message-ID: <CAGU+auvMvteisW_TVx9eCU=LpmDr_07UnqUoE_ynaxNh5AuZ8w@mail.gmail.com>
From: AP <apxeng@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] Re: make install not creating lib entries in /usr/lib
	under Ubunu 11.10
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, Oct 18, 2011 at 3:36 PM, AP <apxeng@gmail.com> wrote:
> I am building xen-unstable (23860:a422e2a4451e) on Ubuntu 11.10. I
> noticed that the "make install" does not create lib entries in
> /usr/lib/. I see them only in /usr/lib64/. This is causing program
> like xenpaging to not find the xenctrl library (error while loading
> shared libraries: libxenctrl.so.4.2: cannot open shared object file:
> No such file or directory) Is this expected behavior or am I running
> in to something funny in the Ubuntu 11.10 environment that is causing
> the "make install" script not to create these entries? What is the fix
> / workaround for this?

I added /usr/lib64 to /etc/ld.so.conf and ran ldconfig. That fixed the issue.

> PS: I did not see this problem on 10.10 or 11.04.

However I am still curious as to why the "make install" output is
different on 11.10 vs 10.10/11.04

> Thanks,
> AP
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 20:44:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 20: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 1RGN4a-0006R1-ME; Tue, 18 Oct 2011 20:44:08 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGN3f-0006Du-PT
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 20:43:12 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1318995788!1497870!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30492 invoked from network); 19 Oct 2011 03:43:08 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 03:43:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,369,1315180800"; 
   d="scan'208";a="8458859"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 03:42:40 +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, 19 Oct 2011 04:42:40 +0100
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 1RGN3A-0004wm-Fx;
	Wed, 19 Oct 2011 03:42:40 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RGN3A-0002EG-Cb;
	Wed, 19 Oct 2011 04:42:40 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9347-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 19 Oct 2011 04:42:40 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9347: 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 9347 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9347/

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-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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  a33af75083c7
baseline version:
 xen                  a33af75083c7

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


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 Oct 18 22:19:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 22:19:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGOZ6-0001hb-BJ; Tue, 18 Oct 2011 22:19:44 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGOYY-0001VG-6q
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 22:19:10 -0700
X-Env-Sender: apxeng@gmail.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1319001546!756776!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18791 invoked from network); 19 Oct 2011 05:19:07 -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;
	19 Oct 2011 05:19:07 -0000
Received: by qabg1 with SMTP id g1so1236376qab.30
	for <xen-devel@lists.xensource.com>;
	Tue, 18 Oct 2011 22:19:05 -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=FEvZdUY/2WAlJXUGSvPIvC9ZZJMq4FJ9RcGBZYZx7To=;
	b=iE3Rwf2g3KwK75pnqP9Mi5CNxVx/CSsBCsk9iCLIUZ0R/j3qWEk7R0tCRsUJQcrFdQ
	cu0FAx51XUybCXG5hQCYqYwKJftRviybL5Aix47F/+pjrYegCOzMwBOLpnbWFeVONk8n
	mJys3nSGUtpeHVqsJzs6c+utHLpelPjJYbiYM=
MIME-Version: 1.0
Received: by 10.229.24.134 with SMTP id v6mr1119604qcb.102.1319001545751; Tue,
	18 Oct 2011 22:19:05 -0700 (PDT)
Received: by 10.229.20.12 with HTTP; Tue, 18 Oct 2011 22:19:05 -0700 (PDT)
Date: Tue, 18 Oct 2011 22:19:05 -0700
Message-ID: <CAGU+auuKHp=vX_LamPmcmGMYsos1oG7Xq8biMk=LPG=B3gaC5A@mail.gmail.com>
From: AP <apxeng@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] xen 3.4-testing build 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

I am trying to build xen-3.4-testing (19995:0e3b875fd5fb) on Ubuntu
11.10 64-bit. I am building with the following patch:

--- a/Config.mk	Fri Sep 30 18:42:30 2011 -0400
+++ b/Config.mk	Tue Oct 18 22:14:43 2011 -0700
@@ -99,7 +99,7 @@

 # -Wunused-value makes GCC 4.x too aggressive for my taste: ignoring the
 # result of any casted expression causes a warning.
-CFLAGS += -Wno-unused-value
+CFLAGS += -Wno-unused-value -Wno-unused-but-set-variable

 $(call cc-option-add,HOSTCFLAGS,HOSTCC,-Wdeclaration-after-statement)
 $(call cc-option-add,CFLAGS,CC,-Wdeclaration-after-statement)

I am getting the following build error:

make[2]: Entering directory `/home/ap/dev/xen/xen-3.4-testing/tools'
make -C xcutils install
make[3]: Entering directory `/home/ap/dev/xen/xen-3.4-testing/tools/xcutils'
gcc  -O2 -fomit-frame-pointer -m64 -fno-strict-aliasing -std=gnu99
-Wall -Wstrict-prototypes -Wno-unused-value
-Wno-unused-but-set-variable -Wdeclaration-after-statement
-D__XEN_TOOLS__ -MMD -MF .xc_restore.o.d  -D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE  -Werror -I../../tools/libxc
-I../../tools/include -I../../tools/libxc -I../../tools/include
-I../../tools/xenstore -I../../tools/include -c -o xc_restore.o
xc_restore.c
gcc -O2 -fomit-frame-pointer -m64 -fno-strict-aliasing -std=gnu99
-Wall -Wstrict-prototypes -Wno-unused-value
-Wno-unused-but-set-variable -Wdeclaration-after-statement
-D__XEN_TOOLS__ -MMD -MF .xc_restore.d  -D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE  -Werror -I../../tools/libxc
-I../../tools/include -I../../tools/libxc -I../../tools/include
-I../../tools/xenstore -I../../tools/include    xc_restore.o
-L../../tools/libxc -lxenctrl -L../../tools/libxc -lxenguest
-L../../tools/xenstore -lxenstore -o xc_restore
../../tools/libxc/libxenguest.so: undefined reference to `BZ2_bzDecompressInit'
../../tools/libxc/libxenguest.so: undefined reference to `BZ2_bzDecompressEnd'
../../tools/libxc/libxenguest.so: undefined reference to `lzma_end'
../../tools/libxc/libxenguest.so: undefined reference to `BZ2_bzDecompress'
../../tools/libxc/libxenguest.so: undefined reference to `lzma_alone_decoder'
../../tools/libxc/libxenguest.so: undefined reference to `lzma_code'
collect2: ld returned 1 exit status
make[3]: *** [xc_restore] Error 1
make[3]: Leaving directory `/home/ap/dev/xen/xen-3.4-testing/tools/xcutils'
make[2]: *** [subdir-install-xcutils] Error 2
make[2]: Leaving directory `/home/ap/dev/xen/xen-3.4-testing/tools'
make[1]: *** [subdirs-install] Error 2
make[1]: Leaving directory `/home/ap/dev/xen/xen-3.4-testing/tools'
make: *** [install-tools] Error 2

I have tried installing the bz2 (libbz2-dev) and lzam (liblzma-dev)
dev packages but I still get the error. I have tried doing a clean and
make after the installing the dev packages to no avail. Any idea what
other library I need to install?

Thanks,
AP

GCC Info
--------------
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6.1/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
4.6.1-9ubuntu3'
--with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr
--program-suffix=-4.6 --enable-shared --enable-linker-build-id
--with-system-zlib --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6
--libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu
--enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin
--enable-objc-gc --disable-werror --with-arch-32=i686
--with-tune=generic --enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 23:35:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 23:35:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGPk8-0003fl-Oj; Tue, 18 Oct 2011 23:35:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGPj6-0003Sg-F9
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 23:34:08 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319006033!51623327!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21775 invoked from network); 19 Oct 2011 06:33:54 -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; 19 Oct 2011 06:33:54 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 19 Oct 2011 07:34:04 +0100
Message-Id: <4E9E8B78020000780005C13A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 19 Oct 2011 07:34:00 +0100
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] simplify/clean up IRQ 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

This is a first step towards the discussed elimination of struct irq_cfg,
followed by moving some non-IO-APIC related x86 code from io_apic.c
to irq.c. The patches aren't really connected except for the second
building upon the first and continuing the cleanup begun there.

1: fold struct irq_cfg into struct irq_desc
2: x86: move generic IRQ code out of io_apic.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 Tue Oct 18 23:36:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 23:36:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGPlX-00043M-Oa; Tue, 18 Oct 2011 23:36:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGPjj-0003aY-Di
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 23:34:49 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319006053!59784895!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31575 invoked from network); 19 Oct 2011 06:34:13 -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; 19 Oct 2011 06:34:13 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 19 Oct 2011 07:34:44 +0100
Message-Id: <4E9E8BA1020000780005C13D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 19 Oct 2011 07:34:40 +0100
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 1/2] fold struct irq_cfg into struct irq_desc
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

fold struct irq_cfg into struct irq_desc

struct irq_cfg really has become an architecture extension to struct
irq_desc, and hence it should be treated as such (rather than as IRQ
chip specific data, which it was meant to be originally).

For a first step, only convert a subset of the uses; subsequent
patches (partly to be sent later) will aim at fully eliminating the
use of the old structure type.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/ia64/xen/irq.c
+++ b/xen/arch/ia64/xen/irq.c
@@ -79,16 +79,13 @@ irq_desc_t irq_desc[NR_IRQS] =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,
+		}
 	}
 };
=20
-struct irq_cfg irq_cfg[NR_IRQS] =3D {
-    [0 ... NR_IRQS-1] =3D{
-        .vector =3D -1,
-        .cpu_mask =3D CPU_MASK_ALL,
-}
-};
-
 void __do_IRQ_guest(int irq);
=20
 /*
@@ -238,7 +235,6 @@ int setup_vector(unsigned int vector, st
 	unsigned long flags;
 	struct irqaction *old, **p;
 	irq_desc_t *desc =3D irq_descp(vector);
-    struct irq_cfg *cfg =3D irq_cfg(vector);
=20
 	/*
 	 * The following block of code has to be executed atomically
@@ -256,8 +252,7 @@ int setup_vector(unsigned int vector, st
 	desc->status &=3D ~(IRQ_DISABLED | IRQ_INPROGRESS | IRQ_GUEST);
 	desc->handler->startup(vector);
 	desc->handler->enable(vector);
-    desc->chip_data =3D cfg;
-    cfg->vector =3D vector;
+	desc->arch.vector =3D vector;
 	spin_unlock_irqrestore(&desc->lock,flags);
=20
 	return 0;
@@ -283,13 +278,11 @@ void __init release_irq_vector(unsigned=20
 {
 	unsigned long flags;
 	irq_desc_t *desc;
-    struct irq_cfg *cfg;
=20
 	if ( vec =3D=3D IA64_INVALID_VECTOR )
 		return;
=20
 	desc =3D irq_descp(vec);
-    cfg =3D irq_cfg(vec);
=20
 	spin_lock_irqsave(&desc->lock, flags);
 	clear_bit(vec, ia64_xen_vector);
@@ -297,8 +290,7 @@ void __init release_irq_vector(unsigned=20
 	desc->depth =3D 1;
 	desc->status |=3D IRQ_DISABLED;
 	desc->handler->shutdown(vec);
-    desc->chip_data =3D NULL;
-    cfg->vector =3D -1;
+	desc->arch.vector =3D -1;
 	spin_unlock_irqrestore(&desc->lock, flags);
=20
 	while (desc->status & IRQ_INPROGRESS)
--- a/xen/arch/x86/hpet.c
+++ b/xen/arch/x86/hpet.c
@@ -281,7 +281,6 @@ static void hpet_msi_set_affinity(struct
 {
     struct msi_msg msg;
     unsigned int dest;
-    struct irq_cfg *cfg=3D desc->chip_data;
=20
     dest =3D set_desc_affinity(desc, mask);
     if (dest =3D=3D BAD_APICID)
@@ -289,7 +288,7 @@ static void hpet_msi_set_affinity(struct
=20
     hpet_msi_read(desc->action->dev_id, &msg);
     msg.data &=3D ~MSI_DATA_VECTOR_MASK;
-    msg.data |=3D MSI_DATA_VECTOR(cfg->vector);
+    msg.data |=3D MSI_DATA_VECTOR(desc->arch.vector);
     msg.address_lo &=3D ~MSI_ADDR_DEST_ID_MASK;
     msg.address_lo |=3D MSI_ADDR_DEST_ID(dest);
     hpet_msi_write(desc->action->dev_id, &msg);
--- a/xen/arch/x86/i8259.c
+++ b/xen/arch/x86/i8259.c
@@ -395,12 +395,11 @@ void __init init_IRQ(void)
=20
     for (irq =3D 0; platform_legacy_irq(irq); irq++) {
         struct irq_desc *desc =3D irq_to_desc(irq);
-        struct irq_cfg *cfg =3D desc->chip_data;
        =20
         desc->handler =3D &i8259A_irq_type;
         per_cpu(vector_irq, cpu)[FIRST_LEGACY_VECTOR + irq] =3D irq;
-        cfg->cpu_mask=3D cpumask_of_cpu(cpu);
-        cfg->vector =3D FIRST_LEGACY_VECTOR + irq;
+        cpumask_copy(&desc->arch.cpu_mask, cpumask_of(cpu));
+        desc->arch.vector =3D FIRST_LEGACY_VECTOR + irq;
     }
    =20
     per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR] =3D 0;
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -552,7 +552,7 @@ fastcall void smp_irq_move_cleanup_inter
         if (!desc)
             continue;
=20
-        cfg =3D desc->chip_data;
+        cfg =3D &desc->arch;
         spin_lock(&desc->lock);
         if (!cfg->move_cleanup_count)
             goto unlock;
@@ -613,7 +613,7 @@ static void send_cleanup_vector(struct i
=20
 void irq_complete_move(struct irq_desc *desc)
 {
-    struct irq_cfg *cfg =3D desc->chip_data;
+    struct irq_cfg *cfg =3D &desc->arch;
     unsigned vector, me;
=20
     if (likely(!cfg->move_in_progress))
@@ -638,7 +638,7 @@ unsigned int set_desc_affinity(struct ir
         return BAD_APICID;
=20
     irq =3D desc->irq;
-    cfg =3D desc->chip_data;
+    cfg =3D &desc->arch;
=20
     local_irq_save(flags);
     lock_vector_lock();
@@ -661,11 +661,9 @@ set_ioapic_affinity_irq(struct irq_desc=20
     unsigned long flags;
     unsigned int dest;
     int pin, irq;
-    struct irq_cfg *cfg;
     struct irq_pin_list *entry;
=20
     irq =3D desc->irq;
-    cfg =3D desc->chip_data;
=20
     spin_lock_irqsave(&ioapic_lock, flags);
     dest =3D set_desc_affinity(desc, mask);
@@ -682,7 +680,7 @@ set_ioapic_affinity_irq(struct irq_desc=20
             io_apic_write(entry->apic, 0x10 + 1 + pin*2, dest);
             data =3D io_apic_read(entry->apic, 0x10 + pin*2);
             data &=3D ~IO_APIC_REDIR_VECTOR_MASK;
-            data |=3D cfg->vector & 0xFF;
+            data |=3D desc->arch.vector & 0xFF;
             io_apic_modify(entry->apic, 0x10 + pin*2, data);
=20
             if (!entry->next)
@@ -2448,7 +2446,7 @@ int ioapic_guest_write(unsigned long phy
         return irq;
=20
     desc =3D irq_to_desc(irq);
-    cfg =3D desc->chip_data;
+    cfg =3D &desc->arch;
=20
     /*
      * Since PHYSDEVOP_alloc_irq_vector is dummy, rte.vector is the pirq
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -45,8 +45,6 @@ struct irq_desc __read_mostly *irq_desc=20
=20
 static DECLARE_BITMAP(used_vectors, NR_VECTORS);
=20
-struct irq_cfg __read_mostly *irq_cfg =3D NULL;
-
 static DEFINE_SPINLOCK(vector_lock);
=20
 DEFINE_PER_CPU(vector_irq_t, vector_irq);
@@ -156,7 +154,7 @@ static inline int find_unassigned_irq(vo
     int irq;
=20
     for (irq =3D nr_irqs_gsi; irq < nr_irqs; irq++)
-        if (irq_cfg[irq].used =3D=3D IRQ_UNUSED)
+        if (irq_to_desc(irq)->arch.used =3D=3D IRQ_UNUSED)
             return irq;
     return -ENOSPC;
 }
@@ -198,7 +196,7 @@ static void dynamic_irq_cleanup(unsigned
     desc->action  =3D NULL;
     desc->msi_desc =3D NULL;
     desc->handler =3D &no_irq_type;
-    desc->chip_data->used_vectors=3DNULL;
+    desc->arch.used_vectors =3D NULL;
     cpus_setall(desc->affinity);
     spin_unlock_irqrestore(&desc->lock, flags);
=20
@@ -322,26 +320,22 @@ static void __init init_one_irq_cfg(stru
 int __init init_irq_data(void)
 {
     struct irq_desc *desc;
-    struct irq_cfg *cfg;
     int irq, vector;
=20
     for (vector =3D 0; vector < NR_VECTORS; ++vector)
         this_cpu(vector_irq)[vector] =3D -1;
=20
     irq_desc =3D xzalloc_array(struct irq_desc, nr_irqs);
-    irq_cfg =3D xzalloc_array(struct irq_cfg, nr_irqs);
     irq_vector =3D xzalloc_array(u8, nr_irqs_gsi);
    =20
-    if ( !irq_desc || !irq_cfg ||! irq_vector )
+    if ( !irq_desc || !irq_vector )
         return -ENOMEM;
=20
     for (irq =3D 0; irq < nr_irqs; irq++) {
         desc =3D irq_to_desc(irq);
-        cfg =3D irq_cfg(irq);
         desc->irq =3D irq;
-        desc->chip_data =3D cfg;
         init_one_irq_desc(desc);
-        init_one_irq_cfg(cfg);
+        init_one_irq_cfg(&desc->arch);
     }
=20
     /* Never allocate the hypercall vector or Linux/BSD fast-trap vector. =
*/
@@ -384,7 +378,7 @@ static vmask_t *irq_get_used_vector_mask
=20
         ret =3D &global_used_vector_map;
=20
-        if ( desc->chip_data->used_vectors )
+        if ( desc->arch.used_vectors )
         {
             printk(XENLOG_INFO "%s: Strange, unassigned irq %d already =
has used_vectors!\n",
                    __func__, irq);
@@ -526,7 +520,7 @@ int assign_irq_vector(int irq)
 {
     int ret;
     unsigned long flags;
-    struct irq_cfg *cfg =3D &irq_cfg[irq];
+    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);
@@ -1736,15 +1730,15 @@ int map_domain_pirq(
         setup_msi_handler(desc, msi_desc);
=20
         if ( opt_irq_vector_map =3D=3D OPT_IRQ_VECTOR_MAP_PERDEV
-             && !desc->chip_data->used_vectors )
+             && !desc->arch.used_vectors )
         {
-            desc->chip_data->used_vectors =3D &pdev->info.used_vectors;
-            if ( desc->chip_data->vector !=3D IRQ_VECTOR_UNASSIGNED )
+            desc->arch.used_vectors =3D &pdev->info.used_vectors;
+            if ( desc->arch.vector !=3D IRQ_VECTOR_UNASSIGNED )
             {
-                int vector =3D desc->chip_data->vector;
-                ASSERT(!test_bit(vector, desc->chip_data->used_vectors));
+                int vector =3D desc->arch.vector;
+                ASSERT(!test_bit(vector, desc->arch.used_vectors));
=20
-                set_bit(vector, desc->chip_data->used_vectors);
+                set_bit(vector, desc->arch.used_vectors);
             }
         }
=20
@@ -1858,7 +1852,6 @@ static void dump_irqs(unsigned char key)
 {
     int i, irq, pirq;
     struct irq_desc *desc;
-    struct irq_cfg *cfg;
     irq_guest_action_t *action;
     struct domain *d;
     const struct pirq *info;
@@ -1870,7 +1863,6 @@ static void dump_irqs(unsigned char key)
     {
=20
         desc =3D irq_to_desc(irq);
-        cfg =3D desc->chip_data;
=20
         if ( !desc->handler || desc->handler =3D=3D &no_irq_type )
             continue;
@@ -1881,7 +1873,7 @@ static void dump_irqs(unsigned char key)
                           desc->affinity);
         printk("   IRQ:%4d affinity:%s vec:%02x type=3D%-15s"
                " status=3D%08x ",
-               irq, keyhandler_scratch, cfg->vector,
+               irq, keyhandler_scratch, desc->arch.vector,
                desc->handler->typename, desc->status);
=20
         if ( !(desc->status & IRQ_GUEST) )
--- a/xen/arch/x86/msi.c
+++ b/xen/arch/x86/msi.c
@@ -123,16 +123,15 @@ static void msix_put_fixmap(struct pci_d
 void msi_compose_msg(struct irq_desc *desc, struct msi_msg *msg)
 {
     unsigned dest;
-    struct irq_cfg *cfg =3D desc->chip_data;
-    int vector =3D cfg->vector;
+    int vector =3D desc->arch.vector;
=20
-    if ( cpus_empty(cfg->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(&cfg->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
@@ -259,7 +258,6 @@ static void set_msi_affinity(struct irq_
     struct msi_msg msg;
     unsigned int dest;
     struct msi_desc *msi_desc =3D desc->msi_desc;
-    struct irq_cfg *cfg =3D desc->chip_data;
=20
     dest =3D set_desc_affinity(desc, mask);
     if (dest =3D=3D BAD_APICID || !msi_desc)
@@ -271,7 +269,7 @@ static void set_msi_affinity(struct irq_
     read_msi_msg(msi_desc, &msg);
=20
     msg.data &=3D ~MSI_DATA_VECTOR_MASK;
-    msg.data |=3D MSI_DATA_VECTOR(cfg->vector);
+    msg.data |=3D MSI_DATA_VECTOR(desc->arch.vector);
     msg.address_lo &=3D ~MSI_ADDR_DEST_ID_MASK;
     msg.address_lo |=3D MSI_ADDR_DEST_ID(dest);
     msg.dest32 =3D dest;
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -1010,8 +1010,8 @@ void __init smp_intr_init(void)
             continue;
         irq_vector[irq] =3D FIRST_HIPRIORITY_VECTOR + seridx + 1;
         per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] =
=3D irq;
-        irq_cfg[irq].vector =3D FIRST_HIPRIORITY_VECTOR + seridx + 1;
-        irq_cfg[irq].cpu_mask =3D cpu_online_map;
+        irq_to_desc(irq)->arch.vector =3D FIRST_HIPRIORITY_VECTOR + =
seridx + 1;
+        cpumask_copy(&irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
     }
=20
     /* IPI for cleanuping vectors after irq move */
--- a/xen/drivers/passthrough/amd/iommu_init.c
+++ b/xen/drivers/passthrough/amd/iommu_init.c
@@ -348,7 +348,6 @@ static void iommu_msi_set_affinity(struc
     struct msi_msg msg;
     unsigned int dest;
     struct amd_iommu *iommu =3D desc->action->dev_id;
-    struct irq_cfg *cfg =3D desc->chip_data;
     u16 seg =3D iommu->seg;
     u8 bus =3D (iommu->bdf >> 8) & 0xff;
     u8 dev =3D PCI_SLOT(iommu->bdf & 0xff);
@@ -363,7 +362,7 @@ static void iommu_msi_set_affinity(struc
     }
=20
     memset(&msg, 0, sizeof(msg));=20
-    msg.data =3D MSI_DATA_VECTOR(cfg->vector) & 0xff;
+    msg.data =3D MSI_DATA_VECTOR(desc->arch.vector) & 0xff;
     msg.data |=3D 1 << 14;
     msg.data |=3D (INT_DELIVERY_MODE !=3D dest_LowestPrio) ?
         MSI_DATA_DELIVERY_FIXED:
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1001,7 +1001,6 @@ static void dma_msi_set_affinity(struct=20
     unsigned int dest;
     unsigned long flags;
     struct iommu *iommu =3D desc->action->dev_id;
-    struct irq_cfg *cfg =3D desc->chip_data;
=20
 #ifdef CONFIG_X86
     dest =3D set_desc_affinity(desc, mask);
@@ -1011,7 +1010,7 @@ static void dma_msi_set_affinity(struct=20
     }
=20
     memset(&msg, 0, sizeof(msg));=20
-    msg.data =3D MSI_DATA_VECTOR(cfg->vector) & 0xff;
+    msg.data =3D MSI_DATA_VECTOR(desc->arch.vector) & 0xff;
     msg.data |=3D 1 << 14;
     msg.data |=3D (INT_DELIVERY_MODE !=3D dest_LowestPrio) ?
         MSI_DATA_DELIVERY_FIXED:
@@ -1029,7 +1028,7 @@ static void dma_msi_set_affinity(struct=20
     msg.address_lo |=3D MSI_ADDR_DEST_ID(dest & 0xff);
 #else
     memset(&msg, 0, sizeof(msg));
-    msg.data =3D cfg->vector & 0xff;
+    msg.data =3D desc->arch.vector & 0xff;
     msg.data |=3D 1 << 14;
     msg.address_lo =3D (MSI_ADDRESS_HEADER << (MSI_ADDRESS_HEADER_SHIFT + =
8));
     msg.address_lo |=3D MSI_PHYSICAL_MODE << 2;
--- a/xen/include/asm-ia64/linux-xen/asm/README.origin
+++ b/xen/include/asm-ia64/linux-xen/asm/README.origin
@@ -10,6 +10,7 @@ cache.h			-> linux/include/asm-ia64/c=
ach
 gcc_intrin.h		-> linux/include/asm-ia64/gcc_intrin.h
 ia64regs.h		-> linux/include/asm-ia64/ia64regs.h
 io.h			-> linux/include/asm-ia64/io.h
+irq.h			-> linux/include/asm-ia64/irq.h
 hw_irq.h		-> linux/include/asm-ia64/hw_irq.h
 kregs.h			-> linux/include/asm-ia64/kregs.h
 mca_asm.h		-> linux/include/asm-ia64/mca_asm.h
--- /dev/null
+++ b/xen/include/asm-ia64/linux-xen/asm/irq.h
@@ -0,0 +1,73 @@
+#ifndef _ASM_IA64_IRQ_H
+#define _ASM_IA64_IRQ_H
+
+/*
+ * Copyright (C) 1999-2000, 2002 Hewlett-Packard Co
+ *	David Mosberger-Tang <davidm@hpl.hp.com>
+ *	Stephane Eranian <eranian@hpl.hp.com>
+ *
+ * 11/24/98	S.Eranian 	updated TIMER_IRQ and irq_canonicalize
+ * 01/20/99	S.Eranian	added keyboard interrupt
+ * 02/29/00     D.Mosberger	moved most things into hw_irq.h
+ */
+
+#define NR_VECTORS	256
+#define NR_IRQS		256
+
+#ifdef XEN
+struct irq_cfg {
+#define arch_irq_desc irq_cfg
+        int  vector;
+        cpumask_t cpu_mask;
+};
+#endif
+
+static __inline__ int
+irq_canonicalize (int irq)
+{
+	/*
+	 * We do the legacy thing here of pretending that irqs < 16
+	 * are 8259 irqs.  This really shouldn't be necessary at all,
+	 * but we keep it here as serial.c still uses it...
+	 */
+	return ((irq =3D=3D 2) ? 9 : irq);
+}
+
+extern void disable_irq (unsigned int);
+extern void disable_irq_nosync (unsigned int);
+extern void enable_irq (unsigned int);
+extern void set_irq_affinity_info (unsigned int irq, int dest, int =
redir);
+
+#ifdef CONFIG_SMP
+extern void move_irq(int irq);
+#else
+#define move_irq(irq)
+#endif
+
+struct irqaction;
+struct pt_regs;
+int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
+
+extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs =
*regs);
+
+#ifdef XEN
+static inline unsigned int irq_to_vector(int);
+extern int setup_irq_vector(unsigned int, struct irqaction *);
+extern void release_irq_vector(unsigned int);
+extern int request_irq_vector(unsigned int vector,
+               void (*handler)(int, void *, struct cpu_user_regs *),
+               unsigned long irqflags, const char * devname, void =
*dev_id);
+
+#define create_irq(x) assign_irq_vector(AUTO_ASSIGN_IRQ)
+#define destroy_irq(x) free_irq_vector(x)
+
+#define irq_cfg(x)        (&irq_desc[x].arch)
+#define irq_to_desc(x)    (&irq_desc[x]
+
+#define irq_complete_move(x) do {} \
+    while(!x)
+
+#define domain_pirq_to_irq(d, irq) domain_irq_to_vector(d, irq)
+#endif
+
+#endif /* _ASM_IA64_IRQ_H */
--- a/xen/include/asm-ia64/linux/asm/README.origin
+++ b/xen/include/asm-ia64/linux/asm/README.origin
@@ -19,7 +19,6 @@ fpu.h			-> linux/include/asm-ia64/fpu.h
 hdreg.h			-> linux/include/asm-ia64/hdreg.h
 intrinsics.h		-> linux/include/asm-ia64/intrinsics.h
 ioctl.h			-> linux/include/asm-ia64/ioctl.h
-irq.h			-> linux/include/asm-ia64/irq.h
 linkage.h		-> linux/include/asm-ia64/linkage.h
 machvec_hpsim.h		-> linux/include/asm-ia64/machvec_hpsim.h
 mca.h			-> linux/include/asm-ia64/mca.h
--- a/xen/include/asm-ia64/linux/asm/irq.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef _ASM_IA64_IRQ_H
-#define _ASM_IA64_IRQ_H
-
-/*
- * Copyright (C) 1999-2000, 2002 Hewlett-Packard Co
- *	David Mosberger-Tang <davidm@hpl.hp.com>
- *	Stephane Eranian <eranian@hpl.hp.com>
- *
- * 11/24/98	S.Eranian 	updated TIMER_IRQ and irq_canonicalize
- * 01/20/99	S.Eranian	added keyboard interrupt
- * 02/29/00     D.Mosberger	moved most things into hw_irq.h
- */
-
-#define NR_VECTORS	256
-#define NR_IRQS		256
-
-static __inline__ int
-irq_canonicalize (int irq)
-{
-	/*
-	 * We do the legacy thing here of pretending that irqs < 16
-	 * are 8259 irqs.  This really shouldn't be necessary at all,
-	 * but we keep it here as serial.c still uses it...
-	 */
-	return ((irq =3D=3D 2) ? 9 : irq);
-}
-
-extern void disable_irq (unsigned int);
-extern void disable_irq_nosync (unsigned int);
-extern void enable_irq (unsigned int);
-extern void set_irq_affinity_info (unsigned int irq, int dest, int =
redir);
-
-#ifdef CONFIG_SMP
-extern void move_irq(int irq);
-#else
-#define move_irq(irq)
-#endif
-
-struct irqaction;
-struct pt_regs;
-int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
-
-extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs =
*regs);
-
-#endif /* _ASM_IA64_IRQ_H */
--- a/xen/include/asm-x86/irq.h
+++ b/xen/include/asm-x86/irq.h
@@ -21,7 +21,7 @@
 #define LEGACY_VECTOR(irq)          ((irq) + FIRST_LEGACY_VECTOR)
=20
 #define irq_to_desc(irq)    (&irq_desc[irq])
-#define irq_cfg(irq)        (&irq_cfg[irq])
+#define irq_cfg(irq)        (&irq_desc[irq].arch)
=20
 typedef struct {
     DECLARE_BITMAP(_bits,NR_VECTORS);
@@ -30,6 +30,7 @@ typedef struct {
 struct irq_desc;
=20
 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;
@@ -46,8 +47,6 @@ struct irq_cfg {
=20
 #define IRQ_VECTOR_UNASSIGNED (-1)
=20
-extern struct irq_cfg *irq_cfg;
-
 typedef int vector_irq_t[NR_VECTORS];
 DECLARE_PER_CPU(vector_irq_t, vector_irq);
=20
--- a/xen/include/xen/irq.h
+++ b/xen/include/xen/irq.h
@@ -63,7 +63,6 @@ extern unsigned int nr_irqs;
 #endif
=20
 struct msi_desc;
-struct irq_cfg;
 /*
  * This is the "IRQ descriptor", which contains various information
  * about the irq, including what kind of hardware handling it has,
@@ -74,9 +73,9 @@ typedef struct irq_desc {
     hw_irq_controller *handler;
     struct msi_desc   *msi_desc;
     struct irqaction *action;	/* IRQ action list */
-    struct irq_cfg *chip_data;
     int irq;
     spinlock_t lock;
+    struct arch_irq_desc arch;
     cpumask_t affinity;
     cpumask_t pending_mask;  /* IRQ migration pending mask */
=20
@@ -97,32 +96,6 @@ extern irq_desc_t irq_desc[NR_VECTORS];
=20
 #define request_irq(irq, handler, irqflags, devname, devid) \
     request_irq_vector(irq_to_vector(irq), handler, irqflags, devname, =
devid)
-
-static inline unsigned int irq_to_vector(int);
-extern int setup_irq_vector(unsigned int, struct irqaction *);
-extern void release_irq_vector(unsigned int);
-extern int request_irq_vector(unsigned int vector,
-               void (*handler)(int, void *, struct cpu_user_regs *),
-               unsigned long irqflags, const char * devname, void =
*dev_id);
-
-#define create_irq(x) assign_irq_vector(AUTO_ASSIGN_IRQ)
-#define destroy_irq(x) free_irq_vector(x)
-
-#define irq_cfg(x)        &irq_cfg[(x)]
-#define irq_to_desc(x)    &irq_desc[(x)]
-
-#define irq_complete_move(x) do {} \
-    while(!x)
-
-#define domain_pirq_to_irq(d, irq) domain_irq_to_vector(d, irq)
-
-struct irq_cfg {
-        int  vector;
-        cpumask_t cpu_mask;
-};
-
-extern struct irq_cfg irq_cfg[];
-
 #else
 extern int setup_irq(unsigned int irq, struct irqaction *);
 extern void release_irq(unsigned int irq);



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 23:38:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 23:38:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGPnK-0004SY-CA; Tue, 18 Oct 2011 23:38:30 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGPkF-0003h6-I0
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 23:35:20 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1319006087!42514940!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9739 invoked from network); 19 Oct 2011 06:34:47 -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; 19 Oct 2011 06:34:47 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 19 Oct 2011 07:35:16 +0100
Message-Id: <4E9E8BC1020000780005C140@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 19 Oct 2011 07:35:13 +0100
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 2/2] x86: move generic IRQ code out of io_apic.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

x86: move generic IRQ code out of io_apic.c

While doing so, eliminate the use of struct irq_cfg and convert the
CPU mask accessors to the new style ones as far as possible.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -528,133 +528,6 @@ static void clear_IO_APIC (void)
 }
=20
 #ifdef CONFIG_SMP
-fastcall void smp_irq_move_cleanup_interrupt(struct cpu_user_regs *regs)
-{
-    unsigned vector, me;
-    struct cpu_user_regs *old_regs =3D set_irq_regs(regs);
-
-    ack_APIC_irq();
-    this_cpu(irq_count)++;
-    irq_enter();
-
-    me =3D smp_processor_id();
-    for (vector =3D FIRST_DYNAMIC_VECTOR; vector < NR_VECTORS; vector++) =
{
-        unsigned int irq;
-        unsigned int irr;
-        struct irq_desc *desc;
-        struct irq_cfg *cfg;
-        irq =3D __get_cpu_var(vector_irq)[vector];
-
-        if (irq =3D=3D -1)
-            continue;
-
-        desc =3D irq_to_desc(irq);
-        if (!desc)
-            continue;
-
-        cfg =3D &desc->arch;
-        spin_lock(&desc->lock);
-        if (!cfg->move_cleanup_count)
-            goto unlock;
-
-        if (vector =3D=3D cfg->vector && cpu_isset(me, cfg->cpu_mask))
-            goto unlock;
-
-        irr =3D apic_read(APIC_IRR + (vector / 32 * 0x10));
-        /*
-         * Check if the vector that needs to be cleanedup is
-         * registered at the cpu's IRR. If so, then this is not
-         * the best time to clean it up. Lets clean it up in the
-         * next attempt by sending another IRQ_MOVE_CLEANUP_VECTOR
-         * to myself.
-         */
-        if (irr  & (1 << (vector % 32))) {
-            genapic->send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR);
-            TRACE_3D(TRC_HW_IRQ_MOVE_CLEANUP_DELAY,
-                     irq, vector, smp_processor_id());
-            goto unlock;
-        }
-
-        TRACE_3D(TRC_HW_IRQ_MOVE_CLEANUP,
-                 irq, vector, smp_processor_id());
-
-        __get_cpu_var(vector_irq)[vector] =3D -1;
-        cfg->move_cleanup_count--;
-
-        if ( cfg->move_cleanup_count =3D=3D 0 )
-        {
-            cfg->old_vector =3D IRQ_VECTOR_UNASSIGNED;
-            cpus_clear(cfg->old_cpu_mask);
-
-            if ( cfg->used_vectors )
-            {
-                ASSERT(test_bit(vector, cfg->used_vectors));
-                clear_bit(vector, cfg->used_vectors);
-            }
-        }
-unlock:
-        spin_unlock(&desc->lock);
-    }
-
-    irq_exit();
-    set_irq_regs(old_regs);
-}
-
-static void send_cleanup_vector(struct irq_cfg *cfg)
-{
-    cpumask_t cleanup_mask;
-
-    cpus_and(cleanup_mask, cfg->old_cpu_mask, cpu_online_map);
-    cfg->move_cleanup_count =3D cpus_weight(cleanup_mask);
-    genapic->send_IPI_mask(&cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
-
-    cfg->move_in_progress =3D 0;
-}
-
-void irq_complete_move(struct irq_desc *desc)
-{
-    struct irq_cfg *cfg =3D &desc->arch;
-    unsigned vector, me;
-
-    if (likely(!cfg->move_in_progress))
-        return;
-
-    vector =3D get_irq_regs()->entry_vector;
-    me =3D smp_processor_id();
-
-    if (vector =3D=3D cfg->vector && cpu_isset(me, cfg->cpu_mask))
-        send_cleanup_vector(cfg);
-}
-
-unsigned int set_desc_affinity(struct irq_desc *desc, const cpumask_t =
*mask)
-{
-    struct irq_cfg *cfg;
-    unsigned int irq;
-    int ret;
-    unsigned long flags;
-    cpumask_t dest_mask;
-
-    if (!cpus_intersects(*mask, cpu_online_map))
-        return BAD_APICID;
-
-    irq =3D desc->irq;
-    cfg =3D &desc->arch;
-
-    local_irq_save(flags);
-    lock_vector_lock();
-    ret =3D __assign_irq_vector(irq, cfg, mask);
-    unlock_vector_lock();
-    local_irq_restore(flags);
-
-    if (ret < 0)
-        return BAD_APICID;
-
-    cpus_copy(desc->affinity, *mask);
-    cpus_and(dest_mask, *mask, cfg->cpu_mask);
-
-    return cpu_mask_to_apicid(&dest_mask);
-}
-
 static void
 set_ioapic_affinity_irq(struct irq_desc *desc, const cpumask_t *mask)
 {
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -598,6 +598,128 @@ void move_native_irq(struct irq_desc *de
     desc->handler->enable(desc);
 }
=20
+fastcall void smp_irq_move_cleanup_interrupt(struct cpu_user_regs *regs)
+{
+    unsigned vector, me;
+    struct cpu_user_regs *old_regs =3D set_irq_regs(regs);
+
+    ack_APIC_irq();
+    this_cpu(irq_count)++;
+    irq_enter();
+
+    me =3D smp_processor_id();
+    for (vector =3D FIRST_DYNAMIC_VECTOR; vector < NR_VECTORS; vector++) =
{
+        unsigned int irq;
+        unsigned int irr;
+        struct irq_desc *desc;
+        irq =3D __get_cpu_var(vector_irq)[vector];
+
+        if (irq =3D=3D -1)
+            continue;
+
+        desc =3D irq_to_desc(irq);
+        if (!desc)
+            continue;
+
+        spin_lock(&desc->lock);
+        if (!desc->arch.move_cleanup_count)
+            goto unlock;
+
+        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));
+        /*
+         * Check if the vector that needs to be cleanedup is
+         * registered at the cpu's IRR. If so, then this is not
+         * the best time to clean it up. Lets clean it up in the
+         * next attempt by sending another IRQ_MOVE_CLEANUP_VECTOR
+         * to myself.
+         */
+        if (irr  & (1 << (vector % 32))) {
+            genapic->send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR);
+            TRACE_3D(TRC_HW_IRQ_MOVE_CLEANUP_DELAY,
+                     irq, vector, smp_processor_id());
+            goto unlock;
+        }
+
+        TRACE_3D(TRC_HW_IRQ_MOVE_CLEANUP,
+                 irq, vector, smp_processor_id());
+
+        __get_cpu_var(vector_irq)[vector] =3D -1;
+        desc->arch.move_cleanup_count--;
+
+        if ( desc->arch.move_cleanup_count =3D=3D 0 )
+        {
+            desc->arch.old_vector =3D IRQ_VECTOR_UNASSIGNED;
+            cpumask_clear(&desc->arch.old_cpu_mask);
+
+            if ( desc->arch.used_vectors )
+            {
+                ASSERT(test_bit(vector, desc->arch.used_vectors));
+                clear_bit(vector, desc->arch.used_vectors);
+            }
+        }
+unlock:
+        spin_unlock(&desc->lock);
+    }
+
+    irq_exit();
+    set_irq_regs(old_regs);
+}
+
+static void send_cleanup_vector(struct irq_desc *desc)
+{
+    cpumask_t cleanup_mask;
+
+    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);
+
+    desc->arch.move_in_progress =3D 0;
+}
+
+void irq_complete_move(struct irq_desc *desc)
+{
+    unsigned vector, me;
+
+    if (likely(!desc->arch.move_in_progress))
+        return;
+
+    vector =3D get_irq_regs()->entry_vector;
+    me =3D smp_processor_id();
+
+    if (vector =3D=3D desc->arch.vector && cpumask_test_cpu(me, &desc->arc=
h.cpu_mask))
+        send_cleanup_vector(desc);
+}
+
+unsigned int set_desc_affinity(struct irq_desc *desc, const cpumask_t =
*mask)
+{
+    unsigned int irq;
+    int ret;
+    unsigned long flags;
+    cpumask_t dest_mask;
+
+    if (!cpus_intersects(*mask, cpu_online_map))
+        return BAD_APICID;
+
+    irq =3D desc->irq;
+
+    local_irq_save(flags);
+    lock_vector_lock();
+    ret =3D __assign_irq_vector(irq, &desc->arch, 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);
+
+    return cpu_mask_to_apicid(&dest_mask);
+}
+
 /* For re-setting irq interrupt affinity for specific irq */
 void irq_set_affinity(struct irq_desc *desc, const cpumask_t *mask)
 {



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 18 23:48:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 18 Oct 2011 23:48:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGPww-000595-Us; Tue, 18 Oct 2011 23:48:27 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGPw7-0004sT-FP
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 23:47:36 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1319006852!32156321!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23177 invoked from network); 19 Oct 2011 06:47:32 -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; 19 Oct 2011 06:47:32 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 19 Oct 2011 07:47:31 +0100
Message-Id: <4E9E8EA1020000780005C155@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 19 Oct 2011 07:47:29 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Allen M Kay" <allen.m.kay@intel.com>
References: <4E4E48360200007800051F65@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B5E@orsmsx505.amr.corp.intel.com>
	<4E8EC8A80200007800059E3B@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE70A446@orsmsx505.amr.corp.intel.com>
	<4E9458A5020000780005AB99@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301F19DB855@orsmsx505.amr.corp.intel.com>
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301F19DB855@orsmsx505.amr.corp.intel.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Kevin Tian <kevin.tian@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Haitao Shan <haitao.shan@intel.com>,
	Donald D Dugger <donald.d.dugger@intel.com>
Subject: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 19.10.11 at 00:46, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
> Sorry for the late reply, I was trying to close something on another=20
> project.  I have the following questions on the patches after reviewing =
the=20
> paches:
>=20
> 1) In acpi_find_matched_atsr_unit(), you added following code.  The =
original=20
> code only tries to match the bus number.  What is the purpose of this =
new=20
> additional code? Does it fix a problem on one of your systems?
>=20
> +        for ( i =3D 0; i < atsr->scope.devices_cnt; ++i )
> +            if ( atsr->scope.devices[i] =3D=3D bdf )
> +                return atsr;

I reckon that the availability of device specifications in the ATSR
data structure must be there for a purpose. If that's not correct,
then I'll certainly remove that code again, but I'd like to
understand what that data is meant to be for in that case.

> 2)  In pci_add_device() function, the original code calls pci_enable_acs(=
)=20
> only if pdev->domain is not set.  The new code calls pci_enable_acs()=20
> unconditionally, potentially more than once?  What is the reason for =
the=20
> change?

That's the whole purpose of the change, so just to repeat: MMCFG
accesses may not be possible at scan_pci_devices() time for some or
all segments/busses. Hence enabling ATS may simply be impossible
at that point, and must be attempted a second time after Dom0
reported whether using MMCFG is safe.

Since enabling ATS on an already enabled device doesn't do any
harm according to how enable_ats_device() is implemented I
can't see any bad in doing so. If there is, then we're back to
square one where I was asking you how to properly do ATS
enabling given the described MMCFG restriction.

> 3) In the same pci_add_device() function, the new code now also calls=20
> iommu_enable_device() which currently calls enable_ats_device().  This =
means=20
> the new code will enable ATS as it is being discovered by the platform. =
=20
> However, I did not see any code that removing enable_ats_device() call =
in=20
> domain_context_mapping().  Is this the intention?  If so, what is the =
reason?=20

You were telling me that this needs to be re-done after FLR, and hence
has to remain there.

>  I see the reason the original code is still needed but I don't see why =
we=20
> need to call enable_ats_device() during platform device discovery since =
the=20
> enabling bit will get cleared by FLR.

Either we don't need to call it at all during discovery (which I doubt,
since when the device is in use by Dom0, I suppose having ATS
enabled is still desirable or even required), or we have to potentially
do it twice (remember that older Dom0 kernels may fail to report all
PCI devices to the hypervisor).

Jan

> Allen
>=20
>=20
> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]=20
> Sent: Tuesday, October 11, 2011 5:54 AM
> To: Kay, Allen M
> Cc: xen-devel@lists.xensource.com=20
> Subject: RE: Resend: RE: enable_ats_device() call site
>=20
>>>> On 08.10.11 at 04:09, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
>>> For which I'd like to understand why this is being done in the =
places=20
>>> it is
>> now
>>>(not the least why this is done in VT-d specific code in the first =
place).
>>=20
>> The reason it is call by reassign_device_ownership() is because FLR=20
>> clears ATS enabling bit on the device - I forgot about it when I =
wrote=20
>> the last email so we still need to re-enable ATS on the device for =
each=20
> device assignment.
>> To summarize:
>>=20
>> 1) Reason for difference in ATS and ACS handling
>>     a. ATS capability is in the PCIe endpoint - enabling bit is=20
>> cleared by device FLR on the passthrough device.
>>     b. ACS capability is in the PCIe switch - not affected by FLR on=20
>> the passthrough device.
>>=20
>> 2) ATS enabling requirement
>>     a. VT-d engine serving the device has to be ATS capable.
>>     b. device has to be ATS capable
>=20
> Okay, so how about the below then (with an attached prerequisite =
cleanup=20
> patch)?
>=20
> Jan
>=20
> --- 2011-09-20.orig/xen/drivers/passthrough/iommu.c
> +++ 2011-09-20/xen/drivers/passthrough/iommu.c
> @@ -150,6 +150,23 @@ int iommu_add_device(struct pci_dev *pde
>      return hd->platform_ops->add_device(pdev);
>  }
> =20
> +int iommu_enable_device(struct pci_dev *pdev) {
> +    struct hvm_iommu *hd;
> +
> +    if ( !pdev->domain )
> +        return -EINVAL;
> +
> +    ASSERT(spin_is_locked(&pcidevs_lock));
> +
> +    hd =3D domain_hvm_iommu(pdev->domain);
> +    if ( !iommu_enabled || !hd->platform_ops ||
> +         !hd->platform_ops->enable_device )
> +        return 0;
> +
> +    return hd->platform_ops->enable_device(pdev);
> +}
> +
>  int iommu_remove_device(struct pci_dev *pdev)  {
>      struct hvm_iommu *hd;
> --- 2011-09-20.orig/xen/drivers/passthrough/pci.c
> +++ 2011-09-20/xen/drivers/passthrough/pci.c
> @@ -258,7 +258,7 @@ struct pci_dev *pci_get_pdev_by_domain(
>   * pci_enable_acs - enable ACS if hardware support it
>   * @dev: the PCI device
>   */
> -void pci_enable_acs(struct pci_dev *pdev)
> +static void pci_enable_acs(struct pci_dev *pdev)
>  {
>      int pos;
>      u16 cap, ctrl, seg =3D pdev->seg;
> @@ -409,8 +409,11 @@ int pci_add_device(u16 seg, u8 bus, u8 d
>          }
> =20
>          list_add(&pdev->domain_list, &dom0->arch.pdev_list);
> -        pci_enable_acs(pdev);
>      }
> +    else
> +        iommu_enable_device(pdev);
> +
> +    pci_enable_acs(pdev);
> =20
>  out:
>      spin_unlock(&pcidevs_lock);
> --- 2011-09-20.orig/xen/drivers/passthrough/vtd/iommu.c
> +++ 2011-09-20/xen/drivers/passthrough/vtd/iommu.c
> @@ -1901,6 +1901,19 @@ static int intel_iommu_add_device(struct
>      return ret;
>  }
> =20
> +static int intel_iommu_enable_device(struct pci_dev *pdev) {
> +    struct acpi_drhd_unit *drhd =3D acpi_find_matched_drhd_unit(pdev);
> +    int ret =3D drhd ? ats_device(pdev, drhd) : -ENODEV;
> +
> +    if ( ret <=3D 0 )
> +        return ret;
> +
> +    ret =3D enable_ats_device(pdev->seg, pdev->bus, pdev->devfn);
> +
> +    return ret >=3D 0 ? 0 : ret;
> +}
> +
>  static int intel_iommu_remove_device(struct pci_dev *pdev)  {
>      struct acpi_rmrr_unit *rmrr;
> @@ -1931,7 +1944,6 @@ static int intel_iommu_remove_device(str  static =
void=20
> __init setup_dom0_device(struct pci_dev *pdev)  {
>      domain_context_mapping(pdev->domain, pdev->seg, pdev->bus, =
pdev->devfn);
> -    pci_enable_acs(pdev);
>      pci_vtd_quirk(pdev);
>  }
> =20
> @@ -2302,6 +2314,7 @@ const struct iommu_ops intel_iommu_ops =3D
>      .init =3D intel_iommu_domain_init,
>      .dom0_init =3D intel_iommu_dom0_init,
>      .add_device =3D intel_iommu_add_device,
> +    .enable_device =3D intel_iommu_enable_device,
>      .remove_device =3D intel_iommu_remove_device,
>      .assign_device  =3D intel_iommu_assign_device,
>      .teardown =3D iommu_domain_teardown,
> --- 2011-09-20.orig/xen/include/xen/iommu.h
> +++ 2011-09-20/xen/include/xen/iommu.h
> @@ -70,6 +70,7 @@ int iommu_enable_x2apic_IR(void);  void=20
> iommu_disable_x2apic_IR(void);
> =20
>  int iommu_add_device(struct pci_dev *pdev);
> +int iommu_enable_device(struct pci_dev *pdev);
>  int iommu_remove_device(struct pci_dev *pdev);  int=20
> iommu_domain_init(struct domain *d);  void iommu_dom0_init(struct domain =
*d);=20
> @@ -120,6 +121,7 @@ struct iommu_ops {
>      int (*init)(struct domain *d);
>      void (*dom0_init)(struct domain *d);
>      int (*add_device)(struct pci_dev *pdev);
> +    int (*enable_device)(struct pci_dev *pdev);
>      int (*remove_device)(struct pci_dev *pdev);
>      int (*assign_device)(struct domain *d, u16 seg, u8 bus, u8 devfn);
>      void (*teardown)(struct domain *d);
> --- 2011-09-20.orig/xen/include/xen/pci.h
> +++ 2011-09-20/xen/include/xen/pci.h
> @@ -134,6 +134,5 @@ struct pirq;
>  int msixtbl_pt_register(struct domain *, struct pirq *, uint64_t =
gtable); =20
> void msixtbl_pt_unregister(struct domain *, struct pirq *);  void=20
> msixtbl_pt_cleanup(struct domain *d); -void pci_enable_acs(struct =
pci_dev=20
> *pdev);
> =20
>  #endif /* __XEN_PCI_H__ */



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 00:04:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 00:04:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGQCT-0005tK-2P; Wed, 19 Oct 2011 00:04:29 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGQ8j-0005cn-EC
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 00:00:52 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319007633!176007!1
X-Originating-IP: [74.125.82.41]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 390 invoked from network); 19 Oct 2011 07:00:34 -0000
Received: from mail-ww0-f41.google.com (HELO mail-ww0-f41.google.com)
	(74.125.82.41)
	by server-3.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 07:00:34 -0000
Received: by wwe32 with SMTP id 32so4577500wwe.0
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 00:00:33 -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=8zp80O6jIqsNB5JlOUY7BVdacSBZPNoqvEJMPhqrj1w=;
	b=fyGbaqyo7P6+CEUg6T0+PdfkSM8+9Ty7foLaGwKuunbBJkAIDR7xzvwvGQIfgdvuks
	qSjX3ZoXbrnkbNlpB5I8Cd9KBYxSqZF0H2RNaFFJOiT7oQRDJFu4z0F71jTF4iB//5/E
	3otQUAc4GCZeGDgAOdkJo8GBsqY2hKQn9usTU=
Received: by 10.227.11.147 with SMTP id t19mr2047803wbt.72.1319007633298;
	Wed, 19 Oct 2011 00:00:33 -0700 (PDT)
Received: from [192.168.1.71] (host86-153-22-182.range86-153.btcentralplus.com.
	[86.153.22.182])
	by mx.google.com with ESMTPS id h39sm8010370wbo.0.2011.10.19.00.00.31
	(version=SSLv3 cipher=OTHER); Wed, 19 Oct 2011 00:00:32 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Wed, 19 Oct 2011 08:00:30 +0100
Subject: Re: [Xen-devel] [PATCH 0/2] simplify/clean up IRQ handling
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: <CAC4341E.233BC%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH 0/2] simplify/clean up IRQ handling
Thread-Index: AcyOLMmqRaVD9FLhW0+ugk8qtoK3wQ==
In-Reply-To: <4E9E8B78020000780005C13A@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: Andrew Cooper <andrew.cooper3@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 19/10/2011 07:34, "Jan Beulich" <JBeulich@suse.com> wrote:

> This is a first step towards the discussed elimination of struct irq_cfg,
> followed by moving some non-IO-APIC related x86 code from io_apic.c
> to irq.c. The patches aren't really connected except for the second
> building upon the first and continuing the cleanup begun there.
> 
> 1: fold struct irq_cfg into struct irq_desc
> 2: x86: move generic IRQ code out of io_apic.c

Looks straightforward enough. Perhaps Andrew would like to take a look and
Ack also.

 -- Keir

> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> 
> _______________________________________________
> 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 Oct 19 00:11:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 00:11:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGQJ7-0006Tk-NY; Wed, 19 Oct 2011 00:11:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGQFv-0006E7-8f
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 00:08:07 -0700
X-Env-Sender: paolo.bonzini@gmail.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1319008078!22166336!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22970 invoked from network); 19 Oct 2011 07:07:59 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 07:07:59 -0000
Received: by ywm13 with SMTP id 13so1910774ywm.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 00:07:58 -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:newsgroups:to
	:cc:subject:references:in-reply-to:content-type
	:content-transfer-encoding;
	bh=Y3mujHmVGMZxj3n27dvCHgKQGoiU0s43yyo+bBe3OTk=;
	b=wg97huAn8PAuPoMKVwiq+IfjYeEdzO9y9G2u2SP1fvaVJGYEZoG+GQZZrtuaBUsPzX
	EtezJjZ6vbkODHw457gBS27JEK/pE2I38I5rvRM70POPr2ANaMIcVX1XQPLBMMIvvUti
	Enb4jofz95KRpB7Czqt014hnjhm7w+M+DHv1A=
Received: by 10.68.38.42 with SMTP id d10mr10689324pbk.50.1319008078189;
	Wed, 19 Oct 2011 00:07:58 -0700 (PDT)
Received: from yakj.usersys.redhat.com (93-34-218-143.ip51.fastwebnet.it.
	[93.34.218.143])
	by mx.google.com with ESMTPS id jm5sm4392642pbc.1.2011.10.19.00.07.53
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 19 Oct 2011 00:07:55 -0700 (PDT)
Message-ID: <4E9E7743.6040207@redhat.com>
Date: Wed, 19 Oct 2011 09:07:47 +0200
From: Paolo Bonzini <pbonzini@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
Newsgroups: gmane.comp.emulators.xen.devel
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <alpine.DEB.2.00.1110162117190.27361@vega-c.dur.ac.uk>
	<20111017170327.GC19756@phenom.dumpdata.com>
In-Reply-To: <20111017170327.GC19756@phenom.dumpdata.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Ian Campbell <Ian.Campbell@eu.citrix.com>, xen-devel@lists.xensource.com,
	M A Young <m.a.young@durham.ac.uk>
Subject: [Xen-devel] Re: [PATCH] Improve GPT support in pygrub
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/17/2011 07:03 PM, Konrad Rzeszutek Wilk wrote:
>> >  Check all GPT partitions for grub configuration, not just the first
>> >  Signed-off-by: Michael Young<m.a.young@durham.ac.uk>
> Tested-by: Konrad Rzeszutek Wilk<konrad.wilk@oracle.com>

You may need more to handle correctly this line:

    set default="${saved_entry}"

but this can be done in a separate patch.

Paolo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 00:31:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 00:31:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGQcF-0007Zo-1g; Wed, 19 Oct 2011 00:31:07 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGQb3-0007Lw-9v
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 00:29:53 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1319009390!179971!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15043 invoked from network); 19 Oct 2011 07:29:50 -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; 19 Oct 2011 07:29:50 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 19 Oct 2011 08:29:49 +0100
Message-Id: <4E9E988C020000780005C1BC@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 19 Oct 2011 08:29:48 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Alex Bligh" <alex@alex.org.uk>
Subject: Re: [Xen-devel] Compilation problems: oldstyle/xenlinux
	2.6.38, blktap2
References: <DFC59CD6B72571D62D342F37@Ximines.local>
In-Reply-To: <DFC59CD6B72571D62D342F37@Ximines.local>
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 18.10.11 at 20:57, Alex Bligh <alex@alex.org.uk> wrote:
> As far as I can tell from the Makefile, both directories are always =
built:
>=20
>   obj-$(CONFIG_XEN_BLKDEV_TAP2)           +=3D blktap2/ blktap2-new/
>=20
> What's the difference between blktap2 and blktap2-new? Should only
> one be built? I can't see a config option that switches between them.

Yeah, assuming he (as always) just took our patches, the this isn't
meant to be used with CONFIG_XEN_BLKDEV_TAP2=3Dy (which we
never do). Setting it to =3Dm will get you going. I'll see if I can adjust
this (but only in the current patch sets) so that it won't end up trying
to build both into the kernel.

Under the same assumption - the difference between the two is that
-new is what is in the pv-ops kernel (but not upstream), while the
other is the forward port from the 2.6.18 tree.

> I know one option is to just build blktap instead and ignore blktap2.
> If I want to run this as a dom0 for Xen 3.3, will I lose anything
> by not having blktap2?

Quite obviously your kernel will lack support for any of the tap2:
protocols.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 00:33:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 00:33:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGQeV-0007yF-It; Wed, 19 Oct 2011 00:33:27 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGQdi-0007hu-KK
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 00:32:39 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-6.tower-27.messagelabs.com!1319009530!53824013!1
X-Originating-IP: [129.234.248.2]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4872 invoked from network); 19 Oct 2011 07:32:11 -0000
Received: from hermes2.dur.ac.uk (HELO hermes2.dur.ac.uk) (129.234.248.2)
	by server-6.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 07:32:10 -0000
Received: from smtphost4.dur.ac.uk (smtphost4.dur.ac.uk [129.234.252.4])
	by hermes2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9J7WGYA003569;
	Wed, 19 Oct 2011 08:32:21 +0100
Received: from vega-c.dur.ac.uk (vega-c.dur.ac.uk [129.234.250.135])
	by smtphost4.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9J7VwRh013003
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 08:31:58 +0100
Received: from vega-c.dur.ac.uk (localhost [127.0.0.1])
	by vega-c.dur.ac.uk (8.14.3/8.11.1) with ESMTP id p9J7VwUX002451;
	Wed, 19 Oct 2011 08:31:58 +0100
Received: from localhost (dcl0may@localhost)
	by vega-c.dur.ac.uk (8.14.3/8.14.3/Submit) with ESMTP id p9J7Vv4f002446;
	Wed, 19 Oct 2011 08:31:57 +0100
Date: Wed, 19 Oct 2011 08:31:57 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: Paolo Bonzini <pbonzini@redhat.com>
In-Reply-To: <4E9E7743.6040207@redhat.com>
Message-ID: <alpine.DEB.2.00.1110190825500.1724@vega-c.dur.ac.uk>
References: <alpine.DEB.2.00.1110162117190.27361@vega-c.dur.ac.uk>
	<20111017170327.GC19756@phenom.dumpdata.com>
	<4E9E7743.6040207@redhat.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9J7WGYA003569
Cc: Ian Campbell <Ian.Campbell@eu.citrix.com>, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH] Improve GPT support in pygrub
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 19 Oct 2011, Paolo Bonzini wrote:

> On 10/17/2011 07:03 PM, Konrad Rzeszutek Wilk wrote:
>>> >  Check all GPT partitions for grub configuration, not just the first
>>> >  Signed-off-by: Michael Young<m.a.young@durham.ac.uk>
>> Tested-by: Konrad Rzeszutek Wilk<konrad.wilk@oracle.com>
>
> You may need more to handle correctly this line:
>
>   set default="${saved_entry}"
>
> but this can be done in a separate patch.

Yes, there is this and 3 other issues that I was intending to submit as 
separate patches for. Briefly the other issues are
* Fedora 16 uses /boot/grub2 not /boot/grub
* the Fedora 16 grub2 configurations can have partitions references like 
(hd0,gpt2)
* Fedora 16 can have submenus

 	Michael Young

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 00:37:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 00:37:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGQi3-0008Ot-HV; Wed, 19 Oct 2011 00:37:07 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGQhZ-0008C5-6y
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 00:36:37 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1319009793!746368!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5382 invoked from network); 19 Oct 2011 07:36:33 -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;
	19 Oct 2011 07:36:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,370,1315180800"; 
   d="scan'208";a="8461226"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 07:36:33 +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, 19 Oct 2011 08:36:33 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: M A Young <m.a.young@durham.ac.uk>
In-Reply-To: <alpine.DEB.2.00.1110190825500.1724@vega-c.dur.ac.uk>
References: <alpine.DEB.2.00.1110162117190.27361@vega-c.dur.ac.uk>
	<20111017170327.GC19756@phenom.dumpdata.com>
	<4E9E7743.6040207@redhat.com>
	<alpine.DEB.2.00.1110190825500.1724@vega-c.dur.ac.uk>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Wed, 19 Oct 2011 08:36:32 +0100
Message-ID: <1319009792.11016.63.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Paolo Bonzini <pbonzini@redhat.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH] Improve GPT support in pygrub
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-19 at 08:31 +0100, M A Young wrote:
> On Wed, 19 Oct 2011, Paolo Bonzini wrote:
> 
> > On 10/17/2011 07:03 PM, Konrad Rzeszutek Wilk wrote:
> >>> >  Check all GPT partitions for grub configuration, not just the first
> >>> >  Signed-off-by: Michael Young<m.a.young@durham.ac.uk>
> >> Tested-by: Konrad Rzeszutek Wilk<konrad.wilk@oracle.com>
> >
> > You may need more to handle correctly this line:
> >
> >   set default="${saved_entry}"
> >
> > but this can be done in a separate patch.
> 
> Yes, there is this and 3 other issues that I was intending to submit as 
> separate patches for. Briefly the other issues are
> * Fedora 16 uses /boot/grub2 not /boot/grub
> * the Fedora 16 grub2 configurations can have partitions references like 
> (hd0,gpt2)
> * Fedora 16 can have submenus

I think it would be useful to have an archive of the different syntaxes
which we need to support. We should encourage folks who are fixing
pygrub to work on a particular distro to also submit an example of a
standardish configuration file as a patch to e.g.
tools/pygrub/examples/<distro>.grub (or .grub2 if that's appropriate).

IOW please include an example f16 config in your series ;-)

If someone is feeling ultra keen they could even write a little
regression tester framework to iterate over the examples and ensure they
produce something sane...

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 00:40:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 00:40:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGQkw-0000VH-VN; Wed, 19 Oct 2011 00:40:07 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGQkP-0000IM-VC
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 00:39:34 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319009971!183185!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30386 invoked from network); 19 Oct 2011 07:39:31 -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;
	19 Oct 2011 07:39:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,370,1315180800"; 
   d="scan'208";a="8461309"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 07:39:30 +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, 19 Oct 2011 08:39:30 +0100
Subject: Re: [Xen-devel] Issue with PCI-passthrough and pvops
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Dario Faggioli <raistlin@linux.it>
In-Reply-To: <1318982052.2997.19.camel@Palantir>
References: <1318865791.25056.28.camel@Palantir>
	<20111017164020.GE19684@phenom.dumpdata.com>
	<1318982052.2997.19.camel@Palantir>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Wed, 19 Oct 2011 08:39:30 +0100
Message-ID: <1319009970.11016.65.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>,
	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 Wed, 2011-10-19 at 00:54 +0100, Dario Faggioli wrote:
> when trying to kill the domain, the following happens:
> # xl destroy 1
> libxl: error: libxl_pci.c:925:do_pci_remove: xc_physdev_unmap_pirq irq=40
> Aborted

You most probably need 'libxl: add missing "break;" to do_pci_remove'
which I posted v3 of yesterday.

If not then "gdb xl destroy" and "bt" would be useful.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 00:41:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 00:41:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGQm6-0000tN-Fc; Wed, 19 Oct 2011 00:41:18 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGQlV-0000gS-MY
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 00:40:42 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319010038!1523374!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15712 invoked from network); 19 Oct 2011 07:40:38 -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;
	19 Oct 2011 07:40:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,370,1315180800"; 
   d="scan'208";a="8461346"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 07:40: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;
	Wed, 19 Oct 2011 08:40:38 +0100
Subject: Re: [Xen-devel] Issue with PCI-passthrough and pvops
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
In-Reply-To: <20111019011028.GA19302@phenom.dumpdata.com>
References: <1318865791.25056.28.camel@Palantir>
	<20111017164020.GE19684@phenom.dumpdata.com>
	<1318982052.2997.19.camel@Palantir>
	<20111019011028.GA19302@phenom.dumpdata.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Wed, 19 Oct 2011 08:40:37 +0100
Message-ID: <1319010037.11016.66.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>,
	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 Wed, 2011-10-19 at 02:10 +0100, Konrad Rzeszutek Wilk wrote:
> On Wed, Oct 19, 2011 at 01:54:07AM +0200, Dario Faggioli wrote:
> > Guest:
> > [   19.607997] ixgbe: Intel(R) 10 Gigabit PCI Express Network Driver - version 3.4.8-k
> > [   19.608670] ixgbe: Copyright (c) 1999-2011 Intel Corporation.
> > [   19.609465] ixgbe 0000:00:00.0: device not available (can't reserve [mem 0xdf300000-0xe32fffff 64bit])
> > [   19.610878] ixgbe: probe of 0000:00:00.0 failed with error -22
> 
> Well, that is the problem.

Does he need "e820_host=1" in his cfg?



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 00:43:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 00:43:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGQoG-0001Hp-Hb; Wed, 19 Oct 2011 00:43:32 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGQnm-00015O-64
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 00:43:03 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1319010177!35837575!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31174 invoked from network); 19 Oct 2011 07:42:58 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-7.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 07:42:58 -0000
Received: by yxl11 with SMTP id 11so1942482yxl.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 00:42:57 -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=H91JbBWIg99xjyE25uSOoPIdnx7UeRsM+MPT7USJ+yQ=;
	b=dmBMskk6rYi63tR5OVKUTsSpcZtL8P05mItuINGCdZQNmpYXnEMM6oadcJA+16Xxpg
	eRLCxM/fZenVy6WUNmVGRdfudhRoygwRmFNa5ozW7uLI+lPtF+jyvxdPUW4f07KRlN06
	18dTrN7txSju8OdwLp3mJFMrt6eruEwFi8LH8=
MIME-Version: 1.0
Received: by 10.68.34.138 with SMTP id z10mr10738193pbi.105.1319010177293;
	Wed, 19 Oct 2011 00:42:57 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Wed, 19 Oct 2011 00:42:57 -0700 (PDT)
In-Reply-To: <1318946288.3385.18.camel@zakaz.uk.xensource.com>
References: <f7b311b85973f5862c32.1318945118@loki>
	<1318946288.3385.18.camel@zakaz.uk.xensource.com>
Date: Wed, 19 Oct 2011 09:42:57 +0200
X-Google-Sender-Auth: qUlfvM3ni-UgnGo4DqqmhxfMqww
Message-ID: <CAPLaKK5pMXVtBNUKWwgyvp-MPUWmm9f1FKxC9C2Ubn=ae3zP+A@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH v4] libxl: reimplement buffer for bootloading
	and drop data if buffer is full
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
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

2011/10/18 Ian Campbell <Ian.Campbell@citrix.com>:
> On Tue, 2011-10-18 at 14:38 +0100, Roger Pau Monne wrote:
>> # HG changeset patch
>> # User Roger Pau Monne <roger.pau@entel.upc.edu>
>> # Date 1318944898 -7200
>> # Node ID f7b311b85973f5862c323fed4e89c20b7af139a8
>> # Parent =C2=A06fd16bcdd3e55bf8cc6e6e90e910f32e37654fd7
>> libxl: reimplement buffer for bootloading and drop data if buffer is ful=
l.
>>
>> Implement a buffer for the bootloading process that appends data to the =
end until it's full. Drop the whole buffer if a timeout has occurred and th=
e buffer is full. Prevents the bootloader from getting stuck when using pty=
s with small buffers.
>>
>> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
>>
>> diff -r 6fd16bcdd3e5 -r f7b311b85973 tools/libxl/libxl_bootloader.c
>> --- a/tools/libxl/libxl_bootloader.c =C2=A0Tue Oct 18 15:10:04 2011 +020=
0
>> +++ b/tools/libxl/libxl_bootloader.c =C2=A0Tue Oct 18 15:34:58 2011 +020=
0
>> @@ -28,7 +28,8 @@
>> =C2=A0#include "flexarray.h"
>>
>> =C2=A0#define XENCONSOLED_BUF_SIZE 16
>> -#define BOOTLOADER_BUF_SIZE 1024
>> +#define BOOTLOADER_BUF_SIZE 4096
>> +#define BOOTLOADER_TIMEOUT 1
>>
>> =C2=A0static char **make_bootloader_args(libxl__gc *gc,
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 libxl_domain_build_=
info *info,
>> @@ -169,6 +170,7 @@ static char * bootloader_interact(libxl_
>>
>> =C2=A0 =C2=A0 =C2=A0size_t nr_out =3D 0, size_out =3D 0;
>> =C2=A0 =C2=A0 =C2=A0char *output =3D NULL;
>> + =C2=A0 =C2=A0struct timeval wait;
>>
>> =C2=A0 =C2=A0 =C2=A0/* input from xenconsole. read on xenconsoled_fd wri=
te to bootloader_fd */
>> =C2=A0 =C2=A0 =C2=A0int xenconsoled_prod =3D 0, xenconsoled_cons =3D 0;
>> @@ -181,39 +183,66 @@ static char * bootloader_interact(libxl_
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fd_set wsel, rsel;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int nfds;
>>
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Set timeout to 1s before starting to dis=
card data */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0wait.tv_sec =3D BOOTLOADER_TIMEOUT;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0wait.tv_usec =3D 0;
>> +
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod =3D=3D xenconsole=
d_cons)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xenconsoled_prod =3D xen=
consoled_cons =3D 0;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod =3D=3D bootloader_=
cons)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bootloader_prod =3D boot=
loader_cons =3D 0;

Now that I also look at it, I think this "ifs" could be removed, the
following checks for cons > 0 will perform the same task if cons =3D=3D
prod, and the code will look cleaner.

>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Move buffers around to drop already cons=
umed data */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_cons > 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xenconsoled_prod -=3D xencons=
oled_cons;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memmove(xenconsoled_buf, &xen=
consoled_buf[xenconsoled_cons],
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0x=
enconsoled_prod);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xenconsoled_cons =3D 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_cons > 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bootloader_prod -=3D bootload=
er_cons;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0memmove(bootloader_buf, &boot=
loader_buf[bootloader_cons],
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0b=
ootloader_prod);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bootloader_cons =3D 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>>
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_ZERO(&rsel);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_SET(fifo_fd, &rsel);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D fifo_fd + 1;
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod =3D=3D 0 || (xenconsol=
ed_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons =3D=3D 0)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod < XENCONSOLED_BUF_SIZE=
) {
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_SET(xenconsoled_fd, &=
rsel);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D xenconsoled_fd =
+ 1 > nfds ? xenconsoled_fd + 1 : nfds;
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod =3D=3D 0 || (bootloader=
_prod < BOOTLOADER_BUF_SIZE && bootloader_cons =3D=3D 0)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod < BOOTLOADER_BUF_SIZE) =
{
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_SET(bootloader_fd, &r=
sel);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D bootloader_fd +=
 1 > nfds ? bootloader_fd + 1 : nfds;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>>
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_ZERO(&wsel);
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod !=3D bootloader_cons) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (bootloader_prod > 0) {
>
> It's a little less obvious now that this test means "there is data to
> consume", a comment might be appropriate.

Added a couple of comments.

>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_SET(xenconsoled_fd, &=
wsel);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D xenconsoled_fd =
+ 1 > nfds ? xenconsoled_fd + 1 : nfds;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod !=3D xenconsoled_cons)=
 {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod > 0) {
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0FD_SET(bootloader_fd, &w=
sel);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nfds =3D bootloader_fd +=
 1 > nfds ? bootloader_fd + 1 : nfds;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>>
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D select(nfds, &rsel, &wsel, NULL, NU=
LL);
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (xenconsoled_prod =3D=3D XENCONSOLED_BUF=
_SIZE ||
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bootloader_prod =3D=3D BOOTLO=
ADER_BUF_SIZE)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D select(nfds, &rsel, &=
wsel, NULL, &wait);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0else
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D select(nfds, &rsel, &=
wsel, NULL, NULL);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (errno =3D=3D EINTR)
>> + =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=A0goto out_err;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>>
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Input from xenconsole, read xencons=
oled_fd, write bootloader_fd */
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (FD_ISSET(xenconsoled_fd, &rsel)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret =3D=3D 0 && xenconsoled_prod =3D=3D=
 XENCONSOLED_BUF_SIZE) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Drop the buffer */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xenconsoled_prod =3D 0;
>
> Do you also need to reset cons here? I expect we could prove it was
> always zero anyway but it might be more obvious to just reset it.

It is always 0 because we check "cons > 0" at the start of the loop,
and set it to 0 if it is bigger. If you feel it's best to set it to
zero here to make the code easier to understand it's fine for me.

> Otherwise this looks good, thanks.

Thanks to you and Ian Jackson for reviewing the code and having so
much patience.

>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else if (FD_ISSET(xenconsoled_fd, &rsel))=
 {
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D read(xenconsoled=
_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled=
_prod);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0 && errno !=
=3D EIO && errno !=3D EAGAIN)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out_e=
rr;
>> @@ -229,7 +258,10 @@ static char * bootloader_interact(libxl_
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>>
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Input from bootloader, read bootloa=
der_fd, write xenconsoled_fd */
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (FD_ISSET(bootloader_fd, &rsel)) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret =3D=3D 0 && bootloader_prod =3D=3D =
BOOTLOADER_BUF_SIZE) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Drop the buffer */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bootloader_prod =3D 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else if (FD_ISSET(bootloader_fd, &rsel)) =
{
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D read(bootloader_=
fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod=
);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret < 0 && errno !=
=3D EIO && errno !=3D EAGAIN)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out_e=
rr;
>>
>> _______________________________________________
>> 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 Oct 19 00:52:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 00:52:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGQxE-0002U2-O9; Wed, 19 Oct 2011 00:52:48 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGQvu-00025Y-AP
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 00:51:26 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319010652!59799459!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3662 invoked from network); 19 Oct 2011 07:50:52 -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; 19 Oct 2011 07:50:52 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Wed, 19 Oct 2011 08:51:22 +0100
Message-Id: <4E9E9D97020000780005C1DE@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Wed, 19 Oct 2011 08:51:19 +0100
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().

As event_handler is being checked to be non-zero, shouldn't the
code you remove simply become conditional (upon event_handler
being zero)?

Jan

> 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).
>=20
> 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 Oct 19 01:12:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 01:12:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGRFv-000474-A2; Wed, 19 Oct 2011 01:12:07 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGREg-0003th-BL
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 01:10:50 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319011834!42279165!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4326 invoked from network); 19 Oct 2011 08:10:36 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 08:10:36 -0000
Received: by pzk32 with SMTP id 32so4074523pzk.8
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 01:10:45 -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=wKvRDVtpZmOnsVKiN/OgDM3U4Y2m93aIvagVkCjszDc=;
	b=cNywOeqk8VR/q+a7x9Tz1J+wCAH02ThEH40K0kxCsa7bkgQwIL+ZaNU4bHUDG9FpDP
	kCjAneo4iC39qsFMvHuFJukagXyjnpxAYP8UISJvmIHO/UkcN05F1YoJaKdmIvlkYnU7
	5Qp+MIRkDrJAmJeXH+3cWjkDOVr15eCI1y2zU=
MIME-Version: 1.0
Received: by 10.68.38.132 with SMTP id g4mr7742695pbk.122.1319011845156; Wed,
	19 Oct 2011 01:10:45 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Wed, 19 Oct 2011 01:10:45 -0700 (PDT)
In-Reply-To: <20125.32034.710835.32455@mariner.uk.xensource.com>
References: <8fe2ca552de44aa679be.1318512275@loki>
	<20124.19527.706498.819017@mariner.uk.xensource.com>
	<CAPLaKK6=nU4R62KvxK++XGNx0zff89TNYZkTFizZ1wDbMqUBNg@mail.gmail.com>
	<20125.32034.710835.32455@mariner.uk.xensource.com>
Date: Wed, 19 Oct 2011 10:10:45 +0200
X-Google-Sender-Auth: sVusV0aptSq0GzolPYLXC4nmNqw
Message-ID: <CAPLaKK71zs+0aPd2A6yM_+OPtEfMJZnK2KyHANFxFXgDjms8qQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] tools/check: check for headers and libraries
	in EXTRA_INCLUDES and EXTRA_LIB
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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/10/18 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> Roger Pau Monn=C3=A9 writes ("Re: [Xen-devel] [PATCH] tools/check: check =
for headers and libraries in EXTRA_INCLUDES and EXTRA_LIB"):
>> 2011/10/17 Ian Jackson <Ian.Jackson@eu.citrix.com>:
>> > Perhaps this would be more easily achieved with "export" ?
>>
>> Exported variables are not passed to the called program (chk in this cas=
e).
>
> Are you sure ? =C2=A0One purpose of "export" is to put the variable in th=
e
> environment of commands make runs.

I'm not an expert on Makefiles, but from what I've found on the
internet, export is used to pass variables to sub-makefiles:
http://www.gnu.org/s/hello/manual/make/Variables_002fRecursion.html
but I couldn't find any reference about using export to pass variables
to executed commands. I've tried:

export PYTHON
export LIBXENAPI_BINDINGS
....
./chk build

And variables where not passed to executed script. At the end I think
the most suitable solution is to use:

PYTHON=3D$(PYTHON) \
LIBXENAPI_BINDINGS=3D$(LIBXENAPI_BINDINGS) \
....
./chk build

To avoid having long lines. This way works fine, variables are passed
to the called script.

>> > The check_sys_root stuff seems unrelated ? =C2=A0Or at least, it's not
>> > mentioned in your commit message. =C2=A0I'm not sure if it should be
>> > disentangled but it should definitely be mentioned. =C2=A0(I'm not muc=
h of
>> > an expert on tools/check.)
>>
>> The check_sys_root call was already there, just moved it to the top,
>> but I don't know if it's really necessary.
>
> Why do you move it ?

Because if I found the requested headers in one of the folders while
doing the for loop I perform a return 0, I could also perform a break
and left the check_sys_root at the end, but does it really matter that
much to check_sys_root at the start or at the end of has_header?
Looking at the code of the function it doesn't seem to matter when it
is performed.

> Ian.
>

Thanks, Roger.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 01:14:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 01:14:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGRHr-0004WW-Sj; Wed, 19 Oct 2011 01:14:07 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGRHH-0004Jy-0A
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 01:13:31 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1319012006!781988!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 341 invoked from network); 19 Oct 2011 08:13:28 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 08:13:28 -0000
Received: by ywm13 with SMTP id 13so1967653ywm.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 01:13:26 -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=bwoAaVXX3iLczq0iefSB9VGCU+LjOwnpNSbNhBoLf7A=;
	b=Cee2eGx/KmoUewnEJ4ds60KsDanAcQPqMbbJUWfZg711n8yYHTNZRhA6G7/3ARBShJ
	VxLv3dtoX2HyuIv24V7gYCrdE74VESszJSy/QVhsxYSRcbMIQY5LfbT+NQW04YwQLv+Y
	JNo0qKJC64OvVw1Dzr8AN/WRgCE0uZitQJv+8=
MIME-Version: 1.0
Received: by 10.68.58.130 with SMTP id r2mr5088764pbq.37.1319012006536; Wed,
	19 Oct 2011 01:13:26 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Wed, 19 Oct 2011 01:13:26 -0700 (PDT)
In-Reply-To: <CAPLaKK71zs+0aPd2A6yM_+OPtEfMJZnK2KyHANFxFXgDjms8qQ@mail.gmail.com>
References: <8fe2ca552de44aa679be.1318512275@loki>
	<20124.19527.706498.819017@mariner.uk.xensource.com>
	<CAPLaKK6=nU4R62KvxK++XGNx0zff89TNYZkTFizZ1wDbMqUBNg@mail.gmail.com>
	<20125.32034.710835.32455@mariner.uk.xensource.com>
	<CAPLaKK71zs+0aPd2A6yM_+OPtEfMJZnK2KyHANFxFXgDjms8qQ@mail.gmail.com>
Date: Wed, 19 Oct 2011 10:13:26 +0200
X-Google-Sender-Auth: OGtVArDJk3xZyiouGWaJZ0z1ei8
Message-ID: <CAPLaKK6RP9Yjp6B3GN4-Ztoxrspjo4xpXQjcPB=p2jvF4D1dgw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] tools/check: check for headers and libraries
	in EXTRA_INCLUDES and EXTRA_LIB
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
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

>> Why do you move it ?
>
> Because if I found the requested headers in one of the folders while
> doing the for loop I perform a return 0, I could also perform a break
> and left the check_sys_root at the end, but does it really matter that
> much to check_sys_root at the start or at the end of has_header?
> Looking at the code of the function it doesn't seem to matter when it
> is performed.
>

Also, I've forgot to say that has_lib function performs check_sys_root
at the beginning.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 01:39:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 01:39:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGRgq-0005U0-56; Wed, 19 Oct 2011 01:39:56 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGRfo-0005GZ-7h; Wed, 19 Oct 2011 01:38:53 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319013528!194581!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4436 invoked from network); 19 Oct 2011 08:38:48 -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;
	19 Oct 2011 08:38:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8462943"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 08:38: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, 19 Oct 2011 09:38:48 +0100
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Wed, 19 Oct 2011 09:38:48 +0100
In-Reply-To: <20111018132618.GA19611@phenom.dumpdata.com>
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com> <4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org> <20111018132618.GA19611@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: <1319013528.3385.59.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Andrew Bobulsky <rulerof@gmail.com>,
	Lars Kurth <lars.kurth@xen.org>, Joseph,
	Glanville <joseph.glanville@orionvm.com.au>,
	"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, 2011-10-18 at 14:26 +0100, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 17, 2011 at 04:37:15PM +0100, Lars Kurth wrote:
> > Cool.
> > 
> > I am wondering what people think about archiving vs deleting wiki
> > pages. Obviously some pages can be deleted (stuff about events, job
> > listings, old TODO lists, etc.).
> > 
> > Others may still be valuable to legacy users. See
> > http://wiki.xen.org/xenwiki/Archive_Page : the problem right now is
> > that archived pages aren't identifiable and thus confusing. One way
> > of fixing this would be to rename the page from FooBar to
> > Archived/FooBar
> 
> Oh, I like that. That is a good idea.

It'll break links, but I guess that's a feature.

How close are we to having the new wiki setup -- that would also solve
this issue?

We could just manually add a header/banner ("attention box"?) to each
archived page, that's no harder than renaming it I suspect.

Ian.


> > 
> > Views are welcome
> > 
> > Lars
> > 
> > On 17/10/2011 16:17, Ian Campbell wrote:
> > >>Also, who will create the IRC channel
> > >They just pop onto being if you join them.
> > >
> > >
> > 
> > 
> > _______________________________________________
> > 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 Oct 19 01:44:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 01:44:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGRkq-0006iv-EI; Wed, 19 Oct 2011 01:44:04 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGRgW-0005RA-NJ
	for Xen-devel@lists.xensource.com; Wed, 19 Oct 2011 01:39:37 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319013573!35858809!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3367 invoked from network); 19 Oct 2011 08:39:33 -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;
	19 Oct 2011 08:39:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8462966"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 08:39:33 +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, 19 Oct 2011 09:39:33 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Mukesh Rathor <mukesh.rathor@oracle.com>
Date: Wed, 19 Oct 2011 09:39:33 +0100
In-Reply-To: <20111018121727.27a3f03c@mantra.us.oracle.com>
References: <20111013181853.15381ef5@mantra.us.oracle.com>
	<CABDA859.22DA3%keir.xen@gmail.com>
	<20111017191810.28876947@mantra.us.oracle.com>
	<1318925582.16132.31.camel@zakaz.uk.xensource.com>
	<20111018121727.27a3f03c@mantra.us.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: <1319013573.3385.60.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Keir Fraser <keir.xen@gmail.com>, Jeremy Fitzhardinge <jeremy@goop.org>
Subject: [Xen-devel] Re: HYBRID: gnttab_map() to map shared frames..
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-18 at 20:17 +0100, Mukesh Rathor wrote:
> On Tue, 18 Oct 2011 09:13:02 +0100
> Ian Campbell <Ian.Campbell@citrix.com> wrote:
> ... 
> > Could GNTTABOP_setup_table return GFNs from the very top of the GFN
> > space? Perhaps even above what would be architecturally valid,
> > although perhaps that is incompatible with HAP. Anything above
> > max_pfn would seem to be valid for the hypervisor to place "magic"
> > mappings in?
> 
> Well, what's confusing me for this is that there are few max 
> pfn's inside the guest! The nr_pages being one for example, then 
> there's max_pfn in shared_info.arch. I'm not sure if these two are in 
> sync with max_pfn in mm/bootmem.c. Then, we would need to adjust EPT to add 
> these pfns there. So that may put a damper on this.

What about using PFNs from right at the top, i.e. right up near
0xffffffff? I don't think there's any particular reason these special
PFNs need to be contiguous with the "regular" ones. This would limit the
total amount of RAM you could give a hybrid guest, but not by much.

> > Another approach might be to take advantage of the fact that a modern
> > PV kernel will call XENMEM_memory_map to obtain an e820 describing its
> > pseudo-physical address space. You could arrange for there to be some
> > reserved space returned in that.
> 
> I saw e820 code last night, and wondered if this might be the best option.
> I am glad you mentioned it. I am not much familiar with e820 format, so 
> studying it right now.
> 
> thanks,
> Mukesh
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 01:45:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 01: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 1RGRm1-00077S-Ep; Wed, 19 Oct 2011 01:45:17 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGRk8-0006Wo-Uv
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 01:43:22 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1319013795!787658!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30154 invoked from network); 19 Oct 2011 08:43:16 -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;
	19 Oct 2011 08:43:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8463069"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 08:43: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;
	Wed, 19 Oct 2011 09:43:00 +0100
Subject: Re: [Xen-devel] make install not creating lib entries in /usr/lib
	under Ubunu 11.10
From: Ian Campbell <Ian.Campbell@citrix.com>
To: AP <apxeng@gmail.com>
Date: Wed, 19 Oct 2011 09:43:00 +0100
In-Reply-To: <CAGU+aut64MmMmf901p9Gsya4O=hep8merZUDfSUuJCJXMVFtrg@mail.gmail.com>
References: <CAGU+aut64MmMmf901p9Gsya4O=hep8merZUDfSUuJCJXMVFtrg@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: <1319013780.3385.64.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-10-18 at 23:36 +0100, AP wrote:
> I am building xen-unstable (23860:a422e2a4451e) on Ubuntu 11.10. I
> noticed that the "make install" does not create lib entries in
> /usr/lib/. I see them only in /usr/lib64/.

/usr/lib64 is a Red Hat-ism (or perhaps RPM-ism?). I thought that Xen's
build system was supposed to figure this out and Do The Right Thing but
it seems that it doesn't (I usually build 32 bit tools so I guess I just
don't notice).

The Debian Xen packaging uses the following patch. I suspect you want
most of it but not the e.g. bit which adds $(XEN_VERSION) to private
prefix (at least not without a raft of other Debian patches).

It might be nice if there was a single variable which could be set to
control this behaviour, or even better if it can be automatically
detected. I'm also inclined to suggest that the default should be to
use /usr/lib and leave the lib64 thing as a RH special case, but then
I'm a Debian user so I would think that ;-)

> PS: I did not see this problem on 10.10 or 11.04.

Did they perhaps have a /usr/lib64->lib compatibility symlink which has
gone away (perhaps due to multiarch landing?). Debian Squeeze seems to
have such a symlink (from libc6) while Debian Sid does not, I bet Ubuntu
has followed a similar path.

Ian.

That patch:


--- a/config/StdGNU.mk
+++ b/config/StdGNU.mk
@@ -26,22 +26,19 @@
 PREFIX ?= /usr
 BINDIR = $(PREFIX)/bin
 INCLUDEDIR = $(PREFIX)/include
-LIBLEAFDIR = lib
-LIBLEAFDIR_x86_32 = lib
-LIBLEAFDIR_x86_64 = lib64
-LIBDIR = $(PREFIX)/$(LIBLEAFDIR)
-LIBDIR_x86_32 = $(PREFIX)/$(LIBLEAFDIR_x86_32)
-LIBDIR_x86_64 = $(PREFIX)/$(LIBLEAFDIR_x86_64)
-LIBEXEC = $(LIBDIR_x86_32)/xen/bin
+LIBDIR = $(PREFIX)/lib
 SHAREDIR = $(PREFIX)/share
 MANDIR = $(SHAREDIR)/man
 MAN1DIR = $(MANDIR)/man1
 MAN8DIR = $(MANDIR)/man8
 SBINDIR = $(PREFIX)/sbin
-XENFIRMWAREDIR = $(LIBDIR_x86_32)/xen/boot
 
-PRIVATE_PREFIX = $(LIBDIR)/xen
+PRIVATE_PREFIX = $(LIBDIR)/xen-$(XEN_VERSION)
 PRIVATE_BINDIR = $(PRIVATE_PREFIX)/bin
+PRIVATE_LIBDIR = $(PRIVATE_PREFIX)/lib
+
+XENFIRMWAREDIR = $(PRIVATE_PREFIX)/boot
+LIBEXEC = $(PRIVATE_LIBDIR)
 
 ifeq ($(PREFIX),/usr)
 CONFIG_DIR = /etc
--- a/config/x86_64.mk
+++ b/config/x86_64.mk
@@ -10,11 +10,6 @@
 
 CFLAGS += -m64
 
-LIBLEAFDIR = $(LIBLEAFDIR_x86_64)
-LIBDIR = $(LIBDIR_x86_64)
-
-SunOS_LIBDIR = $(SunOS_LIBDIR_x86_64)
-
 # Use only if calling $(LD) directly.
 ifeq ($(XEN_OS),OpenBSD)
 LDFLAGS_DIRECT += -melf_x86_64_obsd
--- a/Config.mk
+++ b/Config.mk
@@ -32,14 +32,14 @@
 
 ifneq ($(EXTRA_PREFIX),)
 EXTRA_INCLUDES += $(EXTRA_PREFIX)/include
-EXTRA_LIB += $(EXTRA_PREFIX)/$(LIBLEAFDIR)
+EXTRA_LIB += $(EXTRA_LIBDIR)
 endif
 
 BISON	?= bison
 FLEX	?= flex
 
 PYTHON      ?= python
-PYTHON_PREFIX_ARG ?= --prefix="$(PREFIX)"
+PYTHON_PREFIX_ARG ?= --home="$(PRIVATE_PREFIX)"
 # The above requires that PREFIX contains *no spaces*. This variable is
here
 # to permit the user to set PYTHON_PREFIX_ARG to '' to workaround this
bug:
 #  https://bugs.launchpad.net/ubuntu/+bug/362570



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 01:48:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 01:48:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGRpN-0007Wj-6P; Wed, 19 Oct 2011 01:48:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGRoq-0007Kp-AT
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 01:48:12 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319014088!757541!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30696 invoked from network); 19 Oct 2011 08:48:08 -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;
	19 Oct 2011 08:48:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8463195"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 08:47:47 +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, 19 Oct 2011 09:47:46 +0100
Subject: Re: [Xen-devel] xen 3.4-testing build error
From: Ian Campbell <Ian.Campbell@citrix.com>
To: AP <apxeng@gmail.com>
Date: Wed, 19 Oct 2011 09:47:46 +0100
In-Reply-To: <CAGU+auuKHp=vX_LamPmcmGMYsos1oG7Xq8biMk=LPG=B3gaC5A@mail.gmail.com>
References: <CAGU+auuKHp=vX_LamPmcmGMYsos1oG7Xq8biMk=LPG=B3gaC5A@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: <1319014066.3385.67.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 Wed, 2011-10-19 at 06:19 +0100, AP wrote:
> I am trying to build xen-3.4-testing (19995:0e3b875fd5fb) on Ubuntu
> 11.10 64-bit. I am building with the following patch:

3.4 is a bit old, why not use 4.1?

> I have tried installing the bz2 (libbz2-dev) and lzam (liblzma-dev)
> dev packages but I still get the error. I have tried doing a clean and
> make after the installing the dev packages to no avail. Any idea what
> other library I need to install?

Recent Ubuntu enabled --as-needed in the linker by default. If you want
to stick with 3.4 you might need to add --no-as-needed somewhere
appropriate, 22856:18807b89083d is the temporary fix which we used for
4.1. This issue is fixed properly in 4.2.

Ian.

> 
> Thanks,
> AP
> 
> GCC Info
> --------------
> Using built-in specs.
> COLLECT_GCC=gcc
> COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6.1/lto-wrapper
> Target: x86_64-linux-gnu
> Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
> 4.6.1-9ubuntu3'
> --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs
> --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr
> --program-suffix=-4.6 --enable-shared --enable-linker-build-id
> --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
> --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6
> --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu
> --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin
> --enable-objc-gc --disable-werror --with-arch-32=i686
> --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu
> --host=x86_64-linux-gnu --target=x86_64-linux-gnu
> Thread model: posix
> gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
> 
> _______________________________________________
> 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 Oct 19 02:10:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 02:10:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGS9y-0008P3-Sf; Wed, 19 Oct 2011 02:10:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGS8J-0008Bt-2s
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 02:08:20 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319015065!198656!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23255 invoked from network); 19 Oct 2011 09:04:25 -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;
	19 Oct 2011 09:04:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8463673"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:04: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, 19 Oct 2011 10:04:24 +0100
Subject: Re: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for
	comms
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Wed, 19 Oct 2011 10:04:24 +0100
In-Reply-To: <1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319015064.3385.80.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	David Vrabel <david.vrabel@citrix.com>,
	Rzeszutek Wilk <konrad.wilk@oracle.com>, Konrad
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-18 at 21:26 +0100, Daniel De Graaf wrote:
> For proper grant mappings, HVM guests require pages allocated using
> alloc_xenballooned_pages instead of alloc_vm_area.
> 
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
>  drivers/net/xen-netback/common.h  |    4 ++--
>  drivers/net/xen-netback/netback.c |   34 ++++++++++++++++++++--------------
>  2 files changed, 22 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
> index 161f207..d5ee9d1 100644
> --- a/drivers/net/xen-netback/common.h
> +++ b/drivers/net/xen-netback/common.h
> @@ -70,8 +70,8 @@ struct xenvif {
>  	/* The shared rings and indexes. */
>  	struct xen_netif_tx_back_ring tx;
>  	struct xen_netif_rx_back_ring rx;
> -	struct vm_struct *tx_comms_area;
> -	struct vm_struct *rx_comms_area;
> +	struct page *tx_comms_page;
> +	struct page *rx_comms_page;

This will conflict with David Vrabel's patch "net: xen-netback: use API
provided by xenbus module to map rings", which I've just noticed hasn't
been committed anywhere.

I suspect that building on David's patches (that series does something
similar to blkback too) will greatly simplify this one since you can
just patch xenbus_map_ring_valloc and friends.

Could you also explain where the requirement to use xenballooned pages
and not alloc_vm_area comes from in your commit message.

David, I guess you should resend your series now that everyone is happy
with it. If you cc the netback one to netdev@ with my Ack then Dave
Miller will pick it up into his tree (it stands alone, right?). The
blkback and grant-table ones go via Konrad I think. I suspect the last
one needs to go via akpm, or at least with his Ack.

>  
>  	/* Frontend feature information. */
>  	u8 can_sg:1;
> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
> index fd00f25..f35e07c 100644
> --- a/drivers/net/xen-netback/netback.c
> +++ b/drivers/net/xen-netback/netback.c
> @@ -42,6 +42,7 @@
>  
>  #include <xen/events.h>
>  #include <xen/interface/memory.h>
> +#include <xen/balloon.h>
>  
>  #include <asm/xen/hypercall.h>
>  #include <asm/xen/page.h>
> @@ -1578,9 +1579,11 @@ static int xen_netbk_kthread(void *data)
>  void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
>  {
>  	struct gnttab_unmap_grant_ref op;
> +	void *addr;
>  
>  	if (vif->tx.sring) {
> -		gnttab_set_unmap_op(&op, (unsigned long)vif->tx_comms_area->addr,
> +		addr = pfn_to_kaddr(page_to_pfn(vif->tx_comms_page));
> +		gnttab_set_unmap_op(&op, (unsigned long)addr,
>  				    GNTMAP_host_map, vif->tx_shmem_handle);
>  
>  		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
> @@ -1588,16 +1591,17 @@ void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
>  	}
>  
>  	if (vif->rx.sring) {
> -		gnttab_set_unmap_op(&op, (unsigned long)vif->rx_comms_area->addr,
> +		addr = pfn_to_kaddr(page_to_pfn(vif->rx_comms_page));
> +		gnttab_set_unmap_op(&op, (unsigned long)addr,
>  				    GNTMAP_host_map, vif->rx_shmem_handle);
>  
>  		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
>  			BUG();
>  	}
> -	if (vif->rx_comms_area)
> -		free_vm_area(vif->rx_comms_area);
> -	if (vif->tx_comms_area)
> -		free_vm_area(vif->tx_comms_area);
> +	if (vif->rx_comms_page)
> +		free_xenballooned_pages(1, &vif->rx_comms_page);
> +	if (vif->tx_comms_page)
> +		free_xenballooned_pages(1, &vif->tx_comms_page);
>  }
>  
>  int xen_netbk_map_frontend_rings(struct xenvif *vif,
> @@ -1610,15 +1614,19 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>  
>  	int err = -ENOMEM;
>  
> -	vif->tx_comms_area = alloc_vm_area(PAGE_SIZE);
> -	if (vif->tx_comms_area == NULL)
> +	if (alloc_xenballooned_pages(1, &vif->tx_comms_page))
>  		goto err;
>  
> -	vif->rx_comms_area = alloc_vm_area(PAGE_SIZE);
> -	if (vif->rx_comms_area == NULL)
> +	txs = (struct xen_netif_tx_sring *)pfn_to_kaddr(page_to_pfn(
> +			vif->tx_comms_page));
> +
> +	if (alloc_xenballooned_pages(1, &vif->rx_comms_page))
>  		goto err;
>  
> -	gnttab_set_map_op(&op, (unsigned long)vif->tx_comms_area->addr,
> +	rxs = (struct xen_netif_rx_sring *)pfn_to_kaddr(page_to_pfn(
> +			vif->rx_comms_page));
> +
> +	gnttab_set_map_op(&op, (unsigned long)txs,
>  			  GNTMAP_host_map, tx_ring_ref, vif->domid);
>  
>  	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
> @@ -1635,10 +1643,9 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>  	vif->tx_shmem_ref    = tx_ring_ref;
>  	vif->tx_shmem_handle = op.handle;
>  
> -	txs = (struct xen_netif_tx_sring *)vif->tx_comms_area->addr;
>  	BACK_RING_INIT(&vif->tx, txs, PAGE_SIZE);
>  
> -	gnttab_set_map_op(&op, (unsigned long)vif->rx_comms_area->addr,
> +	gnttab_set_map_op(&op, (unsigned long)rxs,
>  			  GNTMAP_host_map, rx_ring_ref, vif->domid);
>  
>  	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
> @@ -1656,7 +1663,6 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>  	vif->rx_shmem_handle  = op.handle;
>  	vif->rx_req_cons_peek = 0;
>  
> -	rxs = (struct xen_netif_rx_sring *)vif->rx_comms_area->addr;
>  	BACK_RING_INIT(&vif->rx, rxs, PAGE_SIZE);
>  
>  	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 Oct 19 02:11:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 02:11:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGSBF-0000MP-R6; Wed, 19 Oct 2011 02:11:21 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGSAh-00009F-P5
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 02:10:48 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1319015444!766220!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21231 invoked from network); 19 Oct 2011 09:10:44 -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;
	19 Oct 2011 09:10:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8463873"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:10:44 +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, 19 Oct 2011 10:10:44 +0100
Subject: Re: [Xen-devel] [PATCH 4/5] xen/blkback: don't add m2p overrides
	when using autotranslated physmap
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Wed, 19 Oct 2011 10:10:43 +0100
In-Reply-To: <1318969583-23902-5-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318969583-23902-5-git-send-email-dgdegra@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319015444.3385.82.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-10-18 at 21:26 +0100, Daniel De Graaf wrote:
> This is the same logic as used in grant-table.c, which blkback bypasses.

It would be better to make blkback use grant-table.c.

Ian.

> 
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
>  drivers/block/xen-blkback/blkback.c |   13 ++++++++++---
>  1 files changed, 10 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> index a0d3cbd..d8232e7 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -336,6 +336,10 @@ static void xen_blkbk_unmap(struct pending_req *req)
>  	ret = HYPERVISOR_grant_table_op(
>  		GNTTABOP_unmap_grant_ref, unmap, invcount);
>  	BUG_ON(ret);
> +
> +	if (xen_feature(XENFEAT_auto_translated_physmap))
> +		return;
> +
>  	/*
>  	 * Note, we use invcount, so nr->pages, so we can't index
>  	 * using vaddr(req, i).
> @@ -396,6 +400,12 @@ static int xen_blkbk_map(struct blkif_request *req,
>  		if (ret)
>  			continue;
>  
> +		seg[i].buf  = map[i].dev_bus_addr |
> +			(req->u.rw.seg[i].first_sect << 9);
> +
> +		if (xen_feature(XENFEAT_auto_translated_physmap))
> +			continue;
> +
>  		ret = m2p_add_override(PFN_DOWN(map[i].dev_bus_addr),
>  			blkbk->pending_page(pending_req, i), false);
>  		if (ret) {
> @@ -404,9 +414,6 @@ static int xen_blkbk_map(struct blkif_request *req,
>  			/* We could switch over to GNTTABOP_copy */
>  			continue;
>  		}
> -
> -		seg[i].buf  = map[i].dev_bus_addr |
> -			(req->u.rw.seg[i].first_sect << 9);
>  	}
>  	return ret;
>  }



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 02:12:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 02: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 1RGSCG-0000kU-65; Wed, 19 Oct 2011 02:12:24 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGSBn-0000Y9-7u
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 02:11:55 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319015491!48875013!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25097 invoked from network); 19 Oct 2011 09:11:32 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 09:11:32 -0000
Received: by gyg13 with SMTP id 13so2047054gyg.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 02:11:50 -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=d75WG6oBG2huzUKTaDFq9TkYG8LqexupRmiLlGwnJ4s=;
	b=pS+FbZdI7GM5s/H9JVglMotxuM8WWeW9Wbiy3Su965od8uPWPI+6azAWzpqDjVOKUc
	ZWzJW/653+t4ma88Ung+O8pvVF32Ki6O5GyMR4yhwBlkuUfPOEDSygHn2etbs/Zi6XGO
	H6Q9JgLRvCtucMEtg73tOd9v0MdGpoVbaoUfE=
MIME-Version: 1.0
Received: by 10.68.34.138 with SMTP id z10mr11151631pbi.105.1319015510621;
	Wed, 19 Oct 2011 02:11:50 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Wed, 19 Oct 2011 02:11:50 -0700 (PDT)
In-Reply-To: <1318943767.3385.13.camel@zakaz.uk.xensource.com>
References: <patchbomb.1317386580@loki> <156626fef95b36184ad4.1317386584@loki>
	<1318943767.3385.13.camel@zakaz.uk.xensource.com>
Date: Wed, 19 Oct 2011 11:11:50 +0200
X-Google-Sender-Auth: VCdsrue9eCf8LfxoziV9eHCzrnc
Message-ID: <CAPLaKK4t5Ecfc-RmGgj-fNADpM-Bf8eAd1teeuKUxfDW+pTo+Q@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
Content-Transfer-Encoding: quoted-printable
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

2011/10/18 Ian Campbell <Ian.Campbell@citrix.com>:
> On Fri, 2011-09-30 at 13:43 +0100, Roger Pau Monne wrote:
>> # HG changeset patch
>> # User Roger Pau Monne <roger.pau@entel.upc.edu>
>> # Date 1317386335 -7200
>> # Node ID 156626fef95b36184ad44dfcb049bae2545435f0
>> # Parent =C2=A031b3caad18ac904a242c5bd1ea2bb0e574cd0453
>> libxl: create pci backend only when there are pci devices.
>>
>> Creating empty pci entries made Linux DomUs under NetBSD Dom0 wait a
>> very long time for devices to initialize during kernel boot.
>
> I think since this change we need the following. This applies after my
> big libxl API series:

Yes, this fixes the issue related to the error message "libxl: error:
libxl.c:759:libxl_domain_destroy: pci shutdown failed for domid". I
don't know if I can do this, but anyway:

Acked-by: Roger Pau Monne <roger.pau@entel.upc.edu>

> Ian.
>
> 8<------------------------------------------------------
>
>
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1318943709 -3600
> # Node ID e6af32ecb4483457d5ad9a7b674c18aaf20cc085
> # Parent =C2=A012ac478d1b56f0ff4d3242138b780c551a69f107
> libxl: libxl__device_pci_destroy_all should succeed if there is no PCI bu=
s on the domain
>
> Since 23915:4c4b72c94bac "" it is possible that no bus exists and this is=
 not
> an error. Removes the following spurious warning when destroying a PV dom=
ain
> with no PCI devices:
> =C2=A0 =C2=A0libxl: error: libxl.c:759:libxl_domain_destroy: pci shutdown=
 failed for domid 1005
>
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
>
> diff -r 12ac478d1b56 -r e6af32ecb448 tools/libxl/libxl_pci.c
> --- a/tools/libxl/libxl_pci.c =C2=A0 Tue Oct 18 13:36:43 2011 +0100
> +++ b/tools/libxl/libxl_pci.c =C2=A0 Tue Oct 18 14:15:09 2011 +0100
> @@ -1098,7 +1098,7 @@ int libxl__device_pci_destroy_all(libxl_
>
> =C2=A0 =C2=A0 pcidevs =3D libxl_device_pci_list(ctx, domid, &num);
> =C2=A0 =C2=A0 if ( pcidevs =3D=3D NULL )
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0return ERROR_FAIL;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
>
> =C2=A0 =C2=A0 for (i =3D 0; i < num; i++) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Force remove on shutdown since, on HVM, qe=
mu will not always
>
>
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 02:20:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 02:20:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGSKZ-0001Gy-D7; Wed, 19 Oct 2011 02:20:59 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGSJp-00013K-HX
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 02:20:13 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319015999!51657710!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8430 invoked from network); 19 Oct 2011 09:19:59 -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;
	19 Oct 2011 09:19:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8464206"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:20: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, 19 Oct 2011 10:20:10 +0100
Subject: Re: [Xen-devel] [PATCH 1/2] xen/event: Add reference counting to
	event channel
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Wed, 19 Oct 2011 10:20:10 +0100
In-Reply-To: <1318971851-12809-2-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-2-git-send-email-dgdegra@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319016010.3385.85.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Keir \(Xen.org\)" <keir@xen.org>, "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	"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 Tue, 2011-10-18 at 22:04 +0100, Daniel De Graaf wrote:
> Event channels exposed to userspace by the evtchn module may be used by
> other modules in an asynchronous manner, which requires that reference
> counting be used to prevent the event channel from being closed before
> the signals are delivered.
> 
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
>  drivers/xen/events.c |   34 ++++++++++++++++++++++++++++++++++
>  include/xen/events.h |    6 ++++++
>  2 files changed, 40 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/xen/events.c b/drivers/xen/events.c
> index 7523719..36d3390 100644
> --- a/drivers/xen/events.c
> +++ b/drivers/xen/events.c
> @@ -88,6 +88,7 @@ enum xen_irq_type {
>  struct irq_info
>  {
>  	struct list_head list;
> +	atomic_t refcount;
>  	enum xen_irq_type type;	/* type */
>  	unsigned irq;
>  	unsigned short evtchn;	/* event channel */
> @@ -407,6 +408,7 @@ static void xen_irq_init(unsigned irq)
>  		panic("Unable to allocate metadata for IRQ%d\n", irq);
>  
>  	info->type = IRQT_UNBOUND;
> +	atomic_set(&info->refcount, 1);
>  
>  	irq_set_handler_data(irq, info);
>  
> @@ -469,6 +471,8 @@ static void xen_free_irq(unsigned irq)
>  
>  	irq_set_handler_data(irq, NULL);
>  
> +	BUG_ON(atomic_read(&info->refcount) > 1);

Should this be > 0 ? If we get here with a reference count still held
isn't that indicative of an issue?

Is this just because of the various error paths which call xen_free_irq
to clean up without also dropping the initial reference from
xen_irq_init? I think either these paths should just drop the reference
or the initial refcount should be 0 and the initial reference should be
taken only after the caller of xen_irq_init has actually succeeded.

> +
>  	kfree(info);
>  
>  	/* Legacy IRQ descriptors are managed by the arch. */
> @@ -912,6 +916,10 @@ static void unbind_from_irq(unsigned int irq)
>  {
>  	struct evtchn_close close;
>  	int evtchn = evtchn_from_irq(irq);
> +	struct irq_info *info = irq_get_handler_data(irq);
> +
> +	if (!atomic_dec_and_test(&info->refcount))
> +		return;
>  
>  	mutex_lock(&irq_mapping_update_lock);
>  
> @@ -1038,6 +1046,32 @@ void unbind_from_irqhandler(unsigned int irq, void *dev_id)
>  }
>  EXPORT_SYMBOL_GPL(unbind_from_irqhandler);
>  
> +int evtchn_get(unsigned int evtchn)
> +{
> +	int irq = evtchn_to_irq[evtchn];
> +	struct irq_info *info;
> +
> +	if (irq == -1)
> +		return -ENOENT;
> +
> +	info = irq_get_handler_data(irq);
> +
> +	if (!info)
> +		return -ENOENT;
> +
> +	atomic_inc(&info->refcount);
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(evtchn_get);
> +
> +void evtchn_put(unsigned int evtchn)
> +{
> +	int irq = evtchn_to_irq[evtchn];
> +	unbind_from_irq(irq);
> +}
> +EXPORT_SYMBOL_GPL(evtchn_put);
> +
>  void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector)
>  {
>  	int irq = per_cpu(ipi_to_irq, cpu)[vector];
> diff --git a/include/xen/events.h b/include/xen/events.h
> index d287997..a459cca 100644
> --- a/include/xen/events.h
> +++ b/include/xen/events.h
> @@ -37,6 +37,12 @@ int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain,
>   */
>  void unbind_from_irqhandler(unsigned int irq, void *dev_id);
>  
> +/*
> + * Allow extra references to event channels exposed to userspace by evtchn
> + */
> +int evtchn_get(unsigned int evtchn);
> +void evtchn_put(unsigned int evtchn);
> +
>  void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector);
>  int resend_irq_on_evtchn(unsigned int irq);
>  void rebind_evtchn_irq(int evtchn, int irq);



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 02:25:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 02:25:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGSOq-0001uj-6T; Wed, 19 Oct 2011 02:25:24 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGSO9-0001hj-CJ
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 02:24:42 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319016267!42296869!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26581 invoked from network); 19 Oct 2011 09:24:27 -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;
	19 Oct 2011 09:24:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8464330"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:24: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;
	Wed, 19 Oct 2011 10:24:38 +0100
Subject: Re: [Xen-devel] [PATCH 2/2] xen/gnt{dev,	alloc}: reserve event
	channels for notify
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Wed, 19 Oct 2011 10:24:37 +0100
In-Reply-To: <1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319016278.3385.88.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Keir \(Xen.org\)" <keir@xen.org>, "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	"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 Tue, 2011-10-18 at 22:04 +0100, Daniel De Graaf wrote:
> When using the unmap notify ioctl, the event channel used for
> notification needs to be reserved to avoid it being deallocated prior to
> sending the notification.
> 
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
>  drivers/xen/gntalloc.c |   14 +++++++++++++-
>  drivers/xen/gntdev.c   |   11 +++++++++++
>  2 files changed, 24 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
> index f6832f4..a739fb1 100644
> --- a/drivers/xen/gntalloc.c
> +++ b/drivers/xen/gntalloc.c
> @@ -178,8 +178,10 @@ static void __del_gref(struct gntalloc_gref *gref)
>  		tmp[gref->notify.pgoff] = 0;
>  		kunmap(gref->page);
>  	}
> -	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
>  		notify_remote_via_evtchn(gref->notify.event);
> +		evtchn_put(gref->notify.event);
> +	}
>  
>  	gref->notify.flags = 0;
>  
> @@ -396,6 +398,16 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
>  		goto unlock_out;
>  	}
>  
> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
> +		if (evtchn_get(op.event_channel_port)) {
> +			rc = -EINVAL;
> +			goto unlock_out;
> +		}
> +	}
> +
> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
> +		evtchn_put(gref->notify.event);
> +

If the gref gets torn down here won't we notify and drop the reference
on the wrong evtchn, leading to a double free? If we defer the drop
until after gref->notify.event has been updated then this goes away.

Ian.

>  	gref->notify.flags = op.action;
>  	gref->notify.pgoff = pgoff;
>  	gref->notify.event = op.event_channel_port;
> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
> index f914b26..cfcc890 100644
> --- a/drivers/xen/gntdev.c
> +++ b/drivers/xen/gntdev.c
> @@ -190,6 +190,7 @@ static void gntdev_put_map(struct grant_map *map)
>  
>  	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
>  		notify_remote_via_evtchn(map->notify.event);
> +		evtchn_put(map->notify.event);
>  	}
>  
>  	if (map->pages) {
> @@ -596,6 +597,16 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
>  		goto unlock_out;
>  	}
>  
> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
> +		if (evtchn_get(op.event_channel_port)) {
> +			rc = -EINVAL;
> +			goto unlock_out;
> +		}
> +	}
> +
> +	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
> +		evtchn_put(map->notify.event);
> +
>  	map->notify.flags = op.action;
>  	map->notify.addr = op.index - (map->index << PAGE_SHIFT);
>  	map->notify.event = op.event_channel_port;



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 02:37:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 02:37:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGSaS-0002a5-2X; Wed, 19 Oct 2011 02:37:24 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGSZd-0002KV-Gt
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 02:36:33 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319016990!796363!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16773 invoked from network); 19 Oct 2011 09:36:30 -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;
	19 Oct 2011 09:36:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8464666"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:36: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, 19 Oct 2011 10:36:30 +0100
Subject: Re: [Xen-devel] [PATCH 4 of 9] libxl: create pci backend only when
	there are pci devices
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 19 Oct 2011 10:36:30 +0100
In-Reply-To: <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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1319016990.3385.90.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 Wed, 2011-10-19 at 10:11 +0100, Roger Pau MonnÃ© wrote:
> 2011/10/18 Ian Campbell <Ian.Campbell@citrix.com>:
> > On Fri, 2011-09-30 at 13:43 +0100, Roger Pau Monne wrote:
> >> # HG changeset patch
> >> # User Roger Pau Monne <roger.pau@entel.upc.edu>
> >> # Date 1317386335 -7200
> >> # Node ID 156626fef95b36184ad44dfcb049bae2545435f0
> >> # Parent  31b3caad18ac904a242c5bd1ea2bb0e574cd0453
> >> libxl: create pci backend only when there are pci devices.
> >>
> >> Creating empty pci entries made Linux DomUs under NetBSD Dom0 wait a
> >> very long time for devices to initialize during kernel boot.
> >
> > I think since this change we need the following. This applies after my
> > big libxl API series:
> 
> Yes, this fixes the issue related to the error message "libxl: error:
> libxl.c:759:libxl_domain_destroy: pci shutdown failed for domid". I
> don't know if I can do this, but anyway:
> 
> Acked-by: Roger Pau Monne <roger.pau@entel.upc.edu>

Thanks. FWIW I would encourage anyone who wants and feels qualified to
do so to review any patch and Ack it if they think it is sensible. More
eyes doing review is always a good thing IMHO.

> 
> > Ian.
> >
> > 8<------------------------------------------------------
> >
> >
> > # HG changeset patch
> > # User Ian Campbell <ian.campbell@citrix.com>
> > # Date 1318943709 -3600
> > # Node ID e6af32ecb4483457d5ad9a7b674c18aaf20cc085
> > # Parent  12ac478d1b56f0ff4d3242138b780c551a69f107
> > libxl: libxl__device_pci_destroy_all should succeed if there is no PCI bus on the domain
> >
> > Since 23915:4c4b72c94bac "" it is possible that no bus exists and this is not
> > an error. Removes the following spurious warning when destroying a PV domain
> > with no PCI devices:
> >    libxl: error: libxl.c:759:libxl_domain_destroy: pci shutdown failed for domid 1005
> >
> > Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> >
> > diff -r 12ac478d1b56 -r e6af32ecb448 tools/libxl/libxl_pci.c
> > --- a/tools/libxl/libxl_pci.c   Tue Oct 18 13:36:43 2011 +0100
> > +++ b/tools/libxl/libxl_pci.c   Tue Oct 18 14:15:09 2011 +0100
> > @@ -1098,7 +1098,7 @@ int libxl__device_pci_destroy_all(libxl_
> >
> >     pcidevs = libxl_device_pci_list(ctx, domid, &num);
> >     if ( pcidevs == NULL )
> > -        return ERROR_FAIL;
> > +        return 0;
> >
> >     for (i = 0; i < num; i++) {
> >         /* Force remove on shutdown since, on HVM, qemu will not always
> >
> >
> >



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 02:52:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 02:52:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGSoz-0003K3-6L; Wed, 19 Oct 2011 02:52:25 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGSoC-00037C-Vy
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 02:51:37 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319017892!207755!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31214 invoked from network); 19 Oct 2011 09:51:33 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 09:51:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315195200"; d="scan'208";a="167396444"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 05:51:31 -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; Wed, 19 Oct 2011
	05:51:31 -0400
Message-ID: <4E9E9DA2.5010401@citrix.com>
Date: Wed, 19 Oct 2011 10:51:30 +0100
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 2/2] x86: move generic IRQ code out of
	io_apic.c
References: <4E9E8BC1020000780005C140@nat28.tlf.novell.com>
In-Reply-To: <4E9E8BC1020000780005C140@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 19/10/11 07:35, Jan Beulich wrote:
> x86: move generic IRQ code out of io_apic.c
>
> While doing so, eliminate the use of struct irq_cfg and convert the
> CPU mask accessors to the new style ones as far as possible.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Andrew Cooper <andrew.coooper3@citrix.com>

> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -528,133 +528,6 @@ static void clear_IO_APIC (void)
>  }
>  
>  #ifdef CONFIG_SMP
> -fastcall void smp_irq_move_cleanup_interrupt(struct cpu_user_regs *regs)
> -{
> -    unsigned vector, me;
> -    struct cpu_user_regs *old_regs = set_irq_regs(regs);
> -
> -    ack_APIC_irq();
> -    this_cpu(irq_count)++;
> -    irq_enter();
> -
> -    me = smp_processor_id();
> -    for (vector = FIRST_DYNAMIC_VECTOR; vector < NR_VECTORS; vector++) {
> -        unsigned int irq;
> -        unsigned int irr;
> -        struct irq_desc *desc;
> -        struct irq_cfg *cfg;
> -        irq = __get_cpu_var(vector_irq)[vector];
> -
> -        if (irq == -1)
> -            continue;
> -
> -        desc = irq_to_desc(irq);
> -        if (!desc)
> -            continue;
> -
> -        cfg = &desc->arch;
> -        spin_lock(&desc->lock);
> -        if (!cfg->move_cleanup_count)
> -            goto unlock;
> -
> -        if (vector == cfg->vector && cpu_isset(me, cfg->cpu_mask))
> -            goto unlock;
> -
> -        irr = apic_read(APIC_IRR + (vector / 32 * 0x10));
> -        /*
> -         * Check if the vector that needs to be cleanedup is
> -         * registered at the cpu's IRR. If so, then this is not
> -         * the best time to clean it up. Lets clean it up in the
> -         * next attempt by sending another IRQ_MOVE_CLEANUP_VECTOR
> -         * to myself.
> -         */
> -        if (irr  & (1 << (vector % 32))) {
> -            genapic->send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR);
> -            TRACE_3D(TRC_HW_IRQ_MOVE_CLEANUP_DELAY,
> -                     irq, vector, smp_processor_id());
> -            goto unlock;
> -        }
> -
> -        TRACE_3D(TRC_HW_IRQ_MOVE_CLEANUP,
> -                 irq, vector, smp_processor_id());
> -
> -        __get_cpu_var(vector_irq)[vector] = -1;
> -        cfg->move_cleanup_count--;
> -
> -        if ( cfg->move_cleanup_count == 0 )
> -        {
> -            cfg->old_vector = IRQ_VECTOR_UNASSIGNED;
> -            cpus_clear(cfg->old_cpu_mask);
> -
> -            if ( cfg->used_vectors )
> -            {
> -                ASSERT(test_bit(vector, cfg->used_vectors));
> -                clear_bit(vector, cfg->used_vectors);
> -            }
> -        }
> -unlock:
> -        spin_unlock(&desc->lock);
> -    }
> -
> -    irq_exit();
> -    set_irq_regs(old_regs);
> -}
> -
> -static void send_cleanup_vector(struct irq_cfg *cfg)
> -{
> -    cpumask_t cleanup_mask;
> -
> -    cpus_and(cleanup_mask, cfg->old_cpu_mask, cpu_online_map);
> -    cfg->move_cleanup_count = cpus_weight(cleanup_mask);
> -    genapic->send_IPI_mask(&cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
> -
> -    cfg->move_in_progress = 0;
> -}
> -
> -void irq_complete_move(struct irq_desc *desc)
> -{
> -    struct irq_cfg *cfg = &desc->arch;
> -    unsigned vector, me;
> -
> -    if (likely(!cfg->move_in_progress))
> -        return;
> -
> -    vector = get_irq_regs()->entry_vector;
> -    me = smp_processor_id();
> -
> -    if (vector == cfg->vector && cpu_isset(me, cfg->cpu_mask))
> -        send_cleanup_vector(cfg);
> -}
> -
> -unsigned int set_desc_affinity(struct irq_desc *desc, const cpumask_t *mask)
> -{
> -    struct irq_cfg *cfg;
> -    unsigned int irq;
> -    int ret;
> -    unsigned long flags;
> -    cpumask_t dest_mask;
> -
> -    if (!cpus_intersects(*mask, cpu_online_map))
> -        return BAD_APICID;
> -
> -    irq = desc->irq;
> -    cfg = &desc->arch;
> -
> -    local_irq_save(flags);
> -    lock_vector_lock();
> -    ret = __assign_irq_vector(irq, cfg, mask);
> -    unlock_vector_lock();
> -    local_irq_restore(flags);
> -
> -    if (ret < 0)
> -        return BAD_APICID;
> -
> -    cpus_copy(desc->affinity, *mask);
> -    cpus_and(dest_mask, *mask, cfg->cpu_mask);
> -
> -    return cpu_mask_to_apicid(&dest_mask);
> -}
> -
>  static void
>  set_ioapic_affinity_irq(struct irq_desc *desc, const cpumask_t *mask)
>  {
> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -598,6 +598,128 @@ void move_native_irq(struct irq_desc *de
>      desc->handler->enable(desc);
>  }
>  
> +fastcall void smp_irq_move_cleanup_interrupt(struct cpu_user_regs *regs)
> +{
> +    unsigned vector, me;
> +    struct cpu_user_regs *old_regs = set_irq_regs(regs);
> +
> +    ack_APIC_irq();
> +    this_cpu(irq_count)++;
> +    irq_enter();
> +
> +    me = smp_processor_id();
> +    for (vector = FIRST_DYNAMIC_VECTOR; vector < NR_VECTORS; vector++) {
> +        unsigned int irq;
> +        unsigned int irr;
> +        struct irq_desc *desc;
> +        irq = __get_cpu_var(vector_irq)[vector];
> +
> +        if (irq == -1)
> +            continue;
> +
> +        desc = irq_to_desc(irq);
> +        if (!desc)
> +            continue;
> +
> +        spin_lock(&desc->lock);
> +        if (!desc->arch.move_cleanup_count)
> +            goto unlock;
> +
> +        if (vector == desc->arch.vector && cpumask_test_cpu(me, &desc->arch.cpu_mask))
> +            goto unlock;
> +
> +        irr = apic_read(APIC_IRR + (vector / 32 * 0x10));
> +        /*
> +         * Check if the vector that needs to be cleanedup is
> +         * registered at the cpu's IRR. If so, then this is not
> +         * the best time to clean it up. Lets clean it up in the
> +         * next attempt by sending another IRQ_MOVE_CLEANUP_VECTOR
> +         * to myself.
> +         */
> +        if (irr  & (1 << (vector % 32))) {
> +            genapic->send_IPI_self(IRQ_MOVE_CLEANUP_VECTOR);
> +            TRACE_3D(TRC_HW_IRQ_MOVE_CLEANUP_DELAY,
> +                     irq, vector, smp_processor_id());
> +            goto unlock;
> +        }
> +
> +        TRACE_3D(TRC_HW_IRQ_MOVE_CLEANUP,
> +                 irq, vector, smp_processor_id());
> +
> +        __get_cpu_var(vector_irq)[vector] = -1;
> +        desc->arch.move_cleanup_count--;
> +
> +        if ( desc->arch.move_cleanup_count == 0 )
> +        {
> +            desc->arch.old_vector = IRQ_VECTOR_UNASSIGNED;
> +            cpumask_clear(&desc->arch.old_cpu_mask);
> +
> +            if ( desc->arch.used_vectors )
> +            {
> +                ASSERT(test_bit(vector, desc->arch.used_vectors));
> +                clear_bit(vector, desc->arch.used_vectors);
> +            }
> +        }
> +unlock:
> +        spin_unlock(&desc->lock);
> +    }
> +
> +    irq_exit();
> +    set_irq_regs(old_regs);
> +}
> +
> +static void send_cleanup_vector(struct irq_desc *desc)
> +{
> +    cpumask_t cleanup_mask;
> +
> +    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);
> +
> +    desc->arch.move_in_progress = 0;
> +}
> +
> +void irq_complete_move(struct irq_desc *desc)
> +{
> +    unsigned vector, me;
> +
> +    if (likely(!desc->arch.move_in_progress))
> +        return;
> +
> +    vector = get_irq_regs()->entry_vector;
> +    me = smp_processor_id();
> +
> +    if (vector == desc->arch.vector && cpumask_test_cpu(me, &desc->arch.cpu_mask))
> +        send_cleanup_vector(desc);
> +}
> +
> +unsigned int set_desc_affinity(struct irq_desc *desc, const cpumask_t *mask)
> +{
> +    unsigned int irq;
> +    int ret;
> +    unsigned long flags;
> +    cpumask_t dest_mask;
> +
> +    if (!cpus_intersects(*mask, cpu_online_map))
> +        return BAD_APICID;
> +
> +    irq = desc->irq;
> +
> +    local_irq_save(flags);
> +    lock_vector_lock();
> +    ret = __assign_irq_vector(irq, &desc->arch, 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);
> +
> +    return cpu_mask_to_apicid(&dest_mask);
> +}
> +
>  /* For re-setting irq interrupt affinity for specific irq */
>  void irq_set_affinity(struct irq_desc *desc, const cpumask_t *mask)
>  {
>
>
>
> _______________________________________________
> 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 Oct 19 02:54:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 02:54:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGSqZ-0003hh-Uo; Wed, 19 Oct 2011 02:54:03 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGSq2-0003V4-2z
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 02:53:30 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319018005!807748!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27656 invoked from network); 19 Oct 2011 09:53:26 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 09:53:26 -0000
Received: by iaen33 with SMTP id n33so2230213iae.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 02:53:25 -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=PgFb+YDmF/XrG0wAdrHhz6F621J8yartuce+aMtQSf8=;
	b=qEJkXcaY1gXoVWaIOpUiCmolH2wH76zM9652ioOguuTVVAfo2VVSZgezLaWwiqh4Lf
	9aBMCk1ffPKDxyxe5iiM14al4ssSEisBDbnk8ZpK7uOTlYny0F4AKN9pcvb9fb8o9oqH
	Pg/dfnaxa5urWTK+Y62bGutBp/RwcqIcj4NHc=
MIME-Version: 1.0
Received: by 10.43.130.133 with SMTP id hm5mr11392055icc.11.1319018005026;
	Wed, 19 Oct 2011 02:53:25 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Wed, 19 Oct 2011 02:53:24 -0700 (PDT)
In-Reply-To: <47fdd52af616131142ac.1318549672@athos.nss.cs.ubc.ca>
References: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
	<47fdd52af616131142ac.1318549672@athos.nss.cs.ubc.ca>
Date: Wed, 19 Oct 2011 10:53:24 +0100
X-Google-Sender-Auth: a4RBnImg26cnZYrZI-3ys1uivNU
Message-ID: <CAFLBxZZdt-zZOOEFCbeWj9hqZZ+-p5wLGqCs6UR7B9cTLjAT_w@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 1 of 3 V3] tools/libxc: Remus Checkpoint
	Compression
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: rshriram@cs.ubc.ca
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: brendan@cs.ubc.ca, 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 Fri, Oct 14, 2011 at 12:47 AM,  <rshriram@cs.ubc.ca> wrote:

> diff -r 4b0907c6a08c -r 47fdd52af616 tools/libxc/xc_domain_save.c
> --- a/tools/libxc/xc_domain_save.c =A0 =A0 =A0Tue Oct 11 12:02:58 2011 +0=
100
> +++ b/tools/libxc/xc_domain_save.c =A0 =A0 =A0Thu Oct 13 15:36:53 2011 -0=
700
> @@ -218,6 +218,56 @@
> =A0 =A0 =A0 =A0 return noncached_write(xch, ob, fd, buf, len);
> =A0}
>
> +static int write_compressed(xc_interface *xch, comp_ctx *compress_ctx,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0int dobuf, struc=
t outbuf* ob, int fd)
> +{
> + =A0 =A0int rc =3D 0;
> + =A0 =A0int header =3D sizeof(int) + sizeof(unsigned long);
> + =A0 =A0int marker =3D XC_SAVE_ID_COMPRESSED_DATA;
> + =A0 =A0unsigned long compbuf_len =3D 0;
> +
> + =A0 =A0do
> + =A0 =A0{
> + =A0 =A0 =A0 =A0/* check for available space (atleast 8k) */
> + =A0 =A0 =A0 =A0if ((ob->pos + header + XC_PAGE_SIZE * 2) > ob->size)
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0if (outbuf_flush(xch, ob, fd) < 0)
> + =A0 =A0 =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ERROR("Error when flushing outbuf interm=
ediate");
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -1;
> + =A0 =A0 =A0 =A0 =A0 =A0}
> + =A0 =A0 =A0 =A0}
> +
> + =A0 =A0 =A0 =A0rc =3D xc_compression_compress_pages(xch, compress_ctx,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 ob->buf + ob->pos + header,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 ob->size - ob->pos - header,
> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
 =A0 =A0 =A0 &compbuf_len);
> + =A0 =A0 =A0 =A0if (!rc)
> + =A0 =A0 =A0 =A0 =A0 =A0return 0;
> +
> + =A0 =A0 =A0 =A0if (outbuf_hardwrite(xch, ob, fd, &marker, sizeof(marker=
)) < 0)
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0PERROR("Error when writing marker (errno %d)", e=
rrno);
> + =A0 =A0 =A0 =A0 =A0 =A0return -1;
> + =A0 =A0 =A0 =A0}
> +
> + =A0 =A0 =A0 =A0if (outbuf_hardwrite(xch, ob, fd, &compbuf_len, sizeof(c=
ompbuf_len)) < 0)
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0PERROR("Error when writing compbuf_len (errno %d=
)", errno);
> + =A0 =A0 =A0 =A0 =A0 =A0return -1;
> + =A0 =A0 =A0 =A0}
> +
> + =A0 =A0 =A0 =A0ob->pos +=3D (size_t) compbuf_len;
> + =A0 =A0 =A0 =A0if (!dobuf && outbuf_flush(xch, ob, fd) < 0)
> + =A0 =A0 =A0 =A0{
> + =A0 =A0 =A0 =A0 =A0 =A0ERROR("Error when writing compressed chunk");
> + =A0 =A0 =A0 =A0 =A0 =A0return -1;
> + =A0 =A0 =A0 =A0}
> + =A0 =A0} while (rc !=3D 0);
> +
> + =A0 =A0return 0;
> +}
> +
> =A0struct time_stats {
> =A0 =A0 struct timeval wall;
> =A0 =A0 long long d0_cpu, d1_cpu;
> @@ -815,11 +865,19 @@
>
> =A0 =A0 unsigned long mfn;
>
> - =A0 =A0struct outbuf ob;
> + =A0 =A0struct outbuf ob_pagebuf, ob_tailbuf, *ob =3D NULL;

I think you need a comment here explaining what each of these are for.

Other than that, looks fine.

 -George

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 03:06:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 03:06:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGT2L-000513-Se; Wed, 19 Oct 2011 03:06:14 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGSzQ-0004mM-Ob
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 03:03:13 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1319018588!809438!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30446 invoked from network); 19 Oct 2011 10:03:09 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 10:03:09 -0000
Received: by iaen33 with SMTP id n33so2241182iae.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 03:03:04 -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=9G7ZkPzgeWlvTQiNdShChxefecmn6E5msli/4hPY+4Y=;
	b=nsiC+C4pyhJpUq+Grs7pEfPI02IH9ab0XGv/MQObSp7njyu31hi+08hYy1x+B7/1v2
	Q1HrGnuW6Yb9CIC4QpiVnYNpk53mkb4YExHyFFn6feWszgnMr/unNA+t+/cTaJfMsZSX
	ekb8KZ+DemInwyVJn6DKIbtrpWRaLQGctwm4M=
MIME-Version: 1.0
Received: by 10.231.4.146 with SMTP id 18mr2571379ibr.84.1319018584391; Wed,
	19 Oct 2011 03:03:04 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Wed, 19 Oct 2011 03:03:04 -0700 (PDT)
In-Reply-To: <37fa1bdbecacd8fefcc3.1318549674@athos.nss.cs.ubc.ca>
References: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
	<37fa1bdbecacd8fefcc3.1318549674@athos.nss.cs.ubc.ca>
Date: Wed, 19 Oct 2011 11:03:04 +0100
X-Google-Sender-Auth: vNfikkE0qH_X6cdRBZX3hNTnVFI
Message-ID: <CAFLBxZZ+5u9An+cKRd0Pu_SUk+0K8x=Xp6Qktv+nCtJgHrQVEg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 3 of 3 V3] tools/libxc: Document checkpoint
	compression in xg_save_restore.h
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: rshriram@cs.ubc.ca
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: brendan@cs.ubc.ca, 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 Fri, Oct 14, 2011 at 12:47 AM,  <rshriram@cs.ubc.ca> wrote:
> # HG changeset patch
> # User Shriram Rajagopalan <rshriram@cs.ubc.ca>
> # Date 1318545418 25200
> # Node ID 37fa1bdbecacd8fefcc382183ad25fd6c76300c3
> # Parent =A032c4d844813aa22ca05df0b855857a607ac4c056
> tools/libxc: Document checkpoint compression in xg_save_restore.h
>
> Add comments to xg_save_restore.h explaining changes in Remus
> wire protocol when checkpoint compression is enabled.

I'd put this in the first patch, but I'll leave that up to the tools mainta=
iner.

 -George

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 03:10:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 03:10:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGT6I-0005R4-Sx; Wed, 19 Oct 2011 03:10:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGT3e-0005CW-NR
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 03:07:38 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319018849!35874175!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12514 invoked from network); 19 Oct 2011 10:07: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;
	19 Oct 2011 10:07:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315195200"; d="scan'208";a="167397936"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 06:07:22 -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; Wed, 19 Oct 2011
	06:07:21 -0400
Message-ID: <4E9EA158.10107@citrix.com>
Date: Wed, 19 Oct 2011 11:07:20 +0100
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] fold struct irq_cfg into struct irq_desc
References: <4E9E8BA1020000780005C13D@nat28.tlf.novell.com>
In-Reply-To: <4E9E8BA1020000780005C13D@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 19/10/11 07:34, Jan Beulich wrote:
> fold struct irq_cfg into struct irq_desc
>
> struct irq_cfg really has become an architecture extension to struct
> irq_desc, and hence it should be treated as such (rather than as IRQ
> chip specific data, which it was meant to be originally).
>
> For a first step, only convert a subset of the uses; subsequent
> patches (partly to be sent later) will aim at fully eliminating the
> use of the old structure type.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>

> --- a/xen/arch/ia64/xen/irq.c
> +++ b/xen/arch/ia64/xen/irq.c
> @@ -79,16 +79,13 @@ irq_desc_t irq_desc[NR_IRQS] = {
>                 .status = IRQ_DISABLED,
>                 .handler = &no_irq_type,
>                 .lock = SPIN_LOCK_UNLOCKED
> +               .arch = {
> +                       .vector = -1,
> +                       .cpu_mask = CPU_MASK_ALL,
> +               }
>         }
>  };
>
> -struct irq_cfg irq_cfg[NR_IRQS] = {
> -    [0 ... NR_IRQS-1] ={
> -        .vector = -1,
> -        .cpu_mask = CPU_MASK_ALL,
> -}
> -};
> -
>  void __do_IRQ_guest(int irq);
>
>  /*
> @@ -238,7 +235,6 @@ int setup_vector(unsigned int vector, st
>         unsigned long flags;
>         struct irqaction *old, **p;
>         irq_desc_t *desc = irq_descp(vector);
> -    struct irq_cfg *cfg = irq_cfg(vector);
>
>         /*
>          * The following block of code has to be executed atomically
> @@ -256,8 +252,7 @@ int setup_vector(unsigned int vector, st
>         desc->status &= ~(IRQ_DISABLED | IRQ_INPROGRESS | IRQ_GUEST);
>         desc->handler->startup(vector);
>         desc->handler->enable(vector);
> -    desc->chip_data = cfg;
> -    cfg->vector = vector;
> +       desc->arch.vector = vector;
>         spin_unlock_irqrestore(&desc->lock,flags);
>
>         return 0;
> @@ -283,13 +278,11 @@ void __init release_irq_vector(unsigned
>  {
>         unsigned long flags;
>         irq_desc_t *desc;
> -    struct irq_cfg *cfg;
>
>         if ( vec == IA64_INVALID_VECTOR )
>                 return;
>
>         desc = irq_descp(vec);
> -    cfg = irq_cfg(vec);
>
>         spin_lock_irqsave(&desc->lock, flags);
>         clear_bit(vec, ia64_xen_vector);
> @@ -297,8 +290,7 @@ void __init release_irq_vector(unsigned
>         desc->depth = 1;
>         desc->status |= IRQ_DISABLED;
>         desc->handler->shutdown(vec);
> -    desc->chip_data = NULL;
> -    cfg->vector = -1;
> +       desc->arch.vector = -1;
>         spin_unlock_irqrestore(&desc->lock, flags);
>
>         while (desc->status & IRQ_INPROGRESS)
> --- a/xen/arch/x86/hpet.c
> +++ b/xen/arch/x86/hpet.c
> @@ -281,7 +281,6 @@ static void hpet_msi_set_affinity(struct
>  {
>      struct msi_msg msg;
>      unsigned int dest;
> -    struct irq_cfg *cfg= desc->chip_data;
>
>      dest = set_desc_affinity(desc, mask);
>      if (dest == BAD_APICID)
> @@ -289,7 +288,7 @@ static void hpet_msi_set_affinity(struct
>
>      hpet_msi_read(desc->action->dev_id, &msg);
>      msg.data &= ~MSI_DATA_VECTOR_MASK;
> -    msg.data |= MSI_DATA_VECTOR(cfg->vector);
> +    msg.data |= MSI_DATA_VECTOR(desc->arch.vector);
>      msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
>      msg.address_lo |= MSI_ADDR_DEST_ID(dest);
>      hpet_msi_write(desc->action->dev_id, &msg);
> --- a/xen/arch/x86/i8259.c
> +++ b/xen/arch/x86/i8259.c
> @@ -395,12 +395,11 @@ void __init init_IRQ(void)
>
>      for (irq = 0; platform_legacy_irq(irq); irq++) {
>          struct irq_desc *desc = irq_to_desc(irq);
> -        struct irq_cfg *cfg = desc->chip_data;
>
>          desc->handler = &i8259A_irq_type;
>          per_cpu(vector_irq, cpu)[FIRST_LEGACY_VECTOR + irq] = irq;
> -        cfg->cpu_mask= cpumask_of_cpu(cpu);
> -        cfg->vector = FIRST_LEGACY_VECTOR + irq;
> +        cpumask_copy(&desc->arch.cpu_mask, cpumask_of(cpu));
> +        desc->arch.vector = FIRST_LEGACY_VECTOR + irq;
>      }
>
>      per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR] = 0;
> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -552,7 +552,7 @@ fastcall void smp_irq_move_cleanup_inter
>          if (!desc)
>              continue;
>
> -        cfg = desc->chip_data;
> +        cfg = &desc->arch;
>          spin_lock(&desc->lock);
>          if (!cfg->move_cleanup_count)
>              goto unlock;
> @@ -613,7 +613,7 @@ static void send_cleanup_vector(struct i
>
>  void irq_complete_move(struct irq_desc *desc)
>  {
> -    struct irq_cfg *cfg = desc->chip_data;
> +    struct irq_cfg *cfg = &desc->arch;
>      unsigned vector, me;
>
>      if (likely(!cfg->move_in_progress))
> @@ -638,7 +638,7 @@ unsigned int set_desc_affinity(struct ir
>          return BAD_APICID;
>
>      irq = desc->irq;
> -    cfg = desc->chip_data;
> +    cfg = &desc->arch;
>
>      local_irq_save(flags);
>      lock_vector_lock();
> @@ -661,11 +661,9 @@ set_ioapic_affinity_irq(struct irq_desc
>      unsigned long flags;
>      unsigned int dest;
>      int pin, irq;
> -    struct irq_cfg *cfg;
>      struct irq_pin_list *entry;
>
>      irq = desc->irq;
> -    cfg = desc->chip_data;
>
>      spin_lock_irqsave(&ioapic_lock, flags);
>      dest = set_desc_affinity(desc, mask);
> @@ -682,7 +680,7 @@ set_ioapic_affinity_irq(struct irq_desc
>              io_apic_write(entry->apic, 0x10 + 1 + pin*2, dest);
>              data = io_apic_read(entry->apic, 0x10 + pin*2);
>              data &= ~IO_APIC_REDIR_VECTOR_MASK;
> -            data |= cfg->vector & 0xFF;
> +            data |= desc->arch.vector & 0xFF;
>              io_apic_modify(entry->apic, 0x10 + pin*2, data);
>
>              if (!entry->next)
> @@ -2448,7 +2446,7 @@ int ioapic_guest_write(unsigned long phy
>          return irq;
>
>      desc = irq_to_desc(irq);
> -    cfg = desc->chip_data;
> +    cfg = &desc->arch;
>
>      /*
>       * Since PHYSDEVOP_alloc_irq_vector is dummy, rte.vector is the pirq
> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -45,8 +45,6 @@ struct irq_desc __read_mostly *irq_desc
>
>  static DECLARE_BITMAP(used_vectors, NR_VECTORS);
>
> -struct irq_cfg __read_mostly *irq_cfg = NULL;
> -
>  static DEFINE_SPINLOCK(vector_lock);
>
>  DEFINE_PER_CPU(vector_irq_t, vector_irq);
> @@ -156,7 +154,7 @@ static inline int find_unassigned_irq(vo
>      int irq;
>
>      for (irq = nr_irqs_gsi; irq < nr_irqs; irq++)
> -        if (irq_cfg[irq].used == IRQ_UNUSED)
> +        if (irq_to_desc(irq)->arch.used == IRQ_UNUSED)
>              return irq;
>      return -ENOSPC;
>  }
> @@ -198,7 +196,7 @@ static void dynamic_irq_cleanup(unsigned
>      desc->action  = NULL;
>      desc->msi_desc = NULL;
>      desc->handler = &no_irq_type;
> -    desc->chip_data->used_vectors=NULL;
> +    desc->arch.used_vectors = NULL;
>      cpus_setall(desc->affinity);
>      spin_unlock_irqrestore(&desc->lock, flags);
>
> @@ -322,26 +320,22 @@ static void __init init_one_irq_cfg(stru
>  int __init init_irq_data(void)
>  {
>      struct irq_desc *desc;
> -    struct irq_cfg *cfg;
>      int irq, vector;
>
>      for (vector = 0; vector < NR_VECTORS; ++vector)
>          this_cpu(vector_irq)[vector] = -1;
>
>      irq_desc = xzalloc_array(struct irq_desc, nr_irqs);
> -    irq_cfg = xzalloc_array(struct irq_cfg, nr_irqs);
>      irq_vector = xzalloc_array(u8, nr_irqs_gsi);
>
> -    if ( !irq_desc || !irq_cfg ||! irq_vector )
> +    if ( !irq_desc || !irq_vector )
>          return -ENOMEM;
>
>      for (irq = 0; irq < nr_irqs; irq++) {
>          desc = irq_to_desc(irq);
> -        cfg = irq_cfg(irq);
>          desc->irq = irq;
> -        desc->chip_data = cfg;
>          init_one_irq_desc(desc);
> -        init_one_irq_cfg(cfg);
> +        init_one_irq_cfg(&desc->arch);
>      }
>
>      /* Never allocate the hypercall vector or Linux/BSD fast-trap vector. */
> @@ -384,7 +378,7 @@ static vmask_t *irq_get_used_vector_mask
>
>          ret = &global_used_vector_map;
>
> -        if ( desc->chip_data->used_vectors )
> +        if ( desc->arch.used_vectors )
>          {
>              printk(XENLOG_INFO "%s: Strange, unassigned irq %d already has used_vectors!\n",
>                     __func__, irq);
> @@ -526,7 +520,7 @@ int assign_irq_vector(int irq)
>  {
>      int ret;
>      unsigned long flags;
> -    struct irq_cfg *cfg = &irq_cfg[irq];
> +    struct irq_cfg *cfg = irq_cfg(irq);
>      struct irq_desc *desc = irq_to_desc(irq);
>
>      BUG_ON(irq >= nr_irqs || irq <0);
> @@ -1736,15 +1730,15 @@ int map_domain_pirq(
>          setup_msi_handler(desc, msi_desc);
>
>          if ( opt_irq_vector_map == OPT_IRQ_VECTOR_MAP_PERDEV
> -             && !desc->chip_data->used_vectors )
> +             && !desc->arch.used_vectors )
>          {
> -            desc->chip_data->used_vectors = &pdev->info.used_vectors;
> -            if ( desc->chip_data->vector != IRQ_VECTOR_UNASSIGNED )
> +            desc->arch.used_vectors = &pdev->info.used_vectors;
> +            if ( desc->arch.vector != IRQ_VECTOR_UNASSIGNED )
>              {
> -                int vector = desc->chip_data->vector;
> -                ASSERT(!test_bit(vector, desc->chip_data->used_vectors));
> +                int vector = desc->arch.vector;
> +                ASSERT(!test_bit(vector, desc->arch.used_vectors));
>
> -                set_bit(vector, desc->chip_data->used_vectors);
> +                set_bit(vector, desc->arch.used_vectors);
>              }
>          }
>
> @@ -1858,7 +1852,6 @@ static void dump_irqs(unsigned char key)
>  {
>      int i, irq, pirq;
>      struct irq_desc *desc;
> -    struct irq_cfg *cfg;
>      irq_guest_action_t *action;
>      struct domain *d;
>      const struct pirq *info;
> @@ -1870,7 +1863,6 @@ static void dump_irqs(unsigned char key)
>      {
>
>          desc = irq_to_desc(irq);
> -        cfg = desc->chip_data;
>
>          if ( !desc->handler || desc->handler == &no_irq_type )
>              continue;
> @@ -1881,7 +1873,7 @@ static void dump_irqs(unsigned char key)
>                            desc->affinity);
>          printk("   IRQ:%4d affinity:%s vec:%02x type=%-15s"
>                 " status=%08x ",
> -               irq, keyhandler_scratch, cfg->vector,
> +               irq, keyhandler_scratch, desc->arch.vector,
>                 desc->handler->typename, desc->status);
>
>          if ( !(desc->status & IRQ_GUEST) )
> --- a/xen/arch/x86/msi.c
> +++ b/xen/arch/x86/msi.c
> @@ -123,16 +123,15 @@ static void msix_put_fixmap(struct pci_d
>  void msi_compose_msg(struct irq_desc *desc, struct msi_msg *msg)
>  {
>      unsigned dest;
> -    struct irq_cfg *cfg = desc->chip_data;
> -    int vector = cfg->vector;
> +    int vector = desc->arch.vector;
>
> -    if ( cpus_empty(cfg->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(&cfg->cpu_mask);
> +        dest = cpu_mask_to_apicid(&desc->arch.cpu_mask);
>
>          msg->address_hi = MSI_ADDR_BASE_HI;
>          msg->address_lo =
> @@ -259,7 +258,6 @@ static void set_msi_affinity(struct irq_
>      struct msi_msg msg;
>      unsigned int dest;
>      struct msi_desc *msi_desc = desc->msi_desc;
> -    struct irq_cfg *cfg = desc->chip_data;
>
>      dest = set_desc_affinity(desc, mask);
>      if (dest == BAD_APICID || !msi_desc)
> @@ -271,7 +269,7 @@ static void set_msi_affinity(struct irq_
>      read_msi_msg(msi_desc, &msg);
>
>      msg.data &= ~MSI_DATA_VECTOR_MASK;
> -    msg.data |= MSI_DATA_VECTOR(cfg->vector);
> +    msg.data |= MSI_DATA_VECTOR(desc->arch.vector);
>      msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
>      msg.address_lo |= MSI_ADDR_DEST_ID(dest);
>      msg.dest32 = dest;
> --- a/xen/arch/x86/smpboot.c
> +++ b/xen/arch/x86/smpboot.c
> @@ -1010,8 +1010,8 @@ void __init smp_intr_init(void)
>              continue;
>          irq_vector[irq] = FIRST_HIPRIORITY_VECTOR + seridx + 1;
>          per_cpu(vector_irq, cpu)[FIRST_HIPRIORITY_VECTOR + seridx + 1] = irq;
> -        irq_cfg[irq].vector = FIRST_HIPRIORITY_VECTOR + seridx + 1;
> -        irq_cfg[irq].cpu_mask = cpu_online_map;
> +        irq_to_desc(irq)->arch.vector = FIRST_HIPRIORITY_VECTOR + seridx + 1;
> +        cpumask_copy(&irq_to_desc(irq)->arch.cpu_mask, &cpu_online_map);
>      }
>
>      /* IPI for cleanuping vectors after irq move */
> --- a/xen/drivers/passthrough/amd/iommu_init.c
> +++ b/xen/drivers/passthrough/amd/iommu_init.c
> @@ -348,7 +348,6 @@ static void iommu_msi_set_affinity(struc
>      struct msi_msg msg;
>      unsigned int dest;
>      struct amd_iommu *iommu = desc->action->dev_id;
> -    struct irq_cfg *cfg = desc->chip_data;
>      u16 seg = iommu->seg;
>      u8 bus = (iommu->bdf >> 8) & 0xff;
>      u8 dev = PCI_SLOT(iommu->bdf & 0xff);
> @@ -363,7 +362,7 @@ static void iommu_msi_set_affinity(struc
>      }
>
>      memset(&msg, 0, sizeof(msg));
> -    msg.data = MSI_DATA_VECTOR(cfg->vector) & 0xff;
> +    msg.data = MSI_DATA_VECTOR(desc->arch.vector) & 0xff;
>      msg.data |= 1 << 14;
>      msg.data |= (INT_DELIVERY_MODE != dest_LowestPrio) ?
>          MSI_DATA_DELIVERY_FIXED:
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -1001,7 +1001,6 @@ static void dma_msi_set_affinity(struct
>      unsigned int dest;
>      unsigned long flags;
>      struct iommu *iommu = desc->action->dev_id;
> -    struct irq_cfg *cfg = desc->chip_data;
>
>  #ifdef CONFIG_X86
>      dest = set_desc_affinity(desc, mask);
> @@ -1011,7 +1010,7 @@ static void dma_msi_set_affinity(struct
>      }
>
>      memset(&msg, 0, sizeof(msg));
> -    msg.data = MSI_DATA_VECTOR(cfg->vector) & 0xff;
> +    msg.data = MSI_DATA_VECTOR(desc->arch.vector) & 0xff;
>      msg.data |= 1 << 14;
>      msg.data |= (INT_DELIVERY_MODE != dest_LowestPrio) ?
>          MSI_DATA_DELIVERY_FIXED:
> @@ -1029,7 +1028,7 @@ static void dma_msi_set_affinity(struct
>      msg.address_lo |= MSI_ADDR_DEST_ID(dest & 0xff);
>  #else
>      memset(&msg, 0, sizeof(msg));
> -    msg.data = cfg->vector & 0xff;
> +    msg.data = desc->arch.vector & 0xff;
>      msg.data |= 1 << 14;
>      msg.address_lo = (MSI_ADDRESS_HEADER << (MSI_ADDRESS_HEADER_SHIFT + 8));
>      msg.address_lo |= MSI_PHYSICAL_MODE << 2;
> --- a/xen/include/asm-ia64/linux-xen/asm/README.origin
> +++ b/xen/include/asm-ia64/linux-xen/asm/README.origin
> @@ -10,6 +10,7 @@ cache.h                       -> linux/include/asm-ia64/cach
>  gcc_intrin.h           -> linux/include/asm-ia64/gcc_intrin.h
>  ia64regs.h             -> linux/include/asm-ia64/ia64regs.h
>  io.h                   -> linux/include/asm-ia64/io.h
> +irq.h                  -> linux/include/asm-ia64/irq.h
>  hw_irq.h               -> linux/include/asm-ia64/hw_irq.h
>  kregs.h                        -> linux/include/asm-ia64/kregs.h
>  mca_asm.h              -> linux/include/asm-ia64/mca_asm.h
> --- /dev/null
> +++ b/xen/include/asm-ia64/linux-xen/asm/irq.h
> @@ -0,0 +1,73 @@
> +#ifndef _ASM_IA64_IRQ_H
> +#define _ASM_IA64_IRQ_H
> +
> +/*
> + * Copyright (C) 1999-2000, 2002 Hewlett-Packard Co
> + *     David Mosberger-Tang <davidm@hpl.hp.com>
> + *     Stephane Eranian <eranian@hpl.hp.com>
> + *
> + * 11/24/98    S.Eranian       updated TIMER_IRQ and irq_canonicalize
> + * 01/20/99    S.Eranian       added keyboard interrupt
> + * 02/29/00     D.Mosberger    moved most things into hw_irq.h
> + */
> +
> +#define NR_VECTORS     256
> +#define NR_IRQS                256
> +
> +#ifdef XEN
> +struct irq_cfg {
> +#define arch_irq_desc irq_cfg
> +        int  vector;
> +        cpumask_t cpu_mask;
> +};
> +#endif
> +
> +static __inline__ int
> +irq_canonicalize (int irq)
> +{
> +       /*
> +        * We do the legacy thing here of pretending that irqs < 16
> +        * are 8259 irqs.  This really shouldn't be necessary at all,
> +        * but we keep it here as serial.c still uses it...
> +        */
> +       return ((irq == 2) ? 9 : irq);
> +}
> +
> +extern void disable_irq (unsigned int);
> +extern void disable_irq_nosync (unsigned int);
> +extern void enable_irq (unsigned int);
> +extern void set_irq_affinity_info (unsigned int irq, int dest, int redir);
> +
> +#ifdef CONFIG_SMP
> +extern void move_irq(int irq);
> +#else
> +#define move_irq(irq)
> +#endif
> +
> +struct irqaction;
> +struct pt_regs;
> +int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
> +
> +extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs);
> +
> +#ifdef XEN
> +static inline unsigned int irq_to_vector(int);
> +extern int setup_irq_vector(unsigned int, struct irqaction *);
> +extern void release_irq_vector(unsigned int);
> +extern int request_irq_vector(unsigned int vector,
> +               void (*handler)(int, void *, struct cpu_user_regs *),
> +               unsigned long irqflags, const char * devname, void *dev_id);
> +
> +#define create_irq(x) assign_irq_vector(AUTO_ASSIGN_IRQ)
> +#define destroy_irq(x) free_irq_vector(x)
> +
> +#define irq_cfg(x)        (&irq_desc[x].arch)
> +#define irq_to_desc(x)    (&irq_desc[x]
> +
> +#define irq_complete_move(x) do {} \
> +    while(!x)
> +
> +#define domain_pirq_to_irq(d, irq) domain_irq_to_vector(d, irq)
> +#endif
> +
> +#endif /* _ASM_IA64_IRQ_H */
> --- a/xen/include/asm-ia64/linux/asm/README.origin
> +++ b/xen/include/asm-ia64/linux/asm/README.origin
> @@ -19,7 +19,6 @@ fpu.h                 -> linux/include/asm-ia64/fpu.h
>  hdreg.h                        -> linux/include/asm-ia64/hdreg.h
>  intrinsics.h           -> linux/include/asm-ia64/intrinsics.h
>  ioctl.h                        -> linux/include/asm-ia64/ioctl.h
> -irq.h                  -> linux/include/asm-ia64/irq.h
>  linkage.h              -> linux/include/asm-ia64/linkage.h
>  machvec_hpsim.h                -> linux/include/asm-ia64/machvec_hpsim.h
>  mca.h                  -> linux/include/asm-ia64/mca.h
> --- a/xen/include/asm-ia64/linux/asm/irq.h
> +++ /dev/null
> @@ -1,45 +0,0 @@
> -#ifndef _ASM_IA64_IRQ_H
> -#define _ASM_IA64_IRQ_H
> -
> -/*
> - * Copyright (C) 1999-2000, 2002 Hewlett-Packard Co
> - *     David Mosberger-Tang <davidm@hpl.hp.com>
> - *     Stephane Eranian <eranian@hpl.hp.com>
> - *
> - * 11/24/98    S.Eranian       updated TIMER_IRQ and irq_canonicalize
> - * 01/20/99    S.Eranian       added keyboard interrupt
> - * 02/29/00     D.Mosberger    moved most things into hw_irq.h
> - */
> -
> -#define NR_VECTORS     256
> -#define NR_IRQS                256
> -
> -static __inline__ int
> -irq_canonicalize (int irq)
> -{
> -       /*
> -        * We do the legacy thing here of pretending that irqs < 16
> -        * are 8259 irqs.  This really shouldn't be necessary at all,
> -        * but we keep it here as serial.c still uses it...
> -        */
> -       return ((irq == 2) ? 9 : irq);
> -}
> -
> -extern void disable_irq (unsigned int);
> -extern void disable_irq_nosync (unsigned int);
> -extern void enable_irq (unsigned int);
> -extern void set_irq_affinity_info (unsigned int irq, int dest, int redir);
> -
> -#ifdef CONFIG_SMP
> -extern void move_irq(int irq);
> -#else
> -#define move_irq(irq)
> -#endif
> -
> -struct irqaction;
> -struct pt_regs;
> -int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *);
> -
> -extern fastcall unsigned int __do_IRQ(unsigned int irq, struct pt_regs *regs);
> -
> -#endif /* _ASM_IA64_IRQ_H */
> --- a/xen/include/asm-x86/irq.h
> +++ b/xen/include/asm-x86/irq.h
> @@ -21,7 +21,7 @@
>  #define LEGACY_VECTOR(irq)          ((irq) + FIRST_LEGACY_VECTOR)
>
>  #define irq_to_desc(irq)    (&irq_desc[irq])
> -#define irq_cfg(irq)        (&irq_cfg[irq])
> +#define irq_cfg(irq)        (&irq_desc[irq].arch)
>
>  typedef struct {
>      DECLARE_BITMAP(_bits,NR_VECTORS);
> @@ -30,6 +30,7 @@ typedef struct {
>  struct irq_desc;
>
>  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;
> @@ -46,8 +47,6 @@ struct irq_cfg {
>
>  #define IRQ_VECTOR_UNASSIGNED (-1)
>
> -extern struct irq_cfg *irq_cfg;
> -
>  typedef int vector_irq_t[NR_VECTORS];
>  DECLARE_PER_CPU(vector_irq_t, vector_irq);
>
> --- a/xen/include/xen/irq.h
> +++ b/xen/include/xen/irq.h
> @@ -63,7 +63,6 @@ extern unsigned int nr_irqs;
>  #endif
>
>  struct msi_desc;
> -struct irq_cfg;
>  /*
>   * This is the "IRQ descriptor", which contains various information
>   * about the irq, including what kind of hardware handling it has,
> @@ -74,9 +73,9 @@ typedef struct irq_desc {
>      hw_irq_controller *handler;
>      struct msi_desc   *msi_desc;
>      struct irqaction *action;  /* IRQ action list */
> -    struct irq_cfg *chip_data;
>      int irq;
>      spinlock_t lock;
> +    struct arch_irq_desc arch;
>      cpumask_t affinity;
>      cpumask_t pending_mask;  /* IRQ migration pending mask */
>
> @@ -97,32 +96,6 @@ extern irq_desc_t irq_desc[NR_VECTORS];
>
>  #define request_irq(irq, handler, irqflags, devname, devid) \
>      request_irq_vector(irq_to_vector(irq), handler, irqflags, devname, devid)
> -
> -static inline unsigned int irq_to_vector(int);
> -extern int setup_irq_vector(unsigned int, struct irqaction *);
> -extern void release_irq_vector(unsigned int);
> -extern int request_irq_vector(unsigned int vector,
> -               void (*handler)(int, void *, struct cpu_user_regs *),
> -               unsigned long irqflags, const char * devname, void *dev_id);
> -
> -#define create_irq(x) assign_irq_vector(AUTO_ASSIGN_IRQ)
> -#define destroy_irq(x) free_irq_vector(x)
> -
> -#define irq_cfg(x)        &irq_cfg[(x)]
> -#define irq_to_desc(x)    &irq_desc[(x)]
> -
> -#define irq_complete_move(x) do {} \
> -    while(!x)
> -
> -#define domain_pirq_to_irq(d, irq) domain_irq_to_vector(d, irq)
> -
> -struct irq_cfg {
> -        int  vector;
> -        cpumask_t cpu_mask;
> -};
> -
> -extern struct irq_cfg irq_cfg[];
> -
>  #else
>  extern int setup_irq(unsigned int irq, struct irqaction *);
>  extern void release_irq(unsigned int irq);
>
>
>
> _______________________________________________
> 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 Oct 19 03:24:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 03:24:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGTJg-0006lv-HB; Wed, 19 Oct 2011 03:24:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGTIc-0006YJ-7R
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 03:23:02 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319019777!776575!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7110 invoked from network); 19 Oct 2011 10:22:58 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 10:22:58 -0000
Received: by pzk32 with SMTP id 32so4339782pzk.8
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 03:22: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
	:content-transfer-encoding;
	bh=k1V0r8EjSif+/fk6nQ51BSNsdDEdhrvaGvhJlHI08+k=;
	b=h24hdMFli5IxgnYOOgyc5il5/lBts9n2+1GFB2VRGeEOlo6YQRTAMD+bMExb7shQsj
	7G3x7y1fkT1d0ZiZusqVu659CyFYWH1cnS13hp6dWcdpD2JBdvMhSTl/I/FsSe/py4ef
	LXVzIOsSkBKAGLzXNVoCMdaYKMPRadXYONWUM=
MIME-Version: 1.0
Received: by 10.68.36.131 with SMTP id q3mr4070084pbj.3.1319019776682; Wed, 19
	Oct 2011 03:22:56 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Wed, 19 Oct 2011 03:22:56 -0700 (PDT)
In-Reply-To: <4020531a53fcb1a5579d.1318942513@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
	<4020531a53fcb1a5579d.1318942513@cosworth.uk.xensource.com>
Date: Wed, 19 Oct 2011 12:22:56 +0200
X-Google-Sender-Auth: bNKTRNWWvieSW9oKS0ojRcYEnmM
Message-ID: <CAPLaKK7+ZdHWvp_92bCjqUzOTYU=_4JH20iYvToXihbH6MoDUA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 18 of 27 v3] libxl: merge libxl__device_del
	into libxl__device_remove
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
Content-Transfer-Encoding: quoted-printable
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

2011/10/18 Ian Campbell <ian.campbell@citrix.com>:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1318941402 -3600
> # Node ID 4020531a53fcb1a5579de3225b99a29a7619c7df
> # Parent =C2=A05547b8593511cb37b830f6ec73f480e607f639c2
> libxl: merge libxl__device_del into libxl__device_remove
>
> Note that the "wait" parameter added to libxl_device_remove is different =
to the
> wait paramter previously used by similar functions. In the past not-wait =
meant
> forced whereas now in means wait for a graceful shutdown, as opposed to s=
etting
> off a graceful shutdown but not waiting.
>
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
>
> diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl.c
> --- a/tools/libxl/libxl.c =C2=A0 =C2=A0 =C2=A0 Tue Oct 18 13:36:42 2011 +=
0100
> +++ b/tools/libxl/libxl.c =C2=A0 =C2=A0 =C2=A0 Tue Oct 18 13:36:42 2011 +=
0100
> @@ -1075,7 +1075,7 @@ int libxl_device_disk_del(libxl_ctx *ctx
> =C2=A0 =C2=A0 device.devid =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D d=
evid;
> =C2=A0 =C2=A0 device.kind =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D L=
IBXL__DEVICE_KIND_VBD;
> =C2=A0 =C2=A0 if (wait)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D libxl__device_del(&gc, &device);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D libxl__device_remove(&gc, &device, wa=
it);
> =C2=A0 =C2=A0 else
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 rc =3D libxl__device_destroy(&gc, &device);
> =C2=A0out_free:
> @@ -1290,7 +1290,7 @@ int libxl_device_nic_del(libxl_ctx *ctx,
> =C2=A0 =C2=A0 device.kind =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =3D L=
IBXL__DEVICE_KIND_VIF;
>
> =C2=A0 =C2=A0 if (wait)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D libxl__device_del(&gc, &device);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D libxl__device_remove(&gc, &device, wa=
it);
> =C2=A0 =C2=A0 else
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 rc =3D libxl__device_destroy(&gc, &device);
>
> diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl_device.c
> --- a/tools/libxl/libxl_device.c =C2=A0 =C2=A0 =C2=A0 =C2=A0Tue Oct 18 13=
:36:42 2011 +0100
> +++ b/tools/libxl/libxl_device.c =C2=A0 =C2=A0 =C2=A0 =C2=A0Tue Oct 18 13=
:36:42 2011 +0100
> @@ -367,57 +367,6 @@ int libxl__device_disk_dev_number(const
> =C2=A0 =C2=A0 return -1;
> =C2=A0}
>
> -int libxl__device_remove(libxl__gc *gc, libxl__device *dev)
> -{
> - =C2=A0 =C2=A0libxl_ctx *ctx =3D libxl__gc_owner(gc);
> - =C2=A0 =C2=A0xs_transaction_t t;
> - =C2=A0 =C2=A0char *be_path =3D libxl__device_backend_path(gc, dev);
> - =C2=A0 =C2=A0char *state_path =3D libxl__sprintf(gc, "%s/state", be_pat=
h);
> - =C2=A0 =C2=A0char *state =3D libxl__xs_read(gc, XBT_NULL, state_path);
> - =C2=A0 =C2=A0int rc =3D 0;
> -
> - =C2=A0 =C2=A0if (!state)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> - =C2=A0 =C2=A0if (atoi(state) !=3D 4) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, be_path);
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> - =C2=A0 =C2=A0}
> -
> -retry_transaction:
> - =C2=A0 =C2=A0t =3D xs_transaction_start(ctx->xsh);
> - =C2=A0 =C2=A0xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_p=
ath), "0", strlen("0"));
> - =C2=A0 =C2=A0xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
> - =C2=A0 =C2=A0if (!xs_transaction_end(ctx->xsh, t, 0)) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0if (errno =3D=3D EAGAIN)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto retry_transaction;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0else {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D -1;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> - =C2=A0 =C2=A0}
> -
> - =C2=A0 =C2=A0xs_watch(ctx->xsh, state_path, be_path);
> - =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> - =C2=A0 =C2=A0rc =3D 1;
> -out:
> - =C2=A0 =C2=A0return rc;
> -}
> -
> -int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
> -{
> - =C2=A0 =C2=A0libxl_ctx *ctx =3D libxl__gc_owner(gc);
> - =C2=A0 =C2=A0char *be_path =3D libxl__device_backend_path(gc, dev);
> - =C2=A0 =C2=A0char *fe_path =3D libxl__device_frontend_path(gc, dev);
> -
> - =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, be_path);
> - =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, fe_path);
> -
> - =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> -
> - =C2=A0 =C2=A0return 0;
> -}
> -
> =C2=A0static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
> =C2=A0{
> =C2=A0 =C2=A0 libxl_ctx *ctx =3D libxl__gc_owner(gc);
> @@ -446,6 +395,71 @@ static int wait_for_dev_destroy(libxl__g
> =C2=A0 =C2=A0 return rc;
> =C2=A0}
>
> +/*
> + * Returns 0 (device already destroyed) or 1 (caller must
> + * wait_for_dev_destroy) on success, ERROR_* on fail.
> + */
> +int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait)
> +{
> + =C2=A0 =C2=A0libxl_ctx *ctx =3D libxl__gc_owner(gc);
> + =C2=A0 =C2=A0xs_transaction_t t;
> + =C2=A0 =C2=A0char *be_path =3D libxl__device_backend_path(gc, dev);
> + =C2=A0 =C2=A0char *state_path =3D libxl__sprintf(gc, "%s/state", be_pat=
h);
> + =C2=A0 =C2=A0char *state =3D libxl__xs_read(gc, XBT_NULL, state_path);
> + =C2=A0 =C2=A0int rc =3D 0;
> +
> + =C2=A0 =C2=A0if (!state)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> + =C2=A0 =C2=A0if (atoi(state) !=3D 4) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, be_path);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> + =C2=A0 =C2=A0}
> +
> +retry_transaction:
> + =C2=A0 =C2=A0t =3D xs_transaction_start(ctx->xsh);
> + =C2=A0 =C2=A0xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_p=
ath), "0", strlen("0"));
> + =C2=A0 =C2=A0xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
> + =C2=A0 =C2=A0if (!xs_transaction_end(ctx->xsh, t, 0)) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (errno =3D=3D EAGAIN)
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto retry_transaction;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0else {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D ERROR_FAIL;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
> + =C2=A0 =C2=A0}
> +
> + =C2=A0 =C2=A0xs_watch(ctx->xsh, state_path, be_path);
> + =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> +
> + =C2=A0 =C2=A0if (wait) {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0struct timeval tv;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0tv.tv_sec =3D LIBXL_DESTROY_TIMEOUT;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0tv.tv_usec =3D 0;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0(void)wait_for_dev_destroy(gc, &tv);

I think we should check the return value of wait_for_dev_destroy here,
since it might timeout, and the device is not removed then, so
libxl__device_remove should return 1 in that case (whereas it always
returns 0 now in that case, even when the device is still being
watched).

> + =C2=A0 =C2=A0 =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, libxl__device_fron=
tend_path(gc, dev));
> + =C2=A0 =C2=A0} else {
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D 1; /* Caller must wait_for_dev_destro=
y */
> + =C2=A0 =C2=A0}
> +
> +out:
> + =C2=A0 =C2=A0return rc;
> +}
> +
> +int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
> +{
> + =C2=A0 =C2=A0libxl_ctx *ctx =3D libxl__gc_owner(gc);
> + =C2=A0 =C2=A0char *be_path =3D libxl__device_backend_path(gc, dev);
> + =C2=A0 =C2=A0char *fe_path =3D libxl__device_frontend_path(gc, dev);
> +
> + =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, be_path);
> + =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, fe_path);
> +
> + =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
> +
> + =C2=A0 =C2=A0return 0;
> +}
> +
> =C2=A0int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force=
)
> =C2=A0{
> =C2=A0 =C2=A0 libxl_ctx *ctx =3D libxl__gc_owner(gc);
> @@ -485,8 +499,12 @@ int libxl__devices_destroy(libxl__gc *gc
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (force) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 lib=
xl__device_destroy(gc, &dev);
> =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 =C2=A0 =C2=A0 =C2=A0 =C2=A0if=
 (libxl__device_remove(gc, &dev) > 0)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0n_watches++;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0in=
t rc =3D libxl__device_remove(gc, &dev, 0);
> + =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=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "cannot remove device %s\n=
", path);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0el=
se
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0n_watches +=3D 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 }
> @@ -504,8 +522,12 @@ int libxl__devices_destroy(libxl__gc *gc
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (force) {
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 libxl__device_destroy(gc, &dev)=
;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (libxl__device_remove(gc, &=
dev) > 0)
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0n_watches++;
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0int rc =3D libxl__device_remov=
e(gc, &dev, 0);
> + =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=A0LIBXL__LOG(ctx, =
LIBXL__LOG_ERROR,
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 "cannot remove device %s\n", path);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0else
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0n_watches +=3D r=
c;
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> =C2=A0 =C2=A0 }
>
> @@ -530,29 +552,6 @@ out:
> =C2=A0 =C2=A0 return 0;
> =C2=A0}
>
> -int libxl__device_del(libxl__gc *gc, libxl__device *dev)
> -{
> - =C2=A0 =C2=A0libxl_ctx *ctx =3D libxl__gc_owner(gc);
> - =C2=A0 =C2=A0struct timeval tv;
> - =C2=A0 =C2=A0int rc;
> -
> - =C2=A0 =C2=A0rc =3D libxl__device_remove(gc, dev);
> - =C2=A0 =C2=A0if (rc =3D=3D -1) {
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D ERROR_FAIL;
> - =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
> - =C2=A0 =C2=A0}
> -
> - =C2=A0 =C2=A0tv.tv_sec =3D LIBXL_DESTROY_TIMEOUT;
> - =C2=A0 =C2=A0tv.tv_usec =3D 0;
> - =C2=A0 =C2=A0(void)wait_for_dev_destroy(gc, &tv);
> -
> - =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, =
dev));
> - =C2=A0 =C2=A0rc =3D 0;
> -
> -out:
> - =C2=A0 =C2=A0return rc;
> -}
> -
> =C2=A0int libxl__wait_for_device_model(libxl__gc *gc,
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=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 domid, char *state,
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__spawn_starting *spawnin=
g,
> diff -r 5547b8593511 -r 4020531a53fc tools/libxl/libxl_internal.h
> --- a/tools/libxl/libxl_internal.h =C2=A0 =C2=A0 =C2=A0Tue Oct 18 13:36:4=
2 2011 +0100
> +++ b/tools/libxl/libxl_internal.h =C2=A0 =C2=A0 =C2=A0Tue Oct 18 13:36:4=
2 2011 +0100
> @@ -242,8 +242,7 @@ _hidden char *libxl__device_backend_path
> =C2=A0_hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__dev=
ice *device);
> =C2=A0_hidden int libxl__parse_backend_path(libxl__gc *gc, const char *pa=
th,
> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 libxl__device *=
dev);
> -_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
> -_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev);
> +_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int =
wait);
> =C2=A0_hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev=
);
> =C2=A0_hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, i=
nt force);
> =C2=A0_hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, c=
har *state);
>
> _______________________________________________
> 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 Oct 19 03:34:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 03:34:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGTU4-0007J4-PG; Wed, 19 Oct 2011 03:34:52 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGTTY-00077P-NH
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 03:34:21 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319020457!219682!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31910 invoked from network); 19 Oct 2011 10:34:17 -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;
	19 Oct 2011 10:34:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8466193"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 10:34: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, 19 Oct 2011 11:34:17 +0100
Subject: Re: [Xen-devel] [PATCH v4] libxl: reimplement buffer for
	bootloading and drop data if buffer is full
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 19 Oct 2011 11:34:16 +0100
In-Reply-To: <CAPLaKK5pMXVtBNUKWwgyvp-MPUWmm9f1FKxC9C2Ubn=ae3zP+A@mail.gmail.com>
References: <f7b311b85973f5862c32.1318945118@loki>
	<1318946288.3385.18.camel@zakaz.uk.xensource.com>
	<CAPLaKK5pMXVtBNUKWwgyvp-MPUWmm9f1FKxC9C2Ubn=ae3zP+A@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1319020457.3385.95.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 Wed, 2011-10-19 at 08:42 +0100, Roger Pau MonnÃ© wrote:

> >>          if (xenconsoled_prod == xenconsoled_cons)
> >>              xenconsoled_prod = xenconsoled_cons = 0;
> >>          if (bootloader_prod == bootloader_cons)
> >>              bootloader_prod = bootloader_cons = 0;
> 
> Now that I also look at it, I think this "ifs" could be removed, the
> following checks for cons > 0 will perform the same task if cons ==
> prod, and the code will look cleaner.

I think you are correct.

> >>          /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
> >> -        if (FD_ISSET(xenconsoled_fd, &rsel)) {
> >> +        if (ret == 0 && xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
> >> +            /* Drop the buffer */
> >> +            xenconsoled_prod = 0;
> >
> > Do you also need to reset cons here? I expect we could prove it was
> > always zero anyway but it might be more obvious to just reset it.
> 
> It is always 0 because we check "cons > 0" at the start of the loop,
> and set it to 0 if it is bigger. If you feel it's best to set it to
> zero here to make the code easier to understand it's fine for me.

So I guess it is more "documentation" than useful code. I think zeroing
cons would be harmless and make the code more obvious.

> > Otherwise this looks good, thanks.
> 
> Thanks to you and Ian Jackson for reviewing the code and having so
> much patience.

No problem.

Ian.

> 
> >> +        } else if (FD_ISSET(xenconsoled_fd, &rsel)) {
> >>              ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled_prod);
> >>              if (ret < 0 && errno != EIO && errno != EAGAIN)
> >>                  goto out_err;
> >> @@ -229,7 +258,10 @@ static char * bootloader_interact(libxl_
> >>          }
> >>
> >>          /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
> >> -        if (FD_ISSET(bootloader_fd, &rsel)) {
> >> +        if (ret == 0 && bootloader_prod == BOOTLOADER_BUF_SIZE) {
> >> +            /* Drop the buffer */
> >> +            bootloader_prod = 0;
> >> +        } else if (FD_ISSET(bootloader_fd, &rsel)) {
> >>              ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod);
> >>              if (ret < 0 && errno != EIO && errno != EAGAIN)
> >>                  goto out_err;
> >>
> >> _______________________________________________
> >> 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 Oct 19 03:36:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 03:36:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGTVr-0007hh-Uf; Wed, 19 Oct 2011 03:36:43 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGTVG-0007Vn-9Z
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 03:36:06 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1319020448!40983691!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30583 invoked from network); 19 Oct 2011 10:34:09 -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;
	19 Oct 2011 10:34:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8466254"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 10:36: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, 19 Oct 2011 11:36:03 +0100
Subject: Re: [Xen-devel] [PATCH 18 of 27 v3] libxl: merge libxl__device_del
	into libxl__device_remove
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 19 Oct 2011 11:36:02 +0100
In-Reply-To: <CAPLaKK7+ZdHWvp_92bCjqUzOTYU=_4JH20iYvToXihbH6MoDUA@mail.gmail.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
	<4020531a53fcb1a5579d.1318942513@cosworth.uk.xensource.com>
	<CAPLaKK7+ZdHWvp_92bCjqUzOTYU=_4JH20iYvToXihbH6MoDUA@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1319020562.3385.96.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 Wed, 2011-10-19 at 11:22 +0100, Roger Pau MonnÃ© wrote:
> > +    xs_watch(ctx->xsh, state_path, be_path);
> > +    libxl__device_destroy_tapdisk(gc, be_path);
> > +
> > +    if (wait) {
> > +        struct timeval tv;
> > +        tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
> > +        tv.tv_usec = 0;
> > +        (void)wait_for_dev_destroy(gc, &tv);
> 
> I think we should check the return value of wait_for_dev_destroy here,
> since it might timeout, and the device is not removed then, so
> libxl__device_remove should return 1 in that case (whereas it always
> returns 0 now in that case, even when the device is still being
> watched). 

Sure, didn't you post such a patch recently?

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 03:40:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 03:40:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGTZA-00087c-Fl; Wed, 19 Oct 2011 03:40:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGTYV-0007uz-UR
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 03:39:28 -0700
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1319020763!813150!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13381 invoked from network); 19 Oct 2011 10:39:24 -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;
	19 Oct 2011 10:39:24 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315195200"; d="scan'208";a="18346599"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 06:39:23 -0400
Received: from [10.80.2.76] (10.80.2.76) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Wed, 19 Oct 2011
	06:39:23 -0400
Message-ID: <4E9EA8D9.5060708@citrix.com>
Date: Wed, 19 Oct 2011 11:39:21 +0100
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: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for
	comms
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>	
	<1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319015064.3385.80.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319015064.3385.80.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	"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 19/10/11 10:04, Ian Campbell wrote:
> On Tue, 2011-10-18 at 21:26 +0100, Daniel De Graaf wrote:
>> For proper grant mappings, HVM guests require pages allocated using
>> alloc_xenballooned_pages instead of alloc_vm_area.
>>
>> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
>> ---
>>  drivers/net/xen-netback/common.h  |    4 ++--
>>  drivers/net/xen-netback/netback.c |   34 ++++++++++++++++++++--------------
>>  2 files changed, 22 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
>> index 161f207..d5ee9d1 100644
>> --- a/drivers/net/xen-netback/common.h
>> +++ b/drivers/net/xen-netback/common.h
>> @@ -70,8 +70,8 @@ struct xenvif {
>>  	/* The shared rings and indexes. */
>>  	struct xen_netif_tx_back_ring tx;
>>  	struct xen_netif_rx_back_ring rx;
>> -	struct vm_struct *tx_comms_area;
>> -	struct vm_struct *rx_comms_area;
>> +	struct page *tx_comms_page;
>> +	struct page *rx_comms_page;
> 
> This will conflict with David Vrabel's patch "net: xen-netback: use API
> provided by xenbus module to map rings", which I've just noticed hasn't
> been committed anywhere.
> 
> I suspect that building on David's patches (that series does something
> similar to blkback too) will greatly simplify this one since you can
> just patch xenbus_map_ring_valloc and friends.
> 
> Could you also explain where the requirement to use xenballooned pages
> and not alloc_vm_area comes from in your commit message.
> 
> David, I guess you should resend your series now that everyone is happy
> with it. If you cc the netback one to netdev@ with my Ack then Dave
> Miller will pick it up into his tree (it stands alone, right?). The
> blkback and grant-table ones go via Konrad I think. I suspect the last
> one needs to go via akpm, or at least with his Ack.

I thought Konrad had picked them all up -- they were on his stuff queued
for 3.2 list.

> 
>>  
>>  	/* Frontend feature information. */
>>  	u8 can_sg:1;
>> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
>> index fd00f25..f35e07c 100644
>> --- a/drivers/net/xen-netback/netback.c
>> +++ b/drivers/net/xen-netback/netback.c
>> @@ -42,6 +42,7 @@
>>  
>>  #include <xen/events.h>
>>  #include <xen/interface/memory.h>
>> +#include <xen/balloon.h>
>>  
>>  #include <asm/xen/hypercall.h>
>>  #include <asm/xen/page.h>
>> @@ -1578,9 +1579,11 @@ static int xen_netbk_kthread(void *data)
>>  void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
>>  {
>>  	struct gnttab_unmap_grant_ref op;
>> +	void *addr;
>>  
>>  	if (vif->tx.sring) {
>> -		gnttab_set_unmap_op(&op, (unsigned long)vif->tx_comms_area->addr,
>> +		addr = pfn_to_kaddr(page_to_pfn(vif->tx_comms_page));
>> +		gnttab_set_unmap_op(&op, (unsigned long)addr,
>>  				    GNTMAP_host_map, vif->tx_shmem_handle);
>>  
>>  		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
>> @@ -1588,16 +1591,17 @@ void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
>>  	}
>>  
>>  	if (vif->rx.sring) {
>> -		gnttab_set_unmap_op(&op, (unsigned long)vif->rx_comms_area->addr,
>> +		addr = pfn_to_kaddr(page_to_pfn(vif->rx_comms_page));
>> +		gnttab_set_unmap_op(&op, (unsigned long)addr,
>>  				    GNTMAP_host_map, vif->rx_shmem_handle);
>>  
>>  		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
>>  			BUG();
>>  	}
>> -	if (vif->rx_comms_area)
>> -		free_vm_area(vif->rx_comms_area);
>> -	if (vif->tx_comms_area)
>> -		free_vm_area(vif->tx_comms_area);
>> +	if (vif->rx_comms_page)
>> +		free_xenballooned_pages(1, &vif->rx_comms_page);
>> +	if (vif->tx_comms_page)
>> +		free_xenballooned_pages(1, &vif->tx_comms_page);
>>  }
>>  
>>  int xen_netbk_map_frontend_rings(struct xenvif *vif,
>> @@ -1610,15 +1614,19 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>>  
>>  	int err = -ENOMEM;
>>  
>> -	vif->tx_comms_area = alloc_vm_area(PAGE_SIZE);
>> -	if (vif->tx_comms_area == NULL)
>> +	if (alloc_xenballooned_pages(1, &vif->tx_comms_page))
>>  		goto err;
>>  
>> -	vif->rx_comms_area = alloc_vm_area(PAGE_SIZE);
>> -	if (vif->rx_comms_area == NULL)
>> +	txs = (struct xen_netif_tx_sring *)pfn_to_kaddr(page_to_pfn(
>> +			vif->tx_comms_page));
>> +
>> +	if (alloc_xenballooned_pages(1, &vif->rx_comms_page))
>>  		goto err;
>>  
>> -	gnttab_set_map_op(&op, (unsigned long)vif->tx_comms_area->addr,
>> +	rxs = (struct xen_netif_rx_sring *)pfn_to_kaddr(page_to_pfn(
>> +			vif->rx_comms_page));
>> +
>> +	gnttab_set_map_op(&op, (unsigned long)txs,
>>  			  GNTMAP_host_map, tx_ring_ref, vif->domid);
>>  
>>  	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> @@ -1635,10 +1643,9 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>>  	vif->tx_shmem_ref    = tx_ring_ref;
>>  	vif->tx_shmem_handle = op.handle;
>>  
>> -	txs = (struct xen_netif_tx_sring *)vif->tx_comms_area->addr;
>>  	BACK_RING_INIT(&vif->tx, txs, PAGE_SIZE);
>>  
>> -	gnttab_set_map_op(&op, (unsigned long)vif->rx_comms_area->addr,
>> +	gnttab_set_map_op(&op, (unsigned long)rxs,
>>  			  GNTMAP_host_map, rx_ring_ref, vif->domid);
>>  
>>  	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> @@ -1656,7 +1663,6 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>>  	vif->rx_shmem_handle  = op.handle;
>>  	vif->rx_req_cons_peek = 0;
>>  
>> -	rxs = (struct xen_netif_rx_sring *)vif->rx_comms_area->addr;
>>  	BACK_RING_INIT(&vif->rx, rxs, PAGE_SIZE);
>>  
>>  	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 Oct 19 03:42:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 03:42:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGTbV-0000BP-Bv; Wed, 19 Oct 2011 03:42:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGTb3-0008RP-LJ
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 03:42:05 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319020901!48896179!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4204 invoked from network); 19 Oct 2011 10:41:42 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 10:41:42 -0000
Received: by qyg36 with SMTP id 36so1575702qyg.9
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 03:42: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
	:content-transfer-encoding;
	bh=DQwE6D2zeO3Zpt6x4yq3rSFOgmTPx9RdZtff8mCQiM4=;
	b=ic5MXakmLLEfQiwQWveEZYXuDYR2cMMOKkbxY/6bPzjCvhePh0ZsvjDvQ+FQIPvM2q
	R7jGGMCV1ODF1l7OCcfuiRs3wXovtD6uvB7iThAqvys+sGQoDD1wr+BR7ZUZmA+CVqXL
	DQGm9cKPyNGbvysXhrNq1Pr4D4rCsiA70qa94=
MIME-Version: 1.0
Received: by 10.68.38.132 with SMTP id g4mr8484588pbk.122.1319020921037; Wed,
	19 Oct 2011 03:42:01 -0700 (PDT)
Received: by 10.142.133.20 with HTTP; Wed, 19 Oct 2011 03:42:00 -0700 (PDT)
In-Reply-To: <1319020562.3385.96.camel@zakaz.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
	<4020531a53fcb1a5579d.1318942513@cosworth.uk.xensource.com>
	<CAPLaKK7+ZdHWvp_92bCjqUzOTYU=_4JH20iYvToXihbH6MoDUA@mail.gmail.com>
	<1319020562.3385.96.camel@zakaz.uk.xensource.com>
Date: Wed, 19 Oct 2011 12:42:00 +0200
X-Google-Sender-Auth: l8qBfEbhTWjdoNA_58NpM6SNEu8
Message-ID: <CAPLaKK4ksKxhAfg3+sKN5bd3idR_ZrYTuxcmv2GPSGGTa5ATSw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 18 of 27 v3] libxl: merge libxl__device_del
	into libxl__device_remove
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
Content-Transfer-Encoding: quoted-printable
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

2011/10/19 Ian Campbell <Ian.Campbell@citrix.com>:
> On Wed, 2011-10-19 at 11:22 +0100, Roger Pau Monn=C3=A9 wrote:
>> > + =C2=A0 =C2=A0xs_watch(ctx->xsh, state_path, be_path);
>> > + =C2=A0 =C2=A0libxl__device_destroy_tapdisk(gc, be_path);
>> > +
>> > + =C2=A0 =C2=A0if (wait) {
>> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0struct timeval tv;
>> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0tv.tv_sec =3D LIBXL_DESTROY_TIMEOUT;
>> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0tv.tv_usec =3D 0;
>> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0(void)wait_for_dev_destroy(gc, &tv);
>>
>> I think we should check the return value of wait_for_dev_destroy here,
>> since it might timeout, and the device is not removed then, so
>> libxl__device_remove should return 1 in that case (whereas it always
>> returns 0 now in that case, even when the device is still being
>> watched).
>
> Sure, didn't you post such a patch recently?

Yes, it was for the old version of your series and also included the
fix for libxl__device_remove always returning 0, I will modify it to
strip the now unnecessary parts and repost.

> Ian.
>
>
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 03:48:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 03:48:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGThT-0000iB-Be; Wed, 19 Oct 2011 03:48:44 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGTgm-0000VR-S8
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 03:48:01 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1319021277!146874!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1529 invoked from network); 19 Oct 2011 10:47:57 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-11.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 10:47:57 -0000
Received: by wyi11 with SMTP id 11so1967684wyi.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 03:47:57 -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:user-agent:date:from:to;
	bh=DhJxzjtyddApR67WxFcSwFQLOKDD+xUeaSxgwDZP3dU=;
	b=n1QlnpYs4mjGeTOItbtzh85FJqKVIRdPh+oq7kMhV+RH0KSN21NQ4iRSdMyKQwUEtt
	CtPXQyqV9YwmA5xE+KK1dkGa869Y8S6TSM4TGEr4PrtBwG8L8UCLqzfdwbCDxlw50ewS
	Z+GHFtuBPPLBL0MfZOqwO93SVyuxSiXXfR2Lg=
Received: by 10.216.164.74 with SMTP id b52mr6660088wel.94.1319021277518;
	Wed, 19 Oct 2011 03:47:57 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fw16sm1337561wbb.13.2011.10.19.03.47.55
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 19 Oct 2011 03:47:56 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ecc4637da82e62d4ff773e35f22c8cd3febaefc3
Message-Id: <ecc4637da82e62d4ff77.1319021250@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Wed, 19 Oct 2011 12:47:30 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH v5] libxl: reimplement buffer for bootloading
 and drop data if buffer 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 Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1319021130 -7200
# Node ID ecc4637da82e62d4ff773e35f22c8cd3febaefc3
# Parent  2efd965360f71d8811064b6fa0b50fc68e4ce6a6
libxl: reimplement buffer for bootloading and drop data if buffer is full.

Implement a buffer for the bootloading process that appends data to the end until it's full. Drop the whole buffer if a timeout has occurred and the buffer is full. Prevents the bootloader from getting stuck when using ptys with small buffers.

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r 2efd965360f7 -r ecc4637da82e tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c	Wed Oct 19 10:54:45 2011 +0200
+++ b/tools/libxl/libxl_bootloader.c	Wed Oct 19 12:45:30 2011 +0200
@@ -28,7 +28,8 @@
 #include "flexarray.h"
 
 #define XENCONSOLED_BUF_SIZE 16
-#define BOOTLOADER_BUF_SIZE 1024
+#define BOOTLOADER_BUF_SIZE 4096
+#define BOOTLOADER_TIMEOUT 1
 
 static char **make_bootloader_args(libxl__gc *gc,
                                    libxl_domain_build_info *info,
@@ -169,6 +170,7 @@ static char * bootloader_interact(libxl_
 
     size_t nr_out = 0, size_out = 0;
     char *output = NULL;
+    struct timeval wait;
 
     /* input from xenconsole. read on xenconsoled_fd write to bootloader_fd */
     int xenconsoled_prod = 0, xenconsoled_cons = 0;
@@ -181,39 +183,67 @@ static char * bootloader_interact(libxl_
         fd_set wsel, rsel;
         int nfds;
 
-        if (xenconsoled_prod == xenconsoled_cons)
-            xenconsoled_prod = xenconsoled_cons = 0;
-        if (bootloader_prod == bootloader_cons)
-            bootloader_prod = bootloader_cons = 0;
+        /* Set timeout to 1s before starting to discard data */
+        wait.tv_sec = BOOTLOADER_TIMEOUT;
+        wait.tv_usec = 0;
+
+        /* Move buffers around to drop already consumed data */
+        if (xenconsoled_cons > 0) {
+            xenconsoled_prod -= xenconsoled_cons;
+            memmove(xenconsoled_buf, &xenconsoled_buf[xenconsoled_cons],
+                    xenconsoled_prod);
+            xenconsoled_cons = 0;
+        }
+        if (bootloader_cons > 0) {
+            bootloader_prod -= bootloader_cons;
+            memmove(bootloader_buf, &bootloader_buf[bootloader_cons],
+                    bootloader_prod);
+            bootloader_cons = 0;
+        }
 
         FD_ZERO(&rsel);
         FD_SET(fifo_fd, &rsel);
         nfds = fifo_fd + 1;
-        if (xenconsoled_prod == 0 || (xenconsoled_prod < BOOTLOADER_BUF_SIZE && xenconsoled_cons == 0)) {
+        if (xenconsoled_prod < XENCONSOLED_BUF_SIZE) {
+            /* The buffer is not full, try to read more data */
             FD_SET(xenconsoled_fd, &rsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
-        }
-        if (bootloader_prod == 0 || (bootloader_prod < BOOTLOADER_BUF_SIZE && bootloader_cons == 0)) {
+        } 
+        if (bootloader_prod < BOOTLOADER_BUF_SIZE) {
+            /* The buffer is not full, try to read more data */
             FD_SET(bootloader_fd, &rsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
         FD_ZERO(&wsel);
-        if (bootloader_prod != bootloader_cons) {
+        if (bootloader_prod > 0) {
+            /* The buffer has data to consume */
             FD_SET(xenconsoled_fd, &wsel);
             nfds = xenconsoled_fd + 1 > nfds ? xenconsoled_fd + 1 : nfds;
         }
-        if (xenconsoled_prod != xenconsoled_cons) {
+        if (xenconsoled_prod > 0) {
+            /* The buffer has data to consume */
             FD_SET(bootloader_fd, &wsel);
             nfds = bootloader_fd + 1 > nfds ? bootloader_fd + 1 : nfds;
         }
 
-        ret = select(nfds, &rsel, &wsel, NULL, NULL);
-        if (ret < 0)
+        if (xenconsoled_prod == XENCONSOLED_BUF_SIZE ||
+            bootloader_prod == BOOTLOADER_BUF_SIZE)
+            ret = select(nfds, &rsel, &wsel, NULL, &wait);
+        else
+            ret = select(nfds, &rsel, &wsel, NULL, NULL);
+        if (ret < 0) {
+            if (errno == EINTR)
+                continue;
             goto out_err;
+        }
 
         /* Input from xenconsole, read xenconsoled_fd, write bootloader_fd */
-        if (FD_ISSET(xenconsoled_fd, &rsel)) {
+        if (ret == 0 && xenconsoled_prod == XENCONSOLED_BUF_SIZE) {
+            /* Drop the buffer */
+            xenconsoled_prod = 0;
+            xenconsoled_cons = 0;
+        } else if (FD_ISSET(xenconsoled_fd, &rsel)) {
             ret = read(xenconsoled_fd, &xenconsoled_buf[xenconsoled_prod], XENCONSOLED_BUF_SIZE - xenconsoled_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;
@@ -229,7 +259,11 @@ static char * bootloader_interact(libxl_
         }
 
         /* Input from bootloader, read bootloader_fd, write xenconsoled_fd */
-        if (FD_ISSET(bootloader_fd, &rsel)) {
+        if (ret == 0 && bootloader_prod == BOOTLOADER_BUF_SIZE) {
+            /* Drop the buffer */
+            bootloader_prod = 0;
+            bootloader_cons = 0;
+        } else if (FD_ISSET(bootloader_fd, &rsel)) {
             ret = read(bootloader_fd, &bootloader_buf[bootloader_prod], BOOTLOADER_BUF_SIZE - bootloader_prod);
             if (ret < 0 && errno != EIO && errno != EAGAIN)
                 goto out_err;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 03:52:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 03:52:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGTlQ-0001Ab-Ay; Wed, 19 Oct 2011 03:52:48 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGTkt-0000yq-IP
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 03:52:15 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319021532!783423!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29593 invoked from network); 19 Oct 2011 10:52:12 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 10:52:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8466710"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 10:52: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; Wed, 19 Oct 2011 11:52:12 +0100
Date: Wed, 19 Oct 2011 11:52:21 +0100
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: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
Message-ID: <alpine.DEB.2.00.1110191148580.3519@kaball-desktop>
References: <4E988CC30200006600005222@novprvlin0050.provo.novell.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, 14 Oct 2011, Chun Yan Liu wrote:
> Hi, List,
> 
> I'm trying xl create a pv guest with qcow/qcow2 image, it always fails at libxl_device_disk_local_attach.
> #xl create pv_config_file
> libxl: error: libxl.c:1119:libxl_device_disk_local_attach: cannot locally attach a qdisk image if the format is not raw
> libxl: error: libxl_create.c:467:do_domain_create: failed to run bootloader: -3
> 
> disk configuration is:
> disk=[ 'tap:qcow2:/var/lib/xen/images/sles11pv/disk0.qcow2,xvda,w', ]
> 
> Is there any way to make it work?

This is a PV guest configured with pygrub, correct?
If so, qcow/qcow2 are not supported in this scenario.

You could:

- avoid using pygrub (specify the kernel manually) and keep using qcow/qcow2;
- switch to raw disks and keep using pygrub;
- install a Linux kernel that support blktap2 (like the XCP kernel, see
  http://wiki.xen.org/xenwiki/XenDom0Kernels) and switch to VHD format.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 03:56:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 03:56:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGToV-0001aN-VD; Wed, 19 Oct 2011 03:56:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGTnr-0001OG-6Q
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 03:55:19 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319021704!42317225!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22089 invoked from network); 19 Oct 2011 10:55:05 -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;
	19 Oct 2011 10:55:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8466780"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 10:55: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; Wed, 19 Oct 2011 11:55:16 +0100
Date: Wed, 19 Oct 2011 11:55:24 +0100
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]xl create PV guest with qcow/qcow2 disk images fail
In-Reply-To: <alpine.DEB.2.00.1110191148580.3519@kaball-desktop>
Message-ID: <alpine.DEB.2.00.1110191152460.3519@kaball-desktop>
References: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
	<alpine.DEB.2.00.1110191148580.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>,
	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

On Wed, 19 Oct 2011, Stefano Stabellini wrote:
> On Fri, 14 Oct 2011, Chun Yan Liu wrote:
> > Hi, List,
> > 
> > I'm trying xl create a pv guest with qcow/qcow2 image, it always fails at libxl_device_disk_local_attach.
> > #xl create pv_config_file
> > libxl: error: libxl.c:1119:libxl_device_disk_local_attach: cannot locally attach a qdisk image if the format is not raw
> > libxl: error: libxl_create.c:467:do_domain_create: failed to run bootloader: -3
> > 
> > disk configuration is:
> > disk=[ 'tap:qcow2:/var/lib/xen/images/sles11pv/disk0.qcow2,xvda,w', ]
> > 
> > Is there any way to make it work?
> 
> This is a PV guest configured with pygrub, correct?
> If so, qcow/qcow2 are not supported in this scenario.
> 
> You could:
> 
> - avoid using pygrub (specify the kernel manually) and keep using qcow/qcow2;
> - switch to raw disks and keep using pygrub;
> - install a Linux kernel that support blktap2 (like the XCP kernel, see
>   http://wiki.xen.org/xenwiki/XenDom0Kernels) and switch to VHD format.
> 

The way to make it work would be to call qemu-nbd and nbd-client from xl
so that a /dev/nbd0 comes up in dom0 and pygrub can use it to extract
the kernel and initrd from the qcow2 image.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 04:44:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 04:44:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGUZX-0003Ro-0k; Wed, 19 Oct 2011 04:44:35 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGUYb-00037N-OE
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 04:43:38 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319024614!29866980!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21109 invoked from network); 19 Oct 2011 11:43:34 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 11:43:34 -0000
Received: by wyi11 with SMTP id 11so2030516wyi.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 04:43:34 -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:user-agent:date:from:to:cc;
	bh=Pm5UIMuCoOIf6OqeDSSHCxVapvzdYXVMQsCJYsdTqMY=;
	b=pwHNPxAbp8799+ZuD31qhrhlX689pRfJGztK/vpH+T2DSBVyH9nnOOk52wS4WxlJvq
	+ewmwgaXH9rmo6t+Sl04bkwaccJXIkcyCNs1evygCAxYx9QgOms1lmlQl544+/jvYrLi
	FflhezoEc4WI1E4hncRRr30yNLfXusgVBigoQ=
Received: by 10.216.137.36 with SMTP id x36mr2503980wei.41.1319024614359;
	Wed, 19 Oct 2011 04:43:34 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id 11sm9316089wby.15.2011.10.19.04.43.32
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 19 Oct 2011 04:43:33 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 5941638b04693f7d8bfa2d6b5563132f54942a28
Message-Id: <5941638b04693f7d8bfa.1319024587@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Wed, 19 Oct 2011 13:43:07 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: ian.campbell@citrix.com
Subject: [Xen-devel] [PATCH] libxl: handle the return value of
 wait_for_dev_destroy select and pass it to caller 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 Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1319024152 -7200
# Node ID 5941638b04693f7d8bfa2d6b5563132f54942a28
# Parent  a2a3c4d7333ec15b818b3403f148ad61c254ea82
libxl: handle the return value of wait_for_dev_destroy select and pass it to caller function.

Handle the return value of the select call inside wait_for_dev_destroy properly, and return 0 if the device is removed, or 1 if a timeout or error happened. Use the return value of wait_for_dev_destroy inside libxl__device_remove to properly return from that function.

This patch should be applied after Ian Campbell's v3 "libxl: rationalise libxl_device_* APIs".

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r a2a3c4d7333e -r 5941638b0469 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl_device.c	Wed Oct 19 13:35:52 2011 +0200
@@ -367,6 +367,7 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
+/* Returns 0 if a device is removed, 1 if an error or timeout occurred */
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -375,22 +376,34 @@ static int wait_for_dev_destroy(libxl__g
     fd_set rfds;
     char **l1 = NULL;
 
+start:
     rc = 1;
     nfds = xs_fileno(ctx->xsh) + 1;
     FD_ZERO(&rfds);
     FD_SET(xs_fileno(ctx->xsh), &rfds);
-    if (select(nfds, &rfds, NULL, NULL, tv) > 0) {
-        l1 = xs_read_watch(ctx->xsh, &n);
-        if (l1 != NULL) {
-            char *state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
-            if (!state || atoi(state) == 6) {
-                xs_unwatch(ctx->xsh, l1[0], l1[1]);
-                xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
-                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Destroyed device backend at %s", l1[XS_WATCH_TOKEN]);
-                rc = 0;
+    switch (select(nfds, &rfds, NULL, NULL, tv)) {
+        case -1:
+            if (errno == EINTR)
+                goto start;
+            break;
+        case 0:
+            break;
+        default:
+            l1 = xs_read_watch(ctx->xsh, &n);
+            if (l1 != NULL) {
+                char *state = libxl__xs_read(gc, XBT_NULL,
+                                             l1[XS_WATCH_PATH]);
+                if (!state || atoi(state) == 6) {
+                    xs_unwatch(ctx->xsh, l1[0], l1[1]);
+                    xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
+                    LIBXL__LOG(ctx, LIBXL__LOG_DEBUG,
+                               "Destroyed device backend at %s",
+                               l1[XS_WATCH_TOKEN]);
+                    rc = 0;
+                }
+                free(l1);
             }
-            free(l1);
-        }
+            break;
     }
     return rc;
 }
@@ -436,7 +449,7 @@ retry_transaction:
         struct timeval tv;
         tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
         tv.tv_usec = 0;
-        (void)wait_for_dev_destroy(gc, &tv);
+        rc = wait_for_dev_destroy(gc, &tv);
         xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
     } else {
         rc = 1; /* Caller must wait_for_dev_destroy */

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 04:55:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 04:55:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGUk2-00042N-JS; Wed, 19 Oct 2011 04:55:26 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGUjI-0003pt-5z
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 04:54:40 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319025277!824305!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28506 invoked from network); 19 Oct 2011 11:54:37 -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;
	19 Oct 2011 11:54:37 -0000
X-IronPort-AV: E=Sophos;i="4.69,371,1315180800"; 
   d="scan'208";a="8468261"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 11:54: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;
	Wed, 19 Oct 2011 12:54:36 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau Monne <roger.pau@entel.upc.edu>
Date: Wed, 19 Oct 2011 12:54:35 +0100
In-Reply-To: <5941638b04693f7d8bfa.1319024587@loki>
References: <5941638b04693f7d8bfa.1319024587@loki>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319025275.3385.101.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] libxl: handle the return value of
 wait_for_dev_destroy select and pass it to caller 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

On Wed, 2011-10-19 at 12:43 +0100, Roger Pau Monne wrote:
> # HG changeset patch
> # User Roger Pau Monne <roger.pau@entel.upc.edu>
> # Date 1319024152 -7200
> # Node ID 5941638b04693f7d8bfa2d6b5563132f54942a28
> # Parent  a2a3c4d7333ec15b818b3403f148ad61c254ea82
> libxl: handle the return value of wait_for_dev_destroy select and pass it to caller function.
> 
> Handle the return value of the select call inside wait_for_dev_destroy properly, and return 0 if the device is removed, or 1 if a timeout or error happened. Use the return value of wait_for_dev_destroy inside libxl__device_remove to properly return from that function.
> 
> This patch should be applied after Ian Campbell's v3 "libxl: rationalise libxl_device_* APIs".
> 
> Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>
> 
> diff -r a2a3c4d7333e -r 5941638b0469 tools/libxl/libxl_device.c
> --- a/tools/libxl/libxl_device.c	Tue Oct 18 13:36:43 2011 +0100
> +++ b/tools/libxl/libxl_device.c	Wed Oct 19 13:35:52 2011 +0200
> @@ -367,6 +367,7 @@ int libxl__device_disk_dev_number(const 
>      return -1;
>  }
>  
> +/* Returns 0 if a device is removed, 1 if an error or timeout occurred */
>  static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
>  {
>      libxl_ctx *ctx = libxl__gc_owner(gc);
> @@ -436,7 +449,7 @@ retry_transaction:
>          struct timeval tv;
>          tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
>          tv.tv_usec = 0;
> -        (void)wait_for_dev_destroy(gc, &tv);
> +        rc = wait_for_dev_destroy(gc, &tv);
>          xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
>      } else {
>          rc = 1; /* Caller must wait_for_dev_destroy */

If wait_for_dev_destroy returns 1 (error or timeout) then this will get
returned to the caller, where it means "you must wait". But they will
not be expecting this (because they passed wait==1) and even if they
were having them call wait_for_dev_destroy when it has already timed out
doesn't seem likely.

I think the right thing is for wait_for_dev_destroy to return 0 or an
ERROR_* where one of the ERROR_* can be ERROR_TIMEDOUT and for this to
be propagated to the caller.

The caller in libxl__devices_destroy needs to do something with this
return value as well. It would be good to consume all the watches but
return the first error, or something like that.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 05:08:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 05:08:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGUwi-0004eN-SO; Wed, 19 Oct 2011 05:08:32 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGUut-0004Qa-8e
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 05:06:42 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319025996!237320!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11341 invoked from network); 19 Oct 2011 12:06:36 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-13.tower-216.messagelabs.com with SMTP;
	19 Oct 2011 12:06:36 -0000
Received: from p5b2e48b2.dip.t-dialin.net ([91.46.72.178] 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 1RGUuq-0004kB-0b
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 12:06:36 +0000
Message-ID: <4E9EBD4A.2010305@canonical.com>
Date: Wed, 19 Oct 2011 14:06:34 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.23) Gecko/20110922 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-15
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Wondering about pv devcie configuration and usage
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 know this is more of a design problem and maybe there are already changes to
solve that...

When looking at xen 4.1.1 and 3.0 kernels it looks to me that the decision about
unplugging is done based on what drivers are available, while the decision about
whether the blkfront driver makes the disk available is done based on the
theoretical major.

So when having a disk defined as "hda" in the config, a kernel that has the pci
frontend and the blk frontend available will first unplug the ide disk and then
refuse to use the pv disk because the hda major would not be the right one. Even
naming the disk xvda in the config will cause an emulated device to appear (if
unplugging is prevented).

I know this all goes back quite a while. Just wondering whether it would be an
acceptable approach to

- For a PV guest that defines sd? or hd? names, print a big warning and maybe
  map even before configuring the domain.
- For HVM guests, anything configured as hd? only gives emulated drives and
  anything declared as xvd? only gives pv disks.

It may be over simplified thinking...

-Stefan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 06:35:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 06: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 1RGWJ9-0008I1-DO; Wed, 19 Oct 2011 06:35:47 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWI5-00085C-SY
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:34:42 -0700
X-Env-Sender: fajar@fajar.net
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319031277!9695!1
X-Originating-IP: [209.85.161.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29793 invoked from network); 19 Oct 2011 13:34:38 -0000
Received: from mail-gx0-f171.google.com (HELO mail-gx0-f171.google.com)
	(209.85.161.171)
	by server-9.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:34:38 -0000
Received: by ggnv5 with SMTP id v5so2343619ggn.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 06:34:36 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.43.50.201 with SMTP id vf9mr7170732icb.10.1319031276682; Wed,
	19 Oct 2011 06:34:36 -0700 (PDT)
Received: by 10.42.241.2 with HTTP; Wed, 19 Oct 2011 06:34:36 -0700 (PDT)
In-Reply-To: <alpine.DEB.2.00.1110191152460.3519@kaball-desktop>
References: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
	<alpine.DEB.2.00.1110191148580.3519@kaball-desktop>
	<alpine.DEB.2.00.1110191152460.3519@kaball-desktop>
Date: Wed, 19 Oct 2011 20:34:36 +0700
Message-ID: <CAG1y0sdh+4eai1qooKDRhLZM6UDXVqfywx5e7E6H5EYnN_eqeg@mail.gmail.com>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
From: "Fajar A. Nugraha" <list@fajar.net>
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>,
	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

On Wed, Oct 19, 2011 at 5:55 PM, Stefano Stabellini
<stefano.stabellini@eu.citrix.com> wrote:
>> This is a PV guest configured with pygrub, correct?
>> If so, qcow/qcow2 are not supported in this scenario.
>>
>> You could:
>>
>> - avoid using pygrub (specify the kernel manually) and keep using qcow/q=
cow2;
>> - switch to raw disks and keep using pygrub;
>> - install a Linux kernel that support blktap2 (like the XCP kernel, see
>> =A0 http://wiki.xen.org/xenwiki/XenDom0Kernels) and switch to VHD format=
.
>>
>
> The way to make it work would be to call qemu-nbd and nbd-client from xl
> so that a /dev/nbd0 comes up in dom0 and pygrub can use it to extract
> the kernel and initrd from the qcow2 image.

would pv-grub work? If yes, it would give better performance compared
to nbd workaround.

--=20
Fajar

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 06:40:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 06:40:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGWO5-0000I0-Il; Wed, 19 Oct 2011 06:40:53 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWNa-000068-Di
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:40:22 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319031618!11549!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15938 invoked from network); 19 Oct 2011 13:40:19 -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;
	19 Oct 2011 13:40:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315180800"; 
   d="scan'208";a="8471089"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 13:40:18 +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, 19 Oct 2011 14:40:18 +0100
Date: Wed, 19 Oct 2011 14:40:27 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: "Fajar A. Nugraha" <list@fajar.net>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
In-Reply-To: <CAG1y0sdh+4eai1qooKDRhLZM6UDXVqfywx5e7E6H5EYnN_eqeg@mail.gmail.com>
Message-ID: <alpine.DEB.2.00.1110191440070.3519@kaball-desktop>
References: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
	<alpine.DEB.2.00.1110191148580.3519@kaball-desktop>
	<alpine.DEB.2.00.1110191152460.3519@kaball-desktop>
	<CAG1y0sdh+4eai1qooKDRhLZM6UDXVqfywx5e7E6H5EYnN_eqeg@mail.gmail.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="8323329-2145431632-1319031643=:3519"
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

--8323329-2145431632-1319031643=:3519
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8BIT

On Wed, 19 Oct 2011, Fajar A. Nugraha wrote:
> On Wed, Oct 19, 2011 at 5:55 PM, Stefano Stabellini
> <stefano.stabellini@eu.citrix.com> wrote:
> >> This is a PV guest configured with pygrub, correct?
> >> If so, qcow/qcow2 are not supported in this scenario.
> >>
> >> You could:
> >>
> >> - avoid using pygrub (specify the kernel manually) and keep using qcow/qcow2;
> >> - switch to raw disks and keep using pygrub;
> >> - install a Linux kernel that support blktap2 (like the XCP kernel, see
> >>   http://wiki.xen.org/xenwiki/XenDom0Kernels) and switch to VHD format.
> >>
> >
> > The way to make it work would be to call qemu-nbd and nbd-client from xl
> > so that a /dev/nbd0 comes up in dom0 and pygrub can use it to extract
> > the kernel and initrd from the qcow2 image.
> 
> would pv-grub work? If yes, it would give better performance compared
> to nbd workaround.

Yes, it should. That would be the other alternative.
--8323329-2145431632-1319031643=: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-2145431632-1319031643=:3519--


From xen-devel-bounces@lists.xensource.com Wed Oct 19 06:47:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 06:47:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGWU2-0000nr-Sf; Wed, 19 Oct 2011 06:47:03 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWTY-0000ao-3x
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:46:32 -0700
X-Env-Sender: raistlin.df@gmail.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1319031987!35951993!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23037 invoked from network); 19 Oct 2011 13:46:29 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:46:29 -0000
Received: by ywm13 with SMTP id 13so2356328ywm.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 06:46:27 -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=nJc4cPBdGL6z7q0oqnPzOJqUqPX9BETOzIOJKCaTYhA=;
	b=aIIJOAEOVWT7W8yQOqXVhfphUNYhNKsxrvtvMPSTM80v3OimmK1DxEALR3tIMq/ZF9
	K4ZFY//sZEvVF+MrCLuoaIuXcswPTjsoEPz0vWGsCFeOlslwPChu4HSGnYlXSCXNvURd
	U3N9PZXkAsymcoAQ8zXtfoYytDyX76hSJohlE=
MIME-Version: 1.0
Received: by 10.68.30.36 with SMTP id p4mr6338323pbh.39.1319031986322; Wed, 19
	Oct 2011 06:46:26 -0700 (PDT)
Received: by 10.142.242.1 with HTTP; Wed, 19 Oct 2011 06:46:26 -0700 (PDT)
In-Reply-To: <1319010037.11016.66.camel@dagon.hellion.org.uk>
References: <1318865791.25056.28.camel@Palantir>
	<20111017164020.GE19684@phenom.dumpdata.com>
	<1318982052.2997.19.camel@Palantir>
	<20111019011028.GA19302@phenom.dumpdata.com>
	<1319010037.11016.66.camel@dagon.hellion.org.uk>
Date: Wed, 19 Oct 2011 15:46:26 +0200
X-Google-Sender-Auth: n0D24-35x5clqiysSbJ0LWFv0c0
Message-ID: <CAAWQecut9-ouRfZEwmvFYkA8W98XZRFc3LtdPYPyWbhuaZzYiw@mail.gmail.com>
Subject: Re: [Xen-devel] Issue with PCI-passthrough and pvops
From: Dario Faggioli <raistlin@linux.it>
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel <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 Wed, Oct 19, 2011 at 9:40 AM, Ian Campbell <Ian.Campbell@citrix.com> wro=
te:
>> > Guest:
>> > [ =A0 19.607997] ixgbe: Intel(R) 10 Gigabit PCI Express Network Driver=
 - version 3.4.8-k
>> > [ =A0 19.608670] ixgbe: Copyright (c) 1999-2011 Intel Corporation.
>> > [ =A0 19.609465] ixgbe 0000:00:00.0: device not available (can't reser=
ve [mem 0xdf300000-0xe32fffff 64bit])
>> > [ =A0 19.610878] ixgbe: probe of 0000:00:00.0 failed with error -22
>>
>> Well, that is the problem.
>
> Does he need "e820_host=3D1" in his cfg?
>
Mmm... If you mean putting that line in my DomU config file
(I checked 23428:131f19c67d85, and it seems so), that is not
helping.

Thanks and regards,
Dario

PS. sorry for the webmail... Installation of new laptop going on here :-P

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, <http://retis.sssup.it/people/faggioli>
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa =A0(Italy)
Senior Software Engineer, Citrix Systems R&D, Cambridge (UK)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:00:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:00:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGWhM-0001Y1-Lw; Wed, 19 Oct 2011 07:00:48 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWeX-0001HQ-KY
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:57:54 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319032669!14780!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29391 invoked from network); 19 Oct 2011 13:57:50 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:57:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315195200"; d="scan'208";a="18352327"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:57:48 -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; Wed, 19 Oct 2011 09:57:48 -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 p9JDvj1f019274;	Wed, 19 Oct 2011 06:57:46 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Wed, 19 Oct 2011 14:56:43 +0100
Message-ID: <1319032613-10560-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>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 00/10] Xen PCI Passthrough
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 patch series introduce the PCI passthrough for Xen.

First, we have HostPCIDevice that help to access one PCI device of the host.

Then, there is an additions in the QEMU code, pci_check_bar_overlap.

There are also several change in pci_ids and pci_regs.

Last part, but not least, the PCI passthrough device himself. Cut in 3 parts
(or file), there is one to take care of the initialisation of a passthrough
device. The second one handle everything about the config address space, there
are specifics functions for every config register. The third one is to handle
MSI.

There is a patch series on xen-devel that add the support of setting a PCI
passthrough device through QMP from libxl (xen tool stack). It is just a call
to device_add, with the driver parametter hostaddr="0000:00:1b.0".

Change since the v1:
  - fix style issue (checkpatch.pl)
  - set the original authors, add some missing copyright headers
  - HostPCIDevice:
    - introduce HostPCIIORegions (with base_addr, size, flags)
    - save all flags from ./resource and store it in a separate field.
    - fix endianess on write
    - new host_pci_dev_put function
    - use pci.c like interface host_pci_get/set_byte/word/long (instead of
      host_pci_read/write_)
  - compile HostPCIDevice only on linux (as well as xen_pci_passthrough)
  - introduce apic-msidef.h file.
  - no more run_one_timer, if a pci device is in the middle of a power
    transition, just "return an error" in config read/write
  - use a global var mapped_machine_irq (local to xen_pci_passthrough.c)
  - add msitranslate and power-mgmt ad qdev property



Allen Kay (2):
  Introduce Xen PCI Passthrough, qdevice (1/3)
  Introduce Xen PCI Passthrough, PCI config space helpers (2/3)

Anthony PERARD (6):
  configure: Introduce --enable-xen-pci-passthrough.
  Introduce HostPCIDevice to access a pci device on the host.
  pci_ids: Add INTEL_82599_VF id.
  pci_regs: Fix value of PCI_EXP_TYPE_RC_EC.
  pci_regs: Add PCI_EXP_TYPE_PCIE_BRIDGE
  Introduce apic-msidef.h

Jiang Yunhong (1):
  Introduce Xen PCI Passthrough, MSI (3/3)

Yuji Shimada (1):
  pci.c: Add pci_check_bar_overlap

 Makefile.target                      |    7 +
 configure                            |   21 +
 hw/apic-msidef.h                     |   30 +
 hw/apic.c                            |   11 +-
 hw/host-pci-device.c                 |  245 ++++
 hw/host-pci-device.h                 |   75 +
 hw/pci.c                             |   47 +
 hw/pci.h                             |    3 +
 hw/pci_ids.h                         |    1 +
 hw/pci_regs.h                        |    3 +-
 hw/xen_pci_passthrough.c             |  861 ++++++++++++
 hw/xen_pci_passthrough.h             |  280 ++++
 hw/xen_pci_passthrough_config_init.c | 2553 ++++++++++++++++++++++++++++++++++
 hw/xen_pci_passthrough_helpers.c     |   46 +
 hw/xen_pci_passthrough_msi.c         |  667 +++++++++
 15 files changed, 4839 insertions(+), 11 deletions(-)
 create mode 100644 hw/apic-msidef.h
 create mode 100644 hw/host-pci-device.c
 create mode 100644 hw/host-pci-device.h
 create mode 100644 hw/xen_pci_passthrough.c
 create mode 100644 hw/xen_pci_passthrough.h
 create mode 100644 hw/xen_pci_passthrough_config_init.c
 create mode 100644 hw/xen_pci_passthrough_helpers.c
 create mode 100644 hw/xen_pci_passthrough_msi.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 Wed Oct 19 07:05:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:05:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGWm6-00020X-Mv; Wed, 19 Oct 2011 07:05:43 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWea-0001Ha-5o
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:57:56 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319032669!14780!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29620 invoked from network); 19 Oct 2011 13:57:52 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:57:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315195200"; d="scan'208";a="18352331"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:57: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; Wed, 19 Oct 2011 09:57: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 p9JDvj1g019274;	Wed, 19 Oct 2011 06:57:51 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Wed, 19 Oct 2011 14:56:44 +0100
Message-ID: <1319032613-10560-2-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 01/10] configure: Introduce
	--enable-xen-pci-passthrough.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>
---
 Makefile.target |    2 ++
 configure       |   21 +++++++++++++++++++++
 2 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/Makefile.target b/Makefile.target
index 417f23e..c518103 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -208,6 +208,8 @@ obj-$(CONFIG_NO_XEN) += xen-stub.o
 
 obj-i386-$(CONFIG_XEN) += xen_platform.o
 
+# Xen PCI Passthrough
+
 # Inter-VM PCI shared memory
 CONFIG_IVSHMEM =
 ifeq ($(CONFIG_KVM), y)
diff --git a/configure b/configure
index 9b4fe34..63c5c30 100755
--- a/configure
+++ b/configure
@@ -127,6 +127,7 @@ vnc_png=""
 vnc_thread="no"
 xen=""
 xen_ctrl_version=""
+xen_pci_passthrough=""
 linux_aio=""
 attr=""
 xfs=""
@@ -641,6 +642,10 @@ for opt do
   ;;
   --enable-xen) xen="yes"
   ;;
+  --disable-xen-pci-passthrough) xen_pci_passthrough="no"
+  ;;
+  --enable-xen-pci-passthrough) xen_pci_passthrough="yes"
+  ;;
   --disable-brlapi) brlapi="no"
   ;;
   --enable-brlapi) brlapi="yes"
@@ -979,6 +984,8 @@ echo "                           (affects only QEMU, not qemu-img)"
 echo "  --enable-mixemu          enable mixer emulation"
 echo "  --disable-xen            disable xen backend driver support"
 echo "  --enable-xen             enable xen backend driver support"
+echo "  --disable-xen-pci-passthrough"
+echo "  --enable-xen-pci-passthrough"
 echo "  --disable-brlapi         disable BrlAPI"
 echo "  --enable-brlapi          enable BrlAPI"
 echo "  --disable-vnc-tls        disable TLS encryption for VNC server"
@@ -1342,6 +1349,17 @@ EOF
   fi
 fi
 
+if test "$xen_pci_passthrough" != "no"; then
+  if test "$xen" = "yes" -a "$linux" = "yes"; then
+    xen_pci_passthrough=yes
+  else
+    if test "$xen_pci_passthrough" = "yes"; then
+      feature_not_found "Xen PCI Passthrough without Xen or not on linux"
+    fi
+    xen_pci_passthrough=no
+  fi
+fi
+
 ##########################################
 # pkg-config probe
 
@@ -3365,6 +3383,9 @@ case "$target_arch2" in
     if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then
       target_phys_bits=64
       echo "CONFIG_XEN=y" >> $config_target_mak
+      if test "$xen_pci_passthrough" = yes; then
+        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
+      fi
     else
       echo "CONFIG_NO_XEN=y" >> $config_target_mak
     fi
-- 
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 Oct 19 07:09:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:09:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGWpo-0002UZ-Fx; Wed, 19 Oct 2011 07:09:32 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWec-0001Hf-3B
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:57:58 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319032669!14780!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29788 invoked from network); 19 Oct 2011 13:57:54 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:57:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315195200"; d="scan'208";a="18352336"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09: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; Wed, 19 Oct 2011 09:57:53 -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 p9JDvj1h019274;	Wed, 19 Oct 2011 06:57:52 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Wed, 19 Oct 2011 14:56:45 +0100
Message-ID: <1319032613-10560-3-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 02/10] Introduce HostPCIDevice to access a
	pci device on the 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

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 Makefile.target      |    1 +
 hw/host-pci-device.c |  245 ++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/host-pci-device.h |   75 +++++++++++++++
 3 files changed, 321 insertions(+), 0 deletions(-)
 create mode 100644 hw/host-pci-device.c
 create mode 100644 hw/host-pci-device.h

diff --git a/Makefile.target b/Makefile.target
index c518103..ca3420d 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -209,6 +209,7 @@ obj-$(CONFIG_NO_XEN) += xen-stub.o
 obj-i386-$(CONFIG_XEN) += xen_platform.o
 
 # Xen PCI Passthrough
+obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += host-pci-device.o
 
 # Inter-VM PCI shared memory
 CONFIG_IVSHMEM =
diff --git a/hw/host-pci-device.c b/hw/host-pci-device.c
new file mode 100644
index 0000000..0f25fcf
--- /dev/null
+++ b/hw/host-pci-device.c
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2011       Citrix Ltd.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu-common.h"
+#include "host-pci-device.h"
+
+static int path_to(const HostPCIDevice *d,
+                   const char *name, char *buf, ssize_t size)
+{
+    return snprintf(buf, size, "/sys/bus/pci/devices/%04x:%02x:%02x.%x/%s",
+                    d->domain, d->bus, d->dev, d->func, name);
+}
+
+static int get_resource(HostPCIDevice *d)
+{
+    int i, rc = 0;
+    FILE *f;
+    char path[PATH_MAX];
+    unsigned long long start, end, flags, size;
+
+    path_to(d, "resource", path, sizeof (path));
+    f = fopen(path, "r");
+    if (!f) {
+        fprintf(stderr, "Error: Can't open %s: %s\n", path, strerror(errno));
+        return -1;
+    }
+
+    for (i = 0; i < PCI_NUM_REGIONS; i++) {
+        if (fscanf(f, "%llx %llx %llx", &start, &end, &flags) != 3) {
+            fprintf(stderr, "Error: Syntax error in %s\n", path);
+            rc = -1;
+            break;
+        }
+        if (start) {
+            size = end - start + 1;
+        } else {
+            size = 0;
+        }
+
+        if (i < PCI_ROM_SLOT) {
+            d->io_regions[i].base_addr = start;
+            d->io_regions[i].size = size;
+            d->io_regions[i].flags = flags;
+        } else {
+            d->rom.base_addr = start;
+            d->rom.size = size;
+            d->rom.flags = flags;
+        }
+    }
+
+    fclose(f);
+    return rc;
+}
+
+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;
+    }
+    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;
+}
+
+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);
+  return buf;
+}
+uint16_t host_pci_get_word(HostPCIDevice *d, int pos)
+{
+  uint16_t buf;
+  host_pci_config_read(d, pos, &buf, 2);
+  return le16_to_cpu(buf);
+}
+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);
+}
+
+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 = 480;
+    int pos = 0x100;
+
+    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 < 0x100) {
+            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) == -1) {
+        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

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:13:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:13:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGWtu-000341-8S; Wed, 19 Oct 2011 07:13:46 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWef-0001Hp-5Q
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:58:02 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319032669!14780!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29993 invoked from network); 19 Oct 2011 13:57:57 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:57:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315195200"; d="scan'208";a="18352342"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:57: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; Wed, 19 Oct 2011 09:57:57 -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 p9JDvj1j019274;	Wed, 19 Oct 2011 06:57:56 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Wed, 19 Oct 2011 14:56:47 +0100
Message-ID: <1319032613-10560-5-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 04/10] pci_ids: Add INTEL_82599_VF id.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>
---
 hw/pci_ids.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/hw/pci_ids.h b/hw/pci_ids.h
index 83f3893..2ea5ec2 100644
--- a/hw/pci_ids.h
+++ b/hw/pci_ids.h
@@ -117,6 +117,7 @@
 #define PCI_DEVICE_ID_INTEL_82801I_UHCI6 0x2939
 #define PCI_DEVICE_ID_INTEL_82801I_EHCI1 0x293a
 #define PCI_DEVICE_ID_INTEL_82801I_EHCI2 0x293c
+#define PCI_DEVICE_ID_INTEL_82599_VF     0x10ed
 
 #define PCI_VENDOR_ID_XEN               0x5853
 #define PCI_DEVICE_ID_XEN_PLATFORM      0x0001
-- 
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 Oct 19 07:16:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:16:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGWwP-0003Wz-0Y; Wed, 19 Oct 2011 07:16:21 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWee-0001Ho-Qw
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:58:02 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319032646!53501308!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28576 invoked from network); 19 Oct 2011 13:57:27 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:57:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315195200"; d="scan'208";a="167426157"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:57:56 -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; Wed, 19 Oct 2011 09:57:56 -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 p9JDvj1i019274;	Wed, 19 Oct 2011 06:57:53 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Wed, 19 Oct 2011 14:56:46 +0100
Message-ID: <1319032613-10560-4-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Yuji Shimada <shimada-yxb@necst.nec.co.jp>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 03/10] pci.c: Add pci_check_bar_overlap
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Yuji Shimada <shimada-yxb@necst.nec.co.jp>

This function help Xen PCI Passthrough device to check for overlap.

Signed-off-by: Yuji Shimada <shimada-yxb@necst.nec.co.jp>
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 hw/pci.c |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 hw/pci.h |    3 +++
 2 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index 749e8d8..d85ceca 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -2129,3 +2129,50 @@ MemoryRegion *pci_address_space_io(PCIDevice *dev)
 {
     return dev->bus->address_space_io;
 }
+
+int pci_check_bar_overlap(PCIDevice *dev,
+                          pcibus_t addr, pcibus_t size, uint8_t type)
+{
+    PCIBus *bus = dev->bus;
+    PCIDevice *devices = NULL;
+    PCIIORegion *r;
+    int i, j;
+    int rc = 0;
+
+    /* check Overlapped to Base Address */
+    for (i = 0; i < ARRAY_SIZE(bus->devices); i++) {
+        devices = bus->devices[i];
+        if (!devices) {
+            continue;
+        }
+
+        /* skip itself */
+        if (devices->devfn == dev->devfn) {
+            continue;
+        }
+
+        for (j = 0; j < PCI_NUM_REGIONS; j++) {
+            r = &devices->io_regions[j];
+
+            /* skip different resource type, but don't skip when
+             * prefetch and non-prefetch memory are compared.
+             */
+            if (type != r->type) {
+                if (type == PCI_BASE_ADDRESS_SPACE_IO ||
+                    r->type == PCI_BASE_ADDRESS_SPACE_IO) {
+                    continue;
+                }
+            }
+
+            if ((addr < (r->addr + r->size)) && ((addr + size) > r->addr)) {
+                printf("Overlapped to device[%02x:%02x.%x][Region:%d]"
+                       "[Address:%"PRIx64"h][Size:%"PRIx64"h]\n",
+                       pci_bus_num(bus), PCI_SLOT(devices->devfn),
+                       PCI_FUNC(devices->devfn), j, r->addr, r->size);
+                rc = 1;
+            }
+        }
+    }
+
+    return rc;
+}
diff --git a/hw/pci.h b/hw/pci.h
index 86a81c8..0e1a07d 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -487,4 +487,7 @@ static inline uint32_t pci_config_size(const PCIDevice *d)
     return pci_is_express(d) ? PCIE_CONFIG_SPACE_SIZE : PCI_CONFIG_SPACE_SIZE;
 }
 
+int pci_check_bar_overlap(PCIDevice *dev,
+                          pcibus_t addr, pcibus_t size, uint8_t type);
+
 #endif
-- 
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 Oct 19 07:17:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:17:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGWxh-0003ud-1J; Wed, 19 Oct 2011 07:17:41 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWeh-0001I5-Lj
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:58:04 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319032669!14780!5
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30392 invoked from network); 19 Oct 2011 13:58:00 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:58:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315195200"; d="scan'208";a="18352343"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:58: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; Wed, 19 Oct 2011 09:58: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 p9JDvj1l019274;	Wed, 19 Oct 2011 06:57:58 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Wed, 19 Oct 2011 14:56:49 +0100
Message-ID: <1319032613-10560-7-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 06/10] pci_regs: Add PCI_EXP_TYPE_PCIE_BRIDGE
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>
---
 hw/pci_regs.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/hw/pci_regs.h b/hw/pci_regs.h
index 6b42515..56a404b 100644
--- a/hw/pci_regs.h
+++ b/hw/pci_regs.h
@@ -392,6 +392,7 @@
 #define  PCI_EXP_TYPE_UPSTREAM	0x5	/* Upstream Port */
 #define  PCI_EXP_TYPE_DOWNSTREAM 0x6	/* Downstream Port */
 #define  PCI_EXP_TYPE_PCI_BRIDGE 0x7	/* PCI/PCI-X Bridge */
+#define  PCI_EXP_TYPE_PCIE_BRIDGE 0x8   /* PCI/PCI-X to PCIE Bridge */
 #define  PCI_EXP_TYPE_RC_END	0x9	/* Root Complex Integrated Endpoint */
 #define  PCI_EXP_TYPE_RC_EC     0xa     /* Root Complex Event Collector */
 #define PCI_EXP_FLAGS_SLOT	0x0100	/* Slot implemented */
-- 
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 Oct 19 07:18:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:18:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGWye-0004HZ-4C; Wed, 19 Oct 2011 07:18:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWeg-0001Hy-6s
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:58:02 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319032646!53501308!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28813 invoked from network); 19 Oct 2011 13:57:29 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:57:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315195200"; d="scan'208";a="167426168"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:57:58 -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; Wed, 19 Oct 2011 09:57: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 p9JDvj1k019274;	Wed, 19 Oct 2011 06:57:57 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Wed, 19 Oct 2011 14:56:48 +0100
Message-ID: <1319032613-10560-6-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 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

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


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:19:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:19:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGWzX-0004ep-Ca; Wed, 19 Oct 2011 07:19:35 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWei-0001I8-S3
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:58:05 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319032646!53501308!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29014 invoked from network); 19 Oct 2011 13:57:31 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:57:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315195200"; d="scan'208";a="167426176"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:58: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; Wed, 19 Oct 2011 09:58: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 p9JDvj1m019274;	Wed, 19 Oct 2011 06:57:59 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Wed, 19 Oct 2011 14:56:50 +0100
Message-ID: <1319032613-10560-8-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 07/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

This patch move the msi definition from apic.c to apic-msidef.h. So it can be
used also by other .c files.

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 Wed Oct 19 07:20:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:20:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGX0P-00052C-KQ; Wed, 19 Oct 2011 07:20:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWem-0001JA-BG
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:58:09 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319032669!14780!6
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30705 invoked from network); 19 Oct 2011 13:58:04 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:58:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315195200"; d="scan'208";a="18352356"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:58: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; Wed, 19 Oct 2011 09:58: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 p9JDvj1n019274;	Wed, 19 Oct 2011 06:58:01 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Wed, 19 Oct 2011 14:56:51 +0100
Message-ID: <1319032613-10560-9-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Allen Kay <allen.m.kay@intel.com>, Guy Zana <guy@neocleus.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Anthony PERARD <anthony.perard@citrix.com>
Subject: [Xen-devel] [PATCH V2 08/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

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         |  861 ++++++++++++++++++++++++++++++++++++++
 hw/xen_pci_passthrough.h         |  258 ++++++++++++
 hw/xen_pci_passthrough_helpers.c |   46 ++
 4 files changed, 1167 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 ca3420d..0673b51 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -210,6 +210,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..0b631f7
--- /dev/null
+++ b/hw/xen_pci_passthrough.c
@@ -0,0 +1,861 @@
+/*
+ * 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'.
+ */
+
+#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 untill 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);
+    }
+}
+
+/* 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) {
+        pt_add_msix_mapping(s, i);
+        /* 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");
+        }
+
+        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);
+        }
+    }
+}
+
+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);
+
+    /* 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]++;
+    }
+
+    /* 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);
+        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,
+           s->msi_trans_en ? "MSI-INTx" : "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 (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) {
+            PT_LOG("Error: Unbinding of interrupt failed! rc=%d\n", rc);
+        }
+    }
+
+    if (s->msi) {
+        pt_msi_disable(s);
+    }
+    if (s->msix) {
+        pt_msix_disable(s);
+    }
+
+    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("msitranslate", XenPCIPassthroughState, msi_trans_cap,
+                        0, true),
+        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..2d43c18
--- /dev/null
+++ b/hw/xen_pci_passthrough.h
@@ -0,0 +1,258 @@
+#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 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 */
+    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;
+
+    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;
+
+    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;
+}
-- 
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 Oct 19 07:22:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:22:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGX21-0005X6-Lz; Wed, 19 Oct 2011 07:22:09 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWep-0001Jc-5T
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:58:14 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319032669!14780!7
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30949 invoked from network); 19 Oct 2011 13:58:07 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:58:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315195200"; d="scan'208";a="18352358"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:58: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; Wed, 19 Oct 2011 09:58:06 -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 p9JDvj1p019274;	Wed, 19 Oct 2011 06:58:05 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Wed, 19 Oct 2011 14:56:53 +0100
Message-ID: <1319032613-10560-11-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Jiang Yunhong <yunhong.jiang@intel.com>,
	Shan Haitao <haitao.shan@intel.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Anthony PERARD <anthony.perard@citrix.com>
Subject: [Xen-devel] [PATCH V2 10/10] Introduce Xen PCI Passthrough,
	MSI (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

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.h     |   20 ++
 hw/xen_pci_passthrough_msi.c |  667 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 690 insertions(+), 0 deletions(-)
 create mode 100644 hw/xen_pci_passthrough_msi.c

diff --git a/Makefile.target b/Makefile.target
index 875a507..76530d9 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -213,6 +213,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.h b/hw/xen_pci_passthrough.h
index 7cb563f..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 */
@@ -257,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_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 */
+
+/*
+ * setup physical msi, but didn't enable it
+ */
+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");
+        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");
+        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);
+
+    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 */
+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 */
+
+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);
+        }
+    }
+
+    /* 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);
+            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));
+            }
+        }
+        /* 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);
+
+    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);
+        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

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:23:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:23:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGX36-0005vR-It; Wed, 19 Oct 2011 07:23:16 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWeo-0001Jb-Rr
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 06:58:14 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319032646!53501308!4
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29213 invoked from network); 19 Oct 2011 13:57:36 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 13:57:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315195200"; d="scan'208";a="167426196"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 09:58:05 -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; Wed, 19 Oct 2011 09:58: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 p9JDvj1o019274;	Wed, 19 Oct 2011 06:58:03 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>
Date: Wed, 19 Oct 2011 14:56:52 +0100
Message-ID: <1319032613-10560-10-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Xen Devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Allen Kay <allen.m.kay@intel.com>, Guy Zana <guy@neocleus.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Anthony PERARD <anthony.perard@citrix.com>
Subject: [Xen-devel] [PATCH V2 09/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

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 | 2553 ++++++++++++++++++++++++++++++++++
 3 files changed, 2556 insertions(+), 0 deletions(-)
 create mode 100644 hw/xen_pci_passthrough_config_init.c

diff --git a/Makefile.target b/Makefile.target
index 0673b51..875a507 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -212,6 +212,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 2d43c18..7cb563f 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..b4238ee
--- /dev/null
+++ b/hw/xen_pci_passthrough_config_init.c
@@ -0,0 +1,2553 @@
+/*
+ * 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) {
+        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);
+
+    /* 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->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];
+        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,
+    },
+};
+
+/********************************
+ * 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");
+        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");
+        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
+ */
+
+/* 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;
+}
+/* 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 */
+    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;
+    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 */
+    {
+        .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,
+    },
+    /* 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,
+        .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,
+    },
+    /* 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,
+    },
+};
+
+/* 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);
+
+    /* setup MSI-INTx translation if support */
+    ret = pt_enable_msi_translate(s);
+
+    /* rebind machine_irq to device */
+    if (ret < 0 && 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 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) {
+            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 Wed Oct 19 07:25:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07: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 1RGX4n-0006Sk-1M; Wed, 19 Oct 2011 07:25:01 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWgc-0001TB-7t
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:00:21 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1319032798!20039!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25615 invoked from network); 19 Oct 2011 13:59:59 -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;
	19 Oct 2011 13:59:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315180800"; 
   d="scan'208";a="8471660"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 13:59: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; Wed, 19 Oct 2011 14:59:59 +0100
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 1RGWgY-0008Tg-D7;
	Wed, 19 Oct 2011 13:59:58 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RGWgY-0000aS-8X;
	Wed, 19 Oct 2011 14:59:58 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9348-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 19 Oct 2011 14:59:58 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9348: 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 9348 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9348/

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-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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  14b369de76ad
baseline version:
 xen                  a33af75083c7

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson.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                                     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=14b369de76ad
+ . 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 14b369de76ad
+ branch=xen-unstable
+ revision=14b369de76ad
+ . 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 14b369de76ad 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 16 changes to 14 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:26:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07: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 1RGX6V-00070d-VL; Wed, 19 Oct 2011 07:26:47 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWli-0001w9-OG
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:05:19 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1319033114!255305!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10532 invoked from network); 19 Oct 2011 14:05:15 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-6.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 14:05:15 -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
	p9JE4Jlw006440
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 14:04:21 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
	p9JE4GYV026234
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 14:04:16 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
	p9JE48XH012107; Wed, 19 Oct 2011 09:04:09 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 07:04:08 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id A1B3E814A1; Wed, 19 Oct 2011 10:04:06 -0400 (EDT)
Date: Wed, 19 Oct 2011 10:04:06 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Konrad Rzeszutek Wilk <konrad@darnok.org>,
	Jeremy Fitzhardinge <jeremy@goop.org>
Message-ID: <20111019140406.GB7313@phenom.dumpdata.com>
References: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
	<4E98BEF5.10801@goop.org> <4E98C6CE.4020508@oracle.com>
	<4E98C8B1.20304@goop.org> <4E98D739.4000705@oracle.com>
	<20111015130552.GC18864@andromeda.dapyr.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111015130552.GC18864@andromeda.dapyr.net>
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.0A02020A.4E9ED8E6.000F:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org, Maxim Uvarov <maxim.uvarov@oracle.com>
Subject: [Xen-devel] Re: [PATCH] XEN_DOMAIN_MEMORY 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

> > >>>What's the rationale?
> > >>>
> > >>>      J
> > >>
> > >>The first patch is actually bug fix. You can not define just "int"
> > >>without description in Kconfig. As the result this option will not be
> > >>visible in menuconfig. Even if you will change it in .config make
> > >>oldconfig will set it up for default value. So you need to add any
> > >>description to it as all others int options have.
> > >
> > >No, that was deliberate, because I don't really think there's a need to
> > >change it.
> > >
> > 
> > From that point of view it's not clear why this option is still in Kconfig?
> 
> Well, we do need to alter it to 512GB. Actually -  putting that extra
> burden on initial pagetables to reserve extra 384 pages might be a bit
> too much. Even thought later on we reclaim it if we do not use it.

Jeremy, without that change, you cannot specify

CONFIG_XEN_MAX_DOMAIN_MEMORY=512

if the distro desires to do so. Well, you can write it in the .config,
but the moment you compile, the oldconfig rewrites it to 128.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:27:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:27:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGX7c-0007O8-Et; Wed, 19 Oct 2011 07:27:56 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWn7-0002As-L5
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:06:47 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319033169!59881833!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27494 invoked from network); 19 Oct 2011 14:06:11 -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; 19 Oct 2011 14:06: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
	p9JE5bUq009873
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 14:05:39 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
	p9JE5XWG005276
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 14:05:33 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
	p9JE5QPP011462; Wed, 19 Oct 2011 09:05:26 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 07:05:26 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 6B242814A1; Wed, 19 Oct 2011 10:05:25 -0400 (EDT)
Date: Wed, 19 Oct 2011 10:05:25 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <ijc@hellion.org.uk>
Subject: Re: [Xen-devel] Re: [PATCH] XEN_DOMAIN_MEMORY options.
Message-ID: <20111019140525.GC7313@phenom.dumpdata.com>
References: <1318631811-21559-1-git-send-email-maxim.uvarov@oracle.com>
	<4E98BEF5.10801@goop.org> <4E98C6CE.4020508@oracle.com>
	<4E98C8B1.20304@goop.org> <4E98D739.4000705@oracle.com>
	<20111015130552.GC18864@andromeda.dapyr.net>
	<1318696968.11016.47.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318696968.11016.47.camel@dagon.hellion.org.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.0A090209.4E9ED934.00C1:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Konrad Rzeszutek Wilk <konrad@darnok.org>,
	Jeremy Fitzhardinge <jeremy@goop.org>,
	xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	Maxim Uvarov <maxim.uvarov@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 Sat, Oct 15, 2011 at 05:42:48PM +0100, Ian Campbell wrote:
> On Sat, 2011-10-15 at 09:05 -0400, Konrad Rzeszutek Wilk wrote:
> > > On 10/14/2011 04:41 PM, Jeremy Fitzhardinge wrote:
> 
> > > >While it would be very silly to put 128GB of actual RAM on a 32-bit
> > > >machine, systems can have non-contiguous RAM placed at high addresses,
> > > >which would no longer be accessible.
> > 
> > Do you have some ideas of which machines that might be?
> 
> Even if you were on such a machine, the discontiguity
> (discontiguousness?) wouldn't ever be reflected in the pseudo-physical
> memory map, would it? So since this variable controls the maximum size
> of the p2m (rather than the m2p) it doesn't need to be larger than the
> maximum sane 32 bit guest size (<64G).

I think it is the other way around. The M2P would not be affected but
the P2M might? The "discontinuity" is in the E820 right? (so mega big
holes in it).

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:29:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:29:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGX8m-0007mp-FR; Wed, 19 Oct 2011 07:29:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWr4-0002fn-40
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:10:51 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1319033445!825308!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23862 invoked from network); 19 Oct 2011 14:10:46 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 14:10:46 -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
	p9JEAdeX015591
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 14:10:41 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
	p9JEAd15009741
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 14:10:39 GMT
Received: from abhmt120.oracle.com (abhmt120.oracle.com [141.146.116.72])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9JEAXv5017992; Wed, 19 Oct 2011 09:10:33 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 07:10:33 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 7575C814A1; Wed, 19 Oct 2011 10:10:32 -0400 (EDT)
Date: Wed, 19 Oct 2011 10:10:32 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Dario Faggioli <raistlin@linux.it>
Subject: Re: [Xen-devel] Issue with PCI-passthrough and pvops
Message-ID: <20111019141032.GB8033@phenom.dumpdata.com>
References: <1318865791.25056.28.camel@Palantir>
	<20111017164020.GE19684@phenom.dumpdata.com>
	<1318982052.2997.19.camel@Palantir>
	<20111019011028.GA19302@phenom.dumpdata.com>
	<1319010037.11016.66.camel@dagon.hellion.org.uk>
	<CAAWQecut9-ouRfZEwmvFYkA8W98XZRFc3LtdPYPyWbhuaZzYiw@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAAWQecut9-ouRfZEwmvFYkA8W98XZRFc3LtdPYPyWbhuaZzYiw@mail.gmail.com>
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.0A090208.4E9EDA61.0145:SCFMA922111,ss=1,re=-4.000,fgs=0
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

On Wed, Oct 19, 2011 at 03:46:26PM +0200, Dario Faggioli wrote:
> On Wed, Oct 19, 2011 at 9:40 AM, Ian Campbell <Ian.Campbell@citrix.com>=
 wrote:
> >> > Guest:
> >> > [ =A0 19.607997] ixgbe: Intel(R) 10 Gigabit PCI Express Network Dr=
iver - version 3.4.8-k
> >> > [ =A0 19.608670] ixgbe: Copyright (c) 1999-2011 Intel Corporation.
> >> > [ =A0 19.609465] ixgbe 0000:00:00.0: device not available (can't r=
eserve [mem 0xdf300000-0xe32fffff 64bit])
> >> > [ =A0 19.610878] ixgbe: probe of 0000:00:00.0 failed with error -2=
2
> >>
> >> Well, that is the problem.
> >
> > Does he need "e820_host=3D1" in his cfg?
> >
> Mmm... If you mean putting that line in my DomU config file
> (I checked 23428:131f19c67d85, and it seems so), that is not
> helping.

That option is usually required if the guest has more than 2GB. As we
would end up setting an E820 that would trample over the PCI hole.
(In this case it looks like part of the PCI hole is DF300000).

Dario,

I've seen this bug before with .. Hm, some similar adapter. I know
that if pass in 'igb.max_vfs=3D2' and passed in the igbvf PCI cards the
guest worked just fine. It just did not like being passed in as a real de=
vice.

Otherwise, older MSI/MSI-X (non SR-IOV) cards worked fine so I never go
further in debugging this.

I would recommend you take a look at the probe function and figure out wh=
y
it can't reserve that region. And easy way to figure that out is to
boot the guest and look in /proc/iomem and see what is in the df30000-e32=
ffffff
region. Perhaps something else is overlapping it?


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:30:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:30:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGX9x-0008AA-5q; Wed, 19 Oct 2011 07:30:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGWsT-0002sS-1m
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:12:18 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319033533!254665!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32099 invoked from network); 19 Oct 2011 14:12:13 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-16.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 14:12:13 -0000
Received: by wyi11 with SMTP id 11so2220601wyi.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 07:12:13 -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:user-agent:date:from:to;
	bh=h8BBKvVFGPw4s9HaJM/LUqNbF6g80k7/kkiyECTD3t0=;
	b=DZxp11vJaEbbcwvJzHteNgnKo366gZw+A9LV/PLB/FXeEQsyVyBphC954lLuKYKQrL
	tVC0LMvsVkc2AJv04++tD91kK/O7VDlbwRnxDxCcTb+GmSDEqLOeG/Anb25I5MLVElP/
	xHdg0440fs9DIlqxBCi/6w5roPbgmKsXheNgI=
Received: by 10.216.164.5 with SMTP id b5mr1464976wel.111.1319033533212;
	Wed, 19 Oct 2011 07:12:13 -0700 (PDT)
Received: from [127.0.0.1] (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id eu16sm10033149wbb.7.2011.10.19.07.12.11
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 19 Oct 2011 07:12:11 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 52c8717d2e0841e08e3569ca7bdac0b8309b6cf2
Message-Id: <52c8717d2e0841e08e35.1319033498@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Wed, 19 Oct 2011 16:11:38 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH v2] libxl: handle the return value of
 wait_for_dev_destroy select and pass it to caller 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 Roger Pau Monne <roger.pau@entel.upc.edu>
# Date 1319033430 -7200
# Node ID 52c8717d2e0841e08e3569ca7bdac0b8309b6cf2
# Parent  a2a3c4d7333ec15b818b3403f148ad61c254ea82
libxl: handle the return value of wait_for_dev_destroy select and pass it to caller function.

Handle the return value of the select call inside wait_for_dev_destroy properly, and return 0 if a device is removed, or ERROR_* if a timeout or error happened. Use the return value of wait_for_dev_destroy inside libxl__device_remove to properly return from that function.

This patch should be applied after Ian Campbell's v3 "libxl: rationalise libxl_device_* APIs".

Signed-off-by: Roger Pau Monne <roger.pau@entel.upc.edu>

diff -r a2a3c4d7333e -r 52c8717d2e08 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl.h	Wed Oct 19 16:10:30 2011 +0200
@@ -221,6 +221,7 @@ enum {
     ERROR_INVAL = -6,
     ERROR_BADFAIL = -7,
     ERROR_GUEST_TIMEDOUT = -8,
+    ERROR_TIMEDOUT = -9,
 };
 
 #define LIBXL_VERSION 0
diff -r a2a3c4d7333e -r 52c8717d2e08 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c	Tue Oct 18 13:36:43 2011 +0100
+++ b/tools/libxl/libxl_device.c	Wed Oct 19 16:10:30 2011 +0200
@@ -367,6 +367,10 @@ int libxl__device_disk_dev_number(const 
     return -1;
 }
 
+/*
+ * Returns 0 if a device is removed, ERROR_* if an error
+ * or timeout occurred.
+ */
 static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
@@ -375,22 +379,41 @@ static int wait_for_dev_destroy(libxl__g
     fd_set rfds;
     char **l1 = NULL;
 
+start:
     rc = 1;
     nfds = xs_fileno(ctx->xsh) + 1;
     FD_ZERO(&rfds);
     FD_SET(xs_fileno(ctx->xsh), &rfds);
-    if (select(nfds, &rfds, NULL, NULL, tv) > 0) {
-        l1 = xs_read_watch(ctx->xsh, &n);
-        if (l1 != NULL) {
-            char *state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
-            if (!state || atoi(state) == 6) {
-                xs_unwatch(ctx->xsh, l1[0], l1[1]);
-                xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
-                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Destroyed device backend at %s", l1[XS_WATCH_TOKEN]);
-                rc = 0;
+    switch (select(nfds, &rfds, NULL, NULL, tv)) {
+        case -1:
+            if (errno == EINTR)
+                goto start;
+            rc = ERROR_FAIL;
+            break;
+        case 0:
+            rc = ERROR_TIMEDOUT;
+            break;
+        default:
+            l1 = xs_read_watch(ctx->xsh, &n);
+            if (l1 != NULL) {
+                char *state = libxl__xs_read(gc, XBT_NULL,
+                                             l1[XS_WATCH_PATH]);
+                if (!state || atoi(state) == 6) {
+                    xs_unwatch(ctx->xsh, l1[0], l1[1]);
+                    xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
+                    LIBXL__LOG(ctx, LIBXL__LOG_DEBUG,
+                               "Destroyed device backend at %s",
+                               l1[XS_WATCH_TOKEN]);
+                    rc = 0;
+                } else {
+                    /* State is not "disconnected", continue waiting... */
+                    goto start;
+                }
+                free(l1);
+            } else {
+                rc = ERROR_FAIL;
             }
-            free(l1);
-        }
+            break;
     }
     return rc;
 }
@@ -436,7 +459,9 @@ retry_transaction:
         struct timeval tv;
         tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
         tv.tv_usec = 0;
-        (void)wait_for_dev_destroy(gc, &tv);
+        rc = wait_for_dev_destroy(gc, &tv);
+        if (rc < 0) /* an error or timeout occurred, clear watches */
+            xs_unwatch(ctx->xsh, state_path, be_path);
         xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
     } else {
         rc = 1; /* Caller must wait_for_dev_destroy */
@@ -542,7 +567,8 @@ int libxl__devices_destroy(libxl__gc *gc
         tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
         tv.tv_usec = 0;
         while (n_watches > 0) {
-            if (wait_for_dev_destroy(gc, &tv)) {
+            if (wait_for_dev_destroy(gc, &tv) < 0) {
+                /* function returned ERROR_* */
                 break;
             } else {
                 n_watches--;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:31:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:31:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGXAj-00006o-Rb; Wed, 19 Oct 2011 07:31:09 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGX3I-0005z5-Dq
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:23:28 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319034205!29886989!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29564 invoked from network); 19 Oct 2011 14:23:25 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-3.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 19 Oct 2011 14:23:25 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319034205; l=1852;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=gwDNlHGDoxnpQl9wOPbvUuxZz0s=;
	b=sZL5N0aYkWAcBwl8zd0ODz1NqN+qeivyvSmJyl7YtSvw4mrjxbygxcRa6BFlBNvPfXK
	Maed7836Ps4UIXHfVg6GpHuNa9VVbq3SBXiv7ytXMevt6QW/SAZKMKP1cu80hO0RrLvy/
	DvGJJIYlICKALKaARebrWDMSU44EYxMkELo=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFIhy0IG8M=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-069-068.pools.arcor-ip.net [88.65.69.68])
	by post.strato.de (mrclete mo52) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id B01d92n9JDR02A
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 16:23:22 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 1ADA618637
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 16:23:22 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f835012a0c062e70495aa341d41e3970a121bf6a
Message-Id: <f835012a0c062e70495a.1319034201@probook.site>
In-Reply-To: <patchbomb.1319034200@probook.site>
References: <patchbomb.1319034200@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 19 Oct 2011 16:23:21 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 1 of 3] xenpaging: check p2mt in p2m_mem_paging
	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 Olaf Hering <olaf@aepfle.de>
# Date 1319034159 -7200
# Node ID f835012a0c062e70495aa341d41e3970a121bf6a
# Parent  6880bfc48504db31e2680de01bfadf4db3b0b7a0
xenpaging: check p2mt in p2m_mem_paging functions

Add checks to forward the p2m_ram_paging* state properly during page-in.

Resume can be called several times if several vcpus called populate for
the gfn. Finish resume only once.

v2:
 - remove debug output for non-p2m_ram_rw case

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 6880bfc48504 -r f835012a0c06 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -851,16 +851,22 @@ int p2m_mem_paging_prep(struct domain *d
     p2m_access_t a;
     mfn_t mfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
-    int ret = -ENOMEM;
+    int ret;
 
     p2m_lock(p2m);
 
     mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
 
+    ret = -ENOENT;
+    /* Allow only missing pages */
+    if ( p2mt != p2m_ram_paging_in_start )
+        goto out;
+
     /* Allocate a page if the gfn does not have one yet */
     if ( !mfn_valid(mfn) )
     {
         /* Get a free page */
+        ret = -ENOMEM;
         page = alloc_domheap_page(p2m->domain, 0);
         if ( unlikely(page == NULL) )
             goto out;
@@ -896,9 +902,13 @@ void p2m_mem_paging_resume(struct domain
     {
         p2m_lock(p2m);
         mfn = p2m->get_entry(p2m, rsp.gfn, &p2mt, &a, p2m_query, NULL);
-        set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
-        set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
-        audit_p2m(p2m, 1);
+        /* 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, 0, p2m_ram_rw, a);
+            set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
+            audit_p2m(p2m, 1);
+        }
         p2m_unlock(p2m);
     }
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:31:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:31:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGXBW-0000UZ-C3; Wed, 19 Oct 2011 07:31:58 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGX3M-00060U-CS
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:23:32 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-182.messagelabs.com!1319034209!23397!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6393 invoked from network); 19 Oct 2011 14:23:29 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-2.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	19 Oct 2011 14:23:29 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319034208; l=454;
	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=ChEg5rozyndfg25Ju2z5jn4/pjc=;
	b=XzrUyV1IpdVKcSSfNYw+QQuRchJWw0EywJ7ynCI3zQc1rW4cCmNO3bOJACso8te9hh6
	ezHfMVYu5b0vW/XL4YX/VRbNWOxmvhKrodmMaiIotytkZO3TqmDjosKG1UpIwaBYuEVrQ
	wmEpSyhM17hZtuDV+yscfccX8wqWIvTtC0Q=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFIhy0IG8M=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-069-068.pools.arcor-ip.net [88.65.69.68])
	by smtp.strato.de (jimi mo24) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id v01bb3n9JDBL73
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 16:23:22 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id E1D1018636
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 16:23:21 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1319034200@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 19 Oct 2011 16:23:20 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 0 of 3] xenpaging fixes for xen-unstable
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 changes for xenpaging add checking for the p2mt in the page-in
path to make the functions more robust, add some documentation to each
p2m_mem_paging function, and disable paging in a PoD guest.

Please review and apply.

Olaf


 tools/xenpaging/xenpaging.c |    3 +
 xen/arch/x86/mm/mem_event.c |    6 ++
 xen/arch/x86/mm/p2m.c       |  111 ++++++++++++++++++++++++++++++++++++++++++--
 3 files changed, 116 insertions(+), 4 deletions(-)


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:32:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:32:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGXCS-00012g-8t; Wed, 19 Oct 2011 07:32:56 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGX3R-00061r-0y
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:23:37 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319034202!51718799!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10668 invoked from network); 19 Oct 2011 14:23:22 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-15.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 19 Oct 2011 14:23:22 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319034213; l=5697;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=CYfF80oZXEOeug7F1S9EccvpdAQ=;
	b=FTUye+NY4OevAKpvQRAnApFcGDuk7/iB9x9DI7Mht1aIhsT44uG+shvG76JTvyueYb8
	zPMgZw+pOxHMBqS9ruwePR5aHCdb/4axSJvqRWvz99yTt06Wqyt8YRJNByS/vitH9pqM1
	g8tVSV+J9AkIJyG9Tj9qJ+GRLK4buuYS1h4=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFIhy0IG8M=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-069-068.pools.arcor-ip.net [88.65.69.68])
	by post.strato.de (mrclete mo55) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id y01e8an9JCpPFo
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 16:23:23 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 4964B18638
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 16:23:22 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: cc6184fcd784f94165417073935c5fd0c4b4a76e
Message-Id: <cc6184fcd784f9416541.1319034202@probook.site>
In-Reply-To: <patchbomb.1319034200@probook.site>
References: <patchbomb.1319034200@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 19 Oct 2011 16:23:22 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 2 of 3] xenpaging: document p2m_mem_paging
	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 Olaf Hering <olaf@aepfle.de>
# Date 1319034159 -7200
# Node ID cc6184fcd784f94165417073935c5fd0c4b4a76e
# Parent  f835012a0c062e70495aa341d41e3970a121bf6a
xenpaging: document p2m_mem_paging functions

Add some documentation for each of the p2m_mem_paging functions to describe
what they ought to do.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r f835012a0c06 -r cc6184fcd784 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -668,6 +668,24 @@ set_shared_p2m_entry(struct domain *d, u
 }
 
 #ifdef __x86_64__
+/**
+ * p2m_mem_paging_nominate - Mark a guest page as to-be-paged-out
+ * @d: guest domain
+ * @gfn: guest page to nominate
+ *
+ * Returns 0 for success or negative errno values if gfn is not pageable.
+ *
+ * p2m_mem_paging_nominate() is called by the pager and checks if a guest page
+ * can be paged out. If the following conditions are met the p2mt will be
+ * changed:
+ * - the gfn is backed by a mfn
+ * - the p2mt of the gfn is pageable
+ * - the mfn is not used for IO
+ * - the mfn has exactly one user and has no special meaning
+ *
+ * Once the p2mt is changed the page is readonly for the guest.  On success the
+ * pager can write the page contents to disk and later evict the page.
+ */
 int p2m_mem_paging_nominate(struct domain *d, unsigned long gfn)
 {
     struct page_info *page;
@@ -714,6 +732,25 @@ int p2m_mem_paging_nominate(struct domai
     return ret;
 }
 
+/**
+ * p2m_mem_paging_evict - Mark a guest page as paged-out
+ * @d: guest domain
+ * @gfn: guest page to evict
+ *
+ * Returns 0 for success or negative errno values if eviction is not possible.
+ *
+ * p2m_mem_paging_evict() is called by the pager and will free a guest page and
+ * release it back to Xen. If the following conditions are met the page can be
+ * freed:
+ * - the gfn is backed by a mfn
+ * - the gfn was nominated
+ * - the mfn has still exactly one user and has no special meaning
+ *
+ * After successful nomination some other process could have mapped the page. In
+ * this case eviction can not be done. If the gfn was populated before the pager
+ * could evict it, eviction can not be done either. In this case the gfn is
+ * still backed by a mfn.
+ */
 int p2m_mem_paging_evict(struct domain *d, unsigned long gfn)
 {
     struct page_info *page;
@@ -773,6 +810,15 @@ int p2m_mem_paging_evict(struct domain *
     return ret;
 }
 
+/**
+ * p2m_mem_paging_drop_page - Tell pager to drop its reference to a paged page
+ * @d: guest domain
+ * @gfn: guest page to drop
+ *
+ * p2m_mem_paging_drop_page() will notify the pager that a paged-out gfn was
+ * released by the guest. The pager is supposed to drop its reference of the
+ * gfn.
+ */
 void p2m_mem_paging_drop_page(struct domain *d, unsigned long gfn)
 {
     struct vcpu *v = current;
@@ -791,6 +837,27 @@ void p2m_mem_paging_drop_page(struct dom
     }
 }
 
+/**
+ * p2m_mem_paging_populate - Tell pager to populete a paged page
+ * @d: guest domain
+ * @gfn: guest page in paging state
+ *
+ * p2m_mem_paging_populate() will notify the pager that a page in any of the
+ * paging states needs to be written back into the guest.
+ * This function needs to be called whenever gfn_to_mfn() returns any of the p2m
+ * paging types because the gfn may not be backed by a mfn.
+ *
+ * The gfn can be in any of the paging states, but the pager needs only be
+ * notified when the gfn is in the paging-out path (paging_out or paged).  This
+ * function may be called more than once from several vcpus. If the vcpu belongs
+ * to the guest, the vcpu must be stopped and the pager notified that the vcpu
+ * was stopped. The pager needs to handle several requests for the same gfn.
+ *
+ * If the gfn is not in the paging-out path and the vcpu does not belong to the
+ * guest, nothing needs to be done and the function assumes that a request was
+ * already sent to the pager. In this case the caller has to try again until the
+ * gfn is fully paged in again.
+ */
 void p2m_mem_paging_populate(struct domain *d, unsigned long gfn)
 {
     struct vcpu *v = current;
@@ -844,6 +911,17 @@ void p2m_mem_paging_populate(struct doma
     mem_event_put_request(d, &d->mem_paging, &req);
 }
 
+/**
+ * p2m_mem_paging_prep - Allocate a new page for the guest
+ * @d: guest domain
+ * @gfn: guest page in paging state
+ *
+ * p2m_mem_paging_prep() will allocate a new page for the guest if the gfn is
+ * not backed by a mfn. It is called by the pager.
+ * It is required that the gfn was already populated. The gfn may already have a
+ * mfn if populate was called for  gfn which was nominated but not evicted. In
+ * this case only the p2mt needs to be forwarded.
+ */
 int p2m_mem_paging_prep(struct domain *d, unsigned long gfn)
 {
     struct page_info *page;
@@ -886,6 +964,21 @@ int p2m_mem_paging_prep(struct domain *d
     return ret;
 }
 
+/**
+ * p2m_mem_paging_resume - Resume guest gfn and vcpus
+ * @d: guest domain
+ * @gfn: guest page in paging state
+ *
+ * p2m_mem_paging_resume() will forward the p2mt of a gfn to ram_rw and all
+ * waiting vcpus will be unpaused again. It is called by the pager.
+ * 
+ * The gfn was previously either evicted and populated, or nominated and
+ * populated. If the page was evicted the p2mt will be p2m_ram_paging_in. If
+ * the page was just nominated the p2mt will be p2m_ram_paging_in_start because
+ * the pager did not call p2m_mem_paging_prep().
+ *
+ * If the gfn was dropped the vcpu needs to be unpaused.
+ */
 void p2m_mem_paging_resume(struct domain *d)
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:34:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:34:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGXDw-0001kX-VQ; Wed, 19 Oct 2011 07:34:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGX3V-00063Y-IH
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:23:41 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-10.tower-182.messagelabs.com!1319034217!17404!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14837 invoked from network); 19 Oct 2011 14:23:38 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-10.tower-182.messagelabs.com with DES-CBC3-SHA encrypted SMTP;
	19 Oct 2011 14:23:38 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319034217; l=1520;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=yPepE48zpmVMussofbSnZ9PAzFY=;
	b=yI0dljOP/DCpSq+MgvRrCQKry3dOpu123CeUSFbmjounCHT5GP8XObFrDVbJau2WeO/
	QeDVxYF11w7AbmsppQmEAI6kzlGvFCDg0Bcf0MbXxzGDe1weO6cEBYPUqcu1jQYM6s8LE
	t12m7E7bTmQQhWRazrfW0yKhteY1aiUSwzU=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFIhy0IG8M=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-069-068.pools.arcor-ip.net [88.65.69.68])
	by smtp.strato.de (fruni mo14) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id d02b6dn9JDahdX
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 16:23:23 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 6E8E518639
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 16:23:22 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: d56219addb9e921a02bce5fa8a97c43eba9bc914
Message-Id: <d56219addb9e921a02bc.1319034203@probook.site>
In-Reply-To: <patchbomb.1319034200@probook.site>
References: <patchbomb.1319034200@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Wed, 19 Oct 2011 16:23:23 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 3 of 3] xenpaging: disallow paging in a PoD 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

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1319034160 -7200
# Node ID d56219addb9e921a02bce5fa8a97c43eba9bc914
# Parent  cc6184fcd784f94165417073935c5fd0c4b4a76e
xenpaging: disallow paging in a PoD guest

Disallow xenpaging in a PoD guest until coexistance between the two features
is properly implemented.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r cc6184fcd784 -r d56219addb9e tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -246,6 +246,9 @@ static xenpaging_t *xenpaging_init(domid
             case ENODEV:
                 ERROR("EPT not supported for this guest");
                 break;
+            case EXDEV:
+                ERROR("xenpaging not supported in a PoD guest");
+                break;
             default:
                 ERROR("Error initialising shared page: %s", strerror(errno));
                 break;
diff -r cc6184fcd784 -r d56219addb9e xen/arch/x86/mm/mem_event.c
--- a/xen/arch/x86/mm/mem_event.c
+++ b/xen/arch/x86/mm/mem_event.c
@@ -253,6 +253,7 @@ 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) )
@@ -262,6 +263,11 @@ int mem_event_domctl(struct domain *d, x
         if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
             break;
 
+        rc = -EXDEV;
+        /* Disallow paging in a PoD guest */
+        if ( p2m->pod.entry_count )
+            break;
+
         switch( mec->op )
         {
         case XEN_DOMCTL_MEM_EVENT_OP_PAGING_ENABLE:

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:35:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07: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 1RGXEz-0002Bh-Ow; Wed, 19 Oct 2011 07:35:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGX3l-00067H-16
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:23:57 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319034222!42358189!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26686 invoked from network); 19 Oct 2011 14:23:42 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-11.tower-27.messagelabs.com with SMTP;
	19 Oct 2011 14:23:42 -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
	p9JENi7q024461; Wed, 19 Oct 2011 14:23:44 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 p9JENduk012408; 
	Wed, 19 Oct 2011 10:23:39 -0400
Message-ID: <4E9EDD7B.10202@tycho.nsa.gov>
Date: Wed, 19 Oct 2011 10:23:55 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 2/2] xen/gnt{dev,
	alloc}: reserve event channels for notify
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
	<1319016278.3385.88.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319016278.3385.88.camel@zakaz.uk.xensource.com>
X-Enigmail-Version: 1.3
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: "Keir \(Xen.org\)" <keir@xen.org>, "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	"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 10/19/2011 05:24 AM, Ian Campbell wrote:
> On Tue, 2011-10-18 at 22:04 +0100, Daniel De Graaf wrote:
>> When using the unmap notify ioctl, the event channel used for
>> notification needs to be reserved to avoid it being deallocated prior to
>> sending the notification.
>>
>> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
>> ---
>>  drivers/xen/gntalloc.c |   14 +++++++++++++-
>>  drivers/xen/gntdev.c   |   11 +++++++++++
>>  2 files changed, 24 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
>> index f6832f4..a739fb1 100644
>> --- a/drivers/xen/gntalloc.c
>> +++ b/drivers/xen/gntalloc.c
>> @@ -178,8 +178,10 @@ static void __del_gref(struct gntalloc_gref *gref)
>>  		tmp[gref->notify.pgoff] = 0;
>>  		kunmap(gref->page);
>>  	}
>> -	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
>> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
>>  		notify_remote_via_evtchn(gref->notify.event);
>> +		evtchn_put(gref->notify.event);
>> +	}
>>  
>>  	gref->notify.flags = 0;
>>  
>> @@ -396,6 +398,16 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
>>  		goto unlock_out;
>>  	}
>>  
>> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
>> +		if (evtchn_get(op.event_channel_port)) {
>> +			rc = -EINVAL;
>> +			goto unlock_out;
>> +		}
>> +	}
>> +
>> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
>> +		evtchn_put(gref->notify.event);
>> +
> 
> If the gref gets torn down here won't we notify and drop the reference
> on the wrong evtchn, leading to a double free? If we defer the drop
> until after gref->notify.event has been updated then this goes away.
> 
> Ian.

This evtchn_put will only be called in the case where the unmap_notify
is being changed and already had an event channel reference. This reference
must be dropped prior to changing gref->notify.event or we will leak
the old event channel.

> 
>>  	gref->notify.flags = op.action;
>>  	gref->notify.pgoff = pgoff;
>>  	gref->notify.event = op.event_channel_port;
>> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
>> index f914b26..cfcc890 100644
>> --- a/drivers/xen/gntdev.c
>> +++ b/drivers/xen/gntdev.c
>> @@ -190,6 +190,7 @@ static void gntdev_put_map(struct grant_map *map)
>>  
>>  	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
>>  		notify_remote_via_evtchn(map->notify.event);
>> +		evtchn_put(map->notify.event);
>>  	}
>>  
>>  	if (map->pages) {
>> @@ -596,6 +597,16 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
>>  		goto unlock_out;
>>  	}
>>  
>> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
>> +		if (evtchn_get(op.event_channel_port)) {
>> +			rc = -EINVAL;
>> +			goto unlock_out;
>> +		}
>> +	}
>> +
>> +	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
>> +		evtchn_put(map->notify.event);
>> +
>>  	map->notify.flags = op.action;
>>  	map->notify.addr = op.index - (map->index << PAGE_SHIFT);
>>  	map->notify.event = op.event_channel_port;
> 
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:45:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:45:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGXOw-0002lh-Ab; Wed, 19 Oct 2011 07:45:50 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGXOI-0002ZQ-Uw
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:45:11 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1319035507!858035!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26546 invoked from network); 19 Oct 2011 14:45:07 -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;
	19 Oct 2011 14:45:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315180800"; 
   d="scan'208";a="8473197"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 14:45:07 +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, 19 Oct 2011 15:45:07 +0100
Subject: Re: [Xen-devel] [PATCH 2/2] xen/gnt{dev,alloc}: reserve event
	channels for notify
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Wed, 19 Oct 2011 15:45:06 +0100
In-Reply-To: <4E9EDD7B.10202@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
	<1319016278.3385.88.camel@zakaz.uk.xensource.com>
	<4E9EDD7B.10202@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319035507.3385.105.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Keir \(Xen.org\)" <keir@xen.org>, "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	"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 Wed, 2011-10-19 at 15:23 +0100, Daniel De Graaf wrote:
> On 10/19/2011 05:24 AM, Ian Campbell wrote:
> > On Tue, 2011-10-18 at 22:04 +0100, Daniel De Graaf wrote:
> >> When using the unmap notify ioctl, the event channel used for
> >> notification needs to be reserved to avoid it being deallocated prior to
> >> sending the notification.
> >>
> >> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> >> ---
> >>  drivers/xen/gntalloc.c |   14 +++++++++++++-
> >>  drivers/xen/gntdev.c   |   11 +++++++++++
> >>  2 files changed, 24 insertions(+), 1 deletions(-)
> >>
> >> diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
> >> index f6832f4..a739fb1 100644
> >> --- a/drivers/xen/gntalloc.c
> >> +++ b/drivers/xen/gntalloc.c
> >> @@ -178,8 +178,10 @@ static void __del_gref(struct gntalloc_gref *gref)
> >>  		tmp[gref->notify.pgoff] = 0;
> >>  		kunmap(gref->page);
> >>  	}
> >> -	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
> >> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
> >>  		notify_remote_via_evtchn(gref->notify.event);
> >> +		evtchn_put(gref->notify.event);
> >> +	}
> >>  
> >>  	gref->notify.flags = 0;
> >>  
> >> @@ -396,6 +398,16 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
> >>  		goto unlock_out;
> >>  	}
> >>  
> >> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
> >> +		if (evtchn_get(op.event_channel_port)) {
> >> +			rc = -EINVAL;
> >> +			goto unlock_out;
> >> +		}
> >> +	}
> >> +
> >> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
> >> +		evtchn_put(gref->notify.event);
> >> +
> > 
> > If the gref gets torn down here won't we notify and drop the reference
> > on the wrong evtchn, leading to a double free? If we defer the drop
> > until after gref->notify.event has been updated then this goes away.
> > 
> > Ian.
> 
> This evtchn_put will only be called in the case where the unmap_notify
> is being changed and already had an event channel reference. This reference
> must be dropped prior to changing gref->notify.event or we will leak
> the old event channel.

More importantly I see now that there is a lock protecting all this
stuff so everything is ok.

Ian.

> 
> > 
> >>  	gref->notify.flags = op.action;
> >>  	gref->notify.pgoff = pgoff;
> >>  	gref->notify.event = op.event_channel_port;
> >> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
> >> index f914b26..cfcc890 100644
> >> --- a/drivers/xen/gntdev.c
> >> +++ b/drivers/xen/gntdev.c
> >> @@ -190,6 +190,7 @@ static void gntdev_put_map(struct grant_map *map)
> >>  
> >>  	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
> >>  		notify_remote_via_evtchn(map->notify.event);
> >> +		evtchn_put(map->notify.event);
> >>  	}
> >>  
> >>  	if (map->pages) {
> >> @@ -596,6 +597,16 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
> >>  		goto unlock_out;
> >>  	}
> >>  
> >> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
> >> +		if (evtchn_get(op.event_channel_port)) {
> >> +			rc = -EINVAL;
> >> +			goto unlock_out;
> >> +		}
> >> +	}
> >> +
> >> +	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
> >> +		evtchn_put(map->notify.event);
> >> +
> >>  	map->notify.flags = op.action;
> >>  	map->notify.addr = op.index - (map->index << PAGE_SHIFT);
> >>  	map->notify.event = op.event_channel_port;
> > 
> > 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:47:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:47:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGXQo-0003B5-A9; Wed, 19 Oct 2011 07:47:46 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGXQI-0002yG-KT
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:47:14 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319035630!35924373!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1518 invoked from network); 19 Oct 2011 14:47:11 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 14:47:11 -0000
Received: by iaen33 with SMTP id n33so2582761iae.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 07:47:09 -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=TOsevOlUwrd5c8ZvE47ypmLzU2aNnxpUcRkX/waEAiY=;
	b=pGfun1wNjCjCpMOXBmmg1neM9S1O1y4yltwNx1cbw5Lukhk3qMvJw+d1N+/BdX0u8u
	GaihwBXjonJbKOtsmievc+OcXEULlQThytljtaRJ2YhOvy4iMZUuEftQuOfLBI7dD2do
	koWYCqBYzJ2NPfBeZFuFZlXTXEPgzOZ1uenEQ=
MIME-Version: 1.0
Received: by 10.231.68.130 with SMTP id v2mr2933186ibi.71.1319035629768; Wed,
	19 Oct 2011 07:47:09 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Wed, 19 Oct 2011 07:47:09 -0700 (PDT)
In-Reply-To: <4D9AED3E0200007800039F36@vpn.id2.novell.com>
References: <4D9AED3E0200007800039F36@vpn.id2.novell.com>
Date: Wed, 19 Oct 2011 15:47:09 +0100
X-Google-Sender-Auth: gKsHnwGCOJCNKv3WZOzXVSPuOg8
Message-ID: <CAFLBxZbGRJpJZ4KzRb73rkXO3oeqOwo8z4rTO6g7Xu-4VbjbqA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 4/6] x86: split struct domain
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Jan Beulich <JBeulich@novell.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

On Tue, Apr 5, 2011 at 9:21 AM, Jan Beulich <JBeulich@novell.com> wrote:
> This is accomplished by converting a couple of embedded arrays (in one
> case a structure containing an array) into separately allocated
> pointers, and (just as for struct arch_vcpu in a prior patch) overlaying
> some PV-only fields with HVM-only ones.
>
> One particularly noteworthy change in the opposite direction is that of
> PITState - this field so far lived in the HVM-only portion, but is being
> used by PV guests too, and hence needed to be moved out of struct
> hvm_domain.
>
> The change to XENMEM_set_memory_map (and hence libxl__build_pre() and
> the movement of the E820 related pieces to struct pv_domain) are subject
> to a positive response to a query sent to xen-devel regarding the need
> for this to happen for HVM guests (see
> http://lists.xensource.com/archives/html/xen-devel/2011-03/msg01848.html).

Just a heads-up, XenServer apparently does call XENMEM_set_memory_map
for HVM guests.  I'll take a look and see if it's actually necessary
or not, and if so, revert the part of the patch that moves the e820
stuff into a pv-specific structure.

 -George

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:49:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:49:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGXSR-0003Zw-Bq; Wed, 19 Oct 2011 07:49:27 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGXRz-0003N3-LO
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:49:00 -0700
X-Env-Sender: peter.maydell@linaro.org
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319035735!29890880!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13101 invoked from network); 19 Oct 2011 14:48:56 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 14:48:56 -0000
Received: by qabg1 with SMTP id g1so1753733qab.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 07:48:55 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.224.98.8 with SMTP id o8mr5744526qan.79.1319035735288; Wed, 19
	Oct 2011 07:48:55 -0700 (PDT)
Received: by 10.224.19.136 with HTTP; Wed, 19 Oct 2011 07:48:55 -0700 (PDT)
In-Reply-To: <1319032613-10560-2-git-send-email-anthony.perard@citrix.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
	<1319032613-10560-2-git-send-email-anthony.perard@citrix.com>
Date: Wed, 19 Oct 2011 15:48:55 +0100
Message-ID: <CAFEAcA_jX8t_8UtKOodXAOD-Arz2WPX71vWrLBZwT_4ODG_d0g@mail.gmail.com>
From: Peter Maydell <peter.maydell@linaro.org>
To: Anthony PERARD <anthony.perard@citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Alex Williamson <alex.williamson@redhat.com>,
	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 V2 01/10] configure: Introduce
	--enable-xen-pci-passthrough.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 19 October 2011 14:56, Anthony PERARD <anthony.perard@citrix.com> wrote:
> +if test "$xen_pci_passthrough" !=3D "no"; then
> + =C2=A0if test "$xen" =3D "yes" -a "$linux" =3D "yes"; then
> + =C2=A0 =C2=A0xen_pci_passthrough=3Dyes
> + =C2=A0else
> + =C2=A0 =C2=A0if test "$xen_pci_passthrough" =3D "yes"; then
> + =C2=A0 =C2=A0 =C2=A0feature_not_found "Xen PCI Passthrough without Xen =
or not on linux"
> + =C2=A0 =C2=A0fi
> + =C2=A0 =C2=A0xen_pci_passthrough=3Dno
> + =C2=A0fi
> +fi

The -a flag to test is obsolete -- don't use it in new code.
This is a bit of a misuse of the feature_not_found function IMHO.
(Also, Linux needs a capital letter.)

-- PMM

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 07:54:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 07:54:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGXXi-0004hn-QI; Wed, 19 Oct 2011 07:54:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGXW5-00043U-Lc
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 07:53:13 -0700
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319035989!826785!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1365 invoked from network); 19 Oct 2011 14:53:10 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-14.tower-21.messagelabs.com with SMTP;
	19 Oct 2011 14:53:10 -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 p9JEr7pC019763
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 10:53:07 -0400
Received: from [10.34.1.169] (dhcp-1-169.brq.redhat.com [10.34.1.169])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9JEr5cE022672; Wed, 19 Oct 2011 10:53:05 -0400
Message-ID: <4E9EE4A5.60904@redhat.com>
Date: Wed, 19 Oct 2011 16:54:29 +0200
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>
	<4E9E9D97020000780005C1DE@nat28.tlf.novell.com>
In-Reply-To: <4E9E9D97020000780005C1DE@nat28.tlf.novell.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.12
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 10/19/11 09:51, 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().
>
> As event_handler is being checked to be non-zero, shouldn't the
> code you remove simply become conditional (upon event_handler
> being zero)?

I think that wouldn't be hard to implement, but I'm afraid the paragraph 
you quoted from my proposed commit message could be wrong -- perhaps 
it's not the event_handler callback that cranks the idle time counter. 
Please see

https://bugzilla.redhat.com/show_bug.cgi?id=624756#c26

In short,

(a) idle time is increased in cpu_idle(), which seems to be running as a 
standalone kernel thread;

(b) the event_handler I found invoked from xen_timer_interrupt() is 
hrtimer_interrupt();

(c) I couldn't figure out if cpu_idle() keeps waking up "on its own", or 
if it needs periodic kicks from hrtimer_interrupt() (executed by some 
other thread).

Thank you
Laszlo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 08:07:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 08:07:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGXk5-00067m-5E; Wed, 19 Oct 2011 08:07:41 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGXeB-0005kA-4S
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 08:01:47 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319036467!49809377!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10046 invoked from network); 19 Oct 2011 15:01:07 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-5.tower-27.messagelabs.com with SMTP;
	19 Oct 2011 15:01:07 -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
	p9JF1UNh000813; Wed, 19 Oct 2011 15:01:30 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 p9JF1UOd015375; 
	Wed, 19 Oct 2011 11:01:30 -0400
Message-ID: <4E9EE659.8090600@tycho.nsa.gov>
Date: Wed, 19 Oct 2011 11:01:45 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for
	comms
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319015064.3385.80.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319015064.3385.80.camel@zakaz.uk.xensource.com>
X-Enigmail-Version: 1.3
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <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 10/19/2011 05:04 AM, Ian Campbell wrote:
> On Tue, 2011-10-18 at 21:26 +0100, Daniel De Graaf wrote:
>> For proper grant mappings, HVM guests require pages allocated using
>> alloc_xenballooned_pages instead of alloc_vm_area.
>>
>> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
>> ---
>>  drivers/net/xen-netback/common.h  |    4 ++--
>>  drivers/net/xen-netback/netback.c |   34 ++++++++++++++++++++--------------
>>  2 files changed, 22 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
>> index 161f207..d5ee9d1 100644
>> --- a/drivers/net/xen-netback/common.h
>> +++ b/drivers/net/xen-netback/common.h
>> @@ -70,8 +70,8 @@ struct xenvif {
>>  	/* The shared rings and indexes. */
>>  	struct xen_netif_tx_back_ring tx;
>>  	struct xen_netif_rx_back_ring rx;
>> -	struct vm_struct *tx_comms_area;
>> -	struct vm_struct *rx_comms_area;
>> +	struct page *tx_comms_page;
>> +	struct page *rx_comms_page;
> 
> This will conflict with David Vrabel's patch "net: xen-netback: use API
> provided by xenbus module to map rings", which I've just noticed hasn't
> been committed anywhere.
> 
> I suspect that building on David's patches (that series does something
> similar to blkback too) will greatly simplify this one since you can
> just patch xenbus_map_ring_valloc and friends.

Looks like that should be possible; I didn't see that there was already
an attempt to centralize the mappings.

It seems like the best place to modify is xen_alloc_vm_area, which should
be used in place of alloc_vm_area for grant mappings. On HVM, this area
needs valid PFNs allocated in the guest, which are allocated from the
balloon driver.

> Could you also explain where the requirement to use xenballooned pages
> and not alloc_vm_area comes from in your commit message.

(Will move to commit message). In PV guests, it is sufficient to only
reserve kernel address space for grant mappings because Xen modifies the
mappings directly. HVM guests require that Xen modify the GFN-to-MFN
mapping, so the pages being remapped must already be allocated. Pages
obtained from alloc_xenballooned_pages have valid GFNs not currently
mapped to an MFN, so are available to be used in grant mappings.

> David, I guess you should resend your series now that everyone is happy
> with it. If you cc the netback one to netdev@ with my Ack then Dave
> Miller will pick it up into his tree (it stands alone, right?). The
> blkback and grant-table ones go via Konrad I think. I suspect the last
> one needs to go via akpm, or at least with his Ack.
> 
>>  
>>  	/* Frontend feature information. */
>>  	u8 can_sg:1;
>> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
>> index fd00f25..f35e07c 100644
>> --- a/drivers/net/xen-netback/netback.c
>> +++ b/drivers/net/xen-netback/netback.c
>> @@ -42,6 +42,7 @@
>>  
>>  #include <xen/events.h>
>>  #include <xen/interface/memory.h>
>> +#include <xen/balloon.h>
>>  
>>  #include <asm/xen/hypercall.h>
>>  #include <asm/xen/page.h>
>> @@ -1578,9 +1579,11 @@ static int xen_netbk_kthread(void *data)
>>  void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
>>  {
>>  	struct gnttab_unmap_grant_ref op;
>> +	void *addr;
>>  
>>  	if (vif->tx.sring) {
>> -		gnttab_set_unmap_op(&op, (unsigned long)vif->tx_comms_area->addr,
>> +		addr = pfn_to_kaddr(page_to_pfn(vif->tx_comms_page));
>> +		gnttab_set_unmap_op(&op, (unsigned long)addr,
>>  				    GNTMAP_host_map, vif->tx_shmem_handle);
>>  
>>  		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
>> @@ -1588,16 +1591,17 @@ void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
>>  	}
>>  
>>  	if (vif->rx.sring) {
>> -		gnttab_set_unmap_op(&op, (unsigned long)vif->rx_comms_area->addr,
>> +		addr = pfn_to_kaddr(page_to_pfn(vif->rx_comms_page));
>> +		gnttab_set_unmap_op(&op, (unsigned long)addr,
>>  				    GNTMAP_host_map, vif->rx_shmem_handle);
>>  
>>  		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
>>  			BUG();
>>  	}
>> -	if (vif->rx_comms_area)
>> -		free_vm_area(vif->rx_comms_area);
>> -	if (vif->tx_comms_area)
>> -		free_vm_area(vif->tx_comms_area);
>> +	if (vif->rx_comms_page)
>> +		free_xenballooned_pages(1, &vif->rx_comms_page);
>> +	if (vif->tx_comms_page)
>> +		free_xenballooned_pages(1, &vif->tx_comms_page);
>>  }
>>  
>>  int xen_netbk_map_frontend_rings(struct xenvif *vif,
>> @@ -1610,15 +1614,19 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>>  
>>  	int err = -ENOMEM;
>>  
>> -	vif->tx_comms_area = alloc_vm_area(PAGE_SIZE);
>> -	if (vif->tx_comms_area == NULL)
>> +	if (alloc_xenballooned_pages(1, &vif->tx_comms_page))
>>  		goto err;
>>  
>> -	vif->rx_comms_area = alloc_vm_area(PAGE_SIZE);
>> -	if (vif->rx_comms_area == NULL)
>> +	txs = (struct xen_netif_tx_sring *)pfn_to_kaddr(page_to_pfn(
>> +			vif->tx_comms_page));
>> +
>> +	if (alloc_xenballooned_pages(1, &vif->rx_comms_page))
>>  		goto err;
>>  
>> -	gnttab_set_map_op(&op, (unsigned long)vif->tx_comms_area->addr,
>> +	rxs = (struct xen_netif_rx_sring *)pfn_to_kaddr(page_to_pfn(
>> +			vif->rx_comms_page));
>> +
>> +	gnttab_set_map_op(&op, (unsigned long)txs,
>>  			  GNTMAP_host_map, tx_ring_ref, vif->domid);
>>  
>>  	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> @@ -1635,10 +1643,9 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>>  	vif->tx_shmem_ref    = tx_ring_ref;
>>  	vif->tx_shmem_handle = op.handle;
>>  
>> -	txs = (struct xen_netif_tx_sring *)vif->tx_comms_area->addr;
>>  	BACK_RING_INIT(&vif->tx, txs, PAGE_SIZE);
>>  
>> -	gnttab_set_map_op(&op, (unsigned long)vif->rx_comms_area->addr,
>> +	gnttab_set_map_op(&op, (unsigned long)rxs,
>>  			  GNTMAP_host_map, rx_ring_ref, vif->domid);
>>  
>>  	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> @@ -1656,7 +1663,6 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>>  	vif->rx_shmem_handle  = op.handle;
>>  	vif->rx_req_cons_peek = 0;
>>  
>> -	rxs = (struct xen_netif_rx_sring *)vif->rx_comms_area->addr;
>>  	BACK_RING_INIT(&vif->rx, rxs, PAGE_SIZE);
>>  
>>  	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 Oct 19 08:09:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 08: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 1RGXm5-0006ay-UH; Wed, 19 Oct 2011 08:09:45 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGXer-0005lP-3D
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 08:02:17 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1319036531!270027!1
X-Originating-IP: [209.85.216.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28096 invoked from network); 19 Oct 2011 15:02:12 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 15:02:12 -0000
Received: by qyk33 with SMTP id 33so3632016qyk.9
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 08:02:11 -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
	:content-transfer-encoding;
	bh=VsMrxrk05Czgr5lGZQjphu53IyKcK0UaMZQgjR+oLz4=;
	b=MGTIDwdgcnlBwQs/3J7vT3N6YtoaD6oiPY/FmylDFHZpfNa8hj1CPuGwCdr8SP++xH
	8lPgHheLGt8PBiUc6FqksfjLGN3iqT86yPlewZ9HVSZBjtudnLtpdCgbAkCGbURHWjDc
	jJTPdZnWuyjDMnd8YHasTQ2xC8y+fJGdPUR8Q=
Received: by 10.182.147.4 with SMTP id tg4mr1051739obb.60.1319036531179; Wed,
	19 Oct 2011 08:02:11 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.37.197 with HTTP; Wed, 19 Oct 2011 08:01:41 -0700 (PDT)
In-Reply-To: <CAFEAcA_jX8t_8UtKOodXAOD-Arz2WPX71vWrLBZwT_4ODG_d0g@mail.gmail.com>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
	<1319032613-10560-2-git-send-email-anthony.perard@citrix.com>
	<CAFEAcA_jX8t_8UtKOodXAOD-Arz2WPX71vWrLBZwT_4ODG_d0g@mail.gmail.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Wed, 19 Oct 2011 16:01:41 +0100
X-Google-Sender-Auth: 5vl-NaN1gq2l0wBVcd4HIs1zkuc
Message-ID: <CAJJyHjJuw8UhMX2jwyGWsSO=_OVwQYTekrWcrucuBank_xTe5Q@mail.gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Alex Williamson <alex.williamson@redhat.com>,
	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 V2 01/10] configure: Introduce
	--enable-xen-pci-passthrough.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 15:48, Peter Maydell <peter.maydell@linaro.org> wro=
te:
> On 19 October 2011 14:56, Anthony PERARD <anthony.perard@citrix.com> wrot=
e:
>> +if test "$xen_pci_passthrough" !=3D "no"; then
>> + =C2=A0if test "$xen" =3D "yes" -a "$linux" =3D "yes"; then
>> + =C2=A0 =C2=A0xen_pci_passthrough=3Dyes
>> + =C2=A0else
>> + =C2=A0 =C2=A0if test "$xen_pci_passthrough" =3D "yes"; then
>> + =C2=A0 =C2=A0 =C2=A0feature_not_found "Xen PCI Passthrough without Xen=
 or not on linux"
>> + =C2=A0 =C2=A0fi
>> + =C2=A0 =C2=A0xen_pci_passthrough=3Dno
>> + =C2=A0fi
>> +fi
>
> The -a flag to test is obsolete -- don't use it in new code.

ok, I'll just replace it by "&& test"

> This is a bit of a misuse of the feature_not_found function IMHO.
> (Also, Linux needs a capital letter.)

Yes, probably this message will be more useful:
echo "ERROR: User requested feature Xen PCI Passthrough"
echo "ERROR: but this feature require /sys from Linux"

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 Wed Oct 19 08:16:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 08:16:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGXsb-0007Fl-L1; Wed, 19 Oct 2011 08:16:29 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGXpR-0006yc-P1
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 08:13:14 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319037190!35934109!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6412 invoked from network); 19 Oct 2011 15:13:10 -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;
	19 Oct 2011 15:13:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,372,1315180800"; 
   d="scan'208";a="8474034"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 15:12:46 +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, 19 Oct 2011 16:12:46 +0100
Subject: Re: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for
	comms
From: Ian Campbell <Ian.Campbell@citrix.com>
To: David Vrabel <david.vrabel@citrix.com>
Date: Wed, 19 Oct 2011 16:12:45 +0100
In-Reply-To: <4E9EA8D9.5060708@citrix.com>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319015064.3385.80.camel@zakaz.uk.xensource.com>
	<4E9EA8D9.5060708@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: <1319037166.3385.106.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	"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 Wed, 2011-10-19 at 11:39 +0100, David Vrabel wrote:
> On 19/10/11 10:04, Ian Campbell wrote:
> > On Tue, 2011-10-18 at 21:26 +0100, Daniel De Graaf wrote:
> >> For proper grant mappings, HVM guests require pages allocated using
> >> alloc_xenballooned_pages instead of alloc_vm_area.
> >>
> >> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> >> ---
> >>  drivers/net/xen-netback/common.h  |    4 ++--
> >>  drivers/net/xen-netback/netback.c |   34 ++++++++++++++++++++--------------
> >>  2 files changed, 22 insertions(+), 16 deletions(-)
> >>
> >> diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
> >> index 161f207..d5ee9d1 100644
> >> --- a/drivers/net/xen-netback/common.h
> >> +++ b/drivers/net/xen-netback/common.h
> >> @@ -70,8 +70,8 @@ struct xenvif {
> >>  	/* The shared rings and indexes. */
> >>  	struct xen_netif_tx_back_ring tx;
> >>  	struct xen_netif_rx_back_ring rx;
> >> -	struct vm_struct *tx_comms_area;
> >> -	struct vm_struct *rx_comms_area;
> >> +	struct page *tx_comms_page;
> >> +	struct page *rx_comms_page;
> > 
> > This will conflict with David Vrabel's patch "net: xen-netback: use API
> > provided by xenbus module to map rings", which I've just noticed hasn't
> > been committed anywhere.
> > 
> > I suspect that building on David's patches (that series does something
> > similar to blkback too) will greatly simplify this one since you can
> > just patch xenbus_map_ring_valloc and friends.
> > 
> > Could you also explain where the requirement to use xenballooned pages
> > and not alloc_vm_area comes from in your commit message.
> > 
> > David, I guess you should resend your series now that everyone is happy
> > with it. If you cc the netback one to netdev@ with my Ack then Dave
> > Miller will pick it up into his tree (it stands alone, right?). The
> > blkback and grant-table ones go via Konrad I think. I suspect the last
> > one needs to go via akpm, or at least with his Ack.
> 
> I thought Konrad had picked them all up -- they were on his stuff queued
> for 3.2 list.

Perhaps, git://oss.oracle.com doesn't seem to be responding so I can't
tell. In any case the netback stuff ought to go via David Miller.

Ian.

> 
> > 
> >>  
> >>  	/* Frontend feature information. */
> >>  	u8 can_sg:1;
> >> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
> >> index fd00f25..f35e07c 100644
> >> --- a/drivers/net/xen-netback/netback.c
> >> +++ b/drivers/net/xen-netback/netback.c
> >> @@ -42,6 +42,7 @@
> >>  
> >>  #include <xen/events.h>
> >>  #include <xen/interface/memory.h>
> >> +#include <xen/balloon.h>
> >>  
> >>  #include <asm/xen/hypercall.h>
> >>  #include <asm/xen/page.h>
> >> @@ -1578,9 +1579,11 @@ static int xen_netbk_kthread(void *data)
> >>  void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
> >>  {
> >>  	struct gnttab_unmap_grant_ref op;
> >> +	void *addr;
> >>  
> >>  	if (vif->tx.sring) {
> >> -		gnttab_set_unmap_op(&op, (unsigned long)vif->tx_comms_area->addr,
> >> +		addr = pfn_to_kaddr(page_to_pfn(vif->tx_comms_page));
> >> +		gnttab_set_unmap_op(&op, (unsigned long)addr,
> >>  				    GNTMAP_host_map, vif->tx_shmem_handle);
> >>  
> >>  		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
> >> @@ -1588,16 +1591,17 @@ void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
> >>  	}
> >>  
> >>  	if (vif->rx.sring) {
> >> -		gnttab_set_unmap_op(&op, (unsigned long)vif->rx_comms_area->addr,
> >> +		addr = pfn_to_kaddr(page_to_pfn(vif->rx_comms_page));
> >> +		gnttab_set_unmap_op(&op, (unsigned long)addr,
> >>  				    GNTMAP_host_map, vif->rx_shmem_handle);
> >>  
> >>  		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
> >>  			BUG();
> >>  	}
> >> -	if (vif->rx_comms_area)
> >> -		free_vm_area(vif->rx_comms_area);
> >> -	if (vif->tx_comms_area)
> >> -		free_vm_area(vif->tx_comms_area);
> >> +	if (vif->rx_comms_page)
> >> +		free_xenballooned_pages(1, &vif->rx_comms_page);
> >> +	if (vif->tx_comms_page)
> >> +		free_xenballooned_pages(1, &vif->tx_comms_page);
> >>  }
> >>  
> >>  int xen_netbk_map_frontend_rings(struct xenvif *vif,
> >> @@ -1610,15 +1614,19 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
> >>  
> >>  	int err = -ENOMEM;
> >>  
> >> -	vif->tx_comms_area = alloc_vm_area(PAGE_SIZE);
> >> -	if (vif->tx_comms_area == NULL)
> >> +	if (alloc_xenballooned_pages(1, &vif->tx_comms_page))
> >>  		goto err;
> >>  
> >> -	vif->rx_comms_area = alloc_vm_area(PAGE_SIZE);
> >> -	if (vif->rx_comms_area == NULL)
> >> +	txs = (struct xen_netif_tx_sring *)pfn_to_kaddr(page_to_pfn(
> >> +			vif->tx_comms_page));
> >> +
> >> +	if (alloc_xenballooned_pages(1, &vif->rx_comms_page))
> >>  		goto err;
> >>  
> >> -	gnttab_set_map_op(&op, (unsigned long)vif->tx_comms_area->addr,
> >> +	rxs = (struct xen_netif_rx_sring *)pfn_to_kaddr(page_to_pfn(
> >> +			vif->rx_comms_page));
> >> +
> >> +	gnttab_set_map_op(&op, (unsigned long)txs,
> >>  			  GNTMAP_host_map, tx_ring_ref, vif->domid);
> >>  
> >>  	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
> >> @@ -1635,10 +1643,9 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
> >>  	vif->tx_shmem_ref    = tx_ring_ref;
> >>  	vif->tx_shmem_handle = op.handle;
> >>  
> >> -	txs = (struct xen_netif_tx_sring *)vif->tx_comms_area->addr;
> >>  	BACK_RING_INIT(&vif->tx, txs, PAGE_SIZE);
> >>  
> >> -	gnttab_set_map_op(&op, (unsigned long)vif->rx_comms_area->addr,
> >> +	gnttab_set_map_op(&op, (unsigned long)rxs,
> >>  			  GNTMAP_host_map, rx_ring_ref, vif->domid);
> >>  
> >>  	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
> >> @@ -1656,7 +1663,6 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
> >>  	vif->rx_shmem_handle  = op.handle;
> >>  	vif->rx_req_cons_peek = 0;
> >>  
> >> -	rxs = (struct xen_netif_rx_sring *)vif->rx_comms_area->addr;
> >>  	BACK_RING_INIT(&vif->rx, rxs, PAGE_SIZE);
> >>  
> >>  	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 Oct 19 08:39:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 08:39:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGYEm-0000QC-60; Wed, 19 Oct 2011 08:39:24 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RG65U-00008Q-Ui
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 02:35:57 -0700
X-Env-Sender: bp@amd64.org
X-Msg-Ref: server-2.tower-27.messagelabs.com!1318930522!59636226!1
X-Originating-IP: [87.106.30.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21406 invoked from network); 18 Oct 2011 09:35:22 -0000
Received: from s15228384.onlinehome-server.info (HELO mail.x86-64.org)
	(87.106.30.177) by server-2.tower-27.messagelabs.com with SMTP;
	18 Oct 2011 09:35:22 -0000
Received: from localhost (localhost [127.0.0.1])
	by mail.x86-64.org (Postfix) with ESMTP id 410AD14120;
	Tue, 18 Oct 2011 11:35:53 +0200 (CEST)
X-Virus-Scanned: Nedap ESD1 at mail.x86-64.org
Received: from mail.x86-64.org ([127.0.0.1])
	by localhost (s15228384.onlinehome-server.info [127.0.0.1])
	(amavisd-new, port 10024)
	with ESMTP id llJ-7TY0SoWS; Tue, 18 Oct 2011 11:35:53 +0200 (CEST)
Received: from gwo.osrc.amd.com (gwo.osrc.amd.com [10.97.0.252])
	by mail.x86-64.org (Postfix) with ESMTP;
	Tue, 18 Oct 2011 11:35:53 +0200 (CEST)
Received: from aftab (aftab.osrc.amd.com [165.204.15.109])
	by gwo.osrc.amd.com (Postfix) with ESMTP id E62C049C266;
	Tue, 18 Oct 2011 10:35:52 +0100 (BST)
Date: Tue, 18 Oct 2011 11:35:34 +0200
From: Borislav Petkov <bp@amd64.org>
To: Christoph Egger <Christoph.Egger@amd.com>
Subject: Re: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
	update in Xen dom0
Message-ID: <20111018093534.GA17076@aftab>
References: <20111012101615.GA14966@aftab> <4E95D9E7.6090304@zytor.com>
	<4E95E7FE.6050302@goop.org> <20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E9D3F36.6070201@amd.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9D3F36.6070201@amd.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Wed, 19 Oct 2011 08:38:03 -0700
Cc: Jeremy Fitzhardinge <jeremy@goop.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Borislav Petkov <bp@amd64.org>, Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.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, Oct 18, 2011 at 04:56:22AM -0400, Christoph Egger wrote:
> I think this approach is good to get the microcode applied as
> early as possible at boot time. But on servers you usually do not want
> to reboot the machine unless you do a BIOS update which will apply
> the new microcode anyway. So for applying the microcode update
> at runtime I would like to keep the existing API.

No, you don't want to keep the existing API and you know it. I've
explained to you last week why.

-- 
Regards/Gruss,
Boris.

Operating Systems Research Center
Advanced Micro Devices, Inc.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 08:43:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 08: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 1RGYIc-0000rW-EQ; Wed, 19 Oct 2011 08:43:23 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGErb-0007sa-Qa
	for xen-devel@lists.xensource.com; Tue, 18 Oct 2011 11:58:20 -0700
X-Env-Sender: linux@eikelenboom.it
X-Msg-Ref: server-8.tower-174.messagelabs.com!1318964288!22119622!1
X-Originating-IP: [188.40.164.121]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16448 invoked from network); 18 Oct 2011 18:58:08 -0000
Received: from static.121.164.40.188.clients.your-server.de (HELO
	smtp.eikelenboom.it) (188.40.164.121)
	by server-8.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	18 Oct 2011 18:58:08 -0000
Received: from 21-79-ftth.onsneteindhoven.nl ([88.159.79.21]:57942
	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 1RGEp2-0006sA-Qb; Tue, 18 Oct 2011 20:55:37 +0200
Date: Tue, 18 Oct 2011 20:55:19 +0200
From: Sander Eikelenboom <linux@eikelenboom.it>
Organization: Eikelenboom IT services
X-Priority: 3 (Normal)
Message-ID: <1904679511.20111018205519@eikelenboom.it>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
MIME-Version: 1.0
Content-Type: multipart/mixed;
 boundary="----------1271281D73C6971B8"
X-Mailman-Approved-At: Wed, 19 Oct 2011 08:38:02 -0700
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Panic:: handle_irq_event_percpu
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

------------1271281D73C6971B8
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: quoted-printable

Hi Konrad,

On my system (AND phenom x6, 8gb mem) running xen 4.1.2-rc3
and a custom kernel based on:

- your linux-next branch
- pulled in your apci/cpufreq branch
- pulled in latest patches from linuses tree

I'm experiencing infrequent panics at boot (say 1 out of 10 or 20 boots), d=
oesn't seem to matter if it's a cold or a warm boot.
It always seem to happen during or shortly after booting. When it doesn't o=
ccur then, it can run for at least several days/weeks (haven't seen it pani=
c then).
It doesn't seem to happen at a particular point at or shortly after booting=
, but it happens before starting any guests

Unfortunately i haven't had serial console enabled at these times, but i ha=
ve made some photo's.
The first 3 times it locked completely before being able to print a stacktr=
ace, the 4th time it did (although the photo is a bit unsharp).


So all in all, it kind of strange, i hope you can figure something out from=
 the stacktrace, if not, i will see if i can try with serial console attach=
ed.

--
Sander
------------1271281D73C6971B8
Content-Type: image/jpeg;
 name="panic1.jpg"
Content-transfer-encoding: base64
Content-Disposition: attachment;
 filename="panic1.jpg"

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
------------1271281D73C6971B8
Content-Type: image/jpeg;
 name="panic2.jpg"
Content-transfer-encoding: base64
Content-Disposition: attachment;
 filename="panic2.jpg"

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
VSf/2Q==
------------1271281D73C6971B8
Content-Type: image/jpeg;
 name="panic3.jpg"
Content-transfer-encoding: base64
Content-Disposition: attachment;
 filename="panic3.jpg"

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
KWSy6horKDtTchTwNiPhWuMsH3RWXsz1yng/lEBTwfkxrRm57qtqln+Vjm23XVD6RqoPJ2il
dSa1D3JvQ52CLi1/j8q4NHosy+8j8alvKQGsMl1UZ3Cw8xknHiNscSRtWpR+n6N5AHzrvwlI
8/siWxEeLXIw5jHykoN5DirLa/bZSXUPKddShJCv9Nl3GlZ4rc0+6Ya8mtm+O8nBiMPzJkNh
UnHtZVmOpz+Yph9W1tKRY3cI+rbUuuR9yk2sjwty9heQSpyMUYtyS1NcDhsgxI6ZKykWuoFp
YI+Ola4StTL7611NRB4TmZuLOSgymXo33kPHlQUpJ9+cFFu4Ukfl2Hd6fGscGnqbXYvBpstj
chicnNxElQEmE8uPJDaiUFbSikkdLi40rDxg3W0qTa8s4i3gWOPuomCSc3j28gU7SkNe44pI
Tr10RWnXEma3lteCxPeK+Su5/NY6BPQyzhVRW5DkyR7ZtLQFNAKQCDrf8K6VUwZ9qWvk1mX8
V8sx8hLeTVGjuvOS0NqekIAcME2eKVEganRNz9RrPqbepP8AYqmYGb4ZnMNjGpcx2P7LzMaY
3HD6S77MtJLLntdT0sbfl71jjg0uxNnrwjEZLlXJ2MX/AFNUN15t3/y3FLUQhltThSLG/RGg
vas1nQexqtZBiuJcvybUJcIlSc5KcgQyXthkvtAKWg3Oo+sfm0ua62oYteuMGBhYWbzmZgcc
YlKSudIbiMNPLV7SFrVtSVDWwSpXpWM6M3KeSxnh3InM40iPPdGPgOvMx83KcCW21Qdpe9qy
l2KNwKUJ+o6aV0tSXqcl3TWWjT+ROPSOO8xymHelKmriuAmasFKnvcQl3epJKjc7+5rnZHWl
pqaZrIzkQlwm5LiIi1BxbCVENqcT0UUg2JHrWDbUmT/yTPe40v8AqcpTrBJZUX3CUFQ2kpN9
LjTSmWEKBF5rLrkLkOTXlyHG/ZU8txRWWtu32yom5Tt0tQ22SqjBGvUadbjSg1JkR5L8d9qR
HcU0+0re04gkLSpOoUkjUEUMRXXXHXVOuqUt1Z3rcOpJJ1JPeoIM2Fl8rEgyoMaU61FmgJls
IUQh1KTcBYB+oA660zAcZM1HMeVJdLictJDqizdfurvaMCGdb/8Atgnb6U8nqZVFMntyXmOd
5KuEvLvmQ5AYTFYcIsotJJP1H+JWvWi12zVOtLQxMTnMni3XV4+S5FW+0th5TZsVtOCy0K/7
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
J878ExPHuJoQnIz8tgCd7b2wIUH2y2+A4SSQgKPt/KhdUt5NNtJM2Oc87cYZ5xgXJePycHG4
dl6SjelLUh5yWlBTubuke1sF+utC65Wuppao0OA8v+MsZleZOOMZb7HkxWlLALR+mQg+8si4
CV7lHadbJpdNM6HNJ1TXkor/AJsy3/xw9wKPDYOPK1IblKQkvGMokpQRbb7n/wDE61p1StKN
1lqGeHhLyHC4Hy9eXnRnJEZ+O5HcS2QFAqspJ1IB1Gtc3WcHVtI6mP1SpTzr75MR5vi7jKBI
iJCFyFPJQQF7joEhR6A6gU8K8YnJjOpxbIcrYkeSX+UssrSwvJme2yvaFbPd9wJO0bb29K3d
qIOfXKZ3Sd+otiNJefzeDnKxuTkMT8K08sN7YqG/bUts6a+6kqFtKzXrWzOmsyaKb+oPjkrn
fH+QJw8lxjCRX2HFuOJVKdU8AElSgNpCevxua06pV4zqZSzJxrMZJiVyqZmIEZbMV6Y5Jjsu
fUUJLhWEqUB2vWeyyYUUHcv/AMmkPT8guVhHZGPlJhJjQnXfobXHUFPH8tv5naw7CjhVJZNz
Jpua/qIz89MBvikaTh3YqXEvyXXBIfcbcUFJbKlJvsSRpXSta1UvJhp6SaHB+bOVwsZyczkP
Sc7nmmWW8yLNuMhgEEDanX6FW06Vmato1XFWXAfqLzWV4+3isVhHk56ZHZgR5jTy1p91B+lb
TNrb761KlU5bM8uSLFyDy95H4hFwbXIuMulxLDiJ8lb3uJlBSRvIU2P5a0kA9dKzxq5gubR4
o5t5d5vhJ87imBYxqJK0xE5P3UIkojtov7KVOlJ6r3b/AI6VtKlXnI2szHY8i+RW/HOTC+Le
4MJCcxM7LuPqSjaD7S1JZ/K4pPdST+6pVryyXLEnlw/zF5EzK8ZjOKcXT9o24UzPccdebeJR
ZQW+7/tjaCetY7OGfIqUNzjyz5Jw83L4bJcW+1XLitxYD0dbqgyk7ti23m7+4VLN+o1Fq3RV
wzHKZWhncKzHmNngGNVAwkB3DxYcgPQ3FpRIkALILq21HclSCDp3rL4t7m3ZoyuTs+e8rBlx
WocZtGclxyhyHLUpyCW20myTcbEL2XUfj8alatcxoEq2NjnkrmvlzxPmnYnIdmWYyLKXGRKd
XJZc9tV0radCgoKQo6j/AKVtJdmXsXJJwLK/VbzZcCQy3AgsSpBWoS0IWVtqWkI3IClFN7Du
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
------------1271281D73C6971B8
Content-Type: image/jpeg;
 name="panic4.jpg"
Content-transfer-encoding: base64
Content-Disposition: attachment;
 filename="panic4.jpg"

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
jXMq3M9c9UqXtvyB72276Ff1F9AqHiapGZcJmOg59mc/lrazuL3HuoMt2iiy4JLgWtGh7Q62
/LOTWxxTkXIGcdr461xlW9t6wc2pUDw0FqEIA4dj0jU3Dr/y5njmQyWOzVKrbUKj6zXlKTZO
J0RY1G58N/neSy2TzLb+/salrWqtlv8AMH7ezgEJETuf1z/P5W45LyO84TUxDsa+vZvad1VV
+kqHJrEstXq+qbgmeyuEy4q423fc1UkxjjJw/UfBIkrVsxqcnusm7kVW/rWjra8qv9X03L9T
juVpPiYW+sc+Tx0HKOTcgy3F7S3usZWba2pb6Vw4q0HRSEWcLa1jLgeQ8so4C2xv2NS5sqTn
PoIQ0gumQpi86VXZ3muZvb+xp1repQ/tRLW25+vzFXBT4Rbb8F5/qzz3P8jWxLMPf46pTpIX
27ajpkOkumkXrqpzzrDhOZ8qtcCxtbH1r3H2wAo1ZgMaJaAHyxm2rn+qOjzPN3XIG31VtSvX
c30GUaf1bAVa3roYm1r4XHMef3uQZRsclY1ba6sQz0XVnI5pEwS3v84vXTMnut+n7k8pun2+
ep2j6tazAZVu2nybUQgoJL8YnrdimwuezrM1fZWxxtWta3dTf6dN+1japO8+ZP3Ql/rFkjPy
3nmTvsta3NewqW+Vt3Mexr3lygBEk0aiNW6cc4sH+5eYxldt7WxlW3q1QQxznIxSOkiuveJd
XdamO5jy6vgatg/H1ruzq13XNF4aQG1HTchPRe0XmpYpOSc8zmUylhd3VB9HKY9opveCd72s
PUIoKRnr5TPWnynnOWzSU2j7ayaAG0GE+Yp5i7uSYOnMb3As/n8HvuLOzuLygHiq0UiQGvYh
MkPaNStdVQcwz9XP566y1SmKNe6cXvpKu0nUaCOXV9ZkkijZTL3gNm5x+ka/CDrxcdtxXN8i
43j8nQdjq9W1yFB1Oo3a8U2hJPKDULG9Z/TqWuIduQ7hI6RhhnxOTr4+/pXlu4subZwqUXgk
bXNKgyjcI9Lf75ZH+8U8sbf/ALytS9C98/lfTLA0hE6ovxi9d/xm8KvE+7d9j8ZcYo0nHH1K
7rilSY4Asc8zCmSRidNXjYr+Se4lXK1bKtb0Tb1bCp6rau5ajj2USAjWszhv889xMhyjC2Nt
f42vbm2INtXrKddQHbZrF6up9ZoY73eytDjlrhrxpr0sfKze1yOaGzYpM5HtGJW+o2afvhlW
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
uPZGpZi3ZcWWUti29tT9Tqk9lVpPUEAxrp55Nrc4fTt//TzbxtP0K1Ck6owuU+nUaV3T6dY3
mRf1mPAub8mZnskMg+3bSvXNS6ez6XvBm8fGONurxbHPUg7c19PduUbe66yiNPqDiOS/vns/
kTf0nVbilb1WVHvAU7GEtKfKOsuxz/SvIuEZ+8xVJtpf2FWrj71y29y/dtY46kJJInNbvWyP
R/eS3oV/avG3bqQrOZUpm1r0xOk1y7wXf6kSL17HKy74+dGmmKgL/pWZEo5O8j6Q9pafFW4r
GXuLe6nUqu9K6ovALjVAILXeHYx04Y7qn98H1MNznE5mwaG1SwNrI1fMH/qHbZ1i98n5Vbe+
v2d77Y4vIMphr/UpFjk8w303bvgqRO/hjvzrx81lZFAeixI9OvoP/HagK3E8z920XNkH/SAr
muDSde0bnN1y/SeOqpX9Nvtzc5Cm1l3Sx9QV6LWo5zXscJg9kM4XHP8Ag4DlnHc3ybHX2JcK
LalNbhr5baqTUS6yicrdeK+/+LtLH3HvftKYpiuynXqNEm7qjVJHxMTqetcRVe0nFLDkvLaO
OvwH0jTe9rAOrAswIkb+HoGW4l7d2+XusHe2DbS7Y1GXNqx7RSJm17yVbt7x0vE+HDnrXRWn
LOPVeBWuMvKjbXKY+qLeg9QBWZp6jCdWkQka7xwfvpxvP4inYvuKtG7xNwBUtblrA17XbQTT
cQT0KiM9z/E569x5TiadV9/ahpO81G7J9VjGu0j68zjrW2oceq16jbO/qejTq1FGxyNBCB3x
jpJ449WfZmpUqdt7qNeLdtOte48/eI1KdUtMiOnSNfUnw8w90/aLGZWyy3KuNH062PuKjcnj
UkC2bn0j+aRjuLz1jwAgGoWtQOXX4SjDpj6V9n8Zih7VVctUa2nc2tSobmq0AukdHp8Y6ceM
/o665dZ/+NY3luStg/J4as0vuKI/qVLd7toC9RscDOF9ZrSyBtOR8hr0eJ5a3bVrUBWpMqDc
PUAO4OAIc1TGpZiTl8w80o5W35Fe0svSbQyDKpbcUqY2sDwZlv8AzaxwsyunNmOk9nODY7l/
JzYXxd9tSpOrOa0oqSAXUReZtK9QyXsb7e1WXdjbXf2GVpA/b1GvqGnvaFDKgqL9XeO3XDOs
nCP/ACm1xdC1zXpi4tXbKFQOV9Skw+XdtRoCdVnGeJfg66jgffzk3G83lbKpY06f96tmOp5K
6otDadXTYP8AU5vUw6k//mxzPXmmEtKWQyVpZPfsZc1WU3FJjc4CQ7xyx3fRFx7Ae32PFtRy
1xVaXggVxVqNe5dXbACFEejn85jhevcaeI/xu46LrKOvL376yty11nV3Gk11Jw3Fz3MU7hoR
GZz76vfVkc97g+zPGbTitbOcayC1LEF19j3uL1Yv103VNrpdRDr8/wDGZ+jxUbAW+mVl/trH
Kx3+XuPtV7WU2Yqw5dkLmo1jqzXW7qBFP0yCJvdP6lREjfHJ1cjpv8kcXiqmX41cV2sovuya
d1d0mDcWghCR1TsYd/DjPOnXe5OUsuH8Xx922zt73F3DWW2UxzwAytbvYgfSaZB41izvIdT1
8j5Y2T8ndvsWGnZOqO+1Y8q5tIkloPiBHLq7XSPaP8aeN43J1Mze16YfdWTKf2tZASzcpJCr
/LG+L6df/L0+rx7E854/k7XM2tG4Fg41MTkKf/UDWyc1ztU3NQiOt+XLjxuXtpaYC6weIxtp
buxuQp7LjG1mh1N1EBoqNa0yJG9ZxL8Nd33Hz57/AHCcPxPmIpYhvoY+9pfcstlJFIko5rVn
tXpGO5MTm3cUXtHb0avP8Qx9q29a6u1r7eom1wcfHqNYxzXWPrN7SOYnG0H0LjH1bdauKumK
9yycAXFEQfyx16tcpfVMMrxKyw2TwmKvqGKv8TcObQt7hu0MDjv2hpIDmzKRudfWpZa8l99b
Pm7MJZ3GXt7C/wATXcH2WZsqbg5rjpTcSfIHD5GOXfdrXPEleGspuDlcFWUtVMc66fXHuQ9i
+L4vjNjluTZa4taV4xj/ALijsFNpqIRTLS0uX5zjf1max9vcdL7Te0nEKHIrq4tb+jnbMURV
xl4E3U3KhbUpHR3Yxr64n2rpMpxLD8+45mKOWsreldY01DiMrbAes1lMTZUcg3Bf0mN9yazf
Y+SatM0a5YSha5wl/pMefHo59mvon/HjiWIqcVyvIrmg19/b7/TqPntpsaXEAodpl0jfEn9Y
/TyLPn3B8Py3gFxye5s6GN5Bjg54urUD069uJt9QNk87f1R0nG1yts9XlnY4bins3Z5S1x9l
kqAo0zdUbhrfSuaNQ/1SjtHxj65W7d9fLfMa/G6vILuvxug+2xVV7alvaVZup7mgvptPVrXL
t8Ixcq8yqAuIG4AgrIGI1hnEBXD6iP2wMIAQJGWqdYaYAJP9R6/vhVZC9CGhQSFCiImg2U9y
9Ui6QTJqoJnp2AlEq6UtYi6AwQvqO6lJSaIprI0vRTNOnhGVFVIIEhFRAWkAzRZ/KCneAVHT
VO8DNRjgpCkgaQJcFSZH8B2iFuhuIahOuogym9GtUzKoO0UxkO9wG2R+ENUpVqqAR1+MAyNX
6ppI+EUCTm67nGU9YjOG3PElkevWDRXlxUkygh2hNPw6RARu2qQF07xQW1GprPSAI27QHEmZ
CDtFUxBC7NCOkQSkoVShX8BFCte7c5w00SX7YoYFxAQo7SJUHd5QSZghYgICdSuoInFVCjj9
MyVJ7JACm5wqKXyKy+EVE3uLy4lR1iAlw3gGSD5RDTNcZTkJkASMFlK4NLgVQHrAFj0G4HXT
/fDEFylVE1kZJFT6hvCoiN7jwgCagIDiSWiTj4Qa0wqU3AhpXqkTEYmvVyO+k/uhIHLXhwLp
jUN6QCueds5HsNI0lPuJaAHaGaHWJQC6oiEgAfvjLRS4bZqoRQR3jRqatDVIPQdohTEjrPvF
QFc4+WRHSDMQuJ6qGmfZYjRiWoqkga/OC6UOCSUp1ME04qsARSkKvwQhsnKgBUH+MEBjnqWl
xQ9DCroveQQ0a9CsSJoNeRIhF+pNYqYcTBA7IDBWNrnbl0HQQQwc5yjTuYKO4IJJt1PWUAtR
52gj6u3hExA0d6ilSi6SMXFOHlSD82/GGNQHPDXK0dIuM0WuLqaqpBUrBSvqEsLUUhJdYmoB
e4oigjqJQGQPUTQnX/dEoR9Tc5C4kdBF1Af9JduUgSb0gohztv1EjUjvConrOOhQgap0+MTA
XvDhN6kdUizxpjeXhACodM+EGWRtZwQDt+Ig1KDar938w6FZgwB3k+YkuRUWJWWMqp2q5oMj
FVlbVDHCe1p/BYzY1B3uK7nKO0XGaV9QlGif71ixCVCpJ0IkILBG6mNylNV6wU/rkDd11mVh
hpDcVC0g6nQQTaJe2p+lCZgHwiUL6pY8JIwBUF67pGfgsVE9d4IKkpoNRKGLBJ0BKhZ+C9oK
jnp/0yqa94iJ63dypp84rRxWqNAABHY9BGaySo5SFb4L1ixdIHVGncx2kWoc1ntJBAV0ynX8
Iz8KL63kduKlxHzSLq/wr6m86qB1iska4Na4dSQqQCvkpH0A99F+MRRa7aFCHonjBKDSS5TI
d4hqObuqSO0iKGQCQTon8YKDSZqPgP3xViBiK5SF7TEQsiIULiv/ACwShMgnUdoIQAB6opnJ
ZeECHQin5gv++ClY1wKDqJqUEEF7ipaiy1iCtB23oIClzv8AYxrms9fDveKU1NUM/wCoGmQn
p3jtJ44Xr4ctkHH7isrUc5xUKoWONr27411RgDuom6I5gWzAWaa/viixY12/cZOGgioy06jG
v1Tp/wAIDIoUEAhdIom07tymWoMNVkeu1u78oiHZ9JRy9oK1bgPLKqFHJ8ox1Fjn2l/3TG1J
AHSNRrHtXtdd8gxFnXy1jbOq2L2GhW2naPMEE46Vj+OfzNRlbIVqjGmm4kgsJWfXSMVGj5tG
iZ/fFiiN7T5TuWZJ6GNQdrwrL5/H2t7RtaBrWt3T2VgqBD1+IipWSvyLM3lpUwFpav8APU3v
GploR2jFqNy0u85j7apXZZvrOoNUuaVDCZbpaRrLhrJjc3yd+JrWlxbVKltdVfuKTi4Al57D
tKLPhcii5fyXJ3NpQxd1bPtvsv01SSS49Z9IxYzc1oXfIPu8Db2L2E1qLiW1Af0lEAEWXGp/
rqMRneS08LSt69pVu7W1BqUHBwBAPcdYvVrN/SVq47lnJ7nN1L+1aX+TY6gDIM/5tYkrWeMX
IeV5ejbOxzbZ9oK5JqtdMlp7dEhPlJLVlh+VZnB4BxrWdV1nds9GrUUbZiQmI6dRevfGpjK2
bt7WoRY1BYXX9SjUJIn4dIxZgwcj5bl/7Xa4kUnU6banr7nO3Eu0AaAJRGbVnecxytHjrcNf
WFelQutr6T3uCO/5QRFtxd1rW13l7SxZaVsfUBYd1FyhpDT4HpCbjexX8m5Hmc1e2Fm+maVX
Ht2UZjchKmekS2ufPM3W/n+V5S24m7A3tlVo07lzatOs9du4Ge0pErdzXnodLaCSTr2gLG1w
GWu7f7i3tX1Ldn1VGiXzhhRZSymGvreuWVKNzSc2rRJBBkVBHhFlynNehXnOeQG5pZ+8x1am
Ub/UEqb0CKDrGrVrHh+Zcotq+XvHY+vWs8z9Wz6A7uOkJrHmY57lvLsjeY23wda2dQp21Que
Ky71M2ovQRKs5jjnGpuBKE9xKJVsdRxDnV1xylf0drqlvf0TSdTUbWknVD4RIlmxqcTzN9ZZ
T1LOgbg1gRUotVXtPQJrGo1xJHVVed5HF2V3bNsn0HX1N1LbWltaZO0+MS1PHm7txcoUklU+
MZFzxfJ3dlkKbqIfUef0U13H4JF5uGuq51zy8yz7dt1Z1bfIWrGekanlKtluEusOumc91uVf
c3kb7Olkry0q1LihSFM3QBDHhp8rnfDQxuVu8+PP7x+SzN9WvnUzXuartz9gUnpp8IxWeJka
rmV7So5jw5lZki0ghwOsxEx15rveM8/y2E45c429t69e0yFMsbUcSGgEJ5SRG51jn3/7KLjG
XymLzDb7HtqPYxymmwE+VdJQlrX8ZvcHlh5VmKd56D6d02mKVVhA3OLTLTtGerrP1xzVW2vr
FzX1adSg/wCpgc0gynL+MTmtzp6L/wC0cvkbOyubi3rVa2Ppik6uxfMBoXkLNI6fZi5qpyXu
Fk8tyU5JzHI+myiaLFLttNdpl4mM7tOeMNyTnGVvsX/aKNCpRZWH/ctqBxdUmgkQAIda19dc
XWx+QotV1vUbTp6vLSgjMjXVjtuK+5GSsONXWALalzb1Kja1AMm+m5sz8jGpcZvqq5NytuWZ
a02UXevRcnquKv3dETRITrTI3ecc8yXIMBh7DIUKrLrHsLHV3Ag1QQACVAUyiW2pZ/XEuoXD
EdVpPpgkIHNIUdx3jH1ancb3H8le2OVpXtmvq0nBxa3Xas9I1z4311MdV7mc2qcqrWVd9s+j
cW1IUTUdLcFVpQ9Y105c+Vvce9z8hjuK3vH8ja1rm3u6bqWiMa0iZVNYfa4v6TXm5tbisCKV
N72D6XAElPFI54jD6dzQe0uDmPYfKHAgy7LGh6nxb3juMRh7m1uKVW5+4pGlWRNgcRt3z0lG
5Tr1RYb3CpWVO9svRe7GVX+tb0nEE06ieYjoh7Rn7YTll5L7o18txR2CosIo1ajHvL9RtKtD
Ukkan6eYfX1wOyswFzqbg1FL3NIH5xmxfv6tON8ivcLk6N/a1XA03gua06gTScTmrjrub+6D
uTZPHZOjbPpXViz0qio4PadZDuY3enOTK3sv7x22S4m/jl5Z1KtFh373FspeVoKL1iddaWbd
eTOcwlWNPp/pYT/tpEjcrs/bX3KyfDL6u+3pmvZXbCy5t18rg4JuT+YRfs31di9q+8RoYC9x
drQcWXzPT80g0IQTJJlYXpysafHvct+PtWivb1K76YDHOp7WhyDyrLURZ1jVcnyvk+S5PmKt
/fK+u4NaA0LtYyQb3PxidXSTGpg89kMBmLXKY9zqN5aPD2uCrIqWn46GIua9Kv8A3qssnkKm
Qu7EtrXLGtuKLNrWuQIZqsa+7H0xT4r3Uo0sVWx9/ZCtbtq+tjkDXPogk7qau/TD/rVvErW9
wPdJ/J8FY4ptLbSs6nqF9QjcXIiNHSJ99mMzj3XBB76YY+bCD5T1B7iMNx6vb++Ve44zi8Zm
bY3FzijtoXjULy1AG7t3UJG51iXhlre/+QbyrF5ehQ221iz0bii9C6q16BydtJReu9ZnONjK
+/lKrbZmja2b2jMtcx9OptDW7whPl1h12xeXjLixxkZKu4DQRzd+Z47b2590MtxF9xRaxtxi
r9oZe2dQK1zRJQv6gIsuN/XfHQZr3tun2TbTEU3W9Ko9r6pdMIwqxoGnSNX9HL/ll9bll7y4
S1yVLK0Ma21u3BpuW0WsaHOH1lp6bofc6jzbnHKKnIuSXWXq0/TN0/dsE0CIPwid3brP58ZG
bg3NcpxDkFvmbAguoyfSP01GHVrvCMa6yPQ8n7y8evsnfXlXHvp/fKXU2kLvQaP7LHWfo5fT
Ky0/fqxuOLWmMvcet9b/ANM3FNrfPRboCChi89l5cX7lcy49ycY+5sscbTIUmmnd127WsqMA
Ab5AdRE661rlxNrdVLesKlFxbUa4OY4SILSoIjDpI9nre/ttlsZi/wC92Jdk7Bnp1K9M/wDU
ITzEdCUjc7yY5dc+6mF9+7fE5nJenj31MFkaRZXtajwXtqkEeoxdNU2xb0XnYoeR+5GAyPG6
uNtbV7a5QUHDytA/U4znCdpPzjzAjzgAIB06RjWses8F96DieG3fFc1QN3ZPC2VWmP6tI7gU
mQoksXnrCzR5/wC71jynGYU17MnJ4Z521XBpZXYgHnaOspw+38S8/wBZ/cb3gw/M+HY7EPsa
1rkrM7xUaQGFWokTf4mevIalMem4lx3N18Yy69SOn9ufcLL8HzTcljyHMI2Xls5dlakTMEfs
MNc7HpN97/Y6jjrtvHse6xr3rHtNN5HpUzUHnkCrtTqkb/6M8cFwnv8AWlXEWFDktkbrJYwe
nZ5GjJ5pEIQ9ZL5ROLOrGuuHn3uPz+65lmfva7QwUGelbtEyKY/mJ1MY661eeVJxjkt7gc1a
ZiwIdeWtQPpFFBQ/SR2MZ1bj2u49/uJ3fILPktTFVKGWp0mW91tcoCFSGHxWOkrnOfdUeR93
uKcgvsjV5FgWV2Vqm/H16bkrUwJbXkFu4RP+m1ZGL3B95MbneC0eK2FoWUKVVjg5w2taymCj
GjuVjVsWfLyH1GDaU0Oi9OsZb6r2ez97sNleDWPHuV477ypjnNFG4Zo9jB5d7Qk0lrFnUny4
9RrU/ejGce5RZZXiNh6NIUjTydCoCylXYSCGBo0LUk6N3qdQnyt8l7/4Gwxd7T4tj6tnc37n
Oq06vmpA1Z1CCpUqYze16jwp1UVKr3nWo4vaNdSsZjc6yY9F9qvd694VWubK4pff4TIN2Xtg
52xAQWufTd0chnEX5jqOW+9+KHG6vHeNWFShaXYNKt67g5raJ6MAJO4rqTGvv/jH1/0c57wc
VyftD/4hUtbi2vababbd9Mh1IGmVBLiVQzkkJ0dR4Xub6jiQT0B/eIy1yxsAmOpJIJ/CDYoF
RSfB3+6IzhfNtK6DSCFEgoBISR+cBA/RxWekEZAHBu1Ah6dgYKZGCZ8YKVrdzlH0iCIihRoZ
wU7QAFJKmS9IIm49dBrABxYAgJnED7SEKAdydUg0jhtnqF0Hb/dBKjCFTp1iojiBJQqoSe0B
AGhW6poV7QQ1MkIjl7kxFToXdzMRQWhAFUFPqSUAA6QluXWCMuwEOSfZekCE1QIfiNCIBi4O
8qzGp7DpERHDa5GptTWKpqdMNJJO4kd4KIM5lD06xRFeZNKEiaxE0GAqW7lJUh3jBYyFoLQX
FCNE7QKQiYAk3X4RUAhdwd9H4RAzT5paaFdZ9IKyMBIKGfX+EUI/qkyZjosTUQkgIqfGKIAX
E9XdBGQ4FOmEGo7/AL4Aa9VAC/IxVFn0qqzSegMVEaQqHVYAF24kJP8AT4wAKqgKnq0ygMhm
hCLqQIBHBSP5ekQRgcSXPdLuYqHO1oEp6gxAg2iW4KTpAE6p+nUwVHklB06LEEd6iEpuKyB6
QXAO0NVDuOpjUSwga4SYVJ1MVMZAN0jLvGaqFhGgkCggAXEEAeVpXprED1Gnbtl4QGNpDWkl
CT0MWUNTDUIJ+r6UmYAuAbrqNTAJ6m4oinuexgGc87VJ1kDAAHa6YXoo0iCNqEk9CumsukUO
2oEQjXvBWJ9VDtHf6esEtRwBMiOyGKiHcQW6E6JBpAjVbqR0XpBDU3I5BI9+kAqHRVIiANLg
89SZoP2QRkQJuIQgdIilUEmSHUnxgqOeNhaB4SEVKLQSCdPCCFJDmgeMiIEBoOxzdqO7ntE1
RaHEFJA6DXSKGG4t0kPxgBtKaST6knBSAbQJ+UyPwghmFvmLZLqIpDFdUmJEnWJVKoBUBSkR
BEgAJN6gCcNWgSxo7k9OsVC7wRtJQDV3aAjHNcSjt3j0MA3lLHAfUJJBCtCkLoiCC6ZybkIn
EAcmkw2AjiwOLWk+B6GKpidn0q1fwWAVzXObopglSmQU8qKZwU4cGq0mR0iKD0QAHpPrFQqy
TbroYIdxcu1vQRBiI3NQmQ6jwg0dNtJEUAL4/GCIGuIC66pp+MASGNZtOgiFLsaXEgBoKL4R
ULuaXkAKVioAJ3KAg0gplDyFC6hOn4xFD+oqBPLrBRJO2ZPTyjRIqUNyOG/yoJQPkSB3M4iA
G7ZSB1bAEqWFpkUWClDQ0EdSZrp8oISsXhQAN0MGiCt4xQoVIsTqO94cUbcK1fJMk6iOkvjn
OZHKXr2m9qtTQnSaCOdd2u4F3UkCaeERMKg2ovmMwFgjf85aNpmJlY3UOwKV6jtESNhu+SkI
iCDRyAgAJCKViohL9o3FQAsAw26gTkiIBBGvXcQXNVQROcZrSpuqX9ent1eUMI0+ofZXH295
7cZS3qzY7zqNGloJmnUER3vwx1fHj2Xr0KuRrbAWhry07h1EinzjkzzWiS71FBJQTcZaRW2R
pDiEVDMLGoPeeFYaxr+2jLqq07qbnOqPam47JT6xeme7ipq4tnGMph+S29N1XGZFaV3Teit3
S1+ETMZnfuO141ZYmpmslbUG77O6onY4oWua8aTjTdnjBnsNY2WAsn1Wh1WzrinTLJbg5yTj
DM8cT774anTdjcg0NFaq0MqgfqY0ScPESh0zblec4G3fTzFqy7pljHvb5agI8q6z7wny3y+h
MliLPH5/GVGNVl2GltJoBZsQb1OhjpUvPuJccOxFrb5R1sxtOkKhuWuYArWOCkSjNiTVDy/B
WeR9uBlKQBvsU81BUcPO6luKA6atSLY19sblrbWWf9oLh9w1oq0mFwQTDqY3Ri6t6VWKyWFy
vt3btrNfTucaRTa0SLgDq3uI19fDqOb5ziLnjl1i7xrPVpXjWvt3umGnq0jvGbGbfcdr7kWt
hce3mOzCNNe3dSqMAElcQHNi2bFtylytbC57E4W7o76FxWa23r0wgIICAkfKN5idz15j7hYW
+4/yJttUaQ9ga6nW/na7QhO3WOd+U4+XonuJjbS/9psZkSALq3bT2OP+rykGH6Re7leChVVU
/CJG9e6+xNtbX/G81aXASi4qrUVpQqixtLJ8svuhgbE8HtqxaPUtHf8AZ3KAOqMdq0+I1h1J
jEuXGW1tLW79l6dzWa7fbU3OboVIcZfujP8AHbtte31nZ33ta8XDX7rerUqUnCbmlpBa2Na5
9uL93XYXJYrG5ig1tK+T0K1MIrmtkHGM9EryUkB4VR2KxmN2B6ncquh1SCO19pWMdzjGhwX+
oPgflGuVldP76W9nZ8gdZ02la7W12uMw3fqB8xErHNZOM8NscdhaGV9Nl0y5YS65KFjJTB7G
NSL1cZ/abGYS75zfMpOFbbSdtACABfNtdDE3YT3HqYlt1Xw9yFuMdcNNpVdNzqNRAWKO2sTq
acuz5LbYzB8Vx2T2b7U02Urm3DRsfSqCcpCNT4avXuKL2bwGDvqudba1A6iZUnpOm16p4yi3
GdyOe5A/BZTkOPbcgMydpdNtbkbf+tTa7+m8p9Uc71tX867f3Jt8PiLelQvGNOOyTDSqM2+W
k9rVZUb1GkasY+3rS9ruP42pwS+uKZHq0qr3i4LRu30gXAL2ISNSNd3xzmMHHM77jYq5oMY2
tdKy+tQ1B61OSoieeRjnfW50t/dS2wmPNzh7tGtr0jc4+vtnSqtKOpg9nDWN2xzyrbBYqxsv
bC0zVuxr3WrPuD5QDVaoD2OXwWJPhq+Od9v8VxjLe4F5XsUfb3FH1mW5AWkSSXD/AOJiT5N8
Xz7bDP5rRw9xbNr3ePqudReQ0epQcPOD32GYjpb7icW2Liw4/iRy69xlVrb61rUXOqUntH0u
0cPFsLEnTkva+wwWP59lMAKNOoGPqendOTfsAO1oWMTn1rm7GfH+3+Hf7rZqy9EbaNIV7VvR
r3gHcR1mYk+cWexct4biuSWuWw12BUr2432N63WlWEi34KJxuyMb4x/+EYjP+2mMt8klvfW7
vRp3jGhd+8s83cECM5sbqm9t/bw4u+zWGzNo2nXY0GlfMIKjoPgVWLxM+V668WlDjeHv+G5C
pfW7KjsdWNahcPAGx1KZY5Au1wi31yk/ra+0wFbL4K/xrqdWxyFPzWoaJBjUcwwjV2MdbivF
Mfkc3iKIZa3JYL60BEzTI8zAv8roWxJuNLMcCwvI+A215V9K2v7ap5L7bqwuRzXfuhmxqrjh
ntrx+hjr7EV7Wm9lVm01i4PdUDv1nsdEhJIndeK8Yx/GbflV/wAZzlH/ALOtWfQoXgCVaTwS
GuCd+sYlduZvKr9xPbnJcRydOnUe2vj7hKlpdt0c3oo6ERizGJ3/AB6t7fYfGcp9qsnSyNBr
ri3DzSudrQVYwkEO/dHTm7MT9Ocyx8+3DXUar2MG1rSQO/zjnI3J49E9gqNvX5zRs7uk2va3
NOoK1Ko0OCBsgp8Ui8/KXmWOi9wfZJ7r3N33Hnlws3NqVbIN1Y9u4+meqR079c+f/WKDjvsl
f5q3FEVXWd89m+myqAi9GmH08XvrPho8Z9o8rl8hlsSXGhmMU0vdaOBAqNB2u2u79ozOV+1z
Wa89mMxUwtDMYhxvKbqv29xRcjH03rt0PRYXhJ169L9rPbaysqd/icu1l7Tr0QKrHsG6nUKq
WnVR4ReeV6u/Dzfh+Ms8V7vHEljatnTvKlu9lRu7ezcg18I5yZSer73J9q6Fz7pUcTgmi2pX
9E3VRpHkYQocgCdo6dc+p+fVlVtT/H/LVHXdG2vW/f0WuqUaFUbW1dv6WEnr0iXn1q9PI7q3
ube4rW9ZhZXoPcypTcEcHNKEEeEZsTn0tvSbUqtbUOxgcCXgaT7QjUj2f3W4Xa2PCMNkjQps
uHNYG3lpTDGvpObuBqD+fSOt5kjPX/0rbb2GvamMsMmMnTNhk6bH0KhY4oXfzHuI5Zp1bK17
f2I5KLzIUrusxjcftV7GlwqtcFa5ifpQxqfnUvbR5B7NZjE4D+8vrtrU0Lg1gKbOhJKBYXmw
2PPGMaJOMhL4RzrrHoHFfaHO5/A/3ulUa2yJKANJcjShJ+CRrjjWeusWT/YLkTriway6pvsc
gfTp3enpVAF21GhUXpGuvysZ+++quw9meRXXMbvitSrTtcja0zWZuXbVYnl2O7OiTnLjPPf2
jfp+wfKBafeXf9EB5bs+ot2lDu8Iv/Kr98YLr2K5LaZuwx1WpTDMo1bC7U+m+on/AE3SO13x
jP0ur9zO9ieV1aOQFFzamQxQW9sQoft1LmfzSjf/ADX7ea7D2q9muO5viuSrX9Y1rmoDTZcg
lpovAUgsloesOZrPXWTXinIsNc4rJVrK4EmEim9uhaqKIxZla/O7NV1CluqBheGqQFmgWSlI
mumvSB7E8kNSyouuLcMybQ/G3IcRSqqF2korTGvq5XpLL2F5vXuMjTuaDaH9ucGVQ4lxJ1Vi
fVKcX6U+zDlvZbk2LoWd5cOYcdeVW0TdtJLaVRxQCqNWCH0qT9I36n+OfOm1H2zX29S6I30a
AehqsRQWuISYHWNT8/NS/p7iqs/ZXlj8Y/JXTBZW4quo7apQhzCjtyaBYk/P1L+kgVPZ3kzM
xZY9z6BZkv8A7jeMetGo4f8A2Rd+lxidcYs7rYPsfzN1O+NKiypd42d5Z7v6zB0cGj6gnaJ9
Kk631P8A0lzJjsTRq06PpZsAWl0HrSD3N3bHy8rpRbw19q5jkHCOSYTPVMHf2bvv6ZDQyn5g
5URzT1aYx9V1e5j2d5ThLywZlKQp2eRLGMu6avphzyB5j3aukX61n7Y9gq+zXB8O/HYbMWb6
zMiBQp39JxFRjyFFUpoASJaR28xnu3cebcp9g+VY3M5CzxJZladk0VadOmQK7qBmH7P1JoUj
lYvHVgcK9pb1mew9fktuxuKuqradxTLtpYXqBv0TWNc/n5rV613vOPbbjOAy1W0tOO1Lu1FI
VxVoM3kMI0UzVpmsbmOc88chwn2ao5zI08leMr2vH6lT/t6af1KjdyFT2jF5m+OvxE/yD9r8
Dw+6x11hN1O0vmlpt5lrXsAmCejl0idTzXKd37Y4viftbyPkVu+9osFtZtH9O4qqBUf/ACsA
6dzDnm34derj12z9kOJYHjlC85BbPyDLgNdXrW7iHs3ENGz4F0zG5zJ8uP6zXLc6/wAd85jM
/TpcdqtyNle03VsdTe5rKz9gV9JHSc8AqE1jOb8Lz/6uPb7WcvZY1MjdY97KFs9Lik6VRB9R
2GaCMzm11+0ei8P4d7bZ+2s308XXqUR5b6q1WvY4BCj+p8BG+ZLP/LHu+/DBee3XtrgOZXuF
vK1TJMuKLbnFOaS51MEE+lVa2e5ZRZxFtXV97GcVyuHs6+Mruw+YNRratrVG9j2PcULV0cB2
jHX5nP6Nyr7EcJq3DOMVzcWWauKL32eQDi+nuYJ72mRDu0a/5eaz11dfPnL+L5LjPIbvC5Fr
W3dk/wBN+0gtcEDg5pHQtIMYvONcdaqXNAYvaXhGY66xowE9S6CJ5UG1Sk0OiCFBDuoEoiMQ
UyboPzPwgYyCatEyYIJNQgFg8PGGqLiSANOqGBoBwaCA2Q6aQNCruLQW/GAZCQhMykxBDtIQ
rqdDACm528gymk+0FiVBq4IU/TpBaUOeJGSKWp27RURrnEFfMTMfLtEZ06jcAG7RqnjBTSLN
oPWYHeIC5QiDQTTWKum3ORDoNRAIGSUnxB7QDhpElmNOiwQQDtRSD+Q7wohYpJDpkiIIrgZk
lBoUih2NB/qCQIkP2wEeQZNA7/KC6RoWY6iKjI0AEO3T/bBTPc4T1HXwiBQs118NE8YJhmmZ
WaawVHOaHENmNDBNwrSzcZFDBNOAAxzOi6HpDVAbtCJflAHcU7nUJBBLpzKE9e0FiMUkzgAp
JIH0jvBBILDuJUrJsXQoJJWQKaCIogtKgNU9+8NBcwgyUDT5GGiN3BxQoBpAFoKhCo8ZwWQr
g5p26hZDrBKYPbOQ0CHwhhDNDSAhQHv3gqOIVNZqTEQrijXdCD0nFUXVJpIBxEhFiF3NEggG
kURxl+8d4gZlQlqLtT8YiCXfVs/VM+EFIwFPN06wMFzp7QncfCGKUPIfPyzkDOCGdtb1Vqfn
ACZcC0hvbqsAFIO3t+CRRJqkg0TPjERE2EuBRdfhBUUFxTXoO8DRm54BaiTcYCE7lRoaNV6m
EWA7c1ANf1GNWYWJtaQSUB/m8IiIGAbS4r2EAQE0kUkesQKjhp8SYJhqblLu3U/8YKFRpIXr
4TgIQrSgQSSBSN2tU7iSTMQiGEmEjuoB1i0FBqdYyouKnz9ShA1SAVziG7WvBnrFEDiGBdF6
6mCohJQyGoiaVNoClupH4RU0WM1UFSNVgFQh/lKAaAxFOSqbkaT10ghNpKHrFDNUOI1dr4QS
EDaYBLRISBSCgSCFMkOiQMOrXaA6aQKDXNBQBOhWCUA4NPUqUl2iLqKGzcCnh0gCagqDsP4Q
NTzBsk8R4QQjTPRATIL3gqPc4S6GcUEguII+mfz+cAWNEnEoRpAwGnzFHKNXCJpDmRE/Kdeh
iaoO3FHBU7dSIumAHSX9X8qaQAYC8IToEJhUMwNQgHQyb3HSATYJyCqiRQwZtYNpKdRBQG3c
GqAmrdPGIGa4FxaJJ2gQHtJUlVJ0guAjnANMu57QQyCW79MUJvJm0KmvhERC4gz66xQQQ6Qm
J+H4wAcXFhE9oE+8FVoG6/AMm/zCUXlOo73ioY6nVBI2hhX49DHSRytcjeeavVdTKjeevYxy
d2MOIZsBA6kiIlpFlpIRGFh5peXXSOqhTqfp01T+EZRtNJaU16FYNMqkyMj0ioBMjMggdEgm
CCUDyCqS+UUat2qKJNRRJCsY6jXKpFcudTBmWnT5xlvMe4ezXPP7BSubS7JFjXplWEFzQ8iX
m7mO06tjl1PHJ5sUKmQq1KNVtWk9xcrdFXSIc/DRaAnmAl9HjBo5dtaoCFUJjUHoft5zx+Kw
+Qw908ttrxrjSXRlT+ZPHrFtS8628pzq3q8Zq46pUZXrOqB1JPMBtIPbwjO+F4l9TB82+xdT
rurhhaNzabZL/pQQ3E67kWVL3QZf4G8sLp7aVx64rW7qiLtJUhYSr8qDnXM7bKYnHWm/1ru1
O5ztUA6L8Ix11rFnqrzeZtsphrG4fcJlbdKRb12N+mYjWujrMb7nNvcBj7O9qCnd40Gkyu79
dMjxWcdGb86Nt7u/b52o4kvsqtAWtUI0hwHXakZ+3p9WtmvcGhTxF1ZUaouW3Y2t2gENaDE1
nqSrLivuFY2+CvcfeVKQo3NE020gknuBExD7NdexzmG5DZW1vXx9S5p7aTi+3co+n+VfCNb4
tiz5Lzyjecas8e9zK9zbV21ATMbERAekZlSxZXPOsde8Gq4W5qs9U7TReCBtaCukW2Yt531R
YvltuMfTp1qrG3lq7ax7gAHM/S5e4i6WMfPub2+ZuMPUaBWu7OmW16hAc15UJPqiRm9TWZsq
yzfPbO99uK2FdWZ90H0zSa1EDQVIQfCNdVP052vJnOphwKqmh8Y5Nx6b7S88o4Nlxa31RjLW
qx4KiZKFDKOnPS4z5H3BtMnwS9xF68Oq0Kxfj3ETa1VHxiX4Lz/Wzx73DsDwW+wl/UZTNWns
tZzUqSRFzw6HgvuFj7PjF/hr6rTp0KtN9KgNHF5lvEJZidzY8pv7qpc3Dm1KzqrKbi1jiVEj
GFkatXaQOia94gRKe0ghJ/CRgLfjGcucNm7XI2yB9vUafNoWiLLix3Hu/wAiwnKK9tlLRzRX
pUWMqMGu4Kemv1RrXP63VbwD3Gr4SjUxV7T9bDXStr0XzTeELk8I1rpZvy3uH8oxfF+bVLix
qNNhWPlqkKBTOrCdYl6/kc+fmxXe5efsMhzStlbJ4rWdcsqM2mQKDcIxdbkdVyjnuNzntrSx
f3FNmQpIWtBA/ptkifCUbnXjn35dVvszz61wN7WpXnptta0qryu8tSX4GcT7N3/2jmMpl6VL
mdbJ0ni5pG4NSi4/SjnKNO0YlynMx2fuzzTHci4/jPt6wN5ahLmm0gblHQDsY1etZz/2ZPaz
3Ex+OwV9h8i9lGjUplrXTB3uBR3Wca1r9I4rjXIm4bltK92srFtU7ahJkp+oOjnz8t8r/wB5
uUYzPZKyvMfcBG09lVjZgPWUj3jd9rPE9XmD9wcVU9tL3j1xWp29yKZFm0umXF24hPGNdVf2
59cf7W8tt+OcnF1Va11OsrHVSZ7eonGeelzxacp53TsvctvIsVVFSlua9tMlQWIlRi+MLdqf
lx/HY1fczADk7M9jarKNOq1rarHEB4afqbti6n/PK5rD85wdHnd9mrelTbuuHVGVXlFY76gF
ib6v1yNvk/P7PGe4dDlmCqNrMqbGXdoHf9SmG7SCP2RPttT855lWzvdLAWF1Wy9g9rKNwtd9
og3mpUHma7XrFnULy1+N+6WHuuF3eLvttve0bg1LQlyKC41BM9tIWr3x4sP/AHTh6Ocs23A9
ejXtnUb17ZJUH0HdpKErM5qvsfcLB4zF5qzqVadWxvWVTsLtznOeCBp8Y194k58xzHDOSYi0
ZRrse23qMVvneu12he1p0XwiTrxrvxj5Hzux5Fy2leVd4p0KfotuWv8ATCs1JA6GJO/TiWLf
N+5mPtuIXOHo1WvN8wso0WGVJy/V+Sxq9Rrrn1m9qvd6nbXb6OeqtLBTFN9dxRxa0IEHeJOv
F74c9Y8jwVDm+UrXDqL/AFqjn0L0kI1qqg6LOcZ8SWyKTnnPzmQ3HUQX2FCpvp1HfU/ofg2L
11PhicXdd37a8+41iOL39jUcyzpXFB5aHOn6u1OvQxOafpK8MvqralzVqMKAuJaT27xn4dp8
Ow9peTWvHuU0L+5YC0eRj3LLeEduhLlZvj16l7xcZoczzbDcB+KvaANvdiYbUa2bT0M+savU
1yxr0fd3AuoY7K25ZRy1k/07+k5wa2rTaTNs9S1I3O58LOWpa+6HGsd7ruzdJ4dicxRZTrVD
J1F0pvT/AFRLZpP8ZsT7uYGzt+SWIe0lly+6x1cuGyqHPXahVEifaan18b1P3l40cxjs9bOD
batSFHKWjyA9rzIvYqLtjU6a+vjzCryLGY/3auM1TIu7GpcmvQrBwQbyrd3w0MZvynGz5dpz
n3Twlrz/AAvKMVXp3dGlRbQvbYEEjcpd+XWF6a459b2X9wOL3mbq5Kyv2to1gHUnOftdTcBr
tBWRjds8rF5+Xll/wq/5BkrjL2+Strht3Vc41S7b5iZkhJRi877DjZPVPmeG5DBBl5cVKdzb
B4FT0XEgf8xSSxm82Ny69b5pznjGd9prTH0bplO/tix4tC8FxZTCTAMb3w6nrI/3DwF97PDE
2122yytq1otWOcpRuoUIhiS+J+kuxUe1HvS20uqmG5PW9S0ubf7e2uv1seAjQ5zuh8YvPdZ+
j0H3EtB/6afRt6p2tcxgqk/TuePqI0jd+C+PA/8A1ZyFyVadS1qMehUVggHbSOM/PW/u9Q9u
uZUuMceyHEOSOFlUcx1TF3rSDTc531M3aCN8/wDqnc+0amT9xaWAx1vcY7J0/Xp1mPNs8iq2
vtIPTcko1e2Jz66FvuVwm+zVPmttXba39S2bTubeqZtNL6mN/m3dIksb+uMdn70cY5Hg8rjv
Xdjr71i+0e+XqU1BKklAR1jfP6TfWOuNc/lvcfG4itg67r77q1t7ttWrZB3qPOrTUaRpIxe+
5/Djiyu1f7t8Mtvcs3X3zHY7IWLG/cgoGPAJ2v8AjHK/phefmOQ9sPdbAYblfIMPkz6eMylx
Xfa3jELGuJcgJ/lcDr3ifb3V44/9criOW8Mo5jMNHGLqld1CHVK1rUrt3MC6gu1h3Jb4vEsm
KlvtTzJjg429Is/U0VKZcfkDOM/Vfvj6TvhSs/bbAXF6TRfjatu4Bw2hr2asJ1bpHSTz1z7v
rU/90cKuc7fY43jaJvLMCnetIcxtyA4bHO+G1Ik79X62xw2Z5TZ2/HKlJ2bDqb6rDd0HJUNQ
BygsHTamqxr/AKrOPG77we4drX4vgcjxvL+nf2lRpr06dQeqG7B6ZIGoDtYz10mb0HHPdfEc
s9v8vgs7dtxuert8lwPK2tucCXNT9UpiHHWN9cRV4DHWNtyPj1LGZepeUWXG+tYOe2rtKo6r
IHa2N9fDMnr1vkfIsRxrmpyF9cNpMurNtKtvO1GtKh6/q0jN/jMua5Wr7qcTzGBs61hcNbfY
TIiubGq4U/Uot3zYdPM10ofZvNece+HMsdkeX4zk/Gr8PYaDAHAlrmOYfMx7U1jlasnp+Rf5
E3eY4xj7I2VNmTtnbrkkF1CoGya5NQ6Nc9WROudd/Ze6XFuWW2FzBvxjcvjKZpXuMqkCk81E
8wcfqaNq94sv+p1L8tO290+K5LnT89b3xt7jGUPQO/y0Xs/UV/UvaNeacxUe5/N+Hcvx1plM
TkXUaFpcFuUxId6NSqxZVqTtHJ2iXrzNTVpxHOYzD8jtsxT5cM1i30QxlOu4CrSa4psq7igc
0aiLJP8ASf8AlzF/7yNx/uBf47E3jKXFrm8a/ds3NDk85poFa1ztUjN79adv7n8p4FnKnHal
7fW91i21P69Bj2l1KqQNu5Cuw9Uha55/7a82537vWltTfguMbRaSp1MgwBqBpm2iOjem6NX9
cnjr9ddzxj3Y43yziWOx17kGYjO4hzXVGP8A+ldU6YQgOMlOpa6Mzv8A1O5/jZznuJxbO8pw
Fh/dW2t3g3uey6Y5KLqpaA1pfoAgjcsZkNzv3G4bzDD3Flj8vTs8lja9N1+CfTZd27FFVlGo
kyfGNceVn9d/jarZPhlLDWDOL5i2srG6Y31mhDXoAhHENMt85kxnmxrNrR4pjPbjCZXKUbvP
295mKtMXNjk67huexyg03kqA7c2cJ1l1Lzuq3K3lK0q0eXHkNvXvcPV9U4LcBQfTMiKLhMu2
9411ZWOeLy6+h7gcQyGWpcvsM3RFh6LRXx1fayrRqMBLpumqFPLrDj9JZlb65uvmz3d5VjuU
c9yWaxwe22uXgU/UAmGMDFCd9scemuJl1xj3gtBIQKhEZdSNY0vKGfeCASd4AMu8EOZBF1mD
3iYusbiA6RC9vhBnRap+lG9/hAQpu3NcgiKcbAV2/VFNNJVlJZmCk8zUSQIUAQTEeAAqeY6w
TBa5zUCqOvwikOWtc0khE0WIqN3Gf6RIt8YJgTD3GSdjBTeUo4IAqyPeAKgTA8xVB4QQBt3h
BrPwUShggcS/xBkOkUEopXXqVgGa8I4TISXjEVAahQogEDDCQJM+hB7wQzGuBA0kqr+UFkQs
JRCqap4xDBZMEaFFcTL8IahiwGWk9IojtqgA6IoigUXNAE1Q/MQUVcSSOs5y/CIAZH6tpGoM
EODtbuaUUzOkAA0PQhx3GRJSXYQEa0koQh0XoYGCaiKs3d+8BAHOBPTU/wAIAlom5RMSBgIS
oCnzJ0EoKLFkd3QSAmsEAq18ggOpMBAWjos594DKBTCJ1794KRW7wGmYn8YIEzMS+PaADCC6
ZG1CiygIXBrkWZMFOmhl4gzgAqOVEGoBioXeTpJBDAvne0oPiT3/AHRAykEAgz1iBzs2jv4x
Qh2ogQnr8YqmJBLUHy/fBCkguTUwBA2hSdT9QiCOqAuDdBoDFNEAKd2g0X90FiODAk0GsQIx
w2nqHSEVEZTcU6DUmIuGOu3U9YA7WoZEuSfhEQqHa4dDoIqYjkahBkNWmAgLipmAQqQUAxqq
An7YiaG/cC3xQr+6AJDDTAGuhirALmOIDCnRO8UHcWkdgdICbN4Li5PH4RBHiZcZt7aQRG1R
9JPl1DTAKXA6aAzSUCCjQBL6pAxVElzJzTqkRKBe5pBP+wgaUrUeHHTv4QRA9rXFrQq94imc
qz6SWCgTumxSP5tIJSuDtkiNx17xWT03gtAcVI1g3EcNrnHd2QfwgpWklwLgpbrOUEZCBtJU
BSsoL/CghRqnQ6ziMiSUJH0nVIqh6QNIgGZ0gGO5jAknaEkQE2PKuPZEiaYDHtCBVTqIAEkt
kUBgYDWgFFVTIxERUKnTvFwRpbvQDzHQxRCXuRUHQ9YhqAljCVG1UEFFoDmKT5f2QWC0NLSQ
Fb0MSkhS9xJACfuigb3OcQCCiTIRE6RcTUdvapVB4QBDmuBKoR0RIiaLmmRBIWaeEFDaXNLk
+cAC8qCV2jWXSGgPm9R01MRaVznJ5df3xpNOxzi0uOnh4xFOXh3lagIMyO0DWNQpXX9PZIoJ
VJDWAjCQ5Sh7BIiCWlCQEWAxva6YLpADSBjTaEvm+PjOLy107vihpMp3RcV8iklJBOkdZHmt
krkLp7H3Vb0wm4kr3nHOvVrX3OmCpQfhGWYfc7auhP4mUEbparD0PcHSNgslJwVwEogzs3Fi
OMx0gCxxLvMUA6xUZWgtYvjNZxCGKrNB4DWGlalw5X7XJtA8sSryqqtqKd0xy+V00HeJG30z
7PYmhkfbnIBuw12u306pAJ8rVmvTpHfrnxz/AEnjynkDKNLKVvt3tfTcS6WmsxIRyjH5TI0G
7Cm6XwjToemD6gbIl3Q/xgPa+B8Mta3DRkKJp0rqo4trVqg3AMQGXaKnVaFDitphuZ2VbKtp
V8fklbSu6YVgqnRyHScPhObsdxZ8Ksrm5v8AG3jqF3RexaQDQPTJCtOms4f/AJM8a1bh1vbY
WyfRFC0FFwZc06rQ7c4uRQ5DrCXCuC95OIWuMubbK2NJlG3uGba1NoQbwZuGgjHU9Zl/1wOG
sqV1f29Go5aVSoGuKooJQzjUdo95PCcVZXVvjqttRdi66Ui1wAcjm/U12qg9Y1rncaNj7W2u
Hr31alTFStTqltB9TzN9J0+vaEmJKqed8Bx1TjVPktrQHr29UsyNKlJpYCm4Dv3jFXcqxueD
4HM+2D8hjbVlF9BnrUqhQuIZ9bV8YvXPh3GfC8cxeR4JYXtjUtGV6A9O6dVaJESRxTWNT4Xq
ON5bgbGwy1k7LMaGFC4USGipTcdWymkNTl0/uLwTE0uK47N4ygy2+3dT3bQPPTeR9fdDEvny
sllW+X4pY3Fjj8jiW2LaV5SarXNaFdp5fKe0XYnUeUcptX4fk9J1RjG3bXLXttoAACT26IRG
LPU/P/y7T3I4Zin8DseR4+lRo1mtYbnY0Ddv00QLGum+/K8W3MLSdQZhYzgG5x8rSAuh6wV0
nBn0TyWwpXFJlelVeKVZlRoc3a6R10jTWePecl7acfqX1elXt6LMbcUUoOptDX03ogXaBpGr
64qHF8KxVTC1qNpQtjkcZWdRvaNcN3VCT5XMcQZERY1pLXh+AHLcc+hYUvtcg00L6yqtBFKs
39TQ6JkWVY5n2t4/eMyWMqU7ahfPYamKrUUa8EKUdKY6JGeoxNfOd1QqW9R1GpKpScWPCfqa
UjEbnre49x/KZzINtLJqkkF9QkANb1MWDucx7fYy2wVVttuqZK3G99253lPfymSdo39Gfu7H
D+3WAt+H2+Su7Chcs9Pff1C8EhjhN1N40SLIvai4f7aYm65pc0HmldY1jfVtgSv1SYS3qO8T
6+nKc54FivTqf2+jTtcrj6wpXtqxzRTdTem146Dxi9dRJa6G99s+MY7BWbr2xptoXDRSddFz
TWpV3DXd1bu0hmnV9Uftt7X2d3d5Zt3QZd1bc+nabnLTcTPzNWWkoTmf1r+LfE+2/EslnWVa
NFpY9tSjXsiSaVO6Z3HQO6RJIk1lr+0+FvbHI0a9rStMnalbapQdJxE3MKdx0h9U/wDLIfa7
B2jcdWpY23r2VZrfWqVXBlbciOG1QSflGj5rFV9lsNbZi9uLdpurEMbUs7d5KAO+prtFLTGZ
zNNV+c9nsRlMbRyWKabK5oVm0Mjas87ZlDUaq6LMRbzItqwp+0nGnVaWKu7X0HXH9GhkWuR/
q7VVCoI8Il50vTncXwHHWeUyPHL7HUrjKWa1G16r9rXUdGvapaIxzPTm2xk537V4yjx21zOH
YKVxuay9tg8ekN36mOK/ti9RftlXFx7S8QtcHZPyluKNO7aKbskH7alG5cDtWe0hYueHfV1x
3FfbDIN5D6eUtqVbHU7j0KvquLTUAKbqW2ekJGp1sdxQ9nuN2/OrrHvoMrWl1bCtjmveQ4OB
mCVaqQ+s1jXPck9v8NYW93TuMayzFMlv3LKjkpu0B+otjX0kSdek9vvarHZLA18jfW33z2OJ
Y0vcGupMKF7CwiconMldP168Uue9qbite+vxh7LnFVaYfTdUfOmT9THEAgw+m/DPP6WT1XVP
a7N4wW93lKbWYh9VlK5u6B3CmHETcoUa6xjrjGp3Hpdz7L8UpZK2tHY4fYXTWinfNrVC7aR9
Y8/7o3ONc+7WpaexuKtP7lSdTfka9o8mlTc70v6JALX+UiZnF/5zWf8ArcUvM/abD0eIM5Fi
muoVbY7shYB24ikSm9jnbjLxidcLz25vPe1dyeOUOTcYrOyuIezddsI/7i3P6tzWiYHcCM/X
zXXrux53UqObuYUJaUjFb+/+MJLkPjoIoDiqFVcJEE9opbqKCp29EIjIT1Hlvl0Cr3l1gmCH
OaBtcQsgO0GbAVu4tdM+Pb4xLGuQ+pRpPymNSYthRUAZr1mkgsMKIcrVaU29wsRd8L6lSYmn
74Ws4UOUr1MvCIvNEbmzUEHUBPhGtWyX1uWOfy1ix1K3uH0aT3bi1pkqJCpZo3PJs9c2z7Sv
e1atB6qx5BCDposSadcz+KtlTyhyI4GZipguq1JBEHXxWCWi1+xTNTr/AMYaa6ij7kcppYJ+
DFzuxjmem6m5ocC3xJWfjE+1ZqtpctzttRbTt72oxjAjGs2yHQTBh9qY1b7kGVyYb97dPufS
UsDjIL1TvDV5aRc5ynTdN0oNeEFRzQQVIMz8YqVHVXOB0JH0+KwWBUqKJjoBIJpDWeqWnV2P
aT1HT9sTNXlCXzLZALrEp18tqwyl7Y1m3NnVNK5YDtcySAyOvxgi3Zz7ljWg/wByqteCCoQm
Xy6xYSRb3Xu9y67wFbB3ddlxY12pUa9iuc4FQ4ldR8I1q9SY4l1RwafN5Wn8FjKTyI+5cWgg
Js+g/GLOWvsQ3DtxPQhJQY0zXFrSRNIi/Ldw2av8RkKV/YVjQuqLg9j26E9nAIoPUQ1MXvM/
crkXLGW7cy+jVdagik9jEeF/Sv8ALDUnPuuVFXzBNBMyRYNF9UuWauEgOyxdXCEvJIBRRr4w
1KyF9baWqoAmAdYhSGog1QgTHxhKiMqMARokRp0EMWSD6jtxQgiSoJQtSo6ruQhCBpGcKIqT
chC6kASWKSMT37igKk/LWDTI2s5lJ20y0TsCIYeA2q4iR8p0B0J8Y1rAMrOaCEnqD0JhGsEX
LvKXzP6T2PeDJRVe16Gf5zEUMbmq5gG7TRIigaznbQ7rNO8SNfYKrnF6vT4DpF00Dq4KAsAh
JbqBNJjtBKDg0ukFXUp1gziIFXcXD9kFgkeZANz2yMu8QsEANUSPcQDBAigKkh4+MBHPVJKu
gEAUAIWR7QVN5kPqTWAAAfuJK9RBAZp5tVn8oodfOmoKfjEwKHOJkVQ6QMZKiDzO+YMBGuY8
EgKO8MXUJeahFMIQJgyCQZqAuJBcECIAJzgsiK9RpOXgBFRHtB+npNYBl2hXAGXTQQUQ9SpI
A6/CIA4Id09RtXr4wS0+8op6yirBUNSfT84jWo1CVJTbODFM1tTcVPRdxkIGAXI4STaBPvAM
xvUop7QWCgkdEkkACd0gOxcvQdoqGLQ4IesxEVHBzG+aY6QQ25rwBrLSIaWqQWjsDFgIXaCZ
L07wXEDgFJEvHoYBiSqIJJ0ggDbuPczCQAcu4KqKEBgkF7Rud0I0PWClLnOCETEx8YBmEtR2
1D0PWcAUKSgAGN13TnLonaBDICFIkkFKqIpQD98EQ67QU3QEcNhQ9PCUUMEUlJHXtEUVKKiK
YiYVjmh3mBQEzMVBJCGY3d+kF0HOVQEJBkkoAHyodT1EBFVWDQBQszFEaASA4qREBeSVT5eE
FlSRKCYI11gahBLgR8oIhDlHcyQRFQlCQk+pMBAToDtcSJ6SEAr3Bqp5pTioICo7WXzBgDvI
mQpAK9ICFpABIVZy8YVC+mJgCaTJ0iAhgAQic5L+6KpWhincdq9RrFqIQ1BNQ6UQQNGgkBIA
kwUoRpUhZz+cEMC1wQIH94Bm0w1oLuv+04KV7GourQVHcQEIcR5p9hF1LNMdBtKk6mIYnkQh
x8g0MFL5Q4INRLoTAQHcCXLKUBKbQSWEqD8RrABwDXFNO0RDbA1oLGwaBSCpke0VAcCqBAOp
MVTK1doREnENQNKBE8SIlRA9F8p2tlLvAQqE2M7QNM54A3JNEn0ijG0ogA8vULEqjsaF3BEM
iP3wA87SNpJTtpFDebb5hMz6QQn9QlJbRMeMAzgCZkbu3SIEc4hu4mZKJpApxtUD5kQRAgcQ
0KQJiKoBz9o2jb4dojUFNoUumZEawasK4nYNF6O6xWKDSS6STEwYMsjQySnXXtEUKjnbwmia
hYAt3IrXIOp+MAoDxLoRrAKWhqqVTXuYAFp8pPf5iGmHqsKyKgaNguE3OQFA06RUEdAinWfT
4xAGFrd01Xp2gqOLwUaSASs4GG3O2krOAR50BJHgO8UaNuCLwjdroe3zgX4dxxkD0LgNII2F
XO6SX846T4ef+uVrlvqOAH1EkAdFjn09XTF6m0H9SjTwiMkG2cwnfwist9GbHCauM5xpWZpG
gCHx7RkMxnjLpFTWUtqOUhNgHmSKhwdo03DqYKAcNTNx6gdog1L5u0qJEBYzWoq6l0yrUYoC
9U1SLF19H+wfL7G3x17hLto2V6bqlMkhV2ptjtfYnU2PN+Q2P2eYrsDSaLnk02OKo0kyXrGK
48bflWESVoSaERHRlpnt06iKr2f2q5naHi+Qwd4G+pTY42xLg1Sk2pKCY2eRchx15w0Uri3b
Tfj6rH2yKCuh8yrGkts+G1xzmfpbKtOk0Nc1atZ5K7RqpWJq1vnmuLzHH7oM2vubW4SnTLvK
9iydIgy8Iv8AWbHLe6/ILXK8fxr3BtO4a/z24J2lo11nEq5tcpm6djUxOOz+Jt2WdamRTuKb
HS9UA+cfFIti/FenWfOMdncNir1zGPy9lTNO4QhomAN4b3lCwsZqfuVh6mZucVeVA61urb0n
AEgsrIkimpjMJWjnOV2lpxjI4+4ApW9al6NNoKvc8DofGLqWaz8HzOHfw69xZZVp29Sg59Im
oTq1EU+PaNVnqWxzfFslb2uJusaKDW1KFQeqC4htQfpdt1XvGeemrPFjz3L4PK8Wx5vqOyvZ
VRTAY/Y40z9SKsa6n9TPVplclYZf2zq45rH+vbCm2m0uLi5gcC1VmYnTXd9VGEzlp/Y7M0rY
0/tnJUtw4lu9p1AJWaLCfCK33byWDyV/h8lVpD7irTLLyk0gOQEbCdTGaTn1ecozFhd+0day
okU3WxptbTcVJYDuEuoi9xrp4B5nPBTZ1KxFjM0yAGvcxBccRu7WzztndXVMupUnqdp2zMgv
zi6stfRdxz7G2nIMO+oA+1ylB1KqQ7/pPkirrOLrOKO5r4oVci61eWZHF3Bp3LGOG25oPIc1
xb3aesWMTYy5XkuEq5DCZes19C7YfT9IO+rpvI6x0/jfMyue92uZX2KzlO4xW30rugCyqVNS
m6YIUFPGOPVrHP8AXideu+tVdUc7c+q4ucTMlxKkxl0iy4znLjCZa3yFu4irbvDiNA4D9J8D
FV6lzrIYPmfGhmMS91te2xbUyFhTKNcBJztvcRu1zv5/W66bA8gsLz2suLKzV9xbUHNpMqfq
KKWKPwh/G+/XB+yWftMZygm+qvdUrD0WgnyMY6RbPt0iSrOPGP3iuk57Vc5x+zVhFSmUNRiA
leh0iT5Z5juucZ+xyftTRq2XncynTaabzI02yD1/mEo6J3z7FP7Bcgxtvc3dpc1H+vdgBzzo
A1drh+MZ106kxh4vzC2w3upfW+THpWd/UdS9ZrpNcD5KhXw1hzMZ5uzHe2mcsrHMZi0e4vo1
XPS4KdBIjpGv6x8RqXPJMVk8Nj8jY1y+rbVnMubcI4Ncwkbpd+8Wszdb9z7h4G15Hj6d5VFK
hlbZ9OsGlfRqAo1x6o5YxXTFWzk+P49iLyi9w9NgdtuKjlL6odJ3zHSNeM7/ABlqcpw+Zbj+
QWDzVqNpNZXtHOlTrAru794Swsc1yR3GOXcrr17W7dSzFhSpvb6RDqbwxd9MgnURLmpzLFhy
rNY249uH2l040Klu9jWuaAN6H+U6pC1bPdZecZ2zyHtRb1rF4rGn6dNzXibg1sqgnOJb4vc9
JxDlWNyPt/QvKbt+bwzmMq0XFTUbuHmHWbZfGJz031wy80zGMu+S8cy1K5qUqNegW07qmWrR
rEny1Gk6TQwtYkb2CytqauQx2Z2XVG+pmnXqFpDQCDMhTGkvLR9o8niKWDy2ItbvcaNWs6jv
0aVIDdwkQQIS/wAS+8qD2e5Zj7PO5rC5IizqXNRzrcqdgqU1BZtPdYxy3n/q6LNcgFXB5O1e
H3jatN7KlJ4a2nsSR7qOkbt8c/rflR8Gz1cWGOW/dkqdqrbKi9pDqZJG6kXElQOkTnp1dpS5
txvK32Vx1O8bb5KlQ3tEkLhIsE1Ma+zn1wos3m7G59tspYXFQUa9OkS2q3yhyn6UdMr2i5sa
s3FTwvJYPiWEF7Z3f/5MuW7611XPlqbh5mNYdF0SMzyOnd/jwzlV/YX+cu7vH2xoW1Z+9lPV
Cdfx1jlYvHORTkFxl16dojTHVQfT5iusVm0rXoJzJ0dEICEJvRToRBQqPQSnBnCLtaqJ49Is
agjcB0MC1CC7VPnESEa4sVp0/NIa0indKbSIjFLucpI+nT4wIhJ2DcR2JHaK2UqHJqAAieMA
i6qVcNIoDnIAZrBkxPmXQDRe8E0CCAQSAo/IxKlTyoGg/AQQwdJag2kSBM4ilA26dpJ1MFBp
UlV/1GKpahcS1J/CBhdrjNwRoH1dYIDnEE6kN7REEu8oMjJfGK0jWjUKnbqYiYhRAVVyzJgh
WOJJLjMSKflFXR3Ev3EKSgBiiAgu84TxiIV7lk2SH/ZYohegQAhvczggNL9u8SWJQyjcoBRw
gooQSdoA1URFQlVSekCEILTqW/6lUL8Ip6jKgDQRPd+UExFcCBpuH5wB1UEAqF3QAawId0g7
w6QEbuCSl0SCYjWsLuz3aeMRSuBEyAoih/VAQp4GAwuDlImWn5QRkLNpSY/0pDTAm8yHVUgA
8gFdADPqYAs10Vf0nt8YqIX7XFAoPSCioaJhNVd27RFQuUEqrukpwIGg82h/GBoA/wAwUeP7
oqUXByy8pWQHaAQvIejgUMEZC5ztAjRIpEa0v6SRqs1ggNAco+a/CKHDgRIK6WkQRzdChYSV
J6fhFA1d5VTUtXVYgdpUymO0AB4SaQs+pgCACxDPu74QDI4IOhmFGogFHmJb276QQSkwCm0z
TUxQyqHLoZKdUiKgJYA5dOimUAG+Z5V0jNO8UFsgS4KZKe0EMrAULZtkfnEAewbT0KLBTBxI
G4dNBOCYyOYAyaECARoVCkuw6wNO36wA1C4AJ4jrAGZDWgqJqDMAQEaWBANR00gDvVBKZkR4
QAHeRMGhDiGqChVE7wMDaV3IUEyF6wRNxcNySGgioYlSHEIUCJKIGawSImTNIAq8bmr5hLbp
AKAm5zpu0I6QDh8wRMnT4eMRSvapUSCxYzRcAjCqzWUFFwJdOQ7wAPSRTuvaKA3c5SSrevxE
REe8tYECEn/hAtEKWyMQQ7QAs3HoNBFaQtUbvq8PCCJtkJfSJFYCAOPRT1aqjxgBudvCNPml
2gC97FIKhP0mX4QQrWKFM9ZLEMOWEhVQN0EVU8hG5FT84Go4EzB6T7QEa7a1EmYq4XuEROsR
DNexEBM5QSAO23p9XjBpGggF2nh1EEQahzTIaJ4iICXFoJT/AIxFSRQ7QSnWKAKYYQV8rtBq
IIb1NjSEQKkVGNwaAHHvIQU7EcZKpkBCoUtduQlXE/lEagpuBLukgfGKEcFb2enTT4QZFtN2
hCOAVIiiNQ7RrpBIqA5CWtTTvrAAtagcflE0FziQg+kajVIpRO7aSQmiAQILQ3aRIp0MFK5x
QDQaQQGgEuM5fugoud5QXTLdDEUNrZIfMZkQDIU6a6RUK4gNQAooPxgCHFw+lBLaDqsQEhmp
+pdYolR25nbuYKxta7cQkk1gHmJohSICFJKFAQhHeC2ApaAn09TFQCSoDZkzMDBBBcW6HqIK
PphokVACgfCIVKZIPx1/4QZI9pCK76tDBDbg0N2zKzPaCorSSkh/NAAzaQZjqBACQXv0EIAH
ADsTFNO55do1E/OIaRXb9PiT+EDU6nqAVPwipKLg3YXA7f2xFMA0gIOupkkBGhxUN1mogAQV
2Ih6RIA0qFVEVRFDNb5So8YCFxnqo8BOIug4ktM0JEgIIxhpEz8+0XQ+0bZT8fGAVjnF0pHr
pAMgcCeo6QXQOgJBBVUghagHp6hT++CtCkHtvAXhWlJHrFS3HfcVpB1ndPDFYGrMp0jcc92u
Qrtear0IbMo2MV2rC4bDt6kfisRkpY0AN2kNOp7xUboa7fIr0K+EaKdpKz+oGaGIjMwh3wE1
MUODMkadoBvUIKKE1Cn8YCNDySgAB6iIrWu3fUs5IRGa1FT9sKd1TP6CVB/dFi49/wDbDhlh
leEXuU9BxvaB8gDiA5vVEMdepjPXjhs3Q+zyD6RLndWBxLi1s5KYxupqvG5Z/wAUMUhmipsJ
luixXpHDvb43HH/73WAr+rU2tpMcWlsvBItqdMeN4ibzllLF5Go+2oV1dbMqPUOTRoVYdM8d
a6ej7YMyP3uPbTqWdSgxzqDw4ua4t03BUnFkz5T7Nan7bW1liLG7bTfcmq4suarXFuxyptKb
Yms9+45j3M4a/j99SfSquq2ldoexz3biFH0r8oz143x+n8rk7Jle4uKVmKhDKzgAFJAWSpp1
iRv67Xqlp7XWdN1LG1H1aN3cNaDeNLkD3BQoCKO8bYu74rLH2rvra5vamU31GWtb0SxhKOci
hy6oYvPjX2a3NPbq4sMfbZu2r1H4qs/03sqEufSeZfMROuo52Z0s6/tv6XBXZrHX1avXojcd
r3BiADcNoMomeN9TGWy9v7N/GLLPUm17mvctS4e2q8IV6IRCc/4uOVzvHKb76hRc+tb0qjm0
qzqjnP2r18xjcpy6Lmft9cYbDY3JWd5WrW1ZzWV973IAQA1zSuk459T1bNqwzPtvY4tttcUG
XFxb3VPfvZVfN5+qYMW8pfK4DL4y1tszT+5ZVdZPI/pue4uahAI3GcIS3XS874GcZxawzlhV
rVLW5atWlUcXBpJQIFh3C+XHmBe4vIPWfjEW3HfcY9vKN9g/75fhzrZztlJjSUBHcjRY19S9
eNx3t5hRd4+6oVKzrC5qehcUFR1KoTJwckxDMXnrXU5D2bFfI18cy4rtrspGrZ3VV5LHHt4Q
xn7+uXw3Era4a5jql3VyjKhpXYY8tLXNKdDOLzNiW1Ve4fDsjxu8t69K6q3VrcNDqVV7iSwj
VhJiVzluqXO4XN2NhZ3l/UFe3u2ipRqeoagG4KmpSMOsnrniSHKCUdonUwV2PCOB3Wct619W
UWFs5KgYVduIUDoixqQvwvc17S5Wzx9DI4S4fWsbiqLesx5LX03vl5tom2LjP2s8q0tvaeu7
dibW9rW+VA3NBc5tF9QD6SneH1X7KfA+2F8z1LrJvrWwo1HUQKUn7mymnSJOdavesuc9qM//
AHPHtt7k3VjkgtrcvUuCBSxylAYl4xJ03K/tRkLrG3VHEX9xWvbRpfUtKhIa5jfq2hQJHpGr
yzemnx723umWdO6vrmvZuuhtomgoICzc4yPyic86trDd+0HJGcjFnc1DWpOpG6beeZwfR7tO
u7wjUkbneNzOe2+aOGq5PF39xdttiGXttVcQ4NMg+RQthf8Aw53r/TYn2uvW0qNtXv6tneXK
GnTpqKSn6VGpB7iJ9da1X0fbDlFXMX1DMPfTbj5V6gJe4g/Rt3LKJOHK93T8l9suRfYW13Y3
VTI4u4f6QNQkPo1VRHTROxi3nI3L63bH2lyOz7Kyv61HMOpkGkXFrHnXYo0PjCc5GvvFRgfb
HMEXF3kKtbHtoVjQ3USlT1WruDoSal8bGf8Aa/ltK9tLWlcVb+wyHms6znEghszIrtIEZ64x
eb/rdq+1mYdjLhmJyFe7q2jTUq2NTygtA82wCUu0awl9V/HfbXJmyp3t1d1cabokMdSUEhUO
7wEZxrr9PMYr/wBrOZUM0cRc1ibZPX+5DnOYaZP/AFWsP5wkZ+3jZzHt1yajiKuSw+TrZC1t
PLfUSXNexugdt6giNXnCdDgvazLC3pGpkquPvrwB1FjC4U0f/wBMvLSIf86df+HN1OEcjocu
ODvf6OQa9XVKjyCez2v1K9IxNnjU68WvO+Bcu4/e2tm+9rXtDIAMp1C96F5P0ERrrnCWLPG+
0vJG0xZW2TfQymwvp2Qc5jHVEXZv7kaGE5YvWV5rfUMvh8nWoXYfQyNB5bWU7Xtc3xEZrtxZ
Yw3Gavryiade6qvYocWOc5CRpBr6xqOv7qpTZQdVcWUyTTYSdoB7N0EW3xOms41Q5Z6TAiBQ
57XghyL16ziJZqFqO3H9WhgmGAe1dD4GDeMR3bipl2is1HBwPlIIGoiAITUkUaJ6amIWI8Ah
AQupEDwKoPlSRE/jBLSkAlEHxgaRrSAf5vCCIDtE2+XtAHapQfq76QalY2FCmjRCnwAk6Sld
FEE0QD+oj4d4aUCuhap7GDKay6lVHhBRLVBRwHYdflEQgIJLQk5HusUgqh2ny+OsGy6On9JP
WCGUnore47QXQck1KroPhNYIxuJJQfUB0lEBK9NCJiCYAcwTcgI6aRQWgHoroixjDXNKfqjU
YpmLJx+oajWBoEGQJTqYLAa0BrgUOqGIYjmyCSCqB4wDmTC4hfiZQWAZzCn9k4ii1zkQaAEk
wSEDXTWYMpRVsM6aJ8U6Q0QOJc7eNzQJEd4YibZncCvaIaxuO4Aonzi4yFQva4EFQiCKGDiW
lQJd4ilDiS0jXr2lDAahQ7nNXtBCgoVImqiAZrmqnQwBcdxkFBluXT4QGNznjy9tSNIpDKA0
KFMj+PeIoKD5Q6Z6eA0gmCQQCXdTIDRIAB7yNJdhBfkQBIgTP4H4wUSZSkUmPGEMIEIIBmT+
EVD7Wh37IIFNFO6SmUDQ2j1HNGoM3HtA0w6tKAdCYgjUHlSYKFOo6wE8rCGjRVUdYAguCuJV
NTABoDiEXuOxgYiuYCvwEA4GnUiUNE3uAIQoogqOcNunmnPrBKTft8qIgmPFfCCH2taCgTdM
mK34O7+XroDES0xJBQ6u76LBNELMoJCRgUNrXNa0khyaQDNpkkgygqElRMJoVggkVFIYARqs
AHtejdxX9oigohG36dViahy4gSI6QNRZkkyOsEFGkiaeEFAoJNBQSUQDbvMqGZQfKCmUgjv1
BiGoS3egROxgieRUAU+MUGQBAGs5wAc0kAjwLgOsAW9yneCm2+c7fKsz8ICCt4bkCjp8oIQt
3K5UUyHaCGAIcNyAHqPEQMR6MIQKNFXSGANLihQFhJQ6RUFzlJDXT6wWwoBBcXTJ0PaIhqbm
bEmomILyZzdwDRqkjBqgAAC13TXvFRNBovVIgjajQFDRr5jABoBceg6RQS4Fm1wVx/GAjFDU
GvT/AHxANxElUQE9NyBwAlJR0EFxNwWQ8CsURUBQru6doIJAX4fuiAUw0eZVB79oBnFom0KJ
qsACjiHKEI1WAgQokmjt/CII9UKhU0Hh0gBuc3ag8w1EAxf5ZhAT8JxQskAPy7LAAN3PapAB
XrKAYscA4IgBn0irgOUTReyREOrDT2kg7usGitYVRsj0iMkPqOdtdIkajWCIm1AXSAnFUSgD
SZjrosBA5Xap4HoYiGc1p1MAQwtAUmf5LFUo8o8qbiZ94CBikk6aAr1gqbVc4rMCY0JggNfu
UOHwHVYLhS0ByrM9IIYzcQAE1USlAAqNB2iCbyCARp3gGDlVQo1WAXcSdh0Oh1gQzWsBUHc4
CcVUY5AniqQAe87UaQVlANNzNpK9F/OC4UNLXfUF7DrAQvT6QhMyPnAMC7aT+2CA54UBoG/8
TEQCgILwVPSAgQtViN7CARo6u+lZ/KALgA4FdOsUEoQHdu04COpkncZgTSIibmgykukURpIa
SQOwJnEVCQpcGqYohG4NIEjqDpEBO4LsPl1SAUTDiVBbL4/OABL0BKygCpCqF8YAd00/asAy
ku2/8JQUgedoJH0yTSSwQzmva1QgPRZ/lCAatCOQqpimFZ9akDsR4wBV7nEjytA01/OCAj16
bTJYim3ANcrVJkPhEalVtPebsFQSJxqVj9Ph3vHH+njLtCm6mdVMdHDlyNxVayqdiu13LpGK
9NYgQ8nXvGdMD1PhL8FWDLdMgpEzKUbKYACp6gloCIiMga0ENEj0PcxRla5QQn46LA+DsIIR
yeUz+EEMu07FlqYK07oHc9znI0T/AOEZ6b5V1RzHekWKVP8AxiSK+nf8d8xYv4/f4erV23iF
7B/pDT8E1jv17Dv4eP56lXp5a6p1FKVXbXnUgHrHJznw0poSNU80aVkaUT98osR717T5+xvO
A32N9T076yY+o0dS0tQlvwIh4nTFyF+LyHEbLJW1TZkcRUafXMnEKCSsTfD4qy4vzG2rZYX1
d7nV67BReB9IGu4fhGtbsXOfytjdcavKlrXAZaXLW1g0zBDxtMv5okc7HE+8t7Z5HimMvaCG
ix4bUCo/cQip8otZ643r155e4u1xNOxy1nVdc21TY5xMkcoVp1hecduvHuWQz2MyOJwmdt65
Y0gC4pt+re1oRphqf1ZUuQ4nIX1eyc8Uq93bevSqSPnA0I7xNLFBe5LH3HCsth67jULKb6xe
8IN6qSvgREqWDwC6t3e39/iBcMfVp0aj2N0UFhn4zgvXw5HiWYqWvFLrGC4Lm+qlak4oWFVV
ojfPwWzFh7i2GIy/GcVkrSuKVxbvZbXRQjdLUrIkRmi7z9zRyftE+jSrNqVLNlNr9siNrhMe
MOodRSY7kNR3HcXbPuhXoUntJqfqYhm1y9lhtatVPvBhMbUzGNy9hWFK3yTSHA/S2o1JoP5o
l+WJcrquRXtrV9mHMpVRVdainTqj6trmlYvUXr5fPDQfUJQaoe0SK959pc1YZPguT49ubRyN
syrVtyf1K3yn4tIWN22nXsc5ibG6sDbOfkHVt1UVb1rydoIM/nElTiY9nq5vFHMYq0urkCjk
KJFtVCoagCtC9FWL0z/XK3GLFBmQvbe5ZTqPuC3JrLa9ugl3jSy+POfdK7uTZ2dvTd9xjXu3
NrtKI/qHdo59TKSbdaOcqW3/AK9tWY8/cWpcPWNWTqL18waerYz18NW3XnxAAAaUnMRFe1ew
Gdxh+/4/XLadxdNNW2e6THPAI2lesdOZ4dTY73D5i0tMVkba8eKj2l9eq0KG76Z0avwBjTEn
nrLmMpZnIYjN21yx1lWpCr5JuNUESJ8IykmVuVcrY3hzFjZvZTyFOkLqgx6K8uE0EalXL8tK
w5JibLjdE3NTcywq0yXEhRvI3ELOSxKWazV7yhYc1+6Nw37OtRZ9oacw5lWbiSJEKIfJn8Y7
2+sL7AXzMbUpMqWNf0bhhTc1jz5nNHwKyiEmet225Fg6bMOK9dqOf9jSrOcATuBReqFIlbsa
dhd0cbncvaXdQEV3OpsY0eX02tVq/FY3zHPqeMOXvbTJYPG5KxrsFqKppXhCb2GkqDvrBrnm
xeUM3hr3K21Fz2Cvkbcmk5yI99JPIV0M5RLSxQYTJ21lhb62yNT1a7ajq1VjZtVhSS9UbGqx
evGzlr+0/ueHzFvXBxlSn9wyrSI3uqCW1w10M4zmkmfLfuMljrwZuysns/uLbf72nSP6y9p8
w7mU4bFs8VuNzuKsuPWovas7OoNzyfpNQ+YheikxWpWxUu6eO5ma9R7W2ZptbbGkVD2VRNzu
hnFkCZa4sb3juSoYupS+4x902lWbJWNe9pLh4IekSp9WzaZvCB+Ip3FcF7wbJtZ2qkS3eBSM
l52tbD12WWfylpe7Wi5Wg2kxPTcxo8jj8VjWrJ418zXtL/AY28x1Rno07r7e7qA+emKW7ylP
9TQkNTHIe79ZmQyXG8jjtr7ts6lU+V2xhUL84zZtXif+y9937sf2Tj+Vd/UoULilUe6mjjt8
u5PhF7+E+OlvyC7tKt9gcxZ12/2quw3AuKf1EtQNbp0UgiJLrWevHP8AId1jV5Ta3drtL7m3
BrOa2e8Snp0jPXyvGyvIdm1XE/MRHSkAIaSPz/dAQOXSTuqwJC79F0OhIGsBHNHdQdQdYhCg
EjVD0WBQlPcQT16QVA0kdvhBJALnFFbJB4TiJSOLiTJAAsCiUeilE1TtBAdtLZAt6AuUQxGM
iQAEzrOLgK6ANOkgZxCFLn6qjfyitYVGuH0/geixFwHAjaQo8YIhDXBdUkfjBUJO4rMaRSwR
sKFgResSpoBWkqUn+MDAm1ygDzdFiL8BUQuIM+nb8YpQDQQQ4gBo/CAhLQAZloCINV+UE0p8
s1kekTRCU8wkE08IGlLnuQt08JJFQGtCkkKe5gh0cGBDNdRBSlu4qOkiCZw1nELXgyJHUAaQ
1cKNF1XoTFDyIJcJHwgpHuQDoQZCJU0S4h0ioOpiKYDcf5QNO8FwiEFwEgkz3hjIggAT+UVo
agkHNMjr4QQgALUKhNCIKLZjxHVYJhSXb9Pn8esGRLSahJK9ge0AHtYHEn6T4waMGHajZdQB
+2C4xl7i5QFA/wBpxWLBcqKe8+0REJQqBpoPj2gosQ6lOoBkkFwpazvJ3j2ggogEgSZLBrwC
8AEkfSNIYyH1AlgU6n4QICtDh0X8BAFr9xdtTWaS+cFlO4EoAVJ/VpKC6xuUAosuveKglwHm
M3GRgyJaSVVQiy7xAQ4EEAS6mKsK4glSJDT/AGMQEFAgaoTr2ggOY7aF+Pb8IDI5SgQhNe0G
pEDnoZEoUBEUAF+4bgJ6CIghQVBP+oDVIB/UYAo1HQ6wNKCCWle6wDbwKgKdNRr3gFe0lSuk
4AnaXCQUaiAgq7SifVBDB/mO5QDp2/KCo4tcTMmSiAyfpaP0wALFaCJdSvaCIABucqjuIDJt
BBJVSJf7oaoJvBGiCZ6/lDUBzBt2Ey6HULAFGIhOkUDcCPKqjpAZA4yB06prEBDAuhaBPWIa
Vw0RR49YAhji1ShI0XWAM9qyG1BAEteDMkHUd4BSTNFI1lKKGB3ObuU9iYB3VJbjqiQAa1E2
hVM/nOBobDuHQHpAMNzhtSfX4QCl+rS1AqA9oIjg9AEVusUHaAZyTp3/AAiLqbSU7JFSo0B3
cbeqxGoLWK9SVGgA6QA3u3T1A69YqCHOT/acACpJDggB6wAePMUUET8IANALkX/mnBDANQ9x
oB1iKJG5oG0AqvjBUa15ed0wJ/KCptUnyz1ioBTciEJ+MAXByg9NT4xAHAGYHlJQr+6AmjZj
TpBE8oQAfBIBXeYg/qB7wwO/QDp1JgIgITdLrARpagB0GkAGsOoAmZgxQS1qkdenhBU8wKSc
7qdYIVCpDfN+UEAJtA2kkzJHhEU4dIAlE0BgAXEAkhVlJIBNoH0t8UUQRPqaECpAEbTUKpLp
AH03OcHgmWiS+UFB7POizVZd4BS2RUIdei/GALGvAJSepPSBIZikBxHn6/CACEVCgl+H7IKh
LQVOokIiUtMK5BIoqpFQZu00VV+EoKyHzGSfOIpEIJHbp4QJEAbuDlUDrDFwSHbJkAAqDFQr
g4zZKUEphMDd07QXQDkJDQSO0BC4EFxHX9kAHKu4BO5iIjiWoqp0SAKOUk/V3EoAgkuartJn
rpDAVdIhw8RBdAueTqPAd4qEapBUS0JOkQRrka4CamTT0gIAJt07TWGqjlBBJl21gghWuAX8
JCKCNEd8z4RFSQZ4aGcMKVry4lgKRUKx3nIUklSe0RYyEprMaHrAKWkEAiayghiGnQhRqP8A
fBS6jciEdjBEB3AN/KKoSKjcNzfn+EEEElgQBNUMAvmE11/KAZzhoBJJHxgA7oCCQP3xFxH1
UGxo1EyRJIhqvoMaLvzaJ018I3yx+k8d5xumH4y7csmtO49ZDSN1y45chcFHul9R08I5V6KQ
EsUtROx6xFIHtm/ZISX5wxluGm6SEr4x0TGRoJaE10KftiEjK1qlujjoTAsZW6oVVPlFQzXD
6fipgqFu4yOiImkQa9y57laAPikStRRObWo3TaZUAncB1+UWLY9w9tuMZirgrjklheC2dbf0
qoA3FHS6eEbzGLXM5t9w/IVPufM5pk5EDuqxgkk+FeS4hAgRZeEURzm7gSrkHl7RqJ8O24dh
M+20qZO2rfa2rgWF5aSHqJtlFyVL0e2ocizGRfgLeq0UqiueGAtDmgLPxh9Vl2Lix4lyYW93
bYy4pvr2NNziwja4tEyGk6lNIzeab/iWXH+R2ONY+teilQyhDqlFyvG5ZLGpFvf8UHN7LkuP
qUbHJVB6G0VLcNm1zT+oQ6uM/NUVPI5B9i3EU3b6Dn+o2mineZSMSXU7lrt8LxLl9pai3pXC
Vq49Wnj6pM3NCgBZLGrF6uRW2OB5bfZOtd1XOtatvULXV3q0NeP0iM/VJ56PL7Pl1lRZ94RW
s7orTuKP0VCekhqO0SxrmrC2xHOsFxg5i3qNFsUp1WAB9QMf38FMasTvrEteNcioYq3zDLqj
Tt8gPMwtMyuhCRCKfLjkFRlHGNrtqUKtQEU6ahpe2YM0h9WpfVvmLPmvH8TQpXjWtsL8hri2
YLmogd2i9Tw++3Er8T5JgrZtCtc0BRuv67QQUG7sUhU6c1mq2Xu760x99XHp0kFuVPpNB6iL
Pk5ur7k9hzPB8do0q1Wk/EZJqh1JUcWdHL1ETvrTr5echygtc8TM/wAYzFbuKyd/jrplzaVf
SrMJ2uaT+BHWLqyLG75hlbtj6ReGhzt7g1qL8TGVNdczztd1k6tcFr8e5bUNltmOhXtF+ySe
tk+4PI3uujUuNzbsh1djmgAuHWXWGn1a9XP5bN0qGGe9npPqN2NIAG893Q1G9yHi3J+NWVSy
vazTbkh77djlb5ph0TqGuP3AOLVQGY+USGntLy+s7n7m2e5j2+ZrqZIMtDKNQlXl9zHP3tq6
lWrFpqAFxbq7xhauFx3M8/jrQW1OsalAuLqbKgL2sd4dj3iaiYnMZ2vnmVqF0ad/WcGepuLW
nd/MYs6blXHOP/McVWo2OY/osqg1afpH+m/vMapCzHOdbVXac95BQthS9cOZTaWU3OCvDTJG
k6CE6asbnFrnlFy+9v8AFGrX9Fm66RXNLSDqNCYzNa66mKnI8ozF7UY65qOb6MmNHl2kGREW
kkbdXn/I6lq+jUrEucz0zXC+ptRPqiys2NXD8tyuMpVWUK26lVP9Sm4q1e6HrDa1Iw3XKMtc
ZBmRqXL216B8lVnla1NJDpEZvy377nefvqFaka4Da/8A1nMCF3fTvFvS/WMeL5pncbYi1p19
9m0rTZUnsIl5SsPtWrxGpR5VmqGX/urLuo66LjueuoP6T3EZtJz4z5XmWayjBb1agFAHcKTA
Wgk94Ss566PGXvuRV46bu3pvrY20a7/uXpuYwyKbiqCN+nV9cxjuWZnG3NSvb13uq1dwqteS
4OB1BWMW10yYtaB5hzCs4WINR1iwVDTpu2BhGjtQp8Y1Iz5FpeXfuRSsXCsQRSYBUuN49ZB1
XWUb7ZuK+i7n/Fsa28r0XtxuSdvY9xD6dQiYdIlCVjDLRo1uW8ovjfUGOrVbfzktRrGAdpgT
iy1ueRe5rL+4dvg6FtkMemJUso1Gje0Od0L26fON3WbZaw4N3ubj8MX0rKpWxgHr06VUbzTC
zc0LuA6xzbuY4nOZTJ39y+vf1XVKpmVMh8FjMqRqWFjd31ZlC1Y6tWqnayk0Ely/CKsq6r+3
vL6XqD+21XGjN9NpBcANZKpSGM3tpYviXIMo6p9naOqinJ50CnQAmSxMrWtHKYm/x1y+0vbd
9G4potKoEM4uLutPZuVPMGlCO0KuxdY7h/Isnbfc2dlUrUTo5o+cu8SS1m9Mdhw/P5J9xSsL
GrWr2oJuKYaQ5gH8w6RrF+0w1bhnKLakTUsHhigEhzTMxPpWfvrYPtvzVj20ziq/qvG5tNJk
H4w+qXojfb3lp+5D8ZWBtSG1htI2P6NKoirEyrOo1rjiHIqBptqWFRvqu9OnpNxkkX6U+2tL
L8fzWJrillbWpauIGwVGlsjIa94YzKyY3iubyFF1zZWVS4tmnb6zR5N3xMTKt6jDlcDlsTUb
Tvrapb1XI4bmmbfCJVVzmvc3ymSTHYRVWGI4/mcmSzHWdW8c0gObSaXEfECEmltjVvbC8ta9
ShdUHUK9Nxa+k8FrgR4GIStcEgAEI0SJE5xY1KjisgPmYuLaAUogl3jLCAByBVPw6RNWUrgi
BoXxMRrRcGkIJE6/OLGdIpa07vMTKUUAPKI2QTrEM1HgNY0nXrBcCTgSde2kVKTaCdZpoIYy
LS0lBok4KYmUj8JwCBz2uAIk4GCGYPMSqgQUtT6ipIHhrAQFSSnTpBBLWqqgeEKFMiEE4hqG
o8N+kF3QRTRYWqSZJJIaFcQuun4QU+8kENKKmsEYwXBdfhAZBtCgkAEfjAtR7X7DMJoEgjE0
EgEzIKEwB2yQaGSwDMMk69DBormyXr1EEqPBQEFEKwRGABxWShW/GCwJ7lKE6AdIJQpqAQ8a
aCCQWlw6HwJEooJQlw6xFK1pDugTUd4CbiSRt3Ez+UUFjEICbagn8RAxC5TL5k6QEC7UKoqr
EEcKYcpPeCGc15aBoJEGKBJNEGhOsFgqeiIB17RArkIHm166wDPIczSaL2n4RUBr3bggCgSW
Cyo1XKDItOvcGC0WAl5krUUdDAM/cCAOg+rxiIXYd0/+MQBwAJX5fGEDkukUnoo7RoM1u0K5
VOs4gNMgOVPMVU+A6QNFwkVRP2QCMLp7vpB0MEOCCezUQAftiqakpBJPlB+MzECINxmdVTpA
rIAERNf3QQ5VrghnM+EoAKXKg2rqmqwBcQGlTIamABIQEAIdIqiGDWYl0gYjWu9MlqqdD1jO
lhg5weBPsSesEElpUBqIfq/hAOGuczQT18INwPK4eYzEzFSl0CoewH++DJmn9LpdV6JAR2xh
IKq6QgArSNqqe8EQvJQCQVT8oKyNLt0ivxiDE8lSQUC6DUxUMGO3AovUrFVkmAGlUGgiDFNV
PSRnBKYAbQTJZlOsVYYuUBrE7kwaTc7ZMI4mJUKHhx8pB106+EREL03EHzCRUxQUeCCfqAmI
qjKSGep7RAAJLqRrFQKZaD5Ru2qsCI5xciSd1AiKI9TftMlEj2gguVrZFXKieEBCXI4HVJGA
UbkDjNIoKnbJFP6YgVpCeceCLpARFEzIdfCAKB01G7RvYiADpHqVEURSFLddXA9RAwA5Z9eo
iIgLtwEtp1ihnEgBCJKoT98AGE6jUmQERUcm7yddTARHNBQE7fw/KAmwy2kS1EAXo4J+nqRA
J5/UQNkk0gz/AESQP0+KwaQtG4kkAj84AtcoUKo17KYBiFk5qnrALsIaUYQvUHSGmCGLTCy6
S/hEACDQ9dOwiiEoE6HQGADmN1Ek694A6SQSMv3xAJIR06Ad4AhAEJn+cIotewu1O4DtFUDq
dsl6QAcWlglNZrFDAElqCR/CIlgPa5pAOn7IBQN3lBmvSAgagWaqkQFXaAq3UQ0KxrySAQoi
6ibNr0HWaTiCVNwI6E6+KRUAgOnqmoMASXBp08DEEE179e0Fol9P4noR3gC9HENB+MAHbGhd
SNO6QAV5aUE/GKUWM8ygkn8vhACo7bUQTadQICENcCdHGII3y9fAfKIsGopM5gyPaCF3EOAW
Sz+MVRIBdtI8p6QNR4DRuplCJnt+cVEDkb5Srj4pEAa0lxaFEVUc1qp0GvSCIhdUUJ5RE0gj
a4IBMfugG3AsM0PeIpKisafMC7oDFFdatc+8KiSlD0jUY6egceRmIutxQljnEkBFTp4xscbc
ODnO2qdsljnjowh4EjMfsiYgn0lDg07T9QhiLCptJG36joY0nhmA7ZlRKcFZaRIaUCgSQCAc
BxkSmm0QA2sDgSUKzSKGdv3p0AACTiDDXDw1xJRdBGasisugDUovUeUIT1lCVqPqL/HSlSue
HZKzRtXe7z01E1bKUd78Od+Hj3I31jmLqlcsLKlGo5haQkgSn5RzOZiraANqzBkDFU7DueEB
AHTSNRX0T7UMtLv29rspBtetbuc6pQO3c0gAjWFjPUjU5HiH2djjOU4tjKWStKwZd06JBBY4
ohA1hanNdTx/J0K+XdemjQtLe4phiSD/AFDMgoVQxSc4zZiwthx6sLa2p3DaNb+nuRwY4vG5
vm+MZ3GbN+XEe9ltaVMBjbhrGve07G1Gz2lArS7t4ROrqyTXlj8FksBfY+6v6YFCttqNqMO4
FpQ6jqI1Mb+H0PlaVA08PmbJrKtCqKbm3C/Tsbu6dTF1jrn1u17TF31zest6bX17qn922gSg
ftAVNREtTFBmbWzyPt/kMdcBjLi33XdvTDkLXfpC/lA63+Dwa1r3ftveWN/Qc64ayoKjKiOO
3aS0r+YifxrqbPVHwzL3tXg9SxvrSnc06VTbaEgORFk6coczwrQ9xeK1aGLxuVxFNo9ZzWXN
GmVIqkS2+aSzi22fDEn/ALOo5ex997SNuKls593bU6b3bpuY9jgpkZTh18NdT1rWuUq5LjWI
p5PHUX3jNrDV+pppaKCDFnsXv1wnu3xO4xebtGY+j61heNL7U0/M4OKbmE/sjLPPldxyqk24
9l6brqm317akweceZrg5CT4yi9Rru7Y+ci1rXEovge0ZdPq6rjOM47kLYsr0ajr2lN7m1HBp
B0lCfLPU8bmQ45gbapSr+hVNqobXBeQAv6g5O8a6kc59tblXh/F6oLqVvXDnhaZNQkL0kkPr
GpWDHcX4/cUX061Gua9u8trOa8t6SICJES7rDX4/aY/OY2pZNcyiazGuDz+okbYNc9evTvf1
z7PCY25pUQDXBo1Kr2lw2hoLQveHdP6+eHMDgPLudquhEZaey+yXFcLlsPk6ta3FW/pFoDgh
cGbdQCHdfCN8p3z4vc1xDB18HWdTtxb5GzqerbXbkbv2mdN7UAQ9I13lcud1eXHCOPtymEuh
aUTj8uzZd0S0bRV2blbJRuHaJjtYr6HtTisG++urak2vsrF22o0PLKUi3UaiJk1jmsHv7bUH
8Kx94wNNVtRjWVQJOYRMLE/T4ZvlfOpAICKF/dGI6voX/Hu8tcjZ31B9Om2vRYG7GtAc9gOp
AE5HWOnNTubFVYcbxp91fs7qwY+wv3VPVtzTVrWzRwKeWcSfKcfC55BwnhdK7uOPXdvQtLqo
0uxdwxKbwgVq/wAyiU4txOWbjntjhbZ9rjcvQZdCrTRtbYAHrNWvaNwI+MWNXpg4/wC02Gts
vyDG1KLLmpQ2mwfWG8ik/u09u8ZnPqddf+qibxzjmVbRo3FnStq1G4DG3VFnoiqN217HCU4u
epOsdbkfb3iOPyNGhUxzHUqjADRFMKW6blGh8Y1kZtrwr3D4ta8e5HVtbOp6lk/+rbqfMGOP
0lP1NMcu4vHdrX4Vc4OnyC1dmKLqtjvRzW6B3Qu7gGMyO2vqnjNljTjLq1/69o5ha1m0FrWJ
pKXWOzl1tjzvA+22FoGncZS3o3NtdXT2s3U9zGsc9A3dKJzC242LTj9r7de4rvQtql1gcpSK
hqvfQYTNfBv7IfF8WTY263GrDkbctXwTmtuKIdUpMc4ubUkTtIWWkdOvhic2LjD2mNuPa+0t
M5bNrWpPp1WPCbC6qR5exbHOOvThf/V+T4xyx32Nb1+POZ6gqTBIdMNInMd4vHHqXvz10FTM
WWOxjra9tgMTeVGsILXFvqlwRynyhPGN9Vnl02Vt6WM5Bh61qxKtx/UqGfpmixrWkdp7o5FV
Ob9qOIXmSyGTFqylVqEVDLdTZumoEtvyjWRdUeN4HxqnfY7K4J32uRtq4FYFhFKvTVSg7y6R
Prs8SdO0Ntj6XPKJswaF3Vt3PqBx8pcVUbT0Mb1znPtYMpiMRbYe9umUfS+1ru9VlEIj39wP
Gca5shtjBmOD4PleMwtfM0GHI2hFGrWYn9RqfS9JnuIxZtdOur/Hm2c4Rwe1y13hLuybb16b
QadzR3/03EbmF6qEKpOJZFl2O9fjLDH8OxN3ZgMqhlOhbvogGm6sgAc7b3KxvnJE6uVc5O4w
+DyVjyG4tm025Wn9nlqlEK3yt3Co9BoNDGLf6X1xmT4vTztjl73itenUdbOc6hbPO5tRmqAg
yPaFvni/EV3CrvkuYwVvlMhSa44yr6JqHf6rnNJQPCyREi8XYvXjtW894pcZi4sr6lsbd23/
AH9dn/SZWbJrXO7ppD7ZWf8An44rO8SvrnjX9+w9wy7tKVYNuKDgrg0PlVYQZp4wt34Zm67j
lvE+PcuweFx2VH299XptbZ5BurH+mu1y/U09RE6ni2ZfFdxfiLsJwbJYbOBrqli+qbe4pBCA
0I1y+KKIvN/h37FT7sY20ufaOhc16TLmpbhpsbpo89MuQEOI0adDGepsJcfL5DgSAQBNfl+2
OMrtjuvZnI17bn2KFKoWtq12se1SGkE9QI1OsWV6Z798RxeW5pZ06dejjLy7tvUfUewv9Zwc
RPb1CRvuOHN9rzi+9nL6lbvfSydC4ewB3ptp1GlyfUhMon0a+1LY+0f31sy6oZqhWovaEApV
CVH1A9k7RZzq3qte29qazshUsa2UoUa7AX0Q6m8ipT6uCdj0heDS572qyONxVW9o3tK9NBu6
oym1zSGrOR1TrEv5n3cM5jXKEkP5Y5tywhawfCC4VrR5pyBkRBBIakkBHTrBos3PARPjDE1C
QCSSrR27xUtKUJRUHSCX0iFxUSQ/jFEewtMxNIIdibS4zJ+RiKDQvSfWIC6TwdT3ihdsyhVp
hoQbi9U0PwMoiMjgPKAq9VgtjHtJcp766IkVGQsA3L1T5xGihWyEz/tpFQ/6t3aBpHOYPpUf
GBaADn/U2SpBNFzw1oAICaQBbTDgWk6hZRNXCbTuH+kxQ3lIJmAdYATUHqdF0WKhQWqT+ofk
YIbcHklJCQ2xGiluwhyIXJqYJiEAODXdpQMEvUAKhH6jBQQl5I+CjrFAUB+s9dOsA7A47g6R
OhgFCtcQNU0guGLGb1PQKeyxADvKJoSh8VghS07TtCkGYMERVaAiS/bFMFyNHlCFVWIJv1d1
El8TFBOgBExoo/ZEE3OKFokIqAxCUA3DvBTqrtJ6eEFEFxcAiIZiAILSSFMtF0lEBDgin8oI
XaChOiFFgDSZunqAUJ0gouphry0HqsBHAmR1/SmsEoNBEiZDp4wDI7dIwTDkNDf9YkCIqgAd
qLKJqI1ACJz7aRFOGkMJkhOp1ilK7cBucdZAQZMxqtIJXqkCAxrgxzHFWmaGKshgCEn5egI6
QUzXICR9LpEwoYOa4Dt3iYMb6hLg3dvH6k6QjNrIEAIfMDr2goPcZNABBgumGwFOiJt8YghA
IVJHosAm8bdDIlDFQ7WyO4JuHXWAZo8oDQPCKFIClZHoDEU7wJDcS7qQdPhEKxkBz9ustD1i
ph2hpQIv7oCFyhevUTWAUbSUBn1WCGDGy7dO6waM7cvUdiBrC0AAJucR/GCAW7PpkNT2goKr
iERZxQwc4ghVTTukRApbwoDkH5xVNvRwACnw7REobmhQGp3J1gAqTGpEhFDhFIVDLSCwrw79
Cy1XrEqI8OLSe34fCIEa5pIUJ37LFDEpIKp1HSGiKAQSEXURBG7gEcPK6cUCYKgiUFF5kSTM
iSRUQMbsRwPxBnAQ/Rs6rLx+cTRHtQebXoBBC7WIpJ3dusUwzC1qmR0RdFiKU7eqgnVNFiKJ
KiZJHYRUQDzLICUosALqhLtsmjvpBLUYHBpIK/HpESQCqAOJlBpGkElfMEn8YGiE1Gp6QATz
BzyT1TpEGWRCjRZxFJVd5P5R4QQrXEyRB1J7xoFyJoju3wgI31FBHzWCmkHJp3PhAAOaEaFl
+rtBAVoeAQnaIIxS49+8VYLiDr8yICDaWnfL+WUBGqu3p1IiKUghACpOoM4IgLmgqDLrDUoh
xDQAQO4gI2oJqZGSiKoJt7ldEgiMYSSpVJoegiamC9QVmnX4QKBa/RRtJ0OsNXBLUAX6RDQl
R5c0AfU3RIQFgP1kIP5Yq4Yhg+hFdqnWJhQICggL38IIPlAUhXdIoB3KgCnVUiAuG0BdTrAK
hU7VI+KTiCNpkjc524CQEhBcB7VHlHaKgt2FuhXuT1gBtIO49oBy5TqqhEgEc4bS1A4eI0gJ
RL57ShImoiiEk66uOggIGhqhzkJ6+MRfhGNavmUjofGICpa50htdMRRje0OYQQh7/wAYg1rG
V24FqpIeMblYsdthSf7JdOl9JBlogVI1fgz1xhZPzGayU6xz1tHPaQWBAe0VLQJCtHVNPlBN
WIJ6zImR0MUZKYc5wHiYpjK1KUwCkQM9w3KCrvwikLUKeU6EeMFOwJ5jqe+oiDDdted36iR0
jNajn3PuDWaxwKLKNSD2n2hueUYmq7L4+2fcWYb6dw0OaxqlRPcY62M9zIpuV39O7zdeoKT7
eoD/AFaT3NchXVWqDrGa482qprgXgJLtEdpWRv1KTLpDR3Ht5ms/j69duOoOuLau0sumB20I
4dzJe0WVLf43shy7IVaF1x+zs6wr1yj2uIRo7+VViRG5Z3eZx9kK1fH16la3apexzXAIJORp
Lo1bYfY+F5HzN9rei4s317HIvbUpljgx+4dg8xC1R8z5VkalkzB1bStbNY/1KjbgCZ7tLV6R
Kku1UP5PSuOOU8Pc0XVK9BxNCv8AVtb0B8IN2a6Xi3IuVWvH/tKuMr3mLo/1qVWkfMxNfKek
41T7fxjtObcmus/RuMRQc11EbKFMTIanmDtNYzA/Jub5Oj61qyxq2da4Yld1QyR83BqSQmJL
dPluce53mcJhvuatncvoPZ6L66AU3EyCFdUjr9bInWbjWwt9maZr1rfF16mLvfME2hwcq7mz
/KJPG7nwTkvLMzbYtuLNnWtxVeKpdV27g5hUJtJWM6z9Vkzn95Z8fdY32PuhQyDABVdtDXGW
7aCesOqWa1cVfZ+1szaVcTeuog+pbVRtkxx0RxEocoq+YcpzWVrY7D0rWrb3Nm8uptc4eoXE
aSJEMNmt/Pc1y9pxOvhcljrm3+72vFSugG5pClqKoMXrpiza8wc8mTirtU6Rl1lb1tjcubP7
2nb1hZgkPuGrtBHctKwzfhOql/bZujQpV7gXDbStOk+pu2OHcE6xnBrC7vANraz9qr9bkTwn
GpSALi8L3EVXtedUe4H9sSrJ6gvbwuDnVXlCoduJII6hesWXF8nr0HMe6DMxw+3wmVpVq9ag
wtFx5TuciAklwK/KLbtY799jzcuLXAdtE8Iy1zXUe33L81xvOU7rHNdWNRpp1LVineHajaNT
GpR1PJPcChUo3Ntc2t4y5qtP9Kv/AEw0u6kqqfKH2Y+rQd7r5CpxGwxdQv8AvcbXbUtroHRr
dAZr1SM/ZrKuKnvpdMy1S7Fs8Wd7biheUQ4F7niW9iy/GL1VvCnznuTQynFq3HK1Gq61ZUFb
HucRvplVLJFEnEt8ZvOvOnscaieMysI6WOg4Ty6+4tm6OVsneakdr2kycx0nDxhabkddlPdm
lc5OjkLGhXoV/VNSu97mtcWr9DQCVHxMa3XPnlo+5nOhym4tMh9tcWdzTpinuqAUy5g0IQrr
1iVZMraw/vHeUeMUMHkfWqiye19pcUiDUBBUAuJbIRqN5tbv/vS6HI7LP0qVVt2yj9rkaKMD
a9MHylQ4+YfKJat4aeZ9zsRfWlyPtq731fNQbULWhhJVVa46eET7uM5blD3zfc2FlbZGncur
2jBT9SltIeAEmSWlfjFta+rgOYcgtsxk33VtSfRpogZUO4nxPYxi+tcRRNqNDlB0/D5RI09F
9ufd284xuoXZrXNqRtp02+ZF1bNw8sdIncWON95adpbZjFV2XNTDZCoatszympRc524gebT/
AOUOemZ+dxjyvvNcX/8AZ7gNqDJYkmky5KJVokzFRDMkaxN9XierGl7z2FpXGQo2lxQqoXmk
WsDS4iQVpmD8I3ejrlqcZ99LixxeRxmToVK1C8qmtaGltPo7nFxb5k7yjGn1b1r7+VqGTtXM
oVH46jSdTrUqqBz1BQkDcJGH/Ss/XWK895cNd0b62vLa5ube9YQ6hsphoKeXaQZIY1epV+nj
SwXvXWpYa3xWap1bmnYg/aV6aeqKZl6bySFTpOOc7xcTGe+uXs85dXFZpqYuvS9H7bUhgKg/
83eNfYvLXzPu/Y3Ng5ttTufu2Pa61cSKYpuBUOG0mF68ZnM1cXHvvRyAx95kbeo3J2zGsqPo
MYdzmnVriW/UIkrV/NV2fvtlLfkV7eNtS/HZMCncWEiS1oQOA8w3pFnXrOMeT96L5tSiMKal
BlOsyu51YAEuZMAAEy6Rvv8ATzw55q2yvvbgspcVLq7tK7KlemG3NCmyntJ2oRucQSPiIxOj
6+qHifvTc4ejdYm4t/VwFzUL6Vr9T7dxmHU3OIkusTm+r1NNde+WQF/Zf2+kRjLR7n1Lesjn
Vg+T2uCEBpGka66Zi4t/fTBWdWvWsLSrQNUOFO39NjKZ3aNLmuPXwiToxQcH95rjAW2YsL6i
64sckyq+nTai0q1RfM1x1E+sXZ/DPMU/B/cG445la9avSF9i70lt/ZOaHh4Ojm7gfM2MSusn
js773pxlri7yzxlvVW6plnouptp02BxVUB1Ajc6xi8s+L9/7Wpx6yx+Tt6rryxKtuqTGkuaJ
N1LUKRPsWDR/yHqVMrkhcWTquHyFFtF1F+11Rjmt2h4ntUjULE+3p9fFLy33fx+Q4pccfs6F
T0rsI4PDWMYkhtAJjX3Z+mvIajhtEgCCnwjk6Or9vuZN4zkfXr0ab7coXPFJr6rXCYcwuT5z
jfNhfhde7Pudbcxv8be2VOra1bSj6RcZLP6gRoqxrrrXL8+bHBf3vMoVvbh0wFNaoVHzMYtd
MLSy2SptLKd5XpscdG1HtA7yBiTT6oc3lw5lY31Zz2qGuNR25OqTWL6s5PUzeXfSIN7cGmVD
mmq+Y1Kzn84mreJVd5nOAUL3/jCrhkaQZ+YdNIi/VjZuUykPksXDEcSSQRtIhWbQJQz+gamI
mlLQVQIDoe8BA0kO3HTUay7iKgbAU8RI/CLq4j02JPcZL27RGREuigfj4QVGzcXkamTT4RCD
46Ad4BSwbgB8Yqg5wUr5U0KHUwRHSSYQiUGsAtV0j5Ron5wiYyL5ZBZTcnaASoxWkg6THaAA
V1MTQjUeMGR2OULr4wIJY8qWkhBMiChTaG+IGpPSCAXkNTbImfdTAFo8uhDknBYOwGnp4nwg
obUG4lPHqsEYyxyeJMoIZjS3wJJgsKZtUSasiTFMALt67jJehgQC15bpLtEBBaDMJpAwC4h8
mhf2xYht7iUcZKsoKAVJFCun74gi7laSkpk9YGw7tm34dOiwAe4SaegUhUgFJchQbu3ziiSK
9R0gygbTmBJqTMRTubq4BQ3v8IBQHrNdmgRIBiHASOk/lFCtcFB/mKOHWKaYBqEOMx16iIoA
DV7jKfhAM0ayRToNB8YiI5jF8qAjoCsBCHga7WrOUDBPpgLumk+5EUQBQSdf3QAB2yATrEBa
N0zoqCf5RUMoARQ09u3hBRA0cFKaiJpiFz9yJqFAgHDFVp8pAkSdYAeckKgggT3EGR6ARUM8
O3hiIQAsFhmtAOx6gDr/AAguIwiYUlvb5+EQEbQTIfDwiBXNYCDofCNRKJZuKpuBmT1gGRzQ
FKEHWIupscdSToukQwyAhDJNIIJDWhrtyAlU1nFE/qeptXygK09SYBvKfKJEa/GBiEyB6mc4
KG4zckxIHwgg+UhTMabjDANrS5SUKdOhgoEOAmSSOp7QQXqCHjy+EEqBxXWXjEDTafA6T6wa
BwcVG3TWAO5Kch5W694sABAJkihfECAElQqAZifTWCaDgkxNZAEwDd5lSIAEo0N26mRPbtDQ
XE/h0MDR3Ma1SELpAeHxgspXOqBAD8R4QSnHx6yGggFVjaiDX9KxBFLSCZrr8IAnaT5OsgdE
gBtmhVV694KJeEIJmZHrFQjwpG0z6QDNciFx8EOkAriD5gSAO0E0UcszKCCGs3EnQa9TFXRZ
tmeh/KIoB7ph5UGaRMEpqSQiS8rYLhTuE9qou4CKmAxSZtICSB1WGoyCQTv1MAnmBUjc86do
gO1zZmR1+UIqFHBxOmsBN1MN3CcvxgaAPlKmYmUkIQDaAAV1nFDBWt3Fu4GawCuaCCU6aeME
MPp8uslHjDFgFqvU/MwUo+k7pn+UQDtcvgekEQlwBUK4TSIoEbh2Xp8IAvIHl26TIgFBcAC5
ABqBqkU0WhyhG6hdxlBE6KTu6JECgk6IQiRSI2TTuAQGRgMjkBB+cQKJlEn18IAPLAUE+hgC
NCSNe0BGuIHmB2n8DAAlknFqHo0QWCA4jT/YRdNAOQohlA0C1wJICddZwRCTtb36LrEC7qha
UkVkDKJgZqFqqd2gEUFCFBUk6wADqbQWlp3HqnaGBgf6nh2iCbRuBAlDAikuTQTHhFBDCCeo
7xRGNBXaNx6mBiAOP0lB1WICCAU/l1PhAKTqB9abg46QUAhVpdrp2gGcQgVvl0gErOVpEgqA
AwGtZep9y7d9I69BGojtMOWHBXSDa57X6/CUbzxjPXH1iVkEXVI5ulpdrFKKCYRljKhO5MNR
YgbiQ1qFdIrTPTmB0TssVG1ulNPjBGGq5JO1MlSEU4UhE847dYKjHVHEgiY6fxiMsFw5C4FC
uqaRmtaq76kjqVRuruo6xZVfTn+P2Pp33Ccnb1xuFUt8iK5SD3+Ed+rsTq+PKuWV6BylZtGk
aYpONMhyEktKL+Uctc+b4pmvDjPUJMRW9Zg1pkCSYivffbPEWN3wGpUqMTZUJLm6lobNU+Ea
5jPTSyeIGCuMVy20ovqWNR/oXFGpM7XdQiEQ+GeZldpx63wlTO1nWrHVLe7okvLlNNHhS2ca
1ZyTMYPF2uAWsxzzZ1CaJpktO0u+kprIxfhi1xnvhhLV2FsMoKe25Y0MbtE3sQJpqRGOzMvj
yLG2tWjkbb7lhYx7m+aoEkT4wjtK+kL7G2uPu8TcsaRSrim2lSZ9BBCkfBIu4z3NrNW4biWV
8jUs2Ci2uRXYGAAsCeZo8FnBJ4ouT4GwzXt7c1aYJvsa51a3uKknPpNmQfAhZRfrt066xm4t
SsuR+2Fyy9FM1G03BzA0BPSCtIHcJFtXuzNVPEL/AA2T4H9nd0n0brFvJpOaUNQFUSU5FIvz
Ddil57inYO2xmXpUX16Fw8VKL6m0hjhPY/XWOdhzXWc5tMdlfbG1y9Qf17drLhoYg2uKAj/d
Gq13fQ+5wGd4zir1orULwAUalJjpqgClvUdVixOo83908LcYLN2tCpTeHkNqUrkfS9hmE6qD
GL0znrv+X4yxzPs/bX1VgbcWtFr2VJfWu0mLfhrp87hyknaqyl2jCx7x7A2lpf4PM46+aKlr
X2jbIoDuXXvG4vXPjocvwzG3NlS4xkGEWbXA4uuCpIHQfviuXTmqns/xf1atk55tq+0tpVW7
neb9JIcdFh8p9a0cR7TYmtgK2Qu6FT73H13ULyix0nAGTwdUnEvMblY//U+AdnbGjTL62Lyz
S1rw5KlC4H6fgveMxpmHsnjrq3y1nSD6OUxZUeZW3DNQUP0kiN4zbjb/APTPGrK2tH3AcfVY
x1SqXODgSJhRKUJylvriOR8QqcR5fZttKpqWdaoytYVwJmYUE91KRJz63L/Hb/5BYKydi8dm
adPZdVEpVEAG7yrNOonDvGPZ1jwhpqhZKBqOkZdpHo/t/wC3uM5ZgL24p06oyGOO99MPRtZh
ntB/S6Uo6SeM9VbZT2VbUxeLy2Da99vduDLu2qO8zUKE7tZokYs1meN+99jLK6wF3e4x7mX1
oHO9AucWvDdWz+l0ofRPv6pcH7W4zJcTGdayo77Op6WQtGvRxAKFzUGoWLzJ/Wuqr/cL2uHF
Bj8naufc4a+aC0z3scRu2ui3y+JxsuO15zxi0q+22KuyH1mhlM21chXUxUIVriOnScTqTDrZ
0p7/ANpMFjaVsb71nCsxrjcUnbR5goQEHSGLe7a885vxX/x7Isp29f7iyuBvta5CK3sU6iOf
RuqG2o/cXNOgajaQe4N9R67Wk9SipEXHWj2yyb2NLMhalZhC8ifjtjc5T7Y5XIY66x93Utro
H1KZRQu0r1aexiVvnrW5xTH4+/5BZ2F85woXNQU3OplCN8lnqkMWvV//AEBbnJ3OHdc1Kd/S
pGvaXPlNGq3UAt6HoZxrP45fZpf+mLS0w9K8yhrue57mVWUiGhiFPNImNc85Fv6b4x5H2jsu
O5zGuu6lS6xGQLXWdw0gbXlCKdUTjPmpzrpPe726wtOwoZKwpmhfhpa9jCBTcxrddvf4Re4c
9ZXz4QWg6Inljm6yuy9ueE2HKrurZXF2+jdBm+jQB2mqnRris/BI1Essjpsh7M2zEFC5r0rp
tRrbm1rNHqbCUL2ESMbvLnz1WDOezFTG81x2Iq3dR+KyxP292gD1DfpPSR8Ix9PXTjrasaXs
Q593k8c2vUN3YBtai0oBXt+paSPrSLeXP7MNX2Jfc2FhkcVdO+xvKvo12VGg1aJVCvhE+pOs
o3/sxhre/fj35CtbXkxRdWDdjn9NyIUPhFvK3u1T+2fG69H3IpYu8f6N7RLmUiWNfTc9syHh
2oICCJOcal8W3M+C4et7n0cEd9izIgEuptAAqvl5Qf07o13ifYw9hL51XJY2lcuGYsG+q2nU
ANKuxylpY5AZ+MT/AJsz9PGtQ9ibt9nZ/c3Dqd7eABoQbGOOjXFFWOnP5r/0cx7g+3NbiNem
NzqlAu21ajgF3pMAdRHP9OWZ3rJyXh/G6nC7PkmBrua5oFO/saxBfvcQj2dS1Yy3McE2mUaC
PMO+gETW49u/xuo2t/lMlY3dFla3dQD2B7Wkte1wG5p10Ma4+U7+HWc7xfGxa3fHstaMdWqq
/DZWhTbuNYf/AGTiJ7o6dZjz821wlt/j9kshi6t1jbup95TYXm1uGBu5ASWAsJ83ZYx/z8bt
xs+yPBMDlMxd0Mqw1L60Y5lzYVmAbCu1QVme8TjGv4oPcP2tGL5g3HYkvuLC4qAN2NHqUt03
Ag6gAyMW8pz03sx7AZelga+Xxlb7xlszfXoOG2qQApLQ0kFOsPp4s7n9H/Hi1sbnllfGZK1p
XdrWoPL6NVgcQ5pQFqjxifn8lcj7ucasOOc7yGNsgRZ0i11Fh6Co0OT5ExOp6cVyVnbfc3NO
2ppvrOawHpucQAsMbex0P8b8maND18kaNSs1pH9IFgLhJXFwKT7Rqfnrl13ZVJS9i867OXfH
6lxRo5ugw1rK2K+nd0UXdSq6L4QvLr13MLU9iuR07ZlOrVZSyjnhtSyfIsBKE7j17ReeI5/9
FjX/AMf7qjcfavzFOldloAFeiW0S9FTeHde8LxhP11gw/wDj5ye+oV61xWFoKNR1EU6bBUed
urk3N8vYxic21rrsM17AZvGVse+vdMOMv6jbc3zW+alUP0irTGi941ZiTustX/HLkpu7rGU7
umMvbMNZls9pDK9NUDqdXSappGc9Z67roPZz2c49laeSZmf6t5RYba5tnNLH2tRUJCkh3/NG
pPcL148w57wP/wAV5JUsBcCtYPqObQuepaxyEluqjrEsyun5XY9M5r7c4an7XWWXFrSbfBtP
7bJWTCxtVjyAlw06GLnjHezpzdt/j7mDbWtS5yLLSpcAOZTNIuajkLf6gPVYT87Wr1/Ab/j3
yo5u4wdR9Knkm0jc2bHL6dekPq9N4luHYxm8k6aGc9jOR2nHq+dx9Vl5bWbjTv6DWObXovaU
cHU3Tks4v1Tv9JI81q0ywAOM+/zjDfF2Oj9v8PRyfKcfZ1H0gKlQbWVwXUqhVfTemgd3iN2T
Ho3vF7a4Ww5ViLOzYMKcr5K9MgutKdWQBpuAXa469o63iSPPN1oH/HLlzrm4xpq0BlKTDVo2
ri5orUwZOp1E2lYz9VvXjzHL4i8xd/Xx97Rfb3Nu4srUnhCHN6EGM5Y1z3salKm17wxdoGru
oB1MWLr3Xl/tpgbL2qtMybRlPIhjX0cnZlzqNwx3Ws102ujf1mMdX1ydj7F8lvMfjsk27tW4
3K7RaXSv2io4oKTwArT8ZRJz4l7xYcc9i8nR5nR4/wAjfTtXeo2oKO4rc0tSaNQDbp3iyY1u
xZ+8PsazCZW1rcdaatnd+V1qquo1C5GyKSdGuudmxjnqzyq+n/jdzeo3021bX7p43UqJ9Rqy
XbvLdn5xmfnc1f8Ap7iqxfsJzq/qXlCm2lTurF/p39nVcW1aSzD9Ecwjq1Yn1W1Mt7B82x1a
wNybdtjkajaNC/aSaDXvk1tSW9k+4h9U+zef/jb7itp16Qp0XX1uC/7NtRXvYD9THfQV6BVh
9FvWKqv7Jc3o46yv3WzPtL2oKRdunSe47R6oE2zh1xiTvTv9iub0eSUuO3NOjRvbim6pZvfU
SncbApFN6a+BiXnCd74av7Cc6bj7y8pUadepjyRe2dN63FECZ3MICy/lWH1q3rHd+3n+POEz
vD7u+yV6x17V/wDudzRcrKO0Ta8EBwcv1AxeZC3zXh3JuN5Dj2Wq43IN21mOJbMFrmrJzSOh
h1zi89aqNhLlJP8ApH8IyotahUBFiLBfqPDp3gsIhm4BE1XWAJ2KdV0l+2CA1CrUXqOkVBbU
AcVHSJVlR7muaEJC/jAJtaqTcPGAZ7mlECED6YBQHFwlPQxQzWNBLdCT26xEMxrypMpEAeP8
IGIR9LdAPyhAwILiQJkSM1igNCiUyTMdYCOdo2Y8dVgqFWglo3dCfCAYByoqHuesDAedqO0I
1glO1XTcEB/NICNYNvmCk6CC4G5ZEy6fKUREcdpRzgiS7wEaEIX6dQYqC1qqAUmpMRTtbtKg
DbpOesRYdxLQg1I17QGIHq5CAJqFjSMgG3zah0xAQNaSpJ8O5MANrgAAAHakQDOJaZAgnTrr
EADkI7nUjpEQ1UNAVdoXpqsU1AxTucDtPRZQ00QSsgR3EFENXTUTB6QBaVEkX98AGuJO1FWS
eEEwpJBCsDWqjQJ+E4YGaSNJjqsFOaqNk5B1AhDSuKk/mYoLiTtTr11EAp8zVJG4ajxiIf0x
tE5prBcCoSqAqB+oy/KKhS17hv1GvxSIJJzgUTvOAyqCD1XpBSKn+qesTA7d5au1D1B8IBHh
SZqnfSKhmteXar2gI6ahUXU9YCORjACpBMiOhiJahJKbjOYWLiaGxxQqqGCo9w+hJA/VAEAI
i6TENVA4kbZbogDSQds0CoRAiFwYZfLtFUQXEDvq4REKXzHhr8YoZzAGqo3N+WveChTRQ8ov
UnUfKFQzmNJEvERBHU2ggNdIzIguEdJsjMLFjNLTRZEu6uHaKRkKbRtJ29QZTgoNCAg6E6os
RUc5wMv09ZRBA9SQe35xUKjwfKUXv1WAnpuTWSpAHdqCdfp7wB6biQS2QXtECFwCOJlPywDF
2vRp0DdYiEBa50ik0TxjQd8gD01gAagAKf8AyTtAQOP0jqIoCTBKgHpEUQhGpn8iRBR3Bpk1
Tp8jBCuDiQg8T8O0EM4udJrUK/gnxgpAoBKDcNYiaYPau8nzIAU0iqYFq6kuSXWAh3EKCVGs
5yiLStaUnMdAP3wQpJUFdNTokAygu/b1gotmdwk0xUL5ggBUHqkBEcTJAHT2ygsRzXMDSFUn
TtEKLlQF2mkETegDSPEJqIKAIaZkqNPH4wQwcANUcesAgDu4LjMT/bAEkEdQR1gISf1Fe3hA
TZ+pQndDAENcJNkVnPWAAfMjq3UkawDF0iG/IxAGtG5R5nGKA/cUMgBJIJSgmROvQk6xdDAF
2mizPjEqwSWgLun2iBHg7U0C6RQVcfIQrdO0RU9MIh1HTpAQhoGqhVghKjNXdphO0VWtY7/X
qIqGeko1GencYxpOAudrhNrp+KaRusS+uK3EFwE5694w6IgIAA0iaIrl8QNUgi2dTRNxAbrK
NCb2g7mjURUol7k1ToF6wDB7U3OWST1CxCGdqHAfAxWg8pd1X9XSIhKwDQTqSIxVigq3Rc5r
XatcYsXXtfsp7gV+OX3p3L3HHXDCKzZlqp5TLxjppZ4ouXVbStm691bVG1KVV7noNQ4kqCsZ
jhOPVNSeqgS/MxXXTtejlB850XwgPSPbD3Afgad3YXjnGwvWHa1gUMqTCzi/Zq/C1u+f0Rxu
+xte4NzUqIbamAS5p13Rrxzs3Gtg+bPtqNOrXuXUQ1oeg3AlNdIzrrVvbe7TL+wytlcufTdX
eKlk8jdt0XQeGkXWLzKoeYc7tclxajjalQ3NzSqBwq6oAE1jNqZ6o7/O2WW4zSZd10yFglKi
0hC5vRCIsrezXW8d90H1eL22Kvq5p1bFw9C5fN2xJsl2hS1lb7xfZ522dbNdUt6VM0azjNlR
rtSh7eMJU+SZH3MsqFleU6FY3Br0zSp0BII/+aWgWNfZLxrPwD3KtMfj69HIVqbKVSm4Gmmr
0QGM6nXOzFDhuV21oL2wfdD7Mu9WjVIKNeekhoYysizznuPbVuJHHVKoubkVGPtyQpaGldTp
IRWeufVhZ+5OMuOG3eFv67A66ZttweioXDSLV6jn8VzBrce21r3aVrQkUHaFzAZIg6RNas03
uJ7gW2WxuHY1wub+0c8vqFq+UjxEWWMWXVjV9wsdc+3d5hbq4Z6tSmw29JgO76gUKBJQ66O+
dePH/qBUTqNIzrUene0vPm4C7dbXbmMsqzXb3EebRBONStW10LvdmjXxlzQurhv3eMujWwtw
JPLVm0gahIbGcZ8t7pY7KXVG8oXFKgH0w2q0tILXAT7mLuLeScU91MfRdl7HJXdN1pWY4Uqi
EOcXBFEoat58ec4/nmaxGWabe5bXs6Vz6zWumCF6H4RInMepP94sSzmNrdtrsFhd2opX4M9j
mzCHXWE6WT/WC4928XeYd9q+vSF1aXbzbVqjQRUolx26gzCxZ2xeXB8y5l9zfWNxSrsuzbu9
QUQ0FjZzCQ+xzu66D3F9wMLyXgdnafcU/wC52zw99NoO5ACJhPGM9XVvzseP7gAAsjp3IjLp
r3X/AB1vLGm2/oVKzBcVz5KT0UrHTljr2LHJ+51pgbbKWJcyndUbl32lBqlCKk1Gm0wvWM83
7Rkoe8vH6GYpZG3NOnjbyg1uRtNoDxVmrx32n8on2b+kUHD/AHKxGMqZzF3VxT/tt46pWtLh
oKhz9Gp1EJUs2NLkHuZYZv2yo2FfYMrZ12baRkHMYUDvwh9vFWH/ALIxOV9sK+HuK1K3v2Bn
27GlF2ODk8FSF61e/aWl7q4nOcJs8flXUm5bH1Gio58mvayTXSGqaxm1mx51z/KWF/Xtn2d5
642ndTYuxidl6mCcz1yDCRuIVTokHTF9bc2zdva06FGq0U6TA0EsaZCUyZxdTFXmc1e5auy4
unAva3aC1rWBB/ygRmmBici/H5GheUmguo1A9qhVI7xY3LP697u/e3EVLvjmVpBhrta6nk6A
M6bHABQZSWc4trjnrYzHuzxnK2edwb6lN1N721MbciTXtBa5zSf5gYv2Mc5zn3Lxl5w22xlC
5Y7I0KzKlEMl6YplQpSFurnrey3uXxvlnC7K1yD2W2SpMLL0mSo0I9nxh9me+HhV2KVOvUcx
5fTDiGOOpb0WMV0njqPbzlNlh8s0ZFjftapRtyFFSg/9L2uBEa5derLy9UyHuLgr7E1Lerc0
qd/SIfZXtN39UuXR3cO7R0vTzfWupObxnImYK+uzRpX2O3OqAOKOeQ0bmT6pEn/lqzGDkXuP
jMDzyzq13MfZX1uKdxW3FaZBUGXSH291OedUOK95uP2mO5BYvuKVOpa1alxiqriguFdu2Fp6
rD7FjW5VzrhnI7qwySMpVRQbTrCq4/03kzRO2qxj7auY4DD8rx2G9wv7k2r/AHG3a4Np1y4o
1P1Aj6oTpqfDpvdPneGq8xwvJ8RWp3TrHYaluST5mzTukTu6zJ66y+96OLDleGytKo37a8tR
QvGL5qLnK4Kf9JMbnbN49dLZ8mxWcxTD9xSqW9G83W93Sf5drUIa9dHftjrzT6vM/wDJmu1+
Qw1Si8VKZo1CO0nNQlI5fqcT1w2d5dgsvwm3t7mgKHILNzWUqtBhbTqUdB6hElTvGfmOvU98
cK99QgKZ+HjGXSR6h7F86xHGeQPGSDWUrlux9cuQNaCDP5iNcs9n9wfcC4oc4beYi/Ze4y3u
fvbOmUe0OARzfhqIz1brh+fOV6Xa+9HD6dzZZuwLKNO4Y1mXsHn+s15A8zP+X8I6fZq8+uAp
+42L437u3mdsSzIYW/etVrPqDKiKh/mbGHTieL3kfP8Ah+P5XR5fiqlO48zGvtVLnVKdQI9R
MNIEdLdjhObK6rH+7vB7bK1hb3DTgcnT0JWrSrEIVaf0xm9LedeT+2vLsLxr3Cua9wBcW7qt
RtC9Y4BjWFxl8EjPPlb3zFb76ZTCZXmtfJ4q7p3dpdU6ZaWHcWuYNpBPyi32p+evPbG6+3u6
dwyT6b2vBRQrSoWGusvr6Vqe7/F+QcXxz6tf7PK2ha2/tSUa4bdqsJ1B/KN89uH687VP/wCw
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
5Lqm5BtA6EmU+kZkrM/TXo/uJ7M43EcQtOR4t76aNb97a1CHbS9JtPYGNdc3Gfv7jz3G8Jym
X4/dZixq0qjLRyVrYH+sG/zbO0YktddxzTi5knBCO/SNLK6XgXErrlWcpYmg8Me4Go9+p2Nm
UEZz1Ou/Holx7S8PF2/GXF0/H3NZrm2taq7Sq0SD2noY3eJHDnrfh5Dm8XdYjK3WNuQBWtXl
jyPpJHUHxjm683Va7c9ziUBM5RdaI4tBAKkdoiUXVTJCo6A6eAiYzR9RwI3ODXAfCcVucibm
oFUjsD1ijGarg0NZ5Tr8oWp1TMrun0IChwkjozYzF9wehRv+T4+1uqjqdOrWaxzqZQt3EDd0
0jfMdPq+jude1ObzePOApZg17i3peri6NcANqMam5od+l35R0uPPbr5cy+LvsZfVcdeU3U7u
g8tqU3Aghze8cr43zfGo51QOJCAiRQRFQ1DKaqZQa1PUIa5gMx2OkZWUlSoSAjuilYsjF+UD
iQHakfUP+MX4ClWlW/MdDBY7/wBu+H4DklC6p3l66jkGI+natTzMGpU9o6ccnXVjoeW+yL7T
iLeVYO8+6taQJvLVw/qMaqBwIExF64cuu/XkW5xCTCfp8THOR1eh+0/tUeeXb6NW+ba06SFw
ahqn/wCJIlG+ZE3FL7j8DvuFclr4a6qtrhoFSjUbLfTeTsPh9OkZ68Tn9N8czb+q+r6Yd9RA
aD0UokRucvZ8J7AVKmMtauZyDsbUuw11M7dzGerKnvmFWN/SOP6buR59z7285FwjNOsMqwFz
hvoXLP8Ap1WLJzD+7pGcw56czTt69euKbBuqlwAHUroIN89LlvD+VAVWsxl1/Tm8Cm/svbtF
vNS/pNa2OwGcuhUdZWNWoKZAfsaZF3RdFiE7l+F5xb26zmc5ZZ4K8pPx9S7JO6uNshqW/wAx
iyLbHo3/AObhQr5W5wtHLellWUjXptrNRrwshL6Vjp1xMcZ3WjR/x8yt7xi+yNreFmWxVR9O
4xlZoAJpoXbXDuPp7xicf61e7jz/ABFHl2GzFJ+PpXFLIFKlIMa5SBPdt6j4xLzi89bFvz3k
HuHySlQq8itqj22yNp3fo7JH9JcB+2Jb5i65ccY5A94pss65e1oqNbsO4tOjgOojMlXWA4LM
1zUcy2qVBSO2t5XK3wc1FEXDWO9wWWsmNde2dW2FRfTNVpaCROS6ww1H8fzjbX7o2NcWoRbg
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
qJ+3UlUftFlaGfyWVvfsGUPVDfVcAraj2jzr3WRhzZjrOLZrn+ZZ5tDlp4+60p3dtSuGVLNp
+qk5QrSYzz1658/nrvPcvJDBYO1zNs1jLlhY1xeSW1aRbOk4ddYW0vM1p+1Bx+T43kaox7aV
vVqPe2gUmx3UJ2MajXfORx2K5G299wbHHXluyvVsK7qVO8pzIomY3FdWCH/1WPy5rqfdrOUu
NXFEttqda1yLH08jaOT+qNA9i6OGsZ7qy+rPjVK1q+27Lh9r9s6nSL2McNppOH0uC9OsOb4v
ccn7ZchoZ7mzq1W0pi8ZRdSub2kux7myGnV3WEu1r6h7r8jtsRlKuBfaU7uwu2sqNs5b6VdV
D2+H7onV9Y5m12WdrCx4JbZa1aKF7b0WOoPeCAwgBaTgenSN9fC9SayWV1aZDhdvk6lk2u2t
TbVYg3MpPP1N8p6OgnXOKz3TqV2cSscjaD1bu3qUxa3FCbmfzMO1ZOAi9SY5zzps81q08j7X
tvK1uRWpso1XlzZtcHt9Rw7dYz18OvXnTdrWtq7G4rK49nrPuPRbb3NM/wBOSKSifCJPhpQ+
59qbPJ2PLsdYOvCSWZW2oOIZVawAbnBs/mkSzPhJ8rnHutMvwS9DrembKtTqPfjyNz2oFGvm
3CNy+J1JrFgaFn/61Zc29I21S1pPfbuJI9KpTUhyykYb41+leZW/Or+vkhm7rAvu7S4/7XI1
KLiLd9cFBW8mh294zzf6vE82vV7/ACbbLh9vlqdBl0yzAqU6IG57FCFqzM9I249SaycVzPH7
/Ki/xNMWtGtR/qeoS073asLX+MTddJI0qnAsFi8+cxa2NFjq9yKta4LZ0nFF9Mj6FMT64ktj
lP8AIWjc0bvB5TGNd/c6byGVaUqrg0gj46xnrk4/+jcg4nh+ecVp18xb08XzSlRG2q0hK5SQ
rASU/lC8633JL44P2IZksT7i/Z1GFoa2rSe1CWqAQZyCrE5ansZv8lrW1o8rtatOm2lUubcO
rFgTc4FFKdYfpPWPy+XizlJkZ9Iy9Gg4EsRZjTtDGerKXadHhSevaDEdHwFqcvxPR7bhid/q
BENafW3POFcb5lRo43KMbb5Goxxs8hTCODmhdru7fCOnfOuXxXA8N9nMXiqbLPkVnb3jq1R7
WVRSLiio0FwMlE41OPPWb+mte9/x6wVDnLRRrPqYh9I3FG1cZ+o0/wDSc8z29VjH/M5v8ej4
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
k2cequGNzjXh1qGOKVqMka5epWNdc8/xnn7auf8A0dwQXrKFxYg0tpNFHPUuRPNOJzxFvSs4
97LcBr5fK4m8tHVK1oaVWlUDnN2+oPoKHzARvrmMcc9e1gp+0ntNls1Tx1nVNtlsaT/cMaHO
2vaOy/CYEc7JTmWerHI+0HtbZ3LrfJUPTZWp+R9EODqfZ3UJGrxMXm3VZg/ab27qMrYRvo18
takvta1Z7mtuqTyrTTdIL0IiTmRb1bFNmOKcM4zynHXH9vq2dw6tSp18RcqGjzD+tQf+ofOJ
1h+f2nld576YLjt3xu1deW7vUdctbSvabVe1RoUltMb3xrqe+Km79ouA4awxtxc2Da1tXdRo
3FRXeo59WXQxj6TNTq5cZaPsNwW2zj6DqDq+LvGGpbuLiKtF41YejmmNT82ee60L32n9pbrL
NwLK4sOQUH+oLUP8taksh5pbtvaJ3J8NSWrXJ+zvtbjrik2+tP6VcOAYwuFRoAALmmSzh9Zi
PP8AFe1XAKHuNbYl2Wp3eMrq63o1HbHPCf8ATe4SDx+cLzI1xb8PQMX7PcX4v7h2t3j3NrW1
5TeTY19pdSeG+U0jJQfCJ9fWJ17juLanRo528xJLamPqWrTdWtcKHPquLZbv9Mb69Xnl5/U9
kfbzkWZv7W3tqmNvMfWaRtcXUbhrgsgZtRJpGe5Elri+XYjH8CzVCrx8XFtfNct/j6TfUb6B
kXFxEl8TEuT4b4/8vWvbjNWPIMDeXdrX+5o3L0uMfXY1rg7Ym0Cf4mOk61n65fFRhbbPYzdW
yVf0qlGs+pbUxrSpgqxrzoZdozJf6nVmvPvcC1uPcvk9q3H2baAxw25LNOaaYeAQgLR9RBVI
zfVkz112A4T7fYK8xVpXpUzd1qiUPWINWs8Tk3o0aiNX85PldtejeSx5LbWVGsKdOvQqVLm2
qtVj2tQNE5Rq/wDzjn8dOIzns77dZ/k17inW1TF3zqdO7pXNugok1SQaexJGQjHXLpz1daVO
w4b7T56lcGhcsr3FP0q1K3BqufTDgtaeiETEMk9N1bVrfFc8vby64ryOtbPpMaftX0kok9Q4
HvF+2zHO82XXT5Gg7D4S0r2722V819vbiqi09z3BtQkAJ+MWTI3a8r/yh45hnYG05DToMZlK
ldtvXuKQDW1GIZuAkoPWOfc8Zls6fMxc1g7jqkc49MoPARUQxWoVQfqRRoIVmo4NBQnTXtEZ
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
tPrsanuj7sVMFlb63x4p3n9wpFtC6Y5rqWx2qtC+bpD9OsceOLrg+De/GY4zaVrSvQN7bvBb
RYoaGqqquonGOesjr1zLGtwz3hveL5u8ubKg52GvKj6tXFOcCA5+pa7pCWyk58W2M99vucVf
YbkVg67xl7VIpOY/ZUpUnFdqhdyR0+2tX8djYfj/AGTNNj3V2NBCj/uHqB0WWoifXlzvNZKf
u8OO4+vxuleNzuBeN1nVa/8ArW5DtzWeoZoIluNfXza0sr738hzFTGX1rbOo5bFFzfvWeffR
JmyqAACSIn21Mxtj/I/NUORDJss2izfSFG6sdwIc9pJ3tJEjOF7SfnvwqOD++OV49lLq4fR9
ayuKr6wswRLcSdoJ+MT7et8fn5h8T74Z/GcyyGZw1q5lpk3F93i3k1WOe6bnNA0I6GL9mfr9
fKs7v/IG+o0bqnZY+rZXFwHbHue1rWudq7YAJxr/AKkhh/kXfX9hbMy1j619asNP7miWt9Rp
IUuCBD36GM/9FnGsPH/f28sr+69PGb7Gq3yWbChb3UgT/CLP0qX88Yv/AHXa8hxL8DzPHPvb
A1t9lc0nhtxbtJPl3EeYJLxhL/rM51t1+L+yjWN33L6RRAX136Ediw9439eUs6VXG+YV/b3P
VTx6s3MYOqN72tahmdN6SP5GOdmNy7MZr334uxzA8issebJ1wA28tnbXh+1EIcitMb+zXHM/
ij9zfclnM89a5ihZuxt5bgDc14cob9JG1C10c70kmPW/aX3vGUoW2L5XVBuqP9KzvdhaXtMl
e8nbuHikXnvGbzKxc892K/DefOu8e6hk8TeUqbzTpubu3sG07iFIjXXXq8z+PH+R+4VzkeY1
OSYejVxd7VqCsrHgkVBqZfp8DHO3/HX8/wA/crvK3+Q+QvKFA5fDNqXtFnp1Lui4UvUElUES
jXP6WfLn3xlVWH99L+3vLqjWw1vc4yqTUtLQlatu7+alVTrqmkW9F4afPfeC45TiqGPdYejV
tn+pb3NY76lPsKbwAnzjP3T+rKw/yGzn/jtPDZ2wblvRK0rkoxzmgENbUUEOTRUjX5/pjXUl
Y8R/kdmqWJOJyuMo5C2p1A60cXbH0g0qG7yHbtvRYTus3nWy3/JXMNyFm+jj2ixtlNWg94qV
nqplUIk3wSNf9aThx/Pfc08p5LSz9tZOxd6xrQ8sqKS6n9DmoJJGOrqyZXWUP8kctd420tc3
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
9OvbO/6gIMynhGfrav2emce/x9w+V4P6rLlrMpUJf91MtDmkgtA8fGN88eJ11XmeK9luV3zL
usPToW9rVNF1aopDiDq1J6RPr6v28WTfarMYDI4zI31KnksQ+s2ncOpqWtUojxNFi3nDn9Y9
I9y/8d7G8oMvuINFC6cFOPeTtcgmGOnPwMOud+Et9eUWvsnyyvZG9DGU7ag91O6JUPoVBIio
3VPGJOWvtIrOY+1/K+LU7a5yVDdZXTA6ld0vNTcoUI4fsMS+H2jlaIcoa0kbvLt7rDW9j0K2
9i+W1ra2r1n0bd101aVGqS1wadFIkFi88WuV/TFdU9qOVWee/s97SFrUc3fSuHK6i9g6tc1V
jXXFnla5/TweYe0XMOMWNK/vaBqWNUK29o+ZgJMg7sU7xjrnGftK9F9mfbfinMeH3YyVsaWQ
oVNlG9pFHHc0kOcIsm+NdXHCcc4vj7P3SHH8hTbfWzbo2lQPKEhRNvihifFxmXXo3uD7T8T4
1ybC3tnSFbG5O6FvWx9bRvl1DgkavP8AUnWXDe63+Pdtb48Zvh1GpUbTA+5xoO5zBtm9nU6T
h1yc9V5fxX2tz3JaS2LqbKm80zTqktco6ntGZzWvtIen7Nc3dnK+ErWZtri3aaj3vH9PYNHA
iRB8In1q2xtXfsfzO1tKmQtqdO9pWyGuym4Go0JrsM0jV/O44zvbj1G59jOMch9vrLKYqg7H
Zltu2o4hSx7hItcOk4TnW+rjxLK+2vJcflqONfbGq+s4MZUpq5iucmvxheK1/wBIvn+x/JrH
PY/HZSh9vbX1VtKneBXMO7/UOsS82E6j2I+w/AWsZicjbVKRuQ6nbZFjlql7ACXEIieEbzIz
bd8eXcp/x45bjru7ZjGsylvQcCwUJ1TSWTizUfKM/wDOxf8AooLj2a5jbfbk2/rGshLGK5zC
qI7tF+lJ+kr2HhnsDx/J8RrUszaC2zKuZRv6D12gCW4fTr4Rf+bP2l+Hgh4XkLjkdzhsYw3N
W3qupB6EBGFC5xSQjn/cdJ69a4Z/jq19464ylZl3a0KbXmjSUb6rhOmp6A9Y39LPlnXSZ7/H
/ieXxl23Bl+LztkS2pbvJdRe5A5PMpEj3jXX5/457fl5LdexHO7a8p0H2YfRrNJp3zHA0Cmq
uEmxzvFdP+sxvcG9r7KjzOhieYk2tGu8MtQwqKzj0Dh07xPrZ8px1rvOff488eocgxVLEXb7
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
Pz11jnazLrJgePZDNZa2xdm0fcXT/TpqUbuPc9IsmtO9r/4782oF9O4qWlN7Co/qFD4KWxv/
AJ1z/wCnrl2e2fLDnaWGZYvff1JsaB5UP6i7+XxiXmx0jNzT2w5dxIMflbTbRqgba7PPT3Ga
bhoZdYlmMfebjlKFrcVahbSpOqP1DWglANTBt3XGPZnmWftPurW3Y01v/u7K1QU3VQi+QGL9
at6xy/IeKZ/j+QqWOVs6lneUz5qVRqKP9J0I8RGUncqvtbK4urtltSaTWqPDabCQCSfEpFtS
vSbP/HrnN01jaItjWewOFD1mh/mC/A/jEvNT7RqWfsZzq5ubi3qWrLKpbPayo27eKRK6Fuqg
94TmluhnvY/n2Hp0rirjjcWVcgUq1qRVZMyDiNDD61eayXPsL7hU8bUyFGyZd0qQ3VaFu8Pr
UxtXzM6/KH1qddSV55Xt30X7KrNj2qHMMiCOhBg3PWJqgo4r2gpC3avUk9IMoHI4jUd+6wCl
5RdGjQd4gDEcSHSkv+xgDuaf3QXUDexn37jwioUjz6L3+EQNUA0AKj6YKLgQin/mJ6QRC0FE
KDtAQPId5UPRUimmcA1pJPmARYYaQlsjul/CAZyGpogOpiERA4BR5RpOC6hqBCCPL4dvlA0r
EmT9JTXSCaYBqkpMFF0hgm1xAXXtFAcNpTVdIAiaSmOkBkDnTJl2lBQChCJr2iIhAD9x+ojp
FCtqEKETd+UEZJPAIHTSARwe90tB89YasZGOI3L0kkZEBO1xEydR4RRKbhqRroYqCxSZJpr0
iGiC8yI6KRAEuUzGkFEPXQyHSKpHCYCbU0SDJ5Fo3KQk4io1OiAdjODOGVuoCkdTrFEVmrWo
qL2iNaLipQBZfmIAAKQSg6CKhZkEH6gkxKCCA4AiYH6j4wWQT5XEHXWCi0kkTn0J8YBgwtCd
/wA4BQxhcmhE4gYjykBNwM4qINuh17iADZaFSdT4xF0pIao1UoYM1kYBImaaCBpXSBIkexiq
YICg16rBQc0n6SjTNIiYEgTJF7QDVGDaVkmgEWBDUaxhKlAZCKUWvaG7kJWczJYEBxLRuDp6
lADrEUaaEgMAIdqTAZPSBLphBECuQAOGo6awEYwlnlG4KpJ1EAC4KBp3EGam4uPSQ+UAQXbv
MRtMoLCEjdpPr8Iochx1Kd/hAI4bgUOhWfaICxCgKL3gGaNjwTPtAAq5VMj+UUJs2kgO3BFn
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
6x9cim5t7h4ziF7jK9637jGXpcyq6kfOACEe3ui6ROq1y5jOe5XFK1WrcYvNsoB4L2VCSagl
/LNIl6b/AObyzi3vlyHjOUuqbKov8VdXDqtelUahJcVVh/QSsc5cpJ5jq+K/5I0qefu6WdtN
+CuXOdTdTP8AWoF0lLv1CN39D/nHVZL3p4bjrSpsvRkbB7Cy1tKQR+2pPzEiSLONXqMXn+JZ
+/XCbHD0bS9quu7S4KUqVJqVLcIkydUjn9pq9cb44+hmfae9zpbf3JF/Sca9rl6T3pVC7g2q
0GThKNWQ5ljurn344fY49L2t/cG1HNpNpU5u2H6nFfCLKXnWwPe72/tyLaleg42rTBtjtPqU
XEaVBNQsT7Jfzxo4v3u4Q5lxUNZlrm7V3puc7caNemv6CiqY39/9Po0uQ+7PA7rIW15a3Td9
Vho3D3A76ZE/gR2MS9Q/5+vNM773ZNucpv48ftrK1fuV489dCnn/ANJ7Rnr9LWp+UepYn334
nl8bb3FZ7sNnaLNlVjvPRcHScWErr4iE6a74xio++vEqmd9SnXdavtKQbUuntLmVwwzDQO8X
7ysf8/6573G9y/bvmljSuRVr2dSzquNzjXnY25aZ7g5qzl1jHTPP55ddXi/df22uuHvxtTIG
yebQULdtT62lE8wA1H5x058jfU1Xcf8AfTjL7V+Cz9Rwurbb9rmbcH0n7JsL2lCCO8ZvSfTT
ZD/I/CYy8t7enSdmLV7g68rM/poD/J0JEZnVLxrduffrhVjSdfYu+fVplazMa9p9T1nBC3cm
0ad46bsOfzxrY7/ITh2WsmVr/fhs3brtcVqUXh+u0tVJagiM3r/U64v8eR+9HuXYcvv7O3sW
l9rjmOa24cNvqudMua0zAjN61nnn15iXNc7sgUdFjLsY1HEtYOvUxAtSoS4NbOamCCGljlCj
d0MxAQkMehKr20+MAGEEqFlodYILgNwI0gqAhztEC/nARwCO8y/xguoApBAUohMARJAR8O8N
CiWnQy7d4gZFJL5D98UIh/VPSfWBWVAArZH4QUrSSUd5XJLpFQQS0z8wOvaIHIaJkr2B0iIQ
iQBlKLAGCaj5uhVMGMDdxBUdREBCz7dYoDCC5UII/OAIcC1T+MEDf2CkFIobaELlBKoh1iLi
AuKy8kkCzUQMFyOEgiT2+EQAPUJ9IGoiiOcnl/V1H74IdGyd+XjARhIKlvlgGdIAkTMDWNoA
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
HyNEXZrsNazqn6fSXQgdYxzzN9dJ1bPGL/0fi7bmNcVf69t6brm3tj9JKhu0/DtFnEZ+/i3v
/ZXj/IMW+lUotx2Wt0dRdTPke0/pcBJD3h1xF2/LJbez/Hcf9vj7iwZVtCwNuLl3/UD3auB/
ZEnP+p10895j7B3FlyA0bG634qt5rW5c0khdWOHcRjLK3P02ObzHtvluFZO0u8zaffY6qRse
36Xf6SOh8DFssvpz1r1bD8I4XkMaL7IWlO0sblqUqLAW1munPw0jckqdbPhvWvs/xtmODMfS
pXVVp9Su+ohcWGYVIl49TLWW99hOL311aZC1b6TKbN1xZiVN7hoh1A7xPp6bny1Mh7IcczeK
uKDaAxOYoNLrN7SdjlEg4eKQnH+J93AYj2fsM8y6wlC5Njy3Hkl1rXQMrhslY5YdT/8Aq39v
7Hnt3gb/AIvyUWubsv6lByVaFUKqFPLGJa1sr23lvszx7McHtczhGNsb1tt9zUpKdr0CkDsY
6dc7GOtj5wNNrHFjirlQ91WObXPw9q9qOL8N5Dhqdmygyvni5z6jKqhW/wCn4CNc8ymVZ+4/
s3x84erfcfLaGTsqZN7afpeBqWE6Rb+V+Wb3jwAsAdtJ29FOkYbd3be0fLbrF2eTxrG3dleJ
urUSHCkTq1/ZIs3C1v4f2k5wzJVjakMdbtDzWpmQI6II3mOU7x0eT477vUMO+5Ny11kSKder
Sb52glN2ij4xn1vnrWTGcT93MZajF2d41jL5odRJm2ruC/qCLG+dsdOu48j5Jhs1hMnUssrS
dQvGuJqBwRV10lHK/wCMyytfBYW/zeVt8bZNabiv5WAnbM9jBddrW9keYtbW9NtKtcUR5qIc
jpKZLrFvNY+yuwHtXybOE06LGUq+40zQqqHEjWSRJKXrC0fbzOUuXUOPZO2qWtWpUDXKEVqz
LDppGpf5WubK9nznsVw23xjqT3vsaxAbbX7iXNc90ttQdFKTjXX5yTXO92V5ncewfN6F662a
aRqOKUwFQjopKAA/GM/86s/TXEcj41m+PZCrY5W1fa3NNFDggPi0iREY+L63OpScXo29TN2r
Ltnr29ao2nVpKm4OKGNT5Wx9Ccy9kspQxtO54Ze1202UwRYOqEqUmGf7433xvw8/XV5vrz3h
1l7pm9eLC7q295Sqem6hXcR59JgxmWu32mOd59Y8wociL+W0HtuRt3VHhGuauoI1WJZf6syv
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
N/ZS6tMLQzGDurh4Yzdc0K7y4sDgF2kEKka6n+Oc6u+s2O9j6l5wk3+Oy9avkUDgxjyKBcZu
b8omWx166xtYf2Rsrzj9tkLqtfVcgxRWpsefI5pC7ShMSc3+s2uW5h7Y3dTa3DVK9xVYSDb3
dQFxXqCY1eCdWfLisnxLmmDszVvLSvbWrztNRjgWKOjiwkfjGbWuutX3F/bXN5/j78lx6+F1
eW4W7x1NWXLG9CAfqEZ//C6463sGUM1Ttsw2vQpselyxoR7fkRDV17Dyb2VuaXErfNcbvrm7
talI1qlo95BDJzaGEfNRGvpc2Od6y+vCK7HsqltQEOYSCDqsSNvU+A+02Ez2DZf1sg6rdVHg
Ns7ctLmBF8w1jc51jq2VY+4Psdl8Tgv7li7t95a0R6t1ZvU1KQ6u2iRiXisf9PfXi5BFUhJK
g1lGZXR6D7V8FuuSZUUbh11bYyqPTdeUB5FPQkkKIvyLPm/s1y/AZF1ljWVMhYXBSnUpOQPH
d4UBYl2J95HMZPjnO8VatqXlG7t7UtQAb9nZF0hrV6jueB+zdTM8ablrvJ1rZt55WmkHO2jV
ag1IUxuTWO7jQv8AgXuRw7OsoY0VcjbBXW9SitSi9pmpZ0PeM71Dn35Yncy9yG5AYt2Na+8c
uyh6Lg5w6yWYjX3rfMlcvdUObPq3l4y1uaVOg7fdeg1zKdMlVVrfpjmXIt/aziQ5lyKtYXOS
q2N0KZqUKrW7126hziVEdJ8L9/PGzyT2p51YcoGLc6vXbdECldMLnNdTVFdPTusT4JYzc99r
uY8WxrblterdYkNArVabnBjSZFRoRGbzZXO9TXmtK8vLdxdQrPon6SaZI/ZCOmL3h2W5LW5B
Z07S7rl7nhsy6odiz8v7osumPV+b3fOuOWf39s+hkMZ5Q+sKTmlj3dHsJBEa6tjlLzuVXcT9
tM1zqyvL64vH424eN9KyfSLbeoCPLsJRATGZL0vfWKjj3tze3nNBxfN31XG39sP+yqjc9qag
tKjbFm/DfPUs8anP/bPmfGckLerVuMiLp3p29amXO9ZonIDt1EY6ljM6lc1W49zLFUHVa1nd
2lqPqqbXsYFH6k7w1uquwxWVyJrOtaFa7NNalXY1zyAJEuTp4mNb4fx1vDeCZ/mFSqa1d9PH
2HlrVqivLHEIA1pMOZaz13JHRck/x45Ba4YZfAVv7vaNCVabBtrN7nZ1n2idc2Mfn3vrzsYL
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
5QoDwJBfCNzjXPrqx81ZGzqWd7Xs3bS+jULHEFRLsko5WZ43z1rueK+0+YzmEp5q3rsbblyB
m0ud800h9dXrqyeM59pL6yy9tRvrpj8fWc0i5aNSSu09jF+lT8+/s7/3F9ibKjhXZPD/ANKr
ZUg51Ff+p3K9ysXrhnrrHBcf9mOQ5y2bVtqgpXLgrbes3bMdCYk/O0/6eaw4v2c5Rkb+7xtV
gtb+0mberIuC/U0mRET61udea2ct7G8px9l960sq2zXenXe1SaR7lpmkX62JOvXpGM9mbe64
RbPsb99C9c01DXDvI5AqINJxu82w67x4DyGnmbTIV8ff1arnUqhbtcXEHaU3BZRnbPEl31de
1Vnjr/mVjaZKiLm0rPFN9J0wh+HaLPXSx6t7l+wVrQoPy2CeKVAlBZuE1P8ALDvj/HKd2XK4
i19huYVKNGpVdToPqza1ykj4/GHPFrV/Vib7Ecydk7jHvDG3NIepSa4oKjO7HaRMrM7lDI+x
nL7G2F04Mq0KVQU6z6fmNNep8ImVqdesg9h+YVKtKg30mvrM3W5Bk+SyIWH0q3uNew9i+a1W
1zdU/tTTcaaOBLiWlF8RGZzWb3nrS5V7Tcu49b0ru8t/VtKhb/3VPzMA7O6iLZYvPUr1Ow9n
+Lck4FZX9pR+yyj6Jq+qD5HlqgqD3SOv1nUZ76vLyjj/ALacizuTubOwZvbQL9tYhGu2doz9
a1P08dV7d+zd3d5K8/8AIbZ9KvYo0WVRQH7jr8JROedrP3d/lvYLjuWxb6lmXYnN0WzoOcXU
nrp/ylI33+X+M892PK772J5tbXvo+i11uim9BWkO4KdY5Xmun21Z8O4jisfdVMZm8d615Wcl
K5cfI7brtjpzxP6T16f/AOjfb3JtsarGutazFdWog+R4EztJjV/JOrZ8Nin7JcOeTSvbBtOh
WY4W1zQILhtluK6/OF/OOHPXUvrneNeyPFrXlVTHZOu67qVqT6lmCdq0h2H80ZnGfLr9/s4D
3i9sLXh93ZmyuHVqN49wpsK7mpMhSiiOffH1ut8/oruPe0+Yy9m29rOFrTLh6QfNzwSBJvzh
JW+u3r9l7FcYsqVKxydka9J7Q26vmkhzXvSYA0jrz+cvy4fp+l1xPM/8bctZXFWrxusMjaIt
OiTtra/SGmRMZ6/Oxrnty9L2pzuIrWt9lrI1LYea5smFazWjunWMfS5pe/cercX4D7eZ2huq
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
wos97hYFl7jad2WHI06pfTbTJIYvdNIczVk9WnNM3isjgra/9JterTqLWt3OU7UUn94jP9Zs
9Jhubst7elUs9tazqs2bHuV1MdWlTFp1y0rXk3FMPy+p9jSYy5uqYdctpOAVT+A1icxJMno8
1yGEpcgs8hUAfQLGk12vPqUX9DKcPtlZkyrehymlXpOxt+KNzYXTSHVZPVjvGN261edcVwTk
XGMRnMhYY5iBzjuIcrSGlNzYc+RZtjivf+6pVuSW76FQPBpN3EGch1jl3fWebjyqo8H9KkkQ
a0UAcCJkQR7x7Fe4GGtLVvHL0FlWq7fSqn6S4HQyjtzmL1HPe4V/lONe4lfPY6oTbPrgscqt
qIVLXDqIzPKn5X/XbX/L+Pc74wRi6gxHIKbf+9tg4M9ZomQwjvG8w64y7HS8M5hi73jv9qpu
NO6s6T6ZbVdMuTQkxIv6fDg/bHm+Mw+fvrPIF9B9as5lOkCtMAnpqmkc+aZs8bfu3nWWXKsP
feZ9igLq1NA4IQdpKxr67WeOruOu5DyixzvAL25xpD3ikgovPmcgGnjF6xn9ebPYpPZnm+Iq
2DcRVrvN2CN5qEODCe0/pjPLd52KGvyi0wfuvcV8jUfSoUyAwUSCx5Mtx6eEZ+Kfn/joPeTN
0bjjNjkbJ4NB1QONQEh9MHqEjXV8JP8A2X/DuYYnNcWdbWlYurUaDgrzN0tCRFi9xwntZzLH
4vkF9ZZKpUpVLis5tG3UmmxSnlWHPRfY2PdjM/2/mmHvXVDRs9oNe7pHzFgIRhGiRL164/ns
6dlyTlGPyXBq+TxxbdNpNDjScEc4tnL5xqtdz1l4vzrA5zBG+tro07u1a37mxeQqtHiSoPhF
562N/VpcxzOEyOMt76vXOPNO5Y4U2z3ubMAqkLUs9XOZ5BaV8CzK0Xmu6g5jn0Cilo+raiz7
RqXw752s3/k+HdiqWTs7g1GVSQ6k1N7XfyOb0SM276k4Cx5FgstWtra5aLPI2+6qwPcB6qTk
VCxNW8eqvmuascjgPvaVY0vtrlhrhv1N2FPn8YXGeubKHMM9j8pwG7vbVLq3LGmpTYdrpFJJ
oQZxrrMW/LiuEMtnXFtncVmbi6pUg3+44yuVI2mbSZFPlHPma6eu15Pz6lj8UzJUneha+s1t
1bFDuB1ReqCNdeMzja6XG85wGZxn3dhVNWjQZuqURqB3+MIf82J3Jcc7G0sla12Xlm9zmOty
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
------------1271281D73C6971B8
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

------------1271281D73C6971B8--



From xen-devel-bounces@lists.xensource.com Wed Oct 19 09:00:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 09:00:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGYZJ-0001k2-FT; Wed, 19 Oct 2011 09:00:37 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGYXR-0001Vv-Kt
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 08:58:42 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1319039917!35927593!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17534 invoked from network); 19 Oct 2011 15:58:38 -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;
	19 Oct 2011 15:58:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,373,1315180800"; 
   d="scan'208";a="8476813"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 15:51: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, 19 Oct 2011 16:51:52 +0100
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
	1RGYQp-0000jQ-Tq; Wed, 19 Oct 2011 15:51:51 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RGYQp-0003xo-T4;
	Wed, 19 Oct 2011 16:51:51 +0100
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: <20126.61975.885246.375228@mariner.uk.xensource.com>
Date: Wed, 19 Oct 2011 16:51:51 +0100
To: George Dunlap <George.Dunlap@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 3 of 3 V3] tools/libxc: Document checkpoint
	compression in xg_save_restore.h
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CAFLBxZZ+5u9An+cKRd0Pu_SUk+0K8x=Xp6Qktv+nCtJgHrQVEg@mail.gmail.com>
References: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
	<37fa1bdbecacd8fefcc3.1318549674@athos.nss.cs.ubc.ca>
	<CAFLBxZZ+5u9An+cKRd0Pu_SUk+0K8x=Xp6Qktv+nCtJgHrQVEg@mail.gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: rshriram@cs.ubc.ca, 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

George Dunlap writes ("Re: [Xen-devel] [PATCH 3 of 3 V3] tools/libxc: Document checkpoint compression in xg_save_restore.h"):
> On Fri, Oct 14, 2011 at 12:47 AM,  <rshriram@cs.ubc.ca> wrote:
> > Add comments to xg_save_restore.h explaining changes in Remus
> > wire protocol when checkpoint compression is enabled.
> 
> I'd put this in the first patch, but I'll leave that up to the tools
> maintainer.

I agree and, barring other problems, was going to apply them in the
other order.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 09:03:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 09:03:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGYcV-00029W-5G; Wed, 19 Oct 2011 09:03:55 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGYXI-0001Vc-Ut
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 08:58:33 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1319039909!35927602!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6661 invoked from network); 19 Oct 2011 15:58:29 -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;
	19 Oct 2011 15:58:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,373,1315180800"; 
   d="scan'208";a="8476822"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 15:52: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, 19 Oct 2011 16:52:19 +0100
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
	1RGYRH-0000jd-98; Wed, 19 Oct 2011 15:52:19 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RGYRH-0003y2-8O;
	Wed, 19 Oct 2011 16:52:19 +0100
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: <20126.62003.242942.148841@mariner.uk.xensource.com>
Date: Wed, 19 Oct 2011 16:52:19 +0100
To: George Dunlap <George.Dunlap@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 1 of 3 V3] tools/libxc: Remus Checkpoint
	Compression
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CAFLBxZZdt-zZOOEFCbeWj9hqZZ+-p5wLGqCs6UR7B9cTLjAT_w@mail.gmail.com>
References: <patchbomb.1318549671@athos.nss.cs.ubc.ca>
	<47fdd52af616131142ac.1318549672@athos.nss.cs.ubc.ca>
	<CAFLBxZZdt-zZOOEFCbeWj9hqZZ+-p5wLGqCs6UR7B9cTLjAT_w@mail.gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: rshriram@cs.ubc.ca, brendan@cs.ubc.ca, 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

George Dunlap writes ("Re: [Xen-devel] [PATCH 1 of 3 V3] tools/libxc: Remus Checkpoint Compression"):
> On Fri, Oct 14, 2011 at 12:47 AM,  <rshriram@cs.ubc.ca> wrote:

> > -    struct outbuf ob;
> > +    struct outbuf ob_pagebuf, ob_tailbuf, *ob = NULL;
> 
> I think you need a comment here explaining what each of these are for.

Yes, please, that would be helpful.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 09:06:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 09:06:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGYeW-0002YC-0R; Wed, 19 Oct 2011 09:06:00 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGYXa-0001W7-9q
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 08:58:50 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319039926!839053!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25504 invoked from network); 19 Oct 2011 15:58:47 -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;
	19 Oct 2011 15:58:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,373,1315180800"; 
   d="scan'208";a="8476850"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 15:54: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, 19 Oct 2011 16:53:59 +0100
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
	1RGYSt-0000kC-Ox; Wed, 19 Oct 2011 15:53:59 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RGYSt-0003yK-OE;
	Wed, 19 Oct 2011 16:53:59 +0100
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: <20126.62103.576976.140927@mariner.uk.xensource.com>
Date: Wed, 19 Oct 2011 16:53:59 +0100
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] make install not creating lib entries in /usr/lib
	under Ubunu 11.10
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1319013780.3385.64.camel@zakaz.uk.xensource.com>
References: <CAGU+aut64MmMmf901p9Gsya4O=hep8merZUDfSUuJCJXMVFtrg@mail.gmail.com>
	<1319013780.3385.64.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] make install not creating lib entries in /> It might be nice if there was a single variable which could be set to
> control this behaviour, or even better if it can be automatically
> detected. I'm also inclined to suggest that the default should be to
> use /usr/lib and leave the lib64 thing as a RH special case, but then
> I'm a Debian user so I would think that ;-)

At the very least we ought not to dump things in /usr/lib64 unless it
already exists and is distinct from /usr/lib.

We should think about multiarch too at some point.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 09:09:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 09:09:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGYiE-00034j-3s; Wed, 19 Oct 2011 09:09:50 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGYgl-0002mY-BQ
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 09:08:20 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1319040494!32920!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4195 invoked from network); 19 Oct 2011 16:08:16 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-5.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	19 Oct 2011 16:08:16 -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
	p9JG89xj027289
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 16:08: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
	p9JG88kK018306
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 16:08:08 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
	p9JG83U6017931; Wed, 19 Oct 2011 11:08:03 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 09:08:02 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id B7A0A82876; Wed, 19 Oct 2011 12:08:01 -0400 (EDT)
Date: Wed, 19 Oct 2011 12:08:01 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Sander Eikelenboom <linux@eikelenboom.it>, wei.huang2@amd.com
Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
Message-ID: <20111019160801.GA22918@phenom.dumpdata.com>
References: <1904679511.20111018205519@eikelenboom.it>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1904679511.20111018205519@eikelenboom.it>
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.4E9EF5EB.006E:SCFMA922111,ss=1,re=-4.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, Oct 18, 2011 at 08:55:19PM +0200, Sander Eikelenboom wrote:
> Hi Konrad,
> 
> On my system (AND phenom x6, 8gb mem) running xen 4.1.2-rc3
> and a custom kernel based on:
> 
> - your linux-next branch
> - pulled in your apci/cpufreq branch
> - pulled in latest patches from linuses tree

Wei,
Are those similar to what you had been seeing?

> 
> I'm experiencing infrequent panics at boot (say 1 out of 10 or 20 boots), doesn't seem to matter if it's a cold or a warm boot.
> It always seem to happen during or shortly after booting. When it doesn't occur then, it can run for at least several days/weeks (haven't seen it panic then).
> It doesn't seem to happen at a particular point at or shortly after booting, but it happens before starting any guests
> 
> Unfortunately i haven't had serial console enabled at these times, but i have made some photo's.
> The first 3 times it locked completely before being able to print a stacktrace, the 4th time it did (although the photo is a bit unsharp).
> 
> 
> So all in all, it kind of strange, i hope you can figure something out from the stacktrace, if not, i will see if i can try with serial console attached.
> 
> --
> Sander





> _______________________________________________
> 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 Oct 19 09:13:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 09:13:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGYmC-0003cv-3D; Wed, 19 Oct 2011 09:13:56 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGYlI-0003L4-RF
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 09:13:01 -0700
X-Env-Sender: raistlin.df@gmail.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1319040776!35973598!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8187 invoked from network); 19 Oct 2011 16:12:57 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 16:12:57 -0000
Received: by qyg36 with SMTP id 36so1983734qyg.9
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 09:12: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
	:content-transfer-encoding;
	bh=4c4auZWI6JNjKA9XkKuGJ8+Ak87foqL/HarQIcgAHMw=;
	b=qW1jrNGxtD+6AuyfBWF3XA1UVXzKQPWYIRA8Fue/l6ajfYUnTvhdMKc8PJCgA2EV5E
	tQlLj4yJHapa6BWqw4mHA65bTZPOao0NG6O8fmX/g93/gONlhAEtaVMO3kes3pZhjJ2Q
	PkK6UiGxiuXyFMQXm6/0rJfTpQMq+THRSjvHY=
MIME-Version: 1.0
Received: by 10.68.30.36 with SMTP id p4mr7109172pbh.39.1319040776061; Wed, 19
	Oct 2011 09:12:56 -0700 (PDT)
Received: by 10.142.242.1 with HTTP; Wed, 19 Oct 2011 09:12:56 -0700 (PDT)
In-Reply-To: <1319009970.11016.65.camel@dagon.hellion.org.uk>
References: <1318865791.25056.28.camel@Palantir>
	<20111017164020.GE19684@phenom.dumpdata.com>
	<1318982052.2997.19.camel@Palantir>
	<1319009970.11016.65.camel@dagon.hellion.org.uk>
Date: Wed, 19 Oct 2011 18:12:56 +0200
X-Google-Sender-Auth: mwrn3bNglmfijulLl-6oF1C2fDU
Message-ID: <CAAWQecv3QApBvogCMscu+p+ATg-9vPy39YUZvrqfGxOLuEZEOg@mail.gmail.com>
Subject: Re: [Xen-devel] Issue with PCI-passthrough and pvops
From: Dario Faggioli <raistlin@linux.it>
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: xen-devel <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 Wed, Oct 19, 2011 at 9:39 AM, Ian Campbell <Ian.Campbell@citrix.com> wro=
te:
>> # xl destroy 1
>> libxl: error: libxl_pci.c:925:do_pci_remove: xc_physdev_unmap_pirq irq=
=3D40
>> Aborted
>
> You most probably need 'libxl: add missing "break;" to do_pci_remove'
> which I posted v3 of yesterday.
>
Yep, error is gone, thanks!

Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, <http://retis.sssup.it/people/faggioli>
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa =A0(Italy)
Senior Software Engineer, Citrix Systems R&D, Cambridge (UK)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 09:15:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 09:15:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGYnf-000411-Sr; Wed, 19 Oct 2011 09:15:27 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGYn7-0003oB-ON
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 09:14:54 -0700
X-Env-Sender: raistlin.df@gmail.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1319040889!877057!1
X-Originating-IP: [209.85.216.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20751 invoked from network); 19 Oct 2011 16:14:50 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 16:14:50 -0000
Received: by qyk33 with SMTP id 33so3730805qyk.9
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 09:14: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
	:content-transfer-encoding;
	bh=LhtGlrdJkVj1XdOWED4exugv1w7LeMy4wYmk47o9iwA=;
	b=tuxvrF7/u3XXB65+c5uJMJBHInWr4UtPidqZezGnRd/0pgJhaZDQ2AqwgAtUc8cTM7
	GnGJz87zLhI/eZMpdqdsFR8VjCIk6BKn/EfQIDMur8qQTWiVEMUP5HYWvC3iVUu6vsQG
	17NRL3r/MBtM8AavMAHJEd4zRgnSmaYKAmZV4=
MIME-Version: 1.0
Received: by 10.68.208.229 with SMTP id mh5mr13402221pbc.124.1319040888810;
	Wed, 19 Oct 2011 09:14:48 -0700 (PDT)
Received: by 10.142.242.1 with HTTP; Wed, 19 Oct 2011 09:14:48 -0700 (PDT)
In-Reply-To: <e03520648d2c91210d59.1318942496@cosworth.uk.xensource.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
	<e03520648d2c91210d59.1318942496@cosworth.uk.xensource.com>
Date: Wed, 19 Oct 2011 18:14:48 +0200
X-Google-Sender-Auth: brBIANBf54q_C8L2lXGSXVkHPoQ
Message-ID: <CAAWQecu6Gm0Ku6qNErt+NWDxccDypZaw2g-41yfS90ET6yPEPw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 01 of 27 v3] libxl: add missing "break;
	" to do_pci_remove
From: Dario Faggioli <raistlin@linux.it>
To: Ian Campbell <ian.campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
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

On Tue, Oct 18, 2011 at 2:54 PM, Ian Campbell <ian.campbell@citrix.com> wro=
te:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1318930552 -3600
> # Node ID e03520648d2c91210d59a90f497b356fd72eb36f
> # Parent =A0955a6c07dc5e9c55316d1678b2b7cc4313f4fd57
> libxl: add missing "break;" to do_pci_remove
>
> Otherwise we erroneously fall through the LIBXL_DOMAIN_TYPE_PV case into =
the
> "default: abort()".
>
> (I'm sure we fixed this once already...)
>
> Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
>
Tested-by: Dario Faggioli <dario.faggioli@citrix.com>

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, <http://retis.sssup.it/people/faggioli>
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa =A0(Italy)
Senior Software Engineer, Citrix Systems R&D, Cambridge (UK)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 09:33:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 09:33:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGZ5E-0004lP-VN; Wed, 19 Oct 2011 09:33:37 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGZ4g-0004YR-Ob
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 09:33:03 -0700
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319041977!35975017!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26990 invoked from network); 19 Oct 2011 16:32:59 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 16:32:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,373,1315195200"; d="scan'208";a="167461878"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	19 Oct 2011 12:32:55 -0400
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; Wed, 19 Oct 2011
	12:32:52 -0400
Message-ID: <4E9EFBB2.6050206@citrix.com>
Date: Wed, 19 Oct 2011 17:32:50 +0100
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 De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for
	comms
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319015064.3385.80.camel@zakaz.uk.xensource.com>
	<4E9EE659.8090600@tycho.nsa.gov>
In-Reply-To: <4E9EE659.8090600@tycho.nsa.gov>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@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 19/10/11 16:01, Daniel De Graaf wrote:
> On 10/19/2011 05:04 AM, Ian Campbell wrote:
>> On Tue, 2011-10-18 at 21:26 +0100, Daniel De Graaf wrote:
>>> For proper grant mappings, HVM guests require pages allocated using
>>> alloc_xenballooned_pages instead of alloc_vm_area.
>>>
>>> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
>>> ---
[...]
>> Could you also explain where the requirement to use xenballooned pages
>> and not alloc_vm_area comes from in your commit message.
> 
> (Will move to commit message). In PV guests, it is sufficient to only
> reserve kernel address space for grant mappings because Xen modifies the
> mappings directly. HVM guests require that Xen modify the GFN-to-MFN
> mapping, so the pages being remapped must already be allocated. Pages
> obtained from alloc_xenballooned_pages have valid GFNs not currently
> mapped to an MFN, so are available to be used in grant mappings.

Why doesn't (or can't?) Xen add new entries to the GFN-to-MFN map?  Or
why hasn't it reserved a range of GFNs in the map for this?

David

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 09:39:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 09:39:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGZAw-0005IA-0l; Wed, 19 Oct 2011 09:39:30 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGZAD-00052C-Oh
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 09:38:46 -0700
X-Env-Sender: Wei.Huang2@amd.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1319042321!279668!1
X-Originating-IP: [65.55.88.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11280 invoked from network); 19 Oct 2011 16:38:42 -0000
Received: from tx2ehsobe002.messaging.microsoft.com (HELO
	TX2EHSOBE004.bigfish.com) (65.55.88.12)
	by server-9.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	19 Oct 2011 16:38:42 -0000
Received: from mail139-tx2-R.bigfish.com (10.9.14.253) by
	TX2EHSOBE004.bigfish.com (10.9.40.24) with Microsoft SMTP Server id
	14.1.225.22; Wed, 19 Oct 2011 16:38:41 +0000
Received: from mail139-tx2 (localhost.localdomain [127.0.0.1])	by
	mail139-tx2-R.bigfish.com (Postfix) with ESMTP id 04E07D4012F;
	Wed, 19 Oct 2011 16:38:41 +0000 (UTC)
X-SpamScore: -20
X-BigFish: VPS-20(zz9371K542M1432N98dK4015Lzz1202hzz8275bhz32i668h839h944h61h)
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 mail139-tx2 (localhost.localdomain [127.0.0.1]) by mail139-tx2
	(MessageSwitch) id 1319042319813240_23807;
	Wed, 19 Oct 2011 16:38:39 +0000 (UTC)
Received: from TX2EHSMHS004.bigfish.com (unknown [10.9.14.242])	by
	mail139-tx2.bigfish.com (Postfix) with ESMTP id B6D011C2804B;
	Wed, 19 Oct 2011 16:38:39 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS004.bigfish.com (10.9.99.104) with Microsoft SMTP Server id
	14.1.225.22; Wed, 19 Oct 2011 16:38:39 +0000
X-WSS-ID: 0LTBNKB-02-9X8-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 20E58C81B6;	Wed, 19 Oct 2011 11:38:35 -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;
	Wed, 19 Oct 2011 11:38:50 -0500
Received: from SAUSEXMBP01.amd.com ([163.181.3.198]) by sausexhtp02.amd.com
	([163.181.3.152]) with mapi; Wed, 19 Oct 2011 11:38:38 -0500
From: "Huang2, Wei" <Wei.Huang2@amd.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, Sander Eikelenboom
	<linux@eikelenboom.it>
Date: Wed, 19 Oct 2011 11:38:38 -0500
Subject: RE: [Xen-devel] Panic:: handle_irq_event_percpu
Thread-Topic: [Xen-devel] Panic:: handle_irq_event_percpu
Thread-Index: AcyOeVVR0PwueRAPShiFG+kRBacvrQAA22FQ
Message-ID: <EE335F95F28A664DB4A21289D2AA053B01E6CBBBDB@SAUSEXMBP01.amd.com>
References: <1904679511.20111018205519@eikelenboom.it>
	<20111019160801.GA22918@phenom.dumpdata.com>
In-Reply-To: <20111019160801.GA22918@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
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

It looks similar.=20

Hi Sander, could you please test your system with the following options?

1. iommu=3Damd-iommu-perdev-intremap in xen.gz GRUB entry
2. pci=3Dnosmi in pvops GRUB entry
3. iommu=3D0 in xen.gz GRUB entry [optional, only if (1) doesn't work for y=
ou]

We were seeing an issue which was caused by messed-up interrupt remap table=
. George Dunlap's perdev interrupt map solved our problem.

Thanks,
-Wei

-----Original Message-----
From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]=20
Sent: Wednesday, October 19, 2011 11:08 AM
To: Sander Eikelenboom; Huang2, Wei
Cc: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu

On Tue, Oct 18, 2011 at 08:55:19PM +0200, Sander Eikelenboom wrote:
> Hi Konrad,
>=20
> On my system (AND phenom x6, 8gb mem) running xen 4.1.2-rc3
> and a custom kernel based on:
>=20
> - your linux-next branch
> - pulled in your apci/cpufreq branch
> - pulled in latest patches from linuses tree

Wei,
Are those similar to what you had been seeing?

>=20
> I'm experiencing infrequent panics at boot (say 1 out of 10 or 20 boots),=
 doesn't seem to matter if it's a cold or a warm boot.
> It always seem to happen during or shortly after booting. When it doesn't=
 occur then, it can run for at least several days/weeks (haven't seen it pa=
nic then).
> It doesn't seem to happen at a particular point at or shortly after booti=
ng, but it happens before starting any guests
>=20
> Unfortunately i haven't had serial console enabled at these times, but i =
have made some photo's.
> The first 3 times it locked completely before being able to print a stack=
trace, the 4th time it did (although the photo is a bit unsharp).
>=20
>=20
> So all in all, it kind of strange, i hope you can figure something out fr=
om the stacktrace, if not, i will see if i can try with serial console atta=
ched.
>=20
> --
> Sander





> _______________________________________________
> 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 Oct 19 09:57:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 09:57:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGZRz-0006Bf-VE; Wed, 19 Oct 2011 09:57:08 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGZRO-0005y2-Dx
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 09:56:30 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319043387!36376!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26883 invoked from network); 19 Oct 2011 16:56:27 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-11.tower-182.messagelabs.com with SMTP;
	19 Oct 2011 16:56:27 -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
	p9JGuPoO012205; Wed, 19 Oct 2011 16:56:25 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 p9JGuPjE022609; 
	Wed, 19 Oct 2011 12:56:25 -0400
Message-ID: <4E9F0148.6040905@tycho.nsa.gov>
Date: Wed, 19 Oct 2011 12:56:40 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Organization: National Security Agency
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:6.0.2) Gecko/20110906 Thunderbird/6.0.2
MIME-Version: 1.0
To: David Vrabel <david.vrabel@citrix.com>
Subject: Re: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for
	comms
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319015064.3385.80.camel@zakaz.uk.xensource.com>
	<4E9EE659.8090600@tycho.nsa.gov> <4E9EFBB2.6050206@citrix.com>
In-Reply-To: <4E9EFBB2.6050206@citrix.com>
X-Enigmail-Version: 1.3
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@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 10/19/2011 12:32 PM, David Vrabel wrote:
> On 19/10/11 16:01, Daniel De Graaf wrote:
>> On 10/19/2011 05:04 AM, Ian Campbell wrote:
>>> On Tue, 2011-10-18 at 21:26 +0100, Daniel De Graaf wrote:
>>>> For proper grant mappings, HVM guests require pages allocated using
>>>> alloc_xenballooned_pages instead of alloc_vm_area.
>>>>
>>>> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
>>>> ---
> [...]
>>> Could you also explain where the requirement to use xenballooned pages
>>> and not alloc_vm_area comes from in your commit message.
>>
>> (Will move to commit message). In PV guests, it is sufficient to only
>> reserve kernel address space for grant mappings because Xen modifies the
>> mappings directly. HVM guests require that Xen modify the GFN-to-MFN
>> mapping, so the pages being remapped must already be allocated. Pages
>> obtained from alloc_xenballooned_pages have valid GFNs not currently
>> mapped to an MFN, so are available to be used in grant mappings.
> 
> Why doesn't (or can't?) Xen add new entries to the GFN-to-MFN map?  Or
> why hasn't it reserved a range of GFNs in the map for this?
> 
> David
> 

That would be another way for Xen to solve this, but it would require
that the reserved GFN range be large enough for all mappings the guest
does, and would also need to be managed by the hypervisor. By allowing
the guest to specify which GFN to remap in the grant operation, the
guest can use any of the memory was either not populated at startup or
was returned to the hypervisor via XENMEM_decrease_reservation. For
32-bit guests with highmem, this also allows the guest to choose if the
grant-mapped pages are in high or low memory rather than forcing it to
be where the reserved GFN range ended up. Such a change would also
break API compatibility since the guest would need to read GFNs back
from the grant operation and map those GFNs.

-- 
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 Wed Oct 19 10:28:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 10:28:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGZvu-0007DG-RK; Wed, 19 Oct 2011 10:28:02 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGZv7-00070i-Ua
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 10:27:14 -0700
X-Env-Sender: raistlin.df@gmail.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319045229!284754!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9981 invoked from network); 19 Oct 2011 17:27:10 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 17:27:10 -0000
Received: by qyg36 with SMTP id 36so2089390qyg.9
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 10:27:09 -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=fY5qrxNtan81/qHm1/qjypbqiwwj1kt4Sr89HE+g+Xg=;
	b=uNndwL3Gz9SSz5k5lzchTwiL2iLoq7HkNtj3pDes5AZVPiUNh2VWwIyRO7SNgHdC5N
	W6ryF99EYGIX+vmcXTt2r38LgbW4rnyMk/F9lOSsV1FAn0rusN7t2nH9IGXbIUWlvLFa
	RC8kpYp73p8oSf8FrZEodf5vWG0b7Hpk7W33M=
MIME-Version: 1.0
Received: by 10.68.8.195 with SMTP id t3mr13777194pba.107.1319045228863; Wed,
	19 Oct 2011 10:27:08 -0700 (PDT)
Received: by 10.142.242.1 with HTTP; Wed, 19 Oct 2011 10:27:08 -0700 (PDT)
In-Reply-To: <20111019141032.GB8033@phenom.dumpdata.com>
References: <1318865791.25056.28.camel@Palantir>
	<20111017164020.GE19684@phenom.dumpdata.com>
	<1318982052.2997.19.camel@Palantir>
	<20111019011028.GA19302@phenom.dumpdata.com>
	<1319010037.11016.66.camel@dagon.hellion.org.uk>
	<CAAWQecut9-ouRfZEwmvFYkA8W98XZRFc3LtdPYPyWbhuaZzYiw@mail.gmail.com>
	<20111019141032.GB8033@phenom.dumpdata.com>
Date: Wed, 19 Oct 2011 19:27:08 +0200
X-Google-Sender-Auth: lS9-H-mblCSrY4jJSqgEqljzbLw
Message-ID: <CAAWQectmCtkgvi7ZpQZYKxCSPZ7sk14UdCYAY2PgQjKSWEDBqw@mail.gmail.com>
Subject: Re: [Xen-devel] Issue with PCI-passthrough and pvops
From: Dario Faggioli <raistlin@linux.it>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
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

On Wed, Oct 19, 2011 at 4:10 PM, Konrad Rzeszutek Wilk
<konrad.wilk@oracle.com> wrote:
>> >> > Guest:
>> >> > [ =A0 19.607997] ixgbe: Intel(R) 10 Gigabit PCI Express Network Dri=
ver - version 3.4.8-k
>> >> > [ =A0 19.608670] ixgbe: Copyright (c) 1999-2011 Intel Corporation.
>> >> > [ =A0 19.609465] ixgbe 0000:00:00.0: device not available (can't re=
serve [mem 0xdf300000-0xe32fffff 64bit])
>> >> > [ =A0 19.610878] ixgbe: probe of 0000:00:00.0 failed with error -22
>
> Dario,
>
> I've seen this bug before with .. Hm, some similar adapter. I know
> that if pass in 'igb.max_vfs=3D2' and passed in the igbvf PCI cards the
> guest worked just fine. It just did not like being passed in as a real de=
vice.
>
> Otherwise, older MSI/MSI-X (non SR-IOV) cards worked fine so I never go
> further in debugging this.
>
Yeah, in fact passing other cards the box have to the very same domain
seems to just work.

> I would recommend you take a look at the probe function and figure out wh=
y
> it can't reserve that region. And easy way to figure that out is to
> boot the guest and look in /proc/iomem and see what is in the df30000-e32=
ffffff
> region. Perhaps something else is overlapping it?
>
I might be wrong, but it doesn't seem quite so to me:

# cat /proc/iomem
00000000-0000ffff : reserved
00010000-0009ffff : System RAM
000a0000-000fffff : reserved
  000f0000-000fffff : System ROM
00100000-1fffffff : System RAM
  01000000-01b88b4b : Kernel code
  01b88b4c-02352a7f : Kernel data
  02652000-02ee6fff : Kernel bss
20000000-bf698fff : Unusable memory
bf6af000-bf6cdfff : ACPI Tables
d58f8000-d58fbfff : 0000:00:00.0
d5900000-d597ffff : 0000:00:00.0
df200000-e71fffff : 0000:00:00.0
100000000-1000fffff : System RAM

The probe function is huge... But I'll se if I can find the time to take
a look at it in the next days...

Thanks a lot for now. :-)

Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, <http://retis.sssup.it/people/faggioli>
Senior Software Engineer, Citrix Systems R&D, Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa =A0(Italy)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 10:31:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 10:31:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGZzJ-0007ps-PP; Wed, 19 Oct 2011 10:31:33 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGZyq-0007dz-Eb
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 10:31:04 -0700
X-Env-Sender: linux@eikelenboom.it
X-Msg-Ref: server-7.tower-174.messagelabs.com!1319045460!35937080!1
X-Originating-IP: [188.40.164.121]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2037 invoked from network); 19 Oct 2011 17:31:01 -0000
Received: from static.121.164.40.188.clients.your-server.de (HELO
	smtp.eikelenboom.it) (188.40.164.121)
	by server-7.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	19 Oct 2011 17:31:01 -0000
Received: from 143-67-ftth.onsneteindhoven.nl ([88.159.67.143]:51014
	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 1RGZwM-0005fI-La; Wed, 19 Oct 2011 19:28:30 +0200
Date: Wed, 19 Oct 2011 19:30:02 +0200
From: Sander Eikelenboom <linux@eikelenboom.it>
Organization: Eikelenboom IT services
X-Priority: 3 (Normal)
Message-ID: <707354928.20111019193003@eikelenboom.it>
To: "Huang2, Wei" <Wei.Huang2@amd.com>
Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
In-Reply-To: <EE335F95F28A664DB4A21289D2AA053B01E6CBBBDB@SAUSEXMBP01.amd.com>
References: <1904679511.20111018205519@eikelenboom.it>
	<20111019160801.GA22918@phenom.dumpdata.com>
	<EE335F95F28A664DB4A21289D2AA053B01E6CBBBDB@SAUSEXMBP01.amd.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: quoted-printable
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

Hello Wei,

Result is that using only "1" or "1" in combination with "2" always result =
in SATA I/O errors, so that doesn't boot.

Haven't tried rebooting a lot of times without iommu yet.
(the reason i bought the 890fx board in the first place)
Will try that a few times when i have some more time.

--
Sander

Wednesday, October 19, 2011, 6:38:38 PM, you wrote:

> It looks similar.=20

> Hi Sander, could you please test your system with the following options?

> 1. iommu=3Damd-iommu-perdev-intremap in xen.gz GRUB entry
> 2. pci=3Dnosmi in pvops GRUB entry
> 3. iommu=3D0 in xen.gz GRUB entry [optional, only if (1) doesn't work for=
 you]

> We were seeing an issue which was caused by messed-up interrupt remap tab=
le. George Dunlap's perdev interrupt map solved our problem.

> Thanks,
> -Wei

> -----Original Message-----
> From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]=20
> Sent: Wednesday, October 19, 2011 11:08 AM
> To: Sander Eikelenboom; Huang2, Wei
> Cc: xen-devel@lists.xensource.com
> Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu

> On Tue, Oct 18, 2011 at 08:55:19PM +0200, Sander Eikelenboom wrote:
>> Hi Konrad,
>>=20
>> On my system (AND phenom x6, 8gb mem) running xen 4.1.2-rc3
>> and a custom kernel based on:
>>=20
>> - your linux-next branch
>> - pulled in your apci/cpufreq branch
>> - pulled in latest patches from linuses tree

> Wei,
> Are those similar to what you had been seeing?

>>=20
>> I'm experiencing infrequent panics at boot (say 1 out of 10 or 20 boots)=
, doesn't seem to matter if it's a cold or a warm boot.
>> It always seem to happen during or shortly after booting. When it doesn'=
t occur then, it can run for at least several days/weeks (haven't seen it p=
anic then).
>> It doesn't seem to happen at a particular point at or shortly after boot=
ing, but it happens before starting any guests
>>=20
>> Unfortunately i haven't had serial console enabled at these times, but i=
 have made some photo's.
>> The first 3 times it locked completely before being able to print a stac=
ktrace, the 4th time it did (although the photo is a bit unsharp).
>>=20
>>=20
>> So all in all, it kind of strange, i hope you can figure something out f=
rom the stacktrace, if not, i will see if i can try with serial console att=
ached.
>>=20
>> --
>> Sander





>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel






--=20
Best regards,
 Sander                            mailto:linux@eikelenboom.it


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 11:15:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 11:15:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGafW-0001Pm-JM; Wed, 19 Oct 2011 11:15:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGaeQ-0001Cb-35; Wed, 19 Oct 2011 11:14:02 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319048038!35947494!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27800 invoked from network); 19 Oct 2011 18:13:58 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	19 Oct 2011 18:13:58 -0000
Received: by wwf10 with SMTP id 10so2495027wwf.24
	for <multiple recipients>; Wed, 19 Oct 2011 11:13:58 -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=y9pR7nONjT1Yo01uP+1D9QJZ8P38pfloVadKZXh2Bx0=;
	b=q9+CRIqTE4SvFviuG5KJIPlNKjfc3iEPN7Immw6jV0KZbSDdHYFvwIUqO3/zzc30ob
	mxv5f4fAbRzFEfobpc7Gr4qH9gHWL5Bhl5P1//kHHxmtXyln/4Dn0Qwz/x3JhzpNte/c
	WH/A7C30wMs8r8FdBM6MvLkMlHCOT4MAhji10=
Received: by 10.216.25.196 with SMTP id z46mr2996854wez.16.1319048038488;
	Wed, 19 Oct 2011 11:13:58 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id b5sm11255246wbh.4.2011.10.19.11.13.55
	(version=SSLv3 cipher=OTHER); Wed, 19 Oct 2011 11:13:56 -0700 (PDT)
Message-ID: <4E9F1361.5020906@xen.org>
Date: Wed, 19 Oct 2011 19:13:53 +0100
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: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111018132618.GA19611@phenom.dumpdata.com>
	<1319013528.3385.59.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319013528.3385.59.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>,
	Joseph Glanville <joseph.glanville@orionvm.com.au>,
	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 19/10/2011 09:38, Ian Campbell wrote:
> It'll break links, but I guess that's a feature. 
That's easy to fix: rename, check orphaned pages, fix those pages

> How close are we to having the new wiki setup -- that would also solve 
> this issue? 
It wouldn't solve the issue really.

> We could just manually add a header/banner ("attention box"?) to each 
> archived page, that's no harder than renaming it I suspect. Ian.
That is true, but for a user it would still clutter the index

I am running behind publishing the blog post: will post it tomorrow

When do we want to start and end the session? That's the only 
outstanding question.

We also should take bofh's feedback seriously. The points he makes are 
exactly the ones I have identified to, but don't know enough yet to fix it.

Lars

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 11:29:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 11:29:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGat0-0002iU-Gc; Wed, 19 Oct 2011 11:29:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGas2-0002VB-5g
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 11:28:06 -0700
X-Env-Sender: Wei.Huang2@amd.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319048850!59915402!1
X-Originating-IP: [65.55.88.14]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28794 invoked from network); 19 Oct 2011 18:27:31 -0000
Received: from tx2ehsobe004.messaging.microsoft.com (HELO
	TX2EHSOBE008.bigfish.com) (65.55.88.14)
	by server-2.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	19 Oct 2011 18:27:31 -0000
Received: from mail11-tx2-R.bigfish.com (10.9.14.246) by
	TX2EHSOBE008.bigfish.com (10.9.40.28) with Microsoft SMTP Server id
	14.1.225.22; Wed, 19 Oct 2011 18:28:01 +0000
Received: from mail11-tx2 (localhost.localdomain [127.0.0.1])	by
	mail11-tx2-R.bigfish.com (Postfix) with ESMTP id 2277E300D4;
	Wed, 19 Oct 2011 18:28:01 +0000 (UTC)
X-SpamScore: -20
X-BigFish: VPS-20(zz9371Kc85fh542M1432N98dK4015Lzz1202hzz8275bhz32i668h839h34h)
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 mail11-tx2 (localhost.localdomain [127.0.0.1]) by mail11-tx2
	(MessageSwitch) id 1319048880734896_25364;
	Wed, 19 Oct 2011 18:28:00 +0000 (UTC)
Received: from TX2EHSMHS029.bigfish.com (unknown [10.9.14.245])	by
	mail11-tx2.bigfish.com (Postfix) with ESMTP id A3C0FDF808F;
	Wed, 19 Oct 2011 18:28:00 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS029.bigfish.com (10.9.99.129) with Microsoft SMTP Server id
	14.1.225.22; Wed, 19 Oct 2011 18:27:59 +0000
X-WSS-ID: 0LTBSMI-01-IER-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 2C2C7102819B;	Wed, 19 Oct 2011 13:27:53 -0500 (CDT)
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;
	Wed, 19 Oct 2011 13:28:09 -0500
Received: from SAUSEXMBP01.amd.com ([163.181.3.198]) by sausexhtp01.amd.com
	([163.181.3.165]) with mapi; Wed, 19 Oct 2011 13:27:56 -0500
From: "Huang2, Wei" <Wei.Huang2@amd.com>
To: Sander Eikelenboom <linux@eikelenboom.it>
Date: Wed, 19 Oct 2011 13:27:55 -0500
Subject: RE: [Xen-devel] Panic:: handle_irq_event_percpu
Thread-Topic: [Xen-devel] Panic:: handle_irq_event_percpu
Thread-Index: AcyOhQyde7bOIqazStu+Wu1fj2u2BAABmlfA
Message-ID: <EE335F95F28A664DB4A21289D2AA053B01E6CBBD30@SAUSEXMBP01.amd.com>
References: <1904679511.20111018205519@eikelenboom.it>
	<20111019160801.GA22918@phenom.dumpdata.com>
	<EE335F95F28A664DB4A21289D2AA053B01E6CBBBDB@SAUSEXMBP01.amd.com>
	<707354928.20111019193003@eikelenboom.it>
In-Reply-To: <707354928.20111019193003@eikelenboom.it>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: multipart/mixed;
	boundary="_002_EE335F95F28A664DB4A21289D2AA053B01E6CBBD30SAUSEXMBP01am_"
MIME-Version: 1.0
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Rzeszutek Wilk <konrad.wilk@oracle.com>, Konrad
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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_EE335F95F28A664DB4A21289D2AA053B01E6CBBD30SAUSEXMBP01am_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

This reminds me of 23768:09595fdf3638, which reverted WeiWang's patch of fo=
rcing perdev-intremap as default. Could you try the attached patch on your =
Xen 4.1 tree and test with patched xen.gz?=20

Thanks,
-Wei

-----Original Message-----
From: xen-devel-bounces@lists.xensource.com [mailto:xen-devel-bounces@lists=
.xensource.com] On Behalf Of Sander Eikelenboom
Sent: Wednesday, October 19, 2011 12:30 PM
To: Huang2, Wei
Cc: xen-devel@lists.xensource.com; Konrad Rzeszutek Wilk
Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu

Hello Wei,

Result is that using only "1" or "1" in combination with "2" always result =
in SATA I/O errors, so that doesn't boot.

Haven't tried rebooting a lot of times without iommu yet.
(the reason i bought the 890fx board in the first place)
Will try that a few times when i have some more time.

--
Sander

Wednesday, October 19, 2011, 6:38:38 PM, you wrote:

> It looks similar.=20

> Hi Sander, could you please test your system with the following options?

> 1. iommu=3Damd-iommu-perdev-intremap in xen.gz GRUB entry
> 2. pci=3Dnosmi in pvops GRUB entry
> 3. iommu=3D0 in xen.gz GRUB entry [optional, only if (1) doesn't work for=
 you]

> We were seeing an issue which was caused by messed-up interrupt remap tab=
le. George Dunlap's perdev interrupt map solved our problem.

> Thanks,
> -Wei

> -----Original Message-----
> From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]=20
> Sent: Wednesday, October 19, 2011 11:08 AM
> To: Sander Eikelenboom; Huang2, Wei
> Cc: xen-devel@lists.xensource.com
> Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu

> On Tue, Oct 18, 2011 at 08:55:19PM +0200, Sander Eikelenboom wrote:
>> Hi Konrad,
>>=20
>> On my system (AND phenom x6, 8gb mem) running xen 4.1.2-rc3
>> and a custom kernel based on:
>>=20
>> - your linux-next branch
>> - pulled in your apci/cpufreq branch
>> - pulled in latest patches from linuses tree

> Wei,
> Are those similar to what you had been seeing?

>>=20
>> I'm experiencing infrequent panics at boot (say 1 out of 10 or 20 boots)=
, doesn't seem to matter if it's a cold or a warm boot.
>> It always seem to happen during or shortly after booting. When it doesn'=
t occur then, it can run for at least several days/weeks (haven't seen it p=
anic then).
>> It doesn't seem to happen at a particular point at or shortly after boot=
ing, but it happens before starting any guests
>>=20
>> Unfortunately i haven't had serial console enabled at these times, but i=
 have made some photo's.
>> The first 3 times it locked completely before being able to print a stac=
ktrace, the 4th time it did (although the photo is a bit unsharp).
>>=20
>>=20
>> So all in all, it kind of strange, i hope you can figure something out f=
rom the stacktrace, if not, i will see if i can try with serial console att=
ached.
>>=20
>> --
>> Sander





>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel






--=20
Best regards,
 Sander                            mailto:linux@eikelenboom.it


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel


--_002_EE335F95F28A664DB4A21289D2AA053B01E6CBBD30SAUSEXMBP01am_
Content-Type: text/plain; name="interrupt-map-patch.txt"
Content-Description: interrupt-map-patch.txt
Content-Disposition: attachment; filename="interrupt-map-patch.txt";
	size=10941; creation-date="Wed, 19 Oct 2011 13:17:01 GMT";
	modification-date="Fri, 14 Oct 2011 11:58:44 GMT"
Content-Transfer-Encoding: base64

ZGlmZiAtciA5Zjc2MDJlMzEyN2MgYXJjaC94ODYvaW9fYXBpYy5jDQotLS0gYS9hcmNoL3g4Ni9p
b19hcGljLmMJVGh1IE9jdCAxMyAxNjoyNToyOCAyMDExIC0wNTAwDQorKysgYi9hcmNoL3g4Ni9p
b19hcGljLmMJRnJpIE9jdCAxNCAxMDo1ODo0NCAyMDExIC0wNTAwDQpAQCAtNTY5LDYgKzU2OSwx
MyBAQA0KICAgICAgICAgfQ0KICAgICAgICAgX19nZXRfY3B1X3Zhcih2ZWN0b3JfaXJxKVt2ZWN0
b3JdID0gLTE7DQogICAgICAgICBjZmctPm1vdmVfY2xlYW51cF9jb3VudC0tOw0KKw0KKyAgICAg
ICAgaWYgKCBjZmctPm1vdmVfY2xlYW51cF9jb3VudCA9PSAwIA0KKyAgICAgICAgICAgICAmJiAg
Y2ZnLT51c2VkX3ZlY3RvcnMgKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIEFTU0VSVCh0ZXN0
X2JpdCh2ZWN0b3IsIGNmZy0+dXNlZF92ZWN0b3JzKSk7DQorICAgICAgICAgICAgY2xlYXJfYml0
KHZlY3RvciwgY2ZnLT51c2VkX3ZlY3RvcnMpOw0KKyAgICAgICAgfQ0KIHVubG9jazoNCiAgICAg
ICAgIHNwaW5fdW5sb2NrKCZkZXNjLT5sb2NrKTsNCiAgICAgfQ0KZGlmZiAtciA5Zjc2MDJlMzEy
N2MgYXJjaC94ODYvaXJxLmMNCi0tLSBhL2FyY2gveDg2L2lycS5jCVRodSBPY3QgMTMgMTY6MjU6
MjggMjAxMSAtMDUwMA0KKysrIGIvYXJjaC94ODYvaXJxLmMJRnJpIE9jdCAxNCAxMDo1ODo0NCAy
MDExIC0wNTAwDQpAQCAtMjQsNiArMjQsOCBAQA0KICNpbmNsdWRlIDxhc20vbWFjaC1nZW5lcmlj
L21hY2hfYXBpYy5oPg0KICNpbmNsdWRlIDxwdWJsaWMvcGh5c2Rldi5oPg0KIA0KK3N0YXRpYyB2
b2lkIHBhcnNlX2lycV92ZWN0b3JfbWFwX3BhcmFtKGNoYXIgKnMpOw0KKw0KIC8qIG9wdF9ub2ly
cWJhbGFuY2U6IElmIHRydWUsIHNvZnR3YXJlIElSUSBiYWxhbmNpbmcvYWZmaW5pdHkgaXMgZGlz
YWJsZWQuICovDQogYm9vbF90IF9fcmVhZF9tb3N0bHkgb3B0X25vaXJxYmFsYW5jZSA9IDA7DQog
Ym9vbGVhbl9wYXJhbSgibm9pcnFiYWxhbmNlIiwgb3B0X25vaXJxYmFsYW5jZSk7DQpAQCAtMzEs
NiArMzMsMTIgQEANCiB1bnNpZ25lZCBpbnQgX19yZWFkX21vc3RseSBucl9pcnFzX2dzaSA9IDE2
Ow0KIHVuc2lnbmVkIGludCBfX3JlYWRfbW9zdGx5IG5yX2lycXM7DQogaW50ZWdlcl9wYXJhbSgi
bnJfaXJxcyIsIG5yX2lycXMpOw0KKw0KKy8qIFRoaXMgZGVmYXVsdCBtYXkgYmUgY2hhbmdlZCBi
eSB0aGUgQU1EIElPTU1VIGNvZGUgKi8NCitpbnQgX19yZWFkX21vc3RseSBvcHRfaXJxX3ZlY3Rv
cl9tYXAgPSBPUFRfSVJRX1ZFQ1RPUl9NQVBfREVGQVVMVDsNCitjdXN0b21fcGFyYW0oImlycV92
ZWN0b3JfbWFwIiwgcGFyc2VfaXJxX3ZlY3Rvcl9tYXBfcGFyYW0pOw0KKw0KK3ZtYXNrX3QgZ2xv
YmFsX3VzZWRfdmVjdG9yX21hcDsNCiANCiB1OCBfX3JlYWRfbW9zdGx5ICppcnFfdmVjdG9yOw0K
IHN0cnVjdCBpcnFfZGVzYyBfX3JlYWRfbW9zdGx5ICppcnFfZGVzYyA9IE5VTEw7DQpAQCAtNTks
NiArNjcsMjYgQEANCiAvKiBpcnFfcmF0ZWxpbWl0OiB0aGUgbWF4IGlycSByYXRlIGFsbG93ZWQg
aW4gZXZlcnkgMTBtcywgc2V0IDAgdG8gZGlzYWJsZSAqLw0KIHN0YXRpYyB1bnNpZ25lZCBpbnQg
X19yZWFkX21vc3RseSBpcnFfcmF0ZWxpbWl0X3RocmVzaG9sZCA9IDEwMDAwOw0KIGludGVnZXJf
cGFyYW0oImlycV9yYXRlbGltaXQiLCBpcnFfcmF0ZWxpbWl0X3RocmVzaG9sZCk7DQorDQorc3Rh
dGljIHZvaWQgX19pbml0IHBhcnNlX2lycV92ZWN0b3JfbWFwX3BhcmFtKGNoYXIgKnMpDQorew0K
KyAgICBjaGFyICpzczsNCisNCisgICAgZG8gew0KKyAgICAgICAgc3MgPSBzdHJjaHIocywgJywn
KTsNCisgICAgICAgIGlmICggc3MgKQ0KKyAgICAgICAgICAgICpzcyA9ICdcMCc7DQorDQorICAg
ICAgICBpZiAoICFzdHJjbXAocywgIm5vbmUiKSkNCisgICAgICAgICAgICBvcHRfaXJxX3ZlY3Rv
cl9tYXA9T1BUX0lSUV9WRUNUT1JfTUFQX05PTkU7DQorICAgICAgICBlbHNlIGlmICggIXN0cmNt
cChzLCAiZ2xvYmFsIikpDQorICAgICAgICAgICAgb3B0X2lycV92ZWN0b3JfbWFwPU9QVF9JUlFf
VkVDVE9SX01BUF9HTE9CQUw7DQorICAgICAgICBlbHNlIGlmICggIXN0cmNtcChzLCAicGVyLWRl
dmljZSIpKQ0KKyAgICAgICAgICAgIG9wdF9pcnFfdmVjdG9yX21hcD1PUFRfSVJRX1ZFQ1RPUl9N
QVBfUEVSREVWOw0KKw0KKyAgICAgICAgcyA9IHNzICsgMTsNCisgICAgfSB3aGlsZSAoIHNzICk7
DQorfQ0KIA0KIC8qIE11c3QgYmUgY2FsbGVkIHdoZW4gaXJxIGRpc2FibGVkICovDQogdm9pZCBs
b2NrX3ZlY3Rvcl9sb2NrKHZvaWQpDQpAQCAtOTQsNiArMTIyLDExIEBADQogICAgICAgICBwZXJf
Y3B1KHZlY3Rvcl9pcnEsIGNwdSlbdmVjdG9yXSA9IGlycTsNCiAgICAgY2ZnLT52ZWN0b3IgPSB2
ZWN0b3I7DQogICAgIGNmZy0+Y3B1X21hc2sgPSBvbmxpbmVfbWFzazsNCisgICAgaWYgKCBjZmct
PnVzZWRfdmVjdG9ycyApDQorICAgIHsNCisgICAgICAgIEFTU0VSVCghdGVzdF9iaXQodmVjdG9y
LCBjZmctPnVzZWRfdmVjdG9ycykpOw0KKyAgICAgICAgc2V0X2JpdCh2ZWN0b3IsIGNmZy0+dXNl
ZF92ZWN0b3JzKTsNCisgICAgfQ0KICAgICBpcnFfc3RhdHVzW2lycV0gPSBJUlFfVVNFRDsNCiAg
ICAgaWYgKElPX0FQSUNfSVJRKGlycSkpDQogICAgICAgICBpcnFfdmVjdG9yW2lycV0gPSB2ZWN0
b3I7DQpAQCAtMTU4LDYgKzE5MSw3IEBADQogICAgIGRlc2MtPmRlcHRoICAgPSAxOw0KICAgICBk
ZXNjLT5tc2lfZGVzYyA9IE5VTEw7DQogICAgIGRlc2MtPmhhbmRsZXIgPSAmbm9faXJxX3R5cGU7
DQorICAgIGRlc2MtPmNoaXBfZGF0YS0+dXNlZF92ZWN0b3JzPU5VTEw7DQogICAgIGNwdXNfc2V0
YWxsKGRlc2MtPmFmZmluaXR5KTsNCiAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+
bG9jaywgZmxhZ3MpOw0KIA0KQEAgLTE5MCw2ICsyMjQsNyBAQA0KIA0KICAgICBpZiAobGlrZWx5
KCFjZmctPm1vdmVfaW5fcHJvZ3Jlc3MpKQ0KICAgICAgICAgcmV0dXJuOw0KKw0KICAgICBjcHVz
X2FuZCh0bXBfbWFzaywgY2ZnLT5vbGRfY3B1X21hc2ssIGNwdV9vbmxpbmVfbWFwKTsNCiAgICAg
Zm9yX2VhY2hfY3B1X21hc2soY3B1LCB0bXBfbWFzaykgew0KICAgICAgICAgZm9yICh2ZWN0b3Ig
PSBGSVJTVF9EWU5BTUlDX1ZFQ1RPUjsgdmVjdG9yIDw9IExBU1RfRFlOQU1JQ19WRUNUT1I7DQpA
QCAtMjAwLDYgKzIzNSwxMiBAQA0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgIH0NCiAg
ICAgIH0NCisNCisgICAgaWYgKCBjZmctPnVzZWRfdmVjdG9ycyApDQorICAgIHsNCisgICAgICAg
IEFTU0VSVCh0ZXN0X2JpdCh2ZWN0b3IsIGNmZy0+dXNlZF92ZWN0b3JzKSk7DQorICAgICAgICBj
bGVhcl9iaXQodmVjdG9yLCBjZmctPnVzZWRfdmVjdG9ycyk7DQorICAgIH0NCiANCiAgICAgY2Zn
LT5tb3ZlX2luX3Byb2dyZXNzID0gMDsNCiB9DQpAQCAtMjYwLDYgKzMwMSw3IEBADQogICAgIGNm
Zy0+dmVjdG9yID0gSVJRX1ZFQ1RPUl9VTkFTU0lHTkVEOw0KICAgICBjcHVzX2NsZWFyKGNmZy0+
Y3B1X21hc2spOw0KICAgICBjcHVzX2NsZWFyKGNmZy0+b2xkX2NwdV9tYXNrKTsNCisgICAgY2Zn
LT51c2VkX3ZlY3RvcnMgPSBOVUxMOw0KIH0NCiANCiBpbnQgaW5pdF9pcnFfZGF0YSh2b2lkKQ0K
QEAgLTMyOSw2ICszNzEsNDEgQEANCiAgICAgZW5kX25vbmUNCiB9Ow0KIA0KK3N0YXRpYyB2bWFz
a190ICppcnFfZ2V0X3VzZWRfdmVjdG9yX21hc2soaW50IGlycSkNCit7DQorICAgIHZtYXNrX3Qg
KnJldCA9IE5VTEw7DQorDQorICAgIGlmICggb3B0X2lycV92ZWN0b3JfbWFwID09IE9QVF9JUlFf
VkVDVE9SX01BUF9HTE9CQUwgKQ0KKyAgICB7DQorICAgICAgICBzdHJ1Y3QgaXJxX2Rlc2MgKmRl
c2MgPSBpcnFfdG9fZGVzYyhpcnEpOw0KKw0KKyAgICAgICAgcmV0ID0gJmdsb2JhbF91c2VkX3Zl
Y3Rvcl9tYXA7DQorDQorICAgICAgICBpZiAoIGRlc2MtPmNoaXBfZGF0YS0+dXNlZF92ZWN0b3Jz
ICkNCisgICAgICAgIHsNCisgICAgICAgICAgICBwcmludGsoWEVOTE9HX0lORk8gIiVzOiBTdHJh
bmdlLCB1bmFzc2lnbmVkIGlycSAlZCBhbHJlYWR5IGhhcyB1c2VkX3ZlY3RvcnMhXG4iLA0KKyAg
ICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaXJxKTsNCisgICAgICAgIH0NCisgICAgICAgIGVs
c2UNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnQgdmVjdG9yOw0KKyAgICAgICAgICAgIA0K
KyAgICAgICAgICAgIHZlY3RvciA9IGlycV90b192ZWN0b3IoaXJxKTsNCisgICAgICAgICAgICBp
ZiAoIHZlY3RvciA+IDAgKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgcHJpbnRr
KFhFTkxPR19JTkZPICIlczogU3RyYW5nZSwgaXJxICVkIGFscmVhZHkgYXNzaWduZWQgdmVjdG9y
ICVkIVxuIiwNCisgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpcnEsIHZlY3Rvcik7
DQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICBBU1NFUlQoIXRlc3RfYml0KHZl
Y3RvciwgcmV0KSk7DQorDQorICAgICAgICAgICAgICAgIHNldF9iaXQodmVjdG9yLCByZXQpOw0K
KyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gcmV0Ow0K
K30NCisNCiBpbnQgX19hc3NpZ25faXJxX3ZlY3RvcihpbnQgaXJxLCBzdHJ1Y3QgaXJxX2NmZyAq
Y2ZnLCBjb25zdCBjcHVtYXNrX3QgKm1hc2spDQogew0KICAgICAvKg0KQEAgLTM0Nyw2ICs0MjQs
NyBAQA0KICAgICBpbnQgY3B1LCBlcnI7DQogICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7DQogICAg
IGNwdW1hc2tfdCB0bXBfbWFzazsNCisgICAgdm1hc2tfdCAqaXJxX3VzZWRfdmVjdG9ycyA9IE5V
TEw7DQogDQogICAgIG9sZF92ZWN0b3IgPSBpcnFfdG9fdmVjdG9yKGlycSk7DQogICAgIGlmIChv
bGRfdmVjdG9yKSB7DQpAQCAtMzYxLDYgKzQzOSwxNyBAQA0KICAgICAgICAgcmV0dXJuIC1FQUdB
SU47DQogDQogICAgIGVyciA9IC1FTk9TUEM7DQorDQorICAgIC8qIFRoaXMgaXMgdGhlIG9ubHkg
cGxhY2Ugbm9ybWFsIElSUXMgYXJlIGV2ZXIgbWFya2VkDQorICAgICAqIGFzICJpbiB1c2UiLiAg
SWYgdGhleSdyZSBub3QgaW4gdXNlIHlldCwgY2hlY2sgdG8gc2VlDQorICAgICAqIGlmIHdlIG5l
ZWQgdG8gYXNzaWduIGEgZ2xvYmFsIHZlY3RvciBtYXNrLiAqLw0KKyAgICBpZiAoIGlycV9zdGF0
dXNbaXJxXSA9PSBJUlFfVVNFRCApDQorICAgIHsNCisgICAgICAgIGlycV91c2VkX3ZlY3RvcnMg
PSBjZmctPnVzZWRfdmVjdG9yczsNCisgICAgfQ0KKyAgICBlbHNlDQorICAgICAgICBpcnFfdXNl
ZF92ZWN0b3JzID0gaXJxX2dldF91c2VkX3ZlY3Rvcl9tYXNrKGlycSk7DQorDQogICAgIGZvcl9l
YWNoX2NwdV9tYXNrKGNwdSwgKm1hc2spIHsNCiAgICAgICAgIGludCBuZXdfY3B1Ow0KICAgICAg
ICAgaW50IHZlY3Rvciwgb2Zmc2V0Ow0KQEAgLTM4Niw2ICs0NzUsMTAgQEANCiAgICAgICAgIGlm
ICh0ZXN0X2JpdCh2ZWN0b3IsIHVzZWRfdmVjdG9ycykpDQogICAgICAgICAgICAgZ290byBuZXh0
Ow0KIA0KKyAgICAgICAgaWYgKGlycV91c2VkX3ZlY3RvcnMNCisgICAgICAgICAgICAmJiB0ZXN0
X2JpdCh2ZWN0b3IsIGlycV91c2VkX3ZlY3RvcnMpICkNCisgICAgICAgICAgICBnb3RvIG5leHQ7
DQorDQogICAgICAgICBmb3JfZWFjaF9jcHVfbWFzayhuZXdfY3B1LCB0bXBfbWFzaykNCiAgICAg
ICAgICAgICBpZiAocGVyX2NwdSh2ZWN0b3JfaXJxLCBuZXdfY3B1KVt2ZWN0b3JdICE9IC0xKQ0K
ICAgICAgICAgICAgICAgICBnb3RvIG5leHQ7DQpAQCAtNDAzLDggKzQ5NiwyMCBAQA0KICAgICAg
ICAgY3B1c19jb3B5KGNmZy0+Y3B1X21hc2ssIHRtcF9tYXNrKTsNCiANCiAgICAgICAgIGlycV9z
dGF0dXNbaXJxXSA9IElSUV9VU0VEOw0KLSAgICAgICAgICAgIGlmIChJT19BUElDX0lSUShpcnEp
KQ0KLSAgICAgICAgICAgICAgICAgICAgaXJxX3ZlY3RvcltpcnFdID0gdmVjdG9yOw0KKyAgICAg
ICAgQVNTRVJUKChjZmctPnVzZWRfdmVjdG9ycyA9PSBOVUxMKQ0KKyAgICAgICAgICAgICAgIHx8
IChjZmctPnVzZWRfdmVjdG9ycyA9PSBpcnFfdXNlZF92ZWN0b3JzKSk7DQorICAgICAgICBjZmct
PnVzZWRfdmVjdG9ycyA9IGlycV91c2VkX3ZlY3RvcnM7DQorDQorICAgICAgICBpZiAoSU9fQVBJ
Q19JUlEoaXJxKSkNCisgICAgICAgICAgICBpcnFfdmVjdG9yW2lycV0gPSB2ZWN0b3I7DQorDQor
ICAgICAgICBpZiAoIGNmZy0+dXNlZF92ZWN0b3JzICkNCisgICAgICAgIHsNCisgICAgICAgICAg
ICBBU1NFUlQoIXRlc3RfYml0KHZlY3RvciwgY2ZnLT51c2VkX3ZlY3RvcnMpKTsNCisNCisgICAg
ICAgICAgICBzZXRfYml0KHZlY3RvciwgY2ZnLT51c2VkX3ZlY3RvcnMpOw0KKyAgICAgICAgfQ0K
Kw0KICAgICAgICAgZXJyID0gMDsNCiAgICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsN
CiAgICAgICAgIGJyZWFrOw0KQEAgLTE1MDUsNyArMTYxMCw3IEBADQogDQogICAgIGlmICggIUlT
X1BSSVYoY3VycmVudC0+ZG9tYWluKSAmJg0KICAgICAgICAgICEoSVNfUFJJVl9GT1IoY3VycmVu
dC0+ZG9tYWluLCBkKSAmJg0KLSAgICAgICAgICBpcnFfYWNjZXNzX3Blcm1pdHRlZChjdXJyZW50
LT5kb21haW4sIHBpcnEpKSkNCisgICAgICAgICAgIGlycV9hY2Nlc3NfcGVybWl0dGVkKGN1cnJl
bnQtPmRvbWFpbiwgcGlycSkpKQ0KICAgICAgICAgcmV0dXJuIC1FUEVSTTsNCiANCiAgICAgaWYg
KCBwaXJxIDwgMCB8fCBwaXJxID49IGQtPm5yX3BpcnFzIHx8IGlycSA8IDAgfHwgaXJxID49IG5y
X2lycXMgKQ0KQEAgLTE1NTMsOCArMTY1OCwyMiBAQA0KIA0KICAgICAgICAgaWYgKCBkZXNjLT5o
YW5kbGVyICE9ICZub19pcnFfdHlwZSApDQogICAgICAgICAgICAgZHByaW50ayhYRU5MT0dfR19F
UlIsICJkb20lZDogaXJxICVkIGluIHVzZVxuIiwNCi0gICAgICAgICAgICAgIGQtPmRvbWFpbl9p
ZCwgaXJxKTsNCisJCSAgICBkLT5kb21haW5faWQsIGlycSk7DQogICAgICAgICBkZXNjLT5oYW5k
bGVyID0gJnBjaV9tc2lfdHlwZTsNCisNCisJaWYgKCBvcHRfaXJxX3ZlY3Rvcl9tYXAgPT0gT1BU
X0lSUV9WRUNUT1JfTUFQX1BFUkRFVg0KKyAgICAgICAgICAgICAmJiAhZGVzYy0+Y2hpcF9kYXRh
LT51c2VkX3ZlY3RvcnMgKQ0KKwl7DQorICAgICAgICAgICAgZGVzYy0+Y2hpcF9kYXRhLT51c2Vk
X3ZlY3RvcnMgPSAmcGRldi0+aW5mby51c2VkX3ZlY3RvcnM7DQorICAgICAgICAgICAgaWYgKCBk
ZXNjLT5jaGlwX2RhdGEtPnZlY3RvciAhPSBJUlFfVkVDVE9SX1VOQVNTSUdORUQgKQ0KKyAgICAg
ICAgICAgIHsNCisgICAgICAgICAgICAgICAgaW50IHZlY3RvciA9IGRlc2MtPmNoaXBfZGF0YS0+
dmVjdG9yOw0KKyAgICAgICAgICAgICAgICBBU1NFUlQoIXRlc3RfYml0KHZlY3RvciwgZGVzYy0+
Y2hpcF9kYXRhLT51c2VkX3ZlY3RvcnMpKTsNCisNCisgICAgICAgICAgICAgICAgc2V0X2JpdCh2
ZWN0b3IsIGRlc2MtPmNoaXBfZGF0YS0+dXNlZF92ZWN0b3JzKTsNCisgICAgICAgICAgICB9DQor
ICAgICAgICB9DQorDQogICAgICAgICBkLT5hcmNoLnBpcnFfaXJxW3BpcnFdID0gaXJxOw0KICAg
ICAgICAgZC0+YXJjaC5pcnFfcGlycVtpcnFdID0gcGlycTsNCiAgICAgICAgIHNldHVwX21zaV9p
cnEocGRldiwgbXNpX2Rlc2MsIGlycSk7DQpkaWZmIC1yIDlmNzYwMmUzMTI3YyBkcml2ZXJzL3Bh
c3N0aHJvdWdoL2FtZC9wY2lfYW1kX2lvbW11LmMNCi0tLSBhL2RyaXZlcnMvcGFzc3Rocm91Z2gv
YW1kL3BjaV9hbWRfaW9tbXUuYwlUaHUgT2N0IDEzIDE2OjI1OjI4IDIwMTEgLTA1MDANCisrKyBi
L2RyaXZlcnMvcGFzc3Rocm91Z2gvYW1kL3BjaV9hbWRfaW9tbXUuYwlGcmkgT2N0IDE0IDEwOjU4
OjQ0IDIwMTEgLTA1MDANCkBAIC0yNCw2ICsyNCw5IEBADQogI2luY2x1ZGUgPGFzbS9odm0vaW9t
bXUuaD4NCiAjaW5jbHVkZSA8YXNtL2FtZC1pb21tdS5oPg0KICNpbmNsdWRlIDxhc20vaHZtL3N2
bS9hbWQtaW9tbXUtcHJvdG8uaD4NCisNCitleHRlcm4gYm9vbF90IF9fcmVhZF9tb3N0bHkgb3B0
X2lycV9wZXJkZXZfdmVjdG9yX21hcDsNCitleHRlcm4gYm9vbF90IF9fcmVhZF9tb3N0bHkgaW9t
bXVfYW1kX3BlcmRldl92ZWN0b3JfbWFwOw0KIA0KIGV4dGVybiB1bnNpZ25lZCBzaG9ydCBpdnJz
X2JkZl9lbnRyaWVzOw0KIGV4dGVybiBzdHJ1Y3QgaXZyc19tYXBwaW5ncyAqaXZyc19tYXBwaW5n
czsNCkBAIC0xNjYsNiArMTY5LDM1IEBADQogICAgICAgICByZXR1cm4gLUVOT0RFVjsNCiAgICAg
fQ0KIA0KKyAgICAvKg0KKyAgICAgKiBBTUQgSU9NTVVzIGRvbid0IGRpc3Rpbmd1aXNoIGJldHdl
ZW4gdmVjdG9ycyBkZXN0aW5lZCBmb3INCisgICAgICogZGlmZmVyZW50IGNwdXMgd2hlbiBkb2lu
ZyBpbnRlcnJ1cHQgcmVtYXBwaW5nLiAgVGhpcyBtZWFucw0KKyAgICAgKiB0aGF0IGludGVycnVw
dHMgZ29pbmcgdGhyb3VnaCB0aGUgc2FtZSBpbnRyZW1hcCB0YWJsZQ0KKyAgICAgKiBjYW4ndCBz
aGFyZSB0aGUgc2FtZSB2ZWN0b3IuDQorICAgICAqDQorICAgICAqIElmIGlycV92ZWN0b3JfbWFw
IGlzbid0IHNwZWNpZmllZCwgY2hvb3NlIGEgc2Vuc2libGUgZGVmYXVsdDoNCisgICAgICogLSBJ
ZiB3ZSdyZSB1c2luZyBwZXItZGV2aWNlIGludGVyZW1hcCB0YWJsZXMsIHBlci1kZXZpY2UNCisg
ICAgICogICB2ZWN0b3Igbm9uLXNoYXJpbmcgbWFwcw0KKyAgICAgKiAtIElmIHdlJ3JlIHVzaW5n
IGEgZ2xvYmFsIGludGVyZW1hcCB0YWJsZSwgZ2xvYmFsIHZlY3Rvcg0KKyAgICAgKiAgIG5vbi1z
aGFyaW5nIG1hcA0KKyAgICAgKi8NCisgICAgaWYgKCBvcHRfaXJxX3ZlY3Rvcl9tYXAgPT0gT1BU
X0lSUV9WRUNUT1JfTUFQX0RFRkFVTFQgKQ0KKyAgICB7DQorICAgICAgICBpZiAoIGFtZF9pb21t
dV9wZXJkZXZfaW50cmVtYXAgKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHByaW50aygiQU1E
LVZpOiBFbmFibGluZyBwZXItZGV2aWNlIHZlY3RvciBtYXBzXG4iKTsNCisgICAgICAgICAgICBv
cHRfaXJxX3ZlY3Rvcl9tYXAgPSBPUFRfSVJRX1ZFQ1RPUl9NQVBfUEVSREVWOw0KKyAgICAgICAg
fQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHByaW50aygiQU1ELVZp
OiBFbmFibGluZyBnbG9iYWwgdmVjdG9yIG1hcFxuIik7DQorICAgICAgICAgICAgb3B0X2lycV92
ZWN0b3JfbWFwID0gT1BUX0lSUV9WRUNUT1JfTUFQX0dMT0JBTDsNCisgICAgICAgIH0NCisgICAg
fQ0KKyAgICBlbHNlDQorICAgIHsNCisgICAgICAgIHByaW50aygiQU1ELVZpOiBOb3Qgb3ZlcnJp
ZGluZyBpcnFfdmVjdG9yX21hcCBzZXR0aW5nXG4iKTsNCisgICAgfQ0KICAgICByZXR1cm4gc2Nh
bl9wY2lfZGV2aWNlcygpOw0KIH0NCiANCmRpZmYgLXIgOWY3NjAyZTMxMjdjIGluY2x1ZGUvYXNt
LXg4Ni9pcnEuaA0KLS0tIGEvaW5jbHVkZS9hc20teDg2L2lycS5oCVRodSBPY3QgMTMgMTY6MjU6
MjggMjAxMSAtMDUwMA0KKysrIGIvaW5jbHVkZS9hc20teDg2L2lycS5oCUZyaSBPY3QgMTQgMTA6
NTg6NDQgMjAxMSAtMDUwMA0KQEAgLTIzLDExICsyMywxNiBAQA0KICNkZWZpbmUgaXJxX3RvX2Rl
c2MoaXJxKSAgICAoJmlycV9kZXNjW2lycV0pDQogI2RlZmluZSBpcnFfY2ZnKGlycSkgICAgICAg
ICgmaXJxX2NmZ1tpcnFdKQ0KIA0KK3R5cGVkZWYgc3RydWN0IHsNCisgICAgREVDTEFSRV9CSVRN
QVAoX2JpdHMsTlJfVkVDVE9SUyk7DQorfSB2bWFza190Ow0KKw0KIHN0cnVjdCBpcnFfY2ZnIHsN
CiAgICAgICAgIGludCAgdmVjdG9yOw0KICAgICAgICAgY3B1bWFza190IGNwdV9tYXNrOw0KICAg
ICAgICAgY3B1bWFza190IG9sZF9jcHVfbWFzazsNCiAgICAgICAgIHVuc2lnbmVkIG1vdmVfY2xl
YW51cF9jb3VudDsNCisgICAgICAgIHZtYXNrX3QgKnVzZWRfdmVjdG9yczsNCiAgICAgICAgIHU4
IG1vdmVfaW5fcHJvZ3Jlc3MgOiAxOw0KIH07DQogDQpAQCAtMzksNiArNDQsMTMgQEANCiBleHRl
cm4gdTggKmlycV92ZWN0b3I7DQogDQogZXh0ZXJuIGJvb2xfdCBvcHRfbm9pcnFiYWxhbmNlOw0K
Kw0KKyNkZWZpbmUgT1BUX0lSUV9WRUNUT1JfTUFQX0RFRkFVTFQgMCAvKiBEbyB0aGUgZGVmYXVs
dCB0aGluZyAgKi8NCisjZGVmaW5lIE9QVF9JUlFfVkVDVE9SX01BUF9OT05FICAgIDEgLyogTm9u
ZSAqLyANCisjZGVmaW5lIE9QVF9JUlFfVkVDVE9SX01BUF9HTE9CQUwgIDIgLyogT25lIGdsb2Jh
bCB2ZWN0b3IgbWFwIChubyB2ZWN0b3Igc2hhcmluZykgKi8gDQorI2RlZmluZSBPUFRfSVJRX1ZF
Q1RPUl9NQVBfUEVSREVWICAzIC8qIFBlci1kZXZpY2UgdmV0b3IgbWFwIChubyB2ZWN0b3Igc2hh
cmluZyB3L2luIGEgZGV2aWNlKSAqLw0KKw0KK2V4dGVybiBpbnQgb3B0X2lycV92ZWN0b3JfbWFw
Ow0KIA0KIC8qDQogICogUGVyLWNwdSBjdXJyZW50IGZyYW1lIHBvaW50ZXIgLSB0aGUgbG9jYXRp
b24gb2YgdGhlIGxhc3QgZXhjZXB0aW9uIGZyYW1lIG9uDQpkaWZmIC1yIDlmNzYwMmUzMTI3YyBp
bmNsdWRlL3hlbi9wY2kuaA0KLS0tIGEvaW5jbHVkZS94ZW4vcGNpLmgJVGh1IE9jdCAxMyAxNjoy
NToyOCAyMDExIC0wNTAwDQorKysgYi9pbmNsdWRlL3hlbi9wY2kuaAlGcmkgT2N0IDE0IDEwOjU4
OjQ0IDIwMTEgLTA1MDANCkBAIC0xMSw2ICsxMSw3IEBADQogI2luY2x1ZGUgPHhlbi90eXBlcy5o
Pg0KICNpbmNsdWRlIDx4ZW4vbGlzdC5oPg0KICNpbmNsdWRlIDx4ZW4vc3BpbmxvY2suaD4NCisj
aW5jbHVkZSA8eGVuL2lycS5oPg0KIA0KIC8qDQogICogVGhlIFBDSSBpbnRlcmZhY2UgdHJlYXRz
IG11bHRpLWZ1bmN0aW9uIGRldmljZXMgYXMgaW5kZXBlbmRlbnQNCkBAIC0zOCw2ICszOSw3IEBA
DQogICAgICAgICB1OCBidXM7DQogICAgICAgICB1OCBkZXZmbjsNCiAgICAgfSBwaHlzZm47DQor
ICAgdm1hc2tfdCB1c2VkX3ZlY3RvcnM7IA0KIH07DQogDQogc3RydWN0IHBjaV9kZXYgew0K

--_002_EE335F95F28A664DB4A21289D2AA053B01E6CBBD30SAUSEXMBP01am_
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_EE335F95F28A664DB4A21289D2AA053B01E6CBBD30SAUSEXMBP01am_--


From xen-devel-bounces@lists.xensource.com Wed Oct 19 12:03:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 12:03:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGbQA-0004DI-Cg; Wed, 19 Oct 2011 12:03:22 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGbMJ-0003tC-1N
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 11:59:57 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-5.tower-216.messagelabs.com!1319050757!295994!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30017 invoked from network); 19 Oct 2011 18:59:19 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-5.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 18:59:19 -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
	p9JIx4kB004791; Wed, 19 Oct 2011 11:59:04 -0700
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id p9JIx4Kt004788;
	Wed, 19 Oct 2011 11:59:04 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1319050206@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Wed, 19 Oct 2011 11:50:06 -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 V4] 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.

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

From xen-devel-bounces@lists.xensource.com Wed Oct 19 12:05:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 12:05:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGbST-0004eN-Tx; Wed, 19 Oct 2011 12:05:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGbMJ-0003tD-1M
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 11:59:57 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-7.tower-21.messagelabs.com!1319050758!892310!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12837 invoked from network); 19 Oct 2011 18:59:19 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 18:59:19 -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
	p9JIx4wI004805; Wed, 19 Oct 2011 11:59:04 -0700
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id p9JIx4Ib004802;
	Wed, 19 Oct 2011 11:59:04 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c043f91da30401c96c1e7aeca40645fc8afde5bb
Message-Id: <c043f91da30401c96c1e.1319050208@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1319050206@athos.nss.cs.ubc.ca>
References: <patchbomb.1319050206@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Wed, 19 Oct 2011 11:50:08 -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 V4] 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 1319049481 25200
# Node ID c043f91da30401c96c1e7aeca40645fc8afde5bb
# Parent  64d6b8a65a7ed4939fef93d44ea5199efc9c127a
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 64d6b8a65a7e -r c043f91da304 tools/python/xen/lowlevel/checkpoint/checkpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Wed Oct 19 11:36:07 2011 -0700
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.c	Wed Oct 19 11:38:01 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 64d6b8a65a7e -r c043f91da304 tools/python/xen/lowlevel/checkpoint/checkpoint.h
--- a/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Wed Oct 19 11:36:07 2011 -0700
+++ b/tools/python/xen/lowlevel/checkpoint/checkpoint.h	Wed Oct 19 11:38:01 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 64d6b8a65a7e -r c043f91da304 tools/python/xen/lowlevel/checkpoint/libcheckpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Wed Oct 19 11:36:07 2011 -0700
+++ b/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c	Wed Oct 19 11:38:01 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 64d6b8a65a7e -r c043f91da304 tools/python/xen/remus/save.py
--- a/tools/python/xen/remus/save.py	Wed Oct 19 11:36:07 2011 -0700
+++ b/tools/python/xen/remus/save.py	Wed Oct 19 11:38:01 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 64d6b8a65a7e -r c043f91da304 tools/remus/remus
--- a/tools/remus/remus	Wed Oct 19 11:36:07 2011 -0700
+++ b/tools/remus/remus	Wed Oct 19 11:38:01 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 Wed Oct 19 12:08:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 12:08:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGbVK-00053Q-DT; Wed, 19 Oct 2011 12:08:42 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGbMK-0003tP-BK
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 12:00:03 -0700
X-Env-Sender: rshriram@cs.ubc.ca
X-Msg-Ref: server-4.tower-182.messagelabs.com!1319050758!45361!1
X-Originating-IP: [198.162.52.240]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17515 invoked from network); 19 Oct 2011 18:59:20 -0000
Received: from unknown (HELO athos.nss.cs.ubc.ca) (198.162.52.240)
	by server-4.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	19 Oct 2011 18:59: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
	p9JIx4md004798; Wed, 19 Oct 2011 11:59:04 -0700
Received: (from root@localhost)
	by athos.nss.cs.ubc.ca (8.14.3/8.14.3/Submit) id p9JIx417004795;
	Wed, 19 Oct 2011 11:59:04 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 64d6b8a65a7ed4939fef93d44ea5199efc9c127a
Message-Id: <64d6b8a65a7ed4939fef.1319050207@athos.nss.cs.ubc.ca>
In-Reply-To: <patchbomb.1319050206@athos.nss.cs.ubc.ca>
References: <patchbomb.1319050206@athos.nss.cs.ubc.ca>
User-Agent: Mercurial-patchbomb/1.4.3
Date: Wed, 19 Oct 2011 11:50:07 -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 V4] 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 1319049367 25200
# Node ID 64d6b8a65a7ed4939fef93d44ea5199efc9c127a
# 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 64d6b8a65a7e tools/libxc/Makefile
--- a/tools/libxc/Makefile	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/Makefile	Wed Oct 19 11:36:07 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 64d6b8a65a7e tools/libxc/xc_compression.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxc/xc_compression.c	Wed Oct 19 11:36:07 2011 -0700
@@ -0,0 +1,551 @@
+/******************************************************************************
+ * 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));
+
+    if (posix_memalign((void **)&ctx->inputbuf,
+                       XC_PAGE_SIZE, PAGE_BUFFER_SIZE))
+    {
+        ERROR("Failed to allocate page buffer\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));
+
+    if (posix_memalign((void **)&ctx->cache_base,
+                       XC_PAGE_SIZE, DELTA_CACHE_SIZE))
+    {
+        ERROR("Failed to allocate delta cache\n");
+        goto error;
+    }
+
+    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 64d6b8a65a7e 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	Wed Oct 19 11:36:07 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 64d6b8a65a7e 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	Wed Oct 19 11:36:07 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 64d6b8a65a7e tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/xenctrl.h	Wed Oct 19 11:36:07 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 64d6b8a65a7e tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h	Tue Oct 11 12:02:58 2011 +0100
+++ b/tools/libxc/xenguest.h	Wed Oct 19 11:36:07 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 64d6b8a65a7e 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	Wed Oct 19 11:36:07 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 Wed Oct 19 13:41:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 13:41:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGcwr-00007D-QL; Wed, 19 Oct 2011 13:41:14 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGcvu-0008M7-Dk
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 13:40:14 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319056811!863515!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29354 invoked from network); 19 Oct 2011 20:40:11 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-11.tower-21.messagelabs.com with SMTP;
	19 Oct 2011 20:40:11 -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 DD17FC560FE;
	Wed, 19 Oct 2011 21:40:09 +0100 (BST)
Date: Wed, 19 Oct 2011 21:40:08 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] Compilation problems: oldstyle/xenlinux	2.6.38,
	blktap2
Message-ID: <9F7D19DACCC3B803FCE8C1DB@nimrod.local>
In-Reply-To: <4E9E988C020000780005C1BC@nat28.tlf.novell.com>
References: <DFC59CD6B72571D62D342F37@Ximines.local>
	<4E9E988C020000780005C1BC@nat28.tlf.novell.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>
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

Jan,

--On 19 October 2011 08:29:48 +0100 Jan Beulich <JBeulich@suse.com> wrote:

>>>> On 18.10.11 at 20:57, Alex Bligh <alex@alex.org.uk> wrote:
>> As far as I can tell from the Makefile, both directories are always
>> built:
>>
>>   obj-$(CONFIG_XEN_BLKDEV_TAP2)           += blktap2/ blktap2-new/
>>
>> What's the difference between blktap2 and blktap2-new? Should only
>> one be built? I can't see a config option that switches between them.
>
> Yeah, assuming he (as always) just took our patches, the this isn't
> meant to be used with CONFIG_XEN_BLKDEV_TAP2=y (which we
> never do). Setting it to =m will get you going. I'll see if I can adjust
> this (but only in the current patch sets) so that it won't end up trying
> to build both into the kernel.

Thanks.

Apologies in advance that this email contains several no doubt
stupid questions:

Stupid question #1: I take it that "our patches" means SUSE's? Is there a 
git tree I can pull patches from rebased against something modern (e.g. 
2.6.38)? What I'm doing is creating a kernel based on Ubuntu Natty, and I 
currently have it working with one great blob of Xen patches, rather than 
the original git paches which would be better.

I'm quite happy to publish the tree if that's useful to people, but
I get the feeling it would be more useful if it had the original commits
rather than them squashed together in one blob. I've got to the stage
of it compiling fine (+/- blktap2), packaging fine, but untested.

> Under the same assumption - the difference between the two is that
> -new is what is in the pv-ops kernel (but not upstream), while the
> other is the forward port from the 2.6.18 tree.

Stupid question #2: so, if I'm running with Xen 3.3.x, it won't use
any of the pvops stuff. Will a xenlinux/oldstyle kernel ever use
any of the pvops stuff? If blktap2 is compiled as a module, how does
it know which module to load (blktap2 or blktap2-new) apart from
manual insmod?

>> I know one option is to just build blktap instead and ignore blktap2.
>> If I want to run this as a dom0 for Xen 3.3, will I lose anything
>> by not having blktap2?
>
> Quite obviously your kernel will lack support for any of the tap2:
> protocols.

Stupid question #3: If this kernel is running as dom0 for 3.3.x,
would it use any of the blktap2 stuff anyway? I'm working from
memory here but didn't that come after 3.3.1? And if I'm wrong, aren't
I going to want to build blktap2 (presumably not -new) as a built-in
(i.e. "y")? Perhaps I'm missing what tap2 does vs. tap.

-- 
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 Oct 19 15:00:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:00:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGeBU-0003ke-6B; Wed, 19 Oct 2011 15:00:24 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGeAa-0003YB-5H
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 14:59:28 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-10.tower-21.messagelabs.com!1319061564!869217!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19925 invoked from network); 19 Oct 2011 21:59:24 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-10.tower-21.messagelabs.com with SMTP;
	19 Oct 2011 21:59:24 -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
	p9JLxN2U013326; Wed, 19 Oct 2011 21:59:23 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 p9JLxNc2030732; 
	Wed, 19 Oct 2011 17:59:23 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Wed, 19 Oct 2011 17:59:37 -0400
Message-Id: <1319061577-25190-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/balloon: Avoid OOM when requesting highmem
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 highmem pages are requested from the balloon on a system without
highmem, the implementation of alloc_xenballooned_pages will allocate
all available memory trying to find highmem pages to return. Allow
low memory to be returned when highmem pages are requested to avoid
this loop.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/balloon.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index d01944e..1a23033 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -500,7 +500,7 @@ EXPORT_SYMBOL_GPL(balloon_set_new_target);
  * alloc_xenballooned_pages - get pages that have been ballooned out
  * @nr_pages: Number of pages to get
  * @pages: pages returned
- * @highmem: highmem or lowmem pages
+ * @highmem: allow highmem pages
  * @return 0 on success, error otherwise
  */
 int alloc_xenballooned_pages(int nr_pages, struct page **pages, bool highmem)
@@ -510,7 +510,7 @@ int alloc_xenballooned_pages(int nr_pages, struct page **pages, bool highmem)
 	mutex_lock(&balloon_mutex);
 	while (pgno < nr_pages) {
 		page = balloon_retrieve(highmem);
-		if (page && PageHighMem(page) == highmem) {
+		if (page && (highmem || !PageHighMem(page))) {
 			pages[pgno++] = page;
 		} else {
 			enum bp_state st;
-- 
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 Oct 19 15:05:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15: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 1RGeGn-0004C8-13; Wed, 19 Oct 2011 15:05:53 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGeGF-00040B-WE
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:05:20 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319061891!49846488!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25508 invoked from network); 19 Oct 2011 22:04:51 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-5.tower-27.messagelabs.com with SMTP;
	19 Oct 2011 22:04:51 -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
	p9JM5DtF029619; Wed, 19 Oct 2011 22:05:13 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 p9JM5Cxa031143; 
	Wed, 19 Oct 2011 18:05:12 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Wed, 19 Oct 2011 18:05:27 -0400
Message-Id: <1319061927-5967-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,
	stefano.stabellini@eu.citrix.com
Subject: [Xen-devel] [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

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>
---
 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

From xen-devel-bounces@lists.xensource.com Wed Oct 19 15:20:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:20:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGeVC-0004qc-AP; Wed, 19 Oct 2011 15:20:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUR-0004d3-2X
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:19:59 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1319062775!47406579!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11160 invoked from network); 19 Oct 2011 22:19:36 -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; 19 Oct 2011 22:19:36 -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
	p9JMJp6D023649
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19:52 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
	p9JMJnG8007713
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:19:50 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
	p9JMJipo032644; Wed, 19 Oct 2011 17:19:44 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:44 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id B6209828A2; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:31 -0400
Message-Id: <1319062772-2793-11-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-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.0A020209.4E9F4D09.0088:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Francisco Jerez <currojerez@riseup.net>, xen-devel@lists.xensource.com,
	j.glisse@redhat.com, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	bskeggs@redhat.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>
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 Wed Oct 19 15:21:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:21:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGeWI-0005EH-Bb; Wed, 19 Oct 2011 15:21:55 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUR-0004d2-1t
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:19:59 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1319062794!899657!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13247 invoked from network); 19 Oct 2011 22:19:55 -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; 19 Oct 2011 22:19:55 -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
	p9JMJp3S023657
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19:53 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
	p9JMJpAm002372
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:19:51 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
	p9JMJjN6002228; Wed, 19 Oct 2011 17:19:45 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:45 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id A9997828A1; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:30 -0400
Message-Id: <1319062772-2793-10-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-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.0A020209.4E9F4D09.0108:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, j.glisse@redhat.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, bskeggs@redhat.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.

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 d6d8240..a5be62e 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)
@@ -1384,7 +1388,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 Wed Oct 19 15:22:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:22:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGeXF-0005c2-KL; Wed, 19 Oct 2011 15:22:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUR-0004d6-9z
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:19:59 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1319062794!304950!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4457 invoked from network); 19 Oct 2011 22:19:56 -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; 19 Oct 2011 22:19:56 -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
	p9JMJpxd027210
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19:53 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
	p9JMBoBT015554
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:11:50 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
	p9JMJj5K026084; Wed, 19 Oct 2011 17:19:45 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:45 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 42C1482894; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:21 -0400
Message-Id: <1319062772-2793-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.0A090207.4E9F4D09.00E3,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, j.glisse@redhat.com, bskeggs@redhat.com
Subject: [Xen-devel] [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

[.. 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:

 git://oss.oracle.com/git/kwilk/xen.git devel/ttm.dma_pool.v2.1


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  | 1446 +++++++++++++++++++++++++++++
 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, 1637 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 Wed Oct 19 15:23:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:23:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGeYC-0005yz-Ue; Wed, 19 Oct 2011 15:23:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUR-0004d7-DW
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:19:59 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319062763!59930333!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14902 invoked from network); 19 Oct 2011 22:19:25 -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; 19 Oct 2011 22:19:25 -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
	p9JMJp3T027205
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19: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
	p9JMJopK002365
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:19:50 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
	p9JMJjxv032656; Wed, 19 Oct 2011 17:19:45 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:45 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 562E28289A; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:23 -0400
Message-Id: <1319062772-2793-3-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-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.0A090205.4E9F4D09.00D9:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, j.glisse@redhat.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, bskeggs@redhat.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.

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 Wed Oct 19 15:24:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:24:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGeZH-0006MV-Az; Wed, 19 Oct 2011 15:24:59 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUR-0004d5-A4
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:19:59 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319062794!898136!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4395 invoked from network); 19 Oct 2011 22:19:56 -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; 19 Oct 2011 22:19:56 -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
	p9JMJpMX027204
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19:53 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
	p9JMBoWs015550
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:11:50 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
	p9JMJjQr032650; Wed, 19 Oct 2011 17:19:45 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:45 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 609628289B; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:24 -0400
Message-Id: <1319062772-2793-4-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090208.4E9F4D09.00D0,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, j.glisse@redhat.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, bskeggs@redhat.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.

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 Wed Oct 19 15:25:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:25:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGeaA-0006jx-Oi; Wed, 19 Oct 2011 15:25:54 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUR-0004d8-GF
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:19:59 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319062794!59496!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1349 invoked from network); 19 Oct 2011 22:19:56 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-12.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	19 Oct 2011 22:19:56 -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
	p9JMJp5k027207
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19:53 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
	p9JMJonp007728
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:19:51 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
	p9JMJjtL026089; Wed, 19 Oct 2011 17:19:45 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:45 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 90E8A8289F; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:28 -0400
Message-Id: <1319062772-2793-8-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-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.4E9F4D09.00C9:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, j.glisse@redhat.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, bskeggs@redhat.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 the ttm_tt_free_allocated_pages
whether to clear the pages or not (you are not suppose to clear the pages
when destroying them).

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 Wed Oct 19 15:26:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:26:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGeay-00076u-5k; Wed, 19 Oct 2011 15:26:44 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUR-0004dA-S2
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:20:00 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319062795!35997450!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20212 invoked from network); 19 Oct 2011 22:19:56 -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; 19 Oct 2011 22:19:56 -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
	p9JMJp1K023658
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19:53 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
	p9JMBooa015567
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:11:51 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
	p9JMJjii026098; Wed, 19 Oct 2011 17:19:45 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:45 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 77AB28289D; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:26 -0400
Message-Id: <1319062772-2793-6-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A020208.4E9F4D0A.008A,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, j.glisse@redhat.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, bskeggs@redhat.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.

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 Wed Oct 19 15:27:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:27:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGebp-0007Ua-Ko; Wed, 19 Oct 2011 15:27:37 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUR-0004d4-8x
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:19:59 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1319062794!308027!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23391 invoked from network); 19 Oct 2011 22:19:56 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 22:19:56 -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
	p9JMJpBI023652
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19:53 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
	p9JMBo0S015551
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:11:50 GMT
Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9JMJiOb002222; Wed, 19 Oct 2011 17:19:44 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:44 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 6C4DB8289C; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:25 -0400
Message-Id: <1319062772-2793-5-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A02020B.4E9F4D09.00C7,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, j.glisse@redhat.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, bskeggs@redhat.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).

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 Wed Oct 19 15:28:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15: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 1RGecn-0007sU-NY; Wed, 19 Oct 2011 15:28:37 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUR-0004dB-S8
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:20:00 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1319062795!54342!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5866 invoked from network); 19 Oct 2011 22:19:56 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-10.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	19 Oct 2011 22:19:56 -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
	p9JMJp4j027203
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19:52 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
	p9JM7gIK027925
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:07:43 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
	p9JMJiXX032645; Wed, 19 Oct 2011 17:19:44 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:44 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id C00AB828A3; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:32 -0400
Message-Id: <1319062772-2793-12-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090208.4E9F4D09.00E0,ss=1,re=0.000,fgs=0
Cc: Alex Deucher <alexdeucher@gmail.com>, xen-devel@lists.xensource.com,
	j.glisse@redhat.com, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	bskeggs@redhat.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>
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 Wed Oct 19 15:29:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:29:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGedp-0008Fi-Lx; Wed, 19 Oct 2011 15:29:41 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUR-0004d9-Qi
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:20:00 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319062795!35962825!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26544 invoked from network); 19 Oct 2011 22:19:56 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-2.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 22:19:56 -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
	p9JMJpQl027206
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19:53 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
	p9JMBocd015552
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:11:50 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
	p9JMJiPU002219; Wed, 19 Oct 2011 17:19:44 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:44 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 841368289E; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:27 -0400
Message-Id: <1319062772-2793-7-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090205.4E9F4D09.00EA,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, j.glisse@redhat.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, bskeggs@redhat.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.

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 Wed Oct 19 15:30:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:30:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGeep-0000Bq-Vx; Wed, 19 Oct 2011 15:30:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUR-0004dC-RE
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:20:01 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1319062780!45000784!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14949 invoked from network); 19 Oct 2011 22:19:41 -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; 19 Oct 2011 22:19: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
	p9JMJqlX023659
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19:53 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
	p9JMJp74002379
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:19:51 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
	p9JMJjun002231; Wed, 19 Oct 2011 17:19:46 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:45 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 9CFC9828A0; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:29 -0400
Message-Id: <1319062772-2793-9-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-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: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A02020B.4E9F4D0A.00AF:SCFMA922111,ss=1,re=-6.601,fgs=0
Cc: xen-devel@lists.xensource.com, j.glisse@redhat.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, bskeggs@redhat.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.]
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 :=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..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 "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);
+	d_page->p =3D virt_to_page(d_page->vaddr);
+	if (!d_page->vaddr) {
+		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. */
+	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 Wed Oct 19 15:32:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:32:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGegJ-0000mX-Uz; Wed, 19 Oct 2011 15:32:15 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGeUU-0004dk-MX
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:20:03 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1319062778!47406581!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11192 invoked from network); 19 Oct 2011 22:19:40 -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; 19 Oct 2011 22:19:40 -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
	p9JMJq9c027227
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 19 Oct 2011 22:19:54 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
	p9JMJpWF007761
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 19 Oct 2011 22:19:52 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
	p9JMJjDh032662; Wed, 19 Oct 2011 17:19:45 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 15:19:45 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 4B8B182893; Wed, 19 Oct 2011 18:19:33 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Date: Wed, 19 Oct 2011 18:19:22 -0400
Message-Id: <1319062772-2793-2-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-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.4E9F4D0B.005D:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>,
	xen-devel@lists.xensource.com, j.glisse@redhat.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, bskeggs@redhat.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.

CC: 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 Wed Oct 19 15:33:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 15:33:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGehM-0001Ft-Ed; Wed, 19 Oct 2011 15:33:20 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGeVX-0004wZ-NH
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 15:21:08 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1319062863!309105!1
X-Originating-IP: [192.55.52.88]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22478 invoked from network); 19 Oct 2011 22:21:04 -0000
Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88)
	by server-5.tower-216.messagelabs.com with SMTP;
	19 Oct 2011 22:21:04 -0000
Received: from fmsmga002.fm.intel.com ([10.253.24.26])
	by fmsmga101.fm.intel.com with ESMTP; 19 Oct 2011 15:21:03 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,374,1315206000"; d="scan'208";a="79803733"
Received: from orsmsx603.amr.corp.intel.com ([10.22.226.49])
	by fmsmga002.fm.intel.com with ESMTP; 19 Oct 2011 15:21:03 -0700
Received: from orsmsx605.amr.corp.intel.com (10.22.226.10) by
	orsmsx603.amr.corp.intel.com (10.22.226.49) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Wed, 19 Oct 2011 15:21:02 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx605.amr.corp.intel.com ([10.22.226.10]) with mapi;
	Wed, 19 Oct 2011 15:21:01 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Wed, 19 Oct 2011 15:20:59 -0700
Thread-Topic: Resend: RE: enable_ats_device() call site
Thread-Index: AcyOKwBn9n9P5TqVRA2amnajlAnpiQAfFTgg
Message-ID: <987664A83D2D224EAE907B061CE93D5301F1D86476@orsmsx505.amr.corp.intel.com>
References: <4E4E48360200007800051F65@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B5E@orsmsx505.amr.corp.intel.com>
	<4E8EC8A80200007800059E3B@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE70A446@orsmsx505.amr.corp.intel.com>
	<4E9458A5020000780005AB99@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301F19DB855@orsmsx505.amr.corp.intel.com>
	<4E9E8EA1020000780005C155@nat28.tlf.novell.com>
In-Reply-To: <4E9E8EA1020000780005C155@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: "Tian, Kevin" <kevin.tian@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Shan, Haitao" <haitao.shan@intel.com>, "Dugger,
	Donald D" <donald.d.dugger@intel.com>
Subject: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 reckon that the availability of device specifications in the ATSR data =
structure must be there for a purpose.
> If that's not correct, then I'll certainly remove that code again, but I'=
d like to understand what that data is meant
> to be for in that case.

The atsr leverages the same PCI device scope is used for drhd and rmrr so d=
evice and function comes along with bus number.  As far as I can tell, we o=
nly  need to check the bus number for atsr.

> Since enabling ATS on an already enabled device doesn't do any harm accor=
ding to how enable_ats_device() is
> implemented I can't see any bad in doing so. If there is, then we're back=
 to square one where I was asking you how
> to properly do ATS enabling given the described MMCFG restriction.

Yes, there should be no harm enabling ACS or ATS multiple times.  It would =
be good tested out to make sure though.

> Either we don't need to call it at all during discovery (which I doubt, s=
ince when the device is in use by Dom0, I
> suppose having ATS enabled is still desirable or even required), or we ha=
ve to potentially do it twice (remember
> that older Dom0 kernels may fail to report all PCI devices to the hypervi=
sor).

I see, calling enable_ats_device() in pci_add_device() will also solve the =
case where MMCFG might not work until after dom0 is initialized.

As I mentioned before, our QA team doesn't test ATS and ACS regularly.  It =
would good if you can coordinate with our QA team to test out these changes=
 to make sure they don't break any ACS and ATS functionality.

Allen


-----Original Message-----
From: Jan Beulich [mailto:JBeulich@suse.com]=20
Sent: Tuesday, October 18, 2011 11:47 PM
To: Kay, Allen M
Cc: Dugger, Donald D; Shan, Haitao; Tian, Kevin; xen-devel@lists.xensource.=
com
Subject: RE: Resend: RE: enable_ats_device() call site

>>> On 19.10.11 at 00:46, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
> Sorry for the late reply, I was trying to close something on another=20
> project.  I have the following questions on the patches after=20
> reviewing the
> paches:
>=20
> 1) In acpi_find_matched_atsr_unit(), you added following code.  The=20
> original code only tries to match the bus number.  What is the purpose=20
> of this new additional code? Does it fix a problem on one of your systems=
?
>=20
> +        for ( i =3D 0; i < atsr->scope.devices_cnt; ++i )
> +            if ( atsr->scope.devices[i] =3D=3D bdf )
> +                return atsr;

I reckon that the availability of device specifications in the ATSR data st=
ructure must be there for a purpose. If that's not correct, then I'll certa=
inly remove that code again, but I'd like to understand what that data is m=
eant to be for in that case.

> 2)  In pci_add_device() function, the original code calls=20
> pci_enable_acs() only if pdev->domain is not set.  The new code calls=20
> pci_enable_acs() unconditionally, potentially more than once?  What is=20
> the reason for the change?

That's the whole purpose of the change, so just to repeat: MMCFG accesses m=
ay not be possible at scan_pci_devices() time for some or all segments/buss=
es. Hence enabling ATS may simply be impossible at that point, and must be =
attempted a second time after Dom0 reported whether using MMCFG is safe.

Since enabling ATS on an already enabled device doesn't do any harm accordi=
ng to how enable_ats_device() is implemented I can't see any bad in doing s=
o. If there is, then we're back to square one where I was asking you how to=
 properly do ATS enabling given the described MMCFG restriction.

> 3) In the same pci_add_device() function, the new code now also calls
> iommu_enable_device() which currently calls enable_ats_device().  This=20
> means the new code will enable ATS as it is being discovered by the platf=
orm.
> However, I did not see any code that removing enable_ats_device() call=20
> in domain_context_mapping().  Is this the intention?  If so, what is the =
reason?

You were telling me that this needs to be re-done after FLR, and hence has =
to remain there.

>  I see the reason the original code is still needed but I don't see=20
> why we need to call enable_ats_device() during platform device=20
> discovery since the enabling bit will get cleared by FLR.

Either we don't need to call it at all during discovery (which I doubt, sin=
ce when the device is in use by Dom0, I suppose having ATS enabled is still=
 desirable or even required), or we have to potentially do it twice (rememb=
er that older Dom0 kernels may fail to report all PCI devices to the hyperv=
isor).

Jan

> Allen
>=20
>=20
> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]
> Sent: Tuesday, October 11, 2011 5:54 AM
> To: Kay, Allen M
> Cc: xen-devel@lists.xensource.com
> Subject: RE: Resend: RE: enable_ats_device() call site
>=20
>>>> On 08.10.11 at 04:09, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
>>> For which I'd like to understand why this is being done in the=20
>>> places it is
>> now
>>>(not the least why this is done in VT-d specific code in the first place=
).
>>=20
>> The reason it is call by reassign_device_ownership() is because FLR=20
>> clears ATS enabling bit on the device - I forgot about it when I=20
>> wrote the last email so we still need to re-enable ATS on the device=20
>> for each
> device assignment.
>> To summarize:
>>=20
>> 1) Reason for difference in ATS and ACS handling
>>     a. ATS capability is in the PCIe endpoint - enabling bit is=20
>> cleared by device FLR on the passthrough device.
>>     b. ACS capability is in the PCIe switch - not affected by FLR on=20
>> the passthrough device.
>>=20
>> 2) ATS enabling requirement
>>     a. VT-d engine serving the device has to be ATS capable.
>>     b. device has to be ATS capable
>=20
> Okay, so how about the below then (with an attached prerequisite=20
> cleanup patch)?
>=20
> Jan
>=20
> --- 2011-09-20.orig/xen/drivers/passthrough/iommu.c
> +++ 2011-09-20/xen/drivers/passthrough/iommu.c
> @@ -150,6 +150,23 @@ int iommu_add_device(struct pci_dev *pde
>      return hd->platform_ops->add_device(pdev);
>  }
> =20
> +int iommu_enable_device(struct pci_dev *pdev) {
> +    struct hvm_iommu *hd;
> +
> +    if ( !pdev->domain )
> +        return -EINVAL;
> +
> +    ASSERT(spin_is_locked(&pcidevs_lock));
> +
> +    hd =3D domain_hvm_iommu(pdev->domain);
> +    if ( !iommu_enabled || !hd->platform_ops ||
> +         !hd->platform_ops->enable_device )
> +        return 0;
> +
> +    return hd->platform_ops->enable_device(pdev);
> +}
> +
>  int iommu_remove_device(struct pci_dev *pdev)  {
>      struct hvm_iommu *hd;
> --- 2011-09-20.orig/xen/drivers/passthrough/pci.c
> +++ 2011-09-20/xen/drivers/passthrough/pci.c
> @@ -258,7 +258,7 @@ struct pci_dev *pci_get_pdev_by_domain(
>   * pci_enable_acs - enable ACS if hardware support it
>   * @dev: the PCI device
>   */
> -void pci_enable_acs(struct pci_dev *pdev)
> +static void pci_enable_acs(struct pci_dev *pdev)
>  {
>      int pos;
>      u16 cap, ctrl, seg =3D pdev->seg;
> @@ -409,8 +409,11 @@ int pci_add_device(u16 seg, u8 bus, u8 d
>          }
> =20
>          list_add(&pdev->domain_list, &dom0->arch.pdev_list);
> -        pci_enable_acs(pdev);
>      }
> +    else
> +        iommu_enable_device(pdev);
> +
> +    pci_enable_acs(pdev);
> =20
>  out:
>      spin_unlock(&pcidevs_lock);
> --- 2011-09-20.orig/xen/drivers/passthrough/vtd/iommu.c
> +++ 2011-09-20/xen/drivers/passthrough/vtd/iommu.c
> @@ -1901,6 +1901,19 @@ static int intel_iommu_add_device(struct
>      return ret;
>  }
> =20
> +static int intel_iommu_enable_device(struct pci_dev *pdev) {
> +    struct acpi_drhd_unit *drhd =3D acpi_find_matched_drhd_unit(pdev);
> +    int ret =3D drhd ? ats_device(pdev, drhd) : -ENODEV;
> +
> +    if ( ret <=3D 0 )
> +        return ret;
> +
> +    ret =3D enable_ats_device(pdev->seg, pdev->bus, pdev->devfn);
> +
> +    return ret >=3D 0 ? 0 : ret;
> +}
> +
>  static int intel_iommu_remove_device(struct pci_dev *pdev)  {
>      struct acpi_rmrr_unit *rmrr;
> @@ -1931,7 +1944,6 @@ static int intel_iommu_remove_device(str  static=20
> void __init setup_dom0_device(struct pci_dev *pdev)  {
>      domain_context_mapping(pdev->domain, pdev->seg, pdev->bus, pdev->dev=
fn);
> -    pci_enable_acs(pdev);
>      pci_vtd_quirk(pdev);
>  }
> =20
> @@ -2302,6 +2314,7 @@ const struct iommu_ops intel_iommu_ops =3D
>      .init =3D intel_iommu_domain_init,
>      .dom0_init =3D intel_iommu_dom0_init,
>      .add_device =3D intel_iommu_add_device,
> +    .enable_device =3D intel_iommu_enable_device,
>      .remove_device =3D intel_iommu_remove_device,
>      .assign_device  =3D intel_iommu_assign_device,
>      .teardown =3D iommu_domain_teardown,
> --- 2011-09-20.orig/xen/include/xen/iommu.h
> +++ 2011-09-20/xen/include/xen/iommu.h
> @@ -70,6 +70,7 @@ int iommu_enable_x2apic_IR(void);  void=20
> iommu_disable_x2apic_IR(void);
> =20
>  int iommu_add_device(struct pci_dev *pdev);
> +int iommu_enable_device(struct pci_dev *pdev);
>  int iommu_remove_device(struct pci_dev *pdev);  int=20
> iommu_domain_init(struct domain *d);  void iommu_dom0_init(struct=20
> domain *d); @@ -120,6 +121,7 @@ struct iommu_ops {
>      int (*init)(struct domain *d);
>      void (*dom0_init)(struct domain *d);
>      int (*add_device)(struct pci_dev *pdev);
> +    int (*enable_device)(struct pci_dev *pdev);
>      int (*remove_device)(struct pci_dev *pdev);
>      int (*assign_device)(struct domain *d, u16 seg, u8 bus, u8 devfn);
>      void (*teardown)(struct domain *d);
> --- 2011-09-20.orig/xen/include/xen/pci.h
> +++ 2011-09-20/xen/include/xen/pci.h
> @@ -134,6 +134,5 @@ struct pirq;
>  int msixtbl_pt_register(struct domain *, struct pirq *, uint64_t=20
> gtable); void msixtbl_pt_unregister(struct domain *, struct pirq *); =20
> void msixtbl_pt_cleanup(struct domain *d); -void pci_enable_acs(struct=20
> pci_dev *pdev);
> =20
>  #endif /* __XEN_PCI_H__ */



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 16:06:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 16:06:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGfDV-0003fJ-VP; Wed, 19 Oct 2011 16:06:34 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGfA3-0003Or-8S
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 16:03:02 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319065375!868287!1
X-Originating-IP: [129.234.248.2]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2011 invoked from network); 19 Oct 2011 23:02:56 -0000
Received: from hermes2.dur.ac.uk (HELO hermes2.dur.ac.uk) (129.234.248.2)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 23:02:56 -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 p9JN2bIc011407;
	Thu, 20 Oct 2011 00:02:41 +0100
Received: from vega-a.dur.ac.uk (vega-a.dur.ac.uk [129.234.250.133])
	by smtphost3.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JN2Lgc013628
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 00:02:21 +0100
Received: from vega-a.dur.ac.uk (localhost [127.0.0.1])
	by vega-a.dur.ac.uk (8.14.3/8.11.1) with ESMTP id p9JN2LUt018031;
	Thu, 20 Oct 2011 00:02:21 +0100
Received: from localhost (dcl0may@localhost)
	by vega-a.dur.ac.uk (8.14.3/8.14.3/Submit) with ESMTP id p9JN2LR5018027;
	Thu, 20 Oct 2011 00:02:21 +0100
Date: Thu, 20 Oct 2011 00:02:21 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: xen-devel@lists.xensource.com
Message-ID: <alpine.DEB.2.00.1110192358140.15667@vega-a.dur.ac.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9JN2bIc011407
Cc: Ian Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] [PATCH 0 of 6] pygrub fixes to support a Fedora 16 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

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
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 16:12:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 16:12:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGfIp-0004nj-Ap; Wed, 19 Oct 2011 16:12:03 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGfBM-0003Qg-Gy
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 16:04:21 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319065457!900662!1
X-Originating-IP: [129.234.248.1]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11206 invoked from network); 19 Oct 2011 23:04:17 -0000
Received: from hermes1.dur.ac.uk (HELO hermes1.dur.ac.uk) (129.234.248.1)
	by server-5.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 23:04:17 -0000
Received: from smtphost4.dur.ac.uk (smtphost4.dur.ac.uk [129.234.252.4])
	by hermes1.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JN3wwd023195;
	Thu, 20 Oct 2011 00:04:02 +0100
Received: from vega-a.dur.ac.uk (vega-a.dur.ac.uk [129.234.250.133])
	by smtphost4.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JN3ijf026353
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 00:03:44 +0100
Received: from vega-a.dur.ac.uk (localhost [127.0.0.1])
	by vega-a.dur.ac.uk (8.14.3/8.11.1) with ESMTP id p9JN3i0o018144;
	Thu, 20 Oct 2011 00:03:44 +0100
Received: from localhost (dcl0may@localhost)
	by vega-a.dur.ac.uk (8.14.3/8.14.3/Submit) with ESMTP id p9JN3iKq018140;
	Thu, 20 Oct 2011 00:03:44 +0100
Date: Thu, 20 Oct 2011 00:03:41 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: xen-devel@lists.xensource.com
Message-ID: <alpine.DEB.2.00.1110200002250.15667@vega-a.dur.ac.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-954205601-1319065424=:15667"
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9JN3wwd023195
Cc: Ian Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] [PATCH 1 of 6] pygrub should check all GPT partitions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--8323329-954205601-1319065424=:15667
Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII


--8323329-954205601-1319065424=:15667
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=pygrub.gpt.patch
Content-Transfer-Encoding: BASE64
Content-Description: 
Content-Disposition: attachment; filename=pygrub.gpt.patch

T24gRmVkb3JhIDE2IHRoZSBmaXJzdCBHUFQgcGFydGl0aW9uIGlzIGEgYm9v
dCBwYXJ0aXRpb24gZm9yIGdydWIyIHdpdGgNCnRoZSBncnViMiBjb25maWd1
cmF0aW9uIGluIHRoZSBzZWNvbmQgcGFydGl0aW9uLg0KQ2hlY2sgYWxsIEdQ
VCBwYXJ0aXRpb25zIGZvciBncnViIGNvbmZpZ3VyYXRpb24sIG5vdCBqdXN0
IHRoZSBmaXJzdC4NClNpZ25lZC1vZmYtYnk6IE1pY2hhZWwgWW91bmcgPG0u
YS55b3VuZ0BkdXJoYW0uYWMudWs+DQoNCi0tLSBhL3Rvb2xzL3B5Z3J1Yi9z
cmMvcHlncnViCTIwMTEtMTAtMTYgMjA6NTg6MDIuMDAwMDAwMDAwICswMTAw
DQorKysgYi90b29scy9weWdydWIvc3JjL3B5Z3J1YgkyMDExLTEwLTE2IDIw
OjU5OjUyLjAwMDAwMDAwMCArMDEwMA0KQEAgLTc4LDkgKzc4LDE3IEBADQog
ZGVmIGdldF9mc19vZmZzZXRfZ3B0KGZpbGUpOg0KICAgICBmZCA9IG9zLm9w
ZW4oZmlsZSwgb3MuT19SRE9OTFkpDQogICAgICMgYXNzdW1lIHRoZSBmaXJz
dCBwYXJ0aXRpb24gaXMgYW4gRUZJIHN5c3RlbSBwYXJ0aXRpb24uDQotICAg
IG9zLmxzZWVrKGZkLCBTRUNUT1JfU0laRSAqIDIsIDApDQorICAgIG9zLmxz
ZWVrKGZkLCBTRUNUT1JfU0laRSwgMCkNCiAgICAgYnVmID0gb3MucmVhZChm
ZCwgNTEyKQ0KLSAgICByZXR1cm4gc3RydWN0LnVucGFjaygiPFEiLCBidWZb
MzI6NDBdKVswXSAqIFNFQ1RPUl9TSVpFDQorICAgIHBhcnRjb3VudCA9IHN0
cnVjdC51bnBhY2soIjxMIiwgYnVmWzgwOjg0XSlbMF0NCisgICAgcGFydHNp
emUgPSBzdHJ1Y3QudW5wYWNrKCI8TCIsIGJ1Zls4NDo4OF0pWzBdDQorICAg
IGkgPSBwYXJ0Y291bnQNCisgICAgb2Zmc2V0cyA9IFtdDQorICAgIHdoaWxl
IGk+MDoNCisgICAgICAgIGJ1ZiA9IG9zLnJlYWQoZmQsIHBhcnRzaXplKQ0K
KyAgICAgICAgb2Zmc2V0cy5hcHBlbmQoc3RydWN0LnVucGFjaygiPFEiLCBi
dWZbMzI6NDBdKVswXSAqIFNFQ1RPUl9TSVpFKQ0KKyAgICAgICAgaSAtPSAx
DQorICAgIHJldHVybiBvZmZzZXRzDQogDQogRkRJU0tfUEFSVF9TT0xBUklT
PTB4YmYNCiBGRElTS19QQVJUX1NPTEFSSVNfT0xEPTB4ODINCkBAIC0xMTQs
NyArMTIyLDkgQEANCiAgICAgICAgICAgICAgICAgY29udGludWUgIyBubyBz
b2xhcmlzIG1hZ2ljIGF0IHRoYXQgb2Zmc2V0LCBpZ25vcmUgcGFydGl0aW9u
DQogDQogICAgICAgICBpZiB0eXBlID09IEZESVNLX1BBUlRfR1BUOg0KLSAg
ICAgICAgICAgIG9mZnNldCA9IGdldF9mc19vZmZzZXRfZ3B0KGZpbGUpDQor
ICAgICAgICAgICAgZm9yIG9mZnNldCBpbiBnZXRfZnNfb2Zmc2V0X2dwdChm
aWxlKToNCisgICAgICAgICAgICAgICAgcGFydF9vZmZzLmFwcGVuZChvZmZz
ZXQpDQorICAgICAgICAgICAgYnJlYWsNCiANCiAgICAgICAgICMgQWN0aXZl
IHBhcnRpdGlvbiBoYXMgMHg4MCBhcyB0aGUgZmlyc3QgYnl0ZS4NCiAgICAg
ICAgICMgSWYgYWN0aXZlLCBwcmVwZW5kIHRvIGZyb250IG9mIGxpc3QsIG90
aGVyd2lzZSBhcHBlbmQgdG8gYmFjay4NCg==

--8323329-954205601-1319065424=:15667
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-954205601-1319065424=:15667--


From xen-devel-bounces@lists.xensource.com Wed Oct 19 16:12:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 16:12:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGfJi-0005CX-2s; Wed, 19 Oct 2011 16:12:58 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGfCI-0003T8-K6
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 16:05:20 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319065514!29929685!1
X-Originating-IP: [129.234.248.2]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22610 invoked from network); 19 Oct 2011 23:05:15 -0000
Received: from hermes2.dur.ac.uk (HELO hermes2.dur.ac.uk) (129.234.248.2)
	by server-3.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 23:05:15 -0000
Received: from smtphost2.dur.ac.uk (smtphost2.dur.ac.uk [129.234.252.2])
	by hermes2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JN4xFk012063;
	Thu, 20 Oct 2011 00:05:03 +0100
Received: from vega-a.dur.ac.uk (vega-a.dur.ac.uk [129.234.250.133])
	by smtphost2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JN4ep6004891
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 00:04:40 +0100
Received: from vega-a.dur.ac.uk (localhost [127.0.0.1])
	by vega-a.dur.ac.uk (8.14.3/8.11.1) with ESMTP id p9JN4eYO018188;
	Thu, 20 Oct 2011 00:04:40 +0100
Received: from localhost (dcl0may@localhost)
	by vega-a.dur.ac.uk (8.14.3/8.14.3/Submit) with ESMTP id p9JN4e0O018184;
	Thu, 20 Oct 2011 00:04:40 +0100
Date: Thu, 20 Oct 2011 00:04:40 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: xen-devel@lists.xensource.com
Message-ID: <alpine.DEB.2.00.1110200003590.15667@vega-a.dur.ac.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-738724013-1319065480=:15667"
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9JN4xFk012063
Cc: Ian Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] [PATCH 2 of 6] Fedora 16 uses /boot/grub2
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--8323329-738724013-1319065480=:15667
Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII


--8323329-738724013-1319065480=:15667
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=pygrub.fedgrubloc.patch
Content-Transfer-Encoding: BASE64
Content-Description: 
Content-Disposition: attachment; filename=pygrub.fedgrubloc.patch

RmVkb3JhIDE2IHB1dHMgZ3J1YiBjb25maWd1cmF0aW9uIGZpbGVzIGluIC9i
b290L2dydWIyL2dydWIuY2ZnIHNvDQpweWdydWIgc2hvdWxkIGxvb2sgdGhl
cmUgYXMgd2VsbA0KU2lnbmVkLW9mZi1ieTogTWljaGFlbCBZb3VuZyA8bS5h
LnlvdW5nQGR1cmhhbS5hYy51az4NCg0KLS0tIGEvdG9vbHMvcHlncnViL3Ny
Yy9weWdydWIJMjAxMS0xMC0xNiAyMDo1ODowMi4wMDAwMDAwMDAgKzAxMDAN
CisrKyBiL3Rvb2xzL3B5Z3J1Yi9zcmMvcHlncnViCTIwMTEtMTAtMTcgMjE6
MTk6MzkuMDAwMDAwMDAwICswMTAwDQpAQCAtMzg2LDcgKzM4Niw4IEBADQog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgWyIvZWZpL2Jvb3QvZWxpbG8u
Y29uZiIsICIvZWxpbG8uY29uZiIsXSkNCiAgICAgICAgIGVsc2U6DQogICAg
ICAgICAgICAgY2ZnX2xpc3QgPSBtYXAobGFtYmRhIHg6ICh4LGdydWIuR3J1
YkNvbmYuR3J1YjJDb25maWdGaWxlKSwNCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICBbIi9ib290L2dydWIvZ3J1Yi5jZmciLCAiL2dydWIvZ3J1Yi5j
ZmciXSkgKyBcDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyIvYm9v
dC9ncnViL2dydWIuY2ZnIiwgIi9ncnViL2dydWIuY2ZnIiwNCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIi9ib290L2dydWIyL2dydWIuY2ZnIiwg
Ii9ncnViMi9ncnViLmNmZyJdKSArIFwNCiAgICAgICAgICAgICAgICAgICAg
ICAgIG1hcChsYW1iZGEgeDogKHgsZ3J1Yi5FeHRMaW51eENvbmYuRXh0TGlu
dXhDb25maWdGaWxlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBb
Ii9ib290L2lzb2xpbnV4L2lzb2xpbnV4LmNmZyIsDQogICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICIvYm9vdC9leHRsaW51eC5jb25mIl0pICsgXA0K

--8323329-738724013-1319065480=:15667
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-738724013-1319065480=:15667--


From xen-devel-bounces@lists.xensource.com Wed Oct 19 16:14:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 16:14:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGfKl-0005g1-Q5; Wed, 19 Oct 2011 16:14:03 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGfG6-00044D-K5
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 16:09:15 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319065750!57226!1
X-Originating-IP: [129.234.248.2]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19748 invoked from network); 19 Oct 2011 23:09:11 -0000
Received: from hermes2.dur.ac.uk (HELO hermes2.dur.ac.uk) (129.234.248.2)
	by server-11.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	19 Oct 2011 23:09:11 -0000
Received: from smtphost1.dur.ac.uk (smtphost1.dur.ac.uk [129.234.252.1])
	by hermes2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JN8rlH013976;
	Thu, 20 Oct 2011 00:08:57 +0100
Received: from vega-a.dur.ac.uk (vega-a.dur.ac.uk [129.234.250.133])
	by smtphost1.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JN8ZeV001758
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 00:08:35 +0100
Received: from vega-a.dur.ac.uk (localhost [127.0.0.1])
	by vega-a.dur.ac.uk (8.14.3/8.11.1) with ESMTP id p9JN8Znh018469;
	Thu, 20 Oct 2011 00:08:35 +0100
Received: from localhost (dcl0may@localhost)
	by vega-a.dur.ac.uk (8.14.3/8.14.3/Submit) with ESMTP id p9JN8Yn1018465;
	Thu, 20 Oct 2011 00:08:35 +0100
Date: Thu, 20 Oct 2011 00:08:32 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: xen-devel@lists.xensource.com
Message-ID: <alpine.DEB.2.00.1110200005180.15667@vega-a.dur.ac.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; boundary="8323329-2135704098-1319065585=:15667"
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9JN8rlH013976
Cc: Ian Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] [PATCH 3 of 6] Allow GPT partition references
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--8323329-2135704098-1319065585=:15667
Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII


--8323329-2135704098-1319065585=:15667
Content-Type: TEXT/PLAIN; name=GrubConf.py.gptpart.patch
Content-Transfer-Encoding: BASE64
Content-Description: 
Content-Disposition: attachment; filename=GrubConf.py.gptpart.patch

VGhlIGdydWIyIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiBGZWRvcmEgMTYgY2Fu
IGhhdmUgR1BUIHBhcnRpdGlvbiByZWZlcmVuY2VzDQpsaWtlIChoZDAsZ3B0
Mikgc28gcmVtb3ZlIHRoZSAiZ3B0IiBzdHJpbmcgd2hlcmUgbmVjZXNzYXJ5
DQpTaWduZWQtb2ZmLWJ5OiBNaWNoYWVsIFlvdW5nIDxtLmEueW91bmdAZHVy
aGFtLmFjLnVrPg0KDQotLS0gYS90b29scy9weWdydWIvc3JjL0dydWJDb25m
LnB5CTIwMTEtMTAtMTcgMjE6MjY6NDguMDAwMDAwMDAwICswMTAwDQorKysg
Yi90b29scy9weWdydWIvc3JjL0dydWJDb25mLnB5CTIwMTEtMTAtMTcgMjE6
MzE6NDEuMDAwMDAwMDAwICswMTAwDQpAQCAtNzksNiArNzksOCBAQA0KICAg
ICAgICAgdmFsID0gdmFsLnJlcGxhY2UoIigiLCAiIikucmVwbGFjZSgiKSIs
ICIiKQ0KICAgICAgICAgaWYgdmFsWzo1XSA9PSAibXNkb3MiOg0KICAgICAg
ICAgICAgIHZhbCA9IHZhbFs1Ol0NCisgICAgICAgIGlmIHZhbFs6M10gPT0g
ImdwdCI6DQorICAgICAgICAgICAgdmFsID0gdmFsWzM6XQ0KICAgICAgICAg
c2VsZi5fcGFydCA9IGludCh2YWwpDQogICAgIHBhcnQgPSBwcm9wZXJ0eShn
ZXRfcGFydCwgc2V0X3BhcnQpDQogDQo=

--8323329-2135704098-1319065585=:15667
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-2135704098-1319065585=:15667--


From xen-devel-bounces@lists.xensource.com Wed Oct 19 16:14:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 16:14:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGfLW-00062X-VQ; Wed, 19 Oct 2011 16:14:51 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGfGw-0004Gc-93
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 16:10:07 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-3.tower-27.messagelabs.com!1319065774!42659913!1
X-Originating-IP: [129.234.248.2]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25337 invoked from network); 19 Oct 2011 23:09:34 -0000
Received: from hermes2.dur.ac.uk (HELO hermes2.dur.ac.uk) (129.234.248.2)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 23:09:34 -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 p9JN9kQd014395;
	Thu, 20 Oct 2011 00:09:50 +0100
Received: from vega-a.dur.ac.uk (vega-a.dur.ac.uk [129.234.250.133])
	by smtphost3.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JN9ShM014256
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 00:09:28 +0100
Received: from vega-a.dur.ac.uk (localhost [127.0.0.1])
	by vega-a.dur.ac.uk (8.14.3/8.11.1) with ESMTP id p9JN9SdS018524;
	Thu, 20 Oct 2011 00:09:28 +0100
Received: from localhost (dcl0may@localhost)
	by vega-a.dur.ac.uk (8.14.3/8.14.3/Submit) with ESMTP id p9JN9STK018520;
	Thu, 20 Oct 2011 00:09:28 +0100
Date: Thu, 20 Oct 2011 00:09:28 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: xen-devel@lists.xensource.com
Message-ID: <alpine.DEB.2.00.1110200008540.15667@vega-a.dur.ac.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-92458612-1319065768=:15667"
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9JN9kQd014395
Cc: Ian Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] [PATCH 4 of 6] parse configurations with submenus
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--8323329-92458612-1319065768=:15667
Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII


--8323329-92458612-1319065768=:15667
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=GrubConf.py.submenu.patch
Content-Transfer-Encoding: BASE64
Content-Description: 
Content-Disposition: attachment; filename=GrubConf.py.submenu.patch

VGhlIGdydWIyIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiBGZWRvcmEgMTYgY2Fu
IGhhdmUgb25lIG9yIG1lbnVlbnRyeXMNCmluIGEgc3VibWVudSwgd2l0aCBj
b25maWd1cmF0aW9uIG9mIHRoZSBmb3JtDQpzdWJtZW51ICJYZW4gNC4xIiB7
DQptZW51ZW50cnkgLi4uIHsNCi4uLg0KfQ0KfQ0KKHRoaXMgZXhhbXBsZSBv
Y2N1cnMgd2hlbiB0aGUgeGVuIGh5cGVydmlzb3IgaXMgaW5zdGFsbGVkIG9u
IHRoZSBndWVzdCkNCklnbm9yZSB0aGUgc3VibWVudSBsaW5lIGFuZCB0aGUg
Y29ycmVzcG9uZGluZyB9IA0KU2lnbmVkLW9mZi1ieTogTWljaGFlbCBZb3Vu
ZyA8bS5hLnlvdW5nQGR1cmhhbS5hYy51az4NCg0KLS0tIGEvdG9vbHMvcHln
cnViL3NyYy9HcnViQ29uZi5weQkyMDExLTEwLTE3IDIxOjI2OjQ4LjAwMDAw
MDAwMCArMDEwMA0KKysrIGIvdG9vbHMvcHlncnViL3NyYy9HcnViQ29uZi5w
eQkyMDExLTEwLTE3IDIxOjQ2OjAwLjAwMDAwMDAwMCArMDEwMA0KQEAgLTM2
OCw2ICszNjgsNyBAQA0KICAgICAgICAgaW5fZnVuY3Rpb24gPSBGYWxzZQ0K
ICAgICAgICAgaW1nID0gTm9uZQ0KICAgICAgICAgdGl0bGUgPSAiIg0KKyAg
ICAgICAgbWVudV9sZXZlbD0wDQogICAgICAgICBmb3IgbCBpbiBsaW5lczoN
CiAgICAgICAgICAgICBsID0gbC5zdHJpcCgpDQogICAgICAgICAgICAgIyBz
a2lwIGJsYW5rIGxpbmVzDQpAQCAtMzk0LDEwICszOTUsMTggQEANCiAgICAg
ICAgICAgICAgICAgaW1nID0gW10NCiAgICAgICAgICAgICAgICAgdGl0bGUg
PSB0aXRsZV9tYXRjaC5ncm91cCgxKQ0KICAgICAgICAgICAgICAgICBjb250
aW51ZQ0KLSAgICAgICAgICAgIA0KKw0KKyAgICAgICAgICAgIGlmIGwuc3Rh
cnRzd2l0aCgic3VibWVudSIpOg0KKyAgICAgICAgICAgICAgICBtZW51X2xl
dmVsICs9IDENCisgICAgICAgICAgICAgICAgY29udGludWUNCisNCiAgICAg
ICAgICAgICBpZiBsLnN0YXJ0c3dpdGgoIn0iKToNCiAgICAgICAgICAgICAg
ICAgaWYgaW1nIGlzIE5vbmU6DQotICAgICAgICAgICAgICAgICAgICByYWlz
ZSBSdW50aW1lRXJyb3IsICJzeW50YXggZXJyb3I6IGNsb3NpbmcgYnJhY2Ug
d2l0aG91dCBtZW51ZW50cnkiDQorICAgICAgICAgICAgICAgICAgICBpZiBt
ZW51X2xldmVsID4gMDoNCisgICAgICAgICAgICAgICAgICAgICAgICBtZW51
X2xldmVsIC09IDENCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51
ZQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToNCisgICAgICAgICAgICAg
ICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJzeW50YXggZXJyb3I6
IGNsb3NpbmcgYnJhY2Ugd2l0aG91dCBtZW51ZW50cnkiDQogDQogICAgICAg
ICAgICAgICAgIHNlbGYuYWRkX2ltYWdlKEdydWIySW1hZ2UodGl0bGUsIGlt
ZykpDQogICAgICAgICAgICAgICAgIGltZyA9IE5vbmUNCg==

--8323329-92458612-1319065768=:15667
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-92458612-1319065768=:15667--


From xen-devel-bounces@lists.xensource.com Wed Oct 19 16:15:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 16:15:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGfMI-0006TU-AO; Wed, 19 Oct 2011 16:15:38 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGfHx-0004YQ-8T
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 16:11:09 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319065865!35973896!1
X-Originating-IP: [129.234.248.1]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14060 invoked from network); 19 Oct 2011 23:11:06 -0000
Received: from hermes1.dur.ac.uk (HELO hermes1.dur.ac.uk) (129.234.248.1)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 19 Oct 2011 23:11:06 -0000
Received: from smtphost4.dur.ac.uk (smtphost4.dur.ac.uk [129.234.252.4])
	by hermes1.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JNAnJN026251;
	Thu, 20 Oct 2011 00:10:53 +0100
Received: from vega-a.dur.ac.uk (vega-a.dur.ac.uk [129.234.250.133])
	by smtphost4.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JNAYDU026736
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 00:10:34 +0100
Received: from vega-a.dur.ac.uk (localhost [127.0.0.1])
	by vega-a.dur.ac.uk (8.14.3/8.11.1) with ESMTP id p9JNAYgq018667;
	Thu, 20 Oct 2011 00:10:34 +0100
Received: from localhost (dcl0may@localhost)
	by vega-a.dur.ac.uk (8.14.3/8.14.3/Submit) with ESMTP id p9JNAYB1018663;
	Thu, 20 Oct 2011 00:10:34 +0100
Date: Thu, 20 Oct 2011 00:10:33 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: xen-devel@lists.xensource.com
Message-ID: <alpine.DEB.2.00.1110200009450.15667@vega-a.dur.ac.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-1389089764-1319065834=:15667"
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9JNAnJN026251
Cc: Ian Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] [PATCH 5 of 6] parse configurations with set
 default="${saved_entry}" line
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--8323329-1389089764-1319065834=:15667
Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII


--8323329-1389089764-1319065834=:15667
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=GrubConf.py.saved_entry.patch
Content-Transfer-Encoding: BASE64
Content-Description: 
Content-Disposition: attachment; filename=GrubConf.py.saved_entry.patch

RmVkb3JhIDE2IGdydWIyIGNvbmZpZ3VyYXRpb24gZmlsZSBjYW4gaGF2ZSBs
aW5lcyBsaWtlDQpzZXQgZGVmYXVsdD0iJHtzYXZlZF9lbnRyeX0iDQphbmQg
YSBzdHJpbmcgY29udGFpbmluZyBhbiBpbnRlZ2VyIGlzIGV4cGVjdGVkDQpT
aWduZWQtb2ZmLWJ5OiBNaWNoYWVsIFlvdW5nIDxtLmEueW91bmdAZHVyaGFt
LmFjLnVrPg0KDQotLS0gYS90b29scy9weWdydWIvc3JjL0dydWJDb25mLnB5
CTIwMTEtMTAtMTcgMjE6MjY6NDguMDAwMDAwMDAwICswMTAwDQorKysgYi90
b29scy9weWdydWIvc3JjL0dydWJDb25mLnB5CTIwMTEtMTAtMTcgMjE6NTI6
MTMuMDAwMDAwMDAwICswMTAwDQpAQCAtNDE0LDYgKzQxNCw4IEBADQogICAg
ICAgICAgICAgICAgIA0KICAgICAgICAgICAgIGlmIHNlbGYuY29tbWFuZHMu
aGFzX2tleShjb20pOg0KICAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbW1h
bmRzW2NvbV0gaXMgbm90IE5vbmU6DQorICAgICAgICAgICAgICAgICAgICBp
ZiBhcmcuc3RyaXAoKSA9PSAiJHtzYXZlZF9lbnRyeX0iOg0KKyAgICAgICAg
ICAgICAgICAgICAgICAgIGFyZyA9ICIwIg0KICAgICAgICAgICAgICAgICAg
ICAgc2V0YXR0cihzZWxmLCBzZWxmLmNvbW1hbmRzW2NvbV0sIGFyZy5zdHJp
cCgpKQ0KICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAg
ICAgICAgbG9nZ2luZy5pbmZvKCJJZ25vcmVkIGRpcmVjdGl2ZSAlcyIgJShj
b20sKSkNCg==

--8323329-1389089764-1319065834=:15667
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-1389089764-1319065834=:15667--


From xen-devel-bounces@lists.xensource.com Wed Oct 19 16:16:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 16:16:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGfN2-0006ry-S1; Wed, 19 Oct 2011 16:16:24 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGfIv-0004q1-IY
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 16:12:10 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319065925!898150!1
X-Originating-IP: [129.234.248.2]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18982 invoked from network); 19 Oct 2011 23:12:06 -0000
Received: from hermes2.dur.ac.uk (HELO hermes2.dur.ac.uk) (129.234.248.2)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 19 Oct 2011 23:12:06 -0000
Received: from smtphost1.dur.ac.uk (smtphost1.dur.ac.uk [129.234.252.1])
	by hermes2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JNBmi3014787;
	Thu, 20 Oct 2011 00:11:52 +0100
Received: from vega-a.dur.ac.uk (vega-a.dur.ac.uk [129.234.250.133])
	by smtphost1.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9JNBSSN001841
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 00:11:28 +0100
Received: from vega-a.dur.ac.uk (localhost [127.0.0.1])
	by vega-a.dur.ac.uk (8.14.3/8.11.1) with ESMTP id p9JNBSKs018709;
	Thu, 20 Oct 2011 00:11:28 +0100
Received: from localhost (dcl0may@localhost)
	by vega-a.dur.ac.uk (8.14.3/8.14.3/Submit) with ESMTP id p9JNBSU5018705;
	Thu, 20 Oct 2011 00:11:28 +0100
Date: Thu, 20 Oct 2011 00:11:22 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: xen-devel@lists.xensource.com
Message-ID: <alpine.DEB.2.00.1110200010470.15667@vega-a.dur.ac.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-1428541439-1319065888=:15667"
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9JNBmi3014787
Cc: Ian Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] [PATCH 6 of 6] example grub2 configuration file
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--8323329-1428541439-1319065888=:15667
Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII


--8323329-1428541439-1319065888=:15667
Content-Type: TEXT/PLAIN; charset=US-ASCII; name=fedora.16.example.patch
Content-Transfer-Encoding: BASE64
Content-Description: 
Content-Disposition: attachment; filename=fedora.16.example.patch

U2FtcGxlIGdydWIyIGNvbmZpZ3VyYXRpb24gZmlsZSAoc29tZSBkdXBsaWNh
dGlvbiByZW1vdmVkKSBmcm9tIEZlZG9yYSAxNg0Kd2l0aCBhIHhlbiBoeXBl
cnZpc29yIGluc3RhbGxlZA0KU2lnbmVkLW9mZi1ieTogTWljaGFlbCBZb3Vu
ZyA8bS5hLnlvdW5nQGR1cmhhbS5hYy51az4NCg0KLS0tIC9kZXYvbnVsbAky
MDExLTEwLTE5IDIxOjU2OjAyLjI4NDg1MTk1MSArMDEwMA0KKysrIGIvdG9v
bHMvcHlncnViL2V4YW1wbGVzL2ZlZG9yYS0xNi13aXRoLXhlbi5ncnViMgky
MDExLTEwLTE5IDIwOjUyOjAyLjAwMDAwMDAwMCArMDEwMA0KQEAgLTAsMCAr
MSwxMTIgQEANCisjDQorIyBETyBOT1QgRURJVCBUSElTIEZJTEUNCisjDQor
IyBJdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBncnViMi1ta2Nv
bmZpZyB1c2luZyB0ZW1wbGF0ZXMNCisjIGZyb20gL2V0Yy9ncnViLmQgYW5k
IHNldHRpbmdzIGZyb20gL2V0Yy9kZWZhdWx0L2dydWINCisjDQorDQorIyMj
IEJFR0lOIC9ldGMvZ3J1Yi5kLzAwX2hlYWRlciAjIyMNCitpZiBbIC1zICRw
cmVmaXgvZ3J1YmVudiBdOyB0aGVuDQorICBsb2FkX2Vudg0KK2ZpDQorc2V0
IGRlZmF1bHQ9IiR7c2F2ZWRfZW50cnl9Ig0KK2lmIFsgIiR7cHJldl9zYXZl
ZF9lbnRyeX0iIF07IHRoZW4NCisgIHNldCBzYXZlZF9lbnRyeT0iJHtwcmV2
X3NhdmVkX2VudHJ5fSINCisgIHNhdmVfZW52IHNhdmVkX2VudHJ5DQorICBz
ZXQgcHJldl9zYXZlZF9lbnRyeT0NCisgIHNhdmVfZW52IHByZXZfc2F2ZWRf
ZW50cnkNCisgIHNldCBib290X29uY2U9dHJ1ZQ0KK2ZpDQorDQorZnVuY3Rp
b24gc2F2ZWRlZmF1bHQgew0KKyAgaWYgWyAteiAiJHtib290X29uY2V9IiBd
OyB0aGVuDQorICAgIHNhdmVkX2VudHJ5PSIke2Nob3Nlbn0iDQorICAgIHNh
dmVfZW52IHNhdmVkX2VudHJ5DQorICBmaQ0KK30NCisNCitmdW5jdGlvbiBs
b2FkX3ZpZGVvIHsNCisgIGluc21vZCB2YmUNCisgIGluc21vZCB2Z2ENCisg
IGluc21vZCB2aWRlb19ib2Nocw0KKyAgaW5zbW9kIHZpZGVvX2NpcnJ1cw0K
K30NCisNCitzZXQgdGltZW91dD01DQorIyMjIEVORCAvZXRjL2dydWIuZC8w
MF9oZWFkZXIgIyMjDQorDQorIyMjIEJFR0lOIC9ldGMvZ3J1Yi5kLzEwX2xp
bnV4ICMjIw0KK21lbnVlbnRyeSAnRmVkb3JhIExpbnV4LCB3aXRoIExpbnV4
IDMuMS4wLTAucmM5LmdpdDAuMC5mYzE2Lng4Nl82NCcgLS1jbGFzcyBmZWRv
cmEgLS1jbGFzcyBnbnUtbGludXggLS1jbGFzcyBnbnUgLS1jbGFzcyBvcyB7
DQorCWxvYWRfdmlkZW8NCisJc2V0IGdmeHBheWxvYWQ9a2VlcA0KKwlpbnNt
b2QgZ3ppbw0KKwlpbnNtb2QgcGFydF9ncHQNCisJaW5zbW9kIGV4dDINCisJ
c2V0IHJvb3Q9JyhoZDAsZ3B0MiknDQorCXNlYXJjaCAtLW5vLWZsb3BweSAt
LWZzLXV1aWQgLS1zZXQ9cm9vdCBmMTRlYTU4YS1jMmIzLTQzNDgtODA5MS0z
YWI3MzNhMmY0OWUNCisJZWNobwknTG9hZGluZyBMaW51eCAzLjEuMC0wLnJj
OS5naXQwLjAuZmMxNi54ODZfNjQgLi4uJw0KKwlsaW51eAkvdm1saW51ei0z
LjEuMC0wLnJjOS5naXQwLjAuZmMxNi54ODZfNjQgcm9vdD0vZGV2L21hcHBl
ci9Wb2xHcm91cC1sdl9yb290IHJvIHJkLm1kPTAgcmQuZG09MCByZC5sdm0u
bHY9Vm9sR3JvdXAvbHZfc3dhcCBxdWlldCBTWVNGT05UPWxhdGFyY3lyaGVi
LXN1bjE2IHJoZ2IgcmQubHZtLmx2PVZvbEdyb3VwL2x2X3Jvb3QgcmQubHVr
cz0wICBLRVlUQUJMRT11ayBMQU5HPWVuX1VTLlVURi04IA0KKwllY2hvCSdM
b2FkaW5nIGluaXRpYWwgcmFtZGlzayAuLi4nDQorCWluaXRyZAkvaW5pdHJh
bWZzLTMuMS4wLTAucmM5LmdpdDAuMC5mYzE2Lng4Nl82NC5pbWcNCit9DQor
bWVudWVudHJ5ICdGZWRvcmEgTGludXgsIHdpdGggTGludXggMy4xLjAtMC5y
YzkuZ2l0MC4wLmZjMTYueDg2XzY0IChyZWNvdmVyeSBtb2RlKScgLS1jbGFz
cyBmZWRvcmEgLS1jbGFzcyBnbnUtbGludXggLS1jbGFzcyBnbnUgLS1jbGFz
cyBvcyB7DQorCWxvYWRfdmlkZW8NCisJc2V0IGdmeHBheWxvYWQ9a2VlcA0K
KwlpbnNtb2QgZ3ppbw0KKwlpbnNtb2QgcGFydF9ncHQNCisJaW5zbW9kIGV4
dDINCisJc2V0IHJvb3Q9JyhoZDAsZ3B0MiknDQorCXNlYXJjaCAtLW5vLWZs
b3BweSAtLWZzLXV1aWQgLS1zZXQ9cm9vdCBmMTRlYTU4YS1jMmIzLTQzNDgt
ODA5MS0zYWI3MzNhMmY0OWUNCisJZWNobwknTG9hZGluZyBMaW51eCAzLjEu
MC0wLnJjOS5naXQwLjAuZmMxNi54ODZfNjQgLi4uJw0KKwlsaW51eAkvdm1s
aW51ei0zLjEuMC0wLnJjOS5naXQwLjAuZmMxNi54ODZfNjQgcm9vdD0vZGV2
L21hcHBlci9Wb2xHcm91cC1sdl9yb290IHJvIHNpbmdsZSByZC5tZD0wIHJk
LmRtPTAgcmQubHZtLmx2PVZvbEdyb3VwL2x2X3N3YXAgcXVpZXQgU1lTRk9O
VD1sYXRhcmN5cmhlYi1zdW4xNiByaGdiIHJkLmx2bS5sdj1Wb2xHcm91cC9s
dl9yb290IHJkLmx1a3M9MCAgS0VZVEFCTEU9dWsgTEFORz1lbl9VUy5VVEYt
OA0KKwllY2hvCSdMb2FkaW5nIGluaXRpYWwgcmFtZGlzayAuLi4nDQorCWlu
aXRyZAkvaW5pdHJhbWZzLTMuMS4wLTAucmM5LmdpdDAuMC5mYzE2Lng4Nl82
NC5pbWcNCit9DQorIyMjIEVORCAvZXRjL2dydWIuZC8xMF9saW51eCAjIyMN
CisNCisjIyMgQkVHSU4gL2V0Yy9ncnViLmQvMjBfbGludXhfeGVuICMjIw0K
K3N1Ym1lbnUgIlhlbiA0LjEiIHsNCittZW51ZW50cnkgJ0ZlZG9yYSBMaW51
eCwgd2l0aCBYZW4gNC4xIGFuZCBMaW51eCAzLjEuMC0wLnJjOS5naXQwLjAu
ZmMxNi54ODZfNjQnIC0tY2xhc3MgZmVkb3JhIC0tY2xhc3MgZ251LWxpbnV4
IC0tY2xhc3MgZ251IC0tY2xhc3Mgb3MgLS1jbGFzcyB4ZW4gew0KKwlpbnNt
b2QgcGFydF9ncHQNCisJaW5zbW9kIGV4dDINCisJc2V0IHJvb3Q9JyhoZDAs
Z3B0MiknDQorCXNlYXJjaCAtLW5vLWZsb3BweSAtLWZzLXV1aWQgLS1zZXQ9
cm9vdCBmMTRlYTU4YS1jMmIzLTQzNDgtODA5MS0zYWI3MzNhMmY0OWUNCisJ
ZWNobwknTG9hZGluZyBYZW4gNC4xIC4uLicNCisJbXVsdGlib290CS94ZW4t
NC4xLmd6IHBsYWNlaG9sZGVyICANCisJZWNobwknTG9hZGluZyBMaW51eCAz
LjEuMC0wLnJjOS5naXQwLjAuZmMxNi54ODZfNjQgLi4uJw0KKwltb2R1bGUJ
L3ZtbGludXotMy4xLjAtMC5yYzkuZ2l0MC4wLmZjMTYueDg2XzY0IHBsYWNl
aG9sZGVyIHJvb3Q9L2Rldi9tYXBwZXIvVm9sR3JvdXAtbHZfcm9vdCBybyBy
ZC5tZD0wIHJkLmRtPTAgcmQubHZtLmx2PVZvbEdyb3VwL2x2X3N3YXAgcXVp
ZXQgU1lTRk9OVD1sYXRhcmN5cmhlYi1zdW4xNiByaGdiIHJkLmx2bS5sdj1W
b2xHcm91cC9sdl9yb290IHJkLmx1a3M9MCAgS0VZVEFCTEU9dWsgTEFORz1l
bl9VUy5VVEYtOCANCisJZWNobwknTG9hZGluZyBpbml0aWFsIHJhbWRpc2sg
Li4uJw0KKwltb2R1bGUJL2luaXRyYW1mcy0zLjEuMC0wLnJjOS5naXQwLjAu
ZmMxNi54ODZfNjQuaW1nDQorfQ0KK21lbnVlbnRyeSAnRmVkb3JhIExpbnV4
LCB3aXRoIFhlbiA0LjEgYW5kIExpbnV4IDMuMS4wLTAucmM5LmdpdDAuMC5m
YzE2Lng4Nl82NCAocmVjb3ZlcnkgbW9kZSknIC0tY2xhc3MgZmVkb3JhIC0t
Y2xhc3MgZ251LWxpbnV4IC0tY2xhc3MgZ251IC0tY2xhc3Mgb3MgLS1jbGFz
cyB4ZW4gew0KKwlpbnNtb2QgcGFydF9ncHQNCisJaW5zbW9kIGV4dDINCisJ
c2V0IHJvb3Q9JyhoZDAsZ3B0MiknDQorCXNlYXJjaCAtLW5vLWZsb3BweSAt
LWZzLXV1aWQgLS1zZXQ9cm9vdCBmMTRlYTU4YS1jMmIzLTQzNDgtODA5MS0z
YWI3MzNhMmY0OWUNCisJZWNobwknTG9hZGluZyBYZW4gNC4xIC4uLicNCisJ
bXVsdGlib290CS94ZW4tNC4xLmd6IHBsYWNlaG9sZGVyIA0KKwllY2hvCSdM
b2FkaW5nIExpbnV4IDMuMS4wLTAucmM5LmdpdDAuMC5mYzE2Lng4Nl82NCAu
Li4nDQorCW1vZHVsZQkvdm1saW51ei0zLjEuMC0wLnJjOS5naXQwLjAuZmMx
Ni54ODZfNjQgcGxhY2Vob2xkZXIgcm9vdD0vZGV2L21hcHBlci9Wb2xHcm91
cC1sdl9yb290IHJvIHNpbmdsZSByZC5tZD0wIHJkLmRtPTAgcmQubHZtLmx2
PVZvbEdyb3VwL2x2X3N3YXAgcXVpZXQgU1lTRk9OVD1sYXRhcmN5cmhlYi1z
dW4xNiByaGdiIHJkLmx2bS5sdj1Wb2xHcm91cC9sdl9yb290IHJkLmx1a3M9
MCAgS0VZVEFCTEU9dWsgTEFORz1lbl9VUy5VVEYtOA0KKwllY2hvCSdMb2Fk
aW5nIGluaXRpYWwgcmFtZGlzayAuLi4nDQorCW1vZHVsZQkvaW5pdHJhbWZz
LTMuMS4wLTAucmM5LmdpdDAuMC5mYzE2Lng4Nl82NC5pbWcNCit9DQorfQ0K
KyMjIyBFTkQgL2V0Yy9ncnViLmQvMjBfbGludXhfeGVuICMjIw0KKw0KKyMj
IyBCRUdJTiAvZXRjL2dydWIuZC8zMF9vcy1wcm9iZXIgIyMjDQorIyMjIEVO
RCAvZXRjL2dydWIuZC8zMF9vcy1wcm9iZXIgIyMjDQorDQorIyMjIEJFR0lO
IC9ldGMvZ3J1Yi5kLzQwX2N1c3RvbSAjIyMNCisjIFRoaXMgZmlsZSBwcm92
aWRlcyBhbiBlYXN5IHdheSB0byBhZGQgY3VzdG9tIG1lbnUgZW50cmllcy4g
IFNpbXBseSB0eXBlIHRoZQ0KKyMgbWVudSBlbnRyaWVzIHlvdSB3YW50IHRv
IGFkZCBhZnRlciB0aGlzIGNvbW1lbnQuICBCZSBjYXJlZnVsIG5vdCB0byBj
aGFuZ2UNCisjIHRoZSAnZXhlYyB0YWlsJyBsaW5lIGFib3ZlLg0KKyMjIyBF
TkQgL2V0Yy9ncnViLmQvNDBfY3VzdG9tICMjIw0KKw0KKyMjIyBCRUdJTiAv
ZXRjL2dydWIuZC80MV9jdXN0b20gIyMjDQoraWYgWyAtZiAgJHByZWZpeC9j
dXN0b20uY2ZnIF07IHRoZW4NCisgIHNvdXJjZSAkcHJlZml4L2N1c3RvbS5j
Zmc7DQorZmkNCisjIyMgRU5EIC9ldGMvZ3J1Yi5kLzQxX2N1c3RvbSAjIyMN
CisNCisjIyMgQkVHSU4gL2V0Yy9ncnViLmQvOTBfcGVyc2lzdGVudCAjIyMN
CisjIyMgRU5EIC9ldGMvZ3J1Yi5kLzkwX3BlcnNpc3RlbnQgIyMjDQo=

--8323329-1428541439-1319065888=:15667
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-1428541439-1319065888=:15667--


From xen-devel-bounces@lists.xensource.com Wed Oct 19 18:39:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 18:39:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGhbE-0003H9-QA; Wed, 19 Oct 2011 18:39:12 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGhaM-00034H-94
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 18:38:18 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1319074693!32293243!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25543 invoked from network); 20 Oct 2011 01:38:15 -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; 20 Oct 2011 01:38: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
	p9K1c95M004875
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 20 Oct 2011 01:38:11 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
	p9K1c8bO001764
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 01:38:09 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
	p9K1c3dg028604; Wed, 19 Oct 2011 20:38:03 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 18:38:03 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id D38638289C; Wed, 19 Oct 2011 21:38:01 -0400 (EDT)
Date: Wed, 19 Oct 2011 21:38:01 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	thellstrom@vmware.com, thomas@shipmail.org, airlied@redhat.com
Message-ID: <20111020013801.GA6319@phenom.dumpdata.com>
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-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4E9F7B84.0039:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, j.glisse@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:

Hmm, seems a part of this got eaten by the Internet monsters.

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).
> 
> 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:
> 
>  git://oss.oracle.com/git/kwilk/xen.git devel/ttm.dma_pool.v2.1
> 
> 
> 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  | 1446 +++++++++++++++++++++++++++++
>  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, 1637 insertions(+), 82 deletions(-)
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 18:43:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 18:43:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGhfK-0003hO-60; Wed, 19 Oct 2011 18:43:26 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGhei-0003UZ-H9
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 18:42:48 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319074932!59940089!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14514 invoked from network); 20 Oct 2011 01:42:13 -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; 20 Oct 2011 01:42:13 -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
	p9K1gb9t005784
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 20 Oct 2011 01:42:39 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
	p9K1USjm019098
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 01:30:29 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
	p9K1gUrs030717; Wed, 19 Oct 2011 20:42:30 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 18:42:30 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 5E4C78289C; Wed, 19 Oct 2011 21:42:29 -0400 (EDT)
Date: Wed, 19 Oct 2011 21:42:29 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Dario Faggioli <raistlin@linux.it>
Subject: Re: [Xen-devel] Issue with PCI-passthrough and pvops
Message-ID: <20111020014229.GA6680@phenom.dumpdata.com>
References: <1318865791.25056.28.camel@Palantir>
	<20111017164020.GE19684@phenom.dumpdata.com>
	<1318982052.2997.19.camel@Palantir>
	<20111019011028.GA19302@phenom.dumpdata.com>
	<1319010037.11016.66.camel@dagon.hellion.org.uk>
	<CAAWQecut9-ouRfZEwmvFYkA8W98XZRFc3LtdPYPyWbhuaZzYiw@mail.gmail.com>
	<20111019141032.GB8033@phenom.dumpdata.com>
	<CAAWQectmCtkgvi7ZpQZYKxCSPZ7sk14UdCYAY2PgQjKSWEDBqw@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAAWQectmCtkgvi7ZpQZYKxCSPZ7sk14UdCYAY2PgQjKSWEDBqw@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.0A020206.4E9F7C8F.009C,ss=1,re=0.000,fgs=0
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

> > I would recommend you take a look at the probe function and figure out why
> > it can't reserve that region. And easy way to figure that out is to
> > boot the guest and look in /proc/iomem and see what is in the df30000-e32ffffff
> > region. Perhaps something else is overlapping it?
> >
> I might be wrong, but it doesn't seem quite so to me:
> 
> # cat /proc/iomem
> 00000000-0000ffff : reserved
> 00010000-0009ffff : System RAM
> 000a0000-000fffff : reserved
>   000f0000-000fffff : System ROM
> 00100000-1fffffff : System RAM
>   01000000-01b88b4b : Kernel code
>   01b88b4c-02352a7f : Kernel data
>   02652000-02ee6fff : Kernel bss
> 20000000-bf698fff : Unusable memory
> bf6af000-bf6cdfff : ACPI Tables
> d58f8000-d58fbfff : 0000:00:00.0
> d5900000-d597ffff : 0000:00:00.0
> df200000-e71fffff : 0000:00:00.0
> 100000000-1000fffff : System RAM
> 
> The probe function is huge... But I'll se if I can find the time to take
> a look at it in the next days...

Hmmm. Instrumenting resources.c (__request_resource) might be the way to
figure out where it chokes on.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 18:49:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 18:49:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGhkr-0004Pv-QG; Wed, 19 Oct 2011 18:49:09 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGhkC-0004D9-PY
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 18:48:29 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319075081!880991!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26320 invoked from network); 20 Oct 2011 01:44:42 -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; 20 Oct 2011 01:44: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
	p9K1iMJ0009665
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 20 Oct 2011 01:44: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
	p9K1iLuc006863
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 01:44:21 GMT
Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9K1iFqU031441; Wed, 19 Oct 2011 20:44:16 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 18:44:15 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id DA5E78289C; Wed, 19 Oct 2011 21:44:14 -0400 (EDT)
Date: Wed, 19 Oct 2011 21:44:14 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: M A Young <m.a.young@durham.ac.uk>
Subject: Re: [Xen-devel] [PATCH 0 of 6] pygrub fixes to support a Fedora 16
	guest
Message-ID: <20111020014414.GB6680@phenom.dumpdata.com>
References: <alpine.DEB.2.00.1110192358140.15667@vega-a.dur.ac.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1110192358140.15667@vega-a.dur.ac.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.4E9F7CF8.0029:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: 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 Thu, Oct 20, 2011 at 12:02:21AM +0100, M A Young wrote:
> 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.

You can add Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
to them too.

Thanks for making the changes.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 19:22:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 19:22:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGiHT-0005Js-1n; Wed, 19 Oct 2011 19:22:51 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGiGR-00056j-G1
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 19:21:47 -0700
X-Env-Sender: wangwangkang@gmail.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1319077304!878483!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3481 invoked from network); 20 Oct 2011 02:21:44 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 02:21:44 -0000
Received: by wwf10 with SMTP id 10so2885657wwf.24
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 19:21:44 -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=jZsBIOcW6ubd9wyZMnmrO33hviu9P4EzN04vsw4sLsk=;
	b=mfpuxCJetScljvC55pJNu8CMgl10JyLMncWMCvCVeHRMfbrSS98swLOQEDHCDDI8z1
	/aJnDiWpVL3YNcW3Ye/Mw/90IjTtrYTVsohrxbukJZXoproV+yFxHW2vBfMG87wHzaUI
	pKqgRlXpPswoVkQlbeUqwHRbO1SV83Sk07PMU=
MIME-Version: 1.0
Received: by 10.216.171.202 with SMTP id r52mr3176061wel.93.1319077304338;
	Wed, 19 Oct 2011 19:21:44 -0700 (PDT)
Received: by 10.216.10.72 with HTTP; Wed, 19 Oct 2011 19:21:44 -0700 (PDT)
Date: Wed, 19 Oct 2011 22:21:44 -0400
Message-ID: <CAMTrTqWRp7fQnX5oOPJJJHO1TGR79d6=O=z-njf8wwsN6=6xsw@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] Question about quest page table 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

Hi,
Recently I am trying to understand the page table update of a guest OS
and I am in some trouble.
Assuming the starting point is the hypercall do_mmu_update(req, count,
done, ...),
req has the struct of {uint64_t ptr; uint64_t val}.

My first question is that. Since the ptr points to the address of the
page table entry to be updated, it is the guest address. Why
the code "gmfn = req.ptr >> PAGE_SHIFT;" can be used to the guest
machine frame number?

Second, what is va from these 3 line of code?
	mfn = mfn_x(gfn_to_mfn(pt_owner, gmfn, &p2mt));
	va = map_domain_page_with_cache(mfn, &mapcache);
	va = (void *)((unsigned long)va +
                           (unsigned long)(req.ptr & ~PAGE_MASK));

Third, is the input argument val a real machine address or the
pseudo-physical address of the guest?

Fourth, I saw a lot of code in xen/arch/x86/mm.c calls the functions
like p2m. What is the relationship between the p2m functions and the
shadow page tables?

Sorry for posting so many questions. Could anyone help to clarifying
them? Thanks.

- Hui

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 19:30:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 19:30:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGiOl-0005ni-2b; Wed, 19 Oct 2011 19:30:24 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGiO2-0005bF-6B
	for Xen-devel@lists.xensource.com; Wed, 19 Oct 2011 19:29:38 -0700
X-Env-Sender: mukesh.rathor@oracle.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1319077748!53969193!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10907 invoked from network); 20 Oct 2011 02:29:10 -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; 20 Oct 2011 02:29:10 -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
	p9K2TSPD012502
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 20 Oct 2011 02:29:30 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
	p9K2TRSN019614
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 02:29:28 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
	p9K2TKZE020895; Wed, 19 Oct 2011 21:29:20 -0500
Received: from mantra.us.oracle.com (/130.35.68.95)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 19 Oct 2011 19:29:20 -0700
Date: Wed, 19 Oct 2011 19:29:18 -0700
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Message-ID: <20111019192918.627bfe70@mantra.us.oracle.com>
In-Reply-To: <1319013573.3385.60.camel@zakaz.uk.xensource.com>
References: <20111013181853.15381ef5@mantra.us.oracle.com>
	<CABDA859.22DA3%keir.xen@gmail.com>
	<20111017191810.28876947@mantra.us.oracle.com>
	<1318925582.16132.31.camel@zakaz.uk.xensource.com>
	<20111018121727.27a3f03c@mantra.us.oracle.com>
	<1319013573.3385.60.camel@zakaz.uk.xensource.com>
Organization: Oracle Corporation
X-Mailer: Claws Mail 3.7.6 (GTK+ 2.18.9; x86_64-redhat-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A020208.4E9F878A.00A9:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Keir Fraser <keir.xen@gmail.com>, Jeremy Fitzhardinge <jeremy@goop.org>
Subject: [Xen-devel] Re: HYBRID: gnttab_map() to map shared frames..
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 19 Oct 2011 09:39:33 +0100
Ian Campbell <Ian.Campbell@citrix.com> wrote:

> On Tue, 2011-10-18 at 20:17 +0100, Mukesh Rathor wrote:
> > On Tue, 18 Oct 2011 09:13:02 +0100
> > Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > ... 
> > > Could GNTTABOP_setup_table return GFNs from the very top of the
> > > GFN space? Perhaps even above what would be architecturally valid,
> > > although perhaps that is incompatible with HAP. Anything above
> > > max_pfn would seem to be valid for the hypervisor to place "magic"
> > > mappings in?
> > 
> > Well, what's confusing me for this is that there are few max 
> > pfn's inside the guest! The nr_pages being one for example, then 
> > there's max_pfn in shared_info.arch. I'm not sure if these two are
> > in sync with max_pfn in mm/bootmem.c. Then, we would need to adjust
> > EPT to add these pfns there. So that may put a damper on this.
> 
> What about using PFNs from right at the top, i.e. right up near
> 0xffffffff? I don't think there's any particular reason these special
> PFNs need to be contiguous with the "regular" ones. This would limit
> the total amount of RAM you could give a hybrid guest, but not by
> much.

Yeah, I dinkered around a bit with e820 and realized it would be
migration headache, so just decided to do this. I allocate pfn's near
0xffffffff and map it. Things are fine, I see all page table entries
just fine, the entry is put into the p2m also via ept_set_entry, but
for some reason it's taking fault on accessing shared[0] with error
code 0xb that doesn't make sense. Even the mfn in xen is writable
page. 

PGD 77895067 PUD 77896067 PMD 77897067 PTE 80000ffffffdf063

I'll continue debugging.

thanks,
Mukesh



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 20:18:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 20:18:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGj9R-0007DN-82; Wed, 19 Oct 2011 20:18:37 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGj8T-00070s-47
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 20:17:37 -0700
X-Env-Sender: lidongyang@novell.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1319080652!916933!1
X-Originating-IP: [137.65.250.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15418 invoked from network); 20 Oct 2011 03:17:33 -0000
Received: from victor.provo.novell.com (HELO victor.provo.novell.com)
	(137.65.250.26)
	by server-8.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 20 Oct 2011 03:17:33 -0000
Received: from mail-gx0-f171.google.com (prv-ext-foundry1int.gns.novell.com
	[137.65.251.240])
	by victor.provo.novell.com with ESMTP (TLS encrypted);
	Wed, 19 Oct 2011 21:17:16 -0600
Received: by ggnv5 with SMTP id v5so3256893ggn.30
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 20:17:14 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.7.100 with SMTP id i4mr1559816oba.66.1319080634787; Wed,
	19 Oct 2011 20:17:14 -0700 (PDT)
Received: by 10.182.113.2 with HTTP; Wed, 19 Oct 2011 20:17:14 -0700 (PDT)
In-Reply-To: <4E9C4855020000780005BA73@victor.provo.novell.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
	<4E940E21020000780005AA29@nat28.tlf.novell.com>
	<20111011155133.GC29349@phenom.oracle.com>
	<20111011205729.GB22668@phenom.oracle.com>
	<4E9C4855020000780005BA73@victor.provo.novell.com>
Date: Thu, 20 Oct 2011 11:17:14 +0800
Message-ID: <CAKH3R4_TDxyNcsgZBOxQRS4U61h=bhY+Vap72AWa4CdQyQ7QfQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
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: Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"hch@infradead.org" <hch@infradead.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

I think we also should mark the vbd has discard_secure if we are
usingthe file backend,as if we punch a hole in the image, those blocks
are freed tofilesystem and hardly to getthem back, or maybe write
zeros to the range before we punch the hole is better?
On Mon, Oct 17, 2011 at 9:23 PM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 11.10.11 at 22:57, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> w=
rote:
>> --- a/drivers/block/xen-blkfront.c
>> +++ b/drivers/block/xen-blkfront.c
>>...
>> @@ -705,7 +711,7 @@ static void blkif_free(struct blkfront_info *info, i=
nt suspend)
>> =A0static void blkif_completion(struct blk_shadow *s)
>> =A0{
>> =A0 =A0 =A0 int i;
>
> This function gets called for all types of requests, and hence must filte=
r
> discard ones now that what would be nr_segments can be non-zero,
> e.g.
>
> =A0 =A0 =A0 =A0if (s->req.operation =3D=3D BLKIF_OP_DISCARD)
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return;
>
> Jan
>
>> - =A0 =A0 for (i =3D 0; i < s->req.nr_segments; i++)
>> + =A0 =A0 for (i =3D 0; i < s->req.u1.nr_segments; i++)
>> =A0 =A0 =A0 =A0 =A0 =A0 =A0 gnttab_end_foreign_access(s->req.u.rw.seg[i]=
.gref, 0, 0UL);
>> =A0}
>>
>
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 19 20:26:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 20:26:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGjHN-0007hm-JJ; Wed, 19 Oct 2011 20:26:49 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGjGc-0007VB-36
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 20:26:02 -0700
X-Env-Sender: apxeng@gmail.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319081146!42417067!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21203 invoked from network); 20 Oct 2011 03:25:47 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 03:25:47 -0000
Received: by qyg36 with SMTP id 36so2567313qyg.9
	for <xen-devel@lists.xensource.com>;
	Wed, 19 Oct 2011 20:25:57 -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=AfE4gDhX31RpuEjNUaO4SYnMivi3PUKG+4JQ1tc9xMw=;
	b=WEHSVaekx5dK/uxDIMMT7PcJWZY2ljsorE9eIjKtZGeEB5Dv77pxLiWkyefeLSDoek
	xN669A2m5tYxmy0F1bnx9RtKfTiLJ5riTDe7k+DldUv6YYa455JPhOHhlJmyrmkt8LT8
	8OIY9FmsSXH+8000Y+a1eKnlUSu9aWI6c5EhA=
MIME-Version: 1.0
Received: by 10.229.67.105 with SMTP id q41mr1902624qci.216.1319081157523;
	Wed, 19 Oct 2011 20:25:57 -0700 (PDT)
Received: by 10.229.20.12 with HTTP; Wed, 19 Oct 2011 20:25:57 -0700 (PDT)
In-Reply-To: <1319014066.3385.67.camel@zakaz.uk.xensource.com>
References: <CAGU+auuKHp=vX_LamPmcmGMYsos1oG7Xq8biMk=LPG=B3gaC5A@mail.gmail.com>
	<1319014066.3385.67.camel@zakaz.uk.xensource.com>
Date: Wed, 19 Oct 2011 20:25:57 -0700
Message-ID: <CAGU+auuAivu8ezH11xxTGFs_aWAovdBY2o_h8agw+1XLK4f_Mw@mail.gmail.com>
Subject: Re: [Xen-devel] xen 3.4-testing build error
From: AP <apxeng@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

On Wed, Oct 19, 2011 at 1:47 AM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Wed, 2011-10-19 at 06:19 +0100, AP wrote:
>> I am trying to build xen-3.4-testing (19995:0e3b875fd5fb) on Ubuntu
>> 11.10 64-bit. I am building with the following patch:
>
> 3.4 is a bit old, why not use 4.1?

I am primarily using 4.1 but I still have a couple of servers running
3.4, so I want to ensure that I can still build that using Ubuntu
11.10.

>> I have tried installing the bz2 (libbz2-dev) and lzam (liblzma-dev)
>> dev packages but I still get the error. I have tried doing a clean and
>> make after the installing the dev packages to no avail. Any idea what
>> other library I need to install?
>
> Recent Ubuntu enabled --as-needed in the linker by default. If you want
> to stick with 3.4 you might need to add --no-as-needed somewhere
> appropriate, 22856:18807b89083d is the temporary fix which we used for
> 4.1. This issue is fixed properly in 4.2.

Thank you! 22856 did the trick. BTW, I also had to pull in a few more
fixes to get everything to work. I am listing them here in case
someone else runs in to the same issue. The only outstanding problem
is that bringing up a DomU with SDL leaves you with a flickering SDL
window. Using VNC is a workaround for that.

http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/2e78e0ce1f31
http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/e6b5b2cb8146
http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/9c2fdcff3704

diff -r 0e3b875fd5fb -r 3a1e98c88825 tools/blktap/lib/blktaplib.h
--- a/tools/blktap/lib/blktaplib.h      Fri Sep 30 18:42:30 2011 -0400
+++ b/tools/blktap/lib/blktaplib.h      Wed Oct 19 11:07:22 2011 -0700
@@ -196,6 +196,7 @@
 } msg_pid_t;

 #define READ 0
+#undef WRITE
 #define WRITE 1

http://www.gossamer-threads.com/lists/xen/devel/179690
diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/arch/x86/mm.c
--- a/extras/mini-os/arch/x86/mm.c      Sun Jul 25 22:22:43 2010 +0100
+++ b/extras/mini-os/arch/x86/mm.c      Wed Oct 19 12:25:52 2011 -0700
@@ -281,7 +281,7 @@
 /*
  * Mark portion of the address space read only.
  */
-extern void shared_info;
+extern char shared_info[PAGE_SIZE];
 static void set_readonly(void *text, void *etext)
 {
     unsigned long start_address =
diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/minios.mk
--- a/extras/mini-os/minios.mk  Sun Jul 25 22:22:43 2010 +0100
+++ b/extras/mini-os/minios.mk  Wed Oct 19 12:25:52 2011 -0700
@@ -10,6 +10,7 @@
 DEF_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
 DEF_CFLAGS += $(call cc-option,$(CC),-fgnu89-inline)
 DEF_CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline
+DEF_CFLAGS += -Wno-uninitialized
 DEF_CPPFLAGS += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)

 DEF_ASFLAGS += -D__ASSEMBLY__
diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/netfront.c
--- a/extras/mini-os/netfront.c Sun Jul 25 22:22:43 2010 +0100
+++ b/extras/mini-os/netfront.c Wed Oct 19 12:25:52 2011 -0700
@@ -25,8 +25,8 @@



-#define NET_TX_RING_SIZE __RING_SIZE((struct netif_tx_sring *)0, PAGE_SIZE)
-#define NET_RX_RING_SIZE __RING_SIZE((struct netif_rx_sring *)0, PAGE_SIZE)
+#define NET_TX_RING_SIZE __CONST_RING_SIZE(netif_tx, PAGE_SIZE)
+#define NET_RX_RING_SIZE __CONST_RING_SIZE(netif_rx, PAGE_SIZE)
 #define GRANT_INVALID_REF 0

> Ian.
>
>>
>> Thanks,
>> AP
>>
>> GCC Info
>> --------------
>> Using built-in specs.
>> COLLECT_GCC=gcc
>> COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6.1/lto-wrapper
>> Target: x86_64-linux-gnu
>> Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
>> 4.6.1-9ubuntu3'
>> --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs
>> --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr
>> --program-suffix=-4.6 --enable-shared --enable-linker-build-id
>> --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
>> --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6
>> --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu
>> --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin
>> --enable-objc-gc --disable-werror --with-arch-32=i686
>> --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu
>> --host=x86_64-linux-gnu --target=x86_64-linux-gnu
>> Thread model: posix
>> gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
>>
>> _______________________________________________
>> 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 Oct 19 20:44:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 19 Oct 2011 20:44:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGjYH-0008TZ-FZ; Wed, 19 Oct 2011 20:44:17 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGjXL-0008Gx-U1
	for xen-devel@lists.xensource.com; Wed, 19 Oct 2011 20:43:20 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1319082196!321773!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32585 invoked from network); 20 Oct 2011 03:43:16 -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;
	20 Oct 2011 03:43:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,376,1315180800"; 
   d="scan'208";a="8487672"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 03:43: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, 20 Oct 2011 04:43:16 +0100
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 1RGjXI-0004cJ-8O;
	Thu, 20 Oct 2011 03:43:16 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RGjXI-0001qD-2I;
	Thu, 20 Oct 2011 04:43:16 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9349-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 20 Oct 2011 04:43:16 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9349: 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 9349 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9349/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf     13 guest-localmigrate.2         fail pass in 9348

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-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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  14b369de76ad
baseline version:
 xen                  14b369de76ad

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 Thu Oct 20 00:21:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 00:21:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGmwA-0004uQ-GL; Thu, 20 Oct 2011 00:21:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGmvQ-0004hl-NR
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 00:20:25 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1319095221!35989005!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6746 invoked from network); 20 Oct 2011 07:20:21 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 07:20:21 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 08:20:20 +0100
Message-Id: <4E9FE7D4020000780005C65E@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 08:20:20 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Alex Bligh" <alex@alex.org.uk>
Subject: Re: [Xen-devel] Compilation problems: oldstyle/xenlinux
	2.6.38, blktap2
References: <DFC59CD6B72571D62D342F37@Ximines.local>
	<4E9E988C020000780005C1BC@nat28.tlf.novell.com>
	<9F7D19DACCC3B803FCE8C1DB@nimrod.local>
In-Reply-To: <9F7D19DACCC3B803FCE8C1DB@nimrod.local>
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 19.10.11 at 22:40, Alex Bligh <alex@alex.org.uk> wrote:
> --On 19 October 2011 08:29:48 +0100 Jan Beulich <JBeulich@suse.com> =
wrote:
> Stupid question #1: I take it that "our patches" means SUSE's? Is there =
a=20
> git tree I can pull patches from rebased against something modern =
(e.g.=20
> 2.6.38)? What I'm doing is creating a kernel based on Ubuntu Natty, and =
I=20
> currently have it working with one great blob of Xen patches, rather =
than=20
> the original git paches which would be better.

You could pull openSUSE's kernel-source-*.src.rpm-s, or go to
http://kernel.opensuse.org/git. That's a fine grained as you will
be able to get it.

> Stupid question #2: so, if I'm running with Xen 3.3.x, it won't use
> any of the pvops stuff. Will a xenlinux/oldstyle kernel ever use
> any of the pvops stuff?

I'm trying to merge with drivers that make it upstream, but we're
not going to use the base pvops infrastructure until we're going to
switch over (in the not too far future, hopefully).

> If blktap2 is compiled as a module, how does
> it know which module to load (blktap2 or blktap2-new) apart from
> manual insmod?

That's how it's expected to work (or in SLES possibly by marking only
one of them supported, which will prevent the other from getting
loaded).

>> Quite obviously your kernel will lack support for any of the tap2:
>> protocols.
>=20
> Stupid question #3: If this kernel is running as dom0 for 3.3.x,
> would it use any of the blktap2 stuff anyway? I'm working from
> memory here but didn't that come after 3.3.1? And if I'm wrong, aren't
> I going to want to build blktap2 (presumably not -new) as a built-in
> (i.e. "y")? Perhaps I'm missing what tap2 does vs. tap.

Indeed, tap2 appeared in 4.0.0 only, so with 3.3.x you should be
safe to leave it off.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 00:25:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 00:25:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGn00-0005Rs-IZ; Thu, 20 Oct 2011 00:25:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGmz6-0005Ed-52
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 00:24:12 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319095448!29968459!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21600 invoked from network); 20 Oct 2011 07:24:09 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 07:24:09 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 08:24:08 +0100
Message-Id: <4E9FE8B6020000780005C661@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 08:24:06 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Allen M Kay" <allen.m.kay@intel.com>
References: <4E4E48360200007800051F65@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B5E@orsmsx505.amr.corp.intel.com>
	<4E8EC8A80200007800059E3B@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE70A446@orsmsx505.amr.corp.intel.com>
	<4E9458A5020000780005AB99@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301F19DB855@orsmsx505.amr.corp.intel.com>
	<4E9E8EA1020000780005C155@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301F1D86476@orsmsx505.amr.corp.intel.com>
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301F1D86476@orsmsx505.amr.corp.intel.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Kevin Tian <kevin.tian@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Haitao Shan <haitao.shan@intel.com>,
	Donald D Dugger <donald.d.dugger@intel.com>
Subject: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 20.10.11 at 00:20, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
>>  I reckon that the availability of device specifications in the ATSR =
data=20
> structure must be there for a purpose.
>> If that's not correct, then I'll certainly remove that code again, but =
I'd=20
> like to understand what that data is meant
>> to be for in that case.
>=20
> The atsr leverages the same PCI device scope is used for drhd and rmrr =
so=20
> device and function comes along with bus number.  As far as I can tell, =
we=20
> only  need to check the bus number for atsr.

So why does the capability to list individual devices then exist? And
why does it matter for DRHDs, but not for ATSRs?

>> Either we don't need to call it at all during discovery (which I =
doubt,=20
> since when the device is in use by Dom0, I
>> suppose having ATS enabled is still desirable or even required), or we =
have=20
> to potentially do it twice (remember
>> that older Dom0 kernels may fail to report all PCI devices to the=20
> hypervisor).
>=20
> I see, calling enable_ats_device() in pci_add_device() will also solve =
the=20
> case where MMCFG might not work until after dom0 is initialized.
>=20
> As I mentioned before, our QA team doesn't test ATS and ACS regularly.  =
It=20
> would good if you can coordinate with our QA team to test out these =
changes=20
> to make sure they don't break any ACS and ATS functionality.

How would I do that other than by getting the stuff committed and
wait for their bi-weekly(?) testing round?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 00:39:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 00:39:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGnE0-0006Qq-Q6; Thu, 20 Oct 2011 00:39:36 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGnDN-0006EF-V3
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 00:38:58 -0700
X-Env-Sender: paolo.bonzini@gmail.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319096333!36006918!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2877 invoked from network); 20 Oct 2011 07:38:54 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 07:38:54 -0000
Received: by gyg13 with SMTP id 13so3529970gyg.30
	for <xen-devel@lists.xensource.com>;
	Thu, 20 Oct 2011 00:38:53 -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=Eta6kfJKZrHa/2ZlEvbocV3XtVmTnsfpDv6bEFURsoc=;
	b=xX/cVwdOOTuW7DHq+NAPKNXU870zUcPiqLk5bPI2H3ePT/fdFuOfi/lqvPOHOvnR3Z
	YK9ZfSo0c5iQUJtjHDF/MNBd/kQkcvgqvvL7UC1LJ1jUymNGfLUb7SZVGAhgwtds+FcD
	KOAAcmRdAbzKuyVkaD40TtEQvsSDE9XIgQ72E=
Received: by 10.68.0.227 with SMTP id 3mr18467777pbh.48.1319096333039;
	Thu, 20 Oct 2011 00:38:53 -0700 (PDT)
Received: from yakj.usersys.redhat.com (93-34-218-143.ip51.fastwebnet.it.
	[93.34.218.143])
	by mx.google.com with ESMTPS id ml4sm16167441pbc.0.2011.10.20.00.38.49
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 20 Oct 2011 00:38:51 -0700 (PDT)
Message-ID: <4E9FD004.9050200@redhat.com>
Date: Thu, 20 Oct 2011 09:38:44 +0200
From: Paolo Bonzini <pbonzini@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: M A Young <m.a.young@durham.ac.uk>
References: <alpine.DEB.2.00.1110200002250.15667@vega-a.dur.ac.uk>
In-Reply-To: <alpine.DEB.2.00.1110200002250.15667@vega-a.dur.ac.uk>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com, Ian Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] Re: [PATCH 1 of 6] pygrub should check all GPT
	partitions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 patches are not enough to get "e" to work, but still an improvement 
of course, so:

Tested-by: Paolo Bonzini <pbonzini@redhat.com>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:11:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:11:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGnia-0000MB-Rr; Thu, 20 Oct 2011 01:11:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGni3-000099-Fv
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:10:39 -0700
X-Env-Sender: pbonzini@redhat.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1319098235!93183!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18281 invoked from network); 20 Oct 2011 08:10:36 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-6.tower-182.messagelabs.com with SMTP;
	20 Oct 2011 08:10:36 -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 p9K8AYUa013340
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK)
	for <xen-devel@lists.xensource.com>; Thu, 20 Oct 2011 04:10:34 -0400
Received: from yakj.usersys.redhat.com (ovpn-112-19.ams2.redhat.com
	[10.36.112.19])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9K8AWtF013944; Thu, 20 Oct 2011 04:10:33 -0400
From: Paolo Bonzini <pbonzini@redhat.com>
To: xen-devel@lists.xensource.com
Date: Thu, 20 Oct 2011 10:10:30 +0200
Message-Id: <bd1f7361d3d7f4c767af.1319096998@yakj.usersys.redhat.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: bd1f7361d3d7f4c767af21317fb4ec7ea1372f42
User-Agent: Mercurial-patchbomb/1.9.1
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
Cc: pbonzini@redhat.com
Subject: [Xen-devel] [PATCH] pygrub: do not overload RuntimeError for "no
	menu.lst found"
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: pbonzini@redhat.com

# HG changeset patch
# User Paolo Bonzini <pbonzini@redhat.com>
# Date 1319096986 -7200
# Node ID bd1f7361d3d7f4c767af21317fb4ec7ea1372f42
# Parent  1b110e895e285f43f14532e14c77597e54a0bcd2
pygrub will still try the next partition if run_grub exits with a
"real" error, thus hiding the root cause from the trace.  Defining
a separate exception for "no bootloader config file found" avoids
this.

diff --git a/tools/pygrub/src/pygrub b/tools/pygrub/src/pygrub
--- a/tools/pygrub/src/pygrub
+++ b/tools/pygrub/src/pygrub
@@ -29,6 +29,9 @@ import grub.ExtLinuxConf
 
 PYGRUB_VER = 0.6
 
+class NotFoundError(RuntimeError):
+    pass
+
 def enable_cursor(ison):
     if ison:
         val = 2
@@ -412,7 +412,7 @@ class Grub:
                 self.cf.filename = f
                 break
         if self.__dict__.get('cf', None) is None:
-            raise RuntimeError, "couldn't find bootloader config file in the image provided."
+            raise NotFoundError, "couldn't find bootloader config file in the image provided."
         f = fs.open_file(self.cf.filename)
         buf = f.read()
         del f
@@ -763,9 +766,9 @@ if __name__ == "__main__":
                 break
             fs = None
 
-        except:
+        except (IOError, NotFoundError):
             # IOErrors raised by fsimage.open
-            # RuntimeErrors raised by run_grub if no menu.lst present
+            # NotFoundError raised by run_grub if no menu.lst present
             fs = None
             continue
 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:17:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:17:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGnor-0000qH-H6; Thu, 20 Oct 2011 01:17:41 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGnoP-0000eR-JR
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:17:13 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319098610!49028291!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24029 invoked from network); 20 Oct 2011 08:16:50 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-8.tower-27.messagelabs.com with SMTP;
	20 Oct 2011 08:16:50 -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 A1309C56100;
	Thu, 20 Oct 2011 09:17:08 +0100 (BST)
Date: Thu, 20 Oct 2011 09:17:07 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] Compilation problems: oldstyle/xenlinux	 2.6.38,
	blktap2
Message-ID: <9CDBBD96252B4E94C26D8C1D@nimrod.local>
In-Reply-To: <4E9FE7D4020000780005C65E@nat28.tlf.novell.com>
References: <DFC59CD6B72571D62D342F37@Ximines.local>
	<4E9E988C020000780005C1BC@nat28.tlf.novell.com>
	<9F7D19DACCC3B803FCE8C1DB@nimrod.local>
	<4E9FE7D4020000780005C65E@nat28.tlf.novell.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>
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

Jan,

--On 20 October 2011 08:20:20 +0100 Jan Beulich <JBeulich@suse.com> wrote:

>>> Quite obviously your kernel will lack support for any of the tap2:
>>> protocols.
>>
>> Stupid question #3: If this kernel is running as dom0 for 3.3.x,
>> would it use any of the blktap2 stuff anyway? I'm working from
>> memory here but didn't that come after 3.3.1? And if I'm wrong, aren't
>> I going to want to build blktap2 (presumably not -new) as a built-in
>> (i.e. "y")? Perhaps I'm missing what tap2 does vs. tap.
>
> Indeed, tap2 appeared in 4.0.0 only, so with 3.3.x you should be
> safe to leave it off.

Thanks.

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:25:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:25:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGnwm-0001LB-Sf; Thu, 20 Oct 2011 01:25:52 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGnwL-00019W-EU
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:25:25 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319099119!347213!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7200 invoked from network); 20 Oct 2011 08:25:20 -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;
	20 Oct 2011 08:25:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8490789"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 08:25: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, 20 Oct 2011 09:25:19 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: M A Young <m.a.young@durham.ac.uk>
Date: Thu, 20 Oct 2011 09:25:19 +0100
In-Reply-To: <alpine.DEB.2.00.1110200002250.15667@vega-a.dur.ac.uk>
References: <alpine.DEB.2.00.1110200002250.15667@vega-a.dur.ac.uk>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319099119.3385.113.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 1 of 6] pygrub should check all GPT
	partitions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-20 at 00:03 +0100, M A Young wrote:
> On Fedora 16 the first GPT partition is a boot partition for grub2
> with
> the grub2 configuration in the second partition.
> Check all GPT partitions for grub configuration, not just the first.
> Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
> 
> --- a/tools/pygrub/src/pygrub   2011-10-16 20:58:02.000000000 +0100
> +++ b/tools/pygrub/src/pygrub   2011-10-16 20:59:52.000000000 +0100
> @@ -78,9 +78,17 @@
>  def get_fs_offset_gpt(file):
>      fd = os.open(file, os.O_RDONLY)
>      # assume the first partition is an EFI system partition.

Is this comment now inaccurate?

> -    os.lseek(fd, SECTOR_SIZE * 2, 0)
> +    os.lseek(fd, SECTOR_SIZE, 0)
>      buf = os.read(fd, 512)
> -    return struct.unpack("<Q", buf[32:40])[0] * SECTOR_SIZE
> +    partcount = struct.unpack("<L", buf[80:84])[0]
> +    partsize = struct.unpack("<L", buf[84:88])[0]
> +    i = partcount
> +    offsets = []
> +    while i>0:
> +        buf = os.read(fd, partsize)
> +        offsets.append(struct.unpack("<Q", buf[32:40])[0] *
> SECTOR_SIZE)
> +        i -= 1
> +    return offsets
>  
>  FDISK_PART_SOLARIS=0xbf
>  FDISK_PART_SOLARIS_OLD=0x82
> @@ -114,7 +122,9 @@
>                  continue # no solaris magic at that offset, ignore
> partition
>  
>          if type == FDISK_PART_GPT:
> -            offset = get_fs_offset_gpt(file)
> +            for offset in get_fs_offset_gpt(file):
> +                part_offs.append(offset)
> +            break
>  
>          # Active partition has 0x80 as the first byte.
>          # If active, prepend to front of list, otherwise append to
> back.
> 
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:26:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01: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 1RGnxq-0001j7-83; Thu, 20 Oct 2011 01:26:58 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGnwf-0001G6-AD
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:25:45 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319099117!49891900!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27925 invoked from network); 20 Oct 2011 08:25:17 -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;
	20 Oct 2011 08:25:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8490798"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 08:25:42 +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, 20 Oct 2011 09:25:42 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Date: Thu, 20 Oct 2011 09:25:41 +0100
In-Reply-To: <4E9FD004.9050200@redhat.com>
References: <alpine.DEB.2.00.1110200002250.15667@vega-a.dur.ac.uk>
	<4E9FD004.9050200@redhat.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319099141.3385.114.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	M A Young <m.a.young@durham.ac.uk>
Subject: [Xen-devel] Re: [PATCH 1 of 6] pygrub should check all GPT
	partitions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-20 at 08:38 +0100, Paolo Bonzini wrote:
> The patches are not enough to get "e" to work, but still an improvement 
> of course, so:

"e" ?

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:27:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:27:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGnyo-00026U-5C; Thu, 20 Oct 2011 01:27:58 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGnyM-0001uW-WB
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:27:31 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1319099247!354145!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22592 invoked from network); 20 Oct 2011 08:27:28 -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;
	20 Oct 2011 08:27:28 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8490955"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 08:27:27 +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, 20 Oct 2011 09:27:27 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: M A Young <m.a.young@durham.ac.uk>
Date: Thu, 20 Oct 2011 09:27:27 +0100
In-Reply-To: <alpine.DEB.2.00.1110200008540.15667@vega-a.dur.ac.uk>
References: <alpine.DEB.2.00.1110200008540.15667@vega-a.dur.ac.uk>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319099247.3385.115.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 4 of 6] parse configurations with submenus
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-20 at 00:09 +0100, M A Young wrote:
> The grub2 configuration file in Fedora 16 can have one or menuentrys
                                                           ^more ?
> in a submenu, with configuration of the form
> submenu "Xen 4.1" {
> menuentry ... {
> ...
> }
> }
> (this example occurs when the xen hypervisor is installed on the
> guest)
> Ignore the submenu line and the corresponding } 
> Signed-off-by: Michael Young <m.a.young@durham.ac.uk>

Acked-by: Ian Cambell <ian.campbell@citrix.com>

> 
> --- a/tools/pygrub/src/GrubConf.py      2011-10-17 21:26:48.000000000
> +0100
> +++ b/tools/pygrub/src/GrubConf.py      2011-10-17 21:46:00.000000000
> +0100
> @@ -368,6 +368,7 @@
>          in_function = False
>          img = None
>          title = ""
> +        menu_level=0
>          for l in lines:
>              l = l.strip()
>              # skip blank lines
> @@ -394,10 +395,18 @@
>                  img = []
>                  title = title_match.group(1)
>                  continue
> -            
> +
> +            if l.startswith("submenu"):
> +                menu_level += 1
> +                continue
> +
>              if l.startswith("}"):
>                  if img is None:
> -                    raise RuntimeError, "syntax error: closing brace
> without menuentry"
> +                    if menu_level > 0:
> +                        menu_level -= 1
> +                        continue
> +                    else:
> +                        raise RuntimeError, "syntax error: closing
> brace without menuentry"
>  
>                  self.add_image(Grub2Image(title, img))
>                  img = None
> 
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:28:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:28:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGnzl-0002Ui-LH; Thu, 20 Oct 2011 01:28:57 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGnzE-0002I8-8M
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:28:24 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319099300!941421!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22256 invoked from network); 20 Oct 2011 08:28:21 -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;
	20 Oct 2011 08:28:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8490964"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 08:27: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;
	Thu, 20 Oct 2011 09:27:49 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: M A Young <m.a.young@durham.ac.uk>
Date: Thu, 20 Oct 2011 09:27:48 +0100
In-Reply-To: <alpine.DEB.2.00.1110200005180.15667@vega-a.dur.ac.uk>
References: <alpine.DEB.2.00.1110200005180.15667@vega-a.dur.ac.uk>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319099268.3385.116.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 3 of 6] Allow GPT partition references
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-20 at 00:08 +0100, M A Young wrote:
> The grub2 configuration file in Fedora 16 can have GPT partition
> references
> like (hd0,gpt2) so remove the "gpt" string where necessary
> Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> --- a/tools/pygrub/src/GrubConf.py      2011-10-17 21:26:48.000000000
> +0100
> +++ b/tools/pygrub/src/GrubConf.py      2011-10-17 21:31:41.000000000
> +0100
> @@ -79,6 +79,8 @@
>          val = val.replace("(", "").replace(")", "")
>          if val[:5] == "msdos":
>              val = val[5:]
> +        if val[:3] == "gpt":
> +            val = val[3:]
>          self._part = int(val)
>      part = property(get_part, set_part)
>   


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:29:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:29:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGo0i-0002sX-Sg; Thu, 20 Oct 2011 01:29:56 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGnzI-0002IR-Ps
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:28:29 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319099300!941421!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22452 invoked from network); 20 Oct 2011 08:28:25 -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;
	20 Oct 2011 08:28:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8490980"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 08:28: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;
	Thu, 20 Oct 2011 09:28:07 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: M A Young <m.a.young@durham.ac.uk>
Date: Thu, 20 Oct 2011 09:28:06 +0100
In-Reply-To: <alpine.DEB.2.00.1110200003590.15667@vega-a.dur.ac.uk>
References: <alpine.DEB.2.00.1110200003590.15667@vega-a.dur.ac.uk>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319099286.3385.117.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 2 of 6] Fedora 16 uses /boot/grub2
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-20 at 00:04 +0100, M A Young wrote:
> Fedora 16 puts grub configuration files in /boot/grub2/grub.cfg so
> pygrub should look there as well
> Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> --- a/tools/pygrub/src/pygrub   2011-10-16 20:58:02.000000000 +0100
> +++ b/tools/pygrub/src/pygrub   2011-10-17 21:19:39.000000000 +0100
> @@ -386,7 +386,8 @@
>                             ["/efi/boot/elilo.conf", "/elilo.conf",])
>          else:
>              cfg_list = map(lambda x:
> (x,grub.GrubConf.Grub2ConfigFile),
> -                           ["/boot/grub/grub.cfg", "/grub/grub.cfg"])
> + \
> +                           ["/boot/grub/grub.cfg", "/grub/grub.cfg",
> +                            "/boot/grub2/grub.cfg",
> "/grub2/grub.cfg"]) + \
>                         map(lambda x:
> (x,grub.ExtLinuxConf.ExtLinuxConfigFile),
>                             ["/boot/isolinux/isolinux.cfg",
>                              "/boot/extlinux.conf"]) + \ 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:30:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:30:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGo1Y-0003Fo-Jg; Thu, 20 Oct 2011 01:30:48 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGnzk-0002Ti-Oc
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:28:57 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1319099333!945367!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 856 invoked from network); 20 Oct 2011 08:28:53 -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;
	20 Oct 2011 08:28:53 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8491012"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 08:28:53 +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, 20 Oct 2011 09:28:53 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: M A Young <m.a.young@durham.ac.uk>
Date: Thu, 20 Oct 2011 09:28:53 +0100
In-Reply-To: <alpine.DEB.2.00.1110200009450.15667@vega-a.dur.ac.uk>
References: <alpine.DEB.2.00.1110200009450.15667@vega-a.dur.ac.uk>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319099333.3385.118.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 5 of 6] parse configurations with set
 default="${saved_entry}" line
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-20 at 00:10 +0100, M A Young wrote:
> Fedora 16 grub2 configuration file can have lines like
> set default="${saved_entry}"
> and a string containing an integer is expected
> Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> --- a/tools/pygrub/src/GrubConf.py      2011-10-17 21:26:48.000000000
> +0100
> +++ b/tools/pygrub/src/GrubConf.py      2011-10-17 21:52:13.000000000
> +0100
> @@ -414,6 +414,8 @@
>                  
>              if self.commands.has_key(com):
>                  if self.commands[com] is not None:
> +                    if arg.strip() == "${saved_entry}":
> +                        arg = "0"
>                      setattr(self, self.commands[com], arg.strip())
>                  else:
>                      logging.info("Ignored directive %s" %(com,))
> 
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:32:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:32:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGo35-0003lV-VM; Thu, 20 Oct 2011 01:32:24 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGo0K-0002hy-CW
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:29:32 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319099369!97770!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17420 invoked from network); 20 Oct 2011 08:29:29 -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;
	20 Oct 2011 08:29:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8491038"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 08:29:29 +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, 20 Oct 2011 09:29:29 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: M A Young <m.a.young@durham.ac.uk>
Date: Thu, 20 Oct 2011 09:29:28 +0100
In-Reply-To: <alpine.DEB.2.00.1110200010470.15667@vega-a.dur.ac.uk>
References: <alpine.DEB.2.00.1110200010470.15667@vega-a.dur.ac.uk>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319099369.3385.119.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 6 of 6] example grub2 configuration file
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-20 at 00:11 +0100, M A Young wrote:
> Sample grub2 configuration file (some duplication removed) from Fedora
> 16
> with a xen hypervisor installed
> Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
Acked-by: Ian Campbell <ian.campbell@citrix.com>

> 
> --- /dev/null   2011-10-19 21:56:02.284851951 +0100
> +++ b/tools/pygrub/examples/fedora-16-with-xen.grub2    2011-10-19
> 20:52:02.000000000 +0100
> @@ -0,0 +1,112 @@
> +#
> +# DO NOT EDIT THIS FILE
> +#
> +# It is automatically generated by grub2-mkconfig using templates
> +# from /etc/grub.d and settings from /etc/default/grub
> +#
> +
> +### BEGIN /etc/grub.d/00_header ###
> +if [ -s $prefix/grubenv ]; then
> +  load_env
> +fi
> +set default="${saved_entry}"
> +if [ "${prev_saved_entry}" ]; then
> +  set saved_entry="${prev_saved_entry}"
> +  save_env saved_entry
> +  set prev_saved_entry=
> +  save_env prev_saved_entry
> +  set boot_once=true
> +fi
> +
> +function savedefault {
> +  if [ -z "${boot_once}" ]; then
> +    saved_entry="${chosen}"
> +    save_env saved_entry
> +  fi
> +}
> +
> +function load_video {
> +  insmod vbe
> +  insmod vga
> +  insmod video_bochs
> +  insmod video_cirrus
> +}
> +
> +set timeout=5
> +### END /etc/grub.d/00_header ###
> +
> +### BEGIN /etc/grub.d/10_linux ###
> +menuentry 'Fedora Linux, with Linux 3.1.0-0.rc9.git0.0.fc16.x86_64'
> --class fedora --class gnu-linux --class gnu --class os {
> +       load_video
> +       set gfxpayload=keep
> +       insmod gzio
> +       insmod part_gpt
> +       insmod ext2
> +       set root='(hd0,gpt2)'
> +       search --no-floppy --fs-uuid --set=root
> f14ea58a-c2b3-4348-8091-3ab733a2f49e
> +       echo    'Loading Linux 3.1.0-0.rc9.git0.0.fc16.x86_64 ...'
> +       linux   /vmlinuz-3.1.0-0.rc9.git0.0.fc16.x86_64
> root=/dev/mapper/VolGroup-lv_root ro rd.md=0 rd.dm=0
> rd.lvm.lv=VolGroup/lv_swap quiet SYSFONT=latarcyrheb-sun16 rhgb
> rd.lvm.lv=VolGroup/lv_root rd.luks=0  KEYTABLE=uk LANG=en_US.UTF-8 
> +       echo    'Loading initial ramdisk ...'
> +       initrd  /initramfs-3.1.0-0.rc9.git0.0.fc16.x86_64.img
> +}
> +menuentry 'Fedora Linux, with Linux 3.1.0-0.rc9.git0.0.fc16.x86_64
> (recovery mode)' --class fedora --class gnu-linux --class gnu --class
> os {
> +       load_video
> +       set gfxpayload=keep
> +       insmod gzio
> +       insmod part_gpt
> +       insmod ext2
> +       set root='(hd0,gpt2)'
> +       search --no-floppy --fs-uuid --set=root
> f14ea58a-c2b3-4348-8091-3ab733a2f49e
> +       echo    'Loading Linux 3.1.0-0.rc9.git0.0.fc16.x86_64 ...'
> +       linux   /vmlinuz-3.1.0-0.rc9.git0.0.fc16.x86_64
> root=/dev/mapper/VolGroup-lv_root ro single rd.md=0 rd.dm=0
> rd.lvm.lv=VolGroup/lv_swap quiet SYSFONT=latarcyrheb-sun16 rhgb
> rd.lvm.lv=VolGroup/lv_root rd.luks=0  KEYTABLE=uk LANG=en_US.UTF-8
> +       echo    'Loading initial ramdisk ...'
> +       initrd  /initramfs-3.1.0-0.rc9.git0.0.fc16.x86_64.img
> +}
> +### END /etc/grub.d/10_linux ###
> +
> +### BEGIN /etc/grub.d/20_linux_xen ###
> +submenu "Xen 4.1" {
> +menuentry 'Fedora Linux, with Xen 4.1 and Linux
> 3.1.0-0.rc9.git0.0.fc16.x86_64' --class fedora --class gnu-linux
> --class gnu --class os --class xen {
> +       insmod part_gpt
> +       insmod ext2
> +       set root='(hd0,gpt2)'
> +       search --no-floppy --fs-uuid --set=root
> f14ea58a-c2b3-4348-8091-3ab733a2f49e
> +       echo    'Loading Xen 4.1 ...'
> +       multiboot       /xen-4.1.gz placeholder  
> +       echo    'Loading Linux 3.1.0-0.rc9.git0.0.fc16.x86_64 ...'
> +       module  /vmlinuz-3.1.0-0.rc9.git0.0.fc16.x86_64 placeholder
> root=/dev/mapper/VolGroup-lv_root ro rd.md=0 rd.dm=0
> rd.lvm.lv=VolGroup/lv_swap quiet SYSFONT=latarcyrheb-sun16 rhgb
> rd.lvm.lv=VolGroup/lv_root rd.luks=0  KEYTABLE=uk LANG=en_US.UTF-8 
> +       echo    'Loading initial ramdisk ...'
> +       module  /initramfs-3.1.0-0.rc9.git0.0.fc16.x86_64.img
> +}
> +menuentry 'Fedora Linux, with Xen 4.1 and Linux
> 3.1.0-0.rc9.git0.0.fc16.x86_64 (recovery mode)' --class fedora --class
> gnu-linux --class gnu --class os --class xen {
> +       insmod part_gpt
> +       insmod ext2
> +       set root='(hd0,gpt2)'
> +       search --no-floppy --fs-uuid --set=root
> f14ea58a-c2b3-4348-8091-3ab733a2f49e
> +       echo    'Loading Xen 4.1 ...'
> +       multiboot       /xen-4.1.gz placeholder 
> +       echo    'Loading Linux 3.1.0-0.rc9.git0.0.fc16.x86_64 ...'
> +       module  /vmlinuz-3.1.0-0.rc9.git0.0.fc16.x86_64 placeholder
> root=/dev/mapper/VolGroup-lv_root ro single rd.md=0 rd.dm=0
> rd.lvm.lv=VolGroup/lv_swap quiet SYSFONT=latarcyrheb-sun16 rhgb
> rd.lvm.lv=VolGroup/lv_root rd.luks=0  KEYTABLE=uk LANG=en_US.UTF-8
> +       echo    'Loading initial ramdisk ...'
> +       module  /initramfs-3.1.0-0.rc9.git0.0.fc16.x86_64.img
> +}
> +}
> +### END /etc/grub.d/20_linux_xen ###
> +
> +### BEGIN /etc/grub.d/30_os-prober ###
> +### END /etc/grub.d/30_os-prober ###
> +
> +### BEGIN /etc/grub.d/40_custom ###
> +# This file provides an easy way to add custom menu entries.  Simply
> type the
> +# menu entries you want to add after this comment.  Be careful not to
> change
> +# the 'exec tail' line above.
> +### END /etc/grub.d/40_custom ###
> +
> +### BEGIN /etc/grub.d/41_custom ###
> +if [ -f  $prefix/custom.cfg ]; then
> +  source $prefix/custom.cfg;
> +fi
> +### END /etc/grub.d/41_custom ###
> +
> +### BEGIN /etc/grub.d/90_persistent ###
> +### END /etc/grub.d/90_persistent ###
> 
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:33:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:33:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGo40-00049Y-K8; Thu, 20 Oct 2011 01:33:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGo3P-0003tJ-Uy
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:32:44 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1319099560!947141!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3691 invoked from network); 20 Oct 2011 08:32:40 -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;
	20 Oct 2011 08:32:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8491146"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 08:32: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, 20 Oct 2011 09:32:40 +0100
Subject: Re: [Xen-devel] [PATCH] pygrub: do not overload RuntimeError for
	"no menu.lst found"
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Date: Thu, 20 Oct 2011 09:32:39 +0100
In-Reply-To: <bd1f7361d3d7f4c767af.1319096998@yakj.usersys.redhat.com>
References: <bd1f7361d3d7f4c767af.1319096998@yakj.usersys.redhat.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319099559.3385.121.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-10-20 at 09:10 +0100, Paolo Bonzini wrote:
> From: pbonzini@redhat.com
> 
> # HG changeset patch
> # User Paolo Bonzini <pbonzini@redhat.com>
> # Date 1319096986 -7200
> # Node ID bd1f7361d3d7f4c767af21317fb4ec7ea1372f42
> # Parent  1b110e895e285f43f14532e14c77597e54a0bcd2
> pygrub will still try the next partition if run_grub exits with a
> "real" error, thus hiding the root cause from the trace.  Defining
> a separate exception for "no bootloader config file found" avoids
> this.

Are all the other RuntimeError's ok or should we be defining a bunch of
more specific exceptions?

We need a signed-off-by for this change, per DCO:
http://wiki.xen.org/xenwiki/SubmittingXenPatches

Thanks,
Ian.

> 
> diff --git a/tools/pygrub/src/pygrub b/tools/pygrub/src/pygrub
> --- a/tools/pygrub/src/pygrub
> +++ b/tools/pygrub/src/pygrub
> @@ -29,6 +29,9 @@ import grub.ExtLinuxConf
>  
>  PYGRUB_VER = 0.6
>  
> +class NotFoundError(RuntimeError):
> +    pass
> +
>  def enable_cursor(ison):
>      if ison:
>          val = 2
> @@ -412,7 +412,7 @@ class Grub:
>                  self.cf.filename = f
>                  break
>          if self.__dict__.get('cf', None) is None:
> -            raise RuntimeError, "couldn't find bootloader config file in the image provided."
> +            raise NotFoundError, "couldn't find bootloader config file in the image provided."
>          f = fs.open_file(self.cf.filename)
>          buf = f.read()
>          del f
> @@ -763,9 +766,9 @@ if __name__ == "__main__":
>                  break
>              fs = None
>  
> -        except:
> +        except (IOError, NotFoundError):
>              # IOErrors raised by fsimage.open
> -            # RuntimeErrors raised by run_grub if no menu.lst present
> +            # NotFoundError raised by run_grub if no menu.lst present
>              fs = None
>              continue
>  
> 
> 
> 
> _______________________________________________
> 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 Oct 20 01:36:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:36:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGo70-0004ah-G3; Thu, 20 Oct 2011 01:36:26 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGo6Y-0004NP-0d
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:35:58 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319099729!49893880!1
X-Originating-IP: [129.234.248.2]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32712 invoked from network); 20 Oct 2011 08:35:30 -0000
Received: from hermes2.dur.ac.uk (HELO hermes2.dur.ac.uk) (129.234.248.2)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 20 Oct 2011 08:35:30 -0000
Received: from smtphost2.dur.ac.uk (smtphost2.dur.ac.uk [129.234.252.2])
	by hermes2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9K8Z7Uk013241;
	Thu, 20 Oct 2011 09:35:11 +0100
Received: from algedi.dur.ac.uk (algedi.dur.ac.uk [129.234.2.28])
	by smtphost2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9K8YmJm006893
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 09:34:48 +0100
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 p9K8YmmN008524;
	Thu, 20 Oct 2011 09:34:48 +0100 (BST)
Received: from localhost (dcl0may@localhost)
	by algedi.dur.ac.uk (8.14.4+Sun/8.14.4/Submit) with ESMTP id
	p9K8YmFx008521; Thu, 20 Oct 2011 09:34:48 +0100 (BST)
Date: Thu, 20 Oct 2011 09:34:48 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: Ian Campbell <Ian.Campbell@citrix.com>
In-Reply-To: <1319099119.3385.113.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.GSO.2.00.1110200931180.8505@algedi.dur.ac.uk>
References: <alpine.DEB.2.00.1110200002250.15667@vega-a.dur.ac.uk>
	<1319099119.3385.113.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.00 (GSO 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9K8Z7Uk013241
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH 1 of 6] pygrub should check all GPT
	partitions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 20 Oct 2011, Ian Campbell wrote:

> On Thu, 2011-10-20 at 00:03 +0100, M A Young wrote:
>> On Fedora 16 the first GPT partition is a boot partition for grub2
>> with
>> the grub2 configuration in the second partition.
>> Check all GPT partitions for grub configuration, not just the first.
>> Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
>>
>> --- a/tools/pygrub/src/pygrub   2011-10-16 20:58:02.000000000 +0100
>> +++ b/tools/pygrub/src/pygrub   2011-10-16 20:59:52.000000000 +0100
>> @@ -78,9 +78,17 @@
>>  def get_fs_offset_gpt(file):
>>      fd = os.open(file, os.O_RDONLY)
>>      # assume the first partition is an EFI system partition.
>
> Is this comment now inaccurate?

Yes. I haven't tested the case where the first partition is an EFI system 
partition though I think my changes would be harmless.

 	Michael Young

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:37:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:37:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGo7s-0004yM-Pi; Thu, 20 Oct 2011 01:37:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGo6r-0004Ul-GC
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:36:17 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-15.tower-21.messagelabs.com!1319099774!917337!1
X-Originating-IP: [129.234.248.2]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5977 invoked from network); 20 Oct 2011 08:36:14 -0000
Received: from hermes2.dur.ac.uk (HELO hermes2.dur.ac.uk) (129.234.248.2)
	by server-15.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 20 Oct 2011 08:36:14 -0000
Received: from smtphost2.dur.ac.uk (smtphost2.dur.ac.uk [129.234.252.2])
	by hermes2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9K8ZtW7013700;
	Thu, 20 Oct 2011 09:35:59 +0100
Received: from algedi.dur.ac.uk (algedi.dur.ac.uk [129.234.2.28])
	by smtphost2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9K8ZaO9006932
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 09:35:36 +0100
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 p9K8ZaYo008530;
	Thu, 20 Oct 2011 09:35:36 +0100 (BST)
Received: from localhost (dcl0may@localhost)
	by algedi.dur.ac.uk (8.14.4+Sun/8.14.4/Submit) with ESMTP id
	p9K8Zajb008527; Thu, 20 Oct 2011 09:35:36 +0100 (BST)
Date: Thu, 20 Oct 2011 09:35:35 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: Ian Campbell <Ian.Campbell@citrix.com>
In-Reply-To: <1319099247.3385.115.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.GSO.2.00.1110200935000.8505@algedi.dur.ac.uk>
References: <alpine.DEB.2.00.1110200008540.15667@vega-a.dur.ac.uk>
	<1319099247.3385.115.camel@zakaz.uk.xensource.com>
User-Agent: Alpine 2.00 (GSO 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9K8ZtW7013700
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: [PATCH 4 of 6] parse configurations with submenus
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 20 Oct 2011, Ian Campbell wrote:

> On Thu, 2011-10-20 at 00:09 +0100, M A Young wrote:
>> The grub2 configuration file in Fedora 16 can have one or menuentrys
>                                                           ^more ?

Yes. "more" is missing.

 	Michael Young

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:52:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:52:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGoMa-0005qc-Bz; Thu, 20 Oct 2011 01:52:32 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGoLo-0005dP-D7
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:51:44 -0700
X-Env-Sender: pbonzini@redhat.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319100700!358475!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6171 invoked from network); 20 Oct 2011 08:51:41 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-3.tower-216.messagelabs.com with SMTP;
	20 Oct 2011 08:51:41 -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 p9K8pchP023130
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 20 Oct 2011 04:51:38 -0400
Received: from yakj.usersys.redhat.com (ovpn-112-19.ams2.redhat.com
	[10.36.112.19])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9K8paVw019885; Thu, 20 Oct 2011 04:51:37 -0400
Message-ID: <4E9FE118.2090109@redhat.com>
Date: Thu, 20 Oct 2011 10:51:36 +0200
From: Paolo Bonzini <pbonzini@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] pygrub: do not overload RuntimeError for
	"no menu.lst found"
References: <bd1f7361d3d7f4c767af.1319096998@yakj.usersys.redhat.com>
	<1319099559.3385.121.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319099559.3385.121.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
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 10/20/2011 10:32 AM, Ian Campbell wrote:
> >  From:pbonzini@redhat.com
> >
> >  # HG changeset patch
> >  # User Paolo Bonzini<pbonzini@redhat.com>
> >  # Date 1319096986 -7200
> >  # Node ID bd1f7361d3d7f4c767af21317fb4ec7ea1372f42
> >  # Parent  1b110e895e285f43f14532e14c77597e54a0bcd2
> >  pygrub will still try the next partition if run_grub exits with a
> >  "real" error, thus hiding the root cause from the trace.  Defining
> >  a separate exception for "no bootloader config file found" avoids
> >  this.
>
> Are all the other RuntimeError's ok or should we be defining a bunch of
> more specific exceptions?

get_solaris_slice triggers RuntimeErrors which are eaten by the caller. 
  That's not too nice and could also be replaced by NotFoundError, but 
it does not hide as many possible errors as run_grub.

read_config triggers a RuntimeError if it cannot find the file image 
itself.  It is called via run_grub (which calls the Grub constructor), 
so it will become a hard failure after this patch.  This is intended; 
not finding the file image is very wrong.

Grub2ConfigFile triggers RuntimeErrors if it fails to parse the grub.cfg 
file (wrong menuentry nesting, missing braces, unexpected braces).  This 
is also called via run_grub and will become a hard failure.  The new 
behavior is better than looking for another boot partition, since the 
actual error is hidden and anyway it's very unlikely that there will be 
two boot partitions.

Other occurrences are only for the case of __name__ == "__main__", so 
they are unaffected by the patch.

> We need a signed-off-by for this change, per DCO:
> http://wiki.xen.org/xenwiki/SubmittingXenPatches

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

Shall I resend, or can you add it while applying?

Paolo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:53:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:53:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGoNg-0006H1-4e; Thu, 20 Oct 2011 01:53:40 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGoMq-0005uy-0h
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:52:49 -0700
X-Env-Sender: pbonzini@redhat.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319100764!100066!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25916 invoked from network); 20 Oct 2011 08:52:44 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-11.tower-182.messagelabs.com with SMTP;
	20 Oct 2011 08:52:44 -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 p9K8qQSm023306
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 20 Oct 2011 04:52:26 -0400
Received: from yakj.usersys.redhat.com (ovpn-112-19.ams2.redhat.com
	[10.36.112.19])
	by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9K8qOhK024178; Thu, 20 Oct 2011 04:52:25 -0400
Message-ID: <4E9FE148.6010003@redhat.com>
Date: Thu, 20 Oct 2011 10:52:24 +0200
From: Paolo Bonzini <pbonzini@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
References: <alpine.DEB.2.00.1110200002250.15667@vega-a.dur.ac.uk>
	<4E9FD004.9050200@redhat.com>
	<1319099141.3385.114.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319099141.3385.114.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	M A Young <m.a.young@durham.ac.uk>
Subject: [Xen-devel] Re: [PATCH 1 of 6] pygrub should check all GPT
	partitions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 10:25 AM, Ian Campbell wrote:
>> >  The patches are not enough to get "e" to work, but still an improvement
>> >  of course, so:
> "e" ?

Edit entry mode.  It fails with a curses error when I use it on the F16 
grub2.cfg, which is what prompted me to do the patch for NotFoundError.

Paolo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 01:54:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 01:54:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGoOb-0006fp-8L; Thu, 20 Oct 2011 01:54:37 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGoNi-0006Gz-OK
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 01:53:43 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1319100819!102527!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4909 invoked from network); 20 Oct 2011 08:53:39 -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;
	20 Oct 2011 08:53:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8491749"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 08:53:39 +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, 20 Oct 2011 09:53:39 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Date: Thu, 20 Oct 2011 09:53:38 +0100
In-Reply-To: <4E9FE148.6010003@redhat.com>
References: <alpine.DEB.2.00.1110200002250.15667@vega-a.dur.ac.uk>
	<4E9FD004.9050200@redhat.com>
	<1319099141.3385.114.camel@zakaz.uk.xensource.com>
	<4E9FE148.6010003@redhat.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319100818.3385.126.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	M A Young <m.a.young@durham.ac.uk>
Subject: [Xen-devel] Re: [PATCH 1 of 6] pygrub should check all GPT
	partitions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-20 at 09:52 +0100, Paolo Bonzini wrote:
> On 10/20/2011 10:25 AM, Ian Campbell wrote:
> >> >  The patches are not enough to get "e" to work, but still an improvement
> >> >  of course, so:
> > "e" ?
> 
> Edit entry mode.  It fails with a curses error when I use it on the F16 
> grub2.cfg, which is what prompted me to do the patch for NotFoundError.

Ah, right. Cool thanks.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 02:38:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 02:38:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGp5W-00081k-EZ; Thu, 20 Oct 2011 02:38:58 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGp4c-0007pC-0l
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 02:38:02 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-10.tower-21.messagelabs.com!1319103478!930696!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15795 invoked from network); 20 Oct 2011 09:37:59 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 09:37:59 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGp4W-000D7T-Bi; Thu, 20 Oct 2011 09:37:56 +0000
Date: Thu, 20 Oct 2011 10:37:56 +0100
From: Tim Deegan <tim@xen.org>
To: AP <apxeng@gmail.com>
Subject: Re: [Xen-devel] nested xen on domU?
Message-ID: <20111020093756.GA49983@ocelot.phlegethon.org>
References: <3DDB718A-0E09-486A-810D-05DF7D790C22@gmail.com>
	<CAGU+autfuFcgxCOSxyEPOtJ6ZQjnqb6nfbZzzJoUGZnbxONXmw@mail.gmail.com>
	<20111011081221.GA88076@ocelot.phlegethon.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111011081221.GA88076@ocelot.phlegethon.org>
User-Agent: Mutt/1.4.2.1i
Cc: xen-devel@lists.xensource.com, Eddie Dong <eddie.dong@intel.com>,
	Jun Nakajima <jun.nakajima@intel.com>, Hyo J Lee <hyo747@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

At 09:12 +0100 on 11 Oct (1318324341), Tim Deegan wrote:
> At 14:35 -0700 on 10 Oct (1318257332), AP wrote:
> > On Oct 9, 2011 9:11 AM, "Hyo J Lee" <hyo747@gmail.com> wrote:
> > >
> > > Hi all
> > >
> > > I wonder if there's any way that I can do nested xen on domU not dom0.
> > > This is what I plan.
> > >
> > >             | dom0_T| |domU1_T| |domU2_T|
> > >             ----------------------------- (domU1_B)
> > > |dom0_B|    |       xen top             |
> > > -----------------------------------------
> > > |             xen bottom                |
> > >
> > 
> > I tried this recently on an Intel platform and was unable to bring up
> > DomU1_T. The bios screen wouldn't come up. Do let me know if you have better
> > luck.
> 
> ISTR that the last time I tried it I ended up using KVM as the nested
> hypervisor (for other reasons).
> 
> Cc'ing the author and maintainer of the Intel nested-HVM code.
> 
> Eddie, can you help please?  Is this meant to work?

Ping?  Eddie?  Jun?  Anyone?

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 02:53:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 02: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 1RGpJJ-0000Hr-NZ; Thu, 20 Oct 2011 02:53:13 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGpIk-00005N-DC
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 02:52:38 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319104355!1707576!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11862 invoked from network); 20 Oct 2011 09:52:35 -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; 20 Oct 2011 09:52:35 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGpIg-000DB0-0y; Thu, 20 Oct 2011 09:52:34 +0000
Date: Thu, 20 Oct 2011 10:52:33 +0100
From: Tim Deegan <tim@xen.org>
To: Adin Scannell <adin@gridcentric.com>
Subject: Re: [Xen-devel] [PATCH 1/2] enable event channel wake-up for
	mem_event interfaces
Message-ID: <20111020095233.GB49983@ocelot.phlegethon.org>
References: <CAAJKtqoPDzEEY7xLQbFyOXrwNhBUJyV274LzRT-=0fPMbYjWkw@mail.gmail.com>
	<20111006110715.GC21091@ocelot.phlegethon.org>
	<CAAJKtqrNiYWteenCYv2-bgC6kPCyUmxihLP6TtDg-09ki=NgeQ@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: <CAAJKtqrNiYWteenCYv2-bgC6kPCyUmxihLP6TtDg-09ki=NgeQ@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

At 13:18 -0400 on 13 Oct (1318511910), Adin Scannell wrote:
> I'll rework the patches incorporating the feedback and resend the
> modified patches.
> 
> I've got a couple of quick notes, inline below.
> 
> >> @@ -135,16 +166,28 @@ void mem_event_put_request(struct domain
> >> +    /*
> >> +     * 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->domain_id == d->domain_id &&
> >> +        mem_event_ring_free(d, med) < d->max_vcpus )
> >> +        mem_event_mark_and_pause(current, med);
> >> +
> >
> > This idiom of comparing domain-ids cropped up in the earlier mem-event
> > patches and seems to be spreading, but the right check is just
> > (current->domain == d).
> >
> > Also: are there cases where current->domain != d?  If so, can't those cases
> > cause the ring to fill up?
> 
> Yes, I believe there are there are cases where a different domain
> (i.e. the domain w/ the device model) can map a page generating an
> event (mapping a paged-out page, writeable mappings of pages with
> non-writable access bits, etc.).  Unfortunately, we can't pause any
> vcpu in those cases.

True.

> This is something that I intend to revisit, as guaranteeing that
> absolutely no events are lost may be quite complicated (especially
> when there are certain events which are not repeatable). I'm
> considering the use of the new wait queues or other mechanisms to wait
> for the ring to clear up while in the same context.... but that is
> another sort of tricky.

Yep.  You could do what the timer code does in this situation and have a
linked list of events that didnt make it on to the queue (to be tidied
up later when there's space) but I can see that being messy too, and 
in extremis you might not be able to xmalloc another entry...

> > Is there a risk that under heavy mem-event loads vcpu 0 might starve
> > other vcpus entirely because they're never allowed to unpause here?
> 
> Unfortunately, yes.  With heavy mem event load (& a dom0 that isn't
> taking them off the ring fast enough).  I think there are two fair
> alternatives:
> 1) Unpausing a vcpu at random.
> 2) Waiting until the ring reaches a watermark and unpausing all vCPUs.
> 
> Any thoughts on these?

3) always start the scan from a different place (either a round-robin or
from the last-serviced-vcpu + 1)?

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 Oct 20 03:04:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:04:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGpUF-0000vJ-Hg; Thu, 20 Oct 2011 03:04:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGpQG-0000eQ-RG
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:00:26 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319104821!957972!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12947 invoked from network); 20 Oct 2011 10:00:21 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 10:00:21 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGpQB-000DDc-Ns; Thu, 20 Oct 2011 10:00:19 +0000
Date: Thu, 20 Oct 2011 11:00:19 +0100
From: Tim Deegan <tim@xen.org>
To: Adin Scannell <adin@gridcentric.com>
Subject: Re: [Xen-devel] [PATCH RFC] memory sharing questions
Message-ID: <20111020100019.GC49983@ocelot.phlegethon.org>
References: <CAAJKtqq0Qoxh1KazXXdZaVb1qZ6pcP1LNXk1bD1tgsKEV7g_iQ@mail.gmail.com>
	<20110930224636.GC62963@ocelot.phlegethon.org>
	<CAAJKtqoQJcu4OyQ+gG3vR4f-pV-wgqEqr2K+WsAQLf-_t91iZw@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAAJKtqoQJcu4OyQ+gG3vR4f-pV-wgqEqr2K+WsAQLf-_t91iZw@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

At 13:29 -0400 on 13 Oct (1318512546), Adin Scannell wrote:
> Ah -- I understand.  This race condition (and the handle) makes sense
> in the context of multiple callers. I still feel that the constant
> storing and looking up of handles in a data structure is likely to be
> problematic however (other than possibly a simple list for
> debugging/audit).  What if the interface were changed to something
> like the following:
> 
> handle_t mem_sharing_nominate(mfn_t mfn);
> int mem_sharing_page_share(mfn_t one, handle_t one_version, mfn_t two,
> handle_t two_handle);
> 
> In this case, the handle can be the same global counter as per before,
> except it can be stored in a saved structure alongside the associated
> domain gfns and used only for a safety check.

Sounds sane to me.  If the handle/version is still globally unique then
this should work just fine.

As I think you said in a following email, for HVM guests the frame
numbers would have to be domid-gfn pairs rather than MFNs.  That makes
it a bit tricky if the original owner dies but other domains are sharing
the page.  Maybe nominate needs to return an MFN, but I don't like that
very much becuase it encourages tools writers to use MFNs with HVM
guests.

How about: keep the single opaque handle, but make it internally be MFN
(or rather, pdx) plus version, for a 128-bit ID?

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 03:14:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:14:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGpdn-0001dk-L6; Thu, 20 Oct 2011 03:14:24 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGpcw-0001R0-EH
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:13:30 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319105607!359893!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24942 invoked from network); 20 Oct 2011 10:13:27 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-4.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 10:13:27 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGpcq-000DG1-2k; Thu, 20 Oct 2011 10:13:24 +0000
Date: Thu, 20 Oct 2011 11:13:24 +0100
From: Tim Deegan <tim@xen.org>
To: Andres Lagar Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] Re: Re: mapping problems in xenpaging
Message-ID: <20111020101324.GD49983@ocelot.phlegethon.org>
References: <CADzFZPsJ2--PQCVH1QGJ-L1q5k4bokBrZeaaAt=BSD7QU9cbOA@mail.gmail.com>
	<20111010092111.GB31800@ocelot.phlegethon.org>
	<CADzFZPscgJ6TWXNjyeEjbOnMrEpCE7zS6BTGxfJ+yibpz-Ds_w@mail.gmail.com>
	<20111013150229.GJ44937@ocelot.phlegethon.org>
	<CADzFZPusJN7e2jG147q68RA3ZQ1PGs-xFNk+jjLRDAR7xboVjQ@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CADzFZPusJN7e2jG147q68RA3ZQ1PGs-xFNk+jjLRDAR7xboVjQ@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Cc: zhen shi <bickys1986@gmail.com>, Olaf Hering <olaf@aepfle.de>,
	Keir Fraser <keir.xen@gmail.com>, xen-devel@lists.xensource.com,
	Adin Scannell <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 13:59 -0400 on 13 Oct (1318514390), Andres Lagar Cavilla wrote:
> Good stuff Tim, let me summarize:
> 
> 
> - The key is to obtain exclusive access to a p2m entry, or range [gfn,
> gfn + 1<<order). This exclusive access lasts beyond the actual lookup,
> until the caller is finished with modifications, to prevent the p2m
> mapping changing underfoot.

Yes.  It only excludes concurrent updates, not concurrent lookups, so in
that way it's effectively a per-range MRSW lock, implemented with
refcounts.  (I feel like I'm working around in a circle to your first
suggestion!)

> - bits for either fine-grain locks or refcounts need to be set aside.
> Stuffing those bits in actual p2m entries will be very error prone/not
> possible, given all existing implementations (NPT+IOMMU, 32bit, etc).
> So, we're stuck with extra space overhead for a fine-grained p2m
> concurrency control structure.

Yes.

> - Unless the recount collapses into the page_info struct. Even then
> there is a critical section "get p2m_entry then get_page" that needs
> to execute atomically.

True, and since you only get the page struct after the p2m lookup that's
tricky.

> - foreign mappings can block p2m actions for arbitrarily long. This
> doesn't usually happen, but the risk is latent. This is "hard to
> solve", for now.

Yes.

> question 1: I still don't see the need for refcounts. If you want to
> prevent changes underfoot, you need to lock the entry, and that's it.
> In all the cases you explained, somebody would have to wait until the
> refcount on the entry drops to reflect they are the only holder. This
> is akin to being locked out.

It should be possible for multiple clients to look up and use the same
p2m entry (e.g. Qemu having a mapping of a guest frame shouldn't stop
x86_emulate from reading or writing that memory, though both of those
should stop any concurrent p2m update to the gfn).

> question 2: although internal hypervisor code paths do not seem to act
> on unaligned p2m ranges, external calls (e.g. MEMF_populate_on_demand)
> could possibly pass unaligned ranges. These complicate fine-grain
> concurrency. Should we fail those? With so many toolstacks out there,
> I feel very hesitant.

Hmm.  Most operations that touch large numbers of frames already have a
partial-success return path (or at least stop-and-retry) to avoid
long-running operations starving timers, softirqs etc.  If there are
paths that don't do this, maybe they should. :)

> question 3: is there any way to know a priori the max gfn a domain
> will have? Can we pre-allocate the concurrency control structure as
> opposed to demand allocating it?

Not any sensible maximum, no, and gfn sapace can be sparse so it might
not make sense to allocate it all up front anyway.  But the p2m
structures themselves are allocated on demand so the extra bookkeeping
space can run alongside them.

> suggestion 1: bake exclusive access in the current calls. A p2m
> lookup, followed by a p2m set_entry, delimit a critical section for
> that range of p2m mappings. p2m lookups without closing set_entry will
> have to issue a call to drop exclusive access on the range of
> mappings.

As I said above, it shouldn't be exclusive with other _lookups_, only
with updates.  But I have no objection to adding a flag to the lookup
function that lets the caller choose "lock for update" vs "lock for
lookup".

> suggestion 2: limit fine granularity (if locking, not refcounting), to
> 2MB superpages. Saves space. 512 neighbours can surely coexist without
> locking each other out :)

Sure; if that turns out to cause a lot of contention it can be changed
later. 

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 Oct 20 03:29:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:29:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGpsZ-0002HJ-A0; Thu, 20 Oct 2011 03:29:39 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGprX-00024N-6p
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:28:35 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319106511!375636!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30246 invoked from network); 20 Oct 2011 10:28:32 -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;
	20 Oct 2011 10:28:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8494519"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 10:28:24 +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, 20 Oct 2011 11:28:24 +0100
Date: Thu, 20 Oct 2011 11:28:34 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
In-Reply-To: <1319061927-5967-1-git-send-email-dgdegra@tycho.nsa.gov>
Message-ID: <alpine.DEB.2.00.1110201128130.3519@kaball-desktop>
References: <1319061927-5967-1-git-send-email-dgdegra@tycho.nsa.gov>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.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 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!

> ---
>  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

From xen-devel-bounces@lists.xensource.com Thu Oct 20 03:33:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:33:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGpw1-0002pu-OE; Thu, 20 Oct 2011 03:33:13 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGpva-0002da-4C
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:32:46 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319106738!49916049!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17666 invoked from network); 20 Oct 2011 10:32:18 -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; 20 Oct 2011 10:32:18 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGpvW-000DJr-PE; Thu, 20 Oct 2011 10:32:42 +0000
Date: Thu, 20 Oct 2011 11:32:42 +0100
From: Tim Deegan <tim@xen.org>
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 0 of 3] xenpaging fixes for xen-unstable
Message-ID: <20111020103242.GE49983@ocelot.phlegethon.org>
References: <patchbomb.1319034200@probook.site>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <patchbomb.1319034200@probook.site>
User-Agent: Mutt/1.4.2.1i
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

At 16:23 +0200 on 19 Oct (1319041400), Olaf Hering wrote:
> 
> The following changes for xenpaging add checking for the p2mt in the page-in
> path to make the functions more robust, add some documentation to each
> p2m_mem_paging function, and disable paging in a PoD guest.
> 
> Please review and apply.

Applied, thanks.  Double thanks for adding documentation!

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 03:40:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:40:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGq2a-0003K6-Qs; Thu, 20 Oct 2011 03:40:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGq25-000389-Uo
	for Xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:39:30 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319107155!42471673!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20208 invoked from network); 20 Oct 2011 10:39:15 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 10:39:15 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGq1o-000DLi-Tb; Thu, 20 Oct 2011 10:39:12 +0000
Date: Thu, 20 Oct 2011 11:39:12 +0100
From: Tim Deegan <tim@xen.org>
To: Mukesh Rathor <mukesh.rathor@oracle.com>
Subject: Re: [Xen-devel] Re: HYBRID: gnttab_map() to map shared frames..
Message-ID: <20111020103912.GF49983@ocelot.phlegethon.org>
References: <20111013181853.15381ef5@mantra.us.oracle.com>
	<CABDA859.22DA3%keir.xen@gmail.com>
	<20111017191810.28876947@mantra.us.oracle.com>
	<1318925582.16132.31.camel@zakaz.uk.xensource.com>
	<20111018121727.27a3f03c@mantra.us.oracle.com>
	<1319013573.3385.60.camel@zakaz.uk.xensource.com>
	<20111019192918.627bfe70@mantra.us.oracle.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111019192918.627bfe70@mantra.us.oracle.com>
User-Agent: Mutt/1.4.2.1i
Cc: Keir Fraser <keir.xen@gmail.com>,
	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Jeremy Fitzhardinge <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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

At 19:29 -0700 on 19 Oct (1319052558), Mukesh Rathor wrote:
> > What about using PFNs from right at the top, i.e. right up near
> > 0xffffffff? I don't think there's any particular reason these special
> > PFNs need to be contiguous with the "regular" ones. This would limit
> > the total amount of RAM you could give a hybrid guest, but not by
> > much.
> 
> Yeah, I dinkered around a bit with e820 and realized it would be
> migration headache, so just decided to do this. I allocate pfn's near
> 0xffffffff and map it. Things are fine, I see all page table entries
> just fine, the entry is put into the p2m also via ept_set_entry, but
> for some reason it's taking fault on accessing shared[0] with error
> code 0xb that doesn't make sense. Even the mfn in xen is writable
> page. 
> 
> PGD 77895067 PUD 77896067 PMD 77897067 PTE 80000ffffffdf063

0xB means you've got a reserved bit set.  Is 0xfff_fffdf000 above the 
number of supported addressing bits on your CPU, by any chance?

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 Oct 20 03:46:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:46:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGq94-00040r-2T; Thu, 20 Oct 2011 03:46:42 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGq8H-0003nf-FA
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:45:53 -0700
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319107537!42472805!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7782 invoked from network); 20 Oct 2011 10:45:38 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-11.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 10:45:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315195200"; d="scan'208";a="18393781"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 06:45:48 -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; Thu, 20 Oct 2011 06:45:48 -0400
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 p9KAjj4Y021749;
	Thu, 20 Oct 2011 03:45:46 -0700
From: David Vrabel <david.vrabel@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 20 Oct 2011 11:45:15 +0100
Message-ID: <1319107519-2253-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: Andrew Morton <akpm@linux-foundation.org>, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org, David Vrabel <david.vrabel@citrix.com>
Subject: [Xen-devel] [PATCH 0/4] xen: map foreign pages for shared rings by
	updating the PTEs directly
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 series of patches allows the vmalloc_sync_all() to be removed
from alloc_vm_area() by getting the hypervisor to update the PTEs (in
init_mm) directly rather than having the hypervisor look in the
current page tables to find the PTEs.

Once the hypervisor has updated the PTEs, the normal mechanism of
syncing the page tables after a fault works as expected.

This mechanism doesn't currently work on the ia64 port as that does
not support the GNTMAP_contains_pte flag.

Andrew, patch 4 (xen: map foreign pages for shared rings by updating
the PTEs directly) depends on patch 1 so it's probably best to go via
Konrad's Xen tree with your acked-by.

David

David Vrabel (4):
  xen: use generic functions instead of xen_{alloc,free}_vm_area()
  block: xen-blkback: use API provided by xenbus module to map rings
  net: xen-netback: use API provided by xenbus module to map rings
  xen: map foreign pages for shared rings by updating the PTEs directly

 arch/ia64/include/asm/xen/grant_table.h |   29 -----------
 arch/ia64/xen/grant-table.c             |   62 ------------------------
 arch/x86/include/asm/xen/grant_table.h  |    7 ---
 arch/x86/xen/grant-table.c              |    2 +-
 drivers/block/xen-blkback/common.h      |    5 +--
 drivers/block/xen-blkback/xenbus.c      |   54 +++------------------
 drivers/net/xen-netback/common.h        |   11 ++--
 drivers/net/xen-netback/netback.c       |   80 +++++++------------------------
 drivers/xen/xenbus/xenbus_client.c      |   15 ++++--
 include/linux/vmalloc.h                 |    2 +-
 include/xen/grant_table.h               |    1 -
 mm/vmalloc.c                            |   27 +++++-----
 12 files changed, 55 insertions(+), 240 deletions(-)
 delete mode 100644 arch/ia64/include/asm/xen/grant_table.h
 delete mode 100644 arch/x86/include/asm/xen/grant_table.h

-- 
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 Oct 20 03:47:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:47:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGqAB-0004Ok-Pb; Thu, 20 Oct 2011 03:47:51 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGq8N-0003o7-Jw
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:46:00 -0700
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319107525!53619348!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30609 invoked from network); 20 Oct 2011 10:45:26 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 10:45:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315195200"; d="scan'208";a="167577550"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 06:45:55 -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; Thu, 20 Oct 2011 06:45:55 -0400
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 p9KAjj4Z021749;
	Thu, 20 Oct 2011 03:45:53 -0700
From: David Vrabel <david.vrabel@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 20 Oct 2011 11:45:16 +0100
Message-ID: <1319107519-2253-2-git-send-email-david.vrabel@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
References: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	David Vrabel <david.vrabel@citrix.com>
Subject: [Xen-devel] [PATCH 1/4] xen: use generic functions instead of
	xen_{alloc, free}_vm_area()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Replace calls to the Xen-specific xen_alloc_vm_area() and
xen_free_vm_area() functions with the generic equivalent
(alloc_vm_area() and free_vm_area()).

On x86, these were identical already.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
 arch/ia64/include/asm/xen/grant_table.h |   29 --------------
 arch/ia64/xen/grant-table.c             |   62 -------------------------------
 arch/x86/include/asm/xen/grant_table.h  |    7 ---
 arch/x86/xen/grant-table.c              |    2 +-
 drivers/xen/xenbus/xenbus_client.c      |    6 +-
 include/xen/grant_table.h               |    1 -
 6 files changed, 4 insertions(+), 103 deletions(-)
 delete mode 100644 arch/ia64/include/asm/xen/grant_table.h
 delete mode 100644 arch/x86/include/asm/xen/grant_table.h

diff --git a/arch/ia64/include/asm/xen/grant_table.h b/arch/ia64/include/asm/xen/grant_table.h
deleted file mode 100644
index 2b1fae0..0000000
--- a/arch/ia64/include/asm/xen/grant_table.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/******************************************************************************
- * arch/ia64/include/asm/xen/grant_table.h
- *
- * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
- *                    VA Linux Systems Japan K.K.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 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 _ASM_IA64_XEN_GRANT_TABLE_H
-#define _ASM_IA64_XEN_GRANT_TABLE_H
-
-struct vm_struct *xen_alloc_vm_area(unsigned long size);
-void xen_free_vm_area(struct vm_struct *area);
-
-#endif /* _ASM_IA64_XEN_GRANT_TABLE_H */
diff --git a/arch/ia64/xen/grant-table.c b/arch/ia64/xen/grant-table.c
index 48cca37..c182813 100644
--- a/arch/ia64/xen/grant-table.c
+++ b/arch/ia64/xen/grant-table.c
@@ -31,68 +31,6 @@
 
 #include <asm/xen/hypervisor.h>
 
-struct vm_struct *xen_alloc_vm_area(unsigned long size)
-{
-	int order;
-	unsigned long virt;
-	unsigned long nr_pages;
-	struct vm_struct *area;
-
-	order = get_order(size);
-	virt = __get_free_pages(GFP_KERNEL, order);
-	if (virt == 0)
-		goto err0;
-	nr_pages = 1 << order;
-	scrub_pages(virt, nr_pages);
-
-	area = kmalloc(sizeof(*area), GFP_KERNEL);
-	if (area == NULL)
-		goto err1;
-
-	area->flags = VM_IOREMAP;
-	area->addr = (void *)virt;
-	area->size = size;
-	area->pages = NULL;
-	area->nr_pages = nr_pages;
-	area->phys_addr = 0;	/* xenbus_map_ring_valloc uses this field!  */
-
-	return area;
-
-err1:
-	free_pages(virt, order);
-err0:
-	return NULL;
-}
-EXPORT_SYMBOL_GPL(xen_alloc_vm_area);
-
-void xen_free_vm_area(struct vm_struct *area)
-{
-	unsigned int order = get_order(area->size);
-	unsigned long i;
-	unsigned long phys_addr = __pa(area->addr);
-
-	/* This area is used for foreign page mappping.
-	 * So underlying machine page may not be assigned. */
-	for (i = 0; i < (1 << order); i++) {
-		unsigned long ret;
-		unsigned long gpfn = (phys_addr >> PAGE_SHIFT) + i;
-		struct xen_memory_reservation reservation = {
-			.nr_extents   = 1,
-			.address_bits = 0,
-			.extent_order = 0,
-			.domid        = DOMID_SELF
-		};
-		set_xen_guest_handle(reservation.extent_start, &gpfn);
-		ret = HYPERVISOR_memory_op(XENMEM_populate_physmap,
-					   &reservation);
-		BUG_ON(ret != 1);
-	}
-	free_pages((unsigned long)area->addr, order);
-	kfree(area);
-}
-EXPORT_SYMBOL_GPL(xen_free_vm_area);
-
-
 /****************************************************************************
  * grant table hack
  * cmd: GNTTABOP_xxx
diff --git a/arch/x86/include/asm/xen/grant_table.h b/arch/x86/include/asm/xen/grant_table.h
deleted file mode 100644
index fdbbb45..0000000
--- a/arch/x86/include/asm/xen/grant_table.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _ASM_X86_XEN_GRANT_TABLE_H
-#define _ASM_X86_XEN_GRANT_TABLE_H
-
-#define xen_alloc_vm_area(size)	alloc_vm_area(size)
-#define xen_free_vm_area(area)	free_vm_area(area)
-
-#endif /* _ASM_X86_XEN_GRANT_TABLE_H */
diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index 49ba9b5..6bbfd7a 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 =
-			xen_alloc_vm_area(PAGE_SIZE * max_nr_gframes);
+			alloc_vm_area(PAGE_SIZE * max_nr_gframes);
 		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 cdacf92..229d3ad 100644
--- a/drivers/xen/xenbus/xenbus_client.c
+++ b/drivers/xen/xenbus/xenbus_client.c
@@ -443,7 +443,7 @@ int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
 
 	*vaddr = NULL;
 
-	area = xen_alloc_vm_area(PAGE_SIZE);
+	area = alloc_vm_area(PAGE_SIZE);
 	if (!area)
 		return -ENOMEM;
 
@@ -453,7 +453,7 @@ int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
 		BUG();
 
 	if (op.status != GNTST_okay) {
-		xen_free_vm_area(area);
+		free_vm_area(area);
 		xenbus_dev_fatal(dev, op.status,
 				 "mapping in shared page %d from domain %d",
 				 gnt_ref, dev->otherend_id);
@@ -552,7 +552,7 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
 		BUG();
 
 	if (op.status == GNTST_okay)
-		xen_free_vm_area(area);
+		free_vm_area(area);
 	else
 		xenbus_dev_error(dev, op.status,
 				 "unmapping page at handle %d error %d",
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
index b1fab6b..8a8bb76 100644
--- a/include/xen/grant_table.h
+++ b/include/xen/grant_table.h
@@ -43,7 +43,6 @@
 #include <xen/interface/grant_table.h>
 
 #include <asm/xen/hypervisor.h>
-#include <asm/xen/grant_table.h>
 
 #include <xen/features.h>
 
-- 
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 Oct 20 03:49:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:49:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGqBm-0004tX-RY; Thu, 20 Oct 2011 03:49:30 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGq8e-0003t5-Lw
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:46:17 -0700
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1319107572!375113!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10258 invoked from network); 20 Oct 2011 10:46:13 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-12.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 10:46:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315195200"; d="scan'208";a="18393808"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 06:46:12 -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; Thu, 20 Oct 2011 06:46:11 -0400
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 p9KAjj4a021749;
	Thu, 20 Oct 2011 03:46:10 -0700
From: David Vrabel <david.vrabel@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 20 Oct 2011 11:45:17 +0100
Message-ID: <1319107519-2253-3-git-send-email-david.vrabel@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
References: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	David Vrabel <david.vrabel@citrix.com>
Subject: [Xen-devel] [PATCH 2/4] block: xen-blkback: use API provided by
	xenbus module to map rings
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 xenbus module provides xenbus_map_ring_valloc() and
xenbus_map_ring_vfree().  Use these to map the ring pages granted by
the frontend.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
---
 drivers/block/xen-blkback/common.h |    5 +--
 drivers/block/xen-blkback/xenbus.c |   54 ++++-------------------------------
 2 files changed, 8 insertions(+), 51 deletions(-)

diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
index 00c57c9..7ec0e88 100644
--- a/drivers/block/xen-blkback/common.h
+++ b/drivers/block/xen-blkback/common.h
@@ -139,7 +139,7 @@ struct xen_blkif {
 	/* Comms information. */
 	enum blkif_protocol	blk_protocol;
 	union blkif_back_rings	blk_rings;
-	struct vm_struct	*blk_ring_area;
+	void			*blk_ring;
 	/* The VBD attached to this interface. */
 	struct xen_vbd		vbd;
 	/* Back pointer to the backend_info. */
@@ -163,9 +163,6 @@ struct xen_blkif {
 	int			st_wr_sect;
 
 	wait_queue_head_t	waiting_to_free;
-
-	grant_handle_t		shmem_handle;
-	grant_ref_t		shmem_ref;
 };
 
 
diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index 5fd2010..69233dd 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -120,38 +120,6 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid)
 	return blkif;
 }
 
-static int map_frontend_page(struct xen_blkif *blkif, unsigned long shared_page)
-{
-	struct gnttab_map_grant_ref op;
-
-	gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
-			  GNTMAP_host_map, shared_page, blkif->domid);
-
-	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-		BUG();
-
-	if (op.status) {
-		DPRINTK("Grant table operation failure !\n");
-		return op.status;
-	}
-
-	blkif->shmem_ref = shared_page;
-	blkif->shmem_handle = op.handle;
-
-	return 0;
-}
-
-static void unmap_frontend_page(struct xen_blkif *blkif)
-{
-	struct gnttab_unmap_grant_ref op;
-
-	gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
-			    GNTMAP_host_map, blkif->shmem_handle);
-
-	if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-		BUG();
-}
-
 static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
 			 unsigned int evtchn)
 {
@@ -161,35 +129,29 @@ static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
 	if (blkif->irq)
 		return 0;
 
-	blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE);
-	if (!blkif->blk_ring_area)
-		return -ENOMEM;
-
-	err = map_frontend_page(blkif, shared_page);
-	if (err) {
-		free_vm_area(blkif->blk_ring_area);
+	err = xenbus_map_ring_valloc(blkif->be->dev, shared_page, &blkif->blk_ring);
+	if (err < 0)
 		return err;
-	}
 
 	switch (blkif->blk_protocol) {
 	case BLKIF_PROTOCOL_NATIVE:
 	{
 		struct blkif_sring *sring;
-		sring = (struct blkif_sring *)blkif->blk_ring_area->addr;
+		sring = (struct blkif_sring *)blkif->blk_ring;
 		BACK_RING_INIT(&blkif->blk_rings.native, sring, PAGE_SIZE);
 		break;
 	}
 	case BLKIF_PROTOCOL_X86_32:
 	{
 		struct blkif_x86_32_sring *sring_x86_32;
-		sring_x86_32 = (struct blkif_x86_32_sring *)blkif->blk_ring_area->addr;
+		sring_x86_32 = (struct blkif_x86_32_sring *)blkif->blk_ring;
 		BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, PAGE_SIZE);
 		break;
 	}
 	case BLKIF_PROTOCOL_X86_64:
 	{
 		struct blkif_x86_64_sring *sring_x86_64;
-		sring_x86_64 = (struct blkif_x86_64_sring *)blkif->blk_ring_area->addr;
+		sring_x86_64 = (struct blkif_x86_64_sring *)blkif->blk_ring;
 		BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, PAGE_SIZE);
 		break;
 	}
@@ -201,8 +163,7 @@ static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
 						    xen_blkif_be_int, 0,
 						    "blkif-backend", blkif);
 	if (err < 0) {
-		unmap_frontend_page(blkif);
-		free_vm_area(blkif->blk_ring_area);
+		xenbus_unmap_ring_vfree(blkif->be->dev, blkif->blk_ring);
 		blkif->blk_rings.common.sring = NULL;
 		return err;
 	}
@@ -228,8 +189,7 @@ static void xen_blkif_disconnect(struct xen_blkif *blkif)
 	}
 
 	if (blkif->blk_rings.common.sring) {
-		unmap_frontend_page(blkif);
-		free_vm_area(blkif->blk_ring_area);
+		xenbus_unmap_ring_vfree(blkif->be->dev, blkif->blk_ring);
 		blkif->blk_rings.common.sring = NULL;
 	}
 }
-- 
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 Oct 20 03:50:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:50:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGqCo-0005HJ-4P; Thu, 20 Oct 2011 03:50:34 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGq8x-0003y3-K1
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:46:35 -0700
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1319107590!29685081!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24108 invoked from network); 20 Oct 2011 10:46:32 -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;
	20 Oct 2011 10:46:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315195200"; d="scan'208";a="167577629"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 06:46:30 -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; Thu, 20 Oct 2011 06:46:30 -0400
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 p9KAjj4b021749;
	Thu, 20 Oct 2011 03:46:28 -0700
From: David Vrabel <david.vrabel@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 20 Oct 2011 11:45:18 +0100
Message-ID: <1319107519-2253-4-git-send-email-david.vrabel@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
References: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: netdev@vger.kernel.org, "David S . Miller" <davem@davemloft.net>,
	xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	David Vrabel <david.vrabel@citrix.com>
Subject: [Xen-devel] [PATCH 3/4] net: xen-netback: use API provided by
	xenbus module to map rings
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 xenbus module provides xenbus_map_ring_valloc() and
xenbus_map_ring_vfree().  Use these to map the Tx and Rx ring pages
granted by the frontend.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
---
Dave, this is a standalone patch and can be applied independently of
the rest of the series.

 drivers/net/xen-netback/common.h  |   11 ++---
 drivers/net/xen-netback/netback.c |   80 ++++++++-----------------------------
 2 files changed, 22 insertions(+), 69 deletions(-)

diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
index 161f207..94b79c3 100644
--- a/drivers/net/xen-netback/common.h
+++ b/drivers/net/xen-netback/common.h
@@ -58,10 +58,6 @@ struct xenvif {
 	u8               fe_dev_addr[6];
 
 	/* Physical parameters of the comms window. */
-	grant_handle_t   tx_shmem_handle;
-	grant_ref_t      tx_shmem_ref;
-	grant_handle_t   rx_shmem_handle;
-	grant_ref_t      rx_shmem_ref;
 	unsigned int     irq;
 
 	/* List of frontends to notify after a batch of frames sent. */
@@ -70,8 +66,6 @@ struct xenvif {
 	/* The shared rings and indexes. */
 	struct xen_netif_tx_back_ring tx;
 	struct xen_netif_rx_back_ring rx;
-	struct vm_struct *tx_comms_area;
-	struct vm_struct *rx_comms_area;
 
 	/* Frontend feature information. */
 	u8 can_sg:1;
@@ -106,6 +100,11 @@ struct xenvif {
 	wait_queue_head_t waiting_to_free;
 };
 
+static inline struct xenbus_device *xenvif_to_xenbus_device(struct xenvif *vif)
+{
+	return to_xenbus_device(vif->dev->dev.parent);
+}
+
 #define XEN_NETIF_TX_RING_SIZE __CONST_RING_SIZE(xen_netif_tx, PAGE_SIZE)
 #define XEN_NETIF_RX_RING_SIZE __CONST_RING_SIZE(xen_netif_rx, PAGE_SIZE)
 
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index fd00f25..3af2924 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -1577,88 +1577,42 @@ static int xen_netbk_kthread(void *data)
 
 void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
 {
-	struct gnttab_unmap_grant_ref op;
-
-	if (vif->tx.sring) {
-		gnttab_set_unmap_op(&op, (unsigned long)vif->tx_comms_area->addr,
-				    GNTMAP_host_map, vif->tx_shmem_handle);
-
-		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-			BUG();
-	}
-
-	if (vif->rx.sring) {
-		gnttab_set_unmap_op(&op, (unsigned long)vif->rx_comms_area->addr,
-				    GNTMAP_host_map, vif->rx_shmem_handle);
-
-		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-			BUG();
-	}
-	if (vif->rx_comms_area)
-		free_vm_area(vif->rx_comms_area);
-	if (vif->tx_comms_area)
-		free_vm_area(vif->tx_comms_area);
+	if (vif->tx.sring)
+		xenbus_unmap_ring_vfree(xenvif_to_xenbus_device(vif),
+					vif->tx.sring);
+	if (vif->rx.sring)
+		xenbus_unmap_ring_vfree(xenvif_to_xenbus_device(vif),
+					vif->rx.sring);
 }
 
 int xen_netbk_map_frontend_rings(struct xenvif *vif,
 				 grant_ref_t tx_ring_ref,
 				 grant_ref_t rx_ring_ref)
 {
-	struct gnttab_map_grant_ref op;
+	void *addr;
 	struct xen_netif_tx_sring *txs;
 	struct xen_netif_rx_sring *rxs;
 
 	int err = -ENOMEM;
 
-	vif->tx_comms_area = alloc_vm_area(PAGE_SIZE);
-	if (vif->tx_comms_area == NULL)
+	err = xenbus_map_ring_valloc(xenvif_to_xenbus_device(vif),
+				     tx_ring_ref, &addr);
+	if (err)
 		goto err;
 
-	vif->rx_comms_area = alloc_vm_area(PAGE_SIZE);
-	if (vif->rx_comms_area == NULL)
-		goto err;
-
-	gnttab_set_map_op(&op, (unsigned long)vif->tx_comms_area->addr,
-			  GNTMAP_host_map, tx_ring_ref, vif->domid);
-
-	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-		BUG();
-
-	if (op.status) {
-		netdev_warn(vif->dev,
-			    "failed to map tx ring. err=%d status=%d\n",
-			    err, op.status);
-		err = op.status;
-		goto err;
-	}
-
-	vif->tx_shmem_ref    = tx_ring_ref;
-	vif->tx_shmem_handle = op.handle;
-
-	txs = (struct xen_netif_tx_sring *)vif->tx_comms_area->addr;
+	txs = (struct xen_netif_tx_sring *)addr;
 	BACK_RING_INIT(&vif->tx, txs, PAGE_SIZE);
 
-	gnttab_set_map_op(&op, (unsigned long)vif->rx_comms_area->addr,
-			  GNTMAP_host_map, rx_ring_ref, vif->domid);
-
-	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-		BUG();
-
-	if (op.status) {
-		netdev_warn(vif->dev,
-			    "failed to map rx ring. err=%d status=%d\n",
-			    err, op.status);
-		err = op.status;
+	err = xenbus_map_ring_valloc(xenvif_to_xenbus_device(vif),
+				     rx_ring_ref, &addr);
+	if (err)
 		goto err;
-	}
-
-	vif->rx_shmem_ref     = rx_ring_ref;
-	vif->rx_shmem_handle  = op.handle;
-	vif->rx_req_cons_peek = 0;
 
-	rxs = (struct xen_netif_rx_sring *)vif->rx_comms_area->addr;
+	rxs = (struct xen_netif_rx_sring *)addr;
 	BACK_RING_INIT(&vif->rx, rxs, PAGE_SIZE);
 
+	vif->rx_req_cons_peek = 0;
+
 	return 0;
 
 err:
-- 
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 Oct 20 03:51:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:51:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGqDe-0005en-OX; Thu, 20 Oct 2011 03:51:26 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGq97-00041F-Li
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:46:46 -0700
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1319107575!40733148!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3491 invoked from network); 20 Oct 2011 10:46:16 -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;
	20 Oct 2011 10:46:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315195200"; d="scan'208";a="18393843"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 06:46:41 -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; Thu, 20 Oct 2011 06:46:40 -0400
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 p9KAjj4c021749;
	Thu, 20 Oct 2011 03:46:36 -0700
From: David Vrabel <david.vrabel@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 20 Oct 2011 11:45:19 +0100
Message-ID: <1319107519-2253-5-git-send-email-david.vrabel@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
References: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Andrew Morton <akpm@linux-foundation.org>, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org, Jeremy Fitzhardinge <jeremy@goop.org>,
	David Vrabel <david.vrabel@citrix.com>
Subject: [Xen-devel] [PATCH 4/4] xen: map foreign pages for shared rings by
	updating the PTEs directly
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 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>
---
 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.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 Oct 20 03:52:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:52:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGqEX-00062A-1H; Thu, 20 Oct 2011 03:52:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGqB8-0004hM-A4
	for Xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:48:50 -0700
X-Env-Sender: aksinha@yahoo-inc.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1319107725!374790!1
X-Originating-IP: [216.145.54.173]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17040 invoked from network); 20 Oct 2011 10:48:46 -0000
Received: from mrout3.yahoo.com (HELO mrout3.yahoo.com) (216.145.54.173)
	by server-15.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 10:48:46 -0000
Received: from EGL-EX07CAS02.ds.corp.yahoo.com
	(egl-ex07cas02.eglbp.corp.yahoo.com [203.83.248.209])
	by mrout3.yahoo.com (8.14.4/8.14.4/y.out) with ESMTP id p9KAm8mB030344
	for <Xen-devel@lists.xensource.com>;
	Thu, 20 Oct 2011 03:48:09 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yahoo-inc.com;
	s=cobra; t=1319107689;
	bh=ZEevZiO763A/VouU+/pd6RN7/Ky9aL3rk2LLOxFGqqs=;
	h=From:To:Date:Subject:Message-ID:Content-Type:MIME-Version;
	b=lLsdtuP44R7ryRQRNiKndG4AL5QBeZnxpwjAoodDKo8EKXuYCpQlGQS94T+AmGG8E
	1cGeWg0pyVrGFDqttMcqRAW/hiBOQ7QhRS1V901cHq672zrTVriwLwbuaZzs/H7NNe
	W6+cpuS+dVFzOZfmVaVzoflQp+QZxrtK72l3fxQc=
Received: from EGL-EX07VS01.ds.corp.yahoo.com ([203.83.248.205]) by
	EGL-EX07CAS02.ds.corp.yahoo.com ([203.83.248.216]) with mapi;
	Thu, 20 Oct 2011 16:18:08 +0530
From: Alok Sinha <aksinha@yahoo-inc.com>
To: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 16:18:07 +0530
Thread-Topic: Question on RHEL 6 support
Thread-Index: AcyPFcCKTk/KFlkJTOOrCxqG28aacw==
Message-ID: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.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: 
Subject: [Xen-devel] Question on RHEL 6 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>
Content-Type: multipart/mixed; boundary="===============0342470133=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0342470133==
Content-Language: en-US
Content-Type: multipart/alternative;
	boundary="_000_2A0F5C7DEAE046A28A8C437B1FEE5B1Fyahooinccom_"

--_000_2A0F5C7DEAE046A28A8C437B1FEE5B1Fyahooinccom_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Hi,

   I am trying to run RHEL 6 as guest over XEN (RHEL 5.6 as host) hyperviso=
r.
   It seems that RHEL 6 loads the paravirt drivers by default and thus HVM =
mode is not working.

   Any idea on this?

   I saw somewhere that including xen_emul_unplug=3Dnever will help. Is the=
re any other way it can be avoided?

-Alok

--_000_2A0F5C7DEAE046A28A8C437B1FEE5B1Fyahooinccom_
Content-Type: text/html; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

<html><head></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode:=
 space; -webkit-line-break: after-white-space; ">Hi,<div><br></div><div>&nb=
sp; &nbsp;I am trying to run RHEL 6 as guest over XEN (RHEL 5.6 as host) hy=
pervisor.&nbsp;</div><div>&nbsp; &nbsp;It seems that RHEL 6 loads the parav=
irt drivers by default and thus HVM mode is not working.&nbsp;</div><div><b=
r></div><div>&nbsp; &nbsp;Any idea on this?</div><div><br></div><div>&nbsp;=
 &nbsp;I saw somewhere that including&nbsp;<span class=3D"Apple-style-span"=
 style=3D"font-family: Tahoma, sans-serif; background-color: rgb(255, 255, =
255); font-size: small; ">xen_emul_unplug=3Dnever will help. Is there any o=
ther way it can be avoided?</span></div><div><br></div><div>-Alok&nbsp;</di=
v></body></html>=

--_000_2A0F5C7DEAE046A28A8C437B1FEE5B1Fyahooinccom_--


--===============0342470133==
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

--===============0342470133==--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 03:55:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:55:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGqI3-0006TS-3N; Thu, 20 Oct 2011 03:55:59 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGqHc-0006Hf-Ga
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:55:32 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-5.tower-216.messagelabs.com!1319108129!379697!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3072 invoked from network); 20 Oct 2011 10:55:29 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-5.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 10:55:29 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGqHY-000DQG-Sz; Thu, 20 Oct 2011 10:55:28 +0000
Date: Thu, 20 Oct 2011 11:55:28 +0100
From: Tim Deegan <tim@xen.org>
To: Steven <wangwangkang@gmail.com>
Subject: Re: [Xen-devel] Question about quest page table update
Message-ID: <20111020105528.GG49983@ocelot.phlegethon.org>
References: <CAMTrTqWRp7fQnX5oOPJJJHO1TGR79d6=O=z-njf8wwsN6=6xsw@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAMTrTqWRp7fQnX5oOPJJJHO1TGR79d6=O=z-njf8wwsN6=6xsw@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

Hi, 

At 22:21 -0400 on 19 Oct (1319062904), Steven wrote:
> Hi,
> Recently I am trying to understand the page table update of a guest OS
> and I am in some trouble.
> Assuming the starting point is the hypercall do_mmu_update(req, count,
> done, ...),
> req has the struct of {uint64_t ptr; uint64_t val}.

This hypercall interface is documented in xen/include/public/xen.h, with
quite a lot of comments explaining the arguments.  That should answer
most of your questions. 
 
> My first question is that. Since the ptr points to the address of the
> page table entry to be updated, it is the guest address. Why
> the code "gmfn = req.ptr >> PAGE_SHIFT;" can be used to the guest
> machine frame number?

See public/xen.h

> Second, what is va from these 3 line of code?
> 	mfn = mfn_x(gfn_to_mfn(pt_owner, gmfn, &p2mt));
> 	va = map_domain_page_with_cache(mfn, &mapcache);
> 	va = (void *)((unsigned long)va +
>                            (unsigned long)(req.ptr & ~PAGE_MASK));

It's a mapping of machine-address described by req.ptr.
 
> Third, is the input argument val a real machine address or the
> pseudo-physical address of the guest?

Neither (See public/xen.h)

> Fourth, I saw a lot of code in xen/arch/x86/mm.c calls the functions
> like p2m. What is the relationship between the p2m functions and the
> shadow page tables?

For guests which don't manage their own phys-to-machine mapping
(i.e. HVM guests), Xen manages it for them, in the p2m table.  All users
of those guests' GFNs, (including the shadow pagetables) need to look
them up in the p2m before using them.

Guests which use do_mmu_update() to update their pagetables (i.e. PV
guests) manage their own p2m tables and use MFNs to talk to the
hypervisor, so the p2m lookup functions (like gfn_to_mfn()) are no-ops
for them.

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 03:57:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 03:57:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGqJq-0006uI-Dh; Thu, 20 Oct 2011 03:57:50 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGqJ4-0006fm-Qz
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:57:03 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1319108219!378730!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3013 invoked from network); 20 Oct 2011 10:56:59 -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;
	20 Oct 2011 10:56:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8495283"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 10:56:59 +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, 20 Oct 2011 11:56:59 +0100
Date: Thu, 20 Oct 2011 11:57:09 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1319032613-10560-2-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1110201135540.3519@kaball-desktop>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
	<1319032613-10560-2-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: Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH V2 01/10] configure: Introduce
 --enable-xen-pci-passthrough.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, 19 Oct 2011, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  Makefile.target |    2 ++
>  configure       |   21 +++++++++++++++++++++
>  2 files changed, 23 insertions(+), 0 deletions(-)
> 
> diff --git a/Makefile.target b/Makefile.target
> index 417f23e..c518103 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -208,6 +208,8 @@ obj-$(CONFIG_NO_XEN) += xen-stub.o
>  
>  obj-i386-$(CONFIG_XEN) += xen_platform.o
>  
> +# Xen PCI Passthrough
> +

why?

>  # Inter-VM PCI shared memory
>  CONFIG_IVSHMEM =
>  ifeq ($(CONFIG_KVM), y)
> diff --git a/configure b/configure
> index 9b4fe34..63c5c30 100755
> --- a/configure
> +++ b/configure
> @@ -127,6 +127,7 @@ vnc_png=""
>  vnc_thread="no"
>  xen=""
>  xen_ctrl_version=""
> +xen_pci_passthrough=""
>  linux_aio=""
>  attr=""
>  xfs=""
> @@ -641,6 +642,10 @@ for opt do
>    ;;
>    --enable-xen) xen="yes"
>    ;;
> +  --disable-xen-pci-passthrough) xen_pci_passthrough="no"
> +  ;;
> +  --enable-xen-pci-passthrough) xen_pci_passthrough="yes"
> +  ;;
>    --disable-brlapi) brlapi="no"
>    ;;
>    --enable-brlapi) brlapi="yes"
> @@ -979,6 +984,8 @@ echo "                           (affects only QEMU, not qemu-img)"
>  echo "  --enable-mixemu          enable mixer emulation"
>  echo "  --disable-xen            disable xen backend driver support"
>  echo "  --enable-xen             enable xen backend driver support"
> +echo "  --disable-xen-pci-passthrough"
> +echo "  --enable-xen-pci-passthrough"
>  echo "  --disable-brlapi         disable BrlAPI"
>  echo "  --enable-brlapi          enable BrlAPI"
>  echo "  --disable-vnc-tls        disable TLS encryption for VNC server"
> @@ -1342,6 +1349,17 @@ EOF
>    fi
>  fi
>  
> +if test "$xen_pci_passthrough" != "no"; then
> +  if test "$xen" = "yes" -a "$linux" = "yes"; then
> +    xen_pci_passthrough=yes
> +  else
> +    if test "$xen_pci_passthrough" = "yes"; then
> +      feature_not_found "Xen PCI Passthrough without Xen or not on linux"
> +    fi
> +    xen_pci_passthrough=no
> +  fi
> +fi
> +
>  ##########################################
>  # pkg-config probe
>  
> @@ -3365,6 +3383,9 @@ case "$target_arch2" in
>      if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then
>        target_phys_bits=64
>        echo "CONFIG_XEN=y" >> $config_target_mak
> +      if test "$xen_pci_passthrough" = yes; then
> +        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
> +      fi
>      else
>        echo "CONFIG_NO_XEN=y" >> $config_target_mak
>      fi
> -- 
> Anthony PERARD
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 04:01:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 04:01:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGqNJ-0007Ra-GK; Thu, 20 Oct 2011 04:01:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGqJe-0006rQ-OU
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:57:39 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319108255!124111!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13571 invoked from network); 20 Oct 2011 10:57:35 -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;
	20 Oct 2011 10:57:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8495298"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 10:57:35 +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, 20 Oct 2011 11:57:35 +0100
Date: Thu, 20 Oct 2011 11:57:45 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1319032613-10560-3-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1110201136590.3519@kaball-desktop>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
	<1319032613-10560-3-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: Alex Williamson <alex.williamson@redhat.com>,
	Xen Devel <xen-devel@lists.xensource.com>,
	QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH V2 02/10] Introduce HostPCIDevice to access
 a pci device on the 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

On Wed, 19 Oct 2011, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  Makefile.target      |    1 +
>  hw/host-pci-device.c |  245 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  hw/host-pci-device.h |   75 +++++++++++++++
>  3 files changed, 321 insertions(+), 0 deletions(-)
>  create mode 100644 hw/host-pci-device.c
>  create mode 100644 hw/host-pci-device.h
> 
> diff --git a/Makefile.target b/Makefile.target
> index c518103..ca3420d 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -209,6 +209,7 @@ obj-$(CONFIG_NO_XEN) += xen-stub.o
>  obj-i386-$(CONFIG_XEN) += xen_platform.o
>  
>  # Xen PCI Passthrough
> +obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += host-pci-device.o
>  
>  # Inter-VM PCI shared memory
>  CONFIG_IVSHMEM =
> diff --git a/hw/host-pci-device.c b/hw/host-pci-device.c
> new file mode 100644
> index 0000000..0f25fcf
> --- /dev/null
> +++ b/hw/host-pci-device.c
> @@ -0,0 +1,245 @@
> +/*
> + * Copyright (C) 2011       Citrix Ltd.
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2.  See
> + * the COPYING file in the top-level directory.
> + *
> + */
> +
> +#include "qemu-common.h"
> +#include "host-pci-device.h"
> +
> +static int path_to(const HostPCIDevice *d,
> +                   const char *name, char *buf, ssize_t size)
> +{
> +    return snprintf(buf, size, "/sys/bus/pci/devices/%04x:%02x:%02x.%x/%s",
> +                    d->domain, d->bus, d->dev, d->func, name);
> +}
> +
> +static int get_resource(HostPCIDevice *d)
> +{
> +    int i, rc = 0;
> +    FILE *f;
> +    char path[PATH_MAX];
> +    unsigned long long start, end, flags, size;
> +
> +    path_to(d, "resource", path, sizeof (path));
> +    f = fopen(path, "r");
> +    if (!f) {
> +        fprintf(stderr, "Error: Can't open %s: %s\n", path, strerror(errno));
> +        return -1;

it would be better to return a proper error code, rather than just -1


> +    }
> +
> +    for (i = 0; i < PCI_NUM_REGIONS; i++) {
> +        if (fscanf(f, "%llx %llx %llx", &start, &end, &flags) != 3) {
> +            fprintf(stderr, "Error: Syntax error in %s\n", path);
> +            rc = -1;

Ditto

> +            break;
> +        }
> +        if (start) {
> +            size = end - start + 1;
> +        } else {
> +            size = 0;
> +        }
> +
> +        if (i < PCI_ROM_SLOT) {
> +            d->io_regions[i].base_addr = start;
> +            d->io_regions[i].size = size;
> +            d->io_regions[i].flags = flags;
> +        } else {
> +            d->rom.base_addr = start;
> +            d->rom.size = size;
> +            d->rom.flags = flags;
> +        }
> +    }
> +
> +    fclose(f);
> +    return rc;
> +}
> +
> +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;
> +    }
> +    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;
> +}
> +
> +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);
> +  return buf;
> +}
> +uint16_t host_pci_get_word(HostPCIDevice *d, int pos)
> +{
> +  uint16_t buf;
> +  host_pci_config_read(d, pos, &buf, 2);
> +  return le16_to_cpu(buf);
> +}
> +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);
> +}
> +
> +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 = 480;
> +    int pos = 0x100;

could you used some defined constants here?


> +    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 < 0x100) {
> +            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) == -1) {
> +        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

From xen-devel-bounces@lists.xensource.com Thu Oct 20 04:05:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 04:05:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGqRj-0007u9-0l; Thu, 20 Oct 2011 04:05:59 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGqKz-000758-Qy
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 03:59:10 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1319108338!936930!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13101 invoked from network); 20 Oct 2011 10:58:58 -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;
	20 Oct 2011 10:58:58 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8495331"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 10:58:52 +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, 20 Oct 2011 11:58:52 +0100
Date: Thu, 20 Oct 2011 11:59:02 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1319032613-10560-9-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1110201141280.3519@kaball-desktop>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
	<1319032613-10560-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>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Allen Kay <allen.m.kay@intel.com>, QEMU-devel <qemu-devel@nongnu.org>,
	Alex Williamson <alex.williamson@redhat.com>
Subject: [Xen-devel] Re: [PATCH V2 08/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 Wed, 19 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         |  861 ++++++++++++++++++++++++++++++++++++++
>  hw/xen_pci_passthrough.h         |  258 ++++++++++++
>  hw/xen_pci_passthrough_helpers.c |   46 ++
>  4 files changed, 1167 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 ca3420d..0673b51 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -210,6 +210,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..0b631f7
> --- /dev/null
> +++ b/hw/xen_pci_passthrough.c
> @@ -0,0 +1,861 @@
> +/*
> + * 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'.
> + */
> +
> +#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 untill previous power state transition is completed.
> +         * so finished previous request here.
> +         */

until

> +        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 allocated?


> +}
> +
> +/* 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) {
> +        pt_add_msix_mapping(s, i);
> +        /* 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");
> +        }
> +
> +        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);
> +        }
> +    }
> +}
> +
> +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);
> +
> +    /* 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]++;
> +    }
> +
> +    /* 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);
> +        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,
> +           s->msi_trans_en ? "MSI-INTx" : "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 (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) {
> +            PT_LOG("Error: Unbinding of interrupt failed! rc=%d\n", rc);
> +        }
> +    }
> +
> +    if (s->msi) {
> +        pt_msi_disable(s);
> +    }
> +    if (s->msix) {
> +        pt_msix_disable(s);
> +    }
> +
> +    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("msitranslate", XenPCIPassthroughState, msi_trans_cap,
> +                        0, true),
> +        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..2d43c18
> --- /dev/null
> +++ b/hw/xen_pci_passthrough.h
> @@ -0,0 +1,258 @@
> +#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 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 */
> +    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;
> +
> +    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;
> +
> +    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;
> +}
> --
> Anthony PERARD
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 04:08:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 04:08:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGqUI-0008Sf-Rh; Thu, 20 Oct 2011 04:08:38 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGqN9-0007Ph-AJ
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 04:01:19 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319108472!944785!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28585 invoked from network); 20 Oct 2011 11:01:12 -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;
	20 Oct 2011 11:01:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,378,1315180800"; 
   d="scan'208";a="8495386"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 11:01: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; Thu, 20 Oct 2011 12:01:11 +0100
Date: Thu, 20 Oct 2011 12:01:21 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Anthony PERARD <anthony.perard@citrix.com>
In-Reply-To: <1319032613-10560-10-git-send-email-anthony.perard@citrix.com>
Message-ID: <alpine.DEB.2.00.1110201146210.3519@kaball-desktop>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
	<1319032613-10560-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: Guy Zana <guy@neocleus.com>, 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>,
	Alex Williamson <alex.williamson@redhat.com>
Subject: [Xen-devel] Re: [PATCH V2 09/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 Wed, 19 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 | 2553 ++++++++++++++++++++++++++++++++++
>  3 files changed, 2556 insertions(+), 0 deletions(-)
>  create mode 100644 hw/xen_pci_passthrough_config_init.c
> 
> diff --git a/Makefile.target b/Makefile.target
> index 0673b51..875a507 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -212,6 +212,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 2d43c18..7cb563f 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..b4238ee
> --- /dev/null
> +++ b/hw/xen_pci_passthrough_config_init.c
> @@ -0,0 +1,2553 @@
> +/*
> + * 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) {
> +        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);
> +
> +    /* 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->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);
> +    }

these msi functions are not implemented yet


> +    /* 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,
> +    },
> +};
> +
> +/********************************
> + * 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;
> +            }

same here

> +            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);
> +        }
> +    }

same here

> +    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");
> +        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);
> +        }
> +    }

same here

> +    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");
> +        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);
> +    }

same here

> +    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
> + */
> +
> +/* 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;
> +}
> +/* 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 */
> +    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;
> +    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);

this is only defined in the next patch

> +
> +    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 */
> +    {
> +        .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,
> +    },
> +    /* 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,
> +        .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,
> +    },
> +    /* 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,
> +    },
> +};
> +
> +/* 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);
> +
> +    /* setup MSI-INTx translation if support */
> +    ret = pt_enable_msi_translate(s);

same here


> +    /* rebind machine_irq to device */
> +    if (ret < 0 && 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 MSI/MSI-X info table */
> +    if (s->msix) {
> +        pt_msix_delete(s);
> +    }

same here


> +    if (s->msi) {
> +        g_free(s->msi);
> +    }
> +
> +    /* 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 Thu Oct 20 04:29:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 04:29:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGqoZ-0000ve-Lz; Thu, 20 Oct 2011 04:29:35 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGqnu-0000j5-BQ
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 04:28:54 -0700
X-Env-Sender: fantonifabio@tiscali.it
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319110129!36072908!1
X-Originating-IP: [216.139.236.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6816 invoked from network); 20 Oct 2011 11:28:51 -0000
Received: from sam.nabble.com (HELO sam.nabble.com) (216.139.236.26)
	by server-4.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	20 Oct 2011 11:28:51 -0000
Received: from [192.168.236.26] (helo=sam.nabble.com)
	by sam.nabble.com with esmtp (Exim 4.72)
	(envelope-from <fantonifabio@tiscali.it>) id 1RGqnp-0007H2-A8
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 04:28:49 -0700
Date: Thu, 20 Oct 2011 04:28:49 -0700 (PDT)
From: Fantu <fantonifabio@tiscali.it>
To: xen-devel@lists.xensource.com
Message-ID: <1319110129307-4921154.post@n5.nabble.com>
In-Reply-To: <1316210553.26990.24.camel@cthulhu.hellion.org.uk>
References: <1316011454156-4803078.post@n5.nabble.com>
	<20110914145403.GA17899@phenom.oracle.com>
	<1316097409687-4807062.post@n5.nabble.com>
	<20110915145840.GA20726@phenom.oracle.com>
	<1316105794010-4807540.post@n5.nabble.com>
	<1316210553.26990.24.camel@cthulhu.hellion.org.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Re: Out sw-iommu space 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

After setting swiotlb=65762 on vmlinuz (from 64 mb to 128 mb) problem solved.
Is swiotlb set on vmlinux bugged? At this time on 2.6.32 pv_ops, in order to
set size in MB requires this calculation: swiotlb=N where N/1024*2=MB

--
View this message in context: http://xen.1045712.n5.nabble.com/Out-sw-iommu-space-problem-tp4803078p4921154.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 Thu Oct 20 04:49:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 04:49:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGr81-0002YC-FW; Thu, 20 Oct 2011 04:49:41 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGr7F-0002Le-QK
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 04:48:54 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1319111329!134398!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27968 invoked from network); 20 Oct 2011 11:48:50 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-5.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 11:48:50 -0000
Received: by yxl11 with SMTP id 11so3776113yxl.30
	for <xen-devel@lists.xensource.com>;
	Thu, 20 Oct 2011 04:48: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
	:content-transfer-encoding;
	bh=WknNQI53B6OZ+6xIwfTjY83mwgMXujD8FWKdzcnbuN4=;
	b=GlHcNE5SqJ1XOYM/H1j1TQ/NkP1f39lQPrSTx0F6xQ6MolbBIv3o06yyeZY7REZ0+9
	Z+OAt/F3JLULsSelkPJAetANOpOlliA701AF0zZpAcpTdqXP5Lq2ncgCeQAMDCh1D1ok
	LeN7xmbfM/GjLVlrSP3yzV8YzkQ/XVVPr3ahQ=
MIME-Version: 1.0
Received: by 10.42.157.135 with SMTP id d7mr18584303icx.19.1319111329361; Thu,
	20 Oct 2011 04:48:49 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Thu, 20 Oct 2011 04:48:49 -0700 (PDT)
In-Reply-To: <64d6b8a65a7ed4939fef.1319050207@athos.nss.cs.ubc.ca>
References: <patchbomb.1319050206@athos.nss.cs.ubc.ca>
	<64d6b8a65a7ed4939fef.1319050207@athos.nss.cs.ubc.ca>
Date: Thu, 20 Oct 2011 12:48:49 +0100
X-Google-Sender-Auth: pFgrB_7M5wDlY6jvFb0hHnloYY4
Message-ID: <CAFLBxZaQTSM8narad__a4XWQ+cVwMORrhC2yLspbJs7DxWsXYg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH 1 of 2 V4] tools/libxc: Remus Checkpoint
	Compression
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: rshriram@cs.ubc.ca
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: brendan@cs.ubc.ca, 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 Wed, Oct 19, 2011 at 7:50 PM,  <rshriram@cs.ubc.ca> wrote:
> + =A0 =A0/* Without checkpoint compression, the dirty pages, pfn arrays
> + =A0 =A0 * and tailbuf (vcpu ctx, shared info page, etc.) =A0are written
> + =A0 =A0 * directly to outbuf. All of this is done while the domain is
> + =A0 =A0 * suspended.
> + =A0 =A0 *
> + =A0 =A0 * When checkpoint compression is enabled, the dirty pages are
> + =A0 =A0 * buffered, compressed "after" the domain is resumed and then
> + =A0 =A0 * written to outbuf. Since tailbuf data are collected while a
> + =A0 =A0 * domain is suspended, they cannot be directly written to the
> + =A0 =A0 * outbuf as there is no dirty page data preceeding tailbuf.
> + =A0 =A0 *
> + =A0 =A0 * So,two output buffers are maintained. Tailbuf data goes into
> + =A0 =A0 * ob_tailbuf. The dirty pages are compressed after resuming the
> + =A0 =A0 * domain and written to ob_pagebuf. ob_tailbuf is then appended
> + =A0 =A0 * to ob_pagebuf and finally flushed out.
> + =A0 =A0 */
> + =A0 =A0struct outbuf ob_pagebuf, ob_tailbuf, *ob =3D NULL;

Thanks, that's very helpful.

I don't have any more objections / comments.

 -George

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:37:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:37:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGso2-0005Rv-8n; Thu, 20 Oct 2011 06:37:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGsnJ-0005F6-PA
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:36:26 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1319117782!29714604!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14572 invoked from network); 20 Oct 2011 13:36:22 -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; 20 Oct 2011 13:36:22 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:36:22 +0100
Message-Id: <4EA03FF4020000780005C797@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:36:20 +0100
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 00/12] cpumask handling scalability 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

This patch set makes some first steps towards eliminating the old cpumask
accessors, replacing them by such that don't require the full NR_CPUS
bits to be allocated (which obviously can be pretty wasteful when
NR_CPUS is high, but the actual number is low or moderate).

01: introduce and use nr_cpu_ids and nr_cpumask_bits
02: eliminate cpumask accessors referencing NR_CPUS
03: eliminate direct assignments of CPU masks
04: x86: allocate IRQ actions' cpu_eoi_map dynamically
05: allocate CPU sibling and core maps dynamically
06: allow efficient allocation of multiple CPU masks at once

One reason I put the following ones together was to reduce the
differences between the disassembly of hypervisors built for 4095
and 2047 CPUs, which I looked at to determine the places where
cpumask_t variables get copied without using cpumask_copy() (a
job where grep is of no help). Hence consider these patch optional,
but recommended.

07: cpufreq: allocate CPU masks dynamically
08: x86/p2m: allocate CPU masks dynamically
09: cpupools: allocate CPU masks dynamically
10: credit: allocate CPU masks dynamically
11: x86/hpet: allocate CPU masks dynamically
12: cpumask <=3D> xenctl_cpumap: allocate CPU masks and byte maps =
dynamically

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 Oct 20 06:38:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:38:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGspW-0005zc-1k; Thu, 20 Oct 2011 06:38:42 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGso3-0005RI-IZ
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:37:14 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319117827!30035100!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21641 invoked from network); 20 Oct 2011 13:37:08 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 13:37:08 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:37:08 +0100
Message-Id: <4EA04022020000780005C79B@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:37:06 +0100
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="=__PartB09F5312.0__="
Subject: [Xen-devel] [PATCH 01/12] introduce and use nr_cpu_ids and
	nr_cpumask_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

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.

--=__PartB09F5312.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

The former is the runtime equivalent of NR_CPUS (and users of NR_CPUS,
where necessary, get adjusted accordingly), while the latter is for the
sole use of determining the allocation size when dynamically allocating
CPU masks (done later in this series).

Adjust accessors to use either of the two to bound their bitmap
operations - which one gets used depends on whether accessing the bits
in the gap between nr_cpu_ids and nr_cpumask_bits is benign but more
efficient.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- 2011-10-18.orig/xen/arch/x86/acpi/cpu_idle.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/x86/acpi/cpu_idle.c	2011-10-07 09:18:28.0000000=
00 +0200
@@ -900,7 +900,7 @@ int get_cpu_id(u32 acpi_id)
     if ( apic_id =3D=3D BAD_APICID )
         return -1;
=20
-    for ( i =3D 0; i < NR_CPUS; i++ )
+    for ( i =3D 0; i < nr_cpu_ids; i++ )
     {
         if ( apic_id =3D=3D x86_cpu_to_apicid[i] )
             return i;
--- 2011-10-18.orig/xen/arch/x86/acpi/cpufreq/cpufreq.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/x86/acpi/cpufreq/cpufreq.c	2011-09-21 =
16:40:02.000000000 +0200
@@ -209,7 +209,7 @@ static u32 get_cur_val(const cpumask_t *
=20
     if (!cpumask_test_cpu(cpu, mask))
         cpu =3D cpumask_first(mask);
-    if (cpu >=3D NR_CPUS || !cpu_online(cpu))
+    if (cpu >=3D nr_cpu_ids || !cpu_online(cpu))
         return 0;
=20
     policy =3D per_cpu(cpufreq_cpu_policy, cpu);
--- 2011-10-18.orig/xen/arch/x86/acpi/lib.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/acpi/lib.c	2011-09-21 16:40:21.000000000 =
+0200
@@ -95,7 +95,7 @@ int arch_acpi_set_pdc_bits(u32 acpi_id,=20
=20
 	if (!(acpi_id + 1))
 		c =3D &boot_cpu_data;
-	else if (cpu >=3D NR_CPUS || !cpu_online(cpu))
+	else if (cpu >=3D nr_cpu_ids || !cpu_online(cpu))
 		return -EINVAL;
 	else
 		c =3D cpu_data + cpu;
--- 2011-10-18.orig/xen/arch/x86/cpu/common.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/cpu/common.c	2011-09-21 16:46:43.0000000=
00 +0200
@@ -532,7 +532,7 @@ void __cpuinit detect_ht(struct cpuinfo_
 		printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
 	} else if (c->x86_num_siblings > 1 ) {
=20
-		if (c->x86_num_siblings > NR_CPUS) {
+		if (c->x86_num_siblings > nr_cpu_ids) {
 			printk(KERN_WARNING "CPU: Unsupported number of =
the siblings %d", c->x86_num_siblings);
 			c->x86_num_siblings =3D 1;
 			return;
--- 2011-10-18.orig/xen/arch/x86/cpu/mcheck/mce.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/x86/cpu/mcheck/mce.c	2011-10-07 09:18:39.0000000=
00 +0200
@@ -1487,7 +1487,7 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u
         mc_msrinject =3D &op->u.mc_msrinject;
         target =3D mc_msrinject->mcinj_cpunr;
=20
-        if (target >=3D NR_CPUS)
+        if (target >=3D nr_cpu_ids)
             return x86_mcerr("do_mca inject: bad target", -EINVAL);
=20
         if (!cpu_online(target))
@@ -1514,7 +1514,7 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u
         mc_mceinject =3D &op->u.mc_mceinject;
         target =3D mc_mceinject->mceinj_cpunr;
=20
-        if (target >=3D NR_CPUS)
+        if (target >=3D nr_cpu_ids)
             return x86_mcerr("do_mca #MC: bad target", -EINVAL);
=20
         if (!cpu_online(target))
--- 2011-10-18.orig/xen/arch/x86/microcode.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/microcode.c	2011-09-21 16:42:31.000000000 =
+0200
@@ -126,7 +126,7 @@ static long do_microcode_update(void *_i
         info->error =3D error;
=20
     info->cpu =3D next_cpu(info->cpu, cpu_online_map);
-    if ( info->cpu < NR_CPUS )
+    if ( info->cpu < nr_cpu_ids )
         return continue_hypercall_on_cpu(info->cpu, do_microcode_update, =
info);
=20
     error =3D info->error;
--- 2011-10-18.orig/xen/arch/x86/mpparse.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/mpparse.c	2011-10-14 10:23:28.000000000 =
+0200
@@ -28,6 +28,7 @@
 #include <asm/mtrr.h>
 #include <asm/mpspec.h>
 #include <asm/io_apic.h>
+#include <asm/setup.h>
=20
 #include <mach_apic.h>
 #include <mach_mpparse.h>
@@ -61,10 +62,31 @@ unsigned int __read_mostly boot_cpu_phys
=20
 /* Internal processor count */
 static unsigned int __devinitdata num_processors;
+static unsigned int __initdata disabled_cpus;
=20
 /* Bitmask of physically existing CPUs */
 physid_mask_t phys_cpu_present_map;
=20
+void __init set_nr_cpu_ids(unsigned int max_cpus)
+{
+	if (!max_cpus)
+		max_cpus =3D num_processors + disabled_cpus;
+	if (max_cpus > NR_CPUS)
+		max_cpus =3D NR_CPUS;
+	else if (!max_cpus)
+		max_cpus =3D 1;
+	printk(XENLOG_INFO "SMP: Allowing %u CPUs (%d hotplug CPUs)\n",
+	       max_cpus, max_t(int, max_cpus - num_processors, 0));
+	nr_cpu_ids =3D max_cpus;
+
+#ifndef nr_cpumask_bits
+	nr_cpumask_bits =3D (max_cpus + (BITS_PER_LONG - 1)) &
+			  ~(BITS_PER_LONG - 1);
+	printk(XENLOG_DEBUG "NR_CPUS:%u nr_cpumask_bits:%u\n",
+	       NR_CPUS, nr_cpumask_bits);
+#endif
+}
+
 /*
  * Intel MP BIOS table parsing routines:
  */
@@ -90,8 +112,11 @@ static int __devinit MP_processor_info_x
 {
  	int ver, apicid, cpu =3D 0;
  =09
-	if (!(m->mpc_cpuflag & CPU_ENABLED))
+	if (!(m->mpc_cpuflag & CPU_ENABLED)) {
+		if (!hotplug)
+			++disabled_cpus;
 		return -EINVAL;
+	}
=20
 	apicid =3D mpc_apic_id(m, apicidx);
=20
@@ -115,9 +140,9 @@ static int __devinit MP_processor_info_x
=20
 	set_apicid(apicid, &phys_cpu_present_map);
=20
-	if (num_processors >=3D NR_CPUS) {
-		printk(KERN_WARNING "WARNING: NR_CPUS limit of %i =
reached."
-			"  Processor ignored.\n", NR_CPUS);
+	if (num_processors >=3D nr_cpu_ids) {
+		printk(KERN_WARNING "WARNING: NR_CPUS limit of %u =
reached."
+			"  Processor ignored.\n", nr_cpu_ids);
 		return -ENOSPC;
 	}
=20
--- 2011-10-18.orig/xen/arch/x86/numa.c	2011-10-20 14:46:19.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/numa.c	2011-09-21 16:44:01.000000000 =
+0200
@@ -198,7 +198,7 @@ void __init numa_init_array(void)
 	   CPUs, as the number of CPUs is not known yet.=20
 	   We round robin the existing nodes. */
 	rr =3D first_node(node_online_map);
-	for (i =3D 0; i < NR_CPUS; i++) {
+	for (i =3D 0; i < nr_cpu_ids; i++) {
 		if (cpu_to_node[i] !=3D NUMA_NO_NODE)
 			continue;
  		numa_set_node(i, rr);
@@ -280,7 +280,7 @@ void __init numa_initmem_init(unsigned l
 	memnodemap =3D _memnodemap;
 	nodes_clear(node_online_map);
 	node_set_online(0);
-	for (i =3D 0; i < NR_CPUS; i++)
+	for (i =3D 0; i < nr_cpu_ids; i++)
 		numa_set_node(i, 0);
 	node_to_cpumask[0] =3D cpumask_of_cpu(0);
 	setup_node_bootmem(0, (u64)start_pfn << PAGE_SHIFT, (u64)end_pfn =
<< PAGE_SHIFT);
@@ -335,7 +335,7 @@ static __init int numa_setup(char *opt)=20
 void __init init_cpu_to_node(void)
 {
 	int i, node;
- 	for (i =3D 0; i < NR_CPUS; i++) {
+ 	for (i =3D 0; i < nr_cpu_ids; i++) {
 		u32 apicid =3D x86_cpu_to_apicid[i];
 		if (apicid =3D=3D BAD_APICID)
 			continue;
--- 2011-10-18.orig/xen/arch/x86/oprofile/nmi_int.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/x86/oprofile/nmi_int.c	2011-09-21 16:45:12.0000000=
00 +0200
@@ -127,7 +127,7 @@ static void nmi_save_registers(void * du
 static void free_msrs(void)
 {
 	int i;
-	for (i =3D 0; i < NR_CPUS; ++i) {
+	for (i =3D 0; i < nr_cpu_ids; ++i) {
 		xfree(cpu_msrs[i].counters);
 		cpu_msrs[i].counters =3D NULL;
 		xfree(cpu_msrs[i].controls);
--- 2011-10-18.orig/xen/arch/x86/platform_hypercall.c	2011-10-20 =
14:46:20.000000000 +0200
+++ 2011-10-18/xen/arch/x86/platform_hypercall.c	2011-10-20 =
14:47:11.000000000 +0200
@@ -442,7 +442,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe
             break;
         }
=20
-        if ( (g_info->xen_cpuid >=3D NR_CPUS) ||
+        if ( (g_info->xen_cpuid >=3D nr_cpu_ids) ||
              !cpu_present(g_info->xen_cpuid) )
         {
             g_info->flags |=3D XEN_PCPU_FLAGS_INVALID;
--- 2011-10-18.orig/xen/arch/x86/setup.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/setup.c	2011-09-21 16:41:20.000000000 =
+0200
@@ -51,7 +51,7 @@ static bool_t __initdata opt_nosmp;
 boolean_param("nosmp", opt_nosmp);
=20
 /* maxcpus: maximum number of CPUs to activate. */
-static unsigned int __initdata max_cpus =3D NR_CPUS;
+static unsigned int __initdata max_cpus;
 integer_param("maxcpus", max_cpus);
=20
 /* opt_watchdog: If true, run a watchdog NMI on each processor. */
@@ -230,7 +230,7 @@ static void __init normalise_cpu_order(v
          * Among identical longest-prefix matches, pick the smallest APIC =
ID.
          */
         for ( j =3D next_cpu(i, cpu_present_map);
-              j < NR_CPUS;
+              j < nr_cpu_ids;
               j =3D next_cpu(j, cpu_present_map) )
         {
             diff =3D x86_cpu_to_apicid[j] ^ apicid;
@@ -246,9 +246,9 @@ static void __init normalise_cpu_order(v
         }
=20
         /* If no match then there must be no CPUs remaining to consider. =
*/
-        if ( min_cpu >=3D NR_CPUS )
+        if ( min_cpu >=3D nr_cpu_ids )
         {
-            BUG_ON(next_cpu(i, cpu_present_map) < NR_CPUS);
+            BUG_ON(next_cpu(i, cpu_present_map) < nr_cpu_ids);
             break;
         }
=20
@@ -1203,6 +1203,17 @@ void __init __start_xen(unsigned long mb
     if ( smp_found_config )
         get_smp_config();
=20
+    if ( opt_nosmp )
+    {
+        max_cpus =3D 0;
+        set_nr_cpu_ids(1);
+    }
+    else
+    {
+        set_nr_cpu_ids(max_cpus);
+        max_cpus =3D nr_cpu_ids;
+    }
+
 #ifdef CONFIG_X86_64
     /* Low mappings were only needed for some BIOS table parsing. */
     zap_low_mappings();
@@ -1254,9 +1265,6 @@ void __init __start_xen(unsigned long mb
     acpi_mmcfg_init();
 #endif
=20
-    if ( opt_nosmp )
-        max_cpus =3D 0;
-
     iommu_setup();    /* setup iommu if available */
=20
     smp_prepare_cpus(max_cpus);
--- 2011-10-18.orig/xen/arch/x86/smpboot.c	2011-10-18 11:04:45.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/smpboot.c	2011-10-12 13:59:39.000000000 =
+0200
@@ -535,7 +535,7 @@ int alloc_cpu_id(void)
     int cpu;
     cpus_complement(tmp_map, cpu_present_map);
     cpu =3D first_cpu(tmp_map);
-    return (cpu < NR_CPUS) ? cpu : -ENODEV;
+    return (cpu < nr_cpu_ids) ? cpu : -ENODEV;
 }
=20
 static int do_boot_cpu(int apicid, int cpu)
--- 2011-10-18.orig/xen/arch/x86/srat.c	2011-10-20 14:46:19.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/srat.c	2011-09-21 16:56:11.000000000 =
+0200
@@ -447,7 +447,7 @@ int __init acpi_scan_nodes(u64 start, u6
 			continue;
 		setup_node_bootmem(i, nodes[i].start, nodes[i].end);
 	}
-	for (i =3D 0; i < NR_CPUS; i++) {=20
+	for (i =3D 0; i < nr_cpu_ids; i++) {
 		if (cpu_to_node[i] =3D=3D NUMA_NO_NODE)
 			continue;
 		if (!node_isset(cpu_to_node[i], nodes_parsed))
--- 2011-10-18.orig/xen/arch/x86/sysctl.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/sysctl.c	2011-09-21 16:44:47.000000000 =
+0200
@@ -82,7 +82,7 @@ long arch_do_sysctl(
         pi->nr_cpus =3D num_online_cpus();
         pi->nr_nodes =3D num_online_nodes();
         pi->max_node_id =3D MAX_NUMNODES-1;
-        pi->max_cpu_id =3D NR_CPUS-1;
+        pi->max_cpu_id =3D nr_cpu_ids - 1;
         pi->total_pages =3D total_pages;
         pi->free_pages =3D avail_domheap_pages();
         pi->scrub_pages =3D 0;
--- 2011-10-18.orig/xen/arch/x86/tboot.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/tboot.c	2011-09-21 16:42:13.000000000 =
+0200
@@ -248,7 +248,7 @@ static int mfn_in_guarded_stack(unsigned
     void *p;
     int i;
=20
-    for ( i =3D 0; i < NR_CPUS; i++ )
+    for ( i =3D 0; i < nr_cpu_ids; i++ )
     {
         if ( !stack_base[i] )
             continue;
--- 2011-10-18.orig/xen/arch/x86/traps.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/traps.c	2011-10-18 12:45:55.000000000 =
+0200
@@ -3412,7 +3412,7 @@ static void __set_intr_gate(unsigned int
 {
     int i;
     /* Keep secondary tables in sync with IRQ updates. */
-    for ( i =3D 1; i < NR_CPUS; i++ )
+    for ( i =3D 1; i < nr_cpu_ids; i++ )
         if ( idt_tables[i] !=3D NULL )
             _set_gate(&idt_tables[i][n], 14, dpl, addr);
     _set_gate(&idt_table[n], 14, dpl, addr);
--- 2011-10-18.orig/xen/common/cpu.c	2011-10-20 14:46:19.000000000 =
+0200
+++ 2011-10-18/xen/common/cpu.c	2011-10-17 08:39:11.000000000 +0200
@@ -6,6 +6,12 @@
 #include <xen/sched.h>
 #include <xen/stop_machine.h>
=20
+unsigned int __read_mostly nr_cpu_ids =3D NR_CPUS;
+#ifndef nr_cpumask_bits
+unsigned int __read_mostly nr_cpumask_bits
+    =3D BITS_TO_LONGS(NR_CPUS) * BITS_PER_LONG;
+#endif
+
 /*
  * cpu_bit_bitmap[] is a special, "compressed" data structure that
  * represents all NR_CPUS bits binary values of 1<<nr.
@@ -80,7 +86,7 @@ int cpu_down(unsigned int cpu)
     if ( !cpu_hotplug_begin() )
         return -EBUSY;
=20
-    if ( (cpu >=3D NR_CPUS) || (cpu =3D=3D 0) || !cpu_online(cpu) )
+    if ( (cpu >=3D nr_cpu_ids) || (cpu =3D=3D 0) || !cpu_online(cpu) )
     {
         cpu_hotplug_done();
         return -EINVAL;
@@ -122,7 +128,7 @@ int cpu_up(unsigned int cpu)
     if ( !cpu_hotplug_begin() )
         return -EBUSY;
=20
-    if ( (cpu >=3D NR_CPUS) || cpu_online(cpu) || !cpu_present(cpu) )
+    if ( (cpu >=3D nr_cpu_ids) || cpu_online(cpu) || !cpu_present(cpu) )
     {
         cpu_hotplug_done();
         return -EINVAL;
--- 2011-10-18.orig/xen/common/cpupool.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/common/cpupool.c	2011-10-07 09:17:45.000000000 =
+0200
@@ -489,7 +489,7 @@ int cpupool_do_sysctl(struct xen_sysctl_
         if ( cpu =3D=3D XEN_SYSCTL_CPUPOOL_PAR_ANY )
             cpu =3D first_cpu(cpupool_free_cpus);
         ret =3D -EINVAL;
-        if ( cpu >=3D NR_CPUS )
+        if ( cpu >=3D nr_cpu_ids )
             goto addcpu_out;
         ret =3D -EBUSY;
         if ( !cpu_isset(cpu, cpupool_free_cpus) )
@@ -517,7 +517,7 @@ int cpupool_do_sysctl(struct xen_sysctl_
         cpu =3D op->cpu;
         if ( cpu =3D=3D XEN_SYSCTL_CPUPOOL_PAR_ANY )
             cpu =3D last_cpu(c->cpu_valid);
-        ret =3D (cpu < NR_CPUS) ? cpupool_unassign_cpu(c, cpu) : -EINVAL;
+        ret =3D (cpu < nr_cpu_ids) ? cpupool_unassign_cpu(c, cpu) : =
-EINVAL;
         cpupool_put(c);
     }
     break;
--- 2011-10-18.orig/xen/common/domain.c	2011-10-20 14:46:20.000000000 =
+0200
+++ 2011-10-18/xen/common/domain.c	2011-09-21 16:33:10.000000000 =
+0200
@@ -1023,7 +1023,7 @@ int continue_hypercall_on_cpu(
 {
     struct migrate_info *info;
=20
-    if ( (cpu >=3D NR_CPUS) || !cpu_online(cpu) )
+    if ( (cpu >=3D nr_cpu_ids) || !cpu_online(cpu) )
         return -EINVAL;
=20
     info =3D this_cpu(continue_info);
--- 2011-10-18.orig/xen/common/kexec.c	2011-10-20 14:46:19.000000000 =
+0200
+++ 2011-10-18/xen/common/kexec.c	2011-09-21 16:33:57.000000000 =
+0200
@@ -296,7 +296,7 @@ static int kexec_get_cpu(xen_kexec_range
     int nr =3D range->nr;
     int nr_bytes =3D 0;
=20
-    if ( nr < 0 || nr >=3D NR_CPUS || !cpu_online(nr) )
+    if ( nr < 0 || nr >=3D nr_cpu_ids || !cpu_online(nr) )
         return -EINVAL;
=20
     nr_bytes +=3D sizeof_note("CORE", sizeof(ELF_Prstatus));
--- 2011-10-18.orig/xen/common/keyhandler.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/common/keyhandler.c	2011-09-21 16:32:28.000000000 =
+0200
@@ -98,7 +98,7 @@ void dump_execstate(struct cpu_user_regs
         return;
=20
     cpu =3D cycle_cpu(cpu, dump_execstate_mask);
-    if ( cpu < NR_CPUS )
+    if ( cpu < nr_cpu_ids )
     {
         smp_send_state_dump(cpu);
         return;
--- 2011-10-18.orig/xen/common/sched_credit.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/common/sched_credit.c	2011-10-07 09:18:05.0000000=
00 +0200
@@ -374,7 +374,7 @@ csched_alloc_pdata(const struct schedule
=20
     INIT_LIST_HEAD(&spc->runq);
     spc->runq_sort_last =3D prv->runq_sort;
-    spc->idle_bias =3D NR_CPUS - 1;
+    spc->idle_bias =3D nr_cpu_ids - 1;
     if ( per_cpu(schedule_data, cpu).sched_priv =3D=3D NULL )
         per_cpu(schedule_data, cpu).sched_priv =3D spc;
=20
--- 2011-10-18.orig/xen/common/sched_credit2.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/common/sched_credit2.c	2011-10-07 09:18:09.0000000=
00 +0200
@@ -2071,7 +2071,7 @@ csched_init(struct scheduler *ops)
     INIT_LIST_HEAD(&prv->sdom);
=20
     /* But un-initialize all runqueues */
-    for ( i=3D0; i<NR_CPUS; i++)
+    for ( i =3D 0; i < nr_cpu_ids; i++ )
     {
         prv->runq_map[i] =3D -1;
         prv->rqd[i].id =3D -1;
--- 2011-10-18.orig/xen/common/sched_sedf.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/common/sched_sedf.c	2011-10-07 09:18:14.000000000 =
+0200
@@ -1201,7 +1201,7 @@ static void sedf_wake(const struct sched
       routine. Try to avoid unnecessary runs but:
       Save approximation: Always switch to scheduler!*/
     ASSERT(d->processor >=3D 0);
-    ASSERT(d->processor < NR_CPUS);
+    ASSERT(d->processor < nr_cpu_ids);
     ASSERT(per_cpu(schedule_data, d->processor).curr);
=20
     if ( should_switch(per_cpu(schedule_data, d->processor).curr, d, now) =
)
--- 2011-10-18.orig/xen/common/schedule.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/common/schedule.c	2011-10-12 13:59:19.000000000 =
+0200
@@ -1353,7 +1353,7 @@ void __init scheduler_init(void)
     idle_domain =3D domain_create(DOMID_IDLE, 0, 0);
     BUG_ON(idle_domain =3D=3D NULL);
     idle_domain->vcpu =3D idle_vcpu;
-    idle_domain->max_vcpus =3D NR_CPUS;
+    idle_domain->max_vcpus =3D nr_cpu_ids;
     if ( alloc_vcpu(idle_domain, 0, 0) =3D=3D NULL )
         BUG();
     if ( ops.alloc_pdata &&
--- 2011-10-18.orig/xen/common/sysctl.c	2011-10-20 14:46:19.000000000 =
+0200
+++ 2011-10-18/xen/common/sysctl.c	2011-09-21 16:36:54.000000000 =
+0200
@@ -183,7 +183,7 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc
         uint32_t i, nr_cpus;
         struct xen_sysctl_cpuinfo cpuinfo;
=20
-        nr_cpus =3D min_t(uint32_t, op->u.getcpuinfo.max_cpus, NR_CPUS);
+        nr_cpus =3D min(op->u.getcpuinfo.max_cpus, nr_cpu_ids);
=20
         ret =3D xsm_getcpuinfo();
         if ( ret )
--- 2011-10-18.orig/xen/drivers/acpi/pmstat.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/drivers/acpi/pmstat.c	2011-09-21 16:37:46.0000000=
00 +0200
@@ -53,7 +53,7 @@ int do_get_pm_info(struct xen_sysctl_get
     int ret =3D 0;
     const struct processor_pminfo *pmpt;
=20
-    if ( !op || (op->cpuid >=3D NR_CPUS) || !cpu_online(op->cpuid) )
+    if ( !op || (op->cpuid >=3D nr_cpu_ids) || !cpu_online(op->cpuid) )
         return -EINVAL;
     pmpt =3D processor_pminfo[op->cpuid];
=20
--- 2011-10-18.orig/xen/include/asm-x86/setup.h	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/include/asm-x86/setup.h	2011-09-21 16:02:25.0000000=
00 +0200
@@ -20,6 +20,8 @@ int nsc_init_cpu(void);
 int centaur_init_cpu(void);
 int transmeta_init_cpu(void);
=20
+void set_nr_cpu_ids(unsigned int max_cpus);
+
 void numa_initmem_init(unsigned long start_pfn, unsigned long end_pfn);
 void arch_init_memory(void);
 void subarch_init_memory(void);
--- 2011-10-18.orig/xen/include/xen/cpumask.h	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/include/xen/cpumask.h	2011-10-17 08:43:34.0000000=
00 +0200
@@ -81,26 +81,43 @@
=20
 typedef struct cpumask{ DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;
=20
+extern unsigned int nr_cpu_ids;
+
+#if NR_CPUS > 4 * BITS_PER_LONG && !defined(__ia64__)
+/* Assuming NR_CPUS is huge, a runtime limit is more efficient.  Also,
+ * not all bits may be allocated. */
+extern unsigned int nr_cpumask_bits;
+#else
+# define nr_cpumask_bits (BITS_TO_LONGS(NR_CPUS) * BITS_PER_LONG)
+#endif
+
+/* verify cpu argument to cpumask_* operators */
+static inline unsigned int cpumask_check(unsigned int cpu)
+{
+	ASSERT(cpu < nr_cpu_ids);
+	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(cpu, dstp->bits);
+	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(cpu, dstp->bits);
+	clear_bit(cpumask_check(cpu), dstp->bits);
 }
=20
-#define cpumask_setall(dst) __cpus_setall(dst, NR_CPUS)
+#define cpumask_setall(dst) __cpus_setall(dst, nr_cpumask_bits)
 #define cpus_setall(dst) __cpus_setall(&(dst), NR_CPUS)
 static inline void __cpus_setall(cpumask_t *dstp, int nbits)
 {
 	bitmap_fill(dstp->bits, nbits);
 }
=20
-#define cpumask_clear(dst) __cpus_clear(dst, NR_CPUS)
+#define cpumask_clear(dst) __cpus_clear(dst, nr_cpumask_bits)
 #define cpus_clear(dst) __cpus_clear(&(dst), NR_CPUS)
 static inline void __cpus_clear(cpumask_t *dstp, int nbits)
 {
@@ -108,24 +125,26 @@ static inline void __cpus_clear(cpumask_
 }
=20
 /* No static inline type checking - see Subtlety (1) above. */
-#define cpumask_test_cpu(cpu, cpumask) test_bit(cpu, (cpumask)->bits)
+#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(cpu, addr->bits);
+	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(cpu, addr->bits);
+	return test_and_clear_bit(cpumask_check(cpu), addr->bits);
 }
=20
-#define cpumask_and(dst, src1, src2) __cpus_and(dst, src1, src2, NR_CPUS)
+#define cpumask_and(dst, src1, src2) \
+	__cpus_and(dst, src1, src2, nr_cpumask_bits)
 #define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), =
NR_CPUS)
 static inline void __cpus_and(cpumask_t *dstp, const cpumask_t *src1p,
 					const cpumask_t *src2p, int nbits)
@@ -133,7 +152,8 @@ static inline void __cpus_and(cpumask_t=20
 	bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits);
 }
=20
-#define cpumask_or(dst, src1, src2) __cpus_or(dst, src1, src2, NR_CPUS)
+#define cpumask_or(dst, src1, src2) \
+	__cpus_or(dst, src1, src2, nr_cpumask_bits)
 #define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), =
NR_CPUS)
 static inline void __cpus_or(cpumask_t *dstp, const cpumask_t *src1p,
 					const cpumask_t *src2p, int nbits)
@@ -141,7 +161,8 @@ static inline void __cpus_or(cpumask_t *
 	bitmap_or(dstp->bits, src1p->bits, src2p->bits, nbits);
 }
=20
-#define cpumask_xor(dst, src1, src2) __cpus_xor(dst, src1, src2, NR_CPUS)
+#define cpumask_xor(dst, src1, src2) \
+	__cpus_xor(dst, src1, src2, nr_cpumask_bits)
 #define cpus_xor(dst, src1, src2) __cpus_xor(&(dst), &(src1), &(src2), =
NR_CPUS)
 static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p,
 					const cpumask_t *src2p, int nbits)
@@ -149,7 +170,8 @@ static inline void __cpus_xor(cpumask_t=20
 	bitmap_xor(dstp->bits, src1p->bits, src2p->bits, nbits);
 }
=20
-#define cpumask_andnot(dst, src1, src2) __cpus_andnot(dst, src1, src2, =
NR_CPUS)
+#define cpumask_andnot(dst, src1, src2) \
+	__cpus_andnot(dst, src1, src2, nr_cpumask_bits)
 #define cpus_andnot(dst, src1, src2) \
 				__cpus_andnot(&(dst), &(src1), &(src2), =
NR_CPUS)
 static inline void __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p,
@@ -158,7 +180,8 @@ static inline void __cpus_andnot(cpumask
 	bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits);
 }
=20
-#define cpumask_complement(dst, src) __cpus_complement(dst, src, NR_CPUS)
+#define cpumask_complement(dst, src) \
+	__cpus_complement(dst, src, nr_cpumask_bits)
 #define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), =
NR_CPUS)
 static inline void __cpus_complement(cpumask_t *dstp,
 					const cpumask_t *srcp, int nbits)
@@ -166,55 +189,62 @@ static inline void __cpus_complement(cpu
 	bitmap_complement(dstp->bits, srcp->bits, nbits);
 }
=20
-#define cpumask_equal(src1, src2) __cpus_equal(src1, src2, NR_CPUS)
-#define cpus_equal(src1, src2) __cpus_equal(&(src1), &(src2), NR_CPUS)
+#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)
 {
 	return bitmap_equal(src1p->bits, src2p->bits, nbits);
 }
=20
-#define cpus_intersects(src1, src2) __cpus_intersects(&(src1), &(src2), =
NR_CPUS)
+#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)
 {
 	return bitmap_intersects(src1p->bits, src2p->bits, nbits);
 }
=20
-#define cpus_subset(src1, src2) __cpus_subset(&(src1), &(src2), NR_CPUS)
+#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)
 {
 	return bitmap_subset(src1p->bits, src2p->bits, nbits);
 }
=20
-#define cpumask_empty(src) __cpus_empty(src, NR_CPUS)
-#define cpus_empty(src) __cpus_empty(&(src), NR_CPUS)
+#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)
 {
 	return bitmap_empty(srcp->bits, nbits);
 }
=20
-#define cpumask_full(cpumask) __cpus_full(cpumask, NR_CPUS)
-#define cpus_full(cpumask) __cpus_full(&(cpumask), NR_CPUS)
+#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)
 {
 	return bitmap_full(srcp->bits, nbits);
 }
=20
-#define cpumask_weight(cpumask) __cpus_weight(cpumask, NR_CPUS)
-#define cpus_weight(cpumask) __cpus_weight(&(cpumask), NR_CPUS)
+#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)
 {
 	return bitmap_weight(srcp->bits, nbits);
 }
=20
-#define cpus_copy(dest, src) cpumask_copy(&(dest), &(src))
-static inline void cpumask_copy(cpumask_t *dstp, const cpumask_t *srcp)
+#define cpumask_copy(dest, src) __cpus_copy(dest, src, nr_cpumask_bits)
+#define cpus_copy(dest, src) __cpus_copy(&(dest), &(src), NR_CPUS)
+static inline void __cpus_copy(cpumask_t *dstp, const cpumask_t *srcp, =
int nbits)
 {
-	bitmap_copy(dstp->bits, srcp->bits, NR_CPUS);
+	bitmap_copy(dstp->bits, srcp->bits, nbits);
 }
=20
+#define cpumask_shift_right(dst, src, n) \
+	__cpus_shift_right(dst, src, n, nr_cpumask_bits)
 #define cpus_shift_right(dst, src, n) \
 			__cpus_shift_right(&(dst), &(src), (n), NR_CPUS)
 static inline void __cpus_shift_right(cpumask_t *dstp,
@@ -223,6 +253,8 @@ static inline void __cpus_shift_right(cp
 	bitmap_shift_right(dstp->bits, srcp->bits, n, nbits);
 }
=20
+#define cpumask_shift_left(dst, src, n) \
+	__cpus_shift_left(dst, src, n, nr_cpumask_bits)
 #define cpus_shift_left(dst, src, n) \
 			__cpus_shift_left(&(dst), &(src), (n), NR_CPUS)
 static inline void __cpus_shift_left(cpumask_t *dstp,
@@ -231,22 +263,22 @@ static inline void __cpus_shift_left(cpu
 	bitmap_shift_left(dstp->bits, srcp->bits, n, nbits);
 }
=20
-#define cpumask_first(src) __first_cpu(src, NR_CPUS)
-#define first_cpu(src) __first_cpu(&(src), NR_CPUS)
+#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)
 {
 	return min_t(int, nbits, find_first_bit(srcp->bits, nbits));
 }
=20
-#define cpumask_next(n, src) __next_cpu(n, src, NR_CPUS)
-#define next_cpu(n, src) __next_cpu((n), &(src), NR_CPUS)
+#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)
 {
 	return min_t(int, nbits, find_next_bit(srcp->bits, nbits, n+1));
 }
=20
-#define cpumask_last(src) __last_cpu(src, NR_CPUS)
-#define last_cpu(src) __last_cpu(&(src), NR_CPUS)
+#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)
 {
 	int cpu, pcpu =3D nbits;
@@ -257,8 +289,8 @@ static inline int __last_cpu(const cpuma
 	return pcpu;
 }
=20
-#define cpumask_cycle(n, src) __cycle_cpu(n, src, NR_CPUS)
-#define cycle_cpu(n, src) __cycle_cpu((n), &(src), NR_CPUS)
+#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);
@@ -317,7 +349,7 @@ static inline const cpumask_t *cpumask_o
 #define cpus_addr(src) ((src).bits)
=20
 #define cpumask_scnprintf(buf, len, src) \
-			__cpumask_scnprintf((buf), (len), &(src), NR_CPUS)
+	__cpumask_scnprintf((buf), (len), &(src), nr_cpu_ids)
 static inline int __cpumask_scnprintf(char *buf, int len,
 					const cpumask_t *srcp, int nbits)
 {
@@ -325,7 +357,7 @@ static inline int __cpumask_scnprintf(ch
 }
=20
 #define cpulist_scnprintf(buf, len, src) \
-			__cpulist_scnprintf((buf), (len), &(src), NR_CPUS)
+	__cpulist_scnprintf((buf), (len), &(src), nr_cpu_ids)
 static inline int __cpulist_scnprintf(char *buf, int len,
 					const cpumask_t *srcp, int nbits)
 {
@@ -355,6 +387,11 @@ typedef cpumask_t *cpumask_var_t;
=20
 static inline bool_t alloc_cpumask_var(cpumask_var_t *mask)
 {
+	/*
+	 * Once all direct cpumask assignments and all cpus_*() accessors
+	 * still referencing NR_CPUS are gone, we could use nr_cpumask_bits=

+	 * to determine the allocation size here.
+	 */
 	return (*mask =3D xmalloc(cpumask_t)) !=3D NULL;
 }
=20
@@ -386,7 +423,7 @@ static inline bool_t zalloc_cpumask_var(
 #if NR_CPUS > 1
 #define for_each_cpu_mask(cpu, mask)		\
 	for ((cpu) =3D first_cpu(mask);		\
-		(cpu) < NR_CPUS;		\
+		(cpu) < nr_cpu_ids;		\
 		(cpu) =3D next_cpu((cpu), (mask)))
 #else /* NR_CPUS =3D=3D 1 */
 #define for_each_cpu_mask(cpu, mask) for ((cpu) =3D 0; (cpu) < 1; =
(cpu)++)



--=__PartB09F5312.0__=
Content-Type: text/plain; name="nr-cpumask-bits.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="nr-cpumask-bits.patch"

introduce and use nr_cpu_ids and nr_cpumask_bits=0A=0AThe former is the =
runtime equivalent of NR_CPUS (and users of NR_CPUS,=0Awhere necessary, =
get adjusted accordingly), while the latter is for the=0Asole use of =
determining the allocation size when dynamically allocating=0ACPU masks =
(done later in this series).=0A=0AAdjust accessors to use either of the =
two to bound their bitmap=0Aoperations - which one gets used depends on =
whether accessing the bits=0Ain the gap between nr_cpu_ids and nr_cpumask_b=
its is benign but more=0Aefficient.=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- 2011-10-18.orig/xen/arch/x86/acpi/cpu_idle.c	=
2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/acpi/cpu_=
idle.c	2011-10-07 09:18:28.000000000 +0200=0A@@ -900,7 +900,7 @@ int =
get_cpu_id(u32 acpi_id)=0A     if ( apic_id =3D=3D BAD_APICID )=0A         =
return -1;=0A =0A-    for ( i =3D 0; i < NR_CPUS; i++ )=0A+    for ( i =3D =
0; i < nr_cpu_ids; i++ )=0A     {=0A         if ( apic_id =3D=3D x86_cpu_to=
_apicid[i] )=0A             return i;=0A--- 2011-10-18.orig/xen/arch/x86/ac=
pi/cpufreq/cpufreq.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/acpi/cpufreq/cpufreq.c	2011-09-21 16:40:02.0000000=
00 +0200=0A@@ -209,7 +209,7 @@ static u32 get_cur_val(const cpumask_t *=0A =
=0A     if (!cpumask_test_cpu(cpu, mask))=0A         cpu =3D cpumask_first(=
mask);=0A-    if (cpu >=3D NR_CPUS || !cpu_online(cpu))=0A+    if (cpu =
>=3D nr_cpu_ids || !cpu_online(cpu))=0A         return 0;=0A =0A     =
policy =3D per_cpu(cpufreq_cpu_policy, cpu);=0A--- 2011-10-18.orig/xen/arch=
/x86/acpi/lib.c	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/ar=
ch/x86/acpi/lib.c	2011-09-21 16:40:21.000000000 +0200=0A@@ -95,7 =
+95,7 @@ int arch_acpi_set_pdc_bits(u32 acpi_id, =0A =0A 	if =
(!(acpi_id + 1))=0A 		c =3D &boot_cpu_data;=0A-	else if =
(cpu >=3D NR_CPUS || !cpu_online(cpu))=0A+	else if (cpu >=3D =
nr_cpu_ids || !cpu_online(cpu))=0A 		return -EINVAL;=0A 	=
else=0A 		c =3D cpu_data + cpu;=0A--- 2011-10-18.orig/xen/arc=
h/x86/cpu/common.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/cpu/common.c	2011-09-21 16:46:43.000000000 =
+0200=0A@@ -532,7 +532,7 @@ void __cpuinit detect_ht(struct cpuinfo_=0A 	=
	printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");=0A 	} =
else if (c->x86_num_siblings > 1 ) {=0A =0A-		if (c->x86_num_sibl=
ings > NR_CPUS) {=0A+		if (c->x86_num_siblings > nr_cpu_ids) {=0A =
			printk(KERN_WARNING "CPU: Unsupported number of =
the siblings %d", c->x86_num_siblings);=0A 			c->x86_num_=
siblings =3D 1;=0A 			return;=0A--- 2011-10-18.orig/xen/a=
rch/x86/cpu/mcheck/mce.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/cpu/mcheck/mce.c	2011-10-07 09:18:39.0000000=
00 +0200=0A@@ -1487,7 +1487,7 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) =
u=0A         mc_msrinject =3D &op->u.mc_msrinject;=0A         target =3D =
mc_msrinject->mcinj_cpunr;=0A =0A-        if (target >=3D NR_CPUS)=0A+     =
   if (target >=3D nr_cpu_ids)=0A             return x86_mcerr("do_mca =
inject: bad target", -EINVAL);=0A =0A         if (!cpu_online(target))=0A@@=
 -1514,7 +1514,7 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u=0A         =
mc_mceinject =3D &op->u.mc_mceinject;=0A         target =3D mc_mceinject->m=
ceinj_cpunr;=0A =0A-        if (target >=3D NR_CPUS)=0A+        if (target =
>=3D nr_cpu_ids)=0A             return x86_mcerr("do_mca #MC: bad target", =
-EINVAL);=0A =0A         if (!cpu_online(target))=0A--- 2011-10-18.orig/xen=
/arch/x86/microcode.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/microcode.c	2011-09-21 16:42:31.000000000 =
+0200=0A@@ -126,7 +126,7 @@ static long do_microcode_update(void *_i=0A    =
     info->error =3D error;=0A =0A     info->cpu =3D next_cpu(info->cpu, =
cpu_online_map);=0A-    if ( info->cpu < NR_CPUS )=0A+    if ( info->cpu < =
nr_cpu_ids )=0A         return continue_hypercall_on_cpu(info->cpu, =
do_microcode_update, info);=0A =0A     error =3D info->error;=0A--- =
2011-10-18.orig/xen/arch/x86/mpparse.c	2011-10-20 14:46:19.000000000 =
+0200=0A+++ 2011-10-18/xen/arch/x86/mpparse.c	2011-10-14 10:23:28.0000000=
00 +0200=0A@@ -28,6 +28,7 @@=0A #include <asm/mtrr.h>=0A #include =
<asm/mpspec.h>=0A #include <asm/io_apic.h>=0A+#include <asm/setup.h>=0A =
=0A #include <mach_apic.h>=0A #include <mach_mpparse.h>=0A@@ -61,10 +62,31 =
@@ unsigned int __read_mostly boot_cpu_phys=0A =0A /* Internal processor =
count */=0A static unsigned int __devinitdata num_processors;=0A+static =
unsigned int __initdata disabled_cpus;=0A =0A /* Bitmask of physically =
existing CPUs */=0A physid_mask_t phys_cpu_present_map;=0A =0A+void __init =
set_nr_cpu_ids(unsigned int max_cpus)=0A+{=0A+	if (!max_cpus)=0A+		=
max_cpus =3D num_processors + disabled_cpus;=0A+	if (max_cpus > =
NR_CPUS)=0A+		max_cpus =3D NR_CPUS;=0A+	else if (!max_cpus)=
=0A+		max_cpus =3D 1;=0A+	printk(XENLOG_INFO "SMP: Allowing =
%u CPUs (%d hotplug CPUs)\n",=0A+	       max_cpus, max_t(int, =
max_cpus - num_processors, 0));=0A+	nr_cpu_ids =3D max_cpus;=0A+=0A+#if=
ndef nr_cpumask_bits=0A+	nr_cpumask_bits =3D (max_cpus + (BITS_PER_L=
ONG - 1)) &=0A+			  ~(BITS_PER_LONG - 1);=0A+	printk(XENL=
OG_DEBUG "NR_CPUS:%u nr_cpumask_bits:%u\n",=0A+	       NR_CPUS, nr_cpumask_=
bits);=0A+#endif=0A+}=0A+=0A /*=0A  * Intel MP BIOS table parsing =
routines:=0A  */=0A@@ -90,8 +112,11 @@ static int __devinit MP_processor_in=
fo_x=0A {=0A  	int ver, apicid, cpu =3D 0;=0A  	=0A-	if =
(!(m->mpc_cpuflag & CPU_ENABLED))=0A+	if (!(m->mpc_cpuflag & CPU_ENABLED)=
) {=0A+		if (!hotplug)=0A+			++disabled_cpus;=0A=
 		return -EINVAL;=0A+	}=0A =0A 	apicid =3D =
mpc_apic_id(m, apicidx);=0A =0A@@ -115,9 +140,9 @@ static int __devinit =
MP_processor_info_x=0A =0A 	set_apicid(apicid, &phys_cpu_present_map);=
=0A =0A-	if (num_processors >=3D NR_CPUS) {=0A-		printk(KERN=
_WARNING "WARNING: NR_CPUS limit of %i reached."=0A-			"  =
Processor ignored.\n", NR_CPUS);=0A+	if (num_processors >=3D nr_cpu_ids)=
 {=0A+		printk(KERN_WARNING "WARNING: NR_CPUS limit of %u =
reached."=0A+			"  Processor ignored.\n", nr_cpu_ids);=0A 	=
	return -ENOSPC;=0A 	}=0A =0A--- 2011-10-18.orig/xen/arch/x86/nu=
ma.c	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/n=
uma.c	2011-09-21 16:44:01.000000000 +0200=0A@@ -198,7 +198,7 @@ void =
__init numa_init_array(void)=0A 	   CPUs, as the number of CPUs is =
not known yet. =0A 	   We round robin the existing nodes. */=0A 	rr =
=3D first_node(node_online_map);=0A-	for (i =3D 0; i < NR_CPUS; i++) =
{=0A+	for (i =3D 0; i < nr_cpu_ids; i++) {=0A 		if =
(cpu_to_node[i] !=3D NUMA_NO_NODE)=0A 			continue;=0A  		=
numa_set_node(i, rr);=0A@@ -280,7 +280,7 @@ void __init numa_initmem_init(u=
nsigned l=0A 	memnodemap =3D _memnodemap;=0A 	nodes_clear(node_online_map=
);=0A 	node_set_online(0);=0A-	for (i =3D 0; i < NR_CPUS; i++)=0A+	=
for (i =3D 0; i < nr_cpu_ids; i++)=0A 		numa_set_node(i, 0);=0A 	=
node_to_cpumask[0] =3D cpumask_of_cpu(0);=0A 	setup_node_bootmem(0, =
(u64)start_pfn << PAGE_SHIFT, (u64)end_pfn << PAGE_SHIFT);=0A@@ -335,7 =
+335,7 @@ static __init int numa_setup(char *opt) =0A void __init =
init_cpu_to_node(void)=0A {=0A 	int i, node;=0A- 	for (i =3D 0; i < =
NR_CPUS; i++) {=0A+ 	for (i =3D 0; i < nr_cpu_ids; i++) {=0A 		=
u32 apicid =3D x86_cpu_to_apicid[i];=0A 		if (apicid =3D=3D =
BAD_APICID)=0A 			continue;=0A--- 2011-10-18.orig/xen/arch/x8=
6/oprofile/nmi_int.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/oprofile/nmi_int.c	2011-09-21 16:45:12.0000000=
00 +0200=0A@@ -127,7 +127,7 @@ static void nmi_save_registers(void * du=0A =
static void free_msrs(void)=0A {=0A 	int i;=0A-	for (i =3D 0; i < =
NR_CPUS; ++i) {=0A+	for (i =3D 0; i < nr_cpu_ids; ++i) {=0A 		=
xfree(cpu_msrs[i].counters);=0A 		cpu_msrs[i].counters =3D =
NULL;=0A 		xfree(cpu_msrs[i].controls);=0A--- 2011-10-18.orig/=
xen/arch/x86/platform_hypercall.c	2011-10-20 14:46:20.000000000 =
+0200=0A+++ 2011-10-18/xen/arch/x86/platform_hypercall.c	2011-10-20 =
14:47:11.000000000 +0200=0A@@ -442,7 +442,7 @@ ret_t do_platform_op(XEN_GUE=
ST_HANDLE(xe=0A             break;=0A         }=0A =0A-        if ( =
(g_info->xen_cpuid >=3D NR_CPUS) ||=0A+        if ( (g_info->xen_cpuid =
>=3D nr_cpu_ids) ||=0A              !cpu_present(g_info->xen_cpuid) )=0A   =
      {=0A             g_info->flags |=3D XEN_PCPU_FLAGS_INVALID;=0A--- =
2011-10-18.orig/xen/arch/x86/setup.c	2011-10-20 14:46:19.000000000 =
+0200=0A+++ 2011-10-18/xen/arch/x86/setup.c	2011-09-21 16:41:20.0000000=
00 +0200=0A@@ -51,7 +51,7 @@ static bool_t __initdata opt_nosmp;=0A =
boolean_param("nosmp", opt_nosmp);=0A =0A /* maxcpus: maximum number of =
CPUs to activate. */=0A-static unsigned int __initdata max_cpus =3D =
NR_CPUS;=0A+static unsigned int __initdata max_cpus;=0A integer_param("maxc=
pus", max_cpus);=0A =0A /* opt_watchdog: If true, run a watchdog NMI on =
each processor. */=0A@@ -230,7 +230,7 @@ static void __init normalise_cpu_o=
rder(v=0A          * Among identical longest-prefix matches, pick the =
smallest APIC ID.=0A          */=0A         for ( j =3D next_cpu(i, =
cpu_present_map);=0A-              j < NR_CPUS;=0A+              j < =
nr_cpu_ids;=0A               j =3D next_cpu(j, cpu_present_map) )=0A       =
  {=0A             diff =3D x86_cpu_to_apicid[j] ^ apicid;=0A@@ -246,9 =
+246,9 @@ static void __init normalise_cpu_order(v=0A         }=0A =0A     =
    /* If no match then there must be no CPUs remaining to consider. =
*/=0A-        if ( min_cpu >=3D NR_CPUS )=0A+        if ( min_cpu >=3D =
nr_cpu_ids )=0A         {=0A-            BUG_ON(next_cpu(i, cpu_present_map=
) < NR_CPUS);=0A+            BUG_ON(next_cpu(i, cpu_present_map) < =
nr_cpu_ids);=0A             break;=0A         }=0A =0A@@ -1203,6 +1203,17 =
@@ void __init __start_xen(unsigned long mb=0A     if ( smp_found_config =
)=0A         get_smp_config();=0A =0A+    if ( opt_nosmp )=0A+    {=0A+    =
    max_cpus =3D 0;=0A+        set_nr_cpu_ids(1);=0A+    }=0A+    else=0A+ =
   {=0A+        set_nr_cpu_ids(max_cpus);=0A+        max_cpus =3D =
nr_cpu_ids;=0A+    }=0A+=0A #ifdef CONFIG_X86_64=0A     /* Low mappings =
were only needed for some BIOS table parsing. */=0A     zap_low_mappings();=
=0A@@ -1254,9 +1265,6 @@ void __init __start_xen(unsigned long mb=0A     =
acpi_mmcfg_init();=0A #endif=0A =0A-    if ( opt_nosmp )=0A-        =
max_cpus =3D 0;=0A-=0A     iommu_setup();    /* setup iommu if available =
*/=0A =0A     smp_prepare_cpus(max_cpus);=0A--- 2011-10-18.orig/xen/arch/x8=
6/smpboot.c	2011-10-18 11:04:45.000000000 +0200=0A+++ 2011-10-18/xen/ar=
ch/x86/smpboot.c	2011-10-12 13:59:39.000000000 +0200=0A@@ -535,7 =
+535,7 @@ int alloc_cpu_id(void)=0A     int cpu;=0A     cpus_complement(tmp=
_map, cpu_present_map);=0A     cpu =3D first_cpu(tmp_map);=0A-    return =
(cpu < NR_CPUS) ? cpu : -ENODEV;=0A+    return (cpu < nr_cpu_ids) ? cpu : =
-ENODEV;=0A }=0A =0A static int do_boot_cpu(int apicid, int cpu)=0A--- =
2011-10-18.orig/xen/arch/x86/srat.c	2011-10-20 14:46:19.000000000 =
+0200=0A+++ 2011-10-18/xen/arch/x86/srat.c	2011-09-21 16:56:11.0000000=
00 +0200=0A@@ -447,7 +447,7 @@ int __init acpi_scan_nodes(u64 start, u6=0A =
			continue;=0A 		setup_node_bootmem(i, =
nodes[i].start, nodes[i].end);=0A 	}=0A-	for (i =3D 0; i < NR_CPUS; =
i++) { =0A+	for (i =3D 0; i < nr_cpu_ids; i++) {=0A 		if =
(cpu_to_node[i] =3D=3D NUMA_NO_NODE)=0A 			=
continue;=0A 		if (!node_isset(cpu_to_node[i], nodes_parsed))=0A--=
- 2011-10-18.orig/xen/arch/x86/sysctl.c	2011-10-20 14:46:19.000000000 =
+0200=0A+++ 2011-10-18/xen/arch/x86/sysctl.c	2011-09-21 16:44:47.0000000=
00 +0200=0A@@ -82,7 +82,7 @@ long arch_do_sysctl(=0A         pi->nr_cpus =
=3D num_online_cpus();=0A         pi->nr_nodes =3D num_online_nodes();=0A  =
       pi->max_node_id =3D MAX_NUMNODES-1;=0A-        pi->max_cpu_id =3D =
NR_CPUS-1;=0A+        pi->max_cpu_id =3D nr_cpu_ids - 1;=0A         =
pi->total_pages =3D total_pages;=0A         pi->free_pages =3D avail_domhea=
p_pages();=0A         pi->scrub_pages =3D 0;=0A--- 2011-10-18.orig/xen/arch=
/x86/tboot.c	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/ar=
ch/x86/tboot.c	2011-09-21 16:42:13.000000000 +0200=0A@@ -248,7 +248,7 @@ =
static int mfn_in_guarded_stack(unsigned=0A     void *p;=0A     int i;=0A =
=0A-    for ( i =3D 0; i < NR_CPUS; i++ )=0A+    for ( i =3D 0; i < =
nr_cpu_ids; i++ )=0A     {=0A         if ( !stack_base[i] )=0A             =
continue;=0A--- 2011-10-18.orig/xen/arch/x86/traps.c	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/traps.c	2011-10-18 =
12:45:55.000000000 +0200=0A@@ -3412,7 +3412,7 @@ static void __set_intr_gat=
e(unsigned int=0A {=0A     int i;=0A     /* Keep secondary tables in sync =
with IRQ updates. */=0A-    for ( i =3D 1; i < NR_CPUS; i++ )=0A+    for ( =
i =3D 1; i < nr_cpu_ids; i++ )=0A         if ( idt_tables[i] !=3D NULL =
)=0A             _set_gate(&idt_tables[i][n], 14, dpl, addr);=0A     =
_set_gate(&idt_table[n], 14, dpl, addr);=0A--- 2011-10-18.orig/xen/common/c=
pu.c	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/common/cpu=
.c	2011-10-17 08:39:11.000000000 +0200=0A@@ -6,6 +6,12 @@=0A #include =
<xen/sched.h>=0A #include <xen/stop_machine.h>=0A =0A+unsigned int =
__read_mostly nr_cpu_ids =3D NR_CPUS;=0A+#ifndef nr_cpumask_bits=0A+unsigne=
d int __read_mostly nr_cpumask_bits=0A+    =3D BITS_TO_LONGS(NR_CPUS) * =
BITS_PER_LONG;=0A+#endif=0A+=0A /*=0A  * cpu_bit_bitmap[] is a special, =
"compressed" data structure that=0A  * represents all NR_CPUS bits binary =
values of 1<<nr.=0A@@ -80,7 +86,7 @@ int cpu_down(unsigned int cpu)=0A     =
if ( !cpu_hotplug_begin() )=0A         return -EBUSY;=0A =0A-    if ( (cpu =
>=3D NR_CPUS) || (cpu =3D=3D 0) || !cpu_online(cpu) )=0A+    if ( (cpu =
>=3D nr_cpu_ids) || (cpu =3D=3D 0) || !cpu_online(cpu) )=0A     {=0A       =
  cpu_hotplug_done();=0A         return -EINVAL;=0A@@ -122,7 +128,7 @@ int =
cpu_up(unsigned int cpu)=0A     if ( !cpu_hotplug_begin() )=0A         =
return -EBUSY;=0A =0A-    if ( (cpu >=3D NR_CPUS) || cpu_online(cpu) || =
!cpu_present(cpu) )=0A+    if ( (cpu >=3D nr_cpu_ids) || cpu_online(cpu) =
|| !cpu_present(cpu) )=0A     {=0A         cpu_hotplug_done();=0A         =
return -EINVAL;=0A--- 2011-10-18.orig/xen/common/cpupool.c	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/common/cpupool.c	2011-10-07 =
09:17:45.000000000 +0200=0A@@ -489,7 +489,7 @@ int cpupool_do_sysctl(struct=
 xen_sysctl_=0A         if ( cpu =3D=3D XEN_SYSCTL_CPUPOOL_PAR_ANY )=0A    =
         cpu =3D first_cpu(cpupool_free_cpus);=0A         ret =3D =
-EINVAL;=0A-        if ( cpu >=3D NR_CPUS )=0A+        if ( cpu >=3D =
nr_cpu_ids )=0A             goto addcpu_out;=0A         ret =3D -EBUSY;=0A =
        if ( !cpu_isset(cpu, cpupool_free_cpus) )=0A@@ -517,7 +517,7 @@ =
int cpupool_do_sysctl(struct xen_sysctl_=0A         cpu =3D op->cpu;=0A    =
     if ( cpu =3D=3D XEN_SYSCTL_CPUPOOL_PAR_ANY )=0A             cpu =3D =
last_cpu(c->cpu_valid);=0A-        ret =3D (cpu < NR_CPUS) ? cpupool_unassi=
gn_cpu(c, cpu) : -EINVAL;=0A+        ret =3D (cpu < nr_cpu_ids) ? =
cpupool_unassign_cpu(c, cpu) : -EINVAL;=0A         cpupool_put(c);=0A     =
}=0A     break;=0A--- 2011-10-18.orig/xen/common/domain.c	2011-10-20 =
14:46:20.000000000 +0200=0A+++ 2011-10-18/xen/common/domain.c	2011-09-21 =
16:33:10.000000000 +0200=0A@@ -1023,7 +1023,7 @@ int continue_hypercall_on_=
cpu(=0A {=0A     struct migrate_info *info;=0A =0A-    if ( (cpu >=3D =
NR_CPUS) || !cpu_online(cpu) )=0A+    if ( (cpu >=3D nr_cpu_ids) || =
!cpu_online(cpu) )=0A         return -EINVAL;=0A =0A     info =3D =
this_cpu(continue_info);=0A--- 2011-10-18.orig/xen/common/kexec.c	=
2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/common/kexec.c	=
2011-09-21 16:33:57.000000000 +0200=0A@@ -296,7 +296,7 @@ static int =
kexec_get_cpu(xen_kexec_range=0A     int nr =3D range->nr;=0A     int =
nr_bytes =3D 0;=0A =0A-    if ( nr < 0 || nr >=3D NR_CPUS || !cpu_online(nr=
) )=0A+    if ( nr < 0 || nr >=3D nr_cpu_ids || !cpu_online(nr) )=0A       =
  return -EINVAL;=0A =0A     nr_bytes +=3D sizeof_note("CORE", sizeof(ELF_P=
rstatus));=0A--- 2011-10-18.orig/xen/common/keyhandler.c	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/common/keyhandler.c	=
2011-09-21 16:32:28.000000000 +0200=0A@@ -98,7 +98,7 @@ void dump_execstate=
(struct cpu_user_regs=0A         return;=0A =0A     cpu =3D cycle_cpu(cpu, =
dump_execstate_mask);=0A-    if ( cpu < NR_CPUS )=0A+    if ( cpu < =
nr_cpu_ids )=0A     {=0A         smp_send_state_dump(cpu);=0A         =
return;=0A--- 2011-10-18.orig/xen/common/sched_credit.c	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/common/sched_credit.c	=
2011-10-07 09:18:05.000000000 +0200=0A@@ -374,7 +374,7 @@ csched_alloc_pdat=
a(const struct schedule=0A =0A     INIT_LIST_HEAD(&spc->runq);=0A     =
spc->runq_sort_last =3D prv->runq_sort;=0A-    spc->idle_bias =3D NR_CPUS =
- 1;=0A+    spc->idle_bias =3D nr_cpu_ids - 1;=0A     if ( per_cpu(schedule=
_data, cpu).sched_priv =3D=3D NULL )=0A         per_cpu(schedule_data, =
cpu).sched_priv =3D spc;=0A =0A--- 2011-10-18.orig/xen/common/sched_credit2=
.c	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/common/sch=
ed_credit2.c	2011-10-07 09:18:09.000000000 +0200=0A@@ -2071,7 +2071,7 =
@@ csched_init(struct scheduler *ops)=0A     INIT_LIST_HEAD(&prv->sdom);=0A=
 =0A     /* But un-initialize all runqueues */=0A-    for ( i=3D0; =
i<NR_CPUS; i++)=0A+    for ( i =3D 0; i < nr_cpu_ids; i++ )=0A     {=0A    =
     prv->runq_map[i] =3D -1;=0A         prv->rqd[i].id =3D -1;=0A--- =
2011-10-18.orig/xen/common/sched_sedf.c	2011-10-20 14:46:19.000000000 =
+0200=0A+++ 2011-10-18/xen/common/sched_sedf.c	2011-10-07 09:18:14.0000000=
00 +0200=0A@@ -1201,7 +1201,7 @@ static void sedf_wake(const struct =
sched=0A       routine. Try to avoid unnecessary runs but:=0A       Save =
approximation: Always switch to scheduler!*/=0A     ASSERT(d->processor =
>=3D 0);=0A-    ASSERT(d->processor < NR_CPUS);=0A+    ASSERT(d->processor =
< nr_cpu_ids);=0A     ASSERT(per_cpu(schedule_data, d->processor).curr);=0A=
 =0A     if ( should_switch(per_cpu(schedule_data, d->processor).curr, d, =
now) )=0A--- 2011-10-18.orig/xen/common/schedule.c	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/common/schedule.c	2011-10-12 =
13:59:19.000000000 +0200=0A@@ -1353,7 +1353,7 @@ void __init scheduler_init=
(void)=0A     idle_domain =3D domain_create(DOMID_IDLE, 0, 0);=0A     =
BUG_ON(idle_domain =3D=3D NULL);=0A     idle_domain->vcpu =3D idle_vcpu;=0A=
-    idle_domain->max_vcpus =3D NR_CPUS;=0A+    idle_domain->max_vcpus =3D =
nr_cpu_ids;=0A     if ( alloc_vcpu(idle_domain, 0, 0) =3D=3D NULL )=0A     =
    BUG();=0A     if ( ops.alloc_pdata &&=0A--- 2011-10-18.orig/xen/common/=
sysctl.c	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/co=
mmon/sysctl.c	2011-09-21 16:36:54.000000000 +0200=0A@@ -183,7 +183,7 @@ =
long do_sysctl(XEN_GUEST_HANDLE(xen_sysc=0A         uint32_t i, nr_cpus;=0A=
         struct xen_sysctl_cpuinfo cpuinfo;=0A =0A-        nr_cpus =3D =
min_t(uint32_t, op->u.getcpuinfo.max_cpus, NR_CPUS);=0A+        nr_cpus =
=3D min(op->u.getcpuinfo.max_cpus, nr_cpu_ids);=0A =0A         ret =3D =
xsm_getcpuinfo();=0A         if ( ret )=0A--- 2011-10-18.orig/xen/drivers/a=
cpi/pmstat.c	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/dr=
ivers/acpi/pmstat.c	2011-09-21 16:37:46.000000000 +0200=0A@@ -53,7 =
+53,7 @@ int do_get_pm_info(struct xen_sysctl_get=0A     int ret =3D 0;=0A =
    const struct processor_pminfo *pmpt;=0A =0A-    if ( !op || (op->cpuid =
>=3D NR_CPUS) || !cpu_online(op->cpuid) )=0A+    if ( !op || (op->cpuid =
>=3D nr_cpu_ids) || !cpu_online(op->cpuid) )=0A         return -EINVAL;=0A =
    pmpt =3D processor_pminfo[op->cpuid];=0A =0A--- 2011-10-18.orig/xen/inc=
lude/asm-x86/setup.h	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/include/asm-x86/setup.h	2011-09-21 16:02:25.000000000 =
+0200=0A@@ -20,6 +20,8 @@ int nsc_init_cpu(void);=0A int centaur_init_cpu(v=
oid);=0A int transmeta_init_cpu(void);=0A =0A+void set_nr_cpu_ids(unsigned =
int max_cpus);=0A+=0A void numa_initmem_init(unsigned long start_pfn, =
unsigned long end_pfn);=0A void arch_init_memory(void);=0A void subarch_ini=
t_memory(void);=0A--- 2011-10-18.orig/xen/include/xen/cpumask.h	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/include/xen/cpumask.h	=
2011-10-17 08:43:34.000000000 +0200=0A@@ -81,26 +81,43 @@=0A =0A typedef =
struct cpumask{ DECLARE_BITMAP(bits, NR_CPUS); } cpumask_t;=0A =0A+extern =
unsigned int nr_cpu_ids;=0A+=0A+#if NR_CPUS > 4 * BITS_PER_LONG && =
!defined(__ia64__)=0A+/* Assuming NR_CPUS is huge, a runtime limit is more =
efficient.  Also,=0A+ * not all bits may be allocated. */=0A+extern =
unsigned int nr_cpumask_bits;=0A+#else=0A+# define nr_cpumask_bits =
(BITS_TO_LONGS(NR_CPUS) * BITS_PER_LONG)=0A+#endif=0A+=0A+/* verify cpu =
argument to cpumask_* operators */=0A+static inline unsigned int cpumask_ch=
eck(unsigned int cpu)=0A+{=0A+	ASSERT(cpu < nr_cpu_ids);=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(cpu, dstp->bits);=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_cpu(int cpu, volatile =
cpumask_t *dstp)=0A {=0A-	clear_bit(cpu, dstp->bits);=0A+	clear_bit(c=
pumask_check(cpu), dstp->bits);=0A }=0A =0A-#define cpumask_setall(dst) =
__cpus_setall(dst, NR_CPUS)=0A+#define cpumask_setall(dst) __cpus_setall(ds=
t, nr_cpumask_bits)=0A #define cpus_setall(dst) __cpus_setall(&(dst), =
NR_CPUS)=0A static inline void __cpus_setall(cpumask_t *dstp, int =
nbits)=0A {=0A 	bitmap_fill(dstp->bits, nbits);=0A }=0A =0A-#define =
cpumask_clear(dst) __cpus_clear(dst, NR_CPUS)=0A+#define cpumask_clear(dst)=
 __cpus_clear(dst, nr_cpumask_bits)=0A #define cpus_clear(dst) __cpus_clear=
(&(dst), NR_CPUS)=0A static inline void __cpus_clear(cpumask_t *dstp, int =
nbits)=0A {=0A@@ -108,24 +125,26 @@ static inline void __cpus_clear(cpumask=
_=0A }=0A =0A /* No static inline type checking - see Subtlety (1) above. =
*/=0A-#define cpumask_test_cpu(cpu, cpumask) test_bit(cpu, (cpumask)->bits)=
=0A+#define cpumask_test_cpu(cpu, cpumask) \=0A+	test_bit(cpumask_ch=
eck(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(cpu=
, addr->bits);=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_te=
st_and_clear_cpu(int cpu, cpumask_t *addr)=0A {=0A-	return test_and_cle=
ar_bit(cpu, addr->bits);=0A+	return test_and_clear_bit(cpumask_check(cpu=
), addr->bits);=0A }=0A =0A-#define cpumask_and(dst, src1, src2) __cpus_and=
(dst, src1, src2, NR_CPUS)=0A+#define cpumask_and(dst, src1, src2) \=0A+	=
__cpus_and(dst, src1, src2, nr_cpumask_bits)=0A #define cpus_and(dst, =
src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS)=0A static inline =
void __cpus_and(cpumask_t *dstp, const cpumask_t *src1p,=0A 			=
		const cpumask_t *src2p, int nbits)=0A@@ -133,7 +152,8 @@ =
static inline void __cpus_and(cpumask_t =0A 	bitmap_and(dstp->bits, =
src1p->bits, src2p->bits, nbits);=0A }=0A =0A-#define cpumask_or(dst, =
src1, src2) __cpus_or(dst, src1, src2, NR_CPUS)=0A+#define cpumask_or(dst, =
src1, src2) \=0A+	__cpus_or(dst, src1, src2, nr_cpumask_bits)=0A =
#define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), =
NR_CPUS)=0A static inline void __cpus_or(cpumask_t *dstp, const cpumask_t =
*src1p,=0A 					const cpumask_t *src2p, =
int nbits)=0A@@ -141,7 +161,8 @@ static inline void __cpus_or(cpumask_t =
*=0A 	bitmap_or(dstp->bits, src1p->bits, src2p->bits, nbits);=0A }=0A =
=0A-#define cpumask_xor(dst, src1, src2) __cpus_xor(dst, src1, src2, =
NR_CPUS)=0A+#define cpumask_xor(dst, src1, src2) \=0A+	__cpus_xor(dst, =
src1, src2, nr_cpumask_bits)=0A #define cpus_xor(dst, src1, src2) =
__cpus_xor(&(dst), &(src1), &(src2), NR_CPUS)=0A static inline void =
__cpus_xor(cpumask_t *dstp, const cpumask_t *src1p,=0A 				=
	const cpumask_t *src2p, int nbits)=0A@@ -149,7 +170,8 @@ static =
inline void __cpus_xor(cpumask_t =0A 	bitmap_xor(dstp->bits, src1p->bits,=
 src2p->bits, nbits);=0A }=0A =0A-#define cpumask_andnot(dst, src1, src2) =
__cpus_andnot(dst, src1, src2, NR_CPUS)=0A+#define cpumask_andnot(dst, =
src1, src2) \=0A+	__cpus_andnot(dst, src1, src2, nr_cpumask_bits)=0A =
#define cpus_andnot(dst, src1, src2) \=0A 				=
__cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS)=0A static inline void =
__cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p,=0A@@ -158,7 +180,8 =
@@ static inline void __cpus_andnot(cpumask=0A 	bitmap_andnot(dstp->bits, =
src1p->bits, src2p->bits, nbits);=0A }=0A =0A-#define cpumask_complement(ds=
t, src) __cpus_complement(dst, src, NR_CPUS)=0A+#define cpumask_complement(=
dst, src) \=0A+	__cpus_complement(dst, src, nr_cpumask_bits)=0A #define =
cpus_complement(dst, src) __cpus_complement(&(dst), &(src), NR_CPUS)=0A =
static inline void __cpus_complement(cpumask_t *dstp,=0A 			=
		const cpumask_t *srcp, int nbits)=0A@@ -166,55 +189,62 @@ =
static inline void __cpus_complement(cpu=0A 	bitmap_complement(dstp->bit=
s, srcp->bits, nbits);=0A }=0A =0A-#define cpumask_equal(src1, src2) =
__cpus_equal(src1, src2, NR_CPUS)=0A-#define cpus_equal(src1, src2) =
__cpus_equal(&(src1), &(src2), NR_CPUS)=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 {=0A 	return bitmap_equal(src1p->=
bits, src2p->bits, nbits);=0A }=0A =0A-#define cpus_intersects(src1, src2) =
__cpus_intersects(&(src1), &(src2), NR_CPUS)=0A+#define cpumask_intersects(=
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 {=0A 	return bitmap_intersects(src1p->bits, =
src2p->bits, nbits);=0A }=0A =0A-#define cpus_subset(src1, src2) __cpus_sub=
set(&(src1), &(src2), NR_CPUS)=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_sub=
set(const cpumask_t *src1p,=0A 					const =
cpumask_t *src2p, int nbits)=0A {=0A 	return bitmap_subset(src1p->bits, =
src2p->bits, nbits);=0A }=0A =0A-#define cpumask_empty(src) __cpus_empty(sr=
c, NR_CPUS)=0A-#define cpus_empty(src) __cpus_empty(&(src), NR_CPUS)=0A+#de=
fine cpumask_empty(src) __cpus_empty(src, nr_cpu_ids)=0A+#define cpus_empty=
(src) __cpus_empty(&(src), nr_cpu_ids)=0A static inline int __cpus_empty(co=
nst cpumask_t *srcp, int nbits)=0A {=0A 	return bitmap_empty(srcp->b=
its, nbits);=0A }=0A =0A-#define cpumask_full(cpumask) __cpus_full(cpumask,=
 NR_CPUS)=0A-#define cpus_full(cpumask) __cpus_full(&(cpumask), NR_CPUS)=0A=
+#define cpumask_full(cpumask) __cpus_full(cpumask, 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 {=0A 	return =
bitmap_full(srcp->bits, nbits);=0A }=0A =0A-#define cpumask_weight(cpumask)=
 __cpus_weight(cpumask, NR_CPUS)=0A-#define cpus_weight(cpumask) __cpus_wei=
ght(&(cpumask), NR_CPUS)=0A+#define cpumask_weight(cpumask) __cpus_weight(c=
pumask, nr_cpu_ids)=0A+#define cpus_weight(cpumask) __cpus_weight(&(cpumask=
), nr_cpu_ids)=0A static inline int __cpus_weight(const cpumask_t *srcp, =
int nbits)=0A {=0A 	return bitmap_weight(srcp->bits, nbits);=0A }=0A =
=0A-#define cpus_copy(dest, src) cpumask_copy(&(dest), &(src))=0A-static =
inline void cpumask_copy(cpumask_t *dstp, const cpumask_t *srcp)=0A+#define=
 cpumask_copy(dest, src) __cpus_copy(dest, src, nr_cpumask_bits)=0A+#define=
 cpus_copy(dest, src) __cpus_copy(&(dest), &(src), NR_CPUS)=0A+static =
inline void __cpus_copy(cpumask_t *dstp, const cpumask_t *srcp, int =
nbits)=0A {=0A-	bitmap_copy(dstp->bits, srcp->bits, NR_CPUS);=0A+	=
bitmap_copy(dstp->bits, srcp->bits, nbits);=0A }=0A =0A+#define cpumask_shi=
ft_right(dst, src, n) \=0A+	__cpus_shift_right(dst, src, n, nr_cpumask_=
bits)=0A #define cpus_shift_right(dst, src, n) \=0A 			=
__cpus_shift_right(&(dst), &(src), (n), NR_CPUS)=0A static inline void =
__cpus_shift_right(cpumask_t *dstp,=0A@@ -223,6 +253,8 @@ static inline =
void __cpus_shift_right(cp=0A 	bitmap_shift_right(dstp->bits, srcp->bits, =
n, nbits);=0A }=0A =0A+#define cpumask_shift_left(dst, src, n) \=0A+	=
__cpus_shift_left(dst, src, n, nr_cpumask_bits)=0A #define cpus_shift_left(=
dst, src, n) \=0A 			__cpus_shift_left(&(dst), &(src), =
(n), NR_CPUS)=0A static inline void __cpus_shift_left(cpumask_t *dstp,=0A@@=
 -231,22 +263,22 @@ static inline void __cpus_shift_left(cpu=0A 	=
bitmap_shift_left(dstp->bits, srcp->bits, n, nbits);=0A }=0A =0A-#define =
cpumask_first(src) __first_cpu(src, NR_CPUS)=0A-#define first_cpu(src) =
__first_cpu(&(src), NR_CPUS)=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 {=0A 	=
return min_t(int, nbits, find_first_bit(srcp->bits, nbits));=0A }=0A =
=0A-#define cpumask_next(n, src) __next_cpu(n, src, NR_CPUS)=0A-#define =
next_cpu(n, src) __next_cpu((n), &(src), NR_CPUS)=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 {=0A 	return min_t(int, nbits, =
find_next_bit(srcp->bits, nbits, n+1));=0A }=0A =0A-#define cpumask_last(sr=
c) __last_cpu(src, NR_CPUS)=0A-#define last_cpu(src) __last_cpu(&(src), =
NR_CPUS)=0A+#define cpumask_last(src) __last_cpu(src, nr_cpu_ids)=0A+#defin=
e last_cpu(src) __last_cpu(&(src), nr_cpu_ids)=0A static inline int =
__last_cpu(const cpumask_t *srcp, int nbits)=0A {=0A 	int cpu, pcpu =3D =
nbits;=0A@@ -257,8 +289,8 @@ static inline int __last_cpu(const cpuma=0A 	=
return pcpu;=0A }=0A =0A-#define cpumask_cycle(n, src) __cycle_cpu(n, src, =
NR_CPUS)=0A-#define cycle_cpu(n, src) __cycle_cpu((n), &(src), NR_CPUS)=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@@ -317,7 +349,7 @@ static inline =
const cpumask_t *cpumask_o=0A #define cpus_addr(src) ((src).bits)=0A =0A =
#define cpumask_scnprintf(buf, len, src) \=0A-			__cpumask_s=
cnprintf((buf), (len), &(src), NR_CPUS)=0A+	__cpumask_scnprintf((buf), =
(len), &(src), nr_cpu_ids)=0A static inline int __cpumask_scnprintf(char =
*buf, int len,=0A 					const cpumask_t =
*srcp, int nbits)=0A {=0A@@ -325,7 +357,7 @@ static inline int __cpumask_sc=
nprintf(ch=0A }=0A =0A #define cpulist_scnprintf(buf, len, src) \=0A-		=
	__cpulist_scnprintf((buf), (len), &(src), NR_CPUS)=0A+	__cpulist_s=
cnprintf((buf), (len), &(src), nr_cpu_ids)=0A static inline int __cpulist_s=
cnprintf(char *buf, int len,=0A 					=
const cpumask_t *srcp, int nbits)=0A {=0A@@ -355,6 +387,11 @@ typedef =
cpumask_t *cpumask_var_t;=0A =0A static inline bool_t alloc_cpumask_var(cpu=
mask_var_t *mask)=0A {=0A+	/*=0A+	 * Once all direct cpumask =
assignments and all cpus_*() accessors=0A+	 * still referencing =
NR_CPUS are gone, we could use nr_cpumask_bits=0A+	 * to determine =
the allocation size here.=0A+	 */=0A 	return (*mask =3D xmalloc(cpumask_t=
)) !=3D NULL;=0A }=0A =0A@@ -386,7 +423,7 @@ static inline bool_t =
zalloc_cpumask_var(=0A #if NR_CPUS > 1=0A #define for_each_cpu_mask(cpu, =
mask)		\=0A 	for ((cpu) =3D first_cpu(mask);		\=0A-		=
(cpu) < NR_CPUS;		\=0A+		(cpu) < nr_cpu_ids;		=
\=0A 		(cpu) =3D next_cpu((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
--=__PartB09F5312.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

--=__PartB09F5312.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:40:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:40:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGsqw-0006Tq-Up; Thu, 20 Oct 2011 06:40:11 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGsog-0005dX-Dp
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:37:52 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1319117866!36050341!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17610 invoked from network); 20 Oct 2011 13:37:46 -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; 20 Oct 2011 13:37:46 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:37:47 +0100
Message-Id: <4EA04049020000780005C7AA@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:37:45 +0100
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="=__Part9BB47839.0__="
Subject: [Xen-devel] [PATCH 02/12] eliminate cpumask accessors referencing
	NR_CPUS
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--=__Part9BB47839.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

... in favor of using the new, nr_cpumask_bits-based ones.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- 2011-10-18.orig/xen/arch/ia64/linux-xen/acpi.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/ia64/linux-xen/acpi.c	2011-10-11 17:51:40.0000000=
00 +0200
@@ -957,14 +957,14 @@ int acpi_map_lsapic(acpi_handle handle,=20
 	buffer.length =3D ACPI_ALLOCATE_BUFFER;
 	buffer.pointer =3D NULL;
=20
-	cpus_complement(tmp_map, cpu_present_map);
-	cpu =3D first_cpu(tmp_map);
-	if (cpu >=3D NR_CPUS)
+	cpumask_complement(&tmp_map, &cpu_present_map);
+	cpu =3D cpumask_first(&tmp_map);
+	if (cpu >=3D nr_cpu_ids)
 		return -EINVAL;
=20
 	acpi_map_cpu2node(handle, cpu, physid);
=20
-	cpu_set(cpu, cpu_present_map);
+	cpumask_set_cpu(cpu, &cpu_present_map);
 	ia64_cpu_to_sapicid[cpu] =3D physid;
=20
 	*pcpu =3D cpu;
--- 2011-10-18.orig/xen/arch/ia64/linux-xen/numa.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/ia64/linux-xen/numa.c	2011-10-11 17:02:13.0000000=
00 +0200
@@ -51,7 +51,7 @@ void __init build_cpu_to_node_map(void)
 	int cpu, i, node;
=20
 	for(node=3D0; node < MAX_NUMNODES; node++)
-		cpus_clear(node_to_cpu_mask[node]);
+		cpumask_clear(&node_to_cpu_mask[node]);
=20
 	for(cpu =3D 0; cpu < NR_CPUS; ++cpu) {
 		node =3D -1;
@@ -62,6 +62,6 @@ void __init build_cpu_to_node_map(void)
 			}
 		cpu_to_node_map[cpu] =3D (node >=3D 0) ? node : 0;
 		if (node >=3D 0)
-			cpu_set(cpu, node_to_cpu_mask[node]);
+			cpumask_set_cpu(cpu, &node_to_cpu_mask[node]);
 	}
 }
--- 2011-10-18.orig/xen/arch/ia64/linux-xen/smpboot.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/ia64/linux-xen/smpboot.c	2011-10-11 =
17:00:51.000000000 +0200
@@ -594,15 +594,15 @@ smp_build_cpu_map (void)
 	}
=20
 	ia64_cpu_to_sapicid[0] =3D boot_cpu_id;
-	cpus_clear(cpu_present_map);
-	cpu_set(0, cpu_present_map);
-	cpu_set(0, cpu_possible_map);
+	cpumask_clear(&cpu_present_map);
+	cpumask_set_cpu(0, &cpu_present_map);
+	cpumask_set_cpu(0, &cpu_possible_map);
 	for (cpu =3D 1, i =3D 0; i < smp_boot_data.cpu_count; i++) {
 		sapicid =3D smp_boot_data.cpu_phys_id[i];
 		if (sapicid =3D=3D boot_cpu_id)
 			continue;
-		cpu_set(cpu, cpu_present_map);
-		cpu_set(cpu, cpu_possible_map);
+		cpumask_set_cpu(cpu, &cpu_present_map);
+		cpumask_set_cpu(cpu, &cpu_possible_map);
 		ia64_cpu_to_sapicid[cpu] =3D sapicid;
 		cpu++;
 	}
@@ -640,12 +640,12 @@ smp_prepare_cpus (unsigned int max_cpus)
 	 */
 	if (!max_cpus) {
 		printk(KERN_INFO "SMP mode deactivated.\n");
-		cpus_clear(cpu_online_map);
-		cpus_clear(cpu_present_map);
-		cpus_clear(cpu_possible_map);
-		cpu_set(0, cpu_online_map);
-		cpu_set(0, cpu_present_map);
-		cpu_set(0, cpu_possible_map);
+		cpumask_clear(&cpu_online_map);
+		cpumask_clear(&cpu_present_map);
+		cpumask_clear(&cpu_possible_map);
+		cpumask_set_cpu(0, &cpu_online_map);
+		cpumask_set_cpu(0, &cpu_present_map);
+		cpumask_set_cpu(0, &cpu_possible_map);
 		return;
 	}
 }
@@ -688,12 +688,12 @@ clear_cpu_sibling_map(int cpu)
 	int i;
=20
 	for_each_cpu_mask(i, per_cpu(cpu_sibling_map, cpu))
-		cpu_clear(cpu, per_cpu(cpu_sibling_map, i));
+		cpumask_clear_cpu(cpu, &per_cpu(cpu_sibling_map, i));
 	for_each_cpu_mask(i, per_cpu(cpu_core_map, cpu))
-		cpu_clear(cpu, per_cpu(cpu_core_map, i));
+		cpumask_clear_cpu(cpu, &per_cpu(cpu_core_map, i));
=20
-	cpus_clear(per_cpu(cpu_sibling_map, cpu));
-	cpus_clear(per_cpu(cpu_core_map, cpu));
+	cpumask_clear(&per_cpu(cpu_sibling_map, cpu));
+	cpumask_clear(&per_cpu(cpu_core_map, cpu));
 }
=20
 static void
--- 2011-10-18.orig/xen/arch/ia64/linux-xen/sn/kernel/sn2_smp.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/ia64/linux-xen/sn/kernel/sn2_smp.c	2011-10-11 =
16:58:35.000000000 +0200
@@ -206,7 +206,7 @@ sn2_global_tlb_purge(unsigned long start
 	static DEFINE_SPINLOCK(sn2_ptcg_lock2);
=20
 	nodes_clear(nodes_flushed);
-	cpus_clear(selected_cpus);
+	cpumask_clear(&selected_cpus);
=20
 	spin_lock(&sn2_ptcg_lock2);
 	node_set(cpu_to_node(smp_processor_id()), nodes_flushed);
--- 2011-10-18.orig/xen/arch/ia64/xen/fw_emul.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/arch/ia64/xen/fw_emul.c	2011-10-11 16:43:45.0000000=
00 +0200
@@ -866,10 +866,10 @@ xen_pal_emulator(unsigned long index, u6
 			             "status %lx", status);
=20
 		if (in1 =3D=3D PAL_CACHE_TYPE_COHERENT) {
-			cpus_setall(current->arch.cache_coherent_map);
-			cpu_clear(processor, current->arch.cache_coherent_m=
ap);
-			cpus_setall(cpu_cache_coherent_map);
-			cpu_clear(processor, cpu_cache_coherent_map);
+			cpumask_complement(&current->arch.cache_coherent_ma=
p,
+					   cpumask_of(processor));
+			cpumask_complement(&cpu_cache_coherent_map,
+					   cpumask_of(processor));
 		}
 		break;
 	    case PAL_PERF_MON_INFO:
--- 2011-10-18.orig/xen/arch/ia64/xen/tlb_track.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/ia64/xen/tlb_track.c	2011-10-11 16:58:01.0000000=
00 +0200
@@ -374,7 +374,7 @@ tlb_track_insert_or_dirty(struct tlb_tra
         entry->pte_val =3D old_pte;
         entry->vaddr =3D vaddr;
         entry->rid =3D rid;
-        cpus_clear(entry->pcpu_dirty_mask);
+        cpumask_clear(&entry->pcpu_dirty_mask);
         vcpus_clear(entry->vcpu_dirty_mask);
         list_add(&entry->list, head);
=20
--- 2011-10-18.orig/xen/arch/ia64/xen/xensetup.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/ia64/xen/xensetup.c	2011-10-12 08:44:31.0000000=
00 +0200
@@ -592,7 +592,7 @@ skip_move:
     smp_prepare_cpus(max_cpus);
=20
     /* We aren't hotplug-capable yet. */
-    cpus_or(cpu_present_map, cpu_present_map, cpu_possible_map);
+    cpumask_or(&cpu_present_map, &cpu_present_map, &cpu_possible_map);
=20
     /*  Enable IRQ to receive IPI (needed for ITC sync).  */
     local_irq_enable();
--- 2011-10-18.orig/xen/arch/x86/acpi/cpu_idle.c	2011-10-07 =
09:18:28.000000000 +0200
+++ 2011-10-18/xen/arch/x86/acpi/cpu_idle.c	2011-10-12 08:34:33.0000000=
00 +0200
@@ -233,13 +233,13 @@ void cpuidle_wakeup_mwait(cpumask_t *mas
     cpumask_t target;
     unsigned int cpu;
=20
-    cpus_and(target, *mask, cpuidle_mwait_flags);
+    cpumask_and(&target, mask, &cpuidle_mwait_flags);
=20
     /* CPU is MWAITing on the cpuidle_mwait_wakeup flag. */
     for_each_cpu_mask(cpu, target)
         mwait_wakeup(cpu) =3D 0;
=20
-    cpus_andnot(*mask, *mask, target);
+    cpumask_andnot(mask, mask, &target);
 }
=20
 static void mwait_idle_with_hints(unsigned long eax, unsigned long ecx)
--- 2011-10-18.orig/xen/arch/x86/acpi/cpufreq/cpufreq.c	2011-09-21 =
16:40:02.000000000 +0200
+++ 2011-10-18/xen/arch/x86/acpi/cpufreq/cpufreq.c	2011-10-12 =
08:35:12.000000000 +0200
@@ -446,7 +446,7 @@ static int acpi_cpufreq_target(struct cp
     if (unlikely(result))
         return -ENODEV;
=20
-    cpus_and(online_policy_cpus, cpu_online_map, policy->cpus);
+    cpumask_and(&online_policy_cpus, &cpu_online_map, &policy->cpus);
=20
     next_perf_state =3D data->freq_table[next_state].index;
     if (perf->state =3D=3D next_perf_state) {
--- 2011-10-18.orig/xen/arch/x86/cpu/mcheck/mce.c	2011-10-07 =
09:18:39.000000000 +0200
+++ 2011-10-18/xen/arch/x86/cpu/mcheck/mce.c	2011-10-11 17:22:32.0000000=
00 +0200
@@ -1537,20 +1537,19 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u
             return x86_mcerr("do_mca #MC", -ENODEV);
=20
         if ( op->u.mc_inject_v2.flags & XEN_MC_INJECT_CPU_BROADCAST )
-            cpus_copy(cpumap, cpu_online_map);
+            cpumask_copy(&cpumap, &cpu_online_map);
         else
         {
             int gcw;
=20
-            cpus_clear(cpumap);
             xenctl_cpumap_to_cpumask(&cpumap,
                                      &op->u.mc_inject_v2.cpumap);
-            gcw =3D cpus_weight(cpumap);
-            cpus_and(cpumap, cpu_online_map, cpumap);
+            gcw =3D cpumask_weight(&cpumap);
+            cpumask_and(&cpumap, &cpu_online_map, &cpumap);
=20
-            if ( cpus_empty(cpumap) )
+            if ( cpumask_empty(&cpumap) )
                 return x86_mcerr("No online CPU passed\n", -EINVAL);
-            else if ( gcw !=3D cpus_weight(cpumap) )
+            else if ( gcw !=3D cpumask_weight(&cpumap) )
                 dprintk(XENLOG_INFO,
                         "Not all required CPUs are online\n");
         }
@@ -1559,7 +1558,7 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u
         {
         case XEN_MC_INJECT_TYPE_MCE:
             if ( mce_broadcast &&
-                 !cpus_equal(cpumap, cpu_online_map) )
+                 !cpumask_equal(&cpumap, &cpu_online_map) )
                 printk("Not trigger MCE on all CPUs, may HANG!\n");
             on_selected_cpus(&cpumap, x86_mc_mceinject, NULL, 1);
             break;
--- 2011-10-18.orig/xen/arch/x86/hpet.c	2011-10-18 11:14:42.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/hpet.c	2011-10-12 09:00:51.000000000 =
+0200
@@ -178,7 +178,7 @@ again:
     spin_unlock_irq(&ch->lock);
=20
     next_event =3D STIME_MAX;
-    mask =3D (cpumask_t)CPU_MASK_NONE;
+    cpumask_clear(&mask);
     now =3D NOW();
=20
     /* find all expired events */
@@ -189,11 +189,11 @@ again:
         rmb();
         deadline =3D per_cpu(timer_deadline, cpu);
         rmb();
-        if ( !cpu_isset(cpu, ch->cpumask) )
+        if ( !cpumask_test_cpu(cpu, &ch->cpumask) )
             continue;
=20
         if ( deadline <=3D now )
-            cpu_set(cpu, mask);
+            cpumask_set_cpu(cpu, &mask);
         else if ( deadline < next_event )
             next_event =3D deadline;
     }
--- 2011-10-18.orig/xen/arch/x86/hvm/nestedhvm.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/x86/hvm/nestedhvm.c	2011-10-11 17:24:46.0000000=
00 +0200
@@ -116,7 +116,7 @@ nestedhvm_vmcx_flushtlb(struct p2m_domai
 {
     on_selected_cpus(&p2m->p2m_dirty_cpumask, nestedhvm_flushtlb_ipi,
         p2m->domain, 1);
-    cpus_clear(p2m->p2m_dirty_cpumask);
+    cpumask_clear(&p2m->p2m_dirty_cpumask);
 }
=20
 bool_t
--- 2011-10-18.orig/xen/arch/x86/io_apic.c	2011-10-18 12:27:30.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/io_apic.c	2011-10-18 13:32:32.000000000 =
+0200
@@ -1850,7 +1850,7 @@ static void __init check_timer(void)
     int apic1, pin1, apic2, pin2;
     int vector, ret;
     unsigned long flags;
-    cpumask_t mask_all =3D CPU_MASK_ALL;
+    cpumask_t mask_all;
=20
     local_irq_save(flags);
=20
@@ -1861,6 +1861,7 @@ static void __init check_timer(void)
     vector =3D FIRST_HIPRIORITY_VECTOR;
     clear_irq_vector(0);
=20
+    cpumask_setall(&mask_all);
     if ((ret =3D bind_irq_vector(0, vector, &mask_all)))
         printk(KERN_ERR"..IRQ0 is not set correctly with ioapic!!!, =
err:%d\n", ret);
    =20
--- 2011-10-18.orig/xen/arch/x86/irq.c	2011-10-18 12:37:35.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/irq.c	2011-10-18 13:32:30.000000000 =
+0200
@@ -115,10 +115,10 @@ static int __init __bind_irq_vector(int=20
     BUG_ON((unsigned)irq >=3D nr_irqs);
     BUG_ON((unsigned)vector >=3D NR_VECTORS);
=20
-    cpus_and(online_mask, *cpu_mask, cpu_online_map);
-    if (cpus_empty(online_mask))
+    cpumask_and(&online_mask, cpu_mask, &cpu_online_map);
+    if (cpumask_empty(&online_mask))
         return -EINVAL;
-    if ((cfg->vector =3D=3D vector) && cpus_equal(cfg->cpu_mask, =
online_mask))
+    if ((cfg->vector =3D=3D vector) && cpumask_equal(&cfg->cpu_mask, =
&online_mask))
         return 0;
     if (cfg->vector !=3D IRQ_VECTOR_UNASSIGNED)=20
         return -EBUSY;
@@ -126,7 +126,7 @@ static int __init __bind_irq_vector(int=20
     for_each_cpu_mask(cpu, online_mask)
         per_cpu(vector_irq, cpu)[vector] =3D irq;
     cfg->vector =3D vector;
-    cfg->cpu_mask =3D online_mask;
+    cpumask_copy(&cfg->cpu_mask, &online_mask);
     if ( cfg->used_vectors )
     {
         ASSERT(!test_bit(vector, cfg->used_vectors));
@@ -197,7 +197,7 @@ static void dynamic_irq_cleanup(unsigned
     desc->msi_desc =3D NULL;
     desc->handler =3D &no_irq_type;
     desc->arch.used_vectors =3D NULL;
-    cpus_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 */
@@ -217,7 +217,7 @@ static void __clear_irq_vector(int irq)
=20
     /* Always clear cfg->vector */
     vector =3D cfg->vector;
-    cpus_and(tmp_mask, cfg->cpu_mask, cpu_online_map);
+    cpumask_and(&tmp_mask, &cfg->cpu_mask, &cpu_online_map);
=20
     for_each_cpu_mask(cpu, tmp_mask) {
         ASSERT( per_cpu(vector_irq, cpu)[vector] =3D=3D irq );
@@ -225,7 +225,7 @@ static void __clear_irq_vector(int irq)
     }
=20
     cfg->vector =3D IRQ_VECTOR_UNASSIGNED;
-    cpus_clear(cfg->cpu_mask);
+    cpumask_clear(&cfg->cpu_mask);
=20
     if ( cfg->used_vectors )
     {
@@ -242,7 +242,7 @@ static void __clear_irq_vector(int irq)
=20
     /* If we were in motion, also clear cfg->old_vector */
     old_vector =3D cfg->old_vector;
-    cpus_and(tmp_mask, cfg->old_cpu_mask, cpu_online_map);
+    cpumask_and(&tmp_mask, &cfg->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 );
@@ -251,7 +251,7 @@ static void __clear_irq_vector(int irq)
      }
=20
     cfg->old_vector =3D IRQ_VECTOR_UNASSIGNED;
-    cpus_clear(cfg->old_cpu_mask);
+    cpumask_clear(&cfg->old_cpu_mask);
=20
     if ( cfg->used_vectors )
     {
@@ -303,7 +303,7 @@ static void __init init_one_irq_desc(str
     desc->action  =3D NULL;
     desc->msi_desc =3D NULL;
     spin_lock_init(&desc->lock);
-    cpus_setall(desc->affinity);
+    cpumask_setall(&desc->affinity);
     INIT_LIST_HEAD(&desc->rl_link);
 }
=20
@@ -311,8 +311,8 @@ static void __init init_one_irq_cfg(stru
 {
     cfg->vector =3D IRQ_VECTOR_UNASSIGNED;
     cfg->old_vector =3D IRQ_VECTOR_UNASSIGNED;
-    cpus_clear(cfg->cpu_mask);
-    cpus_clear(cfg->old_cpu_mask);
+    cpumask_clear(&cfg->cpu_mask);
+    cpumask_clear(&cfg->old_cpu_mask);
     cfg->used_vectors =3D NULL;
     cfg->used =3D IRQ_UNUSED;
 }
@@ -425,8 +425,8 @@ int __assign_irq_vector(int irq, struct=20
=20
     old_vector =3D irq_to_vector(irq);
     if (old_vector) {
-        cpus_and(tmp_mask, *mask, cpu_online_map);
-        if (cpus_intersects(tmp_mask, cfg->cpu_mask)) {
+        cpumask_and(&tmp_mask, mask, &cpu_online_map);
+        if (cpumask_intersects(&tmp_mask, &cfg->cpu_mask)) {
             cfg->vector =3D old_vector;
             return 0;
         }
@@ -455,7 +455,8 @@ int __assign_irq_vector(int irq, struct=20
         if (!cpu_online(cpu))
             continue;
=20
-        cpus_and(tmp_mask, *vector_allocation_cpumask(cpu), cpu_online_map=
);
+        cpumask_and(&tmp_mask, vector_allocation_cpumask(cpu),
+                    &cpu_online_map);
=20
         vector =3D current_vector;
         offset =3D current_offset;
@@ -485,14 +486,14 @@ next:
         local_irq_save(flags);
         if (old_vector) {
             cfg->move_in_progress =3D 1;
-            cpus_copy(cfg->old_cpu_mask, cfg->cpu_mask);
+            cpumask_copy(&cfg->old_cpu_mask, &cfg->cpu_mask);
             cfg->old_vector =3D cfg->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;
-        cpus_copy(cfg->cpu_mask, tmp_mask);
+        cpumask_copy(&cfg->cpu_mask, &tmp_mask);
=20
         cfg->used =3D IRQ_USED;
         ASSERT((cfg->used_vectors =3D=3D NULL)
@@ -529,7 +530,7 @@ int assign_irq_vector(int irq)
     ret =3D __assign_irq_vector(irq, cfg, TARGET_CPUS);
     if (!ret) {
         ret =3D cfg->vector;
-        cpus_copy(desc->affinity, cfg->cpu_mask);
+        cpumask_copy(&desc->affinity, &cfg->cpu_mask);
     }
     spin_unlock_irqrestore(&vector_lock, flags);
     return ret;
@@ -582,7 +583,7 @@ void move_masked_irq(struct irq_desc *de
     if (likely(cpus_intersects(desc->pending_mask, cpu_online_map)))
         desc->handler->set_affinity(desc, &desc->pending_mask);
=20
-    cpus_clear(desc->pending_mask);
+    cpumask_clear(&desc->pending_mask);
 }
=20
 void move_native_irq(struct irq_desc *desc)
@@ -729,7 +730,7 @@ void irq_set_affinity(struct irq_desc *d
     ASSERT(spin_is_locked(&desc->lock));
     desc->status &=3D ~IRQ_MOVE_PENDING;
     wmb();
-    cpus_copy(desc->pending_mask, *mask);
+    cpumask_copy(&desc->pending_mask, mask);
     wmb();
     desc->status |=3D IRQ_MOVE_PENDING;
 }
@@ -1474,7 +1475,6 @@ int pirq_guest_bind(struct vcpu *v, stru
     struct irq_desc         *desc;
     irq_guest_action_t *action, *newaction =3D NULL;
     int                 rc =3D 0;
-    cpumask_t           cpumask =3D CPU_MASK_NONE;
=20
     WARN_ON(!spin_is_locked(&v->domain->event_lock));
     BUG_ON(!local_irq_is_enabled());
@@ -1521,7 +1521,7 @@ int pirq_guest_bind(struct vcpu *v, stru
         action->in_flight   =3D 0;
         action->shareable   =3D will_share;
         action->ack_type    =3D pirq_acktype(v->domain, pirq->pirq);
-        cpus_clear(action->cpu_eoi_map);
+        cpumask_clear(&action->cpu_eoi_map);
         init_timer(&action->eoi_timer, irq_guest_eoi_timer_fn, desc, 0);
=20
         desc->status |=3D IRQ_GUEST;
@@ -1529,9 +1529,8 @@ int pirq_guest_bind(struct vcpu *v, stru
         desc->handler->startup(desc);
=20
         /* Attempt to bind the interrupt target to the correct CPU. */
-        cpu_set(v->processor, cpumask);
         if ( !opt_noirqbalance && (desc->handler->set_affinity !=3D NULL) =
)
-            desc->handler->set_affinity(desc, &cpumask);
+            desc->handler->set_affinity(desc, cpumask_of(v->processor));
     }
     else if ( !will_share || !action->shareable )
     {
@@ -2070,18 +2069,18 @@ void fixup_irqs(void)
=20
         spin_lock(&desc->lock);
=20
-        affinity =3D desc->affinity;
-        if ( !desc->action || cpus_subset(affinity, cpu_online_map) )
+        cpumask_copy(&affinity, &desc->affinity);
+        if ( !desc->action || cpumask_subset(&affinity, &cpu_online_map) =
)
         {
             spin_unlock(&desc->lock);
             continue;
         }
=20
-        cpus_and(affinity, affinity, cpu_online_map);
-        if ( cpus_empty(affinity) )
+        cpumask_and(&affinity, &affinity, &cpu_online_map);
+        if ( cpumask_empty(&affinity) )
         {
             break_affinity =3D 1;
-            affinity =3D cpu_online_map;
+            cpumask_copy(&affinity, &cpu_online_map);
         }
=20
         if ( desc->handler->disable )
--- 2011-10-18.orig/xen/arch/x86/mm.c	2011-10-20 14:46:20.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/mm.c	2011-10-20 14:47:26.000000000 =
+0200
@@ -1339,8 +1339,10 @@ static void pae_flush_pgd(
=20
     if ( unlikely(shadow_mode_enabled(d)) )
     {
-        cpumask_t m =3D CPU_MASK_NONE;
+        cpumask_t m;
+
         /* Re-shadow this l3 table on any vcpus that are using it */
+        cpumask_clear(&m);
         for_each_vcpu ( d, v )
             if ( pagetable_get_pfn(v->arch.guest_table) =3D=3D mfn )
             {
@@ -2887,7 +2889,7 @@ static inline int vcpumask_to_pcpumask(
     struct vcpu *v;
     bool_t is_native =3D !is_pv_32on64_domain(d);
=20
-    cpus_clear(*pmask);
+    cpumask_clear(pmask);
     for ( vmask =3D 0, offs =3D 0; ; ++offs)
     {
         vcpu_bias =3D offs * (is_native ? BITS_PER_LONG : 32);
@@ -2899,7 +2901,7 @@ static inline int vcpumask_to_pcpumask(
                       copy_from_guest_offset((unsigned int *)&vmask, =
bmap,
                                              offs, 1)) )
         {
-            cpus_clear(*pmask);
+            cpumask_clear(pmask);
             return -EFAULT;
         }
=20
@@ -3194,12 +3196,13 @@ int do_mmuext_op(
             else if ( likely(cache_flush_permitted(d)) )
             {
                 unsigned int cpu;
-                cpumask_t mask =3D CPU_MASK_NONE;
+                cpumask_t mask;
=20
+                cpumask_clear(&mask);
                 for_each_online_cpu(cpu)
-                    if ( !cpus_intersects(mask,
-                                          per_cpu(cpu_sibling_map, cpu)) =
)
-                        cpu_set(cpu, mask);
+                    if ( !cpumask_intersects(&mask,
+                                             &per_cpu(cpu_sibling_map, =
cpu)) )
+                        cpumask_set_cpu(cpu, &mask);
                 flush_mask(&mask, FLUSH_CACHE);
             }
             else
--- 2011-10-18.orig/xen/arch/x86/mm/p2m.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/mm/p2m.c	2011-10-14 09:47:46.000000000 =
+0200
@@ -81,7 +81,7 @@ static void p2m_initialise(struct domain
     p2m->default_access =3D p2m_access_rwx;
=20
     p2m->cr3 =3D CR3_EADDR;
-    cpus_clear(p2m->p2m_dirty_cpumask);
+    cpumask_clear(&p2m->p2m_dirty_cpumask);
=20
     if ( hap_enabled(d) && (boot_cpu_data.x86_vendor =3D=3D X86_VENDOR_INT=
EL) )
         ept_p2m_init(p2m);
--- 2011-10-18.orig/xen/arch/x86/mm/shadow/common.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/x86/mm/shadow/common.c	2011-10-11 17:14:11.0000000=
00 +0200
@@ -3459,7 +3459,7 @@ static void sh_unshadow_for_p2m_change(s
         p2m_type_t p2mt =3D p2m_flags_to_type(l1e_get_flags(*p));
         if ( p2m_is_valid(p2mt) && mfn_valid(omfn) )
         {
-            cpus_clear(flushmask);
+            cpumask_clear(&flushmask);
=20
             /* If we're replacing a superpage with a normal L1 page, map =
it */
             if ( (l1e_get_flags(new) & _PAGE_PRESENT)
--- 2011-10-18.orig/xen/arch/x86/smp.c	2011-10-20 14:46:19.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/smp.c	2011-10-12 08:33:44.000000000 =
+0200
@@ -240,12 +240,12 @@ void flush_area_mask(const cpumask_t *ma
     if ( !cpus_subset(*mask, *cpumask_of(smp_processor_id())) )
     {
         spin_lock(&flush_lock);
-        cpus_and(flush_cpumask, *mask, cpu_online_map);
-        cpu_clear(smp_processor_id(), flush_cpumask);
+        cpumask_and(&flush_cpumask, mask, &cpu_online_map);
+        cpumask_clear_cpu(smp_processor_id(), &flush_cpumask);
         flush_va      =3D va;
         flush_flags   =3D flags;
         send_IPI_mask(&flush_cpumask, INVALIDATE_TLB_VECTOR);
-        while ( !cpus_empty(flush_cpumask) )
+        while ( !cpumask_empty(&flush_cpumask) )
             cpu_relax();
         spin_unlock(&flush_lock);
     }
--- 2011-10-18.orig/xen/arch/x86/smpboot.c	2011-10-12 13:59:39.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/smpboot.c	2011-10-14 15:08:39.000000000 =
+0200
@@ -533,8 +533,9 @@ int alloc_cpu_id(void)
 {
     cpumask_t tmp_map;
     int cpu;
-    cpus_complement(tmp_map, cpu_present_map);
-    cpu =3D first_cpu(tmp_map);
+
+    cpumask_complement(&tmp_map, &cpu_present_map);
+    cpu =3D cpumask_first(&tmp_map);
     return (cpu < nr_cpu_ids) ? cpu : -ENODEV;
 }
=20
@@ -818,18 +819,18 @@ remove_siblinginfo(int cpu)
     {
         cpu_clear(cpu, per_cpu(cpu_core_map, sibling));
         /* Last thread sibling in this cpu core going down. */
-        if ( cpus_weight(per_cpu(cpu_sibling_map, cpu)) =3D=3D 1 )
+        if ( cpumask_weight(&per_cpu(cpu_sibling_map, cpu)) =3D=3D 1 )
             c[sibling].booted_cores--;
     }
   =20
     for_each_cpu_mask(sibling, per_cpu(cpu_sibling_map, cpu))
-        cpu_clear(cpu, per_cpu(cpu_sibling_map, sibling));
-    cpus_clear(per_cpu(cpu_sibling_map, cpu));
-    cpus_clear(per_cpu(cpu_core_map, cpu));
+        cpumask_clear_cpu(cpu, &per_cpu(cpu_sibling_map, sibling));
+    cpumask_clear(&per_cpu(cpu_sibling_map, cpu));
+    cpumask_clear(&per_cpu(cpu_core_map, cpu));
     c[cpu].phys_proc_id =3D BAD_APICID;
     c[cpu].cpu_core_id =3D BAD_APICID;
     c[cpu].compute_unit_id =3D BAD_APICID;
-    cpu_clear(cpu, cpu_sibling_setup_map);
+    cpumask_clear_cpu(cpu, &cpu_sibling_setup_map);
 }
=20
 void __cpu_disable(void)
--- 2011-10-18.orig/xen/arch/x86/time.c	2011-10-20 14:46:19.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/time.c	2011-10-12 09:01:16.000000000 =
+0200
@@ -185,15 +185,15 @@ static void smp_send_timer_broadcast_ipi
     int cpu =3D smp_processor_id();
     cpumask_t mask;
=20
-    cpus_and(mask, cpu_online_map, pit_broadcast_mask);
+    cpumask_and(&mask, &cpu_online_map, &pit_broadcast_mask);
=20
-    if ( cpu_isset(cpu, mask) )
+    if ( cpumask_test_cpu(cpu, &mask) )
     {
-        cpu_clear(cpu, mask);
+        cpumask_clear_cpu(cpu, &mask);
         raise_softirq(TIMER_SOFTIRQ);
     }
=20
-    if ( !cpus_empty(mask) )
+    if ( !cpumask_empty(&mask) )
     {
         cpumask_raise_softirq(&mask, TIMER_SOFTIRQ);
     }
@@ -1226,7 +1226,7 @@ void check_tsc_warp(unsigned long tsc_kh
 }
=20
 static unsigned long tsc_max_warp, tsc_check_count;
-static cpumask_t tsc_check_cpumask =3D CPU_MASK_NONE;
+static cpumask_t tsc_check_cpumask;
=20
 static void tsc_check_slave(void *unused)
 {
--- 2011-10-18.orig/xen/common/cpu.c	2011-10-17 08:39:11.000000000 =
+0200
+++ 2011-10-18/xen/common/cpu.c	2011-10-17 08:39:39.000000000 +0200
@@ -176,7 +176,7 @@ int disable_nonboot_cpus(void)
=20
     BUG_ON(smp_processor_id() !=3D 0);
=20
-    cpus_clear(frozen_cpus);
+    cpumask_clear(&frozen_cpus);
=20
     printk("Disabling non-boot CPUs ...\n");
=20
@@ -192,7 +192,7 @@ int disable_nonboot_cpus(void)
             break;
         }
=20
-        cpu_set(cpu, frozen_cpus);
+        cpumask_set_cpu(cpu, &frozen_cpus);
     }
=20
     BUG_ON(!error && (num_online_cpus() !=3D 1));
@@ -214,5 +214,5 @@ void enable_nonboot_cpus(void)
         }
     }
=20
-    cpus_clear(frozen_cpus);
+    cpumask_clear(&frozen_cpus);
 }
--- 2011-10-18.orig/xen/common/cpupool.c	2011-10-07 09:17:45.0000000=
00 +0200
+++ 2011-10-18/xen/common/cpupool.c	2011-10-12 09:02:23.000000000 =
+0200
@@ -29,7 +29,7 @@ static struct cpupool *cpupool_list;   =20
=20
 static int cpupool_moving_cpu =3D -1;
 static struct cpupool *cpupool_cpu_moving =3D NULL;
-static cpumask_t cpupool_locked_cpus =3D CPU_MASK_NONE;
+static cpumask_t cpupool_locked_cpus;
=20
 static DEFINE_SPINLOCK(cpupool_lock);
=20
--- 2011-10-18.orig/xen/common/domain.c	2011-09-21 16:33:10.000000000 =
+0200
+++ 2011-10-18/xen/common/domain.c	2011-10-12 09:02:08.000000000 =
+0200
@@ -359,11 +359,12 @@ struct domain *domain_create(
=20
 void domain_update_node_affinity(struct domain *d)
 {
-    cpumask_t cpumask =3D CPU_MASK_NONE;
+    cpumask_t cpumask;
     nodemask_t nodemask =3D NODE_MASK_NONE;
     struct vcpu *v;
     unsigned int node;
=20
+    cpumask_clear(&cpumask);
     spin_lock(&d->node_affinity_lock);
=20
     for_each_vcpu ( d, v )
--- 2011-10-18.orig/xen/common/domctl.c	2011-10-20 14:46:19.000000000 =
+0200
+++ 2011-10-18/xen/common/domctl.c	2011-10-18 13:32:43.000000000 =
+0200
@@ -37,9 +37,9 @@ int cpumask_to_xenctl_cpumap(
     uint8_t bytemap[(NR_CPUS + 7) / 8];
=20
     guest_bytes =3D (xenctl_cpumap->nr_cpus + 7) / 8;
-    copy_bytes  =3D min_t(unsigned int, guest_bytes, sizeof(bytemap));
+    copy_bytes  =3D min_t(unsigned int, guest_bytes, (nr_cpu_ids + 7) / =
8);
=20
-    bitmap_long_to_byte(bytemap, cpus_addr(*cpumask), NR_CPUS);
+    bitmap_long_to_byte(bytemap, cpumask_bits(cpumask), nr_cpu_ids);
=20
     if ( copy_bytes !=3D 0 )
         if ( copy_to_guest(xenctl_cpumap->bitmap, bytemap, copy_bytes) )
@@ -59,7 +59,7 @@ int xenctl_cpumap_to_cpumask(
     uint8_t bytemap[(NR_CPUS + 7) / 8];
=20
     guest_bytes =3D (xenctl_cpumap->nr_cpus + 7) / 8;
-    copy_bytes  =3D min_t(unsigned int, guest_bytes, sizeof(bytemap));
+    copy_bytes  =3D min_t(unsigned int, guest_bytes, (nr_cpu_ids + 7) / =
8);
=20
     memset(bytemap, 0, sizeof(bytemap));
=20
@@ -71,7 +71,7 @@ int xenctl_cpumap_to_cpumask(
             bytemap[guest_bytes-1] &=3D ~(0xff << (xenctl_cpumap->nr_cpus =
& 7));
     }
=20
-    bitmap_byte_to_long(cpus_addr(*cpumask), bytemap, NR_CPUS);
+    bitmap_byte_to_long(cpumask_bits(cpumask), bytemap, nr_cpu_ids);
=20
     return 0;
 }
@@ -154,7 +154,7 @@ static unsigned int default_vcpu0_locati
     cpumask_t      cpu_exclude_map;
=20
     /* Do an initial CPU placement. Pick the least-populated CPU. */
-    nr_cpus =3D last_cpu(cpu_online_map) + 1;
+    nr_cpus =3D cpumask_last(&cpu_online_map) + 1;
     cnt =3D xzalloc_array(unsigned int, nr_cpus);
     if ( cnt )
     {
@@ -171,18 +171,19 @@ static unsigned int default_vcpu0_locati
      * If we're on a HT system, we only auto-allocate to a non-primary =
HT. We=20
      * favour high numbered CPUs in the event of a tie.
      */
-    cpu =3D first_cpu(per_cpu(cpu_sibling_map, 0));
-    if ( cpus_weight(per_cpu(cpu_sibling_map, 0)) > 1 )
-        cpu =3D next_cpu(cpu, per_cpu(cpu_sibling_map, 0));
-    cpu_exclude_map =3D per_cpu(cpu_sibling_map, 0);
+    cpumask_copy(&cpu_exclude_map, &per_cpu(cpu_sibling_map, 0));
+    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)
     {
-        if ( cpu_isset(i, cpu_exclude_map) )
+        if ( cpumask_test_cpu(i, &cpu_exclude_map) )
             continue;
-        if ( (i =3D=3D first_cpu(per_cpu(cpu_sibling_map, i))) &&
-             (cpus_weight(per_cpu(cpu_sibling_map, i)) > 1) )
+        if ( (i =3D=3D cpumask_first(&per_cpu(cpu_sibling_map, i))) &&
+             (cpumask_weight(&per_cpu(cpu_sibling_map, i)) > 1) )
             continue;
-        cpus_or(cpu_exclude_map, cpu_exclude_map, per_cpu(cpu_sibling_map,=
 i));
+        cpumask_or(&cpu_exclude_map, &cpu_exclude_map,
+                   &per_cpu(cpu_sibling_map, i));
         if ( !cnt || cnt[i] <=3D cnt[cpu] )
             cpu =3D i;
     }
--- 2011-10-18.orig/xen/common/keyhandler.c	2011-09-21 16:32:28.0000000=
00 +0200
+++ 2011-10-18/xen/common/keyhandler.c	2011-10-12 09:07:34.000000000 =
+0200
@@ -316,7 +316,7 @@ static struct keyhandler dump_domains_ke
     .desc =3D "dump domain (and guest debug) info"
 };
=20
-static cpumask_t read_clocks_cpumask =3D CPU_MASK_NONE;
+static cpumask_t read_clocks_cpumask;
 static DEFINE_PER_CPU(s_time_t, read_clocks_time);
 static DEFINE_PER_CPU(u64, read_cycles_time);
=20
--- 2011-10-18.orig/xen/common/page_alloc.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/common/page_alloc.c	2011-10-18 13:32:47.000000000 =
+0200
@@ -304,7 +304,7 @@ static struct page_info *alloc_heap_page
     unsigned int first_node, i, j, zone =3D 0, nodemask_retry =3D 0;
     unsigned int node =3D (uint8_t)((memflags >> _MEMF_node) - 1);
     unsigned long request =3D 1UL << order;
-    cpumask_t extra_cpus_mask, mask;
+    cpumask_t mask;
     struct page_info *pg;
     nodemask_t nodemask =3D (d !=3D NULL ) ? d->node_affinity : node_onlin=
e_map;
=20
@@ -418,7 +418,7 @@ static struct page_info *alloc_heap_page
     if ( d !=3D NULL )
         d->last_alloc_node =3D node;
=20
-    cpus_clear(mask);
+    cpumask_clear(&mask);
=20
     for ( i =3D 0; i < (1 << order); i++ )
     {
@@ -429,9 +429,11 @@ static struct page_info *alloc_heap_page
         if ( pg[i].u.free.need_tlbflush )
         {
             /* Add in extra CPUs that need flushing because of this page. =
*/
-            cpus_andnot(extra_cpus_mask, cpu_online_map, mask);
+            static cpumask_t extra_cpus_mask;
+
+            cpumask_andnot(&extra_cpus_mask, &cpu_online_map, &mask);
             tlbflush_filter(extra_cpus_mask, pg[i].tlbflush_timestamp);
-            cpus_or(mask, mask, extra_cpus_mask);
+            cpumask_or(&mask, &mask, &extra_cpus_mask);
         }
=20
         /* Initialise fields which have other uses for free pages. */
@@ -441,7 +443,7 @@ static struct page_info *alloc_heap_page
=20
     spin_unlock(&heap_lock);
=20
-    if ( unlikely(!cpus_empty(mask)) )
+    if ( unlikely(!cpumask_empty(&mask)) )
     {
         perfc_incr(need_flush_tlb_flush);
         flush_tlb_mask(&mask);
--- 2011-10-18.orig/xen/common/rcupdate.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/common/rcupdate.c	2011-10-14 09:47:53.000000000 =
+0200
@@ -59,7 +59,6 @@ static struct rcu_ctrlblk {
     .cur =3D -300,
     .completed =3D -300,
     .lock =3D SPIN_LOCK_UNLOCKED,
-    .cpumask =3D CPU_MASK_NONE,
 };
=20
 /*
--- 2011-10-18.orig/xen/common/sched_credit.c	2011-10-07 09:18:05.0000000=
00 +0200
+++ 2011-10-18/xen/common/sched_credit.c	2011-10-12 08:38:35.0000000=
00 +0200
@@ -260,7 +260,7 @@ __runq_tickle(unsigned int cpu, struct c
     cpumask_t mask;
=20
     ASSERT(cur);
-    cpus_clear(mask);
+    cpumask_clear(&mask);
=20
     /* If strictly higher priority than current VCPU, signal the CPU */
     if ( new->pri > cur->pri )
@@ -274,7 +274,7 @@ __runq_tickle(unsigned int cpu, struct c
         else
             CSCHED_STAT_CRANK(tickle_local_other);
=20
-        cpu_set(cpu, mask);
+        cpumask_set_cpu(cpu, &mask);
     }
=20
     /*
@@ -283,7 +283,7 @@ __runq_tickle(unsigned int cpu, struct c
      */
     if ( cur->pri > CSCHED_PRI_IDLE )
     {
-        if ( cpus_empty(prv->idlers) )
+        if ( cpumask_empty(&prv->idlers) )
         {
             CSCHED_STAT_CRANK(tickle_idlers_none);
         }
@@ -292,24 +292,24 @@ __runq_tickle(unsigned int cpu, struct c
             cpumask_t idle_mask;
=20
             cpumask_and(&idle_mask, &prv->idlers, new->vcpu->cpu_affinity)=
;
-            if ( !cpus_empty(idle_mask) )
+            if ( !cpumask_empty(&idle_mask) )
             {
                 CSCHED_STAT_CRANK(tickle_idlers_some);
                 if ( opt_tickle_one_idle )
                 {
                     this_cpu(last_tickle_cpu) =3D=20
-                        cycle_cpu(this_cpu(last_tickle_cpu), idle_mask);
-                    cpu_set(this_cpu(last_tickle_cpu), mask);
+                        cpumask_cycle(this_cpu(last_tickle_cpu), =
&idle_mask);
+                    cpumask_set_cpu(this_cpu(last_tickle_cpu), &mask);
                 }
                 else
-                    cpus_or(mask, mask, idle_mask);
+                    cpumask_or(&mask, &mask, &idle_mask);
             }
             cpumask_and(&mask, &mask, new->vcpu->cpu_affinity);
         }
     }
=20
     /* Send scheduler interrupts to designated CPUs */
-    if ( !cpus_empty(mask) )
+    if ( !cpumask_empty(&mask) )
         cpumask_raise_softirq(&mask, SCHEDULE_SOFTIRQ);
 }
=20
@@ -471,10 +471,10 @@ _csched_cpu_pick(const struct scheduler=20
      */
     online =3D CSCHED_CPUONLINE(vc->domain->cpupool);
     cpumask_and(&cpus, online, vc->cpu_affinity);
-    cpu =3D cpu_isset(vc->processor, cpus)
+    cpu =3D cpumask_test_cpu(vc->processor, &cpus)
             ? vc->processor
-            : cycle_cpu(vc->processor, cpus);
-    ASSERT( !cpus_empty(cpus) && cpu_isset(cpu, cpus) );
+            : cpumask_cycle(vc->processor, &cpus);
+    ASSERT( !cpumask_empty(&cpus) && cpumask_test_cpu(cpu, &cpus) );
=20
     /*
      * Try to find an idle processor within the above constraints.
@@ -488,54 +488,54 @@ _csched_cpu_pick(const struct scheduler=20
      * like run two VCPUs on co-hyperthreads while there are idle cores
      * or sockets.
      */
-    cpus_and(idlers, cpu_online_map, CSCHED_PRIV(ops)->idlers);
-    cpu_set(cpu, idlers);
-    cpus_and(cpus, cpus, idlers);
-    cpu_clear(cpu, cpus);
+    cpumask_and(&idlers, &cpu_online_map, &CSCHED_PRIV(ops)->idlers);
+    cpumask_set_cpu(cpu, &idlers);
+    cpumask_and(&cpus, &cpus, &idlers);
+    cpumask_clear_cpu(cpu, &cpus);
=20
-    while ( !cpus_empty(cpus) )
+    while ( !cpumask_empty(&cpus) )
     {
         cpumask_t cpu_idlers;
         cpumask_t nxt_idlers;
         int nxt, weight_cpu, weight_nxt;
         int migrate_factor;
=20
-        nxt =3D cycle_cpu(cpu, cpus);
+        nxt =3D cpumask_cycle(cpu, &cpus);
=20
-        if ( cpu_isset(cpu, per_cpu(cpu_core_map, nxt)) )
+        if ( cpumask_test_cpu(cpu, &per_cpu(cpu_core_map, nxt)) )
         {
             /* We're on the same socket, so check the busy-ness of =
threads.
              * Migrate if # of idlers is less at all */
-            ASSERT( cpu_isset(nxt, per_cpu(cpu_core_map, cpu)) );
+            ASSERT( cpumask_test_cpu(nxt, &per_cpu(cpu_core_map, cpu)) );
             migrate_factor =3D 1;
-            cpus_and(cpu_idlers, idlers, per_cpu(cpu_sibling_map, cpu));
-            cpus_and(nxt_idlers, idlers, per_cpu(cpu_sibling_map, nxt));
+            cpumask_and(&cpu_idlers, &idlers, &per_cpu(cpu_sibling_map, =
cpu));
+            cpumask_and(&nxt_idlers, &idlers, &per_cpu(cpu_sibling_map, =
nxt));
         }
         else
         {
             /* We're on different sockets, so check the busy-ness of =
cores.
              * Migrate only if the other core is twice as idle */
-            ASSERT( !cpu_isset(nxt, per_cpu(cpu_core_map, cpu)) );
+            ASSERT( !cpumask_test_cpu(nxt, &per_cpu(cpu_core_map, cpu)) =
);
             migrate_factor =3D 2;
-            cpus_and(cpu_idlers, idlers, per_cpu(cpu_core_map, cpu));
-            cpus_and(nxt_idlers, idlers, per_cpu(cpu_core_map, nxt));
+            cpumask_and(&cpu_idlers, &idlers, &per_cpu(cpu_core_map, =
cpu));
+            cpumask_and(&nxt_idlers, &idlers, &per_cpu(cpu_core_map, =
nxt));
         }
=20
-        weight_cpu =3D cpus_weight(cpu_idlers);
-        weight_nxt =3D cpus_weight(nxt_idlers);
+        weight_cpu =3D cpumask_weight(&cpu_idlers);
+        weight_nxt =3D cpumask_weight(&nxt_idlers);
         /* smt_power_savings: consolidate work rather than spreading it =
*/
         if ( sched_smt_power_savings ?
              weight_cpu > weight_nxt :
              weight_cpu * migrate_factor < weight_nxt )
         {
-            cpus_and(nxt_idlers, cpus, nxt_idlers);
+            cpumask_and(&nxt_idlers, &cpus, &nxt_idlers);
             spc =3D CSCHED_PCPU(nxt);
-            cpu =3D cycle_cpu(spc->idle_bias, nxt_idlers);
-            cpus_andnot(cpus, cpus, per_cpu(cpu_sibling_map, cpu));
+            cpu =3D cpumask_cycle(spc->idle_bias, &nxt_idlers);
+            cpumask_andnot(&cpus, &cpus, &per_cpu(cpu_sibling_map, cpu));
         }
         else
         {
-            cpus_andnot(cpus, cpus, nxt_idlers);
+            cpumask_andnot(&cpus, &cpus, &nxt_idlers);
         }
     }
=20
@@ -1228,7 +1228,7 @@ csched_load_balance(struct csched_privat
     online =3D CSCHED_CPUONLINE(per_cpu(cpupool, cpu));
=20
     /* If this CPU is going offline we shouldn't steal work. */
-    if ( unlikely(!cpu_isset(cpu, *online)) )
+    if ( unlikely(!cpumask_test_cpu(cpu, online)) )
         goto out;
=20
     if ( snext->pri =3D=3D CSCHED_PRI_IDLE )
@@ -1242,14 +1242,14 @@ csched_load_balance(struct csched_privat
      * Peek at non-idling CPUs in the system, starting with our
      * immediate neighbour.
      */
-    cpus_andnot(workers, *online, prv->idlers);
-    cpu_clear(cpu, workers);
+    cpumask_andnot(&workers, online, &prv->idlers);
+    cpumask_clear_cpu(cpu, &workers);
     peer_cpu =3D cpu;
=20
     while ( !cpus_empty(workers) )
     {
-        peer_cpu =3D cycle_cpu(peer_cpu, workers);
-        cpu_clear(peer_cpu, workers);
+        peer_cpu =3D cpumask_cycle(peer_cpu, &workers);
+        cpumask_clear_cpu(peer_cpu, &workers);
=20
         /*
          * Get ahold of the scheduler lock for this peer CPU.
@@ -1267,7 +1267,7 @@ csched_load_balance(struct csched_privat
         /*
          * Any work over there to steal?
          */
-        speer =3D cpu_isset(peer_cpu, *online) ?
+        speer =3D cpumask_test_cpu(peer_cpu, online) ?
             csched_runq_steal(peer_cpu, cpu, snext->pri) : NULL;
         pcpu_schedule_unlock(peer_cpu);
         if ( speer !=3D NULL )
--- 2011-10-18.orig/xen/common/sched_credit2.c	2011-10-07 09:18:09.0000000=
00 +0200
+++ 2011-10-18/xen/common/sched_credit2.c	2011-10-11 18:03:39.0000000=
00 +0200
@@ -507,19 +507,19 @@ runq_tickle(const struct scheduler *ops,
     }
    =20
     /* Get a mask of idle, but not tickled */
-    cpus_andnot(mask, rqd->idle, rqd->tickled);
+    cpumask_andnot(&mask, &rqd->idle, &rqd->tickled);
    =20
     /* If it's not empty, choose one */
-    if ( !cpus_empty(mask) )
+    if ( !cpumask_empty(&mask) )
     {
-        ipid=3Dfirst_cpu(mask);
+        ipid =3D cpumask_first(&mask);
         goto tickle;
     }
=20
     /* Otherwise, look for the non-idle cpu with the lowest credit,
      * skipping cpus which have been tickled but not scheduled yet */
-    cpus_andnot(mask, rqd->active, rqd->idle);
-    cpus_andnot(mask, mask, rqd->tickled);
+    cpumask_andnot(&mask, &rqd->active, &rqd->idle);
+    cpumask_andnot(&mask, &mask, &rqd->tickled);
=20
     for_each_cpu_mask(i, mask)
     {
@@ -573,7 +573,7 @@ tickle:
                   sizeof(d),
                   (unsigned char *)&d);
     }
-    cpu_set(ipid, rqd->tickled);
+    cpumask_set_cpu(ipid, &rqd->tickled);
     cpu_raise_softirq(ipid, SCHEDULE_SOFTIRQ);
=20
 no_tickle:
--- 2011-10-18.orig/xen/common/schedule.c	2011-10-12 13:59:19.0000000=
00 +0200
+++ 2011-10-18/xen/common/schedule.c	2011-10-11 17:56:50.000000000 =
+0200
@@ -595,8 +595,8 @@ int vcpu_set_affinity(struct vcpu *v, co
     if ( v->domain->is_pinned )
         return -EINVAL;
     online =3D VCPU2ONLINE(v);
-    cpus_and(online_affinity, *affinity, *online);
-    if ( cpus_empty(online_affinity) )
+    cpumask_and(&online_affinity, affinity, online);
+    if ( cpumask_empty(&online_affinity) )
         return -EINVAL;
=20
     vcpu_schedule_lock_irq(v);
--- 2011-10-18.orig/xen/common/softirq.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/common/softirq.c	2011-10-12 09:04:04.000000000 =
+0200
@@ -71,11 +71,12 @@ void open_softirq(int nr, softirq_handle
 void cpumask_raise_softirq(const cpumask_t *mask, unsigned int nr)
 {
     int cpu;
-    cpumask_t send_mask =3D CPU_MASK_NONE;
+    cpumask_t send_mask;
=20
+    cpumask_clear(&send_mask);
     for_each_cpu_mask(cpu, *mask)
         if ( !test_and_set_bit(nr, &softirq_pending(cpu)) )
-            cpu_set(cpu, send_mask);
+            cpumask_set_cpu(cpu, &send_mask);
=20
     smp_send_event_check_mask(&send_mask);
 }
--- 2011-10-18.orig/xen/common/trace.c	2011-10-20 14:46:19.000000000 =
+0200
+++ 2011-10-18/xen/common/trace.c	2011-10-12 09:06:27.000000000 =
+0200
@@ -70,7 +70,7 @@ static DEFINE_PER_CPU(unsigned long, los
 int tb_init_done __read_mostly;
=20
 /* which CPUs tracing is enabled on */
-static cpumask_t tb_cpu_mask =3D CPU_MASK_ALL;
+static cpumask_t tb_cpu_mask;
=20
 /* which tracing events are enabled */
 static u32 tb_event_mask =3D TRC_ALL;
@@ -338,6 +338,7 @@ int trace_will_trace_event(u32 event)
  */
 void __init init_trace_bufs(void)
 {
+    cpumask_setall(&tb_cpu_mask);
     register_cpu_notifier(&cpu_nfb);
=20
     if ( opt_tbuf_size )
--- 2011-10-18.orig/xen/include/xen/cpumask.h	2011-10-17 08:43:34.0000000=
00 +0200
+++ 2011-10-18/xen/include/xen/cpumask.h	2011-10-19 17:29:46.0000000=
00 +0200
@@ -13,18 +13,18 @@
  *
  * The available cpumask operations are:
  *
- * void cpu_set(cpu, mask)		turn on bit 'cpu' in mask
- * void cpu_clear(cpu, mask)		turn off bit 'cpu' in mask
- * void cpus_setall(mask)		set all bits
- * void cpus_clear(mask)		clear all bits
- * int cpu_isset(cpu, mask)		true iff bit 'cpu' set in mask
- * int cpu_test_and_set(cpu, mask)	test and set bit 'cpu' in mask
- *
- * void cpus_and(dst, src1, src2)	dst =3D src1 & src2  [intersection]=

- * void cpus_or(dst, src1, src2)	dst =3D src1 | src2  [union]
- * void cpus_xor(dst, src1, src2)	dst =3D src1 ^ src2
- * void cpus_andnot(dst, src1, src2)	dst =3D src1 & ~src2
- * void cpus_complement(dst, src)	dst =3D ~src
+ * void cpumask_set_cpu(cpu, mask)	turn on bit 'cpu' in mask
+ * void cpumask_clear_cpu(cpu, mask)	turn off bit 'cpu' in mask
+ * void cpumask_setall(mask)		set all bits
+ * 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
+ *
+ * void cpumask_and(dst, src1, src2)	dst =3D src1 & src2  [intersection]=

+ * void cpumask_or(dst, src1, src2)	dst =3D src1 | src2  [union]
+ * void cpumask_xor(dst, src1, src2)	dst =3D src1 ^ src2
+ * 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?
@@ -33,8 +33,8 @@
  * int cpus_full(mask)			Is mask full (all bits sets)?
  * int cpus_weight(mask)		Hamming weigh - number of set bits
  *
- * void cpus_shift_right(dst, src, n)	Shift right
- * void cpus_shift_left(dst, src, n)	Shift left
+ * 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
@@ -110,18 +110,14 @@ static inline void cpumask_clear_cpu(int
 	clear_bit(cpumask_check(cpu), dstp->bits);
 }
=20
-#define cpumask_setall(dst) __cpus_setall(dst, nr_cpumask_bits)
-#define cpus_setall(dst) __cpus_setall(&(dst), NR_CPUS)
-static inline void __cpus_setall(cpumask_t *dstp, int nbits)
+static inline void cpumask_setall(cpumask_t *dstp)
 {
-	bitmap_fill(dstp->bits, nbits);
+	bitmap_fill(dstp->bits, nr_cpumask_bits);
 }
=20
-#define cpumask_clear(dst) __cpus_clear(dst, nr_cpumask_bits)
-#define cpus_clear(dst) __cpus_clear(&(dst), NR_CPUS)
-static inline void __cpus_clear(cpumask_t *dstp, int nbits)
+static inline void cpumask_clear(cpumask_t *dstp)
 {
-	bitmap_zero(dstp->bits, nbits);
+	bitmap_zero(dstp->bits, nr_cpumask_bits);
 }
=20
 /* No static inline type checking - see Subtlety (1) above. */
@@ -143,50 +139,33 @@ static inline int cpumask_test_and_clear
 	return test_and_clear_bit(cpumask_check(cpu), addr->bits);
 }
=20
-#define cpumask_and(dst, src1, src2) \
-	__cpus_and(dst, src1, src2, nr_cpumask_bits)
-#define cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), =
NR_CPUS)
-static inline void __cpus_and(cpumask_t *dstp, const cpumask_t *src1p,
-					const cpumask_t *src2p, int nbits)
+static inline void cpumask_and(cpumask_t *dstp, const cpumask_t *src1p,
+			       const cpumask_t *src2p)
 {
-	bitmap_and(dstp->bits, src1p->bits, src2p->bits, nbits);
+	bitmap_and(dstp->bits, src1p->bits, src2p->bits, nr_cpumask_bits);
 }
=20
-#define cpumask_or(dst, src1, src2) \
-	__cpus_or(dst, src1, src2, nr_cpumask_bits)
-#define cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), =
NR_CPUS)
-static inline void __cpus_or(cpumask_t *dstp, const cpumask_t *src1p,
-					const cpumask_t *src2p, int nbits)
+static inline void cpumask_or(cpumask_t *dstp, const cpumask_t *src1p,
+			      const cpumask_t *src2p)
 {
-	bitmap_or(dstp->bits, src1p->bits, src2p->bits, nbits);
+	bitmap_or(dstp->bits, src1p->bits, src2p->bits, nr_cpumask_bits);
 }
=20
-#define cpumask_xor(dst, src1, src2) \
-	__cpus_xor(dst, src1, src2, nr_cpumask_bits)
-#define cpus_xor(dst, src1, src2) __cpus_xor(&(dst), &(src1), &(src2), =
NR_CPUS)
-static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p,
-					const cpumask_t *src2p, int nbits)
+static inline void cpumask_xor(cpumask_t *dstp, const cpumask_t *src1p,
+			       const cpumask_t *src2p)
 {
-	bitmap_xor(dstp->bits, src1p->bits, src2p->bits, nbits);
+	bitmap_xor(dstp->bits, src1p->bits, src2p->bits, nr_cpumask_bits);
 }
=20
-#define cpumask_andnot(dst, src1, src2) \
-	__cpus_andnot(dst, src1, src2, nr_cpumask_bits)
-#define cpus_andnot(dst, src1, src2) \
-				__cpus_andnot(&(dst), &(src1), &(src2), =
NR_CPUS)
-static inline void __cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p,
-					const cpumask_t *src2p, int nbits)
+static inline void cpumask_andnot(cpumask_t *dstp, const cpumask_t =
*src1p,
+				  const cpumask_t *src2p)
 {
-	bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nbits);
+	bitmap_andnot(dstp->bits, src1p->bits, src2p->bits, nr_cpumask_bits=
);
 }
=20
-#define cpumask_complement(dst, src) \
-	__cpus_complement(dst, src, nr_cpumask_bits)
-#define cpus_complement(dst, src) __cpus_complement(&(dst), &(src), =
NR_CPUS)
-static inline void __cpus_complement(cpumask_t *dstp,
-					const cpumask_t *srcp, int nbits)
+static inline void cpumask_complement(cpumask_t *dstp, const cpumask_t =
*srcp)
 {
-	bitmap_complement(dstp->bits, srcp->bits, nbits);
+	bitmap_complement(dstp->bits, srcp->bits, nr_cpumask_bits);
 }
=20
 #define cpumask_equal(src1, src2) __cpus_equal(src1, src2, nr_cpu_ids)
@@ -236,31 +215,21 @@ static inline int __cpus_weight(const cp
 	return bitmap_weight(srcp->bits, nbits);
 }
=20
-#define cpumask_copy(dest, src) __cpus_copy(dest, src, nr_cpumask_bits)
-#define cpus_copy(dest, src) __cpus_copy(&(dest), &(src), NR_CPUS)
-static inline void __cpus_copy(cpumask_t *dstp, const cpumask_t *srcp, =
int nbits)
+static inline void cpumask_copy(cpumask_t *dstp, const cpumask_t *srcp)
 {
-	bitmap_copy(dstp->bits, srcp->bits, nbits);
+	bitmap_copy(dstp->bits, srcp->bits, nr_cpumask_bits);
 }
=20
-#define cpumask_shift_right(dst, src, n) \
-	__cpus_shift_right(dst, src, n, nr_cpumask_bits)
-#define cpus_shift_right(dst, src, n) \
-			__cpus_shift_right(&(dst), &(src), (n), NR_CPUS)
-static inline void __cpus_shift_right(cpumask_t *dstp,
-					const cpumask_t *srcp, int n, int =
nbits)
+static inline void cpumask_shift_right(cpumask_t *dstp,
+				       const cpumask_t *srcp, int n)
 {
-	bitmap_shift_right(dstp->bits, srcp->bits, n, nbits);
+	bitmap_shift_right(dstp->bits, srcp->bits, n, nr_cpumask_bits);
 }
=20
-#define cpumask_shift_left(dst, src, n) \
-	__cpus_shift_left(dst, src, n, nr_cpumask_bits)
-#define cpus_shift_left(dst, src, n) \
-			__cpus_shift_left(&(dst), &(src), (n), NR_CPUS)
-static inline void __cpus_shift_left(cpumask_t *dstp,
-					const cpumask_t *srcp, int n, int =
nbits)
+static inline void cpumask_shift_left(cpumask_t *dstp,
+				      const cpumask_t *srcp, int n)
 {
-	bitmap_shift_left(dstp->bits, srcp->bits, n, nbits);
+	bitmap_shift_left(dstp->bits, srcp->bits, n, nr_cpumask_bits);
 }
=20
 #define cpumask_first(src) __first_cpu(src, nr_cpu_ids)
@@ -317,6 +286,7 @@ static inline const cpumask_t *cpumask_o
=20
 #define cpumask_of_cpu(cpu) (*cpumask_of(cpu))
=20
+#if defined(__ia64__) /* XXX needs cleanup */
 #define CPU_MASK_LAST_WORD BITMAP_LAST_WORD_MASK(NR_CPUS)
=20
 #if NR_CPUS <=3D BITS_PER_LONG
@@ -345,8 +315,10 @@ static inline const cpumask_t *cpumask_o
 /*(cpumask_t)*/ { {							\
 	[0] =3D  1UL							\
 } }
+#endif /* __ia64__ */
=20
 #define cpus_addr(src) ((src).bits)
+#define cpumask_bits(maskp) ((maskp)->bits)
=20
 #define cpumask_scnprintf(buf, len, src) \
 	__cpumask_scnprintf((buf), (len), &(src), nr_cpu_ids)
@@ -388,9 +360,8 @@ typedef cpumask_t *cpumask_var_t;
 static inline bool_t alloc_cpumask_var(cpumask_var_t *mask)
 {
 	/*
-	 * Once all direct cpumask assignments and all cpus_*() accessors
-	 * still referencing NR_CPUS are gone, we could use nr_cpumask_bits=

-	 * to determine the allocation size here.
+	 * Once all direct cpumask assignments are gone, we could use
+	 * nr_cpumask_bits to determine the allocation size here.
 	 */
 	return (*mask =3D xmalloc(cpumask_t)) !=3D NULL;
 }



--=__Part9BB47839.0__=
Content-Type: text/plain; name="cpumask-NR_CPUS-accessors.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="cpumask-NR_CPUS-accessors.patch"

eliminate cpumask accessors referencing NR_CPUS=0A=0A... in favor of using =
the new, nr_cpumask_bits-based ones.=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- 2011-10-18.orig/xen/arch/ia64/linux-xen/acpi.c=
	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/arch/ia64/=
linux-xen/acpi.c	2011-10-11 17:51:40.000000000 +0200=0A@@ -957,14 =
+957,14 @@ int acpi_map_lsapic(acpi_handle handle, =0A 	buffer.length =3D =
ACPI_ALLOCATE_BUFFER;=0A 	buffer.pointer =3D NULL;=0A =0A-	=
cpus_complement(tmp_map, cpu_present_map);=0A-	cpu =3D first_cpu(tmp_map);=
=0A-	if (cpu >=3D NR_CPUS)=0A+	cpumask_complement(&tmp_map, =
&cpu_present_map);=0A+	cpu =3D cpumask_first(&tmp_map);=0A+	if (cpu =
>=3D nr_cpu_ids)=0A 		return -EINVAL;=0A =0A 	acpi_map_cpu2node(h=
andle, cpu, physid);=0A =0A-	cpu_set(cpu, cpu_present_map);=0A+	=
cpumask_set_cpu(cpu, &cpu_present_map);=0A 	ia64_cpu_to_sapicid[cpu] =
=3D physid;=0A =0A 	*pcpu =3D cpu;=0A--- 2011-10-18.orig/xen/arch/ia64/=
linux-xen/numa.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/ia64/linux-xen/numa.c	2011-10-11 17:02:13.0000000=
00 +0200=0A@@ -51,7 +51,7 @@ void __init build_cpu_to_node_map(void)=0A 	=
int cpu, i, node;=0A =0A 	for(node=3D0; node < MAX_NUMNODES; =
node++)=0A-		cpus_clear(node_to_cpu_mask[node]);=0A+		=
cpumask_clear(&node_to_cpu_mask[node]);=0A =0A 	for(cpu =3D 0; cpu < =
NR_CPUS; ++cpu) {=0A 		node =3D -1;=0A@@ -62,6 +62,6 @@ void =
__init build_cpu_to_node_map(void)=0A 			}=0A 		=
cpu_to_node_map[cpu] =3D (node >=3D 0) ? node : 0;=0A 		if (node =
>=3D 0)=0A-			cpu_set(cpu, node_to_cpu_mask[node]);=0A+	=
		cpumask_set_cpu(cpu, &node_to_cpu_mask[node]);=0A 	=
}=0A }=0A--- 2011-10-18.orig/xen/arch/ia64/linux-xen/smpboot.c	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/arch/ia64/linux-xen/smpboot.c=
	2011-10-11 17:00:51.000000000 +0200=0A@@ -594,15 +594,15 @@ =
smp_build_cpu_map (void)=0A 	}=0A =0A 	ia64_cpu_to_sapicid[0] =3D =
boot_cpu_id;=0A-	cpus_clear(cpu_present_map);=0A-	cpu_set(0, =
cpu_present_map);=0A-	cpu_set(0, cpu_possible_map);=0A+	cpumask_cle=
ar(&cpu_present_map);=0A+	cpumask_set_cpu(0, &cpu_present_map);=0A+	=
cpumask_set_cpu(0, &cpu_possible_map);=0A 	for (cpu =3D 1, i =3D 0; i =
< smp_boot_data.cpu_count; i++) {=0A 		sapicid =3D smp_boot_data.c=
pu_phys_id[i];=0A 		if (sapicid =3D=3D boot_cpu_id)=0A 		=
	continue;=0A-		cpu_set(cpu, cpu_present_map);=0A-		=
cpu_set(cpu, cpu_possible_map);=0A+		cpumask_set_cpu(cpu, =
&cpu_present_map);=0A+		cpumask_set_cpu(cpu, &cpu_possible_map);=0A=
 		ia64_cpu_to_sapicid[cpu] =3D sapicid;=0A 		=
cpu++;=0A 	}=0A@@ -640,12 +640,12 @@ smp_prepare_cpus (unsigned int =
max_cpus)=0A 	 */=0A 	if (!max_cpus) {=0A 		printk(KERN_INFO =
"SMP mode deactivated.\n");=0A-		cpus_clear(cpu_online_map);=0A-		=
cpus_clear(cpu_present_map);=0A-		cpus_clear(cpu_possible_map=
);=0A-		cpu_set(0, cpu_online_map);=0A-		cpu_set(0, =
cpu_present_map);=0A-		cpu_set(0, cpu_possible_map);=0A+		=
cpumask_clear(&cpu_online_map);=0A+		cpumask_clear(&cpu_present_=
map);=0A+		cpumask_clear(&cpu_possible_map);=0A+		=
cpumask_set_cpu(0, &cpu_online_map);=0A+		cpumask_set_cpu(0, =
&cpu_present_map);=0A+		cpumask_set_cpu(0, &cpu_possible_map);=0A 	=
	return;=0A 	}=0A }=0A@@ -688,12 +688,12 @@ clear_cpu_sibling_ma=
p(int cpu)=0A 	int i;=0A =0A 	for_each_cpu_mask(i, per_cpu(cpu_sibling_ma=
p, cpu))=0A-		cpu_clear(cpu, per_cpu(cpu_sibling_map, i));=0A+	=
	cpumask_clear_cpu(cpu, &per_cpu(cpu_sibling_map, i));=0A 	=
for_each_cpu_mask(i, per_cpu(cpu_core_map, cpu))=0A-		cpu_clear(c=
pu, per_cpu(cpu_core_map, i));=0A+		cpumask_clear_cpu(cpu, =
&per_cpu(cpu_core_map, i));=0A =0A-	cpus_clear(per_cpu(cpu_sibling_map,=
 cpu));=0A-	cpus_clear(per_cpu(cpu_core_map, cpu));=0A+	cpumask_cle=
ar(&per_cpu(cpu_sibling_map, cpu));=0A+	cpumask_clear(&per_cpu(cpu_core_map=
, cpu));=0A }=0A =0A static void=0A--- 2011-10-18.orig/xen/arch/ia64/linux-=
xen/sn/kernel/sn2_smp.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/ia64/linux-xen/sn/kernel/sn2_smp.c	2011-10-11 =
16:58:35.000000000 +0200=0A@@ -206,7 +206,7 @@ sn2_global_tlb_purge(unsigne=
d long start=0A 	static DEFINE_SPINLOCK(sn2_ptcg_lock2);=0A =0A 	=
nodes_clear(nodes_flushed);=0A-	cpus_clear(selected_cpus);=0A+	cpumask_cle=
ar(&selected_cpus);=0A =0A 	spin_lock(&sn2_ptcg_lock2);=0A 	node_set(cp=
u_to_node(smp_processor_id()), nodes_flushed);=0A--- 2011-10-18.orig/xen/ar=
ch/ia64/xen/fw_emul.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/ia64/xen/fw_emul.c	2011-10-11 16:43:45.000000000 =
+0200=0A@@ -866,10 +866,10 @@ xen_pal_emulator(unsigned long index, u6=0A 	=
		             "status %lx", status);=0A =0A 		if =
(in1 =3D=3D PAL_CACHE_TYPE_COHERENT) {=0A-			cpus_setall=
(current->arch.cache_coherent_map);=0A-			cpu_clear(processor=
, current->arch.cache_coherent_map);=0A-			cpus_setall=
(cpu_cache_coherent_map);=0A-			cpu_clear(processor, =
cpu_cache_coherent_map);=0A+			cpumask_complement(&current=
->arch.cache_coherent_map,=0A+					   =
cpumask_of(processor));=0A+			cpumask_complement(&cpu_cac=
he_coherent_map,=0A+					   cpumask_of(proce=
ssor));=0A 		}=0A 		break;=0A 	    case PAL_PERF_M=
ON_INFO:=0A--- 2011-10-18.orig/xen/arch/ia64/xen/tlb_track.c	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/arch/ia64/xen/tlb_track.c	=
2011-10-11 16:58:01.000000000 +0200=0A@@ -374,7 +374,7 @@ tlb_track_insert_=
or_dirty(struct tlb_tra=0A         entry->pte_val =3D old_pte;=0A         =
entry->vaddr =3D vaddr;=0A         entry->rid =3D rid;=0A-        =
cpus_clear(entry->pcpu_dirty_mask);=0A+        cpumask_clear(&entry->pcpu_d=
irty_mask);=0A         vcpus_clear(entry->vcpu_dirty_mask);=0A         =
list_add(&entry->list, head);=0A =0A--- 2011-10-18.orig/xen/arch/ia64/xen/x=
ensetup.c	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/ar=
ch/ia64/xen/xensetup.c	2011-10-12 08:44:31.000000000 +0200=0A@@ -592,7 =
+592,7 @@ skip_move:=0A     smp_prepare_cpus(max_cpus);=0A =0A     /* We =
aren't hotplug-capable yet. */=0A-    cpus_or(cpu_present_map, cpu_present_=
map, cpu_possible_map);=0A+    cpumask_or(&cpu_present_map, &cpu_present_ma=
p, &cpu_possible_map);=0A =0A     /*  Enable IRQ to receive IPI (needed =
for ITC sync).  */=0A     local_irq_enable();=0A--- 2011-10-18.orig/xen/arc=
h/x86/acpi/cpu_idle.c	2011-10-07 09:18:28.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/acpi/cpu_idle.c	2011-10-12 08:34:33.000000000 =
+0200=0A@@ -233,13 +233,13 @@ void cpuidle_wakeup_mwait(cpumask_t *mas=0A  =
   cpumask_t target;=0A     unsigned int cpu;=0A =0A-    cpus_and(target, =
*mask, cpuidle_mwait_flags);=0A+    cpumask_and(&target, mask, &cpuidle_mwa=
it_flags);=0A =0A     /* CPU is MWAITing on the cpuidle_mwait_wakeup flag. =
*/=0A     for_each_cpu_mask(cpu, target)=0A         mwait_wakeup(cpu) =3D =
0;=0A =0A-    cpus_andnot(*mask, *mask, target);=0A+    cpumask_andnot(mask=
, mask, &target);=0A }=0A =0A static void mwait_idle_with_hints(unsigned =
long eax, unsigned long ecx)=0A--- 2011-10-18.orig/xen/arch/x86/acpi/cpufre=
q/cpufreq.c	2011-09-21 16:40:02.000000000 +0200=0A+++ 2011-10-18/xen/ar=
ch/x86/acpi/cpufreq/cpufreq.c	2011-10-12 08:35:12.000000000 +0200=0A@@ =
-446,7 +446,7 @@ static int acpi_cpufreq_target(struct cp=0A     if =
(unlikely(result))=0A         return -ENODEV;=0A =0A-    cpus_and(online_po=
licy_cpus, cpu_online_map, policy->cpus);=0A+    cpumask_and(&online_policy=
_cpus, &cpu_online_map, &policy->cpus);=0A =0A     next_perf_state =3D =
data->freq_table[next_state].index;=0A     if (perf->state =3D=3D =
next_perf_state) {=0A--- 2011-10-18.orig/xen/arch/x86/cpu/mcheck/mce.c	=
2011-10-07 09:18:39.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/cpu/mchec=
k/mce.c	2011-10-11 17:22:32.000000000 +0200=0A@@ -1537,20 +1537,19 @@ long =
do_mca(XEN_GUEST_HANDLE(xen_mc_t) u=0A             return x86_mcerr("do_mca=
 #MC", -ENODEV);=0A =0A         if ( op->u.mc_inject_v2.flags & XEN_MC_INJE=
CT_CPU_BROADCAST )=0A-            cpus_copy(cpumap, cpu_online_map);=0A+   =
         cpumask_copy(&cpumap, &cpu_online_map);=0A         else=0A        =
 {=0A             int gcw;=0A =0A-            cpus_clear(cpumap);=0A       =
      xenctl_cpumap_to_cpumask(&cpumap,=0A                                 =
     &op->u.mc_inject_v2.cpumap);=0A-            gcw =3D cpus_weight(cpumap=
);=0A-            cpus_and(cpumap, cpu_online_map, cpumap);=0A+            =
gcw =3D cpumask_weight(&cpumap);=0A+            cpumask_and(&cpumap, =
&cpu_online_map, &cpumap);=0A =0A-            if ( cpus_empty(cpumap) =
)=0A+            if ( cpumask_empty(&cpumap) )=0A                 return =
x86_mcerr("No online CPU passed\n", -EINVAL);=0A-            else if ( gcw =
!=3D cpus_weight(cpumap) )=0A+            else if ( gcw !=3D cpumask_weight=
(&cpumap) )=0A                 dprintk(XENLOG_INFO,=0A                     =
    "Not all required CPUs are online\n");=0A         }=0A@@ -1559,7 =
+1558,7 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u=0A         {=0A        =
 case XEN_MC_INJECT_TYPE_MCE:=0A             if ( mce_broadcast &&=0A-     =
            !cpus_equal(cpumap, cpu_online_map) )=0A+                 =
!cpumask_equal(&cpumap, &cpu_online_map) )=0A                 printk("Not =
trigger MCE on all CPUs, may HANG!\n");=0A             on_selected_cpus(&cp=
umap, x86_mc_mceinject, NULL, 1);=0A             break;=0A--- 2011-10-18.or=
ig/xen/arch/x86/hpet.c	2011-10-18 11:14:42.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/hpet.c	2011-10-12 09:00:51.000000000 +0200=0A@@ =
-178,7 +178,7 @@ again:=0A     spin_unlock_irq(&ch->lock);=0A =0A     =
next_event =3D STIME_MAX;=0A-    mask =3D (cpumask_t)CPU_MASK_NONE;=0A+    =
cpumask_clear(&mask);=0A     now =3D NOW();=0A =0A     /* find all expired =
events */=0A@@ -189,11 +189,11 @@ again:=0A         rmb();=0A         =
deadline =3D per_cpu(timer_deadline, cpu);=0A         rmb();=0A-        if =
( !cpu_isset(cpu, ch->cpumask) )=0A+        if ( !cpumask_test_cpu(cpu, =
&ch->cpumask) )=0A             continue;=0A =0A         if ( deadline <=3D =
now )=0A-            cpu_set(cpu, mask);=0A+            cpumask_set_cpu(cpu=
, &mask);=0A         else if ( deadline < next_event )=0A             =
next_event =3D deadline;=0A     }=0A--- 2011-10-18.orig/xen/arch/x86/hvm/ne=
stedhvm.c	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/ar=
ch/x86/hvm/nestedhvm.c	2011-10-11 17:24:46.000000000 +0200=0A@@ -116,7 =
+116,7 @@ nestedhvm_vmcx_flushtlb(struct p2m_domai=0A {=0A     on_selected_=
cpus(&p2m->p2m_dirty_cpumask, nestedhvm_flushtlb_ipi,=0A         p2m->domai=
n, 1);=0A-    cpus_clear(p2m->p2m_dirty_cpumask);=0A+    cpumask_clear(&p2m=
->p2m_dirty_cpumask);=0A }=0A =0A bool_t=0A--- 2011-10-18.orig/xen/arch/x86=
/io_apic.c	2011-10-18 12:27:30.000000000 +0200=0A+++ 2011-10-18/xen/ar=
ch/x86/io_apic.c	2011-10-18 13:32:32.000000000 +0200=0A@@ -1850,7 =
+1850,7 @@ static void __init check_timer(void)=0A     int apic1, pin1, =
apic2, pin2;=0A     int vector, ret;=0A     unsigned long flags;=0A-    =
cpumask_t mask_all =3D CPU_MASK_ALL;=0A+    cpumask_t mask_all;=0A =0A     =
local_irq_save(flags);=0A =0A@@ -1861,6 +1861,7 @@ static void __init =
check_timer(void)=0A     vector =3D FIRST_HIPRIORITY_VECTOR;=0A     =
clear_irq_vector(0);=0A =0A+    cpumask_setall(&mask_all);=0A     if ((ret =
=3D bind_irq_vector(0, vector, &mask_all)))=0A         printk(KERN_ERR"..IR=
Q0 is not set correctly with ioapic!!!, err:%d\n", ret);=0A     =0A--- =
2011-10-18.orig/xen/arch/x86/irq.c	2011-10-18 12:37:35.000000000 =
+0200=0A+++ 2011-10-18/xen/arch/x86/irq.c	2011-10-18 13:32:30.0000000=
00 +0200=0A@@ -115,10 +115,10 @@ static int __init __bind_irq_vector(int =
=0A     BUG_ON((unsigned)irq >=3D nr_irqs);=0A     BUG_ON((unsigned)vector =
>=3D NR_VECTORS);=0A =0A-    cpus_and(online_mask, *cpu_mask, cpu_online_ma=
p);=0A-    if (cpus_empty(online_mask))=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) && cpus_equal(cf=
g->cpu_mask, online_mask))=0A+    if ((cfg->vector =3D=3D vector) && =
cpumask_equal(&cfg->cpu_mask, &online_mask))=0A         return 0;=0A     =
if (cfg->vector !=3D IRQ_VECTOR_UNASSIGNED) =0A         return -EBUSY;=0A@@=
 -126,7 +126,7 @@ static int __init __bind_irq_vector(int =0A     =
for_each_cpu_mask(cpu, online_mask)=0A         per_cpu(vector_irq, =
cpu)[vector] =3D irq;=0A     cfg->vector =3D vector;=0A-    cfg->cpu_mask =
=3D online_mask;=0A+    cpumask_copy(&cfg->cpu_mask, &online_mask);=0A     =
if ( cfg->used_vectors )=0A     {=0A         ASSERT(!test_bit(vector, =
cfg->used_vectors));=0A@@ -197,7 +197,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-    cpus_setall(d=
esc->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@@ -217,7 +217,7 @@ static void __clear_irq_=
vector(int irq)=0A =0A     /* Always clear cfg->vector */=0A     vector =
=3D cfg->vector;=0A-    cpus_and(tmp_mask, cfg->cpu_mask, cpu_online_map);=
=0A+    cpumask_and(&tmp_mask, &cfg->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@@ -225,7 +225,7 @@ static void __clear_irq_ve=
ctor(int irq)=0A     }=0A =0A     cfg->vector =3D IRQ_VECTOR_UNASSIGNED;=0A=
-    cpus_clear(cfg->cpu_mask);=0A+    cpumask_clear(&cfg->cpu_mask);=0A =
=0A     if ( cfg->used_vectors )=0A     {=0A@@ -242,7 +242,7 @@ static =
void __clear_irq_vector(int irq)=0A =0A     /* If we were in motion, also =
clear cfg->old_vector */=0A     old_vector =3D cfg->old_vector;=0A-    =
cpus_and(tmp_mask, cfg->old_cpu_mask, cpu_online_map);=0A+    cpumask_and(&=
tmp_mask, &cfg->old_cpu_mask, &cpu_online_map);=0A =0A     for_each_cpu_mas=
k(cpu, tmp_mask) {=0A         ASSERT( per_cpu(vector_irq, cpu)[old_vector] =
=3D=3D irq );=0A@@ -251,7 +251,7 @@ static void __clear_irq_vector(int =
irq)=0A      }=0A =0A     cfg->old_vector =3D IRQ_VECTOR_UNASSIGNED;=0A-   =
 cpus_clear(cfg->old_cpu_mask);=0A+    cpumask_clear(&cfg->old_cpu_mask);=
=0A =0A     if ( cfg->used_vectors )=0A     {=0A@@ -303,7 +303,7 @@ static =
void __init init_one_irq_desc(str=0A     desc->action  =3D NULL;=0A     =
desc->msi_desc =3D NULL;=0A     spin_lock_init(&desc->lock);=0A-    =
cpus_setall(desc->affinity);=0A+    cpumask_setall(&desc->affinity);=0A    =
 INIT_LIST_HEAD(&desc->rl_link);=0A }=0A =0A@@ -311,8 +311,8 @@ static =
void __init init_one_irq_cfg(stru=0A {=0A     cfg->vector =3D IRQ_VECTOR_UN=
ASSIGNED;=0A     cfg->old_vector =3D IRQ_VECTOR_UNASSIGNED;=0A-    =
cpus_clear(cfg->cpu_mask);=0A-    cpus_clear(cfg->old_cpu_mask);=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 =
}=0A@@ -425,8 +425,8 @@ int __assign_irq_vector(int irq, struct =0A =0A    =
 old_vector =3D irq_to_vector(irq);=0A     if (old_vector) {=0A-        =
cpus_and(tmp_mask, *mask, cpu_online_map);=0A-        if (cpus_intersects(t=
mp_mask, cfg->cpu_mask)) {=0A+        cpumask_and(&tmp_mask, mask, =
&cpu_online_map);=0A+        if (cpumask_intersects(&tmp_mask, &cfg->cpu_ma=
sk)) {=0A             cfg->vector =3D old_vector;=0A             return =
0;=0A         }=0A@@ -455,7 +455,8 @@ int __assign_irq_vector(int irq, =
struct =0A         if (!cpu_online(cpu))=0A             continue;=0A =0A-  =
      cpus_and(tmp_mask, *vector_allocation_cpumask(cpu), cpu_online_map);=
=0A+        cpumask_and(&tmp_mask, vector_allocation_cpumask(cpu),=0A+     =
               &cpu_online_map);=0A =0A         vector =3D current_vector;=
=0A         offset =3D current_offset;=0A@@ -485,14 +486,14 @@ next:=0A    =
     local_irq_save(flags);=0A         if (old_vector) {=0A             =
cfg->move_in_progress =3D 1;=0A-            cpus_copy(cfg->old_cpu_mask, =
cfg->cpu_mask);=0A+            cpumask_copy(&cfg->old_cpu_mask, &cfg->cpu_m=
ask);=0A             cfg->old_vector =3D cfg->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-        =
cpus_copy(cfg->cpu_mask, tmp_mask);=0A+        cpumask_copy(&cfg->cpu_mask,=
 &tmp_mask);=0A =0A         cfg->used =3D IRQ_USED;=0A         ASSERT((cfg-=
>used_vectors =3D=3D NULL)=0A@@ -529,7 +530,7 @@ int assign_irq_vector(int =
irq)=0A     ret =3D __assign_irq_vector(irq, cfg, TARGET_CPUS);=0A     if =
(!ret) {=0A         ret =3D cfg->vector;=0A-        cpus_copy(desc->affinit=
y, cfg->cpu_mask);=0A+        cpumask_copy(&desc->affinity, &cfg->cpu_mask)=
;=0A     }=0A     spin_unlock_irqrestore(&vector_lock, flags);=0A     =
return ret;=0A@@ -582,7 +583,7 @@ void move_masked_irq(struct irq_desc =
*de=0A     if (likely(cpus_intersects(desc->pending_mask, cpu_online_map)))=
=0A         desc->handler->set_affinity(desc, &desc->pending_mask);=0A =
=0A-    cpus_clear(desc->pending_mask);=0A+    cpumask_clear(&desc->pending=
_mask);=0A }=0A =0A void move_native_irq(struct irq_desc *desc)=0A@@ =
-729,7 +730,7 @@ void irq_set_affinity(struct irq_desc *d=0A     ASSERT(spi=
n_is_locked(&desc->lock));=0A     desc->status &=3D ~IRQ_MOVE_PENDING;=0A  =
   wmb();=0A-    cpus_copy(desc->pending_mask, *mask);=0A+    cpumask_copy(=
&desc->pending_mask, mask);=0A     wmb();=0A     desc->status |=3D =
IRQ_MOVE_PENDING;=0A }=0A@@ -1474,7 +1475,6 @@ int pirq_guest_bind(struct =
vcpu *v, stru=0A     struct irq_desc         *desc;=0A     irq_guest_action=
_t *action, *newaction =3D NULL;=0A     int                 rc =3D 0;=0A-  =
  cpumask_t           cpumask =3D CPU_MASK_NONE;=0A =0A     WARN_ON(!spin_i=
s_locked(&v->domain->event_lock));=0A     BUG_ON(!local_irq_is_enabled());=
=0A@@ -1521,7 +1521,7 @@ int pirq_guest_bind(struct vcpu *v, stru=0A       =
  action->in_flight   =3D 0;=0A         action->shareable   =3D will_share;=
=0A         action->ack_type    =3D pirq_acktype(v->domain, pirq->pirq);=0A=
-        cpus_clear(action->cpu_eoi_map);=0A+        cpumask_clear(&action-=
>cpu_eoi_map);=0A         init_timer(&action->eoi_timer, irq_guest_eoi_time=
r_fn, desc, 0);=0A =0A         desc->status |=3D IRQ_GUEST;=0A@@ -1529,9 =
+1529,8 @@ int pirq_guest_bind(struct vcpu *v, stru=0A         desc->handle=
r->startup(desc);=0A =0A         /* Attempt to bind the interrupt target =
to the correct CPU. */=0A-        cpu_set(v->processor, cpumask);=0A       =
  if ( !opt_noirqbalance && (desc->handler->set_affinity !=3D NULL) )=0A-  =
          desc->handler->set_affinity(desc, &cpumask);=0A+            =
desc->handler->set_affinity(desc, cpumask_of(v->processor));=0A     }=0A   =
  else if ( !will_share || !action->shareable )=0A     {=0A@@ -2070,18 =
+2069,18 @@ void fixup_irqs(void)=0A =0A         spin_lock(&desc->lock);=0A=
 =0A-        affinity =3D desc->affinity;=0A-        if ( !desc->action || =
cpus_subset(affinity, cpu_online_map) )=0A+        cpumask_copy(&affinity, =
&desc->affinity);=0A+        if ( !desc->action || cpumask_subset(&affinity=
, &cpu_online_map) )=0A         {=0A             spin_unlock(&desc->lock);=
=0A             continue;=0A         }=0A =0A-        cpus_and(affinity, =
affinity, cpu_online_map);=0A-        if ( cpus_empty(affinity) )=0A+      =
  cpumask_and(&affinity, &affinity, &cpu_online_map);=0A+        if ( =
cpumask_empty(&affinity) )=0A         {=0A             break_affinity =3D =
1;=0A-            affinity =3D cpu_online_map;=0A+            cpumask_copy(=
&affinity, &cpu_online_map);=0A         }=0A =0A         if ( desc->handler=
->disable )=0A--- 2011-10-18.orig/xen/arch/x86/mm.c	2011-10-20 =
14:46:20.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/mm.c	2011-10-20 =
14:47:26.000000000 +0200=0A@@ -1339,8 +1339,10 @@ static void pae_flush_pgd=
(=0A =0A     if ( unlikely(shadow_mode_enabled(d)) )=0A     {=0A-        =
cpumask_t m =3D CPU_MASK_NONE;=0A+        cpumask_t m;=0A+=0A         /* =
Re-shadow this l3 table on any vcpus that are using it */=0A+        =
cpumask_clear(&m);=0A         for_each_vcpu ( d, v )=0A             if ( =
pagetable_get_pfn(v->arch.guest_table) =3D=3D mfn )=0A             {=0A@@ =
-2887,7 +2889,7 @@ static inline int vcpumask_to_pcpumask(=0A     struct =
vcpu *v;=0A     bool_t is_native =3D !is_pv_32on64_domain(d);=0A =0A-    =
cpus_clear(*pmask);=0A+    cpumask_clear(pmask);=0A     for ( vmask =3D 0, =
offs =3D 0; ; ++offs)=0A     {=0A         vcpu_bias =3D offs * (is_native =
? BITS_PER_LONG : 32);=0A@@ -2899,7 +2901,7 @@ static inline int vcpumask_t=
o_pcpumask(=0A                       copy_from_guest_offset((unsigned int =
*)&vmask, bmap,=0A                                              offs, 1)) =
)=0A         {=0A-            cpus_clear(*pmask);=0A+            cpumask_cl=
ear(pmask);=0A             return -EFAULT;=0A         }=0A =0A@@ -3194,12 =
+3196,13 @@ int do_mmuext_op(=0A             else if ( likely(cache_flush_p=
ermitted(d)) )=0A             {=0A                 unsigned int cpu;=0A-   =
             cpumask_t mask =3D CPU_MASK_NONE;=0A+                =
cpumask_t mask;=0A =0A+                cpumask_clear(&mask);=0A            =
     for_each_online_cpu(cpu)=0A-                    if ( !cpus_intersects(=
mask,=0A-                                          per_cpu(cpu_sibling_map,=
 cpu)) )=0A-                        cpu_set(cpu, mask);=0A+                =
    if ( !cpumask_intersects(&mask,=0A+                                    =
         &per_cpu(cpu_sibling_map, cpu)) )=0A+                        =
cpumask_set_cpu(cpu, &mask);=0A                 flush_mask(&mask, =
FLUSH_CACHE);=0A             }=0A             else=0A--- 2011-10-18.orig/xe=
n/arch/x86/mm/p2m.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/mm/p2m.c	2011-10-14 09:47:46.000000000 =
+0200=0A@@ -81,7 +81,7 @@ static void p2m_initialise(struct domain=0A     =
p2m->default_access =3D p2m_access_rwx;=0A =0A     p2m->cr3 =3D CR3_EADDR;=
=0A-    cpus_clear(p2m->p2m_dirty_cpumask);=0A+    cpumask_clear(&p2m->p2m_=
dirty_cpumask);=0A =0A     if ( hap_enabled(d) && (boot_cpu_data.x86_vendor=
 =3D=3D X86_VENDOR_INTEL) )=0A         ept_p2m_init(p2m);=0A--- 2011-10-18.=
orig/xen/arch/x86/mm/shadow/common.c	2011-10-20 14:46:19.000000000 =
+0200=0A+++ 2011-10-18/xen/arch/x86/mm/shadow/common.c	2011-10-11 =
17:14:11.000000000 +0200=0A@@ -3459,7 +3459,7 @@ static void sh_unshadow_fo=
r_p2m_change(s=0A         p2m_type_t p2mt =3D p2m_flags_to_type(l1e_get_fla=
gs(*p));=0A         if ( p2m_is_valid(p2mt) && mfn_valid(omfn) )=0A        =
 {=0A-            cpus_clear(flushmask);=0A+            cpumask_clear(&flus=
hmask);=0A =0A             /* If we're replacing a superpage with a normal =
L1 page, map it */=0A             if ( (l1e_get_flags(new) & _PAGE_PRESENT)=
=0A--- 2011-10-18.orig/xen/arch/x86/smp.c	2011-10-20 14:46:19.0000000=
00 +0200=0A+++ 2011-10-18/xen/arch/x86/smp.c	2011-10-12 08:33:44.0000000=
00 +0200=0A@@ -240,12 +240,12 @@ void flush_area_mask(const cpumask_t =
*ma=0A     if ( !cpus_subset(*mask, *cpumask_of(smp_processor_id())) )=0A  =
   {=0A         spin_lock(&flush_lock);=0A-        cpus_and(flush_cpumask, =
*mask, cpu_online_map);=0A-        cpu_clear(smp_processor_id(), flush_cpum=
ask);=0A+        cpumask_and(&flush_cpumask, mask, &cpu_online_map);=0A+   =
     cpumask_clear_cpu(smp_processor_id(), &flush_cpumask);=0A         =
flush_va      =3D va;=0A         flush_flags   =3D flags;=0A         =
send_IPI_mask(&flush_cpumask, INVALIDATE_TLB_VECTOR);=0A-        while ( =
!cpus_empty(flush_cpumask) )=0A+        while ( !cpumask_empty(&flush_cpuma=
sk) )=0A             cpu_relax();=0A         spin_unlock(&flush_lock);=0A  =
   }=0A--- 2011-10-18.orig/xen/arch/x86/smpboot.c	2011-10-12 =
13:59:39.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/smpboot.c	=
2011-10-14 15:08:39.000000000 +0200=0A@@ -533,8 +533,9 @@ int alloc_cpu_id(=
void)=0A {=0A     cpumask_t tmp_map;=0A     int cpu;=0A-    cpus_complement=
(tmp_map, cpu_present_map);=0A-    cpu =3D first_cpu(tmp_map);=0A+=0A+    =
cpumask_complement(&tmp_map, &cpu_present_map);=0A+    cpu =3D cpumask_firs=
t(&tmp_map);=0A     return (cpu < nr_cpu_ids) ? cpu : -ENODEV;=0A }=0A =
=0A@@ -818,18 +819,18 @@ remove_siblinginfo(int cpu)=0A     {=0A         =
cpu_clear(cpu, per_cpu(cpu_core_map, sibling));=0A         /* Last thread =
sibling in this cpu core going down. */=0A-        if ( cpus_weight(per_cpu=
(cpu_sibling_map, cpu)) =3D=3D 1 )=0A+        if ( cpumask_weight(&per_cpu(=
cpu_sibling_map, cpu)) =3D=3D 1 )=0A             c[sibling].booted_cores--;=
=0A     }=0A    =0A     for_each_cpu_mask(sibling, per_cpu(cpu_sibling_map,=
 cpu))=0A-        cpu_clear(cpu, per_cpu(cpu_sibling_map, sibling));=0A-   =
 cpus_clear(per_cpu(cpu_sibling_map, cpu));=0A-    cpus_clear(per_cpu(cpu_c=
ore_map, cpu));=0A+        cpumask_clear_cpu(cpu, &per_cpu(cpu_sibling_map,=
 sibling));=0A+    cpumask_clear(&per_cpu(cpu_sibling_map, cpu));=0A+    =
cpumask_clear(&per_cpu(cpu_core_map, cpu));=0A     c[cpu].phys_proc_id =3D =
BAD_APICID;=0A     c[cpu].cpu_core_id =3D BAD_APICID;=0A     c[cpu].compute=
_unit_id =3D BAD_APICID;=0A-    cpu_clear(cpu, cpu_sibling_setup_map);=0A+ =
   cpumask_clear_cpu(cpu, &cpu_sibling_setup_map);=0A }=0A =0A void =
__cpu_disable(void)=0A--- 2011-10-18.orig/xen/arch/x86/time.c	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/time.c	2011-10-12 =
09:01:16.000000000 +0200=0A@@ -185,15 +185,15 @@ static void smp_send_timer=
_broadcast_ipi=0A     int cpu =3D smp_processor_id();=0A     cpumask_t =
mask;=0A =0A-    cpus_and(mask, cpu_online_map, pit_broadcast_mask);=0A+   =
 cpumask_and(&mask, &cpu_online_map, &pit_broadcast_mask);=0A =0A-    if ( =
cpu_isset(cpu, mask) )=0A+    if ( cpumask_test_cpu(cpu, &mask) )=0A     =
{=0A-        cpu_clear(cpu, mask);=0A+        cpumask_clear_cpu(cpu, =
&mask);=0A         raise_softirq(TIMER_SOFTIRQ);=0A     }=0A =0A-    if ( =
!cpus_empty(mask) )=0A+    if ( !cpumask_empty(&mask) )=0A     {=0A        =
 cpumask_raise_softirq(&mask, TIMER_SOFTIRQ);=0A     }=0A@@ -1226,7 =
+1226,7 @@ void check_tsc_warp(unsigned long tsc_kh=0A }=0A =0A static =
unsigned long tsc_max_warp, tsc_check_count;=0A-static cpumask_t tsc_check_=
cpumask =3D CPU_MASK_NONE;=0A+static cpumask_t tsc_check_cpumask;=0A =0A =
static void tsc_check_slave(void *unused)=0A {=0A--- 2011-10-18.orig/xen/co=
mmon/cpu.c	2011-10-17 08:39:11.000000000 +0200=0A+++ 2011-10-18/xen/co=
mmon/cpu.c	2011-10-17 08:39:39.000000000 +0200=0A@@ -176,7 +176,7 @@ =
int disable_nonboot_cpus(void)=0A =0A     BUG_ON(smp_processor_id() !=3D =
0);=0A =0A-    cpus_clear(frozen_cpus);=0A+    cpumask_clear(&frozen_cpus);=
=0A =0A     printk("Disabling non-boot CPUs ...\n");=0A =0A@@ -192,7 =
+192,7 @@ int disable_nonboot_cpus(void)=0A             break;=0A         =
}=0A =0A-        cpu_set(cpu, frozen_cpus);=0A+        cpumask_set_cpu(cpu,=
 &frozen_cpus);=0A     }=0A =0A     BUG_ON(!error && (num_online_cpus() =
!=3D 1));=0A@@ -214,5 +214,5 @@ void enable_nonboot_cpus(void)=0A         =
}=0A     }=0A =0A-    cpus_clear(frozen_cpus);=0A+    cpumask_clear(&frozen=
_cpus);=0A }=0A--- 2011-10-18.orig/xen/common/cpupool.c	2011-10-07 =
09:17:45.000000000 +0200=0A+++ 2011-10-18/xen/common/cpupool.c	2011-10-12 =
09:02:23.000000000 +0200=0A@@ -29,7 +29,7 @@ static struct cpupool =
*cpupool_list;    =0A =0A static int cpupool_moving_cpu =3D -1;=0A static =
struct cpupool *cpupool_cpu_moving =3D NULL;=0A-static cpumask_t cpupool_lo=
cked_cpus =3D CPU_MASK_NONE;=0A+static cpumask_t cpupool_locked_cpus;=0A =
=0A static DEFINE_SPINLOCK(cpupool_lock);=0A =0A--- 2011-10-18.orig/xen/com=
mon/domain.c	2011-09-21 16:33:10.000000000 +0200=0A+++ 2011-10-18/xen/co=
mmon/domain.c	2011-10-12 09:02:08.000000000 +0200=0A@@ -359,11 +359,12 =
@@ struct domain *domain_create(=0A =0A void domain_update_node_affinity(st=
ruct domain *d)=0A {=0A-    cpumask_t cpumask =3D CPU_MASK_NONE;=0A+    =
cpumask_t cpumask;=0A     nodemask_t nodemask =3D NODE_MASK_NONE;=0A     =
struct vcpu *v;=0A     unsigned int node;=0A =0A+    cpumask_clear(&cpumask=
);=0A     spin_lock(&d->node_affinity_lock);=0A =0A     for_each_vcpu ( d, =
v )=0A--- 2011-10-18.orig/xen/common/domctl.c	2011-10-20 14:46:19.0000000=
00 +0200=0A+++ 2011-10-18/xen/common/domctl.c	2011-10-18 13:32:43.0000000=
00 +0200=0A@@ -37,9 +37,9 @@ int cpumask_to_xenctl_cpumap(=0A     uint8_t =
bytemap[(NR_CPUS + 7) / 8];=0A =0A     guest_bytes =3D (xenctl_cpumap->nr_c=
pus + 7) / 8;=0A-    copy_bytes  =3D min_t(unsigned int, guest_bytes, =
sizeof(bytemap));=0A+    copy_bytes  =3D min_t(unsigned int, guest_bytes, =
(nr_cpu_ids + 7) / 8);=0A =0A-    bitmap_long_to_byte(bytemap, cpus_addr(*c=
pumask), NR_CPUS);=0A+    bitmap_long_to_byte(bytemap, cpumask_bits(cpumask=
), nr_cpu_ids);=0A =0A     if ( copy_bytes !=3D 0 )=0A         if ( =
copy_to_guest(xenctl_cpumap->bitmap, bytemap, copy_bytes) )=0A@@ -59,7 =
+59,7 @@ int xenctl_cpumap_to_cpumask(=0A     uint8_t bytemap[(NR_CPUS + =
7) / 8];=0A =0A     guest_bytes =3D (xenctl_cpumap->nr_cpus + 7) / 8;=0A-  =
  copy_bytes  =3D min_t(unsigned int, guest_bytes, sizeof(bytemap));=0A+   =
 copy_bytes  =3D min_t(unsigned int, guest_bytes, (nr_cpu_ids + 7) / =
8);=0A =0A     memset(bytemap, 0, sizeof(bytemap));=0A =0A@@ -71,7 +71,7 =
@@ int xenctl_cpumap_to_cpumask(=0A             bytemap[guest_bytes-1] =
&=3D ~(0xff << (xenctl_cpumap->nr_cpus & 7));=0A     }=0A =0A-    =
bitmap_byte_to_long(cpus_addr(*cpumask), bytemap, NR_CPUS);=0A+    =
bitmap_byte_to_long(cpumask_bits(cpumask), bytemap, nr_cpu_ids);=0A =0A    =
 return 0;=0A }=0A@@ -154,7 +154,7 @@ static unsigned int default_vcpu0_loc=
ati=0A     cpumask_t      cpu_exclude_map;=0A =0A     /* Do an initial CPU =
placement. Pick the least-populated CPU. */=0A-    nr_cpus =3D last_cpu(cpu=
_online_map) + 1;=0A+    nr_cpus =3D cpumask_last(&cpu_online_map) + 1;=0A =
    cnt =3D xzalloc_array(unsigned int, nr_cpus);=0A     if ( cnt )=0A     =
{=0A@@ -171,18 +171,19 @@ static unsigned int default_vcpu0_locati=0A      =
* If we're on a HT system, we only auto-allocate to a non-primary HT. We =
=0A      * favour high numbered CPUs in the event of a tie.=0A      */=0A- =
   cpu =3D first_cpu(per_cpu(cpu_sibling_map, 0));=0A-    if ( cpus_weight(=
per_cpu(cpu_sibling_map, 0)) > 1 )=0A-        cpu =3D next_cpu(cpu, =
per_cpu(cpu_sibling_map, 0));=0A-    cpu_exclude_map =3D per_cpu(cpu_siblin=
g_map, 0);=0A+    cpumask_copy(&cpu_exclude_map, &per_cpu(cpu_sibling_map, =
0));=0A+    cpu =3D cpumask_first(&cpu_exclude_map);=0A+    if ( cpumask_we=
ight(&cpu_exclude_map) > 1 )=0A+        cpu =3D cpumask_next(cpu, =
&cpu_exclude_map);=0A     for_each_cpu_mask(i, *online)=0A     {=0A-       =
 if ( cpu_isset(i, cpu_exclude_map) )=0A+        if ( cpumask_test_cpu(i, =
&cpu_exclude_map) )=0A             continue;=0A-        if ( (i =3D=3D =
first_cpu(per_cpu(cpu_sibling_map, i))) &&=0A-             (cpus_weight(per=
_cpu(cpu_sibling_map, i)) > 1) )=0A+        if ( (i =3D=3D cpumask_first(&p=
er_cpu(cpu_sibling_map, i))) &&=0A+             (cpumask_weight(&per_cpu(cp=
u_sibling_map, i)) > 1) )=0A             continue;=0A-        cpus_or(cpu_e=
xclude_map, cpu_exclude_map, per_cpu(cpu_sibling_map, i));=0A+        =
cpumask_or(&cpu_exclude_map, &cpu_exclude_map,=0A+                   =
&per_cpu(cpu_sibling_map, i));=0A         if ( !cnt || cnt[i] <=3D =
cnt[cpu] )=0A             cpu =3D i;=0A     }=0A--- 2011-10-18.orig/xen/com=
mon/keyhandler.c	2011-09-21 16:32:28.000000000 +0200=0A+++ =
2011-10-18/xen/common/keyhandler.c	2011-10-12 09:07:34.000000000 =
+0200=0A@@ -316,7 +316,7 @@ static struct keyhandler dump_domains_ke=0A    =
 .desc =3D "dump domain (and guest debug) info"=0A };=0A =0A-static =
cpumask_t read_clocks_cpumask =3D CPU_MASK_NONE;=0A+static cpumask_t =
read_clocks_cpumask;=0A static DEFINE_PER_CPU(s_time_t, read_clocks_time);=
=0A static DEFINE_PER_CPU(u64, read_cycles_time);=0A =0A--- 2011-10-18.orig=
/xen/common/page_alloc.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/common/page_alloc.c	2011-10-18 13:32:47.000000000 =
+0200=0A@@ -304,7 +304,7 @@ static struct page_info *alloc_heap_page=0A    =
 unsigned int first_node, i, j, zone =3D 0, nodemask_retry =3D 0;=0A     =
unsigned int node =3D (uint8_t)((memflags >> _MEMF_node) - 1);=0A     =
unsigned long request =3D 1UL << order;=0A-    cpumask_t extra_cpus_mask, =
mask;=0A+    cpumask_t mask;=0A     struct page_info *pg;=0A     nodemask_t=
 nodemask =3D (d !=3D NULL ) ? d->node_affinity : node_online_map;=0A =
=0A@@ -418,7 +418,7 @@ static struct page_info *alloc_heap_page=0A     if =
( d !=3D NULL )=0A         d->last_alloc_node =3D node;=0A =0A-    =
cpus_clear(mask);=0A+    cpumask_clear(&mask);=0A =0A     for ( i =3D 0; i =
< (1 << order); i++ )=0A     {=0A@@ -429,9 +429,11 @@ static struct =
page_info *alloc_heap_page=0A         if ( pg[i].u.free.need_tlbflush )=0A =
        {=0A             /* Add in extra CPUs that need flushing because =
of this page. */=0A-            cpus_andnot(extra_cpus_mask, cpu_online_map=
, mask);=0A+            static cpumask_t extra_cpus_mask;=0A+=0A+          =
  cpumask_andnot(&extra_cpus_mask, &cpu_online_map, &mask);=0A             =
tlbflush_filter(extra_cpus_mask, pg[i].tlbflush_timestamp);=0A-            =
cpus_or(mask, mask, extra_cpus_mask);=0A+            cpumask_or(&mask, =
&mask, &extra_cpus_mask);=0A         }=0A =0A         /* Initialise fields =
which have other uses for free pages. */=0A@@ -441,7 +443,7 @@ static =
struct page_info *alloc_heap_page=0A =0A     spin_unlock(&heap_lock);=0A =
=0A-    if ( unlikely(!cpus_empty(mask)) )=0A+    if ( unlikely(!cpumask_em=
pty(&mask)) )=0A     {=0A         perfc_incr(need_flush_tlb_flush);=0A     =
    flush_tlb_mask(&mask);=0A--- 2011-10-18.orig/xen/common/rcupdate.c	=
2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/common/rcupdate.c	=
2011-10-14 09:47:53.000000000 +0200=0A@@ -59,7 +59,6 @@ static struct =
rcu_ctrlblk {=0A     .cur =3D -300,=0A     .completed =3D -300,=0A     =
.lock =3D SPIN_LOCK_UNLOCKED,=0A-    .cpumask =3D CPU_MASK_NONE,=0A };=0A =
=0A /*=0A--- 2011-10-18.orig/xen/common/sched_credit.c	2011-10-07 =
09:18:05.000000000 +0200=0A+++ 2011-10-18/xen/common/sched_credit.c	=
2011-10-12 08:38:35.000000000 +0200=0A@@ -260,7 +260,7 @@ __runq_tickle(uns=
igned int cpu, struct c=0A     cpumask_t mask;=0A =0A     ASSERT(cur);=0A- =
   cpus_clear(mask);=0A+    cpumask_clear(&mask);=0A =0A     /* If =
strictly higher priority than current VCPU, signal the CPU */=0A     if ( =
new->pri > cur->pri )=0A@@ -274,7 +274,7 @@ __runq_tickle(unsigned int =
cpu, struct c=0A         else=0A             CSCHED_STAT_CRANK(tickle_local=
_other);=0A =0A-        cpu_set(cpu, mask);=0A+        cpumask_set_cpu(cpu,=
 &mask);=0A     }=0A =0A     /*=0A@@ -283,7 +283,7 @@ __runq_tickle(unsigne=
d int cpu, struct c=0A      */=0A     if ( cur->pri > CSCHED_PRI_IDLE )=0A =
    {=0A-        if ( cpus_empty(prv->idlers) )=0A+        if ( cpumask_emp=
ty(&prv->idlers) )=0A         {=0A             CSCHED_STAT_CRANK(tickle_idl=
ers_none);=0A         }=0A@@ -292,24 +292,24 @@ __runq_tickle(unsigned int =
cpu, struct c=0A             cpumask_t idle_mask;=0A =0A             =
cpumask_and(&idle_mask, &prv->idlers, new->vcpu->cpu_affinity);=0A-        =
    if ( !cpus_empty(idle_mask) )=0A+            if ( !cpumask_empty(&idle_=
mask) )=0A             {=0A                 CSCHED_STAT_CRANK(tickle_idlers=
_some);=0A                 if ( opt_tickle_one_idle )=0A                 =
{=0A                     this_cpu(last_tickle_cpu) =3D =0A-                =
        cycle_cpu(this_cpu(last_tickle_cpu), idle_mask);=0A-               =
     cpu_set(this_cpu(last_tickle_cpu), mask);=0A+                        =
cpumask_cycle(this_cpu(last_tickle_cpu), &idle_mask);=0A+                  =
  cpumask_set_cpu(this_cpu(last_tickle_cpu), &mask);=0A                 =
}=0A                 else=0A-                    cpus_or(mask, mask, =
idle_mask);=0A+                    cpumask_or(&mask, &mask, &idle_mask);=0A=
             }=0A             cpumask_and(&mask, &mask, new->vcpu->cpu_affi=
nity);=0A         }=0A     }=0A =0A     /* Send scheduler interrupts to =
designated CPUs */=0A-    if ( !cpus_empty(mask) )=0A+    if ( !cpumask_emp=
ty(&mask) )=0A         cpumask_raise_softirq(&mask, SCHEDULE_SOFTIRQ);=0A =
}=0A =0A@@ -471,10 +471,10 @@ _csched_cpu_pick(const struct scheduler =0A  =
    */=0A     online =3D CSCHED_CPUONLINE(vc->domain->cpupool);=0A     =
cpumask_and(&cpus, online, vc->cpu_affinity);=0A-    cpu =3D cpu_isset(vc->=
processor, cpus)=0A+    cpu =3D cpumask_test_cpu(vc->processor, &cpus)=0A  =
           ? vc->processor=0A-            : cycle_cpu(vc->processor, =
cpus);=0A-    ASSERT( !cpus_empty(cpus) && cpu_isset(cpu, cpus) );=0A+     =
       : cpumask_cycle(vc->processor, &cpus);=0A+    ASSERT( !cpumask_empty=
(&cpus) && cpumask_test_cpu(cpu, &cpus) );=0A =0A     /*=0A      * Try to =
find an idle processor within the above constraints.=0A@@ -488,54 +488,54 =
@@ _csched_cpu_pick(const struct scheduler =0A      * like run two VCPUs =
on co-hyperthreads while there are idle cores=0A      * or sockets.=0A     =
 */=0A-    cpus_and(idlers, cpu_online_map, CSCHED_PRIV(ops)->idlers);=0A- =
   cpu_set(cpu, idlers);=0A-    cpus_and(cpus, cpus, idlers);=0A-    =
cpu_clear(cpu, cpus);=0A+    cpumask_and(&idlers, &cpu_online_map, =
&CSCHED_PRIV(ops)->idlers);=0A+    cpumask_set_cpu(cpu, &idlers);=0A+    =
cpumask_and(&cpus, &cpus, &idlers);=0A+    cpumask_clear_cpu(cpu, =
&cpus);=0A =0A-    while ( !cpus_empty(cpus) )=0A+    while ( !cpumask_empt=
y(&cpus) )=0A     {=0A         cpumask_t cpu_idlers;=0A         cpumask_t =
nxt_idlers;=0A         int nxt, weight_cpu, weight_nxt;=0A         int =
migrate_factor;=0A =0A-        nxt =3D cycle_cpu(cpu, cpus);=0A+        =
nxt =3D cpumask_cycle(cpu, &cpus);=0A =0A-        if ( cpu_isset(cpu, =
per_cpu(cpu_core_map, nxt)) )=0A+        if ( cpumask_test_cpu(cpu, =
&per_cpu(cpu_core_map, nxt)) )=0A         {=0A             /* We're on the =
same socket, so check the busy-ness of threads.=0A              * Migrate =
if # of idlers is less at all */=0A-            ASSERT( cpu_isset(nxt, =
per_cpu(cpu_core_map, cpu)) );=0A+            ASSERT( cpumask_test_cpu(nxt,=
 &per_cpu(cpu_core_map, cpu)) );=0A             migrate_factor =3D 1;=0A-  =
          cpus_and(cpu_idlers, idlers, per_cpu(cpu_sibling_map, cpu));=0A- =
           cpus_and(nxt_idlers, idlers, per_cpu(cpu_sibling_map, nxt));=0A+=
            cpumask_and(&cpu_idlers, &idlers, &per_cpu(cpu_sibling_map, =
cpu));=0A+            cpumask_and(&nxt_idlers, &idlers, &per_cpu(cpu_siblin=
g_map, nxt));=0A         }=0A         else=0A         {=0A             /* =
We're on different sockets, so check the busy-ness of cores.=0A            =
  * Migrate only if the other core is twice as idle */=0A-            =
ASSERT( !cpu_isset(nxt, per_cpu(cpu_core_map, cpu)) );=0A+            =
ASSERT( !cpumask_test_cpu(nxt, &per_cpu(cpu_core_map, cpu)) );=0A          =
   migrate_factor =3D 2;=0A-            cpus_and(cpu_idlers, idlers, =
per_cpu(cpu_core_map, cpu));=0A-            cpus_and(nxt_idlers, idlers, =
per_cpu(cpu_core_map, nxt));=0A+            cpumask_and(&cpu_idlers, =
&idlers, &per_cpu(cpu_core_map, cpu));=0A+            cpumask_and(&nxt_idle=
rs, &idlers, &per_cpu(cpu_core_map, nxt));=0A         }=0A =0A-        =
weight_cpu =3D cpus_weight(cpu_idlers);=0A-        weight_nxt =3D =
cpus_weight(nxt_idlers);=0A+        weight_cpu =3D cpumask_weight(&cpu_idle=
rs);=0A+        weight_nxt =3D cpumask_weight(&nxt_idlers);=0A         /* =
smt_power_savings: consolidate work rather than spreading it */=0A         =
if ( sched_smt_power_savings ?=0A              weight_cpu > weight_nxt =
:=0A              weight_cpu * migrate_factor < weight_nxt )=0A         =
{=0A-            cpus_and(nxt_idlers, cpus, nxt_idlers);=0A+            =
cpumask_and(&nxt_idlers, &cpus, &nxt_idlers);=0A             spc =3D =
CSCHED_PCPU(nxt);=0A-            cpu =3D cycle_cpu(spc->idle_bias, =
nxt_idlers);=0A-            cpus_andnot(cpus, cpus, per_cpu(cpu_sibling_map=
, cpu));=0A+            cpu =3D cpumask_cycle(spc->idle_bias, &nxt_idlers);=
=0A+            cpumask_andnot(&cpus, &cpus, &per_cpu(cpu_sibling_map, =
cpu));=0A         }=0A         else=0A         {=0A-            cpus_andnot=
(cpus, cpus, nxt_idlers);=0A+            cpumask_andnot(&cpus, &cpus, =
&nxt_idlers);=0A         }=0A     }=0A =0A@@ -1228,7 +1228,7 @@ csched_load=
_balance(struct csched_privat=0A     online =3D CSCHED_CPUONLINE(per_cpu(cp=
upool, cpu));=0A =0A     /* If this CPU is going offline we shouldn't =
steal work. */=0A-    if ( unlikely(!cpu_isset(cpu, *online)) )=0A+    if =
( unlikely(!cpumask_test_cpu(cpu, online)) )=0A         goto out;=0A =0A   =
  if ( snext->pri =3D=3D CSCHED_PRI_IDLE )=0A@@ -1242,14 +1242,14 @@ =
csched_load_balance(struct csched_privat=0A      * Peek at non-idling CPUs =
in the system, starting with our=0A      * immediate neighbour.=0A      =
*/=0A-    cpus_andnot(workers, *online, prv->idlers);=0A-    cpu_clear(cpu,=
 workers);=0A+    cpumask_andnot(&workers, online, &prv->idlers);=0A+    =
cpumask_clear_cpu(cpu, &workers);=0A     peer_cpu =3D cpu;=0A =0A     =
while ( !cpus_empty(workers) )=0A     {=0A-        peer_cpu =3D cycle_cpu(p=
eer_cpu, workers);=0A-        cpu_clear(peer_cpu, workers);=0A+        =
peer_cpu =3D cpumask_cycle(peer_cpu, &workers);=0A+        cpumask_clear_cp=
u(peer_cpu, &workers);=0A =0A         /*=0A          * Get ahold of the =
scheduler lock for this peer CPU.=0A@@ -1267,7 +1267,7 @@ csched_load_balan=
ce(struct csched_privat=0A         /*=0A          * Any work over there to =
steal?=0A          */=0A-        speer =3D cpu_isset(peer_cpu, *online) =
?=0A+        speer =3D cpumask_test_cpu(peer_cpu, online) ?=0A             =
csched_runq_steal(peer_cpu, cpu, snext->pri) : NULL;=0A         pcpu_schedu=
le_unlock(peer_cpu);=0A         if ( speer !=3D NULL )=0A--- 2011-10-18.ori=
g/xen/common/sched_credit2.c	2011-10-07 09:18:09.000000000 +0200=0A+++ =
2011-10-18/xen/common/sched_credit2.c	2011-10-11 18:03:39.000000000 =
+0200=0A@@ -507,19 +507,19 @@ runq_tickle(const struct scheduler *ops,=0A  =
   }=0A     =0A     /* Get a mask of idle, but not tickled */=0A-    =
cpus_andnot(mask, rqd->idle, rqd->tickled);=0A+    cpumask_andnot(&mask, =
&rqd->idle, &rqd->tickled);=0A     =0A     /* If it's not empty, choose =
one */=0A-    if ( !cpus_empty(mask) )=0A+    if ( !cpumask_empty(&mask) =
)=0A     {=0A-        ipid=3Dfirst_cpu(mask);=0A+        ipid =3D =
cpumask_first(&mask);=0A         goto tickle;=0A     }=0A =0A     /* =
Otherwise, look for the non-idle cpu with the lowest credit,=0A      * =
skipping cpus which have been tickled but not scheduled yet */=0A-    =
cpus_andnot(mask, rqd->active, rqd->idle);=0A-    cpus_andnot(mask, mask, =
rqd->tickled);=0A+    cpumask_andnot(&mask, &rqd->active, &rqd->idle);=0A+ =
   cpumask_andnot(&mask, &mask, &rqd->tickled);=0A =0A     for_each_cpu_mas=
k(i, mask)=0A     {=0A@@ -573,7 +573,7 @@ tickle:=0A                   =
sizeof(d),=0A                   (unsigned char *)&d);=0A     }=0A-    =
cpu_set(ipid, rqd->tickled);=0A+    cpumask_set_cpu(ipid, &rqd->tickled);=
=0A     cpu_raise_softirq(ipid, SCHEDULE_SOFTIRQ);=0A =0A no_tickle:=0A--- =
2011-10-18.orig/xen/common/schedule.c	2011-10-12 13:59:19.000000000 =
+0200=0A+++ 2011-10-18/xen/common/schedule.c	2011-10-11 17:56:50.0000000=
00 +0200=0A@@ -595,8 +595,8 @@ int vcpu_set_affinity(struct vcpu *v, co=0A =
    if ( v->domain->is_pinned )=0A         return -EINVAL;=0A     online =
=3D VCPU2ONLINE(v);=0A-    cpus_and(online_affinity, *affinity, =
*online);=0A-    if ( cpus_empty(online_affinity) )=0A+    cpumask_and(&onl=
ine_affinity, affinity, online);=0A+    if ( cpumask_empty(&online_affinity=
) )=0A         return -EINVAL;=0A =0A     vcpu_schedule_lock_irq(v);=0A--- =
2011-10-18.orig/xen/common/softirq.c	2011-10-20 14:46:19.000000000 =
+0200=0A+++ 2011-10-18/xen/common/softirq.c	2011-10-12 09:04:04.0000000=
00 +0200=0A@@ -71,11 +71,12 @@ void open_softirq(int nr, softirq_handle=0A =
void cpumask_raise_softirq(const cpumask_t *mask, unsigned int nr)=0A {=0A =
    int cpu;=0A-    cpumask_t send_mask =3D CPU_MASK_NONE;=0A+    =
cpumask_t send_mask;=0A =0A+    cpumask_clear(&send_mask);=0A     =
for_each_cpu_mask(cpu, *mask)=0A         if ( !test_and_set_bit(nr, =
&softirq_pending(cpu)) )=0A-            cpu_set(cpu, send_mask);=0A+       =
     cpumask_set_cpu(cpu, &send_mask);=0A =0A     smp_send_event_check_mask=
(&send_mask);=0A }=0A--- 2011-10-18.orig/xen/common/trace.c	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/common/trace.c	2011-10-12 =
09:06:27.000000000 +0200=0A@@ -70,7 +70,7 @@ static DEFINE_PER_CPU(unsigned=
 long, los=0A int tb_init_done __read_mostly;=0A =0A /* which CPUs tracing =
is enabled on */=0A-static cpumask_t tb_cpu_mask =3D CPU_MASK_ALL;=0A+stati=
c cpumask_t tb_cpu_mask;=0A =0A /* which tracing events are enabled */=0A =
static u32 tb_event_mask =3D TRC_ALL;=0A@@ -338,6 +338,7 @@ int trace_will_=
trace_event(u32 event)=0A  */=0A void __init init_trace_bufs(void)=0A =
{=0A+    cpumask_setall(&tb_cpu_mask);=0A     register_cpu_notifier(&cpu_nf=
b);=0A =0A     if ( opt_tbuf_size )=0A--- 2011-10-18.orig/xen/include/xen/c=
pumask.h	2011-10-17 08:43:34.000000000 +0200=0A+++ 2011-10-18/xen/in=
clude/xen/cpumask.h	2011-10-19 17:29:46.000000000 +0200=0A@@ -13,18 =
+13,18 @@=0A  *=0A  * The available cpumask operations are:=0A  *=0A- * =
void cpu_set(cpu, mask)		turn on bit 'cpu' in mask=0A- * void =
cpu_clear(cpu, mask)		turn off bit 'cpu' in mask=0A- * void =
cpus_setall(mask)		set all bits=0A- * void cpus_clear(mask)	=
	clear all bits=0A- * int cpu_isset(cpu, mask)		true iff =
bit 'cpu' set in mask=0A- * int cpu_test_and_set(cpu, mask)	test and =
set bit 'cpu' in mask=0A- *=0A- * void cpus_and(dst, src1, src2)	=
dst =3D src1 & src2  [intersection]=0A- * void cpus_or(dst, src1, src2)	=
dst =3D src1 | src2  [union]=0A- * void cpus_xor(dst, src1, src2)	=
dst =3D src1 ^ src2=0A- * void cpus_andnot(dst, src1, src2)	dst =3D =
src1 & ~src2=0A- * void cpus_complement(dst, src)	dst =3D ~src=0A+ * =
void cpumask_set_cpu(cpu, mask)	turn on bit 'cpu' in mask=0A+ * void =
cpumask_clear_cpu(cpu, mask)	turn off bit 'cpu' in mask=0A+ * void =
cpumask_setall(mask)		set all bits=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+ *=0A+ * void cpumask_and(dst, =
src1, src2)	dst =3D src1 & src2  [intersection]=0A+ * void cpumask_or(d=
st, src1, src2)	dst =3D src1 | src2  [union]=0A+ * void cpumask_xor(dst, =
src1, src2)	dst =3D src1 ^ src2=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@@ -33,8 +33,8 @@=0A  * int cpus_full(mask)			=
Is mask full (all bits sets)?=0A  * int cpus_weight(mask)		=
Hamming weigh - number of set bits=0A  *=0A- * void cpus_shift_right(dst, =
src, n)	Shift right=0A- * void cpus_shift_left(dst, src, n)	Shift =
left=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@@ -110,18 +110,14 @@ =
static inline void cpumask_clear_cpu(int=0A 	clear_bit(cpumask_check(cpu=
), dstp->bits);=0A }=0A =0A-#define cpumask_setall(dst) __cpus_setall(dst, =
nr_cpumask_bits)=0A-#define cpus_setall(dst) __cpus_setall(&(dst), =
NR_CPUS)=0A-static inline void __cpus_setall(cpumask_t *dstp, int =
nbits)=0A+static inline void cpumask_setall(cpumask_t *dstp)=0A {=0A-	=
bitmap_fill(dstp->bits, nbits);=0A+	bitmap_fill(dstp->bits, nr_cpumask_=
bits);=0A }=0A =0A-#define cpumask_clear(dst) __cpus_clear(dst, nr_cpumask_=
bits)=0A-#define cpus_clear(dst) __cpus_clear(&(dst), NR_CPUS)=0A-static =
inline void __cpus_clear(cpumask_t *dstp, int nbits)=0A+static inline void =
cpumask_clear(cpumask_t *dstp)=0A {=0A-	bitmap_zero(dstp->bits, nbits);=0A+=
	bitmap_zero(dstp->bits, nr_cpumask_bits);=0A }=0A =0A /* No static =
inline type checking - see Subtlety (1) above. */=0A@@ -143,50 +139,33 @@ =
static inline int cpumask_test_and_clear=0A 	return test_and_clear_bit(c=
pumask_check(cpu), addr->bits);=0A }=0A =0A-#define cpumask_and(dst, src1, =
src2) \=0A-	__cpus_and(dst, src1, src2, nr_cpumask_bits)=0A-#define =
cpus_and(dst, src1, src2) __cpus_and(&(dst), &(src1), &(src2), NR_CPUS)=0A-=
static inline void __cpus_and(cpumask_t *dstp, const cpumask_t *src1p,=0A-	=
				const cpumask_t *src2p, int nbits)=0A+stati=
c inline void cpumask_and(cpumask_t *dstp, const cpumask_t *src1p,=0A+		=
	       const cpumask_t *src2p)=0A {=0A-	bitmap_and(dstp->bits, =
src1p->bits, src2p->bits, nbits);=0A+	bitmap_and(dstp->bits, src1p->bits,=
 src2p->bits, nr_cpumask_bits);=0A }=0A =0A-#define cpumask_or(dst, src1, =
src2) \=0A-	__cpus_or(dst, src1, src2, nr_cpumask_bits)=0A-#define =
cpus_or(dst, src1, src2) __cpus_or(&(dst), &(src1), &(src2), NR_CPUS)=0A-st=
atic inline void __cpus_or(cpumask_t *dstp, const cpumask_t *src1p,=0A-		=
			const cpumask_t *src2p, int nbits)=0A+static =
inline void cpumask_or(cpumask_t *dstp, const cpumask_t *src1p,=0A+		=
	      const cpumask_t *src2p)=0A {=0A-	bitmap_or(dstp->bits, =
src1p->bits, src2p->bits, nbits);=0A+	bitmap_or(dstp->bits, src1p->bits, =
src2p->bits, nr_cpumask_bits);=0A }=0A =0A-#define cpumask_xor(dst, src1, =
src2) \=0A-	__cpus_xor(dst, src1, src2, nr_cpumask_bits)=0A-#define =
cpus_xor(dst, src1, src2) __cpus_xor(&(dst), &(src1), &(src2), NR_CPUS)=0A-=
static inline void __cpus_xor(cpumask_t *dstp, const cpumask_t *src1p,=0A-	=
				const cpumask_t *src2p, int nbits)=0A+stati=
c inline void cpumask_xor(cpumask_t *dstp, const cpumask_t *src1p,=0A+		=
	       const cpumask_t *src2p)=0A {=0A-	bitmap_xor(dstp->bits, =
src1p->bits, src2p->bits, nbits);=0A+	bitmap_xor(dstp->bits, src1p->bits,=
 src2p->bits, nr_cpumask_bits);=0A }=0A =0A-#define cpumask_andnot(dst, =
src1, src2) \=0A-	__cpus_andnot(dst, src1, src2, nr_cpumask_bits)=0A-=
#define cpus_andnot(dst, src1, src2) \=0A-				=
__cpus_andnot(&(dst), &(src1), &(src2), NR_CPUS)=0A-static inline void =
__cpus_andnot(cpumask_t *dstp, const cpumask_t *src1p,=0A-			=
		const cpumask_t *src2p, int nbits)=0A+static inline void =
cpumask_andnot(cpumask_t *dstp, const cpumask_t *src1p,=0A+			=
	  const cpumask_t *src2p)=0A {=0A-	bitmap_andnot(dstp->bits, =
src1p->bits, src2p->bits, nbits);=0A+	bitmap_andnot(dstp->bits, =
src1p->bits, src2p->bits, nr_cpumask_bits);=0A }=0A =0A-#define cpumask_com=
plement(dst, src) \=0A-	__cpus_complement(dst, src, nr_cpumask_bits)=0A-#de=
fine cpus_complement(dst, src) __cpus_complement(&(dst), &(src), =
NR_CPUS)=0A-static inline void __cpus_complement(cpumask_t *dstp,=0A-		=
			const cpumask_t *srcp, int nbits)=0A+static inline =
void cpumask_complement(cpumask_t *dstp, const cpumask_t *srcp)=0A {=0A-	=
bitmap_complement(dstp->bits, srcp->bits, nbits);=0A+	bitmap_complement(d=
stp->bits, srcp->bits, nr_cpumask_bits);=0A }=0A =0A #define cpumask_equal(=
src1, src2) __cpus_equal(src1, src2, nr_cpu_ids)=0A@@ -236,31 +215,21 @@ =
static inline int __cpus_weight(const cp=0A 	return bitmap_weight(srcp->=
bits, nbits);=0A }=0A =0A-#define cpumask_copy(dest, src) __cpus_copy(dest,=
 src, nr_cpumask_bits)=0A-#define cpus_copy(dest, src) __cpus_copy(&(dest),=
 &(src), NR_CPUS)=0A-static inline void __cpus_copy(cpumask_t *dstp, const =
cpumask_t *srcp, int nbits)=0A+static inline void cpumask_copy(cpumask_t =
*dstp, const cpumask_t *srcp)=0A {=0A-	bitmap_copy(dstp->bits, srcp->bits,=
 nbits);=0A+	bitmap_copy(dstp->bits, srcp->bits, nr_cpumask_bits);=0A =
}=0A =0A-#define cpumask_shift_right(dst, src, n) \=0A-	__cpus_shift_right(=
dst, src, n, nr_cpumask_bits)=0A-#define cpus_shift_right(dst, src, n) =
\=0A-			__cpus_shift_right(&(dst), &(src), (n), NR_CPUS)=0A=
-static inline void __cpus_shift_right(cpumask_t *dstp,=0A-			=
		const cpumask_t *srcp, int n, int nbits)=0A+static inline =
void cpumask_shift_right(cpumask_t *dstp,=0A+				   =
    const cpumask_t *srcp, int n)=0A {=0A-	bitmap_shift_right(dstp->bi=
ts, srcp->bits, n, nbits);=0A+	bitmap_shift_right(dstp->bits, srcp->bits, =
n, nr_cpumask_bits);=0A }=0A =0A-#define cpumask_shift_left(dst, src, n) =
\=0A-	__cpus_shift_left(dst, src, n, nr_cpumask_bits)=0A-#define =
cpus_shift_left(dst, src, n) \=0A-			__cpus_shift_left(&=
(dst), &(src), (n), NR_CPUS)=0A-static inline void __cpus_shift_left(cpumas=
k_t *dstp,=0A-					const cpumask_t *srcp, int =
n, int nbits)=0A+static inline void cpumask_shift_left(cpumask_t *dstp,=0A+=
				      const cpumask_t *srcp, int n)=0A =
{=0A-	bitmap_shift_left(dstp->bits, srcp->bits, n, nbits);=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@@ -317,6 +286,7 =
@@ static inline const cpumask_t *cpumask_o=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 #if =
NR_CPUS <=3D BITS_PER_LONG=0A@@ -345,8 +315,10 @@ static inline const =
cpumask_t *cpumask_o=0A /*(cpumask_t)*/ { {					=
		\=0A 	[0] =3D  1UL						=
	\=0A } }=0A+#endif /* __ia64__ */=0A =0A #define cpus_addr(src) =
((src).bits)=0A+#define cpumask_bits(maskp) ((maskp)->bits)=0A =0A #define =
cpumask_scnprintf(buf, len, src) \=0A 	__cpumask_scnprintf((buf), (len), =
&(src), nr_cpu_ids)=0A@@ -388,9 +360,8 @@ typedef cpumask_t *cpumask_var_t;=
=0A static inline bool_t alloc_cpumask_var(cpumask_var_t *mask)=0A {=0A 	=
/*=0A-	 * Once all direct cpumask assignments and all cpus_*() =
accessors=0A-	 * still referencing NR_CPUS are gone, we could use =
nr_cpumask_bits=0A-	 * to determine the allocation size here.=0A+	 * =
Once all direct cpumask assignments are gone, we could use=0A+	 * =
nr_cpumask_bits to determine the allocation size here.=0A 	 */=0A 	=
return (*mask =3D xmalloc(cpumask_t)) !=3D NULL;=0A }=0A
--=__Part9BB47839.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

--=__Part9BB47839.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:41:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:41:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGssS-0006xr-ER; Thu, 20 Oct 2011 06:41:44 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGspI-0005sz-FB
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:38:29 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319117904!33941830!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16793 invoked from network); 20 Oct 2011 13:38:25 -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; 20 Oct 2011 13:38:25 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:38:25 +0100
Message-Id: <4EA0406E020000780005C7AE@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:38:22 +0100
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="=__PartFCD31F5E.0__="
Subject: [Xen-devel] [PATCH 03/12] eliminate direct assignments of CPU masks
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--=__PartFCD31F5E.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Use cpumask_copy() instead of direct variable assignments for copying
CPU masks. While direct assignments are not a problem when both sides
are variables actually defined as cpumask_t (except for possibly
copying *much* more than would actually need to be copied), they must
not happen when the original variable is of type cpumask_var_t (which
may have lass space allocated to it than a full cpumask_t). Eliminate
as many of such assignments as possible (in several cases it's even
possible to collapse two operations [copy then clear one bit] into one
[cpumask_andnot()]), and thus set the way for reducing the allocation
size in alloc_cpumask_var().

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- 2011-10-18.orig/xen/arch/x86/acpi/cpufreq/powernow.c	2011-10-19 =
17:27:19.000000000 +0200
+++ 2011-10-18/xen/arch/x86/acpi/cpufreq/powernow.c	2011-10-14 =
09:48:25.000000000 +0200
@@ -107,7 +107,7 @@ static int powernow_cpufreq_target(struc
     if (unlikely(result))
         return -ENODEV;
=20
-    online_policy_cpus =3D policy->cpus;
+    cpumask_and(&online_policy_cpus, &policy->cpus, &cpu_online_map);
=20
     next_perf_state =3D data->freq_table[next_state].index;
     if (perf->state =3D=3D next_perf_state) {
--- 2011-10-18.orig/xen/arch/x86/cpu/mtrr/main.c	2011-10-19 =
17:27:19.000000000 +0200
+++ 2011-10-18/xen/arch/x86/cpu/mtrr/main.c	2011-10-13 15:43:53.0000000=
00 +0200
@@ -231,9 +231,9 @@ static void set_mtrr(unsigned int reg, u
 	struct set_mtrr_data data;
 	unsigned long flags;
=20
-	allbutself =3D cpu_online_map;
-	cpu_clear(smp_processor_id(), allbutself);
-	nr_cpus =3D cpus_weight(allbutself);
+	cpumask_andnot(&allbutself, &cpu_online_map,
+                       cpumask_of(smp_processor_id()));
+	nr_cpus =3D cpumask_weight(&allbutself);
=20
 	data.smp_reg =3D reg;
 	data.smp_base =3D base;
--- 2011-10-18.orig/xen/arch/x86/irq.c	2011-10-18 13:32:30.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/irq.c	2011-10-18 13:36:58.000000000 =
+0200
@@ -1040,7 +1040,7 @@ static void irq_guest_eoi_timer_fn(void=20
             desc->handler->end(desc, 0);
         break;
     case ACKTYPE_EOI:
-        cpu_eoi_map =3D action->cpu_eoi_map;
+        cpumask_copy(&cpu_eoi_map, &action->cpu_eoi_map);
         spin_unlock_irq(&desc->lock);
         on_selected_cpus(&cpu_eoi_map, set_eoi_ready, desc, 0);
         spin_lock_irq(&desc->lock);
@@ -1366,9 +1366,9 @@ void desc_guest_eoi(struct irq_desc *des
=20
     ASSERT(action->ack_type =3D=3D ACKTYPE_EOI);
        =20
-    cpu_eoi_map =3D action->cpu_eoi_map;
+    cpumask_copy(&cpu_eoi_map, &action->cpu_eoi_map);
=20
-    if ( cpu_test_and_clear(smp_processor_id(), cpu_eoi_map) )
+    if ( cpumask_test_and_clear_cpu(smp_processor_id(), &cpu_eoi_map) )
     {
         __set_eoi_ready(desc);
         spin_unlock(&desc->lock);
@@ -1380,7 +1380,7 @@ void desc_guest_eoi(struct irq_desc *des
         spin_unlock_irq(&desc->lock);
     }
=20
-    if ( !cpus_empty(cpu_eoi_map) )
+    if ( !cpumask_empty(&cpu_eoi_map) )
         on_selected_cpus(&cpu_eoi_map, set_eoi_ready, desc, 0);
 }
=20
@@ -1619,7 +1619,7 @@ static irq_guest_action_t *__pirq_guest_
              (--action->in_flight =3D=3D 0) &&
              (action->nr_guests !=3D 0) )
         {
-            cpu_eoi_map =3D action->cpu_eoi_map;
+            cpumask_copy(&cpu_eoi_map, &action->cpu_eoi_map);
             spin_unlock_irq(&desc->lock);
             on_selected_cpus(&cpu_eoi_map, set_eoi_ready, desc, 0);
             spin_lock_irq(&desc->lock);
@@ -1649,8 +1649,8 @@ static irq_guest_action_t *__pirq_guest_
      * would need to flush all ready EOIs before returning as otherwise =
the
      * desc->handler could change and we would call the wrong 'end' hook.
      */
-    cpu_eoi_map =3D action->cpu_eoi_map;
-    if ( !cpus_empty(cpu_eoi_map) )
+    cpumask_copy(&cpu_eoi_map, &action->cpu_eoi_map);
+    if ( !cpumask_empty(&cpu_eoi_map) )
     {
         BUG_ON(action->ack_type !=3D ACKTYPE_EOI);
         spin_unlock_irq(&desc->lock);
--- 2011-10-18.orig/xen/arch/x86/numa.c	2011-09-21 16:44:01.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/numa.c	2011-10-13 16:32:49.000000000 =
+0200
@@ -282,7 +282,7 @@ void __init numa_initmem_init(unsigned l
 	node_set_online(0);
 	for (i =3D 0; i < nr_cpu_ids; i++)
 		numa_set_node(i, 0);
-	node_to_cpumask[0] =3D cpumask_of_cpu(0);
+	cpumask_copy(&node_to_cpumask[0], cpumask_of(0));
 	setup_node_bootmem(0, (u64)start_pfn << PAGE_SHIFT, (u64)end_pfn =
<< PAGE_SHIFT);
 }
=20
--- 2011-10-18.orig/xen/arch/x86/smp.c	2011-10-12 08:33:44.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/smp.c	2011-10-13 16:37:53.000000000 =
+0200
@@ -257,8 +257,8 @@ void new_tlbflush_clock_period(void)
     cpumask_t allbutself;
=20
     /* Flush everyone else. We definitely flushed just before entry. */
-    allbutself =3D cpu_online_map;
-    cpu_clear(smp_processor_id(), allbutself);
+    cpumask_andnot(&allbutself, &cpu_online_map,
+                   cpumask_of(smp_processor_id()));
     flush_mask(&allbutself, FLUSH_TLB);
=20
     /* No need for atomicity: we are the only possible updater. */
@@ -289,8 +289,10 @@ void smp_call_function(
     void *info,
     int wait)
 {
-    cpumask_t allbutself =3D cpu_online_map;
-    cpu_clear(smp_processor_id(), allbutself);
+    cpumask_t allbutself;
+
+    cpumask_andnot(&allbutself, &cpu_online_map,
+                   cpumask_of(smp_processor_id()));
     on_selected_cpus(&allbutself, func, info, wait);
 }
=20
@@ -306,9 +308,9 @@ void on_selected_cpus(
=20
     spin_lock(&call_lock);
=20
-    call_data.selected =3D *selected;
+    cpumask_copy(&call_data.selected, selected);
=20
-    nr_cpus =3D cpus_weight(call_data.selected);
+    nr_cpus =3D cpumask_weight(&call_data.selected);
     if ( nr_cpus =3D=3D 0 )
         goto out;
=20
@@ -318,14 +320,14 @@ void on_selected_cpus(
=20
     send_IPI_mask(&call_data.selected, CALL_FUNCTION_VECTOR);
=20
-    if ( cpu_isset(smp_processor_id(), call_data.selected) )
+    if ( cpumask_test_cpu(smp_processor_id(), &call_data.selected) )
     {
         local_irq_disable();
         __smp_call_function_interrupt();
         local_irq_enable();
     }
=20
-    while ( !cpus_empty(call_data.selected) )
+    while ( !cpumask_empty(&call_data.selected) )
         cpu_relax();
=20
  out:
@@ -396,7 +398,7 @@ static void __smp_call_function_interrup
     void *info =3D call_data.info;
     unsigned int cpu =3D smp_processor_id();
=20
-    if ( !cpu_isset(cpu, call_data.selected) )
+    if ( !cpumask_test_cpu(cpu, &call_data.selected) )
         return;
=20
     irq_enter();
@@ -405,12 +407,12 @@ static void __smp_call_function_interrup
     {
         (*func)(info);
         mb();
-        cpu_clear(cpu, call_data.selected);
+        cpumask_clear_cpu(cpu, &call_data.selected);
     }
     else
     {
         mb();
-        cpu_clear(cpu, call_data.selected);
+        cpumask_clear_cpu(cpu, &call_data.selected);
         (*func)(info);
     }
=20
--- 2011-10-18.orig/xen/arch/x86/smpboot.c	2011-10-14 15:08:39.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/smpboot.c	2011-10-14 15:08:45.000000000 =
+0200
@@ -267,7 +267,8 @@ static void set_cpu_sibling_map(int cpu)
=20
     if ( c[cpu].x86_max_cores =3D=3D 1 )
     {
-        per_cpu(cpu_core_map, cpu) =3D per_cpu(cpu_sibling_map, cpu);
+        cpumask_copy(&per_cpu(cpu_core_map, cpu),
+                     &per_cpu(cpu_sibling_map, cpu));
         c[cpu].booted_cores =3D 1;
         return;
     }
--- 2011-10-18.orig/xen/arch/x86/time.c	2011-10-12 09:01:16.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/time.c	2011-10-13 15:35:04.000000000 =
+0200
@@ -1232,10 +1232,10 @@ static void tsc_check_slave(void *unused
 {
     unsigned int cpu =3D smp_processor_id();
     local_irq_disable();
-    while ( !cpu_isset(cpu, tsc_check_cpumask) )
+    while ( !cpumask_test_cpu(cpu, &tsc_check_cpumask) )
         mb();
     check_tsc_warp(cpu_khz, &tsc_max_warp);
-    cpu_clear(cpu, tsc_check_cpumask);
+    cpumask_clear_cpu(cpu, &tsc_check_cpumask);
     local_irq_enable();
 }
=20
@@ -1248,12 +1248,11 @@ static void tsc_check_reliability(void)
=20
     tsc_check_count++;
     smp_call_function(tsc_check_slave, NULL, 0);
-    tsc_check_cpumask =3D cpu_online_map;
+    cpumask_andnot(&tsc_check_cpumask, &cpu_online_map, cpumask_of(cpu));
     local_irq_disable();
     check_tsc_warp(cpu_khz, &tsc_max_warp);
-    cpu_clear(cpu, tsc_check_cpumask);
     local_irq_enable();
-    while ( !cpus_empty(tsc_check_cpumask) )
+    while ( !cpumask_empty(&tsc_check_cpumask) )
         cpu_relax();
=20
     spin_unlock(&lock);
@@ -1280,7 +1279,7 @@ static void time_calibration_tsc_rendezv
     int i;
     struct cpu_calibration *c =3D &this_cpu(cpu_calibration);
     struct calibration_rendezvous *r =3D _r;
-    unsigned int total_cpus =3D cpus_weight(r->cpu_calibration_map);
+    unsigned int total_cpus =3D cpumask_weight(&r->cpu_calibration_map);
=20
     /* Loop to get rid of cache effects on TSC skew. */
     for ( i =3D 4; i >=3D 0; i-- )
@@ -1331,7 +1330,7 @@ static void time_calibration_std_rendezv
 {
     struct cpu_calibration *c =3D &this_cpu(cpu_calibration);
     struct calibration_rendezvous *r =3D _r;
-    unsigned int total_cpus =3D cpus_weight(r->cpu_calibration_map);
+    unsigned int total_cpus =3D cpumask_weight(&r->cpu_calibration_map);
=20
     if ( smp_processor_id() =3D=3D 0 )
     {
@@ -1362,10 +1361,11 @@ static void (*time_calibration_rendezvou
 static void time_calibration(void *unused)
 {
     struct calibration_rendezvous r =3D {
-        .cpu_calibration_map =3D cpu_online_map,
         .semaphore =3D ATOMIC_INIT(0)
     };
=20
+    cpumask_copy(&r.cpu_calibration_map, &cpu_online_map);
+
     /* @wait=3D1 because we must wait for all cpus before freeing @r. */
     on_selected_cpus(&r.cpu_calibration_map,
                      time_calibration_rendezvous_fn,
--- 2011-10-18.orig/xen/common/keyhandler.c	2011-10-12 09:07:34.0000000=
00 +0200
+++ 2011-10-18/xen/common/keyhandler.c	2011-10-13 13:27:55.000000000 =
+0200
@@ -93,11 +93,11 @@ void dump_execstate(struct cpu_user_regs
         printk("\n");
     }
=20
-    cpu_clear(cpu, dump_execstate_mask);
+    cpumask_clear_cpu(cpu, &dump_execstate_mask);
     if ( !alt_key_handling )
         return;
=20
-    cpu =3D cycle_cpu(cpu, dump_execstate_mask);
+    cpu =3D cpumask_cycle(cpu, &dump_execstate_mask);
     if ( cpu < nr_cpu_ids )
     {
         smp_send_state_dump(cpu);
@@ -118,7 +118,7 @@ static void dump_registers(unsigned char
=20
     printk("'%c' pressed -> dumping registers\n\n", key);
=20
-    dump_execstate_mask =3D cpu_online_map;
+    cpumask_copy(&dump_execstate_mask, &cpu_online_map);
=20
     /* Get local execution state out immediately, in case we get stuck. =
*/
     dump_execstate(regs);
@@ -131,7 +131,7 @@ static void dump_registers(unsigned char
     for_each_cpu_mask ( cpu, dump_execstate_mask )
     {
         smp_send_state_dump(cpu);
-        while ( cpu_isset(cpu, dump_execstate_mask) )
+        while ( cpumask_test_cpu(cpu, &dump_execstate_mask) )
             cpu_relax();
     }
=20
@@ -324,11 +324,11 @@ static void read_clocks_slave(void *unus
 {
     unsigned int cpu =3D smp_processor_id();
     local_irq_disable();
-    while ( !cpu_isset(cpu, read_clocks_cpumask) )
+    while ( !cpumask_test_cpu(cpu, &read_clocks_cpumask) )
         cpu_relax();
     per_cpu(read_clocks_time, cpu) =3D NOW();
     per_cpu(read_cycles_time, cpu) =3D get_cycles();
-    cpu_clear(cpu, read_clocks_cpumask);
+    cpumask_clear_cpu(cpu, &read_clocks_cpumask);
     local_irq_enable();
 }
=20
@@ -348,13 +348,12 @@ static void read_clocks(unsigned char ke
     smp_call_function(read_clocks_slave, NULL, 0);
=20
     local_irq_disable();
-    read_clocks_cpumask =3D cpu_online_map;
+    cpumask_andnot(&read_clocks_cpumask, &cpu_online_map, cpumask_of(cpu))=
;
     per_cpu(read_clocks_time, cpu) =3D NOW();
     per_cpu(read_cycles_time, cpu) =3D get_cycles();
-    cpu_clear(cpu, read_clocks_cpumask);
     local_irq_enable();
=20
-    while ( !cpus_empty(read_clocks_cpumask) )
+    while ( !cpumask_empty(&read_clocks_cpumask) )
         cpu_relax();
=20
     min_stime_cpu =3D max_stime_cpu =3D min_cycles_cpu =3D max_cycles_cpu =
=3D cpu;
--- 2011-10-18.orig/xen/common/rcupdate.c	2011-10-14 09:47:53.0000000=
00 +0200
+++ 2011-10-18/xen/common/rcupdate.c	2011-10-14 09:48:13.000000000 =
+0200
@@ -161,8 +161,7 @@ static void force_quiescent_state(struct
          * Don't send IPI to itself. With irqs disabled,
          * rdp->cpu is the current cpu.
          */
-        cpumask =3D rcp->cpumask;
-        cpu_clear(rdp->cpu, cpumask);
+        cpumask_andnot(&cpumask, &rcp->cpumask, cpumask_of(rdp->cpu));
         cpumask_raise_softirq(&cpumask, SCHEDULE_SOFTIRQ);
     }
 }
@@ -258,7 +257,7 @@ static void rcu_start_batch(struct rcu_c
         smp_wmb();
         rcp->cur++;
=20
-        rcp->cpumask =3D cpu_online_map;
+        cpumask_copy(&rcp->cpumask, &cpu_online_map);
     }
 }
=20
@@ -269,8 +268,8 @@ static void rcu_start_batch(struct rcu_c
  */
 static void cpu_quiet(int cpu, struct rcu_ctrlblk *rcp)
 {
-    cpu_clear(cpu, rcp->cpumask);
-    if (cpus_empty(rcp->cpumask)) {
+    cpumask_clear_cpu(cpu, &rcp->cpumask);
+    if (cpumask_empty(&rcp->cpumask)) {
         /* batch completed ! */
         rcp->completed =3D rcp->cur;
         rcu_start_batch(rcp);
--- 2011-10-18.orig/xen/common/stop_machine.c	2011-10-19 17:27:19.0000000=
00 +0200
+++ 2011-10-18/xen/common/stop_machine.c	2011-10-13 11:52:55.0000000=
00 +0200
@@ -81,9 +81,9 @@ int stop_machine_run(int (*fn)(void *),=20
     if ( !get_cpu_maps() )
         return -EBUSY;
=20
-    allbutself =3D cpu_online_map;
-    cpu_clear(smp_processor_id(), allbutself);
-    nr_cpus =3D cpus_weight(allbutself);
+    cpumask_andnot(&allbutself, &cpu_online_map,
+                   cpumask_of(smp_processor_id()));
+    nr_cpus =3D cpumask_weight(&allbutself);
=20
     /* Must not spin here as the holder will expect us to be descheduled. =
*/
     if ( !spin_trylock(&stopmachine_lock) )
--- 2011-10-18.orig/xen/include/xen/cpumask.h	2011-10-19 17:29:46.0000000=
00 +0200
+++ 2011-10-18/xen/include/xen/cpumask.h	2011-10-19 17:30:16.0000000=
00 +0200
@@ -359,11 +359,14 @@ typedef cpumask_t *cpumask_var_t;
=20
 static inline bool_t alloc_cpumask_var(cpumask_var_t *mask)
 {
-	/*
-	 * Once all direct cpumask assignments are gone, we could use
-	 * nr_cpumask_bits to determine the allocation size here.
-	 */
-	return (*mask =3D xmalloc(cpumask_t)) !=3D NULL;
+	*(void **)mask =3D _xmalloc(nr_cpumask_bits / 8, sizeof(long));
+	return *mask !=3D NULL;
+}
+
+static inline bool_t zalloc_cpumask_var(cpumask_var_t *mask)
+{
+	*(void **)mask =3D _xzalloc(nr_cpumask_bits / 8, sizeof(long));
+	return *mask !=3D NULL;
 }
=20
 static inline void free_cpumask_var(cpumask_var_t mask)
@@ -378,19 +381,17 @@ static inline bool_t alloc_cpumask_var(c
 	return 1;
 }
=20
-static inline void free_cpumask_var(cpumask_var_t mask)
-{
-}
-#endif
-
 static inline bool_t zalloc_cpumask_var(cpumask_var_t *mask)
 {
-	if (!alloc_cpumask_var(mask))
-		return 0;
 	cpumask_clear(*mask);
 	return 1;
 }
=20
+static inline void free_cpumask_var(cpumask_var_t mask)
+{
+}
+#endif
+
 #if NR_CPUS > 1
 #define for_each_cpu_mask(cpu, mask)		\
 	for ((cpu) =3D first_cpu(mask);		\
--- 2011-10-18.orig/xen/include/xen/irq.h	2011-10-19 17:27:19.0000000=
00 +0200
+++ 2011-10-18/xen/include/xen/irq.h	2011-10-18 13:37:04.000000000 =
+0200
@@ -153,7 +153,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)
 {
-    irq_desc[irq].affinity =3D *mask;
+    cpumask_copy(&irq_desc[irq].affinity, mask);
 }
=20
 unsigned int set_desc_affinity(struct irq_desc *, const cpumask_t *);



--=__PartFCD31F5E.0__=
Content-Type: text/plain; name="cpumask-copy.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="cpumask-copy.patch"

eliminate direct assignments of CPU masks=0A=0AUse cpumask_copy() instead =
of direct variable assignments for copying=0ACPU masks. While direct =
assignments are not a problem when both sides=0Aare variables actually =
defined as cpumask_t (except for possibly=0Acopying *much* more than would =
actually need to be copied), they must=0Anot happen when the original =
variable is of type cpumask_var_t (which=0Amay have lass space allocated =
to it than a full cpumask_t). Eliminate=0Aas many of such assignments as =
possible (in several cases it's even=0Apossible to collapse two operations =
[copy then clear one bit] into one=0A[cpumask_andnot()]), and thus set the =
way for reducing the allocation=0Asize in alloc_cpumask_var().=0A=0ASigned-=
off-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- 2011-10-18.orig/xen/arch/x=
86/acpi/cpufreq/powernow.c	2011-10-19 17:27:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/acpi/cpufreq/powernow.c	2011-10-14 09:48:25.0000000=
00 +0200=0A@@ -107,7 +107,7 @@ static int powernow_cpufreq_target(struc=0A =
    if (unlikely(result))=0A         return -ENODEV;=0A =0A-    online_poli=
cy_cpus =3D policy->cpus;=0A+    cpumask_and(&online_policy_cpus, =
&policy->cpus, &cpu_online_map);=0A =0A     next_perf_state =3D data->freq_=
table[next_state].index;=0A     if (perf->state =3D=3D next_perf_state) =
{=0A--- 2011-10-18.orig/xen/arch/x86/cpu/mtrr/main.c	2011-10-19 =
17:27:19.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/cpu/mtrr/main.c	=
2011-10-13 15:43:53.000000000 +0200=0A@@ -231,9 +231,9 @@ static void =
set_mtrr(unsigned int reg, u=0A 	struct set_mtrr_data data;=0A 	=
unsigned long flags;=0A =0A-	allbutself =3D cpu_online_map;=0A-	=
cpu_clear(smp_processor_id(), allbutself);=0A-	nr_cpus =3D cpus_weight(all=
butself);=0A+	cpumask_andnot(&allbutself, &cpu_online_map,=0A+           =
            cpumask_of(smp_processor_id()));=0A+	nr_cpus =3D =
cpumask_weight(&allbutself);=0A =0A 	data.smp_reg =3D reg;=0A 	=
data.smp_base =3D base;=0A--- 2011-10-18.orig/xen/arch/x86/irq.c	=
2011-10-18 13:32:30.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/irq.c	=
2011-10-18 13:36:58.000000000 +0200=0A@@ -1040,7 +1040,7 @@ static void =
irq_guest_eoi_timer_fn(void =0A             desc->handler->end(desc, =
0);=0A         break;=0A     case ACKTYPE_EOI:=0A-        cpu_eoi_map =3D =
action->cpu_eoi_map;=0A+        cpumask_copy(&cpu_eoi_map, &action->cpu_eoi=
_map);=0A         spin_unlock_irq(&desc->lock);=0A         on_selected_cpus=
(&cpu_eoi_map, set_eoi_ready, desc, 0);=0A         spin_lock_irq(&desc->loc=
k);=0A@@ -1366,9 +1366,9 @@ void desc_guest_eoi(struct irq_desc *des=0A =
=0A     ASSERT(action->ack_type =3D=3D ACKTYPE_EOI);=0A         =0A-    =
cpu_eoi_map =3D action->cpu_eoi_map;=0A+    cpumask_copy(&cpu_eoi_map, =
&action->cpu_eoi_map);=0A =0A-    if ( cpu_test_and_clear(smp_processor_id(=
), cpu_eoi_map) )=0A+    if ( cpumask_test_and_clear_cpu(smp_processor_id()=
, &cpu_eoi_map) )=0A     {=0A         __set_eoi_ready(desc);=0A         =
spin_unlock(&desc->lock);=0A@@ -1380,7 +1380,7 @@ void desc_guest_eoi(struc=
t irq_desc *des=0A         spin_unlock_irq(&desc->lock);=0A     }=0A =0A-  =
  if ( !cpus_empty(cpu_eoi_map) )=0A+    if ( !cpumask_empty(&cpu_eoi_map) =
)=0A         on_selected_cpus(&cpu_eoi_map, set_eoi_ready, desc, 0);=0A =
}=0A =0A@@ -1619,7 +1619,7 @@ static irq_guest_action_t *__pirq_guest_=0A  =
            (--action->in_flight =3D=3D 0) &&=0A              (action->nr_g=
uests !=3D 0) )=0A         {=0A-            cpu_eoi_map =3D action->cpu_eoi=
_map;=0A+            cpumask_copy(&cpu_eoi_map, &action->cpu_eoi_map);=0A  =
           spin_unlock_irq(&desc->lock);=0A             on_selected_cpus(&c=
pu_eoi_map, set_eoi_ready, desc, 0);=0A             spin_lock_irq(&desc->lo=
ck);=0A@@ -1649,8 +1649,8 @@ static irq_guest_action_t *__pirq_guest_=0A   =
   * would need to flush all ready EOIs before returning as otherwise =
the=0A      * desc->handler could change and we would call the wrong 'end' =
hook.=0A      */=0A-    cpu_eoi_map =3D action->cpu_eoi_map;=0A-    if ( =
!cpus_empty(cpu_eoi_map) )=0A+    cpumask_copy(&cpu_eoi_map, &action->cpu_e=
oi_map);=0A+    if ( !cpumask_empty(&cpu_eoi_map) )=0A     {=0A         =
BUG_ON(action->ack_type !=3D ACKTYPE_EOI);=0A         spin_unlock_irq(&desc=
->lock);=0A--- 2011-10-18.orig/xen/arch/x86/numa.c	2011-09-21 =
16:44:01.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/numa.c	2011-10-13 =
16:32:49.000000000 +0200=0A@@ -282,7 +282,7 @@ void __init numa_initmem_ini=
t(unsigned l=0A 	node_set_online(0);=0A 	for (i =3D 0; i < =
nr_cpu_ids; i++)=0A 		numa_set_node(i, 0);=0A-	node_to_cpu=
mask[0] =3D cpumask_of_cpu(0);=0A+	cpumask_copy(&node_to_cpumask[0], =
cpumask_of(0));=0A 	setup_node_bootmem(0, (u64)start_pfn << PAGE_SHIFT,=
 (u64)end_pfn << PAGE_SHIFT);=0A }=0A =0A--- 2011-10-18.orig/xen/arch/x86/s=
mp.c	2011-10-12 08:33:44.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/s=
mp.c	2011-10-13 16:37:53.000000000 +0200=0A@@ -257,8 +257,8 @@ void =
new_tlbflush_clock_period(void)=0A     cpumask_t allbutself;=0A =0A     /* =
Flush everyone else. We definitely flushed just before entry. */=0A-    =
allbutself =3D cpu_online_map;=0A-    cpu_clear(smp_processor_id(), =
allbutself);=0A+    cpumask_andnot(&allbutself, &cpu_online_map,=0A+       =
            cpumask_of(smp_processor_id()));=0A     flush_mask(&allbutself,=
 FLUSH_TLB);=0A =0A     /* No need for atomicity: we are the only possible =
updater. */=0A@@ -289,8 +289,10 @@ void smp_call_function(=0A     void =
*info,=0A     int wait)=0A {=0A-    cpumask_t allbutself =3D cpu_online_map=
;=0A-    cpu_clear(smp_processor_id(), allbutself);=0A+    cpumask_t =
allbutself;=0A+=0A+    cpumask_andnot(&allbutself, &cpu_online_map,=0A+    =
               cpumask_of(smp_processor_id()));=0A     on_selected_cpus(&al=
lbutself, func, info, wait);=0A }=0A =0A@@ -306,9 +308,9 @@ void on_selecte=
d_cpus(=0A =0A     spin_lock(&call_lock);=0A =0A-    call_data.selected =
=3D *selected;=0A+    cpumask_copy(&call_data.selected, selected);=0A =0A- =
   nr_cpus =3D cpus_weight(call_data.selected);=0A+    nr_cpus =3D =
cpumask_weight(&call_data.selected);=0A     if ( nr_cpus =3D=3D 0 )=0A     =
    goto out;=0A =0A@@ -318,14 +320,14 @@ void on_selected_cpus(=0A =0A    =
 send_IPI_mask(&call_data.selected, CALL_FUNCTION_VECTOR);=0A =0A-    if ( =
cpu_isset(smp_processor_id(), call_data.selected) )=0A+    if ( cpumask_tes=
t_cpu(smp_processor_id(), &call_data.selected) )=0A     {=0A         =
local_irq_disable();=0A         __smp_call_function_interrupt();=0A        =
 local_irq_enable();=0A     }=0A =0A-    while ( !cpus_empty(call_data.sele=
cted) )=0A+    while ( !cpumask_empty(&call_data.selected) )=0A         =
cpu_relax();=0A =0A  out:=0A@@ -396,7 +398,7 @@ static void __smp_call_func=
tion_interrup=0A     void *info =3D call_data.info;=0A     unsigned int =
cpu =3D smp_processor_id();=0A =0A-    if ( !cpu_isset(cpu, call_data.selec=
ted) )=0A+    if ( !cpumask_test_cpu(cpu, &call_data.selected) )=0A        =
 return;=0A =0A     irq_enter();=0A@@ -405,12 +407,12 @@ static void =
__smp_call_function_interrup=0A     {=0A         (*func)(info);=0A         =
mb();=0A-        cpu_clear(cpu, call_data.selected);=0A+        cpumask_cle=
ar_cpu(cpu, &call_data.selected);=0A     }=0A     else=0A     {=0A         =
mb();=0A-        cpu_clear(cpu, call_data.selected);=0A+        cpumask_cle=
ar_cpu(cpu, &call_data.selected);=0A         (*func)(info);=0A     }=0A =
=0A--- 2011-10-18.orig/xen/arch/x86/smpboot.c	2011-10-14 15:08:39.0000000=
00 +0200=0A+++ 2011-10-18/xen/arch/x86/smpboot.c	2011-10-14 =
15:08:45.000000000 +0200=0A@@ -267,7 +267,8 @@ static void set_cpu_sibling_=
map(int cpu)=0A =0A     if ( c[cpu].x86_max_cores =3D=3D 1 )=0A     {=0A-  =
      per_cpu(cpu_core_map, cpu) =3D per_cpu(cpu_sibling_map, cpu);=0A+    =
    cpumask_copy(&per_cpu(cpu_core_map, cpu),=0A+                     =
&per_cpu(cpu_sibling_map, cpu));=0A         c[cpu].booted_cores =3D 1;=0A  =
       return;=0A     }=0A--- 2011-10-18.orig/xen/arch/x86/time.c	=
2011-10-12 09:01:16.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/time.c	=
2011-10-13 15:35:04.000000000 +0200=0A@@ -1232,10 +1232,10 @@ static void =
tsc_check_slave(void *unused=0A {=0A     unsigned int cpu =3D smp_processor=
_id();=0A     local_irq_disable();=0A-    while ( !cpu_isset(cpu, =
tsc_check_cpumask) )=0A+    while ( !cpumask_test_cpu(cpu, &tsc_check_cpuma=
sk) )=0A         mb();=0A     check_tsc_warp(cpu_khz, &tsc_max_warp);=0A-  =
  cpu_clear(cpu, tsc_check_cpumask);=0A+    cpumask_clear_cpu(cpu, =
&tsc_check_cpumask);=0A     local_irq_enable();=0A }=0A =0A@@ -1248,12 =
+1248,11 @@ static void tsc_check_reliability(void)=0A =0A     tsc_check_co=
unt++;=0A     smp_call_function(tsc_check_slave, NULL, 0);=0A-    =
tsc_check_cpumask =3D cpu_online_map;=0A+    cpumask_andnot(&tsc_check_cpum=
ask, &cpu_online_map, cpumask_of(cpu));=0A     local_irq_disable();=0A     =
check_tsc_warp(cpu_khz, &tsc_max_warp);=0A-    cpu_clear(cpu, tsc_check_cpu=
mask);=0A     local_irq_enable();=0A-    while ( !cpus_empty(tsc_check_cpum=
ask) )=0A+    while ( !cpumask_empty(&tsc_check_cpumask) )=0A         =
cpu_relax();=0A =0A     spin_unlock(&lock);=0A@@ -1280,7 +1279,7 @@ static =
void time_calibration_tsc_rendezv=0A     int i;=0A     struct cpu_calibrati=
on *c =3D &this_cpu(cpu_calibration);=0A     struct calibration_rendezvous =
*r =3D _r;=0A-    unsigned int total_cpus =3D cpus_weight(r->cpu_calibratio=
n_map);=0A+    unsigned int total_cpus =3D cpumask_weight(&r->cpu_calibrati=
on_map);=0A =0A     /* Loop to get rid of cache effects on TSC skew. */=0A =
    for ( i =3D 4; i >=3D 0; i-- )=0A@@ -1331,7 +1330,7 @@ static void =
time_calibration_std_rendezv=0A {=0A     struct cpu_calibration *c =3D =
&this_cpu(cpu_calibration);=0A     struct calibration_rendezvous *r =3D =
_r;=0A-    unsigned int total_cpus =3D cpus_weight(r->cpu_calibration_map);=
=0A+    unsigned int total_cpus =3D cpumask_weight(&r->cpu_calibration_map)=
;=0A =0A     if ( smp_processor_id() =3D=3D 0 )=0A     {=0A@@ -1362,10 =
+1361,11 @@ static void (*time_calibration_rendezvou=0A static void =
time_calibration(void *unused)=0A {=0A     struct calibration_rendezvous r =
=3D {=0A-        .cpu_calibration_map =3D cpu_online_map,=0A         =
.semaphore =3D ATOMIC_INIT(0)=0A     };=0A =0A+    cpumask_copy(&r.cpu_cali=
bration_map, &cpu_online_map);=0A+=0A     /* @wait=3D1 because we must =
wait for all cpus before freeing @r. */=0A     on_selected_cpus(&r.cpu_cali=
bration_map,=0A                      time_calibration_rendezvous_fn,=0A--- =
2011-10-18.orig/xen/common/keyhandler.c	2011-10-12 09:07:34.000000000 =
+0200=0A+++ 2011-10-18/xen/common/keyhandler.c	2011-10-13 13:27:55.0000000=
00 +0200=0A@@ -93,11 +93,11 @@ void dump_execstate(struct cpu_user_regs=0A =
        printk("\n");=0A     }=0A =0A-    cpu_clear(cpu, dump_execstate_mas=
k);=0A+    cpumask_clear_cpu(cpu, &dump_execstate_mask);=0A     if ( =
!alt_key_handling )=0A         return;=0A =0A-    cpu =3D cycle_cpu(cpu, =
dump_execstate_mask);=0A+    cpu =3D cpumask_cycle(cpu, &dump_execstate_mas=
k);=0A     if ( cpu < nr_cpu_ids )=0A     {=0A         smp_send_state_dump(=
cpu);=0A@@ -118,7 +118,7 @@ static void dump_registers(unsigned char=0A =
=0A     printk("'%c' pressed -> dumping registers\n\n", key);=0A =0A-    =
dump_execstate_mask =3D cpu_online_map;=0A+    cpumask_copy(&dump_execstate=
_mask, &cpu_online_map);=0A =0A     /* Get local execution state out =
immediately, in case we get stuck. */=0A     dump_execstate(regs);=0A@@ =
-131,7 +131,7 @@ static void dump_registers(unsigned char=0A     for_each_c=
pu_mask ( cpu, dump_execstate_mask )=0A     {=0A         smp_send_state_dum=
p(cpu);=0A-        while ( cpu_isset(cpu, dump_execstate_mask) )=0A+       =
 while ( cpumask_test_cpu(cpu, &dump_execstate_mask) )=0A             =
cpu_relax();=0A     }=0A =0A@@ -324,11 +324,11 @@ static void read_clocks_s=
lave(void *unus=0A {=0A     unsigned int cpu =3D smp_processor_id();=0A    =
 local_irq_disable();=0A-    while ( !cpu_isset(cpu, read_clocks_cpumask) =
)=0A+    while ( !cpumask_test_cpu(cpu, &read_clocks_cpumask) )=0A         =
cpu_relax();=0A     per_cpu(read_clocks_time, cpu) =3D NOW();=0A     =
per_cpu(read_cycles_time, cpu) =3D get_cycles();=0A-    cpu_clear(cpu, =
read_clocks_cpumask);=0A+    cpumask_clear_cpu(cpu, &read_clocks_cpumask);=
=0A     local_irq_enable();=0A }=0A =0A@@ -348,13 +348,12 @@ static void =
read_clocks(unsigned char ke=0A     smp_call_function(read_clocks_slave, =
NULL, 0);=0A =0A     local_irq_disable();=0A-    read_clocks_cpumask =3D =
cpu_online_map;=0A+    cpumask_andnot(&read_clocks_cpumask, &cpu_online_map=
, cpumask_of(cpu));=0A     per_cpu(read_clocks_time, cpu) =3D NOW();=0A    =
 per_cpu(read_cycles_time, cpu) =3D get_cycles();=0A-    cpu_clear(cpu, =
read_clocks_cpumask);=0A     local_irq_enable();=0A =0A-    while ( =
!cpus_empty(read_clocks_cpumask) )=0A+    while ( !cpumask_empty(&read_cloc=
ks_cpumask) )=0A         cpu_relax();=0A =0A     min_stime_cpu =3D =
max_stime_cpu =3D min_cycles_cpu =3D max_cycles_cpu =3D cpu;=0A--- =
2011-10-18.orig/xen/common/rcupdate.c	2011-10-14 09:47:53.000000000 =
+0200=0A+++ 2011-10-18/xen/common/rcupdate.c	2011-10-14 09:48:13.0000000=
00 +0200=0A@@ -161,8 +161,7 @@ static void force_quiescent_state(struct=0A =
         * Don't send IPI to itself. With irqs disabled,=0A          * =
rdp->cpu is the current cpu.=0A          */=0A-        cpumask =3D =
rcp->cpumask;=0A-        cpu_clear(rdp->cpu, cpumask);=0A+        =
cpumask_andnot(&cpumask, &rcp->cpumask, cpumask_of(rdp->cpu));=0A         =
cpumask_raise_softirq(&cpumask, SCHEDULE_SOFTIRQ);=0A     }=0A }=0A@@ =
-258,7 +257,7 @@ static void rcu_start_batch(struct rcu_c=0A         =
smp_wmb();=0A         rcp->cur++;=0A =0A-        rcp->cpumask =3D =
cpu_online_map;=0A+        cpumask_copy(&rcp->cpumask, &cpu_online_map);=0A=
     }=0A }=0A =0A@@ -269,8 +268,8 @@ static void rcu_start_batch(struct =
rcu_c=0A  */=0A static void cpu_quiet(int cpu, struct rcu_ctrlblk *rcp)=0A =
{=0A-    cpu_clear(cpu, rcp->cpumask);=0A-    if (cpus_empty(rcp->cpumask))=
 {=0A+    cpumask_clear_cpu(cpu, &rcp->cpumask);=0A+    if (cpumask_empty(&=
rcp->cpumask)) {=0A         /* batch completed ! */=0A         rcp->complet=
ed =3D rcp->cur;=0A         rcu_start_batch(rcp);=0A--- 2011-10-18.orig/xen=
/common/stop_machine.c	2011-10-19 17:27:19.000000000 +0200=0A+++ =
2011-10-18/xen/common/stop_machine.c	2011-10-13 11:52:55.000000000 =
+0200=0A@@ -81,9 +81,9 @@ int stop_machine_run(int (*fn)(void *), =0A     =
if ( !get_cpu_maps() )=0A         return -EBUSY;=0A =0A-    allbutself =3D =
cpu_online_map;=0A-    cpu_clear(smp_processor_id(), allbutself);=0A-    =
nr_cpus =3D cpus_weight(allbutself);=0A+    cpumask_andnot(&allbutself, =
&cpu_online_map,=0A+                   cpumask_of(smp_processor_id()));=0A+=
    nr_cpus =3D cpumask_weight(&allbutself);=0A =0A     /* Must not spin =
here as the holder will expect us to be descheduled. */=0A     if ( =
!spin_trylock(&stopmachine_lock) )=0A--- 2011-10-18.orig/xen/include/xen/cp=
umask.h	2011-10-19 17:29:46.000000000 +0200=0A+++ 2011-10-18/xen/include/xe=
n/cpumask.h	2011-10-19 17:30:16.000000000 +0200=0A@@ -359,11 +359,14 =
@@ typedef cpumask_t *cpumask_var_t;=0A =0A static inline bool_t alloc_cpum=
ask_var(cpumask_var_t *mask)=0A {=0A-	/*=0A-	 * Once all direct cpumask =
assignments are gone, we could use=0A-	 * nr_cpumask_bits to determine =
the allocation size here.=0A-	 */=0A-	return (*mask =3D xmalloc(cpumask_t=
)) !=3D NULL;=0A+	*(void **)mask =3D _xmalloc(nr_cpumask_bits / 8, =
sizeof(long));=0A+	return *mask !=3D NULL;=0A+}=0A+=0A+static inline =
bool_t zalloc_cpumask_var(cpumask_var_t *mask)=0A+{=0A+	*(void **)mask =3D =
_xzalloc(nr_cpumask_bits / 8, sizeof(long));=0A+	return *mask !=3D =
NULL;=0A }=0A =0A static inline void free_cpumask_var(cpumask_var_t =
mask)=0A@@ -378,19 +381,17 @@ static inline bool_t alloc_cpumask_var(c=0A 	=
return 1;=0A }=0A =0A-static inline void free_cpumask_var(cpumask_var_t =
mask)=0A-{=0A-}=0A-#endif=0A-=0A static inline bool_t zalloc_cpumask_var(cp=
umask_var_t *mask)=0A {=0A-	if (!alloc_cpumask_var(mask))=0A-		=
return 0;=0A 	cpumask_clear(*mask);=0A 	return 1;=0A }=0A =
=0A+static inline void free_cpumask_var(cpumask_var_t mask)=0A+{=0A+}=0A+#e=
ndif=0A+=0A #if NR_CPUS > 1=0A #define for_each_cpu_mask(cpu, mask)		=
\=0A 	for ((cpu) =3D first_cpu(mask);		\=0A--- 2011-10-18.orig/xen=
/include/xen/irq.h	2011-10-19 17:27:19.000000000 +0200=0A+++ =
2011-10-18/xen/include/xen/irq.h	2011-10-18 13:37:04.000000000 =
+0200=0A@@ -153,7 +153,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-    irq_desc[irq].affinity =3D *mask;=0A+    =
cpumask_copy(&irq_desc[irq].affinity, mask);=0A }=0A =0A unsigned int =
set_desc_affinity(struct irq_desc *, const cpumask_t *);=0A
--=__PartFCD31F5E.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

--=__PartFCD31F5E.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:43:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:43:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGsu2-0007SQ-59; Thu, 20 Oct 2011 06:43:22 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGspt-00067b-0a
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:39:05 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1319117941!36053896!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28306 invoked from network); 20 Oct 2011 13:39:01 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 13:39:01 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:39:02 +0100
Message-Id: <4EA04093020000780005C7B2@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:38:59 +0100
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="=__PartC1EE2263.0__="
Subject: [Xen-devel] [PATCH 04/12] x86: allocate IRQ actions' cpu_eoi_map
	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.

--=__PartC1EE2263.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- 2011-10-18.orig/xen/arch/x86/irq.c	2011-10-18 13:36:58.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/irq.c	2011-10-18 13:40:56.000000000 =
+0200
@@ -966,7 +966,7 @@ typedef struct {
 #define ACKTYPE_NONE   0     /* No final acknowledgement is required */
 #define ACKTYPE_UNMASK 1     /* Unmask PIC hardware (from any CPU)   */
 #define ACKTYPE_EOI    2     /* EOI on the CPU that was interrupted  */
-    cpumask_t cpu_eoi_map;   /* CPUs that need to EOI this interrupt */
+    cpumask_var_t cpu_eoi_map; /* CPUs that need to EOI this interrupt */
     struct timer eoi_timer;
     struct domain *guest[IRQ_MAX_GUESTS];
 } irq_guest_action_t;
@@ -1040,7 +1040,7 @@ static void irq_guest_eoi_timer_fn(void=20
             desc->handler->end(desc, 0);
         break;
     case ACKTYPE_EOI:
-        cpumask_copy(&cpu_eoi_map, &action->cpu_eoi_map);
+        cpumask_copy(&cpu_eoi_map, action->cpu_eoi_map);
         spin_unlock_irq(&desc->lock);
         on_selected_cpus(&cpu_eoi_map, set_eoi_ready, desc, 0);
         spin_lock_irq(&desc->lock);
@@ -1079,7 +1079,7 @@ static void __do_IRQ_guest(int irq)
         peoi[sp].vector =3D vector;
         peoi[sp].ready =3D 0;
         pending_eoi_sp(peoi) =3D sp+1;
-        cpu_set(smp_processor_id(), action->cpu_eoi_map);
+        cpumask_set_cpu(smp_processor_id(), action->cpu_eoi_map);
     }
=20
     for ( i =3D 0; i < action->nr_guests; i++ )
@@ -1297,7 +1297,8 @@ static void __set_eoi_ready(struct irq_d
=20
     if ( !(desc->status & IRQ_GUEST) ||
          (action->in_flight !=3D 0) ||
-         !cpu_test_and_clear(smp_processor_id(), action->cpu_eoi_map) )
+         !cpumask_test_and_clear_cpu(smp_processor_id(),
+                                     action->cpu_eoi_map) )
         return;
=20
     sp =3D pending_eoi_sp(peoi);
@@ -1357,7 +1358,7 @@ void desc_guest_eoi(struct irq_desc *des
=20
     if ( action->ack_type =3D=3D ACKTYPE_UNMASK )
     {
-        ASSERT(cpus_empty(action->cpu_eoi_map));
+        ASSERT(cpumask_empty(action->cpu_eoi_map));
         if ( desc->handler->end )
             desc->handler->end(desc, 0);
         spin_unlock_irq(&desc->lock);
@@ -1366,7 +1367,7 @@ void desc_guest_eoi(struct irq_desc *des
=20
     ASSERT(action->ack_type =3D=3D ACKTYPE_EOI);
        =20
-    cpumask_copy(&cpu_eoi_map, &action->cpu_eoi_map);
+    cpumask_copy(&cpu_eoi_map, action->cpu_eoi_map);
=20
     if ( cpumask_test_and_clear_cpu(smp_processor_id(), &cpu_eoi_map) )
     {
@@ -1504,8 +1505,10 @@ int pirq_guest_bind(struct vcpu *v, stru
         if ( newaction =3D=3D NULL )
         {
             spin_unlock_irq(&desc->lock);
-            if ( (newaction =3D xmalloc(irq_guest_action_t)) !=3D NULL )
+            if ( (newaction =3D xmalloc(irq_guest_action_t)) !=3D NULL &&
+                 zalloc_cpumask_var(&newaction->cpu_eoi_map) )
                 goto retry;
+            xfree(newaction);
             gdprintk(XENLOG_INFO,
                      "Cannot bind IRQ %d to guest. Out of memory.\n",
                      pirq->pirq);
@@ -1521,7 +1524,6 @@ int pirq_guest_bind(struct vcpu *v, stru
         action->in_flight   =3D 0;
         action->shareable   =3D will_share;
         action->ack_type    =3D pirq_acktype(v->domain, pirq->pirq);
-        cpumask_clear(&action->cpu_eoi_map);
         init_timer(&action->eoi_timer, irq_guest_eoi_timer_fn, desc, 0);
=20
         desc->status |=3D IRQ_GUEST;
@@ -1574,7 +1576,10 @@ int pirq_guest_bind(struct vcpu *v, stru
     spin_unlock_irq(&desc->lock);
  out:
     if ( newaction !=3D NULL )
+    {
+        free_cpumask_var(newaction->cpu_eoi_map);
         xfree(newaction);
+    }
     return rc;
 }
=20
@@ -1619,7 +1624,7 @@ static irq_guest_action_t *__pirq_guest_
              (--action->in_flight =3D=3D 0) &&
              (action->nr_guests !=3D 0) )
         {
-            cpumask_copy(&cpu_eoi_map, &action->cpu_eoi_map);
+            cpumask_copy(&cpu_eoi_map, action->cpu_eoi_map);
             spin_unlock_irq(&desc->lock);
             on_selected_cpus(&cpu_eoi_map, set_eoi_ready, desc, 0);
             spin_lock_irq(&desc->lock);
@@ -1649,7 +1654,7 @@ static irq_guest_action_t *__pirq_guest_
      * would need to flush all ready EOIs before returning as otherwise =
the
      * desc->handler could change and we would call the wrong 'end' hook.
      */
-    cpumask_copy(&cpu_eoi_map, &action->cpu_eoi_map);
+    cpumask_copy(&cpu_eoi_map, action->cpu_eoi_map);
     if ( !cpumask_empty(&cpu_eoi_map) )
     {
         BUG_ON(action->ack_type !=3D ACKTYPE_EOI);
@@ -1658,7 +1663,7 @@ static irq_guest_action_t *__pirq_guest_
         spin_lock_irq(&desc->lock);
     }
=20
-    BUG_ON(!cpus_empty(action->cpu_eoi_map));
+    BUG_ON(!cpumask_empty(action->cpu_eoi_map));
=20
     desc->action =3D NULL;
     desc->status &=3D ~(IRQ_GUEST|IRQ_INPROGRESS);
@@ -1697,6 +1702,7 @@ void pirq_guest_unbind(struct domain *d,
     if ( oldaction !=3D NULL )
     {
         kill_timer(&oldaction->eoi_timer);
+        free_cpumask_var(oldaction->cpu_eoi_map);
         xfree(oldaction);
     }
     else if ( irq > 0 )
@@ -1740,6 +1746,7 @@ static int pirq_guest_force_unbind(struc
     if ( oldaction !=3D NULL )
     {
         kill_timer(&oldaction->eoi_timer);
+        free_cpumask_var(oldaction->cpu_eoi_map);
         xfree(oldaction);
     }
=20
@@ -2114,7 +2121,7 @@ void fixup_irqs(void)
         if ( !(desc->status & IRQ_GUEST) )
             continue;
         action =3D (irq_guest_action_t *)desc->action;
-        cpu_clear(smp_processor_id(), action->cpu_eoi_map);
+        cpumask_clear_cpu(smp_processor_id(), action->cpu_eoi_map);
     }
=20
     /* Flush the interrupt EOI stack. */



--=__PartC1EE2263.0__=
Content-Type: text/plain; name="x86-irqaction-eoi-map-alloc.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-irqaction-eoi-map-alloc.patch"

x86: allocate IRQ actions' cpu_eoi_map dynamically=0A=0ASigned-off-by: Jan =
Beulich <jbeulich@suse.com>=0A=0A--- 2011-10-18.orig/xen/arch/x86/irq.c	=
2011-10-18 13:36:58.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/irq.c	=
2011-10-18 13:40:56.000000000 +0200=0A@@ -966,7 +966,7 @@ typedef struct =
{=0A #define ACKTYPE_NONE   0     /* No final acknowledgement is required =
*/=0A #define ACKTYPE_UNMASK 1     /* Unmask PIC hardware (from any CPU)   =
*/=0A #define ACKTYPE_EOI    2     /* EOI on the CPU that was interrupted  =
*/=0A-    cpumask_t cpu_eoi_map;   /* CPUs that need to EOI this interrupt =
*/=0A+    cpumask_var_t cpu_eoi_map; /* CPUs that need to EOI this =
interrupt */=0A     struct timer eoi_timer;=0A     struct domain *guest[IRQ=
_MAX_GUESTS];=0A } irq_guest_action_t;=0A@@ -1040,7 +1040,7 @@ static void =
irq_guest_eoi_timer_fn(void =0A             desc->handler->end(desc, =
0);=0A         break;=0A     case ACKTYPE_EOI:=0A-        cpumask_copy(&cpu=
_eoi_map, &action->cpu_eoi_map);=0A+        cpumask_copy(&cpu_eoi_map, =
action->cpu_eoi_map);=0A         spin_unlock_irq(&desc->lock);=0A         =
on_selected_cpus(&cpu_eoi_map, set_eoi_ready, desc, 0);=0A         =
spin_lock_irq(&desc->lock);=0A@@ -1079,7 +1079,7 @@ static void __do_IRQ_gu=
est(int irq)=0A         peoi[sp].vector =3D vector;=0A         peoi[sp].rea=
dy =3D 0;=0A         pending_eoi_sp(peoi) =3D sp+1;=0A-        cpu_set(smp_=
processor_id(), action->cpu_eoi_map);=0A+        cpumask_set_cpu(smp_proces=
sor_id(), action->cpu_eoi_map);=0A     }=0A =0A     for ( i =3D 0; i < =
action->nr_guests; i++ )=0A@@ -1297,7 +1297,8 @@ static void __set_eoi_read=
y(struct irq_d=0A =0A     if ( !(desc->status & IRQ_GUEST) ||=0A          =
(action->in_flight !=3D 0) ||=0A-         !cpu_test_and_clear(smp_processor=
_id(), action->cpu_eoi_map) )=0A+         !cpumask_test_and_clear_cpu(smp_p=
rocessor_id(),=0A+                                     action->cpu_eoi_map)=
 )=0A         return;=0A =0A     sp =3D pending_eoi_sp(peoi);=0A@@ -1357,7 =
+1358,7 @@ void desc_guest_eoi(struct irq_desc *des=0A =0A     if ( =
action->ack_type =3D=3D ACKTYPE_UNMASK )=0A     {=0A-        ASSERT(cpus_em=
pty(action->cpu_eoi_map));=0A+        ASSERT(cpumask_empty(action->cpu_eoi_=
map));=0A         if ( desc->handler->end )=0A             desc->handler->e=
nd(desc, 0);=0A         spin_unlock_irq(&desc->lock);=0A@@ -1366,7 +1367,7 =
@@ void desc_guest_eoi(struct irq_desc *des=0A =0A     ASSERT(action->ack_t=
ype =3D=3D ACKTYPE_EOI);=0A         =0A-    cpumask_copy(&cpu_eoi_map, =
&action->cpu_eoi_map);=0A+    cpumask_copy(&cpu_eoi_map, action->cpu_eoi_ma=
p);=0A =0A     if ( cpumask_test_and_clear_cpu(smp_processor_id(), =
&cpu_eoi_map) )=0A     {=0A@@ -1504,8 +1505,10 @@ int pirq_guest_bind(struc=
t vcpu *v, stru=0A         if ( newaction =3D=3D NULL )=0A         {=0A    =
         spin_unlock_irq(&desc->lock);=0A-            if ( (newaction =3D =
xmalloc(irq_guest_action_t)) !=3D NULL )=0A+            if ( (newaction =
=3D xmalloc(irq_guest_action_t)) !=3D NULL &&=0A+                 =
zalloc_cpumask_var(&newaction->cpu_eoi_map) )=0A                 goto =
retry;=0A+            xfree(newaction);=0A             gdprintk(XENLOG_INFO=
,=0A                      "Cannot bind IRQ %d to guest. Out of memory.\n",=
=0A                      pirq->pirq);=0A@@ -1521,7 +1524,6 @@ int =
pirq_guest_bind(struct vcpu *v, stru=0A         action->in_flight   =3D =
0;=0A         action->shareable   =3D will_share;=0A         action->ack_ty=
pe    =3D pirq_acktype(v->domain, pirq->pirq);=0A-        cpumask_clear(&ac=
tion->cpu_eoi_map);=0A         init_timer(&action->eoi_timer, irq_guest_eoi=
_timer_fn, desc, 0);=0A =0A         desc->status |=3D IRQ_GUEST;=0A@@ =
-1574,7 +1576,10 @@ int pirq_guest_bind(struct vcpu *v, stru=0A     =
spin_unlock_irq(&desc->lock);=0A  out:=0A     if ( newaction !=3D NULL =
)=0A+    {=0A+        free_cpumask_var(newaction->cpu_eoi_map);=0A         =
xfree(newaction);=0A+    }=0A     return rc;=0A }=0A =0A@@ -1619,7 +1624,7 =
@@ static irq_guest_action_t *__pirq_guest_=0A              (--action->in_f=
light =3D=3D 0) &&=0A              (action->nr_guests !=3D 0) )=0A         =
{=0A-            cpumask_copy(&cpu_eoi_map, &action->cpu_eoi_map);=0A+     =
       cpumask_copy(&cpu_eoi_map, action->cpu_eoi_map);=0A             =
spin_unlock_irq(&desc->lock);=0A             on_selected_cpus(&cpu_eoi_map,=
 set_eoi_ready, desc, 0);=0A             spin_lock_irq(&desc->lock);=0A@@ =
-1649,7 +1654,7 @@ static irq_guest_action_t *__pirq_guest_=0A      * =
would need to flush all ready EOIs before returning as otherwise the=0A    =
  * desc->handler could change and we would call the wrong 'end' hook.=0A  =
    */=0A-    cpumask_copy(&cpu_eoi_map, &action->cpu_eoi_map);=0A+    =
cpumask_copy(&cpu_eoi_map, action->cpu_eoi_map);=0A     if ( !cpumask_empty=
(&cpu_eoi_map) )=0A     {=0A         BUG_ON(action->ack_type !=3D =
ACKTYPE_EOI);=0A@@ -1658,7 +1663,7 @@ static irq_guest_action_t *__pirq_gue=
st_=0A         spin_lock_irq(&desc->lock);=0A     }=0A =0A-    BUG_ON(!cpus=
_empty(action->cpu_eoi_map));=0A+    BUG_ON(!cpumask_empty(action->cpu_eoi_=
map));=0A =0A     desc->action =3D NULL;=0A     desc->status &=3D =
~(IRQ_GUEST|IRQ_INPROGRESS);=0A@@ -1697,6 +1702,7 @@ void pirq_guest_unbind=
(struct domain *d,=0A     if ( oldaction !=3D NULL )=0A     {=0A         =
kill_timer(&oldaction->eoi_timer);=0A+        free_cpumask_var(oldaction->c=
pu_eoi_map);=0A         xfree(oldaction);=0A     }=0A     else if ( irq > =
0 )=0A@@ -1740,6 +1746,7 @@ static int pirq_guest_force_unbind(struc=0A    =
 if ( oldaction !=3D NULL )=0A     {=0A         kill_timer(&oldaction->eoi_=
timer);=0A+        free_cpumask_var(oldaction->cpu_eoi_map);=0A         =
xfree(oldaction);=0A     }=0A =0A@@ -2114,7 +2121,7 @@ void fixup_irqs(void=
)=0A         if ( !(desc->status & IRQ_GUEST) )=0A             continue;=0A=
         action =3D (irq_guest_action_t *)desc->action;=0A-        =
cpu_clear(smp_processor_id(), action->cpu_eoi_map);=0A+        cpumask_clea=
r_cpu(smp_processor_id(), action->cpu_eoi_map);=0A     }=0A =0A     /* =
Flush the interrupt EOI stack. */=0A
--=__PartC1EE2263.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

--=__PartC1EE2263.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:45:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:45:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGsvv-0007qr-Nf; Thu, 20 Oct 2011 06:45:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGsqX-0006Ku-Gs
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:39:46 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319117981!36060438!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24343 invoked from network); 20 Oct 2011 13:39:42 -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; 20 Oct 2011 13:39:42 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:39:42 +0100
Message-Id: <4EA040BB020000780005C7B6@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:39:39 +0100
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="=__Part2906CA8B.0__="
Subject: [Xen-devel] [PATCH 05/12] allocate CPU sibling and core maps
	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.

--=__Part2906CA8B.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

... thus reducing the per-CPU data area size back to one page even when
building for large NR_CPUS.

At once eliminate the old __cpu{mask,list}_scnprintf() helpers.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- 2011-10-18.orig/xen/arch/ia64/linux-xen/setup.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/ia64/linux-xen/setup.c	2011-10-14 15:53:37.0000000=
00 +0200
@@ -577,8 +577,12 @@ late_setup_arch (char **cmdline_p)
=20
 	cpu_physical_id(0) =3D hard_smp_processor_id();
=20
-	cpu_set(0, per_cpu(cpu_sibling_map, 0));
-	cpu_set(0, per_cpu(cpu_core_map, 0));
+	if (!zalloc_cpumask_var(&per_cpu(cpu_sibling_mask, 0)) ||
+            !zalloc_cpumask_var(&per_cpu(cpu_core_mask, 0)))
+		panic("No memory for boot CPU sibling/core maps\n");
+
+	cpumask_set_cpu(0, per_cpu(cpu_sibling_mask, 0));
+	cpumask_set_cpu(0, per_cpu(cpu_core_mask, 0));
=20
 	check_for_logical_procs();
 	if (smp_num_cpucores > 1)
--- 2011-10-18.orig/xen/arch/ia64/linux-xen/smpboot.c	2011-10-11 =
17:00:51.000000000 +0200
+++ 2011-10-18/xen/arch/ia64/linux-xen/smpboot.c	2011-10-14 =
16:00:49.000000000 +0200
@@ -144,8 +144,8 @@ EXPORT_SYMBOL(cpu_online_map);
 cpumask_t cpu_possible_map;
 EXPORT_SYMBOL(cpu_possible_map);
=20
-DEFINE_PER_CPU_READ_MOSTLY(cpumask_t, cpu_core_map);
-DEFINE_PER_CPU_READ_MOSTLY(cpumask_t, cpu_sibling_map);
+DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_core_mask);
+DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_sibling_mask);
 int smp_num_siblings =3D 1;
 int smp_num_cpucores =3D 1;
=20
@@ -687,13 +687,13 @@ clear_cpu_sibling_map(int cpu)
 {
 	int i;
=20
-	for_each_cpu_mask(i, per_cpu(cpu_sibling_map, cpu))
-		cpumask_clear_cpu(cpu, &per_cpu(cpu_sibling_map, i));
-	for_each_cpu_mask(i, per_cpu(cpu_core_map, cpu))
-		cpumask_clear_cpu(cpu, &per_cpu(cpu_core_map, i));
+	for_each_cpu_mask(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))
+		cpumask_clear_cpu(cpu, per_cpu(cpu_core_mask, i));
=20
-	cpumask_clear(&per_cpu(cpu_sibling_map, cpu));
-	cpumask_clear(&per_cpu(cpu_core_map, cpu));
+	cpumask_clear(per_cpu(cpu_sibling_mask, cpu));
+	cpumask_clear(per_cpu(cpu_core_mask, cpu));
 }
=20
 static void
@@ -703,12 +703,12 @@ remove_siblinginfo(int cpu)
=20
 	if (cpu_data(cpu)->threads_per_core =3D=3D 1 &&
 	    cpu_data(cpu)->cores_per_socket =3D=3D 1) {
-		cpu_clear(cpu, per_cpu(cpu_core_map, cpu));
-		cpu_clear(cpu, per_cpu(cpu_sibling_map, cpu));
+		cpumask_clear_cpu(cpu, per_cpu(cpu_core_mask, cpu));
+		cpumask_clear_cpu(cpu, per_cpu(cpu_sibling_mask, cpu));
 		return;
 	}
=20
-	last =3D (cpus_weight(per_cpu(cpu_core_map, cpu)) =3D=3D 1);
+	last =3D (cpumask_weight(per_cpu(cpu_core_mask, cpu)) =3D=3D 1);
=20
 	/* remove it from all sibling map's */
 	clear_cpu_sibling_map(cpu);
@@ -794,11 +794,11 @@ set_cpu_sibling_map(int cpu)
=20
 	for_each_online_cpu(i) {
 		if ((cpu_data(cpu)->socket_id =3D=3D cpu_data(i)->socket_id=
)) {
-			cpu_set(i, per_cpu(cpu_core_map, cpu));
-			cpu_set(cpu, per_cpu(cpu_core_map, i));
+			cpumask_set_cpu(i, per_cpu(cpu_core_mask, cpu));
+			cpumask_set_cpu(cpu, per_cpu(cpu_core_mask, i));
 			if (cpu_data(cpu)->core_id =3D=3D cpu_data(i)->core=
_id) {
-				cpu_set(i, per_cpu(cpu_sibling_map, cpu));
-				cpu_set(cpu, per_cpu(cpu_sibling_map, i));
+				cpumask_set_cpu(i, per_cpu(cpu_sibling_mask=
, cpu));
+				cpumask_set_cpu(cpu, per_cpu(cpu_sibling_ma=
sk, i));
 			}
 		}
 	}
@@ -821,6 +821,14 @@ __cpu_up (unsigned int cpu)
 	if (cpu_isset(cpu, cpu_callin_map))
 		return -EINVAL;
=20
+	if (!per_cpu(cpu_sibling_mask, cpu) &&
+            !zalloc_cpumask_var(&per_cpu(cpu_sibling_mask, cpu)))
+		return -ENOMEM;
+
+	if (!per_cpu(cpu_core_mask, cpu) &&
+            !zalloc_cpumask_var(&per_cpu(cpu_core_mask, cpu)))
+		return -ENOMEM;
+
 	per_cpu(cpu_state, cpu) =3D CPU_UP_PREPARE;
 	/* Processor goes to start_secondary(), sets online flag */
 	ret =3D do_boot_cpu(sapicid, cpu);
@@ -829,8 +837,8 @@ __cpu_up (unsigned int cpu)
=20
 	if (cpu_data(cpu)->threads_per_core =3D=3D 1 &&
 	    cpu_data(cpu)->cores_per_socket =3D=3D 1) {
-		cpu_set(cpu, per_cpu(cpu_sibling_map, cpu));
-		cpu_set(cpu, per_cpu(cpu_core_map, cpu));
+		cpumask_set_cpu(cpu, per_cpu(cpu_sibling_mask, cpu));
+		cpumask_set_cpu(cpu, per_cpu(cpu_core_mask, cpu));
 		return 0;
 	}
=20
--- 2011-10-18.orig/xen/arch/ia64/xen/dom0_ops.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/ia64/xen/dom0_ops.c	2011-10-14 15:49:47.0000000=
00 +0200
@@ -594,9 +594,9 @@ long arch_do_sysctl(xen_sysctl_t *op, XE
         xen_sysctl_physinfo_t *pi =3D &op->u.physinfo;
=20
         memset(pi, 0, sizeof(*pi));
-        pi->threads_per_core =3D cpus_weight(per_cpu(cpu_sibling_map, =
0));
+        pi->threads_per_core =3D cpumask_weight(per_cpu(cpu_sibling_mask, =
0));
         pi->cores_per_socket =3D
-            cpus_weight(per_cpu(cpu_core_map, 0)) / pi->threads_per_core;
+            cpumask_weight(per_cpu(cpu_core_mask, 0)) / pi->threads_per_co=
re;
         pi->nr_nodes         =3D (u32)num_online_nodes();
         pi->nr_cpus          =3D (u32)num_online_cpus();
         pi->total_pages      =3D total_pages;=20
--- 2011-10-18.orig/xen/arch/ia64/xen/tlb_track.c	2011-10-11 =
16:58:01.000000000 +0200
+++ 2011-10-18/xen/arch/ia64/xen/tlb_track.c	2011-10-14 16:04:14.0000000=
00 +0200
@@ -504,7 +504,7 @@ __tlb_track_entry_printf(const char* fun
     char pcpumask_buf[NR_CPUS + 1];
     char vcpumask_buf[MAX_VIRT_CPUS + 1];
     cpumask_scnprintf(pcpumask_buf, sizeof(pcpumask_buf),
-                      entry->pcpu_dirty_mask);
+                      &entry->pcpu_dirty_mask);
     vcpumask_scnprintf(vcpumask_buf, sizeof(vcpumask_buf),
                        entry->vcpu_dirty_mask);
     printk("%s:%d\n"
--- 2011-10-18.orig/xen/arch/x86/cpu/mcheck/mce_intel.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/x86/cpu/mcheck/mce_intel.c	2011-10-18 =
13:41:52.000000000 +0200
@@ -867,7 +867,7 @@ static void intel_machine_check(struct c
         {
             char *ebufp, ebuf[96] =3D "MCE: Fatal error happened on CPUs =
";
             ebufp =3D ebuf + strlen(ebuf);
-            cpumask_scnprintf(ebufp, 95 - strlen(ebuf), mce_fatal_cpus);
+            cpumask_scnprintf(ebufp, 95 - strlen(ebuf), &mce_fatal_cpus);
             mc_panic(ebuf);
         }
         atomic_set(&found_error, 0);
--- 2011-10-18.orig/xen/arch/x86/irq.c	2011-10-18 13:40:56.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/irq.c	2011-10-18 13:41:41.000000000 =
+0200
@@ -1998,7 +1998,7 @@ static void dump_irqs(unsigned char key)
         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,
--- 2011-10-18.orig/xen/arch/x86/mm.c	2011-10-20 14:47:26.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/mm.c	2011-10-20 14:47:37.000000000 =
+0200
@@ -3201,7 +3201,7 @@ int do_mmuext_op(
                 cpumask_clear(&mask);
                 for_each_online_cpu(cpu)
                     if ( !cpumask_intersects(&mask,
-                                             &per_cpu(cpu_sibling_map, =
cpu)) )
+                                             per_cpu(cpu_sibling_mask, =
cpu)) )
                         cpumask_set_cpu(cpu, &mask);
                 flush_mask(&mask, FLUSH_CACHE);
             }
--- 2011-10-18.orig/xen/arch/x86/oprofile/op_model_p4.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/x86/oprofile/op_model_p4.c	2011-10-14 =
16:05:38.000000000 +0200
@@ -385,7 +385,7 @@ static unsigned int get_stagger(void)
 {
 #ifdef CONFIG_SMP
 	int cpu =3D smp_processor_id();
-	return (cpu !=3D first_cpu(per_cpu(cpu_sibling_map, cpu)));
+	return (cpu !=3D cpumask_first(per_cpu(cpu_sibling_mask, cpu)));
 #endif=09
 	return 0;
 }
--- 2011-10-18.orig/xen/arch/x86/smpboot.c	2011-10-14 15:08:45.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/smpboot.c	2011-10-14 16:05:11.000000000 =
+0200
@@ -51,9 +51,9 @@
 unsigned long __read_mostly trampoline_phys;
=20
 /* representing HT siblings of each logical CPU */
-DEFINE_PER_CPU_READ_MOSTLY(cpumask_t, cpu_sibling_map);
+DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_sibling_mask);
 /* representing HT and core siblings of each logical CPU */
-DEFINE_PER_CPU_READ_MOSTLY(cpumask_t, cpu_core_map);
+DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_core_mask);
=20
 cpumask_t cpu_online_map __read_mostly;
 EXPORT_SYMBOL(cpu_online_map);
@@ -233,10 +233,10 @@ static cpumask_t cpu_sibling_setup_map;
=20
 static void link_thread_siblings(int cpu1, int cpu2)
 {
-    cpu_set(cpu1, per_cpu(cpu_sibling_map, cpu2));
-    cpu_set(cpu2, per_cpu(cpu_sibling_map, cpu1));
-    cpu_set(cpu1, per_cpu(cpu_core_map, cpu2));
-    cpu_set(cpu2, per_cpu(cpu_core_map, cpu1));
+    cpumask_set_cpu(cpu1, per_cpu(cpu_sibling_mask, cpu2));
+    cpumask_set_cpu(cpu2, per_cpu(cpu_sibling_mask, cpu1));
+    cpumask_set_cpu(cpu1, per_cpu(cpu_core_mask, cpu2));
+    cpumask_set_cpu(cpu2, per_cpu(cpu_core_mask, cpu1));
 }
=20
 static void set_cpu_sibling_map(int cpu)
@@ -262,13 +262,13 @@ static void set_cpu_sibling_map(int cpu)
     }
     else
     {
-        cpu_set(cpu, per_cpu(cpu_sibling_map, cpu));
+        cpumask_set_cpu(cpu, per_cpu(cpu_sibling_mask, cpu));
     }
=20
     if ( c[cpu].x86_max_cores =3D=3D 1 )
     {
-        cpumask_copy(&per_cpu(cpu_core_map, cpu),
-                     &per_cpu(cpu_sibling_map, cpu));
+        cpumask_copy(per_cpu(cpu_core_mask, cpu),
+                     per_cpu(cpu_sibling_mask, cpu));
         c[cpu].booted_cores =3D 1;
         return;
     }
@@ -277,18 +277,18 @@ static void set_cpu_sibling_map(int cpu)
     {
         if ( c[cpu].phys_proc_id =3D=3D c[i].phys_proc_id )
         {
-            cpu_set(i, per_cpu(cpu_core_map, cpu));
-            cpu_set(cpu, per_cpu(cpu_core_map, i));
+            cpumask_set_cpu(i, per_cpu(cpu_core_mask, cpu));
+            cpumask_set_cpu(cpu, per_cpu(cpu_core_mask, i));
             /*
              *  Does this new cpu bringup a new core?
              */
-            if ( cpus_weight(per_cpu(cpu_sibling_map, cpu)) =3D=3D 1 )
+            if ( cpumask_weight(per_cpu(cpu_sibling_mask, cpu)) =3D=3D 1 =
)
             {
                 /*
                  * for each core in package, increment
                  * the booted_cores for this new cpu
                  */
-                if ( first_cpu(per_cpu(cpu_sibling_map, i)) =3D=3D i )
+                if ( cpumask_first(per_cpu(cpu_sibling_mask, i)) =3D=3D i =
)
                     c[cpu].booted_cores++;
                 /*
                  * increment the core count for all
@@ -641,13 +641,14 @@ static void cpu_smpboot_free(unsigned in
 {
     unsigned int order;
=20
+    free_cpumask_var(per_cpu(cpu_sibling_mask, cpu));
+    free_cpumask_var(per_cpu(cpu_core_mask, cpu));
+
     order =3D get_order_from_pages(NR_RESERVED_GDT_PAGES);
     free_xenheap_pages(per_cpu(gdt_table, cpu), order);
-    per_cpu(gdt_table, cpu) =3D NULL;
=20
 #ifdef __x86_64__
     free_xenheap_pages(per_cpu(compat_gdt_table, cpu), order);
-    per_cpu(compat_gdt_table, cpu) =3D NULL;
 #endif
=20
     order =3D get_order_from_bytes(IDT_ENTRIES * sizeof(idt_entry_t));
@@ -696,7 +697,9 @@ static int cpu_smpboot_alloc(unsigned in
         goto oom;
     memcpy(idt_tables[cpu], idt_table, IDT_ENTRIES * sizeof(idt_entry_t));=

=20
-    return 0;
+    if ( zalloc_cpumask_var(&per_cpu(cpu_sibling_mask, cpu)) &&
+         zalloc_cpumask_var(&per_cpu(cpu_core_mask, cpu)) )
+        return 0;
=20
  oom:
     cpu_smpboot_free(cpu);
@@ -744,6 +747,10 @@ void __init smp_prepare_cpus(unsigned in
=20
     stack_base[0] =3D stack_start.esp;
=20
+    if ( !zalloc_cpumask_var(&per_cpu(cpu_sibling_mask, 0)) ||
+         !zalloc_cpumask_var(&per_cpu(cpu_core_mask, 0)) )
+        panic("No memory for boot CPU sibling/core maps\n");
+
     set_cpu_sibling_map(0);
=20
     /*
@@ -760,8 +767,6 @@ void __init smp_prepare_cpus(unsigned in
             printk(KERN_NOTICE "Local APIC not detected."
                    " Using dummy APIC emulation.\n");
         map_cpu_to_logical_apicid();
-        cpu_set(0, per_cpu(cpu_sibling_map, 0));
-        cpu_set(0, per_cpu(cpu_core_map, 0));
         return;
     }
=20
@@ -792,13 +797,6 @@ void __init smp_prepare_cpus(unsigned in
     setup_local_APIC();
     map_cpu_to_logical_apicid();
=20
-    /*
-     * construct cpu_sibling_map, so that we can tell sibling CPUs
-     * efficiently.
-     */
-    cpu_set(0, per_cpu(cpu_sibling_map, 0));
-    cpu_set(0, per_cpu(cpu_core_map, 0));
-
     smpboot_setup_io_apic();
=20
     setup_boot_APIC_clock();
@@ -816,18 +814,18 @@ remove_siblinginfo(int cpu)
     int sibling;
     struct cpuinfo_x86 *c =3D cpu_data;
=20
-    for_each_cpu_mask ( sibling, per_cpu(cpu_core_map, cpu) )
+    for_each_cpu_mask ( sibling, *per_cpu(cpu_core_mask, cpu) )
     {
-        cpu_clear(cpu, per_cpu(cpu_core_map, sibling));
+        cpumask_clear_cpu(cpu, per_cpu(cpu_core_mask, sibling));
         /* Last thread sibling in this cpu core going down. */
-        if ( cpumask_weight(&per_cpu(cpu_sibling_map, cpu)) =3D=3D 1 )
+        if ( cpumask_weight(per_cpu(cpu_sibling_mask, cpu)) =3D=3D 1 )
             c[sibling].booted_cores--;
     }
   =20
-    for_each_cpu_mask(sibling, per_cpu(cpu_sibling_map, cpu))
-        cpumask_clear_cpu(cpu, &per_cpu(cpu_sibling_map, sibling));
-    cpumask_clear(&per_cpu(cpu_sibling_map, cpu));
-    cpumask_clear(&per_cpu(cpu_core_map, cpu));
+    for_each_cpu_mask(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));
     c[cpu].phys_proc_id =3D BAD_APICID;
     c[cpu].cpu_core_id =3D BAD_APICID;
     c[cpu].compute_unit_id =3D BAD_APICID;
--- 2011-10-18.orig/xen/arch/x86/sysctl.c	2011-09-21 16:44:47.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/sysctl.c	2011-10-14 15:48:20.000000000 =
+0200
@@ -76,9 +76,9 @@ long arch_do_sysctl(
=20
         memset(pi, 0, sizeof(*pi));
         pi->threads_per_core =3D
-            cpus_weight(per_cpu(cpu_sibling_map, 0));
+            cpumask_weight(per_cpu(cpu_sibling_mask, 0));
         pi->cores_per_socket =3D
-            cpus_weight(per_cpu(cpu_core_map, 0)) / pi->threads_per_core;
+            cpumask_weight(per_cpu(cpu_core_mask, 0)) / pi->threads_per_co=
re;
         pi->nr_cpus =3D num_online_cpus();
         pi->nr_nodes =3D num_online_nodes();
         pi->max_node_id =3D MAX_NUMNODES-1;
--- 2011-10-18.orig/xen/common/domctl.c	2011-10-18 13:32:43.000000000 =
+0200
+++ 2011-10-18/xen/common/domctl.c	2011-10-18 13:41:58.000000000 =
+0200
@@ -171,7 +171,7 @@ static unsigned int default_vcpu0_locati
      * If we're on a HT system, we only auto-allocate to a non-primary =
HT. We=20
      * favour high numbered CPUs in the event of a tie.
      */
-    cpumask_copy(&cpu_exclude_map, &per_cpu(cpu_sibling_map, 0));
+    cpumask_copy(&cpu_exclude_map, per_cpu(cpu_sibling_mask, 0));
     cpu =3D cpumask_first(&cpu_exclude_map);
     if ( cpumask_weight(&cpu_exclude_map) > 1 )
         cpu =3D cpumask_next(cpu, &cpu_exclude_map);
@@ -179,11 +179,11 @@ static unsigned int default_vcpu0_locati
     {
         if ( cpumask_test_cpu(i, &cpu_exclude_map) )
             continue;
-        if ( (i =3D=3D cpumask_first(&per_cpu(cpu_sibling_map, i))) &&
-             (cpumask_weight(&per_cpu(cpu_sibling_map, i)) > 1) )
+        if ( (i =3D=3D cpumask_first(per_cpu(cpu_sibling_mask, i))) &&
+             (cpumask_weight(per_cpu(cpu_sibling_mask, i)) > 1) )
             continue;
         cpumask_or(&cpu_exclude_map, &cpu_exclude_map,
-                   &per_cpu(cpu_sibling_map, i));
+                   per_cpu(cpu_sibling_mask, i));
         if ( !cnt || cnt[i] <=3D cnt[cpu] )
             cpu =3D i;
     }
--- 2011-10-18.orig/xen/common/keyhandler.c	2011-10-13 13:27:55.0000000=
00 +0200
+++ 2011-10-18/xen/common/keyhandler.c	2011-10-14 16:04:31.000000000 =
+0200
@@ -210,7 +210,7 @@ static struct keyhandler reboot_machine_
 static void cpuset_print(char *set, int size, const cpumask_t *mask)
 {
     *set++ =3D '{';
-    set +=3D cpulist_scnprintf(set, size-2, *mask);
+    set +=3D cpulist_scnprintf(set, size-2, mask);
     *set++ =3D '}';
     *set++ =3D '\0';
 }
--- 2011-10-18.orig/xen/common/sched_credit.c	2011-10-12 08:38:35.0000000=
00 +0200
+++ 2011-10-18/xen/common/sched_credit.c	2011-10-14 16:01:03.0000000=
00 +0200
@@ -502,23 +502,23 @@ _csched_cpu_pick(const struct scheduler=20
=20
         nxt =3D cpumask_cycle(cpu, &cpus);
=20
-        if ( cpumask_test_cpu(cpu, &per_cpu(cpu_core_map, nxt)) )
+        if ( cpumask_test_cpu(cpu, per_cpu(cpu_core_mask, nxt)) )
         {
             /* We're on the same socket, so check the busy-ness of =
threads.
              * Migrate if # of idlers is less at all */
-            ASSERT( cpumask_test_cpu(nxt, &per_cpu(cpu_core_map, cpu)) );
+            ASSERT( cpumask_test_cpu(nxt, per_cpu(cpu_core_mask, cpu)) );
             migrate_factor =3D 1;
-            cpumask_and(&cpu_idlers, &idlers, &per_cpu(cpu_sibling_map, =
cpu));
-            cpumask_and(&nxt_idlers, &idlers, &per_cpu(cpu_sibling_map, =
nxt));
+            cpumask_and(&cpu_idlers, &idlers, per_cpu(cpu_sibling_mask, =
cpu));
+            cpumask_and(&nxt_idlers, &idlers, per_cpu(cpu_sibling_mask, =
nxt));
         }
         else
         {
             /* We're on different sockets, so check the busy-ness of =
cores.
              * Migrate only if the other core is twice as idle */
-            ASSERT( !cpumask_test_cpu(nxt, &per_cpu(cpu_core_map, cpu)) =
);
+            ASSERT( !cpumask_test_cpu(nxt, per_cpu(cpu_core_mask, cpu)) =
);
             migrate_factor =3D 2;
-            cpumask_and(&cpu_idlers, &idlers, &per_cpu(cpu_core_map, =
cpu));
-            cpumask_and(&nxt_idlers, &idlers, &per_cpu(cpu_core_map, =
nxt));
+            cpumask_and(&cpu_idlers, &idlers, per_cpu(cpu_core_mask, =
cpu));
+            cpumask_and(&nxt_idlers, &idlers, per_cpu(cpu_core_mask, =
nxt));
         }
=20
         weight_cpu =3D cpumask_weight(&cpu_idlers);
@@ -531,7 +531,7 @@ _csched_cpu_pick(const struct scheduler=20
             cpumask_and(&nxt_idlers, &cpus, &nxt_idlers);
             spc =3D CSCHED_PCPU(nxt);
             cpu =3D cpumask_cycle(spc->idle_bias, &nxt_idlers);
-            cpumask_andnot(&cpus, &cpus, &per_cpu(cpu_sibling_map, cpu));
+            cpumask_andnot(&cpus, &cpus, per_cpu(cpu_sibling_mask, cpu));
         }
         else
         {
@@ -1419,9 +1419,9 @@ csched_dump_pcpu(const struct scheduler=20
     spc =3D CSCHED_PCPU(cpu);
     runq =3D &spc->runq;
=20
-    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_sibling_map, =
cpu));
+    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_sibling_mask, =
cpu));
     printk(" sort=3D%d, sibling=3D%s, ", spc->runq_sort_last, cpustr);
-    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_core_map, =
cpu));
+    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_core_mask, =
cpu));
     printk("core=3D%s\n", cpustr);
=20
     /* current VCPU */
@@ -1481,7 +1481,7 @@ csched_dump(const struct scheduler *ops)
            prv->ticks_per_tslice,
            vcpu_migration_delay);
=20
-    cpumask_scnprintf(idlers_buf, sizeof(idlers_buf), prv->idlers);
+    cpumask_scnprintf(idlers_buf, sizeof(idlers_buf), &prv->idlers);
     printk("idlers: %s\n", idlers_buf);
=20
     printk("active vcpus:\n");
--- 2011-10-18.orig/xen/common/sched_credit2.c	2011-10-11 18:03:39.0000000=
00 +0200
+++ 2011-10-18/xen/common/sched_credit2.c	2011-10-14 15:46:58.0000000=
00 +0200
@@ -1767,9 +1767,9 @@ csched_dump_pcpu(const struct scheduler=20
=20
     runq =3D &RQD(ops, cpu)->runq;
=20
-    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_sibling_map,cpu)=
);
+    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_sibling_mask, =
cpu));
     printk(" sibling=3D%s, ", cpustr);
-    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_core_map,cpu));
+    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_core_mask, =
cpu));
     printk("core=3D%s\n", cpustr);
=20
     /* current VCPU */
--- 2011-10-18.orig/xen/include/asm-ia64/linux-xen/asm/smp.h	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/include/asm-ia64/linux-xen/asm/smp.h	2011-10-14 =
15:43:35.000000000 +0200
@@ -62,8 +62,8 @@ extern char no_int_routing __devinitdata
 extern cpumask_t cpu_online_map;
 #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu))
=20
-DECLARE_PER_CPU(cpumask_t, cpu_core_map);
-DECLARE_PER_CPU(cpumask_t, cpu_sibling_map);
+DECLARE_PER_CPU(cpumask_var_t, cpu_core_mask);
+DECLARE_PER_CPU(cpumask_var_t, cpu_sibling_mask);
 extern int smp_num_siblings;
 extern int smp_num_cpucores;
 extern void __iomem *ipi_base_addr;
--- 2011-10-18.orig/xen/include/asm-x86/smp.h	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/include/asm-x86/smp.h	2011-10-14 15:43:54.0000000=
00 +0200
@@ -25,8 +25,8 @@
  */
 =20
 extern void smp_alloc_memory(void);
-DECLARE_PER_CPU(cpumask_t, cpu_sibling_map);
-DECLARE_PER_CPU(cpumask_t, cpu_core_map);
+DECLARE_PER_CPU(cpumask_var_t, cpu_sibling_mask);
+DECLARE_PER_CPU(cpumask_var_t, cpu_core_mask);
=20
 void smp_send_nmi_allbutself(void);
=20
--- 2011-10-18.orig/xen/include/xen/cpumask.h	2011-10-19 17:30:16.0000000=
00 +0200
+++ 2011-10-18/xen/include/xen/cpumask.h	2011-10-19 17:30:43.0000000=
00 +0200
@@ -320,20 +320,16 @@ static inline const cpumask_t *cpumask_o
 #define cpus_addr(src) ((src).bits)
 #define cpumask_bits(maskp) ((maskp)->bits)
=20
-#define cpumask_scnprintf(buf, len, src) \
-	__cpumask_scnprintf((buf), (len), &(src), nr_cpu_ids)
-static inline int __cpumask_scnprintf(char *buf, int len,
-					const cpumask_t *srcp, int nbits)
+static inline int cpumask_scnprintf(char *buf, int len,
+				    const cpumask_t *srcp)
 {
-	return bitmap_scnprintf(buf, len, srcp->bits, nbits);
+	return bitmap_scnprintf(buf, len, srcp->bits, nr_cpu_ids);
 }
=20
-#define cpulist_scnprintf(buf, len, src) \
-	__cpulist_scnprintf((buf), (len), &(src), nr_cpu_ids)
-static inline int __cpulist_scnprintf(char *buf, int len,
-					const cpumask_t *srcp, int nbits)
+static inline int cpulist_scnprintf(char *buf, int len,
+				    const cpumask_t *srcp)
 {
-	return bitmap_scnlistprintf(buf, len, srcp->bits, nbits);
+	return bitmap_scnlistprintf(buf, len, srcp->bits, nr_cpu_ids);
 }
=20
 /*



--=__Part2906CA8B.0__=
Content-Type: text/plain; name="sibling-core-map-alloc.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="sibling-core-map-alloc.patch"

allocate CPU sibling and core maps dynamically=0A=0A... thus reducing the =
per-CPU data area size back to one page even when=0Abuilding for large =
NR_CPUS.=0A=0AAt once eliminate the old __cpu{mask,list}_scnprintf() =
helpers.=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=0A=0A--- =
2011-10-18.orig/xen/arch/ia64/linux-xen/setup.c	2011-10-20 14:46:19.0000000=
00 +0200=0A+++ 2011-10-18/xen/arch/ia64/linux-xen/setup.c	2011-10-14 =
15:53:37.000000000 +0200=0A@@ -577,8 +577,12 @@ late_setup_arch (char =
**cmdline_p)=0A =0A 	cpu_physical_id(0) =3D hard_smp_processor_id();=0A =
=0A-	cpu_set(0, per_cpu(cpu_sibling_map, 0));=0A-	cpu_set(0, =
per_cpu(cpu_core_map, 0));=0A+	if (!zalloc_cpumask_var(&per_cpu(cpu_siblin=
g_mask, 0)) ||=0A+            !zalloc_cpumask_var(&per_cpu(cpu_core_mask, =
0)))=0A+		panic("No memory for boot CPU sibling/core =
maps\n");=0A+=0A+	cpumask_set_cpu(0, per_cpu(cpu_sibling_mask, =
0));=0A+	cpumask_set_cpu(0, per_cpu(cpu_core_mask, 0));=0A =0A 	=
check_for_logical_procs();=0A 	if (smp_num_cpucores > 1)=0A--- 2011-10-18.=
orig/xen/arch/ia64/linux-xen/smpboot.c	2011-10-11 17:00:51.000000000 =
+0200=0A+++ 2011-10-18/xen/arch/ia64/linux-xen/smpboot.c	2011-10-14 =
16:00:49.000000000 +0200=0A@@ -144,8 +144,8 @@ EXPORT_SYMBOL(cpu_online_map=
);=0A cpumask_t cpu_possible_map;=0A EXPORT_SYMBOL(cpu_possible_map);=0A =
=0A-DEFINE_PER_CPU_READ_MOSTLY(cpumask_t, cpu_core_map);=0A-DEFINE_PER_CPU_=
READ_MOSTLY(cpumask_t, cpu_sibling_map);=0A+DEFINE_PER_CPU_READ_MOSTLY(cpum=
ask_var_t, cpu_core_mask);=0A+DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, =
cpu_sibling_mask);=0A int smp_num_siblings =3D 1;=0A int smp_num_cpucores =
=3D 1;=0A =0A@@ -687,13 +687,13 @@ clear_cpu_sibling_map(int cpu)=0A {=0A 	=
int i;=0A =0A-	for_each_cpu_mask(i, per_cpu(cpu_sibling_map, cpu))=0A-		=
cpumask_clear_cpu(cpu, &per_cpu(cpu_sibling_map, i));=0A-	for_each_cp=
u_mask(i, per_cpu(cpu_core_map, cpu))=0A-		cpumask_clear_cpu(c=
pu, &per_cpu(cpu_core_map, i));=0A+	for_each_cpu_mask(i, *per_cpu(cpu_s=
ibling_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+		=
cpumask_clear_cpu(cpu, per_cpu(cpu_core_mask, i));=0A =0A-	cpumask_cle=
ar(&per_cpu(cpu_sibling_map, cpu));=0A-	cpumask_clear(&per_cpu(cpu_core_map=
, cpu));=0A+	cpumask_clear(per_cpu(cpu_sibling_mask, cpu));=0A+	=
cpumask_clear(per_cpu(cpu_core_mask, cpu));=0A }=0A =0A static void=0A@@ =
-703,12 +703,12 @@ remove_siblinginfo(int cpu)=0A =0A 	if (cpu_data(cpu)->=
threads_per_core =3D=3D 1 &&=0A 	    cpu_data(cpu)->cores_per_socket=
 =3D=3D 1) {=0A-		cpu_clear(cpu, per_cpu(cpu_core_map, =
cpu));=0A-		cpu_clear(cpu, per_cpu(cpu_sibling_map, cpu));=0A+	=
	cpumask_clear_cpu(cpu, per_cpu(cpu_core_mask, cpu));=0A+		=
cpumask_clear_cpu(cpu, per_cpu(cpu_sibling_mask, cpu));=0A 		=
return;=0A 	}=0A =0A-	last =3D (cpus_weight(per_cpu(cpu_core_map,=
 cpu)) =3D=3D 1);=0A+	last =3D (cpumask_weight(per_cpu(cpu_core_mask, =
cpu)) =3D=3D 1);=0A =0A 	/* remove it from all sibling map's */=0A 	=
clear_cpu_sibling_map(cpu);=0A@@ -794,11 +794,11 @@ set_cpu_sibling_map(int=
 cpu)=0A =0A 	for_each_online_cpu(i) {=0A 		if ((cpu_data(cpu)-=
>socket_id =3D=3D cpu_data(i)->socket_id)) {=0A-			=
cpu_set(i, per_cpu(cpu_core_map, cpu));=0A-			cpu_set(cpu=
, per_cpu(cpu_core_map, i));=0A+			cpumask_set_cpu(i, =
per_cpu(cpu_core_mask, cpu));=0A+			cpumask_set_cpu(cpu=
, per_cpu(cpu_core_mask, i));=0A 			if (cpu_data(cpu)->=
core_id =3D=3D cpu_data(i)->core_id) {=0A-				=
cpu_set(i, per_cpu(cpu_sibling_map, cpu));=0A-				=
cpu_set(cpu, per_cpu(cpu_sibling_map, i));=0A+				=
cpumask_set_cpu(i, per_cpu(cpu_sibling_mask, cpu));=0A+				=
cpumask_set_cpu(cpu, per_cpu(cpu_sibling_mask, i));=0A 			=
}=0A 		}=0A 	}=0A@@ -821,6 +821,14 @@ __cpu_up (unsigned int =
cpu)=0A 	if (cpu_isset(cpu, cpu_callin_map))=0A 		return =
-EINVAL;=0A =0A+	if (!per_cpu(cpu_sibling_mask, cpu) &&=0A+         =
   !zalloc_cpumask_var(&per_cpu(cpu_sibling_mask, cpu)))=0A+		=
return -ENOMEM;=0A+=0A+	if (!per_cpu(cpu_core_mask, cpu) &&=0A+            =
!zalloc_cpumask_var(&per_cpu(cpu_core_mask, cpu)))=0A+		return =
-ENOMEM;=0A+=0A 	per_cpu(cpu_state, cpu) =3D CPU_UP_PREPARE;=0A 	/* =
Processor goes to start_secondary(), sets online flag */=0A 	ret =3D =
do_boot_cpu(sapicid, cpu);=0A@@ -829,8 +837,8 @@ __cpu_up (unsigned int =
cpu)=0A =0A 	if (cpu_data(cpu)->threads_per_core =3D=3D 1 &&=0A 	   =
 cpu_data(cpu)->cores_per_socket =3D=3D 1) {=0A-		cpu_set(cpu=
, per_cpu(cpu_sibling_map, cpu));=0A-		cpu_set(cpu, per_cpu(cpu_co=
re_map, cpu));=0A+		cpumask_set_cpu(cpu, per_cpu(cpu_sibling_ma=
sk, cpu));=0A+		cpumask_set_cpu(cpu, per_cpu(cpu_core_mask, =
cpu));=0A 		return 0;=0A 	}=0A =0A--- 2011-10-18.orig/xen/arc=
h/ia64/xen/dom0_ops.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/ia64/xen/dom0_ops.c	2011-10-14 15:49:47.000000000 =
+0200=0A@@ -594,9 +594,9 @@ long arch_do_sysctl(xen_sysctl_t *op, XE=0A    =
     xen_sysctl_physinfo_t *pi =3D &op->u.physinfo;=0A =0A         =
memset(pi, 0, sizeof(*pi));=0A-        pi->threads_per_core =3D cpus_weight=
(per_cpu(cpu_sibling_map, 0));=0A+        pi->threads_per_core =3D =
cpumask_weight(per_cpu(cpu_sibling_mask, 0));=0A         pi->cores_per_sock=
et =3D=0A-            cpus_weight(per_cpu(cpu_core_map, 0)) / pi->threads_p=
er_core;=0A+            cpumask_weight(per_cpu(cpu_core_mask, 0)) / =
pi->threads_per_core;=0A         pi->nr_nodes         =3D (u32)num_online_n=
odes();=0A         pi->nr_cpus          =3D (u32)num_online_cpus();=0A     =
    pi->total_pages      =3D total_pages; =0A--- 2011-10-18.orig/xen/arch/i=
a64/xen/tlb_track.c	2011-10-11 16:58:01.000000000 +0200=0A+++ =
2011-10-18/xen/arch/ia64/xen/tlb_track.c	2011-10-14 16:04:14.0000000=
00 +0200=0A@@ -504,7 +504,7 @@ __tlb_track_entry_printf(const char* fun=0A =
    char pcpumask_buf[NR_CPUS + 1];=0A     char vcpumask_buf[MAX_VIRT_CPUS =
+ 1];=0A     cpumask_scnprintf(pcpumask_buf, sizeof(pcpumask_buf),=0A-     =
                 entry->pcpu_dirty_mask);=0A+                      =
&entry->pcpu_dirty_mask);=0A     vcpumask_scnprintf(vcpumask_buf, =
sizeof(vcpumask_buf),=0A                        entry->vcpu_dirty_mask);=0A=
     printk("%s:%d\n"=0A--- 2011-10-18.orig/xen/arch/x86/cpu/mcheck/mce_int=
el.c	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/c=
pu/mcheck/mce_intel.c	2011-10-18 13:41:52.000000000 +0200=0A@@ -867,7 =
+867,7 @@ static void intel_machine_check(struct c=0A         {=0A         =
    char *ebufp, ebuf[96] =3D "MCE: Fatal error happened on CPUs ";=0A     =
        ebufp =3D ebuf + strlen(ebuf);=0A-            cpumask_scnprintf(ebu=
fp, 95 - strlen(ebuf), mce_fatal_cpus);=0A+            cpumask_scnprintf(eb=
ufp, 95 - strlen(ebuf), &mce_fatal_cpus);=0A             mc_panic(ebuf);=0A=
         }=0A         atomic_set(&found_error, 0);=0A--- 2011-10-18.orig/xe=
n/arch/x86/irq.c	2011-10-18 13:40:56.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/irq.c	2011-10-18 13:41:41.000000000 +0200=0A@@ =
-1998,7 +1998,7 @@ static void dump_irqs(unsigned char key)=0A         =
spin_lock_irqsave(&desc->lock, flags);=0A =0A         cpumask_scnprintf(key=
handler_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.vect=
or,=0A--- 2011-10-18.orig/xen/arch/x86/mm.c	2011-10-20 14:47:26.0000000=
00 +0200=0A+++ 2011-10-18/xen/arch/x86/mm.c	2011-10-20 14:47:37.0000000=
00 +0200=0A@@ -3201,7 +3201,7 @@ int do_mmuext_op(=0A                 =
cpumask_clear(&mask);=0A                 for_each_online_cpu(cpu)=0A       =
              if ( !cpumask_intersects(&mask,=0A-                          =
                   &per_cpu(cpu_sibling_map, cpu)) )=0A+                   =
                          per_cpu(cpu_sibling_mask, cpu)) )=0A             =
            cpumask_set_cpu(cpu, &mask);=0A                 flush_mask(&mas=
k, FLUSH_CACHE);=0A             }=0A--- 2011-10-18.orig/xen/arch/x86/oprofi=
le/op_model_p4.c	2011-10-20 14:46:19.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/oprofile/op_model_p4.c	2011-10-14 16:05:38.0000000=
00 +0200=0A@@ -385,7 +385,7 @@ static unsigned int get_stagger(void)=0A =
{=0A #ifdef CONFIG_SMP=0A 	int cpu =3D smp_processor_id();=0A-	=
return (cpu !=3D first_cpu(per_cpu(cpu_sibling_map, cpu)));=0A+	return =
(cpu !=3D cpumask_first(per_cpu(cpu_sibling_mask, cpu)));=0A #endif	=
=0A 	return 0;=0A }=0A--- 2011-10-18.orig/xen/arch/x86/smpboot.c	=
2011-10-14 15:08:45.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/smpboot.c=
	2011-10-14 16:05:11.000000000 +0200=0A@@ -51,9 +51,9 @@=0A =
unsigned long __read_mostly trampoline_phys;=0A =0A /* representing HT =
siblings of each logical CPU */=0A-DEFINE_PER_CPU_READ_MOSTLY(cpumask_t, =
cpu_sibling_map);=0A+DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_sibling_=
mask);=0A /* representing HT and core siblings of each logical CPU =
*/=0A-DEFINE_PER_CPU_READ_MOSTLY(cpumask_t, cpu_core_map);=0A+DEFINE_PER_CP=
U_READ_MOSTLY(cpumask_var_t, cpu_core_mask);=0A =0A cpumask_t cpu_online_ma=
p __read_mostly;=0A EXPORT_SYMBOL(cpu_online_map);=0A@@ -233,10 +233,10 @@ =
static cpumask_t cpu_sibling_setup_map;=0A =0A static void link_thread_sibl=
ings(int cpu1, int cpu2)=0A {=0A-    cpu_set(cpu1, per_cpu(cpu_sibling_map,=
 cpu2));=0A-    cpu_set(cpu2, per_cpu(cpu_sibling_map, cpu1));=0A-    =
cpu_set(cpu1, per_cpu(cpu_core_map, cpu2));=0A-    cpu_set(cpu2, per_cpu(cp=
u_core_map, cpu1));=0A+    cpumask_set_cpu(cpu1, per_cpu(cpu_sibling_mask, =
cpu2));=0A+    cpumask_set_cpu(cpu2, per_cpu(cpu_sibling_mask, cpu1));=0A+ =
   cpumask_set_cpu(cpu1, per_cpu(cpu_core_mask, cpu2));=0A+    cpumask_set_=
cpu(cpu2, per_cpu(cpu_core_mask, cpu1));=0A }=0A =0A static void set_cpu_si=
bling_map(int cpu)=0A@@ -262,13 +262,13 @@ static void set_cpu_sibling_map(=
int cpu)=0A     }=0A     else=0A     {=0A-        cpu_set(cpu, per_cpu(cpu_=
sibling_map, cpu));=0A+        cpumask_set_cpu(cpu, per_cpu(cpu_sibling_mas=
k, cpu));=0A     }=0A =0A     if ( c[cpu].x86_max_cores =3D=3D 1 )=0A     =
{=0A-        cpumask_copy(&per_cpu(cpu_core_map, cpu),=0A-                 =
    &per_cpu(cpu_sibling_map, cpu));=0A+        cpumask_copy(per_cpu(cpu_co=
re_mask, cpu),=0A+                     per_cpu(cpu_sibling_mask, cpu));=0A =
        c[cpu].booted_cores =3D 1;=0A         return;=0A     }=0A@@ =
-277,18 +277,18 @@ static void set_cpu_sibling_map(int cpu)=0A     {=0A    =
     if ( c[cpu].phys_proc_id =3D=3D c[i].phys_proc_id )=0A         {=0A-  =
          cpu_set(i, per_cpu(cpu_core_map, cpu));=0A-            cpu_set(cp=
u, per_cpu(cpu_core_map, i));=0A+            cpumask_set_cpu(i, per_cpu(cpu=
_core_mask, cpu));=0A+            cpumask_set_cpu(cpu, per_cpu(cpu_core_mas=
k, i));=0A             /*=0A              *  Does this new cpu bringup a =
new core?=0A              */=0A-            if ( cpus_weight(per_cpu(cpu_si=
bling_map, cpu)) =3D=3D 1 )=0A+            if ( cpumask_weight(per_cpu(cpu_=
sibling_mask, cpu)) =3D=3D 1 )=0A             {=0A                 /*=0A   =
               * for each core in package, increment=0A                  * =
the booted_cores for this new cpu=0A                  */=0A-               =
 if ( first_cpu(per_cpu(cpu_sibling_map, i)) =3D=3D i )=0A+                =
if ( cpumask_first(per_cpu(cpu_sibling_mask, i)) =3D=3D i )=0A             =
        c[cpu].booted_cores++;=0A                 /*=0A                  * =
increment the core count for all=0A@@ -641,13 +641,14 @@ static void =
cpu_smpboot_free(unsigned in=0A {=0A     unsigned int order;=0A =0A+    =
free_cpumask_var(per_cpu(cpu_sibling_mask, cpu));=0A+    free_cpumask_var(p=
er_cpu(cpu_core_mask, cpu));=0A+=0A     order =3D get_order_from_pages(NR_R=
ESERVED_GDT_PAGES);=0A     free_xenheap_pages(per_cpu(gdt_table, cpu), =
order);=0A-    per_cpu(gdt_table, cpu) =3D NULL;=0A =0A #ifdef __x86_64__=
=0A     free_xenheap_pages(per_cpu(compat_gdt_table, cpu), order);=0A-    =
per_cpu(compat_gdt_table, cpu) =3D NULL;=0A #endif=0A =0A     order =3D =
get_order_from_bytes(IDT_ENTRIES * sizeof(idt_entry_t));=0A@@ -696,7 =
+697,9 @@ static int cpu_smpboot_alloc(unsigned in=0A         goto oom;=0A =
    memcpy(idt_tables[cpu], idt_table, IDT_ENTRIES * sizeof(idt_entry_t));=
=0A =0A-    return 0;=0A+    if ( zalloc_cpumask_var(&per_cpu(cpu_sibling_m=
ask, cpu)) &&=0A+         zalloc_cpumask_var(&per_cpu(cpu_core_mask, cpu)) =
)=0A+        return 0;=0A =0A  oom:=0A     cpu_smpboot_free(cpu);=0A@@ =
-744,6 +747,10 @@ void __init smp_prepare_cpus(unsigned in=0A =0A     =
stack_base[0] =3D stack_start.esp;=0A =0A+    if ( !zalloc_cpumask_var(&per=
_cpu(cpu_sibling_mask, 0)) ||=0A+         !zalloc_cpumask_var(&per_cpu(cpu_=
core_mask, 0)) )=0A+        panic("No memory for boot CPU sibling/core =
maps\n");=0A+=0A     set_cpu_sibling_map(0);=0A =0A     /*=0A@@ -760,8 =
+767,6 @@ void __init smp_prepare_cpus(unsigned in=0A             =
printk(KERN_NOTICE "Local APIC not detected."=0A                    " =
Using dummy APIC emulation.\n");=0A         map_cpu_to_logical_apicid();=0A=
-        cpu_set(0, per_cpu(cpu_sibling_map, 0));=0A-        cpu_set(0, =
per_cpu(cpu_core_map, 0));=0A         return;=0A     }=0A =0A@@ -792,13 =
+797,6 @@ void __init smp_prepare_cpus(unsigned in=0A     setup_local_APIC(=
);=0A     map_cpu_to_logical_apicid();=0A =0A-    /*=0A-     * construct =
cpu_sibling_map, so that we can tell sibling CPUs=0A-     * efficiently.=0A=
-     */=0A-    cpu_set(0, per_cpu(cpu_sibling_map, 0));=0A-    cpu_set(0, =
per_cpu(cpu_core_map, 0));=0A-=0A     smpboot_setup_io_apic();=0A =0A     =
setup_boot_APIC_clock();=0A@@ -816,18 +814,18 @@ 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_map, cpu) )=0A+    =
for_each_cpu_mask ( sibling, *per_cpu(cpu_core_mask, cpu) )=0A     {=0A-   =
     cpu_clear(cpu, per_cpu(cpu_core_map, sibling));=0A+        cpumask_cle=
ar_cpu(cpu, per_cpu(cpu_core_mask, sibling));=0A         /* Last thread =
sibling in this cpu core going down. */=0A-        if ( cpumask_weight(&per=
_cpu(cpu_sibling_map, cpu)) =3D=3D 1 )=0A+        if ( cpumask_weight(per_c=
pu(cpu_sibling_mask, cpu)) =3D=3D 1 )=0A             c[sibling].booted_core=
s--;=0A     }=0A    =0A-    for_each_cpu_mask(sibling, per_cpu(cpu_sibling_=
map, cpu))=0A-        cpumask_clear_cpu(cpu, &per_cpu(cpu_sibling_map, =
sibling));=0A-    cpumask_clear(&per_cpu(cpu_sibling_map, cpu));=0A-    =
cpumask_clear(&per_cpu(cpu_core_map, cpu));=0A+    for_each_cpu_mask(siblin=
g, *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     =
c[cpu].phys_proc_id =3D BAD_APICID;=0A     c[cpu].cpu_core_id =3D =
BAD_APICID;=0A     c[cpu].compute_unit_id =3D BAD_APICID;=0A--- 2011-10-18.=
orig/xen/arch/x86/sysctl.c	2011-09-21 16:44:47.000000000 +0200=0A+++ =
2011-10-18/xen/arch/x86/sysctl.c	2011-10-14 15:48:20.000000000 =
+0200=0A@@ -76,9 +76,9 @@ long arch_do_sysctl(=0A =0A         memset(pi, =
0, sizeof(*pi));=0A         pi->threads_per_core =3D=0A-            =
cpus_weight(per_cpu(cpu_sibling_map, 0));=0A+            cpumask_weight(per=
_cpu(cpu_sibling_mask, 0));=0A         pi->cores_per_socket =3D=0A-        =
    cpus_weight(per_cpu(cpu_core_map, 0)) / pi->threads_per_core;=0A+      =
      cpumask_weight(per_cpu(cpu_core_mask, 0)) / pi->threads_per_core;=0A =
        pi->nr_cpus =3D num_online_cpus();=0A         pi->nr_nodes =3D =
num_online_nodes();=0A         pi->max_node_id =3D MAX_NUMNODES-1;=0A--- =
2011-10-18.orig/xen/common/domctl.c	2011-10-18 13:32:43.000000000 =
+0200=0A+++ 2011-10-18/xen/common/domctl.c	2011-10-18 13:41:58.0000000=
00 +0200=0A@@ -171,7 +171,7 @@ static unsigned int default_vcpu0_locati=0A =
     * If we're on a HT system, we only auto-allocate to a non-primary HT. =
We =0A      * favour high numbered CPUs in the event of a tie.=0A      =
*/=0A-    cpumask_copy(&cpu_exclude_map, &per_cpu(cpu_sibling_map, =
0));=0A+    cpumask_copy(&cpu_exclude_map, per_cpu(cpu_sibling_mask, =
0));=0A     cpu =3D cpumask_first(&cpu_exclude_map);=0A     if ( cpumask_we=
ight(&cpu_exclude_map) > 1 )=0A         cpu =3D cpumask_next(cpu, =
&cpu_exclude_map);=0A@@ -179,11 +179,11 @@ static unsigned int default_vcpu=
0_locati=0A     {=0A         if ( cpumask_test_cpu(i, &cpu_exclude_map) =
)=0A             continue;=0A-        if ( (i =3D=3D cpumask_first(&per_cpu=
(cpu_sibling_map, i))) &&=0A-             (cpumask_weight(&per_cpu(cpu_sibl=
ing_map, i)) > 1) )=0A+        if ( (i =3D=3D cpumask_first(per_cpu(cpu_sib=
ling_mask, i))) &&=0A+             (cpumask_weight(per_cpu(cpu_sibling_mask=
, i)) > 1) )=0A             continue;=0A         cpumask_or(&cpu_exclude_ma=
p, &cpu_exclude_map,=0A-                   &per_cpu(cpu_sibling_map, =
i));=0A+                   per_cpu(cpu_sibling_mask, i));=0A         if ( =
!cnt || cnt[i] <=3D cnt[cpu] )=0A             cpu =3D i;=0A     }=0A--- =
2011-10-18.orig/xen/common/keyhandler.c	2011-10-13 13:27:55.000000000 =
+0200=0A+++ 2011-10-18/xen/common/keyhandler.c	2011-10-14 16:04:31.0000000=
00 +0200=0A@@ -210,7 +210,7 @@ static struct keyhandler reboot_machine_=0A =
static void cpuset_print(char *set, int size, const cpumask_t *mask)=0A =
{=0A     *set++ =3D '{';=0A-    set +=3D cpulist_scnprintf(set, size-2, =
*mask);=0A+    set +=3D cpulist_scnprintf(set, size-2, mask);=0A     =
*set++ =3D '}';=0A     *set++ =3D '\0';=0A }=0A--- 2011-10-18.orig/xen/comm=
on/sched_credit.c	2011-10-12 08:38:35.000000000 +0200=0A+++ =
2011-10-18/xen/common/sched_credit.c	2011-10-14 16:01:03.000000000 =
+0200=0A@@ -502,23 +502,23 @@ _csched_cpu_pick(const struct scheduler =0A =
=0A         nxt =3D cpumask_cycle(cpu, &cpus);=0A =0A-        if ( =
cpumask_test_cpu(cpu, &per_cpu(cpu_core_map, nxt)) )=0A+        if ( =
cpumask_test_cpu(cpu, per_cpu(cpu_core_mask, nxt)) )=0A         {=0A       =
      /* We're on the same socket, so check the busy-ness of threads.=0A   =
           * Migrate if # of idlers is less at all */=0A-            =
ASSERT( cpumask_test_cpu(nxt, &per_cpu(cpu_core_map, cpu)) );=0A+          =
  ASSERT( cpumask_test_cpu(nxt, per_cpu(cpu_core_mask, cpu)) );=0A         =
    migrate_factor =3D 1;=0A-            cpumask_and(&cpu_idlers, &idlers, =
&per_cpu(cpu_sibling_map, cpu));=0A-            cpumask_and(&nxt_idlers, =
&idlers, &per_cpu(cpu_sibling_map, nxt));=0A+            cpumask_and(&cpu_i=
dlers, &idlers, per_cpu(cpu_sibling_mask, cpu));=0A+            cpumask_and=
(&nxt_idlers, &idlers, per_cpu(cpu_sibling_mask, nxt));=0A         }=0A    =
     else=0A         {=0A             /* We're on different sockets, so =
check the busy-ness of cores.=0A              * Migrate only if the other =
core is twice as idle */=0A-            ASSERT( !cpumask_test_cpu(nxt, =
&per_cpu(cpu_core_map, cpu)) );=0A+            ASSERT( !cpumask_test_cpu(nx=
t, per_cpu(cpu_core_mask, cpu)) );=0A             migrate_factor =3D =
2;=0A-            cpumask_and(&cpu_idlers, &idlers, &per_cpu(cpu_core_map, =
cpu));=0A-            cpumask_and(&nxt_idlers, &idlers, &per_cpu(cpu_core_m=
ap, nxt));=0A+            cpumask_and(&cpu_idlers, &idlers, per_cpu(cpu_cor=
e_mask, cpu));=0A+            cpumask_and(&nxt_idlers, &idlers, per_cpu(cpu=
_core_mask, nxt));=0A         }=0A =0A         weight_cpu =3D cpumask_weigh=
t(&cpu_idlers);=0A@@ -531,7 +531,7 @@ _csched_cpu_pick(const struct =
scheduler =0A             cpumask_and(&nxt_idlers, &cpus, &nxt_idlers);=0A =
            spc =3D CSCHED_PCPU(nxt);=0A             cpu =3D cpumask_cycle(=
spc->idle_bias, &nxt_idlers);=0A-            cpumask_andnot(&cpus, &cpus, =
&per_cpu(cpu_sibling_map, cpu));=0A+            cpumask_andnot(&cpus, =
&cpus, per_cpu(cpu_sibling_mask, cpu));=0A         }=0A         else=0A    =
     {=0A@@ -1419,9 +1419,9 @@ csched_dump_pcpu(const struct scheduler =0A =
    spc =3D CSCHED_PCPU(cpu);=0A     runq =3D &spc->runq;=0A =0A-    =
cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_sibling_map, =
cpu));=0A+    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_sibling=
_mask, cpu));=0A     printk(" sort=3D%d, sibling=3D%s, ", spc->runq_sort_la=
st, cpustr);=0A-    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_c=
ore_map, cpu));=0A+    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cp=
u_core_mask, cpu));=0A     printk("core=3D%s\n", cpustr);=0A =0A     /* =
current VCPU */=0A@@ -1481,7 +1481,7 @@ csched_dump(const struct scheduler =
*ops)=0A            prv->ticks_per_tslice,=0A            vcpu_migration_del=
ay);=0A =0A-    cpumask_scnprintf(idlers_buf, sizeof(idlers_buf), =
prv->idlers);=0A+    cpumask_scnprintf(idlers_buf, sizeof(idlers_buf), =
&prv->idlers);=0A     printk("idlers: %s\n", idlers_buf);=0A =0A     =
printk("active vcpus:\n");=0A--- 2011-10-18.orig/xen/common/sched_credit2.c=
	2011-10-11 18:03:39.000000000 +0200=0A+++ 2011-10-18/xen/common/sch=
ed_credit2.c	2011-10-14 15:46:58.000000000 +0200=0A@@ -1767,9 +1767,9 =
@@ csched_dump_pcpu(const struct scheduler =0A =0A     runq =3D &RQD(ops, =
cpu)->runq;=0A =0A-    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cp=
u_sibling_map,cpu));=0A+    cpumask_scnprintf(cpustr, sizeof(cpustr), =
per_cpu(cpu_sibling_mask, cpu));=0A     printk(" sibling=3D%s, ", =
cpustr);=0A-    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_core_=
map,cpu));=0A+    cpumask_scnprintf(cpustr, sizeof(cpustr), per_cpu(cpu_cor=
e_mask, cpu));=0A     printk("core=3D%s\n", cpustr);=0A =0A     /* current =
VCPU */=0A--- 2011-10-18.orig/xen/include/asm-ia64/linux-xen/asm/smp.h	=
2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/include/asm-ia64/l=
inux-xen/asm/smp.h	2011-10-14 15:43:35.000000000 +0200=0A@@ -62,8 =
+62,8 @@ extern char no_int_routing __devinitdata=0A extern cpumask_t =
cpu_online_map;=0A #define cpu_is_offline(cpu) unlikely(!cpu_online(cpu))=
=0A =0A-DECLARE_PER_CPU(cpumask_t, cpu_core_map);=0A-DECLARE_PER_CPU(cpumas=
k_t, cpu_sibling_map);=0A+DECLARE_PER_CPU(cpumask_var_t, cpu_core_mask);=0A=
+DECLARE_PER_CPU(cpumask_var_t, cpu_sibling_mask);=0A extern int smp_num_si=
blings;=0A extern int smp_num_cpucores;=0A extern void __iomem *ipi_base_ad=
dr;=0A--- 2011-10-18.orig/xen/include/asm-x86/smp.h	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/include/asm-x86/smp.h	=
2011-10-14 15:43:54.000000000 +0200=0A@@ -25,8 +25,8 @@=0A  */=0A  =0A =
extern void smp_alloc_memory(void);=0A-DECLARE_PER_CPU(cpumask_t, =
cpu_sibling_map);=0A-DECLARE_PER_CPU(cpumask_t, cpu_core_map);=0A+DECLARE_P=
ER_CPU(cpumask_var_t, cpu_sibling_mask);=0A+DECLARE_PER_CPU(cpumask_var_t, =
cpu_core_mask);=0A =0A void smp_send_nmi_allbutself(void);=0A =0A--- =
2011-10-18.orig/xen/include/xen/cpumask.h	2011-10-19 17:30:16.0000000=
00 +0200=0A+++ 2011-10-18/xen/include/xen/cpumask.h	2011-10-19 =
17:30:43.000000000 +0200=0A@@ -320,20 +320,16 @@ static inline const =
cpumask_t *cpumask_o=0A #define cpus_addr(src) ((src).bits)=0A #define =
cpumask_bits(maskp) ((maskp)->bits)=0A =0A-#define cpumask_scnprintf(buf, =
len, src) \=0A-	__cpumask_scnprintf((buf), (len), &(src), nr_cpu_ids)=0A-st=
atic inline int __cpumask_scnprintf(char *buf, int len,=0A-			=
		const cpumask_t *srcp, int nbits)=0A+static inline int =
cpumask_scnprintf(char *buf, int len,=0A+				   =
 const cpumask_t *srcp)=0A {=0A-	return bitmap_scnprintf(buf, len, =
srcp->bits, nbits);=0A+	return bitmap_scnprintf(buf, len, srcp->bits, =
nr_cpu_ids);=0A }=0A =0A-#define cpulist_scnprintf(buf, len, src) \=0A-	=
__cpulist_scnprintf((buf), (len), &(src), nr_cpu_ids)=0A-static inline int =
__cpulist_scnprintf(char *buf, int len,=0A-					=
const cpumask_t *srcp, int nbits)=0A+static inline int cpulist_scnprintf(ch=
ar *buf, int len,=0A+				    const cpumask_t =
*srcp)=0A {=0A-	return bitmap_scnlistprintf(buf, len, srcp->bits, =
nbits);=0A+	return bitmap_scnlistprintf(buf, len, srcp->bits, =
nr_cpu_ids);=0A }=0A =0A /*=0A
--=__Part2906CA8B.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

--=__Part2906CA8B.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:47:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:47:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGsy3-0008LS-0p; Thu, 20 Oct 2011 06:47:31 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGsrC-0006Y9-UF
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:40:28 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1319118023!22390976!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14881 invoked from network); 20 Oct 2011 13:40:23 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 13:40:23 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:40:24 +0100
Message-Id: <4EA040E4020000780005C7BA@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:40:20 +0100
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="=__Part765995D4.0__="
Subject: [Xen-devel] [PATCH 06/12] allow efficient allocation of multiple
	CPU masks at 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

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.

--=__Part765995D4.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

This is to better amortize the cost of storing an extra pointer when
dynamically allocating CPU masks: If a certain entity (struct irq_desc
being the first user) wants multiple, it can get away with holding just
a single pointer, which is especially beneficial when a hypervisor with
large NR_CPUS gets run on systems with a relatively small number of
actual CPUs.

If rationale, concept, and implementation are deemed reasonable, this
could/should also be used for the three CPU masks that get allocated
per vCPU.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- 2011-10-18.orig/xen/arch/ia64/linux-xen/irq_ia64.c	2011-10-20 =
14:46:19.000000000 +0200
+++ 2011-10-18/xen/arch/ia64/linux-xen/irq_ia64.c	2011-10-18 =
18:23:19.000000000 +0200
@@ -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);
--- 2011-10-18.orig/xen/arch/ia64/xen/irq.c	2011-10-18 11:20:02.0000000=
00 +0200
+++ 2011-10-18/xen/arch/ia64/xen/irq.c	2011-10-18 18:22:27.000000000 =
+0200
@@ -74,17 +74,27 @@ 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)
+{
+	desc->arch.vector =3D -1;
+	cpumask_setall(irq_desc_cpu_mask(desc));
+
+	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
--- 2011-10-18.orig/xen/arch/x86/i8259.c	2011-10-18 11:13:04.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/i8259.c	2011-10-18 15:25:25.000000000 =
+0200
@@ -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(irq_desc_cpu_mask(desc), cpumask_of(cpu));
         desc->arch.vector =3D FIRST_LEGACY_VECTOR + irq;
     }
    =20
--- 2011-10-18.orig/xen/arch/x86/io_apic.c	2011-10-18 13:32:32.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/io_apic.c	2011-10-20 14:47:44.000000000 =
+0200
@@ -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(irq_desc_cpu_mask(desc)));
+            set_ioapic_affinity_irq(desc, irq_desc_cpu_mask(desc));
         }
=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(irq_desc_cpu_mask(desc)));
             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(irq_desc_cpu_mask(desc)));
=20
     io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&rte) + 0));
     io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&rte) + 1));
--- 2011-10-18.orig/xen/arch/x86/irq.c	2011-10-18 13:41:41.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/irq.c	2011-10-18 17:36:39.000000000 =
+0200
@@ -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(irq_desc_cpu_mask(desc), &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(irq_desc_cpu_mask(desc), &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(irq_desc_affinity(desc));
     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, irq_desc_cpu_mask(desc), &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(irq_desc_cpu_mask(desc));
=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, irq_desc_old_cpu_mask(desc), &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(irq_desc_old_cpu_mask(desc));
=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,14 @@ 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);
-}
+    desc->arch.vector =3D IRQ_VECTOR_UNASSIGNED;
+    desc->arch.old_vector =3D IRQ_VECTOR_UNASSIGNED;
+    cpumask_clear(irq_desc_cpu_mask(desc));
+    cpumask_clear(irq_desc_old_cpu_mask(desc));
=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;
+    return 0;
 }
=20
 int __init init_irq_data(void)
@@ -331,12 +325,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 +398,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 +422,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, irq_desc_cpu_mask(desc))) {
+            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 +436,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 +481,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(irq_desc_old_cpu_mask(desc), irq_desc_cpu_mask(de=
sc));
+            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(irq_desc_cpu_mask(desc), &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 +517,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(irq_desc_affinity(desc), irq_desc_cpu_mask(desc));
     }
     spin_unlock_irqrestore(&vector_lock, flags);
     return ret;
@@ -543,15 +538,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, irq_desc_cpu_mask(desc)))
             continue;
         vector =3D irq_to_vector(irq);
         per_cpu(vector_irq, cpu)[vector] =3D irq;
@@ -560,12 +556,14 @@ void __setup_vector_irq(int cpu)
=20
 void move_masked_irq(struct irq_desc *desc)
 {
+    cpumask_t *pending_mask =3D irq_desc_pending_mask(desc);
+
     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 +578,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 +624,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, irq_desc_cpu_mask(desc)) )
             goto unlock;
=20
         irr =3D apic_read(APIC_IRR + (vector / 32 * 0x10));
@@ -653,7 +652,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(irq_desc_old_cpu_mask(desc));
=20
             if ( desc->arch.used_vectors )
             {
@@ -673,7 +672,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, irq_desc_old_cpu_mask(desc), &cpu_online_ma=
p);
     desc->arch.move_cleanup_count =3D cpumask_weight(&cleanup_mask);
     genapic->send_IPI_mask(&cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);
=20
@@ -690,7 +689,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, irq_desc_cpu_mask(desc)) )
         send_cleanup_vector(desc);
 }
=20
@@ -708,15 +708,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(irq_desc_affinity(desc), mask);
+    cpumask_and(&dest_mask, mask, irq_desc_cpu_mask(desc));
=20
     return cpu_mask_to_apicid(&dest_mask);
 }
@@ -730,7 +730,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(irq_desc_pending_mask(desc), mask);
     wmb();
     desc->status |=3D IRQ_MOVE_PENDING;
 }
@@ -1992,13 +1992,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);
+                          irq_desc_affinity(desc));
         printk("   IRQ:%4d affinity:%s vec:%02x type=3D%-15s"
                " status=3D%08x ",
                irq, keyhandler_scratch, desc->arch.vector,
@@ -2073,10 +2073,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, irq_desc_affinity(desc));
         if ( !desc->action || cpumask_subset(&affinity, &cpu_online_map) =
)
         {
             spin_unlock(&desc->lock);
--- 2011-10-18.orig/xen/arch/x86/msi.c	2011-10-18 11:14:29.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/msi.c	2011-10-18 15:30:47.000000000 =
+0200
@@ -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(irq_desc_cpu_mask(desc)) ) {
         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(irq_desc_cpu_mask(desc));
=20
         msg->address_hi =3D MSI_ADDR_BASE_HI;
         msg->address_lo =3D
--- 2011-10-18.orig/xen/arch/x86/smpboot.c	2011-10-14 16:05:11.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/smpboot.c	2011-10-18 15:41:44.000000000 =
+0200
@@ -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_desc_cpu_mask(irq_to_desc(irq)), &cpu_online_map)=
;
     }
=20
     /* IPI for cleanuping vectors after irq move */
--- 2011-10-18.orig/xen/common/Makefile	2011-10-20 14:46:19.000000000 =
+0200
+++ 2011-10-18/xen/common/Makefile	2011-10-18 15:43:44.000000000 =
+0200
@@ -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	1970-01-01 00:00:00.000000000 +0000
+++ 2011-10-18/xen/common/irq.c	2011-10-18 17:29:12.000000000 +0200
@@ -0,0 +1,18 @@
+#include <xen/config.h>
+#include <xen/irq.h>
+
+int init_one_irq_desc(struct irq_desc *desc)
+{
+    if (irq_desc_initialized(desc))
+        return 0;
+
+    desc->status =3D IRQ_DISABLED;
+    desc->handler =3D &no_irq_type;
+    spin_lock_init(&desc->lock);
+    if ( !alloc_cpumask_array(desc->cpumasks) )
+        return -ENOMEM;
+    cpumask_setall(irq_desc_affinity(desc));
+    INIT_LIST_HEAD(&desc->rl_link);
+
+    return arch_init_one_irq_desc(desc);
+}
--- 2011-10-18.orig/xen/drivers/passthrough/vtd/iommu.c	2011-10-18 =
11:18:48.000000000 +0200
+++ 2011-10-18/xen/drivers/passthrough/vtd/iommu.c	2011-10-18 =
15:29:15.000000000 +0200
@@ -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, irq_desc_cpu_mask(desc));
=20
         clear_fault_bits(iommu);
=20
--- 2011-10-18.orig/xen/include/asm-ia64/linux-xen/asm/irq.h	2011-10-18 =
11:01:50.000000000 +0200
+++ 2011-10-18/xen/include/asm-ia64/linux-xen/asm/irq.h	2011-10-18 =
18:20:06.000000000 +0200
@@ -18,8 +18,12 @@
 struct irq_cfg {
 #define arch_irq_desc irq_cfg
         int  vector;
-        cpumask_t cpu_mask;
 };
+
+#define ARCH_IRQ_DESC_NR_CPUMASKS 1
+#define irq_desc_cpu_mask(desc) arch_irq_desc_cpumask(desc, 0)
+
+int init_irq_data(void);
 #endif
=20
 static __inline__ int
--- 2011-10-18.orig/xen/include/asm-x86/irq.h	2011-10-18 11:01:23.0000000=
00 +0200
+++ 2011-10-18/xen/include/asm-x86/irq.h	2011-10-18 15:38:38.0000000=
00 +0200
@@ -33,14 +33,17 @@ 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;
         unsigned move_cleanup_count;
         vmask_t *used_vectors;
         u8 move_in_progress : 1;
         u8 used: 1;
 };
=20
+#define ARCH_IRQ_DESC_NR_CPUMASKS 3
+#define irq_desc_cpu_mask(desc)     arch_irq_desc_cpumask(desc, 0)
+#define irq_desc_old_cpu_mask(desc) arch_irq_desc_cpumask(desc, 1)
+#define irq_desc_pending_mask(desc) arch_irq_desc_cpumask(desc, 2)
+
 /* For use with irq_cfg.used */
 #define IRQ_UNUSED      (0)
 #define IRQ_USED        (1)
@@ -174,8 +177,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);
--- 2011-10-18.orig/xen/include/xen/cpumask.h	2011-10-19 17:30:43.0000000=
00 +0200
+++ 2011-10-18/xen/include/xen/cpumask.h	2011-10-19 17:30:48.0000000=
00 +0200
@@ -369,6 +369,36 @@ static inline void free_cpumask_var(cpum
 {
 	xfree(mask);
 }
+
+typedef cpumask_t (*cpumask_array_t)[];
+#define DECLARE_CPUMASK_ARRAY(name, dim) cpumask_t (*name)[dim]
+#define CPUMASK_ARRAY_LONGS (nr_cpumask_bits / BITS_PER_LONG)
+#define cpumask_array_index(arr, n) \
+	container_of((*(arr))->bits + (n) * CPUMASK_ARRAY_LONGS, \
+		     typeof(**(arr)), bits[0])
+
+#define alloc_cpumask_array(m) __alloc_cpumask_array(&(m), ARRAY_SIZE(*(m)=
))
+static inline bool_t __alloc_cpumask_array(cpumask_array_t *mask,
+					   unsigned int dim)
+{
+	*(void **)mask =3D xmalloc_array(unsigned long,
+                                       dim * CPUMASK_ARRAY_LONGS);
+	return *mask !=3D NULL;
+}
+
+#define zalloc_cpumask_array(m) __zalloc_cpumask_array(&(m), ARRAY_SIZE(*(=
m)))
+static inline bool_t __zalloc_cpumask_array(cpumask_array_t *mask,
+					    unsigned int dim)
+{
+	*(void **)mask =3D xzalloc_array(unsigned long,
+                                       dim * CPUMASK_ARRAY_LONGS);
+	return *mask !=3D NULL;
+}
+
+static inline void free_cpumask_array(cpumask_array_t mask)
+{
+	xfree(mask);
+}
 #else
 typedef cpumask_t cpumask_var_t[1];
=20
@@ -386,6 +416,32 @@ static inline bool_t zalloc_cpumask_var(
 static inline void free_cpumask_var(cpumask_var_t mask)
 {
 }
+
+typedef cpumask_t cpumask_array_t[];
+#define DECLARE_CPUMASK_ARRAY(name, dim) cpumask_t name[dim]
+#define cpumask_array_index(arr, n) (&(arr)[n])
+
+#define alloc_cpumask_array(m) __alloc_cpumask_array(&(m), ARRAY_SIZE(m))
+static inline bool_t __alloc_cpumask_array(cpumask_array_t *mask,
+					   unsigned int dim)
+{
+	return 1;
+}
+
+#define zalloc_cpumask_array(m) __zalloc_cpumask_array(&(m), ARRAY_SIZE(m)=
)
+static inline bool_t __zalloc_cpumask_array(cpumask_array_t *mask,
+					    unsigned int dim)
+{
+	cpumask_t *m;
+
+	for (m =3D *mask; dim--; ++m)
+		cpumask_clear(m);
+	return 1;
+}
+
+static inline void free_cpumask_array(cpumask_array_t mask)
+{
+}
 #endif
=20
 #if NR_CPUS > 1
--- 2011-10-18.orig/xen/include/xen/irq.h	2011-10-18 13:37:04.0000000=
00 +0200
+++ 2011-10-18/xen/include/xen/irq.h	2011-10-18 17:29:41.000000000 =
+0200
@@ -63,6 +63,17 @@ extern unsigned int nr_irqs;
 #endif
=20
 struct msi_desc;
+
+#define ARCH_IRQ_DESC_FIRST_CPUMASK 1
+#ifndef ARCH_IRQ_DESC_NR_CPUMASKS
+#define ARCH_IRQ_DESC_NR_CPUMASKS 0
+#endif
+
+#define irq_desc_cpumask(desc, idx) cpumask_array_index((desc)->cpumasks, =
idx)
+#define irq_desc_affinity(desc) irq_desc_cpumask(desc, 0)
+#define arch_irq_desc_cpumask(desc, idx) \
+    irq_desc_cpumask(desc, ARCH_IRQ_DESC_FIRST_CPUMASK + (idx))
+
 /*
  * This is the "IRQ descriptor", which contains various information
  * about the irq, including what kind of hardware handling it has,
@@ -76,8 +87,8 @@ 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 */
+    DECLARE_CPUMASK_ARRAY(cpumasks,
+        ARCH_IRQ_DESC_FIRST_CPUMASK + ARCH_IRQ_DESC_NR_CPUMASKS);
=20
     /* irq ratelimit */
     s_time_t rl_quantum_start;
@@ -85,6 +96,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 +169,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_desc_affinity(irq_to_desc(irq)), mask);
 }
=20
 unsigned int set_desc_affinity(struct irq_desc *, const cpumask_t *);



--=__Part765995D4.0__=
Content-Type: text/plain; name="cpumask-array.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="cpumask-array.patch"

allow efficient allocation of multiple CPU masks at once=0A=0AThis is to =
better amortize the cost of storing an extra pointer when=0Adynamically =
allocating CPU masks: If a certain entity (struct irq_desc=0Abeing the =
first user) wants multiple, it can get away with holding just=0Aa single =
pointer, which is especially beneficial when a hypervisor with=0Alarge =
NR_CPUS gets run on systems with a relatively small number of=0Aactual =
CPUs.=0A=0AIf rationale, concept, and implementation are deemed reasonable,=
 this=0Acould/should also be used for the three CPU masks that get =
allocated=0Aper vCPU.=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse.com>=
=0A=0A--- 2011-10-18.orig/xen/arch/ia64/linux-xen/irq_ia64.c	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/arch/ia64/linux-xen/irq_ia64.=
c	2011-10-18 18:23:19.000000000 +0200=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--- 2011-10-18.orig=
/xen/arch/ia64/xen/irq.c	2011-10-18 11:20:02.000000000 +0200=0A+++ =
2011-10-18/xen/arch/ia64/xen/irq.c	2011-10-18 18:22:27.000000000 =
+0200=0A@@ -74,17 +74,27 @@ 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+	desc->arch.vector =
=3D -1;=0A+	cpumask_setall(irq_desc_cpu_mask(desc));=0A+=0A+	=
return 0;=0A+}=0A+=0A+int __init init_irq_data(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--- 2011-10-18.orig/xen/arch/x86/i8=
259.c	2011-10-18 11:13:04.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/i=
8259.c	2011-10-18 15:25:25.000000000 +0200=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->arch.cpu_mask, cpumask_of(cpu));=0A+   =
     cpumask_copy(irq_desc_cpu_mask(desc), cpumask_of(cpu));=0A         =
desc->arch.vector =3D FIRST_LEGACY_VECTOR + irq;=0A     }=0A     =0A--- =
2011-10-18.orig/xen/arch/x86/io_apic.c	2011-10-18 13:32:32.000000000 =
+0200=0A+++ 2011-10-18/xen/arch/x86/io_apic.c	2011-10-20 14:47:44.0000000=
00 +0200=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(irq_desc_cpu_mask(des=
c)));=0A+            set_ioapic_affinity_irq(desc, irq_desc_cpu_mask(desc))=
;=0A         }=0A =0A     }=0A@@ -956,12 +957,12 @@ static void __init =
setup_IO_APIC_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[ap=
ic]; 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_ir=
q(irq_to_desc(irq));=0A             }=0A-            cfg =3D irq_cfg(irq);=
=0A+            desc =3D irq_to_desc(irq);=0A             SET_DEST(entry.de=
st.dest32, entry.dest.logical.logical_dest,=0A-                     =
cpu_mask_to_apicid(&cfg->cpu_mask));=0A+                     cpu_mask_to_ap=
icid(irq_desc_cpu_mask(desc)));=0A             spin_lock_irqsave(&ioapic_lo=
ck, flags);=0A             __ioapic_write_entry(apic, pin, 0, entry);=0A   =
          set_native_irq_info(irq, TARGET_CPUS);=0A@@ -2372,7 +2373,7 @@ =
int ioapic_guest_write(unsigned long phy=0A     rte.vector =3D cfg->vector;=
=0A =0A     SET_DEST(rte.dest.dest32, rte.dest.logical.logical_dest,=0A-   =
          cpu_mask_to_apicid(&cfg->cpu_mask));=0A+             cpu_mask_to_=
apicid(irq_desc_cpu_mask(desc)));=0A =0A     io_apic_write(apic, 0x10 + 2 =
* pin, *(((int *)&rte) + 0));=0A     io_apic_write(apic, 0x11 + 2 * pin, =
*(((int *)&rte) + 1));=0A--- 2011-10-18.orig/xen/arch/x86/irq.c	2011-10-18 =
13:41:41.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/irq.c	2011-10-18 =
17:36:39.000000000 +0200=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_em=
pty(&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(irq_desc_cpu=
_mask(desc), &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_BIN=
D_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_vectors )=0A+    desc->arch.vector =3D vector;=0A+  =
  cpumask_copy(irq_desc_cpu_mask(desc), &online_mask);=0A+    if ( =
desc->arch.used_vectors )=0A     {=0A-        ASSERT(!test_bit(vector, =
cfg->used_vectors));=0A-        set_bit(vector, cfg->used_vectors);=0A+    =
    ASSERT(!test_bit(vector, desc->arch.used_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_unassig=
ned_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(ir=
q_desc_affinity(desc));=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, irq_desc_cpu_mask(desc), &cpu_online_map);=0A =
=0A     for_each_cpu_mask(cpu, tmp_mask) {=0A         ASSERT( per_cpu(vecto=
r_irq, cpu)[vector] =3D=3D irq );=0A         per_cpu(vector_irq, cpu)[vecto=
r] =3D -1;=0A     }=0A =0A-    cfg->vector =3D IRQ_VECTOR_UNASSIGNED;=0A-  =
  cpumask_clear(&cfg->cpu_mask);=0A+    desc->arch.vector =3D IRQ_VECTOR_UN=
ASSIGNED;=0A+    cpumask_clear(irq_desc_cpu_mask(desc));=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_ve=
ctors));=0A+        clear_bit(vector, desc->arch.used_vectors);=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, irq_desc_old_cpu_mask(desc), &cpu_online_map);=0A =0A     =
for_each_cpu_mask(cpu, tmp_mask) {=0A         ASSERT( per_cpu(vector_irq, =
cpu)[old_vector] =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_clear(&cfg->old_cpu_mask);=0A+    desc->arch.old_vector =3D =
IRQ_VECTOR_UNASSIGNED;=0A+    cpumask_clear(irq_desc_old_cpu_mask(desc));=
=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(old_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_vec=
tor(int irq)=0A@@ -296,25 +301,14 @@ 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->affi=
nity);=0A-    INIT_LIST_HEAD(&desc->rl_link);=0A-}=0A+    desc->arch.vector=
 =3D IRQ_VECTOR_UNASSIGNED;=0A+    desc->arch.old_vector =3D IRQ_VECTOR_UNA=
SSIGNED;=0A+    cpumask_clear(irq_desc_cpu_mask(desc));=0A+    cpumask_clea=
r(irq_desc_old_cpu_mask(desc));=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->c=
pu_mask);=0A-    cpumask_clear(&cfg->old_cpu_mask);=0A-    cfg->used_vector=
s =3D NULL;=0A-    cfg->used =3D IRQ_UNUSED;=0A+    return 0;=0A }=0A =0A =
int __init init_irq_data(void)=0A@@ -331,12 +325,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 +398,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 +422,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, =
irq_desc_cpu_mask(desc))) {=0A+            desc->arch.vector =3D old_vector=
;=0A             return 0;=0A         }=0A     }=0A =0A-    if ((cfg->move_=
in_progress) || cfg->move_cleanup_count)=0A+    if ( desc->arch.move_in_pro=
gress || desc->arch.move_cleanup_count )=0A         return -EAGAIN;=0A =0A =
    err =3D -ENOSPC;=0A@@ -440,9 +436,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_ve=
ctors =3D desc->arch.used_vectors;=0A     }=0A     else=0A         =
irq_used_vectors =3D irq_get_used_vector_mask(irq);=0A@@ -485,29 +481,29 =
@@ next:=0A         current_offset =3D offset;=0A         local_irq_save(fl=
ags);=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(irq_desc_old_cpu_mask(desc)=
, irq_desc_cpu_mask(desc));=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_cop=
y(irq_desc_cpu_mask(desc), &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_ve=
ctors =3D irq_used_vectors;=0A+        desc->arch.used =3D IRQ_USED;=0A+   =
     ASSERT((desc->arch.used_vectors =3D=3D NULL)=0A+               || =
(desc->arch.used_vectors =3D=3D irq_used_vectors));=0A+        desc->arch.u=
sed_vectors =3D irq_used_vectors;=0A =0A         if (IO_APIC_IRQ(irq))=0A  =
           irq_vector[irq] =3D vector;=0A =0A-        if ( cfg->used_vector=
s )=0A+        if ( desc->arch.used_vectors )=0A         {=0A-            =
ASSERT(!test_bit(vector, cfg->used_vectors));=0A+            ASSERT(!test_b=
it(vector, desc->arch.used_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 +517,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_vec=
tor(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(irq_desc_affinity=
(desc), irq_desc_cpu_mask(desc));=0A     }=0A     spin_unlock_irqrestore(&v=
ector_lock, flags);=0A     return ret;=0A@@ -543,15 +538,16 @@ int =
assign_irq_vector(int irq)=0A void __setup_vector_irq(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_in=
itialized(desc) ||=0A+            !cpumask_test_cpu(cpu, irq_desc_cpu_mask(=
desc)))=0A             continue;=0A         vector =3D irq_to_vector(irq);=
=0A         per_cpu(vector_irq, cpu)[vector] =3D irq;=0A@@ -560,12 +556,14 =
@@ void __setup_vector_irq(int cpu)=0A =0A void move_masked_irq(struct =
irq_desc *desc)=0A {=0A+    cpumask_t *pending_mask =3D irq_desc_pending_ma=
sk(desc);=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 +578,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->pendin=
g_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_ma=
sk);=0A =0A-    cpumask_clear(&desc->pending_mask);=0A+    cpumask_clear(pe=
nding_mask);=0A }=0A =0A void move_native_irq(struct irq_desc *desc)=0A@@ =
-626,7 +624,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.vector && cpumask_test_cpu(me, &desc->arch.cp=
u_mask))=0A+        if ( vector =3D=3D desc->arch.vector &&=0A+            =
 cpumask_test_cpu(me, irq_desc_cpu_mask(desc)) )=0A             goto =
unlock;=0A =0A         irr =3D apic_read(APIC_IRR + (vector / 32 * =
0x10));=0A@@ -653,7 +652,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(irq_d=
esc_old_cpu_mask(desc));=0A =0A             if ( desc->arch.used_vectors =
)=0A             {=0A@@ -673,7 +672,7 @@ static void send_cleanup_vector(st=
ruct i=0A {=0A     cpumask_t cleanup_mask;=0A =0A-    cpumask_and(&cleanup_=
mask, &desc->arch.old_cpu_mask, &cpu_online_map);=0A+    cpumask_and(&clean=
up_mask, irq_desc_old_cpu_mask(desc), &cpu_online_map);=0A     desc->arch.m=
ove_cleanup_count =3D cpumask_weight(&cleanup_mask);=0A     genapic->send_I=
PI_mask(&cleanup_mask, IRQ_MOVE_CLEANUP_VECTOR);=0A =0A@@ -690,7 +689,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=
, irq_desc_cpu_mask(desc)) )=0A         send_cleanup_vector(desc);=0A }=0A =
=0A@@ -708,15 +708,15 @@ unsigned int set_desc_affinity(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_ve=
ctor(irq, desc, mask);=0A     unlock_vector_lock();=0A     local_irq_restor=
e(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(irq_desc_affinity(desc), =
mask);=0A+    cpumask_and(&dest_mask, mask, irq_desc_cpu_mask(desc));=0A =
=0A     return cpu_mask_to_apicid(&dest_mask);=0A }=0A@@ -730,7 +730,7 @@ =
void irq_set_affinity(struct irq_desc *d=0A     ASSERT(spin_is_locked(&desc=
->lock));=0A     desc->status &=3D ~IRQ_MOVE_PENDING;=0A     wmb();=0A-    =
cpumask_copy(&desc->pending_mask, mask);=0A+    cpumask_copy(irq_desc_pendi=
ng_mask(desc), mask);=0A     wmb();=0A     desc->status |=3D IRQ_MOVE_PENDI=
NG;=0A }=0A@@ -1992,13 +1992,13 @@ static void dump_irqs(unsigned 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+                      =
    irq_desc_affinity(desc));=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 +2073,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=
, irq_desc_affinity(desc));=0A         if ( !desc->action || cpumask_subset=
(&affinity, &cpu_online_map) )=0A         {=0A             spin_unlock(&des=
c->lock);=0A--- 2011-10-18.orig/xen/arch/x86/msi.c	2011-10-18 =
11:14:29.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/msi.c	2011-10-18 =
15:30:47.000000000 +0200=0A@@ -125,13 +125,13 @@ void msi_compose_msg(struc=
t irq_desc *de=0A     unsigned dest;=0A     int vector =3D desc->arch.vecto=
r;=0A =0A-    if ( cpumask_empty(&desc->arch.cpu_mask) ) {=0A+    if ( =
cpumask_empty(irq_desc_cpu_mask(desc)) ) {=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(irq_desc_cpu_mask(de=
sc));=0A =0A         msg->address_hi =3D MSI_ADDR_BASE_HI;=0A         =
msg->address_lo =3D=0A--- 2011-10-18.orig/xen/arch/x86/smpboot.c	=
2011-10-14 16:05:11.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/smpboot.c=
	2011-10-18 15:41:44.000000000 +0200=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_desc_cpu=
_mask(irq_to_desc(irq)), &cpu_online_map);=0A     }=0A =0A     /* IPI for =
cleanuping vectors after irq move */=0A--- 2011-10-18.orig/xen/common/Makef=
ile	2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/common/Mak=
efile	2011-10-18 15:43:44.000000000 +0200=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	1970-01-01 =
00:00:00.000000000 +0000=0A+++ 2011-10-18/xen/common/irq.c	2011-10-18 =
17:29:12.000000000 +0200=0A@@ -0,0 +1,18 @@=0A+#include <xen/config.h>=0A+#=
include <xen/irq.h>=0A+=0A+int init_one_irq_desc(struct irq_desc *desc)=0A+=
{=0A+    if (irq_desc_initialized(desc))=0A+        return 0;=0A+=0A+    =
desc->status =3D IRQ_DISABLED;=0A+    desc->handler =3D &no_irq_type;=0A+  =
  spin_lock_init(&desc->lock);=0A+    if ( !alloc_cpumask_array(desc->cpuma=
sks) )=0A+        return -ENOMEM;=0A+    cpumask_setall(irq_desc_affinity(d=
esc));=0A+    INIT_LIST_HEAD(&desc->rl_link);=0A+=0A+    return arch_init_o=
ne_irq_desc(desc);=0A+}=0A--- 2011-10-18.orig/xen/drivers/passthrough/vtd/i=
ommu.c	2011-10-18 11:18:48.000000000 +0200=0A+++ 2011-10-18/xen/drivers/pa=
ssthrough/vtd/iommu.c	2011-10-18 15:29:15.000000000 +0200=0A@@ -1965,17 =
+1965,18 @@ static int init_vtd_hw(void)=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, =
irq_desc_cpu_mask(desc));=0A =0A         clear_fault_bits(iommu);=0A =
=0A--- 2011-10-18.orig/xen/include/asm-ia64/linux-xen/asm/irq.h	2011-10-18 =
11:01:50.000000000 +0200=0A+++ 2011-10-18/xen/include/asm-ia64/linux-xen/as=
m/irq.h	2011-10-18 18:20:06.000000000 +0200=0A@@ -18,8 +18,12 @@=0A struct =
irq_cfg {=0A #define arch_irq_desc irq_cfg=0A         int  vector;=0A-     =
   cpumask_t cpu_mask;=0A };=0A+=0A+#define ARCH_IRQ_DESC_NR_CPUMASKS =
1=0A+#define irq_desc_cpu_mask(desc) arch_irq_desc_cpumask(desc, 0)=0A+=0A+=
int init_irq_data(void);=0A #endif=0A =0A static __inline__ int=0A--- =
2011-10-18.orig/xen/include/asm-x86/irq.h	2011-10-18 11:01:23.0000000=
00 +0200=0A+++ 2011-10-18/xen/include/asm-x86/irq.h	2011-10-18 =
15:38:38.000000000 +0200=0A@@ -33,14 +33,17 @@ 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         unsigned move_cleanup_count;=0A         =
vmask_t *used_vectors;=0A         u8 move_in_progress : 1;=0A         u8 =
used: 1;=0A };=0A =0A+#define ARCH_IRQ_DESC_NR_CPUMASKS 3=0A+#define =
irq_desc_cpu_mask(desc)     arch_irq_desc_cpumask(desc, 0)=0A+#define =
irq_desc_old_cpu_mask(desc) arch_irq_desc_cpumask(desc, 1)=0A+#define =
irq_desc_pending_mask(desc) arch_irq_desc_cpumask(desc, 2)=0A+=0A /* For =
use with irq_cfg.used */=0A #define IRQ_UNUSED      (0)=0A #define =
IRQ_USED        (1)=0A@@ -174,8 +177,6 @@ void __setup_vector_irq(int =
cpu);=0A void move_native_irq(struct irq_desc *);=0A void move_masked_irq(s=
truct 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--- 2011-10-18.orig/xen/include/xen/cpumask.h	=
2011-10-19 17:30:43.000000000 +0200=0A+++ 2011-10-18/xen/include/xen/cpumas=
k.h	2011-10-19 17:30:48.000000000 +0200=0A@@ -369,6 +369,36 @@ static =
inline void free_cpumask_var(cpum=0A {=0A 	xfree(mask);=0A }=0A+=0A+ty=
pedef cpumask_t (*cpumask_array_t)[];=0A+#define DECLARE_CPUMASK_ARRAY(name=
, dim) cpumask_t (*name)[dim]=0A+#define CPUMASK_ARRAY_LONGS (nr_cpumask_bi=
ts / BITS_PER_LONG)=0A+#define cpumask_array_index(arr, n) \=0A+	=
container_of((*(arr))->bits + (n) * CPUMASK_ARRAY_LONGS, \=0A+		   =
  typeof(**(arr)), bits[0])=0A+=0A+#define alloc_cpumask_array(m) =
__alloc_cpumask_array(&(m), ARRAY_SIZE(*(m)))=0A+static inline bool_t =
__alloc_cpumask_array(cpumask_array_t *mask,=0A+				=
	   unsigned int dim)=0A+{=0A+	*(void **)mask =3D xmalloc_array(un=
signed long,=0A+                                       dim * CPUMASK_ARRAY_=
LONGS);=0A+	return *mask !=3D NULL;=0A+}=0A+=0A+#define zalloc_cpumask_=
array(m) __zalloc_cpumask_array(&(m), ARRAY_SIZE(*(m)))=0A+static inline =
bool_t __zalloc_cpumask_array(cpumask_array_t *mask,=0A+			=
		    unsigned int dim)=0A+{=0A+	*(void **)mask =3D =
xzalloc_array(unsigned long,=0A+                                       dim =
* CPUMASK_ARRAY_LONGS);=0A+	return *mask !=3D NULL;=0A+}=0A+=0A+static =
inline void free_cpumask_array(cpumask_array_t mask)=0A+{=0A+	xfree(mask)=
;=0A+}=0A #else=0A typedef cpumask_t cpumask_var_t[1];=0A =0A@@ -386,6 =
+416,32 @@ static inline bool_t zalloc_cpumask_var(=0A static inline void =
free_cpumask_var(cpumask_var_t mask)=0A {=0A }=0A+=0A+typedef cpumask_t =
cpumask_array_t[];=0A+#define DECLARE_CPUMASK_ARRAY(name, dim) cpumask_t =
name[dim]=0A+#define cpumask_array_index(arr, n) (&(arr)[n])=0A+=0A+#define=
 alloc_cpumask_array(m) __alloc_cpumask_array(&(m), ARRAY_SIZE(m))=0A+stati=
c inline bool_t __alloc_cpumask_array(cpumask_array_t *mask,=0A+		=
			   unsigned int dim)=0A+{=0A+	return 1;=0A+}=0A+=
=0A+#define zalloc_cpumask_array(m) __zalloc_cpumask_array(&(m), ARRAY_SIZE=
(m))=0A+static inline bool_t __zalloc_cpumask_array(cpumask_array_t =
*mask,=0A+					    unsigned int =
dim)=0A+{=0A+	cpumask_t *m;=0A+=0A+	for (m =3D *mask; dim--; ++m)=0A+	=
	cpumask_clear(m);=0A+	return 1;=0A+}=0A+=0A+static inline void =
free_cpumask_array(cpumask_array_t mask)=0A+{=0A+}=0A #endif=0A =0A #if =
NR_CPUS > 1=0A--- 2011-10-18.orig/xen/include/xen/irq.h	2011-10-18 =
13:37:04.000000000 +0200=0A+++ 2011-10-18/xen/include/xen/irq.h	2011-10-18 =
17:29:41.000000000 +0200=0A@@ -63,6 +63,17 @@ extern unsigned int =
nr_irqs;=0A #endif=0A =0A struct msi_desc;=0A+=0A+#define ARCH_IRQ_DESC_FIR=
ST_CPUMASK 1=0A+#ifndef ARCH_IRQ_DESC_NR_CPUMASKS=0A+#define ARCH_IRQ_DESC_=
NR_CPUMASKS 0=0A+#endif=0A+=0A+#define irq_desc_cpumask(desc, idx) =
cpumask_array_index((desc)->cpumasks, idx)=0A+#define irq_desc_affinity(des=
c) irq_desc_cpumask(desc, 0)=0A+#define arch_irq_desc_cpumask(desc, idx) =
\=0A+    irq_desc_cpumask(desc, ARCH_IRQ_DESC_FIRST_CPUMASK + (idx))=0A+=0A=
 /*=0A  * This is the "IRQ descriptor", which contains various information=
=0A  * about the irq, including what kind of hardware handling it =
has,=0A@@ -76,8 +87,8 @@ 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+    DECLARE_CPUMASK_ARRAY(cpumasks,=0A+        ARCH_IRQ_DESC_FIRST_CP=
UMASK + ARCH_IRQ_DESC_NR_CPUMASKS);=0A =0A     /* irq ratelimit */=0A     =
s_time_t rl_quantum_start;=0A@@ -85,6 +96,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)->han=
dler !=3D NULL)=0A+=0A #if defined(__ia64__)=0A extern irq_desc_t =
irq_desc[NR_VECTORS];=0A =0A@@ -153,7 +169,7 @@ extern irq_desc_t =
*pirq_spin_lock_irq_de=0A =0A static inline void set_native_irq_info(unsign=
ed int irq, const cpumask_t *mask)=0A {=0A-    cpumask_copy(&irq_desc[irq].=
affinity, mask);=0A+    cpumask_copy(irq_desc_affinity(irq_to_desc(irq)), =
mask);=0A }=0A =0A unsigned int set_desc_affinity(struct irq_desc *, const =
cpumask_t *);=0A
--=__Part765995D4.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

--=__Part765995D4.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:49:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:49:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGszf-0000Rg-CF; Thu, 20 Oct 2011 06:49:11 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGss3-0006o8-O2
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:41:21 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319118075!30035965!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3994 invoked from network); 20 Oct 2011 13:41:16 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-9.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 13:41:16 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:41:16 +0100
Message-Id: <4EA0411A020000780005C7BE@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:41:14 +0100
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="=__Part4867ABEA.0__="
Subject: [Xen-devel] [PATCH 07/12] cpufreq: 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.

--=__Part4867ABEA.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

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>

--- 2011-09-20.orig/xen/arch/x86/acpi/cpufreq/cpufreq.c	2011-10-12 =
08:35:12.000000000 +0200
+++ 2011-09-20/xen/arch/x86/acpi/cpufreq/cpufreq.c	2011-10-14 =
14:55:07.000000000 +0200
@@ -446,7 +446,7 @@ static int acpi_cpufreq_target(struct cp
     if (unlikely(result))
         return -ENODEV;
=20
-    cpumask_and(&online_policy_cpus, &cpu_online_map, &policy->cpus);
+    cpumask_and(&online_policy_cpus, &cpu_online_map, policy->cpus);
=20
     next_perf_state =3D data->freq_table[next_state].index;
     if (perf->state =3D=3D next_perf_state) {
--- 2011-09-20.orig/xen/arch/x86/acpi/cpufreq/powernow.c	2011-10-14 =
09:48:25.000000000 +0200
+++ 2011-09-20/xen/arch/x86/acpi/cpufreq/powernow.c	2011-10-14 =
14:55:41.000000000 +0200
@@ -107,7 +107,7 @@ static int powernow_cpufreq_target(struc
     if (unlikely(result))
         return -ENODEV;
=20
-    cpumask_and(&online_policy_cpus, &policy->cpus, &cpu_online_map);
+    cpumask_and(&online_policy_cpus, policy->cpus, &cpu_online_map);
=20
     next_perf_state =3D data->freq_table[next_state].index;
     if (perf->state =3D=3D next_perf_state) {
@@ -206,7 +206,7 @@ static int powernow_cpufreq_cpu_init(str
         result =3D -ENODEV;
         goto err_unreg;
     }
-    cpumask_copy(&policy->cpus, cpumask_of(cpu));
+    cpumask_copy(policy->cpus, cpumask_of(cpu));
=20
     /* capability check */
     if (perf->state_count <=3D 1) {
--- 2011-09-20.orig/xen/drivers/acpi/pmstat.c	2011-09-21 16:37:46.0000000=
00 +0200
+++ 2011-09-20/xen/drivers/acpi/pmstat.c	2011-10-14 14:53:51.0000000=
00 +0200
@@ -211,11 +211,11 @@ static int get_cpufreq_para(struct xen_s
     list_for_each(pos, &cpufreq_governor_list)
         gov_num++;
=20
-    if ( (op->u.get_para.cpu_num  !=3D cpus_weight(policy->cpus)) ||
+    if ( (op->u.get_para.cpu_num  !=3D cpumask_weight(policy->cpus)) ||
          (op->u.get_para.freq_num !=3D pmpt->perf.state_count)    ||
          (op->u.get_para.gov_num  !=3D gov_num) )
     {
-        op->u.get_para.cpu_num =3D  cpus_weight(policy->cpus);
+        op->u.get_para.cpu_num =3D  cpumask_weight(policy->cpus);
         op->u.get_para.freq_num =3D pmpt->perf.state_count;
         op->u.get_para.gov_num  =3D gov_num;
         return -EAGAIN;
@@ -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_mask(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);
--- 2011-09-20.orig/xen/drivers/cpufreq/cpufreq.c	2011-10-13 =
17:34:59.000000000 +0200
+++ 2011-09-20/xen/drivers/cpufreq/cpufreq.c	2011-10-14 14:58:01.0000000=
00 +0200
@@ -53,7 +53,7 @@ static void cpufreq_cmdline_common_para(
=20
 struct cpufreq_dom {
     unsigned int	dom;
-    cpumask_t		map;
+    cpumask_var_t	map;
     struct list_head	node;
 };
 static LIST_HEAD_READ_MOSTLY(cpufreq_dom_list_head);
@@ -152,11 +152,16 @@ int cpufreq_add_cpu(unsigned int cpu)
         if (!cpufreq_dom)
             return -ENOMEM;
=20
+        if (!zalloc_cpumask_var(&cpufreq_dom->map)) {
+            xfree(cpufreq_dom);
+            return -ENOMEM;
+        }
+
         cpufreq_dom->dom =3D dom;
         list_add(&cpufreq_dom->node, &cpufreq_dom_list_head);
     } else {
         /* domain sanity check under whatever coordination type */
-        firstcpu =3D first_cpu(cpufreq_dom->map);
+        firstcpu =3D cpumask_first(cpufreq_dom->map);
         if ((perf->domain_info.coord_type !=3D
             processor_pminfo[firstcpu]->perf.domain_info.coord_type) ||
             (perf->domain_info.num_processors !=3D
@@ -181,11 +186,18 @@ int cpufreq_add_cpu(unsigned int cpu)
             goto err0;
         }
=20
+        if (!zalloc_cpumask_var(&policy->cpus)) {
+            xfree(policy);
+            ret =3D -ENOMEM;
+            goto err0;
+        }
+
         policy->cpu =3D cpu;
         per_cpu(cpufreq_cpu_policy, cpu) =3D policy;
=20
         ret =3D cpufreq_driver->init(policy);
         if (ret) {
+            free_cpumask_var(policy->cpus);
             xfree(policy);
             per_cpu(cpufreq_cpu_policy, cpu) =3D NULL;
             goto err0;
@@ -193,7 +205,7 @@ int cpufreq_add_cpu(unsigned int cpu)
         if (cpufreq_verbose)
             printk("CPU %u initialization completed\n", cpu);
     } else {
-        firstcpu =3D first_cpu(cpufreq_dom->map);
+        firstcpu =3D cpumask_first(cpufreq_dom->map);
         policy =3D per_cpu(cpufreq_cpu_policy, firstcpu);
=20
         per_cpu(cpufreq_cpu_policy, cpu) =3D policy;
@@ -201,15 +213,15 @@ int cpufreq_add_cpu(unsigned int cpu)
             printk("adding CPU %u\n", cpu);
     }
=20
-    cpu_set(cpu, policy->cpus);
-    cpu_set(cpu, cpufreq_dom->map);
+    cpumask_set_cpu(cpu, policy->cpus);
+    cpumask_set_cpu(cpu, cpufreq_dom->map);
=20
     ret =3D cpufreq_statistic_init(cpu);
     if (ret)
         goto err1;
=20
-    if (hw_all ||
-        (cpus_weight(cpufreq_dom->map) =3D=3D perf->domain_info.num_proces=
sors)) {
+    if (hw_all || (cpumask_weight(cpufreq_dom->map) =3D=3D
+                   perf->domain_info.num_processors)) {
         memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));
         policy->governor =3D NULL;
=20
@@ -238,16 +250,18 @@ err2:
     cpufreq_statistic_exit(cpu);
 err1:
     per_cpu(cpufreq_cpu_policy, cpu) =3D NULL;
-    cpu_clear(cpu, policy->cpus);
-    cpu_clear(cpu, cpufreq_dom->map);
+    cpumask_clear_cpu(cpu, policy->cpus);
+    cpumask_clear_cpu(cpu, cpufreq_dom->map);
=20
-    if (cpus_empty(policy->cpus)) {
+    if (cpumask_empty(policy->cpus)) {
         cpufreq_driver->exit(policy);
+        free_cpumask_var(policy->cpus);
         xfree(policy);
     }
 err0:
-    if (cpus_empty(cpufreq_dom->map)) {
+    if (cpumask_empty(cpufreq_dom->map)) {
         list_del(&cpufreq_dom->node);
+        free_cpumask_var(cpufreq_dom->map);
         xfree(cpufreq_dom);
     }
=20
@@ -291,24 +305,26 @@ int cpufreq_del_cpu(unsigned int cpu)
=20
     /* for HW_ALL, stop gov for each core of the _PSD domain */
     /* for SW_ALL & SW_ANY, stop gov for the 1st core of the _PSD domain =
*/
-    if (hw_all ||
-        (cpus_weight(cpufreq_dom->map) =3D=3D perf->domain_info.num_proces=
sors))
+    if (hw_all || (cpumask_weight(cpufreq_dom->map) =3D=3D
+                   perf->domain_info.num_processors))
         __cpufreq_governor(policy, CPUFREQ_GOV_STOP);
=20
     cpufreq_statistic_exit(cpu);
     per_cpu(cpufreq_cpu_policy, cpu) =3D NULL;
-    cpu_clear(cpu, policy->cpus);
-    cpu_clear(cpu, cpufreq_dom->map);
+    cpumask_clear_cpu(cpu, policy->cpus);
+    cpumask_clear_cpu(cpu, cpufreq_dom->map);
=20
-    if (cpus_empty(policy->cpus)) {
+    if (cpumask_empty(policy->cpus)) {
         cpufreq_driver->exit(policy);
+        free_cpumask_var(policy->cpus);
         xfree(policy);
     }
=20
     /* for the last cpu of the domain, clean room */
     /* It's safe here to free freq_table, drv_data and policy */
-    if (cpus_empty(cpufreq_dom->map)) {
+    if (cpumask_empty(cpufreq_dom->map)) {
         list_del(&cpufreq_dom->node);
+        free_cpumask_var(cpufreq_dom->map);
         xfree(cpufreq_dom);
     }
=20
--- 2011-09-20.orig/xen/drivers/cpufreq/cpufreq_ondemand.c	2011-05-11 =
09:58:42.000000000 +0200
+++ 2011-09-20/xen/drivers/cpufreq/cpufreq_ondemand.c	2011-10-14 =
14:58:41.000000000 +0200
@@ -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_mask(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_mask(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;
--- 2011-09-20.orig/xen/include/acpi/cpufreq/cpufreq.h	2011-06-20 =
08:41:50.000000000 +0200
+++ 2011-09-20/xen/include/acpi/cpufreq/cpufreq.h	2011-10-14 =
14:45:28.000000000 +0200
@@ -42,7 +42,7 @@ struct cpufreq_cpuinfo {
 };
=20
 struct cpufreq_policy {
-    cpumask_t           cpus;          /* affected CPUs */
+    cpumask_var_t       cpus;          /* affected CPUs */
     unsigned int        shared_type;   /* ANY or ALL affected CPUs
                                           should set cpufreq */
     unsigned int        cpu;           /* cpu nr of registered CPU */



--=__Part4867ABEA.0__=
Content-Type: text/plain; name="cpufreq-policy-alloc-cpus.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="cpufreq-policy-alloc-cpus.patch"

cpufreq: allocate CPU masks dynamically=0A=0Astruct cpufreq_policy, =
including a cpumask_t member, gets copied in=0Acpufreq_limit_change(), =
cpufreq_add_cpu(), set_cpufreq_gov(), and=0Aset_cpufreq_para(). Make the =
member a cpumask_var_t, thus reducing the=0Aamount of data needing copying =
(particularly with large NR_CPUS).=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- 2011-09-20.orig/xen/arch/x86/acpi/cpufreq/cpuf=
req.c	2011-10-12 08:35:12.000000000 +0200=0A+++ 2011-09-20/xen/arch/x86/a=
cpi/cpufreq/cpufreq.c	2011-10-14 14:55:07.000000000 +0200=0A@@ -446,7 =
+446,7 @@ static int acpi_cpufreq_target(struct cp=0A     if (unlikely(resu=
lt))=0A         return -ENODEV;=0A =0A-    cpumask_and(&online_policy_cpus,=
 &cpu_online_map, &policy->cpus);=0A+    cpumask_and(&online_policy_cpus, =
&cpu_online_map, policy->cpus);=0A =0A     next_perf_state =3D data->freq_t=
able[next_state].index;=0A     if (perf->state =3D=3D next_perf_state) =
{=0A--- 2011-09-20.orig/xen/arch/x86/acpi/cpufreq/powernow.c	2011-10-14 =
09:48:25.000000000 +0200=0A+++ 2011-09-20/xen/arch/x86/acpi/cpufreq/powerno=
w.c	2011-10-14 14:55:41.000000000 +0200=0A@@ -107,7 +107,7 @@ static =
int powernow_cpufreq_target(struc=0A     if (unlikely(result))=0A         =
return -ENODEV;=0A =0A-    cpumask_and(&online_policy_cpus, &policy->cpus, =
&cpu_online_map);=0A+    cpumask_and(&online_policy_cpus, policy->cpus, =
&cpu_online_map);=0A =0A     next_perf_state =3D data->freq_table[next_stat=
e].index;=0A     if (perf->state =3D=3D next_perf_state) {=0A@@ -206,7 =
+206,7 @@ static int powernow_cpufreq_cpu_init(str=0A         result =3D =
-ENODEV;=0A         goto err_unreg;=0A     }=0A-    cpumask_copy(&policy->c=
pus, cpumask_of(cpu));=0A+    cpumask_copy(policy->cpus, cpumask_of(cpu));=
=0A =0A     /* capability check */=0A     if (perf->state_count <=3D 1) =
{=0A--- 2011-09-20.orig/xen/drivers/acpi/pmstat.c	2011-09-21 =
16:37:46.000000000 +0200=0A+++ 2011-09-20/xen/drivers/acpi/pmstat.c	=
2011-10-14 14:53:51.000000000 +0200=0A@@ -211,11 +211,11 @@ static int =
get_cpufreq_para(struct xen_s=0A     list_for_each(pos, &cpufreq_governor_l=
ist)=0A         gov_num++;=0A =0A-    if ( (op->u.get_para.cpu_num  !=3D =
cpus_weight(policy->cpus)) ||=0A+    if ( (op->u.get_para.cpu_num  !=3D =
cpumask_weight(policy->cpus)) ||=0A          (op->u.get_para.freq_num !=3D =
pmpt->perf.state_count)    ||=0A          (op->u.get_para.gov_num  !=3D =
gov_num) )=0A     {=0A-        op->u.get_para.cpu_num =3D  cpus_weight(poli=
cy->cpus);=0A+        op->u.get_para.cpu_num =3D  cpumask_weight(policy->cp=
us);=0A         op->u.get_para.freq_num =3D pmpt->perf.state_count;=0A     =
    op->u.get_para.gov_num  =3D gov_num;=0A         return -EAGAIN;=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_mask(cpu, *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--- 2011-09-20.ori=
g/xen/drivers/cpufreq/cpufreq.c	2011-10-13 17:34:59.000000000 +0200=0A+++ =
2011-09-20/xen/drivers/cpufreq/cpufreq.c	2011-10-14 14:58:01.0000000=
00 +0200=0A@@ -53,7 +53,7 @@ static void cpufreq_cmdline_common_para(=0A =
=0A struct cpufreq_dom {=0A     unsigned int	dom;=0A-    cpumask_t		=
map;=0A+    cpumask_var_t	map;=0A     struct list_head	node;=0A =
};=0A static LIST_HEAD_READ_MOSTLY(cpufreq_dom_list_head);=0A@@ -152,11 =
+152,16 @@ int cpufreq_add_cpu(unsigned int cpu)=0A         if (!cpufreq_do=
m)=0A             return -ENOMEM;=0A =0A+        if (!zalloc_cpumask_var(&c=
pufreq_dom->map)) {=0A+            xfree(cpufreq_dom);=0A+            =
return -ENOMEM;=0A+        }=0A+=0A         cpufreq_dom->dom =3D dom;=0A   =
      list_add(&cpufreq_dom->node, &cpufreq_dom_list_head);=0A     } else =
{=0A         /* domain sanity check under whatever coordination type =
*/=0A-        firstcpu =3D first_cpu(cpufreq_dom->map);=0A+        =
firstcpu =3D cpumask_first(cpufreq_dom->map);=0A         if ((perf->domain_=
info.coord_type !=3D=0A             processor_pminfo[firstcpu]->perf.domain=
_info.coord_type) ||=0A             (perf->domain_info.num_processors =
!=3D=0A@@ -181,11 +186,18 @@ int cpufreq_add_cpu(unsigned int cpu)=0A      =
       goto err0;=0A         }=0A =0A+        if (!zalloc_cpumask_var(&poli=
cy->cpus)) {=0A+            xfree(policy);=0A+            ret =3D =
-ENOMEM;=0A+            goto err0;=0A+        }=0A+=0A         policy->cpu =
=3D cpu;=0A         per_cpu(cpufreq_cpu_policy, cpu) =3D policy;=0A =0A    =
     ret =3D cpufreq_driver->init(policy);=0A         if (ret) {=0A+       =
     free_cpumask_var(policy->cpus);=0A             xfree(policy);=0A      =
       per_cpu(cpufreq_cpu_policy, cpu) =3D NULL;=0A             goto =
err0;=0A@@ -193,7 +205,7 @@ int cpufreq_add_cpu(unsigned int cpu)=0A       =
  if (cpufreq_verbose)=0A             printk("CPU %u initialization =
completed\n", cpu);=0A     } else {=0A-        firstcpu =3D first_cpu(cpufr=
eq_dom->map);=0A+        firstcpu =3D cpumask_first(cpufreq_dom->map);=0A  =
       policy =3D per_cpu(cpufreq_cpu_policy, firstcpu);=0A =0A         =
per_cpu(cpufreq_cpu_policy, cpu) =3D policy;=0A@@ -201,15 +213,15 @@ int =
cpufreq_add_cpu(unsigned int cpu)=0A             printk("adding CPU %u\n", =
cpu);=0A     }=0A =0A-    cpu_set(cpu, policy->cpus);=0A-    cpu_set(cpu, =
cpufreq_dom->map);=0A+    cpumask_set_cpu(cpu, policy->cpus);=0A+    =
cpumask_set_cpu(cpu, cpufreq_dom->map);=0A =0A     ret =3D cpufreq_statisti=
c_init(cpu);=0A     if (ret)=0A         goto err1;=0A =0A-    if (hw_all =
||=0A-        (cpus_weight(cpufreq_dom->map) =3D=3D perf->domain_info.num_p=
rocessors)) {=0A+    if (hw_all || (cpumask_weight(cpufreq_dom->map) =
=3D=3D=0A+                   perf->domain_info.num_processors)) {=0A       =
  memcpy(&new_policy, policy, sizeof(struct cpufreq_policy));=0A         =
policy->governor =3D NULL;=0A =0A@@ -238,16 +250,18 @@ err2:=0A     =
cpufreq_statistic_exit(cpu);=0A err1:=0A     per_cpu(cpufreq_cpu_policy, =
cpu) =3D NULL;=0A-    cpu_clear(cpu, policy->cpus);=0A-    cpu_clear(cpu, =
cpufreq_dom->map);=0A+    cpumask_clear_cpu(cpu, policy->cpus);=0A+    =
cpumask_clear_cpu(cpu, cpufreq_dom->map);=0A =0A-    if (cpus_empty(policy-=
>cpus)) {=0A+    if (cpumask_empty(policy->cpus)) {=0A         cpufreq_driv=
er->exit(policy);=0A+        free_cpumask_var(policy->cpus);=0A         =
xfree(policy);=0A     }=0A err0:=0A-    if (cpus_empty(cpufreq_dom->map)) =
{=0A+    if (cpumask_empty(cpufreq_dom->map)) {=0A         list_del(&cpufre=
q_dom->node);=0A+        free_cpumask_var(cpufreq_dom->map);=0A         =
xfree(cpufreq_dom);=0A     }=0A =0A@@ -291,24 +305,26 @@ int cpufreq_del_cp=
u(unsigned int cpu)=0A =0A     /* for HW_ALL, stop gov for each core of =
the _PSD domain */=0A     /* for SW_ALL & SW_ANY, stop gov for the 1st =
core of the _PSD domain */=0A-    if (hw_all ||=0A-        (cpus_weight(cpu=
freq_dom->map) =3D=3D perf->domain_info.num_processors))=0A+    if (hw_all =
|| (cpumask_weight(cpufreq_dom->map) =3D=3D=0A+                   =
perf->domain_info.num_processors))=0A         __cpufreq_governor(policy, =
CPUFREQ_GOV_STOP);=0A =0A     cpufreq_statistic_exit(cpu);=0A     =
per_cpu(cpufreq_cpu_policy, cpu) =3D NULL;=0A-    cpu_clear(cpu, policy->cp=
us);=0A-    cpu_clear(cpu, cpufreq_dom->map);=0A+    cpumask_clear_cpu(cpu,=
 policy->cpus);=0A+    cpumask_clear_cpu(cpu, cpufreq_dom->map);=0A =0A-   =
 if (cpus_empty(policy->cpus)) {=0A+    if (cpumask_empty(policy->cpus)) =
{=0A         cpufreq_driver->exit(policy);=0A+        free_cpumask_var(poli=
cy->cpus);=0A         xfree(policy);=0A     }=0A =0A     /* for the last =
cpu of the domain, clean room */=0A     /* It's safe here to free =
freq_table, drv_data and policy */=0A-    if (cpus_empty(cpufreq_dom->map))=
 {=0A+    if (cpumask_empty(cpufreq_dom->map)) {=0A         list_del(&cpufr=
eq_dom->node);=0A+        free_cpumask_var(cpufreq_dom->map);=0A         =
xfree(cpufreq_dom);=0A     }=0A =0A--- 2011-09-20.orig/xen/drivers/cpufreq/=
cpufreq_ondemand.c	2011-05-11 09:58:42.000000000 +0200=0A+++ =
2011-09-20/xen/drivers/cpufreq/cpufreq_ondemand.c	2011-10-14 =
14:58:41.000000000 +0200=0A@@ -122,7 +122,7 @@ static void dbs_check_cpu(st=
ruct cpu_dbs=0A         return;=0A =0A     /* Get Idle Time */=0A-    =
for_each_cpu_mask(j, policy->cpus) {=0A+    for_each_cpu_mask(j, *policy->c=
pus) {=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_governor_dbs(struct cpufreq_=0A =0A        =
 dbs_enable++;=0A =0A-        for_each_cpu_mask(j, policy->cpus) {=0A+     =
   for_each_cpu_mask(j, *policy->cpus) {=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_policy =3D policy;=0A--- 2011-09-20.orig=
/xen/include/acpi/cpufreq/cpufreq.h	2011-06-20 08:41:50.000000000 =
+0200=0A+++ 2011-09-20/xen/include/acpi/cpufreq/cpufreq.h	2011-10-14 =
14:45:28.000000000 +0200=0A@@ -42,7 +42,7 @@ struct cpufreq_cpuinfo {=0A =
};=0A =0A struct cpufreq_policy {=0A-    cpumask_t           cpus;         =
 /* affected CPUs */=0A+    cpumask_var_t       cpus;          /* affected =
CPUs */=0A     unsigned int        shared_type;   /* ANY or ALL affected =
CPUs=0A                                           should set cpufreq */=0A =
    unsigned int        cpu;           /* cpu nr of registered CPU */=0A
--=__Part4867ABEA.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

--=__Part4867ABEA.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:50:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:50:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGt0m-0000pf-UA; Thu, 20 Oct 2011 06:50:20 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGssb-000707-6N
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:41:53 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319118109!36064106!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16277 invoked from network); 20 Oct 2011 13:41: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 DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 13:41:49 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:41:50 +0100
Message-Id: <4EA0413B020000780005C7C2@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:41:47 +0100
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="=__PartA8874B0B.0__="
Subject: [Xen-devel] [PATCH 08/12] x86/p2m: 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.

--=__PartA8874B0B.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- 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.0000000=
00 +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-09-12 =
08:34:38.000000000 +0200
+++ 2011-10-18/xen/arch/x86/mm/hap/nested_hap.c	2011-10-18 16:44:35.0000000=
00 +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.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/mm/p2m.c	2011-10-18 16:45:49.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_INT=
EL) )
         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);
@@ -117,6 +118,8 @@ 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) )
+        return -ENOMEM;
     p2m_initialise(d, p2m);
=20
     /* Must initialise nestedp2m unconditionally
@@ -330,6 +333,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;
     }
@@ -338,8 +344,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.
@@ -1197,7 +1207,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;
@@ -1214,7 +1224,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-09-12 08:34:38.0000000=
00 +0200
+++ 2011-10-18/xen/include/asm-x86/p2m.h	2011-10-18 16:39:34.0000000=
00 +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



--=__PartA8874B0B.0__=
Content-Type: text/plain; name="x86-p2m-dirty-cpumask-alloc.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-p2m-dirty-cpumask-alloc.patch"

x86/p2m: allocate CPU masks dynamically=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- 2011-10-18.orig/xen/arch/x86/hvm/nestedhvm.c	=
2011-10-11 17:24:46.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/hvm/neste=
dhvm.c	2011-10-18 16:45:02.000000000 +0200=0A@@ -114,9 +114,9 @@ =
nestedhvm_flushtlb_ipi(void *info)=0A void=0A nestedhvm_vmcx_flushtlb(struc=
t p2m_domain *p2m)=0A {=0A-    on_selected_cpus(&p2m->p2m_dirty_cpumask, =
nestedhvm_flushtlb_ipi,=0A+    on_selected_cpus(p2m->dirty_cpumask, =
nestedhvm_flushtlb_ipi,=0A         p2m->domain, 1);=0A-    cpumask_clear(&p=
2m->p2m_dirty_cpumask);=0A+    cpumask_clear(p2m->dirty_cpumask);=0A }=0A =
=0A bool_t=0A--- 2011-10-18.orig/xen/arch/x86/mm/hap/nested_hap.c	=
2011-09-12 08:34:38.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/mm/hap/ne=
sted_hap.c	2011-10-18 16:44:35.000000000 +0200=0A@@ -88,7 +88,7 @@ =
nestedp2m_write_p2m_entry(struct p2m_dom=0A     safe_write_pte(p, new);=0A =
=0A     if (old_flags & _PAGE_PRESENT)=0A-        flush_tlb_mask(&p2m->p2m_=
dirty_cpumask);=0A+        flush_tlb_mask(p2m->dirty_cpumask);=0A     =0A  =
   paging_unlock(d);=0A }=0A--- 2011-10-18.orig/xen/arch/x86/mm/p2m.c	=
2011-10-14 09:47:46.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/mm/p2m.c	=
2011-10-18 16:45:49.000000000 +0200=0A@@ -81,7 +81,6 @@ static void =
p2m_initialise(struct domain=0A     p2m->default_access =3D p2m_access_rwx;=
=0A =0A     p2m->cr3 =3D CR3_EADDR;=0A-    cpumask_clear(&p2m->p2m_dirty_cp=
umask);=0A =0A     if ( hap_enabled(d) && (boot_cpu_data.x86_vendor =3D=3D =
X86_VENDOR_INTEL) )=0A         ept_p2m_init(p2m);=0A@@ -102,6 +101,8 @@ =
p2m_init_nestedp2m(struct domain *d)=0A         d->arch.nested_p2m[i] =3D =
p2m =3D xzalloc(struct p2m_domain);=0A         if (p2m =3D=3D NULL)=0A     =
        return -ENOMEM;=0A+        if ( !zalloc_cpumask_var(&p2m->dirty_cpu=
mask) )=0A+            return -ENOMEM;=0A         p2m_initialise(d, =
p2m);=0A         p2m->write_p2m_entry =3D nestedp2m_write_p2m_entry;=0A    =
     list_add(&p2m->np2m_list, &p2m_get_hostp2m(d)->np2m_list);=0A@@ =
-117,6 +118,8 @@ int p2m_init(struct domain *d)=0A     p2m_get_hostp2m(d) =
=3D p2m =3D xzalloc(struct p2m_domain);=0A     if ( p2m =3D=3D NULL )=0A   =
      return -ENOMEM;=0A+    if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) =
)=0A+        return -ENOMEM;=0A     p2m_initialise(d, p2m);=0A =0A     /* =
Must initialise nestedp2m unconditionally=0A@@ -330,6 +333,9 @@ static =
void p2m_teardown_nestedp2m(struc=0A     uint8_t i;=0A =0A     for (i =3D =
0; i < MAX_NESTEDP2M; i++) {=0A+        if ( !d->arch.nested_p2m[i] )=0A+  =
          continue;=0A+        free_cpumask_var(d->arch.nested_p2m[i]->dirt=
y_cpumask);=0A         xfree(d->arch.nested_p2m[i]);=0A         d->arch.nes=
ted_p2m[i] =3D NULL;=0A     }=0A@@ -338,8 +344,12 @@ static void p2m_teardo=
wn_nestedp2m(struc=0A void p2m_final_teardown(struct domain *d)=0A {=0A    =
 /* Iterate over all p2m tables per domain */=0A-    xfree(d->arch.p2m);=0A=
-    d->arch.p2m =3D NULL;=0A+    if ( d->arch.p2m )=0A+    {=0A+        =
free_cpumask_var(d->arch.p2m->dirty_cpumask);=0A+        xfree(d->arch.p2m)=
;=0A+        d->arch.p2m =3D NULL;=0A+    }=0A =0A     /* We must teardown =
unconditionally because=0A      * we initialise them unconditionally.=0A@@ =
-1197,7 +1207,7 @@ p2m_get_nestedp2m(struct vcpu *v, uint64=0A             =
if (p2m->cr3 =3D=3D CR3_EADDR)=0A                 hvm_asid_flush_vcpu(v);=
=0A             p2m->cr3 =3D cr3;=0A-            cpu_set(v->processor, =
p2m->p2m_dirty_cpumask);=0A+            cpumask_set_cpu(v->processor, =
p2m->dirty_cpumask);=0A             p2m_unlock(p2m);=0A             =
nestedp2m_unlock(d);=0A             return p2m;=0A@@ -1214,7 +1224,7 @@ =
p2m_get_nestedp2m(struct vcpu *v, uint64=0A     p2m->cr3 =3D cr3;=0A     =
nv->nv_flushp2m =3D 0;=0A     hvm_asid_flush_vcpu(v);=0A-    cpu_set(v->pro=
cessor, p2m->p2m_dirty_cpumask);=0A+    cpumask_set_cpu(v->processor, =
p2m->dirty_cpumask);=0A     p2m_unlock(p2m);=0A     nestedp2m_unlock(d);=0A=
 =0A--- 2011-10-18.orig/xen/include/asm-x86/p2m.h	2011-09-12 =
08:34:38.000000000 +0200=0A+++ 2011-10-18/xen/include/asm-x86/p2m.h	=
2011-10-18 16:39:34.000000000 +0200=0A@@ -198,7 +198,7 @@ struct p2m_domain=
 {=0A      * this p2m and those physical cpus whose vcpu's are in=0A      =
* guestmode.=0A      */=0A-    cpumask_t          p2m_dirty_cpumask;=0A+   =
 cpumask_var_t      dirty_cpumask;=0A =0A     struct domain     *domain;   =
/* back pointer to domain */=0A =0A
--=__PartA8874B0B.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

--=__PartA8874B0B.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:51:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06: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 1RGt2I-0001JQ-0x; Thu, 20 Oct 2011 06:51:54 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGst9-0007Dw-Gd
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:42:28 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319118143!33942594!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29214 invoked from network); 20 Oct 2011 13:42:24 -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; 20 Oct 2011 13:42:24 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:42:24 +0100
Message-Id: <4EA0415F020000780005C7C6@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:42:22 +0100
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="=__Part8DA26E2E.0__="
Subject: [Xen-devel] [PATCH 09/12] cpupools: 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.

--=__Part8DA26E2E.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- 2011-10-18.orig/xen/arch/x86/domain_build.c	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/domain_build.c	2011-10-19 14:50:42.0000000=
00 +0200
@@ -885,10 +885,10 @@ int __init construct_dom0(
=20
     printk("Dom0 has maximum %u VCPUs\n", opt_dom0_max_vcpus);
=20
-    cpu =3D first_cpu(cpupool0->cpu_valid);
+    cpu =3D cpumask_first(cpupool0->cpu_valid);
     for ( i =3D 1; i < opt_dom0_max_vcpus; i++ )
     {
-        cpu =3D cycle_cpu(cpu, cpupool0->cpu_valid);
+        cpu =3D cpumask_cycle(cpu, cpupool0->cpu_valid);
         (void)alloc_vcpu(d, i, cpu);
     }
=20
--- 2011-10-18.orig/xen/arch/x86/smpboot.c	2011-10-18 15:41:44.0000000=
00 +0200
+++ 2011-10-18/xen/arch/x86/smpboot.c	2011-10-19 14:49:30.000000000 =
+0200
@@ -850,8 +850,8 @@ void __cpu_disable(void)
     remove_siblinginfo(cpu);
=20
     /* It's now safe to remove this processor from the online map */
-    cpu_clear(cpu, cpupool0->cpu_valid);
-    cpu_clear(cpu, cpu_online_map);
+    cpumask_clear_cpu(cpu, cpupool0->cpu_valid);
+    cpumask_clear_cpu(cpu, &cpu_online_map);
     fixup_irqs();
=20
     if ( cpu_disable_scheduler(cpu) )
--- 2011-10-18.orig/xen/common/cpupool.c	2011-10-12 09:02:23.0000000=
00 +0200
+++ 2011-10-18/xen/common/cpupool.c	2011-10-19 14:54:34.000000000 =
+0200
@@ -39,11 +39,18 @@ DEFINE_PER_CPU(struct cpupool *, cpupool
=20
 static struct cpupool *alloc_cpupool_struct(void)
 {
-    return xzalloc(struct cpupool);
+    struct cpupool *c =3D xzalloc(struct cpupool);
+
+    if ( c && zalloc_cpumask_var(&c->cpu_valid) )
+        return c;
+    xfree(c);
+    return NULL;
 }
=20
 static void free_cpupool_struct(struct cpupool *c)
 {
+    if ( c )
+        free_cpumask_var(c->cpu_valid);
     xfree(c);
 }
=20
@@ -191,7 +198,7 @@ static int cpupool_destroy(struct cpupoo
         spin_unlock(&cpupool_lock);
         return -ENOENT;
     }
-    if ( (c->n_dom !=3D 0) || cpus_weight(c->cpu_valid) )
+    if ( (c->n_dom !=3D 0) || cpumask_weight(c->cpu_valid) )
     {
         spin_unlock(&cpupool_lock);
         return -EBUSY;
@@ -232,7 +239,7 @@ static int cpupool_assign_cpu_locked(str
         cpupool_put(cpupool_cpu_moving);
         cpupool_cpu_moving =3D NULL;
     }
-    cpu_set(cpu, c->cpu_valid);
+    cpumask_set_cpu(cpu, c->cpu_valid);
     return 0;
 }
=20
@@ -296,10 +303,10 @@ int cpupool_unassign_cpu(struct cpupool=20
         goto out;
=20
     ret =3D 0;
-    if ( !cpu_isset(cpu, c->cpu_valid) && (cpu !=3D cpupool_moving_cpu) )
+    if ( !cpumask_test_cpu(cpu, c->cpu_valid) && (cpu !=3D cpupool_moving_=
cpu) )
         goto out;
=20
-    if ( (c->n_dom > 0) && (cpus_weight(c->cpu_valid) =3D=3D 1) &&
+    if ( (c->n_dom > 0) && (cpumask_weight(c->cpu_valid) =3D=3D 1) &&
          (cpu !=3D cpupool_moving_cpu) )
     {
         for_each_domain(d)
@@ -326,15 +333,15 @@ int cpupool_unassign_cpu(struct cpupool=20
     cpupool_moving_cpu =3D cpu;
     atomic_inc(&c->refcnt);
     cpupool_cpu_moving =3D c;
-    cpu_clear(cpu, c->cpu_valid);
+    cpumask_clear_cpu(cpu, c->cpu_valid);
     spin_unlock(&cpupool_lock);
=20
     work_cpu =3D smp_processor_id();
     if ( work_cpu =3D=3D cpu )
     {
-        work_cpu =3D first_cpu(cpupool0->cpu_valid);
+        work_cpu =3D cpumask_first(cpupool0->cpu_valid);
         if ( work_cpu =3D=3D cpu )
-            work_cpu =3D next_cpu(cpu, cpupool0->cpu_valid);
+            work_cpu =3D cpumask_next(cpu, cpupool0->cpu_valid);
     }
     return continue_hypercall_on_cpu(work_cpu, cpupool_unassign_cpu_helper=
, c);
=20
@@ -361,7 +368,7 @@ int cpupool_add_domain(struct domain *d,
         return 0;
     spin_lock(&cpupool_lock);
     c =3D cpupool_find_by_id(poolid);
-    if ( (c !=3D NULL) && cpus_weight(c->cpu_valid) )
+    if ( (c !=3D NULL) && cpumask_weight(c->cpu_valid) )
     {
         c->n_dom++;
         n_dom =3D c->n_dom;
@@ -418,7 +425,7 @@ static int cpupool_cpu_remove(unsigned i
     int ret =3D 0;
 =09
     spin_lock(&cpupool_lock);
-    if ( !cpu_isset(cpu, cpupool0->cpu_valid))
+    if ( !cpumask_test_cpu(cpu, cpupool0->cpu_valid))
         ret =3D -EBUSY;
     else
         cpu_set(cpu, cpupool_locked_cpus);
@@ -473,7 +480,7 @@ int cpupool_do_sysctl(struct xen_sysctl_
         op->cpupool_id =3D c->cpupool_id;
         op->sched_id =3D c->sched->sched_id;
         op->n_dom =3D c->n_dom;
-        ret =3D cpumask_to_xenctl_cpumap(&op->cpumap, &c->cpu_valid);
+        ret =3D cpumask_to_xenctl_cpumap(&op->cpumap, c->cpu_valid);
         cpupool_put(c);
     }
     break;
@@ -516,7 +523,7 @@ int cpupool_do_sysctl(struct xen_sysctl_
             break;
         cpu =3D op->cpu;
         if ( cpu =3D=3D XEN_SYSCTL_CPUPOOL_PAR_ANY )
-            cpu =3D last_cpu(c->cpu_valid);
+            cpu =3D cpumask_last(c->cpu_valid);
         ret =3D (cpu < nr_cpu_ids) ? cpupool_unassign_cpu(c, cpu) : =
-EINVAL;
         cpupool_put(c);
     }
@@ -550,7 +557,7 @@ int cpupool_do_sysctl(struct xen_sysctl_
         ret =3D -ENOENT;
         spin_lock(&cpupool_lock);
         c =3D cpupool_find_by_id(op->cpupool_id);
-        if ( (c !=3D NULL) && cpus_weight(c->cpu_valid) )
+        if ( (c !=3D NULL) && cpumask_weight(c->cpu_valid) )
         {
             d->cpupool->n_dom--;
             ret =3D sched_move_domain(d, c);
--- 2011-10-18.orig/xen/common/domctl.c	2011-10-18 13:41:58.000000000 =
+0200
+++ 2011-10-18/xen/common/domctl.c	2011-10-19 14:51:14.000000000 =
+0200
@@ -502,7 +502,7 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
             goto maxvcpu_out;
=20
         ret =3D -ENOMEM;
-        online =3D (d->cpupool =3D=3D NULL) ? &cpu_online_map : &d->cpupoo=
l->cpu_valid;
+        online =3D (d->cpupool =3D=3D NULL) ? &cpu_online_map : d->cpupool=
->cpu_valid;
         if ( max > d->max_vcpus )
         {
             struct vcpu **vcpus;
--- 2011-10-18.orig/xen/common/sched_credit.c	2011-10-14 16:01:03.0000000=
00 +0200
+++ 2011-10-18/xen/common/sched_credit.c	2011-10-19 14:51:53.0000000=
00 +0200
@@ -73,7 +73,7 @@
 #define CSCHED_DOM(_dom)    ((struct csched_dom *) (_dom)->sched_priv)
 #define RUNQ(_cpu)          (&(CSCHED_PCPU(_cpu)->runq))
 #define CSCHED_CPUONLINE(_pool)    \
-    (((_pool) =3D=3D NULL) ? &cpupool_free_cpus : &(_pool)->cpu_valid)
+    (((_pool) =3D=3D NULL) ? &cpupool_free_cpus : (_pool)->cpu_valid)
=20
=20
 /*
--- 2011-10-18.orig/xen/common/sched_credit2.c	2011-10-14 15:46:58.0000000=
00 +0200
+++ 2011-10-18/xen/common/sched_credit2.c	2011-10-19 14:52:06.0000000=
00 +0200
@@ -176,7 +176,7 @@ integer_param("sched_credit2_migrate_res
 #define CSCHED_VCPU(_vcpu)  ((struct csched_vcpu *) (_vcpu)->sched_priv)
 #define CSCHED_DOM(_dom)    ((struct csched_dom *) (_dom)->sched_priv)
 #define CSCHED_CPUONLINE(_pool)    \
-    (((_pool) =3D=3D NULL) ? &cpupool_free_cpus : &(_pool)->cpu_valid)
+    (((_pool) =3D=3D NULL) ? &cpupool_free_cpus : (_pool)->cpu_valid)
 /* CPU to runq_id macro */
 #define c2r(_ops, _cpu)     (CSCHED_PRIV(_ops)->runq_map[(_cpu)])
 /* CPU to runqueue struct macro */
--- 2011-10-18.orig/xen/common/sched_sedf.c	2011-10-07 09:18:14.0000000=
00 +0200
+++ 2011-10-18/xen/common/sched_sedf.c	2011-10-19 14:52:35.000000000 =
+0200
@@ -22,7 +22,7 @@
     } while ( 0 )
=20
 #define SEDF_CPUONLINE(_pool)                                             =
\
-    (((_pool) =3D=3D NULL) ? &cpupool_free_cpus : &(_pool)->cpu_valid)
+    (((_pool) =3D=3D NULL) ? &cpupool_free_cpus : (_pool)->cpu_valid)
=20
 #ifndef NDEBUG
 #define SEDF_STATS
--- 2011-10-18.orig/xen/common/schedule.c	2011-10-11 17:56:50.0000000=
00 +0200
+++ 2011-10-18/xen/common/schedule.c	2011-10-19 14:54:07.000000000 =
+0200
@@ -74,7 +74,7 @@ static struct scheduler __read_mostly op
 #define VCPU2OP(_v)   (DOM2OP((_v)->domain))
 #define VCPU2ONLINE(_v)                                                   =
 \
          (((_v)->domain->cpupool =3D=3D NULL) ? &cpu_online_map           =
     \
-         : &(_v)->domain->cpupool->cpu_valid)
+         : (_v)->domain->cpupool->cpu_valid)
=20
 static inline void trace_runstate_change(struct vcpu *v, int new_state)
 {
@@ -258,7 +258,7 @@ int sched_move_domain(struct domain *d,=20
=20
     domain_pause(d);
=20
-    new_p =3D first_cpu(c->cpu_valid);
+    new_p =3D cpumask_first(c->cpu_valid);
     for_each_vcpu ( d, v )
     {
         migrate_timer(&v->periodic_timer, new_p);
@@ -273,7 +273,7 @@ int sched_move_domain(struct domain *d,=20
         v->sched_priv =3D vcpu_priv[v->vcpu_id];
         evtchn_move_pirqs(v);
=20
-        new_p =3D cycle_cpu(new_p, c->cpu_valid);
+        new_p =3D cpumask_cycle(new_p, c->cpu_valid);
=20
         SCHED_OP(VCPU2OP(v), insert_vcpu, v);
     }
@@ -431,13 +431,13 @@ static void vcpu_migrate(struct vcpu *v)
             if ( pick_called &&
                  (new_lock =3D=3D per_cpu(schedule_data, new_cpu).schedule=
_lock) &&
                  cpumask_test_cpu(new_cpu, v->cpu_affinity) &&
-                 cpu_isset(new_cpu, v->domain->cpupool->cpu_valid) )
+                 cpumask_test_cpu(new_cpu, v->domain->cpupool->cpu_valid) =
)
                 break;
=20
             /* Select a new CPU. */
             new_cpu =3D SCHED_OP(VCPU2OP(v), pick_cpu, v);
             if ( (new_lock =3D=3D per_cpu(schedule_data, new_cpu).schedule=
_lock) &&
-                 cpu_isset(new_cpu, v->domain->cpupool->cpu_valid) )
+                 cpumask_test_cpu(new_cpu, v->domain->cpupool->cpu_valid) =
)
                 break;
             pick_called =3D 1;
         }
@@ -549,7 +549,7 @@ int cpu_disable_scheduler(unsigned int c
         {
             vcpu_schedule_lock_irq(v);
=20
-            cpumask_and(&online_affinity, v->cpu_affinity, &c->cpu_valid);=

+            cpumask_and(&online_affinity, v->cpu_affinity, c->cpu_valid);
             if ( cpus_empty(online_affinity) &&
                  cpumask_test_cpu(cpu, v->cpu_affinity) )
             {
@@ -1446,7 +1446,7 @@ void schedule_dump(struct cpupool *c)
     cpumask_t        *cpus;
=20
     sched =3D (c =3D=3D NULL) ? &ops : c->sched;
-    cpus =3D (c =3D=3D NULL) ? &cpupool_free_cpus : &c->cpu_valid;
+    cpus =3D (c =3D=3D NULL) ? &cpupool_free_cpus : c->cpu_valid;
     printk("Scheduler: %s (%s)\n", sched->name, sched->opt_name);
     SCHED_OP(sched, dump_settings);
=20
--- 2011-10-18.orig/xen/include/xen/sched-if.h	2011-10-20 14:46:19.0000000=
00 +0200
+++ 2011-10-18/xen/include/xen/sched-if.h	2011-10-19 14:44:34.0000000=
00 +0200
@@ -192,7 +192,7 @@ extern const struct scheduler sched_arin
 struct cpupool
 {
     int              cpupool_id;
-    cpumask_t        cpu_valid;      /* all cpus assigned to pool */
+    cpumask_var_t    cpu_valid;      /* all cpus assigned to pool */
     struct cpupool   *next;
     unsigned int     n_dom;
     struct scheduler *sched;
--- 2011-10-18.orig/xen/include/xen/sched.h	2011-10-20 14:46:20.0000000=
00 +0200
+++ 2011-10-18/xen/include/xen/sched.h	2011-10-20 14:47:57.000000000 =
+0200
@@ -664,7 +664,7 @@ int cpupool_do_sysctl(struct xen_sysctl_
 void schedule_dump(struct cpupool *c);
 extern void dump_runq(unsigned char key);
=20
-#define num_cpupool_cpus(c) (cpus_weight((c)->cpu_valid))
+#define num_cpupool_cpus(c) cpumask_weight((c)->cpu_valid)
=20
 #endif /* __SCHED_H__ */
=20



--=__Part8DA26E2E.0__=
Content-Type: text/plain; name="cpupool-cpu-valid-alloc.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="cpupool-cpu-valid-alloc.patch"

cpupools: allocate CPU masks dynamically=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- 2011-10-18.orig/xen/arch/x86/domain_build.c	=
2011-10-20 14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/domain_bu=
ild.c	2011-10-19 14:50:42.000000000 +0200=0A@@ -885,10 +885,10 @@ int =
__init construct_dom0(=0A =0A     printk("Dom0 has maximum %u VCPUs\n", =
opt_dom0_max_vcpus);=0A =0A-    cpu =3D first_cpu(cpupool0->cpu_valid);=0A+=
    cpu =3D cpumask_first(cpupool0->cpu_valid);=0A     for ( i =3D 1; i < =
opt_dom0_max_vcpus; i++ )=0A     {=0A-        cpu =3D cycle_cpu(cpu, =
cpupool0->cpu_valid);=0A+        cpu =3D cpumask_cycle(cpu, cpupool0->cpu_v=
alid);=0A         (void)alloc_vcpu(d, i, cpu);=0A     }=0A =0A--- =
2011-10-18.orig/xen/arch/x86/smpboot.c	2011-10-18 15:41:44.000000000 =
+0200=0A+++ 2011-10-18/xen/arch/x86/smpboot.c	2011-10-19 14:49:30.0000000=
00 +0200=0A@@ -850,8 +850,8 @@ void __cpu_disable(void)=0A     remove_sibli=
nginfo(cpu);=0A =0A     /* It's now safe to remove this processor from the =
online map */=0A-    cpu_clear(cpu, cpupool0->cpu_valid);=0A-    cpu_clear(=
cpu, cpu_online_map);=0A+    cpumask_clear_cpu(cpu, cpupool0->cpu_valid);=
=0A+    cpumask_clear_cpu(cpu, &cpu_online_map);=0A     fixup_irqs();=0A =
=0A     if ( cpu_disable_scheduler(cpu) )=0A--- 2011-10-18.orig/xen/common/=
cpupool.c	2011-10-12 09:02:23.000000000 +0200=0A+++ 2011-10-18/xen/co=
mmon/cpupool.c	2011-10-19 14:54:34.000000000 +0200=0A@@ -39,11 +39,18 @@ =
DEFINE_PER_CPU(struct cpupool *, cpupool=0A =0A static struct cpupool =
*alloc_cpupool_struct(void)=0A {=0A-    return xzalloc(struct cpupool);=0A+=
    struct cpupool *c =3D xzalloc(struct cpupool);=0A+=0A+    if ( c && =
zalloc_cpumask_var(&c->cpu_valid) )=0A+        return c;=0A+    =
xfree(c);=0A+    return NULL;=0A }=0A =0A static void free_cpupool_struct(s=
truct cpupool *c)=0A {=0A+    if ( c )=0A+        free_cpumask_var(c->cpu_v=
alid);=0A     xfree(c);=0A }=0A =0A@@ -191,7 +198,7 @@ static int =
cpupool_destroy(struct cpupoo=0A         spin_unlock(&cpupool_lock);=0A    =
     return -ENOENT;=0A     }=0A-    if ( (c->n_dom !=3D 0) || cpus_weight(=
c->cpu_valid) )=0A+    if ( (c->n_dom !=3D 0) || cpumask_weight(c->cpu_vali=
d) )=0A     {=0A         spin_unlock(&cpupool_lock);=0A         return =
-EBUSY;=0A@@ -232,7 +239,7 @@ static int cpupool_assign_cpu_locked(str=0A  =
       cpupool_put(cpupool_cpu_moving);=0A         cpupool_cpu_moving =3D =
NULL;=0A     }=0A-    cpu_set(cpu, c->cpu_valid);=0A+    cpumask_set_cpu(cp=
u, c->cpu_valid);=0A     return 0;=0A }=0A =0A@@ -296,10 +303,10 @@ int =
cpupool_unassign_cpu(struct cpupool =0A         goto out;=0A =0A     ret =
=3D 0;=0A-    if ( !cpu_isset(cpu, c->cpu_valid) && (cpu !=3D cpupool_movin=
g_cpu) )=0A+    if ( !cpumask_test_cpu(cpu, c->cpu_valid) && (cpu !=3D =
cpupool_moving_cpu) )=0A         goto out;=0A =0A-    if ( (c->n_dom > 0) =
&& (cpus_weight(c->cpu_valid) =3D=3D 1) &&=0A+    if ( (c->n_dom > 0) && =
(cpumask_weight(c->cpu_valid) =3D=3D 1) &&=0A          (cpu !=3D cpupool_mo=
ving_cpu) )=0A     {=0A         for_each_domain(d)=0A@@ -326,15 +333,15 @@ =
int cpupool_unassign_cpu(struct cpupool =0A     cpupool_moving_cpu =3D =
cpu;=0A     atomic_inc(&c->refcnt);=0A     cpupool_cpu_moving =3D c;=0A-   =
 cpu_clear(cpu, c->cpu_valid);=0A+    cpumask_clear_cpu(cpu, c->cpu_valid);=
=0A     spin_unlock(&cpupool_lock);=0A =0A     work_cpu =3D smp_processor_i=
d();=0A     if ( work_cpu =3D=3D cpu )=0A     {=0A-        work_cpu =3D =
first_cpu(cpupool0->cpu_valid);=0A+        work_cpu =3D cpumask_first(cpupo=
ol0->cpu_valid);=0A         if ( work_cpu =3D=3D cpu )=0A-            =
work_cpu =3D next_cpu(cpu, cpupool0->cpu_valid);=0A+            work_cpu =
=3D cpumask_next(cpu, cpupool0->cpu_valid);=0A     }=0A     return =
continue_hypercall_on_cpu(work_cpu, cpupool_unassign_cpu_helper, c);=0A =
=0A@@ -361,7 +368,7 @@ int cpupool_add_domain(struct domain *d,=0A         =
return 0;=0A     spin_lock(&cpupool_lock);=0A     c =3D cpupool_find_by_id(=
poolid);=0A-    if ( (c !=3D NULL) && cpus_weight(c->cpu_valid) )=0A+    =
if ( (c !=3D NULL) && cpumask_weight(c->cpu_valid) )=0A     {=0A         =
c->n_dom++;=0A         n_dom =3D c->n_dom;=0A@@ -418,7 +425,7 @@ static =
int cpupool_cpu_remove(unsigned i=0A     int ret =3D 0;=0A 	=0A     =
spin_lock(&cpupool_lock);=0A-    if ( !cpu_isset(cpu, cpupool0->cpu_valid))=
=0A+    if ( !cpumask_test_cpu(cpu, cpupool0->cpu_valid))=0A         ret =
=3D -EBUSY;=0A     else=0A         cpu_set(cpu, cpupool_locked_cpus);=0A@@ =
-473,7 +480,7 @@ int cpupool_do_sysctl(struct xen_sysctl_=0A         =
op->cpupool_id =3D c->cpupool_id;=0A         op->sched_id =3D c->sched->sch=
ed_id;=0A         op->n_dom =3D c->n_dom;=0A-        ret =3D cpumask_to_xen=
ctl_cpumap(&op->cpumap, &c->cpu_valid);=0A+        ret =3D cpumask_to_xenct=
l_cpumap(&op->cpumap, c->cpu_valid);=0A         cpupool_put(c);=0A     =
}=0A     break;=0A@@ -516,7 +523,7 @@ int cpupool_do_sysctl(struct =
xen_sysctl_=0A             break;=0A         cpu =3D op->cpu;=0A         =
if ( cpu =3D=3D XEN_SYSCTL_CPUPOOL_PAR_ANY )=0A-            cpu =3D =
last_cpu(c->cpu_valid);=0A+            cpu =3D cpumask_last(c->cpu_valid);=
=0A         ret =3D (cpu < nr_cpu_ids) ? cpupool_unassign_cpu(c, cpu) : =
-EINVAL;=0A         cpupool_put(c);=0A     }=0A@@ -550,7 +557,7 @@ int =
cpupool_do_sysctl(struct xen_sysctl_=0A         ret =3D -ENOENT;=0A        =
 spin_lock(&cpupool_lock);=0A         c =3D cpupool_find_by_id(op->cpupool_=
id);=0A-        if ( (c !=3D NULL) && cpus_weight(c->cpu_valid) )=0A+      =
  if ( (c !=3D NULL) && cpumask_weight(c->cpu_valid) )=0A         {=0A     =
        d->cpupool->n_dom--;=0A             ret =3D sched_move_domain(d, =
c);=0A--- 2011-10-18.orig/xen/common/domctl.c	2011-10-18 13:41:58.0000000=
00 +0200=0A+++ 2011-10-18/xen/common/domctl.c	2011-10-19 14:51:14.0000000=
00 +0200=0A@@ -502,7 +502,7 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc=0A =
            goto maxvcpu_out;=0A =0A         ret =3D -ENOMEM;=0A-        =
online =3D (d->cpupool =3D=3D NULL) ? &cpu_online_map : &d->cpupool->cpu_va=
lid;=0A+        online =3D (d->cpupool =3D=3D NULL) ? &cpu_online_map : =
d->cpupool->cpu_valid;=0A         if ( max > d->max_vcpus )=0A         =
{=0A             struct vcpu **vcpus;=0A--- 2011-10-18.orig/xen/common/sche=
d_credit.c	2011-10-14 16:01:03.000000000 +0200=0A+++ 2011-10-18/xen/co=
mmon/sched_credit.c	2011-10-19 14:51:53.000000000 +0200=0A@@ -73,7 =
+73,7 @@=0A #define CSCHED_DOM(_dom)    ((struct csched_dom *) (_dom)->sche=
d_priv)=0A #define RUNQ(_cpu)          (&(CSCHED_PCPU(_cpu)->runq))=0A =
#define CSCHED_CPUONLINE(_pool)    \=0A-    (((_pool) =3D=3D NULL) ? =
&cpupool_free_cpus : &(_pool)->cpu_valid)=0A+    (((_pool) =3D=3D NULL) ? =
&cpupool_free_cpus : (_pool)->cpu_valid)=0A =0A =0A /*=0A--- 2011-10-18.ori=
g/xen/common/sched_credit2.c	2011-10-14 15:46:58.000000000 +0200=0A+++ =
2011-10-18/xen/common/sched_credit2.c	2011-10-19 14:52:06.000000000 =
+0200=0A@@ -176,7 +176,7 @@ integer_param("sched_credit2_migrate_res=0A =
#define CSCHED_VCPU(_vcpu)  ((struct csched_vcpu *) (_vcpu)->sched_priv)=0A=
 #define CSCHED_DOM(_dom)    ((struct csched_dom *) (_dom)->sched_priv)=0A =
#define CSCHED_CPUONLINE(_pool)    \=0A-    (((_pool) =3D=3D NULL) ? =
&cpupool_free_cpus : &(_pool)->cpu_valid)=0A+    (((_pool) =3D=3D NULL) ? =
&cpupool_free_cpus : (_pool)->cpu_valid)=0A /* CPU to runq_id macro */=0A =
#define c2r(_ops, _cpu)     (CSCHED_PRIV(_ops)->runq_map[(_cpu)])=0A /* =
CPU to runqueue struct macro */=0A--- 2011-10-18.orig/xen/common/sched_sedf=
.c	2011-10-07 09:18:14.000000000 +0200=0A+++ 2011-10-18/xen/common/sch=
ed_sedf.c	2011-10-19 14:52:35.000000000 +0200=0A@@ -22,7 +22,7 @@=0A =
    } while ( 0 )=0A =0A #define SEDF_CPUONLINE(_pool)                     =
                        \=0A-    (((_pool) =3D=3D NULL) ? &cpupool_free_cpu=
s : &(_pool)->cpu_valid)=0A+    (((_pool) =3D=3D NULL) ? &cpupool_free_cpus=
 : (_pool)->cpu_valid)=0A =0A #ifndef NDEBUG=0A #define SEDF_STATS=0A--- =
2011-10-18.orig/xen/common/schedule.c	2011-10-11 17:56:50.000000000 =
+0200=0A+++ 2011-10-18/xen/common/schedule.c	2011-10-19 14:54:07.0000000=
00 +0200=0A@@ -74,7 +74,7 @@ static struct scheduler __read_mostly op=0A =
#define VCPU2OP(_v)   (DOM2OP((_v)->domain))=0A #define VCPU2ONLINE(_v)    =
                                                \=0A          (((_v)->domai=
n->cpupool =3D=3D NULL) ? &cpu_online_map                \=0A-         : =
&(_v)->domain->cpupool->cpu_valid)=0A+         : (_v)->domain->cpupool->cpu=
_valid)=0A =0A static inline void trace_runstate_change(struct vcpu *v, =
int new_state)=0A {=0A@@ -258,7 +258,7 @@ int sched_move_domain(struct =
domain *d, =0A =0A     domain_pause(d);=0A =0A-    new_p =3D first_cpu(c->c=
pu_valid);=0A+    new_p =3D cpumask_first(c->cpu_valid);=0A     for_each_vc=
pu ( d, v )=0A     {=0A         migrate_timer(&v->periodic_timer, =
new_p);=0A@@ -273,7 +273,7 @@ int sched_move_domain(struct domain *d, =0A  =
       v->sched_priv =3D vcpu_priv[v->vcpu_id];=0A         evtchn_move_pirq=
s(v);=0A =0A-        new_p =3D cycle_cpu(new_p, c->cpu_valid);=0A+        =
new_p =3D cpumask_cycle(new_p, c->cpu_valid);=0A =0A         SCHED_OP(VCPU2=
OP(v), insert_vcpu, v);=0A     }=0A@@ -431,13 +431,13 @@ static void =
vcpu_migrate(struct vcpu *v)=0A             if ( pick_called &&=0A         =
         (new_lock =3D=3D per_cpu(schedule_data, new_cpu).schedule_lock) =
&&=0A                  cpumask_test_cpu(new_cpu, v->cpu_affinity) &&=0A-   =
              cpu_isset(new_cpu, v->domain->cpupool->cpu_valid) )=0A+      =
           cpumask_test_cpu(new_cpu, v->domain->cpupool->cpu_valid) )=0A   =
              break;=0A =0A             /* Select a new CPU. */=0A         =
    new_cpu =3D SCHED_OP(VCPU2OP(v), pick_cpu, v);=0A             if ( =
(new_lock =3D=3D per_cpu(schedule_data, new_cpu).schedule_lock) &&=0A-     =
            cpu_isset(new_cpu, v->domain->cpupool->cpu_valid) )=0A+        =
         cpumask_test_cpu(new_cpu, v->domain->cpupool->cpu_valid) )=0A     =
            break;=0A             pick_called =3D 1;=0A         }=0A@@ =
-549,7 +549,7 @@ int cpu_disable_scheduler(unsigned int c=0A         {=0A  =
           vcpu_schedule_lock_irq(v);=0A =0A-            cpumask_and(&onlin=
e_affinity, v->cpu_affinity, &c->cpu_valid);=0A+            cpumask_and(&on=
line_affinity, v->cpu_affinity, c->cpu_valid);=0A             if ( =
cpus_empty(online_affinity) &&=0A                  cpumask_test_cpu(cpu, =
v->cpu_affinity) )=0A             {=0A@@ -1446,7 +1446,7 @@ void schedule_d=
ump(struct cpupool *c)=0A     cpumask_t        *cpus;=0A =0A     sched =3D =
(c =3D=3D NULL) ? &ops : c->sched;=0A-    cpus =3D (c =3D=3D NULL) ? =
&cpupool_free_cpus : &c->cpu_valid;=0A+    cpus =3D (c =3D=3D NULL) ? =
&cpupool_free_cpus : c->cpu_valid;=0A     printk("Scheduler: %s (%s)\n", =
sched->name, sched->opt_name);=0A     SCHED_OP(sched, dump_settings);=0A =
=0A--- 2011-10-18.orig/xen/include/xen/sched-if.h	2011-10-20 =
14:46:19.000000000 +0200=0A+++ 2011-10-18/xen/include/xen/sched-if.h	=
2011-10-19 14:44:34.000000000 +0200=0A@@ -192,7 +192,7 @@ extern const =
struct scheduler sched_arin=0A struct cpupool=0A {=0A     int              =
cpupool_id;=0A-    cpumask_t        cpu_valid;      /* all cpus assigned =
to pool */=0A+    cpumask_var_t    cpu_valid;      /* all cpus assigned to =
pool */=0A     struct cpupool   *next;=0A     unsigned int     n_dom;=0A   =
  struct scheduler *sched;=0A--- 2011-10-18.orig/xen/include/xen/sched.h	=
2011-10-20 14:46:20.000000000 +0200=0A+++ 2011-10-18/xen/include/xen/sched.=
h	2011-10-20 14:47:57.000000000 +0200=0A@@ -664,7 +664,7 @@ int =
cpupool_do_sysctl(struct xen_sysctl_=0A void schedule_dump(struct cpupool =
*c);=0A extern void dump_runq(unsigned char key);=0A =0A-#define num_cpupoo=
l_cpus(c) (cpus_weight((c)->cpu_valid))=0A+#define num_cpupool_cpus(c) =
cpumask_weight((c)->cpu_valid)=0A =0A #endif /* __SCHED_H__ */=0A =0A
--=__Part8DA26E2E.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

--=__Part8DA26E2E.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:53:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:53:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGt3M-0001iM-SJ; Thu, 20 Oct 2011 06:53:00 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGstd-0007Lq-Mc
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:42:58 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319118174!33942673!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30637 invoked from network); 20 Oct 2011 13:42:54 -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; 20 Oct 2011 13:42:54 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:42:55 +0100
Message-Id: <4EA0417C020000780005C7EF@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:42:52 +0100
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="=__PartEFC00C4C.0__="
Subject: [Xen-devel] [PATCH 10/12] credit: 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.

--=__PartEFC00C4C.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- 2011-10-18.orig/xen/common/sched_credit.c	2011-10-19 14:51:53.0000000=
00 +0200
+++ 2011-10-18/xen/common/sched_credit.c	2011-10-19 15:13:52.0000000=
00 +0200
@@ -166,8 +166,8 @@ struct csched_private {
     uint32_t ncpus;
     struct timer  master_ticker;
     unsigned int master;
-    cpumask_t idlers;
-    cpumask_t cpus;
+    cpumask_var_t idlers;
+    cpumask_var_t cpus;
     uint32_t weight;
     uint32_t credit;
     int credit_balance;
@@ -283,7 +283,7 @@ __runq_tickle(unsigned int cpu, struct c
      */
     if ( cur->pri > CSCHED_PRI_IDLE )
     {
-        if ( cpumask_empty(&prv->idlers) )
+        if ( cpumask_empty(prv->idlers) )
         {
             CSCHED_STAT_CRANK(tickle_idlers_none);
         }
@@ -291,7 +291,7 @@ __runq_tickle(unsigned int cpu, struct c
         {
             cpumask_t idle_mask;
=20
-            cpumask_and(&idle_mask, &prv->idlers, new->vcpu->cpu_affinity)=
;
+            cpumask_and(&idle_mask, prv->idlers, new->vcpu->cpu_affinity);=

             if ( !cpumask_empty(&idle_mask) )
             {
                 CSCHED_STAT_CRANK(tickle_idlers_some);
@@ -327,11 +327,11 @@ csched_free_pdata(const struct scheduler
=20
     prv->credit -=3D prv->credits_per_tslice;
     prv->ncpus--;
-    cpu_clear(cpu, prv->idlers);
-    cpu_clear(cpu, prv->cpus);
+    cpumask_clear_cpu(cpu, prv->idlers);
+    cpumask_clear_cpu(cpu, prv->cpus);
     if ( (prv->master =3D=3D cpu) && (prv->ncpus > 0) )
     {
-        prv->master =3D first_cpu(prv->cpus);
+        prv->master =3D cpumask_first(prv->cpus);
         migrate_timer(&prv->master_ticker, prv->master);
     }
     kill_timer(&spc->ticker);
@@ -360,7 +360,7 @@ csched_alloc_pdata(const struct schedule
     /* Initialize/update system-wide config */
     prv->credit +=3D prv->credits_per_tslice;
     prv->ncpus++;
-    cpu_set(cpu, prv->cpus);
+    cpumask_set_cpu(cpu, prv->cpus);
     if ( prv->ncpus =3D=3D 1 )
     {
         prv->master =3D cpu;
@@ -380,7 +380,7 @@ csched_alloc_pdata(const struct schedule
=20
     /* Start off idling... */
     BUG_ON(!is_idle_vcpu(per_cpu(schedule_data, cpu).curr));
-    cpu_set(cpu, prv->idlers);
+    cpumask_set_cpu(cpu, prv->idlers);
=20
     spin_unlock_irqrestore(&prv->lock, flags);
=20
@@ -488,7 +488,7 @@ _csched_cpu_pick(const struct scheduler=20
      * like run two VCPUs on co-hyperthreads while there are idle cores
      * or sockets.
      */
-    cpumask_and(&idlers, &cpu_online_map, &CSCHED_PRIV(ops)->idlers);
+    cpumask_and(&idlers, &cpu_online_map, CSCHED_PRIV(ops)->idlers);
     cpumask_set_cpu(cpu, &idlers);
     cpumask_and(&cpus, &cpus, &idlers);
     cpumask_clear_cpu(cpu, &cpus);
@@ -1242,7 +1242,7 @@ csched_load_balance(struct csched_privat
      * Peek at non-idling CPUs in the system, starting with our
      * immediate neighbour.
      */
-    cpumask_andnot(&workers, online, &prv->idlers);
+    cpumask_andnot(&workers, online, prv->idlers);
     cpumask_clear_cpu(cpu, &workers);
     peer_cpu =3D cpu;
=20
@@ -1356,12 +1356,12 @@ csched_schedule(
      */
     if ( snext->pri =3D=3D CSCHED_PRI_IDLE )
     {
-        if ( !cpu_isset(cpu, prv->idlers) )
-            cpu_set(cpu, prv->idlers);
+        if ( !cpumask_test_cpu(cpu, prv->idlers) )
+            cpumask_set_cpu(cpu, prv->idlers);
     }
-    else if ( cpu_isset(cpu, prv->idlers) )
+    else if ( cpumask_test_cpu(cpu, prv->idlers) )
     {
-        cpu_clear(cpu, prv->idlers);
+        cpumask_clear_cpu(cpu, prv->idlers);
     }
=20
     if ( !is_idle_vcpu(snext->vcpu) )
@@ -1481,7 +1481,7 @@ csched_dump(const struct scheduler *ops)
            prv->ticks_per_tslice,
            vcpu_migration_delay);
=20
-    cpumask_scnprintf(idlers_buf, sizeof(idlers_buf), &prv->idlers);
+    cpumask_scnprintf(idlers_buf, sizeof(idlers_buf), prv->idlers);
     printk("idlers: %s\n", idlers_buf);
=20
     printk("active vcpus:\n");
@@ -1513,6 +1513,13 @@ csched_init(struct scheduler *ops)
     prv =3D xzalloc(struct csched_private);
     if ( prv =3D=3D NULL )
         return -ENOMEM;
+    if ( !zalloc_cpumask_var(&prv->cpus) ||
+         !zalloc_cpumask_var(&prv->idlers) )
+    {
+        free_cpumask_var(prv->cpus);
+        xfree(prv);
+        return -ENOMEM;
+    }
=20
     ops->sched_data =3D prv;
     spin_lock_init(&prv->lock);
@@ -1536,7 +1543,11 @@ csched_deinit(const struct scheduler *op
=20
     prv =3D CSCHED_PRIV(ops);
     if ( prv !=3D NULL )
+    {
+        free_cpumask_var(prv->cpus);
+        free_cpumask_var(prv->idlers);
         xfree(prv);
+    }
 }
=20
 static void csched_tick_suspend(const struct scheduler *ops, unsigned int =
cpu)



--=__PartEFC00C4C.0__=
Content-Type: text/plain; name="credit-cpumask-alloc.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="credit-cpumask-alloc.patch"

credit: allocate CPU masks dynamically=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- 2011-10-18.orig/xen/common/sched_credit.c	=
2011-10-19 14:51:53.000000000 +0200=0A+++ 2011-10-18/xen/common/sched_credi=
t.c	2011-10-19 15:13:52.000000000 +0200=0A@@ -166,8 +166,8 @@ struct =
csched_private {=0A     uint32_t ncpus;=0A     struct timer  master_ticker;=
=0A     unsigned int master;=0A-    cpumask_t idlers;=0A-    cpumask_t =
cpus;=0A+    cpumask_var_t idlers;=0A+    cpumask_var_t cpus;=0A     =
uint32_t weight;=0A     uint32_t credit;=0A     int credit_balance;=0A@@ =
-283,7 +283,7 @@ __runq_tickle(unsigned int cpu, struct c=0A      */=0A    =
 if ( cur->pri > CSCHED_PRI_IDLE )=0A     {=0A-        if ( cpumask_empty(&=
prv->idlers) )=0A+        if ( cpumask_empty(prv->idlers) )=0A         =
{=0A             CSCHED_STAT_CRANK(tickle_idlers_none);=0A         }=0A@@ =
-291,7 +291,7 @@ __runq_tickle(unsigned int cpu, struct c=0A         {=0A  =
           cpumask_t idle_mask;=0A =0A-            cpumask_and(&idle_mask, =
&prv->idlers, new->vcpu->cpu_affinity);=0A+            cpumask_and(&idle_ma=
sk, prv->idlers, new->vcpu->cpu_affinity);=0A             if ( !cpumask_emp=
ty(&idle_mask) )=0A             {=0A                 CSCHED_STAT_CRANK(tick=
le_idlers_some);=0A@@ -327,11 +327,11 @@ csched_free_pdata(const struct =
scheduler=0A =0A     prv->credit -=3D prv->credits_per_tslice;=0A     =
prv->ncpus--;=0A-    cpu_clear(cpu, prv->idlers);=0A-    cpu_clear(cpu, =
prv->cpus);=0A+    cpumask_clear_cpu(cpu, prv->idlers);=0A+    cpumask_clea=
r_cpu(cpu, prv->cpus);=0A     if ( (prv->master =3D=3D cpu) && (prv->ncpus =
> 0) )=0A     {=0A-        prv->master =3D first_cpu(prv->cpus);=0A+       =
 prv->master =3D cpumask_first(prv->cpus);=0A         migrate_timer(&prv->m=
aster_ticker, prv->master);=0A     }=0A     kill_timer(&spc->ticker);=0A@@ =
-360,7 +360,7 @@ csched_alloc_pdata(const struct schedule=0A     /* =
Initialize/update system-wide config */=0A     prv->credit +=3D prv->credit=
s_per_tslice;=0A     prv->ncpus++;=0A-    cpu_set(cpu, prv->cpus);=0A+    =
cpumask_set_cpu(cpu, prv->cpus);=0A     if ( prv->ncpus =3D=3D 1 )=0A     =
{=0A         prv->master =3D cpu;=0A@@ -380,7 +380,7 @@ csched_alloc_pdata(=
const struct schedule=0A =0A     /* Start off idling... */=0A     =
BUG_ON(!is_idle_vcpu(per_cpu(schedule_data, cpu).curr));=0A-    cpu_set(cpu=
, prv->idlers);=0A+    cpumask_set_cpu(cpu, prv->idlers);=0A =0A     =
spin_unlock_irqrestore(&prv->lock, flags);=0A =0A@@ -488,7 +488,7 @@ =
_csched_cpu_pick(const struct scheduler =0A      * like run two VCPUs on =
co-hyperthreads while there are idle cores=0A      * or sockets.=0A      =
*/=0A-    cpumask_and(&idlers, &cpu_online_map, &CSCHED_PRIV(ops)->idlers);=
=0A+    cpumask_and(&idlers, &cpu_online_map, CSCHED_PRIV(ops)->idlers);=0A=
     cpumask_set_cpu(cpu, &idlers);=0A     cpumask_and(&cpus, &cpus, =
&idlers);=0A     cpumask_clear_cpu(cpu, &cpus);=0A@@ -1242,7 +1242,7 @@ =
csched_load_balance(struct csched_privat=0A      * Peek at non-idling CPUs =
in the system, starting with our=0A      * immediate neighbour.=0A      =
*/=0A-    cpumask_andnot(&workers, online, &prv->idlers);=0A+    cpumask_an=
dnot(&workers, online, prv->idlers);=0A     cpumask_clear_cpu(cpu, =
&workers);=0A     peer_cpu =3D cpu;=0A =0A@@ -1356,12 +1356,12 @@ =
csched_schedule(=0A      */=0A     if ( snext->pri =3D=3D CSCHED_PRI_IDLE =
)=0A     {=0A-        if ( !cpu_isset(cpu, prv->idlers) )=0A-            =
cpu_set(cpu, prv->idlers);=0A+        if ( !cpumask_test_cpu(cpu, =
prv->idlers) )=0A+            cpumask_set_cpu(cpu, prv->idlers);=0A     =
}=0A-    else if ( cpu_isset(cpu, prv->idlers) )=0A+    else if ( =
cpumask_test_cpu(cpu, prv->idlers) )=0A     {=0A-        cpu_clear(cpu, =
prv->idlers);=0A+        cpumask_clear_cpu(cpu, prv->idlers);=0A     }=0A =
=0A     if ( !is_idle_vcpu(snext->vcpu) )=0A@@ -1481,7 +1481,7 @@ =
csched_dump(const struct scheduler *ops)=0A            prv->ticks_per_tslic=
e,=0A            vcpu_migration_delay);=0A =0A-    cpumask_scnprintf(idlers=
_buf, sizeof(idlers_buf), &prv->idlers);=0A+    cpumask_scnprintf(idlers_bu=
f, sizeof(idlers_buf), prv->idlers);=0A     printk("idlers: %s\n", =
idlers_buf);=0A =0A     printk("active vcpus:\n");=0A@@ -1513,6 +1513,13 =
@@ csched_init(struct scheduler *ops)=0A     prv =3D xzalloc(struct =
csched_private);=0A     if ( prv =3D=3D NULL )=0A         return =
-ENOMEM;=0A+    if ( !zalloc_cpumask_var(&prv->cpus) ||=0A+         =
!zalloc_cpumask_var(&prv->idlers) )=0A+    {=0A+        free_cpumask_var(pr=
v->cpus);=0A+        xfree(prv);=0A+        return -ENOMEM;=0A+    }=0A =
=0A     ops->sched_data =3D prv;=0A     spin_lock_init(&prv->lock);=0A@@ =
-1536,7 +1543,11 @@ csched_deinit(const struct scheduler *op=0A =0A     =
prv =3D CSCHED_PRIV(ops);=0A     if ( prv !=3D NULL )=0A+    {=0A+        =
free_cpumask_var(prv->cpus);=0A+        free_cpumask_var(prv->idlers);=0A  =
       xfree(prv);=0A+    }=0A }=0A =0A static void csched_tick_suspend(con=
st struct scheduler *ops, unsigned int cpu)=0A
--=__PartEFC00C4C.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

--=__PartEFC00C4C.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:54:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:54:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGt4U-0002Cd-DE; Thu, 20 Oct 2011 06:54:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGsuK-0007WH-1L
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:43:40 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319118216!36096048!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17034 invoked from network); 20 Oct 2011 13:43:36 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-4.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 13:43:36 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:43:37 +0100
Message-Id: <4EA041A7020000780005C7F3@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:43:35 +0100
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="=__Part341BD797.0__="
Subject: [Xen-devel] [PATCH 11/12] x86/hpet: 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.

--=__Part341BD797.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- 2011-10-18.orig/xen/arch/x86/hpet.c	2011-10-12 09:00:51.000000000 =
+0200
+++ 2011-10-18/xen/arch/x86/hpet.c	2011-10-19 15:46:36.000000000 =
+0200
@@ -33,7 +33,7 @@ struct hpet_event_channel
     unsigned long mult;
     int           shift;
     s_time_t      next_event;
-    cpumask_t     cpumask;
+    cpumask_var_t cpumask;
     spinlock_t    lock;
     void          (*event_handler)(struct hpet_event_channel *);
=20
@@ -182,14 +182,14 @@ again:
     now =3D NOW();
=20
     /* find all expired events */
-    for_each_cpu_mask(cpu, ch->cpumask)
+    for_each_cpu_mask(cpu, *ch->cpumask)
     {
         s_time_t deadline;
=20
         rmb();
         deadline =3D per_cpu(timer_deadline, cpu);
         rmb();
-        if ( !cpumask_test_cpu(cpu, &ch->cpumask) )
+        if ( !cpumask_test_cpu(cpu, ch->cpumask) )
             continue;
=20
         if ( deadline <=3D now )
@@ -377,6 +377,16 @@ static void __init hpet_fsb_cap_lookup(v
         if ( !(cfg & HPET_TN_FSB_CAP) )
             continue;
=20
+        if ( !zalloc_cpumask_var(&ch->cpumask) )
+        {
+            if ( !num_hpets_used )
+            {
+                xfree(hpet_events);
+                hpet_events =3D NULL;
+            }
+            break;
+        }
+
         ch->flags =3D 0;
         ch->idx =3D i;
=20
@@ -449,14 +459,14 @@ static void hpet_detach_channel(unsigned
     if ( cpu !=3D ch->cpu )
         return;
=20
-    if ( cpus_empty(ch->cpumask) )
+    if ( cpumask_empty(ch->cpumask) )
     {
         ch->cpu =3D -1;
         clear_bit(HPET_EVT_USED_BIT, &ch->flags);
         return;
     }
=20
-    ch->cpu =3D first_cpu(ch->cpumask);
+    ch->cpu =3D cpumask_first(ch->cpumask);
     hpet_msi_set_affinity(irq_to_desc(ch->irq), cpumask_of(ch->cpu));
 }
=20
@@ -502,7 +512,14 @@ void __init hpet_broadcast_init(void)
             return;
=20
         if ( !hpet_events )
+        {
             hpet_events =3D xzalloc(struct hpet_event_channel);
+            if ( hpet_events && !zalloc_cpumask_var(&hpet_events->cpumask)=
 )
+            {
+                xfree(hpet_events);
+                hpet_events =3D NULL;
+            }
+        }
         if ( !hpet_events )
             return;
         hpet_events->irq =3D -1;
@@ -635,7 +652,7 @@ void hpet_broadcast_enter(void)
=20
     /* Disable LAPIC timer interrupts. */
     disable_APIC_timer();
-    cpu_set(cpu, ch->cpumask);
+    cpumask_set_cpu(cpu, ch->cpumask);
=20
     spin_lock(&ch->lock);
     /* reprogram if current cpu expire time is nearer */
@@ -660,7 +677,7 @@ void hpet_broadcast_exit(void)
     if ( !reprogram_timer(per_cpu(timer_deadline, cpu)) )
         raise_softirq(TIMER_SOFTIRQ);
=20
-    cpu_clear(cpu, ch->cpumask);
+    cpumask_clear_cpu(cpu, ch->cpumask);
=20
     if ( !(ch->flags & HPET_EVT_LEGACY) )
     {




--=__Part341BD797.0__=
Content-Type: text/plain; name="x86-hpet-cpumask-alloc.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-hpet-cpumask-alloc.patch"

x86/hpet: allocate CPU masks dynamically=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- 2011-10-18.orig/xen/arch/x86/hpet.c	=
2011-10-12 09:00:51.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/hpet.c	=
2011-10-19 15:46:36.000000000 +0200=0A@@ -33,7 +33,7 @@ struct hpet_event_c=
hannel=0A     unsigned long mult;=0A     int           shift;=0A     =
s_time_t      next_event;=0A-    cpumask_t     cpumask;=0A+    cpumask_var_=
t cpumask;=0A     spinlock_t    lock;=0A     void          (*event_handler)=
(struct hpet_event_channel *);=0A =0A@@ -182,14 +182,14 @@ again:=0A     =
now =3D NOW();=0A =0A     /* find all expired events */=0A-    for_each_cpu=
_mask(cpu, ch->cpumask)=0A+    for_each_cpu_mask(cpu, *ch->cpumask)=0A     =
{=0A         s_time_t deadline;=0A =0A         rmb();=0A         deadline =
=3D per_cpu(timer_deadline, cpu);=0A         rmb();=0A-        if ( =
!cpumask_test_cpu(cpu, &ch->cpumask) )=0A+        if ( !cpumask_test_cpu(cp=
u, ch->cpumask) )=0A             continue;=0A =0A         if ( deadline =
<=3D now )=0A@@ -377,6 +377,16 @@ static void __init hpet_fsb_cap_lookup(v=
=0A         if ( !(cfg & HPET_TN_FSB_CAP) )=0A             continue;=0A =
=0A+        if ( !zalloc_cpumask_var(&ch->cpumask) )=0A+        {=0A+      =
      if ( !num_hpets_used )=0A+            {=0A+                xfree(hpet=
_events);=0A+                hpet_events =3D NULL;=0A+            }=0A+    =
        break;=0A+        }=0A+=0A         ch->flags =3D 0;=0A         =
ch->idx =3D i;=0A =0A@@ -449,14 +459,14 @@ static void hpet_detach_channel(=
unsigned=0A     if ( cpu !=3D ch->cpu )=0A         return;=0A =0A-    if ( =
cpus_empty(ch->cpumask) )=0A+    if ( cpumask_empty(ch->cpumask) )=0A     =
{=0A         ch->cpu =3D -1;=0A         clear_bit(HPET_EVT_USED_BIT, =
&ch->flags);=0A         return;=0A     }=0A =0A-    ch->cpu =3D first_cpu(c=
h->cpumask);=0A+    ch->cpu =3D cpumask_first(ch->cpumask);=0A     =
hpet_msi_set_affinity(irq_to_desc(ch->irq), cpumask_of(ch->cpu));=0A }=0A =
=0A@@ -502,7 +512,14 @@ void __init hpet_broadcast_init(void)=0A           =
  return;=0A =0A         if ( !hpet_events )=0A+        {=0A             =
hpet_events =3D xzalloc(struct hpet_event_channel);=0A+            if ( =
hpet_events && !zalloc_cpumask_var(&hpet_events->cpumask) )=0A+            =
{=0A+                xfree(hpet_events);=0A+                hpet_events =
=3D NULL;=0A+            }=0A+        }=0A         if ( !hpet_events )=0A  =
           return;=0A         hpet_events->irq =3D -1;=0A@@ -635,7 +652,7 =
@@ void hpet_broadcast_enter(void)=0A =0A     /* Disable LAPIC timer =
interrupts. */=0A     disable_APIC_timer();=0A-    cpu_set(cpu, ch->cpumask=
);=0A+    cpumask_set_cpu(cpu, ch->cpumask);=0A =0A     spin_lock(&ch->lock=
);=0A     /* reprogram if current cpu expire time is nearer */=0A@@ -660,7 =
+677,7 @@ void hpet_broadcast_exit(void)=0A     if ( !reprogram_timer(per_c=
pu(timer_deadline, cpu)) )=0A         raise_softirq(TIMER_SOFTIRQ);=0A =
=0A-    cpu_clear(cpu, ch->cpumask);=0A+    cpumask_clear_cpu(cpu, =
ch->cpumask);=0A =0A     if ( !(ch->flags & HPET_EVT_LEGACY) )=0A     {=0A
--=__Part341BD797.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

--=__Part341BD797.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:55:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:55:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGt5M-0002Zp-Ve; Thu, 20 Oct 2011 06:55:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGsur-0007dz-Gg
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:44:14 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319118249!33942907!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2414 invoked from network); 20 Oct 2011 13:44:10 -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; 20 Oct 2011 13:44:10 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 14:44:10 +0100
Message-Id: <4EA041C8020000780005C7F7@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 14:44:08 +0100
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="=__Part1B34F8B8.0__="
Subject: [Xen-devel] [PATCH 12/12] cpumask <=> xenctl_cpumap: allocate CPU
	masks and byte maps 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.

--=__Part1B34F8B8.0__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Generally there was a NR_CPUS-bits wide array in these functions and
another (through a cpumask_t) on their callers' stacks, which may get
a little large for big NR_CPUS. As the functions can fail anyway, do
the allocation in there.

For the x86/MCA case this require a little code restructuring: By using
different CPU mask accessors it was possible to avoid allocating a mask
in the broadcast case. Also, this was the only user that failed to
check the return value of the conversion function (which could have led
to undefined behvior).

Also constify the input parameters of the two functions.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- 2011-10-18.orig/xen/arch/x86/cpu/mcheck/mce.c	2011-10-11 =
17:22:32.000000000 +0200
+++ 2011-10-18/xen/arch/x86/cpu/mcheck/mce.c	2011-10-19 17:04:36.0000000=
00 +0200
@@ -1531,25 +1531,28 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u
=20
     case XEN_MC_inject_v2:
     {
-        cpumask_t cpumap;
+        const cpumask_t *cpumap;
+        cpumask_var_t cmv;
=20
         if (nr_mce_banks =3D=3D 0)
             return x86_mcerr("do_mca #MC", -ENODEV);
=20
         if ( op->u.mc_inject_v2.flags & XEN_MC_INJECT_CPU_BROADCAST )
-            cpumask_copy(&cpumap, &cpu_online_map);
+            cpumap =3D &cpu_online_map;
         else
         {
-            int gcw;
-
-            xenctl_cpumap_to_cpumask(&cpumap,
-                                     &op->u.mc_inject_v2.cpumap);
-            gcw =3D cpumask_weight(&cpumap);
-            cpumask_and(&cpumap, &cpu_online_map, &cpumap);
-
-            if ( cpumask_empty(&cpumap) )
-                return x86_mcerr("No online CPU passed\n", -EINVAL);
-            else if ( gcw !=3D cpumask_weight(&cpumap) )
+            ret =3D xenctl_cpumap_to_cpumask(&cmv,
+                                           &op->u.mc_inject_v2.cpumap);
+            if ( ret )
+                break;
+            cpumap =3D cmv;
+            if ( !cpumask_intersects(cpumap, &cpu_online_map) )
+            {
+                free_cpumask_var(cmv);
+                ret =3D x86_mcerr("No online CPU passed\n", -EINVAL);
+                break;
+            }
+            if ( !cpumask_subset(cpumap, &cpu_online_map) )
                 dprintk(XENLOG_INFO,
                         "Not all required CPUs are online\n");
         }
@@ -1558,19 +1561,25 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u
         {
         case XEN_MC_INJECT_TYPE_MCE:
             if ( mce_broadcast &&
-                 !cpumask_equal(&cpumap, &cpu_online_map) )
+                 !cpumask_equal(cpumap, &cpu_online_map) )
                 printk("Not trigger MCE on all CPUs, may HANG!\n");
-            on_selected_cpus(&cpumap, x86_mc_mceinject, NULL, 1);
+            on_selected_cpus(cpumap, x86_mc_mceinject, NULL, 1);
             break;
         case XEN_MC_INJECT_TYPE_CMCI:
             if ( !cmci_support )
-                return x86_mcerr(
+                ret =3D x86_mcerr(
                     "No CMCI supported in platform\n", -EINVAL);
-            on_selected_cpus(&cpumap, x86_cmci_inject, NULL, 1);
+            else
+                on_selected_cpus(cpumap, x86_cmci_inject, NULL, 1);
             break;
         default:
-            return x86_mcerr("Wrong mca type\n", -EINVAL);
+            ret =3D x86_mcerr("Wrong mca type\n", -EINVAL);
+            break;
         }
+
+        if (cpumap !=3D &cpu_online_map)
+            free_cpumask_var(cmv);
+
         break;
     }
=20
--- 2011-10-18.orig/xen/arch/x86/platform_hypercall.c	2011-10-20 =
14:47:11.000000000 +0200
+++ 2011-10-18/xen/arch/x86/platform_hypercall.c	2011-10-20 =
14:48:09.000000000 +0200
@@ -346,7 +346,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe
         uint32_t cpu;
         uint64_t idletime, now =3D NOW();
         struct xenctl_cpumap ctlmap;
-        cpumask_t cpumap;
+        cpumask_var_t cpumap;
         XEN_GUEST_HANDLE(uint8) cpumap_bitmap;
         XEN_GUEST_HANDLE(uint64) idletimes;
=20
@@ -366,22 +366,26 @@ 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_mask ( cpu, *cpumap )
         {
             if ( idle_vcpu[cpu] =3D=3D NULL )
-                cpu_clear(cpu, cpumap);
+                cpumask_clear_cpu(cpu, cpumap);
             idletime =3D get_cpu_idle_time(cpu);
=20
-            ret =3D -EFAULT;
             if ( copy_to_guest_offset(idletimes, cpu, &idletime, 1) )
-                goto out;
+            {
+                ret =3D -EFAULT;
+                break;
+            }
         }
=20
         op->u.getidletime.now =3D now;
-        if ( (ret =3D cpumask_to_xenctl_cpumap(&ctlmap, &cpumap)) !=3D 0 =
)
-            goto out;
+        if ( ret =3D=3D 0 )
+            ret =3D cpumask_to_xenctl_cpumap(&ctlmap, cpumap);
+        free_cpumask_var(cpumap);
=20
-        ret =3D copy_to_guest(u_xenpf_op, op, 1) ? -EFAULT : 0;
+        if ( ret =3D=3D 0 && copy_to_guest(u_xenpf_op, op, 1) )
+            ret =3D -EFAULT;
     }
     break;
=20
--- 2011-10-18.orig/xen/common/domctl.c	2011-10-19 14:51:14.000000000 =
+0200
+++ 2011-10-18/xen/common/domctl.c	2011-10-19 17:31:18.000000000 =
+0200
@@ -30,11 +30,15 @@
 static DEFINE_SPINLOCK(domctl_lock);
=20
 int cpumask_to_xenctl_cpumap(
-    struct xenctl_cpumap *xenctl_cpumap, cpumask_t *cpumask)
+    struct xenctl_cpumap *xenctl_cpumap, const cpumask_t *cpumask)
 {
     unsigned int guest_bytes, copy_bytes, i;
     uint8_t zero =3D 0;
-    uint8_t bytemap[(NR_CPUS + 7) / 8];
+    int err =3D 0;
+    uint8_t *bytemap =3D xmalloc_array(uint8_t, (nr_cpu_ids + 7) / 8);
+
+    if ( !bytemap )
+        return -ENOMEM;
=20
     guest_bytes =3D (xenctl_cpumap->nr_cpus + 7) / 8;
     copy_bytes  =3D min_t(unsigned int, guest_bytes, (nr_cpu_ids + 7) / =
8);
@@ -43,37 +47,48 @@ int cpumask_to_xenctl_cpumap(
=20
     if ( copy_bytes !=3D 0 )
         if ( copy_to_guest(xenctl_cpumap->bitmap, bytemap, copy_bytes) )
-            return -EFAULT;
+            err =3D -EFAULT;
=20
-    for ( i =3D copy_bytes; i < guest_bytes; i++ )
+    for ( i =3D copy_bytes; !err && i < guest_bytes; i++ )
         if ( copy_to_guest_offset(xenctl_cpumap->bitmap, i, &zero, 1) )
-            return -EFAULT;
+            err =3D -EFAULT;
=20
-    return 0;
+    xfree(bytemap);
+
+    return err;
 }
=20
 int xenctl_cpumap_to_cpumask(
-    cpumask_t *cpumask, struct xenctl_cpumap *xenctl_cpumap)
+    cpumask_var_t *cpumask, const struct xenctl_cpumap *xenctl_cpumap)
 {
     unsigned int guest_bytes, copy_bytes;
-    uint8_t bytemap[(NR_CPUS + 7) / 8];
+    int err =3D 0;
+    uint8_t *bytemap =3D xzalloc_array(uint8_t, (nr_cpu_ids + 7) / 8);
+
+    if ( !bytemap )
+        return -ENOMEM;
=20
     guest_bytes =3D (xenctl_cpumap->nr_cpus + 7) / 8;
     copy_bytes  =3D min_t(unsigned int, guest_bytes, (nr_cpu_ids + 7) / =
8);
=20
-    memset(bytemap, 0, sizeof(bytemap));
-
     if ( copy_bytes !=3D 0 )
     {
         if ( copy_from_guest(bytemap, xenctl_cpumap->bitmap, copy_bytes) =
)
-            return -EFAULT;
+            err =3D -EFAULT;
         if ( (xenctl_cpumap->nr_cpus & 7) && (guest_bytes <=3D sizeof(byte=
map)) )
             bytemap[guest_bytes-1] &=3D ~(0xff << (xenctl_cpumap->nr_cpus =
& 7));
     }
=20
-    bitmap_byte_to_long(cpumask_bits(cpumask), bytemap, nr_cpu_ids);
+    if ( err )
+        /* nothing */;
+    else if ( alloc_cpumask_var(cpumask) )
+        bitmap_byte_to_long(cpumask_bits(*cpumask), bytemap, nr_cpu_ids);
+    else
+        err =3D -ENOMEM;
=20
-    return 0;
+    xfree(bytemap);
+
+    return err;
 }
=20
 static inline int is_free_domid(domid_t dom)
@@ -558,7 +573,6 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
         domid_t dom =3D op->domain;
         struct domain *d =3D rcu_lock_domain_by_id(dom);
         struct vcpu *v;
-        cpumask_t new_affinity;
=20
         ret =3D -ESRCH;
         if ( d =3D=3D NULL )
@@ -578,10 +592,15 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc
=20
         if ( op->cmd =3D=3D XEN_DOMCTL_setvcpuaffinity )
         {
+            cpumask_var_t new_affinity;
+
             ret =3D xenctl_cpumap_to_cpumask(
                 &new_affinity, &op->u.vcpuaffinity.cpumap);
             if ( !ret )
-                ret =3D vcpu_set_affinity(v, &new_affinity);
+            {
+                ret =3D vcpu_set_affinity(v, new_affinity);
+                free_cpumask_var(new_affinity);
+            }
         }
         else
         {
--- 2011-10-18.orig/xen/common/trace.c	2011-10-12 09:06:27.000000000 =
+0200
+++ 2011-10-18/xen/common/trace.c	2011-10-19 17:05:37.000000000 =
+0200
@@ -378,7 +378,16 @@ int tb_control(xen_sysctl_tbuf_op_t *tbc
         tbc->size =3D t_info_pages * PAGE_SIZE;
         break;
     case XEN_SYSCTL_TBUFOP_set_cpu_mask:
-        rc =3D xenctl_cpumap_to_cpumask(&tb_cpu_mask, &tbc->cpu_mask);
+    {
+        cpumask_var_t mask;
+
+        rc =3D xenctl_cpumap_to_cpumask(&mask, &tbc->cpu_mask);
+        if ( !rc )
+        {
+            cpumask_copy(&tb_cpu_mask, mask);
+            free_cpumask_var(mask);
+        }
+    }
         break;
     case XEN_SYSCTL_TBUFOP_set_evt_mask:
         tb_event_mask =3D tbc->evt_mask;
--- 2011-10-18.orig/xen/include/xen/cpumask.h	2011-10-19 17:30:48.0000000=
00 +0200
+++ 2011-10-18/xen/include/xen/cpumask.h	2011-10-19 17:31:01.0000000=
00 +0200
@@ -544,9 +544,7 @@ extern cpumask_t cpu_present_map;
=20
 /* Copy to/from cpumap provided by control tools. */
 struct xenctl_cpumap;
-int cpumask_to_xenctl_cpumap(
-    struct xenctl_cpumap *enctl_cpumap, cpumask_t *cpumask);
-int xenctl_cpumap_to_cpumask(
-    cpumask_t *cpumask, struct xenctl_cpumap *enctl_cpumap);
+int cpumask_to_xenctl_cpumap(struct xenctl_cpumap *, const cpumask_t *);
+int xenctl_cpumap_to_cpumask(cpumask_var_t *, const struct xenctl_cpumap =
*);
=20
 #endif /* __XEN_CPUMASK_H */



--=__Part1B34F8B8.0__=
Content-Type: text/plain; name="xenctl-cpumap-alloc.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="xenctl-cpumap-alloc.patch"

cpumask <=3D> xenctl_cpumap: allocate CPU masks and byte maps dynamically=
=0A=0AGenerally there was a NR_CPUS-bits wide array in these functions =
and=0Aanother (through a cpumask_t) on their callers' stacks, which may =
get=0Aa little large for big NR_CPUS. As the functions can fail anyway, =
do=0Athe allocation in there.=0A=0AFor the x86/MCA case this require a =
little code restructuring: By using=0Adifferent CPU mask accessors it was =
possible to avoid allocating a mask=0Ain the broadcast case. Also, this =
was the only user that failed to=0Acheck the return value of the conversion=
 function (which could have led=0Ato undefined behvior).=0A=0AAlso =
constify the input parameters of the two functions.=0A=0ASigned-off-by: =
Jan Beulich <jbeulich@suse.com>=0A=0A--- 2011-10-18.orig/xen/arch/x86/cpu/m=
check/mce.c	2011-10-11 17:22:32.000000000 +0200=0A+++ 2011-10-18/xen/ar=
ch/x86/cpu/mcheck/mce.c	2011-10-19 17:04:36.000000000 +0200=0A@@ -1531,25 =
+1531,28 @@ long do_mca(XEN_GUEST_HANDLE(xen_mc_t) u=0A =0A     case =
XEN_MC_inject_v2:=0A     {=0A-        cpumask_t cpumap;=0A+        const =
cpumask_t *cpumap;=0A+        cpumask_var_t cmv;=0A =0A         if =
(nr_mce_banks =3D=3D 0)=0A             return x86_mcerr("do_mca #MC", =
-ENODEV);=0A =0A         if ( op->u.mc_inject_v2.flags & XEN_MC_INJECT_CPU_=
BROADCAST )=0A-            cpumask_copy(&cpumap, &cpu_online_map);=0A+     =
       cpumap =3D &cpu_online_map;=0A         else=0A         {=0A-        =
    int gcw;=0A-=0A-            xenctl_cpumap_to_cpumask(&cpumap,=0A-      =
                               &op->u.mc_inject_v2.cpumap);=0A-            =
gcw =3D cpumask_weight(&cpumap);=0A-            cpumask_and(&cpumap, =
&cpu_online_map, &cpumap);=0A-=0A-            if ( cpumask_empty(&cpumap) =
)=0A-                return x86_mcerr("No online CPU passed\n", =
-EINVAL);=0A-            else if ( gcw !=3D cpumask_weight(&cpumap) )=0A+  =
          ret =3D xenctl_cpumap_to_cpumask(&cmv,=0A+                       =
                    &op->u.mc_inject_v2.cpumap);=0A+            if ( ret =
)=0A+                break;=0A+            cpumap =3D cmv;=0A+            =
if ( !cpumask_intersects(cpumap, &cpu_online_map) )=0A+            {=0A+   =
             free_cpumask_var(cmv);=0A+                ret =3D x86_mcerr("N=
o online CPU passed\n", -EINVAL);=0A+                break;=0A+            =
}=0A+            if ( !cpumask_subset(cpumap, &cpu_online_map) )=0A        =
         dprintk(XENLOG_INFO,=0A                         "Not all required =
CPUs are online\n");=0A         }=0A@@ -1558,19 +1561,25 @@ long do_mca(XEN=
_GUEST_HANDLE(xen_mc_t) u=0A         {=0A         case XEN_MC_INJECT_TYPE_M=
CE:=0A             if ( mce_broadcast &&=0A-                 !cpumask_equal=
(&cpumap, &cpu_online_map) )=0A+                 !cpumask_equal(cpumap, =
&cpu_online_map) )=0A                 printk("Not trigger MCE on all CPUs, =
may HANG!\n");=0A-            on_selected_cpus(&cpumap, x86_mc_mceinject, =
NULL, 1);=0A+            on_selected_cpus(cpumap, x86_mc_mceinject, NULL, =
1);=0A             break;=0A         case XEN_MC_INJECT_TYPE_CMCI:=0A      =
       if ( !cmci_support )=0A-                return x86_mcerr(=0A+       =
         ret =3D x86_mcerr(=0A                     "No CMCI supported in =
platform\n", -EINVAL);=0A-            on_selected_cpus(&cpumap, x86_cmci_in=
ject, NULL, 1);=0A+            else=0A+                on_selected_cpus(cpu=
map, x86_cmci_inject, NULL, 1);=0A             break;=0A         =
default:=0A-            return x86_mcerr("Wrong mca type\n", -EINVAL);=0A+ =
           ret =3D x86_mcerr("Wrong mca type\n", -EINVAL);=0A+            =
break;=0A         }=0A+=0A+        if (cpumap !=3D &cpu_online_map)=0A+    =
        free_cpumask_var(cmv);=0A+=0A         break;=0A     }=0A =0A--- =
2011-10-18.orig/xen/arch/x86/platform_hypercall.c	2011-10-20 =
14:47:11.000000000 +0200=0A+++ 2011-10-18/xen/arch/x86/platform_hypercall.c=
	2011-10-20 14:48:09.000000000 +0200=0A@@ -346,7 +346,7 @@ ret_t =
do_platform_op(XEN_GUEST_HANDLE(xe=0A         uint32_t cpu;=0A         =
uint64_t idletime, now =3D NOW();=0A         struct xenctl_cpumap =
ctlmap;=0A-        cpumask_t cpumap;=0A+        cpumask_var_t cpumap;=0A   =
      XEN_GUEST_HANDLE(uint8) cpumap_bitmap;=0A         XEN_GUEST_HANDLE(ui=
nt64) idletimes;=0A =0A@@ -366,22 +366,26 @@ ret_t do_platform_op(XEN_GUEST=
_HANDLE(xe=0A             goto out;=0A         guest_from_compat_handle(idl=
etimes, op->u.getidletime.idletime);=0A =0A-        for_each_cpu_mask ( =
cpu, cpumap )=0A+        for_each_cpu_mask ( cpu, *cpumap )=0A         =
{=0A             if ( idle_vcpu[cpu] =3D=3D NULL )=0A-                =
cpu_clear(cpu, cpumap);=0A+                cpumask_clear_cpu(cpu, =
cpumap);=0A             idletime =3D get_cpu_idle_time(cpu);=0A =0A-       =
     ret =3D -EFAULT;=0A             if ( copy_to_guest_offset(idletimes, =
cpu, &idletime, 1) )=0A-                goto out;=0A+            {=0A+     =
           ret =3D -EFAULT;=0A+                break;=0A+            }=0A  =
       }=0A =0A         op->u.getidletime.now =3D now;=0A-        if ( =
(ret =3D cpumask_to_xenctl_cpumap(&ctlmap, &cpumap)) !=3D 0 )=0A-          =
  goto out;=0A+        if ( ret =3D=3D 0 )=0A+            ret =3D =
cpumask_to_xenctl_cpumap(&ctlmap, cpumap);=0A+        free_cpumask_var(cpum=
ap);=0A =0A-        ret =3D copy_to_guest(u_xenpf_op, op, 1) ? -EFAULT : =
0;=0A+        if ( ret =3D=3D 0 && copy_to_guest(u_xenpf_op, op, 1) )=0A+  =
          ret =3D -EFAULT;=0A     }=0A     break;=0A =0A--- 2011-10-18.orig=
/xen/common/domctl.c	2011-10-19 14:51:14.000000000 +0200=0A+++ =
2011-10-18/xen/common/domctl.c	2011-10-19 17:31:18.000000000 +0200=0A@@ =
-30,11 +30,15 @@=0A static DEFINE_SPINLOCK(domctl_lock);=0A =0A int =
cpumask_to_xenctl_cpumap(=0A-    struct xenctl_cpumap *xenctl_cpumap, =
cpumask_t *cpumask)=0A+    struct xenctl_cpumap *xenctl_cpumap, const =
cpumask_t *cpumask)=0A {=0A     unsigned int guest_bytes, copy_bytes, =
i;=0A     uint8_t zero =3D 0;=0A-    uint8_t bytemap[(NR_CPUS + 7) / =
8];=0A+    int err =3D 0;=0A+    uint8_t *bytemap =3D xmalloc_array(uint8_t=
, (nr_cpu_ids + 7) / 8);=0A+=0A+    if ( !bytemap )=0A+        return =
-ENOMEM;=0A =0A     guest_bytes =3D (xenctl_cpumap->nr_cpus + 7) / 8;=0A   =
  copy_bytes  =3D min_t(unsigned int, guest_bytes, (nr_cpu_ids + 7) / =
8);=0A@@ -43,37 +47,48 @@ int cpumask_to_xenctl_cpumap(=0A =0A     if ( =
copy_bytes !=3D 0 )=0A         if ( copy_to_guest(xenctl_cpumap->bitmap, =
bytemap, copy_bytes) )=0A-            return -EFAULT;=0A+            err =
=3D -EFAULT;=0A =0A-    for ( i =3D copy_bytes; i < guest_bytes; i++ )=0A+ =
   for ( i =3D copy_bytes; !err && i < guest_bytes; i++ )=0A         if ( =
copy_to_guest_offset(xenctl_cpumap->bitmap, i, &zero, 1) )=0A-            =
return -EFAULT;=0A+            err =3D -EFAULT;=0A =0A-    return 0;=0A+   =
 xfree(bytemap);=0A+=0A+    return err;=0A }=0A =0A int xenctl_cpumap_to_cp=
umask(=0A-    cpumask_t *cpumask, struct xenctl_cpumap *xenctl_cpumap)=0A+ =
   cpumask_var_t *cpumask, const struct xenctl_cpumap *xenctl_cpumap)=0A =
{=0A     unsigned int guest_bytes, copy_bytes;=0A-    uint8_t bytemap[(NR_C=
PUS + 7) / 8];=0A+    int err =3D 0;=0A+    uint8_t *bytemap =3D xzalloc_ar=
ray(uint8_t, (nr_cpu_ids + 7) / 8);=0A+=0A+    if ( !bytemap )=0A+        =
return -ENOMEM;=0A =0A     guest_bytes =3D (xenctl_cpumap->nr_cpus + 7) / =
8;=0A     copy_bytes  =3D min_t(unsigned int, guest_bytes, (nr_cpu_ids + =
7) / 8);=0A =0A-    memset(bytemap, 0, sizeof(bytemap));=0A-=0A     if ( =
copy_bytes !=3D 0 )=0A     {=0A         if ( copy_from_guest(bytemap, =
xenctl_cpumap->bitmap, copy_bytes) )=0A-            return -EFAULT;=0A+    =
        err =3D -EFAULT;=0A         if ( (xenctl_cpumap->nr_cpus & 7) && =
(guest_bytes <=3D sizeof(bytemap)) )=0A             bytemap[guest_bytes-1] =
&=3D ~(0xff << (xenctl_cpumap->nr_cpus & 7));=0A     }=0A =0A-    =
bitmap_byte_to_long(cpumask_bits(cpumask), bytemap, nr_cpu_ids);=0A+    if =
( err )=0A+        /* nothing */;=0A+    else if ( alloc_cpumask_var(cpumas=
k) )=0A+        bitmap_byte_to_long(cpumask_bits(*cpumask), bytemap, =
nr_cpu_ids);=0A+    else=0A+        err =3D -ENOMEM;=0A =0A-    return =
0;=0A+    xfree(bytemap);=0A+=0A+    return err;=0A }=0A =0A static inline =
int is_free_domid(domid_t dom)=0A@@ -558,7 +573,6 @@ long do_domctl(XEN_GUE=
ST_HANDLE(xen_domc=0A         domid_t dom =3D op->domain;=0A         =
struct domain *d =3D rcu_lock_domain_by_id(dom);=0A         struct vcpu =
*v;=0A-        cpumask_t new_affinity;=0A =0A         ret =3D -ESRCH;=0A   =
      if ( d =3D=3D NULL )=0A@@ -578,10 +592,15 @@ long do_domctl(XEN_GUEST=
_HANDLE(xen_domc=0A =0A         if ( op->cmd =3D=3D XEN_DOMCTL_setvcpuaffin=
ity )=0A         {=0A+            cpumask_var_t new_affinity;=0A+=0A       =
      ret =3D xenctl_cpumap_to_cpumask(=0A                 &new_affinity, =
&op->u.vcpuaffinity.cpumap);=0A             if ( !ret )=0A-                =
ret =3D vcpu_set_affinity(v, &new_affinity);=0A+            {=0A+          =
      ret =3D vcpu_set_affinity(v, new_affinity);=0A+                =
free_cpumask_var(new_affinity);=0A+            }=0A         }=0A         =
else=0A         {=0A--- 2011-10-18.orig/xen/common/trace.c	2011-10-12 =
09:06:27.000000000 +0200=0A+++ 2011-10-18/xen/common/trace.c	2011-10-19 =
17:05:37.000000000 +0200=0A@@ -378,7 +378,16 @@ int tb_control(xen_sysctl_t=
buf_op_t *tbc=0A         tbc->size =3D t_info_pages * PAGE_SIZE;=0A        =
 break;=0A     case XEN_SYSCTL_TBUFOP_set_cpu_mask:=0A-        rc =3D =
xenctl_cpumap_to_cpumask(&tb_cpu_mask, &tbc->cpu_mask);=0A+    {=0A+       =
 cpumask_var_t mask;=0A+=0A+        rc =3D xenctl_cpumap_to_cpumask(&mask, =
&tbc->cpu_mask);=0A+        if ( !rc )=0A+        {=0A+            =
cpumask_copy(&tb_cpu_mask, mask);=0A+            free_cpumask_var(mask);=0A=
+        }=0A+    }=0A         break;=0A     case XEN_SYSCTL_TBUFOP_set_evt=
_mask:=0A         tb_event_mask =3D tbc->evt_mask;=0A--- 2011-10-18.orig/xe=
n/include/xen/cpumask.h	2011-10-19 17:30:48.000000000 +0200=0A+++ =
2011-10-18/xen/include/xen/cpumask.h	2011-10-19 17:31:01.000000000 =
+0200=0A@@ -544,9 +544,7 @@ extern cpumask_t cpu_present_map;=0A =0A /* =
Copy to/from cpumap provided by control tools. */=0A struct xenctl_cpumap;=
=0A-int cpumask_to_xenctl_cpumap(=0A-    struct xenctl_cpumap *enctl_cpumap=
, cpumask_t *cpumask);=0A-int xenctl_cpumap_to_cpumask(=0A-    cpumask_t =
*cpumask, struct xenctl_cpumap *enctl_cpumap);=0A+int cpumask_to_xenctl_cpu=
map(struct xenctl_cpumap *, const cpumask_t *);=0A+int xenctl_cpumap_to_cpu=
mask(cpumask_var_t *, const struct xenctl_cpumap *);=0A =0A #endif /* =
__XEN_CPUMASK_H */=0A
--=__Part1B34F8B8.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

--=__Part1B34F8B8.0__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 06:56:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 06:56:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGt6a-00039E-Da; Thu, 20 Oct 2011 06:56:20 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGt4d-0002FL-Lc
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 06:54:20 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1319118833!45341596!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23989 invoked from network); 20 Oct 2011 13:53:54 -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;
	20 Oct 2011 13:53:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,379,1315180800"; 
   d="scan'208";a="8499945"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:54: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, 20 Oct 2011 14:54:16 +0100
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 1RGt4Z-00084P-PI;
	Thu, 20 Oct 2011 13:54:15 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RGt4Z-0007lv-Lx;
	Thu, 20 Oct 2011 14:54:15 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9350-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 20 Oct 2011 14:54:15 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9350: 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 9350 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9350/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-win          14 guest-start.2              fail REGR. vs. 9349

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-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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  a06609840ff1
baseline version:
 xen                  14b369de76ad

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Olaf Hering <olaf@aepfle.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                                     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:   23980:a06609840ff1
tag:         tip
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 20 11:25:58 2011 +0100
    
    xenpaging: disallow paging in a PoD guest
    
    Disallow xenpaging in a PoD guest until coexistance between the two features
    is properly implemented.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23979:18306b054799
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 20 11:25:58 2011 +0100
    
    xenpaging: document p2m_mem_paging functions
    
    Add some documentation for each of the p2m_mem_paging functions to describe
    what they ought to do.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23978:fd3fa0a85020
user:        Olaf Hering <olaf@aepfle.de>
date:        Thu Oct 20 11:25:55 2011 +0100
    
    xenpaging: check p2mt in p2m_mem_paging functions
    
    Add checks to forward the p2m_ram_paging* state properly during page-in.
    
    Resume can be called several times if several vcpus called populate for
    the gfn. Finish resume only once.
    
    Signed-off-by: Olaf Hering <olaf@aepfle.de>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by: Tim Deegan <tim@xen.org>
    
    
changeset:   23977:14b369de76ad
user:        Jan Beulich <jbeulich@suse.com>
date:        Wed Oct 19 12:51:42 2011 +0200
    
    x86: move generic IRQ code out of io_apic.c
    
    While doing so, eliminate the use of struct irq_cfg and convert the
    CPU mask accessors to the new style ones as far as possible.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Andrew Cooper <andrew.cooper3@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 Thu Oct 20 07:03:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 07:03:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGtDs-0003jn-65; Thu, 20 Oct 2011 07:03:53 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGtB5-0003UN-9I
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 07:01:18 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-8.tower-21.messagelabs.com!1319119249!1006878!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14127 invoked from network); 20 Oct 2011 14:00:50 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-8.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 14:00:50 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGtAr-000E2E-B5; Thu, 20 Oct 2011 14:00:45 +0000
Date: Thu, 20 Oct 2011 15:00:45 +0100
From: Tim Deegan <tim@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 08/12] x86/p2m: allocate CPU masks dynamically
Message-ID: <20111020140045.GH49983@ocelot.phlegethon.org>
References: <4EA0413B020000780005C7C2@nat28.tlf.novell.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EA0413B020000780005C7C2@nat28.tlf.novell.com>
User-Agent: Mutt/1.4.2.1i
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

Hi, 

At 14:41 +0100 on 20 Oct (1319121707), Jan Beulich wrote:
> --- 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-18 16:45:49.000000000 +0200
> @@ -81,7 +81,6 @@ static void p2m_initialise(struct domain
>      p2m->default_access = p2m_access_rwx;
>  
>      p2m->cr3 = CR3_EADDR;
> -    cpumask_clear(&p2m->p2m_dirty_cpumask);
>  
>      if ( hap_enabled(d) && (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) )
>          ept_p2m_init(p2m);
> @@ -102,6 +101,8 @@ p2m_init_nestedp2m(struct domain *d)
>          d->arch.nested_p2m[i] = p2m = xzalloc(struct p2m_domain);
>          if (p2m == NULL)
>              return -ENOMEM;
> +        if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
> +            return -ENOMEM;

This leaks 'p2m'.

>          p2m_initialise(d, p2m);
>          p2m->write_p2m_entry = nestedp2m_write_p2m_entry;
>          list_add(&p2m->np2m_list, &p2m_get_hostp2m(d)->np2m_list);
> @@ -117,6 +118,8 @@ int p2m_init(struct domain *d)
>      p2m_get_hostp2m(d) = p2m = xzalloc(struct p2m_domain);
>      if ( p2m == NULL )
>          return -ENOMEM;
> +    if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
> +        return -ENOMEM;

Likewise.

Apart from that, 
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 Thu Oct 20 07:12:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 07:12:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGtMd-0004yc-A9; Thu, 20 Oct 2011 07:12:55 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGtB7-0003UU-Lx
	for Xen-devel@lists.xensource.com; Thu, 20 Oct 2011 07:01:19 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-16.tower-21.messagelabs.com!1319119258!969130!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25296 invoked from network); 20 Oct 2011 14:00:58 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 20 Oct 2011 14:00:58 -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 8CE8E1566;
	Thu, 20 Oct 2011 17:00:57 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 10A4F200EC; Thu, 20 Oct 2011 17:00:57 +0300 (EEST)
Date: Thu, 20 Oct 2011 17:00:56 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Alok Sinha <aksinha@yahoo-inc.com>
Subject: Re: [Xen-devel] Question on RHEL 6 support
Message-ID: <20111020140056.GU12984@reaktio.net>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
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, Oct 20, 2011 at 04:18:07PM +0530, Alok Sinha wrote:
>    Hi,

Hello,

>       I am trying to run RHEL 6 as guest over XEN (RHEL 5.6 as host)
>    hypervisor.
>       It seems that RHEL 6 loads the paravirt drivers by default and thus HVM
>    mode is not working.
>       Any idea on this?

What do you mean with "HVM mode is not working" ?

PVHVM drivers (for HVM guests) are there to make disk/net performance a LOT better!
The default qemu-dm emulated ide controller and realtek nic are not very efficient..

>       I saw somewhere that including xen_emul_unplug=never will help. Is
>    there any other way it can be avoided?
>

You can also disable the xen platform pci device for that VM from dom0, 
then the VM will not activate 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 Thu Oct 20 07:14:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 07:14:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGtOP-0005Nf-Jw; Thu, 20 Oct 2011 07:14:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGtHq-0004CI-Ur
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 07:08:01 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1319119649!40769279!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22027 invoked from network); 20 Oct 2011 14:07:30 -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; 20 Oct 2011 14:07:30 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 15:07:56 +0100
Message-Id: <4EA0475B020000780005C859@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 15:07:55 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Tim Deegan" <tim@xen.org>
Subject: Re: [Xen-devel] [PATCH 08/12] x86/p2m: allocate CPU masks dynamically
References: <4EA0413B020000780005C7C2@nat28.tlf.novell.com>
	<20111020140045.GH49983@ocelot.phlegethon.org>
In-Reply-To: <20111020140045.GH49983@ocelot.phlegethon.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 20.10.11 at 16:00, Tim Deegan <tim@xen.org> wrote:
> At 14:41 +0100 on 20 Oct (1319121707), Jan Beulich wrote:
>> --- 2011-10-18.orig/xen/arch/x86/mm/p2m.c	2011-10-14 09:47:46.0000000=
00 +0200
>> +++ 2011-10-18/xen/arch/x86/mm/p2m.c	2011-10-18 16:45:49.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;
>=20
> This leaks 'p2m'.

If that's really true, then there is a leak already without that patch:
p2m_init() calls p2m_init_nestedp2m() without recovering from failure
in that function. It was my understanding that since failure here
ultimately leads to failure of domain construction, which I thought
(hoped - didn't verify) would result in p2m_final_teardown() getting
called.

Please clarify.

Jan

>>          p2m_initialise(d, p2m);
>>          p2m->write_p2m_entry =3D nestedp2m_write_p2m_entry;
>>          list_add(&p2m->np2m_list, &p2m_get_hostp2m(d)->np2m_list);
>> @@ -117,6 +118,8 @@ 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) )
>> +        return -ENOMEM;
>=20
> Likewise.
>=20
> Apart from that,=20
> 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 Thu Oct 20 07:16:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 07:16:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGtPw-0005mM-My; Thu, 20 Oct 2011 07:16:20 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGtNp-0005FY-PL
	for Xen-devel@lists.xensource.com; Thu, 20 Oct 2011 07:14:10 -0700
X-Env-Sender: aksinha@yahoo-inc.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319120045!159156!1
X-Originating-IP: [98.139.253.104]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11100 invoked from network); 20 Oct 2011 14:14:06 -0000
Received: from mrout1-b.corp.bf1.yahoo.com (HELO mrout1-b.corp.bf1.yahoo.com)
	(98.139.253.104)
	by server-11.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	20 Oct 2011 14:14:06 -0000
Received: from EGL-EX07CAS01.ds.corp.yahoo.com
	(egl-ex07cas01.eglbp.corp.yahoo.com [203.83.248.208])
	by mrout1-b.corp.bf1.yahoo.com (8.14.4/8.14.4/y.out) with ESMTP id
	p9KEDFfr020692; Thu, 20 Oct 2011 07:13:16 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yahoo-inc.com;
	s=cobra; t=1319119996;
	bh=bjXp/uQK72eEtSBLi/mfxiGe9IoV5BlP5njd/TbAtX0=;
	h=From:To:CC:Date:Subject:Message-ID:References:In-Reply-To:
	Content-Type:Content-Transfer-Encoding:MIME-Version;
	b=OCHU/3ChRPbSj2Mjpo+0o6EO1t5NVnWqyzZI4iiUSEs/1g0W8h8vj+PZhdj88ZCgy
	nLjbJJDT+b0BFPckh8ZmAlHCaTG6vMJelz95Qdv3szbAijaN1lAQrFNXsJp8JR+gdR
	9C8hLsTvbJ1uVin0lFB69g+qcOIns7YSmQDYsumk=
Received: from EGL-EX07VS01.ds.corp.yahoo.com ([203.83.248.205]) by
	EGL-EX07CAS01.ds.corp.yahoo.com ([203.83.248.215]) with mapi;
	Thu, 20 Oct 2011 19:43:14 +0530
From: Alok Sinha <aksinha@yahoo-inc.com>
To: =?utf-8?B?UGFzaSBLw6Rya2vDpGluZW4=?= <pasik@iki.fi>
Date: Thu, 20 Oct 2011 19:43:05 +0530
Subject: Re: [Xen-devel] Question on RHEL 6 support
Thread-Topic: [Xen-devel] Question on RHEL 6 support
Thread-Index: AcyPMmeVAO6dYFs9TtykeEfT3JyAKQ==
Message-ID: <E50C8B10-8BC0-486D-94BE-7633C5731CFB@yahoo-inc.com>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
In-Reply-To: <20111020140056.GU12984@reaktio.net>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
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>
Content-Type: multipart/mixed; boundary="===============1324027103=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1324027103==
Content-Language: en-US
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

DQoNClNlbnQgZnJvbSBteSBpUGhvbmUNCg0KT24gMjAtT2N0LTIwMTEsIGF0IDc6MzIgUE0sICJQ
YXNpIEvDpHJra8OkaW5lbiIgPHBhc2lrQGlraS5maT4gd3JvdGU6DQoNCj4gT24gVGh1LCBPY3Qg
MjAsIDIwMTEgYXQgMDQ6MTg6MDdQTSArMDUzMCwgQWxvayBTaW5oYSB3cm90ZToNCj4+ICAgSGks
DQo+IA0KPiBIZWxsbywNCj4gDQo+PiAgICAgIEkgYW0gdHJ5aW5nIHRvIHJ1biBSSEVMIDYgYXMg
Z3Vlc3Qgb3ZlciBYRU4gKFJIRUwgNS42IGFzIGhvc3QpDQo+PiAgIGh5cGVydmlzb3IuDQo+PiAg
ICAgIEl0IHNlZW1zIHRoYXQgUkhFTCA2IGxvYWRzIHRoZSBwYXJhdmlydCBkcml2ZXJzIGJ5IGRl
ZmF1bHQgYW5kIHRodXMgSFZNDQo+PiAgIG1vZGUgaXMgbm90IHdvcmtpbmcuDQo+PiAgICAgIEFu
eSBpZGVhIG9uIHRoaXM/DQo+IA0KPiBXaGF0IGRvIHlvdSBtZWFuIHdpdGggIkhWTSBtb2RlIGlz
IG5vdCB3b3JraW5nIiA/DQo+IA0KPiBQVkhWTSBkcml2ZXJzIChmb3IgSFZNIGd1ZXN0cykgYXJl
IHRoZXJlIHRvIG1ha2UgZGlzay9uZXQgcGVyZm9ybWFuY2UgYSBMT1QgYmV0dGVyIQ0KPiBUaGUg
ZGVmYXVsdCBxZW11LWRtIGVtdWxhdGVkIGlkZSBjb250cm9sbGVyIGFuZCByZWFsdGVrIG5pYyBh
cmUgbm90IHZlcnkgZWZmaWNpZW50Li4NCj4gDQo+PiAgICAgIEkgc2F3IHNvbWV3aGVyZSB0aGF0
IGluY2x1ZGluZyB4ZW5fZW11bF91bnBsdWc9bmV2ZXIgd2lsbCBoZWxwLiBJcw0KPj4gICB0aGVy
ZSBhbnkgb3RoZXIgd2F5IGl0IGNhbiBiZSBhdm9pZGVkPw0KPj4gDQo+IA0KPiBZb3UgY2FuIGFs
c28gZGlzYWJsZSB0aGUgeGVuIHBsYXRmb3JtIHBjaSBkZXZpY2UgZm9yIHRoYXQgVk0gZnJvbSBk
b20wLCANCj4gdGhlbiB0aGUgVk0gd2lsbCBub3QgYWN0aXZhdGUgUFZIVk0gZHJpdmVycy4NCj4g
DQo+IC0tIA0KDQpIb3c/IElzIHRoZXJlIGNsaS9BUEk/DQpBbG9r


--===============1324027103==
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

--===============1324027103==--

From xen-devel-bounces@lists.xensource.com Thu Oct 20 07:18:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 07:18:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGtSH-0006By-TE; Thu, 20 Oct 2011 07:18:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGtRp-000607-EU
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 07:18:17 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-16.tower-21.messagelabs.com!1319120294!971452!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11215 invoked from network); 20 Oct 2011 14:18:14 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 14:18:14 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGtRl-000E6N-OF; Thu, 20 Oct 2011 14:18:13 +0000
Date: Thu, 20 Oct 2011 15:18:13 +0100
From: Tim Deegan <tim@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 08/12] x86/p2m: allocate CPU masks dynamically
Message-ID: <20111020141813.GI49983@ocelot.phlegethon.org>
References: <4EA0413B020000780005C7C2@nat28.tlf.novell.com>
	<20111020140045.GH49983@ocelot.phlegethon.org>
	<4EA0475B020000780005C859@nat28.tlf.novell.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EA0475B020000780005C859@nat28.tlf.novell.com>
User-Agent: Mutt/1.4.2.1i
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

At 15:07 +0100 on 20 Oct (1319123275), Jan Beulich wrote:
> >>> On 20.10.11 at 16:00, Tim Deegan <tim@xen.org> wrote:
> > At 14:41 +0100 on 20 Oct (1319121707), Jan Beulich wrote:
> >> --- 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-18 16:45:49.000000000 +0200
> >> @@ -81,7 +81,6 @@ static void p2m_initialise(struct domain
> >>      p2m->default_access = p2m_access_rwx;
> >>  
> >>      p2m->cr3 = CR3_EADDR;
> >> -    cpumask_clear(&p2m->p2m_dirty_cpumask);
> >>  
> >>      if ( hap_enabled(d) && (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) )
> >>          ept_p2m_init(p2m);
> >> @@ -102,6 +101,8 @@ p2m_init_nestedp2m(struct domain *d)
> >>          d->arch.nested_p2m[i] = p2m = xzalloc(struct p2m_domain);
> >>          if (p2m == NULL)
> >>              return -ENOMEM;
> >> +        if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
> >> +            return -ENOMEM;
> > 
> > This leaks 'p2m'.
> 
> If that's really true, then there is a leak already without that patch:
> p2m_init() calls p2m_init_nestedp2m() without recovering from failure
> in that function. It was my understanding that since failure here
> ultimately leads to failure of domain construction, which I thought
> (hoped - didn't verify) would result in p2m_final_teardown() getting
> called.

You're quite right; it will all get tidied up by p2m_final_teardown().
Sorry for the noise.

Tim.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 07:23:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 07:23:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGtWh-0006eJ-Lg; Thu, 20 Oct 2011 07:23:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGtVf-0006R7-1Q
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 07:22:15 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-14.tower-174.messagelabs.com!1319120531!36059350!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16715 invoked from network); 20 Oct 2011 14:22:12 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-14.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 14:22:12 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGtVb-000E7L-F6; Thu, 20 Oct 2011 14:22:11 +0000
Date: Thu, 20 Oct 2011 15:22:11 +0100
From: Tim Deegan <tim@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 08/12] x86/p2m: allocate CPU masks dynamically
Message-ID: <20111020142211.GJ49983@ocelot.phlegethon.org>
References: <4EA0413B020000780005C7C2@nat28.tlf.novell.com>
	<20111020140045.GH49983@ocelot.phlegethon.org>
	<4EA0475B020000780005C859@nat28.tlf.novell.com>
	<20111020141813.GI49983@ocelot.phlegethon.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111020141813.GI49983@ocelot.phlegethon.org>
User-Agent: Mutt/1.4.2.1i
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

At 15:18 +0100 on 20 Oct (1319123893), Tim Deegan wrote:
> At 15:07 +0100 on 20 Oct (1319123275), Jan Beulich wrote:
> > >>> On 20.10.11 at 16:00, Tim Deegan <tim@xen.org> wrote:
> > > At 14:41 +0100 on 20 Oct (1319121707), Jan Beulich wrote:
> > >> --- 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-18 16:45:49.000000000 +0200
> > >> @@ -81,7 +81,6 @@ static void p2m_initialise(struct domain
> > >>      p2m->default_access = p2m_access_rwx;
> > >>  
> > >>      p2m->cr3 = CR3_EADDR;
> > >> -    cpumask_clear(&p2m->p2m_dirty_cpumask);
> > >>  
> > >>      if ( hap_enabled(d) && (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) )
> > >>          ept_p2m_init(p2m);
> > >> @@ -102,6 +101,8 @@ p2m_init_nestedp2m(struct domain *d)
> > >>          d->arch.nested_p2m[i] = p2m = xzalloc(struct p2m_domain);
> > >>          if (p2m == NULL)
> > >>              return -ENOMEM;
> > >> +        if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
> > >> +            return -ENOMEM;
> > > 
> > > This leaks 'p2m'.
> > 
> > If that's really true, then there is a leak already without that patch:
> > p2m_init() calls p2m_init_nestedp2m() without recovering from failure
> > in that function. It was my understanding that since failure here
> > ultimately leads to failure of domain construction, which I thought
> > (hoped - didn't verify) would result in p2m_final_teardown() getting
> > called.
> 
> You're quite right; it will all get tidied up by p2m_final_teardown().

Except that arch_domain_create() doesn't actually call
paging_final_teardown() if paging_domain_init() fails, so that path
probably leaks quite badly -- at least the nested-paging stuff you
pointed out, and possibly other things.  I'll have a look at it. 

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 Oct 20 07:34:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 07:34:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGthi-0007wy-8a; Thu, 20 Oct 2011 07:34:42 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGthB-0007lI-MG
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 07:34:10 -0700
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319121234!51876461!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6435 invoked from network); 20 Oct 2011 14:33:55 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-15.tower-27.messagelabs.com with SMTP;
	20 Oct 2011 14:33: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 p9KEY4UO031597
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 20 Oct 2011 10:34:04 -0400
Received: from [10.34.1.169] (dhcp-1-169.brq.redhat.com [10.34.1.169])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9KEY0fR011804; Thu, 20 Oct 2011 10:34:01 -0400
Message-ID: <4EA031B0.2010400@redhat.com>
Date: Thu, 20 Oct 2011 16:35:28 +0200
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>, Jeremy Fitzhardinge <jeremy@goop.org>
Subject: Re: [Xen-devel] [PATCH] remove blocked time accounting from xen
	"clockchip"
References: <1318970579-6282-1-git-send-email-lersek@redhat.com>
	<4E9E9D97020000780005C1DE@nat28.tlf.novell.com>
In-Reply-To: <4E9E9D97020000780005C1DE@nat28.tlf.novell.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.12
Cc: 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 10/19/11 09:51, 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().
>
> As event_handler is being checked to be non-zero, shouldn't the
> code you remove simply become conditional (upon event_handler
> being zero)?

After experimenting further and reading more code, I think that the 
event_handler == NULL case is spurious and impossible in the long run. 
(I tested faking it periodically and the VM stops progressing during 
boot, after udev is started).

Furthermore / independently, these are the callers of 
account_idle_ticks() -- a complete tree:

account_idle_ticks() [kernel/sched.c]
   <- tick_nohz_restart_sched_tick() [kernel/time/tick-sched.c]
     <- cpu_idle() [various arches]

   <- do_stolen_accounting() [arch/x86/xen/time.c]
     <- xen_timer_interrupt()

   <- consider_steal_time() [arch/ia64/xen/time.c]
     <- xen_do_steal_accounting()
        = xen_time_ops.do_steal_accounting

(The ia64/xen time code seems to be modeled after the x86/xen code.)

Jeremy, could you please educate me why the original version of 
do_stolen_accounting() (commit f91a8b44) had added the

     account_steal_time(idle_task(smp_processor_id()), ticks);

part? I think it was wrong from the start.

In linux-2.6.18-xen, cpu_idle() [arch/x86_64/kernel/process-xen.c] 
doesn't seem to bump the idle time counter. So the interrupt handler 
routine timer_interrupt() [arch/i386/kernel/time-xen.c] has to, after 
doing the stolen accounting. I suspect this logic was transferred to the 
pvops kernel superfluously, where cpu_idle() was already handling the 
idle time accounting.

I believe my claim is consistent with the fact that only the 
xen-specific timer interrupt handlers care directly about idle time in 
the pvops kernel.

I'm convinced the patch is correct, and only the commit message might 
need a small fix (mentioning cpu_idle()). If the above reasoning is 
insufficient, whom should I mail directly to confirm/refute/complete it? 
I tried mingo and tglx in private, but got no answer yet.

If you can accept the reasoning, I'll resend the patch with an updated 
commit message.

Thank you very much,
Laszlo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 07:48:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 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 1RGtvU-0000Py-QE; Thu, 20 Oct 2011 07:48:57 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGtu6-00009H-DK
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 07:47:30 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319122047!162988!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4646 invoked from network); 20 Oct 2011 14:47:27 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-7.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	20 Oct 2011 14:47:27 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGtu2-000EBH-Ep; Thu, 20 Oct 2011 14:47:26 +0000
Date: Thu, 20 Oct 2011 15:47:26 +0100
From: Tim Deegan <tim@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 08/12] x86/p2m: allocate CPU masks dynamically
Message-ID: <20111020144726.GK49983@ocelot.phlegethon.org>
References: <4EA0413B020000780005C7C2@nat28.tlf.novell.com>
	<20111020140045.GH49983@ocelot.phlegethon.org>
	<4EA0475B020000780005C859@nat28.tlf.novell.com>
	<20111020141813.GI49983@ocelot.phlegethon.org>
	<20111020142211.GJ49983@ocelot.phlegethon.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111020142211.GJ49983@ocelot.phlegethon.org>
User-Agent: Mutt/1.4.2.1i
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

At 15:22 +0100 on 20 Oct (1319124131), Tim Deegan wrote:
> At 15:18 +0100 on 20 Oct (1319123893), Tim Deegan wrote:
> > At 15:07 +0100 on 20 Oct (1319123275), Jan Beulich wrote:
> > > >>> On 20.10.11 at 16:00, Tim Deegan <tim@xen.org> wrote:
> > > > At 14:41 +0100 on 20 Oct (1319121707), Jan Beulich wrote:
> > > >> --- 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-18 16:45:49.000000000 +0200
> > > >> @@ -81,7 +81,6 @@ static void p2m_initialise(struct domain
> > > >>      p2m->default_access = p2m_access_rwx;
> > > >>  
> > > >>      p2m->cr3 = CR3_EADDR;
> > > >> -    cpumask_clear(&p2m->p2m_dirty_cpumask);
> > > >>  
> > > >>      if ( hap_enabled(d) && (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) )
> > > >>          ept_p2m_init(p2m);
> > > >> @@ -102,6 +101,8 @@ p2m_init_nestedp2m(struct domain *d)
> > > >>          d->arch.nested_p2m[i] = p2m = xzalloc(struct p2m_domain);
> > > >>          if (p2m == NULL)
> > > >>              return -ENOMEM;
> > > >> +        if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
> > > >> +            return -ENOMEM;
> > > > 
> > > > This leaks 'p2m'.
> > > 
> > > If that's really true, then there is a leak already without that patch:
> > > p2m_init() calls p2m_init_nestedp2m() without recovering from failure
> > > in that function. It was my understanding that since failure here
> > > ultimately leads to failure of domain construction, which I thought
> > > (hoped - didn't verify) would result in p2m_final_teardown() getting
> > > called.
> > 
> > You're quite right; it will all get tidied up by p2m_final_teardown().
> 
> Except that arch_domain_create() doesn't actually call
> paging_final_teardown() if paging_domain_init() fails, so that path
> probably leaks quite badly -- at least the nested-paging stuff you
> pointed out, and possibly other things.  I'll have a look at it. 

OK, it looks like it was just the nested-p2m state.  That should be
fixed now, as staging/xen-unstable.hg 23981:6c583d35d76d

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 Oct 20 08:05:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:05:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGuB4-0001yU-By; Thu, 20 Oct 2011 08:05:02 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGu7W-0001hY-RO
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:01:26 -0700
X-Env-Sender: lersek@redhat.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1319122849!42775028!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23852 invoked from network); 20 Oct 2011 15:00:50 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-3.tower-27.messagelabs.com with SMTP;
	20 Oct 2011 15:00:50 -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 p9KF1HBs005713
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 20 Oct 2011 11:01:17 -0400
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 p9KF1DQZ001915; Thu, 20 Oct 2011 11:01:14 -0400
Message-ID: <4EA03811.5090502@redhat.com>
Date: Thu, 20 Oct 2011 17:02:41 +0200
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>, Jeremy Fitzhardinge <jeremy@goop.org>
Subject: Re: [Xen-devel] [PATCH] remove blocked time accounting from xen
	"clockchip"
References: <1318970579-6282-1-git-send-email-lersek@redhat.com>
	<4E9E9D97020000780005C1DE@nat28.tlf.novell.com>
	<4EA031B0.2010400@redhat.com>
In-Reply-To: <4EA031B0.2010400@redhat.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.25
Cc: 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 10/20/11 16:35, Laszlo Ersek wrote:

> I'm convinced the patch is correct, and only the commit message might
> need a small fix (mentioning cpu_idle()).

I forgot to say that I also added counters to xen_timer_interrupt(), 
account_idle_ticks() (called from cpu_idle()), and the idle time branch 
of account_process_tick(). (The last one is reached from 
xen_timer_interrupt() via event_handler == &tick_nohz_handler, after 
highres=off was passed). When the VM was left alone, they were 
increasing in strict lock-step.

account_idle_time()

   <- account_idle_ticks()
     <- tick_nohz_restart_sched_tick()
       <- cpu_idle()

   <- account_process_tick()
     <- update_process_times()
       <- tick_nohz_handler() [highres=off]
         <- xen_timer_interrupt()

       <- (tick_periodic())
       <- (tick_sched_timer())

The timer interrupt appears to kick cpu_idle(), and the latter accounts 
for the time spent idly.

Laszlo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 08:12:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:12:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGuIJ-0003ru-Ob; Thu, 20 Oct 2011 08:12:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGuFc-0002uN-3T
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:09:45 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319123380!1021223!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20432 invoked from network); 20 Oct 2011 15:09:41 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 15:09:41 -0000
Received: by wyi11 with SMTP id 11so3741567wyi.30
	for <xen-devel@lists.xensource.com>;
	Thu, 20 Oct 2011 08:09:40 -0700 (PDT)
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=Ps/QtXORO3s/MwDav3c9NGTS5SwxGMXvRfXQ+3OA/4w=;
	b=n+bCqV4mpw+EOf3nWF3fK17/qB1UWuRg/nrvseEcLNFwipbkx1jxxHB5ulDTD0BUrK
	pO+WneyLLXqvIwqxTcno+yl6xZXuz9fnVk086zKkNT9iUSCCu3Qft+fTTTWnhbw+6wJJ
	ZZ5LJrCId7mR3BrpwokSbMwUqSqAMP1tjaPaM=
Received: by 10.216.131.42 with SMTP id l42mr2933440wei.16.1319123380813;
	Thu, 20 Oct 2011 08:09:40 -0700 (PDT)
Received: from [192.168.1.71] (host86-153-22-182.range86-153.btcentralplus.com.
	[86.153.22.182]) by mx.google.com with ESMTPS id
	ei16sm16070528wbb.21.2011.10.20.08.09.37
	(version=SSLv3 cipher=OTHER); Thu, 20 Oct 2011 08:09:40 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 20 Oct 2011 16:09:34 +0100
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
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: <CAC5F83E.235C3%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
Thread-Index: AcyPOkZ3DBL/NT9IL0+bzgnClE2t4Q==
In-Reply-To: <4EA03FF4020000780005C797@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 20/10/2011 14:36, "Jan Beulich" <JBeulich@suse.com> wrote:

> This patch set makes some first steps towards eliminating the old cpumask
> accessors, replacing them by such that don't require the full NR_CPUS
> bits to be allocated (which obviously can be pretty wasteful when
> NR_CPUS is high, but the actual number is low or moderate).
> 
> 01: introduce and use nr_cpu_ids and nr_cpumask_bits
> 02: eliminate cpumask accessors referencing NR_CPUS
> 03: eliminate direct assignments of CPU masks
> 04: x86: allocate IRQ actions' cpu_eoi_map dynamically
> 05: allocate CPU sibling and core maps dynamically

I'm not sure about this. We can save ~500 bytes per cpumask_t when
NR_CPUS=4096 and actual nr_cpus<64. But how many cpumask_t's do we typically
have dynamically allocated all at once? Let's say we waste 2kB per VCPU and
per IRQ, and we have a massive system with ~1k VCPUs and ~1k IRQs -- we'd
save ~4MB in that extreme case. But such a large system probably actually
will have a lot of CPUs. And also a lot of memory, such that 4MB is quite
insignificant.

I suppose there is a second argument that it shrinks the containing
structures (struct domain, struct vcpu, struct irq_desc, ...) and maybe
helps reduce our order!=0 allocations?

By the way, I think we could avoid the NR_CPUS copying overhead everywhere
by having the cpumask.h functions respect nr_cpu_ids, but continuing to
return NR_CPUS for sentinel value (e.g., end of loop; or no bit found)? This
would not need to change tonnes of code. It only gets part of the benefit
(reducing cpu time overhead) but is more palatable?

> 06: allow efficient allocation of multiple CPU masks at once

That is utterly hideous and for insignificant saving.

> One reason I put the following ones together was to reduce the
> differences between the disassembly of hypervisors built for 4095
> and 2047 CPUs, which I looked at to determine the places where
> cpumask_t variables get copied without using cpumask_copy() (a
> job where grep is of no help). Hence consider these patch optional,
> but recommended.
> 
> 07: cpufreq: allocate CPU masks dynamically
> 08: x86/p2m: allocate CPU masks dynamically
> 09: cpupools: allocate CPU masks dynamically
> 10: credit: allocate CPU masks dynamically
> 11: x86/hpet: allocate CPU masks dynamically
> 12: cpumask <=> xenctl_cpumap: allocate CPU masks and byte maps dynamically

Questionable. Any subsystem that allocates no more than a handful of
cpumask_t's is possibly just as well left alone... I'm not dead set against
them if we deicde that 01-05 are actually worth pursuing, however.

 -- Keir

> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> 
> _______________________________________________
> 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 Oct 20 08:20:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:20:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGuQ7-000581-6g; Thu, 20 Oct 2011 08:20:35 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGuPd-0004va-4A
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:20:05 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1319124001!989982!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2648 invoked from network); 20 Oct 2011 15:20:02 -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; 20 Oct 2011 15:20:02 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 16:20:18 +0100
Message-Id: <4EA0583B020000780005C8A8@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 16:19:55 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
References: <4EA03FF4020000780005C797@nat28.tlf.novell.com>
	<CAC5F83E.235C3%keir.xen@gmail.com>
In-Reply-To: <CAC5F83E.235C3%keir.xen@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

>>> On 20.10.11 at 17:09, Keir Fraser <keir.xen@gmail.com> wrote:
> On 20/10/2011 14:36, "Jan Beulich" <JBeulich@suse.com> wrote:
>=20
>> This patch set makes some first steps towards eliminating the old =
cpumask
>> accessors, replacing them by such that don't require the full NR_CPUS
>> bits to be allocated (which obviously can be pretty wasteful when
>> NR_CPUS is high, but the actual number is low or moderate).
>>=20
>> 01: introduce and use nr_cpu_ids and nr_cpumask_bits
>> 02: eliminate cpumask accessors referencing NR_CPUS
>> 03: eliminate direct assignments of CPU masks
>> 04: x86: allocate IRQ actions' cpu_eoi_map dynamically
>> 05: allocate CPU sibling and core maps dynamically
>=20
> I'm not sure about this. We can save ~500 bytes per cpumask_t when
> NR_CPUS=3D4096 and actual nr_cpus<64. But how many cpumask_t's do we =
typically
> have dynamically allocated all at once? Let's say we waste 2kB per VCPU =
and
> per IRQ, and we have a massive system with ~1k VCPUs and ~1k IRQs -- =
we'd
> save ~4MB in that extreme case. But such a large system probably =
actually
> will have a lot of CPUs. And also a lot of memory, such that 4MB is =
quite
> insignificant.

It's not only the memory savings, but the time savings in manipulating
less space.

> I suppose there is a second argument that it shrinks the containing
> structures (struct domain, struct vcpu, struct irq_desc, ...) and maybe
> helps reduce our order!=3D0 allocations?

Yes - that's what made me start taking over these Linux bits. What I
sent here just continues on that route. I was really hoping that we
wouldn't leave this in a half baked state.

> By the way, I think we could avoid the NR_CPUS copying overhead =
everywhere
> by having the cpumask.h functions respect nr_cpu_ids, but continuing to
> return NR_CPUS for sentinel value (e.g., end of loop; or no bit found)? =
This
> would not need to change tonnes of code. It only gets part of the =
benefit
> (reducing cpu time overhead) but is more palatable?

That would be possible, but would again leave is in a somewhat
incomplete state. (Note that I did leave NR_CPUS in the stop-
machine logic).

>> 06: allow efficient allocation of multiple CPU masks at once
>=20
> That is utterly hideous and for insignificant saving.

I was afraid you would say that, and I'm not fully convinced
either. But I wanted to give it a try to see how bad it is. The
more significant saving here really comes from not allocating
the CPU masks at all for unused irq_desc-s.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 08:28:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:28:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGuXq-0006Ol-LW; Thu, 20 Oct 2011 08:28:34 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGuUu-0005Qe-BI
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:25:32 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1319124328!982236!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2532 invoked from network); 20 Oct 2011 15:25:28 -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; 20 Oct 2011 15:25:28 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 16:25:51 +0100
Message-Id: <4EA05986020000780005C8B6@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 16:25:26 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
References: <4EA03FF4020000780005C797@nat28.tlf.novell.com>
	<CAC5F83E.235C3%keir.xen@gmail.com>
	<4EA0583B020000780005C8A8@nat28.tlf.novell.com>
In-Reply-To: <4EA0583B020000780005C8A8@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 20.10.11 at 17:19, "Jan Beulich" <JBeulich@suse.com> wrote:
>>>> On 20.10.11 at 17:09, Keir Fraser <keir.xen@gmail.com> wrote:
>> I suppose there is a second argument that it shrinks the containing
>> structures (struct domain, struct vcpu, struct irq_desc, ...) and maybe
>> helps reduce our order!=3D0 allocations?
>=20
> Yes - that's what made me start taking over these Linux bits. What I
> sent here just continues on that route. I was really hoping that we
> wouldn't leave this in a half baked state.

I forgot to say: The new accessors produce a little more legible code
with cpumask_var_t and cpumask_t * (the second we converted to
already wherever possible) than with cpumask_t, because of the need
to use & on the latter (and as you will see they also allow removing a
number of ugly looking * operators, which I always considered only
temporary).

Jan




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 08:32:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:32:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGubk-0006yT-IJ; Thu, 20 Oct 2011 08:32:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGubB-0006iP-2j
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:32:01 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319124697!49107671!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 685 invoked from network); 20 Oct 2011 15:31:37 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 20 Oct 2011 15:31:37 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RGub5-000EKC-7l; Thu, 20 Oct 2011 15:31:55 +0000
Date: Thu, 20 Oct 2011 16:31:55 +0100
From: Tim Deegan <tim@xen.org>
To: Andres Lagar Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] Re: Re: mapping problems in xenpaging
Message-ID: <20111020153155.GL49983@ocelot.phlegethon.org>
References: <CADzFZPsJ2--PQCVH1QGJ-L1q5k4bokBrZeaaAt=BSD7QU9cbOA@mail.gmail.com>
	<20111010092111.GB31800@ocelot.phlegethon.org>
	<CADzFZPscgJ6TWXNjyeEjbOnMrEpCE7zS6BTGxfJ+yibpz-Ds_w@mail.gmail.com>
	<20111013150229.GJ44937@ocelot.phlegethon.org>
	<CADzFZPusJN7e2jG147q68RA3ZQ1PGs-xFNk+jjLRDAR7xboVjQ@mail.gmail.com>
	<20111020101324.GD49983@ocelot.phlegethon.org>
	<CADzFZPsk0_aSYzK+Yap208j3r3chpHzBcq+1kYfQc54d-bYkOQ@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: <CADzFZPsk0_aSYzK+Yap208j3r3chpHzBcq+1kYfQc54d-bYkOQ@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
Cc: zhen shi <bickys1986@gmail.com>, Olaf Hering <olaf@aepfle.de>,
	Keir Fraser <keir.xen@gmail.com>, xen-devel@lists.xensource.com,
	Adin Scannell <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 10:54 -0400 on 20 Oct (1319108045), Andres Lagar Cavilla wrote:
> On Thu, Oct 20, 2011 at 6:13 AM, Tim Deegan <tim@xen.org> wrote:
> > At 13:59 -0400 on 13 Oct (1318514390), Andres Lagar Cavilla wrote:
> >> Good stuff Tim, let me summarize:
> >>
> >>
> >> - The key is to obtain exclusive access to a p2m entry, or range [gfn,
> >> gfn + 1<<order). This exclusive access lasts beyond the actual lookup,
> >> until the caller is finished with modifications, to prevent the p2m
> >> mapping changing underfoot.
> >
> > Yes.  It only excludes concurrent updates, not concurrent lookups, so in
> > that way it's effectively a per-range MRSW lock, implemented with
> > refcounts.  (I feel like I'm working around in a circle to your first
> > suggestion!)
> 
> That's great because ... I'm working around in a circle 180 degrees opposite :)
> 
> I think it's important to untangle page liveness from mapping mutex
> access. That's why I favor Keir's approach of just locking the thing,
> no MSRW. Reasons:
> 1. Very common idiom throughout the code is to get_entry -> set_entry.
> How do we do that in an MSRW, atomically?

Callers that want to do get/set would have to acquire the write lock
during the first lookup.

> 2. You're concerned about foreign mappings, rightly so. With mutex
> access to the p2m mapping, we can ensure the page refcount increases
> atomically in the context of building the foreign mapping. This will
> keep the page alive and unable to be swapped/shared/whatever. We only
> lock the p2m entry while building the p2m mapping.

Ah - that's where we differ.  As far as I can see, in order to be
effective, the p2m entry must remain locked until the foreign mapping is
destroyed.  Otherwise, later p2m updates can make the mapping stale.

> 3. Recursive locking for different purposes is just easier without
> refcounts (generalization of reason 1)
> 4. Note that in your qemu/x86_emulate example, qemu's mapping does not
> prevent x86_emulate from progress, as qemu will have relinquished
> locks once done building the foreign mapping.
> 
> I have a draft implementation of a "tree" of exclusive locks. It's
> still a bit embarrassing to share :)
> The API is more or less
> get_p2m(p2m, gfn, order)
> <do work>
> put_p2m(p2m, gfn, order)
> with recursive get allowed, (unsophisticated) deadlock detection, and
> shortcuts for individual gfn and for global locking (for e.g.
> log_dirty). Give me a couple days for an RFC post.

Great - actual code is always welcome! :)  I might not be able to give
it much attention before next Thursday though.

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 08:37:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:37:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGugN-0007Zu-VZ; Thu, 20 Oct 2011 08:37:24 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGufI-0007GO-Gx
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:36:16 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-13.tower-27.messagelabs.com!1319124958!45122591!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14873 invoked from network); 20 Oct 2011 15:35:58 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-13.tower-27.messagelabs.com with SMTP;
	20 Oct 2011 15:35:58 -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
	p9KFaBr6015088; Thu, 20 Oct 2011 15:36:11 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 p9KFaBCM013205; 
	Thu, 20 Oct 2011 11:36:11 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 20 Oct 2011 11:35:51 -0400
Message-Id: <1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com,
	david.vrabel@citrix.com
Subject: [Xen-devel] [PATCH v2 0/6] xen/{net,
	blk}back support for running in 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

Changes from v1:
	Based on konrad's testing branch (includes David's patches)
	Grant table wrapper functions used where appropriate

[PATCH 1/6] xenbus: Support HVM backends
[PATCH 2/6] xenbus: Use grant-table wrapper functions
[PATCH 3/6] xen/grant-table: Support mappings required by blkback
[PATCH 4/6] xen/blkback: use grant-table.c hypercall wrappers
[PATCH 5/6] xen/netback: Enable netback on HVM guests
[PATCH 6/6] xen/blkback: Enable blkback on HVM guests

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 08:38:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:38:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGuhg-000809-0V; Thu, 20 Oct 2011 08:38:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGufI-0007GQ-Hx
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:36:17 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319124941!60055171!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12978 invoked from network); 20 Oct 2011 15:35:42 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-2.tower-27.messagelabs.com with SMTP;
	20 Oct 2011 15:35:42 -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
	p9KFaBr6015093; Thu, 20 Oct 2011 15:36:11 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 p9KFaBCS013205; 
	Thu, 20 Oct 2011 11:36:11 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 20 Oct 2011 11:35:57 -0400
Message-Id: <1319124957-32269-7-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com,
	Ian.Campbell@citrix.com, david.vrabel@citrix.com
Subject: [Xen-devel] [PATCH 6/6] xen/blkback: Enable blkback 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

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/block/xen-blkback/blkback.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index 1e256dc..fbffdf0 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -823,7 +823,7 @@ static int __init xen_blkif_init(void)
 	int i, mmap_pages;
 	int rc = 0;
 
-	if (!xen_pv_domain())
+	if (!xen_domain())
 		return -ENODEV;
 
 	blkbk = kzalloc(sizeof(struct xen_blkbk), GFP_KERNEL);
-- 
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 Oct 20 08:39:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:39:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGuid-0008NZ-SR; Thu, 20 Oct 2011 08:39:43 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGufI-0007GN-G1
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:36:16 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-8.tower-182.messagelabs.com!1319124973!171503!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8695 invoked from network); 20 Oct 2011 15:36:13 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-8.tower-182.messagelabs.com with SMTP;
	20 Oct 2011 15:36:13 -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
	p9KFaBSn002829; Thu, 20 Oct 2011 15:36:11 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 p9KFaBCN013205; 
	Thu, 20 Oct 2011 11:36:11 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 20 Oct 2011 11:35:52 -0400
Message-Id: <1319124957-32269-2-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com,
	Ian.Campbell@citrix.com, david.vrabel@citrix.com
Subject: [Xen-devel] [PATCH 1/6] xenbus: Support HVM backends
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 HVM implementations of xenbus_(map,unmap)_ring_v(alloc,free) so
that ring mappings can be done without using GNTMAP_contains_pte which
is not supported on HVM.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/xenbus/xenbus_client.c |  153 +++++++++++++++++++++++++++++-------
 1 files changed, 123 insertions(+), 30 deletions(-)

diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c
index 52bc57f..534e744 100644
--- a/drivers/xen/xenbus/xenbus_client.c
+++ b/drivers/xen/xenbus/xenbus_client.c
@@ -32,15 +32,26 @@
 
 #include <linux/slab.h>
 #include <linux/types.h>
+#include <linux/spinlock.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/balloon.h>
 #include <xen/events.h>
 #include <xen/grant_table.h>
 #include <xen/xenbus.h>
 
+struct xenbus_map_node {
+	struct list_head next;
+	struct page *page;
+	grant_handle_t handle;
+};
+
+static DEFINE_SPINLOCK(xenbus_valloc_lock);
+static LIST_HEAD(xenbus_valloc_pages);
+
 const char *xenbus_strstate(enum xenbus_state state)
 {
 	static const char *const name[] = {
@@ -419,21 +430,8 @@ int xenbus_free_evtchn(struct xenbus_device *dev, int port)
 EXPORT_SYMBOL_GPL(xenbus_free_evtchn);
 
 
-/**
- * xenbus_map_ring_valloc
- * @dev: xenbus device
- * @gnt_ref: grant reference
- * @vaddr: pointer to address to be filled out by mapping
- *
- * Based on Rusty Russell's skeleton driver's map_page.
- * Map a page of memory into this domain from another domain's grant table.
- * xenbus_map_ring_valloc allocates a page of virtual address space, maps the
- * page to that address, and sets *vaddr to that address.
- * Returns 0 on success, and GNTST_* (see xen/include/interface/grant_table.h)
- * or -ENOMEM on error. If an error is returned, device will switch to
- * XenbusStateClosing and the error message will be saved in XenStore.
- */
-int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
+static int xenbus_map_ring_valloc_pv(struct xenbus_device *dev,
+                                     int gnt_ref, void **vaddr)
 {
 	struct gnttab_map_grant_ref op = {
 		.flags = GNTMAP_host_map | GNTMAP_contains_pte,
@@ -468,6 +466,64 @@ int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
 	*vaddr = area->addr;
 	return 0;
 }
+
+static int xenbus_map_ring_valloc_hvm(struct xenbus_device *dev,
+                                     int gnt_ref, void **vaddr)
+{
+	struct xenbus_map_node *node;
+	int err;
+	void *addr;
+
+	*vaddr = NULL;
+
+	node = kzalloc(sizeof(*node), GFP_KERNEL);
+	if (!node)
+		return -ENOMEM;
+
+	err = alloc_xenballooned_pages(1, &node->page, false);
+	if (err)
+		goto out_err;
+
+	addr = pfn_to_kaddr(page_to_pfn(node->page));
+
+	err = xenbus_map_ring(dev, gnt_ref, &node->handle, addr);
+	if (err)
+		goto out_err;
+
+	spin_lock(&xenbus_valloc_lock);
+	list_add(&node->next, &xenbus_valloc_pages);
+	spin_unlock(&xenbus_valloc_lock);
+
+	*vaddr = addr;
+	return 0;
+
+ out_err:
+	free_xenballooned_pages(1, &node->page);
+	kfree(node);
+	return err;
+}
+
+/**
+ * xenbus_map_ring_valloc
+ * @dev: xenbus device
+ * @gnt_ref: grant reference
+ * @vaddr: pointer to address to be filled out by mapping
+ *
+ * Based on Rusty Russell's skeleton driver's map_page.
+ * Map a page of memory into this domain from another domain's grant table.
+ * xenbus_map_ring_valloc allocates a page of virtual address space, maps the
+ * page to that address, and sets *vaddr to that address.
+ * Returns 0 on success, and GNTST_* (see xen/include/interface/grant_table.h)
+ * or -ENOMEM on error. If an error is returned, device will switch to
+ * XenbusStateClosing and the error message will be saved in XenStore.
+ */
+int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
+{
+	if (xen_pv_domain())
+		return xenbus_map_ring_valloc_pv(dev, gnt_ref, vaddr);
+	else
+		return xenbus_map_ring_valloc_hvm(dev, gnt_ref, vaddr);
+}
 EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc);
 
 
@@ -509,20 +565,7 @@ int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
 }
 EXPORT_SYMBOL_GPL(xenbus_map_ring);
 
-
-/**
- * xenbus_unmap_ring_vfree
- * @dev: xenbus device
- * @vaddr: addr to unmap
- *
- * Based on Rusty Russell's skeleton driver's unmap_page.
- * Unmap a page of memory in this domain that was imported from another domain.
- * Use xenbus_unmap_ring_vfree if you mapped in your memory with
- * xenbus_map_ring_valloc (it will free the virtual address space).
- * Returns 0 on success and returns GNTST_* on error
- * (see xen/include/interface/grant_table.h).
- */
-int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
+static int xenbus_unmap_ring_vfree_pv(struct xenbus_device *dev, void *vaddr)
 {
 	struct vm_struct *area;
 	struct gnttab_unmap_grant_ref op = {
@@ -565,8 +608,58 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
 
 	return op.status;
 }
-EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
 
+static int xenbus_unmap_ring_vfree_hvm(struct xenbus_device *dev, void *vaddr)
+{
+	int rv;
+	struct xenbus_map_node *node;
+	void *addr;
+
+	spin_lock(&xenbus_valloc_lock);
+	list_for_each_entry(node, &xenbus_valloc_pages, next) {
+		addr = pfn_to_kaddr(page_to_pfn(node->page));
+		if (addr == vaddr)
+			goto found;
+	}
+	node = NULL;
+ found:
+	spin_unlock(&xenbus_valloc_lock);
+
+	if (!node) {
+		xenbus_dev_error(dev, -ENOENT,
+				 "can't find mapped virtual address %p", vaddr);
+		return -ENOENT;
+	}
+
+	rv = xenbus_unmap_ring(dev, node->handle, addr);
+
+	if (!rv)
+		free_xenballooned_pages(1, &node->page);
+
+	kfree(node);
+	return rv;
+}
+
+/**
+ * xenbus_unmap_ring_vfree
+ * @dev: xenbus device
+ * @vaddr: addr to unmap
+ *
+ * Based on Rusty Russell's skeleton driver's unmap_page.
+ * Unmap a page of memory in this domain that was imported from another domain.
+ * Use xenbus_unmap_ring_vfree if you mapped in your memory with
+ * xenbus_map_ring_valloc (it will free the virtual address space).
+ * Returns 0 on success and returns GNTST_* on error
+ * (see xen/include/interface/grant_table.h).
+ */
+int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
+{
+	if (xen_pv_domain())
+		return xenbus_unmap_ring_vfree_pv(dev, vaddr);
+	else
+		return xenbus_unmap_ring_vfree_hvm(dev, vaddr);
+}
+EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
 
 /**
  * xenbus_unmap_ring
-- 
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 Oct 20 08:40:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:40:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGujV-0000KP-5B; Thu, 20 Oct 2011 08:40:37 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGufJ-0007GV-19
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:36:17 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-8.tower-174.messagelabs.com!1319124973!22408374!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1447 invoked from network); 20 Oct 2011 15:36:13 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-8.tower-174.messagelabs.com with SMTP;
	20 Oct 2011 15:36:13 -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
	p9KFaBSn002831; Thu, 20 Oct 2011 15:36:11 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 p9KFaBCQ013205; 
	Thu, 20 Oct 2011 11:36:11 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 20 Oct 2011 11:35:55 -0400
Message-Id: <1319124957-32269-5-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com,
	Ian.Campbell@citrix.com, david.vrabel@citrix.com
Subject: [Xen-devel] [PATCH 4/6] xen/blkback: use grant-table.c hypercall
	wrappers
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/block/xen-blkback/blkback.c |   29 ++++-------------------------
 1 files changed, 4 insertions(+), 25 deletions(-)

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index 15ec4db..1e256dc 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -324,6 +324,7 @@ struct seg_buf {
 static void xen_blkbk_unmap(struct pending_req *req)
 {
 	struct gnttab_unmap_grant_ref unmap[BLKIF_MAX_SEGMENTS_PER_REQUEST];
+	struct page *pages[BLKIF_MAX_SEGMENTS_PER_REQUEST];
 	unsigned int i, invcount = 0;
 	grant_handle_t handle;
 	int ret;
@@ -335,25 +336,12 @@ static void xen_blkbk_unmap(struct pending_req *req)
 		gnttab_set_unmap_op(&unmap[invcount], vaddr(req, i),
 				    GNTMAP_host_map, handle);
 		pending_handle(req, i) = BLKBACK_INVALID_HANDLE;
+		pages[invcount] = virt_to_page(vaddr(req, i));
 		invcount++;
 	}
 
-	ret = HYPERVISOR_grant_table_op(
-		GNTTABOP_unmap_grant_ref, unmap, invcount);
+	ret = gnttab_unmap_refs(unmap, pages, invcount, false);
 	BUG_ON(ret);
-	/*
-	 * Note, we use invcount, so nr->pages, so we can't index
-	 * using vaddr(req, i).
-	 */
-	for (i = 0; i < invcount; i++) {
-		ret = m2p_remove_override(
-			virt_to_page(unmap[i].host_addr), false);
-		if (ret) {
-			pr_alert(DRV_PFX "Failed to remove M2P override for %lx\n",
-				 (unsigned long)unmap[i].host_addr);
-			continue;
-		}
-	}
 }
 
 static int xen_blkbk_map(struct blkif_request *req,
@@ -381,7 +369,7 @@ static int xen_blkbk_map(struct blkif_request *req,
 				  pending_req->blkif->domid);
 	}
 
-	ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, nseg);
+	ret = gnttab_map_refs(map, NULL, &blkbk->pending_page(pending_req, 0), nseg);
 	BUG_ON(ret);
 
 	/*
@@ -401,15 +389,6 @@ static int xen_blkbk_map(struct blkif_request *req,
 		if (ret)
 			continue;
 
-		ret = m2p_add_override(PFN_DOWN(map[i].dev_bus_addr),
-			blkbk->pending_page(pending_req, i), NULL);
-		if (ret) {
-			pr_alert(DRV_PFX "Failed to install M2P override for %lx (ret: %d)\n",
-				 (unsigned long)map[i].dev_bus_addr, ret);
-			/* We could switch over to GNTTABOP_copy */
-			continue;
-		}
-
 		seg[i].buf  = map[i].dev_bus_addr |
 			(req->u.rw.seg[i].first_sect << 9);
 	}
-- 
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 Oct 20 08:41:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:41:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGukN-0000kL-OQ; Thu, 20 Oct 2011 08:41:31 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGufI-0007GU-TL
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:36:17 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319124973!412886!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25075 invoked from network); 20 Oct 2011 15:36:13 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-4.tower-216.messagelabs.com with SMTP;
	20 Oct 2011 15:36:13 -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
	p9KFaBr6015089; Thu, 20 Oct 2011 15:36:11 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 p9KFaBCO013205; 
	Thu, 20 Oct 2011 11:36:11 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 20 Oct 2011 11:35:53 -0400
Message-Id: <1319124957-32269-3-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com,
	Ian.Campbell@citrix.com, david.vrabel@citrix.com
Subject: [Xen-devel] [PATCH 2/6] xenbus: Use grant-table wrapper 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

The gnttab_set_{map,unmap}_op functions should be used instead of
directly populating the fields of gnttab_map_grant_ref.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/xenbus/xenbus_client.c |   17 +++++++----------
 1 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c
index 534e744..ca7c287 100644
--- a/drivers/xen/xenbus/xenbus_client.c
+++ b/drivers/xen/xenbus/xenbus_client.c
@@ -544,12 +544,10 @@ EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc);
 int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
 		    grant_handle_t *handle, void *vaddr)
 {
-	struct gnttab_map_grant_ref op = {
-		.host_addr = (unsigned long)vaddr,
-		.flags     = GNTMAP_host_map,
-		.ref       = gnt_ref,
-		.dom       = dev->otherend_id,
-	};
+	struct gnttab_map_grant_ref op;
+
+	gnttab_set_map_op(&op, (phys_addr_t)vaddr, GNTMAP_host_map, gnt_ref,
+	                  dev->otherend_id);
 
 	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
 		BUG();
@@ -674,10 +672,9 @@ EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
 int xenbus_unmap_ring(struct xenbus_device *dev,
 		      grant_handle_t handle, void *vaddr)
 {
-	struct gnttab_unmap_grant_ref op = {
-		.host_addr = (unsigned long)vaddr,
-		.handle    = handle,
-	};
+	struct gnttab_unmap_grant_ref op;
+
+	gnttab_set_unmap_op(&op, (phys_addr_t)vaddr, GNTMAP_host_map, handle);
 
 	if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
 		BUG();
-- 
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 Oct 20 08:42:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:42:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGulB-0001Ab-UR; Thu, 20 Oct 2011 08:42:21 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGufI-0007GP-IG
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:36:17 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-6.tower-182.messagelabs.com!1319124973!169622!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14318 invoked from network); 20 Oct 2011 15:36:13 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-6.tower-182.messagelabs.com with SMTP;
	20 Oct 2011 15:36:13 -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
	p9KFaBr6015091; Thu, 20 Oct 2011 15:36:11 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 p9KFaBCP013205; 
	Thu, 20 Oct 2011 11:36:11 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 20 Oct 2011 11:35:54 -0400
Message-Id: <1319124957-32269-4-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com,
	Ian.Campbell@citrix.com, david.vrabel@citrix.com
Subject: [Xen-devel] [PATCH 3/6] xen/grant-table: Support mappings required
	by blkback
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Allow mappings without GNTMAP_contains_pte and allow unmapping to
specify if the PTEs should be cleared.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/gntdev.c      |    3 ++-
 drivers/xen/grant-table.c |   23 ++++-------------------
 include/xen/grant_table.h |    2 +-
 3 files changed, 7 insertions(+), 21 deletions(-)

diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index 3987132..5227506 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -312,7 +312,8 @@ static int __unmap_grant_pages(struct grant_map *map, int offset, int pages)
 		}
 	}
 
-	err = gnttab_unmap_refs(map->unmap_ops + offset, map->pages + offset, pages);
+	err = gnttab_unmap_refs(map->unmap_ops + offset, map->pages + offset,
+	                        pages, true);
 	if (err)
 		return err;
 
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
index bf1c094..a02d139 100644
--- a/drivers/xen/grant-table.c
+++ b/drivers/xen/grant-table.c
@@ -472,24 +472,9 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
 				(map_ops[i].host_addr & ~PAGE_MASK));
 			mfn = pte_mfn(*pte);
 		} else {
-			/* If you really wanted to do this:
-			 * mfn = PFN_DOWN(map_ops[i].dev_bus_addr);
-			 *
-			 * The reason we do not implement it is b/c on the
-			 * unmap path (gnttab_unmap_refs) we have no means of
-			 * checking whether the page is !GNTMAP_contains_pte.
-			 *
-			 * That is without some extra data-structure to carry
-			 * the struct page, bool clear_pte, and list_head next
-			 * tuples and deal with allocation/delallocation, etc.
-			 *
-			 * The users of this API set the GNTMAP_contains_pte
-			 * flag so lets just return not supported until it
-			 * becomes neccessary to implement.
-			 */
-			return -EOPNOTSUPP;
+			mfn = PFN_DOWN(map_ops[i].dev_bus_addr);
 		}
-		ret = m2p_add_override(mfn, pages[i], &kmap_ops[i]);
+		ret = m2p_add_override(mfn, pages[i], kmap_ops ? &kmap_ops[i] : NULL);
 		if (ret)
 			return ret;
 	}
@@ -499,7 +484,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, bool clear_pte)
 {
 	int i, ret;
 
@@ -511,7 +496,7 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
 		return ret;
 
 	for (i = 0; i < count; i++) {
-		ret = m2p_remove_override(pages[i], true /* clear the PTE */);
+		ret = m2p_remove_override(pages[i], clear_pte);
 		if (ret)
 			return ret;
 	}
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
index 11e2dfc..37da54d 100644
--- a/include/xen/grant_table.h
+++ b/include/xen/grant_table.h
@@ -158,6 +158,6 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_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);
+		      struct page **pages, unsigned int count, bool clear_pte);
 
 #endif /* __ASM_GNTTAB_H__ */
-- 
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 Oct 20 08:43:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:43:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGumP-0001kG-Cw; Thu, 20 Oct 2011 08:43:37 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGufN-0007Ho-QS
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:36:22 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319124973!986611!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8864 invoked from network); 20 Oct 2011 15:36:13 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-14.tower-21.messagelabs.com with SMTP;
	20 Oct 2011 15:36:13 -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
	p9KFaBr6015092; Thu, 20 Oct 2011 15:36:11 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 p9KFaBCR013205; 
	Thu, 20 Oct 2011 11:36:11 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 20 Oct 2011 11:35:56 -0400
Message-Id: <1319124957-32269-6-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com,
	Ian.Campbell@citrix.com, david.vrabel@citrix.com
Subject: [Xen-devel] [PATCH 5/6] xen/netback: Enable netback 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

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/net/xen-netback/netback.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
index 3af2924..9d80f99 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -1626,7 +1626,7 @@ static int __init netback_init(void)
 	int rc = 0;
 	int group;
 
-	if (!xen_pv_domain())
+	if (!xen_domain())
 		return -ENODEV;
 
 	xen_netbk_group_nr = num_online_cpus();
-- 
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 Oct 20 08:50:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:50:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGusy-0002PO-3e; Thu, 20 Oct 2011 08:50:24 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGus5-0002CK-7Z
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:49:29 -0700
X-Env-Sender: Andrew.Cooper3@citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319125764!1019097!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29289 invoked from network); 20 Oct 2011 15:49:25 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 15:49:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,379,1315195200"; d="scan'208";a="18403853"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 11:49:24 -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, 20 Oct 2011
	11:49:23 -0400
Message-ID: <4EA04302.2040101@citrix.com>
Date: Thu, 20 Oct 2011 16:49:22 +0100
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 00/12] cpumask handling
	scalability	improvements
References: <4EA03FF4020000780005C797@nat28.tlf.novell.com>	<CAC5F83E.235C3%keir.xen@gmail.com>
	<4EA0583B020000780005C8A8@nat28.tlf.novell.com>
In-Reply-To: <4EA0583B020000780005C8A8@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 20/10/11 16:19, Jan Beulich wrote:
>>>> On 20.10.11 at 17:09, Keir Fraser <keir.xen@gmail.com> wrote:
>> On 20/10/2011 14:36, "Jan Beulich" <JBeulich@suse.com> wrote:
>>
>>> This patch set makes some first steps towards eliminating the old cpumask
>>> accessors, replacing them by such that don't require the full NR_CPUS
>>> bits to be allocated (which obviously can be pretty wasteful when
>>> NR_CPUS is high, but the actual number is low or moderate).
>>>
>>> 01: introduce and use nr_cpu_ids and nr_cpumask_bits
>>> 02: eliminate cpumask accessors referencing NR_CPUS
>>> 03: eliminate direct assignments of CPU masks
>>> 04: x86: allocate IRQ actions' cpu_eoi_map dynamically
>>> 05: allocate CPU sibling and core maps dynamically
>> I'm not sure about this. We can save ~500 bytes per cpumask_t when
>> NR_CPUS=4096 and actual nr_cpus<64. But how many cpumask_t's do we typically
>> have dynamically allocated all at once? Let's say we waste 2kB per VCPU and
>> per IRQ, and we have a massive system with ~1k VCPUs and ~1k IRQs -- we'd
>> save ~4MB in that extreme case. But such a large system probably actually
>> will have a lot of CPUs. And also a lot of memory, such that 4MB is quite
>> insignificant.
> It's not only the memory savings, but the time savings in manipulating
> less space.
>
>> I suppose there is a second argument that it shrinks the containing
>> structures (struct domain, struct vcpu, struct irq_desc, ...) and maybe
>> helps reduce our order!=0 allocations?
> Yes - that's what made me start taking over these Linux bits. What I
> sent here just continues on that route. I was really hoping that we
> wouldn't leave this in a half baked state.
>
>> By the way, I think we could avoid the NR_CPUS copying overhead everywhere
>> by having the cpumask.h functions respect nr_cpu_ids, but continuing to
>> return NR_CPUS for sentinel value (e.g., end of loop; or no bit found)? This
>> would not need to change tonnes of code. It only gets part of the benefit
>> (reducing cpu time overhead) but is more palatable?
> That would be possible, but would again leave is in a somewhat
> incomplete state. (Note that I did leave NR_CPUS in the stop-
> machine logic).
>
>>> 06: allow efficient allocation of multiple CPU masks at once
>> That is utterly hideous and for insignificant saving.
> I was afraid you would say that, and I'm not fully convinced
> either. But I wanted to give it a try to see how bad it is. The
> more significant saving here really comes from not allocating
> the CPU masks at all for unused irq_desc-s.
>
> Jan

The saving of not allocating masks for unused irq_desc's (and irq_cfg's)
will be significant in the general case.  (3 * NR_UNUSED_IRQs *
sizeof(mask)) where the average system is wasting most of 224 IRQs per CPU.

However, I am against moving the masks out of irq_desc (perhaps this is
the C++ coder inside me).

Would an acceptable alternative be to change irq_desc to use
cpumask_var_t's and allocate them on first use? (I have not spent long
thinking about this, so it is possible that the extra checks for Null
pointers on the irq path might be counter productive?)

~Andrew

>
> _______________________________________________
> 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 Oct 20 08:59:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 08:59:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGv1u-0003j0-DC; Thu, 20 Oct 2011 08:59:38 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGuzz-0003TM-Cv
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:57:40 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319126256!173553!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23441 invoked from network); 20 Oct 2011 15:57:36 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-11.tower-182.messagelabs.com with AES256-SHA encrypted
	SMTP; 20 Oct 2011 15:57:36 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Thu, 20 Oct 2011 16:59:04 +0100
Message-Id: <4EA0610D020000780005C8ED@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Thu, 20 Oct 2011 16:57:33 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Andrew Cooper" <andrew.cooper3@citrix.com>
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling
	scalability	improvements
References: <4EA03FF4020000780005C797@nat28.tlf.novell.com>
	<CAC5F83E.235C3%keir.xen@gmail.com>
	<4EA0583B020000780005C8A8@nat28.tlf.novell.com>
	<4EA04302.2040101@citrix.com>
In-Reply-To: <4EA04302.2040101@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 20.10.11 at 17:49, Andrew Cooper <andrew.cooper3@citrix.com> wrote:
> The saving of not allocating masks for unused irq_desc's (and irq_cfg's)
> will be significant in the general case.  (3 * NR_UNUSED_IRQs *
> sizeof(mask)) where the average system is wasting most of 224 IRQs per =
CPU.
>=20
> However, I am against moving the masks out of irq_desc (perhaps this is
> the C++ coder inside me).

I didn't propose moving them out of there.

> Would an acceptable alternative be to change irq_desc to use
> cpumask_var_t's and allocate them on first use? (I have not spent long
> thinking about this, so it is possible that the extra checks for Null
> pointers on the irq path might be counter productive?)

That's what it does (or really it allocates them for all GSIs at boot, and
then in create_irq() for the dynamically allocated ones). There's no
reason to worry about NULL checks - any access to a never initialized
irq_desc is a bug anyway.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 09:08:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 09:08:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGvAw-0004TA-Ts; Thu, 20 Oct 2011 09:08:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGv6c-00048p-OJ
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 09:04:31 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319126667!176224!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22825 invoked from network); 20 Oct 2011 16:04:27 -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;
	20 Oct 2011 16:04:27 -0000
Received: by wyi11 with SMTP id 11so3814043wyi.30
	for <xen-devel@lists.xensource.com>;
	Thu, 20 Oct 2011 09:04:27 -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=Gf7B0hs21X+MqbAVfZcSWo01+kAm2+xPwk935desek8=;
	b=cBEB2c/a5xcra0nd9d7SriOBluWQCi50ONYxWZySUAjteSQUgIVEyQNiBXAN8Ut43u
	D54XxxunNFXM08SUea/3nwGJXn/ZUuLm/hHTxoZeQ9FU/hrFvH7eorzygmtduoxaKaFz
	/faRSihkB8pj3mKnut0gXTjgu4+syrsLorlcY=
Received: by 10.227.2.131 with SMTP id 3mr4301176wbj.65.1319126667320;
	Thu, 20 Oct 2011 09:04:27 -0700 (PDT)
Received: from [192.168.1.3] (host86-153-22-182.range86-153.btcentralplus.com.
	[86.153.22.182])
	by mx.google.com with ESMTPS id i29sm16344994wbp.22.2011.10.20.09.04.25
	(version=SSLv3 cipher=OTHER); Thu, 20 Oct 2011 09:04:26 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 20 Oct 2011 17:04:20 +0100
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CAC60514.32CBA%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
Thread-Index: AcyPQe0TnFzlF4eNPkORs8d2QaAMAg==
In-Reply-To: <4EA0583B020000780005C8A8@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: Andrew Cooper <andrew.cooper3@citrix.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 20/10/2011 16:19, "Jan Beulich" <JBeulich@suse.com> wrote:

>>> 06: allow efficient allocation of multiple CPU masks at once
>> 
>> That is utterly hideous and for insignificant saving.
> 
> I was afraid you would say that, and I'm not fully convinced
> either. But I wanted to give it a try to see how bad it is. The
> more significant saving here really comes from not allocating
> the CPU masks at all for unused irq_desc-s.

Aren't we planning to dynamically allocate irq_desc-s? That would seem the
nicer solution here.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 09:11:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 09:11:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGvD0-0004uo-5W; Thu, 20 Oct 2011 09:11:06 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGv98-0004D1-Ap
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 09:07:09 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1319126822!36076521!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19360 invoked from network); 20 Oct 2011 16:07:03 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 16:07:03 -0000
Received: by wwf10 with SMTP id 10so3737158wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 20 Oct 2011 09:07:02 -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=zHxkbMaYE9cinjsLCUCqfhdNEXjS5lijdNc5CqkrxTI=;
	b=tYETagxpPg6s+8gTeaATNzZ2gVdxZlX7AXpwJVCktctdNzksazioKIYAOEUbmp2qRu
	Ggp+F2VYwu7snn3pIKko+Wv2KtmBjupzXutF/MbhWETM1hmSh/Qxa1fACy0hig6mEBVv
	kVJoZ0gAS/3c34+DKeX5QkV12Qyxu41zuHNpM=
Received: by 10.216.137.13 with SMTP id x13mr8567488wei.52.1319126779404;
	Thu, 20 Oct 2011 09:06:19 -0700 (PDT)
Received: from [192.168.1.3] (host86-153-22-182.range86-153.btcentralplus.com.
	[86.153.22.182])
	by mx.google.com with ESMTPS id fw16sm8671755wbb.13.2011.10.20.09.06.17
	(version=SSLv3 cipher=OTHER); Thu, 20 Oct 2011 09:06:18 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 20 Oct 2011 17:06:06 +0100
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
From: Keir Fraser <keir@xen.org>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CAC6057E.32CBB%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
Thread-Index: AcyPQixBPZxKdNMFzEuZZNNVLIZ9yA==
In-Reply-To: <4EA0583B020000780005C8A8@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 20/10/2011 16:19, "Jan Beulich" <JBeulich@suse.com> wrote:

>> I suppose there is a second argument that it shrinks the containing
>> structures (struct domain, struct vcpu, struct irq_desc, ...) and maybe
>> helps reduce our order!=0 allocations?
> 
> Yes - that's what made me start taking over these Linux bits. What I
> sent here just continues on that route. I was really hoping that we
> wouldn't leave this in a half baked state.

Has Linux gone wholesale down this route, then?

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 09:48:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 09:48:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGvnR-00061e-6m; Thu, 20 Oct 2011 09:48:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RGvmh-0005nS-Dz
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 09:47:59 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319129251!49980904!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1098 invoked from network); 20 Oct 2011 16:47:31 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-5.tower-27.messagelabs.com with SMTP;
	20 Oct 2011 16:47:31 -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
	p9KGlscr015311; Thu, 20 Oct 2011 16:47:54 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 p9KGlstB017457; 
	Thu, 20 Oct 2011 12:47:54 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 20 Oct 2011 12:48:04 -0400
Message-Id: <1319129284-521-1-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319124957-32269-2-git-send-email-dgdegra@tycho.nsa.gov>
References: <1319124957-32269-2-git-send-email-dgdegra@tycho.nsa.gov>
Cc: Daniel De Graaf <dgdegra@tycho.nsa.gov>, xen-devel@lists.xensource.com,
	Ian.Campbell@citrix.com, david.vrabel@citrix.com
Subject: [Xen-devel] [PATCH 1/6 v2] xenbus: Support HVM backends
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Initial version lacked the list_del in xenbus_unmap_ring_vfree_hvm

-------------------------------------------------------->8

Add HVM implementations of xenbus_(map,unmap)_ring_v(alloc,free) so
that ring mappings can be done without using GNTMAP_contains_pte which
is not supported on HVM.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/xenbus/xenbus_client.c |  155 +++++++++++++++++++++++++++++-------
 1 files changed, 125 insertions(+), 30 deletions(-)

diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c
index 52bc57f..4b2fbcc 100644
--- a/drivers/xen/xenbus/xenbus_client.c
+++ b/drivers/xen/xenbus/xenbus_client.c
@@ -32,15 +32,26 @@
 
 #include <linux/slab.h>
 #include <linux/types.h>
+#include <linux/spinlock.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/balloon.h>
 #include <xen/events.h>
 #include <xen/grant_table.h>
 #include <xen/xenbus.h>
 
+struct xenbus_map_node {
+	struct list_head next;
+	struct page *page;
+	grant_handle_t handle;
+};
+
+static DEFINE_SPINLOCK(xenbus_valloc_lock);
+static LIST_HEAD(xenbus_valloc_pages);
+
 const char *xenbus_strstate(enum xenbus_state state)
 {
 	static const char *const name[] = {
@@ -419,21 +430,8 @@ int xenbus_free_evtchn(struct xenbus_device *dev, int port)
 EXPORT_SYMBOL_GPL(xenbus_free_evtchn);
 
 
-/**
- * xenbus_map_ring_valloc
- * @dev: xenbus device
- * @gnt_ref: grant reference
- * @vaddr: pointer to address to be filled out by mapping
- *
- * Based on Rusty Russell's skeleton driver's map_page.
- * Map a page of memory into this domain from another domain's grant table.
- * xenbus_map_ring_valloc allocates a page of virtual address space, maps the
- * page to that address, and sets *vaddr to that address.
- * Returns 0 on success, and GNTST_* (see xen/include/interface/grant_table.h)
- * or -ENOMEM on error. If an error is returned, device will switch to
- * XenbusStateClosing and the error message will be saved in XenStore.
- */
-int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
+static int xenbus_map_ring_valloc_pv(struct xenbus_device *dev,
+                                     int gnt_ref, void **vaddr)
 {
 	struct gnttab_map_grant_ref op = {
 		.flags = GNTMAP_host_map | GNTMAP_contains_pte,
@@ -468,6 +466,64 @@ int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
 	*vaddr = area->addr;
 	return 0;
 }
+
+static int xenbus_map_ring_valloc_hvm(struct xenbus_device *dev,
+                                     int gnt_ref, void **vaddr)
+{
+	struct xenbus_map_node *node;
+	int err;
+	void *addr;
+
+	*vaddr = NULL;
+
+	node = kzalloc(sizeof(*node), GFP_KERNEL);
+	if (!node)
+		return -ENOMEM;
+
+	err = alloc_xenballooned_pages(1, &node->page, false);
+	if (err)
+		goto out_err;
+
+	addr = pfn_to_kaddr(page_to_pfn(node->page));
+
+	err = xenbus_map_ring(dev, gnt_ref, &node->handle, addr);
+	if (err)
+		goto out_err;
+
+	spin_lock(&xenbus_valloc_lock);
+	list_add(&node->next, &xenbus_valloc_pages);
+	spin_unlock(&xenbus_valloc_lock);
+
+	*vaddr = addr;
+	return 0;
+
+ out_err:
+	free_xenballooned_pages(1, &node->page);
+	kfree(node);
+	return err;
+}
+
+/**
+ * xenbus_map_ring_valloc
+ * @dev: xenbus device
+ * @gnt_ref: grant reference
+ * @vaddr: pointer to address to be filled out by mapping
+ *
+ * Based on Rusty Russell's skeleton driver's map_page.
+ * Map a page of memory into this domain from another domain's grant table.
+ * xenbus_map_ring_valloc allocates a page of virtual address space, maps the
+ * page to that address, and sets *vaddr to that address.
+ * Returns 0 on success, and GNTST_* (see xen/include/interface/grant_table.h)
+ * or -ENOMEM on error. If an error is returned, device will switch to
+ * XenbusStateClosing and the error message will be saved in XenStore.
+ */
+int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
+{
+	if (xen_pv_domain())
+		return xenbus_map_ring_valloc_pv(dev, gnt_ref, vaddr);
+	else
+		return xenbus_map_ring_valloc_hvm(dev, gnt_ref, vaddr);
+}
 EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc);
 
 
@@ -509,20 +565,7 @@ int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
 }
 EXPORT_SYMBOL_GPL(xenbus_map_ring);
 
-
-/**
- * xenbus_unmap_ring_vfree
- * @dev: xenbus device
- * @vaddr: addr to unmap
- *
- * Based on Rusty Russell's skeleton driver's unmap_page.
- * Unmap a page of memory in this domain that was imported from another domain.
- * Use xenbus_unmap_ring_vfree if you mapped in your memory with
- * xenbus_map_ring_valloc (it will free the virtual address space).
- * Returns 0 on success and returns GNTST_* on error
- * (see xen/include/interface/grant_table.h).
- */
-int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
+static int xenbus_unmap_ring_vfree_pv(struct xenbus_device *dev, void *vaddr)
 {
 	struct vm_struct *area;
 	struct gnttab_unmap_grant_ref op = {
@@ -565,8 +608,60 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
 
 	return op.status;
 }
-EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
 
+static int xenbus_unmap_ring_vfree_hvm(struct xenbus_device *dev, void *vaddr)
+{
+	int rv;
+	struct xenbus_map_node *node;
+	void *addr;
+
+	spin_lock(&xenbus_valloc_lock);
+	list_for_each_entry(node, &xenbus_valloc_pages, next) {
+		addr = pfn_to_kaddr(page_to_pfn(node->page));
+		if (addr == vaddr) {
+			list_del(&node->next);
+			goto found;
+		}
+	}
+	node = NULL;
+ found:
+	spin_unlock(&xenbus_valloc_lock);
+
+	if (!node) {
+		xenbus_dev_error(dev, -ENOENT,
+				 "can't find mapped virtual address %p", vaddr);
+		return -ENOENT;
+	}
+
+	rv = xenbus_unmap_ring(dev, node->handle, addr);
+
+	if (!rv)
+		free_xenballooned_pages(1, &node->page);
+
+	kfree(node);
+	return rv;
+}
+
+/**
+ * xenbus_unmap_ring_vfree
+ * @dev: xenbus device
+ * @vaddr: addr to unmap
+ *
+ * Based on Rusty Russell's skeleton driver's unmap_page.
+ * Unmap a page of memory in this domain that was imported from another domain.
+ * Use xenbus_unmap_ring_vfree if you mapped in your memory with
+ * xenbus_map_ring_valloc (it will free the virtual address space).
+ * Returns 0 on success and returns GNTST_* on error
+ * (see xen/include/interface/grant_table.h).
+ */
+int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
+{
+	if (xen_pv_domain())
+		return xenbus_unmap_ring_vfree_pv(dev, vaddr);
+	else
+		return xenbus_unmap_ring_vfree_hvm(dev, vaddr);
+}
+EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
 
 /**
  * xenbus_unmap_ring
-- 
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 Oct 20 10:16:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 10:16:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGwES-00072w-Px; Thu, 20 Oct 2011 10:16:40 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwD5-0006q8-La
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 10:15:16 -0700
X-Env-Sender: paolo.bonzini@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319130882!53682760!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13827 invoked from network); 20 Oct 2011 17:14:42 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 17:14:42 -0000
Received: by wwf10 with SMTP id 10so3819263wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 20 Oct 2011 10:15:12 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=sender:from:to:cc:subject:date:message-id:x-mailer;
	bh=TJXwFIPtIb7SqBL9ByZUQ8BLq3zF7UxhjpGeec8RiMQ=;
	b=atU54CZcDGOHK5+oJGg26rwzDDkIcPyMM9yNo6K7xR+mivO2sMs1/LepqaCtp5DfCj
	lKXbjZVZl47wqTMt4hZ3loWFRzyuf8iTrdNORDA9fixiYpgjhI3MUB/mXCeQRygUZSE3
	nVaMGjqYpCn0TLth6vuuO0g25Ux8H106ao+0Y=
Received: by 10.227.62.196 with SMTP id y4mr4442226wbh.19.1319130912464;
	Thu, 20 Oct 2011 10:15:12 -0700 (PDT)
Received: from localhost.localdomain (93-34-218-143.ip51.fastwebnet.it.
	[93.34.218.143])
	by mx.google.com with ESMTPS id o17sm14838531wbm.6.2011.10.20.10.15.10
	(version=TLSv1/SSLv3 cipher=OTHER);
	Thu, 20 Oct 2011 10:15:10 -0700 (PDT)
From: Paolo Bonzini <pbonzini@redhat.com>
To: initramfs@vger.kernel.org
Date: Thu, 20 Oct 2011 19:15:06 +0200
Message-Id: <1319130906-14267-1-git-send-email-pbonzini@redhat.com>
X-Mailer: git-send-email 1.7.6
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH] remove the xen dracut module
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 module is unnecessary and it has been for a while.  
Most Xen systems will not be using the module, even now, because
xen-detect is not installed by default on most Xen systems, and
dracut uses xen-detect to decide whether to include the module.

It also has some problems:

1) it does not try loading xen_platform_pci;

2) it loads modules unnecessarily; modules.alias is where all Xen support
should reside.  Assuming xenbus_probe_frontend and xen_platform_pci
are loaded so that Xen devices are probed, other modules are picked up
automatically thanks to aliases such as

    alias xen:vbd xen_blkfront

3) Even not-so-recent kernels (say 2.6.32) require the xen_platform_pci
and xenbus_probe_frontend modules even for non-paravirtualized guests.
60xen/module-setup.sh picks the module only for PV guests.

So, just require xenbus_probe_frontend to be builtin, and also
xen_platform_pci for fully-virtualized guests, and remove the module.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>

---
 modules.d/60xen/module-setup.sh |   42 ---------------------------------------
 modules.d/60xen/xen-pre-udev.sh |   13 ------------
 2 files changed, 0 insertions(+), 55 deletions(-)
 delete mode 100755 modules.d/60xen/module-setup.sh
 delete mode 100755 modules.d/60xen/xen-pre-udev.sh

diff --git a/modules.d/60xen/module-setup.sh b/modules.d/60xen/module-setup.sh
deleted file mode 100755
index 75309be..0000000
--- a/modules.d/60xen/module-setup.sh
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
-# ex: ts=8 sw=4 sts=4 et filetype=sh
-
-check() {
-    # No Xen-detect? Boo!!
-    if ! hash xen-detect 2>/dev/null; then
-        [[ -d /usr/lib/xen-default ]] && \
-            hash -p /usr/lib/xen-default/bin/xen-detect xen-detect || return 1
-    fi
-
-    . $dracutfunctions
-    [[ $debug ]] && set -x
-
-    # Yes, we are under Xen PV env.
-    xen-detect | grep -q -v PV || return 0
-
-    return 1
-}
-
-depends() {
-    return 0
-}
-
-installkernel() {
-    local _i
-    for _i in \
-        xenbus_probe_frontend xen-pcifront \
-        xen-fbfront xen-kbdfront xen-blkfront xen-netfront \
-        ; do
-        modinfo -k $kernel $_i >/dev/null 2>&1 && instmods $_i
-    done
-
-}
-
-install() {
-    hash xen-detect 2>/dev/null || \
-        hash -p /usr/lib/xen-default/bin/xen-detect xen-detect
-    inst "$(hash -t xen-detect)" /sbin/xen-detect
-    inst_hook pre-udev 40 "$moddir/xen-pre-udev.sh"
-}
-
diff --git a/modules.d/60xen/xen-pre-udev.sh b/modules.d/60xen/xen-pre-udev.sh
deleted file mode 100755
index f039aaa..0000000
--- a/modules.d/60xen/xen-pre-udev.sh
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/sh
-# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
-# ex: ts=8 sw=4 sts=4 et filetype=sh
-xen-detect
-RC=$?
-if [ "$RC" = "1" ] ; then
-    modprobe xenbus_probe_frontend
-    modprobe xen-kbdfront
-    modprobe xen-fbfront
-    modprobe xen-blkfront
-    modprobe xen-netfront
-    modprobe xen-pcifront
-fi
-- 
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 Thu Oct 20 10:18:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 10:18:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGwFz-0007RR-2O; Thu, 20 Oct 2011 10:18:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwD6-0006q9-Bg
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 10:15:17 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319130913!181100!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2771 invoked from network); 20 Oct 2011 17:15:13 -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;
	20 Oct 2011 17:15:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315180800"; 
   d="scan'208";a="8505780"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 17:15: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; Thu, 20 Oct 2011 18:15:12 +0100
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 1RGwD2-0000lB-0B;
	Thu, 20 Oct 2011 17:15:12 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RGwD1-0001se-VY;
	Thu, 20 Oct 2011 18:15:11 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9351-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 20 Oct 2011 18:15:11 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9351: 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 9351 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9351/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail pass in 9350
 test-amd64-i386-win          14 guest-start.2        fail in 9350 pass in 9351

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-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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  a06609840ff1
baseline version:
 xen                  14b369de76ad

------------------------------------------------------------
People who touched revisions under test:
  Andrew Cooper <andrew.cooper3@citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Olaf Hering <olaf@aepfle.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=a06609840ff1
+ . 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 a06609840ff1
+ branch=xen-unstable
+ revision=a06609840ff1
+ . 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 a06609840ff1 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 4 changes to 3 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 11:02:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11:02:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGwwo-0000aj-7z; Thu, 20 Oct 2011 11:02:30 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000Jo-Ma
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:15 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319133589!1779079!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25682 invoked from network); 20 Oct 2011 17:59:51 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 17:59:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="167644836"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:51 -0400
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, 20 Oct 2011 13:59:50 -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 p9KHxkVo025184;	Thu, 20 Oct 2011 10:59:50 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:25 +0100
Message-ID: <1319133573-25891-4-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 03/11] 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 Thu Oct 20 11:05:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11:05:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGwzZ-0000zy-AS; Thu, 20 Oct 2011 11:05:21 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000Jl-Mo
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:16 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319133588!183868!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23964 invoked from network); 20 Oct 2011 17:59:50 -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;
	20 Oct 2011 17:59:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="18411053"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:48 -0400
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, 20 Oct 2011 13:59:47 -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 p9KHxkVl025184;	Thu, 20 Oct 2011 10:59:46 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:22 +0100
Message-ID: <1319133573-25891-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>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 00/11] 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 improve the QMP client in lib XenLight to be able to insert a
PCI passthrough device with the upstream QEMU. This require to apply the patch
(RFC) series post earlier this week for QEMU.

The first three patches are fix.

The first patch create a key in xenstore with the version of the running device
model, here: /libxl/$domid/dm-version

Change with v1:
  - 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 (11):
  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_handle.
  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

 tools/libxl/libxl.c          |    2 +
 tools/libxl/libxl_create.c   |   28 ++++++
 tools/libxl/libxl_internal.c |   19 ++++
 tools/libxl/libxl_internal.h |   16 +++-
 tools/libxl/libxl_json.c     |   56 ++++++-----
 tools/libxl/libxl_pci.c      |   71 ++++++++++-----
 tools/libxl/libxl_qmp.c      |  214 +++++++++++++++++++++++++++++++++++-------
 7 files changed, 322 insertions(+), 84 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 Thu Oct 20 11:07:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11:07:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGx1K-0001O1-MJ; Thu, 20 Oct 2011 11:07:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000Jn-MZ
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:15 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319133589!1779079!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25656 invoked from network); 20 Oct 2011 17:59:50 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 17:59:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="167644833"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:49 -0400
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, 20 Oct 2011 13:59:48 -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 p9KHxkVm025184;	Thu, 20 Oct 2011 10:59:48 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:23 +0100
Message-ID: <1319133573-25891-2-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 01/11] 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 Thu Oct 20 11:09:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11:09:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGx3e-0001mc-Mv; Thu, 20 Oct 2011 11:09:35 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000Jq-Mp
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:16 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319133588!183868!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24056 invoked from network); 20 Oct 2011 17:59:52 -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;
	20 Oct 2011 17:59:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="18411059"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:52 -0400
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, 20 Oct 2011 13:59:51 -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 p9KHxkVp025184;	Thu, 20 Oct 2011 10:59:51 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:26 +0100
Message-ID: <1319133573-25891-5-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 04/11] 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.

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   |   28 ++++++++++++++++++++++++++++
 tools/libxl/libxl_internal.c |   19 +++++++++++++++++++
 tools/libxl/libxl_internal.h |    5 +++++
 4 files changed, 54 insertions(+), 0 deletions(-)

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 064fbc4..50b97c2 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__sprintf(&gc, "/libxl/%d", 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..bed991c 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -322,6 +322,9 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info,
     xs_transaction_t t = 0;
     xen_domain_handle_t handle;
 
+    struct xs_permissions libxlperm[1];
+    char *libxl_path = NULL;
+
     assert(!libxl_domid_valid_guest(*domid));
 
     uuid_string = libxl__uuid2string(gc, info->uuid);
@@ -368,6 +371,15 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info,
         goto out;
     }
 
+    libxl_path = libxl__sprintf(gc, "/libxl/%i", *domid);
+    if (!libxl_path) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot allocate create paths");
+        rc = ERROR_FAIL;
+        goto out;
+    }
+    libxlperm[0].id = 0;
+    libxlperm[0].perms = XS_PERM_NONE;
+
     roperm[0].id = 0;
     roperm[0].perms = XS_PERM_NONE;
     roperm[1].id = *domid;
@@ -386,6 +398,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, libxlperm, ARRAY_SIZE(libxlperm));
+
     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 +445,16 @@ 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__sprintf(gc, "/libxl/%i/dm-version", domid);
+    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 +511,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..5d0a2d4 100644
--- a/tools/libxl/libxl_internal.c
+++ b/tools/libxl/libxl_internal.c
@@ -319,6 +319,25 @@ 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__sprintf(gc, "/libxl/%d/dm-version", domid);
+    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) {
+        return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL;
+    }
+    return value;
+}
+
 /*
  * Local variables:
  * mode: C
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 2e26ac6..5720b31 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -554,6 +554,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
 
 /*
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 11:13:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11:13:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGx6z-0002Bi-3U; Thu, 20 Oct 2011 11:13:01 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000Js-Mo
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:15 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319133588!183868!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24090 invoked from network); 20 Oct 2011 17:59:54 -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;
	20 Oct 2011 17:59:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="18411060"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:54 -0400
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, 20 Oct 2011 13:59:53 -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 p9KHxkVr025184;	Thu, 20 Oct 2011 10:59:53 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:28 +0100
Message-ID: <1319133573-25891-7-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 06/11] 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 d711cca..8d95aae 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 Thu Oct 20 11:14:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11: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 1RGx8r-0002Zu-Rz; Thu, 20 Oct 2011 11:14:58 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000Jv-Ma
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:15 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319133589!1779079!4
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25782 invoked from network); 20 Oct 2011 17:59:55 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 17:59:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="167644850"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:55 -0400
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, 20 Oct 2011 13:59: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 p9KHxkVs025184;	Thu, 20 Oct 2011 10:59:54 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:29 +0100
Message-ID: <1319133573-25891-8-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 07/11] 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 8d95aae..5ea9429 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 Thu Oct 20 11:16:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11:16:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGxAf-0002yC-Ip; Thu, 20 Oct 2011 11:16:49 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000K3-MZ
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:16 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319133589!1779079!5
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25861 invoked from network); 20 Oct 2011 17:59:58 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 17:59:58 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="167644857"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:58 -0400
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, 20 Oct 2011 13:59:57 -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 p9KHxkVv025184;	Thu, 20 Oct 2011 10:59:57 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:32 +0100
Message-ID: <1319133573-25891-11-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 10/11] 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      |  107 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 105 insertions(+), 0 deletions(-)

diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 849b251..09f618f 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"
@@ -444,6 +447,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 547cd53..bce7e16 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,
@@ -619,6 +620,112 @@ int libxl__qmp_query_serial(libxl__qmp_handler *qmp)
     return rc;
 }
 
+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_request_handle request = {
+        .callback = pci_add_callback,
+        .opaque = pcidev,
+    };
+
+    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, qmp->timeout);
+    if (rc == 0) {
+        rc = qmp_synchronous_send(qmp, "query-pci", NULL,
+                                  &request, qmp->timeout);
+        if (rc == 0) {
+            rc = request.rc;
+        }
+    }
+
+    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 Thu Oct 20 11:17:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11:17:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGxBb-0003LN-Ly; Thu, 20 Oct 2011 11:17:47 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000K5-Mp
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:16 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319133588!183868!7
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24226 invoked from network); 20 Oct 2011 17:59:59 -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;
	20 Oct 2011 17:59:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="18411063"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:59 -0400
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, 20 Oct 2011 13:59: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 p9KHxkVw025184;	Thu, 20 Oct 2011 10:59:58 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:33 +0100
Message-ID: <1319133573-25891-12-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 11/11] 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 |   71 ++++++++++++++++++++++++++++++++--------------
 1 files changed, 49 insertions(+), 22 deletions(-)

diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 842d5b0..b18e481 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,13 @@ 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:
+                rc = libxl__qmp_pci_add(gc, domid, pcidev);
+                break;
+            default:
+                rc = qemu_pci_add_xenstore(gc, domid, pcidev);
+        }
         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 Thu Oct 20 11:18:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11:18:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGxCR-0003iX-Ca; Thu, 20 Oct 2011 11:18:39 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000Jm-Mn
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:15 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319133588!183868!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23984 invoked from network); 20 Oct 2011 17:59:50 -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;
	20 Oct 2011 17:59:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="18411054"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:50 -0400
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, 20 Oct 2011 13:59:49 -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 p9KHxkVn025184;	Thu, 20 Oct 2011 10:59:49 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:24 +0100
Message-ID: <1319133573-25891-3-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 02/11] 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

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_json.c |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
index 11f65fc..c743114 100644
--- a/tools/libxl/libxl_json.c
+++ b/tools/libxl/libxl_json.c
@@ -744,7 +744,9 @@ 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));
-    status = yajl_parse_complete(yajl_ctx.hand);
+    if (status == yajl_status_ok) {
+        status = yajl_parse_complete(yajl_ctx.hand);
+    }
 
     if (status == yajl_status_ok) {
         libxl__json_object *o = yajl_ctx.head;
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 11:19:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11:19:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGxDH-00045f-Pw; Thu, 20 Oct 2011 11:19:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000Ju-Mn
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:15 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319133588!183868!5
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24141 invoked from network); 20 Oct 2011 17:59:56 -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;
	20 Oct 2011 17:59:56 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="18411061"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:56 -0400
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, 20 Oct 2011 13:59:55 -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 p9KHxkVt025184;	Thu, 20 Oct 2011 10:59:55 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:30 +0100
Message-ID: <1319133573-25891-9-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 08/11] libxl_qmp,
	Introduce qmp_request_handle.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 keep the return code of the callback, so a caller can read
it.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_qmp.c |   71 +++++++++++++++++++++++++++++-----------------
 1 files changed, 45 insertions(+), 26 deletions(-)

diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index 5ea9429..547cd53 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -46,10 +46,16 @@ typedef int (*qmp_callback_t)(libxl__qmp_handler *qmp,
                               const libxl__json_object *tree,
                               void *opaque);
 
-typedef struct callback_id_pair {
-    int id;
+typedef struct qmp_request_handle {
     qmp_callback_t callback;
     void *opaque;
+    /* return code of the callback */
+    int rc;
+} qmp_request_handle;
+typedef struct callback_id_pair {
+    qmp_request_handle *handle;
+    bool free_it; /* tell if handle need to be freed */
+    int id;
     SIMPLEQ_ENTRY(callback_id_pair) next;
 } callback_id_pair;
 
@@ -73,7 +79,7 @@ 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_request_handle *handle, bool free_it);
 
 static const int QMP_SOCKET_CONNECT_TIMEOUT = 5;
 
@@ -161,8 +167,9 @@ 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_request_handle *h = calloc(1, sizeof (qmp_request_handle));
+    h->callback = qmp_capabilities_callback;
+    return qmp_send(qmp, "qmp_capabilities", NULL, h, 1);
 }
 
 /*
@@ -213,14 +220,17 @@ static void qmp_handle_error_response(libxl__qmp_handler *qmp,
     resp = libxl__json_map_get("desc", resp, JSON_STRING);
 
     if (pp) {
-        if (pp->callback) {
-            pp->callback(qmp, NULL, pp->opaque);
+        qmp_request_handle *h = pp->handle;
+        if (h) {
+            h->rc = h->callback(qmp, NULL, h->opaque);
         }
         if (pp->id == qmp->wait_for_id) {
             /* tell that the id have been processed */
             qmp->wait_for_id = 0;
         }
         SIMPLEQ_REMOVE(&qmp->callback_list, pp, callback_id_pair, next);
+        if (pp->free_it)
+            free(pp->handle);
         free(pp);
     }
 
@@ -241,31 +251,33 @@ 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,
+            qmp_request_handle *h = pp->handle;
+            if (h) {
+                h->rc = h->callback(qmp,
                              libxl__json_map_get("return", resp, JSON_ANY),
-                             pp->opaque);
+                             h->opaque);
             }
             if (pp->id == qmp->wait_for_id) {
                 /* tell that the id have been processed */
                 qmp->wait_for_id = 0;
             }
             SIMPLEQ_REMOVE(&qmp->callback_list, pp, callback_id_pair, next);
+            if (pp->free_it)
+                free(pp->handle);
             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 +370,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 +428,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 +443,12 @@ 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_request_handle *handle, bool free_it)
 {
     yajl_gen_config conf = { 0, NULL };
     const unsigned char *buf;
@@ -475,8 +488,8 @@ static int qmp_send(libxl__qmp_handler *qmp,
         goto error;
     }
     elm->id = qmp->last_id_used;
-    elm->callback = callback;
-    elm->opaque = opaque;
+    elm->handle = handle;
+    elm->free_it = free_it;
     SIMPLEQ_INSERT_TAIL(&qmp->callback_list, elm, next);
 
     LIBXL__LOG(qmp->ctx, LIBXL__LOG_DEBUG, "next qmp command: '%s'", buf);
@@ -499,14 +512,14 @@ error:
 
 static int qmp_synchronous_send(libxl__qmp_handler *qmp, const char *cmd,
                                 libxl_key_value_list *args,
-                                qmp_callback_t callback, void *opaque,
+                                qmp_request_handle *handle,
                                 int ask_timeout)
 {
     int id = 0;
     int ret = 0;
     libxl__gc gc = LIBXL_INIT_GC(qmp->ctx);
 
-    id = qmp_send(qmp, cmd, args, callback, opaque);
+    id = qmp_send(qmp, cmd, args, handle, 0);
     if (id <= 0) {
         return -1;
     }
@@ -594,10 +607,16 @@ 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", NULL,
-                                register_serials_chardev_callback,
-                                NULL,
-                                qmp->timeout);
+    int rc = 0;
+    qmp_request_handle request = {
+        .callback = register_serials_chardev_callback,
+    };
+    rc = qmp_synchronous_send(qmp, "query-chardev", NULL,
+                              &request, qmp->timeout);
+    if (rc == 0) {
+        rc = request.rc;
+    }
+    return rc;
 }
 
 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 Thu Oct 20 11:20:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11:20:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGxE3-0004Sz-Jl; Thu, 20 Oct 2011 11:20:19 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000K1-Mo
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:16 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319133588!183868!6
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24179 invoked from network); 20 Oct 2011 17:59:57 -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;
	20 Oct 2011 17:59:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="18411062"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:57 -0400
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, 20 Oct 2011 13:59:56 -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 p9KHxkVu025184;	Thu, 20 Oct 2011 10:59:56 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:31 +0100
Message-ID: <1319133573-25891-10-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 09/11] 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 strtoll failed to
convert a string into a number, the number is stored as it (a char*).

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/libxl/libxl_internal.h |    7 +++--
 tools/libxl/libxl_json.c     |   52 +++++++++++++++++++++++------------------
 2 files changed, 33 insertions(+), 26 deletions(-)

diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 5720b31..849b251 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -465,7 +465,8 @@ typedef enum {
     JSON_TRUE,
     JSON_FALSE,
     JSON_INTEGER,
-    JSON_DOUBLE,
+    /* number is store in string, it's too big to be a long long */
+    JSON_NUMBER,
     JSON_STRING,
     JSON_MAP,
     JSON_ARRAY,
@@ -475,7 +476,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 */
@@ -534,7 +535,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 c743114..2d8f61e 100644
--- a/tools/libxl/libxl_json.c
+++ b/tools/libxl/libxl_json.c
@@ -44,6 +44,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 +61,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 +365,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,35 +507,38 @@ static int json_callback_boolean(void *opaque, int boolean)
     return 1;
 }
 
-static int json_callback_integer(void *opaque, long value)
+static int json_callback_number(void *opaque, const char *s, unsigned int len)
 {
     libxl__yajl_ctx *ctx = opaque;
-    libxl__json_object *obj;
-
-    DEBUG_GEN_VALUE(ctx, integer, value);
+    libxl__json_object *obj = NULL;
+    long long i;
 
-    if ((obj = json_object_alloc(ctx->gc, JSON_INTEGER)) == NULL)
-        return 0;
-    obj->u.i = value;
+    /* should be replace by number */
+    DEBUG_GEN_NUMBER(ctx, s, len);
 
-    if (json_object_append_to(ctx->gc, obj, ctx->current) == -1) {
-        libxl__json_object_free(ctx->gc, obj);
-        return 0;
-    }
+    i = strtoll(s, NULL, 10);
 
-    return 1;
-}
+    if ((i == LLONG_MIN || i == LLONG_MAX) && errno == ERANGE) {
+        char *t = NULL;
 
-static int json_callback_double(void *opaque, double value)
-{
-    libxl__yajl_ctx *ctx = opaque;
-    libxl__json_object *obj;
+        if ((obj = json_object_alloc(ctx->gc, JSON_NUMBER)) == NULL)
+            return 0;
 
-    DEBUG_GEN_VALUE(ctx, double, 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;
 
-    if ((obj = json_object_alloc(ctx->gc, JSON_DOUBLE)) == NULL)
-        return 0;
-    obj->u.d = value;
+        obj->u.string = t;
+    } else {
+        if ((obj = json_object_alloc(ctx->gc, JSON_INTEGER)) == NULL)
+            return 0;
+        obj->u.i = i;
+    }
 
     if (json_object_append_to(ctx->gc, obj, ctx->current) == -1) {
         libxl__json_object_free(ctx->gc, obj);
@@ -706,9 +712,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 Thu Oct 20 11:21:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 11:21:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RGxFB-0004qT-Mn; Thu, 20 Oct 2011 11:21:29 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGwuR-0000Jr-MZ
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 11:00:15 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319133589!1779079!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25740 invoked from network); 20 Oct 2011 17:59:53 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 17:59:53 -0000
X-IronPort-AV: E=Sophos;i="4.69,380,1315195200"; d="scan'208";a="167644841"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 13:59:53 -0400
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, 20 Oct 2011 13:59: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 p9KHxkVq025184;	Thu, 20 Oct 2011 10:59:52 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 20 Oct 2011 18:59:27 +0100
Message-ID: <1319133573-25891-6-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH V2 05/11] 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 |   29 +++++++++++++++++++----------
 1 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index f61a87a..d711cca 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,6 +588,7 @@ int libxl__qmp_query_serial(libxl__qmp_handler *qmp)
 {
     return qmp_synchronous_send(qmp, "query-chardev",
                                 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 Thu Oct 20 15:42:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 15:42:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH1K6-0005dO-Tk; Thu, 20 Oct 2011 15:42:50 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH1JP-0005RN-Kf
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 15:42:07 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319150524!456034!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10676 invoked from network); 20 Oct 2011 22:42:04 -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;
	20 Oct 2011 22:42:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,381,1315180800"; 
   d="scan'208";a="8509813"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 22:42: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; Thu, 20 Oct 2011 23:42:04 +0100
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 1RH1JM-0002hM-7H;
	Thu, 20 Oct 2011 22:42:04 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RH1JL-0005XH-UY;
	Thu, 20 Oct 2011 23:42:04 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9354-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 20 Oct 2011 23:42:03 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9354: 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 9354 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9354/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     11 guest-localmigrate         fail REGR. vs. 9215

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-i386-i386-win           16 leak-check/check             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-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                  d4253bc5418b
baseline version:
 xen                  3f8fb62436e6

------------------------------------------------------------
People who touched revisions under test:
------------------------------------------------------------

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:   23174:d4253bc5418b
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 20 17:36:03 2011 +0100
    
    Added signature for changeset 3eca5bf65e6c
    
    
changeset:   23173:d5bb65d3ec24
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 20 17:35:33 2011 +0100
    
    Added tag RELEASE-4.1.2 for changeset 3eca5bf65e6c
    
    
changeset:   23172:3eca5bf65e6c
tag:         RELEASE-4.1.2
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 20 17:35:24 2011 +0100
    
    Update Xen version to 4.1.2
    
    
changeset:   23171:3f8fb62436e6
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:47:08 2011 +0100
    
    Added signature for changeset 24041ed83728
    
    
(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 Oct 20 15:53:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 15:53:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH1Uj-0006Ip-Hj; Thu, 20 Oct 2011 15:53:49 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH1UE-00066s-Jc
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 15:53:19 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319151195!1058825!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2977 invoked from network); 20 Oct 2011 22:53:15 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 22:53:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,381,1315180800"; 
   d="scan'208";a="8509858"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	20 Oct 2011 22:53: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; Thu, 20 Oct 2011 23:53:03 +0100
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 1RH1Tz-0002lC-9Q;
	Thu, 20 Oct 2011 22:53:03 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RH1Tz-0006Qa-79;
	Thu, 20 Oct 2011 23:53:03 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9353-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 20 Oct 2011 23:53:03 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9353: 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 9353 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9353/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     10 guest-saverestore          fail REGR. vs. 9233
 build-amd64-oldkern           2 logs-capture(2)              broken
 build-amd64-oldkern           1 hosts-allocate               broken

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-i386-i386-xl            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-amd64-i386-xl-credit2    5 xen-boot                     fail    like 9233
 test-amd64-i386-rhel6hvm-amd  7 redhat-install               fail   never pass
 test-amd64-i386-rhel6hvm-intel  7 redhat-install               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-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-amd64-amd64-xl-win       7 windows-install              fail   never pass
 test-i386-i386-xl-win         7 windows-install              fail   never pass

version targeted for testing:
 xen                  8aded64130a6
baseline version:
 xen                  f051e9973b79

------------------------------------------------------------
People who touched revisions under test:
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   pass    
 build-amd64-oldkern                                          broken  
 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:   21548:8aded64130a6
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 20 17:35:52 2011 +0100
    
    Added signature for changeset 00b5807c08f2
    
    
changeset:   21547:ee265743eb93
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 20 17:35:43 2011 +0100
    
    Added tag RELEASE-4.0.3 for changeset 00b5807c08f2
    
    
changeset:   21546:00b5807c08f2
tag:         RELEASE-4.0.3
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 20 17:35:18 2011 +0100
    
    Update Xen version to 4.0.3
    
    
changeset:   21545:f051e9973b79
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:46:57 2011 +0100
    
    Added signature for changeset fd7c4d4e52d9
    
    
(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 Oct 20 16:15:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 16:15:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH1pf-000735-IA; Thu, 20 Oct 2011 16:15:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH1oZ-0006qB-1A
	for Xen-devel@lists.xensource.com; Thu, 20 Oct 2011 16:14:19 -0700
X-Env-Sender: mukesh.rathor@oracle.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1319152454!461669!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9145 invoked from network); 20 Oct 2011 23:14:15 -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; 20 Oct 2011 23:14:15 -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
	p9KNE7iR008356
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 20 Oct 2011 23:14:09 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
	p9KNE69O010477
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 23:14:07 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
	p9KNDwVB010881; Thu, 20 Oct 2011 18:13:59 -0500
Received: from mantra.us.oracle.com (/130.35.68.95)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 20 Oct 2011 16:13:58 -0700
Date: Thu, 20 Oct 2011 16:13:57 -0700
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Tim Deegan <tim@xen.org>
Subject: Re: [Xen-devel] Re: HYBRID: gnttab_map() to map shared frames..
Message-ID: <20111020161357.36f06afd@mantra.us.oracle.com>
In-Reply-To: <20111020103912.GF49983@ocelot.phlegethon.org>
References: <20111013181853.15381ef5@mantra.us.oracle.com>
	<CABDA859.22DA3%keir.xen@gmail.com>
	<20111017191810.28876947@mantra.us.oracle.com>
	<1318925582.16132.31.camel@zakaz.uk.xensource.com>
	<20111018121727.27a3f03c@mantra.us.oracle.com>
	<1319013573.3385.60.camel@zakaz.uk.xensource.com>
	<20111019192918.627bfe70@mantra.us.oracle.com>
	<20111020103912.GF49983@ocelot.phlegethon.org>
Organization: Oracle Corporation
X-Mailer: Claws Mail 3.7.6 (GTK+ 2.18.9; x86_64-redhat-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090201.4EA0AB42.002F,ss=1,re=0.000,fgs=0
Cc: Keir Fraser <keir.xen@gmail.com>,
	"Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Jeremy, Ian Campbell <Ian.Campbell@citrix.com>,
	Fitzhardinge <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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 20 Oct 2011 11:39:12 +0100
Tim Deegan <tim@xen.org> wrote:

> At 19:29 -0700 on 19 Oct (1319052558), Mukesh Rathor wrote:
> > > What about using PFNs from right at the top, i.e. right up near
> > > 0xffffffff? I don't think there's any particular reason these
> > > special PFNs need to be contiguous with the "regular" ones. This
> > > would limit the total amount of RAM you could give a hybrid
> > > guest, but not by much.
> > 
> > Yeah, I dinkered around a bit with e820 and realized it would be
> > migration headache, so just decided to do this. I allocate pfn's
> > near 0xffffffff and map it. Things are fine, I see all page table
> > entries just fine, the entry is put into the p2m also via
> > ept_set_entry, but for some reason it's taking fault on accessing
> > shared[0] with error code 0xb that doesn't make sense. Even the mfn
> > in xen is writable page. 
> > 
> > PGD 77895067 PUD 77896067 PMD 77897067 PTE 80000ffffffdf063
> 
> 0xB means you've got a reserved bit set.  Is 0xfff_fffdf000 above the 
> number of supported addressing bits on your CPU, by any chance?
> 
> Cheers,
> 
> Tim

Ooops, forgot to PAGE_SHIFT..  got that working now...

thanks,
mukesh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 16:17:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 16:17:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH1s5-0007SJ-3Q; Thu, 20 Oct 2011 16:17:57 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH1ra-0007G2-Cp
	for Xen-devel@lists.xensource.com; Thu, 20 Oct 2011 16:17:26 -0700
X-Env-Sender: mukesh.rathor@oracle.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319152641!201645!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20740 invoked from network); 20 Oct 2011 23:17:23 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-3.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	20 Oct 2011 23:17: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
	p9KNHHS2007534
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 20 Oct 2011 23:17: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
	p9KNHGIr013428
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 20 Oct 2011 23:17:17 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
	p9KNHB12012444; Thu, 20 Oct 2011 18:17:11 -0500
Received: from mantra.us.oracle.com (/130.35.68.95)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 20 Oct 2011 16:17:10 -0700
Date: Thu, 20 Oct 2011 16:17:09 -0700
From: Mukesh Rathor <mukesh.rathor@oracle.com>
To: Mukesh Rathor <mukesh.rathor@oracle.com>
Subject: Re: [Xen-devel] HYBRID: (PV in HVM) update
Message-ID: <20111020161709.42a56c27@mantra.us.oracle.com>
In-Reply-To: <20110818155414.1d8c3015@mantra.us.oracle.com>
References: <20110818155414.1d8c3015@mantra.us.oracle.com>
Organization: Oracle Corporation
X-Mailer: Claws Mail 3.7.6 (GTK+ 2.18.9; x86_64-redhat-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090208.4EA0ABFF.0090,ss=1,re=0.000,fgs=0
Cc: Keir, "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Fraser <keir.xen@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 Thu, 18 Aug 2011 15:54:14 -0700
Mukesh Rathor <mukesh.rathor@oracle.com> wrote:
> 
> JFYI... So I had a third type is_hybrid in my prototype, that I
> thought I could get rid of, and hide things under is_hvm check. But
> that just touches too much code, and things get ugly a bit all over.
> 
> It seems I could just mark the guest PV if not EPT and using PV
> paging, and mark it HVM if EPT enabled to keep changes minimum, and
> just check for hybrid where needed (so add is_hybrid back in). Trying
> that now....
> 
> thanks
> Mukesh
> 


YEAY guys!!! I now have PV in HVM guest running with EPT! 
I'll clean up the code (tons of debug stuff right now), and post
it for anyone to look at. 

Next and final frontier after that, running it as dom0.

thanks,
mukesh



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 17:33:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 17: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 1RH32q-0001ZS-Ch; Thu, 20 Oct 2011 17:33:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH31q-0001L4-VR
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 17:32:07 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1319157123!32434267!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29428 invoked from network); 21 Oct 2011 00:32:03 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	21 Oct 2011 00:32:03 -0000
X-IronPort-AV: E=Sophos;i="4.69,382,1315180800"; 
   d="scan'208";a="8510428"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	21 Oct 2011 00:32:02 +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, 21 Oct 2011 01:32:02 +0100
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 1RH31m-0003JX-Ez;
	Fri, 21 Oct 2011 00:32:02 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RH31m-00020I-8w;
	Fri, 21 Oct 2011 01:32:02 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9355-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 21 Oct 2011 01:32:02 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9355: 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 9355 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9355/

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-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-xl-win        13 guest-stop                   fail   never pass
 test-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  6c583d35d76d
baseline version:
 xen                  a06609840ff1

------------------------------------------------------------
People who touched revisions under test:
  Olaf Hering <olaf@aepfle.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                                     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=6c583d35d76d
+ . 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 6c583d35d76d
+ branch=xen-unstable
+ revision=6c583d35d76d
+ . 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 6c583d35d76d 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 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 Thu Oct 20 19:00:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 19:00:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH4P1-0004Xd-O0; Thu, 20 Oct 2011 19:00:07 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RH4OH-0004L3-Nt
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 18:59:22 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319162357!469758!1
X-Originating-IP: [143.182.124.37]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20787 invoked from network); 21 Oct 2011 01:59:18 -0000
Received: from mga14.intel.com (HELO mga14.intel.com) (143.182.124.37)
	by server-3.tower-216.messagelabs.com with SMTP;
	21 Oct 2011 01:59:18 -0000
Received: from azsmga001.ch.intel.com ([10.2.17.19])
	by azsmga102.ch.intel.com with ESMTP; 20 Oct 2011 18:59:16 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,382,1315206000"; d="scan'208";a="64778326"
Received: from orsmsx604.amr.corp.intel.com ([10.22.226.87])
	by azsmga001.ch.intel.com with ESMTP; 20 Oct 2011 18:59:16 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx604.amr.corp.intel.com ([10.250.113.17]) with mapi;
	Thu, 20 Oct 2011 18:59:15 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jan Beulich <JBeulich@suse.com>
Date: Thu, 20 Oct 2011 18:59:14 -0700
Thread-Topic: Resend: RE: enable_ats_device() call site
Thread-Index: AcyO+UQ4oIO1WijkSpOb95UD0yQgfQAmOcvQ
Message-ID: <987664A83D2D224EAE907B061CE93D5301F1E5842B@orsmsx505.amr.corp.intel.com>
References: <4E4E48360200007800051F65@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B5E@orsmsx505.amr.corp.intel.com>
	<4E8EC8A80200007800059E3B@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE70A446@orsmsx505.amr.corp.intel.com>
	<4E9458A5020000780005AB99@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301F19DB855@orsmsx505.amr.corp.intel.com>
	<4E9E8EA1020000780005C155@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301F1D86476@orsmsx505.amr.corp.intel.com>
	<4E9FE8B6020000780005C661@nat28.tlf.novell.com>
In-Reply-To: <4E9FE8B6020000780005C661@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: "Tian, Kevin" <kevin.tian@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Shan, Haitao" <haitao.shan@intel.com>, "Dugger,
	Donald D" <donald.d.dugger@intel.com>, "Li, Susie" <susie.li@intel.com>
Subject: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> So why does the capability to list individual devices then exist? And why=
 does it matter for DRHDs, but not for ATSRs?

The difference is ATSR only is meant to communicate PCIe root ports' ATS ca=
pability.  If the root port is capable, then downstream endpoints can enabl=
e ATS device translation cache.

acpi_find_matched_drhd_unit() is used to find out which VT-d hardware is se=
rvicing the endpoint device.  Given drhd lists either the actually PCI endp=
oints or include_all, we have to match the actual BDF of the device passed =
in with devices we recorded for that VT-d HW.

acpi_find_matched_astr_unit() is used to find out if the endpoint device is=
 under a ATS capable PCIe root port or not.  ASTR information is remembered=
 as secondary and subsidiary bus ranges.  All we have to do is the match th=
e device's bus number with a root ports bus range.  Matching the actual dev=
ice in this case, will only match the root port device itself, this is what=
 we recorded in acpi_parse_dev_scope(), which should not happen since we do=
n't  assign a root port to a guest.  Even if we do, checking for ATS capabi=
lity is meaningless since root port will not have device translation cache.

Allen

-----Original Message-----
From: Jan Beulich [mailto:JBeulich@suse.com]=20
Sent: Thursday, October 20, 2011 12:24 AM
To: Kay, Allen M
Cc: Dugger, Donald D; Shan, Haitao; Tian, Kevin; xen-devel@lists.xensource.=
com
Subject: RE: Resend: RE: enable_ats_device() call site

>>> On 20.10.11 at 00:20, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
>>  I reckon that the availability of device specifications in the ATSR=20
>> data
> structure must be there for a purpose.
>> If that's not correct, then I'll certainly remove that code again,=20
>> but I'd
> like to understand what that data is meant
>> to be for in that case.
>=20
> The atsr leverages the same PCI device scope is used for drhd and rmrr=20
> so device and function comes along with bus number.  As far as I can=20
> tell, we only  need to check the bus number for atsr.

So why does the capability to list individual devices then exist? And why d=
oes it matter for DRHDs, but not for ATSRs?

>> Either we don't need to call it at all during discovery (which I=20
>> doubt,
> since when the device is in use by Dom0, I
>> suppose having ATS enabled is still desirable or even required), or=20
>> we have
> to potentially do it twice (remember
>> that older Dom0 kernels may fail to report all PCI devices to the
> hypervisor).
>=20
> I see, calling enable_ats_device() in pci_add_device() will also solve=20
> the case where MMCFG might not work until after dom0 is initialized.
>=20
> As I mentioned before, our QA team doesn't test ATS and ACS regularly. =20
> It would good if you can coordinate with our QA team to test out these=20
> changes to make sure they don't break any ACS and ATS functionality.

How would I do that other than by getting the stuff committed and wait for =
their bi-weekly(?) testing round?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 19:38:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 19:38:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH4zw-0006PH-8w; Thu, 20 Oct 2011 19:38:16 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH4z3-0006Ce-Bm
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 19:37:21 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1319164638!1029560!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14056 invoked from network); 21 Oct 2011 02:37:18 -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;
	21 Oct 2011 02:37:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,383,1315180800"; 
   d="scan'208";a="8511478"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	21 Oct 2011 02:37: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; Fri, 21 Oct 2011 03:37:18 +0100
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 1RH4yz-00041o-Dk;
	Fri, 21 Oct 2011 02:37:17 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RH4yz-0000d2-6H;
	Fri, 21 Oct 2011 03:37:17 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9356-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 21 Oct 2011 03:37:17 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9356: 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 9356 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9356/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-win         14 guest-start.2                fail pass in 9354
 test-amd64-amd64-xl-sedf     11 guest-localmigrate   fail in 9354 pass in 9356

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-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-i386-i386-xl-win        13 guest-stop                   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-xl-win      13 guest-stop                   fail   never pass
 test-amd64-amd64-win         16 leak-check/check       fail in 9354 never pass

version targeted for testing:
 xen                  d4253bc5418b
baseline version:
 xen                  3f8fb62436e6

------------------------------------------------------------
People who touched revisions under test:
------------------------------------------------------------

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=d4253bc5418b
+ . 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 d4253bc5418b
+ branch=xen-4.1-testing
+ revision=d4253bc5418b
+ . 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 d4253bc5418b 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 3 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 Thu Oct 20 20:45:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 20:45:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH63F-0008Fw-Dh; Thu, 20 Oct 2011 20:45:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH62D-00082c-VX; Thu, 20 Oct 2011 20:44:47 -0700
X-Env-Sender: joseph.glanville@orionvm.com.au
X-Msg-Ref: server-8.tower-21.messagelabs.com!1319168677!1069235!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18683 invoked from network); 21 Oct 2011 03:44:38 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	21 Oct 2011 03:44:38 -0000
Received: by iaen33 with SMTP id n33so4952695iae.30
	for <multiple recipients>; Thu, 20 Oct 2011 20:44:36 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.231.44.196 with SMTP id b4mr5114391ibf.82.1319168675625; Thu,
	20 Oct 2011 20:44:35 -0700 (PDT)
Received: by 10.231.202.211 with HTTP; Thu, 20 Oct 2011 20:44:35 -0700 (PDT)
X-Originating-IP: [59.167.234.130]
In-Reply-To: <4E9F1361.5020906@xen.org>
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111018132618.GA19611@phenom.dumpdata.com>
	<1319013528.3385.59.camel@zakaz.uk.xensource.com>
	<4E9F1361.5020906@xen.org>
Date: Fri, 21 Oct 2011 14:44:35 +1100
Message-ID: <CAOzFzEjioey=65ACAJH50Nf+gHUt4HCXupfY9bHwaqCMEoquow@mail.gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Joseph Glanville <joseph.glanville@orionvm.com.au>
To: Lars Kurth <lars.kurth@xen.org>
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"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>,
	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="===============0680836904=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0680836904==
Content-Type: multipart/alternative; boundary=00151773e6524f3a6104afc6e43c

--00151773e6524f3a6104afc6e43c
Content-Type: text/plain; charset=ISO-8859-1

I think we should aim to get a meeting of interested parties happening on
IRC before we action on a date or plan.
I just don't want to get started on something that will stall due to lack of
direction.

<rant>

I am happy to contribute my time to do a significant amount of the work that
bofh has requested but to do so effectively I really think we need somewhat
of a clean start.
The current wiki contains too much content that just doesn't belong in the
wiki, job postings, WIP status on projects that have long since died etc.
If we want to present the appearance that Xen is not a schizophrenic project
and has clear direction, leadership and vision then we need actual
documentation that reflects this.

I did get started on a full categorization of pages in the wiki but that
quickly become something that is abit much to do in one session or alone for
that matter.
It also highlighted some severe problems with how the current wiki is used -
in my opinion atleast. It is my view that the official wiki should be
reserved for highly relevant documentation.

I think we need to setup a guided rewrite/refactor of the core documentation
so it resembles something close to this:

Overview (brief introduction, architecture, why xen is different and maybe
abit of xen philosophy)
Getting started guide ( Installation of Xen on Debian - probably the
simplest and easiest way to get started with Xen at the moment, start a
Debian PV guest, start at Windows HVM guest)
Installation guide ( More indepth covering all the core distros and some
more advanced installations including compilation from source and using the
Linux 3.1 kernel, networking options etc)
Administration guide ( This bit requires atlot of discussion, do we
recommend xm still? should we only support xl? If that is the case how to we
recommend stuff like managed domains etc..)
Advanced topics.. stuff like Networking, PCI passthrough etc deserve their
own pages

There also needs to be a developers section, preferably seperate entirely
from the user documentation. If XCP could be sectioned off in some matter
also that would be advantageous - basically to prevent confusion.
The current wiki is poluted with alot of architecture and design info that
isn't of interest to a general user but is still key to understanding Xen
from a developers point of view.

What the primary aim would be is to integrate as much best practices into
these pages rather than having them spread around hundreds of wiki pages and
even more mailing list posts.
To be honest I rarely look to the wiki if I want to know how to do something
with Xen I am unfamilar with.. my first course of action is to search my
archive of xen-devel/xen-users which isn't exactly a good thing.

The biggest issue with this sort of compaction is that Xen is fraught with
choices.. there is just so many different ways of doing things.

I'm not trying to be critical of those that have spent many hours writing
the current documentation, it is appreciated.
I just think we need a really concentrated effort around making the simple
Xen tasks easier before expanding out to include the more complicated stuff.
Alot of us take for granted that we have been using Xen for a long time and
many of these things come so naturally to us - whereas from the outside it
all seems too difficult.

</rant>

That is what I am advocating anyways. First get direction, once we have that
- we can build it. :)

Joseph.

On 20 October 2011 05:13, Lars Kurth <lars.kurth@xen.org> wrote:

> On 19/10/2011 09:38, Ian Campbell wrote:
>
>> It'll break links, but I guess that's a feature.
>>
> That's easy to fix: rename, check orphaned pages, fix those pages
>
>
>  How close are we to having the new wiki setup -- that would also solve
>> this issue?
>>
> It wouldn't solve the issue really.
>
>
>  We could just manually add a header/banner ("attention box"?) to each
>> archived page, that's no harder than renaming it I suspect. Ian.
>>
> That is true, but for a user it would still clutter the index
>
> I am running behind publishing the blog post: will post it tomorrow
>
> When do we want to start and end the session? That's the only outstanding
> question.
>
> We also should take bofh's feedback seriously. The points he makes are
> exactly the ones I have identified to, but don't know enough yet to fix it.
>
> Lars
>



-- 
*
Founder | Director | VP Research
Orion Virtualisation Solutions* | www.orionvm.com.au | Phone: 1300 56 99 52
| Mobile: 0428 754 846

--00151773e6524f3a6104afc6e43c
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

I think we should aim to get a meeting of interested parties happening on I=
RC before we action on a date or plan.<br>I just don&#39;t want to get star=
ted on something that will stall due to lack of direction.<br><br>&lt;rant&=
gt;<br>
<br>I am happy to contribute my time to do a significant amount of the work=
 that bofh has requested but to do so effectively I really think we need so=
mewhat of a clean start.<br>The current wiki contains too much content that=
 just doesn&#39;t belong in the wiki, job postings, WIP status on projects =
that have long since died etc.<br>
If we want to present the appearance that Xen is not a schizophrenic projec=
t and has clear direction, leadership and vision then we need actual docume=
ntation that reflects this.<br><br>I did get started on a full categorizati=
on of pages in the wiki but that quickly become something that is abit much=
 to do in one session or alone for that matter.<br>
It also highlighted some severe problems with how the current wiki is used =
- in my opinion atleast. It is my view that the official wiki should be res=
erved for highly relevant documentation.<br><br>I think we need to setup a =
guided rewrite/refactor of the core documentation so it resembles something=
 close to this:<br>
<br>Overview (brief introduction, architecture, why xen is different and ma=
ybe abit of xen philosophy)<br>Getting started guide ( Installation of Xen =
on Debian - probably the simplest and easiest way to get started with Xen a=
t the moment, start a Debian PV guest, start at Windows HVM guest)<br>
Installation guide ( More indepth covering all the core distros and some mo=
re advanced installations including compilation from source and using the L=
inux 3.1 kernel, networking options etc)<br>Administration guide ( This bit=
 requires atlot of discussion, do we recommend xm still? should we only sup=
port xl? If that is the case how to we recommend stuff like managed domains=
 etc..)<br>
Advanced topics.. stuff like Networking, PCI passthrough etc deserve their =
own pages<br><br>There also needs to be a developers section, preferably se=
perate entirely from the user documentation. If XCP could be sectioned off =
in some matter also that would be advantageous - basically to prevent confu=
sion.<br>
The current wiki is poluted with alot of architecture and design info that =
isn&#39;t of interest to a general user but is still key to understanding X=
en from a developers point of view.<br><br>What the primary aim would be is=
 to integrate as much best practices into these pages rather than having th=
em spread around hundreds of wiki pages and even more mailing list posts.<b=
r>
To be honest I rarely look to the wiki if I want to know how to do somethin=
g with Xen I am unfamilar with.. my first course of action is to search my =
archive of xen-devel/xen-users which isn&#39;t exactly a good thing.<br>
<br>The biggest issue with this sort of compaction is that Xen is fraught w=
ith choices.. there is just so many different ways of doing things.<br><br>=
I&#39;m not trying to be critical of those that have spent many hours writi=
ng the current documentation, it is appreciated.<br>
I just think we need a really concentrated effort around making the simple =
Xen tasks easier before expanding out to include the more complicated stuff=
.<br>Alot of us take for granted that we have been using Xen for a long tim=
e and many of these things come so naturally to us - whereas from the outsi=
de it all seems too difficult.<br>
<br>&lt;/rant&gt;<br><br>That is what I am advocating anyways. First get di=
rection, once we have that - we can build it. :)<br><br>Joseph.<br><br><div=
 class=3D"gmail_quote">On 20 October 2011 05:13, Lars Kurth <span dir=3D"lt=
r">&lt;<a href=3D"mailto:lars.kurth@xen.org">lars.kurth@xen.org</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"im">On 19/10/2011 09:38, Ian =
Campbell wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
It&#39;ll break links, but I guess that&#39;s a feature. <br>
</blockquote></div>
That&#39;s easy to fix: rename, check orphaned pages, fix those pages<div c=
lass=3D"im"><br>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
How close are we to having the new wiki setup -- that would also solve this=
 issue? <br>
</blockquote></div>
It wouldn&#39;t solve the issue really.<div class=3D"im"><br>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
We could just manually add a header/banner (&quot;attention box&quot;?) to =
each archived page, that&#39;s no harder than renaming it I suspect. Ian.<b=
r>
</blockquote></div>
That is true, but for a user it would still clutter the index<br>
<br>
I am running behind publishing the blog post: will post it tomorrow<br>
<br>
When do we want to start and end the session? That&#39;s the only outstandi=
ng question.<br>
<br>
We also should take bofh&#39;s feedback seriously. The points he makes are =
exactly the ones I have identified to, but don&#39;t know enough yet to fix=
 it.<br><font color=3D"#888888">
<br>
Lars<br>
</font></blockquote></div><br><br clear=3D"all"><br>-- <br><span style=3D"f=
ont-family:arial,sans-serif;font-size:13px;border-collapse:collapse"><b><i>=
<font color=3D"#0000ff"><div><font color=3D"#000000"><span style=3D"font-st=
yle:normal;font-weight:normal">Founder | Director | VP Research<br>
</span></font></div>Orion Virtualisation Solutions</font></i></b>=A0|=A0<fo=
nt color=3D"#0000ff"><a href=3D"http://www.orionvm.com.au/" style=3D"color:=
rgb(42, 93, 176)" target=3D"_blank">www.orionvm.com.au</a></font>=A0| Phone=
: 1300 56 99 52 | Mobile: 0428 754 846</span><br>


--00151773e6524f3a6104afc6e43c--


--===============0680836904==
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

--===============0680836904==--


From xen-devel-bounces@lists.xensource.com Thu Oct 20 20:53:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 20:53:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH6Ae-00013a-IL; Thu, 20 Oct 2011 20:53:25 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH6A0-0000r2-8j
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 20:52:44 -0700
X-Env-Sender: apxeng@gmail.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1319169160!36116665!1
X-Originating-IP: [209.85.216.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31124 invoked from network); 21 Oct 2011 03:52:41 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	21 Oct 2011 03:52:41 -0000
Received: by qyk33 with SMTP id 33so237181qyk.9
	for <xen-devel@lists.xensource.com>;
	Thu, 20 Oct 2011 20:52:40 -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=ceGQ8V5wFRDOIeaOdzUOrxYbuooDWzgFCHIh8HN2fAE=;
	b=IzMjRpDA0NbYfW74ZRvjIvLw7nJB/QW4dqs+TGi2dGiDqRYdSID1Gaai+PcdSJdABf
	is4Nji/3CP/oZ7KujndqjXxUWZp9eDXH6eF/bkbwfdVz1BWsHLrbA2FbyNk3ME7Z7fYj
	+RNACcICYBr5sIoygXl+gfkMUnaEAtKiqMGH0=
MIME-Version: 1.0
Received: by 10.229.69.130 with SMTP id z2mr2837931qci.16.1319169159927; Thu,
	20 Oct 2011 20:52:39 -0700 (PDT)
Received: by 10.229.74.19 with HTTP; Thu, 20 Oct 2011 20:52:39 -0700 (PDT)
In-Reply-To: <20126.62103.576976.140927@mariner.uk.xensource.com>
References: <CAGU+aut64MmMmf901p9Gsya4O=hep8merZUDfSUuJCJXMVFtrg@mail.gmail.com>
	<1319013780.3385.64.camel@zakaz.uk.xensource.com>
	<20126.62103.576976.140927@mariner.uk.xensource.com>
Date: Thu, 20 Oct 2011 20:52:39 -0700
Message-ID: <CAGU+autjm1EEKeDjQiuwixo0QAwwNntsFWZ9V6JSTZOhyWVadg@mail.gmail.com>
Subject: Re: [Xen-devel] make install not creating lib entries in /usr/lib
	under Ubunu 11.10
From: AP <apxeng@gmail.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
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

On Wed, Oct 19, 2011 at 8:53 AM, Ian Jackson <Ian.Jackson@eu.citrix.com> wrote:
> Ian Campbell writes ("Re: [Xen-devel] make install not creating lib entries in /> It might be nice if there was a single variable which could be set to
>> control this behaviour, or even better if it can be automatically
>> detected. I'm also inclined to suggest that the default should be to
>> use /usr/lib and leave the lib64 thing as a RH special case, but then
>> I'm a Debian user so I would think that ;-)
>
> At the very least we ought not to dump things in /usr/lib64 unless it
> already exists and is distinct from /usr/lib.

I deleted my /usr/lib64 and did a "make install-tools
PYTHON_PREFIX_ARG=". At the end a /usr/lib64 directory was created
with Xen related libraries inside.

> We should think about multiarch too at some point.
>
> Ian.
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 21:31:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 21:31:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH6lD-0002sC-Ti; Thu, 20 Oct 2011 21:31:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH6kN-0002fM-Fz
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 21:30:19 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1319171415!217348!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18829 invoked from network); 21 Oct 2011 04:30:16 -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;
	21 Oct 2011 04:30:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,383,1315180800"; 
   d="scan'208";a="8511967"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	21 Oct 2011 04:30: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, 21 Oct 2011 05:30:14 +0100
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 1RH6kI-0004eP-4W;
	Fri, 21 Oct 2011 04:30:14 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RH6kI-00079K-3w;
	Fri, 21 Oct 2011 05:30:14 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9357-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 21 Oct 2011 05:30:14 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9357: 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 9357 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9357/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     10 guest-saverestore  fail in 9353 REGR. vs. 9233
 build-amd64-oldkern           2 logs-capture(2)              broken   in 9353
 build-amd64-oldkern           1 hosts-allocate               broken   in 9353

Tests which are failing intermittently (not blocking):
 test-amd64-i386-pv            4 xen-install                  fail pass in 9353
 test-amd64-i386-xl-multivcpu  4 xen-install                  fail pass in 9353
 test-amd64-i386-xl            4 xen-install                  fail pass in 9353
 test-amd64-i386-pair          6 xen-install/dst_host         fail pass in 9353
 test-amd64-i386-pair          5 xen-install/src_host         fail pass in 9353
 test-amd64-i386-xl-credit2    4 xen-install                  fail pass in 9353
 build-i386                    4 xen-build                    fail pass in 9353
 test-amd64-i386-rhel6hvm-amd  4 xen-install                  fail pass in 9353
 test-amd64-i386-rhel6hvm-intel  4 xen-install                fail pass in 9353
 test-amd64-i386-win-vcpus1    4 xen-install                  fail pass in 9353
 test-amd64-i386-win           4 xen-install                  fail pass in 9353
 test-amd64-i386-xl-win-vcpus1  4 xen-install                 fail pass in 9353

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-i386-i386-xl             1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl          15 guest-stop                   fail   never pass
 test-i386-i386-pv             1 xen-build-check(1)           blocked  n/a
 test-i386-i386-pair           1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail    like 9205
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-i386-i386-win            1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       7 windows-install              fail   never pass
 test-i386-i386-xl-win         1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu 15 guest-stop             fail in 9353 never pass
 test-i386-i386-xl            15 guest-stop             fail in 9353 never pass
 test-amd64-i386-xl           15 guest-stop             fail in 9353 never pass
 test-amd64-i386-xl-credit2    5 xen-boot                fail in 9353 like 9233
 test-amd64-i386-rhel6hvm-amd  7 redhat-install         fail in 9353 never pass
 test-amd64-i386-rhel6hvm-intel  7 redhat-install       fail in 9353 never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check       fail in 9353 never pass
 test-amd64-i386-win          16 leak-check/check       fail in 9353 never pass
 test-i386-i386-win           16 leak-check/check       fail in 9353 never pass
 test-amd64-i386-xl-win-vcpus1  7 windows-install       fail in 9353 never pass
 test-i386-i386-xl-win         7 windows-install        fail in 9353 never pass

version targeted for testing:
 xen                  8aded64130a6
baseline version:
 xen                  f051e9973b79

------------------------------------------------------------
People who touched revisions under test:
------------------------------------------------------------

jobs:
 build-amd64                                                  pass    
 build-i386                                                   fail    
 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                               fail    
 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                                          pass    
 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.

------------------------------------------------------------
changeset:   21548:8aded64130a6
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 20 17:35:52 2011 +0100
    
    Added signature for changeset 00b5807c08f2
    
    
changeset:   21547:ee265743eb93
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 20 17:35:43 2011 +0100
    
    Added tag RELEASE-4.0.3 for changeset 00b5807c08f2
    
    
changeset:   21546:00b5807c08f2
tag:         RELEASE-4.0.3
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 20 17:35:18 2011 +0100
    
    Update Xen version to 4.0.3
    
    
changeset:   21545:f051e9973b79
user:        Keir Fraser <keir@xen.org>
date:        Fri Oct 07 15:46:57 2011 +0100
    
    Added signature for changeset fd7c4d4e52d9
    
    
(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 Oct 20 22:04:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 22:04:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH7HT-0004A0-9p; Thu, 20 Oct 2011 22:04:31 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH7E5-0003uM-Fa
	for Xen-devel@lists.xensource.com; Thu, 20 Oct 2011 22:01:10 -0700
X-Env-Sender: aksinha@yahoo-inc.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1319173256!474233!1
X-Originating-IP: [216.145.54.172]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4424 invoked from network); 21 Oct 2011 05:00:58 -0000
Received: from mrout2.yahoo.com (HELO mrout2.yahoo.com) (216.145.54.172)
	by server-15.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 21 Oct 2011 05:00:58 -0000
Received: from EGL-EX07CAS03.ds.corp.yahoo.com
	(egl-ex07cas03.eglbp.corp.yahoo.com [203.83.248.219])
	by mrout2.yahoo.com (8.14.4/8.14.4/y.out) with ESMTP id p9L4xWDE050203; 
	Thu, 20 Oct 2011 22:00:32 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yahoo-inc.com;
	s=cobra; t=1319173233;
	bh=VHfbWuhHHoO2wq7WUGZ1mNeRYQ2UkBJd+eY8/UEk/dc=;
	h=From:To:CC:Date:Subject:Message-ID:References:In-Reply-To:
	Content-Type:Content-Transfer-Encoding:MIME-Version;
	b=OywSj/AGL6eu1RrCCX+HmmK6PgX347it5JUs/oCBYIg+JE/j/qTqI5LN6lDJSQ1Ty
	DoiEsFex5DEuF7QPnWiXWsVfD/DKukSXViU6nRLYQIUlWZYL0MFKocNRgSBGRKn+SX
	oZjHST4kaM+fqJVBWf4X2HVhPrboLxCShF3ite3w=
Received: from EGL-EX07VS01.ds.corp.yahoo.com ([203.83.248.205]) by
	EGL-EX07CAS03.ds.corp.yahoo.com ([203.83.248.219]) with mapi;
	Fri, 21 Oct 2011 10:29:48 +0530
From: Alok Sinha <aksinha@yahoo-inc.com>
To: =?iso-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
Date: Fri, 21 Oct 2011 10:29:46 +0530
Subject: Re: [Xen-devel] Question on RHEL 6 support
Thread-Topic: [Xen-devel] Question on RHEL 6 support
Thread-Index: AcyPrkG8ibW6rRhUSyuKM5aK17dSDA==
Message-ID: <93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
In-Reply-To: <20111020140056.GU12984@reaktio.net>
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: "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

Pasi,

   Thanks for your response.
   So how do I disable xen platform device for VM? Any pointers?
-Alok

On Oct 20, 2011, at 7:30 PM, Pasi K=E4rkk=E4inen wrote:

> On Thu, Oct 20, 2011 at 04:18:07PM +0530, Alok Sinha wrote:
>>   Hi,
>=20
> Hello,
>=20
>>      I am trying to run RHEL 6 as guest over XEN (RHEL 5.6 as host)
>>   hypervisor.
>>      It seems that RHEL 6 loads the paravirt drivers by default and thus=
 HVM
>>   mode is not working.
>>      Any idea on this?
>=20
> What do you mean with "HVM mode is not working" ?
>=20
> PVHVM drivers (for HVM guests) are there to make disk/net performance a L=
OT better!
> The default qemu-dm emulated ide controller and realtek nic are not very =
efficient..
>=20
>>      I saw somewhere that including xen_emul_unplug=3Dnever will help. I=
s
>>   there any other way it can be avoided?
>>=20
>=20
> You can also disable the xen platform pci device for that VM from dom0,=20
> then the VM will not activate PVHVM drivers.
>=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 Thu Oct 20 22:32:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 22:32:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH7iV-000548-6u; Thu, 20 Oct 2011 22:32:28 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH7hg-0004ps-1A
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 22:31:36 -0700
X-Env-Sender: wangwangkang@gmail.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319175081!51940383!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11837 invoked from network); 21 Oct 2011 05:31:21 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-15.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	21 Oct 2011 05:31:21 -0000
Received: by wyi11 with SMTP id 11so4452716wyi.30
	for <xen-devel@lists.xensource.com>;
	Thu, 20 Oct 2011 22:31:32 -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=E9jHG3VAUVgHAMSVWYmRdN8YMfIeIOQgrxbm2y4x3kE=;
	b=ebwk/VWOPqlCpG+b8zPxX+Mz7rFij3g7iX+gZAVK+gHkut2kxryZIodFJMLpuDtKBi
	MMLjpy+WLeRV6nkMy0me9C5fAnMaZ9LV9wyphMHMW+WMbZOfxqjlkmF+E7i0ArVnUnxk
	c/+1SbBdf8As53bx3ciKaAmC2gzwLZSKmRkxc=
MIME-Version: 1.0
Received: by 10.216.134.80 with SMTP id r58mr4777099wei.63.1319175092748; Thu,
	20 Oct 2011 22:31:32 -0700 (PDT)
Received: by 10.216.10.72 with HTTP; Thu, 20 Oct 2011 22:31:32 -0700 (PDT)
Date: Fri, 21 Oct 2011 01:31:32 -0400
Message-ID: <CAMTrTqWfQ-JXfGR0c+8szDLYuLBSkefY01iXiVFa3Ys3C2DGMQ@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] The different between hypercall do_mmu_update and
	do_update_va_mapping
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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
I found that both hypercall do_mmu_update and do_update_va_mapping
performs page table updates for a guest domain.
Suppose both do the normal page table update, are the input
mmu_update_t req {ptr, val} to do_mmu_update both machine frame
address,
while the va  of do_update_va_mapping is guest frame address? Thanks.

-- Hui

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 20 23:13:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 20 Oct 2011 23:13:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH8Lp-00073n-EU; Thu, 20 Oct 2011 23:13:05 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH8Km-0006qZ-BS
	for Xen-devel@lists.xensource.com; Thu, 20 Oct 2011 23:12:01 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-10.tower-27.messagelabs.com!1319177491!40837941!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19870 invoked from network); 21 Oct 2011 06:11:31 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2011 06:11:31 -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 B128F28F7;
	Fri, 21 Oct 2011 09:11:56 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 62CFA200E9; Fri, 21 Oct 2011 09:11:56 +0300 (EEST)
Date: Fri, 21 Oct 2011 09:11:56 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Alok Sinha <aksinha@yahoo-inc.com>
Subject: Re: [Xen-devel] Question on RHEL 6 support
Message-ID: <20111021061156.GZ12984@reaktio.net>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
	<93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
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, Oct 21, 2011 at 10:29:46AM +0530, Alok Sinha wrote:
> Pasi,
> 
>    Thanks for your response.
>    So how do I disable xen platform device for VM? Any pointers?
>

You should be able to change it from /etc/xen/<name_of_the_vm> configfile.

Try:
xen_platform_pci=0

-- Pasi

> 
> On Oct 20, 2011, at 7:30 PM, Pasi Kärkkäinen wrote:
> 
> > On Thu, Oct 20, 2011 at 04:18:07PM +0530, Alok Sinha wrote:
> >>   Hi,
> > 
> > Hello,
> > 
> >>      I am trying to run RHEL 6 as guest over XEN (RHEL 5.6 as host)
> >>   hypervisor.
> >>      It seems that RHEL 6 loads the paravirt drivers by default and thus HVM
> >>   mode is not working.
> >>      Any idea on this?
> > 
> > What do you mean with "HVM mode is not working" ?
> > 
> > PVHVM drivers (for HVM guests) are there to make disk/net performance a LOT better!
> > The default qemu-dm emulated ide controller and realtek nic are not very efficient..
> > 
> >>      I saw somewhere that including xen_emul_unplug=never will help. Is
> >>   there any other way it can be avoided?
> >> 
> > 
> > You can also disable the xen platform pci device for that VM from dom0, 
> > then the VM will not activate 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 Fri Oct 21 00:04:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 00:04:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH99y-0000qt-PN; Fri, 21 Oct 2011 00:04:54 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH972-0000bl-CZ
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 00:01:56 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319180506!36139770!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8020 invoked from network); 21 Oct 2011 07:01:47 -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; 21 Oct 2011 07:01:47 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 08:01:46 +0100
Message-Id: <4EA134F7020000780005CA23@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 08:01:43 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
References: <4EA0583B020000780005C8A8@nat28.tlf.novell.com>
	<CAC6057E.32CBB%keir@xen.org>
In-Reply-To: <CAC6057E.32CBB%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 20.10.11 at 18:06, Keir Fraser <keir@xen.org> wrote:
> On 20/10/2011 16:19, "Jan Beulich" <JBeulich@suse.com> wrote:
>=20
>>> I suppose there is a second argument that it shrinks the containing
>>> structures (struct domain, struct vcpu, struct irq_desc, ...) and =
maybe
>>> helps reduce our order!=3D0 allocations?
>>=20
>> Yes - that's what made me start taking over these Linux bits. What I
>> sent here just continues on that route. I was really hoping that we
>> wouldn't leave this in a half baked state.
>=20
> Has Linux gone wholesale down this route, then?

Yes - the old ones are left in there is something forces
CONFIG_DISABLE_OBSOLETE_CPUMASK_FUNCTIONS (which
we can avoid altogether).

Jan



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 00:09:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 00:09:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH9Dx-0001Hr-7K; Fri, 21 Oct 2011 00:09:01 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH9D8-00015f-VV
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 00:08:11 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319180887!225528!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14430 invoked from network); 21 Oct 2011 07:08:08 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-3.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	21 Oct 2011 07:08:08 -0000
Received: by wwf10 with SMTP id 10so4402066wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 00:08:07 -0700 (PDT)
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=+TiemcSWB0hXZDTRfjgc1xAi6nYbwlGc+6qpo80AXNk=;
	b=vsAJa637vh9Qp/33mss+qCmPfhCMb4H+XfGcDGAow2orAlVbQU4VqVjDJ/VpGu3MBe
	hqiQgWPIoGkAF/g7ZBhwJPziMNsgTXf/DRSkm/eeVnItPZFaTTG9c7OI/xu3g/280Diq
	HAV+y821W5ida01HXp64CUxgSRImmGsXfoa7U=
Received: by 10.216.229.14 with SMTP id g14mr754846weq.6.1319180887542;
	Fri, 21 Oct 2011 00:08:07 -0700 (PDT)
Received: from [192.168.1.71] (host86-153-22-182.range86-153.btcentralplus.com.
	[86.153.22.182]) by mx.google.com with ESMTPS id
	fw16sm12229356wbb.13.2011.10.21.00.08.05
	(version=SSLv3 cipher=OTHER); Fri, 21 Oct 2011 00:08:06 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 21 Oct 2011 08:08:03 +0100
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
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: <CAC6D8E3.23666%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
Thread-Index: AcyPwCyAHia+C+lZz0qu323dEFz/eA==
In-Reply-To: <4EA03FF4020000780005C797@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 20/10/2011 14:36, "Jan Beulich" <JBeulich@suse.com> wrote:

> This patch set makes some first steps towards eliminating the old cpumask
> accessors, replacing them by such that don't require the full NR_CPUS
> bits to be allocated (which obviously can be pretty wasteful when
> NR_CPUS is high, but the actual number is low or moderate).
> 
> 01: introduce and use nr_cpu_ids and nr_cpumask_bits
> 02: eliminate cpumask accessors referencing NR_CPUS
> 03: eliminate direct assignments of CPU masks
> 04: x86: allocate IRQ actions' cpu_eoi_map dynamically
> 05: allocate CPU sibling and core maps dynamically

01-05/07-12:
Acked-by: Keir Fraser <keir@xen.org>

> 06: allow efficient allocation of multiple CPU masks at once

Not this one.

 -- Keir

> One reason I put the following ones together was to reduce the
> differences between the disassembly of hypervisors built for 4095
> and 2047 CPUs, which I looked at to determine the places where
> cpumask_t variables get copied without using cpumask_copy() (a
> job where grep is of no help). Hence consider these patch optional,
> but recommended.
> 
> 07: cpufreq: allocate CPU masks dynamically
> 08: x86/p2m: allocate CPU masks dynamically
> 09: cpupools: allocate CPU masks dynamically
> 10: credit: allocate CPU masks dynamically
> 11: x86/hpet: allocate CPU masks dynamically
> 12: cpumask <=> xenctl_cpumap: allocate CPU masks and byte maps dynamically
> 
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> 
> 
> _______________________________________________
> 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 Oct 21 00:11:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 00:11:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH9G6-0001h6-3p; Fri, 21 Oct 2011 00:11:14 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH9Ff-0001Uh-A4
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 00:10:47 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1319181043!22464516!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22556 invoked from network); 21 Oct 2011 07:10:44 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 21 Oct 2011 07:10:44 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 08:10:43 +0100
Message-Id: <4EA13711020000780005CA36@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 08:10:41 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
References: <4EA0583B020000780005C8A8@nat28.tlf.novell.com>
	<CAC60514.32CBA%keir@xen.org>
In-Reply-To: <CAC60514.32CBA%keir@xen.org>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Andrew Cooper <andrew.cooper3@citrix.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 20.10.11 at 18:04, Keir Fraser <keir@xen.org> wrote:
> On 20/10/2011 16:19, "Jan Beulich" <JBeulich@suse.com> wrote:
>=20
>>>> 06: allow efficient allocation of multiple CPU masks at once
>>>=20
>>> That is utterly hideous and for insignificant saving.
>>=20
>> I was afraid you would say that, and I'm not fully convinced
>> either. But I wanted to give it a try to see how bad it is. The
>> more significant saving here really comes from not allocating
>> the CPU masks at all for unused irq_desc-s.
>=20
> Aren't we planning to dynamically allocate irq_desc-s? That would seem =
the
> nicer solution here.

Yes, I would hope so. But irrespective of that, allocating e.g. 512 bits
(times 4) just to use, say, 20-30 of them is bad - again, not so much
from a memory wasting pov, but rather from the fact that this
needlessly causes a larger cache and TLB footprint.

I actually think that ultimately we should try to remove all
non-dynamically allocated CPU masks (including statics, per-CPU
ones, and local variables - the latter being particularly important as
they cause pretty big stack frames, despite there now being at
most one [with the rare exception of two] of them per function,
which will continue to grow with higher NR_CPUS values).

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 00:15:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 00: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 1RH9KO-00028u-2V; Fri, 21 Oct 2011 00:15:40 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH9Jk-0001w9-VC
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 00:15:01 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1319181297!1083189!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23187 invoked from network); 21 Oct 2011 07:14:58 -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; 21 Oct 2011 07:14:58 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 08:14:57 +0100
Message-Id: <4EA1380E020000780005CA45@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 08:14:54 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
References: <4EA03FF4020000780005C797@nat28.tlf.novell.com>
	<CAC6D8E3.23666%keir.xen@gmail.com>
In-Reply-To: <CAC6D8E3.23666%keir.xen@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 09:08, Keir Fraser <keir.xen@gmail.com> wrote:
> On 20/10/2011 14:36, "Jan Beulich" <JBeulich@suse.com> wrote:
>=20
>> This patch set makes some first steps towards eliminating the old =
cpumask
>> accessors, replacing them by such that don't require the full NR_CPUS
>> bits to be allocated (which obviously can be pretty wasteful when
>> NR_CPUS is high, but the actual number is low or moderate).
>>=20
>> 01: introduce and use nr_cpu_ids and nr_cpumask_bits
>> 02: eliminate cpumask accessors referencing NR_CPUS
>> 03: eliminate direct assignments of CPU masks
>> 04: x86: allocate IRQ actions' cpu_eoi_map dynamically
>> 05: allocate CPU sibling and core maps dynamically
>=20
> 01-05/07-12:
> Acked-by: Keir Fraser <keir@xen.org>
>=20
>> 06: allow efficient allocation of multiple CPU masks at once
>=20
> Not this one.

Okay, I'll re-work (and re-send) it then to use non-array allocations.

Jan

>> One reason I put the following ones together was to reduce the
>> differences between the disassembly of hypervisors built for 4095
>> and 2047 CPUs, which I looked at to determine the places where
>> cpumask_t variables get copied without using cpumask_copy() (a
>> job where grep is of no help). Hence consider these patch optional,
>> but recommended.
>>=20
>> 07: cpufreq: allocate CPU masks dynamically
>> 08: x86/p2m: allocate CPU masks dynamically
>> 09: cpupools: allocate CPU masks dynamically
>> 10: credit: allocate CPU masks dynamically
>> 11: x86/hpet: allocate CPU masks dynamically
>> 12: cpumask <=3D> xenctl_cpumap: allocate CPU masks and byte maps =
dynamically
>>=20
>> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>>=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 Fri Oct 21 00:50:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 00:50:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH9s1-0003IK-0b; Fri, 21 Oct 2011 00:50:25 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH9rD-00031d-63
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 00:49:35 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1319183371!489862!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7977 invoked from network); 21 Oct 2011 07:49:32 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-12.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 21 Oct 2011 07:49:32 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 08:49:31 +0100
Message-Id: <4EA14029020000780005CA57@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 08:49:29 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: <mark.langsdorf@amd.com>,"Keir Fraser" <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
References: <4EA03FF4020000780005C797@nat28.tlf.novell.com>
	<CAC6D8E3.23666%keir.xen@gmail.com>
In-Reply-To: <CAC6D8E3.23666%keir.xen@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 09:08, Keir Fraser <keir.xen@gmail.com> wrote:
> On 20/10/2011 14:36, "Jan Beulich" <JBeulich@suse.com> wrote:
> 01-05/07-12:
> Acked-by: Keir Fraser <keir@xen.org>
>
>> 07: cpufreq: allocate CPU masks dynamically

I didn't apply this one, as it wants
http://lists.xensource.com/archives/html/xen-devel/2011-10/msg01180.html
to be applied first, but there was no reaction from AMD so far. Mark?

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 00:51:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 00:51:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH9tA-0003kN-1e; Fri, 21 Oct 2011 00:51:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH9sC-0003Ld-KS
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 00:50:36 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319183433!495326!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7245 invoked from network); 21 Oct 2011 07:50:33 -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; 21 Oct 2011 07:50:33 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 08:50:33 +0100
Message-Id: <4EA14068020000780005CA5A@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 08:50:32 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Haitao Shan" <maillists.shan@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>,
	Keir Fraser <keir@xen.org>, Jun Nakajima <jun.nakajima@intel.com>,
	Donald D Dugger <donald.d.dugger@intel.com>
Subject: [Xen-devel] Ping: [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 Fri Oct 21 00:53:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 00:53:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RH9v2-00049A-Qx; Fri, 21 Oct 2011 00:53:32 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RH9uC-0003wP-PS
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 00:52:41 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319183557!491865!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17336 invoked from network); 21 Oct 2011 07:52:37 -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; 21 Oct 2011 07:52:37 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 08:52:37 +0100
Message-Id: <4EA140E3020000780005CA5D@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 08:52:35 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Allen M Kay" <allen.m.kay@intel.com>
References: <4E4E48360200007800051F65@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE709B5E@orsmsx505.amr.corp.intel.com>
	<4E8EC8A80200007800059E3B@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301EE70A446@orsmsx505.amr.corp.intel.com>
	<4E9458A5020000780005AB99@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301F19DB855@orsmsx505.amr.corp.intel.com>
	<4E9E8EA1020000780005C155@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301F1D86476@orsmsx505.amr.corp.intel.com>
	<4E9FE8B6020000780005C661@nat28.tlf.novell.com>
	<987664A83D2D224EAE907B061CE93D5301F1E5842B@orsmsx505.amr.corp.intel.com>
In-Reply-To: <987664A83D2D224EAE907B061CE93D5301F1E5842B@orsmsx505.amr.corp.intel.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Kevin Tian <kevin.tian@intel.com>, Susie Li <susie.li@intel.com>,
	Haitao Shan <haitao.shan@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Donald D Dugger <donald.d.dugger@intel.com>
Subject: [Xen-devel] RE: Resend: RE: enable_ats_device() call site
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 03:59, "Kay, Allen M" <allen.m.kay@intel.com> wrote:
>>  So why does the capability to list individual devices then exist? And =
why=20
> does it matter for DRHDs, but not for ATSRs?
>=20
> The difference is ATSR only is meant to communicate PCIe root ports' =
ATS=20
> capability.  If the root port is capable, then downstream endpoints =
can=20
> enable ATS device translation cache.
>=20
> acpi_find_matched_drhd_unit() is used to find out which VT-d hardware =
is=20
> servicing the endpoint device.  Given drhd lists either the actually =
PCI=20
> endpoints or include_all, we have to match the actual BDF of the =
device=20
> passed in with devices we recorded for that VT-d HW.
>=20
> acpi_find_matched_astr_unit() is used to find out if the endpoint device =
is=20
> under a ATS capable PCIe root port or not.  ASTR information is =
remembered as=20
> secondary and subsidiary bus ranges.  All we have to do is the match =
the=20
> device's bus number with a root ports bus range.  Matching the actual =
device=20
> in this case, will only match the root port device itself, this is what =
we=20
> recorded in acpi_parse_dev_scope(), which should not happen since we =
don't =20
> assign a root port to a guest.  Even if we do, checking for ATS =
capability is=20
> meaningless since root port will not have device translation cache.

Okay, so I'll remove that part then and re-submit both patches.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 01:03:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 01:03:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHA4f-0004p1-Tb; Fri, 21 Oct 2011 01:03:29 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHA22-0004Ze-Mm
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 01:00:51 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319184043!1088662!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31696 invoked from network); 21 Oct 2011 08:00:43 -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;
	21 Oct 2011 08:00:43 -0000
Received: by wyi11 with SMTP id 11so4572894wyi.30
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 01:00:43 -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=IP8BdLP03qCf2S+igMWK8HN8XkqlroB3ustpDk4+jks=;
	b=kgG5/agiHb6DcW18oOPaFHkPvxqcOLvxQwFLtH2+dq5qEm2XLIf0eNMr1cS/oG8Iwv
	HWxfo2h97DRd1SGTucUC/N/i6XKcA+adOZIPd8yF2MsxxDh8ERUfXhMTMe/9GWya53wC
	PHi/c1CINgtXNigivvTd/1u0qbVvG61hymyVk=
Received: by 10.227.2.132 with SMTP id 4mr2444737wbj.25.1319184043028;
	Fri, 21 Oct 2011 01:00:43 -0700 (PDT)
Received: from [192.168.1.71] (host86-153-22-182.range86-153.btcentralplus.com.
	[86.153.22.182])
	by mx.google.com with ESMTPS id n21sm20217130wbp.2.2011.10.21.01.00.41
	(version=SSLv3 cipher=OTHER); Fri, 21 Oct 2011 01:00:42 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 21 Oct 2011 09:00:38 +0100
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
From: Keir Fraser <keir.xen@gmail.com>
To: Jan Beulich <JBeulich@suse.com>
Message-ID: <CAC6E536.23673%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
Thread-Index: AcyPx4UHUwdfzi/3d06GnQAdlrjNJQ==
In-Reply-To: <4EA13711020000780005CA36@nat28.tlf.novell.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: Andrew Cooper <andrew.cooper3@citrix.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 21/10/2011 08:10, "Jan Beulich" <JBeulich@suse.com> wrote:

>> Aren't we planning to dynamically allocate irq_desc-s? That would seem the
>> nicer solution here.
> 
> Yes, I would hope so. But irrespective of that, allocating e.g. 512 bits
> (times 4) just to use, say, 20-30 of them is bad - again, not so much
> from a memory wasting pov, but rather from the fact that this
> needlessly causes a larger cache and TLB footprint.

Oh, I don't mind you changing irq_desc to use cpumask_var_t-s. It's the
extra step of using an array to save a few pointers, that I reject.

> I actually think that ultimately we should try to remove all
> non-dynamically allocated CPU masks (including statics, per-CPU
> ones, and local variables - the latter being particularly important as
> they cause pretty big stack frames, despite there now being at
> most one [with the rare exception of two] of them per function,
> which will continue to grow with higher NR_CPUS values).

OTOH they are probably in some cases used in contexts where dynamic
allocation (and possibility of failure) is not nice? And we can compare this
effort with just increasing per-cpu stack sizes, for example?

I'm not particularly against moving in this direction, but there might be
cases where it isn't worth the effort, or there are better solutions.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 01:10:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 01:10:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHABZ-0005JB-SA; Fri, 21 Oct 2011 01:10:37 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHA7X-00053B-KF
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 01:06:31 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1319184354!42850301!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32573 invoked from network); 21 Oct 2011 08:05:55 -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; 21 Oct 2011 08:05:55 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 09:06:24 +0100
Message-Id: <4EA1441E020000780005CA81@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 09:06:22 +0100
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="=__Part4E61ACEE.1__="
Cc: Allen M Kay <allen.m.kay@intel.com>
Subject: [Xen-devel] [PATCH] VT-d/ATS: cleanup
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--=__Part4E61ACEE.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

- 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>

--- a/xen/drivers/passthrough/vtd/dmar.c
+++ b/xen/drivers/passthrough/vtd/dmar.c
@@ -160,7 +160,7 @@ static int __init acpi_register_atsr_uni
     return 0;
 }
=20
-struct acpi_drhd_unit * acpi_find_matched_drhd_unit(struct pci_dev *pdev)
+struct acpi_drhd_unit *acpi_find_matched_drhd_unit(const struct pci_dev =
*pdev)
 {
     u8 bus, devfn;
     struct acpi_drhd_unit *drhd;
@@ -204,17 +204,17 @@ struct acpi_drhd_unit * acpi_find_matche
     return include_all;
 }
=20
-struct acpi_atsr_unit * acpi_find_matched_atsr_unit(u16 seg, u8 bus, u8 =
devfn)
+struct acpi_atsr_unit *acpi_find_matched_atsr_unit(const struct pci_dev =
*pdev)
 {
     struct acpi_atsr_unit *atsr;
     struct acpi_atsr_unit *all_ports =3D NULL;
=20
     list_for_each_entry ( atsr, &acpi_atsr_units, list )
     {
-        if ( atsr->segment !=3D seg )
+        if ( atsr->segment !=3D pdev->seg )
             continue;
=20
-        if ( test_bit(bus, atsr->scope.buses) )
+        if ( test_bit(pdev->bus, atsr->scope.buses) )
             return atsr;
=20
         if ( atsr->all_ports )
--- a/xen/drivers/passthrough/vtd/dmar.h
+++ b/xen/drivers/passthrough/vtd/dmar.h
@@ -86,8 +86,8 @@ struct acpi_rhsa_unit {
         for (idx =3D 0; (bdf =3D rmrr->scope.devices[idx]) && \
                  idx < rmrr->scope.devices_cnt; idx++)
=20
-struct acpi_drhd_unit * acpi_find_matched_drhd_unit(struct pci_dev =
*pdev);
-struct acpi_atsr_unit * acpi_find_matched_atsr_unit(u16 seg, u8 bus, u8 =
devfn);
+struct acpi_drhd_unit *acpi_find_matched_drhd_unit(const struct pci_dev =
*);
+struct acpi_atsr_unit *acpi_find_matched_atsr_unit(const struct pci_dev =
*);
=20
 #define DMAR_TYPE 1
 #define RMRR_TYPE 2
--- a/xen/drivers/passthrough/vtd/extern.h
+++ b/xen/drivers/passthrough/vtd/extern.h
@@ -61,10 +61,9 @@ extern bool_t ats_enabled;
=20
 struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
=20
-int ats_device(int seg, int bus, int devfn);
+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 invalidate_ats_tcs(struct iommu *iommu);
=20
 int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
                          u64 addr, unsigned int size_order, u64 type);
@@ -76,7 +75,8 @@ static inline struct acpi_drhd_unit *fin
     return NULL;
 }
=20
-static inline int ats_device(int seg, int bus, int devfn)
+static inline int ats_device(const struct pci_dev *pdev,
+                             const struct acpi_drhd_unit *drhd)
 {
     return 0;
 }
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1410,7 +1410,7 @@ static int domain_context_mapping(
                     domain->domain_id, seg, bus,
                     PCI_SLOT(devfn), PCI_FUNC(devfn));
         ret =3D domain_context_mapping_one(domain, drhd->iommu, bus, =
devfn);
-        if ( !ret && ats_device(seg, bus, devfn) )
+        if ( !ret && ats_device(pdev, drhd) > 0 )
             enable_ats_device(seg, bus, devfn);
=20
         break;
@@ -1541,7 +1541,7 @@ static int domain_context_unmap(
                     domain->domain_id, seg, bus,
                     PCI_SLOT(devfn), PCI_FUNC(devfn));
         ret =3D domain_context_unmap_one(domain, iommu, bus, devfn);
-        if ( !ret && ats_device(seg, bus, devfn) )
+        if ( !ret && ats_device(pdev, drhd) > 0 )
             disable_ats_device(seg, bus, devfn);
=20
         break;
--- a/xen/drivers/passthrough/vtd/x86/ats.c
+++ b/xen/drivers/passthrough/vtd/x86/ats.c
@@ -83,40 +83,32 @@ struct acpi_drhd_unit * find_ats_dev_drh
     return NULL;
 }
=20
-int ats_device(int seg, int bus, int devfn)
+int ats_device(const struct pci_dev *pdev, const struct acpi_drhd_unit =
*drhd)
 {
-    struct acpi_drhd_unit *drhd, *ats_drhd, *new_drhd;
-    struct pci_dev *pdev;
-    int pos =3D 0;
+    struct acpi_drhd_unit *ats_drhd;
+    int pos;
=20
     if ( !ats_enabled || !iommu_qinval )
         return 0;
=20
-    pdev =3D pci_get_pdev(seg, bus, devfn);
-    if ( !pdev )
-        return 0;
-
-    drhd =3D acpi_find_matched_drhd_unit(pdev);
-    if ( !drhd )
-        return 0;
-
     if ( !ecap_queued_inval(drhd->iommu->ecap) ||
          !ecap_dev_iotlb(drhd->iommu->ecap) )
         return 0;
=20
-    if ( !acpi_find_matched_atsr_unit(seg, bus, devfn) )
+    if ( !acpi_find_matched_atsr_unit(pdev) )
         return 0;
=20
     ats_drhd =3D find_ats_dev_drhd(drhd->iommu);
-    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+    pos =3D pci_find_ext_capability(pdev->seg, pdev->bus, pdev->devfn,
+                                  PCI_EXT_CAP_ID_ATS);
=20
     if ( pos && (ats_drhd =3D=3D NULL) )
     {
-        new_drhd =3D xmalloc(struct acpi_drhd_unit);
-        if ( !new_drhd )
-            return 0;
-        memcpy(new_drhd, drhd, sizeof(struct acpi_drhd_unit));
-        list_add_tail(&new_drhd->list, &ats_dev_drhd_units);
+        ats_drhd =3D xmalloc(struct acpi_drhd_unit);
+        if ( !ats_drhd )
+            return -ENOMEM;
+        *ats_drhd =3D *drhd;
+        list_add_tail(&ats_drhd->list, &ats_dev_drhd_units);
     }
     return pos;
 }



--=__Part4E61ACEE.1__=
Content-Type: text/plain; name="vtd-ats-cleanup.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="vtd-ats-cleanup.patch"

VT-d/ATS: cleanup=0A=0A- make acpi_find_matched_atsr_unit() consistent =
with=0A  acpi_find_matched_drhd_unit() (and constify their parameter)=0A- =
make ats_device() take a struct pci_dev * instead of seg:bus:devfn=0A  and =
additionally the matching DRHD (as its callers already worked=0A  that =
out)=0A- remove a stale prototype=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/drivers/passthrough/vtd/dmar.c=0A+++ =
b/xen/drivers/passthrough/vtd/dmar.c=0A@@ -160,7 +160,7 @@ static int =
__init acpi_register_atsr_uni=0A     return 0;=0A }=0A =0A-struct =
acpi_drhd_unit * acpi_find_matched_drhd_unit(struct pci_dev *pdev)=0A+struc=
t acpi_drhd_unit *acpi_find_matched_drhd_unit(const struct pci_dev =
*pdev)=0A {=0A     u8 bus, devfn;=0A     struct acpi_drhd_unit *drhd;=0A@@ =
-204,17 +204,17 @@ struct acpi_drhd_unit * acpi_find_matche=0A     return =
include_all;=0A }=0A =0A-struct acpi_atsr_unit * acpi_find_matched_atsr_uni=
t(u16 seg, u8 bus, u8 devfn)=0A+struct acpi_atsr_unit *acpi_find_matched_at=
sr_unit(const struct pci_dev *pdev)=0A {=0A     struct acpi_atsr_unit =
*atsr;=0A     struct acpi_atsr_unit *all_ports =3D NULL;=0A =0A     =
list_for_each_entry ( atsr, &acpi_atsr_units, list )=0A     {=0A-        =
if ( atsr->segment !=3D seg )=0A+        if ( atsr->segment !=3D pdev->seg =
)=0A             continue;=0A =0A-        if ( test_bit(bus, atsr->scope.bu=
ses) )=0A+        if ( test_bit(pdev->bus, atsr->scope.buses) )=0A         =
    return atsr;=0A =0A         if ( atsr->all_ports )=0A--- a/xen/drivers/=
passthrough/vtd/dmar.h=0A+++ b/xen/drivers/passthrough/vtd/dmar.h=0A@@ =
-86,8 +86,8 @@ struct acpi_rhsa_unit {=0A         for (idx =3D 0; (bdf =3D =
rmrr->scope.devices[idx]) && \=0A                  idx < rmrr->scope.device=
s_cnt; idx++)=0A =0A-struct acpi_drhd_unit * acpi_find_matched_drhd_unit(st=
ruct pci_dev *pdev);=0A-struct acpi_atsr_unit * acpi_find_matched_atsr_unit=
(u16 seg, u8 bus, u8 devfn);=0A+struct acpi_drhd_unit *acpi_find_matched_dr=
hd_unit(const struct pci_dev *);=0A+struct acpi_atsr_unit *acpi_find_matche=
d_atsr_unit(const struct pci_dev *);=0A =0A #define DMAR_TYPE 1=0A #define =
RMRR_TYPE 2=0A--- a/xen/drivers/passthrough/vtd/extern.h=0A+++ b/xen/driver=
s/passthrough/vtd/extern.h=0A@@ -61,10 +61,9 @@ extern bool_t ats_enabled;=
=0A =0A struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);=0A =
=0A-int ats_device(int seg, int bus, int devfn);=0A+int ats_device(const =
struct pci_dev *, const struct acpi_drhd_unit *);=0A int enable_ats_device(=
int seg, int bus, int devfn);=0A void disable_ats_device(int seg, int bus, =
int devfn);=0A-int invalidate_ats_tcs(struct iommu *iommu);=0A =0A int =
dev_invalidate_iotlb(struct iommu *iommu, u16 did,=0A                      =
    u64 addr, unsigned int size_order, u64 type);=0A@@ -76,7 +75,8 @@ =
static inline struct acpi_drhd_unit *fin=0A     return NULL;=0A }=0A =
=0A-static inline int ats_device(int seg, int bus, int devfn)=0A+static =
inline int ats_device(const struct pci_dev *pdev,=0A+                      =
       const struct acpi_drhd_unit *drhd)=0A {=0A     return 0;=0A }=0A--- =
a/xen/drivers/passthrough/vtd/iommu.c=0A+++ b/xen/drivers/passthrough/vtd/i=
ommu.c=0A@@ -1410,7 +1410,7 @@ static int domain_context_mapping(=0A       =
              domain->domain_id, seg, bus,=0A                     =
PCI_SLOT(devfn), PCI_FUNC(devfn));=0A         ret =3D domain_context_mappin=
g_one(domain, drhd->iommu, bus, devfn);=0A-        if ( !ret && ats_device(=
seg, bus, devfn) )=0A+        if ( !ret && ats_device(pdev, drhd) > 0 )=0A =
            enable_ats_device(seg, bus, devfn);=0A =0A         break;=0A@@ =
-1541,7 +1541,7 @@ static int domain_context_unmap(=0A                     =
domain->domain_id, seg, bus,=0A                     PCI_SLOT(devfn), =
PCI_FUNC(devfn));=0A         ret =3D domain_context_unmap_one(domain, =
iommu, bus, devfn);=0A-        if ( !ret && ats_device(seg, bus, devfn) =
)=0A+        if ( !ret && ats_device(pdev, drhd) > 0 )=0A             =
disable_ats_device(seg, bus, devfn);=0A =0A         break;=0A--- a/xen/driv=
ers/passthrough/vtd/x86/ats.c=0A+++ b/xen/drivers/passthrough/vtd/x86/ats.c=
=0A@@ -83,40 +83,32 @@ struct acpi_drhd_unit * find_ats_dev_drh=0A     =
return NULL;=0A }=0A =0A-int ats_device(int seg, int bus, int devfn)=0A+int=
 ats_device(const struct pci_dev *pdev, const struct acpi_drhd_unit =
*drhd)=0A {=0A-    struct acpi_drhd_unit *drhd, *ats_drhd, *new_drhd;=0A-  =
  struct pci_dev *pdev;=0A-    int pos =3D 0;=0A+    struct acpi_drhd_unit =
*ats_drhd;=0A+    int pos;=0A =0A     if ( !ats_enabled || !iommu_qinval =
)=0A         return 0;=0A =0A-    pdev =3D pci_get_pdev(seg, bus, =
devfn);=0A-    if ( !pdev )=0A-        return 0;=0A-=0A-    drhd =3D =
acpi_find_matched_drhd_unit(pdev);=0A-    if ( !drhd )=0A-        return =
0;=0A-=0A     if ( !ecap_queued_inval(drhd->iommu->ecap) ||=0A          =
!ecap_dev_iotlb(drhd->iommu->ecap) )=0A         return 0;=0A =0A-    if ( =
!acpi_find_matched_atsr_unit(seg, bus, devfn) )=0A+    if ( !acpi_find_matc=
hed_atsr_unit(pdev) )=0A         return 0;=0A =0A     ats_drhd =3D =
find_ats_dev_drhd(drhd->iommu);=0A-    pos =3D pci_find_ext_capability(seg,=
 bus, devfn, PCI_EXT_CAP_ID_ATS);=0A+    pos =3D pci_find_ext_capability(pd=
ev->seg, pdev->bus, pdev->devfn,=0A+                                  =
PCI_EXT_CAP_ID_ATS);=0A =0A     if ( pos && (ats_drhd =3D=3D NULL) )=0A    =
 {=0A-        new_drhd =3D xmalloc(struct acpi_drhd_unit);=0A-        if ( =
!new_drhd )=0A-            return 0;=0A-        memcpy(new_drhd, drhd, =
sizeof(struct acpi_drhd_unit));=0A-        list_add_tail(&new_drhd->list, =
&ats_dev_drhd_units);=0A+        ats_drhd =3D xmalloc(struct acpi_drhd_unit=
);=0A+        if ( !ats_drhd )=0A+            return -ENOMEM;=0A+        =
*ats_drhd =3D *drhd;=0A+        list_add_tail(&ats_drhd->list, &ats_dev_drh=
d_units);=0A     }=0A     return pos;=0A }=0A
--=__Part4E61ACEE.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

--=__Part4E61ACEE.1__=--


From xen-devel-bounces@lists.xensource.com Fri Oct 21 01:13:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 01:13:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHAE0-0005i9-6b; Fri, 21 Oct 2011 01:13:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHABe-0005Jr-QW
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 01:10:43 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1319184617!49676535!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13867 invoked from network); 21 Oct 2011 08:10:17 -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; 21 Oct 2011 08:10:17 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 09:10:39 +0100
Message-Id: <4EA1451E020000780005CA8C@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 09:10:38 +0100
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="=__Part416EA3EE.1__="
Cc: Allen M Kay <allen.m.kay@intel.com>
Subject: [Xen-devel] [PATCH] passthrough: re-attempt ACS and ATS enabling
	when devices get reported by Dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--=__Part416EA3EE.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

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>

--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -150,6 +150,23 @@ int iommu_add_device(struct pci_dev *pde
     return hd->platform_ops->add_device(pdev);
 }
=20
+int iommu_enable_device(struct pci_dev *pdev)
+{
+    struct hvm_iommu *hd;
+
+    if ( !pdev->domain )
+        return -EINVAL;
+
+    ASSERT(spin_is_locked(&pcidevs_lock));
+
+    hd =3D domain_hvm_iommu(pdev->domain);
+    if ( !iommu_enabled || !hd->platform_ops ||
+         !hd->platform_ops->enable_device )
+        return 0;
+
+    return hd->platform_ops->enable_device(pdev);
+}
+
 int iommu_remove_device(struct pci_dev *pdev)
 {
     struct hvm_iommu *hd;
--- a/xen/drivers/passthrough/pci.c
+++ b/xen/drivers/passthrough/pci.c
@@ -258,7 +258,7 @@ struct pci_dev *pci_get_pdev_by_domain(
  * pci_enable_acs - enable ACS if hardware support it
  * @dev: the PCI device
  */
-void pci_enable_acs(struct pci_dev *pdev)
+static void pci_enable_acs(struct pci_dev *pdev)
 {
     int pos;
     u16 cap, ctrl, seg =3D pdev->seg;
@@ -409,8 +409,11 @@ int pci_add_device(u16 seg, u8 bus, u8 d
         }
=20
         list_add(&pdev->domain_list, &dom0->arch.pdev_list);
-        pci_enable_acs(pdev);
     }
+    else
+        iommu_enable_device(pdev);
+
+    pci_enable_acs(pdev);
=20
 out:
     spin_unlock(&pcidevs_lock);
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1900,6 +1900,19 @@ static int intel_iommu_add_device(struct
     return ret;
 }
=20
+static int intel_iommu_enable_device(struct pci_dev *pdev)
+{
+    struct acpi_drhd_unit *drhd =3D acpi_find_matched_drhd_unit(pdev);
+    int ret =3D drhd ? ats_device(pdev, drhd) : -ENODEV;
+
+    if ( ret <=3D 0 )
+        return ret;
+
+    ret =3D enable_ats_device(pdev->seg, pdev->bus, pdev->devfn);
+
+    return ret >=3D 0 ? 0 : ret;
+}
+
 static int intel_iommu_remove_device(struct pci_dev *pdev)
 {
     struct acpi_rmrr_unit *rmrr;
@@ -1930,7 +1943,6 @@ static int intel_iommu_remove_device(str
 static void __init setup_dom0_device(struct pci_dev *pdev)
 {
     domain_context_mapping(pdev->domain, pdev->seg, pdev->bus, pdev->devfn=
);
-    pci_enable_acs(pdev);
     pci_vtd_quirk(pdev);
 }
=20
@@ -2301,6 +2313,7 @@ const struct iommu_ops intel_iommu_ops =3D
     .init =3D intel_iommu_domain_init,
     .dom0_init =3D intel_iommu_dom0_init,
     .add_device =3D intel_iommu_add_device,
+    .enable_device =3D intel_iommu_enable_device,
     .remove_device =3D intel_iommu_remove_device,
     .assign_device  =3D intel_iommu_assign_device,
     .teardown =3D iommu_domain_teardown,
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -70,6 +70,7 @@ int iommu_enable_x2apic_IR(void);
 void iommu_disable_x2apic_IR(void);
=20
 int iommu_add_device(struct pci_dev *pdev);
+int iommu_enable_device(struct pci_dev *pdev);
 int iommu_remove_device(struct pci_dev *pdev);
 int iommu_domain_init(struct domain *d);
 void iommu_dom0_init(struct domain *d);
@@ -120,6 +121,7 @@ struct iommu_ops {
     int (*init)(struct domain *d);
     void (*dom0_init)(struct domain *d);
     int (*add_device)(struct pci_dev *pdev);
+    int (*enable_device)(struct pci_dev *pdev);
     int (*remove_device)(struct pci_dev *pdev);
     int (*assign_device)(struct domain *d, u16 seg, u8 bus, u8 devfn);
     void (*teardown)(struct domain *d);
--- a/xen/include/xen/pci.h
+++ b/xen/include/xen/pci.h
@@ -134,6 +134,5 @@ struct pirq;
 int msixtbl_pt_register(struct domain *, struct pirq *, uint64_t gtable);
 void msixtbl_pt_unregister(struct domain *, struct pirq *);
 void msixtbl_pt_cleanup(struct domain *d);
-void pci_enable_acs(struct pci_dev *pdev);
=20
 #endif /* __XEN_PCI_H__ */



--=__Part416EA3EE.1__=
Content-Type: text/plain; name="pci-ext-cap-late.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="pci-ext-cap-late.patch"

passthrough: re-attempt ACS and ATS enabling when devices get reported by =
Dom0=0A=0ASince extended config space accesses may not be possible =
when=0Ascan_pci_devices() runs (due to MMCFG resources not being reserved =
in=0Athe E820 table, which the specification allows to be the case),=0Afunc=
tionality enabling of which requires such must be re-attempted=0Awhen it =
is known whether MMCFG is safe to use.=0A=0ASigned-off-by: Jan Beulich =
<jbeulich@suse.com>=0A=0A--- a/xen/drivers/passthrough/iommu.c=0A+++ =
b/xen/drivers/passthrough/iommu.c=0A@@ -150,6 +150,23 @@ int iommu_add_devi=
ce(struct pci_dev *pde=0A     return hd->platform_ops->add_device(pdev);=0A=
 }=0A =0A+int iommu_enable_device(struct pci_dev *pdev)=0A+{=0A+    struct =
hvm_iommu *hd;=0A+=0A+    if ( !pdev->domain )=0A+        return =
-EINVAL;=0A+=0A+    ASSERT(spin_is_locked(&pcidevs_lock));=0A+=0A+    hd =
=3D domain_hvm_iommu(pdev->domain);=0A+    if ( !iommu_enabled || =
!hd->platform_ops ||=0A+         !hd->platform_ops->enable_device )=0A+    =
    return 0;=0A+=0A+    return hd->platform_ops->enable_device(pdev);=0A+}=
=0A+=0A int iommu_remove_device(struct pci_dev *pdev)=0A {=0A     struct =
hvm_iommu *hd;=0A--- a/xen/drivers/passthrough/pci.c=0A+++ b/xen/drivers/pa=
ssthrough/pci.c=0A@@ -258,7 +258,7 @@ struct pci_dev *pci_get_pdev_by_domai=
n(=0A  * pci_enable_acs - enable ACS if hardware support it=0A  * @dev: =
the PCI device=0A  */=0A-void pci_enable_acs(struct pci_dev *pdev)=0A+stati=
c void pci_enable_acs(struct pci_dev *pdev)=0A {=0A     int pos;=0A     =
u16 cap, ctrl, seg =3D pdev->seg;=0A@@ -409,8 +409,11 @@ int pci_add_device=
(u16 seg, u8 bus, u8 d=0A         }=0A =0A         list_add(&pdev->domain_l=
ist, &dom0->arch.pdev_list);=0A-        pci_enable_acs(pdev);=0A     }=0A+ =
   else=0A+        iommu_enable_device(pdev);=0A+=0A+    pci_enable_acs(pde=
v);=0A =0A out:=0A     spin_unlock(&pcidevs_lock);=0A--- a/xen/drivers/pass=
through/vtd/iommu.c=0A+++ b/xen/drivers/passthrough/vtd/iommu.c=0A@@ =
-1900,6 +1900,19 @@ static int intel_iommu_add_device(struct=0A     return =
ret;=0A }=0A =0A+static int intel_iommu_enable_device(struct pci_dev =
*pdev)=0A+{=0A+    struct acpi_drhd_unit *drhd =3D acpi_find_matched_drhd_u=
nit(pdev);=0A+    int ret =3D drhd ? ats_device(pdev, drhd) : -ENODEV;=0A+=
=0A+    if ( ret <=3D 0 )=0A+        return ret;=0A+=0A+    ret =3D =
enable_ats_device(pdev->seg, pdev->bus, pdev->devfn);=0A+=0A+    return =
ret >=3D 0 ? 0 : ret;=0A+}=0A+=0A static int intel_iommu_remove_device(stru=
ct pci_dev *pdev)=0A {=0A     struct acpi_rmrr_unit *rmrr;=0A@@ -1930,7 =
+1943,6 @@ static int intel_iommu_remove_device(str=0A static void __init =
setup_dom0_device(struct pci_dev *pdev)=0A {=0A     domain_context_mapping(=
pdev->domain, pdev->seg, pdev->bus, pdev->devfn);=0A-    pci_enable_acs(pde=
v);=0A     pci_vtd_quirk(pdev);=0A }=0A =0A@@ -2301,6 +2313,7 @@ const =
struct iommu_ops intel_iommu_ops =3D=0A     .init =3D intel_iommu_domain_in=
it,=0A     .dom0_init =3D intel_iommu_dom0_init,=0A     .add_device =3D =
intel_iommu_add_device,=0A+    .enable_device =3D intel_iommu_enable_device=
,=0A     .remove_device =3D intel_iommu_remove_device,=0A     .assign_devic=
e  =3D intel_iommu_assign_device,=0A     .teardown =3D iommu_domain_teardow=
n,=0A--- a/xen/include/xen/iommu.h=0A+++ b/xen/include/xen/iommu.h=0A@@ =
-70,6 +70,7 @@ int iommu_enable_x2apic_IR(void);=0A void iommu_disable_x2ap=
ic_IR(void);=0A =0A int iommu_add_device(struct pci_dev *pdev);=0A+int =
iommu_enable_device(struct pci_dev *pdev);=0A int iommu_remove_device(struc=
t pci_dev *pdev);=0A int iommu_domain_init(struct domain *d);=0A void =
iommu_dom0_init(struct domain *d);=0A@@ -120,6 +121,7 @@ struct iommu_ops =
{=0A     int (*init)(struct domain *d);=0A     void (*dom0_init)(struct =
domain *d);=0A     int (*add_device)(struct pci_dev *pdev);=0A+    int =
(*enable_device)(struct pci_dev *pdev);=0A     int (*remove_device)(struct =
pci_dev *pdev);=0A     int (*assign_device)(struct domain *d, u16 seg, u8 =
bus, u8 devfn);=0A     void (*teardown)(struct domain *d);=0A--- a/xen/incl=
ude/xen/pci.h=0A+++ b/xen/include/xen/pci.h=0A@@ -134,6 +134,5 @@ struct =
pirq;=0A int msixtbl_pt_register(struct domain *, struct pirq *, uint64_t =
gtable);=0A void msixtbl_pt_unregister(struct domain *, struct pirq *);=0A =
void msixtbl_pt_cleanup(struct domain *d);=0A-void pci_enable_acs(struct =
pci_dev *pdev);=0A =0A #endif /* __XEN_PCI_H__ */=0A
--=__Part416EA3EE.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

--=__Part416EA3EE.1__=--


From xen-devel-bounces@lists.xensource.com Fri Oct 21 01:24:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 01:24:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHAOX-0006FY-Dn; Fri, 21 Oct 2011 01:24:01 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHANh-00063N-Gn
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 01:23:09 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319185386!1062349!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19958 invoked from network); 21 Oct 2011 08:23:06 -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; 21 Oct 2011 08:23:06 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 09:23:06 +0100
Message-Id: <4EA14809020000780005CAA2@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 09:23:05 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Keir Fraser" <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH 00/12] cpumask handling scalability
	improvements
References: <4EA13711020000780005CA36@nat28.tlf.novell.com>
	<CAC6E536.23673%keir.xen@gmail.com>
In-Reply-To: <CAC6E536.23673%keir.xen@gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Cc: Andrew Cooper <andrew.cooper3@citrix.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 21.10.11 at 10:00, Keir Fraser <keir.xen@gmail.com> wrote:
> On 21/10/2011 08:10, "Jan Beulich" <JBeulich@suse.com> wrote:
>=20
>>> Aren't we planning to dynamically allocate irq_desc-s? That would seem =
the
>>> nicer solution here.
>>=20
>> Yes, I would hope so. But irrespective of that, allocating e.g. 512 =
bits
>> (times 4) just to use, say, 20-30 of them is bad - again, not so much
>> from a memory wasting pov, but rather from the fact that this
>> needlessly causes a larger cache and TLB footprint.
>=20
> Oh, I don't mind you changing irq_desc to use cpumask_var_t-s. It's the
> extra step of using an array to save a few pointers, that I reject.

That's what I understood.

>> I actually think that ultimately we should try to remove all
>> non-dynamically allocated CPU masks (including statics, per-CPU
>> ones, and local variables - the latter being particularly important as
>> they cause pretty big stack frames, despite there now being at
>> most one [with the rare exception of two] of them per function,
>> which will continue to grow with higher NR_CPUS values).
>=20
> OTOH they are probably in some cases used in contexts where dynamic
> allocation (and possibility of failure) is not nice? And we can compare =
this
> effort with just increasing per-cpu stack sizes, for example?
>=20
> I'm not particularly against moving in this direction, but there might =
be
> cases where it isn't worth the effort, or there are better solutions.

Indeed, in some cases it may mean moving from stack variables to
e.g. per-CPU pre-allocated ones.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 01:38:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 01:38:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHAcR-0006zO-Os; Fri, 21 Oct 2011 01:38:23 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHAbf-0006ml-3Z
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 01:37:35 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1319186250!1072015!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17904 invoked from network); 21 Oct 2011 08:37:30 -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; 21 Oct 2011 08:37:30 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 09:37:29 +0100
Message-Id: <4EA14B66020000780005CAB6@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 09:37:26 +0100
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="=__PartFED11C56.1__="
Cc: herrmann.der.user@googlemail.com, Thomas Renninger <trenn@suse.de>
Subject: [Xen-devel] [PATCH] x86/ucode-amd: fix regression from c/s
	23871:503ee256fecf
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--=__PartFED11C56.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

microcode_fits() must return distinct values for the success and
no-fit-but-no-error cases, so the caller can react accordingly. Make
it return 1 in the success case, and adjust its single caller.

Also remove an impossible code path - install_equiv_cpu_table(), which
gets called prior to microcode_fits(), never leaves equiv_cpu_table
being NULL without also returning an error.

Note that this is still awaiting testing on a system where the
regression was actually observed (which also requires a new enough
microcode_ctl package). Note also that this will need to be
backported to 4.0 and 4.1 (or the broken c/s that got backported
there reverted).

Signed-off-by: Jan Beulich <jbeulich@novell.com>

--- a/xen/arch/x86/microcode_amd.c
+++ b/xen/arch/x86/microcode_amd.c
@@ -76,14 +76,6 @@ static int microcode_fits(void *mc, int=20
     /* We should bind the task to the CPU */
     BUG_ON(cpu !=3D raw_smp_processor_id());
=20
-    if ( equiv_cpu_table =3D=3D NULL )
-    {
-        printk(KERN_INFO "microcode: CPU%d microcode update with "
-               "version 0x%x (current=3D0x%x)\n",
-               cpu, mc_header->patch_id, uci->cpu_sig.rev);
-        goto out;
-    }
-
     current_cpu_id =3D cpuid_eax(0x00000001);
=20
     for ( i =3D 0; equiv_cpu_table[i].installed_cpu !=3D 0; i++ )
@@ -96,7 +88,7 @@ static int microcode_fits(void *mc, int=20
     }
=20
     if ( !equiv_cpu_id )
-	    return 0;
+        return 0;
=20
     if ( (mc_header->processor_rev_id) !=3D equiv_cpu_id )
     {
@@ -113,8 +105,7 @@ static int microcode_fits(void *mc, int=20
            "update with version 0x%x (current=3D0x%x)\n",
            cpu, mc_header->patch_id, uci->cpu_sig.rev);
=20
-out:
-    return 0;
+    return 1;
 }
=20
 static int apply_microcode(int cpu)
@@ -285,7 +276,7 @@ static int cpu_request_microcode(int cpu
     while ( (ret =3D get_next_ucode_from_buffer_amd(mc, buf, size, =
&offset)) =3D=3D 0)
     {
         error =3D microcode_fits(mc, cpu);
-        if (error !=3D 0)
+        if (error <=3D 0)
             continue;
=20
         error =3D apply_microcode(cpu);




--=__PartFED11C56.1__=
Content-Type: text/plain; name="x86-microcode-amd-fix-23871.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-microcode-amd-fix-23871.patch"

x86/ucode-amd: fix regression from c/s 23871:503ee256fecf=0A=0Amicrocode_fi=
ts() must return distinct values for the success and=0Ano-fit-but-no-error =
cases, so the caller can react accordingly. Make=0Ait return 1 in the =
success case, and adjust its single caller.=0A=0AAlso remove an impossible =
code path - install_equiv_cpu_table(), which=0Agets called prior to =
microcode_fits(), never leaves equiv_cpu_table=0Abeing NULL without also =
returning an error.=0A=0ANote that this is still awaiting testing on a =
system where the=0Aregression was actually observed (which also requires a =
new enough=0Amicrocode_ctl package). Note also that this will need to =
be=0Abackported to 4.0 and 4.1 (or the broken c/s that got backported=0Athe=
re reverted).=0A=0ASigned-off-by: Jan Beulich <jbeulich@novell.com>=0A=0A--=
- a/xen/arch/x86/microcode_amd.c=0A+++ b/xen/arch/x86/microcode_amd.c=0A@@ =
-76,14 +76,6 @@ static int microcode_fits(void *mc, int =0A     /* We =
should bind the task to the CPU */=0A     BUG_ON(cpu !=3D raw_smp_processor=
_id());=0A =0A-    if ( equiv_cpu_table =3D=3D NULL )=0A-    {=0A-        =
printk(KERN_INFO "microcode: CPU%d microcode update with "=0A-             =
  "version 0x%x (current=3D0x%x)\n",=0A-               cpu, mc_header->patc=
h_id, uci->cpu_sig.rev);=0A-        goto out;=0A-    }=0A-=0A     =
current_cpu_id =3D cpuid_eax(0x00000001);=0A =0A     for ( i =3D 0; =
equiv_cpu_table[i].installed_cpu !=3D 0; i++ )=0A@@ -96,7 +88,7 @@ static =
int microcode_fits(void *mc, int =0A     }=0A =0A     if ( !equiv_cpu_id =
)=0A-	    return 0;=0A+        return 0;=0A =0A     if ( (mc_header->proc=
essor_rev_id) !=3D equiv_cpu_id )=0A     {=0A@@ -113,8 +105,7 @@ static =
int microcode_fits(void *mc, int =0A            "update with version 0x%x =
(current=3D0x%x)\n",=0A            cpu, mc_header->patch_id, uci->cpu_sig.r=
ev);=0A =0A-out:=0A-    return 0;=0A+    return 1;=0A }=0A =0A static int =
apply_microcode(int cpu)=0A@@ -285,7 +276,7 @@ static int cpu_request_micro=
code(int cpu=0A     while ( (ret =3D get_next_ucode_from_buffer_amd(mc, =
buf, size, &offset)) =3D=3D 0)=0A     {=0A         error =3D microcode_fits=
(mc, cpu);=0A-        if (error !=3D 0)=0A+        if (error <=3D 0)=0A    =
         continue;=0A =0A         error =3D apply_microcode(cpu);=0A
--=__PartFED11C56.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

--=__PartFED11C56.1__=--


From xen-devel-bounces@lists.xensource.com Fri Oct 21 01:45:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 01:45:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHAjG-0007ZQ-QF; Fri, 21 Oct 2011 01:45:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHAij-0007Mw-K4
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 01:44:54 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319186690!238865!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15259 invoked from network); 21 Oct 2011 08:44:50 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-7.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	21 Oct 2011 08:44:50 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319186689; l=377;
	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=Wq8eo0QBF1Jf6LhJRNlRu4nD/vI=;
	b=p3ZCfIftuSS//qGlnx9uayLQozmR6CxxdQ0tOk0a/b4guFLmI5MkM9N3mZVgvHrq05p
	syDCGwi59RA8pfR9WrJ5c2dLKV2/fk6g2+QJLWPvDn27x7AWX7+tUnNkBwVnKcFIkoLgV
	qULyfrkjuFeqybQu70k+i4UvOkoupiwYk7U=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (jimi mo46) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id D024b4n9L72F7l ;
	Fri, 21 Oct 2011 10:44:43 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id EDD5218637; Fri, 21 Oct 2011 10:44:42 +0200 (CEST)
Date: Fri, 21 Oct 2011 10:44:42 +0200
From: Olaf Hering <olaf@aepfle.de>
To: AP <apxeng@gmail.com>
Subject: Re: [Xen-devel] make install not creating lib entries in /usr/lib
	under Ubunu 11.10
Message-ID: <20111021084442.GA9601@aepfle.de>
References: <CAGU+aut64MmMmf901p9Gsya4O=hep8merZUDfSUuJCJXMVFtrg@mail.gmail.com>
	<1319013780.3385.64.camel@zakaz.uk.xensource.com>
	<20126.62103.576976.140927@mariner.uk.xensource.com>
	<CAGU+autjm1EEKeDjQiuwixo0QAwwNntsFWZ9V6JSTZOhyWVadg@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <CAGU+autjm1EEKeDjQiuwixo0QAwwNntsFWZ9V6JSTZOhyWVadg@mail.gmail.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
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, Oct 20, AP wrote:

> I deleted my /usr/lib64 and did a "make install-tools
> PYTHON_PREFIX_ARG=". At the end a /usr/lib64 directory was created
> with Xen related libraries inside.

Thats the correct place for 64bit libraries. If your distro likes to put
these files in a non-standard place, set LIBLEAFDIR_x86_64 to lib in
your own build environment.

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:11:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02: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 1RHB8g-0000fO-Hn; Fri, 21 Oct 2011 02:11:42 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RHB88-0000TH-86
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:11:09 -0700
X-Env-Sender: chao.zhou@intel.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319188264!244228!1
X-Originating-IP: [134.134.136.20]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7041 invoked from network); 21 Oct 2011 09:11:05 -0000
Received: from mga02.intel.com (HELO mga02.intel.com) (134.134.136.20)
	by server-3.tower-182.messagelabs.com with SMTP;
	21 Oct 2011 09:11:05 -0000
Received: from orsmga002.jf.intel.com ([10.7.209.21])
	by orsmga101.jf.intel.com with ESMTP; 21 Oct 2011 02:11:04 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,351,1309762800"; d="scan'208";a="65391491"
Received: from pgsmsx603.gar.corp.intel.com ([10.221.43.87])
	by orsmga002.jf.intel.com with ESMTP; 21 Oct 2011 02:11:03 -0700
Received: from pgsmsx509.gar.corp.intel.com (172.30.13.17) by
	pgsmsx603.gar.corp.intel.com (10.221.43.87) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Fri, 21 Oct 2011 17:10:32 +0800
Received: from shsmsx602.ccr.corp.intel.com (10.239.4.104) by
	PGSMSX509.gar.corp.intel.com (172.30.13.17) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Fri, 21 Oct 2011 17:10:31 +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, 21 Oct 2011 17:10:30 +0800
From: "Zhou, Chao" <chao.zhou@intel.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Fri, 21 Oct 2011 17:10:29 +0800
Thread-Topic: VMX status report. Xen:23980 & Dom0:20a27c1e...
Thread-Index: AcyP0UdIvwa+XpiwRWOak34UWwi55g==
Message-ID: <A24AE1FFE7AEC5489F83450EE98351BF4655651FDE@shsmsx502.ccr.corp.intel.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] VMX status report. Xen:23980 & Dom0:20a27c1e...
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 is the test report for xen-unstable tree. There is no new bugs and fix=
.

Version Info
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
xen-changeset:   23980:a06609840ff1
pvops git:
commit 20a27c1e25b8550066902c9d6ca91631e656dfa3
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Test Environment
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
Platform		    Romley-EP(x86_64)		    Westmere-EP(x86_64)
CPU				     32					    24
Memory			     28G					12G
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

Old issues(6)
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
1. [ACPI] System cann't resume after do suspend
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1707
2.[XL]"xl vcpu-set" causes dom0 crash or panic
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1730
3.[VT-D]fail to detach NIC from guest
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1736
4.Dom0 crash on power-off
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1740
5.Sometimes Xen panic on ia32pae Sandybridge when restore guest
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1747
6.[VT-D] device reset fail when create/destroy guest
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=3D1752



Thanks,
Zhou, Chao



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:13:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:13:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBA8-000147-TT; Fri, 21 Oct 2011 02:13:12 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHB9H-0000qu-0R
	for Xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:12:19 -0700
X-Env-Sender: aksinha@yahoo-inc.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319188335!1071315!1
X-Originating-IP: [98.139.253.104]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29351 invoked from network); 21 Oct 2011 09:12:15 -0000
Received: from mrout1-b.corp.bf1.yahoo.com (HELO mrout1-b.corp.bf1.yahoo.com)
	(98.139.253.104)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2011 09:12:15 -0000
Received: from EGL-EX07CAS02.ds.corp.yahoo.com
	(egl-ex07cas02.eglbp.corp.yahoo.com [203.83.248.209])
	by mrout1-b.corp.bf1.yahoo.com (8.14.4/8.14.4/y.out) with ESMTP id
	p9L9Bc8U035562; Fri, 21 Oct 2011 02:11:38 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yahoo-inc.com;
	s=cobra; t=1319188299;
	bh=7EY7lVQMWO5rq0zAGcGK/GHbGdpRrjeKNuFRxaUC3iE=;
	h=From:To:CC:Date:Subject:Message-ID:References:In-Reply-To:
	Content-Type:Content-Transfer-Encoding:MIME-Version;
	b=uPKCGSDUUqxE30Y387nF4UWfN5xhsSAs80LhzmUSh2rYFAReJl5w5f1ZY1tfgtXpf
	By/w3W3//t/9vE8GFmykBsZjw1UnQIioMVgO1jB6+gJb2P6lKp9BzcQzBNmw5059bM
	MXoatwRqUm8fe5NsF8I6garFBUxf+84+RxFHD+yc=
Received: from EGL-EX07VS01.ds.corp.yahoo.com ([203.83.248.205]) by
	EGL-EX07CAS02.ds.corp.yahoo.com ([203.83.248.216]) with mapi;
	Fri, 21 Oct 2011 14:41:37 +0530
From: Alok Sinha <aksinha@yahoo-inc.com>
To: =?iso-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
Date: Fri, 21 Oct 2011 14:41:36 +0530
Subject: Re: [Xen-devel] Question on RHEL 6 support
Thread-Topic: [Xen-devel] Question on RHEL 6 support
Thread-Index: AcyP0W+rf5UpkOJBQjyPYDu3e+B2wQ==
Message-ID: <87807055-1F55-4E27-99ED-3F0CAD28D02E@yahoo-inc.com>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
	<93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
	<20111021061156.GZ12984@reaktio.net>
In-Reply-To: <20111021061156.GZ12984@reaktio.net>
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: "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 Pasi. I am trying that.

By the way, I am getting following error while creating a HVM with rhel as =
guest:


"ERROR: no interface found for primary=3Deth0"


-Alok



On Oct 21, 2011, at 11:41 AM, Pasi K=E4rkk=E4inen wrote:

> On Fri, Oct 21, 2011 at 10:29:46AM +0530, Alok Sinha wrote:
>> Pasi,
>>=20
>>   Thanks for your response.
>>   So how do I disable xen platform device for VM? Any pointers?
>>=20
>=20
> You should be able to change it from /etc/xen/<name_of_the_vm> configfile=
.
>=20
> Try:
> xen_platform_pci=3D0
>=20
> -- Pasi
>=20
>>=20
>> On Oct 20, 2011, at 7:30 PM, Pasi K=E4rkk=E4inen wrote:
>>=20
>>> On Thu, Oct 20, 2011 at 04:18:07PM +0530, Alok Sinha wrote:
>>>>  Hi,
>>>=20
>>> Hello,
>>>=20
>>>>     I am trying to run RHEL 6 as guest over XEN (RHEL 5.6 as host)
>>>>  hypervisor.
>>>>     It seems that RHEL 6 loads the paravirt drivers by default and thu=
s HVM
>>>>  mode is not working.
>>>>     Any idea on this?
>>>=20
>>> What do you mean with "HVM mode is not working" ?
>>>=20
>>> PVHVM drivers (for HVM guests) are there to make disk/net performance a=
 LOT better!
>>> The default qemu-dm emulated ide controller and realtek nic are not ver=
y efficient..
>>>=20
>>>>     I saw somewhere that including xen_emul_unplug=3Dnever will help. =
Is
>>>>  there any other way it can be avoided?
>>>>=20
>>>=20
>>> You can also disable the xen platform pci device for that VM from dom0,=
=20
>>> then the VM will not activate PVHVM drivers.
>>>=20
>>> -- Pasi
>>>=20
>>=20


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:27:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:27:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBO8-0001he-Gf; Fri, 21 Oct 2011 02:27:40 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBNK-0001Uy-W9
	for Xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:26:51 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319189207!249702!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31564 invoked from network); 21 Oct 2011 09:26:47 -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;
	21 Oct 2011 09:26:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,384,1315180800"; 
   d="scan'208";a="8516647"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	21 Oct 2011 09:26:47 +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, 21 Oct 2011 10:26:47 +0100
Date: Fri, 21 Oct 2011 10:26:58 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Mukesh Rathor <mukesh.rathor@oracle.com>
Subject: Re: [Xen-devel] HYBRID: (PV in HVM) update
In-Reply-To: <20111020161709.42a56c27@mantra.us.oracle.com>
Message-ID: <alpine.DEB.2.00.1110211026370.3519@kaball-desktop>
References: <20110818155414.1d8c3015@mantra.us.oracle.com>
	<20111020161709.42a56c27@mantra.us.oracle.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>,
	Fraser <keir.xen@gmail.com>, Keir@lonpmailmx01.citrite.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 Fri, 21 Oct 2011, Mukesh Rathor wrote:
> On Thu, 18 Aug 2011 15:54:14 -0700
> Mukesh Rathor <mukesh.rathor@oracle.com> wrote:
> > 
> > JFYI... So I had a third type is_hybrid in my prototype, that I
> > thought I could get rid of, and hide things under is_hvm check. But
> > that just touches too much code, and things get ugly a bit all over.
> > 
> > It seems I could just mark the guest PV if not EPT and using PV
> > paging, and mark it HVM if EPT enabled to keep changes minimum, and
> > just check for hybrid where needed (so add is_hybrid back in). Trying
> > that now....
> > 
> > thanks
> > Mukesh
> > 
> 
> 
> YEAY guys!!! I now have PV in HVM guest running with EPT! 
> I'll clean up the code (tons of debug stuff right now), and post
> it for anyone to look at. 

great!!


> Next and final frontier after that, running it as dom0.

looking forward to it!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:32:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02: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 1RHBSd-0002BX-CS; Fri, 21 Oct 2011 02:32:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBS2-0001xT-GQ
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:42 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319189498!1851045!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27323 invoked from network); 21 Oct 2011 09:31:39 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-2.tower-216.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 21 Oct 2011 09:31:39 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189498; l=1278;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=i1z8mNY/ZK95LykvYCPbKTBPNCY=;
	b=TBzs2uHQiHS2enYSEJfSGFValPfQmjJXlsIy31VkihQ6/PmP/doJUZSrZgWJ8PZ8QAu
	8ZOIiLNI/fR+FwOfr/QY0dbuWM1HjyvXf5fa1RXY4uJ1GEroQdDiXJMXbY23i8y7YAzws
	orWJsy29qs+YvB3CFfQQC1NTrHZrN2/XjGs=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by post.strato.de (mrclete mo18) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 501216n9L8X7V7
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:38 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 3FFC118636
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:37 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0b7d7a2bd6673f358faf0183b79b29e6a2f036a5
Message-Id: <0b7d7a2bd6673f358faf.1319189504@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:44 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 10 of 15] xenpaging: compare both token and path
 when checking for @releaseDomain event
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319189021 -7200
# Node ID 0b7d7a2bd6673f358faf0183b79b29e6a2f036a5
# Parent  6eb58c8bee87080c5e683a7b118aed7b87d675db
xenpaging: compare both token and path when checking for @releaseDomain event

Subsequent patches will use xenstored to store the numbers of pages
xenpaging is suppose to page-out. A domain_id value could be
misinterpreted as number of pages. Compare both path and token to
recognize the @releaseDomain event.

Also add debug output to show received watch event.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 6eb58c8bee87 -r 0b7d7a2bd667 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -101,7 +101,8 @@ static int xenpaging_wait_for_event_or_t
         vec = xs_read_watch(paging->xs_handle, &num);
         if ( vec )
         {
-            if ( strcmp(vec[XS_WATCH_TOKEN], watch_token) == 0 )
+            DPRINTF("path '%s' token '%s'\n", vec[XS_WATCH_PATH], vec[XS_WATCH_TOKEN]);
+            if ( strcmp(vec[XS_WATCH_PATH], "@releaseDomain") == 0 && strcmp(vec[XS_WATCH_TOKEN], watch_token) == 0 )
             {
                 /* If our guest disappeared, set interrupt flag and fall through */
                 if ( xs_is_domain_introduced(paging->xs_handle, paging->mem_event.domain_id) == false )

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:33:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:33:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBTT-0002Zm-CS; Fri, 21 Oct 2011 02:33:11 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBS5-0001xU-1K
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:45 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-6.tower-182.messagelabs.com!1319189501!247319!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7658 invoked from network); 21 Oct 2011 09:31:41 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-6.tower-182.messagelabs.com with DES-CBC3-SHA encrypted SMTP;
	21 Oct 2011 09:31:41 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189501; l=1476;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=keEiq3pwbLWhmHfv3trxnSRodfQ=;
	b=umxqk/r1hXk9AKS9STvwXsOaV0vTys+UCtKw38MP9K259dESIp0GPVqShVYLZ9PD6AX
	F1V3gOPsw+YBwWnvR45fO0TvgigcwCLUn896qhDT2r4rzOzojZg6kSEwwL8GkJWG3luOE
	ee5JSFYMcslm13Jxhe7OyasUp/RSIEX+zFY=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (klopstock mo29) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id u063dcn9L8w5oc
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:39 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 0494C1863C
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:38 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 713701a53968823b8122f5a2a15b5e053143f2ed
Message-Id: <713701a53968823b8122.1319189507@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:47 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 13 of 15] xenpaging: retry unpageable gfns
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319189129 -7200
# Node ID 713701a53968823b8122f5a2a15b5e053143f2ed
# Parent  2a4c2be433b27cec227ef8441937b2088d2ec24b
xenpaging: retry unpageable gfns

Nomination of gfns can fail, but may succeed later.
Thats the case for a guest that starts ballooned.

v2:
 - print debug when clearing uncosumed happens

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 2a4c2be433b2 -r 713701a53968 tools/xenpaging/policy_default.c
--- a/tools/xenpaging/policy_default.c
+++ b/tools/xenpaging/policy_default.c
@@ -32,6 +32,7 @@ static unsigned int i_mru;
 static unsigned int mru_size;
 static unsigned long *bitmap;
 static unsigned long *unconsumed;
+static unsigned int unconsumed_cleared;
 static unsigned long current_gfn;
 static unsigned long max_pages;
 
@@ -87,8 +88,21 @@ int policy_choose_victim(xenpaging_t *pa
         current_gfn++;
         if ( current_gfn >= max_pages )
             current_gfn = 0;
+        /* Could not nominate any gfn */
         if ( wrap == current_gfn )
         {
+            /* Count wrap arounds */
+            unconsumed_cleared++;
+            /* Force retry every few seconds (depends on poll() timeout) */
+            if ( unconsumed_cleared > 123)
+            {
+                /* Force retry of unconsumed gfns */
+                bitmap_clear(unconsumed, max_pages);
+                unconsumed_cleared = 0;
+                DPRINTF("clearing unconsumed, wrap %lx", wrap);
+                /* One more round before returning ENOSPC */
+                continue;
+            }
             victim->gfn = INVALID_MFN;
             return -ENOSPC;
         }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:34:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02: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 1RHBUb-00033M-Hc; Fri, 21 Oct 2011 02:34:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBS7-0001xb-8r
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:47 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319189504!30129931!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30974 invoked from network); 21 Oct 2011 09:31:44 -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; 21 Oct 2011 09:31:44 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189503; l=849;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=+oMV/h2Ppd5sS0dfZYWaMhqHjOs=;
	b=XRv/Jh34SATwCrhpnAl1k82FTviAgytkD1FVB5wM8yzPRWOucq+Rn9k2tuj+S75FyIf
	X8WId2qYWQXbyARdOznAhr9ucXCNPJjQvUKqEXTNuITSi943RLkmYUV0AwvdCs4YuSu0q
	vui+jPzEYq7nEw+2en5oUZpgLc2yQIvoA6E=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (cohen mo59) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id g06f7cn9L7fQNa
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:38 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 2CA3718639
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:38 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 2b3dee863a39538071200443ca03609a49ca663b
Message-Id: <2b3dee863a3953807120.1319189508@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:48 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 14 of 15] xenpaging: install into LIBEXEC dir
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319189132 -7200
# Node ID 2b3dee863a39538071200443ca03609a49ca663b
# Parent  713701a53968823b8122f5a2a15b5e053143f2ed
xenpaging: install into LIBEXEC dir

In preparation of upcoming libxl integration,
move xenpaging binary from /usr/sbin/ to /usr/lib/xen/bin/

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 713701a53968 -r 2b3dee863a39 tools/xenpaging/Makefile
--- a/tools/xenpaging/Makefile
+++ b/tools/xenpaging/Makefile
@@ -24,8 +24,8 @@ xenpaging: $(OBJS)
 
 install: all
 	$(INSTALL_DIR) $(DESTDIR)/var/lib/xen/xenpaging
-	$(INSTALL_DIR) $(DESTDIR)$(SBINDIR)
-	$(INSTALL_PROG) $(IBINS) $(DESTDIR)$(SBINDIR)
+	$(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)
+	$(INSTALL_PROG) $(IBINS) $(DESTDIR)$(LIBEXEC)
 
 clean:
 	rm -f *.o *~ $(DEPS) xen TAGS $(IBINS) $(LIB)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:35:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:35:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBVd-0003Qw-8u; Fri, 21 Oct 2011 02:35:25 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBS9-0001y8-D5
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:49 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319189505!246114!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12164 invoked from network); 21 Oct 2011 09:31:46 -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 DES-CBC3-SHA encrypted SMTP;
	21 Oct 2011 09:31:46 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189505; l=580;
	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=o3VQOcUUyBgGCl4NxL0LwMcssnw=;
	b=okcumZIhPgCKG/OGD6JhrftoWUFb/byHSEaBAsZlzhX+DqWs5UFKBMBwD7A2hmDI0Ts
	EBjRxDQGI6JJu/Erp/DAmBEwQyaYESIOr9l5pbnCi4cfE6dB8O/RPlzTakxY8yIUWhqw9
	jl5zEKrVm2VFytdg1EKxkRl0AAzIX+66fJw=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (fruni mo64) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id t03fe0n9L8pKwV
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:35 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id BAB2618636
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:34 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:34 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 00 of 15] tools/xenpaging fixes for xen-unstable
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 changes contains non-controversial changes from the series of
changes for xenpaging I sent out on 2011-10-03.

Please review and apply.

Olaf


 Config.mk                        |    2 
 config/StdGNU.mk                 |    2 
 tools/libxc/xc_bitops.h          |    6 +
 tools/libxl/libxl.h              |    1 
 tools/libxl/libxl_paths.c        |    5 
 tools/xenpaging/Makefile         |    6 -
 tools/xenpaging/file_ops.c       |   30 +----
 tools/xenpaging/policy_default.c |   23 +++
 tools/xenpaging/xenpaging.c      |  232 ++++++++++++++++++++++-----------------
 tools/xenpaging/xenpaging.h      |    5 
 10 files changed, 180 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 Fri Oct 21 02:36:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:36:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBWY-0003qQ-JG; Fri, 21 Oct 2011 02:36:22 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBS9-0001yB-Il
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:49 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-10.tower-216.messagelabs.com!1319189505!405284!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23230 invoked from network); 21 Oct 2011 09:31:46 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-10.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 21 Oct 2011 09:31:46 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189505; l=1830;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=Y1nLEFUU6/P9Y4nAvN1QMPSMBBs=;
	b=bylNif2WwtiT2BysBP2T/KxM1WjH9nVdTn/3zX9rMM4LyT3mvgczMbNPAiJDUzMVybO
	Qa9J671JItrg0KltbIjJhzAvrcwMOR/2TlORi+pGs+lkOSFn2sp9dfJ0iMjB41WJH5ERN
	6Ppf9H72eRz6ExNcS0AuSJvd5Gfme/VcZp8=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (jimi mo54) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id N027b9n9L8cslW
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:37 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id C5ABC1863A
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:35 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 71002bff018b95da0db016e18c3a3145cc83fc77
Message-Id: <71002bff018b95da0db0.1319189498@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:38 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 04 of 15] xenpaging: simplify file_op
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319188795 -7200
# Node ID 71002bff018b95da0db016e18c3a3145cc83fc77
# Parent  e51e5e2a835157df92faf3038abc457714d5e096
xenpaging: simplify file_op

Use -1 as return value and let caller read errno.
Remove const casts from buffer pointers, the page is writeable.
Use wrapper for write() which matches the read() prototype.
Remove unused stdarg.h inclusion.
Remove unused macro.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r e51e5e2a8351 -r 71002bff018b tools/xenpaging/file_ops.c
--- a/tools/xenpaging/file_ops.c
+++ b/tools/xenpaging/file_ops.c
@@ -21,55 +21,44 @@
 
 
 #include <unistd.h>
-#include <stdarg.h>
 #include <xc_private.h>
 
-
-#define page_offset(_pfn)     (((off_t)(_pfn)) << PAGE_SHIFT)
-
-
 static int file_op(int fd, void *page, int i,
-                   ssize_t (*fn)(int, const void *, size_t))
+                   ssize_t (*fn)(int, void *, size_t))
 {
     off_t seek_ret;
-    int total;
+    int total = 0;
     int bytes;
-    int ret;
 
     seek_ret = lseek(fd, i << PAGE_SHIFT, SEEK_SET);
+    if ( seek_ret == (off_t)-1 )
+        return -1;
 
-    total = 0;
     while ( total < PAGE_SIZE )
     {
         bytes = fn(fd, page + total, PAGE_SIZE - total);
         if ( bytes <= 0 )
-        {
-            ret = -errno;
-            goto err;
-        }
+            return -1;
 
         total += bytes;
     }
 
     return 0;
-
- err:
-    return ret;
 }
 
-static ssize_t my_read(int fd, const void *buf, size_t count)
+static ssize_t my_write(int fd, void *buf, size_t count)
 {
-    return read(fd, (void *)buf, count);
+    return write(fd, buf, count);
 }
 
 int read_page(int fd, void *page, int i)
 {
-    return file_op(fd, page, i, &my_read);
+    return file_op(fd, page, i, &read);
 }
 
 int write_page(int fd, void *page, int i)
 {
-    return file_op(fd, page, i, &write);
+    return file_op(fd, page, i, &my_write);
 }
 
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:37:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02: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 1RHBXR-0004Dk-H5; Fri, 21 Oct 2011 02:37:17 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBSB-0001yR-1l
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:51 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-21.messagelabs.com!1319189507!1103348!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8980 invoked from network); 21 Oct 2011 09:31:48 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-2.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2011 09:31:48 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189507; l=1499;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=C6Wh7N/YvyvwktWD3lOC/KgRmhw=;
	b=ceJ0EsN86/LkqvEpe8GbUvgWy9bVUcWSA9FcjEr1R66d9K45/bMQmciHSn9368GM0rm
	MktSRK+NOUBkNotRUk1KAumSls3zZ3/lCtOpSUmQyI4hjThuNf4ScHWdsv1QwU57EP0Ju
	Y+s9PVHEYH61jvcfubTuPWFE7xcXISlThO4=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (jimi mo63) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id 202b72n9L8mByl
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:38 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id AD31D18639
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:36 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 75e0b7374cbda66c91ab910103adcb1088a867e4
Message-Id: <75e0b7374cbda66c91ab.1319189502@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:42 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 08 of 15] xenpaging: track the number of
	paged-out 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

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# Date 1319188945 -7200
# Node ID 75e0b7374cbda66c91ab910103adcb1088a867e4
# Parent  8ab7b6fc34334faf5900e26cf3fcece33dc38337
xenpaging: track the number of paged-out pages

This change is required by subsequent changes.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 8ab7b6fc3433 -r 75e0b7374cbd tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -467,6 +467,9 @@ static int xenpaging_evict_page(xenpagin
     /* Notify policy of page being paged out */
     policy_notify_paged_out(victim->gfn);
 
+    /* Record number of evicted pages */
+    paging->num_paged_out++;
+
  out:
     return ret;
 }
@@ -480,8 +483,13 @@ static int xenpaging_resume_page(xenpagi
 
     /* Notify policy of page being paged in */
     if ( notify_policy )
+    {
         policy_notify_paged_in(rsp->gfn);
 
+       /* Record number of resumed pages */
+       paging->num_paged_out--;
+    }
+
     /* Tell Xen page is ready */
     ret = xc_mem_paging_resume(paging->xc_handle, paging->mem_event.domain_id,
                                rsp->gfn);
diff -r 8ab7b6fc3433 -r 75e0b7374cbd tools/xenpaging/xenpaging.h
--- a/tools/xenpaging/xenpaging.h
+++ b/tools/xenpaging/xenpaging.h
@@ -49,6 +49,7 @@ typedef struct xenpaging {
     mem_event_t mem_event;
     /* number of pages for which data structures were allocated */
     int max_pages;
+    int num_paged_out;
     int num_pages;
     int policy_mru_size;
     unsigned long pagein_queue[XENPAGING_PAGEIN_QUEUE_SIZE];

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:38:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:38:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBYN-0004bb-Rm; Fri, 21 Oct 2011 02:38:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBSB-0001yY-C3
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:52 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319189507!30121306!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22435 invoked from network); 21 Oct 2011 09:31:48 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-3.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2011 09:31:48 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189507; l=821;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=QXkzdob7j1ctQwqFdYnJ3cT4poQ=;
	b=NeW++eZJo5Kk8aXzyVNfRoYxP2GcXML0ctv5RHXNG4e4MWpA/juxZAxIMOyq8GJuMWt
	eAP0rj7F9gIxT3J6KrY/TWWL5sYc/GeAZBhNHyguvS7k0ixeXa2uiR5OuIHUGx4dAd0pu
	TFmba09apkloe1YrhOKXL4T8H7OtKJ10LHs=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (cohen mo8) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id f0725fn9L8qDdm
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:36 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 6988A18638
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:35 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 8e680d6bc0413942dcb97d708aec381da0b6fd69
Message-Id: <8e680d6bc0413942dcb9.1319189496@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:36 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 02 of 15] xenpaging: remove obsolete comment in
	resume 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 Olaf Hering <olaf@aepfle.de>
# Date 1319188602 -7200
# Node ID 8e680d6bc0413942dcb97d708aec381da0b6fd69
# Parent  c59f8ec51fff75eeef896752e154cd6f9ea1685d
xenpaging: remove obsolete comment in resume path

Remove stale comment.
If a page was populated several times the vcpu is paused and
xenpaging has to unpause it again.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r c59f8ec51fff -r 8e680d6bc041 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -744,7 +744,6 @@ int main(int argc, char *argv[])
                         !!(req.flags & MEM_EVENT_FLAG_EVICT_FAIL) );
 
                 /* Tell Xen to resume the vcpu */
-                /* XXX: Maybe just check if the vcpu was paused? */
                 if ( req.flags & MEM_EVENT_FLAG_VCPU_PAUSED )
                 {
                     /* Prepare the response */

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:39:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:39:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBZJ-0004zH-O6; Fri, 21 Oct 2011 02:39:13 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBSD-0001zI-5H
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:53 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319189509!1851089!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27898 invoked from network); 21 Oct 2011 09:31:50 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-2.tower-216.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 21 Oct 2011 09:31:50 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189509; l=1256;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=dn0WpBKZakoIN82gxBFJJT2U5HM=;
	b=Zl1BZ7UbhSI9I41f7m+NBfhvuZOetqP3xAKsRHXcZ/xMmUNefviDg6lJDFR0jEjOoFU
	qdujr5M6gqKAc6fKfvtvXkARwcVdRHeFMJ820zfoBAShOMgR9oE23vhz1ge4JKQrrwRhG
	NZWYPXeZULC1pE/DQkk5IXQb0XozKNhPWTQ=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (klopstock mo47) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id K069c5n9L8H3f9
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:35 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 3B32B18637
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:35 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c59f8ec51fff75eeef896752e154cd6f9ea1685d
Message-Id: <c59f8ec51fff75eeef89.1319189495@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:35 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 01 of 15] xenpaging: remove filename from comment
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319188557 -7200
# Node ID c59f8ec51fff75eeef896752e154cd6f9ea1685d
# Parent  6c583d35d76dda2236c81d9437ff9d57ab02c006
xenpaging: remove filename from comment

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 6c583d35d76d -r c59f8ec51fff tools/xenpaging/file_ops.c
--- a/tools/xenpaging/file_ops.c
+++ b/tools/xenpaging/file_ops.c
@@ -1,5 +1,4 @@
 /******************************************************************************
- * tools/xenpaging/file_ops.c
  *
  * Common file operations.
  *
diff -r 6c583d35d76d -r c59f8ec51fff tools/xenpaging/policy_default.c
--- a/tools/xenpaging/policy_default.c
+++ b/tools/xenpaging/policy_default.c
@@ -1,5 +1,4 @@
 /******************************************************************************
- * tools/xenpaging/policy.c
  *
  * Xen domain paging default policy.
  *
diff -r 6c583d35d76d -r c59f8ec51fff tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -1,5 +1,4 @@
 /******************************************************************************
- * tools/xenpaging/xenpaging.c
  *
  * Domain paging. 
  * Copyright (c) 2009 by Citrix Systems, Inc. (Patrick Colp)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:40:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02: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 1RHBaI-0005Mp-ME; Fri, 21 Oct 2011 02:40:14 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBSE-0001zY-7S
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:54 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319189510!248489!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15718 invoked from network); 21 Oct 2011 09:31:51 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-3.tower-182.messagelabs.com with DES-CBC3-SHA encrypted SMTP;
	21 Oct 2011 09:31:51 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189510; l=3990;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=iYidVPGGSX08JzPtBiMnkGfSZhU=;
	b=ADOVWzuwhWoae2JvyduvNfg0gNOv526HiSjwwLn62nDsJFS7tsIbzS7M//fdatdpnHb
	TdpCZZleoGll48WIla5+2Kj4I8QNPk0/g7ShHHtQtUAWjDanE+RuHeu6s+HuhqMzLJ72O
	35pOmgYcbu42kE43hTMU7zXIieOs5CJ7I38=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (fruni mo38) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id j03504n9L8mqLI
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:37 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 86F1B18638
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:36 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 8ab7b6fc34334faf5900e26cf3fcece33dc38337
Message-Id: <8ab7b6fc34334faf5900.1319189501@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:41 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 07 of 15] xenpaging: remove xc_dominfo_t from
	paging_t
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319188936 -7200
# Node ID 8ab7b6fc34334faf5900e26cf3fcece33dc38337
# Parent  04de2e7001dd59e66a1ebed830df5813198a1543
xenpaging: remove xc_dominfo_t from paging_t

Remove xc_dominfo_t from paging_t, record only max_pages.
This value is used to setup internal data structures.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 04de2e7001dd -r 8ab7b6fc3433 tools/xenpaging/policy_default.c
--- a/tools/xenpaging/policy_default.c
+++ b/tools/xenpaging/policy_default.c
@@ -41,17 +41,17 @@ int policy_init(xenpaging_t *paging)
     int i;
     int rc = -ENOMEM;
 
+    max_pages = paging->max_pages;
+
     /* Allocate bitmap for pages not to page out */
-    bitmap = bitmap_alloc(paging->domain_info->max_pages);
+    bitmap = bitmap_alloc(max_pages);
     if ( !bitmap )
         goto out;
     /* Allocate bitmap to track unusable pages */
-    unconsumed = bitmap_alloc(paging->domain_info->max_pages);
+    unconsumed = bitmap_alloc(max_pages);
     if ( !unconsumed )
         goto out;
 
-    max_pages = paging->domain_info->max_pages;
-
     /* Initialise MRU list of paged in pages */
     if ( paging->policy_mru_size > 0 )
         mru_size = paging->policy_mru_size;
diff -r 04de2e7001dd -r 8ab7b6fc3433 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -164,6 +164,7 @@ static void *init_page(void)
 static xenpaging_t *xenpaging_init(domid_t domain_id, int num_pages)
 {
     xenpaging_t *paging;
+    xc_domaininfo_t domain_info;
     xc_interface *xch;
     xentoollog_logger *dbg = NULL;
     char *p;
@@ -275,34 +276,29 @@ static xenpaging_t *xenpaging_init(domid
 
     paging->mem_event.port = rc;
 
-    /* Get domaininfo */
-    paging->domain_info = malloc(sizeof(xc_domaininfo_t));
-    if ( paging->domain_info == NULL )
-    {
-        PERROR("Error allocating memory for domain info");
-        goto err;
-    }
-
     rc = xc_domain_getinfolist(xch, paging->mem_event.domain_id, 1,
-                               paging->domain_info);
+                               &domain_info);
     if ( rc != 1 )
     {
         PERROR("Error getting domain info");
         goto err;
     }
 
+    /* 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->domain_info->max_pages);
+    paging->bitmap = bitmap_alloc(paging->max_pages);
     if ( !paging->bitmap )
     {
         PERROR("Error allocating bitmap");
         goto err;
     }
-    DPRINTF("max_pages = %"PRIx64"\n", paging->domain_info->max_pages);
+    DPRINTF("max_pages = %d\n", paging->max_pages);
 
-    if ( num_pages < 0 || num_pages > paging->domain_info->max_pages )
+    if ( num_pages < 0 || num_pages > paging->max_pages )
     {
-        num_pages = paging->domain_info->max_pages;
+        num_pages = paging->max_pages;
         DPRINTF("setting num_pages to %d\n", num_pages);
     }
     paging->num_pages = num_pages;
@@ -337,7 +333,6 @@ static xenpaging_t *xenpaging_init(domid
         }
 
         free(paging->bitmap);
-        free(paging->domain_info);
         free(paging);
     }
 
@@ -765,7 +760,7 @@ int main(int argc, char *argv[])
         if ( interrupted == SIGTERM || interrupted == SIGINT )
         {
             int num = 0;
-            for ( i = 0; i < paging->domain_info->max_pages; i++ )
+            for ( i = 0; i < paging->max_pages; i++ )
             {
                 if ( test_bit(i, paging->bitmap) )
                 {
@@ -781,7 +776,7 @@ int main(int argc, char *argv[])
              */
             if ( num )
                 page_in_trigger();
-            else if ( i == paging->domain_info->max_pages )
+            else if ( i == paging->max_pages )
                 break;
         }
         else
diff -r 04de2e7001dd -r 8ab7b6fc3433 tools/xenpaging/xenpaging.h
--- a/tools/xenpaging/xenpaging.h
+++ b/tools/xenpaging/xenpaging.h
@@ -44,11 +44,11 @@ typedef struct xenpaging {
     xc_interface *xc_handle;
     struct xs_handle *xs_handle;
 
-    xc_domaininfo_t    *domain_info;
-
     unsigned long *bitmap;
 
     mem_event_t mem_event;
+    /* number of pages for which data structures were allocated */
+    int max_pages;
     int num_pages;
     int policy_mru_size;
     unsigned long pagein_queue[XENPAGING_PAGEIN_QUEUE_SIZE];

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:41:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02: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 1RHBb5-0005kZ-OO; Fri, 21 Oct 2011 02:41:03 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBSE-0001zg-Q6
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:55 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319189499!51971088!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14737 invoked from network); 21 Oct 2011 09:31:40 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-15.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 21 Oct 2011 09:31:40 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189511; l=2315;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=XFRjoybls/UDHbKgEPbndC241ro=;
	b=i1g7SVCGrOz27ECmAs9hChga6wL1enltTwVFMWHIImpz2DGAsnsAjqvVn1WJkigu1bx
	TN3knUVtqNhNNpoYBFOcL46pSp21xdEi9sYuomKZ2wAT+LmVjWpmUN0jVDNG//0y/UFUt
	nDrsh8uCkdG6r1hXI8eMo4H+PazqFLgPWr0=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (fruni mo27) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id k0307en9L7fT7g
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:38 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 5038A18636
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:38 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: d3d27b9334496ff1f7ced83e1efa3f3a354e5998
Message-Id: <d3d27b9334496ff1f7ce.1319189509@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:49 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 15 of 15] xenpaging: add XEN_PAGING_DIR /
 libxl_xenpaging_dir_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 Olaf Hering <olaf@aepfle.de>
# Date 1319189153 -7200
# Node ID d3d27b9334496ff1f7ced83e1efa3f3a354e5998
# Parent  2b3dee863a39538071200443ca03609a49ca663b
xenpaging: add XEN_PAGING_DIR / libxl_xenpaging_dir_path()

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 2b3dee863a39 -r d3d27b933449 Config.mk
--- a/Config.mk
+++ b/Config.mk
@@ -142,7 +142,7 @@ define buildmakevars2file-closure
 	$(foreach var,                                                      \
 	          SBINDIR BINDIR LIBEXEC LIBDIR SHAREDIR PRIVATE_BINDIR     \
 	          XENFIRMWAREDIR XEN_CONFIG_DIR XEN_SCRIPT_DIR XEN_LOCK_DIR \
-	          XEN_RUN_DIR,                                              \
+	          XEN_RUN_DIR XEN_PAGING_DIR,                               \
 	          echo "$(var)=\"$($(var))\"" >>$(1).tmp;)        \
 	$(call move-if-changed,$(1).tmp,$(1))
 endef
diff -r 2b3dee863a39 -r d3d27b933449 config/StdGNU.mk
--- a/config/StdGNU.mk
+++ b/config/StdGNU.mk
@@ -53,10 +53,12 @@ ifeq ($(PREFIX),/usr)
 CONFIG_DIR = /etc
 XEN_LOCK_DIR = /var/lock
 XEN_RUN_DIR = /var/run/xen
+XEN_PAGING_DIR = /var/lib/xen/xenpaging
 else
 CONFIG_DIR = $(PREFIX)/etc
 XEN_LOCK_DIR = $(PREFIX)/var/lock
 XEN_RUN_DIR = $(PREFIX)/var/run/xen
+XEN_PAGING_DIR = $(PREFIX)/var/lib/xen/xenpaging
 endif
 
 SYSCONFIG_DIR = $(CONFIG_DIR)/$(CONFIG_LEAF_DIR)
diff -r 2b3dee863a39 -r d3d27b933449 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -538,6 +538,7 @@ const char *libxl_xen_config_dir_path(vo
 const char *libxl_xen_script_dir_path(void);
 const char *libxl_lock_dir_path(void);
 const char *libxl_run_dir_path(void);
+const char *libxl_xenpaging_dir_path(void);
 
 #endif /* LIBXL_H */
 
diff -r 2b3dee863a39 -r d3d27b933449 tools/libxl/libxl_paths.c
--- a/tools/libxl/libxl_paths.c
+++ b/tools/libxl/libxl_paths.c
@@ -70,6 +70,11 @@ const char *libxl_run_dir_path(void)
     return XEN_RUN_DIR;
 }
 
+const char *libxl_xenpaging_dir_path(void)
+{
+    return XEN_PAGING_DIR;
+}
+
 /*
  * Local variables:
  * mode: C
diff -r 2b3dee863a39 -r d3d27b933449 tools/xenpaging/Makefile
--- a/tools/xenpaging/Makefile
+++ b/tools/xenpaging/Makefile
@@ -23,7 +23,7 @@ xenpaging: $(OBJS)
 	$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
 
 install: all
-	$(INSTALL_DIR) $(DESTDIR)/var/lib/xen/xenpaging
+	$(INSTALL_DIR) $(DESTDIR)$(XEN_PAGING_DIR)
 	$(INSTALL_DIR) $(DESTDIR)$(LIBEXEC)
 	$(INSTALL_PROG) $(IBINS) $(DESTDIR)$(LIBEXEC)
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:42:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:42:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBcA-0006ET-0W; Fri, 21 Oct 2011 02:42:10 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBSF-000201-5Z
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:55 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-4.tower-182.messagelabs.com!1319189511!248786!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31754 invoked from network); 21 Oct 2011 09:31:52 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-4.tower-182.messagelabs.com with DES-CBC3-SHA encrypted SMTP;
	21 Oct 2011 09:31:52 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189511; l=4562;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=Fq6SoZF2+aYk22+47H1tbmi/T/8=;
	b=k1AXjztUJLaaI+ACd3kof0+6q/N7hN61IUYcOOtVHhENlyiCkzF25iKNmbkS1OVKWwg
	TpfRLM5/sjXKZUFjSPfnaMYCqJUgS86d/AyokxJnuBthLjVo4Q3kb6q7Q1iIaANhg4P4a
	uU/JSVbWs+O4ZyY1HNm94nT+3QTRkhZQCws=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (fruni mo41) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id i0366an9L8r5K4
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:38 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id E58CA1863B
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:36 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 6eb58c8bee87080c5e683a7b118aed7b87d675db
Message-Id: <6eb58c8bee87080c5e68.1319189503@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:43 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 09 of 15] xenpaging: move page add/resume loops
 into its own 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 Olaf Hering <olaf@aepfle.de>
# Date 1319189007 -7200
# Node ID 6eb58c8bee87080c5e683a7b118aed7b87d675db
# Parent  75e0b7374cbda66c91ab910103adcb1088a867e4
xenpaging: move page add/resume loops into its own function.

Move page resume loop into its own function.
Move page eviction loop into its own function.
Allocate all possible slots in a paging file to allow growing and
shrinking of the number of paged-out pages. Adjust other places to
iterate over all slots.

This change is required by subsequent patches.

v2:
 - check if victims allocation succeeded

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 75e0b7374cbd -r 6eb58c8bee87 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -553,6 +553,27 @@ static int xenpaging_populate_page(xenpa
     return ret;
 }
 
+/* Trigger a page-in for a batch of pages */
+static void resume_pages(xenpaging_t *paging, int num_pages)
+{
+    xc_interface *xch = paging->xc_handle;
+    int i, num = 0;
+
+    for ( i = 0; i < paging->max_pages && num < num_pages; i++ )
+    {
+        if ( test_bit(i, paging->bitmap) )
+        {
+            paging->pagein_queue[num] = i;
+            num++;
+            if ( num == XENPAGING_PAGEIN_QUEUE_SIZE )
+                break;
+        }
+    }
+    /* num may be less than num_pages, caller has to try again */
+    if ( num )
+        page_in_trigger();
+}
+
 static int evict_victim(xenpaging_t *paging,
                         xenpaging_victim_t *victim, int fd, int i)
 {
@@ -596,6 +617,30 @@ static int evict_victim(xenpaging_t *pag
     return ret;
 }
 
+/* Evict a batch of pages and write them to a free slot in the paging file */
+static int evict_pages(xenpaging_t *paging, int fd, xenpaging_victim_t *victims, int num_pages)
+{
+    xc_interface *xch = paging->xc_handle;
+    int rc, slot, num = 0;
+
+    for ( slot = 0; slot < paging->max_pages && num < num_pages; slot++ )
+    {
+        /* Slot is allocated */
+        if ( victims[slot].gfn != INVALID_MFN )
+            continue;
+
+        rc = evict_victim(paging, &victims[slot], fd, slot);
+        if ( rc == -ENOSPC )
+            break;
+        if ( rc == -EINTR )
+            break;
+        if ( num && num % 100 == 0 )
+            DPRINTF("%d pages evicted\n", num);
+        num++;
+    }
+    return num;
+}
+
 int main(int argc, char *argv[])
 {
     struct sigaction act;
@@ -638,7 +683,14 @@ int main(int argc, char *argv[])
         return 2;
     }
 
-    victims = calloc(paging->num_pages, sizeof(xenpaging_victim_t));
+    /* Allocate upper limit of pages to allow growing and shrinking */
+    victims = calloc(paging->max_pages, sizeof(xenpaging_victim_t));
+    if ( !victims )
+        goto out;
+
+    /* Mark all slots as unallocated */
+    for ( i = 0; i < paging->max_pages; i++ )
+        victims[i].gfn = INVALID_MFN;
 
     /* ensure that if we get a signal, we'll do cleanup, then exit */
     act.sa_handler = close_handler;
@@ -652,18 +704,7 @@ int main(int argc, char *argv[])
     /* listen for page-in events to stop pager */
     create_page_in_thread(paging);
 
-    /* Evict pages */
-    for ( i = 0; i < paging->num_pages; i++ )
-    {
-        rc = evict_victim(paging, &victims[i], fd, i);
-        if ( rc == -ENOSPC )
-            break;
-        if ( rc == -EINTR )
-            break;
-        if ( i % 100 == 0 )
-            DPRINTF("%d pages evicted\n", i);
-    }
-
+    i = evict_pages(paging, fd, victims, paging->num_pages);
     DPRINTF("%d pages evicted. Done.\n", i);
 
     /* Swap pages in and out */
@@ -689,13 +730,13 @@ int main(int argc, char *argv[])
             if ( test_and_clear_bit(req.gfn, paging->bitmap) )
             {
                 /* Find where in the paging file to read from */
-                for ( i = 0; i < paging->num_pages; i++ )
+                for ( i = 0; i < paging->max_pages; i++ )
                 {
                     if ( victims[i].gfn == req.gfn )
                         break;
                 }
     
-                if ( i >= paging->num_pages )
+                if ( i >= paging->max_pages )
                 {
                     DPRINTF("Couldn't find page %"PRIx64"\n", req.gfn);
                     goto out;
@@ -767,25 +808,12 @@ int main(int argc, char *argv[])
         /* Write all pages back into the guest */
         if ( interrupted == SIGTERM || interrupted == SIGINT )
         {
-            int num = 0;
-            for ( i = 0; i < paging->max_pages; i++ )
-            {
-                if ( test_bit(i, paging->bitmap) )
-                {
-                    paging->pagein_queue[num] = i;
-                    num++;
-                    if ( num == XENPAGING_PAGEIN_QUEUE_SIZE )
-                        break;
-                }
-            }
-            /*
-             * One more round if there are still pages to process.
-             * If no more pages to process, exit loop.
-             */
-            if ( num )
-                page_in_trigger();
-            else if ( i == paging->max_pages )
+            /* If no more pages to process, exit loop. */
+            if ( !paging->num_paged_out )
                 break;
+            
+            /* One more round if there are still pages to process. */
+            resume_pages(paging, paging->num_paged_out);
         }
         else
         {

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:43:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:43:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBcy-0006bK-To; Fri, 21 Oct 2011 02:43:00 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBSG-00020W-SM
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:57 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-11.tower-174.messagelabs.com!1319189513!36153008!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19686 invoked from network); 21 Oct 2011 09:31:53 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-11.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 21 Oct 2011 09:31:53 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189513; l=1916;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=jydJzRj8tEZsxVPKBBF0gjU/RTg=;
	b=y1QRinC0HlzIHxUCer6MmwXRjS/WZaai66r5FHO+AYfeJhrvt6TRln2HOvr7A1jwOg+
	jXcfrhNhKjIJWpgij/dzRmHF1zcl7aOxNSDOh4Tv3OPNOsdNmi0ClFelbXfh30KQl9UP8
	FgGUqas1JOpVyQLL4QB4et6aEDo7M0LmBN0=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (klopstock mo25) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 2062c5n9L8W7y9
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:37 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 40E1A18637
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:36 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 04de2e7001dd59e66a1ebed830df5813198a1543
Message-Id: <04de2e7001dd59e66a1e.1319189500@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:40 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 06 of 15] xenpaging: update xenpaging_init
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319188918 -7200
# Node ID 04de2e7001dd59e66a1ebed830df5813198a1543
# Parent  a58e98af3f0b9d92cbe4bbb523f8bbec33e2b358
xenpaging: update xenpaging_init

Move comment about xc_handle to the right place.
Allocate paging early and use calloc.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r a58e98af3f0b -r 04de2e7001dd tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -169,18 +169,21 @@ static xenpaging_t *xenpaging_init(domid
     char *p;
     int rc;
 
+    /* Allocate memory */
+    paging = calloc(1, sizeof(xenpaging_t));
+    if ( !paging )
+        goto err;
+
     if ( getenv("XENPAGING_DEBUG") )
         dbg = (xentoollog_logger *)xtl_createlogger_stdiostream(stderr, XTL_DEBUG, 0);
-    xch = xc_interface_open(dbg, NULL, 0);
+
+    /* Open connection to xen */
+    paging->xc_handle = xch = xc_interface_open(dbg, NULL, 0);
     if ( !xch )
-        goto err_iface;
+        goto err;
 
     DPRINTF("xenpaging init\n");
 
-    /* Allocate memory */
-    paging = malloc(sizeof(xenpaging_t));
-    memset(paging, 0, sizeof(xenpaging_t));
-
     /* Open connection to xenstore */
     paging->xs_handle = xs_open(0);
     if ( paging->xs_handle == NULL )
@@ -204,9 +207,6 @@ static xenpaging_t *xenpaging_init(domid
          DPRINTF("Setting policy mru_size to %d\n", paging->policy_mru_size);
     }
 
-    /* Open connection to xen */
-    paging->xc_handle = xch;
-
     /* Set domain id */
     paging->mem_event.domain_id = domain_id;
 
@@ -322,7 +322,8 @@ static xenpaging_t *xenpaging_init(domid
     {
         if ( paging->xs_handle )
             xs_close(paging->xs_handle);
-        xc_interface_close(xch);
+        if ( xch )
+            xc_interface_close(xch);
         if ( paging->mem_event.shared_page )
         {
             munlock(paging->mem_event.shared_page, PAGE_SIZE);
@@ -340,7 +341,6 @@ static xenpaging_t *xenpaging_init(domid
         free(paging);
     }
 
- err_iface: 
     return NULL;
 }
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:43:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:43:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBdr-00070R-52; Fri, 21 Oct 2011 02:43:55 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBSJ-00021D-0r
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:31:59 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-11.tower-216.messagelabs.com!1319189515!435781!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15559 invoked from network); 21 Oct 2011 09:31:56 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-11.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 21 Oct 2011 09:31:56 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189515; l=7451;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=cnSokqZKmR1bFG6rfCQe5/Dl5K4=;
	b=bMx8pz1j0KAdGDhACCKZ5qvNECZIVLdtczdtlCjP72cDDc4OmIJ9odrEP22D8btrczk
	Gnlo/ovBqnUDkG1ojC6TG8PrYqhnFjHckh4Pw9WSn6R9v8I0DePtRvL3c/9eHc0YgUdi9
	Zj/pUKJ7Fla7vrQrN16ybLtFtmyAFBjAdyY=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (cohen mo29) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id u06358n9L84kDW
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:36 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 92E4C18639
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:35 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: e51e5e2a835157df92faf3038abc457714d5e096
Message-Id: <e51e5e2a835157df92fa.1319189497@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:37 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 03 of 15] xenpaging: use PERROR to print errno
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319188767 -7200
# Node ID e51e5e2a835157df92faf3038abc457714d5e096
# Parent  8e680d6bc0413942dcb97d708aec381da0b6fd69
xenpaging: use PERROR to print errno

v3:
 - adjust arguments for xc_mem_paging_enable() failures

v2:
 - move changes to file_op() to different patch

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 8e680d6bc041 -r e51e5e2a8351 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -90,7 +90,7 @@ static int xenpaging_wait_for_event_or_t
         if (errno == EINTR)
             return 0;
 
-        ERROR("Poll exited with an error");
+        PERROR("Poll exited with an error");
         return -errno;
     }
 
@@ -121,7 +121,7 @@ static int xenpaging_wait_for_event_or_t
         port = xc_evtchn_pending(xce);
         if ( port == -1 )
         {
-            ERROR("Failed to read port from event channel");
+            PERROR("Failed to read port from event channel");
             rc = -1;
             goto err;
         }
@@ -129,7 +129,7 @@ static int xenpaging_wait_for_event_or_t
         rc = xc_evtchn_unmask(xce, port);
         if ( rc < 0 )
         {
-            ERROR("Failed to unmask event channel port");
+            PERROR("Failed to unmask event channel port");
         }
     }
 err:
@@ -185,7 +185,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->xs_handle = xs_open(0);
     if ( paging->xs_handle == NULL )
     {
-        ERROR("Error initialising xenstore connection");
+        PERROR("Error initialising xenstore connection");
         goto err;
     }
 
@@ -193,7 +193,7 @@ static xenpaging_t *xenpaging_init(domid
     snprintf(watch_token, sizeof(watch_token), "%u", domain_id);
     if ( xs_watch(paging->xs_handle, "@releaseDomain", watch_token) == false )
     {
-        ERROR("Could not bind to shutdown watch\n");
+        PERROR("Could not bind to shutdown watch\n");
         goto err;
     }
 
@@ -214,7 +214,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->mem_event.shared_page = init_page();
     if ( paging->mem_event.shared_page == NULL )
     {
-        ERROR("Error initialising shared page");
+        PERROR("Error initialising shared page");
         goto err;
     }
 
@@ -222,7 +222,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->mem_event.ring_page = init_page();
     if ( paging->mem_event.ring_page == NULL )
     {
-        ERROR("Error initialising ring page");
+        PERROR("Error initialising ring page");
         goto err;
     }
 
@@ -249,7 +249,7 @@ static xenpaging_t *xenpaging_init(domid
                 ERROR("xenpaging not supported in a PoD guest");
                 break;
             default:
-                ERROR("Error initialising shared page: %s", strerror(errno));
+                PERROR("Error initialising shared page");
                 break;
         }
         goto err;
@@ -259,7 +259,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->mem_event.xce_handle = xc_evtchn_open(NULL, 0);
     if ( paging->mem_event.xce_handle == NULL )
     {
-        ERROR("Failed to open event channel");
+        PERROR("Failed to open event channel");
         goto err;
     }
 
@@ -269,7 +269,7 @@ static xenpaging_t *xenpaging_init(domid
                                     paging->mem_event.shared_page->port);
     if ( rc < 0 )
     {
-        ERROR("Failed to bind event channel");
+        PERROR("Failed to bind event channel");
         goto err;
     }
 
@@ -279,7 +279,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->domain_info = malloc(sizeof(xc_domaininfo_t));
     if ( paging->domain_info == NULL )
     {
-        ERROR("Error allocating memory for domain info");
+        PERROR("Error allocating memory for domain info");
         goto err;
     }
 
@@ -287,7 +287,7 @@ static xenpaging_t *xenpaging_init(domid
                                paging->domain_info);
     if ( rc != 1 )
     {
-        ERROR("Error getting domain info");
+        PERROR("Error getting domain info");
         goto err;
     }
 
@@ -295,7 +295,7 @@ static xenpaging_t *xenpaging_init(domid
     paging->bitmap = bitmap_alloc(paging->domain_info->max_pages);
     if ( !paging->bitmap )
     {
-        ERROR("Error allocating bitmap");
+        PERROR("Error allocating bitmap");
         goto err;
     }
     DPRINTF("max_pages = %"PRIx64"\n", paging->domain_info->max_pages);
@@ -311,7 +311,7 @@ static xenpaging_t *xenpaging_init(domid
     rc = policy_init(paging);
     if ( rc != 0 )
     {
-        ERROR("Error initialising policy");
+        PERROR("Error initialising policy");
         goto err;
     }
 
@@ -358,14 +358,14 @@ static int xenpaging_teardown(xenpaging_
     rc = xc_mem_paging_disable(xch, paging->mem_event.domain_id);
     if ( rc != 0 )
     {
-        ERROR("Error tearing down domain paging in xen");
+        PERROR("Error tearing down domain paging in xen");
     }
 
     /* Unbind VIRQ */
     rc = xc_evtchn_unbind(paging->mem_event.xce_handle, paging->mem_event.port);
     if ( rc != 0 )
     {
-        ERROR("Error unbinding event port");
+        PERROR("Error unbinding event port");
     }
     paging->mem_event.port = -1;
 
@@ -373,7 +373,7 @@ static int xenpaging_teardown(xenpaging_
     rc = xc_evtchn_close(paging->mem_event.xce_handle);
     if ( rc != 0 )
     {
-        ERROR("Error closing event channel");
+        PERROR("Error closing event channel");
     }
     paging->mem_event.xce_handle = NULL;
     
@@ -384,7 +384,7 @@ static int xenpaging_teardown(xenpaging_
     rc = xc_interface_close(xch);
     if ( rc != 0 )
     {
-        ERROR("Error closing connection to xen");
+        PERROR("Error closing connection to xen");
     }
 
     return 0;
@@ -444,7 +444,7 @@ static int xenpaging_evict_page(xenpagin
                                 PROT_READ | PROT_WRITE, &gfn, 1);
     if ( page == NULL )
     {
-        ERROR("Error mapping page");
+        PERROR("Error mapping page");
         goto out;
     }
 
@@ -452,8 +452,8 @@ static int xenpaging_evict_page(xenpagin
     ret = write_page(fd, page, i);
     if ( ret != 0 )
     {
+        PERROR("Error copying page");
         munmap(page, PAGE_SIZE);
-        ERROR("Error copying page");
         goto out;
     }
 
@@ -464,7 +464,7 @@ static int xenpaging_evict_page(xenpagin
                               victim->gfn);
     if ( ret != 0 )
     {
-        ERROR("Error evicting page");
+        PERROR("Error evicting page");
         goto out;
     }
 
@@ -520,7 +520,7 @@ static int xenpaging_populate_page(xenpa
                 sleep(1);
                 continue;
             }
-            ERROR("Error preparing for page in");
+            PERROR("Error preparing for page in");
             goto out_map;
         }
     }
@@ -532,7 +532,7 @@ static int xenpaging_populate_page(xenpa
                                 PROT_READ | PROT_WRITE, &gfn, 1);
     if ( page == NULL )
     {
-        ERROR("Error mapping page: page is null");
+        PERROR("Error mapping page: page is null");
         goto out_map;
     }
 
@@ -540,7 +540,7 @@ static int xenpaging_populate_page(xenpa
     ret = read_page(fd, page, i);
     if ( ret != 0 )
     {
-        ERROR("Error reading page");
+        PERROR("Error reading page");
         goto out;
     }
 
@@ -579,7 +579,7 @@ static int evict_victim(xenpaging_t *pag
         {
             if ( j++ % 1000 == 0 )
                 if ( xenpaging_mem_paging_flush_ioemu_cache(paging) )
-                    ERROR("Error flushing ioemu cache");
+                    PERROR("Error flushing ioemu cache");
         }
     }
     while ( ret );
@@ -670,7 +670,7 @@ int main(int argc, char *argv[])
         rc = xenpaging_wait_for_event_or_timeout(paging);
         if ( rc < 0 )
         {
-            ERROR("Error getting event");
+            PERROR("Error getting event");
             goto out;
         }
         else if ( rc != 0 )
@@ -710,7 +710,7 @@ int main(int argc, char *argv[])
                     rc = xenpaging_populate_page(paging, req.gfn, fd, i);
                     if ( rc != 0 )
                     {
-                        ERROR("Error populating page");
+                        PERROR("Error populating page");
                         goto out;
                     }
                 }
@@ -723,7 +723,7 @@ int main(int argc, char *argv[])
                 rc = xenpaging_resume_page(paging, &rsp, 1);
                 if ( rc != 0 )
                 {
-                    ERROR("Error resuming page");
+                    PERROR("Error resuming page");
                     goto out;
                 }
 
@@ -754,7 +754,7 @@ int main(int argc, char *argv[])
                     rc = xenpaging_resume_page(paging, &rsp, 0);
                     if ( rc != 0 )
                     {
-                        ERROR("Error resuming");
+                        PERROR("Error resuming");
                         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 Oct 21 02:45:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:45:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBey-0007Td-L2; Fri, 21 Oct 2011 02:45:04 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBSK-00021n-5B
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:32:00 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319189516!246159!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12791 invoked from network); 21 Oct 2011 09:31:57 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-7.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	21 Oct 2011 09:31:57 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189516; l=2472;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=WUtlm7WTC3O9tyKWnX2WLu9mgMU=;
	b=tlYIRjaMV2l0UXO+3OlzUAEyw8moEN3AqrHctg8DfzXx9zmNRxC+B7QjDMZnfG9WM7M
	ZBkdAQ3a0f3kYhZ1S3IBs92OFAJSZlY6vXXo8s9Zs314Y7iOWwLRmWSJiER7G5PVhI2UO
	f7rz5lB5bC7XNyALRr9exJJncxZwrp48Cfc=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (jimi mo11) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id 001664n9L8ehVh
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:37 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 113EC18636
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:36 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a58e98af3f0b9d92cbe4bbb523f8bbec33e2b358
Message-Id: <a58e98af3f0b9d92cbe4.1319189499@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:39 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 05 of 15] xenpaging: print gfn in failure case
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319188898 -7200
# Node ID a58e98af3f0b9d92cbe4bbb523f8bbec33e2b358
# Parent  71002bff018b95da0db016e18c3a3145cc83fc77
xenpaging: print gfn in failure case

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 71002bff018b -r a58e98af3f0b tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -444,7 +444,7 @@ static int xenpaging_evict_page(xenpagin
                                 PROT_READ | PROT_WRITE, &gfn, 1);
     if ( page == NULL )
     {
-        PERROR("Error mapping page");
+        PERROR("Error mapping page %lx", victim->gfn);
         goto out;
     }
 
@@ -452,7 +452,7 @@ static int xenpaging_evict_page(xenpagin
     ret = write_page(fd, page, i);
     if ( ret != 0 )
     {
-        PERROR("Error copying page");
+        PERROR("Error copying page %lx", victim->gfn);
         munmap(page, PAGE_SIZE);
         goto out;
     }
@@ -464,7 +464,7 @@ static int xenpaging_evict_page(xenpagin
                               victim->gfn);
     if ( ret != 0 )
     {
-        PERROR("Error evicting page");
+        PERROR("Error evicting page %lx", victim->gfn);
         goto out;
     }
 
@@ -520,7 +520,7 @@ static int xenpaging_populate_page(xenpa
                 sleep(1);
                 continue;
             }
-            PERROR("Error preparing for page in");
+            PERROR("Error preparing %"PRI_xen_pfn" for page-in", gfn);
             goto out_map;
         }
     }
@@ -532,7 +532,7 @@ static int xenpaging_populate_page(xenpa
                                 PROT_READ | PROT_WRITE, &gfn, 1);
     if ( page == NULL )
     {
-        PERROR("Error mapping page: page is null");
+        PERROR("Error mapping page %"PRI_xen_pfn": page is null", gfn);
         goto out_map;
     }
 
@@ -540,7 +540,7 @@ static int xenpaging_populate_page(xenpa
     ret = read_page(fd, page, i);
     if ( ret != 0 )
     {
-        PERROR("Error reading page");
+        PERROR("Error reading page %"PRI_xen_pfn"", gfn);
         goto out;
     }
 
@@ -710,7 +710,7 @@ int main(int argc, char *argv[])
                     rc = xenpaging_populate_page(paging, req.gfn, fd, i);
                     if ( rc != 0 )
                     {
-                        PERROR("Error populating page");
+                        PERROR("Error populating page %"PRIx64"", req.gfn);
                         goto out;
                     }
                 }
@@ -723,7 +723,7 @@ int main(int argc, char *argv[])
                 rc = xenpaging_resume_page(paging, &rsp, 1);
                 if ( rc != 0 )
                 {
-                    PERROR("Error resuming page");
+                    PERROR("Error resuming page %"PRIx64"", req.gfn);
                     goto out;
                 }
 
@@ -754,7 +754,7 @@ int main(int argc, char *argv[])
                     rc = xenpaging_resume_page(paging, &rsp, 0);
                     if ( rc != 0 )
                     {
-                        PERROR("Error resuming");
+                        PERROR("Error resuming page %"PRIx64"", req.gfn);
                         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 Oct 21 02:46:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02: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 1RHBgc-0007yb-Bo; Fri, 21 Oct 2011 02:46:46 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBSN-00022p-DM
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:32:03 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319189519!1851123!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28743 invoked from network); 21 Oct 2011 09:32:00 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-2.tower-216.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 21 Oct 2011 09:32:00 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189519; l=982;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=NBpHa9tbSs0oQZBHTGiCbN4AdbI=;
	b=mS6PBZW7+XSdn2DI0foX54BWvbG9k6hWTt595QmJpYsptCz62PCY1ArW+sqYjiYcQft
	5HI745FTMP/fxigpOQu5qgb4X2a0EjywB55yLCS3mk65iyA5XuBuNlKll9AZQTb1yY1nW
	eJ60u4hnomO9YcnStB7xIdhGoGMKf7NWyPQ=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by post.strato.de (mrclete mo18) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id 501216n9L8X7VD
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:38 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id B9EDD18638
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:37 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 2a4c2be433b27cec227ef8441937b2088d2ec24b
Message-Id: <2a4c2be433b27cec227e.1319189506@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:46 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 12 of 15] libxc: add bitmap_clear 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 Olaf Hering <olaf@aepfle.de>
# Date 1319189046 -7200
# Node ID 2a4c2be433b27cec227ef8441937b2088d2ec24b
# Parent  1f9a27425952493878a54c82e0518b47560161af
libxc: add bitmap_clear function

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 1f9a27425952 -r 2a4c2be433b2 tools/libxc/xc_bitops.h
--- a/tools/libxc/xc_bitops.h
+++ b/tools/libxc/xc_bitops.h
@@ -4,6 +4,7 @@
 /* bitmap operations for single threaded access */
 
 #include <stdlib.h>
+#include <string.h>
 
 #define BITS_PER_LONG (sizeof(unsigned long) * 8)
 #define ORDER_LONG (sizeof(unsigned long) == 4 ? 5 : 6)
@@ -25,6 +26,11 @@ static inline unsigned long *bitmap_allo
     return calloc(1, bitmap_size(nr_bits));
 }
 
+static inline void bitmap_clear(unsigned long *addr, int nr_bits)
+{
+    memset(addr, 0, bitmap_size(nr_bits));
+}
+
 static inline int test_bit(int nr, volatile unsigned long *addr)
 {
     return (BITMAP_ENTRY(nr, addr) >> BITMAP_SHIFT(nr)) & 1;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:47:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:47:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBhj-0008MQ-0K; Fri, 21 Oct 2011 02:47:55 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHBSQ-00024i-NX
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 02:32:07 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319189518!511707!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21256 invoked from network); 21 Oct 2011 09:32:03 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-3.tower-216.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 21 Oct 2011 09:32:03 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319189518; l=1217;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=Daul00CjcWNo8LWBdtOgLAC0Ybo=;
	b=MrNE7ivMhDLLPgSeCXuSYZVHKOn1ZwUQaPx9asrBx6QHhX83Go/85c1dosfscWf0+vc
	CNFRIe0r173oMer6vq9y2DGyH2wJ1ajahPtSotOnp/QVpjhyuoi+WShCzw0LYYFqqB4zc
	wCtT/YXTi3LpH7GBM7YPxu6q8RZas7octTM=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFJiy0PFDoq
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-075-172.pools.arcor-ip.net [88.65.75.172])
	by smtp.strato.de (fruni mo12) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id N02af3n9L8KaDr
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:38 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 7F40318637
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 11:31:37 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1f9a27425952493878a54c82e0518b47560161af
Message-Id: <1f9a27425952493878a5.1319189505@probook.site>
In-Reply-To: <patchbomb.1319189494@probook.site>
References: <patchbomb.1319189494@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Fri, 21 Oct 2011 11:31:45 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 11 of 15] xenpaging: improve mainloop exit
	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 1319189039 -7200
# Node ID 1f9a27425952493878a54c82e0518b47560161af
# Parent  0b7d7a2bd6673f358faf0183b79b29e6a2f036a5
xenpaging: improve mainloop exit handling

Remove the if/else logic to exit from the in case a signal arrives.
Update comments.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 0b7d7a2bd667 -r 1f9a27425952 tools/xenpaging/xenpaging.c
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -806,7 +806,7 @@ int main(int argc, char *argv[])
             }
         }
 
-        /* Write all pages back into the guest */
+        /* If interrupted, write all pages back into the guest */
         if ( interrupted == SIGTERM || interrupted == SIGINT )
         {
             /* If no more pages to process, exit loop. */
@@ -815,13 +815,15 @@ int main(int argc, char *argv[])
             
             /* One more round if there are still pages to process. */
             resume_pages(paging, paging->num_paged_out);
+
+            /* Resume main loop */
+            continue;
         }
-        else
-        {
-            /* Exit on any other signal */
-            if ( interrupted )
-                break;
-        }
+
+        /* Exit main loop on any other signal */
+        if ( interrupted )
+            break;
+
     }
     DPRINTF("xenpaging got signal %d\n", interrupted);
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 02:50:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 02:50:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBkV-0000Lr-Pg; Fri, 21 Oct 2011 02:50:47 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHBjl-00008s-Es; Fri, 21 Oct 2011 02:50:02 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1319190598!254291!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 975 invoked from network); 21 Oct 2011 09:49:58 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	21 Oct 2011 09:49:58 -0000
Received: by wwf10 with SMTP id 10so4582311wwf.24
	for <multiple recipients>; Fri, 21 Oct 2011 02:49:58 -0700 (PDT)
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:mime-version:content-type:content-transfer-encoding;
	bh=m96DdQPL7DXggDRCcL70MzqAhHtRNBN0PnOo62fRMho=;
	b=k+3RhqQE0dfy6E5ZVDsyl16WGueSfqg/zneKmf6lAXF3c7HCcC+zuc8y+gZZXRJCrq
	rbsxMeDvly7jUZ/9Mkts1/nteG2+QIZqu3liGG+eYHlFE7kAe84xCPSE+/nS/byB6dZ+
	pqYCbENJSTiZMHcuwarLVCQwOwRiTAnyUaJRY=
Received: by 10.216.230.69 with SMTP id i47mr5089710weq.61.1319190596596;
	Fri, 21 Oct 2011 02:49:56 -0700 (PDT)
Received: from [192.168.1.71] (host86-153-22-182.range86-153.btcentralplus.com.
	[86.153.22.182])
	by mx.google.com with ESMTPS id fi11sm20730758wbb.9.2011.10.21.02.49.55
	(version=SSLv3 cipher=OTHER); Fri, 21 Oct 2011 02:49:56 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Fri, 21 Oct 2011 10:49:50 +0100
From: Keir Fraser <keir.xen@gmail.com>
To: <xen-devel@lists.xensource.com>,
	<xen-users@lists.xensource.com>
Message-ID: <CAC6FECE.236AC%keir.xen@gmail.com>
Thread-Topic: ANNOUNCE: Xen 4.1.2 and 4.0.3 released
Thread-Index: AcyP1sZSebXmLi6elkqWJi2nHXQp3Q==
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: 
Subject: [Xen-devel] ANNOUNCE: Xen 4.1.2 and 4.0.3 released
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Folks,

The Xen team is pleased to announce the release of 4.1.2 and 4.0.3 from the
active stable branches.

Fixes/features include:
 * New XL toolstack
 * kexec/kdump
 * Remus
 * Device passthrough to HVM guests
 * Interrupt handling
 * Support for Supervisor Mode Execution Protection (SMEP)

These releases are tagged in the mercurial repositories:
http://xenbits.xen.org/xen-4.1-testing.hg (tag 'RELEASE-4.1.2')
http://xenbits.xen.org/staging/xen-4.0-testing.hg (tag 'RELEASE-4.0.3')

Or tarballs can be downloaded:
http://bits.xensource.com/oss-xen/release/4.1.2/xen-4.1.2.tar.gz
http://bits.xensource.com/oss-xen/release/4.0.3/xen-4.0.3.tar.gz

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 03:32:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 03:32:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHCPJ-0002Po-Iv; Fri, 21 Oct 2011 03:32:57 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHCOR-00029v-UX
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 03:32:05 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1319193119!258017!1
X-Originating-IP: [209.85.213.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20701 invoked from network); 21 Oct 2011 10:32:00 -0000
Received: from mail-yx0-f171.google.com (HELO mail-yx0-f171.google.com)
	(209.85.213.171)
	by server-6.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	21 Oct 2011 10:32:00 -0000
Received: by yxl31 with SMTP id 31so1338099yxl.30
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 03:31:59 -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=ZjgiBWuIrj3LyQLYre5tmdWxAizdP2p0cPvUl+UjJgQ=;
	b=FVMpt6CA8j43M4qtYhskhEc+UE+MFhAJ2nRaL67O1loNfm20FFyZTdDpHco855WuWE
	9i5P4eol5GyAdf+OcsEUxpz1wsov/h/Ic+Myz7fP3BfZLZgFxAa3Fe0SRA+ScBN0OPjg
	UXetBlwbvHfUTNaPezOlcCBkUYy7fBVhjTUdk=
MIME-Version: 1.0
Received: by 10.43.130.133 with SMTP id hm5mr11590629icc.11.1319193118920;
	Fri, 21 Oct 2011 03:31:58 -0700 (PDT)
Received: by 10.231.48.9 with HTTP; Fri, 21 Oct 2011 03:31:58 -0700 (PDT)
In-Reply-To: <4E08BD2D.9020403@amd.com>
References: <4E03C386.9030009@amd.com>
	<4E0862520200007800049BDB@nat28.tlf.novell.com>
	<4E08BD2D.9020403@amd.com>
Date: Fri, 21 Oct 2011 11:31:58 +0100
X-Google-Sender-Auth: CQ3yXhhZi28ALjMHLHxaNXBMvg8
Message-ID: <CAFLBxZa5-+5n93ktx0JX3ubR4M58OS8g8mkdKKy_F-4deJVpVw@mail.gmail.com>
Subject: Re: [Xen-devel] Re: [PATCH][RFC][0/2] x86 SMP: enables core-pair
	topology detection for AMD CPUs
From: George Dunlap <George.Dunlap@eu.citrix.com>
To: Wei Huang <wei.huang2@amd.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>,
	Keir Fraser <keir@xen.org>, 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 late request -- should these patches be back-ported to
4.1.2?  Otherwise anyone using AMD Magny-cours may have a significant
performance hit when using 4.1.

 -George

On Mon, Jun 27, 2011 at 6:26 PM, Wei Huang <wei.huang2@amd.com> wrote:
> Thanks, Jan and George. I attach the latest version which fixes the
> indentation issues.
>
> -Wei
>
>
> On 06/27/2011 03:58 AM, Jan Beulich wrote:
>>>>>
>>>>> On 24.06.11 at 00:51, Wei Huang<wei.huang2@amd.com> =A0wrote:
>>>
>>> Hi,
>>>
>>> The following two patches enable core-pair topology detection for AMD
>>> CPUs. The main idea is to record compute unit information into
>>> cpuinfo_x86 and use it when building sibling map. The sibling map will
>>> be used by Xen credit scheduler to coordinate VCPU scheduling in a
>>> fashion similar to SMT. This code is very similar to upstream Linux
>>> kernel.
>>>
>>> Regarding the performance improvement, I saw ~8% improvement running
>>> kernel compilation on Dom0 with this patch. Anrea Przywara ran a POVRay
>>> benchmark using this patch and he saw ~5% improvement. No perf
>>> degradation was seen so far.
>>>
>>> Please review.
>>
>> Apart from some indentation issues these look fine to me.
>>
>> Jan
>>
>>> Thanks,
>>> -Wei
>>
>>
>>
>
>
> _______________________________________________
> 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 Oct 21 03:36:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 03:36:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHCSj-0003aX-FL; Fri, 21 Oct 2011 03:36:29 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHCQp-0002uc-HF
	for Xen-devel@lists.xensource.com; Fri, 21 Oct 2011 03:34:31 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-5.tower-174.messagelabs.com!1319193268!32489805!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1708 invoked from network); 21 Oct 2011 10:34:28 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-5.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2011 10:34:28 -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 76F1A2A30;
	Fri, 21 Oct 2011 13:34:27 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 02051200E9; Fri, 21 Oct 2011 13:34:26 +0300 (EEST)
Date: Fri, 21 Oct 2011 13:34:26 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Alok Sinha <aksinha@yahoo-inc.com>
Subject: Re: [Xen-devel] Question on RHEL 6 support
Message-ID: <20111021103426.GA12984@reaktio.net>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
	<93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
	<20111021061156.GZ12984@reaktio.net>
	<87807055-1F55-4E27-99ED-3F0CAD28D02E@yahoo-inc.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <87807055-1F55-4E27-99ED-3F0CAD28D02E@yahoo-inc.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
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, Oct 21, 2011 at 02:41:36PM +0530, Alok Sinha wrote:
> Thanks Pasi. I am trying that.
> 
> By the way, I am getting following error while creating a HVM with rhel as guest:
> 
> 
> "ERROR: no interface found for primary=eth0"
> 

Where do you get that error? on dom0? in domU ? When does that happen?

-- Pasi


> 
> 
> 
> On Oct 21, 2011, at 11:41 AM, Pasi Kärkkäinen wrote:
> 
> > On Fri, Oct 21, 2011 at 10:29:46AM +0530, Alok Sinha wrote:
> >> Pasi,
> >> 
> >>   Thanks for your response.
> >>   So how do I disable xen platform device for VM? Any pointers?
> >> 
> > 
> > You should be able to change it from /etc/xen/<name_of_the_vm> configfile.
> > 
> > Try:
> > xen_platform_pci=0
> > 
> > -- Pasi
> > 
> >> 
> >> On Oct 20, 2011, at 7:30 PM, Pasi Kärkkäinen wrote:
> >> 
> >>> On Thu, Oct 20, 2011 at 04:18:07PM +0530, Alok Sinha wrote:
> >>>>  Hi,
> >>> 
> >>> Hello,
> >>> 
> >>>>     I am trying to run RHEL 6 as guest over XEN (RHEL 5.6 as host)
> >>>>  hypervisor.
> >>>>     It seems that RHEL 6 loads the paravirt drivers by default and thus HVM
> >>>>  mode is not working.
> >>>>     Any idea on this?
> >>> 
> >>> What do you mean with "HVM mode is not working" ?
> >>> 
> >>> PVHVM drivers (for HVM guests) are there to make disk/net performance a LOT better!
> >>> The default qemu-dm emulated ide controller and realtek nic are not very efficient..
> >>> 
> >>>>     I saw somewhere that including xen_emul_unplug=never will help. Is
> >>>>  there any other way it can be avoided?
> >>>> 
> >>> 
> >>> You can also disable the xen platform pci device for that VM from dom0, 
> >>> then the VM will not activate 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 Fri Oct 21 03:40:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 03:40:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHCX1-00041n-Ny; Fri, 21 Oct 2011 03:40:55 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHCWW-0003q7-QN
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 03:40:25 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319193621!30142103!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8586 invoked from network); 21 Oct 2011 10:40:21 -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; 21 Oct 2011 10:40:21 -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 D4ECF2D8F;
	Fri, 21 Oct 2011 13:40:20 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id A45CA200E9; Fri, 21 Oct 2011 13:40:20 +0300 (EEST)
Date: Fri, 21 Oct 2011 13:40:20 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: M A Young <m.a.young@durham.ac.uk>
Subject: Re: [Xen-devel] [PATCH 0 of 6] pygrub fixes to support a Fedora 16
	guest
Message-ID: <20111021104020.GB12984@reaktio.net>
References: <alpine.DEB.2.00.1110192358140.15667@vega-a.dur.ac.uk>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <alpine.DEB.2.00.1110192358140.15667@vega-a.dur.ac.uk>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: 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 Thu, Oct 20, 2011 at 12:02:21AM +0100, M A Young wrote:
> This series contains patches that may be needed to allow pygrub to boot a 
> Fedora 16 guest.
>

Thanks a lot!

This series should be backported to xen-4.1-testing.hg and xen-4.0-testing.hg aswell,
after committed to xen-unstable. It's important to have pygrub support for GPT in those branches aswell.

-- Pasi


> 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
> 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 Oct 21 05:30:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 05:30:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHEF3-0007ct-I8; Fri, 21 Oct 2011 05:30:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHEEC-0007QG-B5
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 05:29:36 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1319200172!277929!1
X-Originating-IP: [216.32.181.186]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9941 invoked from network); 21 Oct 2011 12:29:33 -0000
Received: from ch1ehsobe006.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.186)
	by server-4.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	21 Oct 2011 12:29:33 -0000
Received: from mail117-ch1-R.bigfish.com (10.43.68.254) by
	CH1EHSOBE003.bigfish.com (10.43.70.53) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:29:31 +0000
Received: from mail117-ch1 (localhost.localdomain [127.0.0.1])	by
	mail117-ch1-R.bigfish.com (Postfix) with ESMTP id 5A1A69A0206;
	Fri, 21 Oct 2011 12:29:31 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzzz32i668h839h)
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 mail117-ch1 (localhost.localdomain [127.0.0.1]) by mail117-ch1
	(MessageSwitch) id 131920017151496_10528;
	Fri, 21 Oct 2011 12:29:31 +0000 (UTC)
Received: from CH1EHSMHS009.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.251])	by mail117-ch1.bigfish.com (Postfix) with ESMTP id
	059A46E8053;	Fri, 21 Oct 2011 12:29:31 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS009.bigfish.com (10.43.70.9) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:29:29 +0000
X-WSS-ID: 0LTF1D2-02-25U-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 200D4C81E1;	Fri, 21 Oct 2011 07:29:25 -0500 (CDT)
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, 21 Oct 2011 07:29:45 -0500
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, 21 Oct 2011 07:29:27 -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; Fri, 21 Oct 2011
	08:29:19 -0400
Message-ID: <4EA1659D.7080904@amd.com>
Date: Fri, 21 Oct 2011 14:29:17 +0200
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: Jan Beulich <jbeulich@suse.com>, Keir Fraser <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset="ISO-8859-15"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: 
Subject: [Xen-devel] c/s 23990:1c8789852eaf: xen crashes
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

c/s 23990:1c8789852eaf crashes xen due to a NULL pointer dereference
within the xen kernel.

I have two different call traces:

(XEN) ----[ Xen-4.2-unstable  x86_64  debug=y  Tainted:    C ]----
(XEN) CPU:    0
(XEN) RIP:    e008:[<ffff82c480151409>] __find_first_bit+0x11/0x2b
(XEN) RFLAGS: 0000000000010246   CONTEXT: hypervisor
(XEN) rax: 0000000000000000   rbx: 0000000000000000   rcx: 0000000000000001
(XEN) rdx: 0000000000000000   rsi: 0000000000000047   rdi: 0000000000000000
(XEN) rbp: ffff82c4802afcf8   rsp: ffff82c4802afcf0   r8:  000000124c1fd4d5
(XEN) r9:  0000000000000007   r10: 0000000000000000   r11: 0000000000000246
(XEN) r12: ffff83012ffb8880   r13: ffff82c4802afe48   r14: 0000000000000000
(XEN) r15: 000000124bcd51be   cr0: 000000008005003b   cr4: 00000000000006f0
(XEN) cr3: 0000000228fb9000   cr2: 0000000000000000
(XEN) ds: 0017   es: 0017   fs: 0000   gs: 0000   ss: e010   cs: e008
(XEN) Xen stack trace from rsp=ffff82c4802afcf0:
(XEN)    0000000000000008 ffff82c4802afd78 ffff82c48019a3c0 0000000000000002
(XEN)    ffff82c4802afd28 ffff82c4802aff18 ffff83012ffb88a0 0000000000000000
(XEN)    0000000000000000 0000000000000000 0000000000000000 ffff8300cfafa15c
(XEN)    ffff83012ff000a4 ffff82c4802588c0 ffff82c4802afe48 0000000000000000
(XEN)    ffff83012ff00080 ffff82c4802afd88 ffff82c480199f83 ffff82c4802afdc8
(XEN)    ffff82c48017e3da ffff83012ff00080 ffff83012ff00080 ffff82c4802afdc8
(XEN)    ffff82c480160391 ffff82c48012478d ffff83012ff000a4 ffff82c4802afe38
(XEN)    ffff82c480165054 ffff82c4802afe38 0000000000000000 0000000000000000
(XEN)    0000000000000000 0000000000000000 0000000000000000 ffff82c4802afe38
(XEN)    ffff82c4802aff18 ffff8300cfcff000 ffff8300cfafa000 0000000000000002
(XEN)    000000124b882e0c 00007d3b7fd50197 ffff82c48015d646 000000124b882e0c
(XEN)    0000000000000002 ffff8300cfafa000 ffff8300cfcff000 ffff82c4802afef0
(XEN)    ffff82c4802aff18 0000000000000246 0000000000000000 0000000000000007
(XEN)    000000124c1fd4d5 ffff82c4802fd4f0 0000000000000000 ffff82c4802e3460
(XEN)    ffff82c4802aff18 ffff8300cfcff000 000000f000000000 ffff82c48015603c
(XEN)    000000000000e008 0000000000000246 ffff82c4802afef0 000000000000e010
(XEN)    ffff82c4802aff10 ffff82c480156089 ffff82c4801241db 0000000000000000
(XEN)    ffff82c4802afd18 0000000000000000 ffffa0002312f840 ffffa0002312d110
(XEN)    ffffffff80c5cac0 ffffa00023344c40 ffffa0002312f840 0000000000000246
(XEN)    0000000000000000 0000000000000000 0000000000000000 0000000000000000
(XEN) Xen call trace:
(XEN)    [<ffff82c480151409>] __find_first_bit+0x11/0x2b
(XEN)    [<ffff82c48019a3c0>] handle_hpet_broadcast+0x97/0x24b
(XEN)    [<ffff82c480199f83>] hpet_legacy_irq_tick+0x42/0x50
(XEN)    [<ffff82c48017e3da>] timer_interrupt+0x24/0x198
(XEN)    [<ffff82c480165054>] do_IRQ+0x542/0x5ef
(XEN)    [<ffff82c48015d646>] common_interrupt+0x26/0x30
(XEN)    [<ffff82c48015603c>] default_idle+0x60/0x65
(XEN)    [<ffff82c480156089>] idle_loop+0x48/0x56
(XEN)
(XEN) Pagetable walk from 0000000000000000:
(XEN)  L4[0x000] = 000000012b778027 0000000000004887
(XEN)  L3[0x000] = 000000012b6cf027 0000000000004930
(XEN)  L2[0x000] = 0000000000000000 ffffffffffffffff
(XEN)
(XEN) ****************************************
(XEN) Panic on CPU 0:
(XEN) FATAL PAGE FAULT
(XEN) [error_code=0000]
(XEN) Faulting linear address: 0000000000000000
(XEN) ****************************************
(XEN)
(XEN) Reboot in five seconds...


(XEN) ----[ Xen-4.2-unstable  x86_64  debug=y  Tainted:    C ]----
(XEN) CPU:    0
(XEN) RIP:    e008:[<ffff82c480151329>] __find_first_bit+0x11/0x2b
(XEN) RFLAGS: 0000000000010246   CONTEXT: hypervisor
(XEN) rax: 0000000000000000   rbx: 0000000000000000   rcx: 0000000000000001
(XEN) rdx: 0000000000000000   rsi: 0000000000000047   rdi: 0000000000000000
(XEN) rbp: ffff82c4802afdc8   rsp: ffff82c4802afdc0   r8:  0000000000000000
(XEN) r9:  00007f7ff7b2d000   r10: 00007f7ff661f800   r11: 0000000000000246
(XEN) r12: ffff83012ffb8880   r13: ffff82c4802aff18   r14: 0000000000000000
(XEN) r15: 00000011bd0ab1c3   cr0: 000000008005003b   cr4: 00000000000006f0
(XEN) cr3: 000000012ab4e000   cr2: 0000000000000000
(XEN) ds: 0017   es: 0017   fs: 0000   gs: 0000   ss: 0000   cs: e008
(XEN) Xen stack trace from rsp=ffff82c4802afdc0:
(XEN)    0000000000000008 ffff82c4802afe48 ffff82c48019a2c0 ffff82c4802afdf8
(XEN)    ffff82c4802afdf8 ffff82c4802aff18 ffff83012ffb88a0 0000000000000000
(XEN)    0000000000000000 0000000000000000 0000000000000000 ffff82c4802afef8
(XEN)    ffff83012ff000a4 ffff82c4802586c0 ffff82c4802aff18 0000000000000000
(XEN)    ffff83012ff00080 ffff82c4802afe58 ffff82c480199e83 ffff82c4802afe98
(XEN)    ffff82c48017e2da ffff83012ff00080 ffff83012ff00080 ffff82c4802afe98
(XEN)    ffff82c480160291 ffff82c4801246ed ffff83012ff000a4 ffff82c4802aff08
(XEN)    ffff82c480164f54 ffffffff80102160 0000000000000000 00000000f543802a
(XEN)    0000000000000000 0000000000000246 00007f7fffffd418 000000000000e02b
(XEN)    00007f7ff7fe6000 00007f7ff7b2f000 0000000000000013 0000000000000001
(XEN)    00007f7ff7b2f000 00007d3b7fd500c7 ffff82c48015d546 00007f7ff7b2f000
(XEN)    0000000000000001 0000000000000013 00007f7ff7b2f000 00007f7fffffd4d0
(XEN)    00007f7ff7fe6000 0000000000000246 00007f7ff661f800 00007f7ff7b2d000
(XEN)    0000000000000000 0000000000000021 00007f7ff543802a 0000000000000000
(XEN)    00007f7fffffd48c 0000000000000011 000000f000000000 000000000047004e
(XEN)    000000000000e033 0000000000000206 00007f7fffffd4b0 000000000000e02b
(XEN)    000000000000beef 000000000000beef 000000000000beef 000000000000beef
(XEN)    0000000000000000 ffff8300cfafa000 0000000000000000 0000000000000000
(XEN) Xen call trace:
(XEN)    [<ffff82c480151329>] __find_first_bit+0x11/0x2b
(XEN)    [<ffff82c48019a2c0>] handle_hpet_broadcast+0x97/0x24b
(XEN)    [<ffff82c480199e83>] hpet_legacy_irq_tick+0x42/0x50
(XEN)    [<ffff82c48017e2da>] timer_interrupt+0x24/0x198
(XEN)    [<ffff82c480164f54>] do_IRQ+0x542/0x5ef
(XEN)
(XEN) Pagetable walk from 0000000000000000:
(XEN)  L4[0x000] = 000000012aeea027 0000000000005115
(XEN)  L3[0x000] = 000000021f809027 00000000000027f6
(XEN)  L2[0x000] = 0000000000000000 ffffffffffffffff
(XEN)
(XEN) ****************************************
(XEN) Panic on CPU 0:
(XEN) FATAL PAGE FAULT
(XEN) [error_code=0000]
(XEN) Faulting linear address: 0000000000000000
(XEN) ****************************************
(XEN)
(XEN) Reboot in five seconds...



-- 
---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 Fri Oct 21 05:55:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 05:55:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHEdE-00018H-1D; Fri, 21 Oct 2011 05:55:28 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHEcF-0000vA-Ta
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 05:54:28 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1319201664!277727!1
X-Originating-IP: [213.199.154.143]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27201 invoked from network); 21 Oct 2011 12:54:24 -0000
Received: from db3ehsobe005.messaging.microsoft.com (HELO
	DB3EHSOBE005.bigfish.com) (213.199.154.143)
	by server-6.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	21 Oct 2011 12:54:24 -0000
Received: from mail69-db3-R.bigfish.com (10.3.81.249) by
	DB3EHSOBE005.bigfish.com (10.3.84.25) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:24 +0000
Received: from mail69-db3 (localhost.localdomain [127.0.0.1])	by
	mail69-db3-R.bigfish.com (Postfix) with ESMTP id 0431D16503E7	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:24 +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,
Received: from mail69-db3 (localhost.localdomain [127.0.0.1]) by mail69-db3
	(MessageSwitch) id 1319201663832260_6341;
	Fri, 21 Oct 2011 12:54:23 +0000 (UTC)
Received: from DB3EHSMHS015.bigfish.com (unknown [10.3.81.245])	by
	mail69-db3.bigfish.com (Postfix) with ESMTP id C6CB713C804C	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:23 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	DB3EHSMHS015.bigfish.com (10.3.87.115) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:22 +0000
X-WSS-ID: 0LTF2IJ-02-39S-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 2F56FC81E0	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 07:54:18 -0500 (CDT)
Received: from SAUSEXDAG02.amd.com (163.181.55.2) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Fri, 21 Oct 2011 07:54:38 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag02.amd.com
	(163.181.55.2) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Fri, 21 Oct 2011 07:54:20 -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; Fri, 21 Oct 2011
	08:53:41 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 5A51049C625	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 13:53:40 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 49CF8594883; Fri, 21 Oct 2011
	14:53:40 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1b618fbedd2371b2c4a00118f5fde8b063131d27
Message-ID: <1b618fbedd2371b2c4a0.1319201721@gran.amd.com>
In-Reply-To: <patchbomb.1319201719@gran.amd.com>
References: <patchbomb.1319201719@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Fri, 21 Oct 2011 14:55:21 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 2 of 6] Remove VTD prefix from debug output
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319201420 -7200
# Node ID 1b618fbedd2371b2c4a00118f5fde8b063131d27
# Parent  a559e27ffb2c2a3a90dc25f09205b66668dcdbbb
Remove VTD prefix from debug output.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r a559e27ffb2c -r 1b618fbedd23 xen/drivers/passthrough/pci.c
--- a/xen/drivers/passthrough/pci.c	Fri Oct 21 14:50:16 2011 +0200
+++ b/xen/drivers/passthrough/pci.c	Fri Oct 21 14:50:20 2011 +0200
@@ -758,7 +758,7 @@ int enable_ats_device(int seg, int bus, 
     BUG_ON(!pos);
 
     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));
 
@@ -799,7 +799,7 @@ int enable_ats_device(int seg, int bus, 
     }
 
     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");
@@ -833,7 +833,7 @@ void disable_ats_device(int seg, int bus
     }
 
     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));
 }


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 05:56:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 05:56:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHEeJ-0001Vm-VY; Fri, 21 Oct 2011 05:56:35 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHEcI-0000vC-Kr
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 05:54:31 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1319201644!49724636!1
X-Originating-IP: [65.55.88.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8843 invoked from network); 21 Oct 2011 12:54:05 -0000
Received: from tx2ehsobe003.messaging.microsoft.com (HELO
	TX2EHSOBE006.bigfish.com) (65.55.88.13)
	by server-9.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	21 Oct 2011 12:54:05 -0000
Received: from mail43-tx2-R.bigfish.com (10.9.14.254) by
	TX2EHSOBE006.bigfish.com (10.9.40.26) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:25 +0000
Received: from mail43-tx2 (localhost.localdomain [127.0.0.1])	by
	mail43-tx2-R.bigfish.com (Postfix) with ESMTP id 6688DBD022C	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:25 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h62h)
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
Received: from mail43-tx2 (localhost.localdomain [127.0.0.1]) by mail43-tx2
	(MessageSwitch) id 1319201664999899_10687;
	Fri, 21 Oct 2011 12:54:24 +0000 (UTC)
Received: from TX2EHSMHS035.bigfish.com (unknown [10.9.14.249])	by
	mail43-tx2.bigfish.com (Postfix) with ESMTP id ECA48F7004F	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:24 +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; Fri, 21 Oct 2011 12:54:23 +0000
X-WSS-ID: 0LTF2IK-01-177-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 2926E10281BA	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 07:54:19 -0500 (CDT)
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;
	Fri, 21 Oct 2011 07:54:39 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag02.amd.com
	(163.181.55.2) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Fri, 21 Oct 2011 07:54:21 -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; Fri, 21 Oct 2011
	08:53:42 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 901A049C628	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 13:53:40 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 7CA8B594886; Fri, 21 Oct 2011
	14:53:40 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 6009089b0511c843f54435d02dcd72394d7e164f
Message-ID: <6009089b0511c843f544.1319201724@gran.amd.com>
In-Reply-To: <patchbomb.1319201719@gran.amd.com>
References: <patchbomb.1319201719@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Fri, 21 Oct 2011 14:55:24 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 5 of 6] Add iotlb invalidation command for amd
	iommu
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319201423 -7200
# Node ID 6009089b0511c843f54435d02dcd72394d7e164f
# Parent  f2fbc041f4a710b66f98e76ad8905dcac7920c18
Add iotlb invalidation command for amd iommu

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r f2fbc041f4a7 -r 6009089b0511 xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Fri Oct 21 14:50:22 2011 +0200
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Fri Oct 21 14:50:23 2011 +0200
@@ -128,6 +128,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 +965,62 @@ int amd_iommu_reserve_domain_unity_map(s
     return 0;
 }
 
+void amd_iommu_flush_iotlb(struct pci_ats_dev *pdev,
+                           uint64_t gaddr, unsigned int order)
+{
+    unsigned long flags;
+    struct amd_iommu *iommu;
+    unsigned int bdf, req_id, queueid, maxpend;
+
+    if ( !ats_enabled )
+        return;
+
+    bdf = (pdev->bus << 8) | pdev->devfn;
+    iommu = find_iommu_for_device(pdev->seg, bdf);
+
+    if ( !iommu )
+    {
+        AMD_IOMMU_DEBUG("%s: Fail to find iommu for device %04x:%02x:%02x.%u\n",
+                        __func__, pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn),
+                        PCI_FUNC(pdev->devfn));
+        return;
+    }
+
+    if ( !iommu->iotlb_support )
+        return;
+
+    req_id = get_dma_requestor_id(iommu->seg, bdf);
+    queueid = req_id;
+    maxpend = (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);
+}
+
+void amd_iommu_flush_all_iotlbs(struct domain *d, 
+                                uint64_t gaddr, unsigned int order)
+{
+    struct pci_ats_dev *ats_pdev;
+    struct pci_dev *pdev;
+
+    if ( !ats_enabled )
+        return;
+
+    for_each_pdev( d, pdev )
+    {
+        ats_pdev = get_ats_device(pdev->seg, pdev->bus, pdev->devfn);
+        if ( ats_pdev == NULL )
+            continue;
+        if ( !pci_ats_enabled(ats_pdev->seg, ats_pdev->bus, ats_pdev->devfn) )
+            continue;
+
+        amd_iommu_flush_iotlb(ats_pdev, gaddr, order);
+    }
+}
 
 /* Flush iommu cache after p2m changes. */
 static void _amd_iommu_flush_pages(struct domain *d,
@@ -914,6 +1039,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 f2fbc041f4a7 -r 6009089b0511 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Fri Oct 21 14:50:22 2011 +0200
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Fri Oct 21 14:50:23 2011 +0200
@@ -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 f2fbc041f4a7 -r 6009089b0511 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Fri Oct 21 14:50:22 2011 +0200
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Fri Oct 21 14:50:23 2011 +0200
@@ -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_ats_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,
@@ -165,4 +167,6 @@ static inline void __free_amd_iommu_tabl
     free_xenheap_pages(table, order);
 }
 
+extern bool_t ats_enabled;
+
 #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 Fri Oct 21 05:58:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 05:58:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHEg5-0001vz-BC; Fri, 21 Oct 2011 05:58:25 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHEcL-0000vY-TC
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 05:54:34 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319201649!49228284!1
X-Originating-IP: [65.55.88.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19677 invoked from network); 21 Oct 2011 12:54:10 -0000
Received: from tx2ehsobe003.messaging.microsoft.com (HELO
	TX2EHSOBE006.bigfish.com) (65.55.88.13)
	by server-8.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	21 Oct 2011 12:54:10 -0000
Received: from mail103-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; Fri, 21 Oct 2011 12:54:28 +0000
Received: from mail103-tx2 (localhost.localdomain [127.0.0.1])	by
	mail103-tx2-R.bigfish.com (Postfix) with ESMTP id 9EC753D81B1	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:28 +0000 (UTC)
X-SpamScore: -3
X-BigFish: VPS-3(zz4015Lzz1202hzzz32i668h839h944h61h)
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 mail103-tx2 (localhost.localdomain [127.0.0.1]) by mail103-tx2
	(MessageSwitch) id 1319201668545011_4313;
	Fri, 21 Oct 2011 12:54:28 +0000 (UTC)
Received: from TX2EHSMHS010.bigfish.com (unknown [10.9.14.249])	by
	mail103-tx2.bigfish.com (Postfix) with ESMTP id 7E11C1598050	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:28 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS010.bigfish.com (10.9.99.110) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:21 +0000
X-WSS-ID: 0LTF2IJ-01-176-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 2CAD110281BC	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 07:54:18 -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;
	Fri, 21 Oct 2011 07:54:38 -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;
	Fri, 21 Oct 2011 07:54:20 -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; Fri, 21 Oct 2011
	08:53:41 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 4656A49C0F1	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 13:53:40 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 2D7E85940FF; Fri, 21 Oct 2011
	14:53:40 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1319201719@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Fri, 21 Oct 2011 14:55:19 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 0 of 6] amd iommu: add ats device 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

Hi, this patch set enables ats devices on amd systems with following changes:
1) Move vendor independent ATS functions into public directories.
2) Add new ATS helper functions.
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 Fri Oct 21 06:02:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:02:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHEkL-0002Nx-3V; Fri, 21 Oct 2011 06:02:49 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHEcQ-0000wL-SL
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 05:54:39 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1319201674!464701!1
X-Originating-IP: [216.32.181.181]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20482 invoked from network); 21 Oct 2011 12:54:35 -0000
Received: from ch1ehsobe001.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.181)
	by server-11.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	21 Oct 2011 12:54:35 -0000
Received: from mail177-ch1-R.bigfish.com (10.43.68.249) by
	CH1EHSOBE018.bigfish.com (10.43.70.68) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:33 +0000
Received: from mail177-ch1 (localhost.localdomain [127.0.0.1])	by
	mail177-ch1-R.bigfish.com (Postfix) with ESMTP id 89AA28F0750	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:33 +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 mail177-ch1 (localhost.localdomain [127.0.0.1]) by mail177-ch1
	(MessageSwitch) id 1319201665807758_4401;
	Fri, 21 Oct 2011 12:54:25 +0000 (UTC)
Received: from CH1EHSMHS002.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.247])	by mail177-ch1.bigfish.com (Postfix) with ESMTP id
	946841838057	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 12:54:25 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS002.bigfish.com (10.43.70.2) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:22 +0000
X-WSS-ID: 0LTF2IJ-02-39R-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 26D73C81E5	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 07:54:18 -0500 (CDT)
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;
	Fri, 21 Oct 2011 07:54:39 -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;
	Fri, 21 Oct 2011 07:54:20 -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; Fri, 21 Oct 2011
	08:53:41 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 49B9049C623	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 13:53:40 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 3CA53594882; Fri, 21 Oct 2011
	14:53:40 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a559e27ffb2c2a3a90dc25f09205b66668dcdbbb
Message-ID: <a559e27ffb2c2a3a90dc.1319201720@gran.amd.com>
In-Reply-To: <patchbomb.1319201719@gran.amd.com>
References: <patchbomb.1319201719@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Fri, 21 Oct 2011 14:55:20 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 1 of 6] Move some ats functions into vendor
	neutral directories
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319201416 -7200
# Node ID a559e27ffb2c2a3a90dc25f09205b66668dcdbbb
# Parent  121af976b2988de389db139231103ceedd11bb8a
Move some ats functions into vendor neutral directories.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 121af976b298 -r a559e27ffb2c xen/drivers/passthrough/pci.c
--- a/xen/drivers/passthrough/pci.c	Fri Oct 14 10:17:22 2011 +0200
+++ b/xen/drivers/passthrough/pci.c	Fri Oct 21 14:50:16 2011 +0200
@@ -748,6 +748,95 @@ static int __init setup_dump_pcidevs(voi
 __initcall(setup_dump_pcidevs);
 #endif
 
+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));
+}
 
 /*
  * Local variables:
diff -r 121af976b298 -r a559e27ffb2c 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	Fri Oct 21 14:50:16 2011 +0200
@@ -62,8 +62,6 @@ extern bool_t ats_enabled;
 struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
 
 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);
 
 int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
diff -r 121af976b298 -r a559e27ffb2c 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	Fri Oct 21 14:50:16 2011 +0200
@@ -30,20 +30,6 @@
 
 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);
 
@@ -121,97 +107,6 @@ int ats_device(int seg, int bus, int dev
     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 121af976b298 -r a559e27ffb2c xen/include/xen/pci.h
--- a/xen/include/xen/pci.h	Fri Oct 14 10:17:22 2011 +0200
+++ b/xen/include/xen/pci.h	Fri Oct 21 14:50:16 2011 +0200
@@ -63,6 +63,20 @@ struct pci_dev {
     u64 vf_rlen[6];
 };
 
+#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);
+
 #define for_each_pdev(domain, pdev) \
     list_for_each_entry(pdev, &(domain->arch.pdev_list), domain_list)
 
@@ -136,4 +150,7 @@ void msixtbl_pt_unregister(struct domain
 void msixtbl_pt_cleanup(struct domain *d);
 void pci_enable_acs(struct pci_dev *pdev);
 
+int enable_ats_device(int seg, int bus, int devfn);
+void disable_ats_device(int seg, int bus, int devfn);
+
 #endif /* __XEN_PCI_H__ */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 06:05:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:05:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHEnG-0002we-UN; Fri, 21 Oct 2011 06:05:51 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHEcX-0000y3-P2
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 05:54:46 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319201681!36189913!1
X-Originating-IP: [65.55.88.11]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7257 invoked from network); 21 Oct 2011 12:54:42 -0000
Received: from tx2ehsobe001.messaging.microsoft.com (HELO
	TX2EHSOBE002.bigfish.com) (65.55.88.11)
	by server-10.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	21 Oct 2011 12:54:42 -0000
Received: from mail135-tx2-R.bigfish.com (10.9.14.237) by
	TX2EHSOBE002.bigfish.com (10.9.40.22) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:40 +0000
Received: from mail135-tx2 (localhost.localdomain [127.0.0.1])	by
	mail135-tx2-R.bigfish.com (Postfix) with ESMTP id 440A714F813E	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:40 +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 mail135-tx2 (localhost.localdomain [127.0.0.1]) by mail135-tx2
	(MessageSwitch) id 131920168079096_17295;
	Fri, 21 Oct 2011 12:54:40 +0000 (UTC)
Received: from TX2EHSMHS017.bigfish.com (unknown [10.9.14.243])	by
	mail135-tx2.bigfish.com (Postfix) with ESMTP id 0C747A88056	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:40 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS017.bigfish.com (10.9.99.117) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:37 +0000
X-WSS-ID: 0LTF2IV-02-3A2-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 27D18C81E1	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 07:54:30 -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;
	Fri, 21 Oct 2011 07:54:51 -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;
	Fri, 21 Oct 2011 07:54:32 -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; Fri, 21 Oct 2011
	08:53:41 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 7C89C49C627	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 13:53:40 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 6B300594885; Fri, 21 Oct 2011
	14:53:40 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f2fbc041f4a710b66f98e76ad8905dcac7920c18
Message-ID: <f2fbc041f4a710b66f98.1319201723@gran.amd.com>
In-Reply-To: <patchbomb.1319201719@gran.amd.com>
References: <patchbomb.1319201719@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Fri, 21 Oct 2011 14:55:23 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 4 of 6] 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 1319201422 -7200
# Node ID f2fbc041f4a710b66f98e76ad8905dcac7920c18
# Parent  bb1330a1f8c7149fb39578382d9f5dfeef13ffa9
Add new ATS helper functions

Signed-off-by Wei Wang <wei.wang2@amd.com>

diff -r bb1330a1f8c7 -r f2fbc041f4a7 xen/drivers/passthrough/pci.c
--- a/xen/drivers/passthrough/pci.c	Fri Oct 21 14:50:21 2011 +0200
+++ b/xen/drivers/passthrough/pci.c	Fri Oct 21 14:50:22 2011 +0200
@@ -838,6 +838,74 @@ void disable_ats_device(int seg, int bus
                 seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
 }
 
+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 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 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;
+}
+
+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;
+}
+
 /*
  * Local variables:
  * mode: C
diff -r bb1330a1f8c7 -r f2fbc041f4a7 xen/drivers/passthrough/vtd/x86/ats.c
--- a/xen/drivers/passthrough/vtd/x86/ats.c	Fri Oct 21 14:50:21 2011 +0200
+++ b/xen/drivers/passthrough/vtd/x86/ats.c	Fri Oct 21 14:50:22 2011 +0200
@@ -29,35 +29,6 @@
 #include "../extern.h"
 
 static LIST_HEAD(ats_dev_drhd_units);
-
-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;
diff -r bb1330a1f8c7 -r f2fbc041f4a7 xen/include/xen/pci.h
--- a/xen/include/xen/pci.h	Fri Oct 21 14:50:21 2011 +0200
+++ b/xen/include/xen/pci.h	Fri Oct 21 14:50:22 2011 +0200
@@ -152,5 +152,8 @@ void pci_enable_acs(struct pci_dev *pdev
 
 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);
 
 #endif /* __XEN_PCI_H__ */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 06:08:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:08:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHEpO-0003LD-OS; Fri, 21 Oct 2011 06:08:02 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHEcY-0000y8-Be
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 05:54:47 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1319201667!45241800!1
X-Originating-IP: [216.32.181.183]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14880 invoked from network); 21 Oct 2011 12:54:28 -0000
Received: from ch1ehsobe003.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.183)
	by server-13.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	21 Oct 2011 12:54:28 -0000
Received: from mail51-ch1-R.bigfish.com (10.43.68.240) by
	CH1EHSOBE009.bigfish.com (10.43.70.59) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:41 +0000
Received: from mail51-ch1 (localhost.localdomain [127.0.0.1])	by
	mail51-ch1-R.bigfish.com (Postfix) with ESMTP id 58AF51BA0637	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:41 +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 mail51-ch1 (localhost.localdomain [127.0.0.1]) by mail51-ch1
	(MessageSwitch) id 131920167924955_28966;
	Fri, 21 Oct 2011 12:54:39 +0000 (UTC)
Received: from CH1EHSMHS012.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.252])	by mail51-ch1.bigfish.com (Postfix) with ESMTP id
	F3AE41908046	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 12:54:38 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS012.bigfish.com (10.43.70.12) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:33 +0000
X-WSS-ID: 0LTF2IU-02-3A0-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 23A4FC81DB	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 07:54:30 -0500 (CDT)
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;
	Fri, 21 Oct 2011 07:54:50 -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;
	Fri, 21 Oct 2011 07:54: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; Fri, 21 Oct 2011
	08:53:42 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id A2BF649C629	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 13:53:40 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 9051D594887; Fri, 21 Oct 2011
	14:53:40 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1ccad89116b57c95c0ead34c9f8cc4b67fec9316
Message-ID: <1ccad89116b57c95c0ea.1319201725@gran.amd.com>
In-Reply-To: <patchbomb.1319201719@gran.amd.com>
References: <patchbomb.1319201719@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Fri, 21 Oct 2011 14:55:25 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 6 of 6] Enable ats devices on amd iommu systems
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319201424 -7200
# Node ID 1ccad89116b57c95c0ead34c9f8cc4b67fec9316
# Parent  6009089b0511c843f54435d02dcd72394d7e164f
Enable ats devices on amd iommu systems

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 6009089b0511 -r 1ccad89116b5 xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Fri Oct 21 14:50:23 2011 +0200
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Fri Oct 21 14:50:24 2011 +0200
@@ -368,6 +368,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 6009089b0511 -r 1ccad89116b5 xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Fri Oct 21 14:50:23 2011 +0200
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Fri Oct 21 14:50:24 2011 +0200
@@ -81,11 +81,12 @@ static void disable_translation(u32 *dte
 }
 
 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 = 1;
+    int dte_i = 0;
 
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
 
@@ -94,8 +95,11 @@ 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);
+    req_id = get_dma_requestor_id(iommu->seg, (bus << 8) | devfn);
     dte = iommu->dev_table.buffer + (req_id * IOMMU_DEV_TABLE_ENTRY_SIZE);
 
     spin_lock_irqsave(&iommu->lock, flags);
@@ -107,6 +111,9 @@ 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,6 +125,19 @@ 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) && ats_enabled &&
+         !pci_ats_enabled(iommu->seg, bus, devfn) )
+    {
+        struct pci_ats_dev* pdev;
+        enable_ats_device(iommu->seg, bus, devfn);
+        pdev = get_ats_device(iommu->seg, bus, devfn);
+
+        if ( pdev )
+            amd_iommu_flush_iotlb(pdev, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
+    }
 }
 
 static void __init amd_iommu_setup_dom0_device(struct pci_dev *pdev)
@@ -126,7 +146,8 @@ static void __init amd_iommu_setup_dom0_
     struct amd_iommu *iommu = find_iommu_for_device(pdev->seg, bdf);
 
     if ( likely(iommu != NULL) )
-        amd_iommu_setup_domain_device(pdev->domain, iommu, bdf);
+        amd_iommu_setup_domain_device(pdev->domain, iommu, pdev->bus, 
+                                      pdev->devfn);
     else
         AMD_IOMMU_DEBUG("No iommu for device %04x:%02x:%02x.%u\n",
                         pdev->seg, pdev->bus,
@@ -261,21 +282,26 @@ 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, u8 bus, u8 devfn)
 {
     void *dte;
     unsigned long flags;
     int req_id;
 
     BUG_ON ( iommu->dev_table.buffer == NULL );
-    req_id = get_dma_requestor_id(iommu->seg, bdf);
+
+    req_id = get_dma_requestor_id(iommu->seg, (bus << 8) | devfn);
     dte = iommu->dev_table.buffer + (req_id * IOMMU_DEV_TABLE_ENTRY_SIZE);
 
     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_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 +310,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 && 
+         pci_ats_enabled(iommu->seg, bus, devfn) )
+       disable_ats_device(iommu->seg, bus, devfn); 
 }
 
 static int reassign_device( struct domain *source, struct domain *target,
@@ -310,7 +342,7 @@ static int reassign_device( struct domai
         return -ENODEV;
     }
 
-    amd_iommu_disable_domain_device(source, iommu, bdf);
+    amd_iommu_disable_domain_device(source, iommu, bus, devfn);
 
     list_move(&pdev->domain_list, &target->arch.pdev_list);
     pdev->domain = target;
@@ -320,7 +352,7 @@ static int reassign_device( struct domai
     if ( t->root_table == NULL )
         allocate_domain_resources(t);
 
-    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 +464,8 @@ static int amd_iommu_add_device(struct p
         return -ENODEV;
     }
 
-    amd_iommu_setup_domain_device(pdev->domain, iommu, bdf);
+    amd_iommu_setup_domain_device(pdev->domain, iommu, 
+                                  pdev->bus, pdev->devfn);
     return 0;
 }
 
@@ -454,7 +487,8 @@ static int amd_iommu_remove_device(struc
         return -ENODEV;
     }
 
-    amd_iommu_disable_domain_device(pdev->domain, iommu, bdf);
+    amd_iommu_disable_domain_device(pdev->domain, iommu, 
+                                    pdev->bus, pdev->devfn);
     return 0;
 }
 
diff -r 6009089b0511 -r 1ccad89116b5 xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Fri Oct 21 14:50:23 2011 +0200
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Fri Oct 21 14:50:24 2011 +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);
 
 /* 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 Fri Oct 21 06:09:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06: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 1RHEr3-0003jS-M9; Fri, 21 Oct 2011 06:09:45 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHEdA-00016J-6D
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 05:55:25 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319201684!36196222!1
X-Originating-IP: [65.55.88.11]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28108 invoked from network); 21 Oct 2011 12:54:47 -0000
Received: from tx2ehsobe001.messaging.microsoft.com (HELO
	TX2EHSOBE002.bigfish.com) (65.55.88.11)
	by server-12.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	21 Oct 2011 12:54:47 -0000
Received: from mail41-tx2-R.bigfish.com (10.9.14.247) by
	TX2EHSOBE002.bigfish.com (10.9.40.22) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:43 +0000
Received: from mail41-tx2 (localhost.localdomain [127.0.0.1])	by
	mail41-tx2-R.bigfish.com (Postfix) with ESMTP id 7056BC60346	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:43 +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 mail41-tx2 (localhost.localdomain [127.0.0.1]) by mail41-tx2
	(MessageSwitch) id 1319201680775291_2549;
	Fri, 21 Oct 2011 12:54:40 +0000 (UTC)
Received: from TX2EHSMHS004.bigfish.com (unknown [10.9.14.252])	by
	mail41-tx2.bigfish.com (Postfix) with ESMTP id A5FA7920052	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 12:54:40 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS004.bigfish.com (10.9.99.104) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 12:54:34 +0000
X-WSS-ID: 0LTF2IV-01-17F-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 2A1D510281BE	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 07:54:30 -0500 (CDT)
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;
	Fri, 21 Oct 2011 07:54:50 -0500
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;
	Fri, 21 Oct 2011 07:54:32 -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; Fri, 21 Oct 2011
	08:53:41 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 6AFC049C626	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 13:53:40 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 5A836594884; Fri, 21 Oct 2011
	14:53:40 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: bb1330a1f8c7149fb39578382d9f5dfeef13ffa9
Message-ID: <bb1330a1f8c7149fb395.1319201722@gran.amd.com>
In-Reply-To: <patchbomb.1319201719@gran.amd.com>
References: <patchbomb.1319201719@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Fri, 21 Oct 2011 14:55:22 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 3 of 6] 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 1319201421 -7200
# Node ID bb1330a1f8c7149fb39578382d9f5dfeef13ffa9
# Parent  1b618fbedd2371b2c4a00118f5fde8b063131d27
Fix iommu page size encoding when page order > 0

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 1b618fbedd23 -r bb1330a1f8c7 xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Fri Oct 21 14:50:20 2011 +0200
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Fri Oct 21 14:50:21 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 1b618fbedd23 -r bb1330a1f8c7 xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Fri Oct 21 14:50:20 2011 +0200
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Fri Oct 21 14:50:21 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
+
 #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 Fri Oct 21 06:12:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:12:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHEtl-00049O-Jz; Fri, 21 Oct 2011 06:12:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHEk4-0002L9-Lg
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:02:33 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1319202035!41316717!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3965 invoked from network); 21 Oct 2011 13:00: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; 21 Oct 2011 13:00:35 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 14:03:57 +0100
Message-Id: <4EA18981020000780005CBED@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 14:02:25 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Christoph Egger" <Christoph.Egger@amd.com>
References: <4EA1659D.7080904@amd.com>
In-Reply-To: <4EA1659D.7080904@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>,
	Keir Fraser <keir@xen.org>
Subject: [Xen-devel] Re: c/s 23990:1c8789852eaf: xen crashes
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Christoph,

>>> On 21.10.11 at 14:29, Christoph Egger <Christoph.Egger@amd.com> wrote:
> c/s 23990:1c8789852eaf crashes xen due to a NULL pointer dereference
> within the xen kernel.

I may have to ask for some debugging help here - obviously I haven't
seen this on any of my systems, and looking at the code I also fail to
see how this can happen: handle_hpet_broadcast() gets installed into
hpet_events->event_handler only after successful allocation of
hpet_events->cpumask (we're talking about the num_hpets_used =3D=3D 0
case here, which again only after the allocation sets HPET_EVT_LEGACY,
while hpet_legacy_irq_tick() doesn't allow hpet_events->event_handler
to be called without that flag set). So I'm confused and can't immediately
help.

> I have two different call traces:

They're really pretty similar.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 06:15:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:15:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHEwu-0004ZF-Dr; Fri, 21 Oct 2011 06:15:48 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHEqG-0003XE-Pu
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:08:58 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319202533!283749!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12410 invoked from network); 21 Oct 2011 13:08:53 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-3.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	21 Oct 2011 13:08:53 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 14:10:21 +0100
Message-Id: <4EA18B02020000780005CC0B@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 14:08:50 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 1 of 6] Move some ats functions into
	vendor neutral directories
References: <patchbomb.1319201719@gran.amd.com>
	<a559e27ffb2c2a3a90dc.1319201720@gran.amd.com>
In-Reply-To: <a559e27ffb2c2a3a90dc.1319201720@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, Allen M Kay <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 21.10.11 at 14:55, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1319201416 -7200
> # Node ID a559e27ffb2c2a3a90dc25f09205b66668dcdbbb
> # Parent  121af976b2988de389db139231103ceedd11bb8a
> Move some ats functions into vendor neutral directories.

You move them from an x86-specific place to common code. I suppose
Intel had reasons to expect them to be implemented differently in ia64.
Hence they should go into e.g. xen/drivers/passthrough/x86/ instead.

Jan

> Signed-off-by: Wei Wang <wei.wang2@amd.com>
>=20
> diff -r 121af976b298 -r a559e27ffb2c xen/drivers/passthrough/pci.c
> --- a/xen/drivers/passthrough/pci.c	Fri Oct 14 10:17:22 2011 +0200
> +++ b/xen/drivers/passthrough/pci.c	Fri Oct 21 14:50:16 2011 +0200
> @@ -748,6 +748,95 @@ static int __init setup_dump_pcidevs(voi
>  __initcall(setup_dump_pcidevs);
>  #endif
> =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));
> +}
> =20
>  /*
>   * Local variables:
> diff -r 121af976b298 -r a559e27ffb2c 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	Fri Oct 21 14:50:16 2011 =
+0200
> @@ -62,8 +62,6 @@ 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 a559e27ffb2c 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	Fri Oct 21 14:50:16 2011 =
+0200
> @@ -30,20 +30,6 @@
> =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);
> =20
> @@ -121,97 +107,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 a559e27ffb2c xen/include/xen/pci.h
> --- a/xen/include/xen/pci.h	Fri Oct 14 10:17:22 2011 +0200
> +++ b/xen/include/xen/pci.h	Fri Oct 21 14:50:16 2011 +0200
> @@ -63,6 +63,20 @@ struct pci_dev {
>      u64 vf_rlen[6];
>  };
> =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);
> +
>  #define for_each_pdev(domain, pdev) \
>      list_for_each_entry(pdev, &(domain->arch.pdev_list), domain_list)
> =20
> @@ -136,4 +150,7 @@ void msixtbl_pt_unregister(struct domain
>  void msixtbl_pt_cleanup(struct domain *d);
>  void pci_enable_acs(struct pci_dev *pdev);
> =20
> +int enable_ats_device(int seg, int bus, int devfn);
> +void disable_ats_device(int seg, int bus, int devfn);
> +
>  #endif /* __XEN_PCI_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 Fri Oct 21 06:21:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:21:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHF2Z-0005oW-OO; Fri, 21 Oct 2011 06:21:39 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHEsy-00040z-Te
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:11:45 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1319202701!539994!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6399 invoked from network); 21 Oct 2011 13:11:41 -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; 21 Oct 2011 13:11:41 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 14:13:09 +0100
Message-Id: <4EA18BAA020000780005CC15@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 14:11:38 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 4 of 6] Add new ATS helper functions
References: <patchbomb.1319201719@gran.amd.com>
	<f2fbc041f4a710b66f98.1319201723@gran.amd.com>
In-Reply-To: <f2fbc041f4a710b66f98.1319201723@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 21.10.11 at 14:55, Wei Wang <wei.wang2@amd.com> wrote:
> # HG changeset patch
> # User Wei Wang <wei.wang2@amd.com>
> # Date 1319201422 -7200
> # Node ID f2fbc041f4a710b66f98e76ad8905dcac7920c18
> # Parent  bb1330a1f8c7149fb39578382d9f5dfeef13ffa9
> Add new ATS helper functions
>=20
> Signed-off-by Wei Wang <wei.wang2@amd.com>
>=20
> diff -r bb1330a1f8c7 -r f2fbc041f4a7 xen/drivers/passthrough/pci.c
> --- a/xen/drivers/passthrough/pci.c	Fri Oct 21 14:50:21 2011 +0200
> +++ b/xen/drivers/passthrough/pci.c	Fri Oct 21 14:50:22 2011 +0200
> @@ -838,6 +838,74 @@ 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;
> +}
> +
> +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 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;
> +}
> +
> +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;
> +}
> +
>  /*
>   * Local variables:
>   * mode: C
> diff -r bb1330a1f8c7 -r f2fbc041f4a7 xen/drivers/passthrough/vtd/x86/ats.=
c
> --- a/xen/drivers/passthrough/vtd/x86/ats.c	Fri Oct 21 14:50:21 2011 =
+0200
> +++ b/xen/drivers/passthrough/vtd/x86/ats.c	Fri Oct 21 14:50:22 2011 =
+0200
> @@ -29,35 +29,6 @@
>  #include "../extern.h"
> =20
>  static LIST_HEAD(ats_dev_drhd_units);
> -
> -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 );
> -}
> -

Why don't you move this chunk together with the other movement you
do?

Jan

>  struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu)
>  {
>      struct acpi_drhd_unit *drhd;
> diff -r bb1330a1f8c7 -r f2fbc041f4a7 xen/include/xen/pci.h
> --- a/xen/include/xen/pci.h	Fri Oct 21 14:50:21 2011 +0200
> +++ b/xen/include/xen/pci.h	Fri Oct 21 14:50:22 2011 +0200
> @@ -152,5 +152,8 @@ void pci_enable_acs(struct pci_dev *pdev
> =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);
> =20
>  #endif /* __XEN_PCI_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 Fri Oct 21 06:22:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06: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 1RHF3o-0006D2-6l; Fri, 21 Oct 2011 06:22:56 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHF1V-0005a2-JP
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:20:35 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319203228!34070689!1
X-Originating-IP: [65.55.88.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31541 invoked from network); 21 Oct 2011 13:20:30 -0000
Received: from tx2ehsobe002.messaging.microsoft.com (HELO
	TX2EHSOBE004.bigfish.com) (65.55.88.12)
	by server-6.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	21 Oct 2011 13:20:30 -0000
Received: from mail194-tx2-R.bigfish.com (10.9.14.251) by
	TX2EHSOBE004.bigfish.com (10.9.40.24) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 13:20:28 +0000
Received: from mail194-tx2 (localhost.localdomain [127.0.0.1])	by
	mail194-tx2-R.bigfish.com (Postfix) with ESMTP id 10A7E178055B	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 13:20:28 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzc85dhzz1202hzz8275bhz32i668h839h34h61h)
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 mail194-tx2 (localhost.localdomain [127.0.0.1]) by mail194-tx2
	(MessageSwitch) id 1319203227671095_18046;
	Fri, 21 Oct 2011 13:20:27 +0000 (UTC)
Received: from TX2EHSMHS040.bigfish.com (unknown [10.9.14.244])	by
	mail194-tx2.bigfish.com (Postfix) with ESMTP id 8FE881C1805E	for
	<xen-devel@lists.xensource.com>; Fri, 21 Oct 2011 13:20:27 +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; Fri, 21 Oct 2011 13:20:26 +0000
X-WSS-ID: 0LTF3PZ-01-2SC-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 2485010281BF	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 08:20:22 -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;
	Fri, 21 Oct 2011 08:20:43 -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;
	Fri, 21 Oct 2011 08:20:24 -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; Fri, 21 Oct 2011
	09:20:20 -0400
Message-ID: <4EA17193.1020108@amd.com>
Date: Fri, 21 Oct 2011 15:20:19 +0200
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>
Content-Type: multipart/mixed; boundary="------------020508010009060304010803"
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH] nestedhvm: handle l2 guest MMIO access
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------020508010009060304010803
Content-Type: text/plain; charset="ISO-8859-15"; format=flowed
Content-Transfer-Encoding: 7bit


Hyper-V starts a root domain which effectively an l2 guest.
Hyper-V passes its devices through to the root domain and
let it do the MMIO accesses. The emulation is done by
Xen (host) and Hyper-V forwards the interrupts to the l2 guest.

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

--------------020508010009060304010803
Content-Type: text/plain; name="xen_nh_mmio.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="xen_nh_mmio.diff"
Content-Description: xen_nh_mmio.diff

diff -r 55b3a1acb259 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c	Fri Oct 21 11:15:06 2011 +0200
+++ b/xen/arch/x86/hvm/hvm.c	Fri Oct 21 15:16:13 2011 +0200
@@ -1208,6 +1208,10 @@ int hvm_hap_nested_page_fault(unsigned l
             return 0;
         case NESTEDHVM_PAGEFAULT_INJECT:
             return -1;
+        case NESTEDHVM_PAGEFAULT_MMIO:
+            if ( !handle_mmio() )
+                hvm_inject_exception(TRAP_gp_fault, 0, 0);
+            return 1;
         }
     }
 
diff -r 55b3a1acb259 xen/arch/x86/hvm/svm/nestedsvm.c
--- a/xen/arch/x86/hvm/svm/nestedsvm.c	Fri Oct 21 11:15:06 2011 +0200
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c	Fri Oct 21 15:16:13 2011 +0200
@@ -1165,6 +1165,15 @@ enum hvm_intblk nsvm_intr_blocked(struct
         if ( svm->ns_hostflags.fields.vintrmask )
             if ( !svm->ns_hostflags.fields.rflagsif )
                 return hvm_intblk_rflags_ie;
+
+        /* when l1 guest passes its devices through to the l2 guest
+         * and l2 guest does an MMIO access then we may want to
+         * inject an VMEXIT(#INTR) exitcode into the l1 guest.
+         * Delay the injection because this would result in delivering
+         * an interrupt *within* the execution of an instruction.
+         */
+        if ( v->arch.hvm_vcpu.io_state != HVMIO_none )
+            return hvm_intblk_shadow;
     }
 
     if ( nv->nv_vmexit_pending ) {
diff -r 55b3a1acb259 xen/arch/x86/mm/hap/nested_hap.c
--- a/xen/arch/x86/mm/hap/nested_hap.c	Fri Oct 21 11:15:06 2011 +0200
+++ b/xen/arch/x86/mm/hap/nested_hap.c	Fri Oct 21 15:16:13 2011 +0200
@@ -151,6 +151,9 @@ nestedhap_walk_L0_p2m(struct p2m_domain 
     mfn = gfn_to_mfn_type_p2m(p2m, L1_gpa >> PAGE_SHIFT, &p2mt, &p2ma, 
                               p2m_query, page_order);
 
+    if ( p2m_is_mmio(p2mt) )
+        return NESTEDHVM_PAGEFAULT_MMIO;
+
     if ( p2m_is_paging(p2mt) || p2m_is_shared(p2mt) || !p2m_is_ram(p2mt) )
         return NESTEDHVM_PAGEFAULT_ERROR;
 
@@ -228,6 +231,8 @@ nestedhvm_hap_nested_page_fault(struct v
         return rv;
     case NESTEDHVM_PAGEFAULT_DONE:
         break;
+    case NESTEDHVM_PAGEFAULT_MMIO:
+        return rv;
     default:
         BUG();
         break;
diff -r 55b3a1acb259 xen/include/asm-x86/hvm/nestedhvm.h
--- a/xen/include/asm-x86/hvm/nestedhvm.h	Fri Oct 21 11:15:06 2011 +0200
+++ b/xen/include/asm-x86/hvm/nestedhvm.h	Fri Oct 21 15:16:13 2011 +0200
@@ -50,6 +50,7 @@ bool_t nestedhvm_vcpu_in_guestmode(struc
 #define NESTEDHVM_PAGEFAULT_DONE   0
 #define NESTEDHVM_PAGEFAULT_INJECT 1
 #define NESTEDHVM_PAGEFAULT_ERROR  2
+#define NESTEDHVM_PAGEFAULT_MMIO   3
 int nestedhvm_hap_nested_page_fault(struct vcpu *v, paddr_t L2_gpa);
 
 /* IO permission map */

--------------020508010009060304010803
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

--------------020508010009060304010803--


From xen-devel-bounces@lists.xensource.com Fri Oct 21 06:25:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:25:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHF6E-0006cP-Ia; Fri, 21 Oct 2011 06:25:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHF5S-0006Pf-Gh
	for Xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:24:38 -0700
X-Env-Sender: paolo.bonzini@gmail.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319203474!283707!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10725 invoked from network); 21 Oct 2011 13:24:35 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	21 Oct 2011 13:24:35 -0000
Received: by gyg13 with SMTP id 13so5475972gyg.30
	for <Xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 06:24:34 -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=hqpU7S2W3/ImkZencisKZmMfXAdphyrEllqS2MsCaDw=;
	b=BQb1RJ4I1xZHENUSVaNM00UF5Oqzn3h2ChCo1Gq0vReebp3pAxP0fWDry//pIMepBc
	RBSEh/SZAzaG7sgetCPUTEKVTXrj4tkfy70Tu3ISRp8fCgNNmjQxY//C3lSAOoS9bobu
	RXj3DNqp9qWicWLiHgMMpr6xJ8LmwQDjsSQnE=
Received: by 10.236.181.35 with SMTP id k23mr21695371yhm.93.1319203474166;
	Fri, 21 Oct 2011 06:24:34 -0700 (PDT)
Received: from yakj.usersys.redhat.com (93-34-199-98.ip51.fastwebnet.it.
	[93.34.199.98])
	by mx.google.com with ESMTPS id c10sm18143368yhj.2.2011.10.21.06.24.31
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 21 Oct 2011 06:24:32 -0700 (PDT)
Message-ID: <4EA1728D.3000100@redhat.com>
Date: Fri, 21 Oct 2011 15:24:29 +0200
From: Paolo Bonzini <pbonzini@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: =?ISO-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
	<93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
	<20111021061156.GZ12984@reaktio.net>
In-Reply-To: <20111021061156.GZ12984@reaktio.net>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Alok Sinha <aksinha@yahoo-inc.com>
Subject: [Xen-devel] Re: Question on RHEL 6 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/21/2011 08:11 AM, Pasi Kärkkäinen wrote:
>> >
>> >      Thanks for your response.
>> >      So how do I disable xen platform device for VM? Any pointers?
>> >
> You should be able to change it from/etc/xen/<name_of_the_vm>  configfile.
>
> Try:
> xen_platform_pci=0

That doesn't exist.

Paolo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 06:35:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:35:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHFFl-0007rX-Mx; Fri, 21 Oct 2011 06:35:17 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHFFF-0007d7-BP
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:34:46 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319204082!1152420!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1530 invoked from network); 21 Oct 2011 13:34:42 -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; 21 Oct 2011 13:34:42 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 14:36:08 +0100
Message-Id: <4EA1910D020000780005CC3B@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 14:34:37 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Christoph Egger" <Christoph.Egger@amd.com>
Subject: [Xen-devel] Re: c/s 23990:1c8789852eaf: xen crashes
References: <4EA1659D.7080904@amd.com>
	<4EA18981020000780005CBED@nat28.tlf.novell.com>
In-Reply-To: <4EA18981020000780005CBED@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>,
	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 21.10.11 at 15:02, "Jan Beulich" <JBeulich@suse.com> wrote:
> Hi Christoph,
>=20
>>>> On 21.10.11 at 14:29, Christoph Egger <Christoph.Egger@amd.com> =
wrote:
>> c/s 23990:1c8789852eaf crashes xen due to a NULL pointer dereference
>> within the xen kernel.
>=20
> I may have to ask for some debugging help here - obviously I haven't
> seen this on any of my systems, and looking at the code I also fail to
> see how this can happen: handle_hpet_broadcast() gets installed into
> hpet_events->event_handler only after successful allocation of
> hpet_events->cpumask (we're talking about the num_hpets_used =3D=3D 0
> case here, which again only after the allocation sets HPET_EVT_LEGACY,
> while hpet_legacy_irq_tick() doesn't allow hpet_events->event_handler
> to be called without that flag set). So I'm confused and can't immediatel=
y
> help.

I think I can see how this can happen, but I'm still trying to find out
why I don't encounter this. A fix should nevertheless be available
shortly.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 06:41:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:41:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHFM5-0008PV-Oi; Fri, 21 Oct 2011 06:41:49 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHFLJ-0008Cj-OO
	for Xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:41:02 -0700
X-Env-Sender: aksinha@yahoo-inc.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319204426!60180937!1
X-Originating-IP: [98.139.253.105]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32017 invoked from network); 21 Oct 2011 13:40:26 -0000
Received: from mrout2-b.corp.bf1.yahoo.com (HELO mrout2-b.corp.bf1.yahoo.com)
	(98.139.253.105)
	by server-2.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2011 13:40:26 -0000
Received: from EGL-EX07CAS01.ds.corp.yahoo.com
	(egl-ex07cas01.eglbp.corp.yahoo.com [203.83.248.208])
	by mrout2-b.corp.bf1.yahoo.com (8.14.4/8.14.4/y.out) with ESMTP id
	p9LDeCpm058219; Fri, 21 Oct 2011 06:40:13 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yahoo-inc.com;
	s=cobra; t=1319204414;
	bh=Sz6ERn3V5rIkHSk0d3XIew8rIN0F7dvnPIHY9tOGM7w=;
	h=From:To:CC:Date:Subject:Message-ID:References:In-Reply-To:
	Content-Type:Content-Transfer-Encoding:MIME-Version;
	b=FEmvr8GI15X9XZwggrjF9zIvyjqKiTopR9UYliO8DQRqf6u0ka8m9yaOar3lJ3SGD
	x5/jwh4MVNpLPwIdt1moACFGkAyBgGLpkNvDWPgrG00xyxvPPqKuTlkeg8Y20PRrF6
	7CtweJ04KI+dHvpUC++tE/DCJYiGJWINQUrEKrEg=
Received: from EGL-EX07VS01.ds.corp.yahoo.com ([203.83.248.205]) by
	EGL-EX07CAS01.ds.corp.yahoo.com ([203.83.248.215]) with mapi;
	Fri, 21 Oct 2011 19:10:11 +0530
From: Alok Sinha <aksinha@yahoo-inc.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Date: Fri, 21 Oct 2011 19:10:07 +0530
Thread-Topic: Question on RHEL 6 support
Thread-Index: AcyP9vRYlzOKIkQMTqytpIdgmECq9w==
Message-ID: <D0DC5248-79A0-4B41-911A-77560283516F@yahoo-inc.com>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
	<93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
	<20111021061156.GZ12984@reaktio.net> <4EA1728D.3000100@redhat.com>
In-Reply-To: <4EA1728D.3000100@redhat.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: Thomas, "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Graves <tgraves@yahoo-inc.com>
Subject: [Xen-devel] Re: Question on RHEL 6 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

Hmm...any other alternatives?

-Alok


On Oct 21, 2011, at 6:54 PM, Paolo Bonzini wrote:

> On 10/21/2011 08:11 AM, Pasi K=E4rkk=E4inen wrote:
>>>>=20
>>>>     Thanks for your response.
>>>>     So how do I disable xen platform device for VM? Any pointers?
>>>>=20
>> You should be able to change it from/etc/xen/<name_of_the_vm>  configfil=
e.
>>=20
>> Try:
>> xen_platform_pci=3D0
>=20
> That doesn't exist.
>=20
> Paolo


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 06:42:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06: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 1RHFN0-0000M8-Du; Fri, 21 Oct 2011 06:42:46 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHFM7-0008Pl-RV
	for Xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:41:52 -0700
X-Env-Sender: aksinha@yahoo-inc.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319204507!285176!1
X-Originating-IP: [98.139.253.104]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26249 invoked from network); 21 Oct 2011 13:41:48 -0000
Received: from mrout1-b.corp.bf1.yahoo.com (HELO mrout1-b.corp.bf1.yahoo.com)
	(98.139.253.104)
	by server-14.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	21 Oct 2011 13:41:48 -0000
Received: from EGL-EX07CAS02.ds.corp.yahoo.com
	(egl-ex07cas02.eglbp.corp.yahoo.com [203.83.248.209])
	by mrout1-b.corp.bf1.yahoo.com (8.14.4/8.14.4/y.out) with ESMTP id
	p9LDfFdH022855; Fri, 21 Oct 2011 06:41:16 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yahoo-inc.com;
	s=cobra; t=1319204477;
	bh=sk/YuowX6RuyjERh+1AK/anqdnpu9nShtFxGKtXdxhc=;
	h=From:To:CC:Date:Subject:Message-ID:References:In-Reply-To:
	Content-Type:Content-Transfer-Encoding:MIME-Version;
	b=k5cQMv1zDwi6JMX1wu92j1L1k1w2fZSf+EXanLr6XT4+ndEwenh+UGGHRQ0xuSXAn
	x7iYozmpZK16h5RvVjVg3WgPdfrqitwTrHyXiSIsCUOvzNmxDv2T1KEOMG/OD0OfdS
	JtDb9sexrIGjcdq4kr08QFeYDYxOndVotbowKKbg=
Received: from EGL-EX07VS01.ds.corp.yahoo.com ([203.83.248.205]) by
	EGL-EX07CAS02.ds.corp.yahoo.com ([203.83.248.216]) with mapi;
	Fri, 21 Oct 2011 19:11:15 +0530
From: Alok Sinha <aksinha@yahoo-inc.com>
To: =?iso-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
Date: Fri, 21 Oct 2011 19:11:10 +0530
Subject: Re: [Xen-devel] Question on RHEL 6 support
Thread-Topic: [Xen-devel] Question on RHEL 6 support
Thread-Index: AcyP9xoaq53Tn1ICTbKD1lnoxvynmg==
Message-ID: <E1563B1A-7CA3-45C1-AF65-42D460286591@yahoo-inc.com>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
	<93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
	<20111021061156.GZ12984@reaktio.net>
	<87807055-1F55-4E27-99ED-3F0CAD28D02E@yahoo-inc.com>
	<20111021103426.GA12984@reaktio.net>
In-Reply-To: <20111021103426.GA12984@reaktio.net>
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: "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


This happens when I am creating the VM. This leaves the VM imaging incomple=
te,

-Alok


On Oct 21, 2011, at 4:04 PM, Pasi K=E4rkk=E4inen wrote:

> On Fri, Oct 21, 2011 at 02:41:36PM +0530, Alok Sinha wrote:
>> Thanks Pasi. I am trying that.
>>=20
>> By the way, I am getting following error while creating a HVM with rhel =
as guest:
>>=20
>>=20
>> "ERROR: no interface found for primary=3Deth0"
>>=20
>=20
> Where do you get that error? on dom0? in domU ? When does that happen?
>=20
> -- Pasi
>=20
>=20
>>=20
>>=20
>>=20
>> On Oct 21, 2011, at 11:41 AM, Pasi K=E4rkk=E4inen wrote:
>>=20
>>> On Fri, Oct 21, 2011 at 10:29:46AM +0530, Alok Sinha wrote:
>>>> Pasi,
>>>>=20
>>>>  Thanks for your response.
>>>>  So how do I disable xen platform device for VM? Any pointers?
>>>>=20
>>>=20
>>> You should be able to change it from /etc/xen/<name_of_the_vm> configfi=
le.
>>>=20
>>> Try:
>>> xen_platform_pci=3D0
>>>=20
>>> -- Pasi
>>>=20
>>>>=20
>>>> On Oct 20, 2011, at 7:30 PM, Pasi K=E4rkk=E4inen wrote:
>>>>=20
>>>>> On Thu, Oct 20, 2011 at 04:18:07PM +0530, Alok Sinha wrote:
>>>>>> Hi,
>>>>>=20
>>>>> Hello,
>>>>>=20
>>>>>>    I am trying to run RHEL 6 as guest over XEN (RHEL 5.6 as host)
>>>>>> hypervisor.
>>>>>>    It seems that RHEL 6 loads the paravirt drivers by default and th=
us HVM
>>>>>> mode is not working.
>>>>>>    Any idea on this?
>>>>>=20
>>>>> What do you mean with "HVM mode is not working" ?
>>>>>=20
>>>>> PVHVM drivers (for HVM guests) are there to make disk/net performance=
 a LOT better!
>>>>> The default qemu-dm emulated ide controller and realtek nic are not v=
ery efficient..
>>>>>=20
>>>>>>    I saw somewhere that including xen_emul_unplug=3Dnever will help.=
 Is
>>>>>> there any other way it can be avoided?
>>>>>>=20
>>>>>=20
>>>>> You can also disable the xen platform pci device for that VM from dom=
0,=20
>>>>> then the VM will not activate PVHVM drivers.
>>>>>=20
>>>>> -- Pasi
>>>>>=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 Fri Oct 21 06:44:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:44:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHFOt-0000l8-Sa; Fri, 21 Oct 2011 06:44:43 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RHFOR-0000Yu-Lr
	for Xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:44:16 -0700
X-Env-Sender: pbonzini@redhat.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1319204651!546255!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17554 invoked from network); 21 Oct 2011 13:44:12 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-6.tower-216.messagelabs.com with SMTP;
	21 Oct 2011 13:44:12 -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 p9LDi2Qe020394
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 21 Oct 2011 09:44:03 -0400
Received: from yakj.usersys.redhat.com (ovpn-112-22.ams2.redhat.com
	[10.36.112.22])
	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9LDi0oU011870; Fri, 21 Oct 2011 09:44:01 -0400
Message-ID: <4EA1771F.5030200@redhat.com>
Date: Fri, 21 Oct 2011 15:43:59 +0200
From: Paolo Bonzini <pbonzini@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Alok Sinha <aksinha@yahoo-inc.com>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
	<93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
	<20111021061156.GZ12984@reaktio.net> <4EA1728D.3000100@redhat.com>
	<D0DC5248-79A0-4B41-911A-77560283516F@yahoo-inc.com>
In-Reply-To: <D0DC5248-79A0-4B41-911A-77560283516F@yahoo-inc.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: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Thomas Graves <tgraves@yahoo-inc.com>
Subject: [Xen-devel] Re: Question on RHEL 6 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/21/2011 03:40 PM, Alok Sinha wrote:
> Hmm...any other alternatives?

Hard to see without dmesg output or something like that.  It's simpler 
if you open a support ticket or BZ with Red Hat, since the Xen version 
in RHEL is quite old.

Paolo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 06:51:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:51:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHFVs-0001MD-D2; Fri, 21 Oct 2011 06:51:56 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHFVK-00019a-4w
	for Xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:51:22 -0700
X-Env-Sender: aksinha@yahoo-inc.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1319205077!1158175!1
X-Originating-IP: [216.145.54.172]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8038 invoked from network); 21 Oct 2011 13:51:18 -0000
Received: from mrout2.yahoo.com (HELO mrout2.yahoo.com) (216.145.54.172)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 21 Oct 2011 13:51:18 -0000
Received: from EGL-EX07CAS01.ds.corp.yahoo.com
	(egl-ex07cas01.eglbp.corp.yahoo.com [203.83.248.208])
	by mrout2.yahoo.com (8.14.4/8.14.4/y.out) with ESMTP id p9LDoklY009673; 
	Fri, 21 Oct 2011 06:50:47 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=yahoo-inc.com;
	s=cobra; t=1319205048;
	bh=khMyst31Knf09LXcZdUSPcH8KV/mIPTgsyyE/nIl4rU=;
	h=From:To:CC:Date:Subject:Message-ID:References:In-Reply-To:
	Content-Type:Content-Transfer-Encoding:MIME-Version;
	b=jn+90zEIVkDg38/FK0Uy+cRlFafUOUd0qmDUcYWi8bhT6h4GmquYbUB+sIySXMqlM
	HrV+aCP0DjejsoZmOW9Zc2euibQR67OwDfaBiaDBUdebuzh6LqsKxsEro+2KklBXJg
	qfEkIMS6zi8ybERbphUEDjKPBIzo4ffUTZsvRymc=
Received: from EGL-EX07VS01.ds.corp.yahoo.com ([203.83.248.205]) by
	EGL-EX07CAS01.ds.corp.yahoo.com ([203.83.248.215]) with mapi;
	Fri, 21 Oct 2011 19:20:46 +0530
From: Alok Sinha <aksinha@yahoo-inc.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Date: Fri, 21 Oct 2011 19:20:44 +0530
Thread-Topic: Question on RHEL 6 support
Thread-Index: AcyP+G5vOxKejzpYRmupVdXRdJMSsA==
Message-ID: <F9D2E64D-3862-4EA0-8EA4-9B7DA099AA9B@yahoo-inc.com>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
	<93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
	<20111021061156.GZ12984@reaktio.net> <4EA1728D.3000100@redhat.com>
	<D0DC5248-79A0-4B41-911A-77560283516F@yahoo-inc.com>
	<4EA1771F.5030200@redhat.com>
In-Reply-To: <4EA1771F.5030200@redhat.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: Thomas, "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Graves <tgraves@yahoo-inc.com>
Subject: [Xen-devel] Re: Question on RHEL 6 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

We have XEN 3.4.3 loaded, is that old?
Does RHEL 6 has compatibility issue with XEN 3? Does it need XEN 4?

-Alok

On Oct 21, 2011, at 7:13 PM, Paolo Bonzini wrote:

> On 10/21/2011 03:40 PM, Alok Sinha wrote:
>> Hmm...any other alternatives?
>=20
> Hard to see without dmesg output or something like that.  It's simpler=20
> if you open a support ticket or BZ with Red Hat, since the Xen version=20
> in RHEL is quite old.
>=20
> Paolo


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 06:56:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:56:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHFa4-0001rG-AO; Fri, 21 Oct 2011 06:56:16 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RHFZY-0001cc-IG
	for Xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:55:44 -0700
X-Env-Sender: pbonzini@redhat.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319205340!1891280!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26165 invoked from network); 21 Oct 2011 13:55:41 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-2.tower-216.messagelabs.com with SMTP;
	21 Oct 2011 13:55:41 -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 p9LDtVtP022370
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 21 Oct 2011 09:55:31 -0400
Received: from yakj.usersys.redhat.com (ovpn-112-22.ams2.redhat.com
	[10.36.112.22])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9LDtTKN006761; Fri, 21 Oct 2011 09:55:30 -0400
Message-ID: <4EA179D0.7040301@redhat.com>
Date: Fri, 21 Oct 2011 15:55:28 +0200
From: Paolo Bonzini <pbonzini@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
To: Alok Sinha <aksinha@yahoo-inc.com>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
	<93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
	<20111021061156.GZ12984@reaktio.net> <4EA1728D.3000100@redhat.com>
	<D0DC5248-79A0-4B41-911A-77560283516F@yahoo-inc.com>
	<4EA1771F.5030200@redhat.com>
	<F9D2E64D-3862-4EA0-8EA4-9B7DA099AA9B@yahoo-inc.com>
In-Reply-To: <F9D2E64D-3862-4EA0-8EA4-9B7DA099AA9B@yahoo-inc.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.23
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Thomas Graves <tgraves@yahoo-inc.com>
Subject: [Xen-devel] Re: Question on RHEL 6 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/21/2011 03:50 PM, Alok Sinha wrote:
> We have XEN 3.4.3 loaded, is that old?

Ah ok, I understood you were using RHEL5's own Xen.  As I said, if you 
open a BZ you can upload your configuration and serial console output 
there.  Without those it's not worth guessing.

> Does RHEL 6 has compatibility issue with XEN 3? Does it need XEN 4?

It runs on RHEL5's own Xen, which is 3.1.2 -- with a lot of patches, but 
none particularly targeted to RHEL6.  If your hypervisor had problems 
with RHEL6 it would not go past GRUB at all, I think.

Paolo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 06:57:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 06:57:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHFb7-0002I1-PO; Fri, 21 Oct 2011 06:57:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHFaA-0001t7-Sn
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:56:24 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319205379!30170045!1
X-Originating-IP: [213.199.154.208]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20975 invoked from network); 21 Oct 2011 13:56:19 -0000
Received: from am1ehsobe005.messaging.microsoft.com (HELO
	AM1EHSOBE005.bigfish.com) (213.199.154.208)
	by server-9.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	21 Oct 2011 13:56:19 -0000
Received: from mail55-am1-R.bigfish.com (10.3.201.245) by
	AM1EHSOBE005.bigfish.com (10.3.204.25) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 13:56:19 +0000
Received: from mail55-am1 (localhost.localdomain [127.0.0.1])	by
	mail55-am1-R.bigfish.com (Postfix) with ESMTP id 144301AC840F;
	Fri, 21 Oct 2011 13:56:19 +0000 (UTC)
X-SpamScore: -12
X-BigFish: VPS-12(zz4015L1432N98dKzz1202hzz8275bhz32i668h839h61h)
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 mail55-am1 (localhost.localdomain [127.0.0.1]) by mail55-am1
	(MessageSwitch) id 1319205356355340_14904;
	Fri, 21 Oct 2011 13:55:56 +0000 (UTC)
Received: from AM1EHSMHS017.bigfish.com (unknown [10.3.201.242])	by
	mail55-am1.bigfish.com (Postfix) with ESMTP id 4542C89805A;
	Fri, 21 Oct 2011 13:55:56 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	AM1EHSMHS017.bigfish.com (10.3.207.155) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 13:55:53 +0000
X-WSS-ID: 0LTF5D2-02-01K-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 2D480C81E1;	Fri, 21 Oct 2011 08:55:50 -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;
	Fri, 21 Oct 2011 08:56:10 -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;
	Fri, 21 Oct 2011 08:55:52 -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; Fri, 21 Oct 2011
	09:55:42 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id A760249C0F1; Fri, 21 Oct 2011
	14:55:41 +0100 (BST)
Received: from gran.osrc.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 93F545940FF; Fri, 21 Oct 2011
	15:55:41 +0200 (CEST)
From: Wei Wang2 <wei.wang2@amd.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 4 of 6] Add new ATS helper functions
Date: Fri, 21 Oct 2011 15:58:47 +0200
User-Agent: KMail/1.9.6 (enterprise 20070904.708012)
References: <patchbomb.1319201719@gran.amd.com>
	<f2fbc041f4a710b66f98.1319201723@gran.amd.com>
	<4EA18BAA020000780005CC15@nat28.tlf.novell.com>
In-Reply-To: <4EA18BAA020000780005CC15@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: <201110211558.48144.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 Friday 21 October 2011 15:11:38 Jan Beulich wrote:
> >>> On 21.10.11 at 14:55, Wei Wang <wei.wang2@amd.com> wrote:
> >
> > # HG changeset patch
> > # User Wei Wang <wei.wang2@amd.com>
> > # Date 1319201422 -7200
> > # Node ID f2fbc041f4a710b66f98e76ad8905dcac7920c18
> > # Parent  bb1330a1f8c7149fb39578382d9f5dfeef13ffa9
> > Add new ATS helper functions
> >
> > Signed-off-by Wei Wang <wei.wang2@amd.com>
> >
> > diff -r bb1330a1f8c7 -r f2fbc041f4a7 xen/drivers/passthrough/pci.c
> > --- a/xen/drivers/passthrough/pci.c	Fri Oct 21 14:50:21 2011 +0200
> > +++ b/xen/drivers/passthrough/pci.c	Fri Oct 21 14:50:22 2011 +0200
> > @@ -838,6 +838,74 @@ void disable_ats_device(int seg, int bus
> >                  seg, bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
> >  }
> >
> > +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 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 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;
> > +}
> > +
> > +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;
> > +}
> > +
> >  /*
> >   * Local variables:
> >   * mode: C
> > diff -r bb1330a1f8c7 -r f2fbc041f4a7
> > xen/drivers/passthrough/vtd/x86/ats.c ---
> > a/xen/drivers/passthrough/vtd/x86/ats.c	Fri Oct 21 14:50:21 2011 +0200
> > +++ b/xen/drivers/passthrough/vtd/x86/ats.c	Fri Oct 21 14:50:22 2011
> > +0200 @@ -29,35 +29,6 @@
> >  #include "../extern.h"
> >
> >  static LIST_HEAD(ats_dev_drhd_units);
> > -
> > -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 );
> > -}
> > -
>
> Why don't you move this chunk together with the other movement you
> do?
Sure, this should be combined with patch 1. I will fix it in the next try.
Thanks,
Wei

> Jan
>
> >  struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu)
> >  {
> >      struct acpi_drhd_unit *drhd;
> > diff -r bb1330a1f8c7 -r f2fbc041f4a7 xen/include/xen/pci.h
> > --- a/xen/include/xen/pci.h	Fri Oct 21 14:50:21 2011 +0200
> > +++ b/xen/include/xen/pci.h	Fri Oct 21 14:50:22 2011 +0200
> > @@ -152,5 +152,8 @@ void pci_enable_acs(struct pci_dev *pdev
> >
> >  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);
> >
> >  #endif /* __XEN_PCI_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 Fri Oct 21 07:00:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 07:00:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHFdk-0002j4-Pq; Fri, 21 Oct 2011 07:00:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHFaU-00020A-52
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 06:56:42 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319205397!36231159!1
X-Originating-IP: [65.55.88.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18296 invoked from network); 21 Oct 2011 13:56:38 -0000
Received: from tx2ehsobe002.messaging.microsoft.com (HELO
	TX2EHSOBE004.bigfish.com) (65.55.88.12)
	by server-4.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	21 Oct 2011 13:56:38 -0000
Received: from mail174-tx2-R.bigfish.com (10.9.14.253) by
	TX2EHSOBE004.bigfish.com (10.9.40.24) with Microsoft SMTP Server id
	14.1.225.22; Fri, 21 Oct 2011 13:56:36 +0000
Received: from mail174-tx2 (localhost.localdomain [127.0.0.1])	by
	mail174-tx2-R.bigfish.com (Postfix) with ESMTP id 1FE63AD8091;
	Fri, 21 Oct 2011 13:56:36 +0000 (UTC)
X-SpamScore: -12
X-BigFish: VPS-12(z3e13hz4015L1432N98dKzz1202hzz8275bhz32i668h839h61h)
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 mail174-tx2 (localhost.localdomain [127.0.0.1]) by mail174-tx2
	(MessageSwitch) id 1319205302690300_18361;
	Fri, 21 Oct 2011 13:55:02 +0000 (UTC)
Received: from TX2EHSMHS046.bigfish.com (unknown [10.9.14.248])	by
	mail174-tx2.bigfish.com (Postfix) with ESMTP id 19ED58D84F6;
	Fri, 21 Oct 2011 13:54:31 +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; Fri, 21 Oct 2011 13:54:28 +0000
X-WSS-ID: 0LTF5AP-01-1HS-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 2EB5910281C5;	Fri, 21 Oct 2011 08:54:25 -0500 (CDT)
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;
	Fri, 21 Oct 2011 08:54:45 -0500
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;
	Fri, 21 Oct 2011 08:54:27 -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; Fri, 21 Oct 2011
	09:54:17 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 393EE49C0F1; Fri, 21 Oct 2011
	14:54:16 +0100 (BST)
Received: from gran.osrc.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 1F3C15940FF; Fri, 21 Oct 2011
	15:54:16 +0200 (CEST)
From: Wei Wang2 <wei.wang2@amd.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 1 of 6] Move some ats functions
	=?iso-8859-1?q?into=09_vendor_neutral?= directories
Date: Fri, 21 Oct 2011 15:57:22 +0200
User-Agent: KMail/1.9.6 (enterprise 20070904.708012)
References: <patchbomb.1319201719@gran.amd.com>
	<a559e27ffb2c2a3a90dc.1319201720@gran.amd.com>
	<4EA18B02020000780005CC0B@nat28.tlf.novell.com>
In-Reply-To: <4EA18B02020000780005CC0B@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: <201110211557.22432.wei.wang2@amd.com>
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Allen M Kay <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 Friday 21 October 2011 15:08:50 Jan Beulich wrote:
> >>> On 21.10.11 at 14:55, Wei Wang <wei.wang2@amd.com> wrote:
> >
> > # HG changeset patch
> > # User Wei Wang <wei.wang2@amd.com>
> > # Date 1319201416 -7200
> > # Node ID a559e27ffb2c2a3a90dc25f09205b66668dcdbbb
> > # Parent  121af976b2988de389db139231103ceedd11bb8a
> > Move some ats functions into vendor neutral directories.
>
> You move them from an x86-specific place to common code. I suppose
> Intel had reasons to expect them to be implemented differently in ia64.
> Hence they should go into e.g. xen/drivers/passthrough/x86/ instead.
>
> Jan

Well, we don't have that directory yet. Could we change folder structures  in 
passthrough to be architecture first, then vendors, for example:
passthough/x86/vtd
passthough/x86/amd                             
passthough/ia64/vtd

Thanks,
Wei


> > Signed-off-by: Wei Wang <wei.wang2@amd.com>
> >
> > diff -r 121af976b298 -r a559e27ffb2c xen/drivers/passthrough/pci.c
> > --- a/xen/drivers/passthrough/pci.c	Fri Oct 14 10:17:22 2011 +0200
> > +++ b/xen/drivers/passthrough/pci.c	Fri Oct 21 14:50:16 2011 +0200
> > @@ -748,6 +748,95 @@ static int __init setup_dump_pcidevs(voi
> >  __initcall(setup_dump_pcidevs);
> >  #endif
> >
> > +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));
> > +}
> >
> >  /*
> >   * Local variables:
> > diff -r 121af976b298 -r a559e27ffb2c 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	Fri Oct 21 14:50:16 2011 +0200
> > @@ -62,8 +62,6 @@ extern bool_t ats_enabled;
> >  struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
> >
> >  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);
> >
> >  int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
> > diff -r 121af976b298 -r a559e27ffb2c
> > 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	Fri Oct 21 14:50:16 2011
> > +0200 @@ -30,20 +30,6 @@
> >
> >  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);
> >
> > @@ -121,97 +107,6 @@ int ats_device(int seg, int bus, int dev
> >      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 121af976b298 -r a559e27ffb2c xen/include/xen/pci.h
> > --- a/xen/include/xen/pci.h	Fri Oct 14 10:17:22 2011 +0200
> > +++ b/xen/include/xen/pci.h	Fri Oct 21 14:50:16 2011 +0200
> > @@ -63,6 +63,20 @@ struct pci_dev {
> >      u64 vf_rlen[6];
> >  };
> >
> > +#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);
> > +
> >  #define for_each_pdev(domain, pdev) \
> >      list_for_each_entry(pdev, &(domain->arch.pdev_list), domain_list)
> >
> > @@ -136,4 +150,7 @@ void msixtbl_pt_unregister(struct domain
> >  void msixtbl_pt_cleanup(struct domain *d);
> >  void pci_enable_acs(struct pci_dev *pdev);
> >
> > +int enable_ats_device(int seg, int bus, int devfn);
> > +void disable_ats_device(int seg, int bus, int devfn);
> > +
> >  #endif /* __XEN_PCI_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 Fri Oct 21 07:03:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 07:03:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHFgk-00038z-O6; Fri, 21 Oct 2011 07:03:10 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHFeb-0002pI-Qr
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 07:00:59 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1319205654!291394!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19380 invoked from network); 21 Oct 2011 14:00:54 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-4.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	21 Oct 2011 14:00:54 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 15:00:53 +0100
Message-Id: <4EA19733020000780005CC83@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 15:00:51 +0100
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="=__PartFFD01D03.1__="
Cc: christoph.egger@amd.com
Subject: [Xen-devel] [PATCH] x86/hpet: fix cpumask allocation after
	23990:1c8789852eaf
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.

--=__PartFFD01D03.1__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

hpet_fsb_cap_lookup(), if it doesn't find any FSB capable timer, leaves
hpet_events allocated, while hpet_events->cpumask may not have been, As
we're pretty generous with these one-time allocations already (in that
hpet_events doesn't get freed when no usable counters were found, even
if in that case only the first array entry [or none at all] may get
used), simply make the cpumask allocation in the legacy case
independent of whether hpet_events was NULL before.

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/xen/arch/x86/hpet.c
+++ b/xen/arch/x86/hpet.c
@@ -512,15 +512,8 @@ void __init hpet_broadcast_init(void)
             return;
=20
         if ( !hpet_events )
-        {
             hpet_events =3D xzalloc(struct hpet_event_channel);
-            if ( hpet_events && !zalloc_cpumask_var(&hpet_events->cpumask)=
 )
-            {
-                xfree(hpet_events);
-                hpet_events =3D NULL;
-            }
-        }
-        if ( !hpet_events )
+        if ( !hpet_events || !zalloc_cpumask_var(&hpet_events->cpumask) )
             return;
         hpet_events->irq =3D -1;
=20



--=__PartFFD01D03.1__=
Content-Type: text/plain; name="x86-hpet-fix-23990.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="x86-hpet-fix-23990.patch"

x86/hpet: fix cpumask allocation after 23990:1c8789852eaf=0A=0Ahpet_fsb_cap=
_lookup(), if it doesn't find any FSB capable timer, leaves=0Ahpet_events =
allocated, while hpet_events->cpumask may not have been, As=0Awe're pretty =
generous with these one-time allocations already (in that=0Ahpet_events =
doesn't get freed when no usable counters were found, even=0Aif in that =
case only the first array entry [or none at all] may get=0Aused), simply =
make the cpumask allocation in the legacy case=0Aindependent of whether =
hpet_events was NULL before.=0A=0ASigned-off-by: Jan Beulich <jbeulich@suse=
.com>=0A=0A--- a/xen/arch/x86/hpet.c=0A+++ b/xen/arch/x86/hpet.c=0A@@ =
-512,15 +512,8 @@ void __init hpet_broadcast_init(void)=0A             =
return;=0A =0A         if ( !hpet_events )=0A-        {=0A             =
hpet_events =3D xzalloc(struct hpet_event_channel);=0A-            if ( =
hpet_events && !zalloc_cpumask_var(&hpet_events->cpumask) )=0A-            =
{=0A-                xfree(hpet_events);=0A-                hpet_events =
=3D NULL;=0A-            }=0A-        }=0A-        if ( !hpet_events )=0A+ =
       if ( !hpet_events || !zalloc_cpumask_var(&hpet_events->cpumask) =
)=0A             return;=0A         hpet_events->irq =3D -1;=0A =0A
--=__PartFFD01D03.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

--=__PartFFD01D03.1__=--


From xen-devel-bounces@lists.xensource.com Fri Oct 21 07:05:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 07:05:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHFjN-0003dy-I3; Fri, 21 Oct 2011 07:05:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHFfN-0002vX-Hm
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 07:01:46 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319205698!546629!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2542 invoked from network); 21 Oct 2011 14:01:38 -0000
Received: from nat28.tlf.novell.com (HELO nat28.tlf.novell.com) (130.57.49.28)
	by server-16.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 21 Oct 2011 14:01:38 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 15:01:37 +0100
Message-Id: <4EA1975F020000780005CC86@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 15:01:35 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Christoph Egger" <Christoph.Egger@amd.com>
References: <4EA1659D.7080904@amd.com>
In-Reply-To: <4EA1659D.7080904@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>,
	Keir Fraser <keir@xen.org>
Subject: [Xen-devel] Re: c/s 23990:1c8789852eaf: xen crashes
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 14:29, Christoph Egger <Christoph.Egger@amd.com> wrote:
> c/s 23990:1c8789852eaf crashes xen due to a NULL pointer dereference
> within the xen kernel.

Would you be able to give the patch I just sent a try before I commit it?

Thanks, Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 07:10:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 07:10:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHFoC-00046e-7C; Fri, 21 Oct 2011 07:10:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHFlF-0003rG-6x
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 07:07:52 -0700
X-Env-Sender: JBeulich@suse.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1319206065!446651!1
X-Originating-IP: [130.57.49.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28763 invoked from network); 21 Oct 2011 14:07:46 -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; 21 Oct 2011 14:07:46 -0000
Received: from EMEA1-MTA by nat28.tlf.novell.com
	with Novell_GroupWise; Fri, 21 Oct 2011 15:07:45 +0100
Message-Id: <4EA198CF020000780005CC99@nat28.tlf.novell.com>
X-Mailer: Novell GroupWise Internet Agent 8.0.1 
Date: Fri, 21 Oct 2011 15:07:43 +0100
From: "Jan Beulich" <JBeulich@suse.com>
To: "Wei Wang2" <wei.wang2@amd.com>
Subject: Re: [Xen-devel] [PATCH 1 of 6] Move some ats functions into
	vendor neutraldirectories
References: <patchbomb.1319201719@gran.amd.com>
	<a559e27ffb2c2a3a90dc.1319201720@gran.amd.com>
	<4EA18B02020000780005CC0B@nat28.tlf.novell.com>
	<201110211557.22432.wei.wang2@amd.com>
In-Reply-To: <201110211557.22432.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>,
	Allen M Kay <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 21.10.11 at 15:57, Wei Wang2 <wei.wang2@amd.com> wrote:
> On Friday 21 October 2011 15:08:50 Jan Beulich wrote:
>> >>> On 21.10.11 at 14:55, Wei Wang <wei.wang2@amd.com> wrote:
>> >
>> > # HG changeset patch
>> > # User Wei Wang <wei.wang2@amd.com>
>> > # Date 1319201416 -7200
>> > # Node ID a559e27ffb2c2a3a90dc25f09205b66668dcdbbb
>> > # Parent  121af976b2988de389db139231103ceedd11bb8a
>> > Move some ats functions into vendor neutral directories.
>>
>> You move them from an x86-specific place to common code. I suppose
>> Intel had reasons to expect them to be implemented differently in ia64.
>> Hence they should go into e.g. xen/drivers/passthrough/x86/ instead.
>=20
> Well, we don't have that directory yet. Could we change folder structures=
 =20
> in=20
> passthrough to be architecture first, then vendors, for example:
> passthough/x86/vtd
> passthough/x86/amd                            =20
> passthough/ia64/vtd

That doesn't make sense - VT-d is for both ia64 and x86. Code that is
common between vendors but architecture specific would reasonably
belong into drivers/passthrough/<arch>/, which is what I
recommended.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 07:15:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 07:15:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHFsM-0004YG-9r; Fri, 21 Oct 2011 07:15:10 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHFrQ-0004LS-95
	for Xen-devel@lists.xensource.com; Fri, 21 Oct 2011 07:14:13 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-2.tower-182.messagelabs.com!1319206448!299922!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3288 invoked from network); 21 Oct 2011 14:14:09 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-2.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	21 Oct 2011 14:14:09 -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 1966A162D;
	Fri, 21 Oct 2011 17:14:08 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id DF9AA200E9; Fri, 21 Oct 2011 17:14:07 +0300 (EEST)
Date: Fri, 21 Oct 2011 17:14:07 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Paolo Bonzini <pbonzini@redhat.com>
Message-ID: <20111021141407.GC12984@reaktio.net>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
	<93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
	<20111021061156.GZ12984@reaktio.net> <4EA1728D.3000100@redhat.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <4EA1728D.3000100@redhat.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Alok Sinha <aksinha@yahoo-inc.com>, Ian Campbell <Ian.Campbell@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: Question on RHEL 6 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, Oct 21, 2011 at 03:24:29PM +0200, Paolo Bonzini wrote:
> On 10/21/2011 08:11 AM, Pasi Kärkkäinen wrote:
>>> >
>>> >      Thanks for your response.
>>> >      So how do I disable xen platform device for VM? Any pointers?
>>> >
>> You should be able to change it from/etc/xen/<name_of_the_vm>  configfile.
>>
>> Try:
>> xen_platform_pci=0
>
> That doesn't exist.
>

Hmm, or is it:
xen_platform_device=0

Anyway there definitely is a configuration option for controlling the xen platform pci device,
which can enable or disable PVHVM drivers.

I can't just remember which one the option is called.. 
(and I can't grep the sources right now.. travelling.)

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 08:29:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 08:29:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHH2F-0008T9-Hs; Fri, 21 Oct 2011 08:29:27 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHH1i-0008Gf-L3; Fri, 21 Oct 2011 08:28:55 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1319210931!1160471!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28792 invoked from network); 21 Oct 2011 15:28:51 -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;
	21 Oct 2011 15:28:51 -0000
Received: by wwf10 with SMTP id 10so4992868wwf.24
	for <multiple recipients>; Fri, 21 Oct 2011 08:28:50 -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=xDZfFI9Ui883ij2bp+3uLkUS46lu9s44A6KTMUwx1wI=;
	b=OmHyBSDge/NA4+F00teHaTTJik1GhqijFswg9TpRbMpDHYSN13e3biwnciIgUzf2Di
	yh6tSbqTnFkJe0r3wjrIYA8Ib7T+JcOB5Y7AK7+BcoMrPmrkGP26Fnl7tl2CgYnMMz+h
	6Nwh/Dw0/oG5VHkHvF1STXLWeer/kFA58v+KU=
Received: by 10.216.14.91 with SMTP id c69mr5719476wec.53.1319210930522;
	Fri, 21 Oct 2011 08:28:50 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id
	fy13sm22383169wbb.18.2011.10.21.08.28.48
	(version=SSLv3 cipher=OTHER); Fri, 21 Oct 2011 08:28:49 -0700 (PDT)
Message-ID: <4EA18FAD.7080102@xen.org>
Date: Fri, 21 Oct 2011 16:28:45 +0100
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: Joseph Glanville <joseph.glanville@orionvm.com.au>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111018132618.GA19611@phenom.dumpdata.com>
	<1319013528.3385.59.camel@zakaz.uk.xensource.com>
	<4E9F1361.5020906@xen.org>
	<CAOzFzEjioey=65ACAJH50Nf+gHUt4HCXupfY9bHwaqCMEoquow@mail.gmail.com>
In-Reply-To: <CAOzFzEjioey=65ACAJH50Nf+gHUt4HCXupfY9bHwaqCMEoquow@mail.gmail.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"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>,
	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 21/10/2011 04:44, Joseph Glanville wrote:
> I think we should aim to get a meeting of interested parties happening 
> on IRC before we action on a date or plan.
> I just don't want to get started on something that will stall due to 
> lack of direction.
>
> <rant>
I am happy to hang out with a few the day before the docs day and 
coordinate a bit
I think there is a lot we can do though

> I am happy to contribute my time to do a significant amount of the 
> work that bofh has requested but to do so effectively I really think 
> we need somewhat of a clean start.
> The current wiki contains too much content that just doesn't belong in 
> the wiki, job postings, WIP status on projects that have long since 
> died etc.
Agreed that some stuff should just be deleted. The key issues is that 
the wiki today has a flat structure.
I am happy to delete stuff like job postings, old minutes, WIP status 
and truly dead stuff and archive plain old stuff (which may still be of 
value to some people.

I think its unfair to say Xen is a schizophrenic project. The issue has 
been that the Wiki has not been managed ever and MoinMoin is inherently 
unmanageable

> I did get started on a full categorization of pages in the wiki but 
> that quickly become something that is abit much to do in one session 
> or alone for that matter.
Agreed and categories don't work well with MoinMoin

> It also highlighted some severe problems with how the current wiki is 
> used - in my opinion atleast. It is my view that the official wiki 
> should be reserved for highly relevant documentation.
I would agree with you, if we were in a perfect world. But we have 
baggage, so to some degree this discussion is moot. I also think that 
this question is handled quite differently by different projects.

> I think we need to setup a guided rewrite/refactor of the core 
> documentation so it resembles something close to this:
>
> Overview (brief introduction, architecture, why xen is different and 
> maybe abit of xen philosophy)
> Getting started guide ( Installation of Xen on Debian - probably the 
> simplest and easiest way to get started with Xen at the moment, start 
> a Debian PV guest, start at Windows HVM guest)
> Installation guide ( More indepth covering all the core distros and 
> some more advanced installations including compilation from source and 
> using the Linux 3.1 kernel, networking options etc)
> Administration guide ( This bit requires atlot of discussion, do we 
> recommend xm still? should we only support xl? If that is the case how 
> to we recommend stuff like managed domains etc..)
> Advanced topics.. stuff like Networking, PCI passthrough etc deserve 
> their own pages
Are you suggesting we restructure the wiki front-page around this?

> There also needs to be a developers section, preferably seperate 
> entirely from the user documentation. If XCP could be sectioned off in 
> some matter also that would be advantageous - basically to prevent 
> confusion.
We do not have that many XCP pages. MoinMoin sucks at sectioning stuff 
off. The only thing which could sort of work is to use 
<namespace>/<pagename> ... we could have XCP/<pagename> and so on. If 
categories worked properly, they could be used too.

> The current wiki is poluted with alot of architecture and design info 
> that isn't of interest to a general user but is still key to 
> understanding Xen from a developers point of view.
Part of the issue is that it is hard for me to identify what is what. If 
I had a good approximation of what is what, I (or others) could just go 
through the motions and re-encode stuff accordingly.

> What the primary aim would be is to integrate as much best practices 
> into these pages rather than having them spread around hundreds of 
> wiki pages and even more mailing list posts.
> To be honest I rarely look to the wiki if I want to know how to do 
> something with Xen I am unfamilar with.. my first course of action is 
> to search my archive of xen-devel/xen-users which isn't exactly a good 
> thing.
>
> The biggest issue with this sort of compaction is that Xen is fraught 
> with choices.. there is just so many different ways of doing things.
>
> I'm not trying to be critical of those that have spent many hours 
> writing the current documentation, it is appreciated.
> I just think we need a really concentrated effort around making the 
> simple Xen tasks easier before expanding out to include the more 
> complicated stuff.
> Alot of us take for granted that we have been using Xen for a long 
> time and many of these things come so naturally to us - whereas from 
> the outside it all seems too difficult.
>
> </rant>
I think what you seem to be saying is that there would be extremely high 
value in having a "Getting started" guide and some other entry level 
documentation (even if just an index page) accessible from the wiki 
front page.

Lars

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 09:46:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 09:46:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHIF9-0008Qp-IY; Fri, 21 Oct 2011 09:46:51 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHIEH-0008E9-3V
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 09:45:57 -0700
X-Env-Sender: apxeng@gmail.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319215521!60206595!1
X-Originating-IP: [209.85.216.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17607 invoked from network); 21 Oct 2011 16:45:22 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	21 Oct 2011 16:45:22 -0000
Received: by qyk33 with SMTP id 33so875197qyk.9
	for <xen-devel@lists.xensource.com>;
	Fri, 21 Oct 2011 09:45:52 -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=IQBvKEEvF6ya840bGP3g2P0f/jd3xB6qypwntI9+MN0=;
	b=s/R5VJpoUPyenXop5+F4J2WSPDE50gnQONeXt7UnakZS3TxS10u/E746dhaBPKXT5a
	RfUG7H8nSO6tsYOXTOCEgWsnzBL/fB/5XP3qkP8fX+Xz8+YcH0PbwlhHWqEC49Uf0xHt
	5VLmM29+VPF7hhKJPIgUTrYET5F4JNWKEad0M=
MIME-Version: 1.0
Received: by 10.229.3.13 with SMTP id 13mr3252805qcl.206.1319215552172; Fri,
	21 Oct 2011 09:45:52 -0700 (PDT)
Received: by 10.229.74.19 with HTTP; Fri, 21 Oct 2011 09:45:51 -0700 (PDT)
Received: by 10.229.74.19 with HTTP; Fri, 21 Oct 2011 09:45:51 -0700 (PDT)
In-Reply-To: <20111021084442.GA9601@aepfle.de>
References: <CAGU+aut64MmMmf901p9Gsya4O=hep8merZUDfSUuJCJXMVFtrg@mail.gmail.com>
	<1319013780.3385.64.camel@zakaz.uk.xensource.com>
	<20126.62103.576976.140927@mariner.uk.xensource.com>
	<CAGU+autjm1EEKeDjQiuwixo0QAwwNntsFWZ9V6JSTZOhyWVadg@mail.gmail.com>
	<20111021084442.GA9601@aepfle.de>
Date: Fri, 21 Oct 2011 09:45:51 -0700
Message-ID: <CAGU+autpvRR72=BQ2riptnWNuSusTDdwoTmKTBqgYv1sdnOJJg@mail.gmail.com>
Subject: Re: [Xen-devel] make install not creating lib entries in /usr/lib
	under Ubunu 11.10
From: AP <apxeng@gmail.com>
To: Olaf Hering <olaf@aepfle.de>
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>
Content-Type: multipart/mixed; boundary="===============0425123661=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0425123661==
Content-Type: multipart/alternative; boundary=0016e64a7e945e92dc04afd1ce80

--0016e64a7e945e92dc04afd1ce80
Content-Type: text/plain; charset=ISO-8859-1

On Oct 21, 2011 1:44 AM, "Olaf Hering" <olaf@aepfle.de> wrote:
>
> On Thu, Oct 20, AP wrote:
>
> > I deleted my /usr/lib64 and did a "make install-tools
> > PYTHON_PREFIX_ARG=". At the end a /usr/lib64 directory was created
> > with Xen related libraries inside.
>
> Thats the correct place for 64bit libraries. If your distro likes to put
> these files in a non-standard place, set LIBLEAFDIR_x86_64 to lib in
> your own build environment.

Looks like that its what Ubuntu is doing. All 64-bit libraries are in
/use/lib on Ubuntu 11.10. It is the Xen "make install-tools" that is
creating the lib64 on the system though this did not happen on 10.10 /
11.04. Everything ended up in usr/lib.

> Olaf

--0016e64a7e945e92dc04afd1ce80
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<p><br>
On Oct 21, 2011 1:44 AM, &quot;Olaf Hering&quot; &lt;<a href=3D"mailto:olaf=
@aepfle.de">olaf@aepfle.de</a>&gt; wrote:<br>
&gt;<br>
&gt; On Thu, Oct 20, AP wrote:<br>
&gt;<br>
&gt; &gt; I deleted my /usr/lib64 and did a &quot;make install-tools<br>
&gt; &gt; PYTHON_PREFIX_ARG=3D&quot;. At the end a /usr/lib64 directory was=
 created<br>
&gt; &gt; with Xen related libraries inside.<br>
&gt;<br>
&gt; Thats the correct place for 64bit libraries. If your distro likes to p=
ut<br>
&gt; these files in a non-standard place, set LIBLEAFDIR_x86_64 to lib in<b=
r>
&gt; your own build environment.</p>
<p>Looks like that its what Ubuntu is doing. All 64-bit libraries are in /u=
se/lib on Ubuntu 11.10. It is the Xen &quot;make install-tools&quot; that i=
s creating the lib64 on the system though this did not happen on 10.10 / 11=
.04. Everything ended up in usr/lib.</p>

<p>&gt; Olaf<br>
</p>

--0016e64a7e945e92dc04afd1ce80--


--===============0425123661==
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

--===============0425123661==--


From xen-devel-bounces@lists.xensource.com Fri Oct 21 10:12:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 10:12:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHIdU-0000qt-1k; Fri, 21 Oct 2011 10:12:00 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RHIbx-0000e5-7X
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 10:10:26 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319217020!1176069!1
X-Originating-IP: [143.182.124.37]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2578 invoked from network); 21 Oct 2011 17:10:21 -0000
Received: from mga14.intel.com (HELO mga14.intel.com) (143.182.124.37)
	by server-5.tower-21.messagelabs.com with SMTP;
	21 Oct 2011 17:10:21 -0000
Received: from azsmga001.ch.intel.com ([10.2.17.19])
	by azsmga102.ch.intel.com with ESMTP; 21 Oct 2011 10:10:19 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,386,1315206000"; d="scan'208";a="65022968"
Received: from orsmsx603.amr.corp.intel.com ([10.22.226.49])
	by azsmga001.ch.intel.com with ESMTP; 21 Oct 2011 10:10:19 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx603.amr.corp.intel.com ([10.22.226.49]) with mapi;
	Fri, 21 Oct 2011 10:10:03 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jan Beulich <JBeulich@suse.com>, "xen-devel@lists.xensource.com"
	<xen-devel@lists.xensource.com>
Date: Fri, 21 Oct 2011 10:10:02 -0700
Thread-Topic: [PATCH] VT-d/ATS: cleanup
Thread-Index: AcyPyFf8Y4U3nQ/OSNmbZOZNBIhzuAAS+UBQ
Message-ID: <987664A83D2D224EAE907B061CE93D5301F1E58757@orsmsx505.amr.corp.intel.com>
References: <4EA1441E020000780005CA81@nat28.tlf.novell.com>
In-Reply-To: <4EA1441E020000780005CA81@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: 
Subject: [Xen-devel] RE: [PATCH] VT-d/ATS: cleanup
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ack!

Allen

-----Original Message-----
From: Jan Beulich [mailto:JBeulich@suse.com]=20
Sent: Friday, October 21, 2011 1:06 AM
To: xen-devel@lists.xensource.com
Cc: Kay, Allen M
Subject: [PATCH] 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>

--- a/xen/drivers/passthrough/vtd/dmar.c
+++ b/xen/drivers/passthrough/vtd/dmar.c
@@ -160,7 +160,7 @@ static int __init acpi_register_atsr_uni
     return 0;
 }
=20
-struct acpi_drhd_unit * acpi_find_matched_drhd_unit(struct pci_dev *pdev)
+struct acpi_drhd_unit *acpi_find_matched_drhd_unit(const struct pci_dev=20
+*pdev)
 {
     u8 bus, devfn;
     struct acpi_drhd_unit *drhd;
@@ -204,17 +204,17 @@ struct acpi_drhd_unit * acpi_find_matche
     return include_all;
 }
=20
-struct acpi_atsr_unit * acpi_find_matched_atsr_unit(u16 seg, u8 bus, u8 de=
vfn)
+struct acpi_atsr_unit *acpi_find_matched_atsr_unit(const struct pci_dev=20
+*pdev)
 {
     struct acpi_atsr_unit *atsr;
     struct acpi_atsr_unit *all_ports =3D NULL;
=20
     list_for_each_entry ( atsr, &acpi_atsr_units, list )
     {
-        if ( atsr->segment !=3D seg )
+        if ( atsr->segment !=3D pdev->seg )
             continue;
=20
-        if ( test_bit(bus, atsr->scope.buses) )
+        if ( test_bit(pdev->bus, atsr->scope.buses) )
             return atsr;
=20
         if ( atsr->all_ports )
--- a/xen/drivers/passthrough/vtd/dmar.h
+++ b/xen/drivers/passthrough/vtd/dmar.h
@@ -86,8 +86,8 @@ struct acpi_rhsa_unit {
         for (idx =3D 0; (bdf =3D rmrr->scope.devices[idx]) && \
                  idx < rmrr->scope.devices_cnt; idx++)
=20
-struct acpi_drhd_unit * acpi_find_matched_drhd_unit(struct pci_dev *pdev);=
 -struct acpi_atsr_unit * acpi_find_matched_atsr_unit(u16 seg, u8 bus, u8 d=
evfn);
+struct acpi_drhd_unit *acpi_find_matched_drhd_unit(const struct pci_dev=20
+*); struct acpi_atsr_unit *acpi_find_matched_atsr_unit(const struct=20
+pci_dev *);
=20
 #define DMAR_TYPE 1
 #define RMRR_TYPE 2
--- a/xen/drivers/passthrough/vtd/extern.h
+++ b/xen/drivers/passthrough/vtd/extern.h
@@ -61,10 +61,9 @@ extern bool_t ats_enabled;
=20
 struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
=20
-int ats_device(int seg, int bus, int devfn);
+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_devi=
ce(int seg, int bus, int devfn); -int invalidate_ats_tcs(struct iommu *iomm=
u);
=20
 int dev_invalidate_iotlb(struct iommu *iommu, u16 did,
                          u64 addr, unsigned int size_order, u64 type); @@ =
-76,7 +75,8 @@ static inline struct acpi_drhd_unit *fin
     return NULL;
 }
=20
-static inline int ats_device(int seg, int bus, int devfn)
+static inline int ats_device(const struct pci_dev *pdev,
+                             const struct acpi_drhd_unit *drhd)
 {
     return 0;
 }
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1410,7 +1410,7 @@ static int domain_context_mapping(
                     domain->domain_id, seg, bus,
                     PCI_SLOT(devfn), PCI_FUNC(devfn));
         ret =3D domain_context_mapping_one(domain, drhd->iommu, bus, devfn=
);
-        if ( !ret && ats_device(seg, bus, devfn) )
+        if ( !ret && ats_device(pdev, drhd) > 0 )
             enable_ats_device(seg, bus, devfn);
=20
         break;
@@ -1541,7 +1541,7 @@ static int domain_context_unmap(
                     domain->domain_id, seg, bus,
                     PCI_SLOT(devfn), PCI_FUNC(devfn));
         ret =3D domain_context_unmap_one(domain, iommu, bus, devfn);
-        if ( !ret && ats_device(seg, bus, devfn) )
+        if ( !ret && ats_device(pdev, drhd) > 0 )
             disable_ats_device(seg, bus, devfn);
=20
         break;
--- a/xen/drivers/passthrough/vtd/x86/ats.c
+++ b/xen/drivers/passthrough/vtd/x86/ats.c
@@ -83,40 +83,32 @@ struct acpi_drhd_unit * find_ats_dev_drh
     return NULL;
 }
=20
-int ats_device(int seg, int bus, int devfn)
+int ats_device(const struct pci_dev *pdev, const struct acpi_drhd_unit=20
+*drhd)
 {
-    struct acpi_drhd_unit *drhd, *ats_drhd, *new_drhd;
-    struct pci_dev *pdev;
-    int pos =3D 0;
+    struct acpi_drhd_unit *ats_drhd;
+    int pos;
=20
     if ( !ats_enabled || !iommu_qinval )
         return 0;
=20
-    pdev =3D pci_get_pdev(seg, bus, devfn);
-    if ( !pdev )
-        return 0;
-
-    drhd =3D acpi_find_matched_drhd_unit(pdev);
-    if ( !drhd )
-        return 0;
-
     if ( !ecap_queued_inval(drhd->iommu->ecap) ||
          !ecap_dev_iotlb(drhd->iommu->ecap) )
         return 0;
=20
-    if ( !acpi_find_matched_atsr_unit(seg, bus, devfn) )
+    if ( !acpi_find_matched_atsr_unit(pdev) )
         return 0;
=20
     ats_drhd =3D find_ats_dev_drhd(drhd->iommu);
-    pos =3D pci_find_ext_capability(seg, bus, devfn, PCI_EXT_CAP_ID_ATS);
+    pos =3D pci_find_ext_capability(pdev->seg, pdev->bus, pdev->devfn,
+                                  PCI_EXT_CAP_ID_ATS);
=20
     if ( pos && (ats_drhd =3D=3D NULL) )
     {
-        new_drhd =3D xmalloc(struct acpi_drhd_unit);
-        if ( !new_drhd )
-            return 0;
-        memcpy(new_drhd, drhd, sizeof(struct acpi_drhd_unit));
-        list_add_tail(&new_drhd->list, &ats_dev_drhd_units);
+        ats_drhd =3D xmalloc(struct acpi_drhd_unit);
+        if ( !ats_drhd )
+            return -ENOMEM;
+        *ats_drhd =3D *drhd;
+        list_add_tail(&ats_drhd->list, &ats_dev_drhd_units);
     }
     return pos;
 }



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 10:13:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 10:13:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHIec-0001Ek-W5; Fri, 21 Oct 2011 10:13:11 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RHIdY-0000re-2S
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 10:12:04 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1319217120!570802!1
X-Originating-IP: [134.134.136.24]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14031 invoked from network); 21 Oct 2011 17:12:00 -0000
Received: from mga09.intel.com (HELO mga09.intel.com) (134.134.136.24)
	by server-15.tower-216.messagelabs.com with SMTP;
	21 Oct 2011 17:12:00 -0000
Received: from orsmga002.jf.intel.com ([10.7.209.21])
	by orsmga102.jf.intel.com with ESMTP; 21 Oct 2011 10:11:59 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,351,1309762800"; d="scan'208";a="65522980"
Received: from orsmsx602.amr.corp.intel.com ([10.22.226.211])
	by orsmga002.jf.intel.com with ESMTP; 21 Oct 2011 10:11:59 -0700
Received: from orsmsx605.amr.corp.intel.com (10.22.226.10) by
	orsmsx602.amr.corp.intel.com (10.22.226.211) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Fri, 21 Oct 2011 10:11:59 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx605.amr.corp.intel.com ([10.22.226.10]) with mapi;
	Fri, 21 Oct 2011 10:11:59 -0700
From: "Kay, Allen M" <allen.m.kay@intel.com>
To: Jan Beulich <JBeulich@suse.com>, "xen-devel@lists.xensource.com"
	<xen-devel@lists.xensource.com>
Date: Fri, 21 Oct 2011 10:11:58 -0700
Thread-Topic: [PATCH] passthrough: re-attempt ACS and ATS enabling when
	devices get reported by Dom0
Thread-Index: AcyPyO5RhB2GOVVgThyo8wt/nVzJpAAS5E1Q
Message-ID: <987664A83D2D224EAE907B061CE93D5301F1E58764@orsmsx505.amr.corp.intel.com>
References: <4EA1451E020000780005CA8C@nat28.tlf.novell.com>
In-Reply-To: <4EA1451E020000780005CA8C@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: 
Subject: [Xen-devel] RE: [PATCH] passthrough: re-attempt ACS and ATS
	enabling when devices get reported by Dom0
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Ack!  Thanks Jan.

Allen

-----Original Message-----
From: Jan Beulich [mailto:JBeulich@suse.com]=20
Sent: Friday, October 21, 2011 1:11 AM
To: xen-devel@lists.xensource.com
Cc: Kay, Allen M
Subject: [PATCH] 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 E=
820 table, which the specification allows to be the case), functionality en=
abling 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>

--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -150,6 +150,23 @@ int iommu_add_device(struct pci_dev *pde
     return hd->platform_ops->add_device(pdev);
 }
=20
+int iommu_enable_device(struct pci_dev *pdev) {
+    struct hvm_iommu *hd;
+
+    if ( !pdev->domain )
+        return -EINVAL;
+
+    ASSERT(spin_is_locked(&pcidevs_lock));
+
+    hd =3D domain_hvm_iommu(pdev->domain);
+    if ( !iommu_enabled || !hd->platform_ops ||
+         !hd->platform_ops->enable_device )
+        return 0;
+
+    return hd->platform_ops->enable_device(pdev);
+}
+
 int iommu_remove_device(struct pci_dev *pdev)  {
     struct hvm_iommu *hd;
--- a/xen/drivers/passthrough/pci.c
+++ b/xen/drivers/passthrough/pci.c
@@ -258,7 +258,7 @@ struct pci_dev *pci_get_pdev_by_domain(
  * pci_enable_acs - enable ACS if hardware support it
  * @dev: the PCI device
  */
-void pci_enable_acs(struct pci_dev *pdev)
+static void pci_enable_acs(struct pci_dev *pdev)
 {
     int pos;
     u16 cap, ctrl, seg =3D pdev->seg;
@@ -409,8 +409,11 @@ int pci_add_device(u16 seg, u8 bus, u8 d
         }
=20
         list_add(&pdev->domain_list, &dom0->arch.pdev_list);
-        pci_enable_acs(pdev);
     }
+    else
+        iommu_enable_device(pdev);
+
+    pci_enable_acs(pdev);
=20
 out:
     spin_unlock(&pcidevs_lock);
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -1900,6 +1900,19 @@ static int intel_iommu_add_device(struct
     return ret;
 }
=20
+static int intel_iommu_enable_device(struct pci_dev *pdev) {
+    struct acpi_drhd_unit *drhd =3D acpi_find_matched_drhd_unit(pdev);
+    int ret =3D drhd ? ats_device(pdev, drhd) : -ENODEV;
+
+    if ( ret <=3D 0 )
+        return ret;
+
+    ret =3D enable_ats_device(pdev->seg, pdev->bus, pdev->devfn);
+
+    return ret >=3D 0 ? 0 : ret;
+}
+
 static int intel_iommu_remove_device(struct pci_dev *pdev)  {
     struct acpi_rmrr_unit *rmrr;
@@ -1930,7 +1943,6 @@ static int intel_iommu_remove_device(str  static void=
 __init setup_dom0_device(struct pci_dev *pdev)  {
     domain_context_mapping(pdev->domain, pdev->seg, pdev->bus, pdev->devfn=
);
-    pci_enable_acs(pdev);
     pci_vtd_quirk(pdev);
 }
=20
@@ -2301,6 +2313,7 @@ const struct iommu_ops intel_iommu_ops =3D
     .init =3D intel_iommu_domain_init,
     .dom0_init =3D intel_iommu_dom0_init,
     .add_device =3D intel_iommu_add_device,
+    .enable_device =3D intel_iommu_enable_device,
     .remove_device =3D intel_iommu_remove_device,
     .assign_device  =3D intel_iommu_assign_device,
     .teardown =3D iommu_domain_teardown,
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -70,6 +70,7 @@ int iommu_enable_x2apic_IR(void);  void iommu_disable_x2a=
pic_IR(void);
=20
 int iommu_add_device(struct pci_dev *pdev);
+int iommu_enable_device(struct pci_dev *pdev);
 int iommu_remove_device(struct pci_dev *pdev);  int iommu_domain_init(stru=
ct domain *d);  void iommu_dom0_init(struct domain *d); @@ -120,6 +121,7 @@=
 struct iommu_ops {
     int (*init)(struct domain *d);
     void (*dom0_init)(struct domain *d);
     int (*add_device)(struct pci_dev *pdev);
+    int (*enable_device)(struct pci_dev *pdev);
     int (*remove_device)(struct pci_dev *pdev);
     int (*assign_device)(struct domain *d, u16 seg, u8 bus, u8 devfn);
     void (*teardown)(struct domain *d);
--- a/xen/include/xen/pci.h
+++ b/xen/include/xen/pci.h
@@ -134,6 +134,5 @@ struct pirq;
 int msixtbl_pt_register(struct domain *, struct pirq *, uint64_t gtable); =
 void msixtbl_pt_unregister(struct domain *, struct pirq *);  void msixtbl_=
pt_cleanup(struct domain *d); -void pci_enable_acs(struct pci_dev *pdev);
=20
 #endif /* __XEN_PCI_H__ */



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 21 11:10:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 11: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 1RHJYQ-00034D-Un; Fri, 21 Oct 2011 11:10:51 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHJWm-0002qs-G9
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 11:09:23 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1319220545!1182287!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8062 invoked from network); 21 Oct 2011 18:09:05 -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;
	21 Oct 2011 18:09:05 -0000
X-IronPort-AV: E=Sophos;i="4.69,387,1315180800"; 
   d="scan'208";a="8528525"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	21 Oct 2011 18:09: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; Fri, 21 Oct 2011 19:09:04 +0100
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 1RHJWi-0000pC-CG;
	Fri, 21 Oct 2011 18:09:04 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RHJWi-0002CZ-8n;
	Fri, 21 Oct 2011 19:09:04 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9363-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 21 Oct 2011 19:09:04 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9363: 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 9363 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9363/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-pair          20 leak-check/check/src_host  fail REGR. vs. 9355
 test-i386-i386-pair          21 leak-check/check/dst_host  fail REGR. vs. 9355
 test-amd64-amd64-pair        21 leak-check/check/dst_host  fail REGR. vs. 9355
 test-amd64-amd64-pair        20 leak-check/check/src_host  fail REGR. vs. 9355
 test-amd64-i386-xl-credit2   12 guest-saverestore.2        fail REGR. vs. 9355
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10     fail REGR. vs. 9355
 test-amd64-i386-xl-win-vcpus1  7 windows-install           fail REGR. vs. 9355
 test-amd64-amd64-win          7 windows-install            fail REGR. vs. 9355
 test-amd64-i386-win           7 windows-install            fail REGR. vs. 9355

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-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-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                  a7ccbc79fc17
baseline version:
 xen                  6c583d35d76d

------------------------------------------------------------
People who touched revisions under test:
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  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                                   fail    
 test-amd64-amd64-xl-pcipt-intel                              fail    
 test-amd64-i386-rhel6hvm-intel                               fail    
 test-amd64-i386-xl-multivcpu                                 pass    
 test-amd64-amd64-pair                                        broken  
 test-amd64-i386-pair                                         pass    
 test-i386-i386-pair                                          broken  
 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:   23991:a7ccbc79fc17
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:45:24 2011 +0200
    
    cpumask <=> xenctl_cpumap: allocate CPU masks and byte maps dynamically
    
    Generally there was a NR_CPUS-bits wide array in these functions and
    another (through a cpumask_t) on their callers' stacks, which may get
    a little large for big NR_CPUS. As the functions can fail anyway, do
    the allocation in there.
    
    For the x86/MCA case this require a little code restructuring: By using
    different CPU mask accessors it was possible to avoid allocating a mask
    in the broadcast case. Also, this was the only user that failed to
    check the return value of the conversion function (which could have led
    to undefined behvior).
    
    Also constify the input parameters of the two functions.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23990:1c8789852eaf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:44:47 2011 +0200
    
    x86/hpet: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23989:8269826353d8
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:44:03 2011 +0200
    
    credit: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23988:53528bab2eb4
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:43:35 2011 +0200
    
    cpupools: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23987:2682094bc243
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:42:47 2011 +0200
    
    x86/p2m: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Acked-by: Keir Fraser <keir@xen.org>
    
    --- 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);
     }
    
     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);
    
         if (old_flags & _PAGE_PRESENT)
    -        flush_tlb_mask(&p2m->p2m_dirty_cpumask);
    +        flush_tlb_mask(p2m->dirty_cpumask);
    
         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 = p2m_access_rwx;
    
         p2m->cr3 = CR3_EADDR;
    -    cpumask_clear(&p2m->p2m_dirty_cpumask);
    
         if ( hap_enabled(d) && (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) )
             ept_p2m_init(p2m);
    @@ -102,6 +101,8 @@ p2m_init_nestedp2m(struct domain *d)
             d->arch.nested_p2m[i] = p2m = xzalloc(struct p2m_domain);
             if (p2m == NULL)
                 return -ENOMEM;
    +        if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
    +            return -ENOMEM;
             p2m_initialise(d, p2m);
             p2m->write_p2m_entry = 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) = p2m = xzalloc(struct p2m_domain);
         if ( p2m == NULL )
             return -ENOMEM;
    +    if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
    +    {
    +        xfree(p2m);
    +        return -ENOMEM;
    +    }
         p2m_initialise(d, p2m);
    
         /* Must initialise nestedp2m unconditionally
    @@ -333,6 +339,9 @@ static void p2m_teardown_nestedp2m(struc
         uint8_t i;
    
         for (i = 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] = 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 = NULL;
    +    if ( d->arch.p2m )
    +    {
    +        free_cpumask_var(d->arch.p2m->dirty_cpumask);
    +        xfree(d->arch.p2m);
    +        d->arch.p2m = NULL;
    +    }
    
         /* We must teardown unconditionally because
          * we initialise them unconditionally.
    @@ -1200,7 +1213,7 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
                 if (p2m->cr3 == CR3_EADDR)
                     hvm_asid_flush_vcpu(v);
                 p2m->cr3 = 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 = cr3;
         nv->nv_flushp2m = 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);
    
    --- 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;
    
         struct domain     *domain;   /* back pointer to domain */
    
    
changeset:   23986:253073b522f8
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:23:05 2011 +0200
    
    allocate CPU sibling and core maps dynamically
    
    ... thus reducing the per-CPU data area size back to one page even when
    building for large NR_CPUS.
    
    At once eliminate the old __cpu{mask,list}_scnprintf() helpers.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23985:eef4641d6726
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:22:02 2011 +0200
    
    x86: allocate IRQ actions' cpu_eoi_map dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23984:07d303ff2757
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:21:09 2011 +0200
    
    eliminate direct assignments of CPU masks
    
    Use cpumask_copy() instead of direct variable assignments for copying
    CPU masks. While direct assignments are not a problem when both sides
    are variables actually defined as cpumask_t (except for possibly
    copying *much* more than would actually need to be copied), they must
    not happen when the original variable is of type cpumask_var_t (which
    may have lass space allocated to it than a full cpumask_t). Eliminate
    as many of such assignments as possible (in several cases it's even
    possible to collapse two operations [copy then clear one bit] into one
    [cpumask_andnot()]), and thus set the way for reducing the allocation
    size in alloc_cpumask_var().
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23983:1a4223c62ee7
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:19:44 2011 +0200
    
    eliminate cpumask accessors referencing NR_CPUS
    
    ... in favor of using the new, nr_cpumask_bits-based ones.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23982:511d5e65a302
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:17:42 2011 +0200
    
    introduce and use nr_cpu_ids and nr_cpumask_bits
    
    The former is the runtime equivalent of NR_CPUS (and users of NR_CPUS,
    where necessary, get adjusted accordingly), while the latter is for the
    sole use of determining the allocation size when dynamically allocating
    CPU masks (done later in this series).
    
    Adjust accessors to use either of the two to bound their bitmap
    operations - which one gets used depends on whether accessing the bits
    in the gap between nr_cpu_ids and nr_cpumask_bits is benign but more
    efficient.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23981:6c583d35d76d
user:        Tim Deegan <tim@xen.org>
date:        Thu Oct 20 15:36:01 2011 +0100
    
    x86/mm/p2m: don't leak state if nested-p2m init fails.
    
    Signed-off-by: Tim Deegan <tim@xen.org>
    
    
========================================
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 Fri Oct 21 13:26:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 13:26:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHLfO-0007pi-3E; Fri, 21 Oct 2011 13:26:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RHLed-0007dH-4w
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 13:25:23 -0700
X-Env-Sender: jinsong.liu@intel.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1319228718!583889!1
X-Originating-IP: [192.55.52.93]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17102 invoked from network); 21 Oct 2011 20:25:19 -0000
Received: from mga11.intel.com (HELO mga11.intel.com) (192.55.52.93)
	by server-7.tower-216.messagelabs.com with SMTP;
	21 Oct 2011 20:25:19 -0000
Received: from fmsmga001.fm.intel.com ([10.253.24.23])
	by fmsmga102.fm.intel.com with ESMTP; 21 Oct 2011 13:25:18 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,388,1315206000"; d="scan'208";a="76251838"
Received: from pgsmsx601.gar.corp.intel.com ([10.221.43.69])
	by fmsmga001.fm.intel.com with ESMTP; 21 Oct 2011 13:25:16 -0700
Received: from pgsmsx151.gar.corp.intel.com (172.30.236.41) by
	pgsmsx601.gar.corp.intel.com (10.221.43.69) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Sat, 22 Oct 2011 04:25:16 +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; Sat, 22 Oct 2011 04:25:15 +0800
Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by
	SHSMSX602.ccr.corp.intel.com ([10.239.4.104]) with mapi;
	Sat, 22 Oct 2011 04:25:14 +0800
From: "Liu, Jinsong" <jinsong.liu@intel.com>
To: Jan Beulich <JBeulich@suse.com>, "keir.xen@gmail.com"
	<keir.xen@gmail.com>, "tim.deegan@citrix.com" <tim.deegan@citrix.com>, 
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Sat, 22 Oct 2011 04:25:12 +0800
Thread-Topic: [PATCH] X86 MCE: Add SRAR handler
Thread-Index: AcyQL4kBGjjvch6hQ7KbjwjgOGN/OA==
Message-ID: <BC00F5384FCFC9499AF06F92E8B78A9E26A4F3C1DA@shsmsx502.ccr.corp.intel.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: yes
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
Content-Type: multipart/mixed;
	boundary="_002_BC00F5384FCFC9499AF06F92E8B78A9E26A4F3C1DAshsmsx502ccrc_"
MIME-Version: 1.0
Cc: "Liu, Jinsong" <jinsong.liu@intel.com>, "Jiang,
	Yunhong" <yunhong.jiang@intel.com>, "Shan, Haitao" <haitao.shan@intel.com>
Subject: [Xen-devel] [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

--_002_BC00F5384FCFC9499AF06F92E8B78A9E26A4F3C1DAshsmsx502ccrc_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Jan,

I update a little for my former patch, as attached.
For my former patch, you mainly have 2 concerns (list below). I double chec=
k xen mce code, w/ my opinion append:

Concern 1: for SRAR IFU error, since RIPV=3DEIPV=3D0, it maybe an async err=
or 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 hin=
t, warning us async possibility).=20
    It no need to overkill xen at mce isr, instead, at mce softirq we can f=
ind 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;
    * at mce softirq:
            /* detect error location by bank->mc_addr */
            /* handle different page OWNER cases at intel_memerr_dhandler()=
 and offline_page() */
            /* who own, who take */
            if (error page owner is guest)
                trigger vmce to guest;
            else
                panic xen;


Concern 2: If a guest accesses the hypervisor part of the GDT or page table=
s, or some other shared data structure owned by the hypervisor (like the M2=
P table), its handler may get utterly confused by being presented an addres=
s it doesn't own and knows nothing about.
[Jinsong]: for such cases, page owner would be dom_xen/dom_cow or NULL, but=
 not guest --> it would be handled at hypervisor, not triggering vmce to gu=
est --> who own, who take.


Thanks,
Jinsong

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D
X86 MCE: Add SRAR handler

Currently Intel SDM add 2 kinds of MCE SRAR errors:
1). Data Load error, error code =3D 0x134
2). Instruction Fetch error, error code =3D 0x150
This patch add handler to these new SRAR errors.
It based on existed mce infrastructure, add code to handle SRAR specific er=
ror.

Signed-off-by: Liu, Jinsong <jinsong.liu@intel.com>

diff -r 1515484353c6 xen/arch/x86/cpu/mcheck/mce_intel.c
--- a/xen/arch/x86/cpu/mcheck/mce_intel.c	Thu Oct 13 10:09:28 2011 +0200
+++ b/xen/arch/x86/cpu/mcheck/mce_intel.c	Sat Oct 22 01:40:41 2011 +0800
@@ -37,6 +37,14 @@ static int __read_mostly nr_intel_ext_ms
  */
 #define INTEL_SRAO_MEM_SCRUB 0xC0 ... 0xCF
 #define INTEL_SRAO_L3_EWB    0x17A
+
+/*=20
+ * Currently Intel SDM define 2 kinds of srar errors:
+ * 1). Data Load error, error code =3D 0x134
+ * 2). Instruction Fetch error, error code =3D 0x150
+ */
+#define INTEL_SRAR_DATA_LOAD	0x134
+#define INTEL_SRAR_INSTR_FETCH	0x150
=20
 /* Thermal Hanlding */
 #ifdef CONFIG_X86_MCE_THERMAL
@@ -256,7 +264,7 @@ static enum mce_result mce_action(struct
         for ( i =3D 0; i < handler_num; i++ ) {
             if (handlers[i].owned_error(binfo.mib->mc_status))
             {
-                handlers[i].recovery_handler(&binfo, &bank_result);
+                handlers[i].recovery_handler(&binfo, &bank_result, regs);
                 if (worst_result < bank_result)
                     worst_result =3D bank_result;
                 break;
@@ -622,7 +630,8 @@ struct mcinfo_recovery *mci_add_pageoff_
=20
 static void intel_memerr_dhandler(
              struct mca_binfo *binfo,
-             enum mce_result *result)
+             enum mce_result *result,
+             struct cpu_user_regs *regs)
 {
     struct mcinfo_bank *bank =3D binfo->mib;
     struct mcinfo_global *global =3D binfo->mig;
@@ -721,6 +730,32 @@ vmce_failed:
     }
 }
=20
+static int intel_srar_check(uint64_t status)
+{
+    return ( intel_check_mce_type(status) =3D=3D intel_mce_ucr_srar );
+}
+
+static void intel_srar_dhandler(
+             struct mca_binfo *binfo,
+             enum mce_result *result,
+             struct cpu_user_regs *regs)
+{
+    uint64_t status =3D binfo->mib->mc_status;
+
+    /* For unknown srar error code, reset system */
+    *result =3D MCER_RESET;
+
+    switch ( status & INTEL_MCCOD_MASK )
+    {
+    case INTEL_SRAR_DATA_LOAD:
+    case INTEL_SRAR_INSTR_FETCH:
+        intel_memerr_dhandler(binfo, result, regs);
+        break;
+    default:
+        break;
+    }
+}
+
 static int intel_srao_check(uint64_t status)
 {
     return ( intel_check_mce_type(status) =3D=3D intel_mce_ucr_srao );
@@ -728,7 +763,8 @@ static int intel_srao_check(uint64_t sta
=20
 static void intel_srao_dhandler(
              struct mca_binfo *binfo,
-             enum mce_result *result)
+             enum mce_result *result,
+             struct cpu_user_regs *regs)
 {
     uint64_t status =3D binfo->mib->mc_status;
=20
@@ -741,7 +777,7 @@ static void intel_srao_dhandler(
         {
         case INTEL_SRAO_MEM_SCRUB:
         case INTEL_SRAO_L3_EWB:
-            intel_memerr_dhandler(binfo, result);
+            intel_memerr_dhandler(binfo, result, regs);
             break;
         default:
             break;
@@ -756,14 +792,15 @@ static int intel_default_check(uint64_t=20
=20
 static void intel_default_mce_dhandler(
              struct mca_binfo *binfo,
-             enum mce_result *result)
+             enum mce_result *result,
+             struct cpu_user_regs * regs)
 {
     uint64_t status =3D binfo->mib->mc_status;
     enum intel_mce_type type;
=20
     type =3D intel_check_mce_type(status);
=20
-    if (type =3D=3D intel_mce_fatal || type =3D=3D intel_mce_ucr_srar)
+    if (type =3D=3D intel_mce_fatal)
         *result =3D MCER_RESET;
     else
         *result =3D MCER_CONTINUE;
@@ -771,12 +808,14 @@ static void intel_default_mce_dhandler(
=20
 static const struct mca_error_handler intel_mce_dhandlers[] =3D {
     {intel_srao_check, intel_srao_dhandler},
+    {intel_srar_check, intel_srar_dhandler},
     {intel_default_check, intel_default_mce_dhandler}
 };
=20
 static void intel_default_mce_uhandler(
              struct mca_binfo *binfo,
-             enum mce_result *result)
+             enum mce_result *result,
+             struct cpu_user_regs *regs)
 {
     uint64_t status =3D binfo->mib->mc_status;
     enum intel_mce_type type;
@@ -785,8 +824,6 @@ static void intel_default_mce_uhandler(
=20
     switch (type)
     {
-    /* Panic if no handler for SRAR error */
-    case intel_mce_ucr_srar:
     case intel_mce_fatal:
         *result =3D MCER_RESET;
         break;
@@ -961,10 +998,8 @@ static int intel_recoverable_scan(u64 st
     /* SRAR error */
     else if ( ser_support && !(status & MCi_STATUS_OVER)=20
                 && !(status & MCi_STATUS_PCC) && (status & MCi_STATUS_S)
-                && (status & MCi_STATUS_AR) ) {
-        mce_printk(MCE_VERBOSE, "MCE: No SRAR error defined currently.\n")=
;
-        return 0;
-    }
+                && (status & MCi_STATUS_AR) && (status & MCi_STATUS_EN) )
+        return 1;
     /* SRAO error */
     else if (ser_support && !(status & MCi_STATUS_PCC)
                 && (status & MCi_STATUS_S) && !(status & MCi_STATUS_AR)
diff -r 1515484353c6 xen/arch/x86/cpu/mcheck/x86_mca.h
--- a/xen/arch/x86/cpu/mcheck/x86_mca.h	Thu Oct 13 10:09:28 2011 +0200
+++ b/xen/arch/x86/cpu/mcheck/x86_mca.h	Sat Oct 22 01:40:41 2011 +0800
@@ -151,7 +151,7 @@ struct mca_error_handler
     */
     int (*owned_error)(uint64_t status);
     void (*recovery_handler)(struct mca_binfo *binfo,
-                    enum mce_result *result);
+                    enum mce_result *result, struct cpu_user_regs *regs);
 };
=20
 /* Global variables */=

--_002_BC00F5384FCFC9499AF06F92E8B78A9E26A4F3C1DAshsmsx502ccrc_
Content-Type: application/octet-stream; name="srar-1.patch"
Content-Description: srar-1.patch
Content-Disposition: attachment; filename="srar-1.patch"; size=5680;
	creation-date="Sat, 22 Oct 2011 02:03:08 GMT";
	modification-date="Sat, 22 Oct 2011 01:40:42 GMT"
Content-Transfer-Encoding: base64

WDg2IE1DRTogQWRkIFNSQVIgaGFuZGxlcgoKQ3VycmVudGx5IEludGVsIFNETSBhZGQgMiBraW5k
cyBvZiBNQ0UgU1JBUiBlcnJvcnM6CjEpLiBEYXRhIExvYWQgZXJyb3IsIGVycm9yIGNvZGUgPSAw
eDEzNAoyKS4gSW5zdHJ1Y3Rpb24gRmV0Y2ggZXJyb3IsIGVycm9yIGNvZGUgPSAweDE1MApUaGlz
IHBhdGNoIGFkZCBoYW5kbGVyIHRvIHRoZXNlIG5ldyBTUkFSIGVycm9ycy4KSXQgYmFzZWQgb24g
ZXhpc3RlZCBtY2UgaW5mcmFzdHJ1Y3R1cmUsIGFkZCBjb2RlIHRvIGhhbmRsZSBTUkFSIHNwZWNp
ZmljIGVycm9yLgoKU2lnbmVkLW9mZi1ieTogTGl1LCBKaW5zb25nIDxqaW5zb25nLmxpdUBpbnRl
bC5jb20+CgpkaWZmIC1yIDE1MTU0ODQzNTNjNiB4ZW4vYXJjaC94ODYvY3B1L21jaGVjay9tY2Vf
aW50ZWwuYwotLS0gYS94ZW4vYXJjaC94ODYvY3B1L21jaGVjay9tY2VfaW50ZWwuYwlUaHUgT2N0
IDEzIDEwOjA5OjI4IDIwMTEgKzAyMDAKKysrIGIveGVuL2FyY2gveDg2L2NwdS9tY2hlY2svbWNl
X2ludGVsLmMJU2F0IE9jdCAyMiAwMTo0MDo0MSAyMDExICswODAwCkBAIC0zNyw2ICszNywxNCBA
QCBzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgbnJfaW50ZWxfZXh0X21zCiAgKi8KICNkZWZpbmUg
SU5URUxfU1JBT19NRU1fU0NSVUIgMHhDMCAuLi4gMHhDRgogI2RlZmluZSBJTlRFTF9TUkFPX0wz
X0VXQiAgICAweDE3QQorCisvKiAKKyAqIEN1cnJlbnRseSBJbnRlbCBTRE0gZGVmaW5lIDIga2lu
ZHMgb2Ygc3JhciBlcnJvcnM6CisgKiAxKS4gRGF0YSBMb2FkIGVycm9yLCBlcnJvciBjb2RlID0g
MHgxMzQKKyAqIDIpLiBJbnN0cnVjdGlvbiBGZXRjaCBlcnJvciwgZXJyb3IgY29kZSA9IDB4MTUw
CisgKi8KKyNkZWZpbmUgSU5URUxfU1JBUl9EQVRBX0xPQUQJMHgxMzQKKyNkZWZpbmUgSU5URUxf
U1JBUl9JTlNUUl9GRVRDSAkweDE1MAogCiAvKiBUaGVybWFsIEhhbmxkaW5nICovCiAjaWZkZWYg
Q09ORklHX1g4Nl9NQ0VfVEhFUk1BTApAQCAtMjU2LDcgKzI2NCw3IEBAIHN0YXRpYyBlbnVtIG1j
ZV9yZXN1bHQgbWNlX2FjdGlvbihzdHJ1Y3QKICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBoYW5k
bGVyX251bTsgaSsrICkgewogICAgICAgICAgICAgaWYgKGhhbmRsZXJzW2ldLm93bmVkX2Vycm9y
KGJpbmZvLm1pYi0+bWNfc3RhdHVzKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBo
YW5kbGVyc1tpXS5yZWNvdmVyeV9oYW5kbGVyKCZiaW5mbywgJmJhbmtfcmVzdWx0KTsKKyAgICAg
ICAgICAgICAgICBoYW5kbGVyc1tpXS5yZWNvdmVyeV9oYW5kbGVyKCZiaW5mbywgJmJhbmtfcmVz
dWx0LCByZWdzKTsKICAgICAgICAgICAgICAgICBpZiAod29yc3RfcmVzdWx0IDwgYmFua19yZXN1
bHQpCiAgICAgICAgICAgICAgICAgICAgIHdvcnN0X3Jlc3VsdCA9IGJhbmtfcmVzdWx0OwogICAg
ICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjIyLDcgKzYzMCw4IEBAIHN0cnVjdCBtY2luZm9fcmVj
b3ZlcnkgKm1jaV9hZGRfcGFnZW9mZl8KIAogc3RhdGljIHZvaWQgaW50ZWxfbWVtZXJyX2RoYW5k
bGVyKAogICAgICAgICAgICAgIHN0cnVjdCBtY2FfYmluZm8gKmJpbmZvLAotICAgICAgICAgICAg
IGVudW0gbWNlX3Jlc3VsdCAqcmVzdWx0KQorICAgICAgICAgICAgIGVudW0gbWNlX3Jlc3VsdCAq
cmVzdWx0LAorICAgICAgICAgICAgIHN0cnVjdCBjcHVfdXNlcl9yZWdzICpyZWdzKQogewogICAg
IHN0cnVjdCBtY2luZm9fYmFuayAqYmFuayA9IGJpbmZvLT5taWI7CiAgICAgc3RydWN0IG1jaW5m
b19nbG9iYWwgKmdsb2JhbCA9IGJpbmZvLT5taWc7CkBAIC03MjEsNiArNzMwLDMyIEBAIHZtY2Vf
ZmFpbGVkOgogICAgIH0KIH0KIAorc3RhdGljIGludCBpbnRlbF9zcmFyX2NoZWNrKHVpbnQ2NF90
IHN0YXR1cykKK3sKKyAgICByZXR1cm4gKCBpbnRlbF9jaGVja19tY2VfdHlwZShzdGF0dXMpID09
IGludGVsX21jZV91Y3Jfc3JhciApOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9zcmFyX2RoYW5k
bGVyKAorICAgICAgICAgICAgIHN0cnVjdCBtY2FfYmluZm8gKmJpbmZvLAorICAgICAgICAgICAg
IGVudW0gbWNlX3Jlc3VsdCAqcmVzdWx0LAorICAgICAgICAgICAgIHN0cnVjdCBjcHVfdXNlcl9y
ZWdzICpyZWdzKQoreworICAgIHVpbnQ2NF90IHN0YXR1cyA9IGJpbmZvLT5taWItPm1jX3N0YXR1
czsKKworICAgIC8qIEZvciB1bmtub3duIHNyYXIgZXJyb3IgY29kZSwgcmVzZXQgc3lzdGVtICov
CisgICAgKnJlc3VsdCA9IE1DRVJfUkVTRVQ7CisKKyAgICBzd2l0Y2ggKCBzdGF0dXMgJiBJTlRF
TF9NQ0NPRF9NQVNLICkKKyAgICB7CisgICAgY2FzZSBJTlRFTF9TUkFSX0RBVEFfTE9BRDoKKyAg
ICBjYXNlIElOVEVMX1NSQVJfSU5TVFJfRkVUQ0g6CisgICAgICAgIGludGVsX21lbWVycl9kaGFu
ZGxlcihiaW5mbywgcmVzdWx0LCByZWdzKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCiBzdGF0aWMgaW50IGludGVsX3NyYW9fY2hlY2so
dWludDY0X3Qgc3RhdHVzKQogewogICAgIHJldHVybiAoIGludGVsX2NoZWNrX21jZV90eXBlKHN0
YXR1cykgPT0gaW50ZWxfbWNlX3Vjcl9zcmFvICk7CkBAIC03MjgsNyArNzYzLDggQEAgc3RhdGlj
IGludCBpbnRlbF9zcmFvX2NoZWNrKHVpbnQ2NF90IHN0YQogCiBzdGF0aWMgdm9pZCBpbnRlbF9z
cmFvX2RoYW5kbGVyKAogICAgICAgICAgICAgIHN0cnVjdCBtY2FfYmluZm8gKmJpbmZvLAotICAg
ICAgICAgICAgIGVudW0gbWNlX3Jlc3VsdCAqcmVzdWx0KQorICAgICAgICAgICAgIGVudW0gbWNl
X3Jlc3VsdCAqcmVzdWx0LAorICAgICAgICAgICAgIHN0cnVjdCBjcHVfdXNlcl9yZWdzICpyZWdz
KQogewogICAgIHVpbnQ2NF90IHN0YXR1cyA9IGJpbmZvLT5taWItPm1jX3N0YXR1czsKIApAQCAt
NzQxLDcgKzc3Nyw3IEBAIHN0YXRpYyB2b2lkIGludGVsX3NyYW9fZGhhbmRsZXIoCiAgICAgICAg
IHsKICAgICAgICAgY2FzZSBJTlRFTF9TUkFPX01FTV9TQ1JVQjoKICAgICAgICAgY2FzZSBJTlRF
TF9TUkFPX0wzX0VXQjoKLSAgICAgICAgICAgIGludGVsX21lbWVycl9kaGFuZGxlcihiaW5mbywg
cmVzdWx0KTsKKyAgICAgICAgICAgIGludGVsX21lbWVycl9kaGFuZGxlcihiaW5mbywgcmVzdWx0
LCByZWdzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAg
ICAgYnJlYWs7CkBAIC03NTYsMTQgKzc5MiwxNSBAQCBzdGF0aWMgaW50IGludGVsX2RlZmF1bHRf
Y2hlY2sodWludDY0X3QgCiAKIHN0YXRpYyB2b2lkIGludGVsX2RlZmF1bHRfbWNlX2RoYW5kbGVy
KAogICAgICAgICAgICAgIHN0cnVjdCBtY2FfYmluZm8gKmJpbmZvLAotICAgICAgICAgICAgIGVu
dW0gbWNlX3Jlc3VsdCAqcmVzdWx0KQorICAgICAgICAgICAgIGVudW0gbWNlX3Jlc3VsdCAqcmVz
dWx0LAorICAgICAgICAgICAgIHN0cnVjdCBjcHVfdXNlcl9yZWdzICogcmVncykKIHsKICAgICB1
aW50NjRfdCBzdGF0dXMgPSBiaW5mby0+bWliLT5tY19zdGF0dXM7CiAgICAgZW51bSBpbnRlbF9t
Y2VfdHlwZSB0eXBlOwogCiAgICAgdHlwZSA9IGludGVsX2NoZWNrX21jZV90eXBlKHN0YXR1cyk7
CiAKLSAgICBpZiAodHlwZSA9PSBpbnRlbF9tY2VfZmF0YWwgfHwgdHlwZSA9PSBpbnRlbF9tY2Vf
dWNyX3NyYXIpCisgICAgaWYgKHR5cGUgPT0gaW50ZWxfbWNlX2ZhdGFsKQogICAgICAgICAqcmVz
dWx0ID0gTUNFUl9SRVNFVDsKICAgICBlbHNlCiAgICAgICAgICpyZXN1bHQgPSBNQ0VSX0NPTlRJ
TlVFOwpAQCAtNzcxLDEyICs4MDgsMTQgQEAgc3RhdGljIHZvaWQgaW50ZWxfZGVmYXVsdF9tY2Vf
ZGhhbmRsZXIoCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWNhX2Vycm9yX2hhbmRsZXIgaW50ZWxf
bWNlX2RoYW5kbGVyc1tdID0gewogICAgIHtpbnRlbF9zcmFvX2NoZWNrLCBpbnRlbF9zcmFvX2Ro
YW5kbGVyfSwKKyAgICB7aW50ZWxfc3Jhcl9jaGVjaywgaW50ZWxfc3Jhcl9kaGFuZGxlcn0sCiAg
ICAge2ludGVsX2RlZmF1bHRfY2hlY2ssIGludGVsX2RlZmF1bHRfbWNlX2RoYW5kbGVyfQogfTsK
IAogc3RhdGljIHZvaWQgaW50ZWxfZGVmYXVsdF9tY2VfdWhhbmRsZXIoCiAgICAgICAgICAgICAg
c3RydWN0IG1jYV9iaW5mbyAqYmluZm8sCi0gICAgICAgICAgICAgZW51bSBtY2VfcmVzdWx0ICpy
ZXN1bHQpCisgICAgICAgICAgICAgZW51bSBtY2VfcmVzdWx0ICpyZXN1bHQsCisgICAgICAgICAg
ICAgc3RydWN0IGNwdV91c2VyX3JlZ3MgKnJlZ3MpCiB7CiAgICAgdWludDY0X3Qgc3RhdHVzID0g
YmluZm8tPm1pYi0+bWNfc3RhdHVzOwogICAgIGVudW0gaW50ZWxfbWNlX3R5cGUgdHlwZTsKQEAg
LTc4NSw4ICs4MjQsNiBAQCBzdGF0aWMgdm9pZCBpbnRlbF9kZWZhdWx0X21jZV91aGFuZGxlcigK
IAogICAgIHN3aXRjaCAodHlwZSkKICAgICB7Ci0gICAgLyogUGFuaWMgaWYgbm8gaGFuZGxlciBm
b3IgU1JBUiBlcnJvciAqLwotICAgIGNhc2UgaW50ZWxfbWNlX3Vjcl9zcmFyOgogICAgIGNhc2Ug
aW50ZWxfbWNlX2ZhdGFsOgogICAgICAgICAqcmVzdWx0ID0gTUNFUl9SRVNFVDsKICAgICAgICAg
YnJlYWs7CkBAIC05NjEsMTAgKzk5OCw4IEBAIHN0YXRpYyBpbnQgaW50ZWxfcmVjb3ZlcmFibGVf
c2Nhbih1NjQgc3QKICAgICAvKiBTUkFSIGVycm9yICovCiAgICAgZWxzZSBpZiAoIHNlcl9zdXBw
b3J0ICYmICEoc3RhdHVzICYgTUNpX1NUQVRVU19PVkVSKSAKICAgICAgICAgICAgICAgICAmJiAh
KHN0YXR1cyAmIE1DaV9TVEFUVVNfUENDKSAmJiAoc3RhdHVzICYgTUNpX1NUQVRVU19TKQotICAg
ICAgICAgICAgICAgICYmIChzdGF0dXMgJiBNQ2lfU1RBVFVTX0FSKSApIHsKLSAgICAgICAgbWNl
X3ByaW50ayhNQ0VfVkVSQk9TRSwgIk1DRTogTm8gU1JBUiBlcnJvciBkZWZpbmVkIGN1cnJlbnRs
eS5cbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgICAgICAgICAgICAgJiYgKHN0
YXR1cyAmIE1DaV9TVEFUVVNfQVIpICYmIChzdGF0dXMgJiBNQ2lfU1RBVFVTX0VOKSApCisgICAg
ICAgIHJldHVybiAxOwogICAgIC8qIFNSQU8gZXJyb3IgKi8KICAgICBlbHNlIGlmIChzZXJfc3Vw
cG9ydCAmJiAhKHN0YXR1cyAmIE1DaV9TVEFUVVNfUENDKQogICAgICAgICAgICAgICAgICYmIChz
dGF0dXMgJiBNQ2lfU1RBVFVTX1MpICYmICEoc3RhdHVzICYgTUNpX1NUQVRVU19BUikKZGlmZiAt
ciAxNTE1NDg0MzUzYzYgeGVuL2FyY2gveDg2L2NwdS9tY2hlY2sveDg2X21jYS5oCi0tLSBhL3hl
bi9hcmNoL3g4Ni9jcHUvbWNoZWNrL3g4Nl9tY2EuaAlUaHUgT2N0IDEzIDEwOjA5OjI4IDIwMTEg
KzAyMDAKKysrIGIveGVuL2FyY2gveDg2L2NwdS9tY2hlY2sveDg2X21jYS5oCVNhdCBPY3QgMjIg
MDE6NDA6NDEgMjAxMSArMDgwMApAQCAtMTUxLDcgKzE1MSw3IEBAIHN0cnVjdCBtY2FfZXJyb3Jf
aGFuZGxlcgogICAgICovCiAgICAgaW50ICgqb3duZWRfZXJyb3IpKHVpbnQ2NF90IHN0YXR1cyk7
CiAgICAgdm9pZCAoKnJlY292ZXJ5X2hhbmRsZXIpKHN0cnVjdCBtY2FfYmluZm8gKmJpbmZvLAot
ICAgICAgICAgICAgICAgICAgICBlbnVtIG1jZV9yZXN1bHQgKnJlc3VsdCk7CisgICAgICAgICAg
ICAgICAgICAgIGVudW0gbWNlX3Jlc3VsdCAqcmVzdWx0LCBzdHJ1Y3QgY3B1X3VzZXJfcmVncyAq
cmVncyk7CiB9OwogCiAvKiBHbG9iYWwgdmFyaWFibGVzICovCg==

--_002_BC00F5384FCFC9499AF06F92E8B78A9E26A4F3C1DAshsmsx502ccrc_
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_BC00F5384FCFC9499AF06F92E8B78A9E26A4F3C1DAshsmsx502ccrc_--


From xen-devel-bounces@lists.xensource.com Fri Oct 21 16:34:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 16:34:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHObs-000691-7Y; Fri, 21 Oct 2011 16:34:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHOau-0005wI-Vd; Fri, 21 Oct 2011 16:33:46 -0700
X-Env-Sender: joseph.glanville@orionvm.com.au
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319239989!53843851!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 630 invoked from network); 21 Oct 2011 23:33:10 -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;
	21 Oct 2011 23:33:10 -0000
Received: by iaen33 with SMTP id n33so6219067iae.30
	for <multiple recipients>; Fri, 21 Oct 2011 16:33:39 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.231.21.10 with SMTP id h10mr6157833ibb.69.1319240018147; Fri,
	21 Oct 2011 16:33:38 -0700 (PDT)
Received: by 10.231.202.211 with HTTP; Fri, 21 Oct 2011 16:33:37 -0700 (PDT)
X-Originating-IP: [59.167.234.130]
In-Reply-To: <4EA18FAD.7080102@xen.org>
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111018132618.GA19611@phenom.dumpdata.com>
	<1319013528.3385.59.camel@zakaz.uk.xensource.com>
	<4E9F1361.5020906@xen.org>
	<CAOzFzEjioey=65ACAJH50Nf+gHUt4HCXupfY9bHwaqCMEoquow@mail.gmail.com>
	<4EA18FAD.7080102@xen.org>
Date: Sat, 22 Oct 2011 10:33:37 +1100
Message-ID: <CAOzFzEjZKCmMDx+VbdCtEkzHM5_RcYM=4K2DZwtzu=ua6bQi9g@mail.gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Joseph Glanville <joseph.glanville@orionvm.com.au>
To: Lars Kurth <lars.kurth@xen.org>
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"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>,
	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="===============2061653387=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2061653387==
Content-Type: multipart/alternative; boundary=00151773e73aa7b7eb04afd780c4

--00151773e73aa7b7eb04afd780c4
Content-Type: text/plain; charset=ISO-8859-1

On 22 October 2011 02:28, Lars Kurth <lars.kurth@xen.org> wrote:

> On 21/10/2011 04:44, Joseph Glanville wrote:
>
>> I think we should aim to get a meeting of interested parties happening on
>> IRC before we action on a date or plan.
>> I just don't want to get started on something that will stall due to lack
>> of direction.
>>
>> <rant>
>>
> I am happy to hang out with a few the day before the docs day and
> coordinate a bit
> I think there is a lot we can do though
>
>
>  I am happy to contribute my time to do a significant amount of the work
>> that bofh has requested but to do so effectively I really think we need
>> somewhat of a clean start.
>> The current wiki contains too much content that just doesn't belong in the
>> wiki, job postings, WIP status on projects that have long since died etc.
>>
> Agreed that some stuff should just be deleted. The key issues is that the
> wiki today has a flat structure.
> I am happy to delete stuff like job postings, old minutes, WIP status and
> truly dead stuff and archive plain old stuff (which may still be of value to
> some people.
>
> I think its unfair to say Xen is a schizophrenic project. The issue has
> been that the Wiki has not been managed ever and MoinMoin is inherently
> unmanageable


Aye, I didn't mean to say Xen was schizophrenic, infact I think it is
precisely the opposite. My point was that the wiki and current documentation
don't reflect this very wel.

>
>
>  I did get started on a full categorization of pages in the wiki but that
>> quickly become something that is abit much to do in one session or alone for
>> that matter.
>>
> Agreed and categories don't work well with MoinMoin
>
>
>  It also highlighted some severe problems with how the current wiki is used
>> - in my opinion atleast. It is my view that the official wiki should be
>> reserved for highly relevant documentation.
>>
> I would agree with you, if we were in a perfect world. But we have baggage,
> so to some degree this discussion is moot. I also think that this question
> is handled quite differently by different projects.


As I noted, this is just my opinion, its not my place to decide how people
want to use it but if we could have to idea of what should and shouldn't be
in there it makes it easy to then structure the information.

>
>
>  I think we need to setup a guided rewrite/refactor of the core
>> documentation so it resembles something close to this:
>>
>> Overview (brief introduction, architecture, why xen is different and maybe
>> abit of xen philosophy)
>> Getting started guide ( Installation of Xen on Debian - probably the
>> simplest and easiest way to get started with Xen at the moment, start a
>> Debian PV guest, start at Windows HVM guest)
>> Installation guide ( More indepth covering all the core distros and some
>> more advanced installations including compilation from source and using the
>> Linux 3.1 kernel, networking options etc)
>> Administration guide ( This bit requires atlot of discussion, do we
>> recommend xm still? should we only support xl? If that is the case how to we
>> recommend stuff like managed domains etc..)
>> Advanced topics.. stuff like Networking, PCI passthrough etc deserve their
>> own pages
>>
> Are you suggesting we restructure the wiki front-page around this?


Yes, maybe not -exactly- this format but something resembling it would be of
value I think. Guiding people towards the beginners documentation and making
it quite clear there is a reading progression will show much stronger
cohesion.

>
>
>  There also needs to be a developers section, preferably seperate entirely
>> from the user documentation. If XCP could be sectioned off in some matter
>> also that would be advantageous - basically to prevent confusion.
>>
> We do not have that many XCP pages. MoinMoin sucks at sectioning stuff off.
> The only thing which could sort of work is to use <namespace>/<pagename> ...
> we could have XCP/<pagename> and so on. If categories worked properly, they
> could be used too.


Fair enough, that would work well enough for this purpose.


>
>
>  The current wiki is poluted with alot of architecture and design info that
>> isn't of interest to a general user but is still key to understanding Xen
>> from a developers point of view.
>>
> Part of the issue is that it is hard for me to identify what is what. If I
> had a good approximation of what is what, I (or others) could just go
> through the motions and re-encode stuff accordingly.


I have exactly the same problem, I just need to undertand what needs to be
done and where.

>
>
>  What the primary aim would be is to integrate as much best practices into
>> these pages rather than having them spread around hundreds of wiki pages and
>> even more mailing list posts.
>> To be honest I rarely look to the wiki if I want to know how to do
>> something with Xen I am unfamilar with.. my first course of action is to
>> search my archive of xen-devel/xen-users which isn't exactly a good thing.
>>
>> The biggest issue with this sort of compaction is that Xen is fraught with
>> choices.. there is just so many different ways of doing things.
>>
>> I'm not trying to be critical of those that have spent many hours writing
>> the current documentation, it is appreciated.
>> I just think we need a really concentrated effort around making the simple
>> Xen tasks easier before expanding out to include the more complicated stuff.
>> Alot of us take for granted that we have been using Xen for a long time
>> and many of these things come so naturally to us - whereas from the outside
>> it all seems too difficult.
>>
>> </rant>
>>
> I think what you seem to be saying is that there would be extremely high
> value in having a "Getting started" guide and some other entry level
> documentation (even if just an index page) accessible from the wiki front
> page.
>

Precisely, documenting the more advanced features of Xen seems to be
something that we can approach over time. Beginner documentation is
immeadiately lacking and seems to be an easier target that would benefit
more people.

>
> Lars
>

Thanks for reading the rant. :)

Joseph.


-- 
*
Founder | Director | VP Research
Orion Virtualisation Solutions* | www.orionvm.com.au | Phone: 1300 56 99 52
| Mobile: 0428 754 846

--00151773e73aa7b7eb04afd780c4
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<br><br><div class=3D"gmail_quote">On 22 October 2011 02:28, Lars Kurth <sp=
an dir=3D"ltr">&lt;<a href=3D"mailto:lars.kurth@xen.org">lars.kurth@xen.org=
</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"im">On 21/10/2011 04:44, Joseph Glanville wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
I think we should aim to get a meeting of interested parties happening on I=
RC before we action on a date or plan.<br>
I just don&#39;t want to get started on something that will stall due to la=
ck of direction.<br>
<br>
&lt;rant&gt;<br>
</blockquote></div>
I am happy to hang out with a few the day before the docs day and coordinat=
e a bit<br>
I think there is a lot we can do though<div class=3D"im"><br>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
I am happy to contribute my time to do a significant amount of the work tha=
t bofh has requested but to do so effectively I really think we need somewh=
at of a clean start.<br>
The current wiki contains too much content that just doesn&#39;t belong in =
the wiki, job postings, WIP status on projects that have long since died et=
c.<br>
</blockquote></div>
Agreed that some stuff should just be deleted. The key issues is that the w=
iki today has a flat structure.<br>
I am happy to delete stuff like job postings, old minutes, WIP status and t=
ruly dead stuff and archive plain old stuff (which may still be of value to=
 some people.<br>
<br>
I think its unfair to say Xen is a schizophrenic project. The issue has bee=
n that the Wiki has not been managed ever and MoinMoin is inherently unmana=
geable</blockquote><div><br>Aye, I didn&#39;t mean to say Xen was schizophr=
enic, infact I think it is precisely the opposite. My point was that the wi=
ki and current documentation don&#39;t reflect this very wel.<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>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
I did get started on a full categorization of pages in the wiki but that qu=
ickly become something that is abit much to do in one session or alone for =
that matter.<br>
</blockquote></div>
Agreed and categories don&#39;t work well with MoinMoin<div class=3D"im"><b=
r>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
It also highlighted some severe problems with how the current wiki is used =
- in my opinion atleast. It is my view that the official wiki should be res=
erved for highly relevant documentation.<br>
</blockquote></div>
I would agree with you, if we were in a perfect world. But we have baggage,=
 so to some degree this discussion is moot. I also think that this question=
 is handled quite differently by different projects.</blockquote><div>
<br>As I noted, this is just my opinion, its not my place to decide how peo=
ple want to use it but if we could have to idea of what should and shouldn&=
#39;t be in there it makes it easy to then structure the information. <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>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
I think we need to setup a guided rewrite/refactor of the core documentatio=
n so it resembles something close to this:<br>
<br>
Overview (brief introduction, architecture, why xen is different and maybe =
abit of xen philosophy)<br>
Getting started guide ( Installation of Xen on Debian - probably the simple=
st and easiest way to get started with Xen at the moment, start a Debian PV=
 guest, start at Windows HVM guest)<br>
Installation guide ( More indepth covering all the core distros and some mo=
re advanced installations including compilation from source and using the L=
inux 3.1 kernel, networking options etc)<br>
Administration guide ( This bit requires atlot of discussion, do we recomme=
nd xm still? should we only support xl? If that is the case how to we recom=
mend stuff like managed domains etc..)<br>
Advanced topics.. stuff like Networking, PCI passthrough etc deserve their =
own pages<br>
</blockquote></div>
Are you suggesting we restructure the wiki front-page around this?</blockqu=
ote><div><br>Yes, maybe not -exactly- this format but something resembling =
it would be of value I think. Guiding people towards the beginners document=
ation and making it quite clear there is a reading progression will show mu=
ch stronger cohesion. <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>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
There also needs to be a developers section, preferably seperate entirely f=
rom the user documentation. If XCP could be sectioned off in some matter al=
so that would be advantageous - basically to prevent confusion.<br>
</blockquote></div>
We do not have that many XCP pages. MoinMoin sucks at sectioning stuff off.=
 The only thing which could sort of work is to use &lt;namespace&gt;/&lt;pa=
gename&gt; ... we could have XCP/&lt;pagename&gt; and so on. If categories =
worked properly, they could be used too.</blockquote>
<div><br>Fair enough, that would work well enough for this purpose.<br>=A0<=
br></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 cla=
ss=3D"im">
<br>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
The current wiki is poluted with alot of architecture and design info that =
isn&#39;t of interest to a general user but is still key to understanding X=
en from a developers point of view.<br>
</blockquote></div>
Part of the issue is that it is hard for me to identify what is what. If I =
had a good approximation of what is what, I (or others) could just go throu=
gh the motions and re-encode stuff accordingly.</blockquote><div><br>I have=
 exactly the same problem, I just need to undertand what needs to be done a=
nd where. <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>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
What the primary aim would be is to integrate as much best practices into t=
hese pages rather than having them spread around hundreds of wiki pages and=
 even more mailing list posts.<br>
To be honest I rarely look to the wiki if I want to know how to do somethin=
g with Xen I am unfamilar with.. my first course of action is to search my =
archive of xen-devel/xen-users which isn&#39;t exactly a good thing.<br>

<br>
The biggest issue with this sort of compaction is that Xen is fraught with =
choices.. there is just so many different ways of doing things.<br>
<br>
I&#39;m not trying to be critical of those that have spent many hours writi=
ng the current documentation, it is appreciated.<br>
I just think we need a really concentrated effort around making the simple =
Xen tasks easier before expanding out to include the more complicated stuff=
.<br>
Alot of us take for granted that we have been using Xen for a long time and=
 many of these things come so naturally to us - whereas from the outside it=
 all seems too difficult.<br>
<br>
&lt;/rant&gt;<br>
</blockquote></div>
I think what you seem to be saying is that there would be extremely high va=
lue in having a &quot;Getting started&quot; guide and some other entry leve=
l documentation (even if just an index page) accessible from the wiki front=
 page.<br>
</blockquote><div><br>Precisely, documenting the more advanced features of =
Xen seems to be something that we can approach over time. Beginner document=
ation is immeadiately lacking and seems to be an easier target that would b=
enefit more people. <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;"><font color=
=3D"#888888">
<br>
Lars<br>
</font></blockquote></div><br>Thanks for reading the rant. :)<br><br>Joseph=
.<br><br clear=3D"all"><br>-- <br><span style=3D"font-family:arial,sans-ser=
if;font-size:13px;border-collapse:collapse"><b><i><font color=3D"#0000ff"><=
div>
<font color=3D"#000000"><span style=3D"font-style:normal;font-weight:normal=
">Founder | Director | VP Research<br></span></font></div>Orion Virtualisat=
ion Solutions</font></i></b>=A0|=A0<font color=3D"#0000ff"><a href=3D"http:=
//www.orionvm.com.au/" style=3D"color:rgb(42, 93, 176)" target=3D"_blank">w=
ww.orionvm.com.au</a></font>=A0| Phone: 1300 56 99 52 | Mobile: 0428 754 84=
6</span><br>


--00151773e73aa7b7eb04afd780c4--


--===============2061653387==
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

--===============2061653387==--


From xen-devel-bounces@lists.xensource.com Fri Oct 21 22:02:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 21 Oct 2011 22:02:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHTj8-0005nW-4A; Fri, 21 Oct 2011 22:02:34 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RHTiO-0005ak-Fr
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 22:01:48 -0700
X-Env-Sender: fujita.tomonori@lab.ntt.co.jp
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319259673!53854969!1
X-Originating-IP: [129.60.39.148]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26517 invoked from network); 22 Oct 2011 05:01:13 -0000
Received: from tama500.ecl.ntt.co.jp (HELO tama500.ecl.ntt.co.jp)
	(129.60.39.148) by server-7.tower-27.messagelabs.com with SMTP;
	22 Oct 2011 05:01:13 -0000
Received: from mfs6.rdh.ecl.ntt.co.jp (mfs6.rdh.ecl.ntt.co.jp [129.60.39.149])
	by tama500.ecl.ntt.co.jp (8.14.5/8.14.5) with ESMTP id
	p9M51dIK026126; Sat, 22 Oct 2011 14:01:39 +0900 (JST)
Received: from mfs6.rdh.ecl.ntt.co.jp (localhost [127.0.0.1])
	by mfs6.rdh.ecl.ntt.co.jp (Postfix) with ESMTP id 4E5A16621;
	Sat, 22 Oct 2011 14:01:39 +0900 (JST)
Received: from dmailsv1.y.ecl.ntt.co.jp (dmailsv1.y.ecl.ntt.co.jp
	[129.60.53.14])
	by mfs6.rdh.ecl.ntt.co.jp (Postfix) with ESMTP id 409F065F1;
	Sat, 22 Oct 2011 14:01:39 +0900 (JST)
Received: from mailsv04.y.ecl.ntt.co.jp
	by dmailsv1.y.ecl.ntt.co.jp (8.14.4/dmailsv1-2.1) with ESMTP id
	p9M51cau020730; Sat, 22 Oct 2011 14:01:38 +0900 (JST)
Received: from localhost
	by mailsv04.y.ecl.ntt.co.jp (8.14.5/Lab-1.9) with ESMTP id
	p9M51cce012615; Sat, 22 Oct 2011 14:01:38 +0900 (JST)
To: konrad.wilk@oracle.com
From: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
In-Reply-To: <1319062772-2793-2-git-send-email-konrad.wilk@oracle.com>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
	<1319062772-2793-2-git-send-email-konrad.wilk@oracle.com>
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Message-Id: <20111022134914N.fujita.tomonori@lab.ntt.co.jp>
Date: Sat, 22 Oct 2011 13:49:14 +0900
Lines: 17
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.com, thomas@shipmail.org,
	linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
	fujita.tomonori@lab.ntt.co.jp, j.glisse@redhat.com,
	airlied@redhat.com, bskeggs@redhat.com
Subject: [Xen-devel] Re: [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

On Wed, 19 Oct 2011 18:19:22 -0400
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:

> As a mechanism to detect whether SWIOTLB is enabled or not.
> We also fix the spelling - it was swioltb instead of
> swiotlb.
> 
> CC: 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(-)

Acked-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 22 03:08:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 22 Oct 2011 03:08:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHYUz-0003v8-8W; Sat, 22 Oct 2011 03:08:17 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHYU0-0003iA-7Q
	for xen-devel@lists.xensource.com; Sat, 22 Oct 2011 03:07:17 -0700
X-Env-Sender: yong.zhang0@gmail.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1319278031!36262393!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21972 invoked from network); 22 Oct 2011 10:07:13 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2011 10:07:13 -0000
Received: by iaen33 with SMTP id n33so6885996iae.30
	for <xen-devel@lists.xensource.com>;
	Sat, 22 Oct 2011 03:07:11 -0700 (PDT)
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:in-reply-to:references;
	bh=QfizmX1EyKT3XY2YjyZp9Z0VYCV/pUMr7yJS8gKjz2Q=;
	b=t6RS1AUYMg2cRr6wdhxFSXZmufNoV+fDOAGnRsfLJR/BjzuDBtEqP9NQ/wJ0XtJWQB
	HfszTLxBORvhcPrcJF4fVxCMGwr5iLW0SXETke5EffZndIm2SELc1V6Aklc8edhIrghx
	fuSFl9WxqVAn2bByCpjEPlTMk+pVBYIkR+Olo=
Received: by 10.42.142.69 with SMTP id r5mr24468332icu.42.1319278031660;
	Sat, 22 Oct 2011 03:07:11 -0700 (PDT)
Received: from localhost ([118.186.129.169])
	by mx.google.com with ESMTPS id eh34sm41480666ibb.5.2011.10.22.03.07.01
	(version=TLSv1/SSLv3 cipher=OTHER);
	Sat, 22 Oct 2011 03:07:10 -0700 (PDT)
From: Yong Zhang <yong.zhang0@gmail.com>
To: linux-kernel@vger.kernel.org
Date: Sat, 22 Oct 2011 17:56:32 +0800
Message-Id: <1319277421-9203-21-git-send-email-yong.zhang0@gmail.com>
X-Mailer: git-send-email 1.7.1
In-Reply-To: <1319277421-9203-1-git-send-email-yong.zhang0@gmail.com>
References: <1319277421-9203-1-git-send-email-yong.zhang0@gmail.com>
Cc: "Venkatesh Pallipadi \(Venki\)" <venki@google.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, x86@kernel.org,
	virtualization@lists.linux-foundation.org,
	Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	tglx@linutronix.de, xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 20/49] x86: irq: Remove IRQF_DISABLED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 commit [e58aa3d2: genirq: Run irq handlers with interrupts disabled],
We run all interrupt handlers with interrupts disabled
and we even check and yell when an interrupt handler
returns with interrupts enabled (see commit [b738a50a:
genirq: Warn when handler enables interrupts]).

So now this flag is a NOOP and can be removed.

Signed-off-by: Yong Zhang <yong.zhang0@gmail.com>
---
 arch/x86/include/asm/floppy.h |    4 ++--
 arch/x86/kernel/hpet.c        |    2 +-
 arch/x86/kernel/time.c        |    2 +-
 arch/x86/xen/smp.c            |    8 ++++----
 arch/x86/xen/spinlock.c       |    2 +-
 arch/x86/xen/time.c           |    5 ++---
 6 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/arch/x86/include/asm/floppy.h b/arch/x86/include/asm/floppy.h
index dbe82a5..22bf4d6 100644
--- a/arch/x86/include/asm/floppy.h
+++ b/arch/x86/include/asm/floppy.h
@@ -145,10 +145,10 @@ static int fd_request_irq(void)
 {
 	if (can_use_virtual_dma)
 		return request_irq(FLOPPY_IRQ, floppy_hardint,
-				   IRQF_DISABLED, "floppy", NULL);
+				   0, "floppy", NULL);
 	else
 		return request_irq(FLOPPY_IRQ, floppy_interrupt,
-				   IRQF_DISABLED, "floppy", NULL);
+				   0, "floppy", NULL);
 }
 
 static unsigned long dma_mem_alloc(unsigned long size)
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
index b946a9e..5c21a30 100644
--- a/arch/x86/kernel/hpet.c
+++ b/arch/x86/kernel/hpet.c
@@ -516,7 +516,7 @@ static int hpet_setup_irq(struct hpet_dev *dev)
 {
 
 	if (request_irq(dev->irq, hpet_interrupt_handler,
-			IRQF_TIMER | IRQF_DISABLED | IRQF_NOBALANCING,
+			IRQF_TIMER | IRQF_NOBALANCING,
 			dev->name, dev))
 		return -1;
 
diff --git a/arch/x86/kernel/time.c b/arch/x86/kernel/time.c
index dd5fbf4..3375e42 100644
--- a/arch/x86/kernel/time.c
+++ b/arch/x86/kernel/time.c
@@ -71,7 +71,7 @@ static irqreturn_t timer_interrupt(int irq, void *dev_id)
 
 static struct irqaction irq0  = {
 	.handler = timer_interrupt,
-	.flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
+	.flags = IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
 	.name = "timer"
 };
 
diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c
index 041d4fe..a375a75 100644
--- a/arch/x86/xen/smp.c
+++ b/arch/x86/xen/smp.c
@@ -100,7 +100,7 @@ static int xen_smp_intr_init(unsigned int cpu)
 	rc = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR,
 				    cpu,
 				    xen_reschedule_interrupt,
-				    IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING,
+				    IRQF_PERCPU|IRQF_NOBALANCING,
 				    resched_name,
 				    NULL);
 	if (rc < 0)
@@ -111,7 +111,7 @@ static int xen_smp_intr_init(unsigned int cpu)
 	rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_VECTOR,
 				    cpu,
 				    xen_call_function_interrupt,
-				    IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING,
+				    IRQF_PERCPU|IRQF_NOBALANCING,
 				    callfunc_name,
 				    NULL);
 	if (rc < 0)
@@ -120,7 +120,7 @@ static int xen_smp_intr_init(unsigned int cpu)
 
 	debug_name = kasprintf(GFP_KERNEL, "debug%d", cpu);
 	rc = bind_virq_to_irqhandler(VIRQ_DEBUG, cpu, xen_debug_interrupt,
-				     IRQF_DISABLED | IRQF_PERCPU | IRQF_NOBALANCING,
+				     IRQF_PERCPU | IRQF_NOBALANCING,
 				     debug_name, NULL);
 	if (rc < 0)
 		goto fail;
@@ -130,7 +130,7 @@ static int xen_smp_intr_init(unsigned int cpu)
 	rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR,
 				    cpu,
 				    xen_call_function_single_interrupt,
-				    IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING,
+				    IRQF_PERCPU|IRQF_NOBALANCING,
 				    callfunc_name,
 				    NULL);
 	if (rc < 0)
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index cc9b1e1..27882f5 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -354,7 +354,7 @@ void __cpuinit xen_init_lock_cpu(int cpu)
 	irq = bind_ipi_to_irqhandler(XEN_SPIN_UNLOCK_VECTOR,
 				     cpu,
 				     dummy_handler,
-				     IRQF_DISABLED|IRQF_PERCPU|IRQF_NOBALANCING,
+				     IRQF_PERCPU|IRQF_NOBALANCING,
 				     name,
 				     NULL);
 
diff --git a/arch/x86/xen/time.c b/arch/x86/xen/time.c
index 0296a95..9157113 100644
--- a/arch/x86/xen/time.c
+++ b/arch/x86/xen/time.c
@@ -408,9 +408,8 @@ void xen_setup_timer(int cpu)
 		name = "<timer kasprintf failed>";
 
 	irq = bind_virq_to_irqhandler(VIRQ_TIMER, cpu, xen_timer_interrupt,
-				      IRQF_DISABLED|IRQF_PERCPU|
-				      IRQF_NOBALANCING|IRQF_TIMER|
-				      IRQF_FORCE_RESUME,
+				      IRQF_PERCPU|IRQF_NOBALANCING|
+				      IRQF_TIMER|IRQF_FORCE_RESUME,
 				      name, NULL);
 
 	evt = &per_cpu(xen_clock_events, cpu);
-- 
1.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 Oct 22 03:19:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 22 Oct 2011 03:19:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHYff-0004Rj-U7; Sat, 22 Oct 2011 03:19:19 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHYf1-0004FL-TP
	for xen-devel@lists.xensource.com; Sat, 22 Oct 2011 03:18:40 -0700
X-Env-Sender: yong.zhang0@gmail.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1319278715!525600!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32077 invoked from network); 22 Oct 2011 10:18:36 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-10.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2011 10:18:36 -0000
Received: by iaen33 with SMTP id n33so6897493iae.30
	for <xen-devel@lists.xensource.com>;
	Sat, 22 Oct 2011 03:18:35 -0700 (PDT)
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:in-reply-to:references;
	bh=RJnEkGMwWWKY5I9YMcMlN3SWRjuZIckm91FDnoXVbXc=;
	b=yAt4ot7Nk645V5uvTj63Mp0Lx8r/5Q10wzohbYzc2Hbk10qmR9ziTWKdnb2XXG/tl0
	nKfXCBUeCdyWT6fkYh2CEbdqREbGP64u9ezqZ/2kOGBWToZrfyfo1xLVp6SJlULWdDl/
	AZUiAFg/9n9V47PRYwS0Wc2SMLO/Ojm61QWFY=
Received: by 10.42.164.67 with SMTP id f3mr29635283icy.41.1319278715239;
	Sat, 22 Oct 2011 03:18:35 -0700 (PDT)
Received: from localhost ([118.186.129.169])
	by mx.google.com with ESMTPS id n30sm41565705ibl.4.2011.10.22.03.18.26
	(version=TLSv1/SSLv3 cipher=OTHER);
	Sat, 22 Oct 2011 03:18:34 -0700 (PDT)
From: Yong Zhang <yong.zhang0@gmail.com>
To: linux-kernel@vger.kernel.org
Date: Sat, 22 Oct 2011 17:56:58 +0800
Message-Id: <1319277421-9203-47-git-send-email-yong.zhang0@gmail.com>
X-Mailer: git-send-email 1.7.1
In-Reply-To: <1319277421-9203-1-git-send-email-yong.zhang0@gmail.com>
References: <1319277421-9203-1-git-send-email-yong.zhang0@gmail.com>
Cc: tglx@linutronix.de, Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	virtualization@lists.linux-foundation.org, xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 46/49] xen: irq: Remove IRQF_DISABLED
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 commit [e58aa3d2: genirq: Run irq handlers with interrupts disabled],
We run all interrupt handlers with interrupts disabled
and we even check and yell when an interrupt handler
returns with interrupts enabled (see commit [b738a50a:
genirq: Warn when handler enables interrupts]).

So now this flag is a NOOP and can be removed.

Signed-off-by: Yong Zhang <yong.zhang0@gmail.com>
---
 drivers/xen/evtchn.c       |    2 +-
 drivers/xen/platform-pci.c |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c
index dbc13e9..95e2507 100644
--- a/drivers/xen/evtchn.c
+++ b/drivers/xen/evtchn.c
@@ -265,7 +265,7 @@ static int evtchn_bind_to_user(struct per_user_data *u, int port)
 	set_port_user(port, u);
 	set_port_enabled(port, true); /* start enabled */
 
-	rc = bind_evtchn_to_irqhandler(port, evtchn_interrupt, IRQF_DISABLED,
+	rc = bind_evtchn_to_irqhandler(port, evtchn_interrupt, 0,
 				       u->name, (void *)(unsigned long)port);
 	if (rc >= 0)
 		rc = 0;
diff --git a/drivers/xen/platform-pci.c b/drivers/xen/platform-pci.c
index 319dd0a..482beff 100644
--- a/drivers/xen/platform-pci.c
+++ b/drivers/xen/platform-pci.c
@@ -84,7 +84,7 @@ static irqreturn_t do_hvm_evtchn_intr(int irq, void *dev_id)
 static int xen_allocate_irq(struct pci_dev *pdev)
 {
 	return request_irq(pdev->irq, do_hvm_evtchn_intr,
-			IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TRIGGER_RISING,
+			IRQF_NOBALANCING | IRQF_TRIGGER_RISING,
 			"xen-platform-pci", pdev);
 }
 
-- 
1.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 Oct 22 04:05:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 22 Oct 2011 04:05:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHZO6-0005o2-Qh; Sat, 22 Oct 2011 04:05:14 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHZKS-0005Wj-4U
	for Xen-devel@lists.xensource.com; Sat, 22 Oct 2011 04:01:52 -0700
X-Env-Sender: paolo.bonzini@gmail.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319281282!36276695!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7825 invoked from network); 22 Oct 2011 11:01:23 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Oct 2011 11:01:23 -0000
Received: by wwf10 with SMTP id 10so5721344wwf.24
	for <Xen-devel@lists.xensource.com>;
	Sat, 22 Oct 2011 04:01:22 -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:newsgroups:to
	:cc:subject:references:in-reply-to:content-type
	:content-transfer-encoding;
	bh=XIVnklgH18OSKrr0bxj+y8JeMJJYuQVkN+e9Hc8RwdU=;
	b=V8hh7wz4zWNttFtd6NiSskIuElq2i+OlwIfFzz41CvBWaWJ7yTO+P3fZqVIbzHbe7X
	70KXv0SVZXOsiR6JGLqEvKRJwDUGVCrNzAwSYg35+uqYeflpu7BMscbKNOqubONDTwV/
	SJIgAX/5Gu5KpOPcxIwTlOMHP3+Ara2RxKMZk=
Received: by 10.216.71.205 with SMTP id r55mr553083wed.73.1319281282842;
	Sat, 22 Oct 2011 04:01:22 -0700 (PDT)
Received: from yakj.usersys.redhat.com (93-34-199-98.ip51.fastwebnet.it.
	[93.34.199.98])
	by mx.google.com with ESMTPS id es5sm26955789wbb.11.2011.10.22.04.01.19
	(version=TLSv1/SSLv3 cipher=OTHER);
	Sat, 22 Oct 2011 04:01:20 -0700 (PDT)
Message-ID: <4EA2A27C.6040509@redhat.com>
Date: Sat, 22 Oct 2011 13:01:16 +0200
From: Paolo Bonzini <pbonzini@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0) Gecko/20110927 Thunderbird/7.0
MIME-Version: 1.0
Newsgroups: gmane.comp.emulators.xen.devel
To: =?ISO-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
References: <2A0F5C7D-EAE0-46A2-8A8C-437B1FEE5B1F@yahoo-inc.com>
	<20111020140056.GU12984@reaktio.net>
	<93279CAE-68CA-4255-B0F9-786F4091DCF5@yahoo-inc.com>
	<20111021061156.GZ12984@reaktio.net> <4EA1728D.3000100@redhat.com>
	<20111021141407.GC12984@reaktio.net>
In-Reply-To: <20111021141407.GC12984@reaktio.net>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Alok Sinha <aksinha@yahoo-inc.com>, Ian Campbell <Ian.Campbell@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: Question on RHEL 6 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/21/2011 04:14 PM, Pasi Kärkkäinen wrote:
>>> >>  Try:
>>> >>  xen_platform_pci=0
>> >
>> >  That doesn't exist.
>> >
> Hmm, or is it:
> xen_platform_device=0
>
> Anyway there definitely is a configuration option for controlling the xen platform pci device,
> which can enable or disable PVHVM drivers.
>
> I can't just remember which one the option is called..
> (and I can't grep the sources right now.. travelling.)

It's xen_platform_pci, but it doesn't exist on either RHEL5 Xen or 3.4.

Paolo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 22 05:48:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 22 Oct 2011 05:48:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHazg-0000ob-5R; Sat, 22 Oct 2011 05:48:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHays-0000bz-H2
	for xen-devel@lists.xensource.com; Sat, 22 Oct 2011 05:47:18 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319287635!36275136!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28151 invoked from network); 22 Oct 2011 12:47:15 -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;
	22 Oct 2011 12:47:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,391,1315180800"; 
   d="scan'208";a="8532915"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	22 Oct 2011 12:47:14 +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;
	Sat, 22 Oct 2011 13:47:14 +0100
Subject: Re: [Xen-devel] make install not creating lib entries in /usr/lib
	under Ubunu 11.10
From: Ian Campbell <Ian.Campbell@citrix.com>
To: AP <apxeng@gmail.com>
In-Reply-To: <CAGU+autjm1EEKeDjQiuwixo0QAwwNntsFWZ9V6JSTZOhyWVadg@mail.gmail.com>
References: <CAGU+aut64MmMmf901p9Gsya4O=hep8merZUDfSUuJCJXMVFtrg@mail.gmail.com>
	<1319013780.3385.64.camel@zakaz.uk.xensource.com>
	<20126.62103.576976.140927@mariner.uk.xensource.com>
	<CAGU+autjm1EEKeDjQiuwixo0QAwwNntsFWZ9V6JSTZOhyWVadg@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Sat, 22 Oct 2011 13:47:13 +0100
Message-ID: <1319287633.17770.10.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 Fri, 2011-10-21 at 04:52 +0100, AP wrote:
> On Wed, Oct 19, 2011 at 8:53 AM, Ian Jackson <Ian.Jackson@eu.citrix.com> wrote:
> > Ian Campbell writes ("Re: [Xen-devel] make install not creating lib entries in /> It might be nice if there was a single variable which could be set to
> >> control this behaviour, or even better if it can be automatically
> >> detected. I'm also inclined to suggest that the default should be to
> >> use /usr/lib and leave the lib64 thing as a RH special case, but then
> >> I'm a Debian user so I would think that ;-)
> >
> > At the very least we ought not to dump things in /usr/lib64 unless it
> > already exists and is distinct from /usr/lib.
> 
> I deleted my /usr/lib64 and did a "make install-tools
> PYTHON_PREFIX_ARG=". At the end a /usr/lib64 directory was created
> with Xen related libraries inside.

I think you need to reread my earlier reply -- I explained what is going
on and provided an example of the sort of patch which fixes it. There is
no reason to expect that deleting /usr/lib64 will change anything.

Ian.

> 
> > We should think about multiarch too at some point.
> >
> > Ian.
> >



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 22 07:23:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 22 Oct 2011 07:23:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHcUP-0003fk-Pn; Sat, 22 Oct 2011 07:23:57 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RHcTL-0003T1-6j
	for xen-devel@lists.xensource.com; Sat, 22 Oct 2011 07:22:52 -0700
X-Env-Sender: bderzhavets@yahoo.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319293367!376556!1
X-Originating-IP: [98.139.52.234]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10111 invoked from network); 22 Oct 2011 14:22:47 -0000
Received: from nm14-vm0.bullet.mail.ac4.yahoo.com (HELO
	nm14-vm0.bullet.mail.ac4.yahoo.com) (98.139.52.234)
	by server-9.tower-182.messagelabs.com with SMTP;
	22 Oct 2011 14:22:47 -0000
Received: from [98.139.52.189] by nm14.bullet.mail.ac4.yahoo.com with NNFMP;
	22 Oct 2011 14:22:47 -0000
Received: from [98.139.52.159] by tm2.bullet.mail.ac4.yahoo.com with NNFMP;
	22 Oct 2011 14:22:46 -0000
Received: from [127.0.0.1] by omp1042.mail.ac4.yahoo.com with NNFMP;
	22 Oct 2011 14:22:46 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: 971109.37951.bm@omp1042.mail.ac4.yahoo.com
Received: (qmail 51142 invoked by uid 60001); 22 Oct 2011 14:22:46 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024;
	t=1319293366; bh=eyuwaXIXPRkUtXyZ7pWy3FcTn0ITCxsBcD1WIqb35DU=;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:Cc:In-Reply-To:MIME-Version:Content-Type;
	b=MZ7zV4zaOu8+EvQmSmwWAeduP/yPR4cZSE7UQIxsXiX9jwKP07IdtoTAHfu4S+Mdl6ExmqFFYRexRfZTm6viXSgYwKrJ3Q85D8fFmrI39Cfo62G+C/mT+N87gJJDCnRbKsmjL4yuC8kwoBcwBMaEXqo94YprrXzSZwE0E7+IIa4=
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=gwOgl2SRqtUJX8AGD6z3ZCIHnskXinJ1UZ20seQ5LaFjDEacdYET/YcHGD94CqUhiLjerGgvuB6n3/y0tznoBuMBgM8NVezqV0goFwJNxGHsvxk4H2Ifzpdc1lO5+RJD1zwZeBZSoTBPwFdYTtUnnWk2PUqQ+5cK6JOvzMpxmGA=;
X-YMail-OSG: OpuBrgsVM1nRgB2j9chWEghoLNDVclCI_z2n5.xdqEft6e1
	qC4RtEyyDVXQXLlNJfMtpyAzUvOIhevRefzljn7e9QR6FVC1fSsBpNSoAEeg
	sHwtfQdyGroIvt_ni2H58e.kaygM2kIV1oq..mZnkG3Lfjc89n5TJNypRkTA
	gb1s7KIr0owjNGN2zGAVpt.Td7IBrKXt6NdZ9I_V3j58445YOi51GnkxYG9x
	UVOg3JQkA1IugEH9n3K9j4pDHMHAkXjRxKEncBKwh_3K.pweFFhD_2Kn.Xfq
	t0aoyKi95xHVZOigXYYtMvT20Js1btRMirCPHSvDPEQwTNknomDY.SyGGYXx
	VAc9pu4B7Fr9uhiCzHKHV.WvNecNuj2NjvDDFEX85_ehdmkLcN9IW4.F0ET3
	yK.Fxycq4SxUo6IXQCoPlTdHX3YwlWJTsFtCOheSgCmCWH5HFZhr4ncbOXcc
	JGlz8HVQTxOTVSdxQY81liQsC
Received: from [31.23.19.3] by web65903.mail.ac4.yahoo.com via HTTP;
	Sat, 22 Oct 2011 07:22:46 PDT
X-Mailer: YahooMailClassic/14.0.10 YahooMailWebService/0.8.114.317681
Message-ID: <1319293366.98429.YahooMailClassic@web65903.mail.ac4.yahoo.com>
Date: Sat, 22 Oct 2011 07:22:46 -0700 (PDT)
From: Boris Derzhavets <bderzhavets@yahoo.com>
Subject: Re: [Xen-devel] [PATCH 0 of 6] pygrub fixes to support a Fedora 16
	guest
To: xen-devel@lists.xensource.com, M A Young <m.a.young@durham.ac.uk>
In-Reply-To: <alpine.DEB.2.00.1110192358140.15667@vega-a.dur.ac.uk>
MIME-Version: 1.0
Cc: 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="===============0646294584=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0646294584==
Content-Type: multipart/alternative;
	boundary="-578491218-1443096187-1319293366=:98429"

---578491218-1443096187-1319293366=:98429
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

Please, back port=A0 to xen-4.1-testing.hg.

Boris

--- 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 gue=
st
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 F=
edora 16 guest.

By default, Fedora 16 has GPT partitions and uses grub2. The first GPT part=
ition is a grub2 boot partition to store the grub2 code. The second GPT par=
tition contains the /boot filesystem with the kernel and initramfs files an=
d grub2 configuration files. The remaining space is an LVM partition contai=
ning 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 wi=
th a slightly edited introductory text.

The second patch allows pygrub to find the grub2 configuration file which a=
re in the /boot/grub2 directory on Fedora 16.

The third patch allows pygrub to handle partition references such as (hd0,g=
pt2) 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=3D"${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.

=A0=A0=A0 Michael Young

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

---578491218-1443096187-1319293366=:98429
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;">Please, back port&nbsp; to xen-4.1-testing.hg=
.<br><br>Boris<br><br>--- On <b>Wed, 10/19/11, M A Young <i>&lt;m.a.young@d=
urham.ac.uk&gt;</i></b> wrote:<br><blockquote style=3D"border-left: 2px sol=
id rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"><br>From: M A Yo=
ung &lt;m.a.young@durham.ac.uk&gt;<br>Subject: [Xen-devel] [PATCH 0 of 6] p=
ygrub fixes to support a Fedora 16 guest<br>To: xen-devel@lists.xensource.c=
om<br>Cc: "Ian Campbell" &lt;Ian.Campbell@citrix.com&gt;<br>Date: Wednesday=
, October 19, 2011, 7:02 PM<br><br><div class=3D"plainMail">This series con=
tains patches that may be needed to allow pygrub to boot a Fedora 16 guest.=
<br><br>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 con=
taining the remaining file systems.<br><br>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 introductor=
y text.<br><br>The second patch allows pygrub to find the grub2 configurati=
on file which are in the /boot/grub2 directory on Fedora 16.<br><br>The thi=
rd patch allows pygrub to handle partition references such as (hd0,gpt2) wh=
ich occur in the Fedora 16 grub2 configuration file.<br><br>The fourth patc=
h allows pygrub to parse grub2 configuration files with sub menus by ignori=
ng 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 hyp=
ervisor is installed on the guest.<br><br>The fifth patch allows pygrub to =
parse grub2 configurations with the line<br>set
 default=3D"${saved_entry}"<br>which can occur in the Fedora 16 grub2 confi=
guration file.<br><br>The final patch adds a sample Fedora 16 grub2 configu=
ration file<br>containing the problems fixed by patches 3,4 and 5.<br><br>&=
nbsp;&nbsp;&nbsp; Michael Young<br><br>____________________________________=
___________<br>Xen-devel mailing list<br><a ymailto=3D"mailto:Xen-devel@lis=
ts.xensource.com" href=3D"/mc/compose?to=3DXen-devel@lists.xensource.com">X=
en-devel@lists.xensource.com</a><br><a href=3D"http://lists.xensource.com/x=
en-devel" target=3D"_blank">http://lists.xensource.com/xen-devel</a><br></d=
iv></blockquote></td></tr></table>
---578491218-1443096187-1319293366=:98429--


--===============0646294584==
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

--===============0646294584==--


From xen-devel-bounces@lists.xensource.com Sat Oct 22 08:00:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 22 Oct 2011 08:00:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHd3T-00060a-OK; Sat, 22 Oct 2011 08:00:11 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHd1C-0005lz-V8
	for xen-devel@lists.xensource.com; Sat, 22 Oct 2011 07:57:51 -0700
X-Env-Sender: linux@eikelenboom.it
X-Msg-Ref: server-9.tower-21.messagelabs.com!1319295467!1135189!1
X-Originating-IP: [188.40.164.121]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9468 invoked from network); 22 Oct 2011 14:57:47 -0000
Received: from static.121.164.40.188.clients.your-server.de (HELO
	smtp.eikelenboom.it) (188.40.164.121)
	by server-9.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	22 Oct 2011 14:57:47 -0000
Received: from 143-67-ftth.onsneteindhoven.nl ([88.159.67.143]:59262
	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 1RHcyl-0008Vu-IJ; Sat, 22 Oct 2011 16:55:19 +0200
Date: Sat, 22 Oct 2011 16:57:48 +0200
From: Sander Eikelenboom <linux@eikelenboom.it>
Organization: Eikelenboom IT services
X-Priority: 3 (Normal)
Message-ID: <884563847.20111022165748@eikelenboom.it>
To: "Huang2, Wei" <Wei.Huang2@amd.com>
Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
In-Reply-To: <EE335F95F28A664DB4A21289D2AA053B01E6CBBD30@SAUSEXMBP01.amd.com>
References: <1904679511.20111018205519@eikelenboom.it>
	<20111019160801.GA22918@phenom.dumpdata.com>
	<EE335F95F28A664DB4A21289D2AA053B01E6CBBBDB@SAUSEXMBP01.amd.com>
	<707354928.20111019193003@eikelenboom.it>
	<EE335F95F28A664DB4A21289D2AA053B01E6CBBD30@SAUSEXMBP01.amd.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: quoted-printable
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

Hello Wei,

Is this for xen 4.1.2 ?
All hunks of the patch seem to be rejected.

--
Sander


Wednesday, October 19, 2011, 8:27:55 PM, you wrote:

> This reminds me of 23768:09595fdf3638, which reverted WeiWang's patch of =
forcing perdev-intremap as default. Could you try the attached patch on you=
r Xen 4.1 tree and test with patched xen.gz?=20

> Thanks,
> -Wei

> -----Original Message-----
> From: xen-devel-bounces@lists.xensource.com [mailto:xen-devel-bounces@lis=
ts.xensource.com] On Behalf Of Sander Eikelenboom
> Sent: Wednesday, October 19, 2011 12:30 PM
> To: Huang2, Wei
> Cc: xen-devel@lists.xensource.com; Konrad Rzeszutek Wilk
> Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu

> Hello Wei,

> Result is that using only "1" or "1" in combination with "2" always resul=
t in SATA I/O errors, so that doesn't boot.

> Haven't tried rebooting a lot of times without iommu yet.
> (the reason i bought the 890fx board in the first place)
> Will try that a few times when i have some more time.

> --
> Sander

> Wednesday, October 19, 2011, 6:38:38 PM, you wrote:

>> It looks similar.=20

>> Hi Sander, could you please test your system with the following options?

>> 1. iommu=3Damd-iommu-perdev-intremap in xen.gz GRUB entry
>> 2. pci=3Dnosmi in pvops GRUB entry
>> 3. iommu=3D0 in xen.gz GRUB entry [optional, only if (1) doesn't work fo=
r you]

>> We were seeing an issue which was caused by messed-up interrupt remap ta=
ble. George Dunlap's perdev interrupt map solved our problem.

>> Thanks,
>> -Wei

>> -----Original Message-----
>> From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]=20
>> Sent: Wednesday, October 19, 2011 11:08 AM
>> To: Sander Eikelenboom; Huang2, Wei
>> Cc: xen-devel@lists.xensource.com
>> Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu

>> On Tue, Oct 18, 2011 at 08:55:19PM +0200, Sander Eikelenboom wrote:
>>> Hi Konrad,
>>>=20
>>> On my system (AND phenom x6, 8gb mem) running xen 4.1.2-rc3
>>> and a custom kernel based on:
>>>=20
>>> - your linux-next branch
>>> - pulled in your apci/cpufreq branch
>>> - pulled in latest patches from linuses tree

>> Wei,
>> Are those similar to what you had been seeing?

>>>=20
>>> I'm experiencing infrequent panics at boot (say 1 out of 10 or 20 boots=
), doesn't seem to matter if it's a cold or a warm boot.
>>> It always seem to happen during or shortly after booting. When it doesn=
't occur then, it can run for at least several days/weeks (haven't seen it =
panic then).
>>> It doesn't seem to happen at a particular point at or shortly after boo=
ting, but it happens before starting any guests
>>>=20
>>> Unfortunately i haven't had serial console enabled at these times, but =
i have made some photo's.
>>> The first 3 times it locked completely before being able to print a sta=
cktrace, the 4th time it did (although the photo is a bit unsharp).
>>>=20
>>>=20
>>> So all in all, it kind of strange, i hope you can figure something out =
from the stacktrace, if not, i will see if i can try with serial console at=
tached.
>>>=20
>>> --
>>> Sander





>>> _______________________________________________
>>> Xen-devel mailing list
>>> Xen-devel@lists.xensource.com
>>> http://lists.xensource.com/xen-devel









--=20
Best regards,
 Sander                            mailto:linux@eikelenboom.it


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 22 22:10:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 22 Oct 2011 22:10:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHqKi-0002ca-FM; Sat, 22 Oct 2011 22:10:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHqJg-0002Q2-8k
	for xen-devel@lists.xensource.com; Sat, 22 Oct 2011 22:09:48 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1319346559!54344539!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18095 invoked from network); 23 Oct 2011 05:09:19 -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;
	23 Oct 2011 05:09:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,393,1315180800"; 
   d="scan'208";a="8535403"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	23 Oct 2011 05:09: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; Sun, 23 Oct 2011 06:09:44 +0100
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 1RHqJb-00042A-QP;
	Sun, 23 Oct 2011 05:09:43 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RHqJb-0007cp-FR;
	Sun, 23 Oct 2011 06:09:43 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9471-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 23 Oct 2011 06:09:43 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9471: 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 9471 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9471/

Regressions :-(

Tests which did not succeed and are blocking:
 test-i386-i386-pair          20 leak-check/check/src_host  fail REGR. vs. 9355
 test-i386-i386-pair          21 leak-check/check/dst_host  fail REGR. vs. 9355
 test-amd64-i386-xl-credit2   12 guest-saverestore.2        fail REGR. vs. 9355
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10     fail REGR. vs. 9355
 test-amd64-amd64-win          7 windows-install            fail REGR. vs. 9355

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-pv          13 guest-localmigrate.2         fail pass in 9363
 test-amd64-i386-pv           12 guest-saverestore.2          fail pass in 9363
 test-i386-i386-xl-win         7 windows-install              fail pass in 9363
 test-amd64-amd64-xl-win       7 windows-install              fail pass in 9363
 test-amd64-amd64-pair   21 leak-check/check/dst_host fail in 9363 pass in 9471
 test-amd64-amd64-pair   20 leak-check/check/src_host fail in 9363 pass in 9471
 test-amd64-i386-xl-win-vcpus1  7 windows-install     fail in 9363 pass in 9471
 test-amd64-i386-win           7 windows-install      fail in 9363 pass in 9471

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-i386-win-vcpus1   16 leak-check/check             fail   never pass
 test-i386-i386-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-i386-i386-xl-win        13 guest-stop             fail in 9363 never pass
 test-amd64-amd64-xl-win      13 guest-stop             fail in 9363 never pass

version targeted for testing:
 xen                  a7ccbc79fc17
baseline version:
 xen                  6c583d35d76d

------------------------------------------------------------
People who touched revisions under test:
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  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                                   fail    
 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                                          broken  
 test-amd64-amd64-pv                                          fail    
 test-amd64-i386-pv                                           fail    
 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:   23991:a7ccbc79fc17
tag:         tip
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:45:24 2011 +0200
    
    cpumask <=> xenctl_cpumap: allocate CPU masks and byte maps dynamically
    
    Generally there was a NR_CPUS-bits wide array in these functions and
    another (through a cpumask_t) on their callers' stacks, which may get
    a little large for big NR_CPUS. As the functions can fail anyway, do
    the allocation in there.
    
    For the x86/MCA case this require a little code restructuring: By using
    different CPU mask accessors it was possible to avoid allocating a mask
    in the broadcast case. Also, this was the only user that failed to
    check the return value of the conversion function (which could have led
    to undefined behvior).
    
    Also constify the input parameters of the two functions.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23990:1c8789852eaf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:44:47 2011 +0200
    
    x86/hpet: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23989:8269826353d8
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:44:03 2011 +0200
    
    credit: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23988:53528bab2eb4
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:43:35 2011 +0200
    
    cpupools: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23987:2682094bc243
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:42:47 2011 +0200
    
    x86/p2m: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Acked-by: Keir Fraser <keir@xen.org>
    
    --- 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);
     }
    
     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);
    
         if (old_flags & _PAGE_PRESENT)
    -        flush_tlb_mask(&p2m->p2m_dirty_cpumask);
    +        flush_tlb_mask(p2m->dirty_cpumask);
    
         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 = p2m_access_rwx;
    
         p2m->cr3 = CR3_EADDR;
    -    cpumask_clear(&p2m->p2m_dirty_cpumask);
    
         if ( hap_enabled(d) && (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) )
             ept_p2m_init(p2m);
    @@ -102,6 +101,8 @@ p2m_init_nestedp2m(struct domain *d)
             d->arch.nested_p2m[i] = p2m = xzalloc(struct p2m_domain);
             if (p2m == NULL)
                 return -ENOMEM;
    +        if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
    +            return -ENOMEM;
             p2m_initialise(d, p2m);
             p2m->write_p2m_entry = 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) = p2m = xzalloc(struct p2m_domain);
         if ( p2m == NULL )
             return -ENOMEM;
    +    if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
    +    {
    +        xfree(p2m);
    +        return -ENOMEM;
    +    }
         p2m_initialise(d, p2m);
    
         /* Must initialise nestedp2m unconditionally
    @@ -333,6 +339,9 @@ static void p2m_teardown_nestedp2m(struc
         uint8_t i;
    
         for (i = 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] = 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 = NULL;
    +    if ( d->arch.p2m )
    +    {
    +        free_cpumask_var(d->arch.p2m->dirty_cpumask);
    +        xfree(d->arch.p2m);
    +        d->arch.p2m = NULL;
    +    }
    
         /* We must teardown unconditionally because
          * we initialise them unconditionally.
    @@ -1200,7 +1213,7 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
                 if (p2m->cr3 == CR3_EADDR)
                     hvm_asid_flush_vcpu(v);
                 p2m->cr3 = 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 = cr3;
         nv->nv_flushp2m = 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);
    
    --- 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;
    
         struct domain     *domain;   /* back pointer to domain */
    
    
changeset:   23986:253073b522f8
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:23:05 2011 +0200
    
    allocate CPU sibling and core maps dynamically
    
    ... thus reducing the per-CPU data area size back to one page even when
    building for large NR_CPUS.
    
    At once eliminate the old __cpu{mask,list}_scnprintf() helpers.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23985:eef4641d6726
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:22:02 2011 +0200
    
    x86: allocate IRQ actions' cpu_eoi_map dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23984:07d303ff2757
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:21:09 2011 +0200
    
    eliminate direct assignments of CPU masks
    
    Use cpumask_copy() instead of direct variable assignments for copying
    CPU masks. While direct assignments are not a problem when both sides
    are variables actually defined as cpumask_t (except for possibly
    copying *much* more than would actually need to be copied), they must
    not happen when the original variable is of type cpumask_var_t (which
    may have lass space allocated to it than a full cpumask_t). Eliminate
    as many of such assignments as possible (in several cases it's even
    possible to collapse two operations [copy then clear one bit] into one
    [cpumask_andnot()]), and thus set the way for reducing the allocation
    size in alloc_cpumask_var().
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23983:1a4223c62ee7
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:19:44 2011 +0200
    
    eliminate cpumask accessors referencing NR_CPUS
    
    ... in favor of using the new, nr_cpumask_bits-based ones.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23982:511d5e65a302
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:17:42 2011 +0200
    
    introduce and use nr_cpu_ids and nr_cpumask_bits
    
    The former is the runtime equivalent of NR_CPUS (and users of NR_CPUS,
    where necessary, get adjusted accordingly), while the latter is for the
    sole use of determining the allocation size when dynamically allocating
    CPU masks (done later in this series).
    
    Adjust accessors to use either of the two to bound their bitmap
    operations - which one gets used depends on whether accessing the bits
    in the gap between nr_cpu_ids and nr_cpumask_bits is benign but more
    efficient.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23981:6c583d35d76d
user:        Tim Deegan <tim@xen.org>
date:        Thu Oct 20 15:36:01 2011 +0100
    
    x86/mm/p2m: don't leak state if nested-p2m init fails.
    
    Signed-off-by: Tim Deegan <tim@xen.org>
    
    
========================================
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 Sun Oct 23 02:14:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 23 Oct 2011 02:14:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHu8R-0000u2-Oh; Sun, 23 Oct 2011 02:14:27 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHu7m-0000hU-JW
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 02:13:46 -0700
X-Env-Sender: baozhao@gmail.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319361223!444014!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4627 invoked from network); 23 Oct 2011 09:13:43 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-12.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Oct 2011 09:13:43 -0000
Received: by bke17 with SMTP id 17so9149382bke.30
	for <xen-devel@lists.xensource.com>;
	Sun, 23 Oct 2011 02:13:43 -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=aVMZLFmmwD18V161WkGJ1GNFWJoxHnR0BbcKsFft2rM=;
	b=G7qofaMAKVvLZsG/8CrlmlMLFVKSSrowAr0IzzdRYc7nd2tk7yW2hJHwKLDo7rtKas
	etNkQqEwHI9rthhImGJ8NEiSDq2SywATVEQhKY2m31agdoPoA9uuP+Epp9MTVAf5ZCWo
	ElQAd7ckRmy4MuixacJ9d1s8CIb7EyImxHU8U=
MIME-Version: 1.0
Received: by 10.223.5.3 with SMTP id 3mr36186852fat.4.1319361221556; Sun, 23
	Oct 2011 02:13:41 -0700 (PDT)
Received: by 10.152.6.65 with HTTP; Sun, 23 Oct 2011 02:13:41 -0700 (PDT)
Date: Sun, 23 Oct 2011 17:13:41 +0800
Message-ID: <CAF6vk8HRruTKgZvW2vqviA960zUYh75sHm9SGG0c+sQc2qqExg@mail.gmail.com>
From: zhao bao <baozhao@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=UTF-8
Subject: [Xen-devel] question about relationship between
	/var/lib/xenstored/tdb and xenstore_domain_interface
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 read following link,
http://wiki.xen.org/xenwiki/XenIntro
, then I browsed some Xen 3.1 code. A question puzzles me.
As we know "The physical xenstore resides in one file:
/var/lib/xenstored/tdb. " , but drives(frontend/backend) visit
Xenstore by Xenbus. The data structure manipulated by Xenbus is
xenstore_domain_interface, not tdb. while tdb file is visited by
Xenstored daemon.

I cann't figure out the relationship between tdb and  xenstore_domain_interface.

For example,  if Xenbus sends a  XS_DIRECTORY  query message , where
does the reply message come from?

Thanks in advance!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Oct 23 04:30:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 23 Oct 2011 04:30:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RHwFk-0006BB-Ar; Sun, 23 Oct 2011 04:30:08 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHwEm-0005wD-1V
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 04:29:08 -0700
X-Env-Sender: linux@eikelenboom.it
X-Msg-Ref: server-8.tower-216.messagelabs.com!1319369344!731512!1
X-Originating-IP: [188.40.164.121]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7337 invoked from network); 23 Oct 2011 11:29:05 -0000
Received: from static.121.164.40.188.clients.your-server.de (HELO
	smtp.eikelenboom.it) (188.40.164.121)
	by server-8.tower-216.messagelabs.com with AES256-SHA encrypted SMTP;
	23 Oct 2011 11:29:05 -0000
Received: from 143-67-ftth.onsneteindhoven.nl ([88.159.67.143]:52387
	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 1RHwCK-0008Ll-9K; Sun, 23 Oct 2011 13:26:36 +0200
Date: Sun, 23 Oct 2011 13:29:01 +0200
From: Sander Eikelenboom <linux@eikelenboom.it>
Organization: Eikelenboom IT services
X-Priority: 3 (Normal)
Message-ID: <104105990.20111023132901@eikelenboom.it>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: quoted-printable
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] 
	devel/acpi-cpufreq.v3: arch/x86/built-in.o:(.data+0x5f88):
	undefined reference to `x86_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

Hi Konrad,

I tried to compile a kernel based on your latest "linux-next" tree (which s=
eems to work fine),
and the "devel/acpi-cpufreq.v3" branch pulled in. This fails with a compile=
 error:

  CC      drivers/usb/storage/sierra_ms.o
  CC      drivers/xen/pci.o
  CC      drivers/video/efifb.o
  CC      drivers/usb/storage/option_ms.o
  CC      drivers/video/output.o
  CC      drivers/xen/acpi.o
  CC      drivers/xen/acpi_processor.o
  LD      drivers/xen/xen-evtchn.o
  LD      drivers/xen/xen-gntdev.o
  LD      drivers/xen/xen-gntalloc.o
  LD      drivers/video/fb.o
  LD      drivers/usb/storage/usb-storage.o
  LD      drivers/usb/storage/usb-libusual.o
  LD      drivers/video/built-in.o
  LD      drivers/usb/storage/built-in.o
  LD      drivers/usb/built-in.o
  LD      drivers/xen/built-in.o
  LD      drivers/built-in.o
  LD      vmlinux.o
  MODPOST vmlinux.o
  GEN     .version
  CHK     include/generated/compile.h
  UPD     include/generated/compile.h
  CC      init/version.o
  LD      init/built-in.o
  LD      .tmp_vmlinux1
arch/x86/built-in.o:(.data+0x5f88): undefined reference to `x86_acpi_suspen=
d_lowlevel'
make: *** [.tmp_vmlinux1] Error 1

--

Sander


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Oct 23 20:38:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 23 Oct 2011 20:38:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIBNK-0000lk-V3; Sun, 23 Oct 2011 20:38:58 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIBMY-0000Zd-R3
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 20:38:11 -0700
X-Env-Sender: hui.lv@intel.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319427486!768778!1
X-Originating-IP: [143.182.124.37]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19654 invoked from network); 24 Oct 2011 03:38:07 -0000
Received: from mga14.intel.com (HELO mga14.intel.com) (143.182.124.37)
	by server-4.tower-216.messagelabs.com with SMTP;
	24 Oct 2011 03:38:07 -0000
Received: from azsmga002.ch.intel.com ([10.2.17.35])
	by azsmga102.ch.intel.com with ESMTP; 23 Oct 2011 20:38:05 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,395,1315206000"; d="scan'208";a="29435094"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by AZSMGA002.ch.intel.com with ESMTP; 23 Oct 2011 20:38:04 -0700
Received: from pgsmsx509.gar.corp.intel.com (172.30.13.17) by
	pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Mon, 24 Oct 2011 11:36:59 +0800
Received: from shsmsx602.ccr.corp.intel.com (10.239.4.104) by
	PGSMSX509.gar.corp.intel.com (172.30.13.17) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Mon, 24 Oct 2011 11:36:59 +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, 24 Oct 2011 11:36:55 +0800
From: "Lv, Hui" <hui.lv@intel.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Mon, 24 Oct 2011 11:36:51 +0800
Thread-Topic: [PATCH] scheduler rate controller 
Thread-Index: AcyR/FduCN3+KuzqQf+8gFSlWKyc+wAAFEVQ
Message-ID: <C10D3FB0CD45994C8A51FEC1227CE22F340768D793@shsmsx502.ccr.corp.intel.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
x-cr-hashedpuzzle: ANKQ AyG5 CVaz Iszb I5Zj KDlr KVXG LHWE Lhdl NO+B Ofyv
	PRs9 SDzj S519 S6ib VZxr; 2;
	awBlAGkAcgBAAHgAZQBuAC4AbwByAGcAOwB4AGUAbgAtAGQAZQB2AGUAbABAAGwAaQBzAHQAcwAuAHgAZQBuAHMAbwB1AHIAYwBlAC4AYwBvAG0A;
	Sosha1_v1; 7; {3200352B-67F7-4FB3-AEFF-60C000261543};
	aAB1AGkALgBsAHYAQABpAG4AdABlAGwALgBjAG8AbQA=; Mon,
	24 Oct 2011 03:36:51 GMT;
	WwBQAEEAVABDAEgAXQAgAHMAYwBoAGUAZAB1AGwAZQByACAAcgBhAHQAZQAgAGMAbwBuAHQAcgBvAGwAbABlAHIA
x-cr-puzzleid: {3200352B-67F7-4FB3-AEFF-60C000261543}
acceptlanguage: en-US
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: "Duan, Jiangang" <jiangang.duan@intel.com>, "Tian,
	Kevin" <kevin.tian@intel.com>, "keir@xen.org" <keir@xen.org>,
	"Dong, Eddie" <eddie.dong@intel.com>
Subject: [Xen-devel] [PATCH] scheduler rate controller 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 one of the topics presented in Xen summit2011 in SC, we proposed one met=
hod scheduler rate controller (SRC) to control high frequency of scheduling=
 under some conditions. You can find the slides at=20
http://www.slideshare.net/xen_com_mgr/9-hui-lvtacklingthemanagementchalleng=
esofserverconsolidationonmulticoresystems

In the followings, we have tested it with 2-socket multi-core system with m=
any rounds and got the positive results and improve the performance greatly=
 either with the consolidation workload SPECvirt_2010 or some small workloa=
ds such as sysbench and SPECjbb. So I posted it here for review.

>From Xen scheduling mechanism, hypervisor kicks related VCPUs by raising sc=
hedule softirq during processing external interrupts. Therefore, if the num=
ber of IRQ is very large, the scheduling happens more frequent. Frequent sc=
heduling will=20
1) bring more overhead for hypervisor and=20
2) increase cache miss rate.=20

In our consolidation workloads, SPECvirt_sc2010, SR-IOV & iSCSI solution ar=
e adopted to bypass software emulation but bring heavy network traffic. Cor=
respondingly, 15k scheduling happened per second on each physical core, whi=
ch means the average running time is  very short, only 60us. We proposed SR=
C in XEN to mitigate this problem.=20
The performance benefits brought by this patch is very huge at peak through=
put with no influence when system loads are low.

SRC improved SPECvirt performance by 14%.=20
1)It reduced CPU utilization, which allows more load to be added.
2)Response time (QoS)  became better at the same CPU %.
3)The better response time allowed us to push the CPU % at peak performance=
 to an even higher level (CPU was not saturated in SPECvirt).
SRC reduced context switch rate significantly, resulted in=20
2)Smaller Path Length
3)Less cache misses thus lower CPI
4)Better performance for both Guest and Hypervisor sides.

With this patch, from our SPECvirt_sc2010 results, the performance of xen c=
atches up the other open sourced hypervisor.=20


Signed-off-by: Hui Lv hui.lv@intel.com


diff -ruNp xen.org/common/schedule.c xen/common/schedule.c
--- xen.org/common/schedule.c	2011-10-20 03:29:44.000000000 -0400
+++ xen/common/schedule.c	2011-10-23 21:41:14.000000000 -0400
@@ -98,6 +98,31 @@ static inline void trace_runstate_change
=20
     __trace_var(event, 1/*tsc*/, sizeof(d), &d);
 }
+/*
+ *opt_sched_rate_control:  parameter to turn on/off  scheduler rate contro=
ller (SRC)
+ *opt_sched_rate_high: scheduling frequency threshold, default value is 50=
.
+
+ *Suggest to set the value of opt_sched_rate_high larger than 50.
+ *It means if the scheduling frequency number, calculated during SCHED_SRC=
_INTERVAL (default 10 millisecond), is larger than opt_sched_rate_high, SRC=
 works.
+*/
+bool_t opt_sched_rate_control =3D 0;
+unsigned int opt_sched_rate_high =3D 50;          =20
+boolean_param("sched_rate_control", opt_sched_rate_control);
+integer_param("sched_rate_high", opt_sched_rate_high);
+
+
+/* The following function is the scheduling rate controller (SRC). It is t=
riggered when
+ * the frequency of scheduling is excessive high. (larger than opt_sched_r=
ate_high)
+ *=20
+ * Rules to control the scheduling frequency
+ * 1)if the frequency of scheduling (sd->s_csnum), calculated during the p=
eriod of SCHED_SRC_INTERVAL,
+ * is larger than the threshold opt_sched_rate_high, SRC is enabled to wor=
k by setting sd->s_src_control =3D 1
+ * 2)if SRC works, it returns previous vcpu directly if previous vcpu is s=
till runnalbe and not the idle vcpu.
+ * This method can decrease the frequency of scheduling when the schedulin=
g frequency is excessive.
+*/
+
+void src_controller(struct schedule_data *sd, struct vcpu *prev, s_time_t =
now);
+
=20
 static inline void trace_continue_running(struct vcpu *v)
 {
@@ -1033,6 +1058,29 @@ static void vcpu_periodic_timer_work(str
     set_timer(&v->periodic_timer, periodic_next_event);
 }
=20
+void src_controller(struct schedule_data *sd, struct vcpu *prev, s_time_t =
now)
+{
+    sd->s_csnum++;
+    if ((now - sd->s_src_loop_begin) >=3D MILLISECS(SCHED_SRC_INTERVAL))
+    {
+        if (sd->s_csnum >=3D opt_sched_rate_high)
+               sd->s_src_control =3D 1;
+        else
+               sd->s_src_control =3D 0;
+        sd->s_src_loop_begin =3D now;
+        sd->s_csnum =3D 0;
+    }
+    if (sd->s_src_control)
+    {
+       if (!is_idle_vcpu(prev) && vcpu_runnable(prev))
+       {
+           perfc_incr(sched_src);
+           return continue_running(prev);
+       }
+       perfc_incr(sched_nosrc);
+    }
+}
+
 /*=20
  * The main function
  * - deschedule the current domain (scheduler independent).
@@ -1054,6 +1102,8 @@ static void schedule(void)
=20
     sd =3D &this_cpu(schedule_data);
=20
+    if (opt_sched_rate_control)
+        src_controller(sd,prev,now);
     /* Update tasklet scheduling status. */
     switch ( *tasklet_work )
     {
@@ -1197,6 +1247,9 @@ static int cpu_schedule_up(unsigned int=20
     sd->curr =3D idle_vcpu[cpu];
     init_timer(&sd->s_timer, s_timer_fn, NULL, cpu);
     atomic_set(&sd->urgent_count, 0);
+    sd->s_csnum=3D0;
+    sd->s_src_loop_begin=3DNOW();
+    sd->s_src_control=3D0;
=20
     /* Boot CPU is dealt with later in schedule_init(). */
     if ( cpu =3D=3D 0 )
diff -ruNp xen.org/include/xen/perfc_defn.h xen/include/xen/perfc_defn.h
--- xen.org/include/xen/perfc_defn.h	2011-10-20 03:29:44.000000000 -0400
+++ xen/include/xen/perfc_defn.h	2011-10-23 21:08:28.000000000 -0400
@@ -15,6 +15,8 @@ PERFCOUNTER(ipis,                   "#IP
 PERFCOUNTER(sched_irq,              "sched: timer")
 PERFCOUNTER(sched_run,              "sched: runs through scheduler")
 PERFCOUNTER(sched_ctx,              "sched: context switches")
+PERFCOUNTER(sched_src,              "sched: src triggered")
+PERFCOUNTER(sched_nosrc,            "sched: src not triggered")
=20
 PERFCOUNTER(vcpu_check,             "csched: vcpu_check")
 PERFCOUNTER(schedule,               "csched: schedule")
diff -ruNp xen.org/include/xen/sched-if.h xen/include/xen/sched-if.h
--- xen.org/include/xen/sched-if.h	2011-10-20 03:29:44.000000000 -0400
+++ xen/include/xen/sched-if.h	2011-10-23 21:20:57.000000000 -0400
@@ -15,6 +15,11 @@ extern struct cpupool *cpupool0;
=20
 /* cpus currently in no cpupool */
 extern cpumask_t cpupool_free_cpus;
+/*SRC judge whether to trigger scheduling controller based on the comparis=
on=20
+ *between the scheduling frequency, counted during SCHED_SRC_INTERVAL, and=
 the threshold opt_sched_rate_high
+ *Suggest to set SCHED_SRC_INTERVAL to 10 (millisecond)
+*/
+#define SCHED_SRC_INTERVAL      10
=20
 /*
  * In order to allow a scheduler to remap the lock->cpu mapping,
@@ -32,6 +37,9 @@ struct schedule_data {
     struct vcpu        *curr;           /* current task                   =
 */
     void               *sched_priv;
     struct timer        s_timer;        /* scheduling timer               =
 */
+    int                 s_csnum;          	/* scheduling number based on l=
ast period */
+    s_time_t            s_src_loop_begin;       /* SRC conting start point=
 */
+    bool_t              s_src_control;        	/*indicate whether src shou=
ld be triggered */
     atomic_t            urgent_count;   /* how many urgent vcpus          =
 */
 };

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Oct 23 22:53:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 23 Oct 2011 22:53:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIDTf-0004OZ-3W; Sun, 23 Oct 2011 22:53:39 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIDSp-0004Bo-6I
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 22:52:47 -0700
X-Env-Sender: apxeng@gmail.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319435563!776495!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27664 invoked from network); 24 Oct 2011 05:52:44 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 05:52:44 -0000
Received: by qyg36 with SMTP id 36so5849229qyg.9
	for <xen-devel@lists.xensource.com>;
	Sun, 23 Oct 2011 22:52: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=1RTraDc4vVu9kab42YnDYNwc7k1P57lCDNzgfYD8398=;
	b=usw57ewI+XrudYY8eQ1wLtw8eEwYFBs8TS4V/7wYlfpfFtzusungzXhJIAHGFyVQ6d
	21zqBmXzyyRRSgagCgGl8fm2nYFyZWmNOaqbEFBBsxHkpWYjjWRI9hFBq5rD38tbnvF2
	jo1uad2+piJdoxa623p4pKZgIDMY5k9b5rUvs=
MIME-Version: 1.0
Received: by 10.229.44.69 with SMTP id z5mr4214433qce.244.1319435562827; Sun,
	23 Oct 2011 22:52:42 -0700 (PDT)
Received: by 10.229.74.19 with HTTP; Sun, 23 Oct 2011 22:52:42 -0700 (PDT)
In-Reply-To: <1319287633.17770.10.camel@dagon.hellion.org.uk>
References: <CAGU+aut64MmMmf901p9Gsya4O=hep8merZUDfSUuJCJXMVFtrg@mail.gmail.com>
	<1319013780.3385.64.camel@zakaz.uk.xensource.com>
	<20126.62103.576976.140927@mariner.uk.xensource.com>
	<CAGU+autjm1EEKeDjQiuwixo0QAwwNntsFWZ9V6JSTZOhyWVadg@mail.gmail.com>
	<1319287633.17770.10.camel@dagon.hellion.org.uk>
Date: Sun, 23 Oct 2011 22:52:42 -0700
Message-ID: <CAGU+auvQx1+dtj-ByDHSCyw6B3WwT7pJsHrgn3mx3+jj3rAjew@mail.gmail.com>
Subject: Re: [Xen-devel] make install not creating lib entries in /usr/lib
	under Ubunu 11.10
From: AP <apxeng@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 5:47 AM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Fri, 2011-10-21 at 04:52 +0100, AP wrote:
>> On Wed, Oct 19, 2011 at 8:53 AM, Ian Jackson <Ian.Jackson@eu.citrix.com> wrote:
>> > Ian Campbell writes ("Re: [Xen-devel] make install not creating lib entries in /> It might be nice if there was a single variable which could be set to
>> >> control this behaviour, or even better if it can be automatically
>> >> detected. I'm also inclined to suggest that the default should be to
>> >> use /usr/lib and leave the lib64 thing as a RH special case, but then
>> >> I'm a Debian user so I would think that ;-)
>> >
>> > At the very least we ought not to dump things in /usr/lib64 unless it
>> > already exists and is distinct from /usr/lib.
>>
>> I deleted my /usr/lib64 and did a "make install-tools
>> PYTHON_PREFIX_ARG=". At the end a /usr/lib64 directory was created
>> with Xen related libraries inside.
>
> I think you need to reread my earlier reply -- I explained what is going
> on and provided an example of the sort of patch which fixes it. There is
> no reason to expect that deleting /usr/lib64 will change anything.

Sorry, I misunderstood Ian Jackson's comment. It made me think
deleting /usr/lib64 might change something :) I now understand the
point he was trying to make and your fix. Thanks for the help.

> Ian.
>
>>
>> > We should think about multiarch too at some 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 Oct 24 01:48:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 01:48:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIGCS-00011j-LE; Mon, 24 Oct 2011 01:48:04 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIGBh-0000pL-9w
	for Xen-devel@lists.xensource.com; Mon, 24 Oct 2011 01:47:17 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319446034!523751!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13406 invoked from network); 24 Oct 2011 08:47:14 -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;
	24 Oct 2011 08:47:14 -0000
X-IronPort-AV: E=Sophos;i="4.69,396,1315180800"; 
   d="scan'208";a="8543803"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 08:47:13 +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, 24 Oct 2011 09:47:14 +0100
Subject: Re: [Xen-devel] HYBRID: (PV in HVM) update
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Mukesh Rathor <mukesh.rathor@oracle.com>
Date: Mon, 24 Oct 2011 09:47:13 +0100
In-Reply-To: <20111020161709.42a56c27@mantra.us.oracle.com>
References: <20110818155414.1d8c3015@mantra.us.oracle.com>
	<20111020161709.42a56c27@mantra.us.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: <1319446033.3385.139.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Xen-devel@lists.xensource.com" <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 Fri, 2011-10-21 at 00:17 +0100, Mukesh Rathor wrote:
> On Thu, 18 Aug 2011 15:54:14 -0700
> Mukesh Rathor <mukesh.rathor@oracle.com> wrote:
> > 
> > JFYI... So I had a third type is_hybrid in my prototype, that I
> > thought I could get rid of, and hide things under is_hvm check. But
> > that just touches too much code, and things get ugly a bit all over.
> > 
> > It seems I could just mark the guest PV if not EPT and using PV
> > paging, and mark it HVM if EPT enabled to keep changes minimum, and
> > just check for hybrid where needed (so add is_hybrid back in). Trying
> > that now....
> > 
> > thanks
> > Mukesh
> > 
> 
> 
> YEAY guys!!! I now have PV in HVM guest running with EPT! 

That's awesome news!

> I'll clean up the code (tons of debug stuff right now), and post
> it for anyone to look at. 

> Next and final frontier after that, running it as dom0.

Whee!

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 02:32:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 02:32:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIGtJ-00028J-5E; Mon, 24 Oct 2011 02:32:21 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIGsC-0001uL-LU
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:31:13 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319448638!54040726!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26086 invoked from network); 24 Oct 2011 09:30:38 -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;
	24 Oct 2011 09:30:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,397,1315180800"; 
   d="scan'208";a="8545178"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 09:31:09 +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, 24 Oct 2011 10:31:09 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>, David Miller <davem@davemloft.net>
Date: Mon, 24 Oct 2011 10:31:08 +0100
In-Reply-To: <1319124957-32269-6-git-send-email-dgdegra@tycho.nsa.gov>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-6-git-send-email-dgdegra@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319448669.3385.161.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: netdev@vger.kernel.org,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	David Vrabel <david.vrabel@citrix.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH 5/6] xen/netback: Enable netback 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

On Thu, 2011-10-20 at 16:35 +0100, Daniel De Graaf wrote:
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>

Acked-by: Ian Campbell <ian.campbell@citrix.com>

Normally netback patches would go in via the networking subsystem
maintainer's tree but since this depends on core Xen patches from this
series and is unlikely to conflict with anything in the net-next tree I
suspect it would make more sense for Konrad to take this one.

David (Miller) does that work for you?

Ian.

> ---
>  drivers/net/xen-netback/netback.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
> index 3af2924..9d80f99 100644
> --- a/drivers/net/xen-netback/netback.c
> +++ b/drivers/net/xen-netback/netback.c
> @@ -1626,7 +1626,7 @@ static int __init netback_init(void)
>  	int rc = 0;
>  	int group;
>  
> -	if (!xen_pv_domain())
> +	if (!xen_domain())
>  		return -ENODEV;
>  
>  	xen_netbk_group_nr = num_online_cpus();



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 02:35:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 02:35:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIGwE-0002Xy-6D; Mon, 24 Oct 2011 02:35:22 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIGvO-0002LQ-WA
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:34:31 -0700
X-Env-Sender: davem@davemloft.net
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319448866!531699!1
X-Originating-IP: [198.137.202.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9731 invoked from network); 24 Oct 2011 09:34:27 -0000
Received: from shards.monkeyblade.net (HELO shards.monkeyblade.net)
	(198.137.202.13)
	by server-7.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 09:34:27 -0000
Received: from localhost (cpe-66-65-61-233.nyc.res.rr.com [66.65.61.233])
	(authenticated bits=0)
	by shards.monkeyblade.net (8.14.4/8.14.4) with ESMTP id p9O9YJgZ017223
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 02:34:22 -0700
Date: Mon, 24 Oct 2011 05:34:19 -0400 (EDT)
Message-Id: <20111024.053419.1995560587557035685.davem@davemloft.net>
To: Ian.Campbell@citrix.com
From: David Miller <davem@davemloft.net>
In-Reply-To: <1319448669.3385.161.camel@zakaz.uk.xensource.com>
References: <1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-6-git-send-email-dgdegra@tycho.nsa.gov>
	<1319448669.3385.161.camel@zakaz.uk.xensource.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, 24 Oct 2011 02:34:23 -0700 (PDT)
Cc: netdev@vger.kernel.org, dgdegra@tycho.nsa.gov,
	xen-devel@lists.xensource.com, david.vrabel@citrix.com,
	konrad.wilk@oracle.com
Subject: [Xen-devel] Re: [PATCH 5/6] xen/netback: Enable netback 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: Ian Campbell <Ian.Campbell@citrix.com>
Date: Mon, 24 Oct 2011 10:31:08 +0100

> On Thu, 2011-10-20 at 16:35 +0100, Daniel De Graaf wrote:
>> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> 
> Acked-by: Ian Campbell <ian.campbell@citrix.com>
> 
> Normally netback patches would go in via the networking subsystem
> maintainer's tree but since this depends on core Xen patches from this
> series and is unlikely to conflict with anything in the net-next tree I
> suspect it would make more sense for Konrad to take this one.
> 
> David (Miller) does that work for you?

Yes, it does.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 02:39:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 02:39:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIH0E-0002yL-AM; Mon, 24 Oct 2011 02:39:30 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIGzY-0002lZ-Ez
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:38:48 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319449124!1397236!1
X-Originating-IP: [65.55.88.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24803 invoked from network); 24 Oct 2011 09:38:45 -0000
Received: from tx2ehsobe002.messaging.microsoft.com (HELO
	TX2EHSOBE003.bigfish.com) (65.55.88.12)
	by server-14.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	24 Oct 2011 09:38:45 -0000
Received: from mail65-tx2-R.bigfish.com (10.9.14.246) by
	TX2EHSOBE003.bigfish.com (10.9.40.23) with Microsoft SMTP Server id
	14.1.225.22; Mon, 24 Oct 2011 09:38:40 +0000
Received: from mail65-tx2 (localhost.localdomain [127.0.0.1])	by
	mail65-tx2-R.bigfish.com (Postfix) with ESMTP id D952C16301ED;
	Mon, 24 Oct 2011 09:38:41 +0000 (UTC)
X-SpamScore: -11
X-BigFish: VPS-11(zzbb2dK1432N98dKzz1202hzz8275bhz32i668h839h)
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 mail65-tx2 (localhost.localdomain [127.0.0.1]) by mail65-tx2
	(MessageSwitch) id 1319449121435435_12100;
	Mon, 24 Oct 2011 09:38:41 +0000 (UTC)
Received: from TX2EHSMHS031.bigfish.com (unknown [10.9.14.241])	by
	mail65-tx2.bigfish.com (Postfix) with ESMTP id 61A67DE8058;
	Mon, 24 Oct 2011 09:38:41 +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; Mon, 24 Oct 2011 09:38:39 +0000
X-WSS-ID: 0LTKDGG-02-EZZ-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 20A63C8226;	Mon, 24 Oct 2011 04:38:39 -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;
	Mon, 24 Oct 2011 04:38:45 -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;
	Mon, 24 Oct 2011 04:38:41 -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; Mon, 24 Oct 2011
	05:38:39 -0400
Message-ID: <4EA5321E.9080902@amd.com>
Date: Mon, 24 Oct 2011 11:38:38 +0200
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: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] Re: c/s 23990:1c8789852eaf: xen crashes
References: <4EA1659D.7080904@amd.com>
	<4EA1975F020000780005CC86@nat28.tlf.novell.com>
In-Reply-To: <4EA1975F020000780005CC86@nat28.tlf.novell.com>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: Keir, "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	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 10/21/11 16:01, Jan Beulich wrote:
>>>> On 21.10.11 at 14:29, Christoph Egger<Christoph.Egger@amd.com>  wrote:
>> c/s 23990:1c8789852eaf crashes xen due to a NULL pointer dereference
>> within the xen kernel.
>
> Would you be able to give the patch I just sent a try before I commit it?
>

With this patch I can no longer reproduce the crash.

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 Mon Oct 24 02:40:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 02:40:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIH1U-0003MN-AI; Mon, 24 Oct 2011 02:40:48 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIGza-0002lb-Ef
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:38:50 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319449127!1397248!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24933 invoked from network); 24 Oct 2011 09:38:47 -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;
	24 Oct 2011 09:38:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,397,1315180800"; 
   d="scan'208";a="8545386"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 09:38: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;
	Mon, 24 Oct 2011 10:38:17 +0100
Subject: Re: [Xen-devel] [PATCH V2 02/11] libxl_json,	Check the parser
	status before to call parse_complete
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 10:38:17 +0100
In-Reply-To: <1319133573-25891-3-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
	<1319133573-25891-3-git-send-email-anthony.perard@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: <1319449097.3385.165.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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 Thu, 2011-10-20 at 18:59 +0100, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  tools/libxl/libxl_json.c |    4 +++-
>  1 files changed, 3 insertions(+), 1 deletions(-)
> 
> diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
> index 11f65fc..c743114 100644
> --- a/tools/libxl/libxl_json.c
> +++ b/tools/libxl/libxl_json.c
> @@ -744,7 +744,9 @@ 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));
> -    status = yajl_parse_complete(yajl_ctx.hand);
> +    if (status == yajl_status_ok) {
> +        status = yajl_parse_complete(yajl_ctx.hand);
> +    }
>  
>      if (status == yajl_status_ok) {

You now have two of these checks back-to-back. I guess they could be
combined?

>          libxl__json_object *o = yajl_ctx.head;



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 02:59:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 02:59:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIHJo-0004DC-Hc; Mon, 24 Oct 2011 02:59:44 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIHHp-0003ub-Da
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:57:41 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1319450258!749288!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32765 invoked from network); 24 Oct 2011 09:57:38 -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;
	24 Oct 2011 09:57:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,397,1315180800"; 
   d="scan'208";a="8545852"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 09:57: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, 24 Oct 2011 10:57:37 +0100
Subject: Re: [Xen-devel] [PATCH V2 09/11] libxl_json,	Handle number abrove
	LONG_MAX.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 10:57:37 +0100
In-Reply-To: <1319133573-25891-10-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
	<1319133573-25891-10-git-send-email-anthony.perard@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: <1319450257.3385.175.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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 Thu, 2011-10-20 at 18:59 +0100, Anthony PERARD wrote:
> The integers are now "long long" in the json_object. If strtoll failed to
> convert a string into a number, the number is stored as it (a char*).
> 
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  tools/libxl/libxl_internal.h |    7 +++--
>  tools/libxl/libxl_json.c     |   52 +++++++++++++++++++++++------------------
>  2 files changed, 33 insertions(+), 26 deletions(-)
> 
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 5720b31..849b251 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -465,7 +465,8 @@ typedef enum {
>      JSON_TRUE,
>      JSON_FALSE,
>      JSON_INTEGER,
> -    JSON_DOUBLE,

Did you accidentally remove this ...

> +    /* number is store in string, it's too big to be a long long */
> +    JSON_NUMBER,
>      JSON_STRING,
>      JSON_MAP,
>      JSON_ARRAY,
> @@ -475,7 +476,7 @@ typedef enum {
>  typedef struct libxl__json_object {
>      libxl__json_node_type type;
>      union {
> -        long i;
> +        long long i;
>          double d;

... or accidentally leave this?

>          char *string;
>          /* List of libxl__json_object */
> @@ -534,7 +535,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 c743114..2d8f61e 100644
> --- a/tools/libxl/libxl_json.c
> +++ b/tools/libxl/libxl_json.c
> @@ -44,6 +44,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 +61,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)

that typo got propagated...

>  #  define DEBUG_GEN_REPORT(ctx)                 ((void)0)
>  #endif
>  
> @@ -363,6 +365,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,35 +507,38 @@ static int json_callback_boolean(void *opaque, int boolean)
>      return 1;
>  }
>  
> -static int json_callback_integer(void *opaque, long value)
> +static int json_callback_number(void *opaque, const char *s, unsigned int len)
>  {
>      libxl__yajl_ctx *ctx = opaque;
> -    libxl__json_object *obj;
> -
> -    DEBUG_GEN_VALUE(ctx, integer, value);
> +    libxl__json_object *obj = NULL;
> +    long long i;
>  
> -    if ((obj = json_object_alloc(ctx->gc, JSON_INTEGER)) == NULL)
> -        return 0;
> -    obj->u.i = value;
> +    /* should be replace by number */
> +    DEBUG_GEN_NUMBER(ctx, s, len);
>  
> -    if (json_object_append_to(ctx->gc, obj, ctx->current) == -1) {
> -        libxl__json_object_free(ctx->gc, obj);
> -        return 0;
> -    }
> +    i = strtoll(s, NULL, 10);
>  
> -    return 1;
> -}
> +    if ((i == LLONG_MIN || i == LLONG_MAX) && errno == ERANGE) {
> +        char *t = NULL;
>  
> -static int json_callback_double(void *opaque, double value)
> -{
> -    libxl__yajl_ctx *ctx = opaque;
> -    libxl__json_object *obj;
> +        if ((obj = json_object_alloc(ctx->gc, JSON_NUMBER)) == NULL)
> +            return 0;
>  
> -    DEBUG_GEN_VALUE(ctx, double, 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;
>  
> -    if ((obj = json_object_alloc(ctx->gc, JSON_DOUBLE)) == NULL)
> -        return 0;
> -    obj->u.d = value;
> +        obj->u.string = t;
> +    } else {
> +        if ((obj = json_object_alloc(ctx->gc, JSON_INTEGER)) == NULL)
> +            return 0;
> +        obj->u.i = i;
> +    }
>  
>      if (json_object_append_to(ctx->gc, obj, ctx->current) == -1) {
>          libxl__json_object_free(ctx->gc, obj);
> @@ -706,9 +712,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,



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 03:03:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 03:03:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIHNa-0004fw-Hu; Mon, 24 Oct 2011 03:03:39 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIHIy-000428-33
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:58:55 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319450328!36427249!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27144 invoked from network); 24 Oct 2011 09:58:48 -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;
	24 Oct 2011 09:58:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,397,1315180800"; 
   d="scan'208";a="8545876"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 09:58: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;
	Mon, 24 Oct 2011 10:58:41 +0100
Subject: Re: [Xen-devel] [PATCH V2 04/11] libxl,	Introduce dm-version
	xenstore key.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 10:58:40 +0100
In-Reply-To: <1319133573-25891-5-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
	<1319133573-25891-5-git-send-email-anthony.perard@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: <1319450320.3385.176.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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 Thu, 2011-10-20 at 18:59 +0100, Anthony PERARD wrote:
> 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.
> 
> 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   |   28 ++++++++++++++++++++++++++++
>  tools/libxl/libxl_internal.c |   19 +++++++++++++++++++
>  tools/libxl/libxl_internal.h |    5 +++++
>  4 files changed, 54 insertions(+), 0 deletions(-)
> 
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index 064fbc4..50b97c2 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__sprintf(&gc, "/libxl/%d", 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..bed991c 100644
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -322,6 +322,9 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info,
>      xs_transaction_t t = 0;
>      xen_domain_handle_t handle;
>  
> +    struct xs_permissions libxlperm[1];
> +    char *libxl_path = NULL;
> +

The variable declaration block has little sections of perms and *_path
-- you might as well include those there. libxlperm might be better
called noperm (assuming that really is it's meaning, xs's permission
scheme confuses the hell out of me).

>      assert(!libxl_domid_valid_guest(*domid));
>  
>      uuid_string = libxl__uuid2string(gc, info->uuid);
> @@ -368,6 +371,15 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info,
>          goto out;
>      }
>  
> +    libxl_path = libxl__sprintf(gc, "/libxl/%i", *domid);

This is probably worthy of a little helper, similar to
libxl__xs_get_dom_path(). (/vm/blah ought to have one too but doesn't).

> +    if (!libxl_path) {
> +        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot allocate create paths");
> +        rc = ERROR_FAIL;
> +        goto out;
> +    }
> +    libxlperm[0].id = 0;
> +    libxlperm[0].perms = XS_PERM_NONE;
> +
>      roperm[0].id = 0;
>      roperm[0].perms = XS_PERM_NONE;
>      roperm[1].id = *domid;
> @@ -386,6 +398,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, libxlperm, ARRAY_SIZE(libxlperm));
> +
>      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 +445,16 @@ 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__sprintf(gc, "/libxl/%i/dm-version", domid);
> +    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 +511,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..5d0a2d4 100644
> --- a/tools/libxl/libxl_internal.c
> +++ b/tools/libxl/libxl_internal.c
> @@ -319,6 +319,25 @@ 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__sprintf(gc, "/libxl/%d/dm-version", domid);
> +    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) {

I think this should be a fatal error, if you've managed to read
something from this key and it isn't one of the expect values then
something bad has happened.

> +        return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL;
> +    }
> +    return value;
> +}
> +
>  /*
>   * Local variables:
>   * mode: C
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 2e26ac6..5720b31 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -554,6 +554,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
>  
>  /*



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 03:05:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 03:05:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIHPc-000541-48; Mon, 24 Oct 2011 03:05:44 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIHLD-0004SF-DH
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 03:01:14 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1319450468!1310536!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4750 invoked from network); 24 Oct 2011 10:01:08 -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;
	24 Oct 2011 10:01:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,397,1315180800"; 
   d="scan'208";a="8545963"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 10:01:07 +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, 24 Oct 2011 11:01:07 +0100
Subject: Re: [Xen-devel] [PATCH V2 10/11] libxl_qmp,	Introduce
	libxl__qmp_pci_add.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 11:01:07 +0100
In-Reply-To: <1319133573-25891-11-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
	<1319133573-25891-11-git-send-email-anthony.perard@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: <1319450467.3385.178.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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 Thu, 2011-10-20 at 18:59 +0100, Anthony PERARD wrote:
> 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      |  107 ++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 105 insertions(+), 0 deletions(-)
> 
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 849b251..09f618f 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"
> @@ -444,6 +447,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 547cd53..bce7e16 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,
> @@ -619,6 +620,112 @@ int libxl__qmp_query_serial(libxl__qmp_handler *qmp)
>      return rc;
>  }
>  
> +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_request_handle request = {
> +        .callback = pci_add_callback,
> +        .opaque = pcidev,
> +    };
> +
> +    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, qmp->timeout);
> +    if (rc == 0) {
> +        rc = qmp_synchronous_send(qmp, "query-pci", NULL,
> +                                  &request, qmp->timeout);
> +        if (rc == 0) {
> +            rc = request.rc;
> +        }

Is every caller going to want this behaviour? Perhaps it belongs in
qmp_sync..._send?

> +    }
> +
> +    flexarray_free(parameters);
> +    libxl__qmp_close(qmp);
> +    return rc;
> +}
> +
>  int libxl__qmp_initializations(libxl_ctx *ctx, uint32_t domid)
>  {
>      libxl__qmp_handler *qmp = NULL;



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 03:32:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 03:32:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIHpk-0005rU-P7; Mon, 24 Oct 2011 03:32:44 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIHox-0005eN-0R
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 03:31:55 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319452311!1439895!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24797 invoked from network); 24 Oct 2011 10:31:52 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 24 Oct 2011 10:31:52 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RIHos-000IJR-W6; Mon, 24 Oct 2011 10:31:51 +0000
Date: Mon, 24 Oct 2011 11:31:50 +0100
From: Tim Deegan <tim@xen.org>
To: Christoph Egger <Christoph.Egger@amd.com>
Subject: Re: [Xen-devel] [PATCH] nestedhvm: handle l2 guest MMIO access
Message-ID: <20111024103150.GA68183@ocelot.phlegethon.org>
References: <4EA17193.1020108@amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EA17193.1020108@amd.com>
User-Agent: Mutt/1.4.2.1i
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

At 15:20 +0200 on 21 Oct (1319210419), Christoph Egger wrote:
> Hyper-V starts a root domain which effectively an l2 guest.
> Hyper-V passes its devices through to the root domain and
> let it do the MMIO accesses. The emulation is done by
> Xen (host) and Hyper-V forwards the interrupts to the l2 guest.
> 
> Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>

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 Mon Oct 24 03:39:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 03:39:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIHwd-0006Ps-FZ; Mon, 24 Oct 2011 03:39:51 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIHwB-0006EI-Um
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 03:39:24 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319452748!42909630!1
X-Originating-IP: [216.32.181.184]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7155 invoked from network); 24 Oct 2011 10:39:09 -0000
Received: from ch1ehsobe004.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.184)
	by server-11.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	24 Oct 2011 10:39:09 -0000
Received: from mail85-ch1-R.bigfish.com (10.43.68.249) by
	CH1EHSOBE006.bigfish.com (10.43.70.56) with Microsoft SMTP Server id
	14.1.225.22; Mon, 24 Oct 2011 10:39:15 +0000
Received: from mail85-ch1 (localhost.localdomain [127.0.0.1])	by
	mail85-ch1-R.bigfish.com (Postfix) with ESMTP id 9A66C10E007D;
	Mon, 24 Oct 2011 10:39:17 +0000 (UTC)
X-SpamScore: -11
X-BigFish: VPS-11(zzbb2dK1432N98dKzz1202hzz8275bhz32i668h839h)
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 mail85-ch1 (localhost.localdomain [127.0.0.1]) by mail85-ch1
	(MessageSwitch) id 1319452757434265_9027;
	Mon, 24 Oct 2011 10:39:17 +0000 (UTC)
Received: from CH1EHSMHS009.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.248])	by mail85-ch1.bigfish.com (Postfix) with ESMTP id
	65332AF0050;	Mon, 24 Oct 2011 10:39:17 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS009.bigfish.com (10.43.70.9) with Microsoft SMTP Server id
	14.1.225.22; Mon, 24 Oct 2011 10:39:18 +0000
X-WSS-ID: 0LTKG9F-02-20Z-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 29699C8229;	Mon, 24 Oct 2011 05:39:14 -0500 (CDT)
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;
	Mon, 24 Oct 2011 05:39:20 -0500
Received: from storexhtp02.amd.com (172.24.4.4) by sausexdag02.amd.com
	(163.181.55.2) with Microsoft SMTP Server (TLS) id 14.1.289.1;
	Mon, 24 Oct 2011 05:39:16 -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; Mon, 24 Oct 2011
	06:39:15 -0400
Message-ID: <4EA54050.9020508@amd.com>
Date: Mon, 24 Oct 2011 12:39:12 +0200
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: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH] x86/hpet: fix cpumask allocation
	after	23990:1c8789852eaf
References: <4EA19733020000780005CC83@nat28.tlf.novell.com>
In-Reply-To: <4EA19733020000780005CC83@nat28.tlf.novell.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 10/21/11 16:00, Jan Beulich wrote:
> hpet_fsb_cap_lookup(), if it doesn't find any FSB capable timer, leaves
> hpet_events allocated, while hpet_events->cpumask may not have been, As
> we're pretty generous with these one-time allocations already (in that
> hpet_events doesn't get freed when no usable counters were found, even
> if in that case only the first array entry [or none at all] may get
> used), simply make the cpumask allocation in the legacy case
> independent of whether hpet_events was NULL before.
>
> Signed-off-by: Jan Beulich<jbeulich@suse.com>

Tested-by: Christoph Egger <Christoph.Egger@amd.com>
Acked-by: Christoph Egger <Christoph.Egger@amd.com>

>
> --- a/xen/arch/x86/hpet.c
> +++ b/xen/arch/x86/hpet.c
> @@ -512,15 +512,8 @@ void __init hpet_broadcast_init(void)
>               return;
>
>           if ( !hpet_events )
> -        {
>               hpet_events = xzalloc(struct hpet_event_channel);
> -            if ( hpet_events&&  !zalloc_cpumask_var(&hpet_events->cpumask) )
> -            {
> -                xfree(hpet_events);
> -                hpet_events = NULL;
> -            }
> -        }
> -        if ( !hpet_events )
> +        if ( !hpet_events || !zalloc_cpumask_var(&hpet_events->cpumask) )
>               return;
>           hpet_events->irq = -1;
>
>
>


-- 
---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 Mon Oct 24 04:31:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 04:31:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIIkS-0007zz-23; Mon, 24 Oct 2011 04:31:20 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIIjX-0007nU-5V
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 04:30:23 -0700
X-Env-Sender: burns.me.uk@gmail.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1319455819!837190!1
X-Originating-IP: [209.85.220.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20362 invoked from network); 24 Oct 2011 11:30:20 -0000
Received: from mail-vx0-f171.google.com (HELO mail-vx0-f171.google.com)
	(209.85.220.171)
	by server-6.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 11:30:20 -0000
Received: by vcbfk13 with SMTP id fk13so6726766vcb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 04:30: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:date
	:x-google-sender-auth:message-id:subject:from:to:content-type;
	bh=OcZUZTuwv51RSpwqgOxhJPJCERoI0ot7wgD20nGedSY=;
	b=du7YBKAP6Rnra3lt/s9Z3MwCqNkjXmfD5X0zU42uyMwx7GHnXJVu9NHtybx/L3ZCRH
	aBlyM9REy/CWb7jSXWeFQjRyV9dyvfrBmmxT5ClSnY7UndxKaC55xuavbnLRPzNkT/WJ
	IKV7BkPFG0Usyegt+z3xyHs1AuqgD90HM7a0w=
MIME-Version: 1.0
Received: by 10.52.76.162 with SMTP id l2mr21561243vdw.64.1319455818808; Mon,
	24 Oct 2011 04:30:18 -0700 (PDT)
Received: by 10.52.33.237 with HTTP; Mon, 24 Oct 2011 04:30:18 -0700 (PDT)
In-Reply-To: <CAE1-PRe3FZknxdCLkhkGbzd-i=y5eGMAwY+yoa36j61oHNcRSw@mail.gmail.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
	<CAE1-PRfGTxeQ59jmHfB6bKKk2+B5bNnKhAvXoV-5P__+nkhgKQ@mail.gmail.com>
	<1318674976.11016.24.camel@dagon.hellion.org.uk>
	<CAE1-PRe3FZknxdCLkhkGbzd-i=y5eGMAwY+yoa36j61oHNcRSw@mail.gmail.com>
Date: Mon, 24 Oct 2011 12:30:18 +0100
X-Google-Sender-Auth: Il1rev3hloGzrneAJffxmVTxfjw
Message-ID: <CAE1-PRcUkuBexHrCnCCNEA4m=yoC8qWjmtfsaSq0h9NUA6r2cw@mail.gmail.com>
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Andy Burns <xen.lists@burns.me.uk>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-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 15 October 2011 12:27, Andy Burns <xen.lists@burns.me.uk> wrote:

> On 15 October 2011 11:36, Ian Campbell <Ian.Campbell@citrix.com> wrote:
>
>> I think you've got 8G of RAM so one thing which might be worth trying is
>> to give "mem=2G"
>
> A coconut for the gentleman!

I can see that the devs have been busy getting their ducks in a row
for when the 3.2 merge window opens (3.1 is released now) so not
wanted to pester about this as it's OK for now with the workarounds.

Initially I tried mem=2G, with dom0_mem=512M and two domUs of 512M and
1G respectively, I presume this caused a bit of ballooning in dom0 as
I caught it with 400M'ish at one point and I had a little instability.

I pushed it up to mem=3G and at the same time added irqpoll for dom0
and the pci domU (because I was seeing a few "nobody cared" messages
in the domU at bootup and in the dom0 after shutting down the domU)
those changes so far have resulted in a stable setup.

Not wanting to reboot the dom0 just yet (would like to see how stable
it really is) but want to think about things to try when I *do* reboot
it,
I'm assuming the DMA problem will rear its head again if I try mem >=
4G, I haven't tried anything with dma_bits yet either, anything other
suggestions or logging that might help?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 04:36:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 04:36:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIIpL-0000Al-Ho; Mon, 24 Oct 2011 04:36:23 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIIoR-0008Jj-10; Mon, 24 Oct 2011 04:35:28 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319456123!548049!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18958 invoked from network); 24 Oct 2011 11:35:23 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-11.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 11:35:23 -0000
Received: by wyi11 with SMTP id 11so7690892wyi.30
	for <multiple recipients>; Mon, 24 Oct 2011 04:35:23 -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;
	bh=bdVAYVlvHv/gxbdQELw+YJFm09A8FkuHGMZB37bnbUQ=;
	b=EB4cZD9NAKOsud3hzt3rXmWdyEcb4Rejj+xeeL38t9vwnxGOZCOzkLPknyqxxNUyHg
	g+uVvOYCKHROBl5pS7MOmrwmmwV/GYHUSooS8QiFhQWE2viVqYSCcGwdoghAB3wIFXAa
	uKszpnBKZz/EyKYjqz3mu8VozfkPh6LyqqN7A=
Received: by 10.216.137.13 with SMTP id x13mr2967818wei.52.1319456121648;
	Mon, 24 Oct 2011 04:35:21 -0700 (PDT)
Received: from [172.16.26.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id fi11sm38469803wbb.9.2011.10.24.04.35.18
	(version=SSLv3 cipher=OTHER); Mon, 24 Oct 2011 04:35:19 -0700 (PDT)
Message-ID: <4EA54D72.7040205@xen.org>
Date: Mon, 24 Oct 2011 12:35:14 +0100
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: Joseph Glanville <joseph.glanville@orionvm.com.au>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111018132618.GA19611@phenom.dumpdata.com>
	<1319013528.3385.59.camel@zakaz.uk.xensource.com>
	<4E9F1361.5020906@xen.org>
	<CAOzFzEjioey=65ACAJH50Nf+gHUt4HCXupfY9bHwaqCMEoquow@mail.gmail.com>
	<4EA18FAD.7080102@xen.org>
	<CAOzFzEjZKCmMDx+VbdCtEkzHM5_RcYM=4K2DZwtzu=ua6bQi9g@mail.gmail.com>
In-Reply-To: <CAOzFzEjZKCmMDx+VbdCtEkzHM5_RcYM=4K2DZwtzu=ua6bQi9g@mail.gmail.com>
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"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>,
	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="===============0936621712=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============0936621712==
Content-Type: multipart/alternative;
	boundary="------------060400010708000807030705"

This is a multi-part message in MIME format.
--------------060400010708000807030705
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

On 22/10/2011 00:33, Joseph Glanville wrote:
> As I noted, this is just my opinion, its not my place to decide how 
> people want to use it but if we could have to idea of what should and 
> shouldn't be in there it makes it easy to then structure the information.
>
>         I think we need to setup a guided rewrite/refactor of the core
>         documentation so it resembles something close to this:
>
>         Overview (brief introduction, architecture, why xen is
>         different and maybe abit of xen philosophy)
>         Getting started guide ( Installation of Xen on Debian -
>         probably the simplest and easiest way to get started with Xen
>         at the moment, start a Debian PV guest, start at Windows HVM
>         guest)
>         Installation guide ( More indepth covering all the core
>         distros and some more advanced installations including
>         compilation from source and using the Linux 3.1 kernel,
>         networking options etc)
>         Administration guide ( This bit requires atlot of discussion,
>         do we recommend xm still? should we only support xl? If that
>         is the case how to we recommend stuff like managed domains etc..)
>         Advanced topics.. stuff like Networking, PCI passthrough etc
>         deserve their own pages
>
>     Are you suggesting we restructure the wiki front-page around this?
>
>
> Yes, maybe not -exactly- this format but something resembling it would 
> be of value I think. Guiding people towards the beginners 
> documentation and making it quite clear there is a reading progression 
> will show much stronger cohesion.

I think we have two choices:
a) We re-write large sections of the wiki with the purpose of making it 
more accessible
b) We use create methods to highlight existing stuff and focus on 
filling gaps, etc.

I think that b) is more valuable. Here are a few ideas:

Trails: I have come across the idea of wiki trails before. These are 
pages/indexes which lead the reader through a series of articles. The 
key is that these are easily identified and highlighted from the main 
page. E.g. we could use Trails (listing all trails and a page template), 
Trails/XenOverview, Trails/XenGettingStarted, etc. By doing this, we 
group the existing documents, rather than re-writing a lot of stuff and 
just refactoring it. This would make an easier start, and if somebody 
wishes they can always clean up and refactor the documentation which 
makes up a trail.

I had a look around for MoinMoin plug-ins for something which may help 
with trails: not much, but there are a couple of plugins that may help

Being able to create TOCs across sevaleraL wiki pages 
(http://moinmo.in/SteveTindle/DocTools from 
http://moinmo.in/MacroMarket#Release_1.5 using /EnhancedTableOfContents 
<http://moinmo.in/MacroMarket/EnhancedTableOfContents> /SetSection 
<http://moinmo.in/MacroMarket/SetSection> /TocOf 
<http://moinmo.in/MacroMarket/TocOf> )

>     The current wiki is poluted with alot of architecture and design
>     info that isn't of interest to a general user but is still key to
>     understanding Xen from a developers point of view.
>
>     Part of the issue is that it is hard for me to identify what is
>     what. If I had a good approximation of what is what, I (or others)
>     could just go through the motions and re-encode stuff accordingly.
>
>
> I have exactly the same problem, I just need to undertand what needs 
> to be done and where.
I hope I will get some of this out of Wed.

>     I think what you seem to be saying is that there would be
>     extremely high value in having a "Getting started" guide and some
>     other entry level documentation (even if just an index page)
>     accessible from the wiki front page.
>
>
> Precisely, documenting the more advanced features of Xen seems to be 
> something that we can approach over time. Beginner documentation is 
> immeadiately lacking and seems to be an easier target that would 
> benefit more people.
Let's see whether we can get enough structure in place on Wed and make a 
good start

Lars


--------------060400010708000807030705
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    On 22/10/2011 00:33, Joseph Glanville wrote:<br>
    <blockquote
cite="mid:CAOzFzEjZKCmMDx+VbdCtEkzHM5_RcYM=4K2DZwtzu=ua6bQi9g@mail.gmail.com"
      type="cite">
      <div class="gmail_quote">
        <div>As I noted, this is just my opinion, its not my place to
          decide how people want to use it but if we could have to idea
          of what should and shouldn't be in there it makes it easy to
          then structure the information. <br>
        </div>
        <br>
        <blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt
          0.8ex; border-left: 1px solid rgb(204, 204, 204);
          padding-left: 1ex;">
          <div class="im">
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">
              I think we need to setup a guided rewrite/refactor of the
              core documentation so it resembles something close to
              this:<br>
              <br>
              Overview (brief introduction, architecture, why xen is
              different and maybe abit of xen philosophy)<br>
              Getting started guide ( Installation of Xen on Debian -
              probably the simplest and easiest way to get started with
              Xen at the moment, start a Debian PV guest, start at
              Windows HVM guest)<br>
              Installation guide ( More indepth covering all the core
              distros and some more advanced installations including
              compilation from source and using the Linux 3.1 kernel,
              networking options etc)<br>
              Administration guide ( This bit requires atlot of
              discussion, do we recommend xm still? should we only
              support xl? If that is the case how to we recommend stuff
              like managed domains etc..)<br>
              Advanced topics.. stuff like Networking, PCI passthrough
              etc deserve their own pages<br>
            </blockquote>
          </div>
          Are you suggesting we restructure the wiki front-page around
          this?</blockquote>
        <div><br>
          Yes, maybe not -exactly- this format but something resembling
          it would be of value I think. Guiding people towards the
          beginners documentation and making it quite clear there is a
          reading progression will show much stronger cohesion. <br>
        </div>
      </div>
    </blockquote>
    <br>
    I think we have two choices:<br>
    a) We re-write large sections of the wiki with the purpose of making
    it more accessible<br>
    b) We use create methods to highlight existing stuff and focus on
    filling gaps, etc.<br>
    <br>
    I think that b) is more valuable. Here are a few ideas:<br>
    <br>
    Trails: I have come across the idea of wiki trails before. These are
    pages/indexes which lead the reader through a series of articles.
    The key is that these are easily identified and highlighted from the
    main page. E.g. we could use Trails (listing all trails and a page
    template), Trails/XenOverview, Trails/XenGettingStarted, etc. By
    doing this, we group the existing documents, rather than re-writing
    a lot of stuff and just refactoring it. This would make an easier
    start, and if somebody wishes they can always clean up and refactor
    the documentation which makes up a trail.<br>
    <br>
    I had a look around for MoinMoin plug-ins for something which may
    help with trails: not much, but there are a couple of plugins that
    may help<br>
    <br>
    Being able to create TOCs across sevaleraL wiki pages
    (<a class="moz-txt-link-freetext" href="http://moinmo.in/SteveTindle/DocTools">http://moinmo.in/SteveTindle/DocTools</a> from
    <a class="moz-txt-link-freetext" href="http://moinmo.in/MacroMarket#Release_1.5">http://moinmo.in/MacroMarket#Release_1.5</a> using <a
      href="http://moinmo.in/MacroMarket/EnhancedTableOfContents">/EnhancedTableOfContents</a>
    <a href="http://moinmo.in/MacroMarket/SetSection">/SetSection</a> <a
      href="http://moinmo.in/MacroMarket/TocOf">/TocOf</a> )<br>
    <br>
    <blockquote
cite="mid:CAOzFzEjZKCmMDx+VbdCtEkzHM5_RcYM=4K2DZwtzu=ua6bQi9g@mail.gmail.com"
      type="cite">
      <div class="gmail_quote">
        <div>
        </div>
        <blockquote class="gmail_quote" style="margin:0 0 0
          .8ex;border-left:1px #ccc solid;padding-left:1ex">The current
          wiki is poluted with alot of architecture and design info that
          isn't of interest to a general user but is still key to
          understanding Xen from a developers point of view.<br>
        </blockquote>
        <blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt
          0.8ex; border-left: 1px solid rgb(204, 204, 204);
          padding-left: 1ex;">
          Part of the issue is that it is hard for me to identify what
          is what. If I had a good approximation of what is what, I (or
          others) could just go through the motions and re-encode stuff
          accordingly.</blockquote>
        <div><br>
          I have exactly the same problem, I just need to undertand what
          needs to be done and where. <br>
        </div>
      </div>
    </blockquote>
    I hope I will get some of this out of Wed.<br>
    <br>
    <blockquote
cite="mid:CAOzFzEjZKCmMDx+VbdCtEkzHM5_RcYM=4K2DZwtzu=ua6bQi9g@mail.gmail.com"
      type="cite">
      <div class="gmail_quote">
        <div>
        </div>
        <blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt
          0.8ex; border-left: 1px solid rgb(204, 204, 204);
          padding-left: 1ex;">I think what you seem to be saying is that
          there would be extremely high value in having a "Getting
          started" guide and some other entry level documentation (even
          if just an index page) accessible from the wiki front page.<br>
        </blockquote>
        <div><br>
          Precisely, documenting the more advanced features of Xen seems
          to be something that we can approach over time. Beginner
          documentation is immeadiately lacking and seems to be an
          easier target that would benefit more people. <br>
        </div>
      </div>
    </blockquote>
    Let's see whether we can get enough structure in place on Wed and
    make a good start<br>
    <br>
    Lars<br>
    <br>
  </body>
</html>

--------------060400010708000807030705--


--===============0936621712==
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

--===============0936621712==--


From xen-devel-bounces@lists.xensource.com Mon Oct 24 06:08:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 06:08:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIKGj-0002vn-27; Mon, 24 Oct 2011 06:08:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIKFd-0002iM-Mm
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 06:07:38 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1319461653!1431599!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14668 invoked from network); 24 Oct 2011 13:07:34 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 13:07:34 -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
	p9OD7Ttw021346
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 13:07:31 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
	p9OD7Sgc006920
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 13:07:29 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
	p9OD7Ncr001817; Mon, 24 Oct 2011 08:07:23 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 06:07:23 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 8B42A82A63; Thu, 20 Oct 2011 19:45:32 -0400 (EDT)
Date: Thu, 20 Oct 2011 19:45:32 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: David Vrabel <david.vrabel@citrix.com>
Message-ID: <20111020234532.GG19558@phenom.dumpdata.com>
References: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
	<1319107519-2253-2-git-send-email-david.vrabel@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319107519-2253-2-git-send-email-david.vrabel@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.0A090204.4EA56313.01BF,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org
Subject: [Xen-devel] Re: [PATCH 1/4] xen: use generic functions instead of
 xen_{alloc,free}_vm_area()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 20, 2011 at 11:45:16AM +0100, David Vrabel wrote:
> Replace calls to the Xen-specific xen_alloc_vm_area() and
> xen_free_vm_area() functions with the generic equivalent
> (alloc_vm_area() and free_vm_area()).
> 
> On x86, these were identical already.
> 
> Signed-off-by: David Vrabel <david.vrabel@citrix.com>

Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> ---
>  arch/ia64/include/asm/xen/grant_table.h |   29 --------------
>  arch/ia64/xen/grant-table.c             |   62 -------------------------------
>  arch/x86/include/asm/xen/grant_table.h  |    7 ---
>  arch/x86/xen/grant-table.c              |    2 +-
>  drivers/xen/xenbus/xenbus_client.c      |    6 +-
>  include/xen/grant_table.h               |    1 -
>  6 files changed, 4 insertions(+), 103 deletions(-)
>  delete mode 100644 arch/ia64/include/asm/xen/grant_table.h
>  delete mode 100644 arch/x86/include/asm/xen/grant_table.h
> 
> diff --git a/arch/ia64/include/asm/xen/grant_table.h b/arch/ia64/include/asm/xen/grant_table.h
> deleted file mode 100644
> index 2b1fae0..0000000
> --- a/arch/ia64/include/asm/xen/grant_table.h
> +++ /dev/null
> @@ -1,29 +0,0 @@
> -/******************************************************************************
> - * arch/ia64/include/asm/xen/grant_table.h
> - *
> - * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
> - *                    VA Linux Systems Japan K.K.
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License as published by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * This program 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 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 _ASM_IA64_XEN_GRANT_TABLE_H
> -#define _ASM_IA64_XEN_GRANT_TABLE_H
> -
> -struct vm_struct *xen_alloc_vm_area(unsigned long size);
> -void xen_free_vm_area(struct vm_struct *area);
> -
> -#endif /* _ASM_IA64_XEN_GRANT_TABLE_H */
> diff --git a/arch/ia64/xen/grant-table.c b/arch/ia64/xen/grant-table.c
> index 48cca37..c182813 100644
> --- a/arch/ia64/xen/grant-table.c
> +++ b/arch/ia64/xen/grant-table.c
> @@ -31,68 +31,6 @@
>  
>  #include <asm/xen/hypervisor.h>
>  
> -struct vm_struct *xen_alloc_vm_area(unsigned long size)
> -{
> -	int order;
> -	unsigned long virt;
> -	unsigned long nr_pages;
> -	struct vm_struct *area;
> -
> -	order = get_order(size);
> -	virt = __get_free_pages(GFP_KERNEL, order);
> -	if (virt == 0)
> -		goto err0;
> -	nr_pages = 1 << order;
> -	scrub_pages(virt, nr_pages);
> -
> -	area = kmalloc(sizeof(*area), GFP_KERNEL);
> -	if (area == NULL)
> -		goto err1;
> -
> -	area->flags = VM_IOREMAP;
> -	area->addr = (void *)virt;
> -	area->size = size;
> -	area->pages = NULL;
> -	area->nr_pages = nr_pages;
> -	area->phys_addr = 0;	/* xenbus_map_ring_valloc uses this field!  */
> -
> -	return area;
> -
> -err1:
> -	free_pages(virt, order);
> -err0:
> -	return NULL;
> -}
> -EXPORT_SYMBOL_GPL(xen_alloc_vm_area);
> -
> -void xen_free_vm_area(struct vm_struct *area)
> -{
> -	unsigned int order = get_order(area->size);
> -	unsigned long i;
> -	unsigned long phys_addr = __pa(area->addr);
> -
> -	/* This area is used for foreign page mappping.
> -	 * So underlying machine page may not be assigned. */
> -	for (i = 0; i < (1 << order); i++) {
> -		unsigned long ret;
> -		unsigned long gpfn = (phys_addr >> PAGE_SHIFT) + i;
> -		struct xen_memory_reservation reservation = {
> -			.nr_extents   = 1,
> -			.address_bits = 0,
> -			.extent_order = 0,
> -			.domid        = DOMID_SELF
> -		};
> -		set_xen_guest_handle(reservation.extent_start, &gpfn);
> -		ret = HYPERVISOR_memory_op(XENMEM_populate_physmap,
> -					   &reservation);
> -		BUG_ON(ret != 1);
> -	}
> -	free_pages((unsigned long)area->addr, order);
> -	kfree(area);
> -}
> -EXPORT_SYMBOL_GPL(xen_free_vm_area);
> -
> -
>  /****************************************************************************
>   * grant table hack
>   * cmd: GNTTABOP_xxx
> diff --git a/arch/x86/include/asm/xen/grant_table.h b/arch/x86/include/asm/xen/grant_table.h
> deleted file mode 100644
> index fdbbb45..0000000
> --- a/arch/x86/include/asm/xen/grant_table.h
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -#ifndef _ASM_X86_XEN_GRANT_TABLE_H
> -#define _ASM_X86_XEN_GRANT_TABLE_H
> -
> -#define xen_alloc_vm_area(size)	alloc_vm_area(size)
> -#define xen_free_vm_area(area)	free_vm_area(area)
> -
> -#endif /* _ASM_X86_XEN_GRANT_TABLE_H */
> diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
> index 49ba9b5..6bbfd7a 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 =
> -			xen_alloc_vm_area(PAGE_SIZE * max_nr_gframes);
> +			alloc_vm_area(PAGE_SIZE * max_nr_gframes);
>  		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 cdacf92..229d3ad 100644
> --- a/drivers/xen/xenbus/xenbus_client.c
> +++ b/drivers/xen/xenbus/xenbus_client.c
> @@ -443,7 +443,7 @@ int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
>  
>  	*vaddr = NULL;
>  
> -	area = xen_alloc_vm_area(PAGE_SIZE);
> +	area = alloc_vm_area(PAGE_SIZE);
>  	if (!area)
>  		return -ENOMEM;
>  
> @@ -453,7 +453,7 @@ int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
>  		BUG();
>  
>  	if (op.status != GNTST_okay) {
> -		xen_free_vm_area(area);
> +		free_vm_area(area);
>  		xenbus_dev_fatal(dev, op.status,
>  				 "mapping in shared page %d from domain %d",
>  				 gnt_ref, dev->otherend_id);
> @@ -552,7 +552,7 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
>  		BUG();
>  
>  	if (op.status == GNTST_okay)
> -		xen_free_vm_area(area);
> +		free_vm_area(area);
>  	else
>  		xenbus_dev_error(dev, op.status,
>  				 "unmapping page at handle %d error %d",
> diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
> index b1fab6b..8a8bb76 100644
> --- a/include/xen/grant_table.h
> +++ b/include/xen/grant_table.h
> @@ -43,7 +43,6 @@
>  #include <xen/interface/grant_table.h>
>  
>  #include <asm/xen/hypervisor.h>
> -#include <asm/xen/grant_table.h>
>  
>  #include <xen/features.h>
>  
> -- 
> 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 Mon Oct 24 06:09:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 06:09:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIKHp-0003J7-RF; Mon, 24 Oct 2011 06:09:53 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIKFf-0002iN-4T
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 06:07:39 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1319461632!50015526!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22808 invoked from network); 24 Oct 2011 13:07:13 -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; 24 Oct 2011 13:07: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
	p9OD7U5j021350
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 13:07:32 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
	p9OD7TdJ029427
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 13:07:29 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
	p9OD7Ntb014804; Mon, 24 Oct 2011 08:07:23 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 06:07:23 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id F330F82A5B; Thu, 20 Oct 2011 17:00:53 -0400 (EDT)
Date: Thu, 20 Oct 2011 17:00:53 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: David Vrabel <david.vrabel@citrix.com>, davem@davemloft.net
Message-ID: <20111020210053.GA19558@phenom.dumpdata.com>
References: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
	<1319107519-2253-4-git-send-email-david.vrabel@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319107519-2253-4-git-send-email-david.vrabel@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.0A090202.4EA56314.00F6:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: netdev@vger.kernel.org, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org, "David S . Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH 3/4] net: xen-netback: use API provided by
 xenbus module to map rings
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 20, 2011 at 11:45:18AM +0100, David Vrabel wrote:
> The xenbus module provides xenbus_map_ring_valloc() and
> xenbus_map_ring_vfree().  Use these to map the Tx and Rx ring pages
> granted by the frontend.
> 
> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
> Acked-by: Ian Campbell <ian.campbell@citrix.com>


Acked-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

> Dave, this is a standalone patch and can be applied independently of
> the rest of the series.

.. or Dave, if you would like I can carry these patches.

> 
>  drivers/net/xen-netback/common.h  |   11 ++---
>  drivers/net/xen-netback/netback.c |   80 ++++++++-----------------------------
>  2 files changed, 22 insertions(+), 69 deletions(-)
> 
> diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
> index 161f207..94b79c3 100644
> --- a/drivers/net/xen-netback/common.h
> +++ b/drivers/net/xen-netback/common.h
> @@ -58,10 +58,6 @@ struct xenvif {
>  	u8               fe_dev_addr[6];
>  
>  	/* Physical parameters of the comms window. */
> -	grant_handle_t   tx_shmem_handle;
> -	grant_ref_t      tx_shmem_ref;
> -	grant_handle_t   rx_shmem_handle;
> -	grant_ref_t      rx_shmem_ref;
>  	unsigned int     irq;
>  
>  	/* List of frontends to notify after a batch of frames sent. */
> @@ -70,8 +66,6 @@ struct xenvif {
>  	/* The shared rings and indexes. */
>  	struct xen_netif_tx_back_ring tx;
>  	struct xen_netif_rx_back_ring rx;
> -	struct vm_struct *tx_comms_area;
> -	struct vm_struct *rx_comms_area;
>  
>  	/* Frontend feature information. */
>  	u8 can_sg:1;
> @@ -106,6 +100,11 @@ struct xenvif {
>  	wait_queue_head_t waiting_to_free;
>  };
>  
> +static inline struct xenbus_device *xenvif_to_xenbus_device(struct xenvif *vif)
> +{
> +	return to_xenbus_device(vif->dev->dev.parent);
> +}
> +
>  #define XEN_NETIF_TX_RING_SIZE __CONST_RING_SIZE(xen_netif_tx, PAGE_SIZE)
>  #define XEN_NETIF_RX_RING_SIZE __CONST_RING_SIZE(xen_netif_rx, PAGE_SIZE)
>  
> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
> index fd00f25..3af2924 100644
> --- a/drivers/net/xen-netback/netback.c
> +++ b/drivers/net/xen-netback/netback.c
> @@ -1577,88 +1577,42 @@ static int xen_netbk_kthread(void *data)
>  
>  void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
>  {
> -	struct gnttab_unmap_grant_ref op;
> -
> -	if (vif->tx.sring) {
> -		gnttab_set_unmap_op(&op, (unsigned long)vif->tx_comms_area->addr,
> -				    GNTMAP_host_map, vif->tx_shmem_handle);
> -
> -		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
> -			BUG();
> -	}
> -
> -	if (vif->rx.sring) {
> -		gnttab_set_unmap_op(&op, (unsigned long)vif->rx_comms_area->addr,
> -				    GNTMAP_host_map, vif->rx_shmem_handle);
> -
> -		if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
> -			BUG();
> -	}
> -	if (vif->rx_comms_area)
> -		free_vm_area(vif->rx_comms_area);
> -	if (vif->tx_comms_area)
> -		free_vm_area(vif->tx_comms_area);
> +	if (vif->tx.sring)
> +		xenbus_unmap_ring_vfree(xenvif_to_xenbus_device(vif),
> +					vif->tx.sring);
> +	if (vif->rx.sring)
> +		xenbus_unmap_ring_vfree(xenvif_to_xenbus_device(vif),
> +					vif->rx.sring);
>  }
>  
>  int xen_netbk_map_frontend_rings(struct xenvif *vif,
>  				 grant_ref_t tx_ring_ref,
>  				 grant_ref_t rx_ring_ref)
>  {
> -	struct gnttab_map_grant_ref op;
> +	void *addr;
>  	struct xen_netif_tx_sring *txs;
>  	struct xen_netif_rx_sring *rxs;
>  
>  	int err = -ENOMEM;
>  
> -	vif->tx_comms_area = alloc_vm_area(PAGE_SIZE);
> -	if (vif->tx_comms_area == NULL)
> +	err = xenbus_map_ring_valloc(xenvif_to_xenbus_device(vif),
> +				     tx_ring_ref, &addr);
> +	if (err)
>  		goto err;
>  
> -	vif->rx_comms_area = alloc_vm_area(PAGE_SIZE);
> -	if (vif->rx_comms_area == NULL)
> -		goto err;
> -
> -	gnttab_set_map_op(&op, (unsigned long)vif->tx_comms_area->addr,
> -			  GNTMAP_host_map, tx_ring_ref, vif->domid);
> -
> -	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
> -		BUG();
> -
> -	if (op.status) {
> -		netdev_warn(vif->dev,
> -			    "failed to map tx ring. err=%d status=%d\n",
> -			    err, op.status);
> -		err = op.status;
> -		goto err;
> -	}
> -
> -	vif->tx_shmem_ref    = tx_ring_ref;
> -	vif->tx_shmem_handle = op.handle;
> -
> -	txs = (struct xen_netif_tx_sring *)vif->tx_comms_area->addr;
> +	txs = (struct xen_netif_tx_sring *)addr;
>  	BACK_RING_INIT(&vif->tx, txs, PAGE_SIZE);
>  
> -	gnttab_set_map_op(&op, (unsigned long)vif->rx_comms_area->addr,
> -			  GNTMAP_host_map, rx_ring_ref, vif->domid);
> -
> -	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
> -		BUG();
> -
> -	if (op.status) {
> -		netdev_warn(vif->dev,
> -			    "failed to map rx ring. err=%d status=%d\n",
> -			    err, op.status);
> -		err = op.status;
> +	err = xenbus_map_ring_valloc(xenvif_to_xenbus_device(vif),
> +				     rx_ring_ref, &addr);
> +	if (err)
>  		goto err;
> -	}
> -
> -	vif->rx_shmem_ref     = rx_ring_ref;
> -	vif->rx_shmem_handle  = op.handle;
> -	vif->rx_req_cons_peek = 0;
>  
> -	rxs = (struct xen_netif_rx_sring *)vif->rx_comms_area->addr;
> +	rxs = (struct xen_netif_rx_sring *)addr;
>  	BACK_RING_INIT(&vif->rx, rxs, PAGE_SIZE);
>  
> +	vif->rx_req_cons_peek = 0;
> +
>  	return 0;
>  
>  err:
> -- 
> 1.7.2.5
> 
> --
> 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 Mon Oct 24 06:11:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 06:11:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIKJC-0003nZ-0k; Mon, 24 Oct 2011 06:11:18 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIKFg-0002iP-HH
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 06:07:42 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1319461656!852854!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5661 invoked from network); 24 Oct 2011 13:07:37 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-7.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 13:07: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
	p9OD7VBu021360
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 13:07:33 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
	p9OD7UWb022896
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 13:07:30 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
	p9OD7OwQ002820; Mon, 24 Oct 2011 08:07:25 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 06:07:24 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 577DB82A6C; Mon, 24 Oct 2011 08:58:33 -0400 (EDT)
Date: Mon, 24 Oct 2011 08:58:33 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Sander Eikelenboom <linux@eikelenboom.it>,
	liang tang <liang.tang@oracle.com>
Message-ID: <20111024125833.GA19142@phenom.dumpdata.com>
References: <104105990.20111023132901@eikelenboom.it>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <104105990.20111023132901@eikelenboom.it>
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.4EA56315.00CE:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: devel/acpi-cpufreq.v3:
 arch/x86/built-in.o:(.data+0x5f88):
 undefined reference to `x86_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

On Sun, Oct 23, 2011 at 01:29:01PM +0200, Sander Eikelenboom wrote:
> Hi Konrad,
> 
> I tried to compile a kernel based on your latest "linux-next" tree (which seems to work fine),
> and the "devel/acpi-cpufreq.v3" branch pulled in. This fails with a compile error:

Hmm, OK, Liang, any ideas?
> 
>   CC      drivers/usb/storage/sierra_ms.o
>   CC      drivers/xen/pci.o
>   CC      drivers/video/efifb.o
>   CC      drivers/usb/storage/option_ms.o
>   CC      drivers/video/output.o
>   CC      drivers/xen/acpi.o
>   CC      drivers/xen/acpi_processor.o
>   LD      drivers/xen/xen-evtchn.o
>   LD      drivers/xen/xen-gntdev.o
>   LD      drivers/xen/xen-gntalloc.o
>   LD      drivers/video/fb.o
>   LD      drivers/usb/storage/usb-storage.o
>   LD      drivers/usb/storage/usb-libusual.o
>   LD      drivers/video/built-in.o
>   LD      drivers/usb/storage/built-in.o
>   LD      drivers/usb/built-in.o
>   LD      drivers/xen/built-in.o
>   LD      drivers/built-in.o
>   LD      vmlinux.o
>   MODPOST vmlinux.o
>   GEN     .version
>   CHK     include/generated/compile.h
>   UPD     include/generated/compile.h
>   CC      init/version.o
>   LD      init/built-in.o
>   LD      .tmp_vmlinux1
> arch/x86/built-in.o:(.data+0x5f88): undefined reference to `x86_acpi_suspend_lowlevel'
> make: *** [.tmp_vmlinux1] Error 1
> 
> --
> 
> Sander

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 06:12:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 06:12:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIKKF-0004B8-SC; Mon, 24 Oct 2011 06:12:23 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIKFh-0002iW-Fx
	for Xen-devel@lists.xensource.com; Mon, 24 Oct 2011 06:07:43 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-10.tower-216.messagelabs.com!1319461657!749580!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15302 invoked from network); 24 Oct 2011 13:07:38 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-10.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 24 Oct 2011 13:07:38 -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
	p9OD7XGA008974
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 13:07:34 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
	p9OD7UZ7022907
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 13:07:30 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
	p9OD7OAa014819; Mon, 24 Oct 2011 08:07:25 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 06:07:24 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id C81B482A61; Thu, 20 Oct 2011 19:43:00 -0400 (EDT)
Date: Thu, 20 Oct 2011 19:43:00 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Mukesh Rathor <mukesh.rathor@oracle.com>
Subject: Re: [Xen-devel] HYBRID: (PV in HVM) update
Message-ID: <20111020234300.GE19558@phenom.dumpdata.com>
References: <20110818155414.1d8c3015@mantra.us.oracle.com>
	<20111020161709.42a56c27@mantra.us.oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111020161709.42a56c27@mantra.us.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.4EA56317.00A4:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "Xen-devel@lists.xensource.com" <Xen-devel@lists.xensource.com>,
	Fraser <keir.xen@gmail.com>, Keir@acsinet11.oracle.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, Oct 20, 2011 at 04:17:09PM -0700, Mukesh Rathor wrote:
> On Thu, 18 Aug 2011 15:54:14 -0700
> Mukesh Rathor <mukesh.rathor@oracle.com> wrote:
> > 
> > JFYI... So I had a third type is_hybrid in my prototype, that I
> > thought I could get rid of, and hide things under is_hvm check. But
> > that just touches too much code, and things get ugly a bit all over.
> > 
> > It seems I could just mark the guest PV if not EPT and using PV
> > paging, and mark it HVM if EPT enabled to keep changes minimum, and
> > just check for hybrid where needed (so add is_hybrid back in). Trying
> > that now....
> > 
> > thanks
> > Mukesh
> > 
> 
> 
> YEAY guys!!! I now have PV in HVM guest running with EPT! 
> I'll clean up the code (tons of debug stuff right now), and post
> it for anyone to look at. 

Awesome!!

> 
> Next and final frontier after that, running it as dom0.

Yeeey!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 06:13:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 06:13:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIKLI-0004YM-2r; Mon, 24 Oct 2011 06:13:28 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIKFg-0002iO-Du
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 06:07:44 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1319461655!30122295!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5067 invoked from network); 24 Oct 2011 13:07:36 -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; 24 Oct 2011 13:07:36 -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
	p9OD7Tww008875
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 13:07:31 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
	p9OD7S8f022831
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 13:07:29 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9OD7Nia002790; Mon, 24 Oct 2011 08:07:23 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 06:07:23 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 05A9E82896; Wed, 19 Oct 2011 23:40:00 -0400 (EDT)
Date: Wed, 19 Oct 2011 23:40:00 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Carsten Schiers <carsten@schiers.de>
Subject: Re: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
Message-ID: <20111020034000.GA2401@phenom.dumpdata.com>
References: <CAE1-PRe3FZknxdCLkhkGbzd-i=y5eGMAwY+yoa36j61oHNcRSw@mail.gmail.com>
	<H0000067000c72b1.1318693040.uhura.space.zz@MHS>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <H0000067000c72b1.1318693040.uhura.space.zz@MHS>
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.4EA56314.009C:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "xen.lists" <xen.lists@burns.me.uk>,
	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

On Sat, Oct 15, 2011 at 05:37:20PM +0200, Carsten Schiers wrote:
> Interesting. Konrad, do you remember that one of my DVB cards did 
> consume double CPU time 
> as compared to a) old Xenified 2.6.18 b) Xenified 2.6.34 and c) mem=2G 

Well, your DVB cards started consuming when you added more than 4GB to your
box. I don't remember the 2.6.18 figuring in this picture.

> Dom0? Maybe these
> observations are somehow connected.
> 
> It did work, though... Unfortunately, I sold these cards to have only 
> one, which is 

.. which is?

.. snip..
> A coconut for the gentleman!

Beer!
> 
> Working in dom0 and (with page-alignment of the PCI BARs) in the domU,
> I did check a couple of reboots and a cold start too, just in case!
> 
> So what's to look at for the real cause?

There can be one more test to conclude this and that is to raise right about 4GB
(ought to work) or perhaps to 5GB (it should fail there) under Xen .
Either way it sounds like a DMA issue - either we are:

 1). Not having the right dma_mask set. Check the /sys/bus/pci/devices/<BDF>/dma_mask
     and coherent_dma_mask. Both values should be the same and it ought to be 32
 
 2). The driver is not doing pci_sync_range .. which you should be able
     to easily find out. Try booting the Linux kernel in baremetal, with
     8GB and with "iommu=soft swiotlb=force". That will bounce buffer _everything_
     - which might show the same problem. It also might show problems with some
     other drivers.

 3). I can send you some patches to instrument Xen SWIOTLB to see what DMA pages
     (and where in the driver code is doing it) are using bounce buffer and not
     properly doing 2).

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 06:14:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 06:14:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIKMH-0004vu-5x; Mon, 24 Oct 2011 06:14:29 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIKFl-0002io-Ic
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 06:07:46 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1319461661!1461126!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12950 invoked from network); 24 Oct 2011 13:07:42 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-2.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 13:07:42 -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
	p9OD7Vmv008934
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 13:07: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
	p9OD7UXu006991
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 13:07:31 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
	p9OD7OIq014818; Mon, 24 Oct 2011 08:07:25 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 06:07:24 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 93A7482A65; Thu, 20 Oct 2011 20:06:24 -0400 (EDT)
Date: Thu, 20 Oct 2011 20:06:24 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Jan Beulich <JBeulich@suse.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
Message-ID: <20111021000624.GA23358@phenom.dumpdata.com>
References: <1318260494-27985-1-git-send-email-konrad.wilk@oracle.com>
	<1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
	<4E940E21020000780005AA29@nat28.tlf.novell.com>
	<20111011155133.GC29349@phenom.oracle.com>
	<20111011205729.GB22668@phenom.oracle.com>
	<4E9C4855020000780005BA73@nat28.tlf.novell.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9C4855020000780005BA73@nat28.tlf.novell.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.0A090209.4EA56316.0010,ss=1,re=0.000,fgs=0
Cc: "hch@infradead.org" <hch@infradead.org>, Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@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 Mon, Oct 17, 2011 at 02:23:01PM +0100, Jan Beulich wrote:
> >>> On 11.10.11 at 22:57, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote:
> > --- a/drivers/block/xen-blkfront.c
> > +++ b/drivers/block/xen-blkfront.c
> >...
> > @@ -705,7 +711,7 @@ static void blkif_free(struct blkfront_info *info, int suspend)
> >  static void blkif_completion(struct blk_shadow *s)
> >  {
> >  	int i;
> 
> This function gets called for all types of requests, and hence must filter
> discard ones now that what would be nr_segments can be non-zero,


Oooh, nice catch.

> e.g.
> 
> 	if (s->req.operation == BLKIF_OP_DISCARD)
> 		return;
> 
> Jan
> 
> > -	for (i = 0; i < s->req.nr_segments; i++)
> > +	for (i = 0; i < s->req.u1.nr_segments; i++)
> >  		gnttab_end_foreign_access(s->req.u.rw.seg[i].gref, 0, 0UL);
> >  }
> >  
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 06:16:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 06:16:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIKNp-0005Kj-To; Mon, 24 Oct 2011 06:16:05 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIKFo-0002jE-NY
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 06:07:49 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1319461664!570909!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1156 invoked from network); 24 Oct 2011 13:07:45 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-16.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 24 Oct 2011 13:07: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
	p9OD7VPS008937
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 13:07: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
	p9OD7UEJ006989
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 13:07:31 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
	p9OD7OsD014817; Mon, 24 Oct 2011 08:07:24 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 06:07:24 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id BA83B82898; Wed, 19 Oct 2011 23:46:31 -0400 (EDT)
Date: Wed, 19 Oct 2011 23:46:31 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Li Dongyang <lidongyang@novell.com>
Subject: Re: [Xen-devel] [PATCH 3/3] xen/blk[front|back]: Enhance discard
	support with secure erasing support.
Message-ID: <20111020034631.GC2401@phenom.dumpdata.com>
References: <1318260494-27985-4-git-send-email-konrad.wilk@oracle.com>
	<1318263187.21903.464.camel@zakaz.uk.xensource.com>
	<20111010164250.GG28646@phenom.oracle.com>
	<1318274402.27397.13.camel@dagon.hellion.org.uk>
	<20111010195749.GA5755@phenom.oracle.com>
	<4E940E21020000780005AA29@nat28.tlf.novell.com>
	<20111011155133.GC29349@phenom.oracle.com>
	<20111011205729.GB22668@phenom.oracle.com>
	<4E9C4855020000780005BA73@victor.provo.novell.com>
	<CAKH3R4_TDxyNcsgZBOxQRS4U61h=bhY+Vap72AWa4CdQyQ7QfQ@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAKH3R4_TDxyNcsgZBOxQRS4U61h=bhY+Vap72AWa4CdQyQ7QfQ@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.0A090208.4EA56316.000A,ss=1,re=0.000,fgs=0
Cc: Dong Yang Li <lidongyang@suse.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"hch@infradead.org" <hch@infradead.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 Thu, Oct 20, 2011 at 11:17:14AM +0800, Li Dongyang wrote:
> I think we also should mark the vbd has discard_secure if we are
> usingthe file backend,as if we punch a hole in the image, those blocks
> are freed tofilesystem and hardly to getthem back, or maybe write
> zeros to the range before we punch the hole is better?

You would have to write zeros to that range (or perhaps random values)
to emulate the secure delete. If you have a patch for that I would be int=
erested
in seeing it.

Hmm, which reminds me - I should repost this patch series.

> On Mon, Oct 17, 2011 at 9:23 PM, Jan Beulich <JBeulich@suse.com> wrote:
> >>>> On 11.10.11 at 22:57, Konrad Rzeszutek Wilk <konrad.wilk@oracle.co=
m> wrote:
> >> --- a/drivers/block/xen-blkfront.c
> >> +++ b/drivers/block/xen-blkfront.c
> >>...
> >> @@ -705,7 +711,7 @@ static void blkif_free(struct blkfront_info *inf=
o, int suspend)
> >> =A0static void blkif_completion(struct blk_shadow *s)
> >> =A0{
> >> =A0 =A0 =A0 int i;
> >
> > This function gets called for all types of requests, and hence must f=
ilter
> > discard ones now that what would be nr_segments can be non-zero,
> > e.g.
> >
> > =A0 =A0 =A0 =A0if (s->req.operation =3D=3D BLKIF_OP_DISCARD)
> > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return;
> >
> > Jan
> >
> >> - =A0 =A0 for (i =3D 0; i < s->req.nr_segments; i++)
> >> + =A0 =A0 for (i =3D 0; i < s->req.u1.nr_segments; i++)
> >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 gnttab_end_foreign_access(s->req.u.rw.se=
g[i].gref, 0, 0UL);
> >> =A0}
> >>
> >
> >
>=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 Oct 24 06:16:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 06:16:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIKOg-0005hL-Af; Mon, 24 Oct 2011 06:16:58 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIKG4-0002lQ-0l
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 06:08:05 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319461679!34340252!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17923 invoked from network); 24 Oct 2011 13:08:00 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-6.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 13:08:00 -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
	p9OD7VOP008909
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 13:07:32 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
	p9OD7UWp022902
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 13:07:30 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
	p9OD7PcJ001845; Mon, 24 Oct 2011 08:07:25 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 06:07:25 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 76EEF82A62; Thu, 20 Oct 2011 19:44:59 -0400 (EDT)
Date: Thu, 20 Oct 2011 19:44:59 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: David Vrabel <david.vrabel@citrix.com>
Message-ID: <20111020234459.GF19558@phenom.dumpdata.com>
References: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319107519-2253-1-git-send-email-david.vrabel@citrix.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.0A090202.4EA56315.003F:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Andrew Morton <akpm@linux-foundation.org>, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org
Subject: [Xen-devel] Re: [PATCH 0/4] xen: map foreign pages for shared rings
 by updating the PTEs directly
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 20, 2011 at 11:45:15AM +0100, David Vrabel wrote:
> This series of patches allows the vmalloc_sync_all() to be removed
> from alloc_vm_area() by getting the hypervisor to update the PTEs (in
> init_mm) directly rather than having the hypervisor look in the
> current page tables to find the PTEs.
> 
> Once the hypervisor has updated the PTEs, the normal mechanism of
> syncing the page tables after a fault works as expected.
> 
> This mechanism doesn't currently work on the ia64 port as that does
> not support the GNTMAP_contains_pte flag.
> 
> Andrew, patch 4 (xen: map foreign pages for shared rings by updating
> the PTEs directly) depends on patch 1 so it's probably best to go via
> Konrad's Xen tree with your acked-by.

Or I can Ack patch 1 and Andrew can pick both of them. Either way - but let
mention the Ack on patch #1

> 
> David
> 
> David Vrabel (4):
>   xen: use generic functions instead of xen_{alloc,free}_vm_area()
>   block: xen-blkback: use API provided by xenbus module to map rings
>   net: xen-netback: use API provided by xenbus module to map rings
>   xen: map foreign pages for shared rings by updating the PTEs directly
> 
>  arch/ia64/include/asm/xen/grant_table.h |   29 -----------
>  arch/ia64/xen/grant-table.c             |   62 ------------------------
>  arch/x86/include/asm/xen/grant_table.h  |    7 ---
>  arch/x86/xen/grant-table.c              |    2 +-
>  drivers/block/xen-blkback/common.h      |    5 +--
>  drivers/block/xen-blkback/xenbus.c      |   54 +++------------------
>  drivers/net/xen-netback/common.h        |   11 ++--
>  drivers/net/xen-netback/netback.c       |   80 +++++++------------------------
>  drivers/xen/xenbus/xenbus_client.c      |   15 ++++--
>  include/linux/vmalloc.h                 |    2 +-
>  include/xen/grant_table.h               |    1 -
>  mm/vmalloc.c                            |   27 +++++-----
>  12 files changed, 55 insertions(+), 240 deletions(-)
>  delete mode 100644 arch/ia64/include/asm/xen/grant_table.h
>  delete mode 100644 arch/x86/include/asm/xen/grant_table.h
> 
> -- 
> 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 Mon Oct 24 07:04:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 07:04:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIL8z-0007CE-6N; Mon, 24 Oct 2011 07:04:49 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIL57-0006wK-GT
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 07:01:26 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1319464846!866838!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 720 invoked from network); 24 Oct 2011 14:00:46 -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;
	24 Oct 2011 14:00:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,398,1315180800"; 
   d="scan'208";a="8552058"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 14:00: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, 24 Oct 2011 15:00:46 +0100
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 1RIL53-0006ew-Ki;
	Mon, 24 Oct 2011 14:00:45 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIL53-0004Y3-I0;
	Mon, 24 Oct 2011 15:00:45 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <E1RIL53-0004Y3-I0@woking.xci-test.com>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 24 Oct 2011 15:00:45 +0100
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-i386-i386-pair
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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-i386-i386-pair
test leak-check/check/src_host

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:  1c8789852eaf
  Bug not present: 8269826353d8


  changeset:   23990:1c8789852eaf
  user:        Jan Beulich <jbeulich@suse.com>
  date:        Fri Oct 21 09:44:47 2011 +0200
      
      x86/hpet: allocate CPU masks dynamically
      
      Signed-off-by: Jan Beulich <jbeulich@suse.com>
      Acked-by: Keir Fraser <keir@xen.org>
      
      


For bisection revision-tuple graph see:
   http://www.chiark.greenend.org.uk/~xensrcts/results/bisect.xen-unstable.test-i386-i386-pair.leak-check--check--src_host.html
Revision IDs in each graph node refer, respectively, to the Trees above.

----------------------------------------
Searching for failure / basis pass:
 9471 fail [dst_host=field-cricket,src_host=bush-cricket] / 9355 ok.
Failure / basis pass flights: 9471 / 9355
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 25378e0a76b282127e9ab8933a4defbc91db3862 a7ccbc79fc17
Basis pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 6c583d35d76d
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-25378e0a76b282127e9ab8933a4defbc91db3862 http://xenbits.xen.org/staging/xen-unstable.hg#6c583d35d76d-a7ccbc79fc17
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 74 nodes in revision graph
Searching for test results:
 9355 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 6c583d35d76d
 9363 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 a7ccbc79fc17
 9390 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 6c583d35d76d
 9391 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 a7ccbc79fc17
 9392 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 253073b522f8
 9471 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 a7ccbc79fc17
 9472 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 53528bab2eb4
 9554 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 8269826353d8
 9587 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 1c8789852eaf
 9588 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 8269826353d8
 9589 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 1c8789852eaf
 9590 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 8269826353d8
 9591 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 1c8789852eaf
Searching for interesting versions
 Result found: flight 9355 (pass), for basis pass
 Result found: flight 9363 (fail), for basis failure
 Repro found: flight 9390 (pass), for basis pass
 Repro found: flight 9391 (fail), for basis failure
 0 revisions at 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 8269826353d8
No revisions left to test, checking graph state.
 Result found: flight 9554 (pass), for last pass
 Result found: flight 9587 (fail), for first failure
 Repro found: flight 9588 (pass), for last pass
 Repro found: flight 9589 (fail), for first failure
 Repro found: flight 9590 (pass), for last pass
 Repro found: flight 9591 (fail), for first failure

*** Found and reproduced problem changeset ***

  Bug is in tree:  xen http://xenbits.xen.org/staging/xen-unstable.hg
  Bug introduced:  1c8789852eaf
  Bug not present: 8269826353d8

pulling from ssh://xen@xenbits.xen.org/HG/staging/xen-unstable.hg
searching for changes
no changes found

  changeset:   23990:1c8789852eaf
  user:        Jan Beulich <jbeulich@suse.com>
  date:        Fri Oct 21 09:44:47 2011 +0200
      
      x86/hpet: allocate CPU masks dynamically
      
      Signed-off-by: Jan Beulich <jbeulich@suse.com>
      Acked-by: Keir Fraser <keir@xen.org>
      
      

Revision graph left in /home/xc_osstest/results/bisect.xen-unstable.test-i386-i386-pair.leak-check--check--src_host.{dot,ps,png,html}.
----------------------------------------
9591: trouble: broken

flight 9591 xen-unstable real-bisect [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9591/


jobs:
 test-i386-i386-pair                                          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


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 07:08:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 07:08:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RILCB-0007i8-CH; Mon, 24 Oct 2011 07:08:07 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIL76-0006yY-Vl
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 07:02:55 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1319464944!54499835!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16913 invoked from network); 24 Oct 2011 14:02:24 -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;
	24 Oct 2011 14:02:24 -0000
X-IronPort-AV: E=Sophos;i="4.69,398,1315180800"; 
   d="scan'208";a="8552103"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 14:02: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; Mon, 24 Oct 2011 15:02:50 +0100
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 1RIL73-0006fY-9d;
	Mon, 24 Oct 2011 14:02:49 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIL73-0004qU-9L;
	Mon, 24 Oct 2011 15:02:49 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <E1RIL73-0004qU-9L@woking.xci-test.com>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 24 Oct 2011 15:02:49 +0100
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-i386-i386-pair
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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-i386-i386-pair
test leak-check/check/dst_host

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:  1c8789852eaf
  Bug not present: 8269826353d8


  changeset:   23990:1c8789852eaf
  user:        Jan Beulich <jbeulich@suse.com>
  date:        Fri Oct 21 09:44:47 2011 +0200
      
      x86/hpet: allocate CPU masks dynamically
      
      Signed-off-by: Jan Beulich <jbeulich@suse.com>
      Acked-by: Keir Fraser <keir@xen.org>
      
      


For bisection revision-tuple graph see:
   http://www.chiark.greenend.org.uk/~xensrcts/results/bisect.xen-unstable.test-i386-i386-pair.leak-check--check--dst_host.html
Revision IDs in each graph node refer, respectively, to the Trees above.

----------------------------------------
Searching for failure / basis pass:
 9471 fail [dst_host=field-cricket,src_host=bush-cricket] / 9355 ok.
Failure / basis pass flights: 9471 / 9355
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 25378e0a76b282127e9ab8933a4defbc91db3862 a7ccbc79fc17
Basis pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 6c583d35d76d
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-25378e0a76b282127e9ab8933a4defbc91db3862 http://xenbits.xen.org/staging/xen-unstable.hg#6c583d35d76d-a7ccbc79fc17
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 74 nodes in revision graph
Searching for test results:
 9355 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 6c583d35d76d
 9363 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 a7ccbc79fc17
 9390 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 6c583d35d76d
 9391 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 a7ccbc79fc17
 9392 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 253073b522f8
 9471 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 a7ccbc79fc17
 9472 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 53528bab2eb4
 9554 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 8269826353d8
 9587 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 1c8789852eaf
 9588 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 8269826353d8
 9589 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 1c8789852eaf
 9590 pass 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 8269826353d8
 9591 fail 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 1c8789852eaf
Searching for interesting versions
 Result found: flight 9355 (pass), for basis pass
 Result found: flight 9363 (fail), for basis failure
 Repro found: flight 9390 (pass), for basis pass
 Repro found: flight 9391 (fail), for basis failure
 0 revisions at 6bec8b4a4c14095d0b7ce424db9d583c3decae6c 25378e0a76b282127e9ab8933a4defbc91db3862 8269826353d8
No revisions left to test, checking graph state.
 Result found: flight 9554 (pass), for last pass
 Result found: flight 9587 (fail), for first failure
 Repro found: flight 9588 (pass), for last pass
 Repro found: flight 9589 (fail), for first failure
 Repro found: flight 9590 (pass), for last pass
 Repro found: flight 9591 (fail), for first failure

*** Found and reproduced problem changeset ***

  Bug is in tree:  xen http://xenbits.xen.org/staging/xen-unstable.hg
  Bug introduced:  1c8789852eaf
  Bug not present: 8269826353d8

pulling from ssh://xen@xenbits.xen.org/HG/staging/xen-unstable.hg
searching for changes
no changes found

  changeset:   23990:1c8789852eaf
  user:        Jan Beulich <jbeulich@suse.com>
  date:        Fri Oct 21 09:44:47 2011 +0200
      
      x86/hpet: allocate CPU masks dynamically
      
      Signed-off-by: Jan Beulich <jbeulich@suse.com>
      Acked-by: Keir Fraser <keir@xen.org>
      
      

Revision graph left in /home/xc_osstest/results/bisect.xen-unstable.test-i386-i386-pair.leak-check--check--dst_host.{dot,ps,png,html}.
No revision to test.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 07:10:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 07:10:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RILE6-00086r-7R; Mon, 24 Oct 2011 07:10:06 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIL7j-00073y-O4
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 07:03:41 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1319465007!28423!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22163 invoked from network); 24 Oct 2011 14:03:28 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-13.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 14:03:28 -0000
Received: by qabg1 with SMTP id g1so6269774qab.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 07:03:23 -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
	:content-transfer-encoding;
	bh=gzpNOyKMxA+vhnGfWk0BFXpHqT3cCs6Mr+gWbbKFKpY=;
	b=hFlKQhuNwjJcNl/vXBuoqu4J9Pblu2GzkqcjuKTP4YQ6okSZyHVHW3nKitQZp8iTDO
	WceJonthn66+NCAew8NkfXdJ8x5d2JpbwzOsjg0APut5f9k3BKXse0u54uf1o4WwzSHm
	9+xSQwiLe9VwC9XrcaaN6Q1QC+bhqNvEL/UT4=
Received: by 10.182.17.3 with SMTP id k3mr3291507obd.59.1319465003615; Mon, 24
	Oct 2011 07:03:23 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.37.197 with HTTP; Mon, 24 Oct 2011 07:02:53 -0700 (PDT)
In-Reply-To: <alpine.DEB.2.00.1110201135540.3519@kaball-desktop>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
	<1319032613-10560-2-git-send-email-anthony.perard@citrix.com>
	<alpine.DEB.2.00.1110201135540.3519@kaball-desktop>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 15:02:53 +0100
X-Google-Sender-Auth: VAwagZTbNOIet_KFJ0RkFFhJfqA
Message-ID: <CAJJyHjLk0Ayw50VRdmvNF8O-_xZD5HWhasuu0bGBarBtGBMxGw@mail.gmail.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.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>
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH V2 01/10] configure: Introduce
	--enable-xen-pci-passthrough.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 20, 2011 at 11:57, Stefano Stabellini
<stefano.stabellini@eu.citrix.com> wrote:
>
>> diff --git a/Makefile.target b/Makefile.target
>> index 417f23e..c518103 100644
>> --- a/Makefile.target
>> +++ b/Makefile.target
>> @@ -208,6 +208,8 @@ obj-$(CONFIG_NO_XEN) +=3D xen-stub.o
>>
>> =C2=A0obj-i386-$(CONFIG_XEN) +=3D xen_platform.o
>>
>> +# Xen PCI Passthrough
>> +
>
> why?

To reserve a space for futur addition. So on the next patch, I'll just
add the object to compile and not this comment.

And why not ?

--=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 Oct 24 07:20:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 07:20:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RILOJ-0000Iw-EB; Mon, 24 Oct 2011 07:20:39 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RILN9-000069-3r
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 07:19:27 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319465962!578139!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22637 invoked from network); 24 Oct 2011 14:19:23 -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; 24 Oct 2011 14:19: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
	p9OEJHjh006161
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 14:19: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
	p9OEJGbe024627
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 14:19:16 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
	p9OEJA2L008610; Mon, 24 Oct 2011 09:19:10 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 07:19:09 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id D70F182897; Mon, 24 Oct 2011 10:19:08 -0400 (EDT)
Date: Mon, 24 Oct 2011 10:19:08 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: David Miller <davem@davemloft.net>
Subject: Re: [Xen-devel] Re: [PATCH 5/6] xen/netback: Enable netback on HVM
	guests
Message-ID: <20111024141908.GA2435@phenom.dumpdata.com>
References: <1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-6-git-send-email-dgdegra@tycho.nsa.gov>
	<1319448669.3385.161.camel@zakaz.uk.xensource.com>
	<20111024.053419.1995560587557035685.davem@davemloft.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111024.053419.1995560587557035685.davem@davemloft.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.4EA573E8.0034,ss=1,re=0.000,fgs=0
Cc: netdev@vger.kernel.org, dgdegra@tycho.nsa.gov,
	xen-devel@lists.xensource.com, Ian.Campbell@citrix.com,
	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 Mon, Oct 24, 2011 at 05:34:19AM -0400, David Miller wrote:
> From: Ian Campbell <Ian.Campbell@citrix.com>
> Date: Mon, 24 Oct 2011 10:31:08 +0100
> 
> > On Thu, 2011-10-20 at 16:35 +0100, Daniel De Graaf wrote:
> >> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> > 
> > Acked-by: Ian Campbell <ian.campbell@citrix.com>
> > 
> > Normally netback patches would go in via the networking subsystem
> > maintainer's tree but since this depends on core Xen patches from this
> > series and is unlikely to conflict with anything in the net-next tree I
> > suspect it would make more sense for Konrad to take this one.
> > 
> > David (Miller) does that work for you?
> 
> Yes, it does.

OK, Can I stick Acked-by: David Miller on that patch?

Thank you.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 07:27:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 07:27:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RILUi-0000ni-5d; Mon, 24 Oct 2011 07:27:16 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RILTq-0000bD-4v
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 07:26:23 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319466377!30442935!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9099 invoked from network); 24 Oct 2011 14:26:18 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 14:26:18 -0000
Received: by qabg1 with SMTP id g1so6306888qab.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 07:26: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:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type
	:content-transfer-encoding;
	bh=AACl6lHBKieRdU6hQvWApTm0OuYj5dSn+MXOqI9+hyg=;
	b=MUTrWJjx5aCCeZC5JvNWquwtKr6iGliPtiFXUhSogGMw9rMG9QnvMID/hwuvWcGfBK
	LDV8M/ogy+H9e57c+XdBr+NhRgampVka/qdo2hpFsxopZK200RDO+ulSaySYDQ80aHBS
	3WgTFcv5H7+/sKf5DAb2HhHQ1hxnF0Gi3qOD8=
Received: by 10.182.164.74 with SMTP id yo10mr3310851obb.69.1319466377116;
	Mon, 24 Oct 2011 07:26:17 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.37.197 with HTTP; Mon, 24 Oct 2011 07:25:47 -0700 (PDT)
In-Reply-To: <alpine.DEB.2.00.1110201136590.3519@kaball-desktop>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
	<1319032613-10560-3-git-send-email-anthony.perard@citrix.com>
	<alpine.DEB.2.00.1110201136590.3519@kaball-desktop>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 15:25:47 +0100
X-Google-Sender-Auth: AGDec3mvh9Slkx3bOZys1I7dzYI
Message-ID: <CAJJyHjKpr0e4e8ZuU0s9hnW7niLLVjNJxaHQfiFo5s9jrRmtjg@mail.gmail.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.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>
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH V2 02/10] Introduce
 HostPCIDevice to access a pci device on the 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

On Thu, Oct 20, 2011 at 11:57, Stefano Stabellini
<stefano.stabellini@eu.citrix.com> wrote:
> On Wed, 19 Oct 2011, Anthony PERARD wrote:
>> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>> ---
>> =C2=A0Makefile.target =C2=A0 =C2=A0 =C2=A0| =C2=A0 =C2=A01 +
>> =C2=A0hw/host-pci-device.c | =C2=A0245 +++++++++++++++++++++++++++++++++=
+++++++++++++++++
>> =C2=A0hw/host-pci-device.h | =C2=A0 75 +++++++++++++++
>> =C2=A03 files changed, 321 insertions(+), 0 deletions(-)
>> =C2=A0create mode 100644 hw/host-pci-device.c
>> =C2=A0create mode 100644 hw/host-pci-device.h
>>
>> diff --git a/Makefile.target b/Makefile.target
>> index c518103..ca3420d 100644
>> --- a/Makefile.target
>> +++ b/Makefile.target
>> @@ -209,6 +209,7 @@ obj-$(CONFIG_NO_XEN) +=3D xen-stub.o
>> =C2=A0obj-i386-$(CONFIG_XEN) +=3D xen_platform.o
>>
>> =C2=A0# Xen PCI Passthrough
>> +obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) +=3D host-pci-device.o
>>
>> =C2=A0# Inter-VM PCI shared memory
>> =C2=A0CONFIG_IVSHMEM =3D
>> diff --git a/hw/host-pci-device.c b/hw/host-pci-device.c
>> new file mode 100644
>> index 0000000..0f25fcf
>> --- /dev/null
>> +++ b/hw/host-pci-device.c
>> @@ -0,0 +1,245 @@
>> +/*
>> + * Copyright (C) 2011 =C2=A0 =C2=A0 =C2=A0 Citrix Ltd.
>> + *
>> + * This work is licensed under the terms of the GNU GPL, version 2. =C2=
=A0See
>> + * the COPYING file in the top-level directory.
>> + *
>> + */
>> +
>> +#include "qemu-common.h"
>> +#include "host-pci-device.h"
>> +
>> +static int path_to(const HostPCIDevice *d,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 const c=
har *name, char *buf, ssize_t size)
>> +{
>> + =C2=A0 =C2=A0return snprintf(buf, size, "/sys/bus/pci/devices/%04x:%02=
x:%02x.%x/%s",
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d=
->domain, d->bus, d->dev, d->func, name);
>> +}
>> +
>> +static int get_resource(HostPCIDevice *d)
>> +{
>> + =C2=A0 =C2=A0int i, rc =3D 0;
>> + =C2=A0 =C2=A0FILE *f;
>> + =C2=A0 =C2=A0char path[PATH_MAX];
>> + =C2=A0 =C2=A0unsigned long long start, end, flags, size;
>> +
>> + =C2=A0 =C2=A0path_to(d, "resource", 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;
>
> it would be better to return a proper error code, rather than just -1

probably -errno will do it.


>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0for (i =3D 0; i < PCI_NUM_REGIONS; i++) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (fscanf(f, "%llx %llx %llx", &start, &en=
d, &flags) !=3D 3) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, "Error: Synta=
x error in %s\n", path);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D -1;
>
> Ditto

probably 1 with a define on the top of the file.

>> + =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=A0if (start) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0size =3D end - start + 1;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0size =3D 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (i < PCI_ROM_SLOT) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d->io_regions[i].base_addr =
=3D start;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d->io_regions[i].size =3D siz=
e;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d->io_regions[i].flags =3D fl=
ags;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d->rom.base_addr =3D start;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d->rom.size =3D size;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0d->rom.flags =3D flags;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0fclose(f);
>> + =C2=A0 =C2=A0return rc;
>> +}

[...]

>> +
>> +uint32_t host_pci_find_ext_cap_offset(HostPCIDevice *d, uint32_t cap)
>> +{
>> + =C2=A0 =C2=A0uint32_t header =3D 0;
>> + =C2=A0 =C2=A0int max_cap =3D 480;
>> + =C2=A0 =C2=A0int pos =3D 0x100;
>
> could you used some defined constants here?

Yes, I will.

>> + =C2=A0 =C2=A0do {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0header =3D host_pci_get_long(d, pos);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0/*
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 * If we have no capabilities, this is indi=
cated by cap ID,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 * cap version and next pointer all being 0=
.
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 */
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (header =3D=3D 0) {
>> + =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=A0if (PCI_EXT_CAP_ID(header) =3D=3D cap) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return pos;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0pos =3D PCI_EXT_CAP_NEXT(header);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (pos < 0x100) {
>> + =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=A0max_cap--;
>> + =C2=A0 =C2=A0} while (max_cap > 0);
>> +
>> + =C2=A0 =C2=A0return 0;
>> +}


--=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 Oct 24 07:30:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 07:30:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RILXq-0001Dt-GP; Mon, 24 Oct 2011 07:30:30 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RILXF-00011L-NW
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 07:29:55 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319466558!54094935!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14229 invoked from network); 24 Oct 2011 14:29:19 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 14:29:19 -0000
Received: by qabg1 with SMTP id g1so6312250qab.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 07:29: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:from:date
	:x-google-sender-auth:message-id:subject:to:cc:content-type
	:content-transfer-encoding;
	bh=Mcu8/RVhXO52eM0UH8dKru+vz2vmPI7vJpPIeCKKzkk=;
	b=GCGK2zkHtvMxbLHFUf/aHzljDCBnMvA8BDbqhWbBaU0MPwhRTYAYk/+1nFTKMv7/AJ
	PVF9ra584QH42sNi75zfFTNCJbILTupLLHQbqdr4UbQ1Ouoq1l+pPGKcurQxR3o7Qib8
	w38QoCyuDq/H0bghV6VwF+KpFgm3vRW8i/+GU=
Received: by 10.182.46.10 with SMTP id r10mr3329161obm.29.1319466589235; Mon,
	24 Oct 2011 07:29:49 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.37.197 with HTTP; Mon, 24 Oct 2011 07:29:19 -0700 (PDT)
In-Reply-To: <alpine.DEB.2.00.1110201141280.3519@kaball-desktop>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
	<1319032613-10560-9-git-send-email-anthony.perard@citrix.com>
	<alpine.DEB.2.00.1110201141280.3519@kaball-desktop>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 15:29:19 +0100
X-Google-Sender-Auth: jk1oDOuKV-NC3ZCqMQO5Z89zzi4
Message-ID: <CAJJyHj+wMkY9zno5VbLt86ytf7N0d4TUGfidTBLu71dDokTzkQ@mail.gmail.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.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>
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH V2 08/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 Thu, Oct 20, 2011 at 11:59, Stefano Stabellini
<stefano.stabellini@eu.citrix.com> wrote:
>> + =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 allocated?

The allocation is in the next patch, the long file that handle the config s=
pace.

--=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 Oct 24 07:35:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 07: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 1RILcC-0001gD-Jd; Mon, 24 Oct 2011 07:35:00 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RILbg-0001UP-Pe
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 07:34:29 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1319466864!30136329!1
X-Originating-IP: [209.85.216.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20770 invoked from network); 24 Oct 2011 14:34:25 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 14:34:25 -0000
Received: by qyk33 with SMTP id 33so2724407qyk.9
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 07:34:24 -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
	:content-transfer-encoding;
	bh=5wzmkjVq8JM3VLh/sTILcceC8uLIusKEz76cV8W2D00=;
	b=eLwCGSCsdFHY1WiRmlR0xxnusSOm5hWBDtaMTrkuOo98eoRNDkBDTrJgGqo5VXHxgh
	m39E0tllRTt0SIHhmisjIqWNdq7fi14aAwwNROQzQ4Ze6m27M/b4wcBhe8hfAJhl3oZc
	UNSgkFU5HsgDOXjSQoge09c5rRv4RAntLHpnw=
Received: by 10.182.77.196 with SMTP id u4mr3338059obw.19.1319466864202; Mon,
	24 Oct 2011 07:34:24 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.37.197 with HTTP; Mon, 24 Oct 2011 07:33:54 -0700 (PDT)
In-Reply-To: <alpine.DEB.2.00.1110201146210.3519@kaball-desktop>
References: <1319032613-10560-1-git-send-email-anthony.perard@citrix.com>
	<1319032613-10560-10-git-send-email-anthony.perard@citrix.com>
	<alpine.DEB.2.00.1110201146210.3519@kaball-desktop>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 15:33:54 +0100
X-Google-Sender-Auth: jafV8Jd-MYQ2LZxvnpP5V1iL8Cg
Message-ID: <CAJJyHj+k0if7+ecTMtkzV+dc9hUJqAwkV9yU9GxJ_bA230JN9Q@mail.gmail.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.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>
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH V2 09/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 Thu, Oct 20, 2011 at 12:01, Stefano Stabellini
<stefano.stabellini@eu.citrix.com> wrote:
>> + =C2=A0 =C2=A0/* disable MSI/MSI-X and MSI-INTx translation */
>> + =C2=A0 =C2=A0if (s->msi) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0pt_msi_disable(s);
>> + =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0if (s->msix) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0pt_msix_disable(s);
>> + =C2=A0 =C2=A0}
>
> these msi functions are not implemented yet

Ok, I will remove all msi related call and define, and move them to
the next patch.

--=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 Oct 24 07:43:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 07:43:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RILkO-0002ED-ND; Mon, 24 Oct 2011 07:43:28 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RILjg-00021a-UY
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 07:42:45 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1319467335!41213857!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28499 invoked from network); 24 Oct 2011 14:42:15 -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;
	24 Oct 2011 14:42:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,398,1315180800"; 
   d="scan'208";a="8553254"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 14:42: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, 24 Oct 2011 15:42:41 +0100
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
	1RILjd-0006tJ-8C; Mon, 24 Oct 2011 14:42:41 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RILjd-000696-2X;
	Mon, 24 Oct 2011 15:42:41 +0100
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: <20133.31073.66208.784286@mariner.uk.xensource.com>
Date: Mon, 24 Oct 2011 15:42:41 +0100
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, "Keir
	(Xen.org)" <keir@xen.org>, Stefano Stabellini
	<Stefano.Stabellini@eu.citrix.com>
In-Reply-To: <E1RIL73-0004qU-9L@woking.xci-test.com>
References: <E1RIL73-0004qU-9L@woking.xci-test.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: 
Subject: [Xen-devel] Re: [xen-unstable bisection] complete
	test-i386-i386-pair
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 bisection] complete test-i386-i386-pair"):
> *** Found and reproduced problem changeset ***
> 
>   Bug is in tree:  xen http://xenbits.xen.org/staging/xen-unstable.hg
>   Bug introduced:  1c8789852eaf
>   Bug not present: 8269826353d8
> 
> 
>   changeset:   23990:1c8789852eaf
>   user:        Jan Beulich <jbeulich@suse.com>
>   date:        Fri Oct 21 09:44:47 2011 +0200
>       
>       x86/hpet: allocate CPU masks dynamically
>       
>       Signed-off-by: Jan Beulich <jbeulich@suse.com>
>       Acked-by: Keir Fraser <keir@xen.org>

Looking at the log, it seems that both the source and destination host
for the migration test crashed.

http://www.chiark.greenend.org.uk/~xensrcts/logs/9471/test-i386-i386-pair/info.html

Oct 23 01:36:23.433334 (XEN) ----[ Xen-4.2-unstable  x86_32p  debug=y  Not tainted ]----
Oct 23 01:36:44.057278 (XEN) CPU:    0
Oct 23 01:36:44.057308 (XEN) EIP:    e008:[<ff146151>] __find_first_bit+0x1d/0x3c
Oct 23 01:36:44.069240 (XEN) EFLAGS: 00010246   CONTEXT: hypervisor
Oct 23 01:36:44.069273 (XEN) eax: 00000000   ebx: 00000000   ecx: 00000001   edx: 00000045
Oct 23 01:36:44.077245 (XEN) esi: ff2180e0   edi: 00000000   ebp: ff253e34   esp: ff253e2c
Oct 23 01:36:44.077282 (XEN) cr0: 8005003b   cr4: 000426f0   cr3: 00bdf220   cr2: 00000000
Oct 23 01:36:44.089247 (XEN) ds: e010   es: e010   fs: 00d8   gs: 0000   ss: e010   cs: e008
Oct 23 01:36:44.097240 (XEN) Xen stack trace from esp=ff253e2c:
Oct 23 01:36:44.097271 (XEN)    00000002 ffbe4080 ff253e94 ff17fccc 00000000 00000002 bbcbc1c2 00000045
Oct 23 01:36:44.109238 (XEN)    ff253fb0 ffbe4094 f3520d09 00000045 ff253ebc ff11649d ffbfdddc ff27f180
Oct 23 01:36:44.109278 (XEN)    00000000 00000000 00000000 00000000 00989680 ff27fa80 bbcbc1c2 00000000
Oct 23 01:36:44.117253 (XEN)    ff2180e0 ff290080 ff253eb4 ff17f3e5 ffbe4080 ff14539a ff29d000 ff253f58
Oct 23 01:36:44.129244 (XEN)    00000002 ff253ebc ff253ee4 ff1695e0 ff290080 ff290080 ff253ee4 ff14fff5
Oct 23 01:36:44.129284 (XEN)    ff290080 00000000 00000082 ff253ee4 00000000 ff2180e0 ff253f54 ff154841
Oct 23 01:36:44.137258 (XEN)    00000000 00000000 ff253f60 00000045 00000000 ffbdf000 0000001d ff27f020
Oct 23 01:36:44.149240 (XEN)    ffbdf0c8 ff27f100 f30ab8f7 ff290094 00000000 00000000 00000000 ffbd9a80
Oct 23 01:36:44.157243 (XEN)    ff27f100 ff264200 ffffffff ff253fb0 ff253f7c ff120011 00000000 ff253fb0
Oct 23 01:36:44.157281 (XEN)    0000e010 0000e010 00dac08b ff14cf86 ff253f60 ff253fb0 ff27f100 00000000
Oct 23 01:36:44.169273 (XEN)    ff253fb0 ffffffff ff253f8c ff27f080 00f00000 ff14915d 0000e008 00000246
Oct 23 01:36:44.177260 (XEN)    ff253fac ff14ab2c ff253fb8 ff253fa8 ff120083 deadbeef ff29d000 ffbdf000
Oct 23 01:36:44.177301 (XEN)    ff253e38 deadbeef deadbeef 00000000 00000000 c166d350 c1663f94 00000000
Oct 23 01:36:44.189249 (XEN)    00f90000 c10023a7 00000061 00000246 c1663f84 00000069 0000007b 0000007b
Oct 23 01:36:44.197254 (XEN)    000000d8 00000000 00000000 ff29d000 00000000
Oct 23 01:36:44.197285 (XEN) Xen call trace:
Oct 23 01:36:44.209234 (XEN)    [<ff146151>] __find_first_bit+0x1d/0x3c
Oct 23 01:36:44.209267 (XEN)    [<ff17fccc>] handle_hpet_broadcast+0x87/0x263
Oct 23 01:36:44.217247 (XEN)    [<ff17f3e5>] hpet_legacy_irq_tick+0x37/0x45
Oct 23 01:36:44.217281 (XEN)    [<ff1695e0>] timer_interrupt+0x23/0x194
Oct 23 01:36:44.217314 (XEN)    [<ff154841>] do_IRQ+0x4c8/0x573
Oct 23 01:36:44.229241 (XEN)    [<ff14cf86>] common_interrupt+0x56/0x60
Oct 23 01:36:44.229274 (XEN)    [<ff14915d>] default_idle+0x5f/0x64
Oct 23 01:36:44.237248 (XEN)    [<ff14ab2c>] idle_loop+0x41/0x51
Oct 23 01:36:44.237280 (XEN)    
Oct 23 01:36:44.237302 (XEN) Pagetable walk from 00000000:
Oct 23 01:36:44.237334 (XEN)  L3[0x000] = 0000000123a91001 0001bf95
Oct 23 01:36:44.249238 (XEN)  L2[0x000] = 0000000000000000 ffffffff 
Oct 23 01:36:44.249269 (XEN) 
Oct 23 01:36:44.249290 (XEN) ****************************************
Oct 23 01:36:44.257243 (XEN) Panic on CPU 0:
Oct 23 01:36:44.257269 (XEN) FATAL PAGE FAULT
Oct 23 01:36:44.257294 (XEN) [error_code=0000]
Oct 23 01:36:44.257325 (XEN) Faulting linear address: 00000000
Oct 23 01:36:44.269239 (XEN) ****************************************
Oct 23 01:36:44.269269 (XEN) 
Oct 23 01:36:44.269290 (XEN) Reboot in five seconds...

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 08:03:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 08:03:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIM3Q-0003FT-Q0; Mon, 24 Oct 2011 08:03:09 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RILzr-0002zf-Be; Mon, 24 Oct 2011 07:59:49 -0700
X-Env-Sender: joseph.glanville@orionvm.com.au
X-Msg-Ref: server-7.tower-216.messagelabs.com!1319468362!870901!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25380 invoked from network); 24 Oct 2011 14:59:23 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-7.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 14:59:23 -0000
Received: by vws13 with SMTP id 13so6568231vws.30
	for <multiple recipients>; Mon, 24 Oct 2011 07:59:22 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.52.90.51 with SMTP id bt19mr24183015vdb.34.1319468362108; Mon,
	24 Oct 2011 07:59:22 -0700 (PDT)
Received: by 10.220.188.198 with HTTP; Mon, 24 Oct 2011 07:59:21 -0700 (PDT)
X-Originating-IP: [59.167.234.130]
In-Reply-To: <4EA54D72.7040205@xen.org>
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111018132618.GA19611@phenom.dumpdata.com>
	<1319013528.3385.59.camel@zakaz.uk.xensource.com>
	<4E9F1361.5020906@xen.org>
	<CAOzFzEjioey=65ACAJH50Nf+gHUt4HCXupfY9bHwaqCMEoquow@mail.gmail.com>
	<4EA18FAD.7080102@xen.org>
	<CAOzFzEjZKCmMDx+VbdCtEkzHM5_RcYM=4K2DZwtzu=ua6bQi9g@mail.gmail.com>
	<4EA54D72.7040205@xen.org>
Date: Tue, 25 Oct 2011 01:59:21 +1100
Message-ID: <CAOzFzEj0+JwgwE51gsHX=XpMXcBYswBEbnz=obzfyY4vZj32qw@mail.gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Joseph Glanville <joseph.glanville@orionvm.com.au>
To: Lars Kurth <lars.kurth@xen.org>
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"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>,
	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="===============0135816371=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0135816371==
Content-Type: multipart/alternative; boundary=20cf307d0372040f2d04b00caba9

--20cf307d0372040f2d04b00caba9
Content-Type: text/plain; charset=ISO-8859-1

Agreed on all counts.

I think you have a very good point in the "trails" concept... the idea of
having an information graph resounds with the goal to make advanced
documentation accessible but not overwhelm newcomers.

The DocTools macros look good.

Joseph.



On 24 October 2011 22:35, Lars Kurth <lars.kurth@xen.org> wrote:

>  On 22/10/2011 00:33, Joseph Glanville wrote:
>
>  As I noted, this is just my opinion, its not my place to decide how
> people want to use it but if we could have to idea of what should and
> shouldn't be in there it makes it easy to then structure the information.
>
>   I think we need to setup a guided rewrite/refactor of the core
>>> documentation so it resembles something close to this:
>>>
>>> Overview (brief introduction, architecture, why xen is different and
>>> maybe abit of xen philosophy)
>>> Getting started guide ( Installation of Xen on Debian - probably the
>>> simplest and easiest way to get started with Xen at the moment, start a
>>> Debian PV guest, start at Windows HVM guest)
>>> Installation guide ( More indepth covering all the core distros and some
>>> more advanced installations including compilation from source and using the
>>> Linux 3.1 kernel, networking options etc)
>>> Administration guide ( This bit requires atlot of discussion, do we
>>> recommend xm still? should we only support xl? If that is the case how to we
>>> recommend stuff like managed domains etc..)
>>> Advanced topics.. stuff like Networking, PCI passthrough etc deserve
>>> their own pages
>>>
>>  Are you suggesting we restructure the wiki front-page around this?
>
>
> Yes, maybe not -exactly- this format but something resembling it would be
> of value I think. Guiding people towards the beginners documentation and
> making it quite clear there is a reading progression will show much stronger
> cohesion.
>
>
> I think we have two choices:
> a) We re-write large sections of the wiki with the purpose of making it
> more accessible
> b) We use create methods to highlight existing stuff and focus on filling
> gaps, etc.
>
> I think that b) is more valuable. Here are a few ideas:
>
> Trails: I have come across the idea of wiki trails before. These are
> pages/indexes which lead the reader through a series of articles. The key is
> that these are easily identified and highlighted from the main page. E.g. we
> could use Trails (listing all trails and a page template),
> Trails/XenOverview, Trails/XenGettingStarted, etc. By doing this, we group
> the existing documents, rather than re-writing a lot of stuff and just
> refactoring it. This would make an easier start, and if somebody wishes they
> can always clean up and refactor the documentation which makes up a trail.
>
> I had a look around for MoinMoin plug-ins for something which may help with
> trails: not much, but there are a couple of plugins that may help
>
> Being able to create TOCs across sevaleraL wiki pages (
> http://moinmo.in/SteveTindle/DocTools from
> http://moinmo.in/MacroMarket#Release_1.5 using /EnhancedTableOfContents<http://moinmo.in/MacroMarket/EnhancedTableOfContents>
> /SetSection <http://moinmo.in/MacroMarket/SetSection> /TocOf<http://moinmo.in/MacroMarket/TocOf>)
>
>
>   The current wiki is poluted with alot of architecture and design info
>> that isn't of interest to a general user but is still key to understanding
>> Xen from a developers point of view.
>>
>  Part of the issue is that it is hard for me to identify what is what. If I
>> had a good approximation of what is what, I (or others) could just go
>> through the motions and re-encode stuff accordingly.
>
>
> I have exactly the same problem, I just need to undertand what needs to be
> done and where.
>
> I hope I will get some of this out of Wed.
>
>
>   I think what you seem to be saying is that there would be extremely high
>> value in having a "Getting started" guide and some other entry level
>> documentation (even if just an index page) accessible from the wiki front
>> page.
>>
>
> Precisely, documenting the more advanced features of Xen seems to be
> something that we can approach over time. Beginner documentation is
> immeadiately lacking and seems to be an easier target that would benefit
> more people.
>
> Let's see whether we can get enough structure in place on Wed and make a
> good start
>
> Lars
>
>


-- 
*
Founder | Director | VP Research
Orion Virtualisation Solutions* | www.orionvm.com.au | Phone: 1300 56 99 52
| Mobile: 0428 754 846

--20cf307d0372040f2d04b00caba9
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Agreed on all counts.<br><br>I think you have a very good point in the &quo=
t;trails&quot; concept... the idea of having an information graph resounds =
with the goal to make advanced documentation accessible but not overwhelm n=
ewcomers.<br>
<br>The DocTools macros look good.<br><br>Joseph.<br><br><br><br><div class=
=3D"gmail_quote">On 24 October 2011 22:35, Lars Kurth <span dir=3D"ltr">&lt=
;<a href=3D"mailto:lars.kurth@xen.org">lars.kurth@xen.org</a>&gt;</span> wr=
ote:<br>
<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;">
 =20
   =20
 =20
  <div bgcolor=3D"#FFFFFF" text=3D"#000000"><div class=3D"im">
    On 22/10/2011 00:33, Joseph Glanville wrote:<br>
    <blockquote type=3D"cite">
      <div class=3D"gmail_quote">
        <div>As I noted, this is just my opinion, its not my place to
          decide how people want to use it but if we could have to idea
          of what should and shouldn&#39;t be in there it makes it easy to
          then structure the information. <br>
        </div>
        <br>
        <blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8e=
x; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
          <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;">
              I think we need to setup a guided rewrite/refactor of the
              core documentation so it resembles something close to
              this:<br>
              <br>
              Overview (brief introduction, architecture, why xen is
              different and maybe abit of xen philosophy)<br>
              Getting started guide ( Installation of Xen on Debian -
              probably the simplest and easiest way to get started with
              Xen at the moment, start a Debian PV guest, start at
              Windows HVM guest)<br>
              Installation guide ( More indepth covering all the core
              distros and some more advanced installations including
              compilation from source and using the Linux 3.1 kernel,
              networking options etc)<br>
              Administration guide ( This bit requires atlot of
              discussion, do we recommend xm still? should we only
              support xl? If that is the case how to we recommend stuff
              like managed domains etc..)<br>
              Advanced topics.. stuff like Networking, PCI passthrough
              etc deserve their own pages<br>
            </blockquote>
          </div>
          Are you suggesting we restructure the wiki front-page around
          this?</blockquote>
        <div><br>
          Yes, maybe not -exactly- this format but something resembling
          it would be of value I think. Guiding people towards the
          beginners documentation and making it quite clear there is a
          reading progression will show much stronger cohesion. <br>
        </div>
      </div>
    </blockquote>
    <br></div>
    I think we have two choices:<br>
    a) We re-write large sections of the wiki with the purpose of making
    it more accessible<br>
    b) We use create methods to highlight existing stuff and focus on
    filling gaps, etc.<br>
    <br>
    I think that b) is more valuable. Here are a few ideas:<br>
    <br>
    Trails: I have come across the idea of wiki trails before. These are
    pages/indexes which lead the reader through a series of articles.
    The key is that these are easily identified and highlighted from the
    main page. E.g. we could use Trails (listing all trails and a page
    template), Trails/XenOverview, Trails/XenGettingStarted, etc. By
    doing this, we group the existing documents, rather than re-writing
    a lot of stuff and just refactoring it. This would make an easier
    start, and if somebody wishes they can always clean up and refactor
    the documentation which makes up a trail.<br>
    <br>
    I had a look around for MoinMoin plug-ins for something which may
    help with trails: not much, but there are a couple of plugins that
    may help<br>
    <br>
    Being able to create TOCs across sevaleraL wiki pages
    (<a href=3D"http://moinmo.in/SteveTindle/DocTools" target=3D"_blank">ht=
tp://moinmo.in/SteveTindle/DocTools</a> from
    <a href=3D"http://moinmo.in/MacroMarket#Release_1.5" target=3D"_blank">=
http://moinmo.in/MacroMarket#Release_1.5</a> using <a href=3D"http://moinmo=
.in/MacroMarket/EnhancedTableOfContents" target=3D"_blank">/EnhancedTableOf=
Contents</a>
    <a href=3D"http://moinmo.in/MacroMarket/SetSection" target=3D"_blank">/=
SetSection</a> <a href=3D"http://moinmo.in/MacroMarket/TocOf" target=3D"_bl=
ank">/TocOf</a> )<div class=3D"im"><br>
    <br>
    <blockquote type=3D"cite">
      <div class=3D"gmail_quote">
        <div>
        </div>
        <blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8e=
x; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">The curre=
nt
          wiki is poluted with alot of architecture and design info that
          isn&#39;t of interest to a general user but is still key to
          understanding Xen from a developers point of view.<br>
        </blockquote>
        <blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8e=
x; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
          Part of the issue is that it is hard for me to identify what
          is what. If I had a good approximation of what is what, I (or
          others) could just go through the motions and re-encode stuff
          accordingly.</blockquote>
        <div><br>
          I have exactly the same problem, I just need to undertand what
          needs to be done and where. <br>
        </div>
      </div>
    </blockquote></div>
    I hope I will get some of this out of Wed.<div class=3D"im"><br>
    <br>
    <blockquote type=3D"cite">
      <div class=3D"gmail_quote">
        <div>
        </div>
        <blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8e=
x; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">I think w=
hat you seem to be saying is that
          there would be extremely high value in having a &quot;Getting
          started&quot; guide and some other entry level documentation (eve=
n
          if just an index page) accessible from the wiki front page.<br>
        </blockquote>
        <div><br>
          Precisely, documenting the more advanced features of Xen seems
          to be something that we can approach over time. Beginner
          documentation is immeadiately lacking and seems to be an
          easier target that would benefit more people. <br>
        </div>
      </div>
    </blockquote></div>
    Let&#39;s see whether we can get enough structure in place on Wed and
    make a good start<br><font color=3D"#888888">
    <br>
    Lars<br>
    <br>
  </font></div>

</blockquote></div><br><br clear=3D"all"><br>-- <br><span style=3D"font-fam=
ily: arial,sans-serif; font-size: 13px; border-collapse: collapse;"><b><i><=
font color=3D"#0000ff"><div><font color=3D"#000000"><span style=3D"font-sty=
le: normal; font-weight: normal;">Founder | Director | VP Research<br>
</span></font></div>Orion Virtualisation Solutions</font></i></b>=A0|=A0<fo=
nt color=3D"#0000ff"><a href=3D"http://www.orionvm.com.au/" style=3D"color:=
 rgb(42, 93, 176);" target=3D"_blank">www.orionvm.com.au</a></font>=A0| Pho=
ne: 1300 56 99 52 | Mobile: 0428 754 846</span><br>


--20cf307d0372040f2d04b00caba9--


--===============0135816371==
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

--===============0135816371==--


From xen-devel-bounces@lists.xensource.com Mon Oct 24 08:10:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 08:10:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIMAR-0004P2-0W; Mon, 24 Oct 2011 08:10:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIM0q-00030q-Ka
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 08:00:33 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319468397!50393575!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31922 invoked from network); 24 Oct 2011 14:59:58 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-5.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 14:59:58 -0000
Received: by qabg1 with SMTP id g1so6365582qab.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 08:00:20 -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
	:content-transfer-encoding;
	bh=9eoMVD5Q5W3dMAP+ABQ5g3jlIGu5NuKlTz/8FcS7SvY=;
	b=Z/nXcgaA1pkMIuE4JWHixfinly70EOlEfxQHL4SQg7MD8wgEGl8RZph9wWZCTYou5K
	YuMjUAIQ2cD5CYA97PufMtO7T7hi1oZH/TodquSbWg62+P7h+EmevCxCkqB4wOS/zMpw
	X+xZBpYr1Y/96peimS5qqEOotKgWE77D8Vl8U=
Received: by 10.182.77.164 with SMTP id t4mr3384310obw.9.1319468420178; Mon,
	24 Oct 2011 08:00:20 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.37.197 with HTTP; Mon, 24 Oct 2011 07:59:50 -0700 (PDT)
In-Reply-To: <1319449097.3385.165.camel@zakaz.uk.xensource.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
	<1319133573-25891-3-git-send-email-anthony.perard@citrix.com>
	<1319449097.3385.165.camel@zakaz.uk.xensource.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 15:59:50 +0100
X-Google-Sender-Auth: P5MKtk_ZY2qCP2Y-ec6bhlm_Fl0
Message-ID: <CAJJyHjKSyDtStpAhNM4sbYkovDUFyNh9J+F2vCZjgYfswwOEhQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH V2 02/11] libxl_json, Check the parser status
	before to call parse_complete
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Xen Devel <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, Oct 24, 2011 at 10:38, Ian Campbell <Ian.Campbell@citrix.com> wrote=
:
> On Thu, 2011-10-20 at 18:59 +0100, Anthony PERARD wrote:
>> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>> ---
>> =C2=A0tools/libxl/libxl_json.c | =C2=A0 =C2=A04 +++-
>> =C2=A01 files changed, 3 insertions(+), 1 deletions(-)
>>
>> diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
>> index 11f65fc..c743114 100644
>> --- a/tools/libxl/libxl_json.c
>> +++ b/tools/libxl/libxl_json.c
>> @@ -744,7 +744,9 @@ libxl__json_object *libxl__json_parse(libxl__gc *gc,=
 const char *s)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0yajl_ctx.hand =3D yajl_alloc(&callback=
s, &cfg, NULL, &yajl_ctx);
>> =C2=A0 =C2=A0 =C2=A0}
>> =C2=A0 =C2=A0 =C2=A0status =3D yajl_parse(yajl_ctx.hand, (const unsigned=
 char *)s, strlen(s));
>> - =C2=A0 =C2=A0status =3D yajl_parse_complete(yajl_ctx.hand);
>> + =C2=A0 =C2=A0if (status =3D=3D yajl_status_ok) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0status =3D yajl_parse_complete(yajl_ctx.han=
d);
>> + =C2=A0 =C2=A0}
>>
>> =C2=A0 =C2=A0 =C2=A0if (status =3D=3D yajl_status_ok) {
>
> You now have two of these checks back-to-back. I guess they could be
> combined?

:(, I do not see how I could combine them. Because, if I call
parse_complete() after a parse() fail, I do not see a good error
message(yajl forget a bit of his status). And parse_complete() could
fail too, so I want to check is status too.
So, I check the same status twice, only in case of error.

(the second if(status) will print the error messages.)

--=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 Oct 24 08:14:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 08:14:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIMEJ-0004ri-ED; Mon, 24 Oct 2011 08:14:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIM21-00032R-8m
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 08:01:42 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1319468475!50035250!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15836 invoked from network); 24 Oct 2011 15:01:15 -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;
	24 Oct 2011 15:01:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,398,1315180800"; 
   d="scan'208";a="8553821"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 15:01:37 +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, 24 Oct 2011 16:01:37 +0100
Subject: Re: [Xen-devel] [PATCH V2 02/11] libxl_json, Check the parser
	status before to call parse_complete
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 16:01:37 +0100
In-Reply-To: <CAJJyHjKSyDtStpAhNM4sbYkovDUFyNh9J+F2vCZjgYfswwOEhQ@mail.gmail.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
	<1319133573-25891-3-git-send-email-anthony.perard@citrix.com>
	<1319449097.3385.165.camel@zakaz.uk.xensource.com>
	<CAJJyHjKSyDtStpAhNM4sbYkovDUFyNh9J+F2vCZjgYfswwOEhQ@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: <1319468497.3385.204.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen Devel <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, 2011-10-24 at 15:59 +0100, Anthony PERARD wrote:
> On Mon, Oct 24, 2011 at 10:38, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Thu, 2011-10-20 at 18:59 +0100, Anthony PERARD wrote:
> >> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> >> ---
> >>  tools/libxl/libxl_json.c |    4 +++-
> >>  1 files changed, 3 insertions(+), 1 deletions(-)
> >>
> >> diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
> >> index 11f65fc..c743114 100644
> >> --- a/tools/libxl/libxl_json.c
> >> +++ b/tools/libxl/libxl_json.c
> >> @@ -744,7 +744,9 @@ 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));
> >> -    status = yajl_parse_complete(yajl_ctx.hand);
> >> +    if (status == yajl_status_ok) {
> >> +        status = yajl_parse_complete(yajl_ctx.hand);
> >> +    }
> >>
> >>      if (status == yajl_status_ok) {
> >
> > You now have two of these checks back-to-back. I guess they could be
> > combined?
> 
> :(, I do not see how I could combine them. Because, if I call
> parse_complete() after a parse() fail, I do not see a good error
> message(yajl forget a bit of his status). And parse_complete() could
> fail too, so I want to check is status too.
> So, I check the same status twice, only in case of error.
> 
> (the second if(status) will print the error messages.)

I totally missed that status was updated inside the first if, sorry!

Ian.




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 08:18:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 08:18:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIMHz-0005Jq-4F; Mon, 24 Oct 2011 08:18:11 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIMDP-0004lD-ST
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 08:13:38 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1319469203!583665!1
X-Originating-IP: [209.85.216.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10167 invoked from network); 24 Oct 2011 15:13:24 -0000
Received: from mail-qy0-f171.google.com (HELO mail-qy0-f171.google.com)
	(209.85.216.171)
	by server-4.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 15:13:24 -0000
Received: by qyk33 with SMTP id 33so2778172qyk.9
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 08:13:23 -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
	:content-transfer-encoding;
	bh=qmWydgHuHwe5ab3ilnZ8MakuQLVcvs82AGMbGMQKT+Q=;
	b=afpGSNyr5phr3V1P1LF5tiu00bcnAbbQBzwLVo9o6vPgzoa6Zi1uagInN7eQkcMyY4
	ZHT/XcvT81jCo5crOnCOjQvhvCbFKs0VG9xP4aKJIwBiFwTJgI+pW4rpoCGhvtcE6YDG
	SBoz6YA1fpa1OZQSDhX5m/pRnNfa7taQ78g5Q=
Received: by 10.182.136.68 with SMTP id py4mr3386365obb.39.1319469203129; Mon,
	24 Oct 2011 08:13:23 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.37.197 with HTTP; Mon, 24 Oct 2011 08:12:53 -0700 (PDT)
In-Reply-To: <1319450257.3385.175.camel@zakaz.uk.xensource.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
	<1319133573-25891-10-git-send-email-anthony.perard@citrix.com>
	<1319450257.3385.175.camel@zakaz.uk.xensource.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 16:12:53 +0100
X-Google-Sender-Auth: uxSM4Z8bxVz-ZAk-z01t_XzV7Jw
Message-ID: <CAJJyHjKKuDL+g_gwNv+yXHxG-KNX4SR_AdEsOvTM-CVGNjihGA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH V2 09/11] libxl_json,
	Handle number abrove LONG_MAX.
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Xen Devel <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, Oct 24, 2011 at 10:57, Ian Campbell <Ian.Campbell@citrix.com> wrote=
:
> On Thu, 2011-10-20 at 18:59 +0100, Anthony PERARD wrote:
>> The integers are now "long long" in the json_object. If strtoll failed t=
o
>> convert a string into a number, the number is stored as it (a char*).
>>
>> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>> ---
>> =C2=A0tools/libxl/libxl_internal.h | =C2=A0 =C2=A07 +++--
>> =C2=A0tools/libxl/libxl_json.c =C2=A0 =C2=A0 | =C2=A0 52 +++++++++++++++=
++++++++------------------
>> =C2=A02 files changed, 33 insertions(+), 26 deletions(-)
>>
>> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
>> index 5720b31..849b251 100644
>> --- a/tools/libxl/libxl_internal.h
>> +++ b/tools/libxl/libxl_internal.h
>> @@ -465,7 +465,8 @@ typedef enum {
>> =C2=A0 =C2=A0 =C2=A0JSON_TRUE,
>> =C2=A0 =C2=A0 =C2=A0JSON_FALSE,
>> =C2=A0 =C2=A0 =C2=A0JSON_INTEGER,
>> - =C2=A0 =C2=A0JSON_DOUBLE,
>
> Did you accidentally remove this ...
>
>> + =C2=A0 =C2=A0/* number is store in string, it's too big to be a long l=
ong */
>> + =C2=A0 =C2=A0JSON_NUMBER,
>> =C2=A0 =C2=A0 =C2=A0JSON_STRING,
>> =C2=A0 =C2=A0 =C2=A0JSON_MAP,
>> =C2=A0 =C2=A0 =C2=A0JSON_ARRAY,
>> @@ -475,7 +476,7 @@ typedef enum {
>> =C2=A0typedef struct libxl__json_object {
>> =C2=A0 =C2=A0 =C2=A0libxl__json_node_type type;
>> =C2=A0 =C2=A0 =C2=A0union {
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0long i;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0long long i;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0double d;
>
> ... or accidentally leave this?

I've accidentally leave this double, because I do not handle float
number as I do'nt need them yet. But I probably should parse them as
well, and keep double in the structure.

>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0char *string;
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* List of libxl__json_object */
>> @@ -534,7 +535,7 @@ flexarray_t *libxl__json_object_get_array(const libx=
l__json_object *o)
>> =C2=A0 =C2=A0 =C2=A0else
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return NULL;
>> =C2=A0}
>> -static inline long libxl__json_object_get_integer(const libxl__json_obj=
ect *o)
>> +static inline long long libxl__json_object_get_integer(const libxl__jso=
n_object *o)
>> =C2=A0{
>> =C2=A0 =C2=A0 =C2=A0if (libxl__json_object_is_integer(o))
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return o->u.i;
>> diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
>> index c743114..2d8f61e 100644
>> --- a/tools/libxl/libxl_json.c
>> +++ b/tools/libxl/libxl_json.c
>> @@ -44,6 +44,7 @@ struct libxl__yajl_ctx {
>> =C2=A0# =C2=A0define DEBUG_GEN(ctx, type) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0yajl_gen_##type(ctx->g)
>> =C2=A0# =C2=A0define DEBUG_GEN_VALUE(ctx, type, value) yajl_gen_##type(c=
tx->g, value)
>> =C2=A0# =C2=A0define DEBUG_GEN_STRING(ctx, str, n) =C2=A0 =C2=A0 yajl_ge=
n_string(ctx->g, str, n)
>> +# =C2=A0define DEBUG_GEN_NUMBER(ctx, str, n) =C2=A0 =C2=A0 yajl_gen_num=
ber(ctx->g, str, n)
>> =C2=A0# =C2=A0define DEBUG_GEN_REPORT(yajl_ctx) \
>> =C2=A0 =C2=A0 =C2=A0do { \
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0const unsigned char *buf =3D NULL; \
>> @@ -60,6 +61,7 @@ struct libxl__yajl_ctx {
>> =C2=A0# =C2=A0define DEBUG_GEN(ctx, type) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0((void)0)
>> =C2=A0# =C2=A0define DEBUG_GEN_VALUE(ctx, type, value) =C2=A0 =C2=A0 ((v=
oid)0)
>> =C2=A0# =C2=A0define DEBUG_GEN_STRING(ctx, value, lenght) =C2=A0((void)0=
)
>> +# =C2=A0define DEBUG_GEN_NUMBER(ctx, value, lenght) =C2=A0((void)0)
>
> that typo got propagated...
>
>> =C2=A0# =C2=A0define DEBUG_GEN_REPORT(ctx) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 ((void)0)
>> =C2=A0#endif
>>
>> @@ -363,6 +365,7 @@ void libxl__json_object_free(libxl__gc *gc, libxl__j=
son_object *obj)
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return;
>> =C2=A0 =C2=A0 =C2=A0switch (obj->type) {
>> =C2=A0 =C2=A0 =C2=A0case JSON_STRING:
>> + =C2=A0 =C2=A0case JSON_NUMBER:
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0free(obj->u.string);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0break;
>> =C2=A0 =C2=A0 =C2=A0case JSON_MAP: {
>> @@ -504,35 +507,38 @@ static int json_callback_boolean(void *opaque, int=
 boolean)
>> =C2=A0 =C2=A0 =C2=A0return 1;
>> =C2=A0}
>>
>> -static int json_callback_integer(void *opaque, long value)
>> +static int json_callback_number(void *opaque, const char *s, unsigned i=
nt len)
>> =C2=A0{
>> =C2=A0 =C2=A0 =C2=A0libxl__yajl_ctx *ctx =3D opaque;
>> - =C2=A0 =C2=A0libxl__json_object *obj;
>> -
>> - =C2=A0 =C2=A0DEBUG_GEN_VALUE(ctx, integer, value);
>> + =C2=A0 =C2=A0libxl__json_object *obj =3D NULL;
>> + =C2=A0 =C2=A0long long i;
>>
>> - =C2=A0 =C2=A0if ((obj =3D json_object_alloc(ctx->gc, JSON_INTEGER)) =
=3D=3D NULL)
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
>> - =C2=A0 =C2=A0obj->u.i =3D value;
>> + =C2=A0 =C2=A0/* should be replace by number */
>> + =C2=A0 =C2=A0DEBUG_GEN_NUMBER(ctx, s, len);
>>
>> - =C2=A0 =C2=A0if (json_object_append_to(ctx->gc, obj, ctx->current) =3D=
=3D -1) {
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__json_object_free(ctx->gc, obj);
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
>> - =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0i =3D strtoll(s, NULL, 10);
>>
>> - =C2=A0 =C2=A0return 1;
>> -}
>> + =C2=A0 =C2=A0if ((i =3D=3D LLONG_MIN || i =3D=3D LLONG_MAX) && errno =
=3D=3D ERANGE) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0char *t =3D NULL;
>>
>> -static int json_callback_double(void *opaque, double value)
>> -{
>> - =C2=A0 =C2=A0libxl__yajl_ctx *ctx =3D opaque;
>> - =C2=A0 =C2=A0libxl__json_object *obj;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if ((obj =3D json_object_alloc(ctx->gc, JSO=
N_NUMBER)) =3D=3D NULL)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
>>
>> - =C2=A0 =C2=A0DEBUG_GEN_VALUE(ctx, double, value);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0t =3D malloc(len + 1);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (t =3D=3D NULL) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0LIBXL__LOG_ERRNO(libxl__gc_ow=
ner(ctx->gc), LIBXL__LOG_ERROR,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 "Failed to allocate");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0strncpy(t, s, len);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0t[len] =3D 0;
>>
>> - =C2=A0 =C2=A0if ((obj =3D json_object_alloc(ctx->gc, JSON_DOUBLE)) =3D=
=3D NULL)
>> - =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
>> - =C2=A0 =C2=A0obj->u.d =3D value;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0obj->u.string =3D t;
>> + =C2=A0 =C2=A0} else {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if ((obj =3D json_object_alloc(ctx->gc, JSO=
N_INTEGER)) =3D=3D NULL)
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return 0;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0obj->u.i =3D i;
>> + =C2=A0 =C2=A0}
>>
>> =C2=A0 =C2=A0 =C2=A0if (json_object_append_to(ctx->gc, obj, ctx->current=
) =3D=3D -1) {
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl__json_object_free(ctx->gc, obj);
>> @@ -706,9 +712,9 @@ static int json_callback_end_array(void *opaque)
>> =C2=A0static yajl_callbacks callbacks =3D {
>> =C2=A0 =C2=A0 =C2=A0json_callback_null,
>> =C2=A0 =C2=A0 =C2=A0json_callback_boolean,
>> - =C2=A0 =C2=A0json_callback_integer,
>> - =C2=A0 =C2=A0json_callback_double,
>> =C2=A0 =C2=A0 =C2=A0NULL,
>> + =C2=A0 =C2=A0NULL,
>> + =C2=A0 =C2=A0json_callback_number,
>> =C2=A0 =C2=A0 =C2=A0json_callback_string,
>> =C2=A0 =C2=A0 =C2=A0json_callback_start_map,
>> =C2=A0 =C2=A0 =C2=A0json_callback_map_key,
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>



--=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 Oct 24 08:24:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 08:24:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIMNl-0005u6-0V; Mon, 24 Oct 2011 08:24:09 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIMN8-0005hV-RX
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 08:23:31 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1319469692!41631998!1
X-Originating-IP: [209.85.212.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29880 invoked from network); 24 Oct 2011 15:21:33 -0000
Received: from mail-vw0-f43.google.com (HELO mail-vw0-f43.google.com)
	(209.85.212.43)
	by server-14.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 15:21:33 -0000
Received: by vws13 with SMTP id 13so6602066vws.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 08:23:26 -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
	:content-transfer-encoding;
	bh=/bqX89ASBnTnqqJQCH/6hH0gNqiubCtIgPEft4gxMVw=;
	b=YknxvbRZ5MK2I9ifIDlEHozeIBbaFyJNW3E8MJ8ll7hRY+IT9NkNTpfVMWYVmiPX1j
	+1GwG9sR/4nWo3MJyc1yZzZc8vwOnh5JSmKivhPK1QOjFNpdEkSYE9wausPO/hfKSbRq
	rV3pdOndfEjCUU6ea0PVn+zaeCoFKSjx6heUE=
Received: by 10.182.77.196 with SMTP id u4mr3385392obw.19.1319469806295; Mon,
	24 Oct 2011 08:23:26 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.37.197 with HTTP; Mon, 24 Oct 2011 08:22:55 -0700 (PDT)
In-Reply-To: <1319450320.3385.176.camel@zakaz.uk.xensource.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
	<1319133573-25891-5-git-send-email-anthony.perard@citrix.com>
	<1319450320.3385.176.camel@zakaz.uk.xensource.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 16:22:55 +0100
X-Google-Sender-Auth: cFYo17nwJ7imUrMrWC36Ge7uYBQ
Message-ID: <CAJJyHj+9yFtmKuu_45SJYAEY21M-bHhH9oNZFMGYmUM_S6dXFQ@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH V2 04/11] libxl,
	Introduce dm-version xenstore key.
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Xen Devel <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, Oct 24, 2011 at 10:58, Ian Campbell <Ian.Campbell@citrix.com> wrote=
:
> On Thu, 2011-10-20 at 18:59 +0100, Anthony PERARD wrote:
>> The all key is /libxl/$domid/dm-version.
>>
>> The /libxl/$domid dir is created with the domain and should be only acce=
ssible
>> by the toolstack domain.
>>
>> This come with libxl__device_model_version_running helper function.
>>
>> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
>> ---
>> =C2=A0tools/libxl/libxl.c =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| =C2=A0 =C2=
=A02 ++
>> =C2=A0tools/libxl/libxl_create.c =C2=A0 | =C2=A0 28 ++++++++++++++++++++=
++++++++
>> =C2=A0tools/libxl/libxl_internal.c | =C2=A0 19 +++++++++++++++++++
>> =C2=A0tools/libxl/libxl_internal.h | =C2=A0 =C2=A05 +++++
>> =C2=A04 files changed, 54 insertions(+), 0 deletions(-)
>>
>> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
>> index 064fbc4..50b97c2 100644
>> --- a/tools/libxl/libxl.c
>> +++ b/tools/libxl/libxl.c
>> @@ -777,6 +777,8 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t do=
mid, int force)
>> =C2=A0 =C2=A0 =C2=A0if (!xs_rm(ctx->xsh, XBT_NULL, dom_path))
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR=
, "xs_rm failed for %s", dom_path);
>>
>> + =C2=A0 =C2=A0xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "/libxl/%d"=
, domid));
>> +
>> =C2=A0 =C2=A0 =C2=A0libxl__userdata_destroyall(&gc, domid);
>>
>> =C2=A0 =C2=A0 =C2=A0rc =3D xc_domain_destroy(ctx->xch, domid);
>> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
>> index 68d0fc3..bed991c 100644
>> --- a/tools/libxl/libxl_create.c
>> +++ b/tools/libxl/libxl_create.c
>> @@ -322,6 +322,9 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_c=
reate_info *info,
>> =C2=A0 =C2=A0 =C2=A0xs_transaction_t t =3D 0;
>> =C2=A0 =C2=A0 =C2=A0xen_domain_handle_t handle;
>>
>> + =C2=A0 =C2=A0struct xs_permissions libxlperm[1];
>> + =C2=A0 =C2=A0char *libxl_path =3D NULL;
>> +
>
> The variable declaration block has little sections of perms and *_path
> -- you might as well include those there. libxlperm might be better
> called noperm (assuming that really is it's meaning, xs's permission
> scheme confuses the hell out of me).

OK, I will change that.

>> =C2=A0 =C2=A0 =C2=A0assert(!libxl_domid_valid_guest(*domid));
>>
>> =C2=A0 =C2=A0 =C2=A0uuid_string =3D libxl__uuid2string(gc, info->uuid);
>> @@ -368,6 +371,15 @@ int libxl__domain_make(libxl__gc *gc, libxl_domain_=
create_info *info,
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
>> =C2=A0 =C2=A0 =C2=A0}
>>
>> + =C2=A0 =C2=A0libxl_path =3D libxl__sprintf(gc, "/libxl/%i", *domid);
>
> This is probably worthy of a little helper, similar to
> libxl__xs_get_dom_path(). (/vm/blah ought to have one too but doesn't).

I will do it.

>> + =C2=A0 =C2=A0if (!libxl_path) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot a=
llocate create paths");
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D ERROR_FAIL;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0goto out;
>> + =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0libxlperm[0].id =3D 0;
>> + =C2=A0 =C2=A0libxlperm[0].perms =3D XS_PERM_NONE;
>> +
>> =C2=A0 =C2=A0 =C2=A0roperm[0].id =3D 0;
>> =C2=A0 =C2=A0 =C2=A0roperm[0].perms =3D XS_PERM_NONE;
>> =C2=A0 =C2=A0 =C2=A0roperm[1].id =3D *domid;
>> @@ -386,6 +398,10 @@ retry_transaction:
>> =C2=A0 =C2=A0 =C2=A0xs_mkdir(ctx->xsh, t, vm_path);
>> =C2=A0 =C2=A0 =C2=A0xs_set_permissions(ctx->xsh, t, vm_path, roperm, ARR=
AY_SIZE(roperm));
>>
>> + =C2=A0 =C2=A0xs_rm(ctx->xsh, t, libxl_path);
>> + =C2=A0 =C2=A0xs_mkdir(ctx->xsh, t, libxl_path);
>> + =C2=A0 =C2=A0xs_set_permissions(ctx->xsh, t, libxl_path, libxlperm, AR=
RAY_SIZE(libxlperm));
>> +
>> =C2=A0 =C2=A0 =C2=A0xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/vm", do=
m_path), vm_path, strlen(vm_path));
>> =C2=A0 =C2=A0 =C2=A0rc =3D libxl__domain_rename(gc, *domid, 0, info->nam=
e, t);
>> =C2=A0 =C2=A0 =C2=A0if (rc)
>> @@ -429,6 +445,16 @@ retry_transaction:
>> =C2=A0 =C2=A0 =C2=A0return rc;
>> =C2=A0}
>>
>> +static int store_libxl_entry(libxl__gc *gc, uint32_t 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 libxl_device_model_info *dm_info)
>> +{
>> + =C2=A0 =C2=A0char *path =3D NULL;
>> +
>> + =C2=A0 =C2=A0path =3D libxl__sprintf(gc, "/libxl/%i/dm-version", domid=
);
>> + =C2=A0 =C2=A0return libxl__xs_write(gc, XBT_NULL, path, libxl__strdup(=
gc,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0libxl_device_model_version_to_string(dm_inf=
o->device_model_version)));
>> +}
>> +
>> =C2=A0static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_=
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 =C2=A0 =C2=A0libxl_console_ready cb, void *priv,
>> =C2=A0 =C2=A0 =C2=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 *domid_out, int restore_fd)
>> @@ -485,6 +511,8 @@ static int do_domain_create(libxl__gc *gc, libxl_dom=
ain_config *d_config,
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0goto error_out;
>> =C2=A0 =C2=A0 =C2=A0}
>>
>> + =C2=A0 =C2=A0store_libxl_entry(gc, domid, dm_info);
>> +
>> =C2=A0 =C2=A0 =C2=A0for (i =3D 0; i < d_config->num_disks; i++) {
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ret =3D libxl_device_disk_add(ctx, dom=
id, &d_config->disks[i]);
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (ret) {
>> diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
>> index 3993d8e..5d0a2d4 100644
>> --- a/tools/libxl/libxl_internal.c
>> +++ b/tools/libxl/libxl_internal.c
>> @@ -319,6 +319,25 @@ int libxl__fd_set_cloexec(int fd)
>> =C2=A0 =C2=A0 =C2=A0return fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
>> =C2=A0}
>>
>> +libxl_device_model_version libxl__device_model_version_running(libxl__g=
c *gc,
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 u=
int32_t domid)
>> +{
>> + =C2=A0 =C2=A0char *path =3D NULL;
>> + =C2=A0 =C2=A0char *dm_version =3D NULL;
>> + =C2=A0 =C2=A0libxl_device_model_version value;
>> +
>> + =C2=A0 =C2=A0path =3D libxl__sprintf(gc, "/libxl/%d/dm-version", domid=
);
>> + =C2=A0 =C2=A0dm_version =3D libxl__xs_read(gc, XBT_NULL, path);
>> + =C2=A0 =C2=A0if (!dm_version) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_=
TRADITIONAL;
>> + =C2=A0 =C2=A0}
>> +
>> + =C2=A0 =C2=A0if (libxl_device_model_version_from_string(dm_version, &v=
alue) < 0) {
>
> I think this should be a fatal error, if you've managed to read
> something from this key and it isn't one of the expect values then
> something bad has happened.

Yes, I will change this to a fatal error.

>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0return LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_=
TRADITIONAL;
>> + =C2=A0 =C2=A0}
>> + =C2=A0 =C2=A0return value;
>> +}
>> +
>> =C2=A0/*
>> =C2=A0 * Local variables:
>> =C2=A0 * mode: C
>> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
>> index 2e26ac6..5720b31 100644
>> --- a/tools/libxl/libxl_internal.h
>> +++ b/tools/libxl/libxl_internal.h
>> @@ -554,6 +554,11 @@ _hidden void libxl__json_object_free(libxl__gc *gc,=
 libxl__json_object *obj);
>>
>> =C2=A0_hidden libxl__json_object *libxl__json_parse(libxl__gc *gc, const=
 char *s);
>>
>> + =C2=A0/* Based on /local/domain/$domid/dm-version xenstore key
>> + =C2=A0 * default is qemu xen traditional */
>> +_hidden libxl_device_model_version
>> +libxl__device_model_version_running(libxl__gc *gc, uint32_t domid);
>> +
>> =C2=A0#endif
>>
>> =C2=A0/*

--=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 Oct 24 08:28:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 08:28:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIMRz-0006LT-Ik; Mon, 24 Oct 2011 08:28:32 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIMRQ-00068l-7p
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 08:27:56 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1319470072!1459341!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26863 invoked from network); 24 Oct 2011 15:27:53 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 15:27:53 -0000
Received: by qabg1 with SMTP id g1so6414926qab.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 08:27:51 -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
	:content-transfer-encoding;
	bh=slPr99Yllz05L/ydI7X8brMccC5NG/h+mrPEbPy4e48=;
	b=JUpJAVm8sDddsDw1Ux2719FuRueCTdX19Br0H8h00GT+iF6BDiVhs12+0/yRSvbPC8
	RvDDh2nETuIxL9BnWK6PlOZZBNWw+4MxpSdYdsTdlPL49zFQApOrY8pnaKqyxnipe2G1
	WyPNkD90z/uDT+Mie2y3kUIo8uE/xt0fej57Q=
Received: by 10.182.136.68 with SMTP id py4mr3399570obb.39.1319470071280; Mon,
	24 Oct 2011 08:27:51 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.37.197 with HTTP; Mon, 24 Oct 2011 08:27:21 -0700 (PDT)
In-Reply-To: <1319450467.3385.178.camel@zakaz.uk.xensource.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
	<1319133573-25891-11-git-send-email-anthony.perard@citrix.com>
	<1319450467.3385.178.camel@zakaz.uk.xensource.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 24 Oct 2011 16:27:21 +0100
X-Google-Sender-Auth: E7lqbfRYn_jsJhZf9fFuBoT3vMY
Message-ID: <CAJJyHjLqcCaAfP1RefZMcr4JOCCmfo-4CygexxLHQOFs4t2y8w@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH V2 10/11] libxl_qmp,
	Introduce libxl__qmp_pci_add.
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Cc: Xen Devel <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, Oct 24, 2011 at 11:01, Ian Campbell <Ian.Campbell@citrix.com> wrote=
:
>
>> + =C2=A0 =C2=A0rc =3D qmp_synchronous_send(qmp, "device_add", &args, NUL=
L, qmp->timeout);
>> + =C2=A0 =C2=A0if (rc =3D=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D qmp_synchronous_send(qmp, "query-pci=
", 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&request, qmp->timeout);
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (rc =3D=3D 0) {
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0rc =3D request.rc;
>> + =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>
> Is every caller going to want this behaviour? Perhaps it belongs in
> qmp_sync..._send?

Yes, I think we want to know if the command and the callback have been
a success or not. And, in case we want to know if it's a protocol
error or an error in the callback, then we will just need different
value return.

--=20
Anthony PERARD

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-api-bounces@lists.xensource.com Mon Oct 24 09:07:05 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 09:07:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIN3I-0007VV-K8; Mon, 24 Oct 2011 09:07:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIN1o-0007Qj-J2; Mon, 24 Oct 2011 09:05:51 -0700
X-Env-Sender: torushikeshj@gmail.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319472327!30456253!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31461 invoked from network); 24 Oct 2011 16:05:28 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 16:05:28 -0000
Received: by ywp17 with SMTP id 17so2393545ywp.30
	for <multiple recipients>; Mon, 24 Oct 2011 09:05:26 -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=6Qogb+diTYIyi/Le9D5jZfy10hBWMPm1P9nRRQN8h9M=;
	b=VM9DpSCOea7YpKl8ChugRiqFQXbhWMeBTYMyV/ZOpfoRh4BZ5holxU4C2sbL8Wfc28
	SxTjE6FxfG5XcVKZ4g7liVDHp5OEQxBlaiE/ynPj4Tutt0GZVspjrQK+VblatcIqiYHl
	h4JHHvRwnkFXJ1bg6vtVMNtZxwZstUJ8yzyRM=
MIME-Version: 1.0
Received: by 10.68.37.97 with SMTP id x1mr48808899pbj.14.1319472326659; Mon,
	24 Oct 2011 09:05:26 -0700 (PDT)
Received: by 10.143.67.12 with HTTP; Mon, 24 Oct 2011 09:05:26 -0700 (PDT)
Date: Mon, 24 Oct 2011 21:35:26 +0530
Message-ID: <CAO14VsPQO3LmevkV9xa6P=aXHCGrmnG9vURM4soiJEykeciX0Q@mail.gmail.com>
From: R J <torushikeshj@gmail.com>
To: xen-api@lists.xensource.com, xen-devel@lists.xensource.com, 
	xen-users@lists.xensource.com
Cc: 
Subject: [Xen-API] CloudLinux on Xen
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>
Content-Type: multipart/mixed; boundary="===============0696953824=="
Sender: xen-api-bounces@lists.xensource.com
Errors-To: xen-api-bounces@lists.xensource.com

--===============0696953824==
Content-Type: multipart/alternative; boundary=bcaec520e627524f5b04b00d9735

--bcaec520e627524f5b04b00d9735
Content-Type: text/plain; charset=ISO-8859-1

Hello List,

I am testing a XCP1 CentOS 5 paravirt vm with CloudLinux.
http://cloudlinux.com/
CloudLinux is a great product for shared hosting and I was evaluation same
on a paravirt guest.

I found a strange thing in XCP. CloudLinux provides xen kernel for DomUs and
after installing the CloudLinux in a DomU it actually got 32 cpus inside.
I had assigned only 2 vCPU to that DomU. To confirm this I started
generating load on that DomU and in no time it ate all my node's CPUs.

Is it an expected behavior that one of your DomU can eat all node with few
modifications in kernel ?
Or is Paravirt not a Hardware Virtualized guest ?

Regards,
R J

--bcaec520e627524f5b04b00d9735
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hello List,<br><br>I am testing a XCP1 CentOS 5 paravirt vm with CloudLinux=
. <a href=3D"http://cloudlinux.com/">http://cloudlinux.com/</a><br>CloudLin=
ux is a great product for shared hosting and I was evaluation same on a par=
avirt guest.<br>
<br>I found a strange thing in XCP. CloudLinux provides xen kernel for DomU=
s and after installing the CloudLinux in a DomU it actually got 32 cpus ins=
ide.<br>I had assigned only 2 vCPU to that DomU. To confirm this I started =
generating load on that DomU and in no time it ate all my node&#39;s CPUs.<=
br>
<br>Is it an expected behavior that one of your DomU can eat all node with =
few modifications in kernel ?<br>Or is Paravirt not a Hardware Virtualized =
guest ?<br><br>Regards,<br>R J<br><br><br>

--bcaec520e627524f5b04b00d9735--


--===============0696953824==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

--===============0696953824==--


From xen-devel-bounces@lists.xensource.com Mon Oct 24 09:17:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 09:17:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RINDl-0000Yg-KI; Mon, 24 Oct 2011 09:17:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIND2-0000LE-Fj
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 09:17:10 -0700
X-Env-Sender: dunlapg@gmail.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1319473025!886044!1
X-Originating-IP: [74.125.82.41]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21826 invoked from network); 24 Oct 2011 16:17:05 -0000
Received: from mail-ww0-f41.google.com (HELO mail-ww0-f41.google.com)
	(74.125.82.41)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 16:17:05 -0000
Received: by wwe32 with SMTP id 32so3974095wwe.0
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 09:17: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=hOVCBdNI8WaW3HlaSBmLx/wnBtyN9yLLHNnFlk2Aqgo=;
	b=CJOsvOxz9VbIImxzSekVn4A+vbmzRQ7WwhB/YKeq5oh8mt0L95xjw71tgKKMWzrr6s
	688dVaYdTyTPcmNIuhqLd87WEcLi1hbLFm+SND5ExHtT5USI4vsdBR6Q9szMk0VV4gcD
	EcDGkO8OhhPR1vh9igmgtngYBpHlV0Fo6atKU=
MIME-Version: 1.0
Received: by 10.216.138.209 with SMTP id a59mr7285979wej.94.1319473025178;
	Mon, 24 Oct 2011 09:17:05 -0700 (PDT)
Received: by 10.216.6.207 with HTTP; Mon, 24 Oct 2011 09:17:04 -0700 (PDT)
In-Reply-To: <C10D3FB0CD45994C8A51FEC1227CE22F340768D793@shsmsx502.ccr.corp.intel.com>
References: <C10D3FB0CD45994C8A51FEC1227CE22F340768D793@shsmsx502.ccr.corp.intel.com>
Date: Mon, 24 Oct 2011 17:17:04 +0100
X-Google-Sender-Auth: J3Yje5HwkFfwVp1Ev9mwgRedHJM
Message-ID: <CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@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: "Duan, Jiangang" <jiangang.duan@intel.com>, "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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 24, 2011 at 4:36 AM, Lv, Hui <hui.lv@intel.com> wrote:
>
> As one of the topics presented in Xen summit2011 in SC, we proposed one m=
ethod scheduler rate controller (SRC) to control high frequency of scheduli=
ng under some conditions. You can find the slides at
> http://www.slideshare.net/xen_com_mgr/9-hui-lvtacklingthemanagementchalle=
ngesofserverconsolidationonmulticoresystems
>
> In the followings, we have tested it with 2-socket multi-core system with=
 many rounds and got the positive results and improve the performance great=
ly either with the consolidation workload SPECvirt_2010 or some small workl=
oads such as sysbench and SPECjbb. So I posted it here for review.
>
> >From Xen scheduling mechanism, hypervisor kicks related VCPUs by raising=
 schedule softirq during processing external interrupts. Therefore, if the =
number of IRQ is very large, the scheduling happens more frequent. Frequent=
 scheduling will
> 1) bring more overhead for hypervisor and
> 2) increase cache miss rate.
>
> In our consolidation workloads, SPECvirt_sc2010, SR-IOV & iSCSI solution =
are adopted to bypass software emulation but bring heavy network traffic. C=
orrespondingly, 15k scheduling happened per second on each physical core, w=
hich means the average running time is =A0very short, only 60us. We propose=
d SRC in XEN to mitigate this problem.
> The performance benefits brought by this patch is very huge at peak throu=
ghput with no influence when system loads are low.
>
> SRC improved SPECvirt performance by 14%.
> 1)It reduced CPU utilization, which allows more load to be added.
> 2)Response time (QoS) =A0became better at the same CPU %.
> 3)The better response time allowed us to push the CPU % at peak performan=
ce to an even higher level (CPU was not saturated in SPECvirt).
> SRC reduced context switch rate significantly, resulted in
> 2)Smaller Path Length
> 3)Less cache misses thus lower CPI
> 4)Better performance for both Guest and Hypervisor sides.
>
> With this patch, from our SPECvirt_sc2010 results, the performance of xen=
 catches up the other open sourced hypervisor.

Hui,

Thanks for the patch, and the work you've done testing it.  There are
a couple of things to discuss.

* I'm not sure I like the idea of doing this at the generic level than
at the specific scheduler level -- e.g., inside of credit1.  For
better or for worse, all aspects of scheduling work together, and even
small changes tend to have a significant effect on the emergent
behavior.  I understand why you'd want this in the generic scheduling
code; but it seems like it would be better for each scheduler to
implement a rate control independently.

* The actual algorithm you use here isn't described.  It seems to be
as follows (please correct me if I've made a mistake
reverse-engineering the algorithm):

Every 10ms, check to see if there have been more than 50 schedules.
If so, disable pre-emption entirely for 10ms, allowing processes to
run without being interrupted (unless they yield).

It seems like we should be able to do better.  For one, it means in
the general case you will flip back and forth between really frequent
schedules and less frequent schedules.  For two, turning off
preemption entirely will mean that whatever vcpu happens to be running
could, if it wished, run for the full 10ms; and which one got elected
to do that would be really random.  This may work well for SPECvirt,
but it's the kind of algorithm that is likely to have some workloads
on which it works very poorly.  Finally, there's the chance that this
algorithm could be "gamed" -- i.e., if a rogue VM knew that most other
VMs yielded frequently, it might be able to arrange that there would
always be more than 50 context switches a second, while it runs
without preemption and takes up more than its fair share.

Have you tried just making it give each vcpu a minimum amount of
scheduling time, say, 500us or 1ms?

Now a couple of stylistic comments:
* src tends to make me think of "source".  I think sched_rate[_*]
would fit the existing naming convention better.
* src_controller() shouldn't call continue_running() directly.
Instead, scheduler() should call src_controller(); and only call
sched->do_schedule() if src_controller() returns false (or something
like that).
* Whatever the algorithm is should have comments describing what it
does and how it's supposed to work.
* Your patch is malformed; you need to have it apply at the top level,
not from within the xen/ subdirectory.  The easiest way to get a patch
is to use either mercurial queues, or "hg diff".  There are some good
suggestions for making and posting patches here:
http://wiki.xensource.com/xenwiki/SubmittingXenPatches

Thanks again for all your work on this -- we definitely want Xen to
beat the other open-source hypervisor. :-)

 -George

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 09:59:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 09:59:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RINs2-0003vH-SR; Mon, 24 Oct 2011 09:59:30 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RINqE-0003hd-1u
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 09:57:38 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1319475454!1469116!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20346 invoked from network); 24 Oct 2011 16:57:35 -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;
	24 Oct 2011 16:57:35 -0000
Received: by wyi11 with SMTP id 11so8118038wyi.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 09:57:34 -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=DOEB6O4cqwvF1yxHZ//nOsy5bw25BBmq9VH6QZVIOC4=;
	b=S48V1LaOTFjG9wJHOAA/8HMJcrpMSEhPSScOtiY+doKJU8g1srfLKj+p4ES2N0tsHP
	zXxKnNT569VuEt2Md6nkqWLKoHvmRfcgSEsXg1JfSC59Wv32r2g1DUVrt0KQcwLJ075b
	tvfj7J8WubZLlsf/I+8hqd4k7i5RUP5Q4/jDg=
Received: by 10.216.139.170 with SMTP id c42mr6905769wej.0.1319475454753;
	Mon, 24 Oct 2011 09:57:34 -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 q30sm40042138wbn.17.2011.10.24.09.57.30
	(version=SSLv3 cipher=OTHER); Mon, 24 Oct 2011 09:57:32 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Mon, 24 Oct 2011 17:57:27 +0100
Subject: Re: [Xen-devel] [PATCH] scheduler rate controller
From: Keir Fraser <keir@xen.org>
To: George Dunlap <George.Dunlap@eu.citrix.com>, "Lv, Hui" <hui.lv@intel.com>
Message-ID: <CACB5787.33131%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] scheduler rate controller
Thread-Index: AcySbgJTwF9STDS7aEez2D8SH4kEvA==
In-Reply-To: <CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: "Duan, Jiangang" <jiangang.duan@intel.com>, "Tian,
	Kevin" <kevin.tian@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Dong, Eddie" <eddie.dong@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 24/10/2011 17:17, "George Dunlap" <George.Dunlap@eu.citrix.com> wrote:

> * I'm not sure I like the idea of doing this at the generic level than
> at the specific scheduler level -- e.g., inside of credit1.  For
> better or for worse, all aspects of scheduling work together, and even
> small changes tend to have a significant effect on the emergent
> behavior.  I understand why you'd want this in the generic scheduling
> code; but it seems like it would be better for each scheduler to
> implement a rate control independently.

Yes, this doesn't belong in schedule.c.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 10:31:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 10:31:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIOMb-00009f-U7; Mon, 24 Oct 2011 10:31:06 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIOJN-0007dZ-M6
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 10:27:47 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319477260!36488430!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9718 invoked from network); 24 Oct 2011 17:27:42 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-2.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 17:27:42 -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
	p9OHRbfb000815
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 17:27:38 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
	p9OHRZwE011170
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 17:27:36 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
	p9OHRUDX019348; Mon, 24 Oct 2011 12:27:30 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 10:27:30 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 6E25B82A24; Mon, 24 Oct 2011 13:27:28 -0400 (EDT)
Date: Mon, 24 Oct 2011 13:27:28 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Thomas Hellstrom <thomas@shipmail.org>
Message-ID: <20111024172728.GD2320@phenom.dumpdata.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>
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-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090206.4EA5A00B.0098,ss=1,re=-2.300,fgs=0
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.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?

Yes - and I should have addressed that in the writeup but forgot, sorry about that.

So initially I thought you meant this:

diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index 360afb3..06ef048 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -662,8 +662,7 @@ out:
 
 /* 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)
+			    int flags, enum ttm_caching_state cstate)
 {
 	unsigned long irq_flags;
 	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
@@ -707,8 +706,7 @@ static void __ttm_put_pages(struct list_head *pages, unsigned page_count,
  * cached pages.
  */
 static int __ttm_get_pages(struct list_head *pages, int flags,
-			   enum ttm_caching_state cstate, unsigned count,
-			   dma_addr_t *dma_address)
+			   enum ttm_caching_state cstate, unsigned count)
 {
 	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
 	struct page *p = NULL;
@@ -864,7 +862,7 @@ int ttm_get_pages(struct ttm_tt *ttm, struct list_head *pages,
 	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);
+				count)
 }
 void ttm_put_pages(struct ttm_tt *ttm, struct list_head *pages,
 		   unsigned page_count, dma_addr_t *dma_address)
@@ -873,5 +871,5 @@ void ttm_put_pages(struct ttm_tt *ttm, struct list_head *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);
+				ttm->caching_state)
 }
which is trivial (thought I have not compile tested it), but it should do it.

But I think you mean eliminate the dma_address handling completly in
ttm_page_alloc.c and ttm_tt.c.

For that there are couple of architectural issues I am not sure how to solve. 

There has to be some form of TTM<->[Radeon|Nouveau] lookup mechanism
to say: "here is a 'struct page *', give me the bus address". Currently
this is solved by keeping an array of DMA addresses along with the list
of pages. And passing the list and DMA address up the stack (and down)
from TTM up to the driver (when ttm->be->func->populate is called and they
are handed off) does it. It does not break any API layering .. and the internal
TTM pool (non-DMA) can just ignore the dma_address altogether (see patch above).

But if we wanted to rip all mention of dma_addr from TTM, one immediate way
that comes to my mind is:

 1). Provide a new function in the ttm->be->func that would be called 'get_dma' of:
     (int)( *get_dma)(struct list_head *pages, unsigned page_count, dma_addr_t *dma_address)

     which would call the TTM DMA to search the internal list and find 'pages*'
     (which were just a microsecond ago allocated by calling ttm->be->func->get_pages)
     and stick the bus address on the 'dma_address' array.

 2). The radeon|nouveau driver would both call this if they decided to use the
     TTM DMA API. They would need to provide the newly allocated dma_address for this
     call.
 3). Not sure how to wrap this in macros though - it looks as if both drivers will
     be riddled with 'if (ttm->be->func->get_pages) { private->dma_addr=kzalloc(...) } else {}'.
     But that is more an implemention problem..

.. While this idea looks correct, I am struck that it looks like it is breaking the layering
of APIs, where the driver is reaching behind the TTM API and calling this extra function?

Another idea is to transform the 'struct dma_addr *dma_addr' to a 'void *override_p' in 
the 'struct ttm_tt'. That means still keeping the TTM API layers seperate, and "passing"
the array of DMA address through the 'override_p' array (which would be allocated by TTM DMA
code). Something along these lines (not tested):


I like this more, but I haven't actually tested it so not sure if it works right?

diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
index e0d4474..8760a04 100644
--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
+++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
@@ -23,7 +23,7 @@ struct nouveau_sgdma_be {
 static int
 nouveau_sgdma_populate(struct ttm_backend *be, unsigned long num_pages,
 		       struct page **pages, struct page *dummy_read_page,
-		       dma_addr_t *dma_addrs)
+		       void *override_p)
 {
 	struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
 	struct drm_device *dev = nvbe->dev;
@@ -43,9 +43,9 @@ nouveau_sgdma_populate(struct ttm_backend *be, unsigned long num_pages,
 
 	nvbe->nr_pages = 0;
 	while (num_pages--) {
-		if (dma_addrs[nvbe->nr_pages] != 0) {
-			nvbe->pages[nvbe->nr_pages] =
-					dma_addrs[nvbe->nr_pages];
+		dma_addr_t *ttm_dma = (dma_addr_t *)override_p;
+		if (ttm_dma && ttm_dma[nvbe->nr_pages] != 0) {
+			nvbe->pages[nvbe->nr_pages] = ttm_dma[nvbe->nr_pages];
 		 	nvbe->ttm_alloced[nvbe->nr_pages] = true;
 		} else {
 			nvbe->pages[nvbe->nr_pages] =
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index 068ba09..dc700f4 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -181,7 +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++) {
-		if (dma_addr[i] != 0) {
+		if (dma_addr && dma_addr[i] != 0) {
 			rdev->gart.ttm_alloced[p] = true;
 			rdev->gart.pages_addr[p] = dma_addr[i];
 		} else {
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 2e7419f..690545d 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -661,7 +661,7 @@ struct radeon_ttm_backend {
 	unsigned long			num_pages;
 	struct page			**pages;
 	struct page			*dummy_read_page;
-	dma_addr_t			*dma_addrs;
+	dma_addr_t			*dma_addrs; /* Can be NULL */
 	bool				populated;
 	bool				bound;
 	unsigned			offset;
@@ -671,13 +671,13 @@ static int radeon_ttm_backend_populate(struct ttm_backend *backend,
 				       unsigned long num_pages,
 				       struct page **pages,
 				       struct page *dummy_read_page,
-				       dma_addr_t *dma_addrs)
+				       void *override_p)
 {
 	struct radeon_ttm_backend *gtt;
 
 	gtt = container_of(backend, struct radeon_ttm_backend, backend);
 	gtt->pages = pages;
-	gtt->dma_addrs = dma_addrs;
+	gtt->dma_addrs = (dma_addr_t *)override_p;
 	gtt->num_pages = num_pages;
 	gtt->dummy_read_page = dummy_read_page;
 	gtt->populated = true;
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
index 360afb3..458727a 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
@@ -662,8 +662,7 @@ out:
 
 /* 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)
+			    int flags, enum ttm_caching_state cstate)
 {
 	unsigned long irq_flags;
 	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
@@ -707,8 +706,7 @@ static void __ttm_put_pages(struct list_head *pages, unsigned page_count,
  * cached pages.
  */
 static int __ttm_get_pages(struct list_head *pages, int flags,
-			   enum ttm_caching_state cstate, unsigned count,
-			   dma_addr_t *dma_address)
+			   enum ttm_caching_state cstate, unsigned count)
 {
 	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
 	struct page *p = NULL;
@@ -766,7 +764,7 @@ static 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);
 			return r;
 		}
 	}
@@ -859,19 +857,19 @@ int ttm_page_alloc_debugfs(struct seq_file *m, void *data)
 }
 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)
+		  unsigned count, int index)
 {
 	if (ttm->be && ttm->be->func && ttm->be->func->get_pages)
-		return ttm->be->func->get_pages(ttm, pages, count, dma_address);
+		return ttm->be->func->get_pages(ttm, pages, count, index);
 	return __ttm_get_pages(pages, ttm->page_flags, ttm->caching_state,
-				count, dma_address);
+				count);
 }
 void ttm_put_pages(struct ttm_tt *ttm, struct list_head *pages,
-		   unsigned page_count, dma_addr_t *dma_address)
+		   unsigned page_count, int index)
 {
 	if (ttm->be && ttm->be->func && ttm->be->func->put_pages)
-		ttm->be->func->put_pages(ttm, pages, page_count, dma_address);
+		ttm->be->func->put_pages(ttm, pages, page_count, index);
 	else
 		__ttm_put_pages(pages, page_count, ttm->page_flags,
-				ttm->caching_state, dma_address);
+				ttm->caching_state);
 }
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
index a5be62e..08e182f 100644
--- a/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc_dma.c
@@ -45,6 +45,7 @@
 #include <linux/atomic.h>
 #include <linux/device.h>
 #include <linux/kthread.h>
+#include <drm/drm_mem_util.h>
 #include "ttm/ttm_bo_driver.h"
 #include "ttm/ttm_page_alloc.h"
 #ifdef TTM_HAS_AGP
@@ -1097,7 +1098,7 @@ out:
  * 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)
+		      unsigned count, int idx)
 
 {
 	int r = -ENOMEM;
@@ -1105,6 +1106,11 @@ int ttm_dma_get_pages(struct ttm_tt *ttm, struct list_head *pages,
 	gfp_t gfp_flags;
 	enum pool_type type;
 	struct device *dev = ttm->be->dev;
+	dma_addr_t *dma_address;
+
+	/* We _MUST_ have a proper index value. */
+	if (WARN_ON(idx < 0));
+		return -EINVAL;
 
 	type = ttm_to_type(ttm->page_flags, ttm->caching_state);
 
@@ -1129,6 +1135,7 @@ int ttm_dma_get_pages(struct ttm_tt *ttm, struct list_head *pages,
 			cstate);
 	}
 #endif
+ 	dma_address = &((dma_addr_t *)ttm->override_p)[idx];
 	/* 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 */
@@ -1201,7 +1208,7 @@ static int ttm_dma_pool_get_num_unused_pages(void)
 
 /* 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)
+		       unsigned page_count, int idx)
 {
 	struct dma_pool *pool;
 	enum pool_type type;
@@ -1230,9 +1237,12 @@ void ttm_dma_put_pages(struct ttm_tt *ttm, struct list_head *pages,
 
 	count = ttm_dma_put_pages_in_pool(pool, pages, page_count, is_cached);
 
-	for (i = 0; i < count; i++)
-		dma_address[i] = 0;
-
+	/* Optional. */
+	if (idx >= 0) {
+ 		dma_addr_t *dma_address = &((dma_addr_t *)ttm->override_p)[idx];
+		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)
@@ -1386,11 +1396,27 @@ int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data)
 	return 0;
 }
 EXPORT_SYMBOL_GPL(ttm_dma_page_alloc_debugfs);
+
+static int ttm_dma_alloc_priv(struct ttm_tt *ttm)
+{
+	ttm->override_p = drm_calloc_large(ttm->num_pages, sizeof(dma_addr_t *));
+	if (WARN_ON(!ttm->override_p))
+		return -ENOMEM;
+	return 0;
+
+}
+static void ttm_dma_free_priv(struct ttm_tt *ttm)
+{
+	drm_free_large(ttm->override_p);
+	ttm->override_p = NULL;
+}
 bool ttm_dma_override(struct ttm_backend_func *be)
 {
 	if (swiotlb_nr_tbl() && be && !ttm_dma_disable) {
 		be->get_pages = &ttm_dma_get_pages;
 		be->put_pages = &ttm_dma_put_pages;
+		be->alloc_priv = &ttm_dma_alloc_priv;
+		be->free_priv = &ttm_dma_free_priv;
 		return true;
 	}
 	return false;
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index 31ae359..0f0d57f 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -50,16 +50,16 @@ static int ttm_tt_swapin(struct ttm_tt *ttm);
 static void ttm_tt_alloc_page_directory(struct ttm_tt *ttm)
 {
 	ttm->pages = drm_calloc_large(ttm->num_pages, sizeof(*ttm->pages));
-	ttm->dma_address = drm_calloc_large(ttm->num_pages,
-					    sizeof(*ttm->dma_address));
+	if (ttm->be && ttm->be->func && ttm->be->func->alloc_priv)
+		ttm->be->func->alloc_priv(ttm);
 }
 
 static void ttm_tt_free_page_directory(struct ttm_tt *ttm)
 {
 	drm_free_large(ttm->pages);
 	ttm->pages = NULL;
-	drm_free_large(ttm->dma_address);
-	ttm->dma_address = NULL;
+	if (ttm->be && ttm->be->func && ttm->be->func->free_priv)
+		ttm->be->func->free_priv(ttm);
 }
 
 static void ttm_tt_free_user_pages(struct ttm_tt *ttm)
@@ -110,7 +110,7 @@ static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index)
 
 		INIT_LIST_HEAD(&h);
 
-		ret = ttm_get_pages(ttm, &h, 1, &ttm->dma_address[index]);
+		ret = ttm_get_pages(ttm, &h, 1, index);
 
 		if (ret != 0)
 			return NULL;
@@ -169,7 +169,7 @@ int ttm_tt_populate(struct ttm_tt *ttm)
 	}
 
 	be->func->populate(be, ttm->num_pages, ttm->pages,
-			   ttm->dummy_read_page, ttm->dma_address);
+			   ttm->dummy_read_page, ttm->override_p);
 	ttm->state = tt_unbound;
 	return 0;
 }
@@ -303,7 +303,7 @@ static void ttm_tt_free_alloced_pages(struct ttm_tt *ttm, bool call_clear)
 			count++;
 		}
 	}
-	ttm_put_pages(ttm, &h, count, ttm->dma_address);
+	ttm_put_pages(ttm, &h, count, 0 /* start at zero and go up to count */);
 	ttm->state = tt_unpopulated;
 	ttm->first_himem_page = ttm->num_pages;
 	ttm->last_lomem_page = -1;
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index 1826c3b..771697a 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -58,7 +58,7 @@ struct ttm_backend_func {
 	int (*populate) (struct ttm_backend *backend,
 			 unsigned long num_pages, struct page **pages,
 			 struct page *dummy_read_page,
-			 dma_addr_t *dma_addrs);
+			 void *override_p);
 	/**
 	 * struct ttm_backend_func member clear
 	 *
@@ -109,10 +109,11 @@ struct ttm_backend_func {
 	 *
 	 * @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
+	 * @idx: The current index in ttm->pages[] array. Negative means
+	 * don't assume ttm->pages[idx] order matches the order in *pages.
 	 */
 	int (*get_pages) (struct ttm_tt *ttm, struct list_head *pages,
-			  unsigned count, dma_addr_t *dma_address);
+			  unsigned count, int idx);
 
 	/**
 	 * ttm_put_pages override. The backend can override the default
@@ -124,10 +125,17 @@ struct ttm_backend_func {
 	 * @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
+	 * @idx: The current index in the ttm->pages[] array. Negative means
+	 * don't assume ttm->pages[idx] order matches the order in *pages.
 	 */
 	void (*put_pages) (struct ttm_tt *ttm, struct list_head *pages,
-			   unsigned page_count, dma_addr_t *dma_address);
+			   unsigned page_count, int idx);
+
+	/**
+	 * TODO: Flesh this out.
+	 */
+	int (*alloc_priv) (struct ttm_tt *ttm);
+	void (*free_priv) (struct ttm_tt *ttm);
 };
 
 /**
@@ -207,7 +215,7 @@ struct ttm_tt {
 		tt_unbound,
 		tt_unpopulated,
 	} state;
-	dma_addr_t *dma_address;
+	void *override_p;
 };
 
 #define TTM_MEMTYPE_FLAG_FIXED         (1 << 0)	/* Fixed (on-card) PCI memory */
diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h
index daf5db6..31e6079 100644
--- a/include/drm/ttm/ttm_page_alloc.h
+++ b/include/drm/ttm/ttm_page_alloc.h
@@ -68,12 +68,12 @@ static inline int ttm_dma_page_alloc_debugfs(struct seq_file *m, void *data)
  * @ttm: ttm which contains flags for page allocation and caching state.
  * @pages: heado of empty linked list where pages are filled.
  * @count: number of pages to allocate.
- * @dma_address: The DMA (bus) address of pages - (by default zero).
+ * @idx: The current index in ttm->pages[idx]. Negative means ignore.
  */
 int ttm_get_pages(struct ttm_tt *ttm,
 		  struct list_head *pages,
 		  unsigned count,
-		  dma_addr_t *dma_address);
+		  int idx);
 /**
  * Put linked list of pages to pool.
  *
@@ -81,12 +81,12 @@ int ttm_get_pages(struct ttm_tt *ttm,
  * @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 (by default zero).
+ * @idx: The current index in ttm->pages[idx]. Negative means ignore.
  */
 void ttm_put_pages(struct ttm_tt *ttm,
 		   struct list_head *pages,
 		   unsigned page_count,
-		   dma_addr_t *dma_address);
+		   int idx);
 /**
  * Initialize pool allocator.
  */

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 11:07:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 11: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 1RIOw6-0003Bm-Jk; Mon, 24 Oct 2011 11:07:46 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIOv2-0002y7-89
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 11:06:40 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319479597!877548!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26582 invoked from network); 24 Oct 2011 18:06:37 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 18:06:37 -0000
X-IronPort-AV: E=Sophos;i="4.69,399,1315180800"; 
   d="scan'208";a="8557238"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 18:06: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; Mon, 24 Oct 2011 19:06:36 +0100
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 1RIOuy-00081x-0t;
	Mon, 24 Oct 2011 18:06:36 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIOuy-0008L0-0G;
	Mon, 24 Oct 2011 19:06:36 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9592-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 24 Oct 2011 19:06:36 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9592: 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 9592 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9592/

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-i386-i386-xl            15 guest-stop                   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-amd64-i386-xl-credit2    5 xen-boot                     fail    like 9233
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail    like 9205
 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-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-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-i386-xl-win-vcpus1  5 xen-boot                     fail   like 9205
 test-amd64-amd64-xl-win       5 xen-boot                     fail    like 9233
 test-i386-i386-xl-win         7 windows-install              fail   never pass

version targeted for testing:
 xen                  8aded64130a6
baseline version:
 xen                  f051e9973b79

------------------------------------------------------------
People who touched revisions under test:
------------------------------------------------------------

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=8aded64130a6
+ . 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 8aded64130a6
+ branch=xen-4.0-testing
+ revision=8aded64130a6
+ . 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 8aded64130a6 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 3 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 Mon Oct 24 11:19:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 11:19:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIP7D-0003tv-2y; Mon, 24 Oct 2011 11:19:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIP6M-0003h5-M9
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 11:18:23 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319480297!30472278!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32383 invoked from network); 24 Oct 2011 18:18:19 -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; 24 Oct 2011 18:18:19 -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
	p9OIIE9x008371
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 18:18:16 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
	p9OIIDtO006086
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 18:18:13 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
	p9OII7K8004247; Mon, 24 Oct 2011 13:18:07 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 11:18:07 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 380E582A24; Mon, 24 Oct 2011 14:18:06 -0400 (EDT)
Date: Mon, 24 Oct 2011 14:18:06 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Thomas Hellstrom <thomas@shipmail.org>
Message-ID: <20111024181806.GA4369@phenom.dumpdata.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>
	<20111024172728.GD2320@phenom.dumpdata.com>
	<4EA5A381.1050100@shipmail.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA5A381.1050100@shipmail.org>
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.4EA5ABE8.0146:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.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

> >For that there are couple of architectural issues I am not sure how to solve.
> >
> >There has to be some form of TTM<->[Radeon|Nouveau] lookup mechanism
> >to say: "here is a 'struct page *', give me the bus address". Currently
> >this is solved by keeping an array of DMA addresses along with the list
> >of pages. And passing the list and DMA address up the stack (and down)
> >from TTM up to the driver (when ttm->be->func->populate is called and they
> >are handed off) does it. It does not break any API layering .. and the internal
> >TTM pool (non-DMA) can just ignore the dma_address altogether (see patch above).
> >
> 
> I actually had something more simple in mind, but when tinking a bit
> deeper into it, it seems more complicated than I initially thought.
> 
> Namely that when we allocate pages from the ttm_backend, we actually
> populated it at the same time. be::populate would then not take a
> page array as an argument, and would actually be a no-op on many
> drivers.

The programming of the gfx's MMU.. would be done via a new API call?
I think this needs a bit of whiteboarding for me to be sure I understand you.
> 
> This makes us move towards struct ttm_tt consisting almost only of
> its backend, so that whole API should perhaps be looked at with new
> eyes.
> 
> So anyway, I'm fine with high level things as they are now, and the

Great!
> dma_addr issue can be looked at at a later time. If we could get a
> couple of extra eyes to review the code for style etc. would be

Anybody in particular you can recommend that I can pester^H^H^H^H politely
ask :-)

> great, because I have very little time the next couple of weeks.

<nods> Understood. 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 12:41:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 12:41:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIQOq-00071k-NU; Mon, 24 Oct 2011 12:41:33 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIQNq-0006p2-RR
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 12:40:31 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319485227!1507937!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5452 invoked from network); 24 Oct 2011 19:40:27 -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;
	24 Oct 2011 19:40:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,399,1315180800"; 
   d="scan'208";a="8558259"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 19:40: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, 24 Oct 2011 20:40:27 +0100
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 1RIQNm-00006h-IR;
	Mon, 24 Oct 2011 19:40:26 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIQNm-0003tN-7W;
	Mon, 24 Oct 2011 20:40:26 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9593-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 24 Oct 2011 20:40:26 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9593: 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 9593 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9593/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-i386-pair         20 leak-check/check/src_host  fail REGR. vs. 9355
 test-amd64-i386-pair         21 leak-check/check/dst_host  fail REGR. vs. 9355
 test-amd64-amd64-pair        21 leak-check/check/dst_host  fail REGR. vs. 9355
 test-amd64-i386-xl            7 debian-install             fail REGR. vs. 9355
 test-amd64-i386-xl-multivcpu  7 debian-install             fail REGR. vs. 9355
 test-amd64-i386-xl-credit2   12 guest-saverestore.2        fail REGR. vs. 9355
 test-amd64-i386-rhel6hvm-intel  7 redhat-install           fail REGR. vs. 9355
 test-i386-i386-win            7 windows-install            fail REGR. vs. 9355
 test-amd64-amd64-xl-win       7 windows-install            fail REGR. vs. 9355
 test-amd64-i386-win           7 windows-install            fail REGR. vs. 9355

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-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-amd64-amd64-win         16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  ffe861c1d5df
baseline version:
 xen                  6c583d35d76d

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  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                                           fail    
 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                                        broken  
 test-amd64-i386-pair                                         broken  
 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:   23992:ffe861c1d5df
tag:         tip
user:        Tim Deegan <tim@xen.org>
date:        Mon Oct 24 11:29:08 2011 +0100
    
    nestedhvm: handle l2 guest MMIO access
    
    Hyper-V starts a root domain which effectively an l2 guest.
    Hyper-V passes its devices through to the root domain and
    let it do the MMIO accesses. The emulation is done by
    Xen (host) and Hyper-V forwards the interrupts to the l2 guest.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Committed-by:  Tim Deegan <tim@xen.org>
    
    
changeset:   23991:a7ccbc79fc17
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:45:24 2011 +0200
    
    cpumask <=> xenctl_cpumap: allocate CPU masks and byte maps dynamically
    
    Generally there was a NR_CPUS-bits wide array in these functions and
    another (through a cpumask_t) on their callers' stacks, which may get
    a little large for big NR_CPUS. As the functions can fail anyway, do
    the allocation in there.
    
    For the x86/MCA case this require a little code restructuring: By using
    different CPU mask accessors it was possible to avoid allocating a mask
    in the broadcast case. Also, this was the only user that failed to
    check the return value of the conversion function (which could have led
    to undefined behvior).
    
    Also constify the input parameters of the two functions.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23990:1c8789852eaf
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:44:47 2011 +0200
    
    x86/hpet: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23989:8269826353d8
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:44:03 2011 +0200
    
    credit: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23988:53528bab2eb4
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:43:35 2011 +0200
    
    cpupools: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23987:2682094bc243
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:42:47 2011 +0200
    
    x86/p2m: allocate CPU masks dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Tim Deegan <tim@xen.org>
    Acked-by: Keir Fraser <keir@xen.org>
    
    --- 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);
     }
    
     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);
    
         if (old_flags & _PAGE_PRESENT)
    -        flush_tlb_mask(&p2m->p2m_dirty_cpumask);
    +        flush_tlb_mask(p2m->dirty_cpumask);
    
         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 = p2m_access_rwx;
    
         p2m->cr3 = CR3_EADDR;
    -    cpumask_clear(&p2m->p2m_dirty_cpumask);
    
         if ( hap_enabled(d) && (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) )
             ept_p2m_init(p2m);
    @@ -102,6 +101,8 @@ p2m_init_nestedp2m(struct domain *d)
             d->arch.nested_p2m[i] = p2m = xzalloc(struct p2m_domain);
             if (p2m == NULL)
                 return -ENOMEM;
    +        if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
    +            return -ENOMEM;
             p2m_initialise(d, p2m);
             p2m->write_p2m_entry = 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) = p2m = xzalloc(struct p2m_domain);
         if ( p2m == NULL )
             return -ENOMEM;
    +    if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
    +    {
    +        xfree(p2m);
    +        return -ENOMEM;
    +    }
         p2m_initialise(d, p2m);
    
         /* Must initialise nestedp2m unconditionally
    @@ -333,6 +339,9 @@ static void p2m_teardown_nestedp2m(struc
         uint8_t i;
    
         for (i = 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] = 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 = NULL;
    +    if ( d->arch.p2m )
    +    {
    +        free_cpumask_var(d->arch.p2m->dirty_cpumask);
    +        xfree(d->arch.p2m);
    +        d->arch.p2m = NULL;
    +    }
    
         /* We must teardown unconditionally because
          * we initialise them unconditionally.
    @@ -1200,7 +1213,7 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
                 if (p2m->cr3 == CR3_EADDR)
                     hvm_asid_flush_vcpu(v);
                 p2m->cr3 = 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 = cr3;
         nv->nv_flushp2m = 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);
    
    --- 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;
    
         struct domain     *domain;   /* back pointer to domain */
    
    
changeset:   23986:253073b522f8
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:23:05 2011 +0200
    
    allocate CPU sibling and core maps dynamically
    
    ... thus reducing the per-CPU data area size back to one page even when
    building for large NR_CPUS.
    
    At once eliminate the old __cpu{mask,list}_scnprintf() helpers.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23985:eef4641d6726
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:22:02 2011 +0200
    
    x86: allocate IRQ actions' cpu_eoi_map dynamically
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23984:07d303ff2757
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:21:09 2011 +0200
    
    eliminate direct assignments of CPU masks
    
    Use cpumask_copy() instead of direct variable assignments for copying
    CPU masks. While direct assignments are not a problem when both sides
    are variables actually defined as cpumask_t (except for possibly
    copying *much* more than would actually need to be copied), they must
    not happen when the original variable is of type cpumask_var_t (which
    may have lass space allocated to it than a full cpumask_t). Eliminate
    as many of such assignments as possible (in several cases it's even
    possible to collapse two operations [copy then clear one bit] into one
    [cpumask_andnot()]), and thus set the way for reducing the allocation
    size in alloc_cpumask_var().
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23983:1a4223c62ee7
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:19:44 2011 +0200
    
    eliminate cpumask accessors referencing NR_CPUS
    
    ... in favor of using the new, nr_cpumask_bits-based ones.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23982:511d5e65a302
user:        Jan Beulich <jbeulich@suse.com>
date:        Fri Oct 21 09:17:42 2011 +0200
    
    introduce and use nr_cpu_ids and nr_cpumask_bits
    
    The former is the runtime equivalent of NR_CPUS (and users of NR_CPUS,
    where necessary, get adjusted accordingly), while the latter is for the
    sole use of determining the allocation size when dynamically allocating
    CPU masks (done later in this series).
    
    Adjust accessors to use either of the two to bound their bitmap
    operations - which one gets used depends on whether accessing the bits
    in the gap between nr_cpu_ids and nr_cpumask_bits is benign but more
    efficient.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23981:6c583d35d76d
user:        Tim Deegan <tim@xen.org>
date:        Thu Oct 20 15:36:01 2011 +0100
    
    x86/mm/p2m: don't leak state if nested-p2m init fails.
    
    Signed-off-by: Tim Deegan <tim@xen.org>
    
    
========================================
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 Mon Oct 24 13:54:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 13:54:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIRXH-00017O-C3; Mon, 24 Oct 2011 13:54:19 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIRU1-0000I5-4b
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 13:50:58 -0700
X-Env-Sender: Wei.Huang2@amd.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1319489452!1485301!1
X-Originating-IP: [216.32.181.186]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27277 invoked from network); 24 Oct 2011 20:50:53 -0000
Received: from ch1ehsobe006.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.186)
	by server-13.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	24 Oct 2011 20:50:53 -0000
Received: from mail65-ch1-R.bigfish.com (10.43.68.254) by
	CH1EHSOBE005.bigfish.com (10.43.70.55) with Microsoft SMTP Server id
	14.1.225.22; Mon, 24 Oct 2011 20:50:47 +0000
Received: from mail65-ch1 (localhost.localdomain [127.0.0.1])	by
	mail65-ch1-R.bigfish.com (Postfix) with ESMTP id C3B0A1AE8466	for
	<xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 20:50:49 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzc85dhzz1202hzz8275bhz32i668h839h34h)
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,13,
Received: from mail65-ch1 (localhost.localdomain [127.0.0.1]) by mail65-ch1
	(MessageSwitch) id 1319489447847756_30985;
	Mon, 24 Oct 2011 20:50:47 +0000 (UTC)
Received: from CH1EHSMHS017.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.244])	by mail65-ch1.bigfish.com (Postfix) with ESMTP id
	BCF4240053 for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 20:50:47 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	CH1EHSMHS017.bigfish.com (10.43.70.17) with Microsoft SMTP Server id
	14.1.225.22; Mon, 24 Oct 2011 20:50:50 +0000
X-WSS-ID: 0LTL8KJ-02-D9J-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 2620CC8251	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 15:50:43 -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;
	Mon, 24 Oct 2011 15:50:52 -0500
Received: from [10.236.48.186] (10.236.48.186) by sausexhtp02.amd.com
	(163.181.3.152) with Microsoft SMTP Server id 8.3.83.0; Mon, 24 Oct 2011
	15:50:46 -0500
Message-ID: <4EA5CFA6.2030808@amd.com>
Date: Mon, 24 Oct 2011 15:50:46 -0500
From: Wei Huang <wei.huang2@amd.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.14) Gecko/20110223 Thunderbird/3.1.8
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Content-Type: multipart/mixed; boundary="------------010000080500090802080601"
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [Xen-4.0][PATCH] xsave: move xsave initialization code
 to a common place
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------010000080500090802080601
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit

Please apply this patch to xen-4.0 tree.


This patch moves xsave option setting and initilization to CPU common
file. Without this Xen would crash on __context_switch() on xsave-capable
AMD CPUs. The crash was due to cpu_has_xsave reports true in domain.c
while xsave space wasn't initialized. This patch is adopted from xen
upstream.

Signed-off-by: Wei Huang <wei.huang2@amd.com>



--------------010000080500090802080601
Content-Type: text/plain; name="xen-4-xsave-init-code-path.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="xen-4-xsave-init-code-path.txt"
Content-Description: xen-4-xsave-init-code-path.txt

# HG changeset patch
# User Wei Huang <wei.huang2@amd.com>
# Date 1319469115 18000
# Branch patches
# Node ID c863dbcd714987ca8f1ab93ffbf61ea64b394f23
# Parent  71b96c0b083f3de46f566a406e0aee16a427950f
xsave: Move xsave initialization code to a common place

This patch moves xsave option setting and initilization to CPU common
file. Without this Xen would crash on __context_switch() on xsave-capable
AMD CPUs. The crash was due to cpu_has_xsave reports true in domain.c
while xsave space wasn't initialized. This patch is adopted from xen
upstream.

Signed-off-by: Wei Huang <wei.huang2@amd.com>

diff -r 71b96c0b083f -r c863dbcd7149 xen/arch/x86/cpu/common.c
--- a/xen/arch/x86/cpu/common.c	Mon Oct 24 10:04:25 2011 -0500
+++ b/xen/arch/x86/cpu/common.c	Mon Oct 24 10:11:55 2011 -0500
@@ -22,6 +22,9 @@
 static int disable_x86_fxsr __cpuinitdata;
 static int disable_x86_serial_nr __cpuinitdata;
 
+static int use_xsave;
+boolean_param("xsave", use_xsave);
+
 struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {};
 
 /*
@@ -391,6 +394,13 @@
 	if (this_cpu->c_init)
 		this_cpu->c_init(c);
 
+        /* Initialize xsave/xrstor features */
+	if ( !use_xsave )
+		clear_bit(X86_FEATURE_XSAVE, boot_cpu_data.x86_capability);
+
+	if ( cpu_has_xsave )
+		xsave_init();
+
 	/* Disable the PN if appropriate */
 	squash_the_stupid_serial_number(c);
 
diff -r 71b96c0b083f -r c863dbcd7149 xen/arch/x86/cpu/intel.c
--- a/xen/arch/x86/cpu/intel.c	Mon Oct 24 10:04:25 2011 -0500
+++ b/xen/arch/x86/cpu/intel.c	Mon Oct 24 10:11:55 2011 -0500
@@ -30,9 +30,6 @@
 integer_param("cpuid_mask_ecx", opt_cpuid_mask_ecx);
 integer_param("cpuid_mask_edx", opt_cpuid_mask_edx);
 
-static int use_xsave;
-boolean_param("xsave", use_xsave);
-
 #ifdef CONFIG_X86_INTEL_USERCOPY
 /*
  * Alignment at which movsl is preferred for bulk memory copies.
@@ -219,12 +216,6 @@
 		set_bit(X86_FEATURE_ARAT, c->x86_capability);
 
 	start_vmx();
-
-	if ( !use_xsave )
-		clear_bit(X86_FEATURE_XSAVE, boot_cpu_data.x86_capability);
-
-	if ( cpu_has_xsave )
-		xsave_init();
 }
 
 

--------------010000080500090802080601
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

--------------010000080500090802080601--


From xen-devel-bounces@lists.xensource.com Mon Oct 24 14:35:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 14:35:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISBZ-0002o8-Do; Mon, 24 Oct 2011 14:35:57 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIS9X-0002EM-92
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 14:33:52 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319492026!899771!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6052 invoked from network); 24 Oct 2011 21:33:47 -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; 24 Oct 2011 21:33: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
	p9OLXhES025648
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 21:33:45 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
	p9OLXhYM013392
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 21:33:43 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
	p9OLXbbx030240; Mon, 24 Oct 2011 16:33:38 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 14:33:37 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 510B482A8E; Mon, 24 Oct 2011 15:52:16 -0400 (EDT)
Date: Mon, 24 Oct 2011 15:52:16 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: =?iso-8859-1?Q?P=C1SZTOR_Gy=F6rgy?= <pasztor@sagv5.gyakg.u-szeged.hu>
Subject: Re: [Xen-devel] [FWD] [Xen-users] Jumbo frame support for Xen
Message-ID: <20111024195216.GB2441@phenom.dumpdata.com>
References: <20111013100058.GF11846@linux.gyakg.u-szeged.hu>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111013100058.GF11846@linux.gyakg.u-szeged.hu>
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.0A090207.4EA5D9B9.00FE:SCFMA922111,ss=1,re=-4.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, Oct 13, 2011 at 12:00:58PM +0200, P=C1SZTOR Gy=F6rgy wrote:
> Hi,
>=20
> I just got some hint, to forward my original mail to this list too.

The patch looks OK, except that it does not check for the cases where the
mtu is not set.

Would you be up for respinning the patch with that check and also include
your Signed-off-by?

>=20
> Cheers,
> ----- Forwarded message from P=C1SZTOR Gy=F6rgy <pasztor@linux.gyakg.u-=
szeged.hu> -----
>=20
> Hi,
>=20
> I had to use bridge interfaces with mtu other than 9000, so I started t=
o
> google for a solution. Then I found this thread:
> http://web.archiveorange.com/archive/v/ZvO4j2ymSAvyo8GNrwhY
>=20
> But, It didn't work, as the original author says.
> I tried to find an easier way, to setup this, so as I found out: If you
> configure a vif's mtu, the logical solution is to use the same mtu as t=
he
> bridge interface -> So I wrote a smaller, nicer, and... a working patch=
.
>=20
> The "trick" is that, I don't use the xen's bridge creation scripts, I
> preconfigure my bridge interfaces from my Debian configuration, far bef=
ore
> the xen things would start.
> bridge entry from my /etc/network/interfaces:
> auto br201
> iface br201 inet static
> 	address 10.0.3.5
> 	netmask 255.255.0.0
> 	network 10.0.0.0
> 	broadcast 10.0.255.255
> 	mtu 9000
> 	bridge_ports bond0.201
> 	bridge_fd 0
> 	bridge_maxwait 0
>=20
> This iface config pre-creates the vlan if on my bonding if, creates the
> bridge, add the bond.vlan into my bridge interface, and every mtu is OK=
,
> until xen starts...
> Then, with my patched xen scripts,... work again, still, whatever you w=
ant:
> It's just work! ;-)
>=20
> Use it wise, and for your own risk!
>=20
> The patch:
>=20
> diff -urN /etc/xen/scripts.orig/vif-bridge /etc/xen/scripts/vif-bridge
> --- /etc/xen/scripts.orig/vif-bridge	2011-04-14 15:24:51.000000000 +020=
0
> +++ /etc/xen/scripts/vif-bridge	2011-10-12 18:13:13.873102049 +0200
> @@ -82,6 +82,7 @@
>  case "$command" in
>      online)
>  	setup_bridge_port "$vif"
> +	set_vif_mtu "$vif" "$(get_if_mtu $bridge)"
>  	add_to_bridge "$bridge" "$vif"
>          ;;
> =20
> diff -urN /etc/xen/scripts.orig/xen-network-common.sh /etc/xen/scripts/=
xen-network-common.sh
> --- /etc/xen/scripts.orig/xen-network-common.sh	2010-06-21 15:46:02.000=
000000 +0200
> +++ /etc/xen/scripts/xen-network-common.sh	2011-10-12 18:07:00.45690941=
0 +0200
> @@ -116,3 +116,19 @@
>      ip link set ${dev} up
>  }
> =20
> +get_if_mtu () {
> +    local dev=3D$1
> +    local line
> +    ip link show $dev | \
> +	( read line
> +	line=3D"${line##*mtu }"
> +	line=3D"${line%% *}"
> +	echo $line
> +	cat >/dev/null )
> +}
> +
> +set_vif_mtu () {
> +    local vif=3D$1
> +    local mtu=3D$2
> +    ip link set "$vif" mtu "$mtu"
> +}
>=20
> Cheers!
>=20
>=20
> _______________________________________________
> Xen-users mailing list
> Xen-users@lists.xensource.com
> http://lists.xensource.com/xen-users
>=20
> ----- End forwarded message -----


> _______________________________________________
> 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 Oct 24 14:36:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 14:36:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISCL-0003BL-N7; Mon, 24 Oct 2011 14:36:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIS9Z-0002Eu-7b
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 14:33:54 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1319491999!43242454!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23873 invoked from network); 24 Oct 2011 21:33:20 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 21:33:20 -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
	p9OLXiKH025667
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 21:33:45 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
	p9OLXhAb000604
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 21:33:43 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
	p9OLXbai010861; Mon, 24 Oct 2011 16:33:37 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 14:33:37 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id C60E782A94; Mon, 24 Oct 2011 17:14:51 -0400 (EDT)
Date: Mon, 24 Oct 2011 17:14:51 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Fantu <fantonifabio@tiscali.it>
Subject: Re: [Xen-devel] Re: Out sw-iommu space problem
Message-ID: <20111024211451.GG2441@phenom.dumpdata.com>
References: <1316011454156-4803078.post@n5.nabble.com>
	<20110914145403.GA17899@phenom.oracle.com>
	<1316097409687-4807062.post@n5.nabble.com>
	<20110915145840.GA20726@phenom.oracle.com>
	<1316105794010-4807540.post@n5.nabble.com>
	<1316210553.26990.24.camel@cthulhu.hellion.org.uk>
	<1319110129307-4921154.post@n5.nabble.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319110129307-4921154.post@n5.nabble.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.0A090207.4EA5D9BB.0022,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, Oct 20, 2011 at 04:28:49AM -0700, Fantu wrote:
> After setting swiotlb=65762 on vmlinuz (from 64 mb to 128 mb) problem solved.

OK. I am not sure why your driver is using that much space, but that is 
the purpose of the argument.

> Is swiotlb set on vmlinux bugged? At this time on 2.6.32 pv_ops, in order to
> set size in MB requires this calculation: swiotlb=N where N/1024*2=MB

That is correct. It is correct for any kernel since 2.6.18 I believe. Unless
the swiotlb in the Xen old-style was doing something different.

> 
> --
> View this message in context: http://xen.1045712.n5.nabble.com/Out-sw-iommu-space-problem-tp4803078p4921154.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

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 14:39:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 14: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 1RISEl-0004ML-5t; Mon, 24 Oct 2011 14:39:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIS9j-0002H1-KX
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 14:34:04 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1319492039!606950!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9487 invoked from network); 24 Oct 2011 21:34:00 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-6.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 21:34:00 -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
	p9OLXptH025793
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 21:33:53 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
	p9OLXn1v013509
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 21:33:49 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
	p9OLXbYH031282; Mon, 24 Oct 2011 16:33:37 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 14:33:37 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 7E2B382A8D; Mon, 24 Oct 2011 16:22:42 -0400 (EDT)
Date: Mon, 24 Oct 2011 16:22:42 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Message-ID: <20111024202242.GD2441@phenom.dumpdata.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-2-git-send-email-dgdegra@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318971851-12809-2-git-send-email-dgdegra@tycho.nsa.gov>
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.0A090207.4EA5D9C2.00C5:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Ian.Jackson@eu.citrix.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	keir@xen.org
Subject: [Xen-devel] Re: [PATCH 1/2] xen/event: Add reference counting to
	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

On Tue, Oct 18, 2011 at 05:04:10PM -0400, Daniel De Graaf wrote:
> Event channels exposed to userspace by the evtchn module may be used by
> other modules in an asynchronous manner, which requires that reference
> counting be used to prevent the event channel from being closed before
> the signals are delivered.

You should probably also remove the comment in "xen_bind_pirq_gsi_to_irq"
which talks about refcount (as the comment would now apply to this code and
might confuse people reading the code).

There are two scenarios I am concerned about:

 1). Xen pciback allocates/setups an physical IRQ on behalf of a guest. Lets
     concentrate on MSI as that is more interesting. The PV guests sends
     XEN_PCI_OP_enable_msi, dom0 calls pci_enable_msi(), MSI libs end up calling
     xen_initdom_setup_msi_irqs, which calls xen_bind_pirq_msi_to_irq and 
     irq->refcnt==2.

     Guest dies without calling XEN_PCI_OP_disable_msi, so we end up in
     xen_pcibk_reset_device which calls pci_disable_msi().. which calls xen_free_irq().
     And all of that sets refcnt==1.. OK, and if we do call xen_pcibk_reset_device()
     again it is smart enough _not_ to call pci_disable_msi() twice.

     So I guess that case is actually OK, but if there was a driver that decided to
     call pci_disable_msi (or pci_disable_irq) we could hit the BUG_ON(). Perhaps
     that should be altered to WARN_ON.

 2). Grantdev holding the refcnt forever. That is probably the easiest as it would
     be a bug in the code.

Hmm, I  think I've talked myself out of actually finding any cases where this would
be problematic from a design perspective. The only issue I can see is exposing bugs
in the users of event channel API - which there might be. So definitly needs some
heavy duty testing.

> 
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
>  drivers/xen/events.c |   34 ++++++++++++++++++++++++++++++++++
>  include/xen/events.h |    6 ++++++
>  2 files changed, 40 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/xen/events.c b/drivers/xen/events.c
> index 7523719..36d3390 100644
> --- a/drivers/xen/events.c
> +++ b/drivers/xen/events.c
> @@ -88,6 +88,7 @@ enum xen_irq_type {
>  struct irq_info
>  {
>  	struct list_head list;
> +	atomic_t refcount;

refcnt

>  	enum xen_irq_type type;	/* type */
>  	unsigned irq;
>  	unsigned short evtchn;	/* event channel */
> @@ -407,6 +408,7 @@ static void xen_irq_init(unsigned irq)
>  		panic("Unable to allocate metadata for IRQ%d\n", irq);
>  
>  	info->type = IRQT_UNBOUND;
> +	atomic_set(&info->refcount, 1);
>  
>  	irq_set_handler_data(irq, info);
>  
> @@ -469,6 +471,8 @@ static void xen_free_irq(unsigned irq)
>  
>  	irq_set_handler_data(irq, NULL);
>  
> +	BUG_ON(atomic_read(&info->refcount) > 1);
> +
>  	kfree(info);
>  
>  	/* Legacy IRQ descriptors are managed by the arch. */
> @@ -912,6 +916,10 @@ static void unbind_from_irq(unsigned int irq)
>  {
>  	struct evtchn_close close;
>  	int evtchn = evtchn_from_irq(irq);
> +	struct irq_info *info = irq_get_handler_data(irq);
> +
> +	if (!atomic_dec_and_test(&info->refcount))
> +		return;
>  
>  	mutex_lock(&irq_mapping_update_lock);
>  
> @@ -1038,6 +1046,32 @@ void unbind_from_irqhandler(unsigned int irq, void *dev_id)
>  }
>  EXPORT_SYMBOL_GPL(unbind_from_irqhandler);
>  
> +int evtchn_get(unsigned int evtchn)
> +{
> +	int irq = evtchn_to_irq[evtchn];
> +	struct irq_info *info;
> +
> +	if (irq == -1)
> +		return -ENOENT;
> +
> +	info = irq_get_handler_data(irq);
> +
> +	if (!info)
> +		return -ENOENT;
> +
> +	atomic_inc(&info->refcount);
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(evtchn_get);
> +
> +void evtchn_put(unsigned int evtchn)

The decleration for 'evtchn' is 'unsigned short' so that can be
used instead of 'unsigned int'.

> +{
> +	int irq = evtchn_to_irq[evtchn];

Not checking if the irq is valid? Or if the evtchn is valid?

> +	unbind_from_irq(irq);
> +}
> +EXPORT_SYMBOL_GPL(evtchn_put);
> +
>  void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector)
>  {
>  	int irq = per_cpu(ipi_to_irq, cpu)[vector];
> diff --git a/include/xen/events.h b/include/xen/events.h
> index d287997..a459cca 100644
> --- a/include/xen/events.h
> +++ b/include/xen/events.h
> @@ -37,6 +37,12 @@ int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain,
>   */
>  void unbind_from_irqhandler(unsigned int irq, void *dev_id);
>  
> +/*
> + * Allow extra references to event channels exposed to userspace by evtchn
> + */
> +int evtchn_get(unsigned int evtchn);
> +void evtchn_put(unsigned int evtchn);
> +
>  void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector);
>  int resend_irq_on_evtchn(unsigned int irq);
>  void rebind_evtchn_irq(int evtchn, int irq);
> -- 
> 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 Oct 24 14:40:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 14:40:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISGL-0004kF-Nx; Mon, 24 Oct 2011 14:40:54 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIS9j-0002H2-Nc
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 14:34:04 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1319492039!32835436!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5118 invoked from network); 24 Oct 2011 21:34:00 -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; 24 Oct 2011 21:34:00 -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
	p9OLXpt3025792
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 21:33:53 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
	p9OLXmv3013503
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 21:33:49 GMT
Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9OLXbh8030236; Mon, 24 Oct 2011 16:33:37 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 14:33:36 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id E153582A93; Mon, 24 Oct 2011 16:57:08 -0400 (EDT)
Date: Mon, 24 Oct 2011 16:57:08 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Message-ID: <20111024205708.GE2441@phenom.dumpdata.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
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.0A090207.4EA5D9C2.00C4:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Ian.Jackson@eu.citrix.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	keir@xen.org
Subject: [Xen-devel] Re: [PATCH 2/2] xen/gnt{dev,
	alloc}: reserve event channels for notify
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, Oct 18, 2011 at 05:04:11PM -0400, Daniel De Graaf wrote:
> When using the unmap notify ioctl, the event channel used for
> notification needs to be reserved to avoid it being deallocated prior to
> sending the notification.
> 
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
>  drivers/xen/gntalloc.c |   14 +++++++++++++-
>  drivers/xen/gntdev.c   |   11 +++++++++++
>  2 files changed, 24 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
> index f6832f4..a739fb1 100644
> --- a/drivers/xen/gntalloc.c
> +++ b/drivers/xen/gntalloc.c
> @@ -178,8 +178,10 @@ static void __del_gref(struct gntalloc_gref *gref)
>  		tmp[gref->notify.pgoff] = 0;
>  		kunmap(gref->page);
>  	}
> -	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
>  		notify_remote_via_evtchn(gref->notify.event);
> +		evtchn_put(gref->notify.event);

So.. I could have some fun by doing this in the userspace:
  for (j = 0; j< 2;j++) {
      for (i = 0; i < 65534; i++) {
         struct ioctl_gntalloc_unmap_notify uarg = {
                 .index = arg.index + offsetof(struct shr_page, notifies[0]),
                 .action =UNMAP_NOTIFY_SEND_EVENT,
		 .event_channel_port = i,
         };
         rv = ioctl(a_fd, IOCTL_GNTALLOC_SET_UNMAP_NOTIFY, &uarg);
	}
  }

And cause the event channel refcnt to be set to zero and free it. And then
causing the box to die - as the event channels for the physical IRQ might have
gotten free-ed.


Hm.. Perhaps the gntalloc and gntdev should keep track of which event channels
are OK to refcnt? Something like a whitelist? Granted at that point the refcounting
could as well be done by the API that sets up the event channels from the userspace.

So the evtchn_ioctl is pretty smart. It uses "get_port_user" to get the list
of events that belong to this user (and have been handed out). I think you
need to use that in the gntalloc to double-check that the event channel is not
one of the kernel type.

> +	}
>  
>  	gref->notify.flags = 0;
>  
> @@ -396,6 +398,16 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
>  		goto unlock_out;
>  	}
>  
> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
> +		if (evtchn_get(op.event_channel_port)) {
> +			rc = -EINVAL;
> +			goto unlock_out;
> +		}
> +	}
> +
> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
> +		evtchn_put(gref->notify.event);
> +
>  	gref->notify.flags = op.action;
>  	gref->notify.pgoff = pgoff;
>  	gref->notify.event = op.event_channel_port;
> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
> index f914b26..cfcc890 100644
> --- a/drivers/xen/gntdev.c
> +++ b/drivers/xen/gntdev.c
> @@ -190,6 +190,7 @@ static void gntdev_put_map(struct grant_map *map)
>  
>  	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
>  		notify_remote_via_evtchn(map->notify.event);
> +		evtchn_put(map->notify.event);
>  	}
>  
>  	if (map->pages) {
> @@ -596,6 +597,16 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
>  		goto unlock_out;
>  	}
>  
> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
> +		if (evtchn_get(op.event_channel_port)) {
> +			rc = -EINVAL;
> +			goto unlock_out;
> +		}
> +	}
> +
> +	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT)

So notify.flags has not been set yet? That looks to be done later?

Or is this in case of the user doing

 uargs.action = UNMAP_NOTIFY_SEND_EVENT;
 ioctl(.., IOCTL_GNTALLOC_SET_UNMAP_NOTIFY, &uarg);
 uargs.action = UNAMP_NOTIFY_CLEAR_BYTE;
 ioctl(.., IOCTL_GNTALLOC_SET_UNMAP_NOTIFY, &uarg);

 and we want to preserve the "old" flags before swapping over to the
new?

> +		evtchn_put(map->notify.event);
> +
>  	map->notify.flags = op.action;
>  	map->notify.addr = op.index - (map->index << PAGE_SHIFT);
>  	map->notify.event = op.event_channel_port;
> -- 
> 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 Oct 24 14:42:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 14:42:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISHe-00058W-Vm; Mon, 24 Oct 2011 14:42:14 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RISGS-0004lp-Cf
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 14:41:00 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1319492455!618388!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15135 invoked from network); 24 Oct 2011 21:40:57 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-2.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 21:40: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
	p9OLeqCM005413
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 21:40:54 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
	p9OLepja010867
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 21:40:52 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
	p9OLejcX015645; Mon, 24 Oct 2011 16:40:46 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 14:40:45 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id BD96482A88; Mon, 24 Oct 2011 17:40:44 -0400 (EDT)
Date: Mon, 24 Oct 2011 17:40:44 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for
	comms
Message-ID: <20111024214044.GJ2441@phenom.dumpdata.com>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319015064.3385.80.camel@zakaz.uk.xensource.com>
	<4E9EE659.8090600@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9EE659.8090600@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.0A090207.4EA5DB66.00EE,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.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

> (Will move to commit message). In PV guests, it is sufficient to only
> reserve kernel address space for grant mappings because Xen modifies the
> mappings directly. HVM guests require that Xen modify the GFN-to-MFN
> mapping, so the pages being remapped must already be allocated. Pages

By allocated you mean the populate_physmap hypercall must happen before
the grant operations are done?

(When I see allocated I think alloc_page, which I believe is _not_ what
you were saying).

> obtained from alloc_xenballooned_pages have valid GFNs not currently
> mapped to an MFN, so are available to be used in grant mappings.
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 14:48:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 14:48:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISNQ-0005i0-VA; Mon, 24 Oct 2011 14:48:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RISMj-0005PE-Pl
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 14:47:30 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319492834!52348124!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21991 invoked from network); 24 Oct 2011 21:47:15 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-15.tower-27.messagelabs.com with SMTP;
	24 Oct 2011 21:47:15 -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
	p9OLlNDg018828; Mon, 24 Oct 2011 21:47:23 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 p9OLlNvB013708; 
	Mon, 24 Oct 2011 17:47:23 -0400
Message-ID: <4EA5DCFC.1020400@tycho.nsa.gov>
Date: Mon, 24 Oct 2011 17:47:40 -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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for
	comms
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319015064.3385.80.camel@zakaz.uk.xensource.com>
	<4E9EE659.8090600@tycho.nsa.gov>
	<20111024214044.GJ2441@phenom.dumpdata.com>
In-Reply-To: <20111024214044.GJ2441@phenom.dumpdata.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 Campbell <Ian.Campbell@citrix.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 10/24/2011 05:40 PM, Konrad Rzeszutek Wilk wrote:
>> (Will move to commit message). In PV guests, it is sufficient to only
>> reserve kernel address space for grant mappings because Xen modifies the
>> mappings directly. HVM guests require that Xen modify the GFN-to-MFN
>> mapping, so the pages being remapped must already be allocated. Pages
> 
> By allocated you mean the populate_physmap hypercall must happen before
> the grant operations are done?
> 
> (When I see allocated I think alloc_page, which I believe is _not_ what
> you were saying).

The pages must be valid kernel pages (with GFNs) which are actually obtained
with alloc_page if the balloon doesn't have any sitting around for us. They
must also *not* be populated in the physmap, which is why we grab them from
the balloon and not from alloc_page directly.

> 
>> obtained from alloc_xenballooned_pages have valid GFNs not currently
>> mapped to an MFN, so are available to be used in grant mappings.
>>
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 14:54:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 14:54:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIST5-0006sf-Cb; Mon, 24 Oct 2011 14:54:03 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RISQt-00068Q-Ak
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 14:51:48 -0700
X-Env-Sender: Wei.Huang2@amd.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319493103!2249262!1
X-Originating-IP: [65.55.88.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31669 invoked from network); 24 Oct 2011 21:51:44 -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;
	24 Oct 2011 21:51:44 -0000
Received: from mail42-tx2-R.bigfish.com (10.9.14.237) by
	TX2EHSOBE006.bigfish.com (10.9.40.26) with Microsoft SMTP Server id
	14.1.225.22; Mon, 24 Oct 2011 21:51:38 +0000
Received: from mail42-tx2 (localhost.localdomain [127.0.0.1])	by
	mail42-tx2-R.bigfish.com (Postfix) with ESMTP id ADE52C80360;
	Mon, 24 Oct 2011 21:51:40 +0000 (UTC)
X-SpamScore: -23
X-BigFish: VPS-23(zzbb2dK9371K542M1432N98dK4015Lzz1202hzz8275bhz32i668h839h61h)
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 mail42-tx2 (localhost.localdomain [127.0.0.1]) by mail42-tx2
	(MessageSwitch) id 1319493100196227_14884;
	Mon, 24 Oct 2011 21:51:40 +0000 (UTC)
Received: from TX2EHSMHS014.bigfish.com (unknown [10.9.14.251])	by
	mail42-tx2.bigfish.com (Postfix) with ESMTP id 1EFC07004E;
	Mon, 24 Oct 2011 21:51:40 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS014.bigfish.com (10.9.99.114) with Microsoft SMTP Server id
	14.1.225.22; Mon, 24 Oct 2011 21:51:38 +0000
X-WSS-ID: 0LTLBE0-02-H4Y-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 2E83AC8249;	Mon, 24 Oct 2011 16:51:36 -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;
	Mon, 24 Oct 2011 16:51:45 -0500
Received: from [10.236.48.186] (10.236.48.186) by sausexhtp01.amd.com
	(163.181.3.165) with Microsoft SMTP Server id 8.3.83.0; Mon, 24 Oct 2011
	16:51:39 -0500
Message-ID: <4EA5DDEB.90308@amd.com>
Date: Mon, 24 Oct 2011 16:51:39 -0500
From: Wei Huang <wei.huang2@amd.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.2.14) Gecko/20110223 Thunderbird/3.1.8
MIME-Version: 1.0
To: Sander Eikelenboom <linux@eikelenboom.it>
Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
References: <1904679511.20111018205519@eikelenboom.it>
	<20111019160801.GA22918@phenom.dumpdata.com>
	<EE335F95F28A664DB4A21289D2AA053B01E6CBBBDB@SAUSEXMBP01.amd.com>
	<707354928.20111019193003@eikelenboom.it>
	<EE335F95F28A664DB4A21289D2AA053B01E6CBBD30@SAUSEXMBP01.amd.com>
	<884563847.20111022165748@eikelenboom.it>
In-Reply-To: <884563847.20111022165748@eikelenboom.it>
Content-Type: text/plain; charset="ISO-8859-15"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Rzeszutek Wilk <konrad.wilk@oracle.com>, Konrad
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Yes, it is for xen-4.1-testing tree. I just applied it to the latest tip (23174:d4253bc5418b). There were some hunks; but it worked in general. Could you try it and replace your xen.gz file with the new version?

(Stripping trailing CRs from patch.)
patching file arch/x86/io_apic.c
Hunk #1 succeeded at 548 (offset -21 lines).
(Stripping trailing CRs from patch.)
patching file arch/x86/irq.c
Hunk #5 succeeded at 192 (offset 1 line).
Hunk #6 succeeded at 225 (offset 1 line).
Hunk #7 succeeded at 236 (offset 1 line).
Hunk #8 succeeded at 302 (offset 1 line).
Hunk #9 succeeded at 372 (offset 1 line).
Hunk #10 succeeded at 425 (offset 1 line).
Hunk #11 succeeded at 440 (offset 1 line).
Hunk #12 succeeded at 476 (offset 1 line).
Hunk #13 succeeded at 497 (offset 1 line).
Hunk #14 succeeded at 1599 (offset -11 lines).
Hunk #15 succeeded at 1647 (offset -11 lines).
(Stripping trailing CRs from patch.)
patching file drivers/passthrough/amd/pci_amd_iommu.c
(Stripping trailing CRs from patch.)
patching file include/asm-x86/irq.h
(Stripping trailing CRs from patch.)
patching file include/xen/pci.h



-Wei
On 10/22/2011 09:57 AM, Sander Eikelenboom wrote:
> Hello Wei,
>
> Is this for xen 4.1.2 ?
> All hunks of the patch seem to be rejected.
>
> --
> Sander
>
>
> Wednesday, October 19, 2011, 8:27:55 PM, you wrote:
>
>> This reminds me of 23768:09595fdf3638, which reverted WeiWang's patch of forcing perdev-intremap as default. Could you try the attached patch on your Xen 4.1 tree and test with patched xen.gz?
>
>> Thanks,
>> -Wei
>
>> -----Original Message-----
>> From: xen-devel-bounces@lists.xensource.com [mailto:xen-devel-bounces@lists.xensource.com] On Behalf Of Sander Eikelenboom
>> Sent: Wednesday, October 19, 2011 12:30 PM
>> To: Huang2, Wei
>> Cc: xen-devel@lists.xensource.com; Konrad Rzeszutek Wilk
>> Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
>
>> Hello Wei,
>
>> Result is that using only "1" or "1" in combination with "2" always result in SATA I/O errors, so that doesn't boot.
>
>> Haven't tried rebooting a lot of times without iommu yet.
>> (the reason i bought the 890fx board in the first place)
>> Will try that a few times when i have some more time.
>
>> --
>> Sander
>
>> Wednesday, October 19, 2011, 6:38:38 PM, you wrote:
>
>>> It looks similar.
>
>>> Hi Sander, could you please test your system with the following options?
>
>>> 1. iommu=amd-iommu-perdev-intremap in xen.gz GRUB entry
>>> 2. pci=nosmi in pvops GRUB entry
>>> 3. iommu=0 in xen.gz GRUB entry [optional, only if (1) doesn't work for you]
>
>>> We were seeing an issue which was caused by messed-up interrupt remap table. George Dunlap's perdev interrupt map solved our problem.
>
>>> Thanks,
>>> -Wei
>
>>> -----Original Message-----
>>> From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]
>>> Sent: Wednesday, October 19, 2011 11:08 AM
>>> To: Sander Eikelenboom; Huang2, Wei
>>> Cc: xen-devel@lists.xensource.com
>>> Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
>
>>> On Tue, Oct 18, 2011 at 08:55:19PM +0200, Sander Eikelenboom wrote:
>>>> Hi Konrad,
>>>>
>>>> On my system (AND phenom x6, 8gb mem) running xen 4.1.2-rc3
>>>> and a custom kernel based on:
>>>>
>>>> - your linux-next branch
>>>> - pulled in your apci/cpufreq branch
>>>> - pulled in latest patches from linuses tree
>
>>> Wei,
>>> Are those similar to what you had been seeing?
>
>>>>
>>>> I'm experiencing infrequent panics at boot (say 1 out of 10 or 20 boots), doesn't seem to matter if it's a cold or a warm boot.
>>>> It always seem to happen during or shortly after booting. When it doesn't occur then, it can run for at least several days/weeks (haven't seen it panic then).
>>>> It doesn't seem to happen at a particular point at or shortly after booting, but it happens before starting any guests
>>>>
>>>> Unfortunately i haven't had serial console enabled at these times, but i have made some photo's.
>>>> The first 3 times it locked completely before being able to print a stacktrace, the 4th time it did (although the photo is a bit unsharp).
>>>>
>>>>
>>>> So all in all, it kind of strange, i hope you can figure something out from the stacktrace, if not, i will see if i can try with serial console attached.
>>>>
>>>> --
>>>> Sander
>
>
>
>
>
>>>> _______________________________________________
>>>> 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 Oct 24 14:56:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 14:56:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISVY-0007Ho-5g; Mon, 24 Oct 2011 14:56:36 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RISV2-00075o-Lv
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 14:56:05 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1319493359!32836297!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24835 invoked from network); 24 Oct 2011 21:56:01 -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; 24 Oct 2011 21:56: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
	p9OLttnI029981
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 21:55:57 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
	p9OLtrA5001142
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 21:55:53 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
	p9OLtltx024316; Mon, 24 Oct 2011 16:55:47 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 14:55:47 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 85A7382A89; Mon, 24 Oct 2011 17:55:46 -0400 (EDT)
Date: Mon, 24 Oct 2011 17:55:46 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [Xen-devel] [PATCH 1/6 v2] xenbus: Support HVM backends
Message-ID: <20111024215546.GK2441@phenom.dumpdata.com>
References: <1319124957-32269-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319129284-521-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: <1319129284-521-1-git-send-email-dgdegra@tycho.nsa.gov>
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.0A090207.4EA5DEEE.0061:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com,
	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 Thu, Oct 20, 2011 at 12:48:04PM -0400, Daniel De Graaf wrote:
> Initial version lacked the list_del in xenbus_unmap_ring_vfree_hvm
> 
> -------------------------------------------------------->8
> 
> Add HVM implementations of xenbus_(map,unmap)_ring_v(alloc,free) so
> that ring mappings can be done without using GNTMAP_contains_pte which
> is not supported on HVM.
> 
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
>  drivers/xen/xenbus/xenbus_client.c |  155 +++++++++++++++++++++++++++++-------
>  1 files changed, 125 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c
> index 52bc57f..4b2fbcc 100644
> --- a/drivers/xen/xenbus/xenbus_client.c
> +++ b/drivers/xen/xenbus/xenbus_client.c
> @@ -32,15 +32,26 @@
>  
>  #include <linux/slab.h>
>  #include <linux/types.h>
> +#include <linux/spinlock.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/balloon.h>
>  #include <xen/events.h>
>  #include <xen/grant_table.h>
>  #include <xen/xenbus.h>
>  
> +struct xenbus_map_node {
> +	struct list_head next;
> +	struct page *page;
> +	grant_handle_t handle;
> +};
> +
> +static DEFINE_SPINLOCK(xenbus_valloc_lock);
> +static LIST_HEAD(xenbus_valloc_pages);
> +
>  const char *xenbus_strstate(enum xenbus_state state)
>  {
>  	static const char *const name[] = {
> @@ -419,21 +430,8 @@ int xenbus_free_evtchn(struct xenbus_device *dev, int port)
>  EXPORT_SYMBOL_GPL(xenbus_free_evtchn);
>  
>  
> -/**
> - * xenbus_map_ring_valloc
> - * @dev: xenbus device
> - * @gnt_ref: grant reference
> - * @vaddr: pointer to address to be filled out by mapping
> - *
> - * Based on Rusty Russell's skeleton driver's map_page.
> - * Map a page of memory into this domain from another domain's grant table.
> - * xenbus_map_ring_valloc allocates a page of virtual address space, maps the
> - * page to that address, and sets *vaddr to that address.
> - * Returns 0 on success, and GNTST_* (see xen/include/interface/grant_table.h)
> - * or -ENOMEM on error. If an error is returned, device will switch to
> - * XenbusStateClosing and the error message will be saved in XenStore.
> - */
> -int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
> +static int xenbus_map_ring_valloc_pv(struct xenbus_device *dev,
> +                                     int gnt_ref, void **vaddr)
>  {
>  	struct gnttab_map_grant_ref op = {
>  		.flags = GNTMAP_host_map | GNTMAP_contains_pte,
> @@ -468,6 +466,64 @@ int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
>  	*vaddr = area->addr;
>  	return 0;
>  }
> +
> +static int xenbus_map_ring_valloc_hvm(struct xenbus_device *dev,
> +                                     int gnt_ref, void **vaddr)
> +{
> +	struct xenbus_map_node *node;
> +	int err;
> +	void *addr;
> +
> +	*vaddr = NULL;
> +
> +	node = kzalloc(sizeof(*node), GFP_KERNEL);
> +	if (!node)
> +		return -ENOMEM;
> +
> +	err = alloc_xenballooned_pages(1, &node->page, false);

Add  /* lowmem */ on the 'false' parameter.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 15:04:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 15:04:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISdJ-0000AE-D2; Mon, 24 Oct 2011 15:04:37 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RISX8-0007jE-4b
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 14:58:14 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1319493489!905507!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27347 invoked from network); 24 Oct 2011 21:58:10 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-15.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 24 Oct 2011 21:58:10 -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
	p9OLw6P2001540
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 21:58:08 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
	p9OLw5D8014764
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 21:58:06 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
	p9OLw0Ln013308; Mon, 24 Oct 2011 16:58:00 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 14:58:00 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 8D18482A89; Mon, 24 Oct 2011 17:57:59 -0400 (EDT)
Date: Mon, 24 Oct 2011 17:57:59 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Message-ID: <20111024215759.GL2441@phenom.dumpdata.com>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-3-git-send-email-dgdegra@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319124957-32269-3-git-send-email-dgdegra@tycho.nsa.gov>
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.4EA5DF70.00AB:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com,
	david.vrabel@citrix.com
Subject: [Xen-devel] Re: [PATCH 2/6] xenbus: Use grant-table wrapper
	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

On Thu, Oct 20, 2011 at 11:35:53AM -0400, Daniel De Graaf wrote:
> The gnttab_set_{map,unmap}_op functions should be used instead of
> directly populating the fields of gnttab_map_grant_ref.

You could also mention that this has the side effect that under HVM, this happens
automatically:

 op->host_addr = __pa(vaddr);

while under PV it is unchanged.

> 
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
>  drivers/xen/xenbus/xenbus_client.c |   17 +++++++----------
>  1 files changed, 7 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c
> index 534e744..ca7c287 100644
> --- a/drivers/xen/xenbus/xenbus_client.c
> +++ b/drivers/xen/xenbus/xenbus_client.c
> @@ -544,12 +544,10 @@ EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc);
>  int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
>  		    grant_handle_t *handle, void *vaddr)
>  {
> -	struct gnttab_map_grant_ref op = {
> -		.host_addr = (unsigned long)vaddr,
> -		.flags     = GNTMAP_host_map,
> -		.ref       = gnt_ref,
> -		.dom       = dev->otherend_id,
> -	};
> +	struct gnttab_map_grant_ref op;
> +
> +	gnttab_set_map_op(&op, (phys_addr_t)vaddr, GNTMAP_host_map, gnt_ref,
> +	                  dev->otherend_id);
>  
>  	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>  		BUG();
> @@ -674,10 +672,9 @@ EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
>  int xenbus_unmap_ring(struct xenbus_device *dev,
>  		      grant_handle_t handle, void *vaddr)
>  {
> -	struct gnttab_unmap_grant_ref op = {
> -		.host_addr = (unsigned long)vaddr,
> -		.handle    = handle,
> -	};
> +	struct gnttab_unmap_grant_ref op;
> +
> +	gnttab_set_unmap_op(&op, (phys_addr_t)vaddr, GNTMAP_host_map, handle);
>  
>  	if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
>  		BUG();
> -- 
> 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 Oct 24 15:07:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 15:07:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISfi-0000Z4-WB; Mon, 24 Oct 2011 15:07:07 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RISZO-0007x2-Tj
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 15:00:50 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319493630!613742!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24422 invoked from network); 24 Oct 2011 22:00:31 -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; 24 Oct 2011 22:00:31 -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
	p9OM0PmZ005369
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 22:00:27 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
	p9OM0OLq011655
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 22:00:25 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
	p9OM0JpW013674; Mon, 24 Oct 2011 17:00:19 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 15:00:19 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 726E082A8C; Mon, 24 Oct 2011 18:00:18 -0400 (EDT)
Date: Mon, 24 Oct 2011 18:00:18 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [Xen-devel] [PATCH 3/6] xen/grant-table: Support mappings
	required by blkback
Message-ID: <20111024220018.GM2441@phenom.dumpdata.com>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319124957-32269-4-git-send-email-dgdegra@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319124957-32269-4-git-send-email-dgdegra@tycho.nsa.gov>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090209.4EA5DFFC.0083,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com,
	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 Thu, Oct 20, 2011 at 11:35:54AM -0400, Daniel De Graaf wrote:
> Allow mappings without GNTMAP_contains_pte and allow unmapping to
> specify if the PTEs should be cleared.
> 
> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
> ---
>  drivers/xen/gntdev.c      |    3 ++-
>  drivers/xen/grant-table.c |   23 ++++-------------------
>  include/xen/grant_table.h |    2 +-
>  3 files changed, 7 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
> index 3987132..5227506 100644
> --- a/drivers/xen/gntdev.c
> +++ b/drivers/xen/gntdev.c
> @@ -312,7 +312,8 @@ static int __unmap_grant_pages(struct grant_map *map, int offset, int pages)
>  		}
>  	}
>  
> -	err = gnttab_unmap_refs(map->unmap_ops + offset, map->pages + offset, pages);
> +	err = gnttab_unmap_refs(map->unmap_ops + offset, map->pages + offset,
> +	                        pages, true);
>  	if (err)
>  		return err;
>  
> diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c
> index bf1c094..a02d139 100644
> --- a/drivers/xen/grant-table.c
> +++ b/drivers/xen/grant-table.c
> @@ -472,24 +472,9 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
>  				(map_ops[i].host_addr & ~PAGE_MASK));
>  			mfn = pte_mfn(*pte);
>  		} else {
> -			/* If you really wanted to do this:
> -			 * mfn = PFN_DOWN(map_ops[i].dev_bus_addr);
> -			 *
> -			 * The reason we do not implement it is b/c on the
> -			 * unmap path (gnttab_unmap_refs) we have no means of
> -			 * checking whether the page is !GNTMAP_contains_pte.

Can you mention how you are addressing the !GNTMAP_contains_pte on unmap issue?
(or how it is already addressed).

> -			 *
> -			 * That is without some extra data-structure to carry
> -			 * the struct page, bool clear_pte, and list_head next
> -			 * tuples and deal with allocation/delallocation, etc.
> -			 *
> -			 * The users of this API set the GNTMAP_contains_pte
> -			 * flag so lets just return not supported until it
> -			 * becomes neccessary to implement.
> -			 */
> -			return -EOPNOTSUPP;
> +			mfn = PFN_DOWN(map_ops[i].dev_bus_addr);
>  		}
> -		ret = m2p_add_override(mfn, pages[i], &kmap_ops[i]);
> +		ret = m2p_add_override(mfn, pages[i], kmap_ops ? &kmap_ops[i] : NULL);
>  		if (ret)
>  			return ret;
>  	}
> @@ -499,7 +484,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, bool clear_pte)
>  {
>  	int i, ret;
>  
> @@ -511,7 +496,7 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops,
>  		return ret;
>  
>  	for (i = 0; i < count; i++) {
> -		ret = m2p_remove_override(pages[i], true /* clear the PTE */);
> +		ret = m2p_remove_override(pages[i], clear_pte);
>  		if (ret)
>  			return ret;
>  	}
> diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
> index 11e2dfc..37da54d 100644
> --- a/include/xen/grant_table.h
> +++ b/include/xen/grant_table.h
> @@ -158,6 +158,6 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_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);
> +		      struct page **pages, unsigned int count, bool clear_pte);
>  
>  #endif /* __ASM_GNTTAB_H__ */
> -- 
> 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 Mon Oct 24 15:08:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 15:08:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIShP-0000wv-Mv; Mon, 24 Oct 2011 15:08:51 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RISZv-00080s-0L
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 15:01:11 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319493663!608471!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7558 invoked from network); 24 Oct 2011 22:01:03 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-11.tower-182.messagelabs.com with SMTP;
	24 Oct 2011 22:01:03 -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
	p9OM10Dg020364; Mon, 24 Oct 2011 22:01:00 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 p9OM0pKH014407; 
	Mon, 24 Oct 2011 18:00:51 -0400
Message-ID: <4EA5E024.7040708@tycho.nsa.gov>
Date: Mon, 24 Oct 2011 18:01:08 -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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024205708.GE2441@phenom.dumpdata.com>
In-Reply-To: <20111024205708.GE2441@phenom.dumpdata.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: Ian.Jackson@eu.citrix.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	keir@xen.org
Subject: [Xen-devel] Re: [PATCH 2/2] xen/gnt{dev,
	alloc}: reserve event channels for notify
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/24/2011 04:57 PM, Konrad Rzeszutek Wilk wrote:
> On Tue, Oct 18, 2011 at 05:04:11PM -0400, Daniel De Graaf wrote:
>> When using the unmap notify ioctl, the event channel used for
>> notification needs to be reserved to avoid it being deallocated prior to
>> sending the notification.
>>
>> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
>> ---
>>  drivers/xen/gntalloc.c |   14 +++++++++++++-
>>  drivers/xen/gntdev.c   |   11 +++++++++++
>>  2 files changed, 24 insertions(+), 1 deletions(-)
>>
>> diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
>> index f6832f4..a739fb1 100644
>> --- a/drivers/xen/gntalloc.c
>> +++ b/drivers/xen/gntalloc.c
>> @@ -178,8 +178,10 @@ static void __del_gref(struct gntalloc_gref *gref)
>>  		tmp[gref->notify.pgoff] = 0;
>>  		kunmap(gref->page);
>>  	}
>> -	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
>> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
>>  		notify_remote_via_evtchn(gref->notify.event);
>> +		evtchn_put(gref->notify.event);
> 
> So.. I could have some fun by doing this in the userspace:
>   for (j = 0; j< 2;j++) {
>       for (i = 0; i < 65534; i++) {
>          struct ioctl_gntalloc_unmap_notify uarg = {
>                  .index = arg.index + offsetof(struct shr_page, notifies[0]),
>                  .action =UNMAP_NOTIFY_SEND_EVENT,
> 		 .event_channel_port = i,
>          };
>          rv = ioctl(a_fd, IOCTL_GNTALLOC_SET_UNMAP_NOTIFY, &uarg);
> 	}
>   }
> 
> And cause the event channel refcnt to be set to zero and free it. And then
> causing the box to die - as the event channels for the physical IRQ might have
> gotten free-ed.
> 

Not really. For a given valid event channel E, this will increase the refcnt by one
when i == E, and then decrease refcnt the next time evtchn_get succeeds (for some
other value of i).

> Hm.. Perhaps the gntalloc and gntdev should keep track of which event channels
> are OK to refcnt? Something like a whitelist? Granted at that point the refcounting
> could as well be done by the API that sets up the event channels from the userspace.

Hmm. Perhaps have a magic value for refcount (-1?) that indicates evtchn_get is not
available. That would become the default value of refcnt, and evtchn.c would then
use evtchn_make_refcounted() to change the refcount to 1 and allow _get/_put to work.

> So the evtchn_ioctl is pretty smart. It uses "get_port_user" to get the list
> of events that belong to this user (and have been handed out). I think you
> need to use that in the gntalloc to double-check that the event channel is not
> one of the kernel type.
> 
>> +	}
>>  
>>  	gref->notify.flags = 0;
>>  
>> @@ -396,6 +398,16 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
>>  		goto unlock_out;
>>  	}
>>  
>> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
>> +		if (evtchn_get(op.event_channel_port)) {
>> +			rc = -EINVAL;
>> +			goto unlock_out;
>> +		}
>> +	}
>> +
>> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
>> +		evtchn_put(gref->notify.event);
>> +
>>  	gref->notify.flags = op.action;
>>  	gref->notify.pgoff = pgoff;
>>  	gref->notify.event = op.event_channel_port;
>> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
>> index f914b26..cfcc890 100644
>> --- a/drivers/xen/gntdev.c
>> +++ b/drivers/xen/gntdev.c
>> @@ -190,6 +190,7 @@ static void gntdev_put_map(struct grant_map *map)
>>  
>>  	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
>>  		notify_remote_via_evtchn(map->notify.event);
>> +		evtchn_put(map->notify.event);
>>  	}
>>  
>>  	if (map->pages) {
>> @@ -596,6 +597,16 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
>>  		goto unlock_out;
>>  	}
>>  
>> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
>> +		if (evtchn_get(op.event_channel_port)) {
>> +			rc = -EINVAL;
>> +			goto unlock_out;
>> +		}
>> +	}
>> +
>> +	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
> 
> So notify.flags has not been set yet? That looks to be done later?

Yep. It's the previous value (zero if we haven't called the ioctl yet).

> Or is this in case of the user doing
> 
>  uargs.action = UNMAP_NOTIFY_SEND_EVENT;
>  ioctl(.., IOCTL_GNTALLOC_SET_UNMAP_NOTIFY, &uarg);
>  uargs.action = UNAMP_NOTIFY_CLEAR_BYTE;
>  ioctl(.., IOCTL_GNTALLOC_SET_UNMAP_NOTIFY, &uarg);
> 
>  and we want to preserve the "old" flags before swapping over to the
> new?

No. We acquire the new event channel before releasing the old one so that
if we happen to be the only one holding a reference to this event channel,
a change in the byte-clear portion of the notify does not cause us to drop
the event channel.

>> +		evtchn_put(map->notify.event);
>> +
>>  	map->notify.flags = op.action;
>>  	map->notify.addr = op.index - (map->index << PAGE_SHIFT);
>>  	map->notify.event = op.event_channel_port;
>> -- 
>> 1.7.6.4
> 


-- 
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 Mon Oct 24 15:10:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 15:10:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISjM-0001LL-Bp; Mon, 24 Oct 2011 15:10:52 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RISgr-0000r8-8J
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 15:08:17 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1319494092!1519544!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28935 invoked from network); 24 Oct 2011 22:08:13 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-8.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 22:08: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
	p9OM88uC017817
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 22:08:10 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
	p9OM87ld015334
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 22:08:08 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
	p9OM823w019497; Mon, 24 Oct 2011 17:08:02 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 15:08:02 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 4178E82A8C; Mon, 24 Oct 2011 18:08:01 -0400 (EDT)
Date: Mon, 24 Oct 2011 18:08:01 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: Re: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for
	comms
Message-ID: <20111024220801.GN2441@phenom.dumpdata.com>
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319015064.3385.80.camel@zakaz.uk.xensource.com>
	<4E9EE659.8090600@tycho.nsa.gov>
	<20111024214044.GJ2441@phenom.dumpdata.com>
	<4EA5DCFC.1020400@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA5DCFC.1020400@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.0A090205.4EA5E1CA.012B,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.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 Mon, Oct 24, 2011 at 05:47:40PM -0400, Daniel De Graaf wrote:
> On 10/24/2011 05:40 PM, Konrad Rzeszutek Wilk wrote:
> >> (Will move to commit message). In PV guests, it is sufficient to only
> >> reserve kernel address space for grant mappings because Xen modifies the
> >> mappings directly. HVM guests require that Xen modify the GFN-to-MFN
> >> mapping, so the pages being remapped must already be allocated. Pages
> > 
> > By allocated you mean the populate_physmap hypercall must happen before
> > the grant operations are done?
> > 
> > (When I see allocated I think alloc_page, which I believe is _not_ what
> > you were saying).
> 
> The pages must be valid kernel pages (with GFNs) which are actually obtained
> with alloc_page if the balloon doesn't have any sitting around for us. They
> must also *not* be populated in the physmap, which is why we grab them from
> the balloon and not from alloc_page directly.

Uh, aren't pages from alloc_page ("if the balloon does not have any sitting around
for us") obtained from normal memory that is allocated at startup. And at startup
those swaths of memory are obtained by populate_physmap call?


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 15:14:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 15:14:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISmS-0001lE-BF; Mon, 24 Oct 2011 15:14:04 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RISld-0001YP-RF
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 15:13:14 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1319494389!1515001!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24326 invoked from network); 24 Oct 2011 22:13:10 -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; 24 Oct 2011 22:13:10 -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
	p9OMD3dx025179
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 22:13:05 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
	p9OMD2lH021679
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 24 Oct 2011 22:13:03 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
	p9OMCv4G021321; Mon, 24 Oct 2011 17:12:57 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 15:12:57 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 78C2082A8C; Mon, 24 Oct 2011 18:12:55 -0400 (EDT)
Date: Mon, 24 Oct 2011 18:12:55 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Sander Eikelenboom <linux@eikelenboom.it>,
	liang tang <liang.tang@oracle.com>
Subject: Re: [Xen-devel] devel/acpi-cpufreq.v3:
	arch/x86/built-in.o:(.data+0x5f88): undefined reference to
	`x86_acpi_suspend_lowlevel'
Message-ID: <20111024221255.GA5527@phenom.dumpdata.com>
References: <104105990.20111023132901@eikelenboom.it>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <104105990.20111023132901@eikelenboom.it>
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.4EA5E2F2.001F,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 Sun, Oct 23, 2011 at 01:29:01PM +0200, Sander Eikelenboom wrote:
> Hi Konrad,
> 
> I tried to compile a kernel based on your latest "linux-next" tree (which seems to work fine),
> and the "devel/acpi-cpufreq.v3" branch pulled in. This fails with a compile error:

Thanks for taking a spin of it. Could you attach your .config file please?


> 
>   CC      drivers/usb/storage/sierra_ms.o
>   CC      drivers/xen/pci.o
>   CC      drivers/video/efifb.o
>   CC      drivers/usb/storage/option_ms.o
>   CC      drivers/video/output.o
>   CC      drivers/xen/acpi.o
>   CC      drivers/xen/acpi_processor.o
>   LD      drivers/xen/xen-evtchn.o
>   LD      drivers/xen/xen-gntdev.o
>   LD      drivers/xen/xen-gntalloc.o
>   LD      drivers/video/fb.o
>   LD      drivers/usb/storage/usb-storage.o
>   LD      drivers/usb/storage/usb-libusual.o
>   LD      drivers/video/built-in.o
>   LD      drivers/usb/storage/built-in.o
>   LD      drivers/usb/built-in.o
>   LD      drivers/xen/built-in.o
>   LD      drivers/built-in.o
>   LD      vmlinux.o
>   MODPOST vmlinux.o
>   GEN     .version
>   CHK     include/generated/compile.h
>   UPD     include/generated/compile.h
>   CC      init/version.o
>   LD      init/built-in.o
>   LD      .tmp_vmlinux1
> arch/x86/built-in.o:(.data+0x5f88): undefined reference to `x86_acpi_suspend_lowlevel'
> make: *** [.tmp_vmlinux1] Error 1
> 
> --
> 
> Sander
> 
> 
> _______________________________________________
> 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 Oct 24 15:21:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 15:21:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIStO-0002uL-HG; Mon, 24 Oct 2011 15:21:15 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RISsW-0002hk-VF
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 15:20:22 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-6.tower-216.messagelabs.com!1319494816!905654!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30222 invoked from network); 24 Oct 2011 22:20:17 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-6.tower-216.messagelabs.com with SMTP;
	24 Oct 2011 22:20:17 -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
	p9OMKDDg022588; Mon, 24 Oct 2011 22:20:13 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 p9OMKCNH015433; 
	Mon, 24 Oct 2011 18:20:12 -0400
Message-ID: <4EA5E4AD.4000902@tycho.nsa.gov>
Date: Mon, 24 Oct 2011 18:20:29 -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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-2-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024202242.GD2441@phenom.dumpdata.com>
In-Reply-To: <20111024202242.GD2441@phenom.dumpdata.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: Ian.Jackson@eu.citrix.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	keir@xen.org
Subject: [Xen-devel] Re: [PATCH 1/2] xen/event: Add reference counting to
	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

On 10/24/2011 04:22 PM, Konrad Rzeszutek Wilk wrote:
> On Tue, Oct 18, 2011 at 05:04:10PM -0400, Daniel De Graaf wrote:
>> Event channels exposed to userspace by the evtchn module may be used by
>> other modules in an asynchronous manner, which requires that reference
>> counting be used to prevent the event channel from being closed before
>> the signals are delivered.
> 
> You should probably also remove the comment in "xen_bind_pirq_gsi_to_irq"
> which talks about refcount (as the comment would now apply to this code and
> might confuse people reading the code).

OK.

> There are two scenarios I am concerned about:
> 
>  1). Xen pciback allocates/setups an physical IRQ on behalf of a guest. Lets
>      concentrate on MSI as that is more interesting. The PV guests sends
>      XEN_PCI_OP_enable_msi, dom0 calls pci_enable_msi(), MSI libs end up calling
>      xen_initdom_setup_msi_irqs, which calls xen_bind_pirq_msi_to_irq and 
>      irq->refcnt==2.
> 
>      Guest dies without calling XEN_PCI_OP_disable_msi, so we end up in
>      xen_pcibk_reset_device which calls pci_disable_msi().. which calls xen_free_irq().
>      And all of that sets refcnt==1.. OK, and if we do call xen_pcibk_reset_device()
>      again it is smart enough _not_ to call pci_disable_msi() twice.
> 
>      So I guess that case is actually OK, but if there was a driver that decided to
>      call pci_disable_msi (or pci_disable_irq) we could hit the BUG_ON(). Perhaps
>      that should be altered to WARN_ON.
 
Agreed, WARN_ON is better as nothing is likely to explode if the refcnt is off.

>  2). Grantdev holding the refcnt forever. That is probably the easiest as it would
>      be a bug in the code.

Right; same as any other reference leak in external (kernel) code.
 
> Hmm, I  think I've talked myself out of actually finding any cases where this would
> be problematic from a design perspective. The only issue I can see is exposing bugs
> in the users of event channel API - which there might be. So definitly needs some
> heavy duty testing. 
>>
>> Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
>> ---
>>  drivers/xen/events.c |   34 ++++++++++++++++++++++++++++++++++
>>  include/xen/events.h |    6 ++++++
>>  2 files changed, 40 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/xen/events.c b/drivers/xen/events.c
>> index 7523719..36d3390 100644
>> --- a/drivers/xen/events.c
>> +++ b/drivers/xen/events.c
>> @@ -88,6 +88,7 @@ enum xen_irq_type {
>>  struct irq_info
>>  {
>>  	struct list_head list;
>> +	atomic_t refcount;
> 
> refcnt
> 

Ah yes, vowels are much too valuable to use more than one here...

>>  	enum xen_irq_type type;	/* type */
>>  	unsigned irq;
>>  	unsigned short evtchn;	/* event channel */
>> @@ -407,6 +408,7 @@ static void xen_irq_init(unsigned irq)
>>  		panic("Unable to allocate metadata for IRQ%d\n", irq);
>>  
>>  	info->type = IRQT_UNBOUND;
>> +	atomic_set(&info->refcount, 1);
>>  
>>  	irq_set_handler_data(irq, info);
>>  
>> @@ -469,6 +471,8 @@ static void xen_free_irq(unsigned irq)
>>  
>>  	irq_set_handler_data(irq, NULL);
>>  
>> +	BUG_ON(atomic_read(&info->refcount) > 1);
>> +
>>  	kfree(info);
>>  
>>  	/* Legacy IRQ descriptors are managed by the arch. */
>> @@ -912,6 +916,10 @@ static void unbind_from_irq(unsigned int irq)
>>  {
>>  	struct evtchn_close close;
>>  	int evtchn = evtchn_from_irq(irq);
>> +	struct irq_info *info = irq_get_handler_data(irq);
>> +
>> +	if (!atomic_dec_and_test(&info->refcount))
>> +		return;
>>  
>>  	mutex_lock(&irq_mapping_update_lock);
>>  
>> @@ -1038,6 +1046,32 @@ void unbind_from_irqhandler(unsigned int irq, void *dev_id)
>>  }
>>  EXPORT_SYMBOL_GPL(unbind_from_irqhandler);
>>  
>> +int evtchn_get(unsigned int evtchn)
>> +{
>> +	int irq = evtchn_to_irq[evtchn];
>> +	struct irq_info *info;
>> +
>> +	if (irq == -1)
>> +		return -ENOENT;
>> +
>> +	info = irq_get_handler_data(irq);
>> +
>> +	if (!info)
>> +		return -ENOENT;
>> +
>> +	atomic_inc(&info->refcount);
>> +
>> +	return 0;
>> +}
>> +EXPORT_SYMBOL_GPL(evtchn_get);
>> +
>> +void evtchn_put(unsigned int evtchn)
> 
> The decleration for 'evtchn' is 'unsigned short' so that can be
> used instead of 'unsigned int'.
> 
>> +{
>> +	int irq = evtchn_to_irq[evtchn];
> 
> Not checking if the irq is valid? Or if the evtchn is valid?

All callers currently check this (by the _get function), but it's probably a
good idea to double-check with a WARN_ON just in case it's not valid.

>> +	unbind_from_irq(irq);
>> +}
>> +EXPORT_SYMBOL_GPL(evtchn_put);
>> +
>>  void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector)
>>  {
>>  	int irq = per_cpu(ipi_to_irq, cpu)[vector];
>> diff --git a/include/xen/events.h b/include/xen/events.h
>> index d287997..a459cca 100644
>> --- a/include/xen/events.h
>> +++ b/include/xen/events.h
>> @@ -37,6 +37,12 @@ int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain,
>>   */
>>  void unbind_from_irqhandler(unsigned int irq, void *dev_id);
>>  
>> +/*
>> + * Allow extra references to event channels exposed to userspace by evtchn
>> + */
>> +int evtchn_get(unsigned int evtchn);
>> +void evtchn_put(unsigned int evtchn);
>> +
>>  void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector);
>>  int resend_irq_on_evtchn(unsigned int irq);
>>  void rebind_evtchn_irq(int evtchn, int irq);
>> -- 
>> 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 Oct 24 15:24:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 15:24:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISwf-0003Q6-4w; Mon, 24 Oct 2011 15:24:37 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RISvx-0003DY-E3
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 15:23:53 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319495018!52349796!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31131 invoked from network); 24 Oct 2011 22:23:38 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-15.tower-27.messagelabs.com with SMTP;
	24 Oct 2011 22:23:38 -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
	p9OMNmu8011490; Mon, 24 Oct 2011 22:23:48 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 p9OMNmag015572; 
	Mon, 24 Oct 2011 18:23:48 -0400
Message-ID: <4EA5E585.6040508@tycho.nsa.gov>
Date: Mon, 24 Oct 2011 18:24:05 -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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for
	comms
References: <1318969583-23902-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318969583-23902-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319015064.3385.80.camel@zakaz.uk.xensource.com>
	<4E9EE659.8090600@tycho.nsa.gov>
	<20111024214044.GJ2441@phenom.dumpdata.com>
	<4EA5DCFC.1020400@tycho.nsa.gov>
	<20111024220801.GN2441@phenom.dumpdata.com>
In-Reply-To: <20111024220801.GN2441@phenom.dumpdata.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 Campbell <Ian.Campbell@citrix.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 10/24/2011 06:08 PM, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 24, 2011 at 05:47:40PM -0400, Daniel De Graaf wrote:
>> On 10/24/2011 05:40 PM, Konrad Rzeszutek Wilk wrote:
>>>> (Will move to commit message). In PV guests, it is sufficient to only
>>>> reserve kernel address space for grant mappings because Xen modifies the
>>>> mappings directly. HVM guests require that Xen modify the GFN-to-MFN
>>>> mapping, so the pages being remapped must already be allocated. Pages
>>>
>>> By allocated you mean the populate_physmap hypercall must happen before
>>> the grant operations are done?
>>>
>>> (When I see allocated I think alloc_page, which I believe is _not_ what
>>> you were saying).
>>
>> The pages must be valid kernel pages (with GFNs) which are actually obtained
>> with alloc_page if the balloon doesn't have any sitting around for us. They
>> must also *not* be populated in the physmap, which is why we grab them from
>> the balloon and not from alloc_page directly.
> 
> Uh, aren't pages from alloc_page ("if the balloon does not have any sitting around
> for us") obtained from normal memory that is allocated at startup. And at startup
> those swaths of memory are obtained by populate_physmap call?
> 

Yes, but alloc_xenballooned_pages calls XENMEM_decrease_reservation to remove the
MFN mappings for these pages, so they are returned to the state where populate_physmap
has not been called on them.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 15:26:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 15:26:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RISyF-0003ot-Vx; Mon, 24 Oct 2011 15:26:16 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RISwm-0003SZ-6u
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 15:24:45 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1319494966!41663586!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14311 invoked from network); 24 Oct 2011 22:22:46 -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;
	24 Oct 2011 22:22:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,400,1315180800"; 
   d="scan'208";a="8559529"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 22:24: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, 24 Oct 2011 23:24:41 +0100
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 1RISwi-00011v-LK;
	Mon, 24 Oct 2011 22:24:40 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RISwi-0000vh-A1;
	Mon, 24 Oct 2011 23:24:40 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9599-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 24 Oct 2011 23:24:40 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9599: 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 9599 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9599/

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-i386-i386-xl            15 guest-stop                   fail   never pass
 test-amd64-amd64-xl          15 guest-stop                   fail   never pass
 test-amd64-i386-xl-credit2    5 xen-boot                     fail    like 9592
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10    fail blocked in 9592
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-i386-rhel6hvm-intel  7 redhat-install               fail never pass
 test-amd64-i386-rhel6hvm-amd  7 redhat-install               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-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win       7 windows-install              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

version targeted for testing:
 xen                  da9f945b3db8
baseline version:
 xen                  8aded64130a6

------------------------------------------------------------
People who touched revisions under test:
  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                                          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=da9f945b3db8
+ . 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 da9f945b3db8
+ branch=xen-4.0-testing
+ revision=da9f945b3db8
+ . 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 da9f945b3db8 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 2 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 Mon Oct 24 16:18:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 16:18:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RITn4-0005Mh-VU; Mon, 24 Oct 2011 16:18:47 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RITm3-0005A9-Ij
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 16:17:44 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1319498259!1529929!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19787 invoked from network); 24 Oct 2011 23:17:39 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 23:17:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,400,1315180800"; 
   d="scan'208";a="8559949"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 23:17: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; Tue, 25 Oct 2011 00:17:38 +0100
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 1RITly-0001Jp-K6;
	Mon, 24 Oct 2011 23:17:38 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RITly-0007Zo-GX;
	Tue, 25 Oct 2011 00:17:38 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9600-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 25 Oct 2011 00:17:38 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9600: 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 9600 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9600/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. vs. 9356
 test-amd64-amd64-xl          18 leak-check/check           fail REGR. vs. 9356

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-i386-i386-xl-win        13 guest-stop                   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-amd64-amd64-win         16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  81e39a4978ea
baseline version:
 xen                  d4253bc5418b

------------------------------------------------------------
People who touched revisions under test:
  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                                          fail    
 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:   23176:81e39a4978ea
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Mon Oct 24 18:03:35 2011 +0100
    
    Revert xen-unstable:23871:503ee256fecf
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23175:247fadffacab
user:        Keir Fraser <keir@xen.org>
date:        Mon Oct 24 18:02:42 2011 +0100
    
    Update Xen version to 4.1.3-rc1-pre
    
    
changeset:   23174:d4253bc5418b
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 20 17:36:03 2011 +0100
    
    Added signature for changeset 3eca5bf65e6c
    
    
(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 Mon Oct 24 17:31:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 17:31:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIUvN-0007AY-Ns; Mon, 24 Oct 2011 17:31:25 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIUuA-0006xq-3l
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 17:30:10 -0700
X-Env-Sender: tknchris@gmail.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319502605!30490922!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15033 invoked from network); 25 Oct 2011 00:30:06 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 00:30:06 -0000
Received: by iaen33 with SMTP id n33so10773943iae.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 17:30:05 -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=W3OgSCkRnsrI4Hs/wXs8JzHCCSUlS5g1ANwVVd5GUbk=;
	b=knEVuqkMyCkibK2v37mmsjo3AGTSGjfg5cCghJMAQY9smG2x8/rT+mEHlBuzrw1rSk
	oVeqDiqIReVBIqxC6kcJBe+F3lsJjnjGZkupUW/LHKaEu341EmgfOZO7RCMdKdzIgo3I
	QpJ8/KS8YK4XYEJPZU1iEsEOCT6CHVlndygS0=
MIME-Version: 1.0
Received: by 10.42.154.201 with SMTP id r9mr41719360icw.14.1319502605109; Mon,
	24 Oct 2011 17:30:05 -0700 (PDT)
Received: by 10.42.171.135 with HTTP; Mon, 24 Oct 2011 17:30:04 -0700 (PDT)
Received: by 10.42.171.135 with HTTP; Mon, 24 Oct 2011 17:30:04 -0700 (PDT)
Date: Mon, 24 Oct 2011 20:30:04 -0400
Message-ID: <CAKnNFz_iB8yGcV-CWcg1is=KnfHjrrHqcvZGGeTF0YyLDUxbNg@mail.gmail.com>
From: chris <tknchris@gmail.com>
To: Xen-Devel List <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Feature idea
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============1794187514=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1794187514==
Content-Type: multipart/alternative; boundary=90e6ba6e82da0ecb1204b014a40c

--90e6ba6e82da0ecb1204b014a40c
Content-Type: text/plain; charset=ISO-8859-1

Is there any mechanism to give a.domU memory from dom0 swap? It would be
neat/useful if we could utilize that to test things in a vm with more RAM
than is.physically available. Obviously performance wouldn't be.stellar.but
it would still have some usefulness

chris

--90e6ba6e82da0ecb1204b014a40c
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<p>Is there any mechanism to give a.domU memory from dom0 swap? It would be=
 neat/useful if we could utilize that to test things in a vm with more RAM =
than is.physically available. Obviously performance wouldn&#39;t be.stellar=
.but it would still have some usefulness</p>

<p>chris</p>

--90e6ba6e82da0ecb1204b014a40c--


--===============1794187514==
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

--===============1794187514==--


From xen-devel-bounces@lists.xensource.com Mon Oct 24 17:54:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 17:54:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIVHW-000842-Ez; Mon, 24 Oct 2011 17:54:18 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIVGx-0007ro-Jx
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 17:53:45 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319504020!1525034!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8735 invoked from network); 25 Oct 2011 00:53:40 -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;
	25 Oct 2011 00:53:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,401,1315180800"; 
   d="scan'208";a="8560319"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 00:53: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; Tue, 25 Oct 2011 01:53:28 +0100
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 1RIVGi-0001q9-CT;
	Tue, 25 Oct 2011 00:53:28 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIVGi-0006UY-93;
	Tue, 25 Oct 2011 01:53:28 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9601-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 25 Oct 2011 01:53:28 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9601: 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 9601 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9601/

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-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                  662dbf6ee71c
baseline version:
 xen                  6c583d35d76d

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Jan Beulich <jbeulich@novell.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  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                                     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=662dbf6ee71c
+ . 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 662dbf6ee71c
+ branch=xen-unstable
+ revision=662dbf6ee71c
+ . 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 662dbf6ee71c 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 119 changes to 69 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 24 20:40:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 20:40:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIXsH-0003zp-Ru; Mon, 24 Oct 2011 20:40:25 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIXrE-0003nC-Ry
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 20:39:21 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1319513935!50082912!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18802 invoked from network); 25 Oct 2011 03:38:55 -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;
	25 Oct 2011 03:38:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,402,1315180800"; 
   d="scan'208";a="8560800"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 03:39: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, 25 Oct 2011 04:39:16 +0100
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 1RIXrA-0002kw-IS;
	Tue, 25 Oct 2011 03:39:16 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIXrA-0006Q0-9D;
	Tue, 25 Oct 2011 04:39:16 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9607-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 25 Oct 2011 04:39:16 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9607: 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 9607 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9607/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. vs. 9356

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-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-xl-win        13 guest-stop                   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-amd64-amd64-win         16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  81e39a4978ea
baseline version:
 xen                  d4253bc5418b

------------------------------------------------------------
People who touched revisions under test:
  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:   23176:81e39a4978ea
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Mon Oct 24 18:03:35 2011 +0100
    
    Revert xen-unstable:23871:503ee256fecf
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23175:247fadffacab
user:        Keir Fraser <keir@xen.org>
date:        Mon Oct 24 18:02:42 2011 +0100
    
    Update Xen version to 4.1.3-rc1-pre
    
    
changeset:   23174:d4253bc5418b
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 20 17:36:03 2011 +0100
    
    Added signature for changeset 3eca5bf65e6c
    
    
(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 Mon Oct 24 20:56:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 20:56:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIY8C-0004rd-Oe; Mon, 24 Oct 2011 20:56:52 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIY7U-0004fi-OE
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 20:56:09 -0700
X-Env-Sender: liang.tang@oracle.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319514963!36527571!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 829 invoked from network); 25 Oct 2011 03:56:05 -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; 25 Oct 2011 03:56:05 -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
	p9P3tvat028092
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 03:55:59 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
	p9P3tu0r017086
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 03:55:57 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
	p9P3tpQ3024246; Mon, 24 Oct 2011 22:55:51 -0500
Received: from [10.182.38.104] (/10.182.38.104)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 24 Oct 2011 20:55:50 -0700
Message-ID: <4EA63341.5040400@oracle.com>
Date: Tue, 25 Oct 2011 11:55:45 +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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <104105990.20111023132901@eikelenboom.it>
	<20111024125833.GA19142@phenom.dumpdata.com>
In-Reply-To: <20111024125833.GA19142@phenom.dumpdata.com>
Content-Type: multipart/mixed; boundary="------------080903070408070900050609"
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090201.4EA63350.0021:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Sander Eikelenboom <linux@eikelenboom.it>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [Xen-devel] Re: devel/acpi-cpufreq.v3:
 arch/x86/built-in.o:(.data+0x5f88): undefined
 reference to `x86_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

This is a multi-part message in MIME format.
--------------080903070408070900050609
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi,Sander
would you mind to try this patch(in the attach file ). thank you very much!

On 2011-10-24 20:58, Konrad Rzeszutek Wilk wrote:
> On Sun, Oct 23, 2011 at 01:29:01PM +0200, Sander Eikelenboom wrote:
>> Hi Konrad,
>>
>> I tried to compile a kernel based on your latest "linux-next" tree (which seems to work fine),
>> and the "devel/acpi-cpufreq.v3" branch pulled in. This fails with a compile error:
> Hmm, OK, Liang, any ideas?
>>    CC      drivers/usb/storage/sierra_ms.o
>>    CC      drivers/xen/pci.o
>>    CC      drivers/video/efifb.o
>>    CC      drivers/usb/storage/option_ms.o
>>    CC      drivers/video/output.o
>>    CC      drivers/xen/acpi.o
>>    CC      drivers/xen/acpi_processor.o
>>    LD      drivers/xen/xen-evtchn.o
>>    LD      drivers/xen/xen-gntdev.o
>>    LD      drivers/xen/xen-gntalloc.o
>>    LD      drivers/video/fb.o
>>    LD      drivers/usb/storage/usb-storage.o
>>    LD      drivers/usb/storage/usb-libusual.o
>>    LD      drivers/video/built-in.o
>>    LD      drivers/usb/storage/built-in.o
>>    LD      drivers/usb/built-in.o
>>    LD      drivers/xen/built-in.o
>>    LD      drivers/built-in.o
>>    LD      vmlinux.o
>>    MODPOST vmlinux.o
>>    GEN     .version
>>    CHK     include/generated/compile.h
>>    UPD     include/generated/compile.h
>>    CC      init/version.o
>>    LD      init/built-in.o
>>    LD      .tmp_vmlinux1
>> arch/x86/built-in.o:(.data+0x5f88): undefined reference to `x86_acpi_suspend_lowlevel'
>> make: *** [.tmp_vmlinux1] Error 1
>>
>> --
>>
>> Sander

--------------080903070408070900050609
Content-Type: text/plain;
	name="0001-fixed-the-acpi-sleep-disable-complied-bug.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename*0="0001-fixed-the-acpi-sleep-disable-complied-bug.patch"

>From a7d4508949cc19fd6ade9ab5efbe05ae8e842baf Mon Sep 17 00:00:00 2001
From: Tang Liang <liang.tang@oracle.com>
Date: Tue, 25 Oct 2011 11:51:49 +0800
Subject: [PATCH] fixed the acpi sleep disable complied bug

this is a template patch for complied bug
---
 arch/x86/kernel/acpi/boot.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index ddd081b..0c3068f 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -557,7 +557,12 @@ int (*__acpi_override_sleep)(u8 sleep_state, u32 pm1a_ctrl,
 			     u32 pm1b_ctrl, bool *skip_rest) \
 			   __attribute__ ((unused)) = NULL;
 
+#ifdef CONFIG_ACPI_SLEEP 
 int (*acpi_suspend_lowlevel)(void) = x86_acpi_suspend_lowlevel;
+#else
+int (*acpi_suspend_lowlevel)(void);
+#endif
+
 /*
  * success: return IRQ number (>=0)
  * failure: return < 0
-- 
1.7.6


--------------080903070408070900050609
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

--------------080903070408070900050609--


From xen-devel-bounces@lists.xensource.com Mon Oct 24 22:44:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 24 Oct 2011 22:44:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIZok-0007Qi-00; Mon, 24 Oct 2011 22:44:54 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIZnf-0007Dk-PP
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 22:43:48 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1319521424!36524014!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10634 invoked from network); 25 Oct 2011 05:43:44 -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;
	25 Oct 2011 05:43:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,402,1315180800"; 
   d="scan'208";a="8561377"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 05:43: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; Tue, 25 Oct 2011 06:43:38 +0100
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 1RIZnW-0003Rz-Do;
	Tue, 25 Oct 2011 05:43:38 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIZnV-0006kA-Sz;
	Tue, 25 Oct 2011 06:43:38 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9608-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 25 Oct 2011 06:43:38 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9608: 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 9608 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9608/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf     13 guest-localmigrate.2         fail pass in 9601

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                  662dbf6ee71c
baseline version:
 xen                  662dbf6ee71c

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 Tue Oct 25 00:36:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 00:36:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIbZB-0001XT-DC; Tue, 25 Oct 2011 00:36:57 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIbYD-0001Ku-AK
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 00:35:57 -0700
X-Env-Sender: linux@eikelenboom.it
X-Msg-Ref: server-4.tower-21.messagelabs.com!1319528153!1550424!1
X-Originating-IP: [188.40.164.121]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15004 invoked from network); 25 Oct 2011 07:35:54 -0000
Received: from static.121.164.40.188.clients.your-server.de (HELO
	smtp.eikelenboom.it) (188.40.164.121)
	by server-4.tower-21.messagelabs.com with AES256-SHA encrypted SMTP;
	25 Oct 2011 07:35:54 -0000
Received: from 143-67-ftth.onsneteindhoven.nl ([88.159.67.143]:50325
	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 1RIbVn-0005mf-Lf; Tue, 25 Oct 2011 09:33:27 +0200
Date: Tue, 25 Oct 2011 09:35:52 +0200
From: Sander Eikelenboom <linux@eikelenboom.it>
Organization: Eikelenboom IT services
X-Priority: 3 (Normal)
Message-ID: <84045000.20111025093552@eikelenboom.it>
To: liang tang <liang.tang@oracle.com>
In-Reply-To: <4EA63341.5040400@oracle.com>
References: <104105990.20111023132901@eikelenboom.it>
	<20111024125833.GA19142@phenom.dumpdata.com>
	<4EA63341.5040400@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: devel/acpi-cpufreq.v3:
	arch/x86/built-in.o:(.data+0x5f88): undefined reference to
	`x86_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

Tuesday, October 25, 2011, 5:55:45 AM, you wrote:

> Hi,Sander
> would you mind to try this patch(in the attach file ). thank you very muc=
h!

Hi Liang,

Applied and it fixes the compile error, booted and seems to work ok.

Thx!

--
Sander


> On 2011-10-24 20:58, Konrad Rzeszutek Wilk wrote:
>> On Sun, Oct 23, 2011 at 01:29:01PM +0200, Sander Eikelenboom wrote:
>>> Hi Konrad,
>>>
>>> I tried to compile a kernel based on your latest "linux-next" tree (whi=
ch seems to work fine),
>>> and the "devel/acpi-cpufreq.v3" branch pulled in. This fails with a com=
pile error:
>> Hmm, OK, Liang, any ideas?
>>>    CC      drivers/usb/storage/sierra_ms.o
>>>    CC      drivers/xen/pci.o
>>>    CC      drivers/video/efifb.o
>>>    CC      drivers/usb/storage/option_ms.o
>>>    CC      drivers/video/output.o
>>>    CC      drivers/xen/acpi.o
>>>    CC      drivers/xen/acpi_processor.o
>>>    LD      drivers/xen/xen-evtchn.o
>>>    LD      drivers/xen/xen-gntdev.o
>>>    LD      drivers/xen/xen-gntalloc.o
>>>    LD      drivers/video/fb.o
>>>    LD      drivers/usb/storage/usb-storage.o
>>>    LD      drivers/usb/storage/usb-libusual.o
>>>    LD      drivers/video/built-in.o
>>>    LD      drivers/usb/storage/built-in.o
>>>    LD      drivers/usb/built-in.o
>>>    LD      drivers/xen/built-in.o
>>>    LD      drivers/built-in.o
>>>    LD      vmlinux.o
>>>    MODPOST vmlinux.o
>>>    GEN     .version
>>>    CHK     include/generated/compile.h
>>>    UPD     include/generated/compile.h
>>>    CC      init/version.o
>>>    LD      init/built-in.o
>>>    LD      .tmp_vmlinux1
>>> arch/x86/built-in.o:(.data+0x5f88): undefined reference to `x86_acpi_su=
spend_lowlevel'
>>> make: *** [.tmp_vmlinux1] Error 1
>>>
>>> --
>>>
>>> Sander




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 01:00:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 01:00:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIbvU-0002SU-T7; Tue, 25 Oct 2011 01:00:01 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIbsw-0002EH-Pd
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 00:57:23 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-9.tower-216.messagelabs.com!1319529439!950162!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32349 invoked from network); 25 Oct 2011 07:57:19 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-9.tower-216.messagelabs.com with SMTP;
	25 Oct 2011 07:57:19 -0000
Received: from [62.94.182.14] (account d.faggioli@sssup.it HELO [192.168.0.4])
	by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72654145; Tue, 25 Oct 2011 09:57:18 +0200
Message-ID: <1319529437.2230.63.camel@Abyss>
Subject: Re: [Xen-devel] [PATCH] scheduler rate controller
From: Dario Faggioli <raistlin@linux.it>
To: George Dunlap <George.Dunlap@eu.citrix.com>
Date: Tue, 25 Oct 2011 09:57:17 +0200
In-Reply-To: <CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
References: <C10D3FB0CD45994C8A51FEC1227CE22F340768D793@shsmsx502.ccr.corp.intel.com>
	<CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
Face: 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
X-Mailer: Evolution 3.2.1 (3.2.1-1.fc16) 
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>, "Lv, Hui" <hui.lv@intel.com>,
	"Duan, Jiangang" <jiangang.duan@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>
Content-Type: multipart/mixed; boundary="===============0086065221=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============0086065221==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-knYatidySkwBbvYnSLT6"


--=-knYatidySkwBbvYnSLT6
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hello everyone,

On Mon, 2011-10-24 at 17:17 +0100, George Dunlap wrote:
> * The actual algorithm you use here isn't described.  It seems to be
> as follows (please correct me if I've made a mistake
> reverse-engineering the algorithm):
>=20
> Every 10ms, check to see if there have been more than 50 schedules.
> If so, disable pre-emption entirely for 10ms, allowing processes to
> run without being interrupted (unless they yield).
>=20
> It seems like we should be able to do better.  For one, it means in
> the general case you will flip back and forth between really frequent
> schedules and less frequent schedules.  For two, turning off
> preemption entirely will mean that whatever vcpu happens to be running
> could, if it wished, run for the full 10ms; and which one got elected
> to do that would be really random. =20
>
To me, this is  key point... Maybe we can save at least the calls coming
from the timer tick from being skipped, or something like that?

More generally speaking, I think I can see how this feature can be
useful, and I also think it can live in the generic schedule.c code, but
the algorithm with 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).

For example this might completely destroy the time guarantees a
scheduler  like sEDF would give, and in such case it must be easy enough
to figure out what's going on and why the scheduler is  not behaving as
one would have expected!

For that reaason, although, again, a mechanism like this could
(according to my opinion) be general enough to be sensible and
meaningful for all the various schedulers, it might be worthwhile to
have it inside credit1 for now, where we know it will probably yield the
most of its benefits.

Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-knYatidySkwBbvYnSLT6
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk6ma90ACgkQk4XaBE3IOsRVTACgkJhdlgtq2pikx9SihY6gF3jU
CJwAn0s8AMDrt55dSvSZQ97GR27Jpzzd
=cDWj
-----END PGP SIGNATURE-----

--=-knYatidySkwBbvYnSLT6--



--===============0086065221==
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

--===============0086065221==--



From xen-devel-bounces@lists.xensource.com Tue Oct 25 01:06:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 01:06:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIc22-0002wK-ND; Tue, 25 Oct 2011 01:06:47 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIc0J-0002iE-RL
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 01:05:02 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319529895!647739!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16537 invoked from network); 25 Oct 2011 08:04:55 -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;
	25 Oct 2011 08:04:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,403,1315180800"; 
   d="scan'208";a="8563313"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 08:04: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, 25 Oct 2011 09:04:55 +0100
Subject: Re: [Xen-devel] Feature idea
From: Ian Campbell <Ian.Campbell@citrix.com>
To: chris <tknchris@gmail.com>
Date: Tue, 25 Oct 2011 09:04:55 +0100
In-Reply-To: <CAKnNFz_iB8yGcV-CWcg1is=KnfHjrrHqcvZGGeTF0YyLDUxbNg@mail.gmail.com>
References: <CAKnNFz_iB8yGcV-CWcg1is=KnfHjrrHqcvZGGeTF0YyLDUxbNg@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: <1319529895.3385.210.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Xen-Devel List <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-10-25 at 01:30 +0100, chris wrote:
> Is there any mechanism to give a.domU memory from dom0 swap? It would
> be neat/useful if we could utilize that to test things in a vm with
> more RAM than is.physically available. Obviously performance wouldn't
> be.stellar.but it would still have some usefulness

The xenpaging feature which some folks are working on allows guest RAM
to be swapped to a file in dom0.

It lives in tools/xenpaging. There's been loads of work on it since 4.1,
mainly by Olaf Hering.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 01:18:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 01:18:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIcD0-0003by-CW; Tue, 25 Oct 2011 01:18:06 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIcCE-0003PT-OL
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 01:17:19 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319530635!645107!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31545 invoked from network); 25 Oct 2011 08:17:15 -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;
	25 Oct 2011 08:17:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,403,1315180800"; 
   d="scan'208";a="8563629"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 08:17:15 +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, 25 Oct 2011 09:17:15 +0100
Subject: Re: [Xen-devel] Re: [PATCH 1/2] xen/event: Add reference counting
	to event channel
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Tue, 25 Oct 2011 09:17:15 +0100
In-Reply-To: <20111024202242.GD2441@phenom.dumpdata.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-2-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024202242.GD2441@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: <1319530635.3385.215.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Keir \(Xen.org\)" <keir@xen.org>, Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Mon, 2011-10-24 at 21:22 +0100, Konrad Rzeszutek Wilk wrote:
> 
> > +void evtchn_put(unsigned int evtchn)
> 
> The decleration for 'evtchn' is 'unsigned short' so that can be
> used instead of 'unsigned int'.

I think I nearly made the same comment but then I looked at
drivers/xen/events.c and found that it uses "unsigned", "unsigned
short", "unsigned int" and "int" fairly interchangeably. The externally
visible API (i.e. include/xen/events.h) tends to stick to just "unsigned
int" or "int".

The problem with the short types is that they don't leave room for an
error indication, which is why on the Xen tools (libxc) side we have his
piece of minor ugliness:
        typedef int evtchn_port_or_error_t;

The actual hypercall interface uses "typedef uint32_t evtchn_port_t" but
AIUI real evtchn values are guaranteed to fit in 31 bits.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 01:23:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 01:23:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIcIa-00044q-OF; Tue, 25 Oct 2011 01:23:52 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIcHu-0003sl-Cz
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 01:23:10 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1319530987!954746!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8353 invoked from network); 25 Oct 2011 08:23:07 -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;
	25 Oct 2011 08:23:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,403,1315180800"; 
   d="scan'208";a="8563783"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 08:23:07 +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, 25 Oct 2011 09:23:06 +0100
Subject: Re: [Xen-devel] [xen-unstable test] 9593: regressions - trouble:
	broken/fail/pass
From: Ian Campbell <Ian.Campbell@citrix.com>
To: xen.org <ian.jackson@eu.citrix.com>, Tim Deegan <tim@xen.org>, "Keir
	Fraser" <keir@xen.org>, Jan Beulich <JBeulich@suse.com>
Date: Tue, 25 Oct 2011 09:23:06 +0100
In-Reply-To: <osstest-9593-mainreport@xen.org>
References: <osstest-9593-mainreport@xen.org>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319530986.3385.219.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

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!

 On Mon, 2011-10-24 at 20:40 +0100, xen.org wrote:
> 
> 
> changeset:   23987:2682094bc243
> user:        Jan Beulich <jbeulich@suse.com>
> date:        Fri Oct 21 09:42:47 2011 +0200
> 
>     x86/p2m: allocate CPU masks dynamically
> 
>     Signed-off-by: Jan Beulich <jbeulich@suse.com>
>     Acked-by: Tim Deegan <tim@xen.org>
>     Acked-by: Keir Fraser <keir@xen.org>
> 
>     --- 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);
>      }
> 
>      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);
> 
>          if (old_flags & _PAGE_PRESENT)
>     -        flush_tlb_mask(&p2m->p2m_dirty_cpumask);
>     +        flush_tlb_mask(p2m->dirty_cpumask);
> 
>          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 = p2m_access_rwx;
> 
>          p2m->cr3 = CR3_EADDR;
>     -    cpumask_clear(&p2m->p2m_dirty_cpumask);
> 
>          if ( hap_enabled(d) && (boot_cpu_data.x86_vendor ==
> X86_VENDOR_INTEL) )
>              ept_p2m_init(p2m);
>     @@ -102,6 +101,8 @@ p2m_init_nestedp2m(struct domain *d)
>              d->arch.nested_p2m[i] = p2m = xzalloc(struct p2m_domain);
>              if (p2m == NULL)
>                  return -ENOMEM;
>     +        if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
>     +            return -ENOMEM;
>              p2m_initialise(d, p2m);
>              p2m->write_p2m_entry = 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) = p2m = xzalloc(struct p2m_domain);
>          if ( p2m == NULL )
>              return -ENOMEM;
>     +    if ( !zalloc_cpumask_var(&p2m->dirty_cpumask) )
>     +    {
>     +        xfree(p2m);
>     +        return -ENOMEM;
>     +    }
>          p2m_initialise(d, p2m);
> 
>          /* Must initialise nestedp2m unconditionally
>     @@ -333,6 +339,9 @@ static void p2m_teardown_nestedp2m(struc
>          uint8_t i;
> 
>          for (i = 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] = 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 = NULL;
>     +    if ( d->arch.p2m )
>     +    {
>     +        free_cpumask_var(d->arch.p2m->dirty_cpumask);
>     +        xfree(d->arch.p2m);
>     +        d->arch.p2m = NULL;
>     +    }
> 
>          /* We must teardown unconditionally because
>           * we initialise them unconditionally.
>     @@ -1200,7 +1213,7 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
>                  if (p2m->cr3 == CR3_EADDR)
>                      hvm_asid_flush_vcpu(v);
>                  p2m->cr3 = 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 = cr3;
>          nv->nv_flushp2m = 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);
> 
>     --- 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;
> 
>          struct domain     *domain;   /* back pointer to domain */
> 
> 
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 01:59:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 01:59:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIcrH-0005wc-Cw; Tue, 25 Oct 2011 01:59:43 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIcp4-0005iJ-6h
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 01:57:26 -0700
X-Env-Sender: hahn@univention.de
X-Msg-Ref: server-9.tower-216.messagelabs.com!1319533042!960237!1
X-Originating-IP: [82.198.197.8]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4034 invoked from network); 25 Oct 2011 08:57:23 -0000
Received: from mail.univention.de (HELO mail.univention.de) (82.198.197.8)
	by server-9.tower-216.messagelabs.com with SMTP;
	25 Oct 2011 08:57:23 -0000
Received: from localhost (localhost [127.0.0.1])
	by slugis.knut.univention.de (Postfix) with ESMTP id DB12DA63105
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 10:57:19 +0200 (CEST)
Received: from localhost (localhost [127.0.0.1])
	by slugis.knut.univention.de (Postfix) with ESMTP id C906AE5B102
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 10:57:19 +0200 (CEST)
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 yLg7jRwLw7j0 for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 10:57:19 +0200 (CEST)
Received: from stave.knut.univention.de (stave.knut.univention.de
	[192.168.0.191])
	by slugis.knut.univention.de (Postfix) with ESMTPSA id 7030EA63105
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 10:57:19 +0200 (CEST)
From: Philipp Hahn <hahn@univention.de>
Organization: Univention.de
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Tue, 25 Oct 2011 10:56:58 +0200
User-Agent: KMail/1.9.10 (enterprise35 20100903.1171286)
MIME-Version: 1.0
Message-Id: <201110251057.06774.hahn@univention.de>
Subject: [Xen-devel] [PATCH] Add HybridISO support for PyGrub2
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0924498185=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0924498185==
Content-Type: multipart/signed; boundary="nextPart1452174.cQtgZb4KhV";
	protocol="application/pgp-signature"; micalg=pgp-sha1
Content-Transfer-Encoding: 7bit

--nextPart1452174.cQtgZb4KhV
Content-Type: text/plain;
  charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

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 the DOS partition=20
table and uses the first partition instead of the complete ISO file.

Add a check to detech HybridISO files and fall back to unpartitioned=20
operation.

Signed-off-by: Philipp Hahn <hahn@univention.de>
=2D-- a/tools/pygrub/src/pygrub
+++ b/tools/pygrub/src/pygrub
@@ -41,12 +41,16 @@ def enable_cursor(ison):
         pass
=20
 def is_disk_image(file):
+    """Detect DOS partition table."""
     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,):
+        # HybridISO contains a DOS partition table for booting from USB=20
devices, but really is an ISO image
+        if len(buf) >=3D 0x8006 and buf[0x8001:0x8006] =3D=3D 'CD001':
+            return False
         return True
     return False
=20
=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/

--nextPart1452174.cQtgZb4KhV
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)

iEYEABECAAYFAk6medsACgkQYPlgoZpUDjk60wCfaXd9eORanvf6zP4cwaq/9eIa
KgUAniqA8d7A69KknhLmY90Q2991W3wo
=rrSS
-----END PGP SIGNATURE-----

--nextPart1452174.cQtgZb4KhV--


--===============0924498185==
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

--===============0924498185==--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 02:18:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 02:18:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RId9k-0006kA-IA; Tue, 25 Oct 2011 02:18:48 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RId8h-0006X4-3w
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 02:17:44 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1319534260!955466!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31363 invoked from network); 25 Oct 2011 09:17:40 -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;
	25 Oct 2011 09:17:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,403,1315180800"; 
   d="scan'208";a="8565443"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 09:17:39 +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, 25 Oct 2011 10:17:39 +0100
Subject: Re: [Xen-devel] [PATCH] Add HybridISO support for PyGrub2
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Philipp Hahn <hahn@univention.de>
Date: Tue, 25 Oct 2011 10:17:38 +0100
In-Reply-To: <201110251057.06774.hahn@univention.de>
References: <201110251057.06774.hahn@univention.de>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319534259.3385.224.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-10-25 at 09:56 +0100, Philipp Hahn wrote:
> 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 the DOS partition 
> table and uses the first partition instead of the complete ISO file.

Is the problem here that, having detected a DOS partition, pygrub is
then unwilling to accept that the partition contains an ISO9660 file
system? Or is it that the DOS partition table covers something other
than the ISO9660 data? Where does the kernel we want to boot actually
live?

Is there some reference to the layout of an hybridiso? i.e. what is the
significance on 0x8006? What are the chances of false positives?

> Add a check to detech HybridISO files and fall back to unpartitioned 
> operation.
> 
> Signed-off-by: Philipp Hahn <hahn@univention.de>
> --- a/tools/pygrub/src/pygrub
> +++ b/tools/pygrub/src/pygrub
> @@ -41,12 +41,16 @@ def enable_cursor(ison):
>          pass
>  
>  def is_disk_image(file):
> +    """Detect DOS partition table."""
>      fd = os.open(file, os.O_RDONLY)
> -    buf = os.read(fd, 512)
> +    buf = os.read(fd, 0x8006)
>      os.close(fd)
>  
>      if len(buf) >= 512 and \
>             struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,):
> +        # HybridISO contains a DOS partition table for booting from USB 
> devices, but really is an ISO image
> +        if len(buf) >= 0x8006 and buf[0x8001:0x8006] == 'CD001':
> +            return False
>          return True
>      return False
>  



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 02:52:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 02:52:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIdgA-0007nC-IH; Tue, 25 Oct 2011 02:52:18 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIdfI-0007aa-Aq
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 02:51:24 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-16.tower-21.messagelabs.com!1319536281!1547259!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1397 invoked from network); 25 Oct 2011 09:51:21 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 25 Oct 2011 09:51:21 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RIdfB-0000Et-Pk; Tue, 25 Oct 2011 09:51:17 +0000
Date: Tue, 25 Oct 2011 10:51:17 +0100
From: Tim Deegan <tim@xen.org>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] Add HybridISO support for PyGrub2
Message-ID: <20111025095117.GA421@ocelot.phlegethon.org>
References: <201110251057.06774.hahn@univention.de>
	<1319534259.3385.224.camel@zakaz.uk.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1319534259.3385.224.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.4.2.1i
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Philipp Hahn <hahn@univention.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

At 10:17 +0100 on 25 Oct (1319537858), Ian Campbell wrote:
> On Tue, 2011-10-25 at 09:56 +0100, Philipp Hahn wrote:
> > 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 the DOS partition 
> > table and uses the first partition instead of the complete ISO file.
> 
> Is the problem here that, having detected a DOS partition, pygrub is
> then unwilling to accept that the partition contains an ISO9660 file
> system?

The problem is that since the disk has a valid MBR partition table,
pygrub tries all the partitions in that but _doesn't_ try the whole
device (as it would if it couldn't find an MBR).

> Or is it that the DOS partition table covers something other
> than the ISO9660 data? Where does the kernel we want to boot actually
> live?
> 
> Is there some reference to the layout of an hybridiso? i.e. what is the
> significance on 0x8006? What are the chances of false positives?

Looking for "\001CD001" at offset 0x8000 is a pretty good way to
identify an ISO9660 image (e.g. I think that's how magic(5) does it).
This patch doesn't _quite_ do that, and in any case this is the wrong
place to do it.  The right fix to have get_partition_offsets() detect
ISO9660 images and add '[0]' to whatever else it comes up with.

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 Oct 25 03:34:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 03:34:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIeLR-0000cN-AN; Tue, 25 Oct 2011 03:34:57 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIeKU-0000PL-9J
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 03:33:58 -0700
X-Env-Sender: hahn@univention.de
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319538834!36610700!1
X-Originating-IP: [82.198.197.8]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1879 invoked from network); 25 Oct 2011 10:33:54 -0000
Received: from mail.univention.de (HELO mail.univention.de) (82.198.197.8)
	by server-4.tower-174.messagelabs.com with SMTP;
	25 Oct 2011 10:33:54 -0000
Received: from localhost (localhost [127.0.0.1])
	by slugis.knut.univention.de (Postfix) with ESMTP id EAEBAA63105;
	Tue, 25 Oct 2011 12:33:51 +0200 (CEST)
Received: from localhost (localhost [127.0.0.1])
	by slugis.knut.univention.de (Postfix) with ESMTP id C2312E5B102;
	Tue, 25 Oct 2011 12:33:51 +0200 (CEST)
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 tOclLtU4CEJZ; Tue, 25 Oct 2011 12:33:51 +0200 (CEST)
Received: from stave.knut.univention.de (stave.knut.univention.de
	[192.168.0.191])
	by slugis.knut.univention.de (Postfix) with ESMTPSA id 10040A63105;
	Tue, 25 Oct 2011 12:33:50 +0200 (CEST)
From: Philipp Hahn <hahn@univention.de>
Organization: Univention.de
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] Add HybridISO support for PyGrub2
Date: Tue, 25 Oct 2011 12:33:41 +0200
User-Agent: KMail/1.9.10 (enterprise35 20100903.1171286)
References: <201110251057.06774.hahn@univention.de>
	<1319534259.3385.224.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319534259.3385.224.camel@zakaz.uk.xensource.com>
X-KMail-QuotePrefix: > 
MIME-Version: 1.0
Message-Id: <201110251233.45315.hahn@univention.de>
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="===============0968419898=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0968419898==
Content-Type: multipart/signed; boundary="nextPart11695233.mM0l5UuBvS";
	protocol="application/pgp-signature"; micalg=pgp-sha1
Content-Transfer-Encoding: 7bit

--nextPart11695233.mM0l5UuBvS
Content-Type: text/plain;
  charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hello Ian,

Am Dienstag 25 Oktober 2011 11:17:38 schrieb Ian Campbell:
> On Tue, 2011-10-25 at 09:56 +0100, Philipp Hahn wrote:
> > 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 the
> > DOS partition table and uses the first partition instead of the complete
> > ISO file.
>
> Is the problem here that, having detected a DOS partition, pygrub is
> then unwilling to accept that the partition contains an ISO9660 file
> system?

PyGrub chcks for the DOS partition table by reading the last two bytes of t=
he=20
first 512 byte sector. Since the HybridISO has a valid partition table, the=
=20
first partition starting at offset 512 is used instead of the full image=20
starting at offset 0.

> Or is it that the DOS partition table covers something other=20
> than the ISO9660 data?

As far as I understood it, the partition covers the same area of the iso to=
=20
protect it from accidently trashing the data on the stick. But since it has=
=20
different sector sizes (512 vs 2048) and offsets (512 vs. 0), the data=20
actually looks like garbage (at least "file" detects nothing)

> Where does the kernel we want to boot actually=20
> live?

In the ISO starting at offset 0.

> Is there some reference to the layout of an hybridiso?

You might want to take a look at syslinux from hpa; his web-page still seem=
s=20
to be unaccessable.
<http://forum.avira.com/wbb/index.php?page=3DThread&threadID=3D99493> has a=
 short=20
summary.

> i.e. what is the  significance on 0x8006?

It's what "file" does to detect ISO-Images. At offset 0x8000 the ISO 9660=20
Primary Volume Descriptor starts. From offset [2..6[ is the "id", which mos=
t=20
often is "CD001". See=20
<http://users.telenet.be/it3.consultants.bvba/handouts/ISO9960.html> for a=
=20
complete spec.

> What are the chances of false positives?=20

Existing, but small: 1:2^40.
As fas as I know many Linux distributions use the HybridISO trick. I've rea=
d=20
from Debian, Ubuntu, Arch Linux,Gentoo. But they don't seem to use PyGrub=20
with Xen for PV installations ;-)

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/

--nextPart11695233.mM0l5UuBvS
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)

iEYEABECAAYFAk6mkIUACgkQYPlgoZpUDjlmPACgvq8S/gJ1Pd6rIds2E2vkn+om
VFMAniPRYkUqYPgmgbGjVx/ZrUq5lpUp
=gK/X
-----END PGP SIGNATURE-----

--nextPart11695233.mM0l5UuBvS--


--===============0968419898==
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

--===============0968419898==--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 04:12:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 04:12:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIew9-0001tq-4e; Tue, 25 Oct 2011 04:12:53 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIets-0001ec-9R
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 04:11:41 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1319541028!1471474!1
X-Originating-IP: [213.199.154.141]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11276 invoked from network); 25 Oct 2011 11:10:29 -0000
Received: from db3ehsobe003.messaging.microsoft.com (HELO
	DB3EHSOBE003.bigfish.com) (213.199.154.141)
	by server-9.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	25 Oct 2011 11:10:29 -0000
Received: from mail60-db3-R.bigfish.com (10.3.81.246) by
	DB3EHSOBE003.bigfish.com (10.3.84.23) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 11:10:23 +0000
Received: from mail60-db3 (localhost.localdomain [127.0.0.1])	by
	mail60-db3-R.bigfish.com (Postfix) with ESMTP id B6E2B1C9846B	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 11:10:25 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzzz32i668h839h)
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 mail60-db3 (localhost.localdomain [127.0.0.1]) by mail60-db3
	(MessageSwitch) id 1319540978999809_28236;
	Tue, 25 Oct 2011 11:09:38 +0000 (UTC)
Received: from DB3EHSMHS004.bigfish.com (unknown [10.3.81.252])	by
	mail60-db3.bigfish.com (Postfix) with ESMTP id ED686CF004F	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 11:09:38 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	DB3EHSMHS004.bigfish.com (10.3.87.104) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 11:09:33 +0000
X-WSS-ID: 0LTMCBY-01-1SD-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 27B01102825B	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 06:09:33 -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, 25 Oct 2011 06:09:42 -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, 25 Oct 2011 06:09:35 -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, 25 Oct 2011
	07:08:58 -0400
Message-ID: <4EA698C8.8030603@amd.com>
Date: Tue, 25 Oct 2011 13:08:56 +0200
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>
Content-Type: text/plain; charset="ISO-8859-15"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Subject: [Xen-devel] xen kernel: build failure
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

Compiling the xen kernel fails with:

xen/arch/x86/domain.c: In function 'alloc_domain_struct'
xen/arch/x86/domain.c:191: error: negative width in bit-field '<anonymous>'

Removing the line

BUILD_BUG_ON(sizeof(*d) > PAGE_SIZE);

makes xen kernel compile again.


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 Tue Oct 25 05:36:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 05:36:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIgEk-0005QC-IR; Tue, 25 Oct 2011 05:36:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIgEE-0005Dt-RO
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 05:35:39 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319546135!36631552!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13957 invoked from network); 25 Oct 2011 12:35:35 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 12:35:35 -0000
Received: by wyi11 with SMTP id 11so593687wyi.30
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 05:35:35 -0700 (PDT)
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=rKOk+vKoJCEJRRSvA9/WgXe8YKP7I6LuXdyjPrD7clA=;
	b=P8fzsd1ZEHa6LbZ82isZJRMg80SocHLKQLOgZYGsnsI4I3y8rB1zqINY0CDVGN4gMW
	qV7V0DrwEz0wUrDeDAELLeuIVB5qoHeu31grOx77aNDnPE4UvRXgAn60mHke4FNr1wV0
	scLqrjBE2bleZABhtvfEVNTK3lAJ5g57CRBjc=
Received: by 10.227.209.21 with SMTP id ge21mr3494879wbb.6.1319546135212;
	Tue, 25 Oct 2011 05:35:35 -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 fo7sm44820205wbb.20.2011.10.25.05.35.31
	(version=SSLv3 cipher=OTHER); Tue, 25 Oct 2011 05:35:33 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Tue, 25 Oct 2011 13:35:27 +0100
Subject: Re: [Xen-devel] xen kernel: build failure
From: Keir Fraser <keir.xen@gmail.com>
To: Christoph Egger <Christoph.Egger@amd.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CACC6B9F.23926%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] xen kernel: build failure
Thread-Index: AcyTEpLjNusr7+qD50SdC48MHdav8Q==
In-Reply-To: <4EA698C8.8030603@amd.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 25/10/2011 12:08, "Christoph Egger" <Christoph.Egger@amd.com> wrote:

> 
> Hi,
> 
> Compiling the xen kernel fails with:
> 
> xen/arch/x86/domain.c: In function 'alloc_domain_struct'
> xen/arch/x86/domain.c:191: error: negative width in bit-field '<anonymous>'

Problem is that struct domain has grown bigger than a page for some reason,
in your build environment.

I can't reproduce this.

> Removing the line
> 
> BUILD_BUG_ON(sizeof(*d) > PAGE_SIZE);
> 
> makes xen kernel compile again.

But not actually work properly. We only allocate a single page for the
domain struct. If the struct is bigger than a page, you'll get memory
corruption at run time.

 -- Keir

> 
> Christoph
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 06:08:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:08:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIgjm-0006Y8-De; Tue, 25 Oct 2011 06:08:14 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIgiV-0006Jy-Ey
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:06:59 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1319548012!922212!1
X-Originating-IP: [213.199.154.206]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24828 invoked from network); 25 Oct 2011 13:06:52 -0000
Received: from am1ehsobe003.messaging.microsoft.com (HELO
	AM1EHSOBE003.bigfish.com) (213.199.154.206)
	by server-11.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	25 Oct 2011 13:06:52 -0000
Received: from mail7-am1-R.bigfish.com (10.3.201.245) by
	AM1EHSOBE003.bigfish.com (10.3.204.23) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:06:47 +0000
Received: from mail7-am1 (localhost.localdomain [127.0.0.1])	by
	mail7-am1-R.bigfish.com (Postfix) with ESMTP id 6F8B3107031F	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:06:49 +0000 (UTC)
X-SpamScore: 3
X-BigFish: VPS3(zz8d0Ic8kzz1202hzz8275bhz32i668h839h944h61h)
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 mail7-am1 (localhost.localdomain [127.0.0.1]) by mail7-am1
	(MessageSwitch) id 1319548008805800_18123;
	Tue, 25 Oct 2011 13:06:48 +0000 (UTC)
Received: from AM1EHSMHS015.bigfish.com (unknown [10.3.201.254])	by
	mail7-am1.bigfish.com (Postfix) with ESMTP id BFCEA398050	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:06:48 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	AM1EHSMHS015.bigfish.com (10.3.207.153) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:06:44 +0000
X-WSS-ID: 0LTMHR9-02-GNH-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 27E1FC8254	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 08:06:44 -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;
	Tue, 25 Oct 2011 08:06:53 -0500
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;
	Tue, 25 Oct 2011 08:06:46 -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; Tue, 25 Oct 2011
	09:06:44 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id DDCCE49C623	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 14:06:43 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id CE242594882; Tue, 25 Oct 2011
	15:06:43 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 217c4a82b202975c2fdff9ae499f065471e5c87b
Message-ID: <217c4a82b202975c2fdf.1319548053@gran.amd.com>
In-Reply-To: <patchbomb.1319548052@gran.amd.com>
References: <patchbomb.1319548052@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Tue, 25 Oct 2011 15:07:33 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 1 of 6] 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 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.

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) += vtd
 subdir-$(ia64) += vtd
 subdir-$(x86) += amd
+subdir-$(x86) += x86
 
 obj-y += iommu.o
 obj-y += 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);
 
 #ifdef CONFIG_X86_64
-extern bool_t ats_enabled;
-
 struct acpi_drhd_unit * find_ats_dev_drhd(struct iommu *iommu);
 
 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);
 
 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"
 
 #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"
 
 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;
@@ -121,97 +80,6 @@ int ats_device(int seg, int bus, int dev
     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 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 += 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 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 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));
+}
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 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 _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_ */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 06:09:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:09:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIgkt-0006vj-QY; Tue, 25 Oct 2011 06:09:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIgie-0006Ki-Gs
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:07:05 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319548008!52444362!1
X-Originating-IP: [65.55.88.11]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11392 invoked from network); 25 Oct 2011 13:06: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;
	25 Oct 2011 13:06:49 -0000
Received: from mail179-tx2-R.bigfish.com (10.9.14.248) by
	TX2EHSOBE002.bigfish.com (10.9.40.22) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:06:55 +0000
Received: from mail179-tx2 (localhost.localdomain [127.0.0.1])	by
	mail179-tx2-R.bigfish.com (Postfix) with ESMTP id 86426D9045C	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:06:57 +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 mail179-tx2 (localhost.localdomain [127.0.0.1]) by mail179-tx2
	(MessageSwitch) id 131954801751293_28839;
	Tue, 25 Oct 2011 13:06:57 +0000 (UTC)
Received: from TX2EHSMHS019.bigfish.com (unknown [10.9.14.238])	by
	mail179-tx2.bigfish.com (Postfix) with ESMTP id DD88A124804B	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:06:56 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS019.bigfish.com (10.9.99.119) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:06:53 +0000
X-WSS-ID: 0LTMHRI-02-GOE-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 2BEE3C8250	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 08:06:53 -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;
	Tue, 25 Oct 2011 08:07:03 -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;
	Tue, 25 Oct 2011 08:06:55 -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; Tue, 25 Oct 2011
	09:06:45 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 2102C49C627	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 14:06:44 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 10611594885; Tue, 25 Oct 2011
	15:06:44 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 3dc5e805d9142cbe1074610879e258b6fab43409
Message-ID: <3dc5e805d9142cbe1074.1319548056@gran.amd.com>
In-Reply-To: <patchbomb.1319548052@gran.amd.com>
References: <patchbomb.1319548052@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Tue, 25 Oct 2011 15:07:36 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 4 of 6] 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 1319472696 -7200
# Node ID 3dc5e805d9142cbe1074610879e258b6fab43409
# Parent  18088bd3e8f6c16b7aef3d8652f2b9878117fcd5
ats: Add new ATS helper functions

Signed-off-by Wei Wang <wei.wang2@amd.com>

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));
 }
 
+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;
+}
+
+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;
+}
+
+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;
+}
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;
 
 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);
 
 #endif /* _X86_ATS_H_ */


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 06:10:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:10:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIglm-0007Iw-Dk; Tue, 25 Oct 2011 06:10:18 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIgig-0006Kp-PI
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:07:08 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1319548022!149973!1
X-Originating-IP: [65.55.88.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11035 invoked from network); 25 Oct 2011 13:07:03 -0000
Received: from tx2ehsobe003.messaging.microsoft.com (HELO
	TX2EHSOBE006.bigfish.com) (65.55.88.13)
	by server-13.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	25 Oct 2011 13:07:03 -0000
Received: from mail63-tx2-R.bigfish.com (10.9.14.250) by
	TX2EHSOBE006.bigfish.com (10.9.40.26) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:06:56 +0000
Received: from mail63-tx2 (localhost.localdomain [127.0.0.1])	by
	mail63-tx2-R.bigfish.com (Postfix) with ESMTP id 956D512402F5	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:06:59 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h62h)
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 mail63-tx2 (localhost.localdomain [127.0.0.1]) by mail63-tx2
	(MessageSwitch) id 1319548019453297_11093;
	Tue, 25 Oct 2011 13:06:59 +0000 (UTC)
Received: from TX2EHSMHS023.bigfish.com (unknown [10.9.14.241])	by
	mail63-tx2.bigfish.com (Postfix) with ESMTP id 5FCF0193804B	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:06:59 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS023.bigfish.com (10.9.99.123) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:06:53 +0000
X-WSS-ID: 0LTMHRH-01-8TJ-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 2C54F1028267	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 08:06:53 -0500 (CDT)
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, 25 Oct 2011 08:07:02 -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;
	Tue, 25 Oct 2011 08:06:55 -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; Tue, 25 Oct 2011
	09:06:44 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id EDF1949C625	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 14:06:43 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id DE043594883; Tue, 25 Oct 2011
	15:06:43 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0d17087f9e495c1b9eb43bc0f6a21319097f3043
Message-ID: <0d17087f9e495c1b9eb4.1319548054@gran.amd.com>
In-Reply-To: <patchbomb.1319548052@gran.amd.com>
References: <patchbomb.1319548052@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Tue, 25 Oct 2011 15:07:34 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 2 of 6] ats: Remove VTD prefix from debug output
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319472689 -7200
# Node ID 0d17087f9e495c1b9eb43bc0f6a21319097f3043
# Parent  217c4a82b202975c2fdff9ae499f065471e5c87b
ats: Remove VTD prefix from debug output.

Signed-off-by: Wei Wang <wei.wang2@amd.com>

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, 
     BUG_ON(!pos);
 
     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));
 
@@ -99,7 +99,7 @@ int enable_ats_device(int seg, int bus, 
     }
 
     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
     }
 
     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));
 }
+


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 06:11:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:11:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIgmd-0007g1-Rb; Tue, 25 Oct 2011 06:11:11 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIgig-0006Ko-OF
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:07:08 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1319547996!54639636!1
X-Originating-IP: [65.55.88.11]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32335 invoked from network); 25 Oct 2011 13:06:37 -0000
Received: from tx2ehsobe001.messaging.microsoft.com (HELO
	TX2EHSOBE002.bigfish.com) (65.55.88.11)
	by server-6.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	25 Oct 2011 13:06:37 -0000
Received: from mail95-tx2-R.bigfish.com (10.9.14.241) by
	TX2EHSOBE002.bigfish.com (10.9.40.22) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:06:57 +0000
Received: from mail95-tx2 (localhost.localdomain [127.0.0.1])	by
	mail95-tx2-R.bigfish.com (Postfix) with ESMTP id BCF26153023A	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:06:59 +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 mail95-tx2 (localhost.localdomain [127.0.0.1]) by mail95-tx2
	(MessageSwitch) id 1319548019460323_19914;
	Tue, 25 Oct 2011 13:06:59 +0000 (UTC)
Received: from TX2EHSMHS023.bigfish.com (unknown [10.9.14.237])	by
	mail95-tx2.bigfish.com (Postfix) with ESMTP id 57D411180053	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:06:59 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS023.bigfish.com (10.9.99.123) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:06:53 +0000
X-WSS-ID: 0LTMHRI-02-GOH-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 229CEC8254	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 08:06:54 -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;
	Tue, 25 Oct 2011 08:07:03 -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;
	Tue, 25 Oct 2011 08:06: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; Tue, 25 Oct 2011
	09:06:45 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 4414749C628	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 14:06:44 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 2278B594886; Tue, 25 Oct 2011
	15:06:44 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 8ec947b278afaf89acadf905237c95ba7b64524a
Message-ID: <8ec947b278afaf89acad.1319548057@gran.amd.com>
In-Reply-To: <patchbomb.1319548052@gran.amd.com>
References: <patchbomb.1319548052@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Tue, 25 Oct 2011 15:07:37 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 5 of 6] 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 1319472700 -7200
# Node ID 8ec947b278afaf89acadf905237c95ba7b64524a
# Parent  3dc5e805d9142cbe1074610879e258b6fab43409
amd iommu: add iotlb invalidation command

Signed-off-by: Wei Wang <wei.wang2@amd.com>

diff -r 3dc5e805d914 -r 8ec947b278af xen/drivers/passthrough/amd/iommu_map.c
--- a/xen/drivers/passthrough/amd/iommu_map.c	Mon Oct 24 18:11:36 2011 +0200
+++ b/xen/drivers/passthrough/amd/iommu_map.c	Mon Oct 24 18:11:40 2011 +0200
@@ -23,6 +23,7 @@
 #include <xen/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
+#include "../x86/ats.h"
 
 static int queue_iommu_command(struct amd_iommu *iommu, u32 cmd[])
 {
@@ -128,6 +129,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 +966,62 @@ 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 = (ats_pdev->bus << 8) | 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);
+}
+
+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 +1040,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 3dc5e805d914 -r 8ec947b278af 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:36 2011 +0200
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h	Mon Oct 24 18:11:40 2011 +0200
@@ -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 3dc5e805d914 -r 8ec947b278af 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:36 2011 +0200
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h	Mon Oct 24 18:11:40 2011 +0200
@@ -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 Tue Oct 25 06:12:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06: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 1RIgnh-0008Bi-L4; Tue, 25 Oct 2011 06:12:17 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIgin-0006LM-J8
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:07:15 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1319548030!993753!1
X-Originating-IP: [213.199.154.204]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26424 invoked from network); 25 Oct 2011 13:07:10 -0000
Received: from am1ehsobe001.messaging.microsoft.com (HELO
	AM1EHSOBE001.bigfish.com) (213.199.154.204)
	by server-12.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	25 Oct 2011 13:07:10 -0000
Received: from mail111-am1-R.bigfish.com (10.3.201.242) by
	AM1EHSOBE001.bigfish.com (10.3.204.21) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:07:05 +0000
Received: from mail111-am1 (localhost.localdomain [127.0.0.1])	by
	mail111-am1-R.bigfish.com (Postfix) with ESMTP id DB8D28B03DB	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:07:07 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzzz1202hzz8275bhz32i668h839h944h)
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 mail111-am1 (localhost.localdomain [127.0.0.1]) by mail111-am1
	(MessageSwitch) id 1319548019396990_7994;
	Tue, 25 Oct 2011 13:06:59 +0000 (UTC)
Received: from AM1EHSMHS003.bigfish.com (unknown [10.3.201.251])	by
	mail111-am1.bigfish.com (Postfix) with ESMTP id 4FA731500057	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:06:59 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	AM1EHSMHS003.bigfish.com (10.3.207.103) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:06:55 +0000
X-WSS-ID: 0LTMHRI-01-8TM-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 2DACA1028264	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 08:06:54 -0500 (CDT)
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, 25 Oct 2011 08:07:03 -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;
	Tue, 25 Oct 2011 08:06: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; Tue, 25 Oct 2011
	09:06:46 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 56B5849C629	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 14:06:44 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 442165940FF; Tue, 25 Oct 2011
	15:06:44 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: b84967db0efb875bca4d95f47fc77b46cd065665
Message-ID: <b84967db0efb875bca4d.1319548058@gran.amd.com>
In-Reply-To: <patchbomb.1319548052@gran.amd.com>
References: <patchbomb.1319548052@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Tue, 25 Oct 2011 15:07:38 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 6 of 6] 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 1319472702 -7200
# Node ID b84967db0efb875bca4d95f47fc77b46cd065665
# Parent  8ec947b278afaf89acadf905237c95ba7b64524a
amd iommu: enable ats devices

Signed-off-by: Wei Wang <wei.wang2@amd.com

diff -r 8ec947b278af -r b84967db0efb xen/drivers/passthrough/amd/iommu_map.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] = 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 8ec947b278af -r b84967db0efb 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 +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"
 
 struct amd_iommu *find_iommu_for_device(int seg, int bdf)
 {
@@ -81,11 +82,12 @@ static void disable_translation(u32 *dte
 }
 
 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 = 1;
+    int dte_i = 0;
 
     struct hvm_iommu *hd = domain_hvm_iommu(domain);
 
@@ -94,8 +96,11 @@ 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);
+    req_id = get_dma_requestor_id(iommu->seg, (bus << 8) | devfn);
     dte = iommu->dev_table.buffer + (req_id * IOMMU_DEV_TABLE_ENTRY_SIZE);
 
     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);
 
+        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,6 +126,21 @@ 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) && ats_enabled &&
+         !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);
+
+        if ( pdev )
+            amd_iommu_flush_iotlb(pdev, INV_IOMMU_ALL_PAGES_ADDRESS, 0);
+    }
 }
 
 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 = find_iommu_for_device(pdev->seg, bdf);
 
     if ( likely(iommu != NULL) )
-        amd_iommu_setup_domain_device(pdev->domain, iommu, bdf);
+        amd_iommu_setup_domain_device(pdev->domain, iommu, pdev->bus, 
+                                      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);
 }
 
-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, u8 bus, u8 devfn)
 {
     void *dte;
     unsigned long flags;
     int req_id;
 
     BUG_ON ( iommu->dev_table.buffer == NULL );
-    req_id = get_dma_requestor_id(iommu->seg, bdf);
+
+    req_id = get_dma_requestor_id(iommu->seg, (bus << 8) | devfn);
     dte = iommu->dev_table.buffer + (req_id * IOMMU_DEV_TABLE_ENTRY_SIZE);
 
     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_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 +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 && 
+         pci_ats_enabled(iommu->seg, bus, devfn) )
+       disable_ats_device(iommu->seg, bus, devfn); 
 }
 
 static int reassign_device( struct domain *source, struct domain *target,
@@ -310,7 +345,7 @@ static int reassign_device( struct domai
         return -ENODEV;
     }
 
-    amd_iommu_disable_domain_device(source, iommu, bdf);
+    amd_iommu_disable_domain_device(source, iommu, bus, devfn);
 
     list_move(&pdev->domain_list, &target->arch.pdev_list);
     pdev->domain = target;
@@ -320,7 +355,7 @@ static int reassign_device( struct domai
     if ( t->root_table == NULL )
         allocate_domain_resources(t);
 
-    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;
     }
 
-    amd_iommu_setup_domain_device(pdev->domain, iommu, bdf);
+    amd_iommu_setup_domain_device(pdev->domain, iommu, 
+                                  pdev->bus, pdev->devfn);
     return 0;
 }
 
@@ -454,7 +490,8 @@ static int amd_iommu_remove_device(struc
         return -ENODEV;
     }
 
-    amd_iommu_disable_domain_device(pdev->domain, iommu, bdf);
+    amd_iommu_disable_domain_device(pdev->domain, iommu, 
+                                    pdev->bus, pdev->devfn);
     return 0;
 }
 
diff -r 8ec947b278af -r b84967db0efb 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 +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);
 
 /* 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 Tue Oct 25 06:13:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:13:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIgob-00007j-BA; Tue, 25 Oct 2011 06:13:13 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIgj5-0006OE-Ky
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:07:32 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319548047!691894!1
X-Originating-IP: [65.55.88.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18662 invoked from network); 25 Oct 2011 13:07:28 -0000
Received: from tx2ehsobe003.messaging.microsoft.com (HELO
	TX2EHSOBE005.bigfish.com) (65.55.88.13)
	by server-11.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	25 Oct 2011 13:07:28 -0000
Received: from mail61-tx2-R.bigfish.com (10.9.14.249) by
	TX2EHSOBE005.bigfish.com (10.9.40.25) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:07:20 +0000
Received: from mail61-tx2 (localhost.localdomain [127.0.0.1])	by
	mail61-tx2-R.bigfish.com (Postfix) with ESMTP id E767C11202C9	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:07:22 +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
X-FB-SS: 0,
Received: from mail61-tx2 (localhost.localdomain [127.0.0.1]) by mail61-tx2
	(MessageSwitch) id 1319548021504320_28365;
	Tue, 25 Oct 2011 13:07:01 +0000 (UTC)
Received: from TX2EHSMHS023.bigfish.com (unknown [10.9.14.243])	by
	mail61-tx2.bigfish.com (Postfix) with ESMTP id 08E3F6B0053	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:07:00 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS023.bigfish.com (10.9.99.123) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:06:55 +0000
X-WSS-ID: 0LTMHRH-01-8TH-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 2832B1028262	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 08:06:53 -0500 (CDT)
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, 25 Oct 2011 08:07:02 -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;
	Tue, 25 Oct 2011 08:06:55 -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; Tue, 25 Oct 2011
	09:06:44 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 106E649C626	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 14:06:44 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id EE0FE594884; Tue, 25 Oct 2011
	15:06:43 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 18088bd3e8f6c16b7aef3d8652f2b9878117fcd5
Message-ID: <18088bd3e8f6c16b7aef.1319548055@gran.amd.com>
In-Reply-To: <patchbomb.1319548052@gran.amd.com>
References: <patchbomb.1319548052@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Tue, 25 Oct 2011 15:07:35 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 3 of 6] 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 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
+
 #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 Tue Oct 25 06:14:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:14:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIgpO-0000VW-OE; Tue, 25 Oct 2011 06:14:02 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIgjN-0006Rt-0Y
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:07:50 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319548043!49671583!1
X-Originating-IP: [65.55.88.11]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6141 invoked from network); 25 Oct 2011 13:07:24 -0000
Received: from tx2ehsobe001.messaging.microsoft.com (HELO
	TX2EHSOBE001.bigfish.com) (65.55.88.11)
	by server-8.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	25 Oct 2011 13:07:24 -0000
Received: from mail151-tx2-R.bigfish.com (10.9.14.251) by
	TX2EHSOBE001.bigfish.com (10.9.40.21) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:07:39 +0000
Received: from mail151-tx2 (localhost.localdomain [127.0.0.1])	by
	mail151-tx2-R.bigfish.com (Postfix) with ESMTP id A523AD383BF	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:07:41 +0000 (UTC)
X-SpamScore: -3
X-BigFish: VPS-3(zzc89bh4015Lzz1202hzzz32i668h839h61h)
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 mail151-tx2 (localhost.localdomain [127.0.0.1]) by mail151-tx2
	(MessageSwitch) id 1319548006432371_30887;
	Tue, 25 Oct 2011 13:06:46 +0000 (UTC)
Received: from TX2EHSMHS019.bigfish.com (unknown [10.9.14.246])	by
	mail151-tx2.bigfish.com (Postfix) with ESMTP id 61107ED804F	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 13:06:46 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS019.bigfish.com (10.9.99.119) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 13:06:43 +0000
X-WSS-ID: 0LTMHR8-01-8SJ-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 2CEE41028258	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 08:06:43 -0500 (CDT)
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;
	Tue, 25 Oct 2011 08:06:53 -0500
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;
	Tue, 25 Oct 2011 08:06:45 -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; Tue, 25 Oct 2011
	09:06:44 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id D648949C266	for
	<xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 14:06:43 +0100 (BST)
Received: from gran.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id BAA105940FF; Tue, 25 Oct 2011
	15:06:43 +0200 (CEST)
Content-Type: text/plain; charset="iso-8859-1"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Message-ID: <patchbomb.1319548052@gran.amd.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Tue, 25 Oct 2011 15:07:32 +0200
From: Wei Wang <wei.wang2@amd.com>
To: <xen-devel@lists.xensource.com>
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH 0 of 6] amd iommu: Add ATS support (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

This patch set enables ats devices on amd systems with following changes:
1) Move vendor independent ATS codes into xen/drivers/passthrough/x86/.
2) Add new ATS helper functions.
3) Add amd specific enablement.

The 2nd try fixes ats code location issue pointed out by Jan. Please review.

Thanks,
Wei

--
Advanced Micro Devices GmbH
Sitz: Dornach, Gemeinde Aschheim, =

Landkreis M=FCnchen Registergericht M=FCnchen, =

HRB Nr. 43632 WEEE Registrierungsnummer 129 19551
Gesch=E4ftsf=FChrer:
Alberto Bozzo



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 06:16:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:16:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIgsE-00010w-4I; Tue, 25 Oct 2011 06:16:58 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIgrI-0000o8-42
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:16:02 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-8.tower-21.messagelabs.com!1319548556!1615322!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26030 invoked from network); 25 Oct 2011 13:15:57 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 13:15:57 -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=eRXDCqwz/gImZ3ZmcjEWF87lFgP8XhLuc0Pa3tXC9jx5PndhjHwGwzU3
	WfPEah+l4HI64jCJyMquQKp79os1WGybrmWlZvE7M/SzjJLL9Q+rfmpma
	wFePwkIo2ngQXYcUd1Rl1w+iT38vvyOxBdflGn5KPDLhWSdBbOkpgQVIJ
	M9MiR6XE3uIvt9wq05Om22CLI2psT5K4fgbkIR4/vlXQBVFgICu9j1zZ9
	eALxspLppNfmLBfS4eMd8kW34PofD;
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=1319548557; x=1351084557;
	h=message-id:date:from:mime-version:to:subject:
	content-transfer-encoding;
	bh=/qQlFUxwSevY7NKH3kOuHuKZVJl+4yjAEBQ0fL3cbQc=;
	b=IX444g3QysJYgq0VLZ+ayznr4tX3FNrSFxKkFfAkWlBAmssX5272R40u
	4GCJybb5ynfrw9+jSxP4WdPQzPyFQZzrYSJ/74etcwuG9fJAwN88G3zy0
	Qf5avJHuWZ767r0PauRhtR78DEY/5nnIxVRv/MEDadTp7flbr6ddZQC4k
	HQzpSKCOBmfmtRYezwwrmRXziRWWotkXFNNgBCQZurJ/ZZn8DYnQQWOkQ
	Xzu3y3kxfQe4mJRNNb01fl0BdulsS;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,403,1315173600"; d="scan'208";a="77505838"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate20u.abg.fsc.net with ESMTP; 25 Oct 2011 15:15:56 +0200
X-IronPort-AV: E=Sophos;i="4.69,404,1315173600"; d="scan'208";a="122296349"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 25 Oct 2011 15:15:56 +0200
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id A059D9F818
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 15:15:56 +0200 (CEST)
Message-ID: <4EA6B68C.8050404@ts.fujitsu.com>
Date: Tue, 25 Oct 2011 15:15:56 +0200
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] xm save fails to save all 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

Hi,

in preparation to support live migration for BS2000 I'm testing my domU (HVM
with PV-drivers) with xm save/restore. I'm running xen 4.0.2 (from SLES11 SP1).

During xm save I see the following line in xend.log:

[2011-10-25 13:25:25 31519] INFO (XendCheckpoint:484) Saving memory pages: 
iter 1   0%type fail: page 510 mfn 000011fe

I added some diagnostic code to the hypervisor (in arch/x86/domctl.c) and found
that the hypervisor believes gmfn 11fe of the domU is part of the xen heap.

The problem is always reported for gmfn 11fe, regardless of the memory size of
the domU: I tried 1, 2 and 8 GB. The memory page isn't used for anything
special in the domU, there is no problem accessing it or mapping it to dom0
before doing the xm save (or after xm save -c).

When I try to restore the saved domain I can't map gmfn 11fe of the domU any
longer in dom0 (this was the first hint there is a problem at all).

How can a domU memory page be part of the xen heap?


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 Oct 25 06:33:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:33:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIh8Q-0002YF-W7; Tue, 25 Oct 2011 06:33:43 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIh7q-0002GP-SF
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:33:07 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319549583!1586760!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26357 invoked from network); 25 Oct 2011 13:33:03 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 13:33:03 -0000
Received: by wwf10 with SMTP id 10so701035wwf.24
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 06:33:03 -0700 (PDT)
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=Lz+SFSWcaCwC/zNOtRMwjpQlfvjgqsnUYRlgu8rmwOo=;
	b=cZP7nKUwYNOYtSVgvbSHu/yJPxcKIBNWZuUZeK1pLqSQOX8q3+pQ1WBbL9mwSu1iNG
	sJ9X5mYMubgBBAITVSFp5CLdH3rF2dlF6/ChqLJdiphnytXGhoo3JhNPtdXyCOh247bX
	7rWGJmhGibKLX215QPCVCQljgJhSBSEzNJozA=
Received: by 10.216.210.216 with SMTP id u66mr3784742weo.45.1319549583543;
	Tue, 25 Oct 2011 06:33:03 -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 gd18sm45146033wbb.5.2011.10.25.06.32.59
	(version=SSLv3 cipher=OTHER); Tue, 25 Oct 2011 06:33:02 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Tue, 25 Oct 2011 14:32:55 +0100
Subject: Re: [Xen-devel] xm save fails to save all pages
From: Keir Fraser <keir.xen@gmail.com>
To: Juergen Gross <juergen.gross@ts.fujitsu.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Message-ID: <CACC7917.23936%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] xm save fails to save all pages
Thread-Index: AcyTGpoOAzceerCIYk6lDyQRH9DNbA==
In-Reply-To: <4EA6B68C.8050404@ts.fujitsu.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 25/10/2011 14:15, "Juergen Gross" <juergen.gross@ts.fujitsu.com> wrote:

> in preparation to support live migration for BS2000 I'm testing my domU (HVM
> with PV-drivers) with xm save/restore. I'm running xen 4.0.2 (from SLES11
> SP1).
> 
> During xm save I see the following line in xend.log:
> 
> [2011-10-25 13:25:25 31519] INFO (XendCheckpoint:484) Saving memory pages:
> iter 1   0%type fail: page 510 mfn 000011fe
> 
> I added some diagnostic code to the hypervisor (in arch/x86/domctl.c) and
> found
> that the hypervisor believes gmfn 11fe of the domU is part of the xen heap.
> 
> The problem is always reported for gmfn 11fe, regardless of the memory size of
> the domU: I tried 1, 2 and 8 GB. The memory page isn't used for anything
> special in the domU, there is no problem accessing it or mapping it to dom0
> before doing the xm save (or after xm save -c).
> 
> When I try to restore the saved domain I can't map gmfn 11fe of the domU any
> longer in dom0 (this was the first hint there is a problem at all).
> 
> How can a domU memory page be part of the xen heap?

It could be the domain's shared-info page, or one of its grant-table pages.
It doesn't make sense to save/restore such pages -- they get reconstructed
appropriately on the receiving end, by the toolstack and/or by the domain
itself when it resumes execution.

 -- Keir




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 06:35:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:35:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIhAP-00030M-U9; Tue, 25 Oct 2011 06:35:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIh9v-0002oR-MH
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:35:16 -0700
X-Env-Sender: yang.z.zhang@intel.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319549685!50526886!1
X-Originating-IP: [134.134.136.20]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2511 invoked from network); 25 Oct 2011 13:34:46 -0000
Received: from mga02.intel.com (HELO mga02.intel.com) (134.134.136.20)
	by server-5.tower-27.messagelabs.com with SMTP;
	25 Oct 2011 13:34:46 -0000
Received: from orsmga002.jf.intel.com ([10.7.209.21])
	by orsmga101.jf.intel.com with ESMTP; 25 Oct 2011 06:34:58 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,351,1309762800"; d="scan'208";a="66682907"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by orsmga002.jf.intel.com with ESMTP; 25 Oct 2011 06:34:57 -0700
Received: from shsmsx601.ccr.corp.intel.com (10.239.4.112) by
	pgsmsx602.gar.corp.intel.com (10.221.43.81) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Tue, 25 Oct 2011 21:34:56 +0800
Received: from shsmsx501.ccr.corp.intel.com ([10.239.4.141]) by
	shsmsx601.ccr.corp.intel.com ([10.239.4.112]) with mapi;
	Tue, 25 Oct 2011 21:34:55 +0800
From: "Zhang, Yang Z" <yang.z.zhang@intel.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Tue, 25 Oct 2011 21:34:54 +0800
Thread-Topic: [PATCH] pm : provide CC7/PC2 residency
Thread-Index: AcyTGt/EODFrvI8PRX2HjMhTTPTodg==
Message-ID: <749B9D3DBF0F054390025D9EAFF47F2212D2A848E5@shsmsx501.ccr.corp.intel.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: "'Keir Fraser \(keir.xen@gmail.com\)'" <keir.xen@gmail.com>
Subject: [Xen-devel] [PATCH] pm : provide CC7/PC2 residency
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

x86 pm : provide CC7/PC2 residency

Sandy bridge introduces new MSR to get cc7/pc2 residency (core C-state 7/pa=
ckage C-state 2). Print the cc7/pc2 residency when on sandy bridge platform=
.

Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>

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;

 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;

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/10000=
00UL);
+            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");
 }

@@ -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 / 10000=
00UL,
                            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 / 10000=
00UL,
+                           100UL * res / (double)sum_cx[j]);
                     printf("\n");

                 }
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 @@

 #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 */

 static void lapic_timer_nop(void) { }
 static void (*lapic_timer_off)(void);
@@ -85,11 +87,13 @@

 struct hw_residencies
 {
+    uint64_t pc2;
     uint64_t pc3;
     uint64_t pc6;
     uint64_t pc7;
     uint64_t cc3;
     uint64_t cc6;
+    uint64_t cc7;
 };

 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:
+        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;
     }
 }

@@ -134,10 +149,10 @@

     get_hw_residencies(cpu, &hw_res);

-    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);
 }

 static char* acpi_cstate_method_name[] =3D
@@ -1057,11 +1072,13 @@
              copy_to_guest_offset(stat->residencies, 0, &res, 1) )
             return -EFAULT;

+        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;
     }

@@ -1086,11 +1103,13 @@

     get_hw_residencies(cpuid, &hw_res);

+    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;

     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;
 };

 struct xen_sysctl_get_pmstat {

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 06:37:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:37:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIhCU-0003OS-5W; Tue, 25 Oct 2011 06:37:54 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIhBy-0003Ca-MF
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:37:23 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1319549839!700537!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11294 invoked from network); 25 Oct 2011 13:37:19 -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;
	25 Oct 2011 13:37:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8572577"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 13:37: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, 25 Oct 2011 14:37:19 +0100
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 1RIhBu-0006CZ-Ie;
	Tue, 25 Oct 2011 13:37:18 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIhBu-0007Yq-Dn;
	Tue, 25 Oct 2011 14:37:18 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9609-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 25 Oct 2011 14:37:18 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9609: 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 9609 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9609/

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-i386-i386-xl-win        13 guest-stop                   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-amd64-amd64-win         16 leak-check/check             fail   never pass

version targeted for testing:
 xen                  81e39a4978ea
baseline version:
 xen                  d4253bc5418b

------------------------------------------------------------
People who touched revisions under test:
  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-4.1-testing
+ revision=81e39a4978ea
+ . 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 81e39a4978ea
+ branch=xen-4.1-testing
+ revision=81e39a4978ea
+ . 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 81e39a4978ea 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 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 Tue Oct 25 06:43:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:43:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIhIN-0004W4-EO; Tue, 25 Oct 2011 06:43:59 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIhHj-0004K9-HF
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:43:19 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1319550180!45686373!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14915 invoked from network); 25 Oct 2011 13:43:01 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 13:43:01 -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=XBmJ+iJgAaEN+8cB1CryYQC86KM474Bp6tkdf3BkisUmtT3i0mNijQmR
	f3vLxd1QWZykD2pFlIkwLi8qFeFMqAMmpf77zPO9DzbCRUxSNMwnT7vqc
	L2ZlmstWX4qCUPTXwE2DlrN2xFAddfJ9I2gsVVYtek8hXSWJEYdXFwjc4
	KSl3JUjAIP2TPeX/eDWvG7gqWILcmv0FCT+QPnCmY2ZJCMma4sPbl7nl/
	N3k/pWtgmVmNLYIK9Ve/lvYJBCPLf;
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=1319550196; x=1351086196;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=Cd5hQBYeDDUSay+L9zluybHN+KIOM+qXYkvQ4rpv3YM=;
	b=L8Bb8vEpShK+rjWCalNaCZE/CCsscEbwi77PBQEIQ1ZKy2CJPR5wf9Jz
	4O8qFmJVBMhVB96ORxCnnBxDrz8y3X9H7jtbVRYUmlVquRmd36kQc2az/
	8rMrtPydWVY246p05fdFuHaMg5WwIxQHupY9y+4eddZtNUjCgn/ChjL1k
	QA9SGKgukO9bfTCjP1xt0J89YvGGuQv8kkZYCPQorqCDiPtwQeg0vcYuO
	nqqnJhckNAx7hPcPWPHa2EoLmjuZ7;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,403,1315173600"; d="scan'208";a="77509227"
Received: from abgdgate40u.abg.fsc.net ([172.25.138.90])
	by dgate20u.abg.fsc.net with ESMTP; 25 Oct 2011 15:43:16 +0200
X-IronPort-AV: E=Sophos;i="4.69,404,1315173600"; d="scan'208";a="122299858"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate40u.abg.fsc.net with ESMTP; 25 Oct 2011 15:43:16 +0200
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 21D1EA1C20;
	Tue, 25 Oct 2011 15:43:16 +0200 (CEST)
Message-ID: <4EA6BCF4.6090601@ts.fujitsu.com>
Date: Tue, 25 Oct 2011 15:43:16 +0200
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: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] xm save fails to save all pages
References: <CACC7917.23936%keir.xen@gmail.com>
In-Reply-To: <CACC7917.23936%keir.xen@gmail.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 10/25/2011 03:32 PM, Keir Fraser wrote:
> On 25/10/2011 14:15, "Juergen Gross"<juergen.gross@ts.fujitsu.com>  wrote:
>
>> in preparation to support live migration for BS2000 I'm testing my domU (HVM
>> with PV-drivers) with xm save/restore. I'm running xen 4.0.2 (from SLES11
>> SP1).
>>
>> During xm save I see the following line in xend.log:
>>
>> [2011-10-25 13:25:25 31519] INFO (XendCheckpoint:484) Saving memory pages:
>> iter 1   0%type fail: page 510 mfn 000011fe
>>
>> I added some diagnostic code to the hypervisor (in arch/x86/domctl.c) and
>> found
>> that the hypervisor believes gmfn 11fe of the domU is part of the xen heap.
>>
>> The problem is always reported for gmfn 11fe, regardless of the memory size of
>> the domU: I tried 1, 2 and 8 GB. The memory page isn't used for anything
>> special in the domU, there is no problem accessing it or mapping it to dom0
>> before doing the xm save (or after xm save -c).
>>
>> When I try to restore the saved domain I can't map gmfn 11fe of the domU any
>> longer in dom0 (this was the first hint there is a problem at all).
>>
>> How can a domU memory page be part of the xen heap?
> It could be the domain's shared-info page, or one of its grant-table pages.
> It doesn't make sense to save/restore such pages -- they get reconstructed
> appropriately on the receiving end, by the toolstack and/or by the domain
> itself when it resumes execution.

Thanks! It IS a grant-table page.


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 Oct 25 06:49:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:49:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIhNy-0005An-8B; Tue, 25 Oct 2011 06:49:46 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIhNF-0004yI-VZ
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:49:02 -0700
X-Env-Sender: tknchris@gmail.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319550537!36645201!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9072 invoked from network); 25 Oct 2011 13:48:58 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 13:48:58 -0000
Received: by iaen33 with SMTP id n33so823695iae.30
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 06:48:57 -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=76CNHBQIp3DH30UDGmCboyXdL5HbmUeGoF4iaUfb8/I=;
	b=WBTcClb7Y+XmkI2PqBIlu8X1Dhs1kzBAAx3rQ80tOtkHTrqLChEOBBbWjEF7U4iCvU
	eqzpuo5Gq6PHAf7VtBIHNePLxrXQ/CFUzFTYpZHJJisX68hW6VUYxzDaxqXixLPHoOuG
	OS9b8+v6zIRU7gdAANVeHIK2zT/aCTxhiICN4=
MIME-Version: 1.0
Received: by 10.42.155.70 with SMTP id t6mr5714641icw.38.1319550537101; Tue,
	25 Oct 2011 06:48:57 -0700 (PDT)
Received: by 10.42.171.135 with HTTP; Tue, 25 Oct 2011 06:48:57 -0700 (PDT)
In-Reply-To: <1319529895.3385.210.camel@zakaz.uk.xensource.com>
References: <CAKnNFz_iB8yGcV-CWcg1is=KnfHjrrHqcvZGGeTF0YyLDUxbNg@mail.gmail.com>
	<1319529895.3385.210.camel@zakaz.uk.xensource.com>
Date: Tue, 25 Oct 2011 09:48:57 -0400
Message-ID: <CAKnNFz_pkYGwfyw=zRsD=RM2DL4dUywxemHBNRAyDm96UDfqBg@mail.gmail.com>
Subject: Re: [Xen-devel] Feature idea
From: chris <tknchris@gmail.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: Xen-Devel List <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="===============0152939876=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0152939876==
Content-Type: multipart/alternative; boundary=90e6ba1eff4a06f10104b01fcdd2

--90e6ba1eff4a06f10104b01fcdd2
Content-Type: text/plain; charset=ISO-8859-1

Cool thanks, I knew I couldn't be the first to think of it :) I will check
it out

On Tue, Oct 25, 2011 at 4:04 AM, Ian Campbell <Ian.Campbell@citrix.com>wrote:

> On Tue, 2011-10-25 at 01:30 +0100, chris wrote:
> > Is there any mechanism to give a.domU memory from dom0 swap? It would
> > be neat/useful if we could utilize that to test things in a vm with
> > more RAM than is.physically available. Obviously performance wouldn't
> > be.stellar.but it would still have some usefulness
>
> The xenpaging feature which some folks are working on allows guest RAM
> to be swapped to a file in dom0.
>
> It lives in tools/xenpaging. There's been loads of work on it since 4.1,
> mainly by Olaf Hering.
>
> Ian.
>
>

--90e6ba1eff4a06f10104b01fcdd2
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Cool thanks, I knew I couldn&#39;t be the first to think of it :) I will ch=
eck it out<br><br><div class=3D"gmail_quote">On Tue, Oct 25, 2011 at 4:04 A=
M, Ian Campbell <span 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:1p=
x #ccc solid;padding-left:1ex;"><div><div></div><div class=3D"h5">On Tue, 2=
011-10-25 at 01:30 +0100, chris wrote:<br>
&gt; Is there any mechanism to give a.domU memory from dom0 swap? It would<=
br>
&gt; be neat/useful if we could utilize that to test things in a vm with<br=
>
&gt; more RAM than is.physically available. Obviously performance wouldn&#3=
9;t<br>
&gt; be.stellar.but it would still have some usefulness<br>
<br>
</div></div>The xenpaging feature which some folks are working on allows gu=
est RAM<br>
to be swapped to a file in dom0.<br>
<br>
It lives in tools/xenpaging. There&#39;s been loads of work on it since 4.1=
,<br>
mainly by Olaf Hering.<br>
<font color=3D"#888888"><br>
Ian.<br>
<br>
</font></blockquote></div><br>

--90e6ba1eff4a06f10104b01fcdd2--


--===============0152939876==
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

--===============0152939876==--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 06:53:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 06:53:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIhRo-0005as-BO; Tue, 25 Oct 2011 06:53:44 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIhR2-0005OF-FY
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 06:52:56 -0700
X-Env-Sender: tknchris@gmail.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319550772!36620991!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22081 invoked from network); 25 Oct 2011 13:52:53 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 13:52:53 -0000
Received: by iaen33 with SMTP id n33so829028iae.30
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 06:52:51 -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=icbgru2zR1eKc9YToEcmy9MBSRKrlTCSfWK35RJ8LJQ=;
	b=CEv4qBm2kq7g5vj89CSQMxxA6KU98J2bI/conKvwvm1e6+GReGqJt0A9R83NPXJrMI
	X0U9mdvD/oGw6UVecd7KvUPBJzY0Ba5a3oZRkwvLpTyZCQibf0klVUPFqobjtOQ6pX9G
	nvA/1NTi1MuHIYQekKjgJGjklfN8ldyVkYfp0=
MIME-Version: 1.0
Received: by 10.42.180.138 with SMTP id bu10mr23844958icb.22.1319550771732;
	Tue, 25 Oct 2011 06:52:51 -0700 (PDT)
Received: by 10.42.171.135 with HTTP; Tue, 25 Oct 2011 06:52:51 -0700 (PDT)
In-Reply-To: <CAKnNFz_pkYGwfyw=zRsD=RM2DL4dUywxemHBNRAyDm96UDfqBg@mail.gmail.com>
References: <CAKnNFz_iB8yGcV-CWcg1is=KnfHjrrHqcvZGGeTF0YyLDUxbNg@mail.gmail.com>
	<1319529895.3385.210.camel@zakaz.uk.xensource.com>
	<CAKnNFz_pkYGwfyw=zRsD=RM2DL4dUywxemHBNRAyDm96UDfqBg@mail.gmail.com>
Date: Tue, 25 Oct 2011 09:52:51 -0400
Message-ID: <CAKnNFz96T_LUKCj506AvcgqZL9+aajQ2=afD=9jik0s-TP92XA@mail.gmail.com>
Subject: Re: [Xen-devel] Feature idea
From: chris <tknchris@gmail.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Cc: olaf@aepfle.de, Xen-Devel List <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="===============0643251890=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0643251890==
Content-Type: multipart/alternative; boundary=90e6ba6e8f4e0321a604b01fdb1d

--90e6ba6e8f4e0321a604b01fdb1d
Content-Type: text/plain; charset=ISO-8859-1

Is there any documentation on it somewhere? Couldn't find anything in the
tools/xenpaging dir or on the wiki

On Tue, Oct 25, 2011 at 9:48 AM, chris <tknchris@gmail.com> wrote:

> Cool thanks, I knew I couldn't be the first to think of it :) I will check
> it out
>
>
> On Tue, Oct 25, 2011 at 4:04 AM, Ian Campbell <Ian.Campbell@citrix.com>wrote:
>
>> On Tue, 2011-10-25 at 01:30 +0100, chris wrote:
>> > Is there any mechanism to give a.domU memory from dom0 swap? It would
>> > be neat/useful if we could utilize that to test things in a vm with
>> > more RAM than is.physically available. Obviously performance wouldn't
>> > be.stellar.but it would still have some usefulness
>>
>> The xenpaging feature which some folks are working on allows guest RAM
>> to be swapped to a file in dom0.
>>
>> It lives in tools/xenpaging. There's been loads of work on it since 4.1,
>> mainly by Olaf Hering.
>>
>> Ian.
>>
>>
>

--90e6ba6e8f4e0321a604b01fdb1d
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Is there any documentation on it somewhere? Couldn&#39;t find anything in t=
he tools/xenpaging dir or on the wiki<br><br><div class=3D"gmail_quote">On =
Tue, Oct 25, 2011 at 9:48 AM, chris <span dir=3D"ltr">&lt;<a href=3D"mailto=
:tknchris@gmail.com">tknchris@gmail.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;">Cool thanks, I knew I couldn&#39;t be the f=
irst to think of it :) I will check it out<div><div></div><div class=3D"h5"=
><br>
<br><div class=3D"gmail_quote">On Tue, Oct 25, 2011 at 4:04 AM, Ian Campbel=
l <span dir=3D"ltr">&lt;<a href=3D"mailto:Ian.Campbell@citrix.com" target=
=3D"_blank">Ian.Campbell@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"><div><div></div><div>On Tue, 2011-10-25 at 0=
1:30 +0100, chris wrote:<br>
&gt; Is there any mechanism to give a.domU memory from dom0 swap? It would<=
br>
&gt; be neat/useful if we could utilize that to test things in a vm with<br=
>
&gt; more RAM than is.physically available. Obviously performance wouldn&#3=
9;t<br>
&gt; be.stellar.but it would still have some usefulness<br>
<br>
</div></div>The xenpaging feature which some folks are working on allows gu=
est RAM<br>
to be swapped to a file in dom0.<br>
<br>
It lives in tools/xenpaging. There&#39;s been loads of work on it since 4.1=
,<br>
mainly by Olaf Hering.<br>
<font color=3D"#888888"><br>
Ian.<br>
<br>
</font></blockquote></div><br>
</div></div></blockquote></div><br>

--90e6ba6e8f4e0321a604b01fdb1d--


--===============0643251890==
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

--===============0643251890==--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 07:45:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 07:45:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIiFo-0000d7-8X; Tue, 25 Oct 2011 07:45:24 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIiF9-0000QD-Ez
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 07:44:43 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319553880!1598400!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5438 invoked from network); 25 Oct 2011 14:44:40 -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;
	25 Oct 2011 14:44:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8574441"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 14:44:40 +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, 25 Oct 2011 15:44:40 +0100
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
	1RIiF6-0006ZM-1D; Tue, 25 Oct 2011 14:44:40 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIiF6-00005T-05;
	Tue, 25 Oct 2011 15:44:40 +0100
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: <20134.52055.925444.153629@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 15:44:39 +0100
To: Roger Pau =?iso-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH] tools/check: check for headers and
	libraries in EXTRA_INCLUDES and EXTRA_LIB
In-Reply-To: <CAPLaKK71zs+0aPd2A6yM_+OPtEfMJZnK2KyHANFxFXgDjms8qQ@mail.gmail.com>
References: <8fe2ca552de44aa679be.1318512275@loki>
	<20124.19527.706498.819017@mariner.uk.xensource.com>
	<CAPLaKK6=nU4R62KvxK++XGNx0zff89TNYZkTFizZ1wDbMqUBNg@mail.gmail.com>
	<20125.32034.710835.32455@mariner.uk.xensource.com>
	<CAPLaKK71zs+0aPd2A6yM_+OPtEfMJZnK2KyHANFxFXgDjms8qQ@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

Roger Pau Monné writes ("Re: [Xen-devel] [PATCH] tools/check: check for headers and libraries in EXTRA_INCLUDES and EXTRA_LIB"):
> And variables where not passed to executed script.

mariner:~/junk> cat t.make
export TEST=value

target:
        printenv | grep TEST
mariner:~/junk> make -f t.make target
printenv | grep TEST
TEST=value
mariner:~/junk>


Or if you prefer documentation, here is what Debian's
make-doc-non-dfsg 3.81-5 has to say:

  5.7.2 Communicating Variables to a Sub-`make'
  ---------------------------------------------

  ...

     To pass down, or "export", a variable, `make' adds the variable and
  its value to the environment for running each command.  The sub-`make',
  in turn, uses the environment to initialize its table of variable
  values.  *Note Variables from the Environment: Environment.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 08:21:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 08:21:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIip9-00038W-1J; Tue, 25 Oct 2011 08:21:55 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIiny-0002v6-LN
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 08:20:49 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1319556018!48111434!1
X-Originating-IP: [213.199.154.204]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19178 invoked from network); 25 Oct 2011 15:20:19 -0000
Received: from am1ehsobe001.messaging.microsoft.com (HELO
	AM1EHSOBE001.bigfish.com) (213.199.154.204)
	by server-12.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	25 Oct 2011 15:20:19 -0000
Received: from mail45-am1-R.bigfish.com (10.3.201.240) by
	AM1EHSOBE001.bigfish.com (10.3.204.21) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 15:20:33 +0000
Received: from mail45-am1 (localhost.localdomain [127.0.0.1])	by
	mail45-am1-R.bigfish.com (Postfix) with ESMTP id 73FE71200424;
	Tue, 25 Oct 2011 15:20:36 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzc85dhzz1202hzz8275bhz32i668h839h34h)
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,13,
Received: from mail45-am1 (localhost.localdomain [127.0.0.1]) by mail45-am1
	(MessageSwitch) id 1319555996660434_20341;
	Tue, 25 Oct 2011 15:19:56 +0000 (UTC)
Received: from AM1EHSMHS001.bigfish.com (unknown [10.3.201.241])	by
	mail45-am1.bigfish.com (Postfix) with ESMTP id 9878A13C004E;
	Tue, 25 Oct 2011 15:19:56 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	AM1EHSMHS001.bigfish.com (10.3.207.101) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 15:19:49 +0000
X-WSS-ID: 0LTMNX2-02-CS9-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 2062FC8254;	Tue, 25 Oct 2011 10:19:49 -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, 25 Oct 2011 10:19:59 -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;
	Tue, 25 Oct 2011 10:19:52 -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; Tue, 25 Oct 2011
	11:19:34 -0400
Message-ID: <4EA6D384.9060506@amd.com>
Date: Tue, 25 Oct 2011 17:19:32 +0200
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>, Keir
	Fraser <keir@xen.org>
Content-Type: multipart/mixed; boundary="------------020302090201040100090201"
X-OriginatorOrg: amd.com
Cc: 
Subject: [Xen-devel] [PATCH] xen: cleanup hvm io
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------020302090201040100090201
Content-Type: text/plain; charset="ISO-8859-15"; format=flowed
Content-Transfer-Encoding: 7bit


Move HVM io fields into a structure.
On MMIO instruction failure print out some more bytes.

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

--------------020302090201040100090201
Content-Type: text/plain; name="xen_hvm_io.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="xen_hvm_io.diff"
Content-Description: xen_hvm_io.diff

diff -r 0f95fb74e19d xen/arch/x86/hvm/emulate.c
--- a/xen/arch/x86/hvm/emulate.c	Tue Oct 25 12:44:49 2011 +0200
+++ b/xen/arch/x86/hvm/emulate.c	Tue Oct 25 17:04:05 2011 +0200
@@ -56,6 +56,7 @@ static int hvmemul_do_io(
     paddr_t value = ram_gpa;
     int value_is_ptr = (p_data == NULL);
     struct vcpu *curr = current;
+    struct hvm_vcpu_io *vio;
     ioreq_t *p = get_ioreq(curr);
     unsigned long ram_gfn = paddr_to_pfn(ram_gpa);
     p2m_type_t p2mt;
@@ -91,43 +92,45 @@ static int hvmemul_do_io(
         p_data = NULL;
     }
 
+    vio = &curr->arch.hvm_vcpu.hvm_io;
+
     if ( is_mmio && !value_is_ptr )
     {
         /* Part of a multi-cycle read or write? */
         if ( dir == IOREQ_WRITE )
         {
-            paddr_t pa = curr->arch.hvm_vcpu.mmio_large_write_pa;
-            unsigned int bytes = curr->arch.hvm_vcpu.mmio_large_write_bytes;
+            paddr_t pa = vio->mmio_large_write_pa;
+            unsigned int bytes = vio->mmio_large_write_bytes;
             if ( (addr >= pa) && ((addr + size) <= (pa + bytes)) )
                 return X86EMUL_OKAY;
         }
         else
         {
-            paddr_t pa = curr->arch.hvm_vcpu.mmio_large_read_pa;
-            unsigned int bytes = curr->arch.hvm_vcpu.mmio_large_read_bytes;
+            paddr_t pa = vio->mmio_large_read_pa;
+            unsigned int bytes = vio->mmio_large_read_bytes;
             if ( (addr >= pa) && ((addr + size) <= (pa + bytes)) )
             {
-                memcpy(p_data, &curr->arch.hvm_vcpu.mmio_large_read[addr - pa],
+                memcpy(p_data, &vio->mmio_large_read[addr - pa],
                        size);
                 return X86EMUL_OKAY;
             }
         }
     }
 
-    switch ( curr->arch.hvm_vcpu.io_state )
+    switch ( vio->io_state )
     {
     case HVMIO_none:
         break;
     case HVMIO_completed:
-        curr->arch.hvm_vcpu.io_state = HVMIO_none;
+        vio->io_state = HVMIO_none;
         if ( p_data == NULL )
             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 == (curr->arch.hvm_vcpu.mmio_large_write_pa +
-                       curr->arch.hvm_vcpu.mmio_large_write_bytes)) )
+             (addr == (vio->mmio_large_write_pa +
+                       vio->mmio_large_write_bytes)) )
             return X86EMUL_RETRY;
     default:
         return X86EMUL_UNHANDLEABLE;
@@ -140,9 +143,9 @@ static int hvmemul_do_io(
         return X86EMUL_UNHANDLEABLE;
     }
 
-    curr->arch.hvm_vcpu.io_state =
+    vio->io_state =
         (p_data == NULL) ? HVMIO_dispatched : HVMIO_awaiting_completion;
-    curr->arch.hvm_vcpu.io_size = size;
+    vio->io_size = size;
 
     p->dir = dir;
     p->data_is_ptr = value_is_ptr;
@@ -173,12 +176,12 @@ static int hvmemul_do_io(
         *reps = p->count;
         p->state = STATE_IORESP_READY;
         hvm_io_assist();
-        curr->arch.hvm_vcpu.io_state = HVMIO_none;
+        vio->io_state = HVMIO_none;
         break;
     case X86EMUL_UNHANDLEABLE:
         rc = X86EMUL_RETRY;
         if ( !hvm_send_assist_req(curr) )
-            curr->arch.hvm_vcpu.io_state = HVMIO_none;
+            vio->io_state = HVMIO_none;
         else if ( p_data == NULL )
             rc = X86EMUL_OKAY;
         break;
@@ -191,33 +194,32 @@ static int hvmemul_do_io(
 
  finish_access:
     if ( p_data != NULL )
-        memcpy(p_data, &curr->arch.hvm_vcpu.io_data, size);
+        memcpy(p_data, &vio->io_data, size);
 
     if ( is_mmio && !value_is_ptr )
     {
         /* Part of a multi-cycle read or write? */
         if ( dir == IOREQ_WRITE )
         {
-            paddr_t pa = curr->arch.hvm_vcpu.mmio_large_write_pa;
-            unsigned int bytes = curr->arch.hvm_vcpu.mmio_large_write_bytes;
+            paddr_t pa = vio->mmio_large_write_pa;
+            unsigned int bytes = vio->mmio_large_write_bytes;
             if ( bytes == 0 )
-                pa = curr->arch.hvm_vcpu.mmio_large_write_pa = addr;
+                pa = vio->mmio_large_write_pa = addr;
             if ( addr == (pa + bytes) )
-                curr->arch.hvm_vcpu.mmio_large_write_bytes += size;
+                vio->mmio_large_write_bytes += size;
         }
         else
         {
-            paddr_t pa = curr->arch.hvm_vcpu.mmio_large_read_pa;
-            unsigned int bytes = curr->arch.hvm_vcpu.mmio_large_read_bytes;
+            paddr_t pa = vio->mmio_large_read_pa;
+            unsigned int bytes = vio->mmio_large_read_bytes;
             if ( bytes == 0 )
-                pa = curr->arch.hvm_vcpu.mmio_large_read_pa = addr;
+                pa = vio->mmio_large_read_pa = addr;
             if ( (addr == (pa + bytes)) &&
                  ((bytes + size) <
-                  sizeof(curr->arch.hvm_vcpu.mmio_large_read)) )
+                  sizeof(vio->mmio_large_read)) )
             {
-                memcpy(&curr->arch.hvm_vcpu.mmio_large_read[addr - pa],
-                       p_data, size);
-                curr->arch.hvm_vcpu.mmio_large_read_bytes += size;
+                memcpy(&vio->mmio_large_read[addr - pa], p_data, size);
+                vio->mmio_large_read_bytes += size;
             }
         }
     }
@@ -401,6 +403,7 @@ static int __hvmemul_read(
     struct vcpu *curr = current;
     unsigned long addr, reps = 1;
     uint32_t pfec = PFEC_page_present;
+    struct hvm_vcpu_io *vio = &curr->arch.hvm_vcpu.hvm_io;
     paddr_t gpa;
     int rc;
 
@@ -409,13 +412,12 @@ static int __hvmemul_read(
     if ( rc != X86EMUL_OKAY )
         return rc;
 
-    if ( unlikely(curr->arch.hvm_vcpu.mmio_gva == (addr & PAGE_MASK)) &&
-         curr->arch.hvm_vcpu.mmio_gva )
+    if ( unlikely(vio->mmio_gva == (addr & PAGE_MASK)) && vio->mmio_gva )
     {
         unsigned int off = addr & (PAGE_SIZE - 1);
         if ( access_type == hvm_access_insn_fetch )
             return X86EMUL_UNHANDLEABLE;
-        gpa = (((paddr_t)curr->arch.hvm_vcpu.mmio_gpfn << PAGE_SHIFT) | off);
+        gpa = (((paddr_t)vio->mmio_gpfn << PAGE_SHIFT) | off);
         if ( (off + bytes) <= PAGE_SIZE )
             return hvmemul_do_mmio(gpa, &reps, bytes, 0,
                                    IOREQ_READ, 0, p_data);
@@ -500,6 +502,7 @@ static int hvmemul_write(
     struct vcpu *curr = current;
     unsigned long addr, reps = 1;
     uint32_t pfec = PFEC_page_present | PFEC_write_access;
+    struct hvm_vcpu_io *vio = &curr->arch.hvm_vcpu.hvm_io;
     paddr_t gpa;
     int rc;
 
@@ -508,11 +511,10 @@ static int hvmemul_write(
     if ( rc != X86EMUL_OKAY )
         return rc;
 
-    if ( unlikely(curr->arch.hvm_vcpu.mmio_gva == (addr & PAGE_MASK)) &&
-         curr->arch.hvm_vcpu.mmio_gva )
+    if ( unlikely(vio->mmio_gva == (addr & PAGE_MASK)) && vio->mmio_gva )
     {
         unsigned int off = addr & (PAGE_SIZE - 1);
-        gpa = (((paddr_t)curr->arch.hvm_vcpu.mmio_gpfn << PAGE_SHIFT) | off);
+        gpa = (((paddr_t)vio->mmio_gpfn << PAGE_SHIFT) | off);
         if ( (off + bytes) <= PAGE_SIZE )
             return hvmemul_do_mmio(gpa, &reps, bytes, 0,
                                    IOREQ_WRITE, 0, p_data);
@@ -530,7 +532,7 @@ static int hvmemul_write(
         return X86EMUL_EXCEPTION;
     case HVMCOPY_unhandleable:
         return X86EMUL_UNHANDLEABLE;
-    case  HVMCOPY_bad_gfn_to_mfn:
+    case HVMCOPY_bad_gfn_to_mfn:
         rc = hvmemul_linear_to_phys(
             addr, &gpa, bytes, &reps, pfec, hvmemul_ctxt);
         if ( rc != X86EMUL_OKAY )
@@ -1011,6 +1013,7 @@ int hvm_emulate_one(
     struct cpu_user_regs *regs = hvmemul_ctxt->ctxt.regs;
     struct vcpu *curr = current;
     uint32_t new_intr_shadow, pfec = PFEC_page_present;
+    struct hvm_vcpu_io *vio = &curr->arch.hvm_vcpu.hvm_io;
     unsigned long addr;
     int rc;
 
@@ -1048,8 +1051,7 @@ int hvm_emulate_one(
     rc = x86_emulate(&hvmemul_ctxt->ctxt, &hvm_emulate_ops);
 
     if ( rc != X86EMUL_RETRY )
-        curr->arch.hvm_vcpu.mmio_large_read_bytes =
-            curr->arch.hvm_vcpu.mmio_large_write_bytes = 0;
+        vio->mmio_large_read_bytes = vio->mmio_large_write_bytes = 0;
 
     if ( rc != X86EMUL_OKAY )
         return rc;
diff -r 0f95fb74e19d xen/arch/x86/hvm/io.c
--- a/xen/arch/x86/hvm/io.c	Tue Oct 25 12:44:49 2011 +0200
+++ b/xen/arch/x86/hvm/io.c	Tue Oct 25 17:04:05 2011 +0200
@@ -170,28 +171,31 @@ int handle_mmio(void)
 {
     struct hvm_emulate_ctxt ctxt;
     struct vcpu *curr = current;
+    struct hvm_vcpu_io *vio = &curr->arch.hvm_vcpu.hvm_io;
     int rc;
 
     hvm_emulate_prepare(&ctxt, guest_cpu_user_regs());
 
     rc = hvm_emulate_one(&ctxt);
 
-    if ( curr->arch.hvm_vcpu.io_state == HVMIO_awaiting_completion )
-        curr->arch.hvm_vcpu.io_state = HVMIO_handle_mmio_awaiting_completion;
+    if ( vio->io_state == HVMIO_awaiting_completion )
+        vio->io_state = HVMIO_handle_mmio_awaiting_completion;
     else
-        curr->arch.hvm_vcpu.mmio_gva = 0;
+        vio->mmio_gva = 0;
 
     switch ( rc )
     {
     case X86EMUL_UNHANDLEABLE:
         gdprintk(XENLOG_WARNING,
                  "MMIO emulation failed @ %04x:%lx: "
-                 "%02x %02x %02x %02x %02x %02x\n",
+                 "%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
                  hvmemul_get_seg_reg(x86_seg_cs, &ctxt)->sel,
                  ctxt.insn_buf_eip,
                  ctxt.insn_buf[0], ctxt.insn_buf[1],
                  ctxt.insn_buf[2], ctxt.insn_buf[3],
-                 ctxt.insn_buf[4], ctxt.insn_buf[5]);
+                 ctxt.insn_buf[4], ctxt.insn_buf[5],
+                 ctxt.insn_buf[6], ctxt.insn_buf[7],
+                 ctxt.insn_buf[8], ctxt.insn_buf[9]);
         return 0;
     case X86EMUL_EXCEPTION:
         if ( ctxt.exn_pending )
@@ -208,14 +212,16 @@ int handle_mmio(void)
 
 int handle_mmio_with_translation(unsigned long gva, unsigned long gpfn)
 {
-    current->arch.hvm_vcpu.mmio_gva = gva & PAGE_MASK;
-    current->arch.hvm_vcpu.mmio_gpfn = gpfn;
+    struct hvm_vcpu_io *vio = &current->arch.hvm_vcpu.hvm_io;
+    vio->mmio_gva = gva & PAGE_MASK;
+    vio->mmio_gpfn = gpfn;
     return handle_mmio();
 }
 
 int handle_pio(uint16_t port, int size, int dir)
 {
     struct vcpu *curr = current;
+    struct hvm_vcpu_io *vio = &curr->arch.hvm_vcpu.hvm_io;
     unsigned long data, reps = 1;
     int rc;
 
@@ -228,15 +234,14 @@ int handle_pio(uint16_t port, int size, 
     {
     case X86EMUL_OKAY:
         if ( dir == IOREQ_READ )
-            memcpy(&guest_cpu_user_regs()->eax,
-                   &data, curr->arch.hvm_vcpu.io_size);
+            memcpy(&guest_cpu_user_regs()->eax, &data, vio->io_size);
         break;
     case X86EMUL_RETRY:
-        if ( curr->arch.hvm_vcpu.io_state != HVMIO_awaiting_completion )
+        if ( vio->io_state != HVMIO_awaiting_completion )
             return 0;
         /* Completion in hvm_io_assist() with no re-emulation required. */
         ASSERT(dir == IOREQ_READ);
-        curr->arch.hvm_vcpu.io_state = HVMIO_handle_pio_awaiting_completion;
+        vio->io_state = HVMIO_handle_pio_awaiting_completion;
         break;
     default:
         gdprintk(XENLOG_ERR, "Weird HVM ioemulation status %d.\n", rc);
@@ -250,6 +255,7 @@ int handle_pio(uint16_t port, int size, 
 void hvm_io_assist(void)
 {
     struct vcpu *curr = current;
+    struct hvm_vcpu_io *vio = &curr->arch.hvm_vcpu.hvm_io;
     ioreq_t *p = get_ioreq(curr);
     enum hvm_io_state io_state;
 
@@ -257,23 +263,23 @@ void hvm_io_assist(void)
 
     p->state = STATE_IOREQ_NONE;
 
-    io_state = curr->arch.hvm_vcpu.io_state;
-    curr->arch.hvm_vcpu.io_state = HVMIO_none;
+    io_state = vio->io_state;
+    vio->io_state = HVMIO_none;
 
     switch ( io_state )
     {
     case HVMIO_awaiting_completion:
-        curr->arch.hvm_vcpu.io_state = HVMIO_completed;
-        curr->arch.hvm_vcpu.io_data = p->data;
+        vio->io_state = HVMIO_completed;
+        vio->io_data = p->data;
         break;
     case HVMIO_handle_mmio_awaiting_completion:
-        curr->arch.hvm_vcpu.io_state = HVMIO_completed;
-        curr->arch.hvm_vcpu.io_data = p->data;
+        vio->io_state = HVMIO_completed;
+        vio->io_data = p->data;
         (void)handle_mmio();
         break;
     case HVMIO_handle_pio_awaiting_completion:
         memcpy(&guest_cpu_user_regs()->eax,
-               &p->data, curr->arch.hvm_vcpu.io_size);
+               &p->data, vio->io_size);
         break;
     default:
         break;
diff -r 0f95fb74e19d xen/arch/x86/hvm/svm/nestedsvm.c
--- a/xen/arch/x86/hvm/svm/nestedsvm.c	Tue Oct 25 12:44:49 2011 +0200
+++ b/xen/arch/x86/hvm/svm/nestedsvm.c	Tue Oct 25 17:04:05 2011 +0200
@@ -1168,7 +1168,7 @@ enum hvm_intblk nsvm_intr_blocked(struct
          * Delay the injection because this would result in delivering
          * an interrupt *within* the execution of an instruction.
          */
-        if ( v->arch.hvm_vcpu.io_state != HVMIO_none )
+        if ( v->arch.hvm_vcpu.hvm_io.io_state != HVMIO_none )
             return hvm_intblk_shadow;
     }
 
diff -r 0f95fb74e19d xen/arch/x86/hvm/vmx/realmode.c
--- a/xen/arch/x86/hvm/vmx/realmode.c	Tue Oct 25 12:44:49 2011 +0200
+++ b/xen/arch/x86/hvm/vmx/realmode.c	Tue Oct 25 17:04:05 2011 +0200
@@ -172,6 +172,7 @@ void vmx_realmode(struct cpu_user_regs *
     struct vcpu *curr = current;
     struct hvm_emulate_ctxt hvmemul_ctxt;
     struct segment_register *sreg;
+    struct hvm_vcpu_io *vio = &curr->arch.hvm_vcpu.hvm_io;
     unsigned long intr_info;
     unsigned int emulations = 0;
 
@@ -182,7 +183,7 @@ void vmx_realmode(struct cpu_user_regs *
 
     hvm_emulate_prepare(&hvmemul_ctxt, regs);
 
-    if ( curr->arch.hvm_vcpu.io_state == HVMIO_completed )
+    if ( vio->io_state == HVMIO_completed )
         realmode_emulate_one(&hvmemul_ctxt);
 
     /* Only deliver interrupts into emulated real mode. */
@@ -196,7 +197,7 @@ void vmx_realmode(struct cpu_user_regs *
     curr->arch.hvm_vmx.vmx_emulate = 1;
     while ( curr->arch.hvm_vmx.vmx_emulate &&
             !softirq_pending(smp_processor_id()) &&
-            (curr->arch.hvm_vcpu.io_state == HVMIO_none) )
+            (vio->io_state == HVMIO_none) )
     {
         /*
          * Check for pending interrupts only every 16 instructions, because
@@ -221,7 +222,7 @@ void vmx_realmode(struct cpu_user_regs *
     }
 
     /* Need to emulate next time if we've started an IO operation */
-    if ( curr->arch.hvm_vcpu.io_state != HVMIO_none )
+    if ( vio->io_state != HVMIO_none )
         curr->arch.hvm_vmx.vmx_emulate = 1;
 
     if ( !curr->arch.hvm_vmx.vmx_emulate && !curr->arch.hvm_vmx.vmx_realmode )
diff -r 0f95fb74e19d xen/include/asm-x86/hvm/vcpu.h
--- a/xen/include/asm-x86/hvm/vcpu.h	Tue Oct 25 12:44:49 2011 +0200
+++ b/xen/include/asm-x86/hvm/vcpu.h	Tue Oct 25 17:04:05 2011 +0200
@@ -44,6 +44,30 @@ struct hvm_vcpu_asid {
     uint32_t asid;
 };
 
+struct hvm_vcpu_io {
+    /* I/O request in flight to device model. */
+    enum hvm_io_state   io_state;
+    unsigned long       io_data;
+    int                 io_size;
+
+    /*
+     * HVM emulation:
+     *  Virtual address @mmio_gva maps to MMIO physical frame @mmio_gpfn.
+     *  The latter is known to be an MMIO frame (not RAM).
+     *  This translation is only valid if @mmio_gva is non-zero.
+     */
+    unsigned long       mmio_gva;
+    unsigned long       mmio_gpfn;
+
+    /* We may read up to m128 as a number of device-model transactions. */
+    paddr_t mmio_large_read_pa;
+    uint8_t mmio_large_read[16];
+    unsigned int mmio_large_read_bytes;
+    /* We may write up to m128 as a number of device-model transactions. */
+    paddr_t mmio_large_write_pa;
+    unsigned int mmio_large_write_bytes;
+};
+
 #define VMCX_EADDR    (~0ULL)
 
 struct nestedvcpu {
@@ -137,31 +161,11 @@ struct hvm_vcpu {
     /* Which cache mode is this VCPU in (CR0:CD/NW)? */
     u8                  cache_mode;
 
-    /* I/O request in flight to device model. */
-    enum hvm_io_state   io_state;
-    unsigned long       io_data;
-    int                 io_size;
-
-    /*
-     * HVM emulation:
-     *  Virtual address @mmio_gva maps to MMIO physical frame @mmio_gpfn.
-     *  The latter is known to be an MMIO frame (not RAM).
-     *  This translation is only valid if @mmio_gva is non-zero.
-     */
-    unsigned long       mmio_gva;
-    unsigned long       mmio_gpfn;
+    struct hvm_vcpu_io  hvm_io;
 
     /* Callback into x86_emulate when emulating FPU/MMX/XMM instructions. */
     void (*fpu_exception_callback)(void *, struct cpu_user_regs *);
     void *fpu_exception_callback_arg;
-    /* We may read up to m128 as a number of device-model transactions. */
-    paddr_t mmio_large_read_pa;
-    uint8_t mmio_large_read[16];
-    unsigned int mmio_large_read_bytes;
-    /* We may write up to m128 as a number of device-model transactions. */
-    paddr_t mmio_large_write_pa;
-    unsigned int mmio_large_write_bytes;
-
     /* Pending hw/sw interrupt */
     int           inject_trap;       /* -1 for nothing to inject */
     int           inject_error_code;

--------------020302090201040100090201
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

--------------020302090201040100090201--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 08:24:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 08:24:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIirA-0003dP-2z; Tue, 25 Oct 2011 08:24:00 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIiqI-0003PL-88
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 08:23:07 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319556182!53307!1
X-Originating-IP: [65.55.88.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3107 invoked from network); 25 Oct 2011 15:23:03 -0000
Received: from tx2ehsobe005.messaging.microsoft.com (HELO
	TX2EHSOBE010.bigfish.com) (65.55.88.15)
	by server-5.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	25 Oct 2011 15:23:03 -0000
Received: from mail167-tx2-R.bigfish.com (10.9.14.241) by
	TX2EHSOBE010.bigfish.com (10.9.40.30) with Microsoft SMTP Server id
	14.1.225.22; Tue, 25 Oct 2011 15:22:56 +0000
Received: from mail167-tx2 (localhost.localdomain [127.0.0.1])	by
	mail167-tx2-R.bigfish.com (Postfix) with ESMTP id 3FAF45883BC;
	Tue, 25 Oct 2011 15:22:59 +0000 (UTC)
X-SpamScore: -21
X-BigFish: VPS-21(zzbb2dK1447M1432N98dK444fMzz1202hzz8275bhz32i668h839h61h)
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 mail167-tx2 (localhost.localdomain [127.0.0.1]) by mail167-tx2
	(MessageSwitch) id 1319556178868606_29054;
	Tue, 25 Oct 2011 15:22:58 +0000 (UTC)
Received: from TX2EHSMHS037.bigfish.com (unknown [10.9.14.245])	by
	mail167-tx2.bigfish.com (Postfix) with ESMTP id CD9742D0053;
	Tue, 25 Oct 2011 15:22:58 +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; Tue, 25 Oct 2011 15:22:48 +0000
X-WSS-ID: 0LTMO1Z-02-D2D-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 2E8E8FCC070;	Tue, 25 Oct 2011 10:22:47 -0500 (CDT)
Received: from SAUSEXDAG02.amd.com (163.181.55.2) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Tue, 25 Oct 2011 10:22:57 -0500
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, 25 Oct 2011 10:22: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; Tue, 25 Oct 2011
	11:22:49 -0400
Message-ID: <4EA6D445.8030209@amd.com>
Date: Tue, 25 Oct 2011 17:22:45 +0200
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: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] xen kernel: build failure
References: <CACC6B9F.23926%keir.xen@gmail.com>
In-Reply-To: <CACC6B9F.23926%keir.xen@gmail.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 10/25/11 14:35, Keir Fraser wrote:
> On 25/10/2011 12:08, "Christoph Egger"<Christoph.Egger@amd.com>  wrote:
>
>>
>> Hi,
>>
>> Compiling the xen kernel fails with:
>>
>> xen/arch/x86/domain.c: In function 'alloc_domain_struct'
>> xen/arch/x86/domain.c:191: error: negative width in bit-field '<anonymous>'
>
> Problem is that struct domain has grown bigger than a page for some reason,
> in your build environment.

Oh, local changes caused this. Thanks for the hint.

Christoph


>
> I can't reproduce this.
>
>> Removing the line
>>
>> BUILD_BUG_ON(sizeof(*d)>  PAGE_SIZE);
>>
>> makes xen kernel compile again.
>
> But not actually work properly. We only allocate a single page for the
> domain struct. If the struct is bigger than a page, you'll get memory
> corruption at run time.
>
>   -- Keir
>
>>
>> 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 Tue Oct 25 08:32:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 08:32:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIizO-0004Br-7P; Tue, 25 Oct 2011 08:32:30 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIiyl-0003xQ-40
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 08:31:51 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319556708!2364136!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27357 invoked from network); 25 Oct 2011 15:31:48 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 15:31:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8575651"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 15:31: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, 25 Oct 2011 16:31:48 +0100
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
	1RIiyh-0006ph-LI; Tue, 25 Oct 2011 15:31:47 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIiyh-00009k-KQ;
	Tue, 25 Oct 2011 16:31:47 +0100
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: <20134.54883.620815.989672@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 16:31:47 +0100
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 17 of 24] libxl: add
	libxl__spawn_confirm_offspring_startup
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <018f63b6e4863faca16a.1317657294@probook.site>
References: <patchbomb.1317657277@probook.site>
	<018f63b6e4863faca16a.1317657294@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 17 of 24] libxl: add libxl__spawn_confirm_offspring_startup"):
> libxl: add libxl__spawn_confirm_offspring_startup
> 
> libxl__spawn_confirm_offspring_startup() is a generic version of
> libxl__confirm_device_model_startup().

Thanks but I think it would be better to refactor this to avoid the
duplication of this code.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:06:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:06:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIjW4-0006Ns-Gp; Tue, 25 Oct 2011 09:06:16 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIjUp-00069t-Pa
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 09:05:00 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319558696!716024!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5274 invoked from network); 25 Oct 2011 16:04:56 -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;
	25 Oct 2011 16:04:56 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8576491"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 16:04: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, 25 Oct 2011 17:04:56 +0100
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
	1RIjUl-00070w-TN; Tue, 25 Oct 2011 16:04:55 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIjUl-0004na-QK;
	Tue, 25 Oct 2011 17:04:55 +0100
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: <20134.56871.697415.489233@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 17:04:55 +0100
To: Dario Faggioli <raistlin@linux.it>
Subject: Re: [Xen-devel] [PATCH 01 of 27 v3] libxl: add missing "break;
	" to do_pci_remove
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CAAWQecu6Gm0Ku6qNErt+NWDxccDypZaw2g-41yfS90ET6yPEPw@mail.gmail.com>
References: <patchbomb.1318942495@cosworth.uk.xensource.com>
	<e03520648d2c91210d59.1318942496@cosworth.uk.xensource.com>
	<CAAWQecu6Gm0Ku6qNErt+NWDxccDypZaw2g-41yfS90ET6yPEPw@mail.gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: 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

Dario Faggioli writes ("Re: [Xen-devel] [PATCH 01 of 27 v3] libxl: add missing "break; " to do_pci_remove"):
> On Tue, Oct 18, 2011 at 2:54 PM, Ian Campbell <ian.campbell@citrix.com> wrote:
> > libxl: add missing "break;" to do_pci_remove
...
> > Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
> >
> Tested-by: Dario Faggioli <dario.faggioli@citrix.com>

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 Tue Oct 25 09:12:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:12:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIjbj-0006qo-7n; Tue, 25 Oct 2011 09:12:07 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIjbD-0006e1-KF
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 09:11:35 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319559092!36621384!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25573 invoked from network); 25 Oct 2011 16:11:32 -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;
	25 Oct 2011 16:11:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8576673"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 16:11: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, 25 Oct 2011 17:11:32 +0100
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
	1RIjb9-00073O-V3; Tue, 25 Oct 2011 16:11:31 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIjb9-0004oC-UE;
	Tue, 25 Oct 2011 17:11:31 +0100
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: <20134.57267.925456.677251@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 17:11:31 +0100
To: George Dunlap <George.Dunlap@eu.citrix.com>
Subject: Re: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CAFLBxZYiM9_yT1+5nQx=5vTUbE6xLXi0cCLPDLVdhUhmDO5-NA@mail.gmail.com>
References: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@mail.gmail.com>
	<1318947065.3385.26.camel@zakaz.uk.xensource.com>
	<CAFLBxZYiM9_yT1+5nQx=5vTUbE6xLXi0cCLPDLVdhUhmDO5-NA@mail.gmail.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Jonathan, "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>, Ian Campbell <Ian.Campbell@citrix.com>,
	Ludlam <Jonathan.Ludlam@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

George Dunlap writes ("Re: [Xen-devel] RFC: Partially revert xen-unstable c/s 23071:a3466b005017"):
> Yes; it hard-codes the full path of the build tree library file.

That seems a strange thing for it to do.

> You're right, it's actually 23921 that caused the problem.  I just did
> "hg annotate" and found 23071.

Reverting this part of 23921 will just bring back the previous bug,
that the build system might pick up libraries in /usr (or somewhere
else on the default compile-time linker search path).

Is there a way to get the ocaml linker stage to print out the complete
link line it's using ?  If so it'll probably be possible to spot the
difference between the link lines used for the ocaml libraries and
those used elsewhere.  Then we might understand what to fix.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:26:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:26:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIjpx-000882-R1; Tue, 25 Oct 2011 09:26:49 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIjpC-0007vP-UH
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 09:26:03 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319559959!61651!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6255 invoked from network); 25 Oct 2011 16:25:59 -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;
	25 Oct 2011 16:25:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8576976"
Received: from lonpmailmx02.citrite.net ([10.30.203.163])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 16:25:58 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.160]) by
	LONPMAILMX02.citrite.net ([10.30.203.163]) with mapi; Tue, 25 Oct 2011
	17:25:59 +0100
From: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Tue, 25 Oct 2011 17:25:57 +0100
Subject: Re: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
Thread-Topic: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
Thread-Index: AcyTMsaZC2P3kMnrT3K7TYXd+d1wXg==
Message-ID: <382E082A-0E82-4589-BA59-400CC27557DC@eu.citrix.com>
References: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@mail.gmail.com>
	<1318947065.3385.26.camel@zakaz.uk.xensource.com>
	<CAFLBxZYiM9_yT1+5nQx=5vTUbE6xLXi0cCLPDLVdhUhmDO5-NA@mail.gmail.com>
	<20134.57267.925456.677251@mariner.uk.xensource.com>
In-Reply-To: <20134.57267.925456.677251@mariner.uk.xensource.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: George Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.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

It's possible to print out the invocation of gcc by appending a -v on the e=
nd of the ocamlmklib command line.

What would it be best to compare the gcc flags with?

Jon

On 25 Oct 2011, at 17:11, Ian Jackson wrote:

> George Dunlap writes ("Re: [Xen-devel] RFC: Partially revert xen-unstable=
 c/s 23071:a3466b005017"):
>> Yes; it hard-codes the full path of the build tree library file.
>=20
> That seems a strange thing for it to do.
>=20
>> You're right, it's actually 23921 that caused the problem.  I just did
>> "hg annotate" and found 23071.
>=20
> Reverting this part of 23921 will just bring back the previous bug,
> that the build system might pick up libraries in /usr (or somewhere
> else on the default compile-time linker search path).
>=20
> Is there a way to get the ocaml linker stage to print out the complete
> link line it's using ?  If so it'll probably be possible to spot the
> difference between the link lines used for the ocaml libraries and
> those used elsewhere.  Then we might understand what to fix.
>=20
> Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:32:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:32:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIjv4-00008e-QX; Tue, 25 Oct 2011 09:32:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIjuZ-0008Nu-6K
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 09:31:36 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319560271!49703402!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13183 invoked from network); 25 Oct 2011 16:31:11 -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;
	25 Oct 2011 16:31:11 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8577082"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 16:31: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;
	Tue, 25 Oct 2011 17:31:32 +0100
Subject: Re: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Tue, 25 Oct 2011 17:31:31 +0100
In-Reply-To: <20134.57267.925456.677251@mariner.uk.xensource.com>
References: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@mail.gmail.com>
	<1318947065.3385.26.camel@zakaz.uk.xensource.com>
	<CAFLBxZYiM9_yT1+5nQx=5vTUbE6xLXi0cCLPDLVdhUhmDO5-NA@mail.gmail.com>
	<20134.57267.925456.677251@mariner.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: <1319560291.3385.257.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>, "Keir
	\(Xen.org\)" <keir@xen.org>,
	Jonathan Ludlam <Jonathan.Ludlam@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-10-25 at 17:11 +0100, Ian Jackson wrote:
> George Dunlap writes ("Re: [Xen-devel] RFC: Partially revert xen-unstable c/s 23071:a3466b005017"):
> > Yes; it hard-codes the full path of the build tree library file.
> 
> That seems a strange thing for it to do.
> 
> > You're right, it's actually 23921 that caused the problem.  I just did
> > "hg annotate" and found 23071.
> 
> Reverting this part of 23921 will just bring back the previous bug,
> that the build system might pick up libraries in /usr (or somewhere
> else on the default compile-time linker search path).
> 
> Is there a way to get the ocaml linker stage to print out the complete
> link line it's using ?  If so it'll probably be possible to spot the
> difference between the link lines used for the ocaml libraries and
> those used elsewhere.  Then we might understand what to fix.

AIUI when you link an ocaml library it actually bakes in the literal
options which you gave into the result, in order that it can use them
again when you subsequently link an application against that library.
i.e. if you link with -lfoo then a literal "-lfoo" is stored in the
library and reused by the ocaml linker when it invokes gcc to link the
final application

Likewise if you use e.g.
"/home/ianc/devel/xen/tools/ocaml/libs/xc/../../../libxc/libxenctrl.so"
then that will also be baked verbatim into the ocaml library.

I don't see how this can ever be made to work without changing the ocaml
linker, you very much need to specify libraries differently when linking
users which are in tree vs. out of tree and short of teaching ocaml
about that distinction I don't know what we can do. I suppose we could
create two versions of the library (in and out) but that's horrible. But
then so is the whole scheme, iff I understand correctly and it really is
as I describe.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:34:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:34:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIjxC-0000ZP-IJ; Tue, 25 Oct 2011 09:34:18 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RHY6j-00037w-NU
	for xen-devel@lists.xensource.com; Sat, 22 Oct 2011 02:43:14 -0700
X-Env-Sender: thomas@shipmail.org
X-Msg-Ref: server-12.tower-27.messagelabs.com!1319276570!47730609!1
X-Originating-IP: [82.193.160.251]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23910 invoked from network); 22 Oct 2011 09:42:50 -0000
Received: from ns2.gothnet.se (HELO GOTHNET-SMTP2.gothnet.se) (82.193.160.251)
	by server-12.tower-27.messagelabs.com with SMTP;
	22 Oct 2011 09:42:50 -0000
Received: from mail.shipmail.org ([82.193.169.249]) by gothnet.se with
	MailEnable ESMTP; Sat, 22 Oct 2011 11:43:06 +0200
Received: from mail.shipmail.org (localhost [127.0.0.1])
	by mail.shipmail.org (Postfix) with ESMTP id 02B09338079;
	Sat, 22 Oct 2011 11:43:06 +0200 (CEST)
Received: from localhost [127.0.0.1]
	by BitDefender SMTP Proxy on localhost [127.0.0.1]
	for localhost [127.0.0.1]; Sat, 22 Oct 2011 11:43:06 +0200 (CEST)
Received: from linlap1.home.shipmail.org (localhost [127.0.0.1])
	by mail.shipmail.org (Postfix) with ESMTP id 9F1E2338078;
	Sat, 22 Oct 2011 11:43:05 +0200 (CEST)
Message-ID: <4EA28FA6.7000006@shipmail.org>
Date: Sat, 22 Oct 2011 11:40:54 +0200
From: Thomas Hellstrom <thomas@shipmail.org>
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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <1319062772-2793-1-git-send-email-konrad.wilk@oracle.com>
	<1319062772-2793-7-git-send-email-konrad.wilk@oracle.com>
In-Reply-To: <1319062772-2793-7-git-send-email-konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-BitDefender-Scanner: Mail not scanned due to license constraints
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.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

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




On 10/20/2011 12:19 AM, Konrad Rzeszutek Wilk wrote:
> 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.
>
> 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)
>    




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:35:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:35:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIjyQ-0000xo-Az; Tue, 25 Oct 2011 09:35:34 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RI3KY-0004Ar-44
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 12:03:34 -0700
X-Env-Sender: raghavendra.kt@linux.vnet.ibm.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1319396608!36411342!1
X-Originating-IP: [122.248.162.4]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7503 invoked from network); 23 Oct 2011 19:03:30 -0000
Received: from e28smtp04.in.ibm.com (HELO e28smtp04.in.ibm.com) (122.248.162.4)
	by server-13.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 23 Oct 2011 19:03:30 -0000
Received: from d28relay05.in.ibm.com (d28relay05.in.ibm.com [9.184.220.62])
	by e28smtp04.in.ibm.com (8.14.4/8.13.1) with ESMTP id p9NJ3ReY006043
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 00:33:27 +0530
Received: from d28av05.in.ibm.com (d28av05.in.ibm.com [9.184.220.67])
	by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9NJ3RSM3264698
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 00:33:27 +0530
Received: from d28av05.in.ibm.com (loopback [127.0.0.1])
	by d28av05.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9NJ3P2L002870
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 06:03:26 +1100
Received: from oc5400248562.ibm.com ([9.124.222.73])
	by d28av05.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9NJ3LMD002123; Mon, 24 Oct 2011 06:03:22 +1100
From: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
To: Greg Kroah-Hartman <gregkh@suse.de>, Sedat Dilek <sedat.dilek@gmail.com>, 
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	KVM <kvm@vger.kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>, x86@kernel.org,
	"H. Peter Anvin" <hpa@zytor.com>, Dave Jiang <dave.jiang@intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Marcelo Tosatti <mtosatti@redhat.com>, Yinghai Lu <yinghai@kernel.org>, 
	Gleb Natapov <gleb@redhat.com>, Ingo Molnar <mingo@redhat.com>,
	Avi Kivity <avi@redhat.com>, Xen <xen-devel@lists.xensource.com>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Rik van Riel <riel@redhat.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	LKML <linux-kernel@vger.kernel.org>
Date: Mon, 24 Oct 2011 00:33:08 +0530
Message-Id: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Peter Zijlstra <peterz@infradead.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Subject: [Xen-devel] [PATCH RFC V2 0/5] kvm : Paravirt-spinlock support for
	KVM 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

The 5-patch series to follow this email extends KVM-hypervisor and Linux guest 
running on KVM-hypervisor to support pv-ticket spinlocks, based heavily on Xen's implementation.

Two hypercalls are being introduced in KVM hypervisor, one that allows a
vcpu (spinning on a lock) to block and another that allows a vcpu to kick
another out of blocking state.

This is discussed in : (posted by Srivatsa V).
https://lkml.org/lkml/2010/7/26/24
https://lkml.org/lkml/2011/1/19/212

The BASE patch is tip rc9 + Jeremy's following patches.
compare exchange (https://lkml.org/lkml/2011/8/29/321), 
xadd (https://lkml.org/lkml/2011/10/4/328)
x86/ticketlocklock  (https://lkml.org/lkml/2011/10/12/496).

Changes since last posting:
- rebased patchesto -rc9
- synchronization related changes based on Jeremy's changes (Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>) pointed by
Stephan Diestelhorst <stephan.diestelhorst@amd.com>
- enabling 32 bit guests
- splitted patches into two more chunks

Results:

set up : 
Kernel for host/guest : 3.1-rc9 + Jeremys ticketlock cleanup, xadd, pv spinlock patches as BASE

3 guests with 8VCPU, 4GB RAM, 1 used for kernbench (kernbench -f -H -M -o 20) other for cpuhog (shell script while 
true with an instruction)

scenario A: unpinned
scenario B: each vcpu pinned to corresponding cpu

1x: no hogs
2x: 8hogs in one guest
3x: 8hogs each in two guest

Result for Non PLE machine :
Machine : IBM xSeries with Intel(R) Xeon(R) x5570 2.93GHz CPU with 8 core , 64GB RAM
		 BASE                    BASE+patch            %improvement
		 mean (sd)               mean (sd)
Scenario A:	 			
case 1x:	 157.495 (15.2924) 	 148.355 (7.35479) 	5.80336
case 2x:	 761.955 (581.384) 	 247.306 (64.4707) 	67.5432
case 3x:	 2804.36 (2613.57) 	 261.522 (85.0856) 	90.6744

Scenario B				
case 1x:	 1241.86 (812.155) 	 313.805 (140.99) 	74.731
case 2x:	 1277.32 (771.316) 	 308.325 (124.808) 	75.8616
case 3x:	 1239.45 (860.012) 	 307.535 (124.243) 	75.1878

Result for PLE machine:
Machine : IBM xSeries with Intel(R) Xeon(R)  X7560 2.27GHz CPU with 32/64 core, with 8  
         online cores and 4*64GB RAM

		 BASE                    BASE+patch            %improvement
		 mean (sd)               mean (sd)
Scenario A:	 			
case 1x:	 72.7133 (43.7109) 	 70.0734 (37.7866) 	3.63056
case 2x:	 124.138 (79.9515) 	 119.28 (81.3597) 	3.91339
case 3x:	 174.561 (132.209) 	 159.283 (116.232) 	8.75224

Scenario B				
case 1x:	 166.101 (119.313) 	 160.056 (117.446) 	3.63935
case 2x:	 167.421 (120.767) 	 158.133 (115.022) 	5.54769
case 3x:	 169.317 (122.088) 	 159.353 (116.737) 	5.88482

 Srivatsa Vaddagiri, Suzuki Poulose, Raghavendra K T (5): 
  Add debugfs support to print u32-arrays in debugfs
  Renaming of xen functions and change unsigned to u32
  Add two hypercalls to KVM hypervisor to support pv-ticketlocks
  Added configuration support to enable debug information for KVM Guests
  pv-ticketlocks support for linux guests running on KVM hypervisor
 
 arch/x86/Kconfig                |    9 ++
 arch/x86/include/asm/kvm_para.h |   12 ++-
 arch/x86/kernel/head32.c        |    3 +
 arch/x86/kernel/head64.c        |    3 +
 arch/x86/kernel/kvm.c           |  247 +++++++++++++++++++++++++++++++++++++++
 arch/x86/kvm/x86.c              |   67 +++++++++++-
 arch/x86/xen/debugfs.c          |  104 ----------------
 arch/x86/xen/debugfs.h          |    4 -
 arch/x86/xen/spinlock.c         |    2 +-
 fs/debugfs/file.c               |  108 +++++++++++++++++
 include/linux/debugfs.h         |   11 ++
 include/linux/kvm.h             |    1 +
 include/linux/kvm_host.h        |    5 +
 include/linux/kvm_para.h        |    2 +
 virt/kvm/kvm_main.c             |    1 +
 15 files changed, 468 insertions(+), 111 deletions(-)
---

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:36:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09: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 1RIjza-0001L4-6R; Tue, 25 Oct 2011 09:36:46 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGu0Y-0001Pj-CX
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 07:54:10 -0700
X-Env-Sender: andres.lagarcavilla@gmail.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319122447!36079580!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21616 invoked from network); 20 Oct 2011 14:54:07 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-12.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	20 Oct 2011 14:54:07 -0000
Received: by eyb6 with SMTP id 6so4528811eyb.30
	for <xen-devel@lists.xensource.com>;
	Thu, 20 Oct 2011 07:54:06 -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=NbxrqEolI3bMLd4XBNkiyADzR0KdmaJLQuP2JNI/Cmw=;
	b=rzQCFX7IHb7nRSBDdbMAAJsquYsS1gLp5gt5xtqDEtjNfr6oF399cLrCgZB4qKLZ4g
	BSVV2w8kaRJqHxFAigzJXL8nS41F+jDlNSGnqhFJyqMiwEaOfslPUVx0YWPLrp5apsTn
	wEb6+YWGEE9uCSH/dADhuIkWRn7lkCqE1mfTA=
MIME-Version: 1.0
Received: by 10.216.157.131 with SMTP id o3mr8758035wek.48.1319122446763; Thu,
	20 Oct 2011 07:54:06 -0700 (PDT)
Received: by 10.216.169.69 with HTTP; Thu, 20 Oct 2011 07:54:05 -0700 (PDT)
In-Reply-To: <20111020101324.GD49983@ocelot.phlegethon.org>
References: <CADzFZPsJ2--PQCVH1QGJ-L1q5k4bokBrZeaaAt=BSD7QU9cbOA@mail.gmail.com>
	<20111010092111.GB31800@ocelot.phlegethon.org>
	<CADzFZPscgJ6TWXNjyeEjbOnMrEpCE7zS6BTGxfJ+yibpz-Ds_w@mail.gmail.com>
	<20111013150229.GJ44937@ocelot.phlegethon.org>
	<CADzFZPusJN7e2jG147q68RA3ZQ1PGs-xFNk+jjLRDAR7xboVjQ@mail.gmail.com>
	<20111020101324.GD49983@ocelot.phlegethon.org>
Date: Thu, 20 Oct 2011 10:54:05 -0400
X-Google-Sender-Auth: iZzBm0AyDNcsty9OGVHAXF1emcI
Message-ID: <CADzFZPsk0_aSYzK+Yap208j3r3chpHzBcq+1kYfQc54d-bYkOQ@mail.gmail.com>
Subject: Re: [Xen-devel] Re: Re: mapping problems in xenpaging
From: Andres Lagar Cavilla <andres@lagarcavilla.org>
To: Tim Deegan <tim@xen.org>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: zhen shi <bickys1986@gmail.com>, Olaf Hering <olaf@aepfle.de>,
	Keir Fraser <keir.xen@gmail.com>, xen-devel@lists.xensource.com,
	Adin Scannell <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 20, 2011 at 6:13 AM, Tim Deegan <tim@xen.org> wrote:
> At 13:59 -0400 on 13 Oct (1318514390), Andres Lagar Cavilla wrote:
>> Good stuff Tim, let me summarize:
>>
>>
>> - The key is to obtain exclusive access to a p2m entry, or range [gfn,
>> gfn + 1<<order). This exclusive access lasts beyond the actual lookup,
>> until the caller is finished with modifications, to prevent the p2m
>> mapping changing underfoot.
>
> Yes. =A0It only excludes concurrent updates, not concurrent lookups, so i=
n
> that way it's effectively a per-range MRSW lock, implemented with
> refcounts. =A0(I feel like I'm working around in a circle to your first
> suggestion!)

That's great because ... I'm working around in a circle 180 degrees opposit=
e :)

I think it's important to untangle page liveness from mapping mutex
access. That's why I favor Keir's approach of just locking the thing,
no MSRW. Reasons:
1. Very common idiom throughout the code is to get_entry -> set_entry.
How do we do that in an MSRW, atomically?
2. You're concerned about foreign mappings, rightly so. With mutex
access to the p2m mapping, we can ensure the page refcount increases
atomically in the context of building the foreign mapping. This will
keep the page alive and unable to be swapped/shared/whatever. We only
lock the p2m entry while building the p2m mapping.
3. Recursive locking for different purposes is just easier without
refcounts (generalization of reason 1)
4. Note that in your qemu/x86_emulate example, qemu's mapping does not
prevent x86_emulate from progress, as qemu will have relinquished
locks once done building the foreign mapping.

I have a draft implementation of a "tree" of exclusive locks. It's
still a bit embarrassing to share :)
The API is more or less
get_p2m(p2m, gfn, order)
<do work>
put_p2m(p2m, gfn, order)
with recursive get allowed, (unsophisticated) deadlock detection, and
shortcuts for individual gfn and for global locking (for e.g.
log_dirty). Give me a couple days for an RFC post.

Thanks
Andres

>
>> - bits for either fine-grain locks or refcounts need to be set aside.
>> Stuffing those bits in actual p2m entries will be very error prone/not
>> possible, given all existing implementations (NPT+IOMMU, 32bit, etc).
>> So, we're stuck with extra space overhead for a fine-grained p2m
>> concurrency control structure.
>
> Yes.
>
>> - Unless the recount collapses into the page_info struct. Even then
>> there is a critical section "get p2m_entry then get_page" that needs
>> to execute atomically.
>
> True, and since you only get the page struct after the p2m lookup that's
> tricky.
>
>> - foreign mappings can block p2m actions for arbitrarily long. This
>> doesn't usually happen, but the risk is latent. This is "hard to
>> solve", for now.
>
> Yes.
>
>> question 1: I still don't see the need for refcounts. If you want to
>> prevent changes underfoot, you need to lock the entry, and that's it.
>> In all the cases you explained, somebody would have to wait until the
>> refcount on the entry drops to reflect they are the only holder. This
>> is akin to being locked out.
>
> It should be possible for multiple clients to look up and use the same
> p2m entry (e.g. Qemu having a mapping of a guest frame shouldn't stop
> x86_emulate from reading or writing that memory, though both of those
> should stop any concurrent p2m update to the gfn).
>
>> question 2: although internal hypervisor code paths do not seem to act
>> on unaligned p2m ranges, external calls (e.g. MEMF_populate_on_demand)
>> could possibly pass unaligned ranges. These complicate fine-grain
>> concurrency. Should we fail those? With so many toolstacks out there,
>> I feel very hesitant.
>
> Hmm. =A0Most operations that touch large numbers of frames already have a
> partial-success return path (or at least stop-and-retry) to avoid
> long-running operations starving timers, softirqs etc. =A0If there are
> paths that don't do this, maybe they should. :)
>
>> question 3: is there any way to know a priori the max gfn a domain
>> will have? Can we pre-allocate the concurrency control structure as
>> opposed to demand allocating it?
>
> Not any sensible maximum, no, and gfn sapace can be sparse so it might
> not make sense to allocate it all up front anyway. =A0But the p2m
> structures themselves are allocated on demand so the extra bookkeeping
> space can run alongside them.
>
>> suggestion 1: bake exclusive access in the current calls. A p2m
>> lookup, followed by a p2m set_entry, delimit a critical section for
>> that range of p2m mappings. p2m lookups without closing set_entry will
>> have to issue a call to drop exclusive access on the range of
>> mappings.
>
> As I said above, it shouldn't be exclusive with other _lookups_, only
> with updates. =A0But I have no objection to adding a flag to the lookup
> function that lets the caller choose "lock for update" vs "lock for
> lookup".
>
>> suggestion 2: limit fine granularity (if locking, not refcounting), to
>> 2MB superpages. Saves space. 512 neighbours can surely coexist without
>> locking each other out :)
>
> Sure; if that turns out to cause a lot of contention it can be changed
> later.
>
> 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 Oct 25 09:38:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:38:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIk0m-0001jS-Cp; Tue, 25 Oct 2011 09:38:00 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RGuMy-0004s0-02
	for xen-devel@lists.xensource.com; Thu, 20 Oct 2011 08:17:20 -0700
X-Env-Sender: andres.lagarcavilla@gmail.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1319123836!423656!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13486 invoked from network); 20 Oct 2011 15:17:16 -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;
	20 Oct 2011 15:17:16 -0000
Received: by wwf10 with SMTP id 10so3671432wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 20 Oct 2011 08:17:16 -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:cc:content-type;
	bh=8IWbdBos9tkHk3LzIWVk+t6YMGvB3IuY2pm4TdVptmQ=;
	b=DKbK16L0/w/shbkh410qrmQeRxHuC7iHaUA7kpiVQrwVDtJ3DqArZM3cBCrI6sSYFU
	fVjAf/K7dymIPBuTN3ARJU6KL38soUzCKgj5rD8Oqd+ITnwqUDg6MOEpELIBWoCa7NNd
	yFV5M6AEfy57/TRzui1z4SMi9mSwxnXpVOf8A=
MIME-Version: 1.0
Received: by 10.216.138.221 with SMTP id a71mr4402825wej.102.1319123836692;
	Thu, 20 Oct 2011 08:17:16 -0700 (PDT)
Received: by 10.216.169.69 with HTTP; Thu, 20 Oct 2011 08:17:16 -0700 (PDT)
Date: Thu, 20 Oct 2011 11:17:16 -0400
Message-ID: <CADzFZPtX1Ldi30qVaWfOtndff7kVdoGj9Kjgv1qCw+4FdP+_OA@mail.gmail.com>
From: Andres Lagar Cavilla <andres.lagarcavilla@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:19 -0700
Cc: Keir Fraser <keir.xen@gmail.com>, Tim Deegan <tim@xen.org>,
	Adin Scannell <adin@gridcentric.ca>
Subject: [Xen-devel] PGT_locked questions
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,
PGT_locked can mutually exclude CPUs trying to work on the same page.
I have a few questions
1. shouldn't page_lock/unlock call preempt_disable/enable respectively?
2. It seems to be used only for pv page table self-updates. Is there
any obscure reason its usage is confined to only this, any dark
secrets why it can't be used elsewhere?

And here is my plan
1. remove horrible global shr_lock by following up on Adin Scannell's
removal of the sharing hash table
2. Still, concurrent additions/deletions of gfn_info list elements to
a shared page need to be protected. I'm thinking of using PGT_locked
for this. Sounds good?

Thanks
Andres

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:39:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:39:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIk22-000279-AB; Tue, 25 Oct 2011 09:39:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RHD84-00055U-Jy
	for xen-devel@lists.xensource.com; Fri, 21 Oct 2011 04:19:13 -0700
X-Env-Sender: harald@harald-hoyer.de
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319195948!36182553!1
X-Originating-IP: [62.75.189.18]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11745 invoked from network); 21 Oct 2011 11:19:09 -0000
Received: from static-ip-62-75-189-18.inaddr.ip-pool.com (HELO
	vs189018.vserver.de) (62.75.189.18)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 21 Oct 2011 11:19:09 -0000
Received: from [192.168.2.123] (p5DCFEE44.dip.t-dialin.net [93.207.238.68])
	(authenticated bits=0)
	by vs189018.vserver.de (8.13.1/8.13.1) with ESMTP id p9LBJ54a023575
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 21 Oct 2011 13:19:06 +0200
Message-ID: <4EA15529.3060105@harald-hoyer.de>
Date: Fri, 21 Oct 2011 13:19:05 +0200
From: Harald Hoyer <harald@harald-hoyer.de>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Paolo Bonzini <pbonzini@redhat.com>
References: <1319130906-14267-1-git-send-email-pbonzini@redhat.com>
In-Reply-To: <1319130906-14267-1-git-send-email-pbonzini@redhat.com>
X-Enigmail-Version: 1.3.2
OpenPGP: id=C5575542
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:19 -0700
Cc: initramfs@vger.kernel.org, xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: [PATCH] remove the xen dracut module
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0046154502=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a cryptographically signed message in MIME format.

--===============0046154502==
Content-Type: multipart/signed; protocol="application/pkcs7-signature";
	micalg=sha1; boundary="------------ms080109080808010809090200"

This is a cryptographically signed message in MIME format.

--------------ms080109080808010809090200
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

thanks! pushed


On 20.10.2011 19:15, Paolo Bonzini wrote:
> The Xen module is unnecessary and it has been for a while. =20
> Most Xen systems will not be using the module, even now, because
> xen-detect is not installed by default on most Xen systems, and
> dracut uses xen-detect to decide whether to include the module.
>=20
> It also has some problems:
>=20
> 1) it does not try loading xen_platform_pci;
>=20
> 2) it loads modules unnecessarily; modules.alias is where all Xen suppo=
rt
> should reside.  Assuming xenbus_probe_frontend and xen_platform_pci
> are loaded so that Xen devices are probed, other modules are picked up
> automatically thanks to aliases such as
>=20
>     alias xen:vbd xen_blkfront
>=20
> 3) Even not-so-recent kernels (say 2.6.32) require the xen_platform_pci=

> and xenbus_probe_frontend modules even for non-paravirtualized guests.
> 60xen/module-setup.sh picks the module only for PV guests.
>=20
> So, just require xenbus_probe_frontend to be builtin, and also
> xen_platform_pci for fully-virtualized guests, and remove the module.
>=20
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
>=20
> ---
>  modules.d/60xen/module-setup.sh |   42 -------------------------------=
--------
>  modules.d/60xen/xen-pre-udev.sh |   13 ------------
>  2 files changed, 0 insertions(+), 55 deletions(-)
>  delete mode 100755 modules.d/60xen/module-setup.sh
>  delete mode 100755 modules.d/60xen/xen-pre-udev.sh
>=20
> diff --git a/modules.d/60xen/module-setup.sh b/modules.d/60xen/module-s=
etup.sh
> deleted file mode 100755
> index 75309be..0000000
> --- a/modules.d/60xen/module-setup.sh
> +++ /dev/null
> @@ -1,42 +0,0 @@
> -#!/bin/bash
> -# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -=
*-
> -# ex: ts=3D8 sw=3D4 sts=3D4 et filetype=3Dsh
> -
> -check() {
> -    # No Xen-detect? Boo!!
> -    if ! hash xen-detect 2>/dev/null; then
> -        [[ -d /usr/lib/xen-default ]] && \
> -            hash -p /usr/lib/xen-default/bin/xen-detect xen-detect || =
return 1
> -    fi
> -
> -    . $dracutfunctions
> -    [[ $debug ]] && set -x
> -
> -    # Yes, we are under Xen PV env.
> -    xen-detect | grep -q -v PV || return 0
> -
> -    return 1
> -}
> -
> -depends() {
> -    return 0
> -}
> -
> -installkernel() {
> -    local _i
> -    for _i in \
> -        xenbus_probe_frontend xen-pcifront \
> -        xen-fbfront xen-kbdfront xen-blkfront xen-netfront \
> -        ; do
> -        modinfo -k $kernel $_i >/dev/null 2>&1 && instmods $_i
> -    done
> -
> -}
> -
> -install() {
> -    hash xen-detect 2>/dev/null || \
> -        hash -p /usr/lib/xen-default/bin/xen-detect xen-detect
> -    inst "$(hash -t xen-detect)" /sbin/xen-detect
> -    inst_hook pre-udev 40 "$moddir/xen-pre-udev.sh"
> -}
> -
> diff --git a/modules.d/60xen/xen-pre-udev.sh b/modules.d/60xen/xen-pre-=
udev.sh
> deleted file mode 100755
> index f039aaa..0000000
> --- a/modules.d/60xen/xen-pre-udev.sh
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -#!/bin/sh
> -# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -=
*-
> -# ex: ts=3D8 sw=3D4 sts=3D4 et filetype=3Dsh
> -xen-detect
> -RC=3D$?
> -if [ "$RC" =3D "1" ] ; then
> -    modprobe xenbus_probe_frontend
> -    modprobe xen-kbdfront
> -    modprobe xen-fbfront
> -    modprobe xen-blkfront
> -    modprobe xen-netfront
> -    modprobe xen-pcifront
> -fi



--------------ms080109080808010809090200
Content-Type: application/pkcs7-signature; name="smime.p7s"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="smime.p7s"
Content-Description: S/MIME Cryptographic Signature

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIFPDCC
BTgwggMgoAMCAQICAwn6mjANBgkqhkiG9w0BAQUFADB5MRAwDgYDVQQKEwdSb290IENBMR4w
HAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNBIENlcnQgU2lnbmlu
ZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRAY2FjZXJ0Lm9yZzAeFw0xMTAz
MjMxMTU4MTVaFw0xMzAzMjIxMTU4MTVaMD4xFTATBgNVBAMTDEhhcmFsZCBIb3llcjElMCMG
CSqGSIb3DQEJARYWaGFyYWxkQGhhcmFsZC1ob3llci5kZTCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAMWJ6ewlyqPdfi2JF6XsM9hxa/l6edcmLEALUs5fblqJxA9ixAoWI+WY
0agbuZgs/iudr69sU9lJIfpXUdLdZoVUn6iWxwRuJmvgihnFpLfojx+l4wDZu5JeJUXbcml4
2wHvykdBfkfTEmUGn09CbPWeG5fAfOq37s9TIyAq4AnVWPaR4ZtIgg/s9ns9DoCAKP1pzgLn
qTu94pfLtl5dB/dpCV9seqe+YtUZqedXhFOtWkq/w2hbFA+mXSbSDts6rZMlQO8+Rzkx1fSc
aMZYBZ3OqRRxk6+oC4Tlv24Yj2lPMV+inTyXllxxqUa9NuXYK9hI+juy4fa3BIbKBCKidCEC
AwEAAaOCAQIwgf8wDAYDVR0TAQH/BAIwADBWBglghkgBhvhCAQ0ESRZHVG8gZ2V0IHlvdXIg
b3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQgb3ZlciB0byBodHRwOi8vd3d3LkNBY2Vy
dC5vcmcwQAYDVR0lBDkwNwYIKwYBBQUHAwQGCCsGAQUFBwMCBgorBgEEAYI3CgMEBgorBgEE
AYI3CgMDBglghkgBhvhCBAEwMgYIKwYBBQUHAQEEJjAkMCIGCCsGAQUFBzABhhZodHRwOi8v
b2NzcC5jYWNlcnQub3JnMCEGA1UdEQQaMBiBFmhhcmFsZEBoYXJhbGQtaG95ZXIuZGUwDQYJ
KoZIhvcNAQEFBQADggIBAFZcfmCgsk7743CPH2jmToVyC2hotfjnKsrCyky/b0GH0Ov9Y4TL
+0uGcrq0vZeC/xEKKCmaUF5bAPtYLIJGByV8xVzUUzCypkmh5eyR93OuWnbNpD0VW+u3If5v
m93CXp11bUh1eDk2OOP0irJNmze0GqohW/hjibY6exN183zOc75xD1Horf1j1/JcJocJR0aq
hU4mQRnYqxc2Rhkeyd2vueWDV69pc+orqLinT6O09EpPVo/Yxh6Xq/fM5gTong1Hf2hFVwGu
9KIotNPMauU/IY4Hedxc6uXIZ2UEW2lpmfNh242Z6Bv0/nir4iOtOr8EcowxNYs7yXLBSVh7
X8eYIcUY9qu6SJ0L2tHPIwhK9JjZXD9mg/ko/zI3+wHvJbU/kGsQGCvKTdF44QnRv1YMiQBP
X5M1R1lun+4lJ8XT02Xo0tiDQqbtCsO3nFmZ5DfRBuFK+uZj3JsuwiUPuxFhLE2jZIBxi0yX
JA71+hbbrTJ72dBRJD6Q2SlBzPLMAvvGQTEH23n5QYlCp2WuGujPpR2lD7CdGMjxhwbTPbXy
Ontf2+OqNS5EEu+gJoD3k4wLQNsWjaPD/Oi06I4VkO4VQgo9ddpDgTmEuoa5sOstzrRA+eBZ
8/g/K/LqlLVXvux5KLrmrvNmQO4UHBTOFe3XMRvL2wNrz8Ay8xaO//TIMYIDlDCCA5ACAQEw
gYAweTEQMA4GA1UEChMHUm9vdCBDQTEeMBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3Jn
MSIwIAYDVQQDExlDQSBDZXJ0IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJz
dXBwb3J0QGNhY2VydC5vcmcCAwn6mjAJBgUrDgMCGgUAoIIB6DAYBgkqhkiG9w0BCQMxCwYJ
KoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xMTEwMjExMTE5MDVaMCMGCSqGSIb3DQEJBDEW
BBTcRZa+ULiO3Xm12NEcEbwV5FTK7TBfBgkqhkiG9w0BCQ8xUjBQMAsGCWCGSAFlAwQBAjAK
BggqhkiG9w0DBzAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAwBwYFKw4DAgcwDQYI
KoZIhvcNAwICASgwgZEGCSsGAQQBgjcQBDGBgzCBgDB5MRAwDgYDVQQKEwdSb290IENBMR4w
HAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNBIENlcnQgU2lnbmlu
ZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRAY2FjZXJ0Lm9yZwIDCfqaMIGT
BgsqhkiG9w0BCRACCzGBg6CBgDB5MRAwDgYDVQQKEwdSb290IENBMR4wHAYDVQQLExVodHRw
Oi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNBIENlcnQgU2lnbmluZyBBdXRob3JpdHkx
ITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRAY2FjZXJ0Lm9yZwIDCfqaMA0GCSqGSIb3DQEBAQUA
BIIBAFdjb8yq8Ry+thPRw8aZ3Kf80cquBcFeX6WbTX0ekbtsXs/LpnAEoFrZymA1WsKXj3wh
pZulC7lX5r0FUXziOlw7i8/qr9jZbCMdMFN7iIhhy5/o2q4+dpVwc0Vzood/zVgFeoPKPjfv
5+j5rXB3WisfZ7TXngNgaud9M9bW8oPphyi7dYSIiRtDhbVUyiqxvmZQD1iLhXyVhZ3/xSgm
LRjw/BRObA7N8f1JJaXXT1KFPmgv7bDrc3XSUZcxm/rF70KpXuXfVyolQusfHSc8Q28QPDEa
3akPjM6Ih4UsiMbwNpZns0zQe+lqdw7n5eBGL8NU95/FWMGtLeBByC2XIHAAAAAAAAA=
--------------ms080109080808010809090200--


--===============0046154502==
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

--===============0046154502==--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:40:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:40:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIk3F-0002Yl-Qf; Tue, 25 Oct 2011 09:40:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RI3LV-0004CA-AA
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 12:04:33 -0700
X-Env-Sender: raghavendra.kt@linux.vnet.ibm.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319396637!53981281!1
X-Originating-IP: [122.248.162.9]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19747 invoked from network); 23 Oct 2011 19:03:59 -0000
Received: from e28smtp09.in.ibm.com (HELO e28smtp09.in.ibm.com) (122.248.162.9)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 23 Oct 2011 19:03:59 -0000
Received: from /spool/local by e28smtp09.in.ibm.com with XMail ESMTP
	for <xen-devel@lists.xensource.com> from
	<raghavendra.kt@linux.vnet.ibm.com>; Mon, 24 Oct 2011 00:34:25 +0530
Received: from d28relay01.in.ibm.com ([9.184.220.58])
	by e28smtp09.in.ibm.com ([192.168.1.139]) with XMail ESMTP;
	Mon, 24 Oct 2011 00:34:23 +0530
Received: from d28av04.in.ibm.com (d28av04.in.ibm.com [9.184.220.66])
	by d28relay01.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9NJ4Mmu4497592
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 00:34:22 +0530
Received: from d28av04.in.ibm.com (loopback [127.0.0.1])
	by d28av04.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9NJ4LMw017951
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 06:04:22 +1100
Received: from oc5400248562.ibm.com ([9.124.222.73])
	by d28av04.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9NJ4GJI016968; Mon, 24 Oct 2011 06:04:17 +1100
From: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
To: Greg Kroah-Hartman <gregkh@suse.de>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Gleb Natapov <gleb@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>, x86@kernel.org,
	KVM <kvm@vger.kernel.org>, Dave Jiang <dave.jiang@intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	LKML <linux-kernel@vger.kernel.org>,
	Sedat Dilek <sedat.dilek@gmail.com>, Yinghai Lu <yinghai@kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>, Ingo Molnar <mingo@redhat.com>, 
	Avi Kivity <avi@redhat.com>, Rik van Riel <riel@redhat.com>,
	Xen <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Mon, 24 Oct 2011 00:34:04 +0530
Message-Id: <20111023190403.16364.30897.sendpatchset@oc5400248562.ibm.com>
In-Reply-To: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
x-cbid: 11102319-2674-0000-0000-000000F26FE8
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Peter Zijlstra <peterz@infradead.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Subject: [Xen-devel] [PATCH RFC V2 1/5] debugfs: Add support to print u32
	array in debugfs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 debugfs support to print u32-arrays in debugfs. Move the code from Xen to debugfs
to make the code common for other users as well.

Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
---
diff --git a/arch/x86/xen/debugfs.c b/arch/x86/xen/debugfs.c
index 7c0fedd..c8377fb 100644
--- a/arch/x86/xen/debugfs.c
+++ b/arch/x86/xen/debugfs.c
@@ -19,107 +19,3 @@ struct dentry * __init xen_init_debugfs(void)
 	return d_xen_debug;
 }
 
-struct array_data
-{
-	void *array;
-	unsigned elements;
-};
-
-static int u32_array_open(struct inode *inode, struct file *file)
-{
-	file->private_data = NULL;
-	return nonseekable_open(inode, file);
-}
-
-static size_t format_array(char *buf, size_t bufsize, const char *fmt,
-			   u32 *array, unsigned array_size)
-{
-	size_t ret = 0;
-	unsigned i;
-
-	for(i = 0; i < array_size; i++) {
-		size_t len;
-
-		len = snprintf(buf, bufsize, fmt, array[i]);
-		len++;	/* ' ' or '\n' */
-		ret += len;
-
-		if (buf) {
-			buf += len;
-			bufsize -= len;
-			buf[-1] = (i == array_size-1) ? '\n' : ' ';
-		}
-	}
-
-	ret++;		/* \0 */
-	if (buf)
-		*buf = '\0';
-
-	return ret;
-}
-
-static char *format_array_alloc(const char *fmt, u32 *array, unsigned array_size)
-{
-	size_t len = format_array(NULL, 0, fmt, array, array_size);
-	char *ret;
-
-	ret = kmalloc(len, GFP_KERNEL);
-	if (ret == NULL)
-		return NULL;
-
-	format_array(ret, len, fmt, array, array_size);
-	return ret;
-}
-
-static ssize_t u32_array_read(struct file *file, char __user *buf, size_t len,
-			      loff_t *ppos)
-{
-	struct inode *inode = file->f_path.dentry->d_inode;
-	struct array_data *data = inode->i_private;
-	size_t size;
-
-	if (*ppos == 0) {
-		if (file->private_data) {
-			kfree(file->private_data);
-			file->private_data = NULL;
-		}
-
-		file->private_data = format_array_alloc("%u", data->array, data->elements);
-	}
-
-	size = 0;
-	if (file->private_data)
-		size = strlen(file->private_data);
-
-	return simple_read_from_buffer(buf, len, ppos, file->private_data, size);
-}
-
-static int xen_array_release(struct inode *inode, struct file *file)
-{
-	kfree(file->private_data);
-
-	return 0;
-}
-
-static const struct file_operations u32_array_fops = {
-	.owner	= THIS_MODULE,
-	.open	= u32_array_open,
-	.release= xen_array_release,
-	.read	= u32_array_read,
-	.llseek = no_llseek,
-};
-
-struct dentry *xen_debugfs_create_u32_array(const char *name, mode_t mode,
-					    struct dentry *parent,
-					    u32 *array, unsigned elements)
-{
-	struct array_data *data = kmalloc(sizeof(*data), GFP_KERNEL);
-
-	if (data == NULL)
-		return NULL;
-
-	data->array = array;
-	data->elements = elements;
-
-	return debugfs_create_file(name, mode, parent, data, &u32_array_fops);
-}
diff --git a/arch/x86/xen/debugfs.h b/arch/x86/xen/debugfs.h
index e281320..12ebf33 100644
--- a/arch/x86/xen/debugfs.h
+++ b/arch/x86/xen/debugfs.h
@@ -3,8 +3,4 @@
 
 struct dentry * __init xen_init_debugfs(void);
 
-struct dentry *xen_debugfs_create_u32_array(const char *name, mode_t mode,
-					    struct dentry *parent,
-					    u32 *array, unsigned elements);
-
 #endif /* _XEN_DEBUGFS_H */
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c
index 90f7657..9aa12e3 100644
--- a/fs/debugfs/file.c
+++ b/fs/debugfs/file.c
@@ -18,6 +18,7 @@
 #include <linux/pagemap.h>
 #include <linux/namei.h>
 #include <linux/debugfs.h>
+#include <linux/slab.h>
 
 static ssize_t default_read_file(struct file *file, char __user *buf,
 				 size_t count, loff_t *ppos)
@@ -525,3 +526,110 @@ struct dentry *debugfs_create_blob(const char *name, mode_t mode,
 	return debugfs_create_file(name, mode, parent, blob, &fops_blob);
 }
 EXPORT_SYMBOL_GPL(debugfs_create_blob);
+
+struct array_data {
+	void *array;
+	unsigned elements;
+};
+
+static int u32_array_open(struct inode *inode, struct file *file)
+{
+	file->private_data = NULL;
+	return nonseekable_open(inode, file);
+}
+
+static size_t format_array(char *buf, size_t bufsize, const char *fmt,
+			   u32 *array, unsigned array_size)
+{
+	size_t ret = 0;
+	unsigned i;
+
+	for (i = 0; i < array_size; i++) {
+		size_t len;
+
+		len = snprintf(buf, bufsize, fmt, array[i]);
+		len++;	/* ' ' or '\n' */
+		ret += len;
+
+		if (buf) {
+			buf += len;
+			bufsize -= len;
+			buf[-1] = (i == array_size-1) ? '\n' : ' ';
+		}
+	}
+
+	ret++;		/* \0 */
+	if (buf)
+		*buf = '\0';
+
+	return ret;
+}
+
+static char *format_array_alloc(const char *fmt, u32 *array,
+						unsigned array_size)
+{
+	size_t len = format_array(NULL, 0, fmt, array, array_size);
+	char *ret;
+
+	ret = kmalloc(len, GFP_KERNEL);
+	if (ret == NULL)
+		return NULL;
+
+	format_array(ret, len, fmt, array, array_size);
+	return ret;
+}
+
+static ssize_t u32_array_read(struct file *file, char __user *buf, size_t len,
+			      loff_t *ppos)
+{
+	struct inode *inode = file->f_path.dentry->d_inode;
+	struct array_data *data = inode->i_private;
+	size_t size;
+
+	if (*ppos == 0) {
+		if (file->private_data) {
+			kfree(file->private_data);
+			file->private_data = NULL;
+		}
+
+		file->private_data = format_array_alloc("%u", data->array,
+							      data->elements);
+	}
+
+	size = 0;
+	if (file->private_data)
+		size = strlen(file->private_data);
+
+	return simple_read_from_buffer(buf, len, ppos,
+					file->private_data, size);
+}
+
+static int xen_array_release(struct inode *inode, struct file *file)
+{
+	kfree(file->private_data);
+
+	return 0;
+}
+
+static const struct file_operations u32_array_fops = {
+	.owner	 = THIS_MODULE,
+	.open	 = u32_array_open,
+	.release = xen_array_release,
+	.read	 = u32_array_read,
+	.llseek  = no_llseek,
+};
+
+struct dentry *xen_debugfs_create_u32_array(const char *name, mode_t mode,
+					    struct dentry *parent,
+					    u32 *array, unsigned elements)
+{
+	struct array_data *data = kmalloc(sizeof(*data), GFP_KERNEL);
+
+	if (data == NULL)
+		return NULL;
+
+	data->array = array;
+	data->elements = elements;
+
+	return debugfs_create_file(name, mode, parent, data, &u32_array_fops);
+}
diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h
index e7d9b20..8c08636 100644
--- a/include/linux/debugfs.h
+++ b/include/linux/debugfs.h
@@ -74,6 +74,10 @@ struct dentry *debugfs_create_blob(const char *name, mode_t mode,
 				  struct dentry *parent,
 				  struct debugfs_blob_wrapper *blob);
 
+struct dentry *xen_debugfs_create_u32_array(const char *name, mode_t mode,
+					    struct dentry *parent,
+					    u32 *array, unsigned elements);
+
 bool debugfs_initialized(void);
 
 #else
@@ -193,6 +197,13 @@ static inline bool debugfs_initialized(void)
 	return false;
 }
 
+struct dentry *xen_debugfs_create_u32_array(const char *name, mode_t mode,
+					    struct dentry *parent,
+					    u32 *array, unsigned elements)
+{
+	return ERR_PTR(-ENODEV);
+}
+
 #endif
 
 #endif


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:41:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:41:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIk47-0002w0-4N; Tue, 25 Oct 2011 09:41:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RI3MQ-0004De-ME
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 12:05:30 -0700
X-Env-Sender: raghavendra.kt@linux.vnet.ibm.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319396725!2100928!1
X-Originating-IP: [122.248.162.1]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23922 invoked from network); 23 Oct 2011 19:05:26 -0000
Received: from e28smtp01.in.ibm.com (HELO e28smtp01.in.ibm.com) (122.248.162.1)
	by server-2.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 23 Oct 2011 19:05:26 -0000
Received: from d28relay05.in.ibm.com (d28relay05.in.ibm.com [9.184.220.62])
	by e28smtp01.in.ibm.com (8.14.4/8.13.1) with ESMTP id p9NJ5M38014144
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 00:35:22 +0530
Received: from d28av03.in.ibm.com (d28av03.in.ibm.com [9.184.220.65])
	by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9NJ5MPa3362848
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 00:35:22 +0530
Received: from d28av03.in.ibm.com (loopback [127.0.0.1])
	by d28av03.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9NJ5K3J020428
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 06:05:21 +1100
Received: from oc5400248562.ibm.com ([9.124.222.73])
	by d28av03.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9NJ5GNl019361; Mon, 24 Oct 2011 06:05:17 +1100
From: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
To: Greg Kroah-Hartman <gregkh@suse.de>, KVM <kvm@vger.kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Sedat Dilek <sedat.dilek@gmail.com>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>, x86@kernel.org,
	"H. Peter Anvin" <hpa@zytor.com>, Dave Jiang <dave.jiang@intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Gleb Natapov <gleb@redhat.com>, Yinghai Lu <yinghai@kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>, Ingo Molnar <mingo@redhat.com>, 
	Avi Kivity <avi@redhat.com>, Rik van Riel <riel@redhat.com>,
	Xen <xen-devel@lists.xensource.com>, LKML <linux-kernel@vger.kernel.org>
Date: Mon, 24 Oct 2011 00:34:59 +0530
Message-Id: <20111023190459.16364.98151.sendpatchset@oc5400248562.ibm.com>
In-Reply-To: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Peter Zijlstra <peterz@infradead.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Subject: [Xen-devel] [PATCH RFC V2 2/5] debugfs: Renaming of xen functions
	and change unsigned to u32
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Renaming of xen functions and change unsigned to u32.
    
Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
---
diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c
index fc506e6..14a8961 100644
--- a/arch/x86/xen/spinlock.c
+++ b/arch/x86/xen/spinlock.c
@@ -286,7 +286,7 @@ static int __init xen_spinlock_debugfs(void)
 	debugfs_create_u64("time_blocked", 0444, d_spin_debug,
 			   &spinlock_stats.time_blocked);
 
-	xen_debugfs_create_u32_array("histo_blocked", 0444, d_spin_debug,
+	debugfs_create_u32_array("histo_blocked", 0444, d_spin_debug,
 				     spinlock_stats.histo_spin_blocked, HISTO_BUCKETS + 1);
 
 	return 0;
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c
index 9aa12e3..68af40d 100644
--- a/fs/debugfs/file.c
+++ b/fs/debugfs/file.c
@@ -529,7 +529,7 @@ EXPORT_SYMBOL_GPL(debugfs_create_blob);
 
 struct array_data {
 	void *array;
-	unsigned elements;
+	u32 elements;
 };
 
 static int u32_array_open(struct inode *inode, struct file *file)
@@ -539,10 +539,10 @@ static int u32_array_open(struct inode *inode, struct file *file)
 }
 
 static size_t format_array(char *buf, size_t bufsize, const char *fmt,
-			   u32 *array, unsigned array_size)
+			   u32 *array, u32 array_size)
 {
 	size_t ret = 0;
-	unsigned i;
+	u32 i;
 
 	for (i = 0; i < array_size; i++) {
 		size_t len;
@@ -566,7 +566,7 @@ static size_t format_array(char *buf, size_t bufsize, const char *fmt,
 }
 
 static char *format_array_alloc(const char *fmt, u32 *array,
-						unsigned array_size)
+						u32 array_size)
 {
 	size_t len = format_array(NULL, 0, fmt, array, array_size);
 	char *ret;
@@ -604,7 +604,7 @@ static ssize_t u32_array_read(struct file *file, char __user *buf, size_t len,
 					file->private_data, size);
 }
 
-static int xen_array_release(struct inode *inode, struct file *file)
+static int u32_array_release(struct inode *inode, struct file *file)
 {
 	kfree(file->private_data);
 
@@ -614,14 +614,14 @@ static int xen_array_release(struct inode *inode, struct file *file)
 static const struct file_operations u32_array_fops = {
 	.owner	 = THIS_MODULE,
 	.open	 = u32_array_open,
-	.release = xen_array_release,
+	.release = u32_array_release,
 	.read	 = u32_array_read,
 	.llseek  = no_llseek,
 };
 
-struct dentry *xen_debugfs_create_u32_array(const char *name, mode_t mode,
+struct dentry *debugfs_create_u32_array(const char *name, mode_t mode,
 					    struct dentry *parent,
-					    u32 *array, unsigned elements)
+					    u32 *array, u32 elements)
 {
 	struct array_data *data = kmalloc(sizeof(*data), GFP_KERNEL);
 
diff --git a/include/linux/debugfs.h b/include/linux/debugfs.h
index 8c08636..253e2fb 100644
--- a/include/linux/debugfs.h
+++ b/include/linux/debugfs.h
@@ -74,9 +74,9 @@ struct dentry *debugfs_create_blob(const char *name, mode_t mode,
 				  struct dentry *parent,
 				  struct debugfs_blob_wrapper *blob);
 
-struct dentry *xen_debugfs_create_u32_array(const char *name, mode_t mode,
-					    struct dentry *parent,
-					    u32 *array, unsigned elements);
+struct dentry *debugfs_create_u32_array(const char *name, mode_t mode,
+					struct dentry *parent,
+					u32 *array, u32 elements);
 
 bool debugfs_initialized(void);
 
@@ -197,9 +197,9 @@ static inline bool debugfs_initialized(void)
 	return false;
 }
 
-struct dentry *xen_debugfs_create_u32_array(const char *name, mode_t mode,
-					    struct dentry *parent,
-					    u32 *array, unsigned elements)
+struct dentry *debugfs_create_u32_array(const char *name, mode_t mode,
+					struct dentry *parent,
+					u32 *array, u32 elements)
 {
 	return ERR_PTR(-ENODEV);
 }

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:42:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:42:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIk4v-0003Kf-MM; Tue, 25 Oct 2011 09:42:17 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RI3NU-0004F9-UX
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 12:06:37 -0700
X-Env-Sender: raghavendra.kt@linux.vnet.ibm.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319396760!53981385!1
X-Originating-IP: [122.248.162.8]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21295 invoked from network); 23 Oct 2011 19:06:02 -0000
Received: from e28smtp08.in.ibm.com (HELO e28smtp08.in.ibm.com) (122.248.162.8)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 23 Oct 2011 19:06:02 -0000
Received: from /spool/local
	by e28smtp08.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use
	Only! Violators will be prosecuted
	for <xen-devel@lists.xensource.com> from
	<raghavendra.kt@linux.vnet.ibm.com>; Mon, 24 Oct 2011 00:36:31 +0530
Received: from d28relay01.in.ibm.com ([9.184.220.58])
	by e28smtp08.in.ibm.com ([192.168.1.138]) with IBM ESMTP SMTP Gateway:
	Authorized Use Only! Violators will be prosecuted; 
	Mon, 24 Oct 2011 00:36:24 +0530
Received: from d28av02.in.ibm.com (d28av02.in.ibm.com [9.184.220.64])
	by d28relay01.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9NJ6Ogn4571308
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 00:36:24 +0530
Received: from d28av02.in.ibm.com (loopback [127.0.0.1])
	by d28av02.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9NJ6MEq015841
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 06:06:23 +1100
Received: from oc5400248562.ibm.com ([9.124.222.73])
	by d28av02.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9NJ6H4V014594; Mon, 24 Oct 2011 06:06:18 +1100
From: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
To: Greg Kroah-Hartman <gregkh@suse.de>, "H. Peter Anvin" <hpa@zytor.com>,
	Gleb Natapov <gleb@redhat.com>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>, x86@kernel.org,
	KVM <kvm@vger.kernel.org>, Dave Jiang <dave.jiang@intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Xen <xen-devel@lists.xensource.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Yinghai Lu <yinghai@kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>, Ingo Molnar <mingo@redhat.com>, 
	Avi Kivity <avi@redhat.com>, Rik van Riel <riel@redhat.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	LKML <linux-kernel@vger.kernel.org>
Date: Mon, 24 Oct 2011 00:35:59 +0530
Message-Id: <20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
In-Reply-To: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
x-cbid: 11102319-2000-0000-0000-000000A2DEBF
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Peter Zijlstra <peterz@infradead.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Subject: [Xen-devel] [PATCH RFC V2 3/5] kvm hypervisor : Add two hypercalls
	to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 two hypercalls to KVM hypervisor to support pv-ticketlocks.
    
KVM_HC_WAIT_FOR_KICK blocks the calling vcpu until another vcpu kicks it or it
is woken up because of an event like interrupt.
   
KVM_HC_KICK_CPU allows the calling vcpu to kick another vcpu.
    
The presence of these hypercalls is indicated to guest via
KVM_FEATURE_WAIT_FOR_KICK/KVM_CAP_WAIT_FOR_KICK.

Qemu needs a corresponding patch to pass up the presence of this feature to 
guest via cpuid. Patch to qemu will be sent separately.

There is no Xen/KVM hypercall interface to await kick from.
    
Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
---
diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h
index 734c376..2874c19 100644
--- a/arch/x86/include/asm/kvm_para.h
+++ b/arch/x86/include/asm/kvm_para.h
@@ -16,12 +16,14 @@
 #define KVM_FEATURE_CLOCKSOURCE		0
 #define KVM_FEATURE_NOP_IO_DELAY	1
 #define KVM_FEATURE_MMU_OP		2
+
 /* This indicates that the new set of kvmclock msrs
  * are available. The use of 0x11 and 0x12 is deprecated
  */
 #define KVM_FEATURE_CLOCKSOURCE2        3
 #define KVM_FEATURE_ASYNC_PF		4
 #define KVM_FEATURE_STEAL_TIME		5
+#define KVM_FEATURE_WAIT_FOR_KICK       6
 
 /* The last 8 bits are used to indicate how to interpret the flags field
  * in pvclock structure. If no bits are set, all flags are ignored.
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 84a28ea..b43fd18 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -2077,6 +2077,7 @@ int kvm_dev_ioctl_check_extension(long ext)
 	case KVM_CAP_XSAVE:
 	case KVM_CAP_ASYNC_PF:
 	case KVM_CAP_GET_TSC_KHZ:
+	case KVM_CAP_WAIT_FOR_KICK:
 		r = 1;
 		break;
 	case KVM_CAP_COALESCED_MMIO:
@@ -2548,7 +2549,8 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
 			     (1 << KVM_FEATURE_NOP_IO_DELAY) |
 			     (1 << KVM_FEATURE_CLOCKSOURCE2) |
 			     (1 << KVM_FEATURE_ASYNC_PF) |
-			     (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT);
+			     (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT) |
+			     (1 << KVM_FEATURE_WAIT_FOR_KICK);
 
 		if (sched_info_on())
 			entry->eax |= (1 << KVM_FEATURE_STEAL_TIME);
@@ -5231,6 +5233,61 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
 	return 1;
 }
 
+/*
+ * kvm_pv_wait_for_kick_op : Block until kicked by either a KVM_HC_KICK_CPU
+ * hypercall or a event like interrupt.
+ *
+ * @vcpu : vcpu which is blocking.
+ */
+static void kvm_pv_wait_for_kick_op(struct kvm_vcpu *vcpu)
+{
+	DEFINE_WAIT(wait);
+
+	/*
+	 * Blocking on vcpu->wq allows us to wake up sooner if required to
+	 * service pending events (like interrupts).
+	 *
+	 * Also set state to TASK_INTERRUPTIBLE before checking vcpu->kicked to
+	 * avoid racing with kvm_pv_kick_cpu_op().
+	 */
+	prepare_to_wait(&vcpu->wq, &wait, TASK_INTERRUPTIBLE);
+
+	/*
+	 * Somebody has already tried kicking us. Acknowledge that
+	 * and terminate the wait.
+	 */
+	if (vcpu->kicked) {
+		vcpu->kicked = 0;
+		goto end_wait;
+	}
+
+	/* Let's wait for either KVM_HC_KICK_CPU or someother event
+	 * to wake us up.
+	 */
+
+	srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
+	schedule();
+	vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
+
+end_wait:
+	finish_wait(&vcpu->wq, &wait);
+}
+
+/*
+ * kvm_pv_kick_cpu_op:  Kick a vcpu.
+ *
+ * @cpu - vcpu to be kicked.
+ */
+static void kvm_pv_kick_cpu_op(struct kvm *kvm, int cpu)
+{
+	struct kvm_vcpu *vcpu = kvm_get_vcpu(kvm, cpu);
+
+	if (vcpu) {
+		vcpu->kicked = 1;
+		wake_up_interruptible(&vcpu->wq);
+	}
+}
+
 int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
 {
 	unsigned long nr, a0, a1, a2, a3, ret;
@@ -5267,6 +5324,14 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
 	case KVM_HC_MMU_OP:
 		r = kvm_pv_mmu_op(vcpu, a0, hc_gpa(vcpu, a1, a2), &ret);
 		break;
+	case KVM_HC_WAIT_FOR_KICK:
+		kvm_pv_wait_for_kick_op(vcpu);
+		ret = 0;
+		break;
+	case KVM_HC_KICK_CPU:
+		kvm_pv_kick_cpu_op(vcpu->kvm, a0);
+		ret = 0;
+		break;
 	default:
 		ret = -KVM_ENOSYS;
 		break;
diff --git a/include/linux/kvm.h b/include/linux/kvm.h
index aace6b8..736acc0 100644
--- a/include/linux/kvm.h
+++ b/include/linux/kvm.h
@@ -553,6 +553,7 @@ struct kvm_ppc_pvinfo {
 #define KVM_CAP_SPAPR_TCE 63
 #define KVM_CAP_PPC_SMT 64
 #define KVM_CAP_PPC_RMA	65
+#define KVM_CAP_WAIT_FOR_KICK 66
 #define KVM_CAP_S390_GMAP 71
 
 #ifdef KVM_CAP_IRQ_ROUTING
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
index eabb21a..2946563 100644
--- a/include/linux/kvm_host.h
+++ b/include/linux/kvm_host.h
@@ -152,6 +152,11 @@ struct kvm_vcpu {
 #endif
 
 	struct kvm_vcpu_arch arch;
+
+	/*
+	 * blocked vcpu wakes up by checking this flag set by unlocker
+	 */
+	int kicked;
 };
 
 static inline int kvm_vcpu_exiting_guest_mode(struct kvm_vcpu *vcpu)
diff --git a/include/linux/kvm_para.h b/include/linux/kvm_para.h
index 47a070b..4efee4d 100644
--- a/include/linux/kvm_para.h
+++ b/include/linux/kvm_para.h
@@ -19,6 +19,8 @@
 #define KVM_HC_MMU_OP			2
 #define KVM_HC_FEATURES			3
 #define KVM_HC_PPC_MAP_MAGIC_PAGE	4
+#define KVM_HC_WAIT_FOR_KICK            5
+#define KVM_HC_KICK_CPU		        6
 
 /*
  * hypercalls use architecture specific
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index aefdda3..d09982d 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -224,6 +224,7 @@ int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id)
 	vcpu->kvm = kvm;
 	vcpu->vcpu_id = id;
 	vcpu->pid = NULL;
+	vcpu->kicked = 0;
 	init_waitqueue_head(&vcpu->wq);
 	kvm_async_pf_vcpu_init(vcpu);
 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:43:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:43:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIk5l-0003hp-MG; Tue, 25 Oct 2011 09:43:09 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RI3OF-0004GT-NO
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 12:07:24 -0700
X-Env-Sender: raghavendra.kt@linux.vnet.ibm.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1319396838!479896!1
X-Originating-IP: [122.248.162.4]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3861 invoked from network); 23 Oct 2011 19:07:20 -0000
Received: from e28smtp04.in.ibm.com (HELO e28smtp04.in.ibm.com) (122.248.162.4)
	by server-16.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 23 Oct 2011 19:07:20 -0000
Received: from d28relay03.in.ibm.com (d28relay03.in.ibm.com [9.184.220.60])
	by e28smtp04.in.ibm.com (8.14.4/8.13.1) with ESMTP id p9NJ7HZe007794
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 00:37:17 +0530
Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63])
	by d28relay03.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9NJ7GsZ4735098
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 00:37:17 +0530
Received: from d28av01.in.ibm.com (loopback [127.0.0.1])
	by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9NJ7FC6000415
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 00:37:16 +0530
Received: from oc5400248562.ibm.com ([9.124.222.73])
	by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9NJ7Anq031525; Mon, 24 Oct 2011 00:37:11 +0530
From: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
To: Greg Kroah-Hartman <gregkh@suse.de>, KVM <kvm@vger.kernel.org>,
	Sedat Dilek <sedat.dilek@gmail.com>, Ingo Molnar <mingo@redhat.com>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>, x86@kernel.org,
	"H. Peter Anvin" <hpa@zytor.com>, Dave Jiang <dave.jiang@intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Gleb Natapov <gleb@redhat.com>, Yinghai Lu <yinghai@kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Xen <xen-devel@lists.xensource.com>, Avi Kivity <avi@redhat.com>,
	Rik van Riel <riel@redhat.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	LKML <linux-kernel@vger.kernel.org>
Date: Mon, 24 Oct 2011 00:37:00 +0530
Message-Id: <20111023190700.16364.7548.sendpatchset@oc5400248562.ibm.com>
In-Reply-To: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Peter Zijlstra <peterz@infradead.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Subject: [Xen-devel] [PATCH RFC V2 4/5] kvm guest : Added configuration
	support to enable debug information for KVM 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

Added configuration support to enable debug information
for KVM Guests in debugfs
    
Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
---
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 1f03f82..ed34269 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -562,6 +562,15 @@ config KVM_GUEST
 	  This option enables various optimizations for running under the KVM
 	  hypervisor.
 
+config KVM_DEBUG_FS
+	bool "Enable debug information for KVM Guests in debugfs"
+	depends on KVM_GUEST
+	default n
+	---help---
+	  This option enables collection of various statistics for KVM guest.
+   	  Statistics are displayed in debugfs filesystem. Enabling this option
+	  may incur significant overhead.
+
 source "arch/x86/lguest/Kconfig"
 
 config PARAVIRT

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:43:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:43:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIk6X-00044f-7w; Tue, 25 Oct 2011 09:43:57 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RI3Qf-0004JB-7c
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 12:09:53 -0700
X-Env-Sender: raghavendra.kt@linux.vnet.ibm.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1319396986!470496!1
X-Originating-IP: [202.81.31.143]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30998 invoked from network); 23 Oct 2011 19:09:49 -0000
Received: from e23smtp01.au.ibm.com (HELO e23smtp01.au.ibm.com) (202.81.31.143)
	by server-6.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 23 Oct 2011 19:09:49 -0000
Received: from d23relay04.au.ibm.com (d23relay04.au.ibm.com [202.81.31.246])
	by e23smtp01.au.ibm.com (8.14.4/8.13.1) with ESMTP id p9NJ7siH023257
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 06:07:54 +1100
Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139])
	by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9NJ5iWC2367654
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 06:05:44 +1100
Received: from d23av04.au.ibm.com (loopback [127.0.0.1])
	by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9NJ8J51023182
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 06:08:21 +1100
Received: from oc5400248562.ibm.com ([9.124.222.73])
	by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9NJ8ARs022892; Mon, 24 Oct 2011 06:08:11 +1100
From: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
To: Greg Kroah-Hartman <gregkh@suse.de>, "H. Peter Anvin" <hpa@zytor.com>,
	Gleb Natapov <gleb@redhat.com>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>, x86@kernel.org,
	KVM <kvm@vger.kernel.org>, Dave Jiang <dave.jiang@intel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Yinghai Lu <yinghai@kernel.org>, Sedat Dilek <sedat.dilek@gmail.com>,
	Ingo Molnar <mingo@redhat.com>, Marcelo Tosatti <mtosatti@redhat.com>, 
	Xen <xen-devel@lists.xensource.com>, Avi Kivity <avi@redhat.com>,
	Rik van Riel <riel@redhat.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	LKML <linux-kernel@vger.kernel.org>
Date: Mon, 24 Oct 2011 00:37:53 +0530
Message-Id: <20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
In-Reply-To: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Peter Zijlstra <peterz@infradead.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Subject: [Xen-devel] [PATCH RFC V2 5/5] kvm guest : pv-ticketlocks support
	for linux guests running on KVM hypervisor
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 extends Linux guests running on KVM hypervisor to support
pv-ticketlocks. Very early during bootup, paravirtualied KVM guest detects if 
the hypervisor has required feature (KVM_FEATURE_WAIT_FOR_KICK) to support 
pv-ticketlocks. If so, support for pv-ticketlocks is registered via pv_lock_ops.

Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
---
diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h
index 2874c19..c7f34b7 100644
--- a/arch/x86/include/asm/kvm_para.h
+++ b/arch/x86/include/asm/kvm_para.h
@@ -195,10 +195,18 @@ void kvm_async_pf_task_wait(u32 token);
 void kvm_async_pf_task_wake(u32 token);
 u32 kvm_read_and_reset_pf_reason(void);
 extern void kvm_disable_steal_time(void);
-#else
+
+#ifdef CONFIG_PARAVIRT_SPINLOCKS
+void __init kvm_guest_early_init(void);
+#else /* CONFIG_PARAVIRT_SPINLOCKS */
+#define kvm_guest_early_init() do { } while (0)
+#endif /* CONFIG_PARAVIRT_SPINLOCKS */
+
+#else /* CONFIG_KVM_GUEST */
 #define kvm_guest_init() do { } while (0)
 #define kvm_async_pf_task_wait(T) do {} while(0)
 #define kvm_async_pf_task_wake(T) do {} while(0)
+#define kvm_guest_early_init() do { } while (0)
 static inline u32 kvm_read_and_reset_pf_reason(void)
 {
 	return 0;
diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index 3bb0850..fb25bca 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -9,6 +9,7 @@
 #include <linux/start_kernel.h>
 #include <linux/mm.h>
 #include <linux/memblock.h>
+#include <linux/kvm_para.h>
 
 #include <asm/setup.h>
 #include <asm/sections.h>
@@ -59,6 +60,8 @@ void __init i386_start_kernel(void)
 		break;
 	}
 
+	 kvm_guest_early_init();
+
 	/*
 	 * At this point everything still needed from the boot loader
 	 * or BIOS or kernel text should be early reserved or marked not
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 5655c22..cabf8ec 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -13,6 +13,7 @@
 #include <linux/start_kernel.h>
 #include <linux/io.h>
 #include <linux/memblock.h>
+#include <linux/kvm_para.h>
 
 #include <asm/processor.h>
 #include <asm/proto.h>
@@ -115,6 +116,8 @@ void __init x86_64_start_reservations(char *real_mode_data)
 
 	reserve_ebda_region();
 
+	kvm_guest_early_init();
+
 	/*
 	 * At this point everything still needed from the boot loader
 	 * or BIOS or kernel text should be early reserved or marked not
diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
index a9c2116..f4f341f 100644
--- a/arch/x86/kernel/kvm.c
+++ b/arch/x86/kernel/kvm.c
@@ -39,6 +39,16 @@
 #include <asm/desc.h>
 #include <asm/tlbflush.h>
 
+#ifdef CONFIG_PARAVIRT_SPINLOCKS
+
+#ifdef CONFIG_KVM_DEBUG_FS
+
+#include <linux/debugfs.h>
+
+#endif /* CONFIG_KVM_DEBUG_FS */
+
+#endif /* CONFIG_PARAVIRT_SPINLOCKS */
+
 #define MMU_QUEUE_SIZE 1024
 
 static int kvmapf = 1;
@@ -627,3 +637,240 @@ static __init int activate_jump_labels(void)
 	return 0;
 }
 arch_initcall(activate_jump_labels);
+
+#ifdef CONFIG_PARAVIRT_SPINLOCKS
+
+#ifdef CONFIG_KVM_DEBUG_FS
+
+static struct kvm_spinlock_stats
+{
+	u32 taken_slow;
+	u32 taken_slow_pickup;
+
+	u32 released_slow;
+	u32 released_slow_kicked;
+
+#define HISTO_BUCKETS	30
+	u32 histo_spin_blocked[HISTO_BUCKETS+1];
+
+	u64 time_blocked;
+} spinlock_stats;
+
+static u8 zero_stats;
+
+static inline void check_zero(void)
+{
+	if (unlikely(zero_stats)) {
+		memset(&spinlock_stats, 0, sizeof(spinlock_stats));
+		zero_stats = 0;
+	}
+}
+
+#define ADD_STATS(elem, val)			\
+	do { check_zero(); spinlock_stats.elem += (val); } while (0)
+
+static inline u64 spin_time_start(void)
+{
+	return sched_clock();
+}
+
+static void __spin_time_accum(u64 delta, u32 *array)
+{
+	unsigned index = ilog2(delta);
+
+	check_zero();
+
+	if (index < HISTO_BUCKETS)
+		array[index]++;
+	else
+		array[HISTO_BUCKETS]++;
+}
+
+static inline void spin_time_accum_blocked(u64 start)
+{
+	u32 delta = sched_clock() - start;
+
+	__spin_time_accum(delta, spinlock_stats.histo_spin_blocked);
+	spinlock_stats.time_blocked += delta;
+}
+
+static struct dentry *d_spin_debug;
+static struct dentry *d_kvm_debug;
+
+struct dentry *kvm_init_debugfs(void)
+{
+	d_kvm_debug = debugfs_create_dir("kvm", NULL);
+	if (!d_kvm_debug)
+		printk(KERN_WARNING "Could not create 'kvm' debugfs directory\n");
+
+	return d_kvm_debug;
+}
+
+static int __init kvm_spinlock_debugfs(void)
+{
+	struct dentry *d_kvm = kvm_init_debugfs();
+
+	if (d_kvm == NULL)
+		return -ENOMEM;
+
+	d_spin_debug = debugfs_create_dir("spinlocks", d_kvm);
+
+	debugfs_create_u8("zero_stats", 0644, d_spin_debug, &zero_stats);
+
+	debugfs_create_u32("taken_slow", 0444, d_spin_debug,
+			   &spinlock_stats.taken_slow);
+	debugfs_create_u32("taken_slow_pickup", 0444, d_spin_debug,
+			   &spinlock_stats.taken_slow_pickup);
+
+	debugfs_create_u32("released_slow", 0444, d_spin_debug,
+			   &spinlock_stats.released_slow);
+	debugfs_create_u32("released_slow_kicked", 0444, d_spin_debug,
+			   &spinlock_stats.released_slow_kicked);
+
+	debugfs_create_u64("time_blocked", 0444, d_spin_debug,
+			   &spinlock_stats.time_blocked);
+
+	debugfs_create_u32_array("histo_blocked", 0444, d_spin_debug,
+		     spinlock_stats.histo_spin_blocked, HISTO_BUCKETS + 1);
+
+	return 0;
+}
+fs_initcall(kvm_spinlock_debugfs);
+#else  /* !CONFIG_KVM_DEBUG_FS */
+#define TIMEOUT			(1 << 10)
+#define ADD_STATS(elem, val)	do { (void)(val); } while (0)
+
+static inline u64 spin_time_start(void)
+{
+	return 0;
+}
+
+static inline void spin_time_accum_blocked(u64 start)
+{
+}
+#endif  /* CONFIG_KVM_DEBUG_FS */
+
+struct kvm_lock_waiting {
+	struct arch_spinlock *lock;
+	__ticket_t want;
+};
+
+/* cpus 'waiting' on a spinlock to become available */
+static cpumask_t waiting_cpus;
+
+/* Track spinlock on which a cpu is waiting */
+static DEFINE_PER_CPU(struct kvm_lock_waiting, lock_waiting);
+
+static inline void kvm_wait_for_kick(void)
+{
+	kvm_hypercall0(KVM_HC_WAIT_FOR_KICK);
+}
+
+static void kvm_lock_spinning(struct arch_spinlock *lock, __ticket_t want)
+{
+	struct kvm_lock_waiting *w = &__get_cpu_var(lock_waiting);
+	int cpu = smp_processor_id();
+	u64 start;
+	unsigned long flags;
+
+	start = spin_time_start();
+
+	/*
+	 * Make sure an interrupt handler can't upset things in a
+	 * partially setup state.
+	 */
+	local_irq_save(flags);
+
+	/*
+	 * The ordering protocol on this is that the "lock" pointer
+	 * may only be set non-NULL if the "want" ticket is correct.
+	 * If we're updating "want", we must first clear "lock".
+	 */
+	w->lock = NULL;
+	smp_wmb();
+	w->want = want;
+	smp_wmb();
+	w->lock = lock;
+
+	ADD_STATS(taken_slow, 1);
+
+	/*
+	 * This uses set_bit, which is atomic but we should not rely on its
+	 * reordering gurantees. So barrier is needed after this call.
+	 */
+	cpumask_set_cpu(cpu, &waiting_cpus);
+
+	barrier();
+
+	/*
+	 * Mark entry to slowpath before doing the pickup test to make
+	 * sure we don't deadlock with an unlocker.
+	 */
+	__ticket_enter_slowpath(lock);
+
+	/*
+	 * check again make sure it didn't become free while
+	 * we weren't looking.
+	 */
+	if (ACCESS_ONCE(lock->tickets.head) == want) {
+		ADD_STATS(taken_slow_pickup, 1);
+		goto out;
+	}
+
+	/* Allow interrupts while blocked */
+	local_irq_restore(flags);
+
+	kvm_wait_for_kick();
+
+	local_irq_save(flags);
+out:
+	cpumask_clear_cpu(cpu, &waiting_cpus);
+	w->lock = NULL;
+	local_irq_restore(flags);
+	spin_time_accum_blocked(start);
+}
+PV_CALLEE_SAVE_REGS_THUNK(kvm_lock_spinning);
+
+/* Kick a cpu */
+static inline void kvm_kick_cpu(int cpu)
+{
+	kvm_hypercall1(KVM_HC_KICK_CPU, cpu);
+}
+
+/* Kick vcpu waiting on @lock->head to reach value @ticket */
+static void kvm_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
+{
+	int cpu;
+
+	ADD_STATS(released_slow, 1);
+
+	for_each_cpu(cpu, &waiting_cpus) {
+		const struct kvm_lock_waiting *w = &per_cpu(lock_waiting, cpu);
+		if (ACCESS_ONCE(w->lock) == lock &&
+		    ACCESS_ONCE(w->want) == ticket) {
+			ADD_STATS(released_slow_kicked, 1);
+			kvm_kick_cpu(cpu);
+			break;
+		}
+	}
+}
+
+/*
+ * Setup pv_lock_ops to exploit KVM_FEATURE_WAIT_FOR_KICK if present.
+ * This needs to be setup really early in boot, before the first call to
+ * spinlock is issued!
+ */
+void __init kvm_guest_early_init(void)
+{
+	if (!kvm_para_available())
+		return;
+	/* Does host kernel support KVM_FEATURE_WAIT_FOR_KICK? */
+	if (!kvm_para_has_feature(KVM_FEATURE_WAIT_FOR_KICK))
+		return;
+
+	jump_label_inc(&paravirt_ticketlocks_enabled);
+
+	pv_lock_ops.lock_spinning = PV_CALLEE_SAVE(kvm_lock_spinning);
+	pv_lock_ops.unlock_kick = kvm_unlock_kick;
+}
+#endif	/* CONFIG_PARAVIRT_SPINLOCKS */

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:45:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:45:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIk7e-0004Sk-VS; Tue, 25 Oct 2011 09:45:07 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RI6Rg-0002Gu-AV
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 15:23:08 -0700
X-Env-Sender: gregkh@suse.de
X-Msg-Ref: server-13.tower-27.messagelabs.com!1319408569!45440944!1
X-Originating-IP: [195.135.220.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10153 invoked from network); 23 Oct 2011 22:22:50 -0000
Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 23 Oct 2011 22:22:50 -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 193308F0D1;
	Mon, 24 Oct 2011 00:23:04 +0200 (CEST)
Date: Mon, 24 Oct 2011 00:20:12 +0200
From: Greg KH <gregkh@suse.de>
To: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
Message-ID: <20111023222012.GB591@suse.de>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190403.16364.30897.sendpatchset@oc5400248562.ibm.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111023190403.16364.30897.sendpatchset@oc5400248562.ibm.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, KVM <kvm@vger.kernel.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>, x86@kernel.org,
	LKML <linux-kernel@vger.kernel.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>, Ingo Molnar <mingo@redhat.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Avi Kivity <avi@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>, Xen <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 1/5] debugfs: Add support to print
 u32 array in debugfs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 24, 2011 at 12:34:04AM +0530, Raghavendra K T wrote:
> Add debugfs support to print u32-arrays in debugfs. Move the code from Xen to debugfs
> to make the code common for other users as well.

You forgot the kerneldoc for the function explaining what it is and how
to use it, and the EXPORT_SYMBOL_GPL() marking for the global function
as that's the only way it will be able to be used, right?

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 Tue Oct 25 09:46:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09: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 1RIk8l-0004qS-L0; Tue, 25 Oct 2011 09:46:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RI6Rg-0002Gv-S0
	for xen-devel@lists.xensource.com; Sun, 23 Oct 2011 15:23:09 -0700
X-Env-Sender: gregkh@suse.de
X-Msg-Ref: server-5.tower-182.messagelabs.com!1319408585!484493!1
X-Originating-IP: [195.135.220.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12274 invoked from network); 23 Oct 2011 22:23:05 -0000
Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15)
	by server-5.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 23 Oct 2011 22:23:05 -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 CD9F58EFD4;
	Mon, 24 Oct 2011 00:23:03 +0200 (CEST)
Date: Mon, 24 Oct 2011 00:19:20 +0200
From: Greg KH <gregkh@suse.de>
To: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
Message-ID: <20111023221920.GA591@suse.de>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190459.16364.98151.sendpatchset@oc5400248562.ibm.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111023190459.16364.98151.sendpatchset@oc5400248562.ibm.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, KVM <kvm@vger.kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Peter Zijlstra <peterz@infradead.org>, x86@kernel.org,
	LKML <linux-kernel@vger.kernel.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>, Ingo Molnar <mingo@redhat.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Avi Kivity <avi@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>, Xen <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 2/5] debugfs: Renaming of xen
 functions and change unsigned to u32
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 24, 2011 at 12:34:59AM +0530, Raghavendra K T wrote:
> Renaming of xen functions and change unsigned to u32.

Why not just rename when you move the functions?  Why the extra step?

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 Tue Oct 25 09:47:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:47:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIk9d-0005DZ-TL; Tue, 25 Oct 2011 09:47:09 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIGRF-0001Rx-PO
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:03:23 -0700
X-Env-Sender: levinsasha928@gmail.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319446998!34299888!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15948 invoked from network); 24 Oct 2011 09:03:18 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-6.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 09:03:18 -0000
Received: by eyb6 with SMTP id 6so9314918eyb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 02:03:18 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=subject:from:to:cc:in-reply-to:references:content-type:date
	:message-id:mime-version:x-mailer:content-transfer-encoding;
	bh=xdE63svkE8xApoPJZo4t63/p17LJ2HxRmtAzt8IYpt8=;
	b=e3+h1PmZTlfrvXBJlTOQq/Gf/GlaOjDgK4+YqKdeLxbhzE6IXDLN8g/FwqcFhx40/9
	jbSFMWS0CtRXxgXGi5UnWmvoKqaYI/mLa7vAhSZB03joc3AvHHmKuyNu6TFUBrOkyv9z
	U1CCJmh7cvDwa1nz72rFe87ezZj7c/OyM/Q1I=
Received: by 10.14.16.97 with SMTP id g73mr2596504eeg.73.1319446998008;
	Mon, 24 Oct 2011 02:03:18 -0700 (PDT)
Received: from [192.168.16.148] (IGLD-84-229-11-202.inter.net.il.
	[84.229.11.202])
	by mx.google.com with ESMTPS id q28sm19971597eea.6.2011.10.24.02.03.13
	(version=SSLv3 cipher=OTHER); Mon, 24 Oct 2011 02:03:16 -0700 (PDT)
From: Sasha Levin <levinsasha928@gmail.com>
To: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
In-Reply-To: <20111023190700.16364.7548.sendpatchset@oc5400248562.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190700.16364.7548.sendpatchset@oc5400248562.ibm.com>
Content-Type: text/plain; charset="us-ascii"
Date: Mon, 24 Oct 2011 12:01:45 +0200
Message-ID: <1319450505.5660.5.camel@lappy>
Mime-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:19 -0700
Cc: Marcelo Tosatti <mtosatti@redhat.com>, Jeremy,
	Gleb Natapov <gleb@redhat.com>, Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>, "H. Peter
	Anvin" <hpa@zytor.com>, Sedat,
	Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>, KVM <kvm@vger.kernel.org>,
	x86@kernel.org, Ingo Molnar <mingo@redhat.com>,
	Avi Kivity <avi@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Xen <xen-devel@lists.xensource.com>, Dilek <sedat.dilek@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>, Lu <yinghai@kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Greg Kroah-Hartman <gregkh@suse.de>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>, Yinghai
Subject: [Xen-devel] Re: [PATCH RFC V2 4/5] kvm guest : Added configuration
 support to enable debug information for KVM 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

On Mon, 2011-10-24 at 00:37 +0530, Raghavendra K T wrote:
> Added configuration support to enable debug information
> for KVM Guests in debugfs
>     
> Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
> Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
> Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
> ---
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 1f03f82..ed34269 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -562,6 +562,15 @@ config KVM_GUEST
>  	  This option enables various optimizations for running under the KVM
>  	  hypervisor.
>  
> +config KVM_DEBUG_FS
> +	bool "Enable debug information for KVM Guests in debugfs"
> +	depends on KVM_GUEST

Shouldn't it depend on DEBUG_FS as well?

> +	default n
> +	---help---
> +	  This option enables collection of various statistics for KVM guest.
> +   	  Statistics are displayed in debugfs filesystem. Enabling this option
> +	  may incur significant overhead.
> +
>  source "arch/x86/lguest/Kconfig"
>  
>  config PARAVIRT

-- 

Sasha.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:48:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 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 1RIkAY-0005bz-HZ; Tue, 25 Oct 2011 09:48:06 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIGRL-0001S4-4U
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:03:30 -0700
X-Env-Sender: levinsasha928@gmail.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319446998!34299888!2
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16336 invoked from network); 24 Oct 2011 09:03:24 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-6.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 09:03:24 -0000
Received: by mail-ey0-f171.google.com with SMTP id 6so9314918eyb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 02:03:24 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=subject:from:to:cc:in-reply-to:references:content-type:date
	:message-id:mime-version:x-mailer:content-transfer-encoding;
	bh=pxWSMpqkZZLRrPojdi1ECMiB4nMeIjzhr/fy5b1WBxQ=;
	b=qgT958fzbTcYEyV4B8Vu3cEW9h38gwcf8RiwYBpHKEb1PRRu+Ukuq+wM7AR7kStASV
	P/XTJD44FQ124BfQczRUGd503nwetOWiHQHwX360COoTuDE8On30b8Nj4W/7jI9CKStB
	UA+X9p2iFbn662stwo9ALEvkZWqgY5BSY4/f4=
Received: by 10.14.35.93 with SMTP id t69mr2616375eea.206.1319447003914;
	Mon, 24 Oct 2011 02:03:23 -0700 (PDT)
Received: from [192.168.16.148] (IGLD-84-229-11-202.inter.net.il.
	[84.229.11.202])
	by mx.google.com with ESMTPS id v3sm45218420eej.7.2011.10.24.02.03.19
	(version=SSLv3 cipher=OTHER); Mon, 24 Oct 2011 02:03:23 -0700 (PDT)
From: Sasha Levin <levinsasha928@gmail.com>
To: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
In-Reply-To: <20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
Content-Type: text/plain; charset="us-ascii"
Date: Mon, 24 Oct 2011 12:01:50 +0200
Message-ID: <1319450510.5660.6.camel@lappy>
Mime-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:19 -0700
Cc: Marcelo Tosatti <mtosatti@redhat.com>, KVM <kvm@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>, Suzuki,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, x86@kernel.org,
	Ingo Molnar <mingo@redhat.com>, Kivity <avi@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Xen <xen-devel@lists.xensource.com>, Sedat Dilek <sedat.dilek@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>, Wilk <konrad.wilk@oracle.com>,
	Greg Kroah-Hartman <gregkh@suse.de>, LKML <linux-kernel@vger.kernel.org>,
	Poulose <suzuki@linux.vnet.ibm.com>, Konrad, Avi
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-24 at 00:35 +0530, Raghavendra K T wrote:
> Add two hypercalls to KVM hypervisor to support pv-ticketlocks.
>     
> KVM_HC_WAIT_FOR_KICK blocks the calling vcpu until another vcpu kicks it or it
> is woken up because of an event like interrupt.
>    
> KVM_HC_KICK_CPU allows the calling vcpu to kick another vcpu.
>     
> The presence of these hypercalls is indicated to guest via
> KVM_FEATURE_WAIT_FOR_KICK/KVM_CAP_WAIT_FOR_KICK.
> 
> Qemu needs a corresponding patch to pass up the presence of this feature to 
> guest via cpuid. Patch to qemu will be sent separately.
> 
> There is no Xen/KVM hypercall interface to await kick from.
>     
> Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
> Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
> Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
> ---
> diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h
> index 734c376..2874c19 100644
> --- a/arch/x86/include/asm/kvm_para.h
> +++ b/arch/x86/include/asm/kvm_para.h
> @@ -16,12 +16,14 @@
>  #define KVM_FEATURE_CLOCKSOURCE		0
>  #define KVM_FEATURE_NOP_IO_DELAY	1
>  #define KVM_FEATURE_MMU_OP		2
> +
>  /* This indicates that the new set of kvmclock msrs
>   * are available. The use of 0x11 and 0x12 is deprecated
>   */
>  #define KVM_FEATURE_CLOCKSOURCE2        3
>  #define KVM_FEATURE_ASYNC_PF		4
>  #define KVM_FEATURE_STEAL_TIME		5
> +#define KVM_FEATURE_WAIT_FOR_KICK       6
>  
>  /* The last 8 bits are used to indicate how to interpret the flags field
>   * in pvclock structure. If no bits are set, all flags are ignored.
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index 84a28ea..b43fd18 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -2077,6 +2077,7 @@ int kvm_dev_ioctl_check_extension(long ext)
>  	case KVM_CAP_XSAVE:
>  	case KVM_CAP_ASYNC_PF:
>  	case KVM_CAP_GET_TSC_KHZ:
> +	case KVM_CAP_WAIT_FOR_KICK:
>  		r = 1;
>  		break;
>  	case KVM_CAP_COALESCED_MMIO:
> @@ -2548,7 +2549,8 @@ static void do_cpuid_ent(struct kvm_cpuid_entry2 *entry, u32 function,
>  			     (1 << KVM_FEATURE_NOP_IO_DELAY) |
>  			     (1 << KVM_FEATURE_CLOCKSOURCE2) |
>  			     (1 << KVM_FEATURE_ASYNC_PF) |
> -			     (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT);
> +			     (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT) |
> +			     (1 << KVM_FEATURE_WAIT_FOR_KICK);
>  
>  		if (sched_info_on())
>  			entry->eax |= (1 << KVM_FEATURE_STEAL_TIME);
> @@ -5231,6 +5233,61 @@ int kvm_hv_hypercall(struct kvm_vcpu *vcpu)
>  	return 1;
>  }
>  
> +/*
> + * kvm_pv_wait_for_kick_op : Block until kicked by either a KVM_HC_KICK_CPU
> + * hypercall or a event like interrupt.
> + *
> + * @vcpu : vcpu which is blocking.
> + */
> +static void kvm_pv_wait_for_kick_op(struct kvm_vcpu *vcpu)
> +{
> +	DEFINE_WAIT(wait);
> +
> +	/*
> +	 * Blocking on vcpu->wq allows us to wake up sooner if required to
> +	 * service pending events (like interrupts).
> +	 *
> +	 * Also set state to TASK_INTERRUPTIBLE before checking vcpu->kicked to
> +	 * avoid racing with kvm_pv_kick_cpu_op().
> +	 */
> +	prepare_to_wait(&vcpu->wq, &wait, TASK_INTERRUPTIBLE);
> +
> +	/*
> +	 * Somebody has already tried kicking us. Acknowledge that
> +	 * and terminate the wait.
> +	 */
> +	if (vcpu->kicked) {
> +		vcpu->kicked = 0;
> +		goto end_wait;
> +	}
> +
> +	/* Let's wait for either KVM_HC_KICK_CPU or someother event
> +	 * to wake us up.
> +	 */
> +
> +	srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
> +	schedule();
> +	vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
> +
> +end_wait:
> +	finish_wait(&vcpu->wq, &wait);
> +}
> +
> +/*
> + * kvm_pv_kick_cpu_op:  Kick a vcpu.
> + *
> + * @cpu - vcpu to be kicked.
> + */
> +static void kvm_pv_kick_cpu_op(struct kvm *kvm, int cpu)
> +{
> +	struct kvm_vcpu *vcpu = kvm_get_vcpu(kvm, cpu);
> +
> +	if (vcpu) {
> +		vcpu->kicked = 1;

I'm not sure about it, but maybe we want a memory barrier over here?

> +		wake_up_interruptible(&vcpu->wq);
> +	}
> +}
-- 

Sasha.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:49:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:49:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkBU-000621-W2; Tue, 25 Oct 2011 09:49:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIGRR-0001SB-FL
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:03:34 -0700
X-Env-Sender: levinsasha928@gmail.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319446998!34299888!3
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16922 invoked from network); 24 Oct 2011 09:03:30 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-6.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 09:03:30 -0000
Received: by mail-ey0-f171.google.com with SMTP id 6so9314918eyb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 24 Oct 2011 02:03:30 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma;
	h=subject:from:to:cc:in-reply-to:references:content-type:date
	:message-id:mime-version:x-mailer:content-transfer-encoding;
	bh=86wZ2NBdVoO+VLTEkZflCxX5gN2dncJEnSS3GMoT2FQ=;
	b=P6KAev11O2e8v3xmELDorF8AMN41xbON40Br5aUY/ZHxnYERwbqDuguW1+7vut+w9y
	ypboYn/QAu3kSYnLj5u0bcbs9OA3PE/bwji03TldEvpgrGjII1gJ/KdxPlTqxU2TBBI/
	yvy5zmsUbzjiIbzuk30ZcW6QnaIcQb4EYfMLU=
Received: by 10.213.27.200 with SMTP id j8mr2666747ebc.144.1319447010363;
	Mon, 24 Oct 2011 02:03:30 -0700 (PDT)
Received: from [192.168.16.148] (IGLD-84-229-11-202.inter.net.il.
	[84.229.11.202])
	by mx.google.com with ESMTPS id q50sm58432448eef.9.2011.10.24.02.03.25
	(version=SSLv3 cipher=OTHER); Mon, 24 Oct 2011 02:03:29 -0700 (PDT)
From: Sasha Levin <levinsasha928@gmail.com>
To: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
In-Reply-To: <20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
Content-Type: text/plain; charset="us-ascii"
Date: Mon, 24 Oct 2011 12:01:54 +0200
Message-ID: <1319450514.5660.7.camel@lappy>
Mime-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:19 -0700
Cc: Tosatti <mtosatti@redhat.com>, KVM <kvm@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>, Suzuki, Sedat,
	Xen <xen-devel@lists.xensource.com>, Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, x86@kernel.org,
	Ingo Molnar <mingo@redhat.com>, Kivity <avi@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>, Marcelo,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>, Wilk <konrad.wilk@oracle.com>,
	Greg Kroah-Hartman <gregkh@suse.de>, LKML <linux-kernel@vger.kernel.org>,
	Poulose <suzuki@linux.vnet.ibm.com>, Konrad, Avi
Subject: [Xen-devel] Re: [PATCH RFC V2 5/5] kvm guest : pv-ticketlocks
 support for linux guests running on KVM hypervisor
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-24 at 00:37 +0530, Raghavendra K T wrote:
> This patch extends Linux guests running on KVM hypervisor to support
> pv-ticketlocks. Very early during bootup, paravirtualied KVM guest detects if 
> the hypervisor has required feature (KVM_FEATURE_WAIT_FOR_KICK) to support 
> pv-ticketlocks. If so, support for pv-ticketlocks is registered via pv_lock_ops.
> 
> Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
> Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
> Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
> ---
> diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h
> index 2874c19..c7f34b7 100644
> --- a/arch/x86/include/asm/kvm_para.h
> +++ b/arch/x86/include/asm/kvm_para.h
> @@ -195,10 +195,18 @@ void kvm_async_pf_task_wait(u32 token);
>  void kvm_async_pf_task_wake(u32 token);
>  u32 kvm_read_and_reset_pf_reason(void);
>  extern void kvm_disable_steal_time(void);
> -#else
> +
> +#ifdef CONFIG_PARAVIRT_SPINLOCKS
> +void __init kvm_guest_early_init(void);
> +#else /* CONFIG_PARAVIRT_SPINLOCKS */
> +#define kvm_guest_early_init() do { } while (0)

This should be defined as an empty function.

-- 

Sasha.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:50:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:50:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkCc-0006VH-W8; Tue, 25 Oct 2011 09:50:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIGpY-0001qw-00
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:28:28 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1319448501!36467662!1
X-Originating-IP: [122.248.162.3]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15712 invoked from network); 24 Oct 2011 09:28:24 -0000
Received: from e28smtp03.in.ibm.com (HELO e28smtp03.in.ibm.com) (122.248.162.3)
	by server-13.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 24 Oct 2011 09:28:24 -0000
Received: from d28relay03.in.ibm.com (d28relay03.in.ibm.com [9.184.220.60])
	by e28smtp03.in.ibm.com (8.14.4/8.13.1) with ESMTP id p9O9SK9I008574
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 14:58:20 +0530
Received: from d28av03.in.ibm.com (d28av03.in.ibm.com [9.184.220.65])
	by d28relay03.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9O9SKkD4288714
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 14:58:20 +0530
Received: from d28av03.in.ibm.com (loopback [127.0.0.1])
	by d28av03.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9O9SJL9011110
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 20:28:20 +1100
Received: from oc5400248562.ibm.com (oc5400248562.in.ibm.com [9.124.158.131])
	by d28av03.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9O9SJ6m011104; Mon, 24 Oct 2011 20:28:19 +1100
Message-ID: <4EA52FCF.2090508@linux.vnet.ibm.com>
Date: Mon, 24 Oct 2011 14:58:47 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Greg KH <gregkh@suse.de>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190459.16364.98151.sendpatchset@oc5400248562.ibm.com>
	<20111023221920.GA591@suse.de>
In-Reply-To: <20111023221920.GA591@suse.de>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: x86@kernel.org, Gleb Natapov <gleb@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>, KVM <kvm@vger.kernel.org>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Avi Kivity <avi@redhat.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Xen <xen-devel@lists.xensource.com>, Sedat Dilek <sedat.dilek@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>, Yinghai Lu <yinghai@kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 2/5] debugfs: Renaming of xen
 functions and change unsigned to u32
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/24/2011 03:49 AM, Greg KH wrote:
> On Mon, Oct 24, 2011 at 12:34:59AM +0530, Raghavendra K T wrote:
>> Renaming of xen functions and change unsigned to u32.
>
> Why not just rename when you move the functions?  Why the extra step?
>
Intention was only clarity. Yes, if this patch is an overhead, I 'll 
combine both the patches.
> 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 Tue Oct 25 09:51:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:51:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkDS-0006sS-5g; Tue, 25 Oct 2011 09:51:06 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIGrT-0001t6-CW
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:30:27 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1319448619!817341!1
X-Originating-IP: [122.248.162.1]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30417 invoked from network); 24 Oct 2011 09:30:23 -0000
Received: from e28smtp01.in.ibm.com (HELO e28smtp01.in.ibm.com) (122.248.162.1)
	by server-7.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 09:30:23 -0000
Received: from d28relay03.in.ibm.com (d28relay03.in.ibm.com [9.184.220.60])
	by e28smtp01.in.ibm.com (8.14.4/8.13.1) with ESMTP id p9O9UIXZ004735
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 15:00:18 +0530
Received: from d28av03.in.ibm.com (d28av03.in.ibm.com [9.184.220.65])
	by d28relay03.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9O9UIu74370678
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 15:00:18 +0530
Received: from d28av03.in.ibm.com (loopback [127.0.0.1])
	by d28av03.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9O9UG7A014251
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 20:30:18 +1100
Received: from oc5400248562.ibm.com (oc5400248562.in.ibm.com [9.124.158.131])
	by d28av03.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9O9UGvu014246; Mon, 24 Oct 2011 20:30:16 +1100
Message-ID: <4EA53044.2020902@linux.vnet.ibm.com>
Date: Mon, 24 Oct 2011 15:00:44 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Greg KH <gregkh@suse.de>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190403.16364.30897.sendpatchset@oc5400248562.ibm.com>
	<20111023222012.GB591@suse.de>
In-Reply-To: <20111023222012.GB591@suse.de>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: x86@kernel.org, KVM <kvm@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>, Xen <xen-devel@lists.xensource.com>,
	Dave Jiang <dave.jiang@intel.com>, Gleb Natapov <gleb@redhat.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Avi Kivity <avi@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Marcelo Tosatti <mtosatti@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 1/5] debugfs: Add support to print
 u32 array in debugfs
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/24/2011 03:50 AM, Greg KH wrote:
> On Mon, Oct 24, 2011 at 12:34:04AM +0530, Raghavendra K T wrote:
>> Add debugfs support to print u32-arrays in debugfs. Move the code from Xen to debugfs
>> to make the code common for other users as well.
>
> You forgot the kerneldoc for the function explaining what it is and how
> to use it, and the EXPORT_SYMBOL_GPL() marking for the global function
> as that's the only way it will be able to be used, right?
>
Greg right. Thanks for finding this. I 'll update the patch for that.
> 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 Tue Oct 25 09:51:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:51:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkED-0007Eu-Ia; Tue, 25 Oct 2011 09:51:53 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIGuL-0002KB-4c
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:33:25 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1319448798!1305060!1
X-Originating-IP: [202.81.31.148]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7548 invoked from network); 24 Oct 2011 09:33:21 -0000
Received: from e23smtp06.au.ibm.com (HELO e23smtp06.au.ibm.com) (202.81.31.148)
	by server-9.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 09:33:21 -0000
Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [202.81.31.245])
	by e23smtp06.au.ibm.com (8.14.4/8.13.1) with ESMTP id p9O9W1CE004837
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 20:32:01 +1100
Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139])
	by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9O9XHtt2465854
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 20:33:17 +1100
Received: from d23av04.au.ibm.com (loopback [127.0.0.1])
	by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9O9XF0M020673
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 20:33:17 +1100
Received: from oc5400248562.ibm.com (oc5400248562.in.ibm.com [9.124.158.131])
	by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9O9WrfF020176; Mon, 24 Oct 2011 20:32:55 +1100
Message-ID: <4EA530E0.9070107@linux.vnet.ibm.com>
Date: Mon, 24 Oct 2011 15:03:20 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Sasha Levin <levinsasha928@gmail.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
	<1319450514.5660.7.camel@lappy>
In-Reply-To: <1319450514.5660.7.camel@lappy>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: x86@kernel.org, KVM <kvm@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>, Xen <xen-devel@lists.xensource.com>,
	Dave Jiang <dave.jiang@intel.com>, Gleb Natapov <gleb@redhat.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Avi Kivity <avi@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>, Greg Kroah-Hartman <gregkh@suse.de>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Marcelo Tosatti <mtosatti@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 5/5] kvm guest : pv-ticketlocks
 support for linux guests running on KVM hypervisor
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/24/2011 03:31 PM, Sasha Levin wrote:
> On Mon, 2011-10-24 at 00:37 +0530, Raghavendra K T wrote:
>> +#else /* CONFIG_PARAVIRT_SPINLOCKS */
>> +#define kvm_guest_early_init() do { } while (0)
>
> This should be defined as an empty function.
>
Yes Agree, I 'll change to an empty function.
- Raghu


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:52:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:52:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkF8-0007eF-Lb; Tue, 25 Oct 2011 09:52:50 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIH3h-0003gH-Ow
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 02:43:06 -0700
X-Env-Sender: gregkh@suse.de
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319449357!50339732!1
X-Originating-IP: [195.135.220.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2859 invoked from network); 24 Oct 2011 09:42:37 -0000
Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 09:42:37 -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 C99208FA97;
	Mon, 24 Oct 2011 11:43:01 +0200 (CEST)
Date: Mon, 24 Oct 2011 11:38:29 +0200
From: Greg KH <gregkh@suse.de>
To: Raghavendra K T <raghukt@linux.vnet.ibm.com>
Message-ID: <20111024093829.GA2214@suse.de>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190459.16364.98151.sendpatchset@oc5400248562.ibm.com>
	<20111023221920.GA591@suse.de>
	<4EA52FCF.2090508@linux.vnet.ibm.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA52FCF.2090508@linux.vnet.ibm.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: x86@kernel.org, Gleb Natapov <gleb@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>, KVM <kvm@vger.kernel.org>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Avi Kivity <avi@redhat.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Xen <xen-devel@lists.xensource.com>, Sedat Dilek <sedat.dilek@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>, Yinghai Lu <yinghai@kernel.org>,
	Marcelo Tosatti <mtosatti@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 2/5] debugfs: Renaming of xen
 functions and change unsigned to u32
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 24, 2011 at 02:58:47PM +0530, Raghavendra K T wrote:
> On 10/24/2011 03:49 AM, Greg KH wrote:
> >On Mon, Oct 24, 2011 at 12:34:59AM +0530, Raghavendra K T wrote:
> >>Renaming of xen functions and change unsigned to u32.
> >
> >Why not just rename when you move the functions?  Why the extra step?
> >
> Intention was only clarity. Yes, if this patch is an overhead, I 'll
> combine both the patches.

Yeah, it makes more sense as it originally confused me why you were
adding a "xen_*" function to the debugfs core code :)

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 Tue Oct 25 09:53:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:53:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkG4-00081q-CR; Tue, 25 Oct 2011 09:53:48 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIHYt-0005OF-Eu
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 03:15:19 -0700
X-Env-Sender: avi@redhat.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1319451311!1432642!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10536 invoked from network); 24 Oct 2011 10:15:11 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-2.tower-21.messagelabs.com with SMTP;
	24 Oct 2011 10:15:11 -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 p9OAERUW023984
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 06:14:28 -0400
Received: from mermaid.qumranet.com (vpn-10-93.rdu.redhat.com [10.11.10.93])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9OAELhg018649; Mon, 24 Oct 2011 06:14:22 -0400
Message-ID: <4EA53A7D.300@redhat.com>
Date: Mon, 24 Oct 2011 12:14:21 +0200
From: Avi Kivity <avi@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
In-Reply-To: <20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Greg Kroah-Hartman <gregkh@suse.de>, Dave Jiang <dave.jiang@intel.com>,
	KVM <kvm@vger.kernel.org>, Gleb Natapov <gleb@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>, x86@kernel.org,
	LKML <linux-kernel@vger.kernel.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Sedat Dilek <sedat.dilek@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Yinghai Lu <yinghai@kernel.org>,
	Xen <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/23/2011 09:05 PM, Raghavendra K T wrote:
> Add two hypercalls to KVM hypervisor to support pv-ticketlocks.
>     
> KVM_HC_WAIT_FOR_KICK blocks the calling vcpu until another vcpu kicks it or it
> is woken up because of an event like interrupt.
>    
> KVM_HC_KICK_CPU allows the calling vcpu to kick another vcpu.
>     
> The presence of these hypercalls is indicated to guest via
> KVM_FEATURE_WAIT_FOR_KICK/KVM_CAP_WAIT_FOR_KICK.
>
> Qemu needs a corresponding patch to pass up the presence of this feature to 
> guest via cpuid. Patch to qemu will be sent separately.
>
> There is no Xen/KVM hypercall interface to await kick from.
>     
>  
> +/*
> + * kvm_pv_wait_for_kick_op : Block until kicked by either a KVM_HC_KICK_CPU
> + * hypercall or a event like interrupt.
> + *
> + * @vcpu : vcpu which is blocking.
> + */
> +static void kvm_pv_wait_for_kick_op(struct kvm_vcpu *vcpu)
> +{
> +	DEFINE_WAIT(wait);
> +
> +	/*
> +	 * Blocking on vcpu->wq allows us to wake up sooner if required to
> +	 * service pending events (like interrupts).
> +	 *
> +	 * Also set state to TASK_INTERRUPTIBLE before checking vcpu->kicked to
> +	 * avoid racing with kvm_pv_kick_cpu_op().
> +	 */
> +	prepare_to_wait(&vcpu->wq, &wait, TASK_INTERRUPTIBLE);
> +
> +	/*
> +	 * Somebody has already tried kicking us. Acknowledge that
> +	 * and terminate the wait.
> +	 */
> +	if (vcpu->kicked) {
> +		vcpu->kicked = 0;
> +		goto end_wait;
> +	}
> +
> +	/* Let's wait for either KVM_HC_KICK_CPU or someother event
> +	 * to wake us up.
> +	 */
> +
> +	srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx);
> +	schedule();
> +	vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu);
> +
> +end_wait:
> +	finish_wait(&vcpu->wq, &wait);
> +}

This hypercall can be replaced by a HLT instruction, no?

I'm pretty sure this misses a lot of stuff from kvm_vcpu_block().

> +
> +/*
> + * kvm_pv_kick_cpu_op:  Kick a vcpu.
> + *
> + * @cpu - vcpu to be kicked.
> + */
> +static void kvm_pv_kick_cpu_op(struct kvm *kvm, int cpu)
> +{
> +	struct kvm_vcpu *vcpu = kvm_get_vcpu(kvm, cpu);
> +

Is the vcpu number meaningful?  We should reuse an existing identifier
like the APIC ID.

> +	if (vcpu) {
> +		vcpu->kicked = 1;

Need to use smp memory barriers here.

> +		wake_up_interruptible(&vcpu->wq);
> +	}
> +}
> +
>  int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
>  {
>  	unsigned long nr, a0, a1, a2, a3, ret;
>

-- 
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:54:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:54:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkGu-0008Ow-LA; Tue, 25 Oct 2011 09:54:40 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIHZV-0005Ok-NE
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 03:15:58 -0700
X-Env-Sender: avi@redhat.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1319451353!36426192!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27160 invoked from network); 24 Oct 2011 10:15:54 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-14.tower-174.messagelabs.com with SMTP;
	24 Oct 2011 10:15:54 -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 p9OAFKYj024615
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 06:15:20 -0400
Received: from mermaid.qumranet.com (vpn-10-93.rdu.redhat.com [10.11.10.93])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9OAFEk1018866; Mon, 24 Oct 2011 06:15:15 -0400
Message-ID: <4EA53AB2.9050805@redhat.com>
Date: Mon, 24 Oct 2011 12:15:14 +0200
From: Avi Kivity <avi@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190700.16364.7548.sendpatchset@oc5400248562.ibm.com>
In-Reply-To: <20111023190700.16364.7548.sendpatchset@oc5400248562.ibm.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, KVM <kvm@vger.kernel.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>, LKML <linux-kernel@vger.kernel.org>,
	Greg Kroah-Hartman <gregkh@suse.de>, x86@kernel.org,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>, Ingo Molnar <mingo@redhat.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Sedat Dilek <sedat.dilek@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>, Yinghai Lu <yinghai@kernel.org>,
	Xen <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 4/5] kvm guest : Added configuration
 support to enable debug information for KVM 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

On 10/23/2011 09:07 PM, Raghavendra K T wrote:
> Added configuration support to enable debug information
> for KVM Guests in debugfs
>     
> Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
> Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
> Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
> ---
> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> index 1f03f82..ed34269 100644
> --- a/arch/x86/Kconfig
> +++ b/arch/x86/Kconfig
> @@ -562,6 +562,15 @@ config KVM_GUEST
>  	  This option enables various optimizations for running under the KVM
>  	  hypervisor.
>  
> +config KVM_DEBUG_FS
> +	bool "Enable debug information for KVM Guests in debugfs"
> +	depends on KVM_GUEST
> +	default n
> +	---help---
> +	  This option enables collection of various statistics for KVM guest.
> +   	  Statistics are displayed in debugfs filesystem. Enabling this option
> +	  may incur significant overhead.
> +
>  source "arch/x86/lguest/Kconfig"
>  
>

This might be better implemented through tracepoints, which an be
enabled dynamically.

-- 
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:55:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:55:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkI5-0000L9-Rn; Tue, 25 Oct 2011 09:55:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIIGc-00076x-Fa
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 04:01:15 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319454022!832704!1
X-Originating-IP: [122.248.162.4]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 521 invoked from network); 24 Oct 2011 11:00:23 -0000
Received: from e28smtp04.in.ibm.com (HELO e28smtp04.in.ibm.com) (122.248.162.4)
	by server-13.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 24 Oct 2011 11:00:23 -0000
Received: from d28relay01.in.ibm.com (d28relay01.in.ibm.com [9.184.220.58])
	by e28smtp04.in.ibm.com (8.14.4/8.13.1) with ESMTP id p9OB0LKj023280
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 16:30:21 +0530
Received: from d28av02.in.ibm.com (d28av02.in.ibm.com [9.184.220.64])
	by d28relay01.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9OB0Lap4038720
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 16:30:21 +0530
Received: from d28av02.in.ibm.com (loopback [127.0.0.1])
	by d28av02.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9OB0I5Z029323
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 22:00:20 +1100
Received: from oc5400248562.ibm.com (oc5400248562.in.ibm.com [9.124.158.131])
	by d28av02.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9OB0IYu029305; Mon, 24 Oct 2011 22:00:18 +1100
Message-ID: <4EA5455E.5090007@linux.vnet.ibm.com>
Date: Mon, 24 Oct 2011 16:30:46 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Sasha Levin <levinsasha928@gmail.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
	<1319450510.5660.6.camel@lappy>
In-Reply-To: <1319450510.5660.6.camel@lappy>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: x86@kernel.org, KVM <kvm@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>, Gleb Natapov <gleb@redhat.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Avi Kivity <avi@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Xen <xen-devel@lists.xensource.com>, Sedat Dilek <sedat.dilek@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>, Yinghai Lu <yinghai@kernel.org>,
	Greg Kroah-Hartman <gregkh@suse.de>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Marcelo Tosatti <mtosatti@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/24/2011 03:31 PM, Sasha Levin wrote:
> On Mon, 2011-10-24 at 00:35 +0530, Raghavendra K T wrote:
>> Add two hypercalls to KVM hypervisor to support pv-ticketlocks.
>>
>> +static void kvm_pv_kick_cpu_op(struct kvm *kvm, int cpu)
>> +{
>> +	struct kvm_vcpu *vcpu = kvm_get_vcpu(kvm, cpu);
>> +
>> +	if (vcpu) {
>> +		vcpu->kicked = 1;
>
> I'm not sure about it, but maybe we want a memory barrier over here?

Yes, Thanks for pointing this. Avi Kivity also pointed same. 'll add 
barrier() here.

>
>> +		wake_up_interruptible(&vcpu->wq);
>> +	}
>> +}


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:57:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:57:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkJM-0000me-Cl; Tue, 25 Oct 2011 09:57:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIIZJ-0007af-DW
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 04:19:49 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319455153!54061305!1
X-Originating-IP: [122.248.162.8]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11597 invoked from network); 24 Oct 2011 11:19:14 -0000
Received: from e28smtp08.in.ibm.com (HELO e28smtp08.in.ibm.com) (122.248.162.8)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 11:19:14 -0000
Received: from /spool/local
	by e28smtp08.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use
	Only! Violators will be prosecuted
	for <xen-devel@lists.xensource.com> from <raghukt@linux.vnet.ibm.com>; 
	Mon, 24 Oct 2011 16:49:44 +0530
Received: from d28relay03.in.ibm.com ([9.184.220.60])
	by e28smtp08.in.ibm.com ([192.168.1.138]) with IBM ESMTP SMTP Gateway:
	Authorized Use Only! Violators will be prosecuted; 
	Mon, 24 Oct 2011 16:49:42 +0530
Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63])
	by d28relay03.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9OBJfhL1761318
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 16:49:41 +0530
Received: from d28av01.in.ibm.com (loopback [127.0.0.1])
	by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9OBJeDp015746
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 16:49:41 +0530
Received: from oc5400248562.ibm.com (oc5400248562.in.ibm.com [9.124.158.131])
	by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9OBJdxM015736; Mon, 24 Oct 2011 16:49:39 +0530
Message-ID: <4EA549E7.9090601@linux.vnet.ibm.com>
Date: Mon, 24 Oct 2011 16:50:07 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Avi Kivity <avi@redhat.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
	<4EA53A7D.300@redhat.com>
In-Reply-To: <4EA53A7D.300@redhat.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
x-cbid: 11102411-2000-0000-0000-000000A9E659
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: x86@kernel.org, KVM <kvm@vger.kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>, Gleb Natapov <gleb@redhat.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Ingo Molnar <mingo@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Xen <xen-devel@lists.xensource.com>, Sedat Dilek <sedat.dilek@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>, Yinghai Lu <yinghai@kernel.org>,
	Greg Kroah-Hartman <gregkh@suse.de>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Marcelo Tosatti <mtosatti@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/24/2011 03:44 PM, Avi Kivity wrote:
> On 10/23/2011 09:05 PM, Raghavendra K T wrote:
>> Add two hypercalls to KVM hypervisor to support pv-ticketlocks.
>> +
>> +end_wait:
>> +	finish_wait(&vcpu->wq,&wait);
>> +}
>
> This hypercall can be replaced by a HLT instruction, no?
>
> I'm pretty sure this misses a lot of stuff from kvm_vcpu_block().

Yes.. agree. HLT sounds better idea. 'll try this out.

>
>> +	if (vcpu) {
>> +		vcpu->kicked = 1;
>
> Need to use smp memory barriers here.

Agree.

>
>> +		wake_up_interruptible(&vcpu->wq);
>> +	}
>> +}
>> +
>>   int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
>>   {
>>   	unsigned long nr, a0, a1, a2, a3, ret;
>>
>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 09:59:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 09:59:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkL7-0001Fj-8v; Tue, 25 Oct 2011 09:59:01 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIJdE-0001s1-FN
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 05:27:57 -0700
X-Env-Sender: vatsa@linux.vnet.ibm.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1319459245!41190422!1
X-Originating-IP: [32.97.182.145]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31942 invoked from network); 24 Oct 2011 12:27:26 -0000
Received: from e5.ny.us.ibm.com (HELO e5.ny.us.ibm.com) (32.97.182.145)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 12:27:26 -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 <vatsa@linux.vnet.ibm.com>;
	Mon, 24 Oct 2011 08:27:52 -0400
Received: from d01relay04.pok.ibm.com ([9.56.227.236])
	by e5.ny.us.ibm.com ([192.168.1.105]) with IBM ESMTP SMTP Gateway:
	Authorized Use Only! Violators will be prosecuted; 
	Mon, 24 Oct 2011 08:27:50 -0400
Received: from d03av02.boulder.ibm.com (d03av02.boulder.ibm.com [9.17.195.168])
	by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9OCRnI7226196
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 08:27:49 -0400
Received: from d03av02.boulder.ibm.com (loopback [127.0.0.1])
	by d03av02.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP
	id p9OCRiCt017490
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 06:27:48 -0600
Received: from linux.vnet.ibm.com ([9.77.195.8])
	by d03av02.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with SMTP id
	p9OCRY31017025; Mon, 24 Oct 2011 06:27:35 -0600
Date: Mon, 24 Oct 2011 17:57:34 +0530
From: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
To: Avi Kivity <avi@redhat.com>
Message-ID: <20111024122734.GA10634@linux.vnet.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
	<4EA53A7D.300@redhat.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EA53A7D.300@redhat.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
x-cbid: 11102412-5930-0000-0000-000000874AFB
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:19 -0700
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>, KVM <kvm@vger.kernel.org>,
	Gleb Natapov <gleb@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>, LKML <linux-kernel@vger.kernel.org>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>, x86@kernel.org,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>,
	Xen <xen-devel@lists.xensource.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Yinghai Lu <yinghai@kernel.org>,
	Greg Kroah-Hartman <gregkh@suse.de>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

* Avi Kivity <avi@redhat.com> [2011-10-24 12:14:21]:

> > +/*
> > + * kvm_pv_wait_for_kick_op : Block until kicked by either a KVM_HC_KICK_CPU
> > + * hypercall or a event like interrupt.
> > + *
> > + * @vcpu : vcpu which is blocking.
> > + */
> > +static void kvm_pv_wait_for_kick_op(struct kvm_vcpu *vcpu)
> > +{

[snip]

> > +}
> 
> This hypercall can be replaced by a HLT instruction, no?

Good point. Assuming yield_on_hlt=1, that would allow the vcpu to be put
to sleep and let other vcpus make progress.

I guess with that change, we can also dropthe need for other hypercall
introduced in this patch (kvm_pv_kick_cpu_op()). Essentially a vcpu sleeping 
because of HLT instruction can be woken up by a IPI issued by vcpu releasing a
lock.

- vatsa


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:02:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:02:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkO7-0001gF-JW; Tue, 25 Oct 2011 10:02:07 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIKIM-0003Ux-Dh
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 06:10:27 -0700
X-Env-Sender: avi@redhat.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319461819!567445!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23435 invoked from network); 24 Oct 2011 13:10:22 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-7.tower-182.messagelabs.com with SMTP;
	24 Oct 2011 13:10:22 -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 p9OD9fQq005575
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 24 Oct 2011 09:09:41 -0400
Received: from mermaid.qumranet.com (vpn-9-181.rdu.redhat.com [10.11.9.181])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9OD9Pvl000392; Mon, 24 Oct 2011 09:09:26 -0400
Message-ID: <4EA56385.9040302@redhat.com>
Date: Mon, 24 Oct 2011 15:09:25 +0200
From: Avi Kivity <avi@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
	<4EA53A7D.300@redhat.com>
	<20111024122734.GA10634@linux.vnet.ibm.com>
In-Reply-To: <20111024122734.GA10634@linux.vnet.ibm.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>, KVM <kvm@vger.kernel.org>,
	Gleb Natapov <gleb@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>, LKML <linux-kernel@vger.kernel.org>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>, x86@kernel.org,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>,
	Xen <xen-devel@lists.xensource.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Yinghai Lu <yinghai@kernel.org>,
	Greg Kroah-Hartman <gregkh@suse.de>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/24/2011 02:27 PM, Srivatsa Vaddagiri wrote:
> Good point. Assuming yield_on_hlt=1, that would allow the vcpu to be put
> to sleep and let other vcpus make progress.
>
> I guess with that change, we can also dropthe need for other hypercall
> introduced in this patch (kvm_pv_kick_cpu_op()). Essentially a vcpu sleeping 
> because of HLT instruction can be woken up by a IPI issued by vcpu releasing a
> lock.

Not if interrupts are disabled.  My original plan was to use NMIs for
wakeups, but it turns out NMIs can be coalesced under certain rare
circumstances; this requires workarounds by the generic NMI code that
make NMIs too slow.

-- 
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:05:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:05:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkRg-00026e-UG; Tue, 25 Oct 2011 10:05:48 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIKvP-0006iI-Qf
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 06:50:48 -0700
X-Env-Sender: vatsa@linux.vnet.ibm.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319464243!36481132!1
X-Originating-IP: [32.97.182.139]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16686 invoked from network); 24 Oct 2011 13:50:44 -0000
Received: from e9.ny.us.ibm.com (HELO e9.ny.us.ibm.com) (32.97.182.139)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 24 Oct 2011 13:50:44 -0000
Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236])
	by e9.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id p9ODE5gW011345
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 09:14:05 -0400
Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216])
	by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9ODofiu265140
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 09:50:42 -0400
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
	p9ODoevV025770
	for <xen-devel@lists.xensource.com>; Mon, 24 Oct 2011 11:50:41 -0200
Received: from linux.vnet.ibm.com ([9.77.195.8])
	by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with SMTP id
	p9ODoXrf025185; Mon, 24 Oct 2011 11:50:33 -0200
Date: Mon, 24 Oct 2011 19:20:32 +0530
From: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
To: Avi Kivity <avi@redhat.com>
Message-ID: <20111024135032.GB10634@linux.vnet.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
	<4EA53A7D.300@redhat.com>
	<20111024122734.GA10634@linux.vnet.ibm.com>
	<4EA56385.9040302@redhat.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EA56385.9040302@redhat.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:19 -0700
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>, KVM <kvm@vger.kernel.org>,
	Gleb Natapov <gleb@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>, LKML <linux-kernel@vger.kernel.org>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>, x86@kernel.org,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>,
	Xen <xen-devel@lists.xensource.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Yinghai Lu <yinghai@kernel.org>,
	Greg Kroah-Hartman <gregkh@suse.de>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

* Avi Kivity <avi@redhat.com> [2011-10-24 15:09:25]:

> > I guess with that change, we can also dropthe need for other hypercall
> > introduced in this patch (kvm_pv_kick_cpu_op()). Essentially a vcpu sleeping 
> > because of HLT instruction can be woken up by a IPI issued by vcpu releasing a
> > lock.
> 
> Not if interrupts are disabled.

Hmm yes ..so we need a kick hypercall then.

- vatsa

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:09:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:09:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkVZ-0002Yq-8y; Tue, 25 Oct 2011 10:09:49 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIOZr-0001gU-C0
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 10:44:47 -0700
X-Env-Sender: thomas@shipmail.org
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319478283!1470030!1
X-Originating-IP: [82.193.160.251]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17323 invoked from network); 24 Oct 2011 17:44:43 -0000
Received: from relay.gothnet.se (HELO GOTHNET-SMTP2.gothnet.se)
	(82.193.160.251) by server-14.tower-21.messagelabs.com with SMTP;
	24 Oct 2011 17:44:43 -0000
Received: from mail.shipmail.org ([82.193.169.249]) by gothnet.se with
	MailEnable ESMTP; Mon, 24 Oct 2011 19:44:40 +0200
Received: from mail.shipmail.org (localhost [127.0.0.1])
	by mail.shipmail.org (Postfix) with ESMTP id 7AA76338079;
	Mon, 24 Oct 2011 19:44:40 +0200 (CEST)
Received: from localhost [127.0.0.1]
	by BitDefender SMTP Proxy on localhost [127.0.0.1]
	for localhost [127.0.0.1]; Mon, 24 Oct 2011 19:44:40 +0200 (CEST)
Received: from linlap1.home.shipmail.org (localhost [127.0.0.1])
	by mail.shipmail.org (Postfix) with ESMTP id 1E0C6338078;
	Mon, 24 Oct 2011 19:44:40 +0200 (CEST)
Message-ID: <4EA5A381.1050100@shipmail.org>
Date: Mon, 24 Oct 2011 19:42:25 +0200
From: Thomas Hellstrom <thomas@shipmail.org>
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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.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>
	<20111024172728.GD2320@phenom.dumpdata.com>
In-Reply-To: <20111024172728.GD2320@phenom.dumpdata.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-BitDefender-Scanner: Mail not scanned due to license constraints
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: thellstrom@vmware.com, xen-devel@lists.xensource.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 10/24/2011 07:27 PM, Konrad Rzeszutek Wilk 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?
>>      
> Yes - and I should have addressed that in the writeup but forgot, sorry about that.
>
> So initially I thought you meant this:
>
> diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
> index 360afb3..06ef048 100644
> --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
> +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
> @@ -662,8 +662,7 @@ out:
>
>   /* 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)
> +			    int flags, enum ttm_caching_state cstate)
>   {
>   	unsigned long irq_flags;
>   	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
> @@ -707,8 +706,7 @@ static void __ttm_put_pages(struct list_head *pages, unsigned page_count,
>    * cached pages.
>    */
>   static int __ttm_get_pages(struct list_head *pages, int flags,
> -			   enum ttm_caching_state cstate, unsigned count,
> -			   dma_addr_t *dma_address)
> +			   enum ttm_caching_state cstate, unsigned count)
>   {
>   	struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
>   	struct page *p = NULL;
> @@ -864,7 +862,7 @@ int ttm_get_pages(struct ttm_tt *ttm, struct list_head *pages,
>   	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);
> +				count)
>   }
>   void ttm_put_pages(struct ttm_tt *ttm, struct list_head *pages,
>   		   unsigned page_count, dma_addr_t *dma_address)
> @@ -873,5 +871,5 @@ void ttm_put_pages(struct ttm_tt *ttm, struct list_head *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);
> +				ttm->caching_state)
>   }
> which is trivial (thought I have not compile tested it), but it should do it.
>
> But I think you mean eliminate the dma_address handling completly in
> ttm_page_alloc.c and ttm_tt.c.
>
> For that there are couple of architectural issues I am not sure how to solve.
>
> There has to be some form of TTM<->[Radeon|Nouveau] lookup mechanism
> to say: "here is a 'struct page *', give me the bus address". Currently
> this is solved by keeping an array of DMA addresses along with the list
> of pages. And passing the list and DMA address up the stack (and down)
> from TTM up to the driver (when ttm->be->func->populate is called and they
> are handed off) does it. It does not break any API layering .. and the internal
> TTM pool (non-DMA) can just ignore the dma_address altogether (see patch above).
>
>    

I actually had something more simple in mind, but when tinking a bit 
deeper into it, it seems more complicated than I initially thought.

Namely that when we allocate pages from the ttm_backend, we actually 
populated it at the same time. be::populate would then not take a page 
array as an argument, and would actually be a no-op on many
drivers.

This makes us move towards struct ttm_tt consisting almost only of its 
backend, so that whole API should perhaps be looked at with new eyes.

So anyway, I'm fine with high level things as they are now, and the 
dma_addr issue can be looked at at a later time. If we could get a 
couple of extra eyes to review the code for style etc. would be great, 
because I have very little time the next couple of weeks.

/Thomas












_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:13:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:13:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkYo-0002zQ-GB; Tue, 25 Oct 2011 10:13:10 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIPWO-0005OR-Rt
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 11:45:17 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319481898!42975787!1
X-Originating-IP: [202.81.31.141]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25627 invoked from network); 24 Oct 2011 18:45:01 -0000
Received: from e23smtp08.au.ibm.com (HELO e23smtp08.au.ibm.com) (202.81.31.141)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 24 Oct 2011 18:45:01 -0000
Received: from /spool/local by e23smtp08.au.ibm.com with XMail ESMTP
	for <xen-devel@lists.xensource.com> from <raghukt@linux.vnet.ibm.com>; 
	Mon, 24 Oct 2011 18:43:51 +1000
Received: from d23relay04.au.ibm.com ([202.81.31.246])
	by e23smtp08.au.ibm.com ([202.81.31.205]) with XMail ESMTP;
	Mon, 24 Oct 2011 18:43:50 +1000
Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138])
	by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9OIgPQ41814532
	for <xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 05:42:29 +1100
Received: from d23av02.au.ibm.com (loopback [127.0.0.1])
	by d23av02.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9OIj1Wg027201
	for <xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 05:45:03 +1100
Received: from oc5400248562.ibm.com ([9.77.120.178])
	by d23av02.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9OIislE026753; Tue, 25 Oct 2011 05:44:55 +1100
Message-ID: <4EA5B241.5040003@linux.vnet.ibm.com>
Date: Tue, 25 Oct 2011 00:15:21 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Sasha Levin <levinsasha928@gmail.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190700.16364.7548.sendpatchset@oc5400248562.ibm.com>
	<1319450505.5660.5.camel@lappy>
In-Reply-To: <1319450505.5660.5.camel@lappy>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
x-cbid: 11102408-5140-0000-0000-0000001B6B99
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Gleb Natapov <gleb@redhat.com>, Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>, KVM <kvm@vger.kernel.org>,
	x86@kernel.org, Ingo Molnar <mingo@redhat.com>,
	Avi Kivity <avi@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Marcelo Tosatti <mtosatti@redhat.com>, Xen <xen-devel@lists.xensource.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Greg Kroah-Hartman <gregkh@suse.de>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 4/5] kvm guest : Added configuration
 support to enable debug information for KVM 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

On 10/24/2011 03:31 PM, Sasha Levin wrote:
> On Mon, 2011-10-24 at 00:37 +0530, Raghavendra K T wrote:
>> Added configuration support to enable debug information
>> for KVM Guests in debugfs
>> +config KVM_DEBUG_FS
>> +	bool "Enable debug information for KVM Guests in debugfs"
>> +	depends on KVM_GUEST
>
> Shouldn't it depend on DEBUG_FS as well?
Thanks again for pointing. will correct this too.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:15:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:15:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkaj-0003Ng-QK; Tue, 25 Oct 2011 10:15:09 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIQIZ-0006jN-1y
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 12:35:03 -0700
X-Env-Sender: 2013pfoley@tjhsst.edu
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319484898!898877!1
X-Originating-IP: [198.38.16.131]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11971 invoked from network); 24 Oct 2011 19:34:58 -0000
Received: from smith.tjhsst.edu (HELO smith.tjhsst.edu) (198.38.16.131)
	by server-3.tower-216.messagelabs.com with SMTP;
	24 Oct 2011 19:34:58 -0000
Received: from localhost (localhost [127.0.0.1])
	by smith.tjhsst.edu (Postfix) with ESMTP id E42E320ADB;
	Mon, 24 Oct 2011 15:34:57 -0400 (EDT)
Received: from webmail.tjhsst.edu (www.tjhsst.edu [198.38.16.47])
	by smith.tjhsst.edu (Postfix) with ESMTP id C8631209F8;
	Mon, 24 Oct 2011 15:34:57 -0400 (EDT)
MIME-Version: 1.0
Content-Type: text/plain;
 charset=UTF-8;
 format=flowed
Content-Transfer-Encoding: 8bit
Date: Mon, 24 Oct 2011 15:34:57 -0400
From: 2013pfoley <2013pfoley@tjhsst.edu>
To: <xen-devel@lists.xensource.com>, <linux-kernel@vger.kernel.org>
Message-ID: <05c3da5dc6158197e28d62e853ac2f04@tjhsst.edu>
X-Sender: 2013pfoley@tjhsst.edu
User-Agent: Roundcube Webmail/0.4.2
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: Andrew Hamilton <ahamilto@tjhsst.edu>
Subject: [Xen-devel] Xen dom0 linux kernel 3.1 boot failure
 ptwr_emulate: could not get_page_from_l1e
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 having xen dom0 crash during bootup when using the linux 3.1 kernel 
 however it worked when using the linux 2.6.34 kernel.
 I tried using xen-unstable but got the exact same error as with xen 
 4.1.1.

 xen-unstable changeset:   23981:6c583d35d76d
 linux kernel 3.1.0

 I've included the backtrace below.
 let me know if you need any more info.

 Peter


 root (hd0,0)
  Filesystem type is ext2fs, partition type 0x83
 kernel /boot/xen2.gz com2=9600,8n1 console=com2 loglvl=all 
 guest_loglvl=all nor
 eboot
    [Multiboot-elf, <0x100000:0x19ae10:0x5c1f0>, shtab=0x2f7078, 
 entry=0x100000]
 module /boot/kernel-xen-git root=/dev/sda2 bonding.mode=4 
 bonding.miimon=100 co
 nsole=hvc0 debug initcall_debug earlyprintk=xen
    [Multiboot-module @ 0x2f8000, 0x1410eb7 bytes]














  __  __            _  _    ____                     _        _     _
  \ \/ /___ _ __   | || |  |___ \    _   _ _ __  ___| |_ __ _| |__ | | 
 ___
   \  // _ \ '_ \  | || |_   __) |__| | | | '_ \/ __| __/ _` | '_ \| |/ 
 _ \
   /  \  __/ | | | |__   _| / __/|__| |_| | | | \__ \ || (_| | |_) | |  
 __/
  /_/\_\___|_| |_|    |_|(_)_____|   \__,_|_| 
 |_|___/\__\__,_|_.__/|_|\___|
 
 (XEN) Xen version 4.2-unstable (2013pfoley@csl.tjhsst.edu) (gcc version 
 4.5.3 (Gentoo 4.5.3-r1 p1.0, pie-0.4.5) ) Fri Oct 21 15:10:43 EDT 2011
 (XEN) Latest ChangeSet: Thu Oct 20 15:36:01 2011 +0100 
 23981:6c583d35d76d
 (XEN) Bootloader: GNU GRUB 0.97
 (XEN) Command line: com2=9600,8n1 console=com2 loglvl=all 
 guest_loglvl=all noreboot
 (XEN) Video information:
 (XEN)  VGA is text mode 80x25, font 8x16
 (XEN)  VBE/DDC methods: none; EDID transfer time: 2 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 - 000000000009f400 (usable)
 (XEN)  000000000009f400 - 00000000000a0000 (reserved)
 (XEN)  00000000000f0000 - 0000000000100000 (reserved)
 (XEN)  0000000000100000 - 00000000df61f000 (usable)
 (XEN)  00000000df61f000 - 00000000df62c000 (ACPI data)
 (XEN)  00000000df62c000 - 00000000df62d000 (usable)
 (XEN)  00000000df62d000 - 00000000e4000000 (reserved)
 (XEN)  00000000fec00000 - 00000000fee10000 (reserved)
 (XEN)  00000000ff800000 - 0000000100000000 (reserved)
 (XEN)  0000000100000000 - 000000061ffff000 (usable)
 (XEN) ACPI: RSDP 000F4F00, 0024 (r2 HP    )
 (XEN) ACPI: XSDT DF620340, 00B4 (r1 HP     ProLiant        2   ï¿½     
 162E)
 (XEN) ACPI: FACP DF620440, 00F4 (r3 HP     ProLiant        2   ï¿½     
 162E)
 (XEN) ACPI: DSDT DF620540, 200D (r1 HP         DSDT        1 INTL 
 20030228)
 (XEN) ACPI: FACS DF61F100, 0040
 (XEN) ACPI: SPCR DF61F140, 0050 (r1 HP     SPCRRBSU        1   ï¿½     
 162E)
 (XEN) ACPI: MCFG DF61F1C0, 003C (r1 HP     ProLiant        1            
 0)
 (XEN) ACPI: HPET DF61F200, 0038 (r1 HP     ProLiant        2   ï¿½     
 162E)
 (XEN) ACPI: FFFF DF61F240, 0064 (r2 HP     ProLiant        2   ï¿½     
 162E)
 (XEN) ACPI: SPMI DF61F2C0, 0040 (r5 HP     ProLiant        1   ï¿½     
 162E)
 (XEN) ACPI: ERST DF61F300, 01D0 (r1 HP     ProLiant        1   ï¿½     
 162E)
 (XEN) ACPI: APIC DF61F500, 015E (r1 HP     ProLiant        2            
 0)
 (XEN) ACPI: SRAT DF61F680, 0570 (r1 HP     Proliant        1   ï¿½     
 162E)
 (XEN) ACPI: FFFF DF61FC00, 0176 (r1 HP     ProLiant        1   ï¿½     
 162E)
 (XEN) ACPI: BERT DF61FD80, 0030 (r1 HP     ProLiant        1   ï¿½     
 162E)
 (XEN) ACPI: HEST DF61FDC0, 00BC (r1 HP     ProLiant        1   ï¿½     
 162E)
 (XEN) ACPI: DMAR DF61FE80, 0154 (r1 HP     ProLiant        1   ï¿½     
 162E)
 (XEN) ACPI: SSDT DF622580, 0125 (r3     HP  CRSPCI0        2   HP       
 1)
 (XEN) ACPI: SSDT DF6226C0, 0255 (r3     HP  riser1a        2 INTL 
 20061109)
 (XEN) ACPI: SSDT DF622940, 03BB (r1     HP      pcc        1 INTL 
 20090625)
 (XEN) ACPI: SSDT DF622D00, 0377 (r1     HP     pmab        1 INTL 
 20090625)
 (XEN) ACPI: SSDT DF623080, 2B64 (r1  INTEL PPM RCM         1 INTL 
 20061109)
 (XEN) System RAM: 24565MB (25155320kB)
 (XEN) SRAT: PXM 0 -> APIC 0 -> Node 0
 (XEN) SRAT: PXM 0 -> APIC 1 -> Node 0
 (XEN) SRAT: PXM 0 -> APIC 2 -> Node 0
 (XEN) SRAT: PXM 0 -> APIC 3 -> Node 0
 (XEN) SRAT: PXM 0 -> APIC 4 -> Node 0
 (XEN) SRAT: PXM 0 -> APIC 5 -> Node 0
 (XEN) SRAT: PXM 0 -> APIC 6 -> Node 0
 (XEN) SRAT: PXM 0 -> APIC 7 -> Node 0
 (XEN) SRAT: PXM 1 -> APIC 16 -> Node 1
 (XEN) SRAT: PXM 1 -> APIC 17 -> Node 1
 (XEN) SRAT: PXM 1 -> APIC 18 -> Node 1
 (XEN) SRAT: PXM 1 -> APIC 19 -> Node 1
 (XEN) SRAT: PXM 1 -> APIC 20 -> Node 1
 (XEN) SRAT: PXM 1 -> APIC 21 -> Node 1
 (XEN) SRAT: PXM 1 -> APIC 22 -> Node 1
 (XEN) SRAT: PXM 1 -> APIC 23 -> Node 1
 (XEN) SRAT: Node 0 PXM 0 0-e0000000
 (XEN) SRAT: Node 0 PXM 0 100000000-320000000
 (XEN) SRAT: Node 1 PXM 1 320000000-620000000
 (XEN) NUMA: Using 17 for the hash shift.
 (XEN) Domain heap initialised DMA width 31 bits
 (XEN) found SMP MP-table at 000f4f80
 (XEN) DMI 2.7 present.
 (XEN) Using APIC driver default
 (XEN) ACPI: PM-Timer IO Port: 0x908
 (XEN) ACPI: ACPI SLEEP INFO: pm1x_cnt[904,0], pm1x_evt[900,0]
 (XEN) ACPI:                  wakeup_vec[df61f10c], vec_size[20]
 (XEN) ACPI: Local APIC address 0xfee00000
 (XEN) ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
 (XEN) Processor #0 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x10] lapic_id[0x20] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x08] lapic_id[0x10] enabled)
 (XEN) Processor #16 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x18] lapic_id[0x30] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x04] lapic_id[0x04] enabled)
 (XEN) Processor #4 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x14] lapic_id[0x24] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x0c] lapic_id[0x14] enabled)
 (XEN) Processor #20 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x1c] lapic_id[0x34] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x02] lapic_id[0x02] enabled)
 (XEN) Processor #2 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x12] lapic_id[0x22] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x0a] lapic_id[0x12] enabled)
 (XEN) Processor #18 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x1a] lapic_id[0x32] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x06] lapic_id[0x06] enabled)
 (XEN) Processor #6 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x16] lapic_id[0x26] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x0e] lapic_id[0x16] enabled)
 (XEN) Processor #22 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x1e] lapic_id[0x36] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x01] lapic_id[0x01] enabled)
 (XEN) Processor #1 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x11] lapic_id[0x21] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x09] lapic_id[0x11] enabled)
 (XEN) Processor #17 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x19] lapic_id[0x31] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x05] lapic_id[0x05] enabled)
 (XEN) Processor #5 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x15] lapic_id[0x25] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x0d] lapic_id[0x15] enabled)
 (XEN) Processor #21 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x1d] lapic_id[0x35] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x03] lapic_id[0x03] enabled)
 (XEN) Processor #3 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x13] lapic_id[0x23] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x0b] lapic_id[0x13] enabled)
 (XEN) Processor #19 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x1b] lapic_id[0x33] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x07] lapic_id[0x07] enabled)
 (XEN) Processor #7 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x17] lapic_id[0x27] disabled)
 (XEN) ACPI: LAPIC (acpi_id[0x0f] lapic_id[0x17] enabled)
 (XEN) Processor #23 7:10 APIC version 21
 (XEN) ACPI: LAPIC (acpi_id[0x1f] lapic_id[0x37] disabled)
 (XEN) ACPI: LAPIC_NMI (acpi_id[0xff] dfl dfl lint[0x1])
 (XEN) Overriding APIC driver with bigsmp
 (XEN) ACPI: IOAPIC (id[0x08] address[0xfec00000] gsi_base[0])
 (XEN) IOAPIC[0]: apic_id 8, version 32, address 0xfec00000, GSI 0-23
 (XEN) ACPI: IOAPIC (id[0x00] address[0xfec80000] gsi_base[24])
 (XEN) IOAPIC[1]: apic_id 0, version 32, address 0xfec80000, GSI 24-47
 (XEN) ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high edge)
 (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:  Phys.  Using 2 I/O APICs
 (XEN) ACPI: HPET id: 0x8086a201 base: 0xfed00000
 (XEN) ERST table is invalid
 (XEN) Using ACPI (MADT) for SMP configuration information
 (XEN) IRQ limits: 48 GSI, 3040 MSI/MSI-X
 (XEN) Using scheduler: SMP Credit Scheduler (credit)
 (XEN) Detected 2266.778 MHz processor.
 (XEN) Initing memory sharing.
 (XEN) mce_intel.c:1219: MCA Capability: BCAST 1 SER 0 CMCI 1 firstbank 
 0 extended MCE MSR 0
 (XEN) Intel machine check reporting enabled
 (XEN) PCI: MCFG configuration 0: base e0000000 segment 0000 buses 00 - 
 3f
 (XEN) PCI: MCFG area at e0000000 reserved in E820
 (XEN) PCI: Using MCFG for segment 0000 bus 00-3f
 (XEN) Intel VT-d Snoop Control not 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) ENABLING IO-APIC IRQs
 (XEN)  -> Using new ACK method
 (XEN) ..TIMER: vector=0xF0 apic1=0 pin1=2 apic2=-1 pin2=-1
 (XEN) Platform timer is 14.318MHz HPET
 (XEN) Allocated console ring of 128 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) EPT supports 2MB super page.
 (XEN) HVM: ASIDs enabled.
 (XEN) HVM: VMX enabled
 (XEN) HVM: Hardware Assisted Paging detected.
 (XEN) Brought up 16 CPUs
 (XEN) HPET's MSI mode hasn't been supported when Interrupt Remapping is 
 enabled.
 (XEN) ACPI sleep modes: S3
 (XEN) mcheck_poll: Machine check polling timer started.
 (XEN) *** LOADING DOMAIN 0 ***
 (XEN) elf_parse_binary: phdr: paddr=0x1000000 memsz=0xa69000
 (XEN) elf_parse_binary: phdr: paddr=0x1c00000 memsz=0x990e0
 (XEN) elf_parse_binary: phdr: paddr=0x1c9a000 memsz=0x13400
 (XEN) elf_parse_binary: phdr: paddr=0x1cae000 memsz=0x2d4000
 (XEN) elf_parse_binary: memory: 0x1000000 -> 0x1f82000
 (XEN) elf_xen_parse_note: GUEST_OS = "linux"
 (XEN) elf_xen_parse_note: GUEST_VERSION = "2.6"
 (XEN) elf_xen_parse_note: XEN_VERSION = "xen-3.0"
 (XEN) elf_xen_parse_note: VIRT_BASE = 0xffffffff80000000
 (XEN) elf_xen_parse_note: ENTRY = 0xffffffff81cae200
 (XEN) elf_xen_parse_note: HYPERCALL_PAGE = 0xffffffff81001000
 (XEN) elf_xen_parse_note: FEATURES = 
 "!writable_page_tables|pae_pgdir_above_4gb"
 (XEN) elf_xen_parse_note: PAE_MODE = "yes"
 (XEN) elf_xen_parse_note: LOADER = "generic"
 (XEN) elf_xen_parse_note: unknown xen elf note (0xd)
 (XEN) elf_xen_parse_note: SUSPEND_CANCEL = 0x1
 (XEN) elf_xen_parse_note: HV_START_LOW = 0xffff800000000000
 (XEN) elf_xen_parse_note: PADDR_OFFSET = 0x0
 (XEN) elf_xen_addr_calc_check: addresses:
 (XEN)     virt_base        = 0xffffffff80000000
 (XEN)     elf_paddr_offset = 0x0
 (XEN)     virt_offset      = 0xffffffff80000000
 (XEN)     virt_kstart      = 0xffffffff81000000
 (XEN)     virt_kend        = 0xffffffff81f82000
 (XEN)     virt_entry       = 0xffffffff81cae200
 (XEN)     p2m_base         = 0xffffffffffffffff
 (XEN)  Xen  kernel: 64-bit, lsb, compat32
 (XEN)  Dom0 kernel: 64-bit, PAE, lsb, paddr 0x1000000 -> 0x1f82000
 (XEN) PHYSICAL MEMORY ARRANGEMENT:
 (XEN)  Dom0 alloc.:   0000000608000000->0000000610000000 (6140612 pages 
 to be allocated)
 (XEN) VIRTUAL MEMORY ARRANGEMENT:
 (XEN)  Loaded kernel: ffffffff81000000->ffffffff81f82000
 (XEN)  Init. ramdisk: ffffffff81f82000->ffffffff81f82000
 (XEN)  Phys-Mach map: ffffffff81f82000->ffffffff84e9b620
 (XEN)  Start info:    ffffffff84e9c000->ffffffff84e9c4b4
 (XEN)  Page tables:   ffffffff84e9d000->ffffffff84ec8000
 (XEN)  Boot stack:    ffffffff84ec8000->ffffffff84ec9000
 (XEN)  TOTAL:         ffffffff80000000->ffffffff85000000
 (XEN)  ENTRY ADDRESS: ffffffff81cae200
 (XEN) Dom0 has maximum 16 VCPUs
 (XEN) elf_load_binary: phdr 0 at 0xffffffff81000000 -> 
 0xffffffff81a69000
 (XEN) elf_load_binary: phdr 1 at 0xffffffff81c00000 -> 
 0xffffffff81c990e0
 (XEN) elf_load_binary: phdr 2 at 0xffffffff81c9a000 -> 
 0xffffffff81cad400
 (XEN) elf_load_binary: phdr 3 at 0xffffffff81cae000 -> 
 0xffffffff81d54000
 (XEN) Scrubbing Free RAM: .done.
 (XEN) Std. Loglevel: All
 (XEN) Guest Loglevel: All
 (XEN) *** Serial input -> DOM0 (type 'CTRL-a' three times to switch 
 input to Xen)
 (XEN) Freed 244kB init memory.
 mapping kernel into physical memory
 Xen: setup ISA identity maps
 about to get started...
 [    0.000000] Initializing cgroup subsys cpuset
 [    0.000000] Initializing cgroup subsys cpu
 [    0.000000] Linux version 3.1.0 (root@galapagos) (gcc version 4.5.3 
 (Gentoo 4.5.3-r1 p1.0, pie-0.4.5) ) #4 SMP Mon Oct 24 15:03:22 EDT 2011
 [    0.000000] Command line: root=/dev/sda2 bonding.mode=4 
 bonding.miimon=100 console=hvc0 debug initcall_debug earlyprintk=xen
 [    0.000000] Freeing  e4000-fec00 pfn range: 109568 pages freed
 [    0.000000] Freeing  fee10-ff800 pfn range: 2544 pages freed
 [    0.000000] released 112112 pages of unused memory
 [    0.000000] 1-1 mapping on a0->100
 [    0.000000] 1-1 mapping on df61f->df62c
 [    0.000000] 1-1 mapping on df62d->100000
 [    0.000000] Set 133696 page(s) to 1-1 mapping.
 [    0.000000] BIOS-provided physical RAM map:
 [    0.000000]  Xen: 0000000000000000 - 000000000009f000 (usable)
 [    0.000000]  Xen: 000000000009f400 - 0000000000100000 (reserved)
 [    0.000000]  Xen: 0000000000100000 - 00000000df61f000 (usable)
 [    0.000000]  Xen: 00000000df61f000 - 00000000df62c000 (ACPI data)
 [    0.000000]  Xen: 00000000df62c000 - 00000000df62d000 (usable)
 [    0.000000]  Xen: 00000000df62d000 - 00000000e4000000 (reserved)
 [    0.000000]  Xen: 00000000fec00000 - 00000000fee10000 (reserved)
 [    0.000000]  Xen: 00000000ff800000 - 0000000100000000 (reserved)
 [    0.000000]  Xen: 0000000100000000 - 000000063b5ef000 (usable)
 [    0.000000] bootconsole [xenboot0] enabled
 [    0.000000] NX (Execute Disable) protection: active
 [    0.000000] DMI 2.7 present.
 [    0.000000] DMI: HP ProLiant DL380 G6, BIOS P62 05/05/2011
 [    0.000000] e820 update range: 0000000000000000 - 0000000000010000 
 (usable) ==> (reserved)
 [    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 
 (usable)
 [    0.000000] No AGP bridge found
 [    0.000000] last_pfn = 0x63b5ef max_arch_pfn = 0x400000000
 [    0.000000] last_pfn = 0xdf62d max_arch_pfn = 0x400000000
 [    0.000000] found SMP MP-table at [ffff8800000f4f80] f4f80
 (XEN) mm.c:945:d0 Error getting mfn 100 (pfn 5555555555555555) from L1 
 entry 8000000000100461 for l1e_owner=0, pg_owner=0
 (XEN) mm.c:5046:d0 ptwr_emulate: could not get_page_from_l1e()
 [    0.000000] BUG: unable to handle kernel NULL pointer dereference at 
          (null)
 [    0.000000] IP: [<ffffffff81008a5a>] xen_set_pte+0x3a/0x1f0
 [    0.000000] PGD 0
 [    0.000000] Oops: 0003 [#1] SMP
 [    0.000000] CPU 0
 [    0.000000] Modules linked in:
 [    0.000000]
 [    0.000000] Pid: 0, comm: swapper Not tainted 3.1.0 #4 HP ProLiant 
 DL380 G6
 [    0.000000] RIP: e030:[<ffffffff81008a5a>]  [<ffffffff81008a5a>] 
 xen_set_pte+0x3a/0x1f0
 [    0.000000] RSP: e02b:ffffffff81c01d50  EFLAGS: 00010097
 [    0.000000] RAX: 0000000000000000 RBX: ffffffff81d573c0 RCX: 
 0000000000000001
 [    0.000000] RDX: 0000000010000001 RSI: 8000000000100461 RDI: 
 ffffffff81d573c0
 [    0.000000] RBP: ffffffff81c01d90 R08: 0000000000000000 R09: 
 00000000000f4f90
 [    0.000000] R10: 00000000deadbeef R11: 0000000000000010 R12: 
 8000000000100461
 [    0.000000] R13: 8000000000100463 R14: 8000000000000563 R15: 
 0000000000100000
 [    0.000000] FS:  0000000000000000(0000) GS:ffffffff81c9a000(0000) 
 knlGS:0000000000000000
 [    0.000000] CS:  e033 DS: 0000 ES: 0000 CR0: 0000000080050033
 [    0.000000] CR2: 0000000000000000 CR3: 0000000001c05000 CR4: 
 0000000000002660
 [    0.000000] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 
 0000000000000000
 [    0.000000] DR3: 0000000000000000 DR6: 0000000000000000 DR7: 
 0000000000000000
 [    0.000000] Process swapper (pid: 0, threadinfo ffffffff81c00000, 
 task ffffffff81c0d020)
 [    0.000000] Stack:
 [    0.000000]  ffffffff81004ef1 0000000000000010 00000000deadbeef 
 ffffffff81d573c0
 [    0.000000]  0000000000000100 8000000000100463 8000000000000563 
 0000000000100000
 [    0.000000]  ffffffff81c01dc0 ffffffff81cb299f 0000000000100000 
 ffffffffff478000
 [    0.000000] Call Trace:
 [    0.000000]  [<ffffffff81004ef1>] ? 
 __raw_callee_save_xen_pte_val+0x11/0x1e
 [    0.000000]  [<ffffffff81cb299f>] xen_set_pte_init+0x7f/0x87
 [    0.000000]  [<ffffffff81cc2a99>] __early_set_fixmap+0x73/0xbc
 [    0.000000]  [<ffffffff81cc2c01>] __early_ioremap+0x11f/0x1ad
 [    0.000000]  [<ffffffff81cc2f07>] early_ioremap+0x13/0x15
 [    0.000000]  [<ffffffff81cbc2ad>] get_mpc_size+0x14/0x4c
 [    0.000000]  [<ffffffff81cbc3b1>] smp_scan_config+0xcc/0xfa
 [    0.000000]  [<ffffffff81cf3300>] ? 
 firmware_map_add_hotplug+0xa4/0xa4
 [    0.000000]  [<ffffffff81cbcfb3>] default_find_smp_config+0x36/0x5a
 [    0.000000]  [<ffffffff81cb4770>] setup_arch+0x539/0xad7
 [    0.000000]  [<ffffffff81009ecf>] ? 
 __raw_callee_save_xen_restore_fl+0x11/0x1e
 [    0.000000]  [<ffffffff81cf3300>] ? 
 firmware_map_add_hotplug+0xa4/0xa4
 [    0.000000]  [<ffffffff81709534>] ? printk+0x3c/0x3e
 [    0.000000]  [<ffffffff8170c2ea>] ? 
 _raw_spin_unlock_irqrestore+0x1a/0x20
 [    0.000000]  [<ffffffff81cf3300>] ? 
 firmware_map_add_hotplug+0xa4/0xa4
 [    0.000000]  [<ffffffff81cae93b>] start_kernel+0x8e/0x359
 [    0.000000]  [<ffffffff81cae347>] 
 x86_64_start_reservations+0x132/0x136
 [    0.000000]  [<ffffffff81cb1eac>] xen_start_kernel+0x5ef/0x5f6
 [    0.000000] Code: 89 5d d8 4c 89 65 e0 48 89 fb 4c 89 6d e8 4c 89 75 
 f0 49 89 f4 85 c0 4c 89 7d f8 0f 85 17 01 00 00 e8 2b 06 03 00 83 f8 01 
 74 1e <4c> 89 23 48 8b 5d d8 4c 8b 65 e0 4c 8b 6d e8 4c 8b 75 f0 4c 8b
 [    0.000000] RIP  [<ffffffff81008a5a>] xen_set_pte+0x3a/0x1f0
 [    0.000000]  RSP <ffffffff81c01d50>
 [    0.000000] CR2: 0000000000000000
 [    0.000000] ---[ end trace 4eaa2a86a8e2da22 ]---
 [    0.000000] Kernel panic - not syncing: Attempted to kill the idle 
 task!
 [    0.000000] Pid: 0, comm: swapper Tainted: G      D     3.1.0 #4
 [    0.000000] Call Trace:
 [    0.000000]  [<ffffffff817093d8>] panic+0x8c/0x1ac
 [    0.000000]  [<ffffffff8105db63>] do_exit+0x803/0x950
 [    0.000000]  [<ffffffff8170c2ea>] ? 
 _raw_spin_unlock_irqrestore+0x1a/0x20
 [    0.000000]  [<ffffffff8105b3b5>] ? kmsg_dump+0x45/0x100
 [    0.000000]  [<ffffffff8170d46f>] oops_end+0xaf/0xf0
 [    0.000000]  [<ffffffff8103e050>] no_context+0xf0/0x260
 [    0.000000]  [<ffffffff8103e2dd>] __bad_area_nosemaphore+0x11d/0x220
 [    0.000000]  [<ffffffff8103e3ee>] bad_area_nosemaphore+0xe/0x10
 [    0.000000]  [<ffffffff8170fd8b>] do_page_fault+0x36b/0x510
 [    0.000000]  [<ffffffff81009ecf>] ? 
 __raw_callee_save_xen_restore_fl+0x11/0x1e
 [    0.000000]  [<ffffffff8170c7b5>] page_fault+0x25/0x30
 [    0.000000]  [<ffffffff81008a5a>] ? xen_set_pte+0x3a/0x1f0
 [    0.000000]  [<ffffffff81004ef1>] ? 
 __raw_callee_save_xen_pte_val+0x11/0x1e
 [    0.000000]  [<ffffffff81cb299f>] xen_set_pte_init+0x7f/0x87
 [    0.000000]  [<ffffffff81cc2a99>] __early_set_fixmap+0x73/0xbc
 [    0.000000]  [<ffffffff81cc2c01>] __early_ioremap+0x11f/0x1ad
 [    0.000000]  [<ffffffff81cc2f07>] early_ioremap+0x13/0x15
 [    0.000000]  [<ffffffff81cbc2ad>] get_mpc_size+0x14/0x4c
 [    0.000000]  [<ffffffff81cbc3b1>] smp_scan_config+0xcc/0xfa
 [    0.000000]  [<ffffffff81cf3300>] ? 
 firmware_map_add_hotplug+0xa4/0xa4
 [    0.000000]  [<ffffffff81cbcfb3>] default_find_smp_config+0x36/0x5a
 [    0.000000]  [<ffffffff81cb4770>] setup_arch+0x539/0xad7
 [    0.000000]  [<ffffffff81009ecf>] ? 
 __raw_callee_save_xen_restore_fl+0x11/0x1e
 [    0.000000]  [<ffffffff81cf3300>] ? 
 firmware_map_add_hotplug+0xa4/0xa4
 [    0.000000]  [<ffffffff81709534>] ? printk+0x3c/0x3e
 [    0.000000]  [<ffffffff8170c2ea>] ? 
 _raw_spin_unlock_irqrestore+0x1a/0x20
 [    0.000000]  [<ffffffff81cf3300>] ? 
 firmware_map_add_hotplug+0xa4/0xa4
 [    0.000000]  [<ffffffff81cae93b>] start_kernel+0x8e/0x359
 [    0.000000]  [<ffffffff81cae347>] 
 x86_64_start_reservations+0x132/0x136
 [    0.000000]  [<ffffffff81cb1eac>] xen_start_kernel+0x5ef/0x5f6
 (XEN) Domain 0 crashed: 'noreboot' set - not rebooting.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:17:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:17:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkcl-0003mL-3J; Tue, 25 Oct 2011 10:17:15 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIRwe-0001fu-Be
	for xen-devel@lists.xensource.com; Mon, 24 Oct 2011 14:20:33 -0700
X-Env-Sender: dario.faggioli@citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1319491228!32834790!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22095 invoked from network); 24 Oct 2011 21:20:28 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	24 Oct 2011 21:20:28 -0000
X-IronPort-AV: E=Sophos;i="4.69,400,1315180800"; 
   d="scan'";a="8558961"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	24 Oct 2011 21:20:27 +0000
Received: from [IPv6:::1] (10.80.16.67) by smtprelay.citrix.com
	(10.30.203.162) with Microsoft SMTP Server id 8.3.137.0;
	Mon, 24 Oct 2011 22:20:27 +0100
Message-ID: <1319491226.2230.62.camel@Abyss>
Subject: Re: [Xen-devel] [PATCH] scheduler rate controller
From: Dario Faggioli <dario.faggioli@citrix.com>
To: xen-devel@lists.xensource.com
Date: Mon, 24 Oct 2011 23:20:26 +0200
In-Reply-To: <CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
References: <C10D3FB0CD45994C8A51FEC1227CE22F340768D793@shsmsx502.ccr.corp.intel.com>
	<CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
Face: 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
X-Mailer: Evolution 3.2.1 (3.2.1-1.fc16) 
MIME-Version: 1.0
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:19 -0700
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0521509107=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0521509107==
Content-Type: multipart/signed; micalg=pgp-sha1;
	protocol="application/pgp-signature"; boundary="=-8Iodr/0ZmacFf0eg7GOP"

--=-8Iodr/0ZmacFf0eg7GOP
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hello everyone,

On Mon, 2011-10-24 at 17:17 +0100, George Dunlap wrote:
> * The actual algorithm you use here isn't described.  It seems to be
> as follows (please correct me if I've made a mistake
> reverse-engineering the algorithm):
>=20
> Every 10ms, check to see if there have been more than 50 schedules.
> If so, disable pre-emption entirely for 10ms, allowing processes to
> run without being interrupted (unless they yield).
>=20
> It seems like we should be able to do better.  For one, it means in
> the general case you will flip back and forth between really frequent
> schedules and less frequent schedules.  For two, turning off
> preemption entirely will mean that whatever vcpu happens to be running
> could, if it wished, run for the full 10ms; and which one got elected
> to do that would be really random. =20
>
To me, this is  key point... Maybe we can save at least the calls coming
from the timer tick from being skipped, or something like that?

More generally speaking, I think I can see how this feature can be
useful, and I also think it can live in the generic schedule.c code, but
the algorithm with 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).

For example this might completely destroy the time guarantees a
scheduler  like sEDF would give, and in such case it must be easy enough
to figure out what's going on and why the scheduler is  not behaving as
one would have expected!

For that reaason, although, again, a mechanism like this could
(according to my opinion) be general enough to be sensible and
meaningful for all the various schedulers, it might be worthwhile to
have it inside credit1 for now, where we know it will probably yield the
most of its benefits.

Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-8Iodr/0ZmacFf0eg7GOP
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk6l1poACgkQk4XaBE3IOsTR4QCgo8qwbL9coywsBY3ZRvj6KJT/
nq0An3oLLytuJJ3MwmqOXJLkLK0bhj/9
=FBhE
-----END PGP SIGNATURE-----

--=-8Iodr/0ZmacFf0eg7GOP--


--===============0521509107==
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

--===============0521509107==--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:18:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:18:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkdq-00049k-HB; Tue, 25 Oct 2011 10:18:22 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIbVi-0001IV-0x
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 00:33:24 -0700
X-Env-Sender: thfbjhkhtdx@gmail.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1319527996!867882!1
X-Originating-IP: [209.85.210.49]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21808 invoked from network); 25 Oct 2011 07:33:18 -0000
Received: from mail-pz0-f49.google.com (HELO mail-pz0-f49.google.com)
	(209.85.210.49)
	by server-11.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 07:33:18 -0000
Received: by pzk32 with SMTP id 32so712894pzk.8
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 00:33:16 -0700 (PDT)
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
	:content-type; bh=ZzyjF0hrrA72j32NXPH0HEW0NWbjWOKCYAqrXBQEqQQ=;
	b=tCyyT4EnUEngMnZKTQgRdCKsgN4mHkfnOejAujqy6/aRoJBGDWlOshptuBmP+Y+dPf
	tF4pYFivwTgtU759a4HQEwDVf7hks7k+Ike48urC6V/e3+SL6HbBmFYInkydL8E6CN6X
	6h+TrQ3NOQON7XMC5wnXLVLX7DhFW7QxEmjyg=
Received: by 10.68.156.1 with SMTP id wa1mr54257091pbb.58.1319527995927;
	Tue, 25 Oct 2011 00:33:15 -0700 (PDT)
Received: from [192.168.5.21] ([219.224.169.140])
	by mx.google.com with ESMTPS id x7sm5070123pbf.5.2011.10.25.00.33.13
	(version=SSLv3 cipher=OTHER); Tue, 25 Oct 2011 00:33:15 -0700 (PDT)
Message-ID: <4EA66636.30400@gmail.com>
Date: Tue, 25 Oct 2011 15:33:10 +0800
From: Tommy <thfbjhkhtdx@gmail.com>
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
Subject: [Xen-devel] pci passthrough and live migration
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0076779933=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============0076779933==
Content-Type: multipart/alternative;
	boundary="------------030009030608090509080008"

This is a multi-part message in MIME format.
--------------030009030608090509080008
Content-Type: text/plain; charset=GB2312
Content-Transfer-Encoding: 7bit

Hello, everybody!

I've done some research on Xenlive migration recently.

I've checked the maillist for pci passthrough and live migration, I
can't figure out the current progress on them.

Does Xen support live migration with pci passthrough? How about that
with vga passthrough?

If it is supported now, what extra configurations do I need?

If not, could anyone give some ideas on what is the main difficulties
for it?

At last, does anyone have some documents about this area?

Thanks!


-- 

Yours Sincerely!



--------------030009030608090509080008
Content-Type: text/html; charset=GB2312
Content-Transfer-Encoding: 8bit

<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=GB2312">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <span class="Apple-style-span" style="border-collapse: separate;
      color: rgb(0, 0, 0); font-family: Simsun; font-style: normal;
      font-variant: normal; font-weight: normal; letter-spacing: normal;
      line-height: normal; orphans: 2; text-align: -webkit-auto;
      text-indent: 0px; text-transform: none; white-space: normal;
      widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing:
      0px; -webkit-border-vertical-spacing: 0px;
      -webkit-text-decorations-in-effect: none;
      -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;
      font-size: medium; "><span class="Apple-style-span"
        style="font-family: Arial, Helvetica, 'Luxi Sans', sans-serif;
        font-size: 14px; white-space: pre; ">
        <meta http-equiv="Content-Type" content="text/html;
          charset=GB2312">
        <meta name="ProgId" content="Word.Document">
        <meta name="Generator" content="Microsoft Word 14">
        <meta name="Originator" content="Microsoft Word 14">
        <link rel="File-List"
href="file:///C:%5CUsers%5CTommy%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml">
        <!--[if gte mso 9]><xml>
 <o:OfficeDocumentSettings>
  <o:AllowPNG/>
 </o:OfficeDocumentSettings>
</xml><![endif]-->
        <link rel="themeData"
href="file:///C:%5CUsers%5CTommy%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx">
        <link rel="colorSchemeMapping"
href="file:///C:%5CUsers%5CTommy%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml">
        <!--[if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 pt</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:EnableOpenTypeKerning/>
   <w:DontFlipMirrorIndents/>
   <w:OverrideTableStyleHps/>
   <w:UseFELayout/>
  </w:Compatibility>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val="&#45;-"/>
   <m:smallFrac m:val="off"/>
   <m:dispDef/>
   <m:lMargin m:val="0"/>
   <m:rMargin m:val="0"/>
   <m:defJc m:val="centerGroup"/>
   <m:wrapIndent m:val="1440"/>
   <m:intLim m:val="subSup"/>
   <m:naryLim m:val="undOvr"/>
  </m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267">
  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
 </w:LatentStyles>
</xml><![endif]-->
        <style>
<!--
 /* Font Definitions */
 @font-face
	{font-family:ËÎÌå;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimSun;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
	{font-family:ËÎÌå;
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-alt:SimSun;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-520092929 1073786111 9 0 415 0;}
@font-face
	{font-family:"\@ËÎÌå";
	panose-1:2 1 6 0 3 1 1 1 1 1;
	mso-font-charset:134;
	mso-generic-font-family:auto;
	mso-font-pitch:variable;
	mso-font-signature:3 680460288 22 0 262145 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin:0cm;
	margin-bottom:.0001pt;
	text-align:justify;
	text-justify:inter-ideograph;
	mso-pagination:none;
	font-size:10.5pt;
	mso-bidi-font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:ËÎÌå;
	mso-fareast-theme-font:minor-fareast;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-font-kerning:1.0pt;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	font-family:"Calibri","sans-serif";
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;}
 /* Page Definitions */
 @page
	{mso-page-border-surround-header:no;
	mso-page-border-surround-footer:no;}
@page WordSection1
	{size:595.3pt 841.9pt;
	margin:72.0pt 90.0pt 72.0pt 90.0pt;
	mso-header-margin:42.55pt;
	mso-footer-margin:49.6pt;
	mso-paper-source:0;
	layout-grid:15.6pt;}
div.WordSection1
	{page:WordSection1;}
-->
</style><!--[if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:"Table Normal";
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.5pt;
	mso-bidi-font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-font-kerning:1.0pt;}
</style>
<![endif]--><small>
        </small>
        <p class="MsoNormal"><big><span lang="EN-US">Hello, everybody!<o:p></o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US"><o:p>&nbsp;</o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US">I've done some
              research on Xen<span
                style="color:red;background:#D9D9D9;mso-shading:white;mso-pattern:gray-15
                auto"> live migration</span> recently. <o:p></o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US"><o:p>&nbsp;</o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US">I've checked the
              maillist for <span
                style="color:red;background:#D9D9D9;mso-shading:white;mso-pattern:gray-15
                auto">pci passthrough and live migration</span>, I can't
              figure out the current progress
              on them.<o:p></o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US"><o:p>&nbsp;</o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US">Does Xen support
              live migration with <span
                style="color:red;background:#D9D9D9;mso-shading:white;mso-pattern:gray-15
                auto">pci passthrough</span>? How about that with <span
                style="color:red;background:#D9D9D9;
                mso-shading:white;mso-pattern:gray-15 auto">vga
                passthrough</span>?<o:p></o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US"><o:p>&nbsp;</o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US">If it is supported
              now, what <span
                style="color:red;background:#D9D9D9;mso-shading:white;mso-pattern:gray-15
                auto">extra configurations</span> do I need?<o:p></o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US">If not, could
              anyone give some ideas on what is the main difficulties
              for it?<o:p></o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US"><o:p>&nbsp;</o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US">At last, does
              anyone have <span
                style="color:red;background:#D9D9D9;mso-shading:white;mso-pattern:gray-15
                auto">some documents</span> about this area?<o:p></o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><big><span lang="EN-US"><o:p>&nbsp;</o:p></span></big></p>
        <big>
        </big>
        <p class="MsoNormal"><small><span lang="EN-US"><big><big>Thanks!</big></big><o:p></o:p></span></small></p>
        <small>
        </small></span></span><br class="Apple-interchange-newline">
    <div class="moz-signature">-- <br>
      <meta http-equiv="CONTENT-TYPE" content="text/html;
        charset=GB2312">
      <title></title>
      <meta name="GENERATOR" content="LibreOffice 3.3 (Linux)">
      <meta name="AUTHOR" content="tommy ">
      <meta name="CREATED" content="20111010;21344700">
      <meta name="CHANGEDBY" content="tommy ">
      <meta name="CHANGED" content="20111010;21364900">
      <style type="text/css">
	<!--
		@page { margin: 0.79in }
		P { margin-bottom: 0.08in }
		A:link { so-language: zxx }
	-->
	</style>
      <p align="LEFT"><font color="#a6a6a6"><font size="3"><span
              lang="en-US">Yours
              Sincerely</span></font></font><font color="#a6a6a6"><font
            size="2"><span lang="en-US">!</span></font></font></p>
      <p style="margin-bottom: 0in"><br>
      </p>
    </div>
  </body>
</html>

--------------030009030608090509080008--


--===============0076779933==
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

--===============0076779933==--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:19:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:19:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkf8-0004XL-8U; Tue, 25 Oct 2011 10:19:42 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIdd9-0007Xv-Fd
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 02:49:12 -0700
X-Env-Sender: mark.hurenkamp@xs4all.nl
X-Msg-Ref: server-16.tower-21.messagelabs.com!1319536148!1546770!1
X-Originating-IP: [194.109.24.34]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22387 invoked from network); 25 Oct 2011 09:49:08 -0000
Received: from smtp-vbr14.xs4all.nl (HELO smtp-vbr14.xs4all.nl) (194.109.24.34)
	by server-16.tower-21.messagelabs.com with SMTP;
	25 Oct 2011 09:49:08 -0000
Received: from mail.xs4all.nl (roundcube3.xs4all.net [194.109.20.199])
	(authenticated bits=0)
	by smtp-vbr14.xs4all.nl (8.13.8/8.13.8) with ESMTP id p9P9n6hu064269;
	Tue, 25 Oct 2011 11:49:07 +0200 (CEST)
	(envelope-from mark.hurenkamp@xs4all.nl)
Received: from [130.138.227.42] by mail.xs4all.nl
	with HTTP (HTTP/1.1 POST); Tue, 25 Oct 2011 11:49:06 +0200
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8;
 format=flowed
Content-Transfer-Encoding: 7bit
Date: Tue, 25 Oct 2011 11:49:06 +0200
From: Mark Hurenkamp <mark.hurenkamp@xs4all.nl>
To: <linux-kernel@vger.kernel.org>, <xen-devel@lists.xensource.com>,
	<konrad.wilk@oracle.com>
Message-ID: <47a7e2cca77c8cc5f749f171070fcb82@xs4all.nl>
X-Sender: mark.hurenkamp@xs4all.nl (5o/YyqDkgs1RCEwkZwH2r20HWRqzMiK4)
User-Agent: XS4ALL Webmail
X-Virus-Scanned: by XS4ALL Virus Scanner
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:19 -0700
Cc: 
Subject: [Xen-devel] Fwd: [Bug 860175] Re: pci passthrough of
 snd_hda_intel or via usb to oneiric hvm breaks xen pvops drivers
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,


While upgrading my xen host & guests to oneiric, i seem to have 
stumbled over a
problem in the xen subsystem for recent (3.0 & 3.1) kernels. What i 
notice is that
the pvops disk driver fails during boot, when i use pci passthrough on 
some
(not all) devices, i suspect what works is PCIe, and what doesn't work 
is PCI.
Disabling acpi, pci passthrough of some devices, or the xen pvops block 
driver
seems to solve the problem.

For more detailed information see 
https://bugs.launchpad.net/bugs/860175

I would have liked to submit this pr to bugzilla.kernel.org as 
requested by the
ubuntu team, but that site does not seem to be online, hence i'm 
reporting this
to linux-kernel and xen-devel mailinglists instead.

If there's anything more i can do to help track this problem down, do 
let me know.


Warm regards,
Mark.


-------- Original Message --------
Subject: [Bug 860175] Re: pci passthrough of snd_hda_intel or via usb 
to oneiric hvm breaks xen pvops drivers
Date: Mon, 24 Oct 2011 23:01:00 -0000
 From: Joseph Salisbury <joseph.salisbury@canonical.com>
To: mark.hurenkamp@xs4all.nl
Reply-To: Bug 860175 <860175@bugs.launchpad.net>

This issue appears to be an upstream bug, since you tested the latest
upstream kernel.  Would it be possible for you to open an upstream bug
report at bugzilla.kernel.org [1]?  That will allow the upstream
Developers to examine the issue, and may provide a quicker resolution 
to
the bug.

If you are comfortable with opening a bug upstream, It would be great 
if
you can report back the upstream bug number in this bug report.  That
will allow us to link this bug to the upstream report.

[1] https://wiki.ubuntu.com/Bugs/Upstream/kernel

** Changed in: linux (Ubuntu)
        Status: Confirmed => Triaged

-- 
You received this bug notification because you are subscribed to the 
bug
report.
https://bugs.launchpad.net/bugs/860175

Title:
   pci passthrough of snd_hda_intel or via usb to oneiric hvm breaks xen
   pvops drivers

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/860175/+subscriptions



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:20:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:20:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIkgC-0004ut-As; Tue, 25 Oct 2011 10:20:48 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIhxQ-00071B-GL
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 07:26:24 -0700
X-Env-Sender: carnold@suse.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319552780!706931!1
X-Originating-IP: [137.65.248.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4026 invoked from network); 25 Oct 2011 14:26:21 -0000
Received: from novprvoes0310.provo.novell.com (HELO
	novprvoes0310.provo.novell.com) (137.65.248.74)
	by server-3.tower-182.messagelabs.com with SMTP;
	25 Oct 2011 14:26:21 -0000
Received: from INET-PRV-MTA by novprvoes0310.provo.novell.com
	with Novell_GroupWise; Tue, 25 Oct 2011 08:26:20 -0600
Message-Id: <4EA672A90200009100076223@novprvoes0310.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Tue, 25 Oct 2011 08:26:17 -0600
From: "Charles Arnold" <carnold@suse.com>
To: <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] [PATCH] x86/ucode-amd: fix regression from c/s
	23871:503ee25
Mime-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
X-Mailman-Approved-At: Tue, 25 Oct 2011 09:33:18 -0700
Cc: "keir@xen.org" <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 21/10/2011 09:37, "Jan Beulich" <JBeulich@xxxxxxxx> wrote:

> microcode_fits() must return distinct values for the success and
> no-fit-but-no-error cases, so the caller can react accordingly. Make
> it return 1 in the success case, and adjust its single caller.
>=20
> Also remove an impossible code path - install_equiv_cpu_table(), which
> gets called prior to microcode_fits(), never leaves equiv_cpu_table
> being NULL without also returning an error.
>=20
> Note that this is still awaiting testing on a system where the
> regression was actually observed (which also requires a new enough
> microcode_ctl package). Note also that this will need to be
> backported to 4.0 and 4.1 (or the broken c/s that got backported
> there reverted).
>=20
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
>=20
> --- a/xen/arch/x86/microcode_amd.c
> +++ b/xen/arch/x86/microcode_amd.c
> @@ -76,14 +76,6 @@ static int microcode_fits(void *mc, int=20
>      /* We should bind the task to the CPU */
>      BUG_ON(cpu !=3D raw_smp_processor_id());
> =20
> -    if ( equiv_cpu_table =3D=3D NULL )
> -    {
> -        printk(KERN_INFO "microcode: CPU%d microcode update with "
> -               "version 0x%x (current=3D0x%x)\n",
> -               cpu, mc_header->patch_id, uci->cpu_sig.rev);
> -        goto out;
> -    }
> -
>      current_cpu_id =3D cpuid_eax(0x00000001);
> =20
>      for ( i =3D 0; equiv_cpu_table[i].installed_cpu !=3D 0; i++ )
> @@ -96,7 +88,7 @@ static int microcode_fits(void *mc, int=20
>      }
> =20
>      if ( !equiv_cpu_id )
> -           return 0;
> +        return 0;
> =20
>      if ( (mc_header->processor_rev_id) !=3D equiv_cpu_id )
>      {
> @@ -113,8 +105,7 @@ static int microcode_fits(void *mc, int=20
>             "update with version 0x%x (current=3D0x%x)\n",
>             cpu, mc_header->patch_id, uci->cpu_sig.rev);
> =20
> -out:
> -    return 0;
> +    return 1;
>  }
> =20
>  static int apply_microcode(int cpu)
> @@ -285,7 +276,7 @@ static int cpu_request_microcode(int cpu
>      while ( (ret =3D get_next_ucode_from_buffer_amd(mc, buf, size, =
&offset))=20
> =3D=3D=20
> 0)
>      {
>          error =3D microcode_fits(mc, cpu);
> -        if (error !=3D 0)
> +        if (error <=3D 0)
>              continue;
> =20
>          error =3D apply_microcode(cpu);
>=20

Our internal testing confirms that this patch fixes the boot problem. =20
Comment from Bugzilla states,
"Both affected systems (with most recent microcode_ctl-1.17-102.38.1 =
installed
and insserv'ed) are now booting well."

- Charles



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:42:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:42:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIl1T-0003wk-Pj; Tue, 25 Oct 2011 10:42:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIk0L-0001bx-LL
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 09:37:34 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319560639!43114994!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20054 invoked from network); 25 Oct 2011 16:37:19 -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;
	25 Oct 2011 16:37:19 -0000
Received: by wwf10 with SMTP id 10so961953wwf.24
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 09:37:30 -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:cc; bh=r6dbMhCfOvvvU4xsDP8fB5NECiLn+2/3xUVbjsxNP5c=;
	b=auuW3/HuPv6ecWpd8dKrmSq2hGb+YGU/p/aMejbCfTkgpqXyFqbyFqP4MgqQ0UdI9t
	swNAv+TkZMbamUpiBCR9DOWuL2cd3p7e7C2eNvOpxCzSqFBofkegDnnlbVb80MZ18r+i
	0YMwINOXSxH32CbCwWDboKKEAGsZ8ilbqE8KQ=
Received: by 10.227.206.211 with SMTP id fv19mr4527290wbb.27.1319560650188;
	Tue, 25 Oct 2011 09:37:30 -0700 (PDT)
Received: from loki.upc.es (queen.upc.es. [147.83.39.247])
	by mx.google.com with ESMTPS id fo7sm45996167wbb.20.2011.10.25.09.37.27
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 25 Oct 2011 09:37:28 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f5e0cd9fa6ee923b8524e6a3fd652714de34847d
Message-Id: <f5e0cd9fa6ee923b8524.1319560622@loki.upc.es>
In-Reply-To: <0a720316685a73e2d5ae.1318930198@loki>
References: <0a720316685a73e2d5ae.1318930198@loki>
User-Agent: Mercurial-patchbomb/1.9.2
Date: Tue, 25 Oct 2011 18:37:02 +0200
From: Roger Pau Monne <roger.pau@entel.upc.edu>
To: xen-devel@lists.xensource.com
Cc: Ian.Jackson@eu.citrix.com
Subject: [Xen-devel] [PATCH v3] 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 1319560415 -7200
# Node ID f5e0cd9fa6ee923b8524e6a3fd652714de34847d
# Parent  657f4a66dba0b5ca3ad5e89626e735d976e02141
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 657f4a66dba0 -r f5e0cd9fa6ee Config.mk
--- a/Config.mk	Fri Oct 21 14:03:17 2011 +0200
+++ b/Config.mk	Tue Oct 25 18:33:35 2011 +0200
@@ -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 657f4a66dba0 -r f5e0cd9fa6ee tools/check/Makefile
--- a/tools/check/Makefile	Fri Oct 21 14:03:17 2011 +0200
+++ b/tools/check/Makefile	Tue Oct 25 18:33:35 2011 +0200
@@ -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 657f4a66dba0 -r f5e0cd9fa6ee tools/check/funcs.sh
--- a/tools/check/funcs.sh	Fri Oct 21 14:03:17 2011 +0200
+++ b/tools/check/funcs.sh	Tue Oct 25 18:33:35 2011 +0200
@@ -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 Tue Oct 25 10:44:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:44:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIl31-0004g5-Od; Tue, 25 Oct 2011 10:44:23 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIk33-0002S2-1N
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 09:40:21 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1319560816!733477!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16477 invoked from network); 25 Oct 2011 16:40:17 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-2.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 16:40:17 -0000
Received: by qyg36 with SMTP id 36so824950qyg.9
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 09:40:16 -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=jztwWhJO4E4Vty0VX1BHY0n430w+BXHymc7EIBb6lNc=;
	b=RnRiBTbTK/zpbMZVrJPfeEVb/8ZXk6Pr4XsGp2+BX5TZj8qzgdIxHlAG6lEEz7ZzsD
	w5fRwCQ/buQmp+LorGItxD0NmyEdbhdd0TScugNodk1tbqHiqyrx0v3zINDk9UAWCA6C
	q5UlfF0xuOBYpmuctAqIOQFcmM0hIAH1FjgAA=
MIME-Version: 1.0
Received: by 10.68.10.70 with SMTP id g6mr57722068pbb.65.1319560816130; Tue,
	25 Oct 2011 09:40:16 -0700 (PDT)
Received: by 10.142.13.5 with HTTP; Tue, 25 Oct 2011 09:40:16 -0700 (PDT)
In-Reply-To: <20134.52055.925444.153629@mariner.uk.xensource.com>
References: <8fe2ca552de44aa679be.1318512275@loki>
	<20124.19527.706498.819017@mariner.uk.xensource.com>
	<CAPLaKK6=nU4R62KvxK++XGNx0zff89TNYZkTFizZ1wDbMqUBNg@mail.gmail.com>
	<20125.32034.710835.32455@mariner.uk.xensource.com>
	<CAPLaKK71zs+0aPd2A6yM_+OPtEfMJZnK2KyHANFxFXgDjms8qQ@mail.gmail.com>
	<20134.52055.925444.153629@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 18:40:16 +0200
X-Google-Sender-Auth: ht51BkZEwf3q2-BNCxtBxCGOZFU
Message-ID: <CAPLaKK4K3BuQRaMWzPCCR7fF2oD8+_zFRLscYLob+5aL2KG1NA@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] tools/check: check for headers and libraries
	in EXTRA_INCLUDES and EXTRA_LIB
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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/10/25 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> Roger Pau Monn=C3=A9 writes ("Re: [Xen-devel] [PATCH] tools/check: check =
for headers and libraries in EXTRA_INCLUDES and EXTRA_LIB"):
>> And variables where not passed to executed script.
>
> mariner:~/junk> cat t.make
> export TEST=3Dvalue
>
> target:
> =C2=A0 =C2=A0 =C2=A0 =C2=A0printenv | grep TEST
> mariner:~/junk> make -f t.make target
> printenv | grep TEST
> TEST=3Dvalue
> mariner:~/junk>
>
>
> Or if you prefer documentation, here is what Debian's
> make-doc-non-dfsg 3.81-5 has to say:
>
> =C2=A05.7.2 Communicating Variables to a Sub-`make'
> =C2=A0---------------------------------------------
>
> =C2=A0...
>
> =C2=A0 =C2=A0 To pass down, or "export", a variable, `make' adds the vari=
able and
> =C2=A0its value to the environment for running each command. =C2=A0The su=
b-`make',
> =C2=A0in turn, uses the environment to initialize its table of variable
> =C2=A0values. =C2=A0*Note Variables from the Environment: Environment.

Sorry for that, I was doing it all wrong, I was reading the make man
page, not the gmake man page, and also I was trying to export the
variables inside the target definition. Anyway, I hope the patch I've
just sent is fine, sorry for the mess and the time you lost on this.

Roger.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:45:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10: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 1RIl4D-0005CW-Bn; Tue, 25 Oct 2011 10:45:37 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIkBF-0005tS-QM
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 09:48:50 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1319561326!734281!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3045 invoked from network); 25 Oct 2011 16:48:46 -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;
	25 Oct 2011 16:48:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8577657"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 16:48: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, 25 Oct 2011 17:48:18 +0100
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
	1RIkAj-0007GK-K6; Tue, 25 Oct 2011 16:48:17 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIkAj-0004rW-I5;
	Tue, 25 Oct 2011 17:48:17 +0100
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: <20134.59473.545775.75504@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 17:48:17 +0100
To: AP <apxeng@gmail.com>
Subject: Re: [Xen-devel] xen 3.4-testing build error
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CAGU+auuAivu8ezH11xxTGFs_aWAovdBY2o_h8agw+1XLK4f_Mw@mail.gmail.com>
References: <CAGU+auuKHp=vX_LamPmcmGMYsos1oG7Xq8biMk=LPG=B3gaC5A@mail.gmail.com>
	<1319014066.3385.67.camel@zakaz.uk.xensource.com>
	<CAGU+auuAivu8ezH11xxTGFs_aWAovdBY2o_h8agw+1XLK4f_Mw@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>,
	Keith Coleman <list.keith@scaltro.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

AP writes ("Re: [Xen-devel] xen 3.4-testing build error"):
> I am primarily using 4.1 but I still have a couple of servers running
> 3.4, so I want to ensure that I can still build that using Ubuntu
> 11.10.

Thanks for doing this research and reporting back.

> On Wed, Oct 19, 2011 at 1:47 AM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > Recent Ubuntu enabled --as-needed in the linker by default. If you want
> > to stick with 3.4 you might need to add --no-as-needed somewhere
> > appropriate, 22856:18807b89083d is the temporary fix which we used for
> > 4.1. This issue is fixed properly in 4.2.
> 
> Thank you! 22856 did the trick. BTW, I also had to pull in a few more
> fixes to get everything to work. I am listing them here in case
> someone else runs in to the same issue. The only outstanding problem
> is that bringing up a DomU with SDL leaves you with a flickering SDL
> window. Using VNC is a workaround for that.
> 
> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/2e78e0ce1f31
> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/e6b5b2cb8146
> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/9c2fdcff3704

I have CC'd Keith Coleman, maintainer of the 3.4 tree.  Keith, do you
think these might be appropriate for backporting ?  (I haven't checked
myself ...)

Ian.

> diff -r 0e3b875fd5fb -r 3a1e98c88825 tools/blktap/lib/blktaplib.h
> --- a/tools/blktap/lib/blktaplib.h      Fri Sep 30 18:42:30 2011 -0400
> +++ b/tools/blktap/lib/blktaplib.h      Wed Oct 19 11:07:22 2011 -0700
> @@ -196,6 +196,7 @@
>  } msg_pid_t;
> 
>  #define READ 0
> +#undef WRITE
>  #define WRITE 1
> 
> http://www.gossamer-threads.com/lists/xen/devel/179690
> diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/arch/x86/mm.c
> --- a/extras/mini-os/arch/x86/mm.c      Sun Jul 25 22:22:43 2010 +0100
> +++ b/extras/mini-os/arch/x86/mm.c      Wed Oct 19 12:25:52 2011 -0700
> @@ -281,7 +281,7 @@
>  /*
>   * Mark portion of the address space read only.
>   */
> -extern void shared_info;
> +extern char shared_info[PAGE_SIZE];
>  static void set_readonly(void *text, void *etext)
>  {
>      unsigned long start_address =
> diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/minios.mk
> --- a/extras/mini-os/minios.mk  Sun Jul 25 22:22:43 2010 +0100
> +++ b/extras/mini-os/minios.mk  Wed Oct 19 12:25:52 2011 -0700
> @@ -10,6 +10,7 @@
>  DEF_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
>  DEF_CFLAGS += $(call cc-option,$(CC),-fgnu89-inline)
>  DEF_CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline
> +DEF_CFLAGS += -Wno-uninitialized
>  DEF_CPPFLAGS += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
> 
>  DEF_ASFLAGS += -D__ASSEMBLY__
> diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/netfront.c
> --- a/extras/mini-os/netfront.c Sun Jul 25 22:22:43 2010 +0100
> +++ b/extras/mini-os/netfront.c Wed Oct 19 12:25:52 2011 -0700
> @@ -25,8 +25,8 @@
> 
> 
> 
> -#define NET_TX_RING_SIZE __RING_SIZE((struct netif_tx_sring *)0, PAGE_SIZE)
> -#define NET_RX_RING_SIZE __RING_SIZE((struct netif_rx_sring *)0, PAGE_SIZE)
> +#define NET_TX_RING_SIZE __CONST_RING_SIZE(netif_tx, PAGE_SIZE)
> +#define NET_RX_RING_SIZE __CONST_RING_SIZE(netif_rx, PAGE_SIZE)
>  #define GRANT_INVALID_REF 0
> 
> > Ian.
> >
> >>
> >> Thanks,
> >> AP
> >>
> >> GCC Info
> >> --------------
> >> Using built-in specs.
> >> COLLECT_GCC=gcc
> >> COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6.1/lto-wrapper
> >> Target: x86_64-linux-gnu
> >> Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
> >> 4.6.1-9ubuntu3'
> >> --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs
> >> --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr
> >> --program-suffix=-4.6 --enable-shared --enable-linker-build-id
> >> --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
> >> --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6
> >> --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu
> >> --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin
> >> --enable-objc-gc --disable-werror --with-arch-32=i686
> >> --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu
> >> --host=x86_64-linux-gnu --target=x86_64-linux-gnu
> >> Thread model: posix
> >> gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
> >>
> >> _______________________________________________
> >> 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 Tue Oct 25 10:46:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:46:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIl55-0005c9-Jd; Tue, 25 Oct 2011 10:46:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIkGE-00085a-6k
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 09:53:58 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1319561634!724551!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30282 invoked from network); 25 Oct 2011 16:53:55 -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;
	25 Oct 2011 16:53:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8577827"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 16:53: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; Tue, 25 Oct 2011 17:53:45 +0100
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
	1RIkG0-0007IJ-SZ; Tue, 25 Oct 2011 16:53:44 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIkG0-0004rw-RL;
	Tue, 25 Oct 2011 17:53:44 +0100
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: <20134.59800.835498.929876@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 17:53:44 +0100
To: Borislav Petkov <bp@amd64.org>
Subject: Re: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode
	update in Xen dom0
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <m2n.s.1RGYF2-136675@chiark.greenend.org.uk>
References: <20111012101615.GA14966@aftab> <4E95D9E7.6090304@zytor.com>
	<4E95E7FE.6050302@goop.org> <20111012194543.GD14966@aftab>
	<20111012204048.GA22260@phenom.oracle.com>
	<4E960746.90805@zytor.com> <20111012214013.GD28723@aftab>
	<4E9D3F36.6070201@amd.com>
	<m2n.s.1RGYF2-136675@chiark.greenend.org.uk>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Christoph Egger <Christoph.Egger@amd.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy@goop.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Xen Devel <xen-devel@lists.xensource.com>,
	Tigran Aivazian <tigran@aivazian.fsnet.co.uk>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	Thomas Gleixner <tglx@linutronix.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

Borislav Petkov writes ("Re: [Xen-devel] Re: [PATCH 0/3] x86/microcode: support for microcode update in Xen dom0"):
> No, you don't want to keep the existing API and you know it. I've
> explained to you last week why.

So should I submit a patchset to remove the existing post-boot
microcode loading from Linux ?

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:47:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:47:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIl5r-00060p-Nk; Tue, 25 Oct 2011 10:47:19 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIkNY-0001Yk-QW
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 10:01:33 -0700
X-Env-Sender: Jonathan.Ludlam@eu.citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1319562067!50198391!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31646 invoked from network); 25 Oct 2011 17:01:07 -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;
	25 Oct 2011 17:01:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8577989"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 17:01:29 +0000
Received: from LONPMAILBOX01.citrite.net ([10.30.224.160]) by
	LONPMAILMX01.citrite.net ([10.30.203.162]) with mapi; Tue, 25 Oct 2011
	18:01:29 +0100
From: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Tue, 25 Oct 2011 18:01:28 +0100
Subject: Re: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
Thread-Topic: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
Thread-Index: AcyTN7yiF7PPZF+STLKnDBHsCABBGQ==
Message-ID: <4B438545-27B2-4922-9012-FA4FAC7A6EEF@eu.citrix.com>
References: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@mail.gmail.com>
	<1318947065.3385.26.camel@zakaz.uk.xensource.com>
	<CAFLBxZYiM9_yT1+5nQx=5vTUbE6xLXi0cCLPDLVdhUhmDO5-NA@mail.gmail.com>
	<20134.57267.925456.677251@mariner.uk.xensource.com>
In-Reply-To: <20134.57267.925456.677251@mariner.uk.xensource.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: George Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.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

For reference, here's what's executed when I build the xenctrl package in l=
atest xen-unstable:

ocamlc -g -I ../mmap -w F -warn-error F -c -o xenctrl.cmi xenctrl.mli
ocamlc -g -I ../mmap -w F -warn-error F -c -o xenctrl.cmo xenctrl.ml
ocamlc -g -I ../mmap -w F -warn-error F -a -o xenctrl.cma  -dllib dllxenctr=
l_stubs.so -cclib -lxenctrl_stubs  xenctrl.cmo
gcc -O1 -fno-omit-frame-pointer -m32 -march=3Di686 -g -fno-strict-aliasing =
-std=3Dgnu99 -Wall -Wstrict-prototypes -Wno-unused-value -Wdeclaration-afte=
r-statement -Wno-unused-but-set-variable  -D__XEN_TOOLS__ -MMD -MF .xenctrl=
_stubs.o.d -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=3D64 -D_LARGEFILE_SOURCE=
 -D_LARGEFILE64_SOURCE -fno-optimize-sibling-calls -mno-tls-direct-seg-refs=
 -I/usr/lib/ocaml -fPIC -Werror -I../mmap -I/home/jon/xen-unstable.hg/tools=
/ocaml/libs/xc/../../../../tools/libxc -I/home/jon/xen-unstable.hg/tools/oc=
aml/libs/xc/../../../../tools/include -I/home/jon/xen-unstable.hg/tools/oca=
ml/libs/xc/../../../../tools/libxc -I/home/jon/xen-unstable.hg/tools/ocaml/=
libs/xc/../../../../tools/include -c -o xenctrl_stubs.o xenctrl_stubs.c
ar rcs libxenctrl_stubs.a  xenctrl_stubs.o && ocamlmklib -o `basename libxe=
nctrl_stubs.a .a | sed -e 's/^lib//'`  xenctrl_stubs.o
ocamlopt -g -ccopt "  " -dtypes -I ../mmap -cc gcc -w F -warn-error F -c -o=
 xenctrl.cmx xenctrl.ml
ocamlopt -g -ccopt "  " -dtypes -I ../mmap -cc gcc -w F -warn-error F -a -o=
 xenctrl.cmxa  -cclib -lxenctrl_stubs -cclib /home/jon/xen-unstable.hg/tool=
s/ocaml/libs/xc/../../../../tools/libxc/libxenctrl.so -cclib /home/jon/xen-=
unstable.hg/tools/ocaml/libs/xc/../../../../tools/libxc/libxenguest.so  xen=
ctrl.cmx

The -cclib arguments specify additional command-line arguments that=20
will be passed to gcc. When you're building a library (as we are here)=20
they are *not* used unless you link against the library that has been=20
produced. The reason that they are specified is that the ocaml compiler=20
will record the -cclib and -ccopt command line arguments in the library.=20
When you then link against that library later, it will behave as if those
 arguments were passed on the command line. In this case, it records
 the " -cclib /home/jon/xen-unstable.hg/tools/ocaml/libs/xc/../../../../too=
ls/libxc/libxenctrl.so"=20
which is unhelpful. The correct thing to do is to record the eventual
 locations of the libraries. However, there's a slight complication: these
 libraries are used in the compilation of the oxenstored binary. In order=20
to prevent it attempting to link against whatever is currently installed=20
instead of what's in the tree (which was the original bug), the option=20
"-noautolink" can be passed to the ocaml compiler which causes it to=20
ignore the recorded -cclib and -ccopt parameters, and we can instead
 pass '-cclib /path/to/.so/file'.

I shall work on a patch :-)

Jon



On 25 Oct 2011, at 17:11, Ian Jackson wrote:

> George Dunlap writes ("Re: [Xen-devel] RFC: Partially revert xen-unstable=
 c/s 23071:a3466b005017"):
>> Yes; it hard-codes the full path of the build tree library file.
>=20
> That seems a strange thing for it to do.
>=20
>> You're right, it's actually 23921 that caused the problem.  I just did
>> "hg annotate" and found 23071.
>=20
> Reverting this part of 23921 will just bring back the previous bug,
> that the build system might pick up libraries in /usr (or somewhere
> else on the default compile-time linker search path).
>=20
> Is there a way to get the ocaml linker stage to print out the complete
> link line it's using ?  If so it'll probably be possible to spot the
> difference between the link lines used for the ocaml libraries and
> those used elsewhere.  Then we might understand what to fix.
>=20
> Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:48:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:48:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIl6n-0006U5-Ur; Tue, 25 Oct 2011 10:48:17 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIkhR-0005Ia-4j
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 10:22:05 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-10.tower-216.messagelabs.com!1319563321!928400!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28374 invoked from network); 25 Oct 2011 17:22:02 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-10.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 25 Oct 2011 17:22:02 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319563321; l=530;
	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=A/ObMRwd2FCiLDDmRfW4NV+87Ec=;
	b=Jt6XsuEkLOIIsDTTpD48Bdik6rB4DUmSl6IHmbLzPV6FNegbZ5g6j3l7oiqmkBZcAna
	TXoJUCAH89l20po3YUgkSxTOYIW/6fLxTqn8dLaW2auWQ7KAH9NhH9ihRRm24FXDV0PM6
	n/PkmbxcpQFWGCxIJo+jOD3VqPR+AUjhU6g=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjMQG3Q7
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-100-089.pools.arcor-ip.net [88.65.100.89])
	by smtp.strato.de (jimi mo57) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id w028d0n9PGm52D ;
	Tue, 25 Oct 2011 19:22:00 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id EA3F718637; Tue, 25 Oct 2011 19:21:59 +0200 (CEST)
Date: Tue, 25 Oct 2011 19:21:59 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 17 of 24] libxl: add
	libxl__spawn_confirm_offspring_startup
Message-ID: <20111025172159.GA11571@aepfle.de>
References: <patchbomb.1317657277@probook.site>
	<018f63b6e4863faca16a.1317657294@probook.site>
	<20134.54883.620815.989672@mariner.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <20134.54883.620815.989672@mariner.uk.xensource.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, Oct 25, Ian Jackson wrote:

> Olaf Hering writes ("[Xen-devel] [PATCH 17 of 24] libxl: add libxl__spawn_confirm_offspring_startup"):
> > libxl: add libxl__spawn_confirm_offspring_startup
> > 
> > libxl__spawn_confirm_offspring_startup() is a generic version of
> > libxl__confirm_device_model_startup().
> 
> Thanks but I think it would be better to refactor this to avoid the
> duplication of this code.

The new function is used in patch #18 of this series.
Or do you have some other changes in mind?

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:49:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:49:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIl7o-0006sp-Ib; Tue, 25 Oct 2011 10:49:20 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIkms-0006iS-Ni
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 10:27:43 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1319563636!45934525!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5095 invoked from network); 25 Oct 2011 17:27:16 -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;
	25 Oct 2011 17:27:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8578570"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 17:27: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; Tue, 25 Oct 2011 18:27:39 +0100
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
	1RIkmp-0007Tf-3I; Tue, 25 Oct 2011 17:27:39 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIkmp-0004uM-1G;
	Tue, 25 Oct 2011 18:27:39 +0100
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: <20134.61834.867057.36715@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 18:27:38 +0100
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH V2 02/11] libxl_json,
	Check the parser status before to call parse_complete
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1319133573-25891-3-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
	<1319133573-25891-3-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>,
	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 V2 02/11] libxl_json, Check the parse> -    status = yajl_parse_complete(yajl_ctx.hand);
> +    if (status == yajl_status_ok) {
> +        status = yajl_parse_complete(yajl_ctx.hand);
> +    }

Perhaps this would be better done with the "goto out" pattern ?

Ie:

    status = yajl_do_something();
    if (status != yajl_status_ok) goto out;

    status = ....

    ....

    return o;

  out:
    blah blah get_error blah blah
    return NULL;

That would make the logic clearer I think.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:51:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:51:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIl9X-0007HX-Kn; Tue, 25 Oct 2011 10:51:07 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIku3-0000rI-VV
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 10:35:09 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1319564104!727816!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31713 invoked from network); 25 Oct 2011 17:35:04 -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;
	25 Oct 2011 17:35:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8578662"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 17: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; Tue, 25 Oct 2011 18:35:03 +0100
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
	1RIktz-0007WE-8T	for xen-devel@lists.xensource.com;
	Tue, 25 Oct 2011 17:35:03 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIktz-0004wK-67	for
	xen-devel@lists.xensource.com; Tue, 25 Oct 2011 18:35:03 +0100
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: <20134.62279.50041.126603@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 18:35:03 +0100
To: xen-devel@lists.xensource.com
X-Mailer: VM 7.19 under Emacs 21.4.1
Subject: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.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

We would like some linked list macros which are (a) well known to be
sane and (b) typesafe.  BSD's queue.h meets these criteria.

The files in this changeset were obtained with:
  svn co -r 221843 svn://svn.freebsd.org/base/head/sys/sys/
  svn co -r 221843 svn://svn.freebsd.org/base/head/share/man/man3

We also provide some simple perlery to arrange to add the libxl_
namespace prefix to the macros.  This will allow us to #include our
modified queue.h in our public header file without clashing with
anyone else who is also using another version of queue.h.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>

---
 tools/libxl/Makefile                |    5 +-
 tools/libxl/bsd-queue.3             | 1044 +++++++++++++++++++++++++++++++++++
 tools/libxl/bsd-sys-queue-h-seddery |   67 +++
 tools/libxl/bsd-sys-queue.h         |  637 +++++++++++++++++++++
 4 files changed, 1752 insertions(+), 1 deletions(-)

diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index 51e5132..5d7e0f5 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -42,7 +42,7 @@ LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o
 
 $(LIBXL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) $(CFLAGS_libxenstore) $(CFLAGS_libblktapctl)
 
-AUTOINCS= libxlu_cfg_y.h libxlu_cfg_l.h
+AUTOINCS= libxlu_cfg_y.h libxlu_cfg_l.h _libxl_list.h
 AUTOSRCS= libxlu_cfg_y.c libxlu_cfg_l.c
 LIBXLU_OBJS = libxlu_cfg_y.o libxlu_cfg_l.o libxlu_cfg.o \
 	libxlu_disk_l.o libxlu_disk.o
@@ -81,6 +81,9 @@ _libxl_paths.h: genpath
 	rm -f $@.tmp
 	$(call move-if-changed,$@.2.tmp,$@)
 
+_libxl_list.h: bsd-sys-queue-h-seddery bsd-sys-queue.h
+	./$^ --prefix=libxl >$@.new && mv -f $@.new $@
+
 libxl_paths.c: _libxl_paths.h
 
 libxl.h: _libxl_types.h
diff --git a/tools/libxl/bsd-queue.3 b/tools/libxl/bsd-queue.3
new file mode 100644
index 0000000..007ca5c
--- /dev/null
+++ b/tools/libxl/bsd-queue.3
@@ -0,0 +1,1044 @@
+.\" Copyright (c) 1993
+.\"	The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"	This product includes software developed by the University of
+.\"	California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"	@(#)queue.3	8.2 (Berkeley) 1/24/94
+.\" $FreeBSD$
+.\"
+.Dd May 13, 2011
+.Dt QUEUE 3
+.Os
+.Sh NAME
+.Nm SLIST_EMPTY ,
+.Nm SLIST_ENTRY ,
+.Nm SLIST_FIRST ,
+.Nm SLIST_FOREACH ,
+.Nm SLIST_FOREACH_SAFE ,
+.Nm SLIST_HEAD ,
+.Nm SLIST_HEAD_INITIALIZER ,
+.Nm SLIST_INIT ,
+.Nm SLIST_INSERT_AFTER ,
+.Nm SLIST_INSERT_HEAD ,
+.Nm SLIST_NEXT ,
+.Nm SLIST_REMOVE_AFTER ,
+.Nm SLIST_REMOVE_HEAD ,
+.Nm SLIST_REMOVE ,
+.Nm SLIST_SWAP ,
+.Nm STAILQ_CONCAT ,
+.Nm STAILQ_EMPTY ,
+.Nm STAILQ_ENTRY ,
+.Nm STAILQ_FIRST ,
+.Nm STAILQ_FOREACH ,
+.Nm STAILQ_FOREACH_SAFE ,
+.Nm STAILQ_HEAD ,
+.Nm STAILQ_HEAD_INITIALIZER ,
+.Nm STAILQ_INIT ,
+.Nm STAILQ_INSERT_AFTER ,
+.Nm STAILQ_INSERT_HEAD ,
+.Nm STAILQ_INSERT_TAIL ,
+.Nm STAILQ_LAST ,
+.Nm STAILQ_NEXT ,
+.Nm STAILQ_REMOVE_AFTER ,
+.Nm STAILQ_REMOVE_HEAD ,
+.Nm STAILQ_REMOVE ,
+.Nm STAILQ_SWAP ,
+.Nm LIST_EMPTY ,
+.Nm LIST_ENTRY ,
+.Nm LIST_FIRST ,
+.Nm LIST_FOREACH ,
+.Nm LIST_FOREACH_SAFE ,
+.Nm LIST_HEAD ,
+.Nm LIST_HEAD_INITIALIZER ,
+.Nm LIST_INIT ,
+.Nm LIST_INSERT_AFTER ,
+.Nm LIST_INSERT_BEFORE ,
+.Nm LIST_INSERT_HEAD ,
+.Nm LIST_NEXT ,
+.Nm LIST_REMOVE ,
+.Nm LIST_SWAP ,
+.Nm TAILQ_CONCAT ,
+.Nm TAILQ_EMPTY ,
+.Nm TAILQ_ENTRY ,
+.Nm TAILQ_FIRST ,
+.Nm TAILQ_FOREACH ,
+.Nm TAILQ_FOREACH_SAFE ,
+.Nm TAILQ_FOREACH_REVERSE ,
+.Nm TAILQ_FOREACH_REVERSE_SAFE ,
+.Nm TAILQ_HEAD ,
+.Nm TAILQ_HEAD_INITIALIZER ,
+.Nm TAILQ_INIT ,
+.Nm TAILQ_INSERT_AFTER ,
+.Nm TAILQ_INSERT_BEFORE ,
+.Nm TAILQ_INSERT_HEAD ,
+.Nm TAILQ_INSERT_TAIL ,
+.Nm TAILQ_LAST ,
+.Nm TAILQ_NEXT ,
+.Nm TAILQ_PREV ,
+.Nm TAILQ_REMOVE ,
+.Nm TAILQ_SWAP
+.Nd implementations of singly-linked lists, singly-linked tail queues,
+lists and tail queues
+.Sh SYNOPSIS
+.In sys/queue.h
+.\"
+.Fn SLIST_EMPTY "SLIST_HEAD *head"
+.Fn SLIST_ENTRY "TYPE"
+.Fn SLIST_FIRST "SLIST_HEAD *head"
+.Fn SLIST_FOREACH "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME"
+.Fn SLIST_FOREACH_SAFE "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME" "TYPE *temp_var"
+.Fn SLIST_HEAD "HEADNAME" "TYPE"
+.Fn SLIST_HEAD_INITIALIZER "SLIST_HEAD head"
+.Fn SLIST_INIT "SLIST_HEAD *head"
+.Fn SLIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_INSERT_HEAD "SLIST_HEAD *head" "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_NEXT "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_REMOVE_AFTER "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_REMOVE_HEAD "SLIST_HEAD *head" "SLIST_ENTRY NAME"
+.Fn SLIST_REMOVE "SLIST_HEAD *head" "TYPE *elm" "TYPE" "SLIST_ENTRY NAME"
+.Fn SLIST_SWAP "SLIST_HEAD *head1" "SLIST_HEAD *head2" "SLIST_ENTRY NAME"
+.\"
+.Fn STAILQ_CONCAT "STAILQ_HEAD *head1" "STAILQ_HEAD *head2"
+.Fn STAILQ_EMPTY "STAILQ_HEAD *head"
+.Fn STAILQ_ENTRY "TYPE"
+.Fn STAILQ_FIRST "STAILQ_HEAD *head"
+.Fn STAILQ_FOREACH "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
+.Fn STAILQ_FOREACH_SAFE "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME" "TYPE *temp_var"
+.Fn STAILQ_HEAD "HEADNAME" "TYPE"
+.Fn STAILQ_HEAD_INITIALIZER "STAILQ_HEAD head"
+.Fn STAILQ_INIT "STAILQ_HEAD *head"
+.Fn STAILQ_INSERT_AFTER "STAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_INSERT_HEAD "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_INSERT_TAIL "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_LAST "STAILQ_HEAD *head" "TYPE" "STAILQ_ENTRY NAME"
+.Fn STAILQ_NEXT "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_REMOVE_AFTER "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_REMOVE_HEAD "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
+.Fn STAILQ_REMOVE "STAILQ_HEAD *head" "TYPE *elm" "TYPE" "STAILQ_ENTRY NAME"
+.Fn STAILQ_SWAP "STAILQ_HEAD *head1" "STAILQ_HEAD *head2" "STAILQ_ENTRY NAME"
+.\"
+.Fn LIST_EMPTY "LIST_HEAD *head"
+.Fn LIST_ENTRY "TYPE"
+.Fn LIST_FIRST "LIST_HEAD *head"
+.Fn LIST_FOREACH "TYPE *var" "LIST_HEAD *head" "LIST_ENTRY NAME"
+.Fn LIST_FOREACH_SAFE "TYPE *var" "LIST_HEAD *head" "LIST_ENTRY NAME" "TYPE *temp_var"
+.Fn LIST_HEAD "HEADNAME" "TYPE"
+.Fn LIST_HEAD_INITIALIZER "LIST_HEAD head"
+.Fn LIST_INIT "LIST_HEAD *head"
+.Fn LIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_INSERT_HEAD "LIST_HEAD *head" "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_NEXT "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_REMOVE "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_SWAP "LIST_HEAD *head1" "LIST_HEAD *head2" "TYPE" "LIST_ENTRY NAME"
+.\"
+.Fn TAILQ_CONCAT "TAILQ_HEAD *head1" "TAILQ_HEAD *head2" "TAILQ_ENTRY NAME"
+.Fn TAILQ_EMPTY "TAILQ_HEAD *head"
+.Fn TAILQ_ENTRY "TYPE"
+.Fn TAILQ_FIRST "TAILQ_HEAD *head"
+.Fn TAILQ_FOREACH "TYPE *var" "TAILQ_HEAD *head" "TAILQ_ENTRY NAME"
+.Fn TAILQ_FOREACH_SAFE "TYPE *var" "TAILQ_HEAD *head" "TAILQ_ENTRY NAME" "TYPE *temp_var"
+.Fn TAILQ_FOREACH_REVERSE "TYPE *var" "TAILQ_HEAD *head" "HEADNAME" "TAILQ_ENTRY NAME"
+.Fn TAILQ_FOREACH_REVERSE_SAFE "TYPE *var" "TAILQ_HEAD *head" "HEADNAME" "TAILQ_ENTRY NAME" "TYPE *temp_var"
+.Fn TAILQ_HEAD "HEADNAME" "TYPE"
+.Fn TAILQ_HEAD_INITIALIZER "TAILQ_HEAD head"
+.Fn TAILQ_INIT "TAILQ_HEAD *head"
+.Fn TAILQ_INSERT_AFTER "TAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_INSERT_HEAD "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_INSERT_TAIL "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_LAST "TAILQ_HEAD *head" "HEADNAME"
+.Fn TAILQ_NEXT "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_PREV "TYPE *elm" "HEADNAME" "TAILQ_ENTRY NAME"
+.Fn TAILQ_REMOVE "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_SWAP "TAILQ_HEAD *head1" "TAILQ_HEAD *head2" "TYPE" "TAILQ_ENTRY NAME"
+.\"
+.Sh DESCRIPTION
+These macros define and operate on four types of data structures:
+singly-linked lists, singly-linked tail queues, lists, and tail queues.
+All four structures support the following functionality:
+.Bl -enum -compact -offset indent
+.It
+Insertion of a new entry at the head of the list.
+.It
+Insertion of a new entry after any element in the list.
+.It
+O(1) removal of an entry from the head of the list.
+.It
+Forward traversal through the list.
+.It
+Swawpping the contents of two lists.
+.El
+.Pp
+Singly-linked lists are the simplest of the four data structures
+and support only the above functionality.
+Singly-linked lists are ideal for applications with large datasets
+and few or no removals,
+or for implementing a LIFO queue.
+Singly-linked lists add the following functionality:
+.Bl -enum -compact -offset indent
+.It
+O(n) removal of any entry in the list.
+.El
+.Pp
+Singly-linked tail queues add the following functionality:
+.Bl -enum -compact -offset indent
+.It
+Entries can be added at the end of a list.
+.It
+O(n) removal of any entry in the list.
+.It
+They may be concatenated.
+.El
+However:
+.Bl -enum -compact -offset indent
+.It
+All list insertions must specify the head of the list.
+.It
+Each head entry requires two pointers rather than one.
+.It
+Code size is about 15% greater and operations run about 20% slower
+than singly-linked lists.
+.El
+.Pp
+Singly-linked tailqs are ideal for applications with large datasets and
+few or no removals,
+or for implementing a FIFO queue.
+.Pp
+All doubly linked types of data structures (lists and tail queues)
+additionally allow:
+.Bl -enum -compact -offset indent
+.It
+Insertion of a new entry before any element in the list.
+.It
+O(1) removal of any entry in the list.
+.El
+However:
+.Bl -enum -compact -offset indent
+.It
+Each element requires two pointers rather than one.
+.It
+Code size and execution time of operations (except for removal) is about
+twice that of the singly-linked data-structures.
+.El
+.Pp
+Linked lists are the simplest of the doubly linked data structures and support
+only the above functionality over singly-linked lists.
+.Pp
+Tail queues add the following functionality:
+.Bl -enum -compact -offset indent
+.It
+Entries can be added at the end of a list.
+.It
+They may be traversed backwards, from tail to head.
+.It
+They may be concatenated.
+.El
+However:
+.Bl -enum -compact -offset indent
+.It
+All list insertions and removals must specify the head of the list.
+.It
+Each head entry requires two pointers rather than one.
+.It
+Code size is about 15% greater and operations run about 20% slower
+than singly-linked lists.
+.El
+.Pp
+In the macro definitions,
+.Fa TYPE
+is the name of a user defined structure,
+that must contain a field of type
+.Li SLIST_ENTRY ,
+.Li STAILQ_ENTRY ,
+.Li LIST_ENTRY ,
+or
+.Li TAILQ_ENTRY ,
+named
+.Fa NAME .
+The argument
+.Fa HEADNAME
+is the name of a user defined structure that must be declared
+using the macros
+.Li SLIST_HEAD ,
+.Li STAILQ_HEAD ,
+.Li LIST_HEAD ,
+or
+.Li TAILQ_HEAD .
+See the examples below for further explanation of how these
+macros are used.
+.Sh SINGLY-LINKED LISTS
+A singly-linked list is headed by a structure defined by the
+.Nm SLIST_HEAD
+macro.
+This structure contains a single pointer to the first element
+on the list.
+The elements are singly linked for minimum space and pointer manipulation
+overhead at the expense of O(n) removal for arbitrary elements.
+New elements can be added to the list after an existing element or
+at the head of the list.
+An
+.Fa SLIST_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+SLIST_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Fa HEADNAME
+is the name of the structure to be defined, and
+.Fa TYPE
+is the type of the elements to be linked into the list.
+A pointer to the head of the list can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm SLIST_HEAD_INITIALIZER
+evaluates to an initializer for the list
+.Fa head .
+.Pp
+The macro
+.Nm SLIST_EMPTY
+evaluates to true if there are no elements in the list.
+.Pp
+The macro
+.Nm SLIST_ENTRY
+declares a structure that connects the elements in
+the list.
+.Pp
+The macro
+.Nm SLIST_FIRST
+returns the first element in the list or NULL if the list is empty.
+.Pp
+The macro
+.Nm SLIST_FOREACH
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in
+turn to
+.Fa var .
+.Pp
+The macro
+.Nm SLIST_FOREACH_SAFE
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in
+turn to
+.Fa var .
+However, unlike
+.Fn SLIST_FOREACH
+here it is permitted to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm SLIST_INIT
+initializes the list referenced by
+.Fa head .
+.Pp
+The macro
+.Nm SLIST_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the list.
+.Pp
+The macro
+.Nm SLIST_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm SLIST_NEXT
+returns the next element in the list.
+.Pp
+The macro
+.Nm SLIST_REMOVE_AFTER
+removes the element after
+.Fa elm
+from the list. Unlike
+.Fa SLIST_REMOVE ,
+this macro does not traverse the entire list.
+.Pp
+The macro
+.Nm SLIST_REMOVE_HEAD
+removes the element
+.Fa elm
+from the head of the list.
+For optimum efficiency,
+elements being removed from the head of the list should explicitly use
+this macro instead of the generic
+.Fa SLIST_REMOVE
+macro.
+.Pp
+The macro
+.Nm SLIST_REMOVE
+removes the element
+.Fa elm
+from the list.
+.Pp
+The macro
+.Nm SLIST_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh SINGLY-LINKED LIST EXAMPLE
+.Bd -literal
+SLIST_HEAD(slisthead, entry) head =
+    SLIST_HEAD_INITIALIZER(head);
+struct slisthead *headp;		/* Singly-linked List head. */
+struct entry {
+	...
+	SLIST_ENTRY(entry) entries;	/* Singly-linked List. */
+	...
+} *n1, *n2, *n3, *np;
+
+SLIST_INIT(&head);			/* Initialize the list. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+SLIST_INSERT_HEAD(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+SLIST_INSERT_AFTER(n1, n2, entries);
+
+SLIST_REMOVE(&head, n2, entry, entries);/* Deletion. */
+free(n2);
+
+n3 = SLIST_FIRST(&head);
+SLIST_REMOVE_HEAD(&head, entries);	/* Deletion from the head. */
+free(n3);
+					/* Forward traversal. */
+SLIST_FOREACH(np, &head, entries)
+	np-> ...
+					/* Safe forward traversal. */
+SLIST_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	SLIST_REMOVE(&head, np, entry, entries);
+	free(np);
+}
+
+while (!SLIST_EMPTY(&head)) {		/* List Deletion. */
+	n1 = SLIST_FIRST(&head);
+	SLIST_REMOVE_HEAD(&head, entries);
+	free(n1);
+}
+.Ed
+.Sh SINGLY-LINKED TAIL QUEUES
+A singly-linked tail queue is headed by a structure defined by the
+.Nm STAILQ_HEAD
+macro.
+This structure contains a pair of pointers,
+one to the first element in the tail queue and the other to
+the last element in the tail queue.
+The elements are singly linked for minimum space and pointer
+manipulation overhead at the expense of O(n) removal for arbitrary
+elements.
+New elements can be added to the tail queue after an existing element,
+at the head of the tail queue, or at the end of the tail queue.
+A
+.Fa STAILQ_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+STAILQ_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Li HEADNAME
+is the name of the structure to be defined, and
+.Li TYPE
+is the type of the elements to be linked into the tail queue.
+A pointer to the head of the tail queue can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm STAILQ_HEAD_INITIALIZER
+evaluates to an initializer for the tail queue
+.Fa head .
+.Pp
+The macro
+.Nm STAILQ_CONCAT
+concatenates the tail queue headed by
+.Fa head2
+onto the end of the one headed by
+.Fa head1
+removing all entries from the former.
+.Pp
+The macro
+.Nm STAILQ_EMPTY
+evaluates to true if there are no items on the tail queue.
+.Pp
+The macro
+.Nm STAILQ_ENTRY
+declares a structure that connects the elements in
+the tail queue.
+.Pp
+The macro
+.Nm STAILQ_FIRST
+returns the first item on the tail queue or NULL if the tail queue
+is empty.
+.Pp
+The macro
+.Nm STAILQ_FOREACH
+traverses the tail queue referenced by
+.Fa head
+in the forward direction, assigning each element
+in turn to
+.Fa var .
+.Pp
+The macro
+.Nm STAILQ_FOREACH_SAFE
+traverses the tail queue referenced by
+.Fa head
+in the forward direction, assigning each element
+in turn to
+.Fa var .
+However, unlike
+.Fn STAILQ_FOREACH
+here it is permitted to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm STAILQ_INIT
+initializes the tail queue referenced by
+.Fa head .
+.Pp
+The macro
+.Nm STAILQ_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the tail queue.
+.Pp
+The macro
+.Nm STAILQ_INSERT_TAIL
+inserts the new element
+.Fa elm
+at the end of the tail queue.
+.Pp
+The macro
+.Nm STAILQ_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm STAILQ_LAST
+returns the last item on the tail queue.
+If the tail queue is empty the return value is
+.Dv NULL .
+.Pp
+The macro
+.Nm STAILQ_NEXT
+returns the next item on the tail queue, or NULL this item is the last.
+.Pp
+The macro
+.Nm STAILQ_REMOVE_AFTER
+removes the element after
+.Fa elm
+from the tail queue. Unlike
+.Fa STAILQ_REMOVE ,
+this macro does not traverse the entire tail queue.
+.Pp
+The macro
+.Nm STAILQ_REMOVE_HEAD
+removes the element at the head of the tail queue.
+For optimum efficiency,
+elements being removed from the head of the tail queue should
+use this macro explicitly rather than the generic
+.Fa STAILQ_REMOVE
+macro.
+.Pp
+The macro
+.Nm STAILQ_REMOVE
+removes the element
+.Fa elm
+from the tail queue.
+.Pp
+The macro
+.Nm STAILQ_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh SINGLY-LINKED TAIL QUEUE EXAMPLE
+.Bd -literal
+STAILQ_HEAD(stailhead, entry) head =
+    STAILQ_HEAD_INITIALIZER(head);
+struct stailhead *headp;		/* Singly-linked tail queue head. */
+struct entry {
+	...
+	STAILQ_ENTRY(entry) entries;	/* Tail queue. */
+	...
+} *n1, *n2, *n3, *np;
+
+STAILQ_INIT(&head);			/* Initialize the queue. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+STAILQ_INSERT_HEAD(&head, n1, entries);
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the tail. */
+STAILQ_INSERT_TAIL(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+STAILQ_INSERT_AFTER(&head, n1, n2, entries);
+					/* Deletion. */
+STAILQ_REMOVE(&head, n2, entry, entries);
+free(n2);
+					/* Deletion from the head. */
+n3 = STAILQ_FIRST(&head);
+STAILQ_REMOVE_HEAD(&head, entries);
+free(n3);
+					/* Forward traversal. */
+STAILQ_FOREACH(np, &head, entries)
+	np-> ...
+					/* Safe forward traversal. */
+STAILQ_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	STAILQ_REMOVE(&head, np, entry, entries);
+	free(np);
+}
+					/* TailQ Deletion. */
+while (!STAILQ_EMPTY(&head)) {
+	n1 = STAILQ_FIRST(&head);
+	STAILQ_REMOVE_HEAD(&head, entries);
+	free(n1);
+}
+					/* Faster TailQ Deletion. */
+n1 = STAILQ_FIRST(&head);
+while (n1 != NULL) {
+	n2 = STAILQ_NEXT(n1, entries);
+	free(n1);
+	n1 = n2;
+}
+STAILQ_INIT(&head);
+.Ed
+.Sh LISTS
+A list is headed by a structure defined by the
+.Nm LIST_HEAD
+macro.
+This structure contains a single pointer to the first element
+on the list.
+The elements are doubly linked so that an arbitrary element can be
+removed without traversing the list.
+New elements can be added to the list after an existing element,
+before an existing element, or at the head of the list.
+A
+.Fa LIST_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+LIST_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Fa HEADNAME
+is the name of the structure to be defined, and
+.Fa TYPE
+is the type of the elements to be linked into the list.
+A pointer to the head of the list can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm LIST_HEAD_INITIALIZER
+evaluates to an initializer for the list
+.Fa head .
+.Pp
+The macro
+.Nm LIST_EMPTY
+evaluates to true if there are no elements in the list.
+.Pp
+The macro
+.Nm LIST_ENTRY
+declares a structure that connects the elements in
+the list.
+.Pp
+The macro
+.Nm LIST_FIRST
+returns the first element in the list or NULL if the list
+is empty.
+.Pp
+The macro
+.Nm LIST_FOREACH
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in turn to
+.Fa var .
+.Pp
+The macro
+.Nm LIST_FOREACH_SAFE
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in turn to
+.Fa var .
+However, unlike
+.Fn LIST_FOREACH
+here it is permitted to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm LIST_INIT
+initializes the list referenced by
+.Fa head .
+.Pp
+The macro
+.Nm LIST_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the list.
+.Pp
+The macro
+.Nm LIST_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm LIST_INSERT_BEFORE
+inserts the new element
+.Fa elm
+before the element
+.Fa listelm .
+.Pp
+The macro
+.Nm LIST_NEXT
+returns the next element in the list, or NULL if this is the last.
+.Pp
+The macro
+.Nm LIST_REMOVE
+removes the element
+.Fa elm
+from the list.
+.Pp
+The macro
+.Nm LIST_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh LIST EXAMPLE
+.Bd -literal
+LIST_HEAD(listhead, entry) head =
+    LIST_HEAD_INITIALIZER(head);
+struct listhead *headp;			/* List head. */
+struct entry {
+	...
+	LIST_ENTRY(entry) entries;	/* List. */
+	...
+} *n1, *n2, *n3, *np, *np_temp;
+
+LIST_INIT(&head);			/* Initialize the list. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+LIST_INSERT_HEAD(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+LIST_INSERT_AFTER(n1, n2, entries);
+
+n3 = malloc(sizeof(struct entry));	/* Insert before. */
+LIST_INSERT_BEFORE(n2, n3, entries);
+
+LIST_REMOVE(n2, entries);		/* Deletion. */
+free(n2);
+					/* Forward traversal. */
+LIST_FOREACH(np, &head, entries)
+	np-> ...
+
+					/* Safe forward traversal. */
+LIST_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	LIST_REMOVE(np, entries);
+	free(np);
+}
+
+while (!LIST_EMPTY(&head)) {		/* List Deletion. */
+	n1 = LIST_FIRST(&head);
+	LIST_REMOVE(n1, entries);
+	free(n1);
+}
+
+n1 = LIST_FIRST(&head);			/* Faster List Deletion. */
+while (n1 != NULL) {
+	n2 = LIST_NEXT(n1, entries);
+	free(n1);
+	n1 = n2;
+}
+LIST_INIT(&head);
+.Ed
+.Sh TAIL QUEUES
+A tail queue is headed by a structure defined by the
+.Nm TAILQ_HEAD
+macro.
+This structure contains a pair of pointers,
+one to the first element in the tail queue and the other to
+the last element in the tail queue.
+The elements are doubly linked so that an arbitrary element can be
+removed without traversing the tail queue.
+New elements can be added to the tail queue after an existing element,
+before an existing element, at the head of the tail queue,
+or at the end of the tail queue.
+A
+.Fa TAILQ_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+TAILQ_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Li HEADNAME
+is the name of the structure to be defined, and
+.Li TYPE
+is the type of the elements to be linked into the tail queue.
+A pointer to the head of the tail queue can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm TAILQ_HEAD_INITIALIZER
+evaluates to an initializer for the tail queue
+.Fa head .
+.Pp
+The macro
+.Nm TAILQ_CONCAT
+concatenates the tail queue headed by
+.Fa head2
+onto the end of the one headed by
+.Fa head1
+removing all entries from the former.
+.Pp
+The macro
+.Nm TAILQ_EMPTY
+evaluates to true if there are no items on the tail queue.
+.Pp
+The macro
+.Nm TAILQ_ENTRY
+declares a structure that connects the elements in
+the tail queue.
+.Pp
+The macro
+.Nm TAILQ_FIRST
+returns the first item on the tail queue or NULL if the tail queue
+is empty.
+.Pp
+The macro
+.Nm TAILQ_FOREACH
+traverses the tail queue referenced by
+.Fa head
+in the forward direction, assigning each element in turn to
+.Fa var .
+.Fa var
+is set to
+.Dv NULL
+if the loop completes normally, or if there were no elements.
+.Pp
+The macro
+.Nm TAILQ_FOREACH_REVERSE
+traverses the tail queue referenced by
+.Fa head
+in the reverse direction, assigning each element in turn to
+.Fa var .
+.Pp
+The macros
+.Nm TAILQ_FOREACH_SAFE
+and
+.Nm TAILQ_FOREACH_REVERSE_SAFE
+traverse the list referenced by
+.Fa head
+in the forward or reverse direction respectively,
+assigning each element in turn to
+.Fa var .
+However, unlike their unsafe counterparts,
+.Nm TAILQ_FOREACH
+and
+.Nm TAILQ_FOREACH_REVERSE
+permit to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm TAILQ_INIT
+initializes the tail queue referenced by
+.Fa head .
+.Pp
+The macro
+.Nm TAILQ_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the tail queue.
+.Pp
+The macro
+.Nm TAILQ_INSERT_TAIL
+inserts the new element
+.Fa elm
+at the end of the tail queue.
+.Pp
+The macro
+.Nm TAILQ_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm TAILQ_INSERT_BEFORE
+inserts the new element
+.Fa elm
+before the element
+.Fa listelm .
+.Pp
+The macro
+.Nm TAILQ_LAST
+returns the last item on the tail queue.
+If the tail queue is empty the return value is
+.Dv NULL .
+.Pp
+The macro
+.Nm TAILQ_NEXT
+returns the next item on the tail queue, or NULL if this item is the last.
+.Pp
+The macro
+.Nm TAILQ_PREV
+returns the previous item on the tail queue, or NULL if this item
+is the first.
+.Pp
+The macro
+.Nm TAILQ_REMOVE
+removes the element
+.Fa elm
+from the tail queue.
+.Pp
+The macro
+.Nm TAILQ_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh TAIL QUEUE EXAMPLE
+.Bd -literal
+TAILQ_HEAD(tailhead, entry) head =
+    TAILQ_HEAD_INITIALIZER(head);
+struct tailhead *headp;			/* Tail queue head. */
+struct entry {
+	...
+	TAILQ_ENTRY(entry) entries;	/* Tail queue. */
+	...
+} *n1, *n2, *n3, *np;
+
+TAILQ_INIT(&head);			/* Initialize the queue. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+TAILQ_INSERT_HEAD(&head, n1, entries);
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the tail. */
+TAILQ_INSERT_TAIL(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+TAILQ_INSERT_AFTER(&head, n1, n2, entries);
+
+n3 = malloc(sizeof(struct entry));	/* Insert before. */
+TAILQ_INSERT_BEFORE(n2, n3, entries);
+
+TAILQ_REMOVE(&head, n2, entries);	/* Deletion. */
+free(n2);
+					/* Forward traversal. */
+TAILQ_FOREACH(np, &head, entries)
+	np-> ...
+					/* Safe forward traversal. */
+TAILQ_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	TAILQ_REMOVE(&head, np, entries);
+	free(np);
+}
+					/* Reverse traversal. */
+TAILQ_FOREACH_REVERSE(np, &head, tailhead, entries)
+	np-> ...
+					/* TailQ Deletion. */
+while (!TAILQ_EMPTY(&head)) {
+	n1 = TAILQ_FIRST(&head);
+	TAILQ_REMOVE(&head, n1, entries);
+	free(n1);
+}
+					/* Faster TailQ Deletion. */
+n1 = TAILQ_FIRST(&head);
+while (n1 != NULL) {
+	n2 = TAILQ_NEXT(n1, entries);
+	free(n1);
+	n1 = n2;
+}
+TAILQ_INIT(&head);
+.Ed
+.Sh SEE ALSO
+.Xr tree 3
+.Sh HISTORY
+The
+.Nm queue
+functions first appeared in
+.Bx 4.4 .
diff --git a/tools/libxl/bsd-sys-queue-h-seddery b/tools/libxl/bsd-sys-queue-h-seddery
new file mode 100755
index 0000000..0bab8e0
--- /dev/null
+++ b/tools/libxl/bsd-sys-queue-h-seddery
@@ -0,0 +1,67 @@
+#!/usr/bin/perl -p
+#
+# This script is part of the Xen build system.  It has a very
+# permissive licence to avoid complicating the licence of the
+# generated header file and to allow this seddery to be reused by
+# other projects.
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this individual 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.
+#
+# Copyright (C) 2011 Citrix Ltd
+
+our $namespace, $ucnamespace;
+
+BEGIN {
+    die unless @ARGV;
+    $namespace = pop @ARGV;
+    $namespace =~ s/^--prefix=// or die;
+    $ucnamespace = uc $namespace;
+
+    print <<END or die $!;
+/*
+ * DO NOT EDIT THIS FILE
+ *
+ * Generated automatically by bsd-sys-queue-h-seddery to
+ *  - introduce ${ucnamespace}_ and ${namespace}_ namespace prefixes
+ *  - turn "struct type" into "type" so that type arguments
+ *     to the macros are type names not struct tags
+ *
+ * The purpose of this seddery is to allow the resulting file to be
+ * freely included by software which might also want to include other
+ * list macros, and to be used when struct tags are not being used or
+ * not known.
+ */
+END
+}
+
+s/\b( _SYS_QUEUE |
+      SLIST | LIST | STAILQ | TAILQ | QUEUE
+      )/${ucnamespace}_$1/xg;
+
+s/\b( TRACEBUF | TRASHIT |
+      QMD_
+      )/${ucnamespace}__$1/xg;
+
+s/\b(
+      qm_
+      )/${namespace}__$1/xg;
+
+s/\b struct \s+ type \b/type/xg;
diff --git a/tools/libxl/bsd-sys-queue.h b/tools/libxl/bsd-sys-queue.h
new file mode 100644
index 0000000..274e636
--- /dev/null
+++ b/tools/libxl/bsd-sys-queue.h
@@ -0,0 +1,637 @@
+/*-
+ * Copyright (c) 1991, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)queue.h	8.5 (Berkeley) 8/20/94
+ * $FreeBSD$
+ */
+
+#ifndef _SYS_QUEUE_H_
+#define	_SYS_QUEUE_H_
+
+#include <sys/cdefs.h>
+
+/*
+ * This file defines four types of data structures: singly-linked lists,
+ * singly-linked tail queues, lists and tail queues.
+ *
+ * A singly-linked list is headed by a single forward pointer. The elements
+ * are singly linked for minimum space and pointer manipulation overhead at
+ * the expense of O(n) removal for arbitrary elements. New elements can be
+ * added to the list after an existing element or at the head of the list.
+ * Elements being removed from the head of the list should use the explicit
+ * macro for this purpose for optimum efficiency. A singly-linked list may
+ * only be traversed in the forward direction.  Singly-linked lists are ideal
+ * for applications with large datasets and few or no removals or for
+ * implementing a LIFO queue.
+ *
+ * A singly-linked tail queue is headed by a pair of pointers, one to the
+ * head of the list and the other to the tail of the list. The elements are
+ * singly linked for minimum space and pointer manipulation overhead at the
+ * expense of O(n) removal for arbitrary elements. New elements can be added
+ * to the list after an existing element, at the head of the list, or at the
+ * end of the list. Elements being removed from the head of the tail queue
+ * should use the explicit macro for this purpose for optimum efficiency.
+ * A singly-linked tail queue may only be traversed in the forward direction.
+ * Singly-linked tail queues are ideal for applications with large datasets
+ * and few or no removals or for implementing a FIFO queue.
+ *
+ * A list is headed by a single forward pointer (or an array of forward
+ * pointers for a hash table header). The elements are doubly linked
+ * so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before
+ * or after an existing element or at the head of the list. A list
+ * may only be traversed in the forward direction.
+ *
+ * A tail queue is headed by a pair of pointers, one to the head of the
+ * list and the other to the tail of the list. The elements are doubly
+ * linked so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before or
+ * after an existing element, at the head of the list, or at the end of
+ * the list. A tail queue may be traversed in either direction.
+ *
+ * For details on the use of these macros, see the queue(3) manual page.
+ *
+ *
+ *				SLIST	LIST	STAILQ	TAILQ
+ * _HEAD			+	+	+	+
+ * _HEAD_INITIALIZER		+	+	+	+
+ * _ENTRY			+	+	+	+
+ * _INIT			+	+	+	+
+ * _EMPTY			+	+	+	+
+ * _FIRST			+	+	+	+
+ * _NEXT			+	+	+	+
+ * _PREV			-	-	-	+
+ * _LAST			-	-	+	+
+ * _FOREACH			+	+	+	+
+ * _FOREACH_SAFE		+	+	+	+
+ * _FOREACH_REVERSE		-	-	-	+
+ * _FOREACH_REVERSE_SAFE	-	-	-	+
+ * _INSERT_HEAD			+	+	+	+
+ * _INSERT_BEFORE		-	+	-	+
+ * _INSERT_AFTER		+	+	+	+
+ * _INSERT_TAIL			-	-	+	+
+ * _CONCAT			-	-	+	+
+ * _REMOVE_AFTER		+	-	+	-
+ * _REMOVE_HEAD			+	-	+	-
+ * _REMOVE			+	+	+	+
+ * _SWAP			+	+	+	+
+ *
+ */
+#ifdef QUEUE_MACRO_DEBUG
+/* Store the last 2 places the queue element or head was altered */
+struct qm_trace {
+	char * lastfile;
+	int lastline;
+	char * prevfile;
+	int prevline;
+};
+
+#define	TRACEBUF	struct qm_trace trace;
+#define	TRASHIT(x)	do {(x) = (void *)-1;} while (0)
+#define	QMD_SAVELINK(name, link)	void **name = (void *)&(link)
+
+#define	QMD_TRACE_HEAD(head) do {					\
+	(head)->trace.prevline = (head)->trace.lastline;		\
+	(head)->trace.prevfile = (head)->trace.lastfile;		\
+	(head)->trace.lastline = __LINE__;				\
+	(head)->trace.lastfile = __FILE__;				\
+} while (0)
+
+#define	QMD_TRACE_ELEM(elem) do {					\
+	(elem)->trace.prevline = (elem)->trace.lastline;		\
+	(elem)->trace.prevfile = (elem)->trace.lastfile;		\
+	(elem)->trace.lastline = __LINE__;				\
+	(elem)->trace.lastfile = __FILE__;				\
+} while (0)
+
+#else
+#define	QMD_TRACE_ELEM(elem)
+#define	QMD_TRACE_HEAD(head)
+#define	QMD_SAVELINK(name, link)
+#define	TRACEBUF
+#define	TRASHIT(x)
+#endif	/* QUEUE_MACRO_DEBUG */
+
+/*
+ * Singly-linked List declarations.
+ */
+#define	SLIST_HEAD(name, type)						\
+struct name {								\
+	struct type *slh_first;	/* first element */			\
+}
+
+#define	SLIST_HEAD_INITIALIZER(head)					\
+	{ NULL }
+
+#define	SLIST_ENTRY(type)						\
+struct {								\
+	struct type *sle_next;	/* next element */			\
+}
+
+/*
+ * Singly-linked List functions.
+ */
+#define	SLIST_EMPTY(head)	((head)->slh_first == NULL)
+
+#define	SLIST_FIRST(head)	((head)->slh_first)
+
+#define	SLIST_FOREACH(var, head, field)					\
+	for ((var) = SLIST_FIRST((head));				\
+	    (var);							\
+	    (var) = SLIST_NEXT((var), field))
+
+#define	SLIST_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = SLIST_FIRST((head));				\
+	    (var) && ((tvar) = SLIST_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	SLIST_FOREACH_PREVPTR(var, varp, head, field)			\
+	for ((varp) = &SLIST_FIRST((head));				\
+	    ((var) = *(varp)) != NULL;					\
+	    (varp) = &SLIST_NEXT((var), field))
+
+#define	SLIST_INIT(head) do {						\
+	SLIST_FIRST((head)) = NULL;					\
+} while (0)
+
+#define	SLIST_INSERT_AFTER(slistelm, elm, field) do {			\
+	SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field);	\
+	SLIST_NEXT((slistelm), field) = (elm);				\
+} while (0)
+
+#define	SLIST_INSERT_HEAD(head, elm, field) do {			\
+	SLIST_NEXT((elm), field) = SLIST_FIRST((head));			\
+	SLIST_FIRST((head)) = (elm);					\
+} while (0)
+
+#define	SLIST_NEXT(elm, field)	((elm)->field.sle_next)
+
+#define	SLIST_REMOVE(head, elm, type, field) do {			\
+	QMD_SAVELINK(oldnext, (elm)->field.sle_next);			\
+	if (SLIST_FIRST((head)) == (elm)) {				\
+		SLIST_REMOVE_HEAD((head), field);			\
+	}								\
+	else {								\
+		struct type *curelm = SLIST_FIRST((head));		\
+		while (SLIST_NEXT(curelm, field) != (elm))		\
+			curelm = SLIST_NEXT(curelm, field);		\
+		SLIST_REMOVE_AFTER(curelm, field);			\
+	}								\
+	TRASHIT(*oldnext);						\
+} while (0)
+
+#define SLIST_REMOVE_AFTER(elm, field) do {				\
+	SLIST_NEXT(elm, field) =					\
+	    SLIST_NEXT(SLIST_NEXT(elm, field), field);			\
+} while (0)
+
+#define	SLIST_REMOVE_HEAD(head, field) do {				\
+	SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field);	\
+} while (0)
+
+#define SLIST_SWAP(head1, head2, type) do {				\
+	struct type *swap_first = SLIST_FIRST(head1);			\
+	SLIST_FIRST(head1) = SLIST_FIRST(head2);			\
+	SLIST_FIRST(head2) = swap_first;				\
+} while (0)
+
+/*
+ * Singly-linked Tail queue declarations.
+ */
+#define	STAILQ_HEAD(name, type)						\
+struct name {								\
+	struct type *stqh_first;/* first element */			\
+	struct type **stqh_last;/* addr of last next element */		\
+}
+
+#define	STAILQ_HEAD_INITIALIZER(head)					\
+	{ NULL, &(head).stqh_first }
+
+#define	STAILQ_ENTRY(type)						\
+struct {								\
+	struct type *stqe_next;	/* next element */			\
+}
+
+/*
+ * Singly-linked Tail queue functions.
+ */
+#define	STAILQ_CONCAT(head1, head2) do {				\
+	if (!STAILQ_EMPTY((head2))) {					\
+		*(head1)->stqh_last = (head2)->stqh_first;		\
+		(head1)->stqh_last = (head2)->stqh_last;		\
+		STAILQ_INIT((head2));					\
+	}								\
+} while (0)
+
+#define	STAILQ_EMPTY(head)	((head)->stqh_first == NULL)
+
+#define	STAILQ_FIRST(head)	((head)->stqh_first)
+
+#define	STAILQ_FOREACH(var, head, field)				\
+	for((var) = STAILQ_FIRST((head));				\
+	   (var);							\
+	   (var) = STAILQ_NEXT((var), field))
+
+
+#define	STAILQ_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = STAILQ_FIRST((head));				\
+	    (var) && ((tvar) = STAILQ_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	STAILQ_INIT(head) do {						\
+	STAILQ_FIRST((head)) = NULL;					\
+	(head)->stqh_last = &STAILQ_FIRST((head));			\
+} while (0)
+
+#define	STAILQ_INSERT_AFTER(head, tqelm, elm, field) do {		\
+	if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
+		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
+	STAILQ_NEXT((tqelm), field) = (elm);				\
+} while (0)
+
+#define	STAILQ_INSERT_HEAD(head, elm, field) do {			\
+	if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL)	\
+		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
+	STAILQ_FIRST((head)) = (elm);					\
+} while (0)
+
+#define	STAILQ_INSERT_TAIL(head, elm, field) do {			\
+	STAILQ_NEXT((elm), field) = NULL;				\
+	*(head)->stqh_last = (elm);					\
+	(head)->stqh_last = &STAILQ_NEXT((elm), field);			\
+} while (0)
+
+#define	STAILQ_LAST(head, type, field)					\
+	(STAILQ_EMPTY((head)) ?						\
+		NULL :							\
+	        ((struct type *)(void *)				\
+		((char *)((head)->stqh_last) - __offsetof(struct type, field))))
+
+#define	STAILQ_NEXT(elm, field)	((elm)->field.stqe_next)
+
+#define	STAILQ_REMOVE(head, elm, type, field) do {			\
+	QMD_SAVELINK(oldnext, (elm)->field.stqe_next);			\
+	if (STAILQ_FIRST((head)) == (elm)) {				\
+		STAILQ_REMOVE_HEAD((head), field);			\
+	}								\
+	else {								\
+		struct type *curelm = STAILQ_FIRST((head));		\
+		while (STAILQ_NEXT(curelm, field) != (elm))		\
+			curelm = STAILQ_NEXT(curelm, field);		\
+		STAILQ_REMOVE_AFTER(head, curelm, field);		\
+	}								\
+	TRASHIT(*oldnext);						\
+} while (0)
+
+#define STAILQ_REMOVE_AFTER(head, elm, field) do {			\
+	if ((STAILQ_NEXT(elm, field) =					\
+	     STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL)	\
+		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
+} while (0)
+
+#define	STAILQ_REMOVE_HEAD(head, field) do {				\
+	if ((STAILQ_FIRST((head)) =					\
+	     STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL)		\
+		(head)->stqh_last = &STAILQ_FIRST((head));		\
+} while (0)
+
+#define STAILQ_SWAP(head1, head2, type) do {				\
+	struct type *swap_first = STAILQ_FIRST(head1);			\
+	struct type **swap_last = (head1)->stqh_last;			\
+	STAILQ_FIRST(head1) = STAILQ_FIRST(head2);			\
+	(head1)->stqh_last = (head2)->stqh_last;			\
+	STAILQ_FIRST(head2) = swap_first;				\
+	(head2)->stqh_last = swap_last;					\
+	if (STAILQ_EMPTY(head1))					\
+		(head1)->stqh_last = &STAILQ_FIRST(head1);		\
+	if (STAILQ_EMPTY(head2))					\
+		(head2)->stqh_last = &STAILQ_FIRST(head2);		\
+} while (0)
+
+
+/*
+ * List declarations.
+ */
+#define	LIST_HEAD(name, type)						\
+struct name {								\
+	struct type *lh_first;	/* first element */			\
+}
+
+#define	LIST_HEAD_INITIALIZER(head)					\
+	{ NULL }
+
+#define	LIST_ENTRY(type)						\
+struct {								\
+	struct type *le_next;	/* next element */			\
+	struct type **le_prev;	/* address of previous next element */	\
+}
+
+/*
+ * List functions.
+ */
+
+#if (defined(_KERNEL) && defined(INVARIANTS))
+#define	QMD_LIST_CHECK_HEAD(head, field) do {				\
+	if (LIST_FIRST((head)) != NULL &&				\
+	    LIST_FIRST((head))->field.le_prev !=			\
+	     &LIST_FIRST((head)))					\
+		panic("Bad list head %p first->prev != head", (head));	\
+} while (0)
+
+#define	QMD_LIST_CHECK_NEXT(elm, field) do {				\
+	if (LIST_NEXT((elm), field) != NULL &&				\
+	    LIST_NEXT((elm), field)->field.le_prev !=			\
+	     &((elm)->field.le_next))					\
+	     	panic("Bad link elm %p next->prev != elm", (elm));	\
+} while (0)
+
+#define	QMD_LIST_CHECK_PREV(elm, field) do {				\
+	if (*(elm)->field.le_prev != (elm))				\
+		panic("Bad link elm %p prev->next != elm", (elm));	\
+} while (0)
+#else
+#define	QMD_LIST_CHECK_HEAD(head, field)
+#define	QMD_LIST_CHECK_NEXT(elm, field)
+#define	QMD_LIST_CHECK_PREV(elm, field)
+#endif /* (_KERNEL && INVARIANTS) */
+
+#define	LIST_EMPTY(head)	((head)->lh_first == NULL)
+
+#define	LIST_FIRST(head)	((head)->lh_first)
+
+#define	LIST_FOREACH(var, head, field)					\
+	for ((var) = LIST_FIRST((head));				\
+	    (var);							\
+	    (var) = LIST_NEXT((var), field))
+
+#define	LIST_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = LIST_FIRST((head));				\
+	    (var) && ((tvar) = LIST_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	LIST_INIT(head) do {						\
+	LIST_FIRST((head)) = NULL;					\
+} while (0)
+
+#define	LIST_INSERT_AFTER(listelm, elm, field) do {			\
+	QMD_LIST_CHECK_NEXT(listelm, field);				\
+	if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\
+		LIST_NEXT((listelm), field)->field.le_prev =		\
+		    &LIST_NEXT((elm), field);				\
+	LIST_NEXT((listelm), field) = (elm);				\
+	(elm)->field.le_prev = &LIST_NEXT((listelm), field);		\
+} while (0)
+
+#define	LIST_INSERT_BEFORE(listelm, elm, field) do {			\
+	QMD_LIST_CHECK_PREV(listelm, field);				\
+	(elm)->field.le_prev = (listelm)->field.le_prev;		\
+	LIST_NEXT((elm), field) = (listelm);				\
+	*(listelm)->field.le_prev = (elm);				\
+	(listelm)->field.le_prev = &LIST_NEXT((elm), field);		\
+} while (0)
+
+#define	LIST_INSERT_HEAD(head, elm, field) do {				\
+	QMD_LIST_CHECK_HEAD((head), field);				\
+	if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL)	\
+		LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\
+	LIST_FIRST((head)) = (elm);					\
+	(elm)->field.le_prev = &LIST_FIRST((head));			\
+} while (0)
+
+#define	LIST_NEXT(elm, field)	((elm)->field.le_next)
+
+#define	LIST_REMOVE(elm, field) do {					\
+	QMD_SAVELINK(oldnext, (elm)->field.le_next);			\
+	QMD_SAVELINK(oldprev, (elm)->field.le_prev);			\
+	QMD_LIST_CHECK_NEXT(elm, field);				\
+	QMD_LIST_CHECK_PREV(elm, field);				\
+	if (LIST_NEXT((elm), field) != NULL)				\
+		LIST_NEXT((elm), field)->field.le_prev = 		\
+		    (elm)->field.le_prev;				\
+	*(elm)->field.le_prev = LIST_NEXT((elm), field);		\
+	TRASHIT(*oldnext);						\
+	TRASHIT(*oldprev);						\
+} while (0)
+
+#define LIST_SWAP(head1, head2, type, field) do {			\
+	struct type *swap_tmp = LIST_FIRST((head1));			\
+	LIST_FIRST((head1)) = LIST_FIRST((head2));			\
+	LIST_FIRST((head2)) = swap_tmp;					\
+	if ((swap_tmp = LIST_FIRST((head1))) != NULL)			\
+		swap_tmp->field.le_prev = &LIST_FIRST((head1));		\
+	if ((swap_tmp = LIST_FIRST((head2))) != NULL)			\
+		swap_tmp->field.le_prev = &LIST_FIRST((head2));		\
+} while (0)
+
+/*
+ * Tail queue declarations.
+ */
+#define	TAILQ_HEAD(name, type)						\
+struct name {								\
+	struct type *tqh_first;	/* first element */			\
+	struct type **tqh_last;	/* addr of last next element */		\
+	TRACEBUF							\
+}
+
+#define	TAILQ_HEAD_INITIALIZER(head)					\
+	{ NULL, &(head).tqh_first }
+
+#define	TAILQ_ENTRY(type)						\
+struct {								\
+	struct type *tqe_next;	/* next element */			\
+	struct type **tqe_prev;	/* address of previous next element */	\
+	TRACEBUF							\
+}
+
+/*
+ * Tail queue functions.
+ */
+#if (defined(_KERNEL) && defined(INVARIANTS))
+#define	QMD_TAILQ_CHECK_HEAD(head, field) do {				\
+	if (!TAILQ_EMPTY(head) &&					\
+	    TAILQ_FIRST((head))->field.tqe_prev !=			\
+	     &TAILQ_FIRST((head)))					\
+		panic("Bad tailq head %p first->prev != head", (head));	\
+} while (0)
+
+#define	QMD_TAILQ_CHECK_TAIL(head, field) do {				\
+	if (*(head)->tqh_last != NULL)					\
+	    	panic("Bad tailq NEXT(%p->tqh_last) != NULL", (head)); 	\
+} while (0)
+
+#define	QMD_TAILQ_CHECK_NEXT(elm, field) do {				\
+	if (TAILQ_NEXT((elm), field) != NULL &&				\
+	    TAILQ_NEXT((elm), field)->field.tqe_prev !=			\
+	     &((elm)->field.tqe_next))					\
+		panic("Bad link elm %p next->prev != elm", (elm));	\
+} while (0)
+
+#define	QMD_TAILQ_CHECK_PREV(elm, field) do {				\
+	if (*(elm)->field.tqe_prev != (elm))				\
+		panic("Bad link elm %p prev->next != elm", (elm));	\
+} while (0)
+#else
+#define	QMD_TAILQ_CHECK_HEAD(head, field)
+#define	QMD_TAILQ_CHECK_TAIL(head, headname)
+#define	QMD_TAILQ_CHECK_NEXT(elm, field)
+#define	QMD_TAILQ_CHECK_PREV(elm, field)
+#endif /* (_KERNEL && INVARIANTS) */
+
+#define	TAILQ_CONCAT(head1, head2, field) do {				\
+	if (!TAILQ_EMPTY(head2)) {					\
+		*(head1)->tqh_last = (head2)->tqh_first;		\
+		(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last;	\
+		(head1)->tqh_last = (head2)->tqh_last;			\
+		TAILQ_INIT((head2));					\
+		QMD_TRACE_HEAD(head1);					\
+		QMD_TRACE_HEAD(head2);					\
+	}								\
+} while (0)
+
+#define	TAILQ_EMPTY(head)	((head)->tqh_first == NULL)
+
+#define	TAILQ_FIRST(head)	((head)->tqh_first)
+
+#define	TAILQ_FOREACH(var, head, field)					\
+	for ((var) = TAILQ_FIRST((head));				\
+	    (var);							\
+	    (var) = TAILQ_NEXT((var), field))
+
+#define	TAILQ_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = TAILQ_FIRST((head));				\
+	    (var) && ((tvar) = TAILQ_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	TAILQ_FOREACH_REVERSE(var, head, headname, field)		\
+	for ((var) = TAILQ_LAST((head), headname);			\
+	    (var);							\
+	    (var) = TAILQ_PREV((var), headname, field))
+
+#define	TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar)	\
+	for ((var) = TAILQ_LAST((head), headname);			\
+	    (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1);	\
+	    (var) = (tvar))
+
+#define	TAILQ_INIT(head) do {						\
+	TAILQ_FIRST((head)) = NULL;					\
+	(head)->tqh_last = &TAILQ_FIRST((head));			\
+	QMD_TRACE_HEAD(head);						\
+} while (0)
+
+#define	TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
+	QMD_TAILQ_CHECK_NEXT(listelm, field);				\
+	if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\
+		TAILQ_NEXT((elm), field)->field.tqe_prev = 		\
+		    &TAILQ_NEXT((elm), field);				\
+	else {								\
+		(head)->tqh_last = &TAILQ_NEXT((elm), field);		\
+		QMD_TRACE_HEAD(head);					\
+	}								\
+	TAILQ_NEXT((listelm), field) = (elm);				\
+	(elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field);		\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+	QMD_TRACE_ELEM(&listelm->field);				\
+} while (0)
+
+#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\
+	QMD_TAILQ_CHECK_PREV(listelm, field);				\
+	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\
+	TAILQ_NEXT((elm), field) = (listelm);				\
+	*(listelm)->field.tqe_prev = (elm);				\
+	(listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field);		\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+	QMD_TRACE_ELEM(&listelm->field);				\
+} while (0)
+
+#define	TAILQ_INSERT_HEAD(head, elm, field) do {			\
+	QMD_TAILQ_CHECK_HEAD(head, field);				\
+	if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL)	\
+		TAILQ_FIRST((head))->field.tqe_prev =			\
+		    &TAILQ_NEXT((elm), field);				\
+	else								\
+		(head)->tqh_last = &TAILQ_NEXT((elm), field);		\
+	TAILQ_FIRST((head)) = (elm);					\
+	(elm)->field.tqe_prev = &TAILQ_FIRST((head));			\
+	QMD_TRACE_HEAD(head);						\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+} while (0)
+
+#define	TAILQ_INSERT_TAIL(head, elm, field) do {			\
+	QMD_TAILQ_CHECK_TAIL(head, field);				\
+	TAILQ_NEXT((elm), field) = NULL;				\
+	(elm)->field.tqe_prev = (head)->tqh_last;			\
+	*(head)->tqh_last = (elm);					\
+	(head)->tqh_last = &TAILQ_NEXT((elm), field);			\
+	QMD_TRACE_HEAD(head);						\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+} while (0)
+
+#define	TAILQ_LAST(head, headname)					\
+	(*(((struct headname *)((head)->tqh_last))->tqh_last))
+
+#define	TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
+
+#define	TAILQ_PREV(elm, headname, field)				\
+	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
+
+#define	TAILQ_REMOVE(head, elm, field) do {				\
+	QMD_SAVELINK(oldnext, (elm)->field.tqe_next);			\
+	QMD_SAVELINK(oldprev, (elm)->field.tqe_prev);			\
+	QMD_TAILQ_CHECK_NEXT(elm, field);				\
+	QMD_TAILQ_CHECK_PREV(elm, field);				\
+	if ((TAILQ_NEXT((elm), field)) != NULL)				\
+		TAILQ_NEXT((elm), field)->field.tqe_prev = 		\
+		    (elm)->field.tqe_prev;				\
+	else {								\
+		(head)->tqh_last = (elm)->field.tqe_prev;		\
+		QMD_TRACE_HEAD(head);					\
+	}								\
+	*(elm)->field.tqe_prev = TAILQ_NEXT((elm), field);		\
+	TRASHIT(*oldnext);						\
+	TRASHIT(*oldprev);						\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+} while (0)
+
+#define TAILQ_SWAP(head1, head2, type, field) do {			\
+	struct type *swap_first = (head1)->tqh_first;			\
+	struct type **swap_last = (head1)->tqh_last;			\
+	(head1)->tqh_first = (head2)->tqh_first;			\
+	(head1)->tqh_last = (head2)->tqh_last;				\
+	(head2)->tqh_first = swap_first;				\
+	(head2)->tqh_last = swap_last;					\
+	if ((swap_first = (head1)->tqh_first) != NULL)			\
+		swap_first->field.tqe_prev = &(head1)->tqh_first;	\
+	else								\
+		(head1)->tqh_last = &(head1)->tqh_first;		\
+	if ((swap_first = (head2)->tqh_first) != NULL)			\
+		swap_first->field.tqe_prev = &(head2)->tqh_first;	\
+	else								\
+		(head2)->tqh_last = &(head2)->tqh_first;		\
+} while (0)
+
+#endif /* !_SYS_QUEUE_H_ */
-- 
tg: (92a50a8..) t/xen/bsd-queue (depends on: t/xen/gitignore)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:52:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:52:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlB7-0007l8-QB; Tue, 25 Oct 2011 10:52:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIkvp-0001bA-RH
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 10:36:58 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1319564194!48126585!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25918 invoked from network); 25 Oct 2011 17:36:34 -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;
	25 Oct 2011 17:36:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8578688"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 17:36: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, 25 Oct 2011 18:36:54 +0100
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
	1RIkvm-0007Ww-Gt; Tue, 25 Oct 2011 17:36:54 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIkvm-0004wa-FA;
	Tue, 25 Oct 2011 18:36:54 +0100
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: <20134.62390.416089.969397@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 18:36:54 +0100
To: Anthony PERARD <anthony.perard@citrix.com>
Subject: Re: [Xen-devel] [PATCH V2 08/11] libxl_qmp,
	Introduce qmp_request_handle.
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <1319133573-25891-9-git-send-email-anthony.perard@citrix.com>
References: <1319133573-25891-1-git-send-email-anthony.perard@citrix.com>
	<1319133573-25891-9-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>,
	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 V2 08/11] libxl_qmp, Introduce qmp_request_handle."):
> This structure helps keep the return code of the callback, so a
> caller can read it.

This is heading in a plausible direction but:

 * You need to state which of the members of the struct are for use by
   which parts of libxl, and when any shared members are written etc.

 * "handle" is the wrong word for this.  "handle" would refer to a
   pointer or perhaps descriptor.  This is a context/info structure.

 * The "free_it" parameter to qmp_send seems odd.  Surely it should
   just be the case that the same person that allocated the context
   should free it ?

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:55:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:55:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlDs-0000P6-ON; Tue, 25 Oct 2011 10:55:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIkzl-00035y-TG
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 10:41:02 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319564433!50559913!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3717 invoked from network); 25 Oct 2011 17:40:33 -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;
	25 Oct 2011 17:40:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8578725"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 17:40: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; Tue, 25 Oct 2011 18:40:58 +0100
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
	1RIkzi-0007YE-J8; Tue, 25 Oct 2011 17:40:58 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIkzi-0004ww-IB;
	Tue, 25 Oct 2011 18:40:58 +0100
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: <20134.62630.115259.632324@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 18:40:54 +0100
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 10 of 15] xenpaging: compare both token and
	path when checking for @releaseDomain event
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <0b7d7a2bd6673f358faf.1319189504@probook.site>
References: <patchbomb.1319189494@probook.site>
	<0b7d7a2bd6673f358faf.1319189504@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 10 of 15] xenpaging: compare both token and path when checking for @releaseDomain event"):
> xenpaging: compare both token and path when checking for @releaseDomain event
> 
> Subsequent patches will use xenstored to store the numbers of pages
> xenpaging is suppose to page-out. A domain_id value could be
> misinterpreted as number of pages. Compare both path and token to
> recognize the @releaseDomain event.

I'm not sure I understand.  What are you currently using as the
token ?  The token as well as the path should be sufficient to be able
to tell what the event is, so this patch makes me suspicious ...

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 10:59:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 10:59:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlHA-0001da-KN; Tue, 25 Oct 2011 10:59:00 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIl7S-0006jp-6W
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 10:48:59 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1319564934!733126!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10741 invoked from network); 25 Oct 2011 17:48: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;
	25 Oct 2011 17:48:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8578846"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 17:48: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; Tue, 25 Oct 2011 18:48:28 +0100
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
	1RIl6x-0007as-TA; Tue, 25 Oct 2011 17:48:27 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIl6x-0004xX-SM;
	Tue, 25 Oct 2011 18:48:27 +0100
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: <20134.63083.866388.787271@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 18:48:27 +0100
To: zhao bao <baozhao@gmail.com>
Subject: Re: [Xen-devel] question about relationship between
	/var/lib/xenstored/tdb and xenstore_domain_interface
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <CAF6vk8HRruTKgZvW2vqviA960zUYh75sHm9SGG0c+sQc2qqExg@mail.gmail.com>
References: <CAF6vk8HRruTKgZvW2vqviA960zUYh75sHm9SGG0c+sQc2qqExg@mail.gmail.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

zhao bao writes ("[Xen-devel] question about relationship between /var/lib/xenstored/tdb and xenstore_domain_interface"):
>   Hi, when I read following link,
> http://wiki.xen.org/xenwiki/XenIntro
> , then I browsed some Xen 3.1 code. A question puzzles me.
> As we know "The physical xenstore resides in one file:
> /var/lib/xenstored/tdb. " , but drives(frontend/backend) visit
> Xenstore by Xenbus. The data structure manipulated by Xenbus is
> xenstore_domain_interface, not tdb. while tdb file is visited by
> Xenstored daemon.

Please see
  docs/misc/xenstore.txt
  xen/include/public/io/xs_wire.h
  tools/xenstore/
in the Xen source tree.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:04:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:04:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlMm-00027k-LZ; Tue, 25 Oct 2011 11:04:48 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlCE-00087d-Lz
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 10:53:54 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319565199!54267874!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6803 invoked from network); 25 Oct 2011 17:53:19 -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;
	25 Oct 2011 17:53:19 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8578928"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 17: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; Tue, 25 Oct 2011 18:53:51 +0100
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
	1RIlCB-0007cn-Cm; Tue, 25 Oct 2011 17:53:51 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIlCB-0004xv-B1;
	Tue, 25 Oct 2011 18:53:51 +0100
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: <20134.63407.291964.492321@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 18:53:51 +0100
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 17 of 24] libxl: add
	libxl__spawn_confirm_offspring_startup
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <20111025172159.GA11571@aepfle.de>
References: <patchbomb.1317657277@probook.site>
	<018f63b6e4863faca16a.1317657294@probook.site>
	<20134.54883.620815.989672@mariner.uk.xensource.com>
	<20111025172159.GA11571@aepfle.de>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
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

Olaf Hering writes ("Re: [Xen-devel] [PATCH 17 of 24] libxl: add libxl__spawn_confirm_offspring_startup"):
> On Tue, Oct 25, Ian Jackson wrote:
> > Olaf Hering writes ("[Xen-devel] [PATCH 17 of 24] libxl: add libxl__spawn_confirm_offspring_startup"):
> > > libxl: add libxl__spawn_confirm_offspring_startup
> > > 
> > > libxl__spawn_confirm_offspring_startup() is a generic version of
> > > libxl__confirm_device_model_startup().
> > 
> > Thanks but I think it would be better to refactor this to avoid the
> > duplication of this code.
> 
> The new function is used in patch #18 of this series.
> Or do you have some other changes in mind?

I mean that you should arrange to replace
libxl__confirm_device_model_startup with your new function
libxl__spawn_confirm_offspring_startup.

As it is you have made a copy of libxl__confirm_device_model_startup
and lightly edited it.  This is a cardinal sin in programming, known
as "clone and hack".

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:07:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:07:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlPi-0002XD-Ij; Tue, 25 Oct 2011 11:07:50 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIlDc-0000Eq-Cr
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 10:55:20 -0700
X-Env-Sender: caker@theshore.net
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319565316!30611416!1
X-Originating-IP: [67.18.92.50]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31809 invoked from network); 25 Oct 2011 17:55:16 -0000
Received: from ns.theshore.net (HELO www.theshore.net) (67.18.92.50)
	by server-9.tower-174.messagelabs.com with SMTP;
	25 Oct 2011 17:55:16 -0000
Received: from beefcake.linlan
	(173-161-199-49-Philadelphia.hfc.comcastbusiness.net
	[173.161.199.49])
	by www.theshore.net (8.13.6/8.9.1) with ESMTP id p9PHtFDc018870;
	Tue, 25 Oct 2011 13:55:15 -0400
Message-ID: <4EA6F802.4010902@theshore.net>
Date: Tue, 25 Oct 2011 13:55:14 -0400
From: "Christopher S. Aker" <caker@theshore.net>
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US;
	rv:1.9.2.23) Gecko/20110920 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: xen devel <xen-devel@lists.xensource.com>
Subject: Re: [Xen-devel] Is: [PATCH] x86/paravirt: PTE updates
	in	k(un)map_atomic need to be synchronous,
	regardless of lazy_mmu mode. Was:	Re: [PATCH] x86/paravirt:
	Partially revert "remove lazy mode in	interrupts"
References: <1317042797-19975-1-git-send-email-konrad.wilk@oracle.com>	<4E80A6BD.3070703@goop.org>	<20110926193453.GA9717@phenom.oracle.com>	<4E859312.40309@canonical.com>
	<20111003170401.GD4420@phenom.oracle.com>
In-Reply-To: <20111003170401.GD4420@phenom.oracle.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: 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 patch fixes an outstanding issue that has been reported since
> 2.6.37. Under a heavy loaded machine processing "fork()" calls could
> keepover with:

I noticed this patch is not in Linux 3.1 -- was this fixed some other 
way, or is it still in mainline's pipeline somewhere?

Thanks,
-Chris


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:09:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:09:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlRR-0002vk-H5; Tue, 25 Oct 2011 11:09:37 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlH4-0001cd-EY
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 10:58:55 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1319565531!725939!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19547 invoked from network); 25 Oct 2011 17:58:51 -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;
	25 Oct 2011 17:58:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8578992"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 17:58: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; Tue, 25 Oct 2011 18:58:41 +0100
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
	1RIlGr-0007eL-2R; Tue, 25 Oct 2011 17:58:41 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIlGr-0004yR-1b;
	Tue, 25 Oct 2011 18:58:41 +0100
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: <20134.63697.38240.276236@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 18:58:41 +0100
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <20134.62279.50041.126603@mariner.uk.xensource.com>
References: <20134.62279.50041.126603@mariner.uk.xensource.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: Anthony PERARD <anthony.perard@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 Jackson writes ("[Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h"):
> We would like some linked list macros which are (a) well known to be
> sane and (b) typesafe.  BSD's queue.h meets these criteria.
> 
> The files in this changeset were obtained with:
>   svn co -r 221843 svn://svn.freebsd.org/base/head/sys/sys/
>   svn co -r 221843 svn://svn.freebsd.org/base/head/share/man/man3

I posted this because I noticed (too late) that libxl_qmp.c includes
<sys/queue.h> and uses some macros that are only available in some
queue.h versions.  This is not ideal for portability of course.

I think it would be good to include this massaged queue.h and use it
in libxl_qmp.c.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:11:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:11:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlTC-0003KN-QG; Tue, 25 Oct 2011 11:11:26 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlJ1-0001my-Cp
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:00:56 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-8.tower-21.messagelabs.com!1319565652!1654188!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23982 invoked from network); 25 Oct 2011 18:00:52 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-8.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 25 Oct 2011 18:00:52 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RIlIv-0001ru-GJ; Tue, 25 Oct 2011 18:00:49 +0000
Date: Tue, 25 Oct 2011 19:00:49 +0100
From: Tim Deegan <tim@xen.org>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
Message-ID: <20111025180049.GB421@ocelot.phlegethon.org>
References: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@mail.gmail.com>
	<1318947065.3385.26.camel@zakaz.uk.xensource.com>
	<CAFLBxZYiM9_yT1+5nQx=5vTUbE6xLXi0cCLPDLVdhUhmDO5-NA@mail.gmail.com>
	<20134.57267.925456.677251@mariner.uk.xensource.com>
	<1319560291.3385.257.camel@zakaz.uk.xensource.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <1319560291.3385.257.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.4.2.1i
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	"Keir \(Xen.org\)" <keir@xen.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Jonathan Ludlam <Jonathan.Ludlam@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 17:31 +0100 on 25 Oct (1319563891), Ian Campbell wrote:
> AIUI when you link an ocaml library it actually bakes in the literal
> options which you gave into the result, in order that it can use them
> again when you subsequently link an application against that library.
> i.e. if you link with -lfoo then a literal "-lfoo" is stored in the
> library and reused by the ocaml linker when it invokes gcc to link the
> final application
> 
> Likewise if you use e.g.
> "/home/ianc/devel/xen/tools/ocaml/libs/xc/../../../libxc/libxenctrl.so"
> then that will also be baked verbatim into the ocaml library.

That would be pretty unfriendly of it.  Could the problem be solved by
just making sure the in-tree library paths are before any system ones?
Actually, it seems like the original problem could be solved that way,
so I must be missing some wrinkle of it. 

> I don't see how this can ever be made to work without changing the ocaml
> linker, you very much need to specify libraries differently when linking
> users which are in tree vs. out of tree and short of teaching ocaml
> about that distinction I don't know what we can do.

sed? :)

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:14:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:14:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlVj-0003jH-TQ; Tue, 25 Oct 2011 11:14:03 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlKx-0001sm-9g
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:02:56 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-8.tower-174.messagelabs.com!1319565772!22968785!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4649 invoked from network); 25 Oct 2011 18:02:52 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-8.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 25 Oct 2011 18:02:52 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319565771; l=1201;
	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=FtXaiqefzTCSTTgmZwBmiITqyGg=;
	b=QGN8A5eB7TTzV/XQ8uBVvJZHNw1jMA3Bnxn7CV5PLn+7dNixu/dDUVK1LFGI1eZUFoS
	PN+yr1EGuZ0zhHXcfYezvmsRbcVrDimr//bnJuAkqhoNqd1Vvl7Slx7unTI/gVmiNpV+L
	jJFKduMa0BElQaaqklU4vUsNHj7VihFDZQ0=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjMQG3Q7
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-100-089.pools.arcor-ip.net [88.65.100.89])
	by smtp.strato.de (fruni mo24) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id v02f63n9PG5DON ;
	Tue, 25 Oct 2011 20:02:40 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 7E5EE18637; Tue, 25 Oct 2011 20:02:39 +0200 (CEST)
Date: Tue, 25 Oct 2011 20:02:39 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 10 of 15] xenpaging: compare both token and
	path when checking for @releaseDomain event
Message-ID: <20111025180239.GA14805@aepfle.de>
References: <patchbomb.1319189494@probook.site>
	<0b7d7a2bd6673f358faf.1319189504@probook.site>
	<20134.62630.115259.632324@mariner.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <20134.62630.115259.632324@mariner.uk.xensource.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, Oct 25, Ian Jackson wrote:

> Olaf Hering writes ("[Xen-devel] [PATCH 10 of 15] xenpaging: compare both token and path when checking for @releaseDomain event"):
> > xenpaging: compare both token and path when checking for @releaseDomain event
> > 
> > Subsequent patches will use xenstored to store the numbers of pages
> > xenpaging is suppose to page-out. A domain_id value could be
> > misinterpreted as number of pages. Compare both path and token to
> > recognize the @releaseDomain event.
> 
> I'm not sure I understand.  What are you currently using as the
> token ?  The token as well as the path should be sufficient to be able
> to tell what the event is, so this patch makes me suspicious ...

I was under the impression there could be identical tokens for different
paths, and that the actual value of the watched path is part of
XS_WATCH_TOKEN.  So this patch tries to make the detection of the
@releaseDomain event more robust.

But since the token seems to be unique (docs/misc/xenstore.txt has no
further description of 'token'), only the DPRINTF part of my patch
should be kept.

Please drop this change, I will add the DPRINTF in a separate patch.

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:15:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:15:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlXV-00048C-AO; Tue, 25 Oct 2011 11:15:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlOu-0002NG-IF
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:07:01 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1319566017!1038096!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7039 invoked from network); 25 Oct 2011 18:06:57 -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;
	25 Oct 2011 18:06:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8579111"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 18:06: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, 25 Oct 2011 19:06:56 +0100
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
	1RIlOq-0007hT-3A; Tue, 25 Oct 2011 18:06:56 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIlOp-0008F0-W9;
	Tue, 25 Oct 2011 19:06:56 +0100
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: <20134.64191.820416.210778@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 19:06:55 +0100
To: Kasper Brink <K.Brink@cs.ru.nl>
Subject: Re: [Xen-devel] pv-grub Solaris support
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <20111012204011.GA7518@lilo2.science.ru.nl>
References: <20111012204011.GA7518@lilo2.science.ru.nl>
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

Kasper Brink writes ("[Xen-devel] pv-grub Solaris support"):
> I've patched pv-grub to allow it to boot a Solaris PV domU using an
> unmodified menu.lst. The attached patch has been tested with various
> Solaris versions (Solaris 11 Express, OpenIndiana 151a, OpenSolaris 134,
> Nexenta Core 3.0.1; all 64-bit). I appreciate your feedback.

I tried this and:

ar: /u/iwj/work/xen-unstable-tools.hg/stubdom/grub-x86_32/stage2/fsys_zfs.o: No such file or directory
make[2]: *** [/u/iwj/work/xen-unstable-tools.hg/stubdom/grub-x86_32/main.a] Error 1
make[2]: Leaving directory `/u/iwj/work/xen-unstable-tools.hg/stubdom/grub'

That's the result of
  hg clean --all && cp ../.config  .
 [ in my qemu tree ] git-clean  -x -d -f
  (make -j4 && echo ok.) 2>&1 | tee ../log

My .config contains:
 CONFIG_QEMU=/u/iwj/work/1/qemu-iwj.git
 QEMU_UPSTREAM_URL=/u/iwj/work/1/qemu-upstream-unstable.git

NB I have ccache and my downloads are coming from a local squid (I
have http_proxy set) so it may be a race of some kind.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:23:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:23:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIleS-0005QR-4p; Tue, 25 Oct 2011 11:23:04 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlV2-0003ai-GT
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:13:22 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1319566397!1530465!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27398 invoked from network); 25 Oct 2011 18:13:17 -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;
	25 Oct 2011 18:13:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,404,1315180800"; 
   d="scan'208";a="8579196"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 18:13: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, 25 Oct 2011 19:13:16 +0100
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
	1RIlUy-0007jY-98; Tue, 25 Oct 2011 18:13:16 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIlUy-0008Fk-8H;
	Tue, 25 Oct 2011 19:13:16 +0100
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: <20134.64572.244922.337381@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 19:13:16 +0100
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 10 of 15] xenpaging: compare both token and
	path when checking for @releaseDomain event
In-Reply-To: <20111025180239.GA14805@aepfle.de>
References: <patchbomb.1319189494@probook.site>
	<0b7d7a2bd6673f358faf.1319189504@probook.site>
	<20134.62630.115259.632324@mariner.uk.xensource.com>
	<20111025180239.GA14805@aepfle.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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 ("Re: [Xen-devel] [PATCH 10 of 15] xenpaging: compare both token and path when checking for @releaseDomain event"):
> I was under the impression there could be identical tokens for different
> paths,

Yes, but you control the token.  The token you get back in your watch
event is whatever you gave to xs_watch.

> and that the actual value of the watched path is part of
> XS_WATCH_TOKEN.

"XS_WATCH_TOKEN" is just an array index into the return value of
xs_read_watch.  It has the value 1 which means that
  ret = xs_read_watch(...)
returns the token in ret[1].  The path comes back in ret[0].

(The use of "xs_watch_type" as the name for this enum is unfortunate.)

> But since the token seems to be unique (docs/misc/xenstore.txt has no
> further description of 'token'), only the DPRINTF part of my patch
> should be kept.

The token is whatever you specified when you set up the watch.  I
haven't checked in xenpagingd what that value is in this case.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:26:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:26:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlhV-0005tU-Ke; Tue, 25 Oct 2011 11:26:13 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlbc-0004wk-Le
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:20:09 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319566803!1651874!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1727 invoked from network); 25 Oct 2011 18:20:05 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 25 Oct 2011 18:20:05 -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
	p9PIK25Q026153
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 18:20: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
	p9PIK1XK025656
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 18:20:01 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
	p9PIJugM012622; Tue, 25 Oct 2011 13:19:56 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 11:19:55 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 0CF7A82BFA; Tue, 25 Oct 2011 14:19:55 -0400 (EDT)
Date: Tue, 25 Oct 2011 14:19:54 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Christopher S. Aker" <caker@theshore.net>
Subject: Re: [Xen-devel] Is: [PATCH] x86/paravirt: PTE updates in
	k(un)map_atomic need to be synchronous,	regardless of lazy_mmu mode.
	Was:	Re: [PATCH] x86/paravirt: Partially revert "remove lazy mode in
	interrupts"
Message-ID: <20111025181954.GC2566@phenom.dumpdata.com>
References: <1317042797-19975-1-git-send-email-konrad.wilk@oracle.com>
	<4E80A6BD.3070703@goop.org>
	<20110926193453.GA9717@phenom.oracle.com>
	<4E859312.40309@canonical.com>
	<20111003170401.GD4420@phenom.oracle.com>
	<4EA6F802.4010902@theshore.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA6F802.4010902@theshore.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.0A090208.4EA6FDD3.0088,ss=1,re=0.000,fgs=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 Tue, Oct 25, 2011 at 01:55:14PM -0400, Christopher S. Aker wrote:
> >This patch fixes an outstanding issue that has been reported since
> >2.6.37. Under a heavy loaded machine processing "fork()" calls could
> >keepover with:
> 
> I noticed this patch is not in Linux 3.1 -- was this fixed some
> other way, or is it still in mainline's pipeline somewhere?

Hmm, it was in Andrew's tree, but you are right  - I am not seeing it in 3.1.
Let me double check Andrew's tree.

> 
> Thanks,
> -Chris

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:28:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11: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 1RIljM-0006Hg-DX; Tue, 25 Oct 2011 11:28:08 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIleW-0005RN-1j
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:23:08 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319566973!52486979!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13893 invoked from network); 25 Oct 2011 18:22:53 -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;
	25 Oct 2011 18:22:53 -0000
X-IronPort-AV: E=Sophos;i="4.69,405,1315180800"; 
   d="scan'208";a="8579314"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 18:23: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; Tue, 25 Oct 2011 19:23:04 +0100
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
	1RIleS-0007nj-Mx; Tue, 25 Oct 2011 18:23:04 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RIleS-0008HS-M8;
	Tue, 25 Oct 2011 19:23:04 +0100
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: <20134.65157.761465.838991@mariner.uk.xensource.com>
Date: Tue, 25 Oct 2011 19:23:01 +0100
To: M A Young <m.a.young@durham.ac.uk>
Subject: Re: [Xen-devel] [PATCH 1 of 6] pygrub should check all GPT partitions
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <alpine.DEB.2.00.1110200002250.15667@vega-a.dur.ac.uk>
References: <alpine.DEB.2.00.1110200002250.15667@vega-a.dur.ac.uk>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
Cc: 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

M A Young writes ("[Xen-devel] [PATCH 1 of 6] pygrub should check all GPT partitions"):
> On Fedora 16 the first GPT partition is a boot partition for grub2 with
> the grub2 configuration in the second partition.
> Check all GPT partitions for grub configuration, not just the first.

Thanks.  I have applied all six of these.  I also removed this
obsolete comment:

>      # assume the first partition is an EFI system partition.

and fixed up the commit messages a bit.

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 Oct 25 11:30:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:30:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIllN-0006gw-GT; Tue, 25 Oct 2011 11:30:14 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlhZ-0005u5-TT
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:26:18 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1319567173!732365!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11003 invoked from network); 25 Oct 2011 18:26:14 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-4.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 25 Oct 2011 18:26:14 -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
	p9PIQBrj011858
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 18:26: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
	p9PIQB2w023878
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 18:26:11 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
	p9PIQ511029990; Tue, 25 Oct 2011 13:26:05 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 11:26:05 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id D249282BFC; Tue, 25 Oct 2011 14:26:04 -0400 (EDT)
Date: Tue, 25 Oct 2011 14:26:04 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Christopher S. Aker" <caker@theshore.net>
Subject: Re: [Xen-devel] Is: [PATCH] x86/paravirt: PTE updates in
	k(un)map_atomic need to be synchronous, regardless of lazy_mmu mode.
	Was:	Re: [PATCH] x86/paravirt: Partially revert "remove lazy mode in
	interrupts"
Message-ID: <20111025182604.GD2566@phenom.dumpdata.com>
References: <1317042797-19975-1-git-send-email-konrad.wilk@oracle.com>
	<4E80A6BD.3070703@goop.org>
	<20110926193453.GA9717@phenom.oracle.com>
	<4E859312.40309@canonical.com>
	<20111003170401.GD4420@phenom.oracle.com>
	<4EA6F802.4010902@theshore.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA6F802.4010902@theshore.net>
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.4EA6FF44.0109:SCFMA922111,ss=1,re=-4.000,fgs=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 Tue, Oct 25, 2011 at 01:55:14PM -0400, Christopher S. Aker wrote:
> >This patch fixes an outstanding issue that has been reported since
> >2.6.37. Under a heavy loaded machine processing "fork()" calls could
> >keepover with:
> 
> I noticed this patch is not in Linux 3.1 -- was this fixed some
> other way, or is it still in mainline's pipeline somewhere?

Well, looks like it got dropped out of Andrew's tree. Not sure why, but
let me make sure it gets the proper attention. Thanks for spotting it!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:32:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:32:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlnC-00074q-HZ; Tue, 25 Oct 2011 11:32:06 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlhe-0005uf-BM
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:26:24 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1319567178!1043088!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4112 invoked from network); 25 Oct 2011 18:26:18 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-8.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 18:26:18 -0000
Received: by wyi11 with SMTP id 11so1079665wyi.30
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 11:26:18 -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=ViSyoGGHQf+6oIG+E8TqdVxJLUoEtCfAi2Q64yQf61M=;
	b=vGzzBF6UQd/zHC4ulFe1dZUznMQUROW51WDtglPIP9ntYxQfZ+VpHeBiUkY2ScKaLu
	JZDCvoZc/0PzfkeA0qvBmYF/QGL7AA0RrDCvoMX9EtdR83wqrqBt9KZ9Uo7MxnsdL7yF
	udgheLDjd/febXVySEEBugF0vFyJD0x5+izxY=
Received: by 10.216.80.71 with SMTP id j49mr5280896wee.23.1319567178275;
	Tue, 25 Oct 2011 11:26:18 -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 fo7sm46538509wbb.20.2011.10.25.11.26.16
	(version=SSLv3 cipher=OTHER); Tue, 25 Oct 2011 11:26:17 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Tue, 25 Oct 2011 19:26:14 +0100
Subject: Re: [Xen-devel] xen 3.4-testing build error
From: Keir Fraser <keir.xen@gmail.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>,
	AP <apxeng@gmail.com>
Message-ID: <CACCBDD6.239BB%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] xen 3.4-testing build error
Thread-Index: AcyTQ5PhAX2lVJtxgES4XbjIW3ccFg==
In-Reply-To: <20134.59473.545775.75504@mariner.uk.xensource.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>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Keith Coleman <list.keith@scaltro.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/2011 17:48, "Ian Jackson" <Ian.Jackson@eu.citrix.com> wrote:

> AP writes ("Re: [Xen-devel] xen 3.4-testing build error"):
>> I am primarily using 4.1 but I still have a couple of servers running
>> 3.4, so I want to ensure that I can still build that using Ubuntu
>> 11.10.
> 
> Thanks for doing this research and reporting back.
> 
>> On Wed, Oct 19, 2011 at 1:47 AM, Ian Campbell <Ian.Campbell@citrix.com>
>> wrote:
>>> Recent Ubuntu enabled --as-needed in the linker by default. If you want
>>> to stick with 3.4 you might need to add --no-as-needed somewhere
>>> appropriate, 22856:18807b89083d is the temporary fix which we used for
>>> 4.1. This issue is fixed properly in 4.2.
>> 
>> Thank you! 22856 did the trick. BTW, I also had to pull in a few more
>> fixes to get everything to work. I am listing them here in case
>> someone else runs in to the same issue. The only outstanding problem
>> is that bringing up a DomU with SDL leaves you with a flickering SDL
>> window. Using VNC is a workaround for that.
>> 
>> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/2e78e0ce1f31
>> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/e6b5b2cb8146
>> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/9c2fdcff3704
> 
> I have CC'd Keith Coleman, maintainer of the 3.4 tree.  Keith, do you
> think these might be appropriate for backporting ?  (I haven't checked
> myself ...)

These are all straightforward bug fixes. The first of them could skip the
whitespace-modifying sub-patch.

 -- Keir

> Ian.
> 
>> diff -r 0e3b875fd5fb -r 3a1e98c88825 tools/blktap/lib/blktaplib.h
>> --- a/tools/blktap/lib/blktaplib.h      Fri Sep 30 18:42:30 2011 -0400
>> +++ b/tools/blktap/lib/blktaplib.h      Wed Oct 19 11:07:22 2011 -0700
>> @@ -196,6 +196,7 @@
>>  } msg_pid_t;
>> 
>>  #define READ 0
>> +#undef WRITE
>>  #define WRITE 1
>> 
>> http://www.gossamer-threads.com/lists/xen/devel/179690
>> diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/arch/x86/mm.c
>> --- a/extras/mini-os/arch/x86/mm.c      Sun Jul 25 22:22:43 2010 +0100
>> +++ b/extras/mini-os/arch/x86/mm.c      Wed Oct 19 12:25:52 2011 -0700
>> @@ -281,7 +281,7 @@
>>  /*
>>   * Mark portion of the address space read only.
>>   */
>> -extern void shared_info;
>> +extern char shared_info[PAGE_SIZE];
>>  static void set_readonly(void *text, void *etext)
>>  {
>>      unsigned long start_address =
>> diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/minios.mk
>> --- a/extras/mini-os/minios.mk  Sun Jul 25 22:22:43 2010 +0100
>> +++ b/extras/mini-os/minios.mk  Wed Oct 19 12:25:52 2011 -0700
>> @@ -10,6 +10,7 @@
>>  DEF_CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
>>  DEF_CFLAGS += $(call cc-option,$(CC),-fgnu89-inline)
>>  DEF_CFLAGS += -Wstrict-prototypes -Wnested-externs -Wpointer-arith -Winline
>> +DEF_CFLAGS += -Wno-uninitialized
>>  DEF_CPPFLAGS += -D__XEN_INTERFACE_VERSION__=$(XEN_INTERFACE_VERSION)
>> 
>>  DEF_ASFLAGS += -D__ASSEMBLY__
>> diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/netfront.c
>> --- a/extras/mini-os/netfront.c Sun Jul 25 22:22:43 2010 +0100
>> +++ b/extras/mini-os/netfront.c Wed Oct 19 12:25:52 2011 -0700
>> @@ -25,8 +25,8 @@
>> 
>> 
>> 
>> -#define NET_TX_RING_SIZE __RING_SIZE((struct netif_tx_sring *)0, PAGE_SIZE)
>> -#define NET_RX_RING_SIZE __RING_SIZE((struct netif_rx_sring *)0, PAGE_SIZE)
>> +#define NET_TX_RING_SIZE __CONST_RING_SIZE(netif_tx, PAGE_SIZE)
>> +#define NET_RX_RING_SIZE __CONST_RING_SIZE(netif_rx, PAGE_SIZE)
>>  #define GRANT_INVALID_REF 0
>> 
>>> Ian.
>>> 
>>>> 
>>>> Thanks,
>>>> AP
>>>> 
>>>> GCC Info
>>>> --------------
>>>> Using built-in specs.
>>>> COLLECT_GCC=gcc
>>>> COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6.1/lto-wrapper
>>>> Target: x86_64-linux-gnu
>>>> Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro
>>>> 4.6.1-9ubuntu3'
>>>> --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs
>>>> --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr
>>>> --program-suffix=-4.6 --enable-shared --enable-linker-build-id
>>>> --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
>>>> --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6
>>>> --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu
>>>> --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin
>>>> --enable-objc-gc --disable-werror --with-arch-32=i686
>>>> --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu
>>>> --host=x86_64-linux-gnu --target=x86_64-linux-gnu
>>>> Thread model: posix
>>>> gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
>>>> 
>>>> _______________________________________________
>>>> 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



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:39:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:39:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIluN-0007ky-3c; Tue, 25 Oct 2011 11:39:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIltb-0007Vw-Sl
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:38:44 -0700
X-Env-Sender: list.keith@scaltro.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1319567919!1623878!1
X-Originating-IP: [209.85.216.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24513 invoked from network); 25 Oct 2011 18:38:40 -0000
Received: from mail-qw0-f43.google.com (HELO mail-qw0-f43.google.com)
	(209.85.216.43)
	by server-16.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 18:38:40 -0000
Received: by qabg1 with SMTP id g1so1008609qab.30
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 11:38:38 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.229.66.138 with SMTP id n10mr5889893qci.90.1319567918452; Tue,
	25 Oct 2011 11:38:38 -0700 (PDT)
Received: by 10.229.43.2 with HTTP; Tue, 25 Oct 2011 11:38:38 -0700 (PDT)
In-Reply-To: <CACCBDD6.239BB%keir.xen@gmail.com>
References: <20134.59473.545775.75504@mariner.uk.xensource.com>
	<CACCBDD6.239BB%keir.xen@gmail.com>
Date: Tue, 25 Oct 2011 14:38:38 -0400
Message-ID: <CAFvH1Z6DGJgLzXYLFkDNhTGjynSadAeMC5h2eZhGA4MqZObixg@mail.gmail.com>
Subject: Re: [Xen-devel] xen 3.4-testing build error
From: Keith Coleman <list.keith@scaltro.com>
To: Keir Fraser <keir.xen@gmail.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>,
	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 Tue, Oct 25, 2011 at 2:26 PM, Keir Fraser <keir.xen@gmail.com> wrote:
> On 25/10/2011 17:48, "Ian Jackson" <Ian.Jackson@eu.citrix.com> wrote:
>
>> AP writes ("Re: [Xen-devel] xen 3.4-testing build error"):
>>> I am primarily using 4.1 but I still have a couple of servers running
>>> 3.4, so I want to ensure that I can still build that using Ubuntu
>>> 11.10.
>>
>> Thanks for doing this research and reporting back.
>>
>>> On Wed, Oct 19, 2011 at 1:47 AM, Ian Campbell <Ian.Campbell@citrix.com>
>>> wrote:
>>>> Recent Ubuntu enabled --as-needed in the linker by default. If you wan=
t
>>>> to stick with 3.4 you might need to add --no-as-needed somewhere
>>>> appropriate, 22856:18807b89083d is the temporary fix which we used for
>>>> 4.1. This issue is fixed properly in 4.2.
>>>
>>> Thank you! 22856 did the trick. BTW, I also had to pull in a few more
>>> fixes to get everything to work. I am listing them here in case
>>> someone else runs in to the same issue. The only outstanding problem
>>> is that bringing up a DomU with SDL leaves you with a flickering SDL
>>> window. Using VNC is a workaround for that.
>>>
>>> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/2e78e0ce1f31
>>> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/e6b5b2cb8146
>>> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/9c2fdcff3704
>>
>> I have CC'd Keith Coleman, maintainer of the 3.4 tree. =A0Keith, do you
>> think these might be appropriate for backporting ? =A0(I haven't checked
>> myself ...)
>
> These are all straightforward bug fixes. The first of them could skip the
> whitespace-modifying sub-patch.
>

These will be included in the next 3.4.4 rc.

--=20

Keith Coleman

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:40:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:40:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIlvY-0008Hf-3i; Tue, 25 Oct 2011 11:40:44 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIltc-0007W0-S2
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:38:45 -0700
X-Env-Sender: apxeng@gmail.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1319567920!736186!1
X-Originating-IP: [209.85.216.178]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12425 invoked from network); 25 Oct 2011 18:38:41 -0000
Received: from mail-qy0-f178.google.com (HELO mail-qy0-f178.google.com)
	(209.85.216.178)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 18:38:41 -0000
Received: by qyg36 with SMTP id 36so970575qyg.9
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 11:38:40 -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:content-transfer-encoding;
	bh=fOcPNIC6vU98nypis/W5X39YZNsWc5oJ2NzKznZAY9U=;
	b=WjarS0dCmStoctW0WL3uN2UdwALLTUjCoSywYRV0uUvXDVyVGoawnokZgRkE4PTbpG
	jP7BwZHo3aVpVz2hs/bJNpKgvz+WCjBShUeR6fbGM+ETg4WipwAGYLT4GtMFjxjQdTp4
	6Rc8IZ66MxogETrlEFva+NCHXubji1FVyMFfo=
MIME-Version: 1.0
Received: by 10.229.44.69 with SMTP id z5mr5429719qce.244.1319567920311; Tue,
	25 Oct 2011 11:38:40 -0700 (PDT)
Received: by 10.229.74.19 with HTTP; Tue, 25 Oct 2011 11:38:40 -0700 (PDT)
In-Reply-To: <CACCBDD6.239BB%keir.xen@gmail.com>
References: <20134.59473.545775.75504@mariner.uk.xensource.com>
	<CACCBDD6.239BB%keir.xen@gmail.com>
Date: Tue, 25 Oct 2011 11:38:40 -0700
Message-ID: <CAGU+auvfm2v9fxJO2=K3CuxXa85OF2UD9KUUgPGr-4U+6z9nMg@mail.gmail.com>
Subject: Re: [Xen-devel] xen 3.4-testing build error
From: AP <apxeng@gmail.com>
To: Keir Fraser <keir.xen@gmail.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>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Keith Coleman <list.keith@scaltro.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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, Oct 25, 2011 at 11:26 AM, Keir Fraser <keir.xen@gmail.com> wrote:
> On 25/10/2011 17:48, "Ian Jackson" <Ian.Jackson@eu.citrix.com> wrote:
>
>> AP writes ("Re: [Xen-devel] xen 3.4-testing build error"):
>>> I am primarily using 4.1 but I still have a couple of servers running
>>> 3.4, so I want to ensure that I can still build that using Ubuntu
>>> 11.10.
>>
>> Thanks for doing this research and reporting back.
>>
>>> On Wed, Oct 19, 2011 at 1:47 AM, Ian Campbell <Ian.Campbell@citrix.com>
>>> wrote:
>>>> Recent Ubuntu enabled --as-needed in the linker by default. If you wan=
t
>>>> to stick with 3.4 you might need to add --no-as-needed somewhere
>>>> appropriate, 22856:18807b89083d is the temporary fix which we used for
>>>> 4.1. This issue is fixed properly in 4.2.
>>>
>>> Thank you! 22856 did the trick. BTW, I also had to pull in a few more
>>> fixes to get everything to work. I am listing them here in case
>>> someone else runs in to the same issue. The only outstanding problem
>>> is that bringing up a DomU with SDL leaves you with a flickering SDL
>>> window. Using VNC is a workaround for that.
>>>
>>> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/2e78e0ce1f31
>>> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/e6b5b2cb8146
>>> http://xenbits.xensource.com/hg/xen-4.0-testing.hg/rev/9c2fdcff3704

This should be added to the list with some hand massaging
http://xenbits.xensource.com/hg/xen-4.1-testing.hg/rev/0dbad563a659

instead of the hack that I did

diff -r 0e3b875fd5fb -r 3a1e98c88825 tools/blktap/lib/blktaplib.h
--- a/tools/blktap/lib/blktaplib.h =A0 =A0 =A0Fri Sep 30 18:42:30 2011 -040=
0
+++ b/tools/blktap/lib/blktaplib.h =A0 =A0 =A0Wed Oct 19 11:07:22 2011 -070=
0
@@ -196,6 +196,7 @@
 =A0} msg_pid_t;

 =A0#define READ 0
+#undef WRITE
=A0 #define WRITE 1

>> I have CC'd Keith Coleman, maintainer of the 3.4 tree. =A0Keith, do you
>> think these might be appropriate for backporting ? =A0(I haven't checked
>> myself ...)
>
> These are all straightforward bug fixes. The first of them could skip the
> whitespace-modifying sub-patch.
> =A0-- Keir
>
>> Ian.
>>
>>> diff -r 0e3b875fd5fb -r 3a1e98c88825 tools/blktap/lib/blktaplib.h
>>> --- a/tools/blktap/lib/blktaplib.h =A0 =A0 =A0Fri Sep 30 18:42:30 2011 =
-0400
>>> +++ b/tools/blktap/lib/blktaplib.h =A0 =A0 =A0Wed Oct 19 11:07:22 2011 =
-0700
>>> @@ -196,6 +196,7 @@
>>> =A0} msg_pid_t;
>>>
>>> =A0#define READ 0
>>> +#undef WRITE
>>> =A0#define WRITE 1
>>>
>>> http://www.gossamer-threads.com/lists/xen/devel/179690
>>> diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/arch/x86/mm.c
>>> --- a/extras/mini-os/arch/x86/mm.c =A0 =A0 =A0Sun Jul 25 22:22:43 2010 =
+0100
>>> +++ b/extras/mini-os/arch/x86/mm.c =A0 =A0 =A0Wed Oct 19 12:25:52 2011 =
-0700
>>> @@ -281,7 +281,7 @@
>>> =A0/*
>>> =A0 * Mark portion of the address space read only.
>>> =A0 */
>>> -extern void shared_info;
>>> +extern char shared_info[PAGE_SIZE];
>>> =A0static void set_readonly(void *text, void *etext)
>>> =A0{
>>> =A0 =A0 =A0unsigned long start_address =3D
>>> diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/minios.mk
>>> --- a/extras/mini-os/minios.mk =A0Sun Jul 25 22:22:43 2010 +0100
>>> +++ b/extras/mini-os/minios.mk =A0Wed Oct 19 12:25:52 2011 -0700
>>> @@ -10,6 +10,7 @@
>>> =A0DEF_CFLAGS +=3D $(call cc-option,$(CC),-fno-stack-protector,)
>>> =A0DEF_CFLAGS +=3D $(call cc-option,$(CC),-fgnu89-inline)
>>> =A0DEF_CFLAGS +=3D -Wstrict-prototypes -Wnested-externs -Wpointer-arith=
 -Winline
>>> +DEF_CFLAGS +=3D -Wno-uninitialized
>>> =A0DEF_CPPFLAGS +=3D -D__XEN_INTERFACE_VERSION__=3D$(XEN_INTERFACE_VERS=
ION)
>>>
>>> =A0DEF_ASFLAGS +=3D -D__ASSEMBLY__
>>> diff -r 917e11d767ef -r 0708fba177d8 extras/mini-os/netfront.c
>>> --- a/extras/mini-os/netfront.c Sun Jul 25 22:22:43 2010 +0100
>>> +++ b/extras/mini-os/netfront.c Wed Oct 19 12:25:52 2011 -0700
>>> @@ -25,8 +25,8 @@
>>>
>>>
>>>
>>> -#define NET_TX_RING_SIZE __RING_SIZE((struct netif_tx_sring *)0, PAGE_=
SIZE)
>>> -#define NET_RX_RING_SIZE __RING_SIZE((struct netif_rx_sring *)0, PAGE_=
SIZE)
>>> +#define NET_TX_RING_SIZE __CONST_RING_SIZE(netif_tx, PAGE_SIZE)
>>> +#define NET_RX_RING_SIZE __CONST_RING_SIZE(netif_rx, PAGE_SIZE)
>>> =A0#define GRANT_INVALID_REF 0
>>>
>>>> Ian.
>>>>
>>>>>
>>>>> Thanks,
>>>>> AP
>>>>>
>>>>> GCC Info
>>>>> --------------
>>>>> Using built-in specs.
>>>>> COLLECT_GCC=3Dgcc
>>>>> COLLECT_LTO_WRAPPER=3D/usr/lib/gcc/x86_64-linux-gnu/4.6.1/lto-wrapper
>>>>> Target: x86_64-linux-gnu
>>>>> Configured with: ../src/configure -v --with-pkgversion=3D'Ubuntu/Lina=
ro
>>>>> 4.6.1-9ubuntu3'
>>>>> --with-bugurl=3Dfile:///usr/share/doc/gcc-4.6/README.Bugs
>>>>> --enable-languages=3Dc,c++,fortran,objc,obj-c++,go --prefix=3D/usr
>>>>> --program-suffix=3D-4.6 --enable-shared --enable-linker-build-id
>>>>> --with-system-zlib --libexecdir=3D/usr/lib --without-included-gettext
>>>>> --enable-threads=3Dposix --with-gxx-include-dir=3D/usr/include/c++/4.=
6
>>>>> --libdir=3D/usr/lib --enable-nls --with-sysroot=3D/ --enable-clocale=
=3Dgnu
>>>>> --enable-libstdcxx-debug --enable-libstdcxx-time=3Dyes --enable-plugi=
n
>>>>> --enable-objc-gc --disable-werror --with-arch-32=3Di686
>>>>> --with-tune=3Dgeneric --enable-checking=3Drelease --build=3Dx86_64-li=
nux-gnu
>>>>> --host=3Dx86_64-linux-gnu --target=3Dx86_64-linux-gnu
>>>>> Thread model: posix
>>>>> gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
>>>>>
>>>>> _______________________________________________
>>>>> 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
>
>
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:42:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11: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 1RIlxC-0000VQ-Sc; Tue, 25 Oct 2011 11:42:27 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlvQ-0008Db-Sm
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:40:37 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-5.tower-174.messagelabs.com!1319568033!32967873!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22420 invoked from network); 25 Oct 2011 18:40:33 -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; 25 Oct 2011 18:40:33 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319568033; l=611;
	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=bbQZS/RM8N7lH3VuRs8KyK7awgU=;
	b=suobrkCR2DvH+TlDfE5TBVDHuSAuDgaGUE81FZ9glyXQasgfZI4cXKzTEKqD+TFTR5x
	1cqwBm6tD1YG8MZ5qC0YCNEP2DPKqoKGv/vohS72bWv6eCzUNgO40Ve1ScxwAel4TpX2r
	ATXPR8dH2RrdLeoDGJHnDdvv0H3KUT71O3o=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjMQG3Q7
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-100-089.pools.arcor-ip.net [88.65.100.89])
	by smtp.strato.de (jimi mo28) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id 301cffn9PISTtJ ;
	Tue, 25 Oct 2011 20:40:23 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 6921918637; Tue, 25 Oct 2011 20:40:22 +0200 (CEST)
Date: Tue, 25 Oct 2011 20:40:22 +0200
From: Olaf Hering <olaf@aepfle.de>
To: chris <tknchris@gmail.com>
Subject: Re: [Xen-devel] Feature idea
Message-ID: <20111025184022.GA15648@aepfle.de>
References: <CAKnNFz_iB8yGcV-CWcg1is=KnfHjrrHqcvZGGeTF0YyLDUxbNg@mail.gmail.com>
	<1319529895.3385.210.camel@zakaz.uk.xensource.com>
	<CAKnNFz_pkYGwfyw=zRsD=RM2DL4dUywxemHBNRAyDm96UDfqBg@mail.gmail.com>
	<CAKnNFz96T_LUKCj506AvcgqZL9+aajQ2=afD=9jik0s-TP92XA@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <CAKnNFz96T_LUKCj506AvcgqZL9+aajQ2=afD=9jik0s-TP92XA@mail.gmail.com>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: Xen-Devel List <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 Tue, Oct 25, chris wrote:

> Is there any documentation on it somewhere? Couldn't find anything in the tools
> /xenpaging dir or on the wiki

There is some outdated blurb in docs/misc/xenpaging.txt about the usage
part of the xenpaging binary.  The hypervisor part was documented
recently in changeset 23797:
http://xenbits.xen.org/hg/xen-unstable.hg/rev/18306b054799

Please note that there is currently no code in the tools to
automatically start xenpaging for a given guest, the binary has to be
started manually.

If you want to test xenpaging use xen-unstable, 4.1 has major bugs.

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 11:50:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 11:50:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIm4o-00019i-V1; Tue, 25 Oct 2011 11:50:19 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIm46-0000uD-MW
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:49:35 -0700
X-Env-Sender: tknchris@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319568549!49715083!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18775 invoked from network); 25 Oct 2011 18:49:10 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	25 Oct 2011 18:49:10 -0000
Received: by iaen33 with SMTP id n33so1216819iae.30
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 11:49:30 -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=x/mmDciQGq/mf9t+Bz0XU+LToEIhxDAy1bETeyZMYUU=;
	b=rNLbvY1xqtnnYXChPqNP1549cnckeEBRvXFMfw+zsb0XpmttmXlnZgfvPgvyoFX2SN
	ep2YGHOjtpoChS5VmLssnNZED380wYI96yfk8AlU8nZCdRbPwG7tKR9mU9FcJIM4xGfj
	qGWa3jIP4cmWxSYRm2JSt72iiUlJBDuon5BBo=
MIME-Version: 1.0
Received: by 10.42.155.70 with SMTP id t6mr7186556icw.38.1319568570031; Tue,
	25 Oct 2011 11:49:30 -0700 (PDT)
Received: by 10.42.171.135 with HTTP; Tue, 25 Oct 2011 11:49:30 -0700 (PDT)
In-Reply-To: <20111025184022.GA15648@aepfle.de>
References: <CAKnNFz_iB8yGcV-CWcg1is=KnfHjrrHqcvZGGeTF0YyLDUxbNg@mail.gmail.com>
	<1319529895.3385.210.camel@zakaz.uk.xensource.com>
	<CAKnNFz_pkYGwfyw=zRsD=RM2DL4dUywxemHBNRAyDm96UDfqBg@mail.gmail.com>
	<CAKnNFz96T_LUKCj506AvcgqZL9+aajQ2=afD=9jik0s-TP92XA@mail.gmail.com>
	<20111025184022.GA15648@aepfle.de>
Date: Tue, 25 Oct 2011 14:49:30 -0400
Message-ID: <CAKnNFz8HN7ZVd2mV3FbLRhopY6UcRqw07tzrOUfLk4tE8Xy0uA@mail.gmail.com>
Subject: Re: [Xen-devel] Feature idea
From: chris <tknchris@gmail.com>
To: Olaf Hering <olaf@aepfle.de>
Cc: Xen-Devel List <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="===============0548716540=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0548716540==
Content-Type: multipart/alternative; boundary=90e6ba1eff4adf9e6904b023ffea

--90e6ba1eff4adf9e6904b023ffea
Content-Type: text/plain; charset=ISO-8859-1

thanks alot i will test it and give you any feedback i can

On Tue, Oct 25, 2011 at 2:40 PM, Olaf Hering <olaf@aepfle.de> wrote:

> On Tue, Oct 25, chris wrote:
>
> > Is there any documentation on it somewhere? Couldn't find anything in the
> tools
> > /xenpaging dir or on the wiki
>
> There is some outdated blurb in docs/misc/xenpaging.txt about the usage
> part of the xenpaging binary.  The hypervisor part was documented
> recently in changeset 23797:
> http://xenbits.xen.org/hg/xen-unstable.hg/rev/18306b054799
>
> Please note that there is currently no code in the tools to
> automatically start xenpaging for a given guest, the binary has to be
> started manually.
>
> If you want to test xenpaging use xen-unstable, 4.1 has major bugs.
>
> Olaf
>

--90e6ba1eff4adf9e6904b023ffea
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

thanks alot i will test it and give you any feedback i can<br><br><div clas=
s=3D"gmail_quote">On Tue, Oct 25, 2011 at 2:40 PM, Olaf Hering <span dir=3D=
"ltr">&lt;<a href=3D"mailto:olaf@aepfle.de">olaf@aepfle.de</a>&gt;</span> w=
rote:<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"im">On Tue, Oct 25, chris wro=
te:<br>
<br>
&gt; Is there any documentation on it somewhere? Couldn&#39;t find anything=
 in the tools<br>
&gt; /xenpaging dir or on the wiki<br>
<br>
</div>There is some outdated blurb in docs/misc/xenpaging.txt about the usa=
ge<br>
part of the xenpaging binary. =A0The hypervisor part was documented<br>
recently in changeset 23797:<br>
<a href=3D"http://xenbits.xen.org/hg/xen-unstable.hg/rev/18306b054799" targ=
et=3D"_blank">http://xenbits.xen.org/hg/xen-unstable.hg/rev/18306b054799</a=
><br>
<br>
Please note that there is currently no code in the tools to<br>
automatically start xenpaging for a given guest, the binary has to be<br>
started manually.<br>
<br>
If you want to test xenpaging use xen-unstable, 4.1 has major bugs.<br>
<font color=3D"#888888"><br>
Olaf<br>
</font></blockquote></div><br>

--90e6ba1eff4adf9e6904b023ffea--


--===============0548716540==
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

--===============0548716540==--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 12:10:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 12:10:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RImOO-00033i-KS; Tue, 25 Oct 2011 12:10:32 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RImH2-0001lz-30
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:02:57 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1319569348!45941596!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16081 invoked from network); 25 Oct 2011 19:02:29 -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; 25 Oct 2011 19:02:29 -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
	p9PJ2jOI023716
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 19:02: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
	p9PJ2hcO005319
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 19:02:43 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
	p9PJ2XgS025009; Tue, 25 Oct 2011 14:02:34 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 12:02:33 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id B4C5482BFF; Tue, 25 Oct 2011 15:02:31 -0400 (EDT)
Date: Tue, 25 Oct 2011 15:02:31 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Message-ID: <20111025190231.GD10062@phenom.dumpdata.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024205708.GE2441@phenom.dumpdata.com>
	<4EA5E024.7040708@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA5E024.7040708@tycho.nsa.gov>
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.4EA707D7.0089,ss=1,re=0.000,fgs=0
Cc: Ian.Jackson@eu.citrix.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	keir@xen.org
Subject: [Xen-devel] Re: [PATCH 2/2] xen/gnt{dev,
	alloc}: reserve event channels for notify
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 cause the event channel refcnt to be set to zero and free it. And then
> > causing the box to die - as the event channels for the physical IRQ might have
> > gotten free-ed.
> > 
> 
> Not really. For a given valid event channel E, this will increase the refcnt by one
> when i == E, and then decrease refcnt the next time evtchn_get succeeds (for some
> other value of i).

Oh right. Hmm.. I am having this feeling that it still makes sense to seperate the
events that are allocated by grantdev/grantalloc from the ones that are done
for in-kernel uses (such as IRQ, MSI, IPI, etc). Basically not trusting the userland
with its arguments as much as possible.

And yes, I do understand that you need to be a root user to use /dev/gnt*, but
I started thinking about QEMU. And Fedora has this concept of making QEMU run in its
own SELinux container (and own user) - or perhaps I am confusing this with containers..
Anyhow it runs in one of those quasi-root-but-not-root. My thinking is that it could
be possible do with QEMU running under Xen too, but then we have to make sure
that all /dev/gnt* ioctls are secure <hand-waving what secure means>.

It probably involves more than just what we discussed.
> 
> > Hm.. Perhaps the gntalloc and gntdev should keep track of which event channels
> > are OK to refcnt? Something like a whitelist? Granted at that point the refcounting
> > could as well be done by the API that sets up the event channels from the userspace.
> 
> Hmm. Perhaps have a magic value for refcount (-1?) that indicates evtchn_get is not
> available. That would become the default value of refcnt, and evtchn.c would then
> use evtchn_make_refcounted() to change the refcount to 1 and allow _get/_put to work.

How would that work when the IRQ subsystem (so everything is setup in the kernel)
gets an event? Would the refcount be for that -1.. oh. You would only set
the refcnt when the _get/_put calls are made and not when in-kernel calls to setup
IRQs are done?


> 
> > So the evtchn_ioctl is pretty smart. It uses "get_port_user" to get the list
> > of events that belong to this user (and have been handed out). I think you
> > need to use that in the gntalloc to double-check that the event channel is not
> > one of the kernel type.
> > 
> >> +	}
> >>  
> >>  	gref->notify.flags = 0;
> >>  
> >> @@ -396,6 +398,16 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
> >>  		goto unlock_out;
> >>  	}
> >>  
> >> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
> >> +		if (evtchn_get(op.event_channel_port)) {
> >> +			rc = -EINVAL;
> >> +			goto unlock_out;
> >> +		}
> >> +	}
> >> +
> >> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
> >> +		evtchn_put(gref->notify.event);
> >> +
> >>  	gref->notify.flags = op.action;
> >>  	gref->notify.pgoff = pgoff;
> >>  	gref->notify.event = op.event_channel_port;
> >> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
> >> index f914b26..cfcc890 100644
> >> --- a/drivers/xen/gntdev.c
> >> +++ b/drivers/xen/gntdev.c
> >> @@ -190,6 +190,7 @@ static void gntdev_put_map(struct grant_map *map)
> >>  
> >>  	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
> >>  		notify_remote_via_evtchn(map->notify.event);
> >> +		evtchn_put(map->notify.event);
> >>  	}
> >>  
> >>  	if (map->pages) {
> >> @@ -596,6 +597,16 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
> >>  		goto unlock_out;
> >>  	}
> >>  
> >> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
> >> +		if (evtchn_get(op.event_channel_port)) {
> >> +			rc = -EINVAL;
> >> +			goto unlock_out;
> >> +		}
> >> +	}
> >> +
> >> +	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
> > 
> > So notify.flags has not been set yet? That looks to be done later?
> 
> Yep. It's the previous value (zero if we haven't called the ioctl yet).

OK, can you add a tiny comment so that in a year time the person reading this
will have a warm fuzzy feeling..
> 
> > Or is this in case of the user doing
> > 
> >  uargs.action = UNMAP_NOTIFY_SEND_EVENT;
> >  ioctl(.., IOCTL_GNTALLOC_SET_UNMAP_NOTIFY, &uarg);
> >  uargs.action = UNAMP_NOTIFY_CLEAR_BYTE;
> >  ioctl(.., IOCTL_GNTALLOC_SET_UNMAP_NOTIFY, &uarg);
> > 
> >  and we want to preserve the "old" flags before swapping over to the
> > new?
> 
> No. We acquire the new event channel before releasing the old one so that
> if we happen to be the only one holding a reference to this event channel,
> a change in the byte-clear portion of the notify does not cause us to drop
> the event channel.

Ok.
> 
> >> +		evtchn_put(map->notify.event);
> >> +
> >>  	map->notify.flags = op.action;
> >>  	map->notify.addr = op.index - (map->index << PAGE_SHIFT);
> >>  	map->notify.event = op.event_channel_port;
> >> -- 
> >> 1.7.6.4
> > 
> 
> 
> -- 
> 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 Oct 25 12:11:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 12:11:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RImPj-0003Qx-WC; Tue, 25 Oct 2011 12:11:56 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RImK9-00026e-3P
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:06:09 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319569542!49716351!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12063 invoked from network); 25 Oct 2011 19:05:43 -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; 25 Oct 2011 19:05:43 -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
	p9PJ5xU1027474
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 19:05:59 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
	p9PJ5wYm001768
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 19:05:58 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
	p9PJ5qoY027516; Tue, 25 Oct 2011 14:05:52 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 12:05:52 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 3FC3182BFF; Tue, 25 Oct 2011 15:05:51 -0400 (EDT)
Date: Tue, 25 Oct 2011 15:05:51 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Message-ID: <20111025190551.GE10062@phenom.dumpdata.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-2-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024202242.GD2441@phenom.dumpdata.com>
	<4EA5E4AD.4000902@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA5E4AD.4000902@tycho.nsa.gov>
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.4EA70898.008C:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Ian.Jackson@eu.citrix.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	keir@xen.org
Subject: [Xen-devel] Re: [PATCH 1/2] xen/event: Add reference counting to
	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

> >> +	atomic_t refcount;
> > 
> > refcnt
> > 
> 
> Ah yes, vowels are much too valuable to use more than one here...

<laughs> Well, optimization!!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 12:12:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 12:12:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RImQY-0003oF-QC; Tue, 25 Oct 2011 12:12:46 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RImNv-0002w0-KJ
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:10:04 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1319569799!1041482!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20465 invoked from network); 25 Oct 2011 19:10:00 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-15.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 25 Oct 2011 19:10: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
	p9PJ9rtS032200
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 19:09:54 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
	p9PJ9qjI017364
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 19:09:53 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
	p9PJ9kIJ017742; Tue, 25 Oct 2011 14:09:46 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 12:09:46 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id D87C782BFF; Tue, 25 Oct 2011 15:09:44 -0400 (EDT)
Date: Tue, 25 Oct 2011 15:09:44 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Re: [PATCH 1/2] xen/event: Add reference counting to
	event channel
Message-ID: <20111025190944.GF10062@phenom.dumpdata.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-2-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024202242.GD2441@phenom.dumpdata.com>
	<1319530635.3385.215.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319530635.3385.215.camel@zakaz.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.4EA70983.003F,ss=1,re=0.000,fgs=0
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>, "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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, Oct 25, 2011 at 09:17:15AM +0100, Ian Campbell wrote:
> On Mon, 2011-10-24 at 21:22 +0100, Konrad Rzeszutek Wilk wrote:
> > 
> > > +void evtchn_put(unsigned int evtchn)
> > 
> > The decleration for 'evtchn' is 'unsigned short' so that can be
> > used instead of 'unsigned int'.
> 
> I think I nearly made the same comment but then I looked at
> drivers/xen/events.c and found that it uses "unsigned", "unsigned
> short", "unsigned int" and "int" fairly interchangeably. The externally
> visible API (i.e. include/xen/events.h) tends to stick to just "unsigned
> int" or "int".
> 
> The problem with the short types is that they don't leave room for an
> error indication, which is why on the Xen tools (libxc) side we have his
> piece of minor ugliness:
>         typedef int evtchn_port_or_error_t;
> 
> The actual hypercall interface uses "typedef uint32_t evtchn_port_t" but
> AIUI real evtchn values are guaranteed to fit in 31 bits.


Oh fun! So we actually have a bug with 'unsigned short' cutting it down
from 2^31 to 2^16!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 12:17:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 12:17:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RImVF-0004JF-6q; Tue, 25 Oct 2011 12:17:37 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RImUh-00046i-6u
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:17:03 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-5.tower-182.messagelabs.com!1319570218!735815!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 669 invoked from network); 25 Oct 2011 19:16:59 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-5.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 25 Oct 2011 19:16:59 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:6cb6:29ff:fef9:538a])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 20DB39940;
	Tue, 25 Oct 2011 12:16:57 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id DE0C120187;
	Tue, 25 Oct 2011 12:16:50 -0700 (PDT)
Message-ID: <4EA70B22.2020508@goop.org>
Date: Tue, 25 Oct 2011 12:16:50 -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>
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] [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

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).

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;
 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 12:26:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 12:26:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RImds-0004ve-T4; Tue, 25 Oct 2011 12:26:32 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RImdE-0004iq-J8
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:25:53 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1319570747!1044317!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20392 invoked from network); 25 Oct 2011 19:25:49 -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; 25 Oct 2011 19:25:49 -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
	p9PJPiw4008532
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 19:25:45 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
	p9PJPiR0003137
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 19:25:44 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
	p9PJPcCZ009423; Tue, 25 Oct 2011 14:25:38 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 12:25:38 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id ED8A082BA1; Tue, 25 Oct 2011 15:25:36 -0400 (EDT)
Date: Tue, 25 Oct 2011 15:25:36 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: 2013pfoley <2013pfoley@tjhsst.edu>, david.vrabel@citrix.com
Message-ID: <20111025192536.GG10062@phenom.dumpdata.com>
References: <05c3da5dc6158197e28d62e853ac2f04@tjhsst.edu>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <05c3da5dc6158197e28d62e853ac2f04@tjhsst.edu>
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.4EA70D3A.0001:SCFMA922111,ss=1,re=-6.300,fgs=0
Cc: Andrew Hamilton <ahamilto@tjhsst.edu>, xen-devel@lists.xensource.com,
	linux-kernel@vger.kernel.org
Subject: [Xen-devel] Re: Xen dom0 linux kernel 3.1 boot failure
 ptwr_emulate: could not get_page_from_l1e
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 24, 2011 at 03:34:57PM -0400, 2013pfoley wrote:
> Hi,
> 
> I'm having xen dom0 crash during bootup when using the linux 3.1
> kernel however it worked when using the linux 2.6.34 kernel.
> I tried using xen-unstable but got the exact same error as with xen
> 4.1.1.
> 
> xen-unstable changeset:   23981:6c583d35d76d
> linux kernel 3.1.0

.. snip.. 
> (XEN) Xen-e820 RAM map:
> (XEN)  0000000000000000 - 000000000009f400 (usable)
> (XEN)  000000000009f400 - 00000000000a0000 (reserved)
> (XEN)  00000000000f0000 - 0000000000100000 (reserved)
> (XEN)  0000000000100000 - 00000000df61f000 (usable)
> (XEN)  00000000df61f000 - 00000000df62c000 (ACPI data)
> (XEN)  00000000df62c000 - 00000000df62d000 (usable)
> (XEN)  00000000df62d000 - 00000000e4000000 (reserved)
> (XEN)  00000000fec00000 - 00000000fee10000 (reserved)
> (XEN)  00000000ff800000 - 0000000100000000 (reserved)
> (XEN)  0000000100000000 - 000000061ffff000 (usable) 

So 24MB..
.. snip..

> mapping kernel into physical memory
> Xen: setup ISA identity maps
> about to get started...
> [    0.000000] Initializing cgroup subsys cpuset
> [    0.000000] Initializing cgroup subsys cpu
> [    0.000000] Linux version 3.1.0 (root@galapagos) (gcc version
> 4.5.3 (Gentoo 4.5.3-r1 p1.0, pie-0.4.5) ) #4 SMP Mon Oct 24 15:03:22
> EDT 2011
> [    0.000000] Command line: root=/dev/sda2 bonding.mode=4
> bonding.miimon=100 console=hvc0 debug initcall_debug earlyprintk=xen
> [    0.000000] Freeing  e4000-fec00 pfn range: 109568 pages freed
> [    0.000000] Freeing  fee10-ff800 pfn range: 2544 pages freed
> [    0.000000] released 112112 pages of unused memory
> [    0.000000] 1-1 mapping on a0->100
> [    0.000000] 1-1 mapping on df61f->df62c
> [    0.000000] 1-1 mapping on df62d->100000
> [    0.000000] Set 133696 page(s) to 1-1 mapping.
> [    0.000000] BIOS-provided physical RAM map:
> [    0.000000]  Xen: 0000000000000000 - 000000000009f000 (usable)
> [    0.000000]  Xen: 000000000009f400 - 0000000000100000 (reserved)
> [    0.000000]  Xen: 0000000000100000 - 00000000df61f000 (usable)
> [    0.000000]  Xen: 00000000df61f000 - 00000000df62c000 (ACPI data)
> [    0.000000]  Xen: 00000000df62c000 - 00000000df62d000 (usable)
> [    0.000000]  Xen: 00000000df62d000 - 00000000e4000000 (reserved)
> [    0.000000]  Xen: 00000000fec00000 - 00000000fee10000 (reserved)
> [    0.000000]  Xen: 00000000ff800000 - 0000000100000000 (reserved)
> [    0.000000]  Xen: 0000000100000000 - 000000063b5ef000 (usable)

So Xen reported that memory ends at       000000061ffff000

but we decided that it must have more. Which is OK as we basically
adding the 112112 pages we freed. CC-ing David here in case he has some ideas.

> [    0.000000] bootconsole [xenboot0] enabled
> [    0.000000] NX (Execute Disable) protection: active
> [    0.000000] DMI 2.7 present.
> [    0.000000] DMI: HP ProLiant DL380 G6, BIOS P62 05/05/2011
> [    0.000000] e820 update range: 0000000000000000 -
> 0000000000010000 (usable) ==> (reserved)
> [    0.000000] e820 remove range: 00000000000a0000 -
> 0000000000100000 (usable)
> [    0.000000] No AGP bridge found
> [    0.000000] last_pfn = 0x63b5ef max_arch_pfn = 0x400000000
> [    0.000000] last_pfn = 0xdf62d max_arch_pfn = 0x400000000
> [    0.000000] found SMP MP-table at [ffff8800000f4f80] f4f80
> (XEN) mm.c:945:d0 Error getting mfn 100 (pfn 5555555555555555) from
> L1 entry 8000000000100461 for l1e_owner=0, pg_owner=0
> (XEN) mm.c:5046:d0 ptwr_emulate: could not get_page_from_l1e()

Oh wait, This is MFN 100? Nothing to do with E820 then.
But what is weird is that the PFN is 555555..


> [    0.000000] BUG: unable to handle kernel NULL pointer dereference
> at          (null)
> [    0.000000] IP: [<ffffffff81008a5a>] xen_set_pte+0x3a/0x1f0
> [    0.000000] PGD 0
> [    0.000000] Oops: 0003 [#1] SMP
> [    0.000000] CPU 0
> [    0.000000] Modules linked in:
> [    0.000000]
> [    0.000000] Pid: 0, comm: swapper Not tainted 3.1.0 #4 HP
> ProLiant DL380 G6
> [    0.000000] RIP: e030:[<ffffffff81008a5a>]  [<ffffffff81008a5a>]
> xen_set_pte+0x3a/0x1f0
> [    0.000000] RSP: e02b:ffffffff81c01d50  EFLAGS: 00010097
> [    0.000000] RAX: 0000000000000000 RBX: ffffffff81d573c0 RCX:
> 0000000000000001
> [    0.000000] RDX: 0000000010000001 RSI: 8000000000100461 RDI:
> ffffffff81d573c0
> [    0.000000] RBP: ffffffff81c01d90 R08: 0000000000000000 R09:
> 00000000000f4f90
> [    0.000000] R10: 00000000deadbeef R11: 0000000000000010 R12:
> 8000000000100461
> [    0.000000] R13: 8000000000100463 R14: 8000000000000563 R15:
> 0000000000100000
> [    0.000000] FS:  0000000000000000(0000) GS:ffffffff81c9a000(0000)
> knlGS:0000000000000000
> [    0.000000] CS:  e033 DS: 0000 ES: 0000 CR0: 0000000080050033
> [    0.000000] CR2: 0000000000000000 CR3: 0000000001c05000 CR4:
> 0000000000002660
> [    0.000000] DR0: 0000000000000000 DR1: 0000000000000000 DR2:
> 0000000000000000
> [    0.000000] DR3: 0000000000000000 DR6: 0000000000000000 DR7:
> 0000000000000000
> [    0.000000] Process swapper (pid: 0, threadinfo ffffffff81c00000,
> task ffffffff81c0d020)
> [    0.000000] Stack:
> [    0.000000]  ffffffff81004ef1 0000000000000010 00000000deadbeef
> ffffffff81d573c0
> [    0.000000]  0000000000000100 8000000000100463 8000000000000563
> 0000000000100000
> [    0.000000]  ffffffff81c01dc0 ffffffff81cb299f 0000000000100000
> ffffffffff478000
> [    0.000000] Call Trace:
> [    0.000000]  [<ffffffff81004ef1>] ?
> __raw_callee_save_xen_pte_val+0x11/0x1e
> [    0.000000]  [<ffffffff81cb299f>] xen_set_pte_init+0x7f/0x87
> [    0.000000]  [<ffffffff81cc2a99>] __early_set_fixmap+0x73/0xbc
> [    0.000000]  [<ffffffff81cc2c01>] __early_ioremap+0x11f/0x1ad
> [    0.000000]  [<ffffffff81cc2f07>] early_ioremap+0x13/0x15
> [    0.000000]  [<ffffffff81cbc2ad>] get_mpc_size+0x14/0x4c
> [    0.000000]  [<ffffffff81cbc3b1>] smp_scan_config+0xcc/0xfa
> [    0.000000]  [<ffffffff81cf3300>] ?
> firmware_map_add_hotplug+0xa4/0xa4
> [    0.000000]  [<ffffffff81cbcfb3>] default_find_smp_config+0x36/0x5a
> [    0.000000]  [<ffffffff81cb4770>] setup_arch+0x539/0xad7
> [    0.000000]  [<ffffffff81009ecf>] ?
> __raw_callee_save_xen_restore_fl+0x11/0x1e
> [    0.000000]  [<ffffffff81cf3300>] ?
> firmware_map_add_hotplug+0xa4/0xa4
> [    0.000000]  [<ffffffff81709534>] ? printk+0x3c/0x3e
> [    0.000000]  [<ffffffff8170c2ea>] ?
> _raw_spin_unlock_irqrestore+0x1a/0x20
> [    0.000000]  [<ffffffff81cf3300>] ?
> firmware_map_add_hotplug+0xa4/0xa4
> [    0.000000]  [<ffffffff81cae93b>] start_kernel+0x8e/0x359
> [    0.000000]  [<ffffffff81cae347>]
> x86_64_start_reservations+0x132/0x136
> [    0.000000]  [<ffffffff81cb1eac>] xen_start_kernel+0x5ef/0x5f6
> [    0.000000] Code: 89 5d d8 4c 89 65 e0 48 89 fb 4c 89 6d e8 4c 89
> 75 f0 49 89 f4 85 c0 4c 89 7d f8 0f 85 17 01 00 00 e8 2b 06 03 00 83
> f8 01 74 1e <4c> 89 23 48 8b 5d d8 4c 8b 65 e0 4c 8b 6d e8 4c 8b 75
> f0 4c 8b
> [    0.000000] RIP  [<ffffffff81008a5a>] xen_set_pte+0x3a/0x1f0
> [    0.000000]  RSP <ffffffff81c01d50>
> [    0.000000] CR2: 0000000000000000
> [    0.000000] ---[ end trace 4eaa2a86a8e2da22 ]---
> [    0.000000] Kernel panic - not syncing: Attempted to kill the
> idle task!
> [    0.000000] Pid: 0, comm: swapper Tainted: G      D     3.1.0 #4
> [    0.000000] Call Trace:
> [    0.000000]  [<ffffffff817093d8>] panic+0x8c/0x1ac
> [    0.000000]  [<ffffffff8105db63>] do_exit+0x803/0x950
> [    0.000000]  [<ffffffff8170c2ea>] ?
> _raw_spin_unlock_irqrestore+0x1a/0x20
> [    0.000000]  [<ffffffff8105b3b5>] ? kmsg_dump+0x45/0x100
> [    0.000000]  [<ffffffff8170d46f>] oops_end+0xaf/0xf0
> [    0.000000]  [<ffffffff8103e050>] no_context+0xf0/0x260
> [    0.000000]  [<ffffffff8103e2dd>] __bad_area_nosemaphore+0x11d/0x220
> [    0.000000]  [<ffffffff8103e3ee>] bad_area_nosemaphore+0xe/0x10
> [    0.000000]  [<ffffffff8170fd8b>] do_page_fault+0x36b/0x510
> [    0.000000]  [<ffffffff81009ecf>] ?
> __raw_callee_save_xen_restore_fl+0x11/0x1e
> [    0.000000]  [<ffffffff8170c7b5>] page_fault+0x25/0x30
> [    0.000000]  [<ffffffff81008a5a>] ? xen_set_pte+0x3a/0x1f0
> [    0.000000]  [<ffffffff81004ef1>] ?
> __raw_callee_save_xen_pte_val+0x11/0x1e
> [    0.000000]  [<ffffffff81cb299f>] xen_set_pte_init+0x7f/0x87
> [    0.000000]  [<ffffffff81cc2a99>] __early_set_fixmap+0x73/0xbc
> [    0.000000]  [<ffffffff81cc2c01>] __early_ioremap+0x11f/0x1ad
> [    0.000000]  [<ffffffff81cc2f07>] early_ioremap+0x13/0x15
> [    0.000000]  [<ffffffff81cbc2ad>] get_mpc_size+0x14/0x4c
> [    0.000000]  [<ffffffff81cbc3b1>] smp_scan_config+0xcc/0xfa
> [    0.000000]  [<ffffffff81cf3300>] ?
> firmware_map_add_hotplug+0xa4/0xa4
> [    0.000000]  [<ffffffff81cbcfb3>] default_find_smp_config+0x36/0x5a
> [    0.000000]  [<ffffffff81cb4770>] setup_arch+0x539/0xad7
> [    0.000000]  [<ffffffff81009ecf>] ?
> __raw_callee_save_xen_restore_fl+0x11/0x1e
> [    0.000000]  [<ffffffff81cf3300>] ?
> firmware_map_add_hotplug+0xa4/0xa4
> [    0.000000]  [<ffffffff81709534>] ? printk+0x3c/0x3e
> [    0.000000]  [<ffffffff8170c2ea>] ?
> _raw_spin_unlock_irqrestore+0x1a/0x20
> [    0.000000]  [<ffffffff81cf3300>] ?
> firmware_map_add_hotplug+0xa4/0xa4
> [    0.000000]  [<ffffffff81cae93b>] start_kernel+0x8e/0x359
> [    0.000000]  [<ffffffff81cae347>]
> x86_64_start_reservations+0x132/0x136
> [    0.000000]  [<ffffffff81cb1eac>] xen_start_kernel+0x5ef/0x5f6
> (XEN) Domain 0 crashed: 'noreboot' set - not rebooting.
> 
> --
> 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 Oct 25 12:27:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 12:27:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RImei-0005IT-Dq; Tue, 25 Oct 2011 12:27:24 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RImdL-0004jk-Nb
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:26:00 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-4.tower-27.messagelabs.com!1319570731!45943260!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12448 invoked from network); 25 Oct 2011 19:25:33 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-4.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 25 Oct 2011 19:25:33 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:6cb6:29ff:fef9:538a])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 0DF7E9975;
	Tue, 25 Oct 2011 12:25:54 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 652C9204F3;
	Tue, 25 Oct 2011 10:56:00 -0700 (PDT)
Message-ID: <4EA6F830.7010304@goop.org>
Date: Tue, 25 Oct 2011 10:56:00 -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: Peter Zijlstra <peterz@infradead.org>
References: <cover.1318464169.git.jeremy.fitzhardinge@citrix.com>
	<c133180533d7e520bb1e818e987117811a666fbc.1318464413.git.jeremy.fitzhardinge@citrix.com>
	<1318502628.24856.10.camel@twins> <4E98AEDD.4010503@goop.org>
	<1318668158.6594.0.camel@twins> <4E9A38FA.7030504@goop.org>
	<1318935720.21167.15.camel@twins>
In-Reply-To: <1318935720.21167.15.camel@twins>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: the arch/x86 maintainers <x86@kernel.org>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Jan Glauber <jang@linux.vnet.ibm.com>, Jason Baron <jbaron@redhat.com>,
	David Daney <david.daney@cavium.com>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	Steven Rostedt <rostedt@goodmis.org>,
	Michael Ellerman <michael@ellerman.id.au>,
	Xen Devel <xen-devel@lists.xensource.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Ingo Molnar <mingo@elte.hu>,
	"David S. Miller" <davem@davemloft.net>
Subject: [Xen-devel] Re: [PATCH RFC V4 10/10] jump-label: initialize
 jump-label subsystem much 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 10/18/2011 04:02 AM, Peter Zijlstra wrote:
> On Sat, 2011-10-15 at 18:52 -0700, Jeremy Fitzhardinge wrote:
>> On 10/15/2011 01:42 AM, Peter Zijlstra wrote:
>>> On Fri, 2011-10-14 at 14:51 -0700, Jeremy Fitzhardinge wrote:
>>>> How about this?  Proper comment and much earlier init.
>>> Looks good to me, thanks!
>> Should I take that as an ACK on the series?
> Yes, I don't see any problems with it,
>
> Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>

How should this go upstream?   Should I submit it, or does someone else
want to do it?

Thanks,
    J


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 12:34:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 12:34:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RImlI-0005nt-G3; Tue, 25 Oct 2011 12:34:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RImkg-0005bG-Pr
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:33:35 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319571210!738842!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10320 invoked from network); 25 Oct 2011 19:33:31 -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; 25 Oct 2011 19:33:31 -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
	p9PJXSbY028686
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 19:33:28 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
	p9PJXRf8025556
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 19:33:28 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
	p9PJXLWM014919; Tue, 25 Oct 2011 14:33:21 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 12:33:21 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id ACA5F82BFA; Tue, 25 Oct 2011 15:33:19 -0400 (EDT)
Date: Tue, 25 Oct 2011 15:33:19 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Tommy <thfbjhkhtdx@gmail.com>
Subject: Re: [Xen-devel] pci passthrough and live migration
Message-ID: <20111025193319.GA13068@phenom.dumpdata.com>
References: <4EA66636.30400@gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA66636.30400@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.0A090208.4EA70F09.004E,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, Oct 25, 2011 at 03:33:10PM +0800, Tommy wrote:
> Hello, everybody!
> 
> I've done some research on Xenlive migration recently.

XenLive? What is that? Oh, is that the CentOS4..
> 
> I've checked the maillist for pci passthrough and live migration, I
> can't figure out the current progress on them.

Did you check the Wiki?
> 
> Does Xen support live migration with pci passthrough? How about that
> with vga passthrough?

You can do it with SR-IOV, but normal PCI passthrough would not work that well.

> 
> If it is supported now, what extra configurations do I need?

It definitly is supported in the kernel.. you need to use 'pci-attach'
command and hardware that can do IOMMU if you want to do it with HVM.

If you want to do with PV, you need to pass 'iommu=soft' on the Linux
command line.


However, before the migration, you _must_ hot-unplug the pci-device - you
can use 'pci-detach' and then on the other end do 'pci-attach'.

I am not sure if the tools do this automatically but they might.
> 
> If not, could anyone give some ideas on what is the main difficulties
> for it?
> 
> At last, does anyone have some documents about this area?

Just search for SR-IOV and Xen.
> 
> Thanks!
> 
> 
> -- 
> 
> Yours Sincerely!
> 
> 

> _______________________________________________
> 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 Oct 25 12:42:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 12:42:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RImsx-0006YC-Cy; Tue, 25 Oct 2011 12:42:07 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RImsD-0006Hq-7h
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:41:21 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-13.tower-27.messagelabs.com!1319571662!45726698!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23706 invoked from network); 25 Oct 2011 19:41:02 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-13.tower-27.messagelabs.com with SMTP;
	25 Oct 2011 19:41:02 -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
	p9PJfEO2000666; Tue, 25 Oct 2011 19:41:14 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 p9PJfD4J013142; 
	Tue, 25 Oct 2011 15:41:14 -0400
Message-ID: <4EA710EB.3030809@tycho.nsa.gov>
Date: Tue, 25 Oct 2011 15:41:31 -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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024205708.GE2441@phenom.dumpdata.com>
	<4EA5E024.7040708@tycho.nsa.gov>
	<20111025190231.GD10062@phenom.dumpdata.com>
In-Reply-To: <20111025190231.GD10062@phenom.dumpdata.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: Ian.Jackson@eu.citrix.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	keir@xen.org
Subject: [Xen-devel] Re: [PATCH 2/2] xen/gnt{dev,
	alloc}: reserve event channels for notify
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 03:02 PM, Konrad Rzeszutek Wilk wrote:
>>> And cause the event channel refcnt to be set to zero and free it. And then
>>> causing the box to die - as the event channels for the physical IRQ might have
>>> gotten free-ed.
>>>
>>
>> Not really. For a given valid event channel E, this will increase the refcnt by one
>> when i == E, and then decrease refcnt the next time evtchn_get succeeds (for some
>> other value of i).
> 
> Oh right. Hmm.. I am having this feeling that it still makes sense to seperate the
> events that are allocated by grantdev/grantalloc from the ones that are done
> for in-kernel uses (such as IRQ, MSI, IPI, etc). Basically not trusting the userland
> with its arguments as much as possible.
> 
> And yes, I do understand that you need to be a root user to use /dev/gnt*, but
> I started thinking about QEMU. And Fedora has this concept of making QEMU run in its
> own SELinux container (and own user) - or perhaps I am confusing this with containers..
> Anyhow it runs in one of those quasi-root-but-not-root. My thinking is that it could
> be possible do with QEMU running under Xen too, but then we have to make sure
> that all /dev/gnt* ioctls are secure <hand-waving what secure means>.
> 
> It probably involves more than just what we discussed.

That same SELinux category-based isolation mechanism is also a good solution for xen
qemu-dm processes, although moving qemu to a stubdom provides better isolation since
SELinux currently cannot talk to XSM to determine what domains a particular qemu-dm 
process should be able to manipulate.

Only allowing event channels allocated by userspace to be used in gnt* notify is
a good idea, since there's no reason for userspace to need to manipulate an event
channel set up by the kernel.

>>
>>> Hm.. Perhaps the gntalloc and gntdev should keep track of which event channels
>>> are OK to refcnt? Something like a whitelist? Granted at that point the refcounting
>>> could as well be done by the API that sets up the event channels from the userspace.
>>
>> Hmm. Perhaps have a magic value for refcount (-1?) that indicates evtchn_get is not
>> available. That would become the default value of refcnt, and evtchn.c would then
>> use evtchn_make_refcounted() to change the refcount to 1 and allow _get/_put to work.
> 
> How would that work when the IRQ subsystem (so everything is setup in the kernel)
> gets an event? Would the refcount be for that -1.. oh. You would only set
> the refcnt when the _get/_put calls are made and not when in-kernel calls to setup
> IRQs are done?
> 

Right. The reference count would be a dual-purpose field indicating if the event
channel is kernel-internal (value -1) or userspace-visible (reference count > 0).
New event channels would start out at -1, and evtchn.c would change them to 1.

>>
>>> So the evtchn_ioctl is pretty smart. It uses "get_port_user" to get the list
>>> of events that belong to this user (and have been handed out). I think you
>>> need to use that in the gntalloc to double-check that the event channel is not
>>> one of the kernel type.
>>>
>>>> +	}
>>>>  
>>>>  	gref->notify.flags = 0;
>>>>  
>>>> @@ -396,6 +398,16 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
>>>>  		goto unlock_out;
>>>>  	}
>>>>  
>>>> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
>>>> +		if (evtchn_get(op.event_channel_port)) {
>>>> +			rc = -EINVAL;
>>>> +			goto unlock_out;
>>>> +		}
>>>> +	}
>>>> +
>>>> +	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
>>>> +		evtchn_put(gref->notify.event);
>>>> +
>>>>  	gref->notify.flags = op.action;
>>>>  	gref->notify.pgoff = pgoff;
>>>>  	gref->notify.event = op.event_channel_port;
>>>> diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
>>>> index f914b26..cfcc890 100644
>>>> --- a/drivers/xen/gntdev.c
>>>> +++ b/drivers/xen/gntdev.c
>>>> @@ -190,6 +190,7 @@ static void gntdev_put_map(struct grant_map *map)
>>>>  
>>>>  	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
>>>>  		notify_remote_via_evtchn(map->notify.event);
>>>> +		evtchn_put(map->notify.event);
>>>>  	}
>>>>  
>>>>  	if (map->pages) {
>>>> @@ -596,6 +597,16 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
>>>>  		goto unlock_out;
>>>>  	}
>>>>  
>>>> +	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
>>>> +		if (evtchn_get(op.event_channel_port)) {
>>>> +			rc = -EINVAL;
>>>> +			goto unlock_out;
>>>> +		}
>>>> +	}
>>>> +
>>>> +	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
>>>
>>> So notify.flags has not been set yet? That looks to be done later?
>>
>> Yep. It's the previous value (zero if we haven't called the ioctl yet).
> 
> OK, can you add a tiny comment so that in a year time the person reading this
> will have a warm fuzzy feeling..

OK

>>
>>> Or is this in case of the user doing
>>>
>>>  uargs.action = UNMAP_NOTIFY_SEND_EVENT;
>>>  ioctl(.., IOCTL_GNTALLOC_SET_UNMAP_NOTIFY, &uarg);
>>>  uargs.action = UNAMP_NOTIFY_CLEAR_BYTE;
>>>  ioctl(.., IOCTL_GNTALLOC_SET_UNMAP_NOTIFY, &uarg);
>>>
>>>  and we want to preserve the "old" flags before swapping over to the
>>> new?
>>
>> No. We acquire the new event channel before releasing the old one so that
>> if we happen to be the only one holding a reference to this event channel,
>> a change in the byte-clear portion of the notify does not cause us to drop
>> the event channel.
> 
> Ok.
>>
>>>> +		evtchn_put(map->notify.event);
>>>> +
>>>>  	map->notify.flags = op.action;
>>>>  	map->notify.addr = op.index - (map->index << PAGE_SHIFT);
>>>>  	map->notify.event = op.event_channel_port;
>>>> -- 
>>>> 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 Oct 25 12:48:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 12:48:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RImzS-0007Yz-3E; Tue, 25 Oct 2011 12:48:50 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RImym-0007MP-KK
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:48:08 -0700
X-Env-Sender: caker@theshore.net
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319572085!738592!1
X-Originating-IP: [67.18.92.50]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2286 invoked from network); 25 Oct 2011 19:48:05 -0000
Received: from ns.theshore.net (HELO www.theshore.net) (67.18.92.50)
	by server-7.tower-182.messagelabs.com with SMTP;
	25 Oct 2011 19:48:05 -0000
Received: from beefcake.linlan
	(173-161-199-49-Philadelphia.hfc.comcastbusiness.net
	[173.161.199.49])
	by www.theshore.net (8.13.6/8.9.1) with ESMTP id p9PJm0u2004666
	for <xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 15:48:00 -0400
Message-ID: <4EA71270.2050303@theshore.net>
Date: Tue, 25 Oct 2011 15:48:00 -0400
From: "Christopher S. Aker" <caker@theshore.net>
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US;
	rv:1.9.2.23) Gecko/20110920 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: xen devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Linux 3.1 domU + ext3 = WARNING: at fs/ext3/inode.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

Either right on boot, or shortly thereafter, the following occurs with 
either writeback or ordered filesystems.  Multiple reports, all 
different machines, different users...  Some people had success after I 
changed CONFIG_EXT3_DEFAULTS_TO_ORDERED off, however some still had 
problems...  That was my only config change from 3.0.4.  Them rebooting 
back into 3.0.4 fixed it.


------------[ cut here ]------------
WARNING: at fs/ext3/inode.c:1620 ext3_ordered_writepage+0x20a/0x230()
Modules linked in:
Pid: 2149, comm: flush-202:0 Not tainted 3.1.0-linode39 #1
Call Trace:
  [<c01346f8>] ? warn_slowpath_common+0x78/0xb0
  [<c025666a>] ? ext3_ordered_writepage+0x20a/0x230
  [<c025666a>] ? ext3_ordered_writepage+0x20a/0x230
  [<c013474b>] ? warn_slowpath_null+0x1b/0x20
  [<c025666a>] ? ext3_ordered_writepage+0x20a/0x230
  [<c01067e4>] ? check_events+0x8/0xc
  [<c018c3c8>] ? __writepage+0x8/0x30
  [<c018cbc6>] ? write_cache_pages+0x196/0x390
  [<c018c3c0>] ? set_page_dirty+0x60/0x60
  [<c018cdfe>] ? generic_writepages+0x3e/0x60
  [<c01d4ae5>] ? writeback_single_inode+0x115/0x2b0
  [<c0102b18>] ? xen_end_context_switch+0x8/0x10
  [<c01d52c1>] ? writeback_sb_inodes+0x171/0x210
  [<c01d58d5>] ? __writeback_inodes_wb+0x75/0xb0
  [<c01d5b31>] ? wb_writeback+0x1a1/0x1b0
  [<c0106007>] ? xen_force_evtchn_callback+0x17/0x30
  [<c01067e4>] ? check_events+0x8/0xc
  [<c01d5cef>] ? wb_do_writeback+0x1af/0x1c0
  [<c01d5d71>] ? bdi_writeback_thread+0x71/0x130
  [<c01d5d00>] ? wb_do_writeback+0x1c0/0x1c0
  [<c014e1a4>] ? kthread+0x74/0x80
  [<c014e130>] ? kthread_worker_fn+0x170/0x170
  [<c06c63b6>] ? kernel_thread_helper+0x6/0x10
---[ end trace 702f842be742d945 ]---


And a different user:
------------[ cut here ]------------
WARNING: at fs/ext3/inode.c:1695 ext3_writeback_writepage+0x12a/0x150()
Modules linked in:
Pid: 2146, comm: flush-202:0 Not tainted 3.1.0-linode39 #1
Call Trace:
  [<c01346f8>] ? warn_slowpath_common+0x78/0xb0
  [<c025643a>] ? ext3_writeback_writepage+0x12a/0x150
  [<c025643a>] ? ext3_writeback_writepage+0x12a/0x150
  [<c013474b>] ? warn_slowpath_null+0x1b/0x20
  [<c025643a>] ? ext3_writeback_writepage+0x12a/0x150
  [<c01067e4>] ? check_events+0x8/0xc
  [<c018c3c8>] ? __writepage+0x8/0x30
  [<c018cbc6>] ? write_cache_pages+0x196/0x390
  [<c018c3c0>] ? set_page_dirty+0x60/0x60
  [<c010dfd8>] ? sched_clock+0x8/0x10
  [<c0154452>] ? sched_clock_local+0xb2/0x190
  [<c018cdfe>] ? generic_writepages+0x3e/0x60
  [<c01d4ae5>] ? writeback_single_inode+0x115/0x2b0
  [<c0102b18>] ? xen_end_context_switch+0x8/0x10
  [<c01d52c1>] ? writeback_sb_inodes+0x171/0x210
  [<c01d58d5>] ? __writeback_inodes_wb+0x75/0xb0
  [<c01d5b31>] ? wb_writeback+0x1a1/0x1b0
  [<c0106007>] ? xen_force_evtchn_callback+0x17/0x30
  [<c01067e4>] ? check_events+0x8/0xc
  [<c01d5cef>] ? wb_do_writeback+0x1af/0x1c0
  [<c01d5d71>] ? bdi_writeback_thread+0x71/0x130
  [<c01d5d00>] ? wb_do_writeback+0x1c0/0x1c0
  [<c014e1a4>] ? kthread+0x74/0x80
  [<c014e130>] ? kthread_worker_fn+0x170/0x170
  [<c06c63b6>] ? kernel_thread_helper+0x6/0x10
---[ end trace 0a37bc36a180e73c ]---

Am I barking up the wrong list?

Thanks,
-Chris


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 12:52:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 12:52:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIn3T-0008FZ-AG; Tue, 25 Oct 2011 12:52:59 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIn2n-00083P-Ct
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:52:17 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319572332!1658535!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19136 invoked from network); 25 Oct 2011 19:52:13 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 25 Oct 2011 19:52: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
	p9PJq60V007812
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 19:52:07 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
	p9PJq3qO025565
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 19:52:04 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
	p9PJpvBA015592; Tue, 25 Oct 2011 14:51:57 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 12:51:57 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 9BE3782BFA; Tue, 25 Oct 2011 15:51:56 -0400 (EDT)
Date: Tue, 25 Oct 2011 15:51:56 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Message-ID: <20111025195156.GC13644@phenom.dumpdata.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024205708.GE2441@phenom.dumpdata.com>
	<4EA5E024.7040708@tycho.nsa.gov>
	<20111025190231.GD10062@phenom.dumpdata.com>
	<4EA710EB.3030809@tycho.nsa.gov>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA710EB.3030809@tycho.nsa.gov>
User-Agent: Mutt/1.5.21 (2010-09-15)
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090207.4EA71367.0092,ss=1,re=0.000,fgs=0
Cc: Ian.Jackson@eu.citrix.com, jeremy@goop.org, xen-devel@lists.xensource.com,
	keir@xen.org
Subject: [Xen-devel] Re: [PATCH 2/2] xen/gnt{dev,
	alloc}: reserve event channels for notify
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> That same SELinux category-based isolation mechanism is also a good solution for xen
> qemu-dm processes, although moving qemu to a stubdom provides better isolation since
> SELinux currently cannot talk to XSM to determine what domains a particular qemu-dm 
> process should be able to manipulate.

<nods>
> 
> Only allowing event channels allocated by userspace to be used in gnt* notify is
> a good idea, since there's no reason for userspace to need to manipulate an event
> channel set up by the kernel.
> 
.. snip..
> > 
> > How would that work when the IRQ subsystem (so everything is setup in the kernel)
> > gets an event? Would the refcount be for that -1.. oh. You would only set
> > the refcnt when the _get/_put calls are made and not when in-kernel calls to setup
> > IRQs are done?
> > 
> 
> Right. The reference count would be a dual-purpose field indicating if the event
> channel is kernel-internal (value -1) or userspace-visible (reference count > 0).
> New event channels would start out at -1, and evtchn.c would change them to 1.

The tricky bit is going to be with the xen_free_irq which might have to deal with kernel
events and grantdev events... oh wait, the event_put is going to decrement it and then
call xen_free_irq, so that will come out to be the right number.

Looking forward to the patches! Thanks for doing this work.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 12:56:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 12:56:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIn6r-0000Do-22; Tue, 25 Oct 2011 12:56:29 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43)
	id 1RIn6F-0008Su-NI; Tue, 25 Oct 2011 12:55:52 -0700
X-Env-Sender: ms@it-infrastrukturen.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319572547!1631282!1
X-Originating-IP: [88.198.203.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22907 invoked from network); 25 Oct 2011 19:55:47 -0000
Received: from srv1.born2b3.net (HELO srv1.born2b3.net) (88.198.203.66)
	by server-11.tower-21.messagelabs.com with SMTP;
	25 Oct 2011 19:55:47 -0000
Received: from [192.168.1.100] (84-73-66-195.dclient.hispeed.ch [84.73.66.195])
	by srv1.born2b3.net (Postfix) with ESMTPSA id 28034C0894;
	Tue, 25 Oct 2011 19:55:46 +0000 (UTC)
Message-ID: <4EA713AD.7000808@it-infrastrukturen.com>
Date: Tue, 25 Oct 2011 21:53:17 +0200
From: "M. Schneider" <ms@it-infrastrukturen.com>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.1.16) Gecko/20110307 Icedove/3.0.11
MIME-Version: 1.0
To: xen-users@lists.xensource.com
Content-Type: multipart/mixed; boundary="------------010000000301070406060603"
Cc: "M. Schneider" <ms@it-infrastrukturen.com>, Xen-devel@lists.xensource.com
Subject: [Xen-devel] 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

This is a multi-part message in MIME format.
--------------010000000301070406060603
Content-Type: multipart/alternative;
	boundary="------------030604070306080807060404"


--------------030604070306080807060404
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hello,

First thank you very much for *XCP 1.1*, the *vmvnc* script and helpful 
hints from both xen-lists!

I hope the description below "How to create and install CentOS PVMs with 
xe CLI on XCP 1.1" will be helpful for first steps without XenCenter (as 
it doesn't run on Linux yet). Installation of PVM for ubuntu 11.10 
server is very similar.

I strongly suggest to read documentation of XenServer 5.6 sp2 
(reference.pdf and guest.pdf) for better understanding.

Enjoy and feel free to add it to xen-wiki or to documentation if you 
find it useful .

regards, Mark

-- 
ms@it-infrastrukturen.org


*Installing of CentOS6 PVM (xe CLI / XCP 1.1)*

*# On the XCP 1.1 host*

# Prepare local iso repository
/var/opt/xen/iso_import/centos6
wget -Nc http://mirror.switch.ch/ftp/mirror/centos/6.0/isos/x86_64/CentOS-6.0-x86_64-minimal.iso
xe sr-create name-label=centos6 type=iso device-config:location=/var/opt/xen/iso_import/centos6 device-config:legacy_mode=true content-type=iso
xe cd-list

# Create and tune PVM
xe vm-install new-name-label=centos6dbrt20 sr-name-label=Local\ LVM\ SR\ DB-VM-pool  template=Other\ install\ media
xe vdi-create name-label="VDI centos6 dbrt20 server" sr-uuid=638d8bb3-4b08-f7c0-1e9d-2dc496b86c49 type=user sm-config:type=raw virtual-size=32GiB
xe vm-list

xe vm-param-set VCPUs-max=4 uuid=a4db5c10-a197-6200-fdca-60a9a231f261
xe vm-param-set VCPUs-at-startup=2 uuid=a4db5c10-a197-6200-fdca-60a9a231f261
xe vm-param-set memory-static-max=4GiB uuid=a4db5c10-a197-6200-fdca-60a9a231f261
xe vm-param-set memory-dynamic-max=4GiB uuid=a4db5c10-a197-6200-fdca-60a9a231f261
xe vm-param-set memory-dynamic-min=1GiB uuid=a4db5c10-a197-6200-fdca-60a9a231f261
xe vm-param-set memory-static-min=1GiB uuid=a4db5c10-a197-6200-fdca-60a9a231f261

xe vdi-create name-label="VDI centos6 dbrt20 server" sr-uuid=638d8bb3-4b08-f7c0-1e9d-2dc496b86c49 type=user sm-config:type=raw virtual-size=32GiB
xe vdi-list
xe vm-disk-add vm=centos6dbrt20 sr-uuid=638d8bb3-4b08-f7c0-1e9d-2dc496b86c49  device=0 disk-size=34359738368
xe vbd-list
xe vbd-param-set bootable=false uuid=878a2e9c-4efa-3daa-e5ad-5f98244d93c6

xe vm-list
xe network-list
xe vif-create vm-uuid=a4db5c10-a197-6200-fdca-60a9a231f261  network-uuid=9f6f2c37-090c-148a-1a99-134846808d10 mac=random device=0
xe vm-cd-add vm=centos6dbrt20 device=3 cd-name=CentOS-6.0-x86_64-minimal.iso
xe vm-cd-list vm=centos6dbrt20
xe vbd-param-set bootable=true uuid=c6ac1b61-fdf0-37c9-f6b5-aedcb74d8ba5
xe vm-param-set uuid=a4db5c10-a197-6200-fdca-60a9a231f261 other-config:install-repository=cdrom

# Start the installation of CentOS
xe vm-start vm=centos6dbrt20


*# On the linux client with vncviewer*
ironm@debian:~$ ./vmvnc -h 192.168.1.190 -g centos6dbrt20

# --- vmvnc script script
#!/bin/bash

function usage () {
     echo "Usage:"
     echo "   `basename $0` -h<xenserver host>   -g<guest vm name-label>"
     echo "   `basename $0` -h<xenserver host>   -u<guest vm uuid>"
     echo "   `basename $0` -h<xenserver host>   -d<domID>"
     exit 1
}

while getopts "h:g:u:d:" option
do
     case $option in
         h ) xs=${OPTARG} ;;
         g ) vm=${OPTARG} ;;
         u ) uu=${OPTARG} ;;
         d ) id=${OPTARG} ;;
         * ) usage
     esac
done

if [ -z ${xs} ]; then
     usage
fi

if [ -z ${uu} ]&&   [ -z ${vm} ]&&   [ -z ${id} ]; then
     usage
fi

if [ ! -z ${uu} ]; then
     domid=`ssh root@${xs} xe vm-list uuid=${uu} params=dom-id --minimal`
elif [ ! -z ${vm} ]; then
     domid=`ssh root@${xs} xe vm-list name-label=${vm} params=dom-id --minimal`
elif [ ! -z ${id} ]; then
     domid=${id}
fi

if [ -z ${domid} ]; then
     echo "Could not find guest ${vm}${uu} on host ${xs}."
     exit 1
elif [ ${domid} -lt 0 ]; then
     echo "Guest ${vm}${uu} has no dom-id. Is your vm running?"
     exit 1
fi

port=`ssh root@${xs} xenstore-read /local/domain/${domid}/console/vnc-port`

if [ -z ${port} ]; then
     echo "Couldn't read VNC port from xenstore. Is your vm running?"
     exit 1
fi

echo "Connecting to vnc port ${port} on host ${xs}..."

vncviewer -via root@${xs} localhost::${port}
# ---


--------------030604070306080807060404
Content-Type: text/html; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-15">
</head>
<body bgcolor="#ffffff" text="#000000">
Hello,<br>
<br>
First thank you very much for <font color="#3333ff"><b>XCP 1.1</b></font>,
the <b>vmvnc</b> script and helpful hints from both xen-lists!<br>
<br>
I hope the description below "How to create and install CentOS PVMs
with xe CLI on XCP 1.1" will be helpful for first steps without
XenCenter (as it doesn't run on Linux yet). Installation of PVM for
ubuntu 11.10 server is very similar.<br>
<br>
I strongly suggest to read documentation of XenServer 5.6 sp2
(reference.pdf and guest.pdf) for better understanding.<br>
<br>
Enjoy and feel free to add it to xen-wiki or to documentation if you
find it useful .<br>
<br>
<pre>regards, Mark

-- 
<a class="moz-txt-link-abbreviated" href="mailto:ms@it-infrastrukturen.org">ms@it-infrastrukturen.org</a>

</pre>
<font color="#3333ff"><b>Installing of CentOS6 PVM (xe CLI / XCP 1.1)</b></font><br>
<pre><b># On the XCP 1.1 host</b>

# Prepare local iso repository
/var/opt/xen/iso_import/centos6
wget -Nc <a class="moz-txt-link-freetext" href="http://mirror.switch.ch/ftp/mirror/centos/6.0/isos/x86_64/CentOS-6.0-x86_64-minimal.iso">http://mirror.switch.ch/ftp/mirror/centos/6.0/isos/x86_64/CentOS-6.0-x86_64-minimal.iso</a>
xe sr-create name-label=centos6 type=iso device-config:location=/var/opt/xen/iso_import/centos6 device-config:legacy_mode=true content-type=iso
xe cd-list

# Create and tune PVM
xe vm-install new-name-label=centos6dbrt20 sr-name-label=Local\ LVM\ SR\ DB-VM-pool  template=Other\ install\ media
xe vdi-create name-label="VDI centos6 dbrt20 server" sr-uuid=638d8bb3-4b08-f7c0-1e9d-2dc496b86c49 type=user sm-config:type=raw virtual-size=32GiB
xe vm-list

xe vm-param-set VCPUs-max=4 uuid=a4db5c10-a197-6200-fdca-60a9a231f261
xe vm-param-set VCPUs-at-startup=2 uuid=a4db5c10-a197-6200-fdca-60a9a231f261
xe vm-param-set memory-static-max=4GiB uuid=a4db5c10-a197-6200-fdca-60a9a231f261
xe vm-param-set memory-dynamic-max=4GiB uuid=a4db5c10-a197-6200-fdca-60a9a231f261
xe vm-param-set memory-dynamic-min=1GiB uuid=a4db5c10-a197-6200-fdca-60a9a231f261
xe vm-param-set memory-static-min=1GiB uuid=a4db5c10-a197-6200-fdca-60a9a231f261

xe vdi-create name-label="VDI centos6 dbrt20 server" sr-uuid=638d8bb3-4b08-f7c0-1e9d-2dc496b86c49 type=user sm-config:type=raw virtual-size=32GiB
xe vdi-list
xe vm-disk-add vm=centos6dbrt20 sr-uuid=638d8bb3-4b08-f7c0-1e9d-2dc496b86c49  device=0 disk-size=34359738368
xe vbd-list
xe vbd-param-set bootable=false uuid=878a2e9c-4efa-3daa-e5ad-5f98244d93c6

xe vm-list
xe network-list
xe vif-create vm-uuid=a4db5c10-a197-6200-fdca-60a9a231f261  network-uuid=9f6f2c37-090c-148a-1a99-134846808d10 mac=random device=0
xe vm-cd-add vm=centos6dbrt20 device=3 cd-name=CentOS-6.0-x86_64-minimal.iso
xe vm-cd-list vm=centos6dbrt20
xe vbd-param-set bootable=true uuid=c6ac1b61-fdf0-37c9-f6b5-aedcb74d8ba5
xe vm-param-set uuid=a4db5c10-a197-6200-fdca-60a9a231f261 other-config:install-repository=cdrom

# Start the installation of CentOS
<font color="#006600">xe vm-start vm=centos6dbrt20</font>


<b># On the linux client with vncviewer</b>
ironm@debian:~$ ./vmvnc -h 192.168.1.190 -g centos6dbrt20

# --- vmvnc script script
#!/bin/bash

function usage () {
    echo "Usage:"
    echo "   `basename $0` -h&lt;xenserver host&gt;  -g&lt;guest vm name-label&gt;"
    echo "   `basename $0` -h&lt;xenserver host&gt;  -u&lt;guest vm uuid&gt;"
    echo "   `basename $0` -h&lt;xenserver host&gt;  -d&lt;domID&gt;"
    exit 1
}

while getopts "h:g:u:d:" option
do
    case $option in
        h ) xs=${OPTARG} ;;
        g ) vm=${OPTARG} ;;
        u ) uu=${OPTARG} ;;
        d ) id=${OPTARG} ;;
        * ) usage
    esac
done

if [ -z ${xs} ]; then
    usage
fi

if [ -z ${uu} ]&amp;&amp;  [ -z ${vm} ]&amp;&amp;  [ -z ${id} ]; then
    usage
fi

if [ ! -z ${uu} ]; then
    domid=`ssh root@${xs} xe vm-list uuid=${uu} params=dom-id --minimal`
elif [ ! -z ${vm} ]; then
    domid=`ssh root@${xs} xe vm-list name-label=${vm} params=dom-id --minimal`
elif [ ! -z ${id} ]; then
    domid=${id}
fi

if [ -z ${domid} ]; then
    echo "Could not find guest ${vm}${uu} on host ${xs}."
    exit 1
elif [ ${domid} -lt 0 ]; then
    echo "Guest ${vm}${uu} has no dom-id. Is your vm running?"
    exit 1
fi

port=`ssh root@${xs} xenstore-read /local/domain/${domid}/console/vnc-port`

if [ -z ${port} ]; then
    echo "Couldn't read VNC port from xenstore. Is your vm running?"
    exit 1
fi

echo "Connecting to vnc port ${port} on host ${xs}..."

vncviewer -via root@${xs} localhost::${port}
# ---
</pre>
</body>
</html>

--------------030604070306080807060404--

--------------010000000301070406060603
Content-Type: text/plain;
 name="vmvnc"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="vmvnc"

#!/bin/bash

function usage () {
    echo "Usage:"
    echo "   `basename $0` -h <xenserver host> -g <guest vm name-label>"
    echo "   `basename $0` -h <xenserver host> -u <guest vm uuid>"
    echo "   `basename $0` -h <xenserver host> -d <domID>"
    exit 1
}

while getopts "h:g:u:d:" option
do
    case $option in
        h ) xs=${OPTARG} ;;
        g ) vm=${OPTARG} ;;
        u ) uu=${OPTARG} ;;
        d ) id=${OPTARG} ;;
        * ) usage
    esac
done

if [ -z ${xs} ]; then
    usage
fi

if [ -z ${uu} ] && [ -z ${vm} ] && [ -z ${id} ]; then
    usage
fi

if [ ! -z ${uu} ]; then
    domid=`ssh root@${xs} xe vm-list uuid=${uu} params=dom-id --minimal`
elif [ ! -z ${vm} ]; then
    domid=`ssh root@${xs} xe vm-list name-label=${vm} params=dom-id --minimal`
elif [ ! -z ${id} ]; then
    domid=${id}
fi

if [ -z ${domid} ]; then
    echo "Could not find guest ${vm}${uu} on host ${xs}."
    exit 1
elif [ ${domid} -lt 0 ]; then
    echo "Guest ${vm}${uu} has no dom-id. Is your vm running?"
    exit 1
fi

port=`ssh root@${xs} xenstore-read /local/domain/${domid}/console/vnc-port`

if [ -z ${port} ]; then
    echo "Couldn't read VNC port from xenstore. Is your vm running?"
    exit 1
fi

echo "Connecting to vnc port ${port} on host ${xs}..."

vncviewer -via root@${xs} localhost::${port}

--------------010000000301070406060603
Content-Type: text/plain;
 name="list-of-installed-VMs.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="list-of-installed-VMs.txt"

[root@xcp11db02 ~]# xe vm-list
uuid ( RO)           : 4133031a-e064-38e7-416d-72e1eb0a9118
     name-label ( RW): ubuntu11dbrt20
    power-state ( RO): running


uuid ( RO)           : c6f33171-eaa6-eb54-aff2-172625b14c39
     name-label ( RW): ubuntu11nfs20
    power-state ( RO): running


uuid ( RO)           : a4db5c10-a197-6200-fdca-60a9a231f261
     name-label ( RW): centos6dbrt20
    power-state ( RO): running


uuid ( RO)           : 9e0726af-580b-45db-b2ae-07cbc810ccb2
     name-label ( RW): Control domain on host: xcp11db02
    power-state ( RO): running


uuid ( RO)           : df72d730-519d-70d9-da18-acd778a6afd9
     name-label ( RW): ubuntu11dbp20
    power-state ( RO): running


--------------010000000301070406060603
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

--------------010000000301070406060603--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 13:09:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:09:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInJO-0000sy-B3; Tue, 25 Oct 2011 13:09:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RInIH-0000ev-Jl
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:08:18 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1319573293!1047437!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9547 invoked from network); 25 Oct 2011 20:08:14 -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; 25 Oct 2011 20:08:14 -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
	p9PK899G007991
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 20:08:09 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
	p9PK88Pe011910
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 20:08:08 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
	p9PK83S3028389; Tue, 25 Oct 2011 15:08:03 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 13:08:02 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id BA99782BFC; Tue, 25 Oct 2011 16:08:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, akpm@linux-foundation.org
Date: Tue, 25 Oct 2011 16:07:58 -0400
Message-Id: <1319573279-13867-3-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319573279-13867-1-git-send-email-konrad.wilk@oracle.com>
References: <1319573279-13867-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.4EA7172A.008E:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, david.vrabel@citrix.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 2/3] xen: use generic functions instead of
	xen_{alloc, free}_vm_area()
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>

Replace calls to the Xen-specific xen_alloc_vm_area() and
xen_free_vm_area() functions with the generic equivalent
(alloc_vm_area() and free_vm_area()).

On x86, these were identical already.

Signed-off-by: David Vrabel <david.vrabel@citrix.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/ia64/include/asm/xen/grant_table.h |   29 --------------
 arch/ia64/xen/grant-table.c             |   62 -------------------------------
 arch/x86/include/asm/xen/grant_table.h  |    7 ---
 arch/x86/xen/grant-table.c              |    2 +-
 drivers/xen/xenbus/xenbus_client.c      |    6 +-
 include/xen/grant_table.h               |    1 -
 6 files changed, 4 insertions(+), 103 deletions(-)
 delete mode 100644 arch/ia64/include/asm/xen/grant_table.h
 delete mode 100644 arch/x86/include/asm/xen/grant_table.h

diff --git a/arch/ia64/include/asm/xen/grant_table.h b/arch/ia64/include/asm/xen/grant_table.h
deleted file mode 100644
index 2b1fae0..0000000
--- a/arch/ia64/include/asm/xen/grant_table.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/******************************************************************************
- * arch/ia64/include/asm/xen/grant_table.h
- *
- * Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
- *                    VA Linux Systems Japan K.K.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 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 _ASM_IA64_XEN_GRANT_TABLE_H
-#define _ASM_IA64_XEN_GRANT_TABLE_H
-
-struct vm_struct *xen_alloc_vm_area(unsigned long size);
-void xen_free_vm_area(struct vm_struct *area);
-
-#endif /* _ASM_IA64_XEN_GRANT_TABLE_H */
diff --git a/arch/ia64/xen/grant-table.c b/arch/ia64/xen/grant-table.c
index 48cca37..c182813 100644
--- a/arch/ia64/xen/grant-table.c
+++ b/arch/ia64/xen/grant-table.c
@@ -31,68 +31,6 @@
 
 #include <asm/xen/hypervisor.h>
 
-struct vm_struct *xen_alloc_vm_area(unsigned long size)
-{
-	int order;
-	unsigned long virt;
-	unsigned long nr_pages;
-	struct vm_struct *area;
-
-	order = get_order(size);
-	virt = __get_free_pages(GFP_KERNEL, order);
-	if (virt == 0)
-		goto err0;
-	nr_pages = 1 << order;
-	scrub_pages(virt, nr_pages);
-
-	area = kmalloc(sizeof(*area), GFP_KERNEL);
-	if (area == NULL)
-		goto err1;
-
-	area->flags = VM_IOREMAP;
-	area->addr = (void *)virt;
-	area->size = size;
-	area->pages = NULL;
-	area->nr_pages = nr_pages;
-	area->phys_addr = 0;	/* xenbus_map_ring_valloc uses this field!  */
-
-	return area;
-
-err1:
-	free_pages(virt, order);
-err0:
-	return NULL;
-}
-EXPORT_SYMBOL_GPL(xen_alloc_vm_area);
-
-void xen_free_vm_area(struct vm_struct *area)
-{
-	unsigned int order = get_order(area->size);
-	unsigned long i;
-	unsigned long phys_addr = __pa(area->addr);
-
-	/* This area is used for foreign page mappping.
-	 * So underlying machine page may not be assigned. */
-	for (i = 0; i < (1 << order); i++) {
-		unsigned long ret;
-		unsigned long gpfn = (phys_addr >> PAGE_SHIFT) + i;
-		struct xen_memory_reservation reservation = {
-			.nr_extents   = 1,
-			.address_bits = 0,
-			.extent_order = 0,
-			.domid        = DOMID_SELF
-		};
-		set_xen_guest_handle(reservation.extent_start, &gpfn);
-		ret = HYPERVISOR_memory_op(XENMEM_populate_physmap,
-					   &reservation);
-		BUG_ON(ret != 1);
-	}
-	free_pages((unsigned long)area->addr, order);
-	kfree(area);
-}
-EXPORT_SYMBOL_GPL(xen_free_vm_area);
-
-
 /****************************************************************************
  * grant table hack
  * cmd: GNTTABOP_xxx
diff --git a/arch/x86/include/asm/xen/grant_table.h b/arch/x86/include/asm/xen/grant_table.h
deleted file mode 100644
index fdbbb45..0000000
--- a/arch/x86/include/asm/xen/grant_table.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _ASM_X86_XEN_GRANT_TABLE_H
-#define _ASM_X86_XEN_GRANT_TABLE_H
-
-#define xen_alloc_vm_area(size)	alloc_vm_area(size)
-#define xen_free_vm_area(area)	free_vm_area(area)
-
-#endif /* _ASM_X86_XEN_GRANT_TABLE_H */
diff --git a/arch/x86/xen/grant-table.c b/arch/x86/xen/grant-table.c
index 49ba9b5..6bbfd7a 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 =
-			xen_alloc_vm_area(PAGE_SIZE * max_nr_gframes);
+			alloc_vm_area(PAGE_SIZE * max_nr_gframes);
 		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 cdacf92..229d3ad 100644
--- a/drivers/xen/xenbus/xenbus_client.c
+++ b/drivers/xen/xenbus/xenbus_client.c
@@ -443,7 +443,7 @@ int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
 
 	*vaddr = NULL;
 
-	area = xen_alloc_vm_area(PAGE_SIZE);
+	area = alloc_vm_area(PAGE_SIZE);
 	if (!area)
 		return -ENOMEM;
 
@@ -453,7 +453,7 @@ int xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref, void **vaddr)
 		BUG();
 
 	if (op.status != GNTST_okay) {
-		xen_free_vm_area(area);
+		free_vm_area(area);
 		xenbus_dev_fatal(dev, op.status,
 				 "mapping in shared page %d from domain %d",
 				 gnt_ref, dev->otherend_id);
@@ -552,7 +552,7 @@ int xenbus_unmap_ring_vfree(struct xenbus_device *dev, void *vaddr)
 		BUG();
 
 	if (op.status == GNTST_okay)
-		xen_free_vm_area(area);
+		free_vm_area(area);
 	else
 		xenbus_dev_error(dev, op.status,
 				 "unmapping page at handle %d error %d",
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
index b1fab6b..8a8bb76 100644
--- a/include/xen/grant_table.h
+++ b/include/xen/grant_table.h
@@ -43,7 +43,6 @@
 #include <xen/interface/grant_table.h>
 
 #include <asm/xen/hypervisor.h>
-#include <asm/xen/grant_table.h>
 
 #include <xen/features.h>
 
-- 
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 Oct 25 13:10:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:10:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInKi-0001HR-JD; Tue, 25 Oct 2011 13:10:48 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RInII-0000ew-SJ
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:08:19 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1319573294!1630630!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9871 invoked from network); 25 Oct 2011 20:08:15 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 25 Oct 2011 20:08:15 -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
	p9PK899c027901
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 20:08:10 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
	p9PK88BP003738
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 20:08:08 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
	p9PK83Kx028386; Tue, 25 Oct 2011 15:08:03 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 13:08:02 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id D39FC82BFD; Tue, 25 Oct 2011 16:08:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, akpm@linux-foundation.org
Date: Tue, 25 Oct 2011 16:07:59 -0400
Message-Id: <1319573279-13867-4-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319573279-13867-1-git-send-email-konrad.wilk@oracle.com>
References: <1319573279-13867-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.4EA7172A.00D0:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, xen-devel@lists.xensource.com,
	david.vrabel@citrix.com, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH 3/3] xen: map foreign pages for shared rings by
	updating the PTEs directly
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>

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.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 Oct 25 13:11:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:11:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInLi-0001f3-ML; Tue, 25 Oct 2011 13:11:50 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RInIJ-0000ex-D8
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:08:20 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319573294!1030498!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29036 invoked from network); 25 Oct 2011 20:08:15 -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; 25 Oct 2011 20:08:15 -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
	p9PK89G5027900
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 20:08:10 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
	p9PK88qN022845
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 20:08:08 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
	p9PK8226028381; Tue, 25 Oct 2011 15:08:02 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 13:08:02 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 1FAAB82BFA; Tue, 25 Oct 2011 16:08:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, akpm@linux-foundation.org
Date: Tue, 25 Oct 2011 16:07:56 -0400
Message-Id: <1319573279-13867-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.4EA7172A.00DF,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, david.vrabel@citrix.com
Subject: [Xen-devel] [PATCH] MMU bug-fixes in generic code that are mostly
	used by 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 was wondering if you could help. I've this bug-fix:
 [PATCH 1/3] x86/paravirt: PTE updates in k(un)map_atomic need to be

that you picked up some time ago in your tree and then dropped. I am not sure why it
was dropped but perhaps it is b/c I also had that patch in my linux-next and your tool
decided to drop it. Anyhow, was wondering if you would be OK giving it your
Ack or just pulling it in your tree for 3.2.

These two:
 [PATCH 2/3] xen: use generic functions instead of xen_{alloc,
 [PATCH 3/3] xen: map foreign pages for shared rings by updating the

remove what git commit d2fe97c3315a6a406540f74651e7430d9d51e671
	Author: David Vrabel <david.vrabel@citrix.com>
	Date:   Thu Sep 29 16:53:32 2011 +0100

	    xen: map foreign pages for shared rings by updating the PTEs directly

added in 3.1 with a more selective way instead of using the big hammer.

I was wondering if you would be OK ACK-ing those two or sticking them
in your tree for 3.2.

All of the patches are in:

 git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git stable/for-akpm-3.2

and the last two have also been sitting for some time in linux-next (and the first
one was there but it looks like I forgot to put it back there as I had thought
that Linus had picked it up.. argh).

 arch/ia64/include/asm/xen/grant_table.h |   29 --------------
 arch/ia64/xen/grant-table.c             |   62 -------------------------------
 arch/x86/include/asm/xen/grant_table.h  |    7 ---
 arch/x86/mm/highmem_32.c                |    2 +
 arch/x86/xen/grant-table.c              |    2 +-
 drivers/xen/xenbus/xenbus_client.c      |   15 +++++--
 include/linux/vmalloc.h                 |    2 +-
 include/xen/grant_table.h               |    1 -
 mm/vmalloc.c                            |   27 ++++++-------
 9 files changed, 27 insertions(+), 120 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 13:12:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:12:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInMp-00028Y-Mj; Tue, 25 Oct 2011 13:12:59 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RInIV-0000gG-Hf
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:08:40 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319573306!36659143!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12175 invoked from network); 25 Oct 2011 20:08:28 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 25 Oct 2011 20:08:28 -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
	p9PK8AMh027933
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 20:08: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
	p9PK89sZ020262
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 20:08:09 GMT
Received: from abhmt114.oracle.com (abhmt114.oracle.com [141.146.116.66])
	by acsmt358.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9PK83gM008619; Tue, 25 Oct 2011 15:08:03 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 13:08:03 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id A3CE0828B9; Tue, 25 Oct 2011 16:08:01 -0400 (EDT)
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, akpm@linux-foundation.org
Date: Tue, 25 Oct 2011 16:07:57 -0400
Message-Id: <1319573279-13867-2-git-send-email-konrad.wilk@oracle.com>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319573279-13867-1-git-send-email-konrad.wilk@oracle.com>
References: <1319573279-13867-1-git-send-email-konrad.wilk@oracle.com>
X-Source-IP: ucsinet22.oracle.com [156.151.31.94]
X-CT-RefId: str=0001.0A090203.4EA7172C.001A,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, x86@kernel.org,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Ingo Molnar <mingo@redhat.com>, david.vrabel@citrix.com,
	"H. Peter Anvin" <hpa@zytor.com>,
	Thomas Gleixner <tglx@linutronix.de>, stable@kernel.org
Subject: [Xen-devel] [PATCH 1/3] x86/paravirt: PTE updates in
	k(un)map_atomic need to be synchronous, regardless of lazy_mmu 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

This patch fixes an outstanding issue that has been reported since 2.6.37.
Under a heavy loaded machine processing "fork()" calls could keepover with:

BUG: unable to handle kernel paging request at f573fc8c
IP: [<c01abc54>] swap_count_continued+0x104/0x180
*pdpt = 000000002a3b9027 *pde = 0000000001bed067 *pte = 0000000000000000
Oops: 0000 [#1] SMP
Modules linked in:
Pid: 1638, comm: apache2 Not tainted 3.0.4-linode37 #1
EIP: 0061:[<c01abc54>] EFLAGS: 00210246 CPU: 3
EIP is at swap_count_continued+0x104/0x180
.. snip..
Call Trace:
 [<c01ac222>] ? __swap_duplicate+0xc2/0x160
 [<c01040f7>] ? pte_mfn_to_pfn+0x87/0xe0
 [<c01ac2e4>] ? swap_duplicate+0x14/0x40
 [<c01a0a6b>] ? copy_pte_range+0x45b/0x500
 [<c01a0ca5>] ? copy_page_range+0x195/0x200
 [<c01328c6>] ? dup_mmap+0x1c6/0x2c0
 [<c0132cf8>] ? dup_mm+0xa8/0x130
 [<c013376a>] ? copy_process+0x98a/0xb30
 [<c013395f>] ? do_fork+0x4f/0x280
 [<c01573b3>] ? getnstimeofday+0x43/0x100
 [<c010f770>] ? sys_clone+0x30/0x40
 [<c06c048d>] ? ptregs_clone+0x15/0x48
 [<c06bfb71>] ? syscall_call+0x7/0xb

The problem is that in copy_page_range we turn lazy mode on, and then
in swap_entry_free we call swap_count_continued which ends up in:

         map = kmap_atomic(page, KM_USER0) + offset;

and then later we touch *map.

Since we are running in batched mode (lazy) we don't actually set up the
PTE mappings and the kmap_atomic is not done synchronously and ends up
trying to dereference a page that has not been set.

Looking at kmap_atomic_prot_pfn, it uses 'arch_flush_lazy_mmu_mode' and
doing the same in kmap_atomic_prot and __kunmap_atomic makes the problem
go away.

Interestingly, git commit b8bcfe997e46150fedcc3f5b26b846400122fdd9
removed part of this to fix an interrupt issue - but it went to far
and did not consider this scenario.

CC: Thomas Gleixner <tglx@linutronix.de>
CC: Ingo Molnar <mingo@redhat.com>
CC: "H. Peter Anvin" <hpa@zytor.com>
CC: x86@kernel.org
CC: Peter Zijlstra <a.p.zijlstra@chello.nl>
CC: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
CC: stable@kernel.org
[v1: Redid the commit description per Jeremy's apt suggestion]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
 arch/x86/mm/highmem_32.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/arch/x86/mm/highmem_32.c b/arch/x86/mm/highmem_32.c
index b499626..f4f29b1 100644
--- a/arch/x86/mm/highmem_32.c
+++ b/arch/x86/mm/highmem_32.c
@@ -45,6 +45,7 @@ void *kmap_atomic_prot(struct page *page, pgprot_t prot)
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 	BUG_ON(!pte_none(*(kmap_pte-idx)));
 	set_pte(kmap_pte-idx, mk_pte(page, prot));
+	arch_flush_lazy_mmu_mode();
 
 	return (void *)vaddr;
 }
@@ -88,6 +89,7 @@ void __kunmap_atomic(void *kvaddr)
 		 */
 		kpte_clear_flush(kmap_pte-idx, vaddr);
 		kmap_atomic_idx_pop();
+		arch_flush_lazy_mmu_mode();
 	}
 #ifdef CONFIG_DEBUG_HIGHMEM
 	else {
-- 
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 Oct 25 13:15:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:15:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInPV-0003DX-NJ; Tue, 25 Oct 2011 13:15:45 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RInJy-00011G-Iy
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:10:04 -0700
X-Env-Sender: johneed@hotmail.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319573392!733504!1
X-Originating-IP: [65.55.34.91]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23719 invoked from network); 25 Oct 2011 20:09:53 -0000
Received: from col0-omc2-s17.col0.hotmail.com (HELO
	col0-omc2-s17.col0.hotmail.com) (65.55.34.91)
	by server-14.tower-182.messagelabs.com with SMTP;
	25 Oct 2011 20:09:53 -0000
Received: from COL119-W50 ([65.55.34.71]) by col0-omc2-s17.col0.hotmail.com
	with Microsoft SMTPSVC(6.0.3790.4675); 
	Tue, 25 Oct 2011 13:09:52 -0700
Message-ID: <COL119-W5023765948EB6ED67658CCA8EC0@phx.gbl>
X-Originating-IP: [124.169.33.18]
From: Windows Live <johneed@hotmail.com>
To: <xen-devel@lists.xensource.com>
Date: Wed, 26 Oct 2011 04:09:52 +0800
Importance: Normal
MIME-Version: 1.0
X-OriginalArrivalTime: 25 Oct 2011 20:09:52.0281 (UTC)
	FILETIME=[0E438890:01CC9352]
Subject: [Xen-devel] test structure missing 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>
Content-Type: multipart/mixed; boundary="===============0786038757=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0786038757==
Content-Type: multipart/alternative;
	boundary="_7e526d3f-3d7e-4dc2-add0-cd75729d77ab_"

--_7e526d3f-3d7e-4dc2-add0-cd75729d77ab_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


Noted the test phase was restricted in gentoo's ebuilds.  It  seems for goo=
d
reason.

The test structure is broken since it's missing its own files.
First
../../tools/libxc/xc_dom.h:17:31: fatal error: xen/libelf/libelf.h: No such
file or directory
I fixed that=2C the path is fixed with

sed -e 's:#include <xen/libelf.h>:#include <../../xen/
include/xen/libelf.h>:' -i ./tools/libxc/xc_dom.h

The next I couldn't fix.  The header is simply missing.

xen/lowlevel/xl/xl.c:210:25: fatal error: _pyxl_types.h: No such file or
directory

It's not there to be found!!!  From there ofcourse there's no way of gettin=
g
thru.  Removing reference to the header ofcourse lead to another mini disas=
ter.

-Ixen/lowlevel/xl -I/usr/include/python2.7 -c xen/lowlevel/xl/xl.c -o
build/temp.linux-x86_64-2.7/xen/lowlevel/xl/xl.o -fno-strict-aliasing
xen/lowlevel/xl/xl.c:210:1: warning: missing terminating " character
xen/lowlevel/xl/xl.c:210:1: error: missing terminating " character
xen/lowlevel/xl/xl.c: In function 'pyxl_list_domains':
xen/lowlevel/xl/xl.c:394:9: error: 'Py_dominfo' undeclared (first use in th=
is
function)
xen/lowlevel/xl/xl.c:394:9: note: each undeclared identifier is reported on=
ly
once for each function it appears in
xen/lowlevel/xl/xl.c:394:21: error: 'di' undeclared (first use in this
function)
xen/lowlevel/xl/xl.c: In function 'pyxl_pci_add':
xen/lowlevel/xl/xl.c:497:5: error: 'Py_device_pci' undeclared (first use in
this function)
xen/lowlevel/xl/xl.c:497:20: error: 'pci' undeclared (first use in this
function)
xen/lowlevel/xl/xl.c:506:27: error: expected expression before ')' token
xen/lowlevel/xl/xl.c: In function 'pyxl_pci_del':
xen/lowlevel/xl/xl.c:517:5: error: 'Py_device_pci' undeclared (first use in
this function)
xen/lowlevel/xl/xl.c:517:20: error: 'pci' undeclared (first use in this
function)
xen/lowlevel/xl/xl.c:527:27: error: expected expression before ')' token
xen/lowlevel/xl/xl.c: In function 'pyxl_pci_parse':
xen/lowlevel/xl/xl.c:538:5: error: 'Py_device_pci' undeclared (first use in
this function)
xen/lowlevel/xl/xl.c:538:20: error: 'pci' undeclared (first use in this
function)
xen/lowlevel/xl/xl.c: In function 'pyxl_pci_list_assignable':
xen/lowlevel/xl/xl.c:575:9: error: 'Py_device_pci' undeclared (first use in
this function)
xen/lowlevel/xl/xl.c:575:24: error: 'pd' undeclared (first use in this
function)
xen/lowlevel/xl/xl.c: In function 'pyxl_pci_list':
xen/lowlevel/xl/xl.c:611:9: error: 'Py_device_pci' undeclared (first use in
this function)
xen/lowlevel/xl/xl.c:611:24: error: 'pd' undeclared (first use in this
function)
xen/lowlevel/xl/xl.c: At top level:
xen/lowlevel/xl/xl.c:706:5: error: 'PKG' undeclared here (not in a function=
)
xen/lowlevel/xl/xl.c:706:9: error: expected '}' before string constant
xen/lowlevel/xl/xl.c: In function 'initxl':
xen/lowlevel/xl/xl.c:761:43: error: expected ')' before string constant
xen/lowlevel/xl/xl.c:761:43: error: too few arguments to function
'PyErr_NewException'
/usr/include/python2.7/pyerrors.h:223:24: note: declared here
error: command 'x86_64-pc-linux-gnu-gcc' failed with exit status 1
Build failed 0x100
make[1]: *** [test] Error 1
make[1]: Leaving directory
`/var/tmp/portage/portage/app-emulation/xen-4.1.2/work/xen-4.1.2/tools/pyth=
on'
make: *** [test] Error 2
 		 	   		  =

--_7e526d3f-3d7e-4dc2-add0-cd75729d77ab_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html>
<head>
<style><!--
.hmmessage P
{
margin:0px=3B
padding:0px
}
body.hmmessage
{
font-size: 10pt=3B
font-family:Tahoma
}
--></style>
</head>
<body class=3D'hmmessage'><div dir=3D'ltr'>
Noted the test phase was restricted in gentoo's ebuilds.  It  seems for goo=
d<br>reason.<br><br>The test structure is broken since it's missing its own=
 files.<br>First<br>../../tools/libxc/xc_dom.h:17:31: fatal error: xen/libe=
lf/libelf.h: No such<br>file or directory<br>I fixed that=2C the path is fi=
xed with<br><br>sed -e 's:#include &lt=3Bxen/libelf.h&gt=3B:#include &lt=3B=
../../xen/<br>include/xen/libelf.h&gt=3B:' -i ./tools/libxc/xc_dom.h<br><br=
>The next I couldn't fix.  The header is simply missing.<br><br>xen/lowleve=
l/xl/xl.c:210:25: fatal error: _pyxl_types.h: No such file or<br>directory<=
br><br>It's not there to be found!!!  From there ofcourse there's no way of=
 getting<br>thru.  Removing reference to the header ofcourse lead to anothe=
r mini disaster.<br><br>-Ixen/lowlevel/xl -I/usr/include/python2.7 -c xen/l=
owlevel/xl/xl.c -o<br>build/temp.linux-x86_64-2.7/xen/lowlevel/xl/xl.o -fno=
-strict-aliasing<br>xen/lowlevel/xl/xl.c:210:1: warning: missing terminatin=
g " character<br>xen/lowlevel/xl/xl.c:210:1: error: missing terminating " c=
haracter<br>xen/lowlevel/xl/xl.c: In function 'pyxl_list_domains':<br>xen/l=
owlevel/xl/xl.c:394:9: error: 'Py_dominfo' undeclared (first use in this<br=
>function)<br>xen/lowlevel/xl/xl.c:394:9: note: each undeclared identifier =
is reported only<br>once for each function it appears in<br>xen/lowlevel/xl=
/xl.c:394:21: error: 'di' undeclared (first use in this<br>function)<br>xen=
/lowlevel/xl/xl.c: In function 'pyxl_pci_add':<br>xen/lowlevel/xl/xl.c:497:=
5: error: 'Py_device_pci' undeclared (first use in<br>this function)<br>xen=
/lowlevel/xl/xl.c:497:20: error: 'pci' undeclared (first use in this<br>fun=
ction)<br>xen/lowlevel/xl/xl.c:506:27: error: expected expression before ')=
' token<br>xen/lowlevel/xl/xl.c: In function 'pyxl_pci_del':<br>xen/lowleve=
l/xl/xl.c:517:5: error: 'Py_device_pci' undeclared (first use in<br>this fu=
nction)<br>xen/lowlevel/xl/xl.c:517:20: error: 'pci' undeclared (first use =
in this<br>function)<br>xen/lowlevel/xl/xl.c:527:27: error: expected expres=
sion before ')' token<br>xen/lowlevel/xl/xl.c: In function 'pyxl_pci_parse'=
:<br>xen/lowlevel/xl/xl.c:538:5: error: 'Py_device_pci' undeclared (first u=
se in<br>this function)<br>xen/lowlevel/xl/xl.c:538:20: error: 'pci' undecl=
ared (first use in this<br>function)<br>xen/lowlevel/xl/xl.c: In function '=
pyxl_pci_list_assignable':<br>xen/lowlevel/xl/xl.c:575:9: error: 'Py_device=
_pci' undeclared (first use in<br>this function)<br>xen/lowlevel/xl/xl.c:57=
5:24: error: 'pd' undeclared (first use in this<br>function)<br>xen/lowleve=
l/xl/xl.c: In function 'pyxl_pci_list':<br>xen/lowlevel/xl/xl.c:611:9: erro=
r: 'Py_device_pci' undeclared (first use in<br>this function)<br>xen/lowlev=
el/xl/xl.c:611:24: error: 'pd' undeclared (first use in this<br>function)<b=
r>xen/lowlevel/xl/xl.c: At top level:<br>xen/lowlevel/xl/xl.c:706:5: error:=
 'PKG' undeclared here (not in a function)<br>xen/lowlevel/xl/xl.c:706:9: e=
rror: expected '}' before string constant<br>xen/lowlevel/xl/xl.c: In funct=
ion 'initxl':<br>xen/lowlevel/xl/xl.c:761:43: error: expected ')' before st=
ring constant<br>xen/lowlevel/xl/xl.c:761:43: error: too few arguments to f=
unction<br>'PyErr_NewException'<br>/usr/include/python2.7/pyerrors.h:223:24=
: note: declared here<br>error: command 'x86_64-pc-linux-gnu-gcc' failed wi=
th exit status 1<br>Build failed 0x100<br>make[1]: *** [test] Error 1<br>ma=
ke[1]: Leaving directory<br>`/var/tmp/portage/portage/app-emulation/xen-4.1=
.2/work/xen-4.1.2/tools/python'<br>make: *** [test] Error 2<br> 		 	   		  =
</div></body>
</html>=

--_7e526d3f-3d7e-4dc2-add0-cd75729d77ab_--


--===============0786038757==
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

--===============0786038757==--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 13:16:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:16:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInQJ-0003b9-SH; Tue, 25 Oct 2011 13:16:35 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RInMj-00025p-2u
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:12:53 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1319573538!43387358!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20320 invoked from network); 25 Oct 2011 20:12:19 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-3.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 25 Oct 2011 20: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
	p9PKCkGT013476
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 20:12:47 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
	p9PKCjdt019633
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 20:12:46 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
	p9PKCehr030631; Tue, 25 Oct 2011 15:12:40 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 13:12:40 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id EEE0082BFA; Tue, 25 Oct 2011 16:12:39 -0400 (EDT)
Date: Tue, 25 Oct 2011 16:12:39 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Christopher S. Aker" <caker@theshore.net>
Subject: Re: [Xen-devel] Linux 3.1 domU + ext3 = WARNING: at fs/ext3/inode.c
Message-ID: <20111025201239.GA13747@phenom.dumpdata.com>
References: <4EA71270.2050303@theshore.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA71270.2050303@theshore.net>
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.4EA7183F.00BD:SCFMA922111,ss=1,re=-4.000,fgs=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 Tue, Oct 25, 2011 at 03:48:00PM -0400, Christopher S. Aker wrote:
> Either right on boot, or shortly thereafter, the following occurs
> with either writeback or ordered filesystems.  Multiple reports, all
> different machines, different users...  Some people had success
> after I changed CONFIG_EXT3_DEFAULTS_TO_ORDERED off, however some
> still had problems...  That was my only config change from 3.0.4.
> Them rebooting back into 3.0.4 fixed it.

Oh, so this is 3.1 DomU kernel? And your Dom0 is 2.6.18?

What does the guest show for the disk? As in, is the barrier feature
enabled? 

.. snip
> ------------[ cut here ]------------
> WARNING: at fs/ext3/inode.c:1695 ext3_writeback_writepage+0x12a/0x150()
> Modules linked in:
> Pid: 2146, comm: flush-202:0 Not tainted 3.1.0-linode39 #1
> Call Trace:
>  [<c01346f8>] ? warn_slowpath_common+0x78/0xb0
>  [<c025643a>] ? ext3_writeback_writepage+0x12a/0x150
>  [<c025643a>] ? ext3_writeback_writepage+0x12a/0x150
>  [<c013474b>] ? warn_slowpath_null+0x1b/0x20
>  [<c025643a>] ? ext3_writeback_writepage+0x12a/0x150
>  [<c01067e4>] ? check_events+0x8/0xc
>  [<c018c3c8>] ? __writepage+0x8/0x30
>  [<c018cbc6>] ? write_cache_pages+0x196/0x390
>  [<c018c3c0>] ? set_page_dirty+0x60/0x60
>  [<c010dfd8>] ? sched_clock+0x8/0x10
>  [<c0154452>] ? sched_clock_local+0xb2/0x190
>  [<c018cdfe>] ? generic_writepages+0x3e/0x60
>  [<c01d4ae5>] ? writeback_single_inode+0x115/0x2b0
>  [<c0102b18>] ? xen_end_context_switch+0x8/0x10
>  [<c01d52c1>] ? writeback_sb_inodes+0x171/0x210
>  [<c01d58d5>] ? __writeback_inodes_wb+0x75/0xb0
>  [<c01d5b31>] ? wb_writeback+0x1a1/0x1b0
>  [<c0106007>] ? xen_force_evtchn_callback+0x17/0x30
>  [<c01067e4>] ? check_events+0x8/0xc
>  [<c01d5cef>] ? wb_do_writeback+0x1af/0x1c0
>  [<c01d5d71>] ? bdi_writeback_thread+0x71/0x130
>  [<c01d5d00>] ? wb_do_writeback+0x1c0/0x1c0
>  [<c014e1a4>] ? kthread+0x74/0x80
>  [<c014e130>] ? kthread_worker_fn+0x170/0x170
>  [<c06c63b6>] ? kernel_thread_helper+0x6/0x10
> ---[ end trace 0a37bc36a180e73c ]---
> 
> Am I barking up the wrong list?

Not sure.. It depends on what your dom0 version is and what
the backend is? blktap or blkback?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 13:28:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:28:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInbe-0004B7-Ge; Tue, 25 Oct 2011 13:28:18 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RInap-0003wb-I5
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:27:27 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319574412!54277582!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13273 invoked from network); 25 Oct 2011 20:26:52 -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;
	25 Oct 2011 20:26:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,405,1315180800"; 
   d="scan'208";a="8580512"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 20:27:23 +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, 25 Oct 2011 21:27:23 +0100
Subject: Re: [Xen-devel] Re: [PATCH 2/2] xen/gnt{dev,	alloc}: reserve event
	channels for notify
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
In-Reply-To: <4EA710EB.3030809@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024205708.GE2441@phenom.dumpdata.com>
	<4EA5E024.7040708@tycho.nsa.gov>
	<20111025190231.GD10062@phenom.dumpdata.com>
	<4EA710EB.3030809@tycho.nsa.gov>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Tue, 25 Oct 2011 21:27:23 +0100
Message-ID: <1319574443.16747.1.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "Keir \(Xen.org\)" <keir@xen.org>, "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.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 Tue, 2011-10-25 at 20:41 +0100, Daniel De Graaf wrote:
> 
> >> Hmm. Perhaps have a magic value for refcount (-1?) that indicates
> evtchn_get is not
> >> available. That would become the default value of refcnt, and
> evtchn.c would then
> >> use evtchn_make_refcounted() to change the refcount to 1 and allow
> _get/_put to work.
> > 
> > How would that work when the IRQ subsystem (so everything is setup
> in the kernel)
> > gets an event? Would the refcount be for that -1.. oh. You would
> only set
> > the refcnt when the _get/_put calls are made and not when in-kernel
> calls to setup> IRQs are done?
> > 
> 
> Right. The reference count would be a dual-purpose field indicating if
> the event channel is kernel-internal (value -1) or userspace-visible
> (reference count > 0). New event channels would start out at -1, and
> evtchn.c would change them to 1. 

Is there any way that the reference count could be made part of the
datastructures associated with the /dev/xen/evtchn driver instead of the
core evtchn.c stuff? That wouldreduce the chance of current or futures
users getting something wrong.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 13:34:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:34:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInhl-0004qY-LU; Tue, 25 Oct 2011 13:34:37 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43)
	id 1RInhB-0004e3-As; Tue, 25 Oct 2011 13:34:02 -0700
X-Env-Sender: ms@it-infrastrukturen.org
X-Msg-Ref: server-15.tower-216.messagelabs.com!1319574837!1047230!1
X-Originating-IP: [88.198.203.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24022 invoked from network); 25 Oct 2011 20:33:57 -0000
Received: from srv1.born2b3.net (HELO srv1.born2b3.net) (88.198.203.66)
	by server-15.tower-216.messagelabs.com with SMTP;
	25 Oct 2011 20:33:57 -0000
Received: from [192.168.1.100] (84-73-66-195.dclient.hispeed.ch [84.73.66.195])
	by srv1.born2b3.net (Postfix) with ESMTPSA id 8F26FC0894;
	Tue, 25 Oct 2011 20:33:56 +0000 (UTC)
Message-ID: <4EA71CA9.8000109@it-infrastrukturen.org>
Date: Tue, 25 Oct 2011 22:31:37 +0200
From: Mark Schneider <ms@it-infrastrukturen.org>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.1.16) Gecko/20110307 Icedove/3.0.11
MIME-Version: 1.0
To: Xen-devel@lists.xensource.com, xen-users@lists.xensource.com, 
	"M. Schneider" <ms@it-infrastrukturen.com>
Content-Type: multipart/mixed; boundary="------------020805050109070500030200"
Cc: 
Subject: [Xen-devel] Tuning of exported VM template files (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

This is a multi-part message in MIME format.
--------------020805050109070500030200
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hello,

How can I modify exported VM template (s. attachment) to fit particular 
requirements?
I would like to install them again after modifications for creating of 
new VMs.

Exported VM templates are binary files (kind of DB). Are there any tools 
to edit such VM template files? I have to use xe CLI / Linux tools 
(can't use XenCenter).

Another possibility would be to export a template from already modified 
installed VM. How? I didn't find any useful information in docs or on 
the net about this topic.

Thank you in advance for any hints.

regards, Mark

-- 
ms@it-infrastrukturen.org


ps. Example of VM structure
# ---
[root@xcp11db02 ~]# xe vm-list name-label=ubuntu11dbrt20 params=
uuid ( RO)                          : 4133031a-e064-38e7-416d-72e1eb0a9118
                     name-label ( RW): ubuntu11dbrt20
               name-description ( RW): Installed via xe CLI
                   user-version ( RW): 1
                  is-a-template ( RW): false
                  is-a-snapshot ( RO): false
                    snapshot-of ( RO):<not in database>
                      snapshots ( RO):
                  snapshot-time ( RO): 19700101T00:00:00Z
                  snapshot-info ( RO):
                         parent ( RO): 7c3081c0-5d69-5d9b-3c41-c162ded416ee
                       children ( RO):
              is-control-domain ( RO): false
                    power-state ( RO): running
                  memory-actual ( RO): 8589848576
                  memory-target ( RO):<expensive field>
                memory-overhead ( RO): 77594624
              memory-static-max ( RW): 8589934592
             memory-dynamic-max ( RW): 8589934592
             memory-dynamic-min ( RW): 2147483648
              memory-static-min ( RW): 134217728
               suspend-VDI-uuid ( RO):<not in database>
                   VCPUs-params (MRW):
                      VCPUs-max ( RW): 8
               VCPUs-at-startup ( RW): 4
         actions-after-shutdown ( RW): Destroy
           actions-after-reboot ( RW): Restart
            actions-after-crash ( RW): Restart
                  console-uuids (SRO): bd4b277b-6941-7111-7b24-6579ada555ca
                       platform (MRW): timeoffset: 0; nx: false; acpi: true; apic: true; pae: true; viridian: true
             allowed-operations (SRO): changing_dynamic_range; hard_reboot; hard_shutdown; pause; snapshot
             current-operations (SRO):
             blocked-operations (MRW):
            allowed-VBD-devices (SRO):<expensive field>
            allowed-VIF-devices (SRO):<expensive field>
                 possible-hosts ( RO):<expensive field>
                HVM-boot-policy ( RW): BIOS order
                HVM-boot-params (MRW): order: dc
          HVM-shadow-multiplier ( RW): 1.000
                      PV-kernel ( RW):
                     PV-ramdisk ( RW):
                        PV-args ( RW):
                 PV-legacy-args ( RW):
                  PV-bootloader ( RW):
             PV-bootloader-args ( RW):
            last-boot-CPU-flags ( RO):
               last-boot-record ( RO):<expensive field>
                    resident-on ( RO): 280e2816-2d45-4217-881e-e2ad4b423159
                       affinity ( RW):<not in database>
                   other-config (MRW): last_shutdown_time: 20111025T18:32:09Z; last_shutdown_action: Restart; last_shutdown_initiator: external; last_shutdown_reason: rebooted; mac_seed: a507ca72-1a89-e83d-a1b1-1ee749e6088f; install-methods: cdrom
                         dom-id ( RO): 6
                recommendations ( RO):<restrictions><restriction field="memory-static-max" max="34359738368" /><restriction field="vcpus-max" max="8" /><restriction property="number-of-vbds" max="7" /><restriction property="number-of-vifs" max="7" /></restrictions>
                  xenstore-data (MRW):
                  ha-always-run ( RW): false
            ha-restart-priority ( RW):
                          blobs ( RO):
                     start-time ( RO): 20111025T18:32:29Z
                   install-time ( RO): 20111024T17:22:55Z
                   VCPUs-number ( RO): 4
              VCPUs-utilisation (MRO):<expensive field>
                     os-version (MRO):<not in database>
             PV-drivers-version (MRO):<not in database>
          PV-drivers-up-to-date ( RO):<not in database>
                         memory (MRO):<not in database>
                          disks (MRO):<not in database>
                       networks (MRO):<not in database>
                          other (MRO):<not in database>
                           live ( RO):<not in database>
     guest-metrics-last-updated ( RO):<not in database>
                    cooperative ( RO):<expensive field>
              protection-policy ( RW):<not in database>
          is-snapshot-from-vmpp ( RO): false
                           tags (SRW):



--------------020805050109070500030200
Content-Type: application/octet-stream;
 name="Other-linux-template"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="Other-linux-template"

b3ZhLnhtbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAA
MDAwMDAwMAAwMDAwMDAwADAwMDAwMDE0NTU3ADAwMDAwMDAwMDAwADAwMDU3NTMAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8dmFsdWU+PHN0cnVjdD48bWVtYmVyPjxuYW1l
PnZlcnNpb248L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+PG1lbWJlcj48bmFtZT5ob3N0bmFtZTwv
bmFtZT48dmFsdWU+a2lmZnUtMjwvdmFsdWU+PC9tZW1iZXI+PG1lbWJlcj48bmFtZT5kYXRl
PC9uYW1lPjx2YWx1ZT4yMDExLTA5LTE5PC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1l
PnByb2R1Y3RfdmVyc2lvbjwvbmFtZT48dmFsdWU+MS4xLjA8L3ZhbHVlPjwvbWVtYmVyPjxt
ZW1iZXI+PG5hbWU+cHJvZHVjdF9icmFuZDwvbmFtZT48dmFsdWU+WENQPC92YWx1ZT48L21l
bWJlcj48bWVtYmVyPjxuYW1lPmJ1aWxkX251bWJlcjwvbmFtZT48dmFsdWU+NTA2NzRjPC92
YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPnhhcGlfbWFqb3I8L25hbWU+PHZhbHVlPjE8
L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+eGFwaV9taW5vcjwvbmFtZT48dmFsdWU+
MzwvdmFsdWU+PC9tZW1iZXI+PG1lbWJlcj48bmFtZT5leHBvcnRfdnNuPC9uYW1lPjx2YWx1
ZT4yPC92YWx1ZT48L21lbWJlcj48L3N0cnVjdD48L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+
PG5hbWU+b2JqZWN0czwvbmFtZT48dmFsdWU+PGFycmF5PjxkYXRhPjx2YWx1ZT48c3RydWN0
PjxtZW1iZXI+PG5hbWU+Y2xhc3M8L25hbWU+PHZhbHVlPlZNPC92YWx1ZT48L21lbWJlcj48
bWVtYmVyPjxuYW1lPmlkPC9uYW1lPjx2YWx1ZT5SZWY6MDwvdmFsdWU+PC9tZW1iZXI+PG1l
bWJlcj48bmFtZT5zbmFwc2hvdDwvbmFtZT48dmFsdWU+PHN0cnVjdD48bWVtYmVyPjxuYW1l
PnV1aWQ8L25hbWU+PHZhbHVlPjdjMzA4MWMwLTVkNjktNWQ5Yi0zYzQxLWMxNjJkZWQ0MTZl
ZTwvdmFsdWU+PC9tZW1iZXI+PG1lbWJlcj48bmFtZT5hbGxvd2VkX29wZXJhdGlvbnM8L25h
bWU+PHZhbHVlPjxhcnJheT48ZGF0YS8+PC9hcnJheT48L3ZhbHVlPjwvbWVtYmVyPjxtZW1i
ZXI+PG5hbWU+Y3VycmVudF9vcGVyYXRpb25zPC9uYW1lPjx2YWx1ZT48c3RydWN0Lz48L3Zh
bHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+cG93ZXJfc3RhdGU8L25hbWU+PHZhbHVlPkhh
bHRlZDwvdmFsdWU+PC9tZW1iZXI+PG1lbWJlcj48bmFtZT5uYW1lX2xhYmVsPC9uYW1lPjx2
YWx1ZT5PdGhlciBpbnN0YWxsIG1lZGlhPC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1l
Pm5hbWVfZGVzY3JpcHRpb248L25hbWU+PHZhbHVlPlRlbXBsYXRlIHdoaWNoIGFsbG93cyBW
TSBpbnN0YWxsYXRpb24gZnJvbSBpbnN0YWxsIG1lZGlhPC92YWx1ZT48L21lbWJlcj48bWVt
YmVyPjxuYW1lPnVzZXJfdmVyc2lvbjwvbmFtZT48dmFsdWU+MTwvdmFsdWU+PC9tZW1iZXI+
PG1lbWJlcj48bmFtZT5pc19hX3RlbXBsYXRlPC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4xPC9i
b29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+PG1lbWJlcj48bmFtZT5zdXNwZW5kX1ZESTwvbmFt
ZT48dmFsdWU+T3BhcXVlUmVmOk5VTEw8L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+
cmVzaWRlbnRfb248L25hbWU+PHZhbHVlPlJlZjoxPC92YWx1ZT48L21lbWJlcj48bWVtYmVy
PjxuYW1lPmFmZmluaXR5PC9uYW1lPjx2YWx1ZT5SZWY6MTwvdmFsdWU+PC9tZW1iZXI+PG1l
bWJlcj48bmFtZT5tZW1vcnlfb3ZlcmhlYWQ8L25hbWU+PHZhbHVlPjUyNDI4ODA8L3ZhbHVl
PjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+bWVtb3J5X3RhcmdldDwvbmFtZT48dmFsdWU+MjY4
NDM1NDU2PC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPm1lbW9yeV9zdGF0aWNfbWF4
PC9uYW1lPjx2YWx1ZT4yNjg0MzU0NTY8L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+
bWVtb3J5X2R5bmFtaWNfbWF4PC9uYW1lPjx2YWx1ZT4yNjg0MzU0NTY8L3ZhbHVlPjwvbWVt
YmVyPjxtZW1iZXI+PG5hbWU+bWVtb3J5X2R5bmFtaWNfbWluPC9uYW1lPjx2YWx1ZT4yNjg0
MzU0NTY8L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+bWVtb3J5X3N0YXRpY19taW48
L25hbWU+PHZhbHVlPjEzNDIxNzcyODwvdmFsdWU+PC9tZW1iZXI+PG1lbWJlcj48bmFtZT5W
Q1BVc19wYXJhbXM8L25hbWU+PHZhbHVlPjxzdHJ1Y3QvPjwvdmFsdWU+PC9tZW1iZXI+PG1l
bWJlcj48bmFtZT5WQ1BVc19tYXg8L25hbWU+PHZhbHVlPjE8L3ZhbHVlPjwvbWVtYmVyPjxt
ZW1iZXI+PG5hbWU+VkNQVXNfYXRfc3RhcnR1cDwvbmFtZT48dmFsdWU+MTwvdmFsdWU+PC9t
ZW1iZXI+PG1lbWJlcj48bmFtZT5hY3Rpb25zX2FmdGVyX3NodXRkb3duPC9uYW1lPjx2YWx1
ZT5kZXN0cm95PC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPmFjdGlvbnNfYWZ0ZXJf
cmVib290PC9uYW1lPjx2YWx1ZT5yZXN0YXJ0PC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxu
YW1lPmFjdGlvbnNfYWZ0ZXJfY3Jhc2g8L25hbWU+PHZhbHVlPnJlc3RhcnQ8L3ZhbHVlPjwv
bWVtYmVyPjxtZW1iZXI+PG5hbWU+Y29uc29sZXM8L25hbWU+PHZhbHVlPjxhcnJheT48ZGF0
YS8+PC9hcnJheT48L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+VklGczwvbmFtZT48
dmFsdWU+PGFycmF5PjxkYXRhLz48L2FycmF5PjwvdmFsdWU+PC9tZW1iZXI+PG1lbWJlcj48
bmFtZT5WQkRzPC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRhdGEvPjwvYXJyYXk+PC92YWx1ZT48
L21lbWJlcj48bWVtYmVyPjxuYW1lPmNyYXNoX2R1bXBzPC9uYW1lPjx2YWx1ZT48YXJyYXk+
PGRhdGEvPjwvYXJyYXk+PC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPlZUUE1zPC9u
YW1lPjx2YWx1ZT48YXJyYXk+PGRhdGEvPjwvYXJyYXk+PC92YWx1ZT48L21lbWJlcj48bWVt
YmVyPjxuYW1lPlBWX2Jvb3Rsb2FkZXI8L25hbWU+PHZhbHVlLz48L21lbWJlcj48bWVtYmVy
PjxuYW1lPlBWX2tlcm5lbDwvbmFtZT48dmFsdWUvPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+
UFZfcmFtZGlzazwvbmFtZT48dmFsdWUvPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+UFZfYXJn
czwvbmFtZT48dmFsdWUvPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+UFZfYm9vdGxvYWRlcl9h
cmdzPC9uYW1lPjx2YWx1ZS8+PC9tZW1iZXI+PG1lbWJlcj48bmFtZT5QVl9sZWdhY3lfYXJn
czwvbmFtZT48dmFsdWUvPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+SFZNX2Jvb3RfcG9saWN5
PC9uYW1lPjx2YWx1ZT5CSU9TIG9yZGVyPC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1l
PkhWTV9ib290X3BhcmFtczwvbmFtZT48dmFsdWU+PHN0cnVjdD48bWVtYmVyPjxuYW1lPm9y
ZGVyPC9uYW1lPjx2YWx1ZT5kYzwvdmFsdWU+PC9tZW1iZXI+PC9zdHJ1Y3Q+PC92YWx1ZT48
L21lbWJlcj48bWVtYmVyPjxuYW1lPkhWTV9zaGFkb3dfbXVsdGlwbGllcjwvbmFtZT48dmFs
dWU+PGRvdWJsZT4xPC9kb3VibGU+PC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPnBs
YXRmb3JtPC9uYW1lPjx2YWx1ZT48c3RydWN0PjxtZW1iZXI+PG5hbWU+bng8L25hbWU+PHZh
bHVlPmZhbHNlPC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPmFjcGk8L25hbWU+PHZh
bHVlPnRydWU8L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+YXBpYzwvbmFtZT48dmFs
dWU+dHJ1ZTwvdmFsdWU+PC9tZW1iZXI+PG1lbWJlcj48bmFtZT5wYWU8L25hbWU+PHZhbHVl
PnRydWU8L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+dmlyaWRpYW48L25hbWU+PHZh
bHVlPnRydWU8L3ZhbHVlPjwvbWVtYmVyPjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+PG1l
bWJlcj48bmFtZT5QQ0lfYnVzPC9uYW1lPjx2YWx1ZS8+PC9tZW1iZXI+PG1lbWJlcj48bmFt
ZT5vdGhlcl9jb25maWc8L25hbWU+PHZhbHVlPjxzdHJ1Y3Q+PG1lbWJlcj48bmFtZT5tYWNf
c2VlZDwvbmFtZT48dmFsdWU+MWE4OTZkNjUtM2U0OC02MTQ4LWRmZmQtYzNmNDY5MmIzMWNl
PC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPmRlZmF1bHRfdGVtcGxhdGU8L25hbWU+
PHZhbHVlPnRydWU8L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+aW5zdGFsbC1tZXRo
b2RzPC9uYW1lPjx2YWx1ZT5jZHJvbTwvdmFsdWU+PC9tZW1iZXI+PC9zdHJ1Y3Q+PC92YWx1
ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPmRvbWlkPC9uYW1lPjx2YWx1ZT4tMTwvdmFsdWU+
PC9tZW1iZXI+PG1lbWJlcj48bmFtZT5kb21hcmNoPC9uYW1lPjx2YWx1ZS8+PC9tZW1iZXI+
PG1lbWJlcj48bmFtZT5sYXN0X2Jvb3RfQ1BVX2ZsYWdzPC9uYW1lPjx2YWx1ZT48c3RydWN0
Lz48L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+aXNfY29udHJvbF9kb21haW48L25h
bWU+PHZhbHVlPjxib29sZWFuPjA8L2Jvb2xlYW4+PC92YWx1ZT48L21lbWJlcj48bWVtYmVy
PjxuYW1lPm1ldHJpY3M8L25hbWU+PHZhbHVlPk9wYXF1ZVJlZjpOVUxMPC92YWx1ZT48L21l
bWJlcj48bWVtYmVyPjxuYW1lPmd1ZXN0X21ldHJpY3M8L25hbWU+PHZhbHVlPlJlZjoxPC92
YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPmxhc3RfYm9vdGVkX3JlY29yZDwvbmFtZT48
dmFsdWUvPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+cmVjb21tZW5kYXRpb25zPC9uYW1lPjx2
YWx1ZT4mbHQ7cmVzdHJpY3Rpb25zJmd0OyZsdDtyZXN0cmljdGlvbiBmaWVsZD0mcXVvdDtt
ZW1vcnktc3RhdGljLW1heCZxdW90OyBtYXg9JnF1b3Q7MzQzNTk3MzgzNjgmcXVvdDsgLyZn
dDsmbHQ7cmVzdHJpY3Rpb24gZmllbGQ9JnF1b3Q7dmNwdXMtbWF4JnF1b3Q7IG1heD0mcXVv
dDs4JnF1b3Q7IC8mZ3Q7Jmx0O3Jlc3RyaWN0aW9uIHByb3BlcnR5PSZxdW90O251bWJlci1v
Zi12YmRzJnF1b3Q7IG1heD0mcXVvdDs3JnF1b3Q7IC8mZ3Q7Jmx0O3Jlc3RyaWN0aW9uIHBy
b3BlcnR5PSZxdW90O251bWJlci1vZi12aWZzJnF1b3Q7IG1heD0mcXVvdDs3JnF1b3Q7IC8m
Z3Q7Jmx0Oy9yZXN0cmljdGlvbnMmZ3Q7PC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1l
PnhlbnN0b3JlX2RhdGE8L25hbWU+PHZhbHVlPjxzdHJ1Y3QvPjwvdmFsdWU+PC9tZW1iZXI+
PG1lbWJlcj48bmFtZT5oYV9hbHdheXNfcnVuPC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9i
b29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+PG1lbWJlcj48bmFtZT5oYV9yZXN0YXJ0X3ByaW9y
aXR5PC9uYW1lPjx2YWx1ZS8+PC9tZW1iZXI+PG1lbWJlcj48bmFtZT5pc19hX3NuYXBzaG90
PC9uYW1lPjx2YWx1ZT48Ym9vbGVhbj4wPC9ib29sZWFuPjwvdmFsdWU+PC9tZW1iZXI+PG1l
bWJlcj48bmFtZT5zbmFwc2hvdF9vZjwvbmFtZT48dmFsdWU+T3BhcXVlUmVmOk5VTEw8L3Zh
bHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+c25hcHNob3RzPC9uYW1lPjx2YWx1ZT48YXJy
YXk+PGRhdGEvPjwvYXJyYXk+PC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPnNuYXBz
aG90X3RpbWU8L25hbWU+PHZhbHVlPjxkYXRlVGltZS5pc284NjAxPjE5NzAwMTAxVDAwOjAw
OjAwWjwvZGF0ZVRpbWUuaXNvODYwMT48L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+
dHJhbnNwb3J0YWJsZV9zbmFwc2hvdF9pZDwvbmFtZT48dmFsdWUvPjwvbWVtYmVyPjxtZW1i
ZXI+PG5hbWU+YmxvYnM8L25hbWU+PHZhbHVlPjxzdHJ1Y3QvPjwvdmFsdWU+PC9tZW1iZXI+
PG1lbWJlcj48bmFtZT50YWdzPC9uYW1lPjx2YWx1ZT48YXJyYXk+PGRhdGEvPjwvYXJyYXk+
PC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPmJsb2NrZWRfb3BlcmF0aW9uczwvbmFt
ZT48dmFsdWU+PHN0cnVjdC8+PC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1lPnNuYXBz
aG90X2luZm88L25hbWU+PHZhbHVlPjxzdHJ1Y3QvPjwvdmFsdWU+PC9tZW1iZXI+PG1lbWJl
cj48bmFtZT5zbmFwc2hvdF9tZXRhZGF0YTwvbmFtZT48dmFsdWUvPjwvbWVtYmVyPjxtZW1i
ZXI+PG5hbWU+cGFyZW50PC9uYW1lPjx2YWx1ZT5PcGFxdWVSZWY6TlVMTDwvdmFsdWU+PC9t
ZW1iZXI+PG1lbWJlcj48bmFtZT5jaGlsZHJlbjwvbmFtZT48dmFsdWU+PGFycmF5PjxkYXRh
Pjx2YWx1ZT5PcGFxdWVSZWY6MWRjNmEwZTQtMzU2Mi0wOWNhLWIzOTgtZjdkZTY3MjQxMDIx
PC92YWx1ZT48dmFsdWU+T3BhcXVlUmVmOmIzZGFiMTM2LTJkYjMtNDFjNy1iZjg3LTJlMjhl
MTk2ZWYyYjwvdmFsdWU+PHZhbHVlPk9wYXF1ZVJlZjozZDRiMGNmZi1lODg3LWIzNGYtMjJk
My0xMTNkZjRmOWUwM2I8L3ZhbHVlPjx2YWx1ZT5PcGFxdWVSZWY6NjYzMGNkYzUtNTJlMy04
NGFkLWM2M2UtYjAzZGRjMzljNzJjPC92YWx1ZT48L2RhdGE+PC9hcnJheT48L3ZhbHVlPjwv
bWVtYmVyPjxtZW1iZXI+PG5hbWU+Ymlvc19zdHJpbmdzPC9uYW1lPjx2YWx1ZT48c3RydWN0
Lz48L3ZhbHVlPjwvbWVtYmVyPjxtZW1iZXI+PG5hbWU+cHJvdGVjdGlvbl9wb2xpY3k8L25h
bWU+PHZhbHVlPk9wYXF1ZVJlZjpOVUxMPC92YWx1ZT48L21lbWJlcj48bWVtYmVyPjxuYW1l
PmlzX3NuYXBzaG90X2Zyb21fdm1wcDwvbmFtZT48dmFsdWU+PGJvb2xlYW4+MDwvYm9vbGVh
bj48L3ZhbHVlPjwvbWVtYmVyPjwvc3RydWN0PjwvdmFsdWU+PC9tZW1iZXI+PC9zdHJ1Y3Q+
PC92YWx1ZT48L2RhdGE+PC9hcnJheT48L3ZhbHVlPjwvbWVtYmVyPjwvc3RydWN0PjwvdmFs
dWU+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
--------------020805050109070500030200
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

--------------020805050109070500030200--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 13:38:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:38:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInld-00064E-Fo; Tue, 25 Oct 2011 13:38:37 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RInlC-0005sN-Jo
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:38:11 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319575087!36641458!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30791 invoked from network); 25 Oct 2011 20:38:07 -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;
	25 Oct 2011 20:38:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,405,1315180800"; 
   d="scan'208";a="8580824"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 20:38:07 +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, 25 Oct 2011 21:38:06 +0100
Subject: Re: [Xen-devel] test structure missing files
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Windows Live <johneed@hotmail.com>
In-Reply-To: <COL119-W5023765948EB6ED67658CCA8EC0@phx.gbl>
References: <COL119-W5023765948EB6ED67658CCA8EC0@phx.gbl>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Tue, 25 Oct 2011 21:38:06 +0100
Message-ID: <1319575086.16747.8.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 Tue, 2011-10-25 at 21:09 +0100, Windows Live wrote:
> Noted the test phase was restricted in gentoo's ebuilds. It seems for
> good
> reason.
> 
> The test structure is broken since it's missing its own files.
> First
> ../../tools/libxc/xc_dom.h:17:31: fatal error: xen/libelf/libelf.h: No
> such
> file or directory
> I fixed that, the path is fixed with
> 
> sed -e 's:#include <xen/libelf.h>:#include <../../xen/
> include/xen/libelf.h>:' -i ./tools/libxc/xc_dom.h

The right solution to this problem would be to add the correct -I<path>
to the relevant gcc invocation (perhaps via CFLAGS or similar). Messing
with the actual included filename will only end up breaking something
else.

Unfortunately you don't describe what version of Xen you are using, what
patches you have applied. what commands you are running or what you are
actually trying to achieve. Based on the above and below descriptions of
the sorts of things you have tried I rather suspect that your attempts
to "fix" things have made things worse.

Please read http://wiki.xen.org/xenwiki/AskingXenDevelQuestions and
http://wiki.xen.org/xenwiki/ReportingBugs , then revert your local
changes and report the original error which caused you to go down this
path.

Ian.

> The next I couldn't fix. The header is simply missing.
> 
> xen/lowlevel/xl/xl.c:210:25: fatal error: _pyxl_types.h: No such file
> or
> directory
> 
> It's not there to be found!!! From there ofcourse there's no way of
> getting
> thru. Removing reference to the header ofcourse lead to another mini
> disaster.
> 
> -Ixen/lowlevel/xl -I/usr/include/python2.7 -c xen/lowlevel/xl/xl.c -o
> build/temp.linux-x86_64-2.7/xen/lowlevel/xl/xl.o -fno-strict-aliasing
> xen/lowlevel/xl/xl.c:210:1: warning: missing terminating " character
> xen/lowlevel/xl/xl.c:210:1: error: missing terminating " character
> xen/lowlevel/xl/xl.c: In function 'pyxl_list_domains':
> xen/lowlevel/xl/xl.c:394:9: error: 'Py_dominfo' undeclared (first use
> in this
> function)
> xen/lowlevel/xl/xl.c:394:9: note: each undeclared identifier is
> reported only
> once for each function it appears in
> xen/lowlevel/xl/xl.c:394:21: error: 'di' undeclared (first use in this
> function)
> xen/lowlevel/xl/xl.c: In function 'pyxl_pci_add':
> xen/lowlevel/xl/xl.c:497:5: error: 'Py_device_pci' undeclared (first
> use in
> this function)
> xen/lowlevel/xl/xl.c:497:20: error: 'pci' undeclared (first use in
> this
> function)
> xen/lowlevel/xl/xl.c:506:27: error: expected expression before ')'
> token
> xen/lowlevel/xl/xl.c: In function 'pyxl_pci_del':
> xen/lowlevel/xl/xl.c:517:5: error: 'Py_device_pci' undeclared (first
> use in
> this function)
> xen/lowlevel/xl/xl.c:517:20: error: 'pci' undeclared (first use in
> this
> function)
> xen/lowlevel/xl/xl.c:527:27: error: expected expression before ')'
> token
> xen/lowlevel/xl/xl.c: In function 'pyxl_pci_parse':
> xen/lowlevel/xl/xl.c:538:5: error: 'Py_device_pci' undeclared (first
> use in
> this function)
> xen/lowlevel/xl/xl.c:538:20: error: 'pci' undeclared (first use in
> this
> function)
> xen/lowlevel/xl/xl.c: In function 'pyxl_pci_list_assignable':
> xen/lowlevel/xl/xl.c:575:9: error: 'Py_device_pci' undeclared (first
> use in
> this function)
> xen/lowlevel/xl/xl.c:575:24: error: 'pd' undeclared (first use in this
> function)
> xen/lowlevel/xl/xl.c: In function 'pyxl_pci_list':
> xen/lowlevel/xl/xl.c:611:9: error: 'Py_device_pci' undeclared (first
> use in
> this function)
> xen/lowlevel/xl/xl.c:611:24: error: 'pd' undeclared (first use in this
> function)
> xen/lowlevel/xl/xl.c: At top level:
> xen/lowlevel/xl/xl.c:706:5: error: 'PKG' undeclared here (not in a
> function)
> xen/lowlevel/xl/xl.c:706:9: error: expected '}' before string constant
> xen/lowlevel/xl/xl.c: In function 'initxl':
> xen/lowlevel/xl/xl.c:761:43: error: expected ')' before string
> constant
> xen/lowlevel/xl/xl.c:761:43: error: too few arguments to function
> 'PyErr_NewException'
> /usr/include/python2.7/pyerrors.h:223:24: note: declared here
> error: command 'x86_64-pc-linux-gnu-gcc' failed with exit status 1
> Build failed 0x100
> make[1]: *** [test] Error 1
> make[1]: Leaving directory
> `/var/tmp/portage/portage/app-emulation/xen-4.1.2/work/xen-4.1.2/tools/python'
> make: *** [test] Error 2
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 13:40:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:40:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInno-0006V9-T5; Tue, 25 Oct 2011 13:40:52 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RInnK-0006IO-Ru
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:40:23 -0700
X-Env-Sender: caker@theshore.net
X-Msg-Ref: server-10.tower-21.messagelabs.com!1319575217!1634809!1
X-Originating-IP: [67.18.92.50]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28806 invoked from network); 25 Oct 2011 20:40:17 -0000
Received: from ns.theshore.net (HELO www.theshore.net) (67.18.92.50)
	by server-10.tower-21.messagelabs.com with SMTP;
	25 Oct 2011 20:40:17 -0000
Received: from [192.168.200.106] (c-69-248-252-23.hsd1.nj.comcast.net
	[69.248.252.23])
	by www.theshore.net (8.13.6/8.9.1) with ESMTP id p9PKeFrY012073;
	Tue, 25 Oct 2011 16:40:15 -0400
Subject: Re: [Xen-devel] Linux 3.1 domU + ext3 = WARNING: at fs/ext3/inode.c
Mime-Version: 1.0 (Apple Message framework v1084)
Content-Type: text/plain; charset=us-ascii
From: "Christopher S. Aker" <caker@theshore.net>
In-Reply-To: <20111025201239.GA13747@phenom.dumpdata.com>
Date: Tue, 25 Oct 2011 16:40:09 -0400
Content-Transfer-Encoding: quoted-printable
Message-Id: <BCD23F9B-BB0B-429B-882C-80077B1D234F@theshore.net>
References: <4EA71270.2050303@theshore.net>
	<20111025201239.GA13747@phenom.dumpdata.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-Mailer: Apple Mail (2.1084)
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 Oct 25, 2011, at 4:12 PM, Konrad Rzeszutek Wilk wrote:
> Oh, so this is 3.1 DomU kernel? And your Dom0 is 2.6.18?
>=20
> What does the guest show for the disk? As in, is the barrier feature
> enabled?=20

2.6.18 dom0 and a 3.1.0 domU produces this on domU boot:

EXT3-fs (xvda): using internal journal
Adding 262140k swap on /dev/xvdb.  Priority:-1 extents:1 across:262140k =
SS
blkfront: barrier: empty write xvda op failed
blkfront: xvda: barrier or flush: disabled
end_request: I/O error, dev xvda, sector 1053048
end_request: I/O error, dev xvda, sector 1053048
Buffer I/O error on device xvda, logical block 131631
lost page write due to I/O error on xvda
Aborting journal on device xvda.
EXT3-fs (xvda): error: ext3_journal_start_sb: Detected aborted journal
EXT3-fs (xvda): error: remounting filesystem read-only

On my 3.0 based dom0 with a 3.1.0 domU blkfront doesn't complain - and I =
*think* 3.1 domU may actually work as expected -- initial tests couldn't =
get it to trace...

> .. snip
>>=20
>> Am I barking up the wrong list?
>=20
> Not sure.. It depends on what your dom0 version is and what
> the backend is? blktap or blkback?

blkback.

We suspected a dom0/domU incompatibility after doing some research.  =
Hopefully this can get resolved within the guest since we have literally =
thousands of 2.6.18 dom0s deployed and rebooting everyone is not my idea =
of a good time :)

Thanks,
-Chris


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 13:42:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:42:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInpW-0006zv-0W; Tue, 25 Oct 2011 13:42:38 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInov-0006kb-HN; Tue, 25 Oct 2011 13:42:02 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1319575317!745891!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20113 invoked from network); 25 Oct 2011 20:41:58 -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;
	25 Oct 2011 20:41:58 -0000
X-IronPort-AV: E=Sophos;i="4.69,405,1315180800"; 
   d="scan'208";a="8580864"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 20:41: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;
	Tue, 25 Oct 2011 21:41:56 +0100
Subject: Re: [Xen-devel] Tuning of exported VM template files (XCP 1.1)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Mark Schneider <ms@it-infrastrukturen.org>
In-Reply-To: <4EA71CA9.8000109@it-infrastrukturen.org>
References: <4EA71CA9.8000109@it-infrastrukturen.org>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Tue, 25 Oct 2011 21:41:56 +0100
Message-ID: <1319575316.16747.11.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "M. Schneider" <ms@it-infrastrukturen.com>,
	"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, 2011-10-25 at 21:31 +0100, Mark Schneider wrote:
> Hello,

Hi.

Please do not cross post to multiple lists, pick the one which best
suits your question. In this case questions regarding XCP and xe/xapi
are likely best addressed to the xen-api@ list.

Note also that xen-devel@ is a list for the discussion of the
development of Xen and not user support.

Ian.

> 
> How can I modify exported VM template (s. attachment) to fit particular 
> requirements?
> I would like to install them again after modifications for creating of 
> new VMs.
> 
> Exported VM templates are binary files (kind of DB). Are there any tools 
> to edit such VM template files? I have to use xe CLI / Linux tools 
> (can't use XenCenter).
> 
> Another possibility would be to export a template from already modified 
> installed VM. How? I didn't find any useful information in docs or on 
> the net about this topic.
> 
> Thank you in advance for any hints.
> 
> regards, Mark
> 
> -- 
> ms@it-infrastrukturen.org
> 
> 
> ps. Example of VM structure
> # ---
> [root@xcp11db02 ~]# xe vm-list name-label=ubuntu11dbrt20 params=
> uuid ( RO)                          : 4133031a-e064-38e7-416d-72e1eb0a9118
>                      name-label ( RW): ubuntu11dbrt20
>                name-description ( RW): Installed via xe CLI
>                    user-version ( RW): 1
>                   is-a-template ( RW): false
>                   is-a-snapshot ( RO): false
>                     snapshot-of ( RO):<not in database>
>                       snapshots ( RO):
>                   snapshot-time ( RO): 19700101T00:00:00Z
>                   snapshot-info ( RO):
>                          parent ( RO): 7c3081c0-5d69-5d9b-3c41-c162ded416ee
>                        children ( RO):
>               is-control-domain ( RO): false
>                     power-state ( RO): running
>                   memory-actual ( RO): 8589848576
>                   memory-target ( RO):<expensive field>
>                 memory-overhead ( RO): 77594624
>               memory-static-max ( RW): 8589934592
>              memory-dynamic-max ( RW): 8589934592
>              memory-dynamic-min ( RW): 2147483648
>               memory-static-min ( RW): 134217728
>                suspend-VDI-uuid ( RO):<not in database>
>                    VCPUs-params (MRW):
>                       VCPUs-max ( RW): 8
>                VCPUs-at-startup ( RW): 4
>          actions-after-shutdown ( RW): Destroy
>            actions-after-reboot ( RW): Restart
>             actions-after-crash ( RW): Restart
>                   console-uuids (SRO): bd4b277b-6941-7111-7b24-6579ada555ca
>                        platform (MRW): timeoffset: 0; nx: false; acpi: true; apic: true; pae: true; viridian: true
>              allowed-operations (SRO): changing_dynamic_range; hard_reboot; hard_shutdown; pause; snapshot
>              current-operations (SRO):
>              blocked-operations (MRW):
>             allowed-VBD-devices (SRO):<expensive field>
>             allowed-VIF-devices (SRO):<expensive field>
>                  possible-hosts ( RO):<expensive field>
>                 HVM-boot-policy ( RW): BIOS order
>                 HVM-boot-params (MRW): order: dc
>           HVM-shadow-multiplier ( RW): 1.000
>                       PV-kernel ( RW):
>                      PV-ramdisk ( RW):
>                         PV-args ( RW):
>                  PV-legacy-args ( RW):
>                   PV-bootloader ( RW):
>              PV-bootloader-args ( RW):
>             last-boot-CPU-flags ( RO):
>                last-boot-record ( RO):<expensive field>
>                     resident-on ( RO): 280e2816-2d45-4217-881e-e2ad4b423159
>                        affinity ( RW):<not in database>
>                    other-config (MRW): last_shutdown_time: 20111025T18:32:09Z; last_shutdown_action: Restart; last_shutdown_initiator: external; last_shutdown_reason: rebooted; mac_seed: a507ca72-1a89-e83d-a1b1-1ee749e6088f; install-methods: cdrom
>                          dom-id ( RO): 6
>                 recommendations ( RO):<restrictions><restriction field="memory-static-max" max="34359738368" /><restriction field="vcpus-max" max="8" /><restriction property="number-of-vbds" max="7" /><restriction property="number-of-vifs" max="7" /></restrictions>
>                   xenstore-data (MRW):
>                   ha-always-run ( RW): false
>             ha-restart-priority ( RW):
>                           blobs ( RO):
>                      start-time ( RO): 20111025T18:32:29Z
>                    install-time ( RO): 20111024T17:22:55Z
>                    VCPUs-number ( RO): 4
>               VCPUs-utilisation (MRO):<expensive field>
>                      os-version (MRO):<not in database>
>              PV-drivers-version (MRO):<not in database>
>           PV-drivers-up-to-date ( RO):<not in database>
>                          memory (MRO):<not in database>
>                           disks (MRO):<not in database>
>                        networks (MRO):<not in database>
>                           other (MRO):<not in database>
>                            live ( RO):<not in database>
>      guest-metrics-last-updated ( RO):<not in database>
>                     cooperative ( RO):<expensive field>
>               protection-policy ( RW):<not in database>
>           is-snapshot-from-vmpp ( RO): false
>                            tags (SRW):
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 13:45:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:45:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInsR-0008P1-Bq; Tue, 25 Oct 2011 13:45:39 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RInpB-0006pY-EE
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:42:18 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319575334!1041941!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27552 invoked from network); 25 Oct 2011 20:42:14 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-14.tower-216.messagelabs.com with SMTP;
	25 Oct 2011 20:42:14 -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
	p9PKg9cD012304; Tue, 25 Oct 2011 20:42:10 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 p9PKg9aM016200; 
	Tue, 25 Oct 2011 16:42:09 -0400
Message-ID: <4EA71F32.9040208@tycho.nsa.gov>
Date: Tue, 25 Oct 2011 16:42:26 -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: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Re: [PATCH 2/2] xen/gnt{dev,	alloc}: reserve event
	channels for notify
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024205708.GE2441@phenom.dumpdata.com>
	<4EA5E024.7040708@tycho.nsa.gov>
	<20111025190231.GD10062@phenom.dumpdata.com>
	<4EA710EB.3030809@tycho.nsa.gov>
	<1319574443.16747.1.camel@dagon.hellion.org.uk>
In-Reply-To: <1319574443.16747.1.camel@dagon.hellion.org.uk>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: "Keir \(Xen.org\)" <keir@xen.org>, "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.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 10/25/2011 04:27 PM, Ian Campbell wrote:
> On Tue, 2011-10-25 at 20:41 +0100, Daniel De Graaf wrote:
>>
>>>> Hmm. Perhaps have a magic value for refcount (-1?) that indicates
>> evtchn_get is not
>>>> available. That would become the default value of refcnt, and
>> evtchn.c would then
>>>> use evtchn_make_refcounted() to change the refcount to 1 and allow
>> _get/_put to work.
>>>
>>> How would that work when the IRQ subsystem (so everything is setup
>> in the kernel)
>>> gets an event? Would the refcount be for that -1.. oh. You would
>> only set
>>> the refcnt when the _get/_put calls are made and not when in-kernel
>> calls to setup> IRQs are done?
>>>
>>
>> Right. The reference count would be a dual-purpose field indicating if
>> the event channel is kernel-internal (value -1) or userspace-visible
>> (reference count > 0). New event channels would start out at -1, and
>> evtchn.c would change them to 1. 
> 
> Is there any way that the reference count could be made part of the
> datastructures associated with the /dev/xen/evtchn driver instead of the
> core evtchn.c stuff? That wouldreduce the chance of current or futures
> users getting something wrong.
> 
> Ian.

This would require that the gntdev and gntalloc modules have a dependency
on the evtchn module, with the evtchn_{get,put} functions moved into that
module. The only other way would be to add a refcount maintenance
function pointer to the IRQ data structure, which seems like it would lead
to more problems than a simple reference count.

-- 
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 Oct 25 13:46:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:46:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInti-0000QW-7w; Tue, 25 Oct 2011 13:46:58 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RInr2-0007lJ-9z
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:44:13 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1319575422!54690808!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32708 invoked from network); 25 Oct 2011 20:43:42 -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;
	25 Oct 2011 20:43:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,405,1315180800"; 
   d="scan'208";a="8580892"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 20:44: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;
	Tue, 25 Oct 2011 21:44:08 +0100
Subject: Re: [Xen-devel] Re: [PATCH 1/2] xen/event: Add reference counting
	to event channel
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
In-Reply-To: <20111025190944.GF10062@phenom.dumpdata.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-2-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024202242.GD2441@phenom.dumpdata.com>
	<1319530635.3385.215.camel@zakaz.uk.xensource.com>
	<20111025190944.GF10062@phenom.dumpdata.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Tue, 25 Oct 2011 21:44:07 +0100
Message-ID: <1319575447.16747.13.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>, "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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Tue, 2011-10-25 at 20:09 +0100, Konrad Rzeszutek Wilk wrote:
> On Tue, Oct 25, 2011 at 09:17:15AM +0100, Ian Campbell wrote:
> > On Mon, 2011-10-24 at 21:22 +0100, Konrad Rzeszutek Wilk wrote:
> > > 
> > > > +void evtchn_put(unsigned int evtchn)
> > > 
> > > The decleration for 'evtchn' is 'unsigned short' so that can be
> > > used instead of 'unsigned int'.
> > 
> > I think I nearly made the same comment but then I looked at
> > drivers/xen/events.c and found that it uses "unsigned", "unsigned
> > short", "unsigned int" and "int" fairly interchangeably. The externally
> > visible API (i.e. include/xen/events.h) tends to stick to just "unsigned
> > int" or "int".
> > 
> > The problem with the short types is that they don't leave room for an
> > error indication, which is why on the Xen tools (libxc) side we have his
> > piece of minor ugliness:
> >         typedef int evtchn_port_or_error_t;
> > 
> > The actual hypercall interface uses "typedef uint32_t evtchn_port_t" but
> > AIUI real evtchn values are guaranteed to fit in 31 bits.
> 
> 
> Oh fun! So we actually have a bug with 'unsigned short' cutting it down
> from 2^31 to 2^16!

The actual maximums are 1024 (on x86_32) and 4096 (on x86_64) so
"guaranteed to fit 31 bits" (which I took from the xenctrl.h comment) is
more a case of definitely big enough. The use of 31 is more of an
allusion to errors being negative, I think.

Ian


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 13:48:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:48:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInuk-0000p3-No; Tue, 25 Oct 2011 13:48:02 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RInuE-0000c8-6l
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:47:31 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1319575626!48139585!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4066 invoked from network); 25 Oct 2011 20:47:06 -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;
	25 Oct 2011 20:47:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,405,1315180800"; 
   d="scan'208";a="8580928"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 20:47: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; Tue, 25 Oct 2011 21:47:26 +0100
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 1RInuA-0000AT-3T;
	Tue, 25 Oct 2011 20:47:26 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RInu5-0003Un-BX;
	Tue, 25 Oct 2011 21:47:25 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9610-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 25 Oct 2011 21:47:21 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9610: 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 9610 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9610/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. vs. 9599

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-i386-i386-xl            15 guest-stop                   fail   never pass
 test-amd64-amd64-xl          15 guest-stop                   fail   never pass
 test-amd64-i386-xl-credit2   14 guest-localmigrate/x10    fail blocked in 9599
 test-amd64-i386-win          16 leak-check/check             fail   never pass
 test-amd64-i386-rhel6hvm-intel  7 redhat-install               fail never pass
 test-amd64-i386-rhel6hvm-amd  7 redhat-install               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-i386-i386-win           16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win       7 windows-install              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

version targeted for testing:
 xen                  a5cc3b953ed9
baseline version:
 xen                  da9f945b3db8

------------------------------------------------------------
People who touched revisions under test:
  Keir Fraser <keir@xen.org>
  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


Not pushing.

------------------------------------------------------------
changeset:   21551:a5cc3b953ed9
tag:         tip
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
    
    
changeset:   21550:da9f945b3db8
user:        Keir Fraser <keir@xen.org>
date:        Mon Oct 24 18:04:42 2011 +0100
    
    Revert xen-unstable:23871:503ee256fecf
    
    Signed-off-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 Tue Oct 25 13:51:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:51:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInxg-0001MC-0C; Tue, 25 Oct 2011 13:51:04 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RInxE-00017v-68
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:50:36 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319575832!36649224!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27590 invoked from network); 25 Oct 2011 20:50:33 -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;
	25 Oct 2011 20:50:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,405,1315180800"; 
   d="scan'208";a="8581003"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 20:50:32 +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, 25 Oct 2011 21:50:32 +0100
Subject: Re: [Xen-devel] Re: [PATCH 2/2] xen/gnt{dev,	alloc}: reserve event
	channels for notify
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
In-Reply-To: <4EA71F32.9040208@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024205708.GE2441@phenom.dumpdata.com>
	<4EA5E024.7040708@tycho.nsa.gov>
	<20111025190231.GD10062@phenom.dumpdata.com>
	<4EA710EB.3030809@tycho.nsa.gov>
	<1319574443.16747.1.camel@dagon.hellion.org.uk>
	<4EA71F32.9040208@tycho.nsa.gov>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Tue, 25 Oct 2011 21:50:31 +0100
Message-ID: <1319575831.16747.18.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: "Keir \(Xen.org\)" <keir@xen.org>, "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.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 Tue, 2011-10-25 at 21:42 +0100, Daniel De Graaf wrote:
> On 10/25/2011 04:27 PM, Ian Campbell wrote:
> > On Tue, 2011-10-25 at 20:41 +0100, Daniel De Graaf wrote:
> >>
> >>>> Hmm. Perhaps have a magic value for refcount (-1?) that indicates
> >> evtchn_get is not
> >>>> available. That would become the default value of refcnt, and
> >> evtchn.c would then
> >>>> use evtchn_make_refcounted() to change the refcount to 1 and allow
> >> _get/_put to work.
> >>>
> >>> How would that work when the IRQ subsystem (so everything is setup
> >> in the kernel)
> >>> gets an event? Would the refcount be for that -1.. oh. You would
> >> only set
> >>> the refcnt when the _get/_put calls are made and not when in-kernel
> >> calls to setup> IRQs are done?
> >>>
> >>
> >> Right. The reference count would be a dual-purpose field indicating if
> >> the event channel is kernel-internal (value -1) or userspace-visible
> >> (reference count > 0). New event channels would start out at -1, and
> >> evtchn.c would change them to 1. 
> > 
> > Is there any way that the reference count could be made part of the
> > datastructures associated with the /dev/xen/evtchn driver instead of the
> > core evtchn.c stuff? That wouldreduce the chance of current or futures
> > users getting something wrong.
> > 
> > Ian.
> 
> This would require that the gntdev and gntalloc modules have a dependency
> on the evtchn module, with the evtchn_{get,put} functions moved into that
> module.

Don't they effectively have that already, since the only evtchns you can
use with them have come from that module?

>  The only other way would be to add a refcount maintenance
> function pointer to the IRQ data structure, which seems like it would lead
> to more problems than a simple reference count.
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 13:52:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 13:52:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RInyf-0001kX-Sl; Tue, 25 Oct 2011 13:52:05 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIny6-0001WV-7R
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 13:51:30 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1319575886!36646348!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9516 invoked from network); 25 Oct 2011 20:51:27 -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;
	25 Oct 2011 20:51:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,405,1315180800"; 
   d="scan'208";a="8581146"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 20:51:26 +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, 25 Oct 2011 21:51:26 +0100
Subject: Re: [Xen-devel] RFC: Partially revert xen-unstable c/s
	23071:a3466b005017
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jonathan Ludlam <Jonathan.Ludlam@eu.citrix.com>
In-Reply-To: <4B438545-27B2-4922-9012-FA4FAC7A6EEF@eu.citrix.com>
References: <CAFLBxZaYwHe9VH4tSHFBt7jy-EzLjuN87kW0FChH0LOy=EvZnw@mail.gmail.com>
	<1318947065.3385.26.camel@zakaz.uk.xensource.com>
	<CAFLBxZYiM9_yT1+5nQx=5vTUbE6xLXi0cCLPDLVdhUhmDO5-NA@mail.gmail.com>
	<20134.57267.925456.677251@mariner.uk.xensource.com>
	<4B438545-27B2-4922-9012-FA4FAC7A6EEF@eu.citrix.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Tue, 25 Oct 2011 21:51:25 +0100
Message-ID: <1319575885.16747.19.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-Mailer: Evolution 2.32.3 
Content-Transfer-Encoding: 7bit
Cc: George Dunlap <George.Dunlap@eu.citrix.com>,
	"Keir \(Xen.org\)" <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

On Tue, 2011-10-25 at 18:01 +0100, Jonathan Ludlam wrote:
> For reference, here's what's executed when I build the xenctrl package in latest xen-unstable:
> 
> ocamlc -g -I ../mmap -w F -warn-error F -c -o xenctrl.cmi xenctrl.mli
> ocamlc -g -I ../mmap -w F -warn-error F -c -o xenctrl.cmo xenctrl.ml
> ocamlc -g -I ../mmap -w F -warn-error F -a -o xenctrl.cma  -dllib dllxenctrl_stubs.so -cclib -lxenctrl_stubs  xenctrl.cmo
> gcc -O1 -fno-omit-frame-pointer -m32 -march=i686 -g -fno-strict-aliasing -std=gnu99 -Wall -Wstrict-prototypes -Wno-unused-value -Wdeclaration-after-statement -Wno-unused-but-set-variable  -D__XEN_TOOLS__ -MMD -MF .xenctrl_stubs.o.d -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -fno-optimize-sibling-calls -mno-tls-direct-seg-refs -I/usr/lib/ocaml -fPIC -Werror -I../mmap -I/home/jon/xen-unstable.hg/tools/ocaml/libs/xc/../../../../tools/libxc -I/home/jon/xen-unstable.hg/tools/ocaml/libs/xc/../../../../tools/include -I/home/jon/xen-unstable.hg/tools/ocaml/libs/xc/../../../../tools/libxc -I/home/jon/xen-unstable.hg/tools/ocaml/libs/xc/../../../../tools/include -c -o xenctrl_stubs.o xenctrl_stubs.c
> ar rcs libxenctrl_stubs.a  xenctrl_stubs.o && ocamlmklib -o `basename libxenctrl_stubs.a .a | sed -e 's/^lib//'`  xenctrl_stubs.o
> ocamlopt -g -ccopt "  " -dtypes -I ../mmap -cc gcc -w F -warn-error F -c -o xenctrl.cmx xenctrl.ml
> ocamlopt -g -ccopt "  " -dtypes -I ../mmap -cc gcc -w F -warn-error F -a -o xenctrl.cmxa  -cclib -lxenctrl_stubs -cclib /home/jon/xen-unstable.hg/tools/ocaml/libs/xc/../../../../tools/libxc/libxenctrl.so -cclib /home/jon/xen-unstable.hg/tools/ocaml/libs/xc/../../../../tools/libxc/libxenguest.so  xenctrl.cmx
> 
> The -cclib arguments specify additional command-line arguments that 
> will be passed to gcc. When you're building a library (as we are here) 
> they are *not* used unless you link against the library that has been 
> produced.

Ah, I was under the impression that it was used at both library build
and link time. It just being the latter simplifies things...

Ian.

>  The reason that they are specified is that the ocaml compiler 
> will record the -cclib and -ccopt command line arguments in the library. 
> When you then link against that library later, it will behave as if those
>  arguments were passed on the command line. In this case, it records
>  the " -cclib /home/jon/xen-unstable.hg/tools/ocaml/libs/xc/../../../../tools/libxc/libxenctrl.so" 
> which is unhelpful. The correct thing to do is to record the eventual
>  locations of the libraries. However, there's a slight complication: these
>  libraries are used in the compilation of the oxenstored binary. In order 
> to prevent it attempting to link against whatever is currently installed 
> instead of what's in the tree (which was the original bug), the option 
> "-noautolink" can be passed to the ocaml compiler which causes it to 
> ignore the recorded -cclib and -ccopt parameters, and we can instead
>  pass '-cclib /path/to/.so/file'.
> 
> I shall work on a patch :-)
> 
> Jon
> 
> 
> 
> On 25 Oct 2011, at 17:11, Ian Jackson wrote:
> 
> > George Dunlap writes ("Re: [Xen-devel] RFC: Partially revert xen-unstable c/s 23071:a3466b005017"):
> >> Yes; it hard-codes the full path of the build tree library file.
> > 
> > That seems a strange thing for it to do.
> > 
> >> You're right, it's actually 23921 that caused the problem.  I just did
> >> "hg annotate" and found 23071.
> > 
> > Reverting this part of 23921 will just bring back the previous bug,
> > that the build system might pick up libraries in /usr (or somewhere
> > else on the default compile-time linker search path).
> > 
> > Is there a way to get the ocaml linker stage to print out the complete
> > link line it's using ?  If so it'll probably be possible to spot the
> > difference between the link lines used for the ocaml libraries and
> > those used elsewhere.  Then we might understand what to fix.
> > 
> > Ian.
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 14:05:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 14:05:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIoBr-0002O1-E2; Tue, 25 Oct 2011 14:05:43 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIo9j-00029A-LY
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 14:03:42 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319576606!1043307!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7245 invoked from network); 25 Oct 2011 21:03:27 -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; 25 Oct 2011 21:03: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
	p9PL3Oc7009317
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 21:03:25 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
	p9PL3NWw017620
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 21:03:24 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
	p9PL3IjK001290; Tue, 25 Oct 2011 16:03:18 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 14:03:18 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 50F3382C13; Tue, 25 Oct 2011 17:01:41 -0400 (EDT)
Date: Tue, 25 Oct 2011 17:01:41 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Christopher S. Aker" <caker@theshore.net>
Subject: Re: [Xen-devel] Linux 3.1 domU + ext3 = WARNING: at fs/ext3/inode.c
Message-ID: <20111025210141.GA2412@phenom.dumpdata.com>
References: <4EA71270.2050303@theshore.net>
	<20111025201239.GA13747@phenom.dumpdata.com>
	<BCD23F9B-BB0B-429B-882C-80077B1D234F@theshore.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <BCD23F9B-BB0B-429B-882C-80077B1D234F@theshore.net>
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.4EA7241D.0044,ss=1,re=0.000,fgs=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 Tue, Oct 25, 2011 at 04:40:09PM -0400, Christopher S. Aker wrote:
> On Oct 25, 2011, at 4:12 PM, Konrad Rzeszutek Wilk wrote:
> > Oh, so this is 3.1 DomU kernel? And your Dom0 is 2.6.18?
> > 
> > What does the guest show for the disk? As in, is the barrier feature
> > enabled? 
> 
> 2.6.18 dom0 and a 3.1.0 domU produces this on domU boot:

You see the same exact thing with 3.0.6?

> 
> EXT3-fs (xvda): using internal journal
> Adding 262140k swap on /dev/xvdb.  Priority:-1 extents:1 across:262140k SS
> blkfront: barrier: empty write xvda op failed
> blkfront: xvda: barrier or flush: disabled
> end_request: I/O error, dev xvda, sector 1053048
> end_request: I/O error, dev xvda, sector 1053048
> Buffer I/O error on device xvda, logical block 131631
> lost page write due to I/O error on xvda
> Aborting journal on device xvda.
> EXT3-fs (xvda): error: ext3_journal_start_sb: Detected aborted journal
> EXT3-fs (xvda): error: remounting filesystem read-only
> 
> On my 3.0 based dom0 with a 3.1.0 domU blkfront doesn't complain - and I *think* 3.1 domU may actually work as expected -- initial tests couldn't get it to trace...
> 
> > .. snip
> >> 
> >> Am I barking up the wrong list?
> > 
> > Not sure.. It depends on what your dom0 version is and what
> > the backend is? blktap or blkback?
> 
> blkback.
> 
> We suspected a dom0/domU incompatibility after doing some research.  Hopefully this can get resolved within the guest since we have literally thousands of 2.6.18 dom0s deployed and rebooting everyone is not my idea of a good time :)
> 
> Thanks,
> -Chris

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 14:08:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 14:08:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIoE6-0002nV-8S; Tue, 25 Oct 2011 14:08:02 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIoDQ-0002bL-L5
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 14:07:22 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319576836!36643055!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2838 invoked from network); 25 Oct 2011 21:07:17 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-2.tower-174.messagelabs.com with SMTP;
	25 Oct 2011 21:07:17 -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
	p9PL7EcD017859; Tue, 25 Oct 2011 21:07:14 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 p9PL7D5N017836; 
	Tue, 25 Oct 2011 17:07:13 -0400
Message-ID: <4EA72512.5040303@tycho.nsa.gov>
Date: Tue, 25 Oct 2011 17:07:30 -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: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Re: [PATCH 2/2] xen/gnt{dev,	alloc}: reserve event
	channels for notify
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1318971851-12809-3-git-send-email-dgdegra@tycho.nsa.gov>
	<20111024205708.GE2441@phenom.dumpdata.com>
	<4EA5E024.7040708@tycho.nsa.gov>
	<20111025190231.GD10062@phenom.dumpdata.com>
	<4EA710EB.3030809@tycho.nsa.gov>
	<1319574443.16747.1.camel@dagon.hellion.org.uk>
	<4EA71F32.9040208@tycho.nsa.gov>
	<1319575831.16747.18.camel@dagon.hellion.org.uk>
In-Reply-To: <1319575831.16747.18.camel@dagon.hellion.org.uk>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: "Keir \(Xen.org\)" <keir@xen.org>, "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.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 10/25/2011 04:50 PM, Ian Campbell wrote:
> On Tue, 2011-10-25 at 21:42 +0100, Daniel De Graaf wrote:
>> On 10/25/2011 04:27 PM, Ian Campbell wrote:
>>> On Tue, 2011-10-25 at 20:41 +0100, Daniel De Graaf wrote:
>>>>
>>>>>> Hmm. Perhaps have a magic value for refcount (-1?) that indicates
>>>> evtchn_get is not
>>>>>> available. That would become the default value of refcnt, and
>>>> evtchn.c would then
>>>>>> use evtchn_make_refcounted() to change the refcount to 1 and allow
>>>> _get/_put to work.
>>>>>
>>>>> How would that work when the IRQ subsystem (so everything is setup
>>>> in the kernel)
>>>>> gets an event? Would the refcount be for that -1.. oh. You would
>>>> only set
>>>>> the refcnt when the _get/_put calls are made and not when in-kernel
>>>> calls to setup> IRQs are done?
>>>>>
>>>>
>>>> Right. The reference count would be a dual-purpose field indicating if
>>>> the event channel is kernel-internal (value -1) or userspace-visible
>>>> (reference count > 0). New event channels would start out at -1, and
>>>> evtchn.c would change them to 1. 
>>>
>>> Is there any way that the reference count could be made part of the
>>> datastructures associated with the /dev/xen/evtchn driver instead of the
>>> core evtchn.c stuff? That wouldreduce the chance of current or futures
>>> users getting something wrong.
>>>
>>> Ian.
>>
>> This would require that the gntdev and gntalloc modules have a dependency
>> on the evtchn module, with the evtchn_{get,put} functions moved into that
>> module.
> 
> Don't they effectively have that already, since the only evtchns you can
> use with them have come from that module?
> 

Yes, but the primary purpose of the gntdev/gntalloc modules does not include
using event channels (just mapping memory). In practice, however, this is
true as shared-memory rings need a notification mechanism if you want to avoid
polling.

>>  The only other way would be to add a refcount maintenance
>> function pointer to the IRQ data structure, which seems like it would lead
>> to more problems than a simple reference count.
>>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Tue Oct 25 14:16:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 14:16:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIoLu-0003JV-8j; Tue, 25 Oct 2011 14:16:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIoLF-00036U-Pi
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 14:15:26 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319577309!43136044!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9392 invoked from network); 25 Oct 2011 21:15:11 -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; 25 Oct 2011 21:15: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
	p9PLFJh0009555
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Tue, 25 Oct 2011 21:15:20 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
	p9PLFI77004072
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Tue, 25 Oct 2011 21:15:19 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9PLFC3U009118; Tue, 25 Oct 2011 16:15:12 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Tue, 25 Oct 2011 14:15:12 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 3767882C13; Tue, 25 Oct 2011 17:15:12 -0400 (EDT)
Date: Tue, 25 Oct 2011 17:15:12 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Christopher S. Aker" <caker@theshore.net>
Subject: Re: [Xen-devel] Linux 3.1 domU + ext3 = WARNING: at fs/ext3/inode.c
Message-ID: <20111025211512.GA2561@phenom.dumpdata.com>
References: <4EA71270.2050303@theshore.net>
	<20111025201239.GA13747@phenom.dumpdata.com>
	<BCD23F9B-BB0B-429B-882C-80077B1D234F@theshore.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <BCD23F9B-BB0B-429B-882C-80077B1D234F@theshore.net>
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.4EA726E8.012E,ss=1,re=0.000,fgs=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 Tue, Oct 25, 2011 at 04:40:09PM -0400, Christopher S. Aker wrote:
> On Oct 25, 2011, at 4:12 PM, Konrad Rzeszutek Wilk wrote:
> > Oh, so this is 3.1 DomU kernel? And your Dom0 is 2.6.18?
> > 
> > What does the guest show for the disk? As in, is the barrier feature
> > enabled? 
> 
> 2.6.18 dom0 and a 3.1.0 domU produces this on domU boot:
> 
> EXT3-fs (xvda): using internal journal
> Adding 262140k swap on /dev/xvdb.  Priority:-1 extents:1 across:262140k SS
> blkfront: barrier: empty write xvda op failed
> blkfront: xvda: barrier or flush: disabled
> end_request: I/O error, dev xvda, sector 1053048
> end_request: I/O error, dev xvda, sector 1053048
> Buffer I/O error on device xvda, logical block 131631
> lost page write due to I/O error on xvda
> Aborting journal on device xvda.
> EXT3-fs (xvda): error: ext3_journal_start_sb: Detected aborted journal
> EXT3-fs (xvda): error: remounting filesystem read-only
> 
> On my 3.0 based dom0 with a 3.1.0 domU blkfront doesn't complain - and I *think* 3.1 domU may actually work as expected -- initial tests couldn't get it to trace...

OK, that might be very well true as the 3.0 dom0 would export the 'feature-flush-cache'..

but you said that if you use 3.0 domU with 2.6.18 you do not get the
type of warnings as above?


Also, when the DomU guest starts it should report if it "thinks" it
supports barriers. Something like:

blkbfront: xvda: barrier

Or is this the only message you get from blkfront??

> 
> > .. snip
> >> 
> >> Am I barking up the wrong list?
> > 
> > Not sure.. It depends on what your dom0 version is and what
> > the backend is? blktap or blkback?
> 
> blkback.
> 
> We suspected a dom0/domU incompatibility after doing some research.  Hopefully this can get resolved within the guest since we have literally thousands of 2.6.18 dom0s deployed and rebooting everyone is not my idea of a good time :)

> 
> Thanks,
> -Chris
> 
> 
> _______________________________________________
> 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 Oct 25 14:44:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 14:44:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIonf-0005k0-6f; Tue, 25 Oct 2011 14:44:47 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIomr-0005XY-U5
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 14:43:58 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1319579034!1637609!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31487 invoked from network); 25 Oct 2011 21:43:54 -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;
	25 Oct 2011 21:43:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,405,1315180800"; 
   d="scan'208";a="8581809"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 21:43: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, 25 Oct 2011 22:43:22 +0100
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 1RIomI-0000UP-Fb;
	Tue, 25 Oct 2011 21:43:22 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIomI-0008Od-CU;
	Tue, 25 Oct 2011 22:43:22 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9611-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 25 Oct 2011 22:43:22 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9611: 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 9611 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9611/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10     fail REGR. vs. 9601

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                  f273bce1fc26
baseline version:
 xen                  662dbf6ee71c

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Dario Faggioli <dario.faggioli@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Yang Zhang <yang.z.zhang@intel.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


Not pushing.

------------------------------------------------------------
changeset:   23997:f273bce1fc26
tag:         tip
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Oct 25 17:04:41 2011 +0100
    
    libxl: add missing "break;" to do_pci_remove
    
    Otherwise we erroneously fall through the LIBXL_DOMAIN_TYPE_PV case into the
    "default: abort()".
    
    (I'm sure we fixed this once already...)
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Tested-by: Dario Faggioli <dario.faggioli@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23996:51a0c81a4030
user:        Christoph Egger <Christoph.Egger@amd.com>
date:        Tue Oct 25 16:48:17 2011 +0100
    
    hvm: Clean up I/O emulation
    
    Move HVM io fields into a structure.
    On MMIO instruction failure print out some more bytes.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23995:8943a9696358
user:        Yang Zhang <yang.z.zhang@intel.com>
date:        Tue Oct 25 16:46:47 2011 +0100
    
    x86 pm: provide CC7/PC2 residency
    
    Sandy bridge introduces new MSR to get cc7/pc2 residency (core C-state
    7/package C-state 2). Print the cc7/pc2 residency when on sandy bridge
    platform.
    
    Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23994:662dbf6ee71c
user:        Jan Beulich <jbeulich@novell.com>
date:        Mon Oct 24 18:01:07 2011 +0100
    
    x86/hpet: fix cpumask allocation after 23990:1c8789852eaf
    
    hpet_fsb_cap_lookup(), if it doesn't find any FSB capable timer,
    leaves hpet_events allocated, while hpet_events->cpumask may not have
    been, As we're pretty generous with these one-time allocations already
    (in that hpet_events doesn't get freed when no usable counters were
    found, even if in that case only the first array entry [or none at
    all] may get used), simply make the cpumask allocation in the legacy
    case independent of whether hpet_events was NULL before.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Tested-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Christoph Egger <Christoph.Egger@amd.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
========================================
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 Tue Oct 25 16:08:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 16:08:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIq6n-0007zW-D6; Tue, 25 Oct 2011 16:08:37 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIq5I-0007ma-B4
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 16:07:08 -0700
X-Env-Sender: jfehlig@suse.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1319584020!1643397!1
X-Originating-IP: [137.65.248.97]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13218 invoked from network); 25 Oct 2011 23:07:00 -0000
Received: from novprvoes0314.provo.novell.com (HELO mail.novell.com)
	(137.65.248.97) by server-10.tower-21.messagelabs.com with SMTP;
	25 Oct 2011 23:07:00 -0000
Received: from [164.99.195.4] ([::ffff:164.99.195.4])
	by mail.novell.com with ESMTP; Tue, 25 Oct 2011 17:06:53 -0600
Message-ID: <4EA740EB.7030804@suse.com>
Date: Tue, 25 Oct 2011 17:06:19 -0600
From: Jim Fehlig <jfehlig@suse.com>
User-Agent: Thunderbird 2.0.0.24 (X11/20100302)
MIME-Version: 1.0
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: multipart/mixed; boundary="------------020109070602030301050205"
Subject: [Xen-devel] [PATCH] Prevent vif-bridge from adding user-created
	taps to a bridge
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.
--------------020109070602030301050205
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

I previously sent this from my @suse.com mail address without having
subscribed it.  Sending again now that I have done so...

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"

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?

Thanks!
Jim



--------------020109070602030301050205
Content-Type: text/x-patch;
 name="vif-bridge.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="vif-bridge.patch"

# HG changeset patch
# User Jim Fehlig <jfehlig@suse.com>
# Date 1319581952 21600
# Node ID 74da2a3a1db1476d627f42e4a99e9e720cc6774d
# Parent  6c583d35d76dda2236c81d9437ff9d57ab02c006
Prevent vif-bridge from adding user-created tap interfaces to a bridge

Exit vif-bridge script if there is no device info in xenstore, preventing
it from adding user-created taps to bridges.

    Signed-off-by: Jim Fehlig <jfehlig@suse.com>

diff -r 6c583d35d76d -r 74da2a3a1db1 tools/hotplug/Linux/vif-bridge
--- a/tools/hotplug/Linux/vif-bridge	Thu Oct 20 15:36:01 2011 +0100
+++ b/tools/hotplug/Linux/vif-bridge	Tue Oct 25 16:32:32 2011 -0600
@@ -31,6 +31,13 @@
 
 dir=$(dirname "$0")
 . "$dir/vif-common.sh"
+
+domu=$(xenstore_read_default "$XENBUS_PATH/domain" "")
+if [ -z "$domu" ]
+then
+    log debug "No device details in $XENBUS_PATH, exiting."
+    exit 0
+fi
 
 bridge=${bridge:-}
 bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")

--------------020109070602030301050205
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

--------------020109070602030301050205--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 16:42:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 16:42:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIqd7-0000Wu-RU; Tue, 25 Oct 2011 16:42:01 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIqcK-0000Js-6f
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 16:41:12 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319586068!1056577!1
X-Originating-IP: [129.234.248.1]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30767 invoked from network); 25 Oct 2011 23:41:09 -0000
Received: from hermes1.dur.ac.uk (HELO hermes1.dur.ac.uk) (129.234.248.1)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 25 Oct 2011 23:41:09 -0000
Received: from smtphost2.dur.ac.uk (smtphost2.dur.ac.uk [129.234.252.2])
	by hermes1.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9PNeo0t013001;
	Wed, 26 Oct 2011 00:40:54 +0100
Received: from vega-a.dur.ac.uk (vega-a.dur.ac.uk [129.234.250.133])
	by smtphost2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9PNeVPw024371
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 00:40:31 +0100
Received: from vega-a.dur.ac.uk (localhost [127.0.0.1])
	by vega-a.dur.ac.uk (8.14.3/8.11.1) with ESMTP id p9PNeVAi001266;
	Wed, 26 Oct 2011 00:40:31 +0100
Received: from localhost (dcl0may@localhost)
	by vega-a.dur.ac.uk (8.14.3/8.14.3/Submit) with ESMTP id p9PNeUJo001262;
	Wed, 26 Oct 2011 00:40:30 +0100
Date: Wed, 26 Oct 2011 00:40:29 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: =?ISO-8859-15?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
Subject: Re: [Xen-devel] Missing blktap(2) driver in
	kernel-2.6.32-*.el6.xendom0.x86_64.rpm
In-Reply-To: <20111016201757.GT12984@reaktio.net>
Message-ID: <alpine.DEB.2.00.1110260030020.27824@vega-a.dur.ac.uk>
References: <CAEGWhjEEMwaP4U4LWxmbQB2vK2zkRuN0zNf7_aZ7EWc2abm7zA@mail.gmail.com>
	<20111016201757.GT12984@reaktio.net>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-1291844205-1319586031=:27824"
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9PNeo0t013001
Cc: xen-devel@lists.xensource.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

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--8323329-1291844205-1319586031=:27824
Content-Type: TEXT/PLAIN; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 8BIT

On Sun, 16 Oct 2011, Pasi Kärkkäinen wrote:

> On Sun, Oct 16, 2011 at 08:35:23AM -0400, David Della Vecchia wrote:
>>    I'm not sure if this belongs here, but someone in the ##xen channel in
>>    [1]irc.freenode.net told me to message this list and let people know about
>>    and/or inquire as to why the blktap (or better yet blktap2) driver is not
>>    included in M A Young's aforementioned kernels, blkbackend is there but it
>>    does not allow for tap:aio disks in the domU's.
>>    Thanks,

The answer is that it isn't there because I haven't got the kernel to 
compile with it enabled. I may have another look at it, but it may be 
that it requires too much needs to change to get it working.

 	Michael Young
--8323329-1291844205-1319586031=:27824
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-1291844205-1319586031=:27824--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 17:02:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 17:02:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIqwz-0001FG-1a; Tue, 25 Oct 2011 17:02:33 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIqtV-0000ze-91
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 16:58:58 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319587132!1043589!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27288 invoked from network); 25 Oct 2011 23:58:52 -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;
	25 Oct 2011 23:58:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,406,1315180800"; 
   d="scan'208";a="8582522"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	25 Oct 2011 23:58: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, 26 Oct 2011 00:58:47 +0100
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 1RIqtL-0001GA-0i;
	Tue, 25 Oct 2011 23:58:47 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIqtK-0007bT-W6;
	Wed, 26 Oct 2011 00:58:46 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9612-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 26 Oct 2011 00:58:46 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.0-testing test] 9612: 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 9612 xen-4.0-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9612/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 build-i386-pvops              4 kernel-build                 fail pass in 9610
 test-amd64-amd64-xl-sedf      5 xen-boot             fail in 9610 pass in 9612

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-pv            1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl-multivcpu  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-xl            1 xen-build-check(1)           blocked  n/a
 test-i386-i386-xl             1 xen-build-check(1)           blocked  n/a
 test-i386-i386-pv             1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl          15 guest-stop                   fail   never pass
 test-amd64-i386-xl-credit2    1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail    like 9599
 test-amd64-i386-pair          1 xen-build-check(1)           blocked  n/a
 test-i386-i386-pair           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win           1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-intel  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-rhel6hvm-amd  1 xen-build-check(1)           blocked  n/a
 test-amd64-i386-win-vcpus1    1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-win         16 leak-check/check             fail   never pass
 test-i386-i386-win            1 xen-build-check(1)           blocked  n/a
 test-amd64-amd64-xl-win       7 windows-install              fail   never pass
 test-i386-i386-xl-win         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-xl-multivcpu 15 guest-stop             fail in 9610 never pass
 test-amd64-i386-xl           15 guest-stop             fail in 9610 never pass
 test-i386-i386-xl            15 guest-stop             fail in 9610 never pass
 test-amd64-i386-xl-credit2 14 guest-localmigrate/x10 fail in 9610 blocked in 9599
 test-amd64-i386-win          16 leak-check/check       fail in 9610 never pass
 test-amd64-i386-rhel6hvm-intel  7 redhat-install       fail in 9610 never pass
 test-amd64-i386-rhel6hvm-amd  7 redhat-install         fail in 9610 never pass
 test-amd64-i386-win-vcpus1   16 leak-check/check       fail in 9610 never pass
 test-i386-i386-win           16 leak-check/check       fail in 9610 never pass
 test-i386-i386-xl-win         7 windows-install        fail in 9610 never pass
 test-amd64-i386-xl-win-vcpus1  7 windows-install       fail in 9610 never pass

version targeted for testing:
 xen                  a5cc3b953ed9
baseline version:
 xen                  da9f945b3db8

------------------------------------------------------------
People who touched revisions under test:
  Keir Fraser <keir@xen.org>
  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                                             fail    
 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


Pushing revision :

+ branch=xen-4.0-testing
+ revision=a5cc3b953ed9
+ . 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 a5cc3b953ed9
+ branch=xen-4.0-testing
+ revision=a5cc3b953ed9
+ . 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 a5cc3b953ed9 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 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 Tue Oct 25 17:51:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 17:51:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIriG-0002nT-JF; Tue, 25 Oct 2011 17:51:24 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIrgl-0002Zx-LM
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 17:49:54 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319590188!25306165!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25294 invoked from network); 26 Oct 2011 00:49:48 -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;
	26 Oct 2011 00:49:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,406,1315180800"; 
   d="scan'208";a="8582690"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 00:49: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, 26 Oct 2011 01:49:47 +0100
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 1RIrgh-0001Xh-BN;
	Wed, 26 Oct 2011 00:49:47 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIrgh-0003ZH-B4;
	Wed, 26 Oct 2011 01:49:47 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9615-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 26 Oct 2011 01:49:47 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9615: 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 9615 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9615/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      5 xen-boot                   fail REGR. vs. 9608

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                  c681dd5aecf3
baseline version:
 xen                  662dbf6ee71c

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Dario Faggioli <dario.faggioli@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Michael Young <m.a.young@durham.ac.uk>
  Paolo Bonzini <pbonzini@redhat.com>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Yang Zhang <yang.z.zhang@intel.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


Not pushing.

------------------------------------------------------------
changeset:   24003:c681dd5aecf3
tag:         tip
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:22:09 2011 +0100
    
    pygrub: example grub2 configuration file (fedora-16-with-xen.grub2)
    
    Sample grub2 configuration file (some duplication removed) from Fedora 16
    with a xen hypervisor installed
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   24002:979bc34d0ad0
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:21:05 2011 +0100
    
    pyrgrub: cope with configurations with set default="${saved_entry}" line
    
    Fedora 16 grub2 configuration file can have lines like
        set default="${saved_entry}"
    and a string containing an integer is expected
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   24001:152049468175
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:20:06 2011 +0100
    
    pygrub: cope with configurations with submenus
    
    The grub2 configuration file in Fedora 16 can have one or more
    menuentrys in a submenu, with configuration of the form
        submenu "Xen 4.1" {
        menuentry ... {
        ...
        }
        }
    (this example occurs when the xen hypervisor is installed on the
    guest)
    
    Ignore the submenu line and the corresponding }
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24000:65679fee0177
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:19:19 2011 +0100
    
    pygrub: Allow GPT partition references
    
    The grub2 configuration file in Fedora 16 can have GPT partition
    references like (hd0,gpt2) so remove the "gpt" string where necessary
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   23999:138f707fa598
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:18:49 2011 +0100
    
    pygrub: look in /boot/grub2 (for eg Fedora 16)
    
    Fedora 16 puts grub configuration files in /boot/grub2/grub.cfg so
    pygrub should look there as well
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   23998:85d7b207fabc
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:15:54 2011 +0100
    
    pygrub: check all GPT partitions
    
    On Fedora 16 the first GPT partition is a boot partition for grub2 with
    the grub2 configuration in the second partition.
    Check all GPT partitions for grub configuration, not just the first.
    
    [ Also remove now-inaccurate comment. -iwj ]
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Tested-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23997:f273bce1fc26
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Oct 25 17:04:41 2011 +0100
    
    libxl: add missing "break;" to do_pci_remove
    
    Otherwise we erroneously fall through the LIBXL_DOMAIN_TYPE_PV case into the
    "default: abort()".
    
    (I'm sure we fixed this once already...)
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Tested-by: Dario Faggioli <dario.faggioli@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23996:51a0c81a4030
user:        Christoph Egger <Christoph.Egger@amd.com>
date:        Tue Oct 25 16:48:17 2011 +0100
    
    hvm: Clean up I/O emulation
    
    Move HVM io fields into a structure.
    On MMIO instruction failure print out some more bytes.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23995:8943a9696358
user:        Yang Zhang <yang.z.zhang@intel.com>
date:        Tue Oct 25 16:46:47 2011 +0100
    
    x86 pm: provide CC7/PC2 residency
    
    Sandy bridge introduces new MSR to get cc7/pc2 residency (core C-state
    7/package C-state 2). Print the cc7/pc2 residency when on sandy bridge
    platform.
    
    Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23994:662dbf6ee71c
user:        Jan Beulich <jbeulich@novell.com>
date:        Mon Oct 24 18:01:07 2011 +0100
    
    x86/hpet: fix cpumask allocation after 23990:1c8789852eaf
    
    hpet_fsb_cap_lookup(), if it doesn't find any FSB capable timer,
    leaves hpet_events allocated, while hpet_events->cpumask may not have
    been, As we're pretty generous with these one-time allocations already
    (in that hpet_events doesn't get freed when no usable counters were
    found, even if in that case only the first array entry [or none at
    all] may get used), simply make the cpumask allocation in the legacy
    case independent of whether hpet_events was NULL before.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Tested-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Christoph Egger <Christoph.Egger@amd.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
========================================
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 Tue Oct 25 18:17:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 18:17:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIs7s-0003a1-Pd; Tue, 25 Oct 2011 18:17:52 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIs6t-0003NO-06
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 18:16:51 -0700
X-Env-Sender: ksrujandas@gmail.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1319591807!1651883!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14997 invoked from network); 26 Oct 2011 01:16:47 -0000
Received: from mail-bw0-f43.google.com (HELO mail-bw0-f43.google.com)
	(209.85.214.43)
	by server-10.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 01:16:47 -0000
Received: by bke17 with SMTP id 17so1514599bke.30
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 18:16:47 -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=soSTtt9LuLgKWDzTZhWm9YH0y4HG9BfYYwNI9XBvIGU=;
	b=gtNZEI81Phw3DPNjN5Z6LCVp/5e0IfoI0yN4KAZ4BsOSJGV184vnxRqvKRxDA/CgWi
	VTJ+YRZWGR6RodjIK9oYEqzZMwVJTZk1OvIQGHTyU5rrY27Npd08a4TrtGms7pg4F5LM
	roLFVaa/E4sPBxldov24XkRohQIzeTxtutY8A=
MIME-Version: 1.0
Received: by 10.204.154.203 with SMTP id p11mr22457823bkw.36.1319591807315;
	Tue, 25 Oct 2011 18:16:47 -0700 (PDT)
Received: by 10.204.13.78 with HTTP; Tue, 25 Oct 2011 18:16:47 -0700 (PDT)
Date: Tue, 25 Oct 2011 20:16:47 -0500
Message-ID: <CAKLFbfyTc-Q4ao44suwBC_XQi7KLaGpfS0=kH=iL2CoQzjQXbQ@mail.gmail.com>
From: Srujan Kotikela <ksrujandas@gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] Hypercall by DomU Application
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============1710033451=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1710033451==
Content-Type: multipart/alternative; boundary=0015175cd0e6ec6f9904b0296870

--0015175cd0e6ec6f9904b0296870
Content-Type: text/plain; charset=ISO-8859-1

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); )

Are there any security/performance/functional implications with this
approach?

Thanks and regards,
SDK.

--0015175cd0e6ec6f9904b0296870
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Hi,<div><br></div><div>I am working on a security architecture. In this arc=
hitecture, the application in DomU has to communicate directly with the hyp=
ervisor. 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 shou=
ld do the trick. I have few questions regarding this.</div>
<div><br></div><div>Is my idea feasible? =3D=3D&gt; (=A0=A0_set_gate(idt_ta=
ble+HYPERCALL_VECTOR, 15, 3, &amp;hypercall); )</div><div><br></div><div>Ar=
e there any security/performance/functional implications with this approach=
?</div>
<div><br></div><div>Thanks and regards,</div><div>SDK.<br><br>
</div>

--0015175cd0e6ec6f9904b0296870--


--===============1710033451==
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

--===============1710033451==--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 18:19:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 18:19:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIs9S-00043v-Rb; Tue, 25 Oct 2011 18:19:30 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIs8O-0003hx-IW
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 18:18:26 -0700
X-Env-Sender: ksrujandas@gmail.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319591901!754855!1
X-Originating-IP: [209.85.214.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14382 invoked from network); 26 Oct 2011 01:18:21 -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;
	26 Oct 2011 01:18:21 -0000
Received: by bke17 with SMTP id 17so1515482bke.30
	for <xen-devel@lists.xensource.com>;
	Tue, 25 Oct 2011 18:18:21 -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
	:content-type; bh=5NP38TDTMs+tJ+S/G8We9wBkhX+lsddc/B6b7pLqcG4=;
	b=F0e0McetJeSauccGjryV/1LZaXHbhVoY3s91ajDJ/w/QIrmxpv9KanFP5rQzL7Zcsb
	YuOVRk5ZQ5x+gLbv7y4DvXY/BUTJig5UrkVAKz1iDnIEy7FtwaLIQjHbfUYzWlZiUBk1
	vEzbiKGRTtoK+iZIZfaH30x7QJ2cWkP7HAzYk=
MIME-Version: 1.0
Received: by 10.204.8.71 with SMTP id g7mr22356114bkg.101.1319591900946; Tue,
	25 Oct 2011 18:18:20 -0700 (PDT)
Received: by 10.204.13.78 with HTTP; Tue, 25 Oct 2011 18:18:20 -0700 (PDT)
In-Reply-To: <CAKLFbfyTc-Q4ao44suwBC_XQi7KLaGpfS0=kH=iL2CoQzjQXbQ@mail.gmail.com>
References: <CAKLFbfyTc-Q4ao44suwBC_XQi7KLaGpfS0=kH=iL2CoQzjQXbQ@mail.gmail.com>
Date: Tue, 25 Oct 2011 20:18:20 -0500
Message-ID: <CAKLFbfxyX8=h8NMwVzhcRw+0156eteeAHp4p2khDEAUf3FgsMg@mail.gmail.com>
From: Srujan Kotikela <ksrujandas@gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] Re: Hypercall by DomU Application
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0256619096=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0256619096==
Content-Type: multipart/alternative; boundary=0015174c372881201304b0296e59

--0015174c372881201304b0296e59
Content-Type: text/plain; charset=ISO-8859-1

On Tue, Oct 25, 2011 at 8:16 PM, Srujan Kotikela <ksrujandas@gmail.com>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); )
>
> Are there any security/performance/functional implications with this
> approach?
>
> Thanks and regards,
> SDK.
>
>

In the proposed security architecture, please note that, it is essential to
NOT involve DomU kernel in the process of invoking the hypercall.

--0015174c372881201304b0296e59
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<br><div class=3D"gmail_quote">On Tue, Oct 25, 2011 at 8:16 PM, Srujan Koti=
kela <span dir=3D"ltr">&lt;<a href=3D"mailto:ksrujandas@gmail.com">ksrujand=
as@gmail.com</a>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi,<div><br></div><div>I am working on a security architecture. In this arc=
hitecture, the application in DomU has to communicate directly with the hyp=
ervisor. 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 shou=
ld do the trick. I have few questions regarding this.</div>

<div><br></div><div>Is my idea feasible? =3D=3D&gt; (=A0=A0_set_gate(idt_ta=
ble+HYPERCALL_VECTOR, 15, 3, &amp;hypercall); )</div><div><br></div><div>Ar=
e there any security/performance/functional implications with this approach=
?</div>

<div><br></div><div>Thanks and regards,</div><div>SDK.<br><br>
</div>
</blockquote></div><br><div><br></div><div>In the proposed security archite=
cture, please note that, it is essential to NOT involve DomU kernel in the =
process of invoking the hypercall.</div>

--0015174c372881201304b0296e59--


--===============0256619096==
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

--===============0256619096==--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 20:49:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 20:49:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIuUH-0007Lw-SV; Tue, 25 Oct 2011 20:49:10 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIuTC-00078W-TS
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 20:48:05 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319600879!1691940!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16123 invoked from network); 26 Oct 2011 03:47:59 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 03:47:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,407,1315180800"; 
   d="scan'208";a="8584118"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 03:47: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, 26 Oct 2011 04:47:58 +0100
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 1RIuT8-0002XP-OP;
	Wed, 26 Oct 2011 03:47:58 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RIuT8-0005IP-O3;
	Wed, 26 Oct 2011 04:47:58 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9625-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 26 Oct 2011 04:47:58 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9625: 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 9625 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9625/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     10 guest-saverestore          fail REGR. vs. 9608

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                  c681dd5aecf3
baseline version:
 xen                  662dbf6ee71c

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Dario Faggioli <dario.faggioli@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Michael Young <m.a.young@durham.ac.uk>
  Paolo Bonzini <pbonzini@redhat.com>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Yang Zhang <yang.z.zhang@intel.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


Not pushing.

------------------------------------------------------------
changeset:   24003:c681dd5aecf3
tag:         tip
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:22:09 2011 +0100
    
    pygrub: example grub2 configuration file (fedora-16-with-xen.grub2)
    
    Sample grub2 configuration file (some duplication removed) from Fedora 16
    with a xen hypervisor installed
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   24002:979bc34d0ad0
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:21:05 2011 +0100
    
    pyrgrub: cope with configurations with set default="${saved_entry}" line
    
    Fedora 16 grub2 configuration file can have lines like
        set default="${saved_entry}"
    and a string containing an integer is expected
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   24001:152049468175
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:20:06 2011 +0100
    
    pygrub: cope with configurations with submenus
    
    The grub2 configuration file in Fedora 16 can have one or more
    menuentrys in a submenu, with configuration of the form
        submenu "Xen 4.1" {
        menuentry ... {
        ...
        }
        }
    (this example occurs when the xen hypervisor is installed on the
    guest)
    
    Ignore the submenu line and the corresponding }
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24000:65679fee0177
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:19:19 2011 +0100
    
    pygrub: Allow GPT partition references
    
    The grub2 configuration file in Fedora 16 can have GPT partition
    references like (hd0,gpt2) so remove the "gpt" string where necessary
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   23999:138f707fa598
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:18:49 2011 +0100
    
    pygrub: look in /boot/grub2 (for eg Fedora 16)
    
    Fedora 16 puts grub configuration files in /boot/grub2/grub.cfg so
    pygrub should look there as well
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   23998:85d7b207fabc
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:15:54 2011 +0100
    
    pygrub: check all GPT partitions
    
    On Fedora 16 the first GPT partition is a boot partition for grub2 with
    the grub2 configuration in the second partition.
    Check all GPT partitions for grub configuration, not just the first.
    
    [ Also remove now-inaccurate comment. -iwj ]
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Tested-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23997:f273bce1fc26
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Oct 25 17:04:41 2011 +0100
    
    libxl: add missing "break;" to do_pci_remove
    
    Otherwise we erroneously fall through the LIBXL_DOMAIN_TYPE_PV case into the
    "default: abort()".
    
    (I'm sure we fixed this once already...)
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Tested-by: Dario Faggioli <dario.faggioli@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23996:51a0c81a4030
user:        Christoph Egger <Christoph.Egger@amd.com>
date:        Tue Oct 25 16:48:17 2011 +0100
    
    hvm: Clean up I/O emulation
    
    Move HVM io fields into a structure.
    On MMIO instruction failure print out some more bytes.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23995:8943a9696358
user:        Yang Zhang <yang.z.zhang@intel.com>
date:        Tue Oct 25 16:46:47 2011 +0100
    
    x86 pm: provide CC7/PC2 residency
    
    Sandy bridge introduces new MSR to get cc7/pc2 residency (core C-state
    7/package C-state 2). Print the cc7/pc2 residency when on sandy bridge
    platform.
    
    Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23994:662dbf6ee71c
user:        Jan Beulich <jbeulich@novell.com>
date:        Mon Oct 24 18:01:07 2011 +0100
    
    x86/hpet: fix cpumask allocation after 23990:1c8789852eaf
    
    hpet_fsb_cap_lookup(), if it doesn't find any FSB capable timer,
    leaves hpet_events allocated, while hpet_events->cpumask may not have
    been, As we're pretty generous with these one-time allocations already
    (in that hpet_events doesn't get freed when no usable counters were
    found, even if in that case only the first array entry [or none at
    all] may get used), simply make the cpumask allocation in the legacy
    case independent of whether hpet_events was NULL before.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Tested-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Christoph Egger <Christoph.Egger@amd.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
========================================
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 Tue Oct 25 21:37:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 21:37:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIvEo-0000cX-IP; Tue, 25 Oct 2011 21:37:14 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIvDv-0000Pm-Dv
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 21:36:20 -0700
X-Env-Sender: johneed@hotmail.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1319603775!763410!1
X-Originating-IP: [65.55.34.88]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14227 invoked from network); 26 Oct 2011 04:36:15 -0000
Received: from col0-omc2-s14.col0.hotmail.com (HELO
	col0-omc2-s14.col0.hotmail.com) (65.55.34.88)
	by server-5.tower-182.messagelabs.com with SMTP;
	26 Oct 2011 04:36:15 -0000
Received: from COL119-W15 ([65.55.34.72]) by col0-omc2-s14.col0.hotmail.com
	with Microsoft SMTPSVC(6.0.3790.4675); 
	Tue, 25 Oct 2011 21:36:14 -0700
Message-ID: <COL119-W1514D40D1978583B42A629A8ED0@phx.gbl>
Content-Type: multipart/mixed;
	boundary="_70f2aba3-27d6-4ff9-9738-a24b96f87238_"
X-Originating-IP: [124.169.33.18]
From: Windows Live <johneed@hotmail.com>
To: <xen-devel@lists.xensource.com>
Subject: FW: [Xen-devel] test structure missing files
Date: Wed, 26 Oct 2011 12:36:14 +0800
Importance: Normal
In-Reply-To: <COL119-W47A054D3076A67A7A488ACA8EC0@phx.gbl>
References: <COL119-W5023765948EB6ED67658CCA8EC0@phx.gbl>,
	<1319575086.16747.8.camel@dagon.hellion.org.uk>,
	<COL119-W47A054D3076A67A7A488ACA8EC0@phx.gbl>
MIME-Version: 1.0
X-OriginalArrivalTime: 26 Oct 2011 04:36:14.0739 (UTC)
	FILETIME=[CB9EB630:01CC9398]
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--_70f2aba3-27d6-4ff9-9738-a24b96f87238_
Content-Type: multipart/alternative;
	boundary="_0269df2b-7d4f-4492-a20f-b6495c86427b_"

--_0269df2b-7d4f-4492-a20f-b6495c86427b_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


I gather this should go to the devel alias preferably since I can't undo se=
nding tho the dev

From: johneed@hotmail.com
To: ian.campbell@citrix.com
Subject: RE: [Xen-devel] test structure missing files
Date: Wed=2C 26 Oct 2011 05:58:18 +0800

> Subject: Re: [Xen-devel] test structure missing files
> From: Ian.Campbell@citrix.com
> To: johneed@hotmail.com
> CC: xen-devel@lists.xensource.com
> Date: Tue=2C 25 Oct 2011 21:38:06 +0100
>=20
>=20
> The right solution to this problem would be to add the correct -I<path>
> to the relevant gcc invocation (perhaps via CFLAGS or similar). Messing
> with the actual included filename will only end up breaking something
> else.
>=20
> Unfortunately you don't describe what version of Xen you are using=2C wha=
t
> patches you have applied. what commands you are running or what you are
> actually trying to achieve. Based on the above and below descriptions of
> the sorts of things you have tried I rather suspect that your attempts
> to "fix" things have made things worse.
>=20
> Please read http://wiki.xen.org/xenwiki/AskingXenDevelQuestions and
> http://wiki.xen.org/xenwiki/ReportingBugs =2C then revert your local
> changes and report the original error which caused you to go down this
> path.
>=20
> Ian.
>=20
> > The next I couldn't fix. The header is simply missing.
> >=20
> > xen/lowlevel/xl/xl.c:210:25: fatal error: _pyxl_types.h: No such file
> > or
Ian=2C
While I will read through the link content=2C it is simple enough to provid=
e the required info.However I am no neophyte to submitting bugs.The version=
 is the latest xen-4.1.2  I thought the mention of ebuild would make it cle=
ar  that this relates to a gentoo ebuild.It seems the test has been left as=
 restricted because the test suite has long been broken.After unpacking the=
 source into the sandbox=2C the command run was simply make test=2C since t=
he target indicated in the Makefile is named test.   That fix was the only =
one I attempted=2Cquickly followed by the next which was a stopper. =20
What is being achieved is the making of the version bump of xen=2C xen-tool=
s and xen-pvgrub=2C 4.1.2.  Having adjusted and repaired a number of bug fi=
xes to xen-4.1.1=2C I couldn't help but wonder why the test phase was set r=
estricted.  A test phase =2Cif present=2C in a package should be incorporat=
ed into the ebuild.
I have added the ebuild=2C but I don't really think it will supply anything=
 useful.To make it simpler=2C there are NO patches applied.  Re-setting the=
 path via -I ofcourse we can do.Frankly I doubt the 'fix' could have made t=
hings worse.  On repeating make test=2C the header was found and it progres=
sed a few dozen lines or so further.  The next point is listed above=2C the=
 header is simply missing=2C unless the normal means of the use of find wit=
hin the source has failed to reveal its presence.
The original error is clearly enough displayed in the initial description=
=3B=20
In file included from xen/lowlevel/xc/xc.c:23:0:
../../tools/libxc/xc_dom.h:17:31: fatal error: xen/libelf/libelf.h: No such=
 file or directory
compilation terminated.
This output is not influenced by an ebuild=2C purely from make test in the =
xen source.

Thanks for viewing it thus far.
Ian Delaney=2C proxy maintainer for xen=2C gentoo





 		 	   		   		 	   		  =

--_0269df2b-7d4f-4492-a20f-b6495c86427b_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html>
<head>
<style><!--
.hmmessage P
{
margin:0px=3B
padding:0px
}
body.hmmessage
{
font-size: 10pt=3B
font-family:Tahoma
}
--></style>
</head>
<body class=3D'hmmessage'><div dir=3D'ltr'>
I gather this should go to the devel alias preferably since I can't undo se=
nding tho the dev<br><br><div>From: johneed@hotmail.com<br>To: ian.campbell=
@citrix.com<br>Subject: RE: [Xen-devel] test structure missing files<br>Dat=
e: Wed=2C 26 Oct 2011 05:58:18 +0800<br><br><div>&gt=3B Subject: Re: [Xen-d=
evel] test structure missing files<br>&gt=3B From: Ian.Campbell@citrix.com<=
br>&gt=3B To: johneed@hotmail.com<br>&gt=3B CC: xen-devel@lists.xensource.c=
om<br>&gt=3B Date: Tue=2C 25 Oct 2011 21:38:06 +0100<br>&gt=3B <br>&gt=3B&n=
bsp=3B<br>&gt=3B The right solution to this problem would be to add the cor=
rect -I&lt=3Bpath&gt=3B<br>&gt=3B to the relevant gcc invocation (perhaps v=
ia CFLAGS or similar). Messing<br>&gt=3B with the actual included filename =
will only end up breaking something<br>&gt=3B else.<br>&gt=3B <br>&gt=3B Un=
fortunately you don't describe what version of Xen you are using=2C what<br=
>&gt=3B patches you have applied. what commands you are running or what you=
 are<br>&gt=3B actually trying to achieve. Based on the above and below des=
criptions of<br>&gt=3B the sorts of things you have tried I rather suspect =
that your attempts<br>&gt=3B to "fix" things have made things worse.<br>&gt=
=3B <br>&gt=3B Please read http://wiki.xen.org/xenwiki/AskingXenDevelQuesti=
ons and<br>&gt=3B http://wiki.xen.org/xenwiki/ReportingBugs =2C then revert=
 your local<br>&gt=3B changes and report the original error which caused yo=
u to go down this<br>&gt=3B path.<br>&gt=3B <br>&gt=3B Ian.<br>&gt=3B <br>&=
gt=3B &gt=3B The next I couldn't fix. The header is simply missing.<br>&gt=
=3B &gt=3B <br>&gt=3B &gt=3B xen/lowlevel/xl/xl.c:210:25: fatal error: _pyx=
l_types.h: No such file<br>&gt=3B &gt=3B or</div><div><br></div><div>Ian=2C=
</div><div><br></div><div>While I will read through the link content=2C it =
is simple enough to provide the required info.</div><div>However I am no ne=
ophyte to submitting bugs.</div><div>The version is the latest xen-4.1.2 &n=
bsp=3BI thought the mention of ebuild would make it clear &nbsp=3B</div><di=
v>that this relates to a gentoo ebuild.</div><div>It seems the test has bee=
n left as restricted because the test suite has long been broken.</div><div=
>After unpacking the source into the sandbox=2C the command run was simply =
make test=2C </div><div>since the target indicated in the Makefile is named=
 test. &nbsp=3B That fix was the only one I attempted=2C</div><div>quickly =
followed by the next which was a stopper. &nbsp=3B</div><div><br></div><div=
>What is being achieved is the making of the version bump of xen=2C xen-too=
ls and xen-pvgrub=2C 4.1.2.&nbsp=3B</div><div>&nbsp=3BHaving adjusted and r=
epaired a number of bug fixes to xen-4.1.1=2C I couldn't help but wonder </=
div><div>why the test phase was set restricted. &nbsp=3BA test phase =2Cif =
present=2C in a package should be incorporated into the ebuild.</div><div><=
br></div><div>I have added the ebuild=2C but I don't really think it will s=
upply anything useful.</div><div>To make it simpler=2C there are NO patches=
 applied. &nbsp=3BRe-setting the path via -I ofcourse we can do.</div><div>=
Frankly I doubt the 'fix' could have made things worse. &nbsp=3BOn repeatin=
g make test=2C the header was </div><div>found and it progressed a few doze=
n lines or so further. &nbsp=3BThe next point is listed above=2C&nbsp=3B</d=
iv><div>the header is simply missing=2C unless the normal means of the use =
of find within the source </div><div>has failed to reveal its presence.</di=
v><div><br></div><div>The original error is clearly enough displayed in the=
 initial description=3B&nbsp=3B</div><div><br></div><div>In file included f=
rom xen/lowlevel/xc/xc.c:23:0:<br>../../tools/libxc/xc_dom.h:17:31: fatal e=
rror: xen/libelf/libelf.h: No such file or directory<br>compilation termina=
ted.</div><div><br>This output is not influenced by an ebuild=2C purely fro=
m make test in the xen source.<br></div><div><br></div><div>Thanks for view=
ing it thus far.</div><div><br></div><div>Ian Delaney=2C proxy maintainer f=
or xen=2C gentoo</div><div><br></div><div><br></div><div><br></div><div><br=
></div><div><br><br></div> 		 	   		  </div> 		 	   		  </div></body>
</html>=

--_0269df2b-7d4f-4492-a20f-b6495c86427b_--

--_70f2aba3-27d6-4ff9-9738-a24b96f87238_
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="xen-4.1.2.ebuild"

IyBDb3B5cmlnaHQgMTk5OS0yMDExIEdlbnRvbyBGb3VuZGF0aW9uCiMgRGlzdHJpYnV0ZWQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MgojICRIZWFk
ZXI6IC92YXIvY3Zzcm9vdC9nZW50b28teDg2L2FwcC1lbXVsYXRpb24veGVuL3hlbi00LjEuMi5l
YnVpbGQsdiAxLjMgMjAxMS8xMC8xMyAxOToyMTowNiBhbGV4eHkgRXhwICQKCkVBUEk9IjQiCgpp
ZiBbWyAkUFYgPT0gKjk5OTkgXV07IHRoZW4KCUtFWVdPUkRTPSIiCglSRVBPPSJ4ZW4tdW5zdGFi
bGUuaGciCglFSEdfUkVQT19VUkk9Imh0dHA6Ly94ZW5iaXRzLnhlbnNvdXJjZS5jb20vJHtSRVBP
fSIKCVM9IiR7V09SS0RJUn0vJHtSRVBPfSIKCWxpdmVfZWNsYXNzPSJtZXJjdXJpYWwiCmVsc2UK
CUtFWVdPUkRTPSJ+YW1kNjQgeDg2IgoJU1JDX1VSST0iaHR0cDovL2JpdHMueGVuc291cmNlLmNv
bS9vc3MteGVuL3JlbGVhc2UvJHtQVn0veGVuLSR7UFZ9LnRhci5neiIKZmkKCmluaGVyaXQgbW91
bnQtYm9vdCBmbGFnLW8tbWF0aWMgdG9vbGNoYWluLWZ1bmNzICR7bGl2ZV9lY2xhc3N9CgpERVND
UklQVElPTj0iVGhlIFhlbiB2aXJ0dWFsIG1hY2hpbmUgbW9uaXRvciIKSE9NRVBBR0U9Imh0dHA6
Ly94ZW4ub3JnLyIKCkxJQ0VOU0U9IkdQTC0yIgpTTE9UPSIwIgpJVVNFPSJjdXN0b20tY2ZsYWdz
IGRlYnVnIGZsYXNrIHBhZSB4c20iCgpSREVQRU5EPSJ8fCAoIHN5cy1ib290L2dydWIKCQlzeXMt
Ym9vdC9ncnViLXN0YXRpYyApIgpQREVQRU5EPSJ+YXBwLWVtdWxhdGlvbi94ZW4tdG9vbHMtJHtQ
Vn0iCgpSRVNUUklDVD0idGVzdCIKCiMgQXBwcm92ZWQgYnkgUUEgdGVhbSBpbiBidWcgIzE0NDAz
MgpRQV9XWF9MT0FEPSJib290L3hlbi1zeW1zLSR7UFZ9IgoKUkVRVUlSRURfVVNFPSIKCWZsYXNr
PyAoIHhzbSApCgkiCgpwa2dfc2V0dXAoKSB7CglpZiBbWyAteiAke1hFTl9UQVJHRVRfQVJDSH0g
XV07IHRoZW4KCQlpZiB1c2UgeDg2ICYmIHVzZSBhbWQ2NDsgdGhlbgoJCQlkaWUgIkNvbmZ1c2lv
biEgQm90aCB4ODYgYW5kIGFtZDY0IGFyZSBzZXQgaW4geW91ciB1c2UgZmxhZ3MhIgoJCWVsaWYg
dXNlIHg4NjsgdGhlbgoJCQlleHBvcnQgWEVOX1RBUkdFVF9BUkNIPSJ4ODZfMzIiCgkJZWxpZiB1
c2UgYW1kNjQ7IHRoZW4KCQkJZXhwb3J0IFhFTl9UQVJHRVRfQVJDSD0ieDg2XzY0IgoJCWVsc2UK
CQkJZGllICJVbnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUhIgoJCWZpCglmaQoKCWlmIHVzZSBmbGFz
ayA7IHRoZW4KCQlleHBvcnQgIlhTTV9FTkFCTEU9eSIKCQlleHBvcnQgIkZMQVNLX0VOQUJMRT15
IgoJZWxpZiB1c2UgeHNtIDsgdGhlbgoJCWV4cG9ydCAiWFNNX0VOQUJMRT15IgoJZmkKfQoKc3Jj
X3ByZXBhcmUoKSB7CgoJIyBEcm9wIC5jb25maWcKCXNlZCAtZSAnLy1pbmNsdWRlICQoWEVOX1JP
T1QpXC8uY29uZmlnL2QnIC1pIENvbmZpZy5tayB8fCBkaWUgIkNvdWxkbid0CWRyb3AiCgoJIyBp
ZiB0aGUgdXNlciAqcmVhbGx5KiB3YW50cyB0byB1c2UgdGhlaXIgb3duIGN1c3RvbS1jZmxhZ3Ms
IGxldCB0aGVtCglpZiB1c2UgY3VzdG9tLWNmbGFnczsgdGhlbgoJCWVpbmZvICJVc2VyIHdhbnRz
IHRoZWlyIG93biBDRkxBR1MgLSByZW1vdmluZyBkZWZhdWx0cyIKCQkjIHRyeSBhbmQgcmVtb3Zl
IGFsbCB0aGUgZGVmYXVsdCBjdXN0b20tY2ZsYWdzCgkJZmluZCAiJHtTfSIgLW5hbWUgTWFrZWZp
bGUgLW8gLW5hbWUgUnVsZXMubWsgLW8gLW5hbWUgQ29uZmlnLm1rIC1leGVjIHNlZCBcCgkJCS1l
ICdzL0NGTEFHU1woLipcKT1cKC4qXCktTzNcKC4qXCkvQ0ZMQUdTXDE9XDJcMy8nIFwKCQkJLWUg
J3MvQ0ZMQUdTXCguKlwpPVwoLipcKS1tYXJjaD1pNjg2XCguKlwpL0NGTEFHU1wxPVwyXDMvJyBc
CgkJCS1lICdzL0NGTEFHU1woLipcKT1cKC4qXCktZm9taXQtZnJhbWUtcG9pbnRlclwoLipcKS9D
RkxBR1NcMT1cMlwzLycgXAoJCQktZSAncy9DRkxBR1NcKC4qXCk9XCguKlwpLWczKlxzXCguKlwp
L0NGTEFHU1wxPVwyIFwzLycgXAoJCQktZSAncy9DRkxBR1NcKC4qXCk9XCguKlwpLU8yXCguKlwp
L0NGTEFHU1wxPVwyXDMvJyBcCgkJCS1pIHt9IFw7CglmaQoKCSMgcmVtb3ZlIC1XZXJyb3IgZm9y
IGdjYy00LjYncyBzYWtlCglmaW5kICR7U30gLW5hbWUgJ01ha2VmaWxlKicgLW8gLW5hbWUgJyou
bWsnIC1vIC1uYW1lICdjb21tb24ubWFrZScgfCBcCgkJeGFyZ3Mgc2VkIC1pICdzLyAqLVdlcnJv
ciAqLyAvJwoJIyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IHRvIGZpeCB0aGlzCglzZWQgLWkgJ3Mv
LCAiLVdlcnJvciIvLycgJHtTfS90b29scy9weXRob24vc2V0dXAucHkKCgkjIEFkZCBzY2N1cml0
eSBmaXggYnVnICMzNzkyNDEKIwllcGF0Y2ggIiR7RklMRVNESVJ9L3hlbi00LjEuMS1pb21tdV9z
ZWNfZml4LnBhdGNoIgp9CgpzcmNfY29uZmlndXJlKCkgewoJdXNlIGRlYnVnICYmIG15b3B0PSIk
e215b3B0fSBkZWJ1Zz15IgoJdXNlIHBhZSAmJiBteW9wdD0iJHtteW9wdH0gcGFlPXkiCgoJaWYg
dXNlIGN1c3RvbS1jZmxhZ3M7IHRoZW4KCQlmaWx0ZXItZmxhZ3MgLWZQSUUgLWZzdGFjay1wcm90
ZWN0b3IKCQlyZXBsYWNlLWZsYWdzIC1PMyAtTzIKCWVsc2UKCQl1bnNldCBDRkxBR1MKCWZpCn0K
CnNyY19jb21waWxlKCkgewoJIyBTZW5kIHJhdyBMREZMQUdTIHNvIHRoYXQgLS1hcy1uZWVkZWQg
d29ya3MKCWVtYWtlIENDPSIkKHRjLWdldENDKSIgTERGTEFHUz0iJChyYXctbGRmbGFncykiIC1D
IHhlbiAke215b3B0fSB8fCBkaWUgImNvbXBpbGUgZmFpbGVkIgp9CgpzcmNfaW5zdGFsbCgpIHsK
CWxvY2FsIG15b3B0Cgl1c2UgZGVidWcgJiYgbXlvcHQ9IiR7bXlvcHR9IGRlYnVnPXkiCgl1c2Ug
cGFlICYmIG15b3B0PSIke215b3B0fSBwYWU9eSIKCgllbWFrZSBMREZMQUdTPSIkKHJhdy1sZGZs
YWdzKSIgREVTVERJUj0iJHtEfSIgLUMgeGVuICR7bXlvcHR9IGluc3RhbGwgfHwgZGllICJpbnN0
YWxsIGZhaWxlZCIKfQoKcGtnX3Bvc3RpbnN0KCkgewoJZWxvZyAiT2ZmaWNpYWwgWGVuIEd1aWRl
IGFuZCB0aGUgdW5vZmZpY2FsIHdpa2kgcGFnZToiCgllbG9nICIgaHR0cDovL3d3dy5nZW50b28u
b3JnL2RvYy9lbi94ZW4tZ3VpZGUueG1sIgoJZWxvZyAiIGh0dHA6Ly9lbi5nZW50b28td2lraS5j
b20vd2lraS9YZW4vIgoKCWlmIHVzZSBwYWU7IHRoZW4KCQllY2hvCgkJZXdhcm4gIlRoaXMgaXMg
YSBQQUUgYnVpbGQgb2YgWGVuLiBJdCB3aWxsICpvbmx5KiBib290IFBBRSBrZXJuZWxzISIKCWZp
Cn0K

--_70f2aba3-27d6-4ff9-9738-a24b96f87238_
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

--_70f2aba3-27d6-4ff9-9738-a24b96f87238_--


From xen-devel-bounces@lists.xensource.com Tue Oct 25 23:26:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Tue, 25 Oct 2011 23:26:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIwwc-0004Ta-VA; Tue, 25 Oct 2011 23:26:34 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIwvy-0004HB-HK
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 23:25:54 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319610351!772236!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20146 invoked from network); 26 Oct 2011 06:25:51 -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;
	26 Oct 2011 06:25:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,408,1315180800"; 
   d="scan'208";a="8586024"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 06:25:50 +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, 26 Oct 2011 07:25:50 +0100
Subject: Re: FW: [Xen-devel] test structure missing files
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Windows Live <johneed@hotmail.com>
In-Reply-To: <COL119-W1514D40D1978583B42A629A8ED0@phx.gbl>
References: <COL119-W5023765948EB6ED67658CCA8EC0@phx.gbl>
	, <1319575086.16747.8.camel@dagon.hellion.org.uk>
	, <COL119-W47A054D3076A67A7A488ACA8EC0@phx.gbl>
	<COL119-W1514D40D1978583B42A629A8ED0@phx.gbl>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Wed, 26 Oct 2011 07:25:49 +0100
Message-ID: <1319610349.16747.33.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 Wed, 2011-10-26 at 05:36 +0100, Windows Live wrote:


> What is being achieved is the making of the version bump of xen,
> xen-tools and xen-pvgrub, 4.1.2. Having adjusted and repaired a number
> of bug fixes to xen-4.1.1, I couldn't help but wonder why the test
> phase was set restricted.  A test phase ,if present, in a package
> should be incorporated into the ebuild.

FWIW the "test" target appears to be very limited (it tests the python
bindings, not all that thoroughly AFAICT).

> I have added the ebuild, but I don't really think it will supply
> anything useful. To make it simpler, there are NO patches applied.
> Re-setting the path via -I ofcourse we can do. Frankly I doubt the
> 'fix' could have made things worse.  On repeating make test, the
> header was found and it progressed a few dozen lines or so further.

Once that header was installed it would be useless to anyone trying to
compile against it because it now contains paths relative to the xen
source tree layout. In fact I suspect your change would also break other
parts of the in tree build, by virtue of them being at different depths
in the hierarchy.

> The original error is clearly enough displayed in the initial
> description; 

> In file included from xen/lowlevel/xc/xc.c:23:0:
> ../../tools/libxc/xc_dom.h:17:31: fatal error: xen/libelf/libelf.h: No
> such file or directory
> compilation terminated.

In general the interesting stuff will likely be in the few lines before
the actual error, in particular the gcc invocation and sometimes the
make output about which directory it is building in etc. Please be wary
of trimming too much when posting error messages.

I just managed to reproduce the error though, it was non-obvious because
I had to run "make clean" in the tools tree first. I think you need to
have built the tools tree before running the test target, at least this
seems logical and works for me.

I suppose we should find a way to show this in the top-level Makefile
dependencies. Perhaps this is sufficient:

diff -r e6af32ecb448 Makefile
--- a/Makefile	Tue Oct 18 14:15:09 2011 +0100
+++ b/Makefile	Wed Oct 26 07:23:05 2011 +0100
@@ -31,7 +31,7 @@ endif
 # course, many tests require a machine running Xen itself, and these are
 # handled elsewhere.
 .PHONY: test
-test:
+test: tools
 	$(MAKE) -C tools/python test
 
 # build and install everything into local dist directory

I get failures now because I didn't build/test on a Xen host. That might
be a show stopper for an ebuild as well?

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 00:39:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 00:39:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIy4o-0006ww-E0; Wed, 26 Oct 2011 00:39:06 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIy36-0006Lt-8y
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 00:37:21 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319614637!1084654!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26894 invoked from network); 26 Oct 2011 07:37:17 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 07:37:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,408,1315180800"; 
   d="scan'208";a="8587770"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 07:37: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, 26 Oct 2011 08:37:17 +0100
Subject: Re: [Xen-devel] [PATCH] Prevent vif-bridge from adding
	user-created taps to a bridge
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jim Fehlig <jfehlig@suse.com>
In-Reply-To: <4EA740EB.7030804@suse.com>
References: <4EA740EB.7030804@suse.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Wed, 26 Oct 2011 08:37:16 +0100
Message-ID: <1319614636.16747.39.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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-26 at 00:06 +0100, Jim Fehlig wrote:
> I previously sent this from my @suse.com mail address without having
> subscribed it.  Sending again now that I have done so...
> 
> 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

Oh dear.

> SUBSYSTEM=="net", KERNEL=="tap*", ACTION=="add",
> RUN+="/etc/xen/scripts/vif-setup $env{ACTION} type_if=tap"
> 
> 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?

I think overall your change is an improvement, some thoughts:

For a tap device XENBUS_PATH is set in vif-common.sh:
        elif [ "$type_if" = tap ]; then
            # Check presence of compulsory args.
            : ${INTERFACE:?}
        
            # Get xenbus_path from device name.
            # The name is built like that: "tap${domid}.${devid}".
            dev_=${dev#tap}
            domid=${dev_%.*}
            devid=${dev_#*.}
        
            XENBUS_PATH="/local/domain/0/backend/vif/$domid/$devid"
        fi

Could there be false positives from this? Perhaps we should be more
aggressively checking for the tapX.Y, where X and Y are integers, format
as well? (that's not foolproof either though).

Perhaps the toolstack could write something to xenstore containing the
literal tap device name which it asked qemu for? Then we can simply read
it back here, e.g. /libxl/tap/0/tapX.Y -> $XENBUS_PATH (0 being the
backend domain and the content being the xenbus path so we don't need to
magic it up).

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 01:06:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 01:06:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIyVe-00081p-G2; Wed, 26 Oct 2011 01:06:50 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIyTi-0007oI-4Y
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 01:05:06 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319616286!132703!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15871 invoked from network); 26 Oct 2011 08:04:46 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 08:04:46 -0000
X-IronPort-AV: E=Sophos;i="4.69,408,1315180800"; 
   d="scan'208";a="8588402"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 08:04:46 +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, 26 Oct 2011 09:04:46 +0100
Subject: Re: [Xen-devel] Re: PCI passthrough stopped working, brainache!
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Andy Burns <xen.lists@burns.me.uk>
Date: Wed, 26 Oct 2011 09:04:46 +0100
In-Reply-To: <CAE1-PRcUkuBexHrCnCCNEA4m=yoC8qWjmtfsaSq0h9NUA6r2cw@mail.gmail.com>
References: <CAE1-PReH55X375oSb_gx4K_2iTTo67xpFfS8r7zv3KPtiOxj_A@mail.gmail.com>
	<CAE1-PRc9LqO07TjH3TnfSnEB8gLkBhw2211syeA04XPWts62Xg@mail.gmail.com>
	<CAE1-PRfg3fkMMSQyPO+y8dqxcE-KNJc--6bx84aouaQorOF27w@mail.gmail.com>
	<20111012035032.GB26092@phenom.oracle.com>
	<CAE1-PRfuo10T2iKJUNoY=Aj4S_TjUbiPT1jARv+iD7g+1qWuNg@mail.gmail.com>
	<CAE1-PRd9Kicm=dRtDmPKGXM8-fp62NyvDdpww38jA3Afwrt8+g@mail.gmail.com>
	<20111013181543.GF15499@phenom.oracle.com>
	<CAE1-PRfGTxeQ59jmHfB6bKKk2+B5bNnKhAvXoV-5P__+nkhgKQ@mail.gmail.com>
	<1318674976.11016.24.camel@dagon.hellion.org.uk>
	<CAE1-PRe3FZknxdCLkhkGbzd-i=y5eGMAwY+yoa36j61oHNcRSw@mail.gmail.com>
	<CAE1-PRcUkuBexHrCnCCNEA4m=yoC8qWjmtfsaSq0h9NUA6r2cw@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: <1319616286.9436.1.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 Mon, 2011-10-24 at 12:30 +0100, Andy Burns wrote:
> On 15 October 2011 12:27, Andy Burns <xen.lists@burns.me.uk> wrote:
> 
> > On 15 October 2011 11:36, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> >
> >> I think you've got 8G of RAM so one thing which might be worth trying is
> >> to give "mem=2G"
> >
> > A coconut for the gentleman!
> 
> I can see that the devs have been busy getting their ducks in a row
> for when the 3.2 merge window opens (3.1 is released now) so not
> wanted to pester about this as it's OK for now with the workarounds.
> 
> Initially I tried mem=2G, with dom0_mem=512M and two domUs of 512M and
> 1G respectively, I presume this caused a bit of ballooning in dom0 as
> I caught it with 400M'ish at one point and I had a little instability.
> 
> I pushed it up to mem=3G and at the same time added irqpoll for dom0
> and the pci domU (because I was seeing a few "nobody cared" messages
> in the domU at bootup and in the dom0 after shutting down the domU)
> those changes so far have resulted in a stable setup.
> 
> Not wanting to reboot the dom0 just yet (would like to see how stable
> it really is) but want to think about things to try when I *do* reboot
> it,
> I'm assuming the DMA problem will rear its head again if I try mem >=
> 4G, I haven't tried anything with dma_bits yet either, anything other
> suggestions or logging that might help?

Konrad had some suggestions in
<20111020034000.GA2401@phenom.dumpdata.com> which would be worth trying.
(that mail was sent on Thursday but appears to have sat in a queue
somewhere until after you sent this mail so just checking you've seen
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 Oct 26 01:17:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 01:17:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIygH-0001Rb-HD; Wed, 26 Oct 2011 01:17:49 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIyfS-0001F5-EX
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 01:16:58 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319617014!1081497!1
X-Originating-IP: [65.55.88.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30280 invoked from network); 26 Oct 2011 08:16:55 -0000
Received: from tx2ehsobe002.messaging.microsoft.com (HELO
	TX2EHSOBE003.bigfish.com) (65.55.88.12)
	by server-4.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	26 Oct 2011 08:16:55 -0000
Received: from mail36-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; Wed, 26 Oct 2011 08:16:48 +0000
Received: from mail36-tx2 (localhost.localdomain [127.0.0.1])	by
	mail36-tx2-R.bigfish.com (Postfix) with ESMTP id DD8467E95AF;
	Wed, 26 Oct 2011 08:16:50 +0000 (UTC)
X-SpamScore: -11
X-BigFish: VPS-11(zzbb2dK1432N98dKzz1202hzz8275dhz32i668h839h61h)
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 mail36-tx2 (localhost.localdomain [127.0.0.1]) by mail36-tx2
	(MessageSwitch) id 1319616911435357_22563;
	Wed, 26 Oct 2011 08:15:11 +0000 (UTC)
Received: from TX2EHSMHS039.bigfish.com (unknown [10.9.14.248])	by
	mail36-tx2.bigfish.com (Postfix) with ESMTP id 1320715F8238;
	Wed, 26 Oct 2011 08:14:49 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS039.bigfish.com (10.9.99.139) with Microsoft SMTP Server id
	14.1.225.22; Wed, 26 Oct 2011 08:14:45 +0000
X-WSS-ID: 0LTNYWP-01-HRA-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 2DDC31028260;	Wed, 26 Oct 2011 03:14:48 -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;
	Wed, 26 Oct 2011 03:15:00 -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, 26 Oct 2011 03:14:49 -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, 26 Oct 2011
	04:14:48 -0400
Message-ID: <4EA7C176.3020704@amd.com>
Date: Wed, 26 Oct 2011 10:14:46 +0200
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] libxl: Include a version of bsd's queue.h
References: <20134.62279.50041.126603@mariner.uk.xensource.com>
	<20134.63697.38240.276236@mariner.uk.xensource.com>
In-Reply-To: <20134.63697.38240.276236@mariner.uk.xensource.com>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: Anthony PERARD <anthony.perard@citrix.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 10/25/11 19:58, Ian Jackson wrote:
> Ian Jackson writes ("[Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h"):
>> We would like some linked list macros which are (a) well known to be
>> sane and (b) typesafe.  BSD's queue.h meets these criteria.
>>
>> The files in this changeset were obtained with:
>>    svn co -r 221843 svn://svn.freebsd.org/base/head/sys/sys/
>>    svn co -r 221843 svn://svn.freebsd.org/base/head/share/man/man3
>
> I posted this because I noticed (too late) that libxl_qmp.c includes
> <sys/queue.h>  and uses some macros that are only available in some
> queue.h versions.  This is not ideal for portability of course.
>
> I think it would be good to include this massaged queue.h and use it
> in libxl_qmp.c.

These headers cause build errors on *BSD due to collisions with the
native headers. Two solutions:

- Only use them on platforms where they do not exist
- Add a namespace prefix to the macros and use them consequently

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 Oct 26 01:22:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 01:22:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIykx-0001ss-S7; Wed, 26 Oct 2011 01:22:39 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIykN-0001gK-R7
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 01:22:04 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1319617293!41448485!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14187 invoked from network); 26 Oct 2011 08:21:33 -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;
	26 Oct 2011 08:21:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,408,1315180800"; 
   d="scan'208";a="8588779"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 08:22: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;
	Wed, 26 Oct 2011 09:22:00 +0100
Subject: Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Christoph Egger <Christoph.Egger@amd.com>
Date: Wed, 26 Oct 2011 09:22:00 +0100
In-Reply-To: <4EA7C176.3020704@amd.com>
References: <20134.62279.50041.126603@mariner.uk.xensource.com>
	<20134.63697.38240.276236@mariner.uk.xensource.com>
	<4EA7C176.3020704@amd.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319617320.9436.6.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Anthony Perard <anthony.perard@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 Wed, 2011-10-26 at 09:14 +0100, Christoph Egger wrote:
> On 10/25/11 19:58, Ian Jackson wrote:
> > Ian Jackson writes ("[Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h"):
> >> We would like some linked list macros which are (a) well known to be
> >> sane and (b) typesafe.  BSD's queue.h meets these criteria.
> >>
> >> The files in this changeset were obtained with:
> >>    svn co -r 221843 svn://svn.freebsd.org/base/head/sys/sys/
> >>    svn co -r 221843 svn://svn.freebsd.org/base/head/share/man/man3
> >
> > I posted this because I noticed (too late) that libxl_qmp.c includes
> > <sys/queue.h>  and uses some macros that are only available in some
> > queue.h versions.  This is not ideal for portability of course.
> >
> > I think it would be good to include this massaged queue.h and use it
> > in libxl_qmp.c.
> 
> These headers cause build errors on *BSD due to collisions with the
> native headers. Two solutions:
> 
> - Only use them on platforms where they do not exist
> - Add a namespace prefix to the macros and use them consequently

Ian provided a script which adds a namespace to these files at build
time, or at least was supposed to. If it isn't working properly then we
need to see the actual failures you are seeing.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 01:26:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 01: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 1RIyoj-0002J6-Qi; Wed, 26 Oct 2011 01:26:33 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIyoI-00027K-I2
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 01:26:07 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1319617562!1687352!1
X-Originating-IP: [65.55.88.13]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18597 invoked from network); 26 Oct 2011 08:26:03 -0000
Received: from tx2ehsobe003.messaging.microsoft.com (HELO
	TX2EHSOBE006.bigfish.com) (65.55.88.13)
	by server-10.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	26 Oct 2011 08:26:03 -0000
Received: from mail66-tx2-R.bigfish.com (10.9.14.239) by
	TX2EHSOBE006.bigfish.com (10.9.40.26) with Microsoft SMTP Server id
	14.1.225.22; Wed, 26 Oct 2011 08:25:56 +0000
Received: from mail66-tx2 (localhost.localdomain [127.0.0.1])	by
	mail66-tx2-R.bigfish.com (Postfix) with ESMTP id B67A11800299;
	Wed, 26 Oct 2011 08:25:58 +0000 (UTC)
X-SpamScore: -14
X-BigFish: VPS-14(zzbb2dK936eK1432N98dKzz1202hzz8275dhz32i668h839h93fh61h)
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 mail66-tx2 (localhost.localdomain [127.0.0.1]) by mail66-tx2
	(MessageSwitch) id 1319617558325956_1383;
	Wed, 26 Oct 2011 08:25:58 +0000 (UTC)
Received: from TX2EHSMHS009.bigfish.com (unknown [10.9.14.237])	by
	mail66-tx2.bigfish.com (Postfix) with ESMTP id 3DAEA1720053;
	Wed, 26 Oct 2011 08:25:58 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	TX2EHSMHS009.bigfish.com (10.9.99.109) with Microsoft SMTP Server id
	14.1.225.22; Wed, 26 Oct 2011 08:25:55 +0000
X-WSS-ID: 0LTNZFA-01-IBR-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 273BD1028269;	Wed, 26 Oct 2011 03:25:58 -0500 (CDT)
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;
	Wed, 26 Oct 2011 03:26:08 -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;
	Wed, 26 Oct 2011 03:25:58 -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, 26 Oct 2011
	04:25:57 -0400
Message-ID: <4EA7C414.8030809@amd.com>
Date: Wed, 26 Oct 2011 10:25:56 +0200
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 Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h
References: <20134.62279.50041.126603@mariner.uk.xensource.com>	
	<20134.63697.38240.276236@mariner.uk.xensource.com>	
	<4EA7C176.3020704@amd.com>
	<1319617320.9436.6.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319617320.9436.6.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset="UTF-8"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: Anthony Perard <anthony.perard@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 10/26/11 10:22, Ian Campbell wrote:
> On Wed, 2011-10-26 at 09:14 +0100, Christoph Egger wrote:
>> On 10/25/11 19:58, Ian Jackson wrote:
>>> Ian Jackson writes ("[Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h"):
>>>> We would like some linked list macros which are (a) well known to be
>>>> sane and (b) typesafe.  BSD's queue.h meets these criteria.
>>>>
>>>> The files in this changeset were obtained with:
>>>>     svn co -r 221843 svn://svn.freebsd.org/base/head/sys/sys/
>>>>     svn co -r 221843 svn://svn.freebsd.org/base/head/share/man/man3
>>>
>>> I posted this because I noticed (too late) that libxl_qmp.c includes
>>> <sys/queue.h>   and uses some macros that are only available in some
>>> queue.h versions.  This is not ideal for portability of course.
>>>
>>> I think it would be good to include this massaged queue.h and use it
>>> in libxl_qmp.c.
>>
>> These headers cause build errors on *BSD due to collisions with the
>> native headers. Two solutions:
>>
>> - Only use them on platforms where they do not exist
>> - Add a namespace prefix to the macros and use them consequently
>
> Ian provided a script which adds a namespace to these files at build
> time, or at least was supposed to. If it isn't working properly then we
> need to see the actual failures you are seeing.

Ah, ok. I missed the script on review.

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 Oct 26 01:28:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 01:28:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIyqK-0002h3-32; Wed, 26 Oct 2011 01:28:12 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIypl-0002Uk-C5
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 01:27:37 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1319617638!45779039!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20431 invoked from network); 26 Oct 2011 08:27:18 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-13.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 08:27:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,408,1315180800"; 
   d="scan'208";a="8588922"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 08:27:34 +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, 26 Oct 2011 09:27:34 +0100
Subject: Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Wed, 26 Oct 2011 09:27:33 +0100
In-Reply-To: <20134.62279.50041.126603@mariner.uk.xensource.com>
References: <20134.62279.50041.126603@mariner.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: <1319617653.9436.10.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-10-25 at 18:35 +0100, Ian Jackson wrote:
> We would like some linked list macros which are (a) well known to be
> sane and (b) typesafe.  BSD's queue.h meets these criteria.
> 
> The files in this changeset were obtained with:
>   svn co -r 221843 svn://svn.freebsd.org/base/head/sys/sys/
>   svn co -r 221843 svn://svn.freebsd.org/base/head/share/man/man3
> 
> We also provide some simple perlery to arrange to add the libxl_
> namespace prefix to the macros.  This will allow us to #include our
> modified queue.h in our public header file without clashing with
> anyone else who is also using another version of queue.h.
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
> 
> ---
>  tools/libxl/Makefile                |    5 +-
>  tools/libxl/bsd-queue.3             | 1044 +++++++++++++++++++++++++++++++++++
>  tools/libxl/bsd-sys-queue-h-seddery |   67 +++
>  tools/libxl/bsd-sys-queue.h         |  637 +++++++++++++++++++++
>  4 files changed, 1752 insertions(+), 1 deletions(-)
> 
> diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
> index 51e5132..5d7e0f5 100644
> --- a/tools/libxl/Makefile
> +++ b/tools/libxl/Makefile
> @@ -42,7 +42,7 @@ LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o
> 
>  $(LIBXL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) $(CFLAGS_libxenstore) $(CFLAGS_libblktapctl)
> 
> -AUTOINCS= libxlu_cfg_y.h libxlu_cfg_l.h
> +AUTOINCS= libxlu_cfg_y.h libxlu_cfg_l.h _libxl_list.h
>  AUTOSRCS= libxlu_cfg_y.c libxlu_cfg_l.c
>  LIBXLU_OBJS = libxlu_cfg_y.o libxlu_cfg_l.o libxlu_cfg.o \
>         libxlu_disk_l.o libxlu_disk.o
> @@ -81,6 +81,9 @@ _libxl_paths.h: genpath
>         rm -f $@.tmp
>         $(call move-if-changed,$@.2.tmp,$@)
> 
> +_libxl_list.h: bsd-sys-queue-h-seddery bsd-sys-queue.h
> +       ./$^ --prefix=libxl >$@.new && mv -f $@.new $@
> +

You should $(call move-if-changed,...) here.

>  libxl_paths.c: _libxl_paths.h
> 
>  libxl.h: _libxl_types.h
> diff --git a/tools/libxl/bsd-queue.3 b/tools/libxl/bsd-queue.3
> new file mode 100644
> index 0000000..007ca5c
> --- /dev/null
> +++ b/tools/libxl/bsd-queue.3

Did you intend to sederize/install this too?
> diff --git a/tools/libxl/bsd-sys-queue-h-seddery b/tools/libxl/bsd-sys-queue-h-seddery
> new file mode 100755
> index 0000000..0bab8e0
> --- /dev/null
> +++ b/tools/libxl/bsd-sys-queue-h-seddery
> @@ -0,0 +1,67 @@
> +#!/usr/bin/perl -p
> +#
> +# This script is part of the Xen build system.  It has a very
> +# permissive licence to avoid complicating the licence of the
> +# generated header file and to allow this seddery to be reused by
> +# other projects.
> +#
> +# Permission is hereby granted, free of charge, to any person
> +# obtaining a copy of this individual 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.
> +#
> +# Copyright (C) 2011 Citrix Ltd
> +
> +our $namespace, $ucnamespace;
> +
> +BEGIN {
> +    die unless @ARGV;
> +    $namespace = pop @ARGV;
> +    $namespace =~ s/^--prefix=// or die;
> +    $ucnamespace = uc $namespace;
> +
> +    print <<END or die $!;
> +/*
> + * DO NOT EDIT THIS FILE
> + *
> + * Generated automatically by bsd-sys-queue-h-seddery to
> + *  - introduce ${ucnamespace}_ and ${namespace}_ namespace prefixes
> + *  - turn "struct type" into "type" so that type arguments
> + *     to the macros are type names not struct tags
> + *
> + * The purpose of this seddery is to allow the resulting file to be
> + * freely included by software which might also want to include other
> + * list macros, and to be used when struct tags are not being used or
> + * not known.
> + */
> +END
> +}
> +
> +s/\b( _SYS_QUEUE |
> +      SLIST | LIST | STAILQ | TAILQ | QUEUE
> +      )/${ucnamespace}_$1/xg;
> +
> +s/\b( TRACEBUF | TRASHIT |
> +      QMD_
> +      )/${ucnamespace}__$1/xg;
> +
> +s/\b(
> +      qm_
> +      )/${namespace}__$1/xg;
> +
> +s/\b struct \s+ type \b/type/xg;
> diff --git a/tools/libxl/bsd-sys-queue.h b/tools/libxl/bsd-sys-queue.h
> new file mode 100644
> index 0000000..274e636
> --- /dev/null
> +++ b/tools/libxl/bsd-sys-queue.h

I worry (only a little) that people might start trying to edit this
directly.

Perhaps put it in a subdirectory (tools/libxl/external?) with a README
(which can include the svn co runes) and a big warning?

"hg chmod -r" might help in some small way too?

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 01:33:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 01:33:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIyvk-0003Lz-S0; Wed, 26 Oct 2011 01:33:49 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIyvH-0003AC-FN
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 01:33:19 -0700
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1319617996!30355281!1
X-Originating-IP: [209.85.161.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16373 invoked from network); 26 Oct 2011 08:33:16 -0000
Received: from mail-fx0-f43.google.com (HELO mail-fx0-f43.google.com)
	(209.85.161.43)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 08:33:16 -0000
Received: by faat9 with SMTP id t9so1828194faa.30
	for <xen-devel@lists.xensource.com>;
	Wed, 26 Oct 2011 01:33:16 -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
	:content-transfer-encoding;
	bh=8KgyEGUfl7M589/i/mBYB9T1dKvwIfxTSJwu2+fRXyI=;
	b=a6a3Z4MF7LZQFfIJbkBBTimz4PyhhhIFlldOydX5thrpoCtzaOEpjKDtxOaF1ap/dE
	74U6BJaEi+7sDMNezfyqriDKDrTr99/avx8au4ORa9QtHY27s38O0O9ROovJWnqKmqcM
	WUfTnmd8GuHbbWaFzqcOgR4NdWRiq+bbPXcG0=
MIME-Version: 1.0
Received: by 10.223.14.140 with SMTP id g12mr24754139faa.34.1319617996166;
	Wed, 26 Oct 2011 01:33:16 -0700 (PDT)
Received: by 10.223.72.205 with HTTP; Wed, 26 Oct 2011 01:33:16 -0700 (PDT)
Date: Wed, 26 Oct 2011 17:33:16 +0900
Message-ID: <CAP2B859xHK8zzgqAAWt-WdxxBcwNTKK2TfbqejfFnEW2mgr7jA@mail.gmail.com>
From: Daniel Castro <evil.dani@gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=windows-1252
Content-Transfer-Encoding: quoted-printable
Subject: [Xen-devel] Help: Mapping a grant reference fails
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 All,

I need a little help, I am trying to map a grant reference, I know
something is wrong because I have this in dmesg:
(XEN) grant_table.c:304:d0 Bad flags (0) or dom (0). (expected dom 0)
Also Xenstore reports this:
 error =3D ""
  backend =3D ""
   vbd =3D ""
    18 =3D ""
     832 =3D ""
      error =3D "1 mapping ring-ref 1 port 4"
This happens when my Block Driver is trying to connect to the back end.
I have traced the problem to the line where I am setting up
gnttab_setup_table, the struct has a field XEN_GUEST_HANDLE(ulong)
frame_list. Here is the problem, whatever type I assign it (void *,
unsigned long ...etc) fails. According to documentation this is the
address where the grant table begins. I I change the type of the
parameter in the struct it does not work. I think I have to resolve
the underlining issue on the XEN_GUEST_HANDLE...
The compiler has this error:
src/xen-blk.c:141:17: error: incompatible types when assigning to type
=91__guest_handle_ulong=92 from type =91struct grant_entry_v1 *=92

Thanks for the help,

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 Oct 26 01:45:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 01:45:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIz6y-00069g-Kv; Wed, 26 Oct 2011 01:45:24 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIz6D-0005wX-2k
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 01:44:38 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1319618672!792409!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18675 invoked from network); 26 Oct 2011 08:44:33 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 08:44:33 -0000
Received: by gyg13 with SMTP id 13so2284936gyg.30
	for <xen-devel@lists.xensource.com>;
	Wed, 26 Oct 2011 01:44:31 -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=HsE4KchM14+3ILHv5PZPtSBVlvGSt745palo28Zyjk8=;
	b=VfYUobswAE+Fxhq1672ZnpxvjnSiWjOHXOpAzaCOrWkyoxyPDCsFuEq3BWin3W3BIG
	tLnbbshkYobcq+P+IFxNlxTU/YAcsbuvT4ORzfVatO2KbVHggu1j64HY6x9MLJzBw5uS
	aPgApN8QQgD0uDOyDOkZr0gIFtX+JqecNY/A8=
MIME-Version: 1.0
Received: by 10.68.13.35 with SMTP id e3mr63681314pbc.31.1319618670525; Wed,
	26 Oct 2011 01:44:30 -0700 (PDT)
Received: by 10.142.13.5 with HTTP; Wed, 26 Oct 2011 01:44:30 -0700 (PDT)
In-Reply-To: <20134.62279.50041.126603@mariner.uk.xensource.com>
References: <20134.62279.50041.126603@mariner.uk.xensource.com>
Date: Wed, 26 Oct 2011 10:44:30 +0200
X-Google-Sender-Auth: h0QTm7MwxKUM1Q7vrTNilhXdR7k
Message-ID: <CAPLaKK4aqB1GT7_ksBmWwmPWVSbSLrr5aNh3mujNGMitPUm06Q@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Content-Type: text/plain; charset=UTF-8
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

2011/10/25 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> We would like some linked list macros which are (a) well known to be
> sane and (b) typesafe. =C2=A0BSD's queue.h meets these criteria.
>
> The files in this changeset were obtained with:
> =C2=A0svn co -r 221843 svn://svn.freebsd.org/base/head/sys/sys/
> =C2=A0svn co -r 221843 svn://svn.freebsd.org/base/head/share/man/man3
>
> We also provide some simple perlery to arrange to add the libxl_
> namespace prefix to the macros. =C2=A0This will allow us to #include our
> modified queue.h in our public header file without clashing with
> anyone else who is also using another version of queue.h.
>
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
>
> ---
> =C2=A0tools/libxl/Makefile =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0| =C2=A0 =C2=A05 +-
> =C2=A0tools/libxl/bsd-queue.3 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 |=
 1044 +++++++++++++++++++++++++++++++++++
> =C2=A0tools/libxl/bsd-sys-queue-h-seddery | =C2=A0 67 +++
> =C2=A0tools/libxl/bsd-sys-queue.h =C2=A0 =C2=A0 =C2=A0 =C2=A0 | =C2=A0637=
 +++++++++++++++++++++
> =C2=A04 files changed, 1752 insertions(+), 1 deletions(-)
>
> diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
> index 51e5132..5d7e0f5 100644
> --- a/tools/libxl/Makefile
> +++ b/tools/libxl/Makefile
> @@ -42,7 +42,7 @@ LIBXL_OBJS +=3D _libxl_types.o libxl_flask.o _libxl_typ=
es_internal.o
>
> =C2=A0$(LIBXL_OBJS): CFLAGS +=3D $(CFLAGS_libxenctrl) $(CFLAGS_libxengues=
t) $(CFLAGS_libxenstore) $(CFLAGS_libblktapctl)
>
> -AUTOINCS=3D libxlu_cfg_y.h libxlu_cfg_l.h
> +AUTOINCS=3D libxlu_cfg_y.h libxlu_cfg_l.h _libxl_list.h
> =C2=A0AUTOSRCS=3D libxlu_cfg_y.c libxlu_cfg_l.c
> =C2=A0LIBXLU_OBJS =3D libxlu_cfg_y.o libxlu_cfg_l.o libxlu_cfg.o \
> =C2=A0 =C2=A0 =C2=A0 =C2=A0libxlu_disk_l.o libxlu_disk.o
> @@ -81,6 +81,9 @@ _libxl_paths.h: genpath
> =C2=A0 =C2=A0 =C2=A0 =C2=A0rm -f $@.tmp
> =C2=A0 =C2=A0 =C2=A0 =C2=A0$(call move-if-changed,$@.2.tmp,$@)
>
> +_libxl_list.h: bsd-sys-queue-h-seddery bsd-sys-queue.h
> + =C2=A0 =C2=A0 =C2=A0 ./$^ --prefix=3Dlibxl >$@.new && mv -f $@.new $@
> +
> =C2=A0libxl_paths.c: _libxl_paths.h
>
> =C2=A0libxl.h: _libxl_types.h
> diff --git a/tools/libxl/bsd-queue.3 b/tools/libxl/bsd-queue.3
> new file mode 100644
> index 0000000..007ca5c
> --- /dev/null
> +++ b/tools/libxl/bsd-queue.3
> @@ -0,0 +1,1044 @@
> +.\" Copyright (c) 1993
> +.\" =C2=A0 =C2=A0The Regents of the University of California. =C2=A0All =
rights reserved.
> +.\"
> +.\" Redistribution and use in source and binary forms, with or without
> +.\" modification, are permitted provided that the following conditions
> +.\" are met:
> +.\" 1. Redistributions of source code must retain the above copyright
> +.\" =C2=A0 =C2=A0notice, this list of conditions and the following discl=
aimer.
> +.\" 2. Redistributions in binary form must reproduce the above copyright
> +.\" =C2=A0 =C2=A0notice, this list of conditions and the following discl=
aimer in the
> +.\" =C2=A0 =C2=A0documentation and/or other materials provided with the =
distribution.
> +.\" 3. All advertising materials mentioning features or use of this soft=
ware
> +.\" =C2=A0 =C2=A0must display the following acknowledgement:
> +.\" =C2=A0 =C2=A0This product includes software developed by the Univers=
ity of
> +.\" =C2=A0 =C2=A0California, Berkeley and its contributors.
> +.\" 4. Neither the name of the University nor the names of its contribut=
ors
> +.\" =C2=A0 =C2=A0may be used to endorse or promote products derived from=
 this software
> +.\" =C2=A0 =C2=A0without specific prior written permission.
> +.\"
> +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' =
AND
> +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, TH=
E
> +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR P=
URPOSE
> +.\" ARE DISCLAIMED. =C2=A0IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS =
BE LIABLE
> +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQU=
ENTIAL
> +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GO=
ODS
> +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION=
)
> +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, =
STRICT
> +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN AN=
Y WAY
> +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY =
OF
> +.\" SUCH DAMAGE.
> +.\"
> +.\" =C2=A0 =C2=A0@(#)queue.3 =C2=A0 =C2=A0 8.2 (Berkeley) 1/24/94
> +.\" $FreeBSD$
> +.\"
> +.Dd May 13, 2011
> +.Dt QUEUE 3
> +.Os
> +.Sh NAME
> +.Nm SLIST_EMPTY ,
> +.Nm SLIST_ENTRY ,
> +.Nm SLIST_FIRST ,
> +.Nm SLIST_FOREACH ,
> +.Nm SLIST_FOREACH_SAFE ,
> +.Nm SLIST_HEAD ,
> +.Nm SLIST_HEAD_INITIALIZER ,
> +.Nm SLIST_INIT ,
> +.Nm SLIST_INSERT_AFTER ,
> +.Nm SLIST_INSERT_HEAD ,
> +.Nm SLIST_NEXT ,
> +.Nm SLIST_REMOVE_AFTER ,
> +.Nm SLIST_REMOVE_HEAD ,
> +.Nm SLIST_REMOVE ,
> +.Nm SLIST_SWAP ,
> +.Nm STAILQ_CONCAT ,
> +.Nm STAILQ_EMPTY ,
> +.Nm STAILQ_ENTRY ,
> +.Nm STAILQ_FIRST ,
> +.Nm STAILQ_FOREACH ,
> +.Nm STAILQ_FOREACH_SAFE ,
> +.Nm STAILQ_HEAD ,
> +.Nm STAILQ_HEAD_INITIALIZER ,
> +.Nm STAILQ_INIT ,
> +.Nm STAILQ_INSERT_AFTER ,
> +.Nm STAILQ_INSERT_HEAD ,
> +.Nm STAILQ_INSERT_TAIL ,
> +.Nm STAILQ_LAST ,
> +.Nm STAILQ_NEXT ,
> +.Nm STAILQ_REMOVE_AFTER ,
> +.Nm STAILQ_REMOVE_HEAD ,
> +.Nm STAILQ_REMOVE ,
> +.Nm STAILQ_SWAP ,
> +.Nm LIST_EMPTY ,
> +.Nm LIST_ENTRY ,
> +.Nm LIST_FIRST ,
> +.Nm LIST_FOREACH ,
> +.Nm LIST_FOREACH_SAFE ,
> +.Nm LIST_HEAD ,
> +.Nm LIST_HEAD_INITIALIZER ,
> +.Nm LIST_INIT ,
> +.Nm LIST_INSERT_AFTER ,
> +.Nm LIST_INSERT_BEFORE ,
> +.Nm LIST_INSERT_HEAD ,
> +.Nm LIST_NEXT ,
> +.Nm LIST_REMOVE ,
> +.Nm LIST_SWAP ,
> +.Nm TAILQ_CONCAT ,
> +.Nm TAILQ_EMPTY ,
> +.Nm TAILQ_ENTRY ,
> +.Nm TAILQ_FIRST ,
> +.Nm TAILQ_FOREACH ,
> +.Nm TAILQ_FOREACH_SAFE ,
> +.Nm TAILQ_FOREACH_REVERSE ,
> +.Nm TAILQ_FOREACH_REVERSE_SAFE ,
> +.Nm TAILQ_HEAD ,
> +.Nm TAILQ_HEAD_INITIALIZER ,
> +.Nm TAILQ_INIT ,
> +.Nm TAILQ_INSERT_AFTER ,
> +.Nm TAILQ_INSERT_BEFORE ,
> +.Nm TAILQ_INSERT_HEAD ,
> +.Nm TAILQ_INSERT_TAIL ,
> +.Nm TAILQ_LAST ,
> +.Nm TAILQ_NEXT ,
> +.Nm TAILQ_PREV ,
> +.Nm TAILQ_REMOVE ,
> +.Nm TAILQ_SWAP
> +.Nd implementations of singly-linked lists, singly-linked tail queues,
> +lists and tail queues
> +.Sh SYNOPSIS
> +.In sys/queue.h
> +.\"
> +.Fn SLIST_EMPTY "SLIST_HEAD *head"
> +.Fn SLIST_ENTRY "TYPE"
> +.Fn SLIST_FIRST "SLIST_HEAD *head"
> +.Fn SLIST_FOREACH "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME"
> +.Fn SLIST_FOREACH_SAFE "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME"=
 "TYPE *temp_var"
> +.Fn SLIST_HEAD "HEADNAME" "TYPE"
> +.Fn SLIST_HEAD_INITIALIZER "SLIST_HEAD head"
> +.Fn SLIST_INIT "SLIST_HEAD *head"
> +.Fn SLIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "SLIST_ENTRY NAME"
> +.Fn SLIST_INSERT_HEAD "SLIST_HEAD *head" "TYPE *elm" "SLIST_ENTRY NAME"
> +.Fn SLIST_NEXT "TYPE *elm" "SLIST_ENTRY NAME"
> +.Fn SLIST_REMOVE_AFTER "TYPE *elm" "SLIST_ENTRY NAME"
> +.Fn SLIST_REMOVE_HEAD "SLIST_HEAD *head" "SLIST_ENTRY NAME"
> +.Fn SLIST_REMOVE "SLIST_HEAD *head" "TYPE *elm" "TYPE" "SLIST_ENTRY NAME=
"
> +.Fn SLIST_SWAP "SLIST_HEAD *head1" "SLIST_HEAD *head2" "SLIST_ENTRY NAME=
"
> +.\"
> +.Fn STAILQ_CONCAT "STAILQ_HEAD *head1" "STAILQ_HEAD *head2"
> +.Fn STAILQ_EMPTY "STAILQ_HEAD *head"
> +.Fn STAILQ_ENTRY "TYPE"
> +.Fn STAILQ_FIRST "STAILQ_HEAD *head"
> +.Fn STAILQ_FOREACH "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
> +.Fn STAILQ_FOREACH_SAFE "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NA=
ME" "TYPE *temp_var"
> +.Fn STAILQ_HEAD "HEADNAME" "TYPE"
> +.Fn STAILQ_HEAD_INITIALIZER "STAILQ_HEAD head"
> +.Fn STAILQ_INIT "STAILQ_HEAD *head"
> +.Fn STAILQ_INSERT_AFTER "STAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" =
"STAILQ_ENTRY NAME"
> +.Fn STAILQ_INSERT_HEAD "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAM=
E"
> +.Fn STAILQ_INSERT_TAIL "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAM=
E"
> +.Fn STAILQ_LAST "STAILQ_HEAD *head" "TYPE" "STAILQ_ENTRY NAME"
> +.Fn STAILQ_NEXT "TYPE *elm" "STAILQ_ENTRY NAME"
> +.Fn STAILQ_REMOVE_AFTER "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NA=
ME"
> +.Fn STAILQ_REMOVE_HEAD "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
> +.Fn STAILQ_REMOVE "STAILQ_HEAD *head" "TYPE *elm" "TYPE" "STAILQ_ENTRY N=
AME"
> +.Fn STAILQ_SWAP "STAILQ_HEAD *head1" "STAILQ_HEAD *head2" "STAILQ_ENTRY =
NAME"
> +.\"
> +.Fn LIST_EMPTY "LIST_HEAD *head"
> +.Fn LIST_ENTRY "TYPE"
> +.Fn LIST_FIRST "LIST_HEAD *head"
> +.Fn LIST_FOREACH "TYPE *var" "LIST_HEAD *head" "LIST_ENTRY NAME"
> +.Fn LIST_FOREACH_SAFE "TYPE *var" "LIST_HEAD *head" "LIST_ENTRY NAME" "T=
YPE *temp_var"
> +.Fn LIST_HEAD "HEADNAME" "TYPE"
> +.Fn LIST_HEAD_INITIALIZER "LIST_HEAD head"
> +.Fn LIST_INIT "LIST_HEAD *head"
> +.Fn LIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
> +.Fn LIST_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
> +.Fn LIST_INSERT_HEAD "LIST_HEAD *head" "TYPE *elm" "LIST_ENTRY NAME"
> +.Fn LIST_NEXT "TYPE *elm" "LIST_ENTRY NAME"
> +.Fn LIST_REMOVE "TYPE *elm" "LIST_ENTRY NAME"
> +.Fn LIST_SWAP "LIST_HEAD *head1" "LIST_HEAD *head2" "TYPE" "LIST_ENTRY N=
AME"
> +.\"
> +.Fn TAILQ_CONCAT "TAILQ_HEAD *head1" "TAILQ_HEAD *head2" "TAILQ_ENTRY NA=
ME"
> +.Fn TAILQ_EMPTY "TAILQ_HEAD *head"
> +.Fn TAILQ_ENTRY "TYPE"
> +.Fn TAILQ_FIRST "TAILQ_HEAD *head"
> +.Fn TAILQ_FOREACH "TYPE *var" "TAILQ_HEAD *head" "TAILQ_ENTRY NAME"
> +.Fn TAILQ_FOREACH_SAFE "TYPE *var" "TAILQ_HEAD *head" "TAILQ_ENTRY NAME"=
 "TYPE *temp_var"
> +.Fn TAILQ_FOREACH_REVERSE "TYPE *var" "TAILQ_HEAD *head" "HEADNAME" "TAI=
LQ_ENTRY NAME"
> +.Fn TAILQ_FOREACH_REVERSE_SAFE "TYPE *var" "TAILQ_HEAD *head" "HEADNAME"=
 "TAILQ_ENTRY NAME" "TYPE *temp_var"
> +.Fn TAILQ_HEAD "HEADNAME" "TYPE"
> +.Fn TAILQ_HEAD_INITIALIZER "TAILQ_HEAD head"
> +.Fn TAILQ_INIT "TAILQ_HEAD *head"
> +.Fn TAILQ_INSERT_AFTER "TAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "T=
AILQ_ENTRY NAME"
> +.Fn TAILQ_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME"
> +.Fn TAILQ_INSERT_HEAD "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
> +.Fn TAILQ_INSERT_TAIL "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
> +.Fn TAILQ_LAST "TAILQ_HEAD *head" "HEADNAME"
> +.Fn TAILQ_NEXT "TYPE *elm" "TAILQ_ENTRY NAME"
> +.Fn TAILQ_PREV "TYPE *elm" "HEADNAME" "TAILQ_ENTRY NAME"
> +.Fn TAILQ_REMOVE "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
> +.Fn TAILQ_SWAP "TAILQ_HEAD *head1" "TAILQ_HEAD *head2" "TYPE" "TAILQ_ENT=
RY NAME"
> +.\"
> +.Sh DESCRIPTION
> +These macros define and operate on four types of data structures:
> +singly-linked lists, singly-linked tail queues, lists, and tail queues.
> +All four structures support the following functionality:
> +.Bl -enum -compact -offset indent
> +.It
> +Insertion of a new entry at the head of the list.
> +.It
> +Insertion of a new entry after any element in the list.
> +.It
> +O(1) removal of an entry from the head of the list.
> +.It
> +Forward traversal through the list.
> +.It
> +Swawpping the contents of two lists.
> +.El
> +.Pp
> +Singly-linked lists are the simplest of the four data structures
> +and support only the above functionality.
> +Singly-linked lists are ideal for applications with large datasets
> +and few or no removals,
> +or for implementing a LIFO queue.
> +Singly-linked lists add the following functionality:
> +.Bl -enum -compact -offset indent
> +.It
> +O(n) removal of any entry in the list.
> +.El
> +.Pp
> +Singly-linked tail queues add the following functionality:
> +.Bl -enum -compact -offset indent
> +.It
> +Entries can be added at the end of a list.
> +.It
> +O(n) removal of any entry in the list.
> +.It
> +They may be concatenated.
> +.El
> +However:
> +.Bl -enum -compact -offset indent
> +.It
> +All list insertions must specify the head of the list.
> +.It
> +Each head entry requires two pointers rather than one.
> +.It
> +Code size is about 15% greater and operations run about 20% slower
> +than singly-linked lists.
> +.El
> +.Pp
> +Singly-linked tailqs are ideal for applications with large datasets and
> +few or no removals,
> +or for implementing a FIFO queue.
> +.Pp
> +All doubly linked types of data structures (lists and tail queues)
> +additionally allow:
> +.Bl -enum -compact -offset indent
> +.It
> +Insertion of a new entry before any element in the list.
> +.It
> +O(1) removal of any entry in the list.
> +.El
> +However:
> +.Bl -enum -compact -offset indent
> +.It
> +Each element requires two pointers rather than one.
> +.It
> +Code size and execution time of operations (except for removal) is about
> +twice that of the singly-linked data-structures.
> +.El
> +.Pp
> +Linked lists are the simplest of the doubly linked data structures and s=
upport
> +only the above functionality over singly-linked lists.
> +.Pp
> +Tail queues add the following functionality:
> +.Bl -enum -compact -offset indent
> +.It
> +Entries can be added at the end of a list.
> +.It
> +They may be traversed backwards, from tail to head.
> +.It
> +They may be concatenated.
> +.El
> +However:
> +.Bl -enum -compact -offset indent
> +.It
> +All list insertions and removals must specify the head of the list.
> +.It
> +Each head entry requires two pointers rather than one.
> +.It
> +Code size is about 15% greater and operations run about 20% slower
> +than singly-linked lists.
> +.El
> +.Pp
> +In the macro definitions,
> +.Fa TYPE
> +is the name of a user defined structure,
> +that must contain a field of type
> +.Li SLIST_ENTRY ,
> +.Li STAILQ_ENTRY ,
> +.Li LIST_ENTRY ,
> +or
> +.Li TAILQ_ENTRY ,
> +named
> +.Fa NAME .
> +The argument
> +.Fa HEADNAME
> +is the name of a user defined structure that must be declared
> +using the macros
> +.Li SLIST_HEAD ,
> +.Li STAILQ_HEAD ,
> +.Li LIST_HEAD ,
> +or
> +.Li TAILQ_HEAD .
> +See the examples below for further explanation of how these
> +macros are used.
> +.Sh SINGLY-LINKED LISTS
> +A singly-linked list is headed by a structure defined by the
> +.Nm SLIST_HEAD
> +macro.
> +This structure contains a single pointer to the first element
> +on the list.
> +The elements are singly linked for minimum space and pointer manipulatio=
n
> +overhead at the expense of O(n) removal for arbitrary elements.
> +New elements can be added to the list after an existing element or
> +at the head of the list.
> +An
> +.Fa SLIST_HEAD
> +structure is declared as follows:
> +.Bd -literal -offset indent
> +SLIST_HEAD(HEADNAME, TYPE) head;
> +.Ed
> +.Pp
> +where
> +.Fa HEADNAME
> +is the name of the structure to be defined, and
> +.Fa TYPE
> +is the type of the elements to be linked into the list.
> +A pointer to the head of the list can later be declared as:
> +.Bd -literal -offset indent
> +struct HEADNAME *headp;
> +.Ed
> +.Pp
> +(The names
> +.Li head
> +and
> +.Li headp
> +are user selectable.)
> +.Pp
> +The macro
> +.Nm SLIST_HEAD_INITIALIZER
> +evaluates to an initializer for the list
> +.Fa head .
> +.Pp
> +The macro
> +.Nm SLIST_EMPTY
> +evaluates to true if there are no elements in the list.
> +.Pp
> +The macro
> +.Nm SLIST_ENTRY
> +declares a structure that connects the elements in
> +the list.
> +.Pp
> +The macro
> +.Nm SLIST_FIRST
> +returns the first element in the list or NULL if the list is empty.
> +.Pp
> +The macro
> +.Nm SLIST_FOREACH
> +traverses the list referenced by
> +.Fa head
> +in the forward direction, assigning each element in
> +turn to
> +.Fa var .
> +.Pp
> +The macro
> +.Nm SLIST_FOREACH_SAFE
> +traverses the list referenced by
> +.Fa head
> +in the forward direction, assigning each element in
> +turn to
> +.Fa var .
> +However, unlike
> +.Fn SLIST_FOREACH
> +here it is permitted to both remove
> +.Fa var
> +as well as free it from within the loop safely without interfering with =
the
> +traversal.
> +.Pp
> +The macro
> +.Nm SLIST_INIT
> +initializes the list referenced by
> +.Fa head .
> +.Pp
> +The macro
> +.Nm SLIST_INSERT_HEAD
> +inserts the new element
> +.Fa elm
> +at the head of the list.
> +.Pp
> +The macro
> +.Nm SLIST_INSERT_AFTER
> +inserts the new element
> +.Fa elm
> +after the element
> +.Fa listelm .
> +.Pp
> +The macro
> +.Nm SLIST_NEXT
> +returns the next element in the list.
> +.Pp
> +The macro
> +.Nm SLIST_REMOVE_AFTER
> +removes the element after
> +.Fa elm
> +from the list. Unlike
> +.Fa SLIST_REMOVE ,
> +this macro does not traverse the entire list.
> +.Pp
> +The macro
> +.Nm SLIST_REMOVE_HEAD
> +removes the element
> +.Fa elm
> +from the head of the list.
> +For optimum efficiency,
> +elements being removed from the head of the list should explicitly use
> +this macro instead of the generic
> +.Fa SLIST_REMOVE
> +macro.
> +.Pp
> +The macro
> +.Nm SLIST_REMOVE
> +removes the element
> +.Fa elm
> +from the list.
> +.Pp
> +The macro
> +.Nm SLIST_SWAP
> +swaps the contents of
> +.Fa head1
> +and
> +.Fa head2 .
> +.Sh SINGLY-LINKED LIST EXAMPLE
> +.Bd -literal
> +SLIST_HEAD(slisthead, entry) head =3D
> + =C2=A0 =C2=A0SLIST_HEAD_INITIALIZER(head);
> +struct slisthead *headp; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 /* Singly-linked List head. */
> +struct entry {
> + =C2=A0 =C2=A0 =C2=A0 ...
> + =C2=A0 =C2=A0 =C2=A0 SLIST_ENTRY(entry) entries; =C2=A0 =C2=A0 /* Singl=
y-linked List. */
> + =C2=A0 =C2=A0 =C2=A0 ...
> +} *n1, *n2, *n3, *np;
> +
> +SLIST_INIT(&head); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 /* Initialize the list. */
> +
> +n1 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert at the head=
. */
> +SLIST_INSERT_HEAD(&head, n1, entries);
> +
> +n2 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert after. */
> +SLIST_INSERT_AFTER(n1, n2, entries);
> +
> +SLIST_REMOVE(&head, n2, entry, entries);/* Deletion. */
> +free(n2);
> +
> +n3 =3D SLIST_FIRST(&head);
> +SLIST_REMOVE_HEAD(&head, entries); =C2=A0 =C2=A0 /* Deletion from the he=
ad. */
> +free(n3);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Forward t=
raversal. */
> +SLIST_FOREACH(np, &head, entries)
> + =C2=A0 =C2=A0 =C2=A0 np-> ...
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Safe forw=
ard traversal. */
> +SLIST_FOREACH_SAFE(np, &head, entries, np_temp) {
> + =C2=A0 =C2=A0 =C2=A0 np->do_stuff();
> + =C2=A0 =C2=A0 =C2=A0 ...
> + =C2=A0 =C2=A0 =C2=A0 SLIST_REMOVE(&head, np, entry, entries);
> + =C2=A0 =C2=A0 =C2=A0 free(np);
> +}
> +
> +while (!SLIST_EMPTY(&head)) { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* List =
Deletion. */
> + =C2=A0 =C2=A0 =C2=A0 n1 =3D SLIST_FIRST(&head);
> + =C2=A0 =C2=A0 =C2=A0 SLIST_REMOVE_HEAD(&head, entries);
> + =C2=A0 =C2=A0 =C2=A0 free(n1);
> +}
> +.Ed
> +.Sh SINGLY-LINKED TAIL QUEUES
> +A singly-linked tail queue is headed by a structure defined by the
> +.Nm STAILQ_HEAD
> +macro.
> +This structure contains a pair of pointers,
> +one to the first element in the tail queue and the other to
> +the last element in the tail queue.
> +The elements are singly linked for minimum space and pointer
> +manipulation overhead at the expense of O(n) removal for arbitrary
> +elements.
> +New elements can be added to the tail queue after an existing element,
> +at the head of the tail queue, or at the end of the tail queue.
> +A
> +.Fa STAILQ_HEAD
> +structure is declared as follows:
> +.Bd -literal -offset indent
> +STAILQ_HEAD(HEADNAME, TYPE) head;
> +.Ed
> +.Pp
> +where
> +.Li HEADNAME
> +is the name of the structure to be defined, and
> +.Li TYPE
> +is the type of the elements to be linked into the tail queue.
> +A pointer to the head of the tail queue can later be declared as:
> +.Bd -literal -offset indent
> +struct HEADNAME *headp;
> +.Ed
> +.Pp
> +(The names
> +.Li head
> +and
> +.Li headp
> +are user selectable.)
> +.Pp
> +The macro
> +.Nm STAILQ_HEAD_INITIALIZER
> +evaluates to an initializer for the tail queue
> +.Fa head .
> +.Pp
> +The macro
> +.Nm STAILQ_CONCAT
> +concatenates the tail queue headed by
> +.Fa head2
> +onto the end of the one headed by
> +.Fa head1
> +removing all entries from the former.
> +.Pp
> +The macro
> +.Nm STAILQ_EMPTY
> +evaluates to true if there are no items on the tail queue.
> +.Pp
> +The macro
> +.Nm STAILQ_ENTRY
> +declares a structure that connects the elements in
> +the tail queue.
> +.Pp
> +The macro
> +.Nm STAILQ_FIRST
> +returns the first item on the tail queue or NULL if the tail queue
> +is empty.
> +.Pp
> +The macro
> +.Nm STAILQ_FOREACH
> +traverses the tail queue referenced by
> +.Fa head
> +in the forward direction, assigning each element
> +in turn to
> +.Fa var .
> +.Pp
> +The macro
> +.Nm STAILQ_FOREACH_SAFE
> +traverses the tail queue referenced by
> +.Fa head
> +in the forward direction, assigning each element
> +in turn to
> +.Fa var .
> +However, unlike
> +.Fn STAILQ_FOREACH
> +here it is permitted to both remove
> +.Fa var
> +as well as free it from within the loop safely without interfering with =
the
> +traversal.
> +.Pp
> +The macro
> +.Nm STAILQ_INIT
> +initializes the tail queue referenced by
> +.Fa head .
> +.Pp
> +The macro
> +.Nm STAILQ_INSERT_HEAD
> +inserts the new element
> +.Fa elm
> +at the head of the tail queue.
> +.Pp
> +The macro
> +.Nm STAILQ_INSERT_TAIL
> +inserts the new element
> +.Fa elm
> +at the end of the tail queue.
> +.Pp
> +The macro
> +.Nm STAILQ_INSERT_AFTER
> +inserts the new element
> +.Fa elm
> +after the element
> +.Fa listelm .
> +.Pp
> +The macro
> +.Nm STAILQ_LAST
> +returns the last item on the tail queue.
> +If the tail queue is empty the return value is
> +.Dv NULL .
> +.Pp
> +The macro
> +.Nm STAILQ_NEXT
> +returns the next item on the tail queue, or NULL this item is the last.
> +.Pp
> +The macro
> +.Nm STAILQ_REMOVE_AFTER
> +removes the element after
> +.Fa elm
> +from the tail queue. Unlike
> +.Fa STAILQ_REMOVE ,
> +this macro does not traverse the entire tail queue.
> +.Pp
> +The macro
> +.Nm STAILQ_REMOVE_HEAD
> +removes the element at the head of the tail queue.
> +For optimum efficiency,
> +elements being removed from the head of the tail queue should
> +use this macro explicitly rather than the generic
> +.Fa STAILQ_REMOVE
> +macro.
> +.Pp
> +The macro
> +.Nm STAILQ_REMOVE
> +removes the element
> +.Fa elm
> +from the tail queue.
> +.Pp
> +The macro
> +.Nm STAILQ_SWAP
> +swaps the contents of
> +.Fa head1
> +and
> +.Fa head2 .
> +.Sh SINGLY-LINKED TAIL QUEUE EXAMPLE
> +.Bd -literal
> +STAILQ_HEAD(stailhead, entry) head =3D
> + =C2=A0 =C2=A0STAILQ_HEAD_INITIALIZER(head);
> +struct stailhead *headp; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 /* Singly-linked tail queue head. */
> +struct entry {
> + =C2=A0 =C2=A0 =C2=A0 ...
> + =C2=A0 =C2=A0 =C2=A0 STAILQ_ENTRY(entry) entries; =C2=A0 =C2=A0/* Tail =
queue. */
> + =C2=A0 =C2=A0 =C2=A0 ...
> +} *n1, *n2, *n3, *np;
> +
> +STAILQ_INIT(&head); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0/* Initialize the queue. */
> +
> +n1 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert at the head=
. */
> +STAILQ_INSERT_HEAD(&head, n1, entries);
> +
> +n1 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert at the tail=
. */
> +STAILQ_INSERT_TAIL(&head, n1, entries);
> +
> +n2 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert after. */
> +STAILQ_INSERT_AFTER(&head, n1, n2, entries);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Deletion.=
 */
> +STAILQ_REMOVE(&head, n2, entry, entries);
> +free(n2);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Deletion =
from the head. */
> +n3 =3D STAILQ_FIRST(&head);
> +STAILQ_REMOVE_HEAD(&head, entries);
> +free(n3);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Forward t=
raversal. */
> +STAILQ_FOREACH(np, &head, entries)
> + =C2=A0 =C2=A0 =C2=A0 np-> ...
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Safe forw=
ard traversal. */
> +STAILQ_FOREACH_SAFE(np, &head, entries, np_temp) {
> + =C2=A0 =C2=A0 =C2=A0 np->do_stuff();
> + =C2=A0 =C2=A0 =C2=A0 ...
> + =C2=A0 =C2=A0 =C2=A0 STAILQ_REMOVE(&head, np, entry, entries);
> + =C2=A0 =C2=A0 =C2=A0 free(np);
> +}
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* TailQ Del=
etion. */
> +while (!STAILQ_EMPTY(&head)) {
> + =C2=A0 =C2=A0 =C2=A0 n1 =3D STAILQ_FIRST(&head);
> + =C2=A0 =C2=A0 =C2=A0 STAILQ_REMOVE_HEAD(&head, entries);
> + =C2=A0 =C2=A0 =C2=A0 free(n1);
> +}
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Faster Ta=
ilQ Deletion. */
> +n1 =3D STAILQ_FIRST(&head);
> +while (n1 !=3D NULL) {
> + =C2=A0 =C2=A0 =C2=A0 n2 =3D STAILQ_NEXT(n1, entries);
> + =C2=A0 =C2=A0 =C2=A0 free(n1);
> + =C2=A0 =C2=A0 =C2=A0 n1 =3D n2;
> +}
> +STAILQ_INIT(&head);
> +.Ed
> +.Sh LISTS
> +A list is headed by a structure defined by the
> +.Nm LIST_HEAD
> +macro.
> +This structure contains a single pointer to the first element
> +on the list.
> +The elements are doubly linked so that an arbitrary element can be
> +removed without traversing the list.
> +New elements can be added to the list after an existing element,
> +before an existing element, or at the head of the list.
> +A
> +.Fa LIST_HEAD
> +structure is declared as follows:
> +.Bd -literal -offset indent
> +LIST_HEAD(HEADNAME, TYPE) head;
> +.Ed
> +.Pp
> +where
> +.Fa HEADNAME
> +is the name of the structure to be defined, and
> +.Fa TYPE
> +is the type of the elements to be linked into the list.
> +A pointer to the head of the list can later be declared as:
> +.Bd -literal -offset indent
> +struct HEADNAME *headp;
> +.Ed
> +.Pp
> +(The names
> +.Li head
> +and
> +.Li headp
> +are user selectable.)
> +.Pp
> +The macro
> +.Nm LIST_HEAD_INITIALIZER
> +evaluates to an initializer for the list
> +.Fa head .
> +.Pp
> +The macro
> +.Nm LIST_EMPTY
> +evaluates to true if there are no elements in the list.
> +.Pp
> +The macro
> +.Nm LIST_ENTRY
> +declares a structure that connects the elements in
> +the list.
> +.Pp
> +The macro
> +.Nm LIST_FIRST
> +returns the first element in the list or NULL if the list
> +is empty.
> +.Pp
> +The macro
> +.Nm LIST_FOREACH
> +traverses the list referenced by
> +.Fa head
> +in the forward direction, assigning each element in turn to
> +.Fa var .
> +.Pp
> +The macro
> +.Nm LIST_FOREACH_SAFE
> +traverses the list referenced by
> +.Fa head
> +in the forward direction, assigning each element in turn to
> +.Fa var .
> +However, unlike
> +.Fn LIST_FOREACH
> +here it is permitted to both remove
> +.Fa var
> +as well as free it from within the loop safely without interfering with =
the
> +traversal.
> +.Pp
> +The macro
> +.Nm LIST_INIT
> +initializes the list referenced by
> +.Fa head .
> +.Pp
> +The macro
> +.Nm LIST_INSERT_HEAD
> +inserts the new element
> +.Fa elm
> +at the head of the list.
> +.Pp
> +The macro
> +.Nm LIST_INSERT_AFTER
> +inserts the new element
> +.Fa elm
> +after the element
> +.Fa listelm .
> +.Pp
> +The macro
> +.Nm LIST_INSERT_BEFORE
> +inserts the new element
> +.Fa elm
> +before the element
> +.Fa listelm .
> +.Pp
> +The macro
> +.Nm LIST_NEXT
> +returns the next element in the list, or NULL if this is the last.
> +.Pp
> +The macro
> +.Nm LIST_REMOVE
> +removes the element
> +.Fa elm
> +from the list.
> +.Pp
> +The macro
> +.Nm LIST_SWAP
> +swaps the contents of
> +.Fa head1
> +and
> +.Fa head2 .
> +.Sh LIST EXAMPLE
> +.Bd -literal
> +LIST_HEAD(listhead, entry) head =3D
> + =C2=A0 =C2=A0LIST_HEAD_INITIALIZER(head);
> +struct listhead *headp; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* List head. */
> +struct entry {
> + =C2=A0 =C2=A0 =C2=A0 ...
> + =C2=A0 =C2=A0 =C2=A0 LIST_ENTRY(entry) entries; =C2=A0 =C2=A0 =C2=A0/* =
List. */
> + =C2=A0 =C2=A0 =C2=A0 ...
> +} *n1, *n2, *n3, *np, *np_temp;
> +
> +LIST_INIT(&head); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0/* Initialize the list. */
> +
> +n1 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert at the head=
. */
> +LIST_INSERT_HEAD(&head, n1, entries);
> +
> +n2 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert after. */
> +LIST_INSERT_AFTER(n1, n2, entries);
> +
> +n3 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert before. */
> +LIST_INSERT_BEFORE(n2, n3, entries);
> +
> +LIST_REMOVE(n2, entries); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0/* Deletion. */
> +free(n2);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Forward t=
raversal. */
> +LIST_FOREACH(np, &head, entries)
> + =C2=A0 =C2=A0 =C2=A0 np-> ...
> +
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Safe forw=
ard traversal. */
> +LIST_FOREACH_SAFE(np, &head, entries, np_temp) {
> + =C2=A0 =C2=A0 =C2=A0 np->do_stuff();
> + =C2=A0 =C2=A0 =C2=A0 ...
> + =C2=A0 =C2=A0 =C2=A0 LIST_REMOVE(np, entries);
> + =C2=A0 =C2=A0 =C2=A0 free(np);
> +}
> +
> +while (!LIST_EMPTY(&head)) { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* List =
Deletion. */
> + =C2=A0 =C2=A0 =C2=A0 n1 =3D LIST_FIRST(&head);
> + =C2=A0 =C2=A0 =C2=A0 LIST_REMOVE(n1, entries);
> + =C2=A0 =C2=A0 =C2=A0 free(n1);
> +}
> +
> +n1 =3D LIST_FIRST(&head); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Faster List Deletion. */
> +while (n1 !=3D NULL) {
> + =C2=A0 =C2=A0 =C2=A0 n2 =3D LIST_NEXT(n1, entries);
> + =C2=A0 =C2=A0 =C2=A0 free(n1);
> + =C2=A0 =C2=A0 =C2=A0 n1 =3D n2;
> +}
> +LIST_INIT(&head);
> +.Ed
> +.Sh TAIL QUEUES
> +A tail queue is headed by a structure defined by the
> +.Nm TAILQ_HEAD
> +macro.
> +This structure contains a pair of pointers,
> +one to the first element in the tail queue and the other to
> +the last element in the tail queue.
> +The elements are doubly linked so that an arbitrary element can be
> +removed without traversing the tail queue.
> +New elements can be added to the tail queue after an existing element,
> +before an existing element, at the head of the tail queue,
> +or at the end of the tail queue.
> +A
> +.Fa TAILQ_HEAD
> +structure is declared as follows:
> +.Bd -literal -offset indent
> +TAILQ_HEAD(HEADNAME, TYPE) head;
> +.Ed
> +.Pp
> +where
> +.Li HEADNAME
> +is the name of the structure to be defined, and
> +.Li TYPE
> +is the type of the elements to be linked into the tail queue.
> +A pointer to the head of the tail queue can later be declared as:
> +.Bd -literal -offset indent
> +struct HEADNAME *headp;
> +.Ed
> +.Pp
> +(The names
> +.Li head
> +and
> +.Li headp
> +are user selectable.)
> +.Pp
> +The macro
> +.Nm TAILQ_HEAD_INITIALIZER
> +evaluates to an initializer for the tail queue
> +.Fa head .
> +.Pp
> +The macro
> +.Nm TAILQ_CONCAT
> +concatenates the tail queue headed by
> +.Fa head2
> +onto the end of the one headed by
> +.Fa head1
> +removing all entries from the former.
> +.Pp
> +The macro
> +.Nm TAILQ_EMPTY
> +evaluates to true if there are no items on the tail queue.
> +.Pp
> +The macro
> +.Nm TAILQ_ENTRY
> +declares a structure that connects the elements in
> +the tail queue.
> +.Pp
> +The macro
> +.Nm TAILQ_FIRST
> +returns the first item on the tail queue or NULL if the tail queue
> +is empty.
> +.Pp
> +The macro
> +.Nm TAILQ_FOREACH
> +traverses the tail queue referenced by
> +.Fa head
> +in the forward direction, assigning each element in turn to
> +.Fa var .
> +.Fa var
> +is set to
> +.Dv NULL
> +if the loop completes normally, or if there were no elements.
> +.Pp
> +The macro
> +.Nm TAILQ_FOREACH_REVERSE
> +traverses the tail queue referenced by
> +.Fa head
> +in the reverse direction, assigning each element in turn to
> +.Fa var .
> +.Pp
> +The macros
> +.Nm TAILQ_FOREACH_SAFE
> +and
> +.Nm TAILQ_FOREACH_REVERSE_SAFE
> +traverse the list referenced by
> +.Fa head
> +in the forward or reverse direction respectively,
> +assigning each element in turn to
> +.Fa var .
> +However, unlike their unsafe counterparts,
> +.Nm TAILQ_FOREACH
> +and
> +.Nm TAILQ_FOREACH_REVERSE
> +permit to both remove
> +.Fa var
> +as well as free it from within the loop safely without interfering with =
the
> +traversal.
> +.Pp
> +The macro
> +.Nm TAILQ_INIT
> +initializes the tail queue referenced by
> +.Fa head .
> +.Pp
> +The macro
> +.Nm TAILQ_INSERT_HEAD
> +inserts the new element
> +.Fa elm
> +at the head of the tail queue.
> +.Pp
> +The macro
> +.Nm TAILQ_INSERT_TAIL
> +inserts the new element
> +.Fa elm
> +at the end of the tail queue.
> +.Pp
> +The macro
> +.Nm TAILQ_INSERT_AFTER
> +inserts the new element
> +.Fa elm
> +after the element
> +.Fa listelm .
> +.Pp
> +The macro
> +.Nm TAILQ_INSERT_BEFORE
> +inserts the new element
> +.Fa elm
> +before the element
> +.Fa listelm .
> +.Pp
> +The macro
> +.Nm TAILQ_LAST
> +returns the last item on the tail queue.
> +If the tail queue is empty the return value is
> +.Dv NULL .
> +.Pp
> +The macro
> +.Nm TAILQ_NEXT
> +returns the next item on the tail queue, or NULL if this item is the las=
t.
> +.Pp
> +The macro
> +.Nm TAILQ_PREV
> +returns the previous item on the tail queue, or NULL if this item
> +is the first.
> +.Pp
> +The macro
> +.Nm TAILQ_REMOVE
> +removes the element
> +.Fa elm
> +from the tail queue.
> +.Pp
> +The macro
> +.Nm TAILQ_SWAP
> +swaps the contents of
> +.Fa head1
> +and
> +.Fa head2 .
> +.Sh TAIL QUEUE EXAMPLE
> +.Bd -literal
> +TAILQ_HEAD(tailhead, entry) head =3D
> + =C2=A0 =C2=A0TAILQ_HEAD_INITIALIZER(head);
> +struct tailhead *headp; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* Tail queue head. */
> +struct entry {
> + =C2=A0 =C2=A0 =C2=A0 ...
> + =C2=A0 =C2=A0 =C2=A0 TAILQ_ENTRY(entry) entries; =C2=A0 =C2=A0 /* Tail =
queue. */
> + =C2=A0 =C2=A0 =C2=A0 ...
> +} *n1, *n2, *n3, *np;
> +
> +TAILQ_INIT(&head); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 /* Initialize the queue. */
> +
> +n1 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert at the head=
. */
> +TAILQ_INSERT_HEAD(&head, n1, entries);
> +
> +n1 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert at the tail=
. */
> +TAILQ_INSERT_TAIL(&head, n1, entries);
> +
> +n2 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert after. */
> +TAILQ_INSERT_AFTER(&head, n1, n2, entries);
> +
> +n3 =3D malloc(sizeof(struct entry)); =C2=A0 =C2=A0 /* Insert before. */
> +TAILQ_INSERT_BEFORE(n2, n3, entries);
> +
> +TAILQ_REMOVE(&head, n2, entries); =C2=A0 =C2=A0 =C2=A0/* Deletion. */
> +free(n2);
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Forward t=
raversal. */
> +TAILQ_FOREACH(np, &head, entries)
> + =C2=A0 =C2=A0 =C2=A0 np-> ...
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Safe forw=
ard traversal. */
> +TAILQ_FOREACH_SAFE(np, &head, entries, np_temp) {
> + =C2=A0 =C2=A0 =C2=A0 np->do_stuff();
> + =C2=A0 =C2=A0 =C2=A0 ...
> + =C2=A0 =C2=A0 =C2=A0 TAILQ_REMOVE(&head, np, entries);
> + =C2=A0 =C2=A0 =C2=A0 free(np);
> +}
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Reverse t=
raversal. */
> +TAILQ_FOREACH_REVERSE(np, &head, tailhead, entries)
> + =C2=A0 =C2=A0 =C2=A0 np-> ...
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* TailQ Del=
etion. */
> +while (!TAILQ_EMPTY(&head)) {
> + =C2=A0 =C2=A0 =C2=A0 n1 =3D TAILQ_FIRST(&head);
> + =C2=A0 =C2=A0 =C2=A0 TAILQ_REMOVE(&head, n1, entries);
> + =C2=A0 =C2=A0 =C2=A0 free(n1);
> +}
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Faster Ta=
ilQ Deletion. */
> +n1 =3D TAILQ_FIRST(&head);
> +while (n1 !=3D NULL) {
> + =C2=A0 =C2=A0 =C2=A0 n2 =3D TAILQ_NEXT(n1, entries);
> + =C2=A0 =C2=A0 =C2=A0 free(n1);
> + =C2=A0 =C2=A0 =C2=A0 n1 =3D n2;
> +}
> +TAILQ_INIT(&head);
> +.Ed
> +.Sh SEE ALSO
> +.Xr tree 3
> +.Sh HISTORY
> +The
> +.Nm queue
> +functions first appeared in
> +.Bx 4.4 .
> diff --git a/tools/libxl/bsd-sys-queue-h-seddery b/tools/libxl/bsd-sys-qu=
eue-h-seddery
> new file mode 100755
> index 0000000..0bab8e0
> --- /dev/null
> +++ b/tools/libxl/bsd-sys-queue-h-seddery
> @@ -0,0 +1,67 @@
> +#!/usr/bin/perl -p

This should be something like:

#!/usr/bin/env perl

For this script to work on BSD systems, which usually have perl in
/usr/pkg/bin/perl or /usr/local/bin/perl

> +#
> +# This script is part of the Xen build system. =C2=A0It has a very
> +# permissive licence to avoid complicating the licence of the
> +# generated header file and to allow this seddery to be reused by
> +# other projects.
> +#
> +# Permission is hereby granted, free of charge, to any person
> +# obtaining a copy of this individual 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.
> +#
> +# Copyright (C) 2011 Citrix Ltd
> +
> +our $namespace, $ucnamespace;
> +
> +BEGIN {
> + =C2=A0 =C2=A0die unless @ARGV;
> + =C2=A0 =C2=A0$namespace =3D pop @ARGV;
> + =C2=A0 =C2=A0$namespace =3D~ s/^--prefix=3D// or die;
> + =C2=A0 =C2=A0$ucnamespace =3D uc $namespace;
> +
> + =C2=A0 =C2=A0print <<END or die $!;
> +/*
> + * DO NOT EDIT THIS FILE
> + *
> + * Generated automatically by bsd-sys-queue-h-seddery to
> + * =C2=A0- introduce ${ucnamespace}_ and ${namespace}_ namespace prefixe=
s
> + * =C2=A0- turn "struct type" into "type" so that type arguments
> + * =C2=A0 =C2=A0 to the macros are type names not struct tags
> + *
> + * The purpose of this seddery is to allow the resulting file to be
> + * freely included by software which might also want to include other
> + * list macros, and to be used when struct tags are not being used or
> + * not known.
> + */
> +END
> +}
> +
> +s/\b( _SYS_QUEUE |
> + =C2=A0 =C2=A0 =C2=A0SLIST | LIST | STAILQ | TAILQ | QUEUE
> + =C2=A0 =C2=A0 =C2=A0)/${ucnamespace}_$1/xg;
> +
> +s/\b( TRACEBUF | TRASHIT |
> + =C2=A0 =C2=A0 =C2=A0QMD_
> + =C2=A0 =C2=A0 =C2=A0)/${ucnamespace}__$1/xg;
> +
> +s/\b(
> + =C2=A0 =C2=A0 =C2=A0qm_
> + =C2=A0 =C2=A0 =C2=A0)/${namespace}__$1/xg;
> +
> +s/\b struct \s+ type \b/type/xg;
> diff --git a/tools/libxl/bsd-sys-queue.h b/tools/libxl/bsd-sys-queue.h
> new file mode 100644
> index 0000000..274e636
> --- /dev/null
> +++ b/tools/libxl/bsd-sys-queue.h
> @@ -0,0 +1,637 @@
> +/*-
> + * Copyright (c) 1991, 1993
> + * =C2=A0 =C2=A0 The Regents of the University of California. =C2=A0All =
rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions
> + * are met:
> + * 1. Redistributions of source code must retain the above copyright
> + * =C2=A0 =C2=A0notice, this list of conditions and the following discla=
imer.
> + * 2. Redistributions in binary form must reproduce the above copyright
> + * =C2=A0 =C2=A0notice, this list of conditions and the following discla=
imer in the
> + * =C2=A0 =C2=A0documentation and/or other materials provided with the d=
istribution.
> + * 4. Neither the name of the University nor the names of its contributo=
rs
> + * =C2=A0 =C2=A0may be used to endorse or promote products derived from =
this software
> + * =C2=A0 =C2=A0without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' A=
ND
> + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PU=
RPOSE
> + * ARE DISCLAIMED. =C2=A0IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS B=
E LIABLE
> + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUE=
NTIAL
> + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOO=
DS
> + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, S=
TRICT
> + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY=
 WAY
> + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O=
F
> + * SUCH DAMAGE.
> + *
> + * =C2=A0 =C2=A0 @(#)queue.h =C2=A0 =C2=A0 8.5 (Berkeley) 8/20/94
> + * $FreeBSD$
> + */
> +
> +#ifndef _SYS_QUEUE_H_
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0_SYS_QUEUE_H_
> +
> +#include <sys/cdefs.h>
> +
> +/*
> + * This file defines four types of data structures: singly-linked lists,
> + * singly-linked tail queues, lists and tail queues.
> + *
> + * A singly-linked list is headed by a single forward pointer. The eleme=
nts
> + * are singly linked for minimum space and pointer manipulation overhead=
 at
> + * the expense of O(n) removal for arbitrary elements. New elements can =
be
> + * added to the list after an existing element or at the head of the lis=
t.
> + * Elements being removed from the head of the list should use the expli=
cit
> + * macro for this purpose for optimum efficiency. A singly-linked list m=
ay
> + * only be traversed in the forward direction. =C2=A0Singly-linked lists=
 are ideal
> + * for applications with large datasets and few or no removals or for
> + * implementing a LIFO queue.
> + *
> + * A singly-linked tail queue is headed by a pair of pointers, one to th=
e
> + * head of the list and the other to the tail of the list. The elements =
are
> + * singly linked for minimum space and pointer manipulation overhead at =
the
> + * expense of O(n) removal for arbitrary elements. New elements can be a=
dded
> + * to the list after an existing element, at the head of the list, or at=
 the
> + * end of the list. Elements being removed from the head of the tail que=
ue
> + * should use the explicit macro for this purpose for optimum efficiency=
.
> + * A singly-linked tail queue may only be traversed in the forward direc=
tion.
> + * Singly-linked tail queues are ideal for applications with large datas=
ets
> + * and few or no removals or for implementing a FIFO queue.
> + *
> + * A list is headed by a single forward pointer (or an array of forward
> + * pointers for a hash table header). The elements are doubly linked
> + * so that an arbitrary element can be removed without a need to
> + * traverse the list. New elements can be added to the list before
> + * or after an existing element or at the head of the list. A list
> + * may only be traversed in the forward direction.
> + *
> + * A tail queue is headed by a pair of pointers, one to the head of the
> + * list and the other to the tail of the list. The elements are doubly
> + * linked so that an arbitrary element can be removed without a need to
> + * traverse the list. New elements can be added to the list before or
> + * after an existing element, at the head of the list, or at the end of
> + * the list. A tail queue may be traversed in either direction.
> + *
> + * For details on the use of these macros, see the queue(3) manual page.
> + *
> + *
> + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 SLIST =C2=A0 LIST =C2=A0 =C2=A0STAILQ =C2=A0TA=
ILQ
> + * _HEAD =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0=
 =C2=A0 +
> + * _HEAD_INITIALIZER =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =
=C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 +
> + * _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 +
> + * _INIT =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0=
 =C2=A0 +
> + * _EMPTY =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0+ =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0=
 =C2=A0 +
> + * _FIRST =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0+ =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0=
 =C2=A0 +
> + * _NEXT =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0=
 =C2=A0 +
> + * _PREV =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 - =C2=A0 =C2=A0=
 =C2=A0 +
> + * _LAST =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0=
 =C2=A0 +
> + * _FOREACH =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0+ =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=
=A0 +
> + * _FOREACH_SAFE =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 + =C2=
=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 +
> + * _FOREACH_REVERSE =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0- =C2=A0 =
=C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 +
> + * _FOREACH_REVERSE_SAFE =C2=A0 =C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 - =
=C2=A0 =C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 +
> + * _INSERT_HEAD =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0+ =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =
=C2=A0 =C2=A0 =C2=A0 +
> + * _INSERT_BEFORE =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0- =C2=
=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 +
> + * _INSERT_AFTER =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 + =C2=
=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 +
> + * _INSERT_TAIL =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0- =C2=A0 =C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 + =
=C2=A0 =C2=A0 =C2=A0 +
> + * _CONCAT =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =
=C2=A0 +
> + * _REMOVE_AFTER =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 + =C2=
=A0 =C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 -
> + * _REMOVE_HEAD =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0+ =C2=A0 =C2=A0 =C2=A0 - =C2=A0 =C2=A0 =C2=A0 + =
=C2=A0 =C2=A0 =C2=A0 -
> + * _REMOVE =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =
=C2=A0 +
> + * _SWAP =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0 =C2=A0 + =C2=A0 =C2=A0=
 =C2=A0 +
> + *
> + */
> +#ifdef QUEUE_MACRO_DEBUG
> +/* Store the last 2 places the queue element or head was altered */
> +struct qm_trace {
> + =C2=A0 =C2=A0 =C2=A0 char * lastfile;
> + =C2=A0 =C2=A0 =C2=A0 int lastline;
> + =C2=A0 =C2=A0 =C2=A0 char * prevfile;
> + =C2=A0 =C2=A0 =C2=A0 int prevline;
> +};
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TRACEBUF =C2=A0 =C2=A0 =C2=A0 =C2=A0s=
truct qm_trace trace;
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TRASHIT(x) =C2=A0 =C2=A0 =C2=A0do {(x=
) =3D (void *)-1;} while (0)
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_SAVELINK(name, link) =C2=A0 =C2=
=A0 =C2=A0 =C2=A0void **name =3D (void *)&(link)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TRACE_HEAD(head) do { =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 (head)->trace.prevline =3D (head)->trace.lastline;=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (head)->trace.prevfile =3D (head)->trace.lastfile;=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (head)->trace.lastline =3D __LINE__; =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (head)->trace.lastfile =3D __FILE__; =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TRACE_ELEM(elem) do { =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 (elem)->trace.prevline =3D (elem)->trace.lastline;=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (elem)->trace.prevfile =3D (elem)->trace.lastfile;=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (elem)->trace.lastline =3D __LINE__; =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (elem)->trace.lastfile =3D __FILE__; =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#else
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TRACE_ELEM(elem)
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TRACE_HEAD(head)
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_SAVELINK(name, link)
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TRACEBUF
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TRASHIT(x)
> +#endif /* QUEUE_MACRO_DEBUG */
> +
> +/*
> + * Singly-linked List declarations.
> + */
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_HEAD(name, type) =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +struct name { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 struct type *slh_first; /* first element */ =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +}
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_HEAD_INITIALIZER(head) =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 { NULL }
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_ENTRY(type) =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +struct { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 struct type *sle_next; =C2=A0/* next element */ =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> +}
> +
> +/*
> + * Singly-linked List functions.
> + */
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_EMPTY(head) =C2=A0 =C2=A0 =C2=
=A0 ((head)->slh_first =3D=3D NULL)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_FIRST(head) =C2=A0 =C2=A0 =C2=
=A0 ((head)->slh_first)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_FOREACH(var, head, field) =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 for ((var) =3D SLIST_FIRST((head)); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) =3D SLIST_NEXT((var), field))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_FOREACH_SAFE(var, head, field, =
tvar) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 for ((var) =3D SLIST_FIRST((head)); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) && ((tvar) =3D SLIST_NEXT((var=
), field), 1); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) =3D (tvar))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_FOREACH_PREVPTR(var, varp, head=
, field) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 for ((varp) =3D &SLIST_FIRST((head)); =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((var) =3D *(varp)) !=3D 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 =C2=A0 =C2=A0 =C2=A0 (varp) =3D &SLIST_NEXT((var), field)=
)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_INIT(head) do { =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 SLIST_FIRST((head)) =3D 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 \
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_INSERT_AFTER(slistelm, elm, fie=
ld) do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 SLIST_NEXT((elm), field) =3D SLIST_NEXT((slistelm)=
, field); =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 SLIST_NEXT((slistelm), field) =3D (elm); =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_INSERT_HEAD(head, elm, field) d=
o { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 SLIST_NEXT((elm), field) =3D SLIST_FIRST((head)); =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 SLIST_FIRST((head)) =3D (elm); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_NEXT(elm, field) =C2=A0((elm)->=
field.sle_next)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_REMOVE(head, elm, type, field) =
do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_SAVELINK(oldnext, (elm)->field.sle_next); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if (SLIST_FIRST((head)) =3D=3D (elm)) { =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 SLIST_REMOVE_HEAD((hea=
d), field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 } =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =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 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct type *curelm =
=3D SLIST_FIRST((head)); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 while (SLIST_NEXT(cure=
lm, field) !=3D (elm)) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 curelm =3D SLIST_NEXT(curelm, field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 SLIST_REMOVE_AFTER(cur=
elm, field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 } =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 TRASHIT(*oldnext); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define SLIST_REMOVE_AFTER(elm, field) do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 SLIST_NEXT(elm, field) =3D =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 SLIST_NEXT(SLIST_NEXT(elm, field), f=
ield); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0SLIST_REMOVE_HEAD(head, field) do { =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 SLIST_FIRST((head)) =3D SLIST_NEXT(SLIST_FIRST((he=
ad)), field); =C2=A0 \
> +} while (0)
> +
> +#define SLIST_SWAP(head1, head2, type) do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 struct type *swap_first =3D SLIST_FIRST(head1); =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 SLIST_FIRST(head1) =3D SLIST_FIRST(head2); =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> + =C2=A0 =C2=A0 =C2=A0 SLIST_FIRST(head2) =3D swap_first; =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +/*
> + * Singly-linked Tail queue declarations.
> + */
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_HEAD(name, type) =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +struct name { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 struct type *stqh_first;/* first element */ =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 struct type **stqh_last;/* addr of last next eleme=
nt */ =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +}
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_HEAD_INITIALIZER(head) =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 { NULL, &(head).stqh_first }
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_ENTRY(type) =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +struct { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 struct type *stqe_next; /* next element */ =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +}
> +
> +/*
> + * Singly-linked Tail queue functions.
> + */
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_CONCAT(head1, head2) do { =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if (!STAILQ_EMPTY((head2))) { =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *(head1)->stqh_last =
=3D (head2)->stqh_first; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head1)->stqh_last =3D=
 (head2)->stqh_last; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 STAILQ_INIT((head2)); =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 } =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 \
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_EMPTY(head) =C2=A0 =C2=A0 =C2=
=A0((head)->stqh_first =3D=3D NULL)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_FIRST(head) =C2=A0 =C2=A0 =C2=
=A0((head)->stqh_first)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_FOREACH(var, head, field) =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 for((var) =3D STAILQ_FIRST((head)); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(var); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0(var) =3D STAILQ_NEXT((var), field))
> +
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_FOREACH_SAFE(var, head, field,=
 tvar) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 \
> + =C2=A0 =C2=A0 =C2=A0 for ((var) =3D STAILQ_FIRST((head)); =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) && ((tvar) =3D STAILQ_NEXT((va=
r), field), 1); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) =3D (tvar))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_INIT(head) do { =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 STAILQ_FIRST((head)) =3D 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 =C2=A0 =C2=A0 (head)->stqh_last =3D &STAILQ_FIRST((head)); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_INSERT_AFTER(head, tqelm, elm,=
 field) do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if ((STAILQ_NEXT((elm), field) =3D STAILQ_NEXT((tq=
elm), field)) =3D=3D NULL)\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head)->stqh_last =3D =
&STAILQ_NEXT((elm), field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 STAILQ_NEXT((tqelm), field) =3D (elm); =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_INSERT_HEAD(head, elm, field) =
do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if ((STAILQ_NEXT((elm), field) =3D STAILQ_FIRST((h=
ead))) =3D=3D NULL) \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head)->stqh_last =3D =
&STAILQ_NEXT((elm), field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 STAILQ_FIRST((head)) =3D (elm); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_INSERT_TAIL(head, elm, field) =
do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 STAILQ_NEXT((elm), field) =3D 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 *(head)->stqh_last =3D (elm); =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 (head)->stqh_last =3D &STAILQ_NEXT((elm), field); =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_LAST(head, type, field) =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (STAILQ_EMPTY((head)) ? =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((struct type *)(void =
*) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ((char *)((head)->stqh=
_last) - __offsetof(struct type, field))))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_NEXT(elm, field) ((elm)->field=
.stqe_next)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_REMOVE(head, elm, type, field)=
 do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_SAVELINK(oldnext, (elm)->field.stqe_next); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if (STAILQ_FIRST((head)) =3D=3D (elm)) { =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 STAILQ_REMOVE_HEAD((he=
ad), field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 } =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =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 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 struct type *curelm =
=3D STAILQ_FIRST((head)); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 while (STAILQ_NEXT(cur=
elm, field) !=3D (elm)) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 curelm =3D STAILQ_NEXT(curelm, field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 STAILQ_REMOVE_AFTER(he=
ad, curelm, field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 } =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 TRASHIT(*oldnext); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define STAILQ_REMOVE_AFTER(head, elm, field) do { =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if ((STAILQ_NEXT(elm, field) =3D =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_NEXT(STAILQ_NEXT(elm, f=
ield), field)) =3D=3D NULL) =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head)->stqh_last =3D =
&STAILQ_NEXT((elm), field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_REMOVE_HEAD(head, field) do { =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if ((STAILQ_FIRST((head)) =3D =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0STAILQ_NEXT(STAILQ_FIRST((head=
)), field)) =3D=3D NULL) =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head)->stqh_last =3D =
&STAILQ_FIRST((head)); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define STAILQ_SWAP(head1, head2, type) do { =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 struct type *swap_first =3D STAILQ_FIRST(head1); =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 struct type **swap_last =3D (head1)->stqh_last; =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 STAILQ_FIRST(head1) =3D STAILQ_FIRST(head2); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (head1)->stqh_last =3D (head2)->stqh_last; =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> + =C2=A0 =C2=A0 =C2=A0 STAILQ_FIRST(head2) =3D swap_first; =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 (head2)->stqh_last =3D swap_last; =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if (STAILQ_EMPTY(head1)) =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head1)->stqh_last =3D=
 &STAILQ_FIRST(head1); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if (STAILQ_EMPTY(head2)) =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head2)->stqh_last =3D=
 &STAILQ_FIRST(head2); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +
> +/*
> + * List declarations.
> + */
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_HEAD(name, type) =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +struct name { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 struct type *lh_first; =C2=A0/* first element */ =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +}
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_HEAD_INITIALIZER(head) =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 { NULL }
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_ENTRY(type) =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +struct { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 struct type *le_next; =C2=A0 /* next element */ =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> + =C2=A0 =C2=A0 =C2=A0 struct type **le_prev; =C2=A0/* address of previou=
s next element */ =C2=A0\
> +}
> +
> +/*
> + * List functions.
> + */
> +
> +#if (defined(_KERNEL) && defined(INVARIANTS))
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_LIST_CHECK_HEAD(head, field) do {=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if (LIST_FIRST((head)) !=3D 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 =C2=A0 LIST_FIRST((head))->field.le_prev !=
=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&LIST_FIRST((head))) =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 panic("Bad list head %=
p first->prev !=3D head", (head)); =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_LIST_CHECK_NEXT(elm, field) do { =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if (LIST_NEXT((elm), field) !=3D 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 LIST_NEXT((elm), field)->field.le_pr=
ev !=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&((elm)->field.le_next)) =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 panic("Bad link elm %p=
 next->prev !=3D elm", (elm)); =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_LIST_CHECK_PREV(elm, field) do { =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if (*(elm)->field.le_prev !=3D (elm)) =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 panic("Bad link elm %p=
 prev->next !=3D elm", (elm)); =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +#else
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_LIST_CHECK_HEAD(head, field)
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_LIST_CHECK_NEXT(elm, field)
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_LIST_CHECK_PREV(elm, field)
> +#endif /* (_KERNEL && INVARIANTS) */
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_EMPTY(head) =C2=A0 =C2=A0 =C2=A0=
 =C2=A0((head)->lh_first =3D=3D NULL)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_FIRST(head) =C2=A0 =C2=A0 =C2=A0=
 =C2=A0((head)->lh_first)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_FOREACH(var, head, field) =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 for ((var) =3D LIST_FIRST((head)); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) =3D LIST_NEXT((var), field))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_FOREACH_SAFE(var, head, field, t=
var) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 for ((var) =3D LIST_FIRST((head)); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) && ((tvar) =3D LIST_NEXT((var)=
, field), 1); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) =3D (tvar))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_INIT(head) do { =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 LIST_FIRST((head)) =3D 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\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_INSERT_AFTER(listelm, elm, field=
) do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_LIST_CHECK_NEXT(listelm, field); =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if ((LIST_NEXT((elm), field) =3D LIST_NEXT((listel=
m), field)) !=3D NULL)\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 LIST_NEXT((listelm), f=
ield)->field.le_prev =3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &LIST_NE=
XT((elm), field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 LIST_NEXT((listelm), field) =3D (elm); =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (elm)->field.le_prev =3D &LIST_NEXT((listelm), fie=
ld); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_INSERT_BEFORE(listelm, elm, fiel=
d) do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_LIST_CHECK_PREV(listelm, field); =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (elm)->field.le_prev =3D (listelm)->field.le_prev;=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 LIST_NEXT((elm), field) =3D (listelm); =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 *(listelm)->field.le_prev =3D (elm); =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (listelm)->field.le_prev =3D &LIST_NEXT((elm), fie=
ld); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_INSERT_HEAD(head, elm, field) do=
 { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_LIST_CHECK_HEAD((head), field); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if ((LIST_NEXT((elm), field) =3D LIST_FIRST((head)=
)) !=3D NULL) =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 LIST_FIRST((head))->fi=
eld.le_prev =3D &LIST_NEXT((elm), field);\
> + =C2=A0 =C2=A0 =C2=A0 LIST_FIRST((head)) =3D (elm); =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 (elm)->field.le_prev =3D &LIST_FIRST((head)); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_NEXT(elm, field) =C2=A0 ((elm)->=
field.le_next)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0LIST_REMOVE(elm, field) do { =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_SAVELINK(oldnext, (elm)->field.le_next); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_SAVELINK(oldprev, (elm)->field.le_prev); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_LIST_CHECK_NEXT(elm, field); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_LIST_CHECK_PREV(elm, field); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if (LIST_NEXT((elm), field) !=3D 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 =C2=A0 =C2=A0 LIST_NEXT((elm), field=
)->field.le_prev =3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (elm)->f=
ield.le_prev; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 *(elm)->field.le_prev =3D LIST_NEXT((elm), field);=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 TRASHIT(*oldnext); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 TRASHIT(*oldprev); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define LIST_SWAP(head1, head2, type, field) do { =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 struct type *swap_tmp =3D LIST_FIRST((head1)); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 LIST_FIRST((head1)) =3D LIST_FIRST((head2)); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 LIST_FIRST((head2)) =3D swap_tmp; =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if ((swap_tmp =3D LIST_FIRST((head1))) !=3D 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 swap_tmp->field.le_pre=
v =3D &LIST_FIRST((head1)); =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if ((swap_tmp =3D LIST_FIRST((head2))) !=3D 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 swap_tmp->field.le_pre=
v =3D &LIST_FIRST((head2)); =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +} while (0)
> +
> +/*
> + * Tail queue declarations.
> + */
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_HEAD(name, type) =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +struct name { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 struct type *tqh_first; /* first element */ =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 struct type **tqh_last; /* addr of last next eleme=
nt */ =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 TRACEBUF =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0\
> +}
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_HEAD_INITIALIZER(head) =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 { NULL, &(head).tqh_first }
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_ENTRY(type) =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +struct { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 struct type *tqe_next; =C2=A0/* next element */ =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> + =C2=A0 =C2=A0 =C2=A0 struct type **tqe_prev; /* address of previous nex=
t element */ =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 TRACEBUF =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0\
> +}
> +
> +/*
> + * Tail queue functions.
> + */
> +#if (defined(_KERNEL) && defined(INVARIANTS))
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TAILQ_CHECK_HEAD(head, field) do =
{ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if (!TAILQ_EMPTY(head) && =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 TAILQ_FIRST((head))->field.tqe_prev =
!=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&TAILQ_FIRST((head))) =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 panic("Bad tailq head =
%p first->prev !=3D head", (head)); \
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TAILQ_CHECK_TAIL(head, field) do =
{ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if (*(head)->tqh_last !=3D 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 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 panic("Bad tailq NEXT(=
%p->tqh_last) !=3D NULL", (head)); =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TAILQ_CHECK_NEXT(elm, field) do {=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if (TAILQ_NEXT((elm), field) !=3D 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 TAILQ_NEXT((elm), field)->field.tqe_=
prev !=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0&((elm)->field.tqe_next)) =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 panic("Bad link elm %p=
 next->prev !=3D elm", (elm)); =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TAILQ_CHECK_PREV(elm, field) do {=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if (*(elm)->field.tqe_prev !=3D (elm)) =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 panic("Bad link elm %p=
 prev->next !=3D elm", (elm)); =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +#else
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TAILQ_CHECK_HEAD(head, field)
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TAILQ_CHECK_TAIL(head, headname)
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TAILQ_CHECK_NEXT(elm, field)
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0QMD_TAILQ_CHECK_PREV(elm, field)
> +#endif /* (_KERNEL && INVARIANTS) */
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_CONCAT(head1, head2, field) do =
{ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if (!TAILQ_EMPTY(head2)) { =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *(head1)->tqh_last =3D=
 (head2)->tqh_first; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head2)->tqh_first->fi=
eld.tqe_prev =3D (head1)->tqh_last; \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head1)->tqh_last =3D =
(head2)->tqh_last; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 TAILQ_INIT((head2)); =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_HEAD(head1);=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_HEAD(head2);=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 } =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 \
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_EMPTY(head) =C2=A0 =C2=A0 =C2=
=A0 ((head)->tqh_first =3D=3D NULL)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_FIRST(head) =C2=A0 =C2=A0 =C2=
=A0 ((head)->tqh_first)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_FOREACH(var, head, field) =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 for ((var) =3D TAILQ_FIRST((head)); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) =3D TAILQ_NEXT((var), field))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_FOREACH_SAFE(var, head, field, =
tvar) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 for ((var) =3D TAILQ_FIRST((head)); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) && ((tvar) =3D TAILQ_NEXT((var=
), field), 1); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) =3D (tvar))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_FOREACH_REVERSE(var, head, head=
name, field) =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 for ((var) =3D TAILQ_LAST((head), headname); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) =3D TAILQ_PREV((var), headname=
, field))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_FOREACH_REVERSE_SAFE(var, head,=
 headname, field, tvar) =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 for ((var) =3D TAILQ_LAST((head), headname); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) && ((tvar) =3D TAILQ_PREV((var=
), headname, field), 1); =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (var) =3D (tvar))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_INIT(head) do { =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 TAILQ_FIRST((head)) =3D 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 =C2=A0 =C2=A0 (head)->tqh_last =3D &TAILQ_FIRST((head)); =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_HEAD(head); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_INSERT_AFTER(head, listelm, elm=
, field) do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_TAILQ_CHECK_NEXT(listelm, field); =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if ((TAILQ_NEXT((elm), field) =3D TAILQ_NEXT((list=
elm), field)) !=3D NULL)\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 TAILQ_NEXT((elm), fiel=
d)->field.tqe_prev =3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &TAILQ_N=
EXT((elm), field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =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 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head)->tqh_last =3D &=
TAILQ_NEXT((elm), field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_HEAD(head); =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 } =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 TAILQ_NEXT((listelm), field) =3D (elm); =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 (elm)->field.tqe_prev =3D &TAILQ_NEXT((listelm), f=
ield); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_ELEM(&(elm)->field); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_ELEM(&listelm->field); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_INSERT_BEFORE(listelm, elm, fie=
ld) do { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_TAILQ_CHECK_PREV(listelm, field); =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 (elm)->field.tqe_prev =3D (listelm)->field.tqe_pre=
v; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 TAILQ_NEXT((elm), field) =3D (listelm); =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 *(listelm)->field.tqe_prev =3D (elm); =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 (listelm)->field.tqe_prev =3D &TAILQ_NEXT((elm), f=
ield); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_ELEM(&(elm)->field); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_ELEM(&listelm->field); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_INSERT_HEAD(head, elm, field) d=
o { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_TAILQ_CHECK_HEAD(head, field); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if ((TAILQ_NEXT((elm), field) =3D TAILQ_FIRST((hea=
d))) !=3D NULL) =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 TAILQ_FIRST((head))->f=
ield.tqe_prev =3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &TAILQ_N=
EXT((elm), field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =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 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head)->tqh_last =3D &=
TAILQ_NEXT((elm), field); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 TAILQ_FIRST((head)) =3D (elm); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (elm)->field.tqe_prev =3D &TAILQ_FIRST((head)); =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_HEAD(head); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_ELEM(&(elm)->field); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_INSERT_TAIL(head, elm, field) d=
o { =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_TAILQ_CHECK_TAIL(head, field); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 TAILQ_NEXT((elm), field) =3D 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 (elm)->field.tqe_prev =3D (head)->tqh_last; =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 *(head)->tqh_last =3D (elm); =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (head)->tqh_last =3D &TAILQ_NEXT((elm), field); =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_HEAD(head); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_ELEM(&(elm)->field); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_LAST(head, headname) =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (*(((struct headname *)((head)->tqh_last))->tqh_la=
st))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_NEXT(elm, field) ((elm)->field.=
tqe_next)
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_PREV(elm, headname, field) =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (*(((struct headname *)((elm)->field.tqe_prev))->t=
qh_last))
> +
> +#define =C2=A0 =C2=A0 =C2=A0 =C2=A0TAILQ_REMOVE(head, elm, field) do { =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_SAVELINK(oldnext, (elm)->field.tqe_next); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_SAVELINK(oldprev, (elm)->field.tqe_prev); =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_TAILQ_CHECK_NEXT(elm, field); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 QMD_TAILQ_CHECK_PREV(elm, field); =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 if ((TAILQ_NEXT((elm), field)) !=3D 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 TAILQ_NEXT((elm), fiel=
d)->field.tqe_prev =3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (elm)->f=
ield.tqe_prev; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =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 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head)->tqh_last =3D (=
elm)->field.tqe_prev; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_HEAD(head); =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 } =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 *(elm)->field.tqe_prev =3D TAILQ_NEXT((elm), field=
); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 TRASHIT(*oldnext); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 TRASHIT(*oldprev); =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 QMD_TRACE_ELEM(&(elm)->field); =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0\
> +} while (0)
> +
> +#define TAILQ_SWAP(head1, head2, type, field) do { =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 struct type *swap_first =3D (head1)->tqh_first; =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 \
> + =C2=A0 =C2=A0 =C2=A0 struct type **swap_last =3D (head1)->tqh_last; =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (head1)->tqh_first =3D (head2)->tqh_first; =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> + =C2=A0 =C2=A0 =C2=A0 (head1)->tqh_last =3D (head2)->tqh_last; =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (head2)->tqh_first =3D swap_first; =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 (head2)->tqh_last =3D swap_last; =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 if ((swap_first =3D (head1)->tqh_first) !=3D 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 swap_first->field.tqe_=
prev =3D &(head1)->tqh_first; =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=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head1)->tqh_last =3D =
&(head1)->tqh_first; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> + =C2=A0 =C2=A0 =C2=A0 if ((swap_first =3D (head2)->tqh_first) !=3D 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 swap_first->field.tqe_=
prev =3D &(head2)->tqh_first; =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=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0\
> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (head2)->tqh_last =3D =
&(head2)->tqh_first; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0\
> +} while (0)
> +
> +#endif /* !_SYS_QUEUE_H_ */
> --
> tg: (92a50a8..) t/xen/bsd-queue (depends on: t/xen/gitignore)
>
> _______________________________________________
> 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 Oct 26 01:51:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 01:51:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIzDC-0006hX-Vy; Wed, 26 Oct 2011 01:51:50 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIzCc-0006Vt-2B
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 01:51:14 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1319619070!788642!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9397 invoked from network); 26 Oct 2011 08:51: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;
	26 Oct 2011 08:51:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,408,1315180800"; 
   d="scan'208";a="8589467"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 08:51: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, 26 Oct 2011 09:51:10 +0100
Subject: Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Roger Pau =?ISO-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Date: Wed, 26 Oct 2011 09:51:10 +0100
In-Reply-To: <CAPLaKK4aqB1GT7_ksBmWwmPWVSbSLrr5aNh3mujNGMitPUm06Q@mail.gmail.com>
References: <20134.62279.50041.126603@mariner.uk.xensource.com>
	<CAPLaKK4aqB1GT7_ksBmWwmPWVSbSLrr5aNh3mujNGMitPUm06Q@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1319619070.9436.14.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 Wed, 2011-10-26 at 09:44 +0100, Roger Pau MonnÃ© wrote:
> 2011/10/25 Ian Jackson <Ian.Jackson@eu.citrix.com>:

[snip a thousand line of unnecessary quotes]

> > diff --git a/tools/libxl/bsd-sys-queue-h-seddery b/tools/libxl/bsd-sys-queue-h-seddery
> > new file mode 100755
> > index 0000000..0bab8e0
> > --- /dev/null
> > +++ b/tools/libxl/bsd-sys-queue-h-seddery
> > @@ -0,0 +1,67 @@
> > +#!/usr/bin/perl -p
> 
> This should be something like:
> 
> #!/usr/bin/env perl
> 
> For this script to work on BSD systems, which usually have perl in
> /usr/pkg/bin/perl or /usr/local/bin/perl

It took me several minutes to find this two line comment on one line of
code in the ~2000 lines you quoted. Please (everyone) think of the
reader and trim your quotes.

(not specifically just at you Roger, this sort of thing happens too
often on this list)

[snip almost a thousand more lines]

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 01:57:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 01:57:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIzIN-0007B0-Ru; Wed, 26 Oct 2011 01:57:11 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIzHq-0006xB-Ef
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 01:56:38 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319619394!1724288!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13899 invoked from network); 26 Oct 2011 08:56:35 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 08:56:35 -0000
Received: by ywp17 with SMTP id 17so2236840ywp.30
	for <xen-devel@lists.xensource.com>;
	Wed, 26 Oct 2011 01:56:34 -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=zSu7dii+PX52ZLFKfOk9apa/tedh6iPBhESe++Pb59I=;
	b=FAXP8HZU1TybUxZW2a40Y6NnYUXihGWSbUuuTGBdVGslp5v6WGXJl8zMGV+ldqL7ce
	hM3RcA6DakSC65PcXmRyWmX7IM0dM9yrxUxF3uh6lT08bVTiut7W/i/XuK3a9eg+m02D
	tSgFXb7DXKbjQdplKvjJhLwJ2Vxq5rg0Mrgwk=
MIME-Version: 1.0
Received: by 10.68.64.169 with SMTP id p9mr4528737pbs.116.1319619393928; Wed,
	26 Oct 2011 01:56:33 -0700 (PDT)
Received: by 10.142.13.5 with HTTP; Wed, 26 Oct 2011 01:56:33 -0700 (PDT)
In-Reply-To: <1319619070.9436.14.camel@zakaz.uk.xensource.com>
References: <20134.62279.50041.126603@mariner.uk.xensource.com>
	<CAPLaKK4aqB1GT7_ksBmWwmPWVSbSLrr5aNh3mujNGMitPUm06Q@mail.gmail.com>
	<1319619070.9436.14.camel@zakaz.uk.xensource.com>
Date: Wed, 26 Oct 2011 10:56:33 +0200
X-Google-Sender-Auth: 6889TXytrQDWCwyKwqj7TiSk_Gk
Message-ID: <CAPLaKK5kdGOAVr=A2jr1nD0jeJ4bwQJbicGecKaAappM=K2CVw@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h
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
Content-Transfer-Encoding: quoted-printable
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

2011/10/26 Ian Campbell <Ian.Campbell@citrix.com>:
> On Wed, 2011-10-26 at 09:44 +0100, Roger Pau Monn=C3=A9 wrote:
>> 2011/10/25 Ian Jackson <Ian.Jackson@eu.citrix.com>:
>
> [snip a thousand line of unnecessary quotes]
>
>> > diff --git a/tools/libxl/bsd-sys-queue-h-seddery b/tools/libxl/bsd-sys=
-queue-h-seddery
>> > new file mode 100755
>> > index 0000000..0bab8e0
>> > --- /dev/null
>> > +++ b/tools/libxl/bsd-sys-queue-h-seddery
>> > @@ -0,0 +1,67 @@
>> > +#!/usr/bin/perl -p
>>
>> This should be something like:
>>
>> #!/usr/bin/env perl
>>
>> For this script to work on BSD systems, which usually have perl in
>> /usr/pkg/bin/perl or /usr/local/bin/perl
>
> It took me several minutes to find this two line comment on one line of
> code in the ~2000 lines you quoted. Please (everyone) think of the
> reader and trim your quotes.

Yup, sorry, I've used Cmd+F to find the line I had to change and just
send it, thought it was best to send the whole patch again, but it
doesn't make sense.

> (not specifically just at you Roger, this sort of thing happens too
> often on this list)
>
> [snip almost a thousand more lines]
>
> Ian.
>
>
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 02:22:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 02:22:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RIzgr-0000C5-J4; Wed, 26 Oct 2011 02:22:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIzg5-0008RF-8x
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 02:21:41 -0700
X-Env-Sender: K.Brink@cs.ru.nl
X-Msg-Ref: server-8.tower-182.messagelabs.com!1319620898!796218!1
X-Originating-IP: [131.174.16.143]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16237 invoked from network); 26 Oct 2011 09:21:38 -0000
Received: from smeltpunt.science.ru.nl (HELO smeltpunt.science.ru.nl)
	(131.174.16.143)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 09:21:38 -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 p9Q9LYn7017315; 
	Wed, 26 Oct 2011 11:21:35 +0200 (MEST)
Date: Wed, 26 Oct 2011 11:21:34 +0200
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: <20111026092134.GA12432@lilo2.science.ru.nl>
References: <20111012204011.GA7518@lilo2.science.ru.nl>
	<20134.64191.820416.210778@mariner.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20134.64191.820416.210778@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
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Ian,

On Tue, Oct 25, 2011 at 07:06:55PM +0100, Ian Jackson wrote:
> I tried this and:
> 
> ar: /u/iwj/work/xen-unstable-tools.hg/stubdom/grub-x86_32/stage2/fsys_zfs.o: No such file or directory
> make[2]: *** [/u/iwj/work/xen-unstable-tools.hg/stubdom/grub-x86_32/main.a] Error 1
> make[2]: Leaving directory `/u/iwj/work/xen-unstable-tools.hg/stubdom/grub'

Thanks for the report. I will try to reproduce this error in the next few
days.

> 
> That's the result of
>   hg clean --all && cp ../.config  .
>  [ in my qemu tree ] git-clean  -x -d -f
>   (make -j4 && echo ok.) 2>&1 | tee ../log
> 
> My .config contains:
>  CONFIG_QEMU=/u/iwj/work/1/qemu-iwj.git
>  QEMU_UPSTREAM_URL=/u/iwj/work/1/qemu-upstream-unstable.git

Could you send me the full build log for comparison?
Also, is your "xen-unstable-tools.hg" based on
http://xenbits.xen.org/hg/xen-unstable.hg/, or something else?

Best,

Kasper.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 03:25:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 03:25:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ0fY-0002YQ-IU; Wed, 26 Oct 2011 03:25:12 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ0ek-0002LW-Sh
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 03:24:24 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1319624659!36711353!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2348 invoked from network); 26 Oct 2011 10:24:19 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-7.tower-174.messagelabs.com with SMTP;
	26 Oct 2011 10:24:19 -0000
Received: from p5b2e5c05.dip.t-dialin.net ([91.46.92.5] helo=[192.168.2.143])
	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 1RJ0eg-00062B-Ay; Wed, 26 Oct 2011 10:24:18 +0000
Message-ID: <4EA7DFD1.9060608@canonical.com>
Date: Wed, 26 Oct 2011 12:24:17 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux i686;
	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>, 
	"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>
X-Enigmail-Version: 1.4a1pre
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit
Cc: Len Brown <len.brown@intel.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] 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

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:   Fri Apr 1 19:34:59 2011 -0400

    cpuidle: stop depending on pm_idle

However cpuidle_call_idle() will return -ENODEV if it is supposed to be disabled
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:   Fri Apr 1 18:28:35 2011 -0400

    cpuidle: 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 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.

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.
One quick fix could be to add some Xen case into select_idle_routine() which
picks default_idle...

-Stefan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 03:50:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 03:50:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ14C-0003e9-On; Wed, 26 Oct 2011 03:50:41 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ13F-0003RT-7T
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 03:49:41 -0700
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319626176!159814!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6841 invoked from network); 26 Oct 2011 10:49:38 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 10:49:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,408,1315195200"; d="scan'208";a="168252198"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 06:49:36 -0400
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; Wed, 26 Oct 2011
	06:49:35 -0400
Message-ID: <4EA7E5BF.6050909@citrix.com>
Date: Wed, 26 Oct 2011 11:49:35 +0100
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: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h
References: <20134.62279.50041.126603@mariner.uk.xensource.com>
In-Reply-To: <20134.62279.50041.126603@mariner.uk.xensource.com>
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 25/10/11 18:35, Ian Jackson wrote:
> --- /dev/null
> +++ b/tools/libxl/bsd-queue.3
> @@ -0,0 +1,1044 @@
> +.\" Copyright (c) 1993
> +.\"	The Regents of the University of California.  All rights reserved.
> +.\"
> +.\" Redistribution and use in source and binary forms, with or without
> +.\" modification, are permitted provided that the following conditions
> +.\" are met:
> +.\" 1. Redistributions of source code must retain the above copyright
> +.\"    notice, this list of conditions and the following disclaimer.
> +.\" 2. Redistributions in binary form must reproduce the above copyright
> +.\"    notice, this list of conditions and the following disclaimer in the
> +.\"    documentation and/or other materials provided with the distribution.
> +.\" 3. All advertising materials mentioning features or use of this software
> +.\"    must display the following acknowledgement:

I think you'll have to drop the manpage because of this clause in the
license.

David

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 04:00:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 04:00:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ1Dk-0004Ch-By; Wed, 26 Oct 2011 04:00:32 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ1BT-0003yh-OX
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 03:58:12 -0700
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319626687!1119013!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11549 invoked from network); 26 Oct 2011 10:58:08 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 10:58:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,408,1315195200"; d="scan'208";a="168252710"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 06:57:53 -0400
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; Wed, 26 Oct 2011 06:57:52 -0400
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 p9QAvp4q018165;
	Wed, 26 Oct 2011 03:57:51 -0700
From: David Vrabel <david.vrabel@citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 26 Oct 2011 11:57:43 +0100
Message-ID: <1319626664-28225-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: David Vrabel <david.vrabel@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH] 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>
---
 .../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
+KernelVersion:	2.6.26
+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
+KernelVersion:	2.6.26
+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
+KernelVersion:	2.6.26
+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
+KernelVersion:	2.6.26
+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).
+
+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 Wed Oct 26 04:18:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 04:18:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ1Ux-0005Si-B6; Wed, 26 Oct 2011 04:18:19 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ1Tf-0005Dl-4e
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 04:17:00 -0700
X-Env-Sender: johneed@hotmail.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319627814!814873!1
X-Originating-IP: [65.55.34.79]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21326 invoked from network); 26 Oct 2011 11:16:55 -0000
Received: from col0-omc2-s5.col0.hotmail.com (HELO
	col0-omc2-s5.col0.hotmail.com) (65.55.34.79)
	by server-9.tower-182.messagelabs.com with SMTP;
	26 Oct 2011 11:16:55 -0000
Received: from COL119-W3 ([65.55.34.73]) by col0-omc2-s5.col0.hotmail.com with
	Microsoft SMTPSVC(6.0.3790.4675); Wed, 26 Oct 2011 04:16:54 -0700
Message-ID: <COL119-W3BE5D327E98AC28F28BECA8ED0@phx.gbl>
X-Originating-IP: [124.169.33.18]
From: Windows Live <johneed@hotmail.com>
To: <ian.campbell@citrix.com>, <xen-devel@lists.xensource.com>
Subject: RE: [Xen-devel] test structure missing files
Date: Wed, 26 Oct 2011 19:16:54 +0800
Importance: Normal
In-Reply-To: <1319610349.16747.33.camel@dagon.hellion.org.uk>
References: <COL119-W5023765948EB6ED67658CCA8EC0@phx.gbl>, , ,
	<1319575086.16747.8.camel@dagon.hellion.org.uk>, , ,
	<COL119-W47A054D3076A67A7A488ACA8EC0@phx.gbl>,
	<COL119-W1514D40D1978583B42A629A8ED0@phx.gbl>,
	<1319610349.16747.33.camel@dagon.hellion.org.uk>
MIME-Version: 1.0
X-OriginalArrivalTime: 26 Oct 2011 11:16:54.0399 (UTC)
	FILETIME=[C45FB8F0:01CC93D0]
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="===============0075811608=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0075811608==
Content-Type: multipart/alternative;
	boundary="_7154e1e1-9e7e-49c6-94b4-e3b3df0da40c_"

--_7154e1e1-9e7e-49c6-94b4-e3b3df0da40c_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable








> Subject: Re: FW: [Xen-devel] test structure missing files
> From: Ian.Campbell@citrix.com
> To: johneed@hotmail.com
> CC: xen-devel@lists.xensource.com
> Date: Wed=2C 26 Oct 2011 07:25:49 +0100
>=20
 =20
> In general the interesting stuff will likely be in the few lines before
> the actual error=2C in particular the gcc invocation and sometimes the
> make output about which directory it is building in etc. Please be wary
> of trimming too much when posting error messages.
>=20
roger that=20
> I just managed to reproduce the error though=2C it was non-obvious becaus=
e
> I had to run "make clean" in the tools tree first. I think you need to
> have built the tools tree before running the test target=2C at least this
> seems logical and works for me.
>=20
roger that.  Now you mention it=2C indeed.  I was attempting to cut it down=
 to bare minimum in response to your mentioning things such as patches and =
commands which might have an impact.Took it too far.  Now for a more sensib=
le approach..
> I suppose we should find a way to show this in the top-level Makefile
> dependencies. Perhaps this is sufficient:
>=20
> diff -r e6af32ecb448 Makefile
> --- a/Makefile	Tue Oct 18 14:15:09 2011 +0100
> +++ b/Makefile	Wed Oct 26 07:23:05 2011 +0100
> @@ -31=2C7 +31=2C7 @@ endif
>  # course=2C many tests require a machine running Xen itself=2C and these=
 are
>  # handled elsewhere.
>  .PHONY: test
> -test:
> +test: tools
>  	$(MAKE) -C tools/python test
> =20
>  # build and install everything into local dist directory
>=20
> I get failures now because I didn't build/test on a Xen host. That might
> be a show stopper for an ebuild as well?
>=20
> Ian.
>=20

After kicking my system into a better shape by way of the curl library and =
rebuilding xen-tools with thegentoo api use flag=2C I have some sanity now =
produced from running the make test.  Importantly any trace of those initia=
l errors now don't appear.  This means the test suite is now usable and inc=
orporatable into an ebuild.  Seems the running of the test suite will be co=
nditional on selection of some gentoo use flags.  Still get errors.=20
Ran 9 tests in 0.080s

FAILED (failures=3D1=2C errors=3D5)
ImportError: cannot import name XendConfig
ValueError: Cannot find kernel "/mykernel"
ValueError: Cannot find kernel "/boot/vmlinuz-xenU-smp"AssertionError: vide=
oram not in b
which makes 4=2C each of these repeated a couple of times.  Some gentoo pyt=
hon devs ought be able totroubleshoot these.  If you would like the test bu=
ild log=2C just say so.  From here it's purely python.
At a glance I suspect the tests that trigger "/mykernel" && "/boot/vmlinuz-=
xenU-smp" could be commented out or deleted IF they stem from requiring the=
 source to build kernels=2C which does not occur in a xen-tools package.  g=
entoo makes xen for the hypervisor=2C xen-tools and of recent xen-pvgrub wh=
ich is an invocation of make install-stubdom. I shall call upon more python=
 fluentgentoo devs to determine such states.
In the unlikely case that the gentoo devs can't sort these python misfires =
I shall need return and prompt for further support.
Thanks
Ian Delaney=2C gentoo xen

 		 	   		  =

--_7154e1e1-9e7e-49c6-94b4-e3b3df0da40c_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html>
<head>
<style><!--
.hmmessage P
{
margin:0px=3B
padding:0px
}
body.hmmessage
{
font-size: 10pt=3B
font-family:Tahoma
}
--></style>
</head>
<body class=3D'hmmessage'><div dir=3D'ltr'>


<style><!--
.hmmessage P
{
margin:0px=3B
padding:0px
}
body.hmmessage
{
font-size: 10pt=3B
font-family:Tahoma
}
--></style>

<div dir=3D"ltr"><br><br><div>&gt=3B Subject: Re: FW: [Xen-devel] test stru=
cture missing files<br>&gt=3B From: Ian.Campbell@citrix.com<br>&gt=3B To: j=
ohneed@hotmail.com<br>&gt=3B CC: xen-devel@lists.xensource.com<br>&gt=3B Da=
te: Wed=2C 26 Oct 2011 07:25:49 +0100<br>&gt=3B <br>&nbsp=3B&nbsp=3B<br>&gt=
=3B In general the interesting stuff will likely be in the few lines before=
<br>&gt=3B the actual error=2C in particular the gcc invocation and sometim=
es the<br>&gt=3B make output about which directory it is building in etc. P=
lease be wary<br>&gt=3B of trimming too much when posting error messages.<b=
r>&gt=3B </div><div><br></div><div>roger that&nbsp=3B</div><div><br></div><=
div>&gt=3B I just managed to reproduce the error though=2C it was non-obvio=
us because<br>&gt=3B I had to run "make clean" in the tools tree first. I t=
hink you need to<br>&gt=3B have built the tools tree before running the tes=
t target=2C at least this<br>&gt=3B seems logical and works for me.<br>&gt=
=3B </div><div><br></div><div>roger that. &nbsp=3BNow you mention it=2C ind=
eed. &nbsp=3BI was attempting to cut it down to bare minimum&nbsp=3B</div><=
div>in response to your mentioning things such as patches and commands whic=
h might have an impact.</div><div>Took it too far. &nbsp=3BNow for a more s=
ensible approach..</div><div><br>&gt=3B I suppose we should find a way to s=
how this in the top-level Makefile<br>&gt=3B dependencies. Perhaps this is =
sufficient:<br>&gt=3B <br>&gt=3B diff -r e6af32ecb448 Makefile<br>&gt=3B --=
- a/Makefile	Tue Oct 18 14:15:09 2011 +0100<br>&gt=3B +++ b/Makefile	Wed Oc=
t 26 07:23:05 2011 +0100<br>&gt=3B @@ -31=2C7 +31=2C7 @@ endif<br>&gt=3B  #=
 course=2C many tests require a machine running Xen itself=2C and these are=
<br>&gt=3B  # handled elsewhere.<br>&gt=3B  .PHONY: test<br>&gt=3B -test:<b=
r>&gt=3B +test: tools<br>&gt=3B  	$(MAKE) -C tools/python test<br>&gt=3B  <=
br>&gt=3B  # build and install everything into local dist directory<br>&gt=
=3B <br>&gt=3B I get failures now because I didn't build/test on a Xen host=
. That might<br>&gt=3B be a show stopper for an ebuild as well?<br>&gt=3B <=
br>&gt=3B Ian.<br>&gt=3B <br></div><div><br></div><div>After kicking my sys=
tem into a better shape by way of the curl library and rebuilding xen-tools=
 with the</div><div>gentoo api use flag=2C I have some sanity now produced =
from running the make test. &nbsp=3BImportantly any </div><div>trace of tho=
se initial errors now don't appear. &nbsp=3BThis means the test suite is no=
w usable and </div><div>incorporatable into an ebuild. &nbsp=3BSeems the ru=
nning of the test suite will be conditional on selection </div><div>of some=
 gentoo use flags. &nbsp=3BStill get errors.&nbsp=3B</div><div><br></div><d=
iv>Ran 9 tests in 0.080s<br><br>FAILED (failures=3D1=2C errors=3D5)</div><d=
iv><br></div><div>ImportError: cannot import name XendConfig<br>ValueError:=
 Cannot find kernel "/mykernel"<br></div><div>ValueError: Cannot find kerne=
l "/boot/vmlinuz-xenU-smp"</div><div>AssertionError: videoram not in b</div=
><div><br></div><div>which makes 4=2C each of these repeated a couple of ti=
mes. &nbsp=3BSome gentoo python devs ought be able to</div><div>troubleshoo=
t these. &nbsp=3BIf you would like the test build log=2C just say so. &nbsp=
=3BFrom here it's purely python.</div><div><br></div><div>At a glance I sus=
pect the tests that trigger "/mykernel" &amp=3B&amp=3B "/boot/vmlinuz-xenU-=
smp" could be </div><div>commented out or deleted IF they stem from requiri=
ng the source to build kernels=2C which&nbsp=3B</div><div>does not occur in=
 a xen-tools package. &nbsp=3Bgentoo makes xen for the hypervisor=2C xen-to=
ols and of recent </div><div>xen-pvgrub which is an invocation of make inst=
all-stubdom. I shall call upon more python fluent</div><div>gentoo devs to =
determine such states.</div><div><br></div><div>In the unlikely case that t=
he gentoo devs can't sort these python misfires I shall need return and </d=
iv><div>prompt for further support.</div><div><br></div><div>Thanks</div><d=
iv><br></div><div>Ian Delaney=2C gentoo xen</div><div><br></div></div>
 		 	   		  </div></body>
</html>=

--_7154e1e1-9e7e-49c6-94b4-e3b3df0da40c_--


--===============0075811608==
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

--===============0075811608==--


From xen-devel-bounces@lists.xensource.com Wed Oct 26 04:56:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 04:56:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ25v-0000ZJ-2D; Wed, 26 Oct 2011 04:56:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ245-0008U5-Av
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 04:54:37 -0700
X-Env-Sender: hubaiz@gmail.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319630072!819837!1
X-Originating-IP: [216.139.236.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16591 invoked from network); 26 Oct 2011 11:54:33 -0000
Received: from sam.nabble.com (HELO sam.nabble.com) (216.139.236.26)
	by server-3.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	26 Oct 2011 11:54:33 -0000
Received: from [192.168.236.26] (helo=sam.nabble.com)
	by sam.nabble.com with esmtp (Exim 4.72)
	(envelope-from <hubaiz@gmail.com>) id 1RJ23z-0005F3-NV
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 04:54:31 -0700
Date: Wed, 26 Oct 2011 04:54:31 -0700 (PDT)
From: Zoltan Hubai <hubaiz@gmail.com>
To: xen-devel@lists.xensource.com
Message-ID: <1319630071722-4939528.post@n5.nabble.com>
In-Reply-To: <1318672856439-4904945.post@n5.nabble.com>
References: <1316616472579-4826635.post@n5.nabble.com>
	<1316616757871-4826655.post@n5.nabble.com>
	<1316618006.67296.YahooMailNeo@web29818.mail.ird.yahoo.com>
	<1316693722029-4829929.post@n5.nabble.com>
	<20110922182705.GE12984@reaktio.net>
	<1316728444821-4831624.post@n5.nabble.com>
	<1316777654598-4833174.post@n5.nabble.com>
	<1316786412428-4833637.post@n5.nabble.com>
	<20110923172115.GI12984@reaktio.net>
	<1318672856439-4904945.post@n5.nabble.com>
Subject: Re: Re : Re : Re : Re : [Xen-devel] Re: Patches for VGA-Passthrough
	XEN 4.2 unstable
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
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

Hi

First of all thx for David and the xen team.

My configuration is
MB: asrock Z68 extreme 4 gen 3
CPU: intel i7 2600
Memory: 8 gb
GFX1: nvidia 285 gtx (connected to monitor 1)
GFX2: built in intel 2000 on cpu (connected to monitor 2)

First I installed Ubuntu 11.10 x64, after that installed kernel 3.1.0 with
the ubuntu configuration as start and making the needed changes for xen.
Then I installed xen-unstable the way David has explained (extracting the
gfx firmware, patching, modifying dsdt.asl).
I also added the xen-pciback.hide=(01:00.0) kernel param.

Here is the dmesg part related to vga:
[    0.000000] Command line: root=UUID=51cc6b5d-8f21-43c4-83ca-cb25324d3212
ro xen-pciback.hide=(01:00.0)
[    1.974554] Kernel command line:
root=UUID=51cc6b5d-8f21-43c4-83ca-cb25324d3212 ro xen-pciback.hide=(01:00.0)
[    2.159340] pci 0000:01:00.0: [10de:05e3] type 0 class 0x000300
[    2.159356] pci 0000:01:00.0: reg 10: [mem 0xfa000000-0xfaffffff]
[    2.159374] pci 0000:01:00.0: reg 14: [mem 0xc0000000-0xcfffffff 64bit
pref]
[    2.159392] pci 0000:01:00.0: reg 1c: [mem 0xf8000000-0xf9ffffff 64bit]
[    2.159404] pci 0000:01:00.0: reg 24: [io  0xe000-0xe07f]
[    2.159415] pci 0000:01:00.0: reg 30: [mem 0xfb000000-0xfb07ffff pref]
[    2.191560] vgaarb: device added:
PCI:0000:01:00.0,decodes=io+mem,owns=io+mem,locks=none
[    2.191694] vgaarb: bridge control possible 0000:01:00.0
[    2.216347] pciback 0000:01:00.0: seizing device
[    2.456885] pciback 0000:01:00.0: Boot video device
[    2.513904] pciback 0000:01:00.0: Signaling PME through PCIe PME
interrupt
[    2.518151] pciback 0000:01:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ
16
[    2.518216] pciback 0000:01:00.0: PCI INT A disabled
[   87.312028] xen-pciback: vpci: 0000:01:00.0: assign to virtual slot 0
[  322.481774] xen-pciback: vpci: 0000:01:00.0: assign to virtual slot 0
[  322.482524] pciback 0000:01:00.0: device has been assigned to another
domain! Over-writting the ownership, but beware.

and here is the dmesg for the intel gfx

[    2.156757] pci 0000:00:02.0: [8086:0102] type 0 class 0x000380
[    2.156782] pci 0000:00:02.0: reg 10: [mem 0xfb400000-0xfb7fffff 64bit]
[    2.156796] pci 0000:00:02.0: reg 18: [mem 0xb0000000-0xbfffffff 64bit
pref]
[    2.156806] pci 0000:00:02.0: reg 20: [io  0xf000-0xf03f]
[    7.867449] i915 0000:00:02.0: enabling device (0006 -> 0007)
[    7.867467] i915 0000:00:02.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
[    7.867472] i915 0000:00:02.0: setting latency timer to 64
[    8.833292] [drm] Initialized i915 1.6.0 20080730 for 0000:00:02.0 on
minor 0

In bios i setup pci express as startup device, so when ubuntu begins to load
first I see the loading on the monitor 1 connected to nvidia and when the
card is assigned to pciback then it automaticaly switches to the intel 2000
built in gfx on monitor 2.

First I had problem with executin /etc/init.d/xencomons start was getting
the following error
usr/lib64/xen/bin/qemu-dm: error while loading shared libraries:
libxenctrl.so.4.2: cannot open shared object file: No such file or directory
I solved it by adding /usr/lib64 to /etc/ld.so.conf and executing ldconfig
Then I had problem with executing /etc/init.d/xend start, was getting the
following error
RTNETLINK answers: File exists
xend would start but without networking, solved this by defining the xenbr0
interface in /etc/network/interfaces

So finally everything was working:

root@anubisxen:/usr/src# xm pci-list-assignable-devices
0000:01:00.0

First I tryed to install windows 7 x64 professional, that worked but after I
installed the latest nvidia 285.62 driver I got a BSOD.
Then I tryed to install windows xp (sp3) x86, installed the same driver and
also didn't work.
So after read David blog, I downloaded the 275.33 driver for xp and for my
suprise it was working.
I did the same for win7, and win7 also worked with the 275.33 driver.
I need to do some more testing, unfortunatly I created to small disk for
win7 so I run out of space, but will try it with a bigger disk and with some
benchmarks.
I tryed 3dmark 6 on winxp and it was running fine.

Will post more when I reinstall win7 with a bigger virtual disk, will
compare benchmarks from a virt machine and a real machine.

sorry for my poor english

--
View this message in context: http://xen.1045712.n5.nabble.com/Patches-for-VGA-Passthrough-XEN-4-2-unstable-tp4406265p4939528.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 Wed Oct 26 05:49:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 05:49:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ2v6-0003Fq-D3; Wed, 26 Oct 2011 05:49:24 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ2uG-00033K-HS
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 05:48:32 -0700
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319633281!50665691!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24811 invoked from network); 26 Oct 2011 12:48:03 -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;
	26 Oct 2011 12:48:03 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315195200"; d="scan'208";a="18552289"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 08:48:27 -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; Wed, 26 Oct 2011 08:48:27 -0400
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 p9QCmPCT018838;
	Wed, 26 Oct 2011 05:48:26 -0700
From: David Vrabel <david.vrabel@citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 26 Oct 2011 13:48:20 +0100
Message-ID: <1319633300-29065-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: David Vrabel <david.vrabel@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] [PATCH] 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 Wed Oct 26 06:05:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:05:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3AW-0004bo-DB; Wed, 26 Oct 2011 06:05:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ35X-0004Jd-5Z
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:00:16 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1319634007!33063869!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6280 invoked from network); 26 Oct 2011 13:00:08 -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;
	26 Oct 2011 13:00:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315180800"; 
   d="scan'208";a="8595611"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 13:00: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; Wed, 26 Oct 2011 14:00:07 +0100
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
	1RJ35T-0005ip-7c; Wed, 26 Oct 2011 13:00:07 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJ35T-0003QO-3E;
	Wed, 26 Oct 2011 14:00:07 +0100
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: <20136.1111.58646.458830@mariner.uk.xensource.com>
Date: Wed, 26 Oct 2011 14:00:07 +0100
To: Kasper Brink <K.Brink@cs.ru.nl>
Subject: Re: [Xen-devel] pv-grub Solaris support
In-Reply-To: <20111026092134.GA12432@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>
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

Kasper Brink writes ("Re: [Xen-devel] pv-grub Solaris support"):
> Could you send me the full build log for comparison?

I had failed to "hg add" so my "hg clean" removed the patch file.  I
checked it again and it works fine.

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

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. ?

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 Oct 26 06:09:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:09:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3EZ-00054f-4A; Wed, 26 Oct 2011 06:09:31 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ389-0004RN-6c
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:03:00 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1319634164!1735292!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15503 invoked from network); 26 Oct 2011 13:02:50 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 13:02:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315195200"; d="scan'208";a="18552780"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 09:02:48 -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; Wed, 26 Oct 2011 09:02:49 -0400
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
	p9QD2fLP018892;	Wed, 26 Oct 2011 06:02:47 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1dd6bb4612b4f11bf52fa7ac21321227b6560e0e
Message-ID: <1dd6bb4612b4f11bf52f.1319634166@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319634159@cosworth.uk.xensource.com>
References: <patchbomb.1319634159@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 14:02:46 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 7 of 8 DOCDAY] docs: hypercall: generate docs
	for latest API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319625725 -3600
# Node ID 1dd6bb4612b4f11bf52fa7ac21321227b6560e0e
# Parent  ae4ea5cb066383e9bfe30ab49fd498eed0d5ca7e
docs: hypercall: generate docs for latest API

By defining __XEN_INTERFACE_VERSION__=__XEN_LATEST_INTERFACE_VERSION__.

I'm not entirely happy with how guest handles are represented in the output.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff --git a/docs/hypercall.Doxyfile b/docs/hypercall.Doxyfile
--- a/docs/hypercall.Doxyfile
+++ b/docs/hypercall.Doxyfile
@@ -170,7 +170,7 @@ SEPARATE_MEMBER_PAGES  = NO
 # The TAB_SIZE tag can be used to set the number of spaces in a tab.
 # Doxygen uses this value to replace tabs by spaces in code fragments.
 
-TAB_SIZE               = 8
+TAB_SIZE               = 4
 
 # This tag can be used to specify a number of aliases that acts
 # as commands in the documentation. An alias has the form "name=value".
@@ -1331,13 +1331,13 @@ ENABLE_PREPROCESSING   = YES
 # compilation will be performed. Macro expansion can be done in a controlled
 # way by setting EXPAND_ONLY_PREDEF to YES.
 
-MACRO_EXPANSION        = NO
+MACRO_EXPANSION        = YES
 
 # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
 # then the macro expansion is limited to the macros specified with the
 # PREDEFINED and EXPAND_AS_DEFINED tags.
 
-EXPAND_ONLY_PREDEF     = NO
+EXPAND_ONLY_PREDEF     = YES
 
 # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
 # in the INCLUDE_PATH (see below) will be search if a #include is found.
@@ -1365,7 +1365,11 @@ INCLUDE_FILE_PATTERNS  =
 # undefined via #undef or recursively expanded use the := operator
 # instead of the = operator.
 
-PREDEFINED             =
+PREDEFINED             = "__XEN_INTERFACE_VERSION__=__XEN_LATEST_INTERFACE_VERSION__" \
+                         "XEN_GUEST_HANDLE(name)=GUEST_##name *" \
+                         "XEN_GUEST_HANDLE_64(name)= GUEST_##name *" \
+                         "DEFINE_XEN_GUEST_HANDLE(name)=typedef name GUEST_##name;typedef const name GUEST_const_##name" \
+                         "__DEFINE_XEN_GUEST_HANDLE(name,type)=typedef name GUEST_##name; typedef const type GUEST_const_##name"
 
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
 # this tag can be used to specify a list of macro names that should be expanded.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:11:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:11:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3GP-0005Si-O5; Wed, 26 Oct 2011 06:11:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ38Y-0004Tb-CS
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:03:23 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1319634191!828178!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27735 invoked from network); 26 Oct 2011 13:03:14 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 13:03:14 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315195200"; d="scan'208";a="168266026"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 09:02:50 -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; Wed, 26 Oct 2011 09:02:50 -0400
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
	p9QD2fLQ018892;	Wed, 26 Oct 2011 06:02:48 -0700
MIME-Version: 1.0
X-Mercurial-Node: 78d2ade5f1fc301ad60eba6343fae78d575c85af
Message-ID: <78d2ade5f1fc301ad60e.1319634167@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319634159@cosworth.uk.xensource.com>
References: <patchbomb.1319634159@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 14:02:47 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 8 of 8 DOCDAY] docs: hypercall: document
 mmuext_op using Doxygen
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============2135385727=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2135385727==
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIElhbiBDYW1wYmVsbCA8aWFuLmNhbXBiZWxsQGNp
dHJpeC5jb20+CiMgRGF0ZSAxMzE5NjMzMDg1IC0zNjAwCiMgTm9kZSBJRCA3OGQyYWRlNWYxZmMz
MDFhZDYwZWJhNjM0M2ZhZTc4ZDU3NWM4NWFmCiMgUGFyZW50ICAxZGQ2YmI0NjEyYjRmMTFiZjUy
ZmE3YWMyMTMyMTIyN2I2NTYwZTBlCmRvY3M6IGh5cGVyY2FsbDogZG9jdW1lbnQgbW11ZXh0X29w
IHVzaW5nIERveHlnZW4KClNpZ25lZC1vZmYtYnk6IElhbiBDYW1wYmVsbCA8aWFuLmNhbXBiZWxs
QGNpdHJpeC5jb20+CgpkaWZmIC0tZ2l0IGEvZG9jcy9oeXBlcmNhbGwuRG94eWZpbGUgYi9kb2Nz
L2h5cGVyY2FsbC5Eb3h5ZmlsZQotLS0gYS9kb2NzL2h5cGVyY2FsbC5Eb3h5ZmlsZQorKysgYi9k
b2NzL2h5cGVyY2FsbC5Eb3h5ZmlsZQpAQCAtMTM2OSw3ICsxMzY5LDkgQEAgUFJFREVGSU5FRCAg
ICAgICAgICAgICA9ICJfX1hFTl9JTlRFUkZBQwogICAgICAgICAgICAgICAgICAgICAgICAgICJY
RU5fR1VFU1RfSEFORExFKG5hbWUpPUdVRVNUXyMjbmFtZSAqIiBcCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgIlhFTl9HVUVTVF9IQU5ETEVfNjQobmFtZSk9IEdVRVNUXyMjbmFtZSAqIiBcCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgIkRFRklORV9YRU5fR1VFU1RfSEFORExFKG5hbWUpPXR5
cGVkZWYgbmFtZSBHVUVTVF8jI25hbWU7dHlwZWRlZiBjb25zdCBuYW1lIEdVRVNUX2NvbnN0XyMj
bmFtZSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICJfX0RFRklORV9YRU5fR1VFU1RfSEFO
RExFKG5hbWUsdHlwZSk9dHlwZWRlZiBuYW1lIEdVRVNUXyMjbmFtZTsgdHlwZWRlZiBjb25zdCB0
eXBlIEdVRVNUX2NvbnN0XyMjbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiX19ERUZJ
TkVfWEVOX0dVRVNUX0hBTkRMRShuYW1lLHR5cGUpPXR5cGVkZWYgbmFtZSBHVUVTVF8jI25hbWU7
IHR5cGVkZWYgY29uc3QgdHlwZSBHVUVTVF9jb25zdF8jI25hbWUiIFwKKwkJCSAiX19ET1hZR0VO
X189MSIgXAorCQkJICJBTk9OKHgpPSIKIAogIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBF
WFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuCiAjIHRoaXMgdGFnIGNh
biBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJl
IGV4cGFuZGVkLgpkaWZmIC0tZ2l0IGEveGVuL2luY2x1ZGUvcHVibGljL3hlbi5oIGIveGVuL2lu
Y2x1ZGUvcHVibGljL3hlbi5oCi0tLSBhL3hlbi9pbmNsdWRlL3B1YmxpYy94ZW4uaAorKysgYi94
ZW4vaW5jbHVkZS9wdWJsaWMveGVuLmgKQEAgLTUxLDYgKzUxLDExIEBAIERFRklORV9YRU5fR1VF
U1RfSEFORExFKHVpbnQ2NF90KTsKIERFRklORV9YRU5fR1VFU1RfSEFORExFKHhlbl9wZm5fdCk7
CiAjZW5kaWYKIAorLyogSW5kaWNhdGVzIGEgbWVtYmVyIHdoaWNoIHdvdWxkIGJlIGFub255bW91
cyBpZiBjb21waWxlcnMgcmVsaWFibHkKKyAqIHN1cHBvcnRlZCB0aGF0IGtpbmQgb2YgdGhpbmcu
CisgKi8KKyNkZWZpbmUgQU5PTih4KSB4CisKIC8qCiAgKiBIWVBFUkNBTExTCiAgKi8KQEAgLTIw
MiwxMDcgKzIwNywxOTMgQEAgREVGSU5FX1hFTl9HVUVTVF9IQU5ETEUoeGVuX3Bmbl90KTsKICNk
ZWZpbmUgTU1VX01BQ0hQSFlTX1VQREFURSAgICAgICAxIC8qIHB0ciA9IE1BIG9mIGZyYW1lIHRv
IG1vZGlmeSBlbnRyeSBmb3IgKi8KICNkZWZpbmUgTU1VX1BUX1VQREFURV9QUkVTRVJWRV9BRCAy
IC8qIGF0b21pY2FsbHk6ICpwdHIgPSB2YWwgfCAoKnB0ciYoQXxEKSkgKi8KIAotLyoKLSAqIE1N
VSBFWFRFTkRFRCBPUEVSQVRJT05TCi0gKiAKLSAqIEhZUEVSVklTT1JfbW11ZXh0X29wKCkgYWNj
ZXB0cyBhIGxpc3Qgb2YgbW11ZXh0X29wIHN0cnVjdHVyZXMuCi0gKiBBIGZvcmVpZ25kb20gKEZE
KSBjYW4gYmUgc3BlY2lmaWVkIChvciBET01JRF9TRUxGIGZvciBub25lKS4KLSAqIFdoZXJlIHRo
ZSBGRCBoYXMgc29tZSBlZmZlY3QsIGl0IGlzIGRlc2NyaWJlZCBiZWxvdy4KLSAqIAotICogY21k
OiBNTVVFWFRfKFVOKVBJTl8qX1RBQkxFCi0gKiBtZm46IE1hY2hpbmUgZnJhbWUgbnVtYmVyIHRv
IGJlICh1bilwaW5uZWQgYXMgYSBwLnQuIHBhZ2UuCi0gKiAgICAgIFRoZSBmcmFtZSBtdXN0IGJl
bG9uZyB0byB0aGUgRkQsIGlmIG9uZSBpcyBzcGVjaWZpZWQuCi0gKiAKLSAqIGNtZDogTU1VRVhU
X05FV19CQVNFUFRSCi0gKiBtZm46IE1hY2hpbmUgZnJhbWUgbnVtYmVyIG9mIG5ldyBwYWdlLXRh
YmxlIGJhc2UgdG8gaW5zdGFsbCBpbiBNTVUuCi0gKiAKLSAqIGNtZDogTU1VRVhUX05FV19VU0VS
X0JBU0VQVFIgW3g4Ni82NCBvbmx5XQotICogbWZuOiBNYWNoaW5lIGZyYW1lIG51bWJlciBvZiBu
ZXcgcGFnZS10YWJsZSBiYXNlIHRvIGluc3RhbGwgaW4gTU1VCi0gKiAgICAgIHdoZW4gaW4gdXNl
ciBzcGFjZS4KLSAqIAotICogY21kOiBNTVVFWFRfVExCX0ZMVVNIX0xPQ0FMCi0gKiBObyBhZGRp
dGlvbmFsIGFyZ3VtZW50cy4gRmx1c2hlcyBsb2NhbCBUTEIuCi0gKiAKLSAqIGNtZDogTU1VRVhU
X0lOVkxQR19MT0NBTAotICogbGluZWFyX2FkZHI6IExpbmVhciBhZGRyZXNzIHRvIGJlIGZsdXNo
ZWQgZnJvbSB0aGUgbG9jYWwgVExCLgotICogCi0gKiBjbWQ6IE1NVUVYVF9UTEJfRkxVU0hfTVVM
VEkKLSAqIHZjcHVtYXNrOiBQb2ludGVyIHRvIGJpdG1hcCBvZiBWQ1BVcyB0byBiZSBmbHVzaGVk
LgotICogCi0gKiBjbWQ6IE1NVUVYVF9JTlZMUEdfTVVMVEkKLSAqIGxpbmVhcl9hZGRyOiBMaW5l
YXIgYWRkcmVzcyB0byBiZSBmbHVzaGVkLgotICogdmNwdW1hc2s6IFBvaW50ZXIgdG8gYml0bWFw
IG9mIFZDUFVzIHRvIGJlIGZsdXNoZWQuCi0gKiAKLSAqIGNtZDogTU1VRVhUX1RMQl9GTFVTSF9B
TEwKLSAqIE5vIGFkZGl0aW9uYWwgYXJndW1lbnRzLiBGbHVzaGVzIGFsbCBWQ1BVcycgVExCcy4K
LSAqIAotICogY21kOiBNTVVFWFRfSU5WTFBHX0FMTAotICogbGluZWFyX2FkZHI6IExpbmVhciBh
ZGRyZXNzIHRvIGJlIGZsdXNoZWQgZnJvbSBhbGwgVkNQVXMnIFRMQnMuCi0gKiAKLSAqIGNtZDog
TU1VRVhUX0ZMVVNIX0NBQ0hFCi0gKiBObyBhZGRpdGlvbmFsIGFyZ3VtZW50cy4gV3JpdGVzIGJh
Y2sgYW5kIGZsdXNoZXMgY2FjaGUgY29udGVudHMuCisvKioKKyAqIFxkZWZncm91cCBIWVBFUlZJ
U09SX21tdWV4dF9vcCBNTVUgRVhURU5ERUQgT1BFUkFUSU9OUwogICoKLSAqIGNtZDogTU1VRVhU
X0ZMVVNIX0NBQ0hFX0dMT0JBTAotICogTm8gYWRkaXRpb25hbCBhcmd1bWVudHMuIFdyaXRlcyBi
YWNrIGFuZCBmbHVzaGVzIGNhY2hlIGNvbnRlbnRzCi0gKiBvbiBhbGwgQ1BVcyBpbiB0aGUgc3lz
dGVtLgotICogCi0gKiBjbWQ6IE1NVUVYVF9TRVRfTERUCi0gKiBsaW5lYXJfYWRkcjogTGluZWFy
IGFkZHJlc3Mgb2YgTERUIGJhc2UgKE5CLiBtdXN0IGJlIHBhZ2UtYWxpZ25lZCkuCi0gKiBucl9l
bnRzOiBOdW1iZXIgb2YgZW50cmllcyBpbiBMRFQuCisgKiBleHRlbmRlZCBNTVUgY29tbWFuZCBp
bnRlcmZhY2UuCiAgKgotICogY21kOiBNTVVFWFRfQ0xFQVJfUEFHRQotICogbWZuOiBNYWNoaW5l
IGZyYW1lIG51bWJlciB0byBiZSBjbGVhcmVkLgorICogQW4gYWRkaXRpb25hbCBNTVUgaHlwZXJj
YWxsIHByb3ZpZGVzIGFuIGBleHRlbmRlZCBjb21tYW5kJworICogaW50ZXJmYWNlLiBUaGlzIHBy
b3ZpZGVzIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSBiZXlvbmQgdGhlIGJhc2ljCisgKiB0YWJs
ZSB1cGRhdGluZyBjb21tYW5kcy4gVGhpcyBoeXBlcmNhbGwgaXMgdXNlZCB0byBwZXJmb3JtCisg
KiBhZGRpdGlvbmFsIE1NVSBvcGVyYXRpb25zLiBUaGVzZSBpbmNsdWRlIHVwZGF0aW5nIGNyMyAo
b3IganVzdAorICogcmUtaW5zdGFsbGluZyBpdCBmb3IgYSBUTEIgZmx1c2gpLCByZXF1ZXN0aW5n
IHZhcmlvdXMga2luZHMgb2YgVExCCisgKiBmbHVzaCwgZmx1c2hpbmcgdGhlIGNhY2hlLCBpbnN0
YWxsaW5nIGEgbmV3IExEVCwgb3IgcGlubmluZyAmCisgKiB1bnBpbm5pbmcgcGFnZS10YWJsZSBw
YWdlcyAodG8gZW5zdXJlIHRoZWlyIHJlZmVyZW5jZSBjb3VudCBkb2VzbuKAmXQKKyAqIGRyb3Ag
dG8gemVybyB3aGljaCB3b3VsZCByZXF1aXJlIGEgcmV2YWxpZGF0aW9uIG9mIGFsbCBlbnRyaWVz
KS4gU29tZQorICogb2YgdGhlIG9wZXJhdGlvbnMgYXZhaWxhYmxlIGFyZSByZXN0cmljdGVkIHRv
IGRvbWFpbnMgd2l0aCBzdWZmaWNpZW50CisgKiBzeXN0ZW0gcHJpdmlsZWdlcy4gIEl0IGlzIGFs
c28gcG9zc2libGUgZm9yIHByaXZpbGVnZWQgZG9tYWlucyB0bworICogcmVhc3NpZ24gcGFnZSBv
d25lcnNoaXAgdmlhIGFuIGV4dGVuZGVkIE1NVSBvcGVyYXRpb24sIGFsdGhvdWdoIGdyYW50Cisg
KiB0YWJsZXMgYXJlIHVzZWQgaW4tIHN0ZWFkIG9mIHRoaXMgd2hlcmUgcG9zc2libGUKKyAqLwor
LyoqCisgKiBIWVBFUlZJU09SX21tdWV4dF9vcCgpIGFjY2VwdHMgYSBsaXN0IG9mIGV4dGVuZGVk
IG9wZXJhdGlvbnMgdG8gcGVyZm9ybS4KICAqCi0gKiBjbWQ6IE1NVUVYVF9DT1BZX1BBR0UKLSAq
IG1mbjogTWFjaGluZSBmcmFtZSBudW1iZXIgb2YgdGhlIGRlc3RpbmF0aW9uIHBhZ2UuCi0gKiBz
cmNfbWZuOiBNYWNoaW5lIGZyYW1lIG51bWJlciBvZiB0aGUgc291cmNlIHBhZ2UuCi0gKgotICog
Y21kOiBNTVVFWFRfW1VOXU1BUktfU1VQRVIKLSAqIG1mbjogTWFjaGluZSBmcmFtZSBudW1iZXIg
b2YgaGVhZCBvZiBzdXBlcnBhZ2UgdG8gYmUgW3VuXW1hcmtlZC4KKyAqIFxpbmdyb3VwIEhZUEVS
VklTT1JfbW11ZXh0X29wCisgKiBcYXJnIFxjIHVvcHMgICAgICAgTGlzdCBvZiBvcGVyYXRpb25z
IHRvIHBlcmZvcm0uCisgKiBcYXJnIFxjIGNvdW50ICAgICAgTnVtYmVyIG9mIG9wZXJhdGlvbnMg
aW4gXGMgdW9wcy4KKyAqIFxhcmcgXGMgcGRvbmUgICAgICBBbiBvdXRwdXQgcG9pbnRlci4gXGMg
cGRvbmUgd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBudW1iZXIKKyAqICAgICAgICAgICAgICAgICAg
ICBvZiBvcGVyYXRpb25zIHdoaWNoIHdlcmUgY29tcGxldGVkLgorICogXGFyZyBcYyBmb3JlaWdu
ZG9tIEEgZm9yZWlnbiBkb21haW4gaWQgb3IgXGMgRE9NSURfU0VMRi4gV2hlcmUgXGMgZm9yZWln
bmRvbQorICogICAgICAgICAgICAgICAgICAgIGhhcyBzb21lIGVmZmVjdCBpdCBpcyBkZXNjcmli
ZWQgaW4gdGhlIHJlbGV2YW50CisgKiAgICAgICAgICAgICAgICAgICAgXGMgTU1VRVhUXyogZG9j
dW1lbnRhdGlvbi4KKyAqLworI2lmZGVmIF9fRE9YWUdFTl9fCitpbnQgSFlQRVJWSVNPUl9tbXVl
eHRfb3AoCisgICAgWEVOX0dVRVNUX0hBTkRMRShtbXVleHRfb3BfdCkgdW9wcywKKyAgICB1bnNp
Z25lZCBpbnQgY291bnQsCisgICAgWEVOX0dVRVNUX0hBTkRMRSh1aW50KSBwZG9uZSwKKyAgICB1
bnNpZ25lZCBpbnQgZm9yZWlnbmRvbSk7CisjZW5kaWYKKworLyoqIFxpbmdyb3VwIEhZUEVSVklT
T1JfbW11ZXh0X29wCisgKiBQaW4gYSBwYWdlIGFzIGFuIEwxIHBhZ2UtdGFibGUuCisgKiBcYXJn
IFxjIG1mbiBNYWNoaW5lIGZyYW1lIG51bWJlciB0byBiZSBwaW5uZWQgYXMgYW4gTDEgcGFnZS10
YWJsZSBwYWdlLgorICogICAgICBUaGUgZnJhbWUgbXVzdCBiZWxvbmcgdG8gdGhlIFxjIGZvcmVp
Z25kb20sIGlmIG9uZSBpcyBzcGVjaWZpZWQuCiAgKi8KICNkZWZpbmUgTU1VRVhUX1BJTl9MMV9U
QUJMRSAgICAgIDAKKy8qKiBcaW5ncm91cCBIWVBFUlZJU09SX21tdWV4dF9vcAorICogUGluIGEg
cGFnZSBhcyBhbiBMMiBwYWdlLXRhYmxlLgorICogXGFyZyBcYyBtZm4gTWFjaGluZSBmcmFtZSBu
dW1iZXIgdG8gYmUgcGlubmVkIGFzIGFuIEwyIHBhZ2UtdGFibGUgcGFnZS4KKyAqICAgICAgVGhl
IGZyYW1lIG11c3QgYmVsb25nIHRvIHRoZSBcYyBmb3JlaWduZG9tLCBpZiBvbmUgaXMgc3BlY2lm
aWVkLgorICovCiAjZGVmaW5lIE1NVUVYVF9QSU5fTDJfVEFCTEUgICAgICAxCisvKiogXGluZ3Jv
dXAgSFlQRVJWSVNPUl9tbXVleHRfb3AKKyAqIFBpbiBhIHBhZ2UgYXMgYW4gTDMgcGFnZS10YWJs
ZS4KKyAqIFxhcmcgXGMgbWZuIE1hY2hpbmUgZnJhbWUgbnVtYmVyIHRvIGJlIHBpbm5lZCBhcyBh
biBMMyBwYWdlLXRhYmxlIHBhZ2UuCisgKiAgICAgIFRoZSBmcmFtZSBtdXN0IGJlbG9uZyB0byB0
aGUgXGMgZm9yZWlnbmRvbSwgaWYgb25lIGlzIHNwZWNpZmllZC4KKyAqLwogI2RlZmluZSBNTVVF
WFRfUElOX0wzX1RBQkxFICAgICAgMgorLyoqIFxpbmdyb3VwIEhZUEVSVklTT1JfbW11ZXh0X29w
CisgKiBQaW4gYSBwYWdlIGFzIGFuIEw0IHBhZ2UtdGFibGUuCisgKiBcYXJnIFxjIG1mbiBNYWNo
aW5lIGZyYW1lIG51bWJlciB0byBiZSBwaW5uZWQgYXMgYW4gTDQgcGFnZS10YWJsZSBwYWdlLgor
ICogICAgICBUaGUgZnJhbWUgbXVzdCBiZWxvbmcgdG8gdGhlIFxjIGZvcmVpZ25kb20sIGlmIG9u
ZSBpcyBzcGVjaWZpZWQuCisgKi8KICNkZWZpbmUgTU1VRVhUX1BJTl9MNF9UQUJMRSAgICAgIDMK
Ky8qKiBcaW5ncm91cCBIWVBFUlZJU09SX21tdWV4dF9vcAorICogVW5waW4gYSBwYWdlIGFzIGEg
cGFnZS10YWJsZS4KKyAqIFxhcmcgXGMgbWZuIE1hY2hpbmUgZnJhbWUgbnVtYmVyIHRvIGJlIHVu
cGlubmVkIGFzIGEgcGFnZS10YWJsZSBwYWdlLgorICogICAgICBUaGUgZnJhbWUgbXVzdCBiZWxv
bmcgdG8gdGhlIFxjIGZvcmVpZ25kb20sIGlmIG9uZSBpcyBzcGVjaWZpZWQuCisgKi8KICNkZWZp
bmUgTU1VRVhUX1VOUElOX1RBQkxFICAgICAgIDQKKy8qKiBcaW5ncm91cCBIWVBFUlZJU09SX21t
dWV4dF9vcAorICogSW5zdGFsbCBhIG5ldyBwYWdlLXRhYmxlIGJhc2UuCisgKiBcYXJnIFxjIG1m
biBNYWNoaW5lIGZyYW1lIG51bWJlciBvZiBuZXcgcGFnZS10YWJsZSBiYXNlIHRvIGluc3RhbGwg
aW4gTU1VLgorICovCiAjZGVmaW5lIE1NVUVYVF9ORVdfQkFTRVBUUiAgICAgICA1CisvKiogXGlu
Z3JvdXAgSFlQRVJWSVNPUl9tbXVleHRfb3AKKyAqIEZsdXNoZXMgbG9jYWwgVExCLgorICogTm8g
YWRkaXRpb25hbCBhcmd1bWVudHMuCisgKi8KICNkZWZpbmUgTU1VRVhUX1RMQl9GTFVTSF9MT0NB
TCAgIDYKKy8qKiBcaW5ncm91cCBIWVBFUlZJU09SX21tdWV4dF9vcAorICogRmx1c2ggYSBzcGVj
aWZpYyBwYWdlIGZyb20gbG9jYWwgVExCIGJ5IGxpbmVhciBhZGRyZXNzLgorICogXGFyZyBcYyBs
aW5lYXJfYWRkciBMaW5lYXIgYWRkcmVzcyB0byBiZSBmbHVzaGVkIGZyb20gdGhlIGxvY2FsIFRM
Qi4KKyAqLwogI2RlZmluZSBNTVVFWFRfSU5WTFBHX0xPQ0FMICAgICAgNworLyoqIFxpbmdyb3Vw
IEhZUEVSVklTT1JfbW11ZXh0X29wCisgKiBGbHVzaCBhIHN1YnNldCBvZiBWQ1BVcycgVExCcy4K
KyAqIFxhcmcgXGMgdmNwdW1hc2sgUG9pbnRlciB0byBiaXRtYXAgb2YgVkNQVXMgdG8gYmUgZmx1
c2hlZC4KKyAqLwogI2RlZmluZSBNTVVFWFRfVExCX0ZMVVNIX01VTFRJICAgOAorLyoqIFxpbmdy
b3VwIEhZUEVSVklTT1JfbW11ZXh0X29wCisgKiBGbHVzaCBhIHNwZWNpZmljIHBhZ2UgZnJvbSBz
dWJzZXQgb2YgVkNQVXMnIFRMQnMgYnkgbGluZWFyIGFkZHJlc3MuCisgKiBcYXJnIFxjIGxpbmVh
cl9hZGRyIExpbmVhciBhZGRyZXNzIHRvIGJlIGZsdXNoZWQuCisgKiBcYXJnIFxjIHZjcHVtYXNr
IFBvaW50ZXIgdG8gYml0bWFwIG9mIFZDUFVzIHRvIGJlIGZsdXNoZWQuCisgKi8KICNkZWZpbmUg
TU1VRVhUX0lOVkxQR19NVUxUSSAgICAgIDkKKy8qKiBcaW5ncm91cCBIWVBFUlZJU09SX21tdWV4
dF9vcAorICogRmx1c2ggYWxsIENQVXMnIFRMQnMuCisgKiBObyBhZGRpdGlvbmFsIGFyZ3VtZW50
cy4KKyAqLwogI2RlZmluZSBNTVVFWFRfVExCX0ZMVVNIX0FMTCAgICAxMAorLyoqIFxpbmdyb3Vw
IEhZUEVSVklTT1JfbW11ZXh0X29wCisgKiBGbHVzaCBhIHNwZWNpZmljIHBhZ2UgZm9ybSBhbGwg
VkNQVXMnIFRMQnMgYnkgbGluZWFyIGFkZHJlc3MuCisgKiBcYXJnIFxjIGxpbmVhcl9hZGRyIExp
bmVhciBhZGRyZXNzIHRvIGJlIGZsdXNoZWQgZnJvbSBhbGwgVkNQVXMnIFRMQnMuCisgKi8KICNk
ZWZpbmUgTU1VRVhUX0lOVkxQR19BTEwgICAgICAgMTEKKy8qKiBcaW5ncm91cCBIWVBFUlZJU09S
X21tdWV4dF9vcAorICogV3JpdGVzIGJhY2sgYW5kIGZsdXNoZXMgY2FjaGUgY29udGVudHMuCisg
KiBObyBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KKyAqCisgKi8KICNkZWZpbmUgTU1VRVhUX0ZMVVNI
X0NBQ0hFICAgICAgMTIKKy8qKiBcaW5ncm91cCBIWVBFUlZJU09SX21tdWV4dF9vcAorICogU2V0
IHRoZSBMRFQgW3g4NiBvbmx5XS4KKyAqIFxhcmcgXGMgbGluZWFyX2FkZHIgTGluZWFyIGFkZHJl
c3Mgb2YgTERUIGJhc2UgKE5CLiBtdXN0IGJlIHBhZ2UtYWxpZ25lZCkuCisgKiBcYXJnIFxjIG5y
X2VudHMgTnVtYmVyIG9mIGVudHJpZXMgaW4gTERULgorICovCiAjZGVmaW5lIE1NVUVYVF9TRVRf
TERUICAgICAgICAgIDEzCisvKiogXGluZ3JvdXAgSFlQRVJWSVNPUl9tbXVleHRfb3AKKyAqIElu
c3RhbGwgYSBuZXcgdXNlciBwYWdlLXRhYmxlIGJhc2UgW3g4Ni82NCBvbmx5XS4KKyAqIFxhcmcg
XGMgbWZuOiBNYWNoaW5lIGZyYW1lIG51bWJlciBvZiBuZXcgcGFnZS10YWJsZSBiYXNlIHRvIGlu
c3RhbGwgaW4gTU1VCisgKiAgICAgIHdoZW4gaW4gdXNlciBzcGFjZS4KKyAqLwogI2RlZmluZSBN
TVVFWFRfTkVXX1VTRVJfQkFTRVBUUiAxNQorLyoqIFxpbmdyb3VwIEhZUEVSVklTT1JfbW11ZXh0
X29wCisgKiBDbGVhciBhIHBhZ2Ugb2YgbWVtb3J5LgorICogXGFyZyBcYyBtZm4gTWFjaGluZSBm
cmFtZSBudW1iZXIgdG8gYmUgY2xlYXJlZC4KKyAqLwogI2RlZmluZSBNTVVFWFRfQ0xFQVJfUEFH
RSAgICAgICAxNgorLyoqIFxpbmdyb3VwIEhZUEVSVklTT1JfbW11ZXh0X29wCisgKiBDb3B5IGEg
cGFnZS4KKyAqIFxhcmcgXGMgbWZuIE1hY2hpbmUgZnJhbWUgbnVtYmVyIG9mIHRoZSBkZXN0aW5h
dGlvbiBwYWdlLgorICogXGFyZyBcYyBzcmNfbWZuIE1hY2hpbmUgZnJhbWUgbnVtYmVyIG9mIHRo
ZSBzb3VyY2UgcGFnZS4KKyAqLwogI2RlZmluZSBNTVVFWFRfQ09QWV9QQUdFICAgICAgICAxNwor
LyoqIFxpbmdyb3VwIEhZUEVSVklTT1JfbW11ZXh0X29wCisgKiBXcml0ZXMgYmFjayBhbmQgZmx1
c2hlcyBjYWNoZSBjb250ZW50cyBvbiBhbGwgQ1BVcyBpbiB0aGUgc3lzdGVtLgorICogTm8gYWRk
aXRpb25hbCBhcmd1bWVudHMuCisgKi8KICNkZWZpbmUgTU1VRVhUX0ZMVVNIX0NBQ0hFX0dMT0JB
TCAxOAorLyoqIFxpbmdyb3VwIEhZUEVSVklTT1JfbW11ZXh0X29wCisgKiBNYXJrIGEgcGFnZSBh
cyBhIHN1cGVyLXBhZ2UuCisgKiBtZm46IE1hY2hpbmUgZnJhbWUgbnVtYmVyIG9mIGhlYWQgb2Yg
c3VwZXJwYWdlIHRvIGJlIG1hcmtlZC4KKyAqLwogI2RlZmluZSBNTVVFWFRfTUFSS19TVVBFUiAg
ICAgICAxOQorLyoqIFxpbmdyb3VwIEhZUEVSVklTT1JfbW11ZXh0X29wCisgKiBVbm1hcmsgYSBw
YWdlIGFzIGEgc3VwZXItcGFnZS4KKyAqIG1mbjogTWFjaGluZSBmcmFtZSBudW1iZXIgb2YgaGVh
ZCBvZiBzdXBlcnBhZ2UgdG8gYmUgdW5tYXJrZWQuCisgKi8KICNkZWZpbmUgTU1VRVhUX1VOTUFS
S19TVVBFUiAgICAgMjAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qKiBcaW5ncm91cCBIWVBF
UlZJU09SX21tdWV4dF9vcAorICoKKyAqIHN0cnVjdCBtbXVleHRfb3AgaXMgcGFzc2VkIGFzIHRo
ZSBcYyB1b3AgYXJndW1lbnQgdG8gSFlQRVJWSVNPUl9tbXVleHRfb3AoKQorICovCiBzdHJ1Y3Qg
bW11ZXh0X29wIHsKKyAgICAvKioKKyAgICAgKiBTdWJjb21tYW5kLCBvbmUgb2YgTU1VRVhUXyou
IFRoZSBzcGVjaWZpYyBjb21tYW5kIGRlZmluZXMKKyAgICAgKiB3aGljaCBvZiB0aGUgdW5pb24g
bWVtYmVycyAoaWYgYW55KSBhcmUgdXNlZC4KKyAgICAgKi8KICAgICB1bnNpZ25lZCBpbnQgY21k
OwogICAgIHVuaW9uIHsKLSAgICAgICAgLyogW1VOXVBJTl9UQUJMRSwgTkVXX0JBU0VQVFIsIE5F
V19VU0VSX0JBU0VQVFIKLSAgICAgICAgICogQ0xFQVJfUEFHRSwgQ09QWV9QQUdFLCBbVU5dTUFS
S19TVVBFUiAqLworICAgICAgICAvKioKKyAgICAgICAgICogQSBtYWNoaW5lIGZyYW1lIG51bWJl
ciB0byBhY3QgdXBvbi4gVXNlcnMgaW5jbHVkZSBbVU5dUElOX1RBQkxFLAorICAgICAgICAgKiBO
RVdfQkFTRVBUUiwgTkVXX1VTRVJfQkFTRVBUUiwgQ0xFQVJfUEFHRSwgQ09QWV9QQUdFLCBbVU5d
TUFSS19TVVBFUi4KKyAgICAgICAgICovCiAgICAgICAgIHhlbl9wZm5fdCAgICAgbWZuOwotICAg
ICAgICAvKiBJTlZMUEdfTE9DQUwsIElOVkxQR19BTEwsIFNFVF9MRFQgKi8KKyAgICAgICAgLyoq
CisgICAgICAgICAqIEEgbGluZWFyIGFkZHJlc3MgdG8gYWN0IHVwb24uIFVzZXJzIGluY2x1ZGUg
SU5WTFBHX0xPQ0FMLCBJTlZMUEdfQUxMLAorICAgICAgICAgKiBTRVRfTERULgorICAgICAgICAg
Ki8KICAgICAgICAgdW5zaWduZWQgbG9uZyBsaW5lYXJfYWRkcjsKLSAgICB9IGFyZzE7CisgICAg
fSBBTk9OKGFyZzEpOwogICAgIHVuaW9uIHsKLSAgICAgICAgLyogU0VUX0xEVCAqLworICAgICAg
ICAvKiogVGhlIG51bWJlciBvZiBMRFQgZW50cmllcyBwYXNzZWQgdG8gU0VUX0xEVCBpbiBsaW5l
YXJfYWRkci4gKi8KICAgICAgICAgdW5zaWduZWQgaW50IG5yX2VudHM7Ci0gICAgICAgIC8qIFRM
Ql9GTFVTSF9NVUxUSSwgSU5WTFBHX01VTFRJICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBB
IG1hc2sgb2YgVkNQVXMgdG8gb3BlcmF0ZSBvbi4gVXNlcnMgaW5jbHVkZSBUTEJfRkxVU0hfTVVM
VEkgYW5kCisgICAgICAgICAqIElOVkxQR19NVUxUSS4KKyAgICAgICAgICovCiAjaWYgX19YRU5f
SU5URVJGQUNFX1ZFUlNJT05fXyA+PSAweDAwMDMwMjA1CiAgICAgICAgIFhFTl9HVUVTVF9IQU5E
TEUoY29uc3Rfdm9pZCkgdmNwdW1hc2s7CiAjZWxzZQogICAgICAgICBjb25zdCB2b2lkICp2Y3B1
bWFzazsKICNlbmRpZgotICAgICAgICAvKiBDT1BZX1BBR0UgKi8KKyAgICAgICAgLyoqIFRoZSBz
b3VyY2UgbWFjaGluZS1mcmFtZSB0byBDT1BZX1BBR0UuICovCiAgICAgICAgIHhlbl9wZm5fdCBz
cmNfbWZuOwotICAgIH0gYXJnMjsKKyAgICB9IEFOT04oYXJnMik7CiB9OwogdHlwZWRlZiBzdHJ1
Y3QgbW11ZXh0X29wIG1tdWV4dF9vcF90OwogREVGSU5FX1hFTl9HVUVTVF9IQU5ETEUobW11ZXh0
X29wX3QpOwo=


--===============2135385727==
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

--===============2135385727==--

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:13:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:13:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3Hy-0005qG-VE; Wed, 26 Oct 2011 06:13:03 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ384-0004Qm-Ch
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:02:55 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1319634163!23067874!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8224 invoked from network); 26 Oct 2011 13:02:45 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 13:02:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315195200"; d="scan'208";a="168266006"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 09:02:44 -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; Wed, 26 Oct 2011 09:02:44 -0400
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
	p9QD2fLK018892;	Wed, 26 Oct 2011 06:02:43 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ab89948ae057ec2d2dd56c52158924d142a4af5c
Message-ID: <ab89948ae057ec2d2dd5.1319634161@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319634159@cosworth.uk.xensource.com>
References: <patchbomb.1319634159@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 14:02:41 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 2 of 8 DOCDAY] docs: python: add quotes to
	PROJECT_NAME
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319619365 -3600
# Node ID ab89948ae057ec2d2dd56c52158924d142a4af5c
# Parent  af5aa55041b9e759b179986a856093452ca9b045
docs: python: add quotes to PROJECT_NAME

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff --git a/docs/python.Doxyfile b/docs/python.Doxyfile
--- a/docs/python.Doxyfile
+++ b/docs/python.Doxyfile
@@ -17,7 +17,7 @@
 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
 # by quotes) that should identify the project.
 
-PROJECT_NAME           = Xen Python Tools
+PROJECT_NAME           = "Xen Python Tools"
 
 # The PROJECT_NUMBER tag can be used to enter a project or revision number. 
 # This could be handy for archiving the generated documentation or 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:15:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:15:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3Jx-0006Gi-Ny; Wed, 26 Oct 2011 06:15:05 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ384-0004Qs-M6
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:02:57 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1319634164!1735292!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15160 invoked from network); 26 Oct 2011 13:02:45 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 13:02:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315195200"; d="scan'208";a="18552777"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 09:02: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; Wed, 26 Oct 2011 09:02:43 -0400
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
	p9QD2fLJ018892;	Wed, 26 Oct 2011 06:02:42 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: af5aa55041b9e759b179986a856093452ca9b045
Message-ID: <af5aa55041b9e759b179.1319634160@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319634159@cosworth.uk.xensource.com>
References: <patchbomb.1319634159@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 14:02:40 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 1 of 8 DOCDAY] docs: rename python Doxygen files
 to allow for other Doxygen uses
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319619285 -3600
# Node ID af5aa55041b9e759b179986a856093452ca9b045
# Parent  c681dd5aecf3da3c6fd0e4d8a760a9cd18617033
docs: rename python Doxygen files to allow for other Doxygen uses

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff --git a/docs/Makefile b/docs/Makefile
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -46,7 +46,7 @@ python-dev-docs:
 	@mkdir -v -p api/tools/python
 	@set -e ; if which $(DOXYGEN) 1>/dev/null 2>/dev/null; then \
         echo "Running doxygen to generate Python tools APIs ... "; \
-	$(DOXYGEN) Doxyfile;                                       \
+	$(DOXYGEN) python.Doxyfile;                                \
 	$(MAKE) -C api/tools/python/latex ; else                   \
         echo "Doxygen not installed; skipping python-dev-docs."; fi
 
diff --git a/docs/Doxyfile b/docs/python.Doxyfile
rename from docs/Doxyfile
rename to docs/python.Doxyfile
--- a/docs/Doxyfile
+++ b/docs/python.Doxyfile
@@ -519,7 +519,7 @@ IMAGE_PATH             =
 # to standard output.  If FILTER_PATTERNS is specified, this tag will be 
 # ignored.
 
-INPUT_FILTER           = "sh ./Doxyfilter ../tools/python"
+INPUT_FILTER           = "sh ./python.Doxyfilter ../tools/python"
 
 # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
 # basis.  Doxygen will compare the file name with each pattern and apply the 
diff --git a/docs/Doxyfilter b/docs/python.Doxyfilter
rename from docs/Doxyfilter
rename to docs/python.Doxyfilter

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:16:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:16:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3Ld-0006dx-KV; Wed, 26 Oct 2011 06:16:49 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ385-0004Qu-6x
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:02:58 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1319634164!1735292!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15252 invoked from network); 26 Oct 2011 13:02:45 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 13:02:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315195200"; d="scan'208";a="18552778"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 09:02:45 -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; Wed, 26 Oct 2011 09:02:45 -0400
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
	p9QD2fLL018892;	Wed, 26 Oct 2011 06:02:44 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: b3b97bccd08184aebd6f702d4621cdd2d9931a13
Message-ID: <b3b97bccd08184aebd6f.1319634162@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319634159@cosworth.uk.xensource.com>
References: <patchbomb.1319634159@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 14:02:42 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 3 of 8 DOCDAY] docs: python: strip build
 directory prefix from python 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

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1319620142 -3600
# Node ID b3b97bccd08184aebd6f702d4621cdd2d9931a13
# Parent  ab89948ae057ec2d2dd56c52158924d142a4af5c
docs: python: strip build directory prefix from python modules

Stuff like /local/scratch/ianc/xen-unstable.hg/tools/python/xen/lowlevel was
ending up in the output, this makes it appear as just "xen/lowlevel/..."

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff --git a/docs/python.Doxyfile b/docs/python.Doxyfile
--- a/docs/python.Doxyfile
+++ b/docs/python.Doxyfile
@@ -115,7 +115,7 @@ FULL_PATH_NAMES        = YES
 # If left blank the directory from which doxygen is run is used as the 
 # path to strip.
 
-STRIP_FROM_PATH        = 
+STRIP_FROM_PATH        = ../tools/python/
 
 # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
 # the path mentioned in the documentation of a class, which tells 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:18:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:18:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3NE-00071v-RJ; Wed, 26 Oct 2011 06:18:28 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ383-0004Qj-Ro
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:02:59 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1319634163!23067874!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8158 invoked from network); 26 Oct 2011 13:02:44 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 13:02:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315195200"; d="scan'208";a="168266000"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 09:02:42 -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; Wed, 26 Oct 2011 09:02:43 -0400
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
	p9QD2fLI018892;	Wed, 26 Oct 2011 06:02:41 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1319634159@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 14:02:39 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 0 of 8 DOCDAY] setup Doxygen for use with
 hypercall interface 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

The following series sets up a Doxygen run over xen/include/public and
makes a start at documenting some hypercalls.

I only did mmuext_op so far since I wanted to validate the approach
with the list before persisting any further. I'm not that convinced by
the effect on the readability of the headers but hopefully this is
offset by the ability to generate nice HTML docs?

I hope that this can eventually replace the extremely out of date
(although it's actualy not aged that badly in parts, I've stolen a
paragraph or two already) interfaces.tex with something which people
might actually keep up to date.

One quirk is that hypercalls are generally defined by #defines and
structs and not by actual function calls which does not play well to
Doxygen's strengths. I decided to do the following:
#ifdef __DOXYGEN__
int HYPERVISOR_mmuext_op(
    XEN_GUEST_HANDLE(mmuext_op_t) uops,
    unsigned int count,
    XEN_GUEST_HANDLE(uint) pdone,
    unsigned int foreigndom);
#endif

Combined with creating a Doxygen group for each hypercall (in order to
pull all the #defines etc in to one page) it comes out looking OK:
http://xenbits.xen.org/people/ianc/docs/group__HYPERVISOR__mmuext__op.html

Any thoughts or shall I move onto the next hypercall?


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:20:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:20:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3Oq-0007RN-3q; Wed, 26 Oct 2011 06:20:08 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ38W-0004TV-OO
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:03:21 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1319634191!828178!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27575 invoked from network); 26 Oct 2011 13:03:13 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-10.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 13:03:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315195200"; d="scan'208";a="168266018"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 09:02:48 -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; Wed, 26 Oct 2011 09:02:48 -0400
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
	p9QD2fLO018892;	Wed, 26 Oct 2011 06:02:47 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ae4ea5cb066383e9bfe30ab49fd498eed0d5ca7e
Message-ID: <ae4ea5cb066383e9bfe3.1319634165@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319634159@cosworth.uk.xensource.com>
References: <patchbomb.1319634159@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 14:02:45 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 6 of 8 DOCDAY] docs: hypercall: tailor doxygen
 configuration and hook into 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

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1319622360 -3600
# Node ID ae4ea5cb066383e9bfe30ab49fd498eed0d5ca7e
# Parent  8cc8f46e595163eca39b08cc3f532e372ccda9c5
docs: hypercall: tailor doxygen configuration and hook into build

I have set "WARN_IF_UNDOCUMENTED = NO" for now...

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff --git a/docs/Makefile b/docs/Makefile
--- a/docs/Makefile
+++ b/docs/Makefile
@@ -28,7 +28,7 @@ build: ps pdf html man-pages
 	rm -f *.aux *.dvi *.bbl *.blg *.glo *.idx *.ilg *.log *.ind *.toc
 
 .PHONY: dev-docs
-dev-docs: python-dev-docs
+dev-docs: hypercall-dev-docs python-dev-docs
 
 .PHONY: ps
 ps: $(DOC_PS)
@@ -50,6 +50,15 @@ python-dev-docs:
 	$(MAKE) -C api/tools/python/latex ; else                   \
         echo "Doxygen not installed; skipping python-dev-docs."; fi
 
+.PHONY: hypercall-dev-docs
+hypercall-dev-docs:
+	@mkdir -v -p api/hypercall
+	@set -e ; if which $(DOXYGEN) 1>/dev/null 2>/dev/null; then \
+        echo "Running doxygen to generate hypercall APIs ... ";    \
+	$(DOXYGEN) hypercall.Doxyfile;                             \
+	$(MAKE) -C api/hypercall/latex ; else                      \
+        echo "Doxygen not installed; skipping hypercall-dev-docs."; fi
+
 .PHONY: man-pages
 man-pages:
 	@if which $(POD2MAN) 1>/dev/null 2>/dev/null; then \
diff --git a/docs/hypercall.Doxyfile b/docs/hypercall.Doxyfile
--- a/docs/hypercall.Doxyfile
+++ b/docs/hypercall.Doxyfile
@@ -25,7 +25,7 @@ DOXYFILE_ENCODING      = UTF-8
 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded
 # by quotes) that should identify the project.
 
-PROJECT_NAME           =
+PROJECT_NAME           = "Xen Hypercall API"
 
 # The PROJECT_NUMBER tag can be used to enter a project or revision number.
 # This could be handy for archiving the generated documentation or
@@ -38,7 +38,7 @@ PROJECT_NUMBER         =
 # If a relative path is entered, it will be relative to the location
 # where doxygen was started. If left blank the current directory will be used.
 
-OUTPUT_DIRECTORY       =
+OUTPUT_DIRECTORY       = api/hypercall
 
 # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
 # 4096 sub-directories (in 2 levels) under the output directory of each output
@@ -114,7 +114,7 @@ FULL_PATH_NAMES        = YES
 # If left blank the directory from which doxygen is run is used as the
 # path to strip.
 
-STRIP_FROM_PATH        =
+STRIP_FROM_PATH        = ../xen/include/public
 
 # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
 # the path mentioned in the documentation of a class, which tells
@@ -137,7 +137,7 @@ SHORT_NAMES            = NO
 # comments will behave just like regular Qt-style comments
 # (thus requiring an explicit @brief command for a brief description.)
 
-JAVADOC_AUTOBRIEF      = NO
+JAVADOC_AUTOBRIEF      = YES
 
 # If the QT_AUTOBRIEF tag is set to YES then Doxygen will
 # interpret the first line (until the first dot) of a Qt-style
@@ -487,7 +487,7 @@ SHOW_USED_FILES        = YES
 # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
 # in the documentation. The default is NO.
 
-SHOW_DIRECTORIES       = NO
+SHOW_DIRECTORIES       = YES
 
 # Set the SHOW_FILES tag to NO to disable the generation of the Files page.
 # This will remove the Files entry from the Quick Index and from the
@@ -528,7 +528,7 @@ LAYOUT_FILE            =
 # The QUIET tag can be used to turn on/off the messages that are generated
 # by doxygen. Possible values are YES and NO. If left blank NO is used.
 
-QUIET                  = NO
+QUIET                  = YES
 
 # The WARNINGS tag can be used to turn on/off the warning messages that are
 # generated by doxygen. Possible values are YES and NO. If left blank
@@ -540,7 +540,7 @@ WARNINGS               = YES
 # for undocumented members. If EXTRACT_ALL is set to YES then this flag will
 # automatically be disabled.
 
-WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_UNDOCUMENTED   = NO
 
 # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
 # potential errors in the documentation, such as not documenting some
@@ -581,7 +581,7 @@ WARN_LOGFILE           =
 # directories like "/usr/src/myproject". Separate the files or directories
 # with spaces.
 
-INPUT                  =
+INPUT                  = ../xen/include/public
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@@ -598,13 +598,13 @@ INPUT_ENCODING         = UTF-8
 # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
 # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
 
-FILE_PATTERNS          =
+FILE_PATTERNS          = *.h
 
 # The RECURSIVE tag can be used to turn specify whether or not subdirectories
 # should be searched for input files as well. Possible values are YES and NO.
 # If left blank NO is used.
 
-RECURSIVE              = NO
+RECURSIVE              = YES
 
 # The EXCLUDE tag can be used to specify files and/or directories that should
 # excluded from the INPUT source files. This way you can easily exclude a

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:22:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:22:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3R2-0007q7-AE; Wed, 26 Oct 2011 06:22:25 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ389-0004RQ-KS
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:03:31 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1319634163!23067874!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8414 invoked from network); 26 Oct 2011 13:02:47 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-8.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 13:02:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315195200"; d="scan'208";a="168266015"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 09:02:46 -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; Wed, 26 Oct 2011 09:02:46 -0400
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
	p9QD2fLM018892;	Wed, 26 Oct 2011 06:02:45 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 3f0260f584ce826246b3b18e86dac47ccaf0232b
Message-ID: <3f0260f584ce826246b3.1319634163@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319634159@cosworth.uk.xensource.com>
References: <patchbomb.1319634159@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 14:02:43 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 4 of 8 DOCDAY] docs: python: run "doxygen -u
 docs/python.Doxyfile"
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319620268 -3600
# Node ID 3f0260f584ce826246b3b18e86dac47ccaf0232b
# Parent  b3b97bccd08184aebd6f702d4621cdd2d9931a13
docs: python: run "doxygen -u docs/python.Doxyfile"

As recommended:

warning: Tag `USE_WINDOWS_ENCODING' at line 64 of file python.Doxyfile has become obsolete.
To avoid this warning please update your configuration file using "doxygen -u"
warning: Tag `DETAILS_AT_TOP' at line 156 of file python.Doxyfile has become obsolete.
To avoid this warning please update your configuration file using "doxygen -u"
warning: Tag `MAX_DOT_GRAPH_WIDTH' at line 1162 of file python.Doxyfile has become obsolete.
To avoid this warning please update your configuration file using "doxygen -u"
warning: Tag `MAX_DOT_GRAPH_HEIGHT' at line 1170 of file python.Doxyfile has become obsolete.
To avoid this warning please update your configuration file using "doxygen -u"

The output still appears sane...

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff --git a/docs/python.Doxyfile b/docs/python.Doxyfile
--- a/docs/python.Doxyfile
+++ b/docs/python.Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.4.2
+# Doxyfile 1.7.1
 
 # This file describes the settings to be used by the documentation system
 # doxygen (www.doxygen.org) for a project
@@ -14,524 +14,677 @@
 # Project related configuration options
 #---------------------------------------------------------------------------
 
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
 # by quotes) that should identify the project.
 
 PROJECT_NAME           = "Xen Python Tools"
 
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
 # if some version control system is used.
 
-PROJECT_NUMBER         = 
+PROJECT_NUMBER         =
 
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
 # where doxygen was started. If left blank the current directory will be used.
 
 OUTPUT_DIRECTORY       = api/tools/python
 
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
 # otherwise cause performance problems for the file system.
 
 CREATE_SUBDIRS         = NO
 
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
-# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
-# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
-# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
-# Swedish, and Ukrainian.
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
 
 OUTPUT_LANGUAGE        = English
 
-# This tag can be used to specify the encoding used in the generated output. 
-# The encoding is not always determined by the language that is chosen, 
-# but also whether or not the output is meant for Windows or non-Windows users. 
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
-# forces the Windows encoding (this is the default for the Windows binary), 
-# whereas setting the tag to NO uses a Unix-style encoding (the default for 
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING   = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
 # Set to NO to disable this.
 
 BRIEF_MEMBER_DESC      = YES
 
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
 # brief descriptions will be completely suppressed.
 
 REPEAT_BRIEF           = YES
 
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
 # "represents" "a" "an" "the"
 
-ABBREVIATE_BRIEF       = 
+ABBREVIATE_BRIEF       =
 
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
 # description.
 
 ALWAYS_DETAILED_SEC    = NO
 
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
 # operators of the base classes will not be shown.
 
 INLINE_INHERITED_MEMB  = NO
 
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
 # to NO the shortest path that makes the file name unique will be used.
 
 FULL_PATH_NAMES        = YES
 
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
 # path to strip.
 
 STRIP_FROM_PATH        = ../tools/python/
 
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
 # are normally passed to the compiler using the -I flag.
 
-STRIP_FROM_INC_PATH    = 
+STRIP_FROM_INC_PATH    =
 
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful is your file systems 
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
 # doesn't support long names like on DOS, Mac, or CD-ROM.
 
 SHORT_NAMES            = NO
 
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like the Qt-style comments (thus requiring an 
-# explicit @brief command for a brief description.
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
 
 JAVADOC_AUTOBRIEF      = YES
 
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
 # description. Set this tag to YES if you prefer the old behaviour instead.
 
 MULTILINE_CPP_IS_BRIEF = NO
 
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member 
-# documentation.
-
-DETAILS_AT_TOP         = YES
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
 # re-implements.
 
 INHERIT_DOCS           = YES
 
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = YES
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this
+# tag. The format is ext=language, where ext is a file extension, and language
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen to replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
 # all members of a group must be documented explicitly.
 
 DISTRIBUTE_GROUP_DOC   = NO
 
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
-
-SEPARATE_MEMBER_PAGES  = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE               = 8
-
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES                = 
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C  = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources 
-# only. Doxygen will then generate output that is more tailored for Java. 
-# For instance, namespaces will be presented as packages, qualified scopes 
-# will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA   = YES
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
 # the \nosubgrouping command.
 
 SUBGROUPING            = YES
 
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penality.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will rougly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
 #---------------------------------------------------------------------------
 # Build related configuration options
 #---------------------------------------------------------------------------
 
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
 # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
 
 EXTRACT_ALL            = YES
 
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
 # will be included in the documentation.
 
 EXTRACT_PRIVATE        = YES
 
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
 # will be included in the documentation.
 
 EXTRACT_STATIC         = YES
 
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
 # If set to NO only classes defined in header files are included.
 
 EXTRACT_LOCAL_CLASSES  = YES
 
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
 # If set to NO (the default) only methods in the interface are included.
 
 EXTRACT_LOCAL_METHODS  = NO
 
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
 # This option has no effect if EXTRACT_ALL is enabled.
 
 HIDE_UNDOC_MEMBERS     = NO
 
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
 # overviews. This option has no effect if EXTRACT_ALL is enabled.
 
 HIDE_UNDOC_CLASSES     = NO
 
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
 # documentation.
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
 # function's detailed documentation block.
 
 HIDE_IN_BODY_DOCS      = NO
 
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
 # Set it to YES to include the internal documentation.
 
 INTERNAL_DOCS          = NO
 
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
 # and Mac users are advised to set this option to NO.
 
 CASE_SENSE_NAMES       = YES
 
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
 # documentation. If set to YES the scope will be hidden.
 
 HIDE_SCOPE_NAMES       = NO
 
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
 # of that file.
 
 SHOW_INCLUDE_FILES     = YES
 
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
 # is inserted in the documentation for inline members.
 
 INLINE_INFO            = YES
 
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
 # declaration order.
 
 SORT_MEMBER_DOCS       = YES
 
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
 # declaration order.
 
 SORT_BRIEF_DOCS        = NO
 
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
 # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the 
+# Note: This option applies only to the class list, not to the
 # alphabetical list.
 
 SORT_BY_SCOPE_NAME     = NO
 
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
 # commands in the documentation.
 
 GENERATE_TODOLIST      = YES
 
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
 # commands in the documentation.
 
 GENERATE_TESTLIST      = YES
 
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
 # commands in the documentation.
 
 GENERATE_BUGLIST       = YES
 
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
 # \deprecated commands in the documentation.
 
 GENERATE_DEPRECATEDLIST= YES
 
-# The ENABLED_SECTIONS tag can be used to enable conditional 
+# The ENABLED_SECTIONS tag can be used to enable conditional
 # documentation sections, marked by \if sectionname ... \endif.
 
-ENABLED_SECTIONS       = 
+ENABLED_SECTIONS       =
 
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or define consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and defines in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
 # command in the documentation regardless of this setting.
 
 MAX_INITIALIZER_LINES  = 30
 
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
 # list will mention the files that were used to generate the documentation.
 
 SHOW_USED_FILES        = YES
 
-# If the sources in your project are distributed over multiple directories 
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-# in the documentation.
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
 
 SHOW_DIRECTORIES       = YES
 
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from the 
-# version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command <command> <input-file>, where <command> is the value of 
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the progam writes to standard output 
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
 # is used as the file version. See the manual for examples.
 
-FILE_VERSION_FILTER    = 
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. The create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            =
 
 #---------------------------------------------------------------------------
 # configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
 
-# The QUIET tag can be used to turn on/off the messages that are generated 
+# The QUIET tag can be used to turn on/off the messages that are generated
 # by doxygen. Possible values are YES and NO. If left blank NO is used.
 
 QUIET                  = YES
 
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
 # NO is used.
 
 WARNINGS               = YES
 
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
 # automatically be disabled.
 
 WARN_IF_UNDOCUMENTED   = YES
 
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
 # don't exist or using markup commands wrongly.
 
 WARN_IF_DOC_ERROR      = YES
 
-# This WARN_NO_PARAMDOC option can be abled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
 # documentation.
 
 WARN_NO_PARAMDOC       = NO
 
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
 # be obtained via FILE_VERSION_FILTER)
 
 WARN_FORMAT            = "$file:$line: $text"
 
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
 # to stderr.
 
-WARN_LOGFILE           = 
+WARN_LOGFILE           =
 
 #---------------------------------------------------------------------------
 # configuration options related to the input files
 #---------------------------------------------------------------------------
 
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
 # with spaces.
 
 INPUT                  = ../tools/python/xen/
 
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
-# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
 
-FILE_PATTERNS          = *.py *.c
+INPUT_ENCODING         = UTF-8
 
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          = *.py \
+                         *.c
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
 # If left blank NO is used.
 
 RECURSIVE              = YES
 
-# The EXCLUDE tag can be used to specify files and/or directories that should 
-# excluded from the INPUT source files. This way you can easily exclude a 
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
 # subdirectory from a directory tree whose root is specified with the INPUT tag.
 
-EXCLUDE                = 
+EXCLUDE                =
 
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
-# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
 # from the input.
 
 EXCLUDE_SYMLINKS       = NO
 
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories.
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
 
-EXCLUDE_PATTERNS       = 
+EXCLUDE_PATTERNS       =
 
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
 # the \include command).
 
-EXAMPLE_PATH           = 
+EXAMPLE_PATH           =
 
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
 # blank all files are included.
 
-EXAMPLE_PATTERNS       = 
+EXAMPLE_PATTERNS       =
 
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
 # Possible values are YES and NO. If left blank NO is used.
 
 EXAMPLE_RECURSIVE      = NO
 
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
 # the \image command).
 
-IMAGE_PATH             = 
+IMAGE_PATH             =
 
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
 # ignored.
 
 INPUT_FILTER           = "sh ./python.Doxyfilter ../tools/python"
 
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
 # is applied to all files.
 
-FILTER_PATTERNS        = 
+FILTER_PATTERNS        =
 
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
 # files to browse (i.e. when SOURCE_BROWSER is set to YES).
 
 FILTER_SOURCE_FILES    = YES
@@ -540,38 +693,54 @@ FILTER_SOURCE_FILES    = YES
 # configuration options related to source browsing
 #---------------------------------------------------------------------------
 
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
 # VERBATIM_HEADERS is set to NO.
 
 SOURCE_BROWSER         = NO
 
-# Setting the INLINE_SOURCES tag to YES will include the body 
+# Setting the INLINE_SOURCES tag to YES will include the body
 # of functions and classes directly in the documentation.
 
 INLINE_SOURCES         = NO
 
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
 # fragments. Normal C and C++ comments will always remain visible.
 
 STRIP_CODE_COMMENTS    = YES
 
-# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
-# then for each documented function all documented 
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
 # functions referencing it will be listed.
 
 REFERENCED_BY_RELATION = YES
 
-# If the REFERENCES_RELATION tag is set to YES (the default) 
-# then for each documented function all documented entities 
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
 # called/used by that function will be listed.
 
 REFERENCES_RELATION    = YES
 
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
 # which an include is specified. Set to NO to disable this.
 
 VERBATIM_HEADERS       = YES
@@ -580,279 +749,488 @@ VERBATIM_HEADERS       = YES
 # configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
 
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
 # contains a lot of classes, structs, unions or interfaces.
 
 ALPHABETICAL_INDEX     = NO
 
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
 # in which this list will be split (can be a number in the range [1..20])
 
 COLS_IN_ALPHA_INDEX    = 5
 
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
 # should be ignored while generating the index headers.
 
-IGNORE_PREFIX          = 
+IGNORE_PREFIX          =
 
 #---------------------------------------------------------------------------
 # configuration options related to the HTML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
 # generate HTML output.
 
 GENERATE_HTML          = YES
 
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
 # put in front of it. If left blank `html' will be used as the default path.
 
 HTML_OUTPUT            = html
 
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
 # doxygen will generate files with .html extension.
 
 HTML_FILE_EXTENSION    = .html
 
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
 # standard header.
 
-HTML_HEADER            = 
+HTML_HEADER            =
 
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
 # standard footer.
 
-HTML_FOOTER            = 
+HTML_FOOTER            =
 
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
 # stylesheet in the HTML output directory as well, or it will be erased!
 
-HTML_STYLESHEET        = 
+HTML_STYLESHEET        =
 
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the stylesheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
 # NO a bullet list will be used.
 
 HTML_ALIGN_MEMBERS     = YES
 
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
 # of the generated HTML documentation.
 
 GENERATE_HTMLHELP      = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
 # written to the html output directory.
 
-CHM_FILE               = 
+CHM_FILE               =
 
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
 # the HTML help compiler on the generated index.hhp.
 
-HHC_LOCATION           = 
+HHC_LOCATION           =
 
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
 # it should be included in the master .chm file (NO).
 
 GENERATE_CHI           = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
 # normal table of contents (NO) in the .chm file.
 
 BINARY_TOC             = NO
 
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
 # to the contents of the HTML help documentation and to the tree view.
 
 TOC_EXPAND             = NO
 
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
-# top of each HTML page. The value NO (the default) enables the index and 
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+#  will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
 # the value YES disables it.
 
 DISABLE_INDEX          = NO
 
-# This tag can be used to set the number of enum values (range [1..20]) 
+# This tag can be used to set the number of enum values (range [1..20])
 # that doxygen will group on one line in the generated HTML documentation.
 
 ENUM_VALUES_PER_LINE   = 4
 
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
-# probably better off using the HTML help feature.
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
 
 GENERATE_TREEVIEW      = NO
 
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
 # is shown.
 
 TREEVIEW_WIDTH         = 250
 
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = NO
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvances is that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
 #---------------------------------------------------------------------------
 # configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
 # generate Latex output.
 
 GENERATE_LATEX         = YES
 
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
 # put in front of it. If left blank `latex' will be used as the default path.
 
 LATEX_OUTPUT           = latex
 
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
 # invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
 
 LATEX_CMD_NAME         = latex
 
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
 # default command name.
 
 MAKEINDEX_CMD_NAME     = makeindex
 
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
 # save some trees in general.
 
 COMPACT_LATEX          = NO
 
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
 # executive. If left blank a4wide will be used.
 
 PAPER_TYPE             = a4wide
 
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
 # packages that should be included in the LaTeX output.
 
-EXTRA_PACKAGES         = 
+EXTRA_PACKAGES         =
 
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
 # standard header. Notice: only use this tag if you know what you are doing!
 
-LATEX_HEADER           = 
+LATEX_HEADER           =
 
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
 # This makes the output suitable for online browsing using a pdf viewer.
 
 PDF_HYPERLINKS         = YES
 
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
 # higher quality PDF documentation.
 
 USE_PDFLATEX           = YES
 
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
 # This option is also used when generating formulas in HTML.
 
 LATEX_BATCHMODE        = NO
 
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
 # in the output.
 
 LATEX_HIDE_INDICES     = NO
 
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
 #---------------------------------------------------------------------------
 # configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
 # other RTF readers or editors.
 
 GENERATE_RTF           = NO
 
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
 # put in front of it. If left blank `rtf' will be used as the default path.
 
 RTF_OUTPUT             = rtf
 
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
 # save some trees in general.
 
 COMPACT_RTF            = NO
 
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
 # Note: wordpad (write) and others do not support links.
 
 RTF_HYPERLINKS         = NO
 
-# Load stylesheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
 # replacements, missing definitions are set to their default value.
 
-RTF_STYLESHEET_FILE    = 
+RTF_STYLESHEET_FILE    =
 
-# Set optional variables used in the generation of an rtf document. 
+# Set optional variables used in the generation of an rtf document.
 # Syntax is similar to doxygen's config file.
 
-RTF_EXTENSIONS_FILE    = 
+RTF_EXTENSIONS_FILE    =
 
 #---------------------------------------------------------------------------
 # configuration options related to the man page output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
 # generate man pages
 
 GENERATE_MAN           = NO
 
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
 # put in front of it. If left blank `man' will be used as the default path.
 
 MAN_OUTPUT             = man
 
-# The MAN_EXTENSION tag determines the extension that is added to 
+# The MAN_EXTENSION tag determines the extension that is added to
 # the generated man pages (default is the subroutine's section .3)
 
 MAN_EXTENSION          = .3
 
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
 # would be unable to find the correct page. The default is NO.
 
 MAN_LINKS              = NO
@@ -861,33 +1239,33 @@ MAN_LINKS              = NO
 # configuration options related to the XML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
 # the code including all documentation.
 
 GENERATE_XML           = NO
 
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
 # put in front of it. If left blank `xml' will be used as the default path.
 
 XML_OUTPUT             = xml
 
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
 # syntax of the XML files.
 
-XML_SCHEMA             = 
+XML_SCHEMA             =
 
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
 # syntax of the XML files.
 
-XML_DTD                = 
+XML_DTD                =
 
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
 # enabling this will significantly increase the size of the XML output.
 
 XML_PROGRAMLISTING     = YES
@@ -896,10 +1274,10 @@ XML_PROGRAMLISTING     = YES
 # configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
 # and incomplete at the moment.
 
 GENERATE_AUTOGEN_DEF   = NO
@@ -908,311 +1286,346 @@ GENERATE_AUTOGEN_DEF   = NO
 # configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
 # moment.
 
 GENERATE_PERLMOD       = NO
 
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
 # to generate PDF and DVI output from the Perl module output.
 
 PERLMOD_LATEX          = NO
 
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
 # and Perl will parse it just the same.
 
 PERLMOD_PRETTY         = YES
 
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
 # Makefile don't overwrite each other's variables.
 
-PERLMOD_MAKEVAR_PREFIX = 
+PERLMOD_MAKEVAR_PREFIX =
 
 #---------------------------------------------------------------------------
-# Configuration options related to the preprocessor   
+# Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
 # files.
 
 ENABLE_PREPROCESSING   = YES
 
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
 # way by setting EXPAND_ONLY_PREDEF to YES.
 
 MACRO_EXPANSION        = NO
 
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
 
 EXPAND_ONLY_PREDEF     = NO
 
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
 # in the INCLUDE_PATH (see below) will be search if a #include is found.
 
 SEARCH_INCLUDES        = YES
 
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
 # the preprocessor.
 
-INCLUDE_PATH           = 
+INCLUDE_PATH           =
 
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
 # be used.
 
-INCLUDE_FILE_PATTERNS  = 
+INCLUDE_FILE_PATTERNS  =
 
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
 # instead of the = operator.
 
-PREDEFINED             = 
+PREDEFINED             =
 
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
 # Use the PREDEFINED tag if you want to use a different macro definition.
 
-EXPAND_AS_DEFINED      = 
+EXPAND_AS_DEFINED      =
 
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all function-like macros that are alone 
-# on a line, have an all uppercase name, and do not end with a semicolon. Such 
-# function macros are typically used for boiler-plate code, and will confuse 
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
 # the parser if not removed.
 
 SKIP_FUNCTION_MACROS   = YES
 
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references   
+# Configuration::additions related to external references
 #---------------------------------------------------------------------------
 
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
 # does not have to be run to correct the links.
 # Note that each tag file must have a unique name
 # (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen 
+# If a tag file is not located in the directory in which doxygen
 # is run, you must also specify the path to the tagfile here.
 
-TAGFILES               = 
+TAGFILES               =
 
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
 # a tag file that is based on the input files it reads.
 
-GENERATE_TAGFILE       = 
+GENERATE_TAGFILE       =
 
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
 # will be listed.
 
 ALLEXTERNALS           = NO
 
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
 # be listed.
 
 EXTERNAL_GROUPS        = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script 
+# The PERL_PATH should be the absolute path and name of the perl script
 # interpreter (i.e. the result of `which perl').
 
 PERL_PATH              = /usr/bin/perl
 
 #---------------------------------------------------------------------------
-# Configuration options related to the dot tool   
+# Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option is superseded by the HAVE_DOT option below. This is only a 
-# fallback. It is recommended to install and use dot, since it yields more 
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
 # powerful graphs.
 
 CLASS_DIAGRAMS         = YES
 
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
 # or is not a class.
 
 HIDE_UNDOC_RELATIONS   = YES
 
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
 # have no effect if this option is set to NO (the default)
 
 HAVE_DOT               = NO
 
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will write a font called FreeSans.ttf to the output
+# directory and reference it in all dot files that doxygen generates. This
+# font does not include all possible unicode characters however, so when you need
+# these (or just want a differently looking font) you can specify the font name
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME           = FreeSans.ttf
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
 # the CLASS_DIAGRAMS tag to NO.
 
 CLASS_GRAPH            = YES
 
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
 # class references variables) of the class with other documented classes.
 
 COLLABORATION_GRAPH    = YES
 
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
 # will generate a graph for groups, showing the direct groups dependencies
 
 GROUP_GRAPHS           = YES
 
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
 # Language.
 
 UML_LOOK               = NO
 
-# If set to YES, the inheritance and collaboration graphs will show the 
+# If set to YES, the inheritance and collaboration graphs will show the
 # relations between templates and their instances.
 
 TEMPLATE_RELATIONS     = NO
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
 # other documented files.
 
 INCLUDE_GRAPH          = YES
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
 # indirectly include this file.
 
 INCLUDED_BY_GRAPH      = YES
 
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
-# generate a call dependency graph for every global function or class method. 
-# Note that enabling this option will significantly increase the time of a run. 
-# So in most cases it will be better to enable call graphs for selected 
-# functions only using the \callgraph command.
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
 
 CALL_GRAPH             = NO
 
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
 # will graphical hierarchy of all classes instead of a textual one.
 
 GRAPHICAL_HIERARCHY    = YES
 
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
 # in a graphical way. The dependency relations are determined by the #include
 # relations between the files in the directories.
 
 DIRECTORY_GRAPH        = YES
 
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
 # generated by dot. Possible values are png, jpg, or gif
 # If left blank png will be used.
 
 DOT_IMAGE_FORMAT       = png
 
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
 # found. If left blank, it is assumed the dot tool can be found in the path.
 
-DOT_PATH               = 
+DOT_PATH               =
 
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
 # \dotfile command).
 
-DOTFILE_DIRS           = 
+DOTFILE_DIRS           =
 
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
 
-MAX_DOT_GRAPH_WIDTH    = 1024
+DOT_GRAPH_MAX_NODES    = 50
 
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
-# this value, doxygen will try to truncate the graph, so that it fits within 
-# the specified constraint. Beware that most browsers cannot cope with very 
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT   = 1024
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes 
-# that lay further from the root node will be omitted. Note that setting this 
-# option to 1 or 2 may greatly reduce the computation time needed for large 
-# code bases. Also note that a graph may be further truncated if the graph's 
-# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
-# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
-# the graph is not depth-constrained.
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
 
 MAX_DOT_GRAPH_DEPTH    = 0
 
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, which results in a white background. 
-# Warning: Depending on the platform used, enabling this option may lead to 
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
-# read).
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
 
 DOT_TRANSPARENT        = NO
 
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
 # support this, this feature is disabled by default.
 
 DOT_MULTI_TARGETS      = NO
 
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
 # arrows in the dot generated graphs.
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
 # the various graphs.
 
 DOT_CLEANUP            = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine   
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be 
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE           = NO

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:25:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:25:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3UL-0008Hz-Ht; Wed, 26 Oct 2011 06:25:49 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ388-0004RK-Lo
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:03:31 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1319634164!1735292!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15428 invoked from network); 26 Oct 2011 13:02:48 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-15.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 13:02:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315195200"; d="scan'208";a="18552779"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 09:02:47 -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; Wed, 26 Oct 2011 09:02:47 -0400
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
	p9QD2fLN018892;	Wed, 26 Oct 2011 06:02:46 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 8cc8f46e595163eca39b08cc3f532e372ccda9c5
Message-ID: <8cc8f46e595163eca39b.1319634164@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319634159@cosworth.uk.xensource.com>
References: <patchbomb.1319634159@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 14:02:44 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH 5 of 8 DOCDAY] docs: hypercall: initial
 autogenerated version of hypercall.Doxyfile
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319620767 -3600
# Node ID 8cc8f46e595163eca39b08cc3f532e372ccda9c5
# Parent  3f0260f584ce826246b3b18e86dac47ccaf0232b
docs: hypercall: initial autogenerated version of hypercall.Doxyfile

This is the raw output of "doxygen -g docs/hypercall.Doxyfile". I am committing
it without hooking it up to the build so that the initial configuration changes
are recorded separately.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff --git a/docs/hypercall.Doxyfile b/docs/hypercall.Doxyfile
new file mode 100644
--- /dev/null
+++ b/docs/hypercall.Doxyfile
@@ -0,0 +1,1630 @@
+# Doxyfile 1.7.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME           =
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER         =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       =
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this
+# tag. The format is ext=language, where ext is a file extension, and language
+# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C,
+# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make
+# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C
+# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions
+# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen to replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penality.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will rougly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen
+# will list include files with double quotes in the documentation
+# rather than with sharp brackets.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen
+# will sort the (brief and detailed) documentation of class members so that
+# constructors and destructors are listed first. If set to NO (the default)
+# the constructors will appear in the respective orders defined by
+# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.
+# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO
+# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. The create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option.
+# You can optionally specify a file name after the option, if omitted
+# DoxygenLayout.xml will be used as the name of the layout file.
+
+LAYOUT_FILE            =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  =
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
+FILE_PATTERNS          =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.
+# Doxygen will adjust the colors in the stylesheet and background images
+# according to this color. Hue is specified as an angle on a colorwheel,
+# see http://en.wikipedia.org/wiki/Hue for more information.
+# For instance the value 0 represents red, 60 is yellow, 120 is green,
+# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.
+# The allowed range is 0 to 359.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of
+# the colors in the HTML output. For a value of 0 the output will use
+# grayscales only. A value of 255 will produce the most vivid colors.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to
+# the luminance component of the colors in the HTML output. Values below
+# 100 gradually make the output lighter, whereas values above 100 make
+# the output darker. The value divided by 100 is the actual gamma applied,
+# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,
+# and 100 does not change the gamma.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting
+# this to NO can help when comparing the output of multiple runs.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated
+# that can be used as input for Qt's qhelpgenerator to generate a
+# Qt Compressed Help (.qch) of the generated HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to
+# add. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">
+# Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">
+# Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files
+#  will be generated, which together with the HTML files, form an Eclipse help
+# plugin. To install this plugin and make it available under the help contents
+# menu in Eclipse, the contents of the directory containing the HTML and XML
+# files needs to be copied into the plugins directory of eclipse. The name of
+# the directory within the plugins directory should be the same as
+# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before
+# the help appears.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have
+# this name.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = NO
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open
+# links to external symbols imported via tag files in a separate window.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are
+# not supported properly for IE 6.0, but are supported on all modern browsers.
+# Note that when changing this option you need to delete any form_*.png files
+# in the HTML output before the changes have effect.
+
+FORMULA_TRANSPARENT    = YES
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box
+# for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using
+# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets
+# (GENERATE_DOCSET) there is already a search function so this one should
+# typically be disabled. For large projects the javascript based search engine
+# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a PHP enabled web server instead of at the web client
+# using Javascript. Doxygen will generate the search PHP script and index
+# file to put on the web server. The advantage of the server
+# based approach is that it scales better to large projects and allows
+# full text search. The disadvances is that it is more difficult to setup
+# and does not have live searching capabilities.
+
+SERVER_BASED_SEARCH    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+# Note that when enabling USE_PDFLATEX this option is only used for
+# generating bitmaps for formulas in the HTML output, but not in the
+# Makefile that is written to the output directory.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include
+# source code with syntax highlighting in the LaTeX output.
+# Note that which sources are shown also depends on other settings
+# such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH           =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is
+# allowed to run in parallel. When set to 0 (the default) doxygen will
+# base this on the number of processors available in the system. You can set it
+# explicitly to a value larger than 0 to get control over the balance
+# between CPU load and processing speed.
+
+DOT_NUM_THREADS        = 0
+
+# By default doxygen will write a font called FreeSans.ttf to the output
+# directory and reference it in all dot files that doxygen generates. This
+# font does not include all possible unicode characters however, so when you need
+# these (or just want a differently looking font) you can specify the font name
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME           = FreeSans.ttf
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = YES
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP            = YES

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:30:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:30:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3ZH-0000j9-2z; Wed, 26 Oct 2011 06:30:55 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ3MI-0006n0-55
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:17:30 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-14.tower-174.messagelabs.com!1319635047!36732619!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20762 invoked from network); 26 Oct 2011 13:17:27 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-14.tower-174.messagelabs.com with SMTP;
	26 Oct 2011 13:17:27 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id 61B32C56109;
	Wed, 26 Oct 2011 14:17:26 +0100 (BST)
Date: Wed, 26 Oct 2011 14:17:25 +0100
From: Alex Bligh <alex@alex.org.uk>
To: xen-devel@lists.xensource.com
Message-ID: <0050AA2F452257584F0AAA0B@nimrod.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: Alex Bligh <alex@alex.org.uk>
Subject: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
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

I am running Xen 4 and want users to be able to install arbitrary HVM
images. We want both PV and emulated drivers to appear. The reason
for this is for compatibility with images that were prepared for
Xen 3.3, which assume emulated devices exist at boot time (particularly
for running the boot loader).

If I do not specify on the boot line xen_emul_unplug=never, then
under some guest OS's (e.g. Ubuntu Natty (2.6.38)), the domU kernel
unplugs the non-PV devices, which is undesirable in my application.

I cannot arbitrarily change the kernel command line because it is
in effect set by the user's image.

Therefore what I need to do is prevent Xen4 offering the facility
to unplug the devices in the first place. Setting "(unpluggable 0)"
in the config for the emulated NICs and disks does not appear
to prevent them getting unplugged; what may be happening is that
domU tries to unplug them (but fails) but still doesn't use them.
Is there a way to signal from dom0 that the kernel really shouldn't
unplug this stuff.

-- 
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 Oct 26 06:32:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:32:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3bH-0001FT-AL; Wed, 26 Oct 2011 06:32:59 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ3Yg-0000au-CV
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:30:19 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1319635813!1138947!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30146 invoked from network); 26 Oct 2011 13:30:15 -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; 26 Oct 2011 13:30:15 -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
	p9QDUAGb004068
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 13:30:11 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
	p9QDU9dp011514
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 13:30:10 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
	p9QDU4ld024299; Wed, 26 Oct 2011 08:30:04 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 06:30:04 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 2A7B282C1D; Wed, 26 Oct 2011 09:30:03 -0400 (EDT)
Date: Wed, 26 Oct 2011 09:30:03 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefan Bader <stefan.bader@canonical.com>, len.brown@intel.com
Message-ID: <20111026133003.GA6654@phenom.dumpdata.com>
References: <4EA7DFD1.9060608@canonical.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA7DFD1.9060608@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.0A090205.4EA80B63.017A,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>,
	Len Brown <len.brown@intel.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 12:24:17PM +0200, Stefan Bader 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:   Fri Apr 1 19:34:59 2011 -0400
> 
>     cpuidle: stop depending on pm_idle
> 
> However cpuidle_call_idle() will return -ENODEV if it is supposed to be disabled
> 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:   Fri Apr 1 18:28:35 2011 -0400
> 
>     cpuidle: 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 selected.

Right, b/c that is what d91ee5863b71e8c90eaf6035bff3078a85e2e7b5 was suppose
to do - " xen 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 it seems that select_idle_routine() was not thought off.

> 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.
> 
> 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.
> One quick fix could be to add some Xen case into select_idle_routine() which
> picks default_idle...

What about using the cpuidle_disabled() functionality and adhere to that?
As so:

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; }
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:35:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:35:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3di-0001f6-NF; Wed, 26 Oct 2011 06:35:30 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ3d7-0001Sc-99
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:34:53 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1319636090!1739235!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2118 invoked from network); 26 Oct 2011 13:34:50 -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;
	26 Oct 2011 13:34:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315180800"; 
   d="scan'208";a="8596765"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 13:34: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; Wed, 26 Oct 2011 14:34:49 +0100
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 1RJ3d3-0005v5-Kh;
	Wed, 26 Oct 2011 13:34:49 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RJ3d3-0004OO-C1;
	Wed, 26 Oct 2011 14:34:49 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9637-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 26 Oct 2011 14:34:49 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9637: 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 9637 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9637/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     10 guest-saverestore  fail in 9625 REGR. vs. 9608

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf      7 debian-install               fail pass in 9625

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                  c681dd5aecf3
baseline version:
 xen                  662dbf6ee71c

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Dario Faggioli <dario.faggioli@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Michael Young <m.a.young@durham.ac.uk>
  Paolo Bonzini <pbonzini@redhat.com>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Yang Zhang <yang.z.zhang@intel.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


Not pushing.

------------------------------------------------------------
changeset:   24003:c681dd5aecf3
tag:         tip
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:22:09 2011 +0100
    
    pygrub: example grub2 configuration file (fedora-16-with-xen.grub2)
    
    Sample grub2 configuration file (some duplication removed) from Fedora 16
    with a xen hypervisor installed
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   24002:979bc34d0ad0
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:21:05 2011 +0100
    
    pyrgrub: cope with configurations with set default="${saved_entry}" line
    
    Fedora 16 grub2 configuration file can have lines like
        set default="${saved_entry}"
    and a string containing an integer is expected
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   24001:152049468175
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:20:06 2011 +0100
    
    pygrub: cope with configurations with submenus
    
    The grub2 configuration file in Fedora 16 can have one or more
    menuentrys in a submenu, with configuration of the form
        submenu "Xen 4.1" {
        menuentry ... {
        ...
        }
        }
    (this example occurs when the xen hypervisor is installed on the
    guest)
    
    Ignore the submenu line and the corresponding }
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24000:65679fee0177
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:19:19 2011 +0100
    
    pygrub: Allow GPT partition references
    
    The grub2 configuration file in Fedora 16 can have GPT partition
    references like (hd0,gpt2) so remove the "gpt" string where necessary
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   23999:138f707fa598
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:18:49 2011 +0100
    
    pygrub: look in /boot/grub2 (for eg Fedora 16)
    
    Fedora 16 puts grub configuration files in /boot/grub2/grub.cfg so
    pygrub should look there as well
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   23998:85d7b207fabc
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:15:54 2011 +0100
    
    pygrub: check all GPT partitions
    
    On Fedora 16 the first GPT partition is a boot partition for grub2 with
    the grub2 configuration in the second partition.
    Check all GPT partitions for grub configuration, not just the first.
    
    [ Also remove now-inaccurate comment. -iwj ]
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Tested-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23997:f273bce1fc26
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Oct 25 17:04:41 2011 +0100
    
    libxl: add missing "break;" to do_pci_remove
    
    Otherwise we erroneously fall through the LIBXL_DOMAIN_TYPE_PV case into the
    "default: abort()".
    
    (I'm sure we fixed this once already...)
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Tested-by: Dario Faggioli <dario.faggioli@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23996:51a0c81a4030
user:        Christoph Egger <Christoph.Egger@amd.com>
date:        Tue Oct 25 16:48:17 2011 +0100
    
    hvm: Clean up I/O emulation
    
    Move HVM io fields into a structure.
    On MMIO instruction failure print out some more bytes.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23995:8943a9696358
user:        Yang Zhang <yang.z.zhang@intel.com>
date:        Tue Oct 25 16:46:47 2011 +0100
    
    x86 pm: provide CC7/PC2 residency
    
    Sandy bridge introduces new MSR to get cc7/pc2 residency (core C-state
    7/package C-state 2). Print the cc7/pc2 residency when on sandy bridge
    platform.
    
    Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23994:662dbf6ee71c
user:        Jan Beulich <jbeulich@novell.com>
date:        Mon Oct 24 18:01:07 2011 +0100
    
    x86/hpet: fix cpumask allocation after 23990:1c8789852eaf
    
    hpet_fsb_cap_lookup(), if it doesn't find any FSB capable timer,
    leaves hpet_events allocated, while hpet_events->cpumask may not have
    been, As we're pretty generous with these one-time allocations already
    (in that hpet_events doesn't get freed when no usable counters were
    found, even if in that case only the first array entry [or none at
    all] may get used), simply make the cpumask allocation in the legacy
    case independent of whether hpet_events was NULL before.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Tested-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Christoph Egger <Christoph.Egger@amd.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
========================================
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 Oct 26 06:36:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:36:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3es-00022I-Th; Wed, 26 Oct 2011 06:36:42 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ3dm-0001fk-NA
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:35:35 -0700
X-Env-Sender: davidtecher@yahoo.fr
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319636131!36783649!1
X-Originating-IP: [77.238.189.68]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17179 invoked from network); 26 Oct 2011 13:35:31 -0000
Received: from nm15.bullet.mail.ird.yahoo.com (HELO
	nm15.bullet.mail.ird.yahoo.com) (77.238.189.68)
	by server-4.tower-174.messagelabs.com with SMTP;
	26 Oct 2011 13:35:31 -0000
Received: from [77.238.189.232] by nm15.bullet.mail.ird.yahoo.com with NNFMP;
	26 Oct 2011 13:35:31 -0000
Received: from [212.82.108.125] by tm13.bullet.mail.ird.yahoo.com with NNFMP;
	26 Oct 2011 13:35:30 -0000
Received: from [127.0.0.1] by omp1034.mail.ird.yahoo.com with NNFMP;
	26 Oct 2011 13:35:30 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: 976026.6680.bm@omp1034.mail.ird.yahoo.com
Received: (qmail 24126 invoked by uid 60001); 26 Oct 2011 13:35:30 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.fr; s=s1024;
	t=1319636130; bh=85gjc7kt6e3MEWCLA4nYvC2Z4U/uEuimB6EZmCXRTwE=;
	h=X-YMail-OSG:Received:X-Mailer:References:Message-ID:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type;
	b=fYjmdloddZGE7a4BMG3RmlYhrlQYXhcu8ACi0N8MqAJHnF2STtUlSIs+vmuhwJMc2qVNAtHGIaYccd8kJIeQN4xIOAXUuWMwaNQb+bUMEAOSumgO6cVhOFp8LmnrF8Y6MLFzL9neq9KJX4THH1cfE7rgTqZWSh2VHxBZ3IA5Kcs=
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.fr;
	h=X-YMail-OSG:Received:X-Mailer:References:Message-ID:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type;
	b=WDPi0yYk33k6GFm2i3QJMSY7po1uyXo9YEAYVp5yfjxd0YMF4XdxjRCpcX8vVQungABWMPdrfepLG8Tjys53KSom0dJxx9DL+CO27bS+KrxT7KN4vFEmeDA4BGcybhMTKqf2yssP3uFlZcQg1EKHFDMlnLUCLPan2m65GaQUUUo=;
X-YMail-OSG: 6wuIB6YVM1lLivIA5czhHjlyEBg2FxonEb28Tfo.548D324
	DRnnBFBksbrYOZoM.Iuu7sWvigzKlCKjVTBvQz6HzQDxIC9NOYg5JORR8ogv
	sn1mbr0zVmJyrjq3YOg.IYgtViNfeRapswuP0lTQmUfRPer5kZlxPXn1Aoq0
	58GrYziL088YxEgd0bJfsh_jSwJ1p2AT8yDeov4ePxGxqWhNX43XNklnTC4a
	z9Z5hiDaqMsiNAwJBiMlRemkDq0Ex6i4jk99K5eN15loAJd6dhvHbUo97v0N
	lpVy3qj_8MNpoDbtsUQoVYIya9O.RQx.BWS0jdfEviG3KPN.Cs64fhRHmJls
	.pyXurgJIMdVhqlE7opxDxjwjRHEZ92NSvTLaa.oY_KnXu2kgtgBgDfb_G8m
	MglKEf_w3nyyVNAebELn5.5okyI5n63az9XU2piMKZRw3ahbJIVBJ7FgpEJR
	aWYqeImlbB0bAJrhjhbBr1CZHiYubCNt4a_pbvq3uYxPPBxXsUtl0WEVvwu3
	ieV9oAw6pzMZDRXkGYjAfevfNTi533kJeyH5AtgJXKsyMxHlVLKcTtYEuvUe
	9nHplRy60E.csdeVwM8_dYBhLxY26ovUTMrLKBwxPmIITzvlLPyBFOI71P5S
	pzz_x8KqbTBa_HeDTJ4xylN5.6q8.WbG2X6uTyqWhaEZYI.cE1rBm.BkRkEj
	BbM7pNrt0Fj_1Ca3uKWx63nnpHfjlemS0O_wGGNBzNqf5ILQJNSF8zqfyU4j
	6obw6i_nkEvhca_7b8pxqIC2sNhfMZk3BSbjQYtow8in3BrQfxokoGYPsukO
	xh6zy7voNBugNTNr5mn5y4VncAVGjFHG397ksIUTs6SueLOj.jeW4761.aXo
	qH6v_ZmdTUB1nnzfI7xcJ3OTc1T_tOhI4xEmv1mpuv.KYhdhsif0epUyxfX.
	_mEKbckLiuOwZrlDr_5K.dJA5rr1Bwrvw_1aisxv10pu.NqkTnDtDS8zWZhQ
	HtTVNcK_bmLs-
Received: from [195.167.237.98] by web29808.mail.ird.yahoo.com via HTTP;
	Wed, 26 Oct 2011 14:35:30 BST
X-Mailer: YahooMailWebService/0.8.114.317681
References: <1316616472579-4826635.post@n5.nabble.com>
	<1316616757871-4826655.post@n5.nabble.com>
	<1316618006.67296.YahooMailNeo@web29818.mail.ird.yahoo.com>
	<1316693722029-4829929.post@n5.nabble.com>
	<20110922182705.GE12984@reaktio.net>
	<1316728444821-4831624.post@n5.nabble.com>
	<1316777654598-4833174.post@n5.nabble.com>
	<1316786412428-4833637.post@n5.nabble.com>
	<20110923172115.GI12984@reaktio.net>
	<1318672856439-4904945.post@n5.nabble.com>
	<1319630071722-4939528.post@n5.nabble.com>
Message-ID: <1319636130.20499.YahooMailNeo@web29808.mail.ird.yahoo.com>
Date: Wed, 26 Oct 2011 14:35:30 +0100 (BST)
From: David TECHER <davidtecher@yahoo.fr>
Subject: Re : Re : Re : Re : Re : [Xen-devel] Re: Patches for VGA-Passthrough
	XEN 4.2 unstable
To: Zoltan Hubai <hubaiz@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
In-Reply-To: <1319630071722-4939528.post@n5.nabble.com>
MIME-Version: 1.0
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: David TECHER <davidtecher@yahoo.fr>
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============1134168780=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1134168780==
Content-Type: multipart/alternative;
	boundary="1046220186-549140643-1319636130=:20499"

--1046220186-549140643-1319636130=:20499
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

Hi =0A=0A=0AThanks for sharing your experiment, this is very usefull/intere=
sting ! ! !=0A=0A=0AHappy to see that it work for you on Win7.=0A=0ALet me =
know for your next experiment with Win7.=0A=0AMy last experiment with EVGA =
GTX 460 SE 1024MB=0A=0A=0Ahttp://www.davidgis.fr/blog/index.php?2011/10/17/=
837-xen-intel-vt-d-sur-core-5-2400-vga-passthrough-sur-carte-nvidia-evga-gt=
x-460-se-1024=0A=0AI can play Crysis2 on XP 64 bits (Resolution:=A0 1920x10=
80) with directX9.=0A=0A=0A=0A=0A________________________________=0ADe=A0: =
Zoltan Hubai <hubaiz@gmail.com>=0A=C0=A0: xen-devel@lists.xensource.com=0AE=
nvoy=E9 le : Mercredi 26 Octobre 2011 13h54=0AObjet=A0: Re: Re : Re : Re : =
Re : [Xen-devel] Re: Patches for VGA-Passthrough XEN 4.2 unstable=0A=0AHi=
=0A=0AFirst of all thx for David and the xen team.=0A=0AMy configuration is=
=0AMB: asrock Z68 extreme 4 gen 3=0ACPU: intel i7 2600=0AMemory: 8 gb=0AGFX=
1: nvidia 285 gtx (connected to monitor 1)=0AGFX2: built in intel 2000 on c=
pu (connected to monitor 2)=0A=0AFirst I installed Ubuntu 11.10 x64, after =
that installed kernel 3.1.0 with=0Athe ubuntu configuration as start and ma=
king the needed changes for xen.=0AThen I installed xen-unstable the way Da=
vid has explained (extracting the=0Agfx firmware, patching, modifying dsdt.=
asl).=0AI also added the xen-pciback.hide=3D(01:00.0) kernel param.=0A=0AHe=
re is the dmesg part related to vga:=0A[=A0 =A0 0.000000] Command line: roo=
t=3DUUID=3D51cc6b5d-8f21-43c4-83ca-cb25324d3212=0Aro xen-pciback.hide=3D(01=
:00.0)=0A[=A0 =A0 1.974554] Kernel command line:=0Aroot=3DUUID=3D51cc6b5d-8=
f21-43c4-83ca-cb25324d3212 ro xen-pciback.hide=3D(01:00.0)=0A[=A0 =A0 2.159=
340] pci 0000:01:00.0: [10de:05e3] type 0 class 0x000300=0A[=A0 =A0 2.15935=
6] pci 0000:01:00.0: reg 10: [mem 0xfa000000-0xfaffffff]=0A[=A0 =A0 2.15937=
4] pci 0000:01:00.0: reg 14: [mem 0xc0000000-0xcfffffff 64bit=0Apref]=0A[=
=A0 =A0 2.159392] pci 0000:01:00.0: reg 1c: [mem 0xf8000000-0xf9ffffff 64bi=
t]=0A[=A0 =A0 2.159404] pci 0000:01:00.0: reg 24: [io=A0 0xe000-0xe07f]=0A[=
=A0 =A0 2.159415] pci 0000:01:00.0: reg 30: [mem 0xfb000000-0xfb07ffff pref=
]=0A[=A0 =A0 2.191560] vgaarb: device added:=0APCI:0000:01:00.0,decodes=3Di=
o+mem,owns=3Dio+mem,locks=3Dnone=0A[=A0 =A0 2.191694] vgaarb: bridge contro=
l possible 0000:01:00.0=0A[=A0 =A0 2.216347] pciback 0000:01:00.0: seizing =
device=0A[=A0 =A0 2.456885] pciback 0000:01:00.0: Boot video device=0A[=A0 =
=A0 2.513904] pciback 0000:01:00.0: Signaling PME through PCIe PME=0Ainterr=
upt=0A[=A0 =A0 2.518151] pciback 0000:01:00.0: PCI INT A -> GSI 16 (level, =
low) -> IRQ=0A16=0A[=A0 =A0 2.518216] pciback 0000:01:00.0: PCI INT A disab=
led=0A[=A0  87.312028] xen-pciback: vpci: 0000:01:00.0: assign to virtual s=
lot 0=0A[=A0 322.481774] xen-pciback: vpci: 0000:01:00.0: assign to virtual=
 slot 0=0A[=A0 322.482524] pciback 0000:01:00.0: device has been assigned t=
o another=0Adomain! Over-writting the ownership, but beware.=0A=0Aand here =
is the dmesg for the intel gfx=0A=0A[=A0 =A0 2.156757] pci 0000:00:02.0: [8=
086:0102] type 0 class 0x000380=0A[=A0 =A0 2.156782] pci 0000:00:02.0: reg =
10: [mem 0xfb400000-0xfb7fffff 64bit]=0A[=A0 =A0 2.156796] pci 0000:00:02.0=
: reg 18: [mem 0xb0000000-0xbfffffff 64bit=0Apref]=0A[=A0 =A0 2.156806] pci=
 0000:00:02.0: reg 20: [io=A0 0xf000-0xf03f]=0A[=A0 =A0 7.867449] i915 0000=
:00:02.0: enabling device (0006 -> 0007)=0A[=A0 =A0 7.867467] i915 0000:00:=
02.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16=0A[=A0 =A0 7.867472] i915 =
0000:00:02.0: setting latency timer to 64=0A[=A0 =A0 8.833292] [drm] Initia=
lized i915 1.6.0 20080730 for 0000:00:02.0 on=0Aminor 0=0A=0AIn bios i setu=
p pci express as startup device, so when ubuntu begins to load=0Afirst I se=
e the loading on the monitor 1 connected to nvidia and when the=0Acard is a=
ssigned to pciback then it automaticaly switches to the intel 2000=0Abuilt =
in gfx on monitor 2.=0A=0AFirst I had problem with executin /etc/init.d/xen=
comons start was getting=0Athe following error=0Ausr/lib64/xen/bin/qemu-dm:=
 error while loading shared libraries:=0Alibxenctrl.so.4.2: cannot open sha=
red object file: No such file or directory=0AI solved it by adding /usr/lib=
64 to /etc/ld.so.conf and executing ldconfig=0AThen I had problem with exec=
uting /etc/init.d/xend start, was getting the=0Afollowing error=0ARTNETLINK=
 answers: File exists=0Axend would start but without networking, solved thi=
s by defining the xenbr0=0Ainterface in /etc/network/interfaces=0A=0ASo fin=
ally everything was working:=0A=0Aroot@anubisxen:/usr/src# xm pci-list-assi=
gnable-devices=0A0000:01:00.0=0A=0AFirst I tryed to install windows 7 x64 p=
rofessional, that worked but after I=0Ainstalled the latest nvidia 285.62 d=
river I got a BSOD.=0AThen I tryed to install windows xp (sp3) x86, install=
ed the same driver and=0Aalso didn't work.=0ASo after read David blog, I do=
wnloaded the 275.33 driver for xp and for my=0Asuprise it was working.=0AI =
did the same for win7, and win7 also worked with the 275.33 driver.=0AI nee=
d to do some more testing, unfortunatly I created to small disk for=0Awin7 =
so I run out of space, but will try it with a bigger disk and with some=0Ab=
enchmarks.=0AI tryed 3dmark 6 on winxp and it was running fine.=0A=0AWill p=
ost more when I reinstall win7 with a bigger virtual disk, will=0Acompare b=
enchmarks from a virt machine and a real machine.=0A=0Asorry for my poor en=
glish=0A=0A--=0AView this message in context: http://xen.1045712.n5.nabble.=
com/Patches-for-VGA-Passthrough-XEN-4-2-unstable-tp4406265p4939528.html=0AS=
ent from the Xen - Dev mailing list archive at Nabble.com.=0A=0A___________=
____________________________________=0AXen-devel mailing list=0AXen-devel@l=
ists.xensource.com=0Ahttp://lists.xensource.com/xen-devel
--1046220186-549140643-1319636130=:20499
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

<html><body><div style=3D"color:#000; background-color:#fff; font-family:ti=
mes new roman, new york, times, serif;font-size:12pt"><div><span>Hi <br></s=
pan></div><div><br><span></span></div><div><span>Thanks for sharing your ex=
periment, this is very usefull/interesting ! ! !<br></span></div><div><br><=
span></span></div><div><span>Happy to see that it work for you on Win7.</sp=
an></div><div><br><span></span></div><div>Let me know for your next experim=
ent with Win7.</div><div><span><br></span></div><div><span>My last experime=
nt with EVGA GTX 460 SE 1024MB<br></span></div><div><br><span></span></div>=
<div><span>http://www.davidgis.fr/blog/index.php?2011/10/17/837-xen-intel-v=
t-d-sur-core-5-2400-vga-passthrough-sur-carte-nvidia-evga-gtx-460-se-1024</=
span></div><div><br><span></span></div><div><span>I can play Crysis2 on XP =
64 bits (Resolution:&nbsp; 1920x1080) with directX9.</span></div><div><br><=
span></span></div><div><span><br></span></div><div><br></div><div
 style=3D"font-family: times new roman, new york, times, serif; font-size: =
12pt;"><div style=3D"font-family: times new roman, new york, times, serif; =
font-size: 12pt;"><font face=3D"Arial" size=3D"2"><hr size=3D"1"><b><span s=
tyle=3D"font-weight:bold;">De&nbsp;:</span></b> Zoltan Hubai &lt;hubaiz@gma=
il.com&gt;<br><b><span style=3D"font-weight: bold;">=C0&nbsp;:</span></b> x=
en-devel@lists.xensource.com<br><b><span style=3D"font-weight: bold;">Envoy=
=E9 le :</span></b> Mercredi 26 Octobre 2011 13h54<br><b><span style=3D"fon=
t-weight: bold;">Objet&nbsp;:</span></b> Re: Re : Re : Re : Re : [Xen-devel=
] Re: Patches for VGA-Passthrough XEN 4.2 unstable<br></font><br>Hi<br><br>=
First of all thx for David and the xen team.<br><br>My configuration is<br>=
MB: asrock Z68 extreme 4 gen 3<br>CPU: intel i7 2600<br>Memory: 8 gb<br>GFX=
1: nvidia 285 gtx (connected to monitor 1)<br>GFX2: built in intel 2000 on =
cpu (connected to monitor 2)<br><br>First I installed Ubuntu 11.10 x64, aft=
er that
 installed kernel 3.1.0 with<br>the ubuntu configuration as start and makin=
g the needed changes for xen.<br>Then I installed xen-unstable the way Davi=
d has explained (extracting the<br>gfx firmware, patching, modifying dsdt.a=
sl).<br>I also added the xen-pciback.hide=3D(01:00.0) kernel param.<br><br>=
Here is the dmesg part related to vga:<br>[&nbsp; &nbsp; 0.000000] Command =
line: root=3DUUID=3D51cc6b5d-8f21-43c4-83ca-cb25324d3212<br>ro xen-pciback.=
hide=3D(01:00.0)<br>[&nbsp; &nbsp; 1.974554] Kernel command line:<br>root=
=3DUUID=3D51cc6b5d-8f21-43c4-83ca-cb25324d3212 ro xen-pciback.hide=3D(01:00=
.0)<br>[&nbsp; &nbsp; 2.159340] pci 0000:01:00.0: [10de:05e3] type 0 class =
0x000300<br>[&nbsp; &nbsp; 2.159356] pci 0000:01:00.0: reg 10: [mem 0xfa000=
000-0xfaffffff]<br>[&nbsp; &nbsp; 2.159374] pci 0000:01:00.0: reg 14: [mem =
0xc0000000-0xcfffffff 64bit<br>pref]<br>[&nbsp; &nbsp; 2.159392] pci 0000:0=
1:00.0: reg 1c: [mem 0xf8000000-0xf9ffffff 64bit]<br>[&nbsp; &nbsp; 2.15940=
4] pci
 0000:01:00.0: reg 24: [io&nbsp; 0xe000-0xe07f]<br>[&nbsp; &nbsp; 2.159415]=
 pci 0000:01:00.0: reg 30: [mem 0xfb000000-0xfb07ffff pref]<br>[&nbsp; &nbs=
p; 2.191560] vgaarb: device added:<br>PCI:0000:01:00.0,decodes=3Dio+mem,own=
s=3Dio+mem,locks=3Dnone<br>[&nbsp; &nbsp; 2.191694] vgaarb: bridge control =
possible 0000:01:00.0<br>[&nbsp; &nbsp; 2.216347] pciback 0000:01:00.0: sei=
zing device<br>[&nbsp; &nbsp; 2.456885] pciback 0000:01:00.0: Boot video de=
vice<br>[&nbsp; &nbsp; 2.513904] pciback 0000:01:00.0: Signaling PME throug=
h PCIe PME<br>interrupt<br>[&nbsp; &nbsp; 2.518151] pciback 0000:01:00.0: P=
CI INT A -&gt; GSI 16 (level, low) -&gt; IRQ<br>16<br>[&nbsp; &nbsp; 2.5182=
16] pciback 0000:01:00.0: PCI INT A disabled<br>[&nbsp;  87.312028] xen-pci=
back: vpci: 0000:01:00.0: assign to virtual slot 0<br>[&nbsp; 322.481774] x=
en-pciback: vpci: 0000:01:00.0: assign to virtual slot 0<br>[&nbsp; 322.482=
524] pciback 0000:01:00.0: device has been assigned to another<br>domain!
 Over-writting the ownership, but beware.<br><br>and here is the dmesg for =
the intel gfx<br><br>[&nbsp; &nbsp; 2.156757] pci 0000:00:02.0: [8086:0102]=
 type 0 class 0x000380<br>[&nbsp; &nbsp; 2.156782] pci 0000:00:02.0: reg 10=
: [mem 0xfb400000-0xfb7fffff 64bit]<br>[&nbsp; &nbsp; 2.156796] pci 0000:00=
:02.0: reg 18: [mem 0xb0000000-0xbfffffff 64bit<br>pref]<br>[&nbsp; &nbsp; =
2.156806] pci 0000:00:02.0: reg 20: [io&nbsp; 0xf000-0xf03f]<br>[&nbsp; &nb=
sp; 7.867449] i915 0000:00:02.0: enabling device (0006 -&gt; 0007)<br>[&nbs=
p; &nbsp; 7.867467] i915 0000:00:02.0: PCI INT A -&gt; GSI 16 (level, low) =
-&gt; IRQ 16<br>[&nbsp; &nbsp; 7.867472] i915 0000:00:02.0: setting latency=
 timer to 64<br>[&nbsp; &nbsp; 8.833292] [drm] Initialized i915 1.6.0 20080=
730 for 0000:00:02.0 on<br>minor 0<br><br>In bios i setup pci express as st=
artup device, so when ubuntu begins to load<br>first I see the loading on t=
he monitor 1 connected to nvidia and when the<br>card is assigned to
 pciback then it automaticaly switches to the intel 2000<br>built in gfx on=
 monitor 2.<br><br>First I had problem with executin /etc/init.d/xencomons =
start was getting<br>the following error<br>usr/lib64/xen/bin/qemu-dm: erro=
r while loading shared libraries:<br>libxenctrl.so.4.2: cannot open shared =
object file: No such file or directory<br>I solved it by adding /usr/lib64 =
to /etc/ld.so.conf and executing ldconfig<br>Then I had problem with execut=
ing /etc/init.d/xend start, was getting the<br>following error<br>RTNETLINK=
 answers: File exists<br>xend would start but without networking, solved th=
is by defining the xenbr0<br>interface in /etc/network/interfaces<br><br>So=
 finally everything was working:<br><br>root@anubisxen:/usr/src# xm pci-lis=
t-assignable-devices<br>0000:01:00.0<br><br>First I tryed to install window=
s 7 x64 professional, that worked but after I<br>installed the latest nvidi=
a 285.62 driver I got a BSOD.<br>Then I tryed to install windows xp
 (sp3) x86, installed the same driver and<br>also didn't work.<br>So after =
read David blog, I downloaded the 275.33 driver for xp and for my<br>supris=
e it was working.<br>I did the same for win7, and win7 also worked with the=
 275.33 driver.<br>I need to do some more testing, unfortunatly I created t=
o small disk for<br>win7 so I run out of space, but will try it with a bigg=
er disk and with some<br>benchmarks.<br>I tryed 3dmark 6 on winxp and it wa=
s running fine.<br><br>Will post more when I reinstall win7 with a bigger v=
irtual disk, will<br>compare benchmarks from a virt machine and a real mach=
ine.<br><br>sorry for my poor english<br><br>--<br>View this message in con=
text: <a href=3D"http://xen.1045712.n5.nabble.com/Patches-for-VGA-Passthrou=
gh-XEN-4-2-unstable-tp4406265p4939528.html" target=3D"_blank">http://xen.10=
45712.n5.nabble.com/Patches-for-VGA-Passthrough-XEN-4-2-unstable-tp4406265p=
4939528.html</a><br>Sent from the Xen - Dev mailing list archive at
 Nabble.com.<br><br>_______________________________________________<br>Xen-=
devel mailing list<br><a ymailto=3D"mailto:Xen-devel@lists.xensource.com" h=
ref=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">h=
ttp://lists.xensource.com/xen-devel</a><br><br><br></div></div></div></body=
></html>
--1046220186-549140643-1319636130=:20499--


--===============1134168780==
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

--===============1134168780==--


From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:38:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:38:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3gT-0002WO-Bx; Wed, 26 Oct 2011 06:38:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ3f7-000266-Lf
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:36:59 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319636214!25391957!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27184 invoked from network); 26 Oct 2011 13:36:54 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-3.tower-174.messagelabs.com with SMTP;
	26 Oct 2011 13:36:54 -0000
Received: from p5b2e43f0.dip.t-dialin.net ([91.46.67.240] helo=[192.168.2.143])
	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 1RJ3f2-0005IS-DO; Wed, 26 Oct 2011 13:36:52 +0000
Message-ID: <4EA80CF2.5040309@canonical.com>
Date: Wed, 26 Oct 2011 15:36:50 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux i686;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <4EA7DFD1.9060608@canonical.com>
	<20111026133003.GA6654@phenom.dumpdata.com>
In-Reply-To: <20111026133003.GA6654@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>
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 26.10.2011 15:30, Konrad Rzeszutek Wilk wrote:
> On Wed, Oct 26, 2011 at 12:24:17PM +0200, Stefan Bader 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:   Fri Apr 1 19:34:59 2011 -0400
>>
>>     cpuidle: stop depending on pm_idle
>>
>> However cpuidle_call_idle() will return -ENODEV if it is supposed to be disabled
>> 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:   Fri Apr 1 18:28:35 2011 -0400
>>
>>     cpuidle: 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 selected.
> 
> Right, b/c that is what d91ee5863b71e8c90eaf6035bff3078a85e2e7b5 was suppose
> to do - " xen 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 it seems that select_idle_routine() was not thought off.
> 
>> 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.
>>
>> 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.
>> One quick fix could be to add some Xen case into select_idle_routine() which
>> picks default_idle...
> 
> What about using the cpuidle_disabled() functionality and adhere to that?
> As so:
> 
> 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; }
>  
> --
> 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

>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.

-Stefan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:44:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:44:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3mU-00039t-Nk; Wed, 26 Oct 2011 06:44:34 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ3lu-0002xb-EF
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:43:58 -0700
X-Env-Sender: david.vrabel@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319636633!2470082!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1864 invoked from network); 26 Oct 2011 13:43:55 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 13:43:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315195200"; d="scan'208";a="168272722"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 09:43:10 -0400
Received: from [10.80.2.76] (10.80.2.76) by FTLPMAILMX02.citrite.net
	(10.13.107.66) with Microsoft SMTP Server id 8.3.137.0; Wed, 26 Oct 2011
	09:43:09 -0400
Message-ID: <4EA80E6C.20403@citrix.com>
Date: Wed, 26 Oct 2011 14:43:08 +0100
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: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 8 of 8 DOCDAY] docs: hypercall: document
	mmuext_op using Doxygen
References: <patchbomb.1319634159@cosworth.uk.xensource.com>
	<78d2ade5f1fc301ad60e.1319634167@cosworth.uk.xensource.com>
In-Reply-To: <78d2ade5f1fc301ad60e.1319634167@cosworth.uk.xensource.com>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit
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 26/10/11 14:02, Ian Campbell wrote:
> 
> + * An additional MMU hypercall provides an `extended command'
> + * interface. This provides additional functionality beyond the basic
> + * table updating commands. This hypercall is used to perform
> + * additional MMU operations. These include updating cr3 (or just
> + * re-installing it for a TLB flush), requesting various kinds of TLB
> + * flush, flushing the cache, installing a new LDT, or pinning &
> + * unpinning page-table pages (to ensure their reference count doesnâ€™t
> + * drop to zero which would require a revalidation of all entries).

Bullet points linked to the docs for the specific op might be more
useful here (rather than the long comma-separated list).


> +/** \ingroup HYPERVISOR_mmuext_op

Consider using the @{ @} markers to put adjacent items into the same
group rather than having \ingroup for each item.

David

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:47:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:47:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3ph-0003da-Vd; Wed, 26 Oct 2011 06:47:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ3pE-0003Rw-Po
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:47:25 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1319636840!1757956!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26793 invoked from network); 26 Oct 2011 13:47:21 -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; 26 Oct 2011 13:47:21 -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
	p9QDlEUb015974
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 13:47:14 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
	p9QDlDXQ010405
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 13:47:13 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9QDl7AP005800; Wed, 26 Oct 2011 08:47:08 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 06:47:07 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id BFE1882C1D; Wed, 26 Oct 2011 09:47:06 -0400 (EDT)
Date: Wed, 26 Oct 2011 09:47:06 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: David Vrabel <david.vrabel@citrix.com>, axboe@kernel.dk,
	jaxboe@fusionio.com
Subject: Re: [Xen-devel] [PATCH 2/4] block: xen-blkback: use API provided by
	xenbus module to map rings
Message-ID: <20111026134706.GA21283@phenom.dumpdata.com>
References: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
	<1319107519-2253-3-git-send-email-david.vrabel@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319107519-2253-3-git-send-email-david.vrabel@citrix.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.0A020208.4EA80F63.002B:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, linux-kernel@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, Oct 20, 2011 at 11:45:17AM +0100, David Vrabel wrote:
> The xenbus module provides xenbus_map_ring_valloc() and
> xenbus_map_ring_vfree().  Use these to map the ring pages granted by
> the frontend.

Jens,

This patch paves the way for two other patches that are in the akpm's MMU area of expertise.
In other words, the last patch in this series (which should go through akpm's tree
or mine with his Ack) depends on this one.

I can split this patchset in three different pieces - one for you, one for david miller,
and one for akpm. But I was hoping to have it as one nice GIT PULL for Linus -
hence I am wondering if it is OK if I get your Ack and do it through my tree?

Thanks!

> 
> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
> ---
>  drivers/block/xen-blkback/common.h |    5 +--
>  drivers/block/xen-blkback/xenbus.c |   54 ++++-------------------------------
>  2 files changed, 8 insertions(+), 51 deletions(-)
> 
> diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
> index 00c57c9..7ec0e88 100644
> --- a/drivers/block/xen-blkback/common.h
> +++ b/drivers/block/xen-blkback/common.h
> @@ -139,7 +139,7 @@ struct xen_blkif {
>  	/* Comms information. */
>  	enum blkif_protocol	blk_protocol;
>  	union blkif_back_rings	blk_rings;
> -	struct vm_struct	*blk_ring_area;
> +	void			*blk_ring;
>  	/* The VBD attached to this interface. */
>  	struct xen_vbd		vbd;
>  	/* Back pointer to the backend_info. */
> @@ -163,9 +163,6 @@ struct xen_blkif {
>  	int			st_wr_sect;
>  
>  	wait_queue_head_t	waiting_to_free;
> -
> -	grant_handle_t		shmem_handle;
> -	grant_ref_t		shmem_ref;
>  };
>  
>  
> diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
> index 5fd2010..69233dd 100644
> --- a/drivers/block/xen-blkback/xenbus.c
> +++ b/drivers/block/xen-blkback/xenbus.c
> @@ -120,38 +120,6 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid)
>  	return blkif;
>  }
>  
> -static int map_frontend_page(struct xen_blkif *blkif, unsigned long shared_page)
> -{
> -	struct gnttab_map_grant_ref op;
> -
> -	gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
> -			  GNTMAP_host_map, shared_page, blkif->domid);
> -
> -	if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
> -		BUG();
> -
> -	if (op.status) {
> -		DPRINTK("Grant table operation failure !\n");
> -		return op.status;
> -	}
> -
> -	blkif->shmem_ref = shared_page;
> -	blkif->shmem_handle = op.handle;
> -
> -	return 0;
> -}
> -
> -static void unmap_frontend_page(struct xen_blkif *blkif)
> -{
> -	struct gnttab_unmap_grant_ref op;
> -
> -	gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
> -			    GNTMAP_host_map, blkif->shmem_handle);
> -
> -	if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
> -		BUG();
> -}
> -
>  static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
>  			 unsigned int evtchn)
>  {
> @@ -161,35 +129,29 @@ static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
>  	if (blkif->irq)
>  		return 0;
>  
> -	blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE);
> -	if (!blkif->blk_ring_area)
> -		return -ENOMEM;
> -
> -	err = map_frontend_page(blkif, shared_page);
> -	if (err) {
> -		free_vm_area(blkif->blk_ring_area);
> +	err = xenbus_map_ring_valloc(blkif->be->dev, shared_page, &blkif->blk_ring);
> +	if (err < 0)
>  		return err;
> -	}
>  
>  	switch (blkif->blk_protocol) {
>  	case BLKIF_PROTOCOL_NATIVE:
>  	{
>  		struct blkif_sring *sring;
> -		sring = (struct blkif_sring *)blkif->blk_ring_area->addr;
> +		sring = (struct blkif_sring *)blkif->blk_ring;
>  		BACK_RING_INIT(&blkif->blk_rings.native, sring, PAGE_SIZE);
>  		break;
>  	}
>  	case BLKIF_PROTOCOL_X86_32:
>  	{
>  		struct blkif_x86_32_sring *sring_x86_32;
> -		sring_x86_32 = (struct blkif_x86_32_sring *)blkif->blk_ring_area->addr;
> +		sring_x86_32 = (struct blkif_x86_32_sring *)blkif->blk_ring;
>  		BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, PAGE_SIZE);
>  		break;
>  	}
>  	case BLKIF_PROTOCOL_X86_64:
>  	{
>  		struct blkif_x86_64_sring *sring_x86_64;
> -		sring_x86_64 = (struct blkif_x86_64_sring *)blkif->blk_ring_area->addr;
> +		sring_x86_64 = (struct blkif_x86_64_sring *)blkif->blk_ring;
>  		BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, PAGE_SIZE);
>  		break;
>  	}
> @@ -201,8 +163,7 @@ static int xen_blkif_map(struct xen_blkif *blkif, unsigned long shared_page,
>  						    xen_blkif_be_int, 0,
>  						    "blkif-backend", blkif);
>  	if (err < 0) {
> -		unmap_frontend_page(blkif);
> -		free_vm_area(blkif->blk_ring_area);
> +		xenbus_unmap_ring_vfree(blkif->be->dev, blkif->blk_ring);
>  		blkif->blk_rings.common.sring = NULL;
>  		return err;
>  	}
> @@ -228,8 +189,7 @@ static void xen_blkif_disconnect(struct xen_blkif *blkif)
>  	}
>  
>  	if (blkif->blk_rings.common.sring) {
> -		unmap_frontend_page(blkif);
> -		free_vm_area(blkif->blk_ring_area);
> +		xenbus_unmap_ring_vfree(blkif->be->dev, blkif->blk_ring);
>  		blkif->blk_rings.common.sring = NULL;
>  	}
>  }
> -- 
> 1.7.2.5
> 
> 
> _______________________________________________
> 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 Oct 26 06:49:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:49:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3rL-000426-B1; Wed, 26 Oct 2011 06:49:35 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ3qk-0003ph-ID
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:48:58 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1319636933!839468!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18120 invoked from network); 26 Oct 2011 13:48:55 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-4.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 13:48:55 -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
	p9QDmo6e018013
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 13:48:50 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
	p9QDmnZF010329
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 13:48: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
	p9QDmh8a005688; Wed, 26 Oct 2011 08:48:43 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 06:48:44 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 33F4782C1D; Wed, 26 Oct 2011 09:48:43 -0400 (EDT)
Date: Wed, 26 Oct 2011 09:48:43 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Stefan Bader <stefan.bader@canonical.com>
Message-ID: <20111026134843.GA31609@phenom.dumpdata.com>
References: <4EA7DFD1.9060608@canonical.com>
	<20111026133003.GA6654@phenom.dumpdata.com>
	<4EA80CF2.5040309@canonical.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA80CF2.5040309@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.0A02020A.4EA80FC3.0061:SCFMA922111,ss=1,re=-4.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>
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

> > 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 :-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:50:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:50:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3sJ-0004Qe-Uy; Wed, 26 Oct 2011 06:50:35 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ3rj-00049r-Ub
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:50:00 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319636995!1134899!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14165 invoked from network); 26 Oct 2011 13:49:56 -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; 26 Oct 2011 13:49:56 -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
	p9QDnncf031187
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 13:49:50 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
	p9QDnmXE018670
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 13:49:49 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
	p9QDnhVb020963; Wed, 26 Oct 2011 08:49:43 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 06:49:43 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 6827582C1D; Wed, 26 Oct 2011 09:49:42 -0400 (EDT)
Date: Wed, 26 Oct 2011 09:49:42 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Alex Bligh <alex@alex.org.uk>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
Message-ID: <20111026134942.GB31609@phenom.dumpdata.com>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <0050AA2F452257584F0AAA0B@nimrod.local>
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.4EA80FFE.0117,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, Oct 26, 2011 at 02:17:25PM +0100, Alex Bligh wrote:
> I am running Xen 4 and want users to be able to install arbitrary HVM
> images. We want both PV and emulated drivers to appear. The reason
> for this is for compatibility with images that were prepared for
> Xen 3.3, which assume emulated devices exist at boot time (particularly
> for running the boot loader).
> 
> If I do not specify on the boot line xen_emul_unplug=never, then
> under some guest OS's (e.g. Ubuntu Natty (2.6.38)), the domU kernel
> unplugs the non-PV devices, which is undesirable in my application.
> 
> I cannot arbitrarily change the kernel command line because it is
> in effect set by the user's image.
> 
> Therefore what I need to do is prevent Xen4 offering the facility
> to unplug the devices in the first place. Setting "(unpluggable 0)"
> in the config for the emulated NICs and disks does not appear
> to prevent them getting unplugged; what may be happening is that
> domU tries to unplug them (but fails) but still doesn't use them.
> Is there a way to signal from dom0 that the kernel really shouldn't
> unplug this stuff.

xen_pci_platform=0 in your guest config should do it.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:51:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:51:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3tF-0004oT-Ek; Wed, 26 Oct 2011 06:51:33 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ3sl-0004bh-G9
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:51:03 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319637039!49827998!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30865 invoked from network); 26 Oct 2011 13:50:39 -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;
	26 Oct 2011 13:50:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315180800"; 
   d="scan'208";a="8597340"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 13:51: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, 26 Oct 2011 14:51:00 +0100
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
	1RJ3sh-00060d-Qh; Wed, 26 Oct 2011 13:50:59 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJ3sh-0003Vf-Nu;
	Wed, 26 Oct 2011 14:50:59 +0100
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: <20136.4163.631735.591867@mariner.uk.xensource.com>
Date: Wed, 26 Oct 2011 14:50:59 +0100
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH 0 of 8 DOCDAY] setup Doxygen for use with
	hypercall interface headers
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <patchbomb.1319634159@cosworth.uk.xensource.com>
References: <patchbomb.1319634159@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 0 of 8 DOCDAY] setup Doxygen for use with hypercall interface headers"):
> The following series sets up a Doxygen run over xen/include/public and
> makes a start at documenting some hypercalls.

Urgh.  I really don't like doxygen.  doxygen-generated documents are
very hard to navigate (and it encourages the writing of vacuous
documentation comments).

Having looked at the various options, I think for hypercall
documentation what we really want is a hyperlinked marked-up set of
headerfiles, with a suitable contents page or index.

This is probably easiest to do with a little custom Perl script which
can improve with time (a bit like the way kerneldoc probably started).

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:56:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:56:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3xm-0005Gl-8O; Wed, 26 Oct 2011 06:56:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ3xI-00054P-2r
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:55:44 -0700
X-Env-Sender: JAxboe@fusionio.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319637308!54387445!1
X-Originating-IP: [66.114.96.30]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8841 invoked from network); 26 Oct 2011 13:55:08 -0000
Received: from mx1.fusionio.com (HELO mx1.fusionio.com) (66.114.96.30)
	by server-7.tower-27.messagelabs.com with SMTP;
	26 Oct 2011 13:55:08 -0000
X-ASG-Debug-ID: 1319637339-03d6a50f2a213fe0001-8pertM
Received: from mail1.int.fusionio.com (mail1.int.fusionio.com [10.101.1.21])
	by mx1.fusionio.com with ESMTP id PAIFQEXpG21ZQ6x4;
	Wed, 26 Oct 2011 07:55:39 -0600 (MDT)
X-Barracuda-Envelope-From: JAxboe@fusionio.com
Received: from [10.192.2.82] (85.13.70.251) by mail.fusionio.com (10.101.1.19)
	with Microsoft SMTP Server (TLS) id 8.1.393.1;
	Wed, 26 Oct 2011 07:55:38 -0600
Message-ID: <4EA81141.90008@fusionio.com>
Date: Wed, 26 Oct 2011 15:55:13 +0200
From: Jens Axboe <jaxboe@fusionio.com>
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] [PATCH 2/4] block: xen-blkback: use API provided
	by xenbus module to map rings
References: <1319107519-2253-1-git-send-email-david.vrabel@citrix.com>
	<1319107519-2253-3-git-send-email-david.vrabel@citrix.com>
	<20111026134706.GA21283@phenom.dumpdata.com>
X-ASG-Orig-Subj: Re: [Xen-devel] [PATCH 2/4] block: xen-blkback: use API
	provided by xenbus module to map rings
In-Reply-To: <20111026134706.GA21283@phenom.dumpdata.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 7bit
X-Barracuda-Connect: mail1.int.fusionio.com[10.101.1.21]
X-Barracuda-Start-Time: 1319637339
X-Barracuda-URL: http://10.101.1.180:8000/cgi-mod/mark.cgi
X-Virus-Scanned: by bsmtpd at fusionio.com
X-Barracuda-Bayes: INNOCENT GLOBAL 0.0000 1.0000 -2.0210
X-Barracuda-Spam-Score: -2.02
X-Barracuda-Spam-Status: No,
	SCORE=-2.02 using per-user scores of TAG_LEVEL=1000.0
	QUARANTINE_LEVEL=1000.0 KILL_LEVEL=9.0 tests=
X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.78456
	Rule breakdown below
	pts rule name              description
	---- ----------------------
	--------------------------------------------------
Cc: "axboe@kernel.dk" <axboe@kernel.dk>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	David Vrabel <david.vrabel@citrix.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@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 2011-10-26 15:47, Konrad Rzeszutek Wilk wrote:
> On Thu, Oct 20, 2011 at 11:45:17AM +0100, David Vrabel wrote:
>> The xenbus module provides xenbus_map_ring_valloc() and
>> xenbus_map_ring_vfree().  Use these to map the ring pages granted by
>> the frontend.
> 
> Jens,
> 
> This patch paves the way for two other patches that are in the akpm's
> MMU area of expertise.  In other words, the last patch in this series
> (which should go through akpm's tree or mine with his Ack) depends on
> this one.
> 
> I can split this patchset in three different pieces - one for you, one
> for david miller, and one for akpm. But I was hoping to have it as one
> nice GIT PULL for Linus - hence I am wondering if it is OK if I get
> your Ack and do it through my tree?

Sure, that'd be fine.

-- 
Jens Axboe


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 06:57:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 06:57:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ3zC-0005nq-K0; Wed, 26 Oct 2011 06:57:42 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ3xv-0005K1-RW
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:56:24 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319637380!2473163!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8722 invoked from network); 26 Oct 2011 13:56:20 -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;
	26 Oct 2011 13:56:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315180800"; 
   d="scan'208";a="8597578"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 13:56:20 +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, 26 Oct 2011 14:56:20 +0100
Subject: Re: [Xen-devel] [PATCH 0 of 8 DOCDAY] setup Doxygen for use with
	hypercall interface headers
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Wed, 26 Oct 2011 14:56:19 +0100
In-Reply-To: <20136.4163.631735.591867@mariner.uk.xensource.com>
References: <patchbomb.1319634159@cosworth.uk.xensource.com>
	<20136.4163.631735.591867@mariner.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: <1319637379.9436.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 Wed, 2011-10-26 at 14:50 +0100, Ian Jackson wrote:
> Ian Campbell writes ("[Xen-devel] [PATCH 0 of 8 DOCDAY] setup Doxygen for use with hypercall interface headers"):
> > The following series sets up a Doxygen run over xen/include/public and
> > makes a start at documenting some hypercalls.
> 
> Urgh.  I really don't like doxygen.  doxygen-generated documents are
> very hard to navigate (and it encourages the writing of vacuous
> documentation comments).
> 
> Having looked at the various options, I think for hypercall
> documentation what we really want is a hyperlinked marked-up set of
> headerfiles, with a suitable contents page or index.
> 
> This is probably easiest to do with a little custom Perl script which
> can improve with time (a bit like the way kerneldoc probably started).

I think I agree it's a shame that one of the existing tools doesn't
better suit our needs. The docs outputted here aren't really all that
useful.

I'll see if I can knock something up...

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 07:00:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 07:00:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ428-0006Ds-Ur; Wed, 26 Oct 2011 07:00:45 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ3ym-0005dM-4R
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:57:16 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319637431!36760672!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12839 invoked from network); 26 Oct 2011 13:57:12 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-12.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 26 Oct 2011 13:57:12 -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
	p9QDv72i009145
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 13:57:07 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
	p9QDv6V6001551
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 13:57:06 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
	p9QDv0Qa012172; Wed, 26 Oct 2011 08:57:00 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 06:57:00 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id D914182C1D; Wed, 26 Oct 2011 09:56:59 -0400 (EDT)
Date: Wed, 26 Oct 2011 09:56:59 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, akpm@linux-foundation.org
Message-ID: <20111026135659.GC31609@phenom.dumpdata.com>
References: <1319573279-13867-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: <1319573279-13867-1-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.0A090206.4EA811B4.005C,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, david.vrabel@citrix.com
Subject: [Xen-devel] Re: [PATCH] MMU bug-fixes in generic code that are
 mostly used by 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 Tue, Oct 25, 2011 at 04:07:56PM -0400, Konrad Rzeszutek Wilk wrote:
> I was wondering if you could help. I've this bug-fix:
>  [PATCH 1/3] x86/paravirt: PTE updates in k(un)map_atomic need to be
> 
> that you picked up some time ago in your tree and then dropped. I am not sure why it
> was dropped but perhaps it is b/c I also had that patch in my linux-next and your tool
> decided to drop it. Anyhow, was wondering if you would be OK giving it your
> Ack or just pulling it in your tree for 3.2.
> 
> These two:
>  [PATCH 2/3] xen: use generic functions instead of xen_{alloc,
>  [PATCH 3/3] xen: map foreign pages for shared rings by updating the
> 
> remove what git commit d2fe97c3315a6a406540f74651e7430d9d51e671
> 	Author: David Vrabel <david.vrabel@citrix.com>
> 	Date:   Thu Sep 29 16:53:32 2011 +0100
> 
> 	    xen: map foreign pages for shared rings by updating the PTEs directly
> 
> added in 3.1 with a more selective way instead of using the big hammer.
> 
> I was wondering if you would be OK ACK-ing those two or sticking them
> in your tree for 3.2.

Grrr.. Don't stick them in your tree. I forgot that they are dependent on two
other patches to both blkback and netback - otherwise compile errors gallore ensures.

I can:
 1). Stick the other two patches (blkback + netback) in my tree. And chase down the
     sub-maintainers to get an Ack for it to go through my tree (got one Ack already).
     And then stick these two patches on top of it (with your Ack of course).
 2). Get the other two patches in via the other maintainers and once they are in the
     Linus's tree, then ask for you to pull this one. This might take though lot 
     longer to orchestrate correctly.
 3). Ask you to pick all of those patches :-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 07:03:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 07: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 1RJ44z-0006d0-Qf; Wed, 26 Oct 2011 07:03:41 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ3yr-0005fq-GU
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 06:57:21 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1319637438!1153011!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5848 invoked from network); 26 Oct 2011 13:57:18 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-12.tower-216.messagelabs.com with SMTP;
	26 Oct 2011 13:57:18 -0000
Received: from p5b2e43f0.dip.t-dialin.net ([91.46.67.240] helo=[192.168.2.143])
	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 1RJ3ym-000188-ET; Wed, 26 Oct 2011 13:57:16 +0000
Message-ID: <4EA811BB.6010005@canonical.com>
Date: Wed, 26 Oct 2011 15:57:15 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux i686;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
References: <4EA7DFD1.9060608@canonical.com>
	<20111026133003.GA6654@phenom.dumpdata.com>
	<4EA80CF2.5040309@canonical.com>
	<20111026134843.GA31609@phenom.dumpdata.com>
In-Reply-To: <20111026134843.GA31609@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>
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 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. :)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 07:13:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 07:13:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ4EZ-0007AT-D8; Wed, 26 Oct 2011 07:13:35 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ4De-0006xR-IH
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 07:12:39 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319638354!848506!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9835 invoked from network); 26 Oct 2011 14:12:35 -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; 26 Oct 2011 14:12:35 -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 2A87418FF;
	Wed, 26 Oct 2011 17:12:34 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id F2431200AA; Wed, 26 Oct 2011 17:12:33 +0300 (EEST)
Date: Wed, 26 Oct 2011 17:12:33 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
Message-ID: <20111026141233.GJ12984@reaktio.net>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111026134942.GB31609@phenom.dumpdata.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen-devel@lists.xensource.com, 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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Wed, Oct 26, 2011 at 09:49:42AM -0400, Konrad Rzeszutek Wilk wrote:
> On Wed, Oct 26, 2011 at 02:17:25PM +0100, Alex Bligh wrote:
> > I am running Xen 4 and want users to be able to install arbitrary HVM
> > images. We want both PV and emulated drivers to appear. The reason
> > for this is for compatibility with images that were prepared for
> > Xen 3.3, which assume emulated devices exist at boot time (particularly
> > for running the boot loader).
> > 
> > If I do not specify on the boot line xen_emul_unplug=never, then
> > under some guest OS's (e.g. Ubuntu Natty (2.6.38)), the domU kernel
> > unplugs the non-PV devices, which is undesirable in my application.
> > 
> > I cannot arbitrarily change the kernel command line because it is
> > in effect set by the user's image.
> > 
> > Therefore what I need to do is prevent Xen4 offering the facility
> > to unplug the devices in the first place. Setting "(unpluggable 0)"
> > in the config for the emulated NICs and disks does not appear
> > to prevent them getting unplugged; what may be happening is that
> > domU tries to unplug them (but fails) but still doesn't use them.
> > Is there a way to signal from dom0 that the kernel really shouldn't
> > unplug this stuff.
> 
> xen_pci_platform=0 in your guest config should do it.
> 

It's actually called:
xen_platform_pci=0

:)

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 07:18:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 07:18:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ4Iq-0007ep-5I; Wed, 26 Oct 2011 07:18:00 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ4I0-0007SI-9V
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 07:17:10 -0700
X-Env-Sender: linux@eikelenboom.it
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319638624!847681!1
X-Originating-IP: [188.40.164.121]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7612 invoked from network); 26 Oct 2011 14:17:04 -0000
Received: from static.121.164.40.188.clients.your-server.de (HELO
	smtp.eikelenboom.it) (188.40.164.121)
	by server-7.tower-182.messagelabs.com with AES256-SHA encrypted SMTP;
	26 Oct 2011 14:17:04 -0000
Received: from 108-76-ftth.onsneteindhoven.nl ([88.159.76.108]:51747
	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 1RJ4Fa-0007YM-E9; Wed, 26 Oct 2011 16:14:39 +0200
Date: Wed, 26 Oct 2011 16:12:32 +0200
From: Sander Eikelenboom <linux@eikelenboom.it>
Organization: Eikelenboom IT services
X-Priority: 3 (Normal)
Message-ID: <11510207729.20111026161232@eikelenboom.it>
To: Wei Huang <wei.huang2@amd.com>
Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
In-Reply-To: <4EA5DDEB.90308@amd.com>
References: <1904679511.20111018205519@eikelenboom.it>
	<20111019160801.GA22918@phenom.dumpdata.com>
	<EE335F95F28A664DB4A21289D2AA053B01E6CBBBDB@SAUSEXMBP01.amd.com>
	<707354928.20111019193003@eikelenboom.it>
	<EE335F95F28A664DB4A21289D2AA053B01E6CBBD30@SAUSEXMBP01.amd.com>
	<884563847.20111022165748@eikelenboom.it> <4EA5DDEB.90308@amd.com>
MIME-Version: 1.0
Content-Type: multipart/mixed;
 boundary="----------11410F255244F390D"
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

------------11410F255244F390D
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: quoted-printable

Hello Wei,

Sorry you were right, i'm a bit accustomed that patches apply to the root o=
f the project, this one was for /xen specifically.
I have done a lot of reboots with the patch applied on:
- xen 4.1.3-rc1-pre
- dom0 kernel from Konrad's linux-next tree + devel/acpi-cpufreq.v3 branch =
+ patch from liang tang + linus 3.1 tree pulled in.
- iommu specific boot options used for xen in grub: iommu=3Don,amd-iommu-de=
bug amd_iommu=3Don amd-iommu-debug

I haven't seen kernel panics on boot so far, is this output that was expect=
ed (from serial console):

<snip>
(XEN) AMD-Vi: Add device table entry: device id =3D 0x0a07, interupt table =
=3D 0x24e004000
(XEN) AMD-Vi: Add device table entry: device id =3D 0x0b00, interupt table =
=3D 0x24e004000
(XEN) AMD-Vi: IOMMU 0 Enabled.
(XEN) AMD-Vi: Enabling global vector map
(XEN) I/O virtualisation enabled
(XEN)  - Dom0 mode: Relaxed
(XEN) Getting VERSION: 80050010
<snip>

Complete serial console output is attached


Is this patch a candidate for 4.1.3 ?

--

Sander



Monday, October 24, 2011, 11:51:39 PM, you wrote:

> Yes, it is for xen-4.1-testing tree. I just applied it to the latest tip =
(23174:d4253bc5418b). There were some hunks; but it worked in general. Coul=
d you try it and replace your xen.gz file with the new version?

> (Stripping trailing CRs from patch.)
> patching file arch/x86/io_apic.c
> Hunk #1 succeeded at 548 (offset -21 lines).
> (Stripping trailing CRs from patch.)
> patching file arch/x86/irq.c
> Hunk #5 succeeded at 192 (offset 1 line).
> Hunk #6 succeeded at 225 (offset 1 line).
> Hunk #7 succeeded at 236 (offset 1 line).
> Hunk #8 succeeded at 302 (offset 1 line).
> Hunk #9 succeeded at 372 (offset 1 line).
> Hunk #10 succeeded at 425 (offset 1 line).
> Hunk #11 succeeded at 440 (offset 1 line).
> Hunk #12 succeeded at 476 (offset 1 line).
> Hunk #13 succeeded at 497 (offset 1 line).
> Hunk #14 succeeded at 1599 (offset -11 lines).
> Hunk #15 succeeded at 1647 (offset -11 lines).
> (Stripping trailing CRs from patch.)
> patching file drivers/passthrough/amd/pci_amd_iommu.c
> (Stripping trailing CRs from patch.)
> patching file include/asm-x86/irq.h
> (Stripping trailing CRs from patch.)
> patching file include/xen/pci.h



> -Wei
> On 10/22/2011 09:57 AM, Sander Eikelenboom wrote:
>> Hello Wei,
>>
>> Is this for xen 4.1.2 ?
>> All hunks of the patch seem to be rejected.
>>
>> --
>> Sander
>>
>>
>> Wednesday, October 19, 2011, 8:27:55 PM, you wrote:
>>
>>> This reminds me of 23768:09595fdf3638, which reverted WeiWang's patch o=
f forcing perdev-intremap as default. Could you try the attached patch on y=
our Xen 4.1 tree and test with patched xen.gz?
>>
>>> Thanks,
>>> -Wei
>>
>>> -----Original Message-----
>>> From: xen-devel-bounces@lists.xensource.com [mailto:xen-devel-bounces@l=
ists.xensource.com] On Behalf Of Sander Eikelenboom
>>> Sent: Wednesday, October 19, 2011 12:30 PM
>>> To: Huang2, Wei
>>> Cc: xen-devel@lists.xensource.com; Konrad Rzeszutek Wilk
>>> Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
>>
>>> Hello Wei,
>>
>>> Result is that using only "1" or "1" in combination with "2" always res=
ult in SATA I/O errors, so that doesn't boot.
>>
>>> Haven't tried rebooting a lot of times without iommu yet.
>>> (the reason i bought the 890fx board in the first place)
>>> Will try that a few times when i have some more time.
>>
>>> --
>>> Sander
>>
>>> Wednesday, October 19, 2011, 6:38:38 PM, you wrote:
>>
>>>> It looks similar.
>>
>>>> Hi Sander, could you please test your system with the following option=
s?
>>
>>>> 1. iommu=3Damd-iommu-perdev-intremap in xen.gz GRUB entry
>>>> 2. pci=3Dnosmi in pvops GRUB entry
>>>> 3. iommu=3D0 in xen.gz GRUB entry [optional, only if (1) doesn't work =
for you]
>>
>>>> We were seeing an issue which was caused by messed-up interrupt remap =
table. George Dunlap's perdev interrupt map solved our problem.
>>
>>>> Thanks,
>>>> -Wei
>>
>>>> -----Original Message-----
>>>> From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]
>>>> Sent: Wednesday, October 19, 2011 11:08 AM
>>>> To: Sander Eikelenboom; Huang2, Wei
>>>> Cc: xen-devel@lists.xensource.com
>>>> Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
>>
>>>> On Tue, Oct 18, 2011 at 08:55:19PM +0200, Sander Eikelenboom wrote:
>>>>> Hi Konrad,
>>>>>
>>>>> On my system (AND phenom x6, 8gb mem) running xen 4.1.2-rc3
>>>>> and a custom kernel based on:
>>>>>
>>>>> - your linux-next branch
>>>>> - pulled in your apci/cpufreq branch
>>>>> - pulled in latest patches from linuses tree
>>
>>>> Wei,
>>>> Are those similar to what you had been seeing?
>>
>>>>>
>>>>> I'm experiencing infrequent panics at boot (say 1 out of 10 or 20 boo=
ts), doesn't seem to matter if it's a cold or a warm boot.
>>>>> It always seem to happen during or shortly after booting. When it doe=
sn't occur then, it can run for at least several days/weeks (haven't seen i=
t panic then).
>>>>> It doesn't seem to happen at a particular point at or shortly after b=
ooting, but it happens before starting any guests
>>>>>
>>>>> Unfortunately i haven't had serial console enabled at these times, bu=
t i have made some photo's.
>>>>> The first 3 times it locked completely before being able to print a s=
tacktrace, the 4th time it did (although the photo is a bit unsharp).
>>>>>
>>>>>
>>>>> So all in all, it kind of strange, i hope you can figure something ou=
t from the stacktrace, if not, i will see if i can try with serial console =
attached.
>>>>>
>>>>> --
>>>>> Sander
>>
>>
>>
>>
>>
>>>>> _______________________________________________
>>>>> Xen-devel mailing list
>>>>> Xen-devel@lists.xensource.com
>>>>> http://lists.xensource.com/xen-devel
>>
>>
>>
>>
>>
>>
>>
>>
>>





--=20
Best regards,
 Sander                            mailto:linux@eikelenboom.it
------------11410F255244F390D
Content-Type: text/plain;
 name="serialconsole.txt"
Content-transfer-encoding: base64
Content-Disposition: attachment;
 filename="serialconsole.txt"

IF9fICBfXyAgICAgICAgICAgIF8gIF8gICAgXyAgIF9fX19fICAgICAgICAgICAgIF8gICAg
ICAgICAgICAgICAgICAgDQogXCBcLyAvX19fIF8gX18gICB8IHx8IHwgIC8gfCB8X19fIC8g
ICAgXyBfXyBfX18vIHwgICBfIF9fICBfIF9fIF9fXyANCiAgXCAgLy8gXyBcICdfIFwgIHwg
fHwgfF8gfCB8ICAgfF8gXCBfX3wgJ19fLyBfX3wgfF9ffCAnXyBcfCAnX18vIF8gXA0KICAv
ICBcICBfXy8gfCB8IHwgfF9fICAgX3x8IHxfIF9fXykgfF9ffCB8IHwgKF9ffCB8X198IHxf
KSB8IHwgfCAgX18vDQogL18vXF9cX19ffF98IHxffCAgICB8X3woXylfKF8pX19fXy8gICB8
X3wgIFxfX198X3wgIHwgLl9fL3xffCAgXF9fX3wNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF98ICAgICAgICAgICAgIA0KKFhFTikg
WGVuIHZlcnNpb24gNC4xLjMtcmMxLXByZSAocm9vdEBkeW5kbnMub3JnKSAoZ2NjIHZlcnNp
b24gNC40LjUgKERlYmlhbiA0LjQuNS04KSApIFR1ZSBPY3QgMjUgMTk6MDc6NDQgQ0VTVCAy
MDExDQooWEVOKSBMYXRlc3QgQ2hhbmdlU2V0OiBNb24gT2N0IDI0IDE4OjAzOjM1IDIwMTEg
KzAxMDAgMjMxNzY6ODFlMzlhNDk3OGVhDQooWEVOKSBCb290bG9hZGVyOiBHUlVCIDEuOTgr
MjAxMDA4MDQtMTQrc3F1ZWV6ZTENCihYRU4pIENvbW1hbmQgbGluZTogZG9tMF9tZW09MTAy
NE0gbG9nbHZsPWFsbCBsb2dsdmxfZ3Vlc3Q9YWxsIGNvbnNvbGVfdGltZXN0YW1wcyB2Z2E9
Z2Z4LTEyODB4MTAyNHgzMiBjcHVpZGxlIGNwdWZyZXE9eGVuIG5vcmVib290IGRlYnVnIGxh
cGljPWRlYnVnIGFwaWNfdmVyYm9zaXR5PWRlYnVnIGFwaWM9ZGVidWcgYWNwaV9lbmZvcmNl
X3Jlc291cmNlcz1sYXggaW9tbXU9b24sYW1kLWlvbW11LWRlYnVnIGFtZF9pb21tdT1vbiBh
bWQtaW9tbXUtZGVidWcgY29tMT0xMTUyMDAsOG4xIGNvbnNvbGU9dmdhLGNvbTENCihYRU4p
IFZpZGVvIGluZm9ybWF0aW9uOg0KKFhFTikgIFZHQSBpcyBncmFwaGljcyBtb2RlIDEyODB4
MTAyNCwgMzIgYnBwDQooWEVOKSAgVkJFL0REQyBtZXRob2RzOiBWMjsgRURJRCB0cmFuc2Zl
ciB0aW1lOiAxIHNlY29uZHMNCihYRU4pIERpc2MgaW5mb3JtYXRpb246DQooWEVOKSAgRm91
bmQgMiBNQlIgc2lnbmF0dXJlcw0KKFhFTikgIEZvdW5kIDIgRUREIGluZm9ybWF0aW9uIHN0
cnVjdHVyZXMNCihYRU4pIFhlbi1lODIwIFJBTSBtYXA6DQooWEVOKSAgMDAwMDAwMDAwMDAw
MDAwMCAtIDAwMDAwMDAwMDAwOWYwMDAgKHVzYWJsZSkNCihYRU4pICAwMDAwMDAwMDAwMDlm
MDAwIC0gMDAwMDAwMDAwMDBhMDAwMCAocmVzZXJ2ZWQpDQooWEVOKSAgMDAwMDAwMDAwMDBl
NDAwMCAtIDAwMDAwMDAwMDAxMDAwMDAgKHJlc2VydmVkKQ0KKFhFTikgIDAwMDAwMDAwMDAx
MDAwMDAgLSAwMDAwMDAwMGFmZjkwMDAwICh1c2FibGUpDQooWEVOKSAgMDAwMDAwMDBhZmY5
MDAwMCAtIDAwMDAwMDAwYWZmOWUwMDAgKEFDUEkgZGF0YSkNCihYRU4pICAwMDAwMDAwMGFm
ZjllMDAwIC0gMDAwMDAwMDBhZmZlMDAwMCAoQUNQSSBOVlMpDQooWEVOKSAgMDAwMDAwMDBh
ZmZlMDAwMCAtIDAwMDAwMDAwYjAwMDAwMDAgKHJlc2VydmVkKQ0KKFhFTikgIDAwMDAwMDAw
ZmZlMDAwMDAgLSAwMDAwMDAwMTAwMDAwMDAwIChyZXNlcnZlZCkNCihYRU4pICAwMDAwMDAw
MTAwMDAwMDAwIC0gMDAwMDAwMDI1MDAwMDAwMCAodXNhYmxlKQ0KKFhFTikgQUNQSTogUlNE
UCAwMDBGQjEyMCwgMDAxNCAocjAgQUNQSUFNKQ0KKFhFTikgQUNQSTogUlNEVCBBRkY5MDAw
MCwgMDA0OCAocjEgTVNJICAgIE9FTVNMSUMgIDIwMTAwNjIyIE1TRlQgICAgICAgOTcpDQoo
WEVOKSBBQ1BJOiBGQUNQIEFGRjkwMjAwLCAwMDg0IChyMSA3NjQwTVMgQTc2NDAxMDAgMjAx
MDA2MjIgTVNGVCAgICAgICA5NykNCihYRU4pIEFDUEk6IERTRFQgQUZGOTA1RTAsIDk0NDkg
KHIxICBBNzY0MCBBNzY0MDEwMCAgICAgIDEwMCBJTlRMIDIwMDUxMTE3KQ0KKFhFTikgQUNQ
STogRkFDUyBBRkY5RTAwMCwgMDA0MA0KKFhFTikgQUNQSTogQVBJQyBBRkY5MDM5MCwgMDA4
OCAocjEgNzY0ME1TIEE3NjQwMTAwIDIwMTAwNjIyIE1TRlQgICAgICAgOTcpDQooWEVOKSBB
Q1BJOiBNQ0ZHIEFGRjkwNDIwLCAwMDNDIChyMSA3NjQwTVMgT0VNTUNGRyAgMjAxMDA2MjIg
TVNGVCAgICAgICA5NykNCihYRU4pIEFDUEk6IFNMSUMgQUZGOTA0NjAsIDAxNzYgKHIxIE1T
SSAgICBPRU1TTElDICAyMDEwMDYyMiBNU0ZUICAgICAgIDk3KQ0KKFhFTikgQUNQSTogT0VN
QiBBRkY5RTA0MCwgMDA3MiAocjEgNzY0ME1TIEE3NjQwMTAwIDIwMTAwNjIyIE1TRlQgICAg
ICAgOTcpDQooWEVOKSBBQ1BJOiBTUkFUIEFGRjlBNUUwLCAwMTA4IChyMyBBTUQgICAgRkFN
X0ZfMTAgICAgICAgIDIgQU1EICAgICAgICAgMSkNCihYRU4pIEFDUEk6IEhQRVQgQUZGOUE2
RjAsIDAwMzggKHIxIDc2NDBNUyBPRU1IUEVUICAyMDEwMDYyMiBNU0ZUICAgICAgIDk3KQ0K
KFhFTikgQUNQSTogSVZSUyBBRkY5QTczMCwgMDEwMCAocjEgIEFNRCAgICAgUkQ4OTBTICAg
MjAyMDMxIEFNRCAgICAgICAgIDApDQooWEVOKSBBQ1BJOiBTU0RUIEFGRjlBODMwLCAwREE0
IChyMSBBIE0gSSAgUE9XRVJOT1cgICAgICAgIDEgQU1EICAgICAgICAgMSkNCihYRU4pIFN5
c3RlbSBSQU06IDgxOTFNQiAoODM4Nzc3MmtCKQ0KKFhFTikgU1JBVDogUFhNIDAgLT4gQVBJ
QyAwIC0+IE5vZGUgMA0KKFhFTikgU1JBVDogUFhNIDAgLT4gQVBJQyAxIC0+IE5vZGUgMA0K
KFhFTikgU1JBVDogUFhNIDAgLT4gQVBJQyAyIC0+IE5vZGUgMA0KKFhFTikgU1JBVDogUFhN
IDAgLT4gQVBJQyAzIC0+IE5vZGUgMA0KKFhFTikgU1JBVDogUFhNIDAgLT4gQVBJQyA0IC0+
IE5vZGUgMA0KKFhFTikgU1JBVDogUFhNIDAgLT4gQVBJQyA1IC0+IE5vZGUgMA0KKFhFTikg
U1JBVDogTm9kZSAwIFBYTSAwIDAtYTAwMDANCihYRU4pIFNSQVQ6IE5vZGUgMCBQWE0gMCAx
MDAwMDAtYjAwMDAwMDANCihYRU4pIFNSQVQ6IE5vZGUgMCBQWE0gMCAxMDAwMDAwMDAtMjUw
MDAwMDAwDQooWEVOKSBOVU1BOiBBbGxvY2F0ZWQgbWVtbm9kZW1hcCBmcm9tIDI0ZTAyNzAw
MCAtIDI0ZTAyYTAwMA0KKFhFTikgTlVNQTogVXNpbmcgOCBmb3IgdGhlIGhhc2ggc2hpZnQu
DQooWEVOKSBEb21haW4gaGVhcCBpbml0aWFsaXNlZA0KKFhFTikgdmVzYWZiOiBmcmFtZWJ1
ZmZlciBhdCAweGZiMDAwMDAwLCBtYXBwZWQgdG8gMHhmZmZmODJjMDAwMDAwMDAwLCB1c2lu
ZyA2MTQ0aywgdG90YWwgMTQzMzZrDQooWEVOKSB2ZXNhZmI6IG1vZGUgaXMgMTI4MHgxMDI0
eDMyLCBsaW5lbGVuZ3RoPTUxMjAsIGZvbnQgOHgxNg0KKFhFTikgdmVzYWZiOiBUcnVlY29s
b3I6IHNpemU9ODo4Ojg6OCwgc2hpZnQ9MjQ6MTY6ODowDQooWEVOKSBmb3VuZCBTTVAgTVAt
dGFibGUgYXQgMDAwZmY3ODANCihYRU4pIERNSSBwcmVzZW50Lg0KKFhFTikgQVBJQyBib290
IHN0YXRlIGlzICd4YXBpYycNCihYRU4pIFVzaW5nIEFQSUMgZHJpdmVyIGRlZmF1bHQNCihY
RU4pIEFDUEk6IFBNLVRpbWVyIElPIFBvcnQ6IDB4ODA4DQooWEVOKSBBQ1BJOiBBQ1BJIFNM
RUVQIElORk86IHBtMXhfY250WzgwNCwwXSwgcG0xeF9ldnRbODAwLDBdDQooWEVOKSBBQ1BJ
OiAgICAgICAgICAgICAgICAgIHdha2V1cF92ZWNbYWZmOWUwMGNdLCB2ZWNfc2l6ZVsyMF0N
CihYRU4pIEFDUEk6IExvY2FsIEFQSUMgYWRkcmVzcyAweGZlZTAwMDAwDQooWEVOKSBBQ1BJ
OiBMQVBJQyAoYWNwaV9pZFsweDAxXSBsYXBpY19pZFsweDAwXSBlbmFibGVkKQ0KKFhFTikg
UHJvY2Vzc29yICMwIDA6MTAgQVBJQyB2ZXJzaW9uIDE2DQooWEVOKSBBQ1BJOiBMQVBJQyAo
YWNwaV9pZFsweDAyXSBsYXBpY19pZFsweDAxXSBlbmFibGVkKQ0KKFhFTikgUHJvY2Vzc29y
ICMxIDA6MTAgQVBJQyB2ZXJzaW9uIDE2DQooWEVOKSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsw
eDAzXSBsYXBpY19pZFsweDAyXSBlbmFibGVkKQ0KKFhFTikgUHJvY2Vzc29yICMyIDA6MTAg
QVBJQyB2ZXJzaW9uIDE2DQooWEVOKSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA0XSBsYXBp
Y19pZFsweDAzXSBlbmFibGVkKQ0KKFhFTikgUHJvY2Vzc29yICMzIDA6MTAgQVBJQyB2ZXJz
aW9uIDE2DQooWEVOKSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA1XSBsYXBpY19pZFsweDA0
XSBlbmFibGVkKQ0KKFhFTikgUHJvY2Vzc29yICM0IDA6MTAgQVBJQyB2ZXJzaW9uIDE2DQoo
WEVOKSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA2XSBsYXBpY19pZFsweDA1XSBlbmFibGVk
KQ0KKFhFTikgUHJvY2Vzc29yICM1IDA6MTAgQVBJQyB2ZXJzaW9uIDE2DQooWEVOKSBBQ1BJ
OiBJT0FQSUMgKGlkWzB4MDZdIGFkZHJlc3NbMHhmZWMwMDAwMF0gZ3NpX2Jhc2VbMF0pDQoo
WEVOKSBJT0FQSUNbMF06IGFwaWNfaWQgNiwgdmVyc2lvbiAzMywgYWRkcmVzcyAweGZlYzAw
MDAwLCBHU0kgMC0yMw0KKFhFTikgQUNQSTogSU9BUElDIChpZFsweDA3XSBhZGRyZXNzWzB4
ZmVjMjAwMDBdIGdzaV9iYXNlWzI0XSkNCihYRU4pIElPQVBJQ1sxXTogYXBpY19pZCA3LCB2
ZXJzaW9uIDMzLCBhZGRyZXNzIDB4ZmVjMjAwMDAsIEdTSSAyNC01NQ0KKFhFTikgQUNQSTog
SU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19pcnEgMCBnbG9iYWxfaXJxIDIgZGZsIGRmbCkNCihY
RU4pIEFDUEk6IElOVF9TUkNfT1ZSIChidXMgMCBidXNfaXJxIDkgZ2xvYmFsX2lycSA5IGxv
dyBsZXZlbCkNCihYRU4pIEFDUEk6IElSUTAgdXNlZCBieSBvdmVycmlkZS4NCihYRU4pIEFD
UEk6IElSUTIgdXNlZCBieSBvdmVycmlkZS4NCihYRU4pIEFDUEk6IElSUTkgdXNlZCBieSBv
dmVycmlkZS4NCihYRU4pIEVuYWJsaW5nIEFQSUMgbW9kZTogIEZsYXQuICBVc2luZyAyIEkv
TyBBUElDcw0KKFhFTikgQUNQSTogSFBFVCBpZDogMHg4MzAwIGJhc2U6IDB4ZmVkMDAwMDAN
CihYRU4pIFBDSTogTUNGRyBjb25maWd1cmF0aW9uIDA6IGJhc2UgZTAwMDAwMDAgc2VnbWVu
dCAwIGJ1c2VzIDAgLSAyNTUNCihYRU4pIFBDSTogTm90IHVzaW5nIE1NQ09ORklHLg0KKFhF
TikgVGFibGUgaXMgbm90IGZvdW5kIQ0KKFhFTikgVXNpbmcgQUNQSSAoTUFEVCkgZm9yIFNN
UCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uDQooWEVOKSBtYXBwZWQgQVBJQyB0byBmZmZm
ODJjM2ZmZmZlMDAwIChmZWUwMDAwMCkNCihYRU4pIG1hcHBlZCBJT0FQSUMgdG8gZmZmZjgy
YzNmZmZmZDAwMCAoZmVjMDAwMDApDQooWEVOKSBtYXBwZWQgSU9BUElDIHRvIGZmZmY4MmMz
ZmZmZmMwMDAgKGZlYzIwMDAwKQ0KKFhFTikgSVJRIGxpbWl0czogNTYgR1NJLCAxMTEyIE1T
SS9NU0ktWA0KKFhFTikgVXNpbmcgc2NoZWR1bGVyOiBTTVAgQ3JlZGl0IFNjaGVkdWxlciAo
Y3JlZGl0KQ0KKFhFTikgRGV0ZWN0ZWQgMzIwMC4xNjUgTUh6IHByb2Nlc3Nvci4NCihYRU4p
IEluaXRpbmcgbWVtb3J5IHNoYXJpbmcuDQooWEVOKSBBTUQgRmFtMTBoIG1hY2hpbmUgY2hl
Y2sgcmVwb3J0aW5nIGVuYWJsZWQNCihYRU4pIEFNRC1WaTogRm91bmQgTVNJIGNhcGFiaWxp
dHkgYmxvY2sgDQooWEVOKSBBTUQtVmk6IEFDUEkgVGFibGU6DQooWEVOKSBBTUQtVmk6ICBT
aWduYXR1cmUgSVZSUw0KKFhFTikgQU1ELVZpOiAgTGVuZ3RoIDB4MTAwDQooWEVOKSBBTUQt
Vmk6ICBSZXZpc2lvbiAweDENCihYRU4pIEFNRC1WaTogIENoZWNrU3VtIDB4YzMNCihYRU4p
IEFNRC1WaTogIE9FTV9JZCBBTUQgIA0KKFhFTikgQU1ELVZpOiAgT0VNX1RhYmxlX0lkIFJE
ODkwUw0KKFhFTikgQU1ELVZpOiAgT0VNX1JldmlzaW9uIDB4MjAyMDMxDQooWEVOKSBBTUQt
Vmk6ICBDcmVhdG9yX0lkIEFNRCANCihYRU4pIEFNRC1WaTogIENyZWF0b3JfUmV2aXNpb24g
MHgwDQooWEVOKSBBTUQtVmk6IElWUlMgQmxvY2s6DQooWEVOKSBBTUQtVmk6ICBUeXBlIDB4
MTANCihYRU4pIEFNRC1WaTogIEZsYWdzIDB4M2UNCihYRU4pIEFNRC1WaTogIExlbmd0aCAw
eGQwDQooWEVOKSBBTUQtVmk6ICBEZXZfSWQgMHgyDQooWEVOKSBBTUQtVmk6IElWSEQgRGV2
aWNlIEVudHJ5Og0KKFhFTikgQU1ELVZpOiAgVHlwZSAweDMNCihYRU4pIEFNRC1WaTogIERl
dl9JZCAweDANCihYRU4pIEFNRC1WaTogIEZsYWdzIDB4MA0KKFhFTikgQU1ELVZpOiAgRGV2
X0lkIFJhbmdlOiAweDAgLT4gMHgyDQooWEVOKSBBTUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5
Og0KKFhFTikgQU1ELVZpOiAgVHlwZSAweDINCihYRU4pIEFNRC1WaTogIERldl9JZCAweDEw
DQooWEVOKSBBTUQtVmk6ICBGbGFncyAweDANCihYRU4pIEFNRC1WaTogSVZIRCBEZXZpY2Ug
RW50cnk6DQooWEVOKSBBTUQtVmk6ICBUeXBlIDB4Mg0KKFhFTikgQU1ELVZpOiAgRGV2X0lk
IDB4YjAwDQooWEVOKSBBTUQtVmk6ICBGbGFncyAweDANCihYRU4pIEFNRC1WaTogSVZIRCBE
ZXZpY2UgRW50cnk6DQooWEVOKSBBTUQtVmk6ICBUeXBlIDB4Mg0KKFhFTikgQU1ELVZpOiAg
RGV2X0lkIDB4MTgNCihYRU4pIEFNRC1WaTogIEZsYWdzIDB4MA0KKFhFTikgQU1ELVZpOiBJ
VkhEIERldmljZSBFbnRyeToNCihYRU4pIEFNRC1WaTogIFR5cGUgMHgzDQooWEVOKSBBTUQt
Vmk6ICBEZXZfSWQgMHhhMDANCihYRU4pIEFNRC1WaTogIEZsYWdzIDB4MA0KKFhFTikgQU1E
LVZpOiAgRGV2X0lkIFJhbmdlOiAweGEwMCAtPiAweGEwNw0KKFhFTikgQU1ELVZpOiBJVkhE
IERldmljZSBFbnRyeToNCihYRU4pIEFNRC1WaTogIFR5cGUgMHgyDQooWEVOKSBBTUQtVmk6
ICBEZXZfSWQgMHgyOA0KKFhFTikgQU1ELVZpOiAgRmxhZ3MgMHgwDQooWEVOKSBBTUQtVmk6
IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhFTikgQU1ELVZpOiAgVHlwZSAweDINCihYRU4pIEFN
RC1WaTogIERldl9JZCAweDkwMA0KKFhFTikgQU1ELVZpOiAgRmxhZ3MgMHgwDQooWEVOKSBB
TUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhFTikgQU1ELVZpOiAgVHlwZSAweDINCihY
RU4pIEFNRC1WaTogIERldl9JZCAweDMwDQooWEVOKSBBTUQtVmk6ICBGbGFncyAweDANCihY
RU4pIEFNRC1WaTogSVZIRCBEZXZpY2UgRW50cnk6DQooWEVOKSBBTUQtVmk6ICBUeXBlIDB4
Mg0KKFhFTikgQU1ELVZpOiAgRGV2X0lkIDB4ODAwDQooWEVOKSBBTUQtVmk6ICBGbGFncyAw
eDANCihYRU4pIEFNRC1WaTogSVZIRCBEZXZpY2UgRW50cnk6DQooWEVOKSBBTUQtVmk6ICBU
eXBlIDB4Mg0KKFhFTikgQU1ELVZpOiAgRGV2X0lkIDB4NTANCihYRU4pIEFNRC1WaTogIEZs
YWdzIDB4MA0KKFhFTikgQU1ELVZpOiBJVkhEIERldmljZSBFbnRyeToNCihYRU4pIEFNRC1W
aTogIFR5cGUgMHgyDQooWEVOKSBBTUQtVmk6ICBEZXZfSWQgMHg2MDANCihYRU4pIEFNRC1W
aTogIEZsYWdzIDB4MA0KKFhFTikgQU1ELVZpOiBJVkhEIERldmljZSBFbnRyeToNCihYRU4p
IEFNRC1WaTogIFR5cGUgMHgwDQooWEVOKSBBTUQtVmk6ICBEZXZfSWQgMHgwDQooWEVOKSBB
TUQtVmk6ICBGbGFncyAweDANCihYRU4pIEFNRC1WaTogSVZIRCBEZXZpY2UgRW50cnk6DQoo
WEVOKSBBTUQtVmk6ICBUeXBlIDB4NDMNCihYRU4pIEFNRC1WaTogIERldl9JZCAweDcwOA0K
KFhFTikgQU1ELVZpOiAgRmxhZ3MgMHgwDQooWEVOKSBBTUQtVmk6ICBEZXZfSWQgUmFuZ2U6
IDB4NzA4IC0+IDB4N2ZmDQooWEVOKSBBTUQtVmk6ICBEZXZfSWQgQWxpYXM6IDB4NzAwDQoo
WEVOKSBBTUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhFTikgQU1ELVZpOiAgVHlwZSAw
eDINCihYRU4pIEFNRC1WaTogIERldl9JZCAweDU4DQooWEVOKSBBTUQtVmk6ICBGbGFncyAw
eDANCihYRU4pIEFNRC1WaTogSVZIRCBEZXZpY2UgRW50cnk6DQooWEVOKSBBTUQtVmk6ICBU
eXBlIDB4Mw0KKFhFTikgQU1ELVZpOiAgRGV2X0lkIDB4NTAwDQooWEVOKSBBTUQtVmk6ICBG
bGFncyAweDANCihYRU4pIEFNRC1WaTogIERldl9JZCBSYW5nZTogMHg1MDAgLT4gMHg1MDEN
CihYRU4pIEFNRC1WaTogSVZIRCBEZXZpY2UgRW50cnk6DQooWEVOKSBBTUQtVmk6ICBUeXBl
IDB4Mg0KKFhFTikgQU1ELVZpOiAgRGV2X0lkIDB4NjgNCihYRU4pIEFNRC1WaTogIEZsYWdz
IDB4MA0KKFhFTikgQU1ELVZpOiBJVkhEIERldmljZSBFbnRyeToNCihYRU4pIEFNRC1WaTog
IFR5cGUgMHgzDQooWEVOKSBBTUQtVmk6ICBEZXZfSWQgMHg0MDANCihYRU4pIEFNRC1WaTog
IEZsYWdzIDB4MA0KKFhFTikgQU1ELVZpOiAgRGV2X0lkIFJhbmdlOiAweDQwMCAtPiAweDQw
Nw0KKFhFTikgQU1ELVZpOiBJVkhEIERldmljZSBFbnRyeToNCihYRU4pIEFNRC1WaTogIFR5
cGUgMHgyDQooWEVOKSBBTUQtVmk6ICBEZXZfSWQgMHg4OA0KKFhFTikgQU1ELVZpOiAgRmxh
Z3MgMHgwDQooWEVOKSBBTUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhFTikgQU1ELVZp
OiAgVHlwZSAweDMNCihYRU4pIEFNRC1WaTogIERldl9JZCAweDkwDQooWEVOKSBBTUQtVmk6
ICBGbGFncyAweDANCihYRU4pIEFNRC1WaTogIERldl9JZCBSYW5nZTogMHg5MCAtPiAweDky
DQooWEVOKSBBTUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhFTikgQU1ELVZpOiAgVHlw
ZSAweDMNCihYRU4pIEFNRC1WaTogIERldl9JZCAweDk4DQooWEVOKSBBTUQtVmk6ICBGbGFn
cyAweDANCihYRU4pIEFNRC1WaTogIERldl9JZCBSYW5nZTogMHg5OCAtPiAweDlhDQooWEVO
KSBBTUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhFTikgQU1ELVZpOiAgVHlwZSAweDIN
CihYRU4pIEFNRC1WaTogIERldl9JZCAweGEwDQooWEVOKSBBTUQtVmk6ICBGbGFncyAweGQ3
DQooWEVOKSBBTUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhFTikgQU1ELVZpOiAgVHlw
ZSAweDINCihYRU4pIEFNRC1WaTogIERldl9JZCAweGExDQooWEVOKSBBTUQtVmk6ICBGbGFn
cyAweDANCihYRU4pIEFNRC1WaTogSVZIRCBEZXZpY2UgRW50cnk6DQooWEVOKSBBTUQtVmk6
ICBUeXBlIDB4Mg0KKFhFTikgQU1ELVZpOiAgRGV2X0lkIDB4YTMNCihYRU4pIEFNRC1WaTog
IEZsYWdzIDB4MA0KKFhFTikgQU1ELVZpOiBJVkhEIERldmljZSBFbnRyeToNCihYRU4pIEFN
RC1WaTogIFR5cGUgMHgyDQooWEVOKSBBTUQtVmk6ICBEZXZfSWQgMHhhNA0KKFhFTikgQU1E
LVZpOiAgRmxhZ3MgMHgwDQooWEVOKSBBTUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhF
TikgQU1ELVZpOiAgVHlwZSAweDQzDQooWEVOKSBBTUQtVmk6ICBEZXZfSWQgMHgzMDANCihY
RU4pIEFNRC1WaTogIEZsYWdzIDB4MA0KKFhFTikgQU1ELVZpOiAgRGV2X0lkIFJhbmdlOiAw
eDMwMCAtPiAweDNmZg0KKFhFTikgQU1ELVZpOiAgRGV2X0lkIEFsaWFzOiAweGE0DQooWEVO
KSBBTUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhFTikgQU1ELVZpOiAgVHlwZSAweDIN
CihYRU4pIEFNRC1WaTogIERldl9JZCAweGE1DQooWEVOKSBBTUQtVmk6ICBGbGFncyAweDAN
CihYRU4pIEFNRC1WaTogSVZIRCBEZXZpY2UgRW50cnk6DQooWEVOKSBBTUQtVmk6ICBUeXBl
IDB4Mg0KKFhFTikgQU1ELVZpOiAgRGV2X0lkIDB4YTgNCihYRU4pIEFNRC1WaTogIEZsYWdz
IDB4MA0KKFhFTikgQU1ELVZpOiBJVkhEIERldmljZSBFbnRyeToNCihYRU4pIEFNRC1WaTog
IFR5cGUgMHgyDQooWEVOKSBBTUQtVmk6ICBEZXZfSWQgMHhhOQ0KKFhFTikgQU1ELVZpOiAg
RmxhZ3MgMHgwDQooWEVOKSBBTUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhFTikgQU1E
LVZpOiAgVHlwZSAweDINCihYRU4pIEFNRC1WaTogIERldl9JZCAweDEwMA0KKFhFTikgQU1E
LVZpOiAgRmxhZ3MgMHgwDQooWEVOKSBBTUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhF
TikgQU1ELVZpOiAgVHlwZSAweDMNCihYRU4pIEFNRC1WaTogIERldl9JZCAweGIwDQooWEVO
KSBBTUQtVmk6ICBGbGFncyAweDANCihYRU4pIEFNRC1WaTogIERldl9JZCBSYW5nZTogMHhi
MCAtPiAweGIyDQooWEVOKSBBTUQtVmk6IElWSEQgRGV2aWNlIEVudHJ5Og0KKFhFTikgQU1E
LVZpOiAgVHlwZSAweDANCihYRU4pIEFNRC1WaTogIERldl9JZCAweDANCihYRU4pIEFNRC1W
aTogIEZsYWdzIDB4MA0KKFhFTikgQU1ELVZpOiBJVkhEIERldmljZSBFbnRyeToNCihYRU4p
IEFNRC1WaTogIFR5cGUgMHg0OA0KKFhFTikgQU1ELVZpOiAgRGV2X0lkIDB4MA0KKFhFTikg
QU1ELVZpOiAgRmxhZ3MgMHhkNw0KKFhFTikgQU1ELVZpOiBJVkhEIERldmljZSBFbnRyeToN
CihYRU4pIEFNRC1WaTogIFR5cGUgMHg0OA0KKFhFTikgQU1ELVZpOiAgRGV2X0lkIDB4MA0K
KFhFTikgQU1ELVZpOiAgRmxhZ3MgMHgwDQooWEVOKSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFi
bGUgZW50cnk6IGRldmljZSBpZCA9IDB4MDAwMCwgaW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAw
NDAwMA0KKFhFTikgQU1ELVZpOiBBZGQgZGV2aWNlIHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQg
PSAweDAwMDEsIGludGVydXB0IHRhYmxlID0gMHgyNGUwMDQwMDANCihYRU4pIEFNRC1WaTog
QWRkIGRldmljZSB0YWJsZSBlbnRyeTogZGV2aWNlIGlkID0gMHgwMDAyLCBpbnRlcnVwdCB0
YWJsZSA9IDB4MjRlMDA0MDAwDQooWEVOKSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFibGUgZW50
cnk6IGRldmljZSBpZCA9IDB4MDAxMCwgaW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0K
KFhFTikgQU1ELVZpOiBBZGQgZGV2aWNlIHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQgPSAweDAw
MTgsIGludGVydXB0IHRhYmxlID0gMHgyNGUwMDQwMDANCihYRU4pIEFNRC1WaTogQWRkIGRl
dmljZSB0YWJsZSBlbnRyeTogZGV2aWNlIGlkID0gMHgwMDI4LCBpbnRlcnVwdCB0YWJsZSA9
IDB4MjRlMDA0MDAwDQooWEVOKSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFibGUgZW50cnk6IGRl
dmljZSBpZCA9IDB4MDAzMCwgaW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0KKFhFTikg
QU1ELVZpOiBBZGQgZGV2aWNlIHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQgPSAweDAwNTAsIGlu
dGVydXB0IHRhYmxlID0gMHgyNGUwMDQwMDANCihYRU4pIEFNRC1WaTogQWRkIGRldmljZSB0
YWJsZSBlbnRyeTogZGV2aWNlIGlkID0gMHgwMDU4LCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRl
MDA0MDAwDQooWEVOKSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFibGUgZW50cnk6IGRldmljZSBp
ZCA9IDB4MDA2OCwgaW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0KKFhFTikgQU1ELVZp
OiBBZGQgZGV2aWNlIHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQgPSAweDAwODgsIGludGVydXB0
IHRhYmxlID0gMHgyNGUwMDQwMDANCihYRU4pIEFNRC1WaTogQWRkIGRldmljZSB0YWJsZSBl
bnRyeTogZGV2aWNlIGlkID0gMHgwMDkwLCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRlMDA0MDAw
DQooWEVOKSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFibGUgZW50cnk6IGRldmljZSBpZCA9IDB4
MDA5MSwgaW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0KKFhFTikgQU1ELVZpOiBBZGQg
ZGV2aWNlIHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQgPSAweDAwOTIsIGludGVydXB0IHRhYmxl
ID0gMHgyNGUwMDQwMDANCihYRU4pIEFNRC1WaTogQWRkIGRldmljZSB0YWJsZSBlbnRyeTog
ZGV2aWNlIGlkID0gMHgwMDk4LCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRlMDA0MDAwDQooWEVO
KSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFibGUgZW50cnk6IGRldmljZSBpZCA9IDB4MDA5OSwg
aW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0KKFhFTikgQU1ELVZpOiBBZGQgZGV2aWNl
IHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQgPSAweDAwOWEsIGludGVydXB0IHRhYmxlID0gMHgy
NGUwMDQwMDANCihYRU4pIEFNRC1WaTogQWRkIGRldmljZSB0YWJsZSBlbnRyeTogZGV2aWNl
IGlkID0gMHgwMGEwLCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRlMDA0MDAwDQooWEVOKSBBTUQt
Vmk6IEFkZCBkZXZpY2UgdGFibGUgZW50cnk6IGRldmljZSBpZCA9IDB4MDBhMSwgaW50ZXJ1
cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0KKFhFTikgQU1ELVZpOiBBZGQgZGV2aWNlIHRhYmxl
IGVudHJ5OiBkZXZpY2UgaWQgPSAweDAwYTMsIGludGVydXB0IHRhYmxlID0gMHgyNGUwMDQw
MDANCihYRU4pIEFNRC1WaTogQWRkIGRldmljZSB0YWJsZSBlbnRyeTogZGV2aWNlIGlkID0g
MHgwMGE0LCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRlMDA0MDAwDQooWEVOKSBBTUQtVmk6IEFk
ZCBkZXZpY2UgdGFibGUgZW50cnk6IGRldmljZSBpZCA9IDB4MDBhNSwgaW50ZXJ1cHQgdGFi
bGUgPSAweDI0ZTAwNDAwMA0KKFhFTikgQU1ELVZpOiBBZGQgZGV2aWNlIHRhYmxlIGVudHJ5
OiBkZXZpY2UgaWQgPSAweDAwYTgsIGludGVydXB0IHRhYmxlID0gMHgyNGUwMDQwMDANCihY
RU4pIEFNRC1WaTogQWRkIGRldmljZSB0YWJsZSBlbnRyeTogZGV2aWNlIGlkID0gMHgwMGE5
LCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRlMDA0MDAwDQooWEVOKSBBTUQtVmk6IEFkZCBkZXZp
Y2UgdGFibGUgZW50cnk6IGRldmljZSBpZCA9IDB4MDBiMCwgaW50ZXJ1cHQgdGFibGUgPSAw
eDI0ZTAwNDAwMA0KKFhFTikgQU1ELVZpOiBBZGQgZGV2aWNlIHRhYmxlIGVudHJ5OiBkZXZp
Y2UgaWQgPSAweDAwYjEsIGludGVydXB0IHRhYmxlID0gMHgyNGUwMDQwMDANCihYRU4pIEFN
RC1WaTogQWRkIGRldmljZSB0YWJsZSBlbnRyeTogZGV2aWNlIGlkID0gMHgwMGIyLCBpbnRl
cnVwdCB0YWJsZSA9IDB4MjRlMDA0MDAwDQooWEVOKSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFi
bGUgZW50cnk6IGRldmljZSBpZCA9IDB4MDEwMCwgaW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAw
NDAwMA0KKFhFTikgQU1ELVZpOiBBZGQgZGV2aWNlIHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQg
PSAweDA0MDAsIGludGVydXB0IHRhYmxlID0gMHgyNGUwMDQwMDANCihYRU4pIEFNRC1WaTog
QWRkIGRldmljZSB0YWJsZSBlbnRyeTogZGV2aWNlIGlkID0gMHgwNDAxLCBpbnRlcnVwdCB0
YWJsZSA9IDB4MjRlMDA0MDAwDQooWEVOKSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFibGUgZW50
cnk6IGRldmljZSBpZCA9IDB4MDQwMiwgaW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0K
KFhFTikgQU1ELVZpOiBBZGQgZGV2aWNlIHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQgPSAweDA0
MDMsIGludGVydXB0IHRhYmxlID0gMHgyNGUwMDQwMDANCihYRU4pIEFNRC1WaTogQWRkIGRl
dmljZSB0YWJsZSBlbnRyeTogZGV2aWNlIGlkID0gMHgwNDA0LCBpbnRlcnVwdCB0YWJsZSA9
IDB4MjRlMDA0MDAwDQooWEVOKSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFibGUgZW50cnk6IGRl
dmljZSBpZCA9IDB4MDQwNSwgaW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0KKFhFTikg
QU1ELVZpOiBBZGQgZGV2aWNlIHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQgPSAweDA0MDYsIGlu
dGVydXB0IHRhYmxlID0gMHgyNGUwMDQwMDANCihYRU4pIEFNRC1WaTogQWRkIGRldmljZSB0
YWJsZSBlbnRyeTogZGV2aWNlIGlkID0gMHgwNDA3LCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRl
MDA0MDAwDQooWEVOKSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFibGUgZW50cnk6IGRldmljZSBp
ZCA9IDB4MDUwMCwgaW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0KKFhFTikgQU1ELVZp
OiBBZGQgZGV2aWNlIHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQgPSAweDA1MDEsIGludGVydXB0
IHRhYmxlID0gMHgyNGUwMDQwMDANCihYRU4pIEFNRC1WaTogQWRkIGRldmljZSB0YWJsZSBl
bnRyeTogZGV2aWNlIGlkID0gMHgwNjAwLCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRlMDA0MDAw
DQooWEVOKSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFibGUgZW50cnk6IGRldmljZSBpZCA9IDB4
MDcwMCwgaW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0KKFhFTikgQU1ELVZpOiBBZGQg
ZGV2aWNlIHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQgPSAweDA4MDAsIGludGVydXB0IHRhYmxl
ID0gMHgyNGUwMDQwMDANCihYRU4pIEFNRC1WaTogQWRkIGRldmljZSB0YWJsZSBlbnRyeTog
ZGV2aWNlIGlkID0gMHgwOTAwLCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRlMDA0MDAwDQooWEVO
KSBBTUQtVmk6IEFkZCBkZXZpY2UgdGFibGUgZW50cnk6IGRldmljZSBpZCA9IDB4MGEwMCwg
aW50ZXJ1cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0KKFhFTikgQU1ELVZpOiBBZGQgZGV2aWNl
IHRhYmxlIGVudHJ5OiBkZXZpY2UgaWQgPSAweDBhMDEsIGludGVydXB0IHRhYmxlID0gMHgy
NGUwMDQwMDANCihYRU4pIEFNRC1WaTogQWRkIGRldmljZSB0YWJsZSBlbnRyeTogZGV2aWNl
IGlkID0gMHgwYTAyLCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRlMDA0MDAwDQooWEVOKSBBTUQt
Vmk6IEFkZCBkZXZpY2UgdGFibGUgZW50cnk6IGRldmljZSBpZCA9IDB4MGEwMywgaW50ZXJ1
cHQgdGFibGUgPSAweDI0ZTAwNDAwMA0KKFhFTikgQU1ELVZpOiBBZGQgZGV2aWNlIHRhYmxl
IGVudHJ5OiBkZXZpY2UgaWQgPSAweDBhMDQsIGludGVydXB0IHRhYmxlID0gMHgyNGUwMDQw
MDANCihYRU4pIEFNRC1WaTogQWRkIGRldmljZSB0YWJsZSBlbnRyeTogZGV2aWNlIGlkID0g
MHgwYTA1LCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRlMDA0MDAwDQooWEVOKSBBTUQtVmk6IEFk
ZCBkZXZpY2UgdGFibGUgZW50cnk6IGRldmljZSBpZCA9IDB4MGEwNiwgaW50ZXJ1cHQgdGFi
bGUgPSAweDI0ZTAwNDAwMA0KKFhFTikgQU1ELVZpOiBBZGQgZGV2aWNlIHRhYmxlIGVudHJ5
OiBkZXZpY2UgaWQgPSAweDBhMDcsIGludGVydXB0IHRhYmxlID0gMHgyNGUwMDQwMDANCihY
RU4pIEFNRC1WaTogQWRkIGRldmljZSB0YWJsZSBlbnRyeTogZGV2aWNlIGlkID0gMHgwYjAw
LCBpbnRlcnVwdCB0YWJsZSA9IDB4MjRlMDA0MDAwDQooWEVOKSBBTUQtVmk6IElPTU1VIDAg
RW5hYmxlZC4NCihYRU4pIEFNRC1WaTogRW5hYmxpbmcgZ2xvYmFsIHZlY3RvciBtYXANCihY
RU4pIEkvTyB2aXJ0dWFsaXNhdGlvbiBlbmFibGVkDQooWEVOKSAgLSBEb20wIG1vZGU6IFJl
bGF4ZWQNCihYRU4pIEdldHRpbmcgVkVSU0lPTjogODAwNTAwMTANCihYRU4pIEdldHRpbmcg
VkVSU0lPTjogODAwNTAwMTANCihYRU4pIEdldHRpbmcgSUQ6IDANCihYRU4pIEdldHRpbmcg
TFZUMDogNzAwDQooWEVOKSBHZXR0aW5nIExWVDE6IDQwMA0KKFhFTikgZW5hYmxlZCBFeHRJ
TlQgb24gQ1BVIzANCihYRU4pIEVTUiB2YWx1ZSBiZWZvcmUgZW5hYmxpbmcgdmVjdG9yOiAw
eDAwMDAwMDA0ICBhZnRlcjogMHgwMDAwMDAwMA0KKFhFTikgRU5BQkxJTkcgSU8tQVBJQyBJ
UlFzDQooWEVOKSAgLT4gVXNpbmcgbmV3IEFDSyBtZXRob2QNCihYRU4pIGluaXQgSU9fQVBJ
QyBJUlFzDQooWEVOKSAgSU8tQVBJQyAoYXBpY2lkLXBpbikgNi0wLCA2LTE2LCA2LTE3LCA2
LTE4LCA2LTE5LCA2LTIwLCA2LTIxLCA2LTIyLCA2LTIzLCA3LTAsIDctMSwgNy0yLCA3LTMs
IDctNCwgNy01LCA3LTYsIDctNywgNy04LCA3LTksIDctMTAsIDctMTEsIDctMTIsIDctMTMs
IDctMTQsIDctMTUsIDctMTYsIDctMTcsIDctMTgsIDctMTksIDctMjAsIDctMjEsIDctMjIs
IDctMjMsIDctMjQsIDctMjUsIDctMjYsIDctMjcsIDctMjgsIDctMjksIDctMzAsIDctMzEg
bm90IGNvbm5lY3RlZC4NCihYRU4pIC4uVElNRVI6IHZlY3Rvcj0weEYwIGFwaWMxPTAgcGlu
MT0yIGFwaWMyPS0xIHBpbjI9LTENCihYRU4pIG51bWJlciBvZiBNUCBJUlEgc291cmNlczog
MTUuDQooWEVOKSBudW1iZXIgb2YgSU8tQVBJQyAjNiByZWdpc3RlcnM6IDI0Lg0KKFhFTikg
bnVtYmVyIG9mIElPLUFQSUMgIzcgcmVnaXN0ZXJzOiAzMi4NCihYRU4pIHRlc3RpbmcgdGhl
IElPIEFQSUMuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLg0KKFhFTikgSU8gQVBJQyAjNi4uLi4u
Lg0KKFhFTikgLi4uLiByZWdpc3RlciAjMDA6IDA2MDAwMDAwDQooWEVOKSAuLi4uLi4uICAg
IDogcGh5c2ljYWwgQVBJQyBpZDogMDYNCihYRU4pIC4uLi4uLi4gICAgOiBEZWxpdmVyeSBU
eXBlOiAwDQooWEVOKSAuLi4uLi4uICAgIDogTFRTICAgICAgICAgIDogMA0KKFhFTikgLi4u
LiByZWdpc3RlciAjMDE6IDAwMTc4MDIxDQooWEVOKSAuLi4uLi4uICAgICA6IG1heCByZWRp
cmVjdGlvbiBlbnRyaWVzOiAwMDE3DQooWEVOKSAuLi4uLi4uICAgICA6IFBSUSBpbXBsZW1l
bnRlZDogMQ0KKFhFTikgLi4uLi4uLiAgICAgOiBJTyBBUElDIHZlcnNpb246IDAwMjENCihY
RU4pIC4uLi4gcmVnaXN0ZXIgIzAyOiAwNjAwMDAwMA0KKFhFTikgLi4uLi4uLiAgICAgOiBh
cmJpdHJhdGlvbjogMDYNCihYRU4pIC4uLi4gcmVnaXN0ZXIgIzAzOiAwNzAwMDAwMA0KKFhF
TikgLi4uLi4uLiAgICAgOiBCb290IERUICAgIDogMA0KKFhFTikgLi4uLiBJUlEgcmVkaXJl
Y3Rpb24gdGFibGU6DQooWEVOKSAgTlIgTG9nIFBoeSBNYXNrIFRyaWcgSVJSIFBvbCBTdGF0
IERlc3QgRGVsaSBWZWN0OiAgIA0KKFhFTikgIDAwIDAwMCAwMCAgMSAgICAwICAgIDAgICAw
ICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAwMSAwMDEgMDEgIDAgICAgMCAgICAwICAg
MCAgIDAgICAgMSAgICAxICAgIDMwDQooWEVOKSAgMDIgMDAxIDAxICAwICAgIDAgICAgMCAg
IDAgICAwICAgIDEgICAgMSAgICBGMA0KKFhFTikgIDAzIDAwMSAwMSAgMCAgICAwICAgIDAg
ICAwICAgMCAgICAxICAgIDEgICAgMzgNCihYRU4pICAwNCAwMDEgMDEgIDAgICAgMCAgICAw
ICAgMCAgIDAgICAgMSAgICAxICAgIEYxDQooWEVOKSAgMDUgMDAxIDAxICAwICAgIDAgICAg
MCAgIDAgICAwICAgIDEgICAgMSAgICA0MA0KKFhFTikgIDA2IDAwMSAwMSAgMCAgICAwICAg
IDAgICAwICAgMCAgICAxICAgIDEgICAgNDgNCihYRU4pICAwNyAwMDEgMDEgIDAgICAgMCAg
ICAwICAgMCAgIDAgICAgMSAgICAxICAgIDUwDQooWEVOKSAgMDggMDAxIDAxICAwICAgIDAg
ICAgMCAgIDAgICAwICAgIDEgICAgMSAgICA1OA0KKFhFTikgIDA5IDAwMSAwMSAgMSAgICAx
ICAgIDAgICAxICAgMCAgICAxICAgIDEgICAgNjANCihYRU4pICAwYSAwMDEgMDEgIDAgICAg
MCAgICAwICAgMCAgIDAgICAgMSAgICAxICAgIDY4DQooWEVOKSAgMGIgMDAxIDAxICAwICAg
IDAgICAgMCAgIDAgICAwICAgIDEgICAgMSAgICA3MA0KKFhFTikgIDBjIDAwMSAwMSAgMCAg
ICAwICAgIDAgICAwICAgMCAgICAxICAgIDEgICAgNzgNCihYRU4pICAwZCAwMDEgMDEgIDAg
ICAgMCAgICAwICAgMCAgIDAgICAgMSAgICAxICAgIDg4DQooWEVOKSAgMGUgMDAxIDAxICAw
ICAgIDAgICAgMCAgIDAgICAwICAgIDEgICAgMSAgICA5MA0KKFhFTikgIDBmIDAwMSAwMSAg
MCAgICAwICAgIDAgICAwICAgMCAgICAxICAgIDEgICAgOTgNCihYRU4pICAxMCAwMDAgMDAg
IDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMTEgMDAwIDAw
ICAxICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDEyIDAwMCAw
MCAgMSAgICAwICAgIDAgICAwICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAxMyAwMDAg
MDAgIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMTQgMDAw
IDAwICAxICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDE1IDAw
MCAwMCAgMSAgICAwICAgIDAgICAwICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAxNiAw
MDAgMDAgIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMTcg
MDAwIDAwICAxICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgSU8g
QVBJQyAjNy4uLi4uLg0KKFhFTikgLi4uLiByZWdpc3RlciAjMDA6IDA3MDAwMDAwDQooWEVO
KSAuLi4uLi4uICAgIDogcGh5c2ljYWwgQVBJQyBpZDogMDcNCihYRU4pIC4uLi4uLi4gICAg
OiBEZWxpdmVyeSBUeXBlOiAwDQooWEVOKSAuLi4uLi4uICAgIDogTFRTICAgICAgICAgIDog
MA0KKFhFTikgLi4uLiByZWdpc3RlciAjMDE6IDAwMUY4MDIxDQooWEVOKSAuLi4uLi4uICAg
ICA6IG1heCByZWRpcmVjdGlvbiBlbnRyaWVzOiAwMDFGDQooWEVOKSAuLi4uLi4uICAgICA6
IFBSUSBpbXBsZW1lbnRlZDogMQ0KKFhFTikgLi4uLi4uLiAgICAgOiBJTyBBUElDIHZlcnNp
b246IDAwMjENCihYRU4pIC4uLi4gcmVnaXN0ZXIgIzAyOiAwMDAwMDAwMA0KKFhFTikgLi4u
Li4uLiAgICAgOiBhcmJpdHJhdGlvbjogMDANCihYRU4pIC4uLi4gSVJRIHJlZGlyZWN0aW9u
IHRhYmxlOg0KKFhFTikgIE5SIExvZyBQaHkgTWFzayBUcmlnIElSUiBQb2wgU3RhdCBEZXN0
IERlbGkgVmVjdDogICANCihYRU4pICAwMCAwMDAgMDAgIDEgICAgMCAgICAwICAgMCAgIDAg
ICAgMCAgICAwICAgIDAwDQooWEVOKSAgMDEgMDAwIDAwICAxICAgIDAgICAgMCAgIDAgICAw
ICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDAyIDAwMCAwMCAgMSAgICAwICAgIDAgICAwICAg
MCAgICAwICAgIDAgICAgMDANCihYRU4pICAwMyAwMDAgMDAgIDEgICAgMCAgICAwICAgMCAg
IDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMDQgMDAwIDAwICAxICAgIDAgICAgMCAgIDAg
ICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDA1IDAwMCAwMCAgMSAgICAwICAgIDAgICAw
ICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAwNiAwMDAgMDAgIDEgICAgMCAgICAwICAg
MCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMDcgMDAwIDAwICAxICAgIDAgICAgMCAg
IDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDA4IDAwMCAwMCAgMSAgICAwICAgIDAg
ICAwICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAwOSAwMDAgMDAgIDEgICAgMCAgICAw
ICAgMCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMGEgMDAwIDAwICAxICAgIDAgICAg
MCAgIDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDBiIDAwMCAwMCAgMSAgICAwICAg
IDAgICAwICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAwYyAwMDAgMDAgIDEgICAgMCAg
ICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMGQgMDAwIDAwICAxICAgIDAg
ICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDBlIDAwMCAwMCAgMSAgICAw
ICAgIDAgICAwICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAwZiAwMDAgMDAgIDEgICAg
MCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMTAgMDAwIDAwICAxICAg
IDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDExIDAwMCAwMCAgMSAg
ICAwICAgIDAgICAwICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAxMiAwMDAgMDAgIDEg
ICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMTMgMDAwIDAwICAx
ICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDE0IDAwMCAwMCAg
MSAgICAwICAgIDAgICAwICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAxNSAwMDAgMDAg
IDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMTYgMDAwIDAw
ICAxICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDE3IDAwMCAw
MCAgMSAgICAwICAgIDAgICAwICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAxOCAwMDAg
MDAgIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMTkgMDAw
IDAwICAxICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDFhIDAw
MCAwMCAgMSAgICAwICAgIDAgICAwICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAxYiAw
MDAgMDAgIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAgMWMg
MDAwIDAwICAxICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikgIDFk
IDAwMCAwMCAgMSAgICAwICAgIDAgICAwICAgMCAgICAwICAgIDAgICAgMDANCihYRU4pICAx
ZSAwMDAgMDAgIDEgICAgMCAgICAwICAgMCAgIDAgICAgMCAgICAwICAgIDAwDQooWEVOKSAg
MWYgMDAwIDAwICAxICAgIDAgICAgMCAgIDAgICAwICAgIDAgICAgMCAgICAwMA0KKFhFTikg
VXNpbmcgdmVjdG9yLWJhc2VkIGluZGV4aW5nDQooWEVOKSBJUlEgdG8gcGluIG1hcHBpbmdz
Og0KKFhFTikgSVJRMjQwIC0+IDA6Mg0KKFhFTikgSVJRNDggLT4gMDoxDQooWEVOKSBJUlE1
NiAtPiAwOjMNCihYRU4pIElSUTI0MSAtPiAwOjQNCihYRU4pIElSUTY0IC0+IDA6NQ0KKFhF
TikgSVJRNzIgLT4gMDo2DQooWEVOKSBJUlE4MCAtPiAwOjcNCihYRU4pIElSUTg4IC0+IDA6
OA0KKFhFTikgSVJROTYgLT4gMDo5DQooWEVOKSBJUlExMDQgLT4gMDoxMA0KKFhFTikgSVJR
MTEyIC0+IDA6MTENCihYRU4pIElSUTEyMCAtPiAwOjEyDQooWEVOKSBJUlExMzYgLT4gMDox
Mw0KKFhFTikgSVJRMTQ0IC0+IDA6MTQNCihYRU4pIElSUTE1MiAtPiAwOjE1DQooWEVOKSAu
Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gZG9uZS4NCihYRU4pIFVzaW5n
IGxvY2FsIEFQSUMgdGltZXIgaW50ZXJydXB0cy4NCihYRU4pIGNhbGlicmF0aW5nIEFQSUMg
dGltZXIgLi4uDQooWEVOKSAuLi4uLiBDUFUgY2xvY2sgc3BlZWQgaXMgMzIwMC4wODk3IE1I
ei4NCihYRU4pIC4uLi4uIGhvc3QgYnVzIGNsb2NrIHNwZWVkIGlzIDIwMC4wMDU0IE1Iei4N
CihYRU4pIC4uLi4uIGJ1c19zY2FsZSA9IDB4MDAwMENDRDcNCihYRU4pIFsyMDExLTEwLTI2
IDEzOjMyOjQ5XSBQbGF0Zm9ybSB0aW1lciBpcyAxNC4zMThNSHogSFBFVA0K/yhYRU4pIFsy
MDExLTEwLTI2IDEzOjMyOjQ5XSBBbGxvY2F0ZWQgY29uc29sZSByaW5nIG9mIDY0IEtpQi4N
CihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSBIVk06IEFTSURzIGVuYWJsZWQuDQooWEVO
KSBbMjAxMS0xMC0yNiAxMzozMjo0OV0gU1ZNOiBTdXBwb3J0ZWQgYWR2YW5jZWQgZmVhdHVy
ZXM6DQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo0OV0gIC0gTmVzdGVkIFBhZ2UgVGFibGVz
IChOUFQpDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo0OV0gIC0gTGFzdCBCcmFuY2ggUmVj
b3JkIChMQlIpIFZpcnR1YWxpc2F0aW9uDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo0OV0g
IC0gTmV4dC1SSVAgU2F2ZWQgb24gI1ZNRVhJVA0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6
NDldICAtIFBhdXNlLUludGVyY2VwdCBGaWx0ZXINCihYRU4pIFsyMDExLTEwLTI2IDEzOjMy
OjQ5XSBIVk06IFNWTSBlbmFibGVkDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo0OV0gSFZN
OiBIYXJkd2FyZSBBc3Npc3RlZCBQYWdpbmcgZGV0ZWN0ZWQuDQooWEVOKSBbMjAxMS0xMC0y
NiAxMzozMjo0OF0gbWFza2VkIEV4dElOVCBvbiBDUFUjMQ0KKFhFTikgWzIwMTEtMTAtMjYg
MTM6MzI6NDhdIG1hc2tlZCBFeHRJTlQgb24gQ1BVIzINCihYRU4pIFsyMDExLTEwLTI2IDEz
OjMyOjQ4XSBtYXNrZWQgRXh0SU5UIG9uIENQVSMzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzoz
Mjo0OF0gbWFza2VkIEV4dElOVCBvbiBDUFUjNA0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6
NDhdIG1hc2tlZCBFeHRJTlQgb24gQ1BVIzUNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5
XSBCcm91Z2h0IHVwIDYgQ1BVcw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDldIEhQRVQn
cyBNU0kgbW9kZSBoYXNuJ3QgYmVlbiBzdXBwb3J0ZWQgd2hlbiBJbnRlcnJ1cHQgUmVtYXBw
aW5nIGlzIGVuYWJsZWQuDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo0OV0gQUNQSSBzbGVl
cCBtb2RlczogUzMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSBNQ0E6IFVzZSBodyB0
aHJlc2hvbGRpbmcgdG8gYWRqdXN0IHBvbGxpbmcgZnJlcXVlbmN5DQooWEVOKSBbMjAxMS0x
MC0yNiAxMzozMjo0OV0gbWNoZWNrX3BvbGw6IE1hY2hpbmUgY2hlY2sgcG9sbGluZyB0aW1l
ciBzdGFydGVkLg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDldIFhlbm9wcm9maWxlOiBG
YWlsZWQgdG8gc2V0dXAgSUJTIExWVCBvZmZzZXQsIElCU0NUTCA9IDB4ZmZmZmZmZmYNCihY
RU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSAqKiogTE9BRElORyBET01BSU4gMCAqKioNCihY
RU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSBlbGZfcGFyc2VfYmluYXJ5OiBwaGRyOiBwYWRk
cj0weDEwMDAwMDAgbWVtc3o9MHhkMDYwMDANCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5
XSBlbGZfcGFyc2VfYmluYXJ5OiBwaGRyOiBwYWRkcj0weDFlMDAwMDAgbWVtc3o9MHhhYjBl
MA0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDldIGVsZl9wYXJzZV9iaW5hcnk6IHBoZHI6
IHBhZGRyPTB4MWVhYzAwMCBtZW1zej0weDEyMjQwDQooWEVOKSBbMjAxMS0xMC0yNiAxMzoz
Mjo0OV0gZWxmX3BhcnNlX2JpbmFyeTogcGhkcjogcGFkZHI9MHgxZWJmMDAwIG1lbXN6PTB4
M2YyMDAwDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo0OV0gZWxmX3BhcnNlX2JpbmFyeTog
bWVtb3J5OiAweDEwMDAwMDAgLT4gMHgyMmIxMDAwDQooWEVOKSBbMjAxMS0xMC0yNiAxMzoz
Mjo0OV0gZWxmX3hlbl9wYXJzZV9ub3RlOiBHVUVTVF9PUyA9ICJsaW51eCINCihYRU4pIFsy
MDExLTEwLTI2IDEzOjMyOjQ5XSBlbGZfeGVuX3BhcnNlX25vdGU6IEdVRVNUX1ZFUlNJT04g
PSAiMi42Ig0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDldIGVsZl94ZW5fcGFyc2Vfbm90
ZTogWEVOX1ZFUlNJT04gPSAieGVuLTMuMCINCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5
XSBlbGZfeGVuX3BhcnNlX25vdGU6IFZJUlRfQkFTRSA9IDB4ZmZmZmZmZmY4MDAwMDAwMA0K
KFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDldIGVsZl94ZW5fcGFyc2Vfbm90ZTogRU5UUlkg
PSAweGZmZmZmZmZmODFlYmYyMDANCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSBlbGZf
eGVuX3BhcnNlX25vdGU6IEhZUEVSQ0FMTF9QQUdFID0gMHhmZmZmZmZmZjgxMDAxMDAwDQoo
WEVOKSBbMjAxMS0xMC0yNiAxMzozMjo0OV0gZWxmX3hlbl9wYXJzZV9ub3RlOiBGRUFUVVJF
UyA9ICIhd3JpdGFibGVfcGFnZV90YWJsZXN8cGFlX3BnZGlyX2Fib3ZlXzRnYiINCihYRU4p
IFsyMDExLTEwLTI2IDEzOjMyOjQ5XSBlbGZfeGVuX3BhcnNlX25vdGU6IFBBRV9NT0RFID0g
InllcyINCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSBlbGZfeGVuX3BhcnNlX25vdGU6
IExPQURFUiA9ICJnZW5lcmljIg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDldIGVsZl94
ZW5fcGFyc2Vfbm90ZTogdW5rbm93biB4ZW4gZWxmIG5vdGUgKDB4ZCkNCihYRU4pIFsyMDEx
LTEwLTI2IDEzOjMyOjQ5XSBlbGZfeGVuX3BhcnNlX25vdGU6IFNVU1BFTkRfQ0FOQ0VMID0g
MHgxDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo0OV0gZWxmX3hlbl9wYXJzZV9ub3RlOiBI
Vl9TVEFSVF9MT1cgPSAweGZmZmY4MDAwMDAwMDAwMDANCihYRU4pIFsyMDExLTEwLTI2IDEz
OjMyOjQ5XSBlbGZfeGVuX3BhcnNlX25vdGU6IFBBRERSX09GRlNFVCA9IDB4MA0KKFhFTikg
WzIwMTEtMTAtMjYgMTM6MzI6NDldIGVsZl94ZW5fYWRkcl9jYWxjX2NoZWNrOiBhZGRyZXNz
ZXM6DQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo0OV0gICAgIHZpcnRfYmFzZSAgICAgICAg
PSAweGZmZmZmZmZmODAwMDAwMDANCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSAgICAg
ZWxmX3BhZGRyX29mZnNldCA9IDB4MA0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDldICAg
ICB2aXJ0X29mZnNldCAgICAgID0gMHhmZmZmZmZmZjgwMDAwMDAwDQooWEVOKSBbMjAxMS0x
MC0yNiAxMzozMjo0OV0gICAgIHZpcnRfa3N0YXJ0ICAgICAgPSAweGZmZmZmZmZmODEwMDAw
MDANCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSAgICAgdmlydF9rZW5kICAgICAgICA9
IDB4ZmZmZmZmZmY4MjJiMTAwMA0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDldICAgICB2
aXJ0X2VudHJ5ICAgICAgID0gMHhmZmZmZmZmZjgxZWJmMjAwDQooWEVOKSBbMjAxMS0xMC0y
NiAxMzozMjo0OV0gICAgIHAybV9iYXNlICAgICAgICAgPSAweGZmZmZmZmZmZmZmZmZmZmYN
CihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSAgWGVuICBrZXJuZWw6IDY0LWJpdCwgbHNi
LCBjb21wYXQzMg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDldICBEb20wIGtlcm5lbDog
NjQtYml0LCBQQUUsIGxzYiwgcGFkZHIgMHgxMDAwMDAwIC0+IDB4MjJiMTAwMA0KKFhFTikg
WzIwMTEtMTAtMjYgMTM6MzI6NDldIFBIWVNJQ0FMIE1FTU9SWSBBUlJBTkdFTUVOVDoNCihY
RU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSAgRG9tMCBhbGxvYy46ICAgMDAwMDAwMDI0NDAw
MDAwMC0+MDAwMDAwMDI0ODAwMDAwMCAoMjQ0MDc4IHBhZ2VzIHRvIGJlIGFsbG9jYXRlZCkN
CihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSAgSW5pdC4gcmFtZGlzazogMDAwMDAwMDI0
Zjk2ZTAwMC0+MDAwMDAwMDI0ZmZmZjgwMA0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDld
IFZJUlRVQUwgTUVNT1JZIEFSUkFOR0VNRU5UOg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6
NDldICBMb2FkZWQga2VybmVsOiBmZmZmZmZmZjgxMDAwMDAwLT5mZmZmZmZmZjgyMmIxMDAw
DQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo0OV0gIEluaXQuIHJhbWRpc2s6IGZmZmZmZmZm
ODIyYjEwMDAtPmZmZmZmZmZmODI5NDI4MDANCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5
XSAgUGh5cy1NYWNoIG1hcDogZmZmZmZmZmY4Mjk0MzAwMC0+ZmZmZmZmZmY4MmI0MzAwMA0K
KFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDldICBTdGFydCBpbmZvOiAgICBmZmZmZmZmZjgy
YjQzMDAwLT5mZmZmZmZmZjgyYjQzNGI0DQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo0OV0g
IFBhZ2UgdGFibGVzOiAgIGZmZmZmZmZmODJiNDQwMDAtPmZmZmZmZmZmODJiNWQwMDANCihY
RU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSAgQm9vdCBzdGFjazogICAgZmZmZmZmZmY4MmI1
ZDAwMC0+ZmZmZmZmZmY4MmI1ZTAwMA0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NDldICBU
T1RBTDogICAgICAgICBmZmZmZmZmZjgwMDAwMDAwLT5mZmZmZmZmZjgyYzAwMDAwDQooWEVO
KSBbMjAxMS0xMC0yNiAxMzozMjo0OV0gIEVOVFJZIEFERFJFU1M6IGZmZmZmZmZmODFlYmYy
MDANCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSBEb20wIGhhcyBtYXhpbXVtIDYgVkNQ
VXMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjQ5XSBlbGZfbG9hZF9iaW5hcnk6IHBoZHIg
MCBhdCAweGZmZmZmZmZmODEwMDAwMDAgLT4gMHhmZmZmZmZmZjgxZDA2MDAwDQooWEVOKSBb
MjAxMS0xMC0yNiAxMzozMjo1MF0gZWxmX2xvYWRfYmluYXJ5OiBwaGRyIDEgYXQgMHhmZmZm
ZmZmZjgxZTAwMDAwIC0+IDB4ZmZmZmZmZmY4MWVhYjBlMA0KKFhFTikgWzIwMTEtMTAtMjYg
MTM6MzI6NTBdIGVsZl9sb2FkX2JpbmFyeTogcGhkciAyIGF0IDB4ZmZmZmZmZmY4MWVhYzAw
MCAtPiAweGZmZmZmZmZmODFlYmUyNDANCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjUwXSBl
bGZfbG9hZF9iaW5hcnk6IHBoZHIgMyBhdCAweGZmZmZmZmZmODFlYmYwMDAgLT4gMHhmZmZm
ZmZmZjgxZjc3MDAwDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1MF0gQU1ELVZpOiBTZXR1
cCBJL08gcGFnZSB0YWJsZTogZGV2aWNlIGlkID0gMHgwMDAwLCByb290IHRhYmxlID0gMHgy
NDgyYTgwMDAsIGRvbWFpbiA9IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAt
MjYgMTM6MzI6NTBdIEFNRC1WaTogU2V0dXAgSS9PIHBhZ2UgdGFibGU6IGRldmljZSBpZCA9
IDB4MDAwMiwgcm9vdCB0YWJsZSA9IDB4MjQ4MmE4MDAwLCBkb21haW4gPSAwLCBwYWdpbmcg
bW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjUwXSBBTUQtVmk6IFNldHVwIEkv
TyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDAwMTAsIHJvb3QgdGFibGUgPSAweDI0ODJh
ODAwMCwgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUgPSAzDQooWEVOKSBbMjAxMS0xMC0yNiAx
MzozMjo1MF0gQU1ELVZpOiBTZXR1cCBJL08gcGFnZSB0YWJsZTogZGV2aWNlIGlkID0gMHgw
MDE4LCByb290IHRhYmxlID0gMHgyNDgyYTgwMDAsIGRvbWFpbiA9IDAsIHBhZ2luZyBtb2Rl
ID0gMw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBdIEFNRC1WaTogU2V0dXAgSS9PIHBh
Z2UgdGFibGU6IGRldmljZSBpZCA9IDB4MDAyOCwgcm9vdCB0YWJsZSA9IDB4MjQ4MmE4MDAw
LCBkb21haW4gPSAwLCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMy
OjUwXSBBTUQtVmk6IFNldHVwIEkvTyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDAwMzAs
IHJvb3QgdGFibGUgPSAweDI0ODJhODAwMCwgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUgPSAz
DQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1MF0gQU1ELVZpOiBTZXR1cCBJL08gcGFnZSB0
YWJsZTogZGV2aWNlIGlkID0gMHgwMDUwLCByb290IHRhYmxlID0gMHgyNDgyYTgwMDAsIGRv
bWFpbiA9IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBd
IEFNRC1WaTogU2V0dXAgSS9PIHBhZ2UgdGFibGU6IGRldmljZSBpZCA9IDB4MDA1OCwgcm9v
dCB0YWJsZSA9IDB4MjQ4MmE4MDAwLCBkb21haW4gPSAwLCBwYWdpbmcgbW9kZSA9IDMNCihY
RU4pIFsyMDExLTEwLTI2IDEzOjMyOjUwXSBBTUQtVmk6IFNldHVwIEkvTyBwYWdlIHRhYmxl
OiBkZXZpY2UgaWQgPSAweDAwNjgsIHJvb3QgdGFibGUgPSAweDI0ODJhODAwMCwgZG9tYWlu
ID0gMCwgcGFnaW5nIG1vZGUgPSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1MF0gQU1E
LVZpOiBTZXR1cCBJL08gcGFnZSB0YWJsZTogZGV2aWNlIGlkID0gMHgwMDg4LCByb290IHRh
YmxlID0gMHgyNDgyYTgwMDAsIGRvbWFpbiA9IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikg
WzIwMTEtMTAtMjYgMTM6MzI6NTBdIEFNRC1WaTogU2V0dXAgSS9PIHBhZ2UgdGFibGU6IGRl
dmljZSBpZCA9IDB4MDA5MCwgcm9vdCB0YWJsZSA9IDB4MjQ4MmE4MDAwLCBkb21haW4gPSAw
LCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjUwXSBBTUQtVmk6
IFNldHVwIEkvTyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDAwOTIsIHJvb3QgdGFibGUg
PSAweDI0ODJhODAwMCwgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUgPSAzDQooWEVOKSBbMjAx
MS0xMC0yNiAxMzozMjo1MF0gQU1ELVZpOiBTZXR1cCBJL08gcGFnZSB0YWJsZTogZGV2aWNl
IGlkID0gMHgwMDk4LCByb290IHRhYmxlID0gMHgyNDgyYTgwMDAsIGRvbWFpbiA9IDAsIHBh
Z2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBdIEFNRC1WaTogU2V0
dXAgSS9PIHBhZ2UgdGFibGU6IGRldmljZSBpZCA9IDB4MDA5YSwgcm9vdCB0YWJsZSA9IDB4
MjQ4MmE4MDAwLCBkb21haW4gPSAwLCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEw
LTI2IDEzOjMyOjUwXSBBTUQtVmk6IFNldHVwIEkvTyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQg
PSAweDAwYTAsIHJvb3QgdGFibGUgPSAweDI0ODJhODAwMCwgZG9tYWluID0gMCwgcGFnaW5n
IG1vZGUgPSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1MF0gQU1ELVZpOiBTZXR1cCBJ
L08gcGFnZSB0YWJsZTogZGV2aWNlIGlkID0gMHgwMGExLCByb290IHRhYmxlID0gMHgyNDgy
YTgwMDAsIGRvbWFpbiA9IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYg
MTM6MzI6NTBdIEFNRC1WaTogU2V0dXAgSS9PIHBhZ2UgdGFibGU6IGRldmljZSBpZCA9IDB4
MDBhMywgcm9vdCB0YWJsZSA9IDB4MjQ4MmE4MDAwLCBkb21haW4gPSAwLCBwYWdpbmcgbW9k
ZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjUwXSBBTUQtVmk6IFNldHVwIEkvTyBw
YWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDAwYTQsIHJvb3QgdGFibGUgPSAweDI0ODJhODAw
MCwgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUgPSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzoz
Mjo1MF0gQU1ELVZpOiBTZXR1cCBJL08gcGFnZSB0YWJsZTogZGV2aWNlIGlkID0gMHgwMGE1
LCByb290IHRhYmxlID0gMHgyNDgyYTgwMDAsIGRvbWFpbiA9IDAsIHBhZ2luZyBtb2RlID0g
Mw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBdIEFNRC1WaTogU2V0dXAgSS9PIHBhZ2Ug
dGFibGU6IGRldmljZSBpZCA9IDB4MDBhOCwgcm9vdCB0YWJsZSA9IDB4MjQ4MmE4MDAwLCBk
b21haW4gPSAwLCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjUw
XSBBTUQtVmk6IFNldHVwIEkvTyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDAwYjAsIHJv
b3QgdGFibGUgPSAweDI0ODJhODAwMCwgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUgPSAzDQoo
WEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1MF0gQU1ELVZpOiBTZXR1cCBJL08gcGFnZSB0YWJs
ZTogZGV2aWNlIGlkID0gMHgwMGIyLCByb290IHRhYmxlID0gMHgyNDgyYTgwMDAsIGRvbWFp
biA9IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBdIEFN
RC1WaTogTm8gaW9tbXUgZm9yIGRldmljZSAwMDoxOC4wDQooWEVOKSBbMjAxMS0xMC0yNiAx
MzozMjo1MF0gQU1ELVZpOiBObyBpb21tdSBmb3IgZGV2aWNlIDAwOjE4LjENCihYRU4pIFsy
MDExLTEwLTI2IDEzOjMyOjUwXSBBTUQtVmk6IE5vIGlvbW11IGZvciBkZXZpY2UgMDA6MTgu
Mg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBdIEFNRC1WaTogTm8gaW9tbXUgZm9yIGRl
dmljZSAwMDoxOC4zDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1MF0gQU1ELVZpOiBObyBp
b21tdSBmb3IgZGV2aWNlIDAwOjE4LjQNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjUwXSBB
TUQtVmk6IFNldHVwIEkvTyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDA0MDAsIHJvb3Qg
dGFibGUgPSAweDI0ODJhODAwMCwgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUgPSAzDQooWEVO
KSBbMjAxMS0xMC0yNiAxMzozMjo1MF0gQU1ELVZpOiBTZXR1cCBJL08gcGFnZSB0YWJsZTog
ZGV2aWNlIGlkID0gMHgwNDAxLCByb290IHRhYmxlID0gMHgyNDgyYTgwMDAsIGRvbWFpbiA9
IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBdIEFNRC1W
aTogU2V0dXAgSS9PIHBhZ2UgdGFibGU6IGRldmljZSBpZCA9IDB4MDQwMiwgcm9vdCB0YWJs
ZSA9IDB4MjQ4MmE4MDAwLCBkb21haW4gPSAwLCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsy
MDExLTEwLTI2IDEzOjMyOjUwXSBBTUQtVmk6IFNldHVwIEkvTyBwYWdlIHRhYmxlOiBkZXZp
Y2UgaWQgPSAweDA0MDMsIHJvb3QgdGFibGUgPSAweDI0ODJhODAwMCwgZG9tYWluID0gMCwg
cGFnaW5nIG1vZGUgPSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1MF0gQU1ELVZpOiBT
ZXR1cCBJL08gcGFnZSB0YWJsZTogZGV2aWNlIGlkID0gMHgwNDA0LCByb290IHRhYmxlID0g
MHgyNDgyYTgwMDAsIGRvbWFpbiA9IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEt
MTAtMjYgMTM6MzI6NTBdIEFNRC1WaTogU2V0dXAgSS9PIHBhZ2UgdGFibGU6IGRldmljZSBp
ZCA9IDB4MDQwNSwgcm9vdCB0YWJsZSA9IDB4MjQ4MmE4MDAwLCBkb21haW4gPSAwLCBwYWdp
bmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjUwXSBBTUQtVmk6IFNldHVw
IEkvTyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDA0MDYsIHJvb3QgdGFibGUgPSAweDI0
ODJhODAwMCwgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUgPSAzDQooWEVOKSBbMjAxMS0xMC0y
NiAxMzozMjo1MF0gQU1ELVZpOiBTZXR1cCBJL08gcGFnZSB0YWJsZTogZGV2aWNlIGlkID0g
MHgwNDA3LCByb290IHRhYmxlID0gMHgyNDgyYTgwMDAsIGRvbWFpbiA9IDAsIHBhZ2luZyBt
b2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBdIEFNRC1WaTogU2V0dXAgSS9P
IHBhZ2UgdGFibGU6IGRldmljZSBpZCA9IDB4MDUwMCwgcm9vdCB0YWJsZSA9IDB4MjQ4MmE4
MDAwLCBkb21haW4gPSAwLCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEz
OjMyOjUwXSBBTUQtVmk6IFNldHVwIEkvTyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDA1
MDEsIHJvb3QgdGFibGUgPSAweDI0ODJhODAwMCwgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUg
PSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1MF0gQU1ELVZpOiBTZXR1cCBJL08gcGFn
ZSB0YWJsZTogZGV2aWNlIGlkID0gMHgwNjAwLCByb290IHRhYmxlID0gMHgyNDgyYTgwMDAs
IGRvbWFpbiA9IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6
NTBdIEFNRC1WaTogU2V0dXAgSS9PIHBhZ2UgdGFibGU6IGRldmljZSBpZCA9IDB4MDcwMCwg
cm9vdCB0YWJsZSA9IDB4MjQ4MmE4MDAwLCBkb21haW4gPSAwLCBwYWdpbmcgbW9kZSA9IDMN
CihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjUwXSBBTUQtVmlnZSB0YWJsZTogZGV2aWNlIGlk
ID0gMHgwODAwLCByb290IHRhYmxlID0gMHgyNDgyYTgwMDAsIGRvbWFpbiA9IDAsIHBhZ2lu
ZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBdIEFNRC1WaTogU2V0dXAg
SS9PIHBhZ2UgdGFibGU6IGRldmljZSBpZCA9IDAyNDgyYTgwMDAsIGRvbWFpbiA9IDAsIHBh
Z2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBdIEFNRC1WaTogU2V0
dXAgSS9PIHBhZ2UgdGFibGU6IGRldmljZSBpZCA9IDB4MGEwMCwgcm9vdCB0YWJsZSA9IDB4
MjQ4MmE4MDAwLCBkb21haW4gPSAwLCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEw
LTI2IDEzOjMyOjUwXSBBTUQtVmk6IFNldHVwIEkvTyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQg
PSAweDBhMDEsIHJvb3QgdGFibGUgPSAweDI0ODJhODAwMCwgZG9tYWluID0gMCwgcGFnaW5n
IG1vZGUgPSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1MF0gQU1ELVZpOiBTZXR1cCBJ
L08gcGFnZSB0YWJsZTogZGV2aWNlIGlkID0gMHgwYTAyLCByb290IHRhYmxlID0gMHgyNDgy
YTgwMDAsIGRvbWFpbiA9IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYg
MTM6MzI6NTBdIEFNRC1WaTogU2V0dXAgSS9PIHBhZ2UgdGFibGU6IGRldmljZSBpZCA9IDB4
MGEwMywgcm9vdCB0YWJsZSA9IDB4MjQ4MmE4MDAwLCBkb21haW4gPSAwLCBwYWdpbmcgbW9k
ZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjUwXSBBTUQtVmk6IFNldHVwIEkvTyBw
YWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDBhMDQsIHJvb3QgdGFibGUgPSAweDI0ODJhODAw
MCwgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUgPSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzoz
Mjo1MF0gQU1ELVZpOiBTZXR1cCBJL08gcGFnZSB0YWJsZTogZGV2aWNlIGlkID0gMHgwYTA1
LCByb290IHRhYmxlID0gMHgyNDgyYTgwMDAsIGRvbWFpbiA9IDAsIHBhZ2luZyBtb2RlID0g
Mw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBdIEFNRC1WaTogU2V0dXAgSS9PIHBhZ2Ug
dGFibGU6IGRldmljZSBpZCA9IDB4MGEwNiwgcm9vdCB0YWJsZSA9IDB4MjQ4MmE4MDAwLCBk
b21haW4gPSAwLCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjMyOjUw
XSBBTUQtVmk6IFNldHVwIEkvTyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDBhMDcsIHJv
b3QgdGFibGUgPSAweDI0ODJhODAwMCwgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUgPSAzDQoo
WEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1MF0gQU1ELVZpOiBTZXR1cCBJL08gcGFnZSB0YWJs
ZTogZGV2aWNlIGlkID0gMHgwYjAwLCByb290IHRhYmxlID0gMHgyNDgyYTgwMDAsIGRvbWFp
biA9IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTBdIFNj
cnViYmluZyBGcmVlIFJBTTogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u
Li4uLi4uLi4uLi4uLi4uLmRvbmUuDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1Ml0gWGVu
IHRyYWNlIGJ1ZmZlcnM6IGRpc2FibGVkDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1Ml0g
U3RkLiBMb2dsZXZlbDogQWxsDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozMjo1Ml0gR3Vlc3Qg
TG9nbGV2ZWw6IEFsbA0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTJdIFhlbiBpcyByZWxp
bnF1aXNoaW5nIFZHQSBjb25zb2xlLg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTJdICoq
KiBTZXJpYWwgaW5wdXQgLT4gRE9NMCAodHlwZSAnQ1RSTC1hJyB0aHJlZSB0aW1lcyB0byBz
d2l0Y2ggaW5wdXQgdG8gWGVuKQ0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTJdIEZyZWVk
IDIwNGtCIGluaXQgbWVtb3J5Lg0KbWFwcGluZyBrZXJuZWwgaW50byBwaHlzaWNhbCBtZW1v
cnkNClhlbjogc2V0dXAgSVNBIGlkZW50aXR5IG1hcHMNCmFib3V0IHRvIGdldCBzdGFydGVk
Li4uDQpbICAgIDAuMDAwMDAwXSBJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBjcHVzZXQN
ClsgICAgMC4wMDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdQ0KWyAgICAw
LjAwMDAwMF0gTGludXggdmVyc2lvbiAzLjEuMGtvbnJhZC1uZXh0LTIwMTExMDIyKyAocm9v
dEBzZXJ2ZWVyc3RlcnRqZSkgKGdjYyB2ZXJzaW9uIDQuNC41IChEZWJpYW4gNC40LjUtOCkg
KSAjNSBTTVAgV2VkIE9jdCAyNiAxMDozMjoyNiBDRVNUIDIwMTENClsgICAgMC4wMDAwMDBd
IENvbW1hbmQgbGluZTogcm9vdD0vZGV2L21hcHBlci9zZXJ2ZWVyc3RlcnRqZS1yb290IHJv
IHZlcmJvc2UgbWVtPTEwMjRNIGNvbnNvbGU9aHZjMCBjb25zb2xlPXR0eTAgbm9tb2Rlc2V0
IGluaXRjYWxsX2RlYnVnIGRlYnVnIGxvZ2xldmVsPTEwIHZnYT03OTQgdmlkZW89dmVzYWZi
IGVhcmx5cHJpbnRrPXhlbiBtYXhfbG9vcD0yNTUgbG9vcF9tYXhfcGFydD02MyBhY3BpX2Vu
Zm9yY2VfcmVzb3VyY2VzPWxheCB4ZW4tcGNpYmFjay5wYXNzdGhyb3VnaD0xIHhlbi1wY2li
YWNrLmhpZGU9KDAzOjA2LjApKDA0OjAwLjApKDA0OjAwLjEpKDA0OjAwLjIpKDA0OjAwLjMp
KDA0OjAwLjQpKDA0OjAwLjUpKDA0OjAwLjYpKDA0OjAwLjcpKDBhOjAwLjApKDBhOjAwLjEp
KDBhOjAwLjIpKDBhOjAwLjMpKDBhOjAwLjQpKDBhOjAwLjUpKDBhOjAwLjYpKDBhOjAwLjcp
KDA1OjAwLjApKDA1OjAwLjEpKDA3OjAxLjApKDA3OjAxLjEpKDA3OjAxLjIpIHBjaT1yZXNv
dXJjZV9hbGlnbm1lbnQ9MDc6MDEuMDswNzowMS4xOzA3OjAxLjINClsgICAgMC4wMDAwMDBd
IEZyZWVpbmcgIDlmLTEwMCBwZm4gcmFuZ2U6IDk3IHBhZ2VzIGZyZWVkDQpbICAgIDAuMDAw
MDAwXSAxLTEgbWFwcGluZyBvbiA5Zi0+MTAwDQpbICAgIDAuMDAwMDAwXSAxLTEgbWFwcGlu
ZyBvbiBhZmY5MC0+MTAwMDAwDQpbICAgIDAuMDAwMDAwXSBSZWxlYXNlZCA5NyBwYWdlcyBv
ZiB1bnVzZWQgbWVtb3J5DQpbICAgIDAuMDAwMDAwXSBTZXQgMzI3ODg5IHBhZ2UocykgdG8g
MS0xIG1hcHBpbmcNClsgICAgMC4wMDAwMDBdIEJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFN
IG1hcDoNClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAw
MDAwMDlmMDAwICh1c2FibGUpDQpbICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAwMDAwMDAwMDlm
MDAwIC0gMDAwMDAwMDAwMDEwMDAwMCAocmVzZXJ2ZWQpDQpbICAgIDAuMDAwMDAwXSAgWGVu
OiAwMDAwMDAwMDAwMTAwMDAwIC0gMDAwMDAwMDBhZmY5MDAwMCAodXNhYmxlKQ0KWyAgICAw
LjAwMDAwMF0gIFhlbjogMDAwMDAwMDBhZmY5MDAwMCAtIDAwMDAwMDAwYWZmOWUwMDAgKEFD
UEkgZGF0YSkNClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwYWZmOWUwMDAgLSAwMDAw
MDAwMGFmZmUwMDAwIChBQ1BJIE5WUykNClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAw
YWZmZTAwMDAgLSAwMDAwMDAwMGIwMDAwMDAwIChyZXNlcnZlZCkNClsgICAgMC4wMDAwMDBd
ICBYZW46IDAwMDAwMDAwZmVjMDAwMDAgLSAwMDAwMDAwMGZlYzAxMDAwIChyZXNlcnZlZCkN
ClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwZmVjMjAwMDAgLSAwMDAwMDAwMGZlYzIx
MDAwIChyZXNlcnZlZCkNClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwZmVlMDAwMDAg
LSAwMDAwMDAwMGZlZTAxMDAwIChyZXNlcnZlZCkNClsgICAgMC4wMDAwMDBdICBYZW46IDAw
MDAwMDAwZmZlMDAwMDAgLSAwMDAwMDAwMTAwMDAwMDAwIChyZXNlcnZlZCkNClsgICAgMC4w
MDAwMDBdICBYZW46IDAwMDAwMDAxMDAwMDAwMDAgLSAwMDAwMDAwMjUwMDAwMDAwICh1c2Fi
bGUpDQpbICAgIDAuMDAwMDAwXSBlODIwIHJlbW92ZSByYW5nZTogMDAwMDAwMDA0MDAwMDAw
MCAtIGZmZmZmZmZmZmZmZmZmZmYgKHVzYWJsZSkNClsgICAgMC4wMDAwMDBdIGJvb3Rjb25z
b2xlIFt4ZW5ib290MF0gZW5hYmxlZA0KWyAgICAwLjAwMDAwMF0gTlggKEV4ZWN1dGUgRGlz
YWJsZSkgcHJvdGVjdGlvbjogYWN0aXZlDQpbICAgIDAuMDAwMDAwXSB1c2VyLWRlZmluZWQg
cGh5c2ljYWwgUkFNIG1hcDoNClsgICAgMC4wMDAwMDBdICB1c2VyOiAwMDAwMDAwMDAwMDAw
MDAwIC0gMDAwMDAwMDAwMDA5ZjAwMCAodXNhYmxlKQ0KWyAgICAwLjAwMDAwMF0gIHVzZXI6
IDAwMDAwMDAwMDAwOWYwMDAgLSAwMDAwMDAwMDAwMTAwMDAwIChyZXNlcnZlZCkNClsgICAg
MC4wMDAwMDBdICB1c2VyOiAwMDAwMDAwMDAwMTAwMDAwIC0gMDAwMDAwMDA0MDAwMDAwMCAo
dXNhYmxlKQ0KWyAgICAwLjAwMDAwMF0gIHVzZXI6IDAwMDAwMDAwYWZmOTAwMDAgLSAwMDAw
MDAwMGFmZjllMDAwIChBQ1BJIGRhdGEpDQpbICAgIDAuMDAwMDAwXSAgdXNlcjogMDAwMDAw
MDBhZmY5ZTAwMCAtIDAwMDAwMDAwYWZmZTAwMDAgKEFDUEkgTlZTKQ0KWyAgICAwLjAwMDAw
MF0gIHVzZXI6IDAwMDAwMDAwYWZmZTAwMDAgLSAwMDAwMDAwMGIwMDAwMDAwIChyZXNlcnZl
ZCkNClsgICAgMC4wMDAwMDBdICB1c2VyOiAwMDAwMDAwMGZlYzAwMDAwIC0gMDAwMDAwMDBm
ZWMwMTAwMCAocmVzZXJ2ZWQpDQpbICAgIDAuMDAwMDAwXSAgdXNlcjogMDAwMDAwMDBmZWMy
MDAwMCAtIDAwMDAwMDAwZmVjMjEwMDAgKHJlc2VydmVkKQ0KWyAgICAwLjAwMDAwMF0gIHVz
ZXI6IDAwMDAwMDAwZmVlMDAwMDAgLSAwMDAwMDAwMGZlZTAxMDAwIChyZXNlcnZlZCkNClsg
ICAgMC4wMDAwMDBdICB1c2VyOiAwMDAwMDAwMGZmZTAwMDAwIC0gMDAwMDAwMDEwMDAwMDAw
MCAocmVzZXJ2ZWQpDQpbICAgIDAuMDAwMDAwXSBETUkgcHJlc2VudC4NClsgICAgMC4wMDAw
MDBdIERNSTogTVNJIDAgKE1TLTc2NDApICAsIEJJT1MgVjEuN0I1IDA2LzIyLzIwMTANClsg
ICAgMC4wMDAwMDBdIGU4MjAwMDAgLSAwMDAwMDAwMDAwMDEwMDAwICh1c2FibGUpID09PiAo
cmVzZXJ2ZWQpDQpbICAgIDAuMDAwMDAwXSBlODIwIHJlbW8wMDAwYTAwMDAgLSAwMDAwMDAw
MDAwMTAwMDAwICh1c2FibGUpDQpbICAgIDAuMDAwMDAwXSBObyBBMDAwMDBdIGxhc3RfcGZu
ID0gMHg0MDAwMCBtYXhfYXJjaF9wZm4gPSAweDQwMDAwMDAwMA0KWyAgICAwLjAwMDAwMF0g
Zm91bltmZmZmODgwMDAwMGZmNzgwXSBmZjc4MA0KWyAgICAwLjAwMDAwMF0gaW5pdGlhbCBt
ZW1vcnkgbWFwLjAwMDAwMF0gQmFzZSBtZW1vcnkgdHJhbXBvbGluZSBhdCBbZmZmZjg4MDAw
MDA5ZDAwMF0gOWQwMDAgc2l6ZSA4MTkyDQpbICAgIDAuMDAwMDAwXSBpaXRfbWVtb3J5X21h
cHBpbmc6IDAwMDAwMDAwMDAwMDAwMDAtMDAwMDAwMDA0MDAwMDAwMA0KWyAgICAwLjAwMDAw
MF0gIDAwMC0gMDA0MDAwMDAwMCBwYWdlIDRrDQpbICAgIDAuMDAwMDAwXSBrZXJuZWwgZGly
ZWN0IG1hcHBpbmcwLTEwMDAwMDANClsgICAgMC4wMDAwMDBdIHhlbjogc2V0dGluZyBSVyB0
aGUgcmFuZ2UgZmU0MDAwIERJU0s6IDAyMmIxMDAwIC0gMDI5NDMwMDANClsgICAgMC4wMDAw
MDBdIEFDUEk6IFJTRFAgMDAwMDApDQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBSU0RUIDAwMDAw
MDAwYWZmOTAwMDAgMDAwNDggKHYwMSBNU0kgICAgT0VNU0xJQyAgMjAxMDA2MjIgTVNGVCAw
MDAwMDA5NykNClsgICAgMC4wMDAwMDBdIEFDUEk6IEZBQ1AgMDAwMDAwMDBhZmY5MDIwMCAw
MDA4NCAodjAxIDc2NDBNUyBBNzY0MDEwMCAyMDEwMDYyMiBNU0ZUIDAwMDAwMDk3KQ0KWyAg
ICAwLjAwMDAwMF0gQUNQSTogRFNEVCAwMDAwMDAwMGFmZjkwNWUwIDA5NDQ5ICh2MDEgIEE3
NjQwIEE3NjQwMTAwIDAwMDAwMTAwIElOVEwgMjAwNTExMTcpDQpbICAgIDAuMDAwMDAwXSBB
Q1BJOiBGQUNTIDAwMDAwMDAwYWZmOWUwMDAgMDAwNDANClsgICAgMC4wMDAwMDBdIEFDUEk6
IEFQSUMgMDAwMDAwMDBhZmY5MDM5MCAwMDA4OCAodjAxIDc2NDBNUyBBNzY0MDEwMCAwMDAw
MF0gQUNQSTogTUNGRyAwMDAwMDAwMGFmZjkwNDIwIDAwMDNDICh2MDEgNzY0ME1TIE9FTU1D
ClsgICAgMC4wMDAwMDBdIEFDUEk6IFNMSUMgMDAwMDAwMDBhZmY5MDQ2MCAwMDE3NiAodjAx
IE1TSSAgICBPRU1TTElDICAyMDEwMDYyMiBNU0ZUIDAwMDAwMDk3KQ0KWyAgICAwLjAwMDAw
MF0gQUNQSTogT0VNQiAwMDAwMDAwMGFmZjllMDQwIDAwMDcyICh2MDEgNzY0ME1TIEE3NjQw
MTAwIDIwMTAwNjIyIE1TRlQgMDAwMDAwOTcpDQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBTUkFU
IDAwMDAwMDAwYWZmOWE1ZTAgMDAxMDggKHYwMyBBTUQgICAgRkFNX0ZfMTAgMDAwMDAwMDIg
QU1EICAwMDAwMDAwMSkNClsgICAgMC4wMDAwMDBdIEFDUEk6IEhQRVQgMDAwMDAwMDBhZmY5
YTZmMCAwMDAzOCAodjAxIDc2NDBNUyBPRU1IUEVUICAyMDEwMDYyMiBNU0ZUIDAwMDAwMDk3
KQ0KWyAgICAwLjAwMDAwMF0gQUNQSTogSVZSUyAwMDAwMDAwMGFmZjlhNzMwIDAwMTAwICh2
MDEgIEFNRCAgICAgUkQ4OTBTIDAwMjAyMDMxIEFNRCAgMDAwMDAwMDApDQpbICAgIDAuMDAw
MDAwXSBBQ1BJOiBTU0RUIDAwMDAwMDAwYWZmOWE4MzAgMDBEQTQgKHYwMSBBIE0gSSAgUE9X
RVJOT1cgMDAwMDAwMDEgQU1EICAwMDAwMDAwMSkNClsgICAgMC4wMDAwMDBdIEFDUEk6IExv
Y2FsIEFQSUMgYWRkcmVzcyAweGZlZTAwMDAwDQpbICAgIDAuMDAwMDAwXSBTY2FubmluZyBO
VU1BIHRvcG9sb2d5IGluIE5vcnRoYnJpZGdlIDI0DQpbICAgIDAuMDAwMDAwXSBObyBOVU1B
IGNvbmZpZ3VyYXRpb24gZm91bmQNClsgICAgMC4wMDAwMDBdIEZha2luZyBhIG5vZGUgYXQg
MDAwMDAwMDAwMDAwMDAwMC0wMDAwMDAwMDQwMDAwMDAwDQpbICAgIDAuMDAwMDAwXSBJbml0
bWVtIHNldHVwIG5vZGUgMCAwMDAwMDAwMDAwMDAwMDAwLTAwMDAwMDAwNDAwMDAwMDANClsg
ICAgMC4wMDAwMDBdICAgTk9ERV9EQVRBIFswMDAwMDAwMDNmZmZiMDAwIC0gMDAwMDAwMDAz
ZmZmZmZmZl0NClsgICAgMC4wMDAwMDBdIFpvbmUgUEZOIHJhbmdlczoNClsgICAgMC4wMDAw
MDBdICAgRE1BICAgICAgMHgwMDAwMDAxMCAtPiAweDAwMDAxMDAwDQpbICAgIDAuMDAwMDAw
XSAgIERNQTMyICAgIDB4MDAwMDEwMDAgLT4gMHgwMDEwMDAwMA0KWyAgICAwLjAwMDAwMF0g
ICBOb3JtYWwgICBlbXB0eQ0KWyAgICAwLjAwMDAwMF0gTW92YWJsZSB6b25lIHN0YXJ0IFBG
TiBmb3IgZWFjaCBub2RlDQpbICAgIDAuMDAwMDAwXSBlYXJseV9ub2RlX21hcFsyXSBhY3Rp
dmUgUEZOIHJhbmdlcw0KWyAgICAwLjAwMDAwMF0gICAgIDA6IDB4MDAwMDAwMTAgLT4gMHgw
MDAwMDA5Zg0KWyAgICAwLjAwMDAwMF0gICAgIDA6IDB4MDAwMDAxMDAgLT4gMHgwMDA0MDAw
MA0KWyAgICAwLjAwMDAwMF0gT24gbm9kZSAwIHRvdGFscGFnZXM6IDI2MjAzMQ0KWyAgICAw
LjAwMDAwMF0gICBETUEgem9uZTogNjQgcGFnZXMgdXNlZCBmb3IgbWVtbWFwDQpbICAgIDAu
MDAwMDAwXSAgIERNQSB6b25lOiA0ODggcGFnZXMgcmVzZXJ2ZWQNClsgICAgMC4wMDAwMDBd
ICAgRE1BIHpvbmU6IDM0MzEgcGFnZXMsIExJRk8gYmF0Y2g6MA0KWyAgICAwLjAwMDAwMF0g
ICBETUEzMiB6b25lOiA0MDMyIHBhZ2VzIHVzZWQgZm9yIG1lbW1hcA0KWyAgICAwLjAwMDAw
MF0gICBETUEzMiB6b25lOiAyNTQwMC4wMDAwMDBdIEFDUEk6IFBNLVRpbWVyIElPIFBvcnQ6
IDB4ODA4DQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMb2NhbCBBUElDIGFkZHJlc3MgMHhmZWUw
MDAwMA0KWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwMV0gbGFwaWNf
aWRbMHgwMF0gZW5hYmxlZCkNClsgICAgMC4wMDAwMDBdIEJJT1MgYnVnOiBBUElDIHZlcnNp
b24gaXMgMCBmb3IgQ1BVIDAvMHgwLCBmaXhpbmcgdXAgdG8gMHgxMA0KWyAgICAwLjAwMDAw
MF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwMl0gbGFwaWNfaWRbMHgwMV0gZW5hYmxlZCkN
ClsgICAgMC4wMDAwMDBdIEFDUEk6IExBUElDIChhY3BpX2lkWzB4MDNdIGxhcGljX2lkWzB4
MDJdIGVuYWJsZWQpDQpbTEFQSUMgKGFjcGlfaWRbMHgwNF0gbGFwaWNfaWRbMHgwM10gZW5h
YmxlZCkNClsgICAgMC4wMDAwMCBsYXBpY19pZFsweDA0XSBlbmFibGVkKQ0KWyAgICAwLjAw
MDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwNl0gbGFwaWNfaWRbMHgwNV0gZW5hYmxl
ZCkNClsgICAgMC4wMDAwMDBdIEFDUEk6IElPQVBJQyAoaWRbMHgwNl0gYWRkcmVzc1sweGZl
YzAwMDAwXSBnc2lfYmFzZVswXSkNClsgICAgMC4wMDAwMDBdIElPQVBJQ1swXTogYXBpY19p
ZCA2LCB2ZXJzaW9uIDI1NSwgYWRkcmVzcyAweGZlYzAwMDAwLCBHU0kgMC0yNTUNClsgICAg
MC4wMDAwMDBdIEFDUEk6IElPQVBJQyAoaWRbMHgwN10gYWRkcmVzc1sweGZlYzIwMDAwXSBn
c2lfYmFzZVsyNF0pDQpbICAgIDAuMDAwMDAwXSBJT0FQSUNbMV06IGFwaWNfaWQgNywgdmVy
c2lvbiAyNTUsIGFkZHJlc3MgMHhmZWMyMDAwMCwgR1NJIDI0LTI3OQ0KWyAgICAwLjAwMDAw
MF0gQUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19pcnEgMCBnbG9iYWxfaXJxIDIgZGZs
IGRmbCkNClsgICAgMC4wMDAwMDBdIEFDUEk6IElOVF9TUkNfT1ZSIChidXMgMCBidXNfaXJx
IDkgZ2xvYmFsX2lycSA5IGxvdyBsZXZlbCkNClsgICAgMC4wMDAwMDBdIEFDUEk6IElSUTAg
dXNlZCBieSBvdmVycmlkZS4NClsgICAgMC4wMDAwMDBdIEFDUEk6IElSUTIgdXNlZCBieSBv
dmVycmlkZS4NClsgICAgMC4wMDAwMDBdIEFDUEk6IElSUTkgdXNlZCBieSBvdmVycmlkZS4N
ClsgICAgMC4wMDAwMDBdIFVzaW5nIEFDUEkgKE1BRFQpIGZvciBTTVAgY29uZmlndXJhdGlv
biBpbmZvcm1hdGlvbg0KWyAgICAwLjAwMDAwMF0gQUNQSTogSFBFVCBpZDogMHg4MzAwIGJh
c2U6IDB4ZmVkMDAwMDANClsgICAgMC4wMDAwMDBdIFNNUDogQWxsb3dpbmcgNiBDUFVzLCAw
IGhvdHBsdWcgQ1BVcw0KWyAgICAwLjAwMDAwMF0gbnJfaXJxc19nc2k6IDI5Ng0KWyAgICAw
LjAwMDAwMF0gQWxsb2NhdGluZyBQQ0kgcmVzb3VyY2VzIHN0YXJ0aW5nIGF0IDQwMDAwMDAw
IChnYXA6IDQwMDAwMDAwOjZmZjkwMDAwKQ0KWyAgICAwLjAwMDAwMF0gQm9vdGluZyBwYXJh
dmlydHVhbGl6ZWQga2VybmVsIG9uIFhlbg0KWyAgICAwLjAwMDAwMF0gWGVuIHZlcnNpb246
IDQuMS4zLXJjMS1wcmUgKHByZXNlcnZlLUFEKQ0KWyAgICAwLjAwMDAwMF0gc2V0dXBfcGVy
Y3B1OiBOUl9DUFVTOjY0IG5yX2NwdW1hc2tfYml0czo2NCBucl9jcHVfaWRzOjYgbnJfbm9k
ZV9pZHM6MQ0KWyAgICAwLjAwMDAwMF0gUEVSQ1BVOiBFbWJlZGRlZCAyNiBwYWdlcy9jcHUg
QGZmZmY4ODAwM2ZmNTEwMDAgczc0MzA0IHI4MTkyIGQyNDAwMCB1MTA2NDk2DQpbICAgIDAu
MDAwMDAwXSBwY3B1LWFsbG9jOiBzNzQzMDQgcjgxOTIgZDI0MDAwIHUxMDY0OTYgYWxsb2M9
MjYqNDA5Ng0KWyAgICAwLjAwMDAwMF0gcGNwdS1hbGxvYzogWzBdIDAgWzBdIDEgWzBdIDIg
WzBdIDMgWzBdIDQgWzBdIDUgDQpbICAgIDAuMDAwMDAwXSBCdWlsdCAxIHpvbmVsaXN0cyBp
biBOb2RlIG9yZGVyLCBtb2JpbGl0eSBncm91cGluZyBvbi4gIFRvdGFsIHBhZ2VzOiAyNTc0
NDcNClsgICAgMC4wMDAwMDBdIFBvbGljeSB6b25lOiBETUEzMg0KWyAgICAwLjAwMDAwMF0g
S2VybmVsIGNvbW1hbmQgbGluZTogcm9vdD0vZGV2L21hcHBlci9zZXJ2ZWVyc3RlcnRqZS1y
b290IHJvIHZlcmJvc2UgbWVtPTEwMjRNIGNvbnNvbGU9aHZjMCBjb25zb2xlPXR0eTAgbm9t
b2Rlc2V0IGluaXRjYWxsX2RlYnVnIGRlYnVnIGxvZ2xldmVsPTEwIHZnYT03OTQgdmlkZW89
dmVzYWZiIGVhcmx5cHJpbnRrPXhlbiBtYXhfbG9vcD0yNTUgbG9vcF9tYXhfcGFydD02MyBh
Y3BpX2VuZm9yY2VfcmVzb3VyY2VzPWxheCB4ZW4tcGNpYmFjay5wYXNzdGhyb3VnaD0xIHhl
bi1wY2liYWNrLmhpZGU9KDAzOjA2LjApKDA0OjAwLjApKDA0OjAwLjEpKDA0OjAwLjIpKDA0
OjAwLjMpKDA0OjAwLjQpKDA0OjAwLjUpKDA0OjAwLjYpKDA0OjAwLjcpKDBhOjAwLjApKDBh
OjAwLjEpKDBhOjAwLjIpKDBhOjAwLjMpKDBhOjAwLjQpKDBhOjAwLjUpKDBhOjAwLjYpKDBh
OjAwLjcpKDA1OjAwLjApKDA1OjAwLjEpKDA3OjAxLjApKDA3OjAxLjEpKDA3OjAxLjIpIHBj
aT1yZXNvdXJjZV9hbGlnbm1lbnQ9MDc6MDEuMDswNzowMS4xOzA3OjAxLjINClsgICAgMC4w
MDAwMDBdIFBJRCBoYXNoIHRhYmxlIGVudHJpZXM6IDQwOTYgKG9yZGVyOiAzLCAzMjc2OCBi
eXRlcykNClsgICAgMC4wMDAwMDBdIFBsYWNpbmcgNjRNQiBzb2Z0d2FyZSBJTyBUTEIgYmV0
d2VlbiBmZmZmODgwMDNhNjAwMDAwIC0gZmZmZjg4MDAzZTYwMDAwMA0KWyAgICAwLjAwMDAw
MF0gc29mdHdhcmUgSU8gVExCIGF0IHBoeXMgMHgzYTYwMDAwMCAtIDB4M2U2MDAwMDANClsg
ICAgMC4wMDAwMDBdIE1lbW9yeTogOTM2MTkyay8xMDQ4NTc2ayBhdmFpbGFibGUgKDg2NjZr
IGtlcm5lbCBjb2RlLCA0NTJrIGFic2VudCwgMTExOTMyayByZXNlcnZlZCwgNjM1MGsgZGF0
YSwgNzg0ayBpbml0KQ0KWyAgICAwLjAwMDAwMF0gU0xVQjogR2Vuc2xhYnM9MTUsIEhXYWxp
Z249NjQsIE9yZGVyPTAtMywgTWluT2JqZWN0cz0wLCBDUFVzPTYsIE5vZGVzPTENClsgICAg
MC4wMDAwMDBdIEhpZXJhcmNoaWNhbCBSQ1UgaW1wbGVtZW50YXRpb24uDQpbICAgIDAuMDAw
MDAwXSBOUl9JUlFTOjQzNTIgbnJfaXJxczoxNTM2IDE2DQpbICAgIDAuMDAwMDAwXSB4ZW46
IHNjaSBvdmVycmlkZTogZ2xvYmFsX2lycT05IHRyaWdnZXI9MCBwb2xhcml0eT0xDQpbICAg
IDAuMDAwMDAwXSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSA5IHRyaWdnZXJpbmcgMCBwb2xhcml0
eSAxDQpbICAgIDAuMDAwMDAwXSB4ZW46IC0tPiBwaXJxPTkgLT4gaXJxPTkgKGdzaT05KQ0K
KFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTJdIElPQVBJQ1swXTogU2V0IFBDSSByb3V0aW5n
IGVudHJ5ICg2LTkgLT4gMHg2MCAtPiBJUlEgOSBNb2RlOjEgQWN0aXZlOjEpDQpbICAgIDAu
MDAwMDAwXSB4ZW46IGFjcGkgc2NpIDkNClsgICAgMC4wMDAwMDBdIHhlbjogLS0+IHBpcnE9
MSAtPiBpcnE9MSAoZ3NpPTEpDQpbICAgIDAuMDAwMDAwXSB4ZW46IC0tPiBwaXJxPTIgLT4g
aXJxPTIgKGdzaT0yKQ0KWyAgICAwLjAwMDAwMF0geGVuOiAtLT4gcGlycT0zIC0+IGlycT0z
IChnc2k9MykNClsgICAgMC4wMDAwMDBdIHhlbjogLS0+IHBpcnE9NCAtPiBpcnE9NCAoZ3Np
PTQpDQpbICAgIDAuMDAwMDAwXSB4ZW46IC0tPiBwaXJxPTUgLT4gaXJxPTUgKGdzaT01KQ0K
WyAgICAwLjAwMDAwMF0geGVuOiAtLT4gcGlycT02IC0+IGlycT02IChnc2k9NikNClsgICAg
MC4wMDAwMDBdIHhlbjogLS0+IHBpcnE9NyAtPiBpcnE9NyAoZ3NpPTcpDQpbICAgIDAuMDAw
MDAwXSB4ZW46IC0tPiBwaXJxPTggLT4gaXJxPTggKGdzaT04KQ0KWyAgICAwLjAwMDAwMF0g
eGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5nIGlycSA5IGZvciBnc2kgOQ0KWyAgICAwLjAw
MDAwMF0geGVuOiAtLT4gcGlycT05IC0+IGlycT05IChnc2k9OSkNClsgICAgMC4wMDAwMDBd
IHhlbjogLS0+IHBpcnE9MTAgLT4gaXJxPTEwIChnc2k9MTApDQpbICAgIDAuMDAwMDAwXSB4
ZW46IC0tPiBwaXJxPTExIC0+IGlycT0xMSAoZ3NpPTExKQ0KWyAgICAwLjAwMDAwMF0geGVu
OiAtLT4gcGlycT0xMiAtPiBpcnE9MTIgKGdzaT0xMikNClsgICAgMC4wMDAwMDBdIHhlbjog
LS0+IHBpcnE9MTMgLT4gaXJxPTEzIChnc2k9MTMpDQpbICAgIDAuMDAwMDAwXSB4ZW46IC0t
PiBwaXJxPTE0IC0+IGlycT0xNCAoZ3NpPTE0KQ0KWyAgICAwLjAwMDAwMF0geGVuOiAtLT4g
cGlycT0xNSAtPiBpcnE9MTUgKGdzaT0xNSkNClsgICAgMC4wMDAwMDBdIENvbnNvbGU6IGNv
bG91ciBkdW1teSBkZXZpY2UgODB4MjUNClsgICAgMC4wMDAwMDBdIGNvbnNvbGUgW3R0eTBd
IGVuYWJsZWQsIGJvb3Rjb25zb2xlIGRpc2FibGVkDQpbICAgIDAuMDAwMDAwXSBJbml0aWFs
aXppbmcgY2dyb3VwIHN1YnN5cyBjcHVzZXQNClsgICAgMC4wMDAwMDBdIEluaXRpYWxpemlu
ZyBjZ3JvdXAgc3Vic3lzIGNwdQ0KWyAgICAwLjAwMDAwMF0gTGludXggdmVyc2lvbiAzLjEu
MGtvbnJhZC1uZXh0LTIwMTExMDIyKyAocm9vdEBzZXJ2ZWVyc3RlcnRqZSkgKGdjYyB2ZXJz
aW9uIDQuNC41IChEZWJpYW4gNC40LjUtOCkgKSAjNSBTTVAgV2VkIE9jdCAyNiAxMDozMjoy
NiBDRVNUIDIwMTENClsgICAgMC4wMDAwMDBdIENvbW1hbmQgbGluZTogcm9vdD0vZGV2L21h
cHBlci9zZXJ2ZWVyc3RlcnRqZS1yb290IHJvIHZlcmJvc2UgbWVtPTEwMjRNIGNvbnNvbGU9
aHZjMCBjb25zb2xlPXR0eTAgbm9tb2Rlc2V0IGluaXRjYWxsX2RlYnVnIGRlYnVnIGxvZ2xl
dmVsPTEwIHZnYT03OTQgdmlkZW89dmVzYWZiIGVhcmx5cHJpbnRrPXhlbiBtYXhfbG9vcD0y
NTUgbG9vcF9tYXhfcGFydD02MyBhY3BpX2VuZm9yY2VfcmVzb3VyY2VzPWxheCB4ZW4tcGNp
YmFjay5wYXNzdGhyb3VnaD0xIHhlbi1wY2liYWNrLmhpZGU9KDAzOjA2LjApKDA0OjAwLjAp
KDA0OjAwLjEpKDA0OjAwLjIpKDA0OjAwLjMpKDA0OjAwLjQpKDA0OjAwLjUpKDA0OjAwLjYp
KDA0OjAwLjcpKDBhOjAwLjApKDBhOjAwLjEpKDBhOjAwLjIpKDBhOjAwLjMpKDBhOjAwLjQp
KDBhOjAwLjUpKDBhOjAwLjYpKDBhOjAwLjcpKDA1OjAwLjApKDA1OjAwLjEpKDA3OjAxLjAp
KDA3OjAxLjEpKDA3OjAxLjIpIHBjaT1yZXNvdXJjZV9hbGlnbm1lbnQ9MDc6MDEuMDswNzow
MS4xOzA3OjAxLjINClsgICAgMC4wMDAwMDBdIEZyZWVpbmcgIDlmLTEwMCBwZm4gcmFuZ2U6
IDk3IHBhZ2VzIGZyZWVkDQpbICAgIDAuMDAwMDAwXSAxLTEgbWFwcGluZyBvbiA5Zi0+MTAw
DQpbICAgIDAuMDAwMDAwXSAxLTEgbWFwcGluZyBvbiBhZmY5MC0+MTAwMDAwDQpbICAgIDAu
MDAwMDAwXSBSZWxlYXNlZCA5NyBwYWdlcyBvZiB1bnVzZWQgbWVtb3J5DQpbICAgIDAuMDAw
MDAwXSBTZXQgMzI3ODg5IHBhZ2UocykgdG8gMS0xIG1hcHBpbmcNClsgICAgMC4wMDAwMDBd
IEJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFNIG1hcDoNClsgICAgMC4wMDAwMDBdICBYZW46
IDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwMDAwMDAwMDlmMDAwICh1c2FibGUpDQpbICAgIDAu
MDAwMDAwXSAgWGVuOiAwMDAwMDAwMDAwMDlmMDAwIC0gMDAwMDAwMDAwMDEwMDAwMCAocmVz
ZXJ2ZWQpDQpbICAgIDAuMDAwMDAwXSAgWGVuOiAwMDAwMDAwMDAwMTAwMDAwIC0gMDAwMDAw
MDBhZmY5MDAwMCAodXNhYmxlKQ0KWyAgICAwLjAwMDAwMF0gIFhlbjogMDAwMDAwMDBhZmY5
MDAwMCAtIDAwMDAwMDAwYWZmOWUwMDAgKEFDUEkgZGF0YSkNClsgICAgMC4wMDAwMDBdICBY
ZW46IDAwMDAwMDAwYWZmOWUwMDAgLSAwMDAwMDAwMGFmZmUwMDAwIChBQ1BJIE5WUykNClsg
ICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwYWZmZTAwMDAgLSAwMDAwMDAwMGIwMDAwMDAw
IChyZXNlcnZlZCkNClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwZmVjMDAwMDAgLSAw
MDAwMDAwMGZlYzAxMDAwIChyZXNlcnZlZCkNClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAw
MDAwZmVjMjAwMDAgLSAwMDAwMDAwMGZlYzIxMDAwIChyZXNlcnZlZCkNClsgICAgMC4wMDAw
MDBdICBYZW46IDAwMDAwMDAwZmVlMDAwMDAgLSAwMDAwMDAwMGZlZTAxMDAwIChyZXNlcnZl
ZCkNClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAwZmZlMDAwMDAgLSAwMDAwMDAwMTAw
MDAwMDAwIChyZXNlcnZlZCkNClsgICAgMC4wMDAwMDBdICBYZW46IDAwMDAwMDAxMDAwMDAw
MDAgLSAwMDAwMDAwMjUwMDAwMDAwICh1c2FibGUpDQpbICAgIDAuMDAwMDAwXSBlODIwIHJl
bW92ZSByYW5nZTogMDAwMDAwMDA0MDAwMDAwMCAtIGZmZmZmZmZmZmZmZmZmZmYgKHVzYWJs
ZSkNClsgICAgMC4wMDAwMDBdIGJvb3Rjb25zb2xlIFt4ZW5ib290MF0gZW5hYmxlZA0KWyAg
ICAwLjAwMDAwMF0gTlggKEV4ZWN1dGUgRGlzYWJsZSkgcHJvdGVjdGlvbjogYWN0aXZlDQpb
ICAgIDAuMDAwMDAwXSB1c2VyLWRlZmluZWQgcGh5c2ljYWwgUkFNIG1hcDoNClsgICAgMC4w
MDAwMDBdICB1c2VyOiAwMDAwMDAwMDAwMDAwMDAwIC0gMDAwMDAwMDAwMDA5ZjAwMCAodXNh
YmxlKQ0KWyAgICAwLjAwMDAwMF0gIHVzZXI6IDAwMDAwMDAwMDAwOWYwMDAgLSAwMDAwMDAw
MDAwMTAwMDAwIChyZXNlcnZlZCkNClsgICAgMC4wMDAwMDBdICB1c2VyOiAwMDAwMDAwMDAw
MTAwMDAwIC0gMDAwMDAwMDA0MDAwMDAwMCAodXNhYmxlKQ0KWyAgICAwLjAwMDAwMF0gIHVz
ZXI6IDAwMDAwMDAwYWZmOTAwMDAgLSAwMDAwMDAwMGFmZjllMDAwIChBQ1BJIGRhdGEpDQpb
ICAgIDAuMDAwMDAwXSAgdXNlcjogMDAwMDAwMDBhZmY5ZTAwMCAtIDAwMDAwMDAwYWZmZTAw
MDAgKEFDUEkgTlZTKQ0KWyAgICAwLjAwMDAwMF0gIHVzZXI6IDAwMDAwMDAwYWZmZTAwMDAg
LSAwMDAwMDAwMGIwMDAwMDAwIChyZXNlcnZlZCkNClsgICAgMC4wMDAwMDBdICB1c2VyOiAw
MDAwMDAwMGZlYzAwMDAwIC0gMDAwMDAwMDBmZWMwMTAwMCAocmVzZXJ2ZWQpDQpbICAgIDAu
MDAwMDAwXSAgdXNlcjogMDAwMDAwMDBmZWMyMDAwMCAtIDAwMDAwMDAwZmVjMjEwMDAgKHJl
c2VydmVkKQ0KWyAgICAwLjAwMDAwMF0gIHVzZXI6IDAwMDAwMDAwZmVlMDAwMDAgLSAwMDAw
MDAwMGZlZTAxMDAwIChyZXNlcnZlZCkNClsgICAgMC4wMDAwMDBdICB1c2VyOiAwMDAwMDAw
MGZmZTAwMDAwIC0gMDAwMDAwMDEwMDAwMDAwMCAocmVzZXJ2ZWQpDQpbICAgIDAuMDAwMDAw
XSBETUkgcHJlc2VudC4NClsgICAgMC4wMDAwMDBdIERNSTogTVNJIE1TLTc2NDAvODkwRlhB
LUdENzAgKE1TLTc2NDApICAsIEJJT1MgVjEuN0I1IDA2LzIyLzIwMTANClsgICAgMC4wMDAw
MDBdIGU4MjAgdXBkYXRlIHJhbmdlOiAwMDAwMDAwMDAwMDAwMDAwIC0gMDAwMDAwMDAwMDAx
MDAwMCAodXNhYmxlKSA9PT4gKHJlc2VydmVkKQ0KWyAgICAwLjAwMDAwMF0gZTgyMCByZW1v
dmUgcmFuZ2U6IDAwMDAwMDAwMDAwYTAwMDAgLSAwMDAwMDAwMDAwMTAwMDAwICh1c2FibGUp
DQpbICAgIDAuMDAwMDAwXSBObyBBR1AgYnJpZGdlIGZvdW5kDQpbICAgIDAuMDAwMDAwXSBs
YXN0X3BmbiA9IDB4NDAwMDAgbWF4X2FyY2hfcGZuID0gMHg0MDAwMDAwMDANClsgICAgMC4w
MDAwMDBdIGZvdW5kIFNNUCBNUC10YWJsZSBhdCBbZmZmZjg4MDAwMDBmZjc4MF0gZmY3ODAN
ClsgICAgMC4wMDAwMDBdIGluaXRpYWwgbWVtb3J5IG1hcHBlZCA6IDAgLSAwMjk0MzAwMA0K
WyAgICAwLjAwMDAwMF0gQmFzZSBtZW1vcnkgdHJhbXBvbGluZSBhdCBbZmZmZjg4MDAwMDA5
ZDAwMF0gOWQwMDAgc2l6ZSA4MTkyDQpbICAgIDAuMDAwMDAwXSBpbml0X21lbW9yeV9tYXBw
aW5nOiAwMDAwMDAwMDAwMDAwMDAwLTAwMDAwMDAwNDAwMDAwMDANClsgICAgMC4wMDAwMDBd
ICAwMDAwMDAwMDAwIC0gMDA0MDAwMDAwMCBwYWdlIDRrDQpbICAgIDAuMDAwMDAwXSBrZXJu
ZWwgZGlyZWN0IG1hcHBpbmcgdGFibGVzIHVwIHRvIDQwMDAwMDAwIEAgZGZlMDAwLTEwMDAw
MDANClsgICAgMC4wMDAwMDBdIHhlbjogc2V0dGluZyBSVyB0aGUgcmFuZ2UgZmU0MDAwIC0g
MTAwMDAwMA0KWyAgICAwLjAwMDAwMF0gUkFNRElTSzogMDIyYjEwMDAgLSAwMjk0MzAwMA0K
WyAgICAwLjAwMDAwMF0gQUNQSTogUlNEUCAwMDAwMDAwMDAwMGZiMTIwIDAwMDE0ICh2MDAg
QUNQSUFNKQ0KWyAgICAwLjAwMDAwMF0gQUNQSTogUlNEVCAwMDAwMDAwMGFmZjkwMDAwIDAw
MDQ4ICh2MDEgTVNJICAgIE9FTVNMSUMgIDIwMTAwNjIyIE1TRlQgMDAwMDAwOTcpDQpbICAg
IDAuMDAwMDAwXSBBQ1BJOiBGQUNQIDAwMDAwMDAwYWZmOTAyMDAgMDAwODQgKHYwMSA3NjQw
TVMgQTc2NDAxMDAgMjAxMDA2MjIgTVNGVCAwMDAwMDA5NykNClsgICAgMC4wMDAwMDBdIEFD
UEk6IERTRFQgMDAwMDAwMDBhZmY5MDVlMCAwOTQ0OSAodjAxICBBNzY0MCBBNzY0MDEwMCAw
MDAwMDEwMCBJTlRMIDIwMDUxMTE3KQ0KWyAgICAwLjAwMDAwMF0gQUNQSTogRkFDUyAwMDAw
MDAwMGFmZjllMDAwIDAwMDQwDQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBBUElDIDAwMDAwMDAw
YWZmOTAzOTAgMDAwODggKHYwMSA3NjQwTVMgQTc2NDAxMDAgMjAxMDA2MjIgTVNGVCAwMDAw
MDA5NykNClsgICAgMC4wMDAwMDBdIEFDUEk6IE1DRkcgMDAwMDAwMDBhZmY5MDQyMCAwMDAz
QyAodjAxIDc2NDBNUyBPRU1NQ0ZHICAyMDEwMDYyMiBNU0ZUIDAwMDAwMDk3KQ0KWyAgICAw
LjAwMDAwMF0gQUNQSTogU0xJQyAwMDAwMDAwMGFmZjkwNDYwIDAwMTc2ICh2MDEgTVNJICAg
IE9FTVNMSUMgIDIwMTAwNjIyIE1TRlQgMDAwMDAwOTcpDQpbICAgIDAuMDAwMDAwXSBBQ1BJ
OiBPRU1CIDAwMDAwMDAwYWZmOWUwNDAgMDAwNzIgKHYwMSA3NjQwTVMgQTc2NDAxMDAgMjAx
MDA2MjIgTVNGVCAwMDAwMDA5NykNClsgICAgMC4wMDAwMDBdIEFDUEk6IFNSQVQgMDAwMDAw
MDBhZmY5YTVlMCAwMDEwOCAodjAzIEFNRCAgICBGQU1fRl8xMCAwMDAwMDAwMiBBTUQgIDAw
MDAwMDAxKQ0KWyAgICAwLjAwMDAwMF0gQUNQSTogSFBFVCAwMDAwMDAwMGFmZjlhNmYwIDAw
MDM4ICh2MDEgNzY0ME1TIE9FTUhQRVQgIDIwMTAwNjIyIE1TRlQgMDAwMDAwOTcpDQpbICAg
IDAuMDAwMDAwXSBBQ1BJOiBJVlJTIDAwMDAwMDAwYWZmOWE3MzAgMDAxMDAgKHYwMSAgQU1E
ICAgICBSRDg5MFMgMDAyMDIwMzEgQU1EICAwMDAwMDAwMCkNClsgICAgMC4wMDAwMDBdIEFD
UEk6IFNTRFQgMDAwMDAwMDBhZmY5YTgzMCAwMERBNCAodjAxIEEgTSBJICBQT1dFUk5PVyAw
MDAwMDAwMSBBTUQgIDAwMDAwMDAxKQ0KWyAgICAwLjAwMDAwMF0gQUNQSTogTG9jYWwgQVBJ
QyBhZGRyZXNzIDB4ZmVlMDAwMDANClsgICAgMC4wMDAwMDBdIFNjYW5uaW5nIE5VTUEgdG9w
b2xvZ3kgaW4gTm9ydGhicmlkZ2UgMjQNClsgICAgMC4wMDAwMDBdIE5vIE5VTUEgY29uZmln
dXJhdGlvbiBmb3VuZA0KWyAgICAwLjAwMDAwMF0gRmFraW5nIGEgbm9kZSBhdCAwMDAwMDAw
MDAwMDAwMDAwLTAwMDAwMDAwNDAwMDAwMDANClsgICAgMC4wMDAwMDBdIEluaXRtZW0gc2V0
dXAgbm9kZSAwIDAwMDAwMDAwMDAwMDAwMDAtMDAwMDAwMDA0MDAwMDAwMA0KWyAgICAwLjAw
MDAwMF0gICBOT0RFX0RBVEEgWzAwMDAwMDAwM2ZmZmIwMDAgLSAwMDAwMDAwMDNmZmZmZmZm
XQ0KWyAgICAwLjAwMDAwMF0gWm9uZSBQRk4gcmFuZ2VzOg0KWyAgICAwLjAwMDAwMF0gICBE
TUEgICAgICAweDAwMDAwMDEwIC0+IDB4MDAwMDEwMDANClsgICAgMC4wMDAwMDBdICAgRE1B
MzIgICAgMHgwMDAwMTAwMCAtPiAweDAwMTAwMDAwDQpbICAgIDAuMDAwMDAwXSAgIE5vcm1h
bCAgIGVtcHR5DQpbICAgIDAuMDAwMDAwXSBNb3ZhYmxlIHpvbmUgc3RhcnQgUEZOIGZvciBl
YWNoIG5vZGUNClsgICAgMC4wMDAwMDBdIGVhcmx5X25vZGVfbWFwWzJdIGFjdGl2ZSBQRk4g
cmFuZ2VzDQpbICAgIDAuMDAwMDAwXSAgICAgMDogMHgwMDAwMDAxMCAtPiAweDAwMDAwMDlm
DQpbICAgIDAuMDAwMDAwXSAgICAgMDogMHgwMDAwMDEwMCAtPiAweDAwMDQwMDAwDQpbICAg
IDAuMDAwMDAwXSBPbiBub2RlIDAgdG90YWxwYWdlczogMjYyMDMxDQpbICAgIDAuMDAwMDAw
XSAgIERNQSB6b25lOiA2NCBwYWdlcyB1c2VkIGZvciBtZW1tYXANClsgICAgMC4wMDAwMDBd
ICAgRE1BIHpvbmU6IDQ4OCBwYWdlcyByZXNlcnZlZA0KWyAgICAwLjAwMDAwMF0gICBETUEg
em9uZTogMzQzMSBwYWdlcywgTElGTyBiYXRjaDowDQpbICAgIDAuMDAwMDAwXSAgIERNQTMy
IHpvbmU6IDQwMzIgcGFnZXMgdXNlZCBmb3IgbWVtbWFwDQpbICAgIDAuMDAwMDAwXSAgIERN
QTMyIHpvbmU6IDI1NDAxNiBwYWdlcywgTElGTyBiYXRjaDozMQ0KWyAgICAwLjAwMDAwMF0g
QUNQSTogUE0tVGltZXIgSU8gUG9ydDogMHg4MDgNClsgICAgMC4wMDAwMDBdIEFDUEk6IExv
Y2FsIEFQSUMgYWRkcmVzcyAweGZlZTAwMDAwDQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJ
QyAoYWNwaV9pZFsweDAxXSBsYXBpY19pZFsweDAwXSBlbmFibGVkKQ0KWyAgICAwLjAwMDAw
MF0gQklPUyBidWc6IEFQSUMgdmVyc2lvbiBpcyAwIGZvciBDUFUgMC8weDAsIGZpeGluZyB1
cCB0byAweDEwDQpbICAgIDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDAyXSBs
YXBpY19pZFsweDAxXSBlbmFibGVkKQ0KWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFj
cGlfaWRbMHgwM10gbGFwaWNfaWRbMHgwMl0gZW5hYmxlZCkNClsgICAgMC4wMDAwMDBdIEFD
UEk6IExBUElDIChhY3BpX2lkWzB4MDRdIGxhcGljX2lkWzB4MDNdIGVuYWJsZWQpDQpbICAg
IDAuMDAwMDAwXSBBQ1BJOiBMQVBJQyAoYWNwaV9pZFsweDA1XSBsYXBpY19pZFsweDA0XSBl
bmFibGVkKQ0KWyAgICAwLjAwMDAwMF0gQUNQSTogTEFQSUMgKGFjcGlfaWRbMHgwNl0gbGFw
aWNfaWRbMHgwNV0gZW5hYmxlZCkNClsgICAgMC4wMDAwMDBdIEFDUEk6IElPQVBJQyAoaWRb
MHgwNl0gYWRkcmVzc1sweGZlYzAwMDAwXSBnc2lfYmFzZVswXSkNClsgICAgMC4wMDAwMDBd
IElPQVBJQ1swXTogYXBpY19pZCA2LCB2ZXJzaW9uIDI1NSwgYWRkcmVzcyAweGZlYzAwMDAw
LCBHU0kgMC0yNTUNClsgICAgMC4wMDAwMDBdIEFDUEk6IElPQVBJQyAoaWRbMHgwN10gYWRk
cmVzc1sweGZlYzIwMDAwXSBnc2lfYmFzZVsyNF0pDQpbICAgIDAuMDAwMDAwXSBJT0FQSUNb
MV06IGFwaWNfaWQgNywgdmVyc2lvbiAyNTUsIGFkZHJlc3MgMHhmZWMyMDAwMCwgR1NJIDI0
LTI3OQ0KWyAgICAwLjAwMDAwMF0gQUNQSTogSU5UX1NSQ19PVlIgKGJ1cyAwIGJ1c19pcnEg
MCBnbG9iYWxfaXJxIDIgZGZsIGRmbCkNClsgICAgMC4wMDAwMDBdIEFDUEk6IElOVF9TUkNf
T1ZSIChidXMgMCBidXNfaXJxIDkgZ2xvYmFsX2lycSA5IGxvdyBsZXZlbCkNClsgICAgMC4w
MDAwMDBdIEFDUEk6IElSUTAgdXNlZCBieSBvdmVycmlkZS4NClsgICAgMC4wMDAwMDBdIEFD
UEk6IElSUTIgdXNlZCBieSBvdmVycmlkZS4NClsgICAgMC4wMDAwMDBdIEFDUEk6IElSUTkg
dXNlZCBieSBvdmVycmlkZS4NClsgICAgMC4wMDAwMDBdIFVzaW5nIEFDUEkgKE1BRFQpIGZv
ciBTTVAgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbg0KWyAgICAwLjAwMDAwMF0gQUNQSTog
SFBFVCBpZDogMHg4MzAwIGJhc2U6IDB4ZmVkMDAwMDANClsgICAgMC4wMDAwMDBdIFNNUDog
QWxsb3dpbmcgNiBDUFVzLCAwIGhvdHBsdWcgQ1BVcw0KWyAgICAwLjAwMDAwMF0gbnJfaXJx
c19nc2k6IDI5Ng0KWyAgICAwLjAwMDAwMF0gQWxsb2NhdGluZyBQQ0kgcmVzb3VyY2VzIHN0
YXJ0aW5nIGF0IDQwMDAwMDAwIChnYXA6IDQwMDAwMDAwOjZmZjkwMDAwKQ0KWyAgICAwLjAw
MDAwMF0gQm9vdGluZyBwYXJhdmlydHVhbGl6ZWQga2VybmVsIG9uIFhlbg0KWyAgICAwLjAw
MDAwMF0gWGVuIHZlcnNpb246IDQuMS4zLXJjMVsgICAgMC41OTcyNjVdIHBjaWJhY2sgMDAw
MDowNDowMC40OiBQQ0kgSU5UIEMgZGlzYWJsZWQNClsgICAgMC41OTczMTJdIHhlbjogcmVn
aXN0ZXJpbmcgZ3NpIDQxIHRyaWdnZXJpbmcgMCBwb2xhcml0eSAxDQpbICAgIDAuNTk3MzE3
XSB4ZW46IC0tPiBwaXJxPTQxIC0+IGlycT00MSAoZ3NpPTQxKQ0KWyAgICAwLjU5NzMzMV0g
cGNpYmFjayAwMDAwOjA0OjAwLjM6IFBDSSBJTlQgQiAtPiBHU0kgNDEgKGxldmVsLCBsb3cp
IC0+IElSUSA0MQ0KWyAgICAwLjU5NzMzOV0gcGNpYmFjayAwMDAwOjA0OjAwLjM6IFBDSSBJ
TlQgQiBkaXNhYmxlZA0KWyAgICAwLjU5NzQyNV0geGVuOiByZWdpc3RlcmluZyBnc2kgNDEg
dHJpZ2dlcmluZyAwIHBvbGFyaXR5IDENClsgICAgMC41OTc0MjddIHhlbl9tYXBfcGlycV9n
c2k6IHJldHVybmluZyBpcnEgNDEgZm9yIGdzaSA0MQ0KWyAgICAwLjU5NzQyOF0geGVuOiAt
LT4gcGlycT00MSAtPiBpcnE9NDEgKGdzaT00MSkNClsgICAgMC41OTc0MzBdIEFscmVhZHkg
c2V0dXAgdGhlIEdTSSA6NDENClsgICAgMC41OTc0MzJdIHBjaWJhY2sgMDAwMDowNDowMC4y
OiBQQ0kgSU5UIEIgLT4gR1NJIDQxIChsZXZlbCwgbG93KSAtPiBJUlEgNDENClsgICAgMC41
OTc0MzldIHBjaWJhY2sgMDAwMDowNDowMC4yOiBQQ0kgSU5UIEIgZGlzYWJsZWQNClsgICAg
MC41OTc0ODddIHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDQwIHRyaWdnZXJpbmcgMCBwb2xhcml0
eSAxDQpbICAgIDAuNTk3NDkyXSB4ZW46IC0tPiBwaXJxPTQwIC0+IGlycT00MCAoZ3NpPTQw
KQ0KWyAgICAwLjU5NzUwN10gcGNpYmFjayAwMDAwOjA0OjAwLjE6IFBDSSBJTlQgQSAtPiBH
U0kgNDAgKGxldmVsLCBsb3cpIC0+IElSUSA0MA0KWyAgICAwLjU5NzUxNF0gcGNpYmFjayAw
MDAwOjA0OjAwLjE6IFBDSSBJTlQgQSBkaXNhYmxlZA0KWyAgICAwLjU5NzU2Ml0geGVuOiBy
ZWdpc3RlcmluZyBnc2kgNDAgdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDENClsgICAgMC41OTc1
NjRdIHhlbl9tYXBfcGlycV9nc2k6IHJldHVybmluZyBpcnEgNDAgZm9yIGdzaSA0MA0KWyAg
ICAwLjU5NzU2NV0geGVuOiAtLT4gcGlycT00MCAtPiBpcnE9NDAgKGdzaT00MCkNClsgICAg
MC41OTc1NjddIEFscmVhZHkgc2V0dXAgdGhlIEdTSSA6NDANClsgICAgMC41OTc1NjldIHBj
aWJhY2sgMDAwMDowNDowMC4wOiBQQ0kgSU5UIEEgLT4gR1NJIDQwIChsZXZlbCwgbG93KSAt
PiBJUlEgNDANClsgICAgMC41OTc1NzZdIHBjaWJhY2sgMDAwMDowNDowMC4wOiBQQ0kgSU5U
IEEgZGlzYWJsZWQNClsgICAgMC41OTc2MTddIHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDMzIHRy
aWdnZXJpbmcgMCBwb2xhcml0eSAxDQpbICAgIDAuNTk3NjIyXSB4ZW46IC0tPiBwaXJxPTMz
IC0+IGlycT0zMyAoZ3NpPTMzKQ0KWyAgICAwLjU5NzYzN10gcGNpYmFjayAwMDAwOjA1OjAw
LjE6IFBDSSBJTlQgQiAtPiBHU0kgMzMgKGxldmVsLCBsb3cpIC0+IElSUSAzMw0KWyAgICAw
LjU5NzY0NF0gcGNpYmFjayAwMDAwOjA1OjAwLjE6IFBDSSBJTlQgQiBkaXNhYmxlZA0KWyAg
ICAwLjU5NzY4Nl0gcGNpYmFjayAwMDAwOjA1OjAwLjA6IGVuYWJsaW5nIGRldmljZSAoMDAw
MCAtPiAwMDAzKQ0KWyAgICAwLjU5NzY5MF0geGVuOiByZWdpc3RlcmluZyBnc2kgMzIgdHJp
Z2dlcmluZyAwIHBvbGFyaXR5IDENClsgICAgMC41OTc2OTVdIHhlbjogLS0+IHBpcnE9MzIg
LT4gaXJxPTMyIChnc2k9MzIpDQpbICAgIDAuNTk3NzEwXSBwY2liYWNrIDAwMDA6MDU6MDAu
MDogUENJIElOVCBBIC0+IEdTSSAzMiAobGV2ZWwsIGxvdykgLT4gSVJRIDMyDQpbICAgIDAu
NTk3NzE1XSBwY2liYWNrIDAwMDA6MDU6MDAuMDogUENJIElOVCBBIGRpc2FibGVkDQpbICAg
IDAuNTk3NzUyXSBwY2liYWNrIDAwMDA6MDc6MDEuMjogZW5hYmxpbmcgZGV2aWNlICgwMTE0
IC0+IDAxMTYpDQpbICAgIDAuNTk3NzU4XSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSA0NiB0cmln
Z2VyaW5nIDAgcG9sYXJpdHkgMQ0KWyAgICAwLjU5Nzc2Ml0geGVuOiAtLT4gcGlycT00NiAt
PiBpcnE9NDYgKGdzaT00NikNClsgICAgMC41OTc3NzddIHBjaWJhY2sgMDAwMDowNzowMS4y
OiBQQ0kgSU5UIEMgLT4gR1NJIDQ2IChsZXZlbCwgbG93KSAtPiBJUlEgNDYNClsgICAgMC41
OTc3ODVdIHBjaWJhY2sgMDAwMDowNzowMS4yOiBQQ0kgSU5UIEMgZGlzYWJsZWQNClsgICAg
MC41OTc4MjVdIHBjaWJhY2sgMDAwMDowNzowMS4xOiBlbmFibGluZyBkZXZpY2UgKDAxMTQg
LT4gMDExNikNClsgICAgMC41OTc4MzBdIHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDQ1IHRyaWdn
ZXJpbmcgMCBwb2xhcml0eSAxDQpbICAgIDAuNTk3ODM0XSB4ZW46IC0tPiBwaXJxPTQ1IC0+
IGlycT00NSAoZ3NpPTQ1KQ0KWyAgICAwLjU5Nzg1MF0gcGNpYmFjayAwMDAwOjA3OjAxLjE6
IFBDSSBJTlQgQiAtPiBHU0kgNDUgKGxldmVsLCBsb3cpIC0+IElSUSA0NQ0KWyAgICAwLjU5
Nzg1OF0gcGNpYmFjayAwMDAwOjA3OjAxLjE6IFBDSSBJTlQgQiBkaXNhYmxlZA0KWyAgICAw
LjU5Nzg5M10gcGNpYmFjayAwMDAwOjA3OjAxLjA6IGVuYWJsaW5nIGRldmljZSAoMDExNCAt
PiAwMTE2KQ0KWyAgICAwLjU5Nzg5OF0geGVuOiByZWdpc3RlcmluZyBnc2kgNDQgdHJpZ2dl
cmluZyAwIHBvbGFyaXR5IDENClsgICAgMC41OTc5MDNdIHhlbjogLS0+IHBpcnE9NDQgLT4g
aXJxPTQ0IChnc2k9NDQpDQpbICAgIDAuNTk3OTE3XSBwY2liYWNrIDAwMDA6MDc6MDEuMDog
UENJIElOVCBBIC0+IEdTSSA0NCAobGV2ZWwsIGxvdykgLT4gSVJRIDQ0DQpbICAgIDAuNTk3
OTI1XSBwY2liYWNrIDAwMDA6MDc6MDEuMDogUENJIElOVCBBIGRpc2FibGVkDQpbICAgIDAu
NTk3OTc5XSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAzMSB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkg
MQ0KWyAgICAwLjU5Nzk4M10geGVuOiAtLT4gcGlycT0zMSAtPiBpcnE9MzEgKGdzaT0zMSkN
ClsgICAgMC41OTc5OTldIHBjaWJhY2sgMDAwMDowYTowMC43OiBQQ0kgSU5UIEQgLT4gR1NJ
IDMxIChsZXZlbCwgbG93KSAtPiBJUlEgMzENClsgICAgMC41OTgwMDddIHBjaWJhY2sgMDAw
MDowYTowMC43OiBQQ0kgSU5UIEQgZGlzYWJsZWQNClsgICAgMC41OTgwNjddIHhlbjogcmVn
aXN0ZXJpbmcgZ3NpIDMxIHRyaWdnZXJpbmcgMCBwb2xhcml0eSAxDQpbICAgIDAuNTk4MDY5
XSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1cm5pbmcgaXJxIDMxIGZvciBnc2kgMzENClsgICAg
MC41OTgwNzBdIHhlbjogLS0+IHBpcnE9MzEgLT4gaXJxPTMxIChnc2k9MzEpDQpbICAgIDAu
NTk4MDcyXSBBbHJlYWR5IHNldHVwIHRoZSBHU0kgOjMxDQpbICAgIDAuNTk4MDc0XSBwY2li
YWNrIDAwMDA6MGE6MDAuNjogUENJIElOVCBEIC0+IEdTSSAzMSAobGV2ZWwsIGxvdykgLT4g
SVJRIDMxDQpbICAgIDAuNTk4MDgxXSBwY2liYWNrIDAwMDA6MGE6MDAuNjogUENJIElOVCBE
IGRpc2FibGVkDQpbICAgIDAuNTk4MTM5XSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAzMCB0cmln
Z2VyaW5nIDAgcG9sYXJpdHkgMQ0KWyAgICAwLjU5ODE0NF0geGVuOiAtLT4gcGlycT0zMCAt
PiBpcnE9MzAgKGdzaT0zMCkNClsgICAgMC41OTgxNTldIHBjaWJhY2sgMDAwMDowYTowMC41
OiBQQ0kgSU5UIEMgLT4gR1NJIDMwIChsZXZlbCwgbG93KSAtPiBJUlEgMzANClsgICAgMC41
OTgxNjddIHBjaWJhY2sgMDAwMDowYTowMC41OiBQQ0kgSU5UIEMgZGlzYWJsZWQNClsgICAg
MC41OTgyMTldIHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDMwIHRyaWdnZXJpbmcgMCBwb2xhcml0
eSAxDQpbICAgIDAuNTk4MjIxXSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1cm5pbmcgaXJxIDMw
IGZvciBnc2kgMzANClsgICAgMC41OTgyMjJdIHhlbjogLS0+IHBpcnE9MzAgLT4gaXJxPTMw
IChnc2k9MzApDQpbICAgIDAuNTk4MjI0XSBBbHJlYWR5IHNldHVwIHRoZSBHU0kgOjMwDQpb
ICAgIDAuNTk4MjI1XSBwY2liYWNrIDAwMDA6MGE6MDAuNDogUENJIElOVCBDIC0+IEdTSSAz
MCAobGV2ZWwsIGxvdykgLT4gSVJRIDMwDQpbICAgIDAuNTk4MjMzXSBwY2liYWNrIDAwMDA6
MGE6MDAuNDogUENJIElOVCBDIGRpc2FibGVkDQpbICAgIDAuNTk4Mjg3XSB4ZW46IHJlZ2lz
dGVyaW5nIGdzaSAyOSB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkgMQ0KWyAgICAwLjU5ODI5M10g
eGVuOiAtLT4gcGlycT0yOSAtPiBpcnE9MjkgKGdzaT0yOSkNClsgICAgMC41OTgzMDldIHBj
aWJhY2sgMDAwMDowYTowMC4zOiBQQ0kgSU5UIEIgLT4gR1NJIDI5IChsZXZlbCwgbG93KSAt
PiBJUlEgMjkNClsgICAgMC41OTgzMTddIHBjaWJhY2sgMDAwMDowYTowMC4zOiBQQ0kgSU5U
IEIgZGlzYWJsZWQNClsgICAgMC41OTgzNjldIHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDI5IHRy
aWdnZXJpbmcgMCBwb2xhcml0eSAxDQpbICAgIDAuNTk4MzcxXSB4ZW5fbWFwX3BpcnFfZ3Np
OiByZXR1cm5pbmcgaXJxIDI5IGZvciBnc2kgMjkNClsgICAgMC41OTgzNzJdIHhlbjogLS0+
IHBpcnE9MjkgLT4gaXJxPTI5IChnc2k9MjkpDQpbICAgIDAuNTk4MzczXSBBbHJlYWR5IHNl
dHVwIHRoZSBHU0kgOjI5DQpbICAgIDAuNTk4Mzc1XSBwY2liYWNrIDAwMDA6MGE6MDAuMjog
UENJIElOVCBCIC0+IEdTSSAyOSAobGV2ZWwsIGxvdykgLT4gSVJRIDI5DQpbICAgIDAuNTk4
MzgzXSBwY2liYWNrIDAwMDA6MGE6MDAuMjogUENJIElOVCBCIGRpc2FibGVkDQpbICAgIDAu
NTk4NDM1XSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAyOCB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkg
MQ0KWyAgICAwLjU5ODQ0MF0geGVuOiAtLT4gcGlycT0yOCAtPiBpcnE9MjggKGdzaT0yOCkN
ClsgICAgMC41OTg0NTVdIHBjaWJhY2sgMDAwMDowYTowMC4xOiBQQ0kgSU5UIEEgLT4gR1NJ
IDI4IChsZXZlbCwgbG93KSAtPiBJUlEgMjgNClsgICAgMC41OTg0NjNdIHBjaWJhY2sgMDAw
MDowYTowMC4xOiBQQ0kgSU5UIEEgZGlzYWJsZWQNClsgICAgMC41OTg1NDZdIHhlbjogcmVn
aXN0ZXJpbmcgZ3NpIDI4IHRyaWdnZXJpbmcgMCBwb2xhcml0eSAxDQpbICAgIDAuNTk4NTQ5
XSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1cm5pbmcgaXJxIDI4IGZvciBnc2kgMjgNClsgICAg
MC41OTg1NTBdIHhlbjogLS0+IHBpcnE9MjggLT4gaXJxPTI4IChnc2k9MjgpDQpbICAgIDAu
NTk4NTUyXSBBbHJlYWR5IHNldHVwIHRoZSBHU0kgOjI4DQpbICAgIDAuNTk4NTUzXSBwY2li
YWNrIDAwMDA6MGE6MDAuMDogUENJIElOVCBBIC0+IEdTSSAyOCAobGV2ZWwsIGxvdykgLT4g
SVJRIDI4DQpbICAgIDAuNTk4NTYzXSBwY2liYWNrIDAwMDA6MGE6MDAuMDogUENJIElOVCBB
IGRpc2FibGVkDQpbICAgIDAuNTk5MjU3XSB4ZW4tcGNpYmFjazogYmFja2VuZCBpcyBwYXNz
dGhyb3VnaA0KWyAgICAwLjYwMDUyOV0gaW5pdGNhbGwgeGVuX3BjaWJrX2luaXQrMHgwLzB4
MTM2IHJldHVybmVkIDAgYWZ0ZXIgMzUyOSB1c2Vjcw0KWyAgICAwLjYwMDUzM10gY2FsbGlu
ZyAgcHR5X2luaXQrMHgwLzB4MzQ1IEAgMQ0KWyAgICAwLjYwMTc1NV0gaW5pdGNhbGwgcHR5
X2luaXQrMHgwLzB4MzQ1IHJldHVybmVkIDAgYWZ0ZXIgMTE4NiB1c2Vjcw0KWyAgICAwLjYw
MTc1OV0gY2FsbGluZyAgc3lzcnFfaW5pdCsweDAvMHg3OCBAIDENClsgICAgMC42MDE3NzJd
IGluaXRjYWxsIHN5c3JxX2luaXQrMHgwLzB4NzggcmV0dXJuZWQgMCBhZnRlciAxMSB1c2Vj
cw0KWyAgICAwLjYwMTc3NF0gY2FsbGluZyAgeGVuX2h2Y19pbml0KzB4MC8weDEzYiBAIDEN
ClsgICAgMC42MTU1ODNdIGluaXRjYWxsIHhlbl9odmNfaW5pdCsweDAvMHgxM2IgcmV0dXJu
ZWQgMCBhZnRlciAxMzQ2OCB1c2Vjcw0KWyAgICAwLjYxNTU5M10gY2FsbGluZyAgc2VyaWFs
ODI1MF9pbml0KzB4MC8weDE5NCBAIDENClsgICAgMC42MTU1OTldIFNlcmlhbDogODI1MC8x
NjU1MCBkcml2ZXIsIDQgcG9ydHMsIElSUSBzaGFyaW5nIGVuYWJsZWQNClsgICAgMS4zMjUw
NzZdIGluaXRjYWxsIHNlcmlhbDgyNTBfaW5pdCsweDAvMHgxOTQgcmV0dXJuZWQgMCBhZnRl
ciA2OTI4MzIgdXNlY3MNClsgICAgMS4zMjYwMDBdIGNhbGxpbmcgIHNlcmlhbDgyNTBfcG5w
X2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDEuMzY5NTExXSBpbml0Y2FsbCBzZXJpYWw4MjUw
X3BucF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMjg0OTcgdXNlY3MNClsgICAg
MS4zNzA0MzldIGNhbGxpbmcgIHNlcmlhbDgyNTBfcGNpX2luaXQrMHgwLzB4MWIgQCAxDQpb
ICAgIDEuMzg4MjcyXSBpbml0Y2FsbCBzZXJpYWw4MjUwX3BjaV9pbml0KzB4MC8weDFiIHJl
dHVybmVkIDAgYWZ0ZXIgMzEwNiB1c2Vjcw0KWyAgICAxLjM4OTE4OF0gY2FsbGluZyAgcmFu
ZF9pbml0aWFsaXplKzB4MC8weDMwIEAgMQ0KWyAgICAxLjM4OTE4OF0gaW5pdGNhbGwgcmFu
ZF9pbml0aWFsaXplKzB4MC8weDMwIHJldHVybmVkIDAgYWZ0ZXIgNyB1c2Vjcw0KWyAgICAx
LjM4OTE4OF0gY2FsbGluZyAgaHBldF9pbml0KzB4MC8weDZhIEAgMQ0KWyAgICAxLjQxNTIz
NF0gaHBldF9hY3BpX2FkZDogbm8gYWRkcmVzcyBvciBpcnFzIGluIF9DUlMNClsgICAgMS40
MjIwNTJdIGluaXRjYWxsIGhwZXRfaW5pdCsweDAvMHg2YSByZXR1cm5lZCAwIGFmdGVyIDgw
ODMgdXNlY3MNClsgICAgMS40MjMwMjBdIGNhbGxpbmcgIG52cmFtX2luaXQrMHgwLzB4ODIg
QCAxDQpbICAgIDEuNDM0NjI4XSBOb24tdm9sYXRpbGUgbWVtb3J5IGRyaXZlciB2MS4zDQpb
ICAgIDEuNDM1NTcyXSBpbml0Y2FsbCBudnJhbV9pbml0KzB4MC8weDgyIHJldHVybmVkIDAg
YWZ0ZXIgNjcxNSB1c2Vjcw0KWyAgICAxLjQzNTU3Ml0gY2FsbGluZyAgbW9kX2luaXQrMHgw
LzB4NWEgQCAxDQpbICAgIDEuNDM1NTcyXSBpbml0Y2FsbCBtb2RfaW5pdCsweDAvMHg1YSBy
ZXR1cm5lZCAtMTkgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAxLjQzNTU3Ml0gY2FsbGluZyAgYWdw
X2luaXQrMHgwLzB4MjYgQCAxDQpbICAgIDEuNDM1NTcyXSBMaW51eCBhZ3BnYXJ0IGludGVy
ZmFjZSB2MC4xMDMNClsgICAgMS40NjQxNDBdIGluaXRjYWxsIGFncF9pbml0KzB4MC8weDI2
IHJldHVybmVkIDAgYWZ0ZXIgNTQxOSB1c2Vjcw0KWyAgICAxLjQ2NDE0MF0gY2FsbGluZyAg
YWdwX2FtZDY0X21vZF9pbml0KzB4MC8weDIyIEAgMQ0KWyAgICAxLjQ4OTExMF0gaW5pdGNh
bGwgYWdwX2FtZDY0X21vZF9pbml0KzB4MC8weDIyIHJldHVybmVkIC0xOSBhZnRlciAyMDI5
NSB1c2Vjcw0KWyAgICAxLjQ5MDA3Nl0gY2FsbGluZyAgYWdwX2ludGVsX2luaXQrMHgwLzB4
MjkgQCAxDQpbICAgIDEuNTAyOTMwXSBpbml0Y2FsbCBhZ3BfaW50ZWxfaW5pdCsweDAvMHgy
OSByZXR1cm5lZCAwIGFmdGVyIDEwOTMgdXNlY3MNClsgICAgMS41MDM4ODJdIGNhbGxpbmcg
IGRybV9jb3JlX2luaXQrMHgwLzB4MTM5IEAgMQ0KWyAgICAxLjUxNjE1NV0gW2RybV0gSW5p
dGlhbGl6ZWQgZHJtIDEuMS4wIDIwMDYwODEwDQpbICAgIDEuNTE3MDk4XSBpbml0Y2FsbCBk
cm1fY29yZV9pbml0KzB4MC8weDEzOSByZXR1cm5lZCAwIGFmdGVyIDY0ODUgdXNlY3MNClsg
ICAgMS41MTcwOThdIGNhbGxpbmcgIGk5MTVfaW5pdCsweDAvMHg4ZCBAIDENClsgICAgMS41
MTcwOThdIFtkcm06aTkxNV9pbml0XSAqRVJST1IqIGRybS9pOTE1IGNhbid0IHdvcmsgd2l0
aG91dCBpbnRlbF9hZ3AgbW9kdWxlIQ0KWyAgICAxLjUxNzA5OF0gaW5pdGNhbGwgaTkxNV9p
bml0KzB4MC8weDhkIHJldHVybmVkIC0xOSBhZnRlciA1NjQ5IHVzZWNzDQpbICAgIDEuNTE3
MDk4XSBjYWxsaW5nICBjbl9wcm9jX2luaXQrMHgwLzB4M2QgQCAxDQpbICAgIDEuNTE3MDk4
XSBpbml0Y2FsbCBjbl9wcm9jX2luaXQrMHgwLzB4M2QgcmV0dXJuZWQgMCBhZnRlciAxIHVz
ZWNzDQpbICAgIDEuNTE3MDk4XSBjYWxsaW5nICB0b3BvbG9neV9zeXNmc19pbml0KzB4MC8w
eDU4IEAgMQ0KWyAgICAxLjU2MjM2NF0gaW5pdGNhbGwgdG9wb2xvZ3lfc3lzZnNfaW5pdCsw
eDAvMHg1OCByZXR1cm5lZCAwIGFmdGVyIDU1IHVzZWNzDQpbICAgIDEuNTYzMzE2XSBjYWxs
aW5nICBicmRfaW5pdCsweDAvMHgxZDQgQCAxDQpbICAgIDEuNjMyNjY3XSBicmQ6IG1vZHVs
ZSBsb2FkZWQNClsgICAgMS42MzM1NTFdIGluaXRjYWxsIGJyZF9pbml0KzB4MC8weDFkNCBy
ZXR1cm5lZCAwIGFmdGVyIDY1NDY5IHVzZWNzDQpbICAgIDEuNjMzNTUxXSBjYWxsaW5nICBs
b29wX2luaXQrMHgwLzB4MTM5IEAgMQ0KWyAgICAzLjI4MzU4Nl0gbG9vcDogbW9kdWxlIGxv
YWRlZA0KWyAgICAzLjI4NDQ2M10gaW5pdGNhbGwgbG9vcF9pbml0KzB4MC8weDEzOSByZXR1
cm5lZCAwIGFmdGVyIDE1OTQ4NjMgdXNlY3MNClsgICAgMy4yOTk0ODBdIGNhbGxpbmcgIHhs
YmxrX2luaXQrMHgwLzB4OWQgQCAxDQpbICAgIDMuMzEwMTk3XSBpbml0Y2FsbCB4bGJsa19p
bml0KzB4MC8weDlkIHJldHVybmVkIDAgYWZ0ZXIgMjkyMCB1c2Vjcw0KWyAgICAzLjMxMTEy
M10gY2FsbGluZyAgeGVuX2Jsa2lmX2luaXQrMHgwLzB4MjU2IEAgMQ0KWyAgICAzLjMyNzAy
NV0gaW5pdGNhbGwgeGVuX2Jsa2lmX2luaXQrMHgwLzB4MjU2IHJldHVybmVkIDAgYWZ0ZXIg
MjEwMyB1c2Vjcw0KWyAgICAzLjMyNzk2NV0gY2FsbGluZyAgbWFjX2hpZF9pbml0KzB4MC8w
eDIyIEAgMQ0KWyAgICAzLjMyNzk2NV0gaW5pdGNhbGwgbWFjX2hpZF9pbml0KzB4MC8weDIy
IHJldHVybmVkIDAgYWZ0ZXIgMTQgdXNlY3MNClsgICAgMy4zNDIyMTJdIGNhbGxpbmcgIHNw
aV90cmFuc3BvcnRfaW5pdCsweDAvMHg3OSBAIDENClsgICAgMy4zNTI3NzldIGluaXRjYWxs
IHNwaV90cmFuc3BvcnRfaW5pdCsweDAvMHg3OSByZXR1cm5lZCAwIGFmdGVyIDIwNDIgdXNl
Y3MNClsgICAgMy4zNTM3NDZdIGNhbGxpbmcgIGluaXRfc2QrMHgwLzB4MTRhIEAgMQ0KWyAg
ICAzLjM2ODczN10gaW5pdGNhbGwgaW5pdF9zZCsweDAvMHgxNGEgcmV0dXJuZWQgMCBhZnRl
ciAzMTQ3IHVzZWNzDQpbICAgIDMuMzY5Njc4XSBjYWxsaW5nICBpbml0X3NyKzB4MC8weDQ2
IEAgMQ0KWyAgICAzLjM4MTk3Nl0gaW5pdGNhbGwgaW5pdF9zcisweDAvMHg0NiByZXR1cm5l
ZCAwIGFmdGVyIDEyOTAgdXNlY3MNClsgICAgMy4zODI5NDNdIGNhbGxpbmcgIGluaXRfc2cr
MHgwLzB4MTIyIEAgMQ0KWyAgICAzLjM5NTA3Ml0gaW5pdGNhbGwgaW5pdF9zZysweDAvMHgx
MjIgcmV0dXJuZWQgMCBhZnRlciAxMjg0IHVzZWNzDQpbICAgIDMuMzk2MDA5XSBjYWxsaW5n
ICBhaGNpX2luaXQrMHgwLzB4MWIgQCAxDQpbICAgIDMuNDA3NTIyXSBhaGNpIDAwMDA6MDA6
MTEuMDogdmVyc2lvbiAzLjANClsgICAgMy40MTM0NjRdIHhlbjogcmVnaXN0ZXJpbmcgZ3Np
IDE5IHRyaWdnZXJpbmcgMCBwb2xhcml0eSAxDQpbICAgIDMuNDE5MzQ0XSB4ZW46IC0tPiBw
aXJxPTE5IC0+IGlycT0xOSAoZ3NpPTE5KQ0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTZd
IElPQVBJQ1swXTogU2V0IFBDSSByb3V0aW5nIGVudHJ5ICg2LTE5IC0+IDB4YjEgLT4gSVJR
IDE5IE1vZGU6MSBBY3RpdmU6MSkNClsgICAgMy40MjUyNDRdIGFoY2kgMDAwMDowMDoxMS4w
OiBQQ0kgSU5UIEEgLT4gR1NJIDE5IChsZXZlbCwgbG93KSAtPiBJUlEgMTkNClsgICAgMy40
MzEzMTBdIGFoY2kgMDAwMDowMDoxMS4wOiBBSENJIDAwMDEuMDIwMCAzMiBzbG90cyA0IHBv
cnRzIDYgR2JwcyAweGYgaW1wbCBTQVRBIG1vZGUNClsgICAgMy40MzIxNzBdIGFoY2kgMDAw
MDowMDoxMS4wOiBmbGFnczogNjRiaXQgbmNxIHNudGYgaWxjayBwbSBsZWQgY2xvIHBtcCBw
aW8gc2x1bSBwYXJ0IA0KWyAgICAzLjQ2NDA0MV0gc2NzaTAgOiBhaGNpDQpbICAgIDMuNDc0
MjE3XSBzY3NpMSA6IGFoY2kNClsgICAgMy40ODM0NDNdIHNjc2kyIDogYWhjaQ0KWyAgICAz
LjQ5MTk0N10gc2NzaTMgOiBhaGNpDQpbICAgIDMuNTAwODkyXSBhdGExOiBTQVRBIG1heCBV
RE1BLzEzMyBhYmFyIG0xMDI0QDB4Zjk4ZmYwMDAgcG9ydCAweGY5OGZmMTAwIGlycSAzNDIN
ClsgICAgMy41MDE2OTddIGF0YTI6IFNBVEEgbWF4IFVETUEvMTMzIGFiYXIgbTEwMjRAMHhm
OThmZjAwMCBwb3J0IDB4Zjk4ZmYxODAgaXJxIDM0Mg0KWyAgICAzLjUwMTY5N10gYXRhMzog
U0FUQSBtYXggVURNQS8xMzMgYWJhciBtMTAyNEAweGY5OGZmMDAwIHBvcnQgMHhmOThmZjIw
MCBpcnEgMzQyDQpbICAgIDMuNTAxNjk3XSBhdGE0OiBTQVRBIG1heCBVRE1BLzEzMyBhYmFy
IG0xMDI0QDB4Zjk4ZmYwMDAgcG9ydCAweGY5OGZmMjgwIGlycSAzNDINClsgICAgMy41MjQy
NDJdIGNhbGxpbmcgIDJfYXN5bmNfcG9ydF9wcm9iZSsweDAvMHg3MCBAIDI1DQpbICAgIDMu
NTI0Mjg5XSBjYWxsaW5nICAzX2FzeW5jX3BvcnRfcHJvYmUrMHgwLzB4NzAgQCA1DQpbICAg
IDMuNTM1NTg0XSBjYWxsaW5nICA0X2FzeW5jX3BvcnRfcHJvYmUrMHgwLzB4NzAgQCAxMTEx
DQpbICAgIDMuNTQxNDg0XSBjYWxsaW5nICA1X2FzeW5jX3BvcnRfcHJvYmUrMHgwLzB4NzAg
QCAxNzQ5DQpbICAgIDMuNTQyODYyXSBpbml0Y2FsbCBhaGNpX2luaXQrMHgwLzB4MWIgcmV0
dXJuZWQgMCBhZnRlciAxMzI5MjcgdXNlY3MNClsgICAgMy41NDI4NjVdIGNhbGxpbmcgIGFo
Y2lfaW5pdCsweDAvMHgxOSBAIDENClsgICAgMy41NDU3MTNdIGluaXRjYWxsIGFoY2lfaW5p
dCsweDAvMHgxOSByZXR1cm5lZCAtMTkgYWZ0ZXIgMjc3MiB1c2Vjcw0KKFhFTikgWzIwMTEt
MTAtMjYgMTM6MzI6NTZdIElPQVBJQ1sxXTogU2V0IFBDSSByb3V0aW5nIGVudHJ5ICg3LTI3
IC0+IDB4YzkgLT4gSVJRIDUxIE1vZGU6MSBBY3RpdmU6MSkNClsgICAgMy41NDU3MTddIGNh
bGxpbmcgIG5ldF9vbGRkZXZzX2luaXQrMHgwLzB4OWYgQCAxDQpbICAgIDMuNTQ1NzIzXSBp
bml0Y2FsbCBuZXRfb2xkZGV2c19pbml0KzB4MC8weDlmIHJldHVybmVkIDAgYWZ0ZXIgNCB1
c2Vjcw0KWyAgICAzLjU0NTcyNV0gY2FsbGluZyAgcmVhbHRla19pbml0KzB4MC8weDEyIEAg
MQ0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTZdIElPQVBJQ1swXTogU2V0IFBDSSByb3V0
aW5nIGVudHJ5ICg2LTE3IC0+IDB4ZDkgLT4gSVJRIDE3IE1vZGU6MSBBY3RpdmU6MSkNClsg
ICAgMy41NDY5NTZdIGluaXRjYWxsIHJlYWx0ZWtfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAw
IGFmdGVyIDExOTQgdXNlY3MNClsgICAgMy41NDY5NjBdIGNhbGxpbmcgIHR1bl9pbml0KzB4
MC8weDkzIEAgMQ0KWyAgICAzLjU0Njk2MV0gdHVuOiBVbml2ZXJzYWwgVFVOL1RBUCBkZXZp
Y2UgZHJpdmVyLCAxLjYNClsgICAgMy41NDY5NjNdIHR1bjogKEMpIDE5OTktMjAwNCBNYXgg
S3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPg0KWyAgICAzLjU0Nzg3NV0gaW5pdGNh
bGwgdHVuX2luaXQrMHgwLzB4OTMgcmV0dXJuZWQgMCBhZnRlciA4NzcgdXNlY3MNClsgICAg
My41NDc4ODVdIGNhbGxpbmcgIHZldGhfaW5pdCsweDAvMHgxMiBAIDENClsgICAgMy41NDc4
OTRdIGluaXRjYWxsIHZldGhfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDEgdXNl
Y3MNClsgICAgMy41NDc5MDJdIGNhbGxpbmcgIHRnM19pbml0KzB4MC8weDFiIEAgMQ0KWyAg
ICAzLjU0OTU3Nl0gaW5pdGNhbGwgdGczX2luaXQrMHgwLzB4MWIgcmV0dXJuZWQgMCBhZnRl
ciAxNjIzIHVzZWNzDQpbICAgIDMuNTQ5NTgwXSBjYWxsaW5nICBlMTAwX2luaXRfbW9kdWxl
KzB4MC8weDVkIEAgMQ0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzI6NTZdIElPQVBJQ1swXTog
U2V0IFBDSSByb3V0aW5nIGVudHJ5ICg2LTE4IC0+IDB4MjIgLT4gSVJRIDE4IE1vZGU6MSBB
Y3RpdmU6MSkNClsgICAgMy41NDk1ODJdIGUxMDA6IEludGVsKFIpIFBSTy8xMDAgTmV0d29y
ayBEcml2ZXIsIDMuNS4yNC1rMi1OQVBJDQpbICAgIDMuNTQ5NTg0XSBlMTAwOiBDb3B5cmln
aHQoYykgMTk5OS0yMDA2IEludGVsIENvcnBvcmF0aW9uDQpbICAgIDMuNTUwODk4XSBpbml0
Y2FsbCBlMTAwX2luaXRfbW9kdWxlKzB4MC8weDVkIHJldHVybmVkIDAgYWZ0ZXIgMTI3OCB1
c2Vjcw0KWyAgICAzLjU1MDkwMV0gY2FsbGluZyAgZTEwMDBfaW5pdF9tb2R1bGUrMHgwLzB4
ODcgQCAxDQpbICAgIDMuNTUwOTAzXSBlMTAwMDogSW50ZWwoUikgUFJPLzEwMDAgTmV0d29y
ayBEcml2ZXIgLSB2ZXJzaW9uIDcuMy4yMS1rOC1OQVBJDQpbICAgIDMuNTUwOTA0XSBlMTAw
MDogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDYgSW50ZWwgQ29ycG9yYXRpb24uDQpbICAgIDMu
NTUyNzk0XSBpbml0Y2FsbCBlMTAwMF9pbml0X21vZHVsZSsweDAvMHg4NyByZXR1cm5lZCAw
IGFmdGVyIDE4MzkgdXNlY3MNClsgICAgMy41NTI3OTddIGNhbGxpbmcgIHNreTJfaW5pdF9t
b2R1bGUrMHgwLzB4MjkgQCAxDQpbICAgIDMuNTUyNzk4XSBza3kyOiBkcml2ZXIgdmVyc2lv
biAxLjI5DQpbICAgIDMuNTU0NzQyXSBpbml0Y2FsbCBza3kyX2luaXRfbW9kdWxlKzB4MC8w
eDI5IHJldHVybmVkIDAgYWZ0ZXIgMTg5MCB1c2Vjcw0KWyAgICAzLjU1NDc0Nl0gY2FsbGlu
ZyAgaW5pdF9uaWMrMHgwLzB4MWIgQCAxDQpbICAgIDMuNTU2MTExXSBpbml0Y2FsbCBpbml0
X25pYysweDAvMHgxYiByZXR1cm5lZCAwIGFmdGVyIDEzMjQgdXNlY3MNClsgICAgMy41NTYx
MTRdIGNhbGxpbmcgIHJ0bDgxMzlfaW5pdF9tb2R1bGUrMHgwLzB4MWIgQCAxDQpbICAgIDMu
NTU3NDI5XSBpbml0Y2FsbCBydGw4MTM5X2luaXRfbW9kdWxlKzB4MC8weDFiIHJldHVybmVk
IDAgYWZ0ZXIgMTI3NiB1c2Vjcw0KWyAgICAzLjU1NzQzMl0gY2FsbGluZyAgcnRsODE2OV9p
bml0X21vZHVsZSsweDAvMHgxYiBAIDENClsgICAgMy41NTgxMzBdIHI4MTY5IEdpZ2FiaXQg
RXRoZXJuZXQgZHJpdmVyIDIuM0xLLU5BUEkgbG9hZGVkDQpbICAgIDMuNTU4MTY1XSB4ZW46
IHJlZ2lzdGVyaW5nIGdzaSA0NiB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkgMQ0KWyAgICAzLjU1
ODE3NF0geGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5nIGlycSA0NiBmb3IgZ3NpIDQ2DQpb
ICAgIDMuNTU4MTc1XSB4ZW46IC0tPiBwaXJxPTQ2IC0+IGlycT00NiAoZ3NpPTQ2KQ0KWyAg
ICAzLjU1ODE3N10gQWxyZWFkeSBzZXR1cCB0aGUgR1NJIDo0Ng0KWyAgICAzLjU1ODIxOV0g
cjgxNjkgMDAwMDowOTowMC4wOiBQQ0kgSU5UIEEgLT4gR1NJIDQ2IChsZXZlbCwgbG93KSAt
PiBJUlEgNDYNClsgICAgMy41NTgyNjZdIHI4MTY5IDAwMDA6MDk6MDAuMDogc2V0dGluZyBs
YXRlbmN5IHRpbWVyIHRvIDY0DQpbICAgIDMuNTYzMDExXSByODE2OSAwMDAwOjA5OjAwLjA6
IGV0aDA6IFJUTDgxNjhkLzgxMTFkIGF0IDB4ZmZmZmM5MDAwMDFhMjAwMCwgNDA6NjE6ODY6
ZjQ6Njc6ZDksIFhJRCAwODEwMDBjMCBJUlEgMzQzDQpbICAgIDMuNTYzMDE0XSByODE2OSAw
MDAwOjA5OjAwLjA6IGV0aDA6IGp1bWJvIGZlYXR1cmVzIFtmcmFtZXM6IDkyMDAgYnl0ZXMs
IHR4IGNoZWNrc3VtbWluZzoga29dDQpbICAgIDMuNTYzNzUxXSByODE2OSBHaWdhYml0IEV0
aGVybmV0IGRyaXZlciAyLjNMSy1OQVBJIGxvYWRlZA0KWyAgICAzLjU2Mzc4N10geGVuOiBy
ZWdpc3RlcmluZyBnc2kgNTEgdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDENClsgICAgMy41NjM4
MDNdIHhlbjogLS0+IHBpcnE9NTEgLT4gaXJxPTUxIChnc2k9NTEpDQpbICAgIDMuNTYzODMx
XSByODE2OSAwMDAwOjA4OjAwLjA6IFBDSSBJTlQgQSAtPiBHU0kgNTEgKGxldmVsLCBsb3cp
IC0+IElSUSA1MQ0KWyAgICAzLjU2Mzg3M10gcjgxNjkgMDAwMDowODowMC4wOiBzZXR0aW5n
IGxhdGVuY3kgdGltZXIgdG8gNjQNClsgICAgMy41Njc5MjVdIHI4MTY5IDAwMDA6MDg6MDAu
MDogZXRoMTogUlRMODE2OGQvODExMWQgYXQgMHhmZmZmYzkwMDAwMWE2MDAwLCA0MDo2MTo4
NjpmNDo2NzpkOCwgWElEIDA4MTAwMGMwIElSUSAzNDQNClsgICAgMy41Njc5MjhdIHI4MTY5
IDAwMDA6MDg6MDAuMDogZXRoMToganVtYm8gZmVhdHVyZXMgW2ZyYW1lczogOTIwMCBieXRl
cywgdHggY2hlY2tzdW1taW5nOiBrb10NClsgICAgMy41NjkyMzhdIGluaXRjYWxsIHJ0bDgx
NjlfaW5pdF9tb2R1bGUrMHgwLzB4MWIgcmV0dXJuZWQgMCBhZnRlciAxMTUyMCB1c2Vjcw0K
WyAgICAzLjU2OTI0MV0gY2FsbGluZyAgbmV0aWZfaW5pdCsweDAvMHg2NyBAIDENClsgICAg
My41NjkyNDRdIGluaXRjYWxsIG5ldGlmX2luaXQrMHgwLzB4NjcgcmV0dXJuZWQgMCBhZnRl
ciAwIHVzZWNzDQpbICAgIDMuNTY5MjQ2XSBjYWxsaW5nICBuZXRiYWNrX2luaXQrMHgwLzB4
MjFkIEAgMQ0KWyAgICAzLjU3NDg1OV0gaW5pdGNhbGwgbmV0YmFja19pbml0KzB4MC8weDIx
ZCByZXR1cm5lZCAwIGFmdGVyIDU0NzEgdXNlY3MNClsgICAgMy41NzQ4NjJdIGNhbGxpbmcg
IGNkcm9tX2luaXQrMHgwLzB4NmEgQCAxDQpbICAgIDMuNTc0ODg1XSBpbml0Y2FsbCBjZHJv
bV9pbml0KzB4MC8weDZhIHJldHVybmVkIDAgYWZ0ZXIgMjAgdXNlY3MNClsgICAgMy41NzQ4
ODddIGNhbGxpbmcgIG5vbnN0YXRpY19zeXNmc19pbml0KzB4MC8weDEyIEAgMQ0KWyAgICAz
LjU3NDg5MV0gaW5pdGNhbGwgbm9uc3RhdGljX3N5c2ZzX2luaXQrMHgwLzB4MTIgcmV0dXJu
ZWQgMCBhZnRlciAxIHVzZWNzDQpbICAgIDMuNTc0ODkzXSBjYWxsaW5nICB5ZW50YV9zb2Nr
ZXRfaW5pdCsweDAvMHgxYiBAIDENClsgICAgMy41NzYxNTldIGluaXRjYWxsIHllbnRhX3Nv
Y2tldF9pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIgMTIyOCB1c2Vjcw0KWyAgICAz
LjU3NjE2M10gY2FsbGluZyAgbW9uX2luaXQrMHgwLzB4MTAwIEAgMQ0KWyAgICAzLjU4MDQ3
NV0gaW5pdGNhbGwgbW9uX2luaXQrMHgwLzB4MTAwIHJldHVybmVkIDAgYWZ0ZXIgNDIwMiB1
c2Vjcw0KWyAgICAzLjU4MDQ3OF0gY2FsbGluZyAgZWhjaV9oY2RfaW5pdCsweDAvMHhlZiBA
IDENClsgICAgMy41ODA0ODBdIGVoY2lfaGNkOiBVU0IgMi4wICdFbmhhbmNlZCcgSG9zdCBD
b250cm9sbGVyIChFSENJKSBEcml2ZXINClsgICAgMy41ODA0ODJdIGVoY2lfaGNkOiBibG9j
ayBzaXplczogcWggMTEyIHF0ZCA5NiBpdGQgMTkyIHNpdGQgOTYNClsgICAgMy41ODE3ODFd
IHhlbjogcmVnaXN0ZXJpbmcgZ3NpIDE3IHRyaWdnZXJpbmcgMCBwb2xhcml0eSAxDQpbICAg
IDMuNTgxODAzXSB4ZW46IC0tPiBwaXJxPTE3IC0+IGlycT0xNyAoZ3NpPTE3KQ0KWyAgICAz
LjU4MTgzNV0gZWhjaV9oY2QgMDAwMDowMDoxMi4yOiBQQ0kgSU5UIEIgLT4gR1NJIDE3IChs
ZXZlbCwgbG93KSAtPiBJUlEgMTcNClsgICAgMy41ODE4NzJdIGVoY2lfaGNkIDAwMDA6MDA6
MTIuMjogRUhDSSBIb3N0IENvbnRyb2xsZXINClsgICAgMy41ODE5MDNdIGRyaXZlcnMvdXNi
L2NvcmUvaW5vZGUuYzogY3JlYXRpbmcgZmlsZSAnZGV2aWNlcycNClsgICAgMy41ODE5MDhd
IGRyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYzogY3JlYXRpbmcgZmlsZSAnMDAxJw0KWyAgICAz
LjU4MzIyNV0gZWhjaV9oY2QgMDAwMDowMDoxMi4yOiBuZXcgVVNCIGJ1cyByZWdpc3RlcmVk
LCBhc3NpZ25lZCBidXMgbnVtYmVyIDENClsgICAgMy41ODMyMzddIGVoY2lfaGNkIDAwMDA6
MDA6MTIuMjogcmVzZXQgaGNzX3BhcmFtcyAweDEwMTUwNSBkYmc9MSBjYz0xIHBjYz01IG9y
ZGVyZWQgIXBwYyBwb3J0cz01DQpbICAgIDMuNTgzMjQxXSBlaGNpX2hjZCAwMDAwOjAwOjEy
LjI6IHJlc2V0IGhjY19wYXJhbXMgYTA3MiB0aHJlc2ggNyB1ZnJhbWVzIDI1Ni81MTIvMTAy
NA0KWyAgICAzLjU4MzI0NV0gZWhjaV9oY2QgMDAwMDowMDoxMi4yOiBhcHBseWluZyBBTUQg
U0I3MDAvU0I4MDAvSHVkc29uLTIvMyBFSENJIGR1bW15IHFoIHdvcmthcm91bmQNClsgICAg
My41ODQxOTNdIFFVSVJLOiBFbmFibGUgQU1EIFBMTCBmaXgNClsgICAgMy41ODQxOTNdIGVo
Y2lfaGNkIDAwMDA6MDA6MTIuMjogZGVidWcgcG9ydCAxDQpbICAgIDMuNTg0MTkzXSBlaGNp
X2hjZCAwMDAwOjAwOjEyLjI6IHJlc2V0IGNvbW1hbmQgMDA4MDAwMiAocGFyayk9MCBpdGhy
ZXNoPTggcGVyaW9kPTEwMjQgUmVzZXQgSEFMVA0KWyAgICAzLjU4NDE5M10gZWhjaV9oY2Qg
MDAwMDowMDoxMi4yOiBNV0kgYWN0aXZlDQpbICAgIDMuNTg0MTkzXSBlaGNpX2hjZCAwMDAw
OjAwOjEyLjI6IHN1cHBvcnRzIFVTQiByZW1vdGUgd2FrZXVwDQpbICAgIDMuNTg0MTkzXSBl
aGNpX2hjZCAwMDAwOjAwOjEyLjI6IGlycSAxNywgaW8gbWVtIDB4Zjk4ZmY0MDANClsgICAg
My41ODQxOTNdIGVoY2lfaGNkIDAwMDA6MDA6MTIuMjogcmVzZXQgY29tbWFuZCAwMDgwMDAy
IChwYXJrKT0wIGl0aHJlc2g9OCBwZXJpb2Q9MTAyNCBSZXNldCBIQUxUDQpbICAgIDMuNTg0
MTkzXSBlaGNpX2hjZCAwMDAwOjAwOjEyLjI6IGluaXQgY29tbWFuZCAwMDEwMDA1IChwYXJr
KT0wIGl0aHJlc2g9MSBwZXJpb2Q9NTEyIFJVTg0KWyAgICAzLjU5MTM4NF0gZWhjaV9oY2Qg
MDAwMDowMDoxMi4yOiBVU0IgMi4wIHN0YXJ0ZWQsIEVIQ0kgMS4wMA0KWyAgICAzLjU5MTQz
NF0gdXNiIHVzYjE6IGRlZmF1bHQgbGFuZ3VhZ2UgMHgwNDA5DQpbICAgIDMuNTkxNDQxXSB1
c2IgdXNiMTogdWRldiAxLCBidXNudW0gMSwgbWlub3IgPSAwDQpbICAgIDMuNTkxNDQyXSB1
c2IgdXNiMTogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTFkNmIsIGlkUHJvZHVj
dD0wMDAyDQpbICAgIDMuNTkxNDQ0XSB1c2IgdXNiMTogTmV3IFVTQiBkZXZpY2Ugc3RyaW5n
czogTWZyPTMsIFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTENClsgICAgMy41OTE0NDZdIHVz
YiB1c2IxOiBQcm9kdWN0OiBFSENJIEhvc3QgQ29udHJvbGxlcg0KWyAgICAzLjU5MTQ0N10g
dXNiIHVzYjE6IE1hbnVmYWN0dXJlcjogTGludXggMy4xLjBrb25yYWQtbmV4dC0yMDExMTAy
MisgZWhjaV9oY2QNClsgICAgMy41OTE0NDldIHVzYiB1c2IxOiBTZXJpYWxOdW1iZXI6IDAw
MDA6MDA6MTIuMg0KWyAgICAzLjU5MzUzOF0gdXNiIHVzYjE6IHVzYl9wcm9iZV9kZXZpY2UN
ClsgICAgMy41OTM1NDJdIHVzYiB1c2IxOiBjb25maWd1cmF0aW9uICMxIGNob3NlbiBmcm9t
IDEgY2hvaWNlDQpbICAgIDMuNTkzNTU1XSB1c2IgdXNiMTogYWRkaW5nIDEtMDoxLjAgKGNv
bmZpZyAjMSwgaW50ZXJmYWNlIDApDQpbICAgIDMuNTk0ODQ2XSBodWIgMS0wOjEuMDogdXNi
X3Byb2JlX2ludGVyZmFjZQ0KWyAgICAzLjU5NDg0OV0gaHViIDEtMDoxLjA6IHVzYl9wcm9i
ZV9pbnRlcmZhY2UgLSBnb3QgaWQNClsgICAgMy41OTQ4NTFdIGh1YiAxLTA6MS4wOiBVU0Ig
aHViIGZvdW5kDQpbICAgIDMuNTk0ODYwXSBodWIgMS0wOjEuMDogNSBwb3J0cyBkZXRlY3Rl
ZA0KWyAgICAzLjU5NDg2MV0gaHViIDEtMDoxLjA6IHN0YW5kYWxvbmUgaHViDQpbICAgIDMu
NTk0ODYzXSBodWIgMS0wOjEuMDogbm8gcG93ZXIgc3dpdGNoaW5nICh1c2IgMS4wKQ0KWyAg
ICAzLjU5NDg2NF0gaHViIDEtMDoxLjA6IGluZGl2aWR1YWwgcG9ydCBvdmVyLWN1cnJlbnQg
cHJvdGVjdGlvbg0KWyAgICAzLjU5NDg2Nl0gaHViIDEtMDoxLjA6IHBvd2VyIG9uIHRvIHBv
d2VyIGdvb2QgdGltZTogMjBtcw0KWyAgICAzLjU5NDg2OV0gaHViIDEtMDoxLjA6IGxvY2Fs
IHBvd2VyIHNvdXJjZSBpcyBnb29kDQpbICAgIDMuNTk0ODcxXSBodWIgMS0wOjEuMDogdHJ5
aW5nIHRvIGVuYWJsZSBwb3J0IHBvd2VyIG9uIG5vbi1zd2l0Y2hhYmxlIGh1Yg0KWyAgICAz
LjU5NDkxM10gZHJpdmVycy91c2IvY29yZS9pbm9kZS5jOiBjcmVhdGluZyBmaWxlICcwMDEn
DQpbICAgIDMuNTk1NzM1XSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAxNyB0cmlnZ2VyaW5nIDAg
cG9sYXJpdHkgMQ0KWyAgICAzLjU5NTc0NF0geGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5n
IGlycSAxNyBmb3IgZ3NpIDE3DQpbICAgIDMuNTk1NzQ2XSB4ZW46IC0tPiBwaXJxPTE3IC0+
IGlycT0xNyAoZ3NpPTE3KQ0KWyAgICAzLjU5NTc0OF0gQWxyZWFkeSBzZXR1cCB0aGUgR1NJ
IDoxNw0KWyAgICAzLjU5NTc1Ml0gZWhjaV9oR1NJIDE3IChsZXZlbCwgbG93KSAtPiBJUlEg
MTcNClsgICAgMy41OTU3OTJdIGVoY2lfaGNkIDAwMG50cm9sbGVyDQpbICAgIDMuNTk1ODA2
XSBkcml2ZXJzL3VzYi9jb3JlL2lub2RlLmM6IGNyZWF0aW5nIGZpbGUgJzAwMicNClsgICAg
My41OTY3MTBdIGVoY2lfaGNkIDAwMDA6MDA6MTMuMjogbmV3IFVTQiBidXMgcmVnaXN0ZXJl
ZCwgYXNzaWduZWQgYnVzIG51bWJlciAyDQpbICAgIDMuNTk2NzI0XSBlaGNpX2hjZCAwMDAw
OjAwOjEzLjI6IHJlc2V0IGhjc19wYXJhbXMgMHgxMDE1MDUgZGJnPTEgY2M9MSBwY2M9NSBv
cmRlcmVkICFwcGMgcG9ydHM9NQ0KWyAgICAzLjU5NjcyOF0gZWhjaV9oY2QgMDAwMDowMDox
My4yOiByZXNldCBoY2NfcGFyYW1zIGEwNzIgdGhyZXNoIDcgdWZyYW1lcyAyNTYvNTEyLzEw
MjQNClsgICAgMy41OTY3MzNdIGVoY2lfaGNkIDAwMDA6MDA6MTMuMjogYXBwbHlpbmcgQU1E
IFNCNzAwL1NCODAwL0h1ZHNvbi0yLzMgRUhDSSBkdW1teSBxaCB3b3JrYXJvdW5kDQpbICAg
IDMuNTk3MTg4XSBlaGNpX2hjZCAwMDAwOjAwOjEzLjI6IGRlYnVnIHBvcnQgMQ0KWyAgICAz
LjU5NzE5Ml0gZWhjaV9oY2QgMDAwMDowMDoxMy4yOiByZXNldCBjb21tYW5kIDAwODAwMDIg
KHBhcmspPTAgaXRocmVzaD04IHBlcmlvZD0xMDI0IFJlc2V0IEhBTFQNClsgICAgMy41OTcy
MDVdIGVoY2lfaGNkIDAwMDA6MDA6MTMuMjogTVdJIGFjdGl2ZQ0KWyAgICAzLjU5NzIwN10g
ZWhjaV9oY2QgMDAwMDowMDoxMy4yOiBzdXBwb3J0cyBVU0IgcmVtb3RlIHdha2V1cA0KWyAg
ICAzLjU5NzIxNl0gZWhjaV9oY2QgMDAwMDowMDoxMy4yOiBpcnEgMTcsIGlvIG1lbSAweGY5
OGZmODAwDQpbICAgIDMuNTk3MjIwXSBlaGNpX2hjZCAwMDAwOjAwOjEzLjI6IHJlc2V0IGNv
bW1hbmQgMDA4MDAwMiAocGFyayk9MCBpdGhyZXNoPTggcGVyaW9kPTEwMjQgUmVzZXQgSEFM
VA0KWyAgICAzLjU5NzIyN10gZWhjaV9oY2QgMDAwMDowMDoxMy4yOiBpbml0IGNvbW1hbmQg
MDAxMDAwNSAocGFyayk9MCBpdGhyZXNoPTEgcGVyaW9kPTUxMiBSVU4NClsgICAgMy42MDU0
NzNdIGVoY2lfaGNkIDAwMDA6MDA6MTMuMjogVVNCIDIuMCBzdGFydGVkLCBFSENJIDEuMDAN
ClsgICAgMy42MDU1MjhdIHVzYiB1c2IyOiBkZWZhdWx0IGxhbmd1YWdlIDB4MDQwOQ0KWyAg
ICAzLjYwNTUzM10gdXNiIHVzYjI6IHVkZXYgMSwgYnVzbnVtIDIsIG1pbm9yID0gMTI4DQpb
ICAgIDMuNjA1NTM1XSB1c2IgdXNiMjogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9y
PTFkNmIsIGlkUHJvZHVjdD0wMDAyDQpbICAgIDMuNjA1NTM3XSB1c2IgdXNiMjogTmV3IFVT
QiBkZXZpY2Ugc3RyaW5nczogTWZyPTMsIFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTENClsg
ICAgMy42MDU1MzldIHVzYiB1c2IyOiBQcm9kdWN0OiBFSENJIEhvc3QgQ29udHJvbGxlcg0K
WyAgICAzLjYwNTU0MF0gdXNiIHVzYjI6IE1hbnVmYWN0dXJlcjogTGludXggMy4xLjBrb25y
YWQtbmV4dC0yMDExMTAyMisgZWhjaV9oY2QNClsgICAgMy42MDU1NDJdIHVzYiB1c2IyOiBT
ZXJpYWxOdW1iZXI6IDAwMDA6MDA6MTMuMg0KWyAgICAzLjYwODAzNl0gdXNiIHVzYjI6IHVz
Yl9wcm9iZV9kZXZpY2UNClsgICAgMy42MDgwNDFdIHVzYiB1c2IyOiBjb25maWd1cmF0aW9u
ICMxIGNob3NlbiBmcm9tIDEgY2hvaWNlDQpbICAgIDMuNjA4MDg1XSB1c2IgdXNiMjogYWRk
aW5nIDItMDoxLjAgKGNvbmZpZyAjMSwgaW50ZXJmYWNlIDApDQpbICAgIDMuNjA4ODgwXSBo
dWIgMi0wOjEuMDogdXNiX3Byb2JlYiAyLTA6MS4wOiB1c2JfcHJvYmVfaW50ZXJmYWNlIC0g
Z290IGlkDQpbICBiIGZvdW5kDQpbICAgIDMuNjA4ODk0XSBodWIgMi0wOjEuMDogNSBwb3J0
cyBkZXRlY3RlZA0KWyAgICAzLjYwODg5NV0gaHViIDItMDoxLjA6IHN0YW5kYWxvbmUgaHVi
DQpbICAgIDMuNjA4ODk2XSBodWIgMi0wOjEuMDogbm8gcG93ZXIgc3dpdGNoaW5nICh1c2Ig
MS4wKQ0KWyAgICAzLjYwODg5OF0gaHViIDItMDoxLjA6IGluZGl2aWR1YWwgcG9ydCBvdmVy
LWN1cnJlbnQgcHJvdGVjdGlvbg0KWyAgICAzLjYwODkwMF0gaHViIDItMDoxLjA6IHBvd2Vy
IG9uIHRvIHBvd2VyIGdvb2QgdGltZTogMjBtcw0KWyAgICAzLjYwODkwM10gaHViIDItMDox
LjA6IGxvY2FsIHBvd2VyIHNvdXJjZSBpcyBnb29kDQpbICAgIDMuNjA4OTA1XSBodWIgMi0w
OjEuMDogdHJ5aW5nIHRvIGVuYWJsZSBwb3J0IHBvd2VyIG9uIG5vbi1zd2l0Y2hhYmxlIGh1
Yg0KWyAgICAzLjYwODk0M10gZHJpdmVycy91c2IvY29yZS9pbm9kZS5jOiBjcmVhdGluZyBm
aWxlICcwMDEnDQpbICAgIDMuNjA5NzUwXSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAxNyB0cmln
Z2VyaW5nIDAgcG9sYXJpdHkgMQ0KWyAgICAzLjYwOTc2MV0geGVuX21hcF9waXJxX2dzaTog
cmV0dXJuaW5nIGlycSAxNyBmb3IgZ3NpIDE3DQpbICAgIDMuNjA5NzYzXSB4ZW46IC0tPiBw
aXJxPTE3IC0+IGlycT0xNyAoZ3NpPTE3KQ0KWyAgICAzLjYwOTc2NV0gQWxyZWFkeSBzZXR1
cCB0aGUgR1NJIDoxNw0KWyAgICAzLjYwOTc2OF0gZWhjaV9oY2QgMDAwMDowMDoxNi4yOiBQ
Q0kgSU5UIEIgLT4gR1NJIDE3IChsZXZlbCwgbG93KSAtPiBJUlEgMTcNClsgICAgMy42MDk4
MDZdIGVoY2lfaGNkIDAwMDA6MDA6MTYuMjogRUhDSSBIb3N0IENvbnRyb2xsZXINClsgICAg
My42MDk4MTVdIGRyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYzogY3JlYXRpbmcgZmlsZSAnMDAz
Jw0KWyAgICAzLjYxMTEzN10gZWhjaV9oY2QgMDAwMDowMDoxNi4yOiBuZXcgVVNCIGJ1cyBy
ZWdpc3RlcmVkLCBhc3NpZ25lZCBidXMgbnVtYmVyIDMNClsgICAgMy42MTExNTFdIGVoY2lf
aGNkIDAwMDA6MDA6MTYuMjogcmVzZXQgaGNzX3BhcmFtcyAweDEwMTQwNCBkYmc9MSBjYz0x
IHBjYz00IG9yZGVyZWQgIXBwYyBwb3J0cz00DQpbICAgIDMuNjExMTU1XSBlaGNpX2hjZCAw
MDAwOjAwOjE2LjI6IHJlc2V0IGhjY19wYXJhbXMgYTA3MiB0aHJlc2ggNyB1ZnJhbWVzIDI1
Ni81MTIvMTAyNA0KWyAgICAzLjYxMTE2MF0gZWhjaV9oY2QgMDAwMDowMDoxNi4yOiBhcHBs
eWluZyBBTUQgU0I3MDAvU0I4MDAvSHVkc29uLTIvMyBFSENJIGR1bW15IHFoIHdvcmthcm91
bmQNClsgICAgMy42MTIxMDZdIGVoY2lfaGNkIDAwMDA6MDA6MTYuMjogZGVidWcgcG9ydCAx
DQpbICAgIDMuNjEyMTA2XSBlaGNpX2hjZCAwMDAwOjAwOjE2LjI6IHJlc2V0IGNvbW1hbmQg
MDA4MDAwMiAocGFyayk9MCBpdGhyZXNoPTggcGVyaW9kPTEwMjQgUmVzZXQgSEFMVA0KWyAg
ICAzLjYxMjEwNl0gZWhjaV9oY2QgMDAwMDowMDoxNi4yOiBNV0kgYWN0aXZlDQpbICAgIDMu
NjEyMTA2XSBlaGNpX2hjZCAwMDAwOjAwOjE2LjI6IHN1cHBvcnRzIFVTQiByZW1vdGUgd2Fr
ZXVwDQpbICAgIDMuNjEyMTA2XSBlaGNpX2hjZCAwMDAwOjAwOjE2LjI6IGlycSAxNywgaW8g
bWVtIDB4Zjk4ZmZjMDANClsgICAgMy42MTIxMDZdIGVoY2lfaGNkIDAwMDA6MDA6MTYuMjog
cmVzZXQgY29tbWFuZCAwMDgwMDAyIChwYXJrKT0wIGl0aHJlc2g9OCBwZXJpb2Q9MTAyNCBS
ZXNldCBIQUxUDQpbICAgIDMuNjEyMTA2XSBlaGNpX2hjZCAwMDAwOjAwOjE2LjI6IGluaXQg
Y29tbWFuZCAwMDEwMDA1IChwYXJrKT0wIGl0aHJlc2g9MSBwZXJpb2Q9NTEyIFJVTg0KWyAg
ICAzLjYyMDE3MV0gZWhjaV9oY2QgMDAwMDowMDoxNi4yOiBVU0IgMi4wIHN0YXJ0ZWQsIEVI
Q0kgMS4wMA0KWyAgICAzLjYyMDI3NV0gdXNiIHVzYjM6IGRlZmF1bHQgbGFuZ3VhZ2UgMHgw
NDA5DQpbICAgIDMuNjIwMjgxXSB1c2IgdXNiMzogdWRldiAxLCBidXNudW0gMywgbWlub3Ig
PSAyNTYNClsgICAgMy42MjAyODNdIHVzYiB1c2IzOiBOZXcgVVNCIGRldmljZSBmb3VuZCwg
aWRWZW5kb3I9MWQ2YiwgaWRQcm9kdWN0PTAwMDINClsgICAgMy42MjAyODVdIHVzYiB1c2Iz
OiBOZXcgVVNCIGRldmljZSBzdHJpbmdzOiBNZnI9MywgUHJvZHVjdD0yLCBTZXJpYWxOdW1i
ZXI9MQ0KWyAgICAzLjYyMDI4Nl0gdXNiIHVzYjM6IFByb2R1Y3Q6IEVIQ0kgSG9zdCBDb250
cm9sbGVyDQpbICAgIDMuNjIwMjg4XSB1ZXI6IExpbnV4IDMuMS4wa29ucmFkLW5leHQtMjAx
MTEwMjIrIGVoY2lfaGNkDQpbICAgIDMuNjIwMjkwXSB1c2IgdXNiMzogU2VyaWFsTnVtYmVy
OiAwMDAwOjAwOjE2LjINClsgICAgMy42MjI2MDFdIHVzX2RldmljZQ0KWyAgICAzLjYyMjYw
NV0gdXNiIHVzYjM6IGNvbmZpZ3VyYXRbICAgIDMuNjIyNjE3XSB1c2IgdXNiMzogYWRkaW5n
IDMtMDoxLjAgKGNvbmZpZyAjMSwgaW50ZXJmYWNlIDApDQpbICAgIDMuNjI1MDQwXSBodWIg
My0wOjEuMDogdXNiX3Byb2JlX2ludGVyZmFjZQ0KWyAgICAzLjYyNTA0NF0gaHViIDMtMDox
LjA6IHVzYl9wcm9iZV9pbnRlcmZhY2UgLSBnb3QgaWQNClsgICAgMy42MjUwNDVdIGh1YiAz
LTA6MS4wOiBVU0IgaHViIGZvdW5kDQpbICAgIDMuNjI1MDkzXSBodWIgMy0wOjEuMDogNCBw
b3J0cyBkZXRlY3RlZA0KWyAgICAzLjYyNTA5NF0gaHViIDMtMDoxLjA6IHN0YW5kYWxvbmUg
aHViDQpbICAgIDMuNjI1MDk2XSBodWIgMy0wOjEuMDogbm8gcG93ZXIgc3dpdGNoaW5nICh1
c2IgMS4wKQ0KWyAgICAzLjYyNTA5OF0gaHViIDMtMDoxLjA6IGluZGl2aWR1YWwgcG9ydCBv
dmVyLWN1cnJlbnQgcHJvdGVjdGlvbg0KWyAgICAzLjYyNTA5OV0gaHViIDMtMDoxLjA6IHBv
d2VyIG9uIHRvIHBvd2VyIGdvb2QgdGltZTogMjBtcw0KWyAgICAzLjYyNTEwNF0gaHViIDMt
MDoxLjA6IGxvY2FsIHBvd2VyIHNvdXJjZSBpcyBnb29kDQpbICAgIDMuNjI1MTA2XSBodWIg
My0wOjEuMDogdHJ5aW5nIHRvIGVuYWJsZSBwb3J0IHBvd2VyIG9uIG5vbi1zd2l0Y2hhYmxl
IGh1Yg0KWyAgICAzLjYyNTE0Nl0gZHJpdmVycy91c2IvY29yZS9pbm9kZS5jOiBjcmVhdGlu
ZyBmaWxlICcwMDEnDQpbICAgIDMuNjI3NTk4XSBpbml0Y2FsbCBlaGNpX2hjZF9pbml0KzB4
MC8weGVmIHJldHVybmVkIDAgYWZ0ZXIgNDYwMDYgdXNlY3MNClsgICAgMy42Mjc2MDJdIGNh
bGxpbmcgIG9oY2lfaGNkX21vZF9pbml0KzB4MC8weGJmIEAgMQ0KWyAgICAzLjYyNzYwNF0g
b2hjaV9oY2Q6IFVTQiAxLjEgJ09wZW4nIEhvc3QgQ29udHJvbGxlciAoT0hDSSkgRHJpdmVy
DQpbICAgIDMuNjI3NjA1XSBvaGNpX2hjZDogYmxvY2sgc2l6ZXM6IGVkIDgwIHRkIDk2DQpb
ICAgIDMuNjI5NTM1XSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSAxOCB0cmlnZ2VyaW5nIDAgcG9s
YXJpdHkgMQ0KWyAgICAzLjYyOTU1NV0geGVuOiAtLT4gcGlycT0xOCAtPiBpcnE9MTggKGdz
aT0xOCkNClsgICAgMy42Mjk1ODddIG9oY2lfaGNkIDAwMDA6MDA6MTIuMDogUENJIElOVCBB
IC0+IEdTSSAxOCAobGV2ZWwsIGxvdykgLT4gSVJRIDE4DQpbICAgIDMuNjI5NjI1XSBvaGNp
X2hjZCAwMDAwOjAwOjEyLjA6IE9IQ0kgSG9zdCBDb250cm9sbGVyDQpbICAgIDMuNjI5NjM4
XSBkcml2ZXJzL3VzYi9jb3JlL2lub2RlLmM6IGNyZWF0aW5nIGZpbGUgJzAwNCcNClsgICAg
My42MzEwMjNdIG9oY2lfaGNkIDAwMDA6MDA6MTIuMDogbmV3IFVTQiBidXMgcmVnaXN0ZXJl
ZCwgYXNzaWduZWQgYnVzIG51bWJlciA0DQpbICAgIDMuNjMxMDM3XSBvaGNpX2hjZCAwMDAw
OjAwOjEyLjA6IGVuYWJsZWQgQU1EIHByZWZldGNoIHF1aXJrDQpbICAgIDMuNjMxNjM2XSBv
aGNpX2hjZCAwMDAwOjAwOjEyLjA6IGNyZWF0ZWQgZGVidWcgZmlsZXMNClsgICAgMy42MzE2
MzhdIG9oY2lfaGNkIDAwMDA6MDA6MTIuMDogc3VwcG9ydHMgVVNCIHJlbW90ZSB3YWtldXAN
ClsgICAgMy42MzE2ODhdIG9oY2lfaGNkIDAwMDA6MDA6MTIuMDogaXJxIDE4LCBpbyBtZW0g
MHhmOThmYjAwMA0KWyAgICAzLjY4NzI5M10gb2hjaV9oY2QgMDAwMDowMDoxMi4wOiBPSENJ
IGNvbnRyb2xsZXIgc3RhdGUNClsgICAgMy42ODczMDFdIG9oY2lfaGNkIDAwMDA6MDA6MTIu
MDogT0hDSSAxLjAsIE5PIGxlZ2FjeSBzdXBwb3J0IHJlZ2lzdGVycw0KWyAgICAzLjY4NzMw
NV0gb2hjaV9oY2QgMDAwMDowMDoxMi4wOiBjb250cm9sIDB4MjgzIFJXQyBIQ0ZTPW9wZXJh
dGlvbmFsIENCU1I9Mw0KWyAgICAzLjY4NzMwOF0gb2hjaV9oY2QgMDAwMDowMDoxMi4wOiBj
bWRzdGF0dXMgMHgwMDAwMCBTT0M9MA0KWyAgICAzLjY4NzMxM10gb2hjaV9oY2QgMDAwMDow
MDoxMi4wOiBpbnRyc3RhdHVzIDB4MDAwMDAwMDQgU0YNClsgICAgMy42ODczMTddIG9oY2lf
aGNkIDAwMDA6MDA6MTIuMDogaW50cmVuYWJsZSAweDgwMDAwMDVhIE1JRSBSSFNDIFVFIFJE
IFdESA0KWyAgICAzLjY4NzMyN10gb2hjaV9oY2QgMDAwMDowMDoxMi4wOiBoY2NhIGZyYW1l
ICMwMDA1DQpbICAgIDMuNjg3MzMxXSBvaGNpX2hjZCAwMDAwOjAwOjEyLjA6IHJvb3RodWIu
YSAwMjAwMTIwNSBQT1RQR1Q9MiBOT0NQIE5QUyBORFA9NSg1KQ0KWyAgICAzLjY4NzMzNV0g
b2hjaV9oY2QgMDAwMDowMDoxMi4wOiByb290aHViLmIgMDAwMDAwMDAgUFBDTT0wMDAwIERS
PTAwMDANClsgICAgMy42ODczMzhdIG9oY2lfaGNkIDAwMDA6MDA6MTIuMDogcm9vdGh1Yi5z
dGF0dXMgMDAwMDgwMDAgRFJXRQ0KWyAgICAzLjY4NzM0Ml0gb2hjaV9oY2QgMDAwMDowMDox
Mi4wOiByb290aHViLnBvcnRzdGF0dXMgWzBdIDB4MDAwMDAxMDAgUFBTDQpbICAgIDMuNjg3
MzQ1XSBvaGNpX2hjZCAwMDAwOjAwOjEyLjA6IHJvb3RodWIucG9ydHN0YXR1cyBbMV0gMHgw
MDAwMDEwMCBQUFMNClsgICAgMy42ODczNDldIG9oY2lfaGNkIDAwMDA6MDA6MTIuMDogcm9v
dGh1Yi5wb3J0c3RhdHVzIFsyXSAweDAwMDAwMTAwIFBQUw0KWyAgICAzLjY4NzM1Ml0gb2hj
aV9oY2QgMDAwMDowMDoxMi4wOiByb290aHViLnBvcnRzdGF0dXMgWzNdIDB4MDAwMDAxMDAg
UFBTDQpbICAgIDMuNjg3MzU1XSBvaGNpX2hjZCAwMDAwOjAwOjEyLjA6IHJvb3RodWIucG9y
dHN0YXR1cyBbNF0gMHgwMDAwMDEwMCBQUFMNClsgICAgMy42ODczNzJdIHVzYiB1c2I0OiBk
ZWZhdWx0IGxhbmd1YWdlIDB4MDQwOQ0KWyAgICAzLjY4NzM3OF0gdXNiIHVzYjQ6IHVkZXYg
MSwgYnVzbnVtIDQsIG1pbm9yID0gMzg0DQpbICAgIDMuNjg3MzgwXSB1c2IgdXNiNDogTmV3
IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTFkNmIsIGlkUHJvZHVjdD0wMDAxDQpbICAg
IDMuNjg3MzgxXSB1c2IgdXNiNDogTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZyPTMsIFBy
b2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTENClsgICAgMy42ODczODNdIHVzYiB1c2I0OiBQcm9k
dWN0OiBPSENJIEhvc3QgQ29udHJvbGxlcg0KWyAgICAzLjY4NzM4NV0gdXNiIHVzYjQ6IE1h
bnVmYWN0dXJlcjogTGludXggMy4xLjBrb25yYWQtbmV4dC0yMDExMTAyMisgb2hjaV9oY2QN
ClsgICAgMy42ODczODZdIHVzYiB1c2I0OiBTZXJpYWxOdW1iZXI6IDAwMDA6MDA6MTIuMA0K
WyAgICAzLjY4ODcyOF0gdXNiIHVzYjQ6IHVzYl9wcm9iZV9kZXZpY2UNClsgICAgMy42ODg3
MzJdIHVzYiB1c2I0OiBjb25maWd1cmF0aW9uICMxIGNob3NlbiBmcm9tIDEgY2hvaWNlDQpb
ICAgIDMuNjg4NzQzXSB1c2IgdXNiNDogYWRkaW5nIDQtMDoxLjAgKGNvbmZpZyAjMSwgaW50
ZXJmYWNlIDApDQpbICAgIDMuNjkwMDMwXSBodWIgNC0wOjEuMDogdXNiX3Byb2JlX2ludGVy
ZmFjZQ0KWyAgICAzLjY5MDAzM10gaHViIDQtMDoxLjA6IHVzYl9wcm9iZV9pbnRlcmZhY2Ug
LSBnb3QgaWQNClsgICAgMy42OTAwMzVdIGh1YiA0LTA6MS4wOiBVU0IgaHViIGZvdW5kDQpb
ICAgIDMuNjkwMDQ4XSBodWIgNC0wOjEuMDogNSBwb3J0cyBkZXRlY3RlZA0KWyAgICAzLjY5
MDA5MV0gaHViIDQtMDoxLjA6IHN0YW5kYWxvbmUgaHViDQpbICAgIDMuNjkwMDkzXSBodWIg
NC0wOjEuMDogbm8gcG93ZXIgc3dpdGNoaW5nICh1c2IgMS4wKQ0KWyAgICAzLjY5MDA5NF0g
aHViIDQtMDoxLjA6IG5vIG92ZXItY3VycmVudCBwcm90ZWN0aW9uDQpbICAgIDMuNjkwMDk2
XSBodWIgNC0wOjEuMDogcG93ZXIgb24gdG8gcG93ZXIgZ29vZCB0aW1lOiA0bXMNClsgICAg
My42OTAxMDJdIGh1YiA0LTA6MS4wOiBsb2NhbCBwb3dlciBzb3VyY2UgaXMgZ29vZA0KWyAg
ICAzLjY5MDEwNF0gaHViIDQtMDoxLjA6IHRyeWluZyB0byBlbmFibGUgcG9ydCBwb3dlciBv
biBub24tc3dpdGNoYWJsZSBodWINClsgICAgMy42OTAxMzFdIGRyaXZlcnMvdXNiL2NvcmUv
aW5vZGUuYzogY3JlYXRpbmcgZmlsZSAnMDAxJw0KWyAgICAzLjY5MDE3Ml0gZWhjaV9oY2Qg
MDAwMDowMDoxMi4yOiBIUyBjb21wYW5pb24gZm9yIDAwMDA6MDA6MTIuMA0KWyAgICAzLjY5
MDkzMV0geGVuOiByZWdpc3RlcmluZyBnc2kgMTggdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDEN
ClsgICAgMy42OTA5NDJdIHhlbl9tYXBfcGlycV9nc2k6IHJldHVybmluZyBpcnEgMTggZm9y
IGdzaSAxOA0KWyAgICAzLjY5MDk0NF0geGVuOiAtLT4gcGlycT0xOCAtPiBpcnE9MTggKGdz
aT0xOCkNClsgICAgMy42OTA5NDZdIEFscmVhZHkgc2V0dXAgdGhlIEdTSSA6MTgNClsgICAg
My42OTA5NTBdIG9oY2lfaGNkIDAwMDA6MDA6MTMuMDogUENJIElOVCBBIC0+IEdTSSAxOCAo
bGV2ZWwsIGxvdykgLT4gSVJRIDE4DQpbICAgIDMuNjkwOTg3XSBvaGNpX2hjZCAwMDAwOjAw
OjEzLjA6IE9IQ0kgSG9zdCBDb250cm9sbGVyDQpbICAgIDMuNjkwOTk2XSBkcml2ZXJzL3Vz
Yi9jb3JlL2lub2RlLmM6IGNyZWF0aW5nIGZpbGUgJzAwNScNClsgICAgMy42OTIwMzZdIG9o
Y2lfaGNkIDAwMDA6MDA6MTMuMDogbmV3IFVTQiBidXMgcmVnaXN0ZXJlZCwgYXNzaWduZWQg
YnVzIG51bWJlciA1DQpbICAgIDMuNjkyMTEyXSBvaGNpX2hjZCAwMDAwOjAwOjEzLjA6IGVu
YWJsZWQgQU1EIHByZWZldGNoIHF1aXJrDQpbICAgIDMuNjkyNTY3XSBvaGNpX2hjZCAwMDAw
OjAwOjEzLjA6IGNyZWF0ZWQgZGVidWcgZmlsZXMNClsgICAgMy42OTI1NzRdIG9oY2lfaGNk
IDAwMDA6MDA6MTMuMDogc3VwcG9ydHMgVVNCIHJlbW90ZSB3YWtldXANClsgICAgMy42OTI2
MDZdIG9oY2lfaGNkIDAwMDA6MDA6MTMuMDogaXJxIDE4LCBpbyBtZW0gMHhmOThmYzAwMA0K
WyAgICAzLjcyNDIzNl0gZWhjaV9oY2QgMDAwMDowMDoxNi4yOiBHZXRTdGF0dXMgcG9ydDoz
IHN0YXR1cyAwMDE0MDMgMCAgQUNLIFBPV0VSIHNpZz1rIENTQyBDT05ORUNUDQpbICAgIDMu
NzI0MjQwXSBodWIgMy0wOjEuMDogcG9ydCAzOiBzdGF0dXMgMDUwMSBjaGFuZ2UgMDAwMQ0K
WyAgICAzLjc0NzY0NF0gb2hjaV9oY2QgMDAwMDowMDoxMy4wOiBPSENJIGNvbnRyb2xsZXIg
c3RhdGUNClsgICAgMy43NDc2NTBdIG9oY2lfaGNkIDAwMDA6MDA6MTMuMDogT0hDSSAxLjAs
IE5PIGxlZ2FjeSBzdXBwb3J0IHJlZ2lzdGVycw0KWyAgICAzLjc0NzY1NF0gb2hjaV9oY2Qg
MDAwMDowMDoxMy4wOiBjb250cm9sIDB4MjgzIFJXQyBIQ0ZTPW9wZXJhdGlvbmFsIENCU1I9
Mw0KWyAgICAzLjc0NzY1N10gb2hjaV9oY2QgMDAwMDowMDoxMy4wOiBjbWRzdGF0dXMgMHgw
MDAwMCBTT0M9MA0KWyAgICAzLjc0NzY2MV0gb2hjaV9oY2QgMDAwMDowMDoxMy4wOiBpbnRy
c3RhdHVzIDB4MDAwMDAwMDQgU0YNClsgICAgMy43NDc2NjRdIG9oY2lfaGNkIDAwMDA6MDA6
MTMuMDogaW50cmVuYWJsZSAweDgwMDAwMDVhIE1JRSBSSFNDIFVFIFJEIFdESA0KWyAgICAz
Ljc0NzY3NF0gb2hjaV9oY2QgMDAwMDowMDoxMy4wOiBoY2NhIGZyYW1lICMwMDA1DQpbICAg
IDMuNzQ3Njc4XSBvaGNpX2hjZCAwMDAwOjAwOjEzLjA6IHJvb3RodWIuYSAwMjAwMTIwNSBQ
T1RQR1Q9MiBOT0NQIE5QUyBORFA9NSg1KQ0KWyAgICAzLjc0NzY4MV0gb2hjaV9oY2QgMDAw
MDowMDoxMy4wOiByb290aHViLmIgMDAwMDAwMDAgUFBDTT0wMDAwIERSPTAwMDANClsgICAg
My43NDc2ODVdIG9oY2lfaGNkIDAwMDA6MDA6MTMuMDogcm9vdGh1Yi5zdGF0dXMgMDAwMDgw
MDAgRFJXRQ0KWyAgICAzLjc0NzY4OV0gb2hjaV9oY2QgMDAwMDowMDoxMy4wOiByb290aHVi
LnBvcnRzdGF0dXMgWzBdIDB4MDAwMDAxMDAgUFBTDQpbICAgIDMuNzQ3NjkyXSBvaGNpX2hj
ZCAwMDAwOjAwOjEzLjA6IHJvb3RodWIucG9ydHN0YXR1cyBbMV0gMHgwMDAwMDEwMCBQUFMN
ClsgICAgMy43NDc2OTZdIG9oY2lfaGNkIDAwMDA6MDA6MTMuMDogcm9vdGh1Yi5wb3J0c3Rh
dHVzIFsyXSAweDAwMDAwMTAwIFBQUw0KWyAgICAzLjc0NzY5OV0gb2hjaV9oY2QgMDAwMDow
MDoxMy4wOiByb290aHViLnBvcnRzdGF0dXMgWzNdIDB4MDAwMDAxMDAgUFBTDQpbICAgIDMu
NzQ3NzAzXSBvaGNpX2hjZCAwMDAwOjAwOjEzLjA6IHJvb3RodWIucG9ydHN0YXR1cyBbNF0g
MHgwMDAwMDEwMCBQUFMNClsgICAgMy43NDc3MjBdIHVzYiB1c2I1OiBkZWZhdWx0IGxhbmd1
YWdlIDB4MDQwOQ0KWyAgICAzLjc0NzcyNV0gdXNiIHVzYjU6IHVkZXYgMSwgYnVzbnVtIDUs
IG1pbm9yID0gNTEyDQpbICAgIDMuNzQ3NzI3XSB1c2IgdXNiNTogTmV3IFVTQiBkZXZpY2Ug
Zm91bmQsIGlkVmVuZG9yPTFkNmIsIGlkUHJvZHVjdD0wMDAxDQpbICAgIDMuNzQ3NzI5XSB1
c2IgdXNiNTogTmV3IFVTQiBkZXZpY2Ugc3RyaW5nczogTWZyPTMsIFByb2R1Y3Q9MiwgU2Vy
aWFsTnVtYmVyPTENClsgICAgMy43NDc3MzBdIHVzYiB1c2I1OiBQcm9kdWN0OiBPSENJIEhv
c3QgQ29udHJvbGxlcg0KWyAgICAzLjc0NzczMl0gdXNiIHVzYjU6IE1hbnVmYWN0dXJlcjog
TGludXggMy4xLjBrb25yYWQtbmV4dC0yMDExMTAyMisgb2hjaV9oY2QNClsgICAgMy43NDc3
MzRdIHVzYiB1c2I1OiBTZXJpYWxOdW1iZXI6IDAwMDA6MDA6MTMuMA0KWyAgICAzLjc0OTY0
Ml0gdXNiIHVzYjU6IHVzYl9wcm9iZV9kZXZpY2UNClsgICAgMy43NDk2NDddIHVzYiB1c2I1
OiBjb25maWd1cmF0aW9uICMxIGNob3NlbiBmcm9tIDEgY2hvaWNlDQpbICAgIDMuNzQ5NjU3
XSB1c2IgdXNiNTogYWRkaW5nIDUtMDoxLjAgKGNvbmZpZyAjMSwgaW50ZXJmYWNlIDApDQpb
ICAgIDMuNzUwOTMxXSBodWIgNS0wOjEuMDogdXNiX3Byb2JlX2ludGVyZmFjZQ0KWyAgICAz
Ljc1MDkzNV0gaHViIDUtMDoxLjA6IHVzYl9wcm9iZV9pbnRlcmZhY2UgLSBnb3QgaWQNClsg
ICAgMy43NTA5MzddIGh1YiA1LTA6MS4wOiBVU0IgaHViIGZvdW5kDQpbICAgIDMuNzUwOTQ4
XSBodWIgNS0wOjEuMDogNSBwb3J0cyBkZXRlY3RlZA0KWyAgICAzLjc1MDk1MF0gaHViIDUt
MDoxLjA6IHN0YW5kYWxvbmUgaHViDQpbICAgIDMuNzUwOTUxXSBodWIgNS0wOjEuMDogbm8g
cG93ZXIgc3dpdGNoaW5nICh1c2IgMS4wKQ0KWyAgICAzLjc1MDk1Ml0gaHViIDUtMDoxLjA6
IG5vIG92ZXItY3VycmVudCBwcm90ZWN0aW9uDQpbICAgIDMuNzUwOTU0XSBodWIgNS0wOjEu
MDogcG93ZXIgb24gdG8gcG93ZXIgZ29vZCB0aW1lOiA0bXMNClsgICAgMy43NTA5NThdIGh1
YiA1LTA6MS4wOiBsb2NhbCBwb3dlciBzb3VyY2UgaXMgZ29vZA0KWyAgICAzLjc1MDk2MV0g
aHViIDUtMDoxLjA6IHRyeWluZyB0byBlbmFibGUgcG9ydCBwb3dlciBvbiBub24tc3dpdGNo
YWJsZSBodWINClsgICAgMy43NTA5ODZdIGRyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYzogY3Jl
YXRpbmcgZmlsZSAnMDAxJw0KWyAgICAzLjc1MTAxOF0gZWhjaV9oY2QgMDAwMDowMDoxMy4y
OiBIUyBjb21wYW5pb24gZm9yIDAwMDA6MDA6MTMuMA0KWyAgICAzLjc1MTc3NF0geGVuOiBy
ZWdpc3RlcmluZyBnc2kgMTggdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDENClsgICAgMy43NTE3
ODVdIHhlbl9tYXBfcGlycV9nc2k6IHJldHVybmluZyBpcnEgMTggZm9yIGdzaSAxOA0KWyAg
ICAzLjc1MTc4N10geGVuOiAtLT4gcGlycT0xOCAtPiBpcnE9MTggKGdzaT0xOCkNClsgICAg
My43NTE3ODldIEFscmVhZHkgc2V0dXAgdGhlIEdTSSA6MTgNClsgICAgMy43NTE3OTNdIG9o
Y2lfaGNkIDAwMDA6MDA6MTQuNTogUENJIElOVCBDIC0+IEdTSSAxOCAobGV2ZWwsIGxvdykg
LT4gSVJRIDE4DQpbICAgIDMuNzUxODM1XSBvaGNpX2hjZCAwMDAwOjAwOjE0LjU6IE9IQ0kg
SG9zdCBDb250cm9sbGVyDQpbICAgIDMuNzUxODQ0XSBkcml2ZXJzL3VzYi9jb3JlL2lub2Rl
LmM6IGNyZWF0aW5nIGZpbGUgJzAwNicNClsgICAgMy43NTM1MTNdIG9oY2lfaGNkIDAwMDA6
MDA6MTQuNTogbmV3IFVTQiBidXMgcmVnaXN0ZXJlZCwgYXNzaWduZWQgYnVzIG51bWJlciA2
DQpbICAgIDMuNzUzNTMwXSBvaGNpX2hjZCAwMDAwOjAwOjE0LjU6IGVuYWJsZWQgQU1EIHBy
ZWZldGNoIHF1aXJrDQpbICAgIDMuNzU0MDYyXSBvaGNpX2hjZCAwMDAwOjAwOjE0LjU6IGNy
ZWF0ZWQgZGVidWcgZmlsZXMNClsgICAgMy43NTQwNjRdIG9oY2lfaGNkIDAwMDA6MDA6MTQu
NTogc3VwcG9ydHMgVVNCIHJlbW90ZSB3YWtldXANClsgICAgMy43NTQwNzNdIG9oY2lfaGNk
IDAwMDA6MDA6MTQuNTogaXJxIDE4LCBpbyBtZW0gMHhmOThmZDAwMA0KWyAgICAzLjgwOTI4
MV0gb2hjaV9oY2QgMDAwMDowMDoxNC41OiBPSENJIGNvbnRyb2xsZXIgc3RhdGUNClsgICAg
My44MDkyODldIG9oY2lfaGNkIDAwMDA6MDA6MTQuNTogT0hDSSAxLjAsIE5PIGxlZ2FjeSBz
dXBwb3J0IHJlZ2lzdGVycw0KWyAgICAzLjgwOTI5M10gb2hjaV9oY2QgMDAwMDowMDoxNC41
OiBjb250cm9sIDB4MjgzIFJXQyBIQ0ZTPW9wZXJhdGlvbmFsIENCU1I9Mw0KWyAgICAzLjgw
OTI5N10gb2hjaV9oY2QgMDAwMDowMDoxNC41OiBjbWRzdGF0dXMgMHgwMDAwMCBTT0M9MA0K
WyAgICAzLjgwOTMwMF0gb2hjaV9oY2QgMDAwMDowMDoxNC41OiBpbnRyc3RhdHVzIDB4MDAw
MDAwMDQgU0YNClsgICAgMy44MDkzMDRdIG9oY2lfaGNkIDAwMDA6MDA6MTQuNTogaW50cmVu
YWJsZSAweDgwMDAwMDVhIE1JRSBSSFNDIFVFIFJEIFdESA0KWyAgICAzLjgwOTMxNV0gb2hj
aV9oY2QgMDAwMDowMDoxNC41OiBoY2NhIGZyYW1lICMwMDA1DQpbICAgIDMuODA5MzE4XSBv
aGNpX2hjZCAwMDAwOjAwOjE0LjU6IHJvb3RodWIuYSAwMjAwMTIwMiBQT1RQR1Q9MiBOT0NQ
IE5QUyBORFA9MigyKQ0KWyAgICAzLjgwOTMyMl0gb2hjaV9oY2QgMDAwMDowMDoxNC41OiBy
b290aHViLmIgMDAwMDAwMDAgUFBDTT0wMDAwIERSPTAwMDANClsgICAgMy44MDkzMjVdIG9o
Y2lfaGNkIDAwMDA6MDA6MTQuNTogcm9vdGh1Yi5zdGF0dXMgMDAwMDgwMDAgRFJXRQ0KWyAg
ICAzLjgwOTMyOV0gb2hjaV9oY2QgMDAwMDowMDoxNC41OiByb290aHViLnBvcnRzdGF0dXMg
WzBdIDB4MDAwMDAxMDAgUFBTDQpbICAgIDMuODA5MzMzXSBvaGNpX2hjZCAwMDAwOjAwOjE0
LjU6IHJvb3RodWIucG9ydHN0YXR1cyBbMV0gMHgwMDAwMDEwMCBQUFMNClsgICAgMy44MDkz
NTZdIHVzYiB1c2I2OiBkZWZhdWx0IGxhbmd1YWdlIDB4MDQwOQ0KWyAgICAzLjgwOTM2Ml0g
dXNiIHVzYjY6IHVkZXYgMSwgYnVzbnVtIDYsIG1pbm9yID0gNjQwDQpbICAgIDMuODA5MzYz
XSB1c2IgdXNiNjogTmV3IFVTQiBkZXZpY2UgZm91bmQsIGlkVmVuZG9yPTFkNmIsIGlkUHJv
ZHVjdD0wMDAxDQpbICAgIDMuODA5MzY1XSB1c2IgdXNiNjogTmV3IFVTQiBkZXZpY2Ugc3Ry
aW5nczogTWZyPTMsIFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTENClsgICAgMy44MDkzNjdd
IHVzYiB1c2I2OiBQcm9kdWN0OiBPSENJIEhvc3QgQ29udHJvbGxlcg0KWyAgICAzLjgwOTM2
OV0gdXNiIHVzYjY6IE1hbnVmYWN0dXJlcjogTGludXggMy4xLjBrb25yYWQtbmV4dC0yMDEx
MTAyMisgb2hjaV9oY2QNClsgICAgMy44MDkzNzFdIHVzYiB1c2I2OiBTZXJpYWxOdW1iZXI6
IDAwMDA6MDA6MTQuNQ0KWyAgICAzLjgxMTI2N10gdXNiIHVzYjY6IHVzYl9wcm9iZV9kZXZp
Y2UNClsgICAgMy44MTEyNzJdIHVzYiB1c2I2OiBjb25maWd1cmF0aW9uICMxIGNob3NlbiBm
cm9tIDEgY2hvaWNlDQpbICAgIDMuODExMjgyXSB1c2IgdXNiNjogYWRkaW5nIDYtMDoxLjAg
KGNvbmZpZyAjMSwgaW50ZXJmYWNlIDApDQpbICAgIDMuODEyNjAzXSBodWIgNi0wOjEuMDog
dXNiX3Byb2JlX2ludGVyZmFjZQ0KWyAgICAzLjgxMjYwOF0gaHViIDYtMDoxLjA6IHVzYl9w
cm9iZV9pbnRlcmZhY2UgLSBnb3QgaWQNClsgICAgMy44MTI2MTBdIGh1YiA2LTA6MS4wOiBV
U0IgaHViIGZvdW5kDQpbICAgIDMuODEyNjI1XSBodWIgNi0wOjEuMDogMiBwb3J0cyBkZXRl
Y3RlZA0KWyAgICAzLjgxMjYyNl0gaHViIDYtMDoxLjA6IHN0YW5kYWxvbmUgaHViDQpbICAg
IDMuODEyNjI3XSBodWIgNi0wOjEuMDogbm8gcG93ZXIgc3dpdGNoaW5nICh1c2IgMS4wKQ0K
WyAgICAzLjgxMjYyOV0gaHViIDYtMDoxLjA6IG5vIG92ZXItY3VycmVudCBwcm90ZWN0aW9u
DQpbICAgIDMuODEyNjMwXSBodWIgNi0wOjEuMDogcG93ZXIgb24gdG8gcG93ZXIgZ29vZCB0
aW1lOiA0bXMNClsgICAgMy44MTI2MzVdIGh1YiA2LTA6MS4wOiBsb2NhbCBwb3dlciBzb3Vy
Y2UgaXMgZ29vZA0KWyAgICAzLjgxMjYzN10gaHViIDYtMDoxLjA6IHRyeWluZyB0byBlbmFi
bGUgcG9ydCBwb3dlciBvbiBub24tc3dpdGNoYWJsZSBodWINClsgICAgMy44MTI2NTddIGRy
aXZlcnMvdXNiL2NvcmUvaW5vZGUuYzogY3JlYXRpbmcgZmlsZSAnMDAxJw0KWyAgICAzLjgx
Mzk4OF0geGVuOiByZWdpc3RlcmluZyBnc2kgMTggdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDEN
ClsgICAgMy44MTM5OTddIHhlbl9tYXBfcGlycV9nc2k6IHJldHVybmluZyBpcnEgMTggZm9y
IGdzaSAxOA0KWyAgICAzLjgxMzk5OV0geGVuOiAtLT4gcGlycT0xOCAtPiBpcnE9MTggKGdz
aT0xOCkNClsgICAgMy44MTQwMDFdIEFscmVhZHkgc2V0dXAgdGhlIEdTSSA6MTgNClsgICAg
My44MTQwMDRdIG9oY2lfaGNkIDAwMDA6MDA6MTYuMDogUENJIElOVCBBIC0+IEdTSSAxOCAo
bGV2ZWwsIGxvdykgLT4gSVJRIDE4DQpbICAgIDMuODE0MDM2XSBvaGNpX2hjZCAwMDAwOjAw
OjE2LjA6IE9IQ0kgSG9zdCBDb250cm9sbGVyDQpbICAgIDMuODE0MDQxXSBkcml2ZXJzL3Vz
Yi9jb3JlL2lub2RlLmM6IGNyZWF0aW5nIGZpbGUgJzAwNycNClsgICAgMy44MTUzMThdIG9o
Y2lfaGNkIDAwMDA6MDA6MTYuMDogbmV3IFVTQiBidXMgcmVnaXN0ZXJlZCwgYXNzaWduZWQg
YnVzIG51bWJlciA3DQpbICAgIDMuODE1MzMzXSBvaGNpX2hjZCAwMDAwOjAwOjE2LjA6IGVu
YWJsZWQgQU1EIHByZWZldGNoIHF1aXJrDQpbICAgIDMuODE1ODYyXSBvaGNpX2hjZCAwMDAw
OjAwOjE2LjA6IGNyZWF0ZWQgZGVidWcgZmlsZXMNClsgICAgMy44MTU4NjRdIG9oY2lfaGNk
IDAwMDA6MDA6MTYuMDogc3VwcG9ydHMgVVNCIHJlbW90ZSB3YWtldXANClsgICAgMy44MTU4
NzRdIG9oY2lfaGNkIDAwMDA6MDA6MTYuMDogaXJxIDE4LCBpbyBtZW0gMHhmOThmZTAwMA0K
WyAgICAzLjg3MDcyN10gb2hjaV9oY2QgMDAwMDowMDoxNi4wOiBPSENJIGNvbnRyb2xsZXIg
c3RhdGUNClsgICAgMy44NzA3MzVdIG9oY2lfaGNkIDAwMDA6MDA6MTYuMDogT0hDSSAxLjAs
IE5PIGxlZ2FjeSBzdXBwb3J0IHJlZ2lzdGVycw0KWyAgICAzLjg3MDczOV0gb2hjaV9oY2Qg
MDAwMDowMDoxNi4wOiBjb250cm9sIDB4MjgzIFJXQyBIQ0ZTPW9wZXJhdGlvbmFsIENCU1I9
Mw0KWyAgICAzLjg3MDc0M10gb2hjaV9oY2QgMDAwMDowMDoxNi4wOiBjbWRzdGF0dXMgMHgw
MDAwMCBTT0M9MA0KWyAgICAzLjg3MDc0Nl0gb2hjaV9oY2QgMDAwMDowMDoxNi4wOiBpbnRy
c3RhdHVzIDB4MDAwMDAwMDQgU0YNClsgICAgMy44NzA3NTBdIG9oY2lfaGNkIDAwMDA6MDA6
MTYuMDogaW50cmVuYWJsZSAweDgwMDAwMDVhIE1JRSBSSFNDIFVFIFJEIFdESA0KWyAgICAz
Ljg3MDc2MF0gb2hjaV9oY2QgMDAwMDowMDoxNi4wOiBoY2NhIGZyYW1lICMwMDA1DQpbICAg
IDMuODcwNzY0XSBvaGNpX2hjZCAwMDAwOjAwOjE2LjA6IHJvb3RodWIuYSAwMjAwMTIwNCBQ
T1RQR1Q9MiBOT0NQIE5QUyBORFA9NCg0KQ0KWyAgICAzLjg3MDc2N10gb2hjaV9oY2QgMDAw
MDowMDoxNi4wOiByb290aHViLmIgMDAwMDAwMDAgUFBDTT0wMDAwIERSPTAwMDANClsgICAg
My44NzA3NzFdIG9oY2lfaGNkIDAwMDA6MDA6MTYuMDogcm9vdGh1Yi5zdGF0dXMgMDAwMDgw
MDAgRFJXRQ0KWyAgICAzLjg3MDc3NF0gb2hjaV9oY2QgMDAwMDowMDoxNi4wOiByb290aHVi
LnBvcnRzdGF0dXMgWzBdIDB4MDAwMDAxMDAgUFBTDQpbICAgIDMuODcwNzc4XSBvaGNpX2hj
ZCAwMDAwOjAwOjE2LjA6IHJvb3RodWIucG9ydHN0YXR1cyBbMV0gMHgwMDAwMDEwMCBQUFMN
ClsgICAgMy44NzA3ODFdIG9oY2lfaGNkIDAwMDA6MDA6MTYuMDogcm9vdGh1Yi5wb3J0c3Rh
dHVzIFsyXSAweDAwMDAwMTAwIFBQUw0KWyAgICAzLjg3MDc4NV0gb2hjaV9oY2QgMDAwMDow
MDoxNi4wOiByb290aHViLnBvcnRzdGF0dXMgWzNdIDB4MDAwMDAxMDAgUFBTDQpbICAgIDMu
ODcwODAxXSB1c2IgdXNiNzogZGVmYXVsdCBsYW5ndWFnZSAweDA0MDkNClsgICAgMy44NzA4
MDhdIHVzYiB1c2I3OiB1ZGV2IDEsIGJ1c251bSA3LCBtaW5vciA9IDc2OA0KWyAgICAzLjg3
MDgxMF0gdXNiIHVzYjc6IE5ldyBVU0IgZGV2aWNlIGZvdW5kLCBpZFZlbmRvcj0xZDZiLCBp
ZFByb2R1Y3Q9MDAwMQ0KWyAgICAzLjg3MDgxMV0gdXNiIHVzYjc6IE5ldyBVU0IgZGV2aWNl
IHN0cmluZ3M6IE1mcj0zLCBQcm9kdWN0PTIsIFNlcmlhbE51bWJlcj0xDQpbICAgIDMuODcw
ODEzXSB1c2IgdXNiNzogUHJvZHVjdDogT0hDSSBIb3N0IENvbnRyb2xsZXINClsgICAgMy44
NzA4MTVdIHVzYiB1c2I3OiBNYW51ZmFjdHVyZXI6IExpbnV4IDMuMS4wa29ucmFkLW5leHQt
MjAxMTEwMjIrIG9oY2lfaGNkDQpbICAgIDMuODcwODE3XSB1c2IgdXNiNzogU2VyaWFsTnVt
YmVyOiAwMDAwOjAwOjE2LjANClsgICAgMy44NzIxNjldIHVzYiB1c2I3OiB1c2JfcHJvYmVf
ZGV2aWNlDQpbICAgIDMuODcyMTc0XSB1c2IgdXNiNzogY29uZmlndXJhdGlvbiAjMSBjaG9z
ZW4gZnJvbSAxIGNob2ljZQ0KWyAgICAzLjg3MjE4OV0gdXNiIHVzYjc6IGFkZGluZyA3LTA6
MS4wIChjb25maWcgIzEsIGludGVyZmFjZSAwKQ0KWyAgICAzLjg3MzQ4N10gaHViIDctMDox
LjA6IHVzYl9wcm9iZV9pbnRlcmZhY2UNClsgICAgMy44NzM0OTFdIGh1YiA3LTA6MS4wOiB1
c2JfcHJvYmVfaW50ZXJmYWNlIC0gZ290IGlkDQpbICAgIDMuODczNDkzXSBodWIgNy0wOjEu
MDogVVNCIGh1YiBmb3VuZA0KWyAgICAzLjg3MzUwN10gaHViIDctMDoxLjA6IDQgcG9ydHMg
ZGV0ZWN0ZWQNClsgICAgMy44NzM1MDldIGh1YiA3LTA6MS4wOiBzdGFuZGFsb25lIGh1Yg0K
WyAgICAzLjg3MzUxMF0gaHViIDctMDoxLjA6IG5vIHBvd2VyIHN3aXRjaGluZyAodXNiIDEu
MCkNClsgICAgMy44NzM1MTFdIGh1YiA3LTA6MS4wOiBubyBvdmVyLWN1cnJlbnQgcHJvdGVj
dGlvbg0KWyAgICAzLjg3MzUxM10gaHViIDctMDoxLjA6IHBvd2VyIG9uIHRvIHBvd2VyIGdv
b2QgdGltZTogNG1zDQpbICAgIDMuODczNTE4XSBodWIgNy0wOjEuMDogbG9jYWwgcG93ZXIg
c291cmNlIGlzIGdvb2QNClsgICAgMy44NzM1MjBdIGh1YiA3LTA6MS4wOiB0cnlpbmcgdG8g
ZW5hYmxlIHBvcnQgcG93ZXIgb24gbm9uLXN3aXRjaGFibGUgaHViDQpbICAgIDMuODczNTQ2
XSBkcml2ZXJzL3VzYi9jb3JlL2lub2RlLmM6IGNyZWF0aW5nIGZpbGUgJzAwMScNClsgICAg
My44NzM1ODNdIGVoY2lfaGNkIDAwMDA6MDA6MTYuMjogSFMgY29tcGFuaW9uIGZvciAwMDAw
OjAwOjE2LjANClsgICAgMy44NzQ5MDZdIGluaXRjYWxsIG9oY2lfaGNkX21vZF9pbml0KzB4
MC8weGJmIHJldHVybmVkIDAgYWZ0ZXIgMjQxNDk5IHVzZWNzDQpbICAgIDMuODc0OTEwXSBj
YWxsaW5nICB1aGNpX2hjZF9pbml0KzB4MC8weDEyMiBAIDENClsgICAgMy44NzQ5MTJdIHVo
Y2lfaGNkOiBVU0IgVW5pdmVyc2FsIEhvc3QgQ29udHJvbGxlciBJbnRlcmZhY2UgZHJpdmVy
DQpbICAgIDMuODc2MjU5XSBpbml0Y2FsbCB1aGNpX2hjZF9pbml0KzB4MC8weDEyMiByZXR1
cm5lZCAwIGFmdGVyIDEzMDggdXNlY3MNClsgICAgMy44NzYyNjJdIGNhbGxpbmcgIHVzYmxw
X2luaXQrMHgwLzB4MWIgQCAxDQpbICAgIDMuODc3MTg5XSB1c2Jjb3JlOiByZWdpc3RlcmVk
IG5ldyBpbnRlcmZhY2UgZHJpdmVyIHVzYmxwDQpbICAgIDMuODc3MjA2XSBpbml0Y2FsbCB1
c2JscF9pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIgOTExIHVzZWNzDQpbICAgIDMu
ODc3MjE1XSBjYWxsaW5nICB1c2Jfc3Rvcl9pbml0KzB4MC8weDUwIEAgMQ0KWyAgICAzLjg3
NzIyMF0gSW5pdGlhbGl6aW5nIFVTQiBNYXNzIFN0b3JhZ2UgZHJpdmVyLi4uDQpbICAgIDMu
ODc4NzkxXSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIHVzYi1z
dG9yYWdlDQpbICAgIDMuODc4Nzk0XSBVU0IgTWFzcyBTdG9yYWdlIHN1cHBvcnQgcmVnaXN0
ZXJlZC4NClsgICAgMy44Nzg3OTldIGluaXRjYWxsIHVzYl9zdG9yX2luaXQrMHgwLzB4NTAg
cmV0dXJuZWQgMCBhZnRlciAxNTM4IHVzZWNzDQpbICAgIDMuODc4ODAyXSBjYWxsaW5nICB1
c2JfdXN1YWxfaW5pdCsweDAvMHgzZSBAIDENClsgICAgMy44ODAxNDNdIHVzYmNvcmU6IHJl
Z2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgbGlidXN1YWwNClsgICAgMy44ODAxNTBd
IGluaXRjYWxsIHVzYl91c3VhbF9pbml0KzB4MC8weDNlIHJldHVybmVkIDAgYWZ0ZXIgMTMx
MSB1c2Vjcw0KWyAgICAzLjg4MDE1M10gY2FsbGluZyAgdXNiX3NlcmlhbF9pbml0KzB4MC8w
eDIzNyBAIDENClsgICAgMy44ODIyNDhdIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVy
ZmFjZSBkcml2ZXIgdXNic2VyaWFsDQpbICAgIDMuODgyMjUyXSB1c2JzZXJpYWw6IFVTQiBT
ZXJpYWwgRHJpdmVyIGNvcmUNClsgICAgMy44ODIyNThdIGluaXRjYWxsIHVzYl9zZXJpYWxf
aW5pdCsweDAvMHgyMzcgcmV0dXJuZWQgMCBhZnRlciAyMDUwIHVzZWNzDQpbICAgIDMuODgy
MjYxXSBjYWxsaW5nICBjcDIxMHhfaW5pdCsweDAvMHg1OSBAIDENClsgICAgMy44ODM1OTld
IFVTQiBTZXJpYWwgc3VwcG9ydCByZWdpc3RlcmVkIGZvciBjcDIxMHgNClsgICAgMy44ODU0
MTVdIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgY3AyMTB4DQpb
ICAgIDMuODg1NDE5XSBjcDIxMHg6IHYwLjA5OlNpbGljb24gTGFicyBDUDIxMHggUlMyMzIg
c2VyaWFsIGFkYXB0b3IgZHJpdmVyDQpbICAgIDMuODg1NDI1XSBpbml0Y2FsbCBjcDIxMHhf
aW5pdCsweDAvMHg1OSByZXR1cm5lZCAwIGFmdGVyIDMwODQgdXNlY3MNClsgICAgMy44ODU0
MjhdIGNhbGxpbmcgIGN5cHJlc3NfaW5pdCsweDAvMHhiOSBAIDENClsgICAgMy44ODY3MDZd
IFVTQiBTZXJpYWwgc3VwcG9ydCByZWdpc3RlcmVkIGZvciBEZUxvcm1lIEVhcnRobWF0ZSBV
U0INClsgICAgMy44ODc5NzFdIFVTQiBTZXJpYWwgc3VwcG9ydCByZWdpc3RlcmVkIGZvciBI
SUQtPkNPTSBSUzIzMiBBZGFwdGVyDQpbICAgIDMuODg5MTkzXSBVU0IgU2VyaWFsIHN1cHBv
cnQgcmVnaXN0ZXJlZCBmb3IgTm9raWEgQ0EtNDIgVjIgQWRhcHRlcg0KWyAgICAzLjg5MDEz
OF0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBjeXByZXNzDQpb
ICAgIDMuODkwMTQ3XSBjeXByZXNzX204OiB2MS4xMDpDeXByZXNzIFVTQiB0byBTZXJpYWwg
RHJpdmVyDQpbICAgIDMuODkwMTYxXSBpbml0Y2FsbCBjeXByZXNzX2luaXQrMHgwLzB4Yjkg
cmV0dXJuZWQgMCBhZnRlciA0NjExIHVzZWNzDQpbICAgIDMuODkwMTcwXSBjYWxsaW5nICBt
b3NjaGlwNzcyMF9pbml0KzB4MC8weDc2IEAgMQ0KWyAgICAzLjg5MTY4OV0gVVNCIFNlcmlh
bCBzdXBwb3J0IHJlZ2lzdGVyZWQgZm9yIE1vc2NoaXAgMiBwb3J0IGFkYXB0ZXINClsgICAg
My44OTE2OTJdIG1vczc3MjA6IDIuMTpNb3NjaGlwIFVTQiBTZXJpYWwgRHJpdmVyDQpbICAg
IDMuODkyMzQ5XSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIG1v
c2NoaXA3NzIwDQpbICAgIDMuODkyMzU3XSBpbml0Y2FsbCBtb3NjaGlwNzcyMF9pbml0KzB4
MC8weDc2IHJldHVybmVkIDAgYWZ0ZXIgMjEyNiB1c2Vjcw0KWyAgICAzLjg5MjM2MF0gY2Fs
bGluZyAgbW9zY2hpcDc4NDBfaW5pdCsweDAvMHhjYyBAIDENClsgICAgMy44OTQxNDVdIFVT
QiBTZXJpYWwgc3VwcG9ydCByZWdpc3RlcmVkIGZvciBNb3NjaGlwIDc4NDAvNzgyMCBVU0Ig
U2VyaWFsIERyaXZlcg0KWyAgICAzLjg5NDE0OV0gbW9zNzg0MDogMS4zLjI6TW9zY2hpcCA3
ODQwLzc4MjAgVVNCIFNlcmlhbCBEcml2ZXINClsgICAgMy44OTUzOTZdIHVzYmNvcmU6IHJl
Z2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgbW9zNzg0MA0KWyAgICAzLjg5NTQwNl0g
aW5pdGNhbGwgbW9zY2hpcDc4NDBfaW5pdCsweDAvMHhjYyByZXR1cm5lZCAwIGFmdGVyIDI5
NjggdXNlY3MNClsgICAgMy44OTU0MDhdIGNhbGxpbmcgIGk4MDQyX2luaXQrMHgwLzB4M2Fi
IEAgMQ0KWyAgICAzLjkwMjI4MF0gaTgwNDI6IFBOUDogTm8gUFMvMiBjb250cm9sbGVyIGZv
dW5kLiBQcm9iaW5nIHBvcnRzIGRpcmVjdGx5Lg0KWyAgICAzLjkwNDEyMl0gc2VyaW86IGk4
MDQyIEtCRCBwb3J0IGF0IDB4NjAsMHg2NCBpcnEgMQ0KWyAgICAzLjkwNDEzM10gc2VyaW86
IGk4MDQyIEFVWCBwb3J0IGF0IDB4NjAsMHg2NCBpcnEgMTINClsgICAgMy45MDYwMTNdIGlu
aXRjYWxsIGk4MDQyX2luaXQrMHgwLzB4M2FiIHJldHVybmVkIDAgYWZ0ZXIgMTAzNDYgdXNl
Y3MNClsgICAgMy45MDYwMTddIGNhbGxpbmcgIHNlcnBvcnRfaW5pdCsweDAvMHgzNCBAIDEN
ClsgICAgMy45MDYwMjBdIGluaXRjYWxsIHNlcnBvcnRfaW5pdCsweDAvMHgzNCByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MDYwMjJdIGNhbGxpbmcgIG1vdXNlZGV2X2lu
aXQrMHgwLzB4NjEgQCAxDQpbICAgIDMuOTA3MzY3XSBtb3VzZWRldjogUFMvMiBtb3VzZSBk
ZXZpY2UgY29tbW9uIGZvciBhbGwgbWljZQ0KWyAgICAzLjkwNzM3Nl0gaW5pdGNhbGwgbW91
c2VkZXZfaW5pdCsweDAvMHg2MSByZXR1cm5lZCAwIGFmdGVyIDEzMTYgdXNlY3MNClsgICAg
My45MDczNzldIGNhbGxpbmcgIGV2ZGV2X2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTA5
OTczXSBpbml0Y2FsbCBldmRldl9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMjUy
NCB1c2Vjcw0KWyAgICAzLjkwOTk3Nl0gY2FsbGluZyAgYXRrYmRfaW5pdCsweDAvMHgyNyBA
IDENClsgICAgMy45MTEzMTldIGluaXRjYWxsIGF0a2JkX2luaXQrMHgwLzB4MjcgcmV0dXJu
ZWQgMCBhZnRlciAxMzAyIHVzZWNzDQpbICAgIDMuOTExMzIzXSBjYWxsaW5nICBwc21vdXNl
X2luaXQrMHgwLzB4NzkgQCAxDQpbICAgIDMuOTE0Nzc3XSBpbml0Y2FsbCBwc21vdXNlX2lu
aXQrMHgwLzB4NzkgcmV0dXJuZWQgMCBhZnRlciAzMzY0IHVzZWNzDQpbICAgIDMuOTE0Nzgw
XSBjYWxsaW5nICB4ZW5rYmRfaW5pdCsweDAvMHg1OSBAIDENClsgICAgMy45MTQ3ODJdIGlu
aXRjYWxsIHhlbmtiZF9pbml0KzB4MC8weDU5IHJldHVybmVkIC0xOSBhZnRlciAwIHVzZWNz
DQpbICAgIDMuOTE0Nzg0XSBjYWxsaW5nICBjbW9zX2luaXQrMHgwLzB4NmEgQCAxDQpbICAg
IDMuOTE0ODI4XSBydGNfY21vcyAwMDowNDogUlRDIGNhbiB3YWtlIGZyb20gUzQNClsgICAg
My45MTYzMDVdIHJ0Y19jbW9zIDAwOjA0OiBydGMgY29yZTogcmVnaXN0ZXJlZCBydGNfY21v
cyBhcyBydGMwDQpbICAgIDMuOTE2Mzc3XSBydGMwOiBhbGFybXMgdXAgdG8gb25lIG1vbnRo
LCB5M2ssIDExNCBieXRlcyBudnJhbQ0KWyAgICAzLjkxNzcxMV0gaW5pdGNhbGwgY21vc19p
bml0KzB4MC8weDZhIHJldHVybmVkIDAgYWZ0ZXIgMjg0OSB1c2Vjcw0KWyAgICAzLjkxNzcx
NF0gY2FsbGluZyAgaTJjX2k4MDFfaW5pdCsweDAvMHhhZCBAIDENClsgICAgMy45MTg5OTBd
IGluaXRjYWxsIGkyY19pODAxX2luaXQrMHgwLzB4YWQgcmV0dXJuZWQgMCBhZnRlciAxMjM3
IHVzZWNzDQpbICAgIDMuOTE4OTk0XSBjYWxsaW5nICBpbml0X3JjX21hcF9hZHN0ZWNoX2R2
Yl90X3BjaSsweDAvMHgxMiBAIDENClsgICAgMy45MTg5OTddIGluaXRjYWxsIGluaXRfcmNf
bWFwX2Fkc3RlY2hfZHZiX3RfcGNpKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cw0KWyAgICAzLjkxODk5OV0gY2FsbGluZyAgaW5pdF9yY19tYXBfYWxpbmtfZHR1X20rMHgw
LzB4MTIgQCAxDQpbICAgIDMuOTE5MDQxXSBpbml0Y2FsbCBpbml0X3JjX21hcF9hbGlua19k
dHVfbSsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkwNDNd
IGNhbGxpbmcgIGluaXRfcmNfbWFwX2FueXNlZSsweDAvMHgxMiBAIDENClsgICAgMy45MTkw
NDVdIGluaXRjYWxsIGluaXRfcmNfbWFwX2FueXNlZSsweDAvMHgxMiByZXR1cm5lZCAwIGFm
dGVyIDAgdXNlY3MNClsgICAgMy45MTkwNDddIGNhbGxpbmcgIGluaXRfcmNfbWFwX2FwYWNf
dmlld2NvbXArMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MDUwXSBpbml0Y2FsbCBpbml0X3Jj
X21hcF9hcGFjX3ZpZXdjb21wKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0K
WyAgICAzLjkxOTA2MV0gY2FsbGluZyAgaW5pdF9yY19tYXBfYXN1c19wYzM5KzB4MC8weDEy
IEAgMQ0KWyAgICAzLjkxOTA2M10gaW5pdGNhbGwgaW5pdF9yY19tYXBfYXN1c19wYzM5KzB4
MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTA2NV0gY2FsbGlu
ZyAgaW5pdF9yY19tYXBfYXRpX3R2X3dvbmRlcl9oZF82MDArMHgwLzB4MTIgQCAxDQpbICAg
IDMuOTE5MDY3XSBpbml0Y2FsbCBpbml0X3JjX21hcF9hdGlfdHZfd29uZGVyX2hkXzYwMCsw
eDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkwNzBdIGNhbGxp
bmcgIGluaXRfcmNfbWFwX2F2ZXJtZWRpYV9hMTZkKzB4MC8weDEyIEAgMQ0KWyAgICAzLjkx
OTA3Ml0gaW5pdGNhbGwgaW5pdF9yY19tYXBfYXZlcm1lZGlhX2ExNmQrMHgwLzB4MTIgcmV0
dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5MDc0XSBjYWxsaW5nICBpbml0X3Jj
X21hcF9hdmVybWVkaWErMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MDc3XSBpbml0Y2FsbCBp
bml0X3JjX21hcF9hdmVybWVkaWErMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNz
DQpbICAgIDMuOTE5MDc5XSBjYWxsaW5nICBpbml0X3JjX21hcF9hdmVybWVkaWFfY2FyZGJ1
cysweDAvMHgxMiBAIDENClsgICAgMy45MTkwODFdIGluaXRjYWxsIGluaXRfcmNfbWFwX2F2
ZXJtZWRpYV9jYXJkYnVzKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAg
ICAzLjkxOTA4M10gY2FsbGluZyAgaW5pdF9yY19tYXBfYXZlcm1lZGlhX2R2YnQrMHgwLzB4
MTIgQCAxDQpbICAgIDMuOTE5MDg1XSBpbml0Y2FsbCBpbml0X3JjX21hcF9hdmVybWVkaWFf
ZHZidCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkwODdd
IGNhbGxpbmcgIGluaXRfcmNfbWFwX2F2ZXJtZWRpYV9tMTM1YSsweDAvMHgxMiBAIDENClsg
ICAgMy45MTkwOTBdIGluaXRjYWxsIGluaXRfcmNfbWFwX2F2ZXJtZWRpYV9tMTM1YSsweDAv
MHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkwOTJdIGNhbGxpbmcg
IGluaXRfcmNfbWFwX2F2ZXJtZWRpYV9tNzMzYV9ybV9rNisweDAvMHgxMiBAIDENClsgICAg
My45MTkwOTRdIGluaXRjYWxsIGluaXRfcmNfbWFwX2F2ZXJtZWRpYV9tNzMzYV9ybV9rNisw
eDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkwOTZdIGNhbGxp
bmcgIGluaXRfcmNfbWFwX2F2ZXJtZWRpYV9ybV9rcysweDAvMHgxMiBAIDENClsgICAgMy45
MTkwOTldIGluaXRjYWxsIGluaXRfcmNfbWFwX2F2ZXJtZWRpYV9ybV9rcysweDAvMHgxMiBy
ZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkxMDFdIGNhbGxpbmcgIGluaXRf
cmNfbWFwX2F2ZXJ0dl8zMDMrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MTAzXSBpbml0Y2Fs
bCBpbml0X3JjX21hcF9hdmVydHZfMzAzKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1
c2Vjcw0KWyAgICAzLjkxOTEwNV0gY2FsbGluZyAgaW5pdF9yY19tYXBfYXp1cmV3YXZlX2Fk
X3R1NzAwKzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTEwN10gaW5pdGNtYXBfYXp1cmV3YXZl
X2FkX3R1NzAwKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkx
OTEwOV0gY2FsbGluZyAgaW5pdF9yY19tYXBfYmVob2xkKzB4MC8weDEyIEAgMQ0KWyAgICAz
LjkxOTExMl0gaW5pdGNhbGwgaW5pdF9yY19tYXBfYmVob2xkKzB4MC8weDEyIHJldHVybmVk
IDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTExNF0gY2FsbGluZyAgaW5pdF9yY19tYXBf
YmVob2xkX2NvbHVtYnVzKzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTExNl0gaW5pdGNhbGwg
aW5pdF9yY19tYXBfYmVob2xkX2NvbHVtYnVzKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIg
MCB1c2Vjcw0KWyAgICAzLjkxOTExOF0gY2FsbGluZyAgaW5pdF9yY19tYXBfYnVkZ2V0X2Np
X29sZCsweDAvMHgxMiBAIDENClsgICAgMy45MTkxMjBdIGluaXRjYWxsIGluaXRfcmNfbWFw
X2J1ZGdldF9jaV9vbGQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAg
IDMuOTE5MTIyXSBjYWxsaW5nICBpbml0X3JjX21hcF9jaW5lcmd5XzE0MDArMHgwLzB4MTIg
QCAxDQpbICAgIDMuOTE5MTI1XSBpbml0Y2FsbCBpbml0X3JjX21hcF9jaW5lcmd5XzE0MDAr
MHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5MTI3XSBjYWxs
aW5nICBpbml0X3JjX21hcF9jaW5lcmd5KzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTEyOV0g
aW5pdGNhbGwgaW5pdF9yY19tYXBfY2luZXJneSsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVy
IDAgdXNlY3MNClsgICAgMy45MTkxMzFdIGNhbGxpbmcgIGluaXRfcmNfbWFwKzB4MC8weDEy
IEAgMQ0KWyAgICAzLjkxOTEzM10gaW5pdGNhbGwgaW5pdF9yY19tYXArMHgwLzB4MTIgcmV0
dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5MTM1XSBjYWxsaW5nICBpbml0X3Jj
X21hcCsweDAvMHgxMiBAIDENClsgICAgMy45MTkxMzddIGluaXRjYWxsIGluaXRfcmNfbWFw
KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTEzOV0gY2Fs
bGluZyAgaW5pdF9yY19tYXBfZGlnaXRhbG5vd190aW55dHdpbisweDAvMHgxMiBAIDENClsg
ICAgMy45MTkxNDFdIGluaXRjYWxsIGluaXRfcmNfbWFwX2RpZ2l0YWxub3dfdGlueXR3aW4r
MHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5MTQ0XSBjYWxs
aW5nICBpbml0X3JjX21hcF9kaWdpdHRyYWRlKzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTE0
Nl0gaW5pdGNhbGwgaW5pdF9yY19tYXBfZGlnaXR0cmFkZSsweDAvMHgxMiByZXR1cm5lZCAw
IGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkxNDhdIGNhbGxpbmcgIGluaXRfcmNfbWFwX2Rt
MTEwNV9uZWMrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MTUwXSBpbml0Y2FsbCBpbml0X3Jj
X21hcF9kbTExMDVfbmVjKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAg
ICAzLjkxOTE1M10gY2FsbGluZyAgaW5pdF9yY19tYXBfZG50dl9saXZlX2R2Yl90KzB4MC8w
eDEyIEAgMQ0KWyAgICAzLjkxOTE1NV0gaW5pdGNhbGwgaW5pdF9yY19tYXBfZG50dl9saXZl
X2R2Yl90KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTE1
N10gY2FsbGluZyAgaW5pdF9yY19tYXBfZG50dl9saXZlX2R2YnRfcHJvKzB4MC8weDEyIEAg
MQ0KWyAgICAzLjkxOTE1OV0gaW5pdGNhbGwgaW5pdF9yY19tYXBfZG50dl9saXZlX2R2YnRf
cHJvKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTE2Ml0g
Y2FsbGluZyAgaW5pdF9yY19tYXBfZW1fdGVycmF0ZWMrMHgwLzB4MTIgQCAxDQpbICAgIDMu
OTE5MTY0XSBpbml0Y2FsbCBpbml0X3JjX21hcF9lbV90ZXJyYXRlYysweDAvMHgxMiByZXR1
cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkxNjZdIGNhbGxpbmcgIGluaXRfcmNf
bWFwX2VuY29yZV9lbmx0djIrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MTY4XSBpbml0Y2Fs
bCBpbml0X3JjX21hcF9lbmNvcmVfZW5sdHYyKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIg
MCB1c2Vjcw0KWyAgICAzLjkxOTE3MF0gY2FsbGluZyAgaW5pdF9yY19tYXBfZW5jb3JlX2Vu
bHR2KzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTE3Ml0gaW5pdGNhbGwgaW5pdF9yY19tYXBf
ZW5jb3JlX2VubHR2KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAz
LjkxOTE3NV0gY2FsbGluZyAgaW5pdF9yY19tYXBfZW5jb3JlX2VubHR2X2ZtNTMrMHgwLzB4
MTIgQCAxDQpbICAgIDMuOTE5MTc3XSBpbml0Y2FsbCBpbml0X3JjX21hcF9lbmNvcmVfZW5s
dHZfZm01MysweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkx
NzldIGNhbGxpbmcgIGluaXRfcmNfbWFwX2V2Z2FfaW5kdHViZSsweDAvMHgxMiBAIDENClsg
ICAgMy45MTkxODFdIGluaXRjYWxsIGluaXRfcmNfbWFwX2V2Z2FfaW5kdHViZSsweDAvMHgx
MiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkxODNdIGNhbGxpbmcgIGlu
aXRfcmNfbWFwX2V6dHYrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MTg1XSBpbml0Y2FsbCBp
bml0X3JjX21hcF9lenR2KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAg
ICAzLjkxOTE4N10gY2FsbGluZyAgaW5pdF9yY19tYXBfZmx5ZHZiKzB4MC8weDEyIEAgMQ0K
WyAgICAzLjkxOTE5MF0gaW5pdGNhbGwgaW5pdF9yY19tYXBfZmx5ZHZiKzB4MC8weDEyIHJl
dHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTE5Ml0gY2FsbGluZyAgaW5pdF9y
Y19tYXBfZmx5dmlkZW8rMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MTk0XSBpbml0Y2FsbCBp
bml0X3JjX21hcF9mbHl2aWRlbysweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MN
ClsgICAgMy45MTkxOTZdIGNhbGxpbmcgIGluaXRfcmNfbWFwX2Z1c2lvbmhkdHZfbWNlKzB4
MC8weDEyIEAgMQ0KWyAgICAzLjkxOTE5OF0gaW5pdGNhbGwgaW5pdF9yY19tYXBfZnVzaW9u
aGR0dl9tY2UrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5
MjAwXSBjYWxsaW5nICBpbml0X3JjX21hcF9nYWRtZWlfcm0wMDh6KzB4MC8weDEyIEAgMQ0K
WyAgICAzLjkxOTIwM10gaW5pdGNhbGwgaW5pdF9yY19tYXBfZ2FkbWVpX3JtMDA4eisweDAv
MHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkyMDVdIGNhbGxpbmcg
IGluaXRfcmNfbWFwX2dlbml1c190dmdvX2ExMW1jZSsweDAvMHgxMiBAIDENClsgICAgMy45
MTkyMDddIGluaXRjYWxsIGluaXRfcmNfbWFwX2dlbml1c190dmdvX2ExMW1jZSsweDAvMHgx
MiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkyMDldIGNhbGxpbmcgIGlu
aXRfcmNfbWFwX2dvdHZpZXc3MTM1KzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTIxMl0gaW5p
dGNhbGwgaW5pdF9yY19tYXBfZ290dmlldzcxMzUrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRl
ciAwIHVzZWNzDQpbICAgIDMuOTE5MjE0XSBjYWxsaW5nICBpbml0X3JjX21hcF9pbW9uX21j
ZSsweDAvMHgxMiBAIDENClsgICAgMy45MTkyMTZdIGluaXRjYWxsIGluaXRfcmNfbWFwX2lt
b25fbWNlKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTIx
OF0gY2FsbGluZyAgaW5pdF9yY19tYXBfaW1vbl9wYWQrMHgwLzB4MTIgQCAxDQpbICAgIDMu
OTE5MjIwXSBpbml0Y2FsbCBpbml0X3JjX21hcF9pbW9uX3BhZCsweDAvMHgxMiByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkyMjJdIGNhbGxpbmcgIGluaXRfcmNfbWFw
X2lvZGF0YV9iY3R2N2UrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MjI0XSBpbml0Y2FsbCBp
bml0X3JjX21hcF9pb2RhdGFfYmN0djdlKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1
c2Vjcw0KWyAgICAzLjkxOTIyN10gY2FsbGluZyAgaW5pdF9yY19tYXBfa2Fpb215KzB4MC8w
eDEyIEAgMQ0KWyAgICAzLjkxOTIyOV0gaW5pdGNhbGwgaW5pdF9yY19tYXBfa2Fpb215KzB4
MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTIzMV0gY2FsbGlu
ZyAgaW5pdF9yY19tYXBfa3dvcmxkXzMxNXUrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MjMz
XSBpbml0Y2FsbCBpbml0X3JjX21hcF9rd29ybGRfMzE1dSsweDAvMHgxMiByZXR1cm5lZCAw
IGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkyMzVdIGNhbGxpbmcgIGluaXRfcmNfbWFwX2t3
b3JsZF9wbHVzX3R2X2FuYWxvZysweDAvMHgxMiBAIDENClsgICAgMy45MTkyMzhdIGluaXRj
YWxsIGluaXRfcmNfbWFwX2t3b3JsZF9wbHVzX3R2X2FuYWxvZysweDAvMHgxMiByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkyNDBdIGNhbGxpbmcgIGluaXRfcmNfbWFw
X2xlYWR0ZWtfeTA0ZzAwNTErMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MjQyXSBpbml0Y2Fs
bCBpbml0X3JjX21hcF9sZWFkdGVrX3kwNGcwMDUxKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0
ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTI0NV0gY2FsbGluZyAgaW5pdF9yY19tYXBfbGlyYysw
eDAvMHgxMiBAIDENClsgICAgMy45MTkyNDddIGluaXRjYWxsIGluaXRfcmNfbWFwX2xpcmMr
MHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5MjQ5XSBjYWxs
aW5nICBpbml0X3JjX2xtZTI1MTBfbWFwKzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTI1MV0g
aW5pdGNhbGwgaW5pdF9yY19sbWUyNTEwX21hcCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVy
IDAgdXNlY3MNClsgICAgMy45MTkyNTNdIGNhbGxpbmcgIGluaXRfcmNfbWFwX21hbmxpKzB4
MC8weDEyIEAgMQ0KWyAgICAzLjkxOTI1NV0gaW5pdGNhbGwgaW5pdF9yY19tYXBfbWFubGkr
MHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5MjU4XSBjYWxs
aW5nICBpbml0X3JjX21hcF9tc2lfZGlnaXZveF9paSsweDAvMHgxMiBAIDENClsgICAgMy45
MTkyNjBdIGluaXRjYWxsIGluaXRfcmNfbWFwX21zaV9kaWdpdm94X2lpKzB4MC8weDEyIHJl
dHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTI2Ml0gY2FsbGluZyAgaW5pdF9y
Y19tYXBfbXNpX2RpZ2l2b3hfaWlpKzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTI2NF0gaW5p
dGNhbGwgaW5pdF9yY19tYXBfbXNpX2RpZ2l2b3hfaWlpKzB4MC8weDEyIHJldHVybmVkIDAg
YWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTI2N10gY2FsbGluZyAgaW5pdF9yY19tYXBfbXNp
X3R2YW55d2hlcmUrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MjY5XSBpbml0Y2FsbCBpbml0
X3JjX21hcF9tc2lfdHZhbnl3aGVyZSsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNl
Y3MNClsgICAgMy45MTkyNzFdIGNhbGxpbmcgIGluaXRfcmNfbWFwX21zaV90dmFueXdoZXJl
X3BsdXMrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5Mjc0XSBpbml0Y2FsbCBpbml0X3JjX21h
cF9tc2lfdHZhbnl3aGVyZV9wbHVzKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cw0KWyAgICAzLjkxOTI3Nl0gY2FsbGluZyAgaW5pdF9yY19tYXBfbmVidWxhKzB4MC8weDEy
IEAgMQ0KWyAgICAzLjkxOTI3OV0gaW5pdGNhbGwgaW5pdF9yY19tYXBfbmVidWxhKzB4MC8w
eDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTI4MV0gY2FsbGluZyAg
aW5pdF9yY19tYXBfbmVjX3RlcnJhdGVjX2NpbmVyZ3lfeHMrMHgwLzB4MTIgQCAxDQpbICAg
IDMuOTE5Mjg0XSBpbml0Y2FsbCBpbml0X3JjX21hcF9uZWNfdGVycmF0ZWNfY2luZXJneV94
cysweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkyODZdIGNh
bGxpbmcgIGluaXRfcmNfbWFwX25vcndvb2QrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5Mjg5
XSBpbml0Y2FsbCBpbml0X3JjX21hcF9ub3J3b29kKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0
ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTI5MV0gY2FsbGluZyAgaW5pdF9yY19tYXBfbnBndGVj
aCsweDAvMHgxMiBAIDENClsgICAgMy45MTkyOTNdIGluaXRjYWxsIGluaXRfcmNfbWFwX25w
Z3RlY2grMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5Mjk1
XSBjYWxsaW5nICBpbml0X3JjX21hcF9wY3R2X3NlZG5hKzB4MC8weDEyIEAgMQ0KWyAgICAz
LjkxOTI5OF0gaW5pdGNhbGwgaW5pdF9yY19tYXBfcGN0dl9zZWRuYSsweDAvMHgxMiByZXR1
cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkzMDBdIGNhbGxpbmcgIGluaXRfcmNf
bWFwX3Bpbm5hY2xlX2NvbG9yKzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTMwMl0gaW5pdGNh
bGwgaW5pdF9yY19tYXBfcGlubmFjbGVfY29sb3IrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRl
ciAwIHVzZWNzDQpbICAgIDMuOTE5MzA1XSBjYWxsaW5nICBpbml0X3JjX21hcF9waW5uYWNs
ZV9ncmV5KzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTMwN10gaW5pdGNhbGwgaW5pdF9yY19t
YXBfcGlubmFjbGVfZ3JleSsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsg
ICAgMy45MTkzMDldIGNhbGxpbmcgIGluaXRfcmNfbWFwX3Bpbm5hY2xlX3BjdHZfaGQrMHgw
LzB4MTIgQCAxDQpbICAgIDMuOTE5MzEyXSBpbml0Y2FsbCBpbml0X3JjX21hcF9waW5uYWNs
ZV9wY3R2X2hkKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkx
OTMxNF0gY2FsbGluZyAgaW5pdF9yY19tYXBfcGl4ZWx2aWV3KzB4MC8weDEyIEAgMQ0KWyAg
ICAzLjkxOTMxNl0gaW5pdGNhbGwgaW5pdF9yY19tYXBfcGl4ZWx2aWV3KzB4MC8weDEyIHJl
dHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTMxOF0gY2FsbGluZyAgaW5pdF9y
Y19tYXBfcGl4ZWx2aWV3KzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTMyMV0gaW5pdGNhbGwg
aW5pdF9yY19tYXBfcGl4ZWx2aWV3KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cw0KWyAgICAzLjkxOTMyM10gY2FsbGluZyAgaW5pdF9yY19tYXBfcGl4ZWx2aWV3KzB4MC8w
eDEyIEAgMQ0KWyAgICAzLjkxOTMyNV0gaW5pdGNhbGwgaW5pdF9yY19tYXBfcGl4ZWx2aWV3
KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTMyN10gY2Fs
bGluZyAgaW5pdF9yY19tYXBfcGl4ZWx2aWV3X25ldysweDAvMHgxMiBAIDENClsgICAgMy45
MTkzMzBdIGluaXRjYWxsIGluaXRfcmNfbWFwX3BpeGVsdmlld19uZXcrMHgwLzB4MTIgcmV0
dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5MzMyXSBjYWxsaW5nICBpbml0X3Jj
X21hcF9wb3dlcmNvbG9yX3JlYWxfYW5nZWwrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MzM0
XSBpbml0Y2FsbCBpbml0X3JjX21hcF9wb3dlcmNvbG9yX3JlYWxfYW5nZWwrMHgwLzB4MTIg
cmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5MzM3XSBjYWxsaW5nICBpbml0
X3JjX21hcF9wcm90ZXVzXzIzMDkrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MzM5XSBpbml0
Y2FsbCBpbml0X3JjX21hcF9wcm90ZXVzXzIzMDkrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRl
ciAwIHVzZWNzDQpbICAgIDMuOTE5MzQxXSBjYWxsaW5nICBpbml0X3JjX21hcF9wdXJwbGV0
disweDAvMHgxMiBAIDENClsgICAgMy45MTkzNDNdIGluaXRjYWxsIGluaXRfcmNfbWFwX3B1
cnBsZXR2KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTM0
NV0gY2FsbGluZyAgaW5pdF9yY19tYXBfcHY5NTErMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5
MzQ4XSBpbml0Y2FsbCBpbml0X3JjX21hcF9wdjk1MSsweDAvMHgxMiByZXR1cm5lZCAwIGFm
dGVyIDAgdXNlY3MNClsgICAgMy45MTkzNTBdIGNhbGxpbmcgIGluaXRfcmNfbWFwX3JjNV9o
YXVwcGF1Z2VfbmV3KzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTM1Ml0gaW5pdGNhbGwgaW5p
dF9yY19tYXBfcmM1X2hhdXBwYXVnZV9uZXcrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAw
IHVzZWNzDQpbICAgIDMuOTE5MzU0XSBjYWxsaW5nICBpbml0X3JjX21hcF9yYzZfbWNlKzB4
MC8weDEyIEAgMQ0KWyAgICAzLjkxOTM1N10gaW5pdGNhbGwgaW5pdF9yY19tYXBfcmM2X21j
ZSsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkzNTldIGNh
bGxpbmcgIGluaXRfcmNfbWFwX3JlYWxfYXVkaW9fMjIwXzMyX2tleXMrMHgwLzB4MTIgQCAx
DQpbICAgIDMuOTE5MzYxXSBpbml0Y2FsbCBpbml0X3JjX21hcF9yZWFsX2F1ZGlvXzIyMF8z
Ml9rZXlzKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTM2
NF0gY2FsbGluZyAgaW5pdF9yY19tYXBfc3RyZWFtemFwKzB4MC8weDEyIEAgMQ0KWyAgICAz
LjkxOTM2Nl0gaW5pdGNhbGwgaW5pdF9yY19tYXBfc3RyZWFtemFwKzB4MC8weDEyIHJldHVy
bmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTM2OF0gY2FsbGluZyAgaW5pdF9yY19t
YXBfdGJzX25lYysweDAvMHgxMiBAIDENClsgICAgMy45MTkzNzBdIGluaXRjYWxsIGluaXRf
cmNfbWFwX3Ric19uZWMrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAg
IDMuOTE5MzcyXSBjYWxsaW5nICBpbml0X3JjX21hcCsweDAvMHgxMiBAIDENClsgICAgMy45
MTkzNzVdIGluaXRjYWxsIGluaXRfcmNfbWFwKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIg
MCB1c2Vjcw0KWyAgICAzLjkxOTM3N10gY2FsbGluZyAgaW5pdF9yY19tYXBfdGVycmF0ZWNf
Y2luZXJneV94cysweDAvMHgxMiBAIDENClsgICAgMy45MTkzNzldIGluaXRjYWxsIGluaXRf
cmNfbWFwX3RlcnJhdGVjX2NpbmVyZ3lfeHMrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAw
IHVzZWNzDQpbICAgIDMuOTE5MzgxXSBjYWxsaW5nICBpbml0X3JjX21hcF90ZXJyYXRlY19z
bGltKzB4MC8weDEyIEAgMQ0KWyAgICAzLjkxOTM4M10gaW5pdGNhbGwgaW5pdF9yY19tYXBf
dGVycmF0ZWNfc2xpbSsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAg
My45MTkzODVdIGNhbGxpbmcgIGluaXRfcmNfbWFwX3RlcnJhdGVjX3NsaW1fMisweDAvMHgx
MiBAIDENClsgICAgMy45MTkzODddIGluaXRjYWxsIGluaXRfcmNfbWFwX3RlcnJhdGVjX3Ns
aW1fMisweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkzODhd
IGNhbGxpbmcgIGluaXRfcmNfbWFwX3RldmlpX25lYysweDAvMHgxMiBAIDENClsgICAgMy45
MTkzOTBdIGluaXRjYWxsIGluaXRfcmNfbWFwX3RldmlpX25lYysweDAvMHgxMiByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTkzOTJdIGNhbGxpbmcgIGluaXRfcmNfbWFw
X3Rpdm8rMHgwLzB4MTIgQCAxDQpbICAgIDMuOTE5MzkzXSBpbml0Y2FsbCBpbml0X3JjX21h
cF90aXZvKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTM5
NV0gY2FsbGluZyAgaW5pdF9yY19tYXBfdG90YWxfbWVkaWFfaW5faGFuZCsweDAvMHgxMiBA
IDENClsgICAgMy45MTkzOTddIGluaXRjYWxsIGluaXRfcmNfbWFwX3RvdGFsX21lZGlhX2lu
X2hhbmQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5Mzk5
XSBjYWxsaW5nICBpbml0X3JjX21hcF90cmVrc3RvcisweDAvMHgxMiBAIDENClsgICAgMy45
MTk0MDFdIGluaXRjYWxsIGluaXRfcmNfbWFwX3RyZWtzdG9yKzB4MC8weDEyIHJldHVybmVk
IDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTQwMl0gY2FsbGluZyAgaW5pdF9yY19tYXBf
dHRfMTUwMCsweDAvMHgxMiBAIDENClsgICAgMy45MTk0MDRdIGluaXRjYWxsIGluaXRfcmNf
bWFwX3R0XzE1MDArMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMu
OTE5NDA2XSBjYWxsaW5nICBpbml0X3JjX21hcF90d2luaGFuX3ZwMTAyNysweDAvMHgxMiBA
IDENClsgICAgMy45MTk0MDhdIGluaXRjYWxsIGluaXRfcmNfbWFwX3R3aW5oYW5fdnAxMDI3
KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTQxMF0gY2Fs
bGluZyAgaW5pdF9yY19tYXBfdmlkZW9tYXRlX20xZisweDAvMHgxMiBAIDENClsgICAgMy45
MTk0MTFdIGluaXRjYWxsIGluaXRfcmNfbWFwX3ZpZGVvbWF0ZV9tMWYrMHgwLzB4MTIgcmV0
dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5NDEzXSBjYWxsaW5nICBpbml0X3Jj
X21hcF92aWRlb21hdGVfczM1MCsweDAvMHgxMiBAIDENClsgICAgMy45MTk0MTVdIGluaXRj
YWxsIGluaXRfcmNfbWFwX3ZpZGVvbWF0ZV9zMzUwKzB4MC8weDEyIHJldHVybmVkIDAgYWZ0
ZXIgMCB1c2Vjcw0KWyAgICAzLjkxOTQxN10gY2FsbGluZyAgaW5pdF9yY19tYXBfdmlkZW9t
YXRlX3R2X3B2cisweDAvMHgxMiBAIDENClsgICAgMy45MTk0MTldIGluaXRjYWxsIGluaXRf
cmNfbWFwX3ZpZGVvbWF0ZV90dl9wdnIrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVz
ZWNzDQpbICAgIDMuOTE5NDIxXSBjYWxsaW5nICBpbml0X3JjX21hcF93aW5mYXN0KzB4MC8w
eDEyIEAgMQ0KWyAgICAzLjkxOTQyMl0gaW5pdGNhbGwgaW5pdF9yY19tYXBfd2luZmFzdCsw
eDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45MTk0MjRdIGNhbGxp
bmcgIGluaXRfcmNfbWFwX3dpbmZhc3RfdXNiaWlfZGVsdXhlKzB4MC8weDEyIEAgMQ0KWyAg
ICAzLjkxOTQyNl0gaW5pdGNhbGwgaW5pdF9yY19tYXBfd2luZmFzdF91c2JpaV9kZWx1eGUr
MHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTE5NDI4XSBjYWxs
aW5nICByY19jb3JlX2luaXQrMHgwLzB4NDkgQCAxDQpbICAgIDMuOTIwNzE3XSBpbml0Y2Fs
bCByY19jb3JlX2luaXQrMHgwLzB4NDkgcmV0dXJuZWQgMCBhZnRlciAxMjUwIHVzZWNzDQpb
ICAgIDMuOTIwNzIwXSBjYWxsaW5nICBsaXJjX2Rldl9pbml0KzB4MC8weDk4IEAgMQ0KWyAg
ICAzLjkyMjAwMV0gbGlyY19kZXY6IElSIFJlbW90ZSBDb250cm9sIGRyaXZlciByZWdpc3Rl
cmVkLCBtYWpvciAyNTEgDQpbICAgIDMuOTIyMDA4XSBpbml0Y2FsbCBsaXJjX2Rldl9pbml0
KzB4MC8weDk4IHJldHVybmVkIDAgYWZ0ZXIgMTI1MyB1c2Vjcw0KWyAgICAzLjkyMjAxMV0g
Y2FsbGluZyAgaXJfbmVjX2RlY29kZV9pbml0KzB4MC8weDIyIEAgMQ0KWyAgICAzLjkyMjAx
Ml0gSVIgTkVDIHByb3RvY29sIGhhbmRsZXIgaW5pdGlhbGl6ZWQNClsgICAgMy45MjIwMTRd
IGluaXRjYWxsIGlyX25lY19kZWNvZGVfaW5pdCsweDAvMHgyMiByZXR1cm5lZCAwIGFmdGVy
IDEgdXNlY3MNClsgICAgMy45MjIwMTZdIGNhbGxpbmcgIGlyX3JjNV9kZWNvZGVfaW5pdCsw
eDAvMHgyMiBAIDENClsgICAgMy45MjIwMThdIElSIFJDNSh4KSBwcm90b2NvbCBoYW5kbGVy
IGluaXRpYWxpemVkDQpbICAgIDMuOTIyMDE5XSBpbml0Y2FsbCBpcl9yYzVfZGVjb2RlX2lu
aXQrMHgwLzB4MjIgcmV0dXJuZWQgMCBhZnRlciAxIHVzZWNzDQpbICAgIDMuOTIyMDIxXSBj
YWxsaW5nICBpcl9yYzZfZGVjb2RlX2luaXQrMHgwLzB4MjIgQCAxDQpbICAgIDMuOTIyMDIz
XSBJUiBSQzYgcHJvdG9jb2wgaGFuZGxlciBpbml0aWFsaXplZA0KWyAgICAzLjkyMjAyNF0g
aW5pdGNhbGwgaXJfcmM2X2RlY29kZV9pbml0KzB4MC8weDIyIHJldHVybmVkIDAgYWZ0ZXIg
MSB1c2Vjcw0KWyAgICAzLjkyMjAyNl0gY2FsbGluZyAgaXJfanZjX2RlY29kZV9pbml0KzB4
MC8weDIyIEAgMQ0KWyAgICAzLjkyMjAyN10gSVIgSlZDIHByb3RvY29sIGhhbmRsZXIgaW5p
dGlhbGl6ZWQNClsgICAgMy45MjIwMjldIGluaXRjYWxsIGlyX2p2Y19kZWNvZGVfaW5pdCsw
eDAvMHgyMiByZXR1cm5lZCAwIGFmdGVyIDEgdXNlY3MNClsgICAgMy45MjIwMzFdIGNhbGxp
bmcgIGlyX3NvbnlfZGVjb2RlX2luaXQrMHgwLzB4MjIgQCAxDQpbICAgIDMuOTIyMDMyXSBJ
UiBTb255IHByb3RvY29sIGhhbmRsZXIgaW5pdGlhbGl6ZWQNClsgICAgMy45MjIwMzRdIGlu
aXRjYWxsIGlyX3NvbnlfZGVjb2RlX2luaXQrMHgwLzB4MjIgcmV0dXJuZWQgMCBhZnRlciAx
IHVzZWNzDQpbICAgIDMuOTIyMDM2XSBjYWxsaW5nICBpcl9yYzVfc3pfZGVjb2RlX2luaXQr
MHgwLzB4MjIgQCAxDQpbICAgIDMuOTIyMDM3XSBJUiBSQzUgKHN0cmVhbXphcCkgcHJvdG9j
b2wgaGFuZGxlciBpbml0aWFsaXplZA0KWyAgICAzLjkyMjAzOV0gaW5pdGNhbGwgaXJfcmM1
X3N6X2RlY29kZV9pbml0KzB4MC8weDIyIHJldHVybmVkIDAgYWZ0ZXIgMSB1c2Vjcw0KWyAg
ICAzLjkyMjA0MV0gY2FsbGluZyAgaXJfbWNlX2tiZF9kZWNvZGVfaW5pdCsweDAyMDQyXSBJ
UiBNQ0UgS2V5Ym9hcmQvbW91c2UgcHJvdG9jb2wgaGFuZGxlciBpbml0aWFsaXplZA0KWyAg
ICAzLjkyMjA0NF0gaW5pdGNhbGwgaXJfbWNlX2tiZF9kZWNvZGVfaW5pdCsweDAvMHgyMiBy
ZXR1cm5lZDMuOTIyMDQ2XSBjYWxsaW5nICBpcl9saXJjX2NvZGVjX2luaXQrMHgwLzB4MjIg
QCAxDQpbICBSIExJUkMgYnJpZGdlIGhhbmRsZXIgaW5pdGlhbGl6ZWQNClsgICAgMy45MjIw
NDldIF9pbml0KzB4MC8weDIyIHJldHVybmVkIDAgYWZ0ZXIgMSB1c2Vjcw0KWyAgICAzLjky
MjA3ZGV2X2luaXQrMHgwLzB4ODkgQCAxDQpbICAgIDMuOTIyMDc5XSBMaW51eCB2aWRlbyBj
YXB0dXJlIGludGVyZmFjZTogdjIuMDANClsgICAgMy45MjI4MTZdIGluaXRjYWxsIHZpZGVv
ZGV2X2luaXQrMHgwLzB4ODkgcmV0dXJuZWQgMCBhZnRlciA3MTMgdXNlY3MNClsgICAgMy45
MjI4MTldIGNhbGxpbmcgIGluaXRfdHVuZXIrMHgwLzB4MTQgQCAxDQpbICAgIDMuOTI0Nzcz
XSBpMmMtY29yZTogZHJpdmVyIFt0dW5lcl0gdXNpbmcgbGVnYWN5IHN1c3BlbmQgbWV0aG9k
DQpbICAgIDMuOTI0Nzc1XSBpMmMtY29yZTogZHJpdmVyIFt0dW5lcl0gdXNpbmcgbGVnYWN5
IHJlc3VtZSBtZXRob2QNClsgICAgMy45MjQ3ODJdIGluaXRjYWxsIGluaXRfdHVuZXIrMHgw
LzB4MTQgcmV0dXJuZWQgMCBhZnRlciAxOTExIHVzZWNzDQpbICAgIDMuOTI0Nzg0XSBjYWxs
aW5nICBpbml0X3NhYTcxMXgrMHgwLzB4MTQgQCAxDQpbICAgIDMuOTI1OTk0XSBpbml0Y2Fs
bCBpbml0X3NhYTcxMXgrMHgwLzB4MTQgcmV0dXJuZWQgMCBhZnRlciAxMTczIHVzZWNzDQpb
ICAgIDMuOTI1OTk4XSBjYWxsaW5nICBpbml0X3R2cDUxNTArMHgwLzB4MTQgQCAxDQpbICAg
IDMuOTI3MjQ5XSBpbml0Y2FsbCBpbml0X3R2cDUxNTArMHgwLzB4MTQgcmV0dXJuZWQgMCBh
ZnRlciAxMjEzIHVzZWNzDQpbICAgIDMuOTI3MjUzXSBjYWxsaW5nICBpbml0X21zcCsweDAv
MHgxNCBAIDENClsgICAgMy45Mjg1NTddIGkyYy1jb3JlOiBkcml2ZXIgW21zcDM0MDBdIHVz
aW5nIGxlZ2FjeSBzdXNwZW5kIG1ldGhvZA0KWyAgICAzLjkyODU2MF0gaTJjLWNvcmU6IGRy
aXZlciBbbXNwMzQwMF0gdXNpbmcgbGVnYWN5IHJlc3VtZSBtZXRob2QNClsgICAgMy45Mjg1
NjZdIGluaXRjYWxsIGluaXRfbXNwKzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIgMTI3OCB1
c2Vjcw0KWyAgICAzLjkyODU2OV0gY2FsbGluZyAgaW5pdF9jczUzbDMyYSsweDAvMHgxNCBA
IDENClsgICAgMy45Mjk4MDldIGluaXRjYWxsIGluaXRfY3M1M2wzMmErMHgwLzB4MTQgcmV0
dXJuZWQgMCBhZnRlciAxMjA0IHVzZWNzDQpbICAgIDMuOTI5ODEzXSBjYWxsaW5nICBpbml0
X3dtODc3NSsweDAvMHgxNCBAIDENClsgICAgMy45MzEwMzNdIGluaXRjYWxsIGluaXRfd204
Nzc1KzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIgMTE4MyB1c2Vjcw0KWyAgICAzLjkzMTAz
Nl0gY2FsbGluZyAgaW5pdF9jeDI1ODQwKzB4MC8weDE0IEAgMQ0KWyAgICAzLjkzMjc4MV0g
aW5pdGNhbGwgaW5pdF9jeDI1ODQwKzB4MC8weDE0IHJldHVybmVkIDAgYWZ0ZXIgMTY5NiB1
c2Vjcw0KWyAgICAzLjkzMjc4NF0gY2FsbGluZyAgaW5pdF9tdDl2MDExKzB4MC8weDE0IEAg
MQ0KWyAgICAzLjkzMzYzMl0gaW5pdGNhbGwgaW5pdF9tdDl2MDExKzB4MC8weDE0IHJldHVy
bmVkIDAgYWZ0ZXIgODE5IHVzZWNzDQpbICAgIDMuOTMzNjM1XSBjYWxsaW5nICBlbTI4eHhf
bW9kdWxlX2luaXQrMHgwLzB4NDggQCAxDQpbICAgIDMuOTM0ODg1XSB1c2Jjb3JlOiByZWdp
c3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIGVtMjh4eA0KWyAgICAzLjkzNDg4OF0gZW0y
OHh4IGRyaXZlciBsb2FkZWQNClsgICAgMy45MzQ4OTNdIGluaXRjYWxsIGVtMjh4eF9tb2R1
bGVfaW5pdCsweDAvMHg0OCByZXR1cm5lZCAwIGFmdGVyIDEyMjMgdXNlY3MNClsgICAgMy45
MzQ4OTZdIGNhbGxpbmcgIGVtMjh4eF9hbHNhX3JlZ2lzdGVyKzB4MC8weDEyIEAgMQ0KWyAg
ICAzLjkzNDg5OF0gRW0yOHh4OiBJbml0aWFsaXplZCAoRW0yOHh4IEF1ZGlvIEV4dGVuc2lv
bikgZXh0ZW5zaW9uDQpbICAgIDMuOTM0OTAwXSBpbml0Y2FsbCBlbTI4eHhfYWxzYV9yZWdp
c3RlcisweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDEgdXNlY3MNClsgICAgMy45MzQ5MDFd
IGNhbGxpbmcgIGN4MjMxeHhfbW9kdWxlX2luaXQrMHgwLzB4NDggQCAxDQpbICAgIDMuOTM0
OTAzXSBjeDIzMXh4IHY0bDIgZHJpdmVyIGxvYWRlZC4NClsgICAgMy45MzYxNjldIHVzYmNv
cmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgY3gyMzF4eA0KWyAgICAzLjkz
NjE3N10gaW5pdGNhbGwgY3gyMzF4eF9tb2R1bGVfaW5pdCsweDAvMHg0OCByZXR1cm5lZCAw
IGFmdGVyIDEyMzkgdXNlY3MNClsgICAgMy45MzYxNzldIGNhbGxpbmcgIHVzYnZpc2lvbl9p
bml0KzB4MC8weDEwNSBAIDENClsgICAgMy45Mzg2MDNdIHVzYmNvcmU6IHJlZ2lzdGVyZWQg
bmV3IGludGVyZmFjZSBkcml2ZXIgdXNidmlzaW9uDQpbICAgIDMuOTM4NjA3XSBVU0JWaXNp
b24gVVNCIFZpZGVvIERldmljZSBEcml2ZXIgZm9yIExpbnV4IDogMC45LjExDQpbICAgIDMu
OTM4NjEyXSBpbml0Y2FsbCB1c2J2aXNpb25faW5pdCsweDAvMHgxMDUgcmV0dXJuZWQgMCBh
ZnRlciAyMzcxIHVzZWNzDQpbICAgIDMuOTM4NjE1XSBjYWxsaW5nICBwdnJfaW5pdCsweDAv
MHhiMiBAIDENClsgICAgMy45NDM2MTNdIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVy
ZmFjZSBkcml2ZXIgcHZydXNiMg0KWyAgICAzLjk0MzYxN10gcHZydXNiMjogVjRMIGluLXRy
ZWUgdmVyc2lvbjpIYXVwcGF1Z2UgV2luVFYtUFZSLVVTQjIgTVBFRzIgRW5jb2Rlci9UdW5l
cg0KWyAgICAzLjk0MzYxOF0gcHZydXNiMjogRGVidWcgbWFzayBpcyAzMSAoMHgxZikNClsg
ICAgMy45NDM2MjNdIGluaXRjYWxsIHB2cl9pbml0KzB4MC8weGIyIHJldHVybmVkIDAgYWZ0
ZXIgNDg4NiB1c2Vjcw0KWyAgICAzLjk0MzYyNl0gY2FsbGluZyAgenIzNjR4eF9pbml0KzB4
MC8weDQ5IEAgMQ0KWyAgICAzLjk0NDg1M10gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50
ZXJmYWNlIGRyaXZlciB6cjM2NHh4DQpbICAgIDMuOTQ0ODU3XSB6cjM2NHh4OiBab3JhbiAz
NjR4eA0KWyAgICAzLjk0NDg2M10gaW5pdGNhbGwgenIzNjR4eF9pbml0KzB4MC8weDQ5IHJl
dHVybmVkIDAgYWZ0ZXIgMTIwMiB1c2Vjcw0KWyAgICAzLjk0NDg2NV0gY2FsbGluZyAgc3Rr
X2NhbWVyYV9pbml0KzB4MC8weDNhIEAgMQ0KWyAgICAzLjk0NjMxN10gdXNiY29yZTogcmVn
aXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBzdGt3ZWJjYW0NClsgICAgMy45NDYzMjVd
IGluaXRjYWxsIHN0a19jYW1lcmFfaW5pdCsweDAvMHgzYSByZXR1cm5lZCAwIGFmdGVyIDE0
MTkgdXNlY3MNClsgICAgMy45NDYzMjddIGNhbGxpbmcgIHNuOWMxMDJfbW9kdWxlX2luaXQr
MHgwLzB4NWIgQCAxDQpbICAgIDMuOTQ2MzI5XSBzbjljMTAyOiBWNEwyIGRyaXZlciBmb3Ig
U045QzF4eCBQQyBDYW1lcmEgQ29udHJvbGxlcnMgdjE6MS40OA0KWyAgICAzLjk0ODYwOF0g
dXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBzbjljMTAyDQpbICAg
IDMuOTQ4NjE2XSBpbml0Y2FsbCBzbjljMTAyX21vZHVsZV9pbml0KzB4MC8weDViIHJldHVy
bmVkIDAgYWZ0ZXIgMjIyOSB1c2Vjcw0KWyAgICAzLjk0ODYxOF0gY2FsbGluZyAgZXQ2MXgy
NTFfbW9kdWxlX2luaXQrMHgwLzB4NWEgQCAxDQpbICAgIDMuOTQ4NjIwXSBldDYxeDI1MTog
VjRMMiBkcml2ZXIgZm9yIEVUNjFYWzEyXTUxIFBDIENhbWVyYSBDb250cm9sbGVycyB2MS4x
LjEwDQpbICAgIDMuOTUxMDM0XSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2Ug
ZHJpdmVyIGV0NjF4MjUxDQpbICAgIDMuOTUxMDQxXSBpbml0Y2FsbCBldDYxeDI1MV9tb2R1
bGVfaW5pdCsweDAvMHg1YSByZXR1cm5lZCAwIGFmdGVyIDIzNjAgdXNlY3MNClsgICAgMy45
NTEwNDRdIGNhbGxpbmcgIHVzYl9wd2NfaW5pdCsweDAvMHgyMGEgQCAxDQpbICAgIDMuOTUz
MTgyXSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyIFBoaWxpcHMg
d2ViY2FtDQpbICAgIDMuOTUzMTg5XSBpbml0Y2FsbCB1c2JfcHdjX2luaXQrMHgwLzB4MjBh
IHJldHVybmVkIDAgYWZ0ZXIgMjA5MCB1c2Vjcw0KWyAgICAzLjk1MzE5Ml0gY2FsbGluZyAg
Z3NwY2FfaW5pdCsweDAvMHgxNiBAIDENClsgICAgMy45NTMxOTNdIGdzcGNhOiB2Mi4xMy4w
IHJlZ2lzdGVyZWQNClsgICAgMy45NTMxOTVdIGluaXRjYWxsIGdzcGNhX2luaXQrMHgwLzB4
MTYgcmV0dXJuZWQgMCBhZnRlciAxIHVzZWNzDQpbICAgIDMuOTUzMTk2XSBjYWxsaW5nICBo
ZHB2cl9pbml0KzB4MC8weDNhIEAgMQ0KWyAgICAzLjk1NDYwMV0gdXNiY29yZTogcmVnaXN0
ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBoZHB2cg0KWyAgICAzLjk1NDYwOV0gaW5pdGNh
bGwgaGRwdnJfaW5pdCsweDAvMHgzYSByZXR1cm5lZCAwIGFmdGVyIDEzNzMgdXNlY3MNClsg
ICAgMy45NTQ2MTFdIGNhbGxpbmcgIHVzYl9zMjI1NV9pbml0KzB4MC8weDU4IEAgMQ0KWyAg
ICAzLjk1NjQ3OF0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBz
MjI1NQ0KWyAgICAzLjk1NjQ4NV0gaW5pdGNhbGwgdXNiX3MyMjU1X2luaXQrMHgwLzB4NTgg
cmV0dXJuZWQgMCBhZnRlciAxODI1IHVzZWNzDQpbICAgIDMuOTU2NDg4XSBjYWxsaW5nICBp
cl9pbml0KzB4MC8weDE0IEAgMQ0KWyAgICAzLjk1Nzc1MF0gaW5pdGNhbGwgaXJfaW5pdCsw
eDAvMHgxNCByZXR1cm5lZCAwIGFmdGVyIDEyMjUgdXNlY3MNClsgICAgMy45NTc3NTNdIGNh
bGxpbmcgIGY3MTg4MmZnX2luaXQrMHgwLzB4MTVhIEAgMQ0KWyAgICAzLjk1NzgzMl0gZjcx
ODgyZmc6IEZvdW5kIGY3MTg4OWVkIGNoaXAgYXQgMHg2MDAsIHJldmlzaW9uIDE2DQpbICAg
IDMuOTYxNzUzXSBmNzE4ODJmZyBmNzE4ODJmZy4xNTM2OiBGYW46IDEgaXMgaW4gZHV0eS1j
eWNsZSBtb2RlDQpbICAgIDMuOTYxNzU2XSBmNzE4ODJmZyBmNzE4ODJmZy4xNTM2OiBGYW46
IDIgaXMgaW4gZHV0eS1jeWNsZSBtb2RlDQpbICAgIDMuOTYxNzU3XSBmNzE4ODJmZyBmNzE4
ODJmZy4xNTM2OiBGYW46IDMgaXMgaW4gZHV0eS1jeWNsZSBtb2RlDQpbICAgIDMuOTYzNTg2
XSBpbml0Y2FsbCBmNzE4ODJmZ19pbml0KzB4MC8weDE1YSByZXR1cm5lZCAwIGFmdGVyIDU2
ODcgdXNlY3MNClsgICAgMy45NjM1OTBdIGNhbGxpbmcgIGZhbTE1aF9wb3dlcl9pbml0KzB4
MC8weDFiIEAgMQ0KWyAgICAzLjk2NTc3OV0gaW5pdGNhbGwgZmFtMTVoX3Bvd2VyX2luaXQr
MHgwLzB4MWIgcmV0dXJuZWQgMCBhZnRlciAyMTMwIHVzZWNzDQpbICAgIDMuOTY1NzgyXSBj
YWxsaW5nICBrOHRlbXBfaW5pdCsweDAvMHgxYiBAIDENClsgICAgMy45NjY0ODJdIGluaXRj
YWxsIGs4dGVtcF9pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIgNjc1IHVzZWNzDQpb
ICAgIDMuOTY2NDg2XSBjYWxsaW5nICBrMTB0ZW1wX2luaXQrMHgwLzB4MWIgQCAxDQpbICAg
IDMuOTY5MjUzXSBpbml0Y2FsbCBrMTB0ZW1wX2luaXQrMHgwLzB4MWIgcmV0dXJuZWQgMCBh
ZnRlciAyNjkzIHVzZWNzDQpbICAgIDMuOTY5MjU2XSBjYWxsaW5nICBmNzE4MDhlX2luaXQr
MHgwLzB4NDU2IEAgMQ0KWyAgICAzLjk2OTMwN10gZjcxODA4ZV93ZHQ6IFVucmVjb2duaXpl
ZCBGaW50ZWsgZGV2aWNlOiAwOTA5DQpbICAgIDMuOTY5MzEzXSBpbml0Y2FsbCBmNzE4MDhl
X2luaXQrMHgwLzB4NDU2IHJldHVybmVkIC0xOSBhZnRlciA1MiB1c2Vjcw0KWyAgICAzLjk2
OTMxNV0gY2FsbGluZyAgc3A1MTAwX3Rjb19pbml0X21vZHVsZSsweDAvMHg5ZCBAIDENClsg
ICAgMy45NjkzMTddIFNQNTEwMCBUQ08gdGltZXI6IFNQNTEwMCBUQ08gV2F0Y2hEb2cgVGlt
ZXIgRHJpdmVyIHYwLjAxDQpbICAgIDMuOTcyMDAwXSBTUDUxMDAgVENPIHRpbWVyOiBtbWlv
IGFkZHJlc3MgMHhiOGZlMDAgYWxyZWFkeSBpbiB1c2UNClsgICAgMy45NzIwMTNdIGluaXRj
YWxsIHNwNTEwMF90Y29faW5pdF9tb2R1bGUrMHgwLzB4OWQgcmV0dXJuZWQgMCBhZnRlciAy
NjI4IHVzZWNzDQpbICAgIDMuOTcyMDE2XSBjYWxsaW5nICB4ZW5fd2R0X2luaXRfbW9kdWxl
KzB4MC8weGFmIEAgMQ0KWyAgICAzLjk3MjAxN10gd2R0OiBYZW4gV2F0Y2hEb2cgVGltZXIg
RHJpdmVyIHYwLjAxDQpbICAgIDMuOTc1NjI4XSB3ZHQ6IGluaXRpYWxpemVkICh0aW1lb3V0
PTYwcywgbm93YXlvdXQ9MCkNClsgICAgMy45NzU2MzhdIGluaXRjYWxsIHhlbl93ZHRfaW5p
dF9tb2R1bGUrMHgwLzB4YWYgcmV0dXJuZWQgMCBhZnRlciAzNTMxIHVzZWNzDQpbICAgIDMu
OTc1NjQxXSBjYWxsaW5nICBkbV9pbml0KzB4MC8weDQ4IEAgMQ0KWyAgICAzLjk4MDE1MV0g
ZGV2aWNlLW1hcHBlcjogaW9jdGw6IDQuMjEuMC1pb2N0bCAoMjAxMS0wNy0wNikgaW5pdGlh
bGlzZWQ6IGRtLWRldmVsQHJlZGhhdC5jb20NClsgICAgMy45ODAxNTldIGluaXRjYWxsIGRt
X2luaXQrMHgwLzB4NDggcmV0dXJuZWQgMCBhZnRlciA0NDA2IHVzZWNzDQpbICAgIDMuOTgw
MTYyXSBjYWxsaW5nICBkbV9jcnlwdF9pbml0KzB4MC8weDY5IEAgMQ0KWyAgICAzLjk4MTc2
NF0gaW5pdGNhbGwgZG1fY3J5cHRfaW5pdCsweDAvMHg2OSByZXR1cm5lZCAwIGFmdGVyIDE1
NTcgdXNlY3MNClsgICAgMy45ODE3NjddIGNhbGxpbmcgIGRtX3NuYXBzaG90X2luaXQrMHgw
LzB4MjExIEAgMQ0KWyAgICAzLjk4MzEwN10gaW5pdGNhbGwgZG1fc25hcHNob3RfaW5pdCsw
eDAvMHgyMTEgcmV0dXJuZWQgMCBhZnRlciAxMjk5IHVzZWNzDQpbICAgIDMuOTgzMTExXSBj
YWxsaW5nICBkbV9taXJyb3JfaW5pdCsweDAvMHg3OSBAIDENClsgICAgMy45ODQ3NTldIGlu
aXRjYWxsIGRtX21pcnJvcl9pbml0KzB4MC8weDc5IHJldHVybmVkIDAgYWZ0ZXIgMTU5OSB1
c2Vjcw0KWyAgICAzLjk4NDc2M10gY2FsbGluZyAgZG1fZGlydHlfbG9nX2luaXQrMHgwLzB4
NTkgQCAxDQpbICAgIDMuOTg0NzY1XSBpbml0Y2FsbCBkbV9kaXJ0eV9sb2dfaW5pdCsweDAv
MHg1OSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45ODQ3NjddIGNhbGxpbmcg
IGRtX3plcm9faW5pdCsweDAvMHgzMSBAIDENClsgICAgMy45ODQ3NjldIGluaXRjYWxsIGRt
X3plcm9faW5pdCsweDAvMHgzMSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgMy45
ODQ3NzFdIGNhbGxpbmcgIGNwdWZyZXFfZ292X2Ric19pbml0KzB4MC8weDVmIEAgMQ0KWyAg
ICAzLjk4NDc3NV0gaW5pdGNhbGwgY3B1ZnJlcV9nb3ZfZGJzX2luaXQrMHgwLzB4NWYgcmV0
dXJuZWQgMCBhZnRlciAxIHVzZWNzDQpbICAgIDMuOTg0Nzc3XSBjYWxsaW5nICBpbml0X2xh
ZGRlcisweDAvMHgxMiBAIDENClsgICAgMy45ODQ3ODBdIGluaXRjYWxsIGluaXRfbGFkZGVy
KzB4MC8weDEyIHJldHVybmVkIC0xOSBhZnRlciAwIHVzZWNzDQpbICAgIDMuOTg0NzgyXSBj
YWxsaW5nICBpbml0X21lbnUrMHgwLzB4MTIgQCAxDQpbICAgIDMuOTg0Nzg0XSBpbml0Y2Fs
bCBpbml0X21lbnUrMHgwLzB4MTIgcmV0dXJuZWQgLTE5IGFmdGVyIDAgdXNlY3MNClsgICAg
My45ODQ3ODZdIGNhbGxpbmcgIGVmaXZhcnNfaW5pdCsweDAvMHhmNyBAIDENClsgICAgMy45
ODQ3ODddIEVGSSBWYXJpYWJsZXMgRmFjaWxpdHkgdjAuMDggMjAwNC1NYXktMTcNClsgICAg
My45ODQ3OTBdIGluaXRjYWxsIGVmaXZhcnNfaW5pdCsweDAvMHhmNyByZXR1cm5lZCAwIGFm
dGVyIDIgdXNlY3MNClsgICAgMy45ODQ3OTJdIGNhbGxpbmcgIGhpZF9pbml0KzB4MC8weDY2
IEAgMQ0KWyAgICAzLjk4NjgwOF0gaW5pdGNhbGwgaGlkX2luaXQrMHgwLzB4NjYgcmV0dXJu
ZWQgMCBhZnRlciAxOTYxIHVzZWNzDQpbICAgIDMuOTg2ODEyXSBjYWxsaW5nICBhNF9pbml0
KzB4MC8weDFiIEAgMQ0KWyAgICAzLjk4ODA2Nl0gaW5pdGNhbGwgYTRfaW5pdCsweDAvMHgx
YiByZXR1cm5lZCAwIGFmdGVyIDEyMDcgdXNlY3MNClsgICAgMy45ODgwNzBdIGNhbGxpbmcg
IGFwcGxlX2luaXQrMHgwLzB4MzkgQCAxDQpbICAgIDMuOTg5NDAyXSBpbml0Y2FsbCBhcHBs
ZV9pbml0KzB4MC8weDM5IHJldHVybmVkIDAgYWZ0ZXIgMTI5MiB1c2Vjcw0KWyAgICAzLjk4
OTQwNV0gY2FsbGluZyAgYmVsa2luX2luaXQrMHgwLzB4MWIgQCAxDQpbICAgIDMuOTkwNzIw
XSBpbml0Y2FsbCBiZWxraW5faW5pdCsweDAvMHgxYiByZXR1cm5lZCAwIGFmdGVyIDEyNzUg
dXNlY3MNClsgICAgMy45OTA3MjNdIGNhbGxpbmcgIGNoX2luaXQrMHgwLzB4MWIgQCAxDQpb
ICAgIDMuOTkxOTk4XSBpbml0Y2FsbCBjaF9pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0
ZXIgMTE5OSB1c2Vjcw0KWyAgICAzLjk5MjAwMV0gY2FsbGluZyAgY2hfaW5pdCsweDAvMHgx
YiBAIDENClsgICAgMy45OTM0MTNdIGluaXRjYWxsIGNoX2luaXQrMHgwLzB4MWIgcmV0dXJu
ZWQgMCBhZnRlciAxMzU3IHVzZWNzDQpbICAgIDMuOTkzNDE3XSBjYWxsaW5nICBjcF9pbml0
KzB4MC8weDFiIEAgMQ0KWyAgICAzLjk5NDY4MV0gaW5pdGNhbGwgY3BfaW5pdCsweDAvMHgx
YiByZXR1cm5lZCAwIGFmdGVyIDEyMjYgdXNlY3MNClsgICAgMy45OTQ2ODRdIGNhbGxpbmcg
IGV6X2luaXQrMHgwLzB4MWIgQCAxDQpbICAgIDMuOTk2MTAwXSBpbml0Y2FsbCBlel9pbml0
KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIgMTM3MSB1c2Vjcw0KWyAgICAzLjk5NjEwNF0g
Y2FsbGluZyAgZ3lyYXRpb25faW5pdCsweDAvMHgxYiBAIDENClsgICAgMy45OTgyOTddIGlu
aXRjYWxsIGd5cmF0aW9uX2luaXQrMHgwLzB4MWIgcmV0dXJuZWQgMCBhZnRlciAyMTMyIHVz
ZWNzDQpbICAgIDMuOTk4MzAwXSBjYWxsaW5nICBrc19pbml0KzB4MC8weDFiIEAgMQ0KWyAg
ICAzLjk5OTYyNl0gaW5pdGNhbGwga3NfaW5pdCsweDAvMHgxYiByZXR1cm5lZCAwIGFmdGVy
IDEyODcgdXNlY3MNClsgICAgMy45OTk2MjldIGNhbGxpbmcgIGt5ZV9pbml0KzB4MC8weDFi
IEAgMQ0KWyAgICA0LjAwMDg2N10gaW5pdGNhbGwga3llX2luaXQrMHgwLzB4MWIgcmV0dXJu
ZWQgMCBhZnRlciAxMjAwIHVzZWNzDQpbICAgIDQuMDAwODcwXSBjYWxsaW5nICBsZ19pbml0
KzB4MC8weDFiIEAgMQ0KWyAgICA0LjAwMTY3N10gaW5pdGNhbGwgbGdfaW5pdCsweDAvMHgx
YiByZXR1cm5lZCAwIGFmdGVyIDc3OCB1c2Vjcw0KWyAgICA0LjAwMTY4MF0gY2FsbGluZyAg
bXNfaW5pdCsweDAvMHgxYiBAIDENClsgICAgNC4wMDI5MjddIGluaXRjYWxsIG1zX2luaXQr
MHgwLzB4MWIgcmV0dXJuZWQgMCBhZnRlciAxMjEwIHVzZWNzDQpbICAgIDQuMDAyOTMxXSBj
YWxsaW5nICBtcl9pbml0KzB4MC8weDFiIEAgMQ0KWyAgICA0LjAwNDE5Nl0gaW5pdGNhbGwg
bXJfaW5pdCsweDAvMHgxYiByZXR1cm5lZCAwIGFmdGVyIDEyMjcgdXNlY3MNClsgICAgNC4w
MDQyMDBdIGNhbGxpbmcgIG50cmlnX2luaXQrMHgwLzB4MWIgQCAxDQpbICAgIDQuMDA2NTk3
XSBpbml0Y2FsbCBudHJpZ19pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIgMjMzMiB1
c2Vjcw0KWyAgICA0LjAwNjYwMF0gY2FsbGluZyAgcGxfaW5pdCsweDAvMHgxYiBAIDENClsg
ICAgNC4wMDg5OTFdIGluaXRjYWxsIHBsX2luaXQrMHgwLzB4MWIgcmV0dXJuZWQgMCBhZnRl
ciAyMzI3IHVzZWNzDQpbICAgIDQuMDA4OTk1XSBjYWxsaW5nICBwbF9pbml0KzB4MC8weDFi
IEAgMQ0KWyAgICA0LjAxMDI4Ml0gaW5pdGNhbGwgcGxfaW5pdCsweDAvMHgxYiByZXR1cm5l
ZCAwIGFmdGVyIDEyNDggdXNlY3MNClsgICAgNC4wMTAyODVdIGNhbGxpbmcgIHNhbXN1bmdf
aW5pdCsweDAvMHgxYiBAIDENClsgICAgNC4wMTE1NzJdIGluaXRjYWxsIHNhbXN1bmdfaW5p
dCsweDAvMHgxYiByZXR1cm5lZCAwIGFmdGVyIDEyNDkgdXNlY3MNClsgICAgNC4wMTE1NzZd
IGNhbGxpbmcgIHNvbnlfaW5pdCsweDAvMHgxYiBAIDENClsgICAgNC4wMTI4NzFdIGluaXRj
YWxsIHNvbnlfaW5pdCsweDAvMHgxYiByZXR1cm5lZCAwIGFmdGVyIDEyNTQgdXNlY3MNClsg
ICAgNC4wMTI4NzRdIGNhbGxpbmcgIHNwX2luaXQrMHgwLzB4MWIgQCAxDQpbICAgIDQuMDE0
MTg4XSBpbml0Y2FsbCBzcF9pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIgMTI3MyB1
c2Vjcw0KWyAgICA0LjAxNDE5MV0gY2FsbGluZyAgdHNfaW5pdCsweDAvMHgxYiBAIDENClsg
ICAgNC4wMTY1OTFdIGluaXRjYWxsIHRzX2luaXQrMHgwLzB4MWIgcmV0dXJuZWQgMCBhZnRl
ciAyMzM1IHVzZWNzDQpbICAgIDQuMDE2NTk0XSBjYWxsaW5nICBoaWRfaW5pdCsweDAvMHg3
OCBAIDENClsgICAgNC4wMjAzNjldIHVzYmNvcmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFj
ZSBkcml2ZXIgdXNiaGlkDQpbICAgIDQuMDIwMzczXSB1c2JoaWQ6IFVTQiBISUQgY29yZSBk
cml2ZXINClsgICAgNC4wMjAzNzddIGluaXRjYWxsIGhpZF9pbml0KzB4MC8weDc4IHJldHVy
bmVkIDAgYWZ0ZXIgMzY5MCB1c2Vjcw0KWyAgICA0LjAyMDM4MF0gY2FsbGluZyAgc3RhZ2lu
Z19pbml0KzB4MC8weDggQCAxDQpbICAgIDQuMDIwMzgyXSBpbml0Y2FsbCBzdGFnaW5nX2lu
aXQrMHgwLzB4OCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wMjAzODRdIGNh
bGxpbmcgIGVhc3ljYXBfbW9kdWxlX2luaXQrMHgwLzB4YzIgQCAxDQpbICAgIDQuMDIwMzg2
XSBFYXN5Y2FwIHZlcnNpb246IDAuOS4wMQ0KWyAgICA0LjAyMTcwOV0gdXNiY29yZTogcmVn
aXN0ZXJlZCBuZXcgaW50ZXJmYWNlIGRyaXZlciBlYXN5Y2FwDQpbICAgIDQuMDIxNzE3XSBp
bml0Y2FsbCBlYXN5Y2FwX21vZHVsZV9pbml0KzB4MC8weGMyIHJldHVybmVkIDAgYWZ0ZXIg
MTI5NSB1c2Vjcw0KWyAgICA0LjAyMTcxOV0gY2FsbGluZyAgZWVlcGNfbGFwdG9wX2luaXQr
MHgwLzB4NTggQCAxDQpbICAgIDQuMDI3MTc4XSBpbml0Y2FsbCBlZWVwY19sYXB0b3BfaW5p
dCsweDAvMHg1OCByZXR1cm5lZCAtMTkgYWZ0ZXIgNTMxNCB1c2Vjcw0KWyAgICA0LjAyNzE5
MF0gY2FsbGluZyAgYWxzYV9od2RlcF9pbml0KzB4MC8weDY0IEAgMQ0KWyAgICA0LjAyNzIx
Nl0gaW5pdGNhbGwgYWxzYV9od2RlcF9pbml0KzB4MC8weDY0IHJldHVybmVkIDAgYWZ0ZXIg
MTYgdXNlY3MNClsgICAgNC4wMjcyMjVdIGNhbGxpbmcgIGFsc2FfdGltZXJfaW5pdCsweDAv
MHgxNmYgQCAxDQpbICAgIDQuMDI4ODExXSBpbml0Y2FsbCBhbHNhX3RpbWVyX2luaXQrMHgw
LzB4MTZmIHJldHVybmVkIDAgYWZ0ZXIgMTUzOCB1c2Vjcw0KWyAgICA0LjAyODgxNF0gY2Fs
bGluZyAgc25kX2hydGltZXJfaW5pdCsweDAvMHhmOSBAIDENClsgICAgNC4wMjg4MThdIGlu
aXRjYWxsIHNuZF9ocnRpbWVyX2luaXQrMHgwLzB4ZjkgcmV0dXJuZWQgMCBhZnRlciAxIHVz
ZWNzDQpbICAgIDQuMDI4ODIwXSBjYWxsaW5nICBhbHNhX3BjbV9pbml0KzB4MC8weDZjIEAg
MQ0KWyAgICA0LjAyODgzMl0gaW5pdGNhbGwgYWxzYV9wY21faW5pdCsweDAvMHg2YyByZXR1
cm5lZCAwIGFmdGVyIDkgdXNlY3MNClsgICAgNC4wMjg4MzRdIGNhbGxpbmcgIHNuZF9tZW1f
aW5pdCsweDAvMHgyYyBAIDENClsgICAgNC4wMjg4NDJdIGluaXRjYWxsIHNuZF9tZW1faW5p
dCsweDAvMHgyYyByZXR1cm5lZCAwIGFmdGVyIDUgdXNlY3MNClsgICAgNC4wMjg4NDRdIGNh
bGxpbmcgIGFsc2FfcmF3bWlkaV9pbml0KzB4MC8weDg1IEAgMQ0KWyAgICA0LjAyODg0N10g
aW5pdGNhbGwgYWxzYV9yYXdtaWRpX2luaXQrMHgwLzB4ODUgcmV0dXJuZWQgMCBhZnRlciAw
IHVzZWNzDQpbICAgIDQuMDI4ODQ5XSBjYWxsaW5nICBhbHNhX21peGVyX29zc19pbml0KzB4
MC8weDNjIEAgMQ0KWyAgICA0LjAyODg1Ml0gaW5pdGNhbGwgYWxzYV9taXhlcl9vc3NfaW5p
dCsweDAvMHgzYyByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wMjg4NTRdIGNh
bGxpbmcgIGFsc2FfcGNtX29zc19pbml0KzB4MC8weDg4IEAgMQ0KWyAgICA0LjAyODg1Nl0g
aW5pdGNhbGwgYWxzYV9wY21fb3NzX2luaXQrMHgwLzB4ODggcmV0dXJuZWQgMCBhZnRlciAw
IHVzZWNzDQpbICAgIDQuMDI4ODU4XSBjYWxsaW5nICBhbHNhX3NlcV9pbml0KzB4MC8weDRj
IEAgMQ0KWyAgICA0LjAzMDE5N10gaW5pdGNhbGwgYWxzYV9zZXFfaW5pdCsweDAvMHg0YyBy
ZXR1cm5lZCAwIGFmdGVyIDEzMDAgdXNlY3MNClsgICAgNC4wMzAyMDBdIGNhbGxpbmcgIGFs
c2Ffc2VxX2RldmljZV9pbml0KzB4MC8weDViIEAgMQ0KWyAgICA0LjAzMDIwM10gaW5pdGNh
bGwgYWxzYV9zZXFfZGV2aWNlX2luaXQrMHgwLzB4NWIgcmV0dXJuZWQgMCBhZnRlciAwIHVz
ZWNzDQpbICAgIDQuMDMwMjA1XSBjYWxsaW5nICBhbHNhX3NlcV9taWRpX2V2ZW50X2luaXQr
MHgwLzB4OCBAIDENClsgICAgNC4wMzAyMDhdIGluaXRjYWxsIGFsc2Ffc2VxX21pZGlfZXZl
bnRfaW5pdCsweDAvMHg4IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjAzMDIx
MF0gY2FsbGluZyAgYWxzYV9zZXFfb3NzX2luaXQrMHgwLzB4MTc2IEAgMQ0KWyAgICA0LjA0
MTg5M10gaW5pdGNhbGwgYWxzYV9zZXFfb3NzX2luaXQrMHgwLzB4MTc2IHJldHVybmVkIDAg
YWZ0ZXIgMTE0MDAgdXNlY3MNClsgICAgNC4wNDE4OTZdIGNhbGxpbmcgIGFsc2Ffc2VxX2R1
bW15X2luaXQrMHgwLzB4YmUgQCAxDQpbICAgIDQuMDQxOTA0XSBpbml0Y2FsbCBhbHNhX3Nl
cV9kdW1teV9pbml0KzB4MC8weGJlIHJldHVybmVkIDAgYWZ0ZXIgNSB1c2Vjcw0KWyAgICA0
LjA0MTkwN10gY2FsbGluZyAgYWxzYV9zZXFfbWlkaV9pbml0KzB4MC8weDNhIEAgMQ0KWyAg
ICA0LjA0MTkxMF0gaW5pdGNhbGwgYWxzYV9zZXFfbWlkaV9pbml0KzB4MC8weDNhIHJldHVy
bmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA0MTkxMl0gY2FsbGluZyAgYWxzYV9zZXFf
bWlkaV9lbXVsX2luaXQrMHgwLzB4OCBAIDENClsgICAgNC4wNDE5MTRdIGluaXRjYWxsIGFs
c2Ffc2VxX21pZGlfZW11bF9pbml0KzB4MC8weDggcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNz
DQpbICAgIDQuMDQxOTIwXSBjYWxsaW5nICBhbHNhX29wbDNfaW5pdCsweDAvMHg4IEAgMQ0K
WyAgICA0LjA0MTkyMl0gaW5pdGNhbGwgYWxzYV9vcGwzX2luaXQrMHgwLzB4OCByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNDE5MjRdIGNhbGxpbmcgIGFsc2Ffb3BsM19z
ZXFfaW5pdCsweDAvMHgxZSBAIDENClsgICAgNC4wNDE5MjddIGluaXRjYWxsIGFsc2Ffb3Bs
M19zZXFfaW5pdCsweDAvMHgxZSByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4w
NDE5MjldIGNhbGxpbmcgIGFsc2FfbXB1NDAxX3VhcnRfaW5pdCsweDAvMHg4IEAgMQ0KWyAg
ICA0LjA0MTkzMV0gaW5pdGNhbGwgYWxzYV9tcHU0MDFfdWFydF9pbml0KzB4MC8weDggcmV0
dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDQxOTMzXSBjYWxsaW5nICBhbHNhX2Nh
cmRfY21pcGNpX2luaXQrMHgwLzB4MWIgQCAxDQpbICAgIDQuMDQzMjYyXSBpbml0Y2FsbCBh
bHNhX2NhcmRfY21pcGNpX2luaXQrMHgwLzB4MWIgcmV0dXJuZWQgMCBhZnRlciAxMjg3IHVz
ZWNzDQpbICAgIDQuMDQzMjY1XSBjYWxsaW5nICBwYXRjaF9yZWFsdGVrX2luaXQrMHgwLzB4
MTIgQCAxDQpbICAgIDQuMDQzMjY4XSBpbml0Y2FsbCBwYXRjaF9yZWFsdGVrX2luaXQrMHgw
LzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDQzMjcwXSBjYWxsaW5n
ICBwYXRjaF9jbWVkaWFfaW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNDMyNzJdIGluaXRj
YWxsIHBhdGNoX2NtZWRpYV9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cw0KWyAgICA0LjA0MzI3NV0gY2FsbGluZyAgcGF0Y2hfYW5hbG9nX2luaXQrMHgwLzB4MTIg
QCAxDQpbICAgIDQuMDQzMjc3XSBpbml0Y2FsbCBwYXRjaF9hbmFsb2dfaW5pdCsweDAvMHgx
MiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNDMyNzldIGNhbGxpbmcgIHBh
dGNoX3NpZ21hdGVsX2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDQuMDQzMjgxXSBpbml0Y2Fs
bCBwYXRjaF9zaWdtYXRlbF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cw0KWyAgICA0LjA0MzI4M10gY2FsbGluZyAgcGF0Y2hfc2kzMDU0X2luaXQrMHgwLzB4MTIg
QCAxDQpbICAgIDQuMDQzMjg2XSBpbml0Y2FsbCBwYXRjaF9zaTMwNTRfaW5pdCsweDAvMHgx
MiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNDMyODhdIGNhbGxpbmcgIHBh
dGNoX2NpcnJ1c19pbml0KzB4MC8weDEyIEAgMQ0KWyAgICA0LjA0MzI5MF0gaW5pdGNhbGwg
cGF0Y2hfY2lycnVzX2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpb
ICAgIDQuMDQzMjkyXSBjYWxsaW5nICBwYXRjaF9jYTAxMTBfaW5pdCsweDAvMHgxMiBAIDEN
ClsgICAgNC4wNDMyOTRdIGluaXRjYWxsIHBhdGNoX2NhMDExMF9pbml0KzB4MC8weDEyIHJl
dHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA0MzI5Nl0gY2FsbGluZyAgcGF0Y2hf
Y2EwMTMyX2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDQuMDQzMjk4XSBpbml0Y2FsbCBwYXRj
aF9jYTAxMzJfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAg
NC4wNDMzMDFdIGNhbGxpbmcgIHBhdGNoX2NvbmV4YW50X2luaXQrMHgwLzB4MTIgQCAxDQpb
ICAgIDQuMDQzMzAzXSBpbml0Y2FsbCBwYXRjaF9jb25leGFudF9pbml0KzB4MC8weDEyIHJl
dHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA0MzMwNV0gY2FsbGluZyAgcGF0Y2hf
dmlhX2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDQuMDQzMzA3XSBpbml0Y2FsbCBwYXRjaF92
aWFfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNDMz
MDldIGNhbGxpbmcgIHBhdGNoX2hkbWlfaW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNDMz
MTFdIGluaXRjYWxsIHBhdGNoX2hkbWlfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVy
IDAgdXNlY3MNClsgICAgNC4wNDMzMTNdIGNhbGxpbmcgIGFsc2FfY2FyZF9henhfaW5pdCsw
eDAvMHgxYiBAIDENClsgICAgNC4wNDQ1OTZdIGluaXRjYWxsIGFsc2FfY2FyZF9henhfaW5p
dCsweDAvMHgxYiByZXR1cm5lZCAwIGFmdGVyIDEyNDMgdXNlY3MNClsgICAgNC4wNDQ1OTld
IGNhbGxpbmcgIGFsc2FfY2FyZF9veHlnZW5faW5pdCsweDAvMHgxYiBAIDENClsgICAgNC4w
NDU4OTddIGluaXRjYWxsIGFsc2FfY2FyZF9veHlnZW5faW5pdCsweDAvMHgxYiByZXR1cm5l
ZCAwIGFmdGVyIDEyNTggdXNlY3MNClsgICAgNC4wNDU5MDFdIGNhbGxpbmcgIHNuZF91c2Jf
YXVkaW9faW5pdCsweDAvMHgzZSBAIDENClsgICAgNC4wNDcyMjBdIHVzYmNvcmU6IHJlZ2lz
dGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgc25kLXVzYi1hdWRpbw0KWyAgICA0LjA0NzIy
OF0gaW5pdGNhbGwgc25kX3VzYl9hdWRpb19pbml0KzB4MC8weDNlIHJldHVybmVkIDAgYWZ0
ZXIgMTI5MCB1c2Vjcw0KWyAgICA0LjA0NzIzMV0gY2FsbGluZyAgYWxzYV9jYXJkX3VhMTAx
X2luaXQrMHgwLzB4MWIgQCAxDQpbICAgIDQuMDQ5NjQxXSB1c2Jjb3JlOiByZWdpc3RlcmVk
IG5ldyBpbnRlcmZhY2UgZHJpdmVyIHNuZC11YTEwMQ0KWyAgICA0LjA0OTY1MF0gaW5pdGNh
bGwgYWxzYV9jYXJkX3VhMTAxX2luaXQrMHgwLzB4MWIgcmV0dXJuZWQgMCBhZnRlciAyMzU2
IHVzZWNzDQpbICAgIDQuMDQ5NjUzXSBjYWxsaW5nICBzbmRfdXNYMllfbW9kdWxlX2luaXQr
MHgwLzB4MWIgQCAxDQpbICAgIDQuMDUyNzc4XSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBp
bnRlcmZhY2UgZHJpdmVyIHNuZC11c2ItdXN4MnkNClsgICAgNC4wNTI3ODZdIGluaXRjYWxs
IHNuZF91c1gyWV9tb2R1bGVfaW5pdCsweDAvMHgxYiByZXR1cm5lZCAwIGFmdGVyIDMwNTMg
dXNlY3MNClsgICAgNC4wNTI3ODldIGNhbGxpbmcgIHNuZF91czEyMmxfbW9kdWxlX2luaXQr
MHgwLzB4MWIgQCAxDQpbICAgIDQuMDU0OTgzXSB1c2Jjb3JlOiByZWdpc3RlcmVkIG5ldyBp
bnRlcmZhY2UgZHJpdmVyIHNuZC11c2ItdXMxMjJsDQpbICAgIDQuMDU0OTkxXSBpbml0Y2Fs
bCBzbmRfdXMxMjJsX21vZHVsZV9pbml0KzB4MC8weDFiIHJldHVybmVkIDAgYWZ0ZXIgMjE0
NSB1c2Vjcw0KWyAgICA0LjA1NDk5NF0gY2FsbGluZyAgc25kX21vZHVsZV9pbml0KzB4MC8w
eDFiIEAgMQ0KWyAgICA0LjA1NjkwMl0gdXNiY29yZTogcmVnaXN0ZXJlZCBuZXcgaW50ZXJm
YWNlIGRyaXZlciBzbmQtdXNiLWNhaWFxDQpbICAgIDQuMDU2OTA5XSBpbml0Y2FsbCBzbmRf
bW9kdWxlX2luaXQrMHgwLzB4MWIgcmUgdXNlY3MNClsgICAgNC4wNTY5MTNdIGNhbGxpbmcg
IHVzYjZmaXJlX2NoaXBfaW5pdCsweDAvMHgxYiBAIDENClsgICAgNC4wNTgyMTldIHVzYmNv
cmU6IHJlZ2lzdGVyZWQgbmV3IGludGVyZmFjZSBkcml2ZXIgICAgNC4wNTgyMjddIGluaXRj
YWxsIHVzYjZmaXJlX2NoaXBfaW5pdCsweDAvMHgxYiByZXR1cm5lZCAwIGFlciAxMjc3IHVz
ZWNzDQpbICAgIDQuMDU4MjI5XSBjYWxsaW5nICBhbHNhX3NvdS8weDcxIEAgMQ0KWyAgICA0
LjA1ODIzMV0gQUxTQSBkZXZpY2UgbGlzdDoNCltObyBzb3VuZGNhcmRzIGZvdW5kLg0KWyAg
ICA0LjA1ODIzNF0gaW5pdGNhbGwgYWxzYV9zb3VuZF9sYXN0X2luaXQrMHgwLzB4NzEgcmV0
dXJuZWQgMCBhZnRlciAyIHVzZWNzDQpbICAgIDQuMDU4MjM2XSBjYWxsaW5nICBsbGNfaW5p
dCsweDAvMHgyMCBAIDENClsgICAgNC4wNTgyMzldIGluaXRjYWxsIGxsY19pbml0KzBzDQpb
ICAgIDQuMDU4MjQxXSBjYWxsaW5nICBzbmFwX2luaXQrMHgwLzB4MzggQCAxDQpbICAgIDQu
MDU4MjQ0XSBpbml0Y2FsbCBzbmFwX2luaXQrMHgwLzB4MzggcmV0dXJuZWQgMCBhZnRlciAx
IHVzZWNzDQpbICAgIDQuMDU4MjQ1XSBjYWxsaW5nICByaWZfaW5pdCsweDAvMHg4NSBAIDEN
ClsgICAgNC4wNTgyNjldIGluaXRjYWxsIHJpZl9pbml0KzB4MC8weDg1IHJldHVybmVkIDAg
YWZ0ZXIgMjEgdXNlY3MNClsgICAgNC4wNTgyNzFdIGNhbGxpbmcgIGJsYWNraG9sZV9tb2R1
bGVfaW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNTgyNzRdIGluaXRjYWxsIGJsYWNraG9s
ZV9tb2R1bGVfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAg
NC4wNTgyNzZdIGNhbGxpbmcgIG5mbmV0bGlua19pbml0KzB4MC8weDI3IEAgMQ0KWyAgICA0
LjA1ODI3OF0gTmV0ZmlsdGVyIG1lc3NhZ2VzIHZpYSBORVRMSU5LIHYwLjMwLg0KWyAgICA0
LjA1ODI4OV0gaW5pdGNhbGwgbmZuZXRsaW5rX2luaXQrMHgwLzB4MjcgcmV0dXJuZWQgMCBh
ZnRlciAxMCB1c2Vjcw0KWyAgICA0LjA1ODI5MF0gY2FsbGluZyAgbmZuZXRsaW5rX3F1ZXVl
X2luaXQrMHgwLzB4YTMgQCAxDQpbICAgIDQuMDU4Mjk3XSBpbml0Y2FsbCBuZm5ldGxpbmtf
cXVldWVfaW5pdCsweDAvMHhhMyByZXR1cm5lZCAwIGFmdGVyIDQgdXNlY3MNClsgICAgNC4w
NTgyOThdIGNhbGxpbmcgIG5mbmV0bGlua19sb2dfaW5pdCsweDAvMHhkNiBAIDENClsgICAg
NC4wNTgzMDddIGluaXRjYWxsIG5mbmV0bGlua19sb2dfaW5pdCsweDAvMHhkNiByZXR1cm5l
ZCAwIGFmdGVyIDcgdXNlY3MNClsgICAgNC4wNTgzMDldIGNhbGxpbmcgIG5mX2Nvbm50cmFj
a19zdGFuZGFsb25lX2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDQuMDU4MzEyXSBuZl9jb25u
dHJhY2sgdmVyc2lvbiAwLjUuMCAoNzM2NiBidWNrZXRzLCAyOTQ2NCBtYXgpDQpbICAgIDQu
MDYxMDIyXSBpbml0Y2FsbCBuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9pbml0KzB4MC8weDEy
IHJldHVybmVkIDAgYWZ0ZXIgMjY0MSB1c2Vjcw0KWyAgICA0LjA2MTAyNV0gY2FsbGluZyAg
bmZfY3RfcHJvdG9fZ3JlX2luaXQrMHgwLzB4M2MgQCAxDQpbICAgIDQuMDYxMDMxXSBpbml0
Y2FsbCBuZl9jdF9wcm90b19ncmVfaW5pdCsweDAvMHgzYyByZXR1cm5lZCAwIGFmdGVyIDMg
dXNlY3MNClsgICAgNC4wNjEwMzNdIGNhbGxpbmcgIGN0bmV0bGlua19pbml0KzB4MC8weGQ1
IEAgMQ0KWyAgICA0LjA2MTAzNF0gY3RuZXRsaW5rIHYwLjkzOiByZWdpc3RlcmluZyB3aXRo
IG5mbmV0bGluay4NClsgICAgNC4wNjEwMzddIGluaXRjYWxsIGN0bmV0bGlua19pbml0KzB4
MC8weGQ1IHJldHVybmVkIDAgYWZ0ZXIgMiB1c2Vjcw0KWyAgICA0LjA2MTAzOV0gY2FsbGlu
ZyAgbmZfY29ubnRyYWNrX2Z0cF9pbml0KzB4MC8weDE5YyBAIDENClsgICAgNC4wNjEwNDZd
IGluaXRjYWxsIG5mX2Nvbm50cmFja19mdHBfaW5pdCsweDAvMHgxOWMgcmV0dXJuZWQgMCBh
ZnRlciA0IHVzZWNzDQpbICAgIDQuMDYxMDQ4XSBjYWxsaW5nICBuZl9jb25udHJhY2tfaDMy
M19pbml0KzB4MC8weGNkIEAgMQ0KWyAgICA0LjA2MTA5Nl0gaW5pdGNhbGwgbmZfY29ubnRy
YWNrX2gzMjNfaW5pdCsweDAvMHhjZCByZXR1cm5lZCAwIGFmdGVyIDQ1IHVzZWNzDQpbICAg
IDQuMDYxMDk4XSBjYWxsaW5nICBuZl9jb25udHJhY2tfaXJjX2luaXQrMHgwLzB4MTYzIEAg
MQ0KWyAgICA0LjA2MTEwMl0gaW5pdGNhbGwgbmZfY29ubnRyYWNrX2lyY19pbml0KzB4MC8w
eDE2MyByZXR1cm5lZCAwIGFmdGVyIDEgdXNlY3MNClsgICAgNC4wNjExMDRdIGNhbGxpbmcg
IG5mX2Nvbm50cmFja19wcHRwX2luaXQrMHgwLzB4M2MgQCAxDQpbICAgIDQuMDYxMTA2XSBp
bml0Y2FsbCBuZl9jb25udHJhY2tfcHB0cF9pbml0KzB4MC8weDNjIHJldHVybmVkIDAgYWZ0
ZXIgMCB1c2Vjcw0KWyAgICA0LjA2MTEwOF0gY2FsbGluZyAgbmZfY29ubnRyYWNrX3NpcF9p
bml0KzB4MC8weDFmOSBAIDENClsgICAgNC4wNjExMTFdIGluaXRjYWxsIG5mX2Nvbm50cmFj
a19zaXBfaW5pdCsweDAvMHgxZjkgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQu
MDYxMTEzXSBjYWxsaW5nICB4dF9pbml0KzB4MC8weDExZCBAIDENClsgICAgNC4wNjExMTdd
IGluaXRjYWxsIHh0X2luaXQrMHgwLzB4MTFkIHJldHVybmVkIDAgYWZ0ZXIgMSB1c2Vjcw0K
WyAgICA0LjA2MTExOF0gY2FsbGluZyAgdGNwdWRwX210X2luaXQrMHgwLzB4MTcgQCAxDQpb
ICAgIDQuMDYxMTIxXSBpbml0Y2FsbCB0Y3B1ZHBfbXRfaW5pdCsweDAvMHgxNyByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNjExMjNdIGNhbGxpbmcgIG1hcmtfbXRfaW5p
dCsweDAvMHg0MCBAIDENClsgICAgNC4wNjExMjhdIGluaXRjYWxsIG1hcmtfbXRfaW5pdCsw
eDAvMHg0MCByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNjExMzFdIGNhbGxp
bmcgIGNvbm5tYXJrX210X2luaXQrMHgwLzB4NDAgQCAxDQpbICAgIDQuMDYxMTMzXSBpbml0
Y2FsbCBjb25ubWFya19tdF9pbml0KzB4MC8weDQwIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vj
cw0KWyAgICA0LjA2MTEzNV0gY2FsbGluZyAgYXVkaXRfdGdfaW5pdCsweDAvMHgxNyBAIDEN
ClsgICAgNC4wNjExMzhdIGluaXRjYWxsIGF1ZGl0X3RnX2luaXQrMHgwLzB4MTcgcmV0dXJu
ZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDYxMTM5XSBjYWxsaW5nICBjaGVja3N1bV90
Z19pbml0KzB4MC8weDEyIEAgMQ0KWyAgICA0LjA2MTE0M10gaW5pdGNhbGwgY2hlY2tzdW1f
dGdfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNjEx
NDVdIGNhbGxpbmcgIGNsYXNzaWZ5X3RnX2luaXQrMHgwLzB4MTcgQCAxDQpbICAgIDQuMDYx
MTUwXSBpbml0Y2FsbCBjbGFzc2lmeV90Z19pbml0KzB4MC8weDE3IHJldHVybmVkIDAgYWZ0
ZXIgMSB1c2Vjcw0KWyAgICA0LjA2MTE1Ml0gY2FsbGluZyAgY29ubnNlY21hcmtfdGdfaW5p
dCsweDAvMHgxMiBAIDENClsgICAgNC4wNjExNTVdIGluaXRjYWxsIGNvbm5zZWNtYXJrX3Rn
X2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDYxMTU3
XSBjYWxsaW5nICBkc2NwX3RnX2luaXQrMHgwLzB4MTcgQCAxDQpbICAgIDQuMDYxMTU5XSBp
bml0Y2FsbCBkc2NwX3RnX2luaXQrMHgwLzB4MTcgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNz
DQpbICAgIDQuMDYxMTYxXSBjYWxsaW5nICBobF90Z19pbml0KzB4MC8weDE3IEAgMQ0KWyAg
ICA0LjA2MTE2M10gaW5pdGNhbGwgaGxfdGdfaW5pdCsweDAvMHgxNyByZXR1cm5lZCAwIGFm
dGVyIDAgdXNlY3MNClsgICAgNC4wNjExNjVdIGNhbGxpbmcgIGxlZF90Z19pbml0KzB4MC8w
eDEyIEAgMQ0KWyAgICA0LjA2MTE2OF0gaW5pdGNhbGwgbGVkX3RnX2luaXQrMHgwLzB4MTIg
cmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDYxMTcwXSBjYWxsaW5nICBuZmxv
Z190Z19pbml0KzB4MC8weDEyIEAgMQ0KWyAgICA0LjA2MTE3Ml0gaW5pdGNhbGwgbmZsb2df
dGdfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNjEx
NzRdIGNhbGxpbmcgIG5mcXVldWVfdGdfaW5pdCsweDAvMHgxNyBAIDENClsgICAgNC4wNjEx
NzZdIGluaXRjYWxsIG5mcXVldWVfdGdfaW5pdCsweDAvMHgxNyByZXR1cm5lZCAwIGFmdGVy
IDAgdXNlY3MNClsgICAgNC4wNjExNzhdIGNhbGxpbmcgIHh0X3JhdGVlc3RfdGdfaW5pdCsw
eDAvMHgyYiBAIDENClsgICAgNC4wNjExODhdIGluaXRjYWxsIHh0X3JhdGVlc3RfdGdfaW5p
dCsweDAvMHgyYiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNjExOTJdIGNh
bGxpbmcgIHNlY21hcmtfdGdfaW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNjExOTRdIGlu
aXRjYWxsIHNlY21hcmtfdGdfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNl
Y3MNClsgICAgNC4wNjExOTZdIGNhbGxpbmcgIHRjcG1zc190Z19pbml0KzB4MC8weDE3IEAg
MQ0KWyAgICA0LjA2MTE5OF0gaW5pdGNhbGwgdGNwbXNzX3RnX2luaXQrMHgwLzB4MTcgcmV0
dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDYxMTk5XSBjYWxsaW5nICB0Y3BvcHRz
dHJpcF90Z19pbml0KzB4MC8weDE3IEAgMQ0KWyAgICA0LjA2MTIwMl0gaW5pdGNhbGwgdGNw
b3B0c3RyaXBfdGdfaW5pdCsweDAvMHgxNyByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsg
ICAgNC4wNjEyMDNdIGNhbGxpbmcgIHRlZV90Z19pbml0KzB4MC8weDE3IEAgMQ0KWyAgICA0
LjA2MTIwNV0gaW5pdGNhbGwgdGVlX3RnX2luaXQrMHgwLzB4MTcgcmV0dXJuZWQgMCBhZnRl
ciAwIHVzZWNzDQpbICAgIDQuMDYxMjA3XSBjYWxsaW5nICBpZGxldGltZXJfdGdfaW5pdCsw
eDAvMHg5ZSBAIDENClsgICAgNC4wNjM3MzhdIGluaXRjYWxsIGlkbGV0aW1lcl90Z19pbml0
KzB4MC8weDllIHJldHVybmVkIDAgYWZ0ZXIgMjQ2MyB1c2Vjcw0KWyAgICA0LjA2Mzc0MV0g
Y2FsbGluZyAgYWRkcnR5cGVfbXRfaW5pdCsweDAvMHgxNyBAIDENClsgICAgNC4wNjM3NDNd
IGluaXRjYWxsIGFkZHJ0eXBlX210X2luaXQrMHgwLzB4MTcgcmV0dXJuZWQgMCBhZnRlciAw
IHVzZWNzDQpbICAgIDQuMDYzNzQ1XSBjYWxsaW5nICB4dF9jbHVzdGVyX210X2luaXQrMHgw
LzB4MTIgQCAxDQpbICAgIDQuMDYzNzQ3XSBpbml0Y2FsbCB4dF9jbHVzdGVyX210X2luaXQr
MHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDYzNzQ5XSBjYWxs
aW5nICBjb21tZW50X210X2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDQuMDYzNzUxXSBpbml0
Y2FsbCBjb21tZW50X210X2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNz
DQpbICAgIDQuMDYzNzUzXSBjYWxsaW5nICBjb25uYnl0ZXNfbXRfaW5pdCsweDAvMHgxMiBA
IDENClsgICAgNC4wNjM3NTVdIGluaXRjYWxsIGNvbm5ieXRlc19tdF9pbml0KzB4MC8weDEy
IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA2Mzc1N10gY2FsbGluZyAgY29u
bmxpbWl0X210X2luaXQrMHgwLzB4MTcgQCAxDQpbICAgIDQuMDYzNzU5XSBpbml0Y2FsbCBj
b25ubGltaXRfbXRfaW5pdCsweDAvMHgxNyByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsg
ICAgNC4wNjM3NjFdIGNhbGxpbmcgIGNvbm50cmFja19tdF9pbml0KzB4MC8weDE3IEAgMQ0K
WyAgICA0LjA2Mzc2M10gaW5pdGNhbGwgY29ubnRyYWNrX210X2luaXQrMHgwLzB4MTcgcmV0
dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDYzNzY1XSBjYWxsaW5nICBjcHVfbXRf
aW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNjM3NjddIGluaXRjYWxsIGNwdV9tdF9pbml0
KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA2Mzc2OF0gY2Fs
bGluZyAgZGNjcF9tdF9pbml0KzB4MC8weDYwIEAgMQ0KWyAgICA0LjA2Mzc3MV0gaW5pdGNh
bGwgZGNjcF9tdF9pbml0KzB4MC8weDYwIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAg
ICA0LjA2Mzc3M10gY2FsbGluZyAgZGV2Z3JvdXBfbXRfaW5pdCsweDAvMHgxMiBAIDENClsg
ICAgNC4wNjM3NzVdIGluaXRjYWxsIGRldmdyb3VwX210X2luaXQrMHgwLzB4MTIgcmV0dXJu
ZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDYzNzc3XSBjYWxsaW5nICBkc2NwX210X2lu
aXQrMHgwLzB4MTcgQCAxDQpbICAgIDQuMDYzNzc5XSBpbml0Y2FsbCBkc2NwX210X2luaXQr
MHgwLzB4MTcgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDYzNzgxXSBjYWxs
aW5nICBlc3BfbXRfaW5pdCsweDAvMHgxNyBAIDENClsgICAgNC4wNjM3ODNdIGluaXRjYWxs
IGVzcF9tdF9pbml0KzB4MC8weDE3IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0
LjA2Mzc4NF0gY2FsbGluZyAgaGFzaGxpbWl0X210X2luaXQrMHgwLzB4OGMgQCAxDQpbICAg
IDQuMDYzODE2XSBpbml0Y2FsbCBoYXNobGltaXRfbXRfaW5pdCsweDAvMHg4YyByZXR1cm5l
ZCAwIGFmdGVyIDI4IHVzZWNzDQpbICAgIDQuMDYzODE4XSBjYWxsaW5nICBoZWxwZXJfbXRf
aW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNjM4MjBdIGluaXRjYWxsIGhlbHBlcl9tdF9p
bml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA2MzgyMl0g
Y2FsbGluZyAgaGxfbXRfaW5pdCsweDAvMHgxNyBAIDENClsgICAgNC4wNjM4MjRdIGluaXRj
YWxsIGhsX210X2luaXQrMHgwLzB4MTcgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAg
IDQuMDYzODMwXSBjYWxsaW5nICBpcHJhbmdlX210X2luaXQrMHgwLzB4MTcgQCAxDQpbICAg
IDQuMDYzODMyXSBpbml0Y2FsbCBpcHJhbmdlX210X2luaXQrMHgwLzB4MTcgcmV0dXJuZWQg
MCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDYzODM0XSBjYWxsaW5nICBsZW5ndGhfbXRfaW5p
dCsweDAvMHgxNyBAIDENClsgICAgNC4wNjM4MzZdIGluaXRjYWxsIGxlbmd0aF9tdF9pbml0
KzB4MC8weDE3IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA2MzgzOF0gY2Fs
bGluZyAgbGltaXRfbXRfaW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNjM4NDFdIGluaXRj
YWxsIGxpbWl0X210X2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpb
ICAgIDQuMDYzODQyXSBjYWxsaW5nICBtYWNfbXRfaW5pdCsweDAvMHgxMiBAIDENClsgICAg
NC4wNjM4NDRdIGluaXRjYWxsIG1hY19tdF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0
ZXIgMCB1c2Vjcw0KWyAgICA0LjA2Mzg0Nl0gY2FsbGluZyAgbXVsdGlwb3J0X210X2luaXQr
MHgwLzB4MTcgQCAxDQpbICAgIDQuMDYzODQ4XSBpbml0Y2FsbCBtdWx0aXBvcnRfbXRfaW5p
dCsweDAvMHgxNyByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNjM4NTBdIGNh
bGxpbmcgIHh0X29zZl9pbml0KzB4MC8weDhkIEAgMQ0KWyAgICA0LjA2Mzg1M10gaW5pdGNh
bGwgeHRfb3NmX2luaXQrMHgwLzB4OGQgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAg
IDQuMDYzODU1XSBjYWxsaW5nICBvd25lcl9tdF9pbml0KzB4MC8weDEyIEAgMQ0KWyAgICA0
LjA2Mzg1N10gaW5pdGNhbGwgb3duZXJfbXRfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFm
dGVyIDAgdXNlY3MNClsgICAgNC4wNjM4NTldIGNhbGxpbmcgIHBoeXNkZXZfbXRfaW5pdCsw
eDAvMHgxMiBAIDENClsgICAgNC4wNjM4NjFdIGluaXRjYWxsIHBoeXNkZXZfbXRfaW5pdCsw
eDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNjM4NjNdIGNhbGxp
bmcgIHBrdHR5cGVfbXRfaW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNjM4NjVdIGluaXRj
YWxsIHBrdHR5cGVfbXRfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MN
ClsgICAgNC4wNjM4NjddIGNhbGxpbmcgIHF1b3RhX210X2luaXQrMHgwLzB4MTIgQCAxDQpb
ICAgIDQuMDYzODY5XSBpbml0Y2FsbCBxdW90YV9tdF9pbml0KzB4MC8weDEyIHJldHVybmVk
IDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA2Mzg3MF0gY2FsbGluZyAgeHRfcmF0ZWVzdF9t
dF9pbml0KzB4MC8weDEyIEAgMQ0KWyAgICA0LjA2Mzg3M10gaW5pdGNhbGwgeHRfcmF0ZWVz
dF9tdF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA2
Mzg3NF0gY2FsbGluZyAgcmVhbG1fbXRfaW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNjM4
NzZdIGluaXRjYWxsIHJlYWxtX210X2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAw
IHVzZWNzDQpbICAgIDQuMDYzODc4XSBjYWxsaW5nICByZWNlbnRfbXRfaW5pdCsweDAvMHg3
ZCBAIDENClsgICAgNC4wNjM4ODJdIGluaXRjYWxsIHJlY2VudF9tdF9pbml0KzB4MC8weDdk
IHJldHVybmVkIDAgYWZ0ZXIgMSB1c2Vjcw0KWyAgICA0LjA2Mzg4NF0gY2FsbGluZyAgc2N0
cF9tdF9pbml0KzB4MC8weDE3IEAgMQ0KWyAgICA0LjA2Mzg4Nl0gaW5pdGNhbGwgc2N0cF9t
dF9pbml0KzB4MC8weDE3IHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA2Mzg4
OF0gY2FsbGluZyAgc3RhdGVfbXRfaW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNjM4OTBd
IGluaXRjYWxsIHN0YXRlX210X2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVz
ZWNzDQpbICAgIDQuMDYzODkyXSBjYWxsaW5nICBzdGF0aXN0aWNfbXRfaW5pdCsweDAvMHgx
MiBAIDENClsgICAgNC4wNjM4OTRdIGluaXRjYWxsIHN0YXRpc3RpY19tdF9pbml0KzB4MC8w
eDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA2Mzg5Nl0gY2FsbGluZyAg
c3RyaW5nX210X2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDQuMDYzODk4XSBpbml0Y2FsbCBz
dHJpbmdfbXRfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAg
NC4wNjM5MDBdIGNhbGxpbmcgIHRjcG1zc19tdF9pbml0KzB4MC8weDE3IEAgMQ0KWyAgICA0
LjA2MzkwMl0gaW5pdGNhbGwgdGNwbXNzX210X2luaXQrMHgwLzB4MTcgcmV0dXJuZWQgMCBh
ZnRlciAwIHVzZWNzDQpbICAgIDQuMDYzOTA0XSBjYWxsaW5nICB0aW1lX210X2luaXQrMHgw
LzB4NTQgQCAxDQpbICAgIDQuMDYzOTA1XSB4dF90aW1lOiBrZXJuZWwgdGltZXpvbmUgaXMg
LTAwMDANClsgICAgNC4wNjM5MDddIGluaXRjYWxsIHRpbWVfbXRfaW5pdCsweDAvMHg1NCBy
ZXR1cm5lZCAwIGFmdGVyIDEgdXNlY3MNClsgICAgNC4wNjM5MDldIGNhbGxpbmcgIHUzMl9t
dF9pbml0KzB4MC8weDEyIEAgMQ0KWyAgICA0LjA2MzkxMV0gaW5pdGNhbGwgdTMyX210X2lu
aXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDYzOTEzXSBj
YWxsaW5nICBpcF9zZXRfaW5pdCsweDAvMHhlNCBAIDENClsgICAgNC4wNjM5MTZdIGlwX3Nl
dDogcHJvdG9jb2wgNg0KWyAgICA0LjA2MzkxN10gaW5pdGNhbGwgaXBfc2V0X2luaXQrMHgw
LzB4ZTQgcmV0dXJuZWQgMCBhZnRlciAyIHVzZWNzDQpbICAgIDQuMDYzOTE5XSBjYWxsaW5n
ICBiaXRtYXBfaXBfaW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNjM5MjFdIGluaXRjYWxs
IGJpdG1hcF9pcF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAg
ICA0LjA2MzkyM10gY2FsbGluZyAgYml0bWFwX2lwbWFjX2luaXQrMHgwLzB4MTIgQCAxDQpb
ICAgIDQuMDYzOTI1XSBpbml0Y2FsbCBiaXRtYXBfaXBtYWNfaW5pdCsweDAvMHgxMiByZXR1
cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNjM5MjddIGNhbGxpbmcgIGJpdG1hcF9w
b3J0X2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDQuMDYzOTMwXSBpbml0Y2FsbCBiaXRtYXBf
cG9ydF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0LjA2
MzkzMV0gY2FsbGluZyAgaGFzaF9pcF9pbml0KzB4MC8weDEyIEAgMQ0KWyAgICA0LjA2Mzkz
M10gaW5pdGNhbGwgaGFzaF9pcF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1
c2Vjcw0KWyAgICA0LjA2MzkzNV0gY2FsbGluZyAgaGFzaF9pcHBvcnRfaW5pdCsweDAvMHgx
MiBAIDENClsgICAgNC4wNjM5MzddIGluaXRjYWxsIGhhc2hfaXBwb3J0X2luaXQrMHgwLzB4
MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNzDQpbICAgIDQuMDYzOTQwXSBjYWxsaW5nICBo
YXNoX2lwcG9ydGlwX2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDQuMDYzOTQyXSBpbml0Y2Fs
bCBoYXNoX2lwcG9ydGlwX2luaXQrMHgwLzB4MTIgcmV0dXJuZWQgMCBhZnRlciAwIHVzZWNz
DQpbICAgIDQuMDYzOTQ0XSBjYWxsaW5nICBoYXNoX2lwcG9ydG5ldF9pbml0KzB4MC8weDEy
IEAgMQ0KWyAgICA0LjA2Mzk0Nl0gaW5pdGNhbGwgaGFzaF9pcHBvcnRuZXRfaW5pdCsweDAv
MHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNjM5NDhdIGNhbGxpbmcg
IGhhc2hfbmV0X2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDQuMDYzOTUwXSBpbml0Y2FsbCBo
YXNoX25ldF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIgMCB1c2Vjcw0KWyAgICA0
LjA2Mzk1Ml0gY2FsbGluZyAgaGFzaF9uZXRwb3J0X2luaXQrMHgwLzB4MTIgQCAxDQpbICAg
IDQuMDYzOTU0XSBpbml0Y2FsbCBoYXNoX25ldHBvcnRfaW5pdCsweDAvMHgxMiByZXR1cm5l
ZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4wNjM5NTZdIGNhbGxpbmcgIGhhc2hfbmV0aWZh
Y2VfaW5pdCsweDAvMHgxMiBAIDENClsgICAgNC4wNjM5NThdIGluaXRjYWxsIGhhc2hfbmV0
aWZhY2VfaW5pdCsweDAvMHgxMiByZXR1cm5lZCAwIGFmdGVyIDAgdXNlY3MNClsgICAgNC4w
NjM5NjBdIGNhbGxpbmcgIGxpc3Rfc2V0X2luaXQrMHgwLzB4MTIgQCAxDQpbICAgIDQuMDYz
OTYzXSBpbml0Y2FsbCBsaXN0X3NldF9pbml0KzB4MC8weDEyIHJldHVybmVkIDAgYWZ0ZXIg
MCB1c1sgICAxMC4wNDcyNzldIGFzeW5jX3dhaXRpbmcgQCAxDQpbICAgMTAuMDg0MzA1XSBv
aGNpX2hjZCAwMDAwOjAwOjE2LjA6IEdldFN0YXR1cyByb290aHViLnBvcnRzdGF0dXMgWzJd
ID0gMHgwMDEwMDMwMyBQUlNDIExTREEgUFBTIFBFUyBDQ1MNClsgICAxMC4xMjU3NjBdIGF0
YTE6IFNBVEEgbGluayB1cCAzLjAgR2JwcyAoU1N0YXR1cyAxMjMgU0NvbnRyb2wgMzAwKQ0K
WyAgIDEwLjEzNzkzN10gYXRhMS4wMDogQVRBLTg6IEhpdGFjaGkgSERTNzIyMDIwQUxBMzMw
LCBKS0FPQTIwTiwgbWF4IFVETUEvMTMzDQpbICAgMTAuMTQ0MjM5XSB1c2IgNy0zOiBuZXcg
bG93LXNwZWVkIFVTQiBkZXZpY2UgbnVtYmVyIDIgdXNpbmcgb2hjaV9oY2QNClsgICAxMC4x
Mzg4NTJdIGF0YTEuMDA6IDM5MDcwMjkxNjggc2VjdG9ycywgbXVsdGkgMTY6IExCQTQ4IE5D
USAoZGVwdGggMzEvMzIpLCBBQQ0KWyAgIDEwLjE2NzM4Ml0gYXRhMS4wMDogY29uZmlndXJl
ZCBmb3IgVURNQS8xMzMNClsgICAxMC4xNzUzMzVdIGFzeW5jX3dhaXRpbmcgQCAyNQ0KWyAg
IDEwLjE3NTM2Ml0gYXRhNDogU0FUQSBsaW5rIGRvd24gKFNTdGF0dXMgMCBTQ29udHJvbCAz
MDApDQpbICAgMTAuMTc2MDU5XSBhc3luY19jb250aW51aW5nIEAgMjUgYWZ0ZXIgMiB1c2Vj
DQpbICAgMTAuMTk4MTgzXSBhc3luY193YWl0aW5nIEAgMTc0OQ0KWyAgIDEwLjIwNDA5OV0g
c2NzaSAwOjA6MDowOiBEaXJlY3QtQWNjZXNzICAgICBBVEEgICAgICBIaXRhY2hpIEhEUzcy
MjAyIEpLQU8gUFE6IDAgQU5TSTogNQ0KWyAgIDEwLjIxMzg0MF0gY2FsbGluZyAgNl9zZF9w
cm9iZV9hc3luYysweDAvMHgxZDAgQCAxNzUwDQpbICAgMTAuMjE5ODE3XSBzZCAwOjA6MDow
OiBbc2RhXSAzOTA3MDI5MTY4IDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoMi4wMCBUQi8x
LjgxIFRpQikNClsgICAxMC4yMjU2OTVdIG9oY2lfaGNkIDAwMDA6MDA6MTYuMDogR2V0U3Rh
dHVzIHJvb3RodWIucG9ydHN0YXR1cyBbMl0gPSAweDAwMTAwMzAzIFBSU0MgTFNEQSBQUFMg
UEVTIENDUw0KWyAgIDEwLjIzMjAzOV0gc2QgMDowOjA6MDogW3NkYV0gV3JpdGUgUHJvdGVj
dCBpcyBvZmYNClsgICAxMC4yMzI5NDddIHNkIDA6MDowOjA6IFtzZGFdIE1vZGUgU2Vuc2U6
IDAwIDNhIDAwIDAwDQpbICAgMTAuMjQ0MjM5XSBzZCAwOjA6MDowOiBbc2RhXSBXcml0ZSBj
YWNoZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQ
TyBvciBGVUENClsgICAxMC4yNTIwNTFdIHNkIDA6MDowOjA6IEF0dGFjaGVkIHNjc2kgZ2Vu
ZXJpYyBzZzAgdHlwZSAwDQpbICAgMTAuMjU3MDQzXSAgc2RhOiBzZGExIHNkYTINClsgICAx
MC4yNjc0MzJdIGluaXRjYWxsIDJfYXN5bmNfcG9ydF9wcm9iZSsweDAvMHg3MCByZXR1cm5l
ZCAwIGFmdGVyIDY1NzQ3MTAgdXNlY3MNClsgICAxMC4yNjgyNDFdIHNkIDA6MDowOjA6IFtz
ZGFdIEF0dGFjaGVkIFNDU0kgZGlzaw0KWyAgIDEwLjI2ODI0OV0gaW5pdGNhbGwgNl9zZF9w
cm9iZV9hc3luYysweDAvMHgxZDAgcmV0dXJuZWQgMCBhZnRlciA0NzM4MiB1c2Vjcw0KWyAg
IDEwLjI4NjY3N10gYXN5bmNfY29udGludWluZyBAIDUgYWZ0ZXIgMzA4NDU2IHVzZWMNClsg
ICAxMC4yODc2NDRdIGluaXRjYWxsIDNfYXN5bmNfcG9ydF9wcm9iZSsweDAvMHg3MCByZXR1
cm5lZCAwIGFmdGVyIDY2MTAyNjggdXNlY3MNClsgICAxMC4zMDg2NThdIHVzYiA3LTM6IHNr
aXBwZWQgMSBkZXNjcmlwdG9yIGFmdGVyIGludGVyZmFjZQ0KWyAgIDEwLjMwOTU4NF0gdXNi
IDctMzogc2tpcHBlZCAxIGRlc2NyaXB0b3IgYWZ0ZXIgaW50ZXJmYWNlDQpbICAgMTAuMzI0
NTc3XSB1c2IgNy0zOiBkZWZhdWx0IGxhbjM2MDQ0XSB1c2IgNy0zOiB1ZGV2IDIsIGJ1c251
bSA3LCBtaW5vciA9IDc2OQ0KWyAgIDEwLjMzNjk2OF0gdXNiIDctMzogTmNlIGZvdW5kLCBp
ZFZlbmRvcj0wNDZkLCBpZFByb2R1Y3Q9YzUxNw0KWyAgIDEwLjMzNjk2OF0gdXRyaW5nczog
TWZyPTEsIFByb2R1Y3Q9MiwgU2VyaWFsTnVtYmVyPTANClsgICAxMC4zMzY5NjhdIHVyDQpb
ICAgMTAuMzYzMTc0XSBhdGEzOiBTQVRBIGxpbmsgdXAgMy4wIEdicHMgKFNTdGF0dXMgMTIz
Njk2OF0gdXNiIDctMzogTWFudWZhY3R1cmVyOiBMb2dpdGVjaA0KWyAgIDEwLjM3ODAzNV0g
dXMgIDEwLjM3ODU0N10gYXRhMy4wMDogQVRBLTc6IFNBTVNVTkcgSEQxMDNVSiwgMUFBMDEx
MTAsIG1heCBVRE1BNw0KWyAgIDEwLjM3ODU1MF0gYXRhMy4wMDogMTk1MzUyNTE2OCBzZWN0
b3JzLCBtdWx0aSAxNjogTEJBNDggTkNRIChkZXB0aCAzMS8zMiksIEFBDQpbICAgMTAuMzc4
OTc1XSB1c2IgNy0zOiBjb25maWd1cmF0aW9uICMxIGNob3NlbiBmcm9tIDEgY2hvaWNlDQpb
ICAgMTAuNDA2MDk0XSB1c2IgNy0zOiBhZGRpbmcgIzEsIGludGVyZmFjZSAwKQ0KWyAgIDEw
LjQxMzg2MV0gdXNiaGlkIDctMzoxLjA6IHVzYl9wcjc4MV0gdXNiaGlkIDctMzoxLjA6IHVz
Yl9wcm9iZV9pbnRlcmZhY2UgLSBnb3QgaWQNClsgICAxMC40Mjc2NTVdIGF0YTMuVURNQS8x
MzMNClsgICAxMC40MzQxODNdIGFzeW5jX3dhaXRpbmcgQCAxMTExDQpbICAgMTAuNDMxMTEx
IGFmdGVyIDAgdXNlYw0KWyAgIDEwLjQ0NzIyOV0gc2NzaSAyOjA6MDowOiBEaXJlY3QtQWMx
MDNVSiAgMUFBMCBQUTogMCBBTlNJOiA1DQpbICAgMTAuNDUzNTM4XSBpbnB1dDogTG9naXRl
Y2ggVVNCIFJlY2VpdmVyIGFzIC9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDoxNi4wL3Vz
YjcvNy0zLzctMzoxLjAvaW5wdXQvaW5wdXQyDQpbICAgMTAuNDU1MDk5XSBsbzQ2RDpDNTE3
LjAwMDE6IGlucHV0LGhpZHJhdzA6IFVTQiBISUQgdjEuMTAgS2V5Ym9hcmQgW0xvZ2l0ZWNo
IFVTQiBSZWNlaXZlcl0gb24gdXNiLTAwMDA6MDA6MTYuMC0zL2lucHV0MA0KWyAgIDEwLjQ1
NTEyM10gdXNiIDctMzogYWRkaW5nIDctMzopDQpbICAgMTAuNDU1OTEwXSB1c2JoaWQgNy0z
OjEuMTogdXNiX3Byb2JlX2ludGVyZmFjZQ0KWyAgdXNiX3Byb2JlX2ludGVyZmFjZSAtIGdv
dCBpZA0KWyAgIDEwLjQ2MzczMl0gbG9naXRlY2ggMDBnIHVwIExvZ2l0ZWNoIGtleWJvYXJk
IHJlcG9ydCBkZXNjcmlwdG9yDQpbICAgMTAuNDY0OTU4XSBpbnB1dDogTG9naXRlY2ggVVNC
IFJlY2VpdmVyIGFzIC9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDoxNi4wL3VzYjcvNy0z
LzctMzoxLjEvaW5wdXQvaW5wdXQzDQpbICAgMTAuNDY2OTc4XSB1c2JoaWQgNy0zOjEuMTog
bG9va2luZyBmb3IgYSBtaW5vciwgc3RhcnRpbmcgYXQgOTYNClsgICAxMC40Njg0MjFdIGxv
Z2l0ZWNoIDAwMDM6MDQ2RDpDNTE3LjAwMDI6IGlucHV0LGhpZGRldjAsaGlkcmF3MTogVVNC
IEhJRCB2MS4xMCBNb3VzZSBbTG9naXRlY2ggVVNCIFJlY2VpdmVyXSBvbiB1c2ItMDAwMDow
MDoxNi4wLTMvaW5wdXQxDQpbICAgMTAuNDY4NDUwXSBkcml2ZXJzL3VzYi9jb3JlL2lub2Rl
LmM6IGNyZWF0aW5nIGZpbGUgJzAwMicNClsgICAxMC40Njg0NzRdIGh1YiAzLTA6MS4wOiBz
dGF0ZSA3IHBvcnRzIDQgY2hnIDAwMDAgZXZ0IDAwMDgNClsgICAxMC40Njg0ODRdIGh1YiA3
LTA6MS4wOiBzdGF0ZSA3IHBvcnRzIDQgY2hnIDAwMDAgZXZ0IDAwMDgNClsgICAxMC41NDI4
NzFdIGNhbGxpbmcgIDdfc2RfcHJvYmVfYXN5bmMrMHgwLzB4MWQwIEAgNQ0KWyAgIDEwLjU0
NTMxNV0gc2QgMjowOjA6MDogQXR0YWNoZWQgc2NzaSBnZW5lcmljIHNnMSB0eXBlIDANClsg
ICAxMC41NDYwMDJdIGluaXRjYWxsIDRfYXN5bmNfcG9ydF9wcm9iZSsweDAvMHg3MCByZXR1
cm5lZCAwIGFmdGVyIDY4NDA5ODUgdXNlY3MNClsgICAxMC41NDYwMTRdIGFzeW5jX2NvbnRp
bnVpbmcgQCAxNzQ5IGFmdGVyIDMzNDA3OSB1c2VjDQpbICAgMTAuNTQ2MDE3XSBpbml0Y2Fs
bCA1X2FzeW5jX3BvcnRfcHJvYmUrMHgwLzB4NzAgcmV0dXJuZWQgMCBhZnRlciA2NjE5Mzkg
dXNlY3MNClsgICAxMC41Nzk0NThdIGFzeW5jX2NvbnRpbnVpbmcgQCAxIGFmdGVyIDUxNDEy
OCB1c2VjDQpbICAgMTAuNTg1MTk0XSBzZCAyOjA6MDowOiBbc2RiXSAxOTUzNTI1MTY4IDUx
Mi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoMS4wMCBUQi85MzEgR2lCKQ0KWyAgIDEwLjU4NTIz
N10gc2QgMjowOjA6MDogW3NkYl0gV3JpdGUgUHJvdGVjdCBpcyBvZmYNClsgICAxMC41ODUy
MzldIHNkIDI6MDowOjA6IFtzZGJdIE1vZGUgU2Vuc2U6IDAwIDNhIDAwIDAwDQpbICAgMTAu
NTg1MjU3XSBzZCAyOjA6MDowOiBbc2RiXSBXcml0ZSBjYWNoZTogZW5hYmxlZCwgcmVhZCBj
YWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUENClsgICAxMC41ODUx
MThdIGFzeW5jX3dhaXRpbmcgQCAxDQpbICAgMTAuNjIzMjAwXSAgc2RiOiBzZGIxDQpbICAg
MTAuNjMyODk5XSBzZCAyOjA6MDowOiBbc2RiXSBBdHRhY2hlZCBTQ1NJIGRpc2sNClsgICAx
MC42MzM3MjNdIGluaXRjYWxsIDdfc2RfcHJvYmVfYXN5bmMrMHgwLzB4MWQwIHJldHVybmVk
IDAgYWZ0ZXIgNTkxMzggdXNlY3MNClsgICAxMC42NDc2MzBdIGFzeW5jX2NvbnRpbnVpbmcg
QCAxIGFmdGVyIDI0MDI5IHVzZWMNClsgICAxMC42NTY1NjVdIEZyZWVpbmcgdW51c2VkIGtl
cm5lbCBtZW1vcnk6IDc4NGsgZnJlZWQNClsgICAxMC42NTcwNTJdIFdyaXRlIHByb3RlY3Rp
bmcgdGhlIGtlcm5lbCByZWFkLW9ubHkgZGF0YTogMTQzMzZrDQpbICAgMTAuNjc3NTU4XSBG
cmVlaW5nIHVudXNlZCBrZXJuZWwgbWVtb3J5OiAxNTUyayBmcmVlZA0KWyAgIDEwLjY4NTY5
Nl0gRnJlZWluZyB1bnVzZWQga2VybmVsIG1lbW9yeTogMTAwMGsgZnJlZWQNClsgICAxMS41
NjAwMzNdIGNhbGxpbmcgIHdhaXRfc2Nhbl9pbml0KzB4MC8weDEyIFtzY3NpX3dhaXRfc2Nh
bl0gQCAyMzg2DQpbICAgMTEuNTYwMDk4XSBpbml0Y2FsbCB3YWl0X3NjYW5faW5pdCsweDAv
MHgxMiBbc2NzaV93YWl0X3NjYW5dIHJldHVybmVkIDAgYWZ0ZXIgMSB1c2Vjcw0KWyAgIDEy
LjQ5ODkzNV0gRVhUNC1mcyAoZG0tMCk6IG1vdW50ZWQgZmlsZXN5c3RlbSB3aXRoIG9yZGVy
ZWQgZGF0YSBtb2RlLiBPcHRzOiAobnVsbCkNClsgICAxNC41OTIyMjldIHVkZXZbMjQ3MF06
IHN0YXJ0aW5nIHZlcnNpb24gMTY0DQpbICAgMTUuNzI4ODczXSBhdGExLjAwOiBjb25maWd1
cmVkIGZvciBVRE1BLzEzMw0KWyAgIDE1LjczNjMwMV0gYXRhMTogRUggY29tcGxldGUNClsg
ICAxNi4zMzU4OTZdIGF0YTEuMDA6IGNvbmZpZ3VyZWQgZm9yIFVETUEvMTMzDQpbICAgMTYu
MzM1OTAzXSBhdGExOiBFSCBjb21wbGV0ZQ0KWyAgIDE3LjQxODUxMV0gRVhUNC1mcyAoZG0t
MCk6IHJlLW1vdW50ZWQuIE9wdHM6IChudWxsKQ0KWyAgIDE3Ljc4NjI4NV0gRVhUNC1mcyAo
ZG0tMCk6IHJlLW1vdW50ZWQuIE9wdHM6IGJhcnJpZXI9MSxlcnJvcnM9cmVtb3VudC1ybw0K
WyAgIDIwLjgzMTY4NF0gQWRkaW5nIDIwOTcxNDhrIHN3YXAgb24gL2Rldi9tYXBwZXIvc2Vy
dmVlcnN0ZXJ0amUtc3dhcC4gIFByaW9yaXR5Oi0xIGV4dGVudHM6MSBhY3Jvc3M6MjA5NzE0
OGsgDQpbICAgMjEuMzgxMzg2XSBFWFQ0LWZzIChzZGExKTogbW91bnRlZCBmaWxlc3lzdGVt
IHdpdGggb3JkZXJlZCBkYXRhIG1vZGUuIE9wdHM6IGJhcnJpZXI9MSxlcnJvcnM9cmVtb3Vu
dC1ybw0KWyAgIDIzLjMxMjQ5Ml0gcjgxNjkgMDAwMDowODowMC4wOiBldGgxOiBsaW5rIGRv
d24NClsgICAyMy4zMTM2MjVdIHI4MTY5IDAwMDA6MDg6MDAuMDogZXRoMTogbGluayBkb3du
DQpbICAgMjMuNTI1OTYzXSByODE2OSAwMDAwOjA5OjAwLjA6IGV0aDA6IGxpbmsgZG93bg0K
WyAgIDIzLjUyNjA1OF0gcjgxNjkgMDAwMDowOTowMC4wOiBldGgwOiBsaW5rIGRvd24NClsg
ICAyNC45ODk3MTBdIHI4MTY5IDAwMDA6MDg6MDAuMDogZXRoMTogbGluayB1cA0KWyAgIDI1
LjY0MzMxNF0gcjgxNjkgMDAwMDowOTowMC4wOiBldGgwOiBsaW5rIHVwDQpbICAgNDIuOTM4
OTQwXSBzc2hkICg1MjE0KTogL3Byb2MvNTIxNC9vb21fYWRqIGlzIGRlcHJlY2F0ZWQsIHBs
ZWFzZSB1c2UgL3Byb2MvNTIxNC9vb21fc2NvcmVfYWRqIGluc3RlYWQuDQpbICAgNDMuNjk3
MTMzXSBFWFQ0LWZzIChkbS0yKTogbW91bnRlZCBmaWxlc3lzdGVtIHdpdGggb3JkZXJlZCBk
YXRhIG1vZGUuIE9wdHM6IGJhcnJpZXI9MSxlcnJvcnM9cmVtb3VudC1ybw0KWyAgIDQ0LjIw
NjgwMl0gRVhUNC1mcyAoZG0tMyk6IG1vdW50ZWQgZmlsZXN5c3RlbSB3aXRoIG9yZGVyZWQg
ZGF0YSBtb2RlLiBPcHRzOiBiYXJyaWVyPTEsZXJyb3JzPXJlbW91bnQtcm8NClsgICA0NC43
NzY1MDNdIEVYVDQtZnMgKGRtLTQpOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCBvcmRlcmVk
IGRhdGEgbW9kZS4gT3B0czogYmFycmllcj0xLGVycm9ycz1yZW1vdW50LXJvDQpbICAxMDQu
MzgyNTQzXSBFWFQ0LWZzIChkbS01KTogbW91bnRlZCBmaWxlc3lzdGVtIHdpdGggb3JkZXJl
ZCBkYXRhIG1vZGUuIE9wdHM6IGJhcnJpZXI9MSxlcnJvcnM9cmVtb3VudC1ybw0KWyAgMTA0
LjcxNzYwMl0gRVhUNC1mcyAoZG0tNik6IG1vdW50ZWQgZmlsZXN5c3RlbSB3aXRoIG9yZGVy
ZWQgZGF0YSBtb2RlLiBPcHRzOiBiYXJyaWVyPTEsZXJyb3JzPXJlbW91bnQtcm8NClsgIDEw
NS4yMjQwNTldIEVYVDQtZnMgKGRtLTgpOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCBvcmRl
cmVkIGRhdGEgbW9kZS4gT3B0czogYmFycmllcj0xLGVycm9ycz1yZW1vdW50LXJvDQpbICAx
MDUuNjIzMDE3XSBFWFQ0LWZzIChzZGIxKTogbW91bnRlZCBmaWxlc3lzdGVtIHdpdGggb3Jk
ZXJlZCBkYXRhIG1vZGUuIE9wdHM6IGJhcnJpZXI9MSxlcnJvcnM9cmVtb3VudC1ybw0KWyAg
MTEwLjg0MTQ5Ml0gWEVOQlVTOiBVbmFibGUgdG8gcmVhZCBjcHUgc3RhdGUNClsgIDExMC44
NTQ1OTldIFhFTkJVUzogVW5hYmxlIHRvIHJlYWQgY3B1IHN0YXRlDQpbICAxMTAuODU1MjQ2
XSBYRU5CVVM6IFVuYWJsZSB0byByZWFkIGNwdSBzdGF0ZQ0KWyAgMTEwLjg1NTkyMV0gWEVO
QlVTOiBVbmFibGUgdG8gcmVhZCBjcHUgc3RhdGUNClsgIDExMC44NTcyNDddIFhFTkJVUzog
VW5hYmxlIHRvIHJlYWQgY3B1IHN0YXRlDQpbICAxMTAuODU3ODgzXSBYRU5CVVM6IFVuYWJs
ZSB0byByZWFkIGNwdSBzdGF0ZQ0KWyAgMTQ5LjMxMDg2M10gZGV2aWNlIHZpZjEuMCBlbnRl
cmVkIHByb21pc2N1b3VzIG1vZGUNCm1hcHBpbmcga2VybmVsIGludG8gcGh5c2ljYWwgbWVt
b3J5DQphYm91dCB0byBnZXQgc3RhcnRlZC4uLg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzU6
MjZdIHRyYXBzLmM6MjQzMjpkMSBEb21haW4gYXR0ZW1wdGVkIFdSTVNSIDAwMDAwMDAwYzAw
MTAwMDQgZnJvbSAweDAwMDBiMTE1YzQyMzYxOGYgdG8gMHgwMDAwMDAwMDAwMDBhYmNkLg0K
WyAgMTU0LjA0ODIwM10geGVuLWJsa2JhY2s6cmluZy1yZWYgOCwgZXZlbnQtY2hhbm5lbCA5
LCBwcm90b2NvbCAxICh4ODZfNjQtYWJpKQ0KWyAgMTU0LjI0MTc0OF0geGVuLWJsa2JhY2s6
cmluZy1yZWYgOSwgZXZlbnQtY2hhbm5lbCAxMCwgcHJvdG9jb2wgMSAoeDg2XzY0LWFiaSkN
ClsgIDE1NC40ODA5OTFdIHhlbi1ibGtiYWNrOnJpbmctcmVmIDEwLCBldmVudC1jaGFubmVs
IDExLCBwcm90b2NvbCAxICh4ODZfNjQtYWJpKQ0KWyAgMTU0LjgxMTMwNF0geGVuX2JyaWRn
ZTogcG9ydCAxKHZpZjEuMCkgZW50ZXJpbmcgZm9yd2FyZGluZyBzdGF0ZQ0KWyAgMTU0Ljgx
MTk5Nl0geGVuX2JyaWRnZTogcG9ydCAxKHZpZjEuMCkgZW50ZXJpbmcgZm9yd2FyZGluZyBz
dGF0ZQ0KWyAgMTY3LjkzOTI4OF0gZGV2aWNlIHZpZjIuMCBlbnRlcmVkIHByb21pc2N1b3Vz
IG1vZGUNClsgIDE2OS44MjQwOTFdIHhlbl9icmlkZ2U6IHBvcnQgMSh2aWYxLjApIGVudGVy
aW5nIGZvcndhcmRpbmcgc3RhdGUNCm1hcHBpbmcga2VybmVsIGludG8gcGh5c2ljYWwgbWVt
b3J5DQphYm91dCB0byBnZXQgc3RhcnRlZC4uLg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6MzU6
NDhdIHRyYXBzLmM6MjQzMjpkMiBEb21haW4gYXR0ZW1wdGVkIFdSTVNSIDAwMDAwMDAwYzAw
MTAwMDQgZnJvbSAweDAwMDA4MDc2YzBiOTQwNDEgdG8gMHgwMDAwMDAwMDAwMDBhYmNkLg0K
WyAgMTc2LjMxMTk4MV0geGVuLWJsa2JhY2s6cmluZy1yZWYgOCwgZXZlbnQtY2hhbm5lbCA5
LCBwcm90b2NvbCAxICh4ODZfNjQtYWJpKQ0KWyAgMTc2LjU4OTQ4NF0geGVuLWJsa2JhY2s6
cmluZy1yZWYgOSwgZXZlbnQtY2hhbm5lbCAxMCwgcHJvdG9jb2wgMSAoeDg2XzY0LWFiaSkN
ClsgIDE3Ni44NDAzNDFdIHhlbl9icmlkZ2U6IHBvcnQgMih2aWYyLjApIGVudGVyaW5nIGZv
cndhcmRpbmcgc3RhdGUNClsgIDE3Ni44NDExMTNdIHhlbl9icmlkZ2U6IHBvcnQgMih2aWYy
LjApIGVudGVyaW5nIGZvcndhcmRpbmcgc3RhdGUNClsgIDE5MS44NzU1MTRdIGRldmljZSB2
aWYzLjAgZW50ZXJlZCBwcm9taXNjdW91cyBtb2RlDQpbICAxOTEuOTA1MDYyXSB4ZW5fYnJp
ZGdlOiBwb3J0IDIodmlmMi4wKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0YXRlDQptYXBwaW5n
IGtlcm5lbCBpbnRvIHBoeXNpY2FsIG1lbW9yeQ0KYWJvdXQgdG8gZ2V0IHN0YXJ0ZWQuLi4N
CihYRU4pIFsyMDExLTEwLTI2IDEzOjM2OjA4XSB0cmFwcy5jOjI0MzI6ZDMgRG9tYWluIGF0
dGVtcHRlZCBXUk1TUiAwMDAwMDAwMGMwMDEwMDA0IGZyb20gMHgwMDAwZTVmMDM5ZGU2YjAw
IHRvIDB4MDAwMDAwMDAwMDAwYWJjZC4NClsgIDE5NS44MjM5NzZdIHhlbi1ibGtiYWNrOnJp
bmctcmVmIDgsIGV2ZW50LWNoYW5uZWwgOSwgcHJvdG9jb2wgMSAoeDg2XzY0LWFiaSkNClsg
IDE5NS45NjYxODVdIHhlbi1ibGtiYWNrOnJpbmctcmVmIDksIGV2ZW50LWNoYW5uZWwgMTAs
IHByb3RvY29sIDEgKHg4Nl82NC1hYmkpDQpbICAxOTYuMzE0NDYzXSB4ZW5fYnJpZGdlOiBw
b3J0IDModmlmMy4wKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0YXRlDQpbICAxOTYuMzE1MjMw
XSB4ZW5fYnJpZGdlOiBwb3J0IDModmlmMy4wKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0YXRl
DQpbICAyMTAuMjY1MzE3XSBkZXZpY2UgdmlmNC4wIGVudGVyZWQgcHJvbWlzY3VvdXMgbW9k
ZQ0KWyAgMjExLjM2MTM1OV0geGVuX2JyaWRnZTogcG9ydCAzKHZpZjMuMCkgZW50ZXJpbmcg
Zm9yd2FyZGluZyBzdGF0ZQ0KbWFwcGluZyBrZXJuZWwgaW50byBwaHlzaWNhbCBtZW1vcnkN
CmFib3V0IHRvIGdldCBzdGFydGVkLi4uDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozNjoyN10g
dHJhcHMuYzoyNDMyOmQ0IERvbWFpbiBhdHRlbXB0ZWQgV1JNU1IgMDAwMDAwMDBjMDAxMDAw
NCBmcm9tIDB4MDAwMGU1ZjAzOWRlNmIwMCB0byAweDAwMDAwMDAwMDAwMGFiY2QuDQpbICAy
MTQuNzA4MTQ4XSB4ZW4tYmxrYmFjazpyaW5nLXJlZiA4LCBldmVudC1jaGFubmVsIDksIHBy
b3RvY29sIDEgKHg4Nl82NC1hYmkpDQpbICAyMTQuOTQxMzczXSB4ZW4tYmxrYmFjazpyaW5n
LXJlZiA5LCBldmVudC1jaGFubmVsIDEwLCBwcm90b2NvbCAxICh4ODZfNjQtYWJpKQ0KWyAg
MjE1LjIzMzQ1NV0geGVuX2JyaWRnZTogcG9ydCA0KHZpZjQuMCkgZW50ZXJpbmcgZm9yd2Fy
ZGluZyBzdGF0ZQ0KWyAgMjE1LjIzNDI0Nl0geGVuX2JyaWRnZTogcG9ydCA0KHZpZjQuMCkg
ZW50ZXJpbmcgZm9yd2FyZGluZyBzdGF0ZQ0KWyAgMjMwLjI3MjA2OF0geGVuX2JyaWRnZTog
cG9ydCA0KHZpZjQuMCkgZW50ZXJpbmcgZm9yd2FyZGluZyBzdGF0ZQ0KWyAgMjMzLjE2OTUx
N10gZGV2aWNlIHZpZjUuMCBlbnRlcmVkIHByb21pc2N1b3VzIG1vZGUNCm1hcHBpbmcga2Vy
bmVsIGludG8gcGh5c2ljYWwgbWVtb3J5DQphYm91dCB0byBnZXQgc3RhcnRlZC4uLg0KKFhF
TikgWzIwMTEtMTAtMjYgMTM6MzY6NDldIHRyYXBzLmM6MjQzMjpkNSBEb21haW4gYXR0ZW1w
dGVkIFdSTVNSIDAwMDAwMDAwYzAwMTAwMDQgZnJvbSAweDAwMDBlZjcwZmZmYjFmMWUgdG8g
MHgwMDAwMDAwMDAwMDBhYmNkLg0KWyAgMjM3LjAzOTUxM10geGVuLWJsa2JhY2s6cmluZy1y
ZWYgOCwgZXZlbnQtY2hhbm5lbCA5LCBwcm90b2NvbCAxICh4ODZfNjQtYWJpKQ0KWyAgMjM3
LjIxMTM2N10geGVuLWJsa2JhY2s6cmluZy1yZWYgOSwgZXZlbnQtY2hhbm5lbCAxMCwgcHJv
dG9jb2wgMSAoeDg2XzY0LWFiaSkNClsgIDIzNy43MDUwMThdIHhlbl9icmlkZ2U6IHBvcnQg
NSh2aWY1LjApIGVudGVyaW5nIGZvcndhcmRpbmcgc3RhdGUNClsgIDIzNy43MDU3ODldIHhl
bl9icmlkZ2U6IHBvcnQgNSh2aWY1LjApIGVudGVyaW5nIGZvcndhcmRpbmcgc3RhdGUNClsg
IDI1Mi43NjgxNzBdIHhlbl9icmlkZ2U6IHBvcnQgNSh2aWY1LjApIGVudGVyaW5nIGZvcndh
cmRpbmcgc3RhdGUNClsgIDI1OS4xODcyMzVdIGRldmljZSB2aWY2LjAgZW50ZXJlZCBwcm9t
aXNjdW91cyBtb2RlDQptYXBwaW5nIGtlcm5lbCBpbnRvIHBoeXNpY2FsIG1lbW9yeQ0KYWJv
dXQgdG8gZ2V0IHN0YXJ0ZWQuLi4NCihYRU4pIFsyMDExLTEwLTI2IDEzOjM3OjE4XSB0cmFw
cy5jOjI0MzI6ZDYgRG9tYWluIGF0dGVtcHRlZCBXUk1TUiAwMDAwMDAwMGMwMDEwMDA0IGZy
b20gMHgwMDAwZTVmMDM5ZGU2YjAwIHRvIDB4MDAwMDAwMDAwMDAwYWJjZC4NClsgIDI2Ni4w
NzM1ODZdIHhlbi1ibGtiYWNrOnJpbmctcmVmIDgsIGV2ZW50LWNoYW5uZWwgOSwgcHJvdG9j
b2wgMSAoeDg2XzY0LWFiaSkNClsgIDI2Ny4zMTI0ODVdIHhlbi1ibGtiYWNrOnJpbmctcmVm
IDksIGV2ZW50LWNoYW5uZWwgMTAsIHByb3RvY29sIDEgKHg4Nl82NC1hYmkpDQpbICAyNjgu
MzIzNDM2XSB4ZW5fYnJpZGdlOiBwb3J0IDYodmlmNi4wKSBlbnRlcmluZyBmb3J3YXJkaW5n
IHN0YXRlDQpbICAyNjguMzMyODY5XSB4ZW5fYnJpZGdlOiBwb3J0IDYodmlmNi4wKSBlbnRl
cmluZyBmb3J3YXJkaW5nIHN0YXRlDQpbICAyODMuMzYwMTE3XSB4ZW5fYnJpZGdlOiBwb3J0
IDYodmlmNi4wKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0YXRlDQpbICAyOTUuMzY4OTIxXSBk
ZXZpY2UgdmlmNy4wIGVudGVyZWQgcHJvbWlzY3VvdXMgbW9kZQ0KbWFwcGluZyBrZXJuZWwg
aW50byBwaHlzaWNhbCBtZW1vcnkNCmFib3V0IHRvIGdldCBzdGFydGVkLi4uDQooWEVOKSBb
MjAxMS0xMC0yNiAxMzozNzo1Ml0gdHJhcHMuYzoyNDMyOmQ3IERvbWFpbiBhdHRlbXB0ZWQg
V1JNU1IgMDAwMDAwMDBjMDAxMDAwNCBmcm9tIDB4MDAwMDQyYjQ0YmNkYTEwNSB0byAweDAw
MDAwMDAwMDAwMGFiY2QuDQpbICAyOTkuMjY0NTkyXSB4ZW4tYmxrYmFjazpyaW5nLXJlZiA4
LCBldmVudC1jaGFubmVsIDksIHByb3RvY29sIDEgKHg4Nl82NC1hYmkpDQpbICAyOTkuNjcz
MjIyXSB4ZW4tYmxrYmFjazpyaW5nLXJlZiA5LCBldmVudC1jaGFubmVsIDEwLCBwcm90b2Nv
bCAxICh4ODZfNjQtYWJpKQ0KWyAgMjk5LjkzMDgzN10geGVuX2JyaWRnZTogcG9ydCA3KHZp
ZjcuMCkgZW50ZXJpbmcgZm9yd2FyZGluZyBzdGF0ZQ0KWyAgMjk5LjkzMTA1Nl0geGVuX2Jy
aWRnZTogcG9ydCA3KHZpZjcuMCkgZW50ZXJpbmcgZm9yd2FyZGluZyBzdGF0ZQ0KWyAgMzE0
Ljk3NjQzN10geGVuX2JyaWRnZTogcG9ydCA3KHZpZjcuMCkgZW50ZXJpbmcgZm9yd2FyZGlu
ZyBzdGF0ZQ0KWyAgMzI0LjQ5ODIyMV0gZGV2aWNlIHZpZjguMCBlbnRlcmVkIHByb21pc2N1
b3VzIG1vZGUNCm1hcHBpbmcga2VybmVsIGludG8gcGh5c2ljYWwgbWVtb3J5DQphYm91dCB0
byBnZXQgc3RhcnRlZC4uLg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6Mzg6MjFdIHRyYXBzLmM6
MjQzMjpkOCBEb21haW4gYXR0ZW1wdGVkIFdSTVNSIDAwMDAwMDAwYzAwMTAwMDQgZnJvbSAw
eDAwMDBiMTE1YzQyMzYxOGYgdG8gMHgwMDAwMDAwMDAwMDBhYmNkLg0KWyAgMzI4Ljg2MDcw
Ml0geGVuLWJsa2JhY2s6cmluZy1yZWYgOCwgZXZlbnQtY2hhbm5lbCA5LCBwcm90b2NvbCAx
ICh4ODZfNjQtYWJpKQ0KWyAgMzI5LjE1OTk1NF0geGVuLWJsa2JhY2s6cmluZy1yZWYgOSwg
ZXZlbnQtY2hhbm5lbCAxMCwgcHJvdG9jb2wgMSAoeDg2XzY0LWFiaSkNClsgIDMzMC4yODQ3
OTZdIHhlbl9icmlkZ2U6IHBvcnQgOCh2aWY4LjApIGVudGVyaW5nIGZvcndhcmRpbmcgc3Rh
dGUNClsgIDMzMC4yODUwNjRdIHhlbl9icmlkZ2U6IHBvcnQgOCh2aWY4LjApIGVudGVyaW5n
IGZvcndhcmRpbmcgc3RhdGUNClsgIDM0NS4zMTI5MzJdIHhlbl9icmlkZ2U6IHBvcnQgOCh2
aWY4LjApIGVudGVyaW5nIGZvcndhcmRpbmcgc3RhdGUNClsgIDM1NS4wMDc5NDFdIGRldmlj
ZSB2aWY5LjAgZW50ZXJlZCBwcm9taXNjdW91cyBtb2RlDQptYXBwaW5nIGtlcm5lbCBpbnRv
IHBoeXNpY2FsIG1lbW9yeQ0KYWJvdXQgdG8gZ2V0IHN0YXJ0ZWQuLi4NCihYRU4pIFsyMDEx
LTEwLTI2IDEzOjM4OjUyXSB0cmFwcy5jOjI0MzI6ZDkgRG9tYWluIGF0dGVtcHRlZCBXUk1T
UiAwMDAwMDAwMGMwMDEwMDA0IGZyb20gMHgwMDAwZWY3MGZmZmIxZjFlIHRvIDB4MDAwMDAw
MDAwMDAwYWJjZC4NClsgIDM1OS4zOTgyMjRdIHhlbi1ibGtiYWNrOnJpbmctcmVmIDgsIGV2
ZW50LWNoYW5uZWwgOSwgcHJvdG9jb2wgMSAoeDg2XzY0LWFiaSkNClsgIDM1OS42NDUyOTld
IHhlbi1ibGtiYWNrOnJpbmctcmVmIDksIGV2ZW50LWNoYW5uZWwgMTAsIHByb3RvY29sIDEg
KHg4Nl82NC1hYmkpDQpbICAzNjAuNDExMzQ2XSB4ZW5fYnJpZGdlOiBwb3J0IDkodmlmOS4w
KSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0YXRlDQpbICAzNjAuNDEyMDU4XSB4ZW5fYnJpZGdl
OiBwb3J0IDkodmlmOS4wKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0YXRlDQpbICAzNzUuNDU2
MjExXSB4ZW5fYnJpZGdlOiBwb3J0IDkodmlmOS4wKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0
YXRlDQpbICA0MTIuMDk3ODY1XSBkZXZpY2UgdmlmMTAuMCBlbnRlcmVkIHByb21pc2N1b3Vz
IG1vZGUNCihYRU4pIFsyMDExLTEwLTI2IDEzOjM5OjQ1XSBBTUQtVmk6IERpc2FibGU6IGRl
dmljZSBpZCA9IDB4MDQwMCwgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUgPSAzDQooWEVOKSBb
MjAxMS0xMC0yNiAxMzozOTo0NV0gQU1ELVZpOiBTZXR1cCBJL08gcGFnZSB0YWJsZTogZGV2
aWNlIGlkID0gMHgwNDAwLCByb290IHRhYmxlID0gMHgxOWNlZTYwMDAsIGRvbWFpbiA9IDEw
LCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjM5OjQ1XSBBTUQtVmk6
IFJlLWFzc2lnbiAwNDowMC4wIGZyb20gZG9tYWluIDAgdG8gZG9tYWluIDEwDQooWEVOKSBb
MjAxMS0xMC0yNiAxMzozOTo0NV0gQU1ELVZpOiBEaXNhYmxlOiBkZXZpY2UgaWQgPSAweDA0
MDEsIGRvbWFpbiA9IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6
Mzk6NDVdIEFNRC1WaTogU2V0dXAgSS9PIHBhZ2UgdGFibGU6IGRldmljZSBpZCA9IDB4MDQw
MSwgcm9vdCB0YWJsZSA9IDB4MTljZWU2MDAwLCBkb21haW4gPSAxMCwgcGFnaW5nIG1vZGUg
PSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozOTo0NV0gQU1ELVZpOiBSZS1hc3NpZ24gMDQ6
MDAuMSBmcm9tIGRvbWFpbiAwIHRvIGRvbWFpbiAxMA0KKFhFTikgWzIwMTEtMTAtMjYgMTM6
Mzk6NDZdIEFNRC1WaTogRGlzYWJsZTogZGV2aWNlIGlkID0gMHgwNDAyLCBkb21haW4gPSAw
LCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjM5OjQ2XSBBTUQtVmk6
IFNldHVwIEkvTyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDA0MDIsIHJvb3QgdGFibGUg
PSAweDE5Y2VlNjAwMCwgZG9tYWluID0gMTAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIw
MTEtMTAtMjYgMTM6Mzk6NDZdIEFNRC1WaTogUmUtYXNzaWduIDA0OjAwLjIgZnJvbSBkb21h
aW4gMCB0byBkb21haW4gMTANCihYRU4pIFsyMDExLTEwLTI2IDEzOjM5OjQ2XSBBTUQtVmk6
IERpc2FibGU6IGRldmljZSBpZCA9IDB4MDQwMywgZG9tYWluID0gMCwgcGFnaW5nIG1vZGUg
PSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozOTo0Nl0gQU1ELVZpOiBTZXR1cCBJL08gcGFn
ZSB0YWJsZTogZGV2aWNlIGlkID0gMHgwNDAzLCByb290IHRhYmxlID0gMHgxOWNlZTYwMDAs
IGRvbWFpbiA9IDEwLCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjM5
OjQ2XSBBTUQtVmk6IFJlLWFzc2lnbiAwNDowMC4zIGZyb20gZG9tYWluIDAgdG8gZG9tYWlu
IDEwDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozOTo0Nl0gQU1ELVZpOiBEaXNhYmxlOiBkZXZp
Y2UgaWQgPSAweDA0MDQsIGRvbWFpbiA9IDAsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIw
MTEtMTAtMjYgMTM6Mzk6NDZdIEFNRC1WaTogU2V0dXAgSS9PIHBhZ2UgdGFibGU6IGRldmlj
ZSBpZCA9IDB4MDQwNCwgcm9vdCB0YWJsZSA9IDB4MTljZWU2MDAwLCBkb21haW4gPSAxMCwg
cGFnaW5nIG1vZGUgPSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozOTo0Nl0gQU1ELVZpOiBS
ZS1hc3NpZ24gMDQ6MDAuNCBmcm9tIGRvbWFpbiAwIHRvIGRvbWFpbiAxMA0KKFhFTikgWzIw
MTEtMTAtMjYgMTM6Mzk6NDZdIEFNRC1WaTogRGlzYWJsZTogZGV2aWNlIGlkID0gMHgwNDA1
LCBkb21haW4gPSAwLCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjM5
OjQ2XSBBTUQtVmk6IFNldHVwIEkvTyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDA0MDUs
IHJvb3QgdGFibGUgPSAweDE5Y2VlNjAwMCwgZG9tYWluID0gMTAsIHBhZ2luZyBtb2RlID0g
Mw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6Mzk6NDZdIEFNRC1WaTogUmUtYXNzaWduIDA0OjAw
LjUgZnJvbSBkb21haW4gMCB0byBkb21haW4gMTANCihYRU4pIFsyMDExLTEwLTI2IDEzOjM5
OjQ2XSBBTUQtVmk6IERpc2FibGU6IGRldmljZSBpZCA9IDB4MDQwNiwgZG9tYWluID0gMCwg
cGFnaW5nIG1vZGUgPSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozOTo0Nl0gQU1ELVZpOiBT
ZXR1cCBJL08gcGFnZSB0YWJsZTogZGV2aWNlIGlkID0gMHgwNDA2LCByb290IHRhYmxlID0g
MHgxOWNlZTYwMDAsIGRvbWFpbiA9IDEwLCBwYWdpbmcgbW9kZSA9IDMNCihYRU4pIFsyMDEx
LTEwLTI2IDEzOjM5OjQ2XSBBTUQtVmk6IFJlLWFzc2lnbiAwNDowMC42IGZyb20gZG9tYWlu
IDAgdG8gZG9tYWluIDEwDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozOTo0Nl0gQU1ELVZpOiBE
aXNhYmxlOiBkZXZpY2UgaWQgPSAweDA0MDcsIGRvbWFpbiA9IDAsIHBhZ2luZyBtb2RlID0g
Mw0KKFhFTikgWzIwMTEtMTAtMjYgMTM6Mzk6NDZdIEFNRC1WaTogU2V0dXAgSS9PIHBhZ2Ug
dGFibGU6IGRldmljZSBpZCA9IDB4MDQwNywgcm9vdCB0YWJsZSA9IDB4MTljZWU2MDAwLCBk
b21haW4gPSAxMCwgcGFnaW5nIG1vZGUgPSAzDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozOTo0
Nl0gQU1ELVZpOiBSZS1hc3NpZ24gMDQ6MDAuNyBmcm9tIGRvbWFpbiAwIHRvIGRvbWFpbiAx
MA0KbWFwcGluZyBrZXJuZWwgaW50byBwaHlzaWNhbCBtZW1vcnkNCmFib3V0IHRvIGdldCBz
dGFydGVkLi4uDQooWEVOKSBbMjAxMS0xMC0yNiAxMzozOTo1OF0gdHJhcHMuYzoyNDMyOmQx
MCBEb21haW4gYXR0ZW1wdGVkIFdSTVNSIDAwMDAwMDAwYzAwMTAwMDQgZnJvbSAweDAwMDA3
ODUxOTBmMzBjNGYgdG8gMHgwMDAwMDAwMDAwMDBhYmNkLg0KWyAgNDI2LjIxODIzN10geGVu
LWJsa2JhY2s6cmluZy1yZWYgOSwgZXZlbnQtY2hhbm5lbCAxMCwgcHJvdG9jb2wgMSAoeDg2
XzY0LWFiaSkNClsgIDQyNi40OTUwMjddIHhlbi1ibGtiYWNrOnJpbmctcmVmIDEwLCBldmVu
dC1jaGFubmVsIDExLCBwcm90b2NvbCAxICh4ODZfNjQtYWJpKQ0KWyAgNDI2Ljg1OTk2N10g
eGVuLWJsa2JhY2s6cmluZy1yZWYgMTEsIGV2ZW50LWNoYW5uZWwgMTIsIHByb3RvY29sIDEg
KHg4Nl82NC1hYmkpDQpbICA0MjcuMDMwNDIyXSBwY2liYWNrIDAwMDA6MDQ6MDAuMTogZW5h
YmxpbmcgZGV2aWNlICgwMDAwIC0+IDAwMDIpDQpbICA0MjcuMDMxMzE0XSB4ZW46IHJlZ2lz
dGVyaW5nIGdzaSA0MCB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkgMQ0KWyAgNDI3LjA0NDMzNF0g
eGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5nIGlycSA0MCBmb3IgZ3NpIDQwDQpbICA0Mjcu
MDQ1MDU2XSB4ZW46IC0tPiBwaXJxPTQwIC0+IGlycT00MCAoZ3NpPTQwKQ0KWyAgNDI3LjA1
NzM0NF0gQWxyZWFkeSBzZXR1cCB0aGUgR1NJIDo0MA0KWyAgNDI3LjA1ODI3NV0gcGNpYmFj
ayAwMDAwOjA0OjAwLjE6IFBDSSBJTlQgQSAtPiBHU0kgNDAgKGxldmVsLCBsb3cpIC0+IElS
USA0MA0KWyAgNDI3LjA3MDg0N10gcGNpYmFjayAwMDAwOjA0OjAwLjE6IHNldHRpbmcgbGF0
ZW5jeSB0aW1lciB0byA2NA0KWyAgNDI3LjEwNjQzNl0gcGNpYmFjayAwMDAwOjA0OjAwLjM6
IGVuYWJsaW5nIGRldmljZSAoMDAwMCAtPiAwMDAyKQ0KWyAgNDI3LjEwNzMwM10geGVuOiBy
ZWdpc3RlcmluZyBnc2kgNDEgdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDENClsgIDQyNy4xMTk0
NDhdIHhlbl9tYXBfcGlycV9nc2k6IHJldHVybmluZyBpcnEgNDEgZm9yIGdzaSA0MQ0KWyAg
NDI3LjEyMDI4OF0geGVuOiAtLT4gcGlycT00MSAtPiBpcnE9NDEgKGdzaT00MSkNClsgIDQy
Ny4xMzIzMDRdIEFscmVhZHkgc2V0dXAgdGhlIEdTSSA6NDENClsgIDQyNy4xMzMyNjldIHBj
aWJhY2sgMDAwMDowNDowMC4zOiBQQ0kgSU5UIEIgLT4gR1NJIDQxIChsZXZlbCwgbG93KSAt
PiBJUlEgNDENClsgIDQyNy4xNDc1NDJdIHBjaWJhY2sgMDAwMDowNDowMC4zOiBzZXR0aW5n
IGxhdGVuY3kgdGltZXIgdG8gNjQNClsgIDQyNy4xODEzNDhdIHBjaWJhY2sgMDAwMDowNDow
MC41OiBlbmFibGluZyBkZXZpY2UgKDAwMDAgLT4gMDAwMikNClsgIDQyNy4xODIyNTddIHhl
bjogcmVnaXN0ZXJpbmcgZ3NpIDQyIHRyaWdnZXJpbmcgMCBwb2xhcml0eSAxDQpbICA0Mjcu
MTk0MDU3XSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1cm5pbmcgaXJxIDQyIGZvciBnc2kgNDIN
ClsgIDQyNy4xOTQ5NzFdIHhlbjogLS0+IHBpcnE9NDIgLT4gaXJxPTQyIChnc2k9NDIpDQpb
ICA0MjcuMjA2ODE5XSBBbHJlYWR5IHNldHVwIHRoZSBHU0kgOjQyDQpbICA0MjcuMjA3Nzg5
XSBwY2liYWNrIDAwMDA6MDQ6MDAuNTogUENJIElOVCBDIC0+IEdTSSA0MiAobGV2ZWwsIGxv
dykgLT4gSVJRIDQyDQpbICA0MjcuMjIwMjMxXSBwY2liYWNrIDAwMDA6MDQ6MDAuNTogc2V0
dGluZyBsYXRlbmN5IHRpbWVyIHRvIDY0DQpbICA0MjcuMjU0NTc5XSBwY2liYWNrIDAwMDA6
MDQ6MDAuNzogZW5hYmxpbmcgZGV2aWNlICgwMDAwIC0+IDAwMDIpDQpbICA0MjcuMjU1NTE5
XSB4ZW46IHJlZ2lzdGVyaW5nIGdzaSA0MyB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkgMQ0KWyAg
NDI3LjI2NzI2M10geGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5nIGlycSA0MyBmb3IgZ3Np
IDQzDQpbICA0MjcuMjY4MTc3XSB4ZW46IC0tPiBwaXJxPTQzIC0+IGlycT00MyAoZ3NpPTQz
KQ0KWyAgNDI3LjI3OTcwMl0gQWxyZWFkeSBzZXR1cCB0aGUgR1NJIDo0Mw0KWyAgNDI3LjI4
MDY1OF0gcGNpYmFjayAwMDAwOjA0OjAwLjc6IFBDSSBJTlQgRCAtPiBHU0kgNDMgKGxldmVs
LCBsb3cpIC0+IElSUSA0Mw0KWyAgNDI3LjI5NTQzNV0gcGNpYmFjayAwMDAwOjA0OjAwLjc6
IHNldHRpbmcgbGF0ZW5jeSB0aW1lciB0byA2NA0KWyAgNDI3LjMzMjc0M10gcGNpYmFjayAw
MDAwOjA0OjAwLjA6IGVuYWJsaW5nIGRldmljZSAoMDAwMCAtPiAwMDAyKQ0KWyAgNDI3LjMz
MzQ4NV0geGVuOiByZWdpc3RlcmluZyBnc2kgNDAgdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDEN
ClsgIDQyNy4zNDU2NTRdIHhlbl9tYXBfcGlycV9nc2k6IHJldHVybmluZyBpcnEgNDAgZm9y
IGdzaSA0MA0KWyAgNDI3LjM0NjE0OV0geGVuOiAtLT4gcGlycT00MCAtPiBpcnE9NDAgKGdz
aT00MCkNClsgIDQyNy4zNTgwNTBdIEFscmVhZHkgc2V0dXAgdGhlIEdTSSA6NDANClsgIDQy
Ny4zNTkwMjJdIHBjaWJhY2sgMDAwMDowNDowMC4wOiBQQ0kgSU5UIEEgLT4gR1NJIDQwIChs
ZXZlbCwgbG93KSAtPiBJUlEgNDANClsgIDQyNy4zNzA0ODRdIHBjaWJhY2sgMDAwMDowNDow
MC4wOiBzZXR0aW5nIGxhdGVuY3kgdGltZXIgdG8gNjQNClsgIDQyNy4zOTk3NTddIHhlbl9i
cmlkZ2U6IHBvcnQgMTAodmlmMTAuMCkgZW50ZXJpbmcgZm9yd2FyZGluZyBzdGF0ZQ0KWyAg
NDI3LjQwMDQ4Nl0geGVuX2JyaWRnZTogcG9ydCAxMCh2aWYxMC4wKSBlbnRlcmluZyBmb3J3
YXJkaW5nIHN0YXRlDQpbICA0MjcuNDM2MzM4XSBwY2liYWNrIDAwMDA6MDQ6MDAuMjogZW5h
YmxpbmcgZGV2aWNlICgwMDAwIC0+IDAwMDIpDQpbICA0MjcuNDM3MTQ4XSB4ZW46IHJlZ2lz
dGVyaW5nIGdzaSA0MSB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkgMQ0KWyAgNDI3LjQ0ODkzN10g
eGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5nIGlycSA0MSBmb3IgZ3NpIDQxDQpbICA0Mjcu
NDQ5MjM4XSB4ZW46IC0tPiBwaXJxPTQxIC0+IGlycT00MSAoZ3NpPTQxKQ0KWyAgNDI3LjQ2
MDg3Nl0gQWxyZWFkeSBzZXR1cCB0aGUgR1NJIDo0MQ0KWyAgNDI3LjQ2MTg0OF0gcGNpYmFj
ayAwMDAwOjA0OjAwLjI6IFBDSSBJTlQgQiAtPiBHU0kgNDEgKGxldmVsLCBsb3cpIC0+IElS
USA0MQ0KWyAgNDI3LjQ3MzY2NF0gcGNpYmFjayAwMDAwOjA0OjAwLjI6IHNldHRpbmcgbGF0
ZW5jeSB0aW1lciB0byA2NA0KWyAgNDI3LjUzNzgzN10gcGNpYmFjayAwMDAwOjA0OjAwLjQ6
IGVuYWJsaW5nIGRldmljZSAoMDAwMCAtPiAwMDAyKQ0KWyAgNDI3LjUzODYxOF0geGVuOiBy
ZWdpc3RlcmluZyBnc2kgNDIgdHJpZ2dlcmluZyAwIHBvbGFyaXR5IDENClsgIDQyNy41NTMy
OTddIHhlbl9tYXBfcGlycV9nc2k6IHJldHVybmluZyBpcnEgNDIgZm9yIGdzaSA0Mg0KWyAg
NDI3LjU1NDA5Nl0geGVuOiAtLT4gcGlycT00MiAtPiBpcnE9NDIgKGdzaT00MikNClsgIDQy
Ny41NjgxMTNdIEFscmVhZHkgc2V0dXAgdGhlIEdTSSA6NDINClsgIDQyNy41NjgxMTZdIHBj
aWJhY2sgMDAwMDowNDowMC40OiBQQ0kgSU5UIEMgLT4gR1NJIDQyIChsZXZlbCwgbG93KSAt
PiBJUlEgNDINClsgIDQyNy41Njk3NzldIHBjaWJhY2sgMDAwMDowNDowMC40OiBzZXR0aW5n
IGxhdGVuY3kgdGltZXIgdG8gNjQNClsgIDQyNy42MzE4NTFdIHBjaWJhY2sgMDAwMDowNDow
MC42OiBlbmFibGluZyBkZXZpY2UgKDAwMDAgLT4gMDAwMikNClsgIDQyNy42MzI1NzFdIHhl
bjogcmVnaXN0ZXJpbmcgZ3NpIDQzIHRyaWdnZXJpbmcgMCBwb2xhcml0eSAxDQpbICA0Mjcu
NjQ3MTcxXSB4ZW5fbWFwX3BpcnFfZ3NpOiByZXR1cm5pbmcgaXJxIDQzIGZvciBnc2kgNDMN
ClsgIDQyNy42NDgxMjFdIHhlbjogLS0+IHBpcnE9NDMgLT4gaXJxPTQzIChnc2k9NDMpDQpb
ICA0MjcuNjYyMjUzXSBBbHJlYWR5IHNldHVwIHRoZSBHU0kgOjQzDQpbICA0MjcuNjYzMTc0
XSBwY2liYWNrIDAwMDA6MDQ6MDAuNjogUENJIElOVCBEIC0+IEdTSSA0MyAobGV2ZWwsIGxv
dykgLT4gSVJRIDQzDQpbICA0MjcuNjc2MTc5XSBwY2liYWNrIDAwMDA6MDQ6MDAuNjogc2V0
dGluZyBsYXRlbmN5IHRpbWVyIHRvIDY0DQpbICA0NDIuNDMyMTgyXSB4ZW5fYnJpZGdlOiBw
b3J0IDEwKHZpZjEwLjApIGVudGVyaW5nIGZvcndhcmRpbmcgc3RhdGUNClsgIDQ3NS42MzI1
MzNdIGRldmljZSB2aWYxMS4wIGVudGVyZWQgcHJvbWlzY3VvdXMgbW9kZQ0KbWFwcGluZyBr
ZXJuZWwgaW50byBwaHlzaWNhbCBtZW1vcnkNCmFib3V0IHRvIGdldCBzdGFydGVkLi4uDQoo
WEVOKSBbMjAxMS0xMC0yNiAxMzo0MDo1M10gdHJhcHMuYzoyNDMyOmQxMSBEb21haW4gYXR0
ZW1wdGVkIFdSTVNSIDAwMDAwMDAwYzAwMTAwMDQgZnJvbSAweDAwMDA4MDc2YzBiOTQwNDEg
dG8gMHgwMDAwMDAwMDAwMDBhYmNkLg0KWyAgNDgwLjI2OTcwMF0geGVuLWJsa2JhY2s6cmlu
Zy1yZWYgOCwgZXZlbnQtY2hhbm5lbCA5LCBwcm90b2NvbCAxICh4ODZfNjQtYWJpKQ0KWyAg
NDgwLjYwMjk3OV0geGVuLWJsa2JhY2s6cmluZy1yZWYgOSwgZXZlbnQtY2hhbm5lbCAxMCwg
cHJvdG9jb2wgMSAoeDg2XzY0LWFiaSkNClsgIDQ4MC44ODAyOThdIHhlbl9icmlkZ2U6IHBv
cnQgMTEodmlmMTEuMCkgZW50ZXJpbmcgZm9yd2FyZGluZyBzdGF0ZQ0KWyAgNDgwLjg4NTQ2
OV0geGVuX2JyaWRnZTogcG9ydCAxMSh2aWYxMS4wKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0
YXRlDQpbICA0OTUuOTA0OTEyXSB4ZW5fYnJpZGdlOiBwb3J0IDExKHZpZjExLjApIGVudGVy
aW5nIGZvcndhcmRpbmcgc3RhdGUNClsgIDUyOC4yNzYzMTFdIGRldmljZSB2aWYxMi4wIGVu
dGVyZWQgcHJvbWlzY3VvdXMgbW9kZQ0KKFhFTikgWzIwMTEtMTAtMjYgMTM6NDE6NDJdIEFN
RC1WaTogRGlzYWJsZTogZGV2aWNlIGlkID0gMHgwMGE0LCBkb21haW4gPSAwLCBwYWdpbmcg
bW9kZSA9IDMNCihYRU4pIFsyMDExLTEwLTI2IDEzOjQxOjQyXSBBTUQtVmk6IFNldHVwIEkv
TyBwYWdlIHRhYmxlOiBkZXZpY2UgaWQgPSAweDAwYTQsIHJvb3QgdGFibGUgPSAweDFmMTAw
ODAwMCwgZG9tYWluID0gMTIsIHBhZ2luZyBtb2RlID0gMw0KKFhFTikgWzIwMTEtMTAtMjYg
MTM6NDE6NDJdIEFNRC1WaTogUmUtYXNzaWduIDAzOjA2LjAgZnJvbSBkb21haW4gMCB0byBk
b21haW4gMTINCm1hcHBpbmcga2VybmVsIGludG8gcGh5c2ljYWwgbWVtb3J5DQphYm91dCB0
byBnZXQgc3RhcnRlZC4uLg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6NDE6NTRdIHRyYXBzLmM6
MjQzMjpkMTIgRG9tYWluIGF0dGVtcHRlZCBXUk1TUiAwMDAwMDAwMGMwMDEwMDA0IGZyb20g
MHgwMDAwZWY3MGZmZmIxZjFlIHRvIDB4MDAwMDAwMDAwMDAwYWJjZC4NClsgIDU0MS43MjYw
NDRdIHhlbi1ibGtiYWNrOnJpbmctcmVmIDksIGV2ZW50LWNoYW5uZWwgMTAsIHByb3RvY29s
IDEgKHg4Nl82NC1hYmkpDQpbICA1NDIuNTk1MjY4XSBwY2liYWNrIDAwMDA6MDM6MDYuMDog
ZW5hYmxpbmcgZGV2aWNlICgwMDAwIC0+IDAwMDEpDQpbICA1NDIuNTk2MTk4XSB4ZW46IHJl
Z2lzdGVyaW5nIGdzaSAyMiB0cmlnZ2VyaW5nIDAgcG9sYXJpdHkgMQ0KWyAgNTQyLjYwNzg5
NV0geGVuX21hcF9waXJxX2dzaTogcmV0dXJuaW5nIGlycSAyMiBmb3IgZ3NpIDIyDQpbICA1
NDIuNjA4MjcxXSB4ZW46IC0tPiBwaXJxPTIyIC0+IGlycT0yMiAoZ3NpPTIyKQ0KWyAgNTQy
LjYyMTYyNV0gQWxyZWFkeSBzZXR1cCB0aGUgR1NJIDoyMg0KWyAgNTQyLjYyMjExNV0gcGNp
YmFjayAwMDAwOjAzOjA2LjA6IFBDSSBJTlQgQSAtPiBHU0kgMjIgKGxldmVsLCBsb3cpIC0+
IElSUSAyMg0KWyAgNTQyLjY5MDQxNF0geGVuLWJsa2JhY2s6cmluZy1yZWYgMTAsIGV2ZW50
LWNoYW5uZWwgMTEsIHByb3RvY29sIDEgKHg4Nl82NC1hYmkpDQpbICA1NDMuNDMyOTI4XSB4
ZW5fYnJpZGdlOiBwb3J0IDEyKHZpZjEyLjApIGVudGVyaW5nIGZvcndhcmRpbmcgc3RhdGUN
ClsgIDU0My40MzM2MjBdIHhlbl9icmlkZ2U6IHBvcnQgMTIodmlmMTIuMCkgZW50ZXJpbmcg
Zm9yd2FyZGluZyBzdGF0ZQ0KWyAgNTU4LjQ5NjEzNV0geGVuX2JyaWRnZTogcG9ydCAxMih2
aWYxMi4wKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0YXRlDQooWEVOKSBbMjAxMS0xMC0yNiAx
Mzo0MzozNV0gZ3JhbnRfdGFibGUuYzoyMzc6ZDAgSW5jcmVhc2VkIG1hcHRyYWNrIHNpemUg
dG8gMiBmcmFtZXMuDQpbICA3NzYuODU3NzgwXSBkZXZpY2UgdmlmMTMuMCBlbnRlcmVkIHBy
b21pc2N1b3VzIG1vZGUNCm1hcHBpbmcga2VybmVsIGludG8gcGh5c2ljYWwgbWVtb3J5DQph
Ym91dCB0byBnZXQgc3RhcnRlZC4uLg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6NDY6MjVdIHRy
YXBzLmM6MjQzMjpkMTMgRG9tYWluIGF0dGVtcHRlZCBXUk1TUiAwMDAwMDAwMGMwMDEwMDA0
IGZyb20gMHgwMDAwZTVmMDM5ZGU2YjAwIHRvIDB4MDAwMDAwMDAwMDAwYWJjZC4NClsgIDgx
Mi45NTY4NzZdIHhlbi1ibGtiYWNrOnJpbmctcmVmIDgsIGV2ZW50LWNoYW5uZWwgOSwgcHJv
dG9jb2wgMSAoeDg2XzY0LWFiaSkNClsgIDgxMy4zODc0OTBdIHhlbi1ibGtiYWNrOnJpbmct
cmVmIDksIGV2ZW50LWNoYW5uZWwgMTAsIHByb3RvY29sIDEgKHg4Nl82NC1hYmkpDQpbICA4
MTUuMjQ1NjE1XSB4ZW5fYnJpZGdlOiBwb3J0IDEzKHZpZjEzLjApIGVudGVyaW5nIGZvcndh
cmRpbmcgc3RhdGUNClsgIDgxNS4yNDYyNTBdIHhlbl9icmlkZ2U6IHBvcnQgMTModmlmMTMu
MCkgZW50ZXJpbmcgZm9yd2FyZGluZyBzdGF0ZQ0KWyAgODMwLjMwNDUxOF0geGVuX2JyaWRn
ZTogcG9ydCAxMyh2aWYxMy4wKSBlbnRlcmluZyBmb3J3YXJkaW5nIHN0YXRlDQpbICA4ODgu
MDIwOTQzXSBkZXZpY2UgdmlmMTQuMCBlbnRlcmVkIHByb21pc2N1b3VzIG1vZGUNCm1hcHBp
bmcga2VybmVsIGludG8gcGh5c2ljYWwgbWVtb3J5DQphYm91dCB0byBnZXQgc3RhcnRlZC4u
Lg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6NDc6NTJdIHRyYXBzLmM6MjQzMjpkMTQgRG9tYWlu
IGF0dGVtcHRlZCBXUk1TUiAwMDAwMDAwMGMwMDEwMDA0IGZyb20gMHgwMDAwZTVmMDM5ZGU2
YjAwIHRvIDB4MDAwMDAwMDAwMDAwYWJjZC4NClsgIDg5OS4zNDAxNzJdIHhlbi1ibGtiYWNr
OnJpbmctcmVmIDgsIGV2ZW50LWNoYW5uZWwgOSwgcHJvdG9jb2wgMSAoeDg2XzY0LWFiaSkN
ClsgIDkwMC4xODAyMDFdIHhlbi1ibGtiYWNrOnJpbmctcmVmIDksIGV2ZW50LWNoYW5uZWwg
MTAsIHByb3RvY29sIDEgKHg4Nl82NC1hYmkpDQpbICA5MDAuNTg3Nzk2XSB2cG5fYnJpZGdl
OiBwb3J0IDEodmlmMTQuMCkgZW50ZXJpbmcgZm9yd2FyZGluZyBzdGF0ZQ0KWyAgOTAwLjU5
MDg1NV0gdnBuX2JyaWRnZTogcG9ydCAxKHZpZjE0LjApIGVudGVyaW5nIGZvcndhcmRpbmcg
c3RhdGUNClsgIDkxNS42MTYxMzFdIHZwbl9icmlkZ2U6IHBvcnQgMSh2aWYxNC4wKSBlbnRl
cmluZyBmb3J3YXJkaW5nIHN0YXRlDQpbICA5NjYuODAxMjA0XSBkZXZpY2UgdmlmMTUuMCBl
bnRlcmVkIHByb21pc2N1b3VzIG1vZGUNCm1hcHBpbmcga2VybmVsIGludG8gcGh5c2ljYWwg
bWVtb3J5DQphYm91dCB0byBnZXQgc3RhcnRlZC4uLg0KKFhFTikgWzIwMTEtMTAtMjYgMTM6
NDk6MTJdIHRyYXBzLmM6MjQzMjpkMTUgRG9tYWluIGF0dGVtcHRlZCBXUk1TUiAwMDAwMDAw
MGMwMDEwMDA0IGZyb20gMHgwMDAwZWY3MGZmZmIxZjFlIHRvIDB4MDAwMDAwMDAwMDAwYWJj
ZC4NClsgIDk4MC4xNjg2NjJdIHhlbi1ibGtiYWNrOnJpbmctcmVmIDgsIGV2ZW50LWNoYW5u
ZWwgMTUsIHByb3RvY29sIDEgKHg4Nl82NC1hYmkpDQpbICA5ODAuNjk3MDYyXSB4ZW4tYmxr
YmFjazpyaW5nLXJlZiA5LCBldmVudC1jaGFubmVsIDE2LCBwcm90b2NvbCAxICh4ODZfNjQt
YWJpKQ0KWyAgOTgxLjg5MTgwMV0geGVuX2JyaWRnZTogcG9ydCAxNCh2aWYxNS4wKSBlbnRl
cmluZyBmb3J3YXJkaW5nIHN0YXRlDQpbICA5ODEuODkyNTIxXSB4ZW5fYnJpZGdlOiBwb3J0
IDE0KHZpZjE1LjApIGVudGVyaW5nIGZvcndhcmRpbmcgc3RhdGUNClsgIDk5Ni44OTY0MzJd
IHhlbl9icmlkZ2U6IHBvcnQgMTQodmlmMTUuMCkgZW50ZXJpbmcgZm9yd2FyZGluZyBzdGF0
ZQ0K
------------11410F255244F390D
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

------------11410F255244F390D--



From xen-devel-bounces@lists.xensource.com Wed Oct 26 07:29:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 07:29:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ4UH-0008L4-LB; Wed, 26 Oct 2011 07:29:49 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ4Tc-00089C-0Y
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 07:29:08 -0700
X-Env-Sender: Wei.Huang2@amd.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1319639236!830392!1
X-Originating-IP: [216.32.180.14]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3813 invoked from network); 26 Oct 2011 14:27:17 -0000
Received: from va3ehsobe004.messaging.microsoft.com (HELO
	VA3EHSOBE004.bigfish.com) (216.32.180.14)
	by server-12.tower-182.messagelabs.com with AES128-SHA encrypted SMTP;
	26 Oct 2011 14:27:17 -0000
Received: from mail107-va3-R.bigfish.com (10.7.14.253) by
	VA3EHSOBE004.bigfish.com (10.7.40.24) with Microsoft SMTP Server id
	14.1.225.22; Wed, 26 Oct 2011 14:27:10 +0000
Received: from mail107-va3 (localhost.localdomain [127.0.0.1])	by
	mail107-va3-R.bigfish.com (Postfix) with ESMTP id 3EF4C1780443;
	Wed, 26 Oct 2011 14:27:13 +0000 (UTC)
X-SpamScore: -28
X-BigFish: VPS-28(zzbb2dK9371KfecM542M1432N98dK4015Lzz1202hzz8275bhz32i668h839h61h)
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 mail107-va3 (localhost.localdomain [127.0.0.1]) by mail107-va3
	(MessageSwitch) id 1319639229480838_9105;
	Wed, 26 Oct 2011 14:27:09 +0000 (UTC)
Received: from VA3EHSMHS030.bigfish.com (unknown [10.7.14.236])	by
	mail107-va3.bigfish.com (Postfix) with ESMTP id 6E5FD4E8052;
	Wed, 26 Oct 2011 14:27:09 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	VA3EHSMHS030.bigfish.com (10.7.99.40) with Microsoft SMTP Server id
	14.1.225.22; Wed, 26 Oct 2011 14:27:04 +0000
X-WSS-ID: 0LTOG57-02-77X-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 20F16FCC01F;	Wed, 26 Oct 2011 09:27:06 -0500 (CDT)
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;
	Wed, 26 Oct 2011 09:27:19 -0500
Received: from huangwei.amd.com (10.236.48.87) by sausexhtp01.amd.com
	(163.181.3.165) with Microsoft SMTP Server id 8.3.83.0; Wed, 26 Oct 2011
	09:27:08 -0500
Message-ID: <4EA8177D.40707@amd.com>
Date: Wed, 26 Oct 2011 09:21:49 -0500
From: Wei Huang <wei.huang2@amd.com>
User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64;
	rv:6.0.2) Gecko/20110902 Thunderbird/6.0.2
MIME-Version: 1.0
To: Sander Eikelenboom <linux@eikelenboom.it>
Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
References: <1904679511.20111018205519@eikelenboom.it>
	<20111019160801.GA22918@phenom.dumpdata.com>
	<EE335F95F28A664DB4A21289D2AA053B01E6CBBBDB@SAUSEXMBP01.amd.com>
	<707354928.20111019193003@eikelenboom.it>
	<EE335F95F28A664DB4A21289D2AA053B01E6CBBD30@SAUSEXMBP01.amd.com>
	<884563847.20111022165748@eikelenboom.it> <4EA5DDEB.90308@amd.com>
	<11510207729.20111026161232@eikelenboom.it>
In-Reply-To: <11510207729.20111026161232@eikelenboom.it>
Content-Type: text/plain; charset="ISO-8859-15"; format=flowed
Content-Transfer-Encoding: 7bit
X-OriginatorOrg: amd.com
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Rzeszutek Wilk <konrad.wilk@oracle.com>, Konrad
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: wei.huang2@amd.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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

That is good. We are preparing a series of patches for xen-4.1.3. They 
should be out in next few days. Thanks for your help on testing.

-Wei

On 10/26/2011 09:12 AM, Sander Eikelenboom wrote:
> Hello Wei,
>
> Sorry you were right, i'm a bit accustomed that patches apply to the root of the project, this one was for /xen specifically.
> I have done a lot of reboots with the patch applied on:
> - xen 4.1.3-rc1-pre
> - dom0 kernel from Konrad's linux-next tree + devel/acpi-cpufreq.v3 branch + patch from liang tang + linus 3.1 tree pulled in.
> - iommu specific boot options used for xen in grub: iommu=on,amd-iommu-debug amd_iommu=on amd-iommu-debug
>
> I haven't seen kernel panics on boot so far, is this output that was expected (from serial console):
>
> <snip>
> (XEN) AMD-Vi: Add device table entry: device id = 0x0a07, interupt table = 0x24e004000
> (XEN) AMD-Vi: Add device table entry: device id = 0x0b00, interupt table = 0x24e004000
> (XEN) AMD-Vi: IOMMU 0 Enabled.
> (XEN) AMD-Vi: Enabling global vector map
> (XEN) I/O virtualisation enabled
> (XEN)  - Dom0 mode: Relaxed
> (XEN) Getting VERSION: 80050010
> <snip>
>
> Complete serial console output is attached
>
>
> Is this patch a candidate for 4.1.3 ?
>
> --
>
> Sander
>
>
>
> Monday, October 24, 2011, 11:51:39 PM, you wrote:
>
>> Yes, it is for xen-4.1-testing tree. I just applied it to the latest tip (23174:d4253bc5418b). There were some hunks; but it worked in general. Could you try it and replace your xen.gz file with the new version?
>> (Stripping trailing CRs from patch.)
>> patching file arch/x86/io_apic.c
>> Hunk #1 succeeded at 548 (offset -21 lines).
>> (Stripping trailing CRs from patch.)
>> patching file arch/x86/irq.c
>> Hunk #5 succeeded at 192 (offset 1 line).
>> Hunk #6 succeeded at 225 (offset 1 line).
>> Hunk #7 succeeded at 236 (offset 1 line).
>> Hunk #8 succeeded at 302 (offset 1 line).
>> Hunk #9 succeeded at 372 (offset 1 line).
>> Hunk #10 succeeded at 425 (offset 1 line).
>> Hunk #11 succeeded at 440 (offset 1 line).
>> Hunk #12 succeeded at 476 (offset 1 line).
>> Hunk #13 succeeded at 497 (offset 1 line).
>> Hunk #14 succeeded at 1599 (offset -11 lines).
>> Hunk #15 succeeded at 1647 (offset -11 lines).
>> (Stripping trailing CRs from patch.)
>> patching file drivers/passthrough/amd/pci_amd_iommu.c
>> (Stripping trailing CRs from patch.)
>> patching file include/asm-x86/irq.h
>> (Stripping trailing CRs from patch.)
>> patching file include/xen/pci.h
>
>
>> -Wei
>> On 10/22/2011 09:57 AM, Sander Eikelenboom wrote:
>>> Hello Wei,
>>>
>>> Is this for xen 4.1.2 ?
>>> All hunks of the patch seem to be rejected.
>>>
>>> --
>>> Sander
>>>
>>>
>>> Wednesday, October 19, 2011, 8:27:55 PM, you wrote:
>>>
>>>> This reminds me of 23768:09595fdf3638, which reverted WeiWang's patch of forcing perdev-intremap as default. Could you try the attached patch on your Xen 4.1 tree and test with patched xen.gz?
>>>> Thanks,
>>>> -Wei
>>>> -----Original Message-----
>>>> From: xen-devel-bounces@lists.xensource.com [mailto:xen-devel-bounces@lists.xensource.com] On Behalf Of Sander Eikelenboom
>>>> Sent: Wednesday, October 19, 2011 12:30 PM
>>>> To: Huang2, Wei
>>>> Cc: xen-devel@lists.xensource.com; Konrad Rzeszutek Wilk
>>>> Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
>>>> Hello Wei,
>>>> Result is that using only "1" or "1" in combination with "2" always result in SATA I/O errors, so that doesn't boot.
>>>> Haven't tried rebooting a lot of times without iommu yet.
>>>> (the reason i bought the 890fx board in the first place)
>>>> Will try that a few times when i have some more time.
>>>> --
>>>> Sander
>>>> Wednesday, October 19, 2011, 6:38:38 PM, you wrote:
>>>>> It looks similar.
>>>>> Hi Sander, could you please test your system with the following options?
>>>>> 1. iommu=amd-iommu-perdev-intremap in xen.gz GRUB entry
>>>>> 2. pci=nosmi in pvops GRUB entry
>>>>> 3. iommu=0 in xen.gz GRUB entry [optional, only if (1) doesn't work for you]
>>>>> We were seeing an issue which was caused by messed-up interrupt remap table. George Dunlap's perdev interrupt map solved our problem.
>>>>> Thanks,
>>>>> -Wei
>>>>> -----Original Message-----
>>>>> From: Konrad Rzeszutek Wilk [mailto:konrad.wilk@oracle.com]
>>>>> Sent: Wednesday, October 19, 2011 11:08 AM
>>>>> To: Sander Eikelenboom; Huang2, Wei
>>>>> Cc: xen-devel@lists.xensource.com
>>>>> Subject: Re: [Xen-devel] Panic:: handle_irq_event_percpu
>>>>> On Tue, Oct 18, 2011 at 08:55:19PM +0200, Sander Eikelenboom wrote:
>>>>>> Hi Konrad,
>>>>>>
>>>>>> On my system (AND phenom x6, 8gb mem) running xen 4.1.2-rc3
>>>>>> and a custom kernel based on:
>>>>>>
>>>>>> - your linux-next branch
>>>>>> - pulled in your apci/cpufreq branch
>>>>>> - pulled in latest patches from linuses tree
>>>>> Wei,
>>>>> Are those similar to what you had been seeing?
>>>>>> I'm experiencing infrequent panics at boot (say 1 out of 10 or 20 boots), doesn't seem to matter if it's a cold or a warm boot.
>>>>>> It always seem to happen during or shortly after booting. When it doesn't occur then, it can run for at least several days/weeks (haven't seen it panic then).
>>>>>> It doesn't seem to happen at a particular point at or shortly after booting, but it happens before starting any guests
>>>>>>
>>>>>> Unfortunately i haven't had serial console enabled at these times, but i have made some photo's.
>>>>>> The first 3 times it locked completely before being able to print a stacktrace, the 4th time it did (although the photo is a bit unsharp).
>>>>>>
>>>>>>
>>>>>> So all in all, it kind of strange, i hope you can figure something out from the stacktrace, if not, i will see if i can try with serial console attached.
>>>>>>
>>>>>> --
>>>>>> Sander
>>>
>>>
>>>
>>>
>>>>>> _______________________________________________
>>>>>> 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 Oct 26 07:47:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 07:47:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ4le-0001bo-Cf; Wed, 26 Oct 2011 07:47:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ4lC-0001Py-Ms
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 07:47:19 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-10.tower-27.messagelabs.com!1319640408!41517270!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10642 invoked from network); 26 Oct 2011 14:46:48 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-10.tower-27.messagelabs.com with SMTP;
	26 Oct 2011 14:46:48 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id 39374C56109;
	Wed, 26 Oct 2011 15:47:13 +0100 (BST)
Date: Wed, 26 Oct 2011 15:47:13 +0100
From: Alex Bligh <alex@alex.org.uk>
To: =?UTF-8?Q?Pasi_K=C3=A4rkk=C3=A4inen?= <pasik@iki.fi>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
Message-ID: <F1E068D49F012116597572D1@nimrod.local>
In-Reply-To: <20111026141233.GJ12984@reaktio.net>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@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>
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

Pasi, Conrad,

--On 26 October 2011 17:12:33 +0300 Pasi K=C3=A4rkk=C3=A4inen =
<pasik@iki.fi> wrote:

> On Wed, Oct 26, 2011 at 09:49:42AM -0400, Konrad Rzeszutek Wilk wrote:
>> On Wed, Oct 26, 2011 at 02:17:25PM +0100, Alex Bligh wrote:
>> > I am running Xen 4 and want users to be able to install arbitrary HVM
>> > images. We want both PV and emulated drivers to appear. The reason
>> > for this is for compatibility with images that were prepared for
>> > Xen 3.3, which assume emulated devices exist at boot time =
(particularly
>> > for running the boot loader).
>> >
>> > If I do not specify on the boot line xen_emul_unplug=3Dnever, then
>> > under some guest OS's (e.g. Ubuntu Natty (2.6.38)), the domU kernel
>> > unplugs the non-PV devices, which is undesirable in my application.
>> >
>> > I cannot arbitrarily change the kernel command line because it is
>> > in effect set by the user's image.
>> >
>> > Therefore what I need to do is prevent Xen4 offering the facility
>> > to unplug the devices in the first place. Setting "(unpluggable 0)"
>> > in the config for the emulated NICs and disks does not appear
>> > to prevent them getting unplugged; what may be happening is that
>> > domU tries to unplug them (but fails) but still doesn't use them.
>> > Is there a way to signal from dom0 that the kernel really shouldn't
>> > unplug this stuff.
>>
>> xen_pci_platform=3D0 in your guest config should do it.
>>
>
> It's actually called:
> xen_platform_pci=3D0

Thanks. Just to confirm, that will still allow HVM PV drivers to
operate (as well)?

--=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 Wed Oct 26 07:57:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 07:57:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ4vL-0002AJ-Kb; Wed, 26 Oct 2011 07:57:47 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ4uP-0001w7-EF
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 07:56:49 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319641005!1778795!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11605 invoked from network); 26 Oct 2011 14:56:45 -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;
	26 Oct 2011 14:56:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,409,1315180800"; 
   d="scan'208";a="8599322"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 14:56:44 +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, 26 Oct 2011 15:56:44 +0100
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Alex Bligh <alex@alex.org.uk>
Date: Wed, 26 Oct 2011 15:56:44 +0100
In-Reply-To: <F1E068D49F012116597572D1@nimrod.local>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1319641004.9436.35.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 Wed, 2011-10-26 at 15:47 +0100, Alex Bligh wrote:
> Pasi, Conrad,
> 
> --On 26 October 2011 17:12:33 +0300 Pasi KÃ¤rkkÃ¤inen <pasik@iki.fi> wrote:
> 
> > On Wed, Oct 26, 2011 at 09:49:42AM -0400, Konrad Rzeszutek Wilk wrote:
> >> On Wed, Oct 26, 2011 at 02:17:25PM +0100, Alex Bligh wrote:
> >> > I am running Xen 4 and want users to be able to install arbitrary HVM
> >> > images. We want both PV and emulated drivers to appear. The reason
> >> > for this is for compatibility with images that were prepared for
> >> > Xen 3.3, which assume emulated devices exist at boot time (particularly
> >> > for running the boot loader).
> >> >
> >> > If I do not specify on the boot line xen_emul_unplug=never, then
> >> > under some guest OS's (e.g. Ubuntu Natty (2.6.38)), the domU kernel
> >> > unplugs the non-PV devices, which is undesirable in my application.
> >> >
> >> > I cannot arbitrarily change the kernel command line because it is
> >> > in effect set by the user's image.
> >> >
> >> > Therefore what I need to do is prevent Xen4 offering the facility
> >> > to unplug the devices in the first place. Setting "(unpluggable 0)"
> >> > in the config for the emulated NICs and disks does not appear
> >> > to prevent them getting unplugged; what may be happening is that
> >> > domU tries to unplug them (but fails) but still doesn't use them.
> >> > Is there a way to signal from dom0 that the kernel really shouldn't
> >> > unplug this stuff.
> >>
> >> xen_pci_platform=0 in your guest config should do it.
> >>
> >
> > It's actually called:
> > xen_platform_pci=0
> 
> Thanks. Just to confirm, that will still allow HVM PV drivers to
> operate (as well)?

No, this will disable PV drivers.

The decision to unplug is a kernel side decision and in PVHVM Linux
kernels is not currently possible to have both types of devices by
default due to the risk of dataloss if the guest is not correctly
configured (i.e. the kernel can't tell if it is mounting the same
filesystem via two paths). The xen_emul_unplug option is the current way
you can override this once you have confirmed that your guest
configuration is not dangerous. I'm afraid this necessarily involves
guest config and guest admin interaction.

In principal we might be able to extend the unplug protocol (which would
involve patches to qemu, the kernel(s) and the toolstack) to allow
devices to be marked as being not necessary to unplug. Someone would
have to send patches though and it would be opening up a way for people
to lose data so we'd need to be careful.

I'm sure that the unplug protocol is documented somewhere in the source
tree but I can't for the life of me find 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 Oct 26 08:48:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 08:48:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ5ig-0003Yt-HZ; Wed, 26 Oct 2011 08:48:46 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ5hg-0003Lz-2g
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 08:47:44 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-7.tower-21.messagelabs.com!1319644060!1786134!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17377 invoked from network); 26 Oct 2011 15:47:40 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-7.tower-21.messagelabs.com with SMTP;
	26 Oct 2011 15:47:40 -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
	p9QFlY0d021892; Wed, 26 Oct 2011 15:47:34 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 p9QFlWKB031030; 
	Wed, 26 Oct 2011 11:47:34 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Wed, 26 Oct 2011 11:47:46 -0400
Message-Id: <1319644068-25814-2-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319644068-25814-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319644068-25814-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: jeremy@goop.org, xen-devel@lists.xensource.com, keir@xen.org,
	Ian.Campbell@citrix.com, Ian.Jackson@eu.citrix.com,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 1/3] xen/event: Add reference counting to 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

Event channels exposed to userspace by the evtchn module may be used by
other modules in an asynchronous manner, which requires that reference
counting be used to prevent the event channel from being closed before
the signals are delivered.

The reference count on new event channels defaults to -1 which indicates
the event channel is not referenced outside the kernel; evtchn_get fails
if called on such an event channel. The event channels made visible to
userspace by evtchn have a normal reference count.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/events.c |   62 +++++++++++++++++++++++++++++++++++++++++++++++++-
 drivers/xen/evtchn.c |    2 +-
 include/xen/events.h |    7 +++++
 3 files changed, 69 insertions(+), 2 deletions(-)

diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 073c11d..6054580 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -87,6 +87,7 @@ enum xen_irq_type {
  */
 struct irq_info {
 	struct list_head list;
+	atomic_t refcnt;
 	enum xen_irq_type type;	/* type */
 	unsigned irq;
 	unsigned short evtchn;	/* event channel */
@@ -406,6 +407,7 @@ static void xen_irq_init(unsigned irq)
 		panic("Unable to allocate metadata for IRQ%d\n", irq);
 
 	info->type = IRQT_UNBOUND;
+	atomic_set(&info->refcnt, -1);
 
 	irq_set_handler_data(irq, info);
 
@@ -469,6 +471,8 @@ static void xen_free_irq(unsigned irq)
 
 	irq_set_handler_data(irq, NULL);
 
+	WARN_ON(atomic_read(&info->refcnt) > 0);
+
 	kfree(info);
 
 	/* Legacy IRQ descriptors are managed by the arch. */
@@ -637,7 +641,7 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi,
 	if (irq != -1) {
 		printk(KERN_INFO "xen_map_pirq_gsi: returning irq %d for gsi %u\n",
 		       irq, gsi);
-		goto out;	/* XXX need refcount? */
+		goto out;
 	}
 
 	irq = xen_allocate_irq_gsi(gsi);
@@ -939,6 +943,10 @@ static void unbind_from_irq(unsigned int irq)
 {
 	struct evtchn_close close;
 	int evtchn = evtchn_from_irq(irq);
+	struct irq_info *info = irq_get_handler_data(irq);
+
+	if (atomic_read(&info->refcnt) > 0 && !atomic_dec_and_test(&info->refcnt))
+		return;
 
 	mutex_lock(&irq_mapping_update_lock);
 
@@ -1065,6 +1073,58 @@ void unbind_from_irqhandler(unsigned int irq, void *dev_id)
 }
 EXPORT_SYMBOL_GPL(unbind_from_irqhandler);
 
+int evtchn_make_refcounted(unsigned int evtchn)
+{
+	int irq = evtchn_to_irq[evtchn];
+	struct irq_info *info;
+
+	if (irq == -1)
+		return -ENOENT;
+
+	info = irq_get_handler_data(irq);
+
+	if (!info)
+		return -ENOENT;
+
+	WARN_ON(atomic_read(&info->refcnt) != -1);
+
+	atomic_set(&info->refcnt, 1);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(evtchn_make_refcounted);
+
+int evtchn_get(unsigned int evtchn)
+{
+	int irq = evtchn_to_irq[evtchn];
+	struct irq_info *info;
+
+	if (irq == -1)
+		return -ENOENT;
+
+	info = irq_get_handler_data(irq);
+
+	if (!info)
+		return -ENOENT;
+
+	if (atomic_read(&info->refcnt) < 0)
+		return -EINVAL;
+
+	atomic_inc(&info->refcnt);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(evtchn_get);
+
+void evtchn_put(unsigned int evtchn)
+{
+	int irq = evtchn_to_irq[evtchn];
+	if (WARN_ON(irq == -1))
+		return;
+	unbind_from_irq(irq);
+}
+EXPORT_SYMBOL_GPL(evtchn_put);
+
 void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector)
 {
 	int irq = per_cpu(ipi_to_irq, cpu)[vector];
diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c
index dbc13e9..b1f60a0 100644
--- a/drivers/xen/evtchn.c
+++ b/drivers/xen/evtchn.c
@@ -268,7 +268,7 @@ static int evtchn_bind_to_user(struct per_user_data *u, int port)
 	rc = bind_evtchn_to_irqhandler(port, evtchn_interrupt, IRQF_DISABLED,
 				       u->name, (void *)(unsigned long)port);
 	if (rc >= 0)
-		rc = 0;
+		rc = evtchn_make_refcounted(port);
 
 	return rc;
 }
diff --git a/include/xen/events.h b/include/xen/events.h
index d287997..0f77370 100644
--- a/include/xen/events.h
+++ b/include/xen/events.h
@@ -37,6 +37,13 @@ int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain,
  */
 void unbind_from_irqhandler(unsigned int irq, void *dev_id);
 
+/*
+ * Allow extra references to event channels exposed to userspace by evtchn
+ */
+int evtchn_make_refcounted(unsigned int evtchn);
+int evtchn_get(unsigned int evtchn);
+void evtchn_put(unsigned int evtchn);
+
 void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector);
 int resend_irq_on_evtchn(unsigned int irq);
 void rebind_evtchn_irq(int evtchn, int irq);
-- 
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 Oct 26 08:50:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 08:50:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ5k2-00041X-AS; Wed, 26 Oct 2011 08:50:10 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ5hg-0003M0-4i
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 08:47:44 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319644060!845642!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3960 invoked from network); 26 Oct 2011 15:47:40 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-3.tower-182.messagelabs.com with SMTP;
	26 Oct 2011 15:47:40 -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
	p9QFlY0L023152; Wed, 26 Oct 2011 15:47:34 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 p9QFlWKD031030; 
	Wed, 26 Oct 2011 11:47:34 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Wed, 26 Oct 2011 11:47:48 -0400
Message-Id: <1319644068-25814-4-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319644068-25814-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319644068-25814-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: jeremy@goop.org, xen-devel@lists.xensource.com, keir@xen.org,
	Ian.Campbell@citrix.com, Ian.Jackson@eu.citrix.com,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 3/3] xen/gnt{dev,
	alloc}: reserve event channels for notify
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 unmap notify ioctl, the event channel used for
notification needs to be reserved to avoid it being deallocated prior to
sending the notification.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/gntalloc.c |   21 ++++++++++++++++++++-
 drivers/xen/gntdev.c   |   32 ++++++++++++++++++++++++++++++--
 2 files changed, 50 insertions(+), 3 deletions(-)

diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index 439352d..c95181f 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -178,8 +178,10 @@ static void __del_gref(struct gntalloc_gref *gref)
 		tmp[gref->notify.pgoff] = 0;
 		kunmap(gref->page);
 	}
-	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
+	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
 		notify_remote_via_evtchn(gref->notify.event);
+		evtchn_put(gref->notify.event);
+	}
 
 	gref->notify.flags = 0;
 
@@ -396,6 +398,23 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
 		goto unlock_out;
 	}
 
+	/* We need to grab a reference to the event channel we are going to use
+	 * to send the notify before releasing the reference we may already have
+	 * (if someone has called this ioctl twice). This is required so that
+	 * it is possible to change the clear_byte part of the notification
+	 * without disturbing the event channel part, which may now be the last
+	 * reference to that event channel.
+	 */
+	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
+		if (evtchn_get(op.event_channel_port)) {
+			rc = -EINVAL;
+			goto unlock_out;
+		}
+	}
+
+	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
+		evtchn_put(gref->notify.event);
+
 	gref->notify.flags = op.action;
 	gref->notify.pgoff = pgoff;
 	gref->notify.event = op.event_channel_port;
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index 5227506..f0bb322 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -193,8 +193,10 @@ static void gntdev_put_map(struct grant_map *map)
 
 	atomic_sub(map->count, &pages_mapped);
 
-	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
+	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
 		notify_remote_via_evtchn(map->notify.event);
+		evtchn_put(map->notify.event);
+	}
 
 	if (map->pages) {
 		if (!use_ptemod)
@@ -600,6 +602,8 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
 	struct ioctl_gntdev_unmap_notify op;
 	struct grant_map *map;
 	int rc;
+	int old_flags;
+	unsigned int old_event;
 
 	if (copy_from_user(&op, u, sizeof(op)))
 		return -EFAULT;
@@ -625,10 +629,34 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
 		goto unlock_out;
 	}
 
+	/* We need to grab a reference to the event channel we are going to use
+	 * to send the notify before releasing the reference we may already have
+	 * (if someone has called this ioctl twice). This is required so that
+	 * it is possible to change the clear_byte part of the notification
+	 * without disturbing the event channel part, which may now be the last
+	 * reference to that event channel.
+	 */
+	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
+		if (evtchn_get(op.event_channel_port)) {
+			rc = -EINVAL;
+			goto unlock_out;
+		}
+	}
+
+	old_flags = map->notify.flags;
+	old_event = map->notify.event;
+
 	map->notify.flags = op.action;
 	map->notify.addr = op.index - (map->index << PAGE_SHIFT);
 	map->notify.event = op.event_channel_port;
-	rc = 0;
+	spin_unlock(&priv->lock);
+
+	/* Cannot execute evtchn_put under spinlock */
+	if (old_flags & UNMAP_NOTIFY_SEND_EVENT)
+		evtchn_put(old_event);
+
+	return 0;
+
  unlock_out:
 	spin_unlock(&priv->lock);
 	return rc;
-- 
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 Oct 26 08:51:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 08:51:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ5kt-0004Od-G3; Wed, 26 Oct 2011 08:51:03 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ5hg-0003M1-4h
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 08:47:44 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-15.tower-182.messagelabs.com!1319644060!844987!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4539 invoked from network); 26 Oct 2011 15:47:40 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-15.tower-182.messagelabs.com with SMTP;
	26 Oct 2011 15:47:40 -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
	p9QFlY0L023149; Wed, 26 Oct 2011 15:47:34 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 p9QFlWKA031030; 
	Wed, 26 Oct 2011 11:47:32 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Wed, 26 Oct 2011 11:47:45 -0400
Message-Id: <1319644068-25814-1-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: keir@xen.org, jeremy@goop.org, xen-devel@lists.xensource.com,
	Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [PATCH v3 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

> 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.

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 Wed Oct 26 08:51:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 08:51:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ5lj-0004lC-Rr; Wed, 26 Oct 2011 08:51:55 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ5hg-0003M2-CU
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 08:47:44 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-14.tower-174.messagelabs.com!1319644060!36754875!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3269 invoked from network); 26 Oct 2011 15:47:40 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-14.tower-174.messagelabs.com with SMTP;
	26 Oct 2011 15:47:40 -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
	p9QFlY0d021893; Wed, 26 Oct 2011 15:47:34 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 p9QFlWKC031030; 
	Wed, 26 Oct 2011 11:47:34 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Wed, 26 Oct 2011 11:47:47 -0400
Message-Id: <1319644068-25814-3-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319644068-25814-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319644068-25814-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: jeremy@goop.org, xen-devel@lists.xensource.com, keir@xen.org,
	Ian.Campbell@citrix.com, Ian.Jackson@eu.citrix.com,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 2/3] xen/gntalloc: Change gref_lock to a mutex
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 event channel release function cannot be called under a spinlock
because it can attempt to acquire a mutex due to the event channel
reference acquired when setting up unmap notifications.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/gntalloc.c |   41 +++++++++++++++++++++--------------------
 1 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index f6832f4..439352d 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -74,7 +74,7 @@ MODULE_PARM_DESC(limit, "Maximum number of grants that may be allocated by "
 		"the gntalloc device");
 
 static LIST_HEAD(gref_list);
-static DEFINE_SPINLOCK(gref_lock);
+static DEFINE_MUTEX(gref_mutex);
 static int gref_size;
 
 struct notify_info {
@@ -143,15 +143,15 @@ static int add_grefs(struct ioctl_gntalloc_alloc_gref *op,
 	}
 
 	/* Add to gref lists. */
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	list_splice_tail(&queue_gref, &gref_list);
 	list_splice_tail(&queue_file, &priv->list);
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 
 	return 0;
 
 undo:
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	gref_size -= (op->count - i);
 
 	list_for_each_entry(gref, &queue_file, next_file) {
@@ -167,7 +167,7 @@ undo:
 	 */
 	if (unlikely(!list_empty(&queue_gref)))
 		list_splice_tail(&queue_gref, &gref_list);
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 	return rc;
 }
 
@@ -251,7 +251,7 @@ static int gntalloc_release(struct inode *inode, struct file *filp)
 
 	pr_debug("%s: priv %p\n", __func__, priv);
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	while (!list_empty(&priv->list)) {
 		gref = list_entry(priv->list.next,
 			struct gntalloc_gref, next_file);
@@ -261,7 +261,7 @@ static int gntalloc_release(struct inode *inode, struct file *filp)
 			__del_gref(gref);
 	}
 	kfree(priv);
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 
 	return 0;
 }
@@ -286,21 +286,21 @@ static long gntalloc_ioctl_alloc(struct gntalloc_file_private_data *priv,
 		goto out;
 	}
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	/* Clean up pages that were at zero (local) users but were still mapped
 	 * by remote domains. Since those pages count towards the limit that we
 	 * are about to enforce, removing them here is a good idea.
 	 */
 	do_cleanup();
 	if (gref_size + op.count > limit) {
-		spin_unlock(&gref_lock);
+		mutex_unlock(&gref_mutex);
 		rc = -ENOSPC;
 		goto out_free;
 	}
 	gref_size += op.count;
 	op.index = priv->index;
 	priv->index += op.count * PAGE_SIZE;
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 
 	rc = add_grefs(&op, gref_ids, priv);
 	if (rc < 0)
@@ -343,7 +343,7 @@ static long gntalloc_ioctl_dealloc(struct gntalloc_file_private_data *priv,
 		goto dealloc_grant_out;
 	}
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	gref = find_grefs(priv, op.index, op.count);
 	if (gref) {
 		/* Remove from the file list only, and decrease reference count.
@@ -363,7 +363,7 @@ static long gntalloc_ioctl_dealloc(struct gntalloc_file_private_data *priv,
 
 	do_cleanup();
 
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 dealloc_grant_out:
 	return rc;
 }
@@ -383,7 +383,7 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
 	index = op.index & ~(PAGE_SIZE - 1);
 	pgoff = op.index & (PAGE_SIZE - 1);
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 
 	gref = find_grefs(priv, index, 1);
 	if (!gref) {
@@ -400,8 +400,9 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
 	gref->notify.pgoff = pgoff;
 	gref->notify.event = op.event_channel_port;
 	rc = 0;
+
  unlock_out:
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 	return rc;
 }
 
@@ -433,9 +434,9 @@ static void gntalloc_vma_open(struct vm_area_struct *vma)
 	if (!gref)
 		return;
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	gref->users++;
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 }
 
 static void gntalloc_vma_close(struct vm_area_struct *vma)
@@ -444,11 +445,11 @@ static void gntalloc_vma_close(struct vm_area_struct *vma)
 	if (!gref)
 		return;
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	gref->users--;
 	if (gref->users == 0)
 		__del_gref(gref);
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 }
 
 static struct vm_operations_struct gntalloc_vmops = {
@@ -471,7 +472,7 @@ static int gntalloc_mmap(struct file *filp, struct vm_area_struct *vma)
 		return -EINVAL;
 	}
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	gref = find_grefs(priv, vma->vm_pgoff << PAGE_SHIFT, count);
 	if (gref == NULL) {
 		rv = -ENOENT;
@@ -499,7 +500,7 @@ static int gntalloc_mmap(struct file *filp, struct vm_area_struct *vma)
 	rv = 0;
 
 out_unlock:
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 	return rv;
 }
 
-- 
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 Oct 26 08:54:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 08:54:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ5oY-0005GU-HZ; Wed, 26 Oct 2011 08:54:50 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ5o5-00054r-Bn
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 08:54:21 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319644457!846716!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29043 invoked from network); 26 Oct 2011 15:54:18 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 15:54:18 -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 7D5C12F31;
	Wed, 26 Oct 2011 18:54:17 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 484CC200AC; Wed, 26 Oct 2011 18:54:17 +0300 (EEST)
Date: Wed, 26 Oct 2011 18:54:17 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Alex Bligh <alex@alex.org.uk>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
Message-ID: <20111026155417.GK12984@reaktio.net>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <F1E068D49F012116597572D1@nimrod.local>
User-Agent: Mutt/1.5.18 (2008-05-17)
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

On Wed, Oct 26, 2011 at 03:47:13PM +0100, Alex Bligh wrote:
> Pasi, Conrad,
>
> --On 26 October 2011 17:12:33 +0300 Pasi Kärkkäinen <pasik@iki.fi> wrote:
>
>> On Wed, Oct 26, 2011 at 09:49:42AM -0400, Konrad Rzeszutek Wilk wrote:
>>> On Wed, Oct 26, 2011 at 02:17:25PM +0100, Alex Bligh wrote:
>>> > I am running Xen 4 and want users to be able to install arbitrary HVM
>>> > images. We want both PV and emulated drivers to appear. The reason
>>> > for this is for compatibility with images that were prepared for
>>> > Xen 3.3, which assume emulated devices exist at boot time (particularly
>>> > for running the boot loader).
>>> >
>>> > If I do not specify on the boot line xen_emul_unplug=never, then
>>> > under some guest OS's (e.g. Ubuntu Natty (2.6.38)), the domU kernel
>>> > unplugs the non-PV devices, which is undesirable in my application.
>>> >
>>> > I cannot arbitrarily change the kernel command line because it is
>>> > in effect set by the user's image.
>>> >
>>> > Therefore what I need to do is prevent Xen4 offering the facility
>>> > to unplug the devices in the first place. Setting "(unpluggable 0)"
>>> > in the config for the emulated NICs and disks does not appear
>>> > to prevent them getting unplugged; what may be happening is that
>>> > domU tries to unplug them (but fails) but still doesn't use them.
>>> > Is there a way to signal from dom0 that the kernel really shouldn't
>>> > unplug this stuff.
>>>
>>> xen_pci_platform=0 in your guest config should do it.
>>>
>>
>> It's actually called:
>> xen_platform_pci=0
>
> Thanks. Just to confirm, that will still allow HVM PV drivers to
> operate (as well)?
>

Nope. PVHVM drivers will require the xen pci platform device to operate.

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:03:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:03:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ5xB-0005xh-ID; Wed, 26 Oct 2011 09:03:45 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ5th-0005gK-IC
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:00:10 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319644797!1164558!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9543 invoked from network); 26 Oct 2011 15:59:57 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-13.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 26 Oct 2011 15:59:57 -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 1C5C02FC4;
	Wed, 26 Oct 2011 18:59:55 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id DBD51200AC; Wed, 26 Oct 2011 18:59:55 +0300 (EEST)
Date: Wed, 26 Oct 2011 18:59:55 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
Message-ID: <20111026155955.GL12984@reaktio.net>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.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: <1319641004.9436.35.camel@zakaz.uk.xensource.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Alex Bligh <alex@alex.org.uk>,
	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 Wed, Oct 26, 2011 at 03:56:44PM +0100, Ian Campbell wrote:
> On Wed, 2011-10-26 at 15:47 +0100, Alex Bligh wrote:
> > Pasi, Conrad,
> > 
> > --On 26 October 2011 17:12:33 +0300 Pasi Kärkkäinen <pasik@iki.fi> wrote:
> > 
> > > On Wed, Oct 26, 2011 at 09:49:42AM -0400, Konrad Rzeszutek Wilk wrote:
> > >> On Wed, Oct 26, 2011 at 02:17:25PM +0100, Alex Bligh wrote:
> > >> > I am running Xen 4 and want users to be able to install arbitrary HVM
> > >> > images. We want both PV and emulated drivers to appear. The reason
> > >> > for this is for compatibility with images that were prepared for
> > >> > Xen 3.3, which assume emulated devices exist at boot time (particularly
> > >> > for running the boot loader).
> > >> >
> > >> > If I do not specify on the boot line xen_emul_unplug=never, then
> > >> > under some guest OS's (e.g. Ubuntu Natty (2.6.38)), the domU kernel
> > >> > unplugs the non-PV devices, which is undesirable in my application.
> > >> >
> > >> > I cannot arbitrarily change the kernel command line because it is
> > >> > in effect set by the user's image.
> > >> >
> > >> > Therefore what I need to do is prevent Xen4 offering the facility
> > >> > to unplug the devices in the first place. Setting "(unpluggable 0)"
> > >> > in the config for the emulated NICs and disks does not appear
> > >> > to prevent them getting unplugged; what may be happening is that
> > >> > domU tries to unplug them (but fails) but still doesn't use them.
> > >> > Is there a way to signal from dom0 that the kernel really shouldn't
> > >> > unplug this stuff.
> > >>
> > >> xen_pci_platform=0 in your guest config should do it.
> > >>
> > >
> > > It's actually called:
> > > xen_platform_pci=0
> > 
> > Thanks. Just to confirm, that will still allow HVM PV drivers to
> > operate (as well)?
> 
> No, this will disable PV drivers.
> 
> The decision to unplug is a kernel side decision and in PVHVM Linux
> kernels is not currently possible to have both types of devices by
> default due to the risk of dataloss if the guest is not correctly
> configured (i.e. the kernel can't tell if it is mounting the same
> filesystem via two paths). The xen_emul_unplug option is the current way
> you can override this once you have confirmed that your guest
> configuration is not dangerous. I'm afraid this necessarily involves
> guest config and guest admin interaction.
> 
> In principal we might be able to extend the unplug protocol (which would
> involve patches to qemu, the kernel(s) and the toolstack) to allow
> devices to be marked as being not necessary to unplug. Someone would
> have to send patches though and it would be opening up a way for people
> to lose data so we'd need to be careful.
> 
> I'm sure that the unplug protocol is documented somewhere in the source
> tree but I can't for the life of me find it :-(
> 

"disable qemu PCI devices in HVM domains":
http://xenbits.xen.org/gitweb/?p=qemu-xen-unstable.git;a=commit;h=e7911109f4321e9ba0cc56a253b653600aa46bea

"disable qemu PCI devices in HVM domains - protocol document":
http://xenbits.xen.org/gitweb/?p=qemu-xen-unstable.git;a=commit;h=bc5c93ede039525765a7aa98e1da3386efa1465f


-- Pasi



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:21:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:21:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6Ef-0006cc-Ad; Wed, 26 Oct 2011 09:21:49 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6Df-0006PY-Tv
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:20:50 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1319645932!30423901!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25643 invoked from network); 26 Oct 2011 16:18:53 -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;
	26 Oct 2011 16:18:53 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315195200"; d="scan'208";a="18561199"
Received: from ftlpmailmx01.citrite.net ([10.13.107.65])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 12:18:51 -0400
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; Wed, 26 Oct 2011 12:18:51 -0400
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
	p9QGIo6g019357;	Wed, 26 Oct 2011 09:18:50 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 36b5adb30766e16a1a3a4e900b3219f9fc7c40ed
Message-ID: <36b5adb30766e16a1a3a.1319645929@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 17:18:49 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH] unmodified_drivers: update README from
 http://wiki.xen.org/xenwiki/UnmodifiedDrivers
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319645918 -3600
# Node ID 36b5adb30766e16a1a3a4e900b3219f9fc7c40ed
# Parent  80c36c519e89e9ee487c94d80ac94fe216f3cdbc
unmodified_drivers: update README from http://wiki.xen.org/xenwiki/UnmodifiedDrivers

Add reference to the fact that these drivers are for "classic-Xen" kernels only
and do not work with PVops but point towards the PVHVM functionality in
mainstream.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 80c36c519e89 -r 36b5adb30766 unmodified_drivers/linux-2.6/README
--- a/unmodified_drivers/linux-2.6/README	Wed Oct 26 17:06:34 2011 +0100
+++ b/unmodified_drivers/linux-2.6/README	Wed Oct 26 17:18:38 2011 +0100
@@ -1,10 +1,19 @@
-To build:
+These drivers provide paravirtualised drivers for pre-PVops Linux
+kernels which have the classic-Xen patches applied. They do not work
+with kernels which are not patched with the classic-Xen patches. In
+particular this includes all PVops kernels.
 
-1. ./mkbuildtree [<arch>]
+For 2.6.36 and newer you should use the "PVHVM" functionality which is
+available in the mainline kernel.
+
+To build do one of:
+
+   ./mkbuildtree [<arch>]
    NB. You can override paths to Xen sources and a (stub) XenLinux
        build tree via the XEN and XL environment variable.
 
-2. make -C /path/to/kernel/build M=$PWD modules
+- or -
+   make -C /path/to/kernel/build M=$PWD modules
    NB. This is your native kernel build tree (or a distro provided
        stub), not the XenLinux sources referred to in step 1.
    NB. If you are cross compiling, you need to set ARCH and

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:24:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:24:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6Hj-0007it-Cw; Wed, 26 Oct 2011 09:24:59 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6FT-0006rT-Fh
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:22:40 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319646156!211385!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27356 invoked from network); 26 Oct 2011 16:22:36 -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;
	26 Oct 2011 16:22:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315180800"; 
   d="scan'208";a="8601749"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 16:22:35 +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, 26 Oct 2011 17:22:35 +0100
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Pasi =?ISO-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
Date: Wed, 26 Oct 2011 17:22:35 +0100
In-Reply-To: <20111026155955.GL12984@reaktio.net>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.com>
	<20111026155955.GL12984@reaktio.net>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1319646155.9436.39.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Alex Bligh <alex@alex.org.uk>,
	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 Wed, 2011-10-26 at 16:59 +0100, Pasi KÃ¤rkkÃ¤inen wrote:
> On Wed, Oct 26, 2011 at 03:56:44PM +0100, Ian Campbell wrote:
> > On Wed, 2011-10-26 at 15:47 +0100, Alex Bligh wrote:
> > > Pasi, Conrad,
> > > 
> > > --On 26 October 2011 17:12:33 +0300 Pasi KÃ¤rkkÃ¤inen <pasik@iki.fi> wrote:
> > > 
> > > > On Wed, Oct 26, 2011 at 09:49:42AM -0400, Konrad Rzeszutek Wilk wrote:
> > > >> On Wed, Oct 26, 2011 at 02:17:25PM +0100, Alex Bligh wrote:
> > > >> > I am running Xen 4 and want users to be able to install arbitrary HVM
> > > >> > images. We want both PV and emulated drivers to appear. The reason
> > > >> > for this is for compatibility with images that were prepared for
> > > >> > Xen 3.3, which assume emulated devices exist at boot time (particularly
> > > >> > for running the boot loader).
> > > >> >
> > > >> > If I do not specify on the boot line xen_emul_unplug=never, then
> > > >> > under some guest OS's (e.g. Ubuntu Natty (2.6.38)), the domU kernel
> > > >> > unplugs the non-PV devices, which is undesirable in my application.
> > > >> >
> > > >> > I cannot arbitrarily change the kernel command line because it is
> > > >> > in effect set by the user's image.
> > > >> >
> > > >> > Therefore what I need to do is prevent Xen4 offering the facility
> > > >> > to unplug the devices in the first place. Setting "(unpluggable 0)"
> > > >> > in the config for the emulated NICs and disks does not appear
> > > >> > to prevent them getting unplugged; what may be happening is that
> > > >> > domU tries to unplug them (but fails) but still doesn't use them.
> > > >> > Is there a way to signal from dom0 that the kernel really shouldn't
> > > >> > unplug this stuff.
> > > >>
> > > >> xen_pci_platform=0 in your guest config should do it.
> > > >>
> > > >
> > > > It's actually called:
> > > > xen_platform_pci=0
> > > 
> > > Thanks. Just to confirm, that will still allow HVM PV drivers to
> > > operate (as well)?
> > 
> > No, this will disable PV drivers.
> > 
> > The decision to unplug is a kernel side decision and in PVHVM Linux
> > kernels is not currently possible to have both types of devices by
> > default due to the risk of dataloss if the guest is not correctly
> > configured (i.e. the kernel can't tell if it is mounting the same
> > filesystem via two paths). The xen_emul_unplug option is the current way
> > you can override this once you have confirmed that your guest
> > configuration is not dangerous. I'm afraid this necessarily involves
> > guest config and guest admin interaction.
> > 
> > In principal we might be able to extend the unplug protocol (which would
> > involve patches to qemu, the kernel(s) and the toolstack) to allow
> > devices to be marked as being not necessary to unplug. Someone would
> > have to send patches though and it would be opening up a way for people
> > to lose data so we'd need to be careful.
> > 
> > I'm sure that the unplug protocol is documented somewhere in the source
> > tree but I can't for the life of me find it :-(
> > 
> 
> "disable qemu PCI devices in HVM domains":
> http://xenbits.xen.org/gitweb/?p=qemu-xen-unstable.git;a=commit;h=e7911109f4321e9ba0cc56a253b653600aa46bea
> 
> "disable qemu PCI devices in HVM domains - protocol document":
> http://xenbits.xen.org/gitweb/?p=qemu-xen-unstable.git;a=commit;h=bc5c93ede039525765a7aa98e1da3386efa1465f

Thanks, I found it and am just about to send a patch to add it to
xen-unstable.hg...

Ian.

> 
> 
> -- Pasi
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:27:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:27:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6KB-0000ML-Gy; Wed, 26 Oct 2011 09:27:31 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ6Hr-0007ll-86
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:25:07 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319646272!54408823!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27536 invoked from network); 26 Oct 2011 16:24:32 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-7.tower-27.messagelabs.com with SMTP;
	26 Oct 2011 16:24:32 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id CE9CCC5610A;
	Wed, 26 Oct 2011 17:25:03 +0100 (BST)
Date: Wed, 26 Oct 2011 17:25:02 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
Message-ID: <AEAE0D618F71583484DA951D@nimrod.local>
In-Reply-To: <1319641004.9436.35.camel@zakaz.uk.xensource.com>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.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>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
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

Ian,

> No, this will disable PV drivers.

I can confirm that our testing illustrates this :-(

> The decision to unplug is a kernel side decision and in PVHVM Linux
> kernels is not currently possible to have both types of devices by
> default due to the risk of dataloss if the guest is not correctly
> configured (i.e. the kernel can't tell if it is mounting the same
> filesystem via two paths). The xen_emul_unplug option is the current way
> you can override this once you have confirmed that your guest
> configuration is not dangerous. I'm afraid this necessarily involves
> guest config and guest admin interaction.
>
> In principal we might be able to extend the unplug protocol (which would
> involve patches to qemu, the kernel(s) and the toolstack) to allow
> devices to be marked as being not necessary to unplug. Someone would
> have to send patches though and it would be opening up a way for people
> to lose data so we'd need to be careful.
>
> I'm sure that the unplug protocol is documented somewhere in the source
> tree but I can't for the life of me find it :-(

So, the issue is this. We have thousands (literally) of disks in use
by third parties on xen 3.3. Some are Windows, some are ancient linux,
some are modern linux, etc. The hypervisor has no way of whether the
images are going to use /dev/sda or /dev/xvda (i.e. PV or emulated)
drivers. Indeed the most common linux case is that grub uses the
emulated devices to load the kernel, then uses /dev/xvda as a root
device, i.e. both are used (but not simultaneously).

We need to have the xen pci stuff on, so PV drivers operate (in both
new and old kernels). But as modern linux kernels detect the unplug 
functionality, they will unplug the emulated devices and then fail to
boot because (for instance) under Xen3.3 using /dev/sdaX to access
(say) your /boot partition worked perfectly well. What we need is a
switch to revert to the old Xen3.3 (pre-unplug) behaviour, so any
Linux kernel will see the same set of devices. I cannot believe this
is a unique requirement for people attempting to do a Xen3.3 to
Xen4.1 migration.

I think this is in xen_unplug_emulated_devices() in
arch/x86/xen/platform-pci-unplug.c

This uses check_platform_magic(), which I have appended. In order
to avoid unplugging (without relying on the boot line), I need
this to return a non-zero value (XEN_PLATFORM_ERR_MAGIC is
irrelevant as xen_emul_unplug is 0 by assumption).

I can achieve that by either (a) returning a bad magic number,
(b) making the host 'blacklist' the product (how does that work?)
or (c) using a protocol value of (say) 0. I take it Xen 3.3 simply
returns a bad magic number as I don't think XEN_IOPORT_MAGIC existed
in 3.3. As far as I can tell, XEN_IOPORT_MAGIC is only use for
PCI unplug.

So, is the correct approach to disable XEN_IOPORT_MAGIC (or rather
make it return a different value) depending on a configuration option?
If so, I am happy to submit a patch to do that. Or can I do this
without a patch by "blacklisting" everything? (not sure how that is done).

Out of interest, with a default guest Ubuntu Natty install CD, using the
default Xen 4.1 settings, we are seeing the guest (a) unplugging the
emulated devices (fine), then (b) failing to find the emulated devices,
and (c) the install failing. Is that to be expected?

-- 
Alex Bligh


static int __init check_platform_magic(void)
{
        short magic;
        char protocol;

        magic = inw(XEN_IOPORT_MAGIC);
        if (magic != XEN_IOPORT_MAGIC_VAL) {
                printk(KERN_ERR "Xen Platform PCI: unrecognised magic 
value\n");
                return XEN_PLATFORM_ERR_MAGIC;
        }

        protocol = inb(XEN_IOPORT_PROTOVER);

        printk(KERN_DEBUG "Xen Platform PCI: I/O protocol version %d\n",
                        protocol);

        switch (protocol) {
        case 1:
                outw(XEN_IOPORT_LINUX_PRODNUM, XEN_IOPORT_PRODNUM);
                outl(XEN_IOPORT_LINUX_DRVVER, XEN_IOPORT_DRVVER);
                if (inw(XEN_IOPORT_MAGIC) != XEN_IOPORT_MAGIC_VAL) {
                        printk(KERN_ERR "Xen Platform: blacklisted by 
host\n");
                        return XEN_PLATFORM_ERR_BLACKLIST;
                }
                break;
        default:
                printk(KERN_WARNING "Xen Platform PCI: unknown I/O protocol 
version");
                return XEN_PLATFORM_ERR_PROTOCOL;
        }

        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 Oct 26 09:28:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:28:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6LR-0000qW-E9; Wed, 26 Oct 2011 09:28:49 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6I3-0007rC-8V
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:25:20 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319646314!845372!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13533 invoked from network); 26 Oct 2011 16:25:16 -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;
	26 Oct 2011 16:25:16 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315195200"; d="scan'208";a="168305815"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 12:25:14 -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; Wed, 26 Oct 2011 12:25:14 -0400
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
	p9QGPCe7019366;	Wed, 26 Oct 2011 09:25:13 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 03b570c3792bb6abce46de5c9ab560ac169117c3
Message-ID: <03b570c3792bb6abce46.1319646312@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 17:25:12 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH] docs: import HVM emulated device unplug
	protocol spec
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319646021 -3600
# Node ID 03b570c3792bb6abce46de5c9ab560ac169117c3
# Parent  c681dd5aecf3da3c6fd0e4d8a760a9cd18617033
docs: import HVM emulated device unplug protocol spec

Convert to markdown as I go.

Currently this lives in qemu-xen.git i386-dm/README.hvm-pv-magic-ioport-disable
and I can never find it when I want it. As we transition to upstream qemu this
location becomes less useful.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r c681dd5aecf3 -r 03b570c3792b docs/misc/hvm-emulated-unplug.markdown
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/misc/hvm-emulated-unplug.markdown	Wed Oct 26 17:20:21 2011 +0100
@@ -0,0 +1,68 @@
+#Xen HVM emulated device unplug protocol
+
+The protocol covers three basic things:
+
+ * Disconnecting emulated devices.
+ * Getting log messages out of the drivers and into dom0.
+ * Allowing dom0 to block the loading of specific drivers.  This is
+   intended as a backwards-compatibility thing: if we discover a bug
+   in some old version of the drivers, then rather than working around
+   it in Xen, we have the option of just making those drivers fall
+   back to emulated mode.
+
+The current protocol works like this (from the point of view of
+drivers):
+
+1. When the drivers first come up, they check whether the unplug logic
+   is available by reading a two-byte magic number from IO port `0x10`.
+   These should be `0x49d2`.  If the magic number doesn't match, the
+   drivers don't do anything.
+
+2. The drivers read a one-byte protocol version from IO port `0x12`.  If
+   this is 0, skip to 6.
+
+3. The drivers write a two-byte product number to IO port `0x12`.  At
+   the moment, the only drivers using this protocol are our
+   closed-source ones, which use product number 1.
+
+4. The drivers write a four-byte build number to IO port `0x10`.
+
+5. The drivers check the magic number by reading two bytes from `0x10`
+   again.  If it's changed from `0x49d2` to `0xd249`, the drivers are
+   blacklisted and should not load.
+
+6. The drivers write a two-byte bitmask of devices to unplug to IO
+   port `0x10`.  The defined fields are:
+
+  * `1` -- All IDE disks (not including CD drives)
+  * `2` -- All emulated NICs
+  * `4` -- All IDE disks except for the primary master (not including CD
+	   drives)
+
+   The relevant emulated devices then disappear from the relevant
+   buses.  For most guest operating systems, you want to do this
+   before device enumeration happens.
+
+Once the drivers have checked the magic number, they can send log
+messages to qemu which will be logged to wherever qemu's logs go
+(`/var/log/xen/qemu-dm.log` on normal Xen, dom0 syslog on XenServer).
+These messages are written to IO port `0x12` a byte at a time, and are
+terminated by newlines.  There's a fairly aggressive rate limiter on
+these messages, so they shouldn't be used for anything even vaguely
+high-volume, but they're rather useful for debugging and support.
+
+It is still permitted for a driver to use this logging feature if it
+is blacklisted, but *ONLY* if it has checked the magic number and found
+it to be `0x49d2` or `0xd249`.
+
+This isn't exactly a pretty protocol, but it does solve the problem.
+
+The blacklist is, from qemu's point of view, handled mostly through
+xenstore.  A driver version is considered to be blacklisted if
+`/mh/driver-blacklist/{product_name}/{build_number}` exists and is
+readable, where `{build_number}` is the build number from step 4 as a
+decimal number.  `{product_name}` is a string corresponding to the
+product number in step 3.
+
+The master registry of product names and numbers is in
+qemu-xen-unstable's xenstore.c.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:29:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:29:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6MB-0001DT-HU; Wed, 26 Oct 2011 09:29:35 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6Jd-0008Vj-7R
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:26:57 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319646412!30742490!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20750 invoked from network); 26 Oct 2011 16:26:54 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 16:26:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315195200"; d="scan'208";a="168306214"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 12:26: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; Wed, 26 Oct 2011 12:26:52 -0400
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
	p9QGQoVJ019369;	Wed, 26 Oct 2011 09:26:51 -0700
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Date: Wed, 26 Oct 2011 17:26:50 +0100
Message-ID: <1319646410-30168-1-git-send-email-ian.campbell@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <03b570c3792bb6abce46.1319646312@cosworth.uk.xensource.com>
References: <03b570c3792bb6abce46.1319646312@cosworth.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH] qemu-xen: remove
	i386-dm/README.hvm-pv-magic-ioport-disable
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 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>
---
 i386-dm/README.hvm-pv-magic-ioport-disable |   70 ----------------------------
 1 files changed, 0 insertions(+), 70 deletions(-)
 delete mode 100644 i386-dm/README.hvm-pv-magic-ioport-disable

diff --git a/i386-dm/README.hvm-pv-magic-ioport-disable b/i386-dm/README.hvm-pv-magic-ioport-disable
deleted file mode 100644
index 142394a..0000000
--- a/i386-dm/README.hvm-pv-magic-ioport-disable
+++ /dev/null
@@ -1,70 +0,0 @@
-MAGIC IOPORT 0x10 PROTOCOL
-
-The protocol covers three basic things:
-
--- Disconnecting emulated devices.
--- Getting log messages out of the drivers and into dom0.
--- Allowing dom0 to block the loading of specific drivers.  This is
-   intended as a backwards-compatibility thing: if we discover a bug
-   in some old version of the drivers, then rather than working around
-   it in Xen, we have the option of just making those drivers fall
-   back to emulated mode.
-
-The current protocol works like this (from the point of view of
-drivers):
-
-1) When the drivers first come up, they check whether the unplug logic
-   is available by reading a two-byte magic number from IO port 0x10.
-   These should be 0x49d2.  If the magic number doesn't match, the
-   drivers don't do anything.
-
-2) The drivers read a one-byte protocol version from IO port 0x12.  If
-   this is 0, skip to 6.
-
-3) The drivers write a two-byte product number to IO port 0x12.  At
-   the moment, the only drivers using this protocol are our
-   closed-source ones, which use product number 1.
-
-4) The drivers write a four-byte build number to IO port 0x10.
-
-5) The drivers check the magic number by reading two bytes from 0x10
-   again.  If it's changed from 0x49d2 to 0xd249, the drivers are
-   blacklisted and should not load.
-
-6) The drivers write a two-byte bitmask of devices to unplug to IO
-   port 0x10.  The defined fields are:
-
-   1 -- All IDE disks (not including CD drives)
-   2 -- All emulated NICs
-   4 -- All IDE disks except for the primary master (not including CD
-	drives)
-
-   The relevant emulated devices then disappear from the relevant
-   buses.  For most guest operating systems, you want to do this
-   before device enumeration happens.
-
-...) Once the drivers have checked the magic number, they can send log
-     messages to qemu which will be logged to wherever qemu's logs go
-     (/var/log/xen/qemu-dm.log on normal Xen, dom0 syslog on
-     XenServer).  These messages are written to IO port 0x12 a byte at
-     a time, and are terminated by newlines.  There's a fairly
-     aggressive rate limiter on these messages, so they shouldn't be
-     used for anything even vaguely high-volume, but they're rather
-     useful for debugging and support.
-
-     It is still permitted for a driver to use this logging feature if
-     it is blacklisted, but ONLY if it has checked the magic number
-     and found it to be 0x49d2 or 0xd249.
-
-This isn't exactly a pretty protocol, but it does solve the problem.
-
-
-The blacklist is, from qemu's point of view, handled mostly through
-xenstore.  A driver version is considered to be blacklisted if
-/mh/driver-blacklist/{product_name}/{build_number} exists and is
-readable, where {build_number} is the build number from step 4 as a
-decimal number.  {product_name} is a string corresponding to the
-product number in step 3.
-
-The master registry of product names and numbers is in
-qemu-xen-unstable's xenstore.c.
-- 
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 Wed Oct 26 09:30:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:30:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6Mu-0001aX-PJ; Wed, 26 Oct 2011 09:30:20 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6KN-0000R5-8w
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:27:43 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1319646458!36812867!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5201 invoked from network); 26 Oct 2011 16:27:40 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 16:27:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315195200"; d="scan'208";a="168306366"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 12:27: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; Wed, 26 Oct 2011 12:27:37 -0400
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
	p9QGRa7D019372;	Wed, 26 Oct 2011 09:27:36 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 52058c9448935818e2a810a438244e06f40b4e0e
Message-ID: <52058c9448935818e2a8.1319646456@cosworth.uk.xensource.com>
In-Reply-To: <03b570c3792bb6abce46.1319646312@cosworth.uk.xensource.com>
References: <03b570c3792bb6abce46.1319646312@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Wed, 26 Oct 2011 17:27:36 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: Ian Campbell <ian.campbell@citrix.com>
Subject: [Xen-devel] [PATCH] docs: add some scaffolding for building HTML
 docs from markdown
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319646217 -3600
# Node ID 52058c9448935818e2a810a438244e06f40b4e0e
# Parent  03b570c3792bb6abce46de5c9ab560ac169117c3
docs: add some scaffolding for building HTML docs from markdown

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 03b570c3792b -r 52058c944893 docs/Docs.mk
--- a/docs/Docs.mk	Wed Oct 26 17:20:21 2011 +0100
+++ b/docs/Docs.mk	Wed Oct 26 17:23:37 2011 +0100
@@ -7,3 +7,4 @@ DOXYGEN		:= doxygen
 POD2MAN		:= pod2man
 DOT		:= dot
 NEATO		:= neato
+MARKDOWN	:= markdown
diff -r 03b570c3792b -r 52058c944893 docs/Makefile
--- a/docs/Makefile	Wed Oct 26 17:20:21 2011 +0100
+++ b/docs/Makefile	Wed Oct 26 17:23:37 2011 +0100
@@ -11,10 +11,11 @@ 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_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))
-
+DOC_HTML	:= $(patsubst src/%.tex,html/%/index.html,$(DOC_TEX)) \
+		   $(patsubst %.markdown,html/%.html,$(DOC_MARKDOWN))
 GFX = $(patsubst %.fig, %.eps, $(wildcard figs/*.fig))
 
 .PHONY: all
@@ -37,9 +38,7 @@ ps: $(DOC_PS)
 pdf: $(DOC_PDF)
 
 .PHONY: html
-html:
-	@if which $(LATEX2HTML) 1>/dev/null 2>/dev/null; then \
-	$(MAKE) $(DOC_HTML); fi
+html: $(DOC_HTML)
 
 .PHONY: python-dev-docs
 python-dev-docs:
@@ -110,7 +109,16 @@ ps/%.ps: %.dvi
 	$(FIG2DEV) -L eps $< $@
 
 html/%/index.html: src/%.tex
-	$(INSTALL_DIR) $(@D)
+	@$(INSTALL_DIR) $(@D)
+	@set -e ; if which $(LATEX2HTML) 1>/dev/null 2>/dev/null; then \
+        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
+	$< 1>/dev/null 2>/dev/null ;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

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:31:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:31:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6Nk-0001yG-MK; Wed, 26 Oct 2011 09:31:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6N8-0001gY-Nm
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:30:35 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-16.tower-182.messagelabs.com!1319646631!850318!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29875 invoked from network); 26 Oct 2011 16:30:31 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-16.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 26 Oct 2011 16:30:31 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319646631; l=1346;
	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=cJHzT8NOmCD/usDFKJ1X0h8yPFw=;
	b=DcbhRYcilcFrMCQNfQhHwsjCv/uMLZGS1GnZa/K9GSgKYJF1b7rcZwuZL+kbgkdjJyH
	Z67yECuIthcxsvanfVB+/Iu6iR4TGPnqCZ2ia6IV3Jab0MV3swzIfPBdmBAqOVQ7a87+/
	sKs2Ks5ITiCdi0aWoj8wqi1aigoVbQIu1w0=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmwtM48/lq0M7pFQI=
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-084-057-079-027.pools.arcor-ip.net [84.57.79.27])
	by smtp.strato.de (cohen mo36) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id x0663bn9QGL2Ug ;
	Wed, 26 Oct 2011 18:30:27 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 6CB5418637; Wed, 26 Oct 2011 18:30:26 +0200 (CEST)
Date: Wed, 26 Oct 2011 18:30:26 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: Re: [Xen-devel] [PATCH 17 of 24] libxl: add
	libxl__spawn_confirm_offspring_startup
Message-ID: <20111026163026.GA20100@aepfle.de>
References: <patchbomb.1317657277@probook.site>
	<018f63b6e4863faca16a.1317657294@probook.site>
	<20134.54883.620815.989672@mariner.uk.xensource.com>
	<20111025172159.GA11571@aepfle.de>
	<20134.63407.291964.492321@mariner.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <20134.63407.291964.492321@mariner.uk.xensource.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, Oct 25, Ian Jackson wrote:

> Olaf Hering writes ("Re: [Xen-devel] [PATCH 17 of 24] libxl: add libxl__spawn_confirm_offspring_startup"):
> > On Tue, Oct 25, Ian Jackson wrote:
> > > Olaf Hering writes ("[Xen-devel] [PATCH 17 of 24] libxl: add libxl__spawn_confirm_offspring_startup"):
> > > > libxl: add libxl__spawn_confirm_offspring_startup
> > > > 
> > > > libxl__spawn_confirm_offspring_startup() is a generic version of
> > > > libxl__confirm_device_model_startup().
> > > 
> > > Thanks but I think it would be better to refactor this to avoid the
> > > duplication of this code.
> > 
> > The new function is used in patch #18 of this series.
> > Or do you have some other changes in mind?
> 
> I mean that you should arrange to replace
> libxl__confirm_device_model_startup with your new function
> libxl__spawn_confirm_offspring_startup.
> 
> As it is you have made a copy of libxl__confirm_device_model_startup
> and lightly edited it.  This is a cardinal sin in programming, known
> as "clone and hack".

I moved the device model specific functions and made them generic.
Perhaps I should have merged the add+use patches (15+16 / 17+18) into a
single change. Once all patches are applied I see no code duplication.

If you prefer I can send a series just for the spawn related changes in
libxl.


Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:35:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:35:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6SF-0002lm-NH; Wed, 26 Oct 2011 09:35:51 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6Rk-0002Zd-RA
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:35:21 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1319646917!1154171!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7228 invoked from network); 26 Oct 2011 16:35:17 -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;
	26 Oct 2011 16:35:17 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315180800"; 
   d="scan'208";a="8602333"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 16:35:16 +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, 26 Oct 2011 17:35:16 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Wed, 26 Oct 2011 17:35:16 +0100
In-Reply-To: <03b570c3792bb6abce46.1319646312@cosworth.uk.xensource.com>
References: <03b570c3792bb6abce46.1319646312@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: <1319646916.9436.44.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Subject: [Xen-devel] Re: [PATCH] docs: import HVM emulated device unplug
	protocol spec
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-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?

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:44:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:44:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6ab-0003yz-H7; Wed, 26 Oct 2011 09:44:29 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6a1-0003lr-0g
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:43:53 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1319647429!1759900!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4379 invoked from network); 26 Oct 2011 16:43:50 -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;
	26 Oct 2011 16:43:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315180800"; 
   d="scan'208";a="8602860"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 16:43: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;
	Wed, 26 Oct 2011 17:43:32 +0100
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Alex Bligh <alex@alex.org.uk>
Date: Wed, 26 Oct 2011 17:43:32 +0100
In-Reply-To: <AEAE0D618F71583484DA951D@nimrod.local>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.com>
	<AEAE0D618F71583484DA951D@nimrod.local>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319647412.9436.50.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Rzeszutek Wilk <konrad.wilk@oracle.com>, Konrad
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-26 at 17:25 +0100, Alex Bligh wrote:
> Ian,
> 
> > No, this will disable PV drivers.
> 
> I can confirm that our testing illustrates this :-(
> 
> > The decision to unplug is a kernel side decision and in PVHVM Linux
> > kernels is not currently possible to have both types of devices by
> > default due to the risk of dataloss if the guest is not correctly
> > configured (i.e. the kernel can't tell if it is mounting the same
> > filesystem via two paths). The xen_emul_unplug option is the current way
> > you can override this once you have confirmed that your guest
> > configuration is not dangerous. I'm afraid this necessarily involves
> > guest config and guest admin interaction.
> >
> > In principal we might be able to extend the unplug protocol (which would
> > involve patches to qemu, the kernel(s) and the toolstack) to allow
> > devices to be marked as being not necessary to unplug. Someone would
> > have to send patches though and it would be opening up a way for people
> > to lose data so we'd need to be careful.
> >
> > I'm sure that the unplug protocol is documented somewhere in the source
> > tree but I can't for the life of me find it :-(
> 
> So, the issue is this. We have thousands (literally) of disks in use
> by third parties on xen 3.3. Some are Windows, some are ancient linux,
> some are modern linux, etc. The hypervisor has no way of whether the
> images are going to use /dev/sda or /dev/xvda (i.e. PV or emulated)
> drivers. Indeed the most common linux case is that grub uses the
> emulated devices to load the kernel, then uses /dev/xvda as a root
> device, i.e. both are used (but not simultaneously).
> 
> We need to have the xen pci stuff on, so PV drivers operate (in both
> new and old kernels). But as modern linux kernels detect the unplug 
> functionality, they will unplug the emulated devices and then fail to
> boot because (for instance) under Xen3.3 using /dev/sdaX to access
> (say) your /boot partition worked perfectly well. What we need is a
> switch to revert to the old Xen3.3 (pre-unplug) behaviour, so any
> Linux kernel will see the same set of devices. I cannot believe this
> is a unique requirement for people attempting to do a Xen3.3 to
> Xen4.1 migration.

I'm a bit fuzzy on the details but I'm not sure what this has to do with
the host, the device naming and behaviour on unplug are kernel side
things, I'd expect that if /dev/sdaX as /boot worked on 3.3 it'll work
on 4.1 too. (I believe you that it doesn't work, I'm just wondering
aloud what I'm missing).

Can you give us the specifics of a setup which fails, e.g. a complete
guest cfg file, the kernel version, command line options, /etc/fstab,
dmesg etc.

> I think this is in xen_unplug_emulated_devices() in
> arch/x86/xen/platform-pci-unplug.c
> 
> This uses check_platform_magic(), which I have appended. In order
> to avoid unplugging (without relying on the boot line), I need
> this to return a non-zero value (XEN_PLATFORM_ERR_MAGIC is
> irrelevant as xen_emul_unplug is 0 by assumption).
> 
> I can achieve that by either (a) returning a bad magic number,
> (b) making the host 'blacklist' the product (how does that work?)
> or (c) using a protocol value of (say) 0. I take it Xen 3.3 simply
> returns a bad magic number as I don't think XEN_IOPORT_MAGIC existed
> in 3.3. As far as I can tell, XEN_IOPORT_MAGIC is only use for
> PCI unplug.
>
> So, is the correct approach to disable XEN_IOPORT_MAGIC (or rather
> make it return a different value) depending on a configuration option?
> If so, I am happy to submit a patch to do that. Or can I do this
> without a patch by "blacklisting" everything? (not sure how that is done).

Hmm, yes I think the special treatment of XEN_IOPORT_MAGIC mismatch on
the kernel side is what I was missing.

It might make sense to have a guest level config option which disables
these magic ports, i.e. makes them return 0xffff like they would have
done in 3.3 (I think 0xffff is what you'll get from an invalid port in
general).

> Out of interest, with a default guest Ubuntu Natty install CD, using the
> default Xen 4.1 settings, we are seeing the guest (a) unplugging the
> emulated devices (fine), then (b) failing to find the emulated devices,
> and (c) the install failing. Is that to be expected?

Sounds like an Ubuntu bug to me, but I don't follow Ubuntu closely
enough to know if it is known or not.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:47:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:47:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6dc-0004RR-A7; Wed, 26 Oct 2011 09:47:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6d7-0004Ew-Hb
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:47:06 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319647622!1170422!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26863 invoked from network); 26 Oct 2011 16:47:02 -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;
	26 Oct 2011 16:47:02 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315180800"; 
   d="scan'208";a="8602927"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 16:47:02 +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, 26 Oct 2011 17:47:02 +0100
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 1RJ6d4-0006za-00;
	Wed, 26 Oct 2011 16:47:02 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RJ6d3-0008Rf-S0;
	Wed, 26 Oct 2011 17:47:01 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9638-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 26 Oct 2011 17:47:01 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9638: 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 9638 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9638/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf     10 guest-saverestore  fail in 9625 REGR. vs. 9608

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf      5 xen-boot                     fail pass in 9637
 test-amd64-amd64-xl-sedf      7 debian-install       fail in 9637 pass in 9625

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                  c681dd5aecf3
baseline version:
 xen                  662dbf6ee71c

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Dario Faggioli <dario.faggioli@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Michael Young <m.a.young@durham.ac.uk>
  Paolo Bonzini <pbonzini@redhat.com>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Yang Zhang <yang.z.zhang@intel.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


Not pushing.

------------------------------------------------------------
changeset:   24003:c681dd5aecf3
tag:         tip
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:22:09 2011 +0100
    
    pygrub: example grub2 configuration file (fedora-16-with-xen.grub2)
    
    Sample grub2 configuration file (some duplication removed) from Fedora 16
    with a xen hypervisor installed
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   24002:979bc34d0ad0
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:21:05 2011 +0100
    
    pyrgrub: cope with configurations with set default="${saved_entry}" line
    
    Fedora 16 grub2 configuration file can have lines like
        set default="${saved_entry}"
    and a string containing an integer is expected
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   24001:152049468175
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:20:06 2011 +0100
    
    pygrub: cope with configurations with submenus
    
    The grub2 configuration file in Fedora 16 can have one or more
    menuentrys in a submenu, with configuration of the form
        submenu "Xen 4.1" {
        menuentry ... {
        ...
        }
        }
    (this example occurs when the xen hypervisor is installed on the
    guest)
    
    Ignore the submenu line and the corresponding }
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   24000:65679fee0177
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:19:19 2011 +0100
    
    pygrub: Allow GPT partition references
    
    The grub2 configuration file in Fedora 16 can have GPT partition
    references like (hd0,gpt2) so remove the "gpt" string where necessary
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   23999:138f707fa598
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:18:49 2011 +0100
    
    pygrub: look in /boot/grub2 (for eg Fedora 16)
    
    Fedora 16 puts grub configuration files in /boot/grub2/grub.cfg so
    pygrub should look there as well
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Acked-by: Ian Campbell <ian.campbell@citrix.com>
    
    
changeset:   23998:85d7b207fabc
user:        Michael Young <m.a.young@durham.ac.uk>
date:        Tue Oct 25 19:15:54 2011 +0100
    
    pygrub: check all GPT partitions
    
    On Fedora 16 the first GPT partition is a boot partition for grub2 with
    the grub2 configuration in the second partition.
    Check all GPT partitions for grub configuration, not just the first.
    
    [ Also remove now-inaccurate comment. -iwj ]
    
    Signed-off-by: Michael Young <m.a.young@durham.ac.uk>
    Tested-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23997:f273bce1fc26
user:        Ian Campbell <ian.campbell@citrix.com>
date:        Tue Oct 25 17:04:41 2011 +0100
    
    libxl: add missing "break;" to do_pci_remove
    
    Otherwise we erroneously fall through the LIBXL_DOMAIN_TYPE_PV case into the
    "default: abort()".
    
    (I'm sure we fixed this once already...)
    
    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    Tested-by: Dario Faggioli <dario.faggioli@citrix.com>
    Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
    
    
changeset:   23996:51a0c81a4030
user:        Christoph Egger <Christoph.Egger@amd.com>
date:        Tue Oct 25 16:48:17 2011 +0100
    
    hvm: Clean up I/O emulation
    
    Move HVM io fields into a structure.
    On MMIO instruction failure print out some more bytes.
    
    Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23995:8943a9696358
user:        Yang Zhang <yang.z.zhang@intel.com>
date:        Tue Oct 25 16:46:47 2011 +0100
    
    x86 pm: provide CC7/PC2 residency
    
    Sandy bridge introduces new MSR to get cc7/pc2 residency (core C-state
    7/package C-state 2). Print the cc7/pc2 residency when on sandy bridge
    platform.
    
    Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
changeset:   23994:662dbf6ee71c
user:        Jan Beulich <jbeulich@novell.com>
date:        Mon Oct 24 18:01:07 2011 +0100
    
    x86/hpet: fix cpumask allocation after 23990:1c8789852eaf
    
    hpet_fsb_cap_lookup(), if it doesn't find any FSB capable timer,
    leaves hpet_events allocated, while hpet_events->cpumask may not have
    been, As we're pretty generous with these one-time allocations already
    (in that hpet_events doesn't get freed when no usable counters were
    found, even if in that case only the first array entry [or none at
    all] may get used), simply make the cpumask allocation in the legacy
    case independent of whether hpet_events was NULL before.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Tested-by: Christoph Egger <Christoph.Egger@amd.com>
    Acked-by: Christoph Egger <Christoph.Egger@amd.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
========================================
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 Oct 26 09:49:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:49:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6fH-0004wf-91; Wed, 26 Oct 2011 09:49:19 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6da-0004PL-5G
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:47:34 -0700
X-Env-Sender: hedayati.mo@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319647629!49851654!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2747 invoked from network); 26 Oct 2011 16:47:09 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-8.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 16:47:09 -0000
Received: by wwf10 with SMTP id 10so2347495wwf.24
	for <xen-devel@lists.xensource.com>;
	Wed, 26 Oct 2011 09:47:30 -0700 (PDT)
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=TWiL3PcCkriHOckJ8AYqm2w0GOYAja3TdbRq/cpk0z8=;
	b=XLeggwUO/1YDhvYyXfq/xvmnRIsAVkETrscW0jGfiFHE51QpH8W3YR4T9pyVQgKCE1
	HvKKZp9WrDtX2fripVnpHvAUAWR7TtqE4sF0x9//a0LMUhip3Ec2k1f+HMqMqzczrq0d
	yDMGVX7gXOu2eStIJgkpsZ0KfhWAgfuH51fPs=
Received: by 10.216.166.70 with SMTP id f48mr12736742wel.38.1319647650210;
	Wed, 26 Oct 2011 09:47:30 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.216.26.76 with HTTP; Wed, 26 Oct 2011 09:46:49 -0700 (PDT)
From: Mohammad Hedayati <hedayati.mo@gmail.com>
Date: Wed, 26 Oct 2011 20:16:49 +0330
Message-ID: <CABA5EEsXEhN8DPwbm-YLMwW8qVK-1-gV37vCYCu=spG8uUUZ5g@mail.gmail.com>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] readonly grants
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0882381313=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0882381313==
Content-Type: multipart/alternative; boundary=0016367b61706b651a04b036699d

--0016367b61706b651a04b036699d
Content-Type: text/plain; charset=UTF-8

After mapping a readonly granted page in a PV guest, the guest can try to
change his l1 page table entry, faulting into Xen. Here xen emulates the
update operation, but first it must check whether the modification is
allowed or not (i.e. the grant is readonly or not).
I'm looking through the code, but I can't find where this checking is done.
Can anyone help?!

--0016367b61706b651a04b036699d
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><font face=3D"tahoma,sans-serif">After mapping a readonly =
granted page in a PV guest, the guest can try to change his l1 page table e=
ntry, faulting into Xen. Here xen emulates the update operation, but first =
it must check whether the modification is allowed or not (i.e. the grant is=
 readonly or not).</font><div>

<font face=3D"tahoma,sans-serif">I&#39;m looking through the code, but I ca=
n&#39;t find where this checking is done. Can anyone help?!</font></div></d=
iv>

--0016367b61706b651a04b036699d--


--===============0882381313==
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

--===============0882381313==--


From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:52:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:52:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6i1-0005P4-Ty; Wed, 26 Oct 2011 09:52:09 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6hS-0005A3-Ej
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:51:34 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319647891!1760101!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24380 invoked from network); 26 Oct 2011 16:51:31 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 16:51:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315180800"; 
   d="scan'208";a="8603019"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 16:51: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;
	Wed, 26 Oct 2011 17:51:28 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Wed, 26 Oct 2011 17:51:27 +0100
In-Reply-To: <1319644068-25814-2-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319644068-25814-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319644068-25814-2-git-send-email-dgdegra@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319647887.9436.55.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Keir \(Xen.org\)" <keir@xen.org>, "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH 1/3] xen/event: Add reference counting to
	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

On Wed, 2011-10-26 at 16:47 +0100, Daniel De Graaf wrote:
> @@ -939,6 +943,10 @@ static void unbind_from_irq(unsigned int irq)
>  {
>         struct evtchn_close close;
>         int evtchn = evtchn_from_irq(irq);
> +       struct irq_info *info = irq_get_handler_data(irq);
> +
> +       if (atomic_read(&info->refcnt) > 0 && !atomic_dec_and_test(&info->refcnt))
> +               return;

This isn't all that atomic any more...

evtchn_make_refcounted() doesn't seem to have any locking which would
save you...

Perhaps you could always manipulate this flag under the mapping lock
(which perhaps is normally taken around about the sort of place you'd
want to do this anyway) and make it non-atomic?

Or maybe you could build something with cmpxchg?

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:56:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:56:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6lt-0005rh-O6; Wed, 26 Oct 2011 09:56:09 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6lN-0005f5-Sl
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:55:38 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319648134!25418789!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16007 invoked from network); 26 Oct 2011 16:55:34 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-3.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 16:55:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315180800"; 
   d="scan'208";a="8603194"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 16:55:34 +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, 26 Oct 2011 17:55:34 +0100
Subject: Re: [Xen-devel] readonly grants
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Mohammad Hedayati <hedayati.mo@gmail.com>
Date: Wed, 26 Oct 2011 17:55:33 +0100
In-Reply-To: <CABA5EEsXEhN8DPwbm-YLMwW8qVK-1-gV37vCYCu=spG8uUUZ5g@mail.gmail.com>
References: <CABA5EEsXEhN8DPwbm-YLMwW8qVK-1-gV37vCYCu=spG8uUUZ5g@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: <1319648133.9436.58.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 Wed, 2011-10-26 at 17:46 +0100, Mohammad Hedayati wrote:
> After mapping a readonly granted page in a PV guest, the guest can try
> to change his l1 page table entry, faulting into Xen. Here xen
> emulates the update operation, but first it must check whether the
> modification is allowed or not (i.e. the grant is readonly or not).
> I'm looking through the code, but I can't find where this checking is
> done. Can anyone help?!

I don't think a guest can modify any grant mapping that way, read only
or otherwise, they have to use the GNTTABOP hypercalls.

The thing which prevents it is that the page is really owned by another
domain so the get_page_from_l1e in ptwr_emulated_update will fail.

(disclaimer, I'm not really sure about this...)

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 09:57:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 09:57:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6mx-0006Lp-5q; Wed, 26 Oct 2011 09:57:15 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6lf-0005lG-TI
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:55:56 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1319648151!1761084!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2159 invoked from network); 26 Oct 2011 16:55:52 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-13.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	26 Oct 2011 16:55:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315195200"; d="scan'208";a="168312383"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 12:55:29 -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; Wed, 26 Oct 2011 12:55:28 -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 p9QGtR21019462;	Wed, 26 Oct 2011 09:55:27 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>, Xen Devel
	<xen-devel@lists.xensource.com>
Date: Wed, 26 Oct 2011 17:55:25 +0100
Message-ID: <1319648125-16986-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>
Subject: [Xen-devel] [PATCH] docs, Add HowTo use QEMU upstream.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>

---
 docs/misc/qemu-upstream_howto_use_it.markdown |  122 +++++++++++++++++++++++++
 1 files changed, 122 insertions(+), 0 deletions(-)

diff --git a/docs/misc/qemu-upstream_howto_use_it.markdown b/docs/misc/qemu-upstream_howto_use_it.markdown
new file mode 100644
index 0000000..cdf920a
--- /dev/null
+++ b/docs/misc/qemu-upstream_howto_use_it.markdown
@@ -0,0 +1,122 @@
+Help to use QEMU (upstream version) with Xen
+============================================
+
+How to build it
+---------------
+
+### SeaBIOS
+
+This new device-model need a different bios, SeaBIOS. Clone the repository from:
+
+  - git://git.qemu.org/seabios.git
+  - http://git.qemu.org/git/seabios.git
+
+Put the `.config` file in the appendix at the root of seabios.git and build SeaBIOS.
+
+In xen-unstable source tree, add the file `.config` with
+`SEABIOS_DIR = /path/to/seabios.git`.
+To build hvmloader with SeaBIOS, you propably need to `make -C tools/firmware
+clean` first and then `make tools`, to use the new SEABIOS_DIR parameter.
+
+
+### QEMU
+
+Get QEMU upstream source from:
+
+  - git://xenbits.xensource.com/qemu-upstream-unstable.git
+  - http://xenbits.xensource.com/git-http/qemu-upstream-unstable.git
+
+To configure build QEMU upstream with Xen
+
+    ./configure --enable-xen --target-list=i386-softmmu --extra-cflags="-I$path_to_xen_source/tools/include -I$path_to_xen_source/tools/libxc -I$path_to_xen_source/tools/xenstore" --extra-ldflags="-L$path_to_xen_source/tools/libxc -L$path_to_xen_source/tools/xenstore"
+
+You can also use other several options such as `--disable-kvm`.
+
+
+How to use QEMU upstream
+------------------------
+
+Only xl support QEMU upstream.
+
+To actually use it, add or change this in your VM configuration file:
+
+    device_model_version = 'qemu-xen'
+    device_model_override = '/path/to/qemu/i386-softmmu/qemu'
+
+NB: On qemu-upstream repository, the default binary name have been renamed to
+`qemu-system-i386`.
+
+
+Appendix
+------
+
+### `.config` file for SeaBIOS
+
+    #
+    # General Features
+    #
+    # CONFIG_COREBOOT is not set
+    CONFIG_XEN=y
+    CONFIG_THREADS=y
+    CONFIG_THREAD_OPTIONROMS=y
+    CONFIG_RELOCATE_INIT=y
+    CONFIG_BOOTMENU=y
+    CONFIG_BOOTMENU_WAIT=1000
+    # CONFIG_BOOTSPLASH is not set
+    CONFIG_BOOTORDER=y
+    #
+    # Hardware support
+    #
+    CONFIG_ATA=y
+    CONFIG_ATA_DMA=y
+    CONFIG_ATA_PIO32=y
+    CONFIG_AHCI=y
+    CONFIG_VIRTIO_BLK=y
+    CONFIG_FLOPPY=y
+    CONFIG_PS2PORT=y
+    CONFIG_USB=y
+    CONFIG_USB_UHCI=y
+    CONFIG_USB_OHCI=y
+    CONFIG_USB_EHCI=y
+    CONFIG_USB_MSC=y
+    CONFIG_USB_HUB=y
+    CONFIG_USB_KEYBOARD=y
+    CONFIG_USB_MOUSE=y
+    CONFIG_SERIAL=y
+    CONFIG_LPT=y
+    # CONFIG_EXTRA_PCI_ROOTS is not set
+    # CONFIG_USE_SMM is not set
+    CONFIG_MTRR_INIT=y
+    #
+    # BIOS interfaces
+    #
+    CONFIG_DRIVES=y
+    # CONFIG_CDROM_BOOT is not set
+    CONFIG_PCIBIOS=y
+    CONFIG_APMBIOS=y
+    CONFIG_PNPBIOS=y
+    CONFIG_OPTIONROMS=y
+    # CONFIG_OPTIONROMS_DEPLOYED is not set
+    CONFIG_OPTIONROMS_CHECKSUM=y
+    CONFIG_PMM=y
+    CONFIG_BOOT=y
+    CONFIG_KEYBOARD=y
+    CONFIG_KBD_CALL_INT15_4F=y
+    CONFIG_MOUSE=y
+    CONFIG_S3_RESUME=y
+    # CONFIG_S3_RESUME_VGA_INIT is not set
+    # CONFIG_DISABLE_A20 is not set
+    #
+    # BIOS Tables
+    #
+    CONFIG_PIRTABLE=y
+    CONFIG_MPTABLE=y
+    CONFIG_SMBIOS=y
+    CONFIG_ACPI=y
+    #
+    # Debugging
+    #
+    CONFIG_DEBUG_LEVEL=3
+    CONFIG_DEBUG_SERIAL=y
+    CONFIG_DEBUG_SERIAL_PORT=0x3f8
+    # CONFIG_SCREEN_AND_DEBUG is not set
-- 
tg: (440f4bd..) docs/qemu (depends on: master)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 10:05:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 10:05:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ6uf-0007XY-2x; Wed, 26 Oct 2011 10:05:13 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ6nY-0006XD-Lr
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 09:57:53 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319648262!1163234!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30083 invoked from network); 26 Oct 2011 16:57:42 -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;
	26 Oct 2011 16:57:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,410,1315180800"; 
   d="scan'208";a="8603245"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 16:57:42 +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, 26 Oct 2011 17:57:42 +0100
Subject: Re: [Xen-devel] Re: [PATCH 1/3] xen/event: Add reference counting
	to event channels
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Wed, 26 Oct 2011 17:57:42 +0100
In-Reply-To: <1319647887.9436.55.camel@zakaz.uk.xensource.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319644068-25814-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319644068-25814-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319647887.9436.55.camel@zakaz.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: <1319648262.9436.60.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>,
	"jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.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 Wed, 2011-10-26 at 17:51 +0100, Ian Campbell wrote:
> On Wed, 2011-10-26 at 16:47 +0100, Daniel De Graaf wrote:
> > @@ -939,6 +943,10 @@ static void unbind_from_irq(unsigned int irq)
> >  {
> >         struct evtchn_close close;
> >         int evtchn = evtchn_from_irq(irq);
> > +       struct irq_info *info = irq_get_handler_data(irq);
> > +
> > +       if (atomic_read(&info->refcnt) > 0 && !atomic_dec_and_test(&info->refcnt))
> > +               return;
> 
> This isn't all that atomic any more...
> 
> evtchn_make_refcounted() doesn't seem to have any locking which would
> save you...
> 
> Perhaps you could always manipulate this flag under the mapping lock
> (which perhaps is normally taken around about the sort of place you'd
> want to do this anyway) and make it non-atomic?
> 
> Or maybe you could build something with cmpxchg?

Or atomic_inc_unless_negative seems to be a primitive but there's no
atomic_dev_unless_negative so unref is still tricky.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 10:28:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 10:28:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ7H8-0001se-Sy; Wed, 26 Oct 2011 10:28:26 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ7Gf-0001fx-Bu
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 10:27:57 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319650062!52633411!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4189 invoked from network); 26 Oct 2011 17:27:42 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-15.tower-27.messagelabs.com with SMTP;
	26 Oct 2011 17:27:42 -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
	p9QHRomW022801; Wed, 26 Oct 2011 17:27:50 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 p9QHRjY0025898; 
	Wed, 26 Oct 2011 13:27:46 -0400
Message-ID: <4EA84323.4000108@tycho.nsa.gov>
Date: Wed, 26 Oct 2011 13:28:03 -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: Ian Campbell <Ian.Campbell@citrix.com>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319644068-25814-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319644068-25814-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319647887.9436.55.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319647887.9436.55.camel@zakaz.uk.xensource.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: "Keir \(Xen.org\)" <keir@xen.org>, "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH 1/3] xen/event: Add reference counting to
	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

On 10/26/2011 12:51 PM, Ian Campbell wrote:
> On Wed, 2011-10-26 at 16:47 +0100, Daniel De Graaf wrote:
>> @@ -939,6 +943,10 @@ static void unbind_from_irq(unsigned int irq)
>>  {
>>         struct evtchn_close close;
>>         int evtchn = evtchn_from_irq(irq);
>> +       struct irq_info *info = irq_get_handler_data(irq);
>> +
>> +       if (atomic_read(&info->refcnt) > 0 && !atomic_dec_and_test(&info->refcnt))
>> +               return;
> 
> This isn't all that atomic any more...
> 
> evtchn_make_refcounted() doesn't seem to have any locking which would
> save you...
> 
> Perhaps you could always manipulate this flag under the mapping lock
> (which perhaps is normally taken around about the sort of place you'd
> want to do this anyway) and make it non-atomic?
> 
> Or maybe you could build something with cmpxchg?
> 
> Ian.
> 

It's atomic for the cases where it needs to be. There are two cases in which
unbind_from_irq can be called:

1. Negative refcnt (to be exact, == -1). This is an internal reference, and
unbind_from_irq is only called once as guaranteed by the caller.

2. Positive refcnt. Once refcnt has been changed to positive, it cannot be
changed back, so "atomic_read(&info->refcnt) > 0" will always be true, for
any number of parallel callers, assuming all callers had a reference to begin
with. In this case, only the atomic_dec_and_test needs atomicity to resolve
the race when parallel callers are running evtchn_put.

The conversion from -1 to positive refcnt is done during the creation of the
event channel, before multiple references to the event channel are allowed.
There is also no way to convert an event channel from positive to negative
(without destroying it completely) so a race from that conversion is also
not possible.

I considered using atomic_dec_if_positive here, but as the existing condition
has no races this is unnecessary.

Should this explanation be copied into a comment to avoid future confusion?

-- 
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 Wed Oct 26 10:37:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 10: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 1RJ7Pw-0003qd-Dq; Wed, 26 Oct 2011 10:37:32 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ7PJ-0003aI-No
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 10:36:54 -0700
X-Env-Sender: hedayati.mo@gmail.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319650610!861333!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22352 invoked from network); 26 Oct 2011 17:36:50 -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;
	26 Oct 2011 17:36:50 -0000
Received: by wyi11 with SMTP id 11so2473237wyi.30
	for <xen-devel@lists.xensource.com>;
	Wed, 26 Oct 2011 10:36: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
	:content-type; bh=PPQtoN2hOA1f1NfIlFhpZcSu9udYcO2njblwEn3jTuU=;
	b=b4zhfnDbWdo9tz12fzR9D1Dzxwst1gd887hsY+hA2UGtp83p6QVUJGufmWMjDZTE/z
	R+U01WYJ1zpKd0EgnimuQEqjbL9FNqYy/eYBcsa+KED5XlE8vBhoIAPUn1tMmR2MFb60
	1CLEaqN5xquKNJnVkR1TP3wHOLyInDPFtK89w=
Received: by 10.216.25.132 with SMTP id z4mr1306336wez.38.1319650610545; Wed,
	26 Oct 2011 10:36:50 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.216.26.76 with HTTP; Wed, 26 Oct 2011 10:36:10 -0700 (PDT)
In-Reply-To: <1319648133.9436.58.camel@zakaz.uk.xensource.com>
References: <CABA5EEsXEhN8DPwbm-YLMwW8qVK-1-gV37vCYCu=spG8uUUZ5g@mail.gmail.com>
	<1319648133.9436.58.camel@zakaz.uk.xensource.com>
From: Mohammad Hedayati <hedayati.mo@gmail.com>
Date: Wed, 26 Oct 2011 21:06:10 +0330
Message-ID: <CABA5EEvkcJpNvPqJHvhcnCs3jKkhYvsA44tC1aA-oztzYS7_FQ@mail.gmail.com>
Subject: Re: [Xen-devel] readonly grants
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=UTF-8
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Though the page is not owned by the issuing domain, the l1 page is, so
the l1e_get_page (if you meant so instead of get_page_from_l1e)
succeeds. There should be a check somewhere else, probably in
x86_emulate or subordinate routines.

On Wed, Oct 26, 2011 at 8:25 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Wed, 2011-10-26 at 17:46 +0100, Mohammad Hedayati wrote:
>> After mapping a readonly granted page in a PV guest, the guest can try
>> to change his l1 page table entry, faulting into Xen. Here xen
>> emulates the update operation, but first it must check whether the
>> modification is allowed or not (i.e. the grant is readonly or not).
>> I'm looking through the code, but I can't find where this checking is
>> done. Can anyone help?!
>
> I don't think a guest can modify any grant mapping that way, read only
> or otherwise, they have to use the GNTTABOP hypercalls.
>
> The thing which prevents it is that the page is really owned by another
> domain so the get_page_from_l1e in ptwr_emulated_update will fail.
>
> (disclaimer, I'm not really sure about this...)
>
> Ian.
>
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 10:44:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 10:44:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ7WI-0005M5-IV; Wed, 26 Oct 2011 10:44:06 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ7Vf-00053C-Lu
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 10:43:29 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319650993!52634597!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5072 invoked from network); 26 Oct 2011 17:43:13 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-15.tower-27.messagelabs.com with SMTP;
	26 Oct 2011 17:43:13 -0000
Received: from [172.16.2.233] (92.40.253.9.threembb.co.uk [92.40.253.9])
	by mail.avalus.com (Postfix) with ESMTPSA id B1949C5610A;
	Wed, 26 Oct 2011 18:43:22 +0100 (BST)
Date: Wed, 26 Oct 2011 18:43:20 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
Message-ID: <1F3C32D227DDE8714E7A546D@nimrod.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>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
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

Ian,

> I'm a bit fuzzy on the details but I'm not sure what this has to do with
> the host, the device naming and behaviour on unplug are kernel side
> things, I'd expect that if /dev/sdaX as /boot worked on 3.3 it'll work
> on 4.1 too. (I believe you that it doesn't work, I'm just wondering
> aloud what I'm missing).
>
> Can you give us the specifics of a setup which fails, e.g. a complete
> guest cfg file, the kernel version, command line options, /etc/fstab,
> dmesg etc.

I am not avoiding answering your question (I will get you this) but
what is /meant/ to happen in the following scenario:

* Install on recent kernel (e.g. 2.6.37) running on Xen 3.3
* No fancy boot options, xen_emul_unplug not set
* No XEN_IOPORT_MAGIC implemented, so check_platform_magic()
  returns an error
* Therefore xen_platform_pci_unplug=0
* Therefore blkfront etc. don't init (probe returns
  -ENODEV)
* Therefore OS boots with root=/dev/sda

Now Xen 3.3 is upgraded to Xen 4
* Kernel boots, and XEN_IOPORT_MAGIC now exists
* Therefore unplug occurs, and xen_platform_pci_unplug is non zero
* Therefore blkfront etc. inits, and PV drivers start
* OS still boots with root=/dev/sda

Are the PV devices meant to appear as /dev/sdX rather than /dev/xvdX?
If so, how in the code does this happen? If not, won't the boot fail?

> Hmm, yes I think the special treatment of XEN_IOPORT_MAGIC mismatch on
> the kernel side is what I was missing.
>
> It might make sense to have a guest level config option which disables
> these magic ports, i.e. makes them return 0xffff like they would have
> done in 3.3 (I think 0xffff is what you'll get from an invalid port in
> general).

Actually I don't think this will work. If we do this,
xen_plaftofm_pci_unplug will still be zero (as it's only set on exit
of the function after a successful unplug), and that's enough to
prevent blkfront and xenbus_probe_frontend from doing anything useful,
so will effectively disable PV drivers even where they should be enabled.

>> Out of interest, with a default guest Ubuntu Natty install CD, using the
>> default Xen 4.1 settings, we are seeing the guest (a) unplugging the
>> emulated devices (fine), then (b) failing to find the emulated devices,
>> and (c) the install failing. Is that to be expected?
>
> Sounds like an Ubuntu bug to me, but I don't follow Ubuntu closely
> enough to know if it is known or not.

We will investigate further. Currently we can't seem to get /any/
distro using PV drivers, and only old ones using emulated drivers.

-- 
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 Oct 26 11:15:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 11:15:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ80a-00005Y-Rh; Wed, 26 Oct 2011 11:15:24 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ7zN-0008KD-6V
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 11:14:12 -0700
X-Env-Sender: jfehlig@suse.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1319652845!1186539!1
X-Originating-IP: [137.65.248.97]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18478 invoked from network); 26 Oct 2011 18:14:05 -0000
Received: from novprvoes0314.provo.novell.com (HELO mail.novell.com)
	(137.65.248.97) by server-9.tower-216.messagelabs.com with SMTP;
	26 Oct 2011 18:14:05 -0000
Received: from [164.99.195.10] ([::ffff:164.99.195.10])
	by mail.novell.com with ESMTP; Wed, 26 Oct 2011 12:13:51 -0600
Message-ID: <4EA84DBA.6070901@suse.com>
Date: Wed, 26 Oct 2011 12:13:14 -0600
From: Jim Fehlig <jfehlig@suse.com>
User-Agent: Thunderbird 2.0.0.24 (X11/20100302)
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] Prevent vif-bridge from adding user-created
	taps to a bridge
References: <4EA740EB.7030804@suse.com>
	<1319614636.16747.39.camel@dagon.hellion.org.uk>
In-Reply-To: <1319614636.16747.39.camel@dagon.hellion.org.uk>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
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

Ian Campbell wrote:
> On Wed, 2011-10-26 at 00:06 +0100, Jim Fehlig wrote:
>   
>> I previously sent this from my @suse.com mail address without having
>> subscribed it.  Sending again now that I have done so...
>>
>> 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
>>     
>
> Oh dear.
>
>   
>> SUBSYSTEM=="net", KERNEL=="tap*", ACTION=="add",
>> RUN+="/etc/xen/scripts/vif-setup $env{ACTION} type_if=tap"
>>
>> 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?
>>     
>
> I think overall your change is an improvement, some thoughts:
>
> For a tap device XENBUS_PATH is set in vif-common.sh:
>         elif [ "$type_if" = tap ]; then
>             # Check presence of compulsory args.
>             : ${INTERFACE:?}
>         
>             # Get xenbus_path from device name.
>             # The name is built like that: "tap${domid}.${devid}".
>             dev_=${dev#tap}
>             domid=${dev_%.*}
>             devid=${dev_#*.}
>         
>             XENBUS_PATH="/local/domain/0/backend/vif/$domid/$devid"
>         fi
>
> Could there be false positives from this?

Hmm, yes, I think it is possible.

>  Perhaps we should be more
> aggressively checking for the tapX.Y, where X and Y are integers, format
> as well? (that's not foolproof either though).
>   

Yeah, I don't think that buys us much.

> Perhaps the toolstack could write something to xenstore containing the
> literal tap device name which it asked qemu for? Then we can simply read
> it back here, e.g. /libxl/tap/0/tapX.Y -> $XENBUS_PATH (0 being the
> backend domain and the content being the xenbus path so we don't need to
> magic it up).
>   

I think this is a better approach.  But generally, we don't ask qemu for
a tap device right?  Only when using an emulated NIC afaik.  It seems I
should be able to write the info you suggested to xenstore in
libxl_device_nic_add().  The front and back paths and their contents are
already being created there.

Thanks,
Jim

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 11:43:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 11:43:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ8S9-0001wK-AB; Wed, 26 Oct 2011 11:43:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ8R6-0001h0-D3
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 11:42:48 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-9.tower-216.messagelabs.com!1319654565!1188511!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5201 invoked from network); 26 Oct 2011 18:42:45 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-9.tower-216.messagelabs.com with SMTP;
	26 Oct 2011 18:42:45 -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
	p9QIgcmW017180; Wed, 26 Oct 2011 18:42:38 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 p9QIgZLS032234; 
	Wed, 26 Oct 2011 14:42:35 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Wed, 26 Oct 2011 14:42:51 -0400
Message-Id: <1319654571-29654-1-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319644068-25814-2-git-send-email-dgdegra@tycho.nsa.gov>
References: <1319644068-25814-2-git-send-email-dgdegra@tycho.nsa.gov>
Cc: jeremy@goop.org, xen-devel@lists.xensource.com, keir@xen.org,
	Ian.Campbell@citrix.com, Ian.Jackson@eu.citrix.com,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 1/3 v3.2] xen/event: Add reference counting to
	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

The previous version had a race where running evtchn_get in parallel
with an event channel's destruction could attempt to manipulate an event
channel that is in the process of being freed. Using the 
irq_mapping_update_lock mutex instead of an atomic refcnt prevents this.

------------------------------------------------------>8

Event channels exposed to userspace by the evtchn module may be used by
other modules in an asynchronous manner, which requires that reference
counting be used to prevent the event channel from being closed before
the signals are delivered.

The reference count on new event channels defaults to -1 which indicates
the event channel is not referenced outside the kernel; evtchn_get fails
if called on such an event channel. The event channels made visible to
userspace by evtchn have a normal reference count.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/events.c |   74 +++++++++++++++++++++++++++++++++++++++++++++++++-
 drivers/xen/evtchn.c |    2 +-
 include/xen/events.h |    7 +++++
 3 files changed, 81 insertions(+), 2 deletions(-)

diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 073c11d..0237629 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -87,6 +87,7 @@ enum xen_irq_type {
  */
 struct irq_info {
 	struct list_head list;
+	int refcnt;
 	enum xen_irq_type type;	/* type */
 	unsigned irq;
 	unsigned short evtchn;	/* event channel */
@@ -406,6 +407,7 @@ static void xen_irq_init(unsigned irq)
 		panic("Unable to allocate metadata for IRQ%d\n", irq);
 
 	info->type = IRQT_UNBOUND;
+	info->refcnt = -1;
 
 	irq_set_handler_data(irq, info);
 
@@ -469,6 +471,8 @@ static void xen_free_irq(unsigned irq)
 
 	irq_set_handler_data(irq, NULL);
 
+	WARN_ON(info->refcnt > 0);
+
 	kfree(info);
 
 	/* Legacy IRQ descriptors are managed by the arch. */
@@ -637,7 +641,7 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi,
 	if (irq != -1) {
 		printk(KERN_INFO "xen_map_pirq_gsi: returning irq %d for gsi %u\n",
 		       irq, gsi);
-		goto out;	/* XXX need refcount? */
+		goto out;
 	}
 
 	irq = xen_allocate_irq_gsi(gsi);
@@ -939,9 +943,16 @@ static void unbind_from_irq(unsigned int irq)
 {
 	struct evtchn_close close;
 	int evtchn = evtchn_from_irq(irq);
+	struct irq_info *info = irq_get_handler_data(irq);
 
 	mutex_lock(&irq_mapping_update_lock);
 
+	if (info->refcnt > 0) {
+		info->refcnt--;
+		if (info->refcnt != 0)
+			goto done;
+	}
+
 	if (VALID_EVTCHN(evtchn)) {
 		close.port = evtchn;
 		if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0)
@@ -970,6 +981,7 @@ static void unbind_from_irq(unsigned int irq)
 
 	xen_free_irq(irq);
 
+ done:
 	mutex_unlock(&irq_mapping_update_lock);
 }
 
@@ -1065,6 +1077,66 @@ void unbind_from_irqhandler(unsigned int irq, void *dev_id)
 }
 EXPORT_SYMBOL_GPL(unbind_from_irqhandler);
 
+int evtchn_make_refcounted(unsigned int evtchn)
+{
+	int irq = evtchn_to_irq[evtchn];
+	struct irq_info *info;
+
+	if (irq == -1)
+		return -ENOENT;
+
+	info = irq_get_handler_data(irq);
+
+	if (!info)
+		return -ENOENT;
+
+	WARN_ON(info->refcnt != -1);
+
+	info->refcnt = 1;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(evtchn_make_refcounted);
+
+int evtchn_get(unsigned int evtchn)
+{
+	int irq;
+	struct irq_info *info;
+	int err = -ENOENT;
+
+	mutex_lock(&irq_mapping_update_lock);
+
+	irq = evtchn_to_irq[evtchn];
+	if (irq == -1)
+		goto done;
+
+	info = irq_get_handler_data(irq);
+
+	if (!info)
+		goto done;
+
+	err = -EINVAL;
+	if (info->refcnt <= 0)
+		goto done;
+
+	info->refcnt++;
+	err = 0;
+ done:
+	mutex_unlock(&irq_mapping_update_lock);
+
+	return err;
+}
+EXPORT_SYMBOL_GPL(evtchn_get);
+
+void evtchn_put(unsigned int evtchn)
+{
+	int irq = evtchn_to_irq[evtchn];
+	if (WARN_ON(irq == -1))
+		return;
+	unbind_from_irq(irq);
+}
+EXPORT_SYMBOL_GPL(evtchn_put);
+
 void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector)
 {
 	int irq = per_cpu(ipi_to_irq, cpu)[vector];
diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c
index dbc13e9..b1f60a0 100644
--- a/drivers/xen/evtchn.c
+++ b/drivers/xen/evtchn.c
@@ -268,7 +268,7 @@ static int evtchn_bind_to_user(struct per_user_data *u, int port)
 	rc = bind_evtchn_to_irqhandler(port, evtchn_interrupt, IRQF_DISABLED,
 				       u->name, (void *)(unsigned long)port);
 	if (rc >= 0)
-		rc = 0;
+		rc = evtchn_make_refcounted(port);
 
 	return rc;
 }
diff --git a/include/xen/events.h b/include/xen/events.h
index d287997..0f77370 100644
--- a/include/xen/events.h
+++ b/include/xen/events.h
@@ -37,6 +37,13 @@ int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain,
  */
 void unbind_from_irqhandler(unsigned int irq, void *dev_id);
 
+/*
+ * Allow extra references to event channels exposed to userspace by evtchn
+ */
+int evtchn_make_refcounted(unsigned int evtchn);
+int evtchn_get(unsigned int evtchn);
+void evtchn_put(unsigned int evtchn);
+
 void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector);
 int resend_irq_on_evtchn(unsigned int irq);
 void rebind_evtchn_irq(int evtchn, int irq);
-- 
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 Oct 26 12:13:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 12:13:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ8ux-00037o-Iz; Wed, 26 Oct 2011 12:13:39 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ8to-0002v9-JI
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 12:12:30 -0700
X-Env-Sender: dkiper@net-space.pl
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319656344!30754505!1
X-Originating-IP: [89.174.63.77]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10976 invoked from network); 26 Oct 2011 19:12:25 -0000
Received: from router-fw.net-space.pl (HELO router-fw.net-space.pl)
	(89.174.63.77)
	by server-9.tower-174.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 26 Oct 2011 19:12:25 -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 S1600742Ab1JZTMM (ORCPT <rfc822;xen-devel@lists.xensource.com>);
	Wed, 26 Oct 2011 21:12:12 +0200
Date: Wed, 26 Oct 2011 21:12:12 +0200
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: <20111026191212.GA17424@router-fw-old.local.net-space.pl>
References: <1319626664-28225-1-git-send-email-david.vrabel@citrix.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319626664-28225-1-git-send-email-david.vrabel@citrix.com>
User-Agent: Mutt/1.3.28i
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

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

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 12:50:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 12:50:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ9Uv-0004IL-Vv; Wed, 26 Oct 2011 12:50:50 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ9U8-00045g-DX
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 12:50:00 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319658597!868673!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1393 invoked from network); 26 Oct 2011 19:49:57 -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;
	26 Oct 2011 19:49:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,411,1315180800"; 
   d="scan'208";a="8606545"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	26 Oct 2011 19:49: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, 26 Oct 2011 20:49:57 +0100
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 1RJ9U4-00081W-FI;
	Wed, 26 Oct 2011 19:49:56 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RJ9U4-0003n0-Be;
	Wed, 26 Oct 2011 20:49:56 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9639-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Wed, 26 Oct 2011 20:49:56 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9639: 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 9639 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9639/

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-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                  c681dd5aecf3
baseline version:
 xen                  662dbf6ee71c

------------------------------------------------------------
People who touched revisions under test:
  Christoph Egger <Christoph.Egger@amd.com>
  Dario Faggioli <dario.faggioli@citrix.com>
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Michael Young <m.a.young@durham.ac.uk>
  Paolo Bonzini <pbonzini@redhat.com>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Yang Zhang <yang.z.zhang@intel.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=c681dd5aecf3
+ . 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 c681dd5aecf3
+ branch=xen-unstable
+ revision=c681dd5aecf3
+ . 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 c681dd5aecf3 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 9 changesets with 17 changes to 14 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 12:57:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 12:57:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ9ax-0005HA-2U; Wed, 26 Oct 2011 12:57:03 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ9Zz-0004qZ-BK; Wed, 26 Oct 2011 12:56:03 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1319658958!870963!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16506 invoked from network); 26 Oct 2011 19:55:59 -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; 26 Oct 2011 19:55:59 -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
	p9QJts7m005573
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 19:55:55 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
	p9QJtqL0017368
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 19:55:53 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
	p9QJtjTi001973; Wed, 26 Oct 2011 14:55:45 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 12:55:45 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 967EC82C21; Wed, 26 Oct 2011 15:55:43 -0400 (EDT)
Date: Wed, 26 Oct 2011 15:55:43 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Lars Kurth <lars.kurth@xen.org>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
Message-ID: <20111026195543.GA6558@phenom.dumpdata.com>
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4E9C4BAB.9020605@xen.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.0A090208.4EA865CB.0132,ss=1,re=0.000,fgs=0
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"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>,
	Joseph Glanville <joseph.glanville@orionvm.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

On Mon, Oct 17, 2011 at 04:37:15PM +0100, Lars Kurth wrote:
> Cool.
> 
> I am wondering what people think about archiving vs deleting wiki
> pages. Obviously some pages can be deleted (stuff about events, job
> listings, old TODO lists, etc.).
> 
> Others may still be valuable to legacy users. See
.. snip..
Hey Lars,

I was trying to add to https://docs.google.com/spreadsheet/ccc?key=0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&hl=en_US#gid=0

a couple of things but it seems I am not authorized, anyhow these are the changes:

NetBSDdomU merge with How_to_build_NetBSD_DomU_on_Linux
2.6.18-to-2.6.31-and-higher is OK.
InstallationNotes - remove
KnownGoodImages - remove
InstallGuestImage - remove
RealModeArea - archive, or move it to be PPC/RealModeArea
USBCompatibilityList - remove
XenPCIpassthrough - keep, I just updated it
XenPVOPSDRM - keep, just updated it
XenSerialConsole - keep, I just updated it
XenPVSCSI - keep
XenUSBPassthrough - keep, just updated it
XenParavirtOps - keep, just updated it.
XenOnUbuntu64 - remove

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 13:13:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 13:13:02 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJ9qP-0006kH-1S; Wed, 26 Oct 2011 13:13:01 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ9pB-0006XT-Ig
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 13:11:59 -0700
X-Env-Sender: ms@it-infrastrukturen.org
X-Msg-Ref: server-7.tower-216.messagelabs.com!1319659902!1184330!1
X-Originating-IP: [88.198.203.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32161 invoked from network); 26 Oct 2011 20:11:42 -0000
Received: from srv1.born2b3.net (HELO srv1.born2b3.net) (88.198.203.66)
	by server-7.tower-216.messagelabs.com with SMTP;
	26 Oct 2011 20:11:42 -0000
Received: from [192.168.1.100] (84-73-66-195.dclient.hispeed.ch [84.73.66.195])
	by srv1.born2b3.net (Postfix) with ESMTPSA id 8DA4CC089B;
	Wed, 26 Oct 2011 20:11:41 +0000 (UTC)
Message-ID: <4EA868F1.3060501@it-infrastrukturen.org>
Date: Wed, 26 Oct 2011 22:09:21 +0200
From: Mark Schneider <ms@it-infrastrukturen.org>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.1.16) Gecko/20110307 Icedove/3.0.11
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Cc: "M. Schneider" <ms@it-infrastrukturen.com>
Subject: [Xen-devel] XCP 1.1 issue: This command is only allowed on the OEM
	edition
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============0148376435=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============0148376435==
Content-Type: multipart/alternative;
	boundary="------------050202080904060009090109"

This is a multi-part message in MIME format.
--------------050202080904060009090109
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

Hello,

Is it a bug or a feature?
# ---
*xe update-upload* file-name=Other-linux-template 
host-uuid=280e2816-2d45-4217-881e-e2ad4b423159
*This command is only allowed on the OEM edition.*
command: update-upload

regards, Mark

-- 
ms@it-infrastrukturen.org


--------------050202080904060009090109
Content-Type: text/html; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-15">
</head>
<body bgcolor="#ffffff" text="#000000">
Hello,<br>
<br>
Is it a bug or a feature?<br>
# ---<br>
<tt><font color="#3333ff"><b>xe update-upload</b></font>
file-name=Other-linux-template
host-uuid=280e2816-2d45-4217-881e-e2ad4b423159 <br>
<b><font color="#ff0000">This command is only allowed on the OEM
edition.</font></b><br>
command: update-upload<br>
</tt><br>
regards, Mark<br>
<pre class="moz-signature" cols="72">-- 
<a class="moz-txt-link-abbreviated" href="mailto:ms@it-infrastrukturen.org">ms@it-infrastrukturen.org</a>
</pre>
</body>
</html>

--------------050202080904060009090109--


--===============0148376435==
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

--===============0148376435==--


From xen-devel-bounces@lists.xensource.com Wed Oct 26 13:27:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 13:27:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJA4X-0000EA-US; Wed, 26 Oct 2011 13:27:37 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJA3j-0008TD-Hp
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 13:26:48 -0700
X-Env-Sender: caker@theshore.net
X-Msg-Ref: server-6.tower-216.messagelabs.com!1319660803!1171304!1
X-Originating-IP: [67.18.92.50]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22603 invoked from network); 26 Oct 2011 20:26:43 -0000
Received: from ns.theshore.net (HELO www.theshore.net) (67.18.92.50)
	by server-6.tower-216.messagelabs.com with SMTP;
	26 Oct 2011 20:26:43 -0000
Received: from beefcake.linlan
	(173-161-199-49-Philadelphia.hfc.comcastbusiness.net
	[173.161.199.49])
	by www.theshore.net (8.13.6/8.9.1) with ESMTP id p9QKQexv006212;
	Wed, 26 Oct 2011 16:26:41 -0400
Message-ID: <4EA86D00.1080906@theshore.net>
Date: Wed, 26 Oct 2011 16:26:40 -0400
From: "Christopher S. Aker" <caker@theshore.net>
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US;
	rv:1.9.2.23) Gecko/20110920 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Linux 3.1 domU + ext3 = WARNING: at fs/ext3/inode.c
References: <4EA71270.2050303@theshore.net>
	<20111025201239.GA13747@phenom.dumpdata.com>
	<BCD23F9B-BB0B-429B-882C-80077B1D234F@theshore.net>
	<20111025211512.GA2561@phenom.dumpdata.com>
In-Reply-To: <20111025211512.GA2561@phenom.dumpdata.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
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 10/25/11 5:15 PM, Konrad Rzeszutek Wilk wrote:
> You see the same exact thing with 3.0.6?

It works with 3.0.4 - do you need me to try 3.0.6 specifically?

> but you said that if you use 3.0 domU with 2.6.18 you do not get the
> type of warnings as above?

Correct.

> Also, when the DomU guest starts it should report if it "thinks" it
> supports barriers. Something like: blkbfront: xvda: barrier
>
> Or is this the only message you get from blkfront??

2.6.18 dom0 + 3.0.4 domU produces this and nothing else:

blkfront: xvda: barrier: enabled
blkfront: xvdb: barrier: enabled

2.6.18 dom0 = works with 3.0.4, breaks with 3.1.

Thanks,
-Chris

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 13:39:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 13:39:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJAFe-0002pr-1A; Wed, 26 Oct 2011 13:39:06 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJADk-0001wR-Ji
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 13:37:08 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319661422!1179422!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11737 invoked from network); 26 Oct 2011 20:37:03 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-16.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 26 Oct 2011 20:37:03 -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
	p9QKb0XZ002439
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 20:37:01 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
	p9QKaxHW019318
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 20:37:00 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
	p9QKarMh031537; Wed, 26 Oct 2011 15:36:54 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 13:36:53 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 8A97E82C21; Wed, 26 Oct 2011 16:36:52 -0400 (EDT)
Date: Wed, 26 Oct 2011 16:36:52 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Christopher S. Aker" <caker@theshore.net>
Subject: Re: [Xen-devel] Linux 3.1 domU + ext3 = WARNING: at fs/ext3/inode.c
Message-ID: <20111026203652.GA10737@phenom.dumpdata.com>
References: <4EA71270.2050303@theshore.net>
	<20111025201239.GA13747@phenom.dumpdata.com>
	<BCD23F9B-BB0B-429B-882C-80077B1D234F@theshore.net>
	<20111025211512.GA2561@phenom.dumpdata.com>
	<4EA86D00.1080906@theshore.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA86D00.1080906@theshore.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.0A090208.4EA86F6D.0098,ss=1,re=0.000,fgs=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, Oct 26, 2011 at 04:26:40PM -0400, Christopher S. Aker wrote:
> On 10/25/11 5:15 PM, Konrad Rzeszutek Wilk wrote:
> >You see the same exact thing with 3.0.6?
> 
> It works with 3.0.4 - do you need me to try 3.0.6 specifically?

No need.
> 
> >but you said that if you use 3.0 domU with 2.6.18 you do not get the
> >type of warnings as above?
> 
> Correct.
> 
> >Also, when the DomU guest starts it should report if it "thinks" it
> >supports barriers. Something like: blkbfront: xvda: barrier
> >
> >Or is this the only message you get from blkfront??
> 
> 2.6.18 dom0 + 3.0.4 domU produces this and nothing else:
> 
> blkfront: xvda: barrier: enabled
> blkfront: xvdb: barrier: enabled
> 
> 2.6.18 dom0 = works with 3.0.4, breaks with 3.1.

OK, so there is nothing that changed in 3.0 through 3.1 in xen-blkfront.c.
Well, there was a name change, but nothing else.

I am going to bet that if you compile 3.0.4 or 3.0.6 with that
fancy new config option that turns EXT3_ORDERED_something you will
see the same exact problem.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 13:55:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 13:55:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJAVf-0005Xw-7v; Wed, 26 Oct 2011 13:55:39 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJAT7-0004YV-Ni
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 13:53:02 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-174.messagelabs.com!1319662377!36830507!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3463 invoked from network); 26 Oct 2011 20:52:58 -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; 26 Oct 2011 20:52:58 -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
	p9QKqs0Y012975
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 20:52:55 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
	p9QKqqEi010634
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 20:52:52 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
	p9QKqj4I011801; Wed, 26 Oct 2011 15:52:45 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 13:52:44 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id C28D482C21; Wed, 26 Oct 2011 16:52:43 -0400 (EDT)
Date: Wed, 26 Oct 2011 16:52:43 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Laszlo Ersek <lersek@redhat.com>, zhenzhong.duan@oracle.com
Subject: Re: [Xen-devel] [PATCH] remove blocked time accounting from xen
	"clockchip"
Message-ID: <20111026205243.GA11095@phenom.dumpdata.com>
References: <1318970579-6282-1-git-send-email-lersek@redhat.com>
	<4E9E9D97020000780005C1DE@nat28.tlf.novell.com>
	<4EA031B0.2010400@redhat.com> <4EA03811.5090502@redhat.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA03811.5090502@redhat.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.0A020205.4EA87327.00E1:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: Jeremy Fitzhardinge <jeremy@goop.org>, xen-devel@lists.xensource.com,
	Joe Jin <joe.jin@oracle.com>, Zhenzhong Duan <zhenzhong.duan@oracle.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, Oct 20, 2011 at 05:02:41PM +0200, Laszlo Ersek wrote:
> On 10/20/11 16:35, Laszlo Ersek wrote:
> 
> >I'm convinced the patch is correct, and only the commit message might
> >need a small fix (mentioning cpu_idle()).

Hey Laszlo and Zhenzhong,

Rest assured - I haven't forgotten about the two time patches.. little
busy with some of the Fedore Core 16 kernel bugs.

> 
> I forgot to say that I also added counters to xen_timer_interrupt(),
> account_idle_ticks() (called from cpu_idle()), and the idle time
> branch of account_process_tick(). (The last one is reached from
> xen_timer_interrupt() via event_handler == &tick_nohz_handler, after
> highres=off was passed). When the VM was left alone, they were
> increasing in strict lock-step.
> 
> account_idle_time()
> 
>   <- account_idle_ticks()
>     <- tick_nohz_restart_sched_tick()
>       <- cpu_idle()
> 
>   <- account_process_tick()
>     <- update_process_times()
>       <- tick_nohz_handler() [highres=off]
>         <- xen_timer_interrupt()
> 
>       <- (tick_periodic())
>       <- (tick_sched_timer())
> 
> The timer interrupt appears to kick cpu_idle(), and the latter
> accounts for the time spent idly.
> 
> Laszlo
> 
> _______________________________________________
> 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 Oct 26 14:09:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 14:09:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJAj3-0007I7-Ax; Wed, 26 Oct 2011 14:09:29 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJAcn-0006Dr-M5
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 14:03:05 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319662955!49869111!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28654 invoked from network); 26 Oct 2011 21:02:36 -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; 26 Oct 2011 21:02:36 -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
	p9QL2sEK025484
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 21:02: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
	p9QL2sCn002978
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 21:02:54 GMT
Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68])
	by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9QL2njD019510; Wed, 26 Oct 2011 16:02:49 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 14:02:49 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 4119C82C21; Wed, 26 Oct 2011 17:02:48 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1319662926@phenom.dumpdata.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Wed, 26 Oct 2011 17:02:06 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com
Status: RO
Lines: 7
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090208.4EA87580.0017:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 0 of 3] [PATCH] Patches to change BLKIF_OP_TRIM
 to BLKIF_OP_DISCARD. (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

The v4 of these patches. Includes the changes mentioned to by Ian in the
last review.

Please apply.





_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 14:10:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 14:10:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJAkD-0007fb-88; Wed, 26 Oct 2011 14:10:41 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJAcn-0006Ds-OW
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 14:03:07 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319662976!25434500!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2460 invoked from network); 26 Oct 2011 21:02:58 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-3.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 21:02:58 -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
	p9QL2sb8025482
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 21:02:55 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
	p9QL2sr7027114
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 21:02:54 GMT
Received: from abhmt110.oracle.com (abhmt110.oracle.com [141.146.116.62])
	by acsmt357.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id
	p9QL2nrL017883; Wed, 26 Oct 2011 16:02:49 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 14:02:49 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 58F7D82C24; Wed, 26 Oct 2011 17:02:48 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: ef78e170a9008346578458abf541075310cb299b
Message-Id: <ef78e170a90083465784.1319662929@phenom.dumpdata.com>
In-Reply-To: <patchbomb.1319662926@phenom.dumpdata.com>
References: <patchbomb.1319662926@phenom.dumpdata.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Wed, 26 Oct 2011 17:02:09 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com
Status: RO
Lines: 41
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090208.4EA8757F.0098:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 3 of 3] interface: add 'discard-secure' and
 BLKIF_DISCARD_SECURE
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1318457231 14400
# Node ID ef78e170a9008346578458abf541075310cb299b
# Parent  14793d6c4adb38cc57a6d55a8907a18d5ca18634
interface: add 'discard-secure' and BLKIF_DISCARD_SECURE

Alter the 'reserved' uint8_t to be used a 'flag'. We use only for
one flag: BLKIF_DISCARD_SECURE.

That flag can only be set if the backend has set 'discard-secure' to one.
If backend has not set 'discard-secure' to one, that flag will have no
effect.

Acked-by: Jan Beulich <JBeulich@suse.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff -r 14793d6c4adb -r ef78e170a900 xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h	Wed Oct 12 18:07:07 2011 -0400
+++ b/xen/include/public/io/blkif.h	Wed Oct 12 18:07:11 2011 -0400
@@ -120,6 +120,9 @@
  * allocation unit in bytes if reported by the device. Otherwise the
  * discard-granularity will be set to match the device's physical block size.
  * It is the minimum size you can discard.
+ * 'discard-secure' - All copies of the discarded sectors (potentially created
+ * by garbage collection) must also be erased.  To use this feature, the flag
+ * BLKIF_DISCARD_SECURE must be set in the blkif_request_discard.
  */
 #define BLKIF_OP_DISCARD           5
 
@@ -160,7 +163,8 @@ typedef struct blkif_request blkif_reque
  */
 struct blkif_request_discard {
     uint8_t        operation;    /* BLKIF_OP_DISCARD                     */
-    uint8_t        reserved;     /*                                      */
+    uint8_t        flag;         /* BLKIF_DISCARD_SECURE or zero         */
+#define BLKIF_DISCARD_SECURE (1<<0)  /* ignored if discard-secure=0      */
     blkif_vdev_t   handle;       /* same as for read/write requests      */
     uint64_t       id;           /* private guest value, echoed in resp  */
     blkif_sector_t sector_number;/* start sector idx on disk             */



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 14:11:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 14:11:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJAky-00082U-F1; Wed, 26 Oct 2011 14:11:28 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJAco-0006Dt-6E
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 14:03:07 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1319662977!1778376!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19359 invoked from network); 26 Oct 2011 21:02:59 -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; 26 Oct 2011 21:02:59 -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
	p9QL2t4X025494
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 21:02:56 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
	p9QL2sY7007361
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 21:02:55 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
	p9QL2nNj019511; Wed, 26 Oct 2011 16:02:49 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 14:02:49 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 47D5482C22; Wed, 26 Oct 2011 17:02:48 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 92e266ce9c1c1600998aeacee2996b8de2a8743e
Message-Id: <92e266ce9c1c1600998a.1319662927@phenom.dumpdata.com>
In-Reply-To: <patchbomb.1319662926@phenom.dumpdata.com>
References: <patchbomb.1319662926@phenom.dumpdata.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Wed, 26 Oct 2011 17:02:07 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com
Status: RO
Lines: 82
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090202.4EA87580.00D6,ss=1,re=0.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 1 of 3] interface: rename of trim to discard in
	blkif.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

# HG changeset patch
# User Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
# Date 1319662851 14400
# Node ID 92e266ce9c1c1600998aeacee2996b8de2a8743e
# Parent  c681dd5aecf3da3c6fd0e4d8a760a9cd18617033
interface: rename of trim to discard in blkif.h

Just a simple sed s/trim/discard/. We are ignoring the comments
which are incorrect.

The reason for the name change is that TRIM is specific to ATA
while the operation can be done on top of SCSI interfaces too.
Hence the rename to something more generic.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff -r c681dd5aecf3 -r 92e266ce9c1c xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h	Tue Oct 25 19:22:09 2011 +0100
+++ b/xen/include/public/io/blkif.h	Wed Oct 26 17:00:51 2011 -0400
@@ -82,25 +82,25 @@
  */
 #define BLKIF_OP_RESERVED_1        4
 /*
- * Recognised only if "feature-trim" is present in backend xenbus info.
- * The "feature-trim" node contains a boolean indicating whether trim
- * requests are likely to succeed or fail. Either way, a trim request
+ * Recognised only if "feature-discard" is present in backend xenbus info.
+ * The "feature-discard" node contains a boolean indicating whether discard
+ * requests are likely to succeed or fail. Either way, a discard request
  * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by
  * the underlying block-device hardware. The boolean simply indicates whether
- * or not it is worthwhile for the frontend to attempt trim requests.
- * If a backend does not recognise BLKIF_OP_TRIM, it should *not*
- * create the "feature-trim" node!
+ * or not it is worthwhile for the frontend to attempt discard requests.
+ * If a backend does not recognise BLKIF_OP_DISCARD, it should *not*
+ * create the "feature-discard" node!
  * 
- * Trim operation is a request for the underlying block device to mark
- * extents to be erased. Trim operations are passed with sector_number as the
- * sector index to begin trim operations at and nr_sectors as the number of
- * sectors to be trimmed. The specified sectors should be trimmed if the
- * underlying block device supports trim operations, or a BLKIF_RSP_EOPNOTSUPP
- * should be returned. More information about trim operations at:
+ * Discard operation is a request for the underlying block device to mark
+ * extents to be erased. Discard operations are passed with sector_number as the
+ * sector index to begin discard operations at and nr_sectors as the number of
+ * sectors to be discarded. The specified sectors should be discarded if the
+ * underlying block device supports discard operations, or a BLKIF_RSP_EOPNOTSUPP
+ * should be returned. More information about discard operations at:
  * http://t13.org/Documents/UploadedDocuments/docs2008/
  *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
  */
-#define BLKIF_OP_TRIM              5
+#define BLKIF_OP_DISCARD           5
 
 /*
  * Maximum scatter/gather segments per request.
@@ -135,17 +135,17 @@ typedef struct blkif_request blkif_reque
 
 /*
  * Cast to this structure when blkif_request.operation == BLKIF_OP_TRIM
- * sizeof(struct blkif_request_trim) <= sizeof(struct blkif_request)
+ * sizeof(struct blkif_request_discard) <= sizeof(struct blkif_request)
  */
-struct blkif_request_trim {
-    uint8_t        operation;    /* BLKIF_OP_TRIM                        */
+struct blkif_request_discard {
+    uint8_t        operation;    /* BLKIF_OP_DISCARD                     */
     uint8_t        reserved;     /*                                      */
     blkif_vdev_t   handle;       /* same as for read/write requests      */
     uint64_t       id;           /* private guest value, echoed in resp  */
     blkif_sector_t sector_number;/* start sector idx on disk             */
-    uint64_t       nr_sectors;   /* number of contiguous sectors to trim */
+    uint64_t       nr_sectors;   /* number of contiguous sectors to discard*/
 };
-typedef struct blkif_request_trim blkif_request_trim_t;
+typedef struct blkif_request_discard blkif_request_discard_t;
 
 struct blkif_response {
     uint64_t        id;              /* copied from request */



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 14:12:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 14:12:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJAlm-0008RA-Ag; Wed, 26 Oct 2011 14:12:18 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJAco-0006Du-ME
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 14:03:08 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1319662978!1781208!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15408 invoked from network); 26 Oct 2011 21:02:59 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 21:02:59 -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
	p9QL2tYX001014
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 21:02:56 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
	p9QL2sia007372
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 21:02:55 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
	p9QL2nZq032668; Wed, 26 Oct 2011 16:02:49 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 14:02:49 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 51A5F82C23; Wed, 26 Oct 2011 17:02:48 -0400 (EDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 14793d6c4adb38cc57a6d55a8907a18d5ca18634
Message-Id: <14793d6c4adb38cc57a6.1319662928@phenom.dumpdata.com>
In-Reply-To: <patchbomb.1319662926@phenom.dumpdata.com>
References: <patchbomb.1319662926@phenom.dumpdata.com>
User-Agent: Mercurial-patchbomb/1.9.3
Date: Wed, 26 Oct 2011 17:02:08 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: xen-devel@lists.xensource.com, Ian.Campbell@citrix.com
Status: RO
Lines: 69
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090205.4EA87580.00D1,ss=1,re=0.000,fgs=0
Cc: konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH 2 of 3] interface: Flesh out the
	BLKIF_OP_DISCARD 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

# HG changeset patch
# User Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
# Date 1318457227 14400
# Node ID 14793d6c4adb38cc57a6d55a8907a18d5ca18634
# Parent  92e266ce9c1c1600998aeacee2996b8de2a8743e
interface: Flesh out the BLKIF_OP_DISCARD description.

We flesh out details on what is expected of 'feature-flush' and
what are some of the extra parameters that the frontend can read
from the backend. Those extra parameters are: : discard-aligment,
and discard-granularity.

Acked-by: Jan Beulich <JBeulich@suse.com>
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

diff -r 92e266ce9c1c -r 14793d6c4adb xen/include/public/io/blkif.h
--- a/xen/include/public/io/blkif.h	Wed Oct 26 17:00:51 2011 -0400
+++ b/xen/include/public/io/blkif.h	Wed Oct 12 18:07:07 2011 -0400
@@ -83,22 +83,43 @@
 #define BLKIF_OP_RESERVED_1        4
 /*
  * Recognised only if "feature-discard" is present in backend xenbus info.
- * The "feature-discard" node contains a boolean indicating whether discard
- * requests are likely to succeed or fail. Either way, a discard request
+ * The "feature-discard" node contains a boolean indicating whether trim
+ * (ATA) or unmap (SCSI) - conviently called discard requests are likely
+ * to succeed or fail. Either way, a discard request
  * may fail at any time with BLKIF_RSP_EOPNOTSUPP if it is unsupported by
  * the underlying block-device hardware. The boolean simply indicates whether
  * or not it is worthwhile for the frontend to attempt discard requests.
  * If a backend does not recognise BLKIF_OP_DISCARD, it should *not*
  * create the "feature-discard" node!
- * 
+ *
  * Discard operation is a request for the underlying block device to mark
- * extents to be erased. Discard operations are passed with sector_number as the
+ * extents to be erased. However, discard does not guarantee that the blocks
+ * will be erased from the device - it is just a hint to the device
+ * controller that these blocks are no longer in use. What the device
+ * controller does with that information is left to the controller.
+ * Discard operations are passed with sector_number as the
  * sector index to begin discard operations at and nr_sectors as the number of
  * sectors to be discarded. The specified sectors should be discarded if the
- * underlying block device supports discard operations, or a BLKIF_RSP_EOPNOTSUPP
- * should be returned. More information about discard operations at:
+ * underlying block device supports trim (ATA) or unmap (SCSI) operations,
+ * or a BLKIF_RSP_EOPNOTSUPP  should be returned.
+ * More information about trim/unmap operations at:
  * http://t13.org/Documents/UploadedDocuments/docs2008/
  *     e07154r6-Data_Set_Management_Proposal_for_ATA-ACS2.doc
+ * http://www.seagate.com/staticfiles/support/disc/manuals/
+ *     Interface%20manuals/100293068c.pdf
+ * The backend can optionally provide these extra XenBus attributes to
+ * further optimize the discard functionality:
+ * 'discard-aligment' - Devices that support discard functionality may
+ * internally allocate space in units that are bigger than the exported
+ * logical block size. The discard-alignment parameter indicates how many bytes
+ * the beginning of the partition is offset from the internal allocation unit's
+ * natural alignment. Do not confuse this with natural disk alignment offset.
+ * 'discard-granularity'  - Devices that support discard functionality may
+ * internally allocate space using units that are bigger than the logical block
+ * size. The discard-granularity parameter indicates the size of the internal
+ * allocation unit in bytes if reported by the device. Otherwise the
+ * discard-granularity will be set to match the device's physical block size.
+ * It is the minimum size you can discard.
  */
 #define BLKIF_OP_DISCARD           5
 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 14:24:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 14:24:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJAxI-0000Yu-DD; Wed, 26 Oct 2011 14:24:12 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJAwr-0000M8-0f
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 14:23:45 -0700
X-Env-Sender: caker@theshore.net
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319664221!881453!1
X-Originating-IP: [67.18.92.50]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11446 invoked from network); 26 Oct 2011 21:23:41 -0000
Received: from ns.theshore.net (HELO www.theshore.net) (67.18.92.50)
	by server-7.tower-182.messagelabs.com with SMTP;
	26 Oct 2011 21:23:41 -0000
Received: from beefcake.linlan
	(173-161-199-49-Philadelphia.hfc.comcastbusiness.net
	[173.161.199.49])
	by www.theshore.net (8.13.6/8.9.1) with ESMTP id p9QLNelj017038;
	Wed, 26 Oct 2011 17:23:40 -0400
Message-ID: <4EA87A5C.6060100@theshore.net>
Date: Wed, 26 Oct 2011 17:23:40 -0400
From: "Christopher S. Aker" <caker@theshore.net>
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US;
	rv:1.9.2.23) Gecko/20110920 Lightning/1.0b2 Thunderbird/3.1.15
MIME-Version: 1.0
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Linux 3.1 domU + ext3 = WARNING: at fs/ext3/inode.c
References: <4EA71270.2050303@theshore.net>
	<20111025201239.GA13747@phenom.dumpdata.com>
	<BCD23F9B-BB0B-429B-882C-80077B1D234F@theshore.net>
	<20111025211512.GA2561@phenom.dumpdata.com>
	<4EA86D00.1080906@theshore.net>
	<20111026203652.GA10737@phenom.dumpdata.com>
In-Reply-To: <20111026203652.GA10737@phenom.dumpdata.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
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 10/26/11 4:36 PM, Konrad Rzeszutek Wilk wrote:
 > I am going to bet that if you compile 3.0.4 or 3.0.6 with that
 > fancy new config option that turns EXT3_ORDERED_something you will
 > see the same exact problem.

Switching that back to match my 3.0 config is the first thing I tried, 
with no joy.

I'll reset and try a few more ideas...

-Chris

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 15:06:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 15:06:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJBc3-0001yx-Oq; Wed, 26 Oct 2011 15:06:19 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJBZY-0001jt-Ik
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 15:03:46 -0700
X-Env-Sender: m.a.young@durham.ac.uk
X-Msg-Ref: server-11.tower-174.messagelabs.com!1319666620!36786161!1
X-Originating-IP: [129.234.248.2]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15330 invoked from network); 26 Oct 2011 22:03:41 -0000
Received: from hermes2.dur.ac.uk (HELO hermes2.dur.ac.uk) (129.234.248.2)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 26 Oct 2011 22:03:41 -0000
Received: from smtphost2.dur.ac.uk (smtphost2.dur.ac.uk [129.234.252.2])
	by hermes2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9QM3MJ7024811;
	Wed, 26 Oct 2011 23:03:26 +0100
Received: from vega-c.dur.ac.uk (vega-c.dur.ac.uk [129.234.250.135])
	by smtphost2.dur.ac.uk (8.13.8/8.13.7) with ESMTP id p9QM33rQ005634
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Wed, 26 Oct 2011 23:03:03 +0100
Received: from vega-c.dur.ac.uk (localhost [127.0.0.1])
	by vega-c.dur.ac.uk (8.14.3/8.11.1) with ESMTP id p9QM33kB007087;
	Wed, 26 Oct 2011 23:03:03 +0100
Received: from localhost (dcl0may@localhost)
	by vega-c.dur.ac.uk (8.14.3/8.14.3/Submit) with ESMTP id p9QM32iE007075;
	Wed, 26 Oct 2011 23:03:02 +0100
Date: Wed, 26 Oct 2011 23:03:02 +0100 (BST)
From: M A Young <m.a.young@durham.ac.uk>
To: =?ISO-8859-15?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
Subject: Re: [Xen-devel] Missing blktap(2) driver in
	kernel-2.6.32-*.el6.xendom0.x86_64.rpm
In-Reply-To: <alpine.DEB.2.00.1110260030020.27824@vega-a.dur.ac.uk>
Message-ID: <alpine.DEB.2.00.1110262255220.4438@vega-c.dur.ac.uk>
References: <CAEGWhjEEMwaP4U4LWxmbQB2vK2zkRuN0zNf7_aZ7EWc2abm7zA@mail.gmail.com>
	<20111016201757.GT12984@reaktio.net>
	<alpine.DEB.2.00.1110260030020.27824@vega-a.dur.ac.uk>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; BOUNDARY="8323329-1286670849-1319666583=:4438"
X-DurhamAcUk-MailScanner: Found to be clean, Found to be clean
X-DurhamAcUk-MailScanner-ID: p9QM3MJ7024811
Cc: xen-devel@lists.xensource.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

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--8323329-1286670849-1319666583=:4438
Content-Type: TEXT/PLAIN; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 8BIT

On Wed, 26 Oct 2011, M A Young wrote:

> On Sun, 16 Oct 2011, Pasi Kärkkäinen wrote:
>
>> On Sun, Oct 16, 2011 at 08:35:23AM -0400, David Della Vecchia wrote:
>>>    I'm not sure if this belongs here, but someone in the ##xen channel in
>>>    [1]irc.freenode.net told me to message this list and let people know 
>>> about
>>>    and/or inquire as to why the blktap (or better yet blktap2) driver is 
>>> not
>>>    included in M A Young's aforementioned kernels, blkbackend is there but 
>>> it
>>>    does not allow for tap:aio disks in the domU's.
>>>    Thanks,
>
> The answer is that it isn't there because I haven't got the kernel to compile 
> with it enabled. I may have another look at it, but it may be that it 
> requires too much needs to change to get it working.

As I suspected it will be a fair amount of work to get blktap working on 
RHEL6. It seems that Red Hat have back ported some of the block device 
code from later kernels, and I don't think there is a corresponding blktap 
for those kernels yet.

 	Michael Young
--8323329-1286670849-1319666583=:4438
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-1286670849-1319666583=:4438--


From xen-devel-bounces@lists.xensource.com Wed Oct 26 15:32:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 15:32:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJC1R-0002rF-LB; Wed, 26 Oct 2011 15:32:33 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJC0f-0002ax-1G
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 15:31:45 -0700
X-Env-Sender: nathan@gt.net
X-Msg-Ref: server-8.tower-216.messagelabs.com!1319668300!1198448!1
X-Originating-IP: [208.70.244.21]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4538 invoked from network); 26 Oct 2011 22:31:41 -0000
Received: from gossamer.nmsrv.com (HELO gossamer.nmsrv.com) (208.70.244.21)
	by server-8.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 22:31:41 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gt.net; h=message-id:date
	:from:mime-version:to:subject:content-type
	:content-transfer-encoding; s=mail; bh=43VV6+m6WO4/lOHntg8cuN2e0
	+k=; b=ovDhpBXB6RbXxl1D6H6orSCw+q33vkSmz/8qzrTBHWGRWap+phsUjzNPO
	Ke8eDY452NB7O9DTBuOl822vPezHJVxtAKwFvEoG1pAxH7rcnnz6IgJErvITymAh
	mQIndAT4ya2gzqiaZ0BhBSCgTXPxvQ/fBFHIM3wwvbQVvWWpPs=
DomainKey-Signature: a=rsa-sha1; c=nofws; d=gt.net; h=message-id:date
	:from:mime-version:to:subject:content-type
	:content-transfer-encoding; q=dns; s=mail; b=osmjkkbXOpxs5Af6CNC
	itW13Ct/a9JLGAJ6vrr79mdHNSC82+S7gaVU8lbwp08KqHtgFGeUM8jjfznd8P6i
	93Nro2oqfZ6sW5rK5JENlQC/s43pTupOVKpRKOROBrP+2gt87j9JrA6UVWmRN5TV
	k8mbi8gZySK1S4dVhloQjhCI=
Received: (qmail 28073 invoked from network); 26 Oct 2011 22:31:39 -0000
X-AntiVirus: Clean
Received: from gateway.gossamer-threads.com (HELO ?192.168.1.152?)
	(nathan@gossamer-threads.com@208.70.247.145)
	by gossamer.nmsrv.com with ESMTPSA (DHE-RSA-CAMELLIA256-SHA encrypted);
	26 Oct 2011 22:31:39 -0000
Message-ID: <4EA88A4A.1040805@gt.net>
Date: Wed, 26 Oct 2011 15:31:38 -0700
From: Nathan March <nathan@gt.net>
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64;
	rv:8.0) Gecko/20111019 Thunderbird/8.0
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Clock jumping during live migrations
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 everyone,

Having an issue where the clock on a VM will jump ahead by the timezone 
offset but only certain directions between certain machines.

For example, if I run a "sleep 1; date" loop on the VM and migrate it 
from xen4 to xen7:

Wed Oct 26 21:14:46 PDT 2011
Thu Oct 27 04:19:03 PDT 2011

Trying multiple times with the same dom0's it seems to be consistently 7 
hours (PST offset maybe?) 4 minutes  and 17 seconds:

Thu Oct 27 04:23:27 PDT 2011
Thu Oct 27 11:27:45 PDT 2011

Thu Oct 27 11:43:01 PDT 2011
Thu Oct 27 18:47:18 PDT 2011

If I keep migrating back and forth it keeps going ahead each time, it 
never snaps back. Those were both migrating from xen4 -> xen7, migrating 
the VM back to xen4 does not result in a clock change of any noticeable 
amount.

I've tried using hwclock to make sure the RTC's are in sync with the 
system clock but it didn't seem to make a difference (although they were 
wrong initially, unless xen requires a reboot to pick up a change here).

If I try from xen8 to xen7 it does it, but by a much smaller amount... 
again, going the reverse direction causes no change.

Thu Oct 27 18:50:08 PDT 2011
Thu Oct 27 18:51:57 PDT 2011

and again the time between multiple runs seems to be a consistent 1:50:

Fri Oct 28 16:16:27 PDT 2011
Fri Oct 28 16:18:17 PDT 2011

All the dom0's are identical as far as I'm aware except that some have 
hyperthreading on and some have it off. I've seen this issue between two 
hyperthreading enabled hosts so doesn't seem to be specific to moving 
between them.

I've tested this with the VM using both the xen and the tsc clocksource 
but it made no difference.

Other info for xen4 / xen7:

xen4 ~ # uname -a
Linux xen4 3.0.3 #3 SMP Thu Sep 1 23:39:43 PDT 2011 x86_64 Intel(R) 
Xeon(R) CPU L5640 @ 2.27GHz GenuineIntel GNU/Linux
xen4 ~ # uptime
  14:48:33 up 1 day,  6:03,  2 users,  load average: 0.00, 0.01, 0.05
xen4 ~ # xm info
host                   : xen4
release                : 3.0.3
version                : #3 SMP Thu Sep 1 23:39:43 PDT 2011
machine                : x86_64
nr_cpus                : 12
nr_nodes               : 2
cores_per_socket       : 6
threads_per_core       : 1
cpu_mhz                : 2266
hw_caps                : 
bfebfbff:2c100800:00000000:00003f40:009ee3fd:00000000:00000001:00000000
virt_caps              : hvm hvm_directio
total_memory           : 98294
free_memory            : 87822
free_cpus              : 0
xen_major              : 4
xen_minor              : 1
xen_extra              : .1
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=0xffff800000000000
xen_changeset          : unavailable
xen_commandline        : console=com1,com2,vga com1=115200,8n1 
com2=115200,8n1 dom0_mem=1024M dom0_max_vcpus=1 dom0_vcpus_pin=true
cc_compiler            : gcc version 4.3.4 (Gentoo 4.3.4 p1.1, pie-10.1.5)
cc_compile_by          : root
cc_compile_domain      : nmsrv.com
cc_compile_date        : Thu Sep  1 23:34:06 PDT 2011
xend_config_format     : 4
xen4 ~ # cat /etc/timezone
PST8PDT
xen4 ~ # md5sum /etc/localtime
c9452f6b9e08d83c6815c38600798964  /etc/localtime

xen7 ~ # uname -a
Linux xen7 3.0.3 #2 SMP Tue Aug 23 12:58:39 PDT 2011 x86_64 Intel(R) 
Xeon(R) CPU L5640 @ 2.27GHz GenuineIntel GNU/Linux
xen7 ~ # uptime
  14:48:34 up 42 days, 23:38,  3 users,  load average: 0.04, 0.08, 0.13
xen7 ~ # xm info
host                   : xen7
release                : 3.0.3
version                : #2 SMP Tue Aug 23 12:58:39 PDT 2011
machine                : x86_64
nr_cpus                : 24
nr_nodes               : 2
cores_per_socket       : 6
threads_per_core       : 2
cpu_mhz                : 2266
hw_caps                : 
bfebfbff:2c100800:00000000:00003f40:009ee3fd:00000000:00000001:00000000
virt_caps              : hvm hvm_directio
total_memory           : 98294
free_memory            : 24329
free_cpus              : 0
xen_major              : 4
xen_minor              : 1
xen_extra              : .1
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=0xffff800000000000
xen_changeset          : unavailable
xen_commandline        : console=com1,com2,vga com1=115200,8n1 
com2=115200,8n1 dom0_mem=1024M dom0_max_vcpus=1 dom0_vcpus_pin=true
cc_compiler            : gcc version 4.3.4 (Gentoo 4.3.4 p1.1, pie-10.1.5)
cc_compile_by          : root
cc_compile_domain      : nmsrv.com
cc_compile_date        : Mon Aug 22 11:28:50 PDT 2011
xend_config_format     : 4
xen7 ~ # cat /etc/timezone
PST8PDT
xen7 ~ # md5sum /etc/localtime
c9452f6b9e08d83c6815c38600798964  /etc/localtime

and the test VM i've been using:

nathanxen1 ~ # uname -a
Linux nathanxen1 2.6.32.27-grsec-gt-r2 #1 SMP Wed Aug 10 17:13:56 PDT 
2011 x86_64 Intel(R) Xeon(R) CPU L5640 @ 2.27GHz GenuineIntel GNU/Linux
nathanxen1 ~ # cat 
/sys/devices/system/clocksource/clocksource0/available_clocksource
xen tsc
nathanxen1 ~ # cat 
/sys/devices/system/clocksource/clocksource0/current_clocksource
tsc

Any suggestions?

Unfortunately I don't know when this bug appeared, it used to work fine 
so not sure what I upgraded to give me an idea of when it was introduced.

Thanks,
Nathan

-- 
Nathan March<nathan@gt.net>
Gossamer Threads Inc. http://www.gossamer-threads.com/
Tel: (604) 687-5804 Fax: (604) 687-5806


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 15:36:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 15:36:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJC5V-0003cT-2o; Wed, 26 Oct 2011 15:36:45 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJC4n-0003Pu-Ut
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 15:36:02 -0700
X-Env-Sender: ms@it-infrastrukturen.org
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319668558!884646!1
X-Originating-IP: [88.198.203.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10148 invoked from network); 26 Oct 2011 22:35:58 -0000
Received: from srv1.born2b3.net (HELO srv1.born2b3.net) (88.198.203.66)
	by server-7.tower-182.messagelabs.com with SMTP;
	26 Oct 2011 22:35:58 -0000
Received: from [192.168.1.100] (84-73-66-195.dclient.hispeed.ch [84.73.66.195])
	by srv1.born2b3.net (Postfix) with ESMTPSA id 8ECF6C089B
	for <xen-devel@lists.xensource.com>;
	Wed, 26 Oct 2011 22:35:58 +0000 (UTC)
Message-ID: <4EA88AC2.60600@it-infrastrukturen.org>
Date: Thu, 27 Oct 2011 00:33:38 +0200
From: Mark Schneider <ms@it-infrastrukturen.org>
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US;
	rv:1.9.1.16) Gecko/20110307 Icedove/3.0.11
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] =?utf-8?q?XenServer_6=2E0=2E0-50752p_bug=3A_Error_pa?=
 =?utf-8?q?rameters=3A_Memory_limits_must_satisfy=3A_static=5Fmin_?=
 =?utf-8?b?4omkIGR5bmFtaWNfbWluID0gZHluYW1pY19tYXggPSBzdGF0aWNfbWF4?=
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============1769806517=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1769806517==
Content-Type: multipart/alternative;
	boundary="------------010000010004090507050001"

This is a multi-part message in MIME format.
--------------010000010004090507050001
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit

Hello,

it looks like there is a bug in XenServer 6.0.0-50762p (Free Edition). 
You can't modify memory setting for templates (s. below)

# ---
              memory-static-max ( RW): 268435456
             memory-dynamic-max ( RW): 268435456
             memory-dynamic-min ( RW): 268435456
              memory-static-min ( RW): 134217728
# ---

[root@xs6db01 ~]# xe template-param-set 
uuid=a646305b-72fa-d1e0-0c8c-87be2ba17647 memory-static-max=4GiB
Error code: MEMORY_CONSTRAINT_VIOLATION
Error parameters: Memory limits must satisfy: *static_min â‰¤ dynamic_min 
= dynamic_max = static_max*

It works correctly on XCP 1.1. Putting to small memory-static-max value 
for test gives an error message with the right limit rules (s. below)
Error parameters: Memory limits must satisfy: *static_min â‰¤ dynamic_min 
â‰¤ dynamic_max â‰¤ static_max*

regards, Mark

-- 
ms@it-infrastrukturen.org


--------------010000010004090507050001
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">
Hello,<br>
<br>
it looks like there is a bug in XenServer 6.0.0-50762p (Free Edition).
You can't modify memory setting for templates (s. below)<br>
<br>
# ---<br>
<tt>Â Â Â Â Â Â Â Â Â Â Â Â  memory-static-max ( RW): 268435456<br>
Â Â Â Â Â Â Â Â Â Â Â  memory-dynamic-max ( RW): 268435456<br>
Â Â Â Â Â Â Â Â Â Â Â  memory-dynamic-min ( RW): 268435456<br>
Â Â Â Â Â Â Â Â Â Â Â Â  memory-static-min ( RW): 134217728</tt><br>
# ---<br>
<br>
<tt>[root@xs6db01 ~]# xe template-param-set
uuid=a646305b-72fa-d1e0-0c8c-87be2ba17647 memory-static-max=4GiB<br>
<font color="#ff0000">Error code: MEMORY_CONSTRAINT_VIOLATION<br>
Error parameters: Memory limits must satisfy: <b>static_min â‰¤
dynamic_min = dynamic_max = static_max</b></font></tt><br>
<br>
It works correctly on XCP 1.1. Putting to small <tt>memory-static-max </tt>value
for test gives an error message with the right limit rules (s. below)<br>
<font color="#009900"><tt>Error parameters: Memory limits must satisfy:
<b>static_min â‰¤ dynamic_min â‰¤ dynamic_max â‰¤ static_max</b></tt></font><br>
<br>
regards, Mark<br>
<pre class="moz-signature" cols="72">-- 
<a class="moz-txt-link-abbreviated" href="mailto:ms@it-infrastrukturen.org">ms@it-infrastrukturen.org</a>
</pre>
</body>
</html>

--------------010000010004090507050001--


--===============1769806517==
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

--===============1769806517==--


From xen-devel-bounces@lists.xensource.com Wed Oct 26 16:12:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 16:12:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJCdy-0005Fq-0A; Wed, 26 Oct 2011 16:12:22 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJCdN-00053B-Nc
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 16:11:46 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319670702!1816217!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23527 invoked from network); 26 Oct 2011 23:11:42 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 23:11:42 -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 42B0D2B4D;
	Thu, 27 Oct 2011 02:11:41 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id E11FE200AD; Thu, 27 Oct 2011 02:11:40 +0300 (EEST)
Date: Thu, 27 Oct 2011 02:11:40 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: M A Young <m.a.young@durham.ac.uk>
Subject: Re: [Xen-devel] Missing blktap(2) driver in
	kernel-2.6.32-*.el6.xendom0.x86_64.rpm
Message-ID: <20111026231140.GM12984@reaktio.net>
References: <CAEGWhjEEMwaP4U4LWxmbQB2vK2zkRuN0zNf7_aZ7EWc2abm7zA@mail.gmail.com>
	<20111016201757.GT12984@reaktio.net>
	<alpine.DEB.2.00.1110260030020.27824@vega-a.dur.ac.uk>
	<alpine.DEB.2.00.1110262255220.4438@vega-c.dur.ac.uk>
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.1110262255220.4438@vega-c.dur.ac.uk>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen-devel@lists.xensource.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, Oct 26, 2011 at 11:03:02PM +0100, M A Young wrote:
> On Wed, 26 Oct 2011, M A Young wrote:
>
>> On Sun, 16 Oct 2011, Pasi Kärkkäinen wrote:
>>
>>> On Sun, Oct 16, 2011 at 08:35:23AM -0400, David Della Vecchia wrote:
>>>>    I'm not sure if this belongs here, but someone in the ##xen channel in
>>>>    [1]irc.freenode.net told me to message this list and let people 
>>>> know about
>>>>    and/or inquire as to why the blktap (or better yet blktap2) 
>>>> driver is not
>>>>    included in M A Young's aforementioned kernels, blkbackend is 
>>>> there but it
>>>>    does not allow for tap:aio disks in the domU's.
>>>>    Thanks,
>>
>> The answer is that it isn't there because I haven't got the kernel to 
>> compile with it enabled. I may have another look at it, but it may be 
>> that it requires too much needs to change to get it working.
>
> As I suspected it will be a fair amount of work to get blktap working on  
> RHEL6. It seems that Red Hat have back ported some of the block device  
> code from later kernels, and I don't think there is a corresponding 
> blktap for those kernels yet.
>

Actually there is:
http://lists.xensource.com/archives/html/xen-users/2011-07/msg00647.html

kernel:
http://xenbits.xensource.com/gitweb/?p=people/dstodden/blktap-dkms.git;a=summary
http://xenbits.xensource.com/gitweb/?p=people/dstodden/linux.git;a=summary

userspace:
http://xenbits.xensource.com/gitweb/?p=people/dstodden/blktap.git;a=summary

Hopefully those help.. 

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 20:45:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 20:45:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJGu8-0005Uw-JE; Wed, 26 Oct 2011 20:45:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJGtM-0005IQ-6w
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 20:44:32 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319687068!253075!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27364 invoked from network); 27 Oct 2011 03:44:29 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 03:44:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8609164"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 03:44: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, 27 Oct 2011 04:44:28 +0100
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 1RJGtH-0002G0-JE;
	Thu, 27 Oct 2011 03:44:27 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RJGtH-0007v5-Dk;
	Thu, 27 Oct 2011 04:44:27 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9640-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 27 Oct 2011 04:44:27 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9640: 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 9640 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9640/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf      9 guest-start                  fail pass in 9639

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                  c681dd5aecf3
baseline version:
 xen                  c681dd5aecf3

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 Oct 26 22:29:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 22: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 1RJIXI-0007rE-2O; Wed, 26 Oct 2011 22:29:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJIWA-0007eu-DI
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 22:28:43 -0700
X-Env-Sender: jfehlig@suse.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319693285!60829479!1
X-Originating-IP: [137.65.248.97]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26503 invoked from network); 27 Oct 2011 05:28:06 -0000
Received: from novprvoes0314.provo.novell.com (HELO mail.novell.com)
	(137.65.248.97) by server-2.tower-27.messagelabs.com with SMTP;
	27 Oct 2011 05:28:06 -0000
Received: from [164.99.195.32] ([::ffff:164.99.195.32])
	by mail.novell.com with ESMTP; Wed, 26 Oct 2011 23:28:35 -0600
Message-ID: <4EA8EC01.2010904@suse.com>
Date: Wed, 26 Oct 2011 23:28:33 -0600
From: Jim Fehlig <jfehlig@suse.com>
User-Agent: Thunderbird 2.0.0.24 (X11/20100302)
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] Prevent vif-bridge from adding user-created
	taps to a bridge
References: <4EA740EB.7030804@suse.com>	<1319614636.16747.39.camel@dagon.hellion.org.uk>
	<4EA84DBA.6070901@suse.com>
In-Reply-To: <4EA84DBA.6070901@suse.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
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

Jim Fehlig wrote:
> Ian Campbell wrote:
>   
>> On Wed, 2011-10-26 at 00:06 +0100, Jim Fehlig wrote:
>>   
>>     
>>> I previously sent this from my @suse.com mail address without having
>>> subscribed it.  Sending again now that I have done so...
>>>
>>> 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
>>>     
>>>       
>> Oh dear.
>>
>>   
>>     
>>> SUBSYSTEM=="net", KERNEL=="tap*", ACTION=="add",
>>> RUN+="/etc/xen/scripts/vif-setup $env{ACTION} type_if=tap"
>>>
>>> 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?
>>>     
>>>       
>> I think overall your change is an improvement, some thoughts:
>>
>> For a tap device XENBUS_PATH is set in vif-common.sh:
>>         elif [ "$type_if" = tap ]; then
>>             # Check presence of compulsory args.
>>             : ${INTERFACE:?}
>>         
>>             # Get xenbus_path from device name.
>>             # The name is built like that: "tap${domid}.${devid}".
>>             dev_=${dev#tap}
>>             domid=${dev_%.*}
>>             devid=${dev_#*.}
>>         
>>             XENBUS_PATH="/local/domain/0/backend/vif/$domid/$devid"
>>         fi
>>
>> Could there be false positives from this?
>>     
>
> Hmm, yes, I think it is possible.
>   

On second thought, maybe not.  A false positive would mean two tap
devices with the same name right?  AFAICT, that's not permitted.

>   
>>  Perhaps we should be more
>> aggressively checking for the tapX.Y, where X and Y are integers, format
>> as well? (that's not foolproof either though).
>>   
>>     
>
> Yeah, I don't think that buys us much.
>
>   
>> Perhaps the toolstack could write something to xenstore containing the
>> literal tap device name which it asked qemu for? Then we can simply read
>> it back here, e.g. /libxl/tap/0/tapX.Y -> $XENBUS_PATH (0 being the
>> backend domain and the content being the xenbus path so we don't need to
>> magic it up).
>>     

The toolstack already writes something in xenstore, namely
$XENBUS_PATH/bridge.  IMO, the problem is in vif-bridge

bridge=${bridge:-}
bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")

if [ -z "$bridge" ]
then
  bridge=$(brctl show | cut -d "
" -f 2 | cut -f 1)

  if [ -z "$bridge" ]
  then
     fatal "Could not find bridge, and none was specified"
  fi
else
  ...

If the toolstack hasn't written anything to xenstore, vif-bridge happily
connects the tap device to the first bridge it finds.  Shouldn't
vif-bridge just exit if no bridge is specified?

Thanks,
Jim


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Wed Oct 26 22:31:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 22: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 1RJIYZ-0008FL-Fw; Wed, 26 Oct 2011 22:31:11 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJIWZ-0007iE-Rx
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 22:29:09 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319693344!1805477!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12935 invoked from network); 27 Oct 2011 05:29:04 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 05:29:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8609990"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 05:29: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, 27 Oct 2011 06:29:03 +0100
Subject: Re: [Xen-devel] readonly grants
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Mohammad Hedayati <hedayati.mo@gmail.com>
In-Reply-To: <CABA5EEvkcJpNvPqJHvhcnCs3jKkhYvsA44tC1aA-oztzYS7_FQ@mail.gmail.com>
References: <CABA5EEsXEhN8DPwbm-YLMwW8qVK-1-gV37vCYCu=spG8uUUZ5g@mail.gmail.com>
	<1319648133.9436.58.camel@zakaz.uk.xensource.com>
	<CABA5EEvkcJpNvPqJHvhcnCs3jKkhYvsA44tC1aA-oztzYS7_FQ@mail.gmail.com>
Content-Type: text/plain; charset="ISO-8859-1"
Organization: Citrix Systems, Inc.
Date: Thu, 27 Oct 2011 06:29:02 +0100
Message-ID: <1319693342.16747.43.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

Please don't top post.

On Wed, 2011-10-26 at 18:36 +0100, Mohammad Hedayati wrote:
> Though the page is not owned by the issuing domain, the l1 page is, so
> the l1e_get_page (if you meant so instead of get_page_from_l1e)
> succeeds. There should be a check somewhere else, probably in
> x86_emulate or subordinate routines.

I really did mean get_page_from_l1e which takes a reference on the page
referenced by an l1e, not the page containing that l1e. i.e. it takes a
reference on a data page not an l1 page-table page.

l1e_get_page just extracts the pfn from a PTE and converts it to a
struct page so it isn't interesting from this point of view.

Ian.

> 
> On Wed, Oct 26, 2011 at 8:25 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> > On Wed, 2011-10-26 at 17:46 +0100, Mohammad Hedayati wrote:
> >> After mapping a readonly granted page in a PV guest, the guest can try
> >> to change his l1 page table entry, faulting into Xen. Here xen
> >> emulates the update operation, but first it must check whether the
> >> modification is allowed or not (i.e. the grant is readonly or not).
> >> I'm looking through the code, but I can't find where this checking is
> >> done. Can anyone help?!
> >
> > I don't think a guest can modify any grant mapping that way, read only
> > or otherwise, they have to use the GNTTABOP hypercalls.
> >
> > The thing which prevents it is that the page is really owned by another
> > domain so the get_page_from_l1e in ptwr_emulated_update will fail.
> >
> > (disclaimer, I'm not really sure about this...)
> >
> > Ian.
> >
> >
> 
> _______________________________________________
> 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 Oct 26 22:32:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 22:32:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJIZg-0000Dz-O4; Wed, 26 Oct 2011 22:32:21 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJIXp-0007za-7l
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 22:30:28 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-8.tower-174.messagelabs.com!1319693419!23136647!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17684 invoked from network); 27 Oct 2011 05:30:20 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-8.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 27 Oct 2011 05:30:20 -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
	p9R5UGv5027419
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 05:30:17 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
	p9R5UFjI017690
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 05:30:15 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
	p9R5U9EN000818; Thu, 27 Oct 2011 00:30:09 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 22:30:09 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 29B5A82C24; Thu, 27 Oct 2011 01:30:08 -0400 (EDT)
Date: Thu, 27 Oct 2011 01:30:08 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: miche@google.com, gregkh@suse.de, linux-kernel@vger.kernel.org
Message-ID: <20111027053007.GA32765@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="C7zPtVaVf+AK4Oqc"
Content-Disposition: inline
User-Agent: Mutt/1.5.21 (2010-09-15)
Content-Transfer-Encoding: 7bit
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4EA8EC69.0189:SCFMA922111,ss=1,re=-19.000,fgs=0
Cc: xen-devel@lists.xensource.com
Subject: [Xen-devel] 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


--C7zPtVaVf+AK4Oqc
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

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:

[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
.. 

(see attached file titled bad.log)

If I use Linus's latest git tree and revert your patch I get the kernel
to bootup (see good.log file),

--C7zPtVaVf+AK4Oqc
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="bad.log"
Content-Transfer-Encoding: quoted-printable

PXELINUX 3.82 2009-06-09  Copyright (C) 1994-2009 H. Peter Anvin et al
Loading latest/xen.gz... ok
Loading latest/vmlinuz... ok
Loading latest/initramfs.cpio.gz... ok
 __  __            _  _    _    _ _ _  ___ ____   __  =20
 \ \/ /___ _ __   | || |  / |  / / / |/ _ \___ \ / /_ =20
  \  // _ \ '_ |__) | '_ \=20
  /  \  __/ | | | |__   _|| |__| | | | |_| / __/| (_) |
 /_/\_\___|_| |_|    |_|(_)_|  |_|_|_|\___/_____|\___/=20
                                                      =20
(XEN) Xen version 4.1-111027 (konrad@dumpdata.com) (gcc version 4.4.4 201=
00503 (Red Hat 4.4.4-2) (GCC) ) Thu Oct 27 00:58:50 EDT 2011
(XEN) Latest ChangeSet: Wed Oct 12 10:00:10 2011 -0400 23160:3660ad2b187f
(XEN) Console output is synchronous.
(XEN) Bootloader: unknown
(XEN) Command line: com1=3D115200,8n1 console=3Dcom1,vga guest_loglvl=3Da=
ll sync_console loglvl=3Dall apic=3Ddebug
(XEN) Video information:
(XEN)  VGA is text mode 80x25, font 8x16
(XEN)  VBE/DDC methods: none; EDID transfer time: 2 seconds
(XEN)  EDID info not retrieved because no DDC retrieval method detected
(XEN) Disc information:
(XEN)  Found 0 MBR signatures
(XEN)  Found 0 EDD information structures
(XEN) Xen-e820 RAM map:
(XEN)  0000000000000000 - 000000000009d800 (usable)
(XEN)  000000000009d800 - 00000000000a0000 (reserved)
(XEN)  00000000000cc000 - 0000000000100000 (reserved)
(XEN)  0000000000100000 - 000000007fff0000 (usable)
(XEN)  000000007fff0000 - 0000000080000000 (reserved)
(XEN)  0000000080000000 - 00000000cfef0000 (usable)
(XEN)  00000000cfef0000 - 00000000cfef5000 (ACPI data)
(XEN)  00000000cfef5000 - 00000000cff7f000 (ACPI NVS)
(XEN)  00000000cff80000 - 00000000d0000000 (reserved)
(XEN)  00000000e0000000 - 00000000f0000000 (reserved)
(XEN)  00000000fec00000 - 00000000fec10000 (reserved)
(XEN)  00000000fee00000 - 00000000fee01000 (reserved)
(XEN)  00000000fff80000 - 0000000100000000 (reserved)
(XEN)  0000000100000000 - 0000000130000000 (usable)
(XEN) ACPI: RSDP 000F79B0, 0024 (r2 PTLTD )
(XEN) ACPI: XSDT CFEF0753, 009C (r1 DELL   PE_SC3    6040000 DELL        =
0)
(XEN) ACPI: FACP CFEF3C5F, 00F4 (r3 DELL   PE_SC3    6040000 DELL    F424=
0)
(XEN) ACPI: DSDT CFEF07EF, 33FC (r1 DELL   PE_SC3    6040000 MSFT  100000=
E)
(XEN) ACPI: FACS CFEF5FC0, 0040
(XEN) ACPI: TCPA CFEF3D53, 0032 (r1 Phoeni  x        6040000  TL         =
0)
(XEN) ACPI: SLIC CFEF3D85, 0024 (r1 DELL   PE_SC3    6040000 PTL         =
1)
(XEN) ACPI: SPCR CFEF3DA9, 0050 (r1 DELL   PE_SC3    6040000 PTL         =
1)
(XEN) ACPI: EINJ CFEF3DF9, 01B0 (r1 PTL    WHEAPTL   6040000 PTL         =
1)
(XEN) ACPI: HEST CFEF3FA9, 00A8 (r1 PTL    WHEAPTL   6040000 PTL         =
1)
(XEN) ACPI: BERT CFEF4051, 0030 (r1 PTL    WHEAPTL   6040000 PTL         =
1)
(XEN) ACPI: SSDT CFEF4081, 00E1 (r1 wheaos  wheaosc  6040000 INTL 2005062=
4)
(XEN) ACPI: ERST CFEF4162, 0270 (r1 PTL    WHEAPTL   6040000 PTL         =
1)
(XEN) ACPI: SRAT CFEF43D2, 00E8 (r1 AMD    HAMMER    6040000 AMD         =
1)
(XEN) ACPI: SSDT CFEF44BA, 0A30 (r1 AMD    POWERNOW  6040000 AMD         =
1)
(XEN) ACPI: MCFG CFEF4EEA, 003C (r1 PTLTD    MCFG    6040000  LTP        =
0)
(XEN) ACPI: HPET CFEF4F26, 0038 (r1 PTLTD  HPETTBL   6040000  LTP        =
1)
(XEN) ACPI: APIC CFEF4F5E, 007A (r1 PTLTD  	 APIC    6040000  LTP        =
0)
(XEN) ACPI: BOOT CFEF4FD8, 0028 (r1 PTLTD  $SBFTBL$  6040000  LTP        =
1)
(XEN) System RAM: 4094MB (4192756kB)
(XEN) SRAT: PXM 0 -> APIC 0 -> Node 0
(XEN) SRAT: PXM 0 -> APIC 1 -> Node 0
(XEN) SRAT: PXM 0 -> APIC 2 -> Node 0
(XEN) SRAT:rom 120167000 - 120169000
(XEN) NUMA: Using 8 for the hash shift.
(XEN) Domain heap initialised
(XEN) found SMP MP-table at 000f7a70
(XEN) DMI present.
(XEN) Using APIC driver default
(XEN) ACPI: PM-Timer IO Port: 0x8008
(XEN) ACPI: ACPI SLEEP INFO: pm1x_cnt[8004,0], pm1x_evt[8000,0]
(XEN) ACPI:                  wakeup_vec[cfef5fcc], vec_size[20]
(XEN) ACPI: Local APIC address 0xfee00000
(XEN) ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
(XEN) Processor #0 0:2 APIC version 16
(XEN) ACPI: LAPIC (acpi_id[0x01] lapic_id[0x01] enabled)
(XEN) Processor #1 0:2 APIC version 16
(XEN) ACPI: LAPIC (acpi_id[0x02] lapic_id[0x02] enabled)
(XEN) Processor #2 0:2 APIC version 16
(XEN) ACPI: LAPIC (acpi_id[0x03] lapic_id[0x03] enabled)
(XEN) Processor #3 0:2 APIC version 16
(XEN) ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
(XEN) ACPI: IOAPIC (id[0x04] address[0xfec00000] gsi_base[0])
(XEN) IOAPIC[0]: apic_id 4, version 17, address 0xfec00000, GSI 0-23
(XEN) ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high edge)
(XEN) ACPI: IRQ0 used by override.
(XEN) ACPI: IRQ2 used by override.
(XEN) Enabling APIC mode:  Flat.  Using 1 I/O APICs
(XEN) ACPI: HPET id: 0x10de8201 base: 0xfed00000
(XEN) PCI: MCFG configuration 0: base e0000000 segment 0 buses 0 - 4
(XEN) PCI: MCFG area at e0000000 reserved in E820
(XEN) ERST table is invalid
(XEN) Using ACPI (MADT) for SMP configuration information
(XEN) IRQ limits: 24 GSI, 760 MSI/MSI-X
(XEN) Using scheduler: SMP Credit Scheduler (credit)
(XEN) Detected 2109.766 MHz processor.
(XEN) Initing memory sharing.
(XEN) AMD Fam10h machine check reporting enabled
(XEN) AO-APIC IRQs
(XEN)  -> Using new ACK method
(XEN) ..TIMER: vector=3D0xF0 apic1=3D0 pin1=3D2 apic2=3D-1 pin2=3D-1
(XEN) Platform timer is 25.000MHz HPET
=FF(XEN) Allocated console ring of 32 KiB.
(XEN) HVM: ASIDs enabled.
(XEN) SVM: Support(XEN) Brought up 4 CPUs
(XEN) HPET: 3 timers in total, 0 timers will be used for broadcast
(XEN) ACPI sleep modes: S3
(XEN) MCA: Use hw thresholding t(XEN) mcheck_poll: Machine check polling =
timer started.
(XEN) *** LOADING DOMAIN 0 ***
(XEN)  Xen  kernel: 64-bit, lsb, compat32
(XEN)  Dom0 kernel: 64-bit, PAE, lsb, paddr 0x1000000 -> 0x202e000
(XEN) PHYSICAL MEMORY ARRANGEMENT:
(XEN)  Dom0 alloc.:   0000000118000000->000000011c000000 (926279 pages to=
 be allocated)
(XE00->000000012ffff600
(XEN) VIRTUAL MEMORY ARRANGEMENT:
(XEN)  Loaded kernel: ffffffff81000000->ffffffff8202e000
(XEN)  Init. ramdisk: ffffffff8202e000->ffffffff9093a600
(XEN)  Phys-Mach map: ffffffff9093b000->ffffffff910e0aa0
(XEN)  Start info:    ffffffff910e1000->ffffffff910e14b4
(XEN)  Page tables:   ffffffff910e2000->ffffffff9116f000
(XEN)  Boot stack:    ffffffff9116f000->ffffffff91170000
(XEN)  TOTAL:         ffffffff80000000->ffffffff91400000
(XEN)  ENTRY ADDRESS: ffffffff81aeb200
(XEN) Dom0 has maximum 4 VCPUs
(XEN) Scrubbing Free RAM: .done.
(XEN) Xen trace buffers: disabled
(XEN) Std. Loglevel: All
(XEN) Guest Loglevel: All
(XEN) **********************************************
(XEN) ******* WARNING: CONSOLE OUTPUT IS SYNCHRONOUS
(XEN) ******* This option is intended to aid debugging of Xen by ensuring
(XEN) ******* that all output is synchronously delivered on the serial li=
ne.
(XEN) ******* However it can introduce SIGNIFICANT latencies and affect
(XEN) ******* timekeeping. It is NOT recommended for production use!
(XEN) **********************************************
(XEN) 3... 2... 1...=20
(XEN) Xen is relinquishing VGA console.
(XEN) *** Serial input -> DOM0 (type 'CTRL-a' three times to switch input=
 to Xen)
(XEN) Freed 224kB init memory.
mapping kernel into physical memory
Xen: setup ISA identity maps
about to get started...
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.ng  cff7f-cff80 pfn range: 1 pages freed
[    0.000000] Freeing  d0000-e0000 pfn range: 65536 pages freed
[    0.000000] Freeing  f0000-f4b54 pfn range: 19284 pages freed
[    0.000000] released 84821 pages of unused memory
[    0.000000] Set 196994 page(s) to 1-1 mapping.
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  Xen: 0000000000000000 - 000000000009d000 (usable)
[    0.000000]  Xen: 000000000009d800 - 0000000000100000 (reserved)
[    0.000000]  Xen: 0000000000100000 - 000000007fff0000 (usable)
[    0.000000]  Xen: 000000007fff0000 - 0000000080000000 (reserved)
[    0.000000]  Xen: 0000000080000000 - 00000000cfef0000 (usable)
[    0.000000]  Xen: 00000000cfef0000 - 00000000cfef5000 (ACPI data)
[    0.000000]  Xen: 00000000cfef5000 - 00000000cff7f000 (ACPI NVS)
[    0.000000]  Xen: 00000000cff80000 - 00000000d0000000 (reserved)
[    0.000000]  Xen: 00000000e0000000 - 00000000f0000000 (reserved)
[    0.000000]  Xen: 00000000fec00000 - 00000000fec10000 (reserved)
[    0.000000]  Xen: 00000000fee00000 - 00000000fee01000 (reserved)
[    0.000000]  Xen: 00000000fff80000 - 0000000100000000 (reserved)
[    0.000000]  Xen: 0000000100000000 - 0000000144b55000 (usable)
[    0.000000] bootconsole [xenboot0] enabled
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] DMI present.
[    0.000000] DMI: Dell Inc. PowerEdge T105 /0RR825, BIOS 1.3.2 08/20/20=
08
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (us=
able) =3D=3D> (reserved)
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (us=
able)
[    0.000000] No AGP bridge found
[    0.000000] last_pfn =3D 0x144b55 max_arch_pfn =3D 0x400000000
[    0.000000] last_pfn =3D 0xc max_arch_pfn =3D 0x400000000
[    0.000000] found SMP MP-table at [ffff8800000f7a70] f7a70
[    0.000000] initial memory mapped : 0 - 1093b000
[    0.000000] Base memory trampoline at [ffff880000098000] 98000 size 20=
480
[    0.000000] init_memory_mapping: 0000000000000000-00000000cfef0000
[    0.000000]  0000000000 - 00cfef0000 page 4k
[    0.000000] kernel direct mapping tables up to cfef0000 @ cf86b000-cfe=
f0000
[    0.000000] xen: setting RW the range cfe60000 - cfef0000
[    0.000000] init_memory_mapping: 0000000100000000-0000000144b55 kernel=
 direct mapping tables up to 144b55000 @ cee3e000-cf86b000
[    0.000000] xen: setting RW the range cf066000 - cf86b000
[    0.000000] RAMDISK: 0202e000 - 1093b000
[    0.000000] ACPI: RSDP 00000000000f79b0 00024 (v02 PTLTD )
[    0.000000] ACPI: XSDT 00000000cfef0753 0009C (v01 DELL   PE_SC3   060=
40000 DELL 00000000)
[    0.000000] ACPI: FACP 00000000cfef3c5f 000F4 (v03 DELL   PE_SC3   060=
40000 DELL 000F4240)
[    0.000000] ACPI: DSDT 00000000cfef07ef 033FC (v01 DELL   PE_SC3   060=
40000 MSFT 0100000E)
[    0.000000] ACPI: FACS 00000000cfef5fc0 00040
[    0.000000] ACPI: TCPA 00000000cfef3d53 00032 (v01 Phoeni  x       060=
40000  TL  00000000)
[    0.000000] ACPI: SLIC 00000000cfef3d85 00024 (v01 DELL   PE_SC3   060=
40000 PTL  00000001)
[    0.000000] ACPI: SPCR 00000000cfef3da9 00050 (v01 DELL   PE_SC3   060=
40000 PTL  00000001)
[    0.000000] ACPI: EINJ 00000000cfef3df9 001B0 (v01 PTL    WHEAPTL  060=
40000 PTL  00000001)
[    0.000000] ACPI: HEST 00000000cfef3fa9 000A8 (v01 PTL    WHEAPTL  060=
40000 PTL  00000001)
[    0.000000] ACPI: BERT 00000000cfef4051 00030 (v01 PTL    WHEAPTL  060=
40000 PTL  00000001)
[    0.000000] ACPI: SSDT 00000000cfef4081 000E1 (v01 wheaos  wheaosc 060=
40000 INTL 20050624)
[    0.000000] ACPI: ERST 00000000cfef4162 00270 (v01 PTL    WHEAPTL  060=
40000 PTL  00000001)
[    0.000000] ACPI: SRAT 00000000cfef43d2 000E8 (v01 AMD    HAMMER   060=
40000 AMD  00000001)
[    0.000000] ACPI: SSDT 00000000cfef44ba 00A30 (v01 AMD    POWERNOW 060=
40000 AMD  00000001)
[    0.000000] ACPI: MCFG 00000000cfef4eea 0003C (v01 PTLTD    MCFG   060=
40000  LTP 00000000)
[    0.000000] ACPI: HPET 00000000cfef4f26 00038 (v01 PTLTD  HPETTBL  060=
40000  LTP 00000001)
[    0.000000] ACPI: APIC 00000000cfef4f5e 0007A (v01 PTLTD  ? APIC   060=
40000  LTP 00000000)
[    0.000000] ACPI: BOOT 00000000cfef4fd8 00028 (v01 PTLTD  $SBFTBL$ 060=
40000  LTP 00000001)
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] Scanning NUMA topology in Northbridge 24
[    0.000000] No NUMA configuration found
[    0.000000] Faking a node at 0000000000000000-0000000144b55000
[    0.000000] Initmem setup node 0 0000000000000000-0000000144b55000
[    0.000000]   NODE_DATA [00000000cfec9000 - 00000000cfeeffff]
[    0.000000] Zone PFN ranges:
[    0.000000]   DMA      0x00000010 -> 0x00001000
[    0.000000]   DMA32    0x00001000 -> 0x0rt PFN for each node
[    0.000000] early_node_map[4] active PFN ranges
[    0.000000]     0: 0x00000010 -> 0x0000009d
[    0.000000]     0: 0x00000100 -> 0x0007fff0
[    0.000000]     0: 0x00080000 -> 0x000cfef0
[    0.000000]     0: 0x00100000 -> 0x00144b55
[    0.000000] On node 0 totalpages: 1132994
[    0.000000]   DMA zone: 64 pages used for memmap
[    0.000000]   DMA zone: 5 pages reserved
[    0.000000]   DMA zone: 3912 pages, LIFO batch:0
[    0.000000]   DMA32 zone: 16320 pages used for memmap
[    0.000000]   DMA32 zone: 831264 pages, LIFO batch:31
[    0.000000]   Normal zone: 4398 pages used for memmap
[    0.000000]   Normal zone: 277031 pages, LIFO batch:31
[    0.000000] ACPI: PM-Timer IO Port: 0x8008
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] ACPI: LAPIC (a000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x0=
2] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x03] enabled)
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
[    0.000000] ACPI: IOAPIC (id[0x04] address[0xfec00000] gsi_base[0])
[    0.000000] IOAPIC[0]: apic_id 4, version 255, address 0xfec00000, GSI=
 0-255
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high edge)
[    0.000000] ACPI: IRQ0 used by override.
[    0.000000] ACPI: IRQ2 used by override.
[    0.000000] ACPI: IRQ9 used by override.
[    0.000000] Using ACPI (MADT) for SMP configuration information
[    0.000000] ACPI: HPET id: 0x10de8201 base: 0xfed00000
[    0.000000] SMP: Allowing 4 CPUs, 0 hotplug CPUs
[    0.000000] nr_irqs_gsi: 272
[    0.000000] PM: Registered nosave memory: 000000000009d000 - 000000000=
009e000
[    0.000000] PM: Registered nosave memory: 000000000009e000 - 000000000=
0100000
[    0.000000] PM: Registered nosave memory: 000000007fff0000 - 000000008=
0000000
[    0.000000] PM: Registered nosave memory: 00000000cfef0000 - 00000000c=
fef5000
[    0.000000] PM: Registered nosave memory: 00000000cfef5000 - 00000000c=
ff7f000
[    0.000000] PM: Registered nosave memory: 00000000cff7f000 - 00000000c=
ff80000
[    0.000000] PM: Registered nosave memory: 00000000cff80000 - 00000000d=
0000000
[    0.000000] PM: Registered nosave memory: 00000000d0000000 - 00000000e=
0000000
[    0.000000] PM: Registered nosave memory: 00000000e0000000 - 00000000f=
0000000
[    0.000000] PM: Registered nosave memory: 00000000f0000000 - 00000000f=
ec00000
[    0.000000] PM: Registered nosave memory: 00000000fec00000 - 00000000f=
ec10000
[    0.000000] PM: Registered nosave memory: 00000000fec10000 - 00000000f=
ee00000
[    0.000000] PM: Registered nosave memory: 00000000fee00000 - 00000000f=
ee01000
[    0.000000] PM: Registered nosave memory: 00000000fee01000 - 00000000f=
ff80000
[    0.000000] PM: Registered nosave memory: 00000000fff80000 - 000000010=
0000000
[    0.000000] Allocating PCI resources starting at d0000000 (gap: d00000=
00:10000000)
[    0.000000] Booting paravirtualized kernel on Xen
[    0.000000] Xen version: 4.1-111027 (preserve-AD)
[    0.000000] setup_percpu: NR_CPUS:4096 nr_cpumask_bits:4 nr_cpu_ids:4 =
nr_node_ids:1
[    0.000000] PERCPU: Embedded 27 pages/cpu @ffff8800cf7ff000 s81472 r81=
92 d20928 u110592
[    0.000000] pcpu-alloc: s81472 r8192 d20928 u110592 alloc=3D27*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3=20
[    0.000000] Built 1 zonelists in Node order, mobility grouping on.  To=
tal pages: 1112207
[    0.000000] Policy zone: Normal
[    0.000000] Kernel command line: earlyprintk=3Dxenboot debug selinux=3D=
0 console=3Dtty console=3Dhvc0 xen-pciback.hide=3D(05:00.0)(05:00.1) logl=
evel=3D10
[    0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)
[    0.000000] Placing 64MB software IO TLB between ffff8800c6800000 - ff=
ff8800ca800000
[    0.000000] software IO TLB at phys 00 - 0xca800000
[    0.000000] Memory: 2996888k/5320020k available (6348k kernel code, 78=
8044k absent, 1535088k reserved, 4745k data, 2444k init6
[    0.000000] xen: sci override: global_irq=3D9 trigger=3D0 polarity=3D1
[    0.000000] xen: registering gsi 9 triggering 0 polarity 1
[    0.000000] xen: --> pirq=3D9 -> irq=3D9 (gsi=3D9)
[    0.000000] xen: acpi sci 9
[    0.000000] xen: --> pirq=3D1 -> irq=3D1 (gsi=3D1)
[    0.000000] xen: --> pirq=3D2 -> irq=3D2 (gsi=3D2)
[    0.000000] xen: --> pirq=3D3 -> irq=3D3 (gsi=3D3)
[    0.000000] xen: --> pirq=3D4 -> irq=3D4 (gsi=3D4)
[    0.000000] xen: --> pirq=3D5 -> irq=3D5 (gsi=3D5)
[    0.000000] xen: --> pirq=3D6 -> irq=3D6 (gsi=3D6)
[    0.000000] xen: --> pirq=3D7 -> irq=3D7 (gsi=3D7)
[    0.000000] xen: --> pirq=3D8 -> irq=3D8 (gsi=3D8)
[    0.000000] xen_map_pirq_gsi: returning irq 9 for gsi 9
[    0.000000] xen: --> pirq=3D9 -> irq=3D9 (gsi=3D9)
[    0.000000] xen: --> pirq=3D10 -> ffff]
[    0.169982] pci_root PNP0A03:00: host bridge window [mem 0xd0000000-0x=
febfffff]
[    0.169982] pci_root PNP0A03:00: host bridge window [mem 0xfed40000-0x=
fed8ffff]
[    0.169982] pci 0000:00:00.0: [10de:005e] type 0 class 0x000580
[    0.169982] pci 0000:00:01.0: [10de:0051] type 0 class 0x000601
[    0.169982] pci 0000:00:01.0: reg 10: [io  0x8c00-0x8fff]
[    0.170010] pci 0000:00:01.1: [10de:0052] type 0 class 0x000c05
[    0.170982] pci 0000:00:01.1: reg 10: [io  0x2080-0x209f]
[    0.170982] pci 0000:00:01.1: reg 20: [io  0x2040-0x207f]
[    0.170982] pci 0000:00:01.1: reg 24: [io  0x2000-0x203f]
[    0.170982] pci 0000:00:01.1: PME# supported from D3hot D3cold
[    0.170982] pci 0000:00:01.1: PME# disabled
[    0.170982] pci 0000:00:02.0: [10de:005a] type 0 class 0x000c03
[    0.170982] pci 0000:00:02.0: reg 10: [mem 0xd0000000-0xd0000fff]
[    0.170982] pci 0000:00:02.0: supports D1 D2
[    0.170982] pci 0000:00:02.0: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.170982] pci 0000:00:02.0: PME# disabled
[    0.170982] pci 0000:00:02.1: [10de:005b] type 0 class 0x000c03
[    0.170982] pci 0000:00:02.1: reg 10: [mem 0xd0001000-0xd00010ff]
[    0.170982] pci 0000:00:02.1: supports D1 D2
[    0.170982] pci 0000:00:02.1: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.170982] pci 0000:00:02.1: PME# disabled
[    0.170982] pci 0000:00:07.0: [10de:0054] type 0 class 0x000101
[    0.170982] pci 0000:00:07.0: reg 10: [io  0x20f0-0x20f7]
[    0.170982] pci 0000:00:07.0: reg 14: [io  0x20e0-0x20e3]
[    0.170982] pci 0000:00:07.0: reg 18: [io  0x20d0-0x20d7]
[    0.170982] pci 0000:00:07.0: reg 1c: [io  0x20c0-0x20c3]
[    0.170982] pci 0000:00:07.0: reg 20: [io  0x20b0-0x20bf]
[    0.170982] pci 0000:00:07.0: reg 24: [mem 0xd0002000-0xd0002fff]
[    0.170982] pci 0000:00:08.0: [10de:0055] type 0 class 0x000101
[    0.170982] pci 0000:00:08.0: reg 10: [io  0x2440-0x2447]
[    0.170982] pci 0000:00:08.0: reg 14: [io  0x2430-0x2433]
[    0.170982] pci 0000:00:08.0: reg 18: [io  0x2420-0x2427]
[    0.170982] pci 0000:00:08.0: reg 1c: [io  0x2410-0x2413]
[    0.170982] pci 0000:00:08.0: reg 20: [io  0x2400-0x240f]
[    0.170982] pci 0000:00:08.0: reg 24: [mem 0xd0003000-0xd0003fff]
[    0.170982] pci 0000:00:09.0: [10de:005c] type 1 class 0x000604
[    0.170982] pci 0000:00:0b.0: [10de:005d] type 1 class 0x000604
[    0.170982] pci 0000:00:0b.0: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.170982] pci 0000:00:0b.0: PME# disabled
[    0.170982] pci 0000:00:0c.0: [10de:005d] type 1 class 0x000604
[    0.170982] pci 0000:00:0c.0: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.170982] pci 0000:00:0c.0: PME# disabled
[    0.171164] pci 0000:00:0d.0: [10de:005d] type 1 class 0x000604
[    0.171982] pci 0000:00:0d.0: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.171982] pci 0000:00:0d.0: PME# disabled
[    0.171982] pci 0000:00:0e.0: [10de:005d] type 1 class 0x000604
[    0.171982] pci 0000:00:0e.0: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.171982] pci 0000:00:0e.0: PME# disabled
[    0.171982] pci 0000:00:18.0: [1022:1200] type 0 class 0x000600
[    0.171999] pci 0000:00:18.1: [1022:1201] type 0 class 0x000600
[    0.172982] pci 0000:00:18.2: [1022:1202] type 0 class 0x000600
[    0.172982] pci 0000:00:18.3: [1022:1203] type 0 class 0x000600
[    0.172982] pci 0000:00:18.4: [1022:1204] type 0 class 0x000600
[    0.172982] pci 0000:01:07.0: [1077:6312] type 0 class 0x000c04
[    0.172982] pci 0000:01:07.0: reg 10: [io  0x3000-0x30ff]
[    0.172982] pci 0000:01:07.0: reg 14: [mem 0xd0110000-0xd0110fff]
[    0.172982] pci 0000:01:07.0: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.173151] pci 0000:01:08.0: [1002:515e] type 0 class 0x000300
[    0.173982] pci 0000:01:08.0: reg 10: [mem 0xd8000000-0xdfffffff pref]
[    0.173982] pci 0000:01:08.0: reg 14: [io  0x3400-0x34ff]
[    0.173982] pci 0000:01:08.0: reg 18: [mem 0xd0100000-0xd010ffff]
[    0.173982] pci 0000:01:08.0: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.173982] pci 0000:01:08.0: supports D1 D2
[    0.173982] pci 0000:00:09.0: PCI bridge to [bus 01-01]
[    0.173982] pci 0000:00:09.0:   bridge window [io  0x3000-0x3fff]
[    0.173982] pci 0000:00:09.0:   bridge window [mem 0xd0100000-0xd01fff=
ff]
[    0.173982] pci 0000:00:09.0:   bridge window [mem 0xd8000000-0xdfffff=
ff pref]
[    0.173982] pci 0000:02:00.0: [14e4:165a] type 0 class 0x000200
[    0.173982] pci 0000:02:00.0: reg 10: [mem 0xd0200000-0xd020ffff 64bit=
]
[    0.173982] pci 0000:02:00.0: PME# supported from D3hot D3cold
[    0.173982] pci 0000:02:00.0: PME# disabled
[    0.175163] pci 0000:00:0b.0: PCI bridge to [bus 02-02]
[    0.175981] pci 0000:00:0b.0:   bridge window [mem 0xd0200000-0xd02fff=
ff]
[    0.175981] pci 0000:00:0c.0: PCI bridge to [bus 03-03]
[    0.175981] pci 0000:00:0d.0: PCI bridge to [bus 04-04]
[    0.175981] pci 0000:05:00.0: [8086:105e] type 0 class 0x000200
[    0.175981] pci 0000:05:00.0: reg 10: [mem 0xd0320000-0xd033ffff]
[    0.175981] pci 0000:05:00.0: reg 14: [mem 0xd0300000-0xd031ffff]
[    0.175981] pci 0000:05:00.0: reg 18: [io  0x4000-0x401f]
[    0.175981] pci 0000:05:00.0: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.175981] pci 0000:05:00.0: PME# supported from D0 D3hot D3cold
[    0.175981] pci 0000:05:00.0: PME# disabled
[    0.175981] pci 0000:05:00.1: [8086:105e] type 0 class 0x000200
[    0.175981] pci 0000:05:00.1: reg 10: [mem 0xd0360000-0xd037ffff]
[    0.175981] pci 0000:05:00.1: reg 14: [mem 0xd0340000-0xd035ffff]
[    0.175981] pci 0000:05:00.1: reg 18: [io  0x4020-0x403f]
[    0.175981] pci 0000:05:00.1: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.175981] pci 0000:05:00.1: PME# supported from D0 D3hot D3cold
[    0.175981] pci 0000:05:00.1: PME# disabled
[    0.175981] pci 0000:05:00.0: disabling ASPM on pre-1.1 PCIe device.  =
You can enable it with 'pcie_aspm=3Dforce'
[    0.175981] pci 0000:00:0e.0: PCI bridge to [bus 05-05]
[    0.175981] pci 0000:00:0e.0:   bridge window [io  0x4000-0x4fff]
[    0.175981] pci 0000:00:0e.0:   bridge window [mem 0xd0300000-0xd03fff=
ff]
[    0.175981] pci 0000:00:0b.0: Dev MPS 128 MPSS 128 MRRS 512
[    0.175981] pci 0000:00:0b.0: Dev MPS 128 MPSS 128 MRRS 128
[    0.175981] pci 0000:02:00.0: Dev MPS 128 MPSS 128 MRRS 512
[    0.175981] pci 0000:02:00.0: Dev MPS 128 MPSS 128 MRRS 128
[    0.175981] pci 0000:00:0c.0: Dev MPS 128 MPSS 128 MRRS 512
[    0.175981] pci 0000:00:0c.0: Dev MPS 128 MPSS 128 MRRS 128
[    0.175981] pci 0000:00:0d.0: Dev MPS 128 MPSS 128 MRRS 512
[    0.175981] pci 0000:00:0d.0: Dev MPS 128 MPSS 128 MRRS 128
[    0.175981] pci 0000:00:0e.0: Dev MPS 128 MPSS 128 MRRS 512
[    0.175981] pci 0000:00:0e.0: Dev MPS 128 MPSS 128 MRRS 128
[    0.175981] pci 0000:05:00.0: Dev MPS 128 MPSS 256 MRRS 512
[    0.175981] pci 0000:05:00.0: Dev MPS 128 MPSS 128 MRRS 128
[    0.175981] pci 0000:05:00.1: Dev MPS 128 MPSS 256 MRRS 512
[    0.175981] pci 0000:05:00.1: Dev MPS 128 MPSS 128 MRRS 128
[    0.175981] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
[    0.176092] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.P2P0._PRT]
[    0.176981] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR0._PRT]
[    0.176981] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR1._PRT]
[    0.176981] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR2._PRT]
[    0.176981] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR3._PRT]
[    0.176981]  pci0000:00: Requesting ACPI _OSC control (0x1d)
[    0.176981]  pci0000:00: ACPI _OSC request failed (AE_NOT_FOUND), retu=
rned control mask: 0x1d
[    0.176981] ACPI _OSC control for PCIe not granted, disabling ASPM
(XEN) PCI add device 00:00.0
(XEN) PCI add device 00:01.0
(XEN) PCI add device 00:01.1
(XEN) PCI add device 00:02.0
(XEN) PCI add device 00:02.1
(XEN) PCI add device 00:07.0
(XEN) PCI add device 00:08.0
(XEN) PCI add device 00:09.0
(XEN) PCI add device 00:0b.0
(XEN) PCI add device 00:0c.0
(XEN) PCI add device 00:0d.0
(XEN) PCI add device 00:0e.0
(XEN) PCI add device 00:18.0
(XEN) PCI add device 00:18.1
(XEN) PCI add device 00:18.2
(XEN) PCI add device 00:18.3
(XEN) PCI add device 00:18.4
(XEN) PCI add device 01:07.0
(XEN) PCI add device 01:08.0
(XEN) PCI add device 02:00.0
(XEN) PCI add device 05:00.0
(XEN) PCI add device 05:00.1
[    0.219285] ACPI: PCI Interrupt Link [LNK1] (IRQs 16 17 18 19) *0
[    0.220275] ACPI: PCI Interrupt Link [LNK2] (IRQs 16 17 18 19) *0
[    0.221097] ACPI: PCI Interrupt Link [LNK3] (IRQs 16 17 18 19) *0
[    0.222276] ACPI: PCI Interrupt Link [LNK4] (IRQs 16 17 18 19) *0
[    0.223239] ACPI: PCI Interrupt Link [LNK5] (IRQs 16 17 18 19) *0, dis=
abled.
[    0.224266] ACPI: PCI Interrupt Link [LSMB] (IRQs 20 21 22 23) *0
[    0.225144] ACPI: PCI Interrupt Link [LUS0] (IRQs 20 21 22 23) *0
[    0.226134] ACPI: PCI Interrupt Link [LUS2] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.227137] ACPI: PCI Interrupt Link [LMAC] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.228229] ACPI: PCI Interrupt Link [LACI] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.229145] ACPI: PCI Interrupt Link [LMCI] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.230131] ACPI: PCI Interrupt Link [LPID] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.231141] ACPI: PCI Interrupt Link [LTID] (IRQs 20 21 22 23) *0
[    0.232157] ACPI: PCI Interrupt Link [LSI1] (IRQs 20 21 22 23) *0
[    0.233150] ACPI: PCI Interrupt Link [APCP] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.234041] xen/balloon: Initialising balloon driver.
[    0.234973] last_pfn =3D 0x144b55 max_arch_pfn =3D 0x400000000
[    0.240576] xen-balloon: Initialising balloon driver.
[    0.241044] xen/balloon: Xen selfballooning driver disabled for do
[    0.242152] vgaarb: device added: PCI:0000:01:08.0,decodes=3Dio+mem,ow=
ns=3Dio+mem,locks=3Dnone
[    0.242972] vgaarb: loaded
[    0.242972] vgaarb: bridge control possible 0000:01:08.0
[    0.243062] usbcore: registered new interface driver usbfs
[    0.244155] usbcore: registered new interface driver hub
[    0.245050] usbcore: registered new device driver usb
[    0.246057] PCI: Using ACPI for IRQ routing
[    0.246971] PCI: pci_cache_line_size set to 64 bytes
[    0.247121] reserve RAM buffer: 000000000009d000 - 000000000009ffff=20
[    0.247971] reserve RAM buffer: 000000007fff0000 - 000000007fffffff=20
[    0.247971] reserve RAM buffer: 00000000cfef0000 - 00000000cfffffff=20
[    0.247971] reserve RAM buffer: 0000000144b55000 - 0000000147ffffff=20
[    0.248151] NetLabel: Initializing
[    0.248971] NetLabel:  domain hash size =3D 128
[    0.248971] NetLabel:  protocols =3D UNLABELED CIPSOv4
[    0.248971] NetLabel:  unlabeled traffic allowed by default
[    0.249326] Switching to clocksource xen
[    0.250970] Switched to NOHz mode on CPU #0
[    0.259090] Switched to NOHz mode on CPU #3
[    0.259630] Switched to NOHz mode on CPU #2
[    0.259859] Switched to NOHtype pnp registered
[    0.267231] pnp 00:00: [mem 0xffc00000-0xffffffff]
[    0.267237] pnp 00:00: [mem 0xfec00000-0xfec00fff]
[    0.267243] pnp 00:00: [mem 0xfee00000-0xfeefffff]
[    0.267249] pnp 00:00: [mem 0xfed00000-0xfed00fff]
[    0.267517] system 00:00: [mem 0xffc00000-0xffffffff] could not be res=
erved
[    0.267521] system 00:00: [mem 0xfec00000-0xfec00fff] could not be res=
erved
[    0.267526] system 00:00: [mem 0xfee00000-0xfeefffff] could not be res=
erved
[    0.267530] system 00:00: [mem 0xfed00000-0xfed00fff] has been reserve=
d
[    0.267537] system 00:00: Plug and Play ACPI device, IDs PNP0c01 (acti=
ve)
[    0.267721] pnp 00:01: [bus 00-ff]
[    0.267724] pnp 00:01: [io  0x0cf8-0x0cff]
[    0.267728] pnp 00:01: [io  0x0000-0x0cf7 window]
[    0.267731] pnp 00:01: [io  0x0d00-0xffff window]
[    0.267735] pnp 00:01: [mem 0x000a0000-0x000bffff window]
[    0.267739] pnp 00:01: [mem 0x000c0000-0x000dffff window]
[    0.267742] pnp 00:01: [mem 0xd0000000-0xfebfffff window]
[    0.267746] pnp 00:01: [mem 0xfed40000-0xfed8ffff]
[    0.268051] pnp 00:01: Plug and Play ACPI device, IDs PNP0a03 (active)
[    0.268130] pnp 00:02: [mem 0xe0000000-0xefffffff]
[    0.268381] system 00:02: [mem 0xe0000000-0xefffffff] has been reserve=
d
[    0.268388] system 00:02: Plug and Play ACPI device, IDs PNP0c02 (acti=
ve)
[    0.269212] pnp 00:03: [io  0x8000-0x807f]
[    0.269216] pnp 00:03: [io  0x8080-0x80ff]
[    0.269219] pnp 00:03: [io  0x8400-0x847f]
[    0.269222] pnp 00:03: [io  0x8480-0x84ff]
[    0.269225] pnp 00:03: [io  0x8800-0x887f]
[    0.269229] pnp 00:03: [io  0x8880-0x88ff]
[    0.269236] pnp 00:03: [io  0x2040-0x207f]
[    0.269239] pnp 00:03: [io  0x2000-0x203f]
[    0.269242] pnp 00:03: [io  0x0060]
[    0.269245] pnp 00:03: [io  0x0064]
[    0.269496] system 00:03: [io  0x8000-0x807f] has been reserved
[    0.269500] system 00:03: [io  0x8080-0x80ff] has been reserved
[    0.269504] system 00:03: [io  0x8400-0x847f] has been reserved
[    0.269508] system 00:03: [io  0x8480-0x84ff] has been reserved
[    0.269512] system 00:03: [io  0x8800-0x887f] has been reserved
[    0.269516] system 00:03: [io  0x8880-0x88ff] has been reserved
[    0.269519] system 00:03: [io  0x2040-0x207f] has been reserved
[    0.269523] system 00:03: [io  0x2000-0x203f] has been reserved
[    0.269530] system 00:03: Plug and Play ACPI device, IDs PNP0c02 (acti=
ve)
[    0.269728] pnp 00:04: [irq 0 disabled]
[    0.269733] xen: registering gsi 8 triggering 1 polarity 0
[    0.269741] xen_map_pirq_gsi: returning irq 8 for gsi 8
[    0.269744] xen: --> pirq=3D8 -> irq=3D8 (gsi=3D8)
[    0.269752] pnp 00:04: [irq 8]
[    0.269755] pnp 00:04: [mem 0xfed00000-0xfed003ff]
[    0.269951] pnp 00:04: Plug and Play ACPI device, IDs PNP0103 (active)
[    0.270004] pnp 00:05: [io  0x0010-0x001f]
[    0.270007] pnp 00:05: [io  0x0022-0x003f]
[    0.270010] pnp 00:05: [io  0x0044-0x005f]
[    0.270019] pnp 00:05: [io  0x0062-0x0063]
[    0.270022] pnp 00:05: [io  0x0065-0x006f]
[    0.270025] pnp 00:05: [io  0x0072-0x0073]
[    0.270031] pnp 00:05: [io  0x0074-0x007f]
[    0.270034] pnp 00:05: [io  0x0091-0x0093]
[    0.270037] pnp 00:05: [io  0x0097-0x009f]
[    0.270044] pnp 00:05: [io  0x00a2-0x00bf]
[    0.270048] pnp 00:05: [io  0x00e0-0x00ef]
[    0.270068] pnp 00:05: [io  0x04d0-0x04d1]
[    0.270321] system 00:05: [io  0x04d0-0x04d1] has been reserved
[    0.270328] system 00:05: Plug and Play ACPI device, IDs PNP0c02 (acti=
ve)
[    0.270390] pnp 00:06: [io  0x0000-0x0008]
[    0.270394] pnp 00:06: [io  0x000a-0x000f]
[    0.270397] pnp 00:06: [io  0x0081-0x0083]
[    0.270400] pnp 00:06: [io  0x0087]
[    0.270406] pnp 00:06: [io  0x0089-0x008b]
[    0.270409] pnp 00:06: [io  0x008f]
[    0.270412] pnp 00:06: [io  0x00c0-0x00d1]
[    0.270419] pnp 00:06: [io  0x00d4-0x00df]
[    0.270423] pnp 00:06: [dma 4]
[    0.270613] pnp 00:06: Plug and Play ACPI device, IDs PNP0200 (active)
[    0.270643] pnp 00:07: [io  0x0061]
[    0.270849] pnp 00:07: Plug and Play ACPI device, IDs PNP0800 (active)
[    0.270946] pnp 00:08: [io  0x0070-0x0071]
[    0.271325] pnp 00:08: Plug and Play ACPI device, IDs PNP0b00 (active)
[    0.271361] pnp 00:09: [io  0x00f0-0x00f1]
[    0.271364] xen: registering gsi 13 triggering 1 polarity 0
[    0.271369] xen_map_pirq_gsi: returning irq 13 for gsi 13
[    0.271373] xen: --> pirq=3D13 -> irq=3D13 (gsi=3D13)
[    0.271378] pnp 00:09: [irq 13]
[    0.271581] pnp 00:09: Plug and Play ACPI device, IDs PNP0c04 (active)
[    0.271614] pnp 00:0a: [io  0x0c00-0x0c7f]
[    0.271887] system 00:0a: [io  0x0c00-0x0c7f] has been reserved
[    0.271894] system 00:0a: Plug and Play ACPI device, IDs PNP0c02 (acti=
ve)
[    0.272469] pnp 00:0b: [io  0x03f8-0x03ff]
[    0.272473] xen: registering gsi 4 triggering 1 polarity 0
[    0.272478] xen_map_pirq_gsi: returning irq 4 for gsi 4
[    0.272481] xen: --> pirq=3D4 -> irq=3D4 (gsi=3D4)
[    0.272488] Already setup the GSI :4
[    0.272491] pnp 00:0b: [irq 4]
[    0.272751] pnp 00:0b: Plug and Play ACPI device, IDs PNP0501 (active)
[    0.274118] pnp: PnP ACPI: found 12 devices
[    0.274121] ACPI: ACPI bus type pnp unregistered
[    0.276262] pciback 0000:05:00.0: seizing device
[    0.276356] pciback 0000:05:00.1: seizing device
[    0.290015] PM-Timer failed consistency check  (0x0xffffff) - aborting=
.
[    0.290106] PCI: max bus depth: 1 pci_try_num: 2
[    0.290195] pci 0000:00:0e.0: BAR 15: assigned [mem 0xd0400000-0xd04ff=
fff pref]
[    0.290202] pci 0000:01:07.0: BAR 6: assigned [mem 0xd0120000-0xd013ff=
ff pref]
[    0.290207] pci 0000:01:08.0: BAR 6: assigned [mem 0xd0140000-0xd015ff=
ff pref]
[    0.290211] pci 0000:00:09.0: PCI bridge to [bus 01-01]
[    0.290218] pci 0000:00:09.0:   bridge window [io  0x3000-0x3fff]
[    0.290229] pci 0000:00:09.0:   bridge window [mem 0xd0100000-0xd01fff=
ff]
[    0.290237] pci 0000:00:09.0:   bridge window [mem 0xd8000000-0xdfffff=
ff pref]
[    0.290251] pci 0000:00:0b.0: PCI bridge to [bus 02-02]
[    0.290262] pci 0000:00:0b.0:   bridge window [mem 0xd0200000-0xd02fff=
ff]
[    0.290280] pci 0000:00:0c.0: PCI bridge to [bus 03-03]
[    0.290305] pci 0000:00:0d.0: PCI bridge to [bus 04-04]
[    0.290333] pciback 0000:05:00.0: BAR 6: assigned [mem 0xd0400000-0xd0=
41ffff pref]
[    0.290337] pciback 0000:05:00.1: BAR 6: assigned [mem 0xd0420000-0xd0=
43ffff pref]
[    0.290341] pci 0000:00:0e.0: PCI bridge to [bus 05-05]
[    0.290347] pci 0000:00:0e.0:   bridge window [io  0x4000-0x4fff]
[    0.290358] pci 0000:00:0e.0:   bridge window [mem 0xd0300000-0xd03fff=
ff]
[    0.290374] pci 0000:00:0e.0:   bridge window [mem 0xd0400000-0xd04fff=
ff pref]
[    0.290403] pci 0000:00:09.0: setting latency timer to 64
[    0.290423] pci 0000:00:0b.0: setting latency timer to 64
[    0.290443] pci 0000:00:0c.0: setting latency timer to 64
[    0.290462] pci 0000:00:0d.0: setting latency timer to 64
[    0.290482] pci 0000:00:0e.0: setting latency timer to 64
[    0.290489] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7]
[    0.290492] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff]
[    0.290496] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff]
[    0.290500] pci_bus 0000:00: resource 7 [mem 0x000c0000-0x000dffff]
[    0.290504] pci_bus 0000:00: resource 8 [mem 0xd0000000-0xfebfffff]
[    0.290507] pci_bus 0000:00: resource 9 [mem 0xfed40000-0xfed8ffff]
[    0.290511] pci_bus 0000:01: resource 0 [io  0x3000-0x3fff]
[    0.290515] pci_bus 0000:01: resource 1 [mem 0xd0100000-0xd01fffff]
[    0.290518] pci_bus 0000:01: resource 2 [mem 0xd8000000-0xdfffffff pre=
f]
[    0.290522] pci_bus 0000:02: resource 1 [mem 0xd0200000-0xd02fffff]
[    0.290526] pci_bus 0000:05: resource 0 [io  0x4000-0x4fff]
[    0.290530] pci_bus 0000:05: resource 1 [mem 0xd0300000-0xd03fffff]
[    0.290534] pci_bus 0000:05: resource 2 [mem 0xd0400000-0xd04fffff pre=
f]
[    0.290613] NET: Registered protocol family 2
[    0.293036] IP route cache hash table entries: 262144 (order: 9, 20971=
52 bytes)
[    0.302728] TCP established hash table entries: 524288 (order: 11, 838=
8608 bytes)
[    0.308160] TCP bind hash table entries: 65536 (order: 8, 1048576 byte=
s)
[    0.308588] TCP: Hash tables configured (established 524288 bind 65536=
)
[    0.308593] TCP reno registered
[    0.308683] UDP hash table entries: 4096 (order: 5, 131072 bytes)
[    0.308831] UDP-Lite hash table entries: 4096 (order: 5, 131072 bytes)
[    0.309110] NET: Registered protocol family 1
[    0.309525] RPC: Registered named UNIX socket transport module.
[    0.309528] RPC: Registered udp transport module.
[    0.309532] RPC: Registered tcp transport module.
[    0.309535] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    1.053320] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.054059] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.054059] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.054059] pci 0000:00:0b.0: Found disabled HT MSI Mapping
[    1.054059] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.054059] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.054059] pci 0000:00:0c.0: Found disabled HT MSI Mapping
[    1.054059] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.054059] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.054059] pci 0000:00:0d.0: Found disabled HT MSI Mapping
[    1.054059] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.054059] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.054059] pci 0000:00:0e.0: Found disabled HT MSI Mapping
[    1.054059] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.054059] pci 0000:01:08.0: Boot video device
[    1.054059] PCI: CLS 64 bytes, default 64
[    1.140558] Trying to unpack rootfs image as initramfs...
[    1.886287] Freeing initrd memory: 238644k freed
[    2.007040] DMA-API: preallocated 32768 debug entries
[    2.007058] DMA-API: debugging enabled by kernel config
[    2.017868] Simple Boot Flag at 0x62 set to 0x1
[    2.025557] Machine check injector initialized
[    2.031995] microcode: CPU0: patch_level=3D0x01000065
[    2.036856] microcode: CPU1: patch_level=3D0x01000065
[    2.041793] microcode: CPU2: patch_level=3D0x01000065
[    2.046715] microcode: CPU3: patch_level=3D0x01000065
[    2.051782] microcode: Microcode Update Driver: v2.00 <tigran@aivazian=
.fsnet.co.uk>, Peter Oruba
[    2.061663] audit: initializing netlink socket (disabled)
[    2.067069] type=3D2000 audit(1319591165.549:1): initialized
[    2.099318] HugeTLB registered 2 MB page size, pre-allocated 0 pages
[    2.117959] VFS: Disk quotas dquot_6.5.2
[    2.122491] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    2.olarity 1
[    2.241744] xen: --> pirq=3D19 -> irq=3D19 (gsi=3D19)
[    2.246450] pciback 0000:05:00.1: PCI INT B -> Link[LNK4] -> GSI 19 (l=
evel, low) -> IRQ 19
[    2.247294] pciback 0000:05:00.1: PCI INT B disabled
[    2.260541] ACPI: PCI Interrupt Link [LNK3] enabled at IRQ 18
[    2.261056] xen: registering gsi 18 triggering 0 polarity 1
[    2.271896] xen: --> pirq=3D18 -> irq=3D18 (gsi=3D18)
[    2.276615] pciback 0000:05:00.0: PCI INT A -> Link[LNK3] -> GSI 18 (l=
evel, low) -> IRQ 18
[    2.277465] pciback 0000:05:00.0: PCI INT A disabled
[    2.289964] xen-pciback: backend is vpci
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.3 2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.3] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled
[    2.382984] console [hvc0] enabled

--C7zPtVaVf+AK4Oqc
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="good.log"
Content-Transfer-Encoding: quoted-printable

PXELINUX 3.82 2009-06-09  Copyright (C) 1994-2009 H. Peter Anvin et al
Loading latest/xen.gz... ok
Loading latest/vmlinuz... ok
Loading latest/initramfs.cpio.gz... ok
 __  __            _  _    _    _ _ _  ___ ____   __  =20
 \ \/ /___ _ __   | || |  / |  / / / |/ _ \___ \ / /_ =20
  \  // _ \ '_ \  | || |_ | |__| | | | | | |__) | '_ \=20
  /  \  __/ | | | |__   _|| |__| | | | |_| / __/| (_) |
 /_/\_\___|_| |_|    |_|(_)_|  |_|_|_|\___/_____|\___/=20
                                                      =20
(XEN) Xen version 4.1-111027 (konrad@dumpdata.com) (gcc version 4.4.4 20100=
503 (Red Hat 4.4.4-2) (GCC) ) Thu Oct 27 01:12:39 EDT 2011
(XEN) Latest ChangeSet: Wed Oct 12 10:00:10 2011 -0400 23160:3660ad2b187f
(XEN) Console output is synchronous.
(XEN) Bootloader: unknown
(XEN) Command line: com1=3D115200,8n1 console=3Dcom1,vga guest_loglvl=3Dall=
 sync_console loglvl=3Dall apic=3Ddebug
(XEN) Video information:
(XEN)  VGA is text mode 80x25, font 8x16
(XEN)  VBE/DDC methods: none; EDID transfer time: 2 seconds
(XEN)  EDID info not retrieved because no DDC retrieval method detected
(XEN) Disc information:
(XEN)  Found 0 MBR signatures
(XEN)  Found 0 EDD information structures
(XEN) Xen-e820 RAM map:
(XEN)  0000000000000000 - 000000000009d800 (usable)
(XEN)  000000000009d800 - 00000000000a0000 (reserved)
(XEN)  00000000000cc000 - 0000000000100000 (reserved)
(XEN)  0000000000100000 - 000000007fff0000 (usable)
(XEN)  000000007fff0000 - 0000000080000000 (reserved)
(XEN)  0000000080000000 - 00000000cfef0000 (usable)
(XEN)  00000000cfef0000 - 00000000cfef5000 (ACPI data)
(XEN)  00000000cfef5000 - 00000000cff7f000 (ACPI NVS)
(XEN)  00000000cff80000 - 00000000d0000000 (reserved)
(XEN)  00000000e0000000 - 00000000f0000000 (reserved)
(XEN)  00000000fec00000 - 00000000fec10000 (reserved)
(XEN)  00000000fee00000 - 00000000fee01000 (reserved)
(XEN)  00000000fff80000 - 0000000100000000 (reserved)
(XEN)  0000000100000000 - 0000000130000000 (usable)
(XEN) ACPI: RSDP 000F79B0, 0024 (r2 PTLTD )
(XEN) ACPI: XSDT CFEF0753, 009C (r1 DELL   PE_SC3    6040000 DELL        0)
(XEN) ACPI: FACP CFEF3C5F, 00F4 (r3 DELL   PE_SC3    6040000 DELL    F4240)
(XEN) ACPI: DSDT CFEF07EF, 33FC (r1 DELL   PE_SC3    6040000 MSFT  100000E)
(XEN) ACPI: FACS CFEF5FC0, 0040
(XEN) ACPI: TCPA CFEF3D53, 0032 (r1 Phoeni  x        6040000  TL         0)
(XEN) ACPI: SLIC CFEF3D85, 0024 (r1 DELL   PE_SC3    6040000 PTL         1)
(XEN) ACPI: SPCR CFEF3DA9, 0050 (r1 DELL   PE_SC3    6040000 PTL         1)
(XEN) ACPI: EINJ CFEF3DF9, 01B0 (r1 PTL    WHEAPTL   6040000 PTL         1)
(XEN) ACPI: HEST CFEF3FA9, 00A8 (r1 PTL    WHEAPTL   6040000 PTL         1)
(XEN) ACPI: BERT CFEF4051, 0030 (r1 PTL    WHEAPTL   6040000 PTL         1)
(XEN) ACPI: SSDT CFEF4081, 00E1 (r1 wheaos  wheaosc  6040000 INTL 20050624)
(XEN) ACPI: ERST CFEF4162, 0270 (r1 PTL    WHEAPTL   6040000 PTL         1)
(XEN) ACPI: SRAT CFEF43D2, 00E8 (r1 AMD    HAMMER    6040000 AMD         1)
(XEN) ACPI: SSDT CFEF44BA, 0A30 (r1 AMD    POWERNOW  6040000 AMD         1)
(XEN) ACPI: MCFG CFEF4EEA, 003C (r1 PTLTD    MCFG    6040000  LTP        0)
(XEN) ACPI: HPET CFEF4F26, 0038 (r1 PTLTD  HPETTBL   6040000  LTP        1)
(XEN) ACPI: APIC CFEF4F5E, 007A (r1 PTLTD  	 APIC    6040000  LTP        0)
(XEN) ACPI: BOOT CFEF4FD8, 0028 (r1 PTLTD  $SBFTBL$  6040000  LTP        1)
(XEN) System RAM: 4094MB (4192756kB)
(XEN) SRAT: PXM 0 -> APIC 0 -> Node 0
(XEN) SRAT: PXM 0 -> APIC 1 -> Node 0
(XEN) SRAT: PXM 0 -> APIC 2 -> Node 0
(XEN) SRAT: PXM 0 -> APIC 3 -> Node 0
(XEN) SRAT: Node 0 PXM 0 0-a0000
(XEN) SRAT: Node 0 PXM 0 100000-d0000000
(XEN) SRAT: Node 0 PXM 0 100000000-130000000
(XEN) NUMA: Allocated memnodemap from 120149000 - 12014b000
(XEN) NUMA: Using 8 for the hash shift.
(XEN) Domain heap initialised
(XEN) found SMP MP-table at 000f7a70
(XEN) DMI present.
(XEN) Using APIC driver default
(XEN) 0]
(XEN) ACPI:                  wakeup_vec[cfef5fcc], vec_size[20]
(XEN) ACPI: Local APIC address 0xfee00000
(XEN) ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
(XEN) Processor #0 0:2 APIC version 16
(XEN) ACPI: LAPIC (acpi_id[0x01] lapic_id[0x01] enabled)
(XEN) Processor #1 0:2 APIC version 16
(XEN) ACPI: LAPIC (acpi_id[0x02] lapic_id[0x02] enabled)
(XEN) Processor #2 0:2 APIC version 16
(XEN) ACPI: LAPIC (acpi_id[0x03] lapic_id[0x03] enabled)
(XEN) Processor #3 0:2 APIC version 16
(XEN) ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
(XEN) ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
(XEN) ACPI: IOAPIC (id[0x04] address[0xfec00000] gsi_base[0])
(XEN) IOAPIC[0]: apic_id 4, version 17, address 0xfec00000, GSI 0-23
(XEN) ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high edge)
(XEN) ACPI: IRQ0 used by override.
(XEN) ACPI: IRQ2 used by override.
(XEN) Enabling APIC mode:  Flat.  Using 1 I/O APICs
(XEN) ACPI: HPET id: 0x10de8201 base: 0xfed00000
(XEN) PCI: MCFG configuration 0: base e0000000 segment 0 buses 0 - 4
(XEN) PCI: MCFG area at e0000000 reserved in E820
(XEN) ERST table is invalid
(XEN) Using ACPI (MADT) for SMP configuration information
(XEN) IRQ limits: 24 GSI, 760 MSI/MSI-X
(XEN) Using scheduler: SMP Credit Scheduler (credit)
(XEN) Detected 2109.726 MHz processor.
(XEN) Initing memory sharing.
(XEN) AMD Fam10h machine check reporting enabled
(XEN) Anot found!
(XEN) I/O virtualisation disabled
(XEN) ENABLING IO-APIC IRQs
(XEN)  -> Using new ACK method
(XEN) ..TIMER: vector=3D0xF0 apic1=3D0 pin1=3D2 apic2=3D-1 pin2=3D-1
(XEN) Platform timer is 25.000MHz HPET
=FF(XEN) Allocated console ring of 32 KiB.
(XEN) HVM: ASIDs enabled.
(XEN) SVM: Support Tables (NPT)
(XEN)  - Last Branch Record (LBR) Virtualisation
(XEN) HVM: SVM enabled
(XEN) HVM: Hardware Assisted Paging detected.
(XEN) Brought up 4 CPUs
(XEN) HPET: 3 timers in total, 0 timers will be used for broadcast
(XEN) ACPI sleep modes: S3
(XEN) MCA: Use hw thresholding tachine check polling timer started.
(XEN) *** LOADING DOMAIN 0 ***
(XEN)  Xen  kernel: 64-bit, lsb, compat32
(XEN)  Dom0 kernel: 64-bit, PAE, lsb, paddr 0x1000000 -> 0x2030000
(XEN) PHYSICAL MEMORY ARRANGEMENT:
(XEN)  Dom0 alloc.:   0000000118000000->000000011c000000 (926259 pages to b=
e allocated)
(XEN)  Init. ramdisk: 00000001216df000->000000012ffffc00
(XEN) VIRTUAL MEMORY ARRANGEMENT:
(XEN)  Loaded kernel: ffffffff81000000->ffffffff82030000
(XEN)  Init. ramdisk: ffffffff82030000->ffffffff90950c00
(XEN)  Phys-Mach map: ftack:    ffffffff91185000->ffffffff91186000
(XEN)  TOTAL:         ffffffff80000000->ffffffff91400000
(XEN)  ENTRY ADDRESS: ffffffff81aec200
(XEN) Dom0 has maximum 4 VCPUs
(XEN) Scrubbing Free RAM: .done.
(XEN) Xen trace buffers: disabled
(XEN) Std. Loglevel: All
(XEN) Guest Loglevel: All
(XEN) **********************************************
(XEN) ******* WARNING: CONSOLE OUTPUT IS SYNCHRONOUS
(XEN) ******* This option is intended to aid debugging of Xen by ensuring
(XEN) ******* that all output is synchronously delivered on the serial line.
(XEN) ******* However it can introduce SIGNIFICANT latencies and affect
(XEN) ******* timekeeping. It is NOT recommended for production use!
(XEN) **********************************************
(XEN) 3... 2... 1...=20
(XEN) Xen is relinquishing VGA console.
(XEN) *** Serial input -> DOM0 (type 'CTRL-a' three times to switch input t=
o Xen)
(XEN) Freed 224kB init memory.
mapping kernel into physical memory
Xen: setup ISA identity maps
about to get started...
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.@phenom.dumpdata.com) (gcc version 4.4.4 201=
00503 (Red Hat 4.4.4-2) (GCC) ) #1 SMP PREEMPT Thu Oct 27 01:12:30 EDT 2011
[    0.000000] Command line: earlyprintk=3Dxenboot debug selinux=3D0 consol=
e=3Dtty console=3Dhvc0 xen-pciback.hide=3D(05:00.0)(05:00.1) loglevel=3D10
[    0.000000] Freeing  9d-100 pfn range: 99 pages freed
[    0.000000] Freeing  7fff0-80000 pfn range: 16 pages freed
[    0.000000] Freeing  cfef0-f4b54 pfn range: 150628 pages freed
[    0.000000] Released 150743 pages of unused memory
[    0.000000] Set 196995 page(s) to 1-1 mapping
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  Xen: 0000000000000000 - 000000000009d000 (usable)
[    0.000000]  Xen: 000000000009d800 - 0000000000100000 (reserved)
[    0.000000]  Xen: 0000000000100000 - 000000007fff0000 (usable)
[    0.000000]  Xen: 000000007fff0000 - 0000000080000000 (reserved)
[    0.000000]  Xen: 0000000080000000 - 00000000cfef0000 (usable)
[    0.000000]  Xen: 00000000cfef0000 - 00000000cfef5000 (ACPI data)
[    0.000000]  Xen: 00000000cfef5000 - 00000000cff7f000 (ACPI NVS)
[    0.000000]  Xen: 00000000cff80000 - 00000000d0000000 (reserved)
[    0.000000]  Xen: 00000000e0000000 - 00000000f0000000 (reserved)
[    0.000000]  Xen: 00000000fec00000 - 00000000fec10000 (reserved)
[    0.000000]  Xen: 00000000fee00000 - 00000000fee01000 (reserved)
[    0.000000]  Xen: 00000000fff80000 - 0000000100000000 (reserved)
[    0.000000]  Xen: 0000000100000000 - 0000000130000000 (usable)
[    0.000000] bootconsole [xenboot0] enabled
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] DMI present.
[    0.000000] DMI: Dell Inc. PowerEdge T105 /0RR825, BIOS 1.3.2 08/20/2008
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usab=
le) =3D=3D> (reserved)
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (usab=
le)
[    0.000000] No AGP bridge found
[    0.000000] last_pfn =3D 0x130000 max_arch_pfn =3D 0x400000000
[    0.000000] last_pfn =3D 0xcfef0 max_arch_pfn =3D 0x400000000
[    0.000000] found SMP MP-table at [ffff8800000f7a70] f7a70
[    0.000000] initial memory mapped : 0 - 10951000
[    0.000000] Base memory trampoline at [ffff880000098000] 98000 size 20480
[    0.000000] init_memory_mapping: 0000000000000000-00000000cfef0000
[    0.000000]  0000000000 - 00cfef0000 page 4k
[    0.000000] kernel direct mapping tables up to cfef0000 @ 97b000-1000000
[    0.000000] xen: setting RW the range f70000 - 1000000
[    0.000000] init_memory_mapping: 0000000100000000-0000000130000000
[    0.000000]  0100000000 - 0130000000 page 4k
[    0.000000] kernel direct mapping tables up to 130000000 @ cf56a000-cfef=
0000
[    0.000000] xen: setting RW the range cf6eb000 - cfef0000
[    0.000000] RAMDISK: 02030000 - 10951000
[    0.000000] ACPI: 01 DELL   PE_SC3   06040000 MSFT 0100000E)
[    0.000000] ACPI: FACS 00000000cfef5fc0 00040
[    0.000000] ACPI: TCPA 00000000cfef3d53 00032 (v01 Phoeni  x       06040=
000  TL  00000000)
[    0.000000] ACPI: SLIC 00000000cfef3d85 00024 (v01 DELL   PE_SC3   06040=
000 PTL  00000001)
[    0.000000] ACPI: SPCR 00000000cfef3da9 00050 (v01 DELL   PE_SC3   06040=
000 PTL  00000001)
[    0.000000] ACPI: EINJ 00000000cfef3df9 001B0 (v01 PTL    WHEAPTL  06040=
000 PTL  00000001)
[    0.000000] ACPI: HEST 00000000cfef3fa9 000A8 (v01 PTL    WHEAPTL  06040=
000 PTL  00000001)
[    0.000000] ACPI: BERT 00000000cfef4051 00030 (v01 PTL    WHEAPTL  06040=
000 PTL  00000001)
[    0.000000] ACPI: SSDT 00000000cfef4081 000E1 (v01 wheaos  wheaosc 06040=
000 INTL 20050624)
[    0.000000] ACPI: ERST 00000000cfef4162 00270 (v01 PTL    WHEAPTL  06040=
000 PTL  00000001)
[    0.000000] ACPI: SRAT 00000000cfef43d2 000E8 (v01 AMD    HAMMER   06040=
000 AMD  00000001)
[    0.000000] ACPI: SSDT 00000000cfef44ba 00A30 (v01 AMD    POWERNOW 06040=
000 AMD  00000001)
[    0.000000] ACPI: MCFG 00000000cfef4eea 0003C (v01 PTLTD    MCFG   06040=
000  LTP 00000000)
[    0.000000] ACPI: HPET 00000000cfef4f26 00038 (v01 PTLTD  HPETTBL  06040=
000  LTP 00000001)
[    0.000000] ACPI: APIC 00000000cfef4f5e 0007A (v01 PTLTD  ? APIC   06040=
000  LTP 00000000)
[    0.000000] ACPI: BOOT 00000000cfef4fd8 00028 (v01 PTLTD  $SBFTBL$ 06040=
000  LTP 00000001)
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] Scanning NUMA topology in Northbridge 24
[    0.000000] No NUMA configuration found
[    0.000000] Faking a node at 0000000000000000-0000000130000000
[    0.000000] Initmem setup node 0 0000000000000000-0000000130000000
[    0.000000]   NODE_DATA [00000000cfec9000 - 00000000cfeeffff]
[    0.000000] Zone PFN ranges:
[    0.000000]   DMA      0x00000010 -> 0x00001000
[    0.000000]   DMA32    0x00001000 -> 0x00100000
[    0.000000]   Normal   0x00100000 -> 0x00130000
[    0.000000] Movable zone start PFN for each node
[    0.000000] early_node_map[4] active PFN ranges
[    0.000000]     0: 0x00000010 -> 0x0000009d
[    0.000000]     0: 0x00000100 -> 0x0007fff0
[    0.000000]     0: 0x00080000 -> 0x000cfef0
[    0.000000]     0: 0x00100000 -> 0x00130000
[    0.000000] On node 0 totalpages: 1048173
[    0.000000]   DMA zone: 64 pages used for memmap
[    0.000000]   DMA zone: 1530 pages reserved
[    0.000000]   DMA zone: 2387 pages, LIFO batch:0
[    0.000000]   DMA32 zone: 16320 pages used for memmap
[    0.000000]   DMA32 zone: 831264 pages, LIFO batch:31
[    0.000000]   Normal zone: 3072 pages used for memmap
[    0.000000]   Normal zone: 193536 pages, LIFO batch:31
[    0.000000] ACPI: PM-Timer IO Port: 0x8008
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] ACPI: LAPIC (a lapic_id[0x01] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x02] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x03] enabled)
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
[    0.000000] ACPI: IOAPIC (id[0x04] address[0xfec00000] gsi_base[0])
[    0.000000] IOAPIC[0]: apic_id 4, version 255, address 0xfec00000, GSI 0=
-255
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high edge)
[    0.000000] ACPI: IRQ0 used by override.
[    0.000000] ACPI: IRQ2 used by override.
[    0.000000] ACPI: IRQ9 used by override.
[    0.000000] Using ACPI (MADT) for SMP configuration information
[    0.000000] ACPI: HPET id: 0x10de8201 base: 0xfed00000
[    0.000000] SMP: Allowing 4 CPUs, 0 hotplug CPUs
[    0.000000] nr_irqs_gsi: 272
[    0.000000] PM: Registered nosave memory: 000000000009d000 - 00000000000=
9e000
[    0.000000] PM: Registered nosave memory: 000000000009e000 - 00000000001=
00000
[    0.000000] PM: Registered nosave memory: 000000007fff0000 - 00000000800=
00000
[    0.000000] PM: Registered nosave memory: 00000000cfef0000 - 00000000cfe=
f5000
[    0.000000] PM: Registered nosave memory: 00000000cfef5000 - 00000000cff=
7f000
[    0.000000] PM: Registered nosave memory: 00000000cff7f000 - 00000000cff=
80000
[    0.000000] PM: Registered nosave memory: 00000000cff80000 - 00000000d00=
00000
[    0.000000] PM: Registered nosave memory: 00000000d0000000 - 00000000e00=
00000
[    0.000000] PM: Registered nosave memory: 00000000e0000000 - 00000000f00=
00000
[    0.000000] PM: Registered nosave memory: 00000000f0000000 - 00000000fec=
00000
[    0.000000] PM: Registered nosave memory: 00000000fec00000 - 00000000fec=
10000
[    0.000000] PM: Registered nosave memory: 00000000fec10000 - 00000000fee=
00000
[    0.000000] PM: Registered nosave memory: 00000000fee00000 - 00000000fee=
01000
[    0.000000] PM: Registered nosave memory: 00000000fee01000 - 00000000fff=
80000
[    0.000000] PM: Registered nosave memory: 00000000fff80000 - 00000001000=
00000
[    0.000000] Allocating PCI resources starting at d0000000 (gap: d0000000=
:10000000)
[    0.000000] Booting paravirtualized kernel on Xen
[    0.000000] Xen version: 4.1-111027 (preserve-AD)
[    0.000000] setup_percpu: NR_CPUS:4096 nr_cpumask_bits:4 nr_cpu_ids:4 nr=
_node_ids:1
[    0.000000] PERCPU: Embedded 28 pages/cpu @ffff8800cfe33000 s82944 r8192=
 d23552 u114688
[    0.000000] pcpu-alloc: s82944 r8192 d23552 u114688 alloc=3D28*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3=20
[    0.000000] Built 1 zonelists in Node order, mobility grouping on.  Tota=
l pages: 1027187
[    0.000000] Policy zone: Normal
[    0.000000] Kernel command line: earlyprintk=3Dxenboot debug selinux=3D0=
 console=3Dtty console=3Dhvc0 xen-pciback.hide=3D(05:00.0)(05:00.1) logleve=
l=3D10
[    0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)
[    0.000000] Placing 64MB software IO TLB between ffff8800c7000000 - ffff=
8800cb000000
[    0.000000] software IO TLB at phys 0xc7000000 - 0xcb000000
[    0.000000] Memory: 3003628k/4980736k available (6394k kernel code, 7880=
44k absent, 1189064k reserved, 4700k data, 2452k init00000] NR_IRQS:262400 =
nr_irqs:1024 16
[    0.000000] xen: sci override: global_irq=3D9 trigger=3D0 polarity=3D1
[    0.000000] xen: registering gsi 9 triggering 0 polarity 1
[    0.000000] xen: --> pirq=3D9 -> irq=3D9 (gsi=3D9)
[    0.000000] xen: acpi sci 9
[    0.000000] xen: --> pirq=3D1 -> irq=3D1 (gsi=3D1)
[    0.000000] xen: --> pirq=3D2 -> irq=3D2 (gsi=3D2)
[    0.000000] xen: --> pirq=3D3 -> irq=3D3 (gsi=3D3)
[    0.000000] xen: --> pirq=3D4 -> irq=3D4 (gsi=3D4)
[    0.000000] xen: --> pirq=3D5 -> irq=3D5 (gsi=3D5)
[    0.000000] xen: --> pirq=3D6 -> irq=3D6 (gsi=3D6)
[    0.000000] xen: --> pirq=3D7 -> irq=3D7 (gsi=3D7)
[    0.000000] xen: --> pirq=3D8 -> irq=3D8 (gsi=3D8)
[    0.000000] xen_map_pirq_gsi: returning irq 9 for gsi 9
[    0.000000] xen: --> pirq=3D9 -> irq=3D9 (gsi=3D9)
[    0.000000] xen: --> pirq=3D10 -> irq=3D10 (gsi=3D10)
[    0.000000] xen: --> pirq=3D11 -> irq=3D11 (gsi=3D11)
[    0.000000] xen: --> pirq=3D12 -> irq=3D12 (gsi=3D12)
[    0.000000] xen: --> pirq=3D13 -> irq=3D13 (gsi=3D13)
[    0.000000] xen: --> pirq=3D14 -> irq=3D14 (gsi=3D14)
[    0.000000] xen: --> pirq=3D15 -> irq=3D15 (gsi=3D15)
[    0.000000] kmemleak: Early log buffer exceeded, please increase DEBUG_K=
MEMLEAK_EARLY_LOG_SIZE
[    0.000000] kmemleak: Kernel memory leak detector disabled
[    0.000000] Console: colour VGA+ 80x25
[    0.000000] console [tty0] enabled
[    0.000000] console [hvc0] enabled, bootconsole disabled
[    0.000000] console [hvc.000999] pid_max: default: 32768 minimum: 301
[    0.001050] Security Framework initialized
[    0.001999] SELinux:  Disabled at boot.
[    0.004283] Dentry cache hash table entries: 524288 (order: 10, 4194304 =
bytes)
[    0.007676] Inode-cache hash table entries: 262144 (order: 9, 2097152 by=
tes)
[    0.008723] Mount-cache hash table entries: 256
[    0.009321] Initializing cgroup subsys cpuacct
[    0.010009] Initializing cgroup subsys freezer
[    0.011080] tseg: 00cff80000
[    0.012007] CPU: Physical Processor ID: 0
[    0.012998] CPU: Processor Core ID: 0
[    0.012998] using AMD E400 aware idle routine
[    0.014387] ACPI: Core revision 20110623
[    0.024615] ftrace: allocating 23091 entries in 91 pages
[    0.026131] cpu 0 spinlock event irq 273
[    0.027086] Performance Events: (XEN) traps.c:2432:d0 Domain attempted W=
RMSR 00[    0.036078] MCE: In-kernel MCE decoding enabled.
[    0.036997] NMI watchdog disabled (cpu0): hardware events not enabled
[    0.043021] installing Xen timer for CPU 1
[    0.044018] cpu 1 spinlock event irq 279
[    0.045187] NMI watchdog disabled (cpu1): hardware events not enabled
[    0.052018] installing Xen timer for CPU 2
[    0.053014] cpu 2 spinlock event irq 285
[    0.054158] NMI watchdog disablht up 4 CPUs
[    0.068286] PM: Registering ACPI NVS region at cfef5000 (565248 bytes)
[    0.069515] kworker/u:0 used greatest stack depth: 5288 bytes left
[    0.069515] Grant table initialized
[    0.069515] RTC time:  1:23:28, date: 10/26/11
[    0.069515] NET: Registered protocol family 16
[    0.088006] node 0 link 0: io port [1000, 4fff]
[    0.089135] node 0 link 0: io port [5000, fffff]
[    0.090002] TOM: 00000000d0000000 aka 3328M
[    0.091010] node 0 link 0: mmio [d0000000, d05fffff]
[    0.092125] node 0 link 0: mmio [fed00000, fed0ffff]
[    0.093000] node 0 link 0: mmio [d8000000, dfffffff]
[    0.094003] node 0 link 0: mmio [fec00000, fec0ffff]
[    0.095135] node 0 link 0: mmio [e0000000, efffffff]
[    0.096000] node 0 link 0: mmio [a0000, bffff]
[    0.096998] node 0 link 0: mmio [f0000000, fe0bffff]
[    0.097999] TOM2: 0000000130000000 aka 4864M
[    0.098991] bus: [00, ff] on node 0 link 0
[    0.098991] bus: 00 index 0 [io  0x0000-0xffff]
[    0.098991] bus: 00 index 1 [mem 0xd0000000-0xd7ffffff]
[    0.098991] bus: 00 index 2 [mem 0xfec10000-0xffffffff]
[    0.098991] bus: 00 index 3 [mem 0xd8000000-0xfebfffff]
[    0.098991] bus: 00 index 4 [mem 0xfec00000-0xfec0ffff]
[    0.098991] bus: 00 index 5 [mem 0x000a0000-0x000bffff]
[    0.098991] bus: 00 index 6 [mem 0x130000000-0xfcffffffff]
[    0.099138] Extended Config Space enabled on 1 nodes
[    0.100147] ACPI: bus type pci registered
[    0.101123] PCI: MMCONFIG for domain 0000 [bus 00-04] at [mem 0xe0000000=
-0xe04fffff] (base 0xe0000000)
[    0.101990] PCI: MMCONFIG at [mem 0xe0000000-0xe04fffff] reserved in E820
[    0.104173] PCI: Using configuration type 1 for base access
[    0.123096] bio: create slab <bio-0> at 0
[    0.124175] ACPI: Added _OSI(Module Device)
[    0.124988] ACPI: Added _OSI(
[    0.127148] ACPI: EC: Look up EC in DSDT
[    0.128975] \_SB_:_OSC evaluation returned wrong type
[    0.128987] _OSC req IOAPIC for interrupt routing
[    0.156655] ACPI: No dock devices found.
[    0.156984] PCI: Using host bridge windows from ACPI; if necessary, use =
"pci=3Dnoa bug
[    0.157303] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[    0.158278] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7]
[    0.158984] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff]
[    0.158984] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x00=
0bffff]
[    0.158984] pci_root PNP0A03:00: host bridge window [mem 0x000c0000-0x00=
0dffff]
[    0.158984] pci_root PNP0A03:00: host bridge window [mem 0xd0000000-0xfe=
bfffff]
[    0.158984] pci_root PNP0A03:00: host bridge window [mem 0xfed40000-0xfe=
d8ffff]
[    0.158984] pci 0000:00:00.0: [10de:005e] type 0 class 0x000580
[    0.159121] pci 0000:00:01.0: [10de:0051] type 0 class 0x000601
[    0.159983] pci 0000:00:01.0: reg 10: [io  0x8c00-0x8fff]
[    0.160009] pci 0000:00:01.1: [10de:0052] type 0 class 0x000c05
[    0.160983] pci 0000:00:01.1: reg 10: [io  0x2080-0x209f]
[    0.160983] pci 0000:00:01.1: reg 20: [io  0x2040-0x207f]
[    0.160983] pci 0000:00:01.1: reg 24: [io  0x2000-0x203f]
[    0.160983] pci 0000:00:01.1: PME# supported from D3hot D3cold
[    0.160983] pci 0000:00:01.1: PME# disabled
[    0.160983] pci 0000:00:02.0: [10de:005a] type 0 class 0x000c03
[    0.160983] pci 0000:00:02.0: reg 10: [mem 0xd0000000-0xd0000fff]
[    0.160983] pci 0000:00:02.0: supports D1 D2
[    0.160983] pci 0000:00:02.0: PME# supported from D0 D1 D2 D3hot D3cold
[    0.160983] pci 0000:00:02.0: PME# disabled
[    0.160983] pci 0000:00:02.1: [10de:005b] type 0 class 0x000c03
[    0.160983] pci 0000:00:02.1: reg 10: [mem 0xd0001000-0xd00010ff]
[    0.160983] pci 0000:00:02.1: supports D1 D2
[    0.160983] pci 0000:00:02.1: PME# supported from D0 D1 D2 D3hot D3cold
[    0.160983] pci 0000:00:02.1: PME# disabled
[    0.160983] pci 0000:00:07.0: [10de:0054] type 0 class 0x000101
[    0.160983] pci 0000:00:07.0: reg 10: [io  0x20f0-0x20f7]
[    0.160983] pci 0000:00:07.0: reg 14: [io  0x20e0-0x20e3]
[    0.160983] pci 0000:00:07.0: reg 18: [io  0x20d0-0x20d7]
[    0.160983] pci 0000:00:07.0: reg 1c: [io  0x20c0-0x20c3]
[    0.160983] pci 0000:00:07.0: reg 20: [io  0x20b0-0x20bf]
[    0.160983] pci 0000:00:07.0: reg 24: [mem 0xd0002000-0xd0002fff]
[    0.160983] pci 0000:00:08.0: [10de:0055] type 0 class 0x000101
[    0.160983] pci 0000:00:08.0: reg 10: [io  0x2440-0x2447]
[    0.160983] pci 0000:00:08.0: reg 14: [io  0x2430-0x2433]
[    0.160983] pci 0000:00:08.0: reg 18: [io  0x2420-0x2427]
[    0.160983] pci 0000:00:08.0: reg 1c: [io  0x2410-0x2413]
[    0.160983] pci 0000:00:08.0: reg 20: [io  0x2400-0x240f]
[    0.160983] pci 0000:00:08.0: reg 24: [mem 0xd0003000-0xd0003fff]
[    0.160983] pci 0000:00:09.0: [10de:005c] type 1 class 0x000604
[    0.160983] pci 0000:00:0b.0: [10de:005d] type 1 class 0x000604
[    0.160983] pci 0000:00:0b.0: PME# supported from D0 D1 D2 D3hot D3cold
[    0.160983] pci 0000:00:0b.0: PME# disabled
[    0.161149] pci 0000:00:0c.0: [10de:005d] type 1 class 0x000604
[    0.161983] pci 0000:00:0c.0: PME# supported from D0 D1 D2 D3hot D3cold
[    0.161983] pci 0000:00:0c.0: PME# disabled
[    0.161983] pci 0000:00:0d.0: [10de:005d1983] pci 0000:00:0d.0: PME# dis=
abled
[    0.161983] pci 0000:00:0e.0: [10de:005d] type 1 class 0x000604
[    0.161983] pci 0000:00:0e.0: PME# supported from D0 D1 D2 D3hot D3cold
[    0.161983] pci 0000:00:0e.0: PME# disabled
[    0.161983] pci 0000:00:18.0: [1022:1200] type 0 class 0x000600
[    0.161983] pci 0000:00:18.1: [1022:1201] type 0 class 0x000600
[    0.161983] pci 0000:00:18.2: [1022:1202] type 0 class 0x000600
[    0.161983] pci 0000:00:18.3: [1022:1203] type 0 class 0x000600
[    0.161983] pci 0000:00:18.4: [1022:1204] type 0 class 0x000600
[    0.162055] pci 0000:01:07.0: [1077:6312] type 0 class 0x000c04
[    0.162983] pci 0000:01:07.0: reg 10: [io  0x3000-0x30ff]
[    0.162983] pci 0000:01:07.0: reg 14: [mem 0xd0110000-0xd0110fff]
[    0.162983] pci 0000:01:07.0: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.162983] pci 0000:01:08.0: [1002:515e] type 0 class 0x000300
[    0.162983] pci 0000:01:08.0: reg 10: [mem 0xd8000000-0xdfffffff pref]
[    0.162983] pci 0000:01:08.0: reg 14: [io  0x3400-0x34ff]
[    0.162983] pci 0000:01:08.0: reg 18: [mem 0xd0100000-0xd010ffff]
[    0.162983] pci 0000:01:08.0: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.162983] pci 0000:01:08.0: supports D1 D2
[    0.162983] pci 0000:00:09.0: PCI bridge to [bus 01-01]
[    0.162983] pci 0000:00:09.0:   bridge window [io  0x3000-0x3fff]
[    0.162983] pci 0000:00:09.0:   bridge window [mem 0xd0100000-0xd01fffff]
[    0.162983] pci 0000:00:09.0:   bridge window [mem 0xd8000000-0xdfffffff=
 pref]
[    0.162983] pci 0000:02:00.0: [14e4:165a] type 0 class 0x000200
[    0.162983] pci 0000:02:00.0: reg 10: [mem 0xd0200000-0xd020ffff 64bit]
[    0.163180] pci 0000:02:00.0: PME# supported from D3hot D3cold
[    0.163983] pci 0000:02:00.0: PME# disabled
[    0.165017] pci 0000:00:0b.0: PCI bridge to [bus 02-02]
[    0.165983] pci 0000:00:0b.0:   bridge window [mem 0xd0200000-0xd02fffff]
[    0.165983] pci 0000:00:0c.0: PCI bridge to [bus 03-03]
[    0.165983] pci 0000:00:0d.0: PCI bridge to [bus 04-04]
[    0.165983] pci 0000:05:00.0: [8086:105e] type 0 class 0x000200
[    0.165983] pci 0000:05:00.0: reg 10: [mem 0xd0320000-0xd033ffff]
[    0.165983] pci 0000:05:00.0: reg 14: [mem 0xd0300000-0xd031ffff]
[    0.165983] pci 0000:05:00.0: reg 18: [io  0x4000-0x401f]
[    0.165983] pci 0000:05:00.0: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.165983] pci 0000:05:00.0: PME# supported from D0 D3hot D3cold
[    0.165983] pci 0000:05:00.0: PME# disabled
[    0.165983] pci 0000:05:00.1: [8086:105e] type 0 class 0x000200
[    0.165983] pci 0000:05:00.1: reg 10: [mem 0xd0360000-0xd037ffff]
[    0.165983] pci 0000:05:00.1: reg 14: [mem 0xd0340000-0xd035ffff]
[    0.165983] pci 0000:05:00.1: reg 18: [io  0x4020-0x403f]
[    0.165983] pci 0000:05:00.1: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.165983] pci 0000:05:00.1: PME# supported from D0 D3hot D3cold
[    0.165983] pci 0000:05:00.1: PME# disabled
[    0.165983] pci 0000:05:00.0: disabling ASPM on pre-1.1 PCIe device.  Yo=
u can enable it with 'pcie_aspm=3Dforce'
[    0.165983] pci 0000:00:0e.0: PCI bridge to [bus 05-05]
[    0.165983] pci 0000:00:0e.0:   bridge window [io  0x4000-0x4fff]
[    0.165983] pci 0000:00:0e.0:   bridge window [mem 0xd0300000-0xd03fffff]
[    0.165983] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
[    0.166183] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.P2P0._PRT]
[    0.166999] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR0._PRT]
[    0.167982] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR1._PRT]
[    0.167982] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR2._PRT]
[    0.167982] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR3._PRT]
[    0.167982]  pci0000:00: Requesting ACPI _OSC control (0x1d)
[    0.167982]  pci0000:00: ACPI _OSC request failed (AE_NOT_FOUND), return=
ed control mask: 0x1d
[    0.167982] ACPI _OSC control for PCIe not granted, disabling ASPM
(XEN) PCI add device 00:00.0
(XEN) PCI add device 00:01.0
(XEN) PCI add device 00:01.1
(XEN) PCI add device 00:02.0
(XEN) PCI add device 00:02.1
(XEN) PCI add device 00:07.0
(XEN) PCI add device 00:08.0
(XEN) PCI add device 00:09.0
(XEN) PCI add device 00:0b.0
(XEN) PCI add device 00:0c.0
(XEN) PCI add device 00:0d.0
(XEN) PCI add device 00:0e.0
(XEN) PCI add device 00:18.0
(XEN) PCI add device 00:18.1
(XEN) PCI add device 00:18.2
(XEN) PCI add device 00:18.3
(XEN) PCI add device 00:18.4
(XEN) PCI add device 01:07.0
(XEN) PCI add device 01:08.0
(XEN) PCI add device 02:00.0
(XEN) PCI add device 05:00.0
(XEN) PCI add device 05:00.1
[    0.215296] ACPI: PCI Interrupt Link [LNK1] (IRQs 16 17 18 19) *0
[    0.216228] ACPI: PCI Interrupt Link [LNK2] (IRQs 16 17 18 19) *0
[    0.217260] ACPI: PCI Interrupt Link [LNK3] (IRQs 16 17 18 19) *0
[    0.218147] ACPI: PCI Interrupt Link [LNK4] (IRQs 16 17 18 19) *0
[    0.219347] ACPI: PCI Interrupt Link [LNK5] (IRQs 16 17 18 19) *0, disab=
led.
[    0.220148] ACPI: PCI Interrupt Link [LSMB] (IRQs 20 21 22 23) *0
[    0.221261] ACPI: PCI Interrupt Link [LUS0] (IRQs 20 21 22 23) *0
[    0.222141] ACPI: PCI Interrupt Link [LUS2] (IRQs 20 21 22 23) *0, disab=
led.
[    0.223146] ACPI: PCI Interrupt Link [LMAC] (IRQs 20 21 22 23) *0, disab=
led.
[    0.224152] ACPI: PCI Interrupt Link [LACI] (IRQs 20 21 22 23) *0, disab=
led.
[    0.225146] ACPI: PCI Interrupt Link [LMCI] (IRQs 20 21 22 23) *0, disab=
led.
[    0.226152] ACPI: PCI Interrupt Link [LPID] (IRQs 20 21 22 23) *0, disab=
led.
[    0.227154] ACPI: PCI Interrupt Link [LTID] (IRQs 20 21 22 23) *0
[    0.228159] ACPI: PCI Interrupt Link [LSI1] (IRQs 20 21 22 23) *0
[    0.229241] ACPI: PCI Interrupt Link [APCP] (IRQs 20 21 22 23) *0, disab=
led.
[    0.230061] xen/balloon: Initialising balloon driver.
[    0.234817] xen-balloon: Initialising balloon driver.
[    0.235065] xen/balloon: Xen selfballooning driver disabled for domain0.
[    0.236089] vgaarb: device added: PCI:0000:01:08.0,decodes=3Dio+mem,owns=
=3Dio+mem,locks=3Dnone
[    0.236973] vgaarb: loaded
[    0.236973] vgaarb: bridge control possible 0000:01:08.0
[    0.237186] usbcore: registered new interface driver usbfs
[    0.238042] usbcore: registered new interface driver hub
[    0.239073] usbcore: registered new device driver usb
[    0.240074] PCI: Using ACPI for IRQ routing
[    0.240972] PCI: pci_cache_line_size set to 64 bytes
[    0.241093] reserve RAM buffer: 000000000009d000 - 000000000009ffff=20
[    0.241972] reserve RAM buffer: 000000007fff0000 - 000000007fffffff=20
[    0.241972] reserve RAM buffer: 00000000cfef0000 - 00000000cfffffff=20
[    0.242165] NetLabel: Initializing
[    0.242972] NetLabel:  domain hash size =3D 128
[    0.242972] NetLabel:  protocols =3D UNLABELED CIPSOv4
[    0.242972] NetLabel:  unlabeled traffic allowed by default
[    0.243286] Switching to clocksource xen
[    0.253714] pnp: PnP ACPI init
[    0.254693] ACPI: bus type pnp registered
[    0.261128] pnp 00:00: [mem 0xffc00000-0xffff] could not be reserved
[    0.281677] system 00:00: [mem 0xfee00000-0xfeefffff] could not be reser=
ved
[    0.281677] system 00:00: [mem 0xfed00000-0xfed00fff] has been reserved
[    0.281677] system 00:00: Plug and Play ACPI device, IDs PNP0c01 (active)
[    0.315354] pnp 00:01: [bus 00-ff]
[    0.316256] pnp 00:01: [io  0x0cf8-0x0cff]
[    0.316256] pnp 00:01: [io  0x0000-0x0cf7 window]
[    0.316256] pnp 00:01: [io  0x0d00-0xffff window]
[    0.316256] pnp 00:01: [mem 0x000a0000-0x000bffff window]
[    0.316256] pnp 00:01: [mem 0x000c0000-0x000dffff window]
[    0.316256] pnp 00:01: [mem 0xd0000000-0xfebfffff window]
[    0.316256] pnp 00:01: [mem 0xfed40000-0xfed8ffff]
[    0.354051] pnp 00:01: Plug and Play ACPI device, IDs PNP0a03 (active)
[    0.360758] pnp 00:02: [mem 0xe0000000-0xefffffff]
[    0.365932] system 00:02: [mem 0xe0000000-0xefffffff] has been reserved
[    0.366913] system 00:02: Plug and Play ACPI device, IDs PNP0c02 (active)
[    0.366913] pnp 00:03: [io  0x8000-0x807f]
[    0.366913] pnp 00:03: [io  0x8080-0x80ff]
[    0.366913] pnp 00:03: [io  0x8400-0x847f]
[    0.366913] pnp 00:03: [io  0x8480-0x84ff]
[    0.366913] pnp 00:03: [io  0x8800-0x887f]
[    0.366913] pnp 00:03: [io  0x8880-0x88ff]
[    0.366913] pnp 00:03: [io  0x2040-0x207f]
[    0.366913] pnp 00:03: [io  0x2000-0x203f]
[    0.366913] pnp 00:03: [io  0x0060]
[    0.366913] pnp 00:03: [io  0x0064]
[    0.420623] system 00:03: [io  0x8000-0x807f] has been reserved
[    0.421606] system 00:03: [io  0x8080-0x80ff] has been reserved
[    0.421606] system 00:03: [io  0x8400-0x847f] has been reserved
[    0.421606] system 00:03: [io  0x8480-0x84ff] has been reserved
[    0.421606] system 00:03: [io  0x8800-0x887f] has been reserved
[    0.421606] system 00:03: [io  0x8880-0x88ff] has been reserved
[    0.421606] system 00:03: [io  0x2040-0x207f] has been reserved
[    0.421606] system 00:03: [io  0x2000-0x203f] has been reserved
[    0.421606] system 00:03: Plug and Play ACPI device, IDs PNP0c02 (active)
[    0.421606] pnp 00:04: [irq 0 disabled]
[    0.421606] xen: registering gsi 8 triggering 1 polarity 0
[    0.484683] xen_map_pirq_gsi: returning irq 8 for gsi 8
[    0.485672] xen: --> pirq=3D8 -> irq=3D8 (gsi=3D8)
[    0.494403] pnp 00:04: [irq 8]
[    0.495274] pnp 00:04: [mem 0xfed00000-0xfed003ff]
[    0.502513] pnp 00:04: Plug and Play ACPI device, IDs PNP0103 (active)
[    0.503501] pnp 00:05: [io  0x0010-0x001f]
[    0.503501] pnp 00:05: [io  0x0022-0x003f]
[    0.503501] pnp 00:05: [io  0x0044-0x005f]
[    0.503501] pnp 00:05: [io  0x0062-0x0063]
[    0.503501] pnp 00:05: [io  0x0065-0x006f]
[    0.503501] pnp 00:05: [io  0x0072-0x0073]
[    0.503501] pnp 00:05: [io  0x0074-0x007f]
[    0.503501] pnp 00:05: [io  0x0091-0x0093]
[    0.503501] pnp 00:05: [io  0x0097-0x009f]
[    0.503501] pnp 00:05: [io  0x00a2-0x00bf]
[    0.503501] pnp 00:05: [io  0x00e0-0x00ef]
[    0.503501] pnp 00:05: [io  0x04d0-0x04d1]
[    0.559261] system 00:05: [io  0x04d0-0x04d1] has been reserved
[    0.560003] system 00:05: Plug and Play ACPI device, IDs PNP0c02 (active)
[    0.560003] pnp 00:06: [io  0x0000-0x0008]
[    0.560003] pnp 00:06: [io  0x000a-0x000f]
[    0.560003] pnp 00:06: [io  0x0081-0x0083]
[    0.560003] pnp 00:06: [io  0x0087]
[    0.560003] pnp 00:06: [io  0x0089-0x008b]
[    0.560003] pnp 00:06: [io  0x008f]
[    0.560003] pnp 00:06: [io  0x00c0-0x00d1]
[    0.560003] pnp 00:06: [io  0x00d4-0x00df]
[    0.560003] pnp 00:06: [dma 4]
[    0.607525] pnp 00:06: Plug and Play ACPI device, IDs PNP0200 (active)
[    0.608286] pnp 00:07: [io  0x0061]
[    0.617776] pnp 00:07: Plug and Play ACPI device, IDs PNP0800 (active)
[    0.618764] pnp 00:08: [io  0x0070-0x0071]
[    0.628615] pnp 00:08: Plug and Play ACPI device, IDs PNP0b00 (active)
[    0.629603] pnp 00:09: [io  0x00f0-0x00f1]
[    0.629603] xen: registering gsi 13 triggering 1 polarity 0
[    0.644895] xen_map_pirq_gsi: returning irq 13 for gsi 13
[    0.645886] xen: --> pirq=3D13 -> irq=3D13 (gsi=3D13)
[    0.655052] pnp 00:09: [irq 13]
[    0.658392] pnp 00:09: Plug and Play ACPI device, IDs PNP0c04 (active)
[    0.659378] pnp 00:0a: [io  0x0c00-0x0c7f]
[    0.669393] system 00:0a: [io  0x0c00-0x0c7f] has been reserved
[    0.670175] system 00:0a: Plug and Play ACPI device, IDs PNP0c02 (active)
[    0.682692] pnp 00:0b: [io  0x03f8-0x03ff]
[    0.683205] xen: registering gsi 4 triggering 1 polarity 0
[    0.692426] xen_map_pirq_gsi: returning irq 4 for gsi 4
[    0.693298] xen: --> pirq=3D4 -> irq=3D4 (gsi=3D4)
[    0.701951] Already setup the GSI :4
[    0.702943] pnp 00:0b: [irq 4]
[    0.709266] pnp 00:0b: Plug and Play ACPI device, IDs PNP0501 (active)
[    0.717400] pnp: PnP ACPI: found 12 devices
[    0.718054] ACPI: ACPI bus type pnp unregistered
[    0.728468] pciback 0000:05:00.0: seizing device
[    0.733312] pciback 0000:05:00.1: seizing device
[    0.752158] PM-Timer failed consistency check  (0x0xffffff) - aborting.
[    0.753061] PCI: max bus depth: 1 pci_try_num: 2
[    0.753061] pci 0000:00:0e.0: BAR 15: assigned [mem 0xd0400000-0xd04ffff=
f pref]
[    0.753061] pci 0000:01:07.0: BAR 6: assigned [mem 0xd0120000-0xd013ffff=
 pref]
[    0.753061] pci 0000:01:08.0: BAR 6: assigned [mem 0xd0140000-0xd015ffff=
 pref]
[    0.753061] pci 0000:00:09.0: PCI bridge to [bus 01-01]
[    0.753061] pci 0000:00:09.0:   bridge window [io  0x3000-0x3fff]
[    0.753061] pci 0000:00:09.0:   bridge window [mem 0xd0100000-0xd01fffff]
[    0.753061] pci 0000:00:09.0:   bridge window [mem 0xd8000000-0xdfffffff=
 pref]
[    0.753061] pci 0000:00:0b.0: PCI bridge to [bus 02-02]
[    0.753061] pci 0000:00:0b.0:   bridge window [mem 0xd0200000-0xd02fffff]
[    0.753061] pci 0000:00:0c.0: PCI bridge to [bus 03-03]
[    0.753061] pci 0000:00:0d.0: PCI bridge to [bus 04-04]
[    0.753061] pciback 0000:05:00.0: BAR 6: assigned [mem 0xd0400000-0xd041=
ffff pref]
[    0.753061] pciback 0000:05:00.1: BAR 6: assigned [mem 0xd0420000-0xd043=
ffff pref]
[    0.753061] pci 0000:00:0e.0: PCI bridge to [bus 05-05]
[    0.753061] pci 0000:00:0e.0:   bridge window [io  0x4000-0x4fff]
[    0.753061] pci 0000:00:0e.0:   bridge window [mem 0xd0300000-0xd03fffff]
[    0.753061] pci 0000:00:0e.0:   bridge window [mem 0xd0400000-0xd04fffff=
 pref]
[    0.753061] pci 0000:00:09.0: setting latency timer to 64
[    0.753061] pci 0000:00:0b.0: setting latency timer to 64
[    0.753061] pci 0000:00:0c.0: setting latency timer to 64
[    0.753061] pci 0000:00:0d.0: setting latency timer to 64
[    0.753061] pci 0000:00:0e.0: setting latency timer to 64
[    0.753061] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7]
[    0.753061] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff]
[    0.753061] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff]
[    0.753061] pci_bus 0000:00: resource 7 [mem 0x000c0000-0x000dffff]
[    0.753061] pci_bus 0000:00: resource 8 [mem 0xd0000000-0xfebfffff]
[    0.753061] pci_bus 0000:00: resource 9 [mem 0xfed40000-0xfed8ffff]
[    0.753061] pci_bus 0000:01: resource 0 [io  0x3000-0x3fff]
[    0.753061] pci_bus 0000:01: resource 1 [mem 0xd0100000-0xd01fffff]
[    0.753061] pci_bus 0000:01: resource 2 [mem 0xd8000000-0xdfffffff pref]
[    0.753061] pci_bus 0000:02: resource 1 [mem 0xd0200000-0xd02fffff]
[    0.753061] pci_bus 0000:05: resource 0 [io  0x4000-0x4fff]
[    0.753061] pci_bus 0000:05: resource 1 [mem 0xd0300000-0xd03fffff]
[    0.753061] pci_bus 0000:05: resource 2 [mem 0xd0400000-0xd04fffff pref]
[    0.983002] NET: Registered protocol family 2
[    0.988317] IP route cache hash table entries: 131072 (order: 8, 1048576=
 bytes)
[    1.001361] TCP established hash table entries: 524288 (order: 11, 83886=
08 bytes)
[    1.012831] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
[    1.013482] TCP: Hash tables configured (established 524288 bind 65536)
[    1.013482] TCP reno registered
[    1.029753] UDP hash table entries: 2048 (order: 4, 65536 bytes)
[    1.035960] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes)
[    1.036817] NET: Registered protocol family 1
[    1.047421] RPC: Registered named UNIX socket transport module.
[    1.048178] RPC: Registered udp transport module.
[    1.048178] RPC: Registered tcp transport module.
[    1.048178] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    1.120311] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.121070] pci 0000:00:00.0: Found enabled HT MSI Mapping
21070] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.121070] pci 0000:00:0b.0: Found disabled HT MSI Mapping
[    1.121070] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.121070] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.121070] pci 0000:00:0c.0: Found disabled HT MSI Mapping
[    1.121070] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.121070] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.121070] pci 0000:00:0d.0: Found disabled HT MSI Mapping
[    1.121070] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.121070] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.121070] pci 0000:00:0e.0: Found disabled HT MSI Mapping
[    1.121070] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.121070] pci 0000:01:08.0: Boot video device
[    1.121070] PCI: CLS 64 bytes, default 64
[    1.207522] Trying to unpack rootfs image as initramfs...
[    1.913680] Freeing initrd memory: 238724k freed
[    2.033419] DMA-API: preallocated 32768 debug entries
[    2.034057] DMA-API: debugging enabled by kernel config
[    2.0 2.051893] Machine check injector initialized
[    2.057897] microcode: CPU0: patch_level=3D0x01000065
[    2.062763] microcode: CPU1: patch_level=3D0x01000065
[    2.067690] microcode: CPU2: patch_level=3D0x01000065
[    2.072643] microcode: CPU3: patch_level=3D0x01000065
[    2.077687] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.f=
snet.co.uk>, Peter Oruba
[    2.087324] audit: initializing netlink socket (disabled)
[    2.092718] type=3D2000 audit(1319592210.509:1): initialized
[    2.124567] HugeTLB registered 2 MB page size, pre-allocated 0 pages
[    2.142241] VFS: Disk quotas dquot_6.5.2
[    2.146672] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    2.154747] NTFS driver 2.1.30 [Flags: R/W].
[    2.159500] msgmni has been set to 6332
[    2.164656] Block layer SCSI generic (bsg) driver version 0.4 loaded (ma=
jor 253)
[    2.165645] io scheduler noop registered
[    2.165645] io scheduler deadline registered
[    2.180505] io scheduler cfq registered (default)
[    2.185722] pcieport 0000:00:0b.0: setting latency timer to 64
(XEN) physdev.c:155: dom0: wrong map_pirq type 3
[    2.196427] pcieport 0000:00:0c.0: setting latency timer to 64
[    2.202620] pcieport 0000:00:0d.0: setting latency timer to 64
[    2.208805] pcieport 0000:00:0e.0: setting latency timer to 64
[    2.215429] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
[    2.221634] input: Power Button as /devices/LNXSYSTM:00/device:00/PNP0C0=
C:00/input/input0
[    2.222623] ACPI: Power Button [PWRB]
[    2.233722] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/inpu=
t/input1
[    2.234710] ACPI: Power Button [PWRF]
[    2.245126] ACPI: acpi_idle yielding to (null)
[    2.257152] ACPI: PCI Interrupt Link [LNK4] enabled at IRQ 19
[    2.258060] xen: registering gsi 19 triggering 0 polarity  18
[    2.288063] xen: registering gsi 18 triggering 0 polarity 1
[    2.298596] xen: --> pirq=3D18 -> irq=3D18 (gsi=3D18)
[    2.303389] pciback 0000:05:00.0: PCI INT A -> Link[LNK3] -> GSI 18 (lev=
el, low) -> IRQ 18
[    2.304166] pciback 0000:05:00.0: PCI INT A disabled
[    2.316758] xen-pciback: backend is vpci
[    2.337367] kworker/u:1 used greatest stack depth: 4936 bytes left
[    2.393104] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    2.481801] hpet_acpi_add: no address or irqs in _CRS
[    2.487146] Non-volatile memory driver v1.3
[    2.488127] Linux agpgart interface v0.103
[    2.498575] [drm] Initialized drm 1.1.0 20060810
[    2.509005] brd: module loaded
[    2.515135] loop: module loaded
[snynsky <maxk@qualcomm.com>
[    2.534988] tg3.c:v3.120 (August 18, 2011)
[    2.539552] ACPI: PCI Interrupt Link [LNK2] enabled at IRQ 17
[    2.540165] xen: registering gsi 17 triggering 0 polarity 1
[    2.551195] xen: --> pirq=3D17 -> irq=3D17 (gsi=3D17)
[    2.555707] tg3 0000:02:00.0: PCI INT A -> Link[LNK2] -> GSI 17 (level, =
low) -> IRQ 17
[    2.556695] tg3 0000:02:00.0: setting latency timer to 64
[    2.577882] tg3 0000:02:00.0: eth0: Tigon3 [partno(BCM95722) rev a200] (=
PCI Express) MAC address 00:1d:09:17:b5:46
[    2.564-bit]
[    2.613432] work_for_cpu used greatest stack depth: 4744 bytes left
[    2.620853] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    2.621841] ehci_hcd: block sizes: qh 112 qtd 96 itd 192 sitd 96
[    2.633937] ACPI: PCI Interrupt Link [LUS2] enabled at IRQ 23
[    2.634506] xen: registering gsi 23 triggering 0 polarity 1
[    2.645299] xen: --> pirq=3D23 -> irq=3D23 (gsi=3D23)
[    2.650153] ehci_hcd 0000:00:02.1: PCI INT B -> Link[LUS2] -> GSI 23 (le=
vel, low) -> IRQ 23
[    2.658516] ehci_hcd 0000:00:02.1: setting latency timer to 64
[    2.659495] ehci_hcd 0000:00:02.1: EHCI Host Controller
[    2.659495] /home/konrad/ssd/linux/drivers/usb/core/inode.c: creating fi=
le 'devices'
[    2.659495] /home/konrad/ssd/linux/drivers/usb/core/inode.c: creating fi=
le '001'
[    2.685447] ehci_hcd 0000:00:02.1: new USB bus registered, assigned bus =
number 1
[    2.686437] ehci_hcd 0000:00:02.1: reset hcs_params 0x10148a dbg=3D1 cc=
=3D1 pcc=3D4 !ppc ports=3D10
[    2.686437] ehci_hcd 0000:00:02.1: reset portroute 0 0 0 0 0 0 0 0 0 0=
=20
[    2.686437] ehci_hcd 0000:00:02.1: reset hcc_params a086 caching frame 2=
56/512/1024 park
[    2.686437] ehci_hcd 0000:00:02.1: park 0
[    2.686437] ehci_hcd 0000:00:02.1: debug port 1
[    2.686437] ehci_hcd 0000:00:02.1: reset command 0080b32  park=3D3 ithre=
sh=3D8 Async Periodic period=3D1024 Reset HALT
[    2.686437] ehci_hcd 0000:00:02.1: bogus port configuration: cc=3D1 x pc=
c=3D4 < ports=3D10
[    2.686437] ehci_hcd 0000:00:02.1: cache line size of 64 is not supported
[    2.686437] ehci_hcd 0000:00:02.1: supports USB remote wakeup
[    2.686437] ehci_hcd 0000:00:02.1: irq 23, io mem 0xd0001000
[    2.686437] ehci_hcd 0000:00:02.1: reset command 0080b02  park=3D3 ithre=
sh=3D8 period=3D1024 Reset HALT
[    2.686437] ehci_hcd 0000:00:02.1: init command 0010005 (park)=3D0 ithre=
sh=3D1 period=3D512 RUN
[    2.784089] ehci_hcd 0000:00:02.1: USB 2.0 started, EHCI 1.00
[    2.789882] usb usb1: default language 0x0409
[    2.794lber=3D1
[    2.795216] usb usb1: Product: EHCI Host Controller
[    2.795216] usb usb1: Manufacturer: Linux 3.1.0-04894-g4dbe431-dirty ehc=
i_hcd
[    2.795216] usb usb1: SerialNumber: 0000:00:02.1
[    2.830230] usb usb1: usb_probe_device
[    2.831210] usb usb1: configuration #1 chosen from 1 choice
[    2.839602] usb usb1: adding 1-0:1.0 (config #1, interface 0)
[    2.845677] hub 1-0:1.0: usb_probe_interface
[    2.846658] hub 1-0:1.0: usb_probe_interface - got id
[    2.846658] hub 1-0:1.0: USB hub found
[    2.858849] hub 1-0:1.0: 10 ports detected
[    2.859830] hub 1-0:1.0: standalone hub
[    2.859830] hub 1-0:1.0: no power switching (usb 1.0)
[    2.859830] hub 1-0:1.0: individual port over-current protection
[    2.859830] hub 1-0:1.0: power on to power good time: 20ms
[    2.883734] hub 1-0:1.0: local power source is good
[    2.884583] hub 1-0:1.0: trying to enable port power on non-switchable h=
ub
[    2.895608] /home/konrad/ssd/linux/drivers/usb/core/inode.c: creating fi=
le '001'
[    2.903515] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    2.904500] ohci_hcd: block sizes: ed 80 td 96
[    2.914830] ACPI: PCI Interrupt Link [LUS0] enabled at IRQ 22
[    2.915402] xen: registering gsi 22 triggering 0 polarity 1
[    2.926191] xen: --> pirq=3D22 -> irq=3D22 (gsi=3D22)
[    2.931013] ohci_hcd 0000:00:02.0: PCI INT A -> Link[LUS0] -> GSI 22 (le=
vel, low) -> IRQ 22
[    2.939510] ohci_hcd 0000:00:02.0: setting latency timer to 64
[    2.940356] ohci_hcd 0000:00:02.0: OHCI Host Controller
[    2.950856] /home/konrad/ssd/linux/drivers/usb/core/inode.c: creating fi=
le '002'
[    2.958519] ohci_hcd 0000:00:02.0: new USB bus registered, assigned bus =
number 2
[    2.959290] ohci_hcd 0000:00:02.0: enabled nVidia shutdown quirk
[    2.973464] ohci_hcd 0000:00:02.0: created debug files
[    2.974214] ohci_hcd 0000:00:02.0: supports USB remote wakeup
[    2.974214] ohci_hcd 0000:00:02.0: irq 22, io mem 0xd0000000
[    2.995285] hub 1-0:1.0: state 7 ports 10 chg 0000 evt 0000
[    3.043297] ohci_hcd 0000:00:02.0: OHCI controller state
[    3.044053] ohci_hcd 0000:00:02.0: OHCI 1.0, NO legacy support registers
[    3.044053] ohci_hcd 0000:00:02.0: control 0x683 RWE RWC HCFS=3Doperatio=
nal CBSR=3D3
[    3.044053] ohci_hcd 0000:00:02.0: cmdstatus 0x00000 SOC=3D0
[    3.044053] ohci_hcd 0000:00:02.0: intrstatus 0x00000004 SF
[    3.044053] ohci_hcd 0000:00:02.0: intrenable 0x8000004a MIE RHSC RD WDH
[    3.044053] ohci_hcd 0000:00:02.0: hcca frame #0028
[    3.044053] ohci_hcd 0000:00:02.0: roothub.a 0100020a POTPGT=3D1 NPS NDP=
=3D10(10)
[    3.044053] ohci_hcd 0000:00:02.0: roothub.b 00000000 PPCM=3D0000 DR=3D0=
000
[    3.044053] ohci_hcd 0000:00:02.0: roothub.status 00008000 DRWE
[    3.044053] ohci_hcd 0000:00:02.0: roothub.portstatus [0] 0x00000100 PPS
[    3.044053] ohci_hcd 0000:00:02.0: roothub.portstatus [1] 0x00000100 PPS
[    3.044053] ohci_hcd 0000:00:02.0: roothub.portstatus [2] 0x00000100 PPS
[    3.044053] ohci_hcd 0000:00:02.0: roothub.portstatus [3] 0x00000100 PPS
[    3.044053] ohci_hcd 0000:00:02.0: roothub.portstatus [4] 0x00000100 PPS
[    3.044053] ohci_hcd 0000:00:02.0: roothub.portstatus [5] 0x00000100 PPS
[    3.044053] ohci_hcd 0000:00:02.0: roothub.portstatus [6] 0x00000100 PPS
[    3.044053] ohci_hcd 0000:00:02.0: roothub.portstatus [7] 0x00000100 PPS
[    3.044053] ohci_hcd 0000:00:02.0: roothub.portstatus [8] 0x00000100 PPS
[    3.044053] ohci_hcd 0000:00:02.0: roothub.portstatus [9] 0x00000100 PPS
[    3.172976] usb usb2: default language 0x0409
[    3.177382] usb usb2: udev 1, busnum 2, minor =3D 128
[    3.178356] usb usb2: New USB device found, idVendor=3D1d6b, idProduct=
=3D0001
[    3.178356] usb usb2: New USB device strings: Mfr=3D3, Product=3D2, Seri=
alNumber=3D1
[    3.178356] usb usb2: Product: OHCI Host Controller
[    3.178356] usb usb2: Manufacturer: Linux 3.1.0-04894-g4dbe431-dirty ohc=
i_hcd
[    3.178356] usb usb2: SerialNumber: 0000:00:02.0
[    3.213533] usb usb2: usb_probe_device
[    3.214517] usb usb2: configuration #1 chosen from 1 choice
[    3.222900] usb usb2: adding 2-0:1.0 (config #1, interface 0)
[    3.228971] hub 2-0:1.0: usb_probe_interface
[    3.229953] hub 2-0:1.0: usb_probe_interface - got id
[    3.229953] hub 2-0:1.0: USB hub found
[    3.242140] hub 2-0:1.0: 10 ports detected
[    3.243127] hub 2-0:1.0: standalone hub
[    3.243127] hub 2-0:1.0: no power switching (usb 1.0)
[    3.243127] hub 2-0:1.0: global over-current protection
[    3.243127] hub 2-0:1.0: power on to power good time: 2ms
[    3.266163] hub 2-0:1.0: local power source is good
[    3.267011] hub 2-0:1.0: no over-current condition exists
[    3.267011] hub 2-0:1.0: trying to enable port power on non-switchable h=
ub
[    3.283448] /home/konrad/ssd/linux/drivers/usb/core/inode.c: creating fi=
le '001'
[    3.291028] ehci_hcd 0000:00:02.1: HS companion for 0000:00:02.0
[    3.297387] uhci_hcd: USB Universal Host Controller Interface driver
[    3.304385] usbcore: registered new interface driver usblp
[    3.309987] usbcore: registered new interface driver libusual
[    3.316377] i8042: PNP: No PS/2 controller found. Probing ports directly.
[    3.383386] hub 2-0:1.0: state 7 ports 10 chg 0000 evt 0000
[    3.574575] serio: i8042 KBD port at 0x60,0x64 irq 1
[    3.579972] mousedev: PS/2 mouse device common for all mice
[    rtc_cmos 00:08: rtc core: registered rtc_cmos as rtc0
[    3.597232] rtc0: alarms up to one year, y3k, 114 bytes nvram
[    3.603276] EFI Variables Facility v0.08 2004-May-17
[    3.608539] zram: num_devices not specified. Using default: 1
[    3.609244] zram: Creating 1 devices ...
[    3.619789] Netfilter messages via NETLINK v0.30.
[    3.624501] nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
[    3.631312] ctnetlink v0.93: registering with nfnetlink.
[    3.639311] ip_tables: (C) 2000-2006 Netfilter Core Team
[    3.644641] TCP cubic registered
[    3.645629] Initializing XFRM netlink socket
[    3.652969] NET: Registered protocol family 10
[    3.661511] ip6_tables: (C) 2000-2006 Netfilter Core Team
[    3.667079] IPv6 over IPv4 tunneling driver
[    3.673987] NET: Registered protocol family 17
[    3.674060] Registering the dns_resolver key type
[    3.683648] PM: Hitaskstats version 1
[    3.695173]   Magic number: 15:902:357
[    3.699244] powernow-k8: Found 1 Quad-Core AMD Opteron(tm) Processor 135=
2 (4 cpu cores) (version 2.20.00)
[    3.708998] powernow-k8: invalid pstate 1 - bad value 1.
[    3.709792] powernow-k8: Please report to BIOS manufacturer
[    3.709792] powernow-k8: invalid pstate 2 - bad value 2.
[    3.709792] powernow-k8: Please report to BIOS manufacturer
[    3.709792] powernow-k8: invalid pstate 3 - bad value 3.
[    3.709792] powernow-k8: Please report to BIOS manufacturer
[    3.709792] powernow-k8: invalid pstate 4 - bad value 4.
[    3.709792] powernow-k8: Please report to BIOS manufacturer
[    3.752891] [Firmware Bug]: powernow-k8: invalid powernow_table
^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^=
G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G=
^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^=
G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G[    3.782787] Freeing unused kernel memory:=
 2452k freed
[    3.783065] Write protecting the kernel read-only data: 10240k
[    3.804032] Freeing unused kernel memory: 1776k freed
[    3.810130] Freeing unused kernel memory: 148k freed
init started: BusyBox v1.14.3 (2011-10-26 23:42:14 EDT)
Mounting directories  [  OK  ]
mount: mount point /sys/kernel/config does not exist
FATAL: Error inserting xen_kbdfront (/lib/modules/3.1.0-04894-g4dbe431-dirt=
y/kernel/drivers/input/misc/xen-kbdfront.ko): No suchideo/xen-fbfront.ko): =
No such device
^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G[    4.491350] udevd (1403)=
: /proc/1403/oom_adj is deprecated, please use /proc/1403/oom_score_adj ins=
tead.
[    4.664588] SCSI subsystem initialized
[    4.688858] libata version 3.00 loaded.
[    4.697827] sata_nv 0000:00:07.0: version 3.5
[    4.703771] ACPI: PCI Interrupt Link [LTID] enabled at IRQ 21
[    4.703tering gsi 21 triggering 0 polarity 1
[    4.703806] xen: --> pirq=3D21 -> irq=3D21 (gsi=3D21)
[    4.703820] sata_nv 0000:00:07.0: PCI INT A -> Link[LTID] -> GSI 21 (lev=
el, low) -> IRQ 21
[    4.703950] sata_nv 0000:00:07.0: setting latency timer to 64
^G^G^G^G[    4.746625] scsi0 : sata_nv
[    4.775952] scsi1 : sata_nv
[    4.800793] ata1: SATA max UDMA/133 cmd 0x20f0 ctl 0x20e0 bmdma 0x20b0 i=
rq 21
[    4.80230 ctl 0x20c0 bmdma 0x20b8 irq 21
^G^G^G^G^G^G^G^G^G^G[    4.817379] [drm] radeon defaulting to kernel modese=
tting.
[    4.818057] [drm] radeon kernel modesetting enabled.
[    4.826234] ACPI: PCI Interrupt Link [LSI1] enabled at IRQ 20
[    4.826239] xen: registering gsi 20 triggering 0 polarity 1
[    4.826263] xen: --> pirq=3D20 -> irq=3D20 (gsi=3D20)
[    4.826272] sata_nv 0000:00:08.0: PCI INT A -> Link[LSI1] -> GSI 20 (lev=
el, low) -> IRQ 20
[    4.826366] sata_nv 0000:00:08.0: setting latency timer to 64
[    4.830581] scsi2 : sata_nv
[    4.830933] scsi3 : sata_nv
[    4.831524] ata3: SATA max UDMA/133 cmd 0x2440 ctl 0x2430 bmdma 0x2400 i=
rq 20
[    4.831529] ata4: SATA max UDMA/133 cmd 0x2420 ctl 0x2410 bmdma 0x2408 i=
rq 20
[    4.880694] ACPI: PCI Interrupt Link [LNK1] enabled at IRQ 16
[    4.881062] xen: registering gsi 16 triggering 0 polarity 1
[    4.892444] xen: --> pirq=3D16 -> irq=3D16 (gsi=3D16)
[    4.897448] radeon 0000:01:08.0: PCI INT A -> Link[LNK1] -> GSI 16 (leve=
l, low) -> IRQ 16
[    4.911270] [drm] initializing kernel modesetting (RV100 0x1002:0x515E 0=
x1028:0x0225).
[    4.919306] [drm] register mmio b01:08.0: VRAM: 128M 0x00000000D8000000 =
- 0x00000000DFFFFFFF (32M used)
[    4.931080] radeon 0000:01:08.0: GTT: 512M 0x00000000B8000000 - 0x000000=
00D7FFFFFF
^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G[    4.956861] [drm] Supports vblank ti=
mestamp caching Rev 1 (10.10.2010).
[    4.957086] ^G^G^G^G^G^G^G^G^G[    4.978385] [drm] radeon: irq initializ=
ed.
[    4.979064] [drm] Detected VRAM RAM=3D128M, BAR=3D128M
[    4.988352] [drm] RAMool allocator.
[    5.003062] [drm] radeon: 32M of VRAM memory ready
^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G[    5.024650] [drm] =
radeon: 512M of GTT memory ready.
[    5.029699] [drm] GART: num cpu pages 131072, num gpu pages 131072
[    5.058527] radeon 0000:01:08.0: WB enabled
[    5.063515] [drm] Loading R100 Microcode
[    5.081524] [drm] radeon: ring^G[    5.110509] ip used greatest stack de=
pth: 3712 bytes left
[    5.272129] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
[    5.276132] [drm:r100_ring_test] *ERROR* radeon: ring't worki^ng (-22).
G[    5.276146] r^adeon 0000:01:08G.0: failed initializing CP (-22).
[    5.276152] radeon 0000:01:08.0: Disabling GPU acceleration
[    5.277094] [drm] radeon: cp finalized
[    5.282536] [drm] Radeon Display Connectors
[    5.282542] [drm] Connector 0:
^[    5.282545] [Gdrm]   VGA
^[    5.282552] [Gdrm]   DDC: 0x60^ 0x60 0x60 0x60 G0x60 0x60 0x60 0x60
^[    5.282556] [Gdrm]   Encoders:
^[    5.282561] [Gdrm]     CRT1: I^NTERNAL_DAC1
G[    5.304862] [^drm] Radeon dispGlay connector VG^A-1: No monitor Gconnec=
ted or inv^alid EDIDG^G^G^G^G
^[    5.342355] aGta3: SATA link u^p 1.5 Gbps (SStaGtus 113 SControl^ 300)
G^G^G^G^G^G^G[    5.352253] ata3.00: ATAPI: HL-DT-STDVD-ROM GDRH20N, 0D04, =
max UDMA/100
[    5.358381] ata1.00: ATA-7: WDC WD800AAJS-18TDA1, 01.00A04, max UDMA/133
[    5.358387] ata1.00: 156250000 sectors, multi 0: LBA48 NCQ (depth 0/32)
[    5.361714] ata1.00: configured for UDMA/133
[    5.361909] scsi 0:0:0:0: Direct-Access     ATA      WDC WD800AAJS-18 01=
=2E0 PQ: 0 ANSI: 5
[    5.391292] ata3.00: configured for UDMA/100
[    5.393676] [drm] fb mappable at 0xD8040000
[    5.393679] [drm] vram appm]    pitch is 1024
G[    5.393868] f^bcon: radeondrmfGb (fb0) is prima^ry device
G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^GWaiting for devices [  OK  ]
[    5.583222] Console: switching to colour frame buffer device 128x48
[    5.591060] fb0: radeondrmfb frame buffer device
[ 0
^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G[    5.689104] at=
a2: SATA link down (SStatus 0 SControl 300)
[    5.707168] scsi 2:0:0:0: CD-ROM            HL-DT-ST DVD-ROM GDRH20N  0D=
04 PQ: 0 ANSI: 5
[    6.019102] ata4: SATA link down (SStatus 0 SControl 300)
[    6.042254] sd 0:0:0:0: [sda] 156250000 512-byte logical blockmc drive: =
48x/48x cd/rw xa/form2 cdda tray
[    6.043824] cdrom: Uniform CD-ROM driver Revision: 3.20
[    6.044331] sr 2:0:0:0: Attached scsi CD-ROM sr0
^G^G[    6.066514] s^d 0:0:0:0: [sda]G Write Protect i^s off
G[    6.067090] s^d 0:0:0:0: [sda]G Mode Sense: 00 3a 00 00
^G^G^G[    6.077470] s^d 0:0:0:0: [sda]G Write cache: en^abled, read cachGe=
: enabled, does^n't support DPO Gor FUA
^G^G[    6.087677] qla2xxx [0000:00:00.0]-0005: : QLogic Fibre Channel HBA =
Driver: 8.03.07.07-k.
[    6.096388]  sda: sda1 sda2
[    6.096736] xen: registering gsi 19 triggering 0 polarity 1
[    6.096745] xen_map_pirq_gsi: returning irq 19 for gsi 19
[    6.096748] xen: --> pirq=3D19 -> irq=3D19 (gsi=3D19)
[    6.096752] Already setup the GSI :19
[    6.096758] qla2xxx 0000:01:07.0: PCI INT A -> Link[LNK4] -> GSI 19 (lev=
el, low) -> IRQ 19
[    6.096806] qla2xxx [0000:01:07.0]-001d: : Found an ISP6312 irq 19 iobas=
e 0xffffc9000067c000.
[    6.097160] qla2xxx [0000:01:07.0]-0040:4: Configuring PCI space...
[    6.097453] qla2xxx [0000:01:07.0]-0061:4: Configure NVRAM parameters...
[    6.153^G^G^G^G^G^G^G^G^G[    6.169942] sd 0:0:0:0: Attached scsi generi=
c sg0 type 0
[    6.178857] sr 2:0:0:0: Attached scsi generic sg1 type 5
[    6.226909] qla2xxx [0000:01:07.0]-0078:4: Verifying loaded RISC code...
[    6.326395] qla2xxx [0000:01:07.0]-00c5:4: Allocated (412 KB) for firmwa=
re dump.
[    6.491258] scsi4 : qla2xxx
[    6.498666] qla2xxx [0000:01:07.0]-00fa:4: QLogic Fibre Channed HBA Driv=
er: 8.03.07.07-k.
[    6.499643] qla2xxx [0000:01:0
^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^=
G^G^GWaiting for fb [  OK  ]
Starting..[/dev/fb0]
/dev/fb0: len:0
/dev/fb0: bits/pixel8
(7fcf928ad000): Writting .. [1024:768]
Done!
FATAL: Module agpgart_intel not found.
[    6.642887] wmi: Mapper loaded
[    6.732573] [drm:i915_init] *ERROR* drm/i915 can't work without intel_ag=
p module!
FATAL: Error inserting i915 (/lib/modules/3.1.0-04894-g4dbe431-dirty/kernel=
/drivers/gpu/drm/i915/i915.ko): No such device
Starting..[/dev/fb0]
/dev/fb0: len:0
/dev/fb0: bits/pixel8
(7f41d847e000): Writting .. [1024:768]
Done!
VGA: 0000:01:08.0
Waiting for network [  OK  ]
Bringing up loopback interface:  [  OK  ]
Bringing up interface eth0:  [    7.447693] ADDRCONF(NETDEV_UP): eth0: link=
 is not ready
[    7.461660] device eth0 entered promiscuous mode
[  OK  ]
Bringing up interface switch: =20
Determining IP information for switch...[    7.578671] ADDRCONF(NETDEV_UP):=
 switch: link is not ready
[   10.170794] tg3 0000:02:00.0: eth0: Link is up at 1000 Mbps, full duplex
[   10.171059] tg3 0000:02:00.0: eth0: Flow control is on for TX and on for=
 RX
[   10.192313] ADDRCONF(NETDEV_CHANGE): eth0: lwitch: port 1(eth0) entering=
 forwarding state
[   10.221090] ADDRCONF(NETDEV_CHANGE): switch: link becomes ready
 done.
[  OK  ]
Waiting for init.custom [  OK  ]
Start sshd
PING master.dumpdata.com (192.168.101.1) 56(84) bytes of data.

--- master.dumpdata.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev =3D 0.312/0.312/0.312/0.000 ms
[   12.185065] mount.nfs used greatest stack depth: 3264 bytes left

Starting SSHd ...
ERROR: Module radeon is in use
[   12.234915] [drm] Module unloaded
 [0x0->0x9d] pfn
 [0x9d->0x100] identity
 [0x100->0x7fff0] pfn
 [0x7fff0->0x80000] identity
 [0x80000->0xcfef0] pfn
 [0x0->0xf4c00] level entry
 [0xcfef0->0x100000] identity
 [0xf4c00->0x100000] level middle
 [0x100000->0x1ffffff] missing
 [0x100000->0x1ffffff] level top
libxl: error: libxl.c:56:libxl_ctx_init Is xenstore daemon running?
failed to stat /var/run/xenstored.pid: No such file or directory
cannot init xl context
Waiting for SSHd [  OK  ]
WARNING: ssh currently running [2920] ignoring start request
[   13.042309] tg3 0000:02:00.0: single idx 3 P=3Dbe258040 D=3D3e806040 L=
=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: single idx 3 P=3Dbe258840 D=3D3e806840 L=
=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: single idx 3 P=3Dbe259040 D=3D3e807040 L=
=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: sinidx 4 P=3Dbe25a040 D=3D3e808040 L=3D640=
 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: single idx 4 P=3Dbe25a840 D=3D3e808840 L=
=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: sin[   13.043122] tg3 0000:02:00.0: single=
 idx 5 P=3Dbe25c040 D=3D3e80a040 L=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: single idx 5 P=3Dbe25c840 D=3D3e80a840 L=
=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: single idx 5 P=3Dbe25d040 D=3D3e80b040 L=
=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: sin D=3D3e80b840 L=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: single idx 6 P=3Dbe25e040 D=3D3e80c040 L=
=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: sin000:02:00.0: single idx 6 P=3Dbe25f840 =
D=3D3e80d840 L=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: single idx 71 P=3Dbe2e0040 D=3D3e88e040 L=
=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: single idx 71 P=3Dbe2e0840 D=3D3e88e840 L=
=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: single idx 71 P=3Dbe2e1040 D=3D3e88f040 L=
=3D640 DMA_FROM_DEVICE
[   13.043122] tg3 0000:02:00.0: single idx 71 P=3Dbe2e1840 D=3D3e88f840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 72 P=3Dbe2e2040 D=3D3e890040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0:
 single idx 72 P    SSH started [2920]
=3Dbe2e2840 D=3D3e89
0840 L=3D640 DMA_FROM_DEVICE

[   13.255338] tg3 0000:02:00.0: single idx 72 P=3Dbe2e3040 D=3D3e891040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 72 P=3Dbe2e3840 D=3D3e891840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 73 P=3Dbe2e4040 D=3D3e892040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 73 P=3Dbe2e4840 D=3D3e892840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 73 P=3Dbe2e5040 D=3D3e893040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 73 P=3Dbe2e5840 D=3D3e893840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 74 P=3Dbe2e6040 D=3D3e894040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 74 P=3Dbe2e6840 D=3D3e894840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: si0 D=3D3e895040 L=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 74 P=3Dbe2e7840 D=3D3e895840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] sata_nv 0000:00:08.0: coherent idx 102 P=3Dbe31f000 D=3D3e8c=
d000 L=3D800 DMA_BIDIRECTIONAL
[   13.255338] sata_nv 0000:00:08.0: coherent idx 108 P=3Dbe32b000 D=3D3e8d=
9000 L=3D800 DMA_BIDIRECTIONAL
[   13.255338] tg3 0000:02:00.0: single idx 231 P=3Dbe420040 D=3D3e9ce040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 231 P=3Dbe420840 D=3D3e9ce840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 231 P=3Dbe421040 D=3D3e9cf040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 231 P=3Dbe421840 D=3D3e9cf840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 232 P=3Dbe422040 D=3D3e9d0040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 232 P=3Dbe422840 D=3D3e9d0840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 232 P=3Dbe423040 D=3D3e9d1040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 232 P=3Dbe423840 D=3D3e9d1840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 233 P=3Dbe424040 D=3D3e9d2040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 233 P=3Dbe424840 D=3D3e9d2840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 233 P=3Dbe425040 D=3D3e9d3040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 233 P=3Dbe425840 D=3D3e9d3840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 234 P=3Dbe426040 D=3D3e9d4040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 234 P=3Dbe426840 D=3D3e9d4840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 234 P=3Dbe427040 D=3D3e9d5040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 234 P=3Dbe427840 D=3D3e9d5840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 235 P=3Dbe428040 D=3D3e9d6040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 235 P=3Dbe428840 D=3D3e9d6840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 235 P=3Dbe429040 D=3D3e9d7040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 235 P=3Dbe429840 D=3D3e9d7840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 236 P=3Dbe42a040 D=3D3e9d8040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 236 P=3Dbe42a840 D=3D3e9d8840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 243 P=3Dbe438040 D=3D3e9e6040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 243 P=3Dbe438840 D=3D3e9e6840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 243 P=3Dbe439040 D=3D3e9e7040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 243 P=3Dbe439840 D=3D3e9e7840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 244 P=3Dbe43a040 D=3D3e9e8040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 244 P=3Dbe43a840 D=3D3e9e8840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 244 P=3Dbe43b040 D=3D3e9e9040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 244 P=3Dbe43b840 D=3D3e9e9840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 245 P=3Dbe43c040 D=3D3e9ea040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 245 P=3Dbe43c840 D=3D3e9ea840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 245 P=3Dbe43d040 D=3D3e9eb040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 245 P=3Dbe43d840 D=3D3e9eb840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 246 P=3Dbe43e040 D=3D3e9ec040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 246 P=3Dbe43e840 D=3D3e9ec840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 246 P=3Dbe43f040 D=3D3e9ed040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 246 P=3Dbe43f840 D=3D3e9ed840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: coherent idx 264 P=3Dbe062000 D=3D3ea10000=
 L=3D2000 DMA_BIDIRECTIONAL
[   13.255338] tg3 0000:02:00.0: single idx 299 P=3Dbe0a8040 D=3D3ea56040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 299 P=3Dbe0a8840 D=3D3ea56840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 299 P=3Dbe0a9040 D=3D3ea57040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 299 P=3Dbe0a9840 D=3D3ea57840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 300 P=3Dbe0aa040 D=3D3ea58040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 300 P=3Dbe0aa840 D=3D3ea58840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 300 P=3Dbe0ab040 D=3D3ea59040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 300 P=3Dbe0ab840 D=3D3ea59840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 301 P=3Dbe0ac040 D=3D3ea5a040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 301 P=3Dbe0ac840 D=3D3ea5a840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 301 P=3Dbe0ad040 D=3D3ea5b040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 301 P=3Dbe0ad840 D=3D3ea5b840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 302 P=3Dbe0ae040 D=3D3ea5c040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 302 P=3Dbe0ae840 D=3D3ea5c840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 302 P=3Dbe0af040 D=3D3ea5d040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 302 P=3Dbe0af840 D=3D3ea5d840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 315 P=3Dbe8c8040 D=3D3e276040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 317 P=3Dbe8cd040 D=3D3e27b040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 317 P=3Dbe8cc840 D=3D3e27a840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 323 P=3Dbe8d8040 D=3D3e286040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 323 P=3Dbe8d8840 D=3D3e286840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 323 P=3Dbe8d9040 D=3D3e287040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 323 P=3Dbe8d9840 D=3D3e287840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 324 P=3Dbe8da040 D=3D3e288040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 324 P=3Dbe8da840 D=3D3e288840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 324 P=3Dbe8db040 D=3D3e289040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 324 P=3Dbe8db840 D=3D3e289840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 325 P=3Dbe8dc040 D=3D3e28a040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 325 P=3Dbe8dc840 D=3D3e28a840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 325 P=3Dbe8dd040 D=3D3e28b040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 325 P=3Dbe8dd840 D=3D3e28b840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 326 P=3Dbe8de040 D=3D3e28c040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 326 P=3Dbe8de840 D=3D3e28c840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 326 P=3Dbe8df040 D=3D3e28d040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 326 P=3Dbe8df840 D=3D3e28d840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] qla2xxx 0000:01:07.0: coherent idx 327 P=3Dbe8e0000 D=3D3e28=
e000 L=3D8040 DMA_BIDIRECTIONAL
[   13.255338] tg3 0000:02:00.0: single idx 347 P=3Dbe109840 D=3D3eab7840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 347 P=3Dbe109040 D=3D3eab7040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 347 P=3Dbe108840 D=3D3eab6840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 347 P=3Dbe108040 D=3D3eab6040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 348 P=3Dbe10b840 D=3D3eab9840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 348 P=3Dbe10b040 D=3D3eab9040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 348 P=3Dbe10a840 D=3D3eab8840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 348 P=3Dbe10a040 D=3D3eab8040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 349 P=3Dbe10d840 D=3D3eabb840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 349 P=3Dbe10c040 D=3D3eaba040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 349 P=3Dbe10c840 D=3D3eaba840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 350 P=3Dbe10f040 D=3D3eabd040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 350 P=3Dbe10f840 D=3D3eabd840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] qla2xxx 0000:01:07.0: coherent idx 389 P=3Dbe15d000 D=3D3eb0=
b000 L=3D60 DMA_BIDIRECTIONAL
[   13.255338] qla2xxx 0000:01:07.0: coherent idx 389 P=3Dbe15c000 D=3D3eb0=
a000 L=3D1000 DMA_BIDIRECTIONAL
[   13.255338] tg3 0000:02:00.0: coherent idx 389 P=3Dbe95c000 D=3D3e30a000=
 L=3D4000 DMA_BIDIRECTIONAL
[   13.255338] tg3 0000:02:00.0: single idx 391 P=3Dbe160040 D=3D3eb0e040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 391 P=3Dbe160840 D=3D3eb0e840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 391 P=3Dbe161040 D=3D3eb0f040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 391 P=3Dbe161840 D=3D3eb0f840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 392 P=3Dbe162040 D=3D3eb10040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 392 P=3Dbe162840 D=3D3eb10840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 392 P=3Dbe163040 D=3D3eb11040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 392 P=3Dbe55338] tg3 0000:02:00=
=2E0: single idx 393 P=3Dbe164840 D=3D3eb12840 L=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 393 P=3Dbe165040 D=3D3eb13040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 393 P=3Dbe165840 D=3D3eb13840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 394 P=3Dbe166040 D=3D3eb14040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 394 P=3Dbe166840 D=3D3eb14840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 394 P=3Dbe167040 D=3D3eb15040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 394 P=3Dbe167840 D=3D3eb15840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 487 P=3Dbe220040 D=3D3ebce040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 487 P=3Dbe220840 D=3D3ebce840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 487 P=3Dbe221840 D=3D3ebcf840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 488 P=3Dbe222040 D=3D3ebd0040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 488 P=3Dbe222840 D=3D3ebd0840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 488 P=3Dbe223040 D=3D3ebd1040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 488 P=3Dbe223840 D=3D3ebd1840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 489 P=3Dbe224040 D=3D3ebd2040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 489 P=3Dbe224840 D=3D3ebd2840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 489 P=3Dbe225040 D=3D3ebd3040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 489 P=3Dbe225840 D=3D3ebd3840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 490 P=3Dbe226040 D=3D3ebd4040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 490 P=3Dbe226840 D=3D3ebd4840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 490 P=3Dbe227040 D=3D3ebd5040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 490 P=3Dbe227840 D=3D3ebd5840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] ohci_hcd 0000:00:02.0: coherent idx 571 P=3D1011c000 D=3Dcfc=
77000 L=3D100 DMA_BIDIRECTIONAL
[   13.255338] sata_nv 0000:00:07.0: coherent idx 571 P=3Dffb9000 D=3Dcfc76=
000 L=3D800 DMA_BIDIRECTIONAL
[   13.255338] tg3 0000:02:00.0: single idx 595 P=3Dbdef8040 D=3D3eca6040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 595 P=3Dbdef8840 D=3D3eca6840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 595 P=3Dbdef9040 D=3D3eca7040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 595 P=3Dbdef9840 D=3D3eca7840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 596 P=3Dbdefa040 D=3D3eca8040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 596 P=3Dbdefa840 D=3D3eca8840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 596 P=3Dbdefb040 D=3D3eca9040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 596 P=3Dbdefb840 D=3D3eca9840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 597 P=3Dbdefc040 D=3D3ecaa040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 597 P=3Dbdefc840 D=3D3ecaa840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 597 P=3Dbdefd040 D=3D3ecab040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 597 P=3Dbdefd840 D=3D3ecab840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 598 P=3Dbdefe040 D=3D3ecac040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 598 P=3Dbdefe840 D=3D3ecac840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 598 P=3Dbdeff040 D=3D3ecad040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 598 P=3Dbdeff840 D=3D3ecad840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 625 P=3Dfe34840 D=3D12f4e3840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] sata_nv 0000:00:07.0: coherent idx 640 P=3Db6753000 D=3D4650=
1000 L=3D800 DMA_BIDIRECTIONAL
[   13.255338] tg3 0000:02:00.0: single idx 703 P=3Dbdfd0040 D=3D3ed7e040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 703 P=3Dbdfd0840 D=3D3ed7e840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 703 P=3Dbdfd1040 D=3D3ed7f040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 703 P=3Dbdfd1840 D=3D3ed7f840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 704 P=3Db67d3040 D=3D46581040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 704 P=3Dbdfd2040 D=3D3ed80040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 704 P=3Dbdfd2840 D=3D3ed80840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 704 P=3Dbdfd3040 D=3D3ed81040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 704 P=3Dbdfd3840 D=3D3ed81840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 705 P=3Dbdfd4040 D=3D3ed82040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 705 P=3Dbdfd4840 D=3D3ed82840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 705 P=3Dbdfd5040 D=3D3ed83040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 705 P=3Dbdfd5840 D=3D3ed83840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 706 P=3Dbdfd6040 D=3D3ed84040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 706 P=3Dbdfd6840 D=3D3ed84840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 706 P=3Dbdfd7040 D=3D3ed85040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 706 P=3Dbdfd7840 D=3D3ed85840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] ehci_hcd 0000:00:02.1: coherent idx 719 P=3D10115000 D=3D7cd=
9f000 L=3D1000 DMA_BIDIRECTIONAL
[   13.255338] ehci_hcd 0000:00:02.1: coherent idx 719 P=3D10116000 D=3D7cd=
9e000 L=3D1000 DMA_BIDIRECTIONAL
[   13.255338] ehci_hcd 0000:00:02.1: coherent idx 726 P=3D10117000 D=3D7cd=
ad000 L=3D800 DMA_BIDIRECTIONAL
[   13.255338] tg3 0000:02:00.0: coherent idx 731 P=3Dbe008000 D=3D3edb6000=
 L=3D4000 DMA_BIDIRECTIONAL
[   13.255338] tg3 0000:02:00.0: coherent idx 742 P=3Dbe01f000 D=3D3edcd000=
 L=3D800 DMA_BIDIRECTIONAL
[   13.255338] qla2xxx 0000:01:07.0: coherent idx 823 P=3Dbdcc0000 D=3D3ee6=
e000 L=3D20040 DMA_BIDIRECTIONAL
[   13.255338] qla2xxx 0000:01:07.0: coherent idx 853 P=3Dfffc000 D=3D12f6a=
b000 L=3D810 DMA_BIDIRECTIONAL
[   13.255338] qla2xxx 0000:01:07.0: coherent idx 854 P=3Dfffd000 D=3D12f6a=
c000 L=3D1000 DMA_BIDIRECTIONAL
[   13.255338] tg3 0000:02:00.0: single idx 983 P=3Dbe600040 D=3D3e7ae040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 983 P=3Dbe600840 D=3D3e7ae840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 983 P=3Dbe601040 D=3D3e7af040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 983 P=3Dbe601840 D=3D3e7af840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 984 P=3Dbe602040 D=3D3e7b0040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 984 P=3Dbe602840 D=3D3e7b0840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 984 P=3Dbe603040 D=3D3e7b1040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 984 P=3Dbe603840 D=3D3e7b1840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 985 P=3Dbe604040 D=3D3e7b2040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 985 P=3Dbe604840 D=3D3e7b2840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 985 P=3Dbe605040 D=3D3e7b3040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 985 P=3Dbe605840 D=3D3e7b3840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 986 P=3Dbe606040 D=3D3e7b4040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 986 P=3Dbe606840 D=3D3e7b4840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 986 P=3Dbe607040 D=3D3e7b5040 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 986 P=3Dbe607840 D=3D3e7b5840 L=
=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: single idx 1007 P=3D1012f040 D=3D12f7de040=
 L=3D640 DMA_FROM_DEVICE
[   13.255338] tg3 0000:02:00.0: coherent idx 1018 P=3Db6646000 D=3D467f400=
0 L=3D50 DMA_BIDIRECTIONAL
[   15.161628] Loading iSCSI transport class v2.0-870.
[   15.174052] iscsi: registered transport (tcp)
iscsistart: transport class version 2.0-870. iscsid version 2.0-872
Could not get list of targets from firmware.
Oct 26 01:2^G^G^G^G^G^G^G^G[   15.258546] Event-channel device installed.
Starting xenstored...Oct 26 01:23:44 tst001 xenstored: Checking store ...
Oct 26 01:23:44 tst001 xenstored: Checking store complete.
[   15.334317] XENBUS: Unable to read cpu state
[   15.340456] XENBUS: Unable to read cpu state
[   15.346475] XENBUS: Unable to read cpu state
[   15.352530] XENBUS: Unable to read cpu state

Setting domain 0 name...
Starting xenconsoled...
Oct 26 01:23:44 tst001 xenconsoled: Failed to open log /var/log/xen/console=
/hypervisor.log: 2 (No such file or directory)
xencommons should be started first.
[0:0:0:0]    disk    ATA      WDC WD800AAJS-18 01.0  /dev/sda=20
[2:0:0:0]    cd/dvd  HL-DT-ST DVD-ROM GDRH20N  0D04  /dev/sr0=20
00:00.0 Memory controller: nVidia Corporation CK804 Memory Controller (rev =
a4)
00:01.0 ISA bridge: nVidia Corporation CK804 ISA Bridge (rev f1)
00:01.1 SMBus: nVidia Corporation CK804 SMBus (rev a2)
00:02.0 USB Controller: nVidia Corporation CK804 USB Controller (rev a2)
00:02.1 USB Controller: nVidia Corporation CK804 USB Controller (rev a4)
00:07.0 IDE interface: nVidia Corporation CK804 Serial ATA Controller (rev =
f3)
00:08.0 IDE interface: nVidia Corporation CK804 Serial ATA Controller (rev =
f3)
00:09.0 PCI bridge: nVidia Corporation CK804 PCI Bridge (rev f2)
00:0b.0 PCI bridge: nVidia Corporation CK804 PCIE Bridge (rev f3)
00:0c.0 PCI bridge: nVidia Corporation CK804 PCIE Bridge (rev f3)
00:0d.0 PCI bridge: nVidia Corporation CK804 PCIE Bridge (rev f3)
00:0e.0 PCI bridge: nVidia Corporation CK804 PCIE Bridge (rev a3)
00:18.0 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, S=
empron] HyperTransport Configuration
00:18.1 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, S=
empron] Address Map
00:18.2 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, S=
empron] DRAM Controller
00:18.3 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, S=
empron] Miscellaneous Control
00:18.4 Host bridge: Advanced Micro Devices [AMD] K10 [Opteron, Athlon64, S=
empron] Link Control
01:07.0 Fibre Channel: QLogic Corp. SP202-based 2Gb Fibre Channel to PCI-X =
HBA (rev 03)
01:08.0 VGA compatible controller: ATI Technologies Inc ES1000 (rev 02)
02:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5722 Gigabit=
 Ethernet PCI Express
05:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Con=
troller (rev 06)
05:00.1 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Con=
troller (rev 06)
            CPU0       CPU1       CPU2       CPU3      =20
   1:          2          0          0          0  xen-pirq-ioapic-eden-pir=
q-ioapic-edge  rtc0
   9:          0          0          0          0  xen-pirq-ioapic-level  a=
cpi
  19:         11          0          0          0  xen-pirq-ioapic-level  q=
la2xxx
  20:        105          0          0          0  xen-pirq-ioapic-level  s=
ata_nv
  21:          4          0          0          0  xen-pirq-ioapic-level  s=
ata_nv
  22:          0          0          0          0  xen-pirq-ioapic-level  o=
hci_hcd:usb2
  23:          0          0          0          0  xen-pirq-ioapic-level  e=
hci_hcd:usb1
 272:       4815          0          0          0  xen-percpu-virq      tim=
er0
 273:         19          0          0          0  xen-percpu-ipi       spi=
nlock0
 274:       1625          0          0          0  xen-percpu-ipi       res=
ched0
 275:        225          0          0          0  xen-percpu-ipi       cal=
lfunc0
 276:          0          0          0          0  xen-percpu-virq      deb=
ug0
 277:         97          0          0          0  xen-percpu-ipi       cal=
lfuncsingle0
 278:          0       7500          0          0  xen-percpu-virq      tim=
er1
 279:          0         23          0          0  xen-percpu-ipi       spi=
nlock1
 280:          0       3140          0          0  xen-percpu-ipi       res=
ched1
 281:          0        222          0          0  xen-percpu-ipi       cal=
lfunc1
 282:          0          0          0          0  xen-percpu-virq      deb=
ug1
 283:          0        106          0          0  xen-percpu-ipi       cal=
lfuncsingle1
 284:          0          0       8315          0  xen-percpu-virq      tim=
er2
 285:          0          0         19          0  xen-percpu-ipi       spi=
nlock2
 286:          0          0       1950          0  xen-percpu-ipi       res=
ched2
 287:          0          0        259          0  xen-percpu-ipi       cal=
lfunc2
 288:          0          0          0          0  xen-percpu-virq      deb=
ug2
 289:          0          0        101          0  xen-percpu-ipi       cal=
lfuncsingle2
 290:          0          0          0       6209  xen-percpu-virq      tim=
er3
 291:          0          0          0         18  xen-percpu-ipi       spi=
nlock3
 292:          0          0          0       1783  xen-percpu-ipi       res=
ched3
 293:          0          0          0        248  xen-percpu-ipi       cal=
lfunc3
 294:          0          0          0          0  xen-percpu-virq      deb=
ug3
 295:          0          0          0         88  xen-percpu-ipi       cal=
lfuncsingle3
 296:         63          0          0          0   xen-dyn-event     xenbus
 301:        141          0          0          0  xen-percpu-virq      hvc=
_console
 302:        148          0          0          0  xen-pirq-msi       eth0
 303:         50          0          0          0   xen-dyn-event     evtch=
n:xenstored
 304:          0          0          0          0   xen-dyn-event     evtch=
n:xenstored
 NMI:          0          0          0          0   Non-maskable interrupts
 LOC:          0          0          0          0   Local timer interrupts
 SPU:          0          0          0          0   Spurious interrupts
 PMI:          0          0          0          0   Performance monitoring =
interrupts
 IWI:          0          0          0          0   IRQ work interrupts
 RES:       1625       3140       1950       1783   Rescheduling interrupts
 CAL:        322        328        360        336   Function call interrupts
 TLB:          0          0          0          0   TLB shootdowns
 TRM:          0          0          0          0   Thermal event interrupts
 THR:          0          0          0          0   Threshold APIC interrup=
ts
 MCE:          0          0          0          0   Machine check exceptions
 MCP:          0          0          0          0   Machine check polls
 ERR:          0
 MIS:          0
^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G^G00000000-0000ffff : reserved
00010000-0009cfff : System RAM
0009d000-0009d7ff : RAM buffer
0009d800-000fffff : reserved
  000a0000-000bffff : PCI Bus 0000:00
  000c0000-000dffff : PCI Bus 0000:00
    000c0000-000c8fff : Video ROM
    000c9000-000cadff : Adapter ROM
  000f0000-000fffff : System ROM
00100000-7ffeffff : System RAM
  01000000-0163e92d : Kernel code
  0163e92e-01ad5cff : Kernel data
  01d42000-01ef9fff : Kernel bss
7fff0000-7fffffff : reserved
80000000-cfeeffff : System RAM
cfef0000-cfef4fff : ACPI Tables
cfef5000-cff7efff : ACPI Non-volatile Storage
cff7f000-cff7ffff : RAM buffer
cff80000-cfffffff : reserved
d0000000-febfffff : PCI Bus 0000:00
  d0000000-d0000fff : 0000:00:02.0
    d0000000-d0000fff : ohci_hcd
  d0001000-d00010ff : 0000:00:02.1
    d0001000-d00010ff : ehci_hcd
  d0002000-d0002fff : 0000:00:07.0
    d0002000-d0002fff : sata_nv
  d0003000-d0003fff : 0000:00:08.0
    d0003000-d0003fff : sata_nv
  d0100000-d01fffff : PCI Bus 0000:01
    d0100000-d010ffff : 0000:01:08.0
    d0110000-d0110fff : 0000:01:07.0
      d0110000-d0110fff : qla2xxx
    d0120000-d013ffff : 0000:01:07.0
    d0140000-d015ffff : 0000:01:08.0
  d0200000-d02fffff : PCI Bus 0000:02
    d0200000-d020ffff : 0000:02:00.0
      d0200000-d020ffff : tg3
  d0300000-d03fffff : PCI Bus 0000:05
    d0300000-d031ffff : 0000:05:00.0
    d0320000-d033ffff : 0000:05:00.0
    d0340000-d035ffff : 0000:05:00.1
    d0360000-d037ffff : 0000:05:00.1
  d0400000-d04fffff : PCI Bus 0000:05
    d0400000-d041ffff : 0000:05:00.0
    d0420000-d043ffff : 0000:05:00.1
  d8000000-dfffffff : PCI Bus 0000:01
    d8000000-dfffffff : 0000:01:08.0
  e0000000-efffffff : reserved
    e0000000-efffffff : pnp 00:02
      e0000000-e04fffff : PCI MMCONFIG 0000 [bus 00-04]
fec00000-fec0ffff : reserved
  fec00000-fec003ff : IOAPIC 0
fed00000-fed00fff : pnp 00:00
  fed00000-fed003ff : HPET 0
fed40000-fed8ffff : PCI Bus 0000:00
fee00000-fee00fff : Local APIC
  fee00000-fee00fff : reserved
fff80000-ffffffff : reserved
100000000-12fffffff : System RAM

   ~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.4.9 |~~~~~~~~~~~~~~~~~~~~~~~~~~
        (c) 2001-2010  The world wide DirectFB Op004  Convergence (integrat=
ed media) GmbH
      ----------------------------------------------------------------

^G^G^G^G^G^G^G(*) DirectFB/Core: Single Application Core. (2011-10-27 03:49=
)=20
^G^G^Gsh-4.1# =07=07=07(*) Direct/Memcpy: Using libc memcpy()
=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=
=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=
=07=07=07=07=07(*) Direct/Thread: Started 'VT Switcher' (-1) [CRITICAL OTHE=
R/OTHER 0/0] <8388608>...
(*) Direct/Thread: Started 'VT Flusher' (-1) [DEFAULT OTHER/OTHER 0/0] <838=
8608>...
(*) DirectFB/FBDev: Found 'radeondrmfb' (ID 0) with frame buffer at 0xd8040=
000, 768k (MMIO 0x00000000, 0k)
(*) Direct/Thread: Started 'Keyboard Input' (-1) [INPUT OTHER/OTHER 0/0] <8=
388608>...
(*) DirectFB/Input: Keyboard 0.9 (directfb.org)
(*) Direct/Thread: Started 'PS/2 Input' (-1) [INPUT OTHER/OTHER 0/0] <83886=
08>...
(*) DirectFB/Input: IMPS/2 Mouse 1.0 (direct=07(*) Direct/Thread: Started '=
Linux Input' (-1) [INPUT OTHER/OTHER 0/0] <8388608>...
(*) DirectFB/Input: Power Button (1) 0.1 (dd: Started 'Hotplug with Linux I=
nput' (-1) [INPUT OTHER/OTHER 0/0] <8388608>...
=07=07=07(*) DirectFB/Input: Hot-plug detection enabled with Linux Input Dr=
iver=20
=07=07(*) DirectFB/Genefx: MMX detected and enabled
=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07=07(*) DirectFB/Graphics: MMX =
Software Rasterizer 0.6 (directfb.org)
(*) DirectFB/Core/WM: Default 0.3 (directfb.org)
(*) FBDev/Mode: Setting 1024x768 LUT8
(*) FBDev/Mode: Switched to 1024x768 (virtual 1024x768) at 8 bit (LUT8), pi=
tch 1024
[   20.642188] switch: no IPv6 routers present
[   21.202103] eth0: no IPv6 routers present
[   25.248086] switch: port 1(eth0) entering forwarding state
[   28.969466] qla2xxx [0000:01:07.0]-8038:4: Cable is unplugged...
[   28.970406] qla2xxx [0000:01:07.0]-803b:4: Firmware ready **** FAILED **=
**.

telnet> Connection closed.
[Connecting to system 1 ]

--C7zPtVaVf+AK4Oqc
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

--C7zPtVaVf+AK4Oqc--


From xen-devel-bounces@lists.xensource.com Wed Oct 26 22:35:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 22:35:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJIcX-00013n-9Y; Wed, 26 Oct 2011 22:35:17 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJIbz-0000rb-Rr
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 22:34:44 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1319693678!1214408!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13732 invoked from network); 27 Oct 2011 05:34:40 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-7.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 27 Oct 2011 05:34:40 -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
	p9R5YasT031576
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 05:34:37 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
	p9R5YZPi022403
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 05:34:35 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
	p9R5YTqG002908; Thu, 27 Oct 2011 00:34:30 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Wed, 26 Oct 2011 22:34:29 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 6D73182C24; Thu, 27 Oct 2011 01:34:28 -0400 (EDT)
Date: Thu, 27 Oct 2011 01:34:28 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: miche@google.com, gregkh@suse.de, linux-kernel@vger.kernel.org
Message-ID: <20111027053428.GA472@phenom.dumpdata.com>
References: <20111027053007.GA32765@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="Qxx1br4bt0+wmkIi"
Content-Disposition: inline
In-Reply-To: <20111027053007.GA32765@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.0A090209.4EA8ED6D.0170:SCFMA922111,ss=1,re=-10.500,fgs=0
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


--Qxx1br4bt0+wmkIi
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

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:
> 
> [    2.382984] console [hvc0] enabled
> [    2.382984] console [hvc0] enabled
> [    2.382984] console [hvc0] enabled
> [    2.382984] console [hvc0] enabled
> [    2.382984] console [hvc0] enabled
> [    2.382984] console [hvc0] enabled
> .. 
> 
> (see attached file titled bad.log)
> 
> If I use Linus's latest git tree and revert your patch I get the kernel
> to bootup (see good.log file),

Also see attached config file.

--Qxx1br4bt0+wmkIi
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=config

#
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 3.1.0 Kernel Configuration
#
CONFIG_64BIT=y
# CONFIG_X86_32 is not set
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_ARCH_CLOCKSOURCE_DATA=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_MMU=y
CONFIG_ZONE_DMA=y
CONFIG_NEED_DMA_MAP_STATE=y
CONFIG_NEED_SG_DMA_LENGTH=y
CONFIG_GENERIC_ISA_DMA=y
CONFIG_GENERIC_IOMAP=y
CONFIG_GENERIC_BUG=y
CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_ARCH_MAY_HAVE_PC_FDC=y
# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_ARCH_HAS_CPU_IDLE_WAIT=y
CONFIG_GENERIC_CALIBRATE_DELAY=y
CONFIG_GENERIC_TIME_VSYSCALL=y
CONFIG_ARCH_HAS_CPU_RELAX=y
CONFIG_ARCH_HAS_DEFAULT_IDLE=y
CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
CONFIG_HAVE_CPUMASK_OF_CPU_MAP=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ZONE_DMA32=y
CONFIG_ARCH_POPULATES_NODE_MAP=y
CONFIG_AUDIT_ARCH=y
CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_HAVE_INTEL_TXT=y
CONFIG_X86_64_SMP=y
CONFIG_X86_HT=y
CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11"
# CONFIG_KTIME_SCALAR is not set
CONFIG_ARCH_CPU_PROBE_RELEASE=y
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
CONFIG_HAVE_IRQ_WORK=y
CONFIG_IRQ_WORK=y

#
# General setup
#
CONFIG_EXPERIMENTAL=y
CONFIG_INIT_ENV_ARG_LIMIT=32
CONFIG_CROSS_COMPILE=""
CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
CONFIG_DEFAULT_HOSTNAME="(none)"
CONFIG_SWAP=y
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_BSD_PROCESS_ACCT_V3=y
# CONFIG_FHANDLE is not set
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_AUDIT=y
CONFIG_AUDITSYSCALL=y
CONFIG_AUDIT_WATCH=y
CONFIG_AUDIT_TREE=y
CONFIG_HAVE_GENERIC_HARDIRQS=y

#
# IRQ subsystem
#
CONFIG_GENERIC_HARDIRQS=y
CONFIG_HAVE_SPARSE_IRQ=y
CONFIG_GENERIC_IRQ_PROBE=y
CONFIG_GENERIC_IRQ_SHOW=y
CONFIG_GENERIC_PENDING_IRQ=y
CONFIG_IRQ_FORCED_THREADING=y
CONFIG_SPARSE_IRQ=y

#
# RCU Subsystem
#
CONFIG_TREE_PREEMPT_RCU=y
CONFIG_PREEMPT_RCU=y
# CONFIG_RCU_TRACE is not set
CONFIG_RCU_FANOUT=64
# CONFIG_RCU_FANOUT_EXACT is not set
# CONFIG_TREE_RCU_TRACE is not set
# CONFIG_RCU_BOOST is not set
# CONFIG_IKCONFIG is not set
CONFIG_LOG_BUF_SHIFT=18
CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
# CONFIG_CGROUP_DEVICE is not set
CONFIG_CPUSETS=y
CONFIG_PROC_PID_CPUSET=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_RESOURCE_COUNTERS=y
# CONFIG_CGROUP_MEM_RES_CTLR is not set
# CONFIG_CGROUP_PERF is not set
CONFIG_CGROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y
# CONFIG_CFS_BANDWIDTH is not set
# CONFIG_RT_GROUP_SCHED is not set
# CONFIG_BLK_CGROUP is not set
CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
# CONFIG_SCHED_AUTOGROUP is not set
CONFIG_SYSFS_DEPRECATED=y
# CONFIG_SYSFS_DEPRECATED_V2 is not set
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_ROOT_UID=0
CONFIG_INITRAMFS_ROOT_GID=0
CONFIG_RD_GZIP=y
CONFIG_RD_BZIP2=y
CONFIG_RD_LZMA=y
CONFIG_RD_XZ=y
CONFIG_RD_LZO=y
# CONFIG_INITRAMFS_COMPRESSION_NONE is not set
CONFIG_INITRAMFS_COMPRESSION_GZIP=y
# CONFIG_INITRAMFS_COMPRESSION_BZIP2 is not set
# CONFIG_INITRAMFS_COMPRESSION_LZMA is not set
# CONFIG_INITRAMFS_COMPRESSION_XZ is not set
# CONFIG_INITRAMFS_COMPRESSION_LZO is not set
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
CONFIG_SYSCTL=y
CONFIG_ANON_INODES=y
# CONFIG_EXPERT is not set
CONFIG_UID16=y
CONFIG_SYSCTL_SYSCALL=y
CONFIG_KALLSYMS=y
# CONFIG_KALLSYMS_ALL is not set
CONFIG_HOTPLUG=y
CONFIG_PRINTK=y
CONFIG_BUG=y
CONFIG_ELF_CORE=y
CONFIG_PCSPKR_PLATFORM=y
CONFIG_HAVE_PCSPKR_PLATFORM=y
CONFIG_BASE_FULL=y
CONFIG_FUTEX=y
CONFIG_EPOLL=y
CONFIG_SIGNALFD=y
CONFIG_TIMERFD=y
CONFIG_EVENTFD=y
CONFIG_SHMEM=y
CONFIG_AIO=y
# CONFIG_EMBEDDED is not set
CONFIG_HAVE_PERF_EVENTS=y

#
# Kernel Performance Events And Counters
#
CONFIG_PERF_EVENTS=y
# CONFIG_PERF_COUNTERS is not set
# CONFIG_DEBUG_PERF_USE_VMALLOC is not set
CONFIG_VM_EVENT_COUNTERS=y
CONFIG_PCI_QUIRKS=y
CONFIG_SLUB_DEBUG=y
# CONFIG_COMPAT_BRK is not set
# CONFIG_SLAB is not set
CONFIG_SLUB=y
CONFIG_PROFILING=y
CONFIG_TRACEPOINTS=y
# CONFIG_OPROFILE is not set
CONFIG_HAVE_OPROFILE=y
CONFIG_KPROBES=y
# CONFIG_JUMP_LABEL is not set
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
CONFIG_KRETPROBES=y
CONFIG_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_IOREMAP_PROT=y
CONFIG_HAVE_KPROBES=y
CONFIG_HAVE_KRETPROBES=y
CONFIG_HAVE_OPTPROBES=y
CONFIG_HAVE_ARCH_TRACEHOOK=y
CONFIG_HAVE_DMA_ATTRS=y
CONFIG_USE_GENERIC_SMP_HELPERS=y
CONFIG_HAVE_REGS_AND_STACK_ACCESS_API=y
CONFIG_HAVE_DMA_API_DEBUG=y
CONFIG_HAVE_HW_BREAKPOINT=y
CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y
CONFIG_HAVE_USER_RETURN_NOTIFIER=y
CONFIG_HAVE_PERF_EVENTS_NMI=y
CONFIG_HAVE_ARCH_JUMP_LABEL=y
CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y

#
# GCOV-based kernel profiling
#
# CONFIG_GCOV_KERNEL is not set
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
CONFIG_SLABINFO=y
CONFIG_RT_MUTEXES=y
CONFIG_BASE_SMALL=0
CONFIG_MODULES=y
# CONFIG_MODULE_FORCE_LOAD is not set
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_STOP_MACHINE=y
CONFIG_BLOCK=y
CONFIG_BLK_DEV_BSG=y
# CONFIG_BLK_DEV_BSGLIB is not set
# CONFIG_BLK_DEV_INTEGRITY is not set
CONFIG_BLOCK_COMPAT=y

#
# IO Schedulers
#
CONFIG_IOSCHED_NOOP=y
CONFIG_IOSCHED_DEADLINE=y
CONFIG_IOSCHED_CFQ=y
# CONFIG_DEFAULT_DEADLINE is not set
CONFIG_DEFAULT_CFQ=y
# CONFIG_DEFAULT_NOOP is not set
CONFIG_DEFAULT_IOSCHED="cfq"
CONFIG_PREEMPT_NOTIFIERS=y
# CONFIG_INLINE_SPIN_TRYLOCK is not set
# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
# CONFIG_INLINE_SPIN_LOCK is not set
# CONFIG_INLINE_SPIN_LOCK_BH is not set
# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
# CONFIG_INLINE_SPIN_UNLOCK is not set
# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
# CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set
# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
# CONFIG_INLINE_READ_TRYLOCK is not set
# CONFIG_INLINE_READ_LOCK is not set
# CONFIG_INLINE_READ_LOCK_BH is not set
# CONFIG_INLINE_READ_LOCK_IRQ is not set
# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
# CONFIG_INLINE_READ_UNLOCK is not set
# CONFIG_INLINE_READ_UNLOCK_BH is not set
# CONFIG_INLINE_READ_UNLOCK_IRQ is not set
# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
# CONFIG_INLINE_WRITE_TRYLOCK is not set
# CONFIG_INLINE_WRITE_LOCK is not set
# CONFIG_INLINE_WRITE_LOCK_BH is not set
# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
# CONFIG_INLINE_WRITE_UNLOCK is not set
# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
# CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set
# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
CONFIG_MUTEX_SPIN_ON_OWNER=y
CONFIG_FREEZER=y

#
# Processor type and features
#
CONFIG_TICK_ONESHOT=y
CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
CONFIG_SMP=y
CONFIG_X86_MPPARSE=y
# CONFIG_X86_EXTENDED_PLATFORM is not set
CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y
CONFIG_SCHED_OMIT_FRAME_POINTER=y
CONFIG_PARAVIRT_GUEST=y
# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set
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=y
CONFIG_KVM_CLOCK=y
CONFIG_KVM_GUEST=y
CONFIG_PARAVIRT=y
CONFIG_PARAVIRT_SPINLOCKS=y
CONFIG_PARAVIRT_CLOCK=y
CONFIG_PARAVIRT_DEBUG=y
CONFIG_NO_BOOTMEM=y
# CONFIG_MEMTEST is not set
# CONFIG_MK8 is not set
# CONFIG_MPSC is not set
# CONFIG_MCORE2 is not set
# CONFIG_MATOM is not set
CONFIG_GENERIC_CPU=y
CONFIG_X86_INTERNODE_CACHE_SHIFT=7
CONFIG_X86_CMPXCHG=y
CONFIG_CMPXCHG_LOCAL=y
CONFIG_CMPXCHG_DOUBLE=y
CONFIG_X86_L1_CACHE_SHIFT=6
CONFIG_X86_XADD=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_TSC=y
CONFIG_X86_CMPXCHG64=y
CONFIG_X86_CMOV=y
CONFIG_X86_MINIMUM_CPU_FAMILY=64
CONFIG_X86_DEBUGCTLMSR=y
CONFIG_CPU_SUP_INTEL=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_CENTAUR=y
CONFIG_HPET_TIMER=y
CONFIG_HPET_EMULATE_RTC=y
CONFIG_DMI=y
CONFIG_GART_IOMMU=y
CONFIG_CALGARY_IOMMU=y
CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y
CONFIG_SWIOTLB=y
CONFIG_IOMMU_HELPER=y
CONFIG_MAXSMP=y
CONFIG_NR_CPUS=4096
CONFIG_SCHED_SMT=y
CONFIG_SCHED_MC=y
CONFIG_IRQ_TIME_ACCOUNTING=y
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREEMPT=y
CONFIG_PREEMPT_COUNT=y
CONFIG_X86_LOCAL_APIC=y
CONFIG_X86_IO_APIC=y
CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS=y
CONFIG_X86_MCE=y
CONFIG_X86_MCE_INTEL=y
CONFIG_X86_MCE_AMD=y
CONFIG_X86_MCE_THRESHOLD=y
CONFIG_X86_MCE_INJECT=y
CONFIG_X86_THERMAL_VECTOR=y
# CONFIG_I8K is not set
CONFIG_MICROCODE=y
CONFIG_MICROCODE_INTEL=y
CONFIG_MICROCODE_AMD=y
CONFIG_MICROCODE_OLD_INTERFACE=y
CONFIG_X86_MSR=y
CONFIG_X86_CPUID=y
CONFIG_ARCH_PHYS_ADDR_T_64BIT=y
CONFIG_ARCH_DMA_ADDR_T_64BIT=y
CONFIG_DIRECT_GBPAGES=y
CONFIG_NUMA=y
CONFIG_AMD_NUMA=y
CONFIG_X86_64_ACPI_NUMA=y
CONFIG_NODES_SPAN_OTHER_NODES=y
# CONFIG_NUMA_EMU is not set
CONFIG_NODES_SHIFT=10
CONFIG_ARCH_SPARSEMEM_ENABLE=y
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
CONFIG_ARCH_PROC_KCORE_TEXT=y
CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
CONFIG_SELECT_MEMORY_MODEL=y
CONFIG_SPARSEMEM_MANUAL=y
CONFIG_SPARSEMEM=y
CONFIG_NEED_MULTIPLE_NODES=y
CONFIG_HAVE_MEMORY_PRESENT=y
CONFIG_SPARSEMEM_EXTREME=y
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER=y
CONFIG_SPARSEMEM_VMEMMAP=y
CONFIG_HAVE_MEMBLOCK=y
# CONFIG_MEMORY_HOTPLUG is not set
CONFIG_PAGEFLAGS_EXTENDED=y
CONFIG_SPLIT_PTLOCK_CPUS=4
CONFIG_COMPACTION=y
CONFIG_MIGRATION=y
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_ZONE_DMA_FLAG=1
CONFIG_BOUNCE=y
CONFIG_VIRT_TO_BUS=y
CONFIG_MMU_NOTIFIER=y
# CONFIG_KSM is not set
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
# CONFIG_MEMORY_FAILURE is not set
# CONFIG_TRANSPARENT_HUGEPAGE is not set
CONFIG_CLEANCACHE=y
CONFIG_X86_CHECK_BIOS_CORRUPTION=y
CONFIG_X86_BOOTPARAM_MEMORY_CORRUPTION_CHECK=y
CONFIG_X86_RESERVE_LOW=64
CONFIG_MTRR=y
# CONFIG_MTRR_SANITIZER is not set
CONFIG_X86_PAT=y
CONFIG_ARCH_USES_PG_UNCACHED=y
CONFIG_EFI=y
CONFIG_SECCOMP=y
CONFIG_CC_STACKPROTECTOR=y
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
CONFIG_SCHED_HRTICK=y
CONFIG_KEXEC=y
CONFIG_CRASH_DUMP=y
# CONFIG_KEXEC_JUMP is not set
CONFIG_PHYSICAL_START=0x1000000
CONFIG_RELOCATABLE=y
CONFIG_PHYSICAL_ALIGN=0x1000000
CONFIG_HOTPLUG_CPU=y
# CONFIG_COMPAT_VDSO is not set
# CONFIG_CMDLINE_BOOL is not set
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_USE_PERCPU_NUMA_NODE_ID=y

#
# Power management and ACPI options
#
CONFIG_ARCH_HIBERNATION_HEADER=y
CONFIG_SUSPEND=y
CONFIG_SUSPEND_FREEZER=y
CONFIG_HIBERNATE_CALLBACKS=y
CONFIG_HIBERNATION=y
CONFIG_PM_STD_PARTITION=""
CONFIG_PM_SLEEP=y
CONFIG_PM_SLEEP_SMP=y
# CONFIG_PM_RUNTIME is not set
CONFIG_PM=y
CONFIG_PM_DEBUG=y
# CONFIG_PM_ADVANCED_DEBUG is not set
# CONFIG_PM_TEST_SUSPEND is not set
CONFIG_CAN_PM_TRACE=y
CONFIG_PM_TRACE=y
CONFIG_PM_TRACE_RTC=y
CONFIG_ACPI=y
CONFIG_ACPI_SLEEP=y
CONFIG_ACPI_PROCFS=y
# CONFIG_ACPI_PROCFS_POWER is not set
# CONFIG_ACPI_EC_DEBUGFS is not set
CONFIG_ACPI_PROC_EVENT=y
CONFIG_ACPI_AC=y
CONFIG_ACPI_BATTERY=y
CONFIG_ACPI_BUTTON=y
CONFIG_ACPI_VIDEO=m
CONFIG_ACPI_FAN=y
CONFIG_ACPI_DOCK=y
CONFIG_ACPI_PROCESSOR=y
CONFIG_ACPI_HOTPLUG_CPU=y
# CONFIG_ACPI_PROCESSOR_AGGREGATOR is not set
CONFIG_ACPI_THERMAL=y
CONFIG_ACPI_NUMA=y
# CONFIG_ACPI_CUSTOM_DSDT is not set
CONFIG_ACPI_BLACKLIST_YEAR=0
CONFIG_ACPI_DEBUG=y
CONFIG_ACPI_DEBUG_FUNC_TRACE=y
# CONFIG_ACPI_PCI_SLOT is not set
CONFIG_X86_PM_TIMER=y
CONFIG_ACPI_CONTAINER=y
# CONFIG_ACPI_SBS is not set
# CONFIG_ACPI_HED is not set
# CONFIG_ACPI_CUSTOM_METHOD is not set
# CONFIG_ACPI_APEI is not set
# CONFIG_SFI is not set

#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_TABLE=y
# CONFIG_CPU_FREQ_STAT is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE=y
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
# CONFIG_CPU_FREQ_GOV_USERSPACE is not set
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y

#
# x86 CPU frequency scaling drivers
#
# CONFIG_X86_PCC_CPUFREQ is not set
CONFIG_X86_ACPI_CPUFREQ=y
CONFIG_X86_POWERNOW_K8=y
CONFIG_X86_SPEEDSTEP_CENTRINO=y
CONFIG_X86_P4_CLOCKMOD=y

#
# shared options
#
CONFIG_X86_SPEEDSTEP_LIB=y
CONFIG_CPU_IDLE=y
CONFIG_CPU_IDLE_GOV_LADDER=y
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_INTEL_IDLE is not set

#
# Memory power savings
#
# CONFIG_I7300_IDLE is not set

#
# Bus options (PCI etc.)
#
CONFIG_PCI=y
CONFIG_PCI_DIRECT=y
CONFIG_PCI_MMCONFIG=y
CONFIG_PCI_XEN=y
CONFIG_PCI_DOMAINS=y
# CONFIG_PCI_CNB20LE_QUIRK is not set
CONFIG_PCIEPORTBUS=y
# CONFIG_HOTPLUG_PCI_PCIE is not set
CONFIG_PCIEAER=y
CONFIG_PCIE_ECRC=y
# CONFIG_PCIEAER_INJECT is not set
CONFIG_PCIEASPM=y
# CONFIG_PCIEASPM_DEBUG is not set
CONFIG_ARCH_SUPPORTS_MSI=y
CONFIG_PCI_MSI=y
# CONFIG_PCI_DEBUG is not set
# CONFIG_PCI_STUB is not set
CONFIG_XEN_PCIDEV_FRONTEND=y
CONFIG_HT_IRQ=y
CONFIG_PCI_IOV=y
CONFIG_PCI_IOAPIC=y
CONFIG_PCI_LABEL=y
CONFIG_ISA_DMA_API=y
CONFIG_AMD_NB=y
CONFIG_PCCARD=y
CONFIG_PCMCIA=y
CONFIG_PCMCIA_LOAD_CIS=y
CONFIG_CARDBUS=y

#
# PC-card bridges
#
CONFIG_YENTA=y
CONFIG_YENTA_O2=y
CONFIG_YENTA_RICOH=y
CONFIG_YENTA_TI=y
CONFIG_YENTA_ENE_TUNE=y
CONFIG_YENTA_TOSHIBA=y
# CONFIG_PD6729 is not set
# CONFIG_I82092 is not set
CONFIG_PCCARD_NONSTATIC=y
CONFIG_HOTPLUG_PCI=y
# CONFIG_HOTPLUG_PCI_FAKE is not set
# CONFIG_HOTPLUG_PCI_ACPI is not set
# CONFIG_HOTPLUG_PCI_CPCI is not set
# CONFIG_HOTPLUG_PCI_SHPC is not set
# CONFIG_RAPIDIO is not set

#
# Executable file formats / Emulations
#
CONFIG_BINFMT_ELF=y
CONFIG_COMPAT_BINFMT_ELF=y
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS=y
# CONFIG_HAVE_AOUT is not set
CONFIG_BINFMT_MISC=y
CONFIG_IA32_EMULATION=y
# CONFIG_IA32_AOUT is not set
CONFIG_COMPAT=y
CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
CONFIG_SYSVIPC_COMPAT=y
CONFIG_KEYS_COMPAT=y
CONFIG_HAVE_TEXT_POKE_SMP=y
CONFIG_NET=y

#
# Networking options
#
CONFIG_PACKET=y
CONFIG_UNIX=y
CONFIG_XFRM=y
CONFIG_XFRM_USER=y
# CONFIG_XFRM_SUB_POLICY is not set
# CONFIG_XFRM_MIGRATE is not set
# CONFIG_XFRM_STATISTICS is not set
# CONFIG_NET_KEY is not set
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IP_ADVANCED_ROUTER=y
# CONFIG_IP_FIB_TRIE_STATS is not set
CONFIG_IP_MULTIPLE_TABLES=y
CONFIG_IP_ROUTE_MULTIPATH=y
CONFIG_IP_ROUTE_VERBOSE=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE_DEMUX is not set
CONFIG_IP_MROUTE=y
# CONFIG_IP_MROUTE_MULTIPLE_TABLES is not set
CONFIG_IP_PIMSM_V1=y
CONFIG_IP_PIMSM_V2=y
# CONFIG_ARPD is not set
CONFIG_SYN_COOKIES=y
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_INET_IPCOMP is not set
# CONFIG_INET_XFRM_TUNNEL is not set
CONFIG_INET_TUNNEL=y
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
# CONFIG_INET_XFRM_MODE_BEET is not set
CONFIG_INET_LRO=y
# CONFIG_INET_DIAG is not set
CONFIG_TCP_CONG_ADVANCED=y
# CONFIG_TCP_CONG_BIC is not set
CONFIG_TCP_CONG_CUBIC=y
# CONFIG_TCP_CONG_WESTWOOD is not set
# CONFIG_TCP_CONG_HTCP is not set
# CONFIG_TCP_CONG_HSTCP is not set
# CONFIG_TCP_CONG_HYBLA is not set
# CONFIG_TCP_CONG_VEGAS is not set
# CONFIG_TCP_CONG_SCALABLE is not set
# CONFIG_TCP_CONG_LP is not set
# CONFIG_TCP_CONG_VENO is not set
# CONFIG_TCP_CONG_YEAH is not set
# CONFIG_TCP_CONG_ILLINOIS is not set
CONFIG_DEFAULT_CUBIC=y
# CONFIG_DEFAULT_RENO is not set
CONFIG_DEFAULT_TCP_CONG="cubic"
CONFIG_TCP_MD5SIG=y
CONFIG_IPV6=y
# CONFIG_IPV6_PRIVACY is not set
# CONFIG_IPV6_ROUTER_PREF is not set
# CONFIG_IPV6_OPTIMISTIC_DAD is not set
CONFIG_INET6_AH=y
CONFIG_INET6_ESP=y
# CONFIG_INET6_IPCOMP is not set
# CONFIG_IPV6_MIP6 is not set
# CONFIG_INET6_XFRM_TUNNEL is not set
# CONFIG_INET6_TUNNEL is not set
CONFIG_INET6_XFRM_MODE_TRANSPORT=y
CONFIG_INET6_XFRM_MODE_TUNNEL=y
CONFIG_INET6_XFRM_MODE_BEET=y
# CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set
CONFIG_IPV6_SIT=y
# CONFIG_IPV6_SIT_6RD is not set
CONFIG_IPV6_NDISC_NODETYPE=y
# CONFIG_IPV6_TUNNEL is not set
# CONFIG_IPV6_MULTIPLE_TABLES is not set
# CONFIG_IPV6_MROUTE is not set
CONFIG_NETLABEL=y
CONFIG_NETWORK_SECMARK=y
# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
CONFIG_NETFILTER=y
# CONFIG_NETFILTER_DEBUG is not set
# CONFIG_NETFILTER_ADVANCED is not set

#
# Core Netfilter Configuration
#
CONFIG_NETFILTER_NETLINK=y
CONFIG_NETFILTER_NETLINK_LOG=y
CONFIG_NF_CONNTRACK=y
CONFIG_NF_CONNTRACK_SECMARK=y
CONFIG_NF_CONNTRACK_FTP=y
CONFIG_NF_CONNTRACK_IRC=y
CONFIG_NF_CONNTRACK_SIP=y
CONFIG_NF_CT_NETLINK=y
CONFIG_NETFILTER_XTABLES=y

#
# Xtables combined modules
#
CONFIG_NETFILTER_XT_MARK=m

#
# Xtables targets
#
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
CONFIG_NETFILTER_XT_TARGET_NFLOG=y
CONFIG_NETFILTER_XT_TARGET_SECMARK=y
CONFIG_NETFILTER_XT_TARGET_TCPMSS=y

#
# Xtables matches
#
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
CONFIG_NETFILTER_XT_MATCH_POLICY=y
CONFIG_NETFILTER_XT_MATCH_STATE=y
# CONFIG_IP_SET is not set
# CONFIG_IP_VS is not set

#
# IP: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV4=y
CONFIG_NF_CONNTRACK_IPV4=y
CONFIG_NF_CONNTRACK_PROC_COMPAT=y
CONFIG_IP_NF_IPTABLES=y
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_TARGET_REJECT=y
CONFIG_IP_NF_TARGET_LOG=y
CONFIG_IP_NF_TARGET_ULOG=y
CONFIG_NF_NAT=y
CONFIG_NF_NAT_NEEDED=y
CONFIG_IP_NF_TARGET_MASQUERADE=y
CONFIG_NF_NAT_FTP=y
CONFIG_NF_NAT_IRC=y
# CONFIG_NF_NAT_TFTP is not set
# CONFIG_NF_NAT_AMANDA is not set
# CONFIG_NF_NAT_PPTP is not set
# CONFIG_NF_NAT_H323 is not set
CONFIG_NF_NAT_SIP=y
CONFIG_IP_NF_MANGLE=y

#
# IPv6: Netfilter Configuration
#
CONFIG_NF_DEFRAG_IPV6=y
CONFIG_NF_CONNTRACK_IPV6=y
CONFIG_IP6_NF_IPTABLES=y
CONFIG_IP6_NF_MATCH_IPV6HEADER=y
CONFIG_IP6_NF_TARGET_LOG=y
CONFIG_IP6_NF_FILTER=y
CONFIG_IP6_NF_TARGET_REJECT=y
CONFIG_IP6_NF_MANGLE=y
# CONFIG_BRIDGE_NF_EBTABLES is not set
# CONFIG_IP_DCCP is not set
# CONFIG_IP_SCTP is not set
# CONFIG_RDS is not set
# CONFIG_TIPC is not set
# CONFIG_ATM is not set
# CONFIG_L2TP is not set
CONFIG_STP=y
CONFIG_BRIDGE=y
CONFIG_BRIDGE_IGMP_SNOOPING=y
# CONFIG_NET_DSA is not set
# CONFIG_VLAN_8021Q is not set
# CONFIG_DECNET is not set
CONFIG_LLC=y
# CONFIG_LLC2 is not set
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_PHONET is not set
# CONFIG_IEEE802154 is not set
CONFIG_NET_SCHED=y

#
# Queueing/Scheduling
#
# CONFIG_NET_SCH_CBQ is not set
# CONFIG_NET_SCH_HTB is not set
# CONFIG_NET_SCH_HFSC is not set
# CONFIG_NET_SCH_PRIO is not set
# CONFIG_NET_SCH_MULTIQ is not set
# CONFIG_NET_SCH_RED is not set
# CONFIG_NET_SCH_SFB is not set
# CONFIG_NET_SCH_SFQ is not set
# CONFIG_NET_SCH_TEQL is not set
# CONFIG_NET_SCH_TBF is not set
# CONFIG_NET_SCH_GRED is not set
# CONFIG_NET_SCH_DSMARK is not set
# CONFIG_NET_SCH_NETEM is not set
# CONFIG_NET_SCH_DRR is not set
# CONFIG_NET_SCH_MQPRIO is not set
# CONFIG_NET_SCH_CHOKE is not set
# CONFIG_NET_SCH_QFQ is not set
# CONFIG_NET_SCH_INGRESS is not set

#
# Classification
#
CONFIG_NET_CLS=y
# CONFIG_NET_CLS_BASIC is not set
# CONFIG_NET_CLS_TCINDEX is not set
# CONFIG_NET_CLS_ROUTE4 is not set
# CONFIG_NET_CLS_FW is not set
# CONFIG_NET_CLS_U32 is not set
# CONFIG_NET_CLS_RSVP is not set
# CONFIG_NET_CLS_RSVP6 is not set
# CONFIG_NET_CLS_FLOW is not set
# CONFIG_NET_CLS_CGROUP is not set
CONFIG_NET_EMATCH=y
CONFIG_NET_EMATCH_STACK=32
# CONFIG_NET_EMATCH_CMP is not set
# CONFIG_NET_EMATCH_NBYTE is not set
# CONFIG_NET_EMATCH_U32 is not set
# CONFIG_NET_EMATCH_META is not set
# CONFIG_NET_EMATCH_TEXT is not set
CONFIG_NET_CLS_ACT=y
# CONFIG_NET_ACT_POLICE is not set
# CONFIG_NET_ACT_GACT is not set
# CONFIG_NET_ACT_MIRRED is not set
# CONFIG_NET_ACT_IPT is not set
# CONFIG_NET_ACT_NAT is not set
# CONFIG_NET_ACT_PEDIT is not set
# CONFIG_NET_ACT_SIMP is not set
# CONFIG_NET_ACT_SKBEDIT is not set
# CONFIG_NET_ACT_CSUM is not set
CONFIG_NET_SCH_FIFO=y
# CONFIG_DCB is not set
CONFIG_DNS_RESOLVER=y
# CONFIG_BATMAN_ADV is not set
CONFIG_RPS=y
CONFIG_RFS_ACCEL=y
CONFIG_XPS=y
CONFIG_HAVE_BPF_JIT=y
# CONFIG_BPF_JIT is not set

#
# Network testing
#
# CONFIG_NET_PKTGEN is not set
# CONFIG_NET_TCPPROBE is not set
# CONFIG_NET_DROP_MONITOR is not set
# CONFIG_HAMRADIO is not set
# CONFIG_CAN is not set
# CONFIG_IRDA is not set
# CONFIG_BT is not set
# CONFIG_AF_RXRPC is not set
CONFIG_FIB_RULES=y
# CONFIG_WIRELESS is not set
# CONFIG_WIMAX is not set
CONFIG_RFKILL=y
CONFIG_RFKILL_INPUT=y
# CONFIG_NET_9P is not set
# CONFIG_CAIF is not set
# CONFIG_CEPH_LIB is not set
# CONFIG_NFC is not set

#
# Device Drivers
#

#
# Generic Driver Options
#
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
# CONFIG_DEVTMPFS is not set
CONFIG_STANDALONE=y
CONFIG_PREVENT_FIRMWARE_BUILD=y
CONFIG_FW_LOADER=y
CONFIG_FIRMWARE_IN_KERNEL=y
CONFIG_EXTRA_FIRMWARE=""
# CONFIG_DEBUG_DRIVER is not set
CONFIG_DEBUG_DEVRES=y
CONFIG_SYS_HYPERVISOR=y
CONFIG_CONNECTOR=y
CONFIG_PROC_EVENTS=y
# CONFIG_MTD is not set
# CONFIG_PARPORT is not set
CONFIG_PNP=y
CONFIG_PNP_DEBUG_MESSAGES=y

#
# Protocols
#
CONFIG_PNPACPI=y
CONFIG_BLK_DEV=y
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_UMEM is not set
# CONFIG_BLK_DEV_COW_COMMON is not set
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
# CONFIG_BLK_DEV_DRBD is not set
# CONFIG_BLK_DEV_NBD is not set
# CONFIG_BLK_DEV_SX8 is not set
# CONFIG_BLK_DEV_UB is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_COUNT=16
CONFIG_BLK_DEV_RAM_SIZE=16384
# CONFIG_BLK_DEV_XIP is not set
# CONFIG_CDROM_PKTCDVD is not set
# CONFIG_ATA_OVER_ETH is not set
CONFIG_XEN_BLKDEV_FRONTEND=m
CONFIG_XEN_BLKDEV_BACKEND=y
CONFIG_VIRTIO_BLK=m
# CONFIG_BLK_DEV_HD is not set
# CONFIG_BLK_DEV_RBD is not set
# CONFIG_SENSORS_LIS3LV02D is not set
# CONFIG_MISC_DEVICES is not set
CONFIG_HAVE_IDE=y
# CONFIG_IDE is not set

#
# SCSI device support
#
CONFIG_SCSI_MOD=m
CONFIG_RAID_ATTRS=m
CONFIG_SCSI=m
CONFIG_SCSI_DMA=y
CONFIG_SCSI_TGT=m
CONFIG_SCSI_NETLINK=y
CONFIG_SCSI_PROC_FS=y

#
# SCSI support type (disk, tape, CD-ROM)
#
CONFIG_BLK_DEV_SD=m
CONFIG_CHR_DEV_ST=m
CONFIG_CHR_DEV_OSST=m
CONFIG_BLK_DEV_SR=m
CONFIG_BLK_DEV_SR_VENDOR=y
CONFIG_CHR_DEV_SG=m
CONFIG_CHR_DEV_SCH=m
CONFIG_SCSI_MULTI_LUN=y
CONFIG_SCSI_CONSTANTS=y
CONFIG_SCSI_LOGGING=y
CONFIG_SCSI_SCAN_ASYNC=y
CONFIG_SCSI_WAIT_SCAN=m

#
# SCSI Transports
#
CONFIG_SCSI_SPI_ATTRS=m
CONFIG_SCSI_FC_ATTRS=m
CONFIG_SCSI_FC_TGT_ATTRS=y
CONFIG_SCSI_ISCSI_ATTRS=m
CONFIG_SCSI_SAS_ATTRS=m
CONFIG_SCSI_SAS_LIBSAS=m
CONFIG_SCSI_SAS_ATA=y
CONFIG_SCSI_SAS_HOST_SMP=y
# CONFIG_SCSI_SRP_ATTRS is not set
CONFIG_SCSI_LOWLEVEL=y
CONFIG_ISCSI_TCP=m
CONFIG_ISCSI_BOOT_SYSFS=m
# CONFIG_SCSI_CXGB3_ISCSI is not set
# CONFIG_SCSI_CXGB4_ISCSI is not set
# CONFIG_SCSI_BNX2_ISCSI is not set
# CONFIG_SCSI_BNX2X_FCOE is not set
# CONFIG_BE2ISCSI is not set
CONFIG_BLK_DEV_3W_XXXX_RAID=m
# CONFIG_SCSI_HPSA is not set
CONFIG_SCSI_3W_9XXX=m
# CONFIG_SCSI_3W_SAS is not set
CONFIG_SCSI_ACARD=m
CONFIG_SCSI_AACRAID=m
CONFIG_SCSI_AIC7XXX=m
CONFIG_AIC7XXX_CMDS_PER_DEVICE=8
CONFIG_AIC7XXX_RESET_DELAY_MS=15000
CONFIG_AIC7XXX_DEBUG_ENABLE=y
CONFIG_AIC7XXX_DEBUG_MASK=0
CONFIG_AIC7XXX_REG_PRETTY_PRINT=y
CONFIG_SCSI_AIC7XXX_OLD=m
CONFIG_SCSI_AIC79XX=m
CONFIG_AIC79XX_CMDS_PER_DEVICE=32
CONFIG_AIC79XX_RESET_DELAY_MS=15000
CONFIG_AIC79XX_DEBUG_ENABLE=y
CONFIG_AIC79XX_DEBUG_MASK=0
CONFIG_AIC79XX_REG_PRETTY_PRINT=y
CONFIG_SCSI_AIC94XX=m
# CONFIG_AIC94XX_DEBUG is not set
CONFIG_SCSI_MVSAS=m
# CONFIG_SCSI_MVSAS_DEBUG is not set
# CONFIG_SCSI_MVSAS_TASKLET is not set
CONFIG_SCSI_DPT_I2O=m
CONFIG_SCSI_ADVANSYS=m
CONFIG_SCSI_ARCMSR=m
CONFIG_SCSI_ARCMSR_AER=y
CONFIG_MEGARAID_NEWGEN=y
CONFIG_MEGARAID_MM=m
CONFIG_MEGARAID_MAILBOX=m
CONFIG_MEGARAID_LEGACY=m
CONFIG_MEGARAID_SAS=m
CONFIG_SCSI_MPT2SAS=m
CONFIG_SCSI_MPT2SAS_MAX_SGE=128
CONFIG_SCSI_MPT2SAS_LOGGING=y
CONFIG_SCSI_HPTIOP=m
CONFIG_SCSI_BUSLOGIC=m
# CONFIG_VMWARE_PVSCSI is not set
CONFIG_LIBFC=m
CONFIG_LIBFCOE=m
CONFIG_FCOE=m
# CONFIG_FCOE_FNIC is not set
CONFIG_SCSI_DMX3191D=m
CONFIG_SCSI_EATA=m
CONFIG_SCSI_EATA_TAGGED_QUEUE=y
CONFIG_SCSI_EATA_LINKED_COMMANDS=y
CONFIG_SCSI_EATA_MAX_TAGS=16
CONFIG_SCSI_FUTURE_DOMAIN=m
CONFIG_SCSI_GDTH=m
CONFIG_SCSI_ISCI=m
CONFIG_SCSI_IPS=m
CONFIG_SCSI_INITIO=m
# CONFIG_SCSI_INIA100 is not set
CONFIG_SCSI_STEX=m
CONFIG_SCSI_SYM53C8XX_2=m
CONFIG_SCSI_SYM53C8XX_DMA_ADDRESSING_MODE=1
CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16
CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64
CONFIG_SCSI_SYM53C8XX_MMIO=y
CONFIG_SCSI_IPR=m
# CONFIG_SCSI_IPR_TRACE is not set
# CONFIG_SCSI_IPR_DUMP is not set
CONFIG_SCSI_QLOGIC_1280=m
CONFIG_SCSI_QLA_FC=m
# CONFIG_SCSI_QLA_ISCSI is not set
CONFIG_SCSI_LPFC=m
# CONFIG_SCSI_LPFC_DEBUG_FS is not set
CONFIG_SCSI_DC395x=m
CONFIG_SCSI_DC390T=m
CONFIG_SCSI_DEBUG=m
# CONFIG_SCSI_PMCRAID is not set
# CONFIG_SCSI_PM8001 is not set
CONFIG_SCSI_SRP=m
# CONFIG_SCSI_BFA_FC is not set
# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
# CONFIG_SCSI_DH is not set
# CONFIG_SCSI_OSD_INITIATOR is not set
CONFIG_ATA=m
# CONFIG_ATA_NONSTANDARD is not set
CONFIG_ATA_VERBOSE_ERROR=y
CONFIG_ATA_ACPI=y
CONFIG_SATA_PMP=y

#
# Controllers with non-SFF native interface
#
CONFIG_SATA_AHCI=m
# CONFIG_SATA_AHCI_PLATFORM is not set
CONFIG_SATA_INIC162X=m
# CONFIG_SATA_ACARD_AHCI is not set
CONFIG_SATA_SIL24=m
CONFIG_ATA_SFF=y

#
# SFF controllers with custom DMA interface
#
CONFIG_PDC_ADMA=m
CONFIG_SATA_QSTOR=m
CONFIG_SATA_SX4=m
CONFIG_ATA_BMDMA=y

#
# SATA SFF controllers with BMDMA
#
CONFIG_ATA_PIIX=m
CONFIG_SATA_MV=m
CONFIG_SATA_NV=m
CONFIG_SATA_PROMISE=m
CONFIG_SATA_SIL=m
CONFIG_SATA_SIS=m
CONFIG_SATA_SVW=m
CONFIG_SATA_ULI=m
CONFIG_SATA_VIA=m
CONFIG_SATA_VITESSE=m

#
# PATA SFF controllers with BMDMA
#
# CONFIG_PATA_ALI is not set
# CONFIG_PATA_AMD is not set
# CONFIG_PATA_ARASAN_CF is not set
# CONFIG_PATA_ARTOP is not set
# CONFIG_PATA_ATIIXP is not set
# CONFIG_PATA_ATP867X is not set
# CONFIG_PATA_CMD64X is not set
# CONFIG_PATA_CS5520 is not set
# CONFIG_PATA_CS5530 is not set
# CONFIG_PATA_CS5536 is not set
# CONFIG_PATA_CYPRESS is not set
CONFIG_PATA_EFAR=m
# CONFIG_PATA_HPT366 is not set
# CONFIG_PATA_HPT37X is not set
# CONFIG_PATA_HPT3X2N is not set
# CONFIG_PATA_HPT3X3 is not set
# CONFIG_PATA_IT8213 is not set
# CONFIG_PATA_IT821X is not set
# CONFIG_PATA_JMICRON is not set
CONFIG_PATA_MARVELL=m
# CONFIG_PATA_NETCELL is not set
# CONFIG_PATA_NINJA32 is not set
# CONFIG_PATA_NS87415 is not set
# CONFIG_PATA_OLDPIIX is not set
# CONFIG_PATA_OPTIDMA is not set
# CONFIG_PATA_PDC2027X is not set
CONFIG_PATA_PDC_OLD=m
CONFIG_PATA_RADISYS=m
# CONFIG_PATA_RDC is not set
# CONFIG_PATA_SC1200 is not set
CONFIG_PATA_SCH=m
# CONFIG_PATA_SERVERWORKS is not set
# CONFIG_PATA_SIL680 is not set
CONFIG_PATA_SIS=m
# CONFIG_PATA_TOSHIBA is not set
# CONFIG_PATA_TRIFLEX is not set
# CONFIG_PATA_VIA is not set
CONFIG_PATA_WINBOND=m

#
# PIO-only SFF controllers
#
# CONFIG_PATA_CMD640_PCI is not set
# CONFIG_PATA_MPIIX is not set
# CONFIG_PATA_NS87410 is not set
# CONFIG_PATA_OPTI is not set
CONFIG_PATA_PCMCIA=m
# CONFIG_PATA_RZ1000 is not set

#
# Generic fallback / legacy drivers
#
# CONFIG_PATA_ACPI is not set
CONFIG_ATA_GENERIC=m
CONFIG_PATA_LEGACY=m
CONFIG_MD=y
CONFIG_BLK_DEV_MD=m
CONFIG_MD_LINEAR=m
CONFIG_MD_RAID0=m
CONFIG_MD_RAID1=m
CONFIG_MD_RAID10=m
CONFIG_MD_RAID456=m
# CONFIG_MULTICORE_RAID456 is not set
CONFIG_MD_MULTIPATH=m
CONFIG_MD_FAULTY=m
CONFIG_BLK_DEV_DM=m
# CONFIG_DM_DEBUG is not set
CONFIG_DM_CRYPT=m
CONFIG_DM_SNAPSHOT=m
CONFIG_DM_MIRROR=m
# CONFIG_DM_RAID is not set
# CONFIG_DM_LOG_USERSPACE is not set
CONFIG_DM_ZERO=m
CONFIG_DM_MULTIPATH=m
# CONFIG_DM_MULTIPATH_QL is not set
# CONFIG_DM_MULTIPATH_ST is not set
CONFIG_DM_DELAY=m
# CONFIG_DM_UEVENT is not set
# CONFIG_DM_FLAKEY is not set
CONFIG_TARGET_CORE=m
CONFIG_TCM_IBLOCK=m
CONFIG_TCM_FILEIO=m
CONFIG_TCM_PSCSI=m
CONFIG_LOOPBACK_TARGET=m
CONFIG_TCM_FC=m
CONFIG_ISCSI_TARGET=m
CONFIG_FUSION=y
CONFIG_FUSION_SPI=m
CONFIG_FUSION_FC=m
CONFIG_FUSION_SAS=m
CONFIG_FUSION_MAX_SGE=40
CONFIG_FUSION_CTL=m
# CONFIG_FUSION_LOGGING is not set

#
# IEEE 1394 (FireWire) support
#
# CONFIG_FIREWIRE is not set
# CONFIG_FIREWIRE_NOSY is not set
# CONFIG_I2O is not set
CONFIG_MACINTOSH_DRIVERS=y
CONFIG_MAC_EMUMOUSEBTN=y
CONFIG_NETDEVICES=y
CONFIG_NET_CORE=y
# CONFIG_BONDING is not set
# CONFIG_DUMMY is not set
# CONFIG_EQUALIZER is not set
# CONFIG_NET_FC is not set
CONFIG_MII=m
# CONFIG_IFB is not set
# CONFIG_MACVLAN is not set
CONFIG_NETCONSOLE=m
# CONFIG_NETCONSOLE_DYNAMIC is not set
CONFIG_NETPOLL=y
# CONFIG_NETPOLL_TRAP is not set
CONFIG_NET_POLL_CONTROLLER=y
CONFIG_TUN=y
# CONFIG_VETH is not set
CONFIG_VIRTIO_NET=m
CONFIG_SUNGEM_PHY=m
# CONFIG_ARCNET is not set

#
# CAIF transport drivers
#
CONFIG_ETHERNET=y
CONFIG_MDIO=m
CONFIG_NET_VENDOR_3COM=y
# CONFIG_PCMCIA_3C574 is not set
# CONFIG_PCMCIA_3C589 is not set
CONFIG_VORTEX=m
CONFIG_TYPHOON=m
CONFIG_NET_VENDOR_ADAPTEC=y
# CONFIG_ADAPTEC_STARFIRE is not set
CONFIG_NET_VENDOR_ALTEON=y
# CONFIG_ACENIC is not set
CONFIG_NET_VENDOR_AMD=y
# CONFIG_AMD8111_ETH is not set
# CONFIG_PCNET32 is not set
# CONFIG_PCMCIA_NMCLAN is not set
CONFIG_NET_VENDOR_ATHEROS=y
# CONFIG_ATL2 is not set
# CONFIG_ATL1 is not set
# CONFIG_ATL1E is not set
CONFIG_ATL1C=m
CONFIG_NET_VENDOR_BROADCOM=y
# CONFIG_B44 is not set
CONFIG_BNX2=m
# CONFIG_CNIC is not set
CONFIG_TIGON3=y
CONFIG_BNX2X=m
CONFIG_NET_VENDOR_BROCADE=y
# CONFIG_BNA is not set
CONFIG_NET_VENDOR_CHELSIO=y
# CONFIG_CHELSIO_T1 is not set
# CONFIG_CHELSIO_T3 is not set
# CONFIG_CHELSIO_T4 is not set
# CONFIG_CHELSIO_T4VF is not set
CONFIG_NET_VENDOR_CISCO=y
# CONFIG_ENIC is not set
# CONFIG_DNET is not set
CONFIG_NET_VENDOR_DEC=y
CONFIG_NET_TULIP=y
# CONFIG_DE2104X is not set
# CONFIG_TULIP is not set
# CONFIG_DE4X5 is not set
# CONFIG_WINBOND_840 is not set
# CONFIG_DM9102 is not set
# CONFIG_ULI526X is not set
# CONFIG_PCMCIA_XIRCOM is not set
CONFIG_NET_VENDOR_DLINK=y
# CONFIG_DL2K is not set
# CONFIG_SUNDANCE is not set
CONFIG_NET_VENDOR_EMULEX=y
# CONFIG_BE2NET is not set
CONFIG_NET_VENDOR_EXAR=y
# CONFIG_S2IO is not set
# CONFIG_VXGE is not set
CONFIG_NET_VENDOR_FUJITSU=y
# CONFIG_PCMCIA_FMVJ18X is not set
CONFIG_NET_VENDOR_HP=y
# CONFIG_HP100 is not set
CONFIG_NET_VENDOR_INTEL=y
CONFIG_E100=m
CONFIG_E1000=m
CONFIG_E1000E=m
CONFIG_IGB=m
CONFIG_IGBVF=m
# CONFIG_IXGB is not set
CONFIG_IXGBE=m
# CONFIG_IXGBEVF is not set
CONFIG_NET_VENDOR_I825XX=y
# CONFIG_ZNET is not set
# CONFIG_IP1000 is not set
# CONFIG_JME is not set
CONFIG_NET_VENDOR_MARVELL=y
CONFIG_SKGE=m
# CONFIG_SKGE_DEBUG is not set
# CONFIG_SKGE_GENESIS is not set
CONFIG_SKY2=m
# CONFIG_SKY2_DEBUG is not set
CONFIG_NET_VENDOR_MELLANOX=y
# CONFIG_MLX4_EN is not set
# CONFIG_MLX4_CORE is not set
CONFIG_NET_VENDOR_MICREL=y
# CONFIG_KS8851_MLL is not set
# CONFIG_KSZ884X_PCI is not set
CONFIG_NET_VENDOR_MYRI=y
# CONFIG_MYRI10GE is not set
# CONFIG_FEALNX is not set
CONFIG_NET_VENDOR_NATSEMI=y
# CONFIG_NATSEMI is not set
# CONFIG_NS83820 is not set
CONFIG_NET_VENDOR_8390=y
# CONFIG_PCMCIA_AXNET is not set
CONFIG_NE2K_PCI=m
# CONFIG_PCMCIA_PCNET is not set
CONFIG_NET_VENDOR_NVIDIA=y
CONFIG_FORCEDETH=y
CONFIG_NET_VENDOR_OKI=y
# CONFIG_PCH_GBE is not set
# CONFIG_ETHOC is not set
# CONFIG_NET_PACKET_ENGINE is not set
CONFIG_NET_VENDOR_QLOGIC=y
# CONFIG_QLA3XXX is not set
# CONFIG_QLCNIC is not set
# CONFIG_QLGE is not set
# CONFIG_NETXEN_NIC is not set
CONFIG_NET_VENDOR_REALTEK=y
# CONFIG_8139CP is not set
CONFIG_8139TOO=m
# CONFIG_8139TOO_PIO is not set
# CONFIG_8139TOO_TUNE_TWISTER is not set
# CONFIG_8139TOO_8129 is not set
# CONFIG_8139_OLD_RX_RESET is not set
CONFIG_R8169=m
CONFIG_SC92031=m
CONFIG_NET_VENDOR_RDC=y
# CONFIG_R6040 is not set
CONFIG_NET_VENDOR_SEEQ=y
# CONFIG_SEEQ8005 is not set
CONFIG_NET_VENDOR_SIS=y
# CONFIG_SIS900 is not set
# CONFIG_SIS190 is not set
# CONFIG_SFC is not set
CONFIG_NET_VENDOR_SMSC=y
# CONFIG_PCMCIA_SMC91C92 is not set
# CONFIG_EPIC100 is not set
# CONFIG_SMSC9420 is not set
CONFIG_NET_VENDOR_STMICRO=y
# CONFIG_STMMAC_ETH is not set
CONFIG_NET_VENDOR_SUN=y
CONFIG_HAPPYMEAL=m
CONFIG_SUNGEM=m
CONFIG_CASSINI=m
# CONFIG_NIU is not set
CONFIG_NET_VENDOR_TEHUTI=y
# CONFIG_TEHUTI is not set
CONFIG_NET_VENDOR_TI=y
CONFIG_TLAN=m
CONFIG_NET_VENDOR_VIA=y
CONFIG_VIA_RHINE=m
# CONFIG_VIA_RHINE_MMIO is not set
CONFIG_VIA_VELOCITY=m
CONFIG_NET_VENDOR_XIRCOM=y
# CONFIG_PCMCIA_XIRC2PS is not set
CONFIG_FDDI=y
# CONFIG_DEFXX is not set
# CONFIG_SKFP is not set
# CONFIG_NET_SB1000 is not set
CONFIG_PHYLIB=y

#
# MII PHY device drivers
#
CONFIG_MARVELL_PHY=m
CONFIG_DAVICOM_PHY=m
CONFIG_QSEMI_PHY=m
CONFIG_LXT_PHY=m
CONFIG_CICADA_PHY=m
CONFIG_VITESSE_PHY=m
CONFIG_SMSC_PHY=m
CONFIG_BROADCOM_PHY=m
# CONFIG_ICPLUS_PHY is not set
# CONFIG_REALTEK_PHY is not set
# CONFIG_NATIONAL_PHY is not set
# CONFIG_STE10XP is not set
# CONFIG_LSI_ET1011C_PHY is not set
# CONFIG_MICREL_PHY is not set
CONFIG_FIXED_PHY=y
# CONFIG_MDIO_BITBANG is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
CONFIG_TR=y
# CONFIG_PCMCIA_IBMTR is not set
# CONFIG_IBMOL is not set
CONFIG_3C359=m
# CONFIG_TMS380TR is not set

#
# USB Network Adapters
#
# CONFIG_USB_CATC is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_RTL8150 is not set
# CONFIG_USB_USBNET is not set
# CONFIG_USB_HSO is not set
# CONFIG_USB_IPHETH is not set
# CONFIG_WLAN is not set

#
# Enable WiMAX (Networking options) to see the WiMAX drivers
#
# CONFIG_WAN is not set
CONFIG_XEN_NETDEV_FRONTEND=m
CONFIG_XEN_NETDEV_BACKEND=y
# CONFIG_VMXNET3 is not set
# CONFIG_ISDN is not set
# CONFIG_PHONE is not set

#
# Input device support
#
CONFIG_INPUT=y
CONFIG_INPUT_FF_MEMLESS=m
# CONFIG_INPUT_POLLDEV is not set
CONFIG_INPUT_SPARSEKMAP=y

#
# Userland interfaces
#
CONFIG_INPUT_MOUSEDEV=y
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_JOYDEV is not set
CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set

#
# Input Device Drivers
#
CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ADP5588 is not set
# CONFIG_KEYBOARD_ADP5589 is not set
CONFIG_KEYBOARD_ATKBD=y
# CONFIG_KEYBOARD_QT1070 is not set
# CONFIG_KEYBOARD_QT2160 is not set
# CONFIG_KEYBOARD_LKKBD is not set
# CONFIG_KEYBOARD_TCA6416 is not set
# CONFIG_KEYBOARD_LM8323 is not set
# CONFIG_KEYBOARD_MAX7359 is not set
# CONFIG_KEYBOARD_MCS is not set
# CONFIG_KEYBOARD_MPR121 is not set
# CONFIG_KEYBOARD_NEWTON is not set
# CONFIG_KEYBOARD_OPENCORES is not set
# CONFIG_KEYBOARD_STOWAWAY is not set
# CONFIG_KEYBOARD_SUNKBD is not set
# CONFIG_KEYBOARD_XTKBD is not set
CONFIG_INPUT_MOUSE=y
CONFIG_MOUSE_PS2=y
CONFIG_MOUSE_PS2_ALPS=y
CONFIG_MOUSE_PS2_LOGIPS2PP=y
CONFIG_MOUSE_PS2_SYNAPTICS=y
CONFIG_MOUSE_PS2_LIFEBOOK=y
CONFIG_MOUSE_PS2_TRACKPOINT=y
# CONFIG_MOUSE_PS2_ELANTECH is not set
# CONFIG_MOUSE_PS2_SENTELIC is not set
# CONFIG_MOUSE_PS2_TOUCHKIT is not set
# CONFIG_MOUSE_SERIAL is not set
# CONFIG_MOUSE_APPLETOUCH is not set
# CONFIG_MOUSE_BCM5974 is not set
# CONFIG_MOUSE_VSXXXAA is not set
# CONFIG_MOUSE_SYNAPTICS_I2C is not set
CONFIG_INPUT_JOYSTICK=y
# CONFIG_JOYSTICK_ANALOG is not set
# CONFIG_JOYSTICK_A3D is not set
# CONFIG_JOYSTICK_ADI is not set
# CONFIG_JOYSTICK_COBRA is not set
# CONFIG_JOYSTICK_GF2K is not set
# CONFIG_JOYSTICK_GRIP is not set
# CONFIG_JOYSTICK_GRIP_MP is not set
# CONFIG_JOYSTICK_GUILLEMOT is not set
# CONFIG_JOYSTICK_INTERACT is not set
# CONFIG_JOYSTICK_SIDEWINDER is not set
# CONFIG_JOYSTICK_TMDC is not set
# CONFIG_JOYSTICK_IFORCE is not set
# CONFIG_JOYSTICK_WARRIOR is not set
# CONFIG_JOYSTICK_MAGELLAN is not set
# CONFIG_JOYSTICK_SPACEORB is not set
# CONFIG_JOYSTICK_SPACEBALL is not set
# CONFIG_JOYSTICK_STINGER is not set
# CONFIG_JOYSTICK_TWIDJOY is not set
# CONFIG_JOYSTICK_ZHENHUA is not set
# CONFIG_JOYSTICK_AS5011 is not set
# CONFIG_JOYSTICK_JOYDUMP is not set
# CONFIG_JOYSTICK_XPAD is not set
CONFIG_INPUT_TABLET=y
# CONFIG_TABLET_USB_ACECAD is not set
# CONFIG_TABLET_USB_AIPTEK is not set
# CONFIG_TABLET_USB_GTCO is not set
# CONFIG_TABLET_USB_HANWANG is not set
# CONFIG_TABLET_USB_KBTAB is not set
# CONFIG_TABLET_USB_WACOM is not set
# CONFIG_INPUT_TOUCHSCREEN is not set
CONFIG_INPUT_MISC=y
# CONFIG_INPUT_AD714X is not set
# CONFIG_INPUT_PCSPKR is not set
# CONFIG_INPUT_MMA8450 is not set
# CONFIG_INPUT_MPU3050 is not set
# CONFIG_INPUT_APANEL is not set
# CONFIG_INPUT_ATLAS_BTNS is not set
# CONFIG_INPUT_ATI_REMOTE is not set
# CONFIG_INPUT_ATI_REMOTE2 is not set
# CONFIG_INPUT_KEYSPAN_REMOTE is not set
# CONFIG_INPUT_KXTJ9 is not set
# CONFIG_INPUT_POWERMATE is not set
# CONFIG_INPUT_YEALINK is not set
# CONFIG_INPUT_CM109 is not set
# CONFIG_INPUT_UINPUT is not set
# CONFIG_INPUT_PCF8574 is not set
# CONFIG_INPUT_ADXL34X is not set
# CONFIG_INPUT_CMA3000 is not set
CONFIG_INPUT_XEN_KBDDEV_FRONTEND=m

#
# Hardware I/O ports
#
CONFIG_SERIO=y
CONFIG_SERIO_I8042=y
CONFIG_SERIO_SERPORT=y
# CONFIG_SERIO_CT82C710 is not set
# CONFIG_SERIO_PCIPS2 is not set
CONFIG_SERIO_LIBPS2=y
# CONFIG_SERIO_RAW is not set
# CONFIG_SERIO_ALTERA_PS2 is not set
# CONFIG_SERIO_PS2MULT is not set
# CONFIG_GAMEPORT is not set

#
# Character devices
#
CONFIG_VT=y
CONFIG_CONSOLE_TRANSLATIONS=y
CONFIG_VT_CONSOLE=y
CONFIG_VT_CONSOLE_SLEEP=y
CONFIG_HW_CONSOLE=y
# CONFIG_VT_HW_CONSOLE_BINDING is not set
CONFIG_UNIX98_PTYS=y
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
CONFIG_LEGACY_PTYS=y
CONFIG_LEGACY_PTY_COUNT=256
# CONFIG_SERIAL_NONSTANDARD is not set
# CONFIG_NOZOMI is not set
# CONFIG_N_GSM is not set
# CONFIG_TRACE_SINK is not set
CONFIG_DEVKMEM=y

#
# Serial drivers
#
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_FIX_EARLYCON_MEM=y
CONFIG_SERIAL_8250_PCI=y
CONFIG_SERIAL_8250_PNP=y
CONFIG_SERIAL_8250_CS=m
CONFIG_SERIAL_8250_NR_UARTS=16
CONFIG_SERIAL_8250_RUNTIME_UARTS=4
CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
# CONFIG_SERIAL_8250_RSA is not set

#
# Non-8250 serial port support
#
# CONFIG_SERIAL_MFD_HSU is not set
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_CONSOLE_POLL=y
# CONFIG_SERIAL_JSM is not set
# CONFIG_SERIAL_TIMBERDALE is not set
# CONFIG_SERIAL_ALTERA_JTAGUART is not set
# CONFIG_SERIAL_ALTERA_UART is not set
# CONFIG_SERIAL_PCH_UART is not set
# CONFIG_SERIAL_XILINX_PS_UART is not set
CONFIG_HVC_DRIVER=y
CONFIG_HVC_IRQ=y
CONFIG_HVC_XEN=y
# CONFIG_VIRTIO_CONSOLE is not set
# CONFIG_IPMI_HANDLER is not set
CONFIG_HW_RANDOM=y
# CONFIG_HW_RANDOM_TIMERIOMEM is not set
# CONFIG_HW_RANDOM_INTEL is not set
# CONFIG_HW_RANDOM_AMD is not set
CONFIG_HW_RANDOM_VIA=y
CONFIG_HW_RANDOM_VIRTIO=m
CONFIG_NVRAM=y
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set

#
# PCMCIA character devices
#
# CONFIG_SYNCLINK_CS is not set
# CONFIG_CARDMAN_4000 is not set
# CONFIG_CARDMAN_4040 is not set
# CONFIG_IPWIRELESS is not set
# CONFIG_MWAVE is not set
# CONFIG_RAW_DRIVER is not set
CONFIG_HPET=y
# CONFIG_HPET_MMAP is not set
# CONFIG_HANGCHECK_TIMER is not set
# CONFIG_TCG_TPM is not set
# CONFIG_TELCLOCK is not set
CONFIG_DEVPORT=y
# CONFIG_RAMOOPS is not set
CONFIG_I2C=y
CONFIG_I2C_BOARDINFO=y
CONFIG_I2C_COMPAT=y
# CONFIG_I2C_CHARDEV is not set
# CONFIG_I2C_MUX is not set
CONFIG_I2C_HELPER_AUTO=y
CONFIG_I2C_ALGOBIT=y

#
# I2C Hardware Bus support
#

#
# PC SMBus host controller drivers
#
# CONFIG_I2C_ALI1535 is not set
# CONFIG_I2C_ALI1563 is not set
# CONFIG_I2C_ALI15X3 is not set
# CONFIG_I2C_AMD756 is not set
# CONFIG_I2C_AMD8111 is not set
CONFIG_I2C_I801=y
# CONFIG_I2C_ISCH is not set
# CONFIG_I2C_PIIX4 is not set
# CONFIG_I2C_NFORCE2 is not set
# CONFIG_I2C_SIS5595 is not set
# CONFIG_I2C_SIS630 is not set
# CONFIG_I2C_SIS96X is not set
# CONFIG_I2C_VIA is not set
# CONFIG_I2C_VIAPRO is not set

#
# ACPI drivers
#
# CONFIG_I2C_SCMI is not set

#
# I2C system bus drivers (mostly embedded / system-on-chip)
#
# CONFIG_I2C_INTEL_MID is not set
# CONFIG_I2C_OCORES is not set
# CONFIG_I2C_PCA_PLATFORM is not set
# CONFIG_I2C_PXA_PCI is not set
# CONFIG_I2C_SIMTEC is not set
# CONFIG_I2C_XILINX is not set
# CONFIG_I2C_EG20T is not set

#
# External I2C/SMBus adapter drivers
#
# CONFIG_I2C_DIOLAN_U2C is not set
# CONFIG_I2C_PARPORT_LIGHT is not set
# CONFIG_I2C_TAOS_EVM is not set
# CONFIG_I2C_TINY_USB is not set

#
# Other I2C/SMBus bus drivers
#
# CONFIG_I2C_STUB is not set
# CONFIG_I2C_DEBUG_CORE is not set
# CONFIG_I2C_DEBUG_ALGO is not set
# CONFIG_I2C_DEBUG_BUS is not set
# CONFIG_SPI is not set

#
# PPS support
#
# CONFIG_PPS is not set

#
# PPS generators support
#

#
# PTP clock support
#

#
# Enable Device Drivers -> PPS to see the PTP clock options.
#
# CONFIG_PINCTRL is not set
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
# CONFIG_GPIOLIB is not set
# CONFIG_W1 is not set
CONFIG_POWER_SUPPLY=y
# CONFIG_POWER_SUPPLY_DEBUG is not set
# CONFIG_PDA_POWER is not set
# CONFIG_TEST_POWER is not set
# CONFIG_BATTERY_DS2780 is not set
# CONFIG_BATTERY_DS2782 is not set
# CONFIG_BATTERY_BQ20Z75 is not set
# CONFIG_BATTERY_BQ27x00 is not set
# CONFIG_BATTERY_MAX17040 is not set
# CONFIG_BATTERY_MAX17042 is not set
# CONFIG_CHARGER_MAX8903 is not set
CONFIG_HWMON=y
# CONFIG_HWMON_VID is not set
# CONFIG_HWMON_DEBUG_CHIP is not set

#
# Native drivers
#
# CONFIG_SENSORS_ABITUGURU is not set
# CONFIG_SENSORS_ABITUGURU3 is not set
# CONFIG_SENSORS_AD7414 is not set
# CONFIG_SENSORS_AD7418 is not set
# CONFIG_SENSORS_ADM1021 is not set
# CONFIG_SENSORS_ADM1025 is not set
# CONFIG_SENSORS_ADM1026 is not set
# CONFIG_SENSORS_ADM1029 is not set
# CONFIG_SENSORS_ADM1031 is not set
# CONFIG_SENSORS_ADM9240 is not set
# CONFIG_SENSORS_ADT7411 is not set
# CONFIG_SENSORS_ADT7462 is not set
# CONFIG_SENSORS_ADT7470 is not set
# CONFIG_SENSORS_ADT7475 is not set
# CONFIG_SENSORS_ASC7621 is not set
# CONFIG_SENSORS_K8TEMP is not set
# CONFIG_SENSORS_K10TEMP is not set
# CONFIG_SENSORS_FAM15H_POWER is not set
# CONFIG_SENSORS_ASB100 is not set
# CONFIG_SENSORS_ATXP1 is not set
# CONFIG_SENSORS_DS620 is not set
# CONFIG_SENSORS_DS1621 is not set
# CONFIG_SENSORS_I5K_AMB is not set
# CONFIG_SENSORS_F71805F is not set
# CONFIG_SENSORS_F71882FG is not set
# CONFIG_SENSORS_F75375S is not set
# CONFIG_SENSORS_FSCHMD is not set
# CONFIG_SENSORS_G760A is not set
# CONFIG_SENSORS_GL518SM is not set
# CONFIG_SENSORS_GL520SM is not set
# CONFIG_SENSORS_CORETEMP is not set
# CONFIG_SENSORS_IT87 is not set
# CONFIG_SENSORS_JC42 is not set
# CONFIG_SENSORS_LINEAGE is not set
# CONFIG_SENSORS_LM63 is not set
# CONFIG_SENSORS_LM73 is not set
# CONFIG_SENSORS_LM75 is not set
# CONFIG_SENSORS_LM77 is not set
# CONFIG_SENSORS_LM78 is not set
# CONFIG_SENSORS_LM80 is not set
# CONFIG_SENSORS_LM83 is not set
# CONFIG_SENSORS_LM85 is not set
# CONFIG_SENSORS_LM87 is not set
# CONFIG_SENSORS_LM90 is not set
# CONFIG_SENSORS_LM92 is not set
# CONFIG_SENSORS_LM93 is not set
# CONFIG_SENSORS_LTC4151 is not set
# CONFIG_SENSORS_LTC4215 is not set
# CONFIG_SENSORS_LTC4245 is not set
# CONFIG_SENSORS_LTC4261 is not set
# CONFIG_SENSORS_LM95241 is not set
# CONFIG_SENSORS_LM95245 is not set
# CONFIG_SENSORS_MAX16065 is not set
# CONFIG_SENSORS_MAX1619 is not set
# CONFIG_SENSORS_MAX1668 is not set
# CONFIG_SENSORS_MAX6639 is not set
# CONFIG_SENSORS_MAX6642 is not set
# CONFIG_SENSORS_MAX6650 is not set
# CONFIG_SENSORS_NTC_THERMISTOR is not set
# CONFIG_SENSORS_PC87360 is not set
# CONFIG_SENSORS_PC87427 is not set
# CONFIG_SENSORS_PCF8591 is not set
# CONFIG_PMBUS is not set
# CONFIG_SENSORS_SHT21 is not set
# CONFIG_SENSORS_SIS5595 is not set
# CONFIG_SENSORS_SMM665 is not set
# CONFIG_SENSORS_DME1737 is not set
# CONFIG_SENSORS_EMC1403 is not set
# CONFIG_SENSORS_EMC2103 is not set
# CONFIG_SENSORS_EMC6W201 is not set
# CONFIG_SENSORS_SMSC47M1 is not set
# CONFIG_SENSORS_SMSC47M192 is not set
# CONFIG_SENSORS_SMSC47B397 is not set
# CONFIG_SENSORS_SCH56XX_COMMON is not set
# CONFIG_SENSORS_SCH5627 is not set
# CONFIG_SENSORS_SCH5636 is not set
# CONFIG_SENSORS_ADS1015 is not set
# CONFIG_SENSORS_ADS7828 is not set
# CONFIG_SENSORS_AMC6821 is not set
# CONFIG_SENSORS_THMC50 is not set
# CONFIG_SENSORS_TMP102 is not set
# CONFIG_SENSORS_TMP401 is not set
# CONFIG_SENSORS_TMP421 is not set
# CONFIG_SENSORS_VIA_CPUTEMP is not set
# CONFIG_SENSORS_VIA686A is not set
# CONFIG_SENSORS_VT1211 is not set
# CONFIG_SENSORS_VT8231 is not set
# CONFIG_SENSORS_W83781D is not set
# CONFIG_SENSORS_W83791D is not set
# CONFIG_SENSORS_W83792D is not set
# CONFIG_SENSORS_W83793 is not set
# CONFIG_SENSORS_W83795 is not set
# CONFIG_SENSORS_W83L785TS is not set
# CONFIG_SENSORS_W83L786NG is not set
# CONFIG_SENSORS_W83627HF is not set
# CONFIG_SENSORS_W83627EHF is not set
# CONFIG_SENSORS_APPLESMC is not set

#
# ACPI drivers
#
# CONFIG_SENSORS_ACPI_POWER is not set
# CONFIG_SENSORS_ATK0110 is not set
CONFIG_THERMAL=y
CONFIG_THERMAL_HWMON=y
# CONFIG_WATCHDOG is not set
CONFIG_SSB_POSSIBLE=y

#
# Sonics Silicon Backplane
#
# CONFIG_SSB is not set
CONFIG_BCMA_POSSIBLE=y

#
# Broadcom specific AMBA
#
# CONFIG_BCMA is not set
CONFIG_MFD_SUPPORT=y
# CONFIG_MFD_CORE is not set
# CONFIG_MFD_88PM860X is not set
# CONFIG_MFD_SM501 is not set
# CONFIG_HTC_PASIC3 is not set
# CONFIG_TPS6105X is not set
# CONFIG_TPS6507X is not set
# CONFIG_TWL4030_CORE is not set
# CONFIG_MFD_STMPE is not set
# CONFIG_MFD_TC3589X is not set
# CONFIG_MFD_TMIO is not set
# CONFIG_PMIC_DA903X is not set
# CONFIG_PMIC_ADP5520 is not set
# CONFIG_MFD_MAX8925 is not set
# CONFIG_MFD_MAX8997 is not set
# CONFIG_MFD_MAX8998 is not set
# CONFIG_MFD_WM8400 is not set
# CONFIG_MFD_WM831X_I2C is not set
# CONFIG_MFD_WM8350_I2C is not set
# CONFIG_MFD_WM8994 is not set
# CONFIG_MFD_PCF50633 is not set
# CONFIG_ABX500_CORE is not set
# CONFIG_MFD_CS5535 is not set
# CONFIG_LPC_SCH is not set
# CONFIG_MFD_RDC321X is not set
# CONFIG_MFD_JANZ_CMODIO is not set
# CONFIG_MFD_VX855 is not set
# CONFIG_MFD_WL1273_CORE is not set
# CONFIG_REGULATOR is not set
# CONFIG_MEDIA_SUPPORT is not set

#
# Graphics support
#
CONFIG_AGP=y
CONFIG_AGP_AMD64=y
CONFIG_AGP_INTEL=y
CONFIG_AGP_SIS=y
CONFIG_AGP_VIA=y
CONFIG_VGA_ARB=y
CONFIG_VGA_ARB_MAX_GPUS=16
CONFIG_VGA_SWITCHEROO=y
CONFIG_DRM=y
CONFIG_DRM_KMS_HELPER=m
CONFIG_DRM_TTM=m
# CONFIG_DRM_TDFX is not set
# CONFIG_DRM_R128 is not set
CONFIG_DRM_RADEON=m
CONFIG_DRM_RADEON_KMS=y
CONFIG_DRM_I915=m
CONFIG_DRM_I915_KMS=y
CONFIG_DRM_MGA=m
CONFIG_DRM_SIS=m
CONFIG_DRM_VIA=m
CONFIG_DRM_SAVAGE=m
# CONFIG_STUB_POULSBO is not set
# CONFIG_VGASTATE is not set
CONFIG_VIDEO_OUTPUT_CONTROL=y
CONFIG_FB=y
# CONFIG_FIRMWARE_EDID is not set
# CONFIG_FB_DDC is not set
# CONFIG_FB_BOOT_VESA_SUPPORT is not set
CONFIG_FB_CFB_FILLRECT=y
CONFIG_FB_CFB_COPYAREA=y
CONFIG_FB_CFB_IMAGEBLIT=y
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
CONFIG_FB_SYS_FILLRECT=m
CONFIG_FB_SYS_COPYAREA=m
CONFIG_FB_SYS_IMAGEBLIT=m
# CONFIG_FB_FOREIGN_ENDIAN is not set
CONFIG_FB_SYS_FOPS=m
# CONFIG_FB_WMT_GE_ROPS is not set
CONFIG_FB_DEFERRED_IO=y
# CONFIG_FB_SVGALIB is not set
# CONFIG_FB_MACMODES is not set
# CONFIG_FB_BACKLIGHT is not set
CONFIG_FB_MODE_HELPERS=y
CONFIG_FB_TILEBLITTING=y

#
# Frame buffer hardware drivers
#
CONFIG_FB_CIRRUS=y
# CONFIG_FB_PM2 is not set
# CONFIG_FB_CYBER2000 is not set
# CONFIG_FB_ARC is not set
# CONFIG_FB_ASILIANT is not set
# CONFIG_FB_IMSTT is not set
# CONFIG_FB_VGA16 is not set
# CONFIG_FB_UVESA is not set
# CONFIG_FB_VESA is not set
CONFIG_FB_EFI=y
# CONFIG_FB_N411 is not set
# CONFIG_FB_HGA is not set
# CONFIG_FB_S1D13XXX is not set
# CONFIG_FB_NVIDIA is not set
# CONFIG_FB_RIVA is not set
# CONFIG_FB_LE80578 is not set
# CONFIG_FB_MATROX is not set
# CONFIG_FB_RADEON is not set
# CONFIG_FB_ATY128 is not set
# CONFIG_FB_ATY is not set
# CONFIG_FB_S3 is not set
# CONFIG_FB_SAVAGE is not set
# CONFIG_FB_SIS is not set
# CONFIG_FB_VIA is not set
# CONFIG_FB_NEOMAGIC is not set
# CONFIG_FB_KYRO is not set
# CONFIG_FB_3DFX is not set
# CONFIG_FB_VOODOO1 is not set
# CONFIG_FB_VT8623 is not set
# CONFIG_FB_TRIDENT is not set
# CONFIG_FB_ARK is not set
# CONFIG_FB_PM3 is not set
# CONFIG_FB_CARMINE is not set
# CONFIG_FB_GEODE is not set
# CONFIG_FB_UDL is not set
# CONFIG_FB_VIRTUAL is not set
CONFIG_XEN_FBDEV_FRONTEND=m
# CONFIG_FB_METRONOME is not set
# CONFIG_FB_MB862XX is not set
# CONFIG_FB_BROADSHEET is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
# CONFIG_LCD_CLASS_DEVICE is not set
CONFIG_BACKLIGHT_CLASS_DEVICE=y
CONFIG_BACKLIGHT_GENERIC=y
# CONFIG_BACKLIGHT_PROGEAR is not set
# CONFIG_BACKLIGHT_APPLE is not set
# CONFIG_BACKLIGHT_SAHARA is not set
# CONFIG_BACKLIGHT_ADP8860 is not set
# CONFIG_BACKLIGHT_ADP8870 is not set

#
# Display device support
#
CONFIG_DISPLAY_SUPPORT=m

#
# Display hardware drivers
#

#
# Console display driver support
#
CONFIG_VGA_CONSOLE=y
# CONFIG_VGACON_SOFT_SCROLLBACK is not set
CONFIG_DUMMY_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE=m
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
# CONFIG_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
# CONFIG_LOGO is not set
# CONFIG_SOUND is not set
CONFIG_HID_SUPPORT=y
CONFIG_HID=m
CONFIG_HIDRAW=y

#
# USB Input Devices
#
CONFIG_USB_HID=m
CONFIG_HID_PID=y
CONFIG_USB_HIDDEV=y

#
# Special HID drivers
#
CONFIG_HID_A4TECH=m
# CONFIG_HID_ACRUX is not set
CONFIG_HID_APPLE=m
CONFIG_HID_BELKIN=m
CONFIG_HID_CHERRY=m
CONFIG_HID_CHICONY=m
CONFIG_HID_CYPRESS=m
# CONFIG_HID_DRAGONRISE is not set
# CONFIG_HID_EMS_FF is not set
CONFIG_HID_EZKEY=m
# CONFIG_HID_HOLTEK is not set
# CONFIG_HID_KEYTOUCH is not set
CONFIG_HID_KYE=m
# CONFIG_HID_UCLOGIC is not set
# CONFIG_HID_WALTOP is not set
CONFIG_HID_GYRATION=m
# CONFIG_HID_TWINHAN is not set
CONFIG_HID_KENSINGTON=m
# CONFIG_HID_LCPOWER is not set
CONFIG_HID_LOGITECH=m
CONFIG_HID_LOGITECH_DJ=m
CONFIG_LOGITECH_FF=y
# CONFIG_LOGIRUMBLEPAD2_FF is not set
# CONFIG_LOGIG940_FF is not set
CONFIG_LOGIWHEELS_FF=y
CONFIG_HID_MICROSOFT=m
CONFIG_HID_MONTEREY=m
# CONFIG_HID_MULTITOUCH is not set
CONFIG_HID_NTRIG=m
# CONFIG_HID_ORTEK is not set
CONFIG_HID_PANTHERLORD=m
CONFIG_PANTHERLORD_FF=y
CONFIG_HID_PETALYNX=m
# CONFIG_HID_PICOLCD is not set
# CONFIG_HID_PRIMAX is not set
# CONFIG_HID_QUANTA is not set
# CONFIG_HID_ROCCAT is not set
CONFIG_HID_SAMSUNG=m
CONFIG_HID_SONY=m
# CONFIG_HID_SPEEDLINK is not set
CONFIG_HID_SUNPLUS=m
# CONFIG_HID_GREENASIA is not set
# CONFIG_HID_SMARTJOYPLUS is not set
CONFIG_HID_TOPSEED=m
# CONFIG_HID_THRUSTMASTER is not set
# CONFIG_HID_ZEROPLUS is not set
# CONFIG_HID_ZYDACRON is not set
CONFIG_USB_SUPPORT=y
CONFIG_USB_COMMON=y
CONFIG_USB_ARCH_HAS_HCD=y
CONFIG_USB_ARCH_HAS_OHCI=y
CONFIG_USB_ARCH_HAS_EHCI=y
CONFIG_USB_ARCH_HAS_XHCI=y
CONFIG_USB=y
CONFIG_USB_DEBUG=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y

#
# Miscellaneous USB options
#
CONFIG_USB_DEVICEFS=y
# CONFIG_USB_DEVICE_CLASS is not set
# CONFIG_USB_DYNAMIC_MINORS is not set
# CONFIG_USB_DWC3 is not set
CONFIG_USB_MON=y
# CONFIG_USB_WUSB is not set
# CONFIG_USB_WUSB_CBAF is not set

#
# USB Host Controller Drivers
#
# CONFIG_USB_C67X00_HCD is not set
CONFIG_USB_XHCI_HCD=y
# CONFIG_USB_XHCI_HCD_DEBUGGING is not set
CONFIG_USB_EHCI_HCD=y
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
# CONFIG_USB_OXU210HP_HCD is not set
# CONFIG_USB_ISP116X_HCD is not set
# CONFIG_USB_ISP1760_HCD is not set
# CONFIG_USB_ISP1362_HCD is not set
CONFIG_USB_OHCI_HCD=y
# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
CONFIG_USB_OHCI_LITTLE_ENDIAN=y
CONFIG_USB_UHCI_HCD=y
# CONFIG_USB_SL811_HCD is not set
# CONFIG_USB_R8A66597_HCD is not set
# CONFIG_USB_WHCI_HCD is not set
# CONFIG_USB_HWA_HCD is not set

#
# USB Device Class drivers
#
# CONFIG_USB_ACM is not set
CONFIG_USB_PRINTER=y
# CONFIG_USB_WDM is not set
# CONFIG_USB_TMC is not set

#
# NOTE: USB_STORAGE depends on SCSI but BLK_DEV_SD may
#

#
# also be needed; see USB_STORAGE Help for more info
#
CONFIG_USB_STORAGE=m
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_REALTEK is not set
# CONFIG_USB_STORAGE_DATAFAB is not set
# CONFIG_USB_STORAGE_FREECOM is not set
# CONFIG_USB_STORAGE_ISD200 is not set
# CONFIG_USB_STORAGE_USBAT is not set
# CONFIG_USB_STORAGE_SDDR09 is not set
# CONFIG_USB_STORAGE_SDDR55 is not set
# CONFIG_USB_STORAGE_JUMPSHOT is not set
# CONFIG_USB_STORAGE_ALAUDA is not set
# CONFIG_USB_STORAGE_ONETOUCH is not set
# CONFIG_USB_STORAGE_KARMA is not set
# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
# CONFIG_USB_STORAGE_ENE_UB6250 is not set
# CONFIG_USB_UAS is not set
CONFIG_USB_LIBUSUAL=y

#
# USB Imaging devices
#
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_MICROTEK is not set

#
# USB port drivers
#
# CONFIG_USB_SERIAL is not set

#
# USB Miscellaneous drivers
#
# CONFIG_USB_EMI62 is not set
# CONFIG_USB_EMI26 is not set
# CONFIG_USB_ADUTUX is not set
# CONFIG_USB_SEVSEG is not set
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_LEGOTOWER is not set
# CONFIG_USB_LCD is not set
# CONFIG_USB_LED is not set
# CONFIG_USB_CYPRESS_CY7C63 is not set
# CONFIG_USB_CYTHERM is not set
# CONFIG_USB_IDMOUSE is not set
# CONFIG_USB_FTDI_ELAN is not set
# CONFIG_USB_APPLEDISPLAY is not set
# CONFIG_USB_SISUSBVGA is not set
# CONFIG_USB_LD is not set
# CONFIG_USB_TRANCEVIBRATOR is not set
# CONFIG_USB_IOWARRIOR is not set
# CONFIG_USB_TEST is not set
# CONFIG_USB_ISIGHTFW is not set
# CONFIG_USB_YUREX is not set
# CONFIG_USB_GADGET is not set

#
# OTG and related infrastructure
#
# CONFIG_NOP_USB_XCEIV is not set
# CONFIG_UWB is not set
# CONFIG_MMC is not set
# CONFIG_MEMSTICK is not set
CONFIG_NEW_LEDS=y
CONFIG_LEDS_CLASS=y

#
# LED drivers
#
# CONFIG_LEDS_LM3530 is not set
# CONFIG_LEDS_ALIX2 is not set
# CONFIG_LEDS_PCA9532 is not set
# CONFIG_LEDS_LP3944 is not set
# CONFIG_LEDS_LP5521 is not set
# CONFIG_LEDS_LP5523 is not set
# CONFIG_LEDS_CLEVO_MAIL is not set
# CONFIG_LEDS_PCA955X is not set
# CONFIG_LEDS_BD2802 is not set
# CONFIG_LEDS_INTEL_SS4200 is not set
# CONFIG_LEDS_DELL_NETBOOKS is not set
# CONFIG_LEDS_TRIGGERS is not set

#
# LED Triggers
#
# CONFIG_ACCESSIBILITY is not set
# CONFIG_INFINIBAND is not set
CONFIG_EDAC=y

#
# Reporting subsystems
#
# CONFIG_EDAC_DEBUG is not set
CONFIG_EDAC_DECODE_MCE=y
# CONFIG_EDAC_MCE_INJ is not set
# CONFIG_EDAC_MM_EDAC is not set
CONFIG_RTC_LIB=y
CONFIG_RTC_CLASS=y
# CONFIG_RTC_HCTOSYS is not set
# CONFIG_RTC_DEBUG is not set

#
# RTC interfaces
#
CONFIG_RTC_INTF_SYSFS=y
CONFIG_RTC_INTF_PROC=y
CONFIG_RTC_INTF_DEV=y
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
# CONFIG_RTC_DRV_TEST is not set

#
# I2C RTC drivers
#
# CONFIG_RTC_DRV_DS1307 is not set
# CONFIG_RTC_DRV_DS1374 is not set
# CONFIG_RTC_DRV_DS1672 is not set
# CONFIG_RTC_DRV_DS3232 is not set
# CONFIG_RTC_DRV_MAX6900 is not set
# CONFIG_RTC_DRV_RS5C372 is not set
# CONFIG_RTC_DRV_ISL1208 is not set
# CONFIG_RTC_DRV_ISL12022 is not set
# CONFIG_RTC_DRV_X1205 is not set
# CONFIG_RTC_DRV_PCF8563 is not set
# CONFIG_RTC_DRV_PCF8583 is not set
# CONFIG_RTC_DRV_M41T80 is not set
# CONFIG_RTC_DRV_BQ32K is not set
# CONFIG_RTC_DRV_S35390A is not set
# CONFIG_RTC_DRV_FM3130 is not set
# CONFIG_RTC_DRV_RX8581 is not set
# CONFIG_RTC_DRV_RX8025 is not set
# CONFIG_RTC_DRV_EM3027 is not set
# CONFIG_RTC_DRV_RV3029C2 is not set

#
# SPI RTC drivers
#

#
# Platform RTC drivers
#
CONFIG_RTC_DRV_CMOS=y
# CONFIG_RTC_DRV_DS1286 is not set
# CONFIG_RTC_DRV_DS1511 is not set
# CONFIG_RTC_DRV_DS1553 is not set
# CONFIG_RTC_DRV_DS1742 is not set
# CONFIG_RTC_DRV_STK17TA8 is not set
# CONFIG_RTC_DRV_M48T86 is not set
# CONFIG_RTC_DRV_M48T35 is not set
# CONFIG_RTC_DRV_M48T59 is not set
# CONFIG_RTC_DRV_MSM6242 is not set
# CONFIG_RTC_DRV_BQ4802 is not set
# CONFIG_RTC_DRV_RP5C01 is not set
# CONFIG_RTC_DRV_V3020 is not set

#
# on-CPU RTC drivers
#
CONFIG_DMADEVICES=y
# CONFIG_DMADEVICES_DEBUG is not set

#
# DMA Devices
#
# CONFIG_INTEL_MID_DMAC is not set
# CONFIG_INTEL_IOATDMA is not set
# CONFIG_TIMB_DMA is not set
# CONFIG_PCH_DMA is not set
# CONFIG_AUXDISPLAY is not set
# CONFIG_UIO is not set
CONFIG_VIRTIO=y
CONFIG_VIRTIO_RING=y

#
# Virtio drivers
#
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_BALLOON=y

#
# Xen driver support
#
CONFIG_XEN_BALLOON=y
CONFIG_XEN_SELFBALLOONING=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=y
CONFIG_XEN_GNTDEV=y
CONFIG_XEN_GRANT_DEV_ALLOC=y
CONFIG_SWIOTLB_XEN=y
CONFIG_XEN_TMEM=y
CONFIG_XEN_PCIDEV_BACKEND=y
CONFIG_STAGING=y
# CONFIG_ET131X is not set
# CONFIG_SLICOSS is not set
CONFIG_USBIP_CORE=m
CONFIG_USBIP_VHCI_HCD=m
CONFIG_USBIP_HOST=m
# CONFIG_USBIP_DEBUG is not set
# CONFIG_ECHO is not set
# CONFIG_COMEDI is not set
# CONFIG_ASUS_OLED is not set
# CONFIG_RTS_PSTOR is not set
# CONFIG_RTS5139 is not set
# CONFIG_TRANZPORT is not set
# CONFIG_POHMELFS is not set
# CONFIG_IDE_PHISON is not set
# CONFIG_DRM_VMWGFX is not set
CONFIG_DRM_NOUVEAU=m
# CONFIG_DRM_NOUVEAU_BACKLIGHT is not set
CONFIG_DRM_NOUVEAU_DEBUG=y

#
# I2C encoder or helper chips
#
CONFIG_DRM_I2C_CH7006=m
CONFIG_DRM_I2C_SIL164=m
# CONFIG_VME_BUS is not set
# CONFIG_DX_SEP is not set
# CONFIG_IIO is not set
CONFIG_XVMALLOC=y
CONFIG_ZRAM=y
# CONFIG_ZRAM_DEBUG is not set
CONFIG_ZCACHE=y
# CONFIG_FB_SM7XX is not set
# CONFIG_CRYSTALHD is not set
# CONFIG_FB_XGI is not set
# CONFIG_ACPI_QUICKSTART is not set
# CONFIG_USB_ENESTORAGE is not set
# CONFIG_BCM_WIMAX is not set
# CONFIG_FT1000 is not set

#
# Speakup console speech
#
# CONFIG_SPEAKUP is not set
# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4 is not set
# CONFIG_DRM_PSB is not set
# CONFIG_ALTERA_STAPL is not set
CONFIG_X86_PLATFORM_DEVICES=y
# CONFIG_ACER_WMI is not set
# CONFIG_ACERHDF is not set
# CONFIG_ASUS_LAPTOP is not set
# CONFIG_DELL_WMI is not set
# CONFIG_DELL_WMI_AIO is not set
# CONFIG_FUJITSU_LAPTOP is not set
# CONFIG_HP_ACCEL is not set
# CONFIG_HP_WMI is not set
# CONFIG_MSI_LAPTOP is not set
# CONFIG_PANASONIC_LAPTOP is not set
# CONFIG_COMPAL_LAPTOP is not set
# CONFIG_SONY_LAPTOP is not set
# CONFIG_IDEAPAD_LAPTOP is not set
# CONFIG_THINKPAD_ACPI is not set
# CONFIG_SENSORS_HDAPS is not set
# CONFIG_INTEL_MENLOW is not set
CONFIG_EEEPC_LAPTOP=y
# CONFIG_ASUS_WMI is not set
CONFIG_ACPI_WMI=m
# CONFIG_MSI_WMI is not set
# CONFIG_ACPI_ASUS is not set
# CONFIG_TOPSTAR_LAPTOP is not set
# CONFIG_ACPI_TOSHIBA is not set
# CONFIG_TOSHIBA_BT_RFKILL is not set
# CONFIG_ACPI_CMPC is not set
# CONFIG_INTEL_IPS is not set
# CONFIG_IBM_RTL is not set
# CONFIG_XO15_EBOOK is not set
# CONFIG_SAMSUNG_LAPTOP is not set
CONFIG_MXM_WMI=m
# CONFIG_INTEL_OAKTRAIL is not set
# CONFIG_SAMSUNG_Q10 is not set
CONFIG_CLKEVT_I8253=y
CONFIG_I8253_LOCK=y
CONFIG_CLKBLD_I8253=y
CONFIG_IOMMU_API=y
CONFIG_IOMMU_SUPPORT=y
CONFIG_AMD_IOMMU=y
CONFIG_AMD_IOMMU_STATS=y
CONFIG_DMAR_TABLE=y
CONFIG_INTEL_IOMMU=y
# CONFIG_INTEL_IOMMU_DEFAULT_ON is not set
CONFIG_INTEL_IOMMU_FLOPPY_WA=y
# CONFIG_IRQ_REMAP is not set
# CONFIG_VIRT_DRIVERS is not set
# CONFIG_HYPERV is not set

#
# Firmware Drivers
#
# CONFIG_EDD is not set
CONFIG_FIRMWARE_MEMMAP=y
CONFIG_EFI_VARS=y
# CONFIG_DELL_RBU is not set
# CONFIG_DCDBAS is not set
CONFIG_DMIID=y
# CONFIG_DMI_SYSFS is not set
CONFIG_ISCSI_IBFT_FIND=y
CONFIG_ISCSI_IBFT=m
# CONFIG_SIGMA is not set
# CONFIG_GOOGLE_FIRMWARE is not set

#
# File systems
#
CONFIG_EXT2_FS=m
CONFIG_EXT2_FS_XATTR=y
CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT2_FS_SECURITY=y
CONFIG_EXT2_FS_XIP=y
CONFIG_EXT3_FS=m
# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set
CONFIG_EXT3_FS_XATTR=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_EXT3_FS_SECURITY=y
CONFIG_EXT4_FS=m
CONFIG_EXT4_FS_XATTR=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
# CONFIG_EXT4_DEBUG is not set
CONFIG_FS_XIP=y
CONFIG_JBD=m
# CONFIG_JBD_DEBUG is not set
CONFIG_JBD2=m
# CONFIG_JBD2_DEBUG is not set
CONFIG_FS_MBCACHE=m
CONFIG_REISERFS_FS=m
# CONFIG_REISERFS_CHECK is not set
CONFIG_REISERFS_PROC_INFO=y
CONFIG_REISERFS_FS_XATTR=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_SECURITY=y
CONFIG_JFS_FS=m
CONFIG_JFS_POSIX_ACL=y
CONFIG_JFS_SECURITY=y
# CONFIG_JFS_DEBUG is not set
CONFIG_JFS_STATISTICS=y
CONFIG_XFS_FS=m
# CONFIG_XFS_QUOTA is not set
CONFIG_XFS_POSIX_ACL=y
# CONFIG_XFS_RT is not set
# CONFIG_XFS_DEBUG is not set
# CONFIG_GFS2_FS is not set
# CONFIG_OCFS2_FS is not set
# CONFIG_BTRFS_FS is not set
# CONFIG_NILFS2_FS is not set
CONFIG_FS_POSIX_ACL=y
CONFIG_EXPORTFS=m
CONFIG_FILE_LOCKING=y
CONFIG_FSNOTIFY=y
CONFIG_DNOTIFY=y
CONFIG_INOTIFY_USER=y
# CONFIG_FANOTIFY is not set
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
# CONFIG_PRINT_QUOTA_WARNING is not set
# CONFIG_QUOTA_DEBUG is not set
CONFIG_QUOTA_TREE=y
# CONFIG_QFMT_V1 is not set
CONFIG_QFMT_V2=y
CONFIG_QUOTACTL=y
CONFIG_QUOTACTL_COMPAT=y
CONFIG_AUTOFS4_FS=y
# CONFIG_FUSE_FS is not set
CONFIG_GENERIC_ACL=y

#
# Caches
#
# CONFIG_FSCACHE is not set

#
# CD-ROM/DVD Filesystems
#
CONFIG_ISO9660_FS=y
CONFIG_JOLIET=y
CONFIG_ZISOFS=y
# CONFIG_UDF_FS is not set

#
# DOS/FAT/NT Filesystems
#
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_VFAT_FS=y
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
CONFIG_NTFS_FS=y
# CONFIG_NTFS_DEBUG is not set
CONFIG_NTFS_RW=y

#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_VMCORE=y
CONFIG_PROC_SYSCTL=y
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
CONFIG_TMPFS_POSIX_ACL=y
CONFIG_TMPFS_XATTR=y
CONFIG_HUGETLBFS=y
CONFIG_HUGETLB_PAGE=y
CONFIG_CONFIGFS_FS=m
CONFIG_MISC_FILESYSTEMS=y
# CONFIG_ADFS_FS is not set
# CONFIG_AFFS_FS is not set
# CONFIG_ECRYPT_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_HFSPLUS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_EFS_FS is not set
# CONFIG_LOGFS is not set
# CONFIG_CRAMFS is not set
# CONFIG_SQUASHFS is not set
# CONFIG_VXFS_FS is not set
# CONFIG_MINIX_FS is not set
# CONFIG_OMFS_FS is not set
# CONFIG_HPFS_FS is not set
# CONFIG_QNX4FS_FS is not set
# CONFIG_ROMFS_FS is not set
# CONFIG_PSTORE is not set
# CONFIG_SYSV_FS is not set
# CONFIG_UFS_FS is not set
CONFIG_NETWORK_FILESYSTEMS=y
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
CONFIG_NFS_V3_ACL=y
CONFIG_NFS_V4=y
# CONFIG_NFS_V4_1 is not set
CONFIG_ROOT_NFS=y
# CONFIG_NFS_USE_LEGACY_DNS is not set
CONFIG_NFS_USE_KERNEL_DNS=y
# CONFIG_NFS_USE_NEW_IDMAPPER is not set
# CONFIG_NFSD is not set
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
CONFIG_NFS_ACL_SUPPORT=y
CONFIG_NFS_COMMON=y
CONFIG_SUNRPC=y
CONFIG_SUNRPC_GSS=y
# CONFIG_CEPH_FS is not set
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
# CONFIG_CODA_FS is not set
# CONFIG_AFS_FS is not set

#
# Partition Types
#
CONFIG_PARTITION_ADVANCED=y
# CONFIG_ACORN_PARTITION is not set
CONFIG_OSF_PARTITION=y
CONFIG_AMIGA_PARTITION=y
# CONFIG_ATARI_PARTITION is not set
CONFIG_MAC_PARTITION=y
CONFIG_MSDOS_PARTITION=y
CONFIG_BSD_DISKLABEL=y
CONFIG_MINIX_SUBPARTITION=y
CONFIG_SOLARIS_X86_PARTITION=y
CONFIG_UNIXWARE_DISKLABEL=y
# CONFIG_LDM_PARTITION is not set
CONFIG_SGI_PARTITION=y
# CONFIG_ULTRIX_PARTITION is not set
CONFIG_SUN_PARTITION=y
CONFIG_KARMA_PARTITION=y
CONFIG_EFI_PARTITION=y
# CONFIG_SYSV68_PARTITION is not set
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="utf8"
CONFIG_NLS_CODEPAGE_437=y
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1250 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
CONFIG_NLS_UTF8=y
# CONFIG_DLM is not set

#
# Kernel hacking
#
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
CONFIG_PRINTK_TIME=y
CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
# CONFIG_ENABLE_WARN_DEPRECATED is not set
CONFIG_ENABLE_MUST_CHECK=y
CONFIG_FRAME_WARN=2048
CONFIG_MAGIC_SYSRQ=y
# CONFIG_STRIP_ASM_SYMS is not set
# CONFIG_UNUSED_SYMBOLS is not set
CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set
# CONFIG_DEBUG_SECTION_MISMATCH is not set
CONFIG_DEBUG_KERNEL=y
CONFIG_DEBUG_SHIRQ=y
CONFIG_LOCKUP_DETECTOR=y
CONFIG_HARDLOCKUP_DETECTOR=y
# CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set
CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0
# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
# CONFIG_DETECT_HUNG_TASK is not set
# CONFIG_SCHED_DEBUG is not set
CONFIG_SCHEDSTATS=y
CONFIG_TIMER_STATS=y
# CONFIG_DEBUG_OBJECTS is not set
# CONFIG_SLUB_DEBUG_ON is not set
# CONFIG_SLUB_STATS is not set
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=400
# CONFIG_DEBUG_KMEMLEAK_TEST is not set
# CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF is not set
CONFIG_DEBUG_PREEMPT=y
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_RT_MUTEX_TESTER is not set
# CONFIG_DEBUG_SPINLOCK is not set
# CONFIG_DEBUG_MUTEXES is not set
# CONFIG_DEBUG_LOCK_ALLOC is not set
# CONFIG_PROVE_LOCKING is not set
# CONFIG_SPARSE_RCU_POINTER is not set
# CONFIG_LOCK_STAT is not set
CONFIG_DEBUG_ATOMIC_SLEEP=y
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
CONFIG_STACKTRACE=y
CONFIG_DEBUG_STACK_USAGE=y
# CONFIG_DEBUG_KOBJECT is not set
CONFIG_DEBUG_BUGVERBOSE=y
CONFIG_DEBUG_INFO=y
CONFIG_DEBUG_INFO_REDUCED=y
# CONFIG_DEBUG_VM is not set
# CONFIG_DEBUG_VIRTUAL is not set
# CONFIG_DEBUG_WRITECOUNT is not set
CONFIG_DEBUG_MEMORY_INIT=y
# CONFIG_DEBUG_LIST is not set
# CONFIG_TEST_LIST_SORT is not set
# CONFIG_DEBUG_SG is not set
# CONFIG_DEBUG_NOTIFIERS is not set
# CONFIG_DEBUG_CREDENTIALS is not set
CONFIG_ARCH_WANT_FRAME_POINTERS=y
CONFIG_FRAME_POINTER=y
# CONFIG_BOOT_PRINTK_DELAY is not set
# CONFIG_RCU_TORTURE_TEST is not set
CONFIG_RCU_CPU_STALL_TIMEOUT=60
CONFIG_RCU_CPU_STALL_VERBOSE=y
# CONFIG_KPROBES_SANITY_TEST is not set
# CONFIG_BACKTRACE_SELF_TEST is not set
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
# CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
# CONFIG_DEBUG_PER_CPU_MAPS is not set
# CONFIG_LKDTM is not set
# CONFIG_CPU_NOTIFIER_ERROR_INJECT is not set
CONFIG_FAULT_INJECTION=y
# CONFIG_FAILSLAB is not set
# CONFIG_FAIL_PAGE_ALLOC is not set
CONFIG_FAIL_MAKE_REQUEST=y
# CONFIG_FAIL_IO_TIMEOUT is not set
CONFIG_FAULT_INJECTION_DEBUG_FS=y
# CONFIG_LATENCYTOP is not set
CONFIG_SYSCTL_SYSCALL_CHECK=y
# CONFIG_DEBUG_PAGEALLOC is not set
CONFIG_USER_STACKTRACE_SUPPORT=y
CONFIG_NOP_TRACER=y
CONFIG_HAVE_FTRACE_NMI_ENTER=y
CONFIG_HAVE_FUNCTION_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y
CONFIG_HAVE_FUNCTION_TRACE_MCOUNT_TEST=y
CONFIG_HAVE_DYNAMIC_FTRACE=y
CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y
CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
CONFIG_HAVE_C_RECORDMCOUNT=y
CONFIG_RING_BUFFER=y
CONFIG_FTRACE_NMI_ENTER=y
CONFIG_EVENT_TRACING=y
CONFIG_EVENT_POWER_TRACING_DEPRECATED=y
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_TRACING_SUPPORT=y
CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
CONFIG_FUNCTION_GRAPH_TRACER=y
# CONFIG_IRQSOFF_TRACER is not set
# CONFIG_PREEMPT_TRACER is not set
# CONFIG_SCHED_TRACER is not set
# CONFIG_FTRACE_SYSCALLS is not set
CONFIG_BRANCH_PROFILE_NONE=y
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
# CONFIG_PROFILE_ALL_BRANCHES is not set
# CONFIG_STACK_TRACER is not set
CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_KPROBE_EVENT=y
CONFIG_DYNAMIC_FTRACE=y
# CONFIG_FUNCTION_PROFILER is not set
CONFIG_FTRACE_MCOUNT_RECORD=y
# CONFIG_FTRACE_STARTUP_TEST is not set
# CONFIG_MMIOTRACE is not set
# CONFIG_RING_BUFFER_BENCHMARK is not set
CONFIG_PROVIDE_OHCI1394_DMA_INIT=y
CONFIG_DYNAMIC_DEBUG=y
CONFIG_DMA_API_DEBUG=y
# CONFIG_ATOMIC64_SELFTEST is not set
# CONFIG_ASYNC_RAID6_TEST is not set
# CONFIG_SAMPLES is not set
CONFIG_HAVE_ARCH_KGDB=y
CONFIG_KGDB=y
CONFIG_KGDB_SERIAL_CONSOLE=y
# CONFIG_KGDB_TESTS is not set
# CONFIG_KGDB_LOW_LEVEL_TRAP is not set
# CONFIG_KGDB_KDB is not set
CONFIG_HAVE_ARCH_KMEMCHECK=y
# CONFIG_TEST_KSTRTOX is not set
# CONFIG_STRICT_DEVMEM is not set
CONFIG_X86_VERBOSE_BOOTUP=y
CONFIG_EARLY_PRINTK=y
CONFIG_EARLY_PRINTK_DBGP=y
CONFIG_DEBUG_STACKOVERFLOW=y
CONFIG_X86_PTDUMP=y
CONFIG_DEBUG_RODATA=y
CONFIG_DEBUG_RODATA_TEST=y
CONFIG_DEBUG_SET_MODULE_RONX=y
CONFIG_DEBUG_NX_TEST=m
# CONFIG_IOMMU_DEBUG is not set
# CONFIG_IOMMU_STRESS is not set
CONFIG_HAVE_MMIOTRACE_SUPPORT=y
# CONFIG_X86_DECODER_SELFTEST is not set
CONFIG_IO_DELAY_TYPE_0X80=0
CONFIG_IO_DELAY_TYPE_0XED=1
CONFIG_IO_DELAY_TYPE_UDELAY=2
CONFIG_IO_DELAY_TYPE_NONE=3
CONFIG_IO_DELAY_0X80=y
# CONFIG_IO_DELAY_0XED is not set
# CONFIG_IO_DELAY_UDELAY is not set
# CONFIG_IO_DELAY_NONE is not set
CONFIG_DEFAULT_IO_DELAY_TYPE=0
CONFIG_DEBUG_BOOT_PARAMS=y
# CONFIG_CPA_DEBUG is not set
CONFIG_OPTIMIZE_INLINING=y
# CONFIG_DEBUG_STRICT_USER_COPY_CHECKS is not set

#
# Security options
#
CONFIG_KEYS=y
# CONFIG_ENCRYPTED_KEYS is not set
CONFIG_KEYS_DEBUG_PROC_KEYS=y
# CONFIG_SECURITY_DMESG_RESTRICT is not set
CONFIG_SECURITY=y
# CONFIG_SECURITYFS is not set
CONFIG_SECURITY_NETWORK=y
# CONFIG_SECURITY_NETWORK_XFRM is not set
# CONFIG_SECURITY_PATH is not set
# CONFIG_INTEL_TXT is not set
CONFIG_LSM_MMAP_MIN_ADDR=65534
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
CONFIG_SECURITY_SELINUX_DISABLE=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
# CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
# CONFIG_SECURITY_SMACK is not set
# CONFIG_SECURITY_TOMOYO is not set
# CONFIG_SECURITY_APPARMOR is not set
# CONFIG_IMA is not set
# CONFIG_EVM is not set
CONFIG_DEFAULT_SECURITY_SELINUX=y
# CONFIG_DEFAULT_SECURITY_DAC is not set
CONFIG_DEFAULT_SECURITY="selinux"
CONFIG_XOR_BLOCKS=m
CONFIG_ASYNC_CORE=m
CONFIG_ASYNC_MEMCPY=m
CONFIG_ASYNC_XOR=m
CONFIG_ASYNC_PQ=m
CONFIG_ASYNC_RAID6_RECOV=m
CONFIG_CRYPTO=y

#
# Crypto core or helper
#
CONFIG_CRYPTO_ALGAPI=y
CONFIG_CRYPTO_ALGAPI2=y
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_AEAD2=y
CONFIG_CRYPTO_BLKCIPHER=y
CONFIG_CRYPTO_BLKCIPHER2=y
CONFIG_CRYPTO_HASH=y
CONFIG_CRYPTO_HASH2=y
CONFIG_CRYPTO_RNG2=y
CONFIG_CRYPTO_PCOMP=y
CONFIG_CRYPTO_PCOMP2=y
CONFIG_CRYPTO_MANAGER=y
CONFIG_CRYPTO_MANAGER2=y
CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y
# CONFIG_CRYPTO_GF128MUL is not set
# CONFIG_CRYPTO_NULL is not set
# CONFIG_CRYPTO_PCRYPT is not set
CONFIG_CRYPTO_WORKQUEUE=y
# CONFIG_CRYPTO_CRYPTD is not set
CONFIG_CRYPTO_AUTHENC=y
# CONFIG_CRYPTO_TEST is not set

#
# Authenticated Encryption with Associated Data
#
# CONFIG_CRYPTO_CCM is not set
# CONFIG_CRYPTO_GCM is not set
# CONFIG_CRYPTO_SEQIV is not set

#
# Block modes
#
CONFIG_CRYPTO_CBC=y
# CONFIG_CRYPTO_CTR is not set
# CONFIG_CRYPTO_CTS is not set
# CONFIG_CRYPTO_ECB is not set
# CONFIG_CRYPTO_LRW is not set
# CONFIG_CRYPTO_PCBC is not set
# CONFIG_CRYPTO_XTS is not set

#
# Hash modes
#
CONFIG_CRYPTO_HMAC=y
# CONFIG_CRYPTO_XCBC is not set
# CONFIG_CRYPTO_VMAC is not set

#
# Digest
#
CONFIG_CRYPTO_CRC32C=m
CONFIG_CRYPTO_CRC32C_INTEL=m
# CONFIG_CRYPTO_GHASH is not set
# CONFIG_CRYPTO_MD4 is not set
CONFIG_CRYPTO_MD5=y
# CONFIG_CRYPTO_MICHAEL_MIC is not set
# CONFIG_CRYPTO_RMD128 is not set
# CONFIG_CRYPTO_RMD160 is not set
# CONFIG_CRYPTO_RMD256 is not set
# CONFIG_CRYPTO_RMD320 is not set
CONFIG_CRYPTO_SHA1=y
# CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set
# CONFIG_CRYPTO_TGR192 is not set
# CONFIG_CRYPTO_WP512 is not set
# CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL is not set

#
# Ciphers
#
# CONFIG_CRYPTO_AES is not set
# CONFIG_CRYPTO_AES_X86_64 is not set
# CONFIG_CRYPTO_AES_NI_INTEL is not set
# CONFIG_CRYPTO_ANUBIS is not set
# CONFIG_CRYPTO_ARC4 is not set
# CONFIG_CRYPTO_BLOWFISH is not set
# CONFIG_CRYPTO_CAMELLIA is not set
# CONFIG_CRYPTO_CAST5 is not set
# CONFIG_CRYPTO_CAST6 is not set
CONFIG_CRYPTO_DES=y
# CONFIG_CRYPTO_FCRYPT is not set
# CONFIG_CRYPTO_KHAZAD is not set
# CONFIG_CRYPTO_SALSA20 is not set
# CONFIG_CRYPTO_SALSA20_X86_64 is not set
# CONFIG_CRYPTO_SEED is not set
# CONFIG_CRYPTO_SERPENT is not set
# CONFIG_CRYPTO_TEA is not set
# CONFIG_CRYPTO_TWOFISH is not set
# CONFIG_CRYPTO_TWOFISH_X86_64 is not set

#
# Compression
#
# CONFIG_CRYPTO_DEFLATE is not set
CONFIG_CRYPTO_ZLIB=y
# CONFIG_CRYPTO_LZO is not set

#
# Random Number Generation
#
# CONFIG_CRYPTO_ANSI_CPRNG is not set
# CONFIG_CRYPTO_USER_API_HASH is not set
# CONFIG_CRYPTO_USER_API_SKCIPHER is not set
CONFIG_CRYPTO_HW=y
# CONFIG_CRYPTO_DEV_PADLOCK is not set
# CONFIG_CRYPTO_DEV_HIFN_795X is not set
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_APIC_ARCHITECTURE=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_VIRTUALIZATION=y
CONFIG_KVM=y
CONFIG_KVM_INTEL=m
CONFIG_KVM_AMD=m
# CONFIG_KVM_MMU_AUDIT is not set
CONFIG_VHOST_NET=y
CONFIG_BINARY_PRINTF=y

#
# Library routines
#
CONFIG_RAID6_PQ=m
CONFIG_BITREVERSE=y
CONFIG_GENERIC_FIND_FIRST_BIT=y
CONFIG_CRC_CCITT=m
CONFIG_CRC16=m
CONFIG_CRC_T10DIF=y
# CONFIG_CRC_ITU_T is not set
CONFIG_CRC32=y
# CONFIG_CRC7 is not set
CONFIG_LIBCRC32C=m
# CONFIG_CRC8 is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_LZO_COMPRESS=y
CONFIG_LZO_DECOMPRESS=y
CONFIG_XZ_DEC=y
CONFIG_XZ_DEC_X86=y
CONFIG_XZ_DEC_POWERPC=y
CONFIG_XZ_DEC_IA64=y
CONFIG_XZ_DEC_ARM=y
CONFIG_XZ_DEC_ARMTHUMB=y
CONFIG_XZ_DEC_SPARC=y
CONFIG_XZ_DEC_BCJ=y
# CONFIG_XZ_DEC_TEST is not set
CONFIG_DECOMPRESS_GZIP=y
CONFIG_DECOMPRESS_BZIP2=y
CONFIG_DECOMPRESS_LZMA=y
CONFIG_DECOMPRESS_XZ=y
CONFIG_DECOMPRESS_LZO=y
CONFIG_HAS_IOMEM=y
CONFIG_HAS_IOPORT=y
CONFIG_HAS_DMA=y
CONFIG_CHECK_SIGNATURE=y
CONFIG_CPUMASK_OFFSTACK=y
CONFIG_CPU_RMAP=y
CONFIG_NLATTR=y
# CONFIG_AVERAGE is not set
# CONFIG_CORDIC is not set

--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 Wed Oct 26 23:02:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 23:02:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJJ32-0001yB-ID; Wed, 26 Oct 2011 23:02:40 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJIzK-0001iu-11
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 22:58:53 -0700
X-Env-Sender: hubaiz@gmail.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319695116!36804604!1
X-Originating-IP: [216.139.236.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16070 invoked from network); 27 Oct 2011 05:58:38 -0000
Received: from sam.nabble.com (HELO sam.nabble.com) (216.139.236.26)
	by server-2.tower-174.messagelabs.com with AES256-SHA encrypted SMTP;
	27 Oct 2011 05:58:38 -0000
Received: from [192.168.236.26] (helo=sam.nabble.com)
	by sam.nabble.com with esmtp (Exim 4.72)
	(envelope-from <hubaiz@gmail.com>) id 1RJIz6-0004i7-AD
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 22:58:36 -0700
Date: Wed, 26 Oct 2011 22:58:36 -0700 (PDT)
From: Zoltan Hubai <hubaiz@gmail.com>
To: xen-devel@lists.xensource.com
Message-ID: <1319695116310-4942047.post@n5.nabble.com>
In-Reply-To: <1319636130.20499.YahooMailNeo@web29808.mail.ird.yahoo.com>
References: <1316618006.67296.YahooMailNeo@web29818.mail.ird.yahoo.com>
	<1316693722029-4829929.post@n5.nabble.com>
	<20110922182705.GE12984@reaktio.net>
	<1316728444821-4831624.post@n5.nabble.com>
	<1316777654598-4833174.post@n5.nabble.com>
	<1316786412428-4833637.post@n5.nabble.com>
	<20110923172115.GI12984@reaktio.net>
	<1318672856439-4904945.post@n5.nabble.com>
	<1319630071722-4939528.post@n5.nabble.com>
	<1319636130.20499.YahooMailNeo@web29808.mail.ird.yahoo.com>
Subject: Re: Re : Re : Re : Re : Re : [Xen-devel] Re: Patches for
	VGA-Passthrough XEN 4.2 unstable
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
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

The joy was a bit early :(

In windows 7 (32/64 bit) I managed to install the driver but every time I
tried to start 3dMark 6 or vantage it ended up in BSOD complaining about
nvlddmkm.sys, also entering the nvidia control panel "Adjust image settings
with preview" I got the same BSOD.
I also tried once more to install the latest drivers but with no luck. The
drivers install but they report that there is no nvidia hardware.

I noticed that if I shutdown the domu then I can start it again, but if I
restart the domu then I need to restart the dom0 (i got this with winxp and
win7 domu).

In winxp I managed to run the 3dmark 6 till end and I think the score was
~18000, not sure about it, but it run all the test with > 60 fps.

Didn't try to play yet on xp, first I need to passthru a kbd/mouse, will try
over weekend.

I saw some modified quadro drivers maybe I try those also.

--
View this message in context: http://xen.1045712.n5.nabble.com/Patches-for-VGA-Passthrough-XEN-4-2-unstable-tp4406265p4942047.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 Wed Oct 26 23:04:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 23:04:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJJ4w-0002Ln-FX; Wed, 26 Oct 2011 23:04:38 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJJ0z-0001ke-1Q
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 23:01:00 -0700
X-Env-Sender: gregkh@suse.de
X-Msg-Ref: server-8.tower-182.messagelabs.com!1319695228!896695!1
X-Originating-IP: [195.135.220.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24166 invoked from network); 27 Oct 2011 06:00:28 -0000
Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15)
	by server-8.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 27 Oct 2011 06:00:28 -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 2086F8ADF6;
	Thu, 27 Oct 2011 08:00:28 +0200 (CEST)
Date: Thu, 27 Oct 2011 07:48:06 +0200
From: Greg KH <gregkh@suse.de>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Message-ID: <20111027054806.GA1377@suse.de>
References: <20111027053007.GA32765@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111027053007.GA32765@phenom.dumpdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: xen-devel@lists.xensource.com, miche@google.com,
	linux-kernel@vger.kernel.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 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:
> 
> [    2.382984] console [hvc0] enabled
> [    2.382984] console [hvc0] enabled
> [    2.382984] console [hvc0] enabled
> [    2.382984] console [hvc0] enabled
> [    2.382984] console [hvc0] enabled
> [    2.382984] console [hvc0] enabled
> .. 
> 
> (see attached file titled bad.log)
> 
> If I use Linus's latest git tree and revert your patch I get the kernel
> to bootup (see good.log file),

Ick, not good, thanks for letting us know.

Miche, want me to just revert this, or do you think you can fix it?

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 Oct 26 23:58:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Wed, 26 Oct 2011 23:58:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJJvA-0003pg-DX; Wed, 26 Oct 2011 23:58:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJJtr-0003ct-Ea
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 23:57:16 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-7.tower-216.messagelabs.com!1319698631!1221813!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4977 invoked from network); 27 Oct 2011 06:57:12 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-7.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 27 Oct 2011 06:57: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 5926F2BCD;
	Thu, 27 Oct 2011 09:57:11 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 3583D200AD; Thu, 27 Oct 2011 09:57:11 +0300 (EEST)
Date: Thu, 27 Oct 2011 09:57:11 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Ian Campbell <ian.campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] unmodified_drivers: update README from
	http://wiki.xen.org/xenwiki/UnmodifiedDrivers
Message-ID: <20111027065710.GN12984@reaktio.net>
References: <36b5adb30766e16a1a3a.1319645929@cosworth.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <36b5adb30766e16a1a3a.1319645929@cosworth.uk.xensource.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
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, Oct 26, 2011 at 05:18:49PM +0100, Ian Campbell wrote:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@citrix.com>
> # Date 1319645918 -3600
> # Node ID 36b5adb30766e16a1a3a4e900b3219f9fc7c40ed
> # Parent  80c36c519e89e9ee487c94d80ac94fe216f3cdbc
> unmodified_drivers: update README from http://wiki.xen.org/xenwiki/UnmodifiedDrivers
> 

There's also a related wiki page:
http://wiki.xen.org/xenwiki/XenLinuxPVonHVMdrivers

should we link that to UnmodifiedDrivers ?

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-api-bounces@lists.xensource.com Thu Oct 27 00:02:11 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 00:02:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJJyb-00046O-OL; Thu, 27 Oct 2011 00:02:10 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJJwi-0003xx-Bs; Thu, 27 Oct 2011 00:00:14 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-10.tower-21.messagelabs.com!1319698808!1815690!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30102 invoked from network); 27 Oct 2011 07:00:09 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-10.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 27 Oct 2011 07:00:09 -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 0ED962D85;
	Thu, 27 Oct 2011 10:00:07 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 641A9200AD; Thu, 27 Oct 2011 10:00:07 +0300 (EEST)
Date: Thu, 27 Oct 2011 10:00:07 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Mark Schneider <ms@it-infrastrukturen.org>
Message-ID: <20111027070007.GO12984@reaktio.net>
References: <4EA868F1.3060501@it-infrastrukturen.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA868F1.3060501@it-infrastrukturen.org>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: "M. Schneider" <ms@it-infrastrukturen.com>, xen-devel@lists.xensource.com,
	xen-api@lists.xensource.com
Subject: [Xen-API] Re: [Xen-devel] XCP 1.1 issue: This command is only
	allowed on the OEM edition
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 Wed, Oct 26, 2011 at 10:09:21PM +0200, Mark Schneider wrote:
>    Hello,
> 

Hello,

XCP bug reports should go to xen-api mailinglist.. 

>    Is it a bug or a feature?
>    # ---
>    xe update-upload file-name=Other-linux-template
>    host-uuid=280e2816-2d45-4217-881e-e2ad4b423159
>    This command is only allowed on the OEM edition.
>    command: update-upload

-- Pasi


_______________________________________________
xen-api mailing list
xen-api@lists.xensource.com
http://lists.xensource.com/mailman/listinfo/xen-api

From xen-devel-bounces@lists.xensource.com Thu Oct 27 01:05:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 01:05:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJKy2-0006cP-3f; Thu, 27 Oct 2011 01:05:38 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJKvM-0006OB-KM
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 01:03:11 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1319702552!45919204!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18425 invoked from network); 27 Oct 2011 08:02:32 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-13.tower-27.messagelabs.com with SMTP;
	27 Oct 2011 08:02:32 -0000
Received: from p5b2e2a76.dip.t-dialin.net ([91.46.42.118] helo=[192.168.2.143])
	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 1RJKvF-0005jY-2b; Thu, 27 Oct 2011 08:02:45 +0000
Message-ID: <4EA91023.5000201@canonical.com>
Date: Thu, 27 Oct 2011 10:02:43 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux i686;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.com>
	<AEAE0D618F71583484DA951D@nimrod.local>
	<1319647412.9436.50.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319647412.9436.50.camel@zakaz.uk.xensource.com>
X-Enigmail-Version: 1.4a1pre
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad@rly45j.srv.mailcontrol.com, Alex Bligh <alex@alex.org.uk>,
	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 26.10.2011 18:43, Ian Campbell wrote:
> On Wed, 2011-10-26 at 17:25 +0100, Alex Bligh wrote:
>> Ian,
>>
>>> No, this will disable PV drivers.
>>
>> I can confirm that our testing illustrates this :-(
>>
>>> The decision to unplug is a kernel side decision and in PVHVM Linux
>>> kernels is not currently possible to have both types of devices by
>>> default due to the risk of dataloss if the guest is not correctly
>>> configured (i.e. the kernel can't tell if it is mounting the same
>>> filesystem via two paths). The xen_emul_unplug option is the current way
>>> you can override this once you have confirmed that your guest
>>> configuration is not dangerous. I'm afraid this necessarily involves
>>> guest config and guest admin interaction.
>>>
>>> In principal we might be able to extend the unplug protocol (which would
>>> involve patches to qemu, the kernel(s) and the toolstack) to allow
>>> devices to be marked as being not necessary to unplug. Someone would
>>> have to send patches though and it would be opening up a way for people
>>> to lose data so we'd need to be careful.
>>>
>>> I'm sure that the unplug protocol is documented somewhere in the source
>>> tree but I can't for the life of me find it :-(
>>
>> So, the issue is this. We have thousands (literally) of disks in use
>> by third parties on xen 3.3. Some are Windows, some are ancient linux,
>> some are modern linux, etc. The hypervisor has no way of whether the
>> images are going to use /dev/sda or /dev/xvda (i.e. PV or emulated)
>> drivers. Indeed the most common linux case is that grub uses the
>> emulated devices to load the kernel, then uses /dev/xvda as a root
>> device, i.e. both are used (but not simultaneously).
>>
>> We need to have the xen pci stuff on, so PV drivers operate (in both
>> new and old kernels). But as modern linux kernels detect the unplug 
>> functionality, they will unplug the emulated devices and then fail to
>> boot because (for instance) under Xen3.3 using /dev/sdaX to access
>> (say) your /boot partition worked perfectly well. What we need is a
>> switch to revert to the old Xen3.3 (pre-unplug) behaviour, so any
>> Linux kernel will see the same set of devices. I cannot believe this
>> is a unique requirement for people attempting to do a Xen3.3 to
>> Xen4.1 migration.
> 
> I'm a bit fuzzy on the details but I'm not sure what this has to do with
> the host, the device naming and behaviour on unplug are kernel side
> things, I'd expect that if /dev/sdaX as /boot worked on 3.3 it'll work
> on 4.1 too. (I believe you that it doesn't work, I'm just wondering
> aloud what I'm missing).
> 
> Can you give us the specifics of a setup which fails, e.g. a complete
> guest cfg file, the kernel version, command line options, /etc/fstab,
> dmesg etc.
> 
>> I think this is in xen_unplug_emulated_devices() in
>> arch/x86/xen/platform-pci-unplug.c
>>
>> This uses check_platform_magic(), which I have appended. In order
>> to avoid unplugging (without relying on the boot line), I need
>> this to return a non-zero value (XEN_PLATFORM_ERR_MAGIC is
>> irrelevant as xen_emul_unplug is 0 by assumption).
>>
>> I can achieve that by either (a) returning a bad magic number,
>> (b) making the host 'blacklist' the product (how does that work?)
>> or (c) using a protocol value of (say) 0. I take it Xen 3.3 simply
>> returns a bad magic number as I don't think XEN_IOPORT_MAGIC existed
>> in 3.3. As far as I can tell, XEN_IOPORT_MAGIC is only use for
>> PCI unplug.
>>
>> So, is the correct approach to disable XEN_IOPORT_MAGIC (or rather
>> make it return a different value) depending on a configuration option?
>> If so, I am happy to submit a patch to do that. Or can I do this
>> without a patch by "blacklisting" everything? (not sure how that is done).
> 
> Hmm, yes I think the special treatment of XEN_IOPORT_MAGIC mismatch on
> the kernel side is what I was missing.
> 
> It might make sense to have a guest level config option which disables
> these magic ports, i.e. makes them return 0xffff like they would have
> done in 3.3 (I think 0xffff is what you'll get from an invalid port in
> general).
> 
>> Out of interest, with a default guest Ubuntu Natty install CD, using the
>> default Xen 4.1 settings, we are seeing the guest (a) unplugging the
>> emulated devices (fine), then (b) failing to find the emulated devices,
>> and (c) the install failing. Is that to be expected?
> 
> Sounds like an Ubuntu bug to me, but I don't follow Ubuntu closely
> enough to know if it is known or not.
> 
At least one part is not Ubuntu specific. And that is that the unplug logic
decides to unplug emulated devices based on having the pci and the blkfront
driver *available* (built-in or module). But later on the blkfront driver
ignores all devices that are not *named* in a way to map to the xvd major.
Which leaves you without any usable devices when you named your disk hda in
the config file and you do not prevent unplugging.

The other part of the problem is that even when you name the disk xvda in the
config file, the installer does not know about blkfront. This is Ubuntu specific
and we either need to have blkfront built-in or put them into a special udeb
which is a special handling just for the installer.

Still I would love to see this unplug handling become a bit more obvious. If
unplug was successful, then blkfront should not ignore the devices. Or maybe
just make the config more what-you-write-is-what-you-get and having hd or sd
there only gives you emulated devices and xvd gives you pv devices.

-Stefan

> Ian.
> 
> 
> _______________________________________________
> 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 Oct 27 02:02:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 02:02:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJLr5-0001lU-KW; Thu, 27 Oct 2011 02:02:31 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJLnU-0001Uo-IC
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 01:58:57 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319705919!36829332!4
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10522 invoked from network); 27 Oct 2011 08:58:45 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 08:58:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315195200"; d="scan'208";a="18583836"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 04:58:44 -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; Thu, 27 Oct 2011 04:58:44 -0400
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
	p9R8wbpV021573;	Thu, 27 Oct 2011 01:58:43 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 8ddcfa3917a695cd6d533376e11e0e6e4da8d673
Message-ID: <8ddcfa3917a695cd6d53.1319705922@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319705916@cosworth.uk.xensource.com>
References: <patchbomb.1319705916@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 27 Oct 2011 09:58:42 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 6 of 6 DOCDAY] docs: install text 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 1319705722 -3600
# Node ID 8ddcfa3917a695cd6d533376e11e0e6e4da8d673
# Parent  74e5af602abf03022e8e118bb58876e13812612f
docs: install text documentation

Including markdown docs.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 74e5af602abf -r 8ddcfa3917a6 .hgignore
--- a/.hgignore	Thu Oct 27 09:55:14 2011 +0100
+++ b/.hgignore	Thu Oct 27 09:55:22 2011 +0100
@@ -57,6 +57,7 @@
 ^docs/user/labels\.pl$
 ^docs/user/user\.css$
 ^docs/user/user\.html$
+^docs/txt/.*$
 ^docs/xen-api/vm_lifecycle.eps$
 ^docs/xen-api/xenapi-datamodel-graph.eps$
 ^docs/xen-api/xenapi.out$
diff -r 74e5af602abf -r 8ddcfa3917a6 docs/Makefile
--- a/docs/Makefile	Thu Oct 27 09:55:14 2011 +0100
+++ b/docs/Makefile	Thu Oct 27 09:55:22 2011 +0100
@@ -16,13 +16,16 @@ DOC_PS		:= $(patsubst src/%.tex,ps/%.ps,
 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))
+DOC_TXT         := $(patsubst %.txt,txt/%.txt,$(wildcard misc/*.txt)) \
+		   $(patsubst %.markdown,txt/%.txt,$(DOC_MARKDOWN))
+
 GFX = $(patsubst %.fig, %.eps, $(wildcard figs/*.fig))
 
 .PHONY: all
 all: build
 
 .PHONY: build
-build: ps pdf html man-pages
+build: ps pdf html txt man-pages
 	@if which $(DOT) 1>/dev/null 2>/dev/null ; then              \
 	$(MAKE) -C xen-api build ; else                              \
         echo "Graphviz (dot) not installed; skipping xen-api." ; fi
@@ -40,6 +43,9 @@ pdf: $(DOC_PDF)
 .PHONY: html
 html: $(DOC_HTML)
 
+.PHONY: txt
+txt: $(DOC_TXT)
+
 .PHONY: python-dev-docs
 python-dev-docs:
 	@mkdir -v -p api/tools/python
@@ -122,3 +128,13 @@ html/%.html: %.markdown
 	echo "Running markdown to generate $*.html ... "; \
 	$(MARKDOWN) $< > $@.tmp ; \
 	$(call move-if-changed,$@.tmp,$@) ; fi
+
+txt/%.txt: %.txt
+	$(INSTALL_DIR) $(@D)
+	cp $< $@.tmp
+	$(call move-if-changed,$@.tmp,$@)
+
+txt/%.txt: %.markdown
+	$(INSTALL_DIR) $(@D)
+	cp $< $@.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 Thu Oct 27 02:05:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 02:05:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJLtb-0002A9-K7; Thu, 27 Oct 2011 02:05:07 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJLnS-0001Ui-4K
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 01:58:58 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319705920!1861931!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18056 invoked from network); 27 Oct 2011 08:58:42 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 08:58:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315195200"; d="scan'208";a="168399877"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 04:58:41 -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; Thu, 27 Oct 2011 04:58:42 -0400
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
	p9R8wbpS021573;	Thu, 27 Oct 2011 01:58:40 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: b49eb99dc11aff809566f4b5bd53053aa5daef7d
Message-ID: <b49eb99dc11aff809566.1319705919@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319705916@cosworth.uk.xensource.com>
References: <patchbomb.1319705916@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 27 Oct 2011 09:58:39 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 3 of 6 DOCDAY] unmodified_drivers: update README
 from http://wiki.xen.org/xenwiki/UnmodifiedDrivers
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319647443 -3600
# Node ID b49eb99dc11aff809566f4b5bd53053aa5daef7d
# Parent  52058c9448935818e2a810a438244e06f40b4e0e
unmodified_drivers: update README from http://wiki.xen.org/xenwiki/UnmodifiedDrivers

Add reference to the fact that these drivers are for "classic-Xen" kernels only
and do not work with PVops but point towards the PVHVM functionality in
mainstream.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 52058c944893 -r b49eb99dc11a unmodified_drivers/linux-2.6/README
--- a/unmodified_drivers/linux-2.6/README	Wed Oct 26 17:23:37 2011 +0100
+++ b/unmodified_drivers/linux-2.6/README	Wed Oct 26 17:44:03 2011 +0100
@@ -1,10 +1,19 @@
-To build:
+These drivers provide paravirtualised drivers for pre-PVops Linux
+kernels which have the classic-Xen patches applied. They do not work
+with kernels which are not patched with the classic-Xen patches. In
+particular this includes all PVops kernels.
 
-1. ./mkbuildtree [<arch>]
+For 2.6.36 and newer you should use the "PVHVM" functionality which is
+available in the mainline kernel.
+
+To build do one of:
+
+   ./mkbuildtree [<arch>]
    NB. You can override paths to Xen sources and a (stub) XenLinux
        build tree via the XEN and XL environment variable.
 
-2. make -C /path/to/kernel/build M=$PWD modules
+- or -
+   make -C /path/to/kernel/build M=$PWD modules
    NB. This is your native kernel build tree (or a distro provided
        stub), not the XenLinux sources referred to in step 1.
    NB. If you are cross compiling, you need to set ARCH and

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 02:07:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 02:07:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJLvU-0002YD-10; Thu, 27 Oct 2011 02:07:04 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJLnT-0001Ul-8U
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 01:58:57 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319705920!1861931!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18143 invoked from network); 27 Oct 2011 08:58:43 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 08:58:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315195200"; d="scan'208";a="168399881"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 04:58: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; Thu, 27 Oct 2011 04:58:43 -0400
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
	p9R8wbpU021573;	Thu, 27 Oct 2011 01:58:42 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 74e5af602abf03022e8e118bb58876e13812612f
Message-ID: <74e5af602abf03022e8e.1319705921@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319705916@cosworth.uk.xensource.com>
References: <patchbomb.1319705916@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 27 Oct 2011 09:58:41 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 5 of 6 DOCDAY] xl: add some example
	configuration 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

# HG changeset patch
# User Ian Campbell <ian.campbell@citrix.com>
# Date 1319705714 -3600
# Node ID 74e5af602abf03022e8e118bb58876e13812612f
# Parent  996143b104f0c027ad45b9e04bdccd342e7a1b94
xl: add some example configuration files

These are much more minimal than the equivalent xmexamples but should
eventually reference a more complete document describing the available options.

These are based on the guest configuration files that I actually use day-to-day.

There is an unresolved reference to a document describing the complete syntax.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 996143b104f0 -r 74e5af602abf tools/examples/xlexample.hvm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/examples/xlexample.hvm	Thu Oct 27 09:55:14 2011 +0100
@@ -0,0 +1,39 @@
+# =====================================================================
+# Example HVM guest configuration
+# =====================================================================
+#
+# This is a fairly minimal example of what is required for an
+# HVM guest. For a more complete guide see <XXX Document TBD>
+
+# Guest name
+name = "example.hvm"
+
+# 128-bit UUID for the domain as a hexadecimal number.
+# Use "uuidgen" to generate one if required.
+# The default behavior is to generate a new UUID each time the guest is started.
+#uuid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
+
+# Initial memory allocation (MB)
+memory = 128
+
+# Maximum memory (MB)
+# If this is greater than `memory' then the slack will start ballooned
+# (this assumes guest kernel support for ballooning)
+#maxmem = 512
+
+# Number of VCPUS
+vcpus = 2
+
+# Network devices
+# A list of 'vifspec' entries as described in
+# docs/misc/xl-network-configuration.markdown
+vif = [ '' ]
+
+# Disk Devices
+# A list of `diskspec' entries as described in
+# docs/misc/xl-disk-configuration.txt
+disk = [ '/dev/vg/guest-volume,raw,xvda,rw' ]
+
+# Guest VGA console configuration, either SDL or VNC
+sdl = 1
+#vnc = 1
diff -r 996143b104f0 -r 74e5af602abf tools/examples/xlexample.pvlinux
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/examples/xlexample.pvlinux	Thu Oct 27 09:55:14 2011 +0100
@@ -0,0 +1,44 @@
+# =====================================================================
+# Example PV Linux guest configuration
+# =====================================================================
+#
+# This is a fairly minimal example of what is required for a
+# Paravirtualised Linux guest. For a more complete guide see <XXX Document TBD>
+
+# Guest name
+name = "example.pvlinux"
+
+# 128-bit UUID for the domain as a hexadecimal number.
+# Use "uuidgen" to generate one if required.
+# The default behavior is to generate a new UUID each time the guest is started.
+#uuid = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
+
+# Kernel image to boot
+kernel = "/boot/vmlinuz"
+
+# Ramdisk (optional)
+#ramdisk = "/boot/initrd.gz"
+
+# Kernel command line options
+extra = "root=/dev/xvda1"
+
+# Initial memory allocation (MB)
+memory = 128
+
+# Maximum memory (MB)
+# If this is greater than `memory' then the slack will start ballooned
+# (this assumes guest kernel support for ballooning)
+#maxmem = 512
+
+# Number of VCPUS
+vcpus = 2
+
+# Network devices
+# A list of 'vifspec' entries as described in
+# docs/misc/xl-network-configuration.markdown
+vif = [ '' ]
+
+# Disk Devices
+# A list of `diskspec' entries as described in
+# docs/misc/xl-disk-configuration.txt
+disk = [ '/dev/vg/guest-volume,raw,xvda,rw' ]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 02:09:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 02:09:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJLxp-0002xE-A0; Thu, 27 Oct 2011 02:09:29 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJLnR-0001Uh-Gy
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 01:58:57 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319705920!1861931!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18023 invoked from network); 27 Oct 2011 08:58:42 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 08:58:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315195200"; d="scan'208";a="168399876"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 04:58:40 -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; Thu, 27 Oct 2011 04:58:40 -0400
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
	p9R8wbpQ021573;	Thu, 27 Oct 2011 01:58:39 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 03b570c3792bb6abce46de5c9ab560ac169117c3
Message-ID: <03b570c3792bb6abce46.1319705917@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319705916@cosworth.uk.xensource.com>
References: <patchbomb.1319705916@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 27 Oct 2011 09:58:37 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 1 of 6 DOCDAY] docs: import HVM emulated device
 unplug protocol spec
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319646021 -3600
# Node ID 03b570c3792bb6abce46de5c9ab560ac169117c3
# Parent  c681dd5aecf3da3c6fd0e4d8a760a9cd18617033
docs: import HVM emulated device unplug protocol spec

Convert to markdown as I go.

Currently this lives in qemu-xen.git i386-dm/README.hvm-pv-magic-ioport-disable
and I can never find it when I want it. As we transition to upstream qemu this
location becomes less useful.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r c681dd5aecf3 -r 03b570c3792b docs/misc/hvm-emulated-unplug.markdown
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/misc/hvm-emulated-unplug.markdown	Wed Oct 26 17:20:21 2011 +0100
@@ -0,0 +1,68 @@
+#Xen HVM emulated device unplug protocol
+
+The protocol covers three basic things:
+
+ * Disconnecting emulated devices.
+ * Getting log messages out of the drivers and into dom0.
+ * Allowing dom0 to block the loading of specific drivers.  This is
+   intended as a backwards-compatibility thing: if we discover a bug
+   in some old version of the drivers, then rather than working around
+   it in Xen, we have the option of just making those drivers fall
+   back to emulated mode.
+
+The current protocol works like this (from the point of view of
+drivers):
+
+1. When the drivers first come up, they check whether the unplug logic
+   is available by reading a two-byte magic number from IO port `0x10`.
+   These should be `0x49d2`.  If the magic number doesn't match, the
+   drivers don't do anything.
+
+2. The drivers read a one-byte protocol version from IO port `0x12`.  If
+   this is 0, skip to 6.
+
+3. The drivers write a two-byte product number to IO port `0x12`.  At
+   the moment, the only drivers using this protocol are our
+   closed-source ones, which use product number 1.
+
+4. The drivers write a four-byte build number to IO port `0x10`.
+
+5. The drivers check the magic number by reading two bytes from `0x10`
+   again.  If it's changed from `0x49d2` to `0xd249`, the drivers are
+   blacklisted and should not load.
+
+6. The drivers write a two-byte bitmask of devices to unplug to IO
+   port `0x10`.  The defined fields are:
+
+  * `1` -- All IDE disks (not including CD drives)
+  * `2` -- All emulated NICs
+  * `4` -- All IDE disks except for the primary master (not including CD
+	   drives)
+
+   The relevant emulated devices then disappear from the relevant
+   buses.  For most guest operating systems, you want to do this
+   before device enumeration happens.
+
+Once the drivers have checked the magic number, they can send log
+messages to qemu which will be logged to wherever qemu's logs go
+(`/var/log/xen/qemu-dm.log` on normal Xen, dom0 syslog on XenServer).
+These messages are written to IO port `0x12` a byte at a time, and are
+terminated by newlines.  There's a fairly aggressive rate limiter on
+these messages, so they shouldn't be used for anything even vaguely
+high-volume, but they're rather useful for debugging and support.
+
+It is still permitted for a driver to use this logging feature if it
+is blacklisted, but *ONLY* if it has checked the magic number and found
+it to be `0x49d2` or `0xd249`.
+
+This isn't exactly a pretty protocol, but it does solve the problem.
+
+The blacklist is, from qemu's point of view, handled mostly through
+xenstore.  A driver version is considered to be blacklisted if
+`/mh/driver-blacklist/{product_name}/{build_number}` exists and is
+readable, where `{build_number}` is the build number from step 4 as a
+decimal number.  `{product_name}` is a string corresponding to the
+product number in step 3.
+
+The master registry of product names and numbers is in
+qemu-xen-unstable's xenstore.c.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 02:11:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 02:11:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJM00-0003L8-1u; Thu, 27 Oct 2011 02:11:44 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJLnQ-0001Uf-Sh
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 01:58:57 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319705919!36829332!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10202 invoked from network); 27 Oct 2011 08:58:40 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 08:58:40 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315195200"; d="scan'208";a="18583833"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 04:58:39 -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; Thu, 27 Oct 2011 04:58:39 -0400
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
	p9R8wbpP021573;	Thu, 27 Oct 2011 01:58:38 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-ID: <patchbomb.1319705916@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 27 Oct 2011 09:58:36 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 0 of 6 DOCDAY] docs updates
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Here is some documentation I wrote as part of the doc day yesterday
(and this morning if I'm honest).

I posted a bunch of it yesterday but this incorporates some additional
stuff.

* Import PVHVM unplug protocol specification from
  qemu-xen-unstable.git.
* Install markdown documentation as both HTML and TXT.
* Updated unmodified devices README based on information on wiki.
* Document the xl vif configuration syntax in a manner similar to the
  existing disk configuration.
* Add some basic xl configuration file examples

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 02:14:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 02:14:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJM2E-0003jj-RP; Thu, 27 Oct 2011 02:14:02 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJLnQ-0001Ug-Sg
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 01:58:57 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319705919!36829332!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10258 invoked from network); 27 Oct 2011 08:58:41 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 08:58:41 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315195200"; d="scan'208";a="18583834"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 04:58:40 -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; Thu, 27 Oct 2011 04:58:41 -0400
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
	p9R8wbpR021573;	Thu, 27 Oct 2011 01:58:39 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 52058c9448935818e2a810a438244e06f40b4e0e
Message-ID: <52058c9448935818e2a8.1319705918@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319705916@cosworth.uk.xensource.com>
References: <patchbomb.1319705916@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 27 Oct 2011 09:58:38 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 2 of 6 DOCDAY] docs: add some scaffolding for
 building HTML docs from markdown
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319646217 -3600
# Node ID 52058c9448935818e2a810a438244e06f40b4e0e
# Parent  03b570c3792bb6abce46de5c9ab560ac169117c3
docs: add some scaffolding for building HTML docs from markdown

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r 03b570c3792b -r 52058c944893 docs/Docs.mk
--- a/docs/Docs.mk	Wed Oct 26 17:20:21 2011 +0100
+++ b/docs/Docs.mk	Wed Oct 26 17:23:37 2011 +0100
@@ -7,3 +7,4 @@ DOXYGEN		:= doxygen
 POD2MAN		:= pod2man
 DOT		:= dot
 NEATO		:= neato
+MARKDOWN	:= markdown
diff -r 03b570c3792b -r 52058c944893 docs/Makefile
--- a/docs/Makefile	Wed Oct 26 17:20:21 2011 +0100
+++ b/docs/Makefile	Wed Oct 26 17:23:37 2011 +0100
@@ -11,10 +11,11 @@ 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_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))
-
+DOC_HTML	:= $(patsubst src/%.tex,html/%/index.html,$(DOC_TEX)) \
+		   $(patsubst %.markdown,html/%.html,$(DOC_MARKDOWN))
 GFX = $(patsubst %.fig, %.eps, $(wildcard figs/*.fig))
 
 .PHONY: all
@@ -37,9 +38,7 @@ ps: $(DOC_PS)
 pdf: $(DOC_PDF)
 
 .PHONY: html
-html:
-	@if which $(LATEX2HTML) 1>/dev/null 2>/dev/null; then \
-	$(MAKE) $(DOC_HTML); fi
+html: $(DOC_HTML)
 
 .PHONY: python-dev-docs
 python-dev-docs:
@@ -110,7 +109,16 @@ ps/%.ps: %.dvi
 	$(FIG2DEV) -L eps $< $@
 
 html/%/index.html: src/%.tex
-	$(INSTALL_DIR) $(@D)
+	@$(INSTALL_DIR) $(@D)
+	@set -e ; if which $(LATEX2HTML) 1>/dev/null 2>/dev/null; then \
+        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
+	$< 1>/dev/null 2>/dev/null ;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

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 02:16:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 02:16:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJM4G-00048J-0m; Thu, 27 Oct 2011 02:16:08 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJLnS-0001Uk-II
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 01:58:59 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319705919!36829332!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10407 invoked from network); 27 Oct 2011 08:58:43 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 08:58:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315195200"; d="scan'208";a="18583835"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 04:58:42 -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; Thu, 27 Oct 2011 04:58:42 -0400
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
	p9R8wbpT021573;	Thu, 27 Oct 2011 01:58:41 -0700
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 996143b104f0c027ad45b9e04bdccd342e7a1b94
Message-ID: <996143b104f0c027ad45.1319705920@cosworth.uk.xensource.com>
In-Reply-To: <patchbomb.1319705916@cosworth.uk.xensource.com>
References: <patchbomb.1319705916@cosworth.uk.xensource.com>
User-Agent: Mercurial-patchbomb/1.6.4
Date: Thu, 27 Oct 2011 09:58:40 +0100
From: Ian Campbell <ian.campbell@citrix.com>
To: xen-devel@lists.xensource.com
Cc: ian.jackson@citrix.com
Subject: [Xen-devel] [PATCH 4 of 6 DOCDAY] docs: add a document describing
 the xl vif 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 1319705668 -3600
# Node ID 996143b104f0c027ad45b9e04bdccd342e7a1b94
# Parent  b49eb99dc11aff809566f4b5bd53053aa5daef7d
docs: add a document describing the xl vif syntax

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>

diff -r b49eb99dc11a -r 996143b104f0 docs/misc/xl-network-configuration.markdown
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/misc/xl-network-configuration.markdown	Thu Oct 27 09:54:28 2011 +0100
@@ -0,0 +1,126 @@
+# XL Network Configuration
+
+## Syntax Overview
+
+This document specifies the xl config file format vif configuration
+option.  It has the following form:
+
+        vif = [ '<vifspec>', '<vifspec>', ... ]
+
+where each vifspec is in this form:
+    
+        [<key>=<value>|<flag>,]
+
+For example:
+
+        'mac=00:16:3E:74:3d:76,model=rtl8139,bridge=xenbr0'
+        'mac=00:16:3E:74:34:32'
+        '' # The empty string
+
+These might be specified in the domain config file like this:
+
+        vif = [ 'mac=00:16:3E:74:34:32', 'mac=00:16:3e:5f:48:e4,bridge=xenbr1' ]
+
+More formally, the string is a series of comma-separated keyword/value
+pairs. All keywords are optional.
+
+Each device has a `DEVID` which is its index within the vif list, starting from 0.
+
+## Keywords
+
+### mac
+
+If specified then this option specifies the MAC address inside the
+guest of this VIF device. The value is a 48-bit number represented as
+six groups of two hexadecimal digits, separated by colons (:).
+
+The default if this keyword is not specified is to be automatically
+generate a MAC address inside the space assigned to Xen's
+[Organizationally Unique Identifier][oui] (00:16:3e).
+
+If you are choosing a MAC address then it is strongly recommend to
+follow one of the following strategies:
+
+  * Generate a random sequence of 6 byte, set the locally administered
+    bit (bit 2 of the first byte) and clear the multicast bit (bit 1
+    of the first byte). In other words the first byte should have the
+    bit pattern xxxxxx10 (where x is a randomly generated bit) and the
+    remaining 5 bytes are randomly generated See
+    [http://en.wikipedia.org/wiki/MAC_address] for more details the
+    structure of a MAC address.
+  * Allocate an address from within the space defined by your
+    organization's OUI (if you have one) following your organization's
+    procedures for doing so.
+  * Allocate an address from within the space defined by Xen's OUI
+    (00:16:3e). Taking care not to clash with other users of the
+    physical network segment where this VIF will reside.
+
+If you have an OUI for your own use then that is the preferred
+strategy. Otherwise in general you should prefer to generate a random
+MAC and set the locally administered bit since this allows for more
+bits of randomness than using the Xen OUI.
+
+### bridge
+
+Specifies the name of the network bridge which this VIF should be
+added to. The default is `xenbr0`. The bridge must be configured using
+your distribution's network configuration tools. See the [wiki][net]
+for guidance and examples.
+
+### type
+
+This keyword is valid for HVM guests only.
+
+Specifies the type of device to valid values are:
+
+  * `ioemu` (default) -- this device will be provided as an emulate
+    device to the guest and also as a paravirtualised device which the
+    guest may choose to use instead if it has suitable drivers
+    available.
+  * `vif` -- this device will be provided as a paravirtualised device
+    only.
+
+### model
+
+This keyword is valid for HVM guest devices with `type=ioemu` only.
+
+Specifies the type device to emulated for this guest. Valid values
+are:
+
+  * `rtl8139` (default) -- Realtek RTL8139
+  * `e1000` -- Intel E1000 
+  * in principal any device supported by your device model
+
+### vifname
+
+This keyword is valid for HVM guest devices with `type=ioemu` only.
+
+Specifies the backend device name for an emulated device. The default
+is `tapDOMID.DEVID` where `DOMID` is the guest domain ID and `DEVID`
+is the device number.
+
+### script
+
+Specifies the hotplug script to run to configure this device (e.g. to
+add it to the relevant bridge). Defaults to
+`XEN_SCRIPT_DIR/vif-bridge` but can be set to any script. Some example
+scripts are installed in `XEN_SCRIPT_DIR`.
+
+### ip
+
+Specifies the IP address for the device, the default is not to
+specify an IP address.
+
+What, if any, effect this has depends on the hotplug script which is
+configured. A typically behaviour (exhibited by the example hotplug
+scripts) if set might be to configure firewall rules to allow only the
+specified IP address to be used by the guest (blocking all others).
+
+### backend
+
+Specifies the backend domain which this device should attach to. This
+defaults to domain 0. Specifying another domain requires setting up a
+driver domain which is outside the scope of this document.
+
+[oui]: http://en.wikipedia.org/wiki/Organizationally_Unique_Identifier
+[net]: http://wiki.xen.org/xenwiki/HostConfiguration/Networking

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 02:18:02 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 02: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 1RJM64-0004bV-N8; Thu, 27 Oct 2011 02:18:02 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJLqe-0001hb-0j
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 02:02:15 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319706120!34712699!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7893 invoked from network); 27 Oct 2011 09:02:01 -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;
	27 Oct 2011 09:02:01 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8613296"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 09:02: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;
	Thu, 27 Oct 2011 10:02:00 +0100
Subject: Re: [Xen-devel] [PATCH] Prevent vif-bridge from adding user-created
	taps to a bridge
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jim Fehlig <jfehlig@suse.com>
Date: Thu, 27 Oct 2011 10:02:00 +0100
In-Reply-To: <4EA8EC01.2010904@suse.com>
References: <4EA740EB.7030804@suse.com>
	<1319614636.16747.39.camel@dagon.hellion.org.uk>
	<4EA84DBA.6070901@suse.com> <4EA8EC01.2010904@suse.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319706120.9436.68.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 Thu, 2011-10-27 at 06:28 +0100, Jim Fehlig wrote:
> Jim Fehlig wrote:
> > Ian Campbell wrote:
> >   
> >> On Wed, 2011-10-26 at 00:06 +0100, Jim Fehlig wrote:
> >>   
> >>     
> >>> I previously sent this from my @suse.com mail address without having
> >>> subscribed it.  Sending again now that I have done so...
> >>>
> >>> 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
> >>>     
> >>>       
> >> Oh dear.
> >>
> >>   
> >>     
> >>> SUBSYSTEM=="net", KERNEL=="tap*", ACTION=="add",
> >>> RUN+="/etc/xen/scripts/vif-setup $env{ACTION} type_if=tap"
> >>>
> >>> 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?
> >>>     
> >>>       
> >> I think overall your change is an improvement, some thoughts:
> >>
> >> For a tap device XENBUS_PATH is set in vif-common.sh:
> >>         elif [ "$type_if" = tap ]; then
> >>             # Check presence of compulsory args.
> >>             : ${INTERFACE:?}
> >>         
> >>             # Get xenbus_path from device name.
> >>             # The name is built like that: "tap${domid}.${devid}".
> >>             dev_=${dev#tap}
> >>             domid=${dev_%.*}
> >>             devid=${dev_#*.}
> >>         
> >>             XENBUS_PATH="/local/domain/0/backend/vif/$domid/$devid"
> >>         fi
> >>
> >> Could there be false positives from this?
> >>     
> >
> > Hmm, yes, I think it is possible.
> >   
> 
> On second thought, maybe not.  A false positive would mean two tap
> devices with the same name right?  AFAICT, that's not permitted.

Oh right, we are given $dev aren't we.
> 
> >   
> >>  Perhaps we should be more
> >> aggressively checking for the tapX.Y, where X and Y are integers, format
> >> as well? (that's not foolproof either though).
> >>   
> >>     
> >
> > Yeah, I don't think that buys us much.
> >
> >   
> >> Perhaps the toolstack could write something to xenstore containing the
> >> literal tap device name which it asked qemu for? Then we can simply read
> >> it back here, e.g. /libxl/tap/0/tapX.Y -> $XENBUS_PATH (0 being the
> >> backend domain and the content being the xenbus path so we don't need to
> >> magic it up).
> >>     
> 
> The toolstack already writes something in xenstore, namely
> $XENBUS_PATH/bridge.

XENBUS_PATH here is really the vif backend path, not the tap path,
although they in some way are aliased so in many cases that ok. I was
just thinking it might be useful to have a backend space for the tap
device only (since the guest can see the vif backend dir).

>   IMO, the problem is in vif-bridge
> 
> bridge=${bridge:-}
> bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")
> 
> if [ -z "$bridge" ]
> then
>   bridge=$(brctl show | cut -d "
> " -f 2 | cut -f 1)
> 
>   if [ -z "$bridge" ]
>   then
>      fatal "Could not find bridge, and none was specified"
>   fi
> else
>   ...
> 
> If the toolstack hasn't written anything to xenstore, vif-bridge happily
> connects the tap device to the first bridge it finds.  Shouldn't
> vif-bridge just exit if no bridge is specified?

I think that behaviour is historical (which isn't to say it's correct).
FWIW xl defaults to writing xenbr0. I don't know what xend does.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 02:20:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 02:20:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJM8J-00050T-CF; Thu, 27 Oct 2011 02:20:19 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJLrn-0001tw-Tv
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 02:03:17 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1319706192!917494!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28902 invoked from network); 27 Oct 2011 09:03:12 -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;
	27 Oct 2011 09:03:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8613337"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 09:03: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, 27 Oct 2011 10:03:11 +0100
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Date: Thu, 27 Oct 2011 10:03:11 +0100
In-Reply-To: <4EA84323.4000108@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319644068-25814-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319644068-25814-2-git-send-email-dgdegra@tycho.nsa.gov>
	<1319647887.9436.55.camel@zakaz.uk.xensource.com>
	<4EA84323.4000108@tycho.nsa.gov>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319706191.9436.69.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Keir \(Xen.org\)" <keir@xen.org>, "jeremy@goop.org" <jeremy@goop.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Jackson <Ian.Jackson@eu.citrix.com>,
	"konrad.wilk@oracle.com" <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH 1/3] xen/event: Add reference counting to
	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

On Wed, 2011-10-26 at 18:28 +0100, Daniel De Graaf wrote:

> It's atomic for the cases where it needs to be. There are two cases in which
> unbind_from_irq can be called:
[...snip...]
> Should this explanation be copied into a comment to avoid future confusion?

I would have said yes but it looks like you found a different problem
and reposted a non-atomic_t/locked version, right?

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 02:28:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 02:28:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJMFk-0005WZ-Uo; Thu, 27 Oct 2011 02:28:00 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMEx-0005Ka-GP
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 02:27:11 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319707607!49922891!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24647 invoked from network); 27 Oct 2011 09:26:47 -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;
	27 Oct 2011 09:26:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8614216"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 09:27: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;
	Thu, 27 Oct 2011 10:27:08 +0100
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Alex Bligh <alex@alex.org.uk>
Date: Thu, 27 Oct 2011 10:27:08 +0100
In-Reply-To: <1F3C32D227DDE8714E7A546D@nimrod.local>
References: <1F3C32D227DDE8714E7A546D@nimrod.local>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319707628.9436.84.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Rzeszutek Wilk <konrad.wilk@oracle.com>, Konrad
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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-10-26 at 18:43 +0100, Alex Bligh wrote:
> Ian,
> 
> > I'm a bit fuzzy on the details but I'm not sure what this has to do with
> > the host, the device naming and behaviour on unplug are kernel side
> > things, I'd expect that if /dev/sdaX as /boot worked on 3.3 it'll work
> > on 4.1 too. (I believe you that it doesn't work, I'm just wondering
> > aloud what I'm missing).
> >
> > Can you give us the specifics of a setup which fails, e.g. a complete
> > guest cfg file, the kernel version, command line options, /etc/fstab,
> > dmesg etc.
> 
> I am not avoiding answering your question (I will get you this) but
> what is /meant/ to happen in the following scenario:

Lets call this scenario A:

> * Install on recent kernel (e.g. 2.6.37) running on Xen 3.3
> * No fancy boot options, xen_emul_unplug not set
> * No XEN_IOPORT_MAGIC implemented, so check_platform_magic()
>   returns an error

Correct, specifically it returns XEN_PLATFORM_ERR_MAGIC.

> * Therefore xen_platform_pci_unplug=0

Correct. There is some special casing around XEN_PLATFORM_ERR_MAGIC but
lets assume xen_emul_unplug=unnecessary has not been passed to the
kernel so it does not take effect.

> * Therefore blkfront etc. don't init (probe returns
>   -ENODEV)
> * Therefore OS boots with root=/dev/sda

sda must be an emulated IDE device since the 2.6.37 kernel does not
support PV devices with names other than xvd*.

I think this is as expected.

> Now Xen 3.3 is upgraded to Xen 4

Lets call this scenario B:

> * Kernel boots, and XEN_IOPORT_MAGIC now exists
> * Therefore unplug occurs, and xen_platform_pci_unplug is non zero
> * Therefore blkfront etc. inits, and PV drivers start
> * OS still boots with root=/dev/sda
> 
> Are the PV devices meant to appear as /dev/sdX rather than /dev/xvdX?

No, there is no support for this in upstream kernels (in general all the
old behaviours of Xen kernels where they would hijack other drivers
device names are not upstreamble)

> If so, how in the code does this happen? If not, won't the boot fail?

You need to be using root=/dev/xvda here for it to work. Or even better
use root=UUID=thing or root=LABEL=thong (many distros do one of these by
default these days).

(I'd forgotten about the UUID=/LABEL= option til just now -- that might
be the bit of magic which was missing to make this work)

> > Hmm, yes I think the special treatment of XEN_IOPORT_MAGIC mismatch on
> > the kernel side is what I was missing.
> >
> > It might make sense to have a guest level config option which disables
> > these magic ports, i.e. makes them return 0xffff like they would have
> > done in 3.3 (I think 0xffff is what you'll get from an invalid port in
> > general).
> 
> Actually I don't think this will work. If we do this,
> xen_plaftofm_pci_unplug will still be zero (as it's only set on exit
> of the function after a successful unplug), and that's enough to
> prevent blkfront and xenbus_probe_frontend from doing anything useful,
> so will effectively disable PV drivers even where they should be enabled.

Correct, this will take you back to scenario A, however if that is how
the guest is configured (to use emulated devices) then this is what you
wanted (or at least it is what the guest configuration is expecting).

If the guest were configured to use PV devices then it would be using
root=/dev/xvda. Such a configuration would have needed
xen_emul_unplug=unnecessary in order to have worked on 3.3 before the
upgrade and this option would be harmless but unnecessary on 4.1.

If you were using UUID=/LABEL= then I think things would have worked in
both cases (emulated on 3.3 and pv on 4.1) without additional kernel
parameters.

One detail worth mentioning is that if the guest is using PV drivers and
expecting xvd* named devices then prior to the unplug the devices
xvd[a-d] are also exposed as the IDE devices hd[a-d]. This is how the
bootloader is still able to access the emulated device.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:01:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:01:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJMmE-0006gd-9U; Thu, 27 Oct 2011 03:01:34 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMij-0006QC-0G
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 02:57:58 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319709473!34722636!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27920 invoked from network); 27 Oct 2011 09:57:53 -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;
	27 Oct 2011 09:57:53 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8614891"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 09:57: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, 27 Oct 2011 10:57:53 +0100
Date: Thu, 27 Oct 2011 10:58:11 +0100
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: <4EA965FB0200006600005AE7@novprvlin0050.provo.novell.com>
Message-ID: <alpine.DEB.2.00.1110271054200.3519@kaball-desktop>
References: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
	<alpine.DEB.2.00.1110191148580.3519@kaball-desktop>
	<alpine.DEB.2.00.1110191152460.3519@kaball-desktop>
	<CAG1y0sdh+4eai1qooKDRhLZM6UDXVqfywx5e7E6H5EYnN_eqeg@mail.gmail.com>
	<alpine.DEB.2.00.1110191440070.3519@kaball-desktop>
	<4EA965FB0200006600005AE7@novprvlin0050.provo.novell.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="8323329-464806997-1319709506=:3519"
Cc: "Fajar A. Nugraha" <list@fajar.net>,
	"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-464806997-1319709506=:3519
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8BIT

On Thu, 27 Oct 2011, Chun Yan Liu wrote:
> 
> Thank you all. Have tested pv-grub and qemu-nbd trick. Both work.
> 
> Following is the test patch that starts qemu-nbd to mount a non-raw qdisk in domain0, so that it can work with qcow/qcow2
> disk image and using pygrub. I don't know if we need such a patch, or prefer to ask user to use pv-grub instead. Just post
> here for any chance of use. Thanks.
> 
> Â 
> 
> Patch description: 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.
> 
> 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.cThu Oct 20 15:48:45 2011 +0800
> 
> @@ -1078,12 +1078,41 @@
> 
> Â Â Â Â Â return rc;
> 
> Â }
> 
> Â 
> 
> +static char * nbd_mount_disk(libxl_device_disk *disk)
> 
> +{
> 
> + Â Â Â int i;
> 
> + Â Â Â int nbds_max = 16;
> 
> + Â Â Â char *nbd_dev, *cmd;
> 
> + Â Â Â char *ret = NULL;
> 
> +
> 
> + Â Â Â for (i = 0; i < nbds_max; i++) {
> 
> + Â Â Â Â Â Â Â asprintf(&nbd_dev,"/dev/nbd%d", i);
> 
> + Â Â Â Â Â Â Â asprintf(&cmd, "qemu-nbd -c %s %s", nbd_dev, disk->pdev_path);
> 
> + Â Â Â Â Â Â Â if (system(cmd) == 0) {
> 
> + Â Â Â Â Â Â Â Â Â Â Â ret = strdup(nbd_dev);
> 
> + Â Â Â Â Â Â Â Â Â Â Â break;
> 
> + Â Â Â Â Â Â Â }
> 
> + Â Â Â }

You should use fork, libxl_postfork and exec instead of system. See
xl_cmdimpl.c:autoconnect_console for example.
Also where are nbd_dev and cmd freed?


> +
> 
> + Â Â Â return ret;
> 
> +}
> 
> +
> 
> +static int nbd_unmount_disk(char *diskpath) {
> 
> + Â Â Â char *cmd;
> 
> + Â Â Â asprintf(&cmd, "qemu-nbd -d %s", diskpath);
> 
> + Â Â Â if (system(cmd) == 0)
> 
> + Â Â Â Â Â Â Â return 0;
> 
> + Â Â Â else
> 
> + Â Â Â Â Â Â Â return ERROR_FAIL;
> 
> +}

Same here.


> +
> 
> Â char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk)
> 
> Â {
> 
> Â Â Â Â Â libxl__gc gc = LIBXL_INIT_GC(ctx);
> 
> Â Â Â Â Â 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 +1147,12 @@
> 
> Â Â Â Â Â Â Â Â Â Â Â Â Â 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(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 +1168,13 @@
> 
> Â Â out:
> 
> Â Â Â Â Â if (dev != NULL)
> 
> Â Â Â Â Â Â Â Â Â ret = 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,6 +1182,19 @@
> 
> Â Â Â Â Â Â * For other device types assume that the blktap2 process is
> 
> Â Â Â Â Â Â * needed by the soon to be started domain and do nothing.
> 
> Â Â Â Â Â Â */
> 
> + Â Â Â int ret;
> 
> +
> 
> + Â Â Â 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(diskpath);
> 
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â return ret;
> 
> + Â Â Â Â Â Â Â Â Â Â Â }
> 
> + Â Â Â Â Â Â Â default:
> 
> + Â Â Â Â Â Â Â Â Â Â Â break;
> 
> + Â Â Â }
> 
> Â 
> 
> Â Â Â Â Â 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.hThu Oct 20 15:48:45 2011 +0800
> 
> @@ -390,7 +390,7 @@
> 
> Â Â * 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.cThu Oct 20 15:48:45 2011 +0800
> 
> @@ -424,7 +424,7 @@
> 
> Â Â Â Â Â 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)
> 
> 
> >>> Stefano Stabellini <stefano.stabellini@eu.citrix.com> 10/19/2011 9:40 PM >>>
> On Wed, 19 Oct 2011, Fajar A. Nugraha wrote:
> > On Wed, Oct 19, 2011 at 5:55 PM, Stefano Stabellini
> > <stefano.stabellini@eu.citrix.com> wrote:
> > >> This is a PV guest configured with pygrub, correct?
> > >> If so, qcow/qcow2 are not supported in this scenario.
> > >>
> > >> You could:
> > >>
> > >> - avoid using pygrub (specify the kernel manually) and keep using qcow/qcow2;
> > >> - switch to raw disks and keep using pygrub;
> > >> - install a Linux kernel that support blktap2 (like the XCP kernel, see
> > >>Â Â  http://wiki.xen.org/xenwiki/XenDom0Kernels)Â and switch to VHD format.
> > >>
> > >
> > > The way to make it work would be to call qemu-nbd and nbd-client from xl
> > > so that a /dev/nbd0 comes up in dom0 and pygrub can use it to extract
> > > the kernel and initrd from the qcow2 image.
> >
> > would pv-grub work? If yes, it would give better performance compared
> > to nbd workaround.
> 
> Yes, it should. That would be the other alternative.
> 
> 
> 
--8323329-464806997-1319709506=: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-464806997-1319709506=:3519--


From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:04:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03: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 1RJMp8-000783-QW; Thu, 27 Oct 2011 03:04:35 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMnz-0006uz-34
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:03:26 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319709778!49929973!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3885 invoked from network); 27 Oct 2011 10:02:58 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-8.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 27 Oct 2011 10:02:58 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319709799; l=1667;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=ec16y7r/zpICaXjzWjxFlu8LUjw=;
	b=GHerxJtxn0bP5KE2xXh1ciPAgb/nbd7WGF7z8IGOQCqpgm3TeEB/VY6EOwwm7OzTM3D
	GBWbkTnq/djbc1R4m/OuCe36v34SJVDJ03Lg1ls2b7wMrZIuwbSmi3jEKusyFp/f0JMqX
	rSXcrdQJm/ZPorWGvO9S9RHAhVad0/E+z38=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQEZvOfA==
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-221.pools.arcor-ip.net [88.65.105.221])
	by smtp.strato.de (klopstock mo8) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id f07003n9R9Pne6
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:15 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id BB19A18639
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:14 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 1417042ea4ab7b43fed11535c6d79d88ded644dc
Message-Id: <1417042ea4ab7b43fed1.1319709795@probook.site>
In-Reply-To: <patchbomb.1319709792@probook.site>
References: <patchbomb.1319709792@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Thu, 27 Oct 2011 12:03:15 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 3 of 7] libxl: add pid path to
	libxl__spawner_starting
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319707225 -7200
# Node ID 1417042ea4ab7b43fed11535c6d79d88ded644dc
# Parent  57af937278c5c00944bcaf245dd173e9345cdecc
libxl: add pid path to libxl__spawner_starting

libxl_spawner_record_pid() should be able to write the pid to arbitrary paths.

v2:
 - use const char* for ->pid_path, and update comment

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 57af937278c5 -r 1417042ea4ab tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -848,6 +848,7 @@ int libxl__create_device_model(libxl__gc
 
     p->domid = info->domid;
     p->dom_path = libxl__xs_get_dompath(gc, info->domid);
+    p->pid_path = "image/device-model-pid";
     if (!p->dom_path) {
         rc = ERROR_FAIL;
         goto out_close;
diff -r 57af937278c5 -r 1417042ea4ab tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c
+++ b/tools/libxl/libxl_exec.c
@@ -151,7 +151,7 @@ void libxl_spawner_record_pid(void *for_
     char *path = NULL, *pid = NULL;
     int len;
 
-    if (asprintf(&path, "%s/%s", starting->dom_path, "image/device-model-pid") < 0)
+    if (asprintf(&path, "%s/%s", starting->dom_path, starting->pid_path) < 0)
         goto out;
 
     len = asprintf(&pid, "%d", innerchild);
diff -r 57af937278c5 -r 1417042ea4ab tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -277,6 +277,7 @@ typedef struct {
 
 typedef struct {
     char *dom_path; /* from libxl_malloc, only for libxl_spawner_record_pid */
+    const char *pid_path; /* only for libxl_spawner_record_pid */
     int domid;
     libxl__spawn_starting *for_spawn;
 } libxl__spawner_starting;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:06:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:06:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJMrM-0007aP-6K; Thu, 27 Oct 2011 03:06:52 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMnz-0006v0-IF
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:03:27 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319709799!932859!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2587 invoked from network); 27 Oct 2011 10:03:20 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-9.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 27 Oct 2011 10:03:20 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319709799; l=3161;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=KNUnFRHdZqKYFRB5sooxyPhP/Ug=;
	b=eKf0BfYxQE2c9kvWHkLt/8W4s1mZ84NUAjhjgZwpSouOj2uNbEE7hOxhMerXf0bfTpz
	+NaJ3s/f/qbPDPT8N1X6Z1JLxCus8/DJioSt9EVa3Vyo4IfSWb5E4eZoAWQB2WRrvXo8M
	BLmKEDxI2mBjHHeTlA+hU6wuo4VWVE+Htv4=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQEZvOfA==
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-221.pools.arcor-ip.net [88.65.105.221])
	by smtp.strato.de (cohen mo60) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id x07053n9R8Y5Za
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:15 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 9A21718638
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:14 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 57af937278c5c00944bcaf245dd173e9345cdecc
Message-Id: <57af937278c5c00944bc.1319709794@probook.site>
In-Reply-To: <patchbomb.1319709792@probook.site>
References: <patchbomb.1319709792@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Thu, 27 Oct 2011 12:03:14 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 2 of 7] libxl: rename dm_xenstore_record_pid to
 libxl_spawner_record_pid
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319707162 -7200
# Node ID 57af937278c5c00944bcaf245dd173e9345cdecc
# Parent  b709d7fefde93765b386204d9d56e2fe4e7a654f
libxl: rename dm_xenstore_record_pid to libxl_spawner_record_pid

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r b709d7fefde9 -r 57af937278c5 tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -516,31 +516,6 @@ static char ** libxl__build_device_model
     }
 }
 
-static void dm_xenstore_record_pid(void *for_spawn, pid_t innerchild)
-{
-    libxl__spawner_starting *starting = for_spawn;
-    struct xs_handle *xsh;
-    char *path = NULL, *pid = NULL;
-    int len;
-
-    if (asprintf(&path, "%s/%s", starting->dom_path, "image/device-model-pid") < 0)
-        goto out;
-
-    len = asprintf(&pid, "%d", innerchild);
-    if (len < 0)
-        goto out;
-
-    /* we mustn't use the parent's handle in the child */
-    xsh = xs_daemon_open();
-
-    xs_write(xsh, XBT_NULL, path, pid, len);
-
-    xs_daemon_close(xsh);
-out:
-    free(path);
-    free(pid);
-}
-
 static int libxl__vfb_and_vkb_from_device_model_info(libxl__gc *gc,
                                                      libxl_device_model_info *info,
                                                      libxl_device_vfb *vfb,
@@ -896,7 +871,7 @@ retry_transaction:
     }
 
     rc = libxl__spawn_spawn(gc, p->for_spawn, "device model",
-                            dm_xenstore_record_pid, p);
+                            libxl_spawner_record_pid, p);
     if (rc < 0)
         goto out_close;
     if (!rc) { /* inner child */
diff -r b709d7fefde9 -r 57af937278c5 tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c
+++ b/tools/libxl/libxl_exec.c
@@ -144,6 +144,31 @@ void libxl_report_child_exitstatus(libxl
     }
 }
 
+void libxl_spawner_record_pid(void *for_spawn, pid_t innerchild)
+{
+    libxl__spawner_starting *starting = for_spawn;
+    struct xs_handle *xsh;
+    char *path = NULL, *pid = NULL;
+    int len;
+
+    if (asprintf(&path, "%s/%s", starting->dom_path, "image/device-model-pid") < 0)
+        goto out;
+
+    len = asprintf(&pid, "%d", innerchild);
+    if (len < 0)
+        goto out;
+
+    /* we mustn't use the parent's handle in the child */
+    xsh = xs_daemon_open();
+
+    xs_write(xsh, XBT_NULL, path, pid, len);
+
+    xs_daemon_close(xsh);
+out:
+    free(path);
+    free(pid);
+}
+
 static int libxl__set_fd_flag(libxl__gc *gc, int fd, int flag)
 {
     int flags;
diff -r b709d7fefde9 -r 57af937278c5 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -276,7 +276,7 @@ typedef struct {
 } libxl__spawn_starting;
 
 typedef struct {
-    char *dom_path; /* from libxl_malloc, only for dm_xenstore_record_pid */
+    char *dom_path; /* from libxl_malloc, only for libxl_spawner_record_pid */
     int domid;
     libxl__spawn_starting *for_spawn;
 } libxl__spawner_starting;
@@ -327,6 +327,8 @@ _hidden int libxl__spawn_spawn(libxl__gc
                       void *hook_data);
 _hidden int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid);
 
+_hidden void libxl_spawner_record_pid(void *for_spawn, pid_t innerchild);
+
   /* Logs errors.  A copy of "what" is taken.  Return values:
    *  < 0   error, for_spawn need not be detached
    *   +1   caller is the parent, must call detach on *for_spawn eventually

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:08:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:08:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJMtF-0007xn-Kk; Thu, 27 Oct 2011 03:08:50 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMo2-0006v2-Lm
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:03:29 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-10.tower-216.messagelabs.com!1319709803!1150220!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22150 invoked from network); 27 Oct 2011 10:03:23 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-10.tower-216.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 27 Oct 2011 10:03:23 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319709803; l=5734;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=YhT3e5TAkLSd8wtX7+uDTWqIMaE=;
	b=bm5z3DjmZh/2igFyzhfY/fiLUpUiMsh7olKicwTNeBJxCMKVyI5/ypiqMkUaKz6Bv41
	67zC4wrPXIvdwFTN3mP0oGQ57P39T73JxIF3rA3aBADDkPyNgcAuwA7lKOutlbs/RETEg
	2Pp8AVBF2UCpSow70x8QK3RgbDV52zAEL6g=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQEZvOfA==
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-221.pools.arcor-ip.net [88.65.105.221])
	by smtp.strato.de (fruni mo58) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id p03d06n9R9Pd8H
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:15 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 5631818637
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:14 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: b709d7fefde93765b386204d9d56e2fe4e7a654f
Message-Id: <b709d7fefde93765b386.1319709793@probook.site>
In-Reply-To: <patchbomb.1319709792@probook.site>
References: <patchbomb.1319709792@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Thu, 27 Oct 2011 12:03:13 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 1 of 7] libxl: rename
	libxl__device_model_starting
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319707156 -7200
# Node ID b709d7fefde93765b386204d9d56e2fe4e7a654f
# Parent  c681dd5aecf3da3c6fd0e4d8a760a9cd18617033
libxl: rename libxl__device_model_starting

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r c681dd5aecf3 -r b709d7fefde9 tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -434,7 +434,7 @@ static int do_domain_create(libxl__gc *g
                             uint32_t *domid_out, int restore_fd)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
-    libxl__device_model_starting *dm_starting = 0;
+    libxl__spawner_starting *dm_starting = 0;
     libxl_device_model_info *dm_info = &d_config->dm_info;
     libxl__domain_build_state state;
     uint32_t domid;
diff -r c681dd5aecf3 -r b709d7fefde9 tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -518,7 +518,7 @@ static char ** libxl__build_device_model
 
 static void dm_xenstore_record_pid(void *for_spawn, pid_t innerchild)
 {
-    libxl__device_model_starting *starting = for_spawn;
+    libxl__spawner_starting *starting = for_spawn;
     struct xs_handle *xsh;
     char *path = NULL, *pid = NULL;
     int len;
@@ -619,7 +619,7 @@ static int libxl__create_stubdom(libxl__
                                  libxl_device_nic *vifs, int num_vifs,
                                  libxl_device_vfb *vfb,
                                  libxl_device_vkb *vkb,
-                                 libxl__device_model_starting **starting_r)
+                                 libxl__spawner_starting **starting_r)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     int i, num_console = STUBDOM_SPECIAL_CONSOLES, ret;
@@ -631,7 +631,7 @@ static int libxl__create_stubdom(libxl__
     char **args;
     struct xs_permissions perm[2];
     xs_transaction_t t;
-    libxl__device_model_starting *dm_starting = 0;
+    libxl__spawner_starting *dm_starting = 0;
     libxl_device_model_info xenpv_dm_info;
 
     if (info->device_model_version != LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL) {
@@ -784,7 +784,7 @@ retry_transaction:
     libxl_domain_unpause(ctx, domid);
 
     if (starting_r) {
-        *starting_r = calloc(1, sizeof(libxl__device_model_starting));
+        *starting_r = calloc(1, sizeof(libxl__spawner_starting));
         (*starting_r)->domid = info->domid;
         (*starting_r)->dom_path = libxl__xs_get_dompath(gc, info->domid);
         (*starting_r)->for_spawn = NULL;
@@ -802,14 +802,14 @@ int libxl__create_device_model(libxl__gc
                               libxl_device_model_info *info,
                               libxl_device_disk *disks, int num_disks,
                               libxl_device_nic *vifs, int num_vifs,
-                              libxl__device_model_starting **starting_r)
+                              libxl__spawner_starting **starting_r)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     char *path, *logfile;
     int logfile_w, null;
     int rc;
     char **args;
-    libxl__device_model_starting buf_starting, *p;
+    libxl__spawner_starting buf_starting, *p;
     xs_transaction_t t;
     char *vm_path;
     char **pass_stuff;
@@ -861,7 +861,7 @@ int libxl__create_device_model(libxl__gc
 
     if (starting_r) {
         rc = ERROR_NOMEM;
-        *starting_r = calloc(1, sizeof(libxl__device_model_starting));
+        *starting_r = calloc(1, sizeof(libxl__spawner_starting));
         if (!*starting_r)
             goto out_close;
         p = *starting_r;
@@ -915,7 +915,7 @@ out:
 }
 
 static int detach_device_model(libxl__gc *gc,
-                               libxl__device_model_starting *starting)
+                               libxl__spawner_starting *starting)
 {
     int rc;
     rc = libxl__spawn_detach(gc, starting->for_spawn);
@@ -926,7 +926,7 @@ static int detach_device_model(libxl__gc
 }
 
 int libxl__confirm_device_model_startup(libxl__gc *gc,
-                                       libxl__device_model_starting *starting)
+                                       libxl__spawner_starting *starting)
 {
     int detach;
     int problem = libxl__wait_for_device_model(gc, starting->domid, "running",
@@ -1041,7 +1041,7 @@ out:
 int libxl__create_xenpv_qemu(libxl__gc *gc, uint32_t domid,
                              libxl_device_model_info *info,
                              libxl_device_vfb *vfb,
-                             libxl__device_model_starting **starting_r)
+                             libxl__spawner_starting **starting_r)
 {
     libxl__build_xenpv_qemu_args(gc, domid, vfb, info);
     libxl__create_device_model(gc, info, NULL, 0, NULL, 0, starting_r);
diff -r c681dd5aecf3 -r b709d7fefde9 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -279,7 +279,7 @@ typedef struct {
     char *dom_path; /* from libxl_malloc, only for dm_xenstore_record_pid */
     int domid;
     libxl__spawn_starting *for_spawn;
-} libxl__device_model_starting;
+} libxl__spawner_starting;
 
 /* from xl_create */
 _hidden int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info, uint32_t *domid);
@@ -296,11 +296,11 @@ _hidden int libxl__create_device_model(l
                               libxl_device_model_info *info,
                               libxl_device_disk *disk, int num_disks,
                               libxl_device_nic *vifs, int num_vifs,
-                              libxl__device_model_starting **starting_r);
+                              libxl__spawner_starting **starting_r);
 _hidden int libxl__create_xenpv_qemu(libxl__gc *gc, uint32_t domid,
                               libxl_device_model_info *dm_info,
                               libxl_device_vfb *vfb,
-                              libxl__device_model_starting **starting_r);
+                              libxl__spawner_starting **starting_r);
 _hidden int libxl__need_xenpv_qemu(libxl__gc *gc,
         int nr_consoles, libxl_device_console *consoles,
         int nr_vfbs, libxl_device_vfb *vfbs,
@@ -309,8 +309,8 @@ _hidden int libxl__need_xenpv_qemu(libxl
    * return pass *starting_r (which will be non-0) to
    * libxl_confirm_device_model or libxl_detach_device_model. */
 _hidden int libxl__confirm_device_model_startup(libxl__gc *gc,
-                              libxl__device_model_starting *starting);
-_hidden int libxl__detach_device_model(libxl__gc *gc, libxl__device_model_starting *starting);
+                              libxl__spawner_starting *starting);
+_hidden int libxl__detach_device_model(libxl__gc *gc, libxl__spawner_starting *starting);
 _hidden int libxl__wait_for_device_model(libxl__gc *gc,
                                 uint32_t domid, char *state,
                                 libxl__spawn_starting *spawning,

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:10:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:10:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJMv6-0008MP-Po; Thu, 27 Oct 2011 03:10:44 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMo2-0006v1-Ht
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:03:30 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-9.tower-27.messagelabs.com!1319709780!50423894!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27427 invoked from network); 27 Oct 2011 10:03:00 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-9.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 27 Oct 2011 10:03:00 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319709803; l=6481;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=eLNn2mZPb0gQq+N98ako1ztkWao=;
	b=BwnASLVdHJaEtaWAYX1QFRCwKq/7r4sJrdzcb+9QxlT0R7H3GM6akOHBl9JfGXlt5eu
	xemTq0dtsrVlWM4KoAJG4FqdM8vPUuc1fYYBuEV+1J07b28nIymQS36YVkjIuxs5DNQOG
	GXJCRmPSfw0MDYU20BKfirnRXob7VwUZjIM=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQEZvOfA==
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-221.pools.arcor-ip.net [88.65.105.221])
	by smtp.strato.de (fruni mo39) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id q03574n9R8YgIk
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:15 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id E28F51863A
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:14 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: f52460f64b6f58b480d0037a31c20606e9a4ef55
Message-Id: <f52460f64b6f58b480d0.1319709796@probook.site>
In-Reply-To: <patchbomb.1319709792@probook.site>
References: <patchbomb.1319709792@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Thu, 27 Oct 2011 12:03:16 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 4 of 7] libxl: add libxl__wait_for_offspring
	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 Olaf Hering <olaf@aepfle.de>
# Date 1319707404 -7200
# Node ID f52460f64b6f58b480d0037a31c20606e9a4ef55
# Parent  1417042ea4ab7b43fed11535c6d79d88ded644dc
libxl: add libxl__wait_for_offspring function

libxl__wait_for_offspring() is a generic version of
libxl__wait_for_device_model().

Use libxl__wait_for_offspring for device model.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 1417042ea4ab -r f52460f64b6f tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -535,88 +535,12 @@ int libxl__wait_for_device_model(libxl__
                                                        void *userdata),
                                  void *check_callback_userdata)
 {
-    libxl_ctx *ctx = libxl__gc_owner(gc);
     char *path;
-    char *p;
-    unsigned int len;
-    int rc = 0;
-    struct xs_handle *xsh;
-    int nfds;
-    fd_set rfds;
-    struct timeval tv;
-    unsigned int num;
-    char **l = NULL;
-
-    xsh = xs_daemon_open();
-    if (xsh == NULL) {
-        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to open xenstore connection");
-        goto err;
-    }
-
     path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
-    xs_watch(xsh, path, path);
-    tv.tv_sec = LIBXL_DEVICE_MODEL_START_TIMEOUT;
-    tv.tv_usec = 0;
-    nfds = xs_fileno(xsh) + 1;
-    if (spawning && spawning->fd > xs_fileno(xsh))
-        nfds = spawning->fd + 1;
-
-    while (rc > 0 || (!rc && tv.tv_sec > 0)) {
-        if ( spawning ) {
-            rc = libxl__spawn_check(gc, spawning);
-            if ( rc ) {
-                LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
-                           "Device Model died during startup");
-                rc = -1;
-                goto err_died;
-            }
-        }
-        p = xs_read(xsh, XBT_NULL, path, &len);
-        if ( NULL == p )
-            goto again;
-
-        if ( NULL != state && strcmp(p, state) )
-            goto again;
-
-        if ( NULL != check_callback ) {
-            rc = (*check_callback)(gc, domid, p, check_callback_userdata);
-            if ( rc > 0 )
-                goto again;
-        }
-
-        free(p);
-        xs_unwatch(xsh, path, path);
-        xs_daemon_close(xsh);
-        return rc;
-again:
-        free(p);
-        FD_ZERO(&rfds);
-        FD_SET(xs_fileno(xsh), &rfds);
-        if (spawning)
-            FD_SET(spawning->fd, &rfds);
-        rc = select(nfds, &rfds, NULL, NULL, &tv);
-        if (rc > 0) {
-            if (FD_ISSET(xs_fileno(xsh), &rfds)) {
-                l = xs_read_watch(xsh, &num);
-                if (l != NULL)
-                    free(l);
-                else
-                    goto again;
-            }
-            if (spawning && FD_ISSET(spawning->fd, &rfds)) {
-                unsigned char dummy;
-                if (read(spawning->fd, &dummy, sizeof(dummy)) != 1)
-                    LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_DEBUG,
-                                     "failed to read spawn status pipe");
-            }
-        }
-    }
-    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Device Model not ready");
-err_died:
-    xs_unwatch(xsh, path, path);
-    xs_daemon_close(xsh);
-err:
-    return -1;
+    return libxl__wait_for_offspring(gc, domid,
+                                     LIBXL_DEVICE_MODEL_START_TIMEOUT,
+                                     "Device Model", path, state, spawning,
+                                     check_callback, check_callback_userdata);
 }
 
 int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state)
diff -r 1417042ea4ab -r f52460f64b6f tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c
+++ b/tools/libxl/libxl_exec.c
@@ -169,6 +169,99 @@ out:
     free(pid);
 }
 
+int libxl__wait_for_offspring(libxl__gc *gc,
+                                 uint32_t domid,
+                                 uint32_t timeout, char *what,
+                                 char *path, char *state,
+                                 libxl__spawn_starting *spawning,
+                                 int (*check_callback)(libxl__gc *gc,
+                                                       uint32_t domid,
+                                                       const char *state,
+                                                       void *userdata),
+                                 void *check_callback_userdata)
+{
+    libxl_ctx *ctx = libxl__gc_owner(gc);
+    char *p;
+    unsigned int len;
+    int rc = 0;
+    struct xs_handle *xsh;
+    int nfds;
+    fd_set rfds;
+    struct timeval tv;
+    unsigned int num;
+    char **l = NULL;
+
+    xsh = xs_daemon_open();
+    if (xsh == NULL) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to open xenstore connection");
+        goto err;
+    }
+
+    xs_watch(xsh, path, path);
+    tv.tv_sec = timeout;
+    tv.tv_usec = 0;
+    nfds = xs_fileno(xsh) + 1;
+    if (spawning && spawning->fd > xs_fileno(xsh))
+        nfds = spawning->fd + 1;
+
+    while (rc > 0 || (!rc && tv.tv_sec > 0)) {
+        if ( spawning ) {
+            rc = libxl__spawn_check(gc, spawning);
+            if ( rc ) {
+                LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                           "%s died during startup", what);
+                rc = -1;
+                goto err_died;
+            }
+        }
+        p = xs_read(xsh, XBT_NULL, path, &len);
+        if ( NULL == p )
+            goto again;
+
+        if ( NULL != state && strcmp(p, state) )
+            goto again;
+
+        if ( NULL != check_callback ) {
+            rc = (*check_callback)(gc, domid, p, check_callback_userdata);
+            if ( rc > 0 )
+                goto again;
+        }
+
+        free(p);
+        xs_unwatch(xsh, path, path);
+        xs_daemon_close(xsh);
+        return rc;
+again:
+        free(p);
+        FD_ZERO(&rfds);
+        FD_SET(xs_fileno(xsh), &rfds);
+        if (spawning)
+            FD_SET(spawning->fd, &rfds);
+        rc = select(nfds, &rfds, NULL, NULL, &tv);
+        if (rc > 0) {
+            if (FD_ISSET(xs_fileno(xsh), &rfds)) {
+                l = xs_read_watch(xsh, &num);
+                if (l != NULL)
+                    free(l);
+                else
+                    goto again;
+            }
+            if (spawning && FD_ISSET(spawning->fd, &rfds)) {
+                unsigned char dummy;
+                if (read(spawning->fd, &dummy, sizeof(dummy)) != 1)
+                    LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_DEBUG,
+                                     "failed to read spawn status pipe");
+            }
+        }
+    }
+    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "%s not ready", what);
+err_died:
+    xs_unwatch(xsh, path, path);
+    xs_daemon_close(xsh);
+err:
+    return -1;
+}
+
 static int libxl__set_fd_flag(libxl__gc *gc, int fd, int flag)
 {
     int flags;
diff -r 1417042ea4ab -r f52460f64b6f tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -330,6 +330,16 @@ _hidden int libxl__destroy_device_model(
 
 _hidden void libxl_spawner_record_pid(void *for_spawn, pid_t innerchild);
 
+_hidden int libxl__wait_for_offspring(libxl__gc *gc,
+                                 uint32_t domid,
+                                 uint32_t timeout, char *what,
+                                 char *path, char *state,
+                                 libxl__spawn_starting *spawning,
+                                 int (*check_callback)(libxl__gc *gc,
+                                                       uint32_t domid,
+                                                       const char *state,
+                                                       void *userdata),
+                                 void *check_callback_userdata);
   /* Logs errors.  A copy of "what" is taken.  Return values:
    *  < 0   error, for_spawn need not be detached
    *   +1   caller is the parent, must call detach on *for_spawn eventually
@@ -345,7 +355,7 @@ _hidden int libxl__spawn_check(libxl__gc
   /* Logs errors but also returns them.
    * for_spawn must actually be a  libxl__spawn_starting*  but
    * we take void* so you can pass this function directly to
-   * libxl__wait_for_device_model.  Caller must still call detach. */
+   * libxl__wait_for_offspring.  Caller must still call detach. */
 
  /* low-level stuff, for synchronous subprocesses etc. */
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:13:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:13:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJMxn-0000K3-FL; Thu, 27 Oct 2011 03:13:31 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMo6-0006vH-Bk
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:03:31 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319709774!54491071!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5006 invoked from network); 27 Oct 2011 10:02:55 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-7.tower-27.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 27 Oct 2011 10:02:55 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319709806; l=610;
	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=Ey8YSMfc0kJvgv5vtP8CB/eANJ0=;
	b=tl3oqhFjSddoXR8CfHJhWxgADYPn5oxMavhsZyIhuHR5wEUeVRTcUIaCfAXDeXeaI24
	Vog9z+GfaUveKzty0hCEk87ZzmJPYga/s8Um3krDwZqxnotFH9jnBqm+5B3q2u0AiF5H9
	NV6jHtyibO9gXaEDcSL/bBCynNBoT5Ldfmo=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQEZvOfA==
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-221.pools.arcor-ip.net [88.65.105.221])
	by smtp.strato.de (klopstock mo62) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id v06ef0n9R9q3kO
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:14 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 1FD7218636
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:13 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1319709792@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Thu, 27 Oct 2011 12:03:12 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 0 of 7] libxl: make spawn interface more generic
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 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.

Olaf

 tools/libxl/libxl_create.c   |    2 
 tools/libxl/libxl_device.c   |   84 +----------------------
 tools/libxl/libxl_dm.c       |   65 ++++-------------
 tools/libxl/libxl_exec.c     |  145 +++++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_internal.h |  157 +++++++++++++++++++++++++++++++++----------
 5 files changed, 285 insertions(+), 168 deletions(-)


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:17:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:17:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJN21-0000q7-I5; Thu, 27 Oct 2011 03:17:53 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMo8-0006vO-C8
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:03:33 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319709808!929484!1
X-Originating-IP: [81.169.146.160]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20295 invoked from network); 27 Oct 2011 10:03:29 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 27 Oct 2011 10:03:29 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319709808; l=3056;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=RXEqPhma8mrhUJflx3+MCj9QuIY=;
	b=CuqsT6YNJK84DRQ4kJlEfyIOdWG7NxIlEtmMz8mTL0ogiFPIb9GxipwU1AdigXIYKQx
	kbDTuEyAv2xUDIvPxm4/yl72G9B0x3VK1o4xeD3kHCFbGXwfCmK2hsrop/3Mc5rXjOdG7
	pPPwK4ni9NbJKH3JETUQ2VP2kc5V774tkw8=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQEZvOfA==
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-221.pools.arcor-ip.net [88.65.105.221])
	by smtp.strato.de (cohen mo64) (RZmta 26.10 AUTH)
	with (DHE-RSA-AES256-SHA encrypted) ESMTPA id t071dbn9R9QmgF
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:16 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 1139C18636
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:15 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 9d23f31c576395094233326409058078685850d2
Message-Id: <9d23f31c576395094233.1319709797@probook.site>
In-Reply-To: <patchbomb.1319709792@probook.site>
References: <patchbomb.1319709792@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Thu, 27 Oct 2011 12:03:17 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 5 of 7] libxl: add
	libxl__spawn_confirm_offspring_startup
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319707409 -7200
# Node ID 9d23f31c576395094233326409058078685850d2
# Parent  f52460f64b6f58b480d0037a31c20606e9a4ef55
libxl: add libxl__spawn_confirm_offspring_startup

libxl__spawn_confirm_offspring_startup() is a generic version of
libxl__confirm_device_model_startup().

Use libxl__spawn_confirm_offspring_startup for device model.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r f52460f64b6f -r 9d23f31c5763 tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -890,25 +890,16 @@ out:
     return rc;
 }
 
-static int detach_device_model(libxl__gc *gc,
-                               libxl__spawner_starting *starting)
-{
-    int rc;
-    rc = libxl__spawn_detach(gc, starting->for_spawn);
-    if (starting->for_spawn)
-        free(starting->for_spawn);
-    free(starting);
-    return rc;
-}
 
 int libxl__confirm_device_model_startup(libxl__gc *gc,
                                        libxl__spawner_starting *starting)
 {
-    int detach;
-    int problem = libxl__wait_for_device_model(gc, starting->domid, "running",
-                                               starting->for_spawn, NULL, NULL);
-    detach = detach_device_model(gc, starting);
-    return problem ? problem : detach;
+    char *path;
+    int domid = starting->domid;
+    path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
+    return libxl__spawn_confirm_offspring_startup(gc,
+                                     LIBXL_DEVICE_MODEL_START_TIMEOUT,
+                                     "Device Model", path, "running", starting);
 }
 
 int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid)
diff -r f52460f64b6f -r 9d23f31c5763 tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c
+++ b/tools/libxl/libxl_exec.c
@@ -262,6 +262,30 @@ err:
     return -1;
 }
 
+static int detach_offspring(libxl__gc *gc,
+                               libxl__spawner_starting *starting)
+{
+    int rc;
+    rc = libxl__spawn_detach(gc, starting->for_spawn);
+    if (starting->for_spawn)
+        free(starting->for_spawn);
+    free(starting);
+    return rc;
+}
+
+int libxl__spawn_confirm_offspring_startup(libxl__gc *gc,
+                                       uint32_t timeout, char *what,
+                                       char *path, char *state,
+                                       libxl__spawner_starting *starting)
+{
+    int detach;
+    int problem = libxl__wait_for_offspring(gc, starting->domid, timeout, what,
+                                               path, state,
+                                               starting->for_spawn, NULL, NULL);
+    detach = detach_offspring(gc, starting);
+    return problem ? problem : detach;
+}
+
 static int libxl__set_fd_flag(libxl__gc *gc, int fd, int flag)
 {
     int flags;
diff -r f52460f64b6f -r 9d23f31c5763 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -340,6 +340,12 @@ _hidden int libxl__wait_for_offspring(li
                                                        const char *state,
                                                        void *userdata),
                                  void *check_callback_userdata);
+
+_hidden int libxl__spawn_confirm_offspring_startup(libxl__gc *gc,
+                                       uint32_t timeout, char *what,
+                                       char *path, char *state,
+                                       libxl__spawner_starting *starting);
+
   /* Logs errors.  A copy of "what" is taken.  Return values:
    *  < 0   error, for_spawn need not be detached
    *   +1   caller is the parent, must call detach on *for_spawn eventually

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:19:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:19:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJN3Z-0001E8-LJ; Thu, 27 Oct 2011 03:19:29 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMoF-0006wI-EU
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:03:41 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-7.tower-216.messagelabs.com!1319709815!1251130!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28574 invoked from network); 27 Oct 2011 10:03:36 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.161)
	by server-7.tower-216.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 27 Oct 2011 10:03:36 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319709815; l=1682;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=L3E7Q4V+sQTzLpdNwObZS/AIJhc=;
	b=k75NWWTxSf8r2Y/HPQpdVX6ifDt0dUX5zPv+8IMJn5OLyFlQuX3PimbHYu5ZPcue/qA
	JAMy10rOsHHbaREadlTUmbV7pibxkrw7Q8j5cdad6omhdkD4PfOKwCbWmLjXwaWXvPKrX
	dYT4QBo8oQYBRq1U9TmheIfgBxT1jwzSo2Q=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQEZvOfA==
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-221.pools.arcor-ip.net [88.65.105.221])
	by smtp.strato.de (fruni mo41) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id i0366an9RA0wpX
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:16 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 7B3FC1863C
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:15 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 2679263d65681e1e9f260bc1683eac1fa4ce2b66
Message-Id: <2679263d65681e1e9f26.1319709799@probook.site>
In-Reply-To: <patchbomb.1319709792@probook.site>
References: <patchbomb.1319709792@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Thu, 27 Oct 2011 12:03:19 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 7 of 7] libxl: update prototype of
	libxl__spawn_check
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 1319709256 -7200
# Node ID 2679263d65681e1e9f260bc1683eac1fa4ce2b66
# Parent  2423017c7ba57c9e0d91a061c4a28c06cee00d08
libxl: update prototype of libxl__spawn_check

libxl__spawn_check expects a malloc'd libxl__spawn_starting. The
currently only user of libxl__spawn_check gets a libxl__spawn_starting
and passes it on. Update prototype to not take a void pointer, and also
update comment in header file.

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 2423017c7ba5 -r 2679263d6568 tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c
+++ b/tools/libxl/libxl_exec.c
@@ -431,10 +431,9 @@ int libxl__spawn_detach(libxl__gc *gc,
     return rc;
 }
 
-int libxl__spawn_check(libxl__gc *gc, void *for_spawn_void)
+int libxl__spawn_check(libxl__gc *gc, libxl__spawn_starting *for_spawn)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
-    libxl__spawn_starting *for_spawn = for_spawn_void;
     pid_t got;
     int status;
 
diff -r 2423017c7ba5 -r 2679263d6568 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -385,12 +385,10 @@ _hidden int libxl__spawn_detach(libxl__g
  * Returns 0 on success, and < 0 on error.
  *
  * Logs errors but also returns them.
- * for_spawn must actually be a  libxl__spawn_starting*  but
- * we take void* so you can pass this function directly to
- * libxl__wait_for_offspring.  Caller must still call detach.
+ * Caller must still call detach.
  */
 _hidden int libxl__spawn_check(libxl__gc *gc,
-                      void *for_spawn);
+                       libxl__spawn_starting *for_spawn);
 
  /* low-level stuff, for synchronous subprocesses etc. */
 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:21:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:21:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJN5A-0001ej-Ex; Thu, 27 Oct 2011 03:21:08 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMoI-0006x7-H1
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:03:45 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-6.tower-182.messagelabs.com!1319709819!933940!1
X-Originating-IP: [81.169.146.162]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22033 invoked from network); 27 Oct 2011 10:03:39 -0000
Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.162)
	by server-6.tower-182.messagelabs.com with EDH-RSA-DES-CBC3-SHA
	encrypted SMTP; 27 Oct 2011 10:03:39 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319709818; l=8011;
	s=domk; d=aepfle.de;
	h=To:From:Date:References:In-Reply-To:Subject:
	Content-Transfer-Encoding:MIME-Version:Content-Type:X-RZG-CLASS-ID:
	X-RZG-AUTH; bh=j77S7vUalsba7E7/6QbNAMXEU2A=;
	b=H/A+rI0bB6IGnlmaajMLCO8BlJ31ioe15skXEWN8L4Ckk0wooIqgaJ1qAIBCx6sDKaX
	60DJi/snbc7hu0nJ6J+jkuqFzJtr4c99oEp9mWkxoA30GwWqylrEQZ6+aLu0N2SfIpKWk
	XNFDIgtWb+G68XaXPNUdN1bJee7O3nXDrow=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQEZvOfA==
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-221.pools.arcor-ip.net [88.65.105.221])
	by post.strato.de (mrclete mo60) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id x01ff5n9R8iRQ4
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:16 +0200 (MEST)
Received: from probook.site (localhost [IPv6:::1])
	by probook.site (Postfix) with ESMTP id 42D561863B
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 12:03:15 +0200 (CEST)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 2423017c7ba57c9e0d91a061c4a28c06cee00d08
Message-Id: <2423017c7ba57c9e0d91.1319709798@probook.site>
In-Reply-To: <patchbomb.1319709792@probook.site>
References: <patchbomb.1319709792@probook.site>
User-Agent: Mercurial-patchbomb/1.7.5
Date: Thu, 27 Oct 2011 12:03:18 +0200
From: Olaf Hering <olaf@aepfle.de>
To: xen-devel@lists.xensource.com
Subject: [Xen-devel] [PATCH 6 of 7] libxl: document spawn related 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 Olaf Hering <olaf@aepfle.de>
# Date 1319708351 -7200
# Node ID 2423017c7ba57c9e0d91a061c4a28c06cee00d08
# Parent  9d23f31c576395094233326409058078685850d2
libxl: document spawn related functions

Group spawn related prototypes and add some documentation.
Remove unused prototype for libxl__log_child_exitstatus

Signed-off-by: Olaf Hering <olaf@aepfle.de>

diff -r 9d23f31c5763 -r 2423017c7ba5 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -282,6 +282,121 @@ typedef struct {
     libxl__spawn_starting *for_spawn;
 } libxl__spawner_starting;
 
+/*
+ * libxl__spawn_spawn - Create a new process
+ * gc: allocation pool
+ * for_spawn: malloc'd pointer to libxl__spawn_starting (optional)
+ * what: string describing the spawned process
+ * intermediate_hook: helper to record pid, such as libxl_spawner_record_pid
+ * hook_data: data to pass to the hook function
+ *
+ * Logs errors.  A copy of "what" is taken. 
+ * Return values:
+ *  < 0   error, for_spawn need not be detached
+ *   +1   caller is the parent, must call detach on *for_spawn eventually
+ *    0   caller is now the inner child, should probably call libxl__exec
+ * Caller, may pass 0 for for_spawn, in which case no need to detach.
+ */
+_hidden int libxl__spawn_spawn(libxl__gc *gc,
+                      libxl__spawn_starting *for_spawn,
+                      const char *what,
+                      void (*intermediate_hook)(void *for_spawn, pid_t innerchild),
+                      void *hook_data);
+
+/*
+ * libxl_spawner_record_pid - Record given pid in xenstore
+ * for_spawn: malloc'd pointer to libxl__spawn_starting (optional)
+ * innerchild: pid of the child
+ *
+ * This function is passed as intermediate_hook to libxl__spawn_spawn.
+ */
+_hidden void libxl_spawner_record_pid(void *for_spawn, pid_t innerchild);
+
+/*
+ * libxl__spawn_confirm_offspring_startup - Wait for child state
+ * gc: allocation pool
+ * timeout: how many seconds to wait for the child
+ * what: string describing the spawned process
+ * path: path to the state file in xenstore
+ * state: expected string to wait for in path (optional)
+ * starting: malloc'd pointer to libxl__spawner_starting
+ *
+ * Returns 0 on success, and < 0 on error.
+ *
+ * This function waits the given timeout for the given path to appear
+ * in xenstore, and optionally for state in path.
+ * The intermediate process created in libxl__spawn_spawn is killed.
+ * The memory referenced by starting->for_spawn and starting is free'd.
+ */
+_hidden int libxl__spawn_confirm_offspring_startup(libxl__gc *gc,
+                                       uint32_t timeout, char *what,
+                                       char *path, char *state,
+                                       libxl__spawner_starting *starting);
+
+/*
+ * libxl__wait_for_offspring - Wait for child state
+ * gc: allocation pool
+ * domid: guest to work with
+ * timeout: how many seconds to wait for the state to appear
+ * what: string describing the spawned process
+ * path: path to the state file in xenstore
+ * state: expected string to wait for in path (optional)
+ * spawning: malloc'd pointer to libxl__spawn_starting (optional)
+ * check_callback: (optional)
+ * check_callback_userdata: data to pass to the callback function
+ *
+ * Returns 0 on success, and < 0 on error.
+ *
+ * This function waits the given timeout for the given path to appear
+ * in xenstore, and optionally for state in path.
+ * If path appears and state matches, check_callback is called.
+ * If check_callback returns > 0, waiting for path or state continues.
+ * Otherwise libxl__wait_for_offspring returns.
+ */
+_hidden int libxl__wait_for_offspring(libxl__gc *gc,
+                                 uint32_t domid,
+                                 uint32_t timeout, char *what,
+                                 char *path, char *state,
+                                 libxl__spawn_starting *spawning,
+                                 int (*check_callback)(libxl__gc *gc,
+                                                       uint32_t domid,
+                                                       const char *state,
+                                                       void *userdata),
+                                 void *check_callback_userdata);
+
+/*
+ * libxl__spawn_detach - Kill intermediate process from spawn_spawn
+ * gc: allocation pool
+ * for_spawn: malloc'd pointer to libxl__spawn_starting (optional)
+ *
+ * Returns 0 on success, and < 0 on error.
+ *
+ * Logs errors.  Idempotent, but only permitted after successful
+ * call to libxl__spawn_spawn, and no point calling it again if it fails.
+ */
+_hidden int libxl__spawn_detach(libxl__gc *gc,
+                       libxl__spawn_starting *for_spawn);
+
+/*
+ * libxl__spawn_check - Check intermediate child process
+ * gc: allocation pool
+ * for_spawn: malloc'd pointer to libxl__spawn_starting (optional)
+ *
+ * Returns 0 on success, and < 0 on error.
+ *
+ * Logs errors but also returns them.
+ * for_spawn must actually be a  libxl__spawn_starting*  but
+ * we take void* so you can pass this function directly to
+ * libxl__wait_for_offspring.  Caller must still call detach.
+ */
+_hidden int libxl__spawn_check(libxl__gc *gc,
+                      void *for_spawn);
+
+ /* low-level stuff, for synchronous subprocesses etc. */
+
+_hidden void libxl__exec(int stdinfd, int stdoutfd, int stderrfd,
+               const char *arg0, char **args); // logs errors, never returns
+
 /* 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,
@@ -308,7 +423,7 @@ _hidden int libxl__need_xenpv_qemu(libxl
         int nr_disks, libxl_device_disk *disks);
   /* Caller must either: pass starting_r==0, or on successful
    * return pass *starting_r (which will be non-0) to
-   * libxl_confirm_device_model or libxl_detach_device_model. */
+   * libxl__confirm_device_model_startup or libxl__detach_device_model. */
 _hidden int libxl__confirm_device_model_startup(libxl__gc *gc,
                               libxl__spawner_starting *starting);
 _hidden int libxl__detach_device_model(libxl__gc *gc, libxl__spawner_starting *starting);
@@ -321,55 +436,8 @@ _hidden int libxl__wait_for_device_model
                                                       void *userdata),
                                 void *check_callback_userdata);
 
-_hidden int libxl__spawn_spawn(libxl__gc *gc,
-                      libxl__spawn_starting *starting,
-                      const char *what,
-                      void (*intermediate_hook)(void *for_spawn, pid_t innerchild),
-                      void *hook_data);
 _hidden int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid);
 
-_hidden void libxl_spawner_record_pid(void *for_spawn, pid_t innerchild);
-
-_hidden int libxl__wait_for_offspring(libxl__gc *gc,
-                                 uint32_t domid,
-                                 uint32_t timeout, char *what,
-                                 char *path, char *state,
-                                 libxl__spawn_starting *spawning,
-                                 int (*check_callback)(libxl__gc *gc,
-                                                       uint32_t domid,
-                                                       const char *state,
-                                                       void *userdata),
-                                 void *check_callback_userdata);
-
-_hidden int libxl__spawn_confirm_offspring_startup(libxl__gc *gc,
-                                       uint32_t timeout, char *what,
-                                       char *path, char *state,
-                                       libxl__spawner_starting *starting);
-
-  /* Logs errors.  A copy of "what" is taken.  Return values:
-   *  < 0   error, for_spawn need not be detached
-   *   +1   caller is the parent, must call detach on *for_spawn eventually
-   *    0   caller is now the inner child, should probably call libxl__exec
-   * Caller, may pass 0 for for_spawn, in which case no need to detach.
-   */
-_hidden int libxl__spawn_detach(libxl__gc *gc,
-                       libxl__spawn_starting *for_spawn);
-  /* Logs errors.  Idempotent, but only permitted after successful
-   * call to libxl__spawn_spawn, and no point calling it again if it fails. */
-_hidden int libxl__spawn_check(libxl__gc *gc,
-                      void *for_spawn);
-  /* Logs errors but also returns them.
-   * for_spawn must actually be a  libxl__spawn_starting*  but
-   * we take void* so you can pass this function directly to
-   * libxl__wait_for_offspring.  Caller must still call detach. */
-
- /* low-level stuff, for synchronous subprocesses etc. */
-
-_hidden void libxl__exec(int stdinfd, int stdoutfd, int stderrfd,
-               const char *arg0, char **args); // logs errors, never returns
-_hidden void libxl__log_child_exitstatus(libxl__gc *gc,
-                                const char *what, pid_t pid, int status);
-
 _hidden char *libxl__abs_path(libxl__gc *gc, const char *s, const char *path);
 
 #define LIBXL__LOG_DEBUG   XTL_DEBUG

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:21:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:21:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJN5z-00021T-QV; Thu, 27 Oct 2011 03:21:59 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMpj-0007DH-AT
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:05:13 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319709908!938525!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12195 invoked from network); 27 Oct 2011 10:05:08 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 10:05:08 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8615085"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 10:05:07 +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, 27 Oct 2011 11:05:07 +0100
Subject: Re: [Xen-devel] [PATCH] docs, Add HowTo use QEMU upstream.
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Anthony PERARD <anthony.perard@citrix.com>
Date: Thu, 27 Oct 2011 11:05:07 +0100
In-Reply-To: <1319648125-16986-1-git-send-email-anthony.perard@citrix.com>
References: <1319648125-16986-1-git-send-email-anthony.perard@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: <1319709907.9436.91.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

I suppose a bunch of this becomes obsolete when Stefano's patches to
integrate SeaBIOS/qemu into the build land, but perhaps it is worth
documenting the manual steps anyway?

Is the plan to retire the wiki page?

I don't have much comment on the text other than spelling and some minor
grammar.

On Wed, 2011-10-26 at 17:55 +0100, Anthony PERARD wrote:
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> 
> ---
>  docs/misc/qemu-upstream_howto_use_it.markdown |  122 +++++++++++++++++++++++++
>  1 files changed, 122 insertions(+), 0 deletions(-)
> 
> diff --git a/docs/misc/qemu-upstream_howto_use_it.markdown b/docs/misc/qemu-upstream_howto_use_it.markdown
> new file mode 100644
> index 0000000..cdf920a
> --- /dev/null
> +++ b/docs/misc/qemu-upstream_howto_use_it.markdown
> @@ -0,0 +1,122 @@
> +Help to use QEMU (upstream version) with Xen
> +============================================
> +
> +How to build it
> +---------------
> +
> +### SeaBIOS
> +
> +This new device-model need a different bios, SeaBIOS. Clone the repository from:
   The                   needs            BIOS

It is usually "BIOS" not "bios", I think.

> +
> +  - git://git.qemu.org/seabios.git
> +  - http://git.qemu.org/git/seabios.git
> +
> +Put the `.config` file in the appendix at the root of seabios.git and build SeaBIOS.
> +
> +In xen-unstable source tree, add the file `.config` with
> +`SEABIOS_DIR = /path/to/seabios.git`.
> +To build hvmloader with SeaBIOS, you propably need to `make -C tools/firmware
                                        probably

> +clean` first and then `make tools`, to use the new SEABIOS_DIR parameter.
> +
> +
> +### QEMU
> +
> +Get QEMU upstream source from:
> +
> +  - git://xenbits.xensource.com/qemu-upstream-unstable.git
> +  - http://xenbits.xensource.com/git-http/qemu-upstream-unstable.git
> +
> +To configure build QEMU upstream with Xen
> +
> +    ./configure --enable-xen --target-list=i386-softmmu --extra-cflags="-I$path_to_xen_source/tools/include -I$path_to_xen_source/tools/libxc -I$path_to_xen_source/tools/xenstore" --extra-ldflags="-L$path_to_xen_source/tools/libxc -L$path_to_xen_source/tools/xenstore"
> +

Perhaps wrap this somehow?

Incidentally, would upstream accept a --xen-dir type option (or an
argument to --enable-xen?) to which you could pass $path_to_xen_source
and have it do all this automatically?

Can you omit all that if you have installed Xen on the current host
(i.e. pick all that up from /usr/{lib,include})?

> +You can also use other several options such as `--disable-kvm`.
> +
> +
> +How to use QEMU upstream
> +------------------------
> +
> +Only xl support QEMU upstream.
> +
> +To actually use it, add or change this in your VM configuration file:
> +
> +    device_model_version = 'qemu-xen'
> +    device_model_override = '/path/to/qemu/i386-softmmu/qemu'

This second one should become unnecessary (and unadvised) when Stefano's
build integration patches hit.

> +
> +NB: On qemu-upstream repository, the default binary name have been renamed to
                                                            has
> +`qemu-system-i386`.
> +
> +
> +Appendix
> +------
> +
> +### `.config` file for SeaBIOS
> +
> +    #
> +    # General Features
> +    #
> +    # CONFIG_COREBOOT is not set
> +    CONFIG_XEN=y
> +    CONFIG_THREADS=y
> +    CONFIG_THREAD_OPTIONROMS=y
> +    CONFIG_RELOCATE_INIT=y
> +    CONFIG_BOOTMENU=y
> +    CONFIG_BOOTMENU_WAIT=1000
> +    # CONFIG_BOOTSPLASH is not set
> +    CONFIG_BOOTORDER=y
> +    #
> +    # Hardware support
> +    #
> +    CONFIG_ATA=y
> +    CONFIG_ATA_DMA=y
> +    CONFIG_ATA_PIO32=y
> +    CONFIG_AHCI=y
> +    CONFIG_VIRTIO_BLK=y
> +    CONFIG_FLOPPY=y
> +    CONFIG_PS2PORT=y
> +    CONFIG_USB=y
> +    CONFIG_USB_UHCI=y
> +    CONFIG_USB_OHCI=y
> +    CONFIG_USB_EHCI=y
> +    CONFIG_USB_MSC=y
> +    CONFIG_USB_HUB=y
> +    CONFIG_USB_KEYBOARD=y
> +    CONFIG_USB_MOUSE=y
> +    CONFIG_SERIAL=y
> +    CONFIG_LPT=y
> +    # CONFIG_EXTRA_PCI_ROOTS is not set
> +    # CONFIG_USE_SMM is not set
> +    CONFIG_MTRR_INIT=y
> +    #
> +    # BIOS interfaces
> +    #
> +    CONFIG_DRIVES=y
> +    # CONFIG_CDROM_BOOT is not set
> +    CONFIG_PCIBIOS=y
> +    CONFIG_APMBIOS=y
> +    CONFIG_PNPBIOS=y
> +    CONFIG_OPTIONROMS=y
> +    # CONFIG_OPTIONROMS_DEPLOYED is not set
> +    CONFIG_OPTIONROMS_CHECKSUM=y
> +    CONFIG_PMM=y
> +    CONFIG_BOOT=y
> +    CONFIG_KEYBOARD=y
> +    CONFIG_KBD_CALL_INT15_4F=y
> +    CONFIG_MOUSE=y
> +    CONFIG_S3_RESUME=y
> +    # CONFIG_S3_RESUME_VGA_INIT is not set
> +    # CONFIG_DISABLE_A20 is not set
> +    #
> +    # BIOS Tables
> +    #
> +    CONFIG_PIRTABLE=y
> +    CONFIG_MPTABLE=y
> +    CONFIG_SMBIOS=y
> +    CONFIG_ACPI=y
> +    #
> +    # Debugging
> +    #
> +    CONFIG_DEBUG_LEVEL=3
> +    CONFIG_DEBUG_SERIAL=y
> +    CONFIG_DEBUG_SERIAL_PORT=0x3f8
> +    # CONFIG_SCREEN_AND_DEBUG is not set



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:23:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:23:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJN73-0002VS-GQ; Thu, 27 Oct 2011 03:23:05 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJMv4-0008LD-5l
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:10:43 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1319710238!930077!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14723 invoked from network); 27 Oct 2011 10:10:39 -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;
	27 Oct 2011 10:10:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8615276"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 10:10: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, 27 Oct 2011 11:10:38 +0100
Subject: RE: [Xen-devel] test structure missing files
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Windows Live <johneed@hotmail.com>
Date: Thu, 27 Oct 2011 11:10:38 +0100
In-Reply-To: <COL119-W3BE5D327E98AC28F28BECA8ED0@phx.gbl>
References: <COL119-W5023765948EB6ED67658CCA8EC0@phx.gbl>
	,,,<1319575086.16747.8.camel@dagon.hellion.org.uk>
	,,,<COL119-W47A054D3076A67A7A488ACA8EC0@phx.gbl>
	,<COL119-W1514D40D1978583B42A629A8ED0@phx.gbl>
	,<1319610349.16747.33.camel@dagon.hellion.org.uk>
	<COL119-W3BE5D327E98AC28F28BECA8ED0@phx.gbl>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319710238.9436.96.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 Wed, 2011-10-26 at 12:16 +0100, Windows Live wrote:

> 
> ImportError: cannot import name XendConfig
> ValueError: Cannot find kernel "/mykernel"
> 
> ValueError: Cannot find kernel "/boot/vmlinuz-xenU-smp"
> AssertionError: videoram not in b
> 
> 
> which makes 4, each of these repeated a couple of times.  Some gentoo
> python devs ought be able to troubleshoot these.  If you would like
> the test build log, just say so.  From here it's purely python.

It looks to me as if the test system relies on some specific files
already existing on your test host (which I suspect must be running
Xen).

> At a glance I suspect the tests that trigger "/mykernel" &&
> "/boot/vmlinuz-xenU-smp" could be commented out or deleted IF they
> stem from requiring the source to build kernels, which does not occur
> in a xen-tools package.  gentoo makes xen for the hypervisor,
> xen-tools and of recent  xen-pvgrub which is an invocation of make
> install-stubdom. I shall call upon more python fluent gentoo devs to
> determine such states.

> In the unlikely case that the gentoo devs can't sort these python
> misfires I shall need return and prompt for further support.

It looks like the test suite is mainly testing the python xend
toolstack, which is for the most part deprecated. I'm not sure how much
effort it is worth spending either fixing up the test suite or the
toolstack. I'm afraid you will most likely find very little enthusiasm
in general for either activity.

I really wouldn't spend any more time on this if I were you. I'm sorry I
didn't notice earlier that this test suite is pretty much obsolete and
worthless.

Ian.

> 
> 
> Thanks
> 
> 
> Ian Delaney, gentoo xen
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:24:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:24:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJN8E-0002sw-7z; Thu, 27 Oct 2011 03:24:18 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJMzJ-0000Vt-ME
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:15:20 -0700
X-Env-Sender: davidtecher@yahoo.fr
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319710501!1230441!1
X-Originating-IP: [77.238.189.207]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15804 invoked from network); 27 Oct 2011 10:15:01 -0000
Received: from nm5-vm0.bullet.mail.ird.yahoo.com (HELO
	nm5-vm0.bullet.mail.ird.yahoo.com) (77.238.189.207)
	by server-4.tower-216.messagelabs.com with SMTP;
	27 Oct 2011 10:15:01 -0000
Received: from [77.238.189.54] by nm5.bullet.mail.ird.yahoo.com with NNFMP;
	27 Oct 2011 10:14:59 -0000
Received: from [212.82.108.124] by tm7.bullet.mail.ird.yahoo.com with NNFMP;
	27 Oct 2011 10:14:59 -0000
Received: from [127.0.0.1] by omp1033.mail.ird.yahoo.com with NNFMP;
	27 Oct 2011 10:14:59 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: 836189.77749.bm@omp1033.mail.ird.yahoo.com
Received: (qmail 3861 invoked by uid 60001); 27 Oct 2011 10:14:59 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.fr; s=s1024;
	t=1319710499; bh=jhYVs8BWwOzb4P0T20cJawZzpYD5M+TQ6xcFH90YWEQ=;
	h=X-YMail-OSG:Received:X-Mailer:References:Message-ID:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type;
	b=FZ2jffESt5A24MhKwcLXGT2mjaI+ZulHXJO5HxqGxHkAmR4fnDwe8uYmKkUrGuKS0M7ne+HS0KWz259dx34boo12LR+1ROevM70rXyud3gW1ETUlU5tmI5NGDzgMzpEvak/XD7kOb8+hTHfqE8taGgFU/shvdpGWZBgni1lLikE=
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.fr;
	h=X-YMail-OSG:Received:X-Mailer:References:Message-ID:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type;
	b=ZY7+cx01POdSiqgLJcqY6Q5H1u6ku5Dx+IjraXKm54FCR8zp4aTREmWwatlzTrnjeksNVbc68cmMH4mQft6Fa/oUIa7rrE6MCXJcs5SKKb4nYlKaxIgeIXK6Z++lvvLh0RswvME3j/uo/2Zs59VpOzjSzQZ0puasEzARgbbYQKg=;
X-YMail-OSG: ZS9dP4wVM1kyRBxRxlflO8NKY.bzERgAeHnhcE8nNYf077t
	NZSfFvPT01ra22CXgoSFF_EijjDObaFngBDenxVY9ZofRdbxQAW2Rt.bTvxl
	y5snNZm2yRdbz1Cm4zGlPUa31PUZH6qqH63n6VO1wpLxJ5nFWJL6ZnzO0vHx
	hZwmQ21Jrdcl_7MC94r5bLrZZzdRZmc_2EwnEesLxk.ePuJviglp_OkNOSTm
	IPPe6EyOE4PZUZ7nEzuHq0ZiY1Nwrf2r9R_iUm3.j2EO8d9tWEP9nb3mMYBl
	cdQc7q66jWUaw4ICys09IcZd8P6Gdv.mnoXLwwQ9EmX9TSdS9sF2dgit7A.C
	gUH9bG54Lk3afgjGk41gd3eAOG0KH5.Ggcz2jvyTRXoBE5ofjhH.PzYL5.ms
	FqM2682wgQzvDcw6UibKpNUaJyXdWu6q6RrFeol.k5G8Pwfjv.P8gxbuQXWz
	Z4in6iLjnTBHXy0D36RxyJN8rcK7R65x0fAXhPTKSayzPtTNuEwqTB4ggqLx
	uTFeokryOUMJkpFSdzh0mjrURzTpogRQL2j6zgXakIF5nQuDLIa4bUzvGFEz
	UHpt0vsqU5hJ6n2f9sKumCJ6uaiw3sCZsrdccsDFKthP81QaaoJtqOmuXjQy
	Rd3PJ0kl2XgucgDbCKQ2rMoG9ZpN7krjbB9pP63KaH6vMucN2kzj9SnsSRqO
	wQBW2lULk_20.stPkCemAFAHrTuOqnQ1Dyg--
Received: from [195.167.237.98] by web29804.mail.ird.yahoo.com via HTTP;
	Thu, 27 Oct 2011 11:14:59 BST
X-Mailer: YahooMailWebService/0.8.114.317681
References: <1316618006.67296.YahooMailNeo@web29818.mail.ird.yahoo.com>
	<1316693722029-4829929.post@n5.nabble.com>
	<20110922182705.GE12984@reaktio.net>
	<1316728444821-4831624.post@n5.nabble.com>
	<1316777654598-4833174.post@n5.nabble.com>
	<1316786412428-4833637.post@n5.nabble.com>
	<20110923172115.GI12984@reaktio.net>
	<1318672856439-4904945.post@n5.nabble.com>
	<1319630071722-4939528.post@n5.nabble.com>
	<1319636130.20499.YahooMailNeo@web29808.mail.ird.yahoo.com>
	<1319695116310-4942047.post@n5.nabble.com>
Message-ID: <1319710499.206.YahooMailNeo@web29804.mail.ird.yahoo.com>
Date: Thu, 27 Oct 2011 11:14:59 +0100 (BST)
From: David TECHER <davidtecher@yahoo.fr>
Subject: Re : Re : Re : Re : Re : Re : [Xen-devel] Re: Patches for
	VGA-Passthrough XEN 4.2 unstable
To: Zoltan Hubai <hubaiz@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
In-Reply-To: <1319695116310-4942047.post@n5.nabble.com>
MIME-Version: 1.0
Cc: 
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: David TECHER <davidtecher@yahoo.fr>
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@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="===============2007398566=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2007398566==
Content-Type: multipart/alternative;
	boundary="-481600219-1997657644-1319710499=:206"

---481600219-1997657644-1319710499=:206
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

First of all, thanks for the tests you've done.=0A=0A=0AThe fact that=A0 yo=
u have to reboot the dom0 is a known problem with xp or win7.=0A=0AI've got=
 the same problems as you've got on win7 (BSOD and so on...)=0A=0AManaging/=
implementing drivers is different on xp and win7. The error with 'nvlddmkm.=
sys' occured frequently while I was doing my tests too.=0A=0A=0AThat's the =
reason why I stopped my tests on win7 :(=0A=0A=0AHowever I do not test quad=
ro modified drivers.=0A=0AHope you will be more lucky with this drivers.=0A=
=0ALet me know.=0A=0AThanks for testing.=0A=0A=0ADavid=0A=0A=0A=0A_________=
_______________________=0ADe=A0: Zoltan Hubai <hubaiz@gmail.com>=0A=C0=A0: =
xen-devel@lists.xensource.com=0AEnvoy=E9 le : Jeudi 27 Octobre 2011 7h58=0A=
Objet=A0: Re: Re : Re : Re : Re : Re : [Xen-devel] Re: Patches for VGA-Pass=
through XEN 4.2 unstable=0A=0AThe joy was a bit early :(=0A=0AIn windows 7 =
(32/64 bit) I managed to install the driver but every time I=0Atried to sta=
rt 3dMark 6 or vantage it ended up in BSOD complaining about=0Anvlddmkm.sys=
, also entering the nvidia control panel "Adjust image settings=0Awith prev=
iew" I got the same BSOD.=0AI also tried once more to install the latest dr=
ivers but with no luck. The=0Adrivers install but they report that there is=
 no nvidia hardware.=0A=0AI noticed that if I shutdown the domu then I can =
start it again, but if I=0Arestart the domu then I need to restart the dom0=
 (i got this with winxp and=0Awin7 domu).=0A=0AIn winxp I managed to run th=
e 3dmark 6 till end and I think the score was=0A~18000, not sure about it, =
but it run all the test with > 60 fps.=0A=0ADidn't try to play yet on xp, f=
irst I need to passthru a kbd/mouse, will try=0Aover weekend.=0A=0AI saw so=
me modified quadro drivers maybe I try those also.=0A=0A--=0AView this mess=
age in context: http://xen.1045712.n5.nabble.com/Patches-for-VGA-Passthroug=
h-XEN-4-2-unstable-tp4406265p4942047.html=0ASent from the Xen - Dev mailing=
 list archive at Nabble.com.=0A=0A_________________________________________=
______=0AXen-devel mailing list=0AXen-devel@lists.xensource.com=0Ahttp://li=
sts.xensource.com/xen-devel
---481600219-1997657644-1319710499=:206
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

<html><body><div style=3D"color:#000; background-color:#fff; font-family:ti=
mes new roman, new york, times, serif;font-size:12pt"><div><span>First of a=
ll, thanks for the tests you've done.<br></span></div><div><span><br></span=
></div><div><span>The fact that&nbsp; you have to reboot the dom0 is a know=
n problem with xp or win7.</span></div><div><br><span></span></div><div><sp=
an>I've got the same problems as you've got on win7 (BSOD and so on...)</sp=
an></div><div><br><span></span></div><div><span>Managing/implementing drive=
rs is different on xp and win7. The error with '</span>nvlddmkm.sys' occure=
d frequently while I was doing my tests too.<br></div><div><br><span></span=
></div><div><span>That's the reason why I stopped my tests on win7 :(<br></=
span></div><div><br><span></span></div><div><span>However I do not test qua=
dro modified drivers.</span></div><div><br><span></span></div><div><span>Ho=
pe you will be more lucky with this
 drivers.</span></div><div><br><span></span></div><div><span>Let me know.</=
span></div><div><br><span></span></div><div><span>Thanks for testing.<br></=
span></div><div><br><span></span></div><div><span>David<br></span></div><di=
v><br></div><div style=3D"font-family: times new roman, new york, times, se=
rif; font-size: 12pt;"><div style=3D"font-family: times new roman, new york=
, times, serif; font-size: 12pt;"><font face=3D"Arial" size=3D"2"><hr size=
=3D"1"><b><span style=3D"font-weight:bold;">De&nbsp;:</span></b> Zoltan Hub=
ai &lt;hubaiz@gmail.com&gt;<br><b><span style=3D"font-weight: bold;">=C0&nb=
sp;:</span></b> xen-devel@lists.xensource.com<br><b><span style=3D"font-wei=
ght: bold;">Envoy=E9 le :</span></b> Jeudi 27 Octobre 2011 7h58<br><b><span=
 style=3D"font-weight: bold;">Objet&nbsp;:</span></b> Re: Re : Re : Re : Re=
 : Re : [Xen-devel] Re: Patches for VGA-Passthrough XEN 4.2 unstable<br></f=
ont><br>The joy was a bit early :(<br><br>In windows 7 (32/64 bit) I manage=
d to install
 the driver but every time I<br>tried to start 3dMark 6 or vantage it ended=
 up in BSOD complaining about<br>nvlddmkm.sys, also entering the nvidia con=
trol panel "Adjust image settings<br>with preview" I got the same BSOD.<br>=
I also tried once more to install the latest drivers but with no luck. The<=
br>drivers install but they report that there is no nvidia hardware.<br><br=
>I noticed that if I shutdown the domu then I can start it again, but if I<=
br>restart the domu then I need to restart the dom0 (i got this with winxp =
and<br>win7 domu).<br><br>In winxp I managed to run the 3dmark 6 till end a=
nd I think the score was<br>~18000, not sure about it, but it run all the t=
est with &gt; 60 fps.<br><br>Didn't try to play yet on xp, first I need to =
passthru a kbd/mouse, will try<br>over weekend.<br><br>I saw some modified =
quadro drivers maybe I try those also.<br><br>--<br>View this message in co=
ntext: <a
 href=3D"http://xen.1045712.n5.nabble.com/Patches-for-VGA-Passthrough-XEN-4=
-2-unstable-tp4406265p4942047.html" target=3D"_blank">http://xen.1045712.n5=
.nabble.com/Patches-for-VGA-Passthrough-XEN-4-2-unstable-tp4406265p4942047.=
html</a><br>Sent from the Xen - Dev mailing list archive at Nabble.com.<br>=
<br>_______________________________________________<br>Xen-devel mailing li=
st<br><a ymailto=3D"mailto:Xen-devel@lists.xensource.com" href=3D"mailto:Xe=
n-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><br><br></div></div></div></body></html>
---481600219-1997657644-1319710499=:206--


--===============2007398566==
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

--===============2007398566==--


From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:25:14 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:25:14 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJN98-0003GM-Gj; Thu, 27 Oct 2011 03:25:14 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJN3N-0001Aq-Uj
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:19:18 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1319710728!54902033!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31225 invoked from network); 27 Oct 2011 10:18:48 -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;
	27 Oct 2011 10:18:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8615633"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 10:19:14 +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, 27 Oct 2011 11:19:14 +0100
Subject: Re: [Xen-devel] Help: Mapping a grant reference fails
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
Date: Thu, 27 Oct 2011 11:19:14 +0100
In-Reply-To: <CAP2B859xHK8zzgqAAWt-WdxxBcwNTKK2TfbqejfFnEW2mgr7jA@mail.gmail.com>
References: <CAP2B859xHK8zzgqAAWt-WdxxBcwNTKK2TfbqejfFnEW2mgr7jA@mail.gmail.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 8bit
Message-ID: <1319710754.9436.104.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 Wed, 2011-10-26 at 09:33 +0100, Daniel Castro wrote:
> Hello All,
> 
> I need a little help, I am trying to map a grant reference, I know
> something is wrong because I have this in dmesg:
> (XEN) grant_table.c:304:d0 Bad flags (0) or dom (0). (expected dom 0)
> Also Xenstore reports this:
>  error = ""
>   backend = ""
>    vbd = ""
>     18 = ""
>      832 = ""
>       error = "1 mapping ring-ref 1 port 4"
> This happens when my Block Driver is trying to connect to the back end.
> I have traced the problem to the line where I am setting up
> gnttab_setup_table, the struct has a field XEN_GUEST_HANDLE(ulong)
> frame_list. Here is the problem, whatever type I assign it (void *,
> unsigned long ...etc) fails.

It should effectively be a "unsigned long *".

You should be using the set_xen_guest_handle macro to set it.

>  According to documentation this is the
> address where the grant table begins. I I change the type of the
> parameter in the struct it does not work. I think I have to resolve
> the underlining issue on the XEN_GUEST_HANDLE...
> The compiler has this error:
> src/xen-blk.c:141:17: error: incompatible types when assigning to type
> â€˜__guest_handle_ulongâ€™ from type â€˜struct grant_entry_v1 *â€™

The frame_list parameter is an array of unsigned longs which is filled
in with the gfn's of the pages containing the grant table. It is not the
actual grant table itself.

The pages are already mapped in SeaBIOS but if they weren't then you
would need to create page table mappings of those GFNs at the virtual
address you have chose. It is that virtual address which becomes the
"struct grant_entry_v1 *".

In Linux for example the function arch_gnttab_map_shared() does that
mapping step.

For an HVM guest GNTTABOP_setup_table just returns the same pages you
passed to XENMAPSPACE_grant_table. Since the pages you passed to
XENMAPSPACE_grant_table are already mapped you don't need to worry about
mapping them yourself so you can just provide an array of nr_grant_pages
* sizeof(unsigned long) and then ignore the result.

Ian.

> 
> Thanks for the help,
> 
> Daniel
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:26:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03: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 1RJNAS-0003eR-Oz; Thu, 27 Oct 2011 03:26:36 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJN5O-0001jG-Ah
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:21:22 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319710866!1847552!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9442 invoked from network); 27 Oct 2011 10:21:06 -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;
	27 Oct 2011 10:21:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8615695"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 10:21: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;
	Thu, 27 Oct 2011 11:21:06 +0100
Subject: Re: [Xen-devel] [PATCH] Add HybridISO support for PyGrub2
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Philipp Hahn <hahn@univention.de>
Date: Thu, 27 Oct 2011 11:21:05 +0100
In-Reply-To: <201110251233.45315.hahn@univention.de>
References: <201110251057.06774.hahn@univention.de>
	<1319534259.3385.224.camel@zakaz.uk.xensource.com>
	<201110251233.45315.hahn@univention.de>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319710865.9436.106.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-10-25 at 11:33 +0100, Philipp Hahn wrote:
[...snip explanations...]

Thanks Philipp, that all seems to make sense.

Tim had some suggestions on how/where this functionality could be better
implemented though.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:31:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:31:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJNFS-00047D-E7; Thu, 27 Oct 2011 03:31:46 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJNEp-0003vJ-9I; Thu, 27 Oct 2011 03:31:08 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1319711450!1819538!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7737 invoked from network); 27 Oct 2011 10:30:50 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 10:30:50 -0000
Received: by wyi11 with SMTP id 11so3357386wyi.30
	for <multiple recipients>; Thu, 27 Oct 2011 03:30:50 -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=zg5Z2tKw4EsoZdR3v1y97DR0/LWbOQ0CX9mgVVVOfOI=;
	b=cRo/vxJ1CTP/mDsBk5nwPlIUtjISwJCVNFiJdNLVMcbx/s+NXlpDC2xQRtBe/5yFJc
	XqhvJ/AdvlJEqfo2BYekaxGtAszzGh6qh3C7JaK4pZnHnKRvmdF92WIgxAgnBJzIZQC1
	Jsqh+LaJyLu96H/OFTGJKQ5PhQt/fnqthz1ro=
Received: by 10.216.133.5 with SMTP id p5mr953017wei.34.1319711450464;
	Thu, 27 Oct 2011 03:30:50 -0700 (PDT)
Received: from [172.16.26.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id es5sm8478991wbb.11.2011.10.27.03.30.47
	(version=SSLv3 cipher=OTHER); Thu, 27 Oct 2011 03:30:48 -0700 (PDT)
Message-ID: <4EA932D5.3060504@xen.org>
Date: Thu, 27 Oct 2011 11:30:45 +0100
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: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111026195543.GA6558@phenom.dumpdata.com>
In-Reply-To: <20111026195543.GA6558@phenom.dumpdata.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"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>,
	Joseph Glanville <joseph.glanville@orionvm.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

On 26/10/2011 20:55, Konrad Rzeszutek Wilk wrote:
> On Mon, Oct 17, 2011 at 04:37:15PM +0100, Lars Kurth wrote:
>> Cool.
>>
>> I am wondering what people think about archiving vs deleting wiki
>> pages. Obviously some pages can be deleted (stuff about events, job
>> listings, old TODO lists, etc.).
>>
>> Others may still be valuable to legacy users. See
> .. snip..
> Hey Lars,
>
> I was trying to add to https://docs.google.com/spreadsheet/ccc?key=0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&hl=en_US#gid=0
>
> a couple of things but it seems I am not authorized, anyhow these are the changes:
>
> NetBSDdomU merge with How_to_build_NetBSD_DomU_on_Linux
> 2.6.18-to-2.6.31-and-higher is OK.
> InstallationNotes - remove
> KnownGoodImages - remove
> InstallGuestImage - remove
> RealModeArea - archive, or move it to be PPC/RealModeArea
> USBCompatibilityList - remove
> XenPCIpassthrough - keep, I just updated it
> XenPVOPSDRM - keep, just updated it
> XenSerialConsole - keep, I just updated it
> XenPVSCSI - keep
> XenUSBPassthrough - keep, just updated it
> XenParavirtOps - keep, just updated it.
> XenOnUbuntu64 - remove
Odd: you should have write access like anybody else. Anyway, I applied 
your changes.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:35:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:35:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJNJ5-0005dE-QF; Thu, 27 Oct 2011 03:35:31 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJNHs-00055q-NJ
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:34:17 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319711653!1256272!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19949 invoked from network); 27 Oct 2011 10:34:13 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 10:34:13 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8616071"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 10:34: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, 27 Oct 2011 11:34:13 +0100
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
	1RJNHo-0004bP-Pg; Thu, 27 Oct 2011 10:34:12 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJNHo-0004QD-M6;
	Thu, 27 Oct 2011 11:34:12 +0100
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: <20137.13220.672608.493738@mariner.uk.xensource.com>
Date: Thu, 27 Oct 2011 11:34:12 +0100
To: Olaf Hering <olaf@aepfle.de>
Subject: Re: [Xen-devel] [PATCH 17 of 24] libxl: add
	libxl__spawn_confirm_offspring_startup
In-Reply-To: <20111026163026.GA20100@aepfle.de>
References: <patchbomb.1317657277@probook.site>
	<018f63b6e4863faca16a.1317657294@probook.site>
	<20134.54883.620815.989672@mariner.uk.xensource.com>
	<20111025172159.GA11571@aepfle.de>
	<20134.63407.291964.492321@mariner.uk.xensource.com>
	<20111026163026.GA20100@aepfle.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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 ("Re: [Xen-devel] [PATCH 17 of 24] libxl: add libxl__spawn_confirm_offspring_startup"):
> I moved the device model specific functions and made them generic.
> Perhaps I should have merged the add+use patches (15+16 / 17+18) into a
> single change. Once all patches are applied I see no code duplication.

Oh, I see; I didn't spot that, I'm afraid.  I'll look at it again.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:38:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:38:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJNLk-00064B-KH; Thu, 27 Oct 2011 03:38:16 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJNKy-0005rb-OV
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:37:30 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1319711845!33175640!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10356 invoked from network); 27 Oct 2011 10:37:25 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 10:37:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,412,1315180800"; 
   d="scan'208";a="8616138"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 10:37:25 +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, 27 Oct 2011 11:37:25 +0100
Date: Thu, 27 Oct 2011 11:37:43 +0100
From: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
In-Reply-To: <alpine.DEB.2.00.1110031800390.3519@kaball-desktop>
Message-ID: <alpine.DEB.2.00.1110271106190.3519@kaball-desktop>
References: <4E7B4768.8060103@canonical.com>
	<alpine.DEB.2.00.1109221838370.8700@kaball-desktop>
	<4E85883C.7030808@canonical.com>
	<alpine.DEB.2.00.1109301427590.3519@kaball-desktop>
	<4E85E8E8.2020702@canonical.com> <4E860382.7040108@canonical.com>
	<alpine.DEB.2.00.1110031800390.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>,
	Jan Beulich <JBeulich@novell.com>,
	Stefan Bader <stefan.bader@canonical.com>
Subject: [Xen-devel] [PATCH] xen: do not loose level interrupt 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

PV on HVM guests can loose level interrupts coming from emulated
devices: we are missing code to retry to inject a pirq in the guest if
it corresponds to a level interrupt and the interrupt has been raised
while the guest is servicing the first one.

The same thing could also happen with PV guests, including dom0, even
though it is much more unlikely. In case of PV guests the scenario would
be the following:

1) a device raises a level interrupt and xen injects it into the
guest;

2) the guest is temporarely stuck: it does not ack it or eoi it;

3) the xen timer kicks in and eois the interrupt;

4) the device thinks it is all fine and sends a second interrupt;

5) Xen fails to inject the second interrupt into the guest because the
guest has still the event channel pending bit set;

at this point the guest looses the second interrupt notification, that
is not supposed to happen with level interrupts and it might cause
problems with some devices.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>

diff -r bf533533046c xen/arch/x86/hvm/irq.c
--- a/xen/arch/x86/hvm/irq.c	Fri Sep 30 14:12:35 2011 +0000
+++ b/xen/arch/x86/hvm/irq.c	Mon Oct 03 16:54:51 2011 +0000
@@ -36,7 +36,8 @@ static void assert_gsi(struct domain *d,
 
     if ( hvm_domain_use_pirq(d, pirq) )
     {
-        send_guest_pirq(d, pirq);
+        if ( send_guest_pirq(d, pirq) && ioapic_gsi >= NR_ISAIRQS )
+            pirq->lost++;
         return;
     }
     vioapic_irq_positive_edge(d, ioapic_gsi);
@@ -63,6 +64,7 @@ static void __hvm_pci_intx_assert(
 {
     struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
     unsigned int gsi, link, isa_irq;
+    struct pirq *pirq;
 
     ASSERT((device <= 31) && (intx <= 3));
 
@@ -72,6 +74,11 @@ static void __hvm_pci_intx_assert(
     gsi = hvm_pci_intx_gsi(device, intx);
     if ( hvm_irq->gsi_assert_count[gsi]++ == 0 )
         assert_gsi(d, gsi);
+    else {
+        pirq = pirq_info(d, domain_emuirq_to_pirq(d, gsi));
+        if ( hvm_domain_use_pirq(d, pirq) )
+            pirq->lost++;
+    }
 
     link    = hvm_pci_intx_link(device, intx);
     isa_irq = hvm_irq->pci_link.route[link];
diff -r bf533533046c xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c	Fri Sep 30 14:12:35 2011 +0000
+++ b/xen/arch/x86/irq.c	Mon Oct 03 16:54:51 2011 +0000
@@ -965,7 +965,11 @@ static void __do_IRQ_guest(int irq)
              !test_and_set_bool(pirq->masked) )
             action->in_flight++;
         if ( !hvm_do_IRQ_dpci(d, pirq) )
-            send_guest_pirq(d, pirq);
+        {
+            if ( send_guest_pirq(d, pirq) &&
+                    action->ack_type == ACKTYPE_EOI )
+                pirq->lost++;
+        }
     }
 
     if ( action->ack_type != ACKTYPE_NONE )
diff -r bf533533046c xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c	Fri Sep 30 14:12:35 2011 +0000
+++ b/xen/arch/x86/physdev.c	Mon Oct 03 16:54:51 2011 +0000
@@ -11,6 +11,7 @@
 #include <asm/current.h>
 #include <asm/io_apic.h>
 #include <asm/msi.h>
+#include <asm/hvm/irq.h>
 #include <asm/hypercall.h>
 #include <public/xen.h>
 #include <public/physdev.h>
@@ -270,6 +271,10 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
         if ( !is_hvm_domain(v->domain) ||
              domain_pirq_to_irq(v->domain, eoi.irq) > 0 )
             pirq_guest_eoi(pirq);
+        if ( pirq->lost > 0) {
+            if ( !send_guest_pirq(v->domain, pirq) )
+                pirq->lost--;
+        }
         spin_unlock(&v->domain->event_lock);
         ret = 0;
         break;
@@ -328,9 +333,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;
         }
 
diff -r bf533533046c xen/include/xen/irq.h
--- a/xen/include/xen/irq.h	Fri Sep 30 14:12:35 2011 +0000
+++ b/xen/include/xen/irq.h	Mon Oct 03 16:54:51 2011 +0000
@@ -146,6 +146,7 @@ struct pirq {
     int pirq;
     u16 evtchn;
     bool_t masked;
+    u32 lost;
     struct rcu_head rcu_head;
     struct arch_pirq arch;
 };

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 03:44:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 03:44:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJNRJ-0006ct-Id; Thu, 27 Oct 2011 03:44:01 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJNQl-0006Ps-1R
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:43:27 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-4.tower-27.messagelabs.com!1319712180!46167038!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31786 invoked from network); 27 Oct 2011 10:43:00 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-4.tower-27.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 10:43:00 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RJNQh-000FzD-AQ; Thu, 27 Oct 2011 10:43:23 +0000
Date: Thu, 27 Oct 2011 11:43:23 +0100
From: Tim Deegan <tim@xen.org>
To: Srujan Kotikela <ksrujandas@gmail.com>
Subject: Re: [Xen-devel] Hypercall by DomU Application
Message-ID: <20111027104323.GE59656@ocelot.phlegethon.org>
References: <CAKLFbfyTc-Q4ao44suwBC_XQi7KLaGpfS0=kH=iL2CoQzjQXbQ@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CAKLFbfyTc-Q4ao44suwBC_XQi7KLaGpfS0=kH=iL2CoQzjQXbQ@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

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.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:05:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04:05:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJNm9-0007RW-MH; Thu, 27 Oct 2011 04:05:33 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJNiF-00078n-AG
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 04:01:33 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-7.tower-174.messagelabs.com!1319713288!36854663!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32582 invoked from network); 27 Oct 2011 11:01:28 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-7.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 11:01:28 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RJNiB-000G3g-EV; Thu, 27 Oct 2011 11:01:27 +0000
Date: Thu, 27 Oct 2011 12:01:27 +0100
From: Tim Deegan <tim@xen.org>
To: Mohammad Hedayati <hedayati.mo@gmail.com>
Subject: Re: [Xen-devel] readonly grants
Message-ID: <20111027110127.GF59656@ocelot.phlegethon.org>
References: <CABA5EEsXEhN8DPwbm-YLMwW8qVK-1-gV37vCYCu=spG8uUUZ5g@mail.gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CABA5EEsXEhN8DPwbm-YLMwW8qVK-1-gV37vCYCu=spG8uUUZ5g@mail.gmail.com>
User-Agent: Mutt/1.4.2.1i
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

At 20:16 +0330 on 26 Oct (1319660209), Mohammad Hedayati wrote:
> After mapping a readonly granted page in a PV guest, the guest can try to
> change his l1 page table entry, faulting into Xen. Here xen emulates the
> update operation, but first it must check whether the modification is
> allowed or not (i.e. the grant is readonly or not).
> I'm looking through the code, but I can't find where this checking is done.

Emulated writes go through ptwr_emulated_update() which calls
get_page_from_l1e(), which won't let the guest write a PTE that maps
another VM's memory.

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:09:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04:09:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJNpX-000843-22; Thu, 27 Oct 2011 04:09:03 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJNnh-0007eu-4T
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 04:07:09 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-16.tower-21.messagelabs.com!1319713625!1855793!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12232 invoked from network); 27 Oct 2011 11:07:05 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 11:07:05 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RJNnb-000G5W-GC; Thu, 27 Oct 2011 11:07:03 +0000
Date: Thu, 27 Oct 2011 12:07:03 +0100
From: Tim Deegan <tim@xen.org>
To: Nathan March <nathan@gt.net>
Subject: Re: [Xen-devel] Clock jumping during live migrations
Message-ID: <20111027110703.GG59656@ocelot.phlegethon.org>
References: <4EA88A4A.1040805@gt.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EA88A4A.1040805@gt.net>
User-Agent: Mutt/1.4.2.1i
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

Hi, 

At 15:31 -0700 on 26 Oct (1319643098), Nathan March wrote:
> Having an issue where the clock on a VM will jump ahead by the timezone 
> offset but only certain directions between certain machines.
> 
> For example, if I run a "sleep 1; date" loop on the VM and migrate it 
> from xen4 to xen7:
> 
> Wed Oct 26 21:14:46 PDT 2011
> Thu Oct 27 04:19:03 PDT 2011

...

> xen4 ~ # uname -a
> Linux xen4 3.0.3 #3 SMP Thu Sep 1 23:39:43 PDT 2011 x86_64 Intel(R) 

I think maybe you need these patches on your dom0 kernel:

http://lists.xensource.com/archives/html/xen-devel/2011-10/msg01762.html

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:19:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04:19:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJNzu-0000Bu-0l; Thu, 27 Oct 2011 04:19:46 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJNz3-0008R8-Si
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 04:18:54 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319714330!36896853!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19018 invoked from network); 27 Oct 2011 11:18: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;
	27 Oct 2011 11:18:50 -0000
Received: by wwf10 with SMTP id 10so3332429wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 04:18:50 -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=16Rtq8i7a/NmMWPnyMG8ULYMjxOKEI8mT6ljzifxTjo=;
	b=d9Jyz14EaPulUYKGCf+QpBHmtG6CGHX+HL6zD0vp3hmmw5gaL+unoGYmcKF/1IH8sY
	JiGslQQuSgrgxTBTUtyYH/i5WdhZX8XyC8iGrModJqfItqzA21i4SiJAilTrV5ciDMQ4
	ra0qXSG9Yqbd84qeBB3VrIfwhluGPt7isThP4=
Received: by 10.227.199.5 with SMTP id eq5mr15992756wbb.2.1319714330370;
	Thu, 27 Oct 2011 04:18:50 -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 gd18sm8738273wbb.5.2011.10.27.04.18.48
	(version=SSLv3 cipher=OTHER); Thu, 27 Oct 2011 04:18:49 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 27 Oct 2011 12:18:45 +0100
Subject: Re: [Xen-devel] [PATCH] xen: do not loose level interrupt
	notifications
From: Keir Fraser <keir.xen@gmail.com>
To: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
Message-ID: <CACEFCA5.23BD8%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] xen: do not loose level interrupt
	notifications
Thread-Index: AcyUmjC1MelsYmijI06Oc9fBfSG2ZQ==
In-Reply-To: <alpine.DEB.2.00.1110271106190.3519@kaball-desktop>
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>,
	Stefan Bader <stefan.bader@canonical.com>,
	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

On 27/10/2011 11:37, "Stefano Stabellini" <Stefano.Stabellini@eu.citrix.com>
wrote:

> PV on HVM guests can loose level interrupts coming from emulated
> devices: we are missing code to retry to inject a pirq in the guest if
> it corresponds to a level interrupt and the interrupt has been raised
> while the guest is servicing the first one.
> 
> The same thing could also happen with PV guests, including dom0, even
> though it is much more unlikely. In case of PV guests the scenario would
> be the following:
> 
> 1) a device raises a level interrupt and xen injects it into the
> guest;
> 
> 2) the guest is temporarely stuck: it does not ack it or eoi it;
> 
> 3) the xen timer kicks in and eois the interrupt;
> 
> 4) the device thinks it is all fine and sends a second interrupt;
> 
> 5) Xen fails to inject the second interrupt into the guest because the
> guest has still the event channel pending bit set;
> 
> at this point the guest looses the second interrupt notification, that
> is not supposed to happen with level interrupts and it might cause
> problems with some devices.

You can't really lose a level-triggered interrupt. In step (4) the device
isn't really actively involved in sending another interrupt -- it never
deasserted its INTx line, and nor will it until the guest's ISR quenches the
interrupt at the device. If the guest misses such an interrupt, and doesn't
execute the relevant ISR when it should, then another interrupt will simply
be raised by the interrupt controller when the guest does finally EOI the
interrupt. Because the device is *still* asserting the line.

Well, that's the PV case anyway. I don't see any problem with our handling
of the PV case.

Is PV-HVM so different?

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:36:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04:36:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOGW-0000uJ-M9; Thu, 27 Oct 2011 04:36:56 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJOFl-0000gK-OV
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 04:36:10 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319715300!1258339!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16408 invoked from network); 27 Oct 2011 11:35:01 -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;
	27 Oct 2011 11:35:01 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8617422"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 11:35:00 +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; Thu, 27 Oct 2011 12:35:00 +0100
Date: Thu, 27 Oct 2011 12:34:54 +0100
From: Anthony PERARD <anthony.perard@citrix.com>
X-X-Sender: anthony@perard.uk.xensource.com
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] docs, Add HowTo use QEMU upstream.
In-Reply-To: <1319709907.9436.91.camel@zakaz.uk.xensource.com>
Message-ID: <alpine.DEB.2.00.1110271149550.3134@perard.uk.xensource.com>
References: <1319648125-16986-1-git-send-email-anthony.perard@citrix.com>
	<1319709907.9436.91.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 <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, 27 Oct 2011, Ian Campbell wrote:

> I suppose a bunch of this becomes obsolete when Stefano's patches to
> integrate SeaBIOS/qemu into the build land, but perhaps it is worth
> documenting the manual steps anyway?

It is at least more easier than trying to read the build system :). But
I will add a note about this.

> Is the plan to retire the wiki page?

I don't know, should we keep both? or just this text file? All I know,
it's easier to maintaine that file than the wiki page as we do not have
to worry about which revision of xen-unstable we use.

> I don't have much comment on the text other than spelling and some minor
> grammar.
>
> On Wed, 2011-10-26 at 17:55 +0100, Anthony PERARD wrote:
> > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> >
> > ---
> >  docs/misc/qemu-upstream_howto_use_it.markdown |  122 +++++++++++++++++++++++++
> >  1 files changed, 122 insertions(+), 0 deletions(-)
> >
> > diff --git a/docs/misc/qemu-upstream_howto_use_it.markdown b/docs/misc/qemu-upstream_howto_use_it.markdown
> > new file mode 100644
> > index 0000000..cdf920a
> > --- /dev/null
> > +++ b/docs/misc/qemu-upstream_howto_use_it.markdown
> > @@ -0,0 +1,122 @@
> > +Help to use QEMU (upstream version) with Xen
> > +============================================
> > +
> > +How to build it
> > +---------------
> > +
> > +### SeaBIOS
> > +
> > +This new device-model need a different bios, SeaBIOS. Clone the repository from:
>    The                   needs            BIOS
>
> It is usually "BIOS" not "bios", I think.

Yes, BIOS is not a word.

> > +
> > +  - git://git.qemu.org/seabios.git
> > +  - http://git.qemu.org/git/seabios.git
> > +
> > +Put the `.config` file in the appendix at the root of seabios.git and build SeaBIOS.
> > +
> > +In xen-unstable source tree, add the file `.config` with
> > +`SEABIOS_DIR = /path/to/seabios.git`.
> > +To build hvmloader with SeaBIOS, you propably need to `make -C tools/firmware
>                                         probably
>
> > +clean` first and then `make tools`, to use the new SEABIOS_DIR parameter.
> > +
> > +
> > +### QEMU
> > +
> > +Get QEMU upstream source from:
> > +
> > +  - git://xenbits.xensource.com/qemu-upstream-unstable.git
> > +  - http://xenbits.xensource.com/git-http/qemu-upstream-unstable.git
> > +
> > +To configure build QEMU upstream with Xen
> > +
> > +    ./configure --enable-xen --target-list=i386-softmmu --extra-cflags="-I$path_to_xen_source/tools/include -I$path_to_xen_source/tools/libxc -I$path_to_xen_source/tools/xenstore" --extra-ldflags="-L$path_to_xen_source/tools/libxc -L$path_to_xen_source/tools/xenstore"
> > +
>
> Perhaps wrap this somehow?
>
> Incidentally, would upstream accept a --xen-dir type option (or an
> argument to --enable-xen?) to which you could pass $path_to_xen_source
> and have it do all this automatically?
>
> Can you omit all that if you have installed Xen on the current host
> (i.e. pick all that up from /usr/{lib,include})?

Yes :), so the only way to build QEMU with a fresh Xen build is to
specifie the all path. I'm actually only specify the path to the dist
dir: --extra-cflags=-Ixen.git/dist/install/usr/include
--extra-ldflags=-Lxen.git/dist/install/usr/lib
but this propably does not work for some people because that have been
changed on the wiki page.

> > +You can also use other several options such as `--disable-kvm`.
> > +
> > +
> > +How to use QEMU upstream
> > +------------------------
> > +
> > +Only xl support QEMU upstream.
> > +
> > +To actually use it, add or change this in your VM configuration file:
> > +
> > +    device_model_version = 'qemu-xen'
> > +    device_model_override = '/path/to/qemu/i386-softmmu/qemu'
>
> This second one should become unnecessary (and unadvised) when Stefano's
> build integration patches hit.

Yes, as well the build of SeaBIOS and QEMU and everything a part from
device_model_version maybe.

-- 
Anthony PERARD

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:41:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04: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 1RJOKz-000266-DO; Thu, 27 Oct 2011 04:41:34 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlTR-0003MC-2N
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:11:43 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319566295!1037142!1
X-Originating-IP: [122.248.162.3]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12911 invoked from network); 25 Oct 2011 18:11:37 -0000
Received: from e28smtp03.in.ibm.com (HELO e28smtp03.in.ibm.com) (122.248.162.3)
	by server-3.tower-216.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 25 Oct 2011 18:11:37 -0000
Received: from d28relay03.in.ibm.com (d28relay03.in.ibm.com [9.184.220.60])
	by e28smtp03.in.ibm.com (8.14.4/8.13.1) with ESMTP id p9PIBXgS000693
	for <xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 23:41:33 +0530
Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63])
	by d28relay03.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9PIBXqX4317370
	for <xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 23:41:33 +0530
Received: from d28av01.in.ibm.com (loopback [127.0.0.1])
	by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9PIBVNb005851
	for <xen-devel@lists.xensource.com>; Tue, 25 Oct 2011 23:41:33 +0530
Received: from oc5400248562.ibm.com ([9.79.194.67])
	by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9PIBS2n005797; Tue, 25 Oct 2011 23:41:28 +0530
Message-ID: <4EA6FBEA.8080506@linux.vnet.ibm.com>
Date: Tue, 25 Oct 2011 23:41:54 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Avi Kivity <avi@redhat.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190700.16364.7548.sendpatchset@oc5400248562.ibm.com>
	<4EA53AB2.9050805@redhat.com>
In-Reply-To: <4EA53AB2.9050805@redhat.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:11 -0700
Cc: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Gleb Natapov <gleb@redhat.com>, Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>, KVM <kvm@vger.kernel.org>,
	x86@kernel.org, Ingo Molnar <mingo@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Marcelo Tosatti <mtosatti@redhat.com>, Xen <xen-devel@lists.xensource.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Greg Kroah-Hartman <gregkh@suse.de>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 4/5] kvm guest : Added configuration
 support to enable debug information for KVM 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

On 10/24/2011 03:45 PM, Avi Kivity wrote:
> On 10/23/2011 09:07 PM, Raghavendra K T wrote:
>> Added configuration support to enable debug information
>> for KVM Guests in debugfs
>>
>> Signed-off-by: Srivatsa Vaddagiri<vatsa@linux.vnet.ibm.com>
>> Signed-off-by: Suzuki Poulose<suzuki@in.ibm.com>
>> Signed-off-by: Raghavendra K T<raghavendra.kt@linux.vnet.ibm.com>
>> ---
>> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
>> index 1f03f82..ed34269 100644
>> --- a/arch/x86/Kconfig
>> +++ b/arch/x86/Kconfig
>> @@ -562,6 +562,15 @@ config KVM_GUEST
>>   	  This option enables various optimizations for running under the KVM
>>   	  hypervisor.
>>
>> +config KVM_DEBUG_FS
>> +	bool "Enable debug information for KVM Guests in debugfs"
>> +	depends on KVM_GUEST
>> +	default n
>> +	---help---
>> +	  This option enables collection of various statistics for KVM guest.
>> +   	  Statistics are displayed in debugfs filesystem. Enabling this option
>> +	  may incur significant overhead.
>> +
>>   source "arch/x86/lguest/Kconfig"
>>
>>
>
> This might be better implemented through tracepoints, which an be
> enabled dynamically.
>
Interesting option. I 'll explore this one. Thanks for pointing.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:42:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04:42:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOMN-0002c1-JY; Thu, 27 Oct 2011 04:42:59 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIlfN-0005Wj-7X
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 11:24:01 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1319567034!36637423!1
X-Originating-IP: [202.81.31.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15350 invoked from network); 25 Oct 2011 18:23:57 -0000
Received: from e23smtp04.au.ibm.com (HELO e23smtp04.au.ibm.com) (202.81.31.146)
	by server-11.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 25 Oct 2011 18:23:57 -0000
Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [202.81.31.245])
	by e23smtp04.au.ibm.com (8.14.4/8.13.1) with ESMTP id p9PIGsq6030270
	for <xen-devel@lists.xensource.com>; Wed, 26 Oct 2011 05:16:54 +1100
Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139])
	by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9PINj4q2629778
	for <xen-devel@lists.xensource.com>; Wed, 26 Oct 2011 05:23:45 +1100
Received: from d23av04.au.ibm.com (loopback [127.0.0.1])
	by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9PINhGq031618
	for <xen-devel@lists.xensource.com>; Wed, 26 Oct 2011 05:23:45 +1100
Received: from oc5400248562.ibm.com ([9.79.194.67])
	by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9PINa9p031578; Wed, 26 Oct 2011 05:23:37 +1100
Message-ID: <4EA6FEC2.1060209@linux.vnet.ibm.com>
Date: Tue, 25 Oct 2011 23:54:02 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>, Avi Kivity <avi@redhat.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
	<4EA53A7D.300@redhat.com>
	<20111024122734.GA10634@linux.vnet.ibm.com>
	<4EA56385.9040302@redhat.com>
	<20111024135032.GB10634@linux.vnet.ibm.com>
In-Reply-To: <20111024135032.GB10634@linux.vnet.ibm.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:11 -0700
Cc: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>, KVM <kvm@vger.kernel.org>,
	Gleb Natapov <gleb@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>, LKML <linux-kernel@vger.kernel.org>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>, x86@kernel.org,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>,
	Xen <xen-devel@lists.xensource.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Yinghai Lu <yinghai@kernel.org>,
	Greg Kroah-Hartman <gregkh@suse.de>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/24/2011 07:20 PM, Srivatsa Vaddagiri wrote:
> * Avi Kivity<avi@redhat.com>  [2011-10-24 15:09:25]:
>
>>> I guess with that change, we can also dropthe need for other hypercall
>>> introduced in this patch (kvm_pv_kick_cpu_op()). Essentially a vcpu sleeping
>>> because of HLT instruction can be woken up by a IPI issued by vcpu releasing a
>>> lock.
>>
>> Not if interrupts are disabled.
>
> Hmm yes ..so we need a kick hypercall then.
>

So then do also you foresee the need for directed yield at some point, 
to address LHP? provided we have good improvements to prove.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:44:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04:44:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJONT-0002zp-AT; Thu, 27 Oct 2011 04:44:07 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RImTg-00045Q-6p
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:16:00 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-15.tower-174.messagelabs.com!1319570155!30304722!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28579 invoked from network); 25 Oct 2011 19:15:56 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-15.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 25 Oct 2011 19:15:56 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:6cb6:29ff:fef9:538a])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 44566993C;
	Tue, 25 Oct 2011 12:15:54 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 0A2F920187;
	Tue, 25 Oct 2011 11:30:22 -0700 (PDT)
Message-ID: <4EA7003D.8050506@goop.org>
Date: Tue, 25 Oct 2011 11:30:21 -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: Avi Kivity <avi@redhat.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190700.16364.7548.sendpatchset@oc5400248562.ibm.com>
	<4EA53AB2.9050805@redhat.com>
In-Reply-To: <4EA53AB2.9050805@redhat.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:09 -0700
Cc: Greg Kroah-Hartman <gregkh@suse.de>, Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, KVM <kvm@vger.kernel.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>, LKML <linux-kernel@vger.kernel.org>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	"x86@kernel.org" <x86@kernel.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>, Ingo Molnar <mingo@redhat.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	"H. Peter Anvin" <hpa@zytor.com>, Sedat Dilek <sedat.dilek@gmail.com>,
	Thomas Gleixner <tglx@linutronix.de>, Yinghai Lu <yinghai@kernel.org>,
	Xen <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 4/5] kvm guest : Added configuration
 support to enable debug information for KVM 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

On 10/24/2011 03:15 AM, Avi Kivity wrote:
> On 10/23/2011 09:07 PM, Raghavendra K T wrote:
>> Added configuration support to enable debug information
>> for KVM Guests in debugfs
>>     
>> Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
>> Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
>> Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
>> ---
>> diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
>> index 1f03f82..ed34269 100644
>> --- a/arch/x86/Kconfig
>> +++ b/arch/x86/Kconfig
>> @@ -562,6 +562,15 @@ config KVM_GUEST
>>  	  This option enables various optimizations for running under the KVM
>>  	  hypervisor.
>>  
>> +config KVM_DEBUG_FS
>> +	bool "Enable debug information for KVM Guests in debugfs"
>> +	depends on KVM_GUEST
>> +	default n
>> +	---help---
>> +	  This option enables collection of various statistics for KVM guest.
>> +   	  Statistics are displayed in debugfs filesystem. Enabling this option
>> +	  may incur significant overhead.
>> +
>>  source "arch/x86/lguest/Kconfig"
>>  
>>
> This might be better implemented through tracepoints, which an be
> enabled dynamically.

Tracepoints use spinlocks, so that could get awkward.

    J


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:45:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04:45:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOOl-0003My-C2; Thu, 27 Oct 2011 04:45:27 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RImYV-0004dK-Gs
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 12:21:00 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-4.tower-27.messagelabs.com!1319570430!45942894!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6731 invoked from network); 25 Oct 2011 19:20:32 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-4.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 25 Oct 2011 19:20:32 -0000
Received: from saboo.goop.org (unknown
	[IPv6:2001:470:1f05:899:6cb6:29ff:fef9:538a])
	(Authenticated sender: smtp-saboo)
	by claw.goop.org (Postfix) with ESMTPSA id 372F4994B;
	Tue, 25 Oct 2011 12:20:53 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 31C5920BF8;
	Tue, 25 Oct 2011 11:34:19 -0700 (PDT)
Message-ID: <4EA7012B.5040808@goop.org>
Date: Tue, 25 Oct 2011 11:34:19 -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: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
In-Reply-To: <20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:10 -0700
Cc: "x86@kernel.org" <x86@kernel.org>, Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, KVM <kvm@vger.kernel.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>, Greg Kroah-Hartman <gregkh@suse.de>,
	LKML <linux-kernel@vger.kernel.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>, Ingo Molnar <mingo@redhat.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Avi Kivity <avi@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>, Xen <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 5/5] kvm guest : pv-ticketlocks
 support for linux guests running on KVM hypervisor
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/23/2011 12:07 PM, Raghavendra K T wrote:
> This patch extends Linux guests running on KVM hypervisor to support
> pv-ticketlocks. Very early during bootup, paravirtualied KVM guest detects if 
> the hypervisor has required feature (KVM_FEATURE_WAIT_FOR_KICK) to support 
> pv-ticketlocks. If so, support for pv-ticketlocks is registered via pv_lock_ops.
>
> Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
> Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
> Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
> ---
> diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h
> index 2874c19..c7f34b7 100644
> --- a/arch/x86/include/asm/kvm_para.h
> +++ b/arch/x86/include/asm/kvm_para.h
> @@ -195,10 +195,18 @@ void kvm_async_pf_task_wait(u32 token);
>  void kvm_async_pf_task_wake(u32 token);
>  u32 kvm_read_and_reset_pf_reason(void);
>  extern void kvm_disable_steal_time(void);
> -#else
> +
> +#ifdef CONFIG_PARAVIRT_SPINLOCKS
> +void __init kvm_guest_early_init(void);
> +#else /* CONFIG_PARAVIRT_SPINLOCKS */
> +#define kvm_guest_early_init() do { } while (0)
> +#endif /* CONFIG_PARAVIRT_SPINLOCKS */
> +
> +#else /* CONFIG_KVM_GUEST */
>  #define kvm_guest_init() do { } while (0)
>  #define kvm_async_pf_task_wait(T) do {} while(0)
>  #define kvm_async_pf_task_wake(T) do {} while(0)
> +#define kvm_guest_early_init() do { } while (0)
>  static inline u32 kvm_read_and_reset_pf_reason(void)
>  {
>  	return 0;
> diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
> index 3bb0850..fb25bca 100644
> --- a/arch/x86/kernel/head32.c
> +++ b/arch/x86/kernel/head32.c
> @@ -9,6 +9,7 @@
>  #include <linux/start_kernel.h>
>  #include <linux/mm.h>
>  #include <linux/memblock.h>
> +#include <linux/kvm_para.h>
>  
>  #include <asm/setup.h>
>  #include <asm/sections.h>
> @@ -59,6 +60,8 @@ void __init i386_start_kernel(void)
>  		break;
>  	}
>  
> +	 kvm_guest_early_init();
> +
>  	/*
>  	 * At this point everything still needed from the boot loader
>  	 * or BIOS or kernel text should be early reserved or marked not
> diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
> index 5655c22..cabf8ec 100644
> --- a/arch/x86/kernel/head64.c
> +++ b/arch/x86/kernel/head64.c
> @@ -13,6 +13,7 @@
>  #include <linux/start_kernel.h>
>  #include <linux/io.h>
>  #include <linux/memblock.h>
> +#include <linux/kvm_para.h>
>  
>  #include <asm/processor.h>
>  #include <asm/proto.h>
> @@ -115,6 +116,8 @@ void __init x86_64_start_reservations(char *real_mode_data)
>  
>  	reserve_ebda_region();
>  
> +	kvm_guest_early_init();
> +
>  	/*
>  	 * At this point everything still needed from the boot loader
>  	 * or BIOS or kernel text should be early reserved or marked not
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index a9c2116..f4f341f 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -39,6 +39,16 @@
>  #include <asm/desc.h>
>  #include <asm/tlbflush.h>
>  
> +#ifdef CONFIG_PARAVIRT_SPINLOCKS
> +
> +#ifdef CONFIG_KVM_DEBUG_FS
> +
> +#include <linux/debugfs.h>
> +
> +#endif /* CONFIG_KVM_DEBUG_FS */
> +
> +#endif /* CONFIG_PARAVIRT_SPINLOCKS */
> +
>  #define MMU_QUEUE_SIZE 1024
>  
>  static int kvmapf = 1;
> @@ -627,3 +637,240 @@ static __init int activate_jump_labels(void)
>  	return 0;
>  }
>  arch_initcall(activate_jump_labels);
> +
> +#ifdef CONFIG_PARAVIRT_SPINLOCKS
> +
> +#ifdef CONFIG_KVM_DEBUG_FS
> +
> +static struct kvm_spinlock_stats
> +{
> +	u32 taken_slow;
> +	u32 taken_slow_pickup;
> +
> +	u32 released_slow;
> +	u32 released_slow_kicked;
> +
> +#define HISTO_BUCKETS	30
> +	u32 histo_spin_blocked[HISTO_BUCKETS+1];
> +
> +	u64 time_blocked;
> +} spinlock_stats;
> +
> +static u8 zero_stats;
> +
> +static inline void check_zero(void)
> +{
> +	if (unlikely(zero_stats)) {
> +		memset(&spinlock_stats, 0, sizeof(spinlock_stats));
> +		zero_stats = 0;
> +	}
> +}
> +
> +#define ADD_STATS(elem, val)			\
> +	do { check_zero(); spinlock_stats.elem += (val); } while (0)
> +
> +static inline u64 spin_time_start(void)
> +{
> +	return sched_clock();
> +}
> +
> +static void __spin_time_accum(u64 delta, u32 *array)
> +{
> +	unsigned index = ilog2(delta);
> +
> +	check_zero();
> +
> +	if (index < HISTO_BUCKETS)
> +		array[index]++;
> +	else
> +		array[HISTO_BUCKETS]++;
> +}
> +
> +static inline void spin_time_accum_blocked(u64 start)
> +{
> +	u32 delta = sched_clock() - start;
> +
> +	__spin_time_accum(delta, spinlock_stats.histo_spin_blocked);
> +	spinlock_stats.time_blocked += delta;
> +}
> +
> +static struct dentry *d_spin_debug;
> +static struct dentry *d_kvm_debug;
> +
> +struct dentry *kvm_init_debugfs(void)
> +{
> +	d_kvm_debug = debugfs_create_dir("kvm", NULL);
> +	if (!d_kvm_debug)
> +		printk(KERN_WARNING "Could not create 'kvm' debugfs directory\n");
> +
> +	return d_kvm_debug;
> +}
> +
> +static int __init kvm_spinlock_debugfs(void)
> +{
> +	struct dentry *d_kvm = kvm_init_debugfs();
> +
> +	if (d_kvm == NULL)
> +		return -ENOMEM;
> +
> +	d_spin_debug = debugfs_create_dir("spinlocks", d_kvm);
> +
> +	debugfs_create_u8("zero_stats", 0644, d_spin_debug, &zero_stats);
> +
> +	debugfs_create_u32("taken_slow", 0444, d_spin_debug,
> +			   &spinlock_stats.taken_slow);
> +	debugfs_create_u32("taken_slow_pickup", 0444, d_spin_debug,
> +			   &spinlock_stats.taken_slow_pickup);
> +
> +	debugfs_create_u32("released_slow", 0444, d_spin_debug,
> +			   &spinlock_stats.released_slow);
> +	debugfs_create_u32("released_slow_kicked", 0444, d_spin_debug,
> +			   &spinlock_stats.released_slow_kicked);
> +
> +	debugfs_create_u64("time_blocked", 0444, d_spin_debug,
> +			   &spinlock_stats.time_blocked);
> +
> +	debugfs_create_u32_array("histo_blocked", 0444, d_spin_debug,
> +		     spinlock_stats.histo_spin_blocked, HISTO_BUCKETS + 1);
> +
> +	return 0;
> +}
> +fs_initcall(kvm_spinlock_debugfs);
> +#else  /* !CONFIG_KVM_DEBUG_FS */
> +#define TIMEOUT			(1 << 10)
> +#define ADD_STATS(elem, val)	do { (void)(val); } while (0)
> +
> +static inline u64 spin_time_start(void)
> +{
> +	return 0;
> +}
> +
> +static inline void spin_time_accum_blocked(u64 start)
> +{
> +}
> +#endif  /* CONFIG_KVM_DEBUG_FS */
> +
> +struct kvm_lock_waiting {
> +	struct arch_spinlock *lock;
> +	__ticket_t want;
> +};
> +
> +/* cpus 'waiting' on a spinlock to become available */
> +static cpumask_t waiting_cpus;
> +
> +/* Track spinlock on which a cpu is waiting */
> +static DEFINE_PER_CPU(struct kvm_lock_waiting, lock_waiting);
> +
> +static inline void kvm_wait_for_kick(void)
> +{
> +	kvm_hypercall0(KVM_HC_WAIT_FOR_KICK);
> +}
> +
> +static void kvm_lock_spinning(struct arch_spinlock *lock, __ticket_t want)
> +{
> +	struct kvm_lock_waiting *w = &__get_cpu_var(lock_waiting);
> +	int cpu = smp_processor_id();
> +	u64 start;
> +	unsigned long flags;
> +
> +	start = spin_time_start();
> +
> +	/*
> +	 * Make sure an interrupt handler can't upset things in a
> +	 * partially setup state.
> +	 */
> +	local_irq_save(flags);
> +
> +	/*
> +	 * The ordering protocol on this is that the "lock" pointer
> +	 * may only be set non-NULL if the "want" ticket is correct.
> +	 * If we're updating "want", we must first clear "lock".
> +	 */
> +	w->lock = NULL;
> +	smp_wmb();
> +	w->want = want;
> +	smp_wmb();
> +	w->lock = lock;
> +
> +	ADD_STATS(taken_slow, 1);
> +
> +	/*
> +	 * This uses set_bit, which is atomic but we should not rely on its
> +	 * reordering gurantees. So barrier is needed after this call.
> +	 */
> +	cpumask_set_cpu(cpu, &waiting_cpus);
> +
> +	barrier();
> +
> +	/*
> +	 * Mark entry to slowpath before doing the pickup test to make
> +	 * sure we don't deadlock with an unlocker.
> +	 */
> +	__ticket_enter_slowpath(lock);
> +
> +	/*
> +	 * check again make sure it didn't become free while
> +	 * we weren't looking.
> +	 */
> +	if (ACCESS_ONCE(lock->tickets.head) == want) {
> +		ADD_STATS(taken_slow_pickup, 1);
> +		goto out;
> +	}
> +
> +	/* Allow interrupts while blocked */
> +	local_irq_restore(flags);
> +
> +	kvm_wait_for_kick();
> +
> +	local_irq_save(flags);
> +out:
> +	cpumask_clear_cpu(cpu, &waiting_cpus);
> +	w->lock = NULL;
> +	local_irq_restore(flags);
> +	spin_time_accum_blocked(start);
> +}
> +PV_CALLEE_SAVE_REGS_THUNK(kvm_lock_spinning);
> +
> +/* Kick a cpu */
> +static inline void kvm_kick_cpu(int cpu)
> +{
> +	kvm_hypercall1(KVM_HC_KICK_CPU, cpu);
> +}
> +
> +/* Kick vcpu waiting on @lock->head to reach value @ticket */
> +static void kvm_unlock_kick(struct arch_spinlock *lock, __ticket_t ticket)
> +{
> +	int cpu;
> +
> +	ADD_STATS(released_slow, 1);
> +
> +	for_each_cpu(cpu, &waiting_cpus) {
> +		const struct kvm_lock_waiting *w = &per_cpu(lock_waiting, cpu);
> +		if (ACCESS_ONCE(w->lock) == lock &&
> +		    ACCESS_ONCE(w->want) == ticket) {
> +			ADD_STATS(released_slow_kicked, 1);
> +			kvm_kick_cpu(cpu);
> +			break;
> +		}
> +	}
> +}
> +
> +/*
> + * Setup pv_lock_ops to exploit KVM_FEATURE_WAIT_FOR_KICK if present.
> + * This needs to be setup really early in boot, before the first call to
> + * spinlock is issued!

Actually, it doesn't matter that much.  The in-memory format is the same
for regular and PV spinlocks, and the PV paths only come into play if
the "slowpath" flag is set in the lock, which it never will be by the
non-PV code.

In principle, you could defer initializing PV ticketlocks until some
arbitrarily late point if you notice that the system is oversubscribed
enough to require it.

The main constraint at present is that you need to update the
pv_lock_ops structure before pvops patching happens, or you won't see
any effect from making changes.

> + */
> +void __init kvm_guest_early_init(void)
> +{
> +	if (!kvm_para_available())
> +		return;
> +	/* Does host kernel support KVM_FEATURE_WAIT_FOR_KICK? */
> +	if (!kvm_para_has_feature(KVM_FEATURE_WAIT_FOR_KICK))
> +		return;
> +
> +	jump_label_inc(&paravirt_ticketlocks_enabled);
> +
> +	pv_lock_ops.lock_spinning = PV_CALLEE_SAVE(kvm_lock_spinning);
> +	pv_lock_ops.unlock_kick = kvm_unlock_kick;
> +}
> +#endif	/* CONFIG_PARAVIRT_SPINLOCKS */

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:49:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04:49:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOSd-0004T3-Fe; Thu, 27 Oct 2011 04:49:27 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIpaR-00074i-Ob
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 15:35:12 -0700
X-Env-Sender: jfehlig@suse.com
X-Msg-Ref: server-5.tower-174.messagelabs.com!1319582107!32980608!1
X-Originating-IP: [137.65.248.97]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11078 invoked from network); 25 Oct 2011 22:35:08 -0000
Received: from novprvoes0314.provo.novell.com (HELO mail.novell.com)
	(137.65.248.97) by server-5.tower-174.messagelabs.com with SMTP;
	25 Oct 2011 22:35:08 -0000
Received: from [164.99.195.4] ([::ffff:164.99.195.4])
	by mail.novell.com with ESMTP; Tue, 25 Oct 2011 16:34:55 -0600
Message-ID: <4EA7396D.30103@suse.com>
Date: Tue, 25 Oct 2011 16:34:21 -0600
From: Jim Fehlig <jfehlig@suse.com>
User-Agent: Thunderbird 2.0.0.24 (X11/20100302)
MIME-Version: 1.0
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: multipart/mixed; boundary="------------060308070606000002060506"
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:11 -0700
Subject: [Xen-devel] Prevent vif-bridge from adding user-created tap
	interfaces to a bridge
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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.
--------------060308070606000002060506
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

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"

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?

Thanks!
Jim


--------------060308070606000002060506
Content-Type: text/x-patch;
 name="vif-bridge.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="vif-bridge.patch"

# HG changeset patch
# User Jim Fehlig <jfehlig@novell.com>
# Date 1319581952 21600
# Node ID 74da2a3a1db1476d627f42e4a99e9e720cc6774d
# Parent  6c583d35d76dda2236c81d9437ff9d57ab02c006
Prevent vif-bridge from adding user-created tap interfaces to a bridge

Exit vif-bridge script if there is no device info in xenstore, preventing
it from adding user-created taps to bridges.

    Signed-off-by: Jim Fehlig <jfehlig@suse.com>

diff -r 6c583d35d76d -r 74da2a3a1db1 tools/hotplug/Linux/vif-bridge
--- a/tools/hotplug/Linux/vif-bridge	Thu Oct 20 15:36:01 2011 +0100
+++ b/tools/hotplug/Linux/vif-bridge	Tue Oct 25 16:32:32 2011 -0600
@@ -31,6 +31,13 @@
 
 dir=$(dirname "$0")
 . "$dir/vif-common.sh"
+
+domu=$(xenstore_read_default "$XENBUS_PATH/domain" "")
+if [ -z "$domu" ]
+then
+    log debug "No device details in $XENBUS_PATH, exiting."
+    exit 0
+fi
 
 bridge=${bridge:-}
 bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")

--------------060308070606000002060506
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

--------------060308070606000002060506--


From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:50:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04: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 1RJOTh-0004qJ-8X; Thu, 27 Oct 2011 04:50:33 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RIrz0-0003F7-7F
	for xen-devel@lists.xensource.com; Tue, 25 Oct 2011 18:08:47 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319591317!754321!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 634 invoked from network); 26 Oct 2011 01:08:38 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-7.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 01:08:38 -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 719459BA2;
	Tue, 25 Oct 2011 18:08:35 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id CD0EE20D83;
	Tue, 25 Oct 2011 11:35:39 -0700 (PDT)
Message-ID: <4EA7017B.5000903@goop.org>
Date: Tue, 25 Oct 2011 11:35:39 -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: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
In-Reply-To: <20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:10 -0700
Cc: "x86@kernel.org" <x86@kernel.org>, Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, KVM <kvm@vger.kernel.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>, Greg Kroah-Hartman <gregkh@suse.de>,
	LKML <linux-kernel@vger.kernel.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Marcelo Tosatti <mtosatti@redhat.com>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>, Ingo Molnar <mingo@redhat.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Avi Kivity <avi@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>, Xen <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 5/5] kvm guest : pv-ticketlocks
 support for linux guests running on KVM hypervisor
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/23/2011 12:07 PM, Raghavendra K T wrote:
> This patch extends Linux guests running on KVM hypervisor to support
> pv-ticketlocks. Very early during bootup, paravirtualied KVM guest detects if 
> the hypervisor has required feature (KVM_FEATURE_WAIT_FOR_KICK) to support 
> pv-ticketlocks. If so, support for pv-ticketlocks is registered via pv_lock_ops.
>
> Signed-off-by: Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
> Signed-off-by: Suzuki Poulose <suzuki@in.ibm.com>
> Signed-off-by: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>
> ---
> diff --git a/arch/x86/include/asm/kvm_para.h b/arch/x86/include/asm/kvm_para.h
> index 2874c19..c7f34b7 100644
> --- a/arch/x86/include/asm/kvm_para.h
> +++ b/arch/x86/include/asm/kvm_para.h
> @@ -195,10 +195,18 @@ void kvm_async_pf_task_wait(u32 token);
>  void kvm_async_pf_task_wake(u32 token);
>  u32 kvm_read_and_reset_pf_reason(void);
>  extern void kvm_disable_steal_time(void);
> -#else
> +
> +#ifdef CONFIG_PARAVIRT_SPINLOCKS
> +void __init kvm_guest_early_init(void);
> +#else /* CONFIG_PARAVIRT_SPINLOCKS */
> +#define kvm_guest_early_init() do { } while (0)
> +#endif /* CONFIG_PARAVIRT_SPINLOCKS */
> +
> +#else /* CONFIG_KVM_GUEST */
>  #define kvm_guest_init() do { } while (0)
>  #define kvm_async_pf_task_wait(T) do {} while(0)
>  #define kvm_async_pf_task_wake(T) do {} while(0)
> +#define kvm_guest_early_init() do { } while (0)
>  static inline u32 kvm_read_and_reset_pf_reason(void)
>  {
>  	return 0;
> diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
> index 3bb0850..fb25bca 100644
> --- a/arch/x86/kernel/head32.c
> +++ b/arch/x86/kernel/head32.c
> @@ -9,6 +9,7 @@
>  #include <linux/start_kernel.h>
>  #include <linux/mm.h>
>  #include <linux/memblock.h>
> +#include <linux/kvm_para.h>
>  
>  #include <asm/setup.h>
>  #include <asm/sections.h>
> @@ -59,6 +60,8 @@ void __init i386_start_kernel(void)
>  		break;
>  	}
>  
> +	 kvm_guest_early_init();
> +
>  	/*
>  	 * At this point everything still needed from the boot loader
>  	 * or BIOS or kernel text should be early reserved or marked not
> diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
> index 5655c22..cabf8ec 100644
> --- a/arch/x86/kernel/head64.c
> +++ b/arch/x86/kernel/head64.c
> @@ -13,6 +13,7 @@
>  #include <linux/start_kernel.h>
>  #include <linux/io.h>
>  #include <linux/memblock.h>
> +#include <linux/kvm_para.h>
>  
>  #include <asm/processor.h>
>  #include <asm/proto.h>
> @@ -115,6 +116,8 @@ void __init x86_64_start_reservations(char *real_mode_data)
>  
>  	reserve_ebda_region();
>  
> +	kvm_guest_early_init();
> +
>  	/*
>  	 * At this point everything still needed from the boot loader
>  	 * or BIOS or kernel text should be early reserved or marked not
> diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c
> index a9c2116..f4f341f 100644
> --- a/arch/x86/kernel/kvm.c
> +++ b/arch/x86/kernel/kvm.c
> @@ -39,6 +39,16 @@
>  #include <asm/desc.h>
>  #include <asm/tlbflush.h>
>  
> +#ifdef CONFIG_PARAVIRT_SPINLOCKS
> +
> +#ifdef CONFIG_KVM_DEBUG_FS
> +
> +#include <linux/debugfs.h>
> +
> +#endif /* CONFIG_KVM_DEBUG_FS */
> +
> +#endif /* CONFIG_PARAVIRT_SPINLOCKS */

This is a big mess.  Is there any problem with including linux/debugfs.h
unconditionally?  Or at least using "#if
defined(CONFIG_PARAVIRT_SPINLOCKS) && defined(CONFIG_KVM_DEBUG_FS)"?

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:52:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04:52:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOVQ-0005EU-4B; Thu, 27 Oct 2011 04:52:20 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RIzpp-0001Cq-Gl
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 02:31:49 -0700
X-Env-Sender: duanshuidao@hotmail.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319621488!52558540!1
X-Originating-IP: [65.55.34.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26104 invoked from network); 26 Oct 2011 09:31:28 -0000
Received: from col0-omc2-s15.col0.hotmail.com (HELO
	col0-omc2-s15.col0.hotmail.com) (65.55.34.89)
	by server-15.tower-27.messagelabs.com with SMTP;
	26 Oct 2011 09:31:28 -0000
Received: from COL115-W43 ([65.55.34.73]) by col0-omc2-s15.col0.hotmail.com
	with Microsoft SMTPSVC(6.0.3790.4675); 
	Wed, 26 Oct 2011 02:31:39 -0700
Message-ID: <COL115-W437894C2114C4FA3315CAFBCED0@phx.gbl>
Content-Type: multipart/mixed;
	boundary="_8264087d-b4df-48d5-beb3-b8e20d0d81aa_"
X-Originating-IP: [59.151.98.134]
From: hu jun <duanshuidao@hotmail.com>
To: <xen-devel@lists.xensource.com>
Date: Wed, 26 Oct 2011 09:31:38 +0000
Importance: Normal
MIME-Version: 1.0
X-OriginalArrivalTime: 26 Oct 2011 09:31:39.0326 (UTC)
	FILETIME=[104C0DE0:01CC93C2]
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:11 -0700
Subject: [Xen-devel] [help]domU linux network breakdown but dumpcore recover
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--_8264087d-b4df-48d5-beb3-b8e20d0d81aa_
Content-Type: multipart/alternative;
	boundary="_330d959d-187b-49be-80b1-e54efb4a4670_"

--_330d959d-187b-49be-80b1-e54efb4a4670_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


Hi All:


xen 3.3 =20
dom0 linux :Novell  SLES11=20


domU linux(SLES 10 SP1)have 2 ethernet card=2C config as follows=3B

ethernet card A config a small network ip for conmunnication with dom0 =2C
ethernet card B config a big network ip for business software.
=20
small network always is fine=3B but big network in domU can't send packets =
=2Cbut can receive.
 =20
the domU run 167 days normally before above network trouble=3B iptables on =
domU had been disabled.
I don't know how to do =3B so I prepared to dump domU's kernel core to anal=
yse the question.
 =20
after I finished the command:xm dump-core 4 /data/2011-1020-1659-IED_143_17=
0_sles10sp1.4.core  =3B=20
I found the douU became to be paused.
then  I executed :xm unpause 4  =3B
But I found the big network in domU  has recovered normally.
 =20
Is it stranger? =20


the attachement has xen_bugtool info. =20


Thank you very much for your help.




 		 	   		  =

--_330d959d-187b-49be-80b1-e54efb4a4670_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html>
<head>
<style><!--
.hmmessage P
{
margin:0px=3B
padding:0px
}
body.hmmessage
{
font-size: 10pt=3B
font-family:Tahoma
}
--></style>
</head>
<body class=3D'hmmessage'><div dir=3D'ltr'>
Hi All:<BR><br><BR>xen 3.3 &nbsp=3B<BR>dom0 linux :Novell  SLES11&nbsp=3B<B=
R><br><BR>domU linux(SLES 10 SP1)have 2 ethernet card=2C config as follows=
=3B<br><BR>ethernet card A config a small network ip for conmunnication wit=
h dom0 =2C<br>ethernet card B config a big network ip for business software=
.<br> <br>small network always is fine=3B but big network in domU can't sen=
d packets =2Cbut can receive.<br>  <br>the domU run 167 days normally befor=
e above network trouble=3B iptables on domU had been disabled.<br>I don't k=
now how to do =3B so I prepared to dump domU's kernel core to analyse the q=
uestion.<br>  <br>after I finished the command:xm dump-core 4 /data/2011-10=
20-1659-IED_143_170_sles10sp1.4.core  =3B <br>I found the douU became to be=
 paused.<br>then  I executed :xm unpause 4  =3B<br>But I found the big netw=
ork in domU&nbsp=3B has recovered normally.<br>  <br>Is it stranger? &nbsp=
=3B<BR><br><BR>the attachement has xen_bugtool info. &nbsp=3B<BR><br><BR>Th=
ank you very much for your help.<BR><br><BR><br><BR> 		 	   		  </div></bod=
y>
</html>=

--_330d959d-187b-49be-80b1-e54efb4a4670_--

--_8264087d-b4df-48d5-beb3-b8e20d0d81aa_
Content-Type: application/bzip2
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="xen_bugtool.tar.bz2"

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
C92EuOEswLfhLMJZgXHCWZRcche7CWYSzAtMJZiLllF1yizKLbEXLKLMot2QrkHBRfy89zlc2+fG
q45PVbvxjrPOcKqqqevPc5XNvcarjk7Vu+Y6zznAonrz3OVzb3Gq45O1bvmOs85wKPwKqqq+wlU9
wjSkVH1qK9wqr6BGtKSGxGLUR5dWYzGYzGZEfwHIiIiIjO7kRERERd3QYIxEE7rmIgigju7BQRBF
Hd0RBRBEd3UQQRFEHORERERF3dERERERd3RERERETuuREREREc5EREREXd0RERERGd3IiIiIi7ui
IiIiIjnIiIgjEc4RiIgjO7lBBGIwd3YiMkRGd25JGIxJTu5ERERETuuRERERE7rkRERERHORERER
F3dERERERndyIiIiIndciIiIiM7uEYiCMRzkFJGIgu7sRGTERHLpERQRBcuSRiMQFzkRERERO65E
RERERzkRERERHORERERE7rkRERERd3REREREXd0RERERE7rkZMREQXd0RGIiCLu6IpMQUu65GMEE
UXddiMSRFHOERiSIod1yIiIiIndciIiIiJ3XIiIiIid1yIiIiIjnIiIiIiOciIiIiHduREREQRd3
YiIKSIuciIMERnduEEUkY3dxBFJGMXdwYyRjEc6RRJiIid1yIiIiIndciIiIiI5yIiIiIndciIiI
iJ3XIiIiIiOciIiIiJ3XIgxERE7rhiCKCJ3cpIjEYC7uikxEZJ3XIxkxBRd10YjEkRO6uQREREXd
0REREREc5ERERETuuRERERGd3IiIiIid1yIiIiIjnIiIiIjO7kRERERHOREREEY5yIiCIjHOREEU
kZ3XIyREYi5wgiKTEZ3cxJiIiI5yIiIiIndciIiIiJ3XIiIiIid1yIiIiIndciIiIiJ3XIiIiIiO
ciIiIiJ3XIiIiIid1wwRiIh3XIigiIJ3V0jEYkid1yiAwUQd3YxARGLu6IiIiIiOciIiIiLu6IiI
iIiOciIiIiI5yIiIiIndciIiIiI5yIiIiCLu6KAwREXd2MEEUkXORgIikp3cjJEX/9222q1v4Oq/
jNVYzIV+9RXvXMjiRhHxI+BHQj5SPyEYR0I/KR3kcSNhAoQEIHgQP7Xvyta1rWta1rW0pSlKUpSl
KUpSlKUpSlKUpSlKUpSlKUpSlKUpSlKUo1rWta1v5/L+f/qAISG/73s9+gkgEIHuUqDw27KlQfFR
oqkj9FSoN7YFVW55lLqUvM95oFVXrKWFLgUtilVe3hsKXaUqrfqUuJS9KivKpUH7qivqqVB3EVDn
UqD9gj11Kg1KX+KlQe2pUGoSR41Kg1I3VKg3kVDCloRoeHaZUD/hRXbm3u2VVHgbzxNRks/iLMmj
JWCzBorQ0YMFmjBowWaLMkMkNDRDRksyYFmjJgyWZGSzJg0YrZGTZLJdMJcoG6u7GG5btwAADvyE
B9+gX1+0E/fhgQg3d00lygZq7sYblu3AAALpAIB9+gX1+0E/fhgQj9+/V8aMmizJo0ZMkLMmDBYs
wWYIWYEGi6a/ob/mFGMYzkqqrbbbbYI22222COZS3kff6SoSPocSl0EH4UBYIOn8v5/fnb04P0+F
RWT9xlasY7tPBwvH4d235Nd2aZpnTZZvd9jc9QoXdVQMPU7u94sFjM/rJePe3xYsZtzZhwC5uMMC
b927N9tvbgW0OvvdD+Icuy0UmRiyxZRiyMWVGMWVqWSzZZqWSy0s1KyjFiYWUwssWEYs114cee3H
dm6T8u5Yr/bL0ZmCtqhnI4nmbWaOKvurN5ZzqZ03jl7+qoUqnxmJExfZz09d3Zv5X2vr7SCSf4/V
6g83VVEZXgZd7LF3a4Fdjm8vt2vLkbLfK5rsmmpHerdMxOsalphbaWX5797h6nY9mJfEX9QP0ECy
Qlm1LNrLLSs1LNaWbS0UiooVFQRUAioPnXZrnPYt+v4dlrMysV91ivF9S0s3rq/yrCi+7aXFm9dW
1WFH94AADQIJQ5C69bBYN4HVnp2BBkJlsvxnfwbnYQhL598+h2VNnvtt32bAsmtvgOX7dhk49Njs
h0+8lma6ZjHLXdxzOdToWVLEYsViwxYLFhVixGCxLFiMWExYIxYCxYFiwmLCYsEpKEChKST583n1
c927+eZvXqnz7Lu+m4fz6lq2/aeV1h1dS1b+HveAi8aFi91aBk/dofQpZ+ks09mxm5nl0wpd5cfd
6HRh7oepT1+OYrZ0wvv0ZLuF4tO7BH5yzhwzOiOgWBYsFixBYsEstZWVbLLSypWW2WWsKiqRUKqo
qPqqKrG+pjd8xn0n3mcy/uIvOzOZOPF+qu7DWdh3ScV7mLEqruw1vm53Zm/SQJwee99fla1J+cJW
2CNo2yfu134pRSdDPe5bc4Tbwhr+8VbMhfPh7bcV98F9ZZaI0y/O46bzgUmGNeTbbM5qdEYiwpix
UxYMVCSFJQgSkpISTj5b+L5+b+Yp93OfO3e/b+0vCSguVYrusr9lbY3tivq3ruspZW2NWrf3ve94
AgcgJd38MKpVVd2OEfdd33c6O75mZmZkhdscJC2/PhgeSGffRk5tNXauczpvclyqkbk525hIy3fZ
PpX0jEYsRhYVYWExYLCxJiwYsRhYpWFgrFipllUsrLLZZSy2WWpZW1D1CD8PvyWHfvsuur9ebdHN
78YotZrcNnKrj29vGtw2cr94AeA75C6EVp98hd2Lrbo8s0HmQhzSVAyMIQLf362BHmEhEmOg2TJb
rVlthZInC3zfoP223Nlyr313Vzkm13JaSd3eO8k+Up9USqLBixTFiWLFLFiSYWKmFgrFhYWIYsUx
YqsWDwGfvu6b++6tPZq/d+BnZGxDQuE71jaGJ5KVjHy12FQznjpWM/eHve9PDcoeT+obnDm+9CzD
Mrsyfv18/AeRJzyVj172d3OyC/d693ba3vPdfvWHSwswnnjKH8nJP5EYliwxYCxYjCwYsCVlSy1L
LUstSytSsrFQIqKKioUqoqFU9j5zfLdzf3etnPy/LDdLOzp06dSWk5iXJdSWn8Pe8BQhSz8pe+Co
5Zvv8EzZe7w2dZ3v0aaWaAAWXv4jIk8Pe4Mtssl/dwjcyFjbaWmZNd7mp0LBWIxYVYWKMLCsWJYs
SGLETFgYsViwpiwrCxWLDFisWFxO3yp/d3H7R+BbT5VT0J2Sqr8j27XezLOMyb3jetTf0FQ53evd
bd5Vxxzcmlakne3EHMAp3GXp5LbP276EDyT2PDnfDyta6B1vP5t9ZbpXe+HsEy+Hjd2n0g6UMZiM
sTIwYWCMWJixExYBliMWIxGDLEYsIxYjFhWLCsWFiwJu2379i2/1CFdfL9gvv3QhWsW0kc7lePOW
gpqt453O8ectobcquzA8wbmVW5lUNysutyZuTGNTXDNzRcNcNyY8aN1wlSamjZcjuzMybu7LmBu7
oXd0LrIScBezDMzBDHoUwVQiJgiJu8qnHHCIicdyteOOERE3uUXjjjcMME5N7FeNOERO7lcNKcIi
bvK4aU4RE2m9i8ccIiJ3cq8ccIIid2nZi4ZxxgiJncq8ccInYYPcq8ccJ3cvHHCIiJ3dXDHjimlE
ROO5V444RETu6y27MJcl3RuDtbouuRaG3bsua1ZuZNyZuTGNmrNzC47MaazLw2SWZkgMVWkSaCFt
qXElIbC0tgzMVSbDLYJcSUliqpEiGhbbhmITSWZislJgdS0lDTNQjBtgxVZEVIkwLC2scVSUlJQ2
20EzKTAmRxVCUJRaRgVVQmhoFCkpZSpuyJEnAhgKqq9x1vrL3ut+poLevQ2uNncEpMDQ2Cq6GbbS
JNJRxJSWFNK7hb6vqD6991U4W63WWUaA0WyJODgYVRWG01CMtV1Zb9V5jKV7nut1lmO51lvW7zy3
W+ppFu3Pc6rtIx2wiTQ6HKtDTr1VCNakSI1qyJMC22hlyyJEiJRKKkpOJmY2631doLnnd1lu7msr
gro53LLK9QPeXd2qURZcnS3rPebLdbou51ust9XtJJqhmGMNthg0xqESIWFtqMmkTKY1CMlFIkSU
aLUI0UiSkRdzb1u9eW6y2Od211BzmtY8glae922RTWhOlwQ3Udy84RYjtDAcOEWtY3d3cCVOrPns
rJKDHHBgoQNK5XueGOrsySxu4O3aAKqulLndDd4IizAuj727MmziOfCbhRChfSZ2OXcrW2usZw4W
N4Y9g7Fk28yuvR2bwJrbg57kbwwUTApj3ZRd1cPHBmPvBQ5QG4rx4KGXMzDYvcqluUMR10XEuxoQ
6NnC81dV5pmi8DXage3yBqA3Nbd8E9OE5WJtp87FNBvMPG5yRrEFsN7Z3KxhQGbvtMNDDwgbqCUu
OQJuMZaGLGGzViHla18Hq5Y6jTVZ3dhOhXjdXmntF4Eu1A9vkDUBua274J6cJysTbT52KaDeYeNz
kjWILYb2zuVjCgM3faYaGHhA3UEpccgTcYy0MWMNmrEPK1r4PVyx1O87yZ3vecY/j3rCvr6VSt0K
KU0fTBZ4yQhs0IYLEIVg0ZMkIZIZMFmCFYGiyCxgg0ZMqyQwVgwNGjIyZaw1MwzNLxikyjk1DLGb
jszdAAgADXiD7fo335iI378QgXvr8wMzS8YpMjk1DbGbjszdAAgAHq8Qfb9G+/MRG/fiED1fTBkw
aMGCzRoyWZNFkMmCELNGTBgyWYNFlmRZkIIcFDQ4CgwkM/L9rWta1/9JIVBy3dhV/oR6nTIZg4uV
r2bW1la6aEn6t778Trek8o2SeZ5hDChhZrhknm3xVwJbOROLERDKB+/KzdLxhg3ES1qS5I6/WuNt
bktUzZWERJDPQwMpbpYbPEhHEJdz55m5mZ0gNHDhw7s6k7EYSwBiwWLEYsWLAYsKxYjCwLCwjFhW
LCmLETFiWLDFit3Hr00H8dWDNr9XffzZkWG+5TNHPa1t5czDmRFc6Lfdbzj2NFc6LfdY9+A97x2q
qqr+D2ipSgFvL8V3PzFXicTKSlxGB9+esgeeWsBbUhntwvovUMKA0jT75u27JDz6Zch6KUtLOW0g
WvfHxXnoH8iMpUkRWXMT7xoZ4ukRco7euYZqdSGUGwfvh5h99K+Ez0+WBlkUTEY3btXYuwjFYsRi
xMWIxYMWIxYqYWAxYYWCYsULFhWLFTCwGLDFisWHr/pu3S++/nV+fJ2j11pCD/mlx831WO9adatZ
fcd3ub6rHetOtWv8B73v54CV4e/Cqr11L9PnwyTuYNJbBpPVmUJS5T7ZhSfyCnYk6yd79blLdh+W
D4hJfU3i27DtiTqG7tMUPPmYGni2nljRwZSkYRUa5zbQ3K5a6RKfn53cvuZObPLtIqlynzHufNV6
VTSIk29z13f5Sn6KlFYljAwMVGLBWLEmLGpZallqWVLLSy1LLaWWpZaWVpZWWSy1ssrDd+9/L+y/
xNUHd/zL79n51iM9ROV1B11tauxupjHJqOTd85rHwoVVVT6Up+VmESn2pZPyxsPW/r6r2dJCzb4Z
E1EwZClJTNde/W7u74HhScjJL+Mg4MPRYyQ1nNyTFKZippzXTSjkpzP3XpNB3iAfHdzjpEoUsLZb
JXryvHQ627iNSlou7iZ/N54/FH4URQqKihiwTCxTFiMWJYsIxYVixWLCjFlVcdeXPprwbtWY589c
1ys4b25ddt8t+p5/KVrtsVkq0rxjYlyldevatM+l85efNe58oqlKV9UVX4Mbui4pco/nx+uP3lUr
Suyqw5vCsJUj5jHH6k6EhPDraTltgWk9WEev8e/4pxvjJ6oGYJgl75+1/j3mZnrws9LJ7KFlkL3H
r5+YxjGN0VuKX7PMSfTRuD4k+WtLlVcfc+775MXd+OU9xdVEpUnufMGIomrtfMzJrmJqyGji58N+
um2Z20uyyKyLGSxWbWWalZLNSylmyyss2qWbUs2pZbSypZiKikVKpFQP1+t/eTP5ePzHvuJrOe4Z
xerurLvtx/nrzNhpe688jXVvdnWaz3XnuNdNb39KpX5R5HZc+JUSp8mM4xjEyJFMpDLDPz7ufm/M
rW+BPVDfXv79fJ+LH0X4NERU/cWzKkHM++Xd5ckRSIyioj5zG7M1URWpckSVlD9Qt9npMU1KTykm
/Pe6aWA2P69frszM6Us9hRLJULqpJFTeMO5+7kzVMTcU3ze5rndyfa/VUDWbSzbbSy1LNSyWbUrL
TZU01LNpZpZVLJZeAoepfze/mM39mXVXm++Onsr+M4SxSGVT5d+rRRzXJZplCoJVc5yrRRzXJZp/
h4D1flKXBIptlz5r5jGMbrUbkSswYlKxQMxIZlqUbb+eeXEV4TwZClg2SNy8fefO7qjVIrneetyT
VblVXpJVSSF87v6tqq3q6q4r3fiek1oq5uUc1Go5di6QPKHllWfie7bkDrIlJyJT35vvjnDNM06J
dYyizMUYsjFkYsUs1LNSzKzVlks1LNpVKpFQFZ4n5PXe825NZmNev8yzPzeezveZz3fNua7dzHe5
73u3Ndu+/Cg/YKqqqv1Q8L+6SUpKKL9vz79V83xJthbIPn3zvt8mru/9IVVVVfsUKeHIV6Kfr7+3
vv3V51nt3fLlJDqYlGMVbXIz+e7jGMbodimfx7jIkV89vsmWoG4dkcy1fyck3Vc4sSUriRxdKvGW
MWskovD2+RI0yiSqbjcGMe7d39r9hSVURRKpEallpZqlmWWlZaWballqWWpZllbLNSxZUsKlEVFE
VEVKr3vfeRfe7xf3j8xu5jKzuexfqRd+qzt1WLaeCugoyant36r6XVZ7U3lN+THva536Csn7FCn6
qnExIuRgJfWeG/raW9CZZA6z33z6roHlu2s8zLckloPr33ZbeA6wpYLaiXTf1fXUifuO8riIiSkS
kjsrEd3r5fru9VWUP6n/5fg6Hhon6pc/q/iSUPDqFV73v3FJ3d9KlRDkXu8SjzyRdUZhJVd/Xeer
VWmMszllwccY7kuyyKzMjFlhZUZZtLNSy0stSzUs2lmqQqIqFVr8y72/j4xNe1f5nWcNYvnd5xve
Tqrt/kjF6Kudy3uwoi8FWly3uz8AAPcD9HWEGwvun23CaX4XcHCyffzdpseGmMYYpcKx8mZMIiok
SFrpU5zvGqTSWLSnzPfac5d3+4qlVVV0ZRURUiudx+X87nqR97TEGEESqc39+33HsYu72cnoq5Vo
RK853eGRKjctBPmfek0r27cSmJdSqw7zmt9zrt3f4r9USqEitSyqyy0stsrNTNaWZSKlKqVCjfO3
37+XnXz3xvuJz6zqt+l1qR0Vlmn1VzvYVleVb1F5Zp9Vcr1laALhS0/8/h7KfCiyd6cxXzuVevdi
vHcq9ndiudyq93PZmbvbmY9vK93K7pyu7yu6cruvZju8r17sV7uVTt17HO3sxc7lXu5V47lXuvd3
LndVXu5Vzrere69Ve7lXu5VyEdsJmGuQsedy3W636v1B9982uoBaq2Qy2Fy5J0Othht1WhElDZC5
7Zb6mgvL3Ot2y5ZbquoQLu7lle0Peu63W63W4u7uVu2Xdb6vqIt3xfGy1cuW63V9od4uFlu65brK
wXGyr6kT3Xlvq+oPvJX0dZZVDFVQcMoTQmNplqTCXDKShKilcLhbrLer6g96+2ur87lQctMtoRko
ycTMtMtoRopKTQ20tgZuqNhOhlpExJSVVGyUmkzDKRJSYRcUbwIcCFoqO6NCJOJXFG0mBgW2mGUJ
sG2GYq0SUiTAwLS2TDKRqiCVJSWSjIqo2ESYSpklJ0Othua9uW600Jdp3ctLLftX5iUDc2q22SkY
RbUiRJQwLbczKvBZW+r7Q+98ds53cFZb6u0Pe8LdbrfU0i3d53cNllbjbSUiRJhMy5VaWRW0lCcG
wqrDNrVaJEJoZC2uY2AdC2uVLaSzl5OFoThOe9f32vunbHe3PDw8773nX82jht55SqtnLp4Wlmyu
EpRiddkZqfb2ihsXnu93ng2zoY6bBwoQjG53UZ2NaKpa7zxwVMG68W88CAgI6q4c1Z7XRNZd6569
nRysYNRWqQO60c7M3u6hL6u3n2JRNWnt0TjuDcreBVDPXsWCIHArvIHtwPqiFwEdxbz3Z7lDdw0g
fFdQhW63EQliW7q1RW7yuE6rurMZvto0M5IRbiiiF8OqhNJep7iC3SFhxC5EteHDd4+dYwx2Dp7k
epobdvi+XcJtdl3DM2sYvegfawTvPMZFbFMzhQaa7jYNnRw1S9GnthcbiISxLd1aord5XCdV3VmM
320aGckItxRRC+HVQmkvU9xBbpCw4hciWvDhu8fOsYY7B09yPU0Nu3xfLuE2uy7hmbWMXvQPtYJ3
nmMitimZ2jvO83vFsXjTbXPXprH7eKpUuh46eMEMCGjZCGKzJWSGBDRZDRowZNCzBg0YNGjRUNEL
IaIWYMmDBgs0aIZMmCGjRosyLNEINDJDAyaLIQ0VZkiyxoYMllyWQkZGSZI6ZlYYkVdmAimy5P30
L3HX3335ekgn6/SEA/U0gTd4EJAzYAAbXawxIq7MBFNlybkAjQszM0jCEAIbNhAIA/V+R+/YlH36
AaUr6lSyTJJkhTw+ERERER/pZOcnP0nJyI7BVwM7boxYwt3PhqtcGuTGLOLvD9Pmvl++fZjF4l69
5Kp6FXKcIYkg1bYJQpS7neeK+EN8ZPKQTctwlLgiPiA98vrreDyniMFGcsJnvuvb8S08kLbTCzkz
5730r4DQnUjSX5vrUTVHYq5S/zm9rifhVflRVKSqhTUs2llpZqlmpZaWW0s22pZUs2lmpZUsyyqD
1DwHdlP60Lw/bp7No/xK13vrZ/klRDBVO6zctMbDuOZlIVoSO4lmUvw973vfwbXve7prnes81iTl
VjKyki12vXpMGJTM/JVe52SYGIblyrRPTH3zDVPQkqpp/AZDMN+/OmllsJ1gNn77O9nED1YerAK1
592rWWlqtKSVIXu/cTrplqpSJR03Zz5nW7KpmSyMWSYWRixiyRiyjFhMWUsWRhYmKKIqEKikVKqj
zvuX2Xj81rLXmJ9+dxe6Tfd23v8fN87ovbpnOyhWV6sa3rpby5zGd5iZlTPPqqUflUuPsqJV2e+e
8jzygfSlsnre/M2S0viS0jQwskzwQuWhm8Z+c59u76OTiXLSuoqveWMSmeFeFeofXsXVcnxJMYry
FoGyBZ9QFivcpwz939bdngASTzyIM4xl5zvTvgZOnOTwnhz9z1z17ir2GyyQhyUiTm66y5nRTrGI
shYshiyMWUwspiwMWFiwYWGLCsLKiktJSEpKQ7d/Wfp/PvzrvoO5/Wb3mfrzeezzzs3PPN57PPoQ
h/ASE/YfqnwoKLY/c9YrspSUy1iiGUMpP18/PLYeHBShcuVW4nOXmTNalUwlRFMMPvdfnl8K5OIi
M53JisyqNIq7W5+NckzStRV/Oa+SU0bntXRVd9zMmaJtaogy3x27XeaVqDcc7v2rk/VfoolVFRFS
iKmyzLNSypZaWVpWbSsoWLIYsoxZTCyMWVq69N3Bx/H9/K7apZ+9WalXVWOtUS1bTTXJ4cgtbDat
VbGxHok8OQWthtWqtj8Pe8B/QD3h79hvpJ1hLT89ffFdCyzwRgl8ti2wRzfnieHUnWeUtApgeb99
K+TiyG0PHd0llsp/AWG5fOV0A8KTqByIUsP39CQkkjxSXbWcmZJmFz9r9cxXiyyY2pxmW5IWUBb7
MkGy0+Z9315Wt4PPRZZSbeoSX9b9vnzMzP2Qkgm3L1m/37Sd2raiaVfsWE2thyWndYuLtwvedY3z
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
Lts7u7m8rOMlc46FYzjerdxpA4uvdea5zhOKJ3Jnb1cSTsbJu7mZsbuVx2Qnlki3bNazmqJXmxu3
l3yaZgO4klLtzuZfd3Zss5Su6rIIITLFJ2YexXdI9mVvNt5FN275tbvR5vS8mVrs90xtS5O7BmZu
12ZIazW6rtl5lNLMlG9WaSE45Jy5l4ukhe5uaY95zYCeiqnaXcazqo7Eyeb7HMmaTZib3d3dtRt7
uvdUuVkUkOEVZkCzMjcXLJZ7Eo07SLPbUzHM0cTWRyt0lRaXiyswkl7up8+j5Tp0zcqqzLeWnR2x
SlnsJqty+mcgeN53KCrlVlixjeYsS3bvOkDJJ3WiyRUpuXmSPCZnMbaxQrMrnVJ6hRJdVs7lmHt6
WQTMzaG5idPYrLkJ3b6sFbKruijs28s2kpu1XIms7tdVePU73ZHmPSSu7NhnVSm7m0ZzudMSvtwU
11993be9VRk/ZNSS+Z26utqdzjBu0mqrZKzLl5272LOkSl5t5KWOJ6lOWuqnUz0Obu5nTGSeyG9x
LFVWb0vLXd3PMfbt7VObuJudctZcvdSzlOhOWl3dK630R3qp8713i3tUxBPLm7Z5pKZvPNzUrjmc
2Zj3etX12VBXHuNm9jq0nVO7fVmLHjeXc3Tmdu3xLvNrUc3nrmqdiu9u7ewnd60nLK7lVbA4u7Jf
a817iqtkaW6TV8n27dC21Ad4nXqtEiXcho426cwistoKrkkjmd3cO071d3ON9CXoobvDMzpJUFHO
Kt3nTCTN7E0ahs6nDBslU+lqbjxYSTHurE6qqi7u7qFO32NG5nbtN492rrn3A23Do2akp2dxJI09
t291VGMWDc3FTxY5V1vViXdmkk3fYCcqqrVfSEth8ibNcpM3G6olQ1RbeVXTMGKEhre3puk2d1lQ
VkFvlzhfFMvTVVxyo+O/Vtx44/H833d78B+z/r6tODd9LPX+3bhtvz7fyteu96zXapUGxVB/Gor4
kcnDdUqD9VSoPxVKg0iN/NEd9RQOX/3iRqR1fdvqK1t5w3iNPllLw4vACM2I+Worl+8qg9Pu8d3+
vgEkeS8vs3Aqq8ewjPsUVhvpCDdfhfmfnzuqK4kewjtkfWI5FJPLnp2Aqq0MdwVVYCqr4ke8jCNu
vUjRpm8j30KhwKoNNPXUqDsI+4qEjtqIC0wRQctCNIj9iisCqr5ckqnyBKqdPkKXfeIEdaqkOfaF
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
sUNP3uP3d5+fmq737WN54+arvfK/zc5tz/VvhgCqLPvPx97+29y2ltVFVbb/TMmx9/av9QDY26bi
c5sX3/H9qreefHBtzd1cqfn8823+FnbEdXfPvszM24o8sVS08ry5ZNXpUN/luHLJxUYueXVW6WMv
tt1Vapu2pMp0verWSbqXDbM7OyLFZMMmKyYWTFZGtKzUsrZWarLKyy0soqWCpUVLIVKSpQc2+e69
2rzar+Gs/YD/Qfif6T3M1UsmZjLy9qgZKod+99533MXvuY999/IiRIfoh/P1T9syop/H+cRJ+Nm8
Zz/BmVNVH448iJNcs0sllmVJn89zP43PWzKrGTJPNZ8WM2/nL3VvTw5asssWyPc1+XuZnBuo8ec3
3WZmcerPi6dq5iotzMyhef4zf3mVT+0xb5sgbl+c/6f3fh7vvnlqvu8I7jFlRa/Dxj38+8c7XFys
eMWTVkW3f5v9vn5x7+6zM/pH+EqJKhUqFSqlIlSkVKQVKgqVIVFLK2lZallaystrLLUvEe8CB4ge
FfffyCw52/qrBZpEBZ1dufbfPsG9rzcrbdqyjVje1ZuVtq1ZnvAeAHvR+ISdP5E85jP5kTPzV/M/
LeD+lk6sqx3LcZlvP423S6yZbtrU0oYvf7pqTdh0xieXHb/e93vMzhVk1Yqlrz7rSbpyxMy2M5bb
6ZltTVWktM35+9eeclSlKtrzMRyxqp0rauMtxOd3pVb8yWtay2VQ+/P6h/ZIU1LLWWW0strLK0sr
Sy1LKWWpZayy20rLVllt7wIHiB7xHiAP4tdT+B5x/f12HXm4NX8lubcmHSud5MOl+fuAO4PoBxxf
/uPlJCMYyR/Sz1dLd5ipVk/Nfl/nDzVvkumSrDSm9bt1tRrGJ0xmrNseVa1FaZGLlWyT+u6t0Wkf
rd/rtvx5918sVTVRq6n2/zuf3bxDwptU7cXoBc5Huxzj4DzeHNqDz/L8h3znzLgiOaav7zvd8t/k
R/SWElRKlSKS2ssrLLVLK0stSyrLLayy1UstUstpZWllaWElSkipUNd8vb/M1re89/v2u/m/dZnm
ma2su1ed1ihWBp8+r+k+zmOrrfdrpJ9nMcN3SB4SEO1tg8Ky127cuuZ0rhTXjbnHWS5VzXi7731+
Jf32ttbb8NttZ3l3mSdWKsNP8V+ffW88vFj+Fe3dk85u/znvg3bYrkrIyx7rzvl3mZxJPPTJ95hP
bKs5Yv2a/l41Eb4xmM/yWMW2Ft9MnjTLVVlF5z7jjdEvd81b/E/yQlFqFSkqVBUpFSpCUlCUlJUo
KlSKlIqUWTIZMkyZKyZFkyK58uXbdx6/GqF2D325WZncDe5vb/XfqvKE4UMdJViod6xvv6RH+Ukk
R/X1ke+sV/g1of3+ebz7Mzk65iLbzNWTz975Vu5nMknipp3zy4bnKcemTFSrGrM608/t++t6PFdW
L23JSpVl7/b+dzM4nKLZ+F7fd9359b4nLIWyay8/tveE5YdWfZzma5+azmZnh5X4XFklqbts3+bd
7923DuW2RKsVZjL+9x5b/ZI/whZIlJFSpFZbWWVpZWlZWyyssqpSpFSoVKRUokqUgqVIn0znWM/Q
nP5ddQ1s9/VdTbMqiG+mnrN2u37Xe55e6utedvdfskiem/5E/pU6U8zv7mZs0qWk/lL/PM/X1vJa
SqVrMWPLbhVzLbTXb+fzm7eJypNeMysN1k3WNsCrNUutPz3PP8IkiSdNLHbEqnnu/O8TVntSMvdd
+723weK7WFhVFXf5u3Tdhb6stjz7ud7rWtcth2xZYt1lusMs6dqeFMFZDKZIsrZZallaWW0srWWW
0HiB4EeI8Pe97v3F/T7qH8Nd/CP2p8uprzWKkso3rXH15qpdlG9S42YKFCgQSfD238VXx75lY7ZX
XOVHbK27Vk2yrtmec5Ubsqt2VWXZV9Zsqpdldb65Vbs62vvZVbsqt2bbW7Kxuyr7ZVdtrd7Z2UXb
Ku2Vdsqm2VcemWhz7zOOTozhoJ3dwa3te0oi733ms7u7uETk5VnHeDwSSX3lWETodDpFiy32vTXn
vvCd1lvred5xW6scjCEDk7BgoMVferIAYISEnFqrCQ4IrE57oqsJ3QOncrE7rfVeUid53d3Jssr2
iLPPObk6HKqsJx0Ois46gyScWoiMzWV6u87mt5td553dydZZSgncWVvApXed3dydZb2zvOLQ5BBB
VWKqwkOTsGCST3pPIdgwISKsvlWEgchzFkDsdLVWEgdO5WJydTo1VhO6B2Dm1icnQ4kIdFVhO6nS
1ic90VVNZZ3c1va3eeLc7k1vtC3nnMmzSWrTV1jGMWXEqbOC1azXmQ6ByckRFIdDkUQ6d0FEXuhw
gqq8QVncrA6g8SSJUReOoe4klOvhUOndBRF46nSlYd45pUReAgSSRFhydQ8EJCQPU8iKnQ5B4kii
90O3Gk4vjzdd3Wou7WWUpZJZ0nO7q7weCST19HjpxpOFsSKp0Ox1a17xA9Tzbq/Y76V1cylmOuko
5m7pGw9e7fd13vdm2NlFpHdzHuVkNpELDDyrTdh6qVHslGmC7Zd7fA6tIfLECweF2UMkLrWRBOW9
6zvLug3FVLRumTgge6mxD3bS3Mz19tCXO5KKWxWo9UHZ0R7tqcssicbjbgQxXhD28XPidH/5k+n2
K6wx9d39SPYFz2qDXxGq6qjkWw3hSF4etC+xCkO7usjS71YHtqj15fP10LqUcucNnZgzlAb05Aqj
BEetrNED48i+WAoMbnUDfTnzkqJ4uEl2u04xXCxDN0dySE69zexbQrurKUXJbmg9YvGMQXTIe4W4
RW86g16h26Nerq7FsFDrFZLC2t6RpXUgN8cYdKAiPW1miB8eRfLAUGNzqBvpz5yVE8XCS7XacYrh
Yhm6O5JCde5vYtoV3VlKLktzQesXjGILpkPcLcIredQa9Q7dGvV1di2Ch1islhbW9I0tMiJPpClO
HhMMKU8OGjhho2cNmzRho2Upo0aMTdtrhs4YYbOGzDZs0cNlKVhow0U2aNmzho2bMNGzZowow2aN
HDQ4aKaKeUrq5Ot4J98GL36Yl99RGL34RBAHv0AY+vozvJ1vBPvgxe/QiX31EYvfhEEAfXwDH19G
fV1eV8U4aMMOGzhTBkJWea3ve973aaaaaWmmmmmiRyUVK60OVdk4Zww8KxmnTY0sqxq7s1Vsm/zf
n5523pak5Yysfv5NtjayLMxOat+8zX7fNc95znOc64rlnCyaurosTffftyeLCqnT4RybmZmb4e4+
2qIPgCCbmmqWjiONHyWpyp+d7ttC17rmeW7ktjqjMYmtct90i7TAWVRZMqmUyTJlqWW0srSytLLV
LLaWUKlSKlRKlST739y/vvu/5nn3n7z+a+a1yjkxck/E1bWnKyrTeXdtHU3pysq23l61+yB/G6Wp
JyvfPr959fz230mlywyUrV/PPPPXYeVLmEtS+67z7fNeRF8ZIN+V+JjvTgvQ4mkRIRJBKR6vFo8T
oHF9YSUZ7yAK8Ej8Zuwes4OhqUpOIoFnFlRIQ6++BSw9O60jv8Q/UhVqSFJUipUKlWlltllrLLUs
tpZayysstUsraWW2yy1LK0stB2Oaf8H1asv8dFnCKXXr4Xf8tu+6z2eQPi85nl11cni+LrzPLrxc
fP0I9P5VirEafuvus25PdYmLE92xI1tgr8/fe+t1fPatk9qNZvGpJuybslWMZ2798eb8tyFtWS5b
iZj3eY97b4jco7jO6wmv2/NDdNXli2L757y+3LniHbusOc589/eq95nAYOYx4uDnN8+/38f3fnlV
/hXWmEZJkyVlMksmSsmVsrLbSyllqWWtsrLWWJJUqFSkVKkVKhMec81/M7+/c/Vxd4g647ZztPfz
Fmdi3ck7azirqPI3meb95zf33nM35e6z9kgf4iJP7Pywl8e/j9Mt4boftZ9cSdWSXnn89987RcyJ
aeb/nOcJ6uXFhbLKlWT+b7u/hzXmHFW1cpVRmO/c93nfHW95bDWMhqxqvz854b4sKrym7aSLpiRa
W6o3rz3NZmbkzjCqWxmZPPzj3+E/qWSFQqVClVUKlSJUpBUqKWVpZalltLLWWW2WWpZbSyrSy2WW
pZbSytd9v38v9d1/P4Lo39/BaGXorgxTrBdkbd9DeoJnmba1Xda87f1IR/YiT+k1+MYuKlwkmgBQ
Tl3/J9u7u637zPhRBAPqKPvDf4+23nJO9mJViect7mZqOXksWWH3fGjdGlkVUze863I8WWaxcxO7
ve1+IkiScMp4qVU6sqzGe/a/jhxUumMVlmWeb/P3TcjmZLQ3vv553mZngN6LB8RZJ9+r4119xP8H
veHhK/fo6t7+4T4TePbzqrquy9yy30fb2bucZHXc96HsqSs6VI96HsqfDwHgP3h5AgE+9tcgepG7
rXiHFeWb1bhj3zuOat5CYo5rfeffvu7fYj6vLWuPf2Xf2W+O7ZEn28av5ZaLxhZYuT7uc3rWtVyK
y3AqmVVyMDuX9nWNzpxOcDnDy/e9vrFPzBpNKLde/n1uzdJyvCy5e+d1rWtfshAlD6h32JH7MSF1
n5fXgtcLuXZolh30dW777rVy317rz33PyRJMP3VGWT9VrGRVhVjz85WhutKXLLiZmOVfzX737LfP
Fkqx2xMqWz8c1+/mW8ieKxUs5q8uW7jeMkqzLJMsz38/Lp9bxlknilZ45n3vHcxnYZRV5WLIpmT8
75y3Z5w2wB6c4HEz999337/VX3n7HMY5zfjnT3gqSd3d3pI8B1Xju5uE/h4e94frmblN7dbdHxN6
K3T+C5WqXfhzD4t0kEhiKVQgcP2cWVZL5kjlh+cv6a5Y5YZR59P28O8Cfe8Kle9L/DGx9KqmAIQC
D5liqvcb87vzfzsO03RywtXMfce+/gl3YvvAegIddXb3zu6FVTADPgAviKAKwrr3vMxa41xkFy87
73vu973v0T1ZJ7kyt4ywXTC83n5zN+a1rX7APf3zmfu/P75vS8hvLxU4lrmaCJgPWal7rCrOxe6u
d13nXc/EJP0MoflK/X3n5+PJ29WZTKlfXVt1IxSrVRW2DVNWRajmvzjuYzTjzGJLUfb7pOWcstTL
Hub99dzGeI5UnWe6MppUyyGPPvOfu7p5vxkTCpVhVnffH55rThrxlJB971CoMfSqr8PeAHvw/HhV
dx/OxtPfs60Fh+mbt11DHY4WehWbay6GKwhZ5FZvxIn72WVZI7+eX78cfpYWhf3nPzzWta4cCAPE
djvurvAkEEAebjSu7vlprwJJ753lstbgtS21HnNdt3DLBvO+/XXtlrwcUqwylq5jed+7mZwTW85g
58A5wA5zh+/z3+7vv332q/zm5zbfHX3eP+PM+rsC++63r2hdXHka0ObWnYQqjmNrd+98fDzv7fbd
+h22cnmjzR5o815B5dTzwu9WxvEOwedDzoedDzoeboedPO9vDG9NvTb029NvTU5skIYRHuh2drV2
yrtltu09Iu11q3GVdrmXeyrtlW7Otr72FVuyq3ZUW7etq+2VW661fWbKqXZVbsqt2VbMzOudFbtt
luzGOm1Vxsq7ZV2yrthV3pPWTekbJGymkujpdPbWb2PXE2PabSZ3pMzD58WGLMWYpi49tfWTx7d7
Hse3pKd58vdDt546ySeVTodFXuCRWRWB3g6NXjjwQkItWRWdwRVOh2DwSSeLJ5RhyHULxJG1U7BQ
lKSTeB53crds7uW63W4HcsDqdWrA5OQ8GVVD1kk8rA6ByqwOodGSSq90OBivdA7HRqyKp1D3Ekp3
p5e5OWSEERHu8dbV7ghJFRQCBIKjAgQ5VeO8HoSECBbJJ5VDoCG4VWxVOhzJJFWHIdQwSSN8qHLJ
2O7uW619SxHedy3WXHd1ysOVWB3g6DJYTuUOxy1YcdJFbtvK9oPffe5W6vdDvA7u7bqUHW53dst5
XtB3ge93dZYFQIq8dQ0kgUsIeEeUOhyGCHSErV46AhJJBkVFDvcek4feVOgckkVGHId6SQJw1SKp
3jm82PO65brKYJ3ct1va5Lw85GHAxWBxJFRgdTq1YHIIeBUVOoyVR7oc90V7oHbj0nCWPe66oKVz
u7WW9r6oi68Pe4U6HY5tXjoSRUUA9xJC2Kcg9/QA8PAeAqx8XrOXONCh8PqdYqS3Bu/aO006fdim
7i7p5WqYraqrLEdkuxoqxqwXVjes3DdF6M3uOswdFfSXY2PqmrXlaNqCFqttxHhqveo8nTx4Tglw
Vl8ujiQ0ZCmRiWEHpu9dd7U8t6Qs4o5Zvt5boyN1JjF7gyHFjocMXUxjFlEFOWt4dN3SXRfVyEHH
MxCq03BBim4RNd42CpeYsQM2UUXWC6uZtHtsTbVS08HC1DgVkWG3OtxvhYt5wqtvCgu297cy+2QV
3UtrJad1WxTQ7CVu7tgVbETZoznz2tnZ0ro6Cy9K5h4O28gguptS26u8zpkW5uHFtLso4erBdWs2
j22HtqnaeDhahwKyLDbnW43wsW84VW3hQXbe9uZfbIK7qW1ktO6rYpodhK3d2wKtiJs0Zz57Wzs6
V0dBZelcw8HbeQQXU2pbea1vfn2/u83zd33mzY4emFPTZtsrRo8NmGGjRs2OHDDZThjZoYYYcNGj
DRo4bNHDhwbNFMNpTRvdttuzhs4cOGzZsw4cMNmzRw4aOGjZyvq+pohE93gpvvlMQnt9SBF9fISX
3yAPfgMm++neARO3gpvflMQnt9SBF9fISX3yAPfgMm++rspwww0NmilNKquGGGHDDC+2225ESfpJ
L/J5i4Tv7rz5yQ0sk91rv2OTUqqrFtxiirM/PHlu5I4o6/frdt33LZL1iasmrJah99+8+h34c3wD
m3nv0C5t05uYOa8yYkMYxknnOa3rvGc5zXONweKF+v53lv6PDwkO5f4kZw3dTH3aVhrVdfslgnpd
29R28ctWcENkYmXea7dnAzZ+AHgPw9oIIPoQPpkr935VebV7tXu4BnCveo+NCvADd7b+O+HhVr9X
d+zMzLC94HxIIIIAJ88j3793MzSLScWvffHH29aa14hqyUsjx9+fg83Ob95v49DvOds8TZNxNg2+
f3l+e8t2k8p1r3Pz873dromVajPzXrlt/ZAPAHM/X+78fplDRm3dX2L9kDuuPWDNsZffdu7zfcXz
unmuedu7zf4JJh/YiT+ST9qVZV792/y3bmsSqymVJlmb/l5b+nJHlT99rlXUnqpVSrOKx3duobWT
cuYyMd83TcyjdlsxZFlj+WJqxR+C6VVaNB8PE+HaOJwL7dDdCq7w4eV7VVX8AAA8usprRgQ/fq3e
rPo1sl7eq7Q7pYfSs7U1Yx9YWus7W18AAPaB934Cqudf4aKI8eGVouhWTv1E9wGfb2nfCgl37kc9
qv37uB365HA775886E71fi66fe7w4bw97w972gwD973gADfwfz1xfrS41v6qYvntsumzOGGOmRRz
KyZaFChxrq7svhQ+ESOnp8ds/S4YXFrP3nubbc37vV74AA2/v6D8HTHPt92s45jgbw+/5b73ecx3
z++dD5zfX387psbd8g0deusHO+Xzzf4PDwAd/q/d++FmXW8b+6rzjVa185DUyGV143OLreh6PIWk
yq68TnF1vQ9H8PAAXoSuvv2qqo+oicZ1VWYB9351VV7Q1UkyqrOIF+IX0li7u94cBeR8SOHU+Jr2
HK5rSaAwURpAl+sjxpO8+qif3h4e9v78/xynV5v7rrZswjdbwb32ZlQ33WhXDO2xSW+313GvO6Z3
vJv8JE/X7xbPqusU1jJV8/2EnBQ34399VgkOu8lxoXo0LuOKqrgPmsLr553bpt4533dg73mHT+73
XM+fbxd4WPvw/ADw8L+7R+Mlv4nq3TmvXrBrq9VnTXUgv2UW5xNRwc4b6upC9lFbOJpSDnDfV1fD
3gPQDsOyxf40BPusggft+3BaJxjBmV+FWBvd8cJGkAIA/U7JwE3Q2mS2axWuVqSFXe5LfzD9kIZ9
q+ffm/3xvaV/qxNbX6+szW5kveqMZZyz1vXjvfM99b1fxJJNxnfPPOVbTd/ff33ji04qgigV8LGE
F/g80bSdQk2QSDlBWtkqEoDiK2rx2DfqIOD1WAK3ap1VaO8OaHT8AAB7Ph9vw/fnNBq2L5ctd4rq
qv8R2PHWdseBWh3F6R2POrO1PArQ74eA94gLw/Gd5+/vqv7h8vn9pB/zod2O+/ewLODz1f32q+bu
9PDl9y7/P6+fvvNznNznKvv3gdxecSRJLqTae87zvvuMzPfD7nh+wDNffeVkaL/d2nfrUery6xvd
VbXGx83kC3Ju9Yy2NYS7OD3Hu9Yy3APMEgEMHxoD20qfmt9vKu2VbsrGbZda7KLtn1t3sq7ZVuyr
r5yrG7KrfZVjdldb7eVW7Pra+00VbnWq3ZVbsq3OtXbIrttva33sqz3rrXbIrtlXbKu2VHBuJJ49
ZDoc+2XJ4i3VurqDpxtemvLzZPEVe2Iry7wtJdcnIreV7Qe3nrq3W6vtDwnjnKy3Xc6t58KV54T3
u7ZZZ05bq31NDuJ53dt5Xuh57PVbrKaEKKqdDvA8SSpLA7HSySWKh0Du47bq3tngeO7q3trk154d
styEII8qHUPBJJ6zzDlkiiwOTtxJOGSvdDsFmV4ePSTyLA5BAkJBYvHQ7B4KDFXzJPIsAPqB487W
+pQXh53HbNud3WVlg7uO28ryg8PO6ssr2iLODx3dZZbh3VvbPE8d3a3bEUOZJFYodQ8EknrJ7uTq
CCEirLJJSPdAOVkTqG4klp4SEO7mst1dQHG3W9r6iLee+9wqHCs4B4kgqyKp0DvekgQG+ZIrxyCE
kjFZFU6HU6NZDoHeOjVkVQ6RZA6RWRVOndFkLdoa47uO7q3W8r2lKSS999WHBIsWLFDk6g8KrAss
VOTvHVrFix7kOQQ3CqksVDpxwBRR3OO5bcaV5w24d+9+et9fp8883RclbWMZlw2Ju7sPZW2+kWzs
HFVxEj5roFsuJ3uUtyojKw9gmwaMF1bvarFwriJcvrKvVox9048YInrpVsWRS5Vys2q6Oc1wVTRj
nH02Xt3vX1mO9NxTnOiy+C7je11atG5eKXEvbcxhoRHM25xrGH2n0vezqz11KV1dnR1jCodeEXfY
lu8O5Hay+eH1Ch2brCRCWTXTEreuxbugvd1uUxd5RvCVAQgieD6TK2zl7g2brvMHVJDb4odTnd1H
u7NCSHJBhVtyVlQNicnudurORLtSgShGruZMEG4MG12a7V96tDT5TSx25u4rzhpzqiyducNuGtGd
dTEEI7o3CUgQgieE6TK2zl7g2brvMHVJDb4odTnd1Hu7NCSHJBhVtyVlQNicnudurORLtSgShGru
ZMEG4MG12a7V96tDT5TSx25u4rzhpzqiyducNv65xvzWfb60SQkPYiRIUiEMPSlOjDZ0wpsxtVTD
CmjR02bKYUo4aKcKaKU0aNHDRsrRgwptTDCmjDCmjho4aNGjQ0ccVWz6uukoIHnqYe3zBAN98AA+
vsje/Qg9r5gAPb4G68EDzxMPr5ggG++AAfX2RvfoQe18wAtu3LbbMNmpls2aOHDRs2YYaMMaVVMN
mzDZs2YaNGzZo4NmzRh5IkRJHu8993ve973ve973vfIiT8IGH6+q8/e6uc9uXL5OenPuY6Lz35x0
fYv7uz82D4en30RH4fH/OnzwLY7r++HfPpTHzedycQTV7/fPnfxviikMPr998mmPqJXhtdY/e94D
3npatk/r0n77T1G8uMpd3ZaWcvkeuF5nLSRyrqPXhWYlpI5Lw8Pe+Hh7w/eH3TQMvw75/O3QQDGH
7qiqqp3VsWLAPnW/qwcSQNsZ2WCW8zm/d9zzV8i5rbzUnPc/NMruLHn37IQbf35K4M/Xx1Yqojt4
5Tr9ezM1yiMjlcNuzm206bSVOtG3Zzb5um1nh4e98PAe9+z8/n+/B2OeAmfPtdPTz69fpTO+BgDY
KGUBXz1fkld3ZBI3wWHRuAhJzhEibkuW4zOXbeLW6d3nPNHnmPwRHn76ZT/fe/dXcqv6/w7DmXpW
jUdzsePoJNqWNZ3JkydBJvw97wH7w73xH34/rtDrI4jR+3SSdPhxpEnw3pmLOu7uxyKtEvv2fjQl
UK3c9R99PjPMal9fxOgkaNJzwJGfdfAju8SdnfUyf3vAeA79lVvUai+UwIdVK6ruq0KoZvYb44T2
ZWrrGve1E92Vq6xq2DwHvWBY+JPQ3hAJrCK6fpVVwQP0vf1Isn39yN5535752qNu/ENp+4MG67dV
8T55NRPK6891InQiUHWVyqqreAN58wwNrNVVX4AAD27921Wdv7766Nr8C8orRczqMSx48ze7lyW5
bR6LUaiyRpblxHotR+Hkj4/Zvd560cm6XPzf755adPuT3RfPy+cqJ3LcejtzhmjQx+ls/dlCqq/W
lzZODSFZt0KqqZOgVXfDSEPw97w8Md/IfB7+9l/svcrBV00lfdfVzWug0NBp86P3WtdDvrxc889y
++a/ESPkSRJNHuF3av3u/z4n94WCT353KHY0un4Pfp13dr4HwI0gEfvQ79OBvPMj7mvtU81wwAfH
4BwOeEEH76LaqiDtPysYCLWd11VaBR8Rss9lVX4eHveGAb8T34fhobyUHRaWJ39XO3vLL0i929PV
l5uXxF7t6er7w94BAbvw0Y6p7/ga4YwHvzXr/e9qvpj1+Km/bpuHunpOAKj+qqsJZYzSSrN4L4YO
ZOhkHPb9r77aCIP7wHvAPfgfpf7PtzoFu/tre+NPhzOpl33VcpjbtJPLwu11WqY27S+8APfv7c84
44u4uDffzr/Px1var78D59+93zweYfBX+3hhm3d3ZGBH2NVOGtX+kodgBGkijRJHcRj2hLxsdwBD
H3VnAkV6h2RpD8Pe8PCxh0Kumt9xNnf2UHy487y07f65uFl3WEcspbuFFXWEd8PAAVnvHZUBI/M5
TW60OTbneN74fu/zn7rWteHnuWzMYTWknN3LaJsDcMoXxGHU9373gB5hjH+laZNJ5b+w/t1ntN9i
DG3W1R6EHFyrroO+dOyC+TrroO+BC3sY3BeVlHDgw6LPOR5ryDzoXh50C3jvGBg86T4h50m9JvSZ
0t2Wb020m3pvem3oB4hCEk2cq+xlXO1V3sq7by3bRV2dauNlW3aqvvZVbsq3bW1bjKrdmLLsxZZt
V9d7PlVuyvrfbyqN2Vbsq7ZVntfeV3sirtlW4yrNsq+2VXbK70jfRdpHzZ6ye9p6w3pPbGuNZ7Ex
d7GdpM4vlL5x6UpMXFxfZvi+Paz2NfD69W701lvbymh3gC00Iay3WcA1hs2bAK3V4Fd4be27gNlb
2u0O49rdwGsrLRLD6t3Aay31e0iK7wWvdd3dygDW9r6g88Fb6zgNvqUHDZW8r6g7wDYNb23ckke2
7jWbAFvrONbyvq813d3d4ArfV1KUklw28r4K8vAqVX1A48r6g7yBrK31fBXnhgWy31u42vKBcFs+
FK7jW6vdDrwL2zjW9suC8s4VlaBLe1u4VlrygXSSSwK3tbrglYFvbdcFSt5buCLYFsrBgWywbdZc
G2Gt5Sg3BV5XuHeCyq8lcF5XoV3grLe17QdV4FSWqlTaVlWptMxU905zvvd3Tz17oqLYHxbxkbgr
dqS3d3utem5DuraF9wK7Z5Byr2sePZyHU+qAk6NL0MZ7N433MSzkLloznXX3OrDs2GqoaM9qGIct
06I9xEuz3BmltvNe8Bth4sGNX0w6Eq3s09cmhjTuDtW0m7HKK3uxO3LKwdooR2MFHdjiCpkZVrV6
1i0EK3lBsamuvurVVWe62ljqseZvb3N1WbdbWWQ3THGmZ7cjfpiBzbV9vXcvM3LC09rlUEuD2u6p
SXV3G7YPbwatdxfLVzmILrZW7yveGQZlVMXZ2JwVmZuLNT7OC0dovLzdYdurEY2rrIxLOCPRQrp2
LLy3mLKUmbUsjVUHGoZ7cjfpiBzbV9vXcvM3LC09rlUEuD2u6pSXV3G7YPbwatdxfLVzmILrZW7y
veGQZlVMXZ2JwVmZuLNT7OC0dovLzdYdurEY2rrIxLOCPRQrp2Let693vu877IQSR6ejhh8fHDDR
w4aOGzhho4cMNGzDZs2cOHDRo4YYaNNGHDDhhTDRsopTThTDRVMNiq8qV9XV5vDqUrtSYLzwwSPb
5QC+3wDH1fGAe/RIe3yQBB787yYLzwwSPb5QC+3wDH2+MA9+iQ9vkgCD35bq6vK8rq9rjZhTZw2a
NHDho4aMKcFOFOGzho2e+e5mZmZmYiSJJ+IHxv9j8Vnctwx+fnnr8/MzO9Wva/d+ZSbGaKq/vjnU
cbqzd02CCBisSHMtom14oMjuEWnMGXhXDxIVXptA77QQRQyBMmnmDMzM3uh+GYR8SuWyqr8B73gC
N5WPvxr4aZ9+jmdvbUrINN8rnG7U3NquVbVZtJdubVJVtV8PeA9gFesfiRX3fgxvt8Dnfb+N5t0N
t+/y50O43fv513aIDXb98Ddxvne3zWDeauBunbMVnoPPPnz4Hfnz/PLwgn973gAO+iH5/nKvdz8x
2b2bXZ0VzHjVHeJ3OHdJdlynWrYTswJx3Zcp1q+HvAe/DzhouJSqpcRRJVgkEgURkvB9T1VVIDCe
/ZYJF+BHwKF9YIB+2RziWPOgMoL55Wce8T71uncqq7OqXe2LbBI33Zl8ifw8Pe8L+zb0RE/HD80K
/aMNdizcfWqnVzeLH1un3w8AAP378PnQJGcPXk4YCCNFEUSfZnx+oaOPU+OYidr6YGcqq0edhWMt
/qJwDXliyCQeoK/u4nsIImKzwNVVfveA8BtQ9e0YhX7vdxVr87zq/V07cae6Yk+tqc3d8ltDkb3n
1pPm7vktr4Dw97G0yfwwjTV6P11VD2j7UStJJ8SSFfD5/ytvm+u+Yrc87vm+B3z4H2X9mxjG7jLC
csDK8V+7nSewPCCRcYtVVfgAPeBjj5eq93L/fbjQrSb1W99+euUQzcpeSXbRCNql8B4ACD8vAg1v
0JtblW6okIA58TwvBQPvXW/tA0+ojSSNE/TV1G3FgqqqmPfDuDRJlPXVVuB+BCH4eHvAfh8/x+X4
Zj7Koi1+6l2V3PEdN/GyWl7VpVFYbJS7Od5+EDUfs93p5mMyNe7tjjX3JtVXnTAKgbif3u7eYg87
YAM8b/MGund614qax7vfuDd3Tc+cxvv+P93zBpchNEUi6ZP4D3veBD++78CPwMJldRQb1YRv1XdJ
YyNXtrqPZlzFSZhT9KlGZlvJXfr9+AmGv0vk/P3NW1vGKyrrv26b4TZ4Gn719f7xV78vP87vNju3
3+vydDX3rRs11W6FEHNd4NPqot79jg+tfve8ABi5p1n7P3X8FvBh1W7d2srq21QxdWjPuvVXV17Q
xdWjF3w8ABwHw79Qos3WVVV79s0mvDZeRbmZmcybAWfgL9ukVVervzlkE7w4PL8Fu7HcmPu9eWvN
5u9V681jGNH7kT+A8PeGp5HT+2vxz6LZXWOoxTMFVgovba6uNzk22KObbfVxt8n8PD3hQ/EED8IJ
lVYF4Tb+1mpt5d3aCN0LptboI3vFc7/Pzle7Hd/nz5e3qtvno/Kp9+ffod5oJEi4TR4fbmgApH94
D3gD+N0SH92TNPbgsH916LsCWWtI3Vt263fpbI1c7t1uv5fMYgSB2vyvyVdjKu11q72Vdsr65wq7
a212mit21tX3sqt2VW7NtrdoxW7KrdlVu1tq3GVW72tXXaqrXaq+2Vdsq519VdssZt7WrdlFztVd
7Crtlgi7VNJqE01VpOJmFqisJZhste0RZy0Nvbdy2ht7W7mt5ZuGvTTizUFurOLLe2bhb2rykTvC
zBquNOeWV0iq9oHPLNxst9m3Ne12FVgwndDsBoSEBs7jwG5SQneG19Tu7ua5re19SIrt4bNjW8s3
AWa0Ngst5ZuFlYLdXlRF5eIqvNI24t7Sg7BW+18a7xpJst7Zzb2vqiLrxNllKWJG31m429t3C2+s
uTb63c2xPKUiK7i3lXqJXl4mrtIuFlvbLkW8s4t4FK6Ire1faRd4WV9SxFyK3tfUHePbLk2YeJ95
8NFZEZHl4x1DsHGUrDTTG2hwvRguddQije5GxmXH3HhMq6q+d3jGdKm1nWTRHPNxcS96hzq93ST3
ZSGzuCzOmIIK7c2srC3WvXW5QPTVne6YiHnTtzakHPcRygtbhnTsSx22rKgmYL6rVvrvnHRo1qzu
RzTHyfXhsYLV3hh2r2917td0ux2LnuqYw6u9y1eOKbz2hnHTcXlpmqOg6bc59aC68ree5TkVdCKa
vd4wOO5VhZXkE7zVsfZBXYt67Y0cdXXQwu3WX1c0Hd6TenOCpaHdqG7M7M4NG7yrGapV0sVm7q9f
PsQd9nsFi9O9PLStUdB025z60F15W89ynIq6EU1e7xgcdyrCyvIJ3mrY+yCuxb12xo46uuhhdusv
q5oO70m9OcFS0O7UN2Z2ZwaN3lWM1SrpYrN3V6+fYg77PYLFT3gAPeA4DQGGimjR8aPDZo4bOGzD
Zs2cKaNmGjCtGinDRw4bNnDDhw4YaOFNmzhsqYVo4bNmzRo0cOGyqYcThSmHDRTDhhXDRnLbbaYY
aOFNmHDhhhs4YaNnDNS22I9vMiD2+BAH32ECe/EAnvwIQ9+RkL3twiPrzIg9vgQB99hAn3wgE9+B
CHvyMhKlANHh73h73jl3MzMzMzMzMzK/GPrwkgNPfdvvzff39/f3nnwzwxg342rBgU+AbUopzdZJ
9wIHAkn1vRNrPru77EKcCYzhwoVGTlu4gSH9Pr3b66xq/osutVUWFXE1Tss8+6dDZp8CwTheNPmb
NPgXwDBAPiPj71IRfKqqlxHVCe35ZmZiEVUJeKicIG+B7qh17VV13c77WcZLFkVlH7Pd5v2H56Dv
O/x8fNfj5xPO9fkF3nhk3vvmjXz9tGXRxUY39mg0Vi1pmC63AwseX19ujh17l9fagPmlqL0niCH8
++N9xAZGFRB4ZDfPfnNyG+VElHuPl5xO9O3G5DuAm1PnugkV6gL1aLZ6pfd3fK73Jea261I6Gs7J
1WDT1PqnO2byPUi+XcKlzlS52zeR6kXy7iB8iL07hmeu7v1hEH5PuIo0QgOXeF48viaHeHXMpffb
X2caBo0wyCBn33Em/ATt0rXXqqhWzrtZjyqqeFpnDRpk79i0nD5b3xwl4r04fpSxbR7tOr4WusXj
N7sBpcgntYezqeXifPXoS2sPZ1PLxf7PeHgB7w8B8A/Z4fgmnSrtD5vu+F89PnQ4AY59M/cnMpwH
Jj++fPnofPn1kObWx750PPOG8MoKh/h8+u75/fVg2y+vvh8p5uvszPjnVVUg9q5sYXUZeAPoJV7l
8+0VdIBcgqvcvl2itA+oEaBDwlc4RbvUCaqqvwwuie0i8OEkmBIVVDQNvegrwwWSkShgIIrk+Fqq
rvH77sy+qXd394Gj8vaBY35YRhKElVvHaqt7eN5mQfVgfG66sVL5DX3OsloZaGtMaL3utYL7U6x2
hloa0xove7WBXwRmWaGCiOr77rdO5B3nev9g3kGDzHHF/fu98VDPN3vvh792+9+4N8H8r9vDuTAH
MYOJ5HRgGWQK++PC/T3aqYusXfML67GqqoW3O3evZtc0SkK7M23WilxTzL2saarhTRbzL2s+YKOv
sRK5bBv2E8T7NXyrSfNGh6rzbLFfUKpV4V9h67YJHAbs0cTqCrMWDQAr+zO7MzMV+w+Imvt3AjlV
VjCHOv7bu72+w11VsT7njUvjSdiOtc56ptK659wua7y1VO6xvhb13mAZ8WapYc6qrRTU+4knYCQS
VU1tp3VUwz4fXgvfe0A2J7rvAwfNjuN/b379/qr5837ib9jGHS5XK5F3vy/fr9Vd3z67Bz4fT6I9
cnxZ751SFitw639dde3XVsuPrkyW+S6zuve3r547fJdZ0/bm9tSydw4z9BQqhU7w7TjoFk97gCT7
AviV2fXOqqwN0RQVggWKsVQ1i4MWUMJJHUOidCsJ7569AqbX27MFVsNh1faC+BaencLGFfHce0Eq
grZ1xjNhcMDzpcgzYXLtDtGXRIo9+7o6O+a626eYvEPOheAXHd85MHnZJvSaybyu8TztJNH3pt6a
6TG9NvTb0DeVUEN1J07odPPvOVdsq7ZXWbKuu1Vuyrt7Wuu1VbdqrS7VVs2qrdmLLsqjdmLLsqjd
lVuyqy7L623GVW7OtvvZUfbRX2t8q72Vdsq72isTbKvtlF2z52k2k19JfR9LpdLpnzPbxi42NfSe
fYztNMenizSWbrMXFx7w7xPHsex7FnseQPHKSEOpzzVfURbui9s5rESlRGFlut3RV7XtB3hZb2u7
u7urqIq+r6oi7wsrzT7u7XnRbLBb2zotXkjnbuiWW9sq7SkRpEst7XiJSu8bXmhzJmsturyg88Ms
r3Qua3lfV5R3dzyL6y7ZsRt7XtC41JU4cKtWmtLRSnIzMzJSRbeWXbeUojbotva9pRF15Ilvbdd7
XtB3hlllht9XlB55Et7XBrmt9XUpSSbpKW9t3NV7Qdxvq+oO8LLeemleeFUQst1u41vKBxsNt7Xu
h3jYNt5XlEW7x7buMst1dXUd3c5t76KV54ZZb2vtDvGzYZby3c2oMt7TRJqj4evjujY1pp44NMrZ
k4Zw7a6iOZnLe6pU4TVfEd1c1MtCn3Te913Wv2jRxjt3HknOuhF9rfK+c7MVo6HxOrDN18arMgoX
NGoA6N/9CMi+e/c+NWe6Kimdr7i/WF1oavdDy5doo2grz29KECVzK6LEOECSya86tynY3e3jjTFq
lsmk7jzm8oWbzFvLU6gzt3DdXe5xBsNhHb1iUKtWpWcb4TrfNae6Q68j0FNKTEMFNi+nDfKuPOLD
hM6DFBebdi2NFztpdzqcc7jdi+bj7db3srXk4XfdmG4SurBejEkEtejig8qXbTo4cxX6pzD42vXM
myg3YPTgsyuBuvD3vD3vPN17MgwVGL6cN8q484sOEzoMUF5t2LY0XO2l3OpxzuN2L5uPt1veyteT
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
el9983fNnXhfIO+B3fzsm5/bzshvPLOOZEPb+/r1+eaqwfMq+9+/f7999yu5cOx4XdSsqZv0kk4t
R1cDecTjq93Skr4VwtblXmdBM2HedwVwublXmdBOA+GDb+AAPnvv7zx+R/TF1jH3z99N8/mKa0Ai
BX3bWyqrq8D4c+KZ2mburgCDD+74KE8IByK3OJLAQIIOTKJuhnjR3eu9+vw4/GytP3xqqvb6BHbv
LN9q5d9ffcsewR1OjZZVEnN3EH1Pk2WVRJxalhOZegWi0eaN5o80ea8jzst4Bbws7108y+JN6Tek
N6Tek2zK6X3obem3pt6bHpNoHpJAtgQnHOq72RY+2Y+2Vdsq70zbtVU2yrtpGzarrfXCq3ZX3ved
5Vbsqt2VW7KrdnW197MYt2VXe0Vl11q7ZGO21tfLZHbKrtnW33sq7ZV9plWTaa6SevnOJY3z5l0u
ntpXexPNxsbexPek8+2cenizFmLpLvSY94abxPY9jY9qckA0vg71hJxvrLvq3chbyvaDy81hCy3t
ly15QOEt4FK6NYhZXtREuaxHtfBXXmzYjbgwUFVaTuh2Dowk7qE4kkHu9RSvLxFsWJKry3dKVF7y
PC9JDod4PcSRs7qHjcKKnXvRst025t7XtfV3d3d56hZX1A5rLMNvK+CvPGqBTD6mh3FlvK8oO3gs
pQQst1m4awrMFbyziyvted3cp1kgdgQkkZMGyqghTvcEAkJslMFTaVlSlORjMxlKUcNRbdNW2Js0
W24aG0xlJtKYKsSlbJjJLC21OHDZmMzLleelvquRNuFZWC31uuETSXLs3Ftw0KnDltpjVTuc9faQ
WyvE0OWi1oIx8hWpWoQxr3etJGMa5tPBopMdMRrO2yL7gM9ezHA8V568aOw4Fsk6BHb1KIUhSuAy
+7cgu8nIaOnib5SZdHId7TMlmut9ZaTd546eqJnhfPPIIOpVdlVxQrsxluQXN1O0c7hubd9VZIk7
7tyV2VuYMW92QKoDu4VpyXHQoiQ3t0maqtsdmZFnKN3cuVYfNXSfUVu8bvepHVkzjQxigYHYaxdQ
amYcMrLHdZfC8zRQzM9LUkqJ1pLeS/KLsm4+XtizN4h0qGyqb7a7mNG7Y2+HTKFmkTXoeGaZlTRK
yzm2dpdPAeC1uXWzqM3eN3vUjqx5xoYxQMDsNYuoNTMOGVljusvheZooZmelqSVE60lvJflF2Tcf
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
1d3DH2uJxu97u7IFsicT7cvtqb0ic0a8cHNZO53ymbMS4RbyiTmzO3a3ROaUkWHt3bnbrkVIbm2N
19zjiTnF80uXRsuKwp2oNIapynDJQx7Ozi819loZNOa71ZNwzZvd3byyC8m7ubO5Zs7Z13u1q49I
cvMuW1su5ubtzuV7BezMG5N7EcmZU3b2mL7lo0RdO0bj3NOOhOO2yNG29x7kzdmd19se1MyXu1u1
scV+7JN7X3NYXZM4bVOsURTLbYazhmQ2N3daV7k3ZuXr1LMl5L07uPlsu5ea+3lO7Mm7t7OC24Zu
7m5O4u+Mudu7b7lmZ0G3MwXr3nmXMOG0NcT0buZMzND3kr0Xs6ZozZvct1zdrc29fY7mXL3d189m
bkzNNbO5XFey917vIZ0zFN0d27y3HeS73saSXZsw5Nsbr3o+vbk3jsCI5PXdxr2nsHRPrLyad0bo
mdzyVk7de9y7Zezc2bOT7LcxzerU3t3OGa77RyzbmTb2TRaTreub2bj7nmQdkWadmR9VVJWMLK49
IY228KveW8ccM7Rm9k5OZaxbmTOyJO9quLenNbt3d73Xe673odt27u9HuO66dt0t3djulnp2u0dn
tuth526O7br3rm07rjp17utm3XHTqdXduju26wds9jqt3DdOtujT1nvVuj3djuu6uturdXvR3d2d
3r3vTve3e9u66dG6jdV72Ri69uoN0St3N1HvRO3VO96h3vc610xXe3U70x3od7Pae9mu6ux3tnvc
nY69bve12hu470Lu72d3vXd7173q911G6d7u9jrdDvd23e3VLpnu72Ot0ul072F71kuz1ul0ul2e
93emu7r1ul0une67dq6Pe9TvXqa3pvWt7u971ve9b3rfx04dOHw4enRAcBu4d3SqSHIpcVSUA8Mp
rE8qtUWRXrxZFdvG1HeRTR7R5D3D2DyHuHoPITpOp4nU4nqeH0W277muXOt85rfftd0CAYBAsBAE
DgEAgIA20WjbtttotG3begWAvAep8q7NVI5TRSyLM7IzevFkV68WRW8xtR3jiut64seTJpzVVAbb
aYnhyLb6nx6W27ORbfk+TqdTqdTqdT06bOHx8cPBwd973veqjRbbbbdGi2AwHU7Ozmb14sivXiyK
3eNxVakg8x5jzHmPMe4eY8h7h5eCJjpOnbbTpw0eHxw9KUps2B3Xfb2ZmYSkEkkszMwlKgKAoDAE
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
Trrpd3SRU4yuorOmN1iy7CuixXbjdREV1ddcu5dEVdut1y5Tt13ddSii3JdqdV3R1dSmVdu3RMrs
u5dcrpTK6Rdu65ZIs6JF1JSRdKdXVK7qXUdFElOurt3XJKduuk3LqkicMdRUuk6ddJWXQrqJKuTp
NdYuuK6xcpydTSndU3V1Lui7qbqZRXcluq7cbqibnVE7OpS5N1upbrq6VOS6nUdUkTp1Mrudcl26
67p11EW7p1OOplN0ya6pd1dul0RTuuXbrdaJK67FdYt3M26izrp26kq7cXU0tF10l1FdXV1Mort1
1Obot26OopldzqcXUzIIR5OijyiEGBFCQIEBEI6ixLurk46ull11dXC6s3dF3J1dLJdczOtyZXbt
dUyu6ZrqKZYuuuu66QWmTFsmFpVMmGFpMMmFhCQkOjE5Hk6QeRIogoCwS7tOoi666ulK7qXHUynJ
1OpdXKa7qcm6pKc6u5SuqWRduOoop3U6TpkVKVuu0nUyuydulKZV1dZ1XKXdRMuymUldXaN1Zuyj
brRdXXUyi3LlOlOrrLFnUupXdTk6zSKXdTp1ci7q6uuTqUplcpdDq6U3dTk6JSnOrq7dU0rlddld
TKIurjqmlXbodXKaVynBdTIurtdTKndJd3XZJTKkrt0dEyxN11OnXdOkqK65LdFRdXbomVOXV242
6pK5TpOskyinUq6xRdXbqlkZllTBSjFXGMzCqVTDE6kpK6u6ilKu3HUpS6Ooi7l1iSndS5urqU3O
rpXXNdRU5IdEyXdacmutElcpu6mU13VOS3UlTqWN1N3V3bq7IirpLpzCiqVkYZFKpVMmFrFqLS6l
uplFd0jrr/HbUutFTyJ0SlJXXZNdTK6uuoiZVynJdSykrpXLl3LqSurt1Nd1XK7g3UVOw3UrupK7
muoorq7dSUyupXaSRU6SbqSnaV0RFFu3SW60S7qbjXUVOySuoqXYbrMksXchbrSTupdHRJTKu3Yr
qZTrq7p1LKu3ZdbkpXLlu4uiV3Vd1CdXaVu7rk7XRYuTpDqWWJ3Uu3RJV3Ka6ppYu3V1EVcolxXR
SS7qnF1ERXXIV1iicdS6zqu12l1FJRO6u7ru6uymV3IgbqmXLrui11KS3Uu1zoiJXdXcxdTKurt0
50klFs7MXUyrrknV2lRcu66l23U6C6usBgwVIo8QIQ6QGCkEYRQlKXdS7XVNyUrrEudV3G60WXDr
kurosU51O6LqU3YHRZldcLqupEUuzDq6VJXcldE5dRXbjHRMqXU11Elp0mXUyJzq7o6SZJUTp10u
UkXd1cuXd0pZyV1dSIrlN2nVdInF0XaVO6nFdYnZFdFu6XXJlREugdSSW5F3OplMpddOda6S7dXZ
UynBOuV0op26upS7q5XbgLosrsupSiu5F1yaUlFuu67q6JpV2V1zqZEu6nFupSnRLrEU7qu66uyi
kqcY65MrlXdldXddXbsW6LsrtKKZXXOnXWZRcina6pbjN1S66pyFdSlrbW2Ku4p1yKS5Ogrql3WL
rnWZUXczXVLupdXVN0C6kpLlyuldc6IrrkuiSi5dw63LruuRXbo6mUuiV1Mq7LpOdEyp3S7pSkq7
mdRMqJLpOi3V1zLqaVOOp3RTLO6nLrk1zokruC6oi65LdSU51dxrrROyK6JK5ct0rqROzpd10plO
3VymXLldux1FJS7LqSinEi6J3V1djrklXa6uoplddnXJkW64OiSxZddXbm6lxm6IiSp2V1FO6m43
UpEV1xOrlOKaupKndXdLqLSXcmjqUuTi6IqZTsxupSndS66ikrk513OiSkrsull3Vyp2GusS6Tq6
51FdcnUpUynF1dluXLu66urqUqK643UlduddkyKJlXbrqZa7LrldRbd3XcFwQIMIPEnCDAREFRhB
EI8bq7q6inXRXLNdkdTIomlycdYnZFdEVLuuThuqSu5CuiSuuL9z9j8n47u/b/I8/dvq/uJKv7gO
1f90dtPkmLSSWOJpcoNs93RdL5Sp7CWNm8cq3dC0qznq4bCtgYnYqCzSZ1NwZhylWSU1rXR0QcLt
TaTrYX13Kw7OoKtFiq5q65c+gfJYtMLWz0WpCy8yUshjtzBeGZk7ENfLnT6YueqS+WNzAs2ldbTV
TY+68RJXXfdbR0JZvNd0Ndt50pGLb6cHyJ3reQ3WXxSoZMO1dVWYrkF7Mp3WPsD11ewjVvX3YsxP
q5o7TtJKjShOdEsMVcrI3dUW327L2BcNtU1HU6XivcwqU5VZx1Zqyd3UpJt4qy5xORqlalxGneMt
ZoJwzNrbrO68skVnbspRmttOSC8udt5q7JO6SQtM3kknbKKWCpoq9K7Xurt58c14DRbqmhasGXzk
Qtz11SRGXNl7tLN4kt86dLtJyl3FzX2ZQWV0u7yNqlea6zamZct7JztXye46fXt9mWV/j+9OxV0v
GjpKXVp77e+V5tB7fJ67yb2EvvvseV93zWbkvcaz6s2GYqfXzrtGkyxcOZL29qwj2HsqmmKU3t2Y
VXRzQ1WbLkkXa7oY1rN1ttuX1LRyvp15t44+tjByLmyg8HVWwQX3Crwkjrd7hvM2O8ZTyc6x1dXy
d5BHvEnYqp7hksXVwqZqqjUuu2IRsIYO7HoqtOLKrcIclCtF7WOje5u8+bJtXbvFSudt1Op9Wqkz
k0XRXbolRkxx4O1Hl0RQiCt05p3o95ykwkTvI7K24jt6JvK5uZjfcJzB6nfaMfVV8EVcquWYNxLX
VRTnkzmYsaRx3GnLJCGSO8WuR3q6g2MvcB7dKTD0YgvZu1vIZ2KhgGvN7KCpzHnrxkVsmKDKrJDI
M7u4co6VXdcMVbj4TNfUnwdChtOrW27mxhxPxJaWq+XIM5Mb53zHVvXBkuU8XK+OCmqC6ZSrucve
0t0Gd1auwZI00T11YvlONGLjeaq7j0cmUHS3r20mh0oOtDp7ELG3TWzZiVvWgybtIrXeS5L0Vh7T
TlctGNvBeZ3Kqmkbh3A4nFW72jGHbyHNhum+4HrzZSx8lipyhWtMSOcRdnLY7iehuRSlnQSdLnbr
7CKvO3jOUVc9v3S4+ZWVrdBEMZ1J0sdPqazAum89DrtINXk2yybzGMbljXuOpTfDpV48yQ2C9krb
zNUZq8p6zcGPWjzt61boqsrnTzXVUhS6UolqYsTczrBwPb2ddRINjdrebVUJ6reYtraurXOLQa55
0q8qYcF9g7ceuCV03mKL5d0Mrs2uHLI5tbvKq26oN2K6SqpdNCjGJiab26WjnK17rVx7K2MUXVxD
GumDcejX3bLLy4NCyYMF71FtZd7ec+4O8yn0HISbyjpLpi1ipndopdW90dWg73tvbOVhrNru14m5
YprK3h2aERz3rvC0+mquh7Vubegmt3sp92rBtdkafbZNVV4K3oLjjUm0FDgbHTIcRl4szML1xIJ4
bwUJvVRrCqe7auM0OWxSW1mPMXKnWUa08dtecQdyl7nRqiG8D5OnSoVtZXEpymbdXrfqNOhaihqr
7kh1jsSvRtXeLsccdBKTemZbVIrujBFHWYQzvI86yRLa7E7uxtZcUVE0NriYT2VOSurmB3cWGOBJ
UsXKxEt7gc6pG7d1SeUFNeqig+fYqsywaWcJ1rFNbJiQl1MUXWZfcTx1i+0766xXhoxbyqxczAuZ
TlW2ylYq0n1l4Huc7q9sc8fSSg74Ip3cXSjMMHRFE1oe17Hec1Q6ZWRKUmNrrEZXU9ZjO7t5txHL
Dayoht0yOJPUwatUdfGEi86djbGqbBJimB9enHbhUk63i3Fq2qzJutZ3Tdt4Ht6FSCNq7e+m0qy7
4TK7oe3KGuKDpRdbEad7mZKSucpI7M6k23a88y7zhEbyytG4rw8aCnHOhuc+3MBnOu1CjWxSdDZw
kbuLbp3Ub2aEEXxrcHV1pVXauN3iTKaT6qbFgu7LZUjx9BUmzWaTvnte53Opingy+b009VZZ2tW8
aVXVnJJJ1NPLt2tsd3LQU2m63MeF6cbdnMqI5U5yzjrb3pm27i3s52tTxMZst8z1vczpcKq6WZ1Y
q2OTpO4G1aUeyt3Z05fdZ3r76tH3bvcfvqpXzvHfXma7LXcfqjEqEZlcyR2ZihTEk1ZHshOUlG8d
CmqunVyLMs1Vcmyc2tOdo01VNkjEy6mbenNmY5Xb1WnV4ya6s1gxvtXVzKlCudKVzaCx1H2bu7tV
ddLuX2k7qiRNzuc3Z2bjznMrazH0gmZVXTTmctu+6bndXPZnA63z2ZSSpio+2riHVUvN57N3sVE6
8ruu+1uJnoKqm7tdmbUqrnXaO64KUzMzW5dpSWbl3j3U3z+Kt8se7jXffbrzaFTZBYLlZmpXa7KJ
zBLYnX3DrT55d9xIl7mbko4qcu955mXbcjWa7u7RzpmXYOur5xvCQS7ttK+1Dc2rV1ZN6S2ZmLrv
u3JBsdJLs3FmsPuzCcOZhoinK05eEg3kyr7t10KjTVLaw5eBcjl5ImInIkClV2d18s7q5Wkbqieq
rnSJZLtTldzburc24wyTt1d1XZzzs0nNMJkq13WMHYt3dtJ1jdWS2ljJ3arIu3ZN275XI1JUnZm7
uYDdupebzDcZdVe6kkk1yUp919dHauklHL3uvYqvEgqqSMXnNTsnVmURSUtrKimLc2u7mkpyrMnc
+p9tVeO3LfZu6TSmyjeGOTdS7lV5tNE3fRzemBcrTvDjpWdeuq11bb7iD3KXXLt7rXHqqyXlLnJq
zlN19zw9AtxKpr7Nqtbu93dV61T2NdKTrO6rjWvXV8uzt2c62+o5kB128rpWPeXI3Zq8Sx511s0m
Z0rsu7DzBsmwTEKSk3EscvIc0uqtRsTMSu8pSJ9mx7upSqydVIm7FrpVHMy0+oVVJOAwySqnOcO7
kgszMzLttPdnKVuVWrud3TFuVuUUMq1MVS2lbBrCZt3dk913d7ddV9ApGxe9Nd1w5zXS7lboklrm
o86aq10etrZ12NzHHRMcompnJAgum1BdyqczrtQkve3hLyueDYu5PXk6gQe7YTu3e65Uym+7dHNk
5lVrVSrkjdVUqu7cb3d3b3NnIPs1JRU8qQpl9sPd3YNJku1VyE7yrMKWSqS57ux53Y65yr45abev
qvMvo5u7vTuuyccb274y3N67pd2VSq8nPNdUw6q8Ju02ZMpqOrbaBm5HImYu7dVZip127N2rN5uY
nd5M1PMlzms19OT7MdVdTaLvMT3Rx3JTlw3bysre2U44Y7lNyXd3d5xIdLNx5tU+49snINs9cqte
y7J33vAbCSQQQQkgQkkhAhJIQkgSQhISASECQAgSEhJAkIQhAgQCSABISSQJAgAAASEIBIABAhIS
AEgQgAAAEAkCSQhCQgEhIQCBAkkgQCBISQkJJAJISQJCAEIEgQJJCSSEgQkJAgSBAISAQIBJAkgB
IQCBJJAIEJJIEIABJAkCEIAEIECQkkhIQIASSBAIQhCEgEhAIQAgQJISQJCSSQAhCASASAQkCQAA
AgEhIBIBJCEJAkISBJJJCEkgQJAgSQkkhIEISEgQJJIQJCBJAkkkIBCQgEISAQgQgECEAkgSQCEk
hCSSEhCBCSSEgEJAgSABJIASSEAkhAkkJIQkISSAQJIBAkgSABAgEgEhCAABIBCQkkkkgABIEkkA
JIQIEkJAAkgSEgQgSAAEIAAEgBCQgASSQCEJCCSSSSSCCaM3CQ7ztVJiSLsmOQHDyUWF1XOreVbi
u8oitSgO7t4e0bVCmyRiaqpu5gydmOV29dt3b4GurNRKj5bx1lShXOkZzaCx1F2bu7tVdRXcztJ3
Y0ganc5uzs3FnSDNN4+kEzKq6fOZy277puce57N4nW+fTKXKmLj7auIcal5vPZu9jonXld1XnJ9H
WwUajq32Ydhq512FmyG1MzM1qXaUgu5V491vW/inqWPdxrvvt14dNTXBZMmZupVfblE3hluHr7uN
p9au+4ky+vNyVdIyXe88zLtOPnmvLtYM6ZlWDzu+cbwklm7bSWLju5d2rsmtBTEvNVX3Zcg2Okl2
bizWHvZhIy8w0RTnXhzCSayZd9266FKNqrVZlZgSQzMkbEbUSJSuxe7rp93ZaSFVRPVdxOJZLtxK
7yXd3JWxhknjd3dX2vtzSd0QmSra6xg7Fu7qxvMbuyW0sZO7VTl2bJu3aUxxSVJubu7lk3aqpu8w
5FTqrzUkkk0o7fd2UeqrWJR1O7s2FZnIqqkkF5yU7J1ZgqqSmNHIpa3dru5rlsRzNjQ7WOy3tOZr
3c0G3khusqSTd5dyrM2miauJzOmIpUneF7SFa9ZrHVpvhxPcpVNdvcsO8bsF4r5yLc6PNfNHFAt1
Ko+vtO2nV7u7XayrcS2UnWd13JifOs5dnZs51t9WVkBfWsqdlveSRqzd51J52Vs0mZFXZl2HmDXN
giyqSkzOT2Zk2jrN2o2JmLrvKUifZsebqUqtnVSJuxeqEVmZifUKNJSAynIabU4d3Lgsy8vLttPN
nSbYzbxNXdsUpWnA8NWpqqW0rYNYDku6snuu7us67voFI2b7pryuHOa6XcrdEktc1HnTVWl8ba2b
djcxx0THKJqZyRJLpNSjcNyZ13GCX3d0OZfTBvTeTxzuJJPdsJ3bvdcqZTe9ujmycyq5qpUyRuqq
VXduN7u7e7mzkH2a0ulM5IqdLdnV3dY0ly7VTTBvLLykslUlz3Z1vu11zl31ZaaevqzMvZJm7sWK
rJxx46vqluarul3bVK7yNbpdMOqvCbtsqTKSUu0+YM7JIo6i7t1VmKnWdO3asXu5jd3k3U8ypsa3
Xs5vsx1RudZd5ie6O2sluWJdu6yt7ZTkgjuU3Jd3d3nEhq917u3WPq7XEi29q4bfbLsn+8APD1K+
2kpXxFbqkpX8qkpX0qSlboV8aFfKVCq/YVgrIV5pHlVCuQr5UlK2VKpfnPupCHyFblKpVgr6iv0F
fhCtEoWtIQ4SEMpCH7ivWKwVyFaCvVQorWkpXSpKVzFfUlRK6QKBuFYQovrCUL9kjtVCuMQlcSlE
Xad5zUgOEK8RX0FYKyFftUlK8RXCVa1tX4Vtq1W/z/MAAAAAAAAAAAAM5SEN8CXKFYK5CtqQh+NU
lK3QrWFaCuYrSFe6FapQvSqFdBXQVuiErkK3pHnUlK9BW4V6pCHqhW4VpBSVyFdYkqq1pCHaFeAr
WhX4qlUt9UK7isqJKrSFesV2kIbxXYV5iuFSUrjIQwV7RWCt1SUrwSN8K9QUlb4V5VJSvWK7ivGk
IeqQhsK4yEPYKwlRK4UK5isFdhX2VJSu1IQ1gkqvCBREIewQIsSQkKEkKeUqSK2oVvFcBWkqSK50
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
UkP9CSIedQQygh9WPVulC/moIerpSKF9RWSXaSqXhZMyzIpL5UEPcUpX4yXnkpvkp6ZSZhT2xU9M
lN8SZipvhTfKTMVN8Kb4UzJTfCm+SJbBOWQnLIS0JukT2kS2KdMKZlRplU0ykzKTMVPTCmZKa5Ke
2Sm2UmZKe2FN8KlqE5ScSQ8++ffm29t7b23trr8Wz5cwfaN3wA8ADIJ2jdG6N0boxDhVeguY+23s
khz3179tvbe29t7a8fLZ6z3T7bbahXhQQ/Mop7QrShRXrKlX/kK0Solaisawr272Zy7oiIiIiI5y
IiIiIjnIiIiIi7uiIiIiIjnIiIiIiOciIiIiM7uREREREc5ERBgxHOGCIxEXOkRFBEQ7q6RGMBGO
XIIjESTurkmIiIjO7kRERERndyIiIiIndciIiIiM7uRERERGd3IgjERBd3REYiIIu7ooIjJE7rlB
EYkjHLgYxJEV3dBEZIijnCIwRERHORERERE7rkRERERndyIiIiIjnIiIiIw7uRGIiMk7rkYiIyRF
3dSYgpInduYIKJIzu3CCiSKOcIxEmIjO7kRERERd3RERERERzkRERERO65ERERETuuRERERDuuYi
IIiIuciIIikxzkQRFJid25JEUQRO7ckjGJMbu6TBiIiJ3XIiIiIiOciIiIiI5yIiIiIndciIiIiI
5yIgxERO65EREGIjnMkRFBEc4REUBjO66YiMkRO65iIjJERcuQQUSRnduQERQRHORERERE7rkRER
ERndyIiIiIndciIiIiM7uRERERGd3IiIiIid1yIiIiIzu5EREQYu7oiCIjETuuEREYwTu5EUmIiO
XSMGMEEXd1EERERHOREREREc5EREREZ3ciIiIiI5yIiIiIu7oiIiIiLu6IiIiIiOciIiIiM7uRER
EQY7ujEREEXLpGIiMkRd3YwQREbnCIgokjO7lEQRERO65ERERERzkRERERO65ERERETuuREREREc
5ERERETuuRERERE7rkREREQXOREEREZ3cxBSRGJ3bhBEUERzmJIjGJd1yKIIIou67ERERETuuRER
EREc5EREREZ3ciIiIiJ3XIiIiIjO7kRERERO65ERERETuuRBEYIzuuRBERiM7uYCIoIjnIyRGMEd
3RRJiMl3dEUQRGIOciIiIiI5yIiIiIndciIiIiJ3XIiIiIi7uiIiIiIjnIiIiIid1yIIxEQXd0RG
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
MsdWTVtRd7e6+d13Mzqc8Y7ZIzWvsffmP6I/1iUSUWoUlSKlRKlqssrZZbWllrLLaWWWWrKy1LK0
stZZbSy1LKQmEmYTCfv3+Agfqf4Ib96fXx7f21ne85z81eDpJt4FewuK8Ekm2fe/D3vAfwKvAYKq
y+6tyTUj8usZKpjMhh+fu31ceZjyyMWSv3ft5mZwLSb8Y3vIzLk8uYln95wNzM4TKZIqRCFuSBwy
T3+8rmu91rWvIloZxzjcd8Y3bcXFqpVYozHn3L3jvPNa1rsi9yJljPvzN+P4n8kKLJUkipUKlIqU
hUqllqWWqllZWVssrZZaKlCSpUPnleZ5rrq8ufvmfm/3+17zmsi8d4GZeFdoivT6awZl4VN/eAHh
/Pe2vKvqfWTLIeffu9yPFk1rWcrZOqOYxyyZrNO885yHih5Yu+378e6V5D1e1ksPa+zjSN6Ylscn
7v879rMzPHipbJqzpmSb9773XlvhHVpZVzGfm79z7Mzk8dZCqm6yssK1519+c/Lf1I/iWJsqK2Vl
qWVpZallqWUZMiyZFkyJkylkykZSolSpUpJUpFSofneda8n779rn5bxKlDn868GchcOaqqDrqLr6
CuOdKrh133z7Pvf2QTh/erH5Uy6rWVkTVGZ1mZbpG7JveRpY83r7GNxbGLCyjncnEEpyMDh+b6Ce
DxZbG3MIe95rUbWLKls1pvexlkTNc/PdW8Tyi0ea8/Ld74xKsywtXGSK14/k/Uhamy0stqWWqVla
WW0rEkipRFSolJSVKJUoipUKlSKlBUqRUpHv9y/3jWs+/VY/n8/TTpIy3FfG8uXtEbKFYq6tdumN
dXXb39BO6q1at/paP3PdQqtYx77X3cZn+qIk48VKqWyNf3vl08iJOTwmT6EyEL90OvvyHZwmZ4YD
9zf8d+6HmTm8n1Rqk/t/c7fy5c8kyncYKy3JVyw3MeUwbsX+Ag94wWALq6qgA8VfWZV/Zq616ehu
vaZ69e/j5+Vep4p6qKtzEz8/a1rbDKPxcrJvbnP6SP8QskstSyrWVlbLK2WWllZZallbSy0stSyt
LLWyvUAB71D1D+MV9L+t9S/lfyv0EgfLzyAl2m+2nmdBJqncq05e5wruC7X05Vpy9zv3vQMP6SfW
X1kZjB+/jf23xaryxaLvE53mpYqTdGPz8vO/PMp4xiqh9+37xa2OWasVSxYq55fz6+9t8eKlXyot
tkq5vnmd+9ZmOwdWbxie60xd395J2dJnSEM42RhO+HaDMzpknOzJXnm62mKcsnLqtZ7vn5b/E/kh
RdltLK0srLKrLLUstSpRKlBSVEUlJJKlJUpJSUlSkVKQ3389V5+Z9+86z8817r3+x45xV7m2EMJn
RQ1L06bx7d9Z1U716b13eZ38CIQ/ZEk/j9sh9R95vvOSraqkvuvzMzNyPFcuKjKmOf18t23a7ieV
lHc28/du3WsavgcqdsKr33kbu7u0xQFUqFCgaAsV738JndLmeu79PXZu5Qy67vlcO+ItTVGa/Pzm
reTFmWXMlLC/s8BYZ5DIQyBgZnv7dWf2Zj+SyRKiVKSkqCpURSUNlltZWVSysstpZallSVKKlQqV
IqVEqUnv59+6z+uZW/z4YLX36s/XuUNdZtaRnVztV3Ys1vgh22/LOOmnGc+mvGu3Ll0uOsCiu0U7
0Eb8d6tr4dx+H5eflPvvTdZI2+a/H8j8349+mmmi/2oIdwS507ZVmV2yst85dr+W8bXflyMsNVi6
3+/6PPczPHVROr/c32byExtzJTLve88+7eqr5kmmZkCSb7y3VSvLi4uYyqlWff33j363z2+1usYy
RbVka7b+d0tbTltkeZ5zj9Q/0JpFtWWVWVlWWVllbSwqUhSVCVKKlQqVCVKHh4fL+Wv28K7+ZdV9
AxjzPT+dm8TN3lncHmc+fG3Pbffbbnxrz53LXOfPsJeIJd5rh4Yr6FJPl8tqektSy61pYd3y9r7y
ugWWVRlJrGTTX5vDbFm1kyyZn9mc983b5IOestktIb5YnFLClk1hSnxHzasJAydhk43IwyH+N6G2
GTSZmvQeiRbLpkVfdb5r2dsvjvcZUrTEr3vOPCjvTIMpkyTJlVkyVkyallqWVbKy2llqWVqWCRUo
SpUlJUFSoVKk+3fv5/PrM3+XX13Ca1a8EyburbrK05MTcxKtyXWU5ixRzEvve8PCAfwGve66We9V
D3un8V+zww7kgZ5CYQye7O8f7qrvZQ5LmEEumVYzGUo1i263mccn+yWPK3Y76999u7d29yUITwks
MycJh+75f8f3yr/mRJEk9SfU/iyPOe/XMzNz8qO39WVYwDZ/X3+dN3XknfJZgQhShCS2f4v7wP08
DzjH11pk1Ufu/3ffzWta875iLY/f3/E/0SyQoqVCpQlJSSpQlmRLJkmTJLKZTJkMmVFJUKlSKlIV
KhUrzvcvnt3+/0oXS3s3NbSqhn8yj/Ctx4rhJtkmUFKdznqV9xPUF1O+5gMBAXd3d4+AsWLAFkSc
q97KjrtyuNlXdtyvbKu2VbtlX2yiu187u2VdsruuMq3bKu9lW+9ld7Ku2VTbbu57ZV7b3dy+2VXt
vd3Pttsqr2yq9sqvGytb227ufeyo7Qpbmwx3MmLJ3IrIkxEekSJG2lBVG3Msxk2QAY7ZjMVpSSEl
kAKCkpEnid3NaJLa0iRJataB0PWwfX1IkQlq1pSWEa0iTiXuVlJScFhbb3MjIqsSJEmJ6lhQfeZF
VYCESKsioiIJLVpOJzysBJZKtJQiqsDgl7lIkQirWnEvXqRIkPW2gvNaB7XgVx4t1vqzjxNlvq6g
7w0iRtWxJScResItWykSJEMFChSmRGHvesItWwEiSrZFdzUsr6xFed46y3V9RFnl4JRoCTxO7qko
RVrQMRetIkSVVZQoW2itlVkpEnB4Lzu7ugw2UbJQ4KS0q8yWRVZSUng1toPvMjICqkFZFVYkSJKE
qvg8FC0tPdfJbIkSUjVk4Otth3KwEngi80lk7yqFBD3XbAzLMlyAUtJhM8fJfvWfTzzvbu955fpt
Fd1vNrLvtFbsEPmFe7GDt9awyaILZYyumbSiRB6hmYNmx4O8xr1EbCJgJuhx7dm2O9y4ydHz2rm3
mKBbWu2grCCgzjXKC3ebeoi6m3AVd2k3oPo9QLV3eyPe4ck0LmdZl3pphkrph5x1pW2ifJXS0Tcw
lM4900Xfa63dmjYWiR2JBI7ti6zNhzNs3o28eSuOqWF1XqnmNy9SbyrWXtZ2hiWoC7fWLJO7hZG3
3bVaseE8g3tzo4Ys0ZeS7PWt5oHMvol0rNgPeO8IKpaqZjBVLz7dD2cNlPdXTsBVMWue1eHJ3U82
w3V6n5jcvUm8q1l7WdoYlqAu31iyTu4WRt921WrHhPIN7c6OGLNGXkuz1reaBzL6JdKzYD3jvCCq
WqmYwVS8+3Q9nDZT3V07AVTFrntZrmvfvZ7ESakTpo0U+HpoaOGzDDDhswcNFGjTYbNGGGHDRs4Y
bNGjDDQpw2NmzZs0cFNmzZs3Guci223fIiL74IBH19BfXyC+31i9+ky88eeaA+vkRffBAI+voL6+
QX2+sXv0mWur6vJw0cMMNFKcNOGjRsphoxEW+c1rWta1rWta3ESZIkEP0iP49paP8LI5Y8/Pv3cT
l5VKxerrTGm/7GpN2Rlh6Wd35qHbNW2VVtW15r+2/vKzxJbJvvM0k356XK0pZXtXX985HLajlFsl
z78rcd5jF5ctuUuY9K4sNyyql5kZYfM8cbic1lstsu1txeAu8sgslZMpTJhWUsFJUVLUsipQKl/v
8+z+/f8e/fg1BOrq29OG4v5mY73RELrUaMdKVHUee53299vvb739kJo/o4/Mf4VD+rbH5+/evE8v
ipcw9ve6/rdxPik6/vz8t22tvcZGU/JWtNSs/u6eattt8GrEc7++s/beD8KeU7YtPz31zZcwyyOU
ta29++t4eVFs6qsY+LGPbceMtxV1Y5S0yyZX5179fczOTtiWiqrX7u6ZmP8h/kSKipYqWQpLCFSy
KlIKSxFJYipZP83t/O/f3mvv4HP5mG+3jamVvWpNKrltCVe0My+jpNKnbm61rO+dvm5+ySTw/n+F
if3MZUeXO+/lu4nKivXbjGYw07baq2y+lg/u7e/Hx58pyzFkfZlsnnrvDZyh/c3xa2/CnikreUse
5/S7bhayrZMp7YmUcrwpv19fPczOJ7PblipVmbxNV3XP3aNWTnmmhVTPj9/fz63+Jvxy22WpYs1L
NrLJZqWVVLMstKzaWVszaWSzaykpLCpUNf5v87/bz85r7+1nP8912+983nmPI9vtazrlvkROnKdm
49vlxHdOU7N/D0WleKR41pkduVxz6ca6663A8LOMmjMyZGIHaRxjLP8yEnGXSUyAk88DlvebIvTr
dM47Xyr8fw9vMevlrphvwCnHe7lGgNClkKfLz9G27CeTqRz7y+eb05pTpU4slWHbmMrMkR1Yy6pa
kz695bvVdWeSmLMVGdrXXfn169NfFXiKyRkyrJismLJmpZrSzUrNSzVLLSzWwD1eA977+n8Enb++
f1zTougyMwyso/0qW7tb552vTh9x2p073h07x2p3+yZkz/OTJmf6Mn9tjFxTFjMY/vz83/fmZniR
2yb3xzc5X6/0MmLDnrX+d+n2v801rXoflid81bq/rWA5CE1hbCT+kJLs/ev9flXuSdhmZH83++/m
/1/CSJJ63ZLf2xlPzned/beHk3Y/i6sS2S1rv7vy3h9SeZMX2MmW1dZLRz0wZVec5rVv+JBPdf5z
55r9/xed/l6Kzb+uNNRLtrO2G66SFNvO6+3jXTTnM8snXN4100/D3h4fh7KIrwuh6gK8PgR7v9nH
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
mDNG6N0awYJBu54e94DL8vHzFuZgzWtNaa858++a1kgbE/3f8hJEk/+pIUzStBXvCtSKK85Uq8YV
oBJWorJrCtuPFpYzLMsxlliK7ukxGJIjc5BGIkxEc5ERERETuuRERERE7rkRERERHORERERGd3Ii
IiIid1yIiIiIjnIgiIjE7rkEREYjd3BgiMREcukREUEO65RJiIyTuuRjBEFHOkYiIiIu7oiIiIiM
7uRERERE7rkRERERO65EREREXd0RERERGd3IiIiIid1yIiIiIu7oiIiIIndcjGCCIu7oxEQRERd3
YwERFDuuRBRJGI5cIiIiIu7oiIiIiJ3XIiIiIjO7kRERERndyIiIiIndciIiIiM7uRERERE7rkRE
RERO65ERERETuuQREYiM7uGCMRETu3SIwUSXd0RFBEEbnJMREREZ3ciIiIiI5yIiIiIndciIiIiI
5yIiIiIjnIiIiIjO7kRERERO65ERERBndcIxEZIndcjERBSTuuYwQRRLu3IxJEUQ7uYxJEUQ7rkR
giIid1yIiIiIndciIiIiLu6IiIiIid1yIiIiIndciIiIiI5yIiIiIndciIiIIx3diMkRGJ3XIIpI
xFzgRFJiIudIwUERG7roiiTEYu66IoIiIndciIiIiI5yIiIiIndciIiIiJ3XIiIiIiOciIiIiJ3X
DEGIiJ3XDBGIiC7uiIwUBO65RBEZIndcoIiMkRc5giIyRd3URBERETuuREREREc5ERERETuuRERE
RE7rkRERERHORERERE7rkRERERO65ERERERzkREERS7tyIgiIjO7mIKSMRO7cCIigid3MYkjEYu6
6MGIiIjnIiIiIid1yIiIiIzu5ERERETuuREREREc5EREREXd0RERERF3dERERERO65EREREZzsQY
iIJ3XIjGTBE7q6YiIxJF3djEBERucgiIiIiOciIiIiM7uRERERGd3IiIiIi7uiIiIiIzu5ERERER
zkRERERHORERERGd3IiIIiJ3bkRBERG7uwQRFJiO7sZIiKIltrVbfr2/DbV7srBXuK+QriK+Qr9o
rBXIV8xXQVyFcBWCtBW4r7ct80zQpSlKUpSlKUpSlKUpSlKUtaqKioqKioqKioqKioqKioqKioqK
ioqKip/nuV++iqdIVErZKUrVKUr5CuSUpX6JSlaylTflW+WY1iIYylJXqvSI9FRVXrEZEc0j2iIa
UR6L3iId8RxiPJKUr7JSleBFFfFKUr+UK9EpStYj7pSleyUpWqpVLxSlK1FbJSlbkUVkRoK71VFz
rKvCpg/0U/0YP9hoYNGjJgyZNlJsybMGTBg2NGjZs2bNGDJZi2bKYMmTJk0aNlNFNGWjJs2ZNGTc
1bMmjRk0ZMMKrRkybNGzJtq21hpbbbcNWIz37BA9+EAfX0SQH3yiQ++wSfZdAOvkRn32CQe/CAPr
6JID75LVW3e5baq7mDBoyaKZNmzQHg7+T+QkgP7v+b69AIB7ISQFQgB6SNRXyhUSvgkc3+wBY5bH
65b+72ANGqzb/bVYNoPhXl/BnC1Lu86h67S2qYBvMhLTzMzQwrqrscXtVtUO417uLdbctt3fZ3uf
kSf7CUEqpUFRbUstKy1llqWW2WW2ssrLLSytLKrLK2VltLEKlIqVIqVjP35+3Hv2vszmuauJ39ub
Cu3+WvKrZa2KlhiJIO1TVvSqWFok/skiJIzpaXePp3TLWDCr7887zFtcJnrqMXk2QN7nbLqBbY+H
SAzX2b8zFUnQyyk573zA4Qnvr6q5PQDU7zxx0y4/UP1IVahUqRSVJEqUyysstWWUstSytLLUtSSp
UhSVEqUipUSM81+97ne8z6j1fEIrr/Ub/YTz0XV5q1W3Tzd4ovRSudzt88PH9qTWpHXxPjt7958Q
JmpmPbbMM3c6YJSu4F18cvW23dmy2feW+cy8FrvXCTuLTgGmeXmbDesI2B0O6us5cfXWWGrOTt9n
32MY/Ej9SyRKktRJSUipUKlSKlBUqSpSFWVsstSy1lltrLLUsqUoipRUqGuvuZx3F1nWM/v7+1da
yxz9/AvMQIzNNidu5L4sHnxoJncN82Dz79APSe7gw+6xy27qW7x+bx7XLeNV25+wvSYQzkhvy/eh
dU7DnaGob85Qec7O2nqD9XoU763x9yvialFD8z9BLJApCwpFSoVKkVKRUoikqEqVAsUWoqUipQlS
ipSKlSKlRKlQqUKlIy9Jv7a2vuvSf1dQPfOr1d2Yr7FSzLzgeut7Ri/bJWo9cgnXW9owzXK38PDw
AWiuqiT76GfYUoTemET1kyanMZsMlhCaHm5ye7hCG507npgGZZulwlhSWTLCGu2zJ9bLtw7jnOYb
5622zs1OHWYXOyZ289fet/Ik/SWSJRUqRUpIFlrLKtLKllZZbWWWpJSVKSVKkikqIdZ/fz81lhjG
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
mDRo0aMGEpgZNG5zd53edXNxdZ1nV1rX+Cf/eIQh/xR/pIravoK+w44rMqzpw6XXGZtU676Zt36V
4Vr3rsKYt+S/J+W/Hj8PUPtJox9G9+5vH7lK/ROLINhm3p07uV6CiXRavzy3vKG9akISV8z7w9Sl
L3WumpNYSXbnzz3nLb3QTcJohot11Zwbbkmt2S1Iz11mZUqi3nM+3bf4T/aJUiVEqUqVCpUBUpUo
KZVpsmlqWVssrLLaWVoqVCkqJG98x7rVv7+7/Zbe6/Lu543tK1uZ39Zj033ZbeY1Zb02fwAA93v4
DBVUJbaSa0pZVGflElPx77P0OJrafVl/O+K+9gZBshE/Of0ta30mocUtuOc++67HFS1Cykqm+Z97
mMY4Gs4nb+cwaVtWFmFLZiyY5repqobvKz7PJpuxuk1SYVLKxjnmk3Ya3iXj+OgrCkyYrJismFky
qyY2X0vJf4cL/rzL45wiRGfaap0jfb/LD2bq23l53G9c7nm86/ZEPz+nbI/KR+P1rH7+ftujhtjC
LcZ2132OGbE5ZGaWox+9tWsmlS2rJtVZd1pJOYYxhhW+ct0PFPUGtKsqt+fjxvnxX6knyyQuPwdI
3c6MLFjFmMfd33GMcm1gZVM+z99+28adYkVfzGMW67zL9ST+hYiW0VLaWalm0stLNpZqWVssqssW
WpZaVlpZtLNqWoqWVKjf9+37zX97Ov7vN/2lz+6w+3zPu3ONV1HKVUxRWXvZupE0qpCisvezfw97
wH9ikNLH6W2nFglkGkM99fi3QPUPKxLMOZc/Pt5t5I5c4wktvbrFt/TQPuXJ+vu99BmySlLS6zZ/
NuAj8xu8WkpSFKSXfavQOPgJalLQKsK4Pr9jLXcXWMY3JrTA3hiTKlfmve5bxFsKzrnNeexhj+h/
SQspLCVLIRZVLNpZqWbWWWlZqWUqUipRUshUsiZ5v897+3jeN/mP73sXWv91Xg69Mcot49OPe20Q
28tYdWPe2/ce9+kk/vltg1jEks86/0kSaG1irlYp+/NpEmtSt2dq2TNQv7plbNKtS1Lr9YZqmaaV
ksmFkmHdY/cb/P7GMdTllsNUYjucxbFsWpPa++3729a1rXVsi2KqWrNY+59r3HM4YiYsS/vPZdxn
PMYxwLZLUr+E/yVIlQqFlSzaysyyqWVlm1LNFJYipYVKFSiKlJUoUB6veFD1EflQVfvzH4X+7n1c
Fat7f9iOXK32942dcswr29O8veNnXLMP01rUn2swP47OW34ubdw8vNXeHW6WSop1gqvz77mcYxjH
Lvlkwoy1z9u221SrKsJfzN93udXWtfp3ncSMWWrV/O/m/nCT6H7yq+J4yRLGhEv1+Pp6T1kpYW2j
ffu8zNtrVmLEd5673uY9MQtSrVirLnEfmvVb/Q/okVFSwVLKltLNaWalmpZa2WapZtEsKlJUoVLI
qWFSxPz81vGM/n7+2u/Zp+yuGjuXLrrNe9u5u3ddiys0tXZ647y049Rzne2/SSTXn8mp/EmASfrL
qSiSwfr/Efn9sAdQNd+3z37IruoR+mTk76/PNuRbDfGJM2DFxm3DFi2S2Y3rXvs5zniGrI1Ytk4x
M9+03tWKxZF137uPtX6kPqkD5Q1hOpPxye8Uotg2Rf2+9buSTfGBbamvzVfwn+QqBZCrKrLNqWSz
VlZlm1lm1UqKSpFJYVKipSHnvfefmPq4T+VKxl7n9srA1YQXEFYbvawarCC4jfjr2pIc6qcHWIh1
rpmuaZWmTNOetzueZom2Kywy6c9OvLfOmZ/J1siIYgkfQ/dvUzVjNl9+ftupDV2qVZGLzOH3N6t0
kxtaxJd/hztu05ZItnMc17mnEtX2I81nH61E3ZPrI3YY9/r8/Ncz7eMY75YqllUpVvLbqZMFMrMW
0TFjFcb59tjusYx+z/SQslsKlWtNSzVLLSzUsrZWZZrKSyKlhUpBUoVLIqVHMn9hz4cx/LSSPg0P
5TlreJtRsZmUdc3Kt5NMt8JmV2yblXMmmfe973gB73h+97wHr/1Akf5i9v+WFr9x/n+aHFDWLcGL
VR+Yr+35tbvjBjOWWaYq7y/s8/y3jalLIeskZd895PQREpbbYm+rb0nWTdRipaMFnFTNGcMKsY57
n3O29hyozRjrLIsv31u9Zt0k3Yn5rfWpG61RbDGObr+kj/IWIlqipYKy0s1LNaWbSzaWalltSzUs
2pZqYypZllbK9XvAUPUKHq8BQ9XZ/VMP93xn4/zvGshudesm1qozFmW3RK3Y3yl267smZblErdj9
vv4iQiP2SE/pJ1/V5mrGPvsPrdSRoFLDIgfUVH9j6T0tAywaB2v0cGLJSkhrjfq/r6t0xRKMRSjZ
xbXNMuW/4kSJJsRm3bq9wxjUi5+/zHPW8Y5cQuMSR+zO+exjG3PzEcLapzfPY64nJcYwlWTtkYx7
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
20Hf3RcUKrcskZ3zzu4Vq3cPllS75Tcuz1VdG74ncuzz0ihVYDa+QP313eg0N3oS6k9fmKA2fQ79
pWVVgI/T4cPKpCUnSA5HTrxyOtwNZN0kB7sLhANuqqr9u3zu3d2XwpD4/ShrVNmG2b3Ou7hGbtY1
uRXW5p2r9xoUltVqV1uatq/ciHe5v74LLYaIa94+1779beTvlnPt3OgbW8+eu7cxu7xv8zr5dy6+
69tbNqpWbu9e+KtnMLqHvOZOEDhbQ5rVId2Tv1t8T6hmdtDPrqfdyPboztyxo6z037H9SSeHZUbr
DXWy2dzt00U6w11st2PQ10h5VyTs+ga85nPt23mtXn33NquQ1w1t84c520Lb2YPmub8u1WeEDWHn
vtTnvL0Wtym5EGgAB58s3zhhS3WvffOhvQTbfKYRfw3ECKm/FfZnGbxG1u7XPDm1CaIbxbadd2Zd
PnSDeLbTruzw+8KqnhG5Q9klhbOd9mYQPnu+ZVPfOB5ryaNXfHWTYe+XGKpKTCmvPitned3UWveT
ALaUDa6fbORV8NhWn7jczdkQ0OXZo71K9NbFnOjm011O9Na1nOjVj4VQ2tZlbu5p2TpAnIb9mmZr
ISffZ73yKs53xPADu9V7gOAd9IEru+VICpbPakMIAr4rCsVbu5r91HeGaAztuI9dVd3X09hY344O
qcLNDBBk2qzMbG8qzFHtM1RzHw3nWY2/fPr7+cfH5jOxtptt17bwm2tdta7a12Ndjd43vW7x7enu
t5MOvdr3j3et7TNu2t9712x7bWu2tdtaHFLJe92VV7ZVe7Or72q1e2q57b1WvO3KvjZVe2VXtlre
7bre2VdrqrtlXbKptt3c9squ2V3ecq7ZV2Mq3bKuXlXbVa3bKuNlXdtyvYyr2yvG473GOOHDhuuc
9TuHG692943vG94229c73je8b3jevex7jJ4bfbBgtt9rCVvicNG3lNB1XtfUoi68RZaUjAoqNQMS
jS0lJwa20HiUKERW6vqIt55KyItRdXgV14ixUsiLdbuqWUpEWJ5WdbeWXJt9XUd3dZacSiUKBQKH
KqgkaWkpPEqE0KqwtpbJSeJU4DBgRUXvWPrd0sI1vq+oPPJZWDV1eIlK88qWWDK9qInWy3tnGzQL
b7Xprzwy31nWwYTxKgcCGC0VGg9SyFJgubbXbypQ1NZdXlEW88Nt7XUoidhsNt7bulvLONXtbuqp
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
AgBAHAbu7JFOuqkk6SOddVLtpTj0JlasuAlOHVMhWPls3cdlzXm8X2WnvSN61bcO5eoejHmPFOJ1
Op0+i29TqcO22nDttp1PjBopTJspw+Onh8X31+9jeftSSBymrmTZJGBmN4ns1ZOWzdx2XNea3z28
477W+JxMnS234yW27T49badTqdTp0tt0di2+T/jkh/SEhP/pJRT1SlK2SlKxUkq/fEQxj8SKK/GU
pWsoVPwIorL+8KiVl+MpSv/JSlaLtJ/QT/6WVItS0C0KhUqi1CxKiUiNCoNC0FLEEKCpaKF6na6m
lXcjrklTkDrkpMs6TLrO6uWcMXUUpV3CbomRbli7cp1dKXSCLotddHUUlFTozbqd1dy6nddLJSVO
6m5LDq7K7t1sTjdF2lFLpdRF3brRdXHSSVd1nV3A6rrmdEyzurk3XVduXUlOjN0Xd1id1y7o6myn
BmuiLXLOLqKZRTpBFdVy6XK7l1O63SS6STtdMrruiUsWV3Vd0E11E7p0dFru6JLE4wwm3Uubqzo3
XJlRd2dcqc3Wiy4w3WJzHUuXUV1yHUyixOl1JXcXV1yF1TK67q7hN1KV1zLdYru65XKV3VcmRF1x
Jp1Xc3WIrldrpIW6ndF2UysuururruXS3OsTuuRUly5UuZTQbrlyu7dFyt3G6u5qTqIK2IFiWoqL
ULS0oKClQpYip2664daUi5XXdXSnEtIwQQqjSigqCNQsagwYJaFoqNFqBYoDGiDGlg07q6XLlFJT
urtdTR0u6113Vcs5dYopuMLE6ulFJXKd0RWdjruXS3TqIu7XWi7dEdWUu6XWLkpWXYnUspcXV1c1
1duC6kp3RdLEld1dRXXCXUu63Il3VyizldXa6ouoslulcpldrk265blLt1dlLopt1JV3TrcnLqSp
dExdRFLuuXLu65MpKLk3XUuR1Nydbkubqy6hdJJZKXddzq7q6sXSXSXU2U7qnG6iu4Z0SlXdp10i
nTdXbinW5crsoru3V10lOrudSUlcrqV24NdRXd1ii7rqdQiTdXK6XLlkuVdcZHUpTmutcuypK66Z
rqXOqSu7dRTdg6EFIqNKUlKFUGhWFIhaFOdTK7t0W6ujpKZaXdXSrux1yXBXUyuXLLurqV25Nuoq
u6dXV3U3EbqKLlylzonFK6JKXdcsVy6Wu5YW6iJd1rk7q5S511dOu0klzqc6p2ddx0kTKlc6xbu6
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
YLNDetOQrrUicOjm5Z7o7ur4XtZFA5aJky4MbeXvJHWMb63orNSySjgrdUucpMubnFS3N27vRbMt
Ct55Rs5aC7thO5hF9MgWrLNXeUrF5Yh66GiY9EHBbaEbhQzKN+dFdJ2zcVVmHESk1mCoJMvORTNA
gw7sES92ZfN3d3ro9b4PquWszelClTwUMBvKp9LU6ow5smrO0RsW7xJe16N4p5iNPqCqo7Qqi6mX
EKLzXXDDq1SqG9aeeOKxxKfaW0Ly8LMF2gcyRVh5Lty5ret0pUl4pLNM+7VaqOmqllIa12py1mcO
LFVZRLzZ1aWVeRF6+L27Rkfbc5mnGxcvSnWU+pQ7aNHeW63UXU5l2Jt7rdU5LxSblXgZ8R3Enrtx
s23tEijmWu3LMyanzq8oiHrCcYhujImR17Ues4kYt5vajp7eZNtLSq5icLOaYriDdwq0vpxtUFVx
/G6uYzgoEPtKqvhdkyyTpeaZb2XFqWdpt3z2azUxAno6mUDrpasIzAi5gzW2XmLbQWobZoZnYZkM
inVMVzoocvNoLuneKSV7xdTEhwvlk45TjtOacem3MGvOfad2sOzDA9bM2qp0ohWtLqMyo9WoiRuz
dicu5Xizsso23jhsMXK2rsduZ2Jwx9d5LrWdYG6iF3ecndelRLk7utmyVKt5tktWr7rd+jZnW3l5
2S7ud3qt0G60Si+UqF9mVEcCZx7L7sUhSmGluRCds6ycdzaGRGLKMOAlb1YdBRXGaUouNzKsuj03
uiu+iPaVxRc5muODEVy7diNu7W4W7wrbUZOVvXhWuBw7r4wvrVLbzd3q6sT45s19vHnmW3dV13u1
V7mL6ztirtOqXWi/kOHZheZmb93OuvuctdtVaPFhhpbuu7rN4VaV9yRx2ky65bO6MkV3U82qvNOH
kne1GxszuWWil1VpbFXVu7uszdTODeze3snHleN21Nky8cto91aHmXmZFNkqry4Snu2+pOXkvK27
bVdF1VvVUdVmQnejfdvNuuzepOmelVNqtaTd33a7iWZVG3dULSLOy+lUCTuknCRXdVS5mTn2Risw
ltITd6UclrM7u5aKk3K7IVmSt19DqWXhMe8azJmZG463dpzctlK49YpYpvUhU7MWN5jrMbV7r3ou
1Xx0accjyJ1LsXJJmPdmY3mXkepbVLczm5mCeeb3575m3uVx55xccqYXEFzMyZ328CD3Y2lWRhtj
eauTKzZMzEiYd2rp4jFmdA52tN23DbjVacy3mbp5RYmjmb2ZVrL1pwqbaFTrws2Y9st9yd3ivSXb
MMlQZzJ7jZV6mlvZldm31V3Ldk2u3bO3kK7okhRaSm8VWc1RhV5VlvjyIPHlvZmptLUFarMd4jIj
S3TXdzu4r0rbybEQd1LuPbWauLpTroWzmptarwNckTmCTCt5ZtN5kXbpbl7pKYXSlDkS3lrcAA87
3y2++eB27ssd73b3uW5ld+73mbZ7Ohlio90bmIndJ0aTmyb280e57zO8WJu1VkGq7BgxtITMFZg2
7J3uKO9yFnEVWp7h1W91HevMOZeZl5HsOXovN3bsXmKaZnJ69qhu7mHqpWS2W293W8xMo7xzATpt
33d1yOS3VE3cZTczM0kwyO0pKrMEmJS1ufKbE/vksz7CfrTixcroQnt2M5j0lHnuVV7tioeMnd2T
euTu7hSdVeCVXHpICTmxHap3fTY7JKPdvSO22ztczzGR1SciVUlmFGphhcdImJ8pGKprrYyruw9W
q8zM1KdLyJb11au+eoYTmGZkVtvSb3dIM5oF2lVOR6moZvXskaBu7pXdJFmJu81ulhKu1u3SzrlN
aO3inBWNvbOJ87xuHT3XsydmNNac5TeiKnZO7V3VW8XKt5k5tLHJh7djRSUMdV3a7ydGKtqA8Saq
tFZCWkqq8qmS8zjEklmF7rS0bPm53fSpdQdd9fJ0szCu7vtmYtVZtLdtAyS0uh0mTMS7i7i5JJ0Z
yzMR03pWw4ycPd2gWvvPA9/MryQkgEgASAEJAAgSSAAQhIEJCBIEgSBJIQkkgQhCAASQAJAgSSBA
IEkIBIEAkAkgSEIBISQgEAIQIEkAhJACQIEAAAhCQAISEgSAAQJCAQAhISQgSSSAQCQkgQCQCSBI
EhIEkAkhAAhJAIAEJCSASQhJJCEIQJAJJCQhIBACABJJISEhAkCQkhAISQkAgAECSEhJAhAkJJIA
BJCSQkCBJJIQkhAAISSEkkISAAEIECEkhCAAEhAJIQkCSQJIQIASAEkkkgQAkJAkgAEIAQhJIQAJ
ISBAkkhJACQIASSBIBIEIEkgEISEkkgSEgSSBISEkhIABCSQhCEkCEIEIQhIECQIAQkkJAkkCQAJ
CQkJIQAhCEhAIEkhISQkgEhCQkAJJIASABJJIQJCBAgECBISASBJIEh9+Hne/jO97z81YduqFr6q
XWWfkOHZheZmb93BdXc5a7aq0eaphpbr66y96qWqu0o47KLd8tndETVdzvdqrw8cRTzqjdbM7liw
pdVcW6q7t3YvMvUzo3s7u64TqzG7amyZmSY+XcNDzMzMiyRiszJxU3LfUnUyXm1dNhdF1V3VUdVm
QnejfdvJ0+zeVu+fQU8qtaTVX3a7iOZVG3YqrSLwyulUCTmknSaruqpdyaXmqCrwlsoTdhBm2rzu
7ltVJm9WQrME3X2zWtzCY+4HMyXkbge6NUzbRSqPVVWlO5XVbMw6nmB3qarNe9NerOOjTjkc1sS7
FySZi3ZeN3mYpqWVS3M5qZgjfdI9zlt5elnd3dzK2rzKrM3d3aUw1VVi2NpDIg2xvOlIL3ZLxalF
hrau3pMvNgU5827bMeRqs7Mt5m6eUtNo3m9mZdrdLcSm26qdmFG4np1vuTuzt6S7a6OCDWSe42ju
Jpb2Z15vaK3juyab3cO3kK7i0qosozuSu2XZnK8uy9ZKJonlvZmptLUEsysd4lJqC3Qd5nKivUtu
bO5Uc1Hu01ubqLozboXz3Uy+OYGuKJvBJhXda208zpm6U5W7xbC6K4ZiXdmXl9VVVU0nd3ExQQ67
rO6utLLvdvOndmVp7s6CVUe6NzEjuk7tE7knd3Fks9zPcWJuirINV2DBjZUrMqrwbVknjyO9qGHO
Stc9OLsd6jvXh3MxVffPd3jkXMwpV88znub77j5CZmLzYdslMtt7ut5jaR0nMB7jbvu3pkcluq43
chTcy80kznHSUlVmCXEpa77Y9if3yWZnxMtvpa5C6nHt2c8x5x5c+0Ve7dV04yb25kHR929VNisw
SqJ6OG+N7Edqnd9NUsk6t7ukppp4TSPPKjFFyFVRWYlRuGNRGyejKkdU6fYxl2Ld6tWZeXxXSVsK
7su1ds6ronMivInjemju7wM5Si7SFOKci9kzryOF0au7Vi0m4i3ea270lVa2tVZuRXi684qSqetj
Tjb7Mb2Hu7Om7MxovVfKd0SUMzu1dwrual28yFtJ7JZ7ZxaSU5wV3Psyc3VW3ASSaqtFZCTEqq8F
cy7ziYkVmNdra0bPm9nfSqghq6ruYazMK3t+2Zi1Vug7to05LSMOkyZiW81k1JJU+nK8xdhvd+PD
bs5cN99N99tvilKV85SleNfUVqlKV9EpSvySlK0hX1oV/WqhVf9CsFZCv0v82esRwr41QroK6V/a
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
zYzrTjIOzrRrTsmNtUNptnrZsZtm2Sy7KbZtkC2bZLZ20WztrrLspsuym2bZLZ20Fs7aKxbPOy7J
bNs9bO2i2dtFs2yWNaQrG2jG2qLLsvbZ213Oyxi2dtBbO2i2dtFYtki2aI2dIWXZSNtUWNaTGzpB
2XZLZtksthNs7a6LGnq07I7OtFs7a7rG2oxtqi2dtdZdlNl2Xts2yFs2yts2yWWwmLGk1i2esthI
21RbO2utnbQWzbJFjSbLYTbNsnWWwm2dtEWNPG2bZIsaTWLZ62bZ6Nlwuy2TGzp7ZbD22bZMbaos
thHabZ6xrSWzYzbNjNs2MgWHG5stu222sljWkdl2cuy7th2UK02Muy7suy4ztq3ZdnSa07JY04Mu
y7sWHdY04zixuWtO7tnTs5dnSLrTgrVYXZdjLsuDGy7pxs4y7OmtacrbNgtrWisWyOzrQ2LZ52bZ
6xrSWztoLZtniy7KbZtntadktnbRZbD22bZDGzpV2XZLZtkdl2etm2S2dtFs2yOy7PFs2yWzbJWL
ZLZtnrZtniy7KbZtni2dtFs2yWzbJbO2uxs6TGzpLZtkxs6Q1p2esthNs7aLLsqjZdktm2R2XZLZ
tkMbOk52daMbOnrLspG2qMbOktm2QsthNs2yY2dPY2dPWzbJbO2i2dtFs7aC2dtFlsJtm2Sy7LGS
62LZP9v+T/V/8f6L9B9/i/nbrIuZsG2dtFs7a1bZtkxs6extqh02psZdlxmy2V7bO2iLZojbVGtO
z1s2M2zbs2zYzbOznsbariy2E2Ww9stldlsrsbau1pxnrZ20NptknFjEuy7suzp2NszWLGbLZF7Z
dlNYtksuymy2Hts7OQrG2h2dOeGy252WxnFjC2XYHZdnLY05dnSY2dIYxjBiw4y4xjLsuXsbLuxY
d2Nl3Y2XcY2XHZbDhdl2Cxpxl2Xc7LbrGnAuy7GXZdzstuy7Lu2zbJY1pLZ20Vi2QtnbQ7LsllsJ
tm2QsthO/8ut5Y8WzbIVjbRZbCbLYStOz1l2XtjWksthNlsIbLspG2qLLspsth6ta0WXZe2Wwm2b
ZC2dtcWXZTbO2usuymsbaLLsvNnWgsthWtOyWzbJrWtdY21Fs7aKxbJZdl4bLsllsJrFslY212ta
1xZbCbZtniy7KYtmjZbCbG2rsbOksthNlsJG2metnbXWzbJrWtFl2UXWLGbZ2c420zZdhe2WwnbL
YTZbDzZ05rFjNs2M2zYz1s2yWzbJFs122bZ62dnNjWktmxmy2V7bNsls2yWWwmsbaCsWM8WzWWsb
Oexs6S2dtFs2ya1rXWzbs1i2Sy2E2zYyDZbdjZcbLYTbNs9WNtFs2z1YtkrFshbNs8Oy7JjZ09Zb
DzstjLsuDGy7jFhy5dlxl2XGXZd2XZcZdl3Oy2Muy7jO2rdjGNzstuxYd2cWNxNs2MuMY52W3YsO
MuMbnZbdl2Xc7LbthxujGMGXZd2y7KbZ20WWwqRtqjGzpLGtJbNshbO2jrLYTbNs9bNslYtksbai
y2EI21Q7LslY211s7a62dtFlsJrG2ixrSFjbUWzbJbO2ixrSGNtUdjZTDZdkI21RZbCRs6Ssba6s
Wz1lsJtm2TG2qC2bZLZtktm2S2dtdbNjNl25ds2M1jZz1lsPGy2E2zbPWzYzZbK7ZsZLZ2c9ZbCO
y7CbLYStOz1s2yWzYzWNnONndPWzbJbO2i2dtFYtnqxYyFs7ObZ21xbO2iy2E2ztorG2u1rWjGzp
LZsZtnbQWzbVjkti2SsWyY21Sls2yWzbI7Lsg7Lsls2ydbNs9ZbCaxtotm2S2dtBFs0bZ20WWwmy
2Hts7a7GzpLZ210WHdjZcGsbaMbOkdl2esth6tazuWeXpLHbGJw7LshZbCaxtonFjEuy4Nabdl2X
c7Lbixpwuy7dsOMLZdjLsuDFhxlsODYcYM42dzstuM4sYlxjdlxjC7LsZdl3OnZwZbLly4xhdl27
YcbpbDjLjGMuy7jZbCRtqiy2EjbVDONnmztri2bZ5NnSDZ20Vi2S2dtdbOzmsWyWzbJY1ietnbRb
Ns9jZ0lY20Flxl2zYzZdhdY2crbOzzGtJ1s7a62dnNs7ObZ2c2XYXtjbUVjbRjZ0ls7aC2dnNlsJ
rFjNl2F6ta0WWwm2dtFs7a6sW7Otac8WzWXrZ20WzbJbO2jG2q6y7C7ZtnrZtkxs6Qtm2S2dtFs7
aMbarrLYTbNslYtkNnVGDbO2iy2HitOz2ta0WWwmy7KbLYeNjWkrFsrWLZLLsvbLspsuymy7KbLY
eI21RWNtFl2U2zbPWNaSy7Lw2da7GSS2q7GzpLG2otm2esthNjbUWqxjY21BWNtFlsPaxbJjbVA2
GMLZdu1psbZtkLZtksuynNl2esthNs2ya1rRZbCGXZd2LDudlsZbDuXObZ6HndqrZ+f/Tdw7+brj
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
LbJow4ttdGjJyYOTIwaMDJXFtrQpovV46qqigSSUVV4cKZQokkkpaSaKY452VtjKrp2zfPt+Kqv5
ltlzZdvnwV/F/GyrtsLtt+fF/Pmy5LNmVcz+fSfF+1XZc22qV98V/XxcqWXZVzb59PwX7bbZVVcM
36/Pn5ttsq2WVVyvz4o/bMyr+ZlNt+fH9Mq/itTtmZW/X58UX42ZVVVG/Pn3+ZtlXLTts2Z/Xz5+
NZyrlXKzvn6/PmXNmVcbZcufnz7b8YVVVlXbb8+fjK3zM2VHNlfnz8Vl/LOVVzLtt+fSvxfxW2bO
rZm/Piv397OrMuZWy/h9qr8+MqrklVf19/nzMu1lVZlyv58FX7VfvbMqLbb8+34yqwv2u222V+fS
fPtWUqiqoqkiUdo9ZRRRSRJJwm949Fwh6VVUUCSSiq3jhXFCiSSSlRJoqDjnzK2xlV07Zvn2/FVX
8y2y5su3z4K/i/jZV22F22/Pi/nzZclmzKuZ/PpPi/arsubbVK++K/r4uVJdsq5t8+n4Krfeyqq4
Zv1+fPzbbZVssqrlfnxR+2ZlX8zKbb8+P6ZV/FanbMyt+vz4ovxsyqqqN+fPv8zbKuWnbZsz+vnz
8azlXKuVnfP1+fMubMq42y5c/Pn234wqqrKu2358/GVvmZsqObK/Pn4rL+WcqrmXbb8+lfi/its2
dWzN+fFfv72dWZcytl/D7VX58ZVXJKq/r7/PmZdrKqzLlfz4Kv2q/e2ZUW2359vxlVhftdttsq++
Hz7VlbNs2pZ/F+fbMzUqv2vwMAh2aGDB0bKczi2bNsqcGSmxwaGDZwcGSmSlGhgyqrbqwAr2uryp
XtKXoW9r9TU3bNGDRgwZNGBk6MGCdnZ00qpwYcnDCpTg2m1VNHRo5ZVWxswUo0dFNGTRyYZttaOT
J0aOCmzo1u223Js4M22q4FMuE4HBozN2ybGinBlsrRTYypWTRgwdA/2knmR/WSuulTWL0jw2L30e
iMRpF7Vef8fpcY09VK6VSby3y+FKr/CqmkSFsfrTc1i+ihQuQHb4lpGlS+jdVp1tZN5ec69Zd3BS
/jTgcokLuStqOkcy5F41U4U8HF036Z+79O23+n3pt7cmqJJt7cmqJJt7cmqJJt7cmqJJt7cmqJJt
7cmqJJt7cmqJJt7cmqJJt7cmqJJt7cmqJJ6Zh0A2AN7YMB8YAB29q37R206Gz5+suifcrD2XkKVd
93x9Pq9/sZa6aeEv4qFC9lKuynmcmHkYfZGg/4PSlWl35tGGe6LxL2VTC2i+3xBRVoXlT/r7EepX
fG92sSYJ3E/EQ/uiH3I8j/fEH65tttttsgAAAAAAAW22223yQ/f/T0j/TjNyRPMjhI79yPKX89bf
0Vr8az94AJAGQSZmZwj7C93Z7/HXXMzMzXX5ck5k5UtEznmYAJAABIO21eX9OpUq/WnP9Ka1vjL3
5LMtEyrTKzCaVqmrcdrdcoqIrdWy1/Rak7MoFmVmVJVmRMZFGZUfFOqexS0AF/MqhPxFeOSm/FTx
wpmUn4YqfjhTMpMyqfjlJmUmYqbZE0ykzFTdhS0iWwTNkJaRLYJxZCWkTjKTdhTMKaZKdMpNclN2
ByFXldPuTVMp8adOzs+HG+29tN9/Veu539NxTUg/8JIn+V+Vac5/pn9Z/Vy+V/wzq6237xvcSxed
TvqeCcC7E7qm0cufLNc9W7p2W3ItonEj8RO41ZW9favkmuvPzc8+WO8Z3/QPhw+8deNdZ5rkOI6i
xYqqr4YbYcpUosn/2kWJ/CkG+ec/euv3/8NZ49/HPSPvj4vnVR7icWfKDCuP9X6sDX7dhl369WfP
I3l8cM3PO637s23dudu6P9qe2nmmFr0zj59ds7+zdrv6p1TimJqm9OKaJwTs8du7bXLTpvtOSaJ0
WW334888A8/hXmt+795c/dkcOBzhwO66A4yddHfnftrKvxe3643H7ePzjW0Jtttttttttttsqzpp
mFsw1g0ABuR1aresQ63+BmH5Zh1x386hc2fC9l31N5Pxo3JpRzqYn5Udy0WFiqq/kn+om/v8vX19
efr9vX7dcfx1/DrnXO2Gf/IO2p5XVNhPiniu9dLt1lrLWtXumSijiJqJtFRs0bkslhYbknvj05kU
Hh2gS4h+pH2/27YLePcjKgfHbX6oQDSAoJdS8G0m6H0/TRMJ3A/6T/YRQNpD+gd5bJrU1uwuaZU+
OtTKeynfU+NNxP+EnsTATtEn5+ftn5n8TNamJt8/bGsccyITfP23xOpmtTE23pesa5Ik3xlxzOJm
2zRut21nDTbgJeMW2s7q6XZXg+hKR/7Na1GtaNqLX/4rai1zaz7T8L0sThfG1tSyp6rcX1WtHMnC
pV/TVlW+tm2t+K3GyIyJvatqXsSWVtSremhcE1E9yapqmyaLZPqTFS0UxOCV31omtaVlvLFsxX8S
YNEyXBNa/CxN9woyq3HBMjgmydExNVqmJcS+pNEWtWVWyq35OMMmmGkVhklRJQ6EywySVJ/g+YnL
0olE/weYnpINg6JJwJ/nVRNv85JO1VuocbSlXYnfbVP4rI+fw+Xw1+fz9nq6V+N6y6VllNS9LcWh
bDcWRe4srS9L11+25XCyq3FvWg98eu1+yyrlYXqv237v+JXB5dSP+J4HlppMSKj5V7T/MgVPrsRV
6/ZnDz9X2/cvce7hmZmZmOFN1PzU++ntp8KbqcclmtN6+1ZN2hXyprTvL78qqWVPCRpWWX65H/e0
StUxEwsitapGRW1TKGVTKK1lZTBZVSaUyiMpgystXI0kRERERERGkiIjSaSG0trqyoolJJSWSSUl
EpKJSUTKZJlMtKmCVlYCtZGSVomUVrTA5RhUtkZImtWbbXrTKBkasEWKjMtMjG0bEaDYIK6rfGCT
BKJlgTJlkkyTEgh/b1bbbbbb9fnx5X3+cZXe/82mnHGtNOuv11ra/hhhmT/Cipf8dxIfLf8zQepi
Q9VzlWHNyJH6+pEjyG4n6JLGosWKqrY8xuMRmLGYzGIzFZZYZXLLDNkb4s+d+PGOH0j9Sf2fdoaH
1k0NFf7U+FqecjhIpTKbkaUlbqaI/lxGtKX6S/wTWEtZZSMTKV+MjRRVHDp/YaI1bpGhc7pyw+gX
h+r37Hh6+OZlmVmWWMRFzkEREREZ3ciIiIiLu6IiIiIiOciIiIiI5yIiIiIjnIiIiIiOciIiIiLu
6IiIiIi7uiIgiIjO65gIiIxd3REERGMO64RFEmIudIiIoIiOXIDERETuuREREREc5ERERERzkRER
ERO65ERERETuuREREREc5ERERETuuREREREc5ERERBO65GCgiDc6RiIwERd3RiIyRGOXTEYkiNzk
ERiSIxzkRERERHORERERE7rkRERERHOREREREc5ERERERzkRERERO65ERERERzkRERBid1yIMERi
7uiDBEYi5wMFJiIndukRGMQO65FEERGOdMRERERO65ERERERzkRERERd3RERERERzkRERERndyIi
IiIndciIiIiJ3XIiIiIid1yIiIiCd24YiIgjc6RiIjJF3dGMEERSXOGIyREY5cgMRERHORERERGd
3IiIiIi7uiIiIiIjnIiIiIjO7kRERERHORERERF3dERERERHOREREREc5EEREYzu5BSRGIucDBGM
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
Vvp1Ktq7BSU7VYpw3uXLZL7d6m4tc4bfLY9sXnWu6tgohbCdTt2cT6qkbV2VqKuruVpnZc3aShbO
zuYlqhRt7p1S+qll0NzVKlVahaFQlTqwIqlUqdWIobdKg+q701CUIKVmFUVKeNCJKT3up0bxY6yo
1I4ViMm61E4tFurozqNYtFq6Uq1i0KpUKlgVJTCkrNOgVKT6liMRSi0JSRx9WPFqdT4s20KlTqxF
U6qFOrEUKxXSmliMqUn1Ik2gsuNQxYqCi1OpAjFSi1KSOIWoFqdWLFSqUJ1YiqVSksWIWq2NVrDa
1RlyrRxUrnFWrKsyVijKkpHISyJVILFiWCpdVqRCNQotTqWIFxStTOpbZV3cobOJbqq7VSUlGqVe
1qWqdnXtUklbpZO6Vm0kHVbtLaS1KkszKKCSkartTqQ0LKVq0rKQuVtpRujUdVUtgjFqKSxZuLSk
livVukpRiVkrcWp6tWqK1EJXWJburLQlbaJWujsgqkTJRU6ha3MxbihBLCjgVaVqyEjmILKWpYs1
HNSza3b2zu4ttVuYt2lh3HWlbaOzC1CTmpYtToo3oWainRCy9R1JB8SzbV6kyKWHSCluPipLdQVr
bW4txDIxDN3RqyQlqSSxZpQS1JJHQjq1JBbiTg6kkiFNZercV6tl0jmPa0xuEk6UtVHTu7KBWbcE
lKkckkobGGzeBJSyWbhKSFrNJKxahi3dJ1DZvCSUgVmndWzt0tJWqNL7hOFKCiTuaNRxXmaYKCKz
NOJPpQ0lasBdYSSkRozSTJSIWHSSk+YVu3urbjVmkqztnM1OknvNJIQS280koKIB3M3CO6bj4Zmd
x0kcMGhhhhttktumXTabNJNNNNNNNNU6Topt0222yabTTTSdU6qm2qphU6p1TqnVOqdFqm6LbYYY
bDD8wwWGGKDDDDZIfmyW2GGHRaD8w2Swww2aTZoIMMNksMMOi2aCDDDDDDDRbbIYYYYYYZLJYYY0
00001k6OzByaOjg5Ml7vHPO+tRunXvdO1G7oGgfxWadUXmcVVKPNm1qmcSu+uuy22mUynSdJ2nKc
JU0mk0nMkZ3dZb441nec55mOTZwbOylODkwaAgNA0DQNAQS3LyRzVe6MzLvZHNV6wAFl8V7SrJOI
7uwTsTlnaq9wqqtapnOvlctVduVIPMeQ9Y9o9B6x6gK8CSQKNtOE5TtMzpJiJ0dnRocnbswcBoGA
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
IEgAEkkhJISBCECSEkJJJAAAkCSQJCQgSEJAkAAkIQkJJJAgECBCEkgEAkCECSEkISSBIEkhJ+O7
8+n58/X3ebkmZTe0t3Zz3qW66V1VVe28uuL3qp1VUsm7tJaeW64qPAyiavVaHY7XdvCbuatu6QSr
GHI1NmOVUjzduVOWNWKdddtmVlpq441N62eUeWusZdUcruBGt9D10DJVOE9YvIKVup15uVWq8jm4
6Xdlk7CKSkoLZEnaWqJpVZTuSdDmN21WGomdZJ15xTp12CpMUjzrqiTZTaTcx27JJy72S9zrN3jm
SLJiglXVNE2iauqrtlsyznYc6XvXm5nEk7lVhzriwmdJ0cc5tkyx21sF5svdpSboMnMc3suma7J3
SDJeySqu8Tec7us7dqjNu49VOSdjj6TdvdVdmDG6q77r2S8tk9qtNO+7pt6+JcvJMKLTWomaO2sw
7dk1W73Z3bmZz6u3qvtVC5U2qvuO69m1VWKb3eWq8B1C9pdOJdiqsmqdM9sda08lmgb3ZVd1U4+J
x91HOqSX2YNmg4bzm3ct1ROaDvPVu8lVhpEtXdsO6XC76uRRqr3VyJJzLl9ryXl6uJ5k5lqkSW3m
A3Sq3vPnE+qqvMd3hk7pAe2aqkqldZdhX1ZmkpI3oxca15cl33bVVHzxkkk3lVVE2tzlvZyp3Vzr
mbWXfRzt5NE02u7Ny6m3V1pyc3eSEpXo7dVMph9yvnc18sy8drAUXt8KW0qecr3dyuVZXVu9dZlT
MiXGk2Hfdcm3VYpe9J190uqztL4wHJxp7ukmmD3dt7VPG+0Nu+c7VrU7EJmN9xOVVXeJu1sEvqom
Ycuxiu+xTcWLGDd901x1Rg3d3pzbkm7Kw7KOqFNbr7Rx8MUUdkvczWuprqhNVdbt1dncfdXNVJlz
c5NKks51JaazbswnMnDp3TFTzuN2SSdp6tWTTnbzdES9F8zRoiF2A3QcBmbsBmb+GKfolVcZVXbS
r8w+Y2GD+YvzjC+A1H5D+MaJ+KZZf61P8j21ZFf0X94yrmqtJON1NraL/GT9Vbq3Vb5vt8nyprZU
8BrF+a/xv5Vf1Vuh3d3cmkbquEW4dt2ml21++V1qWSu8dxb6mkW8b7a79R9o1v3xbUrnYqcGpH3I
4f8zp7cP7o/zJSlsqWLVklKQ1JKYTJDTYAC8jhFcrzqrztYrgq5Dqf43BN9WWLqNC9P+xcE8KK/U
/C7IZlMnO62mh9ttfUtD2X1Xn+Fwt12X51fm2vzrdb7Xfe67LS+KqE7FtXfaXE0N6l+1z427Y5Xe
uk63+SVPn/aeG3X2+2GXtlWH4YdNoj6k6dvucSbQ+niPhwrttDTR9viT/ZfiTgSvw++Hh5/CcwfW
MSY08uXDmTz+H2+PD3J+HLLqNzo4Pfc7wMu66d1wtrrfx+PC5nlut97qoTa6Xzt9KsiraovWWVGq
dw+aS58Lu+EfNLI63uuX0y71KvsDCJfrR5Veuq9V23K5Wy6RyT5qq9tsP5al1W6T4XjeFpaj236J
La3XwvoO87+V29VxPcqhNjtvbV7ZTvkyhLByVQnxVQn1cZH+Qf1ScEZFXdaSPoqmUkl/hVJ+FrTz
oQvzUYKlV/0lcTWqv8LaXWLgjRUrQv7AP2iq+sVWyP7a+2q8aKspldbSquu5Pq+ko2o+dK3JuvFN
qvWWw1fqvJVe2itST7k+7yo8z/Wmh3msj204AXWLzTvKeBV+eU7T9pjSXMXS6dIrGZfXUXYpVvuU
pYnmYpck2qrYtir1VSMpqGqkwpNlOanyTpF/yMk0iruqr1SXTlX2fh2afotdfu1/pT7Itfovuvxv
z3Ne6crmeuy/CfhfpOpvXC2uzSutw2vytycI/OXC1vuvruNr3WLlcbvOp43Zc7XnczW8bxN22afE
Nvp/LrLlXD5fl4afTy+jS4aav1NN9xrdd94pON43F4XS5XO2a3med5WnfczTiek8OE84bak9qn95
B9hJE6n0nj4cp5ndlzud5XbL2AaVKvQpPuFV4ibT8Pw+D936V8PcmW/y5fb8uvL8OX4Zk/Yv8qtq
+v6uAAAA1Vb+5t+/bcmX0/m9NsPScJ/bI+HD/HI6eHfy/D+Hh0hV+hUob78qmpFbk0eupe1S+maB
VEqiUbJMIidSJUSbTvkkL5DsvldLt91nnZpsnRJbLRPpRvvcvVeV8Lke7pbbrhfx/WWfYTjHPz6c
9Lpcu/daW683bfRfW5zncr3m82ud8Ta3rwPd0+u3Xce3735eny8L/ZzJ6Tl9umpPnlNyV9abfhPE
nDTty4k6Zabqvh6faYfLh/KTU/kQ07VuvA0u25XTdb74FSo98vcmUqtEbJ6XRTVV6U9LzPK6nTrM
u3pbrwvWZfh0/eCfmvb91k1Jw4dq9P1+H4BH7RJUd2UpdL07bnc7Lyt6FaHkbi70fbEqPSJPmCf2
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

--_8264087d-b4df-48d5-beb3-b8e20d0d81aa_
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

--_8264087d-b4df-48d5-beb3-b8e20d0d81aa_--


From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:53:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04:53:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOWt-0005cE-Bm; Thu, 27 Oct 2011 04:53:51 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJ0p0-0002vL-W8
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 03:34:59 -0700
X-Env-Sender: avi@redhat.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1319625295!1124347!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23631 invoked from network); 26 Oct 2011 10:34:55 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-8.tower-216.messagelabs.com with SMTP;
	26 Oct 2011 10:34: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 p9QAYAot026658
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Wed, 26 Oct 2011 06:34:10 -0400
Received: from mermaid.qumranet.com (vpn-11-12.rdu.redhat.com [10.11.11.12])
	by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9QAY4Ks016462; Wed, 26 Oct 2011 06:34:04 -0400
Message-ID: <4EA7E21B.8020805@redhat.com>
Date: Wed, 26 Oct 2011 12:34:03 +0200
From: Avi Kivity <avi@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Raghavendra K T <raghukt@linux.vnet.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
	<4EA53A7D.300@redhat.com>
	<20111024122734.GA10634@linux.vnet.ibm.com>
	<4EA56385.9040302@redhat.com>
	<20111024135032.GB10634@linux.vnet.ibm.com>
	<4EA6FEC2.1060209@linux.vnet.ibm.com>
In-Reply-To: <4EA6FEC2.1060209@linux.vnet.ibm.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:15 -0700
Cc: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, x86@kernel.org,
	Ingo Molnar <mingo@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Marcelo Tosatti <mtosatti@redhat.com>, Xen <xen-devel@lists.xensource.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Yinghai Lu <yinghai@kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Greg Kroah-Hartman <gregkh@suse.de>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 08:24 PM, Raghavendra K T wrote:
>
> So then do also you foresee the need for directed yield at some point,
> to address LHP? provided we have good improvements to prove.

Doesn't this patchset completely eliminate lock holder preemption?

-- 
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 04:58:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 04:58:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJObp-0006nH-3b; Thu, 27 Oct 2011 04:58:57 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ8pd-0002qC-4K
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 12:08:13 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1319656059!50353308!1
X-Originating-IP: [202.81.31.140]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18996 invoked from network); 26 Oct 2011 19:07:42 -0000
Received: from e23smtp07.au.ibm.com (HELO e23smtp07.au.ibm.com) (202.81.31.140)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 19:07:42 -0000
Received: from d23relay04.au.ibm.com (d23relay04.au.ibm.com [202.81.31.246])
	by e23smtp07.au.ibm.com (8.14.4/8.13.1) with ESMTP id p9QJ7xTN030005
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 06:07:59 +1100
Received: from d23av04.au.ibm.com (d23av04.au.ibm.com [9.190.235.139])
	by d23relay04.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9QJ5GZX946218
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 06:05:18 +1100
Received: from d23av04.au.ibm.com (loopback [127.0.0.1])
	by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9QJ7tp1018669
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 06:07:56 +1100
Received: from oc5400248562.ibm.com ([9.77.125.104])
	by d23av04.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9QJ7leC018575; Thu, 27 Oct 2011 06:07:48 +1100
Message-ID: <4EA85A9D.5060203@linux.vnet.ibm.com>
Date: Thu, 27 Oct 2011 00:38:13 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Avi Kivity <avi@redhat.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
	<4EA53A7D.300@redhat.com>
	<20111024122734.GA10634@linux.vnet.ibm.com>
	<4EA56385.9040302@redhat.com>
	<20111024135032.GB10634@linux.vnet.ibm.com>
	<4EA6FEC2.1060209@linux.vnet.ibm.com> <4EA7E21B.8020805@redhat.com>
In-Reply-To: <4EA7E21B.8020805@redhat.com>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:11 -0700
Cc: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, x86@kernel.org,
	Ingo Molnar <mingo@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Marcelo Tosatti <mtosatti@redhat.com>, Xen <xen-devel@lists.xensource.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Yinghai Lu <yinghai@kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Greg Kroah-Hartman <gregkh@suse.de>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>, Ryan Harper <ryanh@us.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/26/2011 04:04 PM, Avi Kivity wrote:
> On 10/25/2011 08:24 PM, Raghavendra K T wrote:
CCing Ryan also
>>
>> So then do also you foresee the need for directed yield at some point,
>> to address LHP? provided we have good improvements to prove.
>
> Doesn't this patchset completely eliminate lock holder preemption?
>
Basically I was curious whether we can do more better with your directed 
yield discussions in https://lkml.org/lkml/2010/8/2/106 .

I felt we can get little more improvement with doing directed yield to
lock-holder in case of LHP than sleeping. But I may be wrong.

So wanted to get the feedback, on whether I am thinking in right
direction.




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:02:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:02:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOfE-0007Dl-SM; Thu, 27 Oct 2011 05:02:29 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ95a-0003Uk-5p
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 12:24:38 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319657070!1773363!1
X-Originating-IP: [202.81.31.143]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29105 invoked from network); 26 Oct 2011 19:24:33 -0000
Received: from e23smtp01.au.ibm.com (HELO e23smtp01.au.ibm.com) (202.81.31.143)
	by server-14.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 19:24:33 -0000
Received: from d23relay03.au.ibm.com (d23relay03.au.ibm.com [202.81.31.245])
	by e23smtp01.au.ibm.com (8.14.4/8.13.1) with ESMTP id p9QJMkaO020262
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 06:22:46 +1100
Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138])
	by d23relay03.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9QJNDL01900706
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 06:23:13 +1100
Received: from d23av02.au.ibm.com (loopback [127.0.0.1])
	by d23av02.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9QJNBbd004377
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 06:23:13 +1100
Received: from oc5400248562.ibm.com ([9.77.125.104])
	by d23av02.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9QJN4ic004323; Thu, 27 Oct 2011 06:23:05 +1100
Message-ID: <4EA85E32.3080107@linux.vnet.ibm.com>
Date: Thu, 27 Oct 2011 00:53:30 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
	<4EA7012B.5040808@goop.org>
In-Reply-To: <4EA7012B.5040808@goop.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:12 -0700
Cc: "x86@kernel.org" <x86@kernel.org>, KVM <kvm@vger.kernel.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>, Xen <xen-devel@lists.xensource.com>,
	Dave Jiang <dave.jiang@intel.com>, Gleb Natapov <gleb@redhat.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Avi Kivity <avi@redhat.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>, Greg Kroah-Hartman <gregkh@suse.de>,
	Marcelo Tosatti <mtosatti@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 5/5] kvm guest : pv-ticketlocks
 support for linux guests running on KVM hypervisor
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/26/2011 12:04 AM, Jeremy Fitzhardinge wrote:
> On 10/23/2011 12:07 PM, Raghavendra K T wrote:
>> This patch extends Linux guests running on KVM hypervisor to support
>> +/*
>> + * Setup pv_lock_ops to exploit KVM_FEATURE_WAIT_FOR_KICK if present.
>> + * This needs to be setup really early in boot, before the first call to
>> + * spinlock is issued!
>
> Actually, it doesn't matter that much.  The in-memory format is the same
> for regular and PV spinlocks, and the PV paths only come into play if
> the "slowpath" flag is set in the lock, which it never will be by the
> non-PV code.
>
> In principle, you could defer initializing PV ticketlocks until some
> arbitrarily late point if you notice that the system is oversubscribed
> enough to require it.

ok.. so this means it will not affect even if it is initialized in
middle somewhere, but better to do it before we start seeing lock 
contention. our current aim was to have before any printk happens.
So I  'll trim the comment to somethings like :

Setup pv_lock_ops to exploit KVM_FEATURE_WAIT_FOR_KICK if present.
This needs to be setup early in boot. ?

>
> The main constraint at present is that you need to update the
> pv_lock_ops structure before pvops patching happens, or you won't see
> any effect from making changes.

Hmm. got it.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:04:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:04:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOhH-0007bj-GP; Thu, 27 Oct 2011 05:04:35 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ96f-0003WQ-OD
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 12:25:46 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1319657118!48283438!1
X-Originating-IP: [202.81.31.140]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27197 invoked from network); 26 Oct 2011 19:25:21 -0000
Received: from e23smtp07.au.ibm.com (HELO e23smtp07.au.ibm.com) (202.81.31.140)
	by server-12.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 19:25:21 -0000
Received: from d23relay05.au.ibm.com (d23relay05.au.ibm.com [202.81.31.247])
	by e23smtp07.au.ibm.com (8.14.4/8.13.1) with ESMTP id p9QJPccb003409
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 06:25:38 +1100
Received: from d23av02.au.ibm.com (d23av02.au.ibm.com [9.190.235.138])
	by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9QJMtra1749050
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 06:22:55 +1100
Received: from d23av02.au.ibm.com (loopback [127.0.0.1])
	by d23av02.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9QJPaeO008384
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 06:25:37 +1100
Received: from oc5400248562.ibm.com ([9.77.125.104])
	by d23av02.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9QJPTDQ007947; Thu, 27 Oct 2011 06:25:30 +1100
Message-ID: <4EA85EC3.7070102@linux.vnet.ibm.com>
Date: Thu, 27 Oct 2011 00:55:55 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
	<4EA7017B.5000903@goop.org>
In-Reply-To: <4EA7017B.5000903@goop.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:12 -0700
Cc: "x86@kernel.org" <x86@kernel.org>, KVM <kvm@vger.kernel.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>, Xen <xen-devel@lists.xensource.com>,
	Dave Jiang <dave.jiang@intel.com>, Gleb Natapov <gleb@redhat.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Avi Kivity <avi@redhat.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>, Greg Kroah-Hartman <gregkh@suse.de>,
	Marcelo Tosatti <mtosatti@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 5/5] kvm guest : pv-ticketlocks
 support for linux guests running on KVM hypervisor
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/26/2011 12:05 AM, Jeremy Fitzhardinge wrote:
> On 10/23/2011 12:07 PM, Raghavendra K T wrote:
>>
>> +#ifdef CONFIG_PARAVIRT_SPINLOCKS
>> +
>> +#ifdef CONFIG_KVM_DEBUG_FS
>> +
>> +#include<linux/debugfs.h>
>> +
>> +#endif /* CONFIG_KVM_DEBUG_FS */
>> +
>> +#endif /* CONFIG_PARAVIRT_SPINLOCKS */
>
> This is a big mess.  Is there any problem with including linux/debugfs.h
> unconditionally?  Or at least using "#if
> defined(CONFIG_PARAVIRT_SPINLOCKS)&&  defined(CONFIG_KVM_DEBUG_FS)"?
>

I agree. I 'll include unconditionally unless somebody objects.

>      J


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:06:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:06:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOj1-0007zk-03; Thu, 27 Oct 2011 05:06:23 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ9Qd-00042E-Vt
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 12:46:24 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319658378!1773730!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20587 invoked from network); 26 Oct 2011 19:46:19 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 19:46:19 -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 3EA2FA2C1;
	Wed, 26 Oct 2011 12:46:17 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 637E4201C3;
	Wed, 26 Oct 2011 12:46:15 -0700 (PDT)
Message-ID: <4EA86387.5040108@goop.org>
Date: Wed, 26 Oct 2011 12:46:15 -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: Raghavendra K T <raghukt@linux.vnet.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
	<4EA7012B.5040808@goop.org> <4EA85E32.3080107@linux.vnet.ibm.com>
In-Reply-To: <4EA85E32.3080107@linux.vnet.ibm.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:10 -0700
Cc: "x86@kernel.org" <x86@kernel.org>, KVM <kvm@vger.kernel.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>, Xen <xen-devel@lists.xensource.com>,
	Dave Jiang <dave.jiang@intel.com>, Gleb Natapov <gleb@redhat.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Avi Kivity <avi@redhat.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>, Greg Kroah-Hartman <gregkh@suse.de>,
	Marcelo Tosatti <mtosatti@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 5/5] kvm guest : pv-ticketlocks
 support for linux guests running on KVM hypervisor
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/26/2011 12:23 PM, Raghavendra K T wrote:
> On 10/26/2011 12:04 AM, Jeremy Fitzhardinge wrote:
>> On 10/23/2011 12:07 PM, Raghavendra K T wrote:
>>> This patch extends Linux guests running on KVM hypervisor to support
>>> +/*
>>> + * Setup pv_lock_ops to exploit KVM_FEATURE_WAIT_FOR_KICK if present.
>>> + * This needs to be setup really early in boot, before the first
>>> call to
>>> + * spinlock is issued!
>>
>> Actually, it doesn't matter that much.  The in-memory format is the same
>> for regular and PV spinlocks, and the PV paths only come into play if
>> the "slowpath" flag is set in the lock, which it never will be by the
>> non-PV code.
>>
>> In principle, you could defer initializing PV ticketlocks until some
>> arbitrarily late point if you notice that the system is oversubscribed
>> enough to require it.
>
> ok.. so this means it will not affect even if it is initialized in
> middle somewhere, but better to do it before we start seeing lock
> contention.

Right.  Or more specifically, lock contention while you have VCPU
overcommit.

> our current aim was to have before any printk happens.
> So I  'll trim the comment to somethings like :
>
> Setup pv_lock_ops to exploit KVM_FEATURE_WAIT_FOR_KICK if present.
> This needs to be setup early in boot. ?

You can hook the smp_ops.smp_prepare_cpus call and initialize it there. 
There's no need to add new hook code.

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:08:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:08:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOky-0008Ru-8m; Thu, 27 Oct 2011 05:08:24 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ9Yn-0004Ze-NZ
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 12:55:02 -0700
X-Env-Sender: raghukt@linux.vnet.ibm.com
X-Msg-Ref: server-6.tower-174.messagelabs.com!1319658884!34661093!1
X-Originating-IP: [122.248.162.1]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21113 invoked from network); 26 Oct 2011 19:54:46 -0000
Received: from e28smtp01.in.ibm.com (HELO e28smtp01.in.ibm.com) (122.248.162.1)
	by server-6.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 19:54:46 -0000
Received: from d28relay05.in.ibm.com (d28relay05.in.ibm.com [9.184.220.62])
	by e28smtp01.in.ibm.com (8.14.4/8.13.1) with ESMTP id p9QJsh5g016501
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 01:24:43 +0530
Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63])
	by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id
	p9QJsgAV2777286
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 01:24:42 +0530
Received: from d28av01.in.ibm.com (loopback [127.0.0.1])
	by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id
	p9QJsfdN012646
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 01:24:42 +0530
Received: from oc5400248562.ibm.com ([9.77.125.104])
	by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id
	p9QJsc4e012517; Thu, 27 Oct 2011 01:24:38 +0530
Message-ID: <4EA86598.1060604@linux.vnet.ibm.com>
Date: Thu, 27 Oct 2011 01:25:04 +0530
From: Raghavendra K T <raghukt@linux.vnet.ibm.com>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US;
	rv:1.9.2.23) Gecko/20110928 Fedora/3.1.15-1.fc14 Thunderbird/3.1.15
MIME-Version: 1.0
To: Jeremy Fitzhardinge <jeremy@goop.org>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190753.16364.31164.sendpatchset@oc5400248562.ibm.com>
	<4EA7012B.5040808@goop.org> <4EA85E32.3080107@linux.vnet.ibm.com>
	<4EA86387.5040108@goop.org>
In-Reply-To: <4EA86387.5040108@goop.org>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:12 -0700
Cc: "x86@kernel.org" <x86@kernel.org>, KVM <kvm@vger.kernel.org>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	"H. Peter Anvin" <hpa@zytor.com>, Xen <xen-devel@lists.xensource.com>,
	Dave Jiang <dave.jiang@intel.com>, Gleb Natapov <gleb@redhat.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	Ingo Molnar <mingo@redhat.com>, Avi Kivity <avi@redhat.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Yinghai Lu <yinghai@kernel.org>, Greg Kroah-Hartman <gregkh@suse.de>,
	Marcelo Tosatti <mtosatti@redhat.com>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 5/5] kvm guest : pv-ticketlocks
 support for linux guests running on KVM hypervisor
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/2011 01:16 AM, Jeremy Fitzhardinge wrote:
> On 10/26/2011 12:23 PM, Raghavendra K T wrote:
>> On 10/26/2011 12:04 AM, Jeremy Fitzhardinge wrote:
>>> On 10/23/2011 12:07 PM, Raghavendra K T wrote:
>
>> our current aim was to have before any printk happens.
>> So I  'll trim the comment to somethings like :
>>
>> Setup pv_lock_ops to exploit KVM_FEATURE_WAIT_FOR_KICK if present.
>> This needs to be setup early in boot. ?
>
> You can hook the smp_ops.smp_prepare_cpus call and initialize it there.
> There's no need to add new hook code.
>

Ok.. Thanks for pointer. 'll check on that.

>      J
>


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:10:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:10:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOmu-0000Pm-7E; Thu, 27 Oct 2011 05:10:24 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJ9nO-0006VR-72
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 13:09:56 -0700
X-Env-Sender: jeremy@goop.org
X-Msg-Ref: server-4.tower-27.messagelabs.com!1319659765!46094594!1
X-Originating-IP: [74.207.240.146]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21782 invoked from network); 26 Oct 2011 20:09:27 -0000
Received: from claw.goop.org (HELO claw.goop.org) (74.207.240.146)
	by server-4.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 26 Oct 2011 20:09:27 -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 73E90A302;
	Wed, 26 Oct 2011 13:09:48 -0700 (PDT)
Received: from saboo.goop.org (localhost [IPv6:::1])
	by saboo.goop.org (Postfix) with ESMTP id 9E092201C4;
	Wed, 26 Oct 2011 13:09:48 -0700 (PDT)
Message-ID: <4EA8690C.1040209@goop.org>
Date: Wed, 26 Oct 2011 13:09:48 -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: Avi Kivity <avi@redhat.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
	<4EA53A7D.300@redhat.com>
	<20111024122734.GA10634@linux.vnet.ibm.com>
	<4EA56385.9040302@redhat.com>
	<20111024135032.GB10634@linux.vnet.ibm.com>
	<4EA6FEC2.1060209@linux.vnet.ibm.com> <4EA7E21B.8020805@redhat.com>
In-Reply-To: <4EA7E21B.8020805@redhat.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:10 -0700
Cc: Raghavendra K T <raghukt@linux.vnet.ibm.com>,
	Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, x86@kernel.org,
	Ingo Molnar <mingo@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Marcelo Tosatti <mtosatti@redhat.com>, Xen <xen-devel@lists.xensource.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Yinghai Lu <yinghai@kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Greg Kroah-Hartman <gregkh@suse.de>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/26/2011 03:34 AM, Avi Kivity wrote:
> On 10/25/2011 08:24 PM, Raghavendra K T wrote:
>> So then do also you foresee the need for directed yield at some point,
>> to address LHP? provided we have good improvements to prove.
> Doesn't this patchset completely eliminate lock holder preemption?

Well, there's the question of whether its better for someone waiting for
a contended lock to just go to sleep and rely on the scheduler to give
CPU time to whoever currently has the lock, or if the scheduler needs a
little hint to boost the lock holder by giving it the waiter's timeslice.

I tend to prefer the former, since there's no reason to suppose that the
the lock holder vcpu is necessarily the scheduler's top priority, and it
may want to schedule something else anyway.

    J

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:13:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:13:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOpw-0000qS-4w; Thu, 27 Oct 2011 05:13:32 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJGKT-0004SO-E8
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 20:08:30 -0700
X-Env-Sender: cyliu@suse.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1319684884!48306104!1
X-Originating-IP: [137.65.248.33]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2004 invoked from network); 27 Oct 2011 03:08:05 -0000
Received: from novprvlin0050.provo.novell.com (HELO
	novprvlin0050.provo.novell.com) (137.65.248.33)
	by server-12.tower-27.messagelabs.com with SMTP;
	27 Oct 2011 03:08:05 -0000
Received: from INET-PRV1-MTA by novprvlin0050.provo.novell.com
	with Novell_GroupWise; Wed, 26 Oct 2011 21:08:24 -0600
Message-Id: <4EA965D20200006600005AE0@novprvlin0050.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Wed, 26 Oct 2011 21:08:18 -0600
From: "Chun Yan Liu" <cyliu@suse.com>
To: "Stefano Stabellini" <Stefano.Stabellini@eu.citrix.com>,
	"Fajar A. Nugraha" <list@fajar.net>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images
 fail
References: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
	<alpine.DEB.2.00.1110191148580.3519@kaball-desktop>
	<alpine.DEB.2.00.1110191152460.3519@kaball-desktop>
	<CAG1y0sdh+4eai1qooKDRhLZM6UDXVqfywx5e7E6H5EYnN_eqeg@mail.gmail.com>
	<alpine.DEB.2.00.1110191440070.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1110191440070.3519@kaball-desktop>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part77589C32.4__="
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:11 -0700
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

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.

--=__Part77589C32.4__=
Content-Type: multipart/alternative; boundary="=__Part77589C32.5__="

--=__Part77589C32.5__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable


Thank you all. Have tested pv-grub and qemu-nbd trick. Both work.=20
Following is the test patch that starts qemu-nbd to mount a non-raw qdisk =
in domain0, so that it can work with qcow/qcow2 disk image and using =
pygrub. I don't know if we need such a patch, or prefer to ask user to use =
pv-grub instead. Just post here for any chance of use. Thanks.=20
 =20
Patch description: 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.=20
Signed-off-by: Chunyan Liu <cyliu@suse.com>=20

diff -r b4cf57bbc3fb tools/libxl/libxl.c=20
--- a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 +0800=20
+++ b/tools/libxl/libxl.cThu Oct 20 15:48:45 2011 +0800=20
@@ -1078,12 +1078,41 @@=20
     return rc;=20
 }=20
 =20
+static char * nbd_mount_disk(libxl_device_disk *disk)=20
+{=20
+    int i;=20
+    int nbds_max =3D 16;=20
+    char *nbd_dev, *cmd;=20
+    char *ret =3D NULL;=20
+=20
+    for (i =3D 0; i < nbds_max; i++) {=20
+        asprintf(&nbd_dev,"/dev/nbd%d", i);=20
+        asprintf(&cmd, "qemu-nbd -c %s %s", nbd_dev, disk->pdev_path);=20
+        if (system(cmd) =3D=3D 0) {=20
+            ret =3D strdup(nbd_dev);=20
+            break;=20
+        }=20
+    }=20
+=20
+    return ret;=20
+}=20
+=20
+static int nbd_unmount_disk(char *diskpath) {=20
+    char *cmd;=20
+    asprintf(&cmd, "qemu-nbd -d %s", diskpath);=20
+    if (system(cmd) =3D=3D 0)=20
+        return 0;=20
+    else=20
+        return ERROR_FAIL;=20
+}=20
+=20
 char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk =
*disk)=20
 {=20
     libxl__gc gc =3D LIBXL_INIT_GC(ctx);=20
     char *dev =3D NULL;=20
     char *ret =3D NULL;=20
     int rc;=20
+    char *mdev =3D NULL;=20
 =20
     rc =3D libxl__device_disk_set_backend(&gc, disk);=20
     if (rc) goto out;=20
@@ -1118,8 +1147,12 @@=20
             break;=20
         case LIBXL_DISK_BACKEND_QDISK:=20
             if (disk->format !=3D LIBXL_DISK_FORMAT_RAW) {=20
-                LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot locally"=20
-                           " attach a qdisk image if the format is not =
raw");=20
+                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "attaching a non-raw =
qdisk image to domain 0\n");=20
+                mdev =3D nbd_mount_disk(disk);=20
+                if (mdev)=20
+                    dev =3D mdev;=20
+                else=20
+                    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "fail to mount =
image with qemu-nbd");=20
                 break;=20
             }=20
             LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "locally attaching qdisk =
%s\n",=20
@@ -1135,11 +1168,13 @@=20
  out:=20
     if (dev !=3D NULL)=20
         ret =3D strdup(dev);=20
+    if (mdev)=20
+        free(mdev);=20
     libxl__free_all(&gc);=20
     return ret;=20
 }=20
 =20
-int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk)=20
+int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk, char *diskpath)=20
 {=20
     /* Nothing to do for PHYSTYPE_PHY. */=20
 =20
@@ -1147,6 +1182,19 @@=20
      * For other device types assume that the blktap2 process is=20
      * needed by the soon to be started domain and do nothing.=20
      */=20
+    int ret;=20
+=20
+    switch (disk->backend) {=20
+        case LIBXL_DISK_BACKEND_QDISK:=20
+            if (disk->format !=3D LIBXL_DISK_FORMAT_RAW) {=20
+                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Locally detach a =
non-raw "=20
+                    "qdisk image");=20
+                ret =3D nbd_unmount_disk(diskpath);=20
+                return ret;=20
+            }=20
+        default:=20
+            break;=20
+    }=20
 =20
     return 0;=20
 }=20
diff -r b4cf57bbc3fb tools/libxl/libxl.h=20
--- a/tools/libxl/libxl.hThu Oct 20 15:24:46 2011 +0800=20
+++ b/tools/libxl/libxl.hThu Oct 20 15:48:45 2011 +0800=20
@@ -390,7 +390,7 @@=20
  * Make a disk available in this domain. Returns path to a device.=20
  */=20
 char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk =
*disk);=20
-int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk);=20
+int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk, char *diskpath);=20
 =20
 int libxl_device_nic_init(libxl_device_nic *nic, int dev_num);=20
 int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic =
*nic);=20
diff -r b4cf57bbc3fb tools/libxl/libxl_bootloader.c=20
--- a/tools/libxl/libxl_bootloader.cThu Oct 20 15:24:46 2011 +0800=20
+++ b/tools/libxl/libxl_bootloader.cThu Oct 20 15:48:45 2011 +0800=20
@@ -424,7 +424,7 @@=20
     rc =3D 0;=20
 out_close:=20
     if (diskpath) {=20
-        libxl_device_disk_local_detach(ctx, disk);=20
+        libxl_device_disk_local_detach(ctx, disk, diskpath);=20
         free(diskpath);=20
     }=20
     if (fifo_fd > -1)=20

>>> Stefano Stabellini <stefano.stabellini@eu.citrix.com> 10/19/2011 9:40 =
PM >>>
On Wed, 19 Oct 2011, Fajar A. Nugraha wrote:
> On Wed, Oct 19, 2011 at 5:55 PM, Stefano Stabellini
> <stefano.stabellini@eu.citrix.com> wrote:
> >> This is a PV guest configured with pygrub, correct?
> >> If so, qcow/qcow2 are not supported in this scenario.
> >>
> >> You could:
> >>
> >> - avoid using pygrub (specify the kernel manually) and keep using =
qcow/qcow2;
> >> - switch to raw disks and keep using pygrub;
> >> - install a Linux kernel that support blktap2 (like the XCP kernel, =
see
> >>   http://wiki.xen.org/xenwiki/XenDom0Kernels) and switch to VHD =
format.
> >>
> >
> > The way to make it work would be to call qemu-nbd and nbd-client from =
xl
> > so that a /dev/nbd0 comes up in dom0 and pygrub can use it to extract
> > the kernel and initrd from the qcow2 image.
>
> would pv-grub work? If yes, it would give better performance compared
> to nbd workaround.

Yes, it should. That would be the other alternative. 

--=__Part77589C32.5__=
Content-Type: text/html; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

<html>=0A  <head>=0A=0A  </head>=0A  <body style=3D"margin-bottom: 1px; =
line-height: normal; margin-top: 4px; font-variant: normal; font-family: =
Dialog; font-weight: normal; margin-left: 4px; font-style: normal; =
margin-right: 4px; font-size: 10pt">=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">Thank you all. =
Have tested pv-grub and qemu-nbd trick. Both work.</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">Following is the test patch that starts qemu-nbd to mount =
a non-raw qdisk in domain0&#44; so that it can work with qcow/qcow2 disk =
image and using pygrub. I don&#39;t know if we need such a patch&#44; or =
prefer to ask user to use pv-grub instead. Just post here for any chance =
of use. Thanks.</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bott=
om: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;</font>    </p>=0A  =
  <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">Patch description: 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.</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom=
: 0">=0A      <font size=3D"2" face=3D"Dialog">Signed-off-by: Chunyan Liu =
&lt;cyliu@suse.com&gt;</font>    </p>=0A<br>      =0A    <p style=3D"margin=
-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">diff =
-r b4cf57bbc3fb tools/libxl/libxl.c</font>    </p>=0A    <p style=3D"margin=
-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">--- =
a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 &#43;0800</font>    </p>=0A  =
  <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43;&#43;&#43; b/tools/libxl/libxl.cThu Oct 20 15:48:45 =
2011 &#43;0800</font>    </p>=0A    <p style=3D"margin-top: 0; margin-botto=
m: 0">=0A      <font size=3D"2" face=3D"Dialog">@@ -1078&#44;12 &#43;1078&#=
44;41 @@</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: =
0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
return rc&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-botto=
m: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&#125;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&nbsp;</font>    </p>=0A    <p style=3D"margin-t=
op: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43;sta=
tic char &#42; nbd_mount_disk&#40;libxl_device_disk &#42;disk&#41;</font>  =
  </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43;&#123;</font>    </p>=0A    <p style=3D"mar=
gin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#4=
3; &nbsp;&nbsp;&nbsp;int i&#59;</font>    </p>=0A    <p style=3D"margin-top=
: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;int nbds_max &#61; 16&#59;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;char &#42;nbd_dev&#44; &#42;cmd&#59=
;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A    =
  <font size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;char &#42;ret =
&#61; NULL&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bott=
om: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43;</font>    </p>=0A   =
 <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;for &#40;i &#61; 0&#59; i &lt; =
nbds_max&#59; i&#43;&#43;&#41;&#32;&#123;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asprintf&#4=
0;&amp;nbd_dev&#44;&quot;/dev/nbd&#37;d&quot;&#44; i&#41;&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
asprintf&#40;&amp;cmd&#44; &quot;qemu-nbd -c &#37;s &#37;s&quot;&#44; =
nbd_dev&#44; disk-&gt;pdev_path&#41;&#59;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if =
&#40;system&#40;cmd&#41; &#61;&#61; 0&#41;&#32;&#123;</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;ret &#61; strdup&#40;nbd_dev&#41;&#59;</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;break&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;return ret&#59;</font>    </p>=0A    <p style=3D"margin-t=
op: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43;&#1=
25;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A  =
    <font size=3D"2" face=3D"Dialog">&#43;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43;static int nbd_unmount_disk&#40;char &#42;diskpath&#41=
;&#32;&#123;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom:=
 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;char =
&#42;cmd&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom=
: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;aspr=
intf&#40;&amp;cmd&#44; &quot;qemu-nbd -d &#37;s&quot;&#44; diskpath&#41;&#5=
9;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A   =
   <font size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;if &#40;system&=
#40;cmd&#41; &#61;&#61; 0&#41;</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0&#59;</font>    </p>=0A  =
  <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;else</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return =
ERROR_FAIL&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bott=
om: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43;&#125;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43;</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;cha=
r &#42; libxl_device_disk_local_attach&#40;libxl_ctx &#42;ctx&#44; =
libxl_device_disk &#42;disk&#41;</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&#1=
23;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A  =
    <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libxl__g=
c gc &#61; LIBXL_INIT_GC&#40;ctx&#41;&#59;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char &#42;dev &#61; =
NULL&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: =
0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
char &#42;ret &#61; NULL&#59;</font>    </p>=0A    <p style=3D"margin-top: =
0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;int rc&#59;</font>    </p>=0A    <p style=3D"margin-top: =
0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;char &#42;mdev &#61; NULL&#59;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;rc &#61; libxl__device_disk_set_backend&#40;&amp;gc&#44; =
disk&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-botto=
m: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;if &#40;rc&#41; goto out&#59;</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">@@ =
-1118&#44;8 &#43;1147&#44;12 @@</font>    </p>=0A    <p style=3D"margin-top=
: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break&#=
59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A  =
    <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;case LIBXL_DISK_BACKEND_QDISK:</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;if &#40;disk-&gt;format &#33;&#61; LIBXL_DISK_FORMAT_RAW=
&#41;&#32;&#123;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bot=
tom: 0">=0A      <font size=3D"2" face=3D"Dialog">- &nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIBXL__L=
OG&#40;ctx&#44; LIBXL__LOG_ERROR&#44; &quot;cannot locally&quot;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot; attach a qdisk image if the =
format is not raw&quot;&#41;&#59;</font>    </p>=0A    <p style=3D"margin-t=
op: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;LIBXL__LOG&#40;ctx&#44; LIBXL__LOG_DEBUG&#44; &quot;attachin=
g a non-raw qdisk image to domain 0&#92;n&quot;&#41;&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mdev &#61; nbd_mount_disk&#=
40;disk&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;if &#40;mdev&#41;</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev &#61; mdev&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIBXL__LOG&#40=
;ctx&#44; LIBXL__LOG_ERROR&#44; &quot;fail to mount image with qemu-nbd&quo=
t;&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom:=
 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;br=
eak&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: =
0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A   =
 <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;LIBXL__LOG&#40;ctx&#44; LIBXL__LOG_DEBUG&#44; &quot;loca=
lly attaching qdisk &#37;s&#92;n&quot;&#44;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">@@ -1135&#44;11 &#43;1168&#44;13 @@</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;out:</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;if &#40;dev &#33;&#61; NULL&#41;</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret =
&#61; strdup&#40;dev&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;if &#40;mdev&#41;</font>    </p>=0A    <p style=3D"margin=
-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free&#40;mdev&#41;&#59;</font>   =
 </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libxl__free_all&#4=
0;&amp;gc&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;return ret&#59;</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&#125=
;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A    =
  <font size=3D"2" face=3D"Dialog">&nbsp;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">-int libxl_device_disk_local_detach&#40;libxl_ctx =
&#42;ctx&#44; libxl_device_disk &#42;disk&#41;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43;int libxl_device_disk_local_detach&#40;libxl_ctx =
&#42;ctx&#44; libxl_device_disk &#42;disk&#44; char &#42;diskpath&#41;</fon=
t>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      =
<font size=3D"2" face=3D"Dialog">&nbsp;&#123;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&#42; Nothing to do for =
PHYSTYPE_PHY. &#42;/</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;</font>  =
  </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">@@ -1147&#44;6 &#43;1182&#44;19 @@</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#42; For =
other device types assume that the blktap2 process is</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#42; needed by the =
soon to be started domain and do nothing.</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#42;/</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;int ret&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43;</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;switch &#40;disk-&gt;backend&#41;&#32;&#123;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
case LIBXL_DISK_BACKEND_QDISK:</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if =
&#40;disk-&gt;format &#33;&#61; LIBXL_DISK_FORMAT_RAW&#41;&#32;&#123;</font=
>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      =
<font size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIBXL__LOG&#40;ctx&#4=
4; LIBXL__LOG_DEBUG&#44; &quot;Locally detach a non-raw &quot;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&qu=
ot;qdisk image&quot;&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;ret &#61; nbd_unmount_disk&#40;diskpath&#41;&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ret&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;break&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;</font>  =
  </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0&#59;</fon=
t>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      =
<font size=3D"2" face=3D"Dialog">&nbsp;&#125;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">diff -r b4cf57bbc3fb tools/libxl/libxl.h</font>    </p>=0A =
   <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">--- a/tools/libxl/libxl.hThu Oct 20 15:24:46 2011 =
&#43;0800</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: =
0">=0A      <font size=3D"2" face=3D"Dialog">&#43;&#43;&#43; b/tools/libxl/=
libxl.hThu Oct 20 15:48:45 2011 &#43;0800</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">@@ -390&#44;7 &#43;390&#44;7 @@</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&#42; Make a disk available in this domain. =
Returns path to a device.</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&#4=
2;/</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A  =
    <font size=3D"2" face=3D"Dialog">&nbsp;char &#42; libxl_device_disk_loc=
al_attach&#40;libxl_ctx &#42;ctx&#44; libxl_device_disk &#42;disk&#41;&#59;=
</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A     =
 <font size=3D"2" face=3D"Dialog">-int libxl_device_disk_local_detach&#40;l=
ibxl_ctx &#42;ctx&#44; libxl_device_disk &#42;disk&#41;&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43;int libxl_device_disk_local_detach&#40;libx=
l_ctx &#42;ctx&#44; libxl_device_disk &#42;disk&#44; char &#42;diskpath&#41=
;&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: =
0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;int libxl_device_nic_init&#40;libxl_device_nic =
&#42;nic&#44; int dev_num&#41;&#59;</font>    </p>=0A    <p style=3D"margin=
-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;=
int libxl_device_nic_add&#40;libxl_ctx &#42;ctx&#44; uint32_t domid&#44; =
libxl_device_nic &#42;nic&#41;&#59;</font>    </p>=0A    <p style=3D"margin=
-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">diff =
-r b4cf57bbc3fb tools/libxl/libxl_bootloader.c</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">--- a/tools/libxl/libxl_bootloader.cThu Oct 20 15:24:46 =
2011 &#43;0800</font>    </p>=0A    <p style=3D"margin-top: 0; margin-botto=
m: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43;&#43;&#43; b/tools/lib=
xl/libxl_bootloader.cThu Oct 20 15:48:45 2011 &#43;0800</font>    </p>=0A  =
  <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">@@ -424&#44;7 &#43;424&#44;7 @@</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc &#61; 0&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&nbsp;out_close:</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if &#40;diskpath&#41;&#32;&#1=
23;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A  =
    <font size=3D"2" face=3D"Dialog">- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;libxl_device_disk_local_detach&#40;ctx&#44; disk&#41;&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
libxl_device_disk_local_detach&#40;ctx&#44; disk&#44; diskpath&#41;&#59;</f=
ont>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      =
<font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;free&#40;diskpath&#41;&#59;</font>    </p>=0A    <p style=3D"ma=
rgin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A    <p style=3D"margin-=
top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;if &#40;fifo_fd &gt; -1&#41;</font>    </p>=0A<br>  =
    =0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      &gt;&gt;&g=
t; Stefano Stabellini &lt;stefano.stabellini@eu.citrix.com&gt; 10/19/2011 =
9:40 PM &gt;&gt;&gt;<br>On Wed&#44; 19 Oct 2011&#44; Fajar A. Nugraha =
wrote:<br>&gt; On Wed&#44; Oct 19&#44; 2011 at 5:55 PM&#44; Stefano =
Stabellini<br>&gt; &lt;stefano.stabellini@eu.citrix.com&gt; wrote:<br>&gt; =
&gt;&gt; This is a PV guest configured with pygrub&#44; correct&#63;<br>&gt=
; &gt;&gt; If so&#44; qcow/qcow2 are not supported in this scenario.<br>&gt=
; &gt;&gt;<br>&gt; &gt;&gt; You could:<br>&gt; &gt;&gt;<br>&gt; &gt;&gt; - =
avoid using pygrub &#40;specify the kernel manually&#41; and keep using =
qcow/qcow2&#59;<br>&gt; &gt;&gt; - switch to raw disks and keep using =
pygrub&#59;<br>&gt; &gt;&gt; - install a Linux kernel that support blktap2 =
&#40;like the XCP kernel&#44; see<br>&gt; &gt;&gt;&#160;&#160;&#32;<a =
href=3D"http://wiki.xen.org/xenwiki/XenDom0Kernels)">http://wiki.xen.org/xe=
nwiki/XenDom0Kernels&#41;</a>&nbsp;and switch to VHD format.<br>&gt; =
&gt;&gt;<br>&gt; &gt;<br>&gt; &gt; The way to make it work would be to =
call qemu-nbd and nbd-client from xl<br>&gt; &gt; so that a /dev/nbd0 =
comes up in dom0 and pygrub can use it to extract<br>&gt; &gt; the kernel =
and initrd from the qcow2 image.<br>&gt;<br>&gt; would pv-grub work&#63; =
If yes&#44; it would give better performance compared<br>&gt; to nbd =
workaround.<br><br>Yes&#44; it should. That would be the other alternative.=
=0A    </p>=0A  </body>=0A</html>=0A

--=__Part77589C32.5__=--

--=__Part77589C32.4__=
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

--=__Part77589C32.4__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:16:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:16:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOsd-0001GA-HZ; Thu, 27 Oct 2011 05:16:20 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJGL7-0004TQ-HR
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 20:09:10 -0700
X-Env-Sender: cyliu@suse.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1319684918!41567139!1
X-Originating-IP: [137.65.248.33]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15565 invoked from network); 27 Oct 2011 03:08:38 -0000
Received: from novprvlin0050.provo.novell.com (HELO
	novprvlin0050.provo.novell.com) (137.65.248.33)
	by server-10.tower-27.messagelabs.com with SMTP;
	27 Oct 2011 03:08:38 -0000
Received: from INET-PRV1-MTA by novprvlin0050.provo.novell.com
	with Novell_GroupWise; Wed, 26 Oct 2011 21:09:05 -0600
Message-Id: <4EA965FB0200006600005AE7@novprvlin0050.provo.novell.com>
X-Mailer: Novell GroupWise Internet Agent 12.0.0 Beta 
Date: Wed, 26 Oct 2011 21:08:59 -0600
From: "Chun Yan Liu" <cyliu@suse.com>
To: "Stefano Stabellini" <Stefano.Stabellini@eu.citrix.com>,
	"Fajar A. Nugraha" <list@fajar.net>
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images
 fail
References: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
	<alpine.DEB.2.00.1110191148580.3519@kaball-desktop>
	<alpine.DEB.2.00.1110191152460.3519@kaball-desktop>
	<CAG1y0sdh+4eai1qooKDRhLZM6UDXVqfywx5e7E6H5EYnN_eqeg@mail.gmail.com>
	<alpine.DEB.2.00.1110191440070.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1110191440070.3519@kaball-desktop>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="=__Part1E31F55B.4__="
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:11 -0700
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

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.

--=__Part1E31F55B.4__=
Content-Type: multipart/alternative; boundary="=__Part1E31F55B.5__="

--=__Part1E31F55B.5__=
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable


Thank you all. Have tested pv-grub and qemu-nbd trick. Both work.=20
Following is the test patch that starts qemu-nbd to mount a non-raw qdisk =
in domain0, so that it can work with qcow/qcow2 disk image and using =
pygrub. I don't know if we need such a patch, or prefer to ask user to use =
pv-grub instead. Just post here for any chance of use. Thanks.=20
 =20
Patch description: 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.=20
Signed-off-by: Chunyan Liu <cyliu@suse.com>=20

diff -r b4cf57bbc3fb tools/libxl/libxl.c=20
--- a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 +0800=20
+++ b/tools/libxl/libxl.cThu Oct 20 15:48:45 2011 +0800=20
@@ -1078,12 +1078,41 @@=20
     return rc;=20
 }=20
 =20
+static char * nbd_mount_disk(libxl_device_disk *disk)=20
+{=20
+    int i;=20
+    int nbds_max =3D 16;=20
+    char *nbd_dev, *cmd;=20
+    char *ret =3D NULL;=20
+=20
+    for (i =3D 0; i < nbds_max; i++) {=20
+        asprintf(&nbd_dev,"/dev/nbd%d", i);=20
+        asprintf(&cmd, "qemu-nbd -c %s %s", nbd_dev, disk->pdev_path);=20
+        if (system(cmd) =3D=3D 0) {=20
+            ret =3D strdup(nbd_dev);=20
+            break;=20
+        }=20
+    }=20
+=20
+    return ret;=20
+}=20
+=20
+static int nbd_unmount_disk(char *diskpath) {=20
+    char *cmd;=20
+    asprintf(&cmd, "qemu-nbd -d %s", diskpath);=20
+    if (system(cmd) =3D=3D 0)=20
+        return 0;=20
+    else=20
+        return ERROR_FAIL;=20
+}=20
+=20
 char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk =
*disk)=20
 {=20
     libxl__gc gc =3D LIBXL_INIT_GC(ctx);=20
     char *dev =3D NULL;=20
     char *ret =3D NULL;=20
     int rc;=20
+    char *mdev =3D NULL;=20
 =20
     rc =3D libxl__device_disk_set_backend(&gc, disk);=20
     if (rc) goto out;=20
@@ -1118,8 +1147,12 @@=20
             break;=20
         case LIBXL_DISK_BACKEND_QDISK:=20
             if (disk->format !=3D LIBXL_DISK_FORMAT_RAW) {=20
-                LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot locally"=20
-                           " attach a qdisk image if the format is not =
raw");=20
+                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "attaching a non-raw =
qdisk image to domain 0\n");=20
+                mdev =3D nbd_mount_disk(disk);=20
+                if (mdev)=20
+                    dev =3D mdev;=20
+                else=20
+                    LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "fail to mount =
image with qemu-nbd");=20
                 break;=20
             }=20
             LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "locally attaching qdisk =
%s\n",=20
@@ -1135,11 +1168,13 @@=20
  out:=20
     if (dev !=3D NULL)=20
         ret =3D strdup(dev);=20
+    if (mdev)=20
+        free(mdev);=20
     libxl__free_all(&gc);=20
     return ret;=20
 }=20
 =20
-int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk)=20
+int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk, char *diskpath)=20
 {=20
     /* Nothing to do for PHYSTYPE_PHY. */=20
 =20
@@ -1147,6 +1182,19 @@=20
      * For other device types assume that the blktap2 process is=20
      * needed by the soon to be started domain and do nothing.=20
      */=20
+    int ret;=20
+=20
+    switch (disk->backend) {=20
+        case LIBXL_DISK_BACKEND_QDISK:=20
+            if (disk->format !=3D LIBXL_DISK_FORMAT_RAW) {=20
+                LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Locally detach a =
non-raw "=20
+                    "qdisk image");=20
+                ret =3D nbd_unmount_disk(diskpath);=20
+                return ret;=20
+            }=20
+        default:=20
+            break;=20
+    }=20
 =20
     return 0;=20
 }=20
diff -r b4cf57bbc3fb tools/libxl/libxl.h=20
--- a/tools/libxl/libxl.hThu Oct 20 15:24:46 2011 +0800=20
+++ b/tools/libxl/libxl.hThu Oct 20 15:48:45 2011 +0800=20
@@ -390,7 +390,7 @@=20
  * Make a disk available in this domain. Returns path to a device.=20
  */=20
 char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk =
*disk);=20
-int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk);=20
+int libxl_device_disk_local_detach(libxl_ctx *ctx, libxl_device_disk =
*disk, char *diskpath);=20
 =20
 int libxl_device_nic_init(libxl_device_nic *nic, int dev_num);=20
 int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic =
*nic);=20
diff -r b4cf57bbc3fb tools/libxl/libxl_bootloader.c=20
--- a/tools/libxl/libxl_bootloader.cThu Oct 20 15:24:46 2011 +0800=20
+++ b/tools/libxl/libxl_bootloader.cThu Oct 20 15:48:45 2011 +0800=20
@@ -424,7 +424,7 @@=20
     rc =3D 0;=20
 out_close:=20
     if (diskpath) {=20
-        libxl_device_disk_local_detach(ctx, disk);=20
+        libxl_device_disk_local_detach(ctx, disk, diskpath);=20
         free(diskpath);=20
     }=20
     if (fifo_fd > -1)=20

>>> Stefano Stabellini <stefano.stabellini@eu.citrix.com> 10/19/2011 9:40 =
PM >>>
On Wed, 19 Oct 2011, Fajar A. Nugraha wrote:
> On Wed, Oct 19, 2011 at 5:55 PM, Stefano Stabellini
> <stefano.stabellini@eu.citrix.com> wrote:
> >> This is a PV guest configured with pygrub, correct?
> >> If so, qcow/qcow2 are not supported in this scenario.
> >>
> >> You could:
> >>
> >> - avoid using pygrub (specify the kernel manually) and keep using =
qcow/qcow2;
> >> - switch to raw disks and keep using pygrub;
> >> - install a Linux kernel that support blktap2 (like the XCP kernel, =
see
> >>   http://wiki.xen.org/xenwiki/XenDom0Kernels) and switch to VHD =
format.
> >>
> >
> > The way to make it work would be to call qemu-nbd and nbd-client from =
xl
> > so that a /dev/nbd0 comes up in dom0 and pygrub can use it to extract
> > the kernel and initrd from the qcow2 image.
>
> would pv-grub work? If yes, it would give better performance compared
> to nbd workaround.

Yes, it should. That would be the other alternative. 

--=__Part1E31F55B.5__=
Content-Type: text/html; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

<html>=0A  <head>=0A=0A  </head>=0A  <body style=3D"margin-bottom: 1px; =
line-height: normal; margin-top: 4px; font-variant: normal; font-family: =
Dialog; font-weight: normal; margin-left: 4px; font-style: normal; =
margin-right: 4px; font-size: 10pt">=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">Thank you all. =
Have tested pv-grub and qemu-nbd trick. Both work.</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">Following is the test patch that starts qemu-nbd to mount =
a non-raw qdisk in domain0&#44; so that it can work with qcow/qcow2 disk =
image and using pygrub. I don&#39;t know if we need such a patch&#44; or =
prefer to ask user to use pv-grub instead. Just post here for any chance =
of use. Thanks.</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bott=
om: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;</font>    </p>=0A  =
  <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">Patch description: 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.</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom=
: 0">=0A      <font size=3D"2" face=3D"Dialog">Signed-off-by: Chunyan Liu =
&lt;cyliu@suse.com&gt;</font>    </p>=0A<br>      =0A    <p style=3D"margin=
-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">diff =
-r b4cf57bbc3fb tools/libxl/libxl.c</font>    </p>=0A    <p style=3D"margin=
-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">--- =
a/tools/libxl/libxl.cThu Oct 20 15:24:46 2011 &#43;0800</font>    </p>=0A  =
  <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43;&#43;&#43; b/tools/libxl/libxl.cThu Oct 20 15:48:45 =
2011 &#43;0800</font>    </p>=0A    <p style=3D"margin-top: 0; margin-botto=
m: 0">=0A      <font size=3D"2" face=3D"Dialog">@@ -1078&#44;12 &#43;1078&#=
44;41 @@</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: =
0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
return rc&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-botto=
m: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&#125;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&nbsp;</font>    </p>=0A    <p style=3D"margin-t=
op: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43;sta=
tic char &#42; nbd_mount_disk&#40;libxl_device_disk &#42;disk&#41;</font>  =
  </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43;&#123;</font>    </p>=0A    <p style=3D"mar=
gin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#4=
3; &nbsp;&nbsp;&nbsp;int i&#59;</font>    </p>=0A    <p style=3D"margin-top=
: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;int nbds_max &#61; 16&#59;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;char &#42;nbd_dev&#44; &#42;cmd&#59=
;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A    =
  <font size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;char &#42;ret =
&#61; NULL&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bott=
om: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43;</font>    </p>=0A   =
 <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;for &#40;i &#61; 0&#59; i &lt; =
nbds_max&#59; i&#43;&#43;&#41;&#32;&#123;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;asprintf&#4=
0;&amp;nbd_dev&#44;&quot;/dev/nbd&#37;d&quot;&#44; i&#41;&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
asprintf&#40;&amp;cmd&#44; &quot;qemu-nbd -c &#37;s &#37;s&quot;&#44; =
nbd_dev&#44; disk-&gt;pdev_path&#41;&#59;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if =
&#40;system&#40;cmd&#41; &#61;&#61; 0&#41;&#32;&#123;</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;ret &#61; strdup&#40;nbd_dev&#41;&#59;</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;break&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;return ret&#59;</font>    </p>=0A    <p style=3D"margin-t=
op: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43;&#1=
25;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A  =
    <font size=3D"2" face=3D"Dialog">&#43;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43;static int nbd_unmount_disk&#40;char &#42;diskpath&#41=
;&#32;&#123;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom:=
 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;char =
&#42;cmd&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom=
: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;aspr=
intf&#40;&amp;cmd&#44; &quot;qemu-nbd -d &#37;s&quot;&#44; diskpath&#41;&#5=
9;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A   =
   <font size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;if &#40;system&=
#40;cmd&#41; &#61;&#61; 0&#41;</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0&#59;</font>    </p>=0A  =
  <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;else</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return =
ERROR_FAIL&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bott=
om: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43;&#125;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43;</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;cha=
r &#42; libxl_device_disk_local_attach&#40;libxl_ctx &#42;ctx&#44; =
libxl_device_disk &#42;disk&#41;</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&#1=
23;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A  =
    <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libxl__g=
c gc &#61; LIBXL_INIT_GC&#40;ctx&#41;&#59;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char &#42;dev &#61; =
NULL&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: =
0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
char &#42;ret &#61; NULL&#59;</font>    </p>=0A    <p style=3D"margin-top: =
0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;int rc&#59;</font>    </p>=0A    <p style=3D"margin-top: =
0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;char &#42;mdev &#61; NULL&#59;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;rc &#61; libxl__device_disk_set_backend&#40;&amp;gc&#44; =
disk&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-botto=
m: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;if &#40;rc&#41; goto out&#59;</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">@@ =
-1118&#44;8 &#43;1147&#44;12 @@</font>    </p>=0A    <p style=3D"margin-top=
: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break&#=
59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A  =
    <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;case LIBXL_DISK_BACKEND_QDISK:</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;if &#40;disk-&gt;format &#33;&#61; LIBXL_DISK_FORMAT_RAW=
&#41;&#32;&#123;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bot=
tom: 0">=0A      <font size=3D"2" face=3D"Dialog">- &nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIBXL__L=
OG&#40;ctx&#44; LIBXL__LOG_ERROR&#44; &quot;cannot locally&quot;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot; attach a qdisk image if the =
format is not raw&quot;&#41;&#59;</font>    </p>=0A    <p style=3D"margin-t=
op: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;LIBXL__LOG&#40;ctx&#44; LIBXL__LOG_DEBUG&#44; &quot;attachin=
g a non-raw qdisk image to domain 0&#92;n&quot;&#41;&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mdev &#61; nbd_mount_disk&#=
40;disk&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;if &#40;mdev&#41;</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev &#61; mdev&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIBXL__LOG&#40=
;ctx&#44; LIBXL__LOG_ERROR&#44; &quot;fail to mount image with qemu-nbd&quo=
t;&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom:=
 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;br=
eak&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: =
0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A   =
 <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;LIBXL__LOG&#40;ctx&#44; LIBXL__LOG_DEBUG&#44; &quot;loca=
lly attaching qdisk &#37;s&#92;n&quot;&#44;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">@@ -1135&#44;11 &#43;1168&#44;13 @@</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;out:</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;if &#40;dev &#33;&#61; NULL&#41;</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret =
&#61; strdup&#40;dev&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;if &#40;mdev&#41;</font>    </p>=0A    <p style=3D"margin=
-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free&#40;mdev&#41;&#59;</font>   =
 </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;libxl__free_all&#4=
0;&amp;gc&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;return ret&#59;</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&#125=
;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A    =
  <font size=3D"2" face=3D"Dialog">&nbsp;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">-int libxl_device_disk_local_detach&#40;libxl_ctx =
&#42;ctx&#44; libxl_device_disk &#42;disk&#41;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43;int libxl_device_disk_local_detach&#40;libxl_ctx =
&#42;ctx&#44; libxl_device_disk &#42;disk&#44; char &#42;diskpath&#41;</fon=
t>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      =
<font size=3D"2" face=3D"Dialog">&nbsp;&#123;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&#42; Nothing to do for =
PHYSTYPE_PHY. &#42;/</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;</font>  =
  </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">@@ -1147&#44;6 &#43;1182&#44;19 @@</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#42; For =
other device types assume that the blktap2 process is</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#42; needed by the =
soon to be started domain and do nothing.</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#42;/</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;int ret&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43;</font>    </p>=0A    <p style=3D"margin-to=
p: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;switch &#40;disk-&gt;backend&#41;&#32;&#123;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
case LIBXL_DISK_BACKEND_QDISK:</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if =
&#40;disk-&gt;format &#33;&#61; LIBXL_DISK_FORMAT_RAW&#41;&#32;&#123;</font=
>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      =
<font size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIBXL__LOG&#40;ctx&#4=
4; LIBXL__LOG_DEBUG&#44; &quot;Locally detach a non-raw &quot;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&qu=
ot;qdisk image&quot;&#41;&#59;</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;ret &#61; nbd_unmount_disk&#40;diskpath&#41;&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ret&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A    <p style=3D"margin-top:=
 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;break&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43; =
&nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;</font>  =
  </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0&#59;</fon=
t>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      =
<font size=3D"2" face=3D"Dialog">&nbsp;&#125;</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">diff -r b4cf57bbc3fb tools/libxl/libxl.h</font>    </p>=0A =
   <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">--- a/tools/libxl/libxl.hThu Oct 20 15:24:46 2011 =
&#43;0800</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: =
0">=0A      <font size=3D"2" face=3D"Dialog">&#43;&#43;&#43; b/tools/libxl/=
libxl.hThu Oct 20 15:48:45 2011 &#43;0800</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">@@ -390&#44;7 &#43;390&#44;7 @@</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&#42; Make a disk available in this domain. =
Returns path to a device.</font>    </p>=0A    <p style=3D"margin-top: 0; =
margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&#4=
2;/</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A  =
    <font size=3D"2" face=3D"Dialog">&nbsp;char &#42; libxl_device_disk_loc=
al_attach&#40;libxl_ctx &#42;ctx&#44; libxl_device_disk &#42;disk&#41;&#59;=
</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A     =
 <font size=3D"2" face=3D"Dialog">-int libxl_device_disk_local_detach&#40;l=
ibxl_ctx &#42;ctx&#44; libxl_device_disk &#42;disk&#41;&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43;int libxl_device_disk_local_detach&#40;libx=
l_ctx &#42;ctx&#44; libxl_device_disk &#42;disk&#44; char &#42;diskpath&#41=
;&#59;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: =
0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;</font>    </p>=0A    =
<p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;int libxl_device_nic_init&#40;libxl_device_nic =
&#42;nic&#44; int dev_num&#41;&#59;</font>    </p>=0A    <p style=3D"margin=
-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;=
int libxl_device_nic_add&#40;libxl_ctx &#42;ctx&#44; uint32_t domid&#44; =
libxl_device_nic &#42;nic&#41;&#59;</font>    </p>=0A    <p style=3D"margin=
-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">diff =
-r b4cf57bbc3fb tools/libxl/libxl_bootloader.c</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">--- a/tools/libxl/libxl_bootloader.cThu Oct 20 15:24:46 =
2011 &#43;0800</font>    </p>=0A    <p style=3D"margin-top: 0; margin-botto=
m: 0">=0A      <font size=3D"2" face=3D"Dialog">&#43;&#43;&#43; b/tools/lib=
xl/libxl_bootloader.cThu Oct 20 15:48:45 2011 &#43;0800</font>    </p>=0A  =
  <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">@@ -424&#44;7 &#43;424&#44;7 @@</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc &#61; 0&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&nbsp;out_close:</font>    </p>=0A    <p =
style=3D"margin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" =
face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if &#40;diskpath&#41;&#32;&#1=
23;</font>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A  =
    <font size=3D"2" face=3D"Dialog">- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;libxl_device_disk_local_detach&#40;ctx&#44; disk&#41;&#59;</font>    =
</p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      <font =
size=3D"2" face=3D"Dialog">&#43; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
libxl_device_disk_local_detach&#40;ctx&#44; disk&#44; diskpath&#41;&#59;</f=
ont>    </p>=0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      =
<font size=3D"2" face=3D"Dialog">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;free&#40;diskpath&#41;&#59;</font>    </p>=0A    <p style=3D"ma=
rgin-top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;</font>    </p>=0A    <p style=3D"margin-=
top: 0; margin-bottom: 0">=0A      <font size=3D"2" face=3D"Dialog">&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;if &#40;fifo_fd &gt; -1&#41;</font>    </p>=0A<br>  =
    =0A    <p style=3D"margin-top: 0; margin-bottom: 0">=0A      &gt;&gt;&g=
t; Stefano Stabellini &lt;stefano.stabellini@eu.citrix.com&gt; 10/19/2011 =
9:40 PM &gt;&gt;&gt;<br>On Wed&#44; 19 Oct 2011&#44; Fajar A. Nugraha =
wrote:<br>&gt; On Wed&#44; Oct 19&#44; 2011 at 5:55 PM&#44; Stefano =
Stabellini<br>&gt; &lt;stefano.stabellini@eu.citrix.com&gt; wrote:<br>&gt; =
&gt;&gt; This is a PV guest configured with pygrub&#44; correct&#63;<br>&gt=
; &gt;&gt; If so&#44; qcow/qcow2 are not supported in this scenario.<br>&gt=
; &gt;&gt;<br>&gt; &gt;&gt; You could:<br>&gt; &gt;&gt;<br>&gt; &gt;&gt; - =
avoid using pygrub &#40;specify the kernel manually&#41; and keep using =
qcow/qcow2&#59;<br>&gt; &gt;&gt; - switch to raw disks and keep using =
pygrub&#59;<br>&gt; &gt;&gt; - install a Linux kernel that support blktap2 =
&#40;like the XCP kernel&#44; see<br>&gt; &gt;&gt;&#160;&#160;&#32;<a =
href=3D"http://wiki.xen.org/xenwiki/XenDom0Kernels)">http://wiki.xen.org/xe=
nwiki/XenDom0Kernels&#41;</a>&nbsp;and switch to VHD format.<br>&gt; =
&gt;&gt;<br>&gt; &gt;<br>&gt; &gt; The way to make it work would be to =
call qemu-nbd and nbd-client from xl<br>&gt; &gt; so that a /dev/nbd0 =
comes up in dom0 and pygrub can use it to extract<br>&gt; &gt; the kernel =
and initrd from the qcow2 image.<br>&gt;<br>&gt; would pv-grub work&#63; =
If yes&#44; it would give better performance compared<br>&gt; to nbd =
workaround.<br><br>Yes&#44; it should. That would be the other alternative.=
=0A    </p>=0A  </body>=0A</html>=0A

--=__Part1E31F55B.5__=--

--=__Part1E31F55B.4__=
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

--=__Part1E31F55B.4__=--


From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:23:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:23:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJOz9-0001iL-Pr; Thu, 27 Oct 2011 05:23:05 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJH4s-0005pd-8D
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 20:56:32 -0700
X-Env-Sender: johneed@hotmail.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319687774!879389!1
X-Originating-IP: [65.55.34.78]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15848 invoked from network); 27 Oct 2011 03:56:15 -0000
Received: from col0-omc2-s4.col0.hotmail.com (HELO
	col0-omc2-s4.col0.hotmail.com) (65.55.34.78)
	by server-14.tower-182.messagelabs.com with SMTP;
	27 Oct 2011 03:56:15 -0000
Received: from COL119-W42 ([65.55.34.72]) by col0-omc2-s4.col0.hotmail.com
	with Microsoft SMTPSVC(6.0.3790.4675); 
	Wed, 26 Oct 2011 20:56:13 -0700
Message-ID: <COL119-W42851B3EE6BA91D4E1BD22A8D20@phx.gbl>
Content-Type: multipart/mixed;
	boundary="_1301e820-637c-45fc-aa29-edc763a73098_"
X-Originating-IP: [124.169.33.18]
From: Windows Live <johneed@hotmail.com>
To: <xen-devel@lists.xensource.com>
Date: Thu, 27 Oct 2011 11:56:12 +0800
Importance: Normal
MIME-Version: 1.0
X-OriginalArrivalTime: 27 Oct 2011 03:56:13.0427 (UTC)
	FILETIME=[5EBD5430:01CC945C]
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:14 -0700
Subject: [Xen-devel] QA issue & paths issue in xen-4.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

--_1301e820-637c-45fc-aa29-edc763a73098_
Content-Type: multipart/alternative;
	boundary="_fb449321-f1d1-4f78-a939-1d5019ed096f_"

--_fb449321-f1d1-4f78-a939-1d5019ed096f_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


Having re-listed=2C it seems I may as well submit this shortcoming.

 * QA Notice: command not found:
 *=20
 *      /var/tmp/portage/portage/app-emulation/xen-pvgrub-4.1.2/temp/enviro=
nment: line 2272: get_abi_ASFLAGS: command not found

 * QA Notice: Package triggers severe warnings which indicate that it
 *            may exhibit random runtime failures.
 * ../../../../../newlib-1.16.0/newlib/libc/stdlib/wcstoull.c:136:2: warnin=
g: implicit declaration of function '_wcstoull_r'
 * ../../../../../newlib-1.16.0/newlib/libc/reent/signalr.c:61:3: warning: =
implicit declaration of function 'kill'
 * ../../../../newlib-1.16.0/newlib/doc/makedoc.c:1147:6: warning: implicit=
 declaration of function 'strcmp'
 * ../grub-upstream/stage2/builtins.c:1728:3: warning: implicit declaration=
 of function 'do_exit'
 * ../../../../../newlib-1.16.0/newlib/libc/stdlib/wcstoull.c:136:2: warnin=
g: implicit declaration of function '_wcstoull_r'
 * ../../../../../newlib-1.16.0/newlib/libc/stdio64/fseeko64.c:122:7: warni=
ng: implicit declaration of function '_fseeko_r'
 * ../../../../../newlib-1.16.0/newlib/libc/stdio64/ftello64.c:96:5: warnin=
g: implicit declaration of function '_ftello_r'
 * ../../../../../newlib-1.16.0/newlib/libc/reent/signalr.c:61:3: warning: =
implicit declaration of function 'kill'
 * ../../../../../newlib-1.16.0/newlib/libc/reent/fstat64r.c:65:3: warning:=
 implicit declaration of function '_fstat64'
 * ../../../../../newlib-1.16.0/newlib/libc/reent/lseek64r.c:61:3: warning:=
 implicit declaration of function 'lseek64'
 * ../../../../../newlib-1.16.0/newlib/libc/reent/open64r.c:62:3: warning: =
implicit declaration of function '_open64'
 * ../../../../newlib-1.16.0/newlib/doc/makedoc.c:1147:6: warning: implicit=
 declaration of function 'strcmp'
 * ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:113:3: warning: im=
plicit declaration of function 'sbrk'
 * ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:116:7: warning: im=
plicit declaration of function 'write'
 * ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:119:3: warning: im=
plicit declaration of function 'bzero'
 * ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:165:3: warning: im=
plicit declaration of function 'moncontrol'
 * ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:179:3: warning: im=
plicit declaration of function 'profil_write'
 * ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:228:7: warning: im=
plicit declaration of function 'atexit'
 * ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:350:7: warning: im=
plicit declaration of function 'profil'
 * ../grub-upstream/stage2/builtins.c:1728:3: warning: implicit declaration=
 of function 'do_exit'


 * QA Notice: Package triggers severe warnings which indicate that it
 *            may exhibit random runtime failures.
 * ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:119:3: warning: in=
compatible implicit declaration of built-in function 'bzero'

 * Please do not file a Gentoo bug and instead report the above QA
 * issues directly to the upstream developers of this software.
 * Homepage: http://xen.org/


On a brief look=3B
gentoo64 xen-tools # find /var/tmp/portage/portage/app-emulation/xen-pvgrub=
-4.1.2/work/xen-4.1.2/ -iname wcstoull.c
/var/tmp/portage/portage/app-emulation/xen-pvgrub-4.1.2/work/xen-4.1.2/stub=
dom/newlib-1.16.0/newlib/libc/stdlib/wcstoull.c

gentoo64 xen-tools # grep -r _wcstoull_r /var/tmp/portage/portage/app-emula=
tion/xen-pvgrub-4.1.2/work/xen-4.1.2/=20
reveals

/var/tmp/portage/portage/app-emulation/xen-pvgrub-4.1.2/work/xen-4.1.2/stub=
dom/newlib-1.16.0/newlib/libc/include/wchar.h
:unsigned long long _EXFUN(_wcstoull_r=2C (struct _reent *=2C const wchar_t=
 *=2C wchar_t **=2C int))=3B
/var/tmp/portage/portage/app-emulation/xen-pvgrub-4.1.2/work/xen-4.1.2/stub=
dom/cross-root-i686/i686-xen-elf/include/wchar.h:unsigned long long _EXFUN(=
_wcstoull_r=2C (struct _reent *=2C const wchar_t *=2C wchar_t **=2C int))=
=3B

gentoo64 xen-tools # grep -r do_exit /var/tmp/portage/portage/app-emulation=
/xen-pvgrub-4.1.2/work/xen-4.1.2/=20
reveals
/var/tmp/portage/portage/app-emulation/xen-pvgrub-4.1.2/work/xen-4.1.2/stub=
dom/grub/config.h:#define grub_halt(a) do_exit()

gentoo64 xen-tools # grep -r bzero /var/tmp/portage/portage/app-emulation/x=
en-pvgrub-4.1.2/work/xen-4.1.2/ |grep "\.h"
/var/tmp/portage/portage/app-emulation/xen-pvgrub-4.1.2/work/xen-4.1.2/extr=
as/mini-os/include/posix/strings.h:#define bzero(ptr=2C size) (memset((ptr)=
=2C '\0'=2C (size))=2C (void) 0)

They are all there to be found it seems.  This may be nothing or there may =
be a list of paths that need hooking up.

I've included the tail and the head of a 5.3 mb buildlog so you can see (en=
ough of) what is being done.

The first one appears to not concern you=2C  https://bugs.gentoo.org/388629=
.









 		 	   		  =

--_fb449321-f1d1-4f78-a939-1d5019ed096f_
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable

<html>
<head>
<style><!--
.hmmessage P
{
margin:0px=3B
padding:0px
}
body.hmmessage
{
font-size: 10pt=3B
font-family:Tahoma
}
--></style>
</head>
<body class=3D'hmmessage'><div dir=3D'ltr'>
Having re-listed=2C it seems I may as well submit this shortcoming.<br><br>=
&nbsp=3B* QA Notice: command not found:<br>&nbsp=3B* <br>&nbsp=3B*&nbsp=3B&=
nbsp=3B&nbsp=3B&nbsp=3B&nbsp=3B /var/tmp/portage/portage/app-emulation/xen-=
pvgrub-4.1.2/temp/environment: line 2272: get_abi_ASFLAGS: command not foun=
d<br><br>&nbsp=3B* QA Notice: Package triggers severe warnings which indica=
te that it<br>&nbsp=3B*&nbsp=3B&nbsp=3B&nbsp=3B&nbsp=3B&nbsp=3B&nbsp=3B&nbs=
p=3B&nbsp=3B&nbsp=3B&nbsp=3B&nbsp=3B may exhibit random runtime failures.<b=
r>&nbsp=3B* ../../../../../newlib-1.16.0/newlib/libc/stdlib/wcstoull.c:136:=
2: warning: implicit declaration of function '_wcstoull_r'<br>&nbsp=3B* ../=
../../../../newlib-1.16.0/newlib/libc/reent/signalr.c:61:3: warning: implic=
it declaration of function 'kill'<br>&nbsp=3B* ../../../../newlib-1.16.0/ne=
wlib/doc/makedoc.c:1147:6: warning: implicit declaration of function 'strcm=
p'<br>&nbsp=3B* ../grub-upstream/stage2/builtins.c:1728:3: warning: implici=
t declaration of function 'do_exit'<br>&nbsp=3B* ../../../../../newlib-1.16=
.0/newlib/libc/stdlib/wcstoull.c:136:2: warning: implicit declaration of fu=
nction '_wcstoull_r'<br>&nbsp=3B* ../../../../../newlib-1.16.0/newlib/libc/=
stdio64/fseeko64.c:122:7: warning: implicit declaration of function '_fseek=
o_r'<br>&nbsp=3B* ../../../../../newlib-1.16.0/newlib/libc/stdio64/ftello64=
.c:96:5: warning: implicit declaration of function '_ftello_r'<br>&nbsp=3B*=
 ../../../../../newlib-1.16.0/newlib/libc/reent/signalr.c:61:3: warning: im=
plicit declaration of function 'kill'<br>&nbsp=3B* ../../../../../newlib-1.=
16.0/newlib/libc/reent/fstat64r.c:65:3: warning: implicit declaration of fu=
nction '_fstat64'<br>&nbsp=3B* ../../../../../newlib-1.16.0/newlib/libc/ree=
nt/lseek64r.c:61:3: warning: implicit declaration of function 'lseek64'<br>=
&nbsp=3B* ../../../../../newlib-1.16.0/newlib/libc/reent/open64r.c:62:3: wa=
rning: implicit declaration of function '_open64'<br>&nbsp=3B* ../../../../=
newlib-1.16.0/newlib/doc/makedoc.c:1147:6: warning: implicit declaration of=
 function 'strcmp'<br>&nbsp=3B* ../../../../newlib-1.16.0/libgloss/i386/cyg=
mon-gmon.c:113:3: warning: implicit declaration of function 'sbrk'<br>&nbsp=
=3B* ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:116:7: warning: =
implicit declaration of function 'write'<br>&nbsp=3B* ../../../../newlib-1.=
16.0/libgloss/i386/cygmon-gmon.c:119:3: warning: implicit declaration of fu=
nction 'bzero'<br>&nbsp=3B* ../../../../newlib-1.16.0/libgloss/i386/cygmon-=
gmon.c:165:3: warning: implicit declaration of function 'moncontrol'<br>&nb=
sp=3B* ../../../../newlib-1.16.0/libgloss/i386/cygmon-gmon.c:179:3: warning=
: implicit declaration of function 'profil_write'<br>&nbsp=3B* ../../../../=
newlib-1.16.0/libgloss/i386/cygmon-gmon.c:228:7: warning: implicit declarat=
ion of function 'atexit'<br>&nbsp=3B* ../../../../newlib-1.16.0/libgloss/i3=
86/cygmon-gmon.c:350:7: warning: implicit declaration of function 'profil'<=
br>&nbsp=3B* ../grub-upstream/stage2/builtins.c:1728:3: warning: implicit d=
eclaration of function 'do_exit'<br><br><br>&nbsp=3B* QA Notice: Package tr=
iggers severe warnings which indicate that it<br>&nbsp=3B*&nbsp=3B&nbsp=3B&=
nbsp=3B&nbsp=3B&nbsp=3B&nbsp=3B&nbsp=3B&nbsp=3B&nbsp=3B&nbsp=3B&nbsp=3B may=
 exhibit random runtime failures.<br>&nbsp=3B* ../../../../newlib-1.16.0/li=
bgloss/i386/cygmon-gmon.c:119:3: warning: incompatible implicit declaration=
 of built-in function 'bzero'<br><br>&nbsp=3B* Please do not file a Gentoo =
bug and instead report the above QA<br>&nbsp=3B* issues directly to the ups=
tream developers of this software.<br>&nbsp=3B* Homepage: http://xen.org/<b=
r><br><br>On a brief look=3B<br>gentoo64 xen-tools # find /var/tmp/portage/=
portage/app-emulation/xen-pvgrub-4.1.2/work/xen-4.1.2/ -iname wcstoull.c<br=
>/var/tmp/portage/portage/app-emulation/xen-pvgrub-4.1.2/work/xen-4.1.2/stu=
bdom/newlib-1.16.0/newlib/libc/stdlib/wcstoull.c<br><br>gentoo64 xen-tools =
# grep -r _wcstoull_r /var/tmp/portage/portage/app-emulation/xen-pvgrub-4.1=
.2/work/xen-4.1.2/ <br>reveals<br><br>/var/tmp/portage/portage/app-emulatio=
n/xen-pvgrub-4.1.2/work/xen-4.1.2/stubdom/newlib-1.16.0/newlib/libc/include=
/wchar.h<br>:unsigned long long _EXFUN(_wcstoull_r=2C (struct _reent *=2C c=
onst wchar_t *=2C wchar_t **=2C int))=3B<br>/var/tmp/portage/portage/app-em=
ulation/xen-pvgrub-4.1.2/work/xen-4.1.2/stubdom/cross-root-i686/i686-xen-el=
f/include/wchar.h:unsigned long long _EXFUN(_wcstoull_r=2C (struct _reent *=
=2C const wchar_t *=2C wchar_t **=2C int))=3B<br><br>gentoo64 xen-tools # g=
rep -r do_exit /var/tmp/portage/portage/app-emulation/xen-pvgrub-4.1.2/work=
/xen-4.1.2/ <br>reveals<br>/var/tmp/portage/portage/app-emulation/xen-pvgru=
b-4.1.2/work/xen-4.1.2/stubdom/grub/config.h:#define grub_halt(a) do_exit()=
<br><br>gentoo64 xen-tools # grep -r bzero /var/tmp/portage/portage/app-emu=
lation/xen-pvgrub-4.1.2/work/xen-4.1.2/ |grep "\.h"<br>/var/tmp/portage/por=
tage/app-emulation/xen-pvgrub-4.1.2/work/xen-4.1.2/extras/mini-os/include/p=
osix/strings.h:#define bzero(ptr=2C size) (memset((ptr)=2C '\0'=2C (size))=
=2C (void) 0)<br><br>They are all there to be found it seems.&nbsp=3B This =
may be nothing or there may be a list of paths that need hooking up.<br><br=
>I've included the tail and the head of a 5.3 mb buildlog so you can see (e=
nough of) what is being done.<br><br>The first one appears to not concern y=
ou=2C&nbsp=3B https://bugs.gentoo.org/388629.<br><br><br><br><br><br><br><b=
r><br><br> 		 	   		  </div></body>
</html>=

--_fb449321-f1d1-4f78-a939-1d5019ed096f_--

--_1301e820-637c-45fc-aa29-edc763a73098_
Content-Type: application/octet-stream
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="build.tail"

Z2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAt
VSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAt
aXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1E
UEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYu
MFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3JlZW50IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1yZW5hbWVyLm8gYHRlc3QgLWYgJ3JlbmFtZXIuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9yZWVudC8nYHJlbmFtZXIuYwpn
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvcmVlbnQgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8t
YnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAg
IC1jIC1vIGxpYl9hLXNpZ25hbHIubyBgdGVzdCAtZiAnc2lnbmFsci5jJyB8fCBlY2hvICcuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3JlZW50Lydgc2lnbmFsci5jCi4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvcmVlbnQvc2lnbmFsci5jOiBJ
biBmdW5jdGlvbiAnX2tpbGxfcic6Ci4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvcmVlbnQvc2lnbmFsci5jOjYxOjM6IHdhcm5pbmc6IGltcGxpY2l0IGRlY2xhcmF0aW9u
IG9mIGZ1bmN0aW9uICdraWxsJwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94
ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxM
T1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
eDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFS
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NU
UklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvcmVlbnQgLU8yIC1ETUlTU0lO
R19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNpZ25nYW0ubyBgdGVzdCAtZiAnc2ln
bmdhbS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L3JlZW50Lydgc2lnbmdhbS5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9yZWVudCAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2Jya3IubyBgdGVzdCAtZiAnc2Jya3Iu
YycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9yZWVu
dC8nYHNicmtyLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
Mi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3JlZW50IC1PMiAtRE1JU1NJTkdfU1lTQ0FM
TF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zdGF0ci5vIGB0ZXN0IC1mICdzdGF0ci5jJyB8fCBl
Y2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3JlZW50Lydgc3Rh
dHIuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5v
LXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNr
LXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBU
UyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGli
bm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZf
NjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwg
MS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvcmVlbnQgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVT
IC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAgIC1jIC1vIGxpYl9hLXRpbWVzci5vIGB0ZXN0IC1mICd0aW1lc3IuYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9yZWVudC8nYHRpbWVzci5j
CmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
LyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5
cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAt
RFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2
LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9yZWVudCAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZu
by1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
ICAgLWMgLW8gbGliX2EtdW5saW5rci5vIGB0ZXN0IC1mICd1bmxpbmtyLmMnIHx8IGVjaG8gJy4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvcmVlbnQvJ2B1bmxpbmtyLmMK
Z2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAt
VSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAt
aXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1E
UEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYu
MFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3JlZW50IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS13cml0ZXIubyBgdGVzdCAtZiAnd3JpdGVyLmMnIHx8IGVjaG8gJy4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvcmVlbnQvJ2B3cml0ZXIuYwpnY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvcmVlbnQgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLWV4ZWNyLm8gYHRlc3QgLWYgJ2V4ZWNyLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvcmVlbnQvJ2BleGVjci5jCnJtIC1mIGxpYi5h
CmFyIGNydSBsaWIuYSBsaWJfYS1jbG9zZXIubyBsaWJfYS1yZWVudC5vIGxpYl9hLWltcHVyZS5v
IGxpYl9hLWZjbnRsci5vIGxpYl9hLWZzdGF0ci5vIGxpYl9hLWdldHJlZW50Lm8gbGliX2EtZ2V0
dGltZW9mZGF5ci5vIGxpYl9hLWxpbmtyLm8gbGliX2EtbHNlZWtyLm8gbGliX2Etb3BlbnIubyBs
aWJfYS1yZWFkci5vIGxpYl9hLXJlbmFtZXIubyBsaWJfYS1zaWduYWxyLm8gbGliX2Etc2lnbmdh
bS5vIGxpYl9hLXNicmtyLm8gbGliX2Etc3RhdHIubyBsaWJfYS10aW1lc3IubyBsaWJfYS11bmxp
bmtyLm8gbGliX2Etd3JpdGVyLm8gIGxpYl9hLWV4ZWNyLm8gCnJhbmxpYiBsaWIuYQptYWtlWzZd
OiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvcmVlbnQnCk1ha2luZyBhbGwgaW4gZXJybm8KbWFr
ZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9lcnJubycKZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRp
b25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWlu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEu
MTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdS
RVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2Vycm5vIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1lcnJu
by5vIGB0ZXN0IC1mICdlcnJuby5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2Vycm5vLydgZXJybm8uYwouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2Vycm5vL2Vycm5vLmM6MTE6MTogd2FybmluZzogZnVuY3Rpb24gZGVj
bGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKcm0gLWYgbGliLmEKYXIgY3J1IGxpYi5hIGxpYl9h
LWVycm5vLm8gCnJhbmxpYiBsaWIuYQptYWtlWzZdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMv
ZXJybm8nCk1ha2luZyBhbGwgaW4gbWlzYwptYWtlWzZdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9s
aWJjL21pc2MnCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBf
X2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRl
IC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8t
c3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRF
UlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3Nz
L3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3
bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9taXNjIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9O
QU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAtYyAtbyBsaWJfYS1fX2RwcmludGYubyBgdGVzdCAtZiAnX19kcHJpbnRmLmMn
IHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvbWlzYy8n
YF9fZHByaW50Zi5jCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvbWlz
Yy9fX2RwcmludGYuYzoyMjoxOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBh
IHByb3RvdHlwZQouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL21pc2Mv
X19kcHJpbnRmLmM6MjM6MTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBw
cm90b3R5cGUKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9taXNjL19f
ZHByaW50Zi5jOjI0OjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJv
dG90eXBlCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvbWlzYy9fX2Rw
cmludGYuYzoyNToxOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3Rv
dHlwZQouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL21pc2MvX19kcHJp
bnRmLmM6MTc5OjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90
eXBlCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvbWlzYy9fX2Rwcmlu
dGYuYzoyMjI6MTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5
cGUKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9taXNjL19fZHByaW50
Zi5jOjI1NjoxOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlw
ZQouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL21pc2MvX19kcHJpbnRm
LmM6MjY3OjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBl
CmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
LyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5
cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAt
RFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2
LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9taXNjIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS11bmN0cmwubyBgdGVzdCAtZiAndW5jdHJsLmMnIHx8IGVjaG8gJy4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvbWlzYy8nYHVuY3RybC5jCmdjYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAt
RF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19G
cmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0
ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUg
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9y
IC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tB
R0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAt
RFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9taXNjIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0
aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAt
byBsaWJfYS1mZnMubyBgdGVzdCAtZiAnZmZzLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvbWlzYy8nYGZmcy5jCmdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9t
aXNjIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1pbml0Lm8g
YHRlc3QgLWYgJ2luaXQuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9taXNjLydgaW5pdC5jCnJtIC1mIGxpYi5hCmFyIGNydSBsaWIuYSBsaWJfYS1f
X2RwcmludGYubyBsaWJfYS11bmN0cmwubyBsaWJfYS1mZnMubyBsaWJfYS1pbml0Lm8gCnJhbmxp
YiBsaWIuYQptYWtlWzZdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvbWlzYycKTWFraW5nIGFs
bCBpbiBtYWNoaW5lCm1ha2VbNl06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvbWFjaGluZScK
TWFraW5nIGFsbCBpbiB4ODZfNjQKbWFrZVs3XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9t
YWNoaW5lL3g4Nl82NCcKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hX
X0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82
NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MveDg2XzY0IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAg
LWMgLW8gbGliX2Etc2V0am1wLm8gYHRlc3QgLWYgJ3NldGptcC5TJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL21hY2hpbmUveDg2XzY0Lydgc2V0
am1wLlMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgLWMgLW8gbGli
X2EtbWVtY3B5Lm8gYHRlc3QgLWYgJ21lbWNweS5TJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL21hY2hpbmUveDg2XzY0LydgbWVtY3B5LlMKZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1PMiAt
RE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgLWMgLW8gbGliX2EtbWVtc2V0
Lm8gYHRlc3QgLWYgJ21lbXNldC5TJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL21hY2hpbmUveDg2XzY0LydgbWVtc2V0LlMKcm0gLWYgbGliLmEK
YXIgY3J1IGxpYi5hIGxpYl9hLXNldGptcC5vIGxpYl9hLW1lbWNweS5vIGxpYl9hLW1lbXNldC5v
IApyYW5saWIgbGliLmEKbWFrZVs3XTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL21hY2hpbmUv
eDg2XzY0JwpNYWtpbmcgYWxsIGluIC4KbWFrZVs3XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGli
Yy9tYWNoaW5lJwpybSAtZiBsaWIuYQpsbiB4ODZfNjQvbGliLmEgbGliLmEgPi9kZXYvbnVsbCAy
Pi9kZXYvbnVsbCB8fCBcCiBjcCB4ODZfNjQvbGliLmEgbGliLmEKbWFrZVs3XTogTGVhdmluZyBk
aXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi9saWJjL21hY2hpbmUnCm1ha2VbNl06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGli
Yy9tYWNoaW5lJwpNYWtpbmcgYWxsIGluIC4KbWFrZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
bGliYycKcm0gLWYgbGliYy5hCnJtIC1yZiB0bXAKbWtkaXIgdG1wCmNkIHRtcDsgXAogZm9yIGkg
aW4gYXJnei9saWIuYSBzdGRsaWIvbGliLmEgY3R5cGUvbGliLmEgc2VhcmNoL2xpYi5hIHN0ZGlv
L2xpYi5hICBzdHJpbmcvbGliLmEgc2lnbmFsL2xpYi5hIHRpbWUvbGliLmEgbG9jYWxlL2xpYi5h
IHJlZW50L2xpYi5hICBlcnJuby9saWIuYSBtaXNjL2xpYi5hICAgICBtYWNoaW5lL2xpYi5hIDsg
ZG8gXAogICBhciB4IC4uLyRpOyBcCiBkb25lOyBcCmFyIHJjIC4uL2xpYmMuYSAqLm8KcmFubGli
IGxpYmMuYQpybSAtcmYgdG1wCm1ha2VbNl06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYycKbWFr
ZVs1XTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjJwpNYWtpbmcgYWxsIGluIGxpYm0KbWFrZVs1
XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGlibScKTWFraW5nIGFsbCBpbiBtYXRoCm1ha2VbNl06
IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYm0vbWF0aCcKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVf
TElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3Rv
cmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9f
IC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9v
dC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2
XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9p
bmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1E
X0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
aW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwi
IC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9
XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgg
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9u
IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1rX3N0YW5kYXJk
Lm8gYHRlc3QgLWYgJ2tfc3RhbmRhcmQuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydga19zdGFuZGFyZC5jCmdjYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18g
LURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xz
L3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUg
X19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Ny
b3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIv
Z2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0
aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIx
LjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVH
UkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4u
L2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8y
IC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Eta19y
ZW1fcGlvMi5vIGB0ZXN0IC1mICdrX3JlbV9waW8yLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGtfcmVtX3BpbzIuYwpnY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5v
LWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
L3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJT
SU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNL
QUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0v
bWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLWtfY29zLm8gYHRlc3QgLWYgJ2tfY29zLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGtfY29zLmMKZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRp
b25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWlu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEu
MTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdS
RVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJt
L21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4v
Y29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1rX3Np
bi5vIGB0ZXN0IC1mICdrX3Npbi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJtL21hdGgvJ2BrX3Npbi5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5j
bHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9J
Mzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2lu
Y2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAt
RFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwi
XCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1J
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAt
TzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Eta190YW4ubyBgdGVz
dCAtZiAna190YW4uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoLydga190YW4uYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUku
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlT
U0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVfYWNvcy5vIGB0ZXN0IC1mICdl
X2Fjb3MuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9tYXRoLydgZV9hY29zLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdf
U1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1lX2Fjb3NoLm8gYHRlc3QgLWYgJ2VfYWNv
c2guYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9t
YXRoLydgZV9hY29zaC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5H
PVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZ
U0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZV9hc2luLm8gYHRlc3QgLWYgJ2VfYXNpbi5j
JyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgv
J2BlX2FzaW4uYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUg
X19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4y
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVk
ZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5v
LXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5U
RVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9z
cy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5l
d2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxM
X05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVfYXRhbjIubyBgdGVzdCAtZiAnZV9hdGFuMi5jJyB8
fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2Bl
X2F0YW4yLmMKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoL2Vf
YXRhbjIuYzogSW4gZnVuY3Rpb24gJ19faWVlZTc1NF9hdGFuMic6Ci4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC9lX2F0YW4yLmM6NzY6Mjogd2FybmluZzogc3Vn
Z2VzdCBwYXJlbnRoZXNlcyBhcm91bmQgYXJpdGhtZXRpYyBpbiBvcGVyYW5kIG9mICd8JwpnY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLWVfYXRhbmgubyBgdGVzdCAtZiAnZV9hdGFuaC5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BlX2F0YW5oLmMKZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0
aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAt
byBsaWJfYS1lX2Nvc2gubyBgdGVzdCAtZiAnZV9jb3NoLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVfY29zaC5jCmdjYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlO
SU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNE
X18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vz
ci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJ
T049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tB
R0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9t
YXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAg
ICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGli
X2EtZV9leHAubyBgdGVzdCAtZiAnZV9leHAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgZV9leHAuYwouLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvZV9leHAuYzogSW4gZnVuY3Rpb24gJ19faWVlZTc1
NF9leHAnOgouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvZV9l
eHAuYzoxMTE6MTE6IHdhcm5pbmc6ICdoaScgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0
aGlzIGZ1bmN0aW9uCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0
aC9lX2V4cC5jOjExMToxNDogd2FybmluZzogJ2xvJyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVk
IGluIHRoaXMgZnVuY3Rpb24KLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9tYXRoL2VfZXhwLmM6MTEyOjEyOiB3YXJuaW5nOiAnaycgbWF5IGJlIHVzZWQgdW5pbml0aWFs
aXplZCBpbiB0aGlzIGZ1bmN0aW9uCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51
eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4u
L3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9B
TExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9U
QVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0Vf
U1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1J
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNT
SU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZV9mbW9kLm8gYHRlc3QgLWYgJ2Vf
Zm1vZC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJt
L21hdGgvJ2BlX2Ztb2QuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZf
NjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251
LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4v
aW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1df
SFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2
XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklO
Rz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVyX2dhbW1hLm8gYHRlc3QgLWYgJ2VyX2dh
bW1hLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0v
bWF0aC8nYGVyX2dhbW1hLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdf
U1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1lX2h5cG90Lm8gYHRlc3QgLWYgJ2VfaHlw
b3QuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9t
YXRoLydgZV9oeXBvdC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5H
PVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZ
U0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZV9qMC5vIGB0ZXN0IC1mICdlX2owLmMnIHx8
IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVf
ajAuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5v
LXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNr
LXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBU
UyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGli
bm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZf
NjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwg
MS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVT
IC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAgIC1jIC1vIGxpYl9hLWVfajEubyBgdGVzdCAtZiAnZV9qMS5jJyB8fCBlY2hvICcuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BlX2oxLmMKZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0
aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAt
byBsaWJfYS1lX2puLm8gYHRlc3QgLWYgJ2Vfam4uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgZV9qbi5jCi4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC9lX2puLmM6IEluIGZ1bmN0aW9uICdfX2llZWU3
NTRfam4nOgouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvZV9q
bi5jOjY3OjE1OiB3YXJuaW5nOiAndGVtcCcgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0
aGlzIGZ1bmN0aW9uCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0
aC9lX2puLmM6IEluIGZ1bmN0aW9uICdfX2llZWU3NTRfeW4nOgouLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvZV9qbi5jOjIyODoxNTogd2FybmluZzogJ3RlbXAn
IG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgpnY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4
Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rh
cmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9O
PVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdF
X0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0
aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAg
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9h
LWVyX2xnYW1tYS5vIGB0ZXN0IC1mICdlcl9sZ2FtbWEuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgZXJfbGdhbW1hLmMKLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoL2VyX2xnYW1tYS5jOiBJbiBmdW5j
dGlvbiAnX19pZWVlNzU0X2xnYW1tYV9yJzoKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoL2VyX2xnYW1tYS5jOjIxOToxNTogd2FybmluZzogJ25hZGonIG1heSBi
ZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgpnY2MgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1E
SEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94
ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9f
c3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9z
cy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2dj
Yy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0v
bWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9j
b21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVfbG9n
Lm8gYHRlc3QgLWYgJ2VfbG9nLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVfbG9nLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNs
dWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1P
MiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1lX2xvZzEwLm8gYHRl
c3QgLWYgJ2VfbG9nMTAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoLydgZV9sb2cxMC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVk
ZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZV9wb3cubyBgdGVzdCAt
ZiAnZV9wb3cuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGlibS9tYXRoLydgZV9wb3cuYwouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJtL21hdGgvZV9wb3cuYzogSW4gZnVuY3Rpb24gJ19faWVlZTc1NF9wb3cnOgouLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvZV9wb3cuYzoxMjI6NDogd2Fybmlu
Zzogc3VnZ2VzdCBleHBsaWNpdCBicmFjZXMgdG8gYXZvaWQgYW1iaWd1b3VzICdlbHNlJwpnY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLWVfcmVtX3BpbzIubyBgdGVzdCAtZiAnZV9yZW1fcGlvMi5jJyB8fCBlY2hvICcu
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BlX3JlbV9waW8y
LmMKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoL2VfcmVtX3Bp
bzIuYzogSW4gZnVuY3Rpb24gJ19faWVlZTc1NF9yZW1fcGlvMic6Ci4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC9lX3JlbV9waW8yLmM6MTcwOjI6IHdhcm5pbmc6
ICd6JyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24KZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZu
by1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9O
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVS
U0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFD
S0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJt
L21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4g
ICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBs
aWJfYS1lX3JlbWFpbmRlci5vIGB0ZXN0IC1mICdlX3JlbWFpbmRlci5jJyB8fCBlY2hvICcuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BlX3JlbWFpbmRlci5j
CmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
LyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5
cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAt
RFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2
LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZu
by1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
ICAgLWMgLW8gbGliX2EtZV9zY2FsYi5vIGB0ZXN0IC1mICdlX3NjYWxiLmMnIHx8IGVjaG8gJy4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVfc2NhbGIuYwpn
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8t
YnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAg
IC1jIC1vIGxpYl9hLWVfc2luaC5vIGB0ZXN0IC1mICdlX3NpbmguYycgfHwgZWNobyAnLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgZV9zaW5oLmMKZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0
aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAt
byBsaWJfYS1lX3NxcnQubyBgdGVzdCAtZiAnZV9zcXJ0LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVfc3FydC5jCmdjYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlO
SU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNE
X18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vz
ci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJ
T049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tB
R0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9t
YXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAg
ICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGli
X2Etd19hY29zLm8gYHRlc3QgLWYgJ3dfYWNvcy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3X2Fjb3MuYwpnY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
Ym0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8u
Li9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdf
YWNvc2gubyBgdGVzdCAtZiAnd19hY29zaC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3X2Fjb3NoLmMKZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRp
b25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWlu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEu
MTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdS
RVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJt
L21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4v
Y29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13X2Fz
aW4ubyBgdGVzdCAtZiAnd19hc2luLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHdfYXNpbi5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZF
X0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0
b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5f
XyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJv
b3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4
Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
aW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBc
IiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JU
PVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRo
IC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1v
biAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd19hdGFuMi5v
IGB0ZXN0IC1mICd3X2F0YW4yLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aC8nYHdfYXRhbjIuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2lu
Y2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURf
STM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9p
bmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIg
LURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1c
IlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24g
LU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdfYXRhbmgubyBg
dGVzdCAtZiAnd19hdGFuaC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL21hdGgvJ2B3X2F0YW5oLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNs
dWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1P
MiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13X2Nvc2gubyBgdGVz
dCAtZiAnd19jb3NoLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vbWF0aC8nYHdfY29zaC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRp
bmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1s
aW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAt
SS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFD
SF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tB
R0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUku
IC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd19leHAubyBgdGVzdCAtZiAn
d19leHAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9tYXRoLydgd19leHAuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZf
NjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251
LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4v
aW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1df
SFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2
XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklO
Rz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdfZm1vZC5vIGB0ZXN0IC1mICd3X2Ztb2Qu
YycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRo
Lydgd19mbW9kLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
Mi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FM
TF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13X2dhbW1hLm8gYHRlc3QgLWYgJ3dfZ2FtbWEuYycg
fHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydg
d19nYW1tYS5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBf
X2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRl
IC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8t
c3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRF
UlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3Nz
L3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3
bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExf
TkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd3JfZ2FtbWEubyBgdGVzdCAtZiAnd3JfZ2FtbWEuYycg
fHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydg
d3JfZ2FtbWEuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUg
X19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4y
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVk
ZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5v
LXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5U
RVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9z
cy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5l
d2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxM
X05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdfaHlwb3QubyBgdGVzdCAtZiAnd19oeXBvdC5jJyB8
fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3
X2h5cG90LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9f
bGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
aW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9O
QU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAtYyAtbyBsaWJfYS13X2owLm8gYHRlc3QgLWYgJ3dfajAuYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgd19qMC5jCmdj
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUg
X19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlz
eXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpv
bmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVj
dG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBB
Q0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBc
IiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1i
dWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAg
LWMgLW8gbGliX2Etd19qMS5vIGB0ZXN0IC1mICd3X2oxLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHdfajEuYwpnY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4
Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rh
cmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9O
PVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdF
X0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0
aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAg
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9h
LXdfam4ubyBgdGVzdCAtZiAnd19qbi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3X2puLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVf
TElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3Rv
cmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9f
IC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9v
dC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2
XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9p
bmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1E
X0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
aW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwi
IC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9
XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgg
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9u
IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13X2xnYW1tYS5v
IGB0ZXN0IC1mICd3X2xnYW1tYS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJtL21hdGgvJ2B3X2xnYW1tYS5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZF
X0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0
b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5f
XyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJv
b3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4
Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
aW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBc
IiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JU
PVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRo
IC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1v
biAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd3JfbGdhbW1h
Lm8gYHRlc3QgLWYgJ3dyX2xnYW1tYS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3cl9sZ2FtbWEuYwpnY2MgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1E
SEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94
ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9f
c3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9z
cy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2dj
Yy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0v
bWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9j
b21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdfbG9n
Lm8gYHRlc3QgLWYgJ3dfbG9nLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aC8nYHdfbG9nLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNs
dWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1P
MiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13X2xvZzEwLm8gYHRl
c3QgLWYgJ3dfbG9nMTAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoLydgd19sb2cxMC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVk
ZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd19wb3cubyBgdGVzdCAt
ZiAnd19wb3cuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGlibS9tYXRoLydgd19wb3cuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94
ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxM
T1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
eDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFS
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NU
UklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lO
R19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdfcmVtYWluZGVyLm8gYHRlc3QgLWYg
J3dfcmVtYWluZGVyLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vbWF0aC8nYHdfcmVtYWluZGVyLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNs
dWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1P
MiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13X3NjYWxiLm8gYHRl
c3QgLWYgJ3dfc2NhbGIuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoLydgd19zY2FsYi5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVk
ZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd19zaW5oLm8gYHRlc3Qg
LWYgJ3dfc2luaC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJtL21hdGgvJ2B3X3NpbmguYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUku
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlT
U0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdfc3FydC5vIGB0ZXN0IC1mICd3
X3NxcnQuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9tYXRoLydgd19zcXJ0LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdf
U1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13X3NpbmNvcy5vIGB0ZXN0IC1mICd3X3Np
bmNvcy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJt
L21hdGgvJ2B3X3NpbmNvcy5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd19jYWJzLm8gYHRlc3QgLWYgJ3dfY2Fi
cy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21h
dGgvJ2B3X2NhYnMuYwouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21h
dGgvd19jYWJzLmM6MTY6MTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBw
cm90b3R5cGUKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9f
bGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
aW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9O
QU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAtYyAtbyBsaWJfYS13X2RyZW0ubyBgdGVzdCAtZiAnd19kcmVtLmMnIHx8IGVj
aG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHdfZHJl
bS5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4
X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1
ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lw
djQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRT
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJu
b3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82
NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAx
LjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMg
LWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgICAgLWMgLW8gbGliX2Etc19hc2luaC5vIGB0ZXN0IC1mICdzX2FzaW5oLmMnIHx8IGVjaG8g
Jy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHNfYXNpbmgu
YwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4x
Ni4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1m
bm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAgIC1jIC1vIGxpYl9hLXNfYXRhbi5vIGB0ZXN0IC1mICdzX2F0YW4uYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgc19hdGFuLmMKZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFD
S0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwi
IC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1
aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAt
YyAtbyBsaWJfYS1zX2NlaWwubyBgdGVzdCAtZiAnc19jZWlsLmMnIHx8IGVjaG8gJy4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHNfY2VpbC5jCmdjYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9f
TUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVl
QlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0g
L3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1m
bm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0Vf
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZF
UlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBB
Q0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGlu
ICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8g
bGliX2Etc19jb3MubyBgdGVzdCAtZiAnc19jb3MuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgc19jb3MuYwpnY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
Ym0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8u
Li9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNf
ZXJmLm8gYHRlc3QgLWYgJ3NfZXJmLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHNfZXJmLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVf
TElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3Rv
cmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9f
IC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9v
dC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2
XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9p
bmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1E
X0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
aW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwi
IC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9
XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgg
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9u
IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zX2ZhYnMubyBg
dGVzdCAtZiAnc19mYWJzLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYm0vbWF0aC8nYHNfZmFicy5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVk
ZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc19mbG9vci5vIGB0ZXN0
IC1mICdzX2Zsb29yLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vbWF0aC8nYHNfZmxvb3IuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3Rk
aW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82
NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMt
bGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUg
LUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1B
Q0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRl
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNL
QUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1J
LiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1E
TUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNfZnJleHAubyBgdGVzdCAt
ZiAnc19mcmV4cC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJtL21hdGgvJ2BzX2ZyZXhwLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGlu
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxp
bnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1J
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FH
RV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4g
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1J
U1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zX2xkZXhwLm8gYHRlc3QgLWYg
J3NfbGRleHAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGlibS9tYXRoLydgc19sZGV4cC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51
eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4u
L3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9B
TExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9U
QVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0Vf
U1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1J
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNT
SU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc19zaWduaWYubyBgdGVzdCAtZiAn
c19zaWduaWYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGlibS9tYXRoLydgc19zaWduaWYuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUku
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlT
U0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNfc2luLm8gYHRlc3QgLWYgJ3Nf
c2luLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0v
bWF0aC8nYHNfc2luLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hX
X0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82
NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9
XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lT
Q0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zX3Rhbi5vIGB0ZXN0IC1mICdzX3Rhbi5jJyB8
fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2Bz
X3Rhbi5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2Etc190YW5oLm8gYHRlc3QgLWYgJ3NfdGFuaC5jJyB8fCBlY2hv
ICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BzX3Rhbmgu
YwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4x
Ni4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1m
bm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAgIC1jIC1vIGxpYl9hLXdfZXhwMi5vIGB0ZXN0IC1mICd3X2V4cDIuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgd19leHAyLmMKZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFD
S0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwi
IC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1
aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAt
YyAtbyBsaWJfYS13X3RnYW1tYS5vIGB0ZXN0IC1mICd3X3RnYW1tYS5jJyB8fCBlY2hvICcuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3X3RnYW1tYS5jCmdj
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUg
X19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlz
eXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpv
bmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVj
dG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBB
Q0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBc
IiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1i
dWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAg
LWMgLW8gbGliX2Eta2ZfcmVtX3BpbzIubyBgdGVzdCAtZiAna2ZfcmVtX3BpbzIuYycgfHwgZWNo
byAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydga2ZfcmVt
X3BpbzIuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19s
aW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9p
bmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAt
bW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0
YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJS
VVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
bGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94
ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xp
YlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05B
TUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAgIC1jIC1vIGxpYl9hLWtmX2Nvcy5vIGB0ZXN0IC1mICdrZl9jb3MuYycgfHwgZWNo
byAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydga2ZfY29z
LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEu
MTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS1rZl9zaW4ubyBgdGVzdCAtZiAna2Zfc2luLmMnIHx8IGVjaG8gJy4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGtmX3Npbi5jCmdj
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUg
X19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlz
eXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpv
bmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVj
dG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBB
Q0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBc
IiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1i
dWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAg
LWMgLW8gbGliX2Eta2ZfdGFuLm8gYHRlc3QgLWYgJ2tmX3Rhbi5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BrZl90YW4uYwpnY2MgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURf
X01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJl
ZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVt
IC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAt
Zm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdF
X05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9W
RVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQ
QUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
Ym0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLWVmX2Fjb3MubyBgdGVzdCAtZiAnZWZfYWNvcy5jJyB8fCBlY2hvICcuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BlZl9hY29zLmMKZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZu
by1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9O
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVS
U0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFD
S0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJt
L21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4g
ICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBs
aWJfYS1lZl9hY29zaC5vIGB0ZXN0IC1mICdlZl9hY29zaC5jJyB8fCBlY2hvICcuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BlZl9hY29zaC5jCmdjYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9f
TUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVl
QlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0g
L3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1m
bm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0Vf
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZF
UlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBB
Q0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGlu
ICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8g
bGliX2EtZWZfYXNpbi5vIGB0ZXN0IC1mICdlZl9hc2luLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVmX2FzaW4uYwpnY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5v
LWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
L3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJT
SU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNL
QUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0v
bWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLWVmX2F0YW4yLm8gYHRlc3QgLWYgJ2VmX2F0YW4yLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVmX2F0YW4yLmMKZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZu
by1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9O
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVS
U0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFD
S0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJt
L21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4g
ICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBs
aWJfYS1lZl9hdGFuaC5vIGB0ZXN0IC1mICdlZl9hdGFuaC5jJyB8fCBlY2hvICcuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BlZl9hdGFuaC5jCmdjYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9f
TUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVl
QlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0g
L3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1m
bm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0Vf
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZF
UlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBB
Q0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGlu
ICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8g
bGliX2EtZWZfY29zaC5vIGB0ZXN0IC1mICdlZl9jb3NoLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVmX2Nvc2guYwpnY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5v
LWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
L3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJT
SU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNL
QUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0v
bWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLWVmX2V4cC5vIGB0ZXN0IC1mICdlZl9leHAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgZWZfZXhwLmMKLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoL2VmX2V4cC5jOiBJbiBmdW5jdGlvbiAnX19p
ZWVlNzU0X2V4cGYnOgouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21h
dGgvZWZfZXhwLmM6NDk6MTA6IHdhcm5pbmc6ICdoaScgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXpl
ZCBpbiB0aGlzIGZ1bmN0aW9uCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
Ym0vbWF0aC9lZl9leHAuYzo0OToxMzogd2FybmluZzogJ2xvJyBtYXkgYmUgdXNlZCB1bmluaXRp
YWxpemVkIGluIHRoaXMgZnVuY3Rpb24KLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoL2VmX2V4cC5jOjUwOjEyOiB3YXJuaW5nOiAnaycgbWF5IGJlIHVzZWQgdW5p
bml0aWFsaXplZCBpbiB0aGlzIGZ1bmN0aW9uCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVk
ZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZWZfZm1vZC5vIGB0ZXN0
IC1mICdlZl9mbW9kLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vbWF0aC8nYGVmX2Ztb2QuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3Rk
aW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82
NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMt
bGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUg
LUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1B
Q0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRl
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNL
QUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1J
LiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1E
TUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVyZl9nYW1tYS5vIGB0ZXN0
IC1mICdlcmZfZ2FtbWEuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoLydgZXJmX2dhbW1hLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNs
dWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1P
MiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1lZl9oeXBvdC5vIGB0
ZXN0IC1mICdlZl9oeXBvdC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL21hdGgvJ2BlZl9oeXBvdC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5j
bHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9J
Mzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2lu
Y2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAt
RFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwi
XCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1J
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAt
TzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZWZfajAubyBgdGVz
dCAtZiAnZWZfajAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoLydgZWZfajAuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUku
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlT
U0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVmX2oxLm8gYHRlc3QgLWYgJ2Vm
X2oxLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0v
bWF0aC8nYGVmX2oxLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hX
X0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82
NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9
XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lT
Q0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1lZl9qbi5vIGB0ZXN0IC1mICdlZl9qbi5jJyB8
fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2Bl
Zl9qbi5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2EtZXJmX2xnYW1tYS5vIGB0ZXN0IC1mICdlcmZfbGdhbW1hLmMn
IHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8n
YGVyZl9sZ2FtbWEuYwouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21h
dGgvZXJmX2xnYW1tYS5jOiBJbiBmdW5jdGlvbiAnX19pZWVlNzU0X2xnYW1tYWZfcic6Ci4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC9lcmZfbGdhbW1hLmM6MTU0
OjE0OiB3YXJuaW5nOiAnbmFkaicgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1
bmN0aW9uCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2EtZWZfbG9nLm8gYHRlc3QgLWYgJ2VmX2xvZy5jJyB8fCBlY2hv
ICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BlZl9sb2cu
YwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4x
Ni4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1m
bm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAgIC1jIC1vIGxpYl9hLWVmX2xvZzEwLm8gYHRlc3QgLWYgJ2VmX2xvZzEwLmMnIHx8IGVjaG8g
Jy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVmX2xvZzEw
LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEu
MTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS1lZl9wb3cubyBgdGVzdCAtZiAnZWZfcG93LmMnIHx8IGVjaG8gJy4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVmX3Bvdy5jCi4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC9lZl9wb3cuYzogSW4g
ZnVuY3Rpb24gJ19faWVlZTc1NF9wb3dmJzoKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoL2VmX3Bvdy5jOjc5OjQ6IHdhcm5pbmc6IHN1Z2dlc3QgZXhwbGljaXQg
YnJhY2VzIHRvIGF2b2lkIGFtYmlndW91cyAnZWxzZScKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVf
TElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3Rv
cmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9f
IC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9v
dC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2
XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9p
bmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1E
X0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
aW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwi
IC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9
XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgg
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9u
IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1lZl9yZW1fcGlv
Mi5vIGB0ZXN0IC1mICdlZl9yZW1fcGlvMi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BlZl9yZW1fcGlvMi5jCmdjYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9T
X18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rv
b2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18g
LVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9s
aWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhj
ZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFy
Zy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1c
Im5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049
XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0Vf
QlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRo
Ly4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAg
LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Et
ZWZfcmVtYWluZGVyLm8gYHRlc3QgLWYgJ2VmX3JlbWFpbmRlci5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BlZl9yZW1haW5kZXIuYwpn
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8t
YnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAg
IC1jIC1vIGxpYl9hLWVmX3NjYWxiLm8gYHRlc3QgLWYgJ2VmX3NjYWxiLmMnIHx8IGVjaG8gJy4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVmX3NjYWxiLmMK
Z2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAt
VSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAt
aXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1E
UEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYu
MFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1lZl9zaW5oLm8gYHRlc3QgLWYgJ2VmX3NpbmguYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgZWZfc2luaC5jCmdj
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUg
X19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlz
eXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpv
bmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVj
dG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBB
Q0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBc
IiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1i
dWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAg
LWMgLW8gbGliX2EtZWZfc3FydC5vIGB0ZXN0IC1mICdlZl9zcXJ0LmMnIHx8IGVjaG8gJy4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYGVmX3NxcnQuYwouLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvZWZfc3FydC5jOiBJbiBm
dW5jdGlvbiAnX19pZWVlNzU0X3NxcnRmJzoKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoL2VmX3NxcnQuYzozMjoxMzogd2FybmluZzogdW51c2VkIHZhcmlhYmxl
ICdzaWduJwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19s
aW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9p
bmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAt
bW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0
YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJS
VVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
bGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94
ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xp
YlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05B
TUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAgIC1jIC1vIGxpYl9hLXdmX2Fjb3MubyBgdGVzdCAtZiAnd2ZfYWNvcy5jJyB8fCBl
Y2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3Zl9h
Y29zLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1F
UyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgICAtYyAtbyBsaWJfYS13Zl9hY29zaC5vIGB0ZXN0IC1mICd3Zl9hY29zaC5jJyB8fCBl
Y2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3Zl9h
Y29zaC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2Etd2ZfYXNpbi5vIGB0ZXN0IC1mICd3Zl9hc2luLmMnIHx8IGVj
aG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHdmX2Fz
aW4uYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5v
LXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNr
LXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBU
UyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGli
bm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZf
NjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwg
MS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVT
IC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAgIC1jIC1vIGxpYl9hLXdmX2F0YW4yLm8gYHRlc3QgLWYgJ3dmX2F0YW4yLmMnIHx8IGVj
aG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHdmX2F0
YW4yLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1F
UyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgICAtYyAtbyBsaWJfYS13Zl9hdGFuaC5vIGB0ZXN0IC1mICd3Zl9hdGFuaC5jJyB8fCBl
Y2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3Zl9h
dGFuaC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2Etd2ZfY29zaC5vIGB0ZXN0IC1mICd3Zl9jb3NoLmMnIHx8IGVj
aG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHdmX2Nv
c2guYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5v
LXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNr
LXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBU
UyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGli
bm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZf
NjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwg
MS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVT
IC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAgIC1jIC1vIGxpYl9hLXdmX2V4cC5vIGB0ZXN0IC1mICd3Zl9leHAuYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgd2ZfZXhwLmMK
Z2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAt
VSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAt
aXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1E
UEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYu
MFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS13Zl9mbW9kLm8gYHRlc3QgLWYgJ3dmX2Ztb2QuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgd2ZfZm1vZC5jCmdj
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUg
X19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlz
eXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpv
bmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVj
dG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBB
Q0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBc
IiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1i
dWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAg
LWMgLW8gbGliX2Etd2ZfZ2FtbWEubyBgdGVzdCAtZiAnd2ZfZ2FtbWEuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgd2ZfZ2FtbWEuYwpn
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8t
YnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAg
IC1jIC1vIGxpYl9hLXdyZl9nYW1tYS5vIGB0ZXN0IC1mICd3cmZfZ2FtbWEuYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgd3JmX2dhbW1h
LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEu
MTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS13Zl9oeXBvdC5vIGB0ZXN0IC1mICd3Zl9oeXBvdC5jJyB8fCBlY2hv
ICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3Zl9oeXBv
dC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4
X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1
ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lw
djQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRT
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJu
b3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82
NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAx
LjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMg
LWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgICAgLWMgLW8gbGliX2Etd2ZfajAubyBgdGVzdCAtZiAnd2ZfajAuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgd2ZfajAuYwpnY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLXdmX2oxLm8gYHRlc3QgLWYgJ3dmX2oxLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHdmX2oxLmMKZ2NjIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5J
T1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
dG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0Rf
XyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNy
L2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1l
eGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90
YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lP
Tj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FH
RV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21h
dGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAg
ICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJf
YS13Zl9qbi5vIGB0ZXN0IC1mICd3Zl9qbi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3Zl9qbi5jCmdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9t
YXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2Nv
bW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1n
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd2ZfbGdh
bW1hLm8gYHRlc3QgLWYgJ3dmX2xnYW1tYS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3Zl9sZ2FtbWEuYwpnY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
Ym0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8u
Li9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdy
Zl9sZ2FtbWEubyBgdGVzdCAtZiAnd3JmX2xnYW1tYS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3cmZfbGdhbW1hLmMKZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZu
by1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9O
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVS
U0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFD
S0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJt
L21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4g
ICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBs
aWJfYS13Zl9sb2cubyBgdGVzdCAtZiAnd2ZfbG9nLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHdmX2xvZy5jCmdjYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9T
X18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rv
b2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18g
LVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9s
aWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhj
ZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFy
Zy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1c
Im5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049
XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0Vf
QlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRo
Ly4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAg
LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Et
d2ZfbG9nMTAubyBgdGVzdCAtZiAnd2ZfbG9nMTAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgd2ZfbG9nMTAuYwpnY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4
Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rh
cmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9O
PVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdF
X0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0
aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAg
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9h
LXdmX3Bvdy5vIGB0ZXN0IC1mICd3Zl9wb3cuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgd2ZfcG93LmMKZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRp
b25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWlu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEu
MTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdS
RVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJt
L21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4v
Y29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13Zl9y
ZW1haW5kZXIubyBgdGVzdCAtZiAnd2ZfcmVtYWluZGVyLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHdmX3JlbWFpbmRlci5jCmdjYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAt
RF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19G
cmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0
ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUg
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9y
IC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tB
R0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAt
RFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWls
dGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMg
LW8gbGliX2Etd2Zfc2NhbGIubyBgdGVzdCAtZiAnd2Zfc2NhbGIuYycgfHwgZWNobyAnLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgd2Zfc2NhbGIuYwpnY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLXdmX3NpbmgubyBgdGVzdCAtZiAnd2Zfc2luaC5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3Zl9zaW5oLmMKZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJtL21hdGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0
aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAt
byBsaWJfYS13Zl9zcXJ0Lm8gYHRlc3QgLWYgJ3dmX3NxcnQuYycgfHwgZWNobyAnLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLydgd2Zfc3FydC5jCmdjYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9f
TUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVl
QlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0g
L3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1m
bm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0Vf
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZF
UlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBB
Q0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9tYXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGlu
ICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8g
bGliX2Etd2Zfc2luY29zLm8gYHRlc3QgLWYgJ3dmX3NpbmNvcy5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3Zl9zaW5jb3MuYwpnY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLXdmX2NhYnMubyBgdGVzdCAtZiAnd2ZfY2Ficy5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3Zl9jYWJzLmMKLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoL3dmX2NhYnMuYzoxNjoxOiB3
YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQpnY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5v
LWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
L3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJT
SU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNL
QUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0v
bWF0aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLXdmX2RyZW0ubyBgdGVzdCAtZiAnd2ZfZHJlbS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2B3Zl9kcmVtLmMKZ2NjIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5J
T1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
dG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0Rf
XyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNy
L2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1l
eGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90
YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lP
Tj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FH
RV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21h
dGgvLi4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAg
ICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJf
YS1zZl9hc2luaC5vIGB0ZXN0IC1mICdzZl9hc2luaC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BzZl9hc2luaC5jCmdjYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlO
SU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNE
X18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vz
ci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJ
T049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tB
R0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9t
YXRoLy4uL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAg
ICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGli
X2Etc2ZfYXRhbi5vIGB0ZXN0IC1mICdzZl9hdGFuLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHNmX2F0YW4uYwpnY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4
Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rh
cmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9O
PVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdF
X0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vbWF0aCAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0
aC8uLi9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAg
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9h
LXNmX2NlaWwubyBgdGVzdCAtZiAnc2ZfY2VpbC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvJ2BzZl9jZWlsLmMKZ2NjIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1Nf
XyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9v
bHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAt
VSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xp
Yi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1c
IjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9C
VUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJtL21hdGggLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgv
Li4vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAt
TzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1z
Zl9jb3MubyBgdGVzdCAtZiAnc2ZfY29zLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHNmX2Nvcy5jCmdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9t
YXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2Nv
bW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1n
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2ZfZXJm
Lm8gYHRlc3QgLWYgJ3NmX2VyZi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJtL21hdGgvJ2BzZl9lcmYuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2lu
Y2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURf
STM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9p
bmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIg
LURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1c
IlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24g
LU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX2ZhYnMubyBg
dGVzdCAtZiAnc2ZfZmFicy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL21hdGgvJ2BzZl9mYWJzLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNs
dWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1P
MiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zZl9mbG9vci5vIGB0
ZXN0IC1mICdzZl9mbG9vci5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL21hdGgvJ2BzZl9mbG9vci5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5j
bHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9J
Mzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2lu
Y2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAt
RFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwi
XCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1J
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAt
TzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2ZfZnJleHAubyBg
dGVzdCAtZiAnc2ZfZnJleHAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGlibS9tYXRoLydgc2ZfZnJleHAuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2lu
Y2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURf
STM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9p
bmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIg
LURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1c
IlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24g
LU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX2xkZXhwLm8g
YHRlc3QgLWYgJ3NmX2xkZXhwLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vbWF0aC8nYHNmX2xkZXhwLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVf
TElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3Rv
cmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9f
IC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9v
dC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2
XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9p
bmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1E
X0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
aW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwi
IC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9
XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgg
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9u
IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zZl9zaWduaWYu
byBgdGVzdCAtZiAnc2Zfc2lnbmlmLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vbWF0aC8nYHNmX3NpZ25pZi5jCmdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9t
YXRoIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2Nv
bW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1n
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2Zfc2lu
Lm8gYHRlc3QgLWYgJ3NmX3Npbi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJtL21hdGgvJ2BzZl9zaW4uYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2lu
Y2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURf
STM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9p
bmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIg
LURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1c
IlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24g
LU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX3Rhbi5vIGB0
ZXN0IC1mICdzZl90YW4uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGlibS9tYXRoLydgc2ZfdGFuLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRl
IC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGggLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL21hdGgvLi4vY29tbW9uIC1PMiAt
RE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zZl90YW5oLm8gYHRlc3Qg
LWYgJ3NmX3RhbmguYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoLydgc2ZfdGFuaC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRp
bmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1s
aW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAt
SS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFD
SF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tB
R0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUku
IC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9tYXRoLy4uL2NvbW1vbiAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd2ZfZXhwMi5vIGB0ZXN0IC1m
ICd3Zl9leHAyLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vbWF0aC8nYHdmX2V4cDIuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUku
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aCAtSS4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWF0aC8uLi9jb21tb24gLU8yIC1ETUlT
U0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdmX3RnYW1tYS5vIGB0ZXN0IC1m
ICd3Zl90Z2FtbWEuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9tYXRoLydgd2ZfdGdhbW1hLmMKcm0gLWYgbGliLmEKYXIgY3J1IGxpYi5hIGxpYl9h
LWtfc3RhbmRhcmQubyBsaWJfYS1rX3JlbV9waW8yLm8gbGliX2Eta19jb3MubyBsaWJfYS1rX3Np
bi5vIGxpYl9hLWtfdGFuLm8gbGliX2EtZV9hY29zLm8gbGliX2EtZV9hY29zaC5vIGxpYl9hLWVf
YXNpbi5vIGxpYl9hLWVfYXRhbjIubyBsaWJfYS1lX2F0YW5oLm8gbGliX2EtZV9jb3NoLm8gbGli
X2EtZV9leHAubyBsaWJfYS1lX2Ztb2QubyBsaWJfYS1lcl9nYW1tYS5vIGxpYl9hLWVfaHlwb3Qu
byBsaWJfYS1lX2owLm8gbGliX2EtZV9qMS5vIGxpYl9hLWVfam4ubyBsaWJfYS1lcl9sZ2FtbWEu
byBsaWJfYS1lX2xvZy5vIGxpYl9hLWVfbG9nMTAubyBsaWJfYS1lX3Bvdy5vIGxpYl9hLWVfcmVt
X3BpbzIubyBsaWJfYS1lX3JlbWFpbmRlci5vIGxpYl9hLWVfc2NhbGIubyBsaWJfYS1lX3Npbmgu
byBsaWJfYS1lX3NxcnQubyBsaWJfYS13X2Fjb3MubyBsaWJfYS13X2Fjb3NoLm8gbGliX2Etd19h
c2luLm8gbGliX2Etd19hdGFuMi5vIGxpYl9hLXdfYXRhbmgubyBsaWJfYS13X2Nvc2gubyBsaWJf
YS13X2V4cC5vIGxpYl9hLXdfZm1vZC5vIGxpYl9hLXdfZ2FtbWEubyBsaWJfYS13cl9nYW1tYS5v
IGxpYl9hLXdfaHlwb3QubyBsaWJfYS13X2owLm8gbGliX2Etd19qMS5vIGxpYl9hLXdfam4ubyBs
aWJfYS13X2xnYW1tYS5vIGxpYl9hLXdyX2xnYW1tYS5vIGxpYl9hLXdfbG9nLm8gbGliX2Etd19s
b2cxMC5vIGxpYl9hLXdfcG93Lm8gbGliX2Etd19yZW1haW5kZXIubyBsaWJfYS13X3NjYWxiLm8g
bGliX2Etd19zaW5oLm8gbGliX2Etd19zcXJ0Lm8gbGliX2Etd19zaW5jb3MubyBsaWJfYS13X2Nh
YnMubyBsaWJfYS13X2RyZW0ubyBsaWJfYS1zX2FzaW5oLm8gbGliX2Etc19hdGFuLm8gbGliX2Et
c19jZWlsLm8gbGliX2Etc19jb3MubyBsaWJfYS1zX2VyZi5vIGxpYl9hLXNfZmFicy5vIGxpYl9h
LXNfZmxvb3IubyBsaWJfYS1zX2ZyZXhwLm8gbGliX2Etc19sZGV4cC5vIGxpYl9hLXNfc2lnbmlm
Lm8gbGliX2Etc19zaW4ubyBsaWJfYS1zX3Rhbi5vIGxpYl9hLXNfdGFuaC5vIGxpYl9hLXdfZXhw
Mi5vIGxpYl9hLXdfdGdhbW1hLm8gbGliX2Eta2ZfcmVtX3BpbzIubyBsaWJfYS1rZl9jb3MubyBs
aWJfYS1rZl9zaW4ubyBsaWJfYS1rZl90YW4ubyBsaWJfYS1lZl9hY29zLm8gbGliX2EtZWZfYWNv
c2gubyBsaWJfYS1lZl9hc2luLm8gbGliX2EtZWZfYXRhbjIubyBsaWJfYS1lZl9hdGFuaC5vIGxp
Yl9hLWVmX2Nvc2gubyBsaWJfYS1lZl9leHAubyBsaWJfYS1lZl9mbW9kLm8gbGliX2EtZXJmX2dh
bW1hLm8gbGliX2EtZWZfaHlwb3QubyBsaWJfYS1lZl9qMC5vIGxpYl9hLWVmX2oxLm8gbGliX2Et
ZWZfam4ubyBsaWJfYS1lcmZfbGdhbW1hLm8gbGliX2EtZWZfbG9nLm8gbGliX2EtZWZfbG9nMTAu
byBsaWJfYS1lZl9wb3cubyBsaWJfYS1lZl9yZW1fcGlvMi5vIGxpYl9hLWVmX3JlbWFpbmRlci5v
IGxpYl9hLWVmX3NjYWxiLm8gbGliX2EtZWZfc2luaC5vIGxpYl9hLWVmX3NxcnQubyBsaWJfYS13
Zl9hY29zLm8gbGliX2Etd2ZfYWNvc2gubyBsaWJfYS13Zl9hc2luLm8gbGliX2Etd2ZfYXRhbjIu
byBsaWJfYS13Zl9hdGFuaC5vIGxpYl9hLXdmX2Nvc2gubyBsaWJfYS13Zl9leHAubyBsaWJfYS13
Zl9mbW9kLm8gbGliX2Etd2ZfZ2FtbWEubyBsaWJfYS13cmZfZ2FtbWEubyBsaWJfYS13Zl9oeXBv
dC5vIGxpYl9hLXdmX2owLm8gbGliX2Etd2ZfajEubyBsaWJfYS13Zl9qbi5vIGxpYl9hLXdmX2xn
YW1tYS5vIGxpYl9hLXdyZl9sZ2FtbWEubyBsaWJfYS13Zl9sb2cubyBsaWJfYS13Zl9sb2cxMC5v
IGxpYl9hLXdmX3Bvdy5vIGxpYl9hLXdmX3JlbWFpbmRlci5vIGxpYl9hLXdmX3NjYWxiLm8gbGli
X2Etd2Zfc2luaC5vIGxpYl9hLXdmX3NxcnQubyBsaWJfYS13Zl9zaW5jb3MubyBsaWJfYS13Zl9j
YWJzLm8gbGliX2Etd2ZfZHJlbS5vIGxpYl9hLXNmX2FzaW5oLm8gbGliX2Etc2ZfYXRhbi5vIGxp
Yl9hLXNmX2NlaWwubyBsaWJfYS1zZl9jb3MubyBsaWJfYS1zZl9lcmYubyBsaWJfYS1zZl9mYWJz
Lm8gbGliX2Etc2ZfZmxvb3IubyBsaWJfYS1zZl9mcmV4cC5vIGxpYl9hLXNmX2xkZXhwLm8gbGli
X2Etc2Zfc2lnbmlmLm8gbGliX2Etc2Zfc2luLm8gbGliX2Etc2ZfdGFuLm8gbGliX2Etc2ZfdGFu
aC5vIGxpYl9hLXdmX2V4cDIubyBsaWJfYS13Zl90Z2FtbWEubyAKcmFubGliIGxpYi5hCm1ha2Vb
Nl06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGlibS9tYXRoJwpNYWtpbmcgYWxsIGluIGNvbW1vbgpt
YWtlWzZdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJtL2NvbW1vbicKZ2NjIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1Nf
XyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9v
bHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAt
VSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xp
Yi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1c
IjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9C
VUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAg
LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Et
c19maW5pdGUubyBgdGVzdCAtZiAnc19maW5pdGUuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vJ2BzX2Zpbml0ZS5jCmdjYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlO
SU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNE
X18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vz
ci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJ
T049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tB
R0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLXNfY29weXNpZ24ubyBgdGVzdCAtZiAnc19jb3B5c2lnbi5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNfY29weXNpZ24uYwpn
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1zX21vZGYubyBgdGVzdCAtZiAnc19tb2RmLmMnIHx8IGVjaG8gJy4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc19tb2RmLmMKZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFD
S0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwi
IC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1i
dWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAg
LWMgLW8gbGliX2Etc19zY2FsYm4ubyBgdGVzdCAtZiAnc19zY2FsYm4uYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vJ2BzX3NjYWxibi5j
CmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
LyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5
cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAt
RFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2
LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1m
bm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAgIC1jIC1vIGxpYl9hLXNfY2JydC5vIGB0ZXN0IC1mICdzX2NicnQuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vJ2BzX2NicnQuYwpn
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1zX2V4cDEwLm8gYHRlc3QgLWYgJ3NfZXhwMTAuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vJ2BzX2V4cDEwLmMK
Z2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAt
VSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAt
aXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1E
UEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYu
MFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZu
by1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
ICAgLWMgLW8gbGliX2Etc19leHBtMS5vIGB0ZXN0IC1mICdzX2V4cG0xLmMnIHx8IGVjaG8gJy4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc19leHBtMS5j
CkluIGZpbGUgaW5jbHVkZWQgZnJvbSAuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJtL2NvbW1vbi9mZGxpYm0uaDoxNTowLAogICAgICAgICAgICAgICAgIGZyb20gLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vc19leHBtMS5jOjE1MjoK
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZS9t
YXRoLmg6IEluIGZ1bmN0aW9uICdleHBtMSc6Ci4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYm0vY29tbW9uL3NfZXhwbTEuYzoxODI6MTc6IHdhcm5pbmc6ICdjJyBtYXkgYmUg
dXNlZCB1bmluaXRpYWxpemVkIGluIHRoaXMgZnVuY3Rpb24KLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vc19leHBtMS5jOjE4MjoxNzogbm90ZTogJ2MnIHdh
cyBkZWNsYXJlZCBoZXJlCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5H
PVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNfaWxvZ2IubyBgdGVzdCAtZiAnc19pbG9n
Yi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2Nv
bW1vbi8nYHNfaWxvZ2IuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZf
NjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251
LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4v
aW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1df
SFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2
XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklO
Rz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdf
U1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zX2luZmNvbnN0Lm8gYHRlc3QgLWYgJ3Nf
aW5mY29uc3QuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGlibS9jb21tb24vJ2BzX2luZmNvbnN0LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRl
IC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc19pbmZpbml0eS5vIGB0
ZXN0IC1mICdzX2luZmluaXR5LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc19pbmZpbml0eS5jCmdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9j
b21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNfaXNp
bmYubyBgdGVzdCAtZiAnc19pc2luZi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNfaXNpbmYuYwpnY2MgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1E
SEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94
ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9f
c3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9z
cy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2dj
Yy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0v
Y29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zX2lz
aW5mZC5vIGB0ZXN0IC1mICdzX2lzaW5mZC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNfaXNpbmZkLmMKZ2NjIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1Nf
XyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9v
bHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAt
VSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xp
Yi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1c
IjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9C
VUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAg
LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Et
c19pc25hbi5vIGB0ZXN0IC1mICdzX2lzbmFuLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc19pc25hbi5jCmdjYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9T
X18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rv
b2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18g
LVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9s
aWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhj
ZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFy
Zy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1c
Im5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049
XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0Vf
QlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAg
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9h
LXNfaXNuYW5kLm8gYHRlc3QgLWYgJ3NfaXNuYW5kLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc19pc25hbmQuYwpnY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5v
LWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
L3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJT
SU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNL
QUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4g
ICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBs
aWJfYS1zX2xvZzFwLm8gYHRlc3QgLWYgJ3NfbG9nMXAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vJ2BzX2xvZzFwLmMKSW4gZmlsZSBp
bmNsdWRlZCBmcm9tIC4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29t
bW9uL2ZkbGlibS5oOjE1OjAsCiAgICAgICAgICAgICAgICAgZnJvbSAuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi9zX2xvZzFwLmM6MTIzOgovdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlL21hdGguaDogSW4g
ZnVuY3Rpb24gJ2xvZzFwJzoKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9jb21tb24vc19sb2cxcC5jOjE1NjoxNDogd2FybmluZzogJ2YnIG1heSBiZSB1c2VkIHVuaW5p
dGlhbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJtL2NvbW1vbi9zX2xvZzFwLmM6MTU2OjE0OiBub3RlOiAnZicgd2FzIGRlY2xhcmVk
IGhlcmUKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vc19s
b2cxcC5jOjE1NjoxNjogd2FybmluZzogJ2MnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQgaW4g
dGhpcyBmdW5jdGlvbgouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2Nv
bW1vbi9zX2xvZzFwLmM6MTU2OjE2OiBub3RlOiAnYycgd2FzIGRlY2xhcmVkIGhlcmUKZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWls
dGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMg
LW8gbGliX2Etc19uYW4ubyBgdGVzdCAtZiAnc19uYW4uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vJ2BzX25hbi5jCmdjYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlO
SU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNE
X18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vz
ci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJ
T049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tB
R0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLXNfbmV4dGFmdGVyLm8gYHRlc3QgLWYgJ3NfbmV4dGFmdGVyLmMnIHx8IGVjaG8gJy4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc19uZXh0YWZ0ZXIu
YwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4x
Ni4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS1zX3BvdzEwLm8gYHRlc3QgLWYgJ3NfcG93MTAuYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vJ2BzX3BvdzEw
LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEu
MTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMg
LWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgICAgLWMgLW8gbGliX2Etc19yaW50Lm8gYHRlc3QgLWYgJ3NfcmludC5jJyB8fCBlY2hvICcu
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNfcmludC5j
CmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
LyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5
cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAt
RFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2
LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1m
bm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAgIC1jIC1vIGxpYl9hLXNfbG9nYi5vIGB0ZXN0IC1mICdzX2xvZ2IuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vJ2BzX2xvZ2IuYwpn
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1zX21hdGhlcnIubyBgdGVzdCAtZiAnc19tYXRoZXJyLmMnIHx8IGVjaG8g
Jy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc19tYXRo
ZXJyLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2Etc19saWJfdmVyLm8gYHRlc3QgLWYgJ3NfbGliX3Zlci5jJyB8
fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8n
YHNfbGliX3Zlci5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNs
dWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1m
bm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19J
TlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmds
b3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwi
bmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVND
QUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNfZmRpbS5vIGB0ZXN0IC1mICdzX2ZkaW0uYycg
fHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24v
J2BzX2ZkaW0uYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUg
X19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4y
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVk
ZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5v
LXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5U
RVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9z
cy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5l
d2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FM
TF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zX2ZtYS5vIGB0ZXN0IC1mICdzX2ZtYS5jJyB8fCBl
Y2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNf
Zm1hLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2Etc19mbWF4Lm8gYHRlc3QgLWYgJ3NfZm1heC5jJyB8fCBlY2hv
ICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNfZm1h
eC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4
X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1
ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lw
djQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRT
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJu
b3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82
NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAx
LjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVT
IC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAgIC1jIC1vIGxpYl9hLXNfZm1pbi5vIGB0ZXN0IC1mICdzX2ZtaW4uYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vJ2BzX2ZtaW4u
YwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4x
Ni4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS1zX2ZwY2xhc3NpZnkubyBgdGVzdCAtZiAnc19mcGNsYXNzaWZ5LmMn
IHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9u
Lydgc19mcGNsYXNzaWZ5LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc19scmludC5vIGB0ZXN0IC1mICdzX2xy
aW50LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0v
Y29tbW9uLydgc19scmludC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lO
R19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNfbHJvdW5kLm8gYHRlc3QgLWYgJ3Nf
bHJvdW5kLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
Ym0vY29tbW9uLydgc19scm91bmQuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUku
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1J
U1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zX25lYXJieWludC5vIGB0ZXN0
IC1mICdzX25lYXJieWludC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL2NvbW1vbi8nYHNfbmVhcmJ5aW50LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYu
MFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBP
UlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2Nv
bW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1n
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc19yZW1x
dW8ubyBgdGVzdCAtZiAnc19yZW1xdW8uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vJ2BzX3JlbXF1by5jCmdjYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18g
LURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xz
L3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUg
X19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Ny
b3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIv
Z2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0
aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIx
LjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVH
UkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNf
cm91bmQubyBgdGVzdCAtZiAnc19yb3VuZC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNfcm91bmQuYwpnY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
Ym0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAt
TzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1z
X3NjYWxibG4ubyBgdGVzdCAtZiAnc19zY2FsYmxuLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc19zY2FsYmxuLmMKZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZu
by1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9O
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVS
U0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFD
S0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGlu
ICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8g
bGliX2Etc19zaWduYml0Lm8gYHRlc3QgLWYgJ3Nfc2lnbmJpdC5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNfc2lnbmJpdC5jCmdj
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUg
X19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlz
eXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpv
bmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVj
dG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBB
Q0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBc
IiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8t
YnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAg
IC1jIC1vIGxpYl9hLXNfdHJ1bmMubyBgdGVzdCAtZiAnc190cnVuYy5jJyB8fCBlY2hvICcuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNfdHJ1bmMuYwpn
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1zZl9maW5pdGUubyBgdGVzdCAtZiAnc2ZfZmluaXRlLmMnIHx8IGVjaG8g
Jy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc2ZfZmlu
aXRlLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2Etc2ZfY29weXNpZ24ubyBgdGVzdCAtZiAnc2ZfY29weXNpZ24u
YycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21t
b24vJ2BzZl9jb3B5c2lnbi5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lO
R19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX21vZGYubyBgdGVzdCAtZiAnc2Zf
bW9kZi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJt
L2NvbW1vbi8nYHNmX21vZGYuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94
ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxM
T1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
eDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFS
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NU
UklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJ
TkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zZl9zY2FsYm4ubyBgdGVzdCAtZiAn
c2Zfc2NhbGJuLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vY29tbW9uLydgc2Zfc2NhbGJuLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRl
IC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2ZfY2JydC5vIGB0ZXN0
IC1mICdzZl9jYnJ0LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYm0vY29tbW9uLydgc2ZfY2JydC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVk
ZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8y
IC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX2V4cDEwLm8gYHRl
c3QgLWYgJ3NmX2V4cDEwLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYm0vY29tbW9uLydgc2ZfZXhwMTAuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2lu
Y2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURf
STM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9p
bmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIg
LURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1c
IlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9u
IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zZl9leHBtMS5v
IGB0ZXN0IC1mICdzZl9leHBtMS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNmX2V4cG0xLmMKSW4gZmlsZSBpbmNsdWRlZCBmcm9t
IC4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uL2ZkbGlibS5o
OjE1OjAsCiAgICAgICAgICAgICAgICAgZnJvbSAuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL2NvbW1vbi9zZl9leHBtMS5jOjE2OgovdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlL21hdGguaDogSW4gZnVuY3Rpb24gJ2V4
cG0xZic6Ci4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uL3Nm
X2V4cG0xLmM6NDc6MTY6IHdhcm5pbmc6ICdjJyBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkIGlu
IHRoaXMgZnVuY3Rpb24KLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9j
b21tb24vc2ZfZXhwbTEuYzo0NzoxNjogbm90ZTogJ2MnIHdhcyBkZWNsYXJlZCBoZXJlCmdjYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAt
RF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19G
cmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0
ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUg
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9y
IC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tB
R0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAt
RFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLXNmX2lsb2diLm8gYHRlc3QgLWYgJ3NmX2lsb2diLmMnIHx8IGVjaG8gJy4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc2ZfaWxvZ2IuYwpn
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1zZl9pbmZpbml0eS5vIGB0ZXN0IC1mICdzZl9pbmZpbml0eS5jJyB8fCBl
Y2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNm
X2luZmluaXR5LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
Mi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NB
TExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2ZfaXNpbmYubyBgdGVzdCAtZiAnc2ZfaXNpbmYu
YycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21t
b24vJ2BzZl9pc2luZi5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5H
PVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX2lzaW5mZi5vIGB0ZXN0IC1mICdzZl9p
c2luZmYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
bS9jb21tb24vJ2BzZl9pc2luZmYuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUku
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1J
U1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zZl9pc25hbi5vIGB0ZXN0IC1m
ICdzZl9pc25hbi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJtL2NvbW1vbi8nYHNmX2lzbmFuLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRl
IC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2ZfaXNuYW5mLm8gYHRl
c3QgLWYgJ3NmX2lzbmFuZi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJtL2NvbW1vbi8nYHNmX2lzbmFuZi5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZF
X0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0
b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5f
XyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJv
b3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4
Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
aW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBc
IiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JU
PVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21t
b24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX2xvZzFw
Lm8gYHRlc3QgLWYgJ3NmX2xvZzFwLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc2ZfbG9nMXAuYwpJbiBmaWxlIGluY2x1ZGVkIGZy
b20gLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vZmRsaWJt
Lmg6MTU6MCwKICAgICAgICAgICAgICAgICBmcm9tIC4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYm0vY29tbW9uL3NmX2xvZzFwLmM6MTY6Ci92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUvbWF0aC5oOiBJbiBmdW5jdGlvbiAn
bG9nMXBmJzoKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24v
c2ZfbG9nMXAuYzo0NzoxNTogd2FybmluZzogJ2MnIG1heSBiZSB1c2VkIHVuaW5pdGlhbGl6ZWQg
aW4gdGhpcyBmdW5jdGlvbgouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJt
L2NvbW1vbi9zZl9sb2cxcC5jOjQ3OjE1OiBub3RlOiAnYycgd2FzIGRlY2xhcmVkIGhlcmUKZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFD
S0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwi
IC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1i
dWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAg
LWMgLW8gbGliX2Etc2ZfbmFuLm8gYHRlc3QgLWYgJ3NmX25hbi5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNmX25hbi5jCmdjYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAt
RF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19G
cmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0
ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUg
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9y
IC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tB
R0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAt
RFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLXNmX25leHRhZnRlci5vIGB0ZXN0IC1mICdzZl9uZXh0YWZ0ZXIuYycgfHwgZWNo
byAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24vJ2BzZl9u
ZXh0YWZ0ZXIuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUg
X19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4y
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVk
ZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5v
LXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5U
RVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9z
cy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5l
d2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FM
TF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zZl9wb3cxMC5vIGB0ZXN0IC1mICdzZl9wb3cxMC5j
JyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1v
bi8nYHNmX3BvdzEwLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hX
X0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82
NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9
XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZ
U0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2ZfcmludC5vIGB0ZXN0IC1mICdzZl9yaW50
LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29t
bW9uLydgc2ZfcmludC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5H
PVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX2xvZ2IubyBgdGVzdCAtZiAnc2ZfbG9n
Yi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2Nv
bW1vbi8nYHNmX2xvZ2IuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZf
NjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251
LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4v
aW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1df
SFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2
XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklO
Rz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdf
U1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zZl9mZGltLm8gYHRlc3QgLWYgJ3NmX2Zk
aW0uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9j
b21tb24vJ2BzZl9mZGltLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2ZfZm1hLm8gYHRlc3QgLWYgJ3NmX2Zt
YS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2Nv
bW1vbi8nYHNmX2ZtYS5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5H
PVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX2ZtYXgubyBgdGVzdCAtZiAnc2ZfZm1h
eC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2Nv
bW1vbi8nYHNmX2ZtYXguYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZf
NjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251
LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4v
aW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1df
SFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2
XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklO
Rz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdf
U1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zZl9mbWluLm8gYHRlc3QgLWYgJ3NmX2Zt
aW4uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9j
b21tb24vJ2BzZl9mbWluLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2ZfZnBjbGFzc2lmeS5vIGB0ZXN0IC1m
ICdzZl9mcGNsYXNzaWZ5LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYm0vY29tbW9uLydgc2ZfZnBjbGFzc2lmeS5jCmdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9j
b21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX2xy
aW50Lm8gYHRlc3QgLWYgJ3NmX2xyaW50LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc2ZfbHJpbnQuYwpnY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
Ym0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAt
TzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1z
Zl9scm91bmQubyBgdGVzdCAtZiAnc2ZfbHJvdW5kLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uLydgc2ZfbHJvdW5kLmMKZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZu
by1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9O
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVS
U0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFD
S0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGlu
ICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8g
bGliX2Etc2ZfbmVhcmJ5aW50Lm8gYHRlc3QgLWYgJ3NmX25lYXJieWludC5jJyB8fCBlY2hvICcu
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbi8nYHNmX25lYXJi
eWludC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05B
TUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX3JlbXF1by5vIGB0ZXN0IC1mICdzZl9yZW1xdW8uYycg
fHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24v
J2BzZl9yZW1xdW8uYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQg
LVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVu
LWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQu
NS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5j
bHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAt
Zm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdf
SU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJn
bG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1c
Im5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1c
Im5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vY29tbW9uIC1PMiAtRE1JU1NJTkdfU1lT
Q0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zZl9yb3VuZC5vIGB0ZXN0IC1mICdzZl9yb3Vu
ZC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2Nv
bW1vbi8nYHNmX3JvdW5kLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbW1vbiAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2Zfc2NhbGJsbi5vIGB0ZXN0IC1mICdz
Zl9zY2FsYmxuLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYm0vY29tbW9uLydgc2Zfc2NhbGJsbi5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVk
ZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGlibS9jb21tb24gLU8y
IC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNmX3RydW5jLm8gYHRl
c3QgLWYgJ3NmX3RydW5jLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYm0vY29tbW9uLydgc2ZfdHJ1bmMuYwpybSAtZiBsaWIuYQphciBjcnUgbGliLmEg
bGliX2Etc19maW5pdGUubyBsaWJfYS1zX2NvcHlzaWduLm8gbGliX2Etc19tb2RmLm8gbGliX2Et
c19zY2FsYm4ubyBsaWJfYS1zX2NicnQubyBsaWJfYS1zX2V4cDEwLm8gbGliX2Etc19leHBtMS5v
IGxpYl9hLXNfaWxvZ2IubyBsaWJfYS1zX2luZmNvbnN0Lm8gbGliX2Etc19pbmZpbml0eS5vIGxp
Yl9hLXNfaXNpbmYubyBsaWJfYS1zX2lzaW5mZC5vIGxpYl9hLXNfaXNuYW4ubyBsaWJfYS1zX2lz
bmFuZC5vIGxpYl9hLXNfbG9nMXAubyBsaWJfYS1zX25hbi5vIGxpYl9hLXNfbmV4dGFmdGVyLm8g
bGliX2Etc19wb3cxMC5vIGxpYl9hLXNfcmludC5vIGxpYl9hLXNfbG9nYi5vIGxpYl9hLXNfbWF0
aGVyci5vIGxpYl9hLXNfbGliX3Zlci5vIGxpYl9hLXNfZmRpbS5vIGxpYl9hLXNfZm1hLm8gbGli
X2Etc19mbWF4Lm8gbGliX2Etc19mbWluLm8gbGliX2Etc19mcGNsYXNzaWZ5Lm8gbGliX2Etc19s
cmludC5vIGxpYl9hLXNfbHJvdW5kLm8gbGliX2Etc19uZWFyYnlpbnQubyBsaWJfYS1zX3JlbXF1
by5vIGxpYl9hLXNfcm91bmQubyBsaWJfYS1zX3NjYWxibG4ubyBsaWJfYS1zX3NpZ25iaXQubyBs
aWJfYS1zX3RydW5jLm8gbGliX2Etc2ZfZmluaXRlLm8gbGliX2Etc2ZfY29weXNpZ24ubyBsaWJf
YS1zZl9tb2RmLm8gbGliX2Etc2Zfc2NhbGJuLm8gbGliX2Etc2ZfY2JydC5vIGxpYl9hLXNmX2V4
cDEwLm8gbGliX2Etc2ZfZXhwbTEubyBsaWJfYS1zZl9pbG9nYi5vIGxpYl9hLXNmX2luZmluaXR5
Lm8gbGliX2Etc2ZfaXNpbmYubyBsaWJfYS1zZl9pc2luZmYubyBsaWJfYS1zZl9pc25hbi5vIGxp
Yl9hLXNmX2lzbmFuZi5vIGxpYl9hLXNmX2xvZzFwLm8gbGliX2Etc2ZfbmFuLm8gbGliX2Etc2Zf
bmV4dGFmdGVyLm8gbGliX2Etc2ZfcG93MTAubyBsaWJfYS1zZl9yaW50Lm8gbGliX2Etc2ZfbG9n
Yi5vIGxpYl9hLXNmX2ZkaW0ubyBsaWJfYS1zZl9mbWEubyBsaWJfYS1zZl9mbWF4Lm8gbGliX2Et
c2ZfZm1pbi5vIGxpYl9hLXNmX2ZwY2xhc3NpZnkubyBsaWJfYS1zZl9scmludC5vIGxpYl9hLXNm
X2xyb3VuZC5vIGxpYl9hLXNmX25lYXJieWludC5vIGxpYl9hLXNmX3JlbXF1by5vIGxpYl9hLXNm
X3JvdW5kLm8gbGliX2Etc2Zfc2NhbGJsbi5vIGxpYl9hLXNmX3RydW5jLm8gCnJhbmxpYiBsaWIu
YQptYWtlWzZdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYm0vY29tbW9uJwpNYWtpbmcgYWxsIGlu
IG1hY2hpbmUKbWFrZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGlibS9tYWNoaW5lJwpNYWtp
bmcgYWxsIGluIC4KbWFrZVs3XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGlibS9tYWNoaW5lJwpt
YWtlWzddOiBOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBhbGwtYW0nLgptYWtlWzddOiBMZWF2aW5n
IGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL2xpYm0vbWFjaGluZScKbWFrZVs2XTogTGVhdmluZyBkaXJlY3RvcnkgYC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9s
aWJtL21hY2hpbmUnCm1ha2VbNl06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYm0nCnJtIC1mIGxp
Ym0uYQpybSAtcmYgdG1wCm1rZGlyIHRtcApjZCB0bXA7IFwKICBmb3IgaSBpbiBtYXRoL2xpYi5h
IGNvbW1vbi9saWIuYSA7IGRvIFwKICAgIGFyIHggLi4vJGk7IFwKZG9uZTsgXAphciByYyAuLi9s
aWJtLmEgKi5vCnJhbmxpYiBsaWJtLmEKcm0gLXJmIHRtcAptYWtlWzZdOiBMZWF2aW5nIGRpcmVj
dG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL2xpYm0nCm1ha2VbNV06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGlibScKTWFraW5nIGFs
bCBpbiBkb2MKbWFrZVs1XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvZG9jJwpnY2MgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWMgLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvZG9jL21ha2Vkb2MuYwouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9k
b2MvbWFrZWRvYy5jOjY2OjEzOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBh
IHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5j
Ojc1OjEzOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQou
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjgyOjEyOiB3YXJu
aW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjEwMDoxMzogd2FybmluZzogZnVuY3Rp
b24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvZG9jL21ha2Vkb2MuYzoxMDc6MTM6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0
aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2Rv
Yy9tYWtlZG9jLmM6MTE0OjE0OiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBh
IHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5j
OjEyMToxMzogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUK
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzoxMzI6MTM6IHdh
cm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6MTQ2OjEzOiB3YXJuaW5nOiBmdW5j
dGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjE1NjoxMzogd2FybmluZzogZnVuY3Rpb24gZGVjbGFy
YXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
ZG9jL21ha2Vkb2MuYzoxNjg6MTM6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0
IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9j
LmM6MTgwOjEzOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlw
ZQouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjE5NjoxOiB3
YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjIxNToxOiB3YXJuaW5nOiBmdW5j
dGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjIzOToxMzogd2FybmluZzogZnVuY3Rpb24gZGVjbGFy
YXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
ZG9jL21ha2Vkb2MuYzoyNDk6MTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3Qg
YSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2Mu
YzoyNTk6MTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUK
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzoyNjY6MTogd2Fy
bmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzogSW4gZnVuY3Rpb24gJ3B1c2hfbnVt
YmVyJzoKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzoyNzA6
MTI6IHdhcm5pbmc6IGNhc3QgZnJvbSBwb2ludGVyIHRvIGludGVnZXIgb2YgZGlmZmVyZW50IHNp
emUKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzogQXQgdG9w
IGxldmVsOgouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjI3
ODoxOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjI5ODoxOiB3YXJuaW5n
OiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjM1MzoxOiB3YXJuaW5nOiBmdW5jdGlvbiBk
ZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9kb2MvbWFrZWRvYy5jOjQxMToxOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBp
c24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFr
ZWRvYy5jOjQ1MToxOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3Rv
dHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOiBJbiBm
dW5jdGlvbiAncXVpY2tyZWYnOgouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2Mv
bWFrZWRvYy5jOjQ1NDoxNjogd2FybmluZzogdW51c2VkIHZhcmlhYmxlICdzY2FuJwouLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOiBBdCB0b3AgbGV2ZWw6Ci4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6NDkyOjE6IHdhcm5p
bmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6NTI2OjE6IHdhcm5pbmc6IGZ1bmN0aW9u
IGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2RvYy9tYWtlZG9jLmM6NTc1OjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9u
IGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9t
YWtlZG9jLmM6IEluIGZ1bmN0aW9uICdjb3VyaWVyaXplJzoKLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzo2MjY6Njogd2FybmluZzogc3VnZ2VzdCBwYXJlbnRo
ZXNlcyBhcm91bmQgJyYmJyB3aXRoaW4gJ3x8JwouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9kb2MvbWFrZWRvYy5jOiBBdCB0b3AgbGV2ZWw6Ci4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6NjUzOjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0
aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2Rv
Yy9tYWtlZG9jLmM6IEluIGZ1bmN0aW9uICdidWxsZXRpemUnOgouLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjY1Njo3OiB3YXJuaW5nOiB1bnVzZWQgdmFyaWFi
bGUgJ29uJwouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOiBB
dCB0b3AgbGV2ZWw6Ci4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9j
LmM6NzI2OjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBl
Ci4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6Nzc2OjE6IHdh
cm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6ODAwOjE6IHdhcm5pbmc6IHJldHVy
biB0eXBlIGRlZmF1bHRzIHRvICdpbnQnCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2RvYy9tYWtlZG9jLmM6ODAwOjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0
IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9j
LmM6ODE3OjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBl
Ci4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6ODMyOjE6IHdh
cm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6IEluIGZ1bmN0aW9uICdraWxsX2Jv
Z3VzX2xpbmVzJzoKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2Mu
Yzo4MzY6OTogd2FybmluZzogdW51c2VkIHZhcmlhYmxlICdubCcKLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzogQXQgdG9wIGxldmVsOgouLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjkxMDoxOiB3YXJuaW5nOiBmdW5jdGlv
biBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9kb2MvbWFrZWRvYy5jOjk2MzoxOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlv
biBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2Mv
bWFrZWRvYy5jOjk5MToxOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHBy
b3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjEw
MDM6MTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzoxMDE0OjE6IHdhcm5p
bmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6MTAyNToxOiB3YXJuaW5nOiBmdW5jdGlv
biBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9kb2MvbWFrZWRvYy5jOjEwMzQ6MTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRp
b24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9j
L21ha2Vkb2MuYzoxMDQ0OjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEg
cHJvdG90eXBlCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6
MTA1MToxOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQou
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjEwNjQ6MTogd2Fy
bmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzoxMTQyOjE6IHdhcm5pbmc6IGZ1bmN0
aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6IEluIGZ1bmN0aW9uICdsb29rdXBfd29yZCc6Ci4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6MTE0Nzo2OiB3YXJuaW5n
OiBpbXBsaWNpdCBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbiAnc3RyY21wJwouLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOiBBdCB0b3AgbGV2ZWw6Ci4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6MTE1NzoxMzogd2FybmluZzog
ZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzogSW4gZnVuY3Rpb24gJ3BlcmZvcm0nOgouLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjExNjY6Nzogd2Fybmlu
ZzogdW51c2VkIHZhcmlhYmxlICdmb3VuZCcKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvZG9jL21ha2Vkb2MuYzoxMTY1OjE2OiB3YXJuaW5nOiB1bnVzZWQgdmFyaWFibGUgJ2knCi4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6IEF0IHRvcCBsZXZl
bDoKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzoxMTk2OjE6
IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6MTIxMjoxOiB3YXJuaW5nOiBm
dW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjEyMzU6MTogd2FybmluZzogZnVuY3Rpb24gZGVj
bGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvZG9jL21ha2Vkb2MuYzogSW4gZnVuY3Rpb24gJ2FkZF9pbnRyaW5zaWMnOgouLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjEyMzU6MTogd2FybmluZzogZnVu
Y3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzogQXQgdG9wIGxldmVsOgouLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjEyNDQ6MTogd2FybmluZzogZnVuY3Rpb24g
ZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvZG9jL21ha2Vkb2MuYzoxMjUxOjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9u
IGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9t
YWtlZG9jLmM6MTI2NToxOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHBy
b3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOiBJ
biBmdW5jdGlvbiAnY29tcGlsZSc6Ci4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2Rv
Yy9tYWtlZG9jLmM6MTI3MDoxMDogd2FybmluZzogdW51c2VkIHZhcmlhYmxlICdqcHRyJwouLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOiBBdCB0b3AgbGV2ZWw6
Ci4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6MTMzOToxMzog
d2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzogSW4gZnVuY3Rpb24gJ2Jhbmcn
OgouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjEzNDE6Mjog
d2FybmluZzogY2FzdCB0byBwb2ludGVyIGZyb20gaW50ZWdlciBvZiBkaWZmZXJlbnQgc2l6ZQou
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOiBBdCB0b3AgbGV2
ZWw6Ci4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6MTM0Nzox
OiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOiBJbiBmdW5jdGlvbiAnYXRz
aWduJzoKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzoxMzQ5
OjE1OiB3YXJuaW5nOiBjYXN0IHRvIHBvaW50ZXIgZnJvbSBpbnRlZ2VyIG9mIGRpZmZlcmVudCBz
aXplCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6IEF0IHRv
cCBsZXZlbDoKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzox
MzUzOjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2RvYy9tYWtlZG9jLmM6MTM2MjoxMzogd2Fy
bmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzoxMzgxOjEzOiB3YXJuaW5nOiBmdW5j
dGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjEzODc6NTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFy
YXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
ZG9jL21ha2Vkb2MuYzo0OTI6MTogd2FybmluZzogJ21hbmdsZWNvbW1lbnRzJyBkZWZpbmVkIGJ1
dCBub3QgdXNlZAouLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5j
OjEyNDQ6MTogd2FybmluZzogJ3B1c2hfYWRkcicgZGVmaW5lZCBidXQgbm90IHVzZWQKLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvZG9jL21ha2Vkb2MuYzoxMzgxOjEzOiB3YXJuaW5n
OiAndXNhZ2UnIGRlZmluZWQgYnV0IG5vdCB1c2VkCi4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2RvYy9tYWtlZG9jLmM6IEluIGZ1bmN0aW9uICd3cml0ZV9idWZmZXInOgouLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9kb2MvbWFrZWRvYy5jOjEwMzoxMTogd2FybmluZzog
aWdub3JpbmcgcmV0dXJuIHZhbHVlIG9mICdmd3JpdGUnLCBkZWNsYXJlZCB3aXRoIGF0dHJpYnV0
ZSB3YXJuX3VudXNlZF9yZXN1bHQKZ2NjIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgICAtbyBtYWtlZG9jIG1ha2Vkb2MubwptYWtlWzVdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2Rv
YycKTWFraW5nIGFsbCBpbiAuCm1ha2VbNV06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliJwpybSAtZiBs
aWJtLmEKbG4gbGlibS9saWJtLmEgbGlibS5hID4vZGV2L251bGwgMj4vZGV2L251bGwgfHwgY3Ag
bGlibS9saWJtLmEgbGlibS5hCnJtIC1yZiBsaWJjLmEgbGliZy5hIHRtcApta2RpciB0bXAKY2Qg
dG1wOyBcCiBhciB4IC4uL2xpYm0uYSBsaWJfYS1zX2lzaW5mLm8gbGliX2Etc2ZfaXNpbmYubyBs
aWJfYS1zX2lzbmFuLm8gbGliX2Etc2ZfaXNuYW4ubyBsaWJfYS1zX2lzaW5mZC5vIGxpYl9hLXNm
X2lzaW5mZi5vIGxpYl9hLXNfaXNuYW5kLm8gbGliX2Etc2ZfaXNuYW5mLm8gbGliX2Etc19uYW4u
byBsaWJfYS1zZl9uYW4ubyBsaWJfYS1zX2xkZXhwLm8gbGliX2Etc2ZfbGRleHAubyBsaWJfYS1z
X2ZyZXhwLm8gbGliX2Etc2ZfZnJleHAubyBsaWJfYS1zX21vZGYubyBsaWJfYS1zZl9tb2RmLm8g
bGliX2Etc19zY2FsYm4ubyBsaWJfYS1zZl9zY2FsYm4ubyBsaWJfYS1zX2Zpbml0ZS5vIGxpYl9h
LXNmX2Zpbml0ZS5vIGxpYl9hLXNfY29weXNpZ24ubyBsaWJfYS1zZl9jb3B5c2lnbi5vIGxpYl9h
LXNfaW5mY29uc3QubyA7IFwKIGFyIHggLi4vbGliYy9saWJjLmEgOyBcCiBhciByYyAuLi9saWJj
LmEgKi5vCnJhbmxpYiBsaWJjLmEKbG4gbGliYy5hIGxpYmcuYSA+L2Rldi9udWxsIDI+L2Rldi9u
dWxsIHx8IGNwIGxpYmMuYSBsaWJnLmEKcm0gLXJmIHRtcAptYWtlWzVdOiBMZWF2aW5nIGRpcmVj
dG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliJwptYWtlWzRdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliJwptYWtlWzNdOiBMZWF2aW5nIGRp
cmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliJwpDaGVja2luZyBtdWx0aWxpYiBjb25maWd1cmF0aW9uIGZvciBsaWJnbG9zcy4u
Lgpta2RpciAtcCAtLSB4ODZfNjQteGVuLWVsZi9saWJnbG9zcwpDb25maWd1cmluZyBpbiB4ODZf
NjQteGVuLWVsZi9saWJnbG9zcwpjb25maWd1cmU6IGNyZWF0aW5nIGNhY2hlIC4vY29uZmlnLmNh
Y2hlCmNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gL3Vzci9iaW4vaW5z
dGFsbCAtYwpjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiB4ODZfNjQtdW5rbm93bi1saW51
eC1nbnUKY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiB4ODZfNjQteGVuLWVsZgpjaGVja2lu
ZyB0YXJnZXQgc3lzdGVtIHR5cGUuLi4geDg2XzY0LXhlbi1lbGYKY2hlY2tpbmcgd2hldGhlciBi
dWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLi4uIHllcwpjaGVja2luZyBmb3IgZ2F3ay4uLiBnYXdr
CmNoZWNraW5nIHdoZXRoZXIgbWFrZSBzZXRzICQoTUFLRSkuLi4geWVzCmNoZWNraW5nIGZvciB4
ODZfNjQteGVuLWVsZi1zdHJpcC4uLiB4ODZfNjQteGVuLWVsZi1zdHJpcApjaGVja2luZyBmb3Ig
c3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5IG1ha2UuLi4gR05VCmNoZWNraW5nIGZvciBnY2MuLi4g
Z2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAt
VSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAt
aXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0CmNo
ZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRl
IC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0Li4uIGdjYzMKY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUg
dXNpbmcgR05VIEMuLi4geWVzCmNoZWNraW5nIHdoZXRoZXIgZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IGFjY2VwdHMgLWcuLi4gbm8KY2hlY2tp
bmcgZm9yIGFyLi4uIGFyCmNoZWNraW5nIGZvciB4ODZfNjQteGVuLWVsZi1yYW5saWIuLi4gcmFu
bGliCnVwZGF0aW5nIGNhY2hlIC4vY29uZmlnLmNhY2hlCmNvbmZpZ3VyZTogY3JlYXRpbmcgLi9j
b25maWcuc3RhdHVzCmNvbmZpZy5zdGF0dXM6IGNyZWF0aW5nIE1ha2VmaWxlCmNvbmZpZy5zdGF0
dXM6IGV4ZWN1dGluZyBkZXBmaWxlcyBjb21tYW5kcwpjb25maWd1cmU6IGNvbmZpZ3VyaW5nIGlu
IGRvYwpjb25maWd1cmU6IHJ1bm5pbmcgL2Jpbi9zaCAnLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9saWJnbG9zcy9kb2MvY29uZmlndXJlJyAtLXByZWZpeD0vdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQgICctLWNhY2hlLWZpbGU9Li9jb25maWcuY2FjaGUnICctLXdpdGgt
bmV3bGliJyAnLS13aXRoLWNyb3NzLWhvc3Q9eDg2XzY0LXVua25vd24tbGludXgtZ251JyAnLS1w
cmVmaXg9L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0JyAnLS12ZXJib3Nl
JyAnLS10YXJnZXQ9eDg2XzY0LXhlbi1lbGYnICctLWVuYWJsZS1uZXdsaWItaW8tbG9uZy1sb25n
JyAnLS1kaXNhYmxlLW11bHRpbGliJyAnLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPXMsXix4ODZf
NjQteGVuLWVsZi0sJyAnLS13aXRoLXRhcmdldC1zdWJkaXI9eDg2XzY0LXhlbi1lbGYnICctLWJ1
aWxkPXg4Nl82NC11bmtub3duLWxpbnV4LWdudScgJy0taG9zdD14ODZfNjQteGVuLWVsZicgJy0t
dGFyZ2V0PXg4Nl82NC14ZW4tZWxmJyAnLS1zcmNkaXI9Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcycgJ2J1aWxkX2FsaWFzPXg4Nl82NC11bmtub3duLWxpbnV4LWdudScgJ2hvc3RfYWxp
YXM9eDg2XzY0LXhlbi1lbGYnICd0YXJnZXRfYWxpYXM9eDg2XzY0LXhlbi1lbGYnIC0tY2FjaGUt
ZmlsZT0uLi8uL2NvbmZpZy5jYWNoZSAtLXNyY2Rpcj0uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL2RvYwpjb25maWd1cmU6IGxvYWRpbmcgY2FjaGUgLi4vLi9jb25maWcuY2FjaGUK
Y2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAvdXNyL2Jpbi9pbnN0YWxs
IC1jCmNvbmZpZ3VyZTogY3JlYXRpbmcgLi9jb25maWcuc3RhdHVzCmNvbmZpZy5zdGF0dXM6IGNy
ZWF0aW5nIE1ha2VmaWxlCmNvbmZpZ3VyZTogY29uZmlndXJpbmcgaW4gbGlibm9zeXMKY29uZmln
dXJlOiBydW5uaW5nIC9iaW4vc2ggJy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
bGlibm9zeXMvY29uZmlndXJlJyAtLXByZWZpeD0vdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQgICctLWNhY2hlLWZpbGU9Li9jb25maWcuY2FjaGUnICctLXdpdGgtbmV3bGli
JyAnLS13aXRoLWNyb3NzLWhvc3Q9eDg2XzY0LXVua25vd24tbGludXgtZ251JyAnLS1wcmVmaXg9
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0JyAnLS12ZXJib3NlJyAnLS10
YXJnZXQ9eDg2XzY0LXhlbi1lbGYnICctLWVuYWJsZS1uZXdsaWItaW8tbG9uZy1sb25nJyAnLS1k
aXNhYmxlLW11bHRpbGliJyAnLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPXMsXix4ODZfNjQteGVu
LWVsZi0sJyAnLS13aXRoLXRhcmdldC1zdWJkaXI9eDg2XzY0LXhlbi1lbGYnICctLWJ1aWxkPXg4
Nl82NC11bmtub3duLWxpbnV4LWdudScgJy0taG9zdD14ODZfNjQteGVuLWVsZicgJy0tdGFyZ2V0
PXg4Nl82NC14ZW4tZWxmJyAnLS1zcmNkaXI9Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9saWJnbG9z
cycgJ2J1aWxkX2FsaWFzPXg4Nl82NC11bmtub3duLWxpbnV4LWdudScgJ2hvc3RfYWxpYXM9eDg2
XzY0LXhlbi1lbGYnICd0YXJnZXRfYWxpYXM9eDg2XzY0LXhlbi1lbGYnIC0tY2FjaGUtZmlsZT0u
Li8uL2NvbmZpZy5jYWNoZSAtLXNyY2Rpcj0uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmds
b3NzL2xpYm5vc3lzCmNvbmZpZ3VyZTogbG9hZGluZyBjYWNoZSAuLi8uL2NvbmZpZy5jYWNoZQpj
aGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAoY2FjaGVkKSB4ODZfNjQtdW5rbm93bi1saW51
eC1nbnUKY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAoY2FjaGVkKSB4ODZfNjQteGVuLWVs
ZgpjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUuLi4gKGNhY2hlZCkgeDg2XzY0LXhlbi1lbGYK
Y2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAvdXNyL2Jpbi9pbnN0YWxs
IC1jCmNoZWNraW5nIGZvciAucHJldmlvdXMgYXNzZW1ibGVyIGRpcmVjdGl2ZS4uLiB5ZXMKY2hl
Y2tpbmcgZm9yIC5wb3BzZWN0aW9uIGFzc2VtYmxlciBkaXJlY3RpdmUuLi4geWVzCmNoZWNraW5n
IGZvciBzZWN0aW9uIGF0dHJpYnV0ZXMuLi4geWVzCmNoZWNraW5nIGZvciBzeW1ib2wgcHJlZml4
Li4uIG5vbmUKY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSBtYWtlLi4uIEdO
VQpjaGVja2luZyBmb3IgZ2NjLi4uIChjYWNoZWQpIGdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5j
bHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9J
Mzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2lu
Y2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NApjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9m
IGdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
LyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5
cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NC4u
LiAoY2FjaGVkKSBnY2MzCmNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDLi4uIChj
YWNoZWQpIHllcwpjaGVja2luZyB3aGV0aGVyIGdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVk
ZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCBhY2NlcHRzIC1nLi4uIChjYWNoZWQpIG5vCmNoZWNr
aW5nIGZvciB4ODZfNjQteGVuLWVsZi1yYW5saWIuLi4gKGNhY2hlZCkgcmFubGliCnVwZGF0aW5n
IGNhY2hlIC4uLy4vY29uZmlnLmNhY2hlCmNvbmZpZ3VyZTogY3JlYXRpbmcgLi9jb25maWcuc3Rh
dHVzCmNvbmZpZy5zdGF0dXM6IGNyZWF0aW5nIE1ha2VmaWxlCkFkZGluZyBtdWx0aWxpYiBzdXBw
b3J0IHRvIE1ha2VmaWxlIGluIC4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGli
bm9zeXMKd2l0aF9tdWx0aXN1YmRpcj0KY29uZmlnLnN0YXR1czogY3JlYXRpbmcgY29uZmlnLmgK
Y29uZmlnLnN0YXR1czogZXhlY3V0aW5nIGRlcGZpbGVzIGNvbW1hbmRzCm1ha2VbM106IEVudGVy
aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MnCm1ha2VbNF06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvZG9jJwpt
YWtlWzRdOiBOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBhbGwnLgptYWtlWzRdOiBMZWF2aW5nIGRp
cmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MvZG9jJwptYWtlWzRdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
JwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLU8yIC1JLiAtSS4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMvLi4gLWMgLU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy9saWJub3N5cy9jaG93bi5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5j
bHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9J
Mzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2lu
Y2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICAtTzIgLUkuIC1JLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9saWJn
bG9zcy9saWJub3N5cy8uLiAtYyAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgICAuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL2xpYm5vc3lzL2Nsb3Nl
LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1PMiAtSS4gLUku
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1jIC1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MvbGlibm9zeXMvZW52aXJvbi5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZF
X0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0
b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5f
XyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJv
b3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4
Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
aW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgICAtTzIgLUkuIC1JLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy9saWJub3N5cy8uLiAtYyAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL2xpYm5vc3lzL2Vy
cm5vLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1PMiAtSS4g
LUkuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1jIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMvZXhlY3ZlLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1PMiAtSS4gLUkuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1jIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMv
Zm9yay5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtTzIgLUku
IC1JLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9saWJnbG9zcy9saWJub3N5cy8uLiAtYyAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAuLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL2xpYm5vc3lzL2ZzdGF0LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1PMiAtSS4gLUkuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1jIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMv
Z2V0cGlkLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9f
bGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
aW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1PMiAt
SS4gLUkuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1jIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMvZ2V0dG9kLmMKZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRp
b25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWlu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1PMiAtSS4gLUkuLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1jIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAgIC4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9z
eXMvaXNhdHR5LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
Mi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1P
MiAtSS4gLUkuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1j
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMva2lsbC5jCmdjYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18g
LURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xz
L3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUg
X19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Ny
b3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIv
Z2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0
aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtTzIgLUkuIC1JLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy9saWJub3N5cy8uLiAtYyAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICAuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL2xpYm5v
c3lzL2xpbmsuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUg
X19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4y
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVk
ZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5v
LXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5U
RVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9z
cy94ODZfNjQgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLU8y
IC1JLiAtSS4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMvLi4gLWMg
LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy9saWJub3N5cy9sc2Vlay5jCmdjYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18g
LURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xz
L3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUg
X19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Ny
b3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIv
Z2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0
aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtTzIgLUkuIC1JLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy9saWJub3N5cy8uLiAtYyAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICAuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL2xpYm5v
c3lzL29wZW4uYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUg
X19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4y
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVk
ZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5v
LXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5U
RVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9z
cy94ODZfNjQgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLU8y
IC1JLiAtSS4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMvLi4gLWMg
LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy9saWJub3N5cy9yZWFkLmMKZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRp
b25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWlu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1PMiAtSS4gLUkuLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1jIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAgIC4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9z
eXMvcmVhZGxpbmsuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQg
LVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVu
LWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQu
NS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5j
bHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAt
Zm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdf
SU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJn
bG9zcy94ODZfNjQgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAg
LU8yIC1JLiAtSS4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMvLi4g
LWMgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9saWJnbG9zcy9saWJub3N5cy9zYnJrLmMKLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9saWJnbG9zcy9saWJub3N5cy9zYnJrLmM6NzoxOiB3YXJuaW5nOiBmdW5jdGlv
biBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2lu
Y2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURf
STM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9p
bmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgICAgLU8yIC1JLiAtSS4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MvbGlibm9zeXMvLi4gLWMgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9saWJnbG9zcy9saWJub3N5cy9zdGF0
LmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1PMiAtSS4gLUku
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1jIC1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MvbGlibm9zeXMvc3ltbGluay5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZF
X0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0
b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5f
XyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJv
b3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4
Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
aW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgICAtTzIgLUkuIC1JLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy9saWJub3N5cy8uLiAtYyAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL2xpYm5vc3lzL3Rp
bWVzLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1PMiAtSS4g
LUkuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1jIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMvdW5saW5rLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1PMiAtSS4gLUkuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1jIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMv
d2FpdC5jCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtTzIgLUku
IC1JLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9saWJnbG9zcy9saWJub3N5cy8uLiAtYyAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAuLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL2xpYm5vc3lzL3dyaXRlLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1PMiAtSS4gLUkuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL2xpYm5vc3lzLy4uIC1jIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MvbGlibm9zeXMv
X2V4aXQuYwphciBydiBsaWJub3N5cy5hIGNob3duLm8gY2xvc2UubyBlbnZpcm9uLm8gZXJybm8u
byBleGVjdmUubyBmb3JrLm8gZnN0YXQubyBnZXRwaWQubyBnZXR0b2QubyBpc2F0dHkubyBraWxs
Lm8gbGluay5vIGxzZWVrLm8gb3Blbi5vIHJlYWQubyByZWFkbGluay5vIHNicmsubyBzdGF0Lm8g
c3ltbGluay5vIHRpbWVzLm8gdW5saW5rLm8gd2FpdC5vIHdyaXRlLm8gX2V4aXQubwphcjogY3Jl
YXRpbmcgbGlibm9zeXMuYQphIC0gY2hvd24ubwphIC0gY2xvc2UubwphIC0gZW52aXJvbi5vCmEg
LSBlcnJuby5vCmEgLSBleGVjdmUubwphIC0gZm9yay5vCmEgLSBmc3RhdC5vCmEgLSBnZXRwaWQu
bwphIC0gZ2V0dG9kLm8KYSAtIGlzYXR0eS5vCmEgLSBraWxsLm8KYSAtIGxpbmsubwphIC0gbHNl
ZWsubwphIC0gb3Blbi5vCmEgLSByZWFkLm8KYSAtIHJlYWRsaW5rLm8KYSAtIHNicmsubwphIC0g
c3RhdC5vCmEgLSBzeW1saW5rLm8KYSAtIHRpbWVzLm8KYSAtIHVubGluay5vCmEgLSB3YWl0Lm8K
YSAtIHdyaXRlLm8KYSAtIF9leGl0Lm8KcmFubGliIGxpYm5vc3lzLmEKbWFrZVs0XTogTGVhdmlu
ZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzJwptYWtlWzNdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mn
Cm1ha2VbMl06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NCcKbWFrZVsxXTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9uZXdsaWIteDg2XzY0JwptYWtlWzFdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0JwptYWtlWzFdOiB3YXJuaW5nOiBqb2JzZXJ2ZXIgdW5h
dmFpbGFibGU6IHVzaW5nIC1qMS4gIEFkZCBgKycgdG8gcGFyZW50IG1ha2UgcnVsZS4KbWFrZVsy
XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NCcKL2Jpbi9zaCAuLi9uZXdsaWItMS4xNi4wL21raW5zdGFsbGRpcnMgL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NApta2RpciAtcCAtLSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0Cm1ha2VbM106IEVudGVy
aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQvZXRjJwpm
b3IgZiBpbiBzdGFuZGFyZHMuaW5mbyBjb25maWd1cmUuaW5mbzsgZG8gXAogIGlmIHRlc3QgLWYg
Li4vLi4vbmV3bGliLTEuMTYuMC9ldGMvYGVjaG8gJGYgfCBzZWQgLWUgJ3MvLmluZm8kLy50ZXhp
LydgOyB0aGVuIFwKICAgIGlmIG1ha2UgIk1BS0VJTkZPPW1ha2VpbmZvIC0tc3BsaXQtc2l6ZT01
MDAwMDAwIC0tc3BsaXQtc2l6ZT01MDAwMDAwIiAkZjsgdGhlbiBcCiAgICAgIHRydWU7IFwKICAg
IGVsc2UgXAogICAgICBleGl0IDE7IFwKICAgIGZpOyBcCiAgZmk7IFwKZG9uZQptYWtlWzRdOiBF
bnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L2V0
YycKbWFrZVs0XTogYHN0YW5kYXJkcy5pbmZvJyBpcyB1cCB0byBkYXRlLgptYWtlWzRdOiBMZWF2
aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQvZXRjJwpt
YWtlWzRdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L2V0YycKbWFrZVs0XTogYGNvbmZpZ3VyZS5pbmZvJyBpcyB1cCB0byBkYXRlLgptYWtl
WzRdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZf
NjQvZXRjJwovYmluL3NoIC4uLy4uL25ld2xpYi0xLjE2LjAvZXRjLy4uL21raW5zdGFsbGRpcnMg
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L2luZm8KbWtkaXIgLXAgLS0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L2luZm8KaWYgdGVzdCAhIC1m
IHN0YW5kYXJkcy5pbmZvOyB0aGVuIGNkIC4uLy4uL25ld2xpYi0xLjE2LjAvZXRjOyBmaTsgXApp
ZiB0ZXN0IC1mIHN0YW5kYXJkcy5pbmZvOyB0aGVuIFwKICBmb3IgaSBpbiBzdGFuZGFyZHMuaW5m
byo7IGRvIFwKICAgIC91c3IvYmluL2luc3RhbGwgLWMgLW0gNjQ0ICRpIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC9pbmZvLyRpOyBcCiAgZG9uZTsgXApmaQppZiB0ZXN0
ICEgLWYgY29uZmlndXJlLmluZm87IHRoZW4gY2QgLi4vLi4vbmV3bGliLTEuMTYuMC9ldGM7IGZp
OyBcCmlmIHRlc3QgLWYgY29uZmlndXJlLmluZm87IHRoZW4gXAogIGZvciBpIGluIGNvbmZpZ3Vy
ZS5pbmZvKjsgZG8gXAogICAgL3Vzci9iaW4vaW5zdGFsbCAtYyAtbSA2NDQgJGkgL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L2luZm8vJGk7IFwKICBkb25lOyBcCmZpCm1h
a2VbM106IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC9ldGMnCm1ha2VbM106IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliJwpNYWtpbmcgaW5zdGFsbCBp
biBsaWJjCm1ha2VbNF06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMnCk1ha2luZyBpbnN0YWxs
IGluIGFyZ3oKbWFrZVs1XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9hcmd6JwptYWtlWzZd
OiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL2FyZ3onCm1ha2VbNl06IE5vdGhpbmcgdG8gYmUg
ZG9uZSBmb3IgYGluc3RhbGwtZXhlYy1hbScuCm1ha2VbNl06IE5vdGhpbmcgdG8gYmUgZG9uZSBm
b3IgYGluc3RhbGwtZGF0YS1hbScuCm1ha2VbNl06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9h
cmd6JwptYWtlWzVdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvYXJneicKTWFraW5nIGluc3Rh
bGwgaW4gc3RkbGliCm1ha2VbNV06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvc3RkbGliJwpN
YWtlZmlsZToxMzg1OiB3YXJuaW5nOiBvdmVycmlkaW5nIHJlY2lwZSBmb3IgdGFyZ2V0IGBsaWJf
YS1tYnRvd2Nfci5vJwpNYWtlZmlsZTo4MDc6IHdhcm5pbmc6IGlnbm9yaW5nIG9sZCByZWNpcGUg
Zm9yIHRhcmdldCBgbGliX2EtbWJ0b3djX3IubycKbWFrZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5
IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvbGliYy9zdGRsaWInCk1ha2VmaWxlOjEzODU6IHdhcm5pbmc6IG92ZXJyaWRpbmcgcmVjaXBl
IGZvciB0YXJnZXQgYGxpYl9hLW1idG93Y19yLm8nCk1ha2VmaWxlOjgwNzogd2FybmluZzogaWdu
b3Jpbmcgb2xkIHJlY2lwZSBmb3IgdGFyZ2V0IGBsaWJfYS1tYnRvd2Nfci5vJwptYWtlWzZdOiBO
b3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBpbnN0YWxsLWV4ZWMtYW0nLgptYWtlWzZdOiBOb3RoaW5n
IHRvIGJlIGRvbmUgZm9yIGBpbnN0YWxsLWRhdGEtYW0nLgptYWtlWzZdOiBMZWF2aW5nIGRpcmVj
dG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL2xpYmMvc3RkbGliJwptYWtlWzVdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvc3Rk
bGliJwpNYWtpbmcgaW5zdGFsbCBpbiBjdHlwZQptYWtlWzVdOiBFbnRlcmluZyBkaXJlY3Rvcnkg
YC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi9saWJjL2N0eXBlJwptYWtlWzZdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL2N0eXBlJwpt
YWtlWzZdOiBOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBpbnN0YWxsLWV4ZWMtYW0nLgptYWtlWzZd
OiBOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBpbnN0YWxsLWRhdGEtYW0nLgptYWtlWzZdOiBMZWF2
aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliL2xpYmMvY3R5cGUnCm1ha2VbNV06IExlYXZpbmcgZGlyZWN0b3J5IGAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
bGliYy9jdHlwZScKTWFraW5nIGluc3RhbGwgaW4gc2VhcmNoCm1ha2VbNV06IEVudGVyaW5nIGRp
cmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL2xpYmMvc2VhcmNoJwptYWtlWzZdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJj
L3NlYXJjaCcKbWFrZVs2XTogTm90aGluZyB0byBiZSBkb25lIGZvciBgaW5zdGFsbC1leGVjLWFt
Jy4KbWFrZVs2XTogTm90aGluZyB0byBiZSBkb25lIGZvciBgaW5zdGFsbC1kYXRhLWFtJy4KbWFr
ZVs2XTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL3NlYXJjaCcKbWFrZVs1XTogTGVhdmluZyBk
aXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi9saWJjL3NlYXJjaCcKTWFraW5nIGluc3RhbGwgaW4gc3RkaW8KbWFrZVs1XTog
RW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9zdGRpbycKbWFrZVs2XTogRW50ZXJpbmcgZGlyZWN0
b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvbGliYy9zdGRpbycKbWFrZVs2XTogTm90aGluZyB0byBiZSBkb25lIGZvciBgaW5zdGFs
bC1leGVjLWFtJy4KbWFrZVs2XTogTm90aGluZyB0byBiZSBkb25lIGZvciBgaW5zdGFsbC1kYXRh
LWFtJy4KbWFrZVs2XTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL3N0ZGlvJwptYWtlWzVdOiBM
ZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvc3RkaW8nCk1ha2luZyBpbnN0YWxsIGluIHN0cmluZwpt
YWtlWzVdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL3N0cmluZycKbWFrZVs2XTogRW50ZXJp
bmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvbGliYy9zdHJpbmcnCm1ha2VbNl06IE5vdGhpbmcgdG8gYmUgZG9uZSBm
b3IgYGluc3RhbGwtZXhlYy1hbScuCm1ha2VbNl06IE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYGlu
c3RhbGwtZGF0YS1hbScuCm1ha2VbNl06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9zdHJpbmcn
Cm1ha2VbNV06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9zdHJpbmcnCk1ha2luZyBpbnN0YWxs
IGluIHNpZ25hbAptYWtlWzVdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL3NpZ25hbCcKbWFr
ZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9zaWduYWwnCm1ha2VbNl06IE5vdGhpbmcg
dG8gYmUgZG9uZSBmb3IgYGluc3RhbGwtZXhlYy1hbScuCm1ha2VbNl06IE5vdGhpbmcgdG8gYmUg
ZG9uZSBmb3IgYGluc3RhbGwtZGF0YS1hbScuCm1ha2VbNl06IExlYXZpbmcgZGlyZWN0b3J5IGAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
bGliYy9zaWduYWwnCm1ha2VbNV06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9zaWduYWwnCk1h
a2luZyBpbnN0YWxsIGluIHRpbWUKbWFrZVs1XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy90
aW1lJwptYWtlWzZdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL3RpbWUnCm1ha2VbNl06IE5v
dGhpbmcgdG8gYmUgZG9uZSBmb3IgYGluc3RhbGwtZXhlYy1hbScuCm1ha2VbNl06IE5vdGhpbmcg
dG8gYmUgZG9uZSBmb3IgYGluc3RhbGwtZGF0YS1hbScuCm1ha2VbNl06IExlYXZpbmcgZGlyZWN0
b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvbGliYy90aW1lJwptYWtlWzVdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvdGltZScK
TWFraW5nIGluc3RhbGwgaW4gbG9jYWxlCm1ha2VbNV06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xp
YmMvbG9jYWxlJwptYWtlWzZdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL2xvY2FsZScKbWFr
ZVs2XTogTm90aGluZyB0byBiZSBkb25lIGZvciBgaW5zdGFsbC1leGVjLWFtJy4KbWFrZVs2XTog
Tm90aGluZyB0byBiZSBkb25lIGZvciBgaW5zdGFsbC1kYXRhLWFtJy4KbWFrZVs2XTogTGVhdmlu
ZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi9saWJjL2xvY2FsZScKbWFrZVs1XTogTGVhdmluZyBkaXJlY3RvcnkgYC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9s
aWJjL2xvY2FsZScKTWFraW5nIGluc3RhbGwgaW4gc3lzCm1ha2VbNV06IEVudGVyaW5nIGRpcmVj
dG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL2xpYmMvc3lzJwpNYWtpbmcgaW5zdGFsbCBpbiAuCm1ha2VbNl06IEVudGVyaW5nIGRp
cmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL2xpYmMvc3lzJwptYWtlWzddOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL3N5
cycKbWFrZVs3XTogTm90aGluZyB0byBiZSBkb25lIGZvciBgaW5zdGFsbC1leGVjLWFtJy4KbWFr
ZVs3XTogTm90aGluZyB0byBiZSBkb25lIGZvciBgaW5zdGFsbC1kYXRhLWFtJy4KbWFrZVs3XTog
TGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL3N5cycKbWFrZVs2XTogTGVhdmluZyBkaXJlY3Rvcnkg
YC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi9saWJjL3N5cycKbWFrZVs1XTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL3N5cycKTWFraW5n
IGluc3RhbGwgaW4gcmVlbnQKbWFrZVs1XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9yZWVu
dCcKbWFrZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9yZWVudCcKbWFrZVs2XTogTm90
aGluZyB0byBiZSBkb25lIGZvciBgaW5zdGFsbC1leGVjLWFtJy4KbWFrZVs2XTogTm90aGluZyB0
byBiZSBkb25lIGZvciBgaW5zdGFsbC1kYXRhLWFtJy4KbWFrZVs2XTogTGVhdmluZyBkaXJlY3Rv
cnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi9saWJjL3JlZW50JwptYWtlWzVdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvcmVlbnQn
Ck1ha2luZyBpbnN0YWxsIGluIGVycm5vCm1ha2VbNV06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xp
YmMvZXJybm8nCm1ha2VbNl06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvZXJybm8nCm1ha2Vb
Nl06IE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYGluc3RhbGwtZXhlYy1hbScuCm1ha2VbNl06IE5v
dGhpbmcgdG8gYmUgZG9uZSBmb3IgYGluc3RhbGwtZGF0YS1hbScuCm1ha2VbNl06IExlYXZpbmcg
ZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvbGliYy9lcnJubycKbWFrZVs1XTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJj
L2Vycm5vJwpNYWtpbmcgaW5zdGFsbCBpbiBtaXNjCm1ha2VbNV06IEVudGVyaW5nIGRpcmVjdG9y
eSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliL2xpYmMvbWlzYycKbWFrZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9taXNjJwpt
YWtlWzZdOiBOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBpbnN0YWxsLWV4ZWMtYW0nLgptYWtlWzZd
OiBOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBpbnN0YWxsLWRhdGEtYW0nLgptYWtlWzZdOiBMZWF2
aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliL2xpYmMvbWlzYycKbWFrZVs1XTogTGVhdmluZyBkaXJlY3RvcnkgYC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9s
aWJjL21pc2MnCk1ha2luZyBpbnN0YWxsIGluIG1hY2hpbmUKbWFrZVs1XTogRW50ZXJpbmcgZGly
ZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvbGliYy9tYWNoaW5lJwpNYWtpbmcgaW5zdGFsbCBpbiB4ODZfNjQKbWFrZVs2XTog
RW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9tYWNoaW5lL3g4Nl82NCcKbWFrZVs3XTogRW50ZXJp
bmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvbGliYy9tYWNoaW5lL3g4Nl82NCcKbWFrZVs3XTogTm90aGluZyB0byBi
ZSBkb25lIGZvciBgaW5zdGFsbC1leGVjLWFtJy4KbWFrZVs3XTogTm90aGluZyB0byBiZSBkb25l
IGZvciBgaW5zdGFsbC1kYXRhLWFtJy4KbWFrZVs3XTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJj
L21hY2hpbmUveDg2XzY0JwptYWtlWzZdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvbWFjaGlu
ZS94ODZfNjQnCk1ha2luZyBpbnN0YWxsIGluIC4KbWFrZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5
IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvbGliYy9tYWNoaW5lJwptYWtlWzddOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL21hY2hp
bmUnCm1ha2VbN106IE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYGluc3RhbGwtZXhlYy1hbScuCm1h
a2VbN106IE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYGluc3RhbGwtZGF0YS1hbScuCm1ha2VbN106
IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9tYWNoaW5lJwptYWtlWzZdOiBMZWF2aW5nIGRpcmVj
dG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL2xpYmMvbWFjaGluZScKbWFrZVs1XTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjL21h
Y2hpbmUnCk1ha2luZyBpbnN0YWxsIGluIC4KbWFrZVs1XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
bGliYycKbWFrZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYycKbWFrZVs2XTogTm90aGlu
ZyB0byBiZSBkb25lIGZvciBgaW5zdGFsbC1leGVjLWFtJy4KbWFrZVs2XTogTm90aGluZyB0byBi
ZSBkb25lIGZvciBgaW5zdGFsbC1kYXRhLWFtJy4KbWFrZVs2XTogTGVhdmluZyBkaXJlY3Rvcnkg
YC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi9saWJjJwptYWtlWzVdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMnCm1ha2VbNF06IExlYXZp
bmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvbGliYycKTWFraW5nIGluc3RhbGwgaW4gbGlibQptYWtlWzRdOiBFbnRl
cmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi9saWJtJwpNYWtpbmcgaW5zdGFsbCBpbiBtYXRoCm1ha2VbNV06IEVu
dGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliL2xpYm0vbWF0aCcKbWFrZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5
IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvbGlibS9tYXRoJwptYWtlWzZdOiBOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBpbnN0YWxsLWV4
ZWMtYW0nLgptYWtlWzZdOiBOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBpbnN0YWxsLWRhdGEtYW0n
LgptYWtlWzZdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYm0vbWF0aCcKbWFrZVs1XTogTGVhdmlu
ZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi9saWJtL21hdGgnCk1ha2luZyBpbnN0YWxsIGluIGNvbW1vbgptYWtlWzVd
OiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJtL2NvbW1vbicKbWFrZVs2XTogRW50ZXJpbmcgZGly
ZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvbGlibS9jb21tb24nCm1ha2VbNl06IE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYGlu
c3RhbGwtZXhlYy1hbScuCm1ha2VbNl06IE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYGluc3RhbGwt
ZGF0YS1hbScuCm1ha2VbNl06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGlibS9jb21tb24nCm1ha2Vb
NV06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGlibS9jb21tb24nCk1ha2luZyBpbnN0YWxsIGluIG1h
Y2hpbmUKbWFrZVs1XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGlibS9tYWNoaW5lJwpNYWtpbmcg
aW5zdGFsbCBpbiAuCm1ha2VbNl06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYm0vbWFjaGluZScK
bWFrZVs3XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGlibS9tYWNoaW5lJwptYWtlWzddOiBOb3Ro
aW5nIHRvIGJlIGRvbmUgZm9yIGBpbnN0YWxsLWV4ZWMtYW0nLgptYWtlWzddOiBOb3RoaW5nIHRv
IGJlIGRvbmUgZm9yIGBpbnN0YWxsLWRhdGEtYW0nLgptYWtlWzddOiBMZWF2aW5nIGRpcmVjdG9y
eSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliL2xpYm0vbWFjaGluZScKbWFrZVs2XTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJtL21hY2hp
bmUnCm1ha2VbNV06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGlibS9tYWNoaW5lJwptYWtlWzVdOiBF
bnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi9saWJtJwptYWtlWzZdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9s
aWJtJwptYWtlWzZdOiBOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBpbnN0YWxsLWV4ZWMtYW0nLgpt
YWtlWzZdOiBOb3RoaW5nIHRvIGJlIGRvbmUgZm9yIGBpbnN0YWxsLWRhdGEtYW0nLgptYWtlWzZd
OiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYm0nCm1ha2VbNV06IExlYXZpbmcgZGlyZWN0b3J5IGAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
bGlibScKbWFrZVs0XTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJtJwpNYWtpbmcgaW5zdGFsbCBp
biBkb2MKbWFrZVs0XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvZG9jJwptYWtlWzVdOiBFbnRlcmlu
ZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi9kb2MnCm1ha2VbNV06IE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYGluc3Rh
bGwtZXhlYy1hbScuCm1ha2VbNV06IE5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgYGluc3RhbGwtZGF0
YS1hbScuCm1ha2VbNV06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvZG9jJwptYWtlWzRdOiBMZWF2aW5n
IGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL2RvYycKTWFraW5nIGluc3RhbGwgaW4gLgptYWtlWzRdOiBFbnRlcmluZyBk
aXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYicKbWFrZVs1XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWInCm1ha2VbNV06IE5vdGhp
bmcgdG8gYmUgZG9uZSBmb3IgYGluc3RhbGwtZXhlYy1hbScuCnRlc3QgLXogIi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWIiIHx8IG1rZGly
IC1wIC0tICIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliIgogL3Vzci9iaW4vaW5zdGFsbCAtYyAtbSA2NDQgJ2xpYm0uYScgJy92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWIvbGlibS5h
JwogL3Vzci9iaW4vaW5zdGFsbCAtYyAtbSA2NDQgJ2xpYmMuYScgJy92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWIvbGliYy5hJwogcmFubGli
ICcvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliL2xpYm0uYScKIHJhbmxpYiAnL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYi9saWJjLmEnCnJtIC1mIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWIvbGliZy5hCmxuIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWIvbGliYy5h
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWIvbGliZy5hID4vZGV2L251bGwgMj4vZGV2L251bGwgfHwgY3AgL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYi9saWJjLmEgL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYi9saWJnLmEK
dHJ1ZSAiQVJfRkxBR1M9cmMiICJDQ19GT1JfQlVJTEQ9Z2NjIiAiQ0ZMQUdTPS1PMiAtZyAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIiAiQ0NBU0ZMQUdTPSIgIkNGTEFHU19G
T1JfQlVJTEQ9LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAiICJDRkxBR1NfRk9S
X1RBUkdFVD0tTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICIgIklO
U1RBTEw9L3Vzci9iaW4vaW5zdGFsbCAtYyIgIkxERkxBR1M9IiAiTElCQ0ZMQUdTPS1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIiAiTElCQ0ZMQUdTX0ZPUl9UQVJH
RVQ9LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAiICJNQUtFPW1h
a2UiICJNQUtFSU5GTz1tYWtlaW5mbyAtLXNwbGl0LXNpemU9NTAwMDAwMCAtLXNwbGl0LXNpemU9
NTAwMDAwMCAgICIgIlBJQ0ZMQUc9IiAiUElDRkxBR19GT1JfVEFSR0VUPSIgIlNIRUxMPS9iaW4v
c2giICJFWFBFQ1Q9ZXhwZWN0IiAiUlVOVEVTVD1ydW50ZXN0IiAiUlVOVEVTVEZMQUdTPSIgImV4
ZWNfcHJlZml4PS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NCIgImluZm9k
aXI9L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L2luZm8iICJsaWJkaXI9
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L2xpYiIgInByZWZpeD0vdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQiICJ0b29sZGlyPS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZiIgInRvcF90b29sbGli
ZGlyPS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWIiICJBUj1hciIgIkFTPXg4Nl82NC14ZW4tZWxmLWFzIiAiQ0M9Z2NjIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1Nf
XyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9v
bHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAt
VSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xp
Yi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IiAiTEQ9bGQiICJMSUJDRkxB
R1M9LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAiICJOTT14ODZf
NjQteGVuLWVsZi1ubSIgIlBJQ0ZMQUc9IiAiUkFOTElCPXJhbmxpYiIgIkRFU1RESVI9IiBETz1p
bnN0YWxsIG11bHRpLWRvICMgbWFrZQppZiBbIC16ICIiIF07IHRoZW4gXAogIC9iaW4vc2ggLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvLi4vbWtpbnN0YWxsZGlycyAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZTsgXAogIGZv
ciBpIGluIC4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZS8qLmg7IGRv
IFwKICAgL3Vzci9iaW4vaW5zdGFsbCAtYyAtbSA2NDQgJGkgL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUvYGJhc2VuYW1lICRpYDsg
XAogIGRvbmU7IFwKICAvdXNyL2Jpbi9pbnN0YWxsIC1jIC1tIDY0NCBuZXdsaWIuaCAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZS9u
ZXdsaWIuaDsgXAogIC9iaW4vc2ggLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvLi4vbWtp
bnN0YWxsZGlycyAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZS9tYWNoaW5lOyBcCiAgZm9yIGkgaW4gLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlL21hY2hpbmUvKi5oOyBkbyBcCiAgIC91c3IvYmluL2lu
c3RhbGwgLWMgLW0gNjQ0ICRpIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82
NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlL21hY2hpbmUvYGJhc2VuYW1lICRpYDsgXAogIGRvbmU7
IFwKICBmb3IgaSBpbiAuLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL21hY2hpbmUv
eDg2XzY0L21hY2hpbmUvKi5oOyBkbyBcCiAgICBpZiBbIC1mICRpIF07IHRoZW4gXAogICAgIC91
c3IvYmluL2luc3RhbGwgLWMgLW0gNjQ0ICRpIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1y
b290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlL21hY2hpbmUvYGJhc2VuYW1lICRpYDsg
XAogICAgZWxzZSB0cnVlOyBmaSA7IFwKICBkb25lOyBcCiAgL2Jpbi9zaCAuLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi8uLi9ta2luc3RhbGxkaXJzIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlL3N5czsgXAogIGZvciBpIGlu
IC4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZS9zeXMvKi5oOyBkbyBc
CiAgIC91c3IvYmluL2luc3RhbGwgLWMgLW0gNjQ0ICRpIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlL3N5cy9gYmFzZW5hbWUgJGlg
OyBcCiAgZG9uZTsgXAogIGZvciBpIGluIC4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvbWFjaGluZS94ODZfNjQvc3lzLyouaDsgZG8gXAogICAgaWYgWyAtZiAkaSBdOyB0aGVuIFwK
ICAgICAvdXNyL2Jpbi9pbnN0YWxsIC1jIC1tIDY0NCAkaSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZS9zeXMvYGJhc2VuYW1lICRp
YDsgXAogICAgZWxzZSB0cnVlOyBmaSA7IFwKICBkb25lIDsgXAogIGZvciBpIGluIC4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvbWFjaGluZS94ODZfNjQvaW5jbHVkZS8qLmg7IGRv
IFwKICAgIGlmIFsgLWYgJGkgXTsgdGhlbiBcCiAgICAgL3Vzci9iaW4vaW5zdGFsbCAtYyAtbSA2
NDQgJGkgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUvYGJhc2VuYW1lICRpYDsgXAogICAgZWxzZSB0cnVlOyBmaSA7IFwKICBkb25l
IDsgXAogIGZvciBpIGluIC4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3lzLy9z
eXMvKi5oOyBkbyBcCiAgICBpZiBbIC1mICRpIF07IHRoZW4gXAogICAgIC91c3IvYmluL2luc3Rh
bGwgLWMgLW0gNjQ0ICRpIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlL3N5cy9gYmFzZW5hbWUgJGlgOyBcCiAgICBlbHNlIHRydWU7
IGZpIDsgXAogIGRvbmUgOyBcCiAgL2Jpbi9zaCAuLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi8uLi9ta2luc3RhbGxkaXJzIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82
NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlL2JpdHM7IFwKICBmb3IgaSBpbiAuLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL3N5cy8vYml0cy8qLmg7IGRvIFwKICAgIGlmIFsgLWYgJGkg
XTsgdGhlbiBcCiAgICAgL3Vzci9iaW4vaW5zdGFsbCAtYyAtbSA2NDQgJGkgL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUvYml0cy9g
YmFzZW5hbWUgJGlgOyBcCiAgICBlbHNlIHRydWU7IGZpIDsgXAogIGRvbmUgOyBcCiAgZm9yIGkg
aW4gLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zeXMvL21hY2hpbmUvKi5oOyBk
byBcCiAgICBpZiBbIC1mICRpIF07IHRoZW4gXAogICAgIC91c3IvYmluL2luc3RhbGwgLWMgLW0g
NjQ0ICRpIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVu
LWVsZi9pbmNsdWRlL21hY2hpbmUvYGJhc2VuYW1lICRpYDsgXAogICAgZWxzZSB0cnVlOyBmaSA7
IFwKICBkb25lIDsgXAogIGZvciBpIGluIC4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc3lzLy9pbmNsdWRlLyouaDsgZG8gXAogICAgaWYgWyAtZiAkaSBdOyB0aGVuIFwKICAgICAv
dXNyL2Jpbi9pbnN0YWxsIC1jIC1tIDY0NCAkaSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZS9gYmFzZW5hbWUgJGlgOyBcCiAgICBl
bHNlIHRydWU7IGZpIDsgXAogIGRvbmUgOyBcCiAgZm9yIGkgaW4gLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zeXMvL21hY2hpbmUveDg2XzY0L2luY2x1ZGUvKi5oOyBkbyBcCiAg
ICBpZiBbIC1mICRpIF07IHRoZW4gXAogICAgIC91c3IvYmluL2luc3RhbGwgLWMgLW0gNjQ0ICRp
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9p
bmNsdWRlL21hY2hpbmUvYGJhc2VuYW1lICRpYDsgXAogICAgZWxzZSB0cnVlOyBmaSA7IFwKICBk
b25lIDsgXAplbHNlIHRydWU7IGZpCm1rZGlyIC1wIC0tIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlCm1rZGlyIC1wIC0tIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
L21hY2hpbmUKbWtkaXIgLXAgLS0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUvc3lzCm1rZGlyIC1wIC0tIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlL2JpdHMKdGVz
dCAteiAiL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYiIgfHwgbWtkaXIgLXAgLS0gIi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWIiCnRlc3QgLXogIi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWIiIHx8IG1rZGlyIC1wIC0tICIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
IgptYWtlWzVdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliJwptYWtlWzRdOiBMZWF2aW5nIGRpcmVjdG9y
eSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliJwptYWtlWzNdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliJwptYWtlWzNdOiBFbnRlcmluZyBkaXJl
Y3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzJwptYWtlWzRdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2RvYycKbWFrZVs0XTog
Tm90aGluZyB0byBiZSBkb25lIGZvciBgaW5zdGFsbCcuCm1ha2VbNF06IExlYXZpbmcgZGlyZWN0
b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9kb2MnCm1ha2VbNF06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMnCm1h
a2VbNF06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cycKbWFrZVszXTogTGVhdmluZyBk
aXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzJwptYWtlWzJdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL25ld2xpYi14ODZfNjQnCm1ha2VbMV06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbmV3bGliLXg4Nl82NCcKKCBjZCB6bGliLXg4Nl82NCAmJiBcCiAgQ0ZM
QUdTPSItaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyIgQ0M9Z2NjIC4vY29uZmlndXJlIC0tcHJlZml4PS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZiAmJiBcCiAg
bWFrZSBERVNURElSPSBsaWJ6LmEgJiYgXAogIG1ha2UgREVTVERJUj0gaW5zdGFsbCApCkJ1aWxk
aW5nIHN0YXRpYyBsaWJyYXJ5IGxpYnouYSB2ZXJzaW9uIDEuMi4zIHdpdGggZ2NjLgpDaGVja2lu
ZyBmb3IgdW5pc3RkLmguLi4gTm8uCkNoZWNraW5nIHdoZXRoZXIgdG8gdXNlIHZzW25dcHJpbnRm
KCkgb3Igc1tuXXByaW50ZigpLi4uIHVzaW5nIHNbbl1wcmludGYoKQpDaGVja2luZyBmb3Igc25w
cmludGYoKSBpbiBzdGRpby5oLi4uIE5vLgogIFdBUk5JTkc6IHNucHJpbnRmKCkgbm90IGZvdW5k
LCBmYWxsaW5nIGJhY2sgdG8gc3ByaW50ZigpLiB6bGliCiAgY2FuIGJ1aWxkIGJ1dCB3aWxsIGJl
IG9wZW4gdG8gcG9zc2libGUgYnVmZmVyLW92ZXJmbG93IHNlY3VyaXR5CiAgdnVsbmVyYWJpbGl0
aWVzLgpDaGVja2luZyBmb3IgcmV0dXJuIHZhbHVlIG9mIHNwcmludGYoKS4uLiBOby4KICBXQVJO
SU5HOiBhcHBhcmVudGx5IHNwcmludGYoKSBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gemxpYgog
IGNhbiBidWlsZCBidXQgd2lsbCBiZSBvcGVuIHRvIHBvc3NpYmxlIHN0cmluZy1mb3JtYXQgc2Vj
dXJpdHkKICB2dWxuZXJhYmlsaXRpZXMuCkNoZWNraW5nIGZvciBlcnJuby5oLi4uIE5vLgpDaGVj
a2luZyBmb3IgbW1hcCBzdXBwb3J0Li4uIE5vLgptYWtlWzFdOiBFbnRlcmluZyBkaXJlY3Rvcnkg
YC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS96bGliLXg4Nl82NCcKbWFrZVsxXTogd2FybmluZzogam9i
c2VydmVyIHVuYXZhaWxhYmxlOiB1c2luZyAtajEuICBBZGQgYCsnIHRvIHBhcmVudCBtYWtlIHJ1
bGUuCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4
X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1
ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lw
djQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRE5PX3NucHJpbnRmIC1ESEFTX3NwcmludGZfdm9p
ZCAtRE5PX0VSUk5PX0ggICAtYyAtbyBhZGxlcjMyLm8gYWRsZXIzMi5jCmdjYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9T
X18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rv
b2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18g
LVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9s
aWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhj
ZXB0aW9ucyAtRE5PX3NucHJpbnRmIC1ESEFTX3NwcmludGZfdm9pZCAtRE5PX0VSUk5PX0ggICAt
YyAtbyBjb21wcmVzcy5vIGNvbXByZXNzLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRl
IC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1ETk9fc25w
cmludGYgLURIQVNfc3ByaW50Zl92b2lkIC1ETk9fRVJSTk9fSCAgIC1jIC1vIGNyYzMyLm8gY3Jj
MzIuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5v
LXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNr
LXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLUROT19zbnByaW50ZiAtREhBU19zcHJpbnRmX3Zv
aWQgLUROT19FUlJOT19IICAgLWMgLW8gZ3ppby5vIGd6aW8uYwpnY2MgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hl
bi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1E
SEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94
ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9f
c3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9z
cy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2dj
Yy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLUROT19zbnByaW50ZiAtREhBU19zcHJpbnRmX3ZvaWQgLUROT19FUlJOT19IICAgLWMgLW8g
dW5jb21wci5vIHVuY29tcHIuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94
ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLUROT19zbnByaW50ZiAt
REhBU19zcHJpbnRmX3ZvaWQgLUROT19FUlJOT19IICAgLWMgLW8gZGVmbGF0ZS5vIGRlZmxhdGUu
YwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLUROT19zbnByaW50ZiAtREhBU19zcHJpbnRmX3ZvaWQg
LUROT19FUlJOT19IICAgLWMgLW8gdHJlZXMubyB0cmVlcy5jCmdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRE5PX3NucHJpbnRmIC1ESEFTX3NwcmludGZfdm9pZCAtRE5PX0VSUk5PX0ggICAtYyAtbyB6
dXRpbC5vIHp1dGlsLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94
ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1ETk9fc25wcmludGYgLURIQVNf
c3ByaW50Zl92b2lkIC1ETk9fRVJSTk9fSCAgIC1jIC1vIGluZmxhdGUubyBpbmZsYXRlLmMKZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29y
ay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1ETk9fc25wcmludGYgLURIQVNfc3ByaW50Zl92b2lkIC1ETk9f
RVJSTk9fSCAgIC1jIC1vIGluZmJhY2subyBpbmZiYWNrLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1ETk9fc25wcmludGYgLURIQVNfc3ByaW50Zl92b2lkIC1ETk9fRVJSTk9fSCAgIC1jIC1vIGlu
ZnRyZWVzLm8gaW5mdHJlZXMuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94
ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLUROT19zbnByaW50ZiAt
REhBU19zcHJpbnRmX3ZvaWQgLUROT19FUlJOT19IICAgLWMgLW8gaW5mZmFzdC5vIGluZmZhc3Qu
YwphciByYyBsaWJ6LmEgYWRsZXIzMi5vIGNvbXByZXNzLm8gY3JjMzIubyBnemlvLm8gdW5jb21w
ci5vIGRlZmxhdGUubyB0cmVlcy5vIHp1dGlsLm8gaW5mbGF0ZS5vIGluZmJhY2subyBpbmZ0cmVl
cy5vIGluZmZhc3QubyAKbWFrZVsxXTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS96bGliLXg4Nl82NCcKbWFrZVsxXTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVu
LTQuMS4xL3N0dWJkb20vemxpYi14ODZfNjQnCm1ha2VbMV06IHdhcm5pbmc6IGpvYnNlcnZlciB1
bmF2YWlsYWJsZTogdXNpbmcgLWoxLiAgQWRkIGArJyB0byBwYXJlbnQgbWFrZSBydWxlLgpjcCB6
bGliLmggemNvbmYuaCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2
XzY0LXhlbi1lbGYvaW5jbHVkZQpjaG1vZCA2NDQgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUvemxpYi5oIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlL3pjb25mLmgK
Y3AgbGliei5hIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWIKY2QgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYjsgY2htb2QgNzU1IGxpYnouYQpjZCAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliOyBpZiB0ZXN0IC1mIGxpYnou
c28uMS4yLjM7IHRoZW4gXAogIHJtIC1mIGxpYnouc28gbGliei5zby4xOyBcCiAgbG4gLXMgbGli
ei5zby4xLjIuMyBsaWJ6LnNvOyBcCiAgbG4gLXMgbGliei5zby4xLjIuMyBsaWJ6LnNvLjE7IFwK
ICAobGRjb25maWcgfHwgdHJ1ZSkgID4vZGV2L251bGwgMj4mMTsgXApmaQpjcCB6bGliLjMgL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3Jr
L3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL3NoYXJl
L21hbi9tYW4zCmNobW9kIDY0NCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvc2hhcmUvbWFuL21hbjMvemxpYi4zCm1ha2VbMV06IExlYXZpbmcg
ZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vemxpYi14ODZfNjQnCkNQUEZMQUdTPSIt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAt
RF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19G
cmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0
ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vaW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIiBDRkxBR1M9Ii1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyIgbWFrZSBERVNURElSPSAtQyBsaWJ4Yy14ODZfNjQK
KCBjZCBwY2l1dGlscy14ODZfNjQgJiYgXAogIGNwIC4uL2xpYnBjaS5jb25maWcuaCBsaWIvY29u
ZmlnLmggJiYgXAogIGNobW9kIHUrdyBsaWIvY29uZmlnLmggJiYgXAogIGVjaG8gJyNkZWZpbmUg
UENJTElCX1ZFUlNJT04gIjIuMi45IicgPj4gbGliL2NvbmZpZy5oICYmIFwKICBsbiAtc2YgLi4v
Li4vbGlicGNpLmNvbmZpZy5tYWsgbGliL2NvbmZpZy5tayAmJiBcCiAgbWFrZSBERVNURElSPSBD
Qz0iZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsv
eGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIiBsaWIvbGlicGNpLmEgJiYgXAogIGluc3RhbGwgLW0wNjQ0IC1wIGxpYi9saWJwY2ku
YSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliLyAmJiBcCiAgaW5zdGFsbCAtZCAtbTA3NTUgLXAgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Ny
b3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUvcGNpICYmIFwKICBpbnN0YWxs
IC1tMDY0NCAtcCBsaWIvY29uZmlnLmggbGliL2hlYWRlci5oIGxpYi9wY2kuaCBsaWIvdHlwZXMu
aCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
aW5jbHVkZS9wY2kvIFwKKQptYWtlWzFdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS9wY2l1dGlscy14ODZfNjQnCm1ha2VbMV06IHdhcm5pbmc6IGpvYnNlcnZlciB1
bmF2YWlsYWJsZTogdXNpbmcgLWoxLiAgQWRkIGArJyB0byBwYXJlbnQgbWFrZSBydWxlLgptYWtl
IC1DIGxpYiBhbGwKbWFrZVsxXTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbGlieGMteDg2XzY0JwptYWtlWzFdOiB3YXJuaW5nOiBqb2JzZXJ2ZXIgdW5hdmFpbGFi
bGU6IHVzaW5nIC1qMS4gIEFkZCBgKycgdG8gcGFyZW50IG1ha2UgcnVsZS4KbWFrZVsxXTogKioq
IElOVEVSTkFMOiByZWFkZGlyOiBCYWQgZmlsZSBkZXNjcmlwdG9yCi4gIFN0b3AuCm1ha2VbMV06
IC4qLmQ6IEZpZWxkICdzdGVtJyBub3QgY2FjaGVkOiAuKi5kCgptYWtlWzFdOiBMZWF2aW5nIGRp
cmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2xpYnhjLXg4Nl82NCcKbWFrZTogKioqIFts
aWJ4Yy14ODZfNjQvbGlieGVuY3RybC5hXSBFcnJvciAyCm1ha2U6ICoqKiBXYWl0aW5nIGZvciB1
bmZpbmlzaGVkIGpvYnMuLi4uCm1ha2VbMl06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00
LjEuMS9zdHViZG9tL3BjaXV0aWxzLXg4Nl82NC9saWInCmdjYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZF
X0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0
b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5f
XyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2Nyb3NzLXJv
b3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4
Nl82NC1wYy1saW51eC1nbnUvNC41LjIvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
aW5jbHVkZSAtSS4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEv
d29yay94ZW4tNC4xLjEvZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtTzIgLVdhbGwgLVcgLVduby1w
YXJlbnRoZXNlcyAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1wcm90b3R5cGVzIC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9wY2l1dGlscy14ODZfNjQv
bGliLy4uLy4uLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9wY2l1dGlscy14ODZfNjQvbGliLy4u
Ly4uLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tL3BjaXV0aWxzLXg4Nl82NC9saWIvLi4vLi4vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9wY2l1dGlscy14ODZfNjQvbGliLy4uLy4uLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9wY2l1dGlscy14ODZfNjQvbGliLy4uLy4uLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
L3g4Nl82NCAgLWMgLW8gYWNjZXNzLm8gYWNjZXNzLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVf
TElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3Rv
cmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9f
IC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9v
dC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2
XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9p
bmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1PMiAtV2FsbCAtVyAtV25vLXBh
cmVudGhlc2VzIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL3BjaXV0aWxzLXg4Nl82NC9s
aWIvLi4vLi4vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL3BjaXV0aWxzLXg4Nl82NC9saWIvLi4v
Li4vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vcGNpdXRpbHMteDg2XzY0L2xpYi8uLi8uLi8uLi90b29scy94ZW5zdG9yZSAgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL3BjaXV0aWxzLXg4Nl82NC9saWIvLi4vLi4vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L3BjaXV0aWxzLXg4Nl82NC9saWIvLi4vLi4vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYv
eDg2XzY0ICAtYyAtbyBnZW5lcmljLm8gZ2VuZXJpYy5jCmdlbmVyaWMuYzogSW4gZnVuY3Rpb24g
J3BjaV9nZW5lcmljX3NjYW5fYnVzJzoKZ2VuZXJpYy5jOjMyOjc6IHdhcm5pbmc6IHN1Z2dlc3Qg
cGFyZW50aGVzZXMgYXJvdW5kICcmJicgd2l0aGluICd8fCcKZ2VuZXJpYy5jOiBJbiBmdW5jdGlv
biAncGNpX2dlbmVyaWNfZmlsbF9pbmZvJzoKZ2VuZXJpYy5jOjEzNDoyNzogd2FybmluZzogdW51
c2VkIHZhcmlhYmxlICdzaXplJwpnZW5lcmljLmM6MTQ3OjMxOiB3YXJuaW5nOiB1bnVzZWQgdmFy
aWFibGUgJ3NpemUnCmdlbmVyaWMuYzoxNzk6MzU6IHdhcm5pbmc6IHVudXNlZCB2YXJpYWJsZSAn
c2l6ZScKZ2VuZXJpYy5jOjIxMjoyMzogd2FybmluZzogdW51c2VkIHZhcmlhYmxlICdzaXplJwpn
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9zdHViZG9tL2luY2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLU8yIC1XYWxsIC1XIC1Xbm8tcGFyZW50aGVzZXMgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21p
c3NpbmctcHJvdG90eXBlcyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vcGNpdXRpbHMteDg2XzY0L2xpYi8uLi8uLi8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
cGNpdXRpbHMteDg2XzY0L2xpYi8uLi8uLi8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9wY2l1dGlscy14ODZfNjQvbGliLy4uLy4u
Ly4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vcGNpdXRp
bHMteDg2XzY0L2xpYi8uLi8uLi8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4x
L3dvcmsveGVuLTQuMS4xL3N0dWJkb20vcGNpdXRpbHMteDg2XzY0L2xpYi8uLi8uLi8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgIC1jIC1vIGR1bXAubyBkdW1wLmMKZHVtcC5j
OiBJbiBmdW5jdGlvbiAnZHVtcF9pbml0JzoKZHVtcC5jOjczOjQ6IHdhcm5pbmc6IHN1Z2dlc3Qg
cGFyZW50aGVzZXMgYXJvdW5kICcmJicgd2l0aGluICd8fCcKZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4t
NC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9pbmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
MS93b3JrL3hlbi00LjEuMS9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1PMiAtV2FsbCAtVyAtV25v
LXBhcmVudGhlc2VzIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL3BjaXV0aWxzLXg4Nl82
NC9saWIvLi4vLi4vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZF
X0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL3BjaXV0aWxzLXg4Nl82NC9saWIv
Li4vLi4vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQu
MS4xL3N0dWJkb20vcGNpdXRpbHMteDg2XzY0L2xpYi8uLi8uLi8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL3BjaXV0aWxzLXg4Nl82NC9saWIvLi4vLi4v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL3BjaXV0aWxzLXg4Nl82NC9saWIvLi4vLi4vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYveDg2XzY0ICAtYyAtbyBuYW1lcy5vIG5hbWVzLmMKZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4x
LjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVf
TElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vdG9vbHMveGVuc3Rv
cmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9f
IC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vY3Jvc3Mtcm9v
dC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2
XzY0LXBjLWxpbnV4LWdudS80LjUuMi9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9p
bmNsdWRlIC1JLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93
b3JrL3hlbi00LjEuMS9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1PMiAtV2FsbCAtVyAtV25vLXBh
cmVudGhlc2VzIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL3BjaXV0aWxzLXg4Nl82NC9s
aWIvLi4vLi4vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL3BjaXV0aWxzLXg4Nl82NC9saWIvLi4v
Li4vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4x
L3N0dWJkb20vcGNpdXRpbHMteDg2XzY0L2xpYi8uLi8uLi8uLi90b29scy94ZW5zdG9yZSAgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL3BjaXV0aWxzLXg4Nl82NC9saWIvLi4vLi4vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9t
L3BjaXV0aWxzLXg4Nl82NC9saWIvLi4vLi4vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYv
eDg2XzY0ICAtYyAtbyBmaWx0ZXIubyBmaWx0ZXIuYwpnY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEu
MS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4yL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS93b3JrL3hlbi00LjEuMS9zdHViZG9tL2lu
Y2x1ZGUgLUkuLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLU8yIC1XYWxsIC1XIC1Xbm8tcGFy
ZW50aGVzZXMgLVdzdHJpY3QtcHJvdG90eXBlcyAtV21pc3NpbmctcHJvdG90eXBlcyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vcGNpdXRpbHMteDg2XzY0L2xp
Yi8uLi8uLi8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vcGNpdXRpbHMteDg2XzY0L2xpYi8uLi8u
Li8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEv
c3R1YmRvbS9wY2l1dGlscy14ODZfNjQvbGliLy4uLy4uLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20vcGNpdXRpbHMteDg2XzY0L2xpYi8uLi8uLi8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20v
cGNpdXRpbHMteDg2XzY0L2xpYi8uLi8uLi8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgIC1jIC1vIG1pbmlvcy5vIG1pbmlvcy5jCm1pbmlvcy5jOiBJbiBmdW5jdGlvbiAnbWlu
aW9zX2RldGVjdCc6Cm1pbmlvcy5jOjE1OjM0OiB3YXJuaW5nOiB1bnVzZWQgcGFyYW1ldGVyICdh
JwptaW5pb3MuYzogSW4gZnVuY3Rpb24gJ21pbmlvc19pbml0JzoKbWluaW9zLmM6MjE6MzI6IHdh
cm5pbmc6IHVudXNlZCBwYXJhbWV0ZXIgJ2EnCm1pbmlvcy5jOiBJbiBmdW5jdGlvbiAnbWluaW9z
X2NsZWFudXAnOgptaW5pb3MuYzoyNjozNTogd2FybmluZzogdW51c2VkIHBhcmFtZXRlciAnYScK
bWluaW9zLmM6IEluIGZ1bmN0aW9uICdtaW5pb3Nfc2Nhbic6Cm1pbmlvcy5jOjM0Ojg6IHdhcm5p
bmc6IG5vIHByZXZpb3VzIHByb3RvdHlwZSBmb3IgJ2Z1bmMnCm1pbmlvcy5jOjM0Ojg6IHdhcm5p
bmc6IHRyYW1wb2xpbmUgZ2VuZXJhdGVkIGZvciBuZXN0ZWQgZnVuY3Rpb24gJ2Z1bmMnCnJtIC1m
IGxpYnBjaS5hCmFyIHJjcyBsaWJwY2kuYSBhY2Nlc3MubyBnZW5lcmljLm8gZHVtcC5vIG5hbWVz
Lm8gZmlsdGVyLm8gbWluaW9zLm8KcmFubGliIGxpYnBjaS5hCnNlZCA8bGlicGNpLnBjLmluID5s
aWJwY2kucGMgLWUgJ3MsQFBSRUZJWEAsL3Vzci9sb2NhbCwnIFwKCS1lICdzLEBJTkNESVJALC91
c3IvbG9jYWwvaW5jbHVkZSwnIFwKCS1lICdzLEBMSUJESVJALC91c3IvbG9jYWwvbGliNjQsJyBc
CgktZSAncyxASURTRElSQCwvdXNyL2xvY2FsL3NoYXJlLCcgXAoJLWUgJ3MsQFZFUlNJT05ALDIu
Mi45LCcgXAoJLWUgJ3MsQExJQlpALC1seiwnCm1ha2VbMl06IExlYXZpbmcgZGlyZWN0b3J5IGAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xL3dv
cmsveGVuLTQuMS4xL3N0dWJkb20vcGNpdXRpbHMteDg2XzY0L2xpYicKbWFrZVsxXTogTGVhdmlu
ZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEvc3R1YmRvbS9wY2l1dGlscy14ODZfNjQnCm1ha2U6
IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4xL3dvcmsveGVuLTQuMS4xL3N0dWJkb20nCmVtYWtlIGZhaWxlZAog
G1szMTswMW0qG1swbSBFUlJPUjogYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4xIGZhaWxl
ZCAoY29tcGlsZSBwaGFzZSk6CiAbWzMxOzAxbSobWzBtICAgY29tcGlsZSBwdi1ncnViX3g4Nl82
NCBmYWlsZWQKIBtbMzE7MDFtKhtbMG0gCiAbWzMxOzAxbSobWzBtIENhbGwgc3RhY2s6CiAbWzMx
OzAxbSobWzBtICAgICBlYnVpbGQuc2gsIGxpbmUgIDU2OiAgQ2FsbGVkIHNyY19jb21waWxlCiAb
WzMxOzAxbSobWzBtICAgZW52aXJvbm1lbnQsIGxpbmUgMjU2OTogIENhbGxlZCBkaWUKIBtbMzE7
MDFtKhtbMG0gVGhlIHNwZWNpZmljIHNuaXBwZXQgb2YgY29kZToKIBtbMzE7MDFtKhtbMG0gICAg
ICAgICAgIGVtYWtlIFhFTl9UQVJHRVRfQVJDSD0ieDg2XzY0IiAtQyBzdHViZG9tIHB2LWdydWIg
fHwgZGllICJjb21waWxlIHB2LWdydWJfeDg2XzY0IGZhaWxlZCI7CiAbWzMxOzAxbSobWzBtIAog
G1szMTswMW0qG1swbSBJZiB5b3UgbmVlZCBzdXBwb3J0LCBwb3N0IHRoZSBvdXRwdXQgb2YgJ2Vt
ZXJnZSAtLWluZm8gPWFwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMScsCiAbWzMxOzAxbSob
WzBtIHRoZSBjb21wbGV0ZSBidWlsZCBsb2cgYW5kIHRoZSBvdXRwdXQgb2YgJ2VtZXJnZSAtcHF2
ID1hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEnLgogG1szMTswMW0qG1swbSBUaGUgY29t
cGxldGUgYnVpbGQgbG9nIGlzIGxvY2F0ZWQgYXQgJy92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvdGVtcC9idWlsZC5sb2cnLgogG1szMTswMW0q
G1swbSBUaGUgZWJ1aWxkIGVudmlyb25tZW50IGZpbGUgaXMgbG9jYXRlZCBhdCAnL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMS90ZW1wL2Vudmly
b25tZW50Jy4KIBtbMzE7MDFtKhtbMG0gUzogJy92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjEvd29yay94ZW4tNC4xLjEnCg==

--_1301e820-637c-45fc-aa29-edc763a73098_
Content-Type: text/x-log
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="buildhead.log"

G1szMjswMW0gKiAbWzM5OzQ5OzAwbVBhY2thZ2U6ICAgIGFwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMgobWzMyOzAxbSAqIBtbMzk7NDk7MDBtUmVwb3NpdG9yeTogZ2VudG9vChtbMzI7MDFt
ICogG1szOTs0OTswMG1NYWludGFpbmVyOiB4ZW5AZ2VudG9vLm9yZwobWzMyOzAxbSAqIBtbMzk7
NDk7MDBtVVNFOiAgICAgICAgYW1kNjQgY29uc29sZWtpdCBlbGliY19nbGliYyBrZXJuZWxfbGlu
dXggbXVsdGlsaWIgcG9saWN5a2l0IHVzZXJsYW5kX0dOVQobWzMyOzAxbSAqIBtbMzk7NDk7MDBt
RkVBVFVSRVM6ICAgc2FuZGJveAo+Pj4gVW5wYWNraW5nIHNvdXJjZS4uLgo+Pj4gVW5wYWNraW5n
IHhlbi00LjEuMi50YXIuZ3ogdG8gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrCj4+PiBVbnBhY2tpbmcgZ3J1Yi0wLjk3LnRhci5neiB0
byAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsKPj4+IFVucGFja2luZyB6bGliLTEuMi4zLnRhci5neiB0byAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsKPj4+IFVucGFja2lu
ZyBwY2l1dGlscy0yLjIuOS50YXIuYnoyIHRvIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yawo+Pj4gVW5wYWNraW5nIGx3aXAtMS4zLjAu
dGFyLmd6IHRvIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yawo+Pj4gVW5wYWNraW5nIG5ld2xpYi0xLjE2LjAudGFyLmd6IHRvIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yawo+
Pj4gVW5wYWNraW5nIG9jYW1sLTMuMTEgdG8gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrCnVucGFjayBvY2FtbC0zLjExOiBmaWxlIGZv
cm1hdCBub3QgcmVjb2duaXplZC4gSWdub3JpbmcuCj4+PiBTb3VyY2UgdW5wYWNrZWQgaW4gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
Cj4+PiBQcmVwYXJpbmcgc291cmNlIGluIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIgLi4uCiAbWzMyOzAxbSobWzBt
IGZpbGVzIGNvcGllZCB0byBzdHViZG9tCiAbWzMyOzAxbSobWzBtIDFzdCBNYWtlZmlsZSBhZGp1
c3RlZAo+Pj4gU291cmNlIHByZXBhcmVkLgo+Pj4gQ29uZmlndXJpbmcgc291cmNlIGluIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIgLi4uCj4+PiBTb3VyY2UgY29uZmlndXJlZC4KPj4+IENvbXBpbGluZyBzb3VyY2Ug
aW4gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMiAuLi4KbWFrZSAtajggQ0M9eDg2XzY0LXBjLWxpbnV4LWdudS1nY2Mg
TEQ9eDg2XzY0LXBjLWxpbnV4LWdudS1sZCAtQyB0b29scy9pbmNsdWRlIAptYWtlOiBFbnRlcmlu
ZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZScKbWFrZSAtQyB4ZW4tZm9y
ZWlnbgpta2RpciAtcCB4ZW4vbGliZWxmCmxuIC1zZiAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3Rvb2xzL2luY2x1
ZGUvLi4vLi4veGVuL2luY2x1ZGUvcHVibGljL0NPUFlJTkcgeGVuCmxuIC1zZiAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3Rvb2xzL2luY2x1ZGUvLi4vLi4veGVuL2luY2x1ZGUvcHVibGljL3ZjcHUuaCAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3Rvb2xzL2luY2x1ZGUvLi4vLi4veGVuL2luY2x1ZGUvcHVibGljL3N5c2N0bC5oIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVkZS9wdWJsaWMva2V4ZWMu
aCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3Rvb2xzL2luY2x1ZGUvLi4vLi4veGVuL2luY2x1ZGUvcHVibGljL2Fy
Y2gtaWE2NC5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVkZS9w
dWJsaWMvbm1pLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi90b29scy9pbmNsdWRlLy4uLy4uL3hlbi9pbmNsdWRl
L3B1YmxpYy94ZW5jb21tLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi90b29scy9pbmNsdWRlLy4uLy4uL3hlbi9p
bmNsdWRlL3B1YmxpYy94ZW5vcHJvZi5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS8uLi8u
Li94ZW4vaW5jbHVkZS9wdWJsaWMvZXZlbnRfY2hhbm5lbC5oIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvdG9vbHMv
aW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVkZS9wdWJsaWMvdmVyc2lvbi5oIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
dG9vbHMvaW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVkZS9wdWJsaWMvbWVtX2V2ZW50LmggL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi90b29scy9pbmNsdWRlLy4uLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy9kb20wX29wcy5o
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVkZS9wdWJsaWMvYXJj
aC14ODZfMzIuaCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3Rvb2xzL2luY2x1ZGUvLi4vLi4veGVuL2luY2x1ZGUv
cHVibGljL3hlbi5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVk
ZS9wdWJsaWMvZmVhdHVyZXMuaCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3Rvb2xzL2luY2x1ZGUvLi4vLi4veGVu
L2luY2x1ZGUvcHVibGljL21lbW9yeS5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS8uLi8u
Li94ZW4vaW5jbHVkZS9wdWJsaWMvc2NoZWQuaCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3Rvb2xzL2luY2x1ZGUv
Li4vLi4veGVuL2luY2x1ZGUvcHVibGljL2NhbGxiYWNrLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi90b29scy9p
bmNsdWRlLy4uLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy9ncmFudF90YWJsZS5oIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvdG9vbHMvaW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVkZS9wdWJsaWMveGVuLWNvbXBhdC5oIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVkZS9wdWJsaWMvcGh5c2Rl
di5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVkZS9wdWJsaWMv
YXJjaC14ODZfNjQuaCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3Rvb2xzL2luY2x1ZGUvLi4vLi4veGVuL2luY2x1
ZGUvcHVibGljL3BsYXRmb3JtLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi90b29scy9pbmNsdWRlLy4uLy4uL3hl
bi9pbmNsdWRlL3B1YmxpYy90bWVtLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi90b29scy9pbmNsdWRlLy4uLy4u
L3hlbi9pbmNsdWRlL3B1YmxpYy9lbGZub3RlLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi90b29scy9pbmNsdWRl
Ly4uLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy90cmFjZS5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5j
bHVkZS8uLi8uLi94ZW4vaW5jbHVkZS9wdWJsaWMvZG9tY3RsLmggeGVuCmxuIC1zZiAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3Rvb2xzL2luY2x1ZGUvLi4vLi4veGVuL2luY2x1ZGUvcHVibGljL2FyY2gtaWE2NCAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3Rvb2xzL2luY2x1ZGUvLi4vLi4veGVuL2luY2x1ZGUvcHVibGljL2FyY2gt
eDg2IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVkZS9wdWJsaWMv
aHZtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVkZS9wdWJsaWMv
aW8gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi90b29scy9pbmNsdWRlLy4uLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy94
c20geGVuCmxuIC1zZiAuLi94ZW4tc3lzL0xpbnV4IHhlbi9zeXMKbG4gLXNmIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvdG9vbHMvaW5jbHVkZS8uLi8uLi94ZW4vaW5jbHVkZS94ZW4vbGliZWxmLmggL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi90b29scy9pbmNsdWRlLy4uLy4uL3hlbi9pbmNsdWRlL3hlbi9lbGZzdHJ1Y3RzLmggeGVu
L2xpYmVsZi8KbG4gLXMgLi4veGVuLWZvcmVpZ24geGVuL2ZvcmVpZ24KdG91Y2ggeGVuLy5kaXIK
bWFrZVsxXTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3Rvb2xzL2luY2x1ZGUv
eGVuLWZvcmVpZ24nCnB5dGhvbiBta2hlYWRlci5weSB4ODZfMzIgeDg2XzMyLmggL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi90b29scy9pbmNsdWRlL3hlbi1mb3JlaWduLy4uLy4uLy4uL3hlbi9pbmNsdWRlL3B1Ymxp
Yy9hcmNoLXg4Ni94ZW4teDg2XzMyLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi90b29scy9pbmNsdWRlL3hlbi1m
b3JlaWduLy4uLy4uLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy9hcmNoLXg4Ni94ZW4uaCAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3Rvb2xzL2luY2x1ZGUveGVuLWZvcmVpZ24vLi4vLi4vLi4veGVuL2luY2x1ZGUvcHVi
bGljL3hlbi5oCnB5dGhvbiBta2hlYWRlci5weSB4ODZfNjQgeDg2XzY0LmggL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi90b29scy9pbmNsdWRlL3hlbi1mb3JlaWduLy4uLy4uLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy9h
cmNoLXg4Ni94ZW4teDg2XzY0LmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi90b29scy9pbmNsdWRlL3hlbi1mb3Jl
aWduLy4uLy4uLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy9hcmNoLXg4Ni94ZW4uaCAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3Rvb2xzL2luY2x1ZGUveGVuLWZvcmVpZ24vLi4vLi4vLi4veGVuL2luY2x1ZGUvcHVibGlj
L3hlbi5oCnB5dGhvbiBta2hlYWRlci5weSBpYTY0IGlhNjQuaCAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3Rvb2xz
L2luY2x1ZGUveGVuLWZvcmVpZ24vLi4vLi4vLi4veGVuL2luY2x1ZGUvcHVibGljL2FyY2gtaWE2
NC5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS94ZW4tZm9yZWlnbi8uLi8uLi8uLi94ZW4v
aW5jbHVkZS9wdWJsaWMveGVuLmgKcHl0aG9uIG1rY2hlY2tlci5weSBjaGVja2VyLmMgeDg2XzMy
IHg4Nl82NCBpYTY0CmdjYyAtV2FsbCAtV2Vycm9yIC1Xc3RyaWN0LXByb3RvdHlwZXMgLU8yIC1m
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50IC1vIGNoZWNrZXIgY2hlY2tlci5jCi4vY2hlY2tlciA+IHRtcC5zaXplCmRp
ZmYgLXUgcmVmZXJlbmNlLnNpemUgdG1wLnNpemUKcm0gdG1wLnNpemUKbWFrZVsxXTogTGVhdmlu
ZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZS94ZW4tZm9yZWlnbicKbWFr
ZTogTGVhdmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvdG9vbHMvaW5jbHVkZScKbWFrZSAt
ajggLWoxIENDPXg4Nl82NC1wYy1saW51eC1nbnUtZ2NjIExEPXg4Nl82NC1wYy1saW51eC1nbnUt
bGQgWEVOX1RBUkdFVF9BUkNIPXg4Nl82NCAtQyBzdHViZG9tIHB2LWdydWIgCm1ha2U6IEVudGVy
aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tJwpbIC1kIG1pbmktb3MteDg2XzY0
LWdydWIgXSB8fCBcCmZvciBpIGluICQoY2QgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zIDsgZmluZCAuIC10eXBlIGQpIDsgZG8gXAogICAgICAgICAgICAgICAgbWtkaXIg
LXAgbWluaS1vcy14ODZfNjQtZ3J1Yi8kaSA7IFwKZG9uZQp0YXIgeHpmIHpsaWItMS4yLjMudGFy
Lmd6Cm12IHpsaWItMS4yLjMgemxpYi14ODZfNjQKbWtkaXIgLXAgaW9lbXUKdG91Y2ggaW9lbXUv
bGlua2Zhcm0uc3RhbXAKbWtkaXIgLXAgaW5jbHVkZS94ZW4gJiYgXAogICAgICAgICAgbG4gLXNm
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZS9wdWJsaWMvdmNwdS5oIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZS9wdWJsaWMvc3lzY3RsLmggL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy9rZXhlYy5oIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi94ZW4vaW5jbHVkZS9wdWJsaWMvYXJjaC1pYTY0LmggL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy9ubWkuaCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUvcHVibGljL3hlbmNvbW0uaCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
eGVuL2luY2x1ZGUvcHVibGljL3hlbm9wcm9mLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hl
bi9pbmNsdWRlL3B1YmxpYy9ldmVudF9jaGFubmVsLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L3hlbi9pbmNsdWRlL3B1YmxpYy92ZXJzaW9uLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hl
bi9pbmNsdWRlL3B1YmxpYy9tZW1fZXZlbnQuaCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVu
L2luY2x1ZGUvcHVibGljL2RvbTBfb3BzLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9p
bmNsdWRlL3B1YmxpYy9hcmNoLXg4Nl8zMi5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4v
aW5jbHVkZS9wdWJsaWMveGVuLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRl
L3B1YmxpYy9mZWF0dXJlcy5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZS9w
dWJsaWMvbWVtb3J5LmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlL3B1Ymxp
Yy9zY2hlZC5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZS9wdWJsaWMvY2Fs
bGJhY2suaCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUvcHVibGljL2dyYW50
X3RhYmxlLmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy94ZW4t
Y29tcGF0LmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy9waHlz
ZGV2LmggL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy9hcmNoLXg4
Nl82NC5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZS9wdWJsaWMvcGxhdGZv
cm0uaCAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUvcHVibGljL3RtZW0uaCAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUvcHVibGljL2VsZm5vdGUuaCAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUvcHVibGljL3RyYWNlLmggL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlL3B1YmxpYy9kb21jdGwuaCBpbmNsdWRlL3hlbiAm
JiBcCiAgICAgICAgICBsbiAtc2YgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRl
L3B1YmxpYy9hcmNoLWlhNjQgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlL3B1
YmxpYy9hcmNoLXg4NiAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUvcHVibGlj
L2h2bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUvcHVibGljL2lvIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZS9wdWJsaWMveHNtIGluY2x1ZGUveGVuICYm
IFwKICAgICAgICAgICggWyAtaCBpbmNsdWRlL3hlbi9zeXMgXSB8fCBsbiAtc2YgL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3Rvb2xzL2luY2x1ZGUveGVuLXN5cy9NaW5pT1MgaW5jbHVkZS94ZW4v
c3lzICkgJiYgXAogICAgICAgICAgKCBbIC1oIGluY2x1ZGUveGVuL2xpYmVsZiBdIHx8IGxuIC1z
ZiAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMvaW5jbHVkZS94ZW4vbGliZWxmIGluY2x1
ZGUveGVuL2xpYmVsZiApICYmIFwKICBta2RpciAtcCBpbmNsdWRlL3hlbi1mb3JlaWduICYmIFwK
ICBsbiAtc2YgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL2luY2x1ZGUveGVuLWZvcmVp
Z24vcmVmZXJlbmNlLnNpemUgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL2luY2x1ZGUv
eGVuLWZvcmVpZ24vY2hlY2tlci5jIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy9pbmNs
dWRlL3hlbi1mb3JlaWduL3N0cnVjdHMucHkgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xz
L2luY2x1ZGUveGVuLWZvcmVpZ24vaWE2NC5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29s
cy9pbmNsdWRlL3hlbi1mb3JlaWduL3g4Nl8zMi5oIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy9pbmNsdWRlL3hlbi1mb3JlaWduL01ha2VmaWxlIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li90b29scy9pbmNsdWRlL3hlbi1mb3JlaWduL21rY2hlY2tlci5weSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vdG9vbHMvaW5jbHVkZS94ZW4tZm9yZWlnbi9ta2hlYWRlci5weSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vdG9vbHMvaW5jbHVkZS94ZW4tZm9yZWlnbi9jaGVja2VyIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi90b29scy9pbmNsdWRlL3hlbi1mb3JlaWduL3g4Nl82NC5oIGluY2x1
ZGUveGVuLWZvcmVpZ24vICYmIFwKICBtYWtlIERFU1RESVI9IC1DIGluY2x1ZGUveGVuLWZvcmVp
Z24vICYmIFwKICAoIFsgLWggaW5jbHVkZS94ZW4vZm9yZWlnbiBdIHx8IGxuIC1zZiAuLi94ZW4t
Zm9yZWlnbiBpbmNsdWRlL3hlbi9mb3JlaWduICkKbWFrZVsxXTogRW50ZXJpbmcgZGlyZWN0b3J5
IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZS94ZW4tZm9yZWlnbicKLi9jaGVja2VyID4g
dG1wLnNpemUKZGlmZiAtdSByZWZlcmVuY2Uuc2l6ZSB0bXAuc2l6ZQpybSB0bXAuc2l6ZQptYWtl
WzFdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUveGVu
LWZvcmVpZ24nCm1rZGlyIC1wIGxpYnhjLXg4Nl82NApbIC1oIGxpYnhjLXg4Nl82NC9NYWtlZmls
ZSBdIHx8ICggY2QgbGlieGMteDg2XzY0ICYmIFwKICBsbiAtc2YgL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3Rvb2xzL2xpYnhjLyouaCAuICYmIFwKICBsbiAtc2YgL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3Rvb2xzL2xpYnhjLyouYyAuICYmIFwKICBsbiAtc2YgL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3Rvb2xzL2xpYnhjL01ha2VmaWxlIC4gKQpta2RpciAtcCBsaWJ4Yy14ODZfNjQveDg2
XzY0ClsgLWggbGlieGMteDg2XzY0L3g4Nl82NCBdIHx8ICggY2QgbGlieGMteDg2XzY0L3g4Nl82
NCAmJiBcCiAgbG4gLXNmIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy9saWJ4Yy94ODZf
NjQvKi5jIC4gJiYgXAogIGxuIC1zZiAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMvbGli
eGMveDg2XzY0LyouaCAuICYmIFwKICBsbiAtc2YgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rv
b2xzL2xpYnhjL3g4Nl82NC9NYWtlZmlsZSAuICkKbWFrZSBERVNURElSPSAtQyAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MgbGlua3MKbWFrZVsxXTogRW50ZXJpbmcgZGly
ZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL2V4dHJhcy9taW5pLW9zJwpbIC1lIGluY2x1ZGUveGVuIF0g
fHwgbG4gLXNmIC4uLy4uLy4uL3hlbi9pbmNsdWRlL3B1YmxpYyBpbmNsdWRlL3hlbgpbIC1lIGlu
Y2x1ZGUvbWluaS1vcyBdIHx8IGxuIC1zZiAuIGluY2x1ZGUvbWluaS1vcwpbIC1lIGluY2x1ZGUv
eDg2L21pbmktb3MgXSB8fCBsbiAtc2YgLiBpbmNsdWRlL3g4Ni9taW5pLW9zCm1ha2VbMV06IExl
YXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL2V4dHJhcy9taW5pLW9zJwp0b3VjaCBtay1o
ZWFkZXJzLXg4Nl82NAp0YXIgeHpmIG5ld2xpYi0xLjE2LjAudGFyLmd6CnBhdGNoIC1kIG5ld2xp
Yi0xLjE2LjAgLXAwIDwgbmV3bGliLnBhdGNoCnBhdGNoaW5nIGZpbGUgbmV3bGliL2xpYmMvaW5j
bHVkZS9pbnR0eXBlcy5oCnBhdGNoaW5nIGZpbGUgbmV3bGliL2xpYmMvaW5jbHVkZS9zdGRpbnQu
aApwYXRjaGluZyBmaWxlIG5ld2xpYi9saWJjL2luY2x1ZGUvbWFjaGluZS9zZXRqbXAuaApwYXRj
aGluZyBmaWxlIG5ld2xpYi9saWJjL2luY2x1ZGUvc3lzL2NvbmZpZy5oCnBhdGNoaW5nIGZpbGUg
bmV3bGliL2xpYmMvcmVlbnQvZ2V0cmVlbnQuYwpwYXRjaGluZyBmaWxlIG5ld2xpYi9saWJjL21h
Y2hpbmUveDg2XzY0L21lbWNweS5TCnBhdGNoaW5nIGZpbGUgbmV3bGliL2xpYmMvbWFjaGluZS94
ODZfNjQveDg2XzY0bWFjaC5oCnBhdGNoaW5nIGZpbGUgbmV3bGliL2xpYmMvbWFjaGluZS94ODZf
NjQvbWVtY3B5LlMKcGF0Y2hpbmcgZmlsZSBuZXdsaWIvbGliYy9tYWNoaW5lL2kzODYvaTM4Nm1h
Y2guaApwYXRjaGluZyBmaWxlIG5ld2xpYi9saWJjL21hY2hpbmUveDg2XzY0L21lbXNldC5TCnBh
dGNoaW5nIGZpbGUgbmV3bGliL2xpYm0vbWFjaGluZS9pMzg2L2kzODZtYWNoLmgKcGF0Y2hpbmcg
ZmlsZSAuL25ld2xpYi9jb25maWd1cmUuaG9zdApwYXRjaGluZyBmaWxlIG5ld2xpYi9saWJjL2lu
Y2x1ZGUvc3lzL190eXBlcy5oCnBhdGNoaW5nIGZpbGUgLi9uZXdsaWIvbGliYy9pbmNsdWRlL3N5
cy9jb25maWcuaApwYXRjaGluZyBmaWxlIC4vbmV3bGliL2xpYmMvaW5jbHVkZS9zeXMvX2RlZmF1
bHRfZmNudGwuaApwYXRjaGluZyBmaWxlIC4vbmV3bGliL2xpYmMvaW5jbHVkZS9zeXMvdW5pc3Rk
LmgKcGF0Y2hpbmcgZmlsZSAuL25ld2xpYi9saWJjL2luY2x1ZGUvc3lzL3N0YXQuaApwYXRjaGlu
ZyBmaWxlIC4vbmV3bGliL2xpYmMvaW5jbHVkZS9fc3lzbGlzdC5oCnBhdGNoaW5nIGZpbGUgbmV3
bGliL2xpYmMvaW5jbHVkZS9yZWVudC5oCnBhdGNoIC1kIG5ld2xpYi0xLjE2LjAgLXAwIDwgbmV3
bGliLWNoay5wYXRjaApwYXRjaGluZyBmaWxlIG5ld2xpYi9saWJjL3N0ZGlvL2ZwcmludGZfY2hr
LmMKcGF0Y2hpbmcgZmlsZSBuZXdsaWIvbGliYy9zdGRpby9NYWtlZmlsZS5hbQpwYXRjaGluZyBm
aWxlIG5ld2xpYi9saWJjL3N0ZGlvL01ha2VmaWxlLmluCnBhdGNoaW5nIGZpbGUgbmV3bGliL2xp
YmMvc3RkaW8vc3ByaW50Zl9jaGsuYwpwYXRjaCAtZCBuZXdsaWItMS4xNi4wIC1wMSA8IG5ld2xp
Yi1zdGRpbnQtc2l6ZV9tYXgtZml4LWZyb20tMS4xNy4wLnBhdGNoCnBhdGNoaW5nIGZpbGUgbmV3
bGliL2xpYmMvaW5jbHVkZS9zdGRpbnQuaApmaW5kIG5ld2xpYi0xLjE2LjAgLXR5cGUgZiB8IHhh
cmdzIHBlcmwgLWkuYmFrIFwKCS1wZSAncy9cYl8odHpuYW1lfGRheWxpZ2h0fHRpbWV6b25lKVxi
LyQxL2cnCnRvdWNoIG5ld2xpYi0xLjE2LjAKbWtkaXIgLXAgbmV3bGliLXg4Nl82NAooIGNkIG5l
d2xpYi14ODZfNjQgJiYgXAogIENDX0ZPUl9UQVJHRVQ9Ing4Nl82NC1wYy1saW51eC1nbnUtZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIiBBUl9GT1JfVEFSR0VUPWFyIExEX0ZPUl9UQVJHRVQ9eDg2XzY0LXBj
LWxpbnV4LWdudS1sZCBMREZMQUdTPSBSQU5MSUJfRk9SX1RBUkdFVD1yYW5saWIgLi4vbmV3bGli
LTEuMTYuMC9jb25maWd1cmUgLS1wcmVmaXg9L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJv
b3QteDg2XzY0IC0tdmVyYm9zZSAtLXRhcmdldD14ODZfNjQteGVuLWVsZiAtLWVuYWJsZS1uZXds
aWItaW8tbG9uZy1sb25nIC0tZGlzYWJsZS1tdWx0aWxpYiAmJiBcCiAgbWFrZSBERVNURElSPSAm
JiBcCiAgbWFrZSBERVNURElSPSBpbnN0YWxsICkKY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUu
Li4geDg2XzY0LXVua25vd24tbGludXgtZ251CmNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4g
eDg2XzY0LXVua25vd24tbGludXgtZ251CmNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZS4uLiB4
ODZfNjQteGVuLWVsZgpjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uIC91
c3IvYmluL2luc3RhbGwgLWMKY2hlY2tpbmcgd2hldGhlciBsbiB3b3Jrcy4uLiB5ZXMKY2hlY2tp
bmcgd2hldGhlciBsbiAtcyB3b3Jrcy4uLiB5ZXMKY2hlY2tpbmcgZm9yIGdjYy4uLiB4ODZfNjQt
cGMtbGludXgtZ251LWdjYwpjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBm
aWxlIG5hbWUuLi4gYS5vdXQKY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4u
LiB5ZXMKY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uIG5vCmNoZWNr
aW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gCmNoZWNraW5nIGZvciBzdWZmaXggb2Yg
b2JqZWN0IGZpbGVzLi4uIG8KY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBD
IGNvbXBpbGVyLi4uIHllcwpjaGVja2luZyB3aGV0aGVyIHg4Nl82NC1wYy1saW51eC1nbnUtZ2Nj
IGFjY2VwdHMgLWcuLi4geWVzCmNoZWNraW5nIGZvciB4ODZfNjQtcGMtbGludXgtZ251LWdjYyBv
cHRpb24gdG8gYWNjZXB0IEFOU0kgQy4uLiBub25lIG5lZWRlZApjaGVja2luZyBmb3IgZysrLi4u
IGcrKwpjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlci4u
LiB5ZXMKY2hlY2tpbmcgd2hldGhlciBnKysgYWNjZXB0cyAtZy4uLiB5ZXMKY2hlY2tpbmcgZm9y
IGduYXRiaW5kLi4uIGduYXRiaW5kCmNoZWNraW5nIGZvciBnbmF0bWFrZS4uLiBnbmF0bWFrZQpj
aGVja2luZyB3aGV0aGVyIGNvbXBpbGVyIGRyaXZlciB1bmRlcnN0YW5kcyBBZGEuLi4gbm8KY2hl
Y2tpbmcgaG93IHRvIGNvbXBhcmUgYm9vdHN0cmFwcGVkIG9iamVjdHMuLi4gY21wIC0taWdub3Jl
LWluaXRpYWw9MTYgJCRmMSAkJGYyCmNvbmZ0ZXN0LmM6MTo1OiB3YXJuaW5nOiBmdW5jdGlvbiBk
ZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQpjaGVja2luZyBmb3IgYmlzb24uLi4gYmlzb24g
LXkKY2hlY2tpbmcgZm9yIGJpc29uLi4uIGJpc29uCmNoZWNraW5nIGZvciBnbTQuLi4gbm8KY2hl
Y2tpbmcgZm9yIGdudW00Li4uIG5vCmNoZWNraW5nIGZvciBtNC4uLiBtNApjaGVja2luZyBmb3Ig
ZmxleC4uLiBmbGV4CmNoZWNraW5nIGZvciBmbGV4Li4uIGZsZXgKY2hlY2tpbmcgZm9yIG1ha2Vp
bmZvLi4uIG1ha2VpbmZvCmNoZWNraW5nIGZvciBleHBlY3QuLi4gbm8KY2hlY2tpbmcgZm9yIHJ1
bnRlc3QuLi4gbm8KY2hlY2tpbmcgZm9yIGFyLi4uIGFyCmNoZWNraW5nIGZvciBhcy4uLiBhcwpj
aGVja2luZyBmb3IgZGxsdG9vbC4uLiBubwpjaGVja2luZyBmb3IgbGQuLi4gKGNhY2hlZCkgeDg2
XzY0LXBjLWxpbnV4LWdudS1sZApjaGVja2luZyBmb3IgbGlwby4uLiBubwpjaGVja2luZyBmb3Ig
bm0uLi4gbm0KY2hlY2tpbmcgZm9yIHJhbmxpYi4uLiByYW5saWIKY2hlY2tpbmcgZm9yIHN0cmlw
Li4uIHN0cmlwCmNoZWNraW5nIGZvciB3aW5kcmVzLi4uIG5vCmNoZWNraW5nIGZvciB3aW5kbWMu
Li4gbm8KY2hlY2tpbmcgZm9yIG9iamNvcHkuLi4gb2JqY29weQpjaGVja2luZyBmb3Igb2JqZHVt
cC4uLiBvYmpkdW1wCmNoZWNraW5nIGZvciBjYy4uLiAoY2FjaGVkKSB4ODZfNjQtcGMtbGludXgt
Z251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4
X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1
ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lw
djQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1B
Q0hfQUxMT1dfSFdfSU5URVJSVVBUUwpjaGVja2luZyBmb3IgZ2NjLi4uIChjYWNoZWQpIHg4Nl82
NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTCmNoZWNraW5nIGZvciB4ODZfNjQteGVu
LWVsZi1jKysuLi4gbm8KY2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4tZWxmLWcrKy4uLiBubwpjaGVj
a2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtY3h4Li4uIG5vCmNoZWNraW5nIGZvciB4ODZfNjQteGVu
LWVsZi1neHguLi4gbm8KY2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4tZWxmLWdjYy4uLiBubwpjaGVj
a2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtZ2NqLi4uIG5vCmNoZWNraW5nIGZvciB4ODZfNjQteGVu
LWVsZi1nZm9ydHJhbi4uLiBubwpjaGVja2luZyBmb3IgYXIuLi4gKGNhY2hlZCkgYXIKY2hlY2tp
bmcgZm9yIHg4Nl82NC14ZW4tZWxmLWFzLi4uIG5vCmNoZWNraW5nIGZvciB4ODZfNjQteGVuLWVs
Zi1kbGx0b29sLi4uIG5vCmNoZWNraW5nIGZvciBsZC4uLiAoY2FjaGVkKSB4ODZfNjQtcGMtbGlu
dXgtZ251LWxkCmNoZWNraW5nIGZvciB4ODZfNjQteGVuLWVsZi1saXBvLi4uIG5vCmNoZWNraW5n
IGZvciB4ODZfNjQteGVuLWVsZi1ubS4uLiBubwpjaGVja2luZyBmb3IgeDg2XzY0LXhlbi1lbGYt
b2JqZHVtcC4uLiBubwpjaGVja2luZyBmb3IgcmFubGliLi4uIChjYWNoZWQpIHJhbmxpYgpjaGVj
a2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtc3RyaXAuLi4gbm8KY2hlY2tpbmcgZm9yIHg4Nl82NC14
ZW4tZWxmLXdpbmRyZXMuLi4gbm8KY2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4tZWxmLXdpbmRtYy4u
LiBubwpjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgYXIuLi4gcHJlLWluc3RhbGxl
ZApjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgYXMuLi4gcHJlLWluc3RhbGxlZApj
aGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgY2MuLi4gcHJlLWluc3RhbGxlZApjaGVj
a2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgYysrLi4uIHByZS1pbnN0YWxsZWQKY2hlY2tp
bmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGMrKyBmb3IgbGlic3RkYysrLi4uIHByZS1pbnN0
YWxsZWQKY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGRsbHRvb2wuLi4gcHJlLWlu
c3RhbGxlZApjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgZ2NjLi4uIHByZS1pbnN0
YWxsZWQKY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IGdjai4uLiBwcmUtaW5zdGFs
bGVkCmNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBnZm9ydHJhbi4uLiBwcmUtaW5z
dGFsbGVkCmNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBsZC4uLiBwcmUtaW5zdGFs
bGVkCmNoZWNraW5nIHdoZXJlIHRvIGZpbmQgdGhlIHRhcmdldCBsaXBvLi4uIHByZS1pbnN0YWxs
ZWQKY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IG5tLi4uIHByZS1pbnN0YWxsZWQK
Y2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IG9iamR1bXAuLi4gcHJlLWluc3RhbGxl
ZApjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgcmFubGliLi4uIHByZS1pbnN0YWxs
ZWQKY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IHN0cmlwLi4uIHByZS1pbnN0YWxs
ZWQKY2hlY2tpbmcgd2hlcmUgdG8gZmluZCB0aGUgdGFyZ2V0IHdpbmRyZXMuLi4gcHJlLWluc3Rh
bGxlZApjaGVja2luZyB3aGVyZSB0byBmaW5kIHRoZSB0YXJnZXQgd2luZG1jLi4uIHByZS1pbnN0
YWxsZWQKY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0
aW9ucyBvZiBNYWtlZmlsZXMuLi4gbm8KY2hlY2tpbmcgd2hldGhlciAtZmtlZXAtaW5saW5lLWZ1
bmN0aW9ucyBpcyBzdXBwb3J0ZWQuLi4geWVzCmNvbmZpZ3VyZTogY3JlYXRpbmcgLi9jb25maWcu
c3RhdHVzCmNvbmZpZy5zdGF0dXM6IGNyZWF0aW5nIE1ha2VmaWxlCm1ha2VbMV06IEVudGVyaW5n
IGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQnCm1ha2VbMl06
IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQn
Cm1rZGlyIC1wIC0tIC4vZXRjCkNvbmZpZ3VyaW5nIGluIC4vZXRjCmNvbmZpZ3VyZTogY3JlYXRp
bmcgY2FjaGUgLi9jb25maWcuY2FjaGUKY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5z
dGFsbC4uLiAvdXNyL2Jpbi9pbnN0YWxsIC1jCnVwZGF0aW5nIGNhY2hlIC4vY29uZmlnLmNhY2hl
CmNvbmZpZ3VyZTogY3JlYXRpbmcgLi9jb25maWcuc3RhdHVzCmNvbmZpZy5zdGF0dXM6IGNyZWF0
aW5nIE1ha2VmaWxlCm1ha2VbM106IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQvZXRjJwpmb3IgZiBpbiBzdGFuZGFyZHMuaW5mbyBjb25maWd1
cmUuaW5mbzsgZG8gXAogIGlmIHRlc3QgLWYgLi4vLi4vbmV3bGliLTEuMTYuMC9ldGMvYGVjaG8g
JGYgfCBzZWQgLWUgJ3MvLmluZm8kLy50ZXhpLydgOyB0aGVuIFwKICAgIGlmIG1ha2UgIk1BS0VJ
TkZPPW1ha2VpbmZvIC0tc3BsaXQtc2l6ZT01MDAwMDAwIC0tc3BsaXQtc2l6ZT01MDAwMDAwIiAk
ZjsgdGhlbiBcCiAgICAgIHRydWU7IFwKICAgIGVsc2UgXAogICAgICBleGl0IDE7IFwKICAgIGZp
OyBcCiAgZmk7IFwKZG9uZQptYWtlWzRdOiBFbnRlcmluZyBkaXJlY3RvcnkgYC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L2V0YycKbWFrZWluZm8gLS1zcGxpdC1zaXplPTUwMDAw
MDAgLS1zcGxpdC1zaXplPTUwMDAwMDAgLS1uby1zcGxpdCAtSS4uLy4uL25ld2xpYi0xLjE2LjAv
ZXRjIC1vIHN0YW5kYXJkcy5pbmZvIC4uLy4uL25ld2xpYi0xLjE2LjAvZXRjL3N0YW5kYXJkcy50
ZXhpCm1ha2VbNF06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC9ldGMnCm1ha2VbNF06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQvZXRjJwpybSAtZiBjb25maWdkZXYudHh0IGNvbmZpZ2J1
aWxkLnR4dApjcCAuLi8uLi9uZXdsaWItMS4xNi4wL2V0Yy9jb25maWdkZXYudGluIGNvbmZpZ2Rl
di50eHQKY3AgLi4vLi4vbmV3bGliLTEuMTYuMC9ldGMvY29uZmlnYnVpbGQudGluIGNvbmZpZ2J1
aWxkLnR4dAptYWtlaW5mbyAtLXNwbGl0LXNpemU9NTAwMDAwMCAtLXNwbGl0LXNpemU9NTAwMDAw
MCAtSS4uLy4uL25ld2xpYi0xLjE2LjAvZXRjIC1vIGNvbmZpZ3VyZS5pbmZvIC4uLy4uL25ld2xp
Yi0xLjE2LjAvZXRjL2NvbmZpZ3VyZS50ZXhpCnJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVp
bGQudHh0Cm1ha2VbNF06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC9ldGMnCm1ha2VbM106IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC9ldGMnCkNoZWNraW5nIG11bHRpbGliIGNvbmZpZ3Vy
YXRpb24gZm9yIG5ld2xpYi4uLgpta2RpciAtcCAtLSB4ODZfNjQteGVuLWVsZi9uZXdsaWIKQ29u
ZmlndXJpbmcgaW4geDg2XzY0LXhlbi1lbGYvbmV3bGliCmNvbmZpZ3VyZTogY3JlYXRpbmcgY2Fj
aGUgLi9jb25maWcuY2FjaGUKY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4geDg2XzY0LXVu
a25vd24tbGludXgtZ251CmNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4g
L3Vzci9iaW4vaW5zdGFsbCAtYwpjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlz
IHNhbmUuLi4geWVzCmNoZWNraW5nIGZvciBnYXdrLi4uIGdhd2sKY2hlY2tpbmcgd2hldGhlciBt
YWtlIHNldHMgJChNQUtFKS4uLiB5ZXMKY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNl
ZCBieSBtYWtlLi4uIEdOVQpjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uIHg4Nl82NC14ZW4t
ZWxmCmNoZWNraW5nIGZvciB4ODZfNjQteGVuLWVsZi1zdHJpcC4uLiB4ODZfNjQteGVuLWVsZi1z
dHJpcApjaGVja2luZyBmb3IgZ2NjLi4uIHg4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5J
T1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
dG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0Rf
XyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNy
L2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRl
IC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8t
c3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRF
UlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3Nz
L3g4Nl82NApjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mIHg4Nl82NC1wYy1saW51eC1nbnUt
Z2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAt
VSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAt
aXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9B
TExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL2xpYmdsb3NzL3g4Nl82NC4uLiBnY2MzCmNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5n
IEdOVSBDLi4uIHllcwpjaGVja2luZyB3aGV0aGVyIHg4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NCBhY2NlcHRzIC1nLi4uIG5vCmNoZWNraW5nIGZvciB4ODZfNjQteGVuLWVs
Zi1hcy4uLiB4ODZfNjQteGVuLWVsZi1hcwpjaGVja2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtYXIu
Li4gYXIKY2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4tZWxmLXJhbmxpYi4uLiByYW5saWIKY2hlY2tp
bmcgZm9yIHg4Nl82NC14ZW4tZWxmLXJlYWRlbGYuLi4gbm8KY2hlY2tpbmcgZm9yIHJlYWRlbGYu
Li4gcmVhZGVsZgpjb25maWd1cmU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdp
bGwgbm90IGRldGVjdCBjcm9zcy10b29scwp3aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGgg
dGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCmNvbmZpZ3VyYXRpb24gaXMgdXNl
ZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuCmNoZWNraW5nIGZv
ciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gL3Vzci9iaW4vaW5zdGFsbCAtYwpjaGVja2lu
ZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2Vm
aWxlcy4uLiBubwpjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0cnVuY2F0ZSBvdXRw
dXQuLi4gL2Jpbi9zZWQKY2hlY2tpbmcgZm9yIGdhd2suLi4gKGNhY2hlZCkgZ2F3awpjaGVja2lu
ZyBmb3IgLnByZWluaXRfYXJyYXkvLmluaXRfYXJyYXkvLmZpbmlfYXJyYXkgc3VwcG9ydC4uLiB5
ZXMKY2hlY2tpbmcgZm9yIGFycmF5IGFsaWFzaW5nIHN1cHBvcnQuLi4gbm8KY29uZmlndXJlOiB1
cGRhdGluZyBjYWNoZSAuL2NvbmZpZy5jYWNoZQpjb25maWd1cmU6IGNyZWF0aW5nIC4vY29uZmln
LnN0YXR1cwpjb25maWcuc3RhdHVzOiBjcmVhdGluZyBNYWtlZmlsZQpjb25maWcuc3RhdHVzOiBj
cmVhdGluZyBuZXdsaWIuaApjb25maWcuc3RhdHVzOiBleGVjdXRpbmcgZGVwZmlsZXMgY29tbWFu
ZHMKPT09IGNvbmZpZ3VyaW5nIGluIGxpYmMgKC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi9saWJjKQpjb25maWd1cmU6IHJ1bm5pbmcgL2Jp
bi9zaCAuLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2NvbmZpZ3VyZSAnLS1w
cmVmaXg9L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0JyAgJy0td2l0aC1u
ZXdsaWInICctLXdpdGgtY3Jvc3MtaG9zdD14ODZfNjQtdW5rbm93bi1saW51eC1nbnUnICctLXZl
cmJvc2UnICctLXRhcmdldD14ODZfNjQteGVuLWVsZicgJy0tZW5hYmxlLW5ld2xpYi1pby1sb25n
LWxvbmcnICctLWRpc2FibGUtbXVsdGlsaWInICctLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9cyxe
LHg4Nl82NC14ZW4tZWxmLSwnICctLXdpdGgtdGFyZ2V0LXN1YmRpcj14ODZfNjQteGVuLWVsZicg
Jy0tYnVpbGQ9eDg2XzY0LXVua25vd24tbGludXgtZ251JyAnLS1ob3N0PXg4Nl82NC14ZW4tZWxm
JyAnLS10YXJnZXQ9eDg2XzY0LXhlbi1lbGYnICdidWlsZF9hbGlhcz14ODZfNjQtdW5rbm93bi1s
aW51eC1nbnUnICdob3N0X2FsaWFzPXg4Nl82NC14ZW4tZWxmJyAndGFyZ2V0X2FsaWFzPXg4Nl82
NC14ZW4tZWxmJyAnQ0M9eDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFW
RV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5z
dG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3Vu
X18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1y
b290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94
ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0JyAn
Q0ZMQUdTPS1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgJyAnTERG
TEFHUz0nICdDUFBGTEFHUz0nIC0tY2FjaGUtZmlsZT0uLi8uL2NvbmZpZy5jYWNoZSAtLXNyY2Rp
cj0uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjCmNvbmZpZ3VyZTogbG9hZGlu
ZyBjYWNoZSAuLi8uL2NvbmZpZy5jYWNoZQpjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAo
Y2FjaGVkKSB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBh
dGlibGUgaW5zdGFsbC4uLiAvdXNyL2Jpbi9pbnN0YWxsIC1jCmNoZWNraW5nIHdoZXRoZXIgYnVp
bGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiB5ZXMKY2hlY2tpbmcgZm9yIGdhd2suLi4gKGNhY2hl
ZCkgZ2F3awpjaGVja2luZyB3aGV0aGVyIG1ha2Ugc2V0cyAkKE1BS0UpLi4uIChjYWNoZWQpIHll
cwpjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5IG1ha2UuLi4gR05VCmNoZWNr
aW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gKGNhY2hlZCkgeDg2XzY0LXhlbi1lbGYKY2hlY2tpbmcg
Zm9yIHg4Nl82NC14ZW4tZWxmLXN0cmlwLi4uIChjYWNoZWQpIHg4Nl82NC14ZW4tZWxmLXN0cmlw
CmNoZWNraW5nIGZvciBnY2MuLi4gKGNhY2hlZCkgeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURf
X01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJl
ZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVt
IC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hX
X0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82
NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MveDg2XzY0CmNoZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgeDg2XzY0LXBjLWxpbnV4
LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0Li4uIChjYWNoZWQpIGdjYzMKY2hlY2tpbmcgd2hldGhl
ciB3ZSBhcmUgdXNpbmcgR05VIEMuLi4gKGNhY2hlZCkgeWVzCmNoZWNraW5nIHdoZXRoZXIgeDg2
XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZf
NjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251
LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRp
b25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWlu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IGFjY2VwdHMgLWcuLi4gKGNhY2hl
ZCkgbm8KY2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4tZWxmLWFzLi4uIChjYWNoZWQpIHg4Nl82NC14
ZW4tZWxmLWFzCmNoZWNraW5nIGZvciB4ODZfNjQteGVuLWVsZi1hci4uLiAoY2FjaGVkKSBhcgpj
aGVja2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtcmFubGliLi4uIChjYWNoZWQpIHJhbmxpYgpjaGVj
a2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtcmVhZGVsZi4uLiBubwpjaGVja2luZyBmb3IgcmVhZGVs
Zi4uLiAoY2FjaGVkKSByZWFkZWxmCmNvbmZpZ3VyZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwg
QXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCndob3NlIG5hbWUgZG9lcyBub3Qg
c3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKY29uZmlndXJh
dGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4K
Y2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAvdXNyL2Jpbi9pbnN0YWxs
IC1jCmNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlv
bnMgb2YgTWFrZWZpbGVzLi4uIG5vCmNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRy
dW5jYXRlIG91dHB1dC4uLiAoY2FjaGVkKSAvYmluL3NlZApjb25maWd1cmU6IGNyZWF0aW5nIC4v
Y29uZmlnLnN0YXR1cwpjb25maWcuc3RhdHVzOiBjcmVhdGluZyBNYWtlZmlsZQpjb25maWcuc3Rh
dHVzOiBXQVJOSU5HOiAgLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9NYWtl
ZmlsZS5pbiBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZwpjb25maWcu
c3RhdHVzOiBjcmVhdGluZyBhcmd6L01ha2VmaWxlCmNvbmZpZy5zdGF0dXM6IGNyZWF0aW5nIGN0
eXBlL01ha2VmaWxlCmNvbmZpZy5zdGF0dXM6IGNyZWF0aW5nIGVycm5vL01ha2VmaWxlCmNvbmZp
Zy5zdGF0dXM6IGNyZWF0aW5nIGxvY2FsZS9NYWtlZmlsZQpjb25maWcuc3RhdHVzOiBjcmVhdGlu
ZyBtaXNjL01ha2VmaWxlCmNvbmZpZy5zdGF0dXM6IGNyZWF0aW5nIHJlZW50L01ha2VmaWxlCmNv
bmZpZy5zdGF0dXM6IGNyZWF0aW5nIHNlYXJjaC9NYWtlZmlsZQpjb25maWcuc3RhdHVzOiBjcmVh
dGluZyBzdGRpby9NYWtlZmlsZQpjb25maWcuc3RhdHVzOiBjcmVhdGluZyBzdGRpbzY0L01ha2Vm
aWxlCmNvbmZpZy5zdGF0dXM6IGNyZWF0aW5nIHN0ZGxpYi9NYWtlZmlsZQpjb25maWcuc3RhdHVz
OiBjcmVhdGluZyBzdHJpbmcvTWFrZWZpbGUKY29uZmlnLnN0YXR1czogV0FSTklORzogIC4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nL01ha2VmaWxlLmluIHNlZW1z
IHRvIGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nCmNvbmZpZy5zdGF0dXM6IGNyZWF0
aW5nIHRpbWUvTWFrZWZpbGUKY29uZmlnLnN0YXR1czogV0FSTklORzogIC4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvdGltZS9NYWtlZmlsZS5pbiBzZWVtcyB0byBpZ25vcmUg
dGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZwpjb25maWcuc3RhdHVzOiBjcmVhdGluZyBwb3NpeC9N
YWtlZmlsZQpjb25maWcuc3RhdHVzOiBjcmVhdGluZyBzaWduYWwvTWFrZWZpbGUKY29uZmlnLnN0
YXR1czogY3JlYXRpbmcgc3lzY2FsbHMvTWFrZWZpbGUKY29uZmlnLnN0YXR1czogV0FSTklORzog
IC4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3lzY2FsbHMvTWFrZWZpbGUu
aW4gc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmcKY29uZmlnLnN0YXR1
czogY3JlYXRpbmcgdW5peC9NYWtlZmlsZQpjb25maWcuc3RhdHVzOiBXQVJOSU5HOiAgLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy91bml4L01ha2VmaWxlLmluIHNlZW1zIHRv
IGlnbm9yZSB0aGUgLS1kYXRhcm9vdGRpciBzZXR0aW5nCmNvbmZpZy5zdGF0dXM6IGNyZWF0aW5n
IGljb252L01ha2VmaWxlCmNvbmZpZy5zdGF0dXM6IGNyZWF0aW5nIGljb252L2Nlcy9NYWtlZmls
ZQpjb25maWcuc3RhdHVzOiBjcmVhdGluZyBpY29udi9jY3MvTWFrZWZpbGUKY29uZmlnLnN0YXR1
czogY3JlYXRpbmcgaWNvbnYvY2NzL2JpbmFyeS9NYWtlZmlsZQpjb25maWcuc3RhdHVzOiBjcmVh
dGluZyBpY29udi9saWIvTWFrZWZpbGUKY29uZmlnLnN0YXR1czogZXhlY3V0aW5nIGRlcGZpbGVz
IGNvbW1hbmRzCj09PSBjb25maWd1cmluZyBpbiBtYWNoaW5lICgvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9tYWNoaW5lKQpjb25m
aWd1cmU6IHJ1bm5pbmcgL2Jpbi9zaCAuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL21hY2hpbmUvY29uZmlndXJlICctLXByZWZpeD0vdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQnICAnLS13aXRoLW5ld2xpYicgJy0td2l0aC1jcm9zcy1ob3N0PXg4
Nl82NC11bmtub3duLWxpbnV4LWdudScgJy0tdmVyYm9zZScgJy0tdGFyZ2V0PXg4Nl82NC14ZW4t
ZWxmJyAnLS1lbmFibGUtbmV3bGliLWlvLWxvbmctbG9uZycgJy0tZGlzYWJsZS1tdWx0aWxpYicg
Jy0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1zLF4seDg2XzY0LXhlbi1lbGYtLCcgJy0td2l0aC10
YXJnZXQtc3ViZGlyPXg4Nl82NC14ZW4tZWxmJyAnLS1idWlsZD14ODZfNjQtdW5rbm93bi1saW51
eC1nbnUnICctLWhvc3Q9eDg2XzY0LXhlbi1lbGYnICctLXRhcmdldD14ODZfNjQteGVuLWVsZicg
J2J1aWxkX2FsaWFzPXg4Nl82NC11bmtub3duLWxpbnV4LWdudScgJ2hvc3RfYWxpYXM9eDg2XzY0
LXhlbi1lbGYnICd0YXJnZXRfYWxpYXM9eDg2XzY0LXhlbi1lbGYnICdDQz14ODZfNjQtcGMtbGlu
dXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4
Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNs
dWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQnICdDRkxBR1M9LU8yIC1nIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgICAnICdMREZMQUdTPScgJ0NQUEZMQUdTPScgLS1jYWNoZS1m
aWxlPS4uLy4uLy4vY29uZmlnLmNhY2hlIC0tc3JjZGlyPS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvbWFjaGluZQpjb25maWd1cmU6IGxvYWRpbmcgY2FjaGUgLi4vLi4v
Li9jb25maWcuY2FjaGUKY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gKGNhY2hlZCkgeDg2
XzY0LXVua25vd24tbGludXgtZ251CmNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3Rh
bGwuLi4gL3Vzci9iaW4vaW5zdGFsbCAtYwpjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25t
ZW50IGlzIHNhbmUuLi4geWVzCmNoZWNraW5nIGZvciBnYXdrLi4uIChjYWNoZWQpIGdhd2sKY2hl
Y2tpbmcgd2hldGhlciBtYWtlIHNldHMgJChNQUtFKS4uLiAoY2FjaGVkKSB5ZXMKY2hlY2tpbmcg
Zm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSBtYWtlLi4uIEdOVQpjaGVja2luZyBob3N0IHN5
c3RlbSB0eXBlLi4uIChjYWNoZWQpIHg4Nl82NC14ZW4tZWxmCmNoZWNraW5nIGZvciB4ODZfNjQt
eGVuLWVsZi1zdHJpcC4uLiAoY2FjaGVkKSB4ODZfNjQteGVuLWVsZi1zdHJpcApjaGVja2luZyBm
b3IgZ2NjLi4uIChjYWNoZWQpIHg4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRT
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJu
b3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82
NApjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mIHg4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NC4uLiAoY2FjaGVkKSBnY2MzCmNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVz
aW5nIEdOVSBDLi4uIChjYWNoZWQpIHllcwpjaGVja2luZyB3aGV0aGVyIHg4Nl82NC1wYy1saW51
eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCBhY2NlcHRzIC1nLi4uIChjYWNoZWQpIG5vCmNoZWNr
aW5nIGZvciB4ODZfNjQteGVuLWVsZi1hcy4uLiAoY2FjaGVkKSB4ODZfNjQteGVuLWVsZi1hcwpj
aGVja2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtYXIuLi4gKGNhY2hlZCkgYXIKY2hlY2tpbmcgZm9y
IHg4Nl82NC14ZW4tZWxmLXJhbmxpYi4uLiAoY2FjaGVkKSByYW5saWIKY2hlY2tpbmcgZm9yIHg4
Nl82NC14ZW4tZWxmLXJlYWRlbGYuLi4gbm8KY2hlY2tpbmcgZm9yIHJlYWRlbGYuLi4gKGNhY2hl
ZCkgcmVhZGVsZgpjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uIC91c3Iv
YmluL2luc3RhbGwgLWMKY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVj
aWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMuLi4gbm8KY2hlY2tpbmcgZm9yIGEgc2VkIHRoYXQg
ZG9lcyBub3QgdHJ1bmNhdGUgb3V0cHV0Li4uIC9iaW4vc2VkCnVwZGF0aW5nIGNhY2hlIC4uLy4u
Ly4vY29uZmlnLmNhY2hlCmNvbmZpZ3VyZTogY3JlYXRpbmcgLi9jb25maWcuc3RhdHVzCmNvbmZp
Zy5zdGF0dXM6IGNyZWF0aW5nIE1ha2VmaWxlCmNvbmZpZy5zdGF0dXM6IGV4ZWN1dGluZyBkZXBm
aWxlcyBjb21tYW5kcwpjb25maWd1cmU6IGNvbmZpZ3VyaW5nIGluIHg4Nl82NApjb25maWd1cmU6
IHJ1bm5pbmcgL2Jpbi9zaCAuLi8uLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL21hY2hpbmUveDg2XzY0L2NvbmZpZ3VyZSAtLXByZWZpeD0vdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQgICctLXdpdGgtbmV3bGliJyAnLS13aXRoLWNyb3NzLWhvc3Q9
eDg2XzY0LXVua25vd24tbGludXgtZ251JyAnLS12ZXJib3NlJyAnLS10YXJnZXQ9eDg2XzY0LXhl
bi1lbGYnICctLWVuYWJsZS1uZXdsaWItaW8tbG9uZy1sb25nJyAnLS1kaXNhYmxlLW11bHRpbGli
JyAnLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPXMsXix4ODZfNjQteGVuLWVsZi0sJyAnLS13aXRo
LXRhcmdldC1zdWJkaXI9eDg2XzY0LXhlbi1lbGYnICctLWJ1aWxkPXg4Nl82NC11bmtub3duLWxp
bnV4LWdudScgJy0taG9zdD14ODZfNjQteGVuLWVsZicgJy0tdGFyZ2V0PXg4Nl82NC14ZW4tZWxm
JyAnYnVpbGRfYWxpYXM9eDg2XzY0LXVua25vd24tbGludXgtZ251JyAnaG9zdF9hbGlhcz14ODZf
NjQteGVuLWVsZicgJ3RhcmdldF9hbGlhcz14ODZfNjQteGVuLWVsZicgJ0NDPXg4Nl82NC1wYy1s
aW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9f
bGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
aW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9J
Mzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2lu
Y2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCcgJ0NGTEFHUz0tTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICcgJ0xERkxBR1M9JyAnQ1BQRkxBR1M9JyAtLWNhY2hl
LWZpbGU9Li4vLi4vLi4vLi9jb25maWcuY2FjaGUgLS1zcmNkaXI9Li4vLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9tYWNoaW5lL3g4Nl82NApjb25maWd1cmU6IGxvYWRp
bmcgY2FjaGUgLi4vLi4vLi4vLi9jb25maWcuY2FjaGUKY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5
cGUuLi4gKGNhY2hlZCkgeDg2XzY0LXVua25vd24tbGludXgtZ251CmNoZWNraW5nIGZvciBhIEJT
RC1jb21wYXRpYmxlIGluc3RhbGwuLi4gL3Vzci9iaW4vaW5zdGFsbCAtYwpjaGVja2luZyB3aGV0
aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuLi4geWVzCmNoZWNraW5nIGZvciBnYXdrLi4u
IChjYWNoZWQpIGdhd2sKY2hlY2tpbmcgd2hldGhlciBtYWtlIHNldHMgJChNQUtFKS4uLiAoY2Fj
aGVkKSB5ZXMKY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSBtYWtlLi4uIEdO
VQpjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uIChjYWNoZWQpIHg4Nl82NC14ZW4tZWxmCmNo
ZWNraW5nIGZvciB4ODZfNjQteGVuLWVsZi1zdHJpcC4uLiAoY2FjaGVkKSB4ODZfNjQteGVuLWVs
Zi1zdHJpcApjaGVja2luZyBmb3IgZ2NjLi4uIChjYWNoZWQpIHg4Nl82NC1wYy1saW51eC1nbnUt
Z2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAt
VSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAt
aXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9B
TExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL2xpYmdsb3NzL3g4Nl82NApjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mIHg4Nl82NC1w
Yy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
My9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NC4uLiAoY2FjaGVkKSBnY2MzCmNoZWNraW5n
IHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDLi4uIChjYWNoZWQpIHllcwpjaGVja2luZyB3aGV0
aGVyIHg4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGlu
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxp
bnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCBhY2NlcHRzIC1nLi4u
IChjYWNoZWQpIG5vCmNoZWNraW5nIGZvciB4ODZfNjQteGVuLWVsZi1hcy4uLiAoY2FjaGVkKSB4
ODZfNjQteGVuLWVsZi1hcwpjaGVja2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtYXIuLi4gKGNhY2hl
ZCkgYXIKY2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4tZWxmLXJhbmxpYi4uLiAoY2FjaGVkKSByYW5s
aWIKY2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4tZWxmLXJlYWRlbGYuLi4gbm8KY2hlY2tpbmcgZm9y
IHJlYWRlbGYuLi4gKGNhY2hlZCkgcmVhZGVsZgpjb25maWd1cmU6IFdBUk5JTkc6IEluIHRoZSBm
dXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwp3aG9zZSBuYW1lIGRv
ZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCmNv
bmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdu
dS5vcmcuCmNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gL3Vzci9iaW4v
aW5zdGFsbCAtYwpjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmlj
IHBvcnRpb25zIG9mIE1ha2VmaWxlcy4uLiBubwpjb25maWd1cmU6IGNyZWF0aW5nIC4vY29uZmln
LnN0YXR1cwpjb25maWcuc3RhdHVzOiBjcmVhdGluZyBNYWtlZmlsZQpjb25maWcuc3RhdHVzOiBl
eGVjdXRpbmcgZGVwZmlsZXMgY29tbWFuZHMKPT09IGNvbmZpZ3VyaW5nIGluIHN5cyAoL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMv
c3lzKQpjb25maWd1cmU6IHJ1bm5pbmcgL2Jpbi9zaCAuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N5cy9jb25maWd1cmUgJy0tcHJlZml4PS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NCcgICctLXdpdGgtbmV3bGliJyAnLS13aXRoLWNyb3NzLWhv
c3Q9eDg2XzY0LXVua25vd24tbGludXgtZ251JyAnLS12ZXJib3NlJyAnLS10YXJnZXQ9eDg2XzY0
LXhlbi1lbGYnICctLWVuYWJsZS1uZXdsaWItaW8tbG9uZy1sb25nJyAnLS1kaXNhYmxlLW11bHRp
bGliJyAnLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPXMsXix4ODZfNjQteGVuLWVsZi0sJyAnLS13
aXRoLXRhcmdldC1zdWJkaXI9eDg2XzY0LXhlbi1lbGYnICctLWJ1aWxkPXg4Nl82NC11bmtub3du
LWxpbnV4LWdudScgJy0taG9zdD14ODZfNjQteGVuLWVsZicgJy0tdGFyZ2V0PXg4Nl82NC14ZW4t
ZWxmJyAnYnVpbGRfYWxpYXM9eDg2XzY0LXVua25vd24tbGludXgtZ251JyAnaG9zdF9hbGlhcz14
ODZfNjQteGVuLWVsZicgJ3RhcmdldF9hbGlhcz14ODZfNjQteGVuLWVsZicgJ0NDPXg4Nl82NC1w
Yy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
My9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCcgJ0NGTEFHUz0tTzIgLWcgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICcgJ0xERkxBR1M9JyAnQ1BQRkxBR1M9JyAtLWNh
Y2hlLWZpbGU9Li4vLi4vLi9jb25maWcuY2FjaGUgLS1zcmNkaXI9Li4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zeXMKY29uZmlndXJlOiBsb2FkaW5nIGNhY2hlIC4uLy4u
Ly4vY29uZmlnLmNhY2hlCmNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlLi4uIChjYWNoZWQpIHg4
Nl82NC11bmtub3duLWxpbnV4LWdudQpjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0
YWxsLi4uIC91c3IvYmluL2luc3RhbGwgLWMKY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9u
bWVudCBpcyBzYW5lLi4uIHllcwpjaGVja2luZyBmb3IgZ2F3ay4uLiAoY2FjaGVkKSBnYXdrCmNo
ZWNraW5nIHdoZXRoZXIgbWFrZSBzZXRzICQoTUFLRSkuLi4gKGNhY2hlZCkgeWVzCmNoZWNraW5n
IGZvciBzdHlsZSBvZiBpbmNsdWRlIHVzZWQgYnkgbWFrZS4uLiBHTlUKY2hlY2tpbmcgaG9zdCBz
eXN0ZW0gdHlwZS4uLiAoY2FjaGVkKSB4ODZfNjQteGVuLWVsZgpjaGVja2luZyBmb3IgeDg2XzY0
LXhlbi1lbGYtc3RyaXAuLi4gKGNhY2hlZCkgeDg2XzY0LXhlbi1lbGYtc3RyaXAKY2hlY2tpbmcg
Zm9yIGdjYy4uLiAoY2FjaGVkKSB4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18g
LURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xz
L3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUg
X19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Ny
b3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIv
Z2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5v
LXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNr
LXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBU
UyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGli
bm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZf
NjQKY2hlY2tpbmcgZGVwZW5kZW5jeSBzdHlsZSBvZiB4ODZfNjQtcGMtbGludXgtZ251LWdjYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAt
RF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19G
cmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0
ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4v
aW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1df
SFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2
XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy94ODZfNjQuLi4gKGNhY2hlZCkgZ2NjMwpjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1
c2luZyBHTlUgQy4uLiAoY2FjaGVkKSB5ZXMKY2hlY2tpbmcgd2hldGhlciB4ODZfNjQtcGMtbGlu
dXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4
Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNs
dWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgYWNjZXB0cyAtZy4uLiAoY2FjaGVkKSBubwpjaGVj
a2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtYXMuLi4gKGNhY2hlZCkgeDg2XzY0LXhlbi1lbGYtYXMK
Y2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4tZWxmLWFyLi4uIChjYWNoZWQpIGFyCmNoZWNraW5nIGZv
ciB4ODZfNjQteGVuLWVsZi1yYW5saWIuLi4gKGNhY2hlZCkgcmFubGliCmNoZWNraW5nIGZvciB4
ODZfNjQteGVuLWVsZi1yZWFkZWxmLi4uIG5vCmNoZWNraW5nIGZvciByZWFkZWxmLi4uIChjYWNo
ZWQpIHJlYWRlbGYKY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAvdXNy
L2Jpbi9pbnN0YWxsIC1jCmNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3Bl
Y2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzLi4uIG5vCmNoZWNraW5nIGZvciBhIHNlZCB0aGF0
IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4uLiAoY2FjaGVkKSAvYmluL3NlZApjb25maWd1cmU6
IGNyZWF0aW5nIC4vY29uZmlnLnN0YXR1cwpjb25maWcuc3RhdHVzOiBjcmVhdGluZyBNYWtlZmls
ZQpjb25maWcuc3RhdHVzOiBleGVjdXRpbmcgZGVwZmlsZXMgY29tbWFuZHMKPT09IGNvbmZpZ3Vy
aW5nIGluIGxpYm0gKC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi9saWJtKQpjb25maWd1cmU6IHJ1bm5pbmcgL2Jpbi9zaCAuLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJtL2NvbmZpZ3VyZSAnLS1wcmVmaXg9L3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0JyAgJy0td2l0aC1uZXdsaWInICctLXdpdGgt
Y3Jvc3MtaG9zdD14ODZfNjQtdW5rbm93bi1saW51eC1nbnUnICctLXZlcmJvc2UnICctLXRhcmdl
dD14ODZfNjQteGVuLWVsZicgJy0tZW5hYmxlLW5ld2xpYi1pby1sb25nLWxvbmcnICctLWRpc2Fi
bGUtbXVsdGlsaWInICctLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9cyxeLHg4Nl82NC14ZW4tZWxm
LSwnICctLXdpdGgtdGFyZ2V0LXN1YmRpcj14ODZfNjQteGVuLWVsZicgJy0tYnVpbGQ9eDg2XzY0
LXVua25vd24tbGludXgtZ251JyAnLS1ob3N0PXg4Nl82NC14ZW4tZWxmJyAnLS10YXJnZXQ9eDg2
XzY0LXhlbi1lbGYnICdidWlsZF9hbGlhcz14ODZfNjQtdW5rbm93bi1saW51eC1nbnUnICdob3N0
X2FsaWFzPXg4Nl82NC14ZW4tZWxmJyAndGFyZ2V0X2FsaWFzPXg4Nl82NC14ZW4tZWxmJyAnQ0M9
eDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0JyAnQ0ZMQUdTPS1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgJyAnTERGTEFHUz0nICdDUFBGTEFH
Uz0nIC0tY2FjaGUtZmlsZT0uLi8uL2NvbmZpZy5jYWNoZSAtLXNyY2Rpcj0uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJtCmNvbmZpZ3VyZTogbG9hZGluZyBjYWNoZSAuLi8uL2Nv
bmZpZy5jYWNoZQpjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAoY2FjaGVkKSB4ODZfNjQt
dW5rbm93bi1saW51eC1nbnUKY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4u
LiAvdXNyL2Jpbi9pbnN0YWxsIC1jCmNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQg
aXMgc2FuZS4uLiB5ZXMKY2hlY2tpbmcgZm9yIGdhd2suLi4gKGNhY2hlZCkgZ2F3awpjaGVja2lu
ZyB3aGV0aGVyIG1ha2Ugc2V0cyAkKE1BS0UpLi4uIChjYWNoZWQpIHllcwpjaGVja2luZyBmb3Ig
c3R5bGUgb2YgaW5jbHVkZSB1c2VkIGJ5IG1ha2UuLi4gR05VCmNoZWNraW5nIGhvc3Qgc3lzdGVt
IHR5cGUuLi4gKGNhY2hlZCkgeDg2XzY0LXhlbi1lbGYKY2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4t
ZWxmLXN0cmlwLi4uIChjYWNoZWQpIHg4Nl82NC14ZW4tZWxmLXN0cmlwCmNoZWNraW5nIGZvciBn
Y2MuLi4gKGNhY2hlZCkgeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFW
RV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5z
dG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3Vu
X18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1y
b290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94
ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0CmNo
ZWNraW5nIGRlcGVuZGVuY3kgc3R5bGUgb2YgeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0Li4uIChjYWNoZWQpIGdjYzMKY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcg
R05VIEMuLi4gKGNhY2hlZCkgeWVzCmNoZWNraW5nIHdoZXRoZXIgeDg2XzY0LXBjLWxpbnV4LWdu
dS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IGFjY2VwdHMgLWcuLi4gKGNhY2hlZCkgbm8KY2hlY2tpbmcg
Zm9yIHg4Nl82NC14ZW4tZWxmLWFzLi4uIChjYWNoZWQpIHg4Nl82NC14ZW4tZWxmLWFzCmNoZWNr
aW5nIGZvciB4ODZfNjQteGVuLWVsZi1hci4uLiAoY2FjaGVkKSBhcgpjaGVja2luZyBmb3IgeDg2
XzY0LXhlbi1lbGYtcmFubGliLi4uIChjYWNoZWQpIHJhbmxpYgpjaGVja2luZyBmb3IgeDg2XzY0
LXhlbi1lbGYtcmVhZGVsZi4uLiBubwpjaGVja2luZyBmb3IgcmVhZGVsZi4uLiAoY2FjaGVkKSBy
ZWFkZWxmCmNvbmZpZ3VyZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBu
b3QgZGV0ZWN0IGNyb3NzLXRvb2xzCndob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUg
aG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKY29uZmlndXJhdGlvbiBpcyB1c2VmdWwg
dG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4KY2hlY2tpbmcgZm9yIGEg
QlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAvdXNyL2Jpbi9pbnN0YWxsIC1jCmNoZWNraW5nIHdo
ZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVz
Li4uIG5vCmNoZWNraW5nIGZvciBhIHNlZCB0aGF0IGRvZXMgbm90IHRydW5jYXRlIG91dHB1dC4u
LiAoY2FjaGVkKSAvYmluL3NlZApjb25maWd1cmU6IGNyZWF0aW5nIC4vY29uZmlnLnN0YXR1cwpj
b25maWcuc3RhdHVzOiBjcmVhdGluZyBNYWtlZmlsZQpjb25maWcuc3RhdHVzOiBjcmVhdGluZyBt
YXRoL01ha2VmaWxlCmNvbmZpZy5zdGF0dXM6IGNyZWF0aW5nIG1hdGhmcC9NYWtlZmlsZQpjb25m
aWcuc3RhdHVzOiBjcmVhdGluZyBjb21tb24vTWFrZWZpbGUKY29uZmlnLnN0YXR1czogZXhlY3V0
aW5nIGRlcGZpbGVzIGNvbW1hbmRzCj09PSBjb25maWd1cmluZyBpbiBtYWNoaW5lICgvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGlibS9t
YWNoaW5lKQpjb25maWd1cmU6IHJ1bm5pbmcgL2Jpbi9zaCAuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJtL21hY2hpbmUvY29uZmlndXJlICctLXByZWZpeD0vdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQnICAnLS13aXRoLW5ld2xpYicgJy0td2l0aC1j
cm9zcy1ob3N0PXg4Nl82NC11bmtub3duLWxpbnV4LWdudScgJy0tdmVyYm9zZScgJy0tdGFyZ2V0
PXg4Nl82NC14ZW4tZWxmJyAnLS1lbmFibGUtbmV3bGliLWlvLWxvbmctbG9uZycgJy0tZGlzYWJs
ZS1tdWx0aWxpYicgJy0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1zLF4seDg2XzY0LXhlbi1lbGYt
LCcgJy0td2l0aC10YXJnZXQtc3ViZGlyPXg4Nl82NC14ZW4tZWxmJyAnLS1idWlsZD14ODZfNjQt
dW5rbm93bi1saW51eC1nbnUnICctLWhvc3Q9eDg2XzY0LXhlbi1lbGYnICctLXRhcmdldD14ODZf
NjQteGVuLWVsZicgJ2J1aWxkX2FsaWFzPXg4Nl82NC11bmtub3duLWxpbnV4LWdudScgJ2hvc3Rf
YWxpYXM9eDg2XzY0LXhlbi1lbGYnICd0YXJnZXRfYWxpYXM9eDg2XzY0LXhlbi1lbGYnICdDQz14
ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQnICdDRkxBR1M9LU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAnICdMREZMQUdTPScgJ0NQUEZMQUdT
PScgLS1jYWNoZS1maWxlPS4uLy4uLy4vY29uZmlnLmNhY2hlIC0tc3JjZGlyPS4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYm0vbWFjaGluZQpjb25maWd1cmU6IGxvYWRpbmcg
Y2FjaGUgLi4vLi4vLi9jb25maWcuY2FjaGUKY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4g
KGNhY2hlZCkgeDg2XzY0LXVua25vd24tbGludXgtZ251CmNoZWNraW5nIGZvciBhIEJTRC1jb21w
YXRpYmxlIGluc3RhbGwuLi4gL3Vzci9iaW4vaW5zdGFsbCAtYwpjaGVja2luZyB3aGV0aGVyIGJ1
aWxkIGVudmlyb25tZW50IGlzIHNhbmUuLi4geWVzCmNoZWNraW5nIGZvciBnYXdrLi4uIChjYWNo
ZWQpIGdhd2sKY2hlY2tpbmcgd2hldGhlciBtYWtlIHNldHMgJChNQUtFKS4uLiAoY2FjaGVkKSB5
ZXMKY2hlY2tpbmcgZm9yIHN0eWxlIG9mIGluY2x1ZGUgdXNlZCBieSBtYWtlLi4uIEdOVQpjaGVj
a2luZyBob3N0IHN5c3RlbSB0eXBlLi4uIChjYWNoZWQpIHg4Nl82NC14ZW4tZWxmCmNoZWNraW5n
IGZvciB4ODZfNjQteGVuLWVsZi1zdHJpcC4uLiAoY2FjaGVkKSB4ODZfNjQteGVuLWVsZi1zdHJp
cApjaGVja2luZyBmb3IgZ2NjLi4uIChjYWNoZWQpIHg4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NApjaGVja2luZyBkZXBlbmRlbmN5IHN0eWxlIG9mIHg4Nl82NC1wYy1saW51
eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NC4uLiAoY2FjaGVkKSBnY2MzCmNoZWNraW5nIHdoZXRo
ZXIgd2UgYXJlIHVzaW5nIEdOVSBDLi4uIChjYWNoZWQpIHllcwpjaGVja2luZyB3aGV0aGVyIHg4
Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0
aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCBhY2NlcHRzIC1nLi4uIChjYWNo
ZWQpIG5vCmNoZWNraW5nIGZvciB4ODZfNjQteGVuLWVsZi1hcy4uLiAoY2FjaGVkKSB4ODZfNjQt
eGVuLWVsZi1hcwpjaGVja2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtYXIuLi4gKGNhY2hlZCkgYXIK
Y2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4tZWxmLXJhbmxpYi4uLiAoY2FjaGVkKSByYW5saWIKY2hl
Y2tpbmcgZm9yIHg4Nl82NC14ZW4tZWxmLXJlYWRlbGYuLi4gbm8KY2hlY2tpbmcgZm9yIHJlYWRl
bGYuLi4gKGNhY2hlZCkgcmVhZGVsZgpjb25maWd1cmU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUs
IEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwp3aG9zZSBuYW1lIGRvZXMgbm90
IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCmNvbmZpZ3Vy
YXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcu
CmNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwuLi4gL3Vzci9iaW4vaW5zdGFs
bCAtYwpjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRp
b25zIG9mIE1ha2VmaWxlcy4uLiBubwpjaGVja2luZyBmb3IgYSBzZWQgdGhhdCBkb2VzIG5vdCB0
cnVuY2F0ZSBvdXRwdXQuLi4gKGNhY2hlZCkgL2Jpbi9zZWQKY29uZmlndXJlOiBjcmVhdGluZyAu
L2NvbmZpZy5zdGF0dXMKY29uZmlnLnN0YXR1czogY3JlYXRpbmcgTWFrZWZpbGUKY29uZmlnLnN0
YXR1czogZXhlY3V0aW5nIGRlcGZpbGVzIGNvbW1hbmRzCj09PSBjb25maWd1cmluZyBpbiBkb2Mg
KC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi9kb2MpCmNvbmZpZ3VyZTogcnVubmluZyAvYmluL3NoIC4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2RvYy9jb25maWd1cmUgJy0tcHJlZml4PS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NCcgICctLXdpdGgtbmV3bGliJyAnLS13aXRoLWNyb3NzLWhvc3Q9eDg2
XzY0LXVua25vd24tbGludXgtZ251JyAnLS12ZXJib3NlJyAnLS10YXJnZXQ9eDg2XzY0LXhlbi1l
bGYnICctLWVuYWJsZS1uZXdsaWItaW8tbG9uZy1sb25nJyAnLS1kaXNhYmxlLW11bHRpbGliJyAn
LS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPXMsXix4ODZfNjQteGVuLWVsZi0sJyAnLS13aXRoLXRh
cmdldC1zdWJkaXI9eDg2XzY0LXhlbi1lbGYnICctLWJ1aWxkPXg4Nl82NC11bmtub3duLWxpbnV4
LWdudScgJy0taG9zdD14ODZfNjQteGVuLWVsZicgJy0tdGFyZ2V0PXg4Nl82NC14ZW4tZWxmJyAn
YnVpbGRfYWxpYXM9eDg2XzY0LXVua25vd24tbGludXgtZ251JyAnaG9zdF9hbGlhcz14ODZfNjQt
eGVuLWVsZicgJ3RhcmdldF9hbGlhcz14ODZfNjQteGVuLWVsZicgJ0NDPXg4Nl82NC1wYy1saW51
eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCcgJ0NGTEFHUz0tTzIgLWcgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgICcgJ0xERkxBR1M9JyAnQ1BQRkxBR1M9JyAtLWNhY2hlLWZp
bGU9Li4vLi9jb25maWcuY2FjaGUgLS1zcmNkaXI9Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvZG9jCmNvbmZpZ3VyZTogbG9hZGluZyBjYWNoZSAuLi8uL2NvbmZpZy5jYWNoZQpjaGVj
a2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAoY2FjaGVkKSB4ODZfNjQtdW5rbm93bi1saW51eC1n
bnUKY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAvdXNyL2Jpbi9pbnN0
YWxsIC1jCmNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZS4uLiB5ZXMK
Y2hlY2tpbmcgZm9yIGdhd2suLi4gKGNhY2hlZCkgZ2F3awpjaGVja2luZyB3aGV0aGVyIG1ha2Ug
c2V0cyAkKE1BS0UpLi4uIChjYWNoZWQpIHllcwpjaGVja2luZyBmb3Igc3R5bGUgb2YgaW5jbHVk
ZSB1c2VkIGJ5IG1ha2UuLi4gR05VCmNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gKGNhY2hl
ZCkgeDg2XzY0LXhlbi1lbGYKY2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4tZWxmLXN0cmlwLi4uIChj
YWNoZWQpIHg4Nl82NC14ZW4tZWxmLXN0cmlwCmNoZWNraW5nIGZvciBnY2MuLi4gKGNhY2hlZCkg
eDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0CmNoZWNraW5nIGRlcGVuZGVu
Y3kgc3R5bGUgb2YgeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2lu
Y2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0Li4uIChj
YWNoZWQpIGdjYzMKY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMuLi4gKGNhY2hl
ZCkgeWVzCmNoZWNraW5nIHdoZXRoZXIgeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IGFjY2VwdHMgLWcuLi4gKGNhY2hlZCkgbm8KY2hlY2tpbmcgZm9yIHg4Nl82NC14ZW4t
ZWxmLWFzLi4uIChjYWNoZWQpIHg4Nl82NC14ZW4tZWxmLWFzCmNoZWNraW5nIGZvciB4ODZfNjQt
eGVuLWVsZi1hci4uLiAoY2FjaGVkKSBhcgpjaGVja2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtcmFu
bGliLi4uIChjYWNoZWQpIHJhbmxpYgpjaGVja2luZyBmb3IgeDg2XzY0LXhlbi1lbGYtcmVhZGVs
Zi4uLiBubwpjaGVja2luZyBmb3IgcmVhZGVsZi4uLiAoY2FjaGVkKSByZWFkZWxmCmNvbmZpZ3Vy
ZTogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3Nz
LXRvb2xzCndob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAg
SWYgeW91IHRoaW5rIHRoaXMKY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ug
d3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4KY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUg
aW5zdGFsbC4uLiAvdXNyL2Jpbi9pbnN0YWxsIC1jCmNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxl
IG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzLi4uIG5vCmNoZWNraW5n
IGZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXguLi4gbm8KY29uZmlndXJlOiB1cGRh
dGluZyBjYWNoZSAuLi8uL2NvbmZpZy5jYWNoZQpjb25maWd1cmU6IGNyZWF0aW5nIC4vY29uZmln
LnN0YXR1cwpjb25maWcuc3RhdHVzOiBjcmVhdGluZyBNYWtlZmlsZQpjb25maWcuc3RhdHVzOiBl
eGVjdXRpbmcgZGVwZmlsZXMgY29tbWFuZHMKbWFrZVszXTogRW50ZXJpbmcgZGlyZWN0b3J5IGAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIn
Cm1ha2UgIkFSX0ZMQUdTPXJjIiAiQ0NfRk9SX0JVSUxEPXg4Nl82NC1wYy1saW51eC1nbnUtZ2Nj
IiAiQ0ZMQUdTPS1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIiAi
Q0NBU0ZMQUdTPSIgIkNGTEFHU19GT1JfQlVJTEQ9LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAiICJDRkxBR1NfRk9SX1RBUkdFVD0tTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICIgIklOU1RBTEw9L3Vzci9iaW4vaW5zdGFsbCAtYyIgIkxERkxBR1M9
IiAiTElCQ0ZMQUdTPS1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAg
IiAiTElCQ0ZMQUdTX0ZPUl9UQVJHRVQ9LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgICAiICJNQUtFPW1ha2UiICJNQUtFSU5GTz1tYWtlaW5mbyAtLXNwbGl0LXNpemU9
NTAwMDAwMCAtLXNwbGl0LXNpemU9NTAwMDAwMCAiICJQSUNGTEFHPSIgIlBJQ0ZMQUdfRk9SX1RB
UkdFVD0iICJTSEVMTD0vYmluL3NoIiAiRVhQRUNUPWV4cGVjdCIgIlJVTlRFU1Q9cnVudGVzdCIg
IlJVTlRFU1RGTEFHUz0iICJleGVjX3ByZWZpeD0vdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQiICJpbmZvZGlyPS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC9pbmZvIiAibGliZGlyPS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82
NC9saWIiICJwcmVmaXg9L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0IiAi
dG9vbGRpcj0vdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYiICJ0b3BfdG9vbGxpYmRpcj0vdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliIiAiQVI9YXIiICJBUz14ODZfNjQteGVuLWVsZi1hcyIg
IkNDPXg4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGlu
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxp
bnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCIgIkxEPXg4Nl82NC1w
Yy1saW51eC1nbnUtbGQiICJMSUJDRkxBR1M9LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgICAiICJOTT14ODZfNjQteGVuLWVsZi1ubSIgIlBJQ0ZMQUc9IiAiUkFOTElC
PXJhbmxpYiIgIkRFU1RESVI9IiBhbGwtcmVjdXJzaXZlCm1ha2VbNF06IEVudGVyaW5nIGRpcmVj
dG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliJwpybSAtcmYgdGFyZy1pbmNsdWRlIHN0bXAtdGFyZy1pbmNsdWRlCm1rZGlyIHRhcmct
aW5jbHVkZSB0YXJnLWluY2x1ZGUvc3lzIHRhcmctaW5jbHVkZS9tYWNoaW5lIHRhcmctaW5jbHVk
ZS9iaXRzCmNwIG5ld2xpYi5oIHRhcmctaW5jbHVkZS9uZXdsaWIuaApmb3IgaSBpbiAuLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL21hY2hpbmUveDg2XzY0L21hY2hpbmUvKi5oOyBk
byBcCiAgICBpZiBbIC1mICRpIF07IHRoZW4gXAogICAgICBjcCAkaSB0YXJnLWluY2x1ZGUvbWFj
aGluZS9gYmFzZW5hbWUgJGlgOyBcCiAgICBlbHNlIHRydWU7IGZpIDsgXAogIGRvbmUKZm9yIGkg
aW4gLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9tYWNoaW5lL3g4Nl82NC9zeXMv
Ki5oOyBkbyBcCiAgICBpZiBbIC1mICRpIF07IHRoZW4gXAogICAgICBjcCAkaSB0YXJnLWluY2x1
ZGUvc3lzL2BiYXNlbmFtZSAkaWA7IFwKICAgIGVsc2UgdHJ1ZTsgZmkgOyBcCiAgZG9uZQpmb3Ig
aSBpbiAuLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL21hY2hpbmUveDg2XzY0L2lu
Y2x1ZGUvKi5oOyBkbyBcCiAgICBpZiBbIC1mICRpIF07IHRoZW4gXAogICAgICBjcCAkaSB0YXJn
LWluY2x1ZGUvYGJhc2VuYW1lICRpYDsgXAogICAgZWxzZSB0cnVlOyBmaSA7IFwKICBkb25lCmZv
ciBpIGluIC4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3lzLy9pbmNsdWRlLyou
aDsgZG8gXAogICAgaWYgWyAtZiAkaSBdOyB0aGVuIFwKICAgICAgY3AgJGkgdGFyZy1pbmNsdWRl
L2BiYXNlbmFtZSAkaWA7IFwKICAgIGVsc2UgdHJ1ZTsgZmkgOyBcCiAgZG9uZQpmb3IgaSBpbiAu
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N5cy8vc3lzLyouaDsgZG8gXAogICAg
aWYgWyAtZiAkaSBdOyB0aGVuIFwKICAgICAgY3AgJGkgdGFyZy1pbmNsdWRlL3N5cy9gYmFzZW5h
bWUgJGlgOyBcCiAgICBlbHNlIHRydWU7IGZpIDsgXAogIGRvbmUKZm9yIGkgaW4gLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zeXMvL2JpdHMvKi5oOyBkbyBcCiAgICBpZiBbIC1m
ICRpIF07IHRoZW4gXAogICAgICBjcCAkaSB0YXJnLWluY2x1ZGUvYml0cy9gYmFzZW5hbWUgJGlg
OyBcCiAgICBlbHNlIHRydWU7IGZpIDsgXAogIGRvbmUKZm9yIGkgaW4gLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zeXMvL21hY2hpbmUvKi5oOyBkbyBcCiAgICBpZiBbIC1mICRp
IF07IHRoZW4gXAogICAgICBjcCAkaSB0YXJnLWluY2x1ZGUvbWFjaGluZS9gYmFzZW5hbWUgJGlg
OyBcCiAgICBlbHNlIHRydWU7IGZpIDsgXAogIGRvbmUKZm9yIGkgaW4gLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zeXMvL21hY2hpbmUveDg2XzY0LyouaDsgZG8gXAogICAgaWYg
WyAtZiAkaSBdOyB0aGVuIFwKICAgICAgY3AgJGkgdGFyZy1pbmNsdWRlL21hY2hpbmUvYGJhc2Vu
YW1lICRpYDsgXAogICAgZWxzZSB0cnVlOyBmaSA7IFwKICBkb25lCmZvciBpIGluIC4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3lzLy9tYWNoaW5lL3g4Nl82NC9pbmNsdWRlLyou
aDsgZG8gXAogICAgaWYgWyAtZiAkaSBdOyB0aGVuIFwKICAgICAgY3AgJGkgdGFyZy1pbmNsdWRl
L21hY2hpbmUvYGJhc2VuYW1lICRpYDsgXAogICAgZWxzZSB0cnVlOyBmaSA7IFwKICBkb25lCnRv
dWNoIHN0bXAtdGFyZy1pbmNsdWRlCnRydWUgIkFSX0ZMQUdTPXJjIiAiQ0NfRk9SX0JVSUxEPXg4
Nl82NC1wYy1saW51eC1nbnUtZ2NjIiAiQ0ZMQUdTPS1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIiAiQ0NBU0ZMQUdTPSIgIkNGTEFHU19GT1JfQlVJTEQ9LWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAiICJDRkxBR1NfRk9SX1RBUkdFVD0tTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICIgIklOU1RBTEw9L3Vzci9iaW4v
aW5zdGFsbCAtYyIgIkxERkxBR1M9IiAiTElCQ0ZMQUdTPS1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIiAiTElCQ0ZMQUdTX0ZPUl9UQVJHRVQ9LU8yIC1nIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAiICJNQUtFPW1ha2UiICJNQUtFSU5GTz1t
YWtlaW5mbyAtLXNwbGl0LXNpemU9NTAwMDAwMCAtLXNwbGl0LXNpemU9NTAwMDAwMCAgIiAiUElD
RkxBRz0iICJQSUNGTEFHX0ZPUl9UQVJHRVQ9IiAiU0hFTEw9L2Jpbi9zaCIgIkVYUEVDVD1leHBl
Y3QiICJSVU5URVNUPXJ1bnRlc3QiICJSVU5URVNURkxBR1M9IiAiZXhlY19wcmVmaXg9L3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0IiAiaW5mb2Rpcj0vdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQvaW5mbyIgImxpYmRpcj0vdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQvbGliIiAicHJlZml4PS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NCIgInRvb2xkaXI9L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmIiAidG9wX3Rvb2xsaWJkaXI9L3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYiIgIkFSPWFyIiAi
QVM9eDg2XzY0LXhlbi1lbGYtYXMiICJDQz14ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlO
SU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNE
X18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vz
ci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVk
ZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5v
LXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5U
RVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9z
cy94ODZfNjQiICJMRD14ODZfNjQtcGMtbGludXgtZ251LWxkIiAiTElCQ0ZMQUdTPS1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIiAiTk09eDg2XzY0LXhlbi1lbGYt
bm0iICJQSUNGTEFHPSIgIlJBTkxJQj1yYW5saWIiICJERVNURElSPSIgRE89YWxsIG11bHRpLWRv
ICMgbWFrZQpNYWtpbmcgYWxsIGluIGxpYmMKbWFrZVs1XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
bGliYycKTWFraW5nIGFsbCBpbiBhcmd6Cm1ha2VbNl06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xp
YmMvYXJneicKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLWR1bW15Lm8gYHRlc3QgLWYgJ2R1bW15LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvYXJnei8nYGR1bW15LmMKeDg2XzY0LXBjLWxpbnV4
LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ogLU8yIC1E
TUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWFyZ3pfYWRkLm8gYHRlc3Qg
LWYgJ2FyZ3pfYWRkLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvYXJnei8nYGFyZ3pfYWRkLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19TWVNDQUxM
X05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWFyZ3pfYWRkX3NlcC5vIGB0ZXN0IC1mICdhcmd6X2Fk
ZF9zZXAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9hcmd6LydgYXJnel9hZGRfc2VwLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05B
TUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAgIC1jIC1vIGxpYl9hLWFyZ3pfYXBwZW5kLm8gYHRlc3QgLWYgJ2FyZ3pfYXBwZW5k
LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvYXJn
ei8nYGFyZ3pfYXBwZW5kLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1E
SEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94
ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9f
c3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9z
cy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2dj
Yy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEu
MTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1m
bm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAgIC1jIC1vIGxpYl9hLWFyZ3pfY291bnQubyBgdGVzdCAtZiAnYXJnel9jb3VudC5jJyB8fCBl
Y2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ovJ2Bhcmd6
X2NvdW50LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLWFyZ3pfY3JlYXRlLm8gYHRlc3QgLWYgJ2FyZ3pfY3JlYXRlLmMnIHx8IGVjaG8gJy4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvYXJnei8nYGFyZ3pfY3JlYXRl
LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1l
eGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90
YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lP
Tj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FH
RV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAg
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9h
LWFyZ3pfY3JlYXRlX3NlcC5vIGB0ZXN0IC1mICdhcmd6X2NyZWF0ZV9zZXAuYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9hcmd6LydgYXJnel9jcmVh
dGVfc2VwLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLWFyZ3pfZGVsZXRlLm8gYHRlc3QgLWYgJ2FyZ3pfZGVsZXRlLmMnIHx8IGVjaG8gJy4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvYXJnei8nYGFyZ3pfZGVsZXRl
LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1l
eGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90
YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lP
Tj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FH
RV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAg
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9h
LWFyZ3pfZXh0cmFjdC5vIGB0ZXN0IC1mICdhcmd6X2V4dHJhY3QuYycgfHwgZWNobyAnLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9hcmd6LydgYXJnel9leHRyYWN0LmMK
eDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1c
IjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9C
VUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWFy
Z3pfaW5zZXJ0Lm8gYHRlc3QgLWYgJ2FyZ3pfaW5zZXJ0LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvYXJnei8nYGFyZ3pfaW5zZXJ0LmMKeDg2XzY0
LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQg
LVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVu
LWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQu
NS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYu
MFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBP
UlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2Fy
Z3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWFyZ3pfbmV4
dC5vIGB0ZXN0IC1mICdhcmd6X25leHQuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9hcmd6LydgYXJnel9uZXh0LmMKeDg2XzY0LXBjLWxpbnV4LWdu
dS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FH
RV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4g
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlT
U0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWFyZ3pfcmVwbGFjZS5vIGB0ZXN0
IC1mICdhcmd6X3JlcGxhY2UuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9hcmd6LydgYXJnel9yZXBsYWNlLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1n
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
eGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FM
TE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RB
Uk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9T
VFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lO
R19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWFyZ3pfc3RyaW5naWZ5Lm8gYHRlc3Qg
LWYgJ2FyZ3pfc3RyaW5naWZ5LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvYXJnei8nYGFyZ3pfc3RyaW5naWZ5LmMKeDg2XzY0LXBjLWxpbnV4LWdu
dS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FH
RV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4g
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlT
U0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWJ1Zl9maW5kc3RyLm8gYHRlc3Qg
LWYgJ2J1Zl9maW5kc3RyLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvYXJnei8nYGJ1Zl9maW5kc3RyLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVudnpfZW50cnkubyBgdGVzdCAtZiAnZW52
el9lbnRyeS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2FyZ3ovJ2BlbnZ6X2VudHJ5LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05B
TUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAgIC1jIC1vIGxpYl9hLWVudnpfZ2V0Lm8gYHRlc3QgLWYgJ2VudnpfZ2V0LmMnIHx8
IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvYXJnei8nYGVu
dnpfZ2V0LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLWVudnpfYWRkLm8gYHRlc3QgLWYgJ2VudnpfYWRkLmMnIHx8IGVjaG8gJy4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvYXJnei8nYGVudnpfYWRkLmMKeDg2XzY0
LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQg
LVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVu
LWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQu
NS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYu
MFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBP
UlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2Fy
Z3ogLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVudnpfcmVt
b3ZlLm8gYHRlc3QgLWYgJ2VudnpfcmVtb3ZlLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvYXJnei8nYGVudnpfcmVtb3ZlLmMKeDg2XzY0LXBjLWxp
bnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19s
aW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9p
bmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ogLU8y
IC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVudnpfbWVyZ2UubyBg
dGVzdCAtZiAnZW52el9tZXJnZS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2FyZ3ovJ2BlbnZ6X21lcmdlLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1n
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
eGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FM
TE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RB
Uk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9T
VFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2FyZ3ogLU8yIC1ETUlTU0lO
R19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVudnpfc3RyaXAubyBgdGVzdCAtZiAn
ZW52el9zdHJpcC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2FyZ3ovJ2BlbnZ6X3N0cmlwLmMKcm0gLWYgbGliLmEKYXIgY3J1IGxpYi5hIGxpYl9h
LWR1bW15Lm8gbGliX2EtYXJnel9hZGQubyBsaWJfYS1hcmd6X2FkZF9zZXAubyBsaWJfYS1hcmd6
X2FwcGVuZC5vIGxpYl9hLWFyZ3pfY291bnQubyBsaWJfYS1hcmd6X2NyZWF0ZS5vIGxpYl9hLWFy
Z3pfY3JlYXRlX3NlcC5vIGxpYl9hLWFyZ3pfZGVsZXRlLm8gbGliX2EtYXJnel9leHRyYWN0Lm8g
bGliX2EtYXJnel9pbnNlcnQubyBsaWJfYS1hcmd6X25leHQubyBsaWJfYS1hcmd6X3JlcGxhY2Uu
byBsaWJfYS1hcmd6X3N0cmluZ2lmeS5vIGxpYl9hLWJ1Zl9maW5kc3RyLm8gbGliX2EtZW52el9l
bnRyeS5vIGxpYl9hLWVudnpfZ2V0Lm8gbGliX2EtZW52el9hZGQubyBsaWJfYS1lbnZ6X3JlbW92
ZS5vIGxpYl9hLWVudnpfbWVyZ2UubyBsaWJfYS1lbnZ6X3N0cmlwLm8gCnJhbmxpYiBsaWIuYQpt
YWtlWzZdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvYXJneicKTWFraW5nIGFsbCBpbiBzdGRs
aWIKbWFrZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9zdGRsaWInCk1ha2VmaWxlOjEz
ODU6IHdhcm5pbmc6IG92ZXJyaWRpbmcgcmVjaXBlIGZvciB0YXJnZXQgYGxpYl9hLW1idG93Y19y
Lm8nCk1ha2VmaWxlOjgwNzogd2FybmluZzogaWdub3Jpbmcgb2xkIHJlY2lwZSBmb3IgdGFyZ2V0
IGBsaWJfYS1tYnRvd2Nfci5vJwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18g
LURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xz
L3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUg
X19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Ny
b3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIv
Z2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5v
LXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNr
LXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBU
UyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGli
bm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZf
NjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwg
MS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1F
UyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgICAtYyAtbyBsaWJfYS1fX2FkanVzdC5vIGB0ZXN0IC1mICdfX2FkanVzdC5jJyB8fCBl
Y2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYF9f
YWRqdXN0LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWls
dGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMg
LW8gbGliX2EtX19hdGV4aXQubyBgdGVzdCAtZiAnX19hdGV4aXQuYycgfHwgZWNobyAnLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BfX2F0ZXhpdC5jCng4
Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0
aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIx
LjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVH
UkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLV9f
Y2FsbF9hdGV4aXQubyBgdGVzdCAtZiAnX19jYWxsX2F0ZXhpdC5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYF9fY2FsbF9hdGV4aXQu
Ywp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51
eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4
Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rh
cmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9O
PVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdF
X0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAg
ICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJf
YS1fX2V4cDEwLm8gYHRlc3QgLWYgJ19fZXhwMTAuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BfX2V4cDEwLmMKeDg2XzY0LXBjLWxp
bnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19s
aW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9p
bmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAt
TzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtX190ZW5fbXUubyBg
dGVzdCAtZiAnX190ZW5fbXUuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BfX3Rlbl9tdS5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lO
R19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLV9FeGl0Lm8gYHRlc3QgLWYgJ19FeGl0
LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Rk
bGliLydgX0V4aXQuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZF
X0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0
b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5f
XyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJv
b3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4
Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
aW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1hYm9ydC5vIGB0ZXN0IC1mICdhYm9ydC5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYGFib3J0LmMKeDg2XzY0
LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQg
LVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVu
LWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQu
NS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYu
MFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBP
UlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0
ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1n
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtYWJzLm8g
YHRlc3QgLWYgJ2Ficy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL3N0ZGxpYi8nYGFicy5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5J
T1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
dG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0Rf
XyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNy
L2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRl
IC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8t
c3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRF
UlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3Nz
L3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3
bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxM
X05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWFzc2VydC5vIGB0ZXN0IC1mICdhc3NlcnQuYycgfHwg
ZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2Bh
c3NlcnQuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVk
ZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAt
Zm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdF
X05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9W
RVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQ
QUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0
aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAt
byBsaWJfYS1hdGV4aXQubyBgdGVzdCAtZiAnYXRleGl0LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgYXRleGl0LmMKeDg2XzY0LXBj
LWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUg
X19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4z
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1E
X0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
aW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwi
IC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9
XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxp
YiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtYXRvZi5vIGB0
ZXN0IC1mICdhdG9mLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RkbGliLydgYXRvZi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5J
T1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
dG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0Rf
XyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNy
L2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRl
IC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8t
c3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRF
UlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3Nz
L3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3
bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxM
X05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWF0b2ZmLm8gYHRlc3QgLWYgJ2F0b2ZmLmMnIHx8IGVj
aG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgYXRv
ZmYuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRp
bmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1s
aW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5v
LWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
L3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJT
SU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNL
QUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4g
ICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBs
aWJfYS1hdG9pLm8gYHRlc3QgLWYgJ2F0b2kuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BhdG9pLmMKeDg2XzY0LXBjLWxpbnV4LWdu
dS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FH
RV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4g
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtYXRvbC5vIGB0ZXN0IC1mICdh
dG9sLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RkbGliLydgYXRvbC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
LyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5
cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAt
RFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2
LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1m
bm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAgIC1jIC1vIGxpYl9hLWNhbGxvYy5vIGB0ZXN0IC1mICdjYWxsb2MuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BjYWxsb2MuYwp4
ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAt
TzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1k
aXYubyBgdGVzdCAtZiAnZGl2LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkbGliLydgZGl2LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURf
X01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJl
ZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVt
IC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hX
X0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82
NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9
XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZ
U0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZHRvYS5vIGB0ZXN0IC1mICdkdG9hLmMnIHx8
IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydg
ZHRvYS5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRl
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1m
bm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0Vf
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZF
UlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBB
Q0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLWR0b2FzdHViLm8gYHRlc3QgLWYgJ2R0b2FzdHViLmMnIHx8IGVjaG8gJy4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgZHRvYXN0dWIuYwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1lbnZp
cm9uLm8gYHRlc3QgLWYgJ2Vudmlyb24uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BlbnZpcm9uLmMKeDg2XzY0LXBjLWxpbnV4LWdu
dS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FH
RV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4g
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZW52bG9jay5vIGB0ZXN0IC1m
ICdlbnZsb2NrLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvc3RkbGliLydgZW52bG9jay5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5J
T1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
dG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0Rf
XyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNy
L2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRl
IC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8t
c3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRF
UlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3Nz
L3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3
bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxM
X05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVwcmludGYubyBgdGVzdCAtZiAnZXByaW50Zi5jJyB8
fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8n
YGVwcmludGYuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5j
bHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1
aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAt
YyAtbyBsaWJfYS1leGl0Lm8gYHRlc3QgLWYgJ2V4aXQuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BleGl0LmMKeDg2XzY0LXBjLWxp
bnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19s
aW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9p
bmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAt
TzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZ2R0b2EtZ2V0aGV4
Lm8gYHRlc3QgLWYgJ2dkdG9hLWdldGhleC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYGdkdG9hLWdldGhleC5jCng4Nl82NC1wYy1s
aW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9f
bGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
aW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9J
Mzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2lu
Y2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAt
RFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwi
XCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIg
LU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWdkdG9hLWhleG5h
bi5vIGB0ZXN0IC1mICdnZHRvYS1oZXhuYW4uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BnZHRvYS1oZXhuYW4uYwp4ODZfNjQtcGMt
bGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBf
X2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURf
STM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9p
bmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIg
LURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1c
IlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGli
IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1nZXRlbnYubyBg
dGVzdCAtZiAnZ2V0ZW52LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvc3RkbGliLydgZ2V0ZW52LmMKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9zdGRsaWIvZ2V0ZW52LmM6IEluIGZ1bmN0aW9uICdnZXRlbnYnOgouLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi9nZXRlbnYuYzo4OToz
OiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Rk
bGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1nZXRlbnZf
ci5vIGB0ZXN0IC1mICdnZXRlbnZfci5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYGdldGVudl9yLmMKLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvZ2V0ZW52X3IuYzogSW4gZnVuY3Rpb24gJ19n
ZXRlbnZfcic6Ci4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGli
L2dldGVudl9yLmM6MTMzOjM6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEg
cHJvdG90eXBlCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNs
dWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUg
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9y
IC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tB
R0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAt
RFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLWxhYnMubyBgdGVzdCAtZiAnbGFicy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYGxhYnMuYwp4ODZfNjQtcGMtbGlu
dXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4
Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNs
dWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQ
QUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwi
IC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1P
MiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1sZGl2Lm8gYHRlc3Qg
LWYgJ2xkaXYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRsaWIvJ2BsZGl2LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2EtbGR0b2EubyBgdGVzdCAtZiAnbGR0b2EuYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BsZHRvYS5j
Ci4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliL2xkdG9hLmM6
NzIyOjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCng4
Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0
aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIx
LjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVH
UkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLW1h
bGxvYy5vIGB0ZXN0IC1mICdtYWxsb2MuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BtYWxsb2MuYwp4ODZfNjQtcGMtbGludXgtZ251
LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1J
U1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1tYmxlbi5vIGB0ZXN0IC1mICdt
Ymxlbi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L3N0ZGxpYi8nYG1ibGVuLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1E
SEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94
ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9f
c3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9z
cy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2dj
Yy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEu
MTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMg
LWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgICAgLWMgLW8gbGliX2EtbWJsZW5fci5vIGB0ZXN0IC1mICdtYmxlbl9yLmMnIHx8IGVjaG8g
Jy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgbWJsZW5f
ci5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGlu
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxp
bnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJ
T049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tB
R0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLW1ic3Rvd2NzLm8gYHRlc3QgLWYgJ21ic3Rvd2NzLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgbWJzdG93Y3MuYwp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Rk
bGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1tYnN0b3dj
c19yLm8gYHRlc3QgLWYgJ21ic3Rvd2NzX3IuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BtYnN0b3djc19yLmMKeDg2XzY0LXBjLWxp
bnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19s
aW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9p
bmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAt
TzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtbWJ0b3djLm8gYHRl
c3QgLWYgJ21idG93Yy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL3N0ZGxpYi8nYG1idG93Yy5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNs
dWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1m
bm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19J
TlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmds
b3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwi
bmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVND
QUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAgIC1jIC1mc2hvcnQtZW51bXMgLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvbWJ0b3djX3IuYyAtbyBsaWJfYS1tYnRvd2Nfci5vCng4
Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0
aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIx
LjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVH
UkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLW1s
b2NrLm8gYHRlc3QgLWYgJ21sb2NrLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgbWxvY2suYwouLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi9tbG9jay5jOjQ3OjE6IHdhcm5pbmc6IGZ1bmN0aW9u
IGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkbGliL21sb2NrLmM6NTY6MTogd2FybmluZzogZnVuY3Rpb24gZGVj
bGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NB
TExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtbXByZWMubyBgdGVzdCAtZiAnbXByZWMuYycgfHwg
ZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2Bt
cHJlYy5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRl
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1m
bm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0Vf
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZF
UlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBB
Q0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLW1zdGF0cy5vIGB0ZXN0IC1mICdtc3RhdHMuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2Btc3RhdHMuYwp4ODZfNjQtcGMt
bGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBf
X2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURf
STM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9p
bmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIg
LURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1c
IlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGli
IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1yYW5kLm8gYHRl
c3QgLWYgJ3JhbmQuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9zdGRsaWIvJ2ByYW5kLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExf
TkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtcmFuZF9yLm8gYHRlc3QgLWYgJ3JhbmRfci5jJyB8fCBl
Y2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYHJh
bmRfci5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRl
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1m
bm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0Vf
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZF
UlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBB
Q0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLXJlYWxsb2MubyBgdGVzdCAtZiAncmVhbGxvYy5jJyB8fCBlY2hvICcuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYHJlYWxsb2MuYwp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Rk
bGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zdHJ0b2Qu
byBgdGVzdCAtZiAnc3RydG9kLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkbGliLydgc3RydG9kLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc3RydG9sLm8gYHRlc3QgLWYgJ3N0cnRv
bC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0
ZGxpYi8nYHN0cnRvbC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
LyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5
cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAt
RFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2
LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1m
bm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAgIC1jIC1vIGxpYl9hLXN0cnRvdWwubyBgdGVzdCAtZiAnc3RydG91bC5jJyB8fCBlY2hvICcu
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYHN0cnRvdWwu
Ywp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51
eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4
Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rh
cmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9O
PVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdF
X0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAg
ICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJf
YS13Y3N0b2wubyBgdGVzdCAtZiAnd2NzdG9sLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgd2NzdG9sLmMKeDg2XzY0LXBjLWxpbnV4
LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd2NzdG91bC5vIGB0ZXN0
IC1mICd3Y3N0b3VsLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RkbGliLydgd2NzdG91bC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNs
dWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1m
bm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19J
TlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmds
b3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwi
bmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVND
QUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdjc3RvbWJzLm8gYHRlc3QgLWYgJ3djc3RvbWJz
LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Rk
bGliLydgd2NzdG9tYnMuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4x
Ni4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS13Y3N0b21ic19yLm8gYHRlc3QgLWYgJ3djc3RvbWJzX3IuYycgfHwg
ZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2B3
Y3N0b21ic19yLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2lu
Y2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFD
S0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwi
IC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1i
dWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAg
LWMgLW8gbGliX2Etd2N0b21iLm8gYHRlc3QgLWYgJ3djdG9tYi5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYHdjdG9tYi5jCng4Nl82
NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
dGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdjdG9t
Yl9yLm8gYHRlc3QgLWYgJ3djdG9tYl9yLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgd2N0b21iX3IuYwp4ODZfNjQtcGMtbGludXgt
Z251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4
X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1
ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lw
djQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1B
Q0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRl
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNL
QUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1J
LiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAt
RE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1jeGFfYXRleGl0Lm8gYHRl
c3QgLWYgJ2N4YV9hdGV4aXQuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BjeGFfYXRleGl0LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1n
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
eGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FM
TE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RB
Uk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9T
VFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNT
SU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtY3hhX2ZpbmFsaXplLm8gYHRlc3Qg
LWYgJ2N4YV9maW5hbGl6ZS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0ZGxpYi8nYGN4YV9maW5hbGl6ZS5jCng4Nl82NC1wYy1saW51eC1nbnUt
Z2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAt
VSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAt
aXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9B
TExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9U
QVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0Vf
U1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1J
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlT
U0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWRyYW5kNDgubyBgdGVzdCAtZiAn
ZHJhbmQ0OC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL3N0ZGxpYi8nYGRyYW5kNDguYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9T
X18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rv
b2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18g
LVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9s
aWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAt
bW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0
YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJS
VVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
bGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94
ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xp
YlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9O
QU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAtYyAtbyBsaWJfYS1lY3Z0YnVmLm8gYHRlc3QgLWYgJ2VjdnRidWYuYycgfHwg
ZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2Bl
Y3Z0YnVmLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWls
dGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMg
LW8gbGliX2EtZWZnY3Z0Lm8gYHRlc3QgLWYgJ2VmZ2N2dC5jJyB8fCBlY2hvICcuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYGVmZ2N2dC5jCng4Nl82NC1w
Yy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
My9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBc
IiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JU
PVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRs
aWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWVyYW5kNDgu
byBgdGVzdCAtZiAnZXJhbmQ0OC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYGVyYW5kNDguYwp4ODZfNjQtcGMtbGludXgtZ251LWdj
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUg
X19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlz
eXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94
ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxM
T1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
eDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFS
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NU
UklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJ
TkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1qcmFuZDQ4Lm8gYHRlc3QgLWYgJ2py
YW5kNDguYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdGRsaWIvJ2BqcmFuZDQ4LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2EtbGNvbmc0OC5vIGB0ZXN0IC1mICdsY29uZzQ4LmMnIHx8IGVj
aG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgbGNv
bmc0OC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRl
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1m
bm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0Vf
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZF
UlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBB
Q0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLWxyYW5kNDgubyBgdGVzdCAtZiAnbHJhbmQ0OC5jJyB8fCBlY2hvICcuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYGxyYW5kNDguYwp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Rk
bGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1tcmFuZDQ4
Lm8gYHRlc3QgLWYgJ21yYW5kNDguYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BtcmFuZDQ4LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1n
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
eGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FM
TE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RB
Uk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9T
VFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNT
SU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtbXNpemUubyBgdGVzdCAtZiAnbXNp
emUuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
dGRsaWIvJ2Btc2l6ZS5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
LyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5
cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAt
RFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2
LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1m
bm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAgIC1jIC1vIGxpYl9hLW10cmltLm8gYHRlc3QgLWYgJ210cmltLmMnIHx8IGVjaG8gJy4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgbXRyaW0uYwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1ucmFu
ZDQ4Lm8gYHRlc3QgLWYgJ25yYW5kNDguYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BucmFuZDQ4LmMKeDg2XzY0LXBjLWxpbnV4LWdu
dS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FH
RV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4g
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtcmFuZDQ4Lm8gYHRlc3QgLWYg
J3JhbmQ0OC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL3N0ZGxpYi8nYHJhbmQ0OC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1Nf
XyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9v
bHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAt
VSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xp
Yi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05B
TUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAgIC1jIC1vIGxpYl9hLXNlZWQ0OC5vIGB0ZXN0IC1mICdzZWVkNDguYycgfHwgZWNo
byAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BzZWVk
NDguYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRp
bmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1s
aW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5v
LWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
L3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJT
SU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNL
QUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4g
ICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBs
aWJfYS1zcmFuZDQ4Lm8gYHRlc3QgLWYgJ3NyYW5kNDguYycgfHwgZWNobyAnLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BzcmFuZDQ4LmMKeDg2XzY0LXBj
LWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUg
X19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4z
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1E
X0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
aW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwi
IC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9
XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxp
YiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc3RydG9sbC5v
IGB0ZXN0IC1mICdzdHJ0b2xsLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkbGliLydgc3RydG9sbC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lO
R19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXN0cnRvbGxfci5vIGB0ZXN0IC1mICdz
dHJ0b2xsX3IuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRsaWIvJ2BzdHJ0b2xsX3IuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlO
SU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNE
X18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vz
ci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVk
ZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5v
LXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5U
RVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9z
cy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5l
d2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FM
TF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zdHJ0b3VsbC5vIGB0ZXN0IC1mICdzdHJ0b3VsbC5j
JyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxp
Yi8nYHN0cnRvdWxsLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFW
RV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5z
dG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3Vu
X18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1y
b290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94
ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1E
UEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYu
MFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZu
by1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
ICAgLWMgLW8gbGliX2Etc3RydG91bGxfci5vIGB0ZXN0IC1mICdzdHJ0b3VsbF9yLmMnIHx8IGVj
aG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgc3Ry
dG91bGxfci5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNs
dWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUg
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9y
IC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tB
R0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAt
RFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLXdjc3RvbGwubyBgdGVzdCAtZiAnd2NzdG9sbC5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYHdjc3RvbGwuYwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13Y3N0
b2xsX3IubyBgdGVzdCAtZiAnd2NzdG9sbF9yLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgd2NzdG9sbF9yLmMKeDg2XzY0LXBjLWxp
bnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19s
aW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9p
bmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAt
TzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd2NzdG91bGwubyBg
dGVzdCAtZiAnd2NzdG91bGwuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9zdGRsaWIvJ2B3Y3N0b3VsbC5jCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvc3RkbGliL3djc3RvdWxsLmM6IEluIGZ1bmN0aW9uICd3Y3N0b3Vs
bCc6Ci4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliL3djc3Rv
dWxsLmM6MTM2OjI6IHdhcm5pbmc6IGltcGxpY2l0IGRlY2xhcmF0aW9uIG9mIGZ1bmN0aW9uICdf
d2NzdG91bGxfcicKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2lu
Y2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFD
S0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwi
IC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1i
dWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAg
LWMgLW8gbGliX2Etd2NzdG91bGxfci5vIGB0ZXN0IC1mICd3Y3N0b3VsbF9yLmMnIHx8IGVjaG8g
Jy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgd2NzdG91
bGxfci5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRl
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1m
bm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0Vf
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZF
UlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBB
Q0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLWF0b2xsLm8gYHRlc3QgLWYgJ2F0b2xsLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgYXRvbGwuYwp4ODZfNjQtcGMtbGlu
dXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4
Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNs
dWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQ
QUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwi
IC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1P
MiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1sbGFicy5vIGB0ZXN0
IC1mICdsbGFicy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0ZGxpYi8nYGxsYWJzLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExf
TkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtbGxkaXYubyBgdGVzdCAtZiAnbGxkaXYuYycgfHwgZWNo
byAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BsbGRp
di5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGlu
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxp
bnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJ
T049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tB
R0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLWE2NGwubyBgdGVzdCAtZiAnYTY0bC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYGE2NGwuYwp4ODZfNjQtcGMtbGludXgtZ251
LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1J
U1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1idG93Yy5vIGB0ZXN0IC1mICdi
dG93Yy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L3N0ZGxpYi8nYGJ0b3djLmMKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdGRsaWIvYnRvd2MuYzogSW4gZnVuY3Rpb24gJ2J0b3djJzoKLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvYnRvd2MuYzoyMjozOiB3YXJuaW5nOiBwb2lu
dGVyIHRhcmdldHMgaW4gcGFzc2luZyBhcmd1bWVudCAzIG9mICdfbWJ0b3djX3InIGRpZmZlciBp
biBzaWduZWRuZXNzCi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUvc3RkbGliLmg6OTE6NTogbm90ZTogZXhwZWN0ZWQgJ2NvbnN0IGNoYXIgKicg
YnV0IGFyZ3VtZW50IGlzIG9mIHR5cGUgJ3Vuc2lnbmVkIGNoYXIgKicKeDg2XzY0LXBjLWxpbnV4
LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZ2V0b3B0Lm8gYHRlc3Qg
LWYgJ2dldG9wdC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0ZGxpYi8nYGdldG9wdC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5J
T1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
dG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0Rf
XyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNy
L2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRl
IC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8t
c3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRF
UlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3Nz
L3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3
bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxM
X05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWdldHN1Ym9wdC5vIGB0ZXN0IC1mICdnZXRzdWJvcHQu
YycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRs
aWIvJ2BnZXRzdWJvcHQuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4x
Ni4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS1sNjRhLm8gYHRlc3QgLWYgJ2w2NGEuYycgfHwgZWNobyAnLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BsNjRhLmMKeDg2XzY0
LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQg
LVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVu
LWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQu
NS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYu
MFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBP
UlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0
ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1n
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtbWFsaWdu
Lm8gYHRlc3QgLWYgJ21hbGlnbi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYG1hbGlnbi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lO
R19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLW1icmxlbi5vIGB0ZXN0IC1mICdtYnJs
ZW4uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
dGRsaWIvJ2BtYnJsZW4uYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4x
Ni4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS1tYnJ0b3djLm8gYHRlc3QgLWYgJ21icnRvd2MuYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BtYnJ0b3dj
LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1l
eGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90
YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lP
Tj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FH
RV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAg
ICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGli
X2EtbWJzaW5pdC5vIGB0ZXN0IC1mICdtYnNpbml0LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgbWJzaW5pdC5jCng4Nl82NC1wYy1s
aW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9f
bGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
aW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9J
Mzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2lu
Y2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAt
RFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwi
XCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIg
LU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLW1ic3J0b3djcy5v
IGB0ZXN0IC1mICdtYnNydG93Y3MuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvJ2BtYnNydG93Y3MuYwp4ODZfNjQtcGMtbGludXgtZ251
LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1J
U1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1vbl9leGl0Lm8gYHRlc3QgLWYg
J29uX2V4aXQuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRsaWIvJ2Bvbl9leGl0LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExf
TkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtdmFsbG9jLm8gYHRlc3QgLWYgJ3ZhbGxvYy5jJyB8fCBl
Y2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYHZh
bGxvYy5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRl
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1m
bm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0Vf
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZF
UlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBB
Q0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLXdjcnRvbWIubyBgdGVzdCAtZiAnd2NydG9tYi5jJyB8fCBlY2hvICcuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYHdjcnRvbWIuYwp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Rk
bGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13Y3NydG9t
YnMubyBgdGVzdCAtZiAnd2NzcnRvbWJzLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgd2NzcnRvbWJzLmMKeDg2XzY0LXBjLWxpbnV4
LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd2N0b2IubyBgdGVzdCAt
ZiAnd2N0b2IuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRsaWIvJ2B3Y3RvYi5jCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvc3RkbGliL3djdG9iLmM6IEluIGZ1bmN0aW9uICd3Y3RvYic6Ci4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliL3djdG9iLmM6MTk6Mzogd2FybmluZzog
cG9pbnRlciB0YXJnZXRzIGluIHBhc3NpbmcgYXJndW1lbnQgMiBvZiAnX3djdG9tYl9yJyBkaWZm
ZXIgaW4gc2lnbmVkbmVzcwovdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlL3N0ZGxpYi5oOjkzOjU6IG5vdGU6IGV4cGVjdGVkICdjaGFyIConIGJ1
dCBhcmd1bWVudCBpcyBvZiB0eXBlICd1bnNpZ25lZCBjaGFyIConCng4Nl82NC1wYy1saW51eC1n
bnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFD
SF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tB
R0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUku
IC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1E
TUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXB1dGVudi5vIGB0ZXN0IC1m
ICdwdXRlbnYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRsaWIvJ2BwdXRlbnYuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9T
X18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rv
b2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18g
LVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9s
aWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAt
bW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0
YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJS
VVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
bGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94
ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xp
YlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9O
QU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAtYyAtbyBsaWJfYS1wdXRlbnZfci5vIGB0ZXN0IC1mICdwdXRlbnZfci5jJyB8
fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8n
YHB1dGVudl9yLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2lu
Y2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFD
S0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwi
IC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1i
dWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAg
LWMgLW8gbGliX2Etc2V0ZW52Lm8gYHRlc3QgLWYgJ3NldGVudi5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi8nYHNldGVudi5jCng4Nl82
NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
dGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNldGVu
dl9yLm8gYHRlc3QgLWYgJ3NldGVudl9yLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliLydgc2V0ZW52X3IuYwp4ODZfNjQtcGMtbGludXgt
Z251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4
X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1
ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lw
djQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1B
Q0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRl
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNL
QUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1J
LiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAt
RE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zeXN0ZW0ubyBgdGVzdCAt
ZiAnc3lzdGVtLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvc3RkbGliLydgc3lzdGVtLmMKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9zdGRsaWIvc3lzdGVtLmM6NjQ6MTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRp
b24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRsaWIvc3lzdGVtLmM6MTIxOjE6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9u
IGlzbid0IGEgcHJvdG90eXBlCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRT
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJu
b3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82
NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAx
LjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVT
IC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAgIC1ESU5URVJOQUxfTkVXTElCIC1EREVGSU5FX0ZSRUUgLWMgLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvbWFsbG9jci5jIC1vIGxpYl9hLWZyZWVy
Lm8KeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1l
eGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90
YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lP
Tj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FH
RV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAg
ICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLURJTlRFUk5B
TF9ORVdMSUIgLURERUZJTkVfUkVBTExPQyAtYyAuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0ZGxpYi9tYWxsb2NyLmMgLW8gbGliX2EtcmVhbGxvY3Iubwp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Rk
bGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtRElOVEVSTkFMX05FV0xJQiAt
RERFRklORV9DQUxMT0MgLWMgLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdGRsaWIvbWFsbG9jci5jIC1vIGxpYl9hLWNhbGxvY3Iubwp4ODZfNjQtcGMtbGludXgtZ251
LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1J
U1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtRElOVEVSTkFMX05FV0xJQiAtRERFRklORV9DRlJF
RSAtYyAuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi9tYWxs
b2NyLmMgLW8gbGliX2EtY2ZyZWVyLm8KeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYiAtTzIgLURNSVNTSU5HX1NZU0NBTExf
TkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgICAgLURJTlRFUk5BTF9ORVdMSUIgLURERUZJTkVfTUFMTElORk8gLWMgLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvbWFsbG9jci5jIC1vIGxp
Yl9hLW1hbGxpbmZvci5vCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RkbGliL21hbGxvY3IuYzozNDEyOjEzOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBp
c24ndCBhIHByb3RvdHlwZQp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4x
Ni4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtRElOVEVSTkFMX05FV0xJQiAtRERFRklORV9NQUxMT0NfU1RBVFMgLWMgLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvbWFsbG9jci5jIC1vIGxpYl9h
LW1hbGxzdGF0c3Iubwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZF
X0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0
b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5f
XyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJv
b3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4
Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
aW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtRElOVEVSTkFMX05FV0xJQiAtRERFRklORV9NQUxMT0NfVVNBQkxFX1NJWkUgLWMgLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIvbWFsbG9jci5jIC1vIGxp
Yl9hLW1zaXplci5vCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVf
TElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3Rv
cmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9f
IC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9v
dC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2
XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9p
bmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpv
bmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVj
dG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBB
Q0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBc
IiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8t
YnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAg
IC1ESU5URVJOQUxfTkVXTElCIC1EREVGSU5FX01BTExPQyAtYyAuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi9tYWxsb2NyLmMgLW8gbGliX2EtbWFsbG9jci5v
Cng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYv
eDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2
XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4
LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhj
ZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFy
Zy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1c
Im5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049
XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0Vf
QlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAg
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1ESU5URVJOQUxf
TkVXTElCIC1EREVGSU5FX01FTUFMSUdOIC1jIC4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvc3RkbGliL21hbGxvY3IuYyAtbyBsaWJfYS1tYWxpZ25yLm8KeDg2XzY0LXBj
LWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUg
X19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4z
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1E
X0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
aW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwi
IC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9
XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxp
YiAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLURJTlRFUk5BTF9ORVdMSUIgLURE
RUZJTkVfTUFMTE9QVCAtYyAuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L3N0ZGxpYi9tYWxsb2NyLmMgLW8gbGliX2EtbWFsbG9wdHIubwp4ODZfNjQtcGMtbGludXgtZ251
LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliIC1PMiAtRE1J
U1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtRElOVEVSTkFMX05FV0xJQiAtRERFRklORV9QVkFM
TE9DIC1jIC4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkbGliL21h
bGxvY3IuYyAtbyBsaWJfYS1wdmFsbG9jci5vCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNs
dWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1m
bm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19J
TlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmds
b3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwi
bmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRsaWIgLU8yIC1ETUlTU0lOR19TWVND
QUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAgIC1ESU5URVJOQUxfTkVXTElCIC1EREVGSU5FX1ZBTExPQyAtYyAuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGxpYi9tYWxsb2NyLmMgLW8g
bGliX2EtdmFsbG9jci5vCnJtIC1mIGxpYi5hCmFyIGNydSBsaWIuYSBsaWJfYS1fX2FkanVzdC5v
IGxpYl9hLV9fYXRleGl0Lm8gbGliX2EtX19jYWxsX2F0ZXhpdC5vIGxpYl9hLV9fZXhwMTAubyBs
aWJfYS1fX3Rlbl9tdS5vIGxpYl9hLV9FeGl0Lm8gbGliX2EtYWJvcnQubyBsaWJfYS1hYnMubyBs
aWJfYS1hc3NlcnQubyBsaWJfYS1hdGV4aXQubyBsaWJfYS1hdG9mLm8gbGliX2EtYXRvZmYubyBs
aWJfYS1hdG9pLm8gbGliX2EtYXRvbC5vIGxpYl9hLWNhbGxvYy5vIGxpYl9hLWRpdi5vIGxpYl9h
LWR0b2EubyBsaWJfYS1kdG9hc3R1Yi5vIGxpYl9hLWVudmlyb24ubyBsaWJfYS1lbnZsb2NrLm8g
bGliX2EtZXByaW50Zi5vIGxpYl9hLWV4aXQubyBsaWJfYS1nZHRvYS1nZXRoZXgubyBsaWJfYS1n
ZHRvYS1oZXhuYW4ubyBsaWJfYS1nZXRlbnYubyBsaWJfYS1nZXRlbnZfci5vIGxpYl9hLWxhYnMu
byBsaWJfYS1sZGl2Lm8gbGliX2EtbGR0b2EubyBsaWJfYS1tYWxsb2MubyBsaWJfYS1tYmxlbi5v
IGxpYl9hLW1ibGVuX3IubyBsaWJfYS1tYnN0b3djcy5vIGxpYl9hLW1ic3Rvd2NzX3IubyBsaWJf
YS1tYnRvd2MubyBsaWJfYS1tYnRvd2Nfci5vIGxpYl9hLW1sb2NrLm8gbGliX2EtbXByZWMubyBs
aWJfYS1tc3RhdHMubyBsaWJfYS1yYW5kLm8gbGliX2EtcmFuZF9yLm8gbGliX2EtcmVhbGxvYy5v
IGxpYl9hLXN0cnRvZC5vIGxpYl9hLXN0cnRvbC5vIGxpYl9hLXN0cnRvdWwubyBsaWJfYS13Y3N0
b2wubyBsaWJfYS13Y3N0b3VsLm8gbGliX2Etd2NzdG9tYnMubyBsaWJfYS13Y3N0b21ic19yLm8g
bGliX2Etd2N0b21iLm8gbGliX2Etd2N0b21iX3IubyBsaWJfYS1jeGFfYXRleGl0Lm8gbGliX2Et
Y3hhX2ZpbmFsaXplLm8gbGliX2EtZHJhbmQ0OC5vIGxpYl9hLWVjdnRidWYubyBsaWJfYS1lZmdj
dnQubyBsaWJfYS1lcmFuZDQ4Lm8gbGliX2EtanJhbmQ0OC5vIGxpYl9hLWxjb25nNDgubyBsaWJf
YS1scmFuZDQ4Lm8gbGliX2EtbXJhbmQ0OC5vIGxpYl9hLW1zaXplLm8gbGliX2EtbXRyaW0ubyBs
aWJfYS1ucmFuZDQ4Lm8gbGliX2EtcmFuZDQ4Lm8gbGliX2Etc2VlZDQ4Lm8gbGliX2Etc3JhbmQ0
OC5vIGxpYl9hLXN0cnRvbGwubyBsaWJfYS1zdHJ0b2xsX3IubyBsaWJfYS1zdHJ0b3VsbC5vIGxp
Yl9hLXN0cnRvdWxsX3IubyBsaWJfYS13Y3N0b2xsLm8gbGliX2Etd2NzdG9sbF9yLm8gbGliX2Et
d2NzdG91bGwubyBsaWJfYS13Y3N0b3VsbF9yLm8gbGliX2EtYXRvbGwubyBsaWJfYS1sbGFicy5v
IGxpYl9hLWxsZGl2Lm8gbGliX2EtYTY0bC5vIGxpYl9hLWJ0b3djLm8gbGliX2EtZ2V0b3B0Lm8g
bGliX2EtZ2V0c3Vib3B0Lm8gbGliX2EtbDY0YS5vIGxpYl9hLW1hbGlnbi5vIGxpYl9hLW1icmxl
bi5vIGxpYl9hLW1icnRvd2MubyBsaWJfYS1tYnNpbml0Lm8gbGliX2EtbWJzcnRvd2NzLm8gbGli
X2Etb25fZXhpdC5vIGxpYl9hLXZhbGxvYy5vIGxpYl9hLXdjcnRvbWIubyBsaWJfYS13Y3NydG9t
YnMubyBsaWJfYS13Y3RvYi5vIGxpYl9hLXB1dGVudi5vIGxpYl9hLXB1dGVudl9yLm8gbGliX2Et
c2V0ZW52Lm8gbGliX2Etc2V0ZW52X3IubyBsaWJfYS1zeXN0ZW0ubyBsaWJfYS1mcmVlci5vIGxp
Yl9hLXJlYWxsb2NyLm8gbGliX2EtY2FsbG9jci5vIGxpYl9hLWNmcmVlci5vIGxpYl9hLW1hbGxp
bmZvci5vIGxpYl9hLW1hbGxzdGF0c3IubyBsaWJfYS1tc2l6ZXIubyBsaWJfYS1tYWxsb2NyLm8g
bGliX2EtbWFsaWduci5vIGxpYl9hLW1hbGxvcHRyLm8gbGliX2EtcHZhbGxvY3IubyBsaWJfYS12
YWxsb2NyLm8KcmFubGliIGxpYi5hCm1ha2VbNl06IExlYXZpbmcgZGlyZWN0b3J5IGAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvbGliYy9z
dGRsaWInCk1ha2luZyBhbGwgaW4gY3R5cGUKbWFrZVs2XTogRW50ZXJpbmcgZGlyZWN0b3J5IGAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
bGliYy9jdHlwZScKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2lu
Y2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFD
S0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwi
IC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2N0eXBlIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1
aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAt
YyAtbyBsaWJfYS1jdHlwZV8ubyBgdGVzdCAtZiAnY3R5cGVfLmMnIHx8IGVjaG8gJy4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2BjdHlwZV8uYwp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5
cGUgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWlzYWxudW0u
byBgdGVzdCAtZiAnaXNhbG51bS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2N0eXBlLydgaXNhbG51bS5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9jdHlwZSAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtaXNhbHBoYS5vIGB0ZXN0IC1mICdpc2Fs
cGhhLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
Y3R5cGUvJ2Bpc2FscGhhLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1E
SEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94
ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9f
c3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9z
cy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2dj
Yy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEu
MTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS1pc2NudHJsLm8gYHRlc3QgLWYgJ2lzY250cmwuYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9jdHlwZS8nYGlzY250cmwu
Ywp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51
eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4
Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rh
cmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9O
PVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdF
X0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvY3R5cGUgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAg
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9h
LWlzZGlnaXQubyBgdGVzdCAtZiAnaXNkaWdpdC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlLydgaXNkaWdpdC5jCng4Nl82NC1wYy1saW51
eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9jdHlwZSAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtaXNsb3dlci5vIGB0ZXN0
IC1mICdpc2xvd2VyLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvY3R5cGUvJ2Bpc2xvd2VyLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlIC1PMiAtRE1JU1NJTkdfU1lTQ0FM
TF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1pc3VwcGVyLm8gYHRlc3QgLWYgJ2lzdXBwZXIuYycg
fHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9jdHlwZS8n
YGlzdXBwZXIuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5j
bHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvY3R5cGUgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLWlzcHJpbnQubyBgdGVzdCAtZiAnaXNwcmludC5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlLydgaXNwcmludC5jCng4Nl82
NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9j
dHlwZSAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1n
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtaXNwdW5j
dC5vIGB0ZXN0IC1mICdpc3B1bmN0LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2Bpc3B1bmN0LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1n
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
eGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FM
TE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RB
Uk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9T
VFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlIC1PMiAtRE1JU1NJ
TkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1pc3NwYWNlLm8gYHRlc3QgLWYgJ2lz
c3BhY2UuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9jdHlwZS8nYGlzc3BhY2UuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18g
LURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xz
L3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUg
X19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Ny
b3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIv
Z2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5v
LXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNr
LXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBU
UyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGli
bm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZf
NjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwg
MS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVT
IC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAgIC1jIC1vIGxpYl9hLWlzeGRpZ2l0Lm8gYHRlc3QgLWYgJ2lzeGRpZ2l0LmMnIHx8IGVj
aG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2Bpc3hk
aWdpdC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0
ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZf
NjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBj
LWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRl
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1m
bm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0Vf
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZF
UlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBB
Q0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9jdHlwZSAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGlu
ICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8g
bGliX2EtdG9sb3dlci5vIGB0ZXN0IC1mICd0b2xvd2VyLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2B0b2xvd2VyLmMKeDg2XzY0LXBj
LWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUg
X19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4z
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1E
X0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
aW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwi
IC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9
XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBl
IC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS10b3VwcGVyLm8g
YHRlc3QgLWYgJ3RvdXBwZXIuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9jdHlwZS8nYHRvdXBwZXIuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAt
RF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19G
cmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0
ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4v
aW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1df
SFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2
XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklO
Rz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUgLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWlzYXNjaWkubyBgdGVzdCAtZiAnaXNhc2Np
aS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0
eXBlLydgaXNhc2NpaS5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
LyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5
cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAt
RFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2
LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9jdHlwZSAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZu
by1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
ICAgLWMgLW8gbGliX2EtaXNibGFuay5vIGB0ZXN0IC1mICdpc2JsYW5rLmMnIHx8IGVjaG8gJy4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2Bpc2JsYW5rLmMK
eDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1c
IjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9C
VUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2N0eXBlIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAt
TzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1p
c3dhbG51bS5vIGB0ZXN0IC1mICdpc3dhbG51bS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlLydgaXN3YWxudW0uYwp4ODZfNjQtcGMtbGlu
dXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4
Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNs
dWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQ
QUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwi
IC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUgLU8y
IC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWlzd2FscGhhLm8gYHRl
c3QgLWYgJ2lzd2FscGhhLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvY3R5cGUvJ2Bpc3dhbHBoYS5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5H
PVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9jdHlwZSAtTzIgLURNSVNTSU5HX1NZ
U0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtaXN3YmxhbmsubyBgdGVzdCAtZiAnaXN3Ymxh
bmsuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9j
dHlwZS8nYGlzd2JsYW5rLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1E
SEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94
ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9f
c3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9z
cy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2dj
Yy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEu
MTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS1pc3djbnRybC5vIGB0ZXN0IC1mICdpc3djbnRybC5jJyB8fCBlY2hv
ICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlLydgaXN3Y250
cmwuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRp
bmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1s
aW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5v
LWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
L3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJT
SU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNL
QUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvY3R5cGUgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLWlzd2N0eXBlLm8gYHRlc3QgLWYgJ2lzd2N0eXBlLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2Bpc3djdHlwZS5jCng4Nl82NC1w
Yy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
My9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBc
IiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JU
PVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9jdHlw
ZSAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtaXN3ZGlnaXQu
byBgdGVzdCAtZiAnaXN3ZGlnaXQuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9jdHlwZS8nYGlzd2RpZ2l0LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1n
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
eGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FM
TE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RB
Uk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9T
VFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlIC1PMiAtRE1JU1NJ
TkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1pc3dncmFwaC5vIGB0ZXN0IC1mICdp
c3dncmFwaC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2N0eXBlLydgaXN3Z3JhcGguYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9T
X18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rv
b2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18g
LVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9s
aWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAt
bW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0
YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJS
VVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
bGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94
ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xp
YlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05B
TUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAgIC1jIC1vIGxpYl9hLWlzd2xvd2VyLm8gYHRlc3QgLWYgJ2lzd2xvd2VyLmMnIHx8
IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2Bp
c3dsb3dlci5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNs
dWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUg
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9y
IC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tB
R0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAt
RFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9jdHlwZSAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWls
dGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMg
LW8gbGliX2EtaXN3cHJpbnQubyBgdGVzdCAtZiAnaXN3cHJpbnQuYycgfHwgZWNobyAnLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9jdHlwZS8nYGlzd3ByaW50LmMKeDg2
XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZf
NjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251
LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRp
b25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWlu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEu
MTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdS
RVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2N0eXBlIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1pc3dw
dW5jdC5vIGB0ZXN0IC1mICdpc3dwdW5jdC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlLydgaXN3cHVuY3QuYwp4ODZfNjQtcGMtbGludXgt
Z251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4
X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1
ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lw
djQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1B
Q0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRl
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNL
QUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1J
LiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUgLU8yIC1E
TUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWlzd3NwYWNlLm8gYHRlc3Qg
LWYgJ2lzd3NwYWNlLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvY3R5cGUvJ2Bpc3dzcGFjZS5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNs
dWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1m
bm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19J
TlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmds
b3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwi
bmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9jdHlwZSAtTzIgLURNSVNTSU5HX1NZU0NB
TExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtaXN3dXBwZXIubyBgdGVzdCAtZiAnaXN3dXBwZXIu
YycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9jdHlw
ZS8nYGlzd3VwcGVyLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFW
RV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5z
dG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3Vu
X18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1y
b290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94
ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1E
UEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYu
MFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL2N0eXBlIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1pc3d4ZGlnaXQubyBgdGVzdCAtZiAnaXN3eGRpZ2l0LmMnIHx8IGVjaG8g
Jy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2Bpc3d4ZGln
aXQuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRp
bmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1s
aW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5v
LWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
L3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJT
SU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNL
QUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvY3R5cGUgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLWpwMnVjLm8gYHRlc3QgLWYgJ2pwMnVjLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2BqcDJ1Yy5jCng4Nl82NC1wYy1saW51eC1n
bnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFD
SF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tB
R0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUku
IC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9jdHlwZSAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtdG9hc2NpaS5vIGB0ZXN0IC1m
ICd0b2FzY2lpLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvY3R5cGUvJ2B0b2FzY2lpLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9O
QU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAtYyAtbyBsaWJfYS1fdG9sb3dlci5vIGB0ZXN0IC1mICdfdG9sb3dlci5jJyB8
fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlLydg
X3RvbG93ZXIuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5j
bHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvY3R5cGUgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLV90b3VwcGVyLm8gYHRlc3QgLWYgJ190b3VwcGVyLmMnIHx8IGVjaG8gJy4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2BfdG91cHBlci5jCng4
Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0
aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIx
LjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVH
UkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9jdHlwZSAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8y
IC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtdG93
Y3RyYW5zLm8gYHRlc3QgLWYgJ3Rvd2N0cmFucy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlLydgdG93Y3RyYW5zLmMKeDg2XzY0LXBjLWxp
bnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19s
aW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9p
bmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2N0eXBlIC1P
MiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS10b3dsb3dlci5vIGB0
ZXN0IC1mICd0b3dsb3dlci5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2N0eXBlLydgdG93bG93ZXIuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAt
RF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19G
cmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0
ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4v
aW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1df
SFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2
XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklO
Rz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUgLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXRvd3VwcGVyLm8gYHRlc3QgLWYgJ3Rvd3Vw
cGVyLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
Y3R5cGUvJ2B0b3d1cHBlci5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRT
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJu
b3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82
NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAx
LjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9jdHlwZSAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMg
LWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgICAgLWMgLW8gbGliX2Etd2N0cmFucy5vIGB0ZXN0IC1mICd3Y3RyYW5zLmMnIHx8IGVjaG8g
Jy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2B3Y3RyYW5z
LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1l
eGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90
YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lP
Tj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FH
RV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2N0eXBlIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAg
ICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJf
YS13Y3R5cGUubyBgdGVzdCAtZiAnd2N0eXBlLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvY3R5cGUvJ2B3Y3R5cGUuYwpybSAtZiBsaWIuYQphciBj
cnUgbGliLmEgbGliX2EtY3R5cGVfLm8gbGliX2EtaXNhbG51bS5vIGxpYl9hLWlzYWxwaGEubyBs
aWJfYS1pc2NudHJsLm8gbGliX2EtaXNkaWdpdC5vIGxpYl9hLWlzbG93ZXIubyBsaWJfYS1pc3Vw
cGVyLm8gbGliX2EtaXNwcmludC5vIGxpYl9hLWlzcHVuY3QubyBsaWJfYS1pc3NwYWNlLm8gbGli
X2EtaXN4ZGlnaXQubyBsaWJfYS10b2xvd2VyLm8gbGliX2EtdG91cHBlci5vIGxpYl9hLWlzYXNj
aWkubyBsaWJfYS1pc2JsYW5rLm8gbGliX2EtaXN3YWxudW0ubyBsaWJfYS1pc3dhbHBoYS5vIGxp
Yl9hLWlzd2JsYW5rLm8gbGliX2EtaXN3Y250cmwubyBsaWJfYS1pc3djdHlwZS5vIGxpYl9hLWlz
d2RpZ2l0Lm8gbGliX2EtaXN3Z3JhcGgubyBsaWJfYS1pc3dsb3dlci5vIGxpYl9hLWlzd3ByaW50
Lm8gbGliX2EtaXN3cHVuY3QubyBsaWJfYS1pc3dzcGFjZS5vIGxpYl9hLWlzd3VwcGVyLm8gbGli
X2EtaXN3eGRpZ2l0Lm8gbGliX2EtanAydWMubyBsaWJfYS10b2FzY2lpLm8gbGliX2EtX3RvbG93
ZXIubyBsaWJfYS1fdG91cHBlci5vIGxpYl9hLXRvd2N0cmFucy5vIGxpYl9hLXRvd2xvd2VyLm8g
bGliX2EtdG93dXBwZXIubyBsaWJfYS13Y3RyYW5zLm8gbGliX2Etd2N0eXBlLm8gCnJhbmxpYiBs
aWIuYQptYWtlWzZdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvY3R5cGUnCk1ha2luZyBhbGwg
aW4gc2VhcmNoCm1ha2VbNl06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvc2VhcmNoJwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c2VhcmNoIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1ic2Vh
cmNoLm8gYHRlc3QgLWYgJ2JzZWFyY2guYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zZWFyY2gvJ2Bic2VhcmNoLmMKeDg2XzY0LXBjLWxpbnV4LWdu
dS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FH
RV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4g
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3NlYXJjaCAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtcXNvcnQubyBgdGVzdCAtZiAn
cXNvcnQuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zZWFyY2gvJ2Bxc29ydC5jCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc2VhcmNoL3Fzb3J0LmM6ODQ6MTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNu
J3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
ZWFyY2gvcXNvcnQuYzoxMzA6MTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3Qg
YSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zZWFy
Y2gvcXNvcnQuYzoxNDI6MTogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBw
cm90b3R5cGUKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3NlYXJjaCAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWls
dGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMg
LW8gbGliX2EtaGFzaC5vIGB0ZXN0IC1mICdoYXNoLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc2VhcmNoLydgaGFzaC5jCi4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc2VhcmNoL2hhc2guYzoxMDY6MTogd2FybmluZzog
ZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKeDg2XzY0LXBjLWxpbnV4LWdu
dS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FH
RV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4g
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3NlYXJjaCAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtaGFzaF9iaWdrZXkubyBgdGVz
dCAtZiAnaGFzaF9iaWdrZXkuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9zZWFyY2gvJ2BoYXNoX2JpZ2tleS5jCi4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc2VhcmNoL2hhc2hfYmlna2V5LmM6IEluIGZ1bmN0aW9uICdf
X2JpZ19pbnNlcnQnOgouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3Nl
YXJjaC9oYXNoX2JpZ2tleS5jOjEyNjo2OiB3YXJuaW5nOiBzdWdnZXN0IGV4cGxpY2l0IGJyYWNl
cyB0byBhdm9pZCBhbWJpZ3VvdXMgJ2Vsc2UnCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNs
dWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1m
bm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19J
TlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmds
b3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwi
bmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zZWFyY2ggLU8yIC1ETUlTU0lOR19TWVND
QUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWhhc2hfYnVmLm8gYHRlc3QgLWYgJ2hhc2hfYnVm
LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc2Vh
cmNoLydgaGFzaF9idWYuYwouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L3NlYXJjaC9oYXNoX2J1Zi5jOiBJbiBmdW5jdGlvbiAnX19nZXRfYnVmJzoKLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zZWFyY2gvaGFzaF9idWYuYzoxMjI6MTU6IHdh
cm5pbmc6ICdzZWdtZW50X25keCcgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXplZCBpbiB0aGlzIGZ1
bmN0aW9uCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc2VhcmNoL2hh
c2hfYnVmLmM6MTIzOjEwOiB3YXJuaW5nOiAnc2VncCcgbWF5IGJlIHVzZWQgdW5pbml0aWFsaXpl
ZCBpbiB0aGlzIGZ1bmN0aW9uCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRT
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJu
b3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82
NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAx
LjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zZWFyY2ggLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVT
IC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAgIC1jIC1vIGxpYl9hLWhhc2hfZnVuYy5vIGB0ZXN0IC1mICdoYXNoX2Z1bmMuYycgfHwg
ZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zZWFyY2gvJ2Bo
YXNoX2Z1bmMuYwouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3NlYXJj
aC9oYXNoX2Z1bmMuYzo2OToxOiB3YXJuaW5nOiAnaGFzaDEnIGRlZmluZWQgYnV0IG5vdCB1c2Vk
Ci4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc2VhcmNoL2hhc2hfZnVu
Yy5jOjg5OjE6IHdhcm5pbmc6ICdoYXNoMicgZGVmaW5lZCBidXQgbm90IHVzZWQKLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zZWFyY2gvaGFzaF9mdW5jLmM6MTE4OjE6
IHdhcm5pbmc6ICdoYXNoMycgZGVmaW5lZCBidXQgbm90IHVzZWQKeDg2XzY0LXBjLWxpbnV4LWdu
dS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FH
RV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4g
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3NlYXJjaCAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtaGFzaF9sb2cyLm8gYHRlc3Qg
LWYgJ2hhc2hfbG9nMi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL3NlYXJjaC8nYGhhc2hfbG9nMi5jCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc2VhcmNoL2hhc2hfbG9nMi5jOjQ3OjE6IHdhcm5pbmc6IGZ1bmN0aW9u
IGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5H
PVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zZWFyY2ggLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWhhc2hfcGFnZS5vIGB0ZXN0IC1mICdoYXNo
X3BhZ2UuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zZWFyY2gvJ2BoYXNoX3BhZ2UuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9T
X18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rv
b2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18g
LVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9s
aWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAt
bW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0
YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJS
VVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
bGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94
ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xp
YlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc2VhcmNoIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9O
QU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAtYyAtbyBsaWJfYS1oY3JlYXRlLm8gYHRlc3QgLWYgJ2hjcmVhdGUuYycgfHwg
ZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zZWFyY2gvJ2Bo
Y3JlYXRlLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3NlYXJjaCAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWls
dGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMg
LW8gbGliX2EtaGNyZWF0ZV9yLm8gYHRlc3QgLWYgJ2hjcmVhdGVfci5jJyB8fCBlY2hvICcuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3NlYXJjaC8nYGhjcmVhdGVfci5j
Ci4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc2VhcmNoL2hjcmVhdGVf
ci5jOiBJbiBmdW5jdGlvbiAnaGRlc3Ryb3lfcic6Ci4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc2VhcmNoL2hjcmVhdGVfci5jOjEyNzo5OiB3YXJuaW5nOiB1bnVzZWQg
dmFyaWFibGUgJ2lkeCcKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
ZWFyY2gvaGNyZWF0ZV9yLmM6MTI2OjI1OiB3YXJuaW5nOiB1bnVzZWQgdmFyaWFibGUgJ2llJwp4
ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc2VhcmNoIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAt
TzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS10
ZGVsZXRlLm8gYHRlc3QgLWYgJ3RkZWxldGUuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zZWFyY2gvJ2B0ZGVsZXRlLmMKeDg2XzY0LXBjLWxpbnV4
LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3NlYXJjaCAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtdGRlc3Ryb3kubyBgdGVz
dCAtZiAndGRlc3Ryb3kuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zZWFyY2gvJ2B0ZGVzdHJveS5jCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc2VhcmNoL3RkZXN0cm95LmM6Mjk6MTogd2FybmluZzogZnVuY3Rpb24g
ZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURf
X01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJl
ZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVt
IC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hX
X0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82
NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9
XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3NlYXJjaCAtTzIgLURNSVNTSU5HX1NZ
U0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtdGZpbmQubyBgdGVzdCAtZiAndGZpbmQuYycg
fHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zZWFyY2gv
J2B0ZmluZC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNs
dWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUg
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9y
IC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tB
R0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAt
RFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9zZWFyY2ggLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLXRzZWFyY2gubyBgdGVzdCAtZiAndHNlYXJjaC5jJyB8fCBlY2hvICcuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3NlYXJjaC8nYHRzZWFyY2guYwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c2VhcmNoIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS10d2Fs
ay5vIGB0ZXN0IC1mICd0d2Fsay5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3NlYXJjaC8nYHR3YWxrLmMKcm0gLWYgbGliLmEKYXIgY3J1IGxpYi5h
IGxpYl9hLWJzZWFyY2gubyBsaWJfYS1xc29ydC5vIGxpYl9hLWhhc2gubyBsaWJfYS1oYXNoX2Jp
Z2tleS5vIGxpYl9hLWhhc2hfYnVmLm8gbGliX2EtaGFzaF9mdW5jLm8gbGliX2EtaGFzaF9sb2cy
Lm8gbGliX2EtaGFzaF9wYWdlLm8gbGliX2EtaGNyZWF0ZS5vIGxpYl9hLWhjcmVhdGVfci5vIGxp
Yl9hLXRkZWxldGUubyBsaWJfYS10ZGVzdHJveS5vIGxpYl9hLXRmaW5kLm8gbGliX2EtdHNlYXJj
aC5vIGxpYl9hLXR3YWxrLm8gCnJhbmxpYiBsaWIuYQptYWtlWzZdOiBMZWF2aW5nIGRpcmVjdG9y
eSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliL2xpYmMvc2VhcmNoJwpNYWtpbmcgYWxsIGluIHN0ZGlvCm1ha2VbNl06IEVudGVyaW5nIGRp
cmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL2xpYmMvc3RkaW8nCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1Nf
XyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9v
bHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAt
VSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xp
Yi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2EtY2xlYXJlcnIubyBgdGVzdCAtZiAnY2xlYXJlcnIuYycgfHwg
ZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYGNs
ZWFyZXJyLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0
aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAt
byBsaWJfYS1mY2xvc2UubyBgdGVzdCAtZiAnZmNsb3NlLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2BmY2xvc2UuYwp4ODZfNjQtcGMt
bGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBf
X2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURf
STM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9p
bmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIg
LURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1c
IlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8g
LU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWZkb3Blbi5vIGB0
ZXN0IC1mICdmZG9wZW4uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zdGRpby8nYGZkb3Blbi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNs
dWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1m
bm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19J
TlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmds
b3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwi
bmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NB
TExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZmVvZi5vIGB0ZXN0IC1mICdmZW9mLmMnIHx8IGVj
aG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2BmZW9m
LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1l
eGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90
YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lP
Tj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FH
RV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAg
ICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJf
YS1mZXJyb3IubyBgdGVzdCAtZiAnZmVycm9yLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2BmZXJyb3IuYwp4ODZfNjQtcGMtbGludXgt
Z251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4
X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1
ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lw
djQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1B
Q0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRl
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNL
QUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1J
LiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1E
TUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWZmbHVzaC5vIGB0ZXN0IC1m
ICdmZmx1c2guYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRpby8nYGZmbHVzaC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1Nf
XyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9v
bHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAt
VSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xp
Yi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2EtZmdldGMubyBgdGVzdCAtZiAnZmdldGMuYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYGZnZXRjLmMK
eDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1c
IjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9C
VUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAt
TzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1m
Z2V0cG9zLm8gYHRlc3QgLWYgJ2ZnZXRwb3MuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYGZnZXRwb3MuYwp4ODZfNjQtcGMtbGludXgt
Z251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4
X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1
ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lw
djQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1B
Q0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRl
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNL
QUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1J
LiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1E
TUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWZnZXRzLm8gYHRlc3QgLWYg
J2ZnZXRzLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc3RkaW8vJ2BmZ2V0cy5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRT
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJu
b3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82
NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAx
LjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMg
LWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgICAgLWMgLW8gbGliX2EtZmlsZW5vLm8gYHRlc3QgLWYgJ2ZpbGVuby5jJyB8fCBlY2hvICcu
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgZmlsZW5vLmMK
eDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1c
IjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9C
VUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAt
TzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1m
aW5kZnAubyBgdGVzdCAtZiAnZmluZGZwLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2BmaW5kZnAuYwp4ODZfNjQtcGMtbGludXgtZ251
LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlT
U0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWZpcHJpbnRmLm8gYHRlc3QgLWYg
J2ZpcHJpbnRmLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvc3RkaW8vJ2BmaXByaW50Zi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5J
T1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
dG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0Rf
XyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNy
L2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRl
IC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8t
c3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRF
UlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3Nz
L3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3
bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExf
TkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZmxhZ3MubyBgdGVzdCAtZiAnZmxhZ3MuYycgfHwgZWNo
byAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYGZsYWdz
LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1l
eGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90
YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lP
Tj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FH
RV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAg
ICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJf
YS1mb3Blbi5vIGB0ZXN0IC1mICdmb3Blbi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgZm9wZW4uYwp4ODZfNjQtcGMtbGludXgtZ251
LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlT
U0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWZwcmludGYubyBgdGVzdCAtZiAn
ZnByaW50Zi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL3N0ZGlvLydgZnByaW50Zi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1Nf
XyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9v
bHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAt
VSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xp
Yi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2EtZnByaW50Zl9jaGsubyBgdGVzdCAtZiAnZnByaW50Zl9jaGsu
YycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRp
by8nYGZwcmludGZfY2hrLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1E
SEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94
ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9f
c3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9z
cy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2dj
Yy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEu
MTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS1mcHV0Yy5vIGB0ZXN0IC1mICdmcHV0Yy5jJyB8fCBlY2hvICcuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgZnB1dGMuYwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWZwdXRz
Lm8gYHRlc3QgLWYgJ2ZwdXRzLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2BmcHV0cy5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5H
PVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZ
U0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZnJlYWQubyBgdGVzdCAtZiAnZnJlYWQuYycg
fHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8n
YGZyZWFkLmMKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby9m
cmVhZC5jOiBJbiBmdW5jdGlvbiAnX2ZyZWFkX3InOgouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N0ZGlvL2ZyZWFkLmM6MTgyOjE4OiB3YXJuaW5nOiBwb2ludGVyIHRh
cmdldHMgaW4gYXNzaWdubWVudCBkaWZmZXIgaW4gc2lnbmVkbmVzcwouLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvL2ZyZWFkLmM6MTg0OjExOiB3YXJuaW5nOiBw
b2ludGVyIHRhcmdldHMgaW4gYXNzaWdubWVudCBkaWZmZXIgaW4gc2lnbmVkbmVzcwp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Rk
aW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWZyZW9wZW4u
byBgdGVzdCAtZiAnZnJlb3Blbi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N0ZGlvLydgZnJlb3Blbi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZnNjYW5mLm8gYHRlc3QgLWYgJ2ZzY2Fu
Zi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0
ZGlvLydgZnNjYW5mLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFW
RV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5z
dG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3Vu
X18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1y
b290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94
ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1E
UEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYu
MFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1maXNjYW5mLm8gYHRlc3QgLWYgJ2Zpc2NhbmYuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYGZpc2NhbmYuYwp4
ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWZz
ZWVrLm8gYHRlc3QgLWYgJ2ZzZWVrLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2Bmc2Vlay5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZnNldHBvcy5vIGB0ZXN0IC1mICdmc2V0
cG9zLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RkaW8vJ2Bmc2V0cG9zLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1E
SEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94
ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9f
c3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9z
cy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2dj
Yy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1y
ZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1w
cm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXds
aWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5v
c3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0
IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEu
MTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS1mdGVsbC5vIGB0ZXN0IC1mICdmdGVsbC5jJyB8fCBlY2hvICcuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgZnRlbGwuYwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWZ2d3Jp
dGUubyBgdGVzdCAtZiAnZnZ3cml0ZS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgZnZ3cml0ZS5jCng4Nl82NC1wYy1saW51eC1nbnUt
Z2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAt
VSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAt
aXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9B
TExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4x
Ni4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9U
QVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0Vf
U1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1J
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNT
SU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZndhbGsubyBgdGVzdCAtZiAnZndh
bGsuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
dGRpby8nYGZ3YWxrLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFW
RV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5z
dG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3Vu
X18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1y
b290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94
ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1E
UEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYu
MFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1md3JpdGUubyBgdGVzdCAtZiAnZndyaXRlLmMnIHx8IGVjaG8gJy4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2Bmd3JpdGUuYwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWdldGMu
byBgdGVzdCAtZiAnZ2V0Yy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0ZGlvLydgZ2V0Yy5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNs
dWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1m
bm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19J
TlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmds
b3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwi
bmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NB
TExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZ2V0Y2hhci5vIGB0ZXN0IC1mICdnZXRjaGFyLmMn
IHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8v
J2BnZXRjaGFyLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9M
SUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9y
ZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18g
LW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZf
NjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2lu
Y2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9u
ZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0
b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFD
S0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tB
R0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwi
IC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1
aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAt
YyAtbyBsaWJfYS1nZXRjX3UubyBgdGVzdCAtZiAnZ2V0Y191LmMnIHx8IGVjaG8gJy4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2BnZXRjX3UuYwp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Rk
aW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWdldGNoYXJf
dS5vIGB0ZXN0IC1mICdnZXRjaGFyX3UuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYGdldGNoYXJfdS5jCng4Nl82NC1wYy1saW51eC1n
bnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFD
SF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tB
R0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUku
IC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZ2V0ZGVsaW0ubyBgdGVzdCAt
ZiAnZ2V0ZGVsaW0uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9zdGRpby8nYGdldGRlbGltLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FM
TF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1nZXRsaW5lLm8gYHRlc3QgLWYgJ2dldGxpbmUuYycg
fHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8n
YGdldGxpbmUuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5j
bHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLWdldHMubyBgdGVzdCAtZiAnZ2V0cy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgZ2V0cy5jCng4Nl82NC1wYy1saW51
eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtaXByaW50Zi5vIGB0ZXN0
IC1mICdpcHJpbnRmLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RkaW8vJ2BpcHJpbnRmLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FM
TF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1pc2NhbmYubyBgdGVzdCAtZiAnaXNjYW5mLmMnIHx8
IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2Bp
c2NhbmYuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVk
ZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAt
Zm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdF
X05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9W
RVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQ
QUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLW1ha2VidWYubyBgdGVzdCAtZiAnbWFrZWJ1Zi5jJyB8fCBlY2hvICcuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgbWFrZWJ1Zi5jCng4Nl82NC1w
Yy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
My9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBc
IiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JU
PVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRp
byAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtcGVycm9yLm8g
YHRlc3QgLWYgJ3BlcnJvci5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0ZGlvLydgcGVycm9yLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURf
X01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJl
ZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVt
IC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hX
X0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82
NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9
XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lT
Q0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1wcmludGYubyBgdGVzdCAtZiAncHJpbnRmLmMn
IHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8v
J2BwcmludGYuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5j
bHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLXB1dGMubyBgdGVzdCAtZiAncHV0Yy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgcHV0Yy5jCng4Nl82NC1wYy1saW51
eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtcHV0Y2hhci5vIGB0ZXN0
IC1mICdwdXRjaGFyLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RkaW8vJ2BwdXRjaGFyLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FM
TF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1wdXRjX3UubyBgdGVzdCAtZiAncHV0Y191LmMnIHx8
IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2Bw
dXRjX3UuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVk
ZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAt
Zm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdF
X05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9W
RVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQ
QUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLXB1dGNoYXJfdS5vIGB0ZXN0IC1mICdwdXRjaGFyX3UuYycgfHwgZWNobyAnLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHB1dGNoYXJfdS5jCng4
Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0
aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIx
LjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVH
UkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8y
IC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtcHV0
cy5vIGB0ZXN0IC1mICdwdXRzLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2BwdXRzLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURf
X01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJl
ZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVt
IC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hX
X0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82
NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9
XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lT
Q0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1yZWZpbGwubyBgdGVzdCAtZiAncmVmaWxsLmMn
IHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8v
J2ByZWZpbGwuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5j
bHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLXJlbW92ZS5vIGB0ZXN0IC1mICdyZW1vdmUuYycgfHwgZWNobyAnLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHJlbW92ZS5jCng4Nl82NC1w
Yy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
My9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBc
IiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JU
PVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRp
byAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtcmVuYW1lLm8g
YHRlc3QgLWYgJ3JlbmFtZS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0ZGlvLydgcmVuYW1lLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURf
X01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJl
ZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVt
IC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hX
X0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82
NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9
XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lT
Q0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1yZXdpbmQubyBgdGVzdCAtZiAncmV3aW5kLmMn
IHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8v
J2ByZXdpbmQuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5j
bHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLXJnZXQubyBgdGVzdCAtZiAncmdldC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgcmdldC5jCng4Nl82NC1wYy1saW51
eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2NhbmYubyBgdGVzdCAt
ZiAnc2NhbmYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRpby8nYHNjYW5mLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1F
UyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgICAtYyAtbyBsaWJfYS1zY2NsLm8gYHRlc3QgLWYgJ3NjY2wuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHNjY2wuYwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNldGJ1
Zi5vIGB0ZXN0IC1mICdzZXRidWYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHNldGJ1Zi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc2V0YnVmZmVyLm8gYHRlc3QgLWYgJ3Nl
dGJ1ZmZlci5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL3N0ZGlvLydgc2V0YnVmZmVyLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9O
QU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zZXRsaW5lYnVmLm8gYHRlc3QgLWYgJ3NldGxpbmVidWYu
YycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRp
by8nYHNldGxpbmVidWYuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4x
Ni4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1m
bm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAgIC1jIC1vIGxpYl9hLXNldHZidWYubyBgdGVzdCAtZiAnc2V0dmJ1Zi5jJyB8fCBlY2hvICcu
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgc2V0dmJ1Zi5j
Cng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYv
eDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2
XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4
LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhj
ZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFy
Zy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1c
Im5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049
XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0Vf
QlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAg
LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Et
c2lwcmludGYubyBgdGVzdCAtZiAnc2lwcmludGYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHNpcHJpbnRmLmMKeDg2XzY0LXBjLWxp
bnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19s
aW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9p
bmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1P
MiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zaXNjYW5mLm8gYHRl
c3QgLWYgJ3Npc2NhbmYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zdGRpby8nYHNpc2NhbmYuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9f
TUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVl
QlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0g
L3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5j
bHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAt
Zm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdf
SU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJn
bG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1c
Im5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1c
Im5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVND
QUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNuaXByaW50Zi5vIGB0ZXN0IC1mICdzbmlwcmlu
dGYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
dGRpby8nYHNuaXByaW50Zi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRT
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJu
b3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82
NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAx
LjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMg
LWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgICAgLWMgLW8gbGliX2Etc25wcmludGYubyBgdGVzdCAtZiAnc25wcmludGYuYycgfHwgZWNo
byAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHNucHJp
bnRmLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3Rk
aW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82
NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMt
bGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZu
by1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9O
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVS
U0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFD
S0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4g
ICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBs
aWJfYS1zcHJpbnRmLm8gYHRlc3QgLWYgJ3NwcmludGYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHNwcmludGYuYwp4ODZfNjQtcGMt
bGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBf
X2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURf
STM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9p
bmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAt
RFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIg
LURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1c
IlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8g
LU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXNwcmludGZfY2hr
Lm8gYHRlc3QgLWYgJ3NwcmludGZfY2hrLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2BzcHJpbnRmX2Noay5jCng4Nl82NC1wYy1saW51
eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc3NjYW5mLm8gYHRlc3Qg
LWYgJ3NzY2FuZi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0ZGlvLydgc3NjYW5mLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9O
QU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zdGRpby5vIGB0ZXN0IC1mICdzdGRpby5jJyB8fCBlY2hv
ICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgc3RkaW8u
Ywp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51
eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4
Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rh
cmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9O
PVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdF
X0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAg
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9h
LXRtcGZpbGUubyBgdGVzdCAtZiAndG1wZmlsZS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgdG1wZmlsZS5jCng4Nl82NC1wYy1saW51
eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtdG1wbmFtLm8gYHRlc3Qg
LWYgJ3RtcG5hbS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0ZGlvLydgdG1wbmFtLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklP
U19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90
b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9f
IC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3Iv
bGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUg
LW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1z
dGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVS
UlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3Mv
eDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXds
aWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9O
QU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAtYyAtbyBsaWJfYS11bmdldGMubyBgdGVzdCAtZiAndW5nZXRjLmMnIHx8IGVj
aG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2B1bmdl
dGMuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRp
bmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1s
aW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5v
LWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
L3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJT
SU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNL
QUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLXZkaXByaW50Zi5vIGB0ZXN0IC1mICd2ZGlwcmludGYuYycgfHwgZWNobyAnLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHZkaXByaW50Zi5jCng4Nl82
NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
dGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1n
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtdmRwcmlu
dGYubyBgdGVzdCAtZiAndmRwcmludGYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHZkcHJpbnRmLmMKeDg2XzY0LXBjLWxpbnV4LWdu
dS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FH
RV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4g
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1J
U1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS12aXByaW50Zi5vIGB0ZXN0IC1m
ICd2aXByaW50Zi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0ZGlvLydgdmlwcmludGYuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlO
SU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNE
X18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vz
ci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVk
ZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5v
LXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5U
RVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9z
cy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5l
d2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxM
X05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXZpc2NhbmYubyBgdGVzdCAtZiAndmlzY2FuZi5jJyB8
fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydg
dmlzY2FuZi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNs
dWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUg
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9y
IC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tB
R0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAt
RFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWls
dGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMg
LW8gbGliX2EtdnByaW50Zi5vIGB0ZXN0IC1mICd2cHJpbnRmLmMnIHx8IGVjaG8gJy4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2B2cHJpbnRmLmMKeDg2XzY0
LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQg
LVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVu
LWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQu
NS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYu
MFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBP
UlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0
ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS12c2NhbmYu
byBgdGVzdCAtZiAndnNjYW5mLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2B2c2NhbmYuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAt
RF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19G
cmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0
ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4v
aW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1df
SFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2
XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklO
Rz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXZzaXByaW50Zi5vIGB0ZXN0IC1mICd2c2lw
cmludGYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdGRpby8nYHZzaXByaW50Zi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1Nf
XyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9v
bHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAt
VSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xp
Yi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2EtdnNpc2NhbmYubyBgdGVzdCAtZiAndnNpc2NhbmYuYycgfHwg
ZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHZz
aXNjYW5mLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0
aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAt
byBsaWJfYS12c25wcmludGYubyBgdGVzdCAtZiAndnNucHJpbnRmLmMnIHx8IGVjaG8gJy4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2B2c25wcmludGYuYwp4
ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXZz
bmlwcmludGYubyBgdGVzdCAtZiAndnNuaXByaW50Zi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgdnNuaXByaW50Zi5jCng4Nl82NC1w
Yy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
My9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBc
IiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JU
PVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRp
byAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtdnNwcmludGYu
byBgdGVzdCAtZiAndnNwcmludGYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHZzcHJpbnRmLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1n
Y2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1V
IF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1p
c3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
eGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FM
TE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3Nz
L3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RB
Uk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9T
VFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUku
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJ
TkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS12c3NjYW5mLm8gYHRlc3QgLWYgJ3Zz
c2NhbmYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdGRpby8nYHZzc2NhbmYuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18g
LURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xz
L3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUg
X19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Ny
b3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIv
Z2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5v
LXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNr
LXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBU
UyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGli
bm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZf
NjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwg
MS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVT
IC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAgIC1jIC1vIGxpYl9hLXdidWYubyBgdGVzdCAtZiAnd2J1Zi5jJyB8fCBlY2hvICcuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgd2J1Zi5jCng4Nl82
NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
dGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1n
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd3NldHVw
Lm8gYHRlc3QgLWYgJ3dzZXR1cC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N0ZGlvLydgd3NldHVwLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdf
U1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZs
b3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxs
cyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25v
dXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkg
LVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9u
LWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1hc2lwcmludGYubyBgdGVzdCAtZiAnYXNp
cHJpbnRmLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc3RkaW8vJ2Bhc2lwcmludGYuYwouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0ZGlvL2FzaXByaW50Zi5jOiBJbiBmdW5jdGlvbiAnX2FzaXByaW50Zl9yJzoKLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby9hc2lwcmludGYuYzo0
ODoxMzogd2FybmluZzogcG9pbnRlciB0YXJnZXRzIGluIGFzc2lnbm1lbnQgZGlmZmVyIGluIHNp
Z25lZG5lc3MKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby9h
c2lwcmludGYuYzogSW4gZnVuY3Rpb24gJ2FzaXByaW50Zic6Ci4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vYXNpcHJpbnRmLmM6NzU6MTM6IHdhcm5pbmc6IHBv
aW50ZXIgdGFyZ2V0cyBpbiBhc3NpZ25tZW50IGRpZmZlciBpbiBzaWduZWRuZXNzCng4Nl82NC1w
Yy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1V
IF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1l
bGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUu
My9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2lu
Y2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAt
RF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBc
IiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JU
PVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRp
byAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1m
bm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGlt
aXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tz
IC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlh
c2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFs
dWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtYXNwcmludGYu
byBgdGVzdCAtZiAnYXNwcmludGYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYGFzcHJpbnRmLmMKLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby9hc3ByaW50Zi5jOiBJbiBmdW5jdGlvbiAnX2FzcHJp
bnRmX3InOgouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvL2Fz
cHJpbnRmLmM6NDg6MTM6IHdhcm5pbmc6IHBvaW50ZXIgdGFyZ2V0cyBpbiBhc3NpZ25tZW50IGRp
ZmZlciBpbiBzaWduZWRuZXNzCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc3RkaW8vYXNwcmludGYuYzogSW4gZnVuY3Rpb24gJ2FzcHJpbnRmJzoKLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby9hc3ByaW50Zi5jOjc1OjEzOiB3YXJu
aW5nOiBwb2ludGVyIHRhcmdldHMgaW4gYXNzaWdubWVudCBkaWZmZXIgaW4gc2lnbmVkbmVzcwp4
ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1P
MiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWZj
bG9zZWFsbC5vIGB0ZXN0IC1mICdmY2xvc2VhbGwuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYGZjbG9zZWFsbC5jCng4Nl82NC1wYy1s
aW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9f
bGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
aW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9J
Mzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2lu
Y2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAt
RFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwi
XCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAt
TzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtZnNlZWtvLm8gYHRl
c3QgLWYgJ2ZzZWVrby5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL3N0ZGlvLydgZnNlZWtvLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FM
TF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1mdGVsbG8ubyBgdGVzdCAtZiAnZnRlbGxvLmMnIHx8
IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vJ2Bm
dGVsbG8uYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVk
ZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAt
Zm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdF
X05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9W
RVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQ
QUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRp
biAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1v
IGxpYl9hLWdldHcubyBgdGVzdCAtZiAnZ2V0dy5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgZ2V0dy5jCng4Nl82NC1wYy1saW51eC1n
bnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFD
SF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tB
R0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUku
IC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtbWt0ZW1wLm8gYHRlc3QgLWYg
J21rdGVtcC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL3N0ZGlvLydgbWt0ZW1wLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1F
UyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgICAtYyAtbyBsaWJfYS1wdXR3Lm8gYHRlc3QgLWYgJ3B1dHcuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYHB1dHcuYwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXZhc2lw
cmludGYubyBgdGVzdCAtZiAndmFzaXByaW50Zi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgdmFzaXByaW50Zi5jCi4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vdmFzaXByaW50Zi5jOiBJbiBmdW5j
dGlvbiAnX3Zhc2lwcmludGZfcic6Ci4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvc3RkaW8vdmFzaXByaW50Zi5jOjYwOjEzOiB3YXJuaW5nOiBwb2ludGVyIHRhcmdldHMg
aW4gYXNzaWdubWVudCBkaWZmZXIgaW4gc2lnbmVkbmVzcwp4ODZfNjQtcGMtbGludXgtZ251LWdj
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUg
X19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlz
eXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94
ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxM
T1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
eDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFS
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NU
UklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lO
R19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXZhc3ByaW50Zi5vIGB0ZXN0IC1mICd2
YXNwcmludGYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRpby8nYHZhc3ByaW50Zi5jCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RkaW8vdmFzcHJpbnRmLmM6IEluIGZ1bmN0aW9uICdfdmFzcHJpbnRmX3InOgou
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvL3Zhc3ByaW50Zi5j
OjYwOjEzOiB3YXJuaW5nOiBwb2ludGVyIHRhcmdldHMgaW4gYXNzaWdubWVudCBkaWZmZXIgaW4g
c2lnbmVkbmVzcwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJ
QkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3Jl
ICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAt
bm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3Qt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82
NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5j
bHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25l
ICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3Rv
ciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNL
QUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIg
LURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLWFzbmlwcmludGYubyBgdGVzdCAtZiAnYXNuaXByaW50Zi5jJyB8fCBlY2hvICcu
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgYXNuaXByaW50
Zi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGlu
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxp
bnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJ
T049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tB
R0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAg
ICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGli
X2EtYXNucHJpbnRmLm8gYHRlc3QgLWYgJ2FzbnByaW50Zi5jJyB8fCBlY2hvICcuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgYXNucHJpbnRmLmMKeDg2XzY0
LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQg
LVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVu
LWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQu
NS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMv
aW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25z
IC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYu
MFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBP
UlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0
ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1kaXByaW50
Zi5vIGB0ZXN0IC1mICdkaXByaW50Zi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgZGlwcmludGYuYwp4ODZfNjQtcGMtbGludXgtZ251
LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlT
U0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLWRwcmludGYubyBgdGVzdCAtZiAn
ZHByaW50Zi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL3N0ZGlvLydgZHByaW50Zi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1Nf
XyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9v
bHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAt
VSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Y3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xp
Yi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1t
bm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3Rh
Y2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJV
UFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9s
aWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4
Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGli
XCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGli
XCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2EtZm1lbW9wZW4ubyBgdGVzdCAtZiAnZm1lbW9wZW4uYycgfHwg
ZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYGZt
ZW1vcGVuLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0
aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAt
byBsaWJfYS1mb3BlbmNvb2tpZS5vIGB0ZXN0IC1mICdmb3BlbmNvb2tpZS5jJyB8fCBlY2hvICcu
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgZm9wZW5jb29r
aWUuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRp
bmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1s
aW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdp
cC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAt
SS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5v
LWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
L3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJT
SU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNL
QUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLWZ1bm9wZW4ubyBgdGVzdCAtZiAnZnVub3Blbi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvLydgZnVub3Blbi5jCng4Nl82NC1wYy1s
aW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9f
bGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
aW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9J
Mzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2lu
Y2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAt
RFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwi
XCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAt
TzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etb3Blbl9tZW1zdHJl
YW0ubyBgdGVzdCAtZiAnb3Blbl9tZW1zdHJlYW0uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8nYG9wZW5fbWVtc3RyZWFtLmMKLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby9vcGVuX21lbXN0cmVhbS5j
OiBJbiBmdW5jdGlvbiAnX29wZW5fbWVtc3RyZWFtX3InOgouLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvL29wZW5fbWVtc3RyZWFtLmM6MjU3Ojc6IHdhcm5pbmc6
IHVudXNlZCB2YXJpYWJsZSAnZmxhZ3MnCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5J
T1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
dG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0Rf
XyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNy
L2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRl
IC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8t
c3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRF
UlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3Nz
L3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3
bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExf
TkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtdmFzbmlwcmludGYubyBgdGVzdCAtZiAndmFzbmlwcmlu
dGYuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
dGRpby8nYHZhc25pcHJpbnRmLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1F
UyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgICAtYyAtbyBsaWJfYS12YXNucHJpbnRmLm8gYHRlc3QgLWYgJ3Zhc25wcmludGYuYycg
fHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby8n
YHZhc25wcmludGYuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZF
X0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0
b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5f
XyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJv
b3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4
Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
aW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8t
YnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAg
IC1mc2hvcnQtZW51bXMgLURJTlRFR0VSX09OTFkgLWMgLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdGRpby92ZnByaW50Zi5jIC1vIGxpYl9hLXZmaXByaW50Zi5vCng4
Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2
XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0
LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdu
dS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0
aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIx
LjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVH
UkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdGRpbyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8y
IC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWZzaG9ydC1lbnVtcyAt
YyAuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvL3ZmcHJpbnRm
LmMgLW8gbGliX2EtdmZwcmludGYubwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9T
X18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rv
b2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18g
LVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9s
aWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAt
bW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0
YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJS
VVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
bGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94
ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xp
YlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19TWVNDQUxMX05B
TUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAgIC1jIC4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Rk
aW8vdmZzY2FuZi5jIC1vIGxpYl9hLXZmc2NhbmYubwouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N0ZGlvL3Zmc2NhbmYuYzoyMjk6MTI6IHdhcm5pbmc6IGZ1bmN0aW9u
IGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RkaW8vdmZzY2FuZi5jOiBJbiBmdW5jdGlvbiAnX19zdmZzY2FuZl9y
JzoKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby92ZnNjYW5m
LmM6MzAyOjM6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBl
Ci4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vdmZzY2FuZi5j
OjUwNjo0OiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQou
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvL3Zmc2NhbmYuYzo1
MTI6NDogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby92ZnNjYW5mLmM6NjM0
OjQ6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vdmZzY2FuZi5jOjMwNzo5
OiB3YXJuaW5nOiB1bnVzZWQgdmFyaWFibGUgJ2NwJwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAt
RF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19G
cmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0
ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4v
aW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1df
SFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2
XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9s
aWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklO
Rz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4u
Ly4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8gLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1ESU5URUdFUl9PTkxZIC1jIC4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RkaW8vdmZzY2FuZi5jIC1vIGxpYl9hLXZmaXNjYW5mLm8K
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdGRpby92ZnNjYW5mLmM6
MjI5OjEyOiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpc24ndCBhIHByb3RvdHlwZQou
Li8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0ZGlvL3Zmc2NhbmYuYzog
SW4gZnVuY3Rpb24gJ19fc3ZmaXNjYW5mX3InOgouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0ZGlvL3Zmc2NhbmYuYzozMDI6Mzogd2FybmluZzogZnVuY3Rpb24gZGVj
bGFyYXRpb24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zdGRpby92ZnNjYW5mLmM6NTA2OjQ6IHdhcm5pbmc6IGZ1bmN0aW9uIGRlY2xh
cmF0aW9uIGlzbid0IGEgcHJvdG90eXBlCi4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RkaW8vdmZzY2FuZi5jOjUxMjo0OiB3YXJuaW5nOiBmdW5jdGlvbiBkZWNsYXJh
dGlvbiBpc24ndCBhIHByb3RvdHlwZQouLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0ZGlvL3Zmc2NhbmYuYzo2MzQ6NDogd2FybmluZzogZnVuY3Rpb24gZGVjbGFyYXRp
b24gaXNuJ3QgYSBwcm90b3R5cGUKLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdGRpby92ZnNjYW5mLmM6MzA3Ojk6IHdhcm5pbmc6IHVudXNlZCB2YXJpYWJsZSAnY3An
CnJtIC1mIGxpYi5hCmFyIGNydSBsaWIuYSBsaWJfYS1jbGVhcmVyci5vIGxpYl9hLWZjbG9zZS5v
IGxpYl9hLWZkb3Blbi5vIGxpYl9hLWZlb2YubyBsaWJfYS1mZXJyb3IubyBsaWJfYS1mZmx1c2gu
byBsaWJfYS1mZ2V0Yy5vIGxpYl9hLWZnZXRwb3MubyBsaWJfYS1mZ2V0cy5vIGxpYl9hLWZpbGVu
by5vIGxpYl9hLWZpbmRmcC5vIGxpYl9hLWZpcHJpbnRmLm8gbGliX2EtZmxhZ3MubyBsaWJfYS1m
b3Blbi5vIGxpYl9hLWZwcmludGYubyBsaWJfYS1mcHJpbnRmX2Noay5vIGxpYl9hLWZwdXRjLm8g
bGliX2EtZnB1dHMubyBsaWJfYS1mcmVhZC5vIGxpYl9hLWZyZW9wZW4ubyBsaWJfYS1mc2NhbmYu
byBsaWJfYS1maXNjYW5mLm8gbGliX2EtZnNlZWsubyBsaWJfYS1mc2V0cG9zLm8gbGliX2EtZnRl
bGwubyBsaWJfYS1mdndyaXRlLm8gbGliX2EtZndhbGsubyBsaWJfYS1md3JpdGUubyBsaWJfYS1n
ZXRjLm8gbGliX2EtZ2V0Y2hhci5vIGxpYl9hLWdldGNfdS5vIGxpYl9hLWdldGNoYXJfdS5vIGxp
Yl9hLWdldGRlbGltLm8gbGliX2EtZ2V0bGluZS5vIGxpYl9hLWdldHMubyBsaWJfYS1pcHJpbnRm
Lm8gbGliX2EtaXNjYW5mLm8gbGliX2EtbWFrZWJ1Zi5vIGxpYl9hLXBlcnJvci5vIGxpYl9hLXBy
aW50Zi5vIGxpYl9hLXB1dGMubyBsaWJfYS1wdXRjaGFyLm8gbGliX2EtcHV0Y191Lm8gbGliX2Et
cHV0Y2hhcl91Lm8gbGliX2EtcHV0cy5vIGxpYl9hLXJlZmlsbC5vIGxpYl9hLXJlbW92ZS5vIGxp
Yl9hLXJlbmFtZS5vIGxpYl9hLXJld2luZC5vIGxpYl9hLXJnZXQubyBsaWJfYS1zY2FuZi5vIGxp
Yl9hLXNjY2wubyBsaWJfYS1zZXRidWYubyBsaWJfYS1zZXRidWZmZXIubyBsaWJfYS1zZXRsaW5l
YnVmLm8gbGliX2Etc2V0dmJ1Zi5vIGxpYl9hLXNpcHJpbnRmLm8gbGliX2Etc2lzY2FuZi5vIGxp
Yl9hLXNuaXByaW50Zi5vIGxpYl9hLXNucHJpbnRmLm8gbGliX2Etc3ByaW50Zi5vIGxpYl9hLXNw
cmludGZfY2hrLm8gbGliX2Etc3NjYW5mLm8gbGliX2Etc3RkaW8ubyBsaWJfYS10bXBmaWxlLm8g
bGliX2EtdG1wbmFtLm8gbGliX2EtdW5nZXRjLm8gbGliX2EtdmRpcHJpbnRmLm8gbGliX2EtdmRw
cmludGYubyBsaWJfYS12aXByaW50Zi5vIGxpYl9hLXZpc2NhbmYubyBsaWJfYS12cHJpbnRmLm8g
bGliX2EtdnNjYW5mLm8gbGliX2EtdnNpcHJpbnRmLm8gbGliX2EtdnNpc2NhbmYubyBsaWJfYS12
c25wcmludGYubyBsaWJfYS12c25pcHJpbnRmLm8gbGliX2EtdnNwcmludGYubyBsaWJfYS12c3Nj
YW5mLm8gbGliX2Etd2J1Zi5vIGxpYl9hLXdzZXR1cC5vIGxpYl9hLWFzaXByaW50Zi5vIGxpYl9h
LWFzcHJpbnRmLm8gbGliX2EtZmNsb3NlYWxsLm8gbGliX2EtZnNlZWtvLm8gbGliX2EtZnRlbGxv
Lm8gbGliX2EtZ2V0dy5vIGxpYl9hLW1rdGVtcC5vIGxpYl9hLXB1dHcubyBsaWJfYS12YXNpcHJp
bnRmLm8gbGliX2EtdmFzcHJpbnRmLm8gbGliX2EtYXNuaXByaW50Zi5vIGxpYl9hLWFzbnByaW50
Zi5vIGxpYl9hLWRpcHJpbnRmLm8gbGliX2EtZHByaW50Zi5vIGxpYl9hLWZtZW1vcGVuLm8gbGli
X2EtZm9wZW5jb29raWUubyBsaWJfYS1mdW5vcGVuLm8gbGliX2Etb3Blbl9tZW1zdHJlYW0ubyBs
aWJfYS12YXNuaXByaW50Zi5vIGxpYl9hLXZhc25wcmludGYubyBsaWJfYS12ZmlwcmludGYubyBs
aWJfYS12ZnByaW50Zi5vIGxpYl9hLXZmc2NhbmYubyBsaWJfYS12ZmlzY2FuZi5vCnJhbmxpYiBs
aWIuYQptYWtlWzZdOiBMZWF2aW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvc3RkaW8nCk1ha2luZyBhbGwg
aW4gc3RyaW5nCm1ha2VbNl06IEVudGVyaW5nIGRpcmVjdG9yeSBgL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL2xpYmMvc3RyaW5nJwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1iY29w
eS5vIGB0ZXN0IC1mICdiY29weS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4x
Ni4wL25ld2xpYi9saWJjL3N0cmluZy8nYGJjb3B5LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtYnplcm8ubyBgdGVzdCAtZiAnYnplcm8u
YycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJp
bmcvJ2BiemVyby5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVf
TElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3Rv
cmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9f
IC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9v
dC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2
XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9p
bmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpv
bmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVj
dG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBB
Q0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBc
IiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8t
YnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAg
IC1jIC1vIGxpYl9hLWluZGV4Lm8gYHRlc3QgLWYgJ2luZGV4LmMnIHx8IGVjaG8gJy4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nLydgaW5kZXguYwp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Ry
aW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1tZW1jaHIu
byBgdGVzdCAtZiAnbWVtY2hyLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RyaW5nLydgbWVtY2hyLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtbWVtY21wLm8gYHRlc3QgLWYgJ21lbWNt
cC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0
cmluZy8nYG1lbWNtcC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhB
VkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVu
c3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1
bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mt
cm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2Mv
eDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVk
LXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJv
dGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGli
LyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5
cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAt
RFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2
LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGli
LTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1m
bm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0
LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVk
LXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVz
IC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1w
cm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50
ICAgIC1jIC1vIGxpYl9hLW1lbWNweS5vIGB0ZXN0IC1mICdtZW1jcHkuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2BtZW1jcHkuYwp4
ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAt
TzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1t
ZW1tb3ZlLm8gYHRlc3QgLWYgJ21lbW1vdmUuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2BtZW1tb3ZlLmMKeDg2XzY0LXBjLWxpbnV4
LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2EtbWVtc2V0Lm8gYHRlc3Qg
LWYgJ21lbXNldC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0cmluZy8nYG1lbXNldC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5J
T1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
dG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0Rf
XyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNy
L2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRl
IC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8t
c3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRF
UlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9z
cy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3Nz
L3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3
bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3
bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4v
Li4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxM
X05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEg
LWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0
IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndp
bmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAt
V3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXIt
c3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXJpbmRleC5vIGB0ZXN0IC1mICdyaW5kZXguYycgfHwg
ZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2By
aW5kZXguYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1
ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9z
dGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1w
Yy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVk
ZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAt
Zm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRp
bWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2Nr
cyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxp
YXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZh
bHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAt
Zm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdF
X05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9W
RVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQ
QUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvc3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0
aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1w
b2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1m
bm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1n
IC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBl
cyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAt
byBsaWJfYS1zdHJjYXNlY21wLm8gYHRlc3QgLWYgJ3N0cmNhc2VjbXAuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2BzdHJjYXNlY21w
LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4
Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5j
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94
ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGlu
dXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAt
eDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1l
eGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90
YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lP
Tj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FH
RV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAg
ICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGli
X2Etc3RyY2F0Lm8gYHRlc3QgLWYgJ3N0cmNhdC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZy8nYHN0cmNhdC5jCng4Nl82NC1wYy1saW51
eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8y
IC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXN0cmNoci5vIGB0ZXN0
IC1mICdzdHJjaHIuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9zdHJpbmcvJ2BzdHJjaHIuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlO
SU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNE
X18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vz
ci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVk
ZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5v
LXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5U
RVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1M
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9z
cy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5l
d2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5l
d2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FM
TF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zdHJjbXAubyBgdGVzdCAtZiAnc3RyY21wLmMnIHx8
IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nLydg
c3RyY21wLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJD
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
eDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5v
c3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4
Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQt
cGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9s
d2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1
ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3Ig
LWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FH
RV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1E
UEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWls
dGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUt
cG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAt
Zm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAt
ZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlw
ZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMg
LW8gbGliX2Etc3RyY29sbC5vIGB0ZXN0IC1mICdzdHJjb2xsLmMnIHx8IGVjaG8gJy4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nLydgc3RyY29sbC5jCng4Nl82
NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
dHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXN0cmNw
eS5vIGB0ZXN0IC1mICdzdHJjcHkuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2BzdHJjcHkuYwp4ODZfNjQtcGMtbGludXgtZ251LWdj
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUg
X19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlz
eXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94
ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxM
T1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
eDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFS
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NU
UklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nIC1PMiAtRE1JU1NJ
TkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zdHJjc3BuLm8gYHRlc3QgLWYgJ3N0
cmNzcG4uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdHJpbmcvJ2BzdHJjc3BuLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2Etc3RyZHVwLm8gYHRlc3QgLWYgJ3N0cmR1cC5jJyB8fCBlY2hv
ICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZy8nYHN0cmR1
cC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGlu
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxp
bnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJ
T049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tB
R0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLXN0cmR1cF9yLm8gYHRlc3QgLWYgJ3N0cmR1cF9yLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4u
Ly4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nLydgc3RyZHVwX3IuYwp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Ry
aW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zdHJlcnJv
ci5vIGB0ZXN0IC1mICdzdHJlcnJvci5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3N0cmluZy8nYHN0cmVycm9yLmMKeDg2XzY0LXBjLWxpbnV4LWdu
dS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9f
IC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRl
IC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0
IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNI
X0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0x
LjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FH
RV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4g
LUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIgLURN
SVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0
LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxp
bmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5
bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3Rk
PWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNs
YXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc3RyZXJyb3Jfci5vIGB0ZXN0
IC1mICdzdHJlcnJvcl9yLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvc3RyaW5nLydgc3RyZXJyb3Jfci5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2Nj
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
IC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBf
X0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5
c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hl
bi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9t
aXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1y
ZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJs
ZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0
LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1l
bnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExP
V19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94
ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJO
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RS
SU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lO
R19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXN0cmxjYXQubyBgdGVzdCAtZiAnc3Ry
bGNhdC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJj
L3N0cmluZy8nYHN0cmxjYXQuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18g
LURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xz
L3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUg
X19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Ny
b3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIv
Z2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5v
LXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNr
LXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBU
UyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25l
d2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGli
bm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZf
NjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwi
IC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwg
MS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1F
UyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8t
b21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5v
LXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRh
YmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJp
Y3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRl
bWVudCAgICAtYyAtbyBsaWJfYS1zdHJsY3B5Lm8gYHRlc3QgLWYgJ3N0cmxjcHkuYycgfHwgZWNo
byAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2BzdHJs
Y3B5LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3Rk
aW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82
NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMt
bGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZu
by1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9O
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVS
U0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFD
S0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGlu
ICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8g
bGliX2Etc3RybGVuLm8gYHRlc3QgLWYgJ3N0cmxlbi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8u
Li9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZy8nYHN0cmxlbi5jCng4Nl82NC1wYy1s
aW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9f
bGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYv
aW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9p
bmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9J
Mzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2lu
Y2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAt
RFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwi
XCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcg
LU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5v
LXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6
ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAt
Zm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNp
bmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVl
IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXN0cmx3ci5vIGB0
ZXN0IC1mICdzdHJsd3IuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zdHJpbmcvJ2BzdHJsd3IuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9f
TUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVl
QlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0g
L3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5j
bHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAt
Zm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdf
SU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJn
bG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1c
Im5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1c
Im5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lT
Q0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zdHJuY2FzZWNtcC5vIGB0ZXN0IC1mICdzdHJu
Y2FzZWNtcC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL3N0cmluZy8nYHN0cm5jYXNlY21wLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZU0NB
TExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc3RybmNhdC5vIGB0ZXN0IC1mICdzdHJuY2F0LmMn
IHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5n
Lydgc3RybmNhdC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVf
TElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3Rv
cmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9f
IC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9v
dC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2
XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9p
bmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpv
bmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVj
dG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBB
Q0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBc
IiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8t
YnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAg
IC1jIC1vIGxpYl9hLXN0cm5jbXAubyBgdGVzdCAtZiAnc3RybmNtcC5jJyB8fCBlY2hvICcuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZy8nYHN0cm5jbXAuYwp4
ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4
Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9z
aXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1n
bnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0
L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2Vw
dGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rhcmct
aW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwi
MS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JV
R1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xp
YmMvc3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAt
TzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1z
dHJuY3B5Lm8gYHRlc3QgLWYgJ3N0cm5jcHkuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2BzdHJuY3B5LmMKeDg2XzY0LXBjLWxpbnV4
LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etc3Rybmxlbi5vIGB0ZXN0
IC1mICdzdHJubGVuLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RyaW5nLydgc3Rybmxlbi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19N
SU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVC
U0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAv
dXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNs
dWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJh
bWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9u
ZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02
NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3Rv
dHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1m
bm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19J
TlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmds
b3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwi
bmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19TWVND
QUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXN0cnBicmsubyBgdGVzdCAtZiAnc3RycGJyay5j
JyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmlu
Zy8nYHN0cnBicmsuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZF
X0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0
b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5f
XyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJv
b3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4
Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
aW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16
b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZu
by1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVy
LWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJp
Y3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51
c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3Rl
Y3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8g
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMg
LUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQ
QUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4w
XCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0x
LjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5v
LWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
ICAtYyAtbyBsaWJfYS1zdHJyY2hyLm8gYHRlc3QgLWYgJ3N0cnJjaHIuYycgfHwgZWNobyAnLi4v
Li4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2BzdHJyY2hyLmMK
eDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1c
IjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9C
VUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAg
LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Et
c3Ryc2VwLm8gYHRlc3QgLWYgJ3N0cnNlcC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZy8nYHN0cnNlcC5jCng4Nl82NC1wYy1saW51eC1n
bnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhf
XyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVk
ZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2
NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAt
Zm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQg
LW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2lu
ZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1X
c3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1z
dGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFD
SF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUg
LUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJn
bG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FH
RV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tB
R0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUku
IC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8yIC1E
TUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmlj
dC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJs
aW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFz
eW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0
ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVj
bGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXN0cnNwbi5vIGB0ZXN0IC1m
ICdzdHJzcG4uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdHJpbmcvJ2BzdHJzcG4uYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9T
X18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rv
b2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18g
LVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9s
aWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAt
bW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBv
aW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZu
by1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcg
LWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVz
IC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0
YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJS
VVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
bGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94
ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xp
YlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4u
L25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9O
QU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1m
bm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAt
bW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5k
LXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdz
dHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0
YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zdHJ0b2subyBgdGVzdCAtZiAnc3RydG9rLmMnIHx8IGVj
aG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nLydgc3Ry
dG9rLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3Rk
aW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82
NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMt
bGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3
aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZu
by1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1p
emUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3Mg
LWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFz
aW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1
ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZu
by1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9O
QU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVS
U0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFD
S0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGlu
ICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9p
bnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5v
LXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAt
Zm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMg
LVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8g
bGliX2Etc3RydG9rX3IubyBgdGVzdCAtZiAnc3RydG9rX3IuYycgfHwgZWNobyAnLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2BzdHJ0b2tfci5jCng4Nl82
NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0
IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhl
bi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80
LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9z
cmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92
ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmct
Y2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNo
cm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdu
dTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJh
dGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9u
cyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xp
YlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2
LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQ
T1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9z
dHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAt
ZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1v
cHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJs
b2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3Qt
YWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2Vk
LXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXN0cnVw
ci5vIGB0ZXN0IC1mICdzdHJ1cHIuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2BzdHJ1cHIuYwp4ODZfNjQtcGMtbGludXgtZ251LWdj
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUg
X19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlz
eXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94
ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxM
T1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3Mv
eDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1l
bGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYu
MC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFS
TkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NU
UklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nIC1PMiAtRE1JU1NJ
TkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3Zl
cmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1j
YWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hy
b25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251
OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0
aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS1zdHJ4ZnJtLm8gYHRlc3QgLWYgJ3N0
cnhmcm0uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9zdHJpbmcvJ2BzdHJ4ZnJtLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19f
IC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29s
cy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMv
bWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1V
IF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9j
cm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGli
L2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1u
by1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2lu
dGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8t
cmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1m
bm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAt
V25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFj
ay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQ
VFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xp
Ym5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2
XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJc
IDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFN
RVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5v
LW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1u
by1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10
YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3Ry
aWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0
ZW1lbnQgICAgLWMgLW8gbGliX2Etc3Ryc3RyLm8gYHRlc3QgLWYgJ3N0cnN0ci5jJyB8fCBlY2hv
ICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZy8nYHN0cnN0
ci5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3Np
eCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94
ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGlu
YyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxp
bnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lw
LXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1J
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8t
ZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
dGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4w
L25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82
NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFN
RT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJ
T049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tB
R0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXds
aWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAg
ICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50
ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1y
ZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZu
by1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1X
bm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxp
Yl9hLXN3YWIubyBgdGVzdCAtZiAnc3dhYi5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZy8nYHN3YWIuYwp4ODZfNjQtcGMtbGludXgtZ251
LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18g
LVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUg
LWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQg
LUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZu
by1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1t
bm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQt
dGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0
cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3Rh
dGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hf
QUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1C
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xv
c3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEu
MTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0Vf
VEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdF
X1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAt
SS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nIC1PMiAtRE1J
U1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qt
b3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGlu
Zy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3lu
Y2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9
Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xh
cmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS11X3N0cmVyci5vIGB0ZXN0IC1m
ICd1X3N0cmVyci5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xp
Yi9saWJjL3N0cmluZy8nYHVfc3RyZXJyLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01J
TklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRy
YXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJh
cy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJT
RF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91
c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1
ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFt
ZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25l
IC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0
IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90
eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZu
by1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lO
VEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVu
LWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0
L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmds
b3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xv
c3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJu
ZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJu
ZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8u
Li8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZU0NB
TExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd2NzY2F0Lm8gYHRlc3QgLWYgJ3djc2NhdC5jJyB8
fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZy8n
YHdjc2NhdC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElC
QyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVk
ZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUg
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRl
L3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1u
b3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14
ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0
LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNs
dWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUg
IC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9w
dGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxv
Y2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1h
bGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQt
dmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9y
IC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9u
ZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tB
R0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdF
X1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAt
RFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYu
MC9uZXdsaWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVp
bHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1l
LXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUg
LWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQg
LWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5
cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1j
IC1vIGxpYl9hLXdjc2Noci5vIGB0ZXN0IC1mICd3Y3NjaHIuYycgfHwgZWNobyAnLi4vLi4vLi4v
Li4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2B3Y3NjaHIuYwp4ODZfNjQt
cGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAt
VSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41
LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3Jj
L2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9p
bmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVy
ZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNh
bGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJv
bm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5
OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRp
b24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMg
LURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGli
Yy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJc
IiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4w
XCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9S
VD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3Ry
aW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcg
LWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0
aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9j
a3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFs
aWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12
YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13Y3NjbXAu
byBgdGVzdCAtZiAnd2NzY21wLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2
LjAvbmV3bGliL2xpYmMvc3RyaW5nLydgd2NzY21wLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2Mg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUg
LURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9f
RnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lz
dGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVu
L2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9X
X0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4
Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAv
bGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5B
TUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJ
Tkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8u
Li8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5H
X1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJm
bG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2Fs
bHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9u
b3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5
IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlv
bi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd2NzY29sbC5vIGB0ZXN0IC1mICd3Y3Nj
b2xsLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RyaW5nLydgd2NzY29sbC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAt
REhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMv
eGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21p
bmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBf
X3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFz
L21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jv
c3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9n
Y2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8t
cmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRl
ciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJl
b3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5v
LXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdu
by11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2st
cHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRT
IC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3
bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJu
b3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82
NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIg
LURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAx
LjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3
bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVT
IC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1v
bWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8t
cmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFi
bGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmlj
dC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVt
ZW50ICAgIC1jIC1vIGxpYl9hLXdjc2NweS5vIGB0ZXN0IC1mICd3Y3NjcHkuYycgfHwgZWNobyAn
Li4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2B3Y3NjcHku
Ywp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2
L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUv
cG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51
eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14
ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4
Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3Rh
cmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQv
eDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9O
PVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdF
X0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGli
L2xpYmMvc3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAg
ICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVy
IC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVv
cmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8t
c3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25v
LXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJf
YS13Y3Njc3BuLm8gYHRlc3QgLWYgJ3djc2NzcG4uYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2B3Y3Njc3BuLmMKeDg2XzY0LXBjLWxp
bnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19s
aW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9p
bmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kz
ODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGli
LXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5j
bHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxm
L2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQ
QUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1E
UEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJc
IiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAt
TzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8t
c3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXpl
LXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1m
bm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2lu
ZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUg
LVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd2NzbGNhdC5vIGB0
ZXN0IC1mICd3Y3NsY2F0LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAv
bmV3bGliL2xpYmMvc3RyaW5nLydgd2NzbGNhdC5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1E
X19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4v
ZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
Li4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0Zy
ZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3Rl
bSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9p
bmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
IC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19I
V19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZf
NjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xp
Ymdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1F
PVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5H
PVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19T
WVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxv
dyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxz
ICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91
cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAt
V2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24t
YWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdjc2xjcHkubyBgdGVzdCAtZiAnd2NzbGNw
eS5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0
cmluZy8nYHdjc2xjcHkuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURI
QVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hl
bnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5p
LW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19z
dW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9t
aW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3Nz
LXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2Nj
L3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJl
ZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXBy
b3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAt
Qi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xp
Yi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhl
bi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRh
Z2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20v
bmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9z
eXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQg
LURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1E
UEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4x
Ni4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xp
Yi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAt
Zm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21p
dC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJl
ZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxl
cyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3Qt
cHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVu
dCAgICAtYyAtbyBsaWJfYS13Y3NsZW4ubyBgdGVzdCAtZiAnd2NzbGVuLmMnIHx8IGVjaG8gJy4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nLydgd2NzbGVuLmMK
eDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94
ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1p
c3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bv
c2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZf
NjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgt
Z251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2
XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82
NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJp
Y3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2li
bGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1h
c3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1z
dGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2Rl
Y2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNl
cHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIv
dG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94
ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJn
LWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4
Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwi
bmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1c
IjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9C
VUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9s
aWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAg
LU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAt
Zm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3Jk
ZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0
cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11
bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Et
d2NzbmNhdC5vIGB0ZXN0IC1mICd3Y3NuY2F0LmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nLydgd2NzbmNhdC5jCng4Nl82NC1wYy1saW51
eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGlu
dXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5j
bHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNs
dWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVk
ZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUv
aXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWIt
NC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1P
MSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1t
NjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVu
d2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxs
IC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRl
ci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2
TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lz
dGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1
ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9s
aWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZf
NjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFD
S0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBB
Q0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIg
LUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8y
IC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0
cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1z
aWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5v
LWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcg
LXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1X
ZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9hLXdjc25jbXAubyBgdGVz
dCAtZiAnd2NzbmNtcC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL3N0cmluZy8nYHdjc25jbXAuYwp4ODZfNjQtcGMtbGludXgtZ251LWdjYyAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZSAtRF9f
TUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4u
L2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xpbnV4X18gLVUgX19GcmVl
QlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
Ly4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0g
L3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5jbHVkZSAtaXN5c3RlbSAv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlL2lwdjQgLUkvdmFyL3Rt
cC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVu
LTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5j
bHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAt
Zm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdf
SU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVs
YXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZf
NjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9w
b3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQu
MS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNsdWRlIC1CL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbGli
Z2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9saWJn
bG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1c
Im5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQQUNLQUdFX1NUUklORz1c
Im5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4u
Ly4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lT
Q0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cg
LU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAg
LW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMt
dW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdh
bGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFm
dGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13Y3NuY3B5Lm8gYHRlc3QgLWYgJ3djc25jcHku
YycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJp
bmcvJ2B3Y3NuY3B5LmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFW
RV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9p
bmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5z
dG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2lu
Y2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1v
cy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3Vu
X18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWlu
aS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1y
b290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94
ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0
YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9t
L2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZn
cnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQt
em9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1m
bm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRl
ci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3Ry
aWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVu
dXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90
ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIv
dmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dv
cmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIv
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4t
ZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdl
L2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25l
d2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9u
ZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lz
IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1E
UEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYu
MFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWIt
MS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZu
by1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQt
ZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQt
em9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMg
LW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXBy
b3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQg
ICAgLWMgLW8gbGliX2Etd2Nzbmxlbi5vIGB0ZXN0IC1mICd3Y3NubGVuLmMnIHx8IGVjaG8gJy4u
Ly4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nLydgd2Nzbmxlbi5j
Cng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVfTElCQyAtaXN5c3Rl
bSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4y
L3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9wb3NpeCAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3RvcmUgIC1pc3lzdGVt
IC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4NiAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYv
eDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9fIC1ub3N0ZGluYyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS9w
b3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9vdC14ODZfNjQveDg2
XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2XzY0LXBjLWxpbnV4
LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4
Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZf
NjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0
aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9pbmNsdWRlIC1JL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpvbmUgIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVjdG9yIC1mbm8tZXhj
ZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvdGFy
Zy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9u
L3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL25l
d2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94
ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAtTC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBBQ0tBR0VfTkFNRT1c
Im5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1ZFUlNJT049
XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBcIiAtRFBBQ0tBR0Vf
QlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8tYnVpbHRpbiAgICAg
IC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIg
LWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9y
ZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1z
dHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8t
dW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAgIC1jIC1vIGxpYl9h
LXdjc3BicmsubyBgdGVzdCAtZiAnd2NzcGJyay5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9u
ZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZy8nYHdjc3BicmsuYwp4ODZfNjQtcGMtbGlu
dXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zhci90bXAvcG9y
dGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEu
Mi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82NCAtVSBfX2xp
bnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0ZW0gL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2lu
Y2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUvNC41LjMvaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQvc3JjL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
L2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1vdmVyZmxvdyAt
TzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAt
bTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11
bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2Fs
bCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0
ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlvbnMgLURfSTM4
Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAt
ZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIt
eDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9w
b3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHVi
ZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5jbHVkZSAtaXN5
c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQu
MS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9pbmNs
dWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYv
bGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2
XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXdsaWJcIiAtRFBB
Q0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4xNi4wXCIgLURQ
QUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JFUE9SVD1cIlwi
IC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvc3RyaW5nIC1P
MiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIgLWcgLWZuby1z
dHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUt
c2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZu
by1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5n
IC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAt
V2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13Y3NyY2hyLm8gYHRl
c3QgLWYgJ3djc3JjaHIuYycgfHwgZWNobyAnLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEuMTYuMC9u
ZXdsaWIvbGliYy9zdHJpbmcvJ2B3Y3NyY2hyLmMKeDg2XzY0LXBjLWxpbnV4LWdudS1nY2MgLWlz
eXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUgLURf
X01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9l
eHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4
dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8u
Li9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51eF9fIC1VIF9fRnJl
ZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNsdWRlIC1pc3lzdGVt
IC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1ZGUgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRlIC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9pcHY0IC1JL3Zhci90
bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hl
bi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4veGVuL2lu
Y2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1m
cmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16
b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAt
bTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJv
dG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAg
LWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZNQUNIX0FMTE9XX0hX
X0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQt
eGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11
bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2
XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVkZSAtQi92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xpYmdsb3NzL3g4Nl82
NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbGli
Z2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNLQUdFX1RBUk5BTUU9
XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFDS0FHRV9TVFJJTkc9
XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAtSS4gLUkuLi8uLi8u
Li8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIgLURNSVNTSU5HX1NZ
U0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3RyaWN0LW92ZXJmbG93
IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNpYmxpbmctY2FsbHMg
IC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8tYXN5bmNocm9ub3Vz
LXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAtc3RkPWdudTk5IC1X
YWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1h
ZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd2Nzc3BuLm8gYHRlc3QgLWYgJ3djc3Nwbi5j
JyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmlu
Zy8nYHdjc3Nwbi5jCng4Nl82NC1wYy1saW51eC1nbnUtZ2NjIC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlIC1EX19NSU5JT1NfXyAtREhBVkVf
TElCQyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5j
bHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vdG9vbHMveGVuc3Rv
cmUgIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1w
dmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNs
dWRlL3g4NiAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3Mv
aW5jbHVkZS94ODYveDg2XzY0IC1VIF9fbGludXhfXyAtVSBfX0ZyZWVCU0RfXyAtVSBfX3N1bl9f
IC1ub3N0ZGluYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlv
bi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmkt
b3MvaW5jbHVkZS9wb3NpeCAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vY3Jvc3Mtcm9v
dC14ODZfNjQveDg2XzY0LXhlbi1lbGYvaW5jbHVkZSAtaXN5c3RlbSAvdXNyL2xpYi9nY2MveDg2
XzY0LXBjLWxpbnV4LWdudS80LjUuMy9pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2Uv
cG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1
YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vbHdpcC14ODZfNjQvc3JjL2luY2x1ZGUvaXB2NCAtSS92YXIvdG1wL3BvcnRhZ2UvcG9ydGFn
ZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9p
bmNsdWRlIC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3hlbi9pbmNsdWRlIC1tbm8tcmVkLXpv
bmUgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5v
LW9wdGltaXplLXNpYmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXIt
YmxvY2tzIC1mbm8tYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmlj
dC1hbGlhc2luZyAtc3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVz
ZWQtdmFsdWUgLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgIC1mbm8tc3RhY2stcHJvdGVj
dG9yIC1mbm8tZXhjZXB0aW9ucyAtRF9JMzg2TUFDSF9BTExPV19IV19JTlRFUlJVUFRTIC1CL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliLyAt
aXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnVi
LTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVs
Zi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9h
cHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL2luY2x1ZGUgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2Uv
YXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3
bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy94ODZfNjQgLUwvdmFyL3RtcC9wb3J0
YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4y
L3N0dWJkb20vbmV3bGliLXg4Nl82NC94ODZfNjQteGVuLWVsZi9saWJnbG9zcy9saWJub3N5cyAt
TC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIv
d29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWItMS4xNi4wL2xpYmdsb3NzL3g4Nl82NCAtRFBB
Q0tBR0VfTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9UQVJOQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1ZFUlNJT049XCIxLjE2LjBcIiAtRFBBQ0tBR0VfU1RSSU5HPVwibmV3bGliXCAxLjE2LjBc
IiAtRFBBQ0tBR0VfQlVHUkVQT1JUPVwiXCIgLUkuIC1JLi4vLi4vLi4vLi4vLi4vbmV3bGliLTEu
MTYuMC9uZXdsaWIvbGliYy9zdHJpbmcgLU8yIC1ETUlTU0lOR19TWVNDQUxMX05BTUVTIC1mbm8t
YnVpbHRpbiAgICAgIC1PMiAtZyAtZm5vLXN0cmljdC1vdmVyZmxvdyAtTzEgLWZuby1vbWl0LWZy
YW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzICAtbTY0IC1tbm8tcmVkLXpv
bmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzIC1t
NjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1nbnU5OSAtV2FsbCAtV3N0cmljdC1wcm90
b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50ICAg
IC1jIC1vIGxpYl9hLXdjc3N0ci5vIGB0ZXN0IC1mICd3Y3NzdHIuYycgfHwgZWNobyAnLi4vLi4v
Li4vLi4vLi4vbmV3bGliLTEuMTYuMC9uZXdsaWIvbGliYy9zdHJpbmcvJ2B3Y3NzdHIuYwp4ODZf
NjQtcGMtbGludXgtZ251LWdjYyAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBw
LWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0
cmFzL21pbmktb3MvaW5jbHVkZSAtRF9fTUlOSU9TX18gLURIQVZFX0xJQkMgLWlzeXN0ZW0gL3Zh
ci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3Jr
L3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXggLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL3Rvb2xzL3hlbnN0b3JlICAtaXN5c3RlbSAvdmFy
L3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsv
eGVuLTQuMS4yL3N0dWJkb20vLi4vZXh0cmFzL21pbmktb3MvaW5jbHVkZS94ODYgLWlzeXN0ZW0g
L3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93
b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2L3g4Nl82
NCAtVSBfX2xpbnV4X18gLVUgX19GcmVlQlNEX18gLVUgX19zdW5fXyAtbm9zdGRpbmMgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUvcG9zaXgg
LWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1
Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2Nyb3NzLXJvb3QteDg2XzY0L3g4Nl82NC14
ZW4tZWxmL2luY2x1ZGUgLWlzeXN0ZW0gL3Vzci9saWIvZ2NjL3g4Nl82NC1wYy1saW51eC1nbnUv
NC41LjMvaW5jbHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxh
dGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbHdpcC14ODZfNjQv
c3JjL2luY2x1ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRp
b24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3Ny
Yy9pbmNsdWRlL2lwdjQgLUkvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94
ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vaW5jbHVkZSAtSS92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi94ZW4vaW5jbHVkZSAtbW5vLXJlZC16b25lICAtZm5vLXN0cmljdC1v
dmVyZmxvdyAtTzEgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgLWZuby1vcHRpbWl6ZS1zaWJsaW5n
LWNhbGxzICAtbTY0IC1tbm8tcmVkLXpvbmUgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLWFzeW5j
aHJvbm91cy11bndpbmQtdGFibGVzIC1tNjQgLWcgLWZuby1zdHJpY3QtYWxpYXNpbmcgLXN0ZD1n
bnU5OSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXZhbHVlIC1XZGVjbGFy
YXRpb24tYWZ0ZXItc3RhdGVtZW50ICAtZm5vLXN0YWNrLXByb3RlY3RvciAtZm5vLWV4Y2VwdGlv
bnMgLURfSTM4Nk1BQ0hfQUxMT1dfSFdfSU5URVJSVVBUUyAtQi92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi8gLWlzeXN0ZW0gL3Zhci90bXAv
cG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00
LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0LXhlbi1lbGYvbmV3bGliL3RhcmctaW5j
bHVkZSAtaXN5c3RlbSAvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4t
cHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLTEuMTYuMC9uZXdsaWIv
bGliYy9pbmNsdWRlIC1CL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVu
LXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14ODZfNjQveDg2XzY0
LXhlbi1lbGYvbGliZ2xvc3MveDg2XzY0IC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1l
bXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi14
ODZfNjQveDg2XzY0LXhlbi1lbGYvbGliZ2xvc3MvbGlibm9zeXMgLUwvdmFyL3RtcC9wb3J0YWdl
L3BvcnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0
dWJkb20vbmV3bGliLTEuMTYuMC9saWJnbG9zcy94ODZfNjQgLURQQUNLQUdFX05BTUU9XCJuZXds
aWJcIiAtRFBBQ0tBR0VfVEFSTkFNRT1cIm5ld2xpYlwiIC1EUEFDS0FHRV9WRVJTSU9OPVwiMS4x
Ni4wXCIgLURQQUNLQUdFX1NUUklORz1cIm5ld2xpYlwgMS4xNi4wXCIgLURQQUNLQUdFX0JVR1JF
UE9SVD1cIlwiIC1JLiAtSS4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMv
c3RyaW5nIC1PMiAtRE1JU1NJTkdfU1lTQ0FMTF9OQU1FUyAtZm5vLWJ1aWx0aW4gICAgICAtTzIg
LWcgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8xIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8t
b3B0aW1pemUtc2libGluZy1jYWxscyAgLW02NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1i
bG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0
LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNl
ZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAgICAtYyAtbyBsaWJfYS13Y3N3
aWR0aC5vIGB0ZXN0IC1mICd3Y3N3aWR0aC5jJyB8fCBlY2hvICcuLi8uLi8uLi8uLi8uLi9uZXds
aWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZy8nYHdjc3dpZHRoLmMKeDg2XzY0LXBjLWxpbnV4
LWdudS1nY2MgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24v
eGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tLy4uL2V4dHJhcy9taW5pLW9z
L2luY2x1ZGUgLURfX01JTklPU19fIC1ESEFWRV9MSUJDIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRh
Z2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIv
c3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi90b29scy94ZW5zdG9yZSAgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFn
ZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9z
dHViZG9tLy4uL2V4dHJhcy9taW5pLW9zL2luY2x1ZGUveDg2IC1pc3lzdGVtIC92YXIvdG1wL3Bv
cnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4x
LjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3g4Ni94ODZfNjQgLVUgX19saW51
eF9fIC1VIF9fRnJlZUJTRF9fIC1VIF9fc3VuX18gLW5vc3RkaW5jIC1pc3lzdGVtIC92YXIvdG1w
L3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4t
NC4xLjIvc3R1YmRvbS8uLi9leHRyYXMvbWluaS1vcy9pbmNsdWRlL3Bvc2l4IC1pc3lzdGVtIC92
YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29y
ay94ZW4tNC4xLjIvc3R1YmRvbS9jcm9zcy1yb290LXg4Nl82NC94ODZfNjQteGVuLWVsZi9pbmNs
dWRlIC1pc3lzdGVtIC91c3IvbGliL2djYy94ODZfNjQtcGMtbGludXgtZ251LzQuNS4zL2luY2x1
ZGUgLWlzeXN0ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2
Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2x3aXAteDg2XzY0L3NyYy9pbmNsdWRl
IC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdy
dWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9sd2lwLXg4Nl82NC9zcmMvaW5jbHVkZS9p
cHY0IC1JL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00
LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL2luY2x1ZGUgLUkvdmFyL3RtcC9wb3J0YWdlL3Bv
cnRhZ2UvYXBwLWVtdWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJk
b20vLi4veGVuL2luY2x1ZGUgLW1uby1yZWQtem9uZSAgLWZuby1zdHJpY3Qtb3ZlcmZsb3cgLU8x
IC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAgLW02
NCAtbW5vLXJlZC16b25lIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby1hc3luY2hyb25vdXMtdW53
aW5kLXRhYmxlcyAtbTY0IC1nIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1zdGQ9Z251OTkgLVdhbGwg
LVdzdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC12YWx1ZSAtV2RlY2xhcmF0aW9uLWFmdGVy
LXN0YXRlbWVudCAgLWZuby1zdGFjay1wcm90ZWN0b3IgLWZuby1leGNlcHRpb25zIC1EX0kzODZN
QUNIX0FMTE9XX0hXX0lOVEVSUlVQVFMgLUIvdmFyL3RtcC9wb3J0YWdlL3BvcnRhZ2UvYXBwLWVt
dWxhdGlvbi94ZW4tcHZncnViLTQuMS4yL3dvcmsveGVuLTQuMS4yL3N0dWJkb20vbmV3bGliLXg4
Nl82NC94ODZfNjQteGVuLWVsZi9uZXdsaWIvIC1pc3lzdGVtIC92YXIvdG1wL3BvcnRhZ2UvcG9y
dGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRv
bS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL25ld2xpYi90YXJnLWluY2x1ZGUgLWlzeXN0
ZW0gL3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2FwcC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEu
Mi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xpYi0xLjE2LjAvbmV3bGliL2xpYmMvaW5jbHVk
ZSAtQi92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hlbi1wdmdydWItNC4x
LjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82NC14ZW4tZWxmL2xp
Ymdsb3NzL3g4Nl82NCAtTC92YXIvdG1wL3BvcnRhZ2UvcG9ydGFnZS9hcHAtZW11bGF0aW9uL3hl
bi1wdmdydWItNC4xLjIvd29yay94ZW4tNC4xLjIvc3R1YmRvbS9uZXdsaWIteDg2XzY0L3g4Nl82
NC14ZW4tZWxmL2xpYmdsb3NzL2xpYm5vc3lzIC1ML3Zhci90bXAvcG9ydGFnZS9wb3J0YWdlL2Fw
cC1lbXVsYXRpb24veGVuLXB2Z3J1Yi00LjEuMi93b3JrL3hlbi00LjEuMi9zdHViZG9tL25ld2xp
Yi0xLjE2LjAvbGliZ2xvc3MveDg2XzY0IC1EUEFDS0FHRV9OQU1FPVwibmV3bGliXCIgLURQQUNL
QUdFX1RBUk5BTUU9XCJuZXdsaWJcIiAtRFBBQ0tBR0VfVkVSU0lPTj1cIjEuMTYuMFwiIC1EUEFD
S0FHRV9TVFJJTkc9XCJuZXdsaWJcIDEuMTYuMFwiIC1EUEFDS0FHRV9CVUdSRVBPUlQ9XCJcIiAt
SS4gLUkuLi8uLi8uLi8uLi8uLi9uZXdsaWItMS4xNi4wL25ld2xpYi9saWJjL3N0cmluZyAtTzIg
LURNSVNTSU5HX1NZU0NBTExfTkFNRVMgLWZuby1idWlsdGluICAgICAgLU8yIC1nIC1mbm8tc3Ry
aWN0LW92ZXJmbG93IC1PMSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciAtZm5vLW9wdGltaXplLXNp
YmxpbmctY2FsbHMgIC1tNjQgLW1uby1yZWQtem9uZSAtZm5vLXJlb3JkZXItYmxvY2tzIC1mbm8t
YXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgLW02NCAtZyAtZm5vLXN0cmljdC1hbGlhc2luZyAt
c3RkPWdudTk5IC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby11bnVzZWQtdmFsdWUgLVdk
ZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgICAgLWMgLW8gbGliX2Etd2NzeGZybS5vIGB0ZXN0
IC1mICd3Y3N4ZnJtLmMnIHx8IGVjaG8gJy4uLy4uLy4uLy4uLy4uL25ld2xpYi0xLjE2LjAvbmV3
bGliL2xpYmMvc3RyaW5nLydgd2NzeGZybS5jCg==

--_1301e820-637c-45fc-aa29-edc763a73098_
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

--_1301e820-637c-45fc-aa29-edc763a73098_--


From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:27:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:27:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJP3a-00029L-VF; Thu, 27 Oct 2011 05:27:39 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJHlZ-0006bh-HN
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 21:40:34 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319690396!60826659!1
X-Originating-IP: [208.97.132.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32532 invoked from network); 27 Oct 2011 04:39:57 -0000
Received: from caiajhbdcahe.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.74) by server-2.tower-27.messagelabs.com with SMTP;
	27 Oct 2011 04:39:57 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id 393897EC063;
	Wed, 26 Oct 2011 21:40:29 -0700 (PDT)
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=u/JSNaK45gQQKF+A/j1j0e
	I2Flf0QzmDuU/9JUCVFrWBHXem5TvBRG35931qbQuGDkFDyJL7xl3UOmvuncCbCQ
	gNDUZrkxYuauHvZOgYV0O1u+14FNiUQ7YN2CJXXQIL7nHLAfmmqD+Kzvr1IOukh/
	8WGB05Pn67jB0RSCmHLwA=
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=iVuBJvS2/FMK
	TSkCoGyHghBpe3A=; b=GRou7Ytn+Tlv2RGKmKQhnTM7QuYuuL2Q19UfB0KLCQkQ
	LICgvBYDTPi4ele8sLkvdxDo3wDzko51FXfrS4R9/6uYaEv8aO2HD+mb/nUq2bPy
	HHm+te7R0ph3QDEdS/cdnngAPj16VzNpdYVWJn5Xzb8x1DX/7oWABTXixUyrN/U=
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-a20.g.dreamhost.com (Postfix) with ESMTPSA id 7B3AD7EC060; 
	Wed, 26 Oct 2011 21:40:28 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Message-Id: <patchbomb.1319690025@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Thu, 27 Oct 2011 00:33:45 -0400
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:16 -0700
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 0 of 9] [RFC] p2m fine-grained concurrency
	control
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 is an RFC on p2m fine-grained locking.

The p2m (in x86) is accessed today in an unsafe manner. Lookups
do not hold any locks or refs, and things like paging or sharing
can change their entries under their feet. Even the pages that 
may have been mapped as a result of a lookup may disappear.

This is an attempt at a solution. The gist is to lock 2MB aligned
ranges, exclusively, both for lookups and modifications. Callers
external to the p2m also get a ref on the underlying mfn. This 
prevents modifications to the p2m from happening while the caller
is relying on the translation, and ensures liveness of the 
underlying page. This also creates protected critical regions
whithin which the caller can bump the ref count of a page
(e.g. while establishing a mapping) without being exposed to 
races.

Locking of 2MB ranges is recursive, and we also allow a global 
lock on the full p2m for heavy handed operations like log-dirty.

There are plenty of design choices to discuss. The hope is to 
foster some input and progress on this. Some of the questions
below will make sense once you go through the patches:
- is locking on a 4kb basis necessary? (guess: no)
- we do some ugly things to fit 512 spinlocks in a page...
- can we hold a entry "captive" for the lifetime of a 
  foreign mapping? will that not collide against globally-
  locking p2m operations such as log dirty? We've decided
  no and yes, so far.
- is our current implementation for holding the global
  p2m lock in a non-exclusive manner too heavy handed on
  barriers and spinlocks? Could we just get away with atomics?
- we've considered read/writer locks. But many code paths
  require promotions not known a priori, and a deadlock-free
  promotion is risky to achieve. The semantics of exclusive
  locking simply make it easier (hah!) to reason.
- I'm unclear on the lifespan of some pointers in the nested 
  hvm code (e.g. nv_vvmcx). For p2m purposes, the entries are
  locked and unlocked in different functions, that I'm not sure
  happen in pair within the same scheduler slice. Would that 
  violate in_atomic()?
- note the last patch is massive. There is no way around 
  modifying all callers of p2m queries.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

 xen/arch/x86/mm/mm-locks.h         |   27 +-
 xen/arch/x86/mm/mm-locks.h         |   27 +
 xen/arch/x86/mm/mm-locks.h         |   11 +
 xen/arch/x86/mm/p2m-pod.c          |   40 +-
 xen/include/asm-x86/p2m.h          |    5 +
 xen/arch/x86/mm/mm-locks.h         |    9 +
 xen/arch/x86/mm/p2m-pod.c          |  145 +++++---
 xen/arch/x86/mm/p2m-pt.c           |    3 +
 xen/arch/x86/mm/p2m.c              |    7 +-
 xen/include/asm-x86/p2m.h          |   25 +-
 xen/arch/x86/mm/hap/private.h      |    1 +
 xen/arch/x86/mm/mm-locks.h         |   20 +-
 xen/arch/x86/mm/p2m-ept.c          |    1 +
 xen/arch/x86/mm/p2m-lock.h         |  613 +++++++++++++++++++++++++++++++++++++
 xen/arch/x86/mm/p2m-pod.c          |    1 +
 xen/arch/x86/mm/p2m-pt.c           |    1 +
 xen/arch/x86/mm/p2m.c              |   24 +-
 xen/include/asm-x86/p2m.h          |    3 +-
 xen/arch/x86/mm/p2m-ept.c          |   15 +-
 xen/arch/x86/mm/p2m-lock.h         |   11 +-
 xen/arch/x86/mm/p2m-pt.c           |   82 +++-
 xen/arch/x86/mm/p2m.c              |   38 ++
 xen/include/asm-x86/p2m.h          |   40 +--
 xen/arch/x86/mm/hap/hap.c          |    2 +-
 xen/arch/x86/mm/hap/nested_hap.c   |   21 +-
 xen/arch/x86/mm/p2m-ept.c          |   26 +-
 xen/arch/x86/mm/p2m-pod.c          |   42 +-
 xen/arch/x86/mm/p2m-pt.c           |   20 +-
 xen/arch/x86/mm/p2m.c              |  185 +++++++----
 xen/include/asm-ia64/mm.h          |    5 +
 xen/include/asm-x86/p2m.h          |   45 ++-
 xen/arch/x86/cpu/mcheck/vmce.c     |    7 +-
 xen/arch/x86/debug.c               |    7 +-
 xen/arch/x86/domain.c              |   24 +-
 xen/arch/x86/domctl.c              |    9 +-
 xen/arch/x86/hvm/emulate.c         |   25 +-
 xen/arch/x86/hvm/hvm.c             |  126 ++++++-
 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        |    4 +
 xen/arch/x86/hvm/vmx/vmx.c         |   13 +-
 xen/arch/x86/hvm/vmx/vvmx.c        |   11 +-
 xen/arch/x86/mm.c                  |  126 ++++++-
 xen/arch/x86/mm/guest_walk.c       |   11 +
 xen/arch/x86/mm/hap/guest_walk.c   |   15 +-
 xen/arch/x86/mm/mem_event.c        |   28 +-
 xen/arch/x86/mm/mem_sharing.c      |   23 +-
 xen/arch/x86/mm/shadow/common.c    |    4 +-
 xen/arch/x86/mm/shadow/multi.c     |   67 +++-
 xen/arch/x86/physdev.c             |    9 +
 xen/arch/x86/traps.c               |   17 +-
 xen/common/grant_table.c           |   27 +-
 xen/common/memory.c                |    9 +
 xen/common/tmem_xen.c              |   21 +-
 xen/include/asm-x86/hvm/hvm.h      |    5 +-
 xen/include/asm-x86/hvm/vmx/vvmx.h |    1 +
 59 files changed, 1714 insertions(+), 401 deletions(-)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:28:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:28:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJP4Y-0002XM-EF; Thu, 27 Oct 2011 05:28:38 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJHla-0006bj-ER
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 21:40:34 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319690430!36799737!1
X-Originating-IP: [208.97.132.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3029 invoked from network); 27 Oct 2011 04:40:30 -0000
Received: from caiajhbdcagg.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.66) by server-2.tower-174.messagelabs.com with SMTP;
	27 Oct 2011 04:40:30 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id 085B47EC064;
	Wed, 26 Oct 2011 21:40:30 -0700 (PDT)
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=NcjX4KIxbi4m2L4Jq2lU6M5CHQt+2+CuccbxEcsipu0h
	tyz2R2tq1+NGDnhYF+o5lxXdF5NMrv2RyI/RVo36sJwh+4TZCucHDvN4v5DKKbvW
	Qz1RBQHf67YrwKbW7jg5tu/g81tXxZkP/KL9MEo3lj6gYqN4T3zBHXAUfhSTMWo=
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=jdofKCjiUjVorGECmG7H1iH4Lw8=; b=paPHXtVrl+b
	oJtN0jUPVRwuIuff+oXQ1v/bKlo8WfGXRXj+OVFKBnMGmG+W3BA4TR6C7JiY+ieZ
	4GmOTBB7sDMyVT1Tnpvf+1tKx7UdgCMCJUFFCYT58jk8DdhW0PiIn20EV65UeVhw
	rPK0vkXiraitdx/z9O6AlVKxWSOk5uus=
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-a20.g.dreamhost.com (Postfix) with ESMTPSA id 676A57EC060; 
	Wed, 26 Oct 2011 21:40:29 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 25b9a9966368aa63540f80c31958329f09535f96
Message-Id: <25b9a9966368aa63540f.1319690026@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1319690025@xdev.gridcentric.ca>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Thu, 27 Oct 2011 00:33:46 -0400
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:17 -0700
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 1 of 9] 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 a33af75083c7 -r 25b9a9966368 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 Thu Oct 27 05:29:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:29:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJP5O-0002ud-N1; Thu, 27 Oct 2011 05:29:30 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJHlb-0006bk-GC
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 21:40:35 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319690431!1833232!1
X-Originating-IP: [208.97.132.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28453 invoked from network); 27 Oct 2011 04:40:31 -0000
Received: from caiajhbdcbhh.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.177) by server-6.tower-21.messagelabs.com with SMTP;
	27 Oct 2011 04:40:31 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id C91867EC065;
	Wed, 26 Oct 2011 21:40:30 -0700 (PDT)
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=FUR2PT/J0KQFgTYyPXV2DjzKg/NOZFdb1lyyT3Rqq0Cl
	cLM6l/N/c3A7oRvOLdE28Ds7RRqR1TFMbEARiaK9WFcrScVPIYB7f9Xo6dPPH72d
	XqoGsSQU16tC2p37peLazZ1JyaBd7FCYN6xc4S2h1mtRNXoXS6zlyxUBXYuNPkM=
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=6TlE8VKacKH6ipz5VMasXNVE8d0=; b=cyM3pcKYwrs
	4NE7A9VZUGscp2tfI9fGxnOgA/sZt7ILJgAu8lO9jeisup3tEGOUScU1DJ2hZy0N
	dqbufFRvKhweaVokooTpW36Wf9jnKNWHdGRuiIW6GuvnRwldTrB4QpfS8kI1R377
	l10VxEeGav5PvzOqqcmdui0tv229NtIg=
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-a20.g.dreamhost.com (Postfix) with ESMTPSA id 35BB87EC060; 
	Wed, 26 Oct 2011 21:40:30 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: c915609e4235a3b10c653135f1a3cd6a188459ac
Message-Id: <c915609e4235a3b10c65.1319690027@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1319690025@xdev.gridcentric.ca>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Thu, 27 Oct 2011 00:33:47 -0400
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:17 -0700
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 2 of 9] 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 |  27 +++++++++++++++++++++++++++
 1 files changed, 27 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 25b9a9966368 -r c915609e4235 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,18 @@ 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)
+{
+    *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 +90,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. They cannot be recursive (yet, additional
+ * bookkepping is necessary) */
+#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) \
+    { _mm_enforce_order_lock_post(__LINE__, unlock_level); }                \
+
 static inline void mm_unlock(mm_lock_t *l)
 {
     if ( l->lock.recurse_cnt == 1 )
@@ -88,6 +110,11 @@ static inline void mm_unlock(mm_lock_t *
     spin_unlock_recursive(&l->lock);
 }
 
+static inline void mm_enforce_order_unlock(int unlock_level)
+{
+    __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 Thu Oct 27 05:30:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:30:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJP6E-0003IB-AB; Thu, 27 Oct 2011 05:30:22 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJHlb-0006bl-Po
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 21:40:36 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-16.tower-182.messagelabs.com!1319690432!889126!1
X-Originating-IP: [208.97.132.83]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19667 invoked from network); 27 Oct 2011 04:40:32 -0000
Received: from caiajhbdcaid.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.83) by server-16.tower-182.messagelabs.com with SMTP;
	27 Oct 2011 04:40:32 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id A910D7EC063;
	Wed, 26 Oct 2011 21:40:31 -0700 (PDT)
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=HmBRThaBppTkxbdRs7VGF4lhPbgOVVI+J/G9ht/emZQw
	iEcY2UEJQhAabvHvDmj1hdVF1FnVjxMtk5y0Ir/EPSilNGTRkww1Ag4+Et7j1lRD
	prr9xm2exQU/qVi4BM6WTwoDTYAprknlSnW72hh8p2x5FLyXQ1gQ82sMPk2s9E0=
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=YNy1Vu3WugPSYejA1AvsGIwmlv4=; b=pVIu9trwP40
	2eg4QBC4VltC4acXcKskDc0fipywvKdSvkZWs3VlBYOum3wg3eAp/NuMwrScO4QU
	L39SVEoJ5y5TYc5GJ1P1XE5ePh4u/fk40pmj1fS0qA9wnermQx4REK8+/bmTsMvP
	9GRmOIfOeOwA/AmBj+8H6lYIOtLzF3JI=
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-a20.g.dreamhost.com (Postfix) with ESMTPSA id 0391F7EC060; 
	Wed, 26 Oct 2011 21:40:30 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 332775f72a3055c47c2bc10a605ff2c1e9d0730e
Message-Id: <332775f72a3055c47c2b.1319690028@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1319690025@xdev.gridcentric.ca>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Thu, 27 Oct 2011 00:33:48 -0400
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:17 -0700
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 3 of 9] 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 |  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))==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->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=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 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-ordering
+     * 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

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:31:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:31:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJP7B-0003fy-Ij; Thu, 27 Oct 2011 05:31:21 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJHlc-0006bm-D4
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 21:40:37 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319690431!1833232!2
X-Originating-IP: [208.97.132.177]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28461 invoked from network); 27 Oct 2011 04:40:32 -0000
Received: from caiajhbdcbhh.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.177) by server-6.tower-21.messagelabs.com with SMTP;
	27 Oct 2011 04:40:32 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id 8EC467EC065;
	Wed, 26 Oct 2011 21:40:32 -0700 (PDT)
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=ndHNySguYT+nyvZgqlCx+Q8WD/O3iKH70cApfqLcI0M5
	7QXYtLdUHMAtqyDtF2r9V7bA8+ahze8VL3GHKIbXnd6jb4J5k44K4YOqEqbP7+tk
	boYawhq+VGc/B7vzc5lSIXmoH/nAMYmMw76tDFP21jWeO9C3TjjReEatoX5Kdhw=
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=/gVsx8xJR1NOIZ0tM/VtRK+6VOk=; b=pyuekknGe2x
	MnJ51sNYPgO3PAO5qQXm8jwTbd/MSsk35+dIWPSfRD/wVz75WBmEhLDqGKj8Vp3K
	V7yRE5HDYFNpPx74MP4mNj4SCXgrg61PLoKglWYO9XggHQAwGNAyjHp+dDQMGyT7
	rP2lAn6aiDAKA5TPUSouPbLQY5jK0AhI=
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-a20.g.dreamhost.com (Postfix) with ESMTPSA id DAFD97EC060; 
	Wed, 26 Oct 2011 21:40:31 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 981073d78f7f0c92a7f5a68479a174212cb5c160
Message-Id: <981073d78f7f0c92a7f5.1319690029@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1319690025@xdev.gridcentric.ca>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Thu, 27 Oct 2011 00:33:49 -0400
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:17 -0700
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 4 of 9] Rework locking in the PoD 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 |    9 ++
 xen/arch/x86/mm/p2m-pod.c  |  145 +++++++++++++++++++++++++++------------------
 xen/arch/x86/mm/p2m-pt.c   |    3 +
 xen/arch/x86/mm/p2m.c      |    7 +-
 xen/include/asm-x86/p2m.h  |   25 ++-----
 5 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:
    - 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>

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)
+
 /* Page alloc lock (per-domain)
  *
  * 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
  * Populate-on-demand functionality
  */
 
+/* PoD lock held on entry */
 static int
 p2m_pod_cache_add(struct p2m_domain *p2m,
                   struct page_info *page,
@@ -114,43 +115,42 @@ p2m_pod_cache_add(struct p2m_domain *p2m
         unmap_domain_page(b);
     }
 
+    /* First, take all pages off the domain list */
     lock_page_alloc(p2m);
-
-    /* First, take all pages off the domain list */
     for(i=0; i < 1 << order ; i++)
     {
         p = page + i;
         page_list_del(p, &d->page_list);
     }
 
-    /* Then add the first one to the appropriate populate-on-demand list */
-    switch(order)
-    {
-    case PAGE_ORDER_2M:
-        page_list_add_tail(page, &p2m->pod.super); /* lock: page_alloc */
-        p2m->pod.count += 1 << order;
-        break;
-    case PAGE_ORDER_4K:
-        page_list_add_tail(page, &p2m->pod.single); /* lock: page_alloc */
-        p2m->pod.count += 1;
-        break;
-    default:
-        BUG();
-    }
-
     /* Ensure that the PoD cache has never been emptied.  
      * This may cause "zombie domains" since the page will never be freed. */
     BUG_ON( d->arch.relmem != RELMEM_not_started );
 
     unlock_page_alloc(p2m);
 
+    /* Then add the first one to the appropriate populate-on-demand list */
+    switch(order)
+    {
+    case PAGE_ORDER_2M:
+        page_list_add_tail(page, &p2m->pod.super);
+        p2m->pod.count += 1 << order;
+        break;
+    case PAGE_ORDER_4K:
+        page_list_add_tail(page, &p2m->pod.single);
+        p2m->pod.count += 1;
+        break;
+    default:
+        BUG();
+    }
+
     return 0;
 }
 
 /* Get a page of size order from the populate-on-demand cache.  Will break
  * down 2-meg pages into singleton pages automatically.  Returns null if
- * a superpage is requested and no superpages are available.  Must be called
- * with the d->page_lock held. */
+ * a superpage is requested and no superpages are available. */
+/* PoD lock held on entry */
 static struct page_info * p2m_pod_cache_get(struct p2m_domain *p2m,
                                             unsigned long order)
 {
@@ -185,7 +185,7 @@ static struct page_info * p2m_pod_cache_
     case PAGE_ORDER_2M:
         BUG_ON( page_list_empty(&p2m->pod.super) );
         p = page_list_remove_head(&p2m->pod.super);
-        p2m->pod.count -= 1 << order; /* Lock: page_alloc */
+        p2m->pod.count -= 1 << order;
         break;
     case PAGE_ORDER_4K:
         BUG_ON( page_list_empty(&p2m->pod.single) );
@@ -197,16 +197,19 @@ static struct page_info * p2m_pod_cache_
     }
 
     /* Put the pages back on the domain page_list */
+    lock_page_alloc(p2m);
     for ( i = 0 ; i < (1 << order); i++ )
     {
         BUG_ON(page_get_owner(p + i) != p2m->domain);
         page_list_add_tail(p + i, &p2m->domain->page_list);
     }
+    unlock_page_alloc(p2m);
 
     return p;
 }
 
 /* Set the size of the cache, allocating or freeing as necessary. */
+/* PoD lock held on entry */
 static int
 p2m_pod_set_cache_target(struct p2m_domain *p2m, unsigned long pod_target, int preemptible)
 {
@@ -259,8 +262,6 @@ 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. */
-        lock_page_alloc(p2m);
-
         if ( (p2m->pod.count - pod_target) > SUPERPAGE_PAGES
              && !page_list_empty(&p2m->pod.super) )
             order = PAGE_ORDER_2M;
@@ -271,8 +272,6 @@ p2m_pod_set_cache_target(struct p2m_doma
 
         ASSERT(page != NULL);
 
-        unlock_page_alloc(p2m);
-
         /* Then free them */
         for ( i = 0 ; i < (1 << order) ; i++ )
         {
@@ -348,7 +347,7 @@ p2m_pod_set_mem_target(struct domain *d,
     int ret = 0;
     unsigned long populated;
 
-    p2m_lock(p2m);
+    pod_lock(p2m);
 
     /* P == B: Nothing to do. */
     if ( p2m->pod.entry_count == 0 )
@@ -377,7 +376,7 @@ p2m_pod_set_mem_target(struct domain *d,
     ret = p2m_pod_set_cache_target(p2m, pod_target, 1/*preemptible*/);
 
 out:
-    p2m_unlock(p2m);
+    pod_unlock(p2m);
 
     return ret;
 }
@@ -390,7 +389,7 @@ p2m_pod_empty_cache(struct domain *d)
 
     /* After this barrier no new PoD activities can happen. */
     BUG_ON(!d->is_dying);
-    spin_barrier(&p2m->lock.lock);
+    spin_barrier(&p2m->pod.lock.lock);
 
     lock_page_alloc(p2m);
 
@@ -431,7 +430,8 @@ p2m_pod_offline_or_broken_hit(struct pag
     if ( !(d = page_get_owner(p)) || !(p2m = p2m_get_hostp2m(d)) )
         return 0;
 
-    lock_page_alloc(p2m);
+    pod_lock(p2m);
+
     bmfn = mfn_x(page_to_mfn(p));
     page_list_for_each_safe(q, tmp, &p2m->pod.super)
     {
@@ -462,12 +462,14 @@ p2m_pod_offline_or_broken_hit(struct pag
         }
     }
 
-    unlock_page_alloc(p2m);
+    pod_unlock(p2m);
     return 0;
 
 pod_hit:
+    lock_page_alloc(p2m);
     page_list_add_tail(p, &d->arch.relmem_list);
     unlock_page_alloc(p2m);
+    pod_unlock(p2m);
     return 1;
 }
 
@@ -486,9 +488,9 @@ p2m_pod_offline_or_broken_replace(struct
     if ( unlikely(!p) )
         return;
 
-    p2m_lock(p2m);
+    pod_lock(p2m);
     p2m_pod_cache_add(p2m, p, PAGE_ORDER_4K);
-    p2m_unlock(p2m);
+    pod_unlock(p2m);
     return;
 }
 
@@ -512,6 +514,7 @@ p2m_pod_decrease_reservation(struct doma
     int steal_for_cache = 0;
     int pod = 0, nonpod = 0, ram = 0;
     
+    pod_lock(p2m);
 
     /* If we don't have any outstanding PoD entries, let things take their
      * course */
@@ -521,11 +524,10 @@ p2m_pod_decrease_reservation(struct doma
     /* Figure out if we need to steal some freed memory for our cache */
     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;
+        goto out;
 
     /* See what's in here. */
     /* FIXME: Add contiguous; query for PSE entries? */
@@ -547,14 +549,14 @@ p2m_pod_decrease_reservation(struct doma
 
     /* No populate-on-demand?  Don't need to steal anything?  Then we're done!*/
     if(!pod && !steal_for_cache)
-        goto out_unlock;
+        goto out_audit;
 
     if ( !nonpod )
     {
         /* All PoD: Mark the whole region invalid and tell caller
          * we're done. */
         set_p2m_entry(p2m, gpfn, _mfn(INVALID_MFN), order, p2m_invalid, p2m->default_access);
-        p2m->pod.entry_count-=(1<<order); /* Lock: p2m */
+        p2m->pod.entry_count-=(1<<order);
         BUG_ON(p2m->pod.entry_count < 0);
         ret = 1;
         goto out_entry_check;
@@ -577,7 +579,7 @@ p2m_pod_decrease_reservation(struct doma
         if ( t == p2m_populate_on_demand )
         {
             set_p2m_entry(p2m, gpfn + i, _mfn(INVALID_MFN), 0, p2m_invalid, p2m->default_access);
-            p2m->pod.entry_count--; /* Lock: p2m */
+            p2m->pod.entry_count--;
             BUG_ON(p2m->pod.entry_count < 0);
             pod--;
         }
@@ -613,11 +615,11 @@ out_entry_check:
         p2m_pod_set_cache_target(p2m, p2m->pod.entry_count, 0/*can't preempt*/);
     }
 
-out_unlock:
+out_audit:
     audit_p2m(p2m, 1);
-    p2m_unlock(p2m);
 
 out:
+    pod_unlock(p2m);
     return ret;
 }
 
@@ -630,20 +632,24 @@ void p2m_pod_dump_data(struct domain *d)
 
 
 /* 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
 p2m_pod_zero_check_superpage(struct p2m_domain *p2m, unsigned long gfn)
 {
     mfn_t mfn, mfn0 = _mfn(INVALID_MFN);
     p2m_type_t type, type0 = 0;
     unsigned long * map = NULL;
-    int ret=0, reset = 0;
+    int success = 0, reset = 0;
     int i, j;
     int max_ref = 1;
     struct domain *d = p2m->domain;
 
     if ( !superpage_aligned(gfn) )
-        goto out;
+        return;
+
+    /* If we were enforcing ordering against p2m locks, this is a place
+     * to drop the PoD lock and re-acquire it once we're done mucking with
+     * the p2m. */
 
     /* Allow an extra refcount for one shadow pt mapping in shadowed domains */
     if ( paging_mode_shadow(d) )
@@ -751,19 +757,24 @@ p2m_pod_zero_check_superpage(struct p2m_
         __trace_var(TRC_MEM_POD_ZERO_RECLAIM, 0, sizeof(t), &t);
     }
 
-    /* Finally!  We've passed all the checks, and can add the mfn superpage
-     * back on the PoD cache, and account for the new p2m PoD entries */
-    p2m_pod_cache_add(p2m, mfn_to_page(mfn0), PAGE_ORDER_2M);
-    p2m->pod.entry_count += SUPERPAGE_PAGES;
+    success = 1;
+
 
 out_reset:
     if ( reset )
         set_p2m_entry(p2m, gfn, mfn0, 9, type0, p2m->default_access);
     
 out:
-    return ret;
+    if ( success )
+    {
+        /* Finally!  We've passed all the checks, and can add the mfn superpage
+         * back on the PoD cache, and account for the new p2m PoD entries */
+        p2m_pod_cache_add(p2m, mfn_to_page(mfn0), PAGE_ORDER_2M);
+        p2m->pod.entry_count += SUPERPAGE_PAGES;
+    }
 }
 
+/* On entry, PoD lock is held */
 static void
 p2m_pod_zero_check(struct p2m_domain *p2m, unsigned long *gfns, int count)
 {
@@ -775,6 +786,8 @@ p2m_pod_zero_check(struct p2m_domain *p2
     int i, j;
     int max_ref = 1;
 
+    /* Also the right time to drop pod_lock if enforcing ordering against p2m_lock */
+
     /* Allow an extra refcount for one shadow pt mapping in shadowed domains */
     if ( paging_mode_shadow(d) )
         max_ref++;
@@ -841,7 +854,6 @@ p2m_pod_zero_check(struct p2m_domain *p2
             if( *(map[i]+j) != 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] = NULL;
         }
-        else
+    }
+
+    /* Finally, add to cache */
+    for ( i=0; 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++;
@@ -876,6 +897,7 @@ p2m_pod_zero_check(struct p2m_domain *p2
 }
 
 #define POD_SWEEP_LIMIT 1024
+/* Only one CPU at a time is guaranteed to enter a sweep */
 static void
 p2m_pod_emergency_sweep_super(struct p2m_domain *p2m)
 {
@@ -964,7 +986,8 @@ p2m_pod_demand_populate(struct p2m_domai
 
     ASSERT(p2m_locked_by_me(p2m));
 
-    /* This check is done with the p2m lock held.  This will make sure that
+    pod_lock(p2m);
+    /* This check is done with the pod lock held.  This will make sure that
      * even if d->is_dying changes under our feet, p2m_pod_empty_cache() 
      * won't start until we're done. */
     if ( unlikely(d->is_dying) )
@@ -974,6 +997,7 @@ p2m_pod_demand_populate(struct p2m_domai
      * 1GB region to 2MB chunks for a retry. */
     if ( order == PAGE_ORDER_1G )
     {
+        pod_unlock(p2m);
         gfn_aligned = (gfn >> order) << order;
         /* Note that we are supposed to call set_p2m_entry() 512 times to 
          * 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
         set_p2m_entry(p2m, gfn_aligned, _mfn(0), PAGE_ORDER_2M,
                       p2m_populate_on_demand, p2m->default_access);
         audit_p2m(p2m, 1);
+        /* This is because the ept/pt caller locks the p2m recursively */
         p2m_unlock(p2m);
         return 0;
     }
@@ -996,11 +1021,15 @@ p2m_pod_demand_populate(struct p2m_domai
 
         /* If we're low, start a sweep */
         if ( order == PAGE_ORDER_2M && page_list_empty(&p2m->pod.super) )
+            /* Note that sweeps scan other ranges in the p2m. In an scenario
+             * in which p2m locks are order-enforced wrt pod lock and p2m 
+             * locks are fine grained, this will result in deadlock */
             p2m_pod_emergency_sweep_super(p2m);
 
         if ( page_list_empty(&p2m->pod.single) &&
              ( ( order == PAGE_ORDER_4K )
                || (order == PAGE_ORDER_2M && page_list_empty(&p2m->pod.super) ) ) )
+            /* Same comment regarding deadlock applies */
             p2m_pod_emergency_sweep(p2m);
     }
 
@@ -1008,8 +1037,6 @@ p2m_pod_demand_populate(struct p2m_domai
     if ( q == p2m_guest && gfn > p2m->pod.max_guest )
         p2m->pod.max_guest = gfn;
 
-    lock_page_alloc(p2m);
-
     if ( p2m->pod.count == 0 )
         goto out_of_memory;
 
@@ -1022,8 +1049,6 @@ p2m_pod_demand_populate(struct p2m_domai
 
     BUG_ON((mfn_x(mfn) & ((1 << order)-1)) != 0);
 
-    unlock_page_alloc(p2m);
-
     gfn_aligned = (gfn >> order) << order;
 
     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
         paging_mark_dirty(d, mfn_x(mfn) + i);
     }
     
-    p2m->pod.entry_count -= (1 << order); /* Lock: p2m */
+    p2m->pod.entry_count -= (1 << order);
     BUG_ON(p2m->pod.entry_count < 0);
+    pod_unlock(p2m);
 
     if ( tb_init_done )
     {
@@ -1054,16 +1080,17 @@ p2m_pod_demand_populate(struct p2m_domai
 
     return 0;
 out_of_memory:
-    unlock_page_alloc(p2m);
+    pod_unlock(p2m);
 
     printk("%s: Out of populate-on-demand memory! tot_pages %" PRIu32 " pod_entries %" PRIi32 "\n",
            __func__, d->tot_pages, p2m->pod.entry_count);
     domain_crash(d);
 out_fail:
+    pod_unlock(p2m);
     return -1;
 remap_and_retry:
     BUG_ON(order != PAGE_ORDER_2M);
-    unlock_page_alloc(p2m);
+    pod_unlock(p2m);
 
     /* Remap this 2-meg region in singleton chunks */
     gfn_aligned = (gfn>>order)<<order;
@@ -1133,9 +1160,11 @@ guest_physmap_mark_populate_on_demand(st
         rc = -EINVAL;
     else
     {
-        p2m->pod.entry_count += 1 << order; /* Lock: p2m */
+        pod_lock(p2m);
+        p2m->pod.entry_count += 1 << order;
         p2m->pod.entry_count -= pod_count;
         BUG_ON(p2m->pod.entry_count < 0);
+        pod_unlock(p2m);
     }
 
     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
     if ( !paging_mode_translate(d) )
         return;
 
+    pod_lock(p2m);
     //P2M_PRINTK("p2m audit starts\n");
 
     test_linear = ( (d == current->domain)
@@ -1247,6 +1248,8 @@ void audit_p2m(struct p2m_domain *p2m, i
                    pmbad, mpbad);
         WARN();
     }
+
+    pod_unlock(p2m);
 }
 #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);
 static void p2m_initialise(struct domain *d, struct p2m_domain *p2m)
 {
     mm_lock_init(&p2m->lock);
+    mm_lock_init(&p2m->pod.lock);
     INIT_LIST_HEAD(&p2m->np2m_list);
     INIT_PAGE_LIST_HEAD(&p2m->pages);
     INIT_PAGE_LIST_HEAD(&p2m->pod.super);
@@ -506,8 +507,10 @@ guest_physmap_add_entry(struct domain *d
             rc = -EINVAL;
         else
         {
-            p2m->pod.entry_count -= pod_count; /* Lock: p2m */
+            pod_lock(p2m);
+            p2m->pod.entry_count -= pod_count;
             BUG_ON(p2m->pod.entry_count < 0);
+            pod_unlock(p2m);
         }
     }
 
@@ -1125,8 +1128,10 @@ p2m_flush_table(struct p2m_domain *p2m)
     /* "Host" p2m tables can have shared entries &c that need a bit more 
      * care when discarding them */
     ASSERT(p2m_is_nestedp2m(p2m));
+    pod_lock(p2m);
     ASSERT(page_list_empty(&p2m->pod.super));
     ASSERT(page_list_empty(&p2m->pod.single));
+    pod_unlock(p2m);
 
     /* This is no longer a valid nested p2m for any address space */
     p2m->cr3 = 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 {
     unsigned long max_mapped_pfn;
 
     /* Populate-on-demand variables
-     * NB on locking.  {super,single,count} are
-     * covered by d->page_alloc_lock, since they're almost always used in
-     * conjunction with that functionality.  {entry_count} is covered by
-     * the domain p2m lock, since it's almost always used in conjunction
-     * with changing the p2m tables.
      *
-     * At this point, both locks are held in two places.  In both,
-     * the order is [p2m,page_alloc]:
-     * + p2m_pod_decrease_reservation() calls p2m_pod_cache_add(),
-     *   which grabs page_alloc
-     * + 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.
-     */
+     * All variables are protected with the pod lock. We cannot rely on
+     * the p2m lock if it's turned into a fine-grained lock.
+     * We only use the domain page_alloc lock for additions and 
+     * deletions to the domain's page list. Because we use it nested
+     * within the PoD lock, we enforce it's ordering (by remembering
+     * the unlock level). */
     struct {
         struct page_list_head super,   /* List of superpages                */
                          single;       /* Non-super lists                   */
@@ -283,6 +272,8 @@ 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 */
+        mm_lock_t        lock;         /* Locking of private pod structs,   *
+                                        * not relying on the p2m lock.      */
         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

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:32:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:32:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJP81-00043L-Pe; Thu, 27 Oct 2011 05:32:13 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJHld-0006bw-Tc
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 21:40:39 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319690433!36845332!1
X-Originating-IP: [208.97.132.66]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13893 invoked from network); 27 Oct 2011 04:40:34 -0000
Received: from caiajhbdcagg.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.66) by server-4.tower-174.messagelabs.com with SMTP;
	27 Oct 2011 04:40:34 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id 870EC7EC063;
	Wed, 26 Oct 2011 21:40:33 -0700 (PDT)
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=KpxytCWkT5dzma4Pw9tHunZndfU+hdQjE2Cp9ExBNSMw
	D9QNFC/bv/E204LvbmAWwp5dSGVqrGz0pXQYRBf398A9KlPDdaM1gUD2t1/laWc5
	KZb0r1GlZoxLQHA710cdJfIOfDqfBYk2zdmpF/qpGMsn7fcMKefcopXrKtWponI=
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=1VN9IzvdvQxjk8eImz03lsvG+30=; b=OxJjn+zguup
	DCCRu0YMHIpJaszipCK0GKEbPRsj3K5JqgRJ75zvY+QGOELEfegWR+v1v6Bt8CDr
	7yGx6LSlOE6SHmLMrl2YUcQwI8x1W4d0d6J5CKColtzAX7uTEwpZ5NJszeR1WsHO
	Eel2LxGqEs7CThy+1hQfzPnnH0g+jWCQ=
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-a20.g.dreamhost.com (Postfix) with ESMTPSA id C046E7EC060; 
	Wed, 26 Oct 2011 21:40:32 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: a23e1262b1240dcabfa0a886443403fda2d9e471
Message-Id: <a23e1262b1240dcabfa0.1319690030@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1319690025@xdev.gridcentric.ca>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Thu, 27 Oct 2011 00:33:50 -0400
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:17 -0700
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 5 of 9] Fine-grained concurrency control
	structure for 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/mm/hap/private.h |    1 +
 xen/arch/x86/mm/mm-locks.h    |   20 +-
 xen/arch/x86/mm/p2m-ept.c     |    1 +
 xen/arch/x86/mm/p2m-lock.h    |  613 ++++++++++++++++++++++++++++++++++++++++++
 xen/arch/x86/mm/p2m-pod.c     |    1 +
 xen/arch/x86/mm/p2m-pt.c      |    1 +
 xen/arch/x86/mm/p2m.c         |   24 +-
 xen/include/asm-x86/p2m.h     |    3 +-
 8 files changed, 652 insertions(+), 12 deletions(-)


Introduce a fine-grained concurrency control structure for the p2m. This
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 are
put in place.

Note the patch creates backwards-compatible shortcuts that will lock the
p2m globally. So it should remain functionally identical to what is currently
in place.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 981073d78f7f -r a23e1262b124 xen/arch/x86/mm/hap/private.h
--- a/xen/arch/x86/mm/hap/private.h
+++ b/xen/arch/x86/mm/hap/private.h
@@ -21,6 +21,7 @@
 #define __HAP_PRIVATE_H__
 
 #include "../mm-locks.h"
+#include "../p2m-lock.h"
 
 /********************************************/
 /*          GUEST TRANSLATION FUNCS         */
diff -r 981073d78f7f -r a23e1262b124 xen/arch/x86/mm/mm-locks.h
--- a/xen/arch/x86/mm/mm-locks.h
+++ b/xen/arch/x86/mm/mm-locks.h
@@ -146,14 +146,22 @@ 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 updates to the p2m table.
+ * 
+ * In 64 bit mode we disable this because the lock becomes fine-grained,
+ * and several code paths cause inversion/deadlock:
+ *   -- PoD sweeps
+ *   -- mem_sharing_unshare_page
+ *   -- generally widespread recursive locking, which we don't support
+ *      (yet, I guess) on an "external" mm lock. */
 
+#ifndef __x86_64__
 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_locked_by_me(p)   mm_locked_by_me(&(p)->lock)
+#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_locked_by_me(p)   mm_locked_by_me(&(p)->lock)
+#endif /* __x86_64__ */
 
 /* PoD lock (per-p2m-table)
  * 
diff -r 981073d78f7f -r a23e1262b124 xen/arch/x86/mm/p2m-ept.c
--- a/xen/arch/x86/mm/p2m-ept.c
+++ b/xen/arch/x86/mm/p2m-ept.c
@@ -33,6 +33,7 @@
 #include <xen/softirq.h>
 
 #include "mm-locks.h"
+#include "p2m-lock.h"
 
 #define atomic_read_ept_entry(__pepte)                              \
     ( (ept_entry_t) { .epte = atomic_read64(&(__pepte)->epte) } )
diff -r 981073d78f7f -r a23e1262b124 xen/arch/x86/mm/p2m-lock.h
--- /dev/null
+++ b/xen/arch/x86/mm/p2m-lock.h
@@ -0,0 +1,613 @@
+/******************************************************************************
+ * arch/x86/mm/p2m-lock.h
+ *
+ * Fine-grained locking of the p2m. Allow for concurrent updates to different
+ * regions of the p2m. Serially synchronize updates and lookups. Mutex 
+ * access on p2m entries while a CPU is using them.
+ *
+ * Copyright (c) 2011 Andres Lagar-Cavilla, GridCentric Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 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 _XEN_P2M_LOCK_H
+#define _XEN_P2M_LOCK_H
+
+#include <xen/config.h>
+#include <xen/lib.h>
+/* See comment about space consideration for spinlocks below */
+#define NDEBUG
+#undef LOCK_PROFILE
+#include <xen/spinlock.h>
+#include <asm/atomic.h>
+#include <xen/xmalloc.h>
+#include <xen/paging.h>
+#include <asm/page.h>
+#include <asm/p2m.h>
+#include "mm-locks.h"
+
+/* Rationale:
+ *
+ * The motivating scenario is one in which you have at least three CPUs 
+ * operating on likely disjoint regions of the p2m: a paging utility, a sharing
+ * utility, and the domU vcpu. With yet another p2m-heavy utility (mem 
+ * access?), and/or a migrate/remus utility, the number of CPUs operating
+ * on disjoint regions increases. Not to mention multi-vcpu domUs.
+ *
+ * Therefore, p2m concurrency control is achieved through a hierarchical 
+ * tree of locks, to allow all these CPUs to work without bothering each other.
+ * (Without disallowing any other cases such as single-vcpu domU)
+ *
+ * Leafs in the tree of locks are represented by spinlocks.
+ *
+ * Inner nodes (or uppper levels), are represented by a spinlock and a count.
+ * The count indicates how many CPUs are locking a node beneath. 
+ *
+ * A cpu holds a leaf by grabbing the spinlock, and not letting go of it. On its 
+ * way to the leaf, for each inner node, it grabs the spinlock, increases the 
+ * count, and releases the spinlock.
+ *
+ * Leaf levels are recursive, the same CPU can lock them again.
+ *
+ * A cpu holds an inner node in exclusive mode by busy-waiting until the count 
+ * is zero, grabbing the spinlock, and not letting go of it.
+ *
+ * Unlocks work by releasing the current spinlock, and working your way up:
+ * grab spinlock, decrease count, release.
+ *
+ * No locker can be preempted. For that reason, there are no atomic promotions:
+ * you would end up with promoters deadlocking on their way up the tree.
+ *
+ * Today, there are effectively two levels: the global lock (an inner node), and
+ * 2M locks, leaf locks for contiguous, aligned, 2M extents (akin to superpages).
+ *
+ * The global level can be held exclusively for big hammer operations such as
+ * log dirty (re)set.
+ *
+ * For non-global locking, the global lock is grabbed non-exclusively. At each 
+ * 1G boundary we allocate, if we hadn't before, the corresponding set of 512 
+ * 2M locks. Allocation of 2M locks is itself protected by a regular
+ * spinlock (this is rare enough). Allocation functions on-demand because
+ * we can't really know a priori the "total" size of the p2m.
+ *
+ * It is expected that every query or modification to the p2m will lock the 
+ * appropriate range. Leafs are recurisve for this reason: commonly you query a 
+ * range and then you modify it.
+ *
+ * Conversely, all callers of queries and modifications, once done, need to undo
+ * their locking.
+ * 
+ * Because we mimic the page table structure of a 512-radix tree, we run into 
+ * space considerations with the spinlocks in this tree. So we need to be careful
+ * about space.
+ *
+ * For 32bit code, we currently bail out and default to one big lock. Sorry Atom :(
+ *
+ * Also note that the p2m tree of locks is included in the ordering constraints
+ * enforced by mm-locks.h. It is treated as an "external" lock in that code.
+ *
+ */
+
+#define P2M_ORDER_GLOBAL    ~0U
+
+/* The 32 bit case serves as a concise summary of the external API */
+#ifndef __x86_64__
+/* For 32 bits we default to one big lock */
+typedef struct __p2m_lock {
+    mm_lock_t lock;
+} p2m_lock_t;
+
+static inline int p2m_lock_init(struct p2m_domain *p2m)
+{
+    p2m_lock_t *p2ml = xmalloc(p2m_lock_t);
+    if ( !p2ml )
+        return -ENOMEM;
+    mm_lock_init(&p2ml->lock);
+    p2m->lock = p2ml;
+    return 0;
+}
+
+static inline void get_p2m(struct p2m_domain *p2m, unsigned long gfn, unsigned int order)
+{
+    _p2m_lock(p2m->lock);
+}
+
+static inline void put_p2m(struct p2m_domain *p2m, unsigned long gfn, unsigned int order)
+{
+    _p2m_unlock(p2m->lock);
+}
+
+static inline void p2m_lock_destroy(struct p2m_domain *p2m)
+{
+    xfree(p2m->lock);
+    p2m->lock = NULL;
+}
+
+/* Backwards compatiblity */
+#define p2m_lock(p)             _p2m_lock((p)->lock)
+#define p2m_lock_recursive(p)   _p2m_lock_recursive((p)->lock)
+#define p2m_locked_by_me(p)     _p2m_locked_by_me((p)->lock)
+#define p2m_unlock(p)           _p2m_unlock((p)->lock)
+
+#else /* __x86_64__ */
+/* If we were to have inner locks (say 1G locks, then the space considerations
+ * outlined below for leaf locks would also apply here. */
+typedef struct p2m_inner_lock {
+    spinlock_t lock;
+    atomic_t   count;
+} p2m_inner_lock_t;
+
+static inline void init_p2m_inner_lock(p2m_inner_lock_t *inner)
+{
+    spin_lock_init(&inner->lock);
+    _atomic_set(inner->count, 0);
+}
+
+/* We cannot risk reusing the code in common/spinlock.c, because it may
+ * have been compiled with LOCK_DEBUG or LOCK_PROFILE. This is unfortunate. */
+static inline void lock_p2m_inner(p2m_inner_lock_t *inner)
+{
+    spin_lock(&inner->lock);
+}
+
+static inline void unlock_p2m_inner(p2m_inner_lock_t *inner)
+{
+    spin_unlock(&inner->lock);
+}
+
+static inline void get_p2m_inner(p2m_inner_lock_t *inner)
+{
+    lock_p2m_inner(inner);
+    atomic_inc(&inner->count);
+    unlock_p2m_inner(inner);
+}
+
+static inline void put_p2m_inner(p2m_inner_lock_t *inner)
+{
+    lock_p2m_inner(inner);
+    atomic_dec(&inner->count);
+    unlock_p2m_inner(inner);
+}
+
+/* XXX Consider starvation here */
+static inline void get_p2m_inner_exclusive(p2m_inner_lock_t *inner)
+{
+    int count;
+retry:
+    while (1)
+    {
+        mb();
+        count = atomic_read(&inner->count);
+        if ( count == 0 )
+            break;
+        cpu_relax();
+    }
+
+    spin_lock(&inner->lock);
+    mb();
+    count = atomic_read(&inner->count);
+    if ( count )
+    {
+        spin_unlock(&inner->lock);
+        goto retry;
+    }
+    /* We leave holding the spinlock */
+}
+
+static inline void put_p2m_inner_exclusive(p2m_inner_lock_t *inner)
+{
+    spin_unlock(&inner->lock);
+}
+
+/* Because we operate under page-table sizing constraints, we need to be 
+ * extremely conscious about the space we're taking up. So we become somewhat 
+ * re-inventers of the wheel, and we disable many things. */
+typedef struct p2m_leaf_lock {
+    raw_spinlock_t raw;
+    u16 recurse_cpu:12;
+    u16 recurse_cnt:4;
+/* Padding to confine each inner lock to its own word */
+#define LEAF_PAD   4
+    uint8_t             pad[LEAF_PAD];
+} __attribute__((packed)) p2m_leaf_lock_t;
+
+/* BUILD_BUG_ON(sizeof(p2m_leaf_lock_t) != sizeof(unsigned long)); */
+
+static inline void init_p2m_leaf_lock(p2m_leaf_lock_t *lock)
+{
+    *lock = (p2m_leaf_lock_t) { _RAW_SPIN_LOCK_UNLOCKED, 0xfffu, 0, { } };
+}
+
+static inline int __p2m_spin_trylock_recursive(p2m_leaf_lock_t *lock)
+{
+    int cpu = smp_processor_id();
+
+    if ( likely(lock->recurse_cpu != cpu) )
+    {
+        if ( !_raw_spin_trylock(&lock->raw) )
+            return 0;
+        preempt_disable();
+        lock->recurse_cpu = cpu;
+    }
+
+    lock->recurse_cnt++;
+    return 1;
+}
+
+static inline void lock_p2m_leaf(p2m_leaf_lock_t *lock)
+{
+    while ( !__p2m_spin_trylock_recursive(lock) )
+        cpu_relax();
+}
+
+static inline void unlock_p2m_leaf(p2m_leaf_lock_t *lock)
+{
+    if ( likely(--lock->recurse_cnt == 0) )
+    {
+        lock->recurse_cpu = 0xfffu;
+        preempt_enable();
+        _raw_spin_unlock(&lock->raw);
+    }
+}
+
+/* Deadlock book-keeping, see below */
+#define MAX_LOCK_DEPTH  16
+
+/* The lock structure */
+typedef struct __p2m_lock 
+{
+    /* To enforce ordering in mm-locks */
+    int unlock_level;
+    /* To protect on-demand allocation of locks 
+     * (yeah you heard that right) */
+    spinlock_t alloc_lock;
+    /* Global lock */
+    p2m_inner_lock_t global;
+    /* 2M locks. Allocate on demand: fun */
+    p2m_leaf_lock_t  **locks_2m;
+    /* Book-keeping for deadlock detection. Could be a per-cpu. */
+    unsigned long deadlock_guard[NR_CPUS][MAX_LOCK_DEPTH + 1];
+    uint8_t lock_depth[NR_CPUS];
+    /* Is anybody holding this exclusively */
+    unsigned int exclusive_holder;
+    /* Order of pages allocates for first level of locks_2m */
+    uint8_t order;
+} p2m_lock_t;
+
+#define EXCLUSIVE_CPU_NULL  ~0U
+
+/* 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 range.
+ * 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?) */
+
+#define DEADLOCK_NULL   ~0UL
+
+#define CURRENT_GUARD(l)    ((l)->deadlock_guard[current->processor] \
+                                [(l)->lock_depth[current->processor]])
+
+#define DEADLOCK_CHECK(cond, action, _f, _a...) \
+do {                                            \
+    if ( (cond) )                               \
+    {                                           \
+        printk(_f, ##_a);                       \
+        action;                                 \
+    }                                           \
+} while(0)
+
+static inline void push_guard(p2m_lock_t *p2ml, unsigned long gfn)
+{
+    int cpu = current->processor;
+
+    DEADLOCK_CHECK(((p2ml->lock_depth[cpu] + 1) > MAX_LOCK_DEPTH), 
+                    BUG(), "CPU %u exceeded deadlock depth\n", cpu);
+
+    p2ml->lock_depth[cpu]++;
+    p2ml->deadlock_guard[cpu][p2ml->lock_depth[cpu]] = gfn;
+}
+
+static inline void pop_guard(p2m_lock_t *p2ml)
+{
+    int cpu = current->processor;
+
+    DEADLOCK_CHECK((!p2ml->lock_depth[cpu] == 0), BUG(), 
+                    "CPU %u underflow deadlock depth\n", cpu);
+
+    p2ml->lock_depth[cpu]--;
+}
+
+static inline int p2m_lock_init(struct p2m_domain *p2m)
+{
+    unsigned int i;
+    p2m_lock_t *p2ml;
+
+    p2ml = xmalloc(p2m_lock_t);
+    if ( !p2ml ) 
+        return -ENOMEM;
+
+    memset(p2ml, 0, sizeof(p2m_lock_t));
+
+    spin_lock_init(&p2ml->alloc_lock);
+    init_p2m_inner_lock(&p2ml->global);
+
+    p2ml->locks_2m = alloc_xenheap_page();
+    if ( !p2ml->locks_2m )
+    {
+        xfree(p2ml);
+        return -ENOMEM;
+    }
+    memset(p2ml->locks_2m, 0, PAGE_SIZE);
+
+    for (i = 0; i < NR_CPUS; i++)
+        p2ml->deadlock_guard[i][0] = DEADLOCK_NULL;
+
+    p2ml->exclusive_holder = EXCLUSIVE_CPU_NULL;
+
+    p2m->lock = p2ml;
+    return 0;    
+}
+
+/* Conversion macros for aligned boundaries */
+#define gfn_to_superpage(g, o)      (((g) & (~((1 << (o)) - 1))) >> (o))
+#define gfn_to_1g_sp(gfn)           gfn_to_superpage(gfn, PAGE_ORDER_1G)
+#define gfn_to_2m_sp(gfn)           gfn_to_superpage(gfn, PAGE_ORDER_2M)
+#define gfn_1g_to_2m(gfn_1g)        ((gfn_1g) << (PAGE_ORDER_1G - PAGE_ORDER_2M))
+#define gfn_1g_to_last_2m(gfn_1g)   (gfn_1g_to_2m(gfn_1g) + \
+                                        ((1 << (PAGE_ORDER_1G - PAGE_ORDER_2M)) - 1))
+#define gfn_1g_to_4k(gfn_1g)        ((gfn_1g) << PAGE_ORDER_1G)
+#define gfn_1g_to_last_4k(gfn_1g)   (gfn_1g_to_4k(gfn_1g) + ((1 << PAGE_ORDER_1G) - 1))
+
+/* Global lock accessors. Global lock is our only "inner" node. */
+#define p2m_exclusive_locked_by_me(l)    \
+     ((l)->lock->exclusive_holder == current->processor)
+
+static inline void get_p2m_global_exclusive(struct p2m_domain *p2m)
+{
+    p2m_lock_t *p2ml = p2m->lock;
+    DEADLOCK_CHECK((CURRENT_GUARD(p2ml) != DEADLOCK_NULL), BUG(),
+                    "P2M DEADLOCK: cpu %u prev range start %lx trying global\n",
+                    (unsigned) current->processor, CURRENT_GUARD(p2ml)); 
+
+    get_p2m_inner_exclusive(&p2ml->global);
+    p2ml->exclusive_holder = current->processor;
+}
+
+static inline void put_p2m_global_exclusive(struct p2m_domain *p2m)
+{
+    p2m_lock_t *p2ml = p2m->lock;
+    p2ml->exclusive_holder = EXCLUSIVE_CPU_NULL;
+    put_p2m_inner_exclusive(&p2ml->global);
+}
+
+/* Not to be confused with shortcut for external use */
+static inline void __get_p2m_global(struct p2m_domain *p2m)
+{
+    get_p2m_inner(&p2m->lock->global);
+}
+
+/* Not to be confused with shortcut for external use */
+static inline void __put_p2m_global(struct p2m_domain *p2m)
+{
+    put_p2m_inner(&p2m->lock->global);
+}
+
+/* 2M lock accessors */
+static inline p2m_leaf_lock_t *__get_2m_lock(p2m_lock_t *p2ml,
+                            unsigned long gfn_1g, unsigned long gfn_2m)
+{
+    p2m_leaf_lock_t *lock_2m_l1;
+    BUG_ON(gfn_1g >= (1 << PAGETABLE_ORDER));
+    BUG_ON(gfn_2m >= (1 << PAGETABLE_ORDER));
+    lock_2m_l1 = p2ml->locks_2m[gfn_1g];
+    BUG_ON(lock_2m_l1 == NULL);
+    return (lock_2m_l1 + gfn_2m);
+}
+
+static inline void get_p2m_2m(struct p2m_domain *p2m, unsigned long gfn_1g,
+                                unsigned long gfn_2m)
+{
+    lock_p2m_leaf(__get_2m_lock(p2m->lock, gfn_1g, gfn_2m));
+}
+
+static inline void put_p2m_2m(struct p2m_domain *p2m, unsigned long gfn_1g,
+                                unsigned long gfn_2m)
+{
+    unlock_p2m_leaf(__get_2m_lock(p2m->lock, gfn_1g, gfn_2m));
+}
+
+/* Allocate 2M locks we may not have allocated yet for this 1G superpage */
+static inline int alloc_locks_2m(struct p2m_domain *p2m, unsigned long gfn_1g)
+{
+    p2m_lock_t *p2ml = p2m->lock;
+
+    /* With a single page for l1, we cover a gfn space of 512GB (39 bits)
+     * Given that current x86_64 processors physically address 40 bits,
+     * we're in no immediate danger of overflowing this table for a domU.
+     * If necessary, the l1 itself can grow subject to proper locking 
+     * on the p2ml->alloc_lock */
+
+    /* Quick test for common case */
+    if ( likely(p2ml->locks_2m[gfn_1g] != NULL) ) 
+        return 0;
+
+    spin_lock(&(p2ml->alloc_lock));
+
+    if ( likely(p2ml->locks_2m[gfn_1g] == NULL) )
+    {
+        unsigned long j;
+        p2m_leaf_lock_t *p = alloc_xenheap_page();
+        if ( !p ) 
+        {
+            spin_unlock(&(p2ml->alloc_lock));
+            return -ENOMEM;
+        }
+
+        for (j = 0; j < (1 << PAGETABLE_ORDER); j++)
+            init_p2m_leaf_lock(&p[j]);
+
+        p2ml->locks_2m[gfn_1g] = p;
+    }
+
+    spin_unlock(&(p2ml->alloc_lock));
+    return 0;
+}
+
+static inline unsigned long __get_last_gfn(unsigned long gfn, unsigned int order)
+{
+    /* Underflow */
+    unsigned long last_gfn = gfn + (1 << order) - 1;
+    BUG_ON(last_gfn < gfn);
+    return last_gfn;
+}
+
+static inline void get_p2m(struct p2m_domain *p2m, unsigned long gfn, unsigned int order)
+{
+    unsigned long last_gfn, first_1g, last_1g, first_2m, last_2m, i, j;
+    p2m_lock_t *p2ml = p2m->lock;
+
+    /* Holders of the p2m in exclusive mode can lock sub ranges. We make that a no-op.
+     * however, locking exclusively again is considered rude and tasteless. */
+    if ( (p2m_exclusive_locked_by_me(p2m)) && (order != P2M_ORDER_GLOBAL) )
+        return;
+        
+    DEADLOCK_CHECK(((CURRENT_GUARD(p2ml) != DEADLOCK_NULL) &&
+                    (CURRENT_GUARD(p2ml) > gfn)), WARN(),
+                    "P2M DEADLOCK: cpu %d prev range start %lx new range start %lx",
+                    current->processor, CURRENT_GUARD(p2ml), gfn);
+
+    preempt_disable();
+
+    if ( order == P2M_ORDER_GLOBAL ) {
+        get_p2m_global_exclusive(p2m);
+        goto get_p2m_out;
+    } 
+
+    __get_p2m_global(p2m);
+    /* We're non-preemptible. We've disallowed global p2m locking. We
+     * will now (allocate and) lock all relevant 2M leafs */
+
+    last_gfn    = __get_last_gfn(gfn, order);
+    first_1g    = gfn_to_1g_sp(gfn);
+    last_1g     = gfn_to_1g_sp(last_gfn);
+
+    for (i = first_1g; i <= last_1g; i++) 
+    {
+        first_2m    = (gfn_1g_to_4k(i) > gfn) ? gfn_1g_to_2m(i) : gfn_to_2m_sp(gfn);
+        last_2m     = min(gfn_to_2m_sp(last_gfn), gfn_1g_to_last_2m(i));
+
+        if ( alloc_locks_2m(p2m, i) )
+        {
+            /* There really isn't much we can do at this point */
+            panic("Fine-grained p2m locking failed to alloc 2M locks"
+                  " for 1G page %lx, domain %hu\n", i, p2m->domain->domain_id);
+        }
+
+        for (j = first_2m; j <= last_2m; j++)
+        {
+            get_p2m_2m(p2m, i, j & ((1 << PAGETABLE_ORDER) - 1));
+        }
+    }
+
+get_p2m_out:
+    push_guard(p2ml, gfn);
+}
+
+/* Conversely to the get method, we unlock all leafs pro-actively here */
+static inline void put_p2m(struct p2m_domain *p2m, unsigned long gfn, unsigned int order)
+{
+    unsigned long last_gfn, first_1g, last_1g, first_2m, last_2m, i, j;
+    p2m_lock_t *p2ml = p2m->lock;
+
+    last_gfn = __get_last_gfn(gfn, order);
+
+    /* See comment about exclusive holders recursively locking sub-ranges in get_p2m */
+    if ( (p2m_exclusive_locked_by_me(p2m)) && (order != P2M_ORDER_GLOBAL) )
+        return;
+
+    if ( order == P2M_ORDER_GLOBAL )
+    {
+        put_p2m_global_exclusive(p2m);
+        goto cleanup;
+    }
+
+    first_1g    = gfn_to_1g_sp(gfn);
+    last_1g     = gfn_to_1g_sp(last_gfn);
+
+    for (i = first_1g; i <= last_1g; i++) 
+    {
+        first_2m    = (gfn_1g_to_4k(i) > gfn) ? gfn_1g_to_2m(i) : gfn_to_2m_sp(gfn);
+        last_2m     = min(gfn_to_2m_sp(last_gfn), gfn_1g_to_last_2m(i));
+
+        for (j = first_2m; j <= last_2m; j++)
+        {
+            put_p2m_2m(p2m, i, j & ((1 << PAGETABLE_ORDER) - 1));
+        }
+    }
+
+    __put_p2m_global(p2m);
+    
+cleanup:
+    pop_guard(p2ml);
+    preempt_enable();
+}
+
+static inline void p2m_lock_destroy(struct p2m_domain *p2m)
+{
+    unsigned int i;
+    p2m_lock_t *p2ml = p2m->lock;
+
+    get_p2m_global_exclusive(p2m);
+
+    for (i = 0; i < (1 << PAGETABLE_ORDER); i++)
+        if ( p2ml->locks_2m[i] )
+            free_xenheap_page(p2ml->locks_2m[i]);
+
+    free_xenheap_page(p2ml->locks_2m);
+
+    put_p2m_global_exclusive(p2m);
+
+    xfree(p2ml);
+    p2m->lock = NULL;
+}
+
+/* Backwards compatibility */
+#define p2m_lock(p)             get_p2m((p), 0, P2M_ORDER_GLOBAL)
+#define p2m_unlock(p)           put_p2m((p), 0, P2M_ORDER_GLOBAL)
+#define p2m_locked_by_me(p)     p2m_exclusive_locked_by_me((p))
+/* There is no backwards compatibility for this, unless we make the 
+ * global lock recursive */
+#define p2m_lock_recursive(p)   ((void)0) 
+
+#endif /* __x86_64__ */
+
+/* Commonly-used shortcus */
+#define get_p2m_global(p2m)     get_p2m((p2m), 0, P2M_ORDER_GLOBAL)
+#define put_p2m_global(p2m)     put_p2m((p2m), 0, P2M_ORDER_GLOBAL)
+
+#define get_p2m_gfn(p2m, gfn)   get_p2m((p2m), (gfn), 0)
+#define put_p2m_gfn(p2m, gfn)   put_p2m((p2m), (gfn), 0)
+
+#endif /* _XEN_P2M_LOCK_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r 981073d78f7f -r a23e1262b124 xen/arch/x86/mm/p2m-pod.c
--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -34,6 +34,7 @@
 #include <asm/hvm/svm/amd-iommu-proto.h>
 
 #include "mm-locks.h"
+#include "p2m-lock.h"
 
 /* Override macros from asm/page.h to make them work with mfn_t */
 #undef mfn_to_page
diff -r 981073d78f7f -r a23e1262b124 xen/arch/x86/mm/p2m-pt.c
--- a/xen/arch/x86/mm/p2m-pt.c
+++ b/xen/arch/x86/mm/p2m-pt.c
@@ -39,6 +39,7 @@
 #include <asm/hvm/svm/amd-iommu-proto.h>
 
 #include "mm-locks.h"
+#include "p2m-lock.h"
 
 /* Override macros from asm/page.h to make them work with mfn_t */
 #undef mfn_to_page
diff -r 981073d78f7f -r a23e1262b124 xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -38,6 +38,7 @@
 #include <asm/hvm/svm/amd-iommu-proto.h>
 
 #include "mm-locks.h"
+#include "p2m-lock.h"
 
 /* turn on/off 1GB host page table support for hap, default on */
 static bool_t __read_mostly opt_hap_1gb = 1;
@@ -69,9 +70,12 @@ boolean_param("hap_2mb", opt_hap_2mb);
 
 
 /* Init the datastructures for later use by the p2m code */
-static void p2m_initialise(struct domain *d, struct p2m_domain *p2m)
+static int p2m_initialise(struct domain *d, struct p2m_domain *p2m)
 {
-    mm_lock_init(&p2m->lock);
+    if (p2m_lock_init(p2m))
+    {
+        return -ENOMEM;
+    }
     mm_lock_init(&p2m->pod.lock);
     INIT_LIST_HEAD(&p2m->np2m_list);
     INIT_PAGE_LIST_HEAD(&p2m->pages);
@@ -89,7 +93,7 @@ static void p2m_initialise(struct domain
     else
         p2m_pt_init(p2m);
 
-    return;
+    return 0;
 }
 
 static int
@@ -103,7 +107,11 @@ p2m_init_nestedp2m(struct domain *d)
         d->arch.nested_p2m[i] = p2m = xzalloc(struct p2m_domain);
         if (p2m == NULL)
             return -ENOMEM;
-        p2m_initialise(d, p2m);
+        if (p2m_initialise(d, p2m))
+        {
+            xfree(p2m);
+            return -ENOMEM;
+        }
         p2m->write_p2m_entry = nestedp2m_write_p2m_entry;
         list_add(&p2m->np2m_list, &p2m_get_hostp2m(d)->np2m_list);
     }
@@ -118,7 +126,11 @@ int p2m_init(struct domain *d)
     p2m_get_hostp2m(d) = p2m = xzalloc(struct p2m_domain);
     if ( p2m == NULL )
         return -ENOMEM;
-    p2m_initialise(d, p2m);
+    if (p2m_initialise(d, p2m))
+    {
+        xfree(p2m);
+        return -ENOMEM;
+    }
 
     /* Must initialise nestedp2m unconditionally
      * since nestedhvm_enabled(d) returns false here.
@@ -331,6 +343,7 @@ static void p2m_teardown_nestedp2m(struc
     uint8_t i;
 
     for (i = 0; i < MAX_NESTEDP2M; i++) {
+        p2m_lock_destroy(d->arch.nested_p2m[i]);
         xfree(d->arch.nested_p2m[i]);
         d->arch.nested_p2m[i] = NULL;
     }
@@ -338,6 +351,7 @@ static void p2m_teardown_nestedp2m(struc
 
 void p2m_final_teardown(struct domain *d)
 {
+    p2m_lock_destroy(d->arch.p2m); 
     /* Iterate over all p2m tables per domain */
     xfree(d->arch.p2m);
     d->arch.p2m = NULL;
diff -r 981073d78f7f -r a23e1262b124 xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -187,9 +187,10 @@ typedef enum {
 #define p2m_is_broken(_t)   (p2m_to_mask(_t) & P2M_BROKEN_TYPES)
 
 /* Per-p2m-table state */
+struct __p2m_lock;
 struct p2m_domain {
     /* Lock that protects updates to the p2m */
-    mm_lock_t          lock;
+    struct __p2m_lock *lock;
 
     /* Shadow translated domain: p2m mapping */
     pagetable_t        phys_table;

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:33:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:33:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJP8q-0004WB-VI; Thu, 27 Oct 2011 05:33:05 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJHle-0006c7-N2
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 21:40:39 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319690434!1835871!1
X-Originating-IP: [208.97.132.74]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3512 invoked from network); 27 Oct 2011 04:40:35 -0000
Received: from caiajhbdcahe.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.74) by server-3.tower-21.messagelabs.com with SMTP;
	27 Oct 2011 04:40:35 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id 5E2097EC065;
	Wed, 26 Oct 2011 21:40:34 -0700 (PDT)
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=nesJcO0L4//rcmH5U++XHWAaBDv/bmb6M2yMIYjOF8gN
	cdlKydVIayjEMR8t4gS9DeX7+tumeiuq5RsbWdlttHPbXJHX2HPITG44zJQswZle
	SIf8c9rIrL6E3Rl8/gzTpK3WgUaqotEboFJEvYDTpbTz5O+GK+V4IXXmeF81FEc=
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=ZALpDu3Odio4eyiebPjZI4Bldtw=; b=Md0Mko+GnR+
	XN9cxfP7JuALiluAxu9ET+m0hdi4OMkNh9hThlqMC31XGlcQ8YU2Sgj+3/L24/pM
	pqTvaaNX8kNd98bQLQaCTC/WBGdKZgh3OR63qLWDt8Khx0vccBG6pgJZ+im0tQf6
	EVlVLBVBlJr3POjyY/6pWu0VwfKxgElM=
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-a20.g.dreamhost.com (Postfix) with ESMTPSA id B51A17EC060; 
	Wed, 26 Oct 2011 21:40:33 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 0a97d62c2d4190e16d90593f4cbf03ce24b09338
Message-Id: <0a97d62c2d4190e16d90.1319690031@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1319690025@xdev.gridcentric.ca>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Thu, 27 Oct 2011 00:33:51 -0400
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:17 -0700
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 6 of 9] Protect superpage splitting in
 implementation-dependent traversals
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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-ept.c  |  15 +++++++-
 xen/arch/x86/mm/p2m-lock.h |  11 +++++-
 xen/arch/x86/mm/p2m-pt.c   |  82 ++++++++++++++++++++++++++++++++++-----------
 3 files changed, 84 insertions(+), 24 deletions(-)


In both pt and ept modes, the p2m trees can map 1GB superpages.
Because our locks work on a 2MB superpage basis, without proper
locking we could have two simultaneous traversals to two different
2MB ranges split the 1GB superpage in a racy manner.

Fix this with the existing alloc_lock in the superpage structure.
We allow 1GB-grained locking for a future implementation -- we
just default to a global lock in all cases currently.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r a23e1262b124 -r 0a97d62c2d41 xen/arch/x86/mm/p2m-ept.c
--- a/xen/arch/x86/mm/p2m-ept.c
+++ b/xen/arch/x86/mm/p2m-ept.c
@@ -163,6 +163,7 @@ static int ept_set_middle_entry(struct p
 }
 
 /* free ept sub tree behind an entry */
+/* Lock on this superpage (if any) held on entry */
 static void ept_free_entry(struct p2m_domain *p2m, ept_entry_t *ept_entry, int level)
 {
     /* End if the entry is a leaf entry. */
@@ -181,6 +182,7 @@ static void ept_free_entry(struct p2m_do
     p2m_free_ptp(p2m, mfn_to_page(ept_entry->mfn));
 }
 
+/* Lock on this superpage held on entry */
 static int ept_split_super_page(struct p2m_domain *p2m, ept_entry_t *ept_entry,
                                 int level, int target)
 {
@@ -315,6 +317,7 @@ ept_set_entry(struct p2m_domain *p2m, un
     int needs_sync = 1;
     struct domain *d = p2m->domain;
     ept_entry_t old_entry = { .epte = 0 };
+    p2m_lock_t *p2ml = p2m->lock;
 
     /*
      * the caller must make sure:
@@ -361,6 +364,8 @@ ept_set_entry(struct p2m_domain *p2m, un
      * with a leaf entry (a 1GiB or 2MiB page), and handle things appropriately.
      */
 
+    if ( target == 2 )
+        lock_p2m_1G(p2ml, index);
     if ( i == target )
     {
         /* We reached the target level. */
@@ -373,7 +378,7 @@ ept_set_entry(struct p2m_domain *p2m, un
         /* If we're replacing a non-leaf entry with a leaf entry (1GiB or 2MiB),
          * the intermediate tables will be freed below after the ept flush
          *
-         * Read-then-write is OK because we hold the p2m lock. */
+         * Read-then-write is OK because we hold the 1G or 2M lock. */
         old_entry = *ept_entry;
 
         if ( mfn_valid(mfn_x(mfn)) || direct_mmio || p2m_is_paged(p2mt) ||
@@ -412,6 +417,8 @@ ept_set_entry(struct p2m_domain *p2m, un
         if ( !ept_split_super_page(p2m, &split_ept_entry, i, target) )
         {
             ept_free_entry(p2m, &split_ept_entry, i);
+            if ( target == 2 )
+                unlock_p2m_1G(p2ml, index);
             goto out;
         }
 
@@ -440,7 +447,7 @@ ept_set_entry(struct p2m_domain *p2m, un
         /* the caller should take care of the previous page */
         new_entry.mfn = mfn_x(mfn);
 
-        /* Safe to read-then-write because we hold the p2m lock */
+        /* Safe to read-then-write because we hold the 1G or 2M lock */
         if ( ept_entry->mfn == new_entry.mfn )
              need_modify_vtd_table = 0;
 
@@ -448,6 +455,8 @@ ept_set_entry(struct p2m_domain *p2m, un
 
         atomic_write_ept_entry(ept_entry, new_entry);
     }
+    if ( target == 2 )
+        unlock_p2m_1G(p2ml, index);
 
     /* Track the highest gfn for which we have ever had a valid mapping */
     if ( mfn_valid(mfn_x(mfn)) &&
@@ -642,6 +651,8 @@ static ept_entry_t ept_get_entry_content
     return content;
 }
 
+/* This is called before crashing a domain, so we're not particularly 
+ * concerned with locking */
 void ept_walk_table(struct domain *d, unsigned long gfn)
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
diff -r a23e1262b124 -r 0a97d62c2d41 xen/arch/x86/mm/p2m-lock.h
--- a/xen/arch/x86/mm/p2m-lock.h
+++ b/xen/arch/x86/mm/p2m-lock.h
@@ -109,6 +109,11 @@ typedef struct __p2m_lock {
     mm_lock_t lock;
 } p2m_lock_t;
 
+/* We do not need sub-locking on 1G superpages because we have a 
+ * global lock */
+#define lock_p2m_1G(l, gfn)     ((void)l) 
+#define unlock_p2m_1G(l, gfn)   ((void)l)
+
 static inline int p2m_lock_init(struct p2m_domain *p2m)
 {
     p2m_lock_t *p2ml = xmalloc(p2m_lock_t);
@@ -271,7 +276,8 @@ typedef struct __p2m_lock
     /* To enforce ordering in mm-locks */
     int unlock_level;
     /* To protect on-demand allocation of locks 
-     * (yeah you heard that right) */
+     * (yeah you heard that right) 
+     * Also protects 1GB superpage splitting. */
     spinlock_t alloc_lock;
     /* Global lock */
     p2m_inner_lock_t global;
@@ -429,6 +435,9 @@ static inline void put_p2m_2m(struct p2m
     unlock_p2m_leaf(__get_2m_lock(p2m->lock, gfn_1g, gfn_2m));
 }
 
+#define lock_p2m_1G(l, gfn)     spin_lock(&l->alloc_lock)
+#define unlock_p2m_1G(l, gfn)   spin_unlock(&l->alloc_lock)
+
 /* Allocate 2M locks we may not have allocated yet for this 1G superpage */
 static inline int alloc_locks_2m(struct p2m_domain *p2m, unsigned long gfn_1g)
 {
diff -r a23e1262b124 -r 0a97d62c2d41 xen/arch/x86/mm/p2m-pt.c
--- a/xen/arch/x86/mm/p2m-pt.c
+++ b/xen/arch/x86/mm/p2m-pt.c
@@ -159,6 +159,7 @@ p2m_next_level(struct p2m_domain *p2m, m
                unsigned long *gfn_remainder, unsigned long gfn, u32 shift,
                u32 max, unsigned long type)
 {
+    p2m_lock_t *p2ml = p2m->lock;
     l1_pgentry_t *l1_entry;
     l1_pgentry_t *p2m_entry;
     l1_pgentry_t new_entry;
@@ -207,6 +208,7 @@ p2m_next_level(struct p2m_domain *p2m, m
     ASSERT(l1e_get_flags(*p2m_entry) & (_PAGE_PRESENT|_PAGE_PSE));
 
     /* split 1GB pages into 2MB pages */
+    lock_p2m_1G(p2ml, *gfn_remainder >> shift);
     if ( type == PGT_l2_page_table && (l1e_get_flags(*p2m_entry) & _PAGE_PSE) )
     {
         unsigned long flags, pfn;
@@ -214,7 +216,10 @@ p2m_next_level(struct p2m_domain *p2m, m
 
         pg = p2m_alloc_ptp(p2m, PGT_l2_page_table);
         if ( pg == NULL )
+        {
+            unlock_p2m_1G(p2ml, *gfn_remainder >> shift);
             return 0;
+        }
 
         flags = l1e_get_flags(*p2m_entry);
         pfn = l1e_get_pfn(*p2m_entry);
@@ -233,9 +238,11 @@ p2m_next_level(struct p2m_domain *p2m, m
         p2m_add_iommu_flags(&new_entry, 2, IOMMUF_readable|IOMMUF_writable);
         p2m->write_p2m_entry(p2m, gfn, p2m_entry, *table_mfn, new_entry, 3);
     }
-
+    unlock_p2m_1G(p2ml, *gfn_remainder >> shift);
 
     /* split single 2MB large page into 4KB page in P2M table */
+    /* This does not necessitate locking because 2MB regions are locked
+     * exclusively */
     if ( type == PGT_l1_page_table && (l1e_get_flags(*p2m_entry) & _PAGE_PSE) )
     {
         unsigned long flags, pfn;
@@ -297,6 +304,7 @@ p2m_set_entry(struct p2m_domain *p2m, un
                                    IOMMUF_readable|IOMMUF_writable:
                                    0; 
     unsigned long old_mfn = 0;
+    p2m_lock_t *p2ml = p2m->lock;
 
     if ( tb_init_done )
     {
@@ -326,7 +334,10 @@ p2m_set_entry(struct p2m_domain *p2m, un
      */
     if ( page_order == PAGE_ORDER_1G )
     {
-        l1_pgentry_t old_entry = l1e_empty();
+        l1_pgentry_t old_entry;
+        lock_p2m_1G(p2ml, l3_table_offset(gfn));
+
+        old_entry = l1e_empty();
         p2m_entry = p2m_find_entry(table, &gfn_remainder, gfn,
                                    L3_PAGETABLE_SHIFT - PAGE_SHIFT,
                                    L3_PAGETABLE_ENTRIES);
@@ -358,7 +369,9 @@ p2m_set_entry(struct p2m_domain *p2m, un
         /* Free old intermediate tables if necessary */
         if ( l1e_get_flags(old_entry) & _PAGE_PRESENT )
             p2m_free_entry(p2m, &old_entry, page_order);
+        unlock_p2m_1G(p2ml, l3_table_offset(gfn));
     }
+
     /*
      * When using PAE Xen, we only allow 33 bits of pseudo-physical
      * address in translated guests (i.e. 8 GBytes).  This restriction
@@ -515,6 +528,7 @@ static mfn_t p2m_gfn_to_mfn_current(stru
      * XXX Once we start explicitly registering MMIO regions in the p2m 
      * XXX we will return p2m_invalid for unmapped gfns */
 
+    p2m_lock_t *p2ml = p2m->lock;
     l1_pgentry_t l1e = l1e_empty(), *p2m_entry;
     l2_pgentry_t l2e = l2e_empty();
     int ret;
@@ -543,6 +557,8 @@ pod_retry_l3:
             /* The read has succeeded, so we know that mapping exists */
             if ( q != p2m_query )
             {
+                /* We do not need to lock the 1G superpage here because PoD 
+                 * will do it by splitting */
                 if ( !p2m_pod_demand_populate(p2m, gfn, PAGE_ORDER_1G, q) )
                     goto pod_retry_l3;
                 p2mt = p2m_invalid;
@@ -558,6 +574,7 @@ pod_retry_l3:
         goto pod_retry_l2;
     }
 
+    lock_p2m_1G(p2ml, l3_table_offset(addr));
     if ( l3e_get_flags(l3e) & _PAGE_PSE )
     {
         p2mt = p2m_flags_to_type(l3e_get_flags(l3e));
@@ -571,8 +588,12 @@ pod_retry_l3:
             
         if ( page_order )
             *page_order = PAGE_ORDER_1G;
+        unlock_p2m_1G(p2ml, l3_table_offset(addr));
         goto out;
     }
+    unlock_p2m_1G(p2ml, l3_table_offset(addr));
+#else
+    (void)p2ml; /* gcc ... */
 #endif
     /*
      * Read & process L2
@@ -691,6 +712,7 @@ p2m_gfn_to_mfn(struct p2m_domain *p2m, u
     paddr_t addr = ((paddr_t)gfn) << PAGE_SHIFT;
     l2_pgentry_t *l2e;
     l1_pgentry_t *l1e;
+    p2m_lock_t *p2ml = p2m->lock;
 
     ASSERT(paging_mode_translate(p2m->domain));
 
@@ -744,6 +766,8 @@ pod_retry_l3:
             {
                 if ( q != p2m_query )
                 {
+                    /* See previous comments on why there is no need to lock
+                     * 1GB superpage here */
                     if ( !p2m_pod_demand_populate(p2m, gfn, PAGE_ORDER_1G, q) )
                         goto pod_retry_l3;
                 }
@@ -755,16 +779,23 @@ pod_retry_l3:
         }
         else if ( (l3e_get_flags(*l3e) & _PAGE_PSE) )
         {
-            mfn = _mfn(l3e_get_pfn(*l3e) +
-                       l2_table_offset(addr) * L1_PAGETABLE_ENTRIES +
-                       l1_table_offset(addr));
-            *t = p2m_flags_to_type(l3e_get_flags(*l3e));
-            unmap_domain_page(l3e);
+            lock_p2m_1G(p2ml, l3_table_offset(addr));
+            /* Retry to be sure */
+            if ( (l3e_get_flags(*l3e) & _PAGE_PSE) )
+            {
+                mfn = _mfn(l3e_get_pfn(*l3e) +
+                           l2_table_offset(addr) * L1_PAGETABLE_ENTRIES +
+                           l1_table_offset(addr));
+                *t = p2m_flags_to_type(l3e_get_flags(*l3e));
+                unmap_domain_page(l3e);
 
-            ASSERT(mfn_valid(mfn) || !p2m_is_ram(*t));
-            if ( page_order )
-                *page_order = PAGE_ORDER_1G;
-            return (p2m_is_valid(*t)) ? mfn : _mfn(INVALID_MFN);
+                ASSERT(mfn_valid(mfn) || !p2m_is_ram(*t));
+                if ( page_order )
+                    *page_order = PAGE_ORDER_1G;
+                unlock_p2m_1G(p2ml, l3_table_offset(addr));
+                return (p2m_is_valid(*t)) ? mfn : _mfn(INVALID_MFN);
+            }
+            unlock_p2m_1G(p2ml, l3_table_offset(addr));
         }
 
         mfn = _mfn(l3e_get_pfn(*l3e));
@@ -852,6 +883,7 @@ static void p2m_change_type_global(struc
     l4_pgentry_t *l4e;
     unsigned long i4;
 #endif /* CONFIG_PAGING_LEVELS == 4 */
+    p2m_lock_t *p2ml = p2m->lock;
 
     BUG_ON(p2m_is_grant(ot) || p2m_is_grant(nt));
     BUG_ON(ot != nt && (ot == p2m_mmio_direct || nt == p2m_mmio_direct));
@@ -891,17 +923,25 @@ static void p2m_change_type_global(struc
             }
             if ( (l3e_get_flags(l3e[i3]) & _PAGE_PSE) )
             {
-                flags = l3e_get_flags(l3e[i3]);
-                if ( p2m_flags_to_type(flags) != ot )
+                lock_p2m_1G(p2ml, i3);
+                if ( (l3e_get_flags(l3e[i3]) & _PAGE_PSE) )
+                {
+                    flags = l3e_get_flags(l3e[i3]);
+                    if ( p2m_flags_to_type(flags) != ot )
+                    {
+                        unlock_p2m_1G(p2ml, i3);
+                        continue;
+                    }
+                    mfn = l3e_get_pfn(l3e[i3]);
+                    gfn = get_gpfn_from_mfn(mfn);
+                    flags = p2m_type_to_flags(nt, _mfn(mfn));
+                    l1e_content = l1e_from_pfn(mfn, flags | _PAGE_PSE);
+                    p2m->write_p2m_entry(p2m, gfn,
+                                         (l1_pgentry_t *)&l3e[i3],
+                                         l3mfn, l1e_content, 3);
+                    unlock_p2m_1G(p2ml, i3);
                     continue;
-                mfn = l3e_get_pfn(l3e[i3]);
-                gfn = get_gpfn_from_mfn(mfn);
-                flags = p2m_type_to_flags(nt, _mfn(mfn));
-                l1e_content = l1e_from_pfn(mfn, flags | _PAGE_PSE);
-                p2m->write_p2m_entry(p2m, gfn,
-                                     (l1_pgentry_t *)&l3e[i3],
-                                     l3mfn, l1e_content, 3);
-                continue;
+                }
             }
 
             l2mfn = _mfn(l3e_get_pfn(l3e[i3]));

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:34:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:34:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJP9p-0004vy-1Q; Thu, 27 Oct 2011 05:34:05 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJHlf-0006cC-Go
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 21:40:39 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319690435!256192!1
X-Originating-IP: [208.97.132.202]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24566 invoked from network); 27 Oct 2011 04:40:36 -0000
Received: from caiajhbdccac.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.202) by server-5.tower-21.messagelabs.com with SMTP;
	27 Oct 2011 04:40:36 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id 2A5457EC064;
	Wed, 26 Oct 2011 21:40:35 -0700 (PDT)
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=EC7BtDT6jeovZMMUg0gp7vz0emqYrxRkLBEATCVfuvWK
	pcE3AFlywQ2G7bK+ypAND+ejugtXVcDRhLW2/hE/NKVwnro1Vs4/KCKYtaIJNeY3
	seFHSXj5l/TkgqKd0elZn9BiF+6MY8ecoaVSU678z2R5HlCgE4RUY6HucCgvEhI=
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=ktwTECuDZWFgCogXbuwg7GTxOvk=; b=omgX57ApjiD
	jXE+xoTLfa3BLzYhWPWw6JabiZJBhzHxuBGnpC7krjuzHcmc+ittiZqpDOoVgEqa
	QVtDABW+zTgmXV/QkPpB2DtqU6GO9tt4Z7Z/KvNZbKJqbnvUAHQ3OZcEKHrksWCJ
	kybMIoHnu1TOZzUCETC8JpwHJjuxp/3U=
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-a20.g.dreamhost.com (Postfix) with ESMTPSA id 8BB1B7EC060; 
	Wed, 26 Oct 2011 21:40:34 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 8a98179666de44e12e953242ee53abf7211e5c16
Message-Id: <8a98179666de44e12e95.1319690032@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1319690025@xdev.gridcentric.ca>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Thu, 27 Oct 2011 00:33:52 -0400
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:18 -0700
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 7 of 9] 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 0a97d62c2d41 -r 8a98179666de xen/arch/x86/mm/p2m.c
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -148,6 +148,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 0a97d62c2d41 -r 8a98179666de xen/include/asm-x86/p2m.h
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -305,45 +305,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 Thu Oct 27 05:36:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:36:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPC3-0005d3-DY; Thu, 27 Oct 2011 05:36:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJHlg-0006cH-H7
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 21:40:42 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-9.tower-27.messagelabs.com!1319690413!50381329!1
X-Originating-IP: [208.97.132.202]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17365 invoked from network); 27 Oct 2011 04:40:13 -0000
Received: from caiajhbdccac.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.202) by server-9.tower-27.messagelabs.com with SMTP;
	27 Oct 2011 04:40:13 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id 0E0407EC063;
	Wed, 26 Oct 2011 21:40:36 -0700 (PDT)
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=dJCU2FVmKGeJJBezExBt0LgO/q045kjlRkcB13Tk07DO
	13Vo5ztd4bhP6nRK7myLNoqn6wZQSg+MmEPiq0kNhocef5vCppo58If+INR3IS2M
	fMW3SN5dhhQM4YVjCJTde10yIjTA41m1qjHZfkxaJ5Kpc9ZqjkGj64rAd0mwDIo=
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=2czYupuRMAdMizMH+82dOfsYV8o=; b=WQV4staRfPb
	NDk4Z5NY3n/uP/dtCTH8jelFJ4D+UPSLtU0rXEiqsr3TpyMbcUeLN4IYiNmToqaC
	q9NcbKUu1PmJZG8MBIzxRIV8fczw4jFUzp9dZ0JWj5g68pFQWM+4OklmNvS9QrF5
	Fnw021owjgy7njojP3flBhRpXVtI+a9E=
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-a20.g.dreamhost.com (Postfix) with ESMTPSA id 5A0447EC060; 
	Wed, 26 Oct 2011 21:40:35 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: 471d4f2754d6516d5926ec6cfb58f9c90ff4a313
Message-Id: <471d4f2754d6516d5926.1319690033@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1319690025@xdev.gridcentric.ca>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Thu, 27 Oct 2011 00:33:53 -0400
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:18 -0700
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 8 of 9] Modify all internal p2m functions to use
 the new fine-grained locking
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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        |    2 +-
 xen/arch/x86/mm/hap/nested_hap.c |   21 ++-
 xen/arch/x86/mm/p2m-ept.c        |   26 +----
 xen/arch/x86/mm/p2m-pod.c        |   42 +++++--
 xen/arch/x86/mm/p2m-pt.c         |   20 +---
 xen/arch/x86/mm/p2m.c            |  185 ++++++++++++++++++++++++--------------
 xen/include/asm-ia64/mm.h        |    5 +
 xen/include/asm-x86/p2m.h        |   45 +++++++++-
 8 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.

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
     old_flags = l1e_get_flags(*p);
 
     if ( nestedhvm_enabled(d) && (old_flags & _PAGE_PRESENT) 
-         && !p2m_get_hostp2m(d)->defer_nested_flush ) {
+         && !atomic_read(&(p2m_get_hostp2m(d)->defer_nested_flush)) ) {
         /* We are replacing a valid entry so we need to flush nested p2ms,
          * unless the only change is an increase in access rights. */
         mfn_t omfn = _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
     ASSERT(p2m);
     ASSERT(p2m->set_entry);
 
-    p2m_lock(p2m);
-
     /* If this p2m table has been flushed or recycled under our feet, 
      * leave it alone.  We'll pick up the right one as we try to 
      * vmenter the guest. */
@@ -122,11 +120,13 @@ nestedhap_fix_p2m(struct vcpu *v, struct
         gfn = (L2_gpa >> PAGE_SHIFT) & mask;
         mfn = _mfn((L0_gpa >> PAGE_SHIFT) & mask);
 
+        /* Not bumping refcount of pages underneath because we're getting
+         * rid of whatever was there */
+        get_p2m(p2m, gfn, page_order);
         rv = set_p2m_entry(p2m, gfn, mfn, page_order, p2mt, p2ma);
+        put_p2m(p2m, gfn, page_order);
     }
 
-    p2m_unlock(p2m);
-
     if (rv == 0) {
         gdprintk(XENLOG_ERR,
 		"failed to set entry for 0x%"PRIx64" -> 0x%"PRIx64"\n",
@@ -146,19 +146,26 @@ 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_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:
+    drop_p2m_gfn(p2m, L1_gpa >> PAGE_SHIFT, mfn_x(mfn));
+    return rc;
 }
 
 /* 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 @@
 #define is_epte_present(ept_entry)      ((ept_entry)->epte & 0x7)
 #define is_epte_superpage(ept_entry)    ((ept_entry)->sp)
 
-/* Non-ept "lock-and-check" wrapper */
+/* Ept-specific check wrapper */
 static int ept_pod_check_and_populate(struct p2m_domain *p2m, unsigned long gfn,
                                       ept_entry_t *entry, int order,
                                       p2m_query_t q)
 {
-    int r;
-
-    /* This is called from the p2m lookups, which can happen with or 
-     * without the lock hed. */
-    p2m_lock_recursive(p2m);
-
     /* Check to make sure this is still PoD */
     if ( entry->sa_p2mt != p2m_populate_on_demand )
-    {
-        p2m_unlock(p2m);
         return 0;
-    }
 
-    r = p2m_pod_demand_populate(p2m, gfn, order, q);
-
-    p2m_unlock(p2m);
-
-    return r;
+    return p2m_pod_demand_populate(p2m, gfn, order, q);
 }
 
 static 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
 
     ept_entry = (*table) + index;
 
-    /* ept_next_level() is called (sometimes) without a lock.  Read
+    /* ept_next_level() is called (never) without a lock.  Read
      * the entry once, and act on the "cached" entry after that to
-     * avoid races. */
+     * avoid races. AAA */
     e = atomic_read_ept_entry(ept_entry);
 
     if ( !is_epte_present(&e) )
@@ -733,7 +720,8 @@ void ept_change_entry_emt_with_range(str
     int order = 0;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
-    p2m_lock(p2m);
+    /* This is a global operation, essentially */
+    get_p2m_global(p2m);
     for ( gfn = start_gfn; gfn <= end_gfn; gfn++ )
     {
         int level = 0;
@@ -773,7 +761,7 @@ void ept_change_entry_emt_with_range(str
                 ept_set_entry(p2m, gfn, mfn, order, e.sa_p2mt, e.access);
         }
     }
-    p2m_unlock(p2m);
+    put_p2m_global(p2m);
 }
 
 /*
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
     }
 #endif
 
-    ASSERT(p2m_locked_by_me(p2m));
-
     /*
      * Pages from domain_alloc and returned by the balloon driver aren't
      * guaranteed to be zero; but by reclaiming zero pages, we implicitly
@@ -536,7 +534,7 @@ p2m_pod_decrease_reservation(struct doma
     {
         p2m_type_t t;
 
-        gfn_to_mfn_query(d, gpfn + i, &t);
+        gfn_to_mfn_query_unlocked(d, gpfn + i, &t);
 
         if ( t == p2m_populate_on_demand )
             pod++;
@@ -602,6 +600,7 @@ p2m_pod_decrease_reservation(struct doma
             nonpod--;
             ram--;
         }
+        drop_p2m_gfn(p2m, gpfn + i, mfn_x(mfn));
     }    
 
     /* If there are no more non-PoD entries, tell decrease_reservation() that
@@ -661,12 +660,15 @@ p2m_pod_zero_check_superpage(struct p2m_
     for ( i=0; i<SUPERPAGE_PAGES; i++ )
     {
         
-        mfn = gfn_to_mfn_query(d, gfn + i, &type);
-
         if ( i == 0 )
         {
+            /* Only lock the p2m entry the first time, that will lock 
+             * server for the whole superpage */
+            mfn = gfn_to_mfn_query(d, gfn + i, &type);
             mfn0 = mfn;
             type0 = type;
+        } else {
+            mfn = gfn_to_mfn_query_unlocked(d, gfn + i, &type);
         }
 
         /* Conditions that must be met for superpage-superpage:
@@ -773,6 +775,10 @@ out:
         p2m_pod_cache_add(p2m, mfn_to_page(mfn0), PAGE_ORDER_2M);
         p2m->pod.entry_count += SUPERPAGE_PAGES;
     }
+    
+    /* We got p2m locks once for the whole superpage, with the original
+     * mfn0. We drop it here. */
+    drop_p2m_gfn(p2m, gfn, mfn_x(mfn0));    
 }
 
 /* On entry, PoD lock is held */
@@ -894,6 +900,12 @@ p2m_pod_zero_check(struct p2m_domain *p2
             p2m->pod.entry_count++;
         }
     }
+
+    /* Drop all p2m locks and references */
+    for ( i=0; i<count; i++ )
+    {
+        drop_p2m_gfn(p2m, gfns[i], mfn_x(mfns[i]));
+    }
     
 }
 
@@ -928,7 +940,9 @@ p2m_pod_emergency_sweep_super(struct p2m
     p2m->pod.reclaim_super = i ? i - SUPERPAGE_PAGES : 0;
 }
 
-#define POD_SWEEP_STRIDE  16
+/* 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  15
 static void
 p2m_pod_emergency_sweep(struct p2m_domain *p2m)
 {
@@ -946,7 +960,7 @@ 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 );
+        gfn_to_mfn_query_unlocked(p2m->domain, i, &t );
         if ( p2m_is_ram(t) )
         {
             gfns[j] = i;
@@ -974,6 +988,7 @@ p2m_pod_emergency_sweep(struct p2m_domai
 
 }
 
+/* The gfn and order need to be locked in the p2m before you walk in here */
 int
 p2m_pod_demand_populate(struct p2m_domain *p2m, unsigned long gfn,
                         unsigned int order,
@@ -985,8 +1000,6 @@ p2m_pod_demand_populate(struct p2m_domai
     mfn_t mfn;
     int i;
 
-    ASSERT(p2m_locked_by_me(p2m));
-
     pod_lock(p2m);
     /* This check is done with the pod lock held.  This will make sure that
      * even if d->is_dying changes under our feet, p2m_pod_empty_cache() 
@@ -1008,8 +1021,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);
-        /* This is because the ept/pt caller locks the p2m recursively */
-        p2m_unlock(p2m);
         return 0;
     }
 
@@ -1132,7 +1143,9 @@ guest_physmap_mark_populate_on_demand(st
     if ( rc != 0 )
         return rc;
 
-    p2m_lock(p2m);
+    /* Pre-lock all the p2m entries. We don't take refs to the
+     * pages, because there shouldn't be any pages underneath. */
+    get_p2m(p2m, gfn, order);
     audit_p2m(p2m, 1);
 
     P2M_DEBUG("mark pod gfn=%#lx\n", gfn);
@@ -1140,7 +1153,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",
@@ -1169,9 +1183,9 @@ guest_physmap_mark_populate_on_demand(st
     }
 
     audit_p2m(p2m, 1);
-    p2m_unlock(p2m);
 
 out:
+    put_p2m(p2m, gfn, order);
     return rc;
 }
 
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:
 }
 
 
-/* Non-ept "lock-and-check" wrapper */
+/* PT-specific check wrapper */
 static int p2m_pod_check_and_populate(struct p2m_domain *p2m, unsigned long gfn,
                                       l1_pgentry_t *p2m_entry, int order,
                                       p2m_query_t q)
 {
-    int r;
-
-    /* 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 )
-    {
-        p2m_unlock(p2m);
         return 0;
-    }
 
-    r = p2m_pod_demand_populate(p2m, gfn, order, q);
-
-    audit_p2m(p2m, 1);
-    p2m_unlock(p2m);
-
-    return r;
+    return p2m_pod_demand_populate(p2m, gfn, order, q);
 }
 
 /* Read the current domain's p2m table (through the linear mapping). */
@@ -894,6 +879,7 @@ static void p2m_change_type_global(struc
     if ( pagetable_get_pfn(p2m_get_pagetable(p2m)) == 0 )
         return;
 
+    /* Checks for exclusive lock */
     ASSERT(p2m_locked_by_me(p2m));
 
 #if CONFIG_PAGING_LEVELS == 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
                                   p2m_type_t ot, p2m_type_t nt)
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
-    p2m_lock(p2m);
+    get_p2m_global(p2m);
     p2m->change_entry_type_global(p2m, ot, nt);
-    p2m_unlock(p2m);
+    put_p2m_global(p2m);
 }
 
 mfn_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
         return _mfn(gfn);
     }
 
+    /* We take the lock for this single gfn. The caller has to put this lock */
+    get_p2m_gfn(p2m, 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));
+        /* p2m locking is recursive, so we won't deadlock going
+         * into the sharing code */
         mem_sharing_unshare_page(p2m->domain, gfn, 0);
         mfn = p2m->get_entry(p2m, gfn, t, a, q, page_order);
     }
@@ -179,13 +184,28 @@ mfn_t gfn_to_mfn_type_p2m(struct p2m_dom
         /* Return invalid_mfn to avoid caller's access */
         mfn = _mfn(INVALID_MFN);
         if (q == p2m_guest)
+        {
+            put_p2m_gfn(p2m, gfn);
             domain_crash(p2m->domain);
+        }
     }
 #endif
 
+    /* Take an extra reference to the page. It won't disappear beneath us */
+    if ( mfn_valid(mfn) )
+    {
+        /* Use this because we don't necessarily know who owns the page */
+        if ( !page_get_owner_and_reference(mfn_to_page(mfn)) )
+        {
+            mfn = _mfn(INVALID_MFN);
+        }
+    }
+
+    /* We leave holding the p2m lock for this gfn */
     return mfn;
 }
 
+/* Appropriate locks held on entry */
 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)
 {
@@ -194,8 +214,6 @@ int set_p2m_entry(struct p2m_domain *p2m
     unsigned int order;
     int rc = 1;
 
-    ASSERT(p2m_locked_by_me(p2m));
-
     while ( todo )
     {
         if ( hap_enabled(d) )
@@ -217,6 +235,18 @@ int set_p2m_entry(struct p2m_domain *p2m
     return rc;
 }
 
+void drop_p2m_gfn(struct p2m_domain *p2m, unsigned long gfn, 
+                    unsigned long frame)
+{
+    mfn_t mfn = _mfn(frame);
+    /* For non-translated domains, locks are never taken */
+    if ( !p2m || !paging_mode_translate(p2m->domain) )
+        return;
+    if ( mfn_valid(mfn) )
+        put_page(mfn_to_page(mfn));
+    put_p2m_gfn(p2m, gfn);
+}
+
 struct page_info *p2m_alloc_ptp(struct p2m_domain *p2m, unsigned long type)
 {
     struct page_info *pg;
@@ -262,12 +292,12 @@ int p2m_alloc_table(struct p2m_domain *p
     unsigned long gfn = -1UL;
     struct domain *d = p2m->domain;
 
-    p2m_lock(p2m);
+    get_p2m_global(p2m);
 
     if ( pagetable_get_pfn(p2m_get_pagetable(p2m)) != 0 )
     {
         P2M_ERROR("p2m already allocated for this domain\n");
-        p2m_unlock(p2m);
+        put_p2m_global(p2m);
         return -EINVAL;
     }
 
@@ -283,7 +313,7 @@ int p2m_alloc_table(struct p2m_domain *p
 
     if ( p2m_top == NULL )
     {
-        p2m_unlock(p2m);
+        put_p2m_global(p2m);
         return -ENOMEM;
     }
 
@@ -295,7 +325,7 @@ int p2m_alloc_table(struct p2m_domain *p
     P2M_PRINTK("populating p2m table\n");
 
     /* Initialise physmap tables for slot zero. Other code assumes this. */
-    p2m->defer_nested_flush = 1;
+    atomic_set(&p2m->defer_nested_flush, 1);
     if ( !set_p2m_entry(p2m, 0, _mfn(INVALID_MFN), 0,
                         p2m_invalid, p2m->default_access) )
         goto error;
@@ -323,10 +353,10 @@ int p2m_alloc_table(struct p2m_domain *p
         }
         spin_unlock(&p2m->domain->page_alloc_lock);
     }
-    p2m->defer_nested_flush = 0;
+    atomic_set(&p2m->defer_nested_flush, 0);
 
     P2M_PRINTK("p2m table initialised (%u pages)\n", page_count);
-    p2m_unlock(p2m);
+    put_p2m_global(p2m);
     return 0;
 
 error_unlock:
@@ -334,7 +364,7 @@ error_unlock:
  error:
     P2M_PRINTK("failed to initialize p2m table, gfn=%05lx, mfn=%"
                PRI_mfn "\n", gfn, mfn_x(mfn));
-    p2m_unlock(p2m);
+    put_p2m_global(p2m);
     return -ENOMEM;
 }
 
@@ -354,26 +384,28 @@ void p2m_teardown(struct p2m_domain *p2m
     if (p2m == NULL)
         return;
 
+    get_p2m_global(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 = p2m->get_entry(p2m, gfn, &t, &a, p2m_query, NULL);
         if ( mfn_valid(mfn) && (t == p2m_ram_shared) )
         {
             ASSERT(!p2m_is_nestedp2m(p2m));
+            /* The p2m allows an exclusive global holder to recursively
+             * lock sub-ranges. For this. */
             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)) )
         d->arch.paging.free_page(d, pg);
-    p2m_unlock(p2m);
+    put_p2m_global(p2m);
 }
 
 static void p2m_teardown_nestedp2m(struct domain *d)
@@ -401,6 +433,7 @@ void p2m_final_teardown(struct domain *d
 }
 
 
+/* Locks held on entry */
 static void
 p2m_remove_page(struct p2m_domain *p2m, unsigned long gfn, unsigned long mfn,
                 unsigned int page_order)
@@ -438,11 +471,11 @@ guest_physmap_remove_page(struct domain 
                           unsigned long mfn, unsigned int page_order)
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
-    p2m_lock(p2m);
+    get_p2m(p2m, gfn, page_order);
     audit_p2m(p2m, 1);
     p2m_remove_page(p2m, gfn, mfn, page_order);
     audit_p2m(p2m, 1);
-    p2m_unlock(p2m);
+    put_p2m(p2m, gfn, page_order);
 }
 
 int
@@ -480,7 +513,7 @@ guest_physmap_add_entry(struct domain *d
     if ( rc != 0 )
         return rc;
 
-    p2m_lock(p2m);
+    get_p2m(p2m, gfn, page_order);
     audit_p2m(p2m, 0);
 
     P2M_DEBUG("adding gfn=%#lx mfn=%#lx\n", gfn, mfn);
@@ -488,12 +521,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);
+        p2m_access_t a;
+        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 */
+            put_p2m(p2m, gfn, page_order);
             domain_crash(d);
-            p2m_unlock(p2m);
             return -EINVAL;
         }
         else if ( p2m_is_ram(ot) )
@@ -523,11 +557,12 @@ guest_physmap_add_entry(struct domain *d
             && (ogfn != INVALID_M2P_ENTRY)
             && (ogfn != gfn + i) )
         {
+            p2m_access_t a;
             /* This machine frame is already mapped at another physical
              * 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));
@@ -567,7 +602,7 @@ guest_physmap_add_entry(struct domain *d
     }
 
     audit_p2m(p2m, 1);
-    p2m_unlock(p2m);
+    put_p2m(p2m, gfn, page_order);
 
     return rc;
 }
@@ -579,18 +614,19 @@ p2m_type_t p2m_change_type(struct domain
                            p2m_type_t ot, p2m_type_t nt)
 {
     p2m_type_t pt;
+    p2m_access_t a;
     mfn_t mfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
     BUG_ON(p2m_is_grant(ot) || p2m_is_grant(nt));
 
-    p2m_lock(p2m);
+    get_p2m_gfn(p2m, 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);
 
-    p2m_unlock(p2m);
+    put_p2m_gfn(p2m, gfn);
 
     return pt;
 }
@@ -608,20 +644,23 @@ void p2m_change_type_range(struct domain
 
     BUG_ON(p2m_is_grant(ot) || p2m_is_grant(nt));
 
-    p2m_lock(p2m);
-    p2m->defer_nested_flush = 1;
+    atomic_set(&p2m->defer_nested_flush, 1);
 
+    /* We've been given a number instead of an order, so lock each
+     * gfn individually */
     for ( gfn = start; gfn < end; gfn++ )
     {
-        mfn = gfn_to_mfn_query(d, gfn, &pt);
+        p2m_access_t a;
+        get_p2m_gfn(p2m, gfn);
+        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);
+        put_p2m_gfn(p2m, gfn);
     }
 
-    p2m->defer_nested_flush = 0;
+    atomic_set(&p2m->defer_nested_flush, 0);
     if ( nestedhvm_enabled(d) )
         p2m_flush_nestedp2m(d);
-    p2m_unlock(p2m);
 }
 
 
@@ -631,17 +670,18 @@ set_mmio_p2m_entry(struct domain *d, uns
 {
     int rc = 0;
     p2m_type_t ot;
+    p2m_access_t a;
     mfn_t omfn;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
     if ( !paging_mode_translate(d) )
         return 0;
 
-    p2m_lock(p2m);
-    omfn = gfn_to_mfn_query(d, gfn, &ot);
+    get_p2m_gfn(p2m, gfn);
+    omfn = p2m->get_entry(p2m, gfn, &ot, &a, p2m_query, NULL);
     if ( p2m_is_grant(ot) )
     {
-        p2m_unlock(p2m);
+        put_p2m_gfn(p2m, gfn);
         domain_crash(d);
         return 0;
     }
@@ -654,11 +694,11 @@ 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, 0, p2m_mmio_direct, p2m->default_access);
     audit_p2m(p2m, 1);
-    p2m_unlock(p2m);
+    put_p2m_gfn(p2m, gfn);
     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(gfn_to_mfn_query_unlocked(d, gfn, &ot)));
     return rc;
 }
 
@@ -668,13 +708,14 @@ clear_mmio_p2m_entry(struct domain *d, u
     int rc = 0;
     mfn_t mfn;
     p2m_type_t t;
+    p2m_access_t a;
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
 
     if ( !paging_mode_translate(d) )
         return 0;
 
-    p2m_lock(p2m);
-    mfn = gfn_to_mfn_query(d, gfn, &t);
+    get_p2m_gfn(p2m, gfn);
+    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) )
@@ -687,8 +728,7 @@ clear_mmio_p2m_entry(struct domain *d, u
     audit_p2m(p2m, 1);
 
 out:
-    p2m_unlock(p2m);
-
+    put_p2m_gfn(p2m, gfn);
     return rc;
 }
 
@@ -698,13 +738,14 @@ set_shared_p2m_entry(struct domain *d, u
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     int rc = 0;
     p2m_type_t ot;
+    p2m_access_t a;
     mfn_t omfn;
 
     if ( !paging_mode_translate(p2m->domain) )
         return 0;
 
-    p2m_lock(p2m);
-    omfn = gfn_to_mfn_query(p2m->domain, gfn, &ot);
+    get_p2m_gfn(p2m, gfn);
+    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));
@@ -714,11 +755,11 @@ set_shared_p2m_entry(struct domain *d, u
 
     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);
-    p2m_unlock(p2m);
+    put_p2m_gfn(p2m, gfn);
     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(gfn_to_mfn_query_unlocked(d, gfn, &ot)));
     return rc;
 }
 
@@ -732,7 +773,7 @@ int p2m_mem_paging_nominate(struct domai
     mfn_t mfn;
     int ret;
 
-    p2m_lock(p2m);
+    get_p2m_gfn(p2m, gfn);
 
     mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
 
@@ -765,7 +806,7 @@ int p2m_mem_paging_nominate(struct domai
     ret = 0;
 
  out:
-    p2m_unlock(p2m);
+    put_p2m_gfn(p2m, gfn);
     return ret;
 }
 
@@ -778,7 +819,7 @@ int p2m_mem_paging_evict(struct domain *
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     int ret = -EINVAL;
 
-    p2m_lock(p2m);
+    get_p2m_gfn(p2m, gfn);
 
     /* Get mfn */
     mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
@@ -824,7 +865,7 @@ int p2m_mem_paging_evict(struct domain *
     put_page(page);
 
  out:
-    p2m_unlock(p2m);
+    put_p2m_gfn(p2m, gfn);
     return ret;
 }
 
@@ -863,7 +904,7 @@ void p2m_mem_paging_populate(struct doma
     req.type = MEM_EVENT_TYPE_PAGING;
 
     /* Fix p2m mapping */
-    p2m_lock(p2m);
+    get_p2m_gfn(p2m, gfn);
     mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
     /* Allow only nominated or evicted pages to enter page-in path */
     if ( p2mt == p2m_ram_paging_out || p2mt == p2m_ram_paged )
@@ -875,7 +916,7 @@ void p2m_mem_paging_populate(struct doma
         set_p2m_entry(p2m, gfn, mfn, 0, p2m_ram_paging_in_start, a);
         audit_p2m(p2m, 1);
     }
-    p2m_unlock(p2m);
+    put_p2m_gfn(p2m, gfn);
 
     /* Pause domain if request came from guest and gfn has paging type */
     if (  p2m_is_paging(p2mt) && v->domain->domain_id == d->domain_id )
@@ -908,7 +949,7 @@ int p2m_mem_paging_prep(struct domain *d
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     int ret = -ENOMEM;
 
-    p2m_lock(p2m);
+    get_p2m_gfn(p2m, gfn);
 
     mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, p2m_query, NULL);
 
@@ -931,7 +972,7 @@ int p2m_mem_paging_prep(struct domain *d
     ret = 0;
 
  out:
-    p2m_unlock(p2m);
+    put_p2m_gfn(p2m, gfn);
     return ret;
 }
 
@@ -949,12 +990,12 @@ void p2m_mem_paging_resume(struct domain
     /* Fix p2m entry if the page was not dropped */
     if ( !(rsp.flags & MEM_EVENT_FLAG_DROP_PAGE) )
     {
-        p2m_lock(p2m);
+        get_p2m_gfn(p2m, rsp.gfn);
         mfn = p2m->get_entry(p2m, rsp.gfn, &p2mt, &a, p2m_query, NULL);
         set_p2m_entry(p2m, rsp.gfn, mfn, 0, p2m_ram_rw, a);
         set_gpfn_from_mfn(mfn_x(mfn), rsp.gfn);
         audit_p2m(p2m, 1);
-        p2m_unlock(p2m);
+        put_p2m_gfn(p2m, rsp.gfn);
     }
 
     /* Unpause domain */
@@ -979,16 +1020,16 @@ void p2m_mem_access_check(unsigned long 
     p2m_access_t p2ma;
     
     /* First, handle rx2rw conversion automatically */
-    p2m_lock(p2m);
+    get_p2m_gfn(p2m, gfn);
     mfn = p2m->get_entry(p2m, gfn, &p2mt, &p2ma, p2m_query, NULL);
 
     if ( access_w && p2ma == p2m_access_rx2rw ) 
     {
         p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2mt, p2m_access_rw);
-        p2m_unlock(p2m);
+        put_p2m_gfn(p2m, gfn);
         return;
     }
-    p2m_unlock(p2m);
+    put_p2m_gfn(p2m, gfn);
 
     /* Otherwise, check if there is a memory event listener, and send the message along */
     res = mem_event_check_ring(d, &d->mem_access);
@@ -1006,9 +1047,9 @@ void p2m_mem_access_check(unsigned long 
         else
         {
             /* A listener is not required, so clear the access restrictions */
-            p2m_lock(p2m);
+            get_p2m_gfn(p2m, gfn);
             p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2mt, p2m_access_rwx);
-            p2m_unlock(p2m);
+            put_p2m_gfn(p2m, gfn);
         }
 
         return;
@@ -1064,7 +1105,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;
@@ -1095,17 +1136,20 @@ int p2m_set_mem_access(struct domain *d,
         return 0;
     }
 
-    p2m_lock(p2m);
+    /* Because we don't get an order, rather a number, we need to lock each
+     * entry individually */
     for ( pfn = start_pfn; pfn < start_pfn + nr; pfn++ )
     {
-        mfn = gfn_to_mfn_query(d, pfn, &t);
+        get_p2m_gfn(p2m, pfn);
+        mfn = p2m->get_entry(p2m, pfn, &t, &_a, p2m_query, NULL);
         if ( p2m->set_entry(p2m, pfn, mfn, PAGE_ORDER_4K, t, a) == 0 )
         {
+            put_p2m_gfn(p2m, pfn);
             rc = -ENOMEM;
             break;
         }
+        put_p2m_gfn(p2m, pfn);
     }
-    p2m_unlock(p2m);
     return rc;
 }
 
@@ -1138,7 +1182,10 @@ int p2m_get_mem_access(struct domain *d,
         return 0;
     }
 
+    get_p2m_gfn(p2m, pfn);
     mfn = p2m->get_entry(p2m, pfn, &t, &a, p2m_query, NULL);
+    put_p2m_gfn(p2m, pfn);
+
     if ( mfn_x(mfn) == INVALID_MFN )
         return -ESRCH;
     
@@ -1175,7 +1222,7 @@ p2m_flush_table(struct p2m_domain *p2m)
     struct domain *d = p2m->domain;
     void *p;
 
-    p2m_lock(p2m);
+    get_p2m_global(p2m);
 
     /* "Host" p2m tables can have shared entries &c that need a bit more 
      * care when discarding them */
@@ -1203,7 +1250,7 @@ p2m_flush_table(struct p2m_domain *p2m)
             d->arch.paging.free_page(d, pg);
     page_list_add(top, &p2m->pages);
 
-    p2m_unlock(p2m);
+    put_p2m_global(p2m);
 }
 
 void
@@ -1245,7 +1292,7 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
     p2m = nv->nv_p2m;
     if ( p2m ) 
     {
-        p2m_lock(p2m);
+        get_p2m_global(p2m);
         if ( p2m->cr3 == cr3 || p2m->cr3 == CR3_EADDR )
         {
             nv->nv_flushp2m = 0;
@@ -1255,24 +1302,24 @@ p2m_get_nestedp2m(struct vcpu *v, uint64
                 hvm_asid_flush_vcpu(v);
             p2m->cr3 = cr3;
             cpu_set(v->processor, p2m->p2m_dirty_cpumask);
-            p2m_unlock(p2m);
+            put_p2m_global(p2m);
             nestedp2m_unlock(d);
             return p2m;
         }
-        p2m_unlock(p2m);
+        put_p2m_global(p2m);
     }
 
     /* All p2m's are or were in use. Take the least recent used one,
      * flush it and reuse. */
     p2m = p2m_getlru_nestedp2m(d, NULL);
     p2m_flush_table(p2m);
-    p2m_lock(p2m);
+    get_p2m_global(p2m);
     nv->nv_p2m = p2m;
     p2m->cr3 = cr3;
     nv->nv_flushp2m = 0;
     hvm_asid_flush_vcpu(v);
     cpu_set(v->processor, p2m->p2m_dirty_cpumask);
-    p2m_unlock(p2m);
+    put_p2m_global(p2m);
     nestedp2m_unlock(d);
 
     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
     ((get_gpfn_from_mfn((madr) >> PAGE_SHIFT) << PAGE_SHIFT) | \
     ((madr) & ~PAGE_MASK))
 
+/* Because x86-specific p2m fine-grained lock releases are called from common
+ * code, we put a dummy placeholder here */
+#define drop_p2m_gfn(p, g, m)           ((void)0)
+#define drop_p2m_gfn_domain(p, g, m)    ((void)0)
+
 /* Internal use only: returns 0 in case of bad address.  */
 extern 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 {
      * 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 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, 
+                        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 p2m 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 = 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)
+
 /* Compatibility function exporting the old untyped interface */
 static inline unsigned long gmfn_to_mfn(struct domain *d, unsigned long gpfn)
 {
@@ -338,6 +369,15 @@ static inline unsigned long gmfn_to_mfn(
     return INVALID_MFN;
 }
 
+/* Same comments apply re unlocking */
+static inline unsigned long gmfn_to_mfn_unlocked(struct domain *d,
+                                                 unsigned long gpfn)
+{
+    unsigned long mfn = gmfn_to_mfn(d, gpfn);
+    drop_p2m_gfn_domain(d, gpfn, mfn);
+    return mfn;
+}
+
 /* General conversion function from mfn to gfn */
 static inline unsigned long mfn_to_gfn(struct domain *d, mfn_t mfn)
 {
@@ -521,7 +561,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. It expects locks to 
+ * be held on entry */
 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 Thu Oct 27 05:37:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:37:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPDL-00060n-UR; Thu, 27 Oct 2011 05:37:44 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJHlh-0006cN-J0
	for xen-devel@lists.xensource.com; Wed, 26 Oct 2011 21:40:42 -0700
X-Env-Sender: andres@lagarcavilla.org
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319690435!256192!2
X-Originating-IP: [208.97.132.202]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24580 invoked from network); 27 Oct 2011 04:40:37 -0000
Received: from caiajhbdccac.dreamhost.com (HELO homiemail-a20.g.dreamhost.com)
	(208.97.132.202) by server-5.tower-21.messagelabs.com with SMTP;
	27 Oct 2011 04:40:37 -0000
Received: from homiemail-a20.g.dreamhost.com (localhost [127.0.0.1])
	by homiemail-a20.g.dreamhost.com (Postfix) with ESMTP id 2AD647EC064;
	Wed, 26 Oct 2011 21:40:37 -0700 (PDT)
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=nl6YNPSXCmoTR3zi/7hyf/8TMqsqCIlU9f9XZSugbBCL
	gwi9dx3HAhH9KyCDcRVD3ueCdhQRkfJcsyM9/rKipZaiQsu3XqIQ7If76F0h2d91
	qu1nHHBimgbVMMKvCXEHnD1uvpy8/KsT2QCOC63Wm4z7y/JK8NWDERK/NDuZLzQ=
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=S6O0EXiWwOyFuDgdW93jbU20AQU=; b=aMVjPw+Y6F6
	aV5F3A3rakfqQxGRBr3h9D24MaMDBkZWXIGyCb5ahXijTilNCFj+vgxqFJt7tK8b
	FaaoGangfsic/EWxe0YwcDoDtbFWOFkylURSTCY8ZJK2DbKTSA39DZg/w6gMp9J0
	lwFNJVHjXw3KPBWdmdJHJLAwljV0ZdwQ=
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-a20.g.dreamhost.com (Postfix) with ESMTPSA id 3B2A77EC060; 
	Wed, 26 Oct 2011 21:40:36 -0700 (PDT)
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
X-Mercurial-Node: d13f91c2fe18d58ad27fe90386d596112f2b4939
Message-Id: <d13f91c2fe18d58ad27f.1319690034@xdev.gridcentric.ca>
In-Reply-To: <patchbomb.1319690025@xdev.gridcentric.ca>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
User-Agent: Mercurial-patchbomb/1.8.4
Date: Thu, 27 Oct 2011 00:33:54 -0400
From: Andres Lagar-Cavilla <andres@lagarcavilla.org>
To: xen-devel@lists.xensource.com
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:18 -0700
Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, olaf@aepfle.de,
	adin@gridcentric.ca
Subject: [Xen-devel] [PATCH 9 of 9] Modify all call sites of queries into
 the p2m to use the new fine-grained locking
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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     |    7 +-
 xen/arch/x86/debug.c               |    7 +-
 xen/arch/x86/domain.c              |   24 +++++-
 xen/arch/x86/domctl.c              |    9 ++-
 xen/arch/x86/hvm/emulate.c         |   25 ++++++-
 xen/arch/x86/hvm/hvm.c             |  126 ++++++++++++++++++++++++++++++------
 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        |    4 +
 xen/arch/x86/hvm/vmx/vmx.c         |   13 +++-
 xen/arch/x86/hvm/vmx/vvmx.c        |   11 ++-
 xen/arch/x86/mm.c                  |  126 +++++++++++++++++++++++++++++++++---
 xen/arch/x86/mm/guest_walk.c       |   11 +++
 xen/arch/x86/mm/hap/guest_walk.c   |   15 +++-
 xen/arch/x86/mm/mem_event.c        |   28 ++++++-
 xen/arch/x86/mm/mem_sharing.c      |   23 +++++-
 xen/arch/x86/mm/shadow/common.c    |    4 +-
 xen/arch/x86/mm/shadow/multi.c     |   67 +++++++++++++++----
 xen/arch/x86/physdev.c             |    9 ++
 xen/arch/x86/traps.c               |   17 +++-
 xen/common/grant_table.c           |   27 +++++++-
 xen/common/memory.c                |    9 ++
 xen/common/tmem_xen.c              |   21 ++++-
 xen/include/asm-x86/hvm/hvm.h      |    5 +-
 xen/include/asm-x86/hvm/vmx/vvmx.h |    1 +
 28 files changed, 519 insertions(+), 101 deletions(-)


This patch is humongous, unfortunately, given the dozens of call sites
involved.

For callers outside of the p2m code, we also perform a get_page on the
resulting mfn of the query. This ensures that the caller, while operating
on the gfn, has exclusive control of the p2m entry, and that the underlying
mfn will not go away.

We cannot enforce ordering of this fine-grained p2m lock at this point
because there are some inversions present in the current code (pod sweeps,
unshare page) that will take more time to unroot.

Signed-off-by: Andres Lagar-Cavilla <andres@lagarcavilla.org>

diff -r 471d4f2754d6 -r d13f91c2fe18 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;
 
+    rc = -1;
     r_mfn = gfn_to_mfn_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;
     }
+    drop_p2m_gfn_domain(d, gfn, mfn_x(r_mfn));
 
-    return -1;
+    return rc;
 }
 
diff -r 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/debug.c
--- a/xen/arch/x86/debug.c
+++ b/xen/arch/x86/debug.c
@@ -45,7 +45,8 @@
 static unsigned long 
 dbg_hvm_va2mfn(dbgva_t vaddr, struct domain *dp, int toaddr)
 {
-    unsigned long mfn, gfn;
+    unsigned long gfn;
+    mfn_t mfn;
     uint32_t pfec = PFEC_page_present;
     p2m_type_t gfntype;
 
@@ -58,7 +59,7 @@ dbg_hvm_va2mfn(dbgva_t vaddr, struct dom
         return INVALID_MFN;
     }
 
-    mfn = mfn_x(gfn_to_mfn(dp, gfn, &gfntype)); 
+    mfn = gfn_to_mfn_unlocked(dp, gfn, &gfntype); 
     if ( p2m_is_readonly(gfntype) && toaddr )
     {
         DBGP2("kdb:p2m_is_readonly: gfntype:%x\n", gfntype);
@@ -66,7 +67,7 @@ dbg_hvm_va2mfn(dbgva_t vaddr, struct dom
     }
 
     DBGP2("X: vaddr:%lx domid:%d mfn:%lx\n", vaddr, dp->domain_id, mfn);
-    return mfn;
+    return mfn_x(mfn);
 }
 
 #if defined(__x86_64__)
diff -r 471d4f2754d6 -r d13f91c2fe18 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 = gmfn_to_mfn(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)) )
         {
+            drop_p2m_gfn_domain(d, cr3_gfn, cr3_pfn);
             destroy_gdt(v);
             return -EINVAL;
         }
 
         v->arch.guest_table = pagetable_from_pfn(cr3_pfn);
-
+        drop_p2m_gfn_domain(d, cr3_gfn, cr3_pfn);
 #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 = gmfn_to_mfn(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));
+                drop_p2m_gfn_domain(d, cr3_gfn, cr3_pfn); 
                 destroy_gdt(v);
                 return -EINVAL;
             }
 
             v->arch.guest_table_user = pagetable_from_pfn(cr3_pfn);
+            drop_p2m_gfn_domain(d, cr3_gfn, cr3_pfn); 
         }
         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 = gmfn_to_mfn(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)) )
         {
+            drop_p2m_gfn_domain(d, cr3_gfn, cr3_pfn); 
             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);
+        drop_p2m_gfn_domain(d, cr3_gfn, cr3_pfn); 
 #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,7 +1085,7 @@ 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 = gmfn_to_mfn(d, gfn);
     if ( !mfn_valid(mfn) ||
          !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
         return -EINVAL;
@@ -1084,6 +1094,7 @@ map_vcpu_info(struct vcpu *v, unsigned l
     if ( mapping == NULL )
     {
         put_page_and_type(mfn_to_page(mfn));
+        drop_p2m_gfn_domain(d, gfn, mfn); 
         return -ENOMEM;
     }
 
@@ -1113,6 +1124,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));
 
+    drop_p2m_gfn_domain(d, gfn, mfn); 
     return 0;
 }
 
diff -r 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/domctl.c
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -235,6 +235,7 @@ long arch_do_domctl(
                         type = XEN_DOMCTL_PFINFO_XTAB;
 
                     arr[j] = type;
+                    drop_p2m_gfn_domain(d, arr[j], mfn);
                 }
 
                 if ( copy_to_guest_offset(domctl->u.getpageframeinfo3.array,
@@ -299,6 +300,7 @@ long arch_do_domctl(
             for ( j = 0; j < k; j++ )
             {      
                 struct page_info *page;
+                unsigned long gfn = arr32[j];
                 unsigned long mfn = gmfn_to_mfn(d, arr32[j]);
 
                 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 )
+                {
+                    drop_p2m_gfn_domain(d, gfn, mfn); 
                     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;
 
+                drop_p2m_gfn_domain(d, gfn, mfn); 
             }
 
             if ( copy_to_guest_offset(domctl->u.getpageframeinfo2.array,
@@ -431,6 +436,7 @@ long arch_do_domctl(
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
         {
+            drop_p2m_gfn_domain(d, gmfn, mfn); 
             rcu_unlock_domain(d);
             break;
         }
@@ -443,6 +449,7 @@ long arch_do_domctl(
 
         put_page_and_type(mfn_to_page(mfn));
 
+        drop_p2m_gfn_domain(d, gmfn, mfn); 
         rcu_unlock_domain(d);
     }
     break;
diff -r 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/hvm/emulate.c
--- a/xen/arch/x86/hvm/emulate.c
+++ b/xen/arch/x86/hvm/emulate.c
@@ -66,10 +66,14 @@ static int hvmemul_do_io(
     if ( p2m_is_paging(p2mt) )
     {
         p2m_mem_paging_populate(curr->domain, ram_gfn);
+        drop_p2m_gfn_domain(curr->domain, ram_gfn, mfn_x(ram_mfn)); 
         return X86EMUL_RETRY;
     }
     if ( p2m_is_shared(p2mt) )
+    {
+        drop_p2m_gfn_domain(curr->domain, ram_gfn, mfn_x(ram_mfn)); 
         return X86EMUL_RETRY;
+    }
 
     /*
      * Weird-sized accesses have undefined behaviour: we discard writes
@@ -81,6 +85,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);
+        drop_p2m_gfn_domain(curr->domain, ram_gfn, mfn_x(ram_mfn)); 
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -98,7 +103,10 @@ static int hvmemul_do_io(
             paddr_t pa = curr->arch.hvm_vcpu.mmio_large_write_pa;
             unsigned int bytes = curr->arch.hvm_vcpu.mmio_large_write_bytes;
             if ( (addr >= pa) && ((addr + size) <= (pa + bytes)) )
+            {
+                drop_p2m_gfn_domain(curr->domain, ram_gfn, mfn_x(ram_mfn)); 
                 return X86EMUL_OKAY;
+            }
         }
         else
         {
@@ -108,6 +116,7 @@ static int hvmemul_do_io(
             {
                 memcpy(p_data, &curr->arch.hvm_vcpu.mmio_large_read[addr - pa],
                        size);
+                drop_p2m_gfn_domain(curr->domain, ram_gfn, mfn_x(ram_mfn)); 
                 return X86EMUL_OKAY;
             }
         }
@@ -120,15 +129,22 @@ static int hvmemul_do_io(
     case HVMIO_completed:
         curr->arch.hvm_vcpu.io_state = HVMIO_none;
         if ( p_data == NULL )
+        {
+            drop_p2m_gfn_domain(curr->domain, ram_gfn, mfn_x(ram_mfn)); 
             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 == (curr->arch.hvm_vcpu.mmio_large_write_pa +
                        curr->arch.hvm_vcpu.mmio_large_write_bytes)) )
+        {
+            drop_p2m_gfn_domain(curr->domain, ram_gfn, mfn_x(ram_mfn)); 
             return X86EMUL_RETRY;
+        }
     default:
+        drop_p2m_gfn_domain(curr->domain, ram_gfn, mfn_x(ram_mfn)); 
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -136,6 +152,7 @@ static int hvmemul_do_io(
     {
         gdprintk(XENLOG_WARNING, "WARNING: io already pending (%d)?\n",
                  p->state);
+        drop_p2m_gfn_domain(curr->domain, ram_gfn, mfn_x(ram_mfn)); 
         return X86EMUL_UNHANDLEABLE;
     }
 
@@ -186,7 +203,10 @@ static int hvmemul_do_io(
     }
 
     if ( rc != X86EMUL_OKAY )
+    {
+        drop_p2m_gfn_domain(curr->domain, ram_gfn, mfn_x(ram_mfn)); 
         return rc;
+    }
 
  finish_access:
     if ( p_data != NULL )
@@ -221,6 +241,7 @@ static int hvmemul_do_io(
         }
     }
 
+    drop_p2m_gfn_domain(curr->domain, ram_gfn, mfn_x(ram_mfn)); 
     return X86EMUL_OKAY;
 }
 
@@ -669,12 +690,12 @@ static int hvmemul_rep_movs(
     if ( rc != X86EMUL_OKAY )
         return rc;
 
-    (void)gfn_to_mfn(current->domain, sgpa >> PAGE_SHIFT, &p2mt);
+    (void)gfn_to_mfn_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)gfn_to_mfn_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 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -357,24 +357,35 @@ static int hvm_set_ioreq_page(
 
     mfn = mfn_x(gfn_to_mfn_unshare(d, gmfn, &p2mt));
     if ( !p2m_is_ram(p2mt) )
+    {
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         return -EINVAL;
+    }
     if ( p2m_is_paging(p2mt) )
     {
         p2m_mem_paging_populate(d, gmfn);
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         return -ENOENT;
     }
     if ( p2m_is_shared(p2mt) )
+    {
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         return -ENOENT;
+    }
     ASSERT(mfn_valid(mfn));
 
     page = mfn_to_page(mfn);
     if ( !get_page_and_type(page, d, PGT_writable_page) )
+    {
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         return -EINVAL;
+    }
 
     va = map_domain_page_global(mfn);
     if ( va == NULL )
     {
         put_page_and_type(page);
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         return -ENOMEM;
     }
 
@@ -385,12 +396,14 @@ static int hvm_set_ioreq_page(
         spin_unlock(&iorp->lock);
         unmap_domain_page_global(va);
         put_page_and_type(mfn_to_page(mfn));
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         return -EINVAL;
     }
 
     iorp->va = va;
     iorp->page = page;
 
+    drop_p2m_gfn_domain(d, gmfn, mfn);
     spin_unlock(&iorp->lock);
 
     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.
@@ -1251,8 +1265,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_p2m;
         }
     }
 
@@ -1264,7 +1278,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_p2m;
     }
 
 #ifdef __x86_64__
@@ -1277,7 +1292,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_p2m;
     }
 #endif
  
@@ -1291,7 +1307,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_p2m;
     }
 
     /* Shouldn't happen: Maybe the guest was writing to a r/o grant mapping? */
@@ -1300,10 +1317,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_p2m;
     }
 
-    return 0;
+    rc = 0;
+out_put_p2m:
+    drop_p2m_gfn(p2m, gfn, mfn_x(mfn));
+    return rc;
 }
 
 int hvm_handle_xsetbv(u64 new_bv)
@@ -1530,6 +1551,7 @@ int hvm_set_cr0(unsigned long value)
             if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) ||
                  !get_page(mfn_to_page(mfn), v->domain))
             {
+                drop_p2m_gfn_domain(v->domain, gfn, mfn);
                 gdprintk(XENLOG_ERR, "Invalid CR3 value = %lx (mfn=%lx)\n",
                          v->arch.hvm_vcpu.guest_cr[3], mfn);
                 domain_crash(v->domain);
@@ -1541,6 +1563,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);
+            drop_p2m_gfn_domain(v->domain, gfn, mfn);
         }
     }
     else if ( !(value & X86_CR0_PG) && (old_value & X86_CR0_PG) )
@@ -1620,10 +1643,15 @@ int hvm_set_cr3(unsigned long value)
         mfn = mfn_x(gfn_to_mfn(v->domain, value >> PAGE_SHIFT, &p2mt));
         if ( !p2m_is_ram(p2mt) || !mfn_valid(mfn) ||
              !get_page(mfn_to_page(mfn), v->domain) )
+        {
+              drop_p2m_gfn_domain(v->domain, 
+                            value >> PAGE_SHIFT, mfn);
               goto bad_cr3;
+        }
 
         put_page(pagetable_get_page(v->arch.guest_table));
         v->arch.guest_table = pagetable_from_pfn(mfn);
+        drop_p2m_gfn_domain(v->domain, value >> PAGE_SHIFT, mfn);
 
         HVM_DBG_LOG(DBG_LEVEL_VMMU, "Update CR3 value = %lx", value);
     }
@@ -1760,6 +1788,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;
@@ -1770,10 +1800,14 @@ static void *__hvm_map_guest_frame(unsig
                 ? gfn_to_mfn_unshare(d, gfn, &p2mt)
                 : gfn_to_mfn(d, gfn, &p2mt));
     if ( (p2m_is_shared(p2mt) && writable) || !p2m_is_ram(p2mt) )
+    {
+        drop_p2m_gfn_domain(d, gfn, mfn);
         return NULL;
+    }
     if ( p2m_is_paging(p2mt) )
     {
         p2m_mem_paging_populate(d, gfn);
+        drop_p2m_gfn_domain(d, gfn, mfn);
         return NULL;
     }
 
@@ -1795,10 +1829,39 @@ 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 = ~0UL;
+
+        if ( is_va )
+        {
+            if ( addr )
+            {
+                uint32_t pfec = 0;
+                gfn = paging_gva_to_gfn(current, addr, &pfec);
+            } else {
+                gfn = ~0UL;
+            }
+        } else {
+            gfn = addr;
+        }
+
+        if ( gfn != ~0UL )
+        {
+            /* And we get a recursive lock and second ref */
+            p2m_type_t t;
+            unsigned long mfn = mfn_x(gfn_to_mfn(current->domain, gfn, &t));
+            drop_p2m_gfn_domain(current->domain, gfn, mfn);
+            drop_p2m_gfn_domain(current->domain, gfn, mfn);
+        }
+
         unmap_domain_page(p);
+    }
 }
 
 static void *hvm_map_entry(unsigned long va)
@@ -1835,9 +1898,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(
@@ -1849,6 +1912,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 )
     {
@@ -1882,7 +1946,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;
 
@@ -1942,7 +2007,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) |
@@ -1958,7 +2023,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:
@@ -1973,7 +2038,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;
@@ -1999,11 +2064,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;
 
@@ -2168,8 +2235,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)
@@ -2182,7 +2249,7 @@ static enum hvm_copy_result __hvm_copy(
     void *buf, paddr_t addr, int size, unsigned int flags, uint32_t pfec)
 {
     struct vcpu *curr = current;
-    unsigned long gfn, mfn;
+    unsigned long gfn = 0, mfn = 0; /* gcc ... */
     p2m_type_t p2mt;
     char *p;
     int count, todo = size;
@@ -2231,14 +2298,24 @@ static enum hvm_copy_result __hvm_copy(
         if ( p2m_is_paging(p2mt) )
         {
             p2m_mem_paging_populate(curr->domain, gfn);
+            drop_p2m_gfn_domain(curr->domain, gfn, mfn);
             return HVMCOPY_gfn_paged_out;
         }
         if ( p2m_is_shared(p2mt) )
+        {
+            drop_p2m_gfn_domain(curr->domain, gfn, mfn);
             return HVMCOPY_gfn_shared;
+        }
         if ( p2m_is_grant(p2mt) )
+        {
+            drop_p2m_gfn_domain(curr->domain, gfn, mfn);
             return HVMCOPY_unhandleable;
+        }
         if ( !p2m_is_ram(p2mt) )
+        {
+            drop_p2m_gfn_domain(curr->domain, gfn, mfn);
             return HVMCOPY_bad_gfn_to_mfn;
+        }
         ASSERT(mfn_valid(mfn));
 
         p = (char *)map_domain_page(mfn) + (addr & ~PAGE_MASK);
@@ -2269,6 +2346,7 @@ static enum hvm_copy_result __hvm_copy(
         addr += count;
         buf  += count;
         todo -= count;
+        drop_p2m_gfn_domain(curr->domain, gfn, mfn);
     }
 
     return HVMCOPY_okay;
@@ -3688,7 +3766,7 @@ long do_hvm_op(unsigned long op, XEN_GUE
             if ( p2m_is_paging(t) )
             {
                 p2m_mem_paging_populate(d, pfn);
-
+                drop_p2m_gfn_domain(d, pfn, mfn_x(mfn));
                 rc = -EINVAL;
                 goto param_fail3;
             }
@@ -3703,6 +3781,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);
             }
+            drop_p2m_gfn_domain(d, pfn, mfn_x(mfn));
         }
 
     param_fail3:
@@ -3726,7 +3805,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);
+            gfn_to_mfn_unshare_unlocked(d, a.pfn, &t);
             if ( p2m_is_mmio(t) )
                 a.mem_type =  HVMMEM_mmio_dm;
             else if ( p2m_is_readonly(t) )
@@ -3783,16 +3862,19 @@ long do_hvm_op(unsigned long op, XEN_GUE
             if ( p2m_is_paging(t) )
             {
                 p2m_mem_paging_populate(d, pfn);
+                drop_p2m_gfn_domain(d, pfn, mfn_x(mfn));
                 rc = -EINVAL;
                 goto param_fail4;
             }
             if ( p2m_is_shared(t) )
             {
+                drop_p2m_gfn_domain(d, pfn, mfn_x(mfn));
                 rc = -EINVAL;
                 goto param_fail4;
             } 
             if ( p2m_is_grant(t) )
             {
+                drop_p2m_gfn_domain(d, pfn, mfn_x(mfn));
                 gdprintk(XENLOG_WARNING,
                          "type for pfn 0x%lx changed to grant while "
                          "we were working?\n", pfn);
@@ -3803,6 +3885,7 @@ long do_hvm_op(unsigned long op, XEN_GUE
                 nt = p2m_change_type(d, pfn, t, memtype[a.hvmmem_type]);
                 if ( nt != t )
                 {
+                    drop_p2m_gfn_domain(d, pfn, mfn_x(mfn));
                     gdprintk(XENLOG_WARNING,
                              "type of pfn 0x%lx changed from %d to %d while "
                              "we were trying to change it to %d\n",
@@ -3810,6 +3893,7 @@ long do_hvm_op(unsigned long op, XEN_GUE
                     goto param_fail4;
                 }
             }
+            drop_p2m_gfn_domain(d, pfn, mfn_x(mfn));
         }
 
         rc = 0;
diff -r 471d4f2754d6 -r d13f91c2fe18 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);
+        gfn_to_mfn_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 471d4f2754d6 -r d13f91c2fe18 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 471d4f2754d6 -r d13f91c2fe18 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)gfn_to_mfn_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)gfn_to_mfn_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 471d4f2754d6 -r d13f91c2fe18 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 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -247,6 +247,8 @@ static int svm_vmcb_restore(struct vcpu 
             mfn = mfn_x(gfn_to_mfn(v->domain, c->cr3 >> PAGE_SHIFT, &p2mt));
             if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) )
             {
+                drop_p2m_gfn_domain(v->domain, 
+                                                c->cr3 >> PAGE_SHIFT, mfn);
                 gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%"PRIx64"\n",
                          c->cr3);
                 return -EINVAL;
@@ -257,6 +259,10 @@ 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 )
+        {
+            drop_p2m_gfn_domain(v->domain, c->cr3 >> PAGE_SHIFT, mfn);
+        }
     }
 
     v->arch.hvm_vcpu.guest_cr[0] = c->cr0 | X86_CR0_ET;
@@ -1160,7 +1166,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 = gfn_to_mfn_type_p2m(p2m, gfn, &_d.p2mt, &p2ma, p2m_query, NULL);
+        _d.mfn = mfn_x(mfn);
+        drop_p2m_gfn(p2m, gfn, mfn_x(mfn));
         
         __trace_var(TRC_HVM_NPF, 0, sizeof(_d), &_d);
     }
@@ -1184,6 +1192,7 @@ static void svm_do_nested_pgfault(struct
     gdprintk(XENLOG_ERR,
          "SVM violation gpa %#"PRIpaddr", mfn %#lx, type %i\n",
          gpa, mfn_x(mfn), p2mt);
+    drop_p2m_gfn(p2m, gfn, mfn_x(mfn));
     domain_crash(v->domain);
 }
 
diff -r 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/hvm/viridian.c
--- a/xen/arch/x86/hvm/viridian.c
+++ b/xen/arch/x86/hvm/viridian.c
@@ -140,6 +140,7 @@ static void enable_hypercall_page(struct
     if ( !mfn_valid(mfn) ||
          !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
     {
+        drop_p2m_gfn_domain(d, gmfn, mfn); 
         gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn, mfn);
         return;
     }
@@ -162,6 +163,7 @@ static void enable_hypercall_page(struct
     unmap_domain_page(p);
 
     put_page_and_type(mfn_to_page(mfn));
+    drop_p2m_gfn_domain(d, gmfn, mfn); 
 }
 
 void initialize_apic_assist(struct vcpu *v)
@@ -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) )
     {
+        drop_p2m_gfn_domain(d, gmfn, mfn); 
         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));
+    drop_p2m_gfn_domain(d, gmfn, mfn); 
 }
 
 int wrmsr_viridian_regs(uint32_t idx, uint64_t val)
diff -r 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -490,6 +490,7 @@ static int vmx_restore_cr0_cr3(
             mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
             if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) )
             {
+                drop_p2m_gfn_domain(v->domain, cr3 >> PAGE_SHIFT, mfn);
                 gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%lx\n", cr3);
                 return -EINVAL;
             }
@@ -499,6 +500,10 @@ 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 )
+        {
+            drop_p2m_gfn_domain(v->domain, cr3 >> PAGE_SHIFT, mfn);
+        }
     }
 
     v->arch.hvm_vcpu.guest_cr[0] = cr0 | X86_CR0_ET;
@@ -1009,7 +1014,10 @@ static void vmx_load_pdptrs(struct vcpu 
 
     mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
     if ( !p2m_is_ram(p2mt) )
+    {
+        drop_p2m_gfn_domain(v->domain, cr3 >> PAGE_SHIFT, mfn);
         goto crash;
+    }
 
     p = map_domain_page(mfn);
 
@@ -1037,6 +1045,7 @@ static void vmx_load_pdptrs(struct vcpu 
     vmx_vmcs_exit(v);
 
     unmap_domain_page(p);
+    drop_p2m_gfn_domain(v->domain, cr3 >> PAGE_SHIFT, mfn);
     return;
 
  crash:
@@ -2088,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(gfn_to_mfn_query_unlocked(d, gfn, &_d.p2mt));
         
         __trace_var(TRC_HVM_NPF, 0, sizeof(_d), &_d);
     }
@@ -2104,7 +2113,7 @@ static void ept_handle_violation(unsigne
         return;
 
     /* Everything else is an error. */
-    mfn = gfn_to_mfn_guest(d, gfn, &p2mt);
+    mfn = gfn_to_mfn_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 471d4f2754d6 -r d13f91c2fe18 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,14 @@ 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 +1201,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 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -665,11 +665,17 @@ int map_ldt_shadow_page(unsigned int off
     gmfn = l1e_get_pfn(l1e);
     mfn = gmfn_to_mfn(d, gmfn);
     if ( unlikely(!mfn_valid(mfn)) )
+    {
+        drop_p2m_gfn_domain(d, gmfn, mfn); 
         return 0;
+    }
 
     okay = get_page_and_type(mfn_to_page(mfn), d, PGT_seg_desc_page);
     if ( unlikely(!okay) )
+    {
+        drop_p2m_gfn_domain(d, gmfn, mfn); 
         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);
 
+    drop_p2m_gfn_domain(d, gmfn, mfn); 
     return 1;
 }
 
@@ -1796,7 +1803,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;
 
@@ -1813,9 +1819,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(gfn_to_mfn(pg_dom, gfn, &p2mt));
         if ( !p2m_is_ram(p2mt) || unlikely(mfn == INVALID_MFN) )
+        {
+            drop_p2m_gfn_domain(pg_dom, gfn, mfn);
             return -EINVAL;
+        }
         ASSERT((mfn & ~(PADDR_MASK >> PAGE_SHIFT)) == 0);
         nl1e = l1e_from_pfn(mfn, l1e_get_flags(nl1e));
 
@@ -1823,6 +1834,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));
+            drop_p2m_gfn_domain(pg_dom, gfn, mfn);
             return -EINVAL;
         }
 
@@ -1833,12 +1845,14 @@ static int mod_l1_entry(l1_pgentry_t *pl
             if ( UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                               preserve_ad) )
                 return 0;
+            drop_p2m_gfn_domain(pg_dom, gfn, mfn);
             return -EBUSY;
         }
 
         switch ( rc = get_page_from_l1e(nl1e, pt_dom, pg_dom) )
         {
         default:
+            drop_p2m_gfn_domain(pg_dom, gfn, mfn);
             return rc;
         case 0:
             break;
@@ -1854,6 +1868,7 @@ static int mod_l1_entry(l1_pgentry_t *pl
             ol1e = nl1e;
             rc = -EBUSY;
         }
+        drop_p2m_gfn_domain(pg_dom, gfn, mfn);
     }
     else if ( unlikely(!UPDATE_ENTRY(l1, pl1e, ol1e, nl1e, gl1mfn, pt_vcpu,
                                      preserve_ad)) )
@@ -3030,6 +3045,7 @@ int do_mmuext_op(
                     rc = -EAGAIN;
                 else if ( rc != -EAGAIN )
                     MEM_LOG("Error while pinning mfn %lx", mfn);
+                drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
                 break;
             }
 
@@ -3038,6 +3054,7 @@ int do_mmuext_op(
             if ( (rc = xsm_memory_pin_page(d, page)) != 0 )
             {
                 put_page_and_type(page);
+                drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
                 okay = 0;
                 break;
             }
@@ -3047,6 +3064,7 @@ int do_mmuext_op(
             {
                 MEM_LOG("Mfn %lx already pinned", mfn);
                 put_page_and_type(page);
+                drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
                 okay = 0;
                 break;
             }
@@ -3065,6 +3083,7 @@ int do_mmuext_op(
                 spin_unlock(&pg_owner->page_alloc_lock);
                 if ( drop_ref )
                     put_page_and_type(page);
+                drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
             }
 
             break;
@@ -3080,6 +3099,7 @@ int do_mmuext_op(
             mfn = gmfn_to_mfn(pg_owner, op.arg1.mfn);
             if ( unlikely(!(okay = get_page_from_pagenr(mfn, pg_owner))) )
             {
+                drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
                 MEM_LOG("Mfn %lx bad domain", mfn);
                 break;
             }
@@ -3090,6 +3110,7 @@ int do_mmuext_op(
             {
                 okay = 0;
                 put_page(page);
+                drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
                 MEM_LOG("Mfn %lx not pinned", mfn);
                 break;
             }
@@ -3100,12 +3121,16 @@ int do_mmuext_op(
             /* A page is dirtied when its pin status is cleared. */
             paging_mark_dirty(pg_owner, mfn);
 
+            drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
             break;
         }
 
-        case MMUEXT_NEW_BASEPTR:
-            okay = new_guest_cr3(gmfn_to_mfn(d, op.arg1.mfn));
+        case MMUEXT_NEW_BASEPTR: {
+            unsigned long mfn = gmfn_to_mfn(d, op.arg1.mfn);
+            okay = new_guest_cr3(mfn);
+            drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
             break;
+        }
         
 #ifdef __x86_64__
         case MMUEXT_NEW_USER_BASEPTR: {
@@ -3121,6 +3146,7 @@ int do_mmuext_op(
                         mfn, PGT_root_page_table, d, 0, 0);
                 if ( unlikely(!okay) )
                 {
+                    drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
                     MEM_LOG("Error while installing new mfn %lx", mfn);
                     break;
                 }
@@ -3128,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);
+            drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
 
             if ( old_mfn != 0 )
             {
@@ -3249,6 +3276,7 @@ int do_mmuext_op(
                 mfn, PGT_writable_page, d, 0, 0);
             if ( unlikely(!okay) )
             {
+                drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
                 MEM_LOG("Error while clearing mfn %lx", mfn);
                 break;
             }
@@ -3261,6 +3289,7 @@ int do_mmuext_op(
             fixunmap_domain_page(ptr);
 
             put_page_and_type(mfn_to_page(mfn));
+            drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
             break;
         }
 
@@ -3274,6 +3303,8 @@ int do_mmuext_op(
             okay = get_page_from_pagenr(src_mfn, d);
             if ( unlikely(!okay) )
             {
+                drop_p2m_gfn_domain(pg_owner, 
+                                op.arg2.src_mfn, src_mfn);
                 MEM_LOG("Error while copying from mfn %lx", src_mfn);
                 break;
             }
@@ -3283,7 +3314,10 @@ int do_mmuext_op(
                 mfn, PGT_writable_page, d, 0, 0);
             if ( unlikely(!okay) )
             {
+                drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
                 put_page(mfn_to_page(src_mfn));
+                drop_p2m_gfn_domain(pg_owner, 
+                                op.arg2.src_mfn, src_mfn);
                 MEM_LOG("Error while copying to mfn %lx", mfn);
                 break;
             }
@@ -3297,8 +3331,11 @@ int do_mmuext_op(
             fixunmap_domain_page(dst);
             unmap_domain_page(src);
 
+            drop_p2m_gfn_domain(pg_owner, op.arg1.mfn, mfn);
             put_page_and_type(mfn_to_page(mfn));
             put_page(mfn_to_page(src_mfn));
+            drop_p2m_gfn_domain(pg_owner, 
+                            op.arg2.src_mfn, src_mfn);
             break;
         }
 
@@ -3488,12 +3525,18 @@ int do_mmu_update(
             gmfn = req.ptr >> PAGE_SHIFT;
             mfn = mfn_x(gfn_to_mfn(pt_owner, gmfn, &p2mt));
             if ( !p2m_is_valid(p2mt) )
+            {
+              /* In the odd case we ever got a valid mfn with an invalid type,
+               * we drop the ref obtained in the p2m lookup */
+              if (mfn != INVALID_MFN)
+                 put_page(mfn_to_page(mfn));
               mfn = INVALID_MFN;
+            }
 
             if ( p2m_is_paged(p2mt) )
             {
                 p2m_mem_paging_populate(pg_owner, gmfn);
-
+                drop_p2m_gfn_domain(pt_owner, gmfn, mfn);
                 rc = -ENOENT;
                 break;
             }
@@ -3501,6 +3544,7 @@ int do_mmu_update(
             if ( unlikely(!get_page_from_pagenr(mfn, pt_owner)) )
             {
                 MEM_LOG("Could not get page for normal update");
+                drop_p2m_gfn_domain(pt_owner, gmfn, mfn);
                 break;
             }
 
@@ -3511,6 +3555,7 @@ int do_mmu_update(
 
             rc = xsm_mmu_normal_update(d, req.val, page);
             if ( rc ) {
+                drop_p2m_gfn_domain(pt_owner, gmfn, mfn);
                 unmap_domain_page_with_cache(va, &mapcache);
                 put_page(page);
                 break;
@@ -3524,16 +3569,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(gfn_to_mfn(pg_owner, l1egfn, &l1e_p2mt));
 
                     if ( p2m_is_paged(l1e_p2mt) )
                     {
                         p2m_mem_paging_populate(pg_owner, l1e_get_pfn(l1e));
+                        drop_p2m_gfn_domain(pg_owner, l1egfn, l1emfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l1e_p2mt && !mfn_valid(mfn) )
                     {
+                        drop_p2m_gfn_domain(pg_owner, l1egfn, l1emfn);
                         rc = -ENOENT;
                         break;
                     }
@@ -3550,7 +3599,10 @@ int do_mmu_update(
                                                           l1e_get_pfn(l1e), 
                                                           0);
                             if ( rc )
+                            {
+                                drop_p2m_gfn_domain(pg_owner, l1egfn, l1emfn);
                                 break; 
+                            }
                         }
                     } 
 #endif
@@ -3558,27 +3610,33 @@ int do_mmu_update(
                     rc = mod_l1_entry(va, l1e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, v,
                                       pg_owner);
+                    drop_p2m_gfn_domain(pg_owner, l1egfn, l1emfn);
                 }
                 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(gfn_to_mfn(pg_owner, l2egfn, &l2e_p2mt));
 
                     if ( p2m_is_paged(l2e_p2mt) )
                     {
+                        drop_p2m_gfn_domain(pg_owner, l2egfn, l2emfn);
                         p2m_mem_paging_populate(pg_owner, l2e_get_pfn(l2e));
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l2e_p2mt && !mfn_valid(mfn) )
                     {
+                        drop_p2m_gfn_domain(pg_owner, l2egfn, l2emfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_shared == l2e_p2mt )
                     {
+                        drop_p2m_gfn_domain(pg_owner, l2egfn, l2emfn);
                         MEM_LOG("Unexpected attempt to map shared page.\n");
                         break;
                     }
@@ -3586,33 +3644,40 @@ int do_mmu_update(
 
                     rc = mod_l2_entry(va, l2e, mfn,
                                       cmd == MMU_PT_UPDATE_PRESERVE_AD, v);
+                    drop_p2m_gfn_domain(pg_owner, l2egfn, l2emfn);
                 }
                 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(gfn_to_mfn(pg_owner, l3egfn, &l3e_p2mt));
 
                     if ( p2m_is_paged(l3e_p2mt) )
                     {
                         p2m_mem_paging_populate(pg_owner, l3e_get_pfn(l3e));
+                        drop_p2m_gfn_domain(pg_owner, l3egfn, l3emfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l3e_p2mt && !mfn_valid(mfn) )
                     {
+                        drop_p2m_gfn_domain(pg_owner, l3egfn, l3emfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_shared == l3e_p2mt )
                     {
+                        drop_p2m_gfn_domain(pg_owner, l3egfn, l3emfn);
                         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);
+                    drop_p2m_gfn_domain(pg_owner, l3egfn, l3emfn);
                 }
                 break;
 #if CONFIG_PAGING_LEVELS >= 4
@@ -3620,27 +3685,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(gfn_to_mfn(pg_owner, l4egfn, &l4e_p2mt));
 
                     if ( p2m_is_paged(l4e_p2mt) )
                     {
                         p2m_mem_paging_populate(pg_owner, l4e_get_pfn(l4e));
+                        drop_p2m_gfn_domain(pg_owner, l4egfn, l4emfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_paging_in_start == l4e_p2mt && !mfn_valid(mfn) )
                     {
+                        drop_p2m_gfn_domain(pg_owner, l4egfn, l4emfn);
                         rc = -ENOENT;
                         break;
                     }
                     else if ( p2m_ram_shared == l4e_p2mt )
                     {
+                        drop_p2m_gfn_domain(pg_owner, l4egfn, l4emfn);
                         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);
+                    drop_p2m_gfn_domain(pg_owner, l4egfn, l4emfn);
                 }
                 break;
 #endif
@@ -3662,6 +3733,7 @@ int do_mmu_update(
                 put_page_type(page);
             }
 
+            drop_p2m_gfn_domain(pt_owner, gmfn, mfn);
             unmap_domain_page_with_cache(va, &mapcache);
             put_page(page);
         }
@@ -3754,6 +3826,7 @@ static int create_grant_pte_mapping(
 
     if ( unlikely(!get_page_from_pagenr(mfn, current->domain)) )
     {
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         MEM_LOG("Could not get page for normal update");
         return GNTST_general_error;
     }
@@ -3790,6 +3863,7 @@ static int create_grant_pte_mapping(
 
  failed:
     unmap_domain_page(va);
+    drop_p2m_gfn_domain(d, gmfn, mfn);
     put_page(page);
 
     return rc;
@@ -3809,6 +3883,7 @@ static int destroy_grant_pte_mapping(
 
     if ( unlikely(!get_page_from_pagenr(mfn, current->domain)) )
     {
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         MEM_LOG("Could not get page for normal update");
         return GNTST_general_error;
     }
@@ -3860,6 +3935,7 @@ static int destroy_grant_pte_mapping(
  failed:
     unmap_domain_page(va);
     put_page(page);
+    drop_p2m_gfn_domain(d, gmfn, mfn);
     return rc;
 }
 
@@ -4051,7 +4127,7 @@ 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 = gfn_to_mfn_unlocked(d, gfn, &type);
     if ( !p2m_is_grant(type) || mfn_x(old_mfn) != frame )
     {
         gdprintk(XENLOG_WARNING,
@@ -4441,14 +4517,19 @@ 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++ )
     {
+        pfns[i] = frames[i];
         mfn = frames[i] = gmfn_to_mfn(d, frames[i]);
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), d, PGT_seg_desc_page) )
@@ -4465,13 +4546,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));
+        drop_p2m_gfn_domain(d, pfns[i], frames[i]);
     }
 
+    xfree(pfns);
     return 0;
 
  fail:
     while ( i-- > 0 )
+    {
         put_page_and_type(mfn_to_page(frames[i]));
+        drop_p2m_gfn_domain(d, pfns[i], frames[i]);
+    }
+    xfree(pfns);
     return -EINVAL;
 }
 
@@ -4519,11 +4606,17 @@ long do_update_descriptor(u64 pa, u64 de
     if ( (((unsigned int)pa % sizeof(struct desc_struct)) != 0) ||
          !mfn_valid(mfn) ||
          !check_descriptor(dom, &d) )
+    {
+        drop_p2m_gfn_domain(dom, gmfn, mfn);
         return -EINVAL;
+    }
 
     page = mfn_to_page(mfn);
     if ( unlikely(!get_page(page, dom)) )
+    {
+        drop_p2m_gfn_domain(dom, gmfn, mfn);
         return -EINVAL;
+    }
 
     /* Check if the given frame is in use in an unsafe context. */
     switch ( page->u.inuse.type_info & PGT_type_mask )
@@ -4551,6 +4644,7 @@ long do_update_descriptor(u64 pa, u64 de
 
  out:
     put_page(page);
+    drop_p2m_gfn_domain(dom, gmfn, mfn);
 
     return ret;
 }
@@ -4592,6 +4686,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 )
@@ -4649,11 +4744,13 @@ long arch_memory_op(int op, XEN_GUEST_HA
         case XENMAPSPACE_gmfn:
         {
             p2m_type_t p2mt;
+            gfn = 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) )
             {
+                drop_p2m_gfn_domain(d, gfn, xatp.idx);
                 rcu_unlock_domain(d);
                 return -ENOMEM;
             }
@@ -4671,6 +4768,8 @@ long arch_memory_op(int op, XEN_GUEST_HA
         {
             if ( page )
                 put_page(page);
+            if ( xatp.space == XENMAPSPACE_gmfn )
+                drop_p2m_gfn_domain(d, gfn, mfn);
             rcu_unlock_domain(d);
             return -EINVAL;
         }
@@ -4691,6 +4790,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. */
+        drop_p2m_gfn_domain(d, xatp.gpfn, prev_mfn);
 
         /* Unmap from old location, if any. */
         gpfn = get_gpfn_from_mfn(mfn);
@@ -4701,6 +4802,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 )
+            drop_p2m_gfn_domain(d, gfn, mfn);
         domain_unlock(d);
 
         rcu_unlock_domain(d);
diff -r 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/mm/guest_walk.c
--- a/xen/arch/x86/mm/guest_walk.c
+++ b/xen/arch/x86/mm/guest_walk.c
@@ -86,6 +86,8 @@ static uint32_t set_ad_bits(void *guest_
     return 0;
 }
 
+/* We leave this function with a lock on the p2m and a ref on the 
+ * mapped page. Regardless of the map, you need to call drop_p2m_gfn. */
 static inline void *map_domain_gfn(struct p2m_domain *p2m,
                                    gfn_t gfn, 
                                    mfn_t *mfn,
@@ -120,6 +122,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, 
@@ -348,11 +353,17 @@ set_ad:
  out:
 #if GUEST_PAGING_LEVELS == 4
     if ( l3p ) unmap_domain_page(l3p);
+    drop_p2m_gfn(p2m, gfn_x(guest_l4e_get_gfn(gw->l4e)), 
+                    mfn_x(gw->l3mfn));
 #endif
 #if GUEST_PAGING_LEVELS >= 3
     if ( l2p ) unmap_domain_page(l2p);
+    drop_p2m_gfn(p2m, gfn_x(guest_l3e_get_gfn(gw->l3e)), 
+                    mfn_x(gw->l2mfn));
 #endif
     if ( l1p ) unmap_domain_page(l1p);
+    drop_p2m_gfn(p2m, gfn_x(guest_l2e_get_gfn(gw->l2e)), 
+                    mfn_x(gw->l1mfn));
 
     return rc;
 }
diff -r 471d4f2754d6 -r d13f91c2fe18 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,9 +56,11 @@ 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, 
+    top_gfn = cr3 >> PAGE_SHIFT;
+    top_mfn = gfn_to_mfn_type_p2m(p2m, top_gfn,
                                   &p2mt, &p2ma, p2m_unshare, NULL);
     if ( p2m_is_paging(p2mt) )
     {
@@ -66,16 +68,19 @@ unsigned long hap_p2m_ga_to_gfn(GUEST_PA
         p2m_mem_paging_populate(p2m->domain, cr3 >> PAGE_SHIFT);
 
         pfec[0] = PFEC_page_paged;
+        drop_p2m_gfn(p2m, top_gfn, mfn_x(top_mfn));
         return INVALID_GFN;
     }
     if ( p2m_is_shared(p2mt) )
     {
         pfec[0] = PFEC_page_shared;
+        drop_p2m_gfn(p2m, top_gfn, mfn_x(top_mfn));
         return INVALID_GFN;
     }
     if ( !p2m_is_ram(p2mt) )
     {
         pfec[0] &= ~PFEC_page_present;
+        drop_p2m_gfn(p2m, top_gfn, mfn_x(top_mfn));
         return INVALID_GFN;
     }
 
@@ -87,26 +92,32 @@ 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);
+    drop_p2m_gfn(p2m, top_gfn, mfn_x(top_mfn));
 
     /* 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);
+        mfn_t eff_l1_mfn = gfn_to_mfn_type_p2m(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;
+            drop_p2m_gfn(p2m, gfn_x(gfn), mfn_x(eff_l1_mfn));
             return INVALID_GFN;
         }
         if ( p2m_is_shared(p2mt) )
         {
             pfec[0] = PFEC_page_shared;
+            drop_p2m_gfn(p2m, gfn_x(gfn), mfn_x(eff_l1_mfn));
             return INVALID_GFN;
         }
 
+        drop_p2m_gfn(p2m, gfn_x(gfn), mfn_x(eff_l1_mfn));
+
         if ( page_order )
             *page_order = guest_walk_to_page_order(&gw);
 
diff -r 471d4f2754d6 -r d13f91c2fe18 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,41 @@ 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 = gfn_to_mfn(dom_mem_event, ring_gfn, &p2mt);
 
     if ( unlikely(!mfn_valid(mfn_x(ring_mfn))) )
+    {
+        drop_p2m_gfn_domain(dom_mem_event, 
+                        ring_gfn, mfn_x(ring_mfn));
         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 = gfn_to_mfn(dom_mem_event, shared_gfn, &p2mt);
 
     if ( unlikely(!mfn_valid(mfn_x(shared_mfn))) )
+    {
+        drop_p2m_gfn_domain(dom_mem_event, 
+                        ring_gfn, mfn_x(ring_mfn));
+        drop_p2m_gfn_domain(dom_mem_event, 
+                        shared_gfn, mfn_x(shared_mfn));
         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));
+    drop_p2m_gfn_domain(dom_mem_event, ring_gfn, 
+                    mfn_x(ring_mfn));
+    drop_p2m_gfn_domain(dom_mem_event, shared_gfn, 
+                    mfn_x(shared_mfn));
 
     /* Allocate event channel */
     rc = alloc_unbound_xen_event_channel(d->vcpu[0],
diff -r 471d4f2754d6 -r d13f91c2fe18 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 = gfn_to_mfn_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 = gfn_to_mfn_unlocked(d, gfn, &p2mt);
 
     printk("Debug for domain=%d, gfn=%lx, ", 
             d->domain_id, 
@@ -524,6 +524,7 @@ int mem_sharing_nominate_page(struct dom
     ret = 0;
 
 out:
+    drop_p2m_gfn_domain(d, gfn, mfn_x(mfn));
     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);
     
     /* Has someone already unshared it? */
     if (!p2m_is_shared(p2mt)) {
+        drop_p2m_gfn_domain(d, gfn, mfn_x(mfn));
         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);
+        drop_p2m_gfn_domain(d, gfn, mfn_x(mfn));
         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);
+        drop_p2m_gfn_domain(d, gfn, mfn_x(mfn));
         shr_unlock();
         return -ENOMEM;
     }
@@ -665,6 +672,13 @@ gfn_found:
 
     BUG_ON(set_shared_p2m_entry(d, gfn, page_to_mfn(page)) == 0);
     put_page_and_type(old_page);
+    /* After switching the p2m entry we still hold it locked, and
+     * we have a ref count to the old page (mfn). Drop the ref
+     * on the old page, and set mfn to invalid, so the refcount is
+     * no further decremented. We are the only cpu who knows about
+     * the new page, so we don't need additional refs on it. */
+    put_page(mfn_to_page(mfn));
+    mfn = _mfn(INVALID_MFN);
 
 private_page_found:    
     /* We've got a private page, we can commit the gfn destruction */
@@ -683,6 +697,7 @@ private_page_found:
     /* Update m2p entry */
     set_gpfn_from_mfn(mfn_x(page_to_mfn(page)), gfn);
 
+    drop_p2m_gfn_domain(d, gfn, mfn_x(mfn));
     shr_unlock();
     return 0;
 }
diff -r 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/mm/shadow/common.c
--- a/xen/arch/x86/mm/shadow/common.c
+++ b/xen/arch/x86/mm/shadow/common.c
@@ -3741,6 +3741,8 @@ int shadow_track_dirty_vram(struct domai
                 }
             }
 
+            drop_p2m_gfn_domain(d, begin_pfn + i, mfn_x(mfn));
+
             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 = gfn_to_mfn_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 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c
+++ b/xen/arch/x86/mm/shadow/multi.c
@@ -2275,6 +2275,7 @@ static int validate_gl4e(struct vcpu *v,
         if ( mfn_valid(sl3mfn) )
             shadow_resync_all(v);
 #endif
+        drop_p2m_gfn_domain(d, gfn_x(gl3gfn), mfn_x(gl3mfn));
     }
     l4e_propagate_from_guest(v, new_gl4e, sl3mfn, &new_sl4e, ft_prefetch);
 
@@ -2332,6 +2333,7 @@ static int validate_gl3e(struct vcpu *v,
         if ( mfn_valid(sl2mfn) )
             shadow_resync_all(v);
 #endif
+        drop_p2m_gfn_domain(v->domain, gfn_x(gl2gfn), mfn_x(gl2mfn));
     }
     l3e_propagate_from_guest(v, new_gl3e, sl2mfn, &new_sl3e, ft_prefetch);
     result |= shadow_set_l3e(v, sl3p, new_sl3e, sl3mfn);
@@ -2376,6 +2378,7 @@ static int validate_gl2e(struct vcpu *v,
                 sl1mfn = get_shadow_status(v, gl1mfn, SH_type_l1_shadow); 
             else if ( p2mt != p2m_populate_on_demand )
                 result |= SHADOW_SET_ERROR;
+            drop_p2m_gfn_domain(v->domain, gfn_x(gl1gfn), mfn_x(gl1mfn));
         }
     }
     l2e_propagate_from_guest(v, new_gl2e, sl1mfn, &new_sl2e, ft_prefetch);
@@ -2463,6 +2466,7 @@ static int validate_gl1e(struct vcpu *v,
     }
 #endif /* OOS */
 
+    drop_p2m_gfn_domain(v->domain, gfn_x(gfn), mfn_x(gmfn));
     return result;
 }
 
@@ -2505,6 +2509,7 @@ void sh_resync_l1(struct vcpu *v, mfn_t 
             l1e_propagate_from_guest(v, gl1e, gmfn, &nsl1e, ft_prefetch, p2mt);
             rc |= shadow_set_l1e(v, sl1p, nsl1e, p2mt, sl1mfn);
 
+            drop_p2m_gfn_domain(v->domain, gfn_x(gfn), mfn_x(gmfn));
             *snpl1p = gl1e;
         }
     });
@@ -2834,6 +2839,8 @@ static void sh_prefetch(struct vcpu *v, 
         if ( snpl1p != NULL )
             snpl1p[i] = gl1e;
 #endif /* OOS */
+
+        drop_p2m_gfn_domain(v->domain, gfn_x(gfn), mfn_x(gmfn));
     }
     if ( gl1p != NULL )
         sh_unmap_domain_page(gl1p);
@@ -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);
+        drop_p2m_gfn_domain(d, gfn_x(gfn), mfn_x(gmfn));
         goto propagate;
     }
 
@@ -3236,6 +3244,7 @@ static int sh_page_fault(struct vcpu *v,
     if ( rc & GW_RMWR_REWALK )
     {
         paging_unlock(d);
+        drop_p2m_gfn_domain(d, gfn_x(gfn), mfn_x(gmfn));
         goto rewalk;
     }
 #endif /* OOS */
@@ -3244,6 +3253,7 @@ static int sh_page_fault(struct vcpu *v,
     {
         perfc_incr(shadow_inconsistent_gwalk);
         paging_unlock(d);
+        drop_p2m_gfn_domain(d, gfn_x(gfn), mfn_x(gmfn));
         goto rewalk;
     }
 
@@ -3270,6 +3280,7 @@ static int sh_page_fault(struct vcpu *v,
         ASSERT(d->is_shutting_down);
 #endif
         paging_unlock(d);
+        drop_p2m_gfn_domain(d, gfn_x(gfn), mfn_x(gmfn));
         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);
+        drop_p2m_gfn_domain(d, gfn_x(gfn), mfn_x(gmfn));
         return 0;
     }
 
@@ -3296,6 +3308,7 @@ static int sh_page_fault(struct vcpu *v,
     {
         perfc_incr(shadow_inconsistent_gwalk);
         paging_unlock(d);
+        drop_p2m_gfn_domain(d, gfn_x(gfn), mfn_x(gmfn));
         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);
+    drop_p2m_gfn_domain(d, gfn_x(gfn), mfn_x(gmfn));
     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);
+    drop_p2m_gfn_domain(d, gfn_x(gfn), mfn_x(gmfn));
 
     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);
+    drop_p2m_gfn_domain(d, gfn_x(gfn), mfn_x(gmfn));
     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);
+    drop_p2m_gfn_domain(d, gfn_x(gfn), mfn_x(gmfn));
 
 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 = gfn_to_mfn_query_unlocked(d, gfn_x(gl2gfn), &p2mt);
                 if ( p2m_is_ram(p2mt) )
                     flush |= sh_remove_write_access(v, gl2mfn, 2, 0);
             }
@@ -4312,6 +4329,8 @@ sh_update_cr3(struct vcpu *v, int do_loc
                                            : SH_type_l2_shadow);
                 else
                     sh_set_toplevel_shadow(v, i, _mfn(INVALID_MFN), 0); 
+                drop_p2m_gfn_domain(d, gfn_x(gl2gfn),
+                                mfn_x(gl2mfn));
             }
             else
                 sh_set_toplevel_shadow(v, i, _mfn(INVALID_MFN), 0); 
@@ -4689,11 +4708,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 +4722,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 = gfn_to_mfn_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 +4732,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 = gfn_to_mfn_query(v->domain, _gfn(gfn), &p2mt);
             smfn = shadow_hash_lookup(v, mfn_x(gmfn), SH_type_l2_pae_shadow);
+            drop_p2m_gfn_domain(v->domain, gfn, mfn_x(gmfn));
         }
 
         if ( mfn_valid(smfn) )
@@ -4747,6 +4773,7 @@ static void sh_pagetable_dying(struct vc
 out:
     if ( !fast_path )
         unmap_domain_page(gl3pa);
+    drop_p2m_gfn_domain(v->domain, l3gfn, mfn_x(l3mfn));
     paging_unlock(v->domain);
 }
 #else
@@ -4763,6 +4790,9 @@ static void sh_pagetable_dying(struct vc
 #else
     smfn = shadow_hash_lookup(v, mfn_x(gmfn), SH_type_l4_64_shadow);
 #endif
+    drop_p2m_gfn_domain(v->domain, 
+                    gpa >> PAGE_SHIFT, mfn_x(gmfn));
+    
     if ( mfn_valid(smfn) )
     {
         mfn_to_page(gmfn)->shadow_flags |= SHF_pagetable_dying;
@@ -4814,12 +4844,19 @@ static mfn_t emulate_gva_to_mfn(struct v
     mfn = gfn_to_mfn_guest(v->domain, _gfn(gfn), &p2mt);
         
     if ( p2m_is_readonly(p2mt) )
+    {
+        drop_p2m_gfn_domain(v->domain, gfn, mfn_x(mfn));
         return _mfn(READONLY_GFN);
+    }
     if ( !p2m_is_ram(p2mt) )
+    {
+        drop_p2m_gfn_domain(v->domain, gfn, mfn_x(mfn));
         return _mfn(BAD_GFN_TO_MFN);
+    }
 
     ASSERT(mfn_valid(mfn));
     v->arch.paging.last_write_was_pt = !!sh_mfn_is_a_page_table(mfn);
+    drop_p2m_gfn_domain(v->domain, gfn, mfn_x(mfn));
     return mfn;
 }
 
@@ -5220,7 +5257,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 = gfn_to_mfn_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 +5328,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, 
+                    gfn_to_mfn_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(gfn_to_mfn_query_unlocked(v->domain,
+                                   gfn_x(gfn), &p2mt)), mfn_x(gmfn), mfn_x(mfn));
         }
     });
     sh_unmap_domain_page(gp);
@@ -5339,7 +5377,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, gfn_to_mfn_query_unlocked(
+                                        v->domain, gfn_x(gfn), &p2mt),
                                      ((GUEST_PAGING_LEVELS == 3 ||
                                        is_pv_32on64_vcpu(v))
                                       && !shadow_mode_external(v->domain)
@@ -5387,8 +5426,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, gfn_to_mfn_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 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c
+++ b/xen/arch/x86/physdev.c
@@ -288,12 +288,18 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), v->domain,
                                 PGT_writable_page) )
+        {
+            drop_p2m_gfn_domain(current->domain, 
+                            info.gmfn, mfn);
             break;
+        }
 
         if ( cmpxchg(&v->domain->arch.pv_domain.pirq_eoi_map_mfn,
                      0, mfn) != 0 )
         {
             put_page_and_type(mfn_to_page(mfn));
+            drop_p2m_gfn_domain(current->domain, 
+                            info.gmfn, mfn);
             ret = -EBUSY;
             break;
         }
@@ -303,10 +309,13 @@ 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));
+            drop_p2m_gfn_domain(current->domain, 
+                            info.gmfn, mfn);
             ret = -ENOSPC;
             break;
         }
 
+        drop_p2m_gfn_domain(current->domain, info.gmfn, mfn);
         ret = 0;
         break;
     }
diff -r 471d4f2754d6 -r d13f91c2fe18 xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -678,6 +678,7 @@ int wrmsr_hypervisor_regs(uint32_t idx, 
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
         {
+            drop_p2m_gfn_domain(d, gmfn, mfn);
             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));
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         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 = gmfn_to_mfn(v->domain, gfn);
+            rc = new_guest_cr3(mfn);
+            drop_p2m_gfn_domain(v->domain, gfn, mfn);
             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 471d4f2754d6 -r d13f91c2fe18 xen/common/grant_table.c
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -164,9 +164,11 @@ static int __get_paged_frame(unsigned lo
         if ( p2m_is_paging(p2mt) )
         {
             p2m_mem_paging_populate(rd, gfn);
+            drop_p2m_gfn_domain(rd, gfn, mfn_x(mfn));
             rc = GNTST_eagain;
         }
     } else {
+       drop_p2m_gfn_domain(rd, gfn, mfn_x(mfn));
        *frame = INVALID_MFN;
        rc = GNTST_bad_page;
     }
@@ -474,7 +476,7 @@ __gnttab_map_grant_ref(
     u32            old_pin;
     u32            act_pin;
     unsigned int   cache_flags;
-    struct active_grant_entry *act;
+    struct active_grant_entry *act = NULL; /* gcc ... */
     struct grant_mapping *mt;
     grant_entry_v1_t *sha1;
     grant_entry_v2_t *sha2;
@@ -698,6 +700,7 @@ __gnttab_map_grant_ref(
     op->handle       = handle;
     op->status       = GNTST_okay;
 
+    drop_p2m_gfn_domain(rd, act->gfn, act->frame);
     rcu_unlock_domain(rd);
     return;
 
@@ -735,6 +738,7 @@ __gnttab_map_grant_ref(
         gnttab_clear_flag(_GTF_reading, status);
 
  unlock_out:
+    drop_p2m_gfn_domain(rd, act->gfn, act->frame);
     spin_unlock(&rd->grant_table->lock);
     op->status = rc;
     put_maptrack_handle(ld->grant_table, handle);
@@ -1454,7 +1458,7 @@ gnttab_transfer(
     struct page_info *page;
     int i;
     struct gnttab_transfer gop;
-    unsigned long mfn;
+    unsigned long mfn, drop_mfn;
     unsigned int max_bitsize;
 
     for ( i = 0; i < count; i++ )
@@ -1475,6 +1479,7 @@ gnttab_transfer(
         /* Check the passed page frame for basic validity. */
         if ( unlikely(!mfn_valid(mfn)) )
         { 
+            drop_p2m_gfn_domain(d, gop.mfn, mfn);
             gdprintk(XENLOG_INFO, "gnttab_transfer: out-of-range %lx\n",
                     (unsigned long)gop.mfn);
             gop.status = GNTST_bad_page;
@@ -1484,6 +1489,7 @@ gnttab_transfer(
         page = mfn_to_page(mfn);
         if ( unlikely(is_xen_heap_page(page)) )
         { 
+            drop_p2m_gfn_domain(d, gop.mfn, mfn);
             gdprintk(XENLOG_INFO, "gnttab_transfer: xen frame %lx\n",
                     (unsigned long)gop.mfn);
             gop.status = GNTST_bad_page;
@@ -1492,6 +1498,7 @@ gnttab_transfer(
 
         if ( steal_page(d, page, 0) < 0 )
         {
+            drop_p2m_gfn_domain(d, gop.mfn, mfn);
             gop.status = GNTST_bad_page;
             goto copyback;
         }
@@ -1504,6 +1511,7 @@ gnttab_transfer(
         /* Find the target domain. */
         if ( unlikely((e = rcu_lock_domain_by_id(gop.domid)) == NULL) )
         {
+            drop_p2m_gfn_domain(d, gop.mfn, mfn);
             gdprintk(XENLOG_INFO, "gnttab_transfer: can't find domain %d\n",
                     gop.domid);
             page->count_info &= ~(PGC_count_mask|PGC_allocated);
@@ -1514,6 +1522,7 @@ gnttab_transfer(
 
         if ( xsm_grant_transfer(d, e) )
         {
+            drop_p2m_gfn_domain(d, gop.mfn, mfn);
             gop.status = GNTST_permission_denied;
         unlock_and_copyback:
             rcu_unlock_domain(e);
@@ -1542,9 +1551,15 @@ gnttab_transfer(
             unmap_domain_page(dp);
             unmap_domain_page(sp);
 
+            /* We took a ref on acquiring the p2m entry. Drop the ref */
+            put_page(page);
+            drop_mfn = INVALID_MFN; /* Further drops of the p2m entry won't drop anyone's refcount */
             page->count_info &= ~(PGC_count_mask|PGC_allocated);
             free_domheap_page(page);
             page = new_page;
+            /* BY the way, this doesn't update mfn, which is used later below ... */
+        } else {
+            drop_mfn = mfn;
         }
 
         spin_lock(&e->page_alloc_lock);
@@ -1566,6 +1581,7 @@ gnttab_transfer(
                         e->tot_pages, e->max_pages, gop.ref, e->is_dying);
             spin_unlock(&e->page_alloc_lock);
             rcu_unlock_domain(e);
+            drop_p2m_gfn_domain(d, gop.mfn, drop_mfn);
             page->count_info &= ~(PGC_count_mask|PGC_allocated);
             free_domheap_page(page);
             gop.status = GNTST_general_error;
@@ -1579,6 +1595,7 @@ gnttab_transfer(
         page_set_owner(page, e);
 
         spin_unlock(&e->page_alloc_lock);
+        drop_p2m_gfn_domain(d, gop.mfn, drop_mfn);
 
         TRACE_1D(TRC_MEM_PAGE_GRANT_TRANSFER, e->domain_id);
 
@@ -1852,6 +1869,8 @@ __acquire_grant_for_copy(
             rc = __get_paged_frame(gfn, &grant_frame, readonly, rd);
             if ( rc != GNTST_okay )
                 goto unlock_out;
+            /* We drop this immediately per the comments at the top */
+            drop_p2m_gfn_domain(rd, gfn, grant_frame);
             act->gfn = gfn;
             is_sub_page = 0;
             trans_page_off = 0;
@@ -1864,6 +1883,7 @@ __acquire_grant_for_copy(
             rc = __get_paged_frame(gfn, &grant_frame, readonly, rd);
             if ( rc != GNTST_okay )
                 goto unlock_out;
+            drop_p2m_gfn_domain(rd, gfn, grant_frame);
             act->gfn = gfn;
             is_sub_page = 0;
             trans_page_off = 0;
@@ -1876,6 +1896,7 @@ __acquire_grant_for_copy(
             rc = __get_paged_frame(gfn, &grant_frame, readonly, rd);
             if ( rc != GNTST_okay )
                 goto unlock_out;
+            drop_p2m_gfn_domain(rd, gfn, grant_frame);
             act->gfn = gfn;
             is_sub_page = 1;
             trans_page_off = sha2->sub_page.page_off;
@@ -1973,6 +1994,7 @@ __gnttab_copy(
     {
 #ifdef CONFIG_X86
         rc = __get_paged_frame(op->source.u.gmfn, &s_frame, 1, sd);
+        drop_p2m_gfn_domain(sd, op->source.u.gmfn, s_frame);
         if ( rc != GNTST_okay )
             goto error_out;
 #else
@@ -2012,6 +2034,7 @@ __gnttab_copy(
     {
 #ifdef CONFIG_X86
         rc = __get_paged_frame(op->dest.u.gmfn, &d_frame, 0, dd);
+        drop_p2m_gfn_domain(dd, op->dest.u.gmfn, d_frame);
         if ( rc != GNTST_okay )
             goto error_out;
 #else
diff -r 471d4f2754d6 -r d13f91c2fe18 xen/common/memory.c
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -167,6 +167,7 @@ int guest_remove_page(struct domain *d, 
     {
         guest_physmap_remove_page(d, gmfn, mfn, 0);
         p2m_mem_paging_drop_page(d, gmfn);
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         return 1;
     }
 #else
@@ -174,6 +175,7 @@ int guest_remove_page(struct domain *d, 
 #endif
     if ( unlikely(!mfn_valid(mfn)) )
     {
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         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);
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         return 1;
     }
 
 #endif /* CONFIG_X86 */
     if ( unlikely(!get_page(page, d)) )
     {
+        drop_p2m_gfn_domain(d, gmfn, mfn);
         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);
+    drop_p2m_gfn_domain(d, gmfn, mfn);
 
     put_page(page);
 
@@ -366,6 +371,7 @@ static long memory_exchange(XEN_GUEST_HA
                 mfn = mfn_x(gfn_to_mfn_unshare(d, gmfn + k, &p2mt));
                 if ( p2m_is_shared(p2mt) )
                 {
+                    drop_p2m_gfn_domain(d, gmfn + k, mfn);
                     rc = -ENOMEM;
                     goto fail; 
                 }
@@ -374,6 +380,7 @@ static long memory_exchange(XEN_GUEST_HA
 #endif
                 if ( unlikely(!mfn_valid(mfn)) )
                 {
+                    drop_p2m_gfn_domain(d, gmfn + k, mfn);
                     rc = -EINVAL;
                     goto fail;
                 }
@@ -382,11 +389,13 @@ static long memory_exchange(XEN_GUEST_HA
 
                 if ( unlikely(steal_page(d, page, MEMF_no_refcount)) )
                 {
+                    drop_p2m_gfn_domain(d, gmfn + k, mfn);
                     rc = -EINVAL;
                     goto fail;
                 }
 
                 page_list_add(page, &in_chunk_list);
+                drop_p2m_gfn_domain(d, gmfn + k, mfn);
             }
         }
 
diff -r 471d4f2754d6 -r d13f91c2fe18 xen/common/tmem_xen.c
--- a/xen/common/tmem_xen.c
+++ b/xen/common/tmem_xen.c
@@ -111,20 +111,28 @@ static inline void *cli_get_page(tmem_cl
 
     cli_mfn = mfn_x(gfn_to_mfn(current->domain, cmfn, &t));
     if ( t != p2m_ram_rw || !mfn_valid(cli_mfn) )
+    {
+            drop_p2m_gfn_domain(current->domain, 
+                            (unsigned long) cmfn, cli_mfn);
             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 )
+    {
+        drop_p2m_gfn_domain(current->domain, 
+                        (unsigned long) cmfn, cli_mfn);
         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 +143,7 @@ static inline void cli_put_page(void *cl
     else
         put_page((struct page_info *)cli_pfp);
     unmap_domain_page(cli_va);
+    drop_p2m_gfn_domain(current->domain, (unsigned long) cmfn, cli_mfn);
 }
 #endif
 
@@ -169,7 +178,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 +206,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 +234,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 +258,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 +280,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 471d4f2754d6 -r d13f91c2fe18 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 471d4f2754d6 -r d13f91c2fe18 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 {

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:38:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:38:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPET-0006OS-GD; Thu, 27 Oct 2011 05:38:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJN1y-0000pS-Qk
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 03:17:52 -0700
X-Env-Sender: avi@redhat.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319710667!1230920!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26408 invoked from network); 27 Oct 2011 10:17:47 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-4.tower-216.messagelabs.com with SMTP;
	27 Oct 2011 10:17:47 -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 p9RAHPxJ025325
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 06:17:25 -0400
Received: from mermaid.qumranet.com (vpn-8-29.rdu.redhat.com [10.11.8.29])
	by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP
	id p9RAHGk8001764; Thu, 27 Oct 2011 06:17:17 -0400
Message-ID: <4EA92FAB.1050607@redhat.com>
Date: Thu, 27 Oct 2011 12:17:15 +0200
From: Avi Kivity <avi@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: Raghavendra K T <raghukt@linux.vnet.ibm.com>
References: <20111023190307.16364.35381.sendpatchset@oc5400248562.ibm.com>
	<20111023190558.16364.2136.sendpatchset@oc5400248562.ibm.com>
	<4EA53A7D.300@redhat.com>
	<20111024122734.GA10634@linux.vnet.ibm.com>
	<4EA56385.9040302@redhat.com>
	<20111024135032.GB10634@linux.vnet.ibm.com>
	<4EA6FEC2.1060209@linux.vnet.ibm.com> <4EA7E21B.8020805@redhat.com>
	<4EA85A9D.5060203@linux.vnet.ibm.com>
In-Reply-To: <4EA85A9D.5060203@linux.vnet.ibm.com>
X-Enigmail-Version: 1.3.2
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23
X-Mailman-Approved-At: Thu, 27 Oct 2011 04:40:16 -0700
Cc: Raghavendra K T <raghavendra.kt@linux.vnet.ibm.com>,
	KVM <kvm@vger.kernel.org>, Peter Zijlstra <peterz@infradead.org>,
	Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>,
	Dave Jiang <dave.jiang@intel.com>,
	Gleb Natapov <gleb@redhat.com>, x86@kernel.org,
	Ingo Molnar <mingo@redhat.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>,
	Marcelo Tosatti <mtosatti@redhat.com>, Xen <xen-devel@lists.xensource.com>,
	Sedat Dilek <sedat.dilek@gmail.com>, Thomas Gleixner <tglx@linutronix.de>,
	Virtualization <virtualization@lists.linux-foundation.org>,
	Yinghai Lu <yinghai@kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Greg Kroah-Hartman <gregkh@suse.de>, LKML <linux-kernel@vger.kernel.org>,
	Suzuki Poulose <suzuki@linux.vnet.ibm.com>, Ryan Harper <ryanh@us.ibm.com>
Subject: [Xen-devel] Re: [PATCH RFC V2 3/5] kvm hypervisor : Add two
 hypercalls to support pv-ticketlock
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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/26/2011 09:08 PM, Raghavendra K T wrote:
> On 10/26/2011 04:04 PM, Avi Kivity wrote:
>> On 10/25/2011 08:24 PM, Raghavendra K T wrote:
> CCing Ryan also
>>>
>>> So then do also you foresee the need for directed yield at some point,
>>> to address LHP? provided we have good improvements to prove.
>>
>> Doesn't this patchset completely eliminate lock holder preemption?
>>
> Basically I was curious whether we can do more better with your
> directed yield discussions in https://lkml.org/lkml/2010/8/2/106 .
>
> I felt we can get little more improvement with doing directed yield to
> lock-holder in case of LHP than sleeping. But I may be wrong.
>
> So wanted to get the feedback, on whether I am thinking in right
> direction.

i guess donating some time to the lock holder could help, but not by
much. The problem with non-pv spinlocks is that you can't just sleep,
since no one will wake you up, so you have to actively boost the lock
holder.

-- 
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:43:03 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:43:03 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPIU-0007lD-RD; Thu, 27 Oct 2011 05:43:02 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJOLc-0002LA-UY
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 04:42:13 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319715697!54509104!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15103 invoked from network); 27 Oct 2011 11:41:37 -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;
	27 Oct 2011 11:41:37 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8617602"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 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, 27 Oct 2011 12:42:09 +0100
Date: Thu, 27 Oct 2011 12:42:27 +0100
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: do not loose level interrupt
	notifications
In-Reply-To: <CACEFCA5.23BD8%keir.xen@gmail.com>
Message-ID: <alpine.DEB.2.00.1110271227160.3519@kaball-desktop>
References: <CACEFCA5.23BD8%keir.xen@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>,
	Stefan Bader <stefan.bader@canonical.com>,
	Jan Beulich <JBeulich@novell.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, 27 Oct 2011, Keir Fraser wrote:
> On 27/10/2011 11:37, "Stefano Stabellini" <Stefano.Stabellini@eu.citrix.com>
> wrote:
> 
> > PV on HVM guests can loose level interrupts coming from emulated
> > devices: we are missing code to retry to inject a pirq in the guest if
> > it corresponds to a level interrupt and the interrupt has been raised
> > while the guest is servicing the first one.
> > 
> > The same thing could also happen with PV guests, including dom0, even
> > though it is much more unlikely. In case of PV guests the scenario would
> > be the following:
> > 
> > 1) a device raises a level interrupt and xen injects it into the
> > guest;
> > 
> > 2) the guest is temporarely stuck: it does not ack it or eoi it;
> > 
> > 3) the xen timer kicks in and eois the interrupt;
> > 
> > 4) the device thinks it is all fine and sends a second interrupt;
> > 
> > 5) Xen fails to inject the second interrupt into the guest because the
> > guest has still the event channel pending bit set;
> > 
> > at this point the guest looses the second interrupt notification, that
> > is not supposed to happen with level interrupts and it might cause
> > problems with some devices.
> 
> You can't really lose a level-triggered interrupt. In step (4) the device
> isn't really actively involved in sending another interrupt -- it never
> deasserted its INTx line, and nor will it until the guest's ISR quenches the
> interrupt at the device. If the guest misses such an interrupt, and doesn't
> execute the relevant ISR when it should, then another interrupt will simply
> be raised by the interrupt controller when the guest does finally EOI the
> interrupt. Because the device is *still* asserting the line.
> 
> Well, that's the PV case anyway. I don't see any problem with our handling
> of the PV case.

OK, you convinced me.


> Is PV-HVM so different?

Yes, it is. In the PV on HVM case we need to reassert an emulated
interrupt if the guest EOIs it without quenching the interrupt in the
ISR.
We are doing it already in the emulated code path but we are not doing
it for interrupts that have been remapped into pirqs.

That said, if we don't care about the PV case we can simplify the patch,
I am appending a new one that only takes care of the PV on HVM case.

---


xen: 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>

diff -r c681dd5aecf3 xen/arch/x86/physdev.c
--- a/xen/arch/x86/physdev.c	Tue Oct 25 19:22:09 2011 +0100
+++ b/xen/arch/x86/physdev.c	Thu Oct 27 11:30:55 2011 +0000
@@ -11,6 +11,7 @@
 #include <asm/current.h>
 #include <asm/io_apic.h>
 #include <asm/msi.h>
+#include <asm/hvm/irq.h>
 #include <asm/hypercall.h>
 #include <public/xen.h>
 #include <public/physdev.h>
@@ -270,6 +271,18 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
         if ( !is_hvm_domain(v->domain) ||
              domain_pirq_to_irq(v->domain, eoi.irq) > 0 )
             pirq_guest_eoi(pirq);
+        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, pirq);
+        }
         spin_unlock(&v->domain->event_lock);
         ret = 0;
         break;
@@ -328,9 +341,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 Thu Oct 27 05:49:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:49:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPOi-0001UP-JT; Thu, 27 Oct 2011 05:49:28 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJOni-0000a2-4r
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 05:11:15 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319717469!25511722!1
X-Originating-IP: [65.55.88.12]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13814 invoked from network); 27 Oct 2011 12:11:10 -0000
Received: from tx2ehsobe002.messaging.microsoft.com (HELO
	TX2EHSOBE004.bigfish.com) (65.55.88.12)
	by server-3.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	27 Oct 2011 12:11:10 -0000
Received: from mail30-tx2-R.bigfish.com (10.9.14.249) by
	TX2EHSOBE004.bigfish.com (10.9.40.24) with Microsoft SMTP Server id
	14.1.225.22; Thu, 27 Oct 2011 12:11:01 +0000
Received: from mail30-tx2 (localhost.localdomain [127.0.0.1])	by
	mail30-tx2-R.bigfish.com (Postfix) with ESMTP id C7CFC13281AA	for
	<xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 12:11:05 +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
Received: from mail30-tx2 (localhost.localdomain [127.0.0.1]) by mail30-tx2
	(MessageSwitch) id 1319717465654133_4901;
	Thu, 27 Oct 2011 12:11:05 +0000 (UTC)
Received: from TX2EHSMHS040.bigfish.com (unknown [10.9.14.245])	by
	mail30-tx2.bigfish.com (Postfix) with ESMTP id 9959330804F	for
	<xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 12:11:05 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS040.bigfish.com (10.9.99.140) with Microsoft SMTP Server id
	14.1.225.22; Thu, 27 Oct 2011 12:10:45 +0000
X-WSS-ID: 0LTQ4I1-02-4ZO-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 22283C825E	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 07:10:49 -0500 (CDT)
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;
	Thu, 27 Oct 2011 07:11:05 -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, 27 Oct 2011 07:10:47 -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; Thu, 27 Oct 2011
	08:10:32 -0400
Message-ID: <4EA94A37.7000700@amd.com>
Date: Thu, 27 Oct 2011 14:10:31 +0200
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>
Content-Type: multipart/mixed; boundary="------------080100090001080704010003"
X-OriginatorOrg: amd.com
Subject: [Xen-devel] [PATCH] xen: provide pse36 cpuid 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

--------------080100090001080704010003
Content-Type: text/plain; charset="ISO-8859-15"; format=flowed
Content-Transfer-Encoding: 7bit


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>

-- 
---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

--------------080100090001080704010003
Content-Type: text/plain; name="xen_pse36.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="xen_pse36.diff"
Content-Description: xen_pse36.diff

diff -r 0d092359d86f tools/libxc/xc_cpuid_x86.c
--- a/tools/libxc/xc_cpuid_x86.c	Wed Oct 26 10:32:36 2011 +0200
+++ b/tools/libxc/xc_cpuid_x86.c	Thu Oct 27 14:02:29 2011 +0200
@@ -98,7 +98,6 @@ static void amd_xc_cpuid_policy(
 
         if ( !is_pae )
             clear_bit(X86_FEATURE_PAE, regs[3]);
-        clear_bit(X86_FEATURE_PSE36, regs[3]);
 
         /* Filter all other features according to a whitelist. */
         regs[2] &= ((is_64bit ? bitmaskof(X86_FEATURE_LAHF_LM) : 0) |
@@ -339,6 +338,7 @@ static void xc_cpuid_hvm_policy(
                     bitmaskof(X86_FEATURE_CMOV) |
                     bitmaskof(X86_FEATURE_PAT) |
                     bitmaskof(X86_FEATURE_CLFLSH) |
+                    bitmaskof(X86_FEATURE_PSE36) |
                     bitmaskof(X86_FEATURE_MMX) |
                     bitmaskof(X86_FEATURE_FXSR) |
                     bitmaskof(X86_FEATURE_XMM) |
@@ -348,8 +348,10 @@ static void xc_cpuid_hvm_policy(
         /* We always support MTRR MSRs. */
         regs[3] |= bitmaskof(X86_FEATURE_MTRR);
 
-        if ( !is_pae )
+        if ( !is_pae ) {
             clear_bit(X86_FEATURE_PAE, regs[3]);
+            clear_bit(X86_FEATURE_PSE36, regs[3]);
+        }
         break;
 
     case 0x00000007: /* Intel-defined CPU features */
@@ -371,8 +373,10 @@ static void xc_cpuid_hvm_policy(
         break;
 
     case 0x80000001:
-        if ( !is_pae )
+        if ( !is_pae ) {
             clear_bit(X86_FEATURE_NX, regs[3]);
+            clear_bit(X86_FEATURE_PSE36, regs[3]);
+        }
         break;
 
     case 0x80000007:
diff -r 0d092359d86f xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c	Wed Oct 26 10:32:36 2011 +0200
+++ b/xen/arch/x86/hvm/hvm.c	Thu Oct 27 14:02:29 2011 +0200
@@ -2413,6 +2414,10 @@ void hvm_cpuid(unsigned int input, unsig
         if ( xsave_enabled(v) )
             *ecx |= (v->arch.hvm_vcpu.guest_cr[4] & X86_CR4_OSXSAVE) ?
                      cpufeat_mask(X86_FEATURE_OSXSAVE) : 0;
+
+        /* Only provide PSE36 when guest runs in 32bit PAE or in long mode */
+        if ( !(hvm_pae_enabled(v) || hvm_long_mode_enabled(v)) )
+            *edx &= ~cpufeat_mask(X86_FEATURE_PSE36);
         break;
     case 0x7:
         if ( (count == 0) && !cpu_has_smep )
@@ -2451,6 +2456,9 @@ void hvm_cpuid(unsigned int input, unsig
         /* Hide 1GB-superpage feature if we can't emulate it. */
         if (!hvm_pse1gb_supported(d))
             *edx &= ~cpufeat_mask(X86_FEATURE_PAGE1GB);
+        /* Only provide PSE36 when guest runs in 32bit PAE or in long mode */
+        if ( !(hvm_pae_enabled(v) || hvm_long_mode_enabled(v)) )
+            *edx &= ~cpufeat_mask(X86_FEATURE_PSE36);
         break;
     }
 }

--------------080100090001080704010003
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

--------------080100090001080704010003--


From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:50:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:50:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPQ4-0001sB-3k; Thu, 27 Oct 2011 05:50:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJOtk-0001Rw-57
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 05:17:28 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1319717820!46184185!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21465 invoked from network); 27 Oct 2011 12:17:01 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-4.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 12:17:01 -0000
Received: by gyg13 with SMTP id 13so4166268gyg.30
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 05:17: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=YKnoiAxqhwYVoda9/GpQhYPZ9lKqqoCpFuyWBhsxXSY=;
	b=FsffO6zykGEX3SuZ8cEWWxY5SfEINSdMpyOx0Unl+JxOqWmy9nOPnyqnABJcNKbG90
	KilIGqlNHu2wGMk5niGW0nZWyfDoUrZ9PIZRF/qNpXOZXL+19dhuVT6Zlad+cHfbnVKJ
	qYVcCkUsSlT9kxLkRxTsUMXReXcaqt/j7vMBM=
Received: by 10.151.123.5 with SMTP id a5mr31750314ybn.16.1319717843710;
	Thu, 27 Oct 2011 05:17:23 -0700 (PDT)
Received: from [10.80.114.172] (firewall.ctxuk.citrix.com. [62.200.22.2])
	by mx.google.com with ESMTPS id p5sm14341983anl.18.2011.10.27.05.17.22
	(version=SSLv3 cipher=OTHER); Thu, 27 Oct 2011 05:17:23 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 27 Oct 2011 13:17:16 +0100
Subject: Re: [Xen-devel] [PATCH] xen: do not loose level interrupt
	notifications
From: Keir Fraser <keir.xen@gmail.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Message-ID: <CACF0A5C.23C96%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] xen: do not loose level interrupt
	notifications
Thread-Index: AcyUol1tXhZCvsh+8EalbOzLY9Twhg==
In-Reply-To: <alpine.DEB.2.00.1110271227160.3519@kaball-desktop>
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>,
	Stefan Bader <stefan.bader@canonical.com>,
	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

On 27/10/2011 12:42, "Stefano Stabellini" <stefano.stabellini@eu.citrix.com>
wrote:

>> Is PV-HVM so different?
> 
> Yes, it is. In the PV on HVM case we need to reassert an emulated
> interrupt if the guest EOIs it without quenching the interrupt in the
> ISR.
> We are doing it already in the emulated code path but we are not doing
> it for interrupts that have been remapped into pirqs.
> 
> That said, if we don't care about the PV case we can simplify the patch,
> I am appending a new one that only takes care of the PV on HVM case.

Ah yes, when we are *emulating* an INTx line, either for an emulated device
or because we are doing MSI-INTx emulation, we do have to remember to
reassert. That makes sense.

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:52:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:52:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPRJ-0002Gd-Vd; Thu, 27 Oct 2011 05:52:10 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJP05-0001lg-Ja
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 05:24:02 -0700
X-Env-Sender: pbonzini@redhat.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1319718207!43628337!1
X-Originating-IP: [209.132.183.28]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2197 invoked from network); 27 Oct 2011 12:23:27 -0000
Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28)
	by server-3.tower-27.messagelabs.com with SMTP;
	27 Oct 2011 12:23:27 -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 p9RCNu0q025598
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 08:23:56 -0400
Received: from yakj.usersys.redhat.com (ovpn-112-21.ams2.redhat.com
	[10.36.112.21])
	by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP
	id p9RCNmg6004369; Thu, 27 Oct 2011 08:23:49 -0400
Message-ID: <4EA94D53.3000707@redhat.com>
Date: Thu, 27 Oct 2011 14:23:47 +0200
From: Paolo Bonzini <pbonzini@redhat.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1
MIME-Version: 1.0
To: "kvm@vger.kernel.org" <kvm@vger.kernel.org>,
	qemu-devel <qemu-devel@nongnu.org>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Libvirt <libvir-list@redhat.com>, spice-devel <spice-devel@freedesktop.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.11
Cc: 
Subject: [Xen-devel] QEMU 1.0 test day - November 7th
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

QEMU 1.0 test day will be held on November 7th.  Any kind of testing 
that you can contribute will be appreciated---including testing your 
favorite hypervisor, desktop virtualization or management stack together 
with the new release.

You are also welcome to add testing hints at 
http://wiki.qemu.org/Planning/1.0/Testing for people to try out.

People participating in the test day should also:

- hang out if possible on the QEMU IRC channel (irc.oftc.org, #qemu)

- record the results of their testing at 
http://wiki.qemu.org/Planning/1.0/Testing

Regards,

Paolo

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 05:57:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 05:57:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPWN-0003d6-BQ; Thu, 27 Oct 2011 05:57:23 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJPVl-0003O5-U9
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 05:56:46 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319720202!1273650!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32557 invoked from network); 27 Oct 2011 12:56:43 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-3.tower-216.messagelabs.com with SMTP;
	27 Oct 2011 12:56:43 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id 4607BC56109;
	Thu, 27 Oct 2011 13:56:42 +0100 (BST)
Date: Thu, 27 Oct 2011 13:56:41 +0100
From: Alex Bligh <alex@alex.org.uk>
To: xen-devel@lists.xensource.com
Message-ID: <A853EEFF3A385ED3FA09E5F0@nimrod.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: Alex Bligh <alex@alex.org.uk>
Subject: [Xen-devel] PV drivers on HVM using Xen 4.1.1
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

I think I've found one reason why we can't get PV block drivers on HVM
domUs working on Xen 4.1.1 - whether we use a pvops or a xenlinux
domU kernel.

We are using a line like:

  disk = [ "tap:aio:/tmp/centos-pvd.img,xvda,w" ]

We are using effectively a standard 3.0 kernel. Config options including
the word XEN are below.

We do not see blktapctrl starting in Xen 4.1.1 dom0, but it does
start in Xen3. In fact as far as I can tell the Ubuntu Xen4 package
does not contain blktapctrl at all (which would explain why it doesn't
start). Do we need this?

It has been suggested that we don't need this, but we do need a kernel
module that provides blktap.

  http://www.vr.org/knowledgebase/1112/Xen-Paravirt-Ops.html

suggests these might be queued for the non-existent "2.6.40", but
it's suggested these aren't in 3.0.

  http://wiki.xensource.com/xenwiki/XAPI_on_debian

suggests there are dmks modules available, but that blktap is currenly
only 32 bit. Can that be correct?

Isn't this what blkback does?

domU config is below. Note the very same VM with the same config file
works just fine on xen 3.3.1. This domU is Centos 2.6.18 with
unmodified_drivers xenlinux type kernel (as supplied by Centos). Every
other kernel we've tried does the same, save that modern ones also
unplug the emulated devices so no disks appear as well.

PV nics work fine.

-- 
Alex Bligh

root@xen4:/home/ubuntu/kernel# 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

root@xen4:/home/ubuntu/kernel# lsmod | fgrep -i xen
xen_netfront           26671  0
xen_blkfront           26261  0
xen_wdt                13525  0
xen_gntalloc           13321  0
xenbus_probe_frontend    13232  2 xen_netfront,xen_blkfront,[permanent]
xen_gntdev             17676  2
netxen_nic             97283  0
xen_netback            27854  0 [permanent]
xen_blkback            23177  0 [permanent]
xen_evtchn             13172  5
xenfs                  18311  1

Guest config looks like this, though we've used xvda and hda

root@xen4:/home/ubuntu/kernel# cat !$
cat /etc/xen/centos5-pvd
name = "centos5-pvd-xen4"
uuid = "6d72aff9-8f53-beb7-c71c-89e72b93193e"
maxmem = 512
memory = 512
vcpus = 2
builder = "hvm"
#kernel = "/usr/lib/xen/boot/hvmloader"
boot = "c"
pae = 1
acpi = 1
apic = 1
localtime = 0
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"
#device_model = "/usr/lib64/xen/bin/pv-qemu-dm"
#device_model = "/usr/lib/xen/bin/stubdom-dm"
#sdl = 0
#vnc = 1
vnclisten="0.0.0.0"
keymap="en-gb"
#vncunused = 1
#vncdisplay = "3"
vfb = [ "type=vnc,vncunused=1,keymap=en-gb" ]
disk = [ "file:/root/Iain2011/centos-pvd.img,xvda,w" ]
vif = [ 
"mac=00:16:3e:00:a5:58,bridge=br0,type=foo","mac=00:16:3e:00:a5:58,bridge=br0,type=ioemu" 
]
serial = "pty"




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:12:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:12:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPlO-0005HR-TK; Thu, 27 Oct 2011 06:12:54 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJPkH-00052k-Cl
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:11:45 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1319721102!958055!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6252 invoked from network); 27 Oct 2011 13:11:42 -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;
	27 Oct 2011 13:11:42 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8620367"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 13:11:42 +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, 27 Oct 2011 14:11:42 +0100
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: Thu, 27 Oct 2011 14:11:41 +0100
In-Reply-To: <4EA965FB0200006600005AE7@novprvlin0050.provo.novell.com>
References: <4E988CC30200006600005222@novprvlin0050.provo.novell.com>
	<alpine.DEB.2.00.1110191148580.3519@kaball-desktop>
	<alpine.DEB.2.00.1110191152460.3519@kaball-desktop>
	<CAG1y0sdh+4eai1qooKDRhLZM6UDXVqfywx5e7E6H5EYnN_eqeg@mail.gmail.com>
	<alpine.DEB.2.00.1110191440070.3519@kaball-desktop>
	<4EA965FB0200006600005AE7@novprvlin0050.provo.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: <1319721101.9436.114.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "Fajar A. Nugraha" <list@fajar.net>,
	"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 Thu, 2011-10-27 at 04:08 +0100, Chun Yan Liu wrote:
> Thank you all. Have tested pv-grub and qemu-nbd trick. Both work. 
> 
> Following is the test patch

I'm afraid that something has horribly mangled your patch (you can see
some of what I received quoted below). Documentation/SubmittingPatches
in the Linux source tree has a bunch of hints for various MUAs. Or you
could consider usign the "hg email" extension
(http://wiki.xen.org/xenwiki/SubmittingXenPatches has a good description
of this).

Ian.


>  that starts qemu-nbd to mount a non-raw qdisk in domain0, so that it
> can work with qcow/qcow2 disk image and using pygrub. I don't know if
> we need such a patch, or prefer to ask user to use pv-grub instead.
> Just post here for any chance of use. Thanks. 
> 
>   
> 
> Patch description: 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. 
> 
> 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.cThu Oct 20 15:48:45 2011 +0800 
> 
> @@ -1078,12 +1078,41 @@ 
> 
>      return rc; 
> 
>  } 
> 
>   
> 
> +static char * nbd_mount_disk(libxl_device_disk *disk) 
> 
> +{ 
> 
> +    int i; 
> 
> +    int nbds_max = 16; 
> 
> +    char *nbd_dev, *cmd; 
> 
> +    char *ret = NULL; 
> 
> + 
> 
> +    for (i = 0; i < nbds_max; i++) { 
> 
> +        asprintf(&nbd_dev,"/dev/nbd%d", i); 
> 
> +        asprintf(&cmd, "qemu-nbd -c %s %s", nbd_dev,
> disk->pdev_path); 
> 
> +        if (system(cmd) == 0) { 
> 
> +            ret = strdup(nbd_dev); 
> 
> +            break; 
> 
> +        } 
> 
> +    } 
> 
> + 
> 
> +    return ret; 
> 
> +} 
> 
> + 
> 
> +static int nbd_unmount_disk(char *diskpath) { 
> 
> +    char *cmd; 
> 
> +    asprintf(&cmd, "qemu-nbd -d %s", diskpath); 
> 
> +    if (system(cmd) == 0) 
> 
> +        return 0; 
> 
> +    else 
> 
> +        return ERROR_FAIL; 
> 
> +} 
> 
> + 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:14:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:14:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPmt-0005io-He; Thu, 27 Oct 2011 06:14:27 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJPmP-0005VB-Gk
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:13:57 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319721221!43376969!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31429 invoked from network); 27 Oct 2011 13:13:42 -0000
Received: from rcsinet15.oracle.com (HELO rcsinet15.oracle.com)
	(148.87.113.117)
	by server-11.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 27 Oct 2011 13:13: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
	p9RDDbS6005289
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 13:13:38 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
	p9RDDaSc022545
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 13:13:37 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
	p9RDDVoP015141; Thu, 27 Oct 2011 08:13:31 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 27 Oct 2011 06:13:30 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 5E0EE82C22; Thu, 27 Oct 2011 09:13:29 -0400 (EDT)
Date: Thu, 27 Oct 2011 09:13:29 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
Message-ID: <20111027131329.GA2242@phenom.dumpdata.com>
References: <1F3C32D227DDE8714E7A546D@nimrod.local>
	<1319707628.9436.84.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319707628.9436.84.camel@zakaz.uk.xensource.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.4EA95902.01D9:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

> > Are the PV devices meant to appear as /dev/sdX rather than /dev/xvdX?
> 
> No, there is no support for this in upstream kernels (in general all the
> old behaviours of Xen kernels where they would hijack other drivers
> device names are not upstreamble)

Wait a minute. I think these two:

konrad@phenom:~/work/linux$ git shortlog v3.0..v3.1 drivers/block/xen-blkfront.c
Stefan Bader (2):
      xen-blkfront: Drop name and minor adjustments for emulated scsi devices
      xen-blkfront: Fix one off warning about name clash


Made it happen.. as without them the Amazon EC2 would not boot?

Details: "    xen-blkfront: Drop name and minor adjustments for emulated scsi devices
    
    These were intended to avoid the namespace clash when representing
    emulated IDE and SCSI devices. However that seems to confuse users
    more than expected (a disk defined as sda becomes xvde).
    So for now go back to the scheme which does no adjustments. This
    will break when mixing IDE and SCSI names in the configuration of
    guests but should be by now expected"

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:18:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:18:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPrF-0006AX-MC; Thu, 27 Oct 2011 06:18:57 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJPqi-0005yy-Mm
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:18:25 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319721501!1874775!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12494 invoked from network); 27 Oct 2011 13:18:21 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-14.tower-21.messagelabs.com with SMTP;
	27 Oct 2011 13:18:21 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id 62428C56100;
	Thu, 27 Oct 2011 14:18:20 +0100 (BST)
Date: Thu, 27 Oct 2011 14:18:19 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
Message-ID: <7AA611B2739D076B13940BA4@nimrod.local>
In-Reply-To: <1319707628.9436.84.camel@zakaz.uk.xensource.com>
References: <1F3C32D227DDE8714E7A546D@nimrod.local>
	<1319707628.9436.84.camel@zakaz.uk.xensource.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>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
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

Ian,

--On 27 October 2011 10:27:08 +0100 Ian Campbell <Ian.Campbell@citrix.com> 
wrote:


>> I am not avoiding answering your question (I will get you this) but
>> what is /meant/ to happen in the following scenario:

(now answered in another email) :-)

> Lets call this scenario A:
>
>> * Install on recent kernel (e.g. 2.6.37) running on Xen 3.3
>> * No fancy boot options, xen_emul_unplug not set
>> * No XEN_IOPORT_MAGIC implemented, so check_platform_magic()
>>   returns an error
>
> Correct, specifically it returns XEN_PLATFORM_ERR_MAGIC.
>
>> * Therefore xen_platform_pci_unplug=0
>
> Correct. There is some special casing around XEN_PLATFORM_ERR_MAGIC but
> lets assume xen_emul_unplug=unnecessary has not been passed to the
> kernel so it does not take effect.
>
>> * Therefore blkfront etc. don't init (probe returns
>>   -ENODEV)
>> * Therefore OS boots with root=/dev/sda
>
> sda must be an emulated IDE device since the 2.6.37 kernel does not
> support PV devices with names other than xvd*.
>
> I think this is as expected.

Yes, correct. So an in image created for xen 3.3 will have root=/dev/sda

>> Now Xen 3.3 is upgraded to Xen 4
>
> Lets call this scenario B:
>
>> * Kernel boots, and XEN_IOPORT_MAGIC now exists
>> * Therefore unplug occurs, and xen_platform_pci_unplug is non zero
>> * Therefore blkfront etc. inits, and PV drivers start
>> * OS still boots with root=/dev/sda
>>
>> Are the PV devices meant to appear as /dev/sdX rather than /dev/xvdX?
>
> No, there is no support for this in upstream kernels (in general all the
> old behaviours of Xen kernels where they would hijack other drivers
> device names are not upstreamble)

I thought so (from reading the code)

>> If so, how in the code does this happen? If not, won't the boot fail?
>
> You need to be using root=/dev/xvda here for it to work. Or even better
> use root=UUID=thing or root=LABEL=thong (many distros do one of these by
> default these days).
>
> (I'd forgotten about the UUID=/LABEL= option til just now -- that might
> be the bit of magic which was missing to make this work)

Right, so the same image that worked fine on Xen 3 will not work if
Xen 3 is upgraded to Xen 4 - it will require changes to the image.
It's not only root= on the command line, but also /etc/fstab (we have
partitioned disks in our images).

Sure, using UUIDs works, but unfortunately we have thousands of VMs run by 
users who, not possessing crystal balls, did not know the names of their 
block devices were to change :-) For completeness, there is a also a 
problem with certain versions of grub (pre grub2) where UUID config doesn't 
work;
whilst grub of course loads before the kernel and before the unplug, the
grub config file still references a device which has been unplugged, so
the next time grub is reconfigured, it can't find the disk to write to.

>> > Hmm, yes I think the special treatment of XEN_IOPORT_MAGIC mismatch on
>> > the kernel side is what I was missing.
>> >
>> > It might make sense to have a guest level config option which disables
>> > these magic ports, i.e. makes them return 0xffff like they would have
>> > done in 3.3 (I think 0xffff is what you'll get from an invalid port in
>> > general).
>>
>> Actually I don't think this will work. If we do this,
>> xen_plaftofm_pci_unplug will still be zero (as it's only set on exit
>> of the function after a successful unplug), and that's enough to
>> prevent blkfront and xenbus_probe_frontend from doing anything useful,
>> so will effectively disable PV drivers even where they should be enabled.
>
> Correct, this will take you back to scenario A, however if that is how
> the guest is configured (to use emulated devices) then this is what you
> wanted (or at least it is what the guest configuration is expecting).
>
> If the guest were configured to use PV devices then it would be using
> root=/dev/xvda. Such a configuration would have needed
> xen_emul_unplug=unnecessary in order to have worked on 3.3 before the
> upgrade and this option would be harmless but unnecessary on 4.1.

Yes.

The trouble is some guests are running Windows, some old xenlinux
kernels, and some new kernels that talk to XEN_IOPORT_MAGIC. I need
one config that works for all of them, as we have no way of telling
them apart.

If I disable XEN_IOPORT_MAGIC then new installs of newer operating
systems will not run with PV drivers. I agree that these won't
run (without tweaked kernel boot lines) on Xen 3.3 with PV drivers
either, but I don't want to be stuck this way for ever.

I /think/ what you are saying is that the on new kernels that talk
to XEN_IOPORT_MAGIC, they will use /dev/sdX (emulated disks). If
we upgrade to Xen4, these will all break, because we can't distinguish
them from the behaviour of a new kernel doing a new install, where
we want the unplug to occur. The fix is either to fix the root
device, or to pass xen_emul_unplug=unnecessary in which case it should
continue to use to the emulated devices.

It would have been really nice to have been able to pass something
through XEN_IOPORT_MAGIC to effectively cause the same effect as
xen_emul_unplug=unnecessary on the command line, but I don't see how
that can be done with code already in the wild - unless I'm wrong?

> If you were using UUID=/LABEL= then I think things would have worked in
> both cases (emulated on 3.3 and pv on 4.1) without additional kernel
> parameters.
>
> One detail worth mentioning is that if the guest is using PV drivers and
> expecting xvd* named devices then prior to the unplug the devices
> xvd[a-d] are also exposed as the IDE devices hd[a-d]. This is how the
> bootloader is still able to access the emulated device.

Sure

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:27:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:27:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJPzu-0006fL-21; Thu, 27 Oct 2011 06:27:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJPzW-0006Tn-RZ
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:27:31 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1319722047!1876748!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12150 invoked from network); 27 Oct 2011 13:27:27 -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;
	27 Oct 2011 13:27:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8620822"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 13:27:27 +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, 27 Oct 2011 14:27:27 +0100
Date: Thu, 27 Oct 2011 14:27:45 +0100
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] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
In-Reply-To: <20111027131329.GA2242@phenom.dumpdata.com>
Message-ID: <alpine.DEB.2.00.1110271427040.3519@kaball-desktop>
References: <1F3C32D227DDE8714E7A546D@nimrod.local>
	<1319707628.9436.84.camel@zakaz.uk.xensource.com>
	<20111027131329.GA2242@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@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>, 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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 27 Oct 2011, Konrad Rzeszutek Wilk wrote:
> > > Are the PV devices meant to appear as /dev/sdX rather than /dev/xvdX?
> > 
> > No, there is no support for this in upstream kernels (in general all the
> > old behaviours of Xen kernels where they would hijack other drivers
> > device names are not upstreamble)
> 
> Wait a minute. I think these two:
> 
> konrad@phenom:~/work/linux$ git shortlog v3.0..v3.1 drivers/block/xen-blkfront.c
> Stefan Bader (2):
>       xen-blkfront: Drop name and minor adjustments for emulated scsi devices
>       xen-blkfront: Fix one off warning about name clash
> 
> 
> Made it happen.. as without them the Amazon EC2 would not boot?
> 
> Details: "    xen-blkfront: Drop name and minor adjustments for emulated scsi devices
>     
>     These were intended to avoid the namespace clash when representing
>     emulated IDE and SCSI devices. However that seems to confuse users
>     more than expected (a disk defined as sda becomes xvde).
>     So for now go back to the scheme which does no adjustments. This
>     will break when mixing IDE and SCSI names in the configuration of
>     guests but should be by now expected"

This commit should only cause sda to become xvda rather than xvde.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:33:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:33:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQ5d-0007ES-6y; Thu, 27 Oct 2011 06:33:49 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQ5E-00072x-1c
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:33:24 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1319722399!36870615!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8544 invoked from network); 27 Oct 2011 13:33:20 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 13:33:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315195200"; d="scan'208";a="18590179"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 09:33:19 -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; Thu, 27 Oct 2011 09:33:19 -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 p9RDXHCf022628;	Thu, 27 Oct 2011 06:33:17 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>, Xen Devel
	<xen-devel@lists.xensource.com>
Date: Thu, 27 Oct 2011 14:33:14 +0100
Message-ID: <1319722394-13439-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>
Subject: [Xen-devel] [PATCH V2] docs, Add HowTo use QEMU upstream.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>
---
Change with v1:
  - fix spelling & grammar.
  - Add a note about futur patches.

 docs/misc/qemu-upstream_howto_use_it.markdown |  129 +++++++++++++++++++++++++
 1 files changed, 129 insertions(+), 0 deletions(-)

diff --git a/docs/misc/qemu-upstream_howto_use_it.markdown b/docs/misc/qemu-upstream_howto_use_it.markdown
new file mode 100644
index 0000000..14ff4a0
--- /dev/null
+++ b/docs/misc/qemu-upstream_howto_use_it.markdown
@@ -0,0 +1,129 @@
+Help to use QEMU (upstream version) with Xen
+============================================
+
+Note
+----
+
+All these steps will become unnecessary after the patches to integrate
+SeaBIOS/QEMU build will be applied.
+
+
+How to build it
+---------------
+
+### SeaBIOS
+
+The new device-model needs a different BIOS, SeaBIOS. Clone the repository from:
+
+  - git://git.qemu.org/seabios.git
+  - http://git.qemu.org/git/seabios.git
+
+Put the `.config` file in the appendix at the root of seabios.git and build SeaBIOS.
+
+In xen-unstable source tree, add the file `.config` with
+`SEABIOS_DIR = /path/to/seabios.git`.
+To build hvmloader with SeaBIOS, you propably need to `make -C tools/firmware
+clean` first and then `make tools`, to use the new SEABIOS_DIR parameter.
+
+
+### QEMU
+
+Get QEMU upstream source from:
+
+  - git://xenbits.xensource.com/qemu-upstream-unstable.git
+  - http://xenbits.xensource.com/git-http/qemu-upstream-unstable.git
+
+To configure build QEMU upstream with Xen
+
+    ./configure --enable-xen --target-list=i386-softmmu --extra-cflags="-I$path_to_xen_source/tools/include -I$path_to_xen_source/tools/libxc -I$path_to_xen_source/tools/xenstore" --extra-ldflags="-L$path_to_xen_source/tools/libxc -L$path_to_xen_source/tools/xenstore"
+
+You can also use other several options such as `--disable-kvm`.
+
+
+How to use QEMU upstream
+------------------------
+
+Only xl support QEMU upstream.
+
+To actually use it, add or change this in your VM configuration file:
+
+    device_model_version = 'qemu-xen'
+    device_model_override = '/path/to/qemu/i386-softmmu/qemu'
+
+NB: On qemu-upstream repository, the default binary name has been renamed to
+`qemu-system-i386`.
+
+
+Appendix
+------
+
+### `.config` file for SeaBIOS
+
+    #
+    # General Features
+    #
+    # CONFIG_COREBOOT is not set
+    CONFIG_XEN=y
+    CONFIG_THREADS=y
+    CONFIG_THREAD_OPTIONROMS=y
+    CONFIG_RELOCATE_INIT=y
+    CONFIG_BOOTMENU=y
+    CONFIG_BOOTMENU_WAIT=1000
+    # CONFIG_BOOTSPLASH is not set
+    CONFIG_BOOTORDER=y
+    #
+    # Hardware support
+    #
+    CONFIG_ATA=y
+    CONFIG_ATA_DMA=y
+    CONFIG_ATA_PIO32=y
+    CONFIG_AHCI=y
+    CONFIG_VIRTIO_BLK=y
+    CONFIG_FLOPPY=y
+    CONFIG_PS2PORT=y
+    CONFIG_USB=y
+    CONFIG_USB_UHCI=y
+    CONFIG_USB_OHCI=y
+    CONFIG_USB_EHCI=y
+    CONFIG_USB_MSC=y
+    CONFIG_USB_HUB=y
+    CONFIG_USB_KEYBOARD=y
+    CONFIG_USB_MOUSE=y
+    CONFIG_SERIAL=y
+    CONFIG_LPT=y
+    # CONFIG_EXTRA_PCI_ROOTS is not set
+    # CONFIG_USE_SMM is not set
+    CONFIG_MTRR_INIT=y
+    #
+    # BIOS interfaces
+    #
+    CONFIG_DRIVES=y
+    # CONFIG_CDROM_BOOT is not set
+    CONFIG_PCIBIOS=y
+    CONFIG_APMBIOS=y
+    CONFIG_PNPBIOS=y
+    CONFIG_OPTIONROMS=y
+    # CONFIG_OPTIONROMS_DEPLOYED is not set
+    CONFIG_OPTIONROMS_CHECKSUM=y
+    CONFIG_PMM=y
+    CONFIG_BOOT=y
+    CONFIG_KEYBOARD=y
+    CONFIG_KBD_CALL_INT15_4F=y
+    CONFIG_MOUSE=y
+    CONFIG_S3_RESUME=y
+    # CONFIG_S3_RESUME_VGA_INIT is not set
+    # CONFIG_DISABLE_A20 is not set
+    #
+    # BIOS Tables
+    #
+    CONFIG_PIRTABLE=y
+    CONFIG_MPTABLE=y
+    CONFIG_SMBIOS=y
+    CONFIG_ACPI=y
+    #
+    # Debugging
+    #
+    CONFIG_DEBUG_LEVEL=3
+    CONFIG_DEBUG_SERIAL=y
+    CONFIG_DEBUG_SERIAL_PORT=0x3f8
+    # CONFIG_SCREEN_AND_DEBUG is not set
-- 
tg: (440f4bd..) docs/qemu (depends on: master)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:35:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:35:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQ77-0007fD-Lz; Thu, 27 Oct 2011 06:35:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQ6e-0007SK-Vg
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:34:53 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1319722489!2615259!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25104 invoked from network); 27 Oct 2011 13:34:50 -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;
	27 Oct 2011 13:34:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8621038"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 13:34: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, 27 Oct 2011 14:34:49 +0100
Date: Thu, 27 Oct 2011 14:35:07 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Alex Bligh <alex@alex.org.uk>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
In-Reply-To: <7AA611B2739D076B13940BA4@nimrod.local>
Message-ID: <alpine.DEB.2.00.1110271428320.3519@kaball-desktop>
References: <1F3C32D227DDE8714E7A546D@nimrod.local>
	<1319707628.9436.84.camel@zakaz.uk.xensource.com>
	<7AA611B2739D076B13940BA4@nimrod.local>
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>,
	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, 27 Oct 2011, Alex Bligh wrote:
> It would have been really nice to have been able to pass something
> through XEN_IOPORT_MAGIC to effectively cause the same effect as
> xen_emul_unplug=unnecessary on the command line, but I don't see how
> that can be done with code already in the wild - unless I'm wrong?

You are correct: with the current linux code you need to change the
linux command line options in order to be able to accomplish what you
want.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:36:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:36:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQ7v-00085g-G7; Thu, 27 Oct 2011 06:36:11 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQ7P-0007om-6H
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:35:39 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319722535!969982!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14221 invoked from network); 27 Oct 2011 13:35:36 -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;
	27 Oct 2011 13:35:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8621059"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 13:35: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;
	Thu, 27 Oct 2011 14:35:32 +0100
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 27 Oct 2011 14:35:31 +0100
In-Reply-To: <20111027131329.GA2242@phenom.dumpdata.com>
References: <1F3C32D227DDE8714E7A546D@nimrod.local>
	<1319707628.9436.84.camel@zakaz.uk.xensource.com>
	<20111027131329.GA2242@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: <1319722531.9436.116.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-10-27 at 14:13 +0100, Konrad Rzeszutek Wilk wrote:
> > > Are the PV devices meant to appear as /dev/sdX rather than /dev/xvdX?
> > 
> > No, there is no support for this in upstream kernels (in general all the
> > old behaviours of Xen kernels where they would hijack other drivers
> > device names are not upstreamble)
> 
> Wait a minute. I think these two:
> 
> konrad@phenom:~/work/linux$ git shortlog v3.0..v3.1 drivers/block/xen-blkfront.c
> Stefan Bader (2):
>       xen-blkfront: Drop name and minor adjustments for emulated scsi devices
>       xen-blkfront: Fix one off warning about name clash
> 
> 
> Made it happen.. as without them the Amazon EC2 would not boot?

No, that was to do with not renaming hda devices into xvdHDa (or
something like that) and instead calling them hda.

I was talking about blkfront literally taking over the IDE major which
is not something that's upstream.

> 
> Details: "    xen-blkfront: Drop name and minor adjustments for emulated scsi devices
>     
>     These were intended to avoid the namespace clash when representing
>     emulated IDE and SCSI devices. However that seems to confuse users
>     more than expected (a disk defined as sda becomes xvde).
>     So for now go back to the scheme which does no adjustments. This
>     will break when mixing IDE and SCSI names in the configuration of
>     guests but should be by now expected"



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:37:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06: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 1RJQ9E-0000DY-7T; Thu, 27 Oct 2011 06:37:32 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQ7l-0007zL-DY
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:36:01 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1319722530!50819969!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12618 invoked from network); 27 Oct 2011 13:35:31 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-5.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 27 Oct 2011 13:35:31 -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
	p9RDZi6L020087
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 13:35: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
	p9RDZhrr017263
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 13:35:44 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
	p9RDZc5A021473; Thu, 27 Oct 2011 08:35:38 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 27 Oct 2011 06:35:37 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 105E982C23; Thu, 27 Oct 2011 09:35:37 -0400 (EDT)
Date: Thu, 27 Oct 2011 09:35:37 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Alex Bligh <alex@alex.org.uk>
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
Message-ID: <20111027133536.GD2242@phenom.dumpdata.com>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
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.4EA95E31.00BB,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, Oct 27, 2011 at 01:56:41PM +0100, Alex Bligh wrote:
> I think I've found one reason why we can't get PV block drivers on HVM
> domUs working on Xen 4.1.1 - whether we use a pvops or a xenlinux
> domU kernel.
> 
> We are using a line like:
> 
>  disk = [ "tap:aio:/tmp/centos-pvd.img,xvda,w" ]
> 
> We are using effectively a standard 3.0 kernel. Config options including
> the word XEN are below.
> 
> We do not see blktapctrl starting in Xen 4.1.1 dom0, but it does
> start in Xen3. In fact as far as I can tell the Ubuntu Xen4 package
> does not contain blktapctrl at all (which would explain why it doesn't
> start). Do we need this?
> 
> It has been suggested that we don't need this, but we do need a kernel
> module that provides blktap.
> 
>  http://www.vr.org/knowledgebase/1112/Xen-Paravirt-Ops.html
> 
> suggests these might be queued for the non-existent "2.6.40", but
> it's suggested these aren't in 3.0.

Right, they are a no-go. There is a 
> 
>  http://wiki.xensource.com/xenwiki/XAPI_on_debian
> 
> suggests there are dmks modules available, but that blktap is currenly
> only 32 bit. Can that be correct?

There is a 64-bit (and 32-bit) version on Daniel's git tree:

git://xenbits.xensource.com/people/dstodden/linux.git

.. but the deal is that it is unmaintained (Daniel left Citrix).

Thought interestingly .. he made a version of it where all of the fiddling
with the generic code has been removed. Neat.

> 
> Isn't this what blkback does?

Blkback can't handle files - it can only handle block devices.
> 
> domU config is below. Note the very same VM with the same config file
> works just fine on xen 3.3.1. This domU is Centos 2.6.18 with
> unmodified_drivers xenlinux type kernel (as supplied by Centos). Every
> other kernel we've tried does the same, save that modern ones also
> unplug the emulated devices so no disks appear as well.
> 
> PV nics work fine.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:39:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:39:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQAe-0000dT-Gy; Thu, 27 Oct 2011 06:39:00 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQ8C-0008EA-Gw
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:36:29 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319722585!956712!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28019 invoked from network); 27 Oct 2011 13:36:25 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-11.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 13:36:25 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RJQ86-000Ge5-SV; Thu, 27 Oct 2011 13:36:22 +0000
Date: Thu, 27 Oct 2011 14:36:22 +0100
From: Tim Deegan <tim@xen.org>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] [PATCH 3 of 9] Enforce ordering constraints for the
	page alloc lock in the PoD code
Message-ID: <20111027133622.GJ59656@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<332775f72a3055c47c2b.1319690028@xdev.gridcentric.ca>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <332775f72a3055c47c2b.1319690028@xdev.gridcentric.ca>
User-Agent: Mutt/1.4.2.1i
Cc: andres@gridcentric.ca, xen-devel@lists.xensource.com, olaf@aepfle.de,
	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, 

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.
- 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.

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))==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->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=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 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-ordering
> +     * 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 Thu Oct 27 06:42:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:42:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQE4-00013c-Il; Thu, 27 Oct 2011 06:42:32 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQDO-0000r3-QF
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:41:51 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319722907!1284486!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10143 invoked from network); 27 Oct 2011 13:41:47 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 13:41:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8621308"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 13:41:47 +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, 27 Oct 2011 14:41:47 +0100
Date: Thu, 27 Oct 2011 14:42:05 +0100
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_emul_unplug on xen 4.1, HVM guest 2.6.38
In-Reply-To: <4EA91023.5000201@canonical.com>
Message-ID: <alpine.DEB.2.00.1110271436100.3519@kaball-desktop>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.com>
	<AEAE0D618F71583484DA951D@nimrod.local>
	<1319647412.9436.50.camel@zakaz.uk.xensource.com>
	<4EA91023.5000201@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>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Wilk <konrad.wilk@oracle.com>, Rzeszutek,
	"Konrad@rly45j.srv.mailcontrol.com" <Konrad@rly45j.srv.mailcontrol.com>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

I take we are still talking about PV on HVM guests here.

On Thu, 27 Oct 2011, Stefan Bader wrote:
> At least one part is not Ubuntu specific. And that is that the unplug logic
> decides to unplug emulated devices based on having the pci and the blkfront
> driver *available* (built-in or module). But later on the blkfront driver
> ignores all devices that are not *named* in a way to map to the xvd major.
> Which leaves you without any usable devices when you named your disk hda in
> the config file and you do not prevent unplugging.

If you name your disk hda (as you should), blkfront is going to create
/dev/xvda in your guest.
It is not ignoring your disk, it just using "xvd" to name the device in
the guest.


> Still I would love to see this unplug handling become a bit more obvious. If
> unplug was successful, then blkfront should not ignore the devices. Or maybe
> just make the config more what-you-write-is-what-you-get and having hd or sd
> there only gives you emulated devices and xvd gives you pv devices.

Yes, if the unplug is unsuccessful blkfront should not ignore the
device: it is going to create a /dev/xvd* for you.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:45:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:45:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQGy-0001Tk-5Z; Thu, 27 Oct 2011 06:45:32 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQGK-0001Gh-Iq
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:44:52 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1319723089!1288704!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32733 invoked from network); 27 Oct 2011 13:44:49 -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;
	27 Oct 2011 13:44:49 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8621392"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 13:44: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, 27 Oct 2011 14:44:49 +0100
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Alex Bligh <alex@alex.org.uk>
Date: Thu, 27 Oct 2011 14:44:49 +0100
In-Reply-To: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319723089.9436.124.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-10-27 at 13:56 +0100, Alex Bligh wrote:
> I think I've found one reason why we can't get PV block drivers on HVM
> domUs working on Xen 4.1.1 - whether we use a pvops or a xenlinux
> domU kernel.
> 
> We are using a line like:
> 
>   disk = [ "tap:aio:/tmp/centos-pvd.img,xvda,w" ]
> 
> We are using effectively a standard 3.0 kernel. Config options including
> the word XEN are below.
> 
> We do not see blktapctrl starting in Xen 4.1.1 dom0, but it does
> start in Xen3.

Are you changing dom0 kernel as well as hypervisor when you say "3" and
"4.1.1" or is the dom0 kernel constant?

>  In fact as far as I can tell the Ubuntu Xen4 package
> does not contain blktapctrl at all (which would explain why it doesn't
> start). Do we need this?

AFAIK tap:aio: usually requires blktap (both kernel side and userspace).
There is also a block backend in qemu which can be by xl used under some
circumstances when blktap is not available but the same is not true of
xend.

> It has been suggested that we don't need this, but we do need a kernel
> module that provides blktap.
> 
>   http://www.vr.org/knowledgebase/1112/Xen-Paravirt-Ops.html
> 
> suggests these might be queued for the non-existent "2.6.40", but
> it's suggested these aren't in 3.0.
> 
>   http://wiki.xensource.com/xenwiki/XAPI_on_debian
> 
> suggests there are dmks modules available, but that blktap is currenly
> only 32 bit. Can that be correct?

XCP (from whence that blktap version comes) is only developed/test using
32 bit. Taht's not to say 64 bit doesn't work, but it might not.

> Isn't this what blkback does?

blkback can only export raw block devices to guests.

blktap can be used to export more "structured" image types, such as vhd.

A raw img like you have cannot be directly handled by blkback (since it
is a file and not a block device). You can consider it a dengenerate
case of a structured image so blktap can deal with it. A raw image can
also be mounted with a loop back device which itself can be exported via
blkback. Some toolstacks (xend) can do this automatically (but won't for
a tap:aio: AFAIK) but xl will not.

Unfortunately blktap (at least in its current form) is not suitable to
go upstream. If someone wants to step up and implement the blkring
protocol in userspace (i.e. do away with the kernel component by merging
that bit into the tapdisk process itself) then that would be very much
appreciated.

> domU config is below. Note the very same VM with the same config file
> works just fine on xen 3.3.1. This domU is Centos 2.6.18 with
> unmodified_drivers xenlinux type kernel (as supplied by Centos). Every
> other kernel we've tried does the same, save that modern ones also
> unplug the emulated devices so no disks appear as well.
> 
> PV nics work fine.
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:46:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:46:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQHy-0001r0-PC; Thu, 27 Oct 2011 06:46:34 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJQHU-0001ex-Od
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:46:05 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1319723161!977850!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29522 invoked from network); 27 Oct 2011 13:46:01 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-2.tower-182.messagelabs.com with SMTP;
	27 Oct 2011 13:46:01 -0000
Received: from p5b2e2a76.dip.t-dialin.net ([91.46.42.118] helo=[192.168.2.143])
	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 1RJQHQ-00025z-5x; Thu, 27 Oct 2011 13:46:00 +0000
Message-ID: <4EA96097.5000603@canonical.com>
Date: Thu, 27 Oct 2011 15:45:59 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux i686;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.com>
	<AEAE0D618F71583484DA951D@nimrod.local>
	<1319647412.9436.50.camel@zakaz.uk.xensource.com>
	<4EA91023.5000201@canonical.com>
	<alpine.DEB.2.00.1110271436100.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1110271436100.3519@kaball-desktop>
X-Enigmail-Version: 1.4a1pre
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Konrad@rly45j.srv.mailcontrol.com" <Konrad@rly45j.srv.mailcontrol.com>,
	Ian Campbell <Ian.Campbell@citrix.com>, Alex Bligh <alex@alex.org.uk>,
	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 27.10.2011 15:42, Stefano Stabellini wrote:
> I take we are still talking about PV on HVM guests here.
> 
> On Thu, 27 Oct 2011, Stefan Bader wrote:
>> At least one part is not Ubuntu specific. And that is that the unplug logic
>> decides to unplug emulated devices based on having the pci and the blkfront
>> driver *available* (built-in or module). But later on the blkfront driver
>> ignores all devices that are not *named* in a way to map to the xvd major.
>> Which leaves you without any usable devices when you named your disk hda in
>> the config file and you do not prevent unplugging.
> 
> If you name your disk hda (as you should), blkfront is going to create
> /dev/xvda in your guest.
> It is not ignoring your disk, it just using "xvd" to name the device in
> the guest.
> 
> 
>> Still I would love to see this unplug handling become a bit more obvious. If
>> unplug was successful, then blkfront should not ignore the devices. Or maybe
>> just make the config more what-you-write-is-what-you-get and having hd or sd
>> there only gives you emulated devices and xvd gives you pv devices.
> 
> Yes, if the unplug is unsuccessful blkfront should not ignore the
> device: it is going to create a /dev/xvd* for you.

The problem I saw in my test was that in blkfront_probe the following case was
hit when the device name was hda in the cfg:

                if (xen_platform_pci_unplug & XEN_UNPLUG_UNNECESSARY) {
                        int major;

                        if (!VDEV_IS_EXTENDED(vdevice))
                                major = BLKIF_MAJOR(vdevice);
                        else
                                major = XENVBD_MAJOR;

                        if (major != XENVBD_MAJOR) {
                                printk(KERN_INFO
                                                "%s: HVM does not support vbd %d
as xen block device\n",
                                                __FUNCTION__, vdevice);
                                return -ENODEV;
                        }
                }

So major is not XENVBD_MAJOR and the device is ignored.

-Stefan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:49:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:49:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQKr-0002GE-Ab; Thu, 27 Oct 2011 06:49:33 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJQJy-00023f-K6
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:48:38 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1319723315!1216528!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2889 invoked from network); 27 Oct 2011 13:48:35 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-11.tower-216.messagelabs.com with SMTP;
	27 Oct 2011 13:48:35 -0000
Received: from p5b2e2a76.dip.t-dialin.net ([91.46.42.118] helo=[192.168.2.143])
	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 1RJQJv-0002KT-5b; Thu, 27 Oct 2011 13:48:35 +0000
Message-ID: <4EA96131.4090906@canonical.com>
Date: Thu, 27 Oct 2011 15:48:33 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux i686;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.com>
	<AEAE0D618F71583484DA951D@nimrod.local>
	<1319647412.9436.50.camel@zakaz.uk.xensource.com>
	<4EA91023.5000201@canonical.com>
	<alpine.DEB.2.00.1110271436100.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1110271436100.3519@kaball-desktop>
X-Enigmail-Version: 1.4a1pre
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: Rzeszutek@rly20j.srv.mailcontrol.com,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>, Wilk <konrad.wilk@oracle.com>,
	"Konrad@rly45j.srv.mailcontrol.com" <Konrad@rly45j.srv.mailcontrol.com>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On 27.10.2011 15:42, Stefano Stabellini wrote:
> I take we are still talking about PV on HVM guests here.
> 
> On Thu, 27 Oct 2011, Stefan Bader wrote:
>> At least one part is not Ubuntu specific. And that is that the unplug logic
>> decides to unplug emulated devices based on having the pci and the blkfront
>> driver *available* (built-in or module). But later on the blkfront driver
>> ignores all devices that are not *named* in a way to map to the xvd major.
>> Which leaves you without any usable devices when you named your disk hda in
>> the config file and you do not prevent unplugging.
> 
> If you name your disk hda (as you should), blkfront is going to create
> /dev/xvda in your guest.
> It is not ignoring your disk, it just using "xvd" to name the device in
> the guest.
> 
> 
>> Still I would love to see this unplug handling become a bit more obvious. If
>> unplug was successful, then blkfront should not ignore the devices. Or maybe
>> just make the config more what-you-write-is-what-you-get and having hd or sd
>> there only gives you emulated devices and xvd gives you pv devices.
> 
> Yes, if the unplug is unsuccessful blkfront should not ignore the
> device: it is going to create a /dev/xvd* for you.

Hm, did you mean unsuccessful? Because then I think it *should* ignore the pv
disk. If it was successful then it *should not*. Or am I understanding this wrong?

> 
> _______________________________________________
> 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 Oct 27 06:55:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:55:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQQI-0002om-Fo; Thu, 27 Oct 2011 06:55:10 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQPi-0002bi-Hh
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:54:34 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319723671!30856741!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23712 invoked from network); 27 Oct 2011 13:54: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;
	27 Oct 2011 13:54:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8621654"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 13:54:30 +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, 27 Oct 2011 14:54:30 +0100
Date: Thu, 27 Oct 2011 14:54:48 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Alex Bligh <alex@alex.org.uk>
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
In-Reply-To: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
Message-ID: <alpine.DEB.2.00.1110271443530.3519@kaball-desktop>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
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, 27 Oct 2011, Alex Bligh wrote:
> I think I've found one reason why we can't get PV block drivers on HVM
> domUs working on Xen 4.1.1 - whether we use a pvops or a xenlinux
> domU kernel.
> 
> We are using a line like:
> 
>   disk = [ "tap:aio:/tmp/centos-pvd.img,xvda,w" ]

If this is an HVM guest, you should use hda here because you want to
make sure that an emulated IDE disk is created for you as well.
Also if /tmp/centos-pvd.img is a raw file, you might as well use file:
rather than tap:aio.


> We are using effectively a standard 3.0 kernel. Config options including
> the word XEN are below.
> 
> We do not see blktapctrl starting in Xen 4.1.1 dom0, but it does
> start in Xen3. In fact as far as I can tell the Ubuntu Xen4 package
> does not contain blktapctrl at all (which would explain why it doesn't
> start). Do we need this?
> 
> It has been suggested that we don't need this, but we do need a kernel
> module that provides blktap.
> 
>   http://www.vr.org/knowledgebase/1112/Xen-Paravirt-Ops.html
> 
> suggests these might be queued for the non-existent "2.6.40", but
> it's suggested these aren't in 3.0.
> 
>   http://wiki.xensource.com/xenwiki/XAPI_on_debian
> 
> suggests there are dmks modules available, but that blktap is currenly
> only 32 bit. Can that be correct?
> 
> Isn't this what blkback does?

blkback only works with block devices. You can still use blkback if you
configure a loop device:

losetup /dev/loop0 /tmp/centos-pvd.img

and then:

disk = [ "phy:/dev/loop0,hda,w" ]

However is not going to be very fast unfortunately.

As an alternative you could download and configure upstream qemu with
linux aio and then use it as device model or just block backend but
unfortunately it needs some hacking on 4.1 (on 4.2 is semi automated
now).

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 06:56:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 06:56:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQRW-0003Dd-Ge; Thu, 27 Oct 2011 06:56:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQR6-00030t-C0
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 06:56:00 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-12.tower-216.messagelabs.com!1319723757!1291181!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12957 invoked from network); 27 Oct 2011 13:55:57 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-12.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 13:55:57 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RJQR1-000Gig-HM; Thu, 27 Oct 2011 13:55:55 +0000
Date: Thu, 27 Oct 2011 14:55:55 +0100
From: Tim Deegan <tim@xen.org>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] [PATCH 4 of 9] Rework locking in the PoD layer
Message-ID: <20111027135555.GK59656@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<981073d78f7f0c92a7f5.1319690029@xdev.gridcentric.ca>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <981073d78f7f0c92a7f5.1319690029@xdev.gridcentric.ca>
User-Agent: Mutt/1.4.2.1i
Cc: andres@gridcentric.ca, xen-devel@lists.xensource.com, olaf@aepfle.de,
	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 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 is
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) != 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] = NULL;
>          }
> -        else
> +    }
> +
> +    /* Finally, add to cache */
> +    for ( i=0; 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 Thu Oct 27 07:12:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:12:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQgf-0004fL-PG; Thu, 27 Oct 2011 07:12:05 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJQYx-0003ZF-7N
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:04:20 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319724244!1918015!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6409 invoked from network); 27 Oct 2011 14:04:04 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-3.tower-21.messagelabs.com with SMTP;
	27 Oct 2011 14:04:04 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id 661EDC56100;
	Thu, 27 Oct 2011 15:04:02 +0100 (BST)
Date: Thu, 27 Oct 2011 15:04:01 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
Message-ID: <AA9CBD34E1D59F9039BABF9F@nimrod.local>
In-Reply-To: <1319723089.9436.124.camel@zakaz.uk.xensource.com>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<1319723089.9436.124.camel@zakaz.uk.xensource.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>
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

Ian,

--On 27 October 2011 14:44:49 +0100 Ian Campbell <Ian.Campbell@citrix.com> 
wrote:


>> We do not see blktapctrl starting in Xen 4.1.1 dom0, but it does
>> start in Xen3.
>
> Are you changing dom0 kernel as well as hypervisor when you say "3" and
> "4.1.1" or is the dom0 kernel constant?

No, the Xen3 kernel is 2.6.18 Centos, and the Xen 4 kernel is 3.0
Ubuntu Oneiric.

>>  In fact as far as I can tell the Ubuntu Xen4 package
>> does not contain blktapctrl at all (which would explain why it doesn't
>> start). Do we need this?
>
> AFAIK tap:aio: usually requires blktap (both kernel side and userspace).
> There is also a block backend in qemu which can be by xl used under some
> circumstances when blktap is not available but the same is not true of
> xend.

We are using xl (though have tried xend).

> XCP (from whence that blktap version comes) is only developed/test using
> 32 bit. Taht's not to say 64 bit doesn't work, but it might not.

OK. The idea here is a production xen4.1 system, so "might not work"
sounds like a bad idea :-)

>> Isn't this what blkback does?
>
> blkback can only export raw block devices to guests.

We will in production use raw block devices, so that's ok. We were
just using files for testing. Is the same restriction there is
Xen3.3, because it works there (possibly for the reason below).

> A raw image can
> also be mounted with a loop back device which itself can be exported via
> blkback. Some toolstacks (xend) can do this automatically (but won't for
> a tap:aio: AFAIK) but xl will not.

I think xl /must/ be doing this, or it is difficult to explain the
behaviour below.

We discovered Ubuntu's Xen 4.1 hypervisor package does not contain
blktapctrl, so we copied that across from a build from source, plus some
libraries, and did an mknod on /dev/xen/blktap0 (which it appeared to want
to open). pvdrivers then appeared in the guest. But we then reversed
everything we'd done (we think), and pvdrivers continued to appear. We are
reinstalling to find out exactly what it was that changed.

I must admit to remaining almost totally confused as to how this is
meant to work, but thanks for your help thus far!

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:13:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:13:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQiJ-00055B-Vy; Thu, 27 Oct 2011 07:13:48 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQa4-0003cM-Lk
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:05:35 -0700
X-Env-Sender: Wei.Wang2@amd.com
X-Msg-Ref: server-7.tower-216.messagelabs.com!1319724312!1289612!1
X-Originating-IP: [213.199.154.142]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8652 invoked from network); 27 Oct 2011 14:05:12 -0000
Received: from db3ehsobe004.messaging.microsoft.com (HELO
	DB3EHSOBE004.bigfish.com) (213.199.154.142)
	by server-7.tower-216.messagelabs.com with AES128-SHA encrypted SMTP;
	27 Oct 2011 14:05:12 -0000
Received: from mail60-db3-R.bigfish.com (10.3.81.247) by
	DB3EHSOBE004.bigfish.com (10.3.84.24) with Microsoft SMTP Server id
	14.1.225.22; Thu, 27 Oct 2011 14:05:05 +0000
Received: from mail60-db3 (localhost.localdomain [127.0.0.1])	by
	mail60-db3-R.bigfish.com (Postfix) with ESMTP id DFAE61C984A5;
	Thu, 27 Oct 2011 14:05:08 +0000 (UTC)
X-SpamScore: -3
X-BigFish: VPS-3(zzc85fh4015Lzz1202hzzz32i668h839h34h)
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,0,0,0,0,0,
Received: from mail60-db3 (localhost.localdomain [127.0.0.1]) by mail60-db3
	(MessageSwitch) id 1319724307883927_16782;
	Thu, 27 Oct 2011 14:05:07 +0000 (UTC)
Received: from DB3EHSMHS017.bigfish.com (unknown [10.3.81.245])	by
	mail60-db3.bigfish.com (Postfix) with ESMTP id C76DFCF0053;
	Thu, 27 Oct 2011 14:05:07 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	DB3EHSMHS017.bigfish.com (10.3.87.117) with Microsoft SMTP Server id
	14.1.225.22; Thu, 27 Oct 2011 14:04:59 +0000
X-WSS-ID: 0LTQ9SC-02-78N-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 2E571C8269;	Thu, 27 Oct 2011 09:04:59 -0500 (CDT)
Received: from SAUSEXDAG02.amd.com (163.181.55.2) by sausexedgep02.amd.com
	(163.181.36.59) with Microsoft SMTP Server (TLS) id 8.3.192.1;
	Thu, 27 Oct 2011 09:05:15 -0500
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;
	Thu, 27 Oct 2011 09:05:01 -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, 27 Oct 2011
	10:04:50 -0400
Received: from mail.osrc.amd.com (silizium.osrc.amd.com [165.204.15.142])	by
	gwo.osrc.amd.com (Postfix) with ESMTP id 2A3F949C108; Thu, 27 Oct 2011
	15:04:49 +0100 (BST)
Received: from gran.osrc.amd.com (gran.osrc.amd.com [165.204.15.57])	by
	mail.osrc.amd.com (Postfix) with ESMTP id 0C82C5940FF; Thu, 27 Oct 2011
	16:04:49 +0200 (CEST)
From: Wei Wang2 <wei.wang2@amd.com>
To: Jan Beulich <JBeulich@suse.com>, Keir Fraser <keir@xen.org>
Date: Thu, 27 Oct 2011 16:07:51 +0200
User-Agent: KMail/1.9.6 (enterprise 20070904.708012)
MIME-Version: 1.0
Content-Disposition: inline
Content-Type: multipart/mixed; boundary="Boundary-00=_4WWqObKYCJhFOHX"
Message-ID: <201110271607.52785.wei.wang2@amd.com>
X-OriginatorOrg: amd.com
Cc: Dunlap <George.Dunlap@eu.citrix.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Shin, Jacob" <Jacob.Shin@amd.com>, George, "Huang2,
	Wei" <Wei.Huang2@amd.com>
Subject: [Xen-devel] Backport per-device vector map patches to xen 4.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

--Boundary-00=_4WWqObKYCJhFOHX
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Recently we found an issue in xen 4.1. Under heavy I/O stress such as running 
bonnie++, Dom0 would lost its hard disk with lots of I/O errors. We found 
that some PCI-E devices was using the same vector as SMBus on AMD platforms 
and George' patch set that enables per-device vector map can fix this 
problem.

Following patches have been back ported and tested by Jacob and Wei H.  
Please apply them to Xen 4.1.3 

Thanks,
Wei

23752 xen: Infrastructure to allow irqs to share vector maps
23753 xen: Option to allow per-device vector maps for MSI IRQs
23754 xen: AMD IOMMU: Automatically enable per-device vector maps
23786 x86: Fix up irq vector map logic
23812 xen: Add global irq_vector_map option
23899 AMD-IOMMU: remove dead variable references

--Boundary-00=_4WWqObKYCJhFOHX
Content-Type: text/x-diff; charset="us-ascii"; name="23754.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="23754.diff"
Content-Description: 23754.diff

# HG changeset patch
# User George Dunlap <george.dunlap@eu.citrix.com>
# Date 1311701852 -3600
# Node ID fa4e2ca9ecffbc432b451f495ad0a403644a6be8
# Parent  2e0cf9428554da666616982cd0074024ff85b221
xen: AMD IOMMU: Automatically enable per-device vector maps

Automatically enable per-device vector maps when using IOMMU,
unless disabled specifically by an IOMMU parameter.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>

diff -r e017a9a2f27c xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c	Tue Jul 26 18:37:16 2011 +0100
+++ b/xen/arch/x86/irq.c	Fri Oct 21 15:15:13 2011 -0400
@@ -32,6 +32,7 @@
 unsigned int __read_mostly nr_irqs;
 integer_param("nr_irqs", nr_irqs);
 
+/* This default may be changed by the AMD IOMMU code */
 bool_t __read_mostly opt_irq_perdev_vector_map = 0;
 boolean_param("irq-perdev-vector-map", opt_irq_perdev_vector_map);
 
diff -r e017a9a2f27c xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Tue Jul 26 18:37:16 2011 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Fri Oct 21 15:15:13 2011 -0400
@@ -24,6 +24,9 @@
 #include <asm/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
+
+extern bool_t __read_mostly opt_irq_perdev_vector_map;
+extern bool_t __read_mostly iommu_amd_perdev_vector_map;
 
 extern unsigned short ivrs_bdf_entries;
 extern struct ivrs_mappings *ivrs_mappings;
@@ -164,6 +167,18 @@
     {
         printk("AMD-Vi: Error initialization\n");
         return -ENODEV;
+    }
+
+    /* Enable use of per-device vector map unless otherwise
+     * specified */
+    if ( iommu_amd_perdev_vector_map )
+    {
+        printk("AMD-Vi: Enabling per-device vector maps\n");
+        opt_irq_perdev_vector_map=1;
+    }
+    else
+    {
+        printk("AMD-Vi: WARNING - not enabling per-device vector maps\n");
     }
 
     return scan_pci_devices();
diff -r e017a9a2f27c xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c	Tue Jul 26 18:37:16 2011 +0100
+++ b/xen/drivers/passthrough/iommu.c	Fri Oct 21 15:15:13 2011 -0400
@@ -49,6 +49,7 @@
 bool_t __read_mostly iommu_intremap = 1;
 bool_t __read_mostly iommu_hap_pt_share;
 bool_t __read_mostly amd_iommu_debug;
+bool_t __read_mostly iommu_amd_perdev_vector_map = 1;
 bool_t __read_mostly amd_iommu_perdev_intremap;
 
 static void __init parse_iommu_param(char *s)
@@ -84,6 +85,8 @@
             iommu_dom0_strict = 1;
         else if ( !strcmp(s, "sharept") )
             iommu_hap_pt_share = 1;
+        else if ( !strcmp(s, "no-perdev-vector-map") )
+            iommu_amd_perdev_vector_map = 0;
 
         s = ss + 1;
     } while ( ss );

--Boundary-00=_4WWqObKYCJhFOHX
Content-Type: text/x-diff; charset="us-ascii"; name="23753.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="23753.diff"
Content-Description: 23753.diff

# HG changeset patch
# User George Dunlap <george.dunlap@eu.citrix.com>
# Date 1311701836 -3600
# Node ID 2e0cf9428554da666616982cd0074024ff85b221
# Parent  ef9ed3d2aa870a37ed5e611be9c524d526a2d604
xen: Option to allow per-device vector maps for MSI IRQs

Add a vector-map to pci_dev, and add an option to point MSI-related
IRQs to the vector-map of the device.

This prevents irqs from the same device from being assigned
the same vector on different pcpus.  This is required for systems
using an AMD IOMMU, since the intremap tables on AMD only look at
vector, and not destination ID.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>

diff -r 84b8504a6125 xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c	Tue Jul 26 18:36:58 2011 +0100
+++ b/xen/arch/x86/irq.c	Fri Oct 21 15:12:46 2011 -0400
@@ -31,6 +31,9 @@
 unsigned int __read_mostly nr_irqs_gsi = 16;
 unsigned int __read_mostly nr_irqs;
 integer_param("nr_irqs", nr_irqs);
+
+bool_t __read_mostly opt_irq_perdev_vector_map = 0;
+boolean_param("irq-perdev-vector-map", opt_irq_perdev_vector_map);
 
 u8 __read_mostly *irq_vector;
 struct irq_desc __read_mostly *irq_desc = NULL;
@@ -1560,6 +1563,9 @@
             dprintk(XENLOG_G_ERR, "dom%d: irq %d in use\n",
               d->domain_id, irq);
         desc->handler = &pci_msi_type;
+        if ( opt_irq_perdev_vector_map
+             && !desc->chip_data->used_vectors )
+            desc->chip_data->used_vectors = &pdev->info.used_vectors;
         d->arch.pirq_irq[pirq] = irq;
         d->arch.irq_pirq[irq] = pirq;
         setup_msi_irq(pdev, msi_desc, irq);
diff -r 84b8504a6125 xen/include/xen/pci.h
--- a/xen/include/xen/pci.h	Tue Jul 26 18:36:58 2011 +0100
+++ b/xen/include/xen/pci.h	Fri Oct 21 15:12:46 2011 -0400
@@ -11,6 +11,7 @@
 #include <xen/types.h>
 #include <xen/list.h>
 #include <xen/spinlock.h>
+#include <xen/irq.h>
 
 /*
  * The PCI interface treats multi-function devices as independent
@@ -38,6 +39,7 @@
         u8 bus;
         u8 devfn;
     } physfn;
+   vmask_t used_vectors; 
 };
 
 struct pci_dev {

--Boundary-00=_4WWqObKYCJhFOHX
Content-Type: text/x-diff; charset="us-ascii"; name="23752.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="23752.diff"
Content-Description: 23752.diff

# HG changeset patch
# User George Dunlap <george.dunlap@eu.citrix.com>
# Date 1311701818 -3600
# Node ID ef9ed3d2aa870a37ed5e611be9c524d526a2d604
# Parent  590aadf7c46ae979da3552332f592f9492ce6d8b
xen: Infrastructure to allow irqs to share vector maps

Laying the groundwork for per-device vector maps.  This generic
code allows any irq to point to a vector map; all irqs sharing the
same vector map will avoid sharing vectors.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>

diff -r 590aadf7c46a -r ef9ed3d2aa87 xen/arch/x86/io_apic.c
--- a/xen/arch/x86/io_apic.c	Tue Jul 26 17:00:25 2011 +0100
+++ b/xen/arch/x86/io_apic.c	Tue Jul 26 18:36:58 2011 +0100
@@ -449,6 +449,11 @@
                  irq, vector, smp_processor_id());
 
         __get_cpu_var(vector_irq)[vector] = -1;
+        if ( cfg->used_vectors )
+        {
+            ASSERT(test_bit(vector, cfg->used_vectors));
+            clear_bit(vector, cfg->used_vectors);
+        }
         cfg->move_cleanup_count--;
 unlock:
         spin_unlock(&desc->lock);
diff -r 590aadf7c46a -r ef9ed3d2aa87 xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c	Tue Jul 26 17:00:25 2011 +0100
+++ b/xen/arch/x86/irq.c	Tue Jul 26 18:36:58 2011 +0100
@@ -108,6 +108,8 @@
         per_cpu(vector_irq, cpu)[vector] = irq;
     cfg->vector = vector;
     cfg->cpu_mask = online_mask;
+    if ( cfg->used_vectors )
+        set_bit(vector, cfg->used_vectors);
     irq_status[irq] = IRQ_USED;
     if (IO_APIC_IRQ(irq))
         irq_vector[irq] = vector;
@@ -172,6 +174,7 @@
     desc->depth   = 1;
     desc->msi_desc = NULL;
     desc->handler = &no_irq_type;
+    desc->chip_data->used_vectors=NULL;
     cpus_setall(desc->affinity);
     spin_unlock_irqrestore(&desc->lock, flags);
 
@@ -199,6 +202,9 @@
 
     for_each_cpu_mask(cpu, tmp_mask)
         per_cpu(vector_irq, cpu)[vector] = -1;
+
+    if ( cfg->used_vectors )
+        clear_bit(vector, cfg->used_vectors);
 
     cfg->vector = IRQ_VECTOR_UNASSIGNED;
     cpus_clear(cfg->cpu_mask);
@@ -277,6 +283,7 @@
     cfg->vector = IRQ_VECTOR_UNASSIGNED;
     cpus_clear(cfg->cpu_mask);
     cpus_clear(cfg->old_cpu_mask);
+    cfg->used_vectors = NULL;
 }
 
 int __init init_irq_data(void)
@@ -402,6 +409,10 @@
         if (test_bit(vector, used_vectors))
             goto next;
 
+        if (cfg->used_vectors
+            && test_bit(vector, cfg->used_vectors) )
+            goto next;
+
         for_each_cpu_mask(new_cpu, tmp_mask)
             if (per_cpu(vector_irq, new_cpu)[vector] != -1)
                 goto next;
@@ -417,6 +428,11 @@
             per_cpu(vector_irq, new_cpu)[vector] = irq;
         cfg->vector = vector;
         cpus_copy(cfg->cpu_mask, tmp_mask);
+        if ( cfg->used_vectors )
+        {
+            ASSERT(!test_bit(vector, cfg->used_vectors));
+            set_bit(vector, cfg->used_vectors);
+        }
 
         irq_status[irq] = IRQ_USED;
             if (IO_APIC_IRQ(irq))
diff -r 590aadf7c46a -r ef9ed3d2aa87 xen/include/asm-x86/irq.h
--- a/xen/include/asm-x86/irq.h	Tue Jul 26 17:00:25 2011 +0100
+++ b/xen/include/asm-x86/irq.h	Tue Jul 26 18:36:58 2011 +0100
@@ -24,11 +24,16 @@
 #define irq_to_desc(irq)    (&irq_desc[irq])
 #define irq_cfg(irq)        (&irq_cfg[irq])
 
+typedef struct {
+    DECLARE_BITMAP(_bits,NR_VECTORS);
+} vmask_t;
+
 struct irq_cfg {
         int  vector;
         cpumask_t cpu_mask;
         cpumask_t old_cpu_mask;
         unsigned move_cleanup_count;
+        vmask_t *used_vectors;
         u8 move_in_progress : 1;
 };
 

--Boundary-00=_4WWqObKYCJhFOHX
Content-Type: text/x-diff; charset="us-ascii"; name="23786.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="23786.diff"
Content-Description: 23786.diff

# HG changeset patch
# User George Dunlap <george.dunlap@eu.citrix.com>
# Date 1314026133 -3600
# Node ID 3a05da2dc7c0a5fc0fcfc40c535d1fcb71203625
# Parent  d1cd78a73a79e0e648937322cdb8d92a7f86327a
x86: Fix up irq vector map logic

We need to make sure that cfg->used_vector is only cleared once;
otherwise there may be a race condition that allows the same vector to
be assigned twice, defeating the whole purpose of the map.

This makes two changes:
* __clear_irq_vector() only clears the vector if the irq is not being
moved
* smp_iqr_move_cleanup_interrupt() only clears used_vector if this
is the last place it's being used (move_cleanup_count==0 after
decrement).

Also make use of asserts more consistent, to catch this kind of logic
bug in the future.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>

diff -r d1cd78a73a79 -r 3a05da2dc7c0 xen/arch/x86/io_apic.c
--- a/xen/arch/x86/io_apic.c	Mon Aug 22 16:15:19 2011 +0100
+++ b/xen/arch/x86/io_apic.c	Mon Aug 22 16:15:33 2011 +0100
@@ -485,12 +485,14 @@
                  irq, vector, smp_processor_id());
 
         __get_cpu_var(vector_irq)[vector] = -1;
-        if ( cfg->used_vectors )
+        cfg->move_cleanup_count--;
+
+        if ( cfg->move_cleanup_count == 0 
+             &&  cfg->used_vectors )
         {
             ASSERT(test_bit(vector, cfg->used_vectors));
             clear_bit(vector, cfg->used_vectors);
         }
-        cfg->move_cleanup_count--;
 unlock:
         spin_unlock(&desc->lock);
     }
diff -r d1cd78a73a79 -r 3a05da2dc7c0 xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c	Mon Aug 22 16:15:19 2011 +0100
+++ b/xen/arch/x86/irq.c	Mon Aug 22 16:15:33 2011 +0100
@@ -113,7 +113,10 @@
     cfg->vector = vector;
     cfg->cpu_mask = online_mask;
     if ( cfg->used_vectors )
+    {
+        ASSERT(!test_bit(vector, cfg->used_vectors));
         set_bit(vector, cfg->used_vectors);
+    }
     irq_status[irq] = IRQ_USED;
     if (IO_APIC_IRQ(irq))
         irq_vector[irq] = vector;
@@ -207,15 +210,13 @@
     for_each_cpu_mask(cpu, tmp_mask)
         per_cpu(vector_irq, cpu)[vector] = -1;
 
-    if ( cfg->used_vectors )
-        clear_bit(vector, cfg->used_vectors);
-
     cfg->vector = IRQ_VECTOR_UNASSIGNED;
     cpus_clear(cfg->cpu_mask);
     init_one_irq_status(irq);
 
     if (likely(!cfg->move_in_progress))
         return;
+
     cpus_and(tmp_mask, cfg->old_cpu_mask, cpu_online_map);
     for_each_cpu_mask(cpu, tmp_mask) {
         for (vector = FIRST_DYNAMIC_VECTOR; vector <= LAST_DYNAMIC_VECTOR;
@@ -228,6 +229,12 @@
              break;
         }
      }
+
+    if ( cfg->used_vectors )
+    {
+        ASSERT(test_bit(vector, cfg->used_vectors));
+        clear_bit(vector, cfg->used_vectors);
+    }
 
     cfg->move_in_progress = 0;
 }

--Boundary-00=_4WWqObKYCJhFOHX
Content-Type: text/x-diff; charset="us-ascii"; name="23899.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="23899.diff"
Content-Description: 23899.diff

# HG changeset patch
# User Jan Beulich <jbeulich@suse.com>
# Date 1317730316 -7200
# Node ID a99d75671a911f9c0d5d11e0fe88a0a65863cb44
# Parent  3d1664cc9e458809e399320204aca8536e401ee1
AMD-IOMMU: remove dead variable references

These got orphaned up by recent changes.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>

diff -r 599cf097900b xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Mon Sep 05 15:00:15 2011 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Fri Oct 21 15:39:30 2011 -0400
@@ -24,9 +24,6 @@
 #include <asm/hvm/iommu.h>
 #include <asm/amd-iommu.h>
 #include <asm/hvm/svm/amd-iommu-proto.h>
-
-extern bool_t __read_mostly opt_irq_perdev_vector_map;
-extern bool_t __read_mostly iommu_amd_perdev_vector_map;
 
 extern unsigned short ivrs_bdf_entries;
 extern struct ivrs_mappings *ivrs_mappings;
diff -r 599cf097900b xen/drivers/passthrough/iommu.c
--- a/xen/drivers/passthrough/iommu.c	Mon Sep 05 15:00:15 2011 +0100
+++ b/xen/drivers/passthrough/iommu.c	Fri Oct 21 15:39:30 2011 -0400
@@ -49,7 +49,6 @@
 bool_t __read_mostly iommu_intremap = 1;
 bool_t __read_mostly iommu_hap_pt_share;
 bool_t __read_mostly amd_iommu_debug;
-bool_t __read_mostly iommu_amd_perdev_vector_map = 1;
 bool_t __read_mostly amd_iommu_perdev_intremap;
 
 static void __init parse_iommu_param(char *s)
@@ -85,8 +84,6 @@
             iommu_dom0_strict = 1;
         else if ( !strcmp(s, "sharept") )
             iommu_hap_pt_share = 1;
-        else if ( !strcmp(s, "no-perdev-vector-map") )
-            iommu_amd_perdev_vector_map = 0;
 
         s = ss + 1;
     } while ( ss );

--Boundary-00=_4WWqObKYCJhFOHX
Content-Type: text/x-diff; charset="us-ascii"; name="23812.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="23812.diff"
Content-Description: 23812.diff

# HG changeset patch
# User George Dunlap <george.dunlap@eu.citrix.com>
# Date 1315231215 -3600
# Node ID 32814ad7458dc842a7c588eee13e5c4ee11709a3
# Parent  f1349a968a5ac5577d67ad4a3f3490c580dbe264
xen: Add global irq_vector_map option, set if using AMD global intremap tables

As mentioned in previous changesets, AMD IOMMU interrupt
remapping tables only look at the vector, not the destination
id of an interrupt.  This means that all IRQs going through
the same interrupt remapping table need to *not* share vectors.

The irq "vector map" functionality was originally introduced
after a patch which disabled global AMD IOMMUs entirely.  That
patch has since been reverted, meaning that AMD intremap tables
can either be per-device or global.

This patch therefore introduces a global irq vector map option,
and enables it if we're using an AMD IOMMU with a global
interrupt remapping table.

This patch removes the "irq-perdev-vector-map" boolean
command-line optino and replaces it with "irq_vector_map",
which can have one of three values: none, global, or per-device.

Setting the irq_vector_map to any value will override the
default that the AMD code sets.

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>

diff -r 6fc00d52c179 docs/src/user.tex
--- a/docs/src/user.tex	Mon Aug 22 16:15:33 2011 +0100
+++ b/docs/src/user.tex	Fri Oct 21 15:21:23 2011 -0400
@@ -4197,6 +4197,10 @@
 \item [ vcpu\_migration\_delay=$<$minimum\_time$>$] Set minimum time of 
   vcpu migration in microseconds (default 0). This parameter avoids agressive
   vcpu migration. For example, the linux kernel uses 0.5ms by default.
+\item [ irq_vector_map=xxx ] Enable irq vector non-sharing maps.  Setting 'global' 
+  will ensure that no  IRQs will share vectors.  Setting 'per-device' will ensure 
+  that no IRQs from the same device will share vectors.  Setting to 'none' will
+  disable it entirely, overriding any defaults the IOMMU code may set.
 \end{description}
 
 In addition, the following options may be specified on the Xen command
diff -r 6fc00d52c179 xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c	Mon Aug 22 16:15:33 2011 +0100
+++ b/xen/arch/x86/irq.c	Fri Oct 21 15:21:23 2011 -0400
@@ -24,6 +24,8 @@
 #include <asm/mach-generic/mach_apic.h>
 #include <public/physdev.h>
 
+static void parse_irq_vector_map_param(char *s);
+
 /* opt_noirqbalance: If true, software IRQ balancing/affinity is disabled. */
 bool_t __read_mostly opt_noirqbalance = 0;
 boolean_param("noirqbalance", opt_noirqbalance);
@@ -33,8 +35,10 @@
 integer_param("nr_irqs", nr_irqs);
 
 /* This default may be changed by the AMD IOMMU code */
-bool_t __read_mostly opt_irq_perdev_vector_map = 0;
-boolean_param("irq-perdev-vector-map", opt_irq_perdev_vector_map);
+int __read_mostly opt_irq_vector_map = OPT_IRQ_VECTOR_MAP_DEFAULT;
+custom_param("irq_vector_map", parse_irq_vector_map_param);
+
+vmask_t global_used_vector_map;
 
 u8 __read_mostly *irq_vector;
 struct irq_desc __read_mostly *irq_desc = NULL;
@@ -63,6 +67,26 @@
 /* irq_ratelimit: the max irq rate allowed in every 10ms, set 0 to disable */
 static unsigned int __read_mostly irq_ratelimit_threshold = 10000;
 integer_param("irq_ratelimit", irq_ratelimit_threshold);
+
+static void __init parse_irq_vector_map_param(char *s)
+{
+    char *ss;
+
+    do {
+        ss = strchr(s, ',');
+        if ( ss )
+            *ss = '\0';
+
+        if ( !strcmp(s, "none"))
+            opt_irq_vector_map=OPT_IRQ_VECTOR_MAP_NONE;
+        else if ( !strcmp(s, "global"))
+            opt_irq_vector_map=OPT_IRQ_VECTOR_MAP_GLOBAL;
+        else if ( !strcmp(s, "per-device"))
+            opt_irq_vector_map=OPT_IRQ_VECTOR_MAP_PERDEV;
+
+        s = ss + 1;
+    } while ( ss );
+}
 
 /* Must be called when irq disabled */
 void lock_vector_lock(void)
@@ -348,6 +372,41 @@
     end_none
 };
 
+static vmask_t *irq_get_used_vector_mask(int irq)
+{
+    vmask_t *ret = NULL;
+
+    if ( opt_irq_vector_map == OPT_IRQ_VECTOR_MAP_GLOBAL )
+    {
+        struct irq_desc *desc = irq_to_desc(irq);
+
+        ret = &global_used_vector_map;
+
+        if ( desc->chip_data->used_vectors )
+        {
+            printk(XENLOG_INFO "%s: Strange, unassigned irq %d already has used_vectors!\n",
+                   __func__, irq);
+        }
+        else
+        {
+            int vector;
+            
+            vector = irq_to_vector(irq);
+            if ( vector > 0 )
+            {
+                printk(XENLOG_INFO "%s: Strange, irq %d already assigned vector %d!\n",
+                       __func__, irq, vector);
+                
+                ASSERT(!test_bit(vector, ret));
+
+                set_bit(vector, ret);
+            }
+        }
+    }
+
+    return ret;
+}
+
 int __assign_irq_vector(int irq, struct irq_cfg *cfg, const cpumask_t *mask)
 {
     /*
@@ -366,6 +425,7 @@
     int cpu, err;
     unsigned long flags;
     cpumask_t tmp_mask;
+    vmask_t *irq_used_vectors = NULL;
 
     old_vector = irq_to_vector(irq);
     if (old_vector) {
@@ -380,6 +440,17 @@
         return -EAGAIN;
 
     err = -ENOSPC;
+
+    /* 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 ( irq_status[irq] == IRQ_USED )
+    {
+        irq_used_vectors = cfg->used_vectors;
+    }
+    else
+        irq_used_vectors = irq_get_used_vector_mask(irq);
+
     for_each_cpu_mask(cpu, *mask) {
         int new_cpu;
         int vector, offset;
@@ -405,8 +476,8 @@
         if (test_bit(vector, used_vectors))
             goto next;
 
-        if (cfg->used_vectors
-            && test_bit(vector, cfg->used_vectors) )
+        if (irq_used_vectors
+            && test_bit(vector, irq_used_vectors) )
             goto next;
 
         for_each_cpu_mask(new_cpu, tmp_mask)
@@ -424,15 +495,22 @@
             per_cpu(vector_irq, new_cpu)[vector] = irq;
         cfg->vector = vector;
         cpus_copy(cfg->cpu_mask, tmp_mask);
+
+        irq_status[irq] = IRQ_USED;
+        ASSERT((cfg->used_vectors == NULL)
+               || (cfg->used_vectors == irq_used_vectors));
+        cfg->used_vectors = irq_used_vectors;
+
+        if (IO_APIC_IRQ(irq))
+            irq_vector[irq] = vector;
+
         if ( cfg->used_vectors )
         {
             ASSERT(!test_bit(vector, cfg->used_vectors));
+
             set_bit(vector, cfg->used_vectors);
         }
 
-        irq_status[irq] = IRQ_USED;
-            if (IO_APIC_IRQ(irq))
-                    irq_vector[irq] = vector;
         err = 0;
         local_irq_restore(flags);
         break;
@@ -1521,7 +1599,7 @@
 
     if ( !IS_PRIV(current->domain) &&
          !(IS_PRIV_FOR(current->domain, d) &&
-          irq_access_permitted(current->domain, pirq)))
+           irq_access_permitted(current->domain, pirq)))
         return -EPERM;
 
     if ( pirq < 0 || pirq >= d->nr_pirqs || irq < 0 || irq >= nr_irqs )
@@ -1569,11 +1647,21 @@
 
         if ( desc->handler != &no_irq_type )
             dprintk(XENLOG_G_ERR, "dom%d: irq %d in use\n",
-              d->domain_id, irq);
+                    d->domain_id, irq);
         desc->handler = &pci_msi_type;
-        if ( opt_irq_perdev_vector_map
+        if ( opt_irq_vector_map == OPT_IRQ_VECTOR_MAP_PERDEV
              && !desc->chip_data->used_vectors )
+        {
             desc->chip_data->used_vectors = &pdev->info.used_vectors;
+            if ( desc->chip_data->vector != IRQ_VECTOR_UNASSIGNED )
+            {
+                int vector = desc->chip_data->vector;
+                ASSERT(!test_bit(vector, desc->chip_data->used_vectors));
+
+                set_bit(vector, desc->chip_data->used_vectors);
+            }
+        }
+
         d->arch.pirq_irq[pirq] = irq;
         d->arch.irq_pirq[irq] = pirq;
         setup_msi_irq(pdev, msi_desc, irq);
@@ -1584,9 +1672,12 @@
         d->arch.pirq_irq[pirq] = irq;
         d->arch.irq_pirq[irq] = pirq;
         spin_unlock_irqrestore(&desc->lock, flags);
+
+        if ( opt_irq_vector_map == OPT_IRQ_VECTOR_MAP_PERDEV )
+            printk(XENLOG_INFO "Per-device vector maps for GSIs not implemented yet.\n");
     }
 
- done:
+done:
     return ret;
 }
 
diff -r 6fc00d52c179 xen/drivers/passthrough/amd/pci_amd_iommu.c
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c	Mon Aug 22 16:15:33 2011 +0100
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c	Fri Oct 21 15:21:23 2011 -0400
@@ -169,18 +169,35 @@
         return -ENODEV;
     }
 
-    /* Enable use of per-device vector map unless otherwise
-     * specified */
-    if ( iommu_amd_perdev_vector_map )
+    /*
+     * AMD IOMMUs don't distinguish between vectors destined for
+     * different cpus when doing interrupt remapping.  This means
+     * that interrupts going through the same intremap table
+     * can't share the same vector.
+     *
+     * If irq_vector_map isn't specified, choose a sensible default:
+     * - If we're using per-device interemap tables, per-device
+     *   vector non-sharing maps
+     * - If we're using a global interemap table, global vector
+     *   non-sharing map
+     */
+    if ( opt_irq_vector_map == OPT_IRQ_VECTOR_MAP_DEFAULT )
     {
-        printk("AMD-Vi: Enabling per-device vector maps\n");
-        opt_irq_perdev_vector_map=1;
+        if ( amd_iommu_perdev_intremap )
+        {
+            printk("AMD-Vi: Enabling per-device vector maps\n");
+            opt_irq_vector_map = OPT_IRQ_VECTOR_MAP_PERDEV;
+        }
+        else
+        {
+            printk("AMD-Vi: Enabling global vector map\n");
+            opt_irq_vector_map = OPT_IRQ_VECTOR_MAP_GLOBAL;
+        }
     }
     else
     {
-        printk("AMD-Vi: WARNING - not enabling per-device vector maps\n");
+        printk("AMD-Vi: Not overriding irq_vector_map setting\n");
     }
-
     return scan_pci_devices();
 }
 
diff -r 6fc00d52c179 xen/include/asm-x86/irq.h
--- a/xen/include/asm-x86/irq.h	Mon Aug 22 16:15:33 2011 +0100
+++ b/xen/include/asm-x86/irq.h	Fri Oct 21 15:21:23 2011 -0400
@@ -44,6 +44,13 @@
 extern u8 *irq_vector;
 
 extern bool_t opt_noirqbalance;
+
+#define OPT_IRQ_VECTOR_MAP_DEFAULT 0 /* Do the default thing  */
+#define OPT_IRQ_VECTOR_MAP_NONE    1 /* None */ 
+#define OPT_IRQ_VECTOR_MAP_GLOBAL  2 /* One global vector map (no vector sharing) */ 
+#define OPT_IRQ_VECTOR_MAP_PERDEV  3 /* Per-device vetor map (no vector sharing w/in a device) */
+
+extern int opt_irq_vector_map;
 
 /*
  * Per-cpu current frame pointer - the location of the last exception frame on

--Boundary-00=_4WWqObKYCJhFOHX
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=_4WWqObKYCJhFOHX--


From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:15:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07: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 1RJQkB-0005a9-VS; Thu, 27 Oct 2011 07:15:44 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQax-0003iU-Hp
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:06:12 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319724368!1918464!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14355 invoked from network); 27 Oct 2011 14:06:08 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 14:06:08 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RJQat-000Gkj-Iv; Thu, 27 Oct 2011 14:06:07 +0000
Date: Thu, 27 Oct 2011 15:06:07 +0100
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: <20111027140607.GL59656@ocelot.phlegethon.org>
References: <4EA94A37.7000700@amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EA94A37.7000700@amd.com>
User-Agent: Mutt/1.4.2.1i
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

At 14:10 +0200 on 27 Oct (1319724631), Christoph Egger wrote:
> 
> 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>

This patch appears to advertise PSE36 support to guests without actually
supporting PSE36.  Or am I missing something?

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 Oct 27 07:17:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:17:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQlV-0005y2-Lm; Thu, 27 Oct 2011 07:17:05 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQcV-0003uF-Nv
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:07:48 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319724464!962132!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9846 invoked from network); 27 Oct 2011 14:07:44 -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;
	27 Oct 2011 14:07:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8622053"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 14:07:44 +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, 27 Oct 2011 15:07:44 +0100
Date: Thu, 27 Oct 2011 15:08:02 +0100
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_emul_unplug on xen 4.1, HVM guest 2.6.38
In-Reply-To: <4EA96097.5000603@canonical.com>
Message-ID: <alpine.DEB.2.00.1110271505010.3519@kaball-desktop>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.com>
	<AEAE0D618F71583484DA951D@nimrod.local>
	<1319647412.9436.50.camel@zakaz.uk.xensource.com>
	<4EA91023.5000201@canonical.com>
	<alpine.DEB.2.00.1110271436100.3519@kaball-desktop>
	<4EA96097.5000603@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>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Wilk <konrad.wilk@oracle.com>, Rzeszutek,
	"Konrad@rly45j.srv.mailcontrol.com" <Konrad@rly45j.srv.mailcontrol.com>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 27 Oct 2011, Stefan Bader wrote:
> On 27.10.2011 15:42, Stefano Stabellini wrote:
> > I take we are still talking about PV on HVM guests here.
> > 
> > On Thu, 27 Oct 2011, Stefan Bader wrote:
> >> At least one part is not Ubuntu specific. And that is that the unplug logic
> >> decides to unplug emulated devices based on having the pci and the blkfront
> >> driver *available* (built-in or module). But later on the blkfront driver
> >> ignores all devices that are not *named* in a way to map to the xvd major.
> >> Which leaves you without any usable devices when you named your disk hda in
> >> the config file and you do not prevent unplugging.
> > 
> > If you name your disk hda (as you should), blkfront is going to create
> > /dev/xvda in your guest.
> > It is not ignoring your disk, it just using "xvd" to name the device in
> > the guest.
> > 
> > 
> >> Still I would love to see this unplug handling become a bit more obvious. If
> >> unplug was successful, then blkfront should not ignore the devices. Or maybe
> >> just make the config more what-you-write-is-what-you-get and having hd or sd
> >> there only gives you emulated devices and xvd gives you pv devices.
> > 
> > Yes, if the unplug is unsuccessful blkfront should not ignore the
> > device: it is going to create a /dev/xvd* for you.
> 
> The problem I saw in my test was that in blkfront_probe the following case was
> hit when the device name was hda in the cfg:
> 
>                 if (xen_platform_pci_unplug & XEN_UNPLUG_UNNECESSARY) {
>                         int major;
> 
>                         if (!VDEV_IS_EXTENDED(vdevice))
>                                 major = BLKIF_MAJOR(vdevice);
>                         else
>                                 major = XENVBD_MAJOR;
> 
>                         if (major != XENVBD_MAJOR) {
>                                 printk(KERN_INFO
>                                                 "%s: HVM does not support vbd %d
> as xen block device\n",
>                                                 __FUNCTION__, vdevice);
>                                 return -ENODEV;
>                         }
>                 }
> 
> So major is not XENVBD_MAJOR and the device is ignored.
> 

Why are you passing xen_emul_unplug=unnecessary?
The idea is that if you pass that option you have to use the emulated
path to access your disk unless you esplicitely add an xvd disk to your
config.

In the normal case, if you don't specify xen_emul_unplug, you are going
to get xvda for your hda disk.
Then if you use LABEL or UUID in your root= argument, you don't need to
change any configuration to make it work.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:18:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:18:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQmR-0006LZ-Ss; Thu, 27 Oct 2011 07:18:03 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQdy-0004BW-63
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:09:19 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-2.tower-182.messagelabs.com!1319724555!982911!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29626 invoked from network); 27 Oct 2011 14:09:15 -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;
	27 Oct 2011 14:09:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8622086"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 14:09:13 +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, 27 Oct 2011 15:09:13 +0100
Date: Thu, 27 Oct 2011 15:09:31 +0100
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_emul_unplug on xen 4.1, HVM guest 2.6.38
In-Reply-To: <4EA96131.4090906@canonical.com>
Message-ID: <alpine.DEB.2.00.1110271508310.3519@kaball-desktop>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.com>
	<AEAE0D618F71583484DA951D@nimrod.local>
	<1319647412.9436.50.camel@zakaz.uk.xensource.com>
	<4EA91023.5000201@canonical.com>
	<alpine.DEB.2.00.1110271436100.3519@kaball-desktop>
	<4EA96131.4090906@canonical.com>
User-Agent: Alpine 2.00 (DEB 1167 2008-08-23)
MIME-Version: 1.0
Content-Type: text/plain; charset="US-ASCII"
Cc: "Rzeszutek@rly20j.srv.mailcontrol.com"
	<Rzeszutek@rly20j.srv.mailcontrol.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>, Wilk <konrad.wilk@oracle.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"Konrad@rly45j.srv.mailcontrol.com" <Konrad@rly45j.srv.mailcontrol.com>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 27 Oct 2011, Stefan Bader wrote:
> On 27.10.2011 15:42, Stefano Stabellini wrote:
> > I take we are still talking about PV on HVM guests here.
> > 
> > On Thu, 27 Oct 2011, Stefan Bader wrote:
> >> At least one part is not Ubuntu specific. And that is that the unplug logic
> >> decides to unplug emulated devices based on having the pci and the blkfront
> >> driver *available* (built-in or module). But later on the blkfront driver
> >> ignores all devices that are not *named* in a way to map to the xvd major.
> >> Which leaves you without any usable devices when you named your disk hda in
> >> the config file and you do not prevent unplugging.
> > 
> > If you name your disk hda (as you should), blkfront is going to create
> > /dev/xvda in your guest.
> > It is not ignoring your disk, it just using "xvd" to name the device in
> > the guest.
> > 
> > 
> >> Still I would love to see this unplug handling become a bit more obvious. If
> >> unplug was successful, then blkfront should not ignore the devices. Or maybe
> >> just make the config more what-you-write-is-what-you-get and having hd or sd
> >> there only gives you emulated devices and xvd gives you pv devices.
> > 
> > Yes, if the unplug is unsuccessful blkfront should not ignore the
> > device: it is going to create a /dev/xvd* for you.
> 
> Hm, did you mean unsuccessful? Because then I think it *should* ignore the pv
> disk. If it was successful then it *should not*. Or am I understanding this wrong?

Yes, sorry for the misspell.
If the unplug is successful then it should not ignore the disk.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:18:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:18:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQnH-0006iH-CQ; Thu, 27 Oct 2011 07:18:55 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQfR-0004Qp-6U
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:10:50 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319724634!43389586!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3232 invoked from network); 27 Oct 2011 14:10:34 -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;
	27 Oct 2011 14:10:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8622130"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 14:10:46 +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, 27 Oct 2011 15:10:46 +0100
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Alex Bligh <alex@alex.org.uk>
Date: Thu, 27 Oct 2011 15:10:45 +0100
In-Reply-To: <AA9CBD34E1D59F9039BABF9F@nimrod.local>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<1319723089.9436.124.camel@zakaz.uk.xensource.com>
	<AA9CBD34E1D59F9039BABF9F@nimrod.local>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319724645.9436.130.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-10-27 at 15:04 +0100, Alex Bligh wrote:
> Ian,
> 
> --On 27 October 2011 14:44:49 +0100 Ian Campbell <Ian.Campbell@citrix.com> 
> wrote:
> 
> 
> >> We do not see blktapctrl starting in Xen 4.1.1 dom0, but it does
> >> start in Xen3.
> >
> > Are you changing dom0 kernel as well as hypervisor when you say "3" and
> > "4.1.1" or is the dom0 kernel constant?
> 
> No, the Xen3 kernel is 2.6.18 Centos, and the Xen 4 kernel is 3.0
> Ubuntu Oneiric.

OK, that is important information now that Xen is not supplied with a
particular kernel.

> >>  In fact as far as I can tell the Ubuntu Xen4 package
> >> does not contain blktapctrl at all (which would explain why it doesn't
> >> start). Do we need this?
> >
> > AFAIK tap:aio: usually requires blktap (both kernel side and userspace).
> > There is also a block backend in qemu which can be by xl used under some
> > circumstances when blktap is not available but the same is not true of
> > xend.
> 
> We are using xl (though have tried xend).

Good to know.

> > XCP (from whence that blktap version comes) is only developed/test using
> > 32 bit. Taht's not to say 64 bit doesn't work, but it might not.
> 
> OK. The idea here is a production xen4.1 system, so "might not work"
> sounds like a bad idea :-)
> 
> >> Isn't this what blkback does?
> >
> > blkback can only export raw block devices to guests.
> 
> We will in production use raw block devices, so that's ok. We were
> just using files for testing. Is the same restriction there is
> Xen3.3, because it works there (possibly for the reason below).

The 2.6.18 kernel has blktap.ko and 3.0 does not, which is going to be a
big factor. blkback.ko is in both so you should be ok. For testing you
could try using loopback like Stefano suggests.

> > A raw image can
> > also be mounted with a loop back device which itself can be exported via
> > blkback. Some toolstacks (xend) can do this automatically (but won't for
> > a tap:aio: AFAIK) but xl will not.
> 
> I think xl /must/ be doing this, or it is difficult to explain the
> behaviour below.

Indeed, I can't explain it either. I think I would expect xl to fall
back to the qemu based backend if blktap wasn't available. I _think_
that functionality was backported to the qemu-xen in 4.1, but I'm not
sure.

> We discovered Ubuntu's Xen 4.1 hypervisor package does not contain
> blktapctrl, so we copied that across from a build from source, plus some
> libraries, and did an mknod on /dev/xen/blktap0 (which it appeared to want
> to open). pvdrivers then appeared in the guest. But we then reversed
> everything we'd done (we think), and pvdrivers continued to appear. We are
> reinstalling to find out exactly what it was that changed.
> 
> I must admit to remaining almost totally confused as to how this is
> meant to work, but thanks for your help thus far!
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:19:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:19:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQoD-00075l-5N; Thu, 27 Oct 2011 07:19:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJQgV-0004bT-G2
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:11:55 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-6.tower-216.messagelabs.com!1319724712!1275809!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11302 invoked from network); 27 Oct 2011 14:11:52 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-6.tower-216.messagelabs.com with SMTP;
	27 Oct 2011 14:11:52 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id 6919BC56108;
	Thu, 27 Oct 2011 15:11:50 +0100 (BST)
Date: Thu, 27 Oct 2011 15:11:49 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
Message-ID: <83E58692DD2D4CA6461EEA7A@nimrod.local>
In-Reply-To: <alpine.DEB.2.00.1110271443530.3519@kaball-desktop>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<alpine.DEB.2.00.1110271443530.3519@kaball-desktop>
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>
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 27 October 2011 14:54:48 +0100 Stefano Stabellini 
<stefano.stabellini@eu.citrix.com> wrote:

>>   disk = [ "tap:aio:/tmp/centos-pvd.img,xvda,w" ]
>
> If this is an HVM guest,

It is

> you should use hda here because you want to
> make sure that an emulated IDE disk is created for you as well.

On Xen3.3 (and apparently on Xen 4) this happens anyway

> Also if /tmp/centos-pvd.img is a raw file, you might as well use file:
> rather than tap:aio.

There seems to be some doubt (see Ian's message) about whether this
changes the backend driver that is used. The final deployment application
is tap:aio with a block device, so that's why we're doing this.

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:20:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:20:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQp3-0007So-Vm; Thu, 27 Oct 2011 07:20:46 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJQiE-000538-Nq
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:13:43 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319724786!54537788!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24102 invoked from network); 27 Oct 2011 14:13:06 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-7.tower-27.messagelabs.com with SMTP;
	27 Oct 2011 14:13:06 -0000
Received: from p5b2e2a76.dip.t-dialin.net ([91.46.42.118] helo=[192.168.2.143])
	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 1RJQiA-0003T8-O4; Thu, 27 Oct 2011 14:13:38 +0000
Message-ID: <4EA96711.9000302@canonical.com>
Date: Thu, 27 Oct 2011 16:13:37 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux i686;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.com>
	<AEAE0D618F71583484DA951D@nimrod.local>
	<1319647412.9436.50.camel@zakaz.uk.xensource.com>
	<4EA91023.5000201@canonical.com>
	<alpine.DEB.2.00.1110271436100.3519@kaball-desktop>
	<4EA96097.5000603@canonical.com>
	<alpine.DEB.2.00.1110271505010.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1110271505010.3519@kaball-desktop>
X-Enigmail-Version: 1.4a1pre
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Konrad@rly45j.srv.mailcontrol.com" <Konrad@rly45j.srv.mailcontrol.com>,
	Ian Campbell <Ian.Campbell@citrix.com>, Alex Bligh <alex@alex.org.uk>,
	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 27.10.2011 16:08, Stefano Stabellini wrote:
> On Thu, 27 Oct 2011, Stefan Bader wrote:
>> On 27.10.2011 15:42, Stefano Stabellini wrote:
>>> I take we are still talking about PV on HVM guests here.
>>>
>>> On Thu, 27 Oct 2011, Stefan Bader wrote:
>>>> At least one part is not Ubuntu specific. And that is that the unplug logic
>>>> decides to unplug emulated devices based on having the pci and the blkfront
>>>> driver *available* (built-in or module). But later on the blkfront driver
>>>> ignores all devices that are not *named* in a way to map to the xvd major.
>>>> Which leaves you without any usable devices when you named your disk hda in
>>>> the config file and you do not prevent unplugging.
>>>
>>> If you name your disk hda (as you should), blkfront is going to create
>>> /dev/xvda in your guest.
>>> It is not ignoring your disk, it just using "xvd" to name the device in
>>> the guest.
>>>
>>>
>>>> Still I would love to see this unplug handling become a bit more obvious. If
>>>> unplug was successful, then blkfront should not ignore the devices. Or maybe
>>>> just make the config more what-you-write-is-what-you-get and having hd or sd
>>>> there only gives you emulated devices and xvd gives you pv devices.
>>>
>>> Yes, if the unplug is unsuccessful blkfront should not ignore the
>>> device: it is going to create a /dev/xvd* for you.
>>
>> The problem I saw in my test was that in blkfront_probe the following case was
>> hit when the device name was hda in the cfg:
>>
>>                 if (xen_platform_pci_unplug & XEN_UNPLUG_UNNECESSARY) {
>>                         int major;
>>
>>                         if (!VDEV_IS_EXTENDED(vdevice))
>>                                 major = BLKIF_MAJOR(vdevice);
>>                         else
>>                                 major = XENVBD_MAJOR;
>>
>>                         if (major != XENVBD_MAJOR) {
>>                                 printk(KERN_INFO
>>                                                 "%s: HVM does not support vbd %d
>> as xen block device\n",
>>                                                 __FUNCTION__, vdevice);
>>                                 return -ENODEV;
>>                         }
>>                 }
>>
>> So major is not XENVBD_MAJOR and the device is ignored.
>>
> 
> Why are you passing xen_emul_unplug=unnecessary?
> The idea is that if you pass that option you have to use the emulated
> path to access your disk unless you esplicitely add an xvd disk to your
> config.
> 
> In the normal case, if you don't specify xen_emul_unplug, you are going
> to get xvda for your hda disk.
> Then if you use LABEL or UUID in your root= argument, you don't need to
> change any configuration to make it work.

Because of the above I have to specify the xen_emul_unplug to get *any* device.
If I do not specify anything, then (because pci and pv driver are available) the
emulated disk gets unplugged. Ok. But then the probe does not give me any xvd
because the major does not match.

The only form I could make this work was: use xvda in the config file.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:21:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:21:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQq0-0007pv-74; Thu, 27 Oct 2011 07:21:44 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJQlK-0005s4-4J
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:16:54 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319725011!963887!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10212 invoked from network); 27 Oct 2011 14:16:51 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-11.tower-182.messagelabs.com with SMTP;
	27 Oct 2011 14:16:51 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id 5D409C56108;
	Thu, 27 Oct 2011 15:16:50 +0100 (BST)
Date: Thu, 27 Oct 2011 15:16:48 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
Message-ID: <CAE33F8D9A9E83165D7CB19F@nimrod.local>
In-Reply-To: <1319724645.9436.130.camel@zakaz.uk.xensource.com>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>	
	<1319723089.9436.124.camel@zakaz.uk.xensource.com>	
	<AA9CBD34E1D59F9039BABF9F@nimrod.local>
	<1319724645.9436.130.camel@zakaz.uk.xensource.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>
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 27 October 2011 15:10:45 +0100 Ian Campbell <Ian.Campbell@citrix.com> 
wrote:

>> We will in production use raw block devices, so that's ok. We were
>> just using files for testing. Is the same restriction there is
>> Xen3.3, because it works there (possibly for the reason below).
>
> The 2.6.18 kernel has blktap.ko and 3.0 does not, which is going to be a
> big factor. blkback.ko is in both so you should be ok. For testing you
> could try using loopback like Stefano suggests.

So, with apologies for being dense, what disk line should we be using
to use blkback.ko? I'm assuming this is faster than the qemu based
backend? (i.e. what you think xl may fall back to if blktap is not
available)

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:22:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:22:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQqw-0008DK-L7; Thu, 27 Oct 2011 07:22:42 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQnh-0006rg-Ev
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:19:21 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1319725158!1885218!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20867 invoked from network); 27 Oct 2011 14:19:18 -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;
	27 Oct 2011 14:19:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8622378"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 14:18: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; Thu, 27 Oct 2011 15:18:58 +0100
Date: Thu, 27 Oct 2011 15:19:16 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Alex Bligh <alex@alex.org.uk>
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
In-Reply-To: <83E58692DD2D4CA6461EEA7A@nimrod.local>
Message-ID: <alpine.DEB.2.00.1110271513410.3519@kaball-desktop>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<alpine.DEB.2.00.1110271443530.3519@kaball-desktop>
	<83E58692DD2D4CA6461EEA7A@nimrod.local>
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 Thu, 27 Oct 2011, Alex Bligh wrote:
> > you should use hda here because you want to
> > make sure that an emulated IDE disk is created for you as well.
> 
> On Xen3.3 (and apparently on Xen 4) this happens anyway
> 

Yes, but I wouldn't rely on that: if you specify xvda it means you want
*only* a pv disk. However if you don't have any IDE disks configured,
qemu realizes that you made a mistake in the config and setup one for
you anyway.


> > Also if /tmp/centos-pvd.img is a raw file, you might as well use file:
> > rather than tap:aio.
> 
> There seems to be some doubt (see Ian's message) about whether this
> changes the backend driver that is used. The final deployment application
> is tap:aio with a block device, so that's why we're doing this.
 
If you are using XL, no matter if you specify tap:aio or file:, you are
going to get qemu as disk backend if you are missing blktap.
There is nothing wrong with that, except that qemu in 4.1 doesn't
support linux aio so the performances are not very good. I am not sure
which one is better: blkback on a loop device or qemu without linux aio,
they are both rather slow.

In order to make it fast you can:

- use a dom0 kernel that provides blktap;

- use LVM with blkback;

- use upstream qemu with linux aio as device model and/or block backend.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:24:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:24:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQsD-0000FF-5p; Thu, 27 Oct 2011 07:24:01 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQnk-0006tA-NQ
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:19:25 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-13.tower-21.messagelabs.com!1319725158!1885218!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21120 invoked from network); 27 Oct 2011 14:19:21 -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;
	27 Oct 2011 14:19:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8622391"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 14:19:21 +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, 27 Oct 2011 15:19:20 +0100
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Alex Bligh <alex@alex.org.uk>
Date: Thu, 27 Oct 2011 15:19:20 +0100
In-Reply-To: <CAE33F8D9A9E83165D7CB19F@nimrod.local>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<1319723089.9436.124.camel@zakaz.uk.xensource.com>
	<AA9CBD34E1D59F9039BABF9F@nimrod.local>
	<1319724645.9436.130.camel@zakaz.uk.xensource.com>
	<CAE33F8D9A9E83165D7CB19F@nimrod.local>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319725160.9436.133.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-10-27 at 15:16 +0100, Alex Bligh wrote:
> 
> --On 27 October 2011 15:10:45 +0100 Ian Campbell <Ian.Campbell@citrix.com> 
> wrote:
> 
> >> We will in production use raw block devices, so that's ok. We were
> >> just using files for testing. Is the same restriction there is
> >> Xen3.3, because it works there (possibly for the reason below).
> >
> > The 2.6.18 kernel has blktap.ko and 3.0 does not, which is going to be a
> > big factor. blkback.ko is in both so you should be ok. For testing you
> > could try using loopback like Stefano suggests.
> 
> So, with apologies for being dense, what disk line should we be using
> to use blkback.ko? I'm assuming this is faster than the qemu based
> backend? (i.e. what you think xl may fall back to if blktap is not
> available)

I think just "/dev/something,,hda" (or xvda)

The disk syntax is documented in docs/misc/xl-disk-configuration.txt,
all this stuff with phy: and tap:aoi: prefixes is really legacy for
compatibility with xend, with xend you might have used
"phy:/dev/something...." IIRC.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:25:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:25:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQtJ-0000du-Lu; Thu, 27 Oct 2011 07:25:09 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQqb-00082k-Q2
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:22:22 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1319725315!50472706!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5676 invoked from network); 27 Oct 2011 14:21:55 -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;
	27 Oct 2011 14:21:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8622497"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 14:22: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, 27 Oct 2011 15:22:18 +0100
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Alex Bligh <alex@alex.org.uk>
Date: Thu, 27 Oct 2011 15:22:18 +0100
In-Reply-To: <83E58692DD2D4CA6461EEA7A@nimrod.local>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<alpine.DEB.2.00.1110271443530.3519@kaball-desktop>
	<83E58692DD2D4CA6461EEA7A@nimrod.local>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319725338.9436.134.camel@zakaz.uk.xensource.com>
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 Thu, 2011-10-27 at 15:11 +0100, Alex Bligh wrote:
> 
> --On 27 October 2011 14:54:48 +0100 Stefano Stabellini 
> <stefano.stabellini@eu.citrix.com> wrote:
> 
> >>   disk = [ "tap:aio:/tmp/centos-pvd.img,xvda,w" ]
> >
> > If this is an HVM guest,
> 
> It is
> 
> > you should use hda here because you want to
> > make sure that an emulated IDE disk is created for you as well.
> 
> On Xen3.3 (and apparently on Xen 4) this happens anyway
> 
> > Also if /tmp/centos-pvd.img is a raw file, you might as well use file:
> > rather than tap:aio.
> 
> There seems to be some doubt (see Ian's message) about whether this
> changes the backend driver that is used. The final deployment application
> is tap:aio with a block device, so that's why we're doing this.

tap:aio on a raw block device is not a useful combination.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:27:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:27:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQvD-00013B-FP; Thu, 27 Oct 2011 07:27:08 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQrY-0008Qa-EN
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:23:20 -0700
X-Env-Sender: olaf@aepfle.de
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319725397!339435!1
X-Originating-IP: [81.169.146.161]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9069 invoked from network); 27 Oct 2011 14:23:17 -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; 27 Oct 2011 14:23:17 -0000
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1319725396; l=1623;
	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=Dzy0j4IMrqnysKaDmWPOuAOsjgs=;
	b=rEWy716DgGHIZ2jhhObdPwOczlwnLeeh3UX6CnQp/J/Plt7atlNyz4ro6NnuoFiuysE
	CmHgAEpK6XvNtF1BhjLXuNGbMCjQpgS5sXUj9pOVKjvMcfCQ0AYboECxxRxxnrlG2+GYe
	TAGMFzCxez7mlunUCwbf07oQYC7MSyOzLLU=
X-RZG-AUTH: :P2EQZWCpfu+qG7CngxMFH1J+zrwiavkK6tmQaLfmztM8TOFPjjYQEZvOfA==
X-RZG-CLASS-ID: mo00
Received: from probook.site
	(dslb-088-065-105-221.pools.arcor-ip.net [88.65.105.221])
	by smtp.strato.de (fruni mo1) (RZmta 26.10 AUTH)
	with (EDH-RSA-DES-CBC3-SHA encrypted) ESMTPA id e029c3n9RDv9Al ;
	Thu, 27 Oct 2011 16:22:58 +0200 (MEST)
Received: by probook.site (Postfix, from userid 1000)
	id 8B0ED18637; Thu, 27 Oct 2011 16:22:57 +0200 (CEST)
Date: Thu, 27 Oct 2011 16:22:57 +0200
From: Olaf Hering <olaf@aepfle.de>
To: Tim Deegan <tim@xen.org>
Subject: Re: [Xen-devel] [PATCH 1/2] enable event channel wake-up for
	mem_event interfaces
Message-ID: <20111027142256.GA17751@aepfle.de>
References: <CAAJKtqoPDzEEY7xLQbFyOXrwNhBUJyV274LzRT-=0fPMbYjWkw@mail.gmail.com>
	<20111006110715.GC21091@ocelot.phlegethon.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <20111006110715.GC21091@ocelot.phlegethon.org>
User-Agent: Mutt/1.5.21.rev5535 (2011-07-01)
Cc: xen-devel@lists.xensource.com, Adin Scannell <adin@gridcentric.com>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 06, Tim Deegan wrote:

> At 17:24 -0400 on 28 Sep (1317230698), Adin Scannell wrote:
> > -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. */
> > +        gdprintk(XENLOG_INFO, "mem_event request slots for domain %d: %d\n",
> > +                               d->domain_id, free_requests);
> > +        WARN_ON(1);
> 
> If this is something that might happen on production systems (and is
> basically benign except for the performance), we shouldn't print a full
> WARN().  The printk is more than enough.

While I havent reviewed the whole patch (sorry for that), one thing that
will break is p2m_mem_paging_populate() called from dom0.

If the ring is full, the gfn state was eventually forwarded from
paging-out state to paging-in state. But since the ring was full, no
request was sent to xenpaging which means the gfn remains in
p2m_ram_paging_in_start until the guest eventually tries to access the
gfn as well. Dom0 will call p2m_mem_paging_populate() again and again (I
think), but there will be no attempt to send a new request once the ring
has free slots again, because the gfn is already in the page-in path and
the vcpu does not belong to the guest.

I have some wild ideas how to handle this situation, but the patch as is
will break page-in attempts from xenpaging itself.

Olaf

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:28:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:28:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQwM-0001Qe-ON; Thu, 27 Oct 2011 07:28:18 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQre-0008Sm-97; Thu, 27 Oct 2011 07:23:26 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319725402!1921511!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18936 invoked from network); 27 Oct 2011 14:23:22 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-3.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 14:23:22 -0000
Received: by wyi11 with SMTP id 11so3673143wyi.30
	for <multiple recipients>; Thu, 27 Oct 2011 07:23:22 -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:subject
	:content-type:content-transfer-encoding;
	bh=DrHeaQzFjNxIXc1JXFRV2Vo1hVFAqL01VAN5qgxmqlc=;
	b=LBF8i6xWgrmDdiJVuHhAoXTiwTkkUig468PeZeKJoZXF8Ktl7UTDipdavQLK7RPPr9
	05q5mSaJ2PY5B1mBstqkWrS2JpHMZJgxUeJGgTZpX5JOx1YP+YiPwmSlB3XBuEVUUAfz
	GXdTzZStanjVLdYcwK0aomhU36aEHYgjDQkgw=
Received: by 10.227.199.5 with SMTP id eq5mr16974577wbb.2.1319725402221;
	Thu, 27 Oct 2011 07:23:22 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id b5sm9706190wbh.4.2011.10.27.07.23.20
	(version=SSLv3 cipher=OTHER); Thu, 27 Oct 2011 07:23:21 -0700 (PDT)
Message-ID: <4EA96956.4070300@xen.org>
Date: Thu, 27 Oct 2011 15:23:18 +0100
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>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Cc: 
Subject: [Xen-devel] 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

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.

Dev Docs:
- Made some progress on man pages
- Some discussion on API docs (still an open issue how we will do this : 
tried doxygen)

Wiki:
- A good handle on the pages : what's old, what's important (see 
https://docs.google.com/spreadsheet/ccc?key=0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&hl=en_US#gid=0). 
Still a few pages that need to be classified, but we handled most
- Some Wiki pages were improved

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

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:31:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:31:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJQzn-0002YC-OQ; Thu, 27 Oct 2011 07:31:51 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQuK-0000sz-KK
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:26:12 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319725496!1285709!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25586 invoked from network); 27 Oct 2011 14:24:56 -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;
	27 Oct 2011 14:24:56 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8622573"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 14:24:56 +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, 27 Oct 2011 15:24:56 +0100
Date: Thu, 27 Oct 2011 15:25:14 +0100
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_emul_unplug on xen 4.1, HVM guest 2.6.38
In-Reply-To: <4EA96711.9000302@canonical.com>
Message-ID: <alpine.DEB.2.00.1110271522020.3519@kaball-desktop>
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.com>
	<AEAE0D618F71583484DA951D@nimrod.local>
	<1319647412.9436.50.camel@zakaz.uk.xensource.com>
	<4EA91023.5000201@canonical.com>
	<alpine.DEB.2.00.1110271436100.3519@kaball-desktop>
	<4EA96097.5000603@canonical.com>
	<alpine.DEB.2.00.1110271505010.3519@kaball-desktop>
	<4EA96711.9000302@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>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	Wilk <konrad.wilk@oracle.com>, Rzeszutek,
	"Konrad@rly45j.srv.mailcontrol.com" <Konrad@rly45j.srv.mailcontrol.com>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 27 Oct 2011, Stefan Bader wrote:
> On 27.10.2011 16:08, Stefano Stabellini wrote:
> > On Thu, 27 Oct 2011, Stefan Bader wrote:
> >> On 27.10.2011 15:42, Stefano Stabellini wrote:
> >>> I take we are still talking about PV on HVM guests here.
> >>>
> >>> On Thu, 27 Oct 2011, Stefan Bader wrote:
> >>>> At least one part is not Ubuntu specific. And that is that the unplug logic
> >>>> decides to unplug emulated devices based on having the pci and the blkfront
> >>>> driver *available* (built-in or module). But later on the blkfront driver
> >>>> ignores all devices that are not *named* in a way to map to the xvd major.
> >>>> Which leaves you without any usable devices when you named your disk hda in
> >>>> the config file and you do not prevent unplugging.
> >>>
> >>> If you name your disk hda (as you should), blkfront is going to create
> >>> /dev/xvda in your guest.
> >>> It is not ignoring your disk, it just using "xvd" to name the device in
> >>> the guest.
> >>>
> >>>
> >>>> Still I would love to see this unplug handling become a bit more obvious. If
> >>>> unplug was successful, then blkfront should not ignore the devices. Or maybe
> >>>> just make the config more what-you-write-is-what-you-get and having hd or sd
> >>>> there only gives you emulated devices and xvd gives you pv devices.
> >>>
> >>> Yes, if the unplug is unsuccessful blkfront should not ignore the
> >>> device: it is going to create a /dev/xvd* for you.
> >>
> >> The problem I saw in my test was that in blkfront_probe the following case was
> >> hit when the device name was hda in the cfg:
> >>
> >>                 if (xen_platform_pci_unplug & XEN_UNPLUG_UNNECESSARY) {
> >>                         int major;
> >>
> >>                         if (!VDEV_IS_EXTENDED(vdevice))
> >>                                 major = BLKIF_MAJOR(vdevice);
> >>                         else
> >>                                 major = XENVBD_MAJOR;
> >>
> >>                         if (major != XENVBD_MAJOR) {
> >>                                 printk(KERN_INFO
> >>                                                 "%s: HVM does not support vbd %d
> >> as xen block device\n",
> >>                                                 __FUNCTION__, vdevice);
> >>                                 return -ENODEV;
> >>                         }
> >>                 }
> >>
> >> So major is not XENVBD_MAJOR and the device is ignored.
> >>
> > 
> > Why are you passing xen_emul_unplug=unnecessary?
> > The idea is that if you pass that option you have to use the emulated
> > path to access your disk unless you esplicitely add an xvd disk to your
> > config.
> > 
> > In the normal case, if you don't specify xen_emul_unplug, you are going
> > to get xvda for your hda disk.
> > Then if you use LABEL or UUID in your root= argument, you don't need to
> > change any configuration to make it work.
> 
> Because of the above I have to specify the xen_emul_unplug to get *any* device.

Why?
If you do *not* specify xen_emul_unplug, you should get /dev/xvda
(provided you have blkfront available and hda in your disk config line).


> If I do not specify anything, then (because pci and pv driver are available) the
> emulated disk gets unplugged. Ok. But then the probe does not give me any xvd
> because the major does not match.

that is only because you passed xen_emul_unplug=unnecessary; you
shouldn't do that

> The only form I could make this work was: use xvda in the config file.

you should use hda in the disk config line, and then configure the guest
kernel root= argument with /dev/xvda1 directly or LABEL or UUID
(better).

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:34:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:34:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJR2M-0003eS-Vm; Thu, 27 Oct 2011 07:34:31 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQxh-0001qn-9G
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:29:42 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1319725662!42069244!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5616 invoked from network); 27 Oct 2011 14:27:43 -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;
	27 Oct 2011 14:27:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8622718"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 14:29: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, 27 Oct 2011 15:29:38 +0100
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Thu, 27 Oct 2011 15:29:37 +0100
In-Reply-To: <alpine.DEB.2.00.1110271513410.3519@kaball-desktop>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<alpine.DEB.2.00.1110271443530.3519@kaball-desktop>
	<83E58692DD2D4CA6461EEA7A@nimrod.local>
	<alpine.DEB.2.00.1110271513410.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: <1319725778.9436.135.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	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>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

On Thu, 2011-10-27 at 15:19 +0100, Stefano Stabellini wrote:
> On Thu, 27 Oct 2011, Alex Bligh wrote:
> > > you should use hda here because you want to
> > > make sure that an emulated IDE disk is created for you as well.
> > 
> > On Xen3.3 (and apparently on Xen 4) this happens anyway
> > 
> 
> Yes, but I wouldn't rely on that: if you specify xvda it means you want
> *only* a pv disk. However if you don't have any IDE disks configured,
> qemu realizes that you made a mistake in the config and setup one for
> you anyway.

Specifically _some_ qemu's realize...

> > > Also if /tmp/centos-pvd.img is a raw file, you might as well use file:
> > > rather than tap:aio.
> > 
> > There seems to be some doubt (see Ian's message) about whether this
> > changes the backend driver that is used. The final deployment application
> > is tap:aio with a block device, so that's why we're doing this.
>  
> If you are using XL, no matter if you specify tap:aio or file:, you are
> going to get qemu as disk backend if you are missing blktap.
> There is nothing wrong with that, except that qemu in 4.1 doesn't
> support linux aio so the performances are not very good. I am not sure
> which one is better: blkback on a loop device or qemu without linux aio,
> they are both rather slow.
> 
> In order to make it fast you can:
> 
> - use a dom0 kernel that provides blktap;
> 
> - use LVM with blkback;
> 
> - use upstream qemu with linux aio as device model and/or block backend.

Alex's real deployments use blkback on raw block devices so I think he
is ok.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:35:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:35:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJR3Q-00045d-Bj; Thu, 27 Oct 2011 07:35:36 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJQzY-0002Qn-A7
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:31:36 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-15.tower-27.messagelabs.com!1319725880!52758713!1
X-Originating-IP: [65.55.88.14]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7536 invoked from network); 27 Oct 2011 14:31:21 -0000
Received: from tx2ehsobe004.messaging.microsoft.com (HELO
	TX2EHSOBE007.bigfish.com) (65.55.88.14)
	by server-15.tower-27.messagelabs.com with AES128-SHA encrypted SMTP;
	27 Oct 2011 14:31:21 -0000
Received: from mail190-tx2-R.bigfish.com (10.9.14.237) by
	TX2EHSOBE007.bigfish.com (10.9.40.27) with Microsoft SMTP Server id
	14.1.225.22; Thu, 27 Oct 2011 14:31:24 +0000
Received: from mail190-tx2 (localhost.localdomain [127.0.0.1])	by
	mail190-tx2-R.bigfish.com (Postfix) with ESMTP id 631841340334;
	Thu, 27 Oct 2011 14:31:28 +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
X-FB-SS: 0,
Received: from mail190-tx2 (localhost.localdomain [127.0.0.1]) by mail190-tx2
	(MessageSwitch) id 1319725844618555_10316;
	Thu, 27 Oct 2011 14:30:44 +0000 (UTC)
Received: from TX2EHSMHS032.bigfish.com (unknown [10.9.14.253])	by
	mail190-tx2.bigfish.com (Postfix) with ESMTP id 88001D1804C;
	Thu, 27 Oct 2011 14:30:44 +0000 (UTC)
Received: from ausb3twp02.amd.com (163.181.249.109) by
	TX2EHSMHS032.bigfish.com (10.9.99.132) with Microsoft SMTP Server id
	14.1.225.22; Thu, 27 Oct 2011 14:30:38 +0000
X-WSS-ID: 0LTQAZ7-02-A94-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 2D062C826D;	Thu, 27 Oct 2011 09:30: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, 27 Oct 2011 09:30:59 -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, 27 Oct 2011 09:30:44 -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; Thu, 27 Oct 2011
	10:30:41 -0400
Message-ID: <4EA96B0F.4070607@amd.com>
Date: Thu, 27 Oct 2011 16:30:39 +0200
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] xen: provide pse36 cpuid bit
References: <4EA94A37.7000700@amd.com>
	<20111027140607.GL59656@ocelot.phlegethon.org>
In-Reply-To: <20111027140607.GL59656@ocelot.phlegethon.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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 16:06, Tim Deegan wrote:
> At 14:10 +0200 on 27 Oct (1319724631), Christoph Egger wrote:
>>
>> 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>
>
> This patch appears to advertise PSE36 support to guests without actually
> supporting PSE36.  Or am I missing something?

That's right. The paging format differs only in 32bit legacy mode.
Since Hyper-V is not running in 32bit legacy mode but insists on having
these cpuid bits present it is sufficient to just populate them to the
guest when guest paging mode != 32bit legacy mode.

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 Oct 27 07:38:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:38:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJR6W-0004W4-6m; Thu, 27 Oct 2011 07:38:48 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJR63-0004K1-Pm
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:38:20 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-11.tower-27.messagelabs.com!1319726285!43394061!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27417 invoked from network); 27 Oct 2011 14:38:05 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-11.tower-27.messagelabs.com with SMTP;
	27 Oct 2011 14:38:05 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id B7D69C56109;
	Thu, 27 Oct 2011 15:38:14 +0100 (BST)
Date: Thu, 27 Oct 2011 15:38:13 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
Message-ID: <9BF0369A4E41B84EBCAADE54@nimrod.local>
In-Reply-To: <alpine.DEB.2.00.1110271513410.3519@kaball-desktop>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<alpine.DEB.2.00.1110271443530.3519@kaball-desktop>
	<83E58692DD2D4CA6461EEA7A@nimrod.local>
	<alpine.DEB.2.00.1110271513410.3519@kaball-desktop>
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>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
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 27 October 2011 15:19:16 +0100 Stefano Stabellini 
<stefano.stabellini@eu.citrix.com> wrote:

>> There seems to be some doubt (see Ian's message) about whether this
>> changes the backend driver that is used. The final deployment application
>> is tap:aio with a block device, so that's why we're doing this.
>
> If you are using XL, no matter if you specify tap:aio or file:, you are
> going to get qemu as disk backend if you are missing blktap.
> There is nothing wrong with that, except that qemu in 4.1 doesn't
> support linux aio so the performances are not very good. I am not sure
> which one is better: blkback on a loop device or qemu without linux aio,
> they are both rather slow.

I'm not sure I understand that. blkback on a loop device implies we
can just use blkback on a real device. We are using a real device
anyway in production (the file is just for testing).

So, should we be using tap:aio:/dev/... for a block device for
speed?

> In order to make it fast you can:
>
> - use a dom0 kernel that provides blktap;
>
> - use LVM with blkback;
>
> - use upstream qemu with linux aio as device model and/or block backend.

I /think/ you mean only if we are using a file, so that shouldn't
be relevant. Correct?

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:44:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07: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 1RJRBg-0005BZ-R5; Thu, 27 Oct 2011 07:44:08 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRBD-0004yY-IE
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:43:39 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319726614!1288570!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25551 invoked from network); 27 Oct 2011 14:43:34 -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; 27 Oct 2011 14:43:34 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RJRB7-000Gu5-A3; Thu, 27 Oct 2011 14:43:33 +0000
Date: Thu, 27 Oct 2011 15:43:33 +0100
From: Tim Deegan <tim@xen.org>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] [PATCH 5 of 9] Fine-grained concurrency control
	structure for the p2m
Message-ID: <20111027144333.GM59656@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<a23e1262b1240dcabfa0.1319690030@xdev.gridcentric.ca>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <a23e1262b1240dcabfa0.1319690030@xdev.gridcentric.ca>
User-Agent: Mutt/1.4.2.1i
Cc: andres@gridcentric.ca, xen-devel@lists.xensource.com, olaf@aepfle.de,
	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 00:33 -0400 on 27 Oct (1319675630), Andres Lagar-Cavilla wrote:
> Introduce a fine-grained concurrency control structure for the p2m. This
> 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 are
> put in place.
> 
> Note the patch creates backwards-compatible shortcuts that will lock the
> 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.

- 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. 

- panic() on out-of-memory is pretty rude. 

But stepping back, I'm not sure that we need all this just yet.  I think
it would be worth doing the interface changes with a single p2m lock and
measuring how bad it is before getting stuck in to fine-grained locking
(fun though it might be).

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.

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 range.
> + * 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. 

Tim.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:47:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:47:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJREz-0005gD-Ao; Thu, 27 Oct 2011 07:47:33 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJRES-0005Ts-Ga
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:47:00 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1319726817!1297604!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1095 invoked from network); 27 Oct 2011 14:46:57 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-5.tower-216.messagelabs.com with SMTP;
	27 Oct 2011 14:46:57 -0000
Received: from p5b2e2a76.dip.t-dialin.net ([91.46.42.118] helo=[192.168.2.143])
	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 1RJREO-00050H-JH; Thu, 27 Oct 2011 14:46:56 +0000
Message-ID: <4EA96EDF.1020107@canonical.com>
Date: Thu, 27 Oct 2011 16:46:55 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux i686;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] xen_emul_unplug on xen 4.1, HVM guest 2.6.38
References: <0050AA2F452257584F0AAA0B@nimrod.local>
	<20111026134942.GB31609@phenom.dumpdata.com>
	<20111026141233.GJ12984@reaktio.net>
	<F1E068D49F012116597572D1@nimrod.local>
	<1319641004.9436.35.camel@zakaz.uk.xensource.com>
	<AEAE0D618F71583484DA951D@nimrod.local>
	<1319647412.9436.50.camel@zakaz.uk.xensource.com>
	<4EA91023.5000201@canonical.com>
	<alpine.DEB.2.00.1110271436100.3519@kaball-desktop>
	<4EA96097.5000603@canonical.com>
	<alpine.DEB.2.00.1110271505010.3519@kaball-desktop>
	<4EA96711.9000302@canonical.com>
	<alpine.DEB.2.00.1110271522020.3519@kaball-desktop>
In-Reply-To: <alpine.DEB.2.00.1110271522020.3519@kaball-desktop>
X-Enigmail-Version: 1.4a1pre
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Ian Campbell <Ian.Campbell@citrix.com>, Alex Bligh <alex@alex.org.uk>,
	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 27.10.2011 16:25, Stefano Stabellini wrote:
> On Thu, 27 Oct 2011, Stefan Bader wrote:
>> On 27.10.2011 16:08, Stefano Stabellini wrote:
>>> On Thu, 27 Oct 2011, Stefan Bader wrote:
>>>> On 27.10.2011 15:42, Stefano Stabellini wrote:
>>>>> I take we are still talking about PV on HVM guests here.
>>>>>
>>>>> On Thu, 27 Oct 2011, Stefan Bader wrote:
>>>>>> At least one part is not Ubuntu specific. And that is that the unplug logic
>>>>>> decides to unplug emulated devices based on having the pci and the blkfront
>>>>>> driver *available* (built-in or module). But later on the blkfront driver
>>>>>> ignores all devices that are not *named* in a way to map to the xvd major.
>>>>>> Which leaves you without any usable devices when you named your disk hda in
>>>>>> the config file and you do not prevent unplugging.
>>>>>
>>>>> If you name your disk hda (as you should), blkfront is going to create
>>>>> /dev/xvda in your guest.
>>>>> It is not ignoring your disk, it just using "xvd" to name the device in
>>>>> the guest.
>>>>>
>>>>>
>>>>>> Still I would love to see this unplug handling become a bit more obvious. If
>>>>>> unplug was successful, then blkfront should not ignore the devices. Or maybe
>>>>>> just make the config more what-you-write-is-what-you-get and having hd or sd
>>>>>> there only gives you emulated devices and xvd gives you pv devices.
>>>>>
>>>>> Yes, if the unplug is unsuccessful blkfront should not ignore the
>>>>> device: it is going to create a /dev/xvd* for you.
>>>>
>>>> The problem I saw in my test was that in blkfront_probe the following case was
>>>> hit when the device name was hda in the cfg:
>>>>
>>>>                 if (xen_platform_pci_unplug & XEN_UNPLUG_UNNECESSARY) {
>>>>                         int major;
>>>>
>>>>                         if (!VDEV_IS_EXTENDED(vdevice))
>>>>                                 major = BLKIF_MAJOR(vdevice);
>>>>                         else
>>>>                                 major = XENVBD_MAJOR;
>>>>
>>>>                         if (major != XENVBD_MAJOR) {
>>>>                                 printk(KERN_INFO
>>>>                                                 "%s: HVM does not support vbd %d
>>>> as xen block device\n",
>>>>                                                 __FUNCTION__, vdevice);
>>>>                                 return -ENODEV;
>>>>                         }
>>>>                 }
>>>>
>>>> So major is not XENVBD_MAJOR and the device is ignored.
>>>>
>>>
>>> Why are you passing xen_emul_unplug=unnecessary?
>>> The idea is that if you pass that option you have to use the emulated
>>> path to access your disk unless you esplicitely add an xvd disk to your
>>> config.
>>> (and force the blkfront to get loaded but that is some other patches missing
>>> In the normal case, if you don't specify xen_emul_unplug, you are going
>>> to get xvda for your hda disk.
>>> Then if you use LABEL or UUID in your root= argument, you don't need to
>>> change any configuration to make it work.
>>
>> Because of the above I have to specify the xen_emul_unplug to get *any* device.
> 
> Why?
> If you do *not* specify xen_emul_unplug, you should get /dev/xvda
> (provided you have blkfront available and hda in your disk config line).
> 
Ah! Sorry, yes. I think I remember now how my confusion started. While trying to
find the lost interrupt problem for the network devices I had two of them
configured (8139cp and e1000) and during those tests there was no way I was able
to get any xvd device. But that was because for some reason with both NICs the
pci device would fail to get an IRQ, so xenbus was never started.

Removing the second NIC made the pci device work, but then with allowing unplug,
there was still some problem with the pv nic not working. So I probably ended up
with the unnecessary, and when the disk finally worked when defined as xvda, and
I was already too confused by other things to realize that that segment only
applies for the unecessary case. :/

> 
>> If I do not specify anything, then (because pci and pv driver are available) the
>> emulated disk gets unplugged. Ok. But then the probe does not give me any xvd
>> because the major does not match.
> 
> that is only because you passed xen_emul_unplug=unnecessary; you
> shouldn't do that
> 
>> The only form I could make this work was: use xvda in the config file.
> 
> you should use hda in the disk config line, and then configure the guest
> kernel root= argument with /dev/xvda1 directly or LABEL or UUID
> (better).


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:52:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:52:15 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRJX-0006Eh-DN; Thu, 27 Oct 2011 07:52:15 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRIx-000624-OH
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:51:40 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319727096!975849!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8816 invoked from network); 27 Oct 2011 14:51:36 -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;
	27 Oct 2011 14:51:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8623300"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 14:51: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; Thu, 27 Oct 2011 15:51:36 +0100
Date: Thu, 27 Oct 2011 15:51:54 +0100
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
X-X-Sender: sstabellini@kaball-desktop
To: Alex Bligh <alex@alex.org.uk>
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
In-Reply-To: <9BF0369A4E41B84EBCAADE54@nimrod.local>
Message-ID: <alpine.DEB.2.00.1110271550080.3519@kaball-desktop>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<alpine.DEB.2.00.1110271443530.3519@kaball-desktop>
	<83E58692DD2D4CA6461EEA7A@nimrod.local>
	<alpine.DEB.2.00.1110271513410.3519@kaball-desktop>
	<9BF0369A4E41B84EBCAADE54@nimrod.local>
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 Thu, 27 Oct 2011, Alex Bligh wrote:
> --On 27 October 2011 15:19:16 +0100 Stefano Stabellini 
> <stefano.stabellini@eu.citrix.com> wrote:
> 
> >> There seems to be some doubt (see Ian's message) about whether this
> >> changes the backend driver that is used. The final deployment application
> >> is tap:aio with a block device, so that's why we're doing this.
> >
> > If you are using XL, no matter if you specify tap:aio or file:, you are
> > going to get qemu as disk backend if you are missing blktap.
> > There is nothing wrong with that, except that qemu in 4.1 doesn't
> > support linux aio so the performances are not very good. I am not sure
> > which one is better: blkback on a loop device or qemu without linux aio,
> > they are both rather slow.
> 
> I'm not sure I understand that. blkback on a loop device implies we
> can just use blkback on a real device. We are using a real device
> anyway in production (the file is just for testing).

Ahh, sorry, I missed that you are using real devices in production.


> So, should we be using tap:aio:/dev/... for a block device for
> speed?

You should use phy:/dev/whatever.
At this point I suggest you setup loop devices for testing to be
coherent.


> > In order to make it fast you can:
> >
> > - use a dom0 kernel that provides blktap;
> >
> > - use LVM with blkback;
> >
> > - use upstream qemu with linux aio as device model and/or block backend.
> 
> I /think/ you mean only if we are using a file, so that shouldn't
> be relevant. Correct?

Correct.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:55:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:55:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRMp-0006ee-Lq; Thu, 27 Oct 2011 07:55:39 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRMK-0006Sy-0S
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:55:08 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1319727304!30551318!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28494 invoked from network); 27 Oct 2011 14:55:04 -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;
	27 Oct 2011 14:55:04 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8623392"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 14:55: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;
	Thu, 27 Oct 2011 15:55:04 +0100
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Alex Bligh <alex@alex.org.uk>
Date: Thu, 27 Oct 2011 15:55:04 +0100
In-Reply-To: <9BF0369A4E41B84EBCAADE54@nimrod.local>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<alpine.DEB.2.00.1110271443530.3519@kaball-desktop>
	<83E58692DD2D4CA6461EEA7A@nimrod.local>
	<alpine.DEB.2.00.1110271513410.3519@kaball-desktop>
	<9BF0369A4E41B84EBCAADE54@nimrod.local>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319727304.9436.141.camel@zakaz.uk.xensource.com>
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 Thu, 2011-10-27 at 15:38 +0100, Alex Bligh wrote:
> 
> --On 27 October 2011 15:19:16 +0100 Stefano Stabellini 
> <stefano.stabellini@eu.citrix.com> wrote:
> 
> >> There seems to be some doubt (see Ian's message) about whether this
> >> changes the backend driver that is used. The final deployment application
> >> is tap:aio with a block device, so that's why we're doing this.
> >
> > If you are using XL, no matter if you specify tap:aio or file:, you are
> > going to get qemu as disk backend if you are missing blktap.
> > There is nothing wrong with that, except that qemu in 4.1 doesn't
> > support linux aio so the performances are not very good. I am not sure
> > which one is better: blkback on a loop device or qemu without linux aio,
> > they are both rather slow.
> 
> I'm not sure I understand that. blkback on a loop device implies we
> can just use blkback on a real device. We are using a real device
> anyway in production (the file is just for testing).
> 
> So, should we be using tap:aio:/dev/... for a block device for
> speed?

tap:aio does not have a speed advantage -- in fact quite the opposite.
tap: gives you the flexibility to use non-raw block devices and
structured disk image types but is nothing like as fast as using a raw
block device with blkback.

The aio: part is an internal implementation detail of the tap: stuff
which should never have been exposed to the user.

Ian.

> 
> > In order to make it fast you can:
> >
> > - use a dom0 kernel that provides blktap;
> >
> > - use LVM with blkback;
> >
> > - use upstream qemu with linux aio as device model and/or block backend.
> 
> I /think/ you mean only if we are using a file, so that shouldn't
> be relevant. Correct?
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 07:58:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 07:58:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRPi-00078a-8X; Thu, 27 Oct 2011 07:58:38 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJROO-0006sI-Cf
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:57:16 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-7.tower-174.messagelabs.com!1319727433!36892728!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7606 invoked from network); 27 Oct 2011 14:57:13 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-7.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 14:57:13 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RJROJ-000GxW-Jg; Thu, 27 Oct 2011 14:57:11 +0000
Date: Thu, 27 Oct 2011 15:57:11 +0100
From: Tim Deegan <tim@xen.org>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
Subject: Re: [Xen-devel] [PATCH 8 of 9] Modify all internal p2m functions to
	use the new fine-grained locking
Message-ID: <20111027145711.GN59656@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<471d4f2754d6516d5926.1319690033@xdev.gridcentric.ca>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <471d4f2754d6516d5926.1319690033@xdev.gridcentric.ca>
User-Agent: Mutt/1.4.2.1i
Cc: andres@gridcentric.ca, xen-devel@lists.xensource.com, olaf@aepfle.de,
	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 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-callers
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. 

> 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 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. 

> +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 p2m 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 = 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. :)

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 Thu Oct 27 08:03:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:03:33 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRUS-0007a9-Cz; Thu, 27 Oct 2011 08:03:32 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJROl-0006wg-F2
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:57:40 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-14.tower-27.messagelabs.com!1319727341!42074030!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18126 invoked from network); 27 Oct 2011 14:55:41 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-14.tower-27.messagelabs.com with SMTP;
	27 Oct 2011 14:55:41 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id DDC98C56108;
	Thu, 27 Oct 2011 15:57:35 +0100 (BST)
Date: Thu, 27 Oct 2011 15:57:33 +0100
From: Alex Bligh <alex@alex.org.uk>
To: xen-devel@lists.xensource.com
Message-ID: <30C4B98DD463F3E19F28AA88@nimrod.local>
In-Reply-To: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.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: Alex Bligh <alex@alex.org.uk>
Subject: [Xen-devel] Re: PV drivers on HVM using Xen 4.1.1
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 27 October 2011 13:56:41 +0100 Alex Bligh <alex@alex.org.uk> wrote:

> I think I've found one reason why we can't get PV block drivers on HVM
> domUs working on Xen 4.1.1 - whether we use a pvops or a xenlinux
> domU kernel.
>
> We are using a line like:
>
>   disk = [ "tap:aio:/tmp/centos-pvd.img,xvda,w" ]
>
> We are using effectively a standard 3.0 kernel. Config options including
> the word XEN are below.
>
> We do not see blktapctrl starting in Xen 4.1.1 dom0, but it does
> start in Xen3.

The magic incantation to fix this here was:
	modprobe xen_gntdev
which for some reason is not modprobed in the startup script (Ubuntu
one anyway).

We now see pv block devices on hvm.

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:07:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:07:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRYO-00081D-Qw; Thu, 27 Oct 2011 08:07:36 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRQy-0007Ie-Nc
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:00:21 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319727593!30868599!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19885 invoked from network); 27 Oct 2011 14:59:53 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-9.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 14:59:53 -0000
Received: by wyi11 with SMTP id 11so3727026wyi.30
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 07:59:53 -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=DrE4R/GotDoZjQXWW932oi8x9Xeqa5IOmLOLKHQ4j/I=;
	b=vRpTrnYRxwtqq3TUmIlSLqlCUmXoIWLbB68gsxvrWZEfmnAGJ0hWx+CQ0UxhPtgKTN
	AHDEuDVQLY0p+OYjaH4D4Vw/plx8PqQS3UHeXsf9ZWJf9a5lVbO7FvpSo9/ydh6/JGF2
	AQb+fNEDvusqXU7wabtaY7LiZf6S8mJo+nBLQ=
Received: by 10.227.199.5 with SMTP id eq5mr17170405wbb.2.1319727593186;
	Thu, 27 Oct 2011 07:59:53 -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 fi11sm9882986wbb.9.2011.10.27.07.59.49
	(version=SSLv3 cipher=OTHER); Thu, 27 Oct 2011 07:59:52 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 27 Oct 2011 15:59:45 +0100
Subject: Re: [Xen-devel] [PATCH] xen: provide pse36 cpuid bit
From: Keir Fraser <keir.xen@gmail.com>
To: Christoph Egger <Christoph.Egger@amd.com>,
	Tim Deegan <tim@xen.org>
Message-ID: <CACF3071.23CF7%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] [PATCH] xen: provide pse36 cpuid bit
Thread-Index: AcyUuRBJcVlURk1PvkKhP/tpyrx99g==
In-Reply-To: <4EA96B0F.4070607@amd.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 27/10/2011 15:30, "Christoph Egger" <Christoph.Egger@amd.com> wrote:

> On 10/27/11 16:06, Tim Deegan wrote:
>> At 14:10 +0200 on 27 Oct (1319724631), Christoph Egger wrote:
>>> 
>>> 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>
>> 
>> This patch appears to advertise PSE36 support to guests without actually
>> supporting PSE36.  Or am I missing something?
> 
> That's right. The paging format differs only in 32bit legacy mode.
> Since Hyper-V is not running in 32bit legacy mode but insists on having
> these cpuid bits present it is sufficient to just populate them to the
> guest when guest paging mode != 32bit legacy mode.

It would be nice if we didn't have to toggle CPUID.PSE36 based on current
guest mode. How hard would it be to pull out bits 35..32 of a physical
address from bits 16..13 of a legacy 32-bit PDE whose PS flag = 1?

I'm actually surprised we don't do it already, it's so trivial! The code
explicitly says we don't though, and for a reason that makes no sense to
me...

 -- Keir

> Christoph
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:12:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:12:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRd6-000073-RE; Thu, 27 Oct 2011 08:12:29 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJRSK-0007MQ-Bc
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:01:25 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-5.tower-216.messagelabs.com!1319727676!1299807!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16816 invoked from network); 27 Oct 2011 15:01:16 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-5.tower-216.messagelabs.com with SMTP;
	27 Oct 2011 15:01:16 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id BA995C56108;
	Thu, 27 Oct 2011 16:01:15 +0100 (BST)
Date: Thu, 27 Oct 2011 16:01:13 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
Message-ID: <4C9805914A32F7BA80157F42@nimrod.local>
In-Reply-To: <alpine.DEB.2.00.1110271550080.3519@kaball-desktop>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<alpine.DEB.2.00.1110271443530.3519@kaball-desktop>
	<83E58692DD2D4CA6461EEA7A@nimrod.local>
	<alpine.DEB.2.00.1110271513410.3519@kaball-desktop>
	<9BF0369A4E41B84EBCAADE54@nimrod.local>
	<alpine.DEB.2.00.1110271550080.3519@kaball-desktop>
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>,
	Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>
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

Stefano,

--On 27 October 2011 15:51:54 +0100 Stefano Stabellini 
<stefano.stabellini@eu.citrix.com> wrote:

>> So, should we be using tap:aio:/dev/... for a block device for
>> speed?
>
> You should use phy:/dev/whatever.
> At this point I suggest you setup loop devices for testing to be
> coherent.

Thanks. As per my last message, it looks like we have discovered
the fundamental cause of the PV drivers not appearing (at least
for xenlinux domUs).

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:16:08 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:16:08 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRgd-0000kL-OA; Thu, 27 Oct 2011 08:16:07 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRT9-0007TW-6f
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:02:24 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319727727!984942!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23573 invoked from network); 27 Oct 2011 15:02:07 -0000
Received: from ocelot.phlegethon.org (HELO mail.phlegethon.org) (81.29.64.94)
	by server-7.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 15:02:07 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RJRT5-000GzF-9G; Thu, 27 Oct 2011 15:02:07 +0000
Date: Thu, 27 Oct 2011 16:02:07 +0100
From: Tim Deegan <tim@xen.org>
To: Andres Lagar-Cavilla <andres@lagarcavilla.org>
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: <20111027150207.GO59656@ocelot.phlegethon.org>
References: <patchbomb.1319690025@xdev.gridcentric.ca>
	<d13f91c2fe18d58ad27f.1319690034@xdev.gridcentric.ca>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <d13f91c2fe18d58ad27f.1319690034@xdev.gridcentric.ca>
User-Agent: Mutt/1.4.2.1i
Cc: andres@gridcentric.ca, xen-devel@lists.xensource.com, olaf@aepfle.de,
	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 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 would
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 Thu Oct 27 08:21:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:21:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRmA-0001yL-15; Thu, 27 Oct 2011 08:21:50 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRZQ-0008ET-NW
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:08:42 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1319728089!41671235!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11664 invoked from network); 27 Oct 2011 15:08:10 -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; 27 Oct 2011 15:08:10 -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
	p9RF8Y1S010606
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 15:08:34 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
	p9RF8XZh000156
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 15:08:33 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
	p9RF8R6K018435; Thu, 27 Oct 2011 10:08:27 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 27 Oct 2011 08:08:27 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 8A07882C2E; Thu, 27 Oct 2011 11:08:26 -0400 (EDT)
Date: Thu, 27 Oct 2011 11:08:26 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Miche Baker-Harvey <miche@google.com>
Message-ID: <20111027150826.GC1157@phenom.dumpdata.com>
References: <20111027053007.GA32765@phenom.dumpdata.com>
	<20111027054806.GA1377@suse.de>
	<CAB8Rdaq2r4Uc-WZK-k=wiEW8DKdixn+9dB7E4_XDL7k8jCMwSw@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAB8Rdaq2r4Uc-WZK-k=wiEW8DKdixn+9dB7E4_XDL7k8jCMwSw@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.4EA973F3.0077:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, Greg KH <gregkh@suse.de>,
	linux-kernel@vger.kernel.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 Thu, Oct 27, 2011 at 07:45:07AM -0700, Miche Baker-Harvey wrote:
> Bummer.  Sorry about that.
> 
> Konrad, could you give me a hand figuring out what's up with this - I'm not
> running Zen here.  (If there's a test suite I could have run, mea culpa, and
> please point me in the right direction.)

I kind of run the nightly build/test rinse & repeat cycle using this:

git://xenbits.xen.org/xentesttools/bootstrap.git

But it might be just easier for you to install Fedora Core 16, do
'yum install xen', reboot, make sure you can boot Xen, and then build
a 3.2 kernel with your patch + debug stuff.

> 
> The "console [hvc0] enabled" message is coming from register_console() in
> printk.c, and it doesn't have any loops.
> It's called from hvc_console_init(), hvc_instantiate(), and hvc_alloc(),
> none of which have loops.  The call in hvc_alloc() is the one I added, so
> either I've inadvertently made one of the other two repeat (I'm guestting
> hvc_instantiate() is the one you're using), or you're infinitely calling
> hvc_alloc().  There's a calls to hvc_alloc() in hvc_xen.c::xen_hvc_init(),
> and in init_port_console() in virtio_console.c, but again, no loops.
>  Similarly for hvc_instantiate().
> 
> So, could I trouble you to put a breakpoint in register_console() and send
> me the stack?

A dump_stack() should suffice I presume? Yeah let me do that.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:23:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:23:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRoC-0002Mo-Bz; Thu, 27 Oct 2011 08:23:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJRa4-0008Fx-CL
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:09:21 -0700
X-Env-Sender: stefan.bader@canonical.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1319728157!987521!1
X-Originating-IP: [91.189.89.112]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12405 invoked from network); 27 Oct 2011 15:09:17 -0000
Received: from youngberry.canonical.com (HELO youngberry.canonical.com)
	(91.189.89.112) by server-5.tower-182.messagelabs.com with SMTP;
	27 Oct 2011 15:09:17 -0000
Received: from p5b2e2a76.dip.t-dialin.net ([91.46.42.118] helo=[192.168.2.143])
	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 1RJRa1-000674-1k; Thu, 27 Oct 2011 15:09:17 +0000
Message-ID: <4EA9741C.7020702@canonical.com>
Date: Thu, 27 Oct 2011 17:09:16 +0200
From: Stefan Bader <stefan.bader@canonical.com>
User-Agent: Mozilla/5.0 (X11; Linux i686;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: Alex Bligh <alex@alex.org.uk>
Subject: Re: [Xen-devel] Re: PV drivers on HVM using Xen 4.1.1
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<30C4B98DD463F3E19F28AA88@nimrod.local>
In-Reply-To: <30C4B98DD463F3E19F28AA88@nimrod.local>
X-Enigmail-Version: 1.4a1pre
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 27.10.2011 16:57, Alex Bligh wrote:
> 
> 
> --On 27 October 2011 13:56:41 +0100 Alex Bligh <alex@alex.org.uk> wrote:
> 
>> I think I've found one reason why we can't get PV block drivers on HVM
>> domUs working on Xen 4.1.1 - whether we use a pvops or a xenlinux
>> domU kernel.
>>
>> We are using a line like:
>>
>>   disk = [ "tap:aio:/tmp/centos-pvd.img,xvda,w" ]
>>
>> We are using effectively a standard 3.0 kernel. Config options including
>> the word XEN are below.
>>
>> We do not see blktapctrl starting in Xen 4.1.1 dom0, but it does
>> start in Xen3.
> 
> The magic incantation to fix this here was:
>     modprobe xen_gntdev
> which for some reason is not modprobed in the startup script (Ubuntu
> one anyway).
> 
> We now see pv block devices on hvm.
> 
Hm, you mean in dom0? Strangely I do not have this loaded and still get pv disks
on hvm...

-Stefan

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:25:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08: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 1RJRpy-0002mt-PD; Thu, 27 Oct 2011 08:25:46 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRda-0000AF-Ax
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:12:59 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1319728373!978621!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31351 invoked from network); 27 Oct 2011 15:12:55 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-16.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 15:12:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315195200"; d="scan'208";a="168449173"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 11:12: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; Thu, 27 Oct 2011 11:12:53 -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 p9RFCoPp022879;	Thu, 27 Oct 2011 08:12:51 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 27 Oct 2011 16:12:32 +0100
Message-ID: <1319728357-18112-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>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 0/5] hvmloader/DSDT change to handle PCI hotplug
	with QEMU upstream
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 introduces some change in the DSDT ACPI table generated to
handle the PCI hotplug in qemu-xen. There is now options to ./mk_dsdt, instead
of compiling it for each DSDT table we want.

There is more to read in the 4th patch about want is not supported with the new
QEMU.

Anthony PERARD (5):
  hvmloader/acpi: Introduce --maxcpu option to mk_dsdt
  hvmloader/acpi/dsdt: Move IO port range reservation
  hvmloader: In mk_dsdt, Use __attribute__ format.
  hvmloader/acpi/dsdt: Fix PCI hotplug with the new qemu-xen.
  hvmloader: Load DSDT table from parametter

 .hgignore                               |    2 +
 tools/firmware/hvmloader/acpi/Makefile  |   22 ++-
 tools/firmware/hvmloader/acpi/acpi2_0.h |    9 +-
 tools/firmware/hvmloader/acpi/build.c   |   31 ++---
 tools/firmware/hvmloader/acpi/dsdt.asl  |   14 --
 tools/firmware/hvmloader/acpi/mk_dsdt.c |  226 +++++++++++++++++++++++--------
 tools/firmware/hvmloader/rombios.c      |   12 ++-
 tools/firmware/hvmloader/seabios.c      |   12 ++-
 8 files changed, 228 insertions(+), 100 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 Thu Oct 27 08:26:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:26:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRqx-0003AY-Nb; Thu, 27 Oct 2011 08:26:47 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRdb-0000AJ-2E
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:12:59 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-16.tower-182.messagelabs.com!1319728373!978621!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31433 invoked from network); 27 Oct 2011 15:12:55 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-16.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 15:12:55 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315195200"; d="scan'208";a="168449177"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 11:12:53 -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; Thu, 27 Oct 2011 11:12: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 p9RFCoPq022879;	Thu, 27 Oct 2011 08:12:52 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 27 Oct 2011 16:12:33 +0100
Message-ID: <1319728357-18112-2-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319728357-18112-1-git-send-email-anthony.perard@citrix.com>
References: <1319728357-18112-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 1/5] hvmloader/acpi: Introduce --maxcpu option
	to mk_dsdt
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 this new option, there is no need to compile mk_dsdt for each DSDT table
that we want.  The Makefile is a bit reorganize to handle this new option and
to prepare more change in a coming patch.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 .hgignore                               |    2 +
 tools/firmware/hvmloader/acpi/Makefile  |   16 +++++++++-----
 tools/firmware/hvmloader/acpi/mk_dsdt.c |   34 +++++++++++++++++++++++++++++-
 3 files changed, 44 insertions(+), 8 deletions(-)

diff --git a/.hgignore b/.hgignore
index 9d4f864..9c286f4 100644
--- a/.hgignore
+++ b/.hgignore
@@ -140,7 +140,9 @@
 ^tools/firmware/etherboot/ipxe\.git/.*$
 ^tools/firmware/extboot/extboot.img$
 ^tools/firmware/extboot/signrom$
+^tools/firmware/hvmloader/acpi/mk_dsdt$
 ^tools/firmware/hvmloader/acpi/dsdt.*\.c$
+^tools/firmware/hvmloader/acpi/dsdt_.*\.asl$
 ^tools/firmware/hvmloader/acpi/ssdt_.*\.h$
 ^tools/firmware/hvmloader/hvmloader$
 ^tools/firmware/hvmloader/roms\.inc$
diff --git a/tools/firmware/hvmloader/acpi/Makefile b/tools/firmware/hvmloader/acpi/Makefile
index d32e055..7746a1c 100644
--- a/tools/firmware/hvmloader/acpi/Makefile
+++ b/tools/firmware/hvmloader/acpi/Makefile
@@ -31,15 +31,19 @@ ssdt_pm.h ssdt_tpm.h: %.h: %.asl iasl
 	sed -e 's/AmlCode/$*/g' $*.hex >$@
 	rm -f $*.hex $*.aml
 
+mk_dsdt: mk_dsdt.c
+	$(HOSTCC) $(HOSTCFLAGS) $(CFLAGS_xeninclude) -o $@ mk_dsdt.c
+
 # NB. awk invocation is a portable alternative to 'head -n -1'
-dsdt_15cpu.c dsdt_anycpu.c: %.c: dsdt.asl mk_dsdt.c iasl
-	$(HOSTCC) $(HOSTCFLAGS) $(CFLAGS_xeninclude) -o mk_$* mk_dsdt.c
-	awk 'NR > 1 {print s} {s=$$0}' $< >$*.asl
-	./mk_$* >>$*.asl
+dsdt_%cpu.asl: dsdt.asl mk_dsdt
+	awk 'NR > 1 {print s} {s=$$0}' $< > $@
+	./mk_dsdt --maxcpu $*  >> $@
+
+$(filter dsdt_%.c,$(C_SRC)): %.c: iasl %.asl
 	iasl -vs -p $* -tc $*.asl
 	sed -e 's/AmlCode/$*/g' $*.hex >$@
 	echo "int $*_len=sizeof($*);" >>$@
-	rm -f $*.hex $*.aml $*.asl mk_$*
+	rm -f $*.aml $*.hex
 
 iasl:
 	@echo
@@ -56,7 +60,7 @@ acpi.a: $(OBJS)
 
 clean:
 	rm -rf *.a *.o $(IASL_VER) $(IASL_VER).tar.gz $(DEPS)
-	rm -rf ssdt_*.h dsdt*.c *~ *.aml *.hex mk_dsdt mk_dsdt15 dsdt_*cpu.asl
+	rm -rf ssdt_*.h dsdt*.c *~ *.aml *.hex mk_dsdt dsdt_*.asl
 
 install: all
 
diff --git a/tools/firmware/hvmloader/acpi/mk_dsdt.c b/tools/firmware/hvmloader/acpi/mk_dsdt.c
index f97da50..ab8a4fb 100644
--- a/tools/firmware/hvmloader/acpi/mk_dsdt.c
+++ b/tools/firmware/hvmloader/acpi/mk_dsdt.c
@@ -1,6 +1,9 @@
 #include <stdio.h>
 #include <stdarg.h>
 #include <stdint.h>
+#include <string.h>
+#include <getopt.h>
+#include <stdlib.h>
 #include <xen/hvm/hvm_info_table.h>
 
 static unsigned int indent_level;
@@ -71,12 +74,39 @@ static void decision_tree(
     pop_block();
 }
 
+static struct option options[] = {
+    { "maxcpu", 1, 0, 'c' },
+    { 0, 0, 0, 0 }
+};
+
 int main(int argc, char **argv)
 {
     unsigned int slot, dev, intx, link, cpu, max_cpus = HVM_MAX_VCPUS;
 
-    /* Extract optional maximum-cpu specification from invocation name. */
-    sscanf(argv[0], "%*[^0-9]%u", &max_cpus); /* e.g., ./mk_dsdt15 */
+    while (1) {
+        int opt = getopt_long(argc, argv, "", options, NULL);
+        if (opt == -1)
+            break;
+
+        switch (opt) {
+        case 'c': {
+            long i = 0;
+            char *endptr;
+
+            i = strtol(optarg, &endptr, 10);
+            if (*optarg != '\0' && *endptr == '\0' && i >= 0) {
+                max_cpus = i;
+            } else if (!(strcmp(optarg, "any") == 0)){
+                fprintf(stderr, "`%s' is not a number or is bellow 0.\n", optarg);
+                return -1;
+            }
+            break;
+        }
+        default:
+            fprintf(stderr, "options not supported.\n");
+            return -1;
+        }
+    }
 
     /**** DSDT DefinitionBlock start ****/
     /* (we append to existing DSDT definition block) */
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:27:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:27:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRrn-0003Xq-Si; Thu, 27 Oct 2011 08:27:39 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRdd-0000AY-7a
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:13:01 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319728378!1279778!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3954 invoked from network); 27 Oct 2011 15:12:58 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 15:12:58 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8623867"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 15:12: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; Thu, 27 Oct 2011 16:12:57 +0100
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
	1RJRdZ-0006AK-Aa; Thu, 27 Oct 2011 15:12:57 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJRdZ-0004fm-9o;
	Thu, 27 Oct 2011 16:12:57 +0100
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: <20137.29945.290531.658615@mariner.uk.xensource.com>
Date: Thu, 27 Oct 2011 16:12:57 +0100
To: Jim Fehlig <jfehlig@suse.com>
Subject: Re: [Xen-devel] Prevent vif-bridge from adding user-created tap
	interfaces to a bridge
Newsgroups: chiark.mail.xen.devel
In-Reply-To: <4EA7396D.30103@suse.com>
References: <4EA7396D.30103@suse.com>
X-Mailer: VM 8.1.0 under 23.2.1 (i486-pc-linux-gnu)
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

Jim Fehlig writes ("[Xen-devel] Prevent vif-bridge from adding user-created tap interfaces to a bridge"):
> 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.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:28:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:28:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRsk-0003vO-8b; Thu, 27 Oct 2011 08:28:38 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRdb-0000AM-Le
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:13:00 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319728375!981461!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16467 invoked from network); 27 Oct 2011 15:12:56 -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;
	27 Oct 2011 15:12:56 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315195200"; d="scan'208";a="18594731"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 11:12: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; Thu, 27 Oct 2011 11:12:55 -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 p9RFCoPr022879;	Thu, 27 Oct 2011 08:12:53 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 27 Oct 2011 16:12:34 +0100
Message-ID: <1319728357-18112-3-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319728357-18112-1-git-send-email-anthony.perard@citrix.com>
References: <1319728357-18112-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 2/5] hvmloader/acpi/dsdt: Move IO port range
	reservation
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 move the IO port range reservation from the dsdt.asl to mk_dsdt.
This IO port range need to be generated by mk_dsdt, because qemu-xen use
different port. The IO port for qemu-xen will be added in a later patch.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/firmware/hvmloader/acpi/dsdt.asl  |   14 --------------
 tools/firmware/hvmloader/acpi/mk_dsdt.c |   14 ++++++++++++++
 2 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/tools/firmware/hvmloader/acpi/dsdt.asl b/tools/firmware/hvmloader/acpi/dsdt.asl
index 1bcee86..0549d7b 100644
--- a/tools/firmware/hvmloader/acpi/dsdt.asl
+++ b/tools/firmware/hvmloader/acpi/dsdt.asl
@@ -100,20 +100,6 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, "Xen", "HVM", 0)
            Name (_ADR, 0x00)
            Name (_BBN, 0x00)
 
-           /*
-            * Reserve the IO port ranges [0x10c0, 0x1101] and [0xb044, 0xb047].
-            * Or else, for a hotplugged-in device, the port IO BAR assigned
-            * by guest OS may conflict with the ranges here.
-            */
-           Device(HP0)
-           {
-               Name(_HID, EISAID("PNP0C02"))
-               Name(_CRS, ResourceTemplate() {
-                   IO (Decode16, 0x10c0, 0x10c0, 0x00, 0x82)
-                   IO (Decode16, 0xb044, 0xb044, 0x00, 0x04)
-               })
-           }
-
            /* Make cirrues VGA S3 suspend/resume work in Windows XP/2003 */
            Device (VGA)
            {
diff --git a/tools/firmware/hvmloader/acpi/mk_dsdt.c b/tools/firmware/hvmloader/acpi/mk_dsdt.c
index ab8a4fb..8cab7ba 100644
--- a/tools/firmware/hvmloader/acpi/mk_dsdt.c
+++ b/tools/firmware/hvmloader/acpi/mk_dsdt.c
@@ -210,6 +210,20 @@ int main(int argc, char **argv)
     /**** PCI0 start ****/
     push_block("Scope", "\\_SB.PCI0");
 
+    /*
+     * Reserve the IO port ranges [0x10c0, 0x1101] and [0xb044, 0xb047].
+     * Or else, for a hotplugged-in device, the port IO BAR assigned
+     * by guest OS may conflict with the ranges here.
+     */
+    push_block("Device", "HP0"); {
+        stmt("Name", "_HID, EISAID(\"PNP0C02\")");
+        stmt("Name", "_CRS, ResourceTemplate() {"
+             "  IO (Decode16, 0x10c0, 0x10c0, 0x00, 0x82)"
+             "  IO (Decode16, 0xb044, 0xb044, 0x00, 0x04)"
+             "}");
+    } pop_block();
+
+
     /*** PCI-ISA link definitions ***/
     /* BUFA: List of ISA IRQs available for linking to PCI INTx. */
     stmt("Name", "BUFA, ResourceTemplate() { "
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:29:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:29:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRte-0004J2-AG; Thu, 27 Oct 2011 08:29:34 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRdd-0000AZ-8n
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:13:03 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319728375!981461!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16525 invoked from network); 27 Oct 2011 15:12:57 -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;
	27 Oct 2011 15:12:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315195200"; d="scan'208";a="18594732"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 11:12: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; Thu, 27 Oct 2011 11:12:57 -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 p9RFCoPt022879;	Thu, 27 Oct 2011 08:12:56 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 27 Oct 2011 16:12:36 +0100
Message-ID: <1319728357-18112-5-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319728357-18112-1-git-send-email-anthony.perard@citrix.com>
References: <1319728357-18112-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 4/5] hvmloader/acpi/dsdt: Fix PCI hotplug with
	the new qemu-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

The ACPI PIIX4 device in QEMU upstream as not the same behavior to handle PCI
hotplug. This patch introduce the necessary change to the DSDT ACPI table to
behave as expceted by the new QEMU.

To switch to this new DSDT table version, there is a new option --dm-version to
mk_dsdt.

Change are inspired by SeaBIOS DSDT source code.

There is few things missing with the new QEMU:
  - QEMU provide the plugged/unplugged status only per slot (and not per func
    like qemu-xen-traditionnal.
  - I did not include the _STA ACPI method that give the status of a device
    (present, functionning properly) because qemu-xen does not handle it.
  - I did not include the _RMV method that say if the device can be removed,
    because the IO port of QEMU that give this status always return true. In
    SeaBIOS table, they have a specific _RMV method for VGA, ISA that return
    false. But I'm not sure that we can do the same in Xen.

So, the only way to remove a device is from outside of the guest (like with xl
pci-detatch), and can not be initiated from inside.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/firmware/hvmloader/acpi/Makefile  |    6 +-
 tools/firmware/hvmloader/acpi/mk_dsdt.c |  183 +++++++++++++++++++++----------
 2 files changed, 128 insertions(+), 61 deletions(-)

diff --git a/tools/firmware/hvmloader/acpi/Makefile b/tools/firmware/hvmloader/acpi/Makefile
index 7746a1c..c602b56 100644
--- a/tools/firmware/hvmloader/acpi/Makefile
+++ b/tools/firmware/hvmloader/acpi/Makefile
@@ -18,7 +18,7 @@
 XEN_ROOT = $(CURDIR)/../../../..
 include $(XEN_ROOT)/tools/firmware/Rules.mk
 
-C_SRC = build.c dsdt_anycpu.c dsdt_15cpu.c static_tables.c
+C_SRC = build.c dsdt_anycpu.c dsdt_15cpu.c static_tables.c dsdt_anycpu_qemu_xen.c
 OBJS  = $(patsubst %.c,%.o,$(C_SRC))
 
 CFLAGS += $(CFLAGS_xeninclude)
@@ -34,6 +34,10 @@ ssdt_pm.h ssdt_tpm.h: %.h: %.asl iasl
 mk_dsdt: mk_dsdt.c
 	$(HOSTCC) $(HOSTCFLAGS) $(CFLAGS_xeninclude) -o $@ mk_dsdt.c
 
+dsdt_anycpu_qemu_xen.asl: dsdt.asl mk_dsdt
+	awk 'NR > 1 {print s} {s=$$0}' $< > $@
+	./mk_dsdt --dm-version qemu-xen >> $@
+
 # NB. awk invocation is a portable alternative to 'head -n -1'
 dsdt_%cpu.asl: dsdt.asl mk_dsdt
 	awk 'NR > 1 {print s} {s=$$0}' $< > $@
diff --git a/tools/firmware/hvmloader/acpi/mk_dsdt.c b/tools/firmware/hvmloader/acpi/mk_dsdt.c
index c80a888..48011c3 100644
--- a/tools/firmware/hvmloader/acpi/mk_dsdt.c
+++ b/tools/firmware/hvmloader/acpi/mk_dsdt.c
@@ -8,6 +8,11 @@
 
 static unsigned int indent_level;
 
+typedef enum dm_version {
+    QEMU_XEN_TRADITIONAL,
+    QEMU_XEN,
+} dm_version;
+
 static void indent(void)
 {
     unsigned int i;
@@ -77,12 +82,14 @@ static void decision_tree(
 
 static struct option options[] = {
     { "maxcpu", 1, 0, 'c' },
+    { "dm-version", 1, 0, 'q' },
     { 0, 0, 0, 0 }
 };
 
 int main(int argc, char **argv)
 {
     unsigned int slot, dev, intx, link, cpu, max_cpus = HVM_MAX_VCPUS;
+    dm_version dm_version = QEMU_XEN_TRADITIONAL;
 
     while (1) {
         int opt = getopt_long(argc, argv, "", options, NULL);
@@ -103,8 +110,17 @@ int main(int argc, char **argv)
             }
             break;
         }
+        case 'q':
+            if (strcmp(optarg, "qemu-xen") == 0) {
+                dm_version = QEMU_XEN;
+            } else if (strcmp(optarg, "qemu-xen-traditional") == 0) {
+                dm_version = QEMU_XEN_TRADITIONAL;
+            } else {
+                fprintf(stderr, "Unknown device model version `%s'.\n", optarg);
+                return -1;
+            }
+            break;
         default:
-            fprintf(stderr, "options not supported.\n");
             return -1;
         }
     }
@@ -218,10 +234,17 @@ int main(int argc, char **argv)
      */
     push_block("Device", "HP0"); {
         stmt("Name", "_HID, EISAID(\"PNP0C02\")");
-        stmt("Name", "_CRS, ResourceTemplate() {"
-             "  IO (Decode16, 0x10c0, 0x10c0, 0x00, 0x82)"
-             "  IO (Decode16, 0xb044, 0xb044, 0x00, 0x04)"
-             "}");
+        if (dm_version == QEMU_XEN_TRADITIONAL) {
+            stmt("Name", "_CRS, ResourceTemplate() {"
+                 "  IO (Decode16, 0x10c0, 0x10c0, 0x00, 0x82)"
+                 "  IO (Decode16, 0xb044, 0xb044, 0x00, 0x04)"
+                 "}");
+        } else {
+            stmt("Name", "_CRS, ResourceTemplate() {"
+                 "  IO (Decode16, 0xae00, 0xae00, 0x00, 0x10)"
+                 "  IO (Decode16, 0xb044, 0xb044, 0x00, 0x04)"
+                 "}");
+        }
     } pop_block();
 
 
@@ -309,37 +332,56 @@ int main(int argc, char **argv)
      * QEMU provides a simple hotplug controller with some I/O to handle
      * the hotplug action and status, which is beyond the ACPI scope.
      */
-    for ( slot = 0; slot < 0x100; slot++ )
-    {
-        push_block("Device", "S%02X", slot);
-        /* _ADR == dev:fn (16:16) */
-        stmt("Name", "_ADR, 0x%08x", ((slot & ~7) << 13) | (slot & 7));
-        /* _SUN == dev */
-        stmt("Name", "_SUN, 0x%08x", slot >> 3);
-        push_block("Method", "_PS0, 0");
-        stmt("Store", "0x%02x, \\_GPE.DPT1", slot);
-        stmt("Store", "0x80, \\_GPE.DPT2");
-        pop_block();
-        push_block("Method", "_PS3, 0");
-        stmt("Store", "0x%02x, \\_GPE.DPT1", slot);
-        stmt("Store", "0x83, \\_GPE.DPT2");
-        pop_block();
-        push_block("Method", "_EJ0, 1");
-        stmt("Store", "0x%02x, \\_GPE.DPT1", slot);
-        stmt("Store", "0x88, \\_GPE.DPT2");
-        stmt("Store", "0x%02x, \\_GPE.PH%02X", /* eject */
-             (slot & 1) ? 0x10 : 0x01, slot & ~1);
-        pop_block();
-        push_block("Method", "_STA, 0");
-        stmt("Store", "0x%02x, \\_GPE.DPT1", slot);
-        stmt("Store", "0x89, \\_GPE.DPT2");
-        if ( slot & 1 )
-            stmt("ShiftRight", "0x4, \\_GPE.PH%02X, Local1", slot & ~1);
-        else
-            stmt("And", "\\_GPE.PH%02X, 0x0f, Local1", slot & ~1);
-        stmt("Return", "Local1"); /* IN status as the _STA */
-        pop_block();
+    if (dm_version == QEMU_XEN_TRADITIONAL) {
+        for ( slot = 0; slot < 0x100; slot++ )
+        {
+            push_block("Device", "S%02X", slot);
+            /* _ADR == dev:fn (16:16) */
+            stmt("Name", "_ADR, 0x%08x", ((slot & ~7) << 13) | (slot & 7));
+            /* _SUN == dev */
+            stmt("Name", "_SUN, 0x%08x", slot >> 3);
+            push_block("Method", "_PS0, 0");
+            stmt("Store", "0x%02x, \\_GPE.DPT1", slot);
+            stmt("Store", "0x80, \\_GPE.DPT2");
+            pop_block();
+            push_block("Method", "_PS3, 0");
+            stmt("Store", "0x%02x, \\_GPE.DPT1", slot);
+            stmt("Store", "0x83, \\_GPE.DPT2");
+            pop_block();
+            push_block("Method", "_EJ0, 1");
+            stmt("Store", "0x%02x, \\_GPE.DPT1", slot);
+            stmt("Store", "0x88, \\_GPE.DPT2");
+            stmt("Store", "0x%02x, \\_GPE.PH%02X", /* eject */
+                 (slot & 1) ? 0x10 : 0x01, slot & ~1);
+            pop_block();
+            push_block("Method", "_STA, 0");
+            stmt("Store", "0x%02x, \\_GPE.DPT1", slot);
+            stmt("Store", "0x89, \\_GPE.DPT2");
+            if ( slot & 1 )
+                stmt("ShiftRight", "0x4, \\_GPE.PH%02X, Local1", slot & ~1);
+            else
+                stmt("And", "\\_GPE.PH%02X, 0x0f, Local1", slot & ~1);
+            stmt("Return", "Local1"); /* IN status as the _STA */
+            pop_block();
+            pop_block();
+        }
+    } else {
+        stmt("OperationRegion", "SEJ, SystemIO, 0xae08, 0x04");
+        push_block("Field", "SEJ, DWordAcc, NoLock, WriteAsZeros");
+        indent(); printf("B0EJ, 32,\n");
         pop_block();
+
+        /* hotplug_slot */
+        for (slot = 1; slot <= 31; slot++) {
+            push_block("Device", "S%i", slot); {
+                stmt("Name", "_ADR, %#06x0000", slot);
+                push_block("Method", "_EJ0,1"); {
+                    stmt("Store", "ShiftLeft(1, %#06x), B0EJ", slot);
+                    stmt("Return", "0x0");
+                } pop_block();
+                stmt("Name", "_SUN, %i", slot);
+            } pop_block();
+        }
     }
 
     pop_block();
@@ -349,18 +391,26 @@ int main(int argc, char **argv)
     /**** GPE start ****/
     push_block("Scope", "\\_GPE");
 
-    stmt("OperationRegion", "PHP, SystemIO, 0x10c0, 0x82");
-
-    push_block("Field", "PHP, ByteAcc, NoLock, Preserve");
-    indent(); printf("PSTA, 8,\n"); /* hotplug controller event reg */
-    indent(); printf("PSTB, 8,\n"); /* hotplug controller slot reg */
-    for ( slot = 0; slot < 0x100; slot += 2 )
-    {
-        indent();
-        /* Each hotplug control register manages a pair of pci functions. */
-        printf("PH%02X, 8,\n", slot);
+    if (dm_version == QEMU_XEN_TRADITIONAL) {
+        stmt("OperationRegion", "PHP, SystemIO, 0x10c0, 0x82");
+
+        push_block("Field", "PHP, ByteAcc, NoLock, Preserve");
+        indent(); printf("PSTA, 8,\n"); /* hotplug controller event reg */
+        indent(); printf("PSTB, 8,\n"); /* hotplug controller slot reg */
+        for ( slot = 0; slot < 0x100; slot += 2 )
+        {
+            indent();
+            /* Each hotplug control register manages a pair of pci functions. */
+            printf("PH%02X, 8,\n", slot);
+        }
+        pop_block();
+    } else {
+        stmt("OperationRegion", "PCST, SystemIO, 0xae00, 0x08");
+        push_block("Field", "PCST, DWordAcc, NoLock, WriteAsZeros");
+        indent(); printf("PCIU, 32,\n");
+        indent(); printf("PCID, 32,\n");
+        pop_block();
     }
-    pop_block();
 
     stmt("OperationRegion", "DG1, SystemIO, 0xb044, 0x04");
 
@@ -368,20 +418,33 @@ int main(int argc, char **argv)
     indent(); printf("DPT1, 8, DPT2, 8\n");
     pop_block();
 
-    push_block("Method", "_L03, 0, Serialized");
-    /* Detect slot and event (remove/add). */
-    stmt("Name", "SLT, 0x0");
-    stmt("Name", "EVT, 0x0");
-    stmt("Store", "PSTA, Local1");
-    stmt("And", "Local1, 0xf, EVT");
-    stmt("Store", "PSTB, Local1"); /* XXX: Store (PSTB, SLT) ? */
-    stmt("And", "Local1, 0xff, SLT");
-    /* Debug */
-    stmt("Store", "SLT, DPT1");
-    stmt("Store", "EVT, DPT2");
-    /* Decision tree */
-    decision_tree(0x00, 0x100, "SLT", pci_hotplug_notify);
-    pop_block();
+    if (dm_version == QEMU_XEN_TRADITIONAL) {
+        push_block("Method", "_L03, 0, Serialized");
+        /* Detect slot and event (remove/add). */
+        stmt("Name", "SLT, 0x0");
+        stmt("Name", "EVT, 0x0");
+        stmt("Store", "PSTA, Local1");
+        stmt("And", "Local1, 0xf, EVT");
+        stmt("Store", "PSTB, Local1"); /* XXX: Store (PSTB, SLT) ? */
+        stmt("And", "Local1, 0xff, SLT");
+        /* Debug */
+        stmt("Store", "SLT, DPT1");
+        stmt("Store", "EVT, DPT2");
+        /* Decision tree */
+        decision_tree(0x00, 0x100, "SLT", pci_hotplug_notify);
+        pop_block();
+    } else {
+        push_block("Method", "_L01");
+        for (slot = 1; slot <= 31; slot++) {
+            push_block("If", "And(PCIU, ShiftLeft(1, %i))", slot);
+            stmt("Notify", "\\_SB.PCI0.S%i, 1", slot);
+            pop_block();
+            push_block("If", "And(PCID, ShiftLeft(1, %i))", slot);
+            stmt("Notify", "\\_SB.PCI0.S%i, 3", slot);
+            pop_block();
+        }
+        pop_block();
+    }
 
     pop_block();
     /**** GPE end ****/
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:30:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:30:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRuU-0004gI-Lf; Thu, 27 Oct 2011 08:30:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRde-0000Ae-9D
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:13:03 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-9.tower-182.messagelabs.com!1319728375!981461!3
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16577 invoked from network); 27 Oct 2011 15:12:58 -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;
	27 Oct 2011 15:12:58 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315195200"; d="scan'208";a="18594733"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 11:12:58 -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; Thu, 27 Oct 2011 11:12: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 p9RFCoPu022879;	Thu, 27 Oct 2011 08:12:57 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 27 Oct 2011 16:12:37 +0100
Message-ID: <1319728357-18112-6-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319728357-18112-1-git-send-email-anthony.perard@citrix.com>
References: <1319728357-18112-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 5/5] hvmloader: Load DSDT table from parametter
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 have two different DSDT tables for rombios and SeaBIOS, this patch
introduce a new parameter to acpi_build_tables() which contain the DSDT table
to load.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/firmware/hvmloader/acpi/acpi2_0.h |    9 ++++++++-
 tools/firmware/hvmloader/acpi/build.c   |   31 ++++++++++++++-----------------
 tools/firmware/hvmloader/rombios.c      |   12 +++++++++++-
 tools/firmware/hvmloader/seabios.c      |   12 +++++++++++-
 4 files changed, 44 insertions(+), 20 deletions(-)

diff --git a/tools/firmware/hvmloader/acpi/acpi2_0.h b/tools/firmware/hvmloader/acpi/acpi2_0.h
index 7fa8f5b..b281ec0 100644
--- a/tools/firmware/hvmloader/acpi/acpi2_0.h
+++ b/tools/firmware/hvmloader/acpi/acpi2_0.h
@@ -391,7 +391,14 @@ struct acpi_20_madt_intsrcovr {
 
 #pragma pack ()
 
-void acpi_build_tables(unsigned int physical);
+struct acpi_config {
+    unsigned char *dsdt_anycpu;
+    int dsdt_anycpu_len;
+    unsigned char *dsdt_15cpu;
+    int dsdt_15cpu_len;
+};
+
+void acpi_build_tables(struct acpi_config *config, unsigned int physical);
 
 #endif /* _ACPI_2_0_H_ */
 
diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c
index d8222b1..c902885 100644
--- a/tools/firmware/hvmloader/acpi/build.c
+++ b/tools/firmware/hvmloader/acpi/build.c
@@ -47,17 +47,6 @@ struct acpi_info {
     uint32_t madt_lapic0_addr;  /* 16   - Address of first MADT LAPIC struct */
 };
 
-/*
- * Alternative DSDTs we get linked against. A cover-all DSDT for up to the
- * implementation-defined maximum number of VCPUs, and an alternative for use
- * when a guest can only have up to 15 VCPUs.
- * 
- * The latter is required for Windows 2000, which experiences a BSOD of
- * KMODE_EXCEPTION_NOT_HANDLED if it sees more than 15 processor objects.
- */
-extern unsigned char dsdt_anycpu[], dsdt_15cpu;
-extern int dsdt_anycpu_len, dsdt_15cpu_len;
-
 /* Number of processor objects in the chosen DSDT. */
 static unsigned int nr_processor_objects;
 
@@ -285,7 +274,7 @@ static int construct_secondary_tables(unsigned long *table_ptrs,
     return nr_tables;
 }
 
-void acpi_build_tables(unsigned int physical)
+void acpi_build_tables(struct acpi_config *config, unsigned int physical)
 {
     struct acpi_info *acpi_info = (struct acpi_info *)ACPI_INFO_PHYSICAL_ADDRESS;
     struct acpi_20_rsdp *rsdp;
@@ -308,18 +297,26 @@ void acpi_build_tables(unsigned int physical)
     if (!facs) goto oom;
     memcpy(facs, &Facs, sizeof(struct acpi_20_facs));
 
-    if ( hvm_info->nr_vcpus <= 15 )
+    /*
+     * Alternative DSDTs we get linked against. A cover-all DSDT for up to the
+     * implementation-defined maximum number of VCPUs, and an alternative for use
+     * when a guest can only have up to 15 VCPUs.
+     *
+     * The latter is required for Windows 2000, which experiences a BSOD of
+     * KMODE_EXCEPTION_NOT_HANDLED if it sees more than 15 processor objects.
+     */
+    if ( hvm_info->nr_vcpus <= 15 && config->dsdt_15cpu)
     {
-        dsdt = mem_alloc(dsdt_15cpu_len, 16);
+        dsdt = mem_alloc(config->dsdt_15cpu_len, 16);
         if (!dsdt) goto oom;
-        memcpy(dsdt, &dsdt_15cpu, dsdt_15cpu_len);
+        memcpy(dsdt, config->dsdt_15cpu, config->dsdt_15cpu_len);
         nr_processor_objects = 15;
     }
     else
     {
-        dsdt = mem_alloc(dsdt_anycpu_len, 16);
+        dsdt = mem_alloc(config->dsdt_anycpu_len, 16);
         if (!dsdt) goto oom;
-        memcpy(dsdt, &dsdt_anycpu, dsdt_anycpu_len);
+        memcpy(dsdt, config->dsdt_anycpu, config->dsdt_anycpu_len);
         nr_processor_objects = HVM_MAX_VCPUS;
     }
 
diff --git a/tools/firmware/hvmloader/rombios.c b/tools/firmware/hvmloader/rombios.c
index 017bd4c..fa38014 100644
--- a/tools/firmware/hvmloader/rombios.c
+++ b/tools/firmware/hvmloader/rombios.c
@@ -40,6 +40,9 @@
 #define ROMBIOS_MAXOFFSET      0x0000FFFF
 #define ROMBIOS_END            (ROMBIOS_BEGIN + ROMBIOS_SIZE)
 
+extern unsigned char dsdt_anycpu[], dsdt_15cpu[];
+extern int dsdt_anycpu_len, dsdt_15cpu_len;
+
 static void rombios_setup_e820(void)
 {
     /*
@@ -112,7 +115,14 @@ static void reset_bios_checksum(void)
 
 static void rombios_acpi_build_tables(void)
 {
-    acpi_build_tables(ACPI_PHYSICAL_ADDRESS);
+    struct acpi_config config = {
+        .dsdt_anycpu = dsdt_anycpu,
+        .dsdt_anycpu_len = dsdt_anycpu_len,
+        .dsdt_15cpu = dsdt_15cpu,
+        .dsdt_15cpu_len = dsdt_15cpu_len,
+    };
+
+    acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS);
 }
 
 static void rombios_create_mp_tables(void)
diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c
index 8f4c0a4..3045157 100644
--- a/tools/firmware/hvmloader/seabios.c
+++ b/tools/firmware/hvmloader/seabios.c
@@ -31,6 +31,9 @@
 #define ROM_INCLUDE_SEABIOS
 #include "roms.inc"
 
+extern unsigned char dsdt_anycpu_qemu_xen[];
+extern int dsdt_anycpu_qemu_xen_len;
+
 struct seabios_info {
     char signature[14]; /* XenHVMSeaBIOS\0 */
     uint8_t length;     /* Length of this struct */
@@ -91,7 +94,14 @@ static void add_table(uint32_t t)
 static void seabios_acpi_build_tables(void)
 {
     uint32_t rsdp = (uint32_t)scratch_alloc(sizeof(struct acpi_20_rsdp), 0);
-    acpi_build_tables(rsdp);
+    struct acpi_config config = {
+        .dsdt_anycpu = dsdt_anycpu_qemu_xen,
+        .dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len,
+        .dsdt_15cpu = NULL,
+        .dsdt_15cpu_len = 0,
+    };
+
+    acpi_build_tables(&config, rsdp);
     add_table(rsdp);
 }
 
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:31:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:31:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRvO-00053l-CW; Thu, 27 Oct 2011 08:31:22 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRdz-0000Dz-QZ
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:13:24 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-3.tower-182.messagelabs.com!1319728399!979228!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7559 invoked from network); 27 Oct 2011 15:13:20 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-3.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 15:13:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315195200"; d="scan'208";a="168449183"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 11:12:56 -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; Thu, 27 Oct 2011 11:12:56 -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 p9RFCoPs022879;	Thu, 27 Oct 2011 08:12:54 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: Xen Devel <xen-devel@lists.xensource.com>
Date: Thu, 27 Oct 2011 16:12:35 +0100
Message-ID: <1319728357-18112-4-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319728357-18112-1-git-send-email-anthony.perard@citrix.com>
References: <1319728357-18112-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Subject: [Xen-devel] [PATCH 3/5] hvmloader: In mk_dsdt,
	Use __attribute__ format.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 __attribute__((format(printf,..))) for the function _stmt to prevent any
mistake.

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 tools/firmware/hvmloader/acpi/mk_dsdt.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/tools/firmware/hvmloader/acpi/mk_dsdt.c b/tools/firmware/hvmloader/acpi/mk_dsdt.c
index 8cab7ba..c80a888 100644
--- a/tools/firmware/hvmloader/acpi/mk_dsdt.c
+++ b/tools/firmware/hvmloader/acpi/mk_dsdt.c
@@ -15,7 +15,8 @@ static void indent(void)
         printf("    ");
 }
 
-static void _stmt(const char *name, const char *fmt, ...)
+static __attribute__((format(printf, 2, 3)))
+void _stmt(const char *name, const char *fmt, ...)
 {
     va_list args;
 
-- 
Anthony PERARD


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:32:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:32:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRwO-0005T6-Ms; Thu, 27 Oct 2011 08:32:24 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRe0-0000E0-4w
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:13:25 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1319728400!1891602!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23781 invoked from network); 27 Oct 2011 15:13:21 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-11.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 15:13:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8623883"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 15:13:20 +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, 27 Oct 2011 16:13:20 +0100
Subject: Re: [Xen-devel] Re: PV drivers on HVM using Xen 4.1.1
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Alex Bligh <alex@alex.org.uk>
Date: Thu, 27 Oct 2011 16:13:20 +0100
In-Reply-To: <30C4B98DD463F3E19F28AA88@nimrod.local>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<30C4B98DD463F3E19F28AA88@nimrod.local>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319728400.9436.143.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-10-27 at 15:57 +0100, Alex Bligh wrote:
> 
> --On 27 October 2011 13:56:41 +0100 Alex Bligh <alex@alex.org.uk> wrote:
> 
> > I think I've found one reason why we can't get PV block drivers on HVM
> > domUs working on Xen 4.1.1 - whether we use a pvops or a xenlinux
> > domU kernel.
> >
> > We are using a line like:
> >
> >   disk = [ "tap:aio:/tmp/centos-pvd.img,xvda,w" ]
> >
> > We are using effectively a standard 3.0 kernel. Config options including
> > the word XEN are below.
> >
> > We do not see blktapctrl starting in Xen 4.1.1 dom0, but it does
> > start in Xen3.
> 
> The magic incantation to fix this here was:
> 	modprobe xen_gntdev
> which for some reason is not modprobed in the startup script (Ubuntu
> one anyway).

I think 3.1 has patches to fix this in general (although I'm not sure
about this specific case).

> We now see pv block devices on hvm.

If you are using gntdev then are you running a qemu to provide the
backend?

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:33:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:33:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRxL-0005tz-Lw; Thu, 27 Oct 2011 08:33:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRe9-0000FA-FW
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:13:34 -0700
X-Env-Sender: jfehlig@suse.com
X-Msg-Ref: server-13.tower-27.messagelabs.com!1319728393!45997696!1
X-Originating-IP: [137.65.250.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23081 invoked from network); 27 Oct 2011 15:13:14 -0000
Received: from victor.provo.novell.com (HELO victor.provo.novell.com)
	(137.65.250.26)
	by server-13.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 27 Oct 2011 15:13:14 -0000
Received: from [137.65.135.35] (prv-ext-foundry1int.gns.novell.com
	[137.65.251.240])
	by victor.provo.novell.com with ESMTP (TLS encrypted);
	Thu, 27 Oct 2011 09:13:23 -0600
Message-ID: <4EA97512.7030106@suse.com>
Date: Thu, 27 Oct 2011 09:13:22 -0600
From: Jim Fehlig <jfehlig@suse.com>
User-Agent: Thunderbird 2.0.0.18 (X11/20081112)
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH] Prevent vif-bridge from adding user-created
	taps to a bridge
References: <4EA740EB.7030804@suse.com>	
	<1319614636.16747.39.camel@dagon.hellion.org.uk>	
	<4EA84DBA.6070901@suse.com> <4EA8EC01.2010904@suse.com>
	<1319706120.9436.68.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319706120.9436.68.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
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

Ian Campbell wrote:
> On Thu, 2011-10-27 at 06:28 +0100, Jim Fehlig wrote:
>   
>> Jim Fehlig wrote:
>>     
>>> Ian Campbell wrote:
>>>   
>>>       
>>>> On Wed, 2011-10-26 at 00:06 +0100, Jim Fehlig wrote:
>>>>   
>>>>     
>>>>         
>>>>> I previously sent this from my @suse.com mail address without having
>>>>> subscribed it.  Sending again now that I have done so...
>>>>>
>>>>> 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
>>>>>     
>>>>>       
>>>>>           
>>>> Oh dear.
>>>>
>>>>   
>>>>     
>>>>         
>>>>> SUBSYSTEM=="net", KERNEL=="tap*", ACTION=="add",
>>>>> RUN+="/etc/xen/scripts/vif-setup $env{ACTION} type_if=tap"
>>>>>
>>>>> 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?
>>>>>     
>>>>>       
>>>>>           
>>>> I think overall your change is an improvement, some thoughts:
>>>>
>>>> For a tap device XENBUS_PATH is set in vif-common.sh:
>>>>         elif [ "$type_if" = tap ]; then
>>>>             # Check presence of compulsory args.
>>>>             : ${INTERFACE:?}
>>>>         
>>>>             # Get xenbus_path from device name.
>>>>             # The name is built like that: "tap${domid}.${devid}".
>>>>             dev_=${dev#tap}
>>>>             domid=${dev_%.*}
>>>>             devid=${dev_#*.}
>>>>         
>>>>             XENBUS_PATH="/local/domain/0/backend/vif/$domid/$devid"
>>>>         fi
>>>>
>>>> Could there be false positives from this?
>>>>     
>>>>         
>>> Hmm, yes, I think it is possible.
>>>   
>>>       
>> On second thought, maybe not.  A false positive would mean two tap
>> devices with the same name right?  AFAICT, that's not permitted.
>>     
>
> Oh right, we are given $dev aren't we.
>   
>>>   
>>>       
>>>>  Perhaps we should be more
>>>> aggressively checking for the tapX.Y, where X and Y are integers, format
>>>> as well? (that's not foolproof either though).
>>>>   
>>>>     
>>>>         
>>> Yeah, I don't think that buys us much.
>>>
>>>   
>>>       
>>>> Perhaps the toolstack could write something to xenstore containing the
>>>> literal tap device name which it asked qemu for? Then we can simply read
>>>> it back here, e.g. /libxl/tap/0/tapX.Y -> $XENBUS_PATH (0 being the
>>>> backend domain and the content being the xenbus path so we don't need to
>>>> magic it up).
>>>>     
>>>>         
>> The toolstack already writes something in xenstore, namely
>> $XENBUS_PATH/bridge.
>>     
>
> XENBUS_PATH here is really the vif backend path, not the tap path,
> although they in some way are aliased so in many cases that ok. I was
> just thinking it might be useful to have a backend space for the tap
> device only (since the guest can see the vif backend dir).
>   

So you prefer this approach to solving the problem?

>   
>>   IMO, the problem is in vif-bridge
>>
>> bridge=${bridge:-}
>> bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")
>>
>> if [ -z "$bridge" ]
>> then
>>   bridge=$(brctl show | cut -d "
>> " -f 2 | cut -f 1)
>>
>>   if [ -z "$bridge" ]
>>   then
>>      fatal "Could not find bridge, and none was specified"
>>   fi
>> else
>>   ...
>>
>> If the toolstack hasn't written anything to xenstore, vif-bridge happily
>> connects the tap device to the first bridge it finds.  Shouldn't
>> vif-bridge just exit if no bridge is specified?
>>     
>
> I think that behaviour is historical (which isn't to say it's correct).
>   

Connecting the device to an arbitrary bridge seems dangerous to me. 
What if the bridge is on a sensitive VLAN?

> FWIW xl defaults to writing xenbr0. I don't know what xend does.
>   

xend writes nothing to that node if bridge is not specified in the vif
config :-(.  I suppose that is the reason for the hack in vif-bridge,
which was a bad fix IMO.

Thanks,
Jim
> Ian.
>
>   

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:34:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:34:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJRyn-0006f6-64; Thu, 27 Oct 2011 08:34:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRgF-0000dU-Pc
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:15:44 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319728540!1300977!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4227 invoked from network); 27 Oct 2011 15:15:40 -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; 27 Oct 2011 15:15:40 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RJRgB-000H2d-9Y; Thu, 27 Oct 2011 15:15:39 +0000
Date: Thu, 27 Oct 2011 16:15:39 +0100
From: Tim Deegan <tim@xen.org>
To: Keir Fraser <keir.xen@gmail.com>
Subject: Re: [Xen-devel] [PATCH] xen: provide pse36 cpuid bit
Message-ID: <20111027151539.GP59656@ocelot.phlegethon.org>
References: <4EA96B0F.4070607@amd.com> <CACF3071.23CF7%keir.xen@gmail.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <CACF3071.23CF7%keir.xen@gmail.com>
User-Agent: Mutt/1.4.2.1i
Cc: Christoph Egger <Christoph.Egger@amd.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

At 15:59 +0100 on 27 Oct (1319731185), Keir Fraser wrote:
> >> This patch appears to advertise PSE36 support to guests without actually
> >> supporting PSE36.  Or am I missing something?
> > 
> > That's right. The paging format differs only in 32bit legacy mode.
> > Since Hyper-V is not running in 32bit legacy mode but insists on having
> > these cpuid bits present it is sufficient to just populate them to the
> > guest when guest paging mode != 32bit legacy mode.
> 
> It would be nice if we didn't have to toggle CPUID.PSE36 based on current
> guest mode. How hard would it be to pull out bits 35..32 of a physical
> address from bits 16..13 of a legacy 32-bit PDE whose PS flag = 1?

Should be easy.  It's another bit of logic on the pagetable walker, but
nothing too expensive, and we already handle other simlar special cases.

> I'm actually surprised we don't do it already, it's so trivial! The code
> explicitly says we don't though, and for a reason that makes no sense to
> me...

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. :)

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 Oct 27 08:36:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:36:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJS0U-00079b-9n; Thu, 27 Oct 2011 08:36:39 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRh3-0000rr-8G
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:16:34 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319728589!973054!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28759 invoked from network); 27 Oct 2011 15:16:30 -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;
	27 Oct 2011 15:16:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8623961"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 15:16:29 +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, 27 Oct 2011 16:16:29 +0100
Subject: Re: [Xen-devel] [PATCH] Prevent vif-bridge from adding user-created
	taps to a bridge
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Jim Fehlig <jfehlig@suse.com>
Date: Thu, 27 Oct 2011 16:16:29 +0100
In-Reply-To: <4EA97512.7030106@suse.com>
References: <4EA740EB.7030804@suse.com>
	<1319614636.16747.39.camel@dagon.hellion.org.uk>
	<4EA84DBA.6070901@suse.com> <4EA8EC01.2010904@suse.com>
	<1319706120.9436.68.camel@zakaz.uk.xensource.com>
	<4EA97512.7030106@suse.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319728589.9436.144.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 Thu, 2011-10-27 at 16:13 +0100, Jim Fehlig wrote:

> > XENBUS_PATH here is really the vif backend path, not the tap path,
> > although they in some way are aliased so in many cases that ok. I was
> > just thinking it might be useful to have a backend space for the tap
> > device only (since the guest can see the vif backend dir).
> >   
> 
> So you prefer this approach to solving the problem?

It's probably the right thing to do long term but your initial patch
seems like a reasonable enough fix right now.

Ian.

> 
> >   
> >>   IMO, the problem is in vif-bridge
> >>
> >> bridge=${bridge:-}
> >> bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")
> >>
> >> if [ -z "$bridge" ]
> >> then
> >>   bridge=$(brctl show | cut -d "
> >> " -f 2 | cut -f 1)
> >>
> >>   if [ -z "$bridge" ]
> >>   then
> >>      fatal "Could not find bridge, and none was specified"
> >>   fi
> >> else
> >>   ...
> >>
> >> If the toolstack hasn't written anything to xenstore, vif-bridge happily
> >> connects the tap device to the first bridge it finds.  Shouldn't
> >> vif-bridge just exit if no bridge is specified?
> >>     
> >
> > I think that behaviour is historical (which isn't to say it's correct).
> >   
> 
> Connecting the device to an arbitrary bridge seems dangerous to me. 
> What if the bridge is on a sensitive VLAN?
> 
> > FWIW xl defaults to writing xenbr0. I don't know what xend does.
> >   
> 
> xend writes nothing to that node if bridge is not specified in the vif
> config :-(.  I suppose that is the reason for the hack in vif-bridge,
> which was a bad fix IMO.
> 
> Thanks,
> Jim
> > Ian.
> >
> >   



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:37:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:37:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJS1h-0007Wv-Km; Thu, 27 Oct 2011 08:37:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRho-00014v-OT
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:17:21 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1319728636!1805349!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13442 invoked from network); 27 Oct 2011 15:17:17 -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; 27 Oct 2011 15:17:17 -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
	p9RFH16s022362
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 15:17:02 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
	p9RFH0Rt016940
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 15:17:00 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
	p9RFGtsI009827; Thu, 27 Oct 2011 10:16:55 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 27 Oct 2011 08:16:54 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 1300782C31; Thu, 27 Oct 2011 11:16:54 -0400 (EDT)
Date: Thu, 27 Oct 2011 11:16:54 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Alex Bligh <alex@alex.org.uk>
Subject: Re: [Xen-devel] PV drivers on HVM using Xen 4.1.1
Message-ID: <20111027151653.GD1157@phenom.dumpdata.com>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<alpine.DEB.2.00.1110271443530.3519@kaball-desktop>
	<83E58692DD2D4CA6461EEA7A@nimrod.local>
	<alpine.DEB.2.00.1110271513410.3519@kaball-desktop>
	<9BF0369A4E41B84EBCAADE54@nimrod.local>
	<alpine.DEB.2.00.1110271550080.3519@kaball-desktop>
	<4C9805914A32F7BA80157F42@nimrod.local>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4C9805914A32F7BA80157F42@nimrod.local>
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.4EA975EE.00D3:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: 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 Thu, Oct 27, 2011 at 04:01:13PM +0100, Alex Bligh wrote:
> Stefano,
> 
> --On 27 October 2011 15:51:54 +0100 Stefano Stabellini
> <stefano.stabellini@eu.citrix.com> wrote:
> 
> >>So, should we be using tap:aio:/dev/... for a block device for
> >>speed?
> >
> >You should use phy:/dev/whatever.
> >At this point I suggest you setup loop devices for testing to be
> >coherent.

Or you can use Logical Volumes and dump your .img files in them and do:

dd if=/mnt/ViP_customer.img of=/dev/vg_guest/VIP_customer bs=1MB

and in your configuration file:
disk = ['phy:/dev/vg_guest/VIP_customer,xvda,w']

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:38:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:38:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJS2l-0007vS-KB; Thu, 27 Oct 2011 08:38:59 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRuG-0004aF-V3
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:30:13 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1319729409!30556610!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9934 invoked from network); 27 Oct 2011 15:30:09 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-15.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 15:30:09 -0000
Received: by wwf10 with SMTP id 10so3688204wwf.24
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 08:30:09 -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=VwdBSfDpbnJZwQLApqw5AaCnj/G7vydxGgdjeAGTDm4=;
	b=NZwT6Zu1lb+KWyc8Oq2Vfizg22TvT3zmtAEfy8DR9ps+2gaZjo9g9Lzcf7n9+QYtb8
	P7FQUtji75NokDk3nuIMJ/GrM0uwyzuT9R0D2JasiphNLhbZqWrndkQrtnwStSB+sy3f
	Qz5PXQFzrmtJxE6+k/jOe3V1aLVav0VX9cJYk=
Received: by 10.216.26.202 with SMTP id c52mr2654422wea.62.1319729409591;
	Thu, 27 Oct 2011 08:30:09 -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 gd6sm10067182wbb.1.2011.10.27.08.30.08
	(version=SSLv3 cipher=OTHER); Thu, 27 Oct 2011 08:30:08 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 27 Oct 2011 16:30:00 +0100
Subject: Re: [Xen-devel] [PATCH] xen: provide pse36 cpuid bit
From: Keir Fraser <keir@xen.org>
To: Tim Deegan <tim@xen.org>
Message-ID: <CACF3788.3340E%keir@xen.org>
Thread-Topic: [Xen-devel] [PATCH] xen: provide pse36 cpuid bit
Thread-Index: AcyUvUocnSLGapnOV0+makDPQlCREA==
In-Reply-To: <20111027151539.GP59656@ocelot.phlegethon.org>
Mime-version: 1.0
Content-type: text/plain;
	charset="US-ASCII"
Content-transfer-encoding: 7bit
Cc: Christoph Egger <Christoph.Egger@amd.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 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. :-)

 -- Keir



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:40:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:40:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJS49-0008Jt-3E; Thu, 27 Oct 2011 08:40:25 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRvp-0005EY-Vb
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:31:52 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319729504!970726!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24128 invoked from network); 27 Oct 2011 15:31:45 -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; 27 Oct 2011 15:31:45 -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
	p9RFVfVQ009896
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 15:31:42 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
	p9RFVeCt014950
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 15:31:40 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
	p9RFVZvD021841; Thu, 27 Oct 2011 10:31:35 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 27 Oct 2011 08:31:33 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id AD49E82C26; Thu, 27 Oct 2011 11:31:32 -0400 (EDT)
Date: Thu, 27 Oct 2011 11:31:32 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Miche Baker-Harvey <miche@google.com>
Message-ID: <20111027153132.GA2751@phenom.dumpdata.com>
References: <20111027053007.GA32765@phenom.dumpdata.com>
	<20111027054806.GA1377@suse.de>
	<CAB8Rdaq2r4Uc-WZK-k=wiEW8DKdixn+9dB7E4_XDL7k8jCMwSw@mail.gmail.com>
	<20111027150826.GC1157@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111027150826.GC1157@phenom.dumpdata.com>
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.0A090201.4EA9795E.0283:SCFMA922111,ss=1,re=-19.000,fgs=0
Cc: xen-devel@lists.xensource.com, Greg KH <gregkh@suse.de>,
	linux-kernel@vger.kernel.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

> > The "console [hvc0] enabled" message is coming from register_console(=
) in
> > printk.c, and it doesn't have any loops.
> > It's called from hvc_console_init(), hvc_instantiate(), and hvc_alloc=
(),
> > none of which have loops.  The call in hvc_alloc() is the one I added=
, so
> > either I've inadvertently made one of the other two repeat (I'm guest=
ting
> > hvc_instantiate() is the one you're using), or you're infinitely call=
ing
> > hvc_alloc().  There's a calls to hvc_alloc() in hvc_xen.c::xen_hvc_in=
it(),
> > and in init_port_console() in virtio_console.c, but again, no loops.
> >  Similarly for hvc_instantiate().
> >=20
> > So, could I trouble you to put a breakpoint in register_console() and=
 send
> > me the stack?
>=20
> A dump_stack() should suffice I presume? Yeah let me do that.

Trying 192.168.101.14...
Connected to maxsrv1.
Escape character is '^]'.

PXELINUX 3.82 2009-06-09  Copyright (C) 1994-2009 H. Peter Anvin et al
Loading xen.gz... ok
Loading vmlinuz... ok
Loading initramfs.cpio.gz... ok
 __  __            _  _    _    _ _ _  ___ ____ _____=20
 \ \/ /___ _ __   | || |  / |  / / / |/ _ \___ \___  |
  \  // _ \ '_ \ =20
 /_/\_\___|_| |_|    |_|(_)_|  |_|_|_|\___/_____/_/  =20
                                                     =20
(XEN) Xen version 4.1-111027 (konrad@dumpdata.com) (gcc version 4.4.4 201=
00503 (Red Hat 4.4.4-2) (GCC) ) Thu Oct 27 11:16:34 EDT 2011
(XEN) Latest ChangeSet: Tue Oct 04 14:11:56 2011 +0200 23182:98306e1f58ba
(XEN) Console output is synchronous.
(XEN) Bootloader: unknown
(XEN) Command line: com1=3D115200,8n1 console=3Dcom1,vga guest_loglvl=3Da=
ll sync_console apic=3Ddebug
(XEN) Video information:
(XEN)  VGA is text mode 80x25, font 8x16
(XEN)  VBE/DDC methods: none; EDID transfer time: 2 seconds
(XEN)  EDID info not retrieved because no DDC retrieval method detected
(XEN) Disc information:
(XEN)  Found 0 MBR signatures
(XEN)  Found 0 EDD information structures
(XEN) Xen-e820 RAM map:
(XEN)  0000000000000000 - 000000000009d800 (usable)
(XEN)  000000000009d800 - 00000000000a0000 (reserved)
(XEN)  00000000000cc000 - 0000000000100000 (reserved)
(XEN)  0000000000100000 - 000000007fff0000 (usable)
(XEN)  000000007fff0000 - 0000000080000000 (reserved)
(XEN)  0000000080000000 - 00000000cfef0000 (usable)
(XEN)  00000000cfef0000 - 00000000cfef5000 (ACPI data)
(XEN)  00000000cfef5000 - 00000000cff7f000 (ACPI NVS)
(XEN)  00000000cff80000 - 00000000d0000000 (reserved)
(XEN)  00000000e0000000 - 00000000f0000000 (reserved)
(XEN)  00000000fec00000 - 00000000fec10000 (reserved)
(XEN)  00000000fee00000 - 00000000fee01000 (reserved)
(XEN)  00000000fff80000 - 0000000100000000 (reserved)
(XEN)  0000000100000000 - 0000000130000000 (usable)
(XEN) ACPI: RSDP 000F79B0, 0024 (r2 PTLTD )
(XEN) ACPI: XSDT CFEF0753, 009C (r1 DELL   PE_SC3    6040000 DELL        =
0)
(XEN)  6040000 DELL    F4240)
(XEN) ACPI: DSDT CFEF07EF, 33FC (r1 DELL   PE_SC3    6040000 MSFT  100000=
E)
(XEN) ACPI: FACS CFEF5FC0, 0040
(XEN) ACPI: TCPA CFEF3D53, 0032 (r1 Phoeni  x        6040000  TL         =
0)
(XEN) ACPI: SLIC CFEF3D85, 0024 (r1 DELL   PE_SC3    6040000 PTL         =
1)
(XEN) ACPI: SPCR CFEF3DA9, 0050 (r1 DELL   PE_SC3    6040000 PTL         =
1)
(XEN) ACPI: EINJ CFEF3DF9, 01B0 (r1 PTL    WHEAPTL   6040000 PTL         =
1)
(XEN) ACPI: HEST CFEF3FA9, 00A8 (r1 PTL    WHEAPTL   6040000 PTL         =
1)
(XEN) ACPI: BERT CFEF4051, 0030 (r1 PTL    WHEAPTL   6040000 PTL         =
1)
(XEN) ACPI: SSDT CFEF4081, 00E1 (r1 wheaos  wheaosc  6040000 INTL 2005062=
4)
(XEN) ACPI: ERST CFEF4162, 0270 (r1 PTL    WHEAPTL   6040000 PTL         =
1)
(XEN) ACPI: SRAT CFEF43D2, 00E8 (r1 AMD    HAMMER    6040000 AMD         =
1)
(XEN) ACPI: SSDT CFEF44BA, 0A30 (r1 AMD    POWERNOW  6040000 AMD         =
1)
(XEN) ACPI: MCFG CFEF4EEA, 003C (r1 PTLTD    MCFG    6040000  LTP        =
0)
(XEN) ACPI: HPET CFEF4F26, 0038 (r1 PTLTD  HPETTBL   6040000  LTP        =
1)
(XEN) ACPI: APIC CFEF4F5E, 007A (r1 PTLTD  	 APIC    6040000  LTP        =
0)
(XEN) ACPI: BOOT CFEF4FD8, 0028 (r1 PTLTD  $SBFTBL$  6040000  LTP        =
1)
(XEN) System RAM: 4094MB (4192756kB)
(XEN) Domain heap initialised
(XEN) Processor #0 0:2 APIC version 16
(XEN) Processor #1 0:2 APIC version 16
(XEN) Processor #2 0:2 APIC version 16
(XEN) Processor #3 0:2 APIC version 16
(XEN) IOAPIC[0]: apic_id 4, version 17, address 0xfec00000, GSI 0-23
(XEN) Enabling APIC mode:  Flat.  Using 1 I/O APICs
(XEN) ERST table is invalid
(XEN) Using scheduler: SMP Credit Scheduler (credit)
(XEN) Detected 2109.738 MHz processor.
(XEN) Initing memory sharing.
(XEN) AMD-Vi: IOMMU not found!
(XEN) I/O virtualisation disabled
(XEN) ENABLING IO-APIC IRQs
(XEN)  -> Using new ACK method
(XEN) Platform timer is 25.000MHz HPET
=FF(XEN) Allocated console ring of 16 KiB.
(XEN) HVM: ASIDs enabled.
(XEN) SVM: Support(XEN) Brought up 4 CPUs
(XEN) *** LOADING DOMAIN 0 ***
(XEN)  Xen  kernel: 64-bit, lsb, compat32
(XEN)  Dom0 kernel: 64-bit, PAE, lsb, paddr 0x1000000 -> 0x202f000
(XEN) PHYSICAL MEMORY ARRANGEMENT:
(XEN)  Dom0 alloc.:   0000000118000000->000000011c000000 (926310 pages to=
 be allocated)
(XEN)  Init. ramdisk: 000000012170e000->000000012ffff200
(XEN) VIRTUAL MEMORY ARRANGEMENT:
(XEN)  Loaded kernel: ffffffff81000000->ffffffff8202f000
(XEN)  Init. ramdisk: ffffffff8202f000->ffffffff90920200
(XEN)  Phys-Mach map: ffffffff90921000->ffffffff910c6ac0
(XEN)  Start info:    ffffffff910c7000->ffffffff910c74b4
(XEN)  Page tables:   ffffffff910c8000->ffffffff91155000
(XEN)  Boot stack:    ffffffff91155000->ffffffff91156000
(XEN)  TOTAL:         ffffffff80000000->ffffffff91400000
(XEN)  ENTRY ADDRESS: ffffffff81aec200
(XEN) Dom0 has maximum 4 VCPUs
(XEN) Scrubbing Free RAM: .done.
(XEN) Xen trace buffers: disabled
(XEN) Std. Loglevel: Errors and warnings
(XEN) Guest Loglevel: All
(XEN) ***********RNING: CONSOLE OUTPUT IS SYNCHRONOUS
(XEN) ******* This option is intended to aid debugging of Xen by ensuring
(XEN) ******* that all output is synchronously delivered on the serial li=
ne.
(XEN) ******* However it can introduce SIGNIFICANT latencies and affect
(XEN) ******* timekeeping. It is NOT recommended for production use!
(XEN) **********************************************
(XEN) 3... 2... 1...=20
(XEN) Xen is relinquishing VGA console.
(XEN) *** Serial input -> DOM0 (type 'CTRL-a' three times to switch input=
 to Xen)
(X[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.lways_enable earlyprintk=3Dxen console=3Dt=
ty console=3Dhvc0 loglevel=3D10 xen-pciback.hide=3D(01:00.0)(01:00.1)(05:=
02.0)(05:02.1) pciback.hide=3D(01:00.0)(01:00.1) initcall_debug ttm.no_dm=
a=3D1
[    0.000000] Freeing  9d-100 pfn range: 99 pages freed
[    0.000000] 1-1 mapping on 9d->100
[    0.000000] Freeing  7fff0-80000 pfn range: 16 pages freed
[    0.000000] 1-1 mapping on 7fff0->80000
[    0.000000] Freeing  cfef0-f4b58 pfn range: 150632 pages freed
[    0.000000] 1-1 mapping on cfef0->100000
[    0.000000] Released 150747 pages of unused memory
[    0.000000] Set 196995 page(s) to 1-1 mapping
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  Xen: 0000000000000000 - 000000000009d000 (usable)
[    0.000000]  Xen: 000000000009d800 - 0000000000100000 (reserved)
[    0.000000]  Xen: 0000000000100000 - 000000007fff0000 (usable)
[    0.000000]  Xen: 000000007fff0000 - 0000000080000000 (reserved)
[    0.000000]  Xen: 0000000080000000 - 00000000cfef0000 (usable)
[    0.000000]  Xen: 00000000cfef0000 - 00000000cfef5000 (ACPI data)
[    0.000000]  Xen: 00000000cfef5000 - 00000000cff7f000 (ACPI NVS)
[    0.000000]  Xen: 00000000cff80000 - 00000000d0000000 (reserved)
[    0.000000]  Xen: 00000000e0000000 - 00000000f0000000 (reserved)
[    0.000000]  Xen: 00000000fec00000 - 00000000fec10000 (reserved)
[    0.000000]  Xen: 00000000fee00000 - 00000000fee01000 (reserved)
[    0.000000]  Xen: 00000000fff80000 - 0000000100000000 (reserved)
[    0.000000]  Xen: 0000000100000000 - 0000000130000000 (usable)
[    0.000000] bootconsole [xenboot0] enabled
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] DMI present.
[    0.000000] DMI: Dell Inc. PowerEdge T105 /0RR825, BIOS 1.3.2 08/20/20=
08
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (us=
able) =3D=3D> (reserved)
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (us=
able)
[    0.000000] No AGP bridge found
[    0.000000] last_pfn =3D 0x130000 max_arch_pfn =3D 0x400000000
[    0.000000] last_pfn =3D 0xc[    0.000000] initial memory mapped : 0 -=
 10921000
[    0.000000] Base memory trampoline at [ffff880000098000] 98000 size 20=
48 - 00cfef0000 page 4k
[    0.000000] kernel direct mapping tables up to cfef0000 @ 97b000-10000=
00
[    0.000000] xen: setting RW the range f70000 - 1000000
[    0.000000] init_memory_mapping: 0000000100000000-00000001300000006a00=
0-cfef0000
[    0.000000] xen: setting RW the range cf6eb000 - cfef0000
[    0.000000] RAMDISK: 0202f000 - 10921000
[    0.000000] ACPI:  00000000000f79b0 00024 (v02 PTLTD )
[    0.000000] ACPI: XSDT 00000000cfef0753 0009C (v01 DELL   PE_SC3   060=
40000 DELL 00000000)
[    0.000000] ACPI: FACP 00000000cfef3c5f 000F4 (v03 DELL   PE_SC3   060=
40000 DELL 000F4240)
[    0.000000] ACPI: DSDT 00000000cfef07ef 033FC (v01 DELL   PE_SC3   060=
40000 MSFT 0100000E)
[    0.000000] ACPI: FACS 00000000cfef5fc0 00040
[    0.000000] ACPI: TCPA 00000000cfef3d53 00032 (v01 Phoeni  x       060=
40000  TL  00000000)
[    0.000000] ACPI: SLIC 00000000cfef3d85 00024 (v01 DELL   PE_SC3   060=
40000 PTL  00000001)
[    0.000000] ACPI: SPCR 00000000cfef3da9 00050 (v01 DELL   PE_SC3   060=
40000 PTL  00000001)
[    0.000000] ACPI: EINJ 00000000cfef3df9 001B0 (v01 PTL    WHEAPTL  060=
40000 PTL  00000001)
[    0.000000] ACPI: HEST 00000000cfef3fa9 000A8 (v01 PTL    WHEAPTL  060=
40000 PTL  00000001)
[    0.000000] ACPI: BERT 00000000cfef4051 00030 (v01 PTL    WHEAPTL  060=
40000 PTL  00000001)
[    0.000000] ACPI: SSDT 00000000cfef4081 000E1 (v01 wheaos  wheaosc 060=
40000 INTL 20050624)
[    0.000000] ACPI: ERST 00000000cfef4162 00270 (v01 PTL    WHEAPTL  060=
40000 PTL  00000001)
[    0.000000] ACPI: SRAT 00000000cfef43d2 000E8 (v01 AMD    HAMMER   060=
40000 AMD  00000001)
[    0.000000] ACPI: SSDT 00000000cfef44ba 00A30 (v01 AMD    POWERNOW 060=
40000 AMD  00000001)
[    0.000000] ACPI: MCFG 00000000cfef4eea 0003C (v01 PTLTD    MCFG   060=
40000  LTP 00000000)
[    0.000000] ACPI: HPET 00000000cfef4f26 00038 (v01 PTLTD  HPETTBL  060=
40000  LTP 00000001)
[    0.000000] ACPI: APIC 00000000cfef4f5e 0007A (v01 PTLTD  ? APIC   060=
40000  LTP 00000000)
[    0.000000] ACPI: BOOT 00000000cfef4fd8 00028 (v01 PTLTD  $SBFTBL$ 060=
40000  LTP 00000001)
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] Scanning NUMA topology in Northbridge 24
[    0.000000] No NUMA configuration found
[    0.000000] Faking a node at 0000000000000000-0000000130000000
[    0.000000] Initmem setup node 0 0000000000000000-0000000130000000
[    0.000000]   NODE_DATA [00000000cfec9000 - 00000000cfeeffff]
[    0.000000] Zone PFN ranges:
[    0.000000]   DMA      0x00000010 -> 0x00001000
[    0.000000]   DMA32    0x00001000 -> 0x00100000
[    0.000000]   Normal   0x00100000 -> 0x00130000
[    0.000000] Movable zone start PFN for each node
[    0.000000] early_node_map[4] active PFN ranges
[    0.000000]     0: 0x00000010 -> 0x0000009d
[    0.000000]     0: 0x00000100 -> 0x0007fff0
[    0.000000]     0: 0x00080000 -> 0x000cfef0
[    0.000000]     0: 0x00100000 -> 0x00130000
[    0.000000] On node 0 totalpages: 1048173
[    0.000000]   DMA zone: 64 pages used for memmap
[    0.000000]   DMA zone: 1530 pages reserved
[    0.000000]   DMA zone: 2387 pages, LIFO batch:0
[    0.000000]   DMA32 zone: 16320 pages used for memmap
[    0.000000]   DMA32 zone: 831264 pages, LIFO batch:31
[    0.000000]   Normal zone: 3072 pages used for memmap
[    0.000000]   Normal zone: 193536 pages, LIFO batch:31
[    0.000000] ACPI: PM-Timer IO Port: 0x8008
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] ACPI: LAPIC (a 0/0x0, fixing up to 0x10
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x01] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x02] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x03] enabled)
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
[    0.000000] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
[    0.000000] ACPI: IOAPIC (id[0x04] address[0xfec00000] gsi_base[0])
[    0.000000] IOAPIC[0]: apic_id 4, version 255, address 0xfec00000, GSI=
 0-255
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high edge)
[    0.000000] ACPI: IRQ0 used by override.
[    0.000000] ACPI: IRQ2 used by override.
[    0.000000] ACPI: IRQ9 used by override.
[    0.000000] Using ACPI (MADT) for SMP configuration information
[    0.000000] ACPI: HPET id: 0x10de8201 base: 0xfed00000
[    0.000000] SMP: Allowing 4 CPUs, 0 hotplug CPUs
[    0.000000] nr_irqs_gsi: 272
[    0.000000] PM: Registered nosave memory: 000000000009d000 - 000000000=
009e000
[    0.000000] PM: Registered nosave memory: 000000000009e000 - 000000000=
0100000
[    0.000000] PM: Registered nosave memory: 000000007fff0000 - 000000008=
0000000
[    0.000000] PM: Registered nosave memory: 00000000cfef0000 - 00000000c=
fef5000
[    0.000000] PM: Registered nosave memory: 00000000cfef5000 - 00000000c=
ff7f000
[    0.000000] PM: Registered nosave memory: 00000000cff7f000 - 00000000c=
ff80000
[    0.000000] PM: Registered nosave memory: 00000000cff80000 - 00000000d=
0000000
[    0.000000] PM: Registered nosave memory: 00000000d0000000 - 00000000e=
0000000
[    0.000000] PM: Registered nosave memory: 00000000e0000000 - 00000000f=
0000000
[    0.000000] PM: Registered nosave memory: 00000000f0000000 - 00000000f=
ec00000
[    0.000000] PM: Registered nosave memory: 00000000fec00000 - 00000000f=
ec10000
[    0.000000] PM: Registered nosave memory: 00000000fec10000 - 00000000f=
ee00000
[    0.000000] PM: Registered nosave memory: 00000000fee00000 - 00000000f=
ee01000
[    0.000000] PM: Registered nosave memory: 00000000fee01000 - 00000000f=
ff80000
[    0.000000] PM: Registered nosave memory: 00000000fff80000 - 000000010=
0000000
[    0.000000] Allocating PCI resources starting at d0000000 (gap: d00000=
00:10000000)
[    0.000000] Booting paravirtualized kernel on Xen
[    0.000000] Xen version: 4.1-111027 (preserve-AD)
[    0.000000] setup_percpu: NR_CPUS:4096 nr_cpumask_bits:4 nr_cpu_ids:4 =
nr_node_ids:1
[    0.000000] PERCPU: Embedded 28 pages/cpu @ffff8800cfe33000 s82944 r81=
92 d23552 u114688
[    0.000000] pcpu-alloc: s82944 r8192 d23552 u114688 alloc=3D28*4096
[    0.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3=20
[    0.000000] Built 1 zonelists in Node order, mobility grouping on.  To=
tal pages: 1027187
[    0.000000] Policy zone: Normal
[    0.000000] Kernel command line: debug selinux=3D0 initrd_ignore_logle=
vel sysrq_always_enable earlyprintk=3Dxen console=3Dtty console=3Dhvc0 lo=
glevel=3D10 xen-pciback.hide=3D(01:00.0)(01:00.1)(05:02.0)(05:02.1) pciba=
ck.hide=3D(01:00.0)(01:00.1) initcall_debug ttm.no_dma=3D1
[    0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)
[    0.000000] Placing 64MB software IO TLB between ffff8800c7000000 - ff=
ff8800cb000000
[    0.000000] software IO TLB at phys [    0.000000] Memory: 3003820k/49=
80736k available (6391k kernel code, 788044k absent, 1188872k reserved, 4=
703k data, 2448k init)
[    0.000000] SLUB: Genslabs=3D15, HWalign=3D64, Order=3D0-3, MinObjects=
=3D0, CPUs=3D4, Nodes=3D1
[    0.000000] Preemptible hierarchical RCU implementation.
[    0.000000] NR_IRQS:262400 nr_irqs:1024 16
[    0.000000] xen: sci override: global_irq=3D9 trigger=3D0 polarity=3D1
[    0.000000] xen: registering gsi 9 triggering 0 polarity 1
[    0.000000] xen: --> pirq=3D9 -> irq=3D9 (gsi=3D9)
[    0.000000] xen: acpi sci 9
[    0.000000] xen: --> pirq=3D1 -> irq=3D1 (gsi=3D1)
[    0.000000] xen: --> pirq=3D2 -> irq=3D2 (gsi=3D2)
[    0.000000] xen: --> pirq=3D3 -> irq=3D3 (gsi=3D3)
[    0.000000] xen: --> pirq=3D4 -> irq=3D4 (gsi=3D4)
[    0.000000] xen: --> pirq=3D5 -> irq=3D5 (gsi=3D5)
[    0.000000] xen: --> pirq=3D6 -> irq=3D6 (gsi=3D6)
[    0.000000] xen: --> pirq=3D7 -> irq=3D7 (gsi=3D7)
[    0.000000] xen: --> pirq=3D8 -> irq=3D8 (gsi=3D8)
[    0.000000] xen_map_pirq_gsi: returning irq 9 for gsi 9
[    0.000000] xen: --> pirq=3D9 -> irq=3D9 (gsi=3D9)
[    0.000000] xen: --> pirq=3D10 -> irq=3D10 (gsi=3D10)
[    0.000000] xen: --> pirq=3D11 -> irq=3D11 (gsi=3D11)
[    0.000000] xen: --> pirq=3D12 -> irq=3D12 (gsi=3D12)
[    0.000000] xen: --> pirq=3D13 -> irq=3D13 (gsi=3D13)
[    0.000000] xen: --> pirq=3D14 -> irq=3D14 (gsi=3D14)
[    0.000000] xen: --> pirq=3D15 -> irq=3D15 (gsi=3D15)
[    0.000000] kmemleak: Early log buffer exceeded, please increase DEBUG=
_KMEMLEAK_EARLY_LOG_SIZE
[    0.000000] kmemleak: Kernel memory leak detector disabled
[    0.000000] Console: colour VGA+ 80x25
[    0.000000] console [tty0] enabled
[    0.000000] Pid: 0, comm: swapper Not tainted 3.1.0-04893-g138c4ae-dir=
ty #1
[    0.000000] Call Trace:
[    0.000000]  [<ffffffff8109e15e>] ? register_console+0x1ae/0x390
[    0.000000]  [<ffffffff813ae83d>] hvc_instantiate+0x2d/0xd0
[    0.000000]  [<ffffffff813aea49>] xen_cons_init+0x49/0x50
[    0.000000]  [<ffffffff81b1f261>] console_init+0x19/0x2a
[    0.000000]  [<ffffffff81aecda6>] start_kernel+0x2d9/0x408
[    0.000000]  [<ffffffff81aec346>] x86_64_start_reservations+0x131/0x13=
5
[    0.000000]  [<ffffffff81aefb49>] xen_start_kernel+0x612/0x619
[    0.000000] console [hvc0] enabled, bootconsole disabled
[    0.000000] console [hvc0] enabled, bootconsole disabled
[    0.000000] Xen: using vcpuop timer interface
[    0.000000] installing Xen timer for CPU 0
[    0.000000] Detected 2109.738 MHz processor.
[    0.000999] Calibrating delay loop (skipped), value calculated using t=
imer frequency.. 4219.47 BogoMIPS (lpj=3D2109738)
[    0.000999] pid_max: default: 32768 minimum: 301
[    0.001051] Security Framework initialized
[    0.001999] SELinux:  Disabled at boot.
[    0.003840] Dentry cache hash table entries: 524288 (order: 10, 419430=
4 bytes)
[    0.006658] Inode-cache hash table entries: 262144 (order: 9, 2097152 =
bytes)
[    0.007725] Mount-cache hash table entries: 256
[    0.008323] Initializing cgroup subsys cpuacct
[    0.009009] Initializing cgroup subsys freezer
[    0.010080] tseg: 00cff80000
[    0.011006] CPU: Physical Processor ID: 0
[    0.011998] CPU: Processor Core ID: 0
[    0.011998] using AMD E400 aware idle routine
[    0.013338] ACPI: Core revision 20110623
[    0.025025] ftrace: allocating 23089 entries in 91 pages
[    0.027130] cpu 0 spinlock event irq 273
[    0.028099] calli0x0/0x12 @ 1
[    0.028998] initcall trace_init_flags_sys_enter+0x0/0x12 returned 0 af=
ter 0 usecs
[    0.028998] calling  init_hw_perf_events+0x0/0x44b @ 1
[    0.028998] Performance Events: (XEN) traps.c:2432:d0 Domain attempted=
 WRMSR 00000000c0010004 from 0x00000812a205b8c2 to 0x000000000000abcd.
Broken PMU hardware detected, using software events only.
[    0.030997] initcall init_hw_perf_events+0x0/0x44b returned 0 after 19=
52 usecs
[    0.030997] calling  register_trigger_all_cpu_backtrace+0x0/0x1f @ 1
[    0.030997] initcall register_trigger_all_cpu_backtrace+0x0/0x1f retur=
ned 0 after 0 usecs
[    0.030997] calling  migration_init+0x0/0x6d @ 1
[    0.030997] initcall migration_init+0x0/0x6d returned 0 after 0 usecs
[    0.030997] calling  spawn_ksoftirqd+0x0/0x53 @ 1
[    0.033013] initcall spawn_ksoftirqd+0x0/0x53 returned 0 after 2929 us=
ecs
[    0.033997] calling  init_workqueues+0x0/0x2ae @ 1
[    0.036091] initcall init_workqueues+0x0/0x2ae returned 0 after 2929 u=
secs
[    0.036997] calling  cpu_stop_init+0x0/0xab @ 1
[    0.039026] initcall cpu_stop_init+0x0/0xab returned 0 after 2929 usec=
s
[    0.039997] calling  rcu_scheduler_really_started+0x0/0x12 @ 1
[    0.039997] initcall rcu_scheduler_really_started+0x0/0x12 returned 0 =
after 0 usecs
[    0.039997] calling  relay_init+0x0/0x14 @ 1
[    0.039997] initcall relay_init+0x0/0x14 returned 0 after 0 usecs
[    0.039997] calling  tracer_alloc_buffers+0x0/0x1cf @ 1
[    0.039997] initcall tracer_alloc_buffers+0x0/0x1cf returned 0 after 0=
 usecs
[    0.039997] calling  init_trace_printk+0x0/0x12 @ 1
[    0.039997] initcall init_trace_printk+0x0/0x12 returned 0 after 0 use=
cs
[    0.039997] calling  mce_amd_init+0x0/0x17f @ 1
[    0.039997] MCE: In-kernel MCE decoding enabled.
[    0.039997] initcall mce_amd_init+0x0/0x17f returned 0 after 0 usecs
[    0.039997] NMI watchdog disabled (cpu0): hardware events not enabled
[    0.046023] installing Xen timer for CPU 1
[    0.047017] cpu 1 spinlock event irq 279
[    0.048183] NMI watchdog disabl[    0.055018] installing Xen timer for=
 CPU 2
[    0.056013] cpu 2 spinlock event irq 285
[    0.057156] NMI watchdog disabl
[    0.069010] Brought up 4 CPUs
[    0.071204] calling  ipc_ns_init+0x0/0x14 @ 1
[    0.071993] initcall ipc_ns_init+0x0/0x14 returned 0 after 0 usecs
[    0.071993] calling  init_mmap_min_addr+0x0/0x26 @ 1
[    0.071993] initcall init_mmap_min_addr+0x0/0x26 returned 0 after 0 us=
ecs
[    0.071993] calling  init_cpufreq_transition_notifier_list+0x0/0x1b @ =
1
[    0.071993] initcall init_cpufreq_transition_notifier_list+0x0/0x1b re=
turned 0 after 0 usecs
[    0.071993] calling  net_ns_init+0x0/0xf7 @ 1
[    0.072266] initcall net_ns_init+0x0/0xf7 returned 0 after 976 usecs
[    0.072993] calling  e820_mark_nvs_memory+0x0/0x41 @ 1
[    0.072993] PM: Registering ACPI NVS region at cfef5000 (565248 bytes)
[    0.073131] initcall e820_mark_nvs_memory+0x0/0x41 returned 0 after 97=
6 usecs
[    0.073993] calling  cpufreq_tsc+0x0/0x37 @ 1
[    0.073993] initcall cpufreq_tsc+0x0/0x37 returned 0 after 0 usecs
[    0.073993] calling  pci_reboot_init+0x0/0x14 @ 1
[    0.073993] initcall pci_reboot_init+0x0/0x14 returned 0 after 0 usecs
[    0.073993] calling  init_lapic_sysfs+0x0/0x20 @ 1
[    0.073993] initcall init_lapic_sysfs+0x0/0x20 returned 0 after 0 usec=
s
[    0.073993] calling  init_smp_flush+0x0/0x3d @ 1
[    0.073993] initcall init_smp_flush+0x0/0x3d returned 0 after 0 usecs
[    0.073993] calling  alloc_frozen_cpus+0x0/0x30 @ 1
[    0.073993] initcall alloc_frozen_cpus+0x0/0x30 returned 0 after 0 use=
cs
[    0.073993] calling  sysctl_init+0x0/0x32 @ 1
[    0.074047] initcall sysctl_init+0x0/0x32 returned 0 after 976 usecs
[    0.074993] calling  ksysfs_init+0x0/0x94 @ 1
[    0.074993] initcall ksysfs_init+0x0/0x94 returned 0 after 0 usecs
[    0.074993] calling  init_jiffies_clocksource+0x0/0x12 @ 1
[    0.074993] initcall init_jiffies_clocksource+0x0/0x12 returned 0 afte=
r 0 usecs
[    0.074993] calling  pm_init+0x0/0x3e @ 1
[    0.074993] initcall pm_init+0x0/0x3e returned 0 after 0 usecs
[    0.074993] calling  pm_disk_init+0x0/0x19 @ 1
[    0.074993] initcall pm_disk_init+0x0/0x19 returned 0 after 0 usecs
[    0.074993] calling  swsusp_header_init+0x0/0x40 @ 1
[    0.074993] initcall swsusp_header_init+0x0/0x40 returned 0 after 0 us=
ecs
[    0.074993] calling  init_zero_pfn+0x0/0x1f @ 1
[    0.074993] initcall init_zero_pfn+0x0/0x1f returned 0 after 0 usecs
[    0.074993] calling  fsnotify_init+0x0/0x26 @ 1
[    0.074993] initcall fsnotify_init+0x0/0x26 returned 0 after 0 usecs
[    0.074993] calling  filelock_init+0x0/0x2a @ 1
[    0.074993] initcall filelock_init+0x0/0x2a returned 0 after 0 usecs
[    0.074993] calling  init_misc_binfmt+0x0/0x44 @ 1
[    0.074993] initcall init_misc_binfmt+0x0/0x44 returned 0 after 0 usec=
s
[    0.074993] calling  init_script_binfmt+0x0/0x14 @ 1
[    0.074993] initcall init_script_binfmt+0x0/0x14 returned 0 after 0 us=
ecs
[    0.074993] calling  init_elf_binfmt+0x0/0x14 @ 1
[    0.074993] initcall init_elf_binfmt+0x0/0x14 returned 0 after 0 usecs
[    0.074993] calling  init_compat_elf_binfmt+0x0/0x14 @ 1
[    0.074993] initcall init_compat_elf_binfmt+0x0/0x14 returned 0 after =
0 usecs
[    0.074993] calling  debugfs_init+0x0/0x5c @ 1
[    0.074993] initcall debugfs_init+0x0/0x5c returned 0 after 0 usecs
[    0.074993] calling  random32_init+0x0/0xdb @ 1
[    0.074993] initcall random32_init+0x0/0xdb returned 0 after 0 usecs
[    0.074993] calling  virtio_init+0x0/0x30 @ 1
[    0.075081] kworker/u:0 used greatest stack depth: 5288 bytes left
[    0.075114] initcall virtio_init+0x0/0x30 returned 0 after 976 usecs
[    0.075114] calling  __gnttab_init+0x0/0x22 @ 1
[    0.075114] Grant table initialized
[    0.075114] initcall __gnttab_init+0x0/0x22 returned 0 after 0 usecs
[    0.075114] calling  early_resume_init+0x0/0x1d0 @ 1
[    0.075114] RTC time: 11:26:08, date: 10/26/11
[    0.075114] initcall early_resume_init+0x0/0x1d0 returned 0 after 0 us=
ecs
[    0.075114] calling  cpufreq_core_init+0x0/0xb2 @ 1
[    0.075114] initcall cpufreq_core_init+0x0/0xb2 returned 0 after 0 use=
cs
[    0.075114] calling  cpuidle_init+0x0/0x40 @ 1
[    0.075114] initcall cpuidle_init+0x0/0x40 returned -19 after 0 usecs
[    0.075119] calling  sock_init+0x0/0x83 @ 1
[    0.075185] initcall sock_init+0x0/0x83 returned 0 after 0 usecs
[    0.075189] calling  net_inuse_init+0x0/0x26 @ 1
[    0.075197] initcall net_inuse_init+0x0/0x26 returned 0 after 0 usecs
[    0.075201] calling  netpoll_init+0x0/0x31 @ 1
[    0.075205] initcall netpoll_init+0x0/0x31 returned 0 after 0 usecs
[    0.075209] calling  netlink_proto_init+0x0/0x1c2 @ 1
[    0.075217] NET: Registered protocol family 16
[    0.075233] initcall netlink_proto_init+0x0/0x1c2 returned 0 after 0 u=
secs
[    0.075237] calling  bdi_class_init+0x0/0x4d @ 1
[    0.075366] initcall bdi_class_init+0x0/0x4d returned 0 after 0 usecs
[    0.075366] calling  kobject_uevent_init+0x0/0x21 @ 1
[    0.075366] initcall kobject_uevent_init+0x0/0x21 returned 0 after 0 u=
secs
[    0.075366] calling  pcibus_class_init+0x0/0x19 @ 1
[    0.075366] initcall pcibus_class_init+0x0/0x19 returned 0 after 0 use=
cs
[    0.075366] calling  pci_driver_init+0x0/0x12 @ 1
[    0.218045] initcall pci_driver_init+0x0/0x12 returned 0 after 139631 =
usecs
[    0.218975] calling  backlight_class_init+0x0/0x5d @ 1
[    0.219048] initcall backlight_class_init+0x0/0x5d returned 0 after 97=
6 usecs
[    0.219975] calling  video_output_class_init+0x0/0x19 @ 1
[    0.220164] initcall video_output_class_init+0x0/0x19 returned 0 after=
 976 usecs
[    0.220975] calling  xenbus_init+0x0/0x2af @ 1
[    0.221059] initcall xenbus_init+0x0/0x2af returned 0 after 976 usecs
[    0.221975] calling  tty_class_init+0x0/0x38 @ 1
[    0.222162] initcall tty_class_init+0x0/0x38 returned 0 after 976 usec=
s
[    0.222975] calling  vtconsole_class_init+0x0/0xc2 @ 1
[    0.223077] initcall vtconsole_class_init+0x0/0xc2 returned 0 after 97=
6 usecs
[    0.223974] calling  wakeup_sources_debugfs_init+0x0/0x2b @ 1
[    0.223974] initcall wakeup_sources_debugfs_init+0x0/0x2b returned 0 a=
fter 0 usecs
[    0.223974] calling  register_node_type+0x0/0x12 @ 1
[    0.224166] initcall register_node_type+0x0/0x12 returned 0 after 976 =
usecs
[    0.224974] calling  i2c_init+0x0/0x70 @ 1
[    0.225080] initcall i2c_init+0x0/0x70 returned 0 after 976 usecs
[    0.225974] calling  amd_postcore_init+0x0/0x157 @ 1
[    0.226119] node 0 link 0: io port [1000, 4fff]
[    0.226983] node 0 link 0: io port [5000, fffff]
[    0.227991] TOM: 00000000d0000000 aka 3328M
[    0.228981] node 0 link 0: mmio [d0000000, d05fffff]
[    0.230146] node 0 link 0: mmio [fed00000, fed0ffff]
[    0.230982] node 0 link 0: mmio [d8000000, dfffffff]
[    0.231983] node 0 link 0: mmio [fec00000, fec0ffff]
[    0.232980] node 0 link 0: mmio [e0000000, efffffff]
[    0.233981] node 0 link 0: mmio [a0000, bffff]
[    0.234981] node 0 link 0: mmio [f0000000, fe0bffff]
[    0.235978] TOM2: 0000000130000000 aka 4864M
[    0.236973] bus: [00, ff] on node 0 link 0
[    0.236973] bus: 00 index 0 [io  0x0000-0xffff]
[    0.236973] bus: 00 index 1 [mem 0xd0000000-0xd7ffffff]
[    0.236973] bus: 00 index 2 [mem 0xfec10000-0xffffffff]
[    0.236973] bus: 00 index 3 [mem 0xd8000000-0xfebfffff]
[    0.236973] bus: 00 index 4 [mem 0xfec00000-0xfec0ffff]
[    0.236973] bus: 00 index 5 [mem 0x000a0000-0x000bffff]
[    0.236973] bus: 00 index 6 [mem 0x130000000-0xfcffffffff]
[    0.236990] Extended Config Space enabled on 1 nodes
[    0.238119] initcall amd_postcore_init+0x0/0x157 returned 0 after 1269=
3 usecs
[    0.238972] calling  arch_kdebugfs_init+0x0/0x258 @ 1
[    0.238972] initcall arch_kdebugfs_init+0x0/0x258 returned 0 after 0 u=
secs
[    0.238972] calling  configure_trampolines+0x0/0x26 @ 1
[    0.238972] initcall configure_trampolines+0x0/0x26 returned 0 after 0=
 usecs
[    0.238972] calling  mtrr_if_init+0x0/0x78 @ 1
[    0.238972] initcall mtrr_if_init+0x0/0x78 returned -19 after 0 usecs
[    0.238972] calling  ffh_cstate_init+0x0/0x2a @ 1
[    0.238972] initcall ffh_cstate_init+0x0/0x2a returned -1 after 0 usec=
s
[    0.238972] initcall ffh_cstate_init+0x0/0x2a returned with error code=
 -1=20
[    0.238972] calling  activate_jump_labels+0x0/0x28 @ 1
[    0.238972] initcall activate_jump_labels+0x0/0x28 returned 0 after 0 =
usecs
[    0.238972] calling  dynamic_debug_init+0x0/0x118 @ 1
[    0.239026] initcall dynamic_debug_init+0x0/0x118 returned 0 after 976=
 usecs
[    0.239972] calling  acpi_pci_init+0x0/0x61 @ 1
[    0.239972] ACPI: bus type pci registered
[    0.239972] initcall acpi_pci_init+0x0/0x61 returned 0 after 0 usecs
[    0.239972] calling  setup_vcpu_hotplug_event+0x0/0x22 @ 1
[    0.239972] initcall setup_vcpu_hotplug_event+0x0/0x22 returned 0 afte=
r 0 usecs
[    0.239972] calling  register_xen_pci_notifier+0x0/0x33 @ 1
[    0.239972] initcall register_xen_pci_notifier+0x0/0x33 returned 0 aft=
er 0 usecs
[    0.239972] calling  dmi_id_init+0x0/0x329 @ 1
[    0.240164] initcall dmi_id_init+0x0/0x329 returned 0 after 976 usecs
[    0.240972] calling  pci_arch_init+0x0/0x69 @ 1
[    0.240972] PCI: MMCONFIG for domain 0000 [bus 00-04] at [mem 0xe00000=
00-0xe04fffff] (base 0xe0000000)
[    0.240972] PCI: MMCONFIG at [mem 0xe0000000-0xe04fffff] reserved in E=
820
[    0.243098] PCI: Using configuration type 1 for base access
[    0.243972] initcall pci_arch_init+0x0/0x69 returned 0 after 2929 usec=
s
[    0.243972] calling  topology_init+0x0/0xa1 @ 1
[    0.244207] initcall topology_init+0x0/0xa1 returned 0 after 976 usecs
[    0.244971] calling  mtrr_init_finialize+0x0/0x36 @ 1
[    0.244971] initcall mtrr_init_finialize+0x0/0x36 returned 0 after 0 u=
secs
[    0.244971] calling  init_vdso+0x0/0x135 @ 1
[    0.244971] initcall init_vdso+0x0/0x135 returned 0 after 0 usecs
[    0.244971] calling  sysenter_setup+0x0/0x2dd @ 1
[    0.244971] initcall sysenter_setup+0x0/0x2dd returned 0 after 0 usecs
[    0.244971] calling  param_sysfs_init+0x0/0x1b5 @ 1
[    0.260062] initcall param_sysfs_init+0x0/0x1b5 returned 0 after 15622=
 usecs
[    0.260969] calling  pm_sysrq_init+0x0/0x20srq_init+0x0/0x20 returned =
0 after 0 usecs
[    0.260969] calling  default_bdi_init+0x0/0xaa @ 1
[    0.261086] initcall default_bdi_init+0x0/0xaa returned 0 after 976 us=
ecs
[    0.261969] calling  init_bio+0x0/0xf2 @ 1
[    0.261969] bio: create slab <bio-0> at 0
[    0.261969] initcall init_bio+0x0/0xf2 returned 0 after 0 usecs
[    0.261969] calling  fsnotify_notification_init+0x0/0x8b @ 1
[    0.261969] initcall fsnotify_notification_init+0x0/0x8b returned 0 af=
ter 0 usecs
[    0.261969] calling  cryptomgr_init+0x0/0x12 @ 1
[    0.261969] initcall cryptomgr_init+0x0/0x12 returned 0 after 0 usecs
[    0.261969] calling  blk_settings_init+0x0/0x2c @ 1
[    0.261969] initcall blk_settings_init+0x0/0x2c returned 0 after 0 use=
cs
[    0.261969] calling  blk_ioc_init+0x0/0x2a @ 1
[    0.261969] initcall blk_ioc_init+0x0/0x2a returned 0 after 0 usecs
[    0.261969] calling  blk_softirq_init+0x0/0x70 @ 1
[    0.261969] initcall blk_softirq_init+0x0/0x70 returned 0 after 0 usec=
s
[    0.261969] calling  blk_iopoll_setup+0x0/0x70 @ 1
[    0.261969] initcall blk_iopoll_setup+0x0/0x70 returned 0 after 0 usec=
s
[    0.261969] calling  genhd_device_init+0x0/0x85 @ 1
[    0.262166] initcall genhd_device_init+0x0/0x85 returned 0 after 976 u=
secs
[    0.262969] calling  pci_slot_init+0x0/0x50 @ 1
[    0.262969] initcall pci_slot_init+0x0/0x50 returned 0 after 0 usecs
[    0.262969] calling  fbmem_init+0x0/0x98 @ 1
[    0.263039] initcall fbmem_init+0x0/0x98 returned 0 after 976 usecs
[    0.263969] calling  acpi_init+0x0/0xbc @ 1
[    0.263969] ACPI: Added _OSI(Module Device)
[    0.263969] ACPI: Added _OSI(Processor Device)
[    0.263969] ACPI: Added _OSI(3.0 _SCP Extensions)
[    0.263969] ACPI: Added _OSI(Processor Aggregator Device)
[    0.265128] ACPI: EC: Look up EC in DSDT
[    0.265968] \_SB_:_OSC evaluation returned wrong type
[    0.265968] _OSC reqg
[    0.295088] initcall acpi_init+0x0/0xbc returned 0 after 31245 usecs
[    0.295964] calling  dock_init+0x0/0xa5 @ 1
[    296964] initcall dock_init+0x0/0xa5 returned 0 after 976 usecs
[    0.296964] calling  acpi_pci_root_init+0x0/0x2d @ 1
[    0.296964] PCI: Using host bridge windows from ACPI; if necessary, us=
e "pci=3Dnocrs" and report a bug
[    0.297124] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[    0.298252] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7=
]
[    0.298963] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff=
]
[    0.298963] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x=
000bffff]
[    0.298963] pci_root PNP0A03:00: host bridge window [mem 0x000c0000-0x=
000dffff]
[    0.298963] pci_root PNP0A03:00: host bridge window [mem 0xd0000000-0x=
febfffff]
[    0.298963] pci_root PNP0A03:00: host bridge window [mem 0xfed40000-0x=
fed8ffff]
[    0.298963] pci 0000:00:00.0: [10de:005e] type 0 class 0x000580
[    0.298984] pci 0000:00:01.0: [10de:0051] type 0 class 0x000601
[    0.299963] pci 0000:00:01.0: reg 10: [io  0x8c00-0x8fff]
[    0.300105] pci 0000:00:01.1: [10de:0052] type 0 class 0x000c05
[    0.300963] pci 0000:00:01.1: reg 10: [io  0x2080-0x209f]
[    0.300963] pci 0000:00:01.1: reg 20: [io  0x2040-0x207f]
[    0.300963] pci 0000:00:01.1: reg 24: [io  0x2000-0x203f]
[    0.300963] pci 0000:00:01.1: PME# supported from D3hot D3cold
[    0.300963] pci 0000:00:01.1: PME# disabled
[    0.300963] pci 0000:00:02.0: [10de:005a] type 0 class 0x000c03
[    0.300963] pci 0000:00:02.0: reg 10: [mem 0xd0000000-0xd0000fff]
[    0.300963] pci 0000:00:02.0: supports D1 D2
[    0.300963] pci 0000:00:02.0: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.300963] pci 0000:00:02.0: PME# disabled
[    0.300963] pci 0000:00:02.1: [10de:005b] type 0 class 0x000c03
[    0.300963] pci 0000:00:02.1: reg 10: [mem 0xd0001000-0xd00010ff]
[    0.300963] pci 0000:00:02.1: supports D1 D2
[    0.300963] pci 0000:00:02.1: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.300963] pci 0000:00:02.1: PME# disabled
[    0.300963] pci 0000:00:07.0: [10de:0054] type 0 class 0x000101
[    0.300963] pci 0000:00:07.0: reg 10: [io  0x20f0-0x20f7]
[    0.300963] pci 0000:00:07.0: reg 14: [io  0x20e0-0x20e3]
[    0.300963] pci 0000:00:07.0: reg 18: [io  0x20d0-0x20d7]
[    0.300963] pci 0000:00:07.0: reg 1c: [io  0x20c0-0x20c3]
[    0.300963] pci 0000:00:07.0: reg 20: [io  0x20b0-0x20bf]
[    0.300963] pci 0000:00:07.0: reg 24: [mem 0xd0002000-0xd0002fff]
[    0.300963] pci 0000:00:08.0: [10de:0055] type 0 class 0x000101
[    0.300963] pci 0000:00:08.0: reg 10: [io  0x2440-0x2447]
[    0.300963] pci 0000:00:08.0: reg 14: [io  0x2430-0x2433]
[    0.300963] pci 0000:00:08.0: reg 18: [io  0x2420-0x2427]
[    0.300963] pci 0000:00:08.0: reg 1c: [io  0x2410-0x2413]
[    0.300963] pci 0000:00:08.0: reg 20: [io  0x2400-0x240f]
[    0.300963] pci 0000:00:08.0: reg 24: [mem 0xd0003000-0xd0003fff]
[    0.300963] pci 0000:00:09.0: [10de:005c] type 1 class 0x000604
[    0.300963] pci 0000:00:0b.0: [10de:005d] type 1 class 0x000604
[    0.300963] pci 0000:00:0b.0: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.300963] pci 0000:00:0b.0: PME# disabled
[    0.301003] pci 0000:00:0c.0: [10de:005d] type 1 class 0x000604
[    0.301963] pci 0000:00:0c.0: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.301963] pci 0000:00:0c.0: PME# disabled
[    0.301963] pci 0000:00:0d.0: [10de:005d] type 1 class 0x000604
[    0.301963] pci 0000:00:0d.0: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.301963] pci 0000:00:0d.0: PME# disabled
[    0.301963] pci 0000:00:0e.0: [10de:005d] type 1 class 0x000604
[    0.301963] pci 0000:00:0e.0: PME# supported from D0 D1 D2 D3hot D3col=
d
[    0.301963] pci 0000:00:0e.0: PME# disabled
[    0.301963] pci 0000:00:18.0: [1022:1200] type 0 class 0x000600
[    0.301963] pci 0000:00:18.1: [1022:1201] type 0 class 0x000600
[    0.301963] pci 0000:00:18.2: [1022:1202] type 0 class 0x000600
[    0.301963] pci 0000:00:18.3: [1022:1203] type 0 class 0x000600
[    0.301963] pci 0000:00:18.4: [1022:1204] type 0 class 0x000600
[    0.302123] pci 0000:01:07.0: [1077:6312] type 0 class 0x000c04
[    0.302963] pci 0000:01:07.0: reg 10: [io  0x3000-0x30ff]
[    0.302963] pci 0000:01:07.0: reg 14: [mem 0xd0110000-0xd0110fff]
[    0.302963] pci 0000:01:07.0: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.302963] pci 0000:01:08.0: [1002:515e] type 0 class 0x000300
[    0.302963] pci 0000:01:08.0: reg 10: [mem 0xd8000000-0xdfffffff pref]
[    0.302963] pci 0000:01:08.0: reg 14: [io  0x3400-0x34ff]
[    0.302963] pci 0000:01:08.0: reg 18: [mem 0xd0100000-0xd010ffff]
[    0.302963] pci 0000:01:08.0: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.302963] pci 0000:01:08.0: supports D1 D2
[    0.302963] pci 0000:00:09.0: PCI bridge to [bus 01-01]
[    0.302963] pci 0000:00:09.0:   bridge window [io  0x3000-0x3fff]
[    0.302963] pci 0000:00:09.0:   bridge window [mem 0xd0100000-0xd01fff=
ff]
[    0.302963] pci 0000:00:09.0:   bridge window [mem 0xd8000000-0xdfffff=
ff pref]
[    0.302963] pci 0000:02:00.0: [14e4:165a] type 0 class 0x000200
[    0.302963] pci 0000:02:00.0: reg 10: [mem 0xd0200000-0xd020ffff 64bit=
]
[    0.302963] pci 0000:02:00.0: PME# supported from D3hot D3cold
[    0.302963] pci 0000:02:00.0: PME# disabled
[    0.304126] pci 0000:00:0b.0: PCI bridge to [bus 02-02]
[    0.304962] pci 0000:00:0b.0:   bridge window [mem 0xd0200000-0xd02fff=
ff]
[    0.304962] pci 0000:00:0c.0: PCI bridge to [bus 03-03]
[    0.304962] pci 0000:00:0d.0: PCI bridge to [bus 04-04]
[    0.304962] pci 0000:05:00.0: [8086:105e] type 0 class 0x000200
[    0.304962] pci 0000:05:00.0: reg 10: [mem 0xd0320000-0xd033ffff]
[    0.304962] pci 0000:05:00.0: reg 14: [mem 0xd0300000-0xd031ffff]
[    0.304962] pci 0000:05:00.0: reg 18: [io  0x4000-0x401f]
[    0.304962] pci 0000:05:00.0: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.304962] pci 0000:05:00.0: PME# supported from D0 D3hot D3cold
[    0.304962] pci 0000:05:00.0: PME# disabled
[    0.304962] pci 0000:05:00.1: [8086:105e] type 0 class 0x000200
[    0.304962] pci 0000:05:00.1: reg 10: [mem 0xd0360000-0xd037ffff]
[    0.304962] pci 0000:05:00.1: reg 14: [mem 0xd0340000-0xd035ffff]
[    0.304962] pci 0000:05:00.1: reg 18: [io  0x4020-0x403f]
[    0.304962] pci 0000:05:00.1: reg 30: [mem 0x00000000-0x0001ffff pref]
[    0.304962] pci 0000:05:00.1: PME# supported from D0 D3hot D3cold
[    0.304962] pci 0000:05:00.1: PME# disabled
[    0.304962] pci 0000:05:00.0: disabling ASPM on pre-1.1 PCIe device.  =
You can enable it with 'pcie_aspm=3Dforce'
[    0.304962] pci 0000:00:0e.0: PCI bridge to [bus 05-05]
[    0.304962] pci 0000:00:0e.0:   bridge window [io  0x4000-0x4fff]
[    0.304962] pci 0000:00:0e.0:   bridge window [mem 0xd0300000-0xd03fff=
ff]
[    0.304962] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
[    0.305050] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.P2P0._PRT]
[    0.306101] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR0._PRT]
[    0.306962] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR1._PRT]
[    0.306962] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR2._PRT]
[    0.306962] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR3._PRT]
[    0.306962]  pci0000:00: Requesting ACPI _OSC control (0x1d)
[    0.306962]  pci0000:00: ACPI _OSC request failed (AE_NOT_FOUND), retu=
rned control mask: 0x1d
[    0.306962] ACPI _OSC control for PCIe not granted, disabling ASPM
[    0.338181] initcall acpi_pci_root_init+0x0/0x2d returned 0 after 4100=
9 usecs
[    0.338957] calling  acpi_pci_link_init+0x70] ACPI: PCI Interrupt Link=
 [LNK1] (IRQs 16 17 18 19) *0
[    0.340322] ACPI: PCI Interrupt Link [LNK2] (IRQs 16 17 18 19) *0
[    0.341113] ACPI: PCI Interrupt Link [LNK3] (IRQs 16 17 18 19) *0
[    0.342231] ACPI: PCI Interrupt Link [LNK4] (IRQs 16 17 18 19) *0
[    0.343198] ACPI: PCI Interrupt Link [LNK5] (IRQs 16 17 18 19) *0, dis=
abled.
[    0.344228] ACPI: PCI Interrupt Link [LSMB] (IRQs 20 21 22 23) *0
[    0.345111] ACPI: PCI Interrupt Link [LUS0] (IRQs 20 21 22 23) *0
[    0.346105] ACPI: PCI Interrupt Link [LUS2] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.346956] ACPI: PCI Interrupt Link [LMAC] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.347112] ACPI: PCI Interrupt Link [LACI] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.348234] ACPI: PCI Interrupt Link [LMCI] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.349119] ACPI: PCI Interrupt Link [LPID] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.350123] ACPI: PCI Interrupt Link [LTID] (IRQs 20 21 22 23) *0
[    0.351123] ACPI: PCI Interrupt Link [LSI1] (IRQs 20 21 22 23) *0
[    0.352197] ACPI: PCI Interrupt Link [APCP] (IRQs 20 21 22 23) *0, dis=
abled.
[    0.353037] initcall acpi_pci_link_init+0x0/0x43 returned 0 after 1464=
6 usecs
[    0.353955] calling  pnp_init+0x0/0x12 @ 1
[    0.354019] initcall pnp_init+0x0/0x12 returned 0 after 976 usecs
[    0.354955] calling  xen_setup_shutdown_event+0x0/0x30 @ 1
[    0.354955] initcall xen_setup_shutdown_event+0x0/0x30 returned 0 afte=
r 0 usecs
[    0.354955] calling  balloon_init+0x0/0x13a @ 1
[    0.354955] xen/balloon: Initialising balloon driver.
[    0.358744] initcall balloon_init+0x0/0x13a returned 0 after 3905 usec=
s
[    0.358954] calling  xenbus_probe_backend_init+0nbus_probe_backend_ini=
t+0x0/0x57 returned 0 after 976 usecs
[    0.359954] calling  xenbus_probe_frontend_init+0x0/0x57 @ 1
[    0.360149] initcall xenbus_probe_frontend_init+0x0/0x57 returned 0 af=
ter 976 usecs
[    0.360954] calling  balloon_init+0x0/0x10e @ 1
[    0.360954] xen-balloon: Initialising balloon driver.
[    0.361049] initcall balloon_init+0x0/0x10e returned 0 after 976 usecs
[    0.361954] calling  xen_selfballoon_init+0x0/0x82 @ 1
[    0.361954] xen/balloon: Xen selfballooning driver disabled for domain=
0.
[    0.361954] initcall xen_selfballoon_init+0x0/0x82 returned -19 after =
0 usecs
[    0.361954] calling  misc_init+0x0/0xba @ 1
[    0.362148] initcall misc_init+0x0/0xba returned 0 after 976 usecs
[    0.362954] calling  vga_arb_device_init+0x0/0xde @ 1
[    0.363027] vgaarb: device added: PCI:0000:01:08.0,decodes=3Dio+mem,ow=
ns=3Dio+mem,locks=3Dnone
[    0.363953] vgaarb: loaded
[    0.363953] vgaarb: bridge control possible 0000:01:08.0
[    0.363953] initcall vga_arb_device_init+0x0/0xde returned 0 after 976=
 usecs
[    0.363953] calling  cn_init+0x0/0x9e @ 1
[    0.364099] initcall cn_init+0x0/0x9e returned 0 after 976 usecs
[    0.364953] calling  phy_init+0x0/0x2e @ 1
[    0.365055] initcall phy_init+0x0/0x2e returned 0 after 976 usecs
[    0.365953] calling  init_pcmcia_cs+0x0/0x36 @ 1
[    0.366017] initcall init_pcmcia_cs+0x0/0x36 returned 0 after 976 usec=
s
[    0.366953] calling  usb_init+0x0/0x173 @ 1
[    0.367069] usbcore: registered new interface driver usbfs
[    0.368023] usbcore: registered new interface driver hub
[    0.369057] usbcore: registered new device driver usb
[    0.369953] initcall usb_init+0x0/0x173 returned 0 after 2929 usecs
[    0.369953] calling  serio_init+0x0/0x31 @ 1
[    0.370018] initcall serio_init+0x0/0x31 returned 0 after 976 usecs
[    0.370952] calling  input_init+0x0/0x10c @ 1
[    0.371147] initcall input_init+0x0/0x10c returned 0 after 976 usecs
[    0.371952] calling  rtc_init+0x0/0x71 @ 1
[    0.372020] initcall rtc_init+0x0/0x71 returned 0 after 976 usecs
[    0.372952] calling  power_supply_class_init+0x0/0x44 @ 1
[    0.373016] initcall power_supply_class_init+0x0/0x44 returned 0 after=
 976 usecs
[    0.373952] calling  hwmon_init+0x0/0xee @ 1
[    0.374016] initcall hwmon_init+0x0/0xee returned 0 after 976 usecs
[    0.374952] calling  leds_init+0x0/0x48 @ 1
[    0.375025] initcall leds_init+0x0/0x48 returned 0 after 976 usecs
[    0.375952] calling  pci_subsys_init+0x0/0x4f @ 1
[    0.375952] PCI: Using ACPI for IRQ routing
[    0.375952] PCI: pci_cache_line_size set to 64 bytes
[    0.376071] reserve RAM buffer: 000000000009d000 - 000000000009ffff=20
[    0.376951] reserve RAM buffer: 000000007fff0000 - 000000007fffffff=20
[    0.376951] reserve RAM buffer: 00000000cfef0000 - 00000000cfffffff=20
[    0.376951] initcall pci_subsys_init+0x0/0x4f returned 0 after 976 use=
cs
[    0.376951] calling  proto_init+0x0/0x12 @ 1
[    0.376951] initcall proto_init+0x0/0x12 returned 0 after 0 usecs
[    0.376951] calling  net_dev_init+0x0/0x1b3 @ 1
[    0.377146] initcall net_dev_init+0x0/0x1b3 returned 0 after 976 usecs
[    0.377951] calling  neigh_init+0x0/0x80 @ 1
[    0.377951] initcall neigh_init+0x0/0x80 returned 0 after 0 usecs
[    0.377951] calling  fib_rules_init+0x0/0xaf @ 1
[    0.377951] initcall fib_rules_init+0x0/0xaf returned 0 after 0 usecs
[    0.377951] calling  pktsched_init+0x0/0xfe @ 1
[    0.377951] initcall pktsched_init+0x0/0xfe returned 0 after 0 usecs
[    0.377951] calling  tc_filter_init+0x0/0x55 @ 1
[    0.377951] initcall tc_filter_init+0x0/0x55 returned 0 after 0 usecs
[    0.377951] calling  tc_action_init+0x0/0x55 @ 1
[    0.377951] initcall tc_action_init+0x0/0x55 returned 0 after 0 usecs
[    0.377951] calling  genl_init+0x0/0x84 @ 1
[    0.377966] initcall genl_init+0x0/0x84 returned 0 after 976 usecs
[    0.378951] calling  cipso_v4_init+0x0/0x61 @ 1
[    0.378951] initcall cipso_v4_init+0x0/0x61 returned 0 after 0 usecs
[    0.378951] calling  netlbl_init+0x0/0x81 @ 1
[    0.378951] NetLabel: Initializing
[    0.378951] NetLabel:  domain hash size =3D 128
[    0.378951] NetLabel:  protocols =3D UNLABELED CIPSOv4
[    0.378951] NetLabel:  unlabeled traffic allowed by default
[    0.378951] initcall netlbl_init+0x0/0x81 returned 0 after 0 usecs
[    0.378951] calling  rfkill_init+0x0/0x79 @ 1
[    0.379145] initcall rfkill_init+0x0/0x79 returned 0 after 976 usecs
[    0.379951] calling  sysctl_init+0x0/0x48 @ 1
[    0.379951] initcall sysctl_init+0x0/0x48 returned 0 after 0 usecs
[    0.379951] calling  xen_p2m_debugfs+0x0/0x4a @ 1
[    0.379969] initcall xen_p2m_debugfs+0x0/0x4a returned 0 after 976 use=
cs
[    0.380951] calling  xen_spinlock_debugfs+0x0/0x24e @ 1
[    0.381017] initcall xen_spinlock_debugfs+0x0/0x24e returned 0 after 9=
76 usecs
[    0.381951] calling  hpet_late_init+0x0/0x103 @ 1
[    0.381951] initcall hpet_late_init+0x0/0x103 returned -19 after 0 use=
cs
[    0.381951] calling  init_amd_nbs+0x0/0xb8 @ 1
[    0.382006] initcall init_amd_nbs+0x0/0xb8 returned 0 after 976 usecs
[    0.382951] calling  clocksource_done_booting+0x0/0x5a @ 1
[    0.382951] Switching to clocksource xen
[    0.382974] initcall clocksource_done_booting+0x0/0x5a returned 0 afte=
r 987 usecs
[    0.383950] calling  ftrace_init_debugfs+0x0/0xcf @ 1
[    0.395940] initcall ftrace_init_debugfs+0x0/0xcf returned 0 after 377=
 usecs
[    0.396609] calling  rb_init_debugfs+0x0/0x2f @ 1
[    0.396609] initcall rb_init_debugfs+0x0/0x2f returned 0 after 5 usecs
[    0.396609] calling  tracer_init_debugfs+0x0/0x3c2 @ 1
[    0.420026] initcall tracer_init_debugfs+0x0/0x3c2 returned 0 after 53=
5 usecs
[    0.420552] calling  init_trace_printk_function_export+0x0/0x2f @ 1
[    0.420552] initcall init_trace_printk_function_export+0x0/0x2f return=
ed 0 after 5 usecs
[    0.420552] calling  event_trace_init+0x0/0x2bd @ 1
[    0.456145] initcall event_trace_init+0x0/0x2bd returned 0 after 9409 =
usecs
[    0.457058] calling  init_kprobe_trace+0x0/0 1
[    0.479551] initcall init_pipe_fs+0x0/0x4c returned 0 after 201 usecs
[    0.480367] calling  eventpoll_init+0x0/0xda @ 1
[    0.490781] initcall eventpoll_init+0x0/0xda returned 0 after 142 usec=
s
[    0.491644] calling  anon_inode_init+0x0/0x116 @ 1
[    0.491644] initcall anon_inode_init+0x0/0x116 returned 0 after 14 use=
cs
[    0.491644] calling  blk_scsi_ioctl_init+0x0/0x289 @ 1
[    0.491644] initcall blk_scsi_ioctl_init+0x0/0x289 returned 0 after 0 =
usecs
[    0.491644] calling  acpi_event_init+0x0/0x81 @ 1
[    0.525947] initcall acpi_event_init+0x0/0x81 returned 0 after 27 usec=
s
[    0.526927] calling  pnp_system_init+0x0/0x12 @ 1
[    0.537517] initcall pnp_system_init+0x0/0x12 returned 0 after 174 use=
cs
[    0.538491] calling  pnpacpi_init+0x0/0x8c @ 1
[    0.538491] pnp: PnP ACPI init
[    0.538491] ACPI: bus type pnp registered
[    0.557402] pnp 00:00: [mem 0xffc00000-0xffffffff]
[    0.558273] pnp 00:00: [mem 0xfec00000-0xfec00fff]
[    0.558273] pnp 00:00: [mem 0xfee00000-0xfeefffff]
[    0.558273] pnp 00:00: [mem 0xfed00000-0xfed00fff]
[    0.577096] system 00:00: [mem 0xffc00000-0xffffffff] could not be res=
erved
[    0.578047] system 00:00: [mem 0xfec00000-0xfec00fff] could not be res=
erved
[    0.578047] system 00:00: [mem 0xfee00000-0xfeefffff] could not be res=
erved
[    0.578047] system 00:00: [mem 0xfed00000-0xfed00fff] has been reserve=
d
[    0.578047] system 00:00: Plug and Play ACPI device, IDs PNP0c01 (acti=
ve)
[    0.611747] pnp 00:01: [bus 00-ff]
[    0.612649] pnp 00:01: [io  0x0cf8-0x0cff]
[    0.612649] pnp 00:01: [io  0x0000-0x0cf7 window]
[    0.612649] pnp 00:01: [io  0x0d00-0xffff window]
[    0.612649] pnp 00:01: [mem 0x000a0000-0x000bffff window]
[    0.612649] pnp 00:01: [mem 0x000c0000-0x000dffff window]
[    0.612649] pnp 00:01: [mem 0xd0000000-0xfebfffff window]
[    0.612649] pnp 00:01: [mem 0xfed40000-0xfed8ffff]
[    0.650423] pnp 00:01: Plug and Play ACPI device, IDs PNP0a03 (active)
[    0.651400] pnp 00:02: [mem 0xe0000000-0xefffffff]
[    0.662021] system 00:02: [mem 0xe0000000-0xefffffff] has been reserve=
d
[    0.662994] system 00:02: Plug and Play ACPI device, IDs PNP0c02 (acti=
ve)
[    0.676409] pnp 00:03: [io  0x8000-0x807f]
[    0.677057] pnp 00:03: [io  0x8080-0x80ff]
[    0.677057] pnp 00:03: [io  0x8400-0x847f]
[    0.677057] pnp 00:03: [io  0x8480-0x84ff]
[    0.677057] pnp 00:03: [io  0x8800-0x887f]
[    0.677057] pnp 00:03: [io  0x8880-0x88ff]
[    0.701260] pnp 00:03: [io  0x2040-0x207f]
[    0.702243] pnp 00:03: [io  0x2000-0x203f]
[    0.702243] pnp 00:03: [io  0x0060]
[    0.702243] pnp 00:03: [io  0x0064]
[    0.717025] system 00:03: [io  0x8000-0x807f] has been reserved
[    0.717998] system 00:03: [io  0x8080-0x80ff] has been reserved
[    0.717998] system 00:03: [io  0x8400-0x847f] has been reserved
[    0.717998] system 00:03: [io  0x8480-0x84ff] has been reserved
[    0.717998] system 00:03: [io  0x8800-0x887f] has been reserved
[    0.717998] system 00:03: [io  0x8880-0x88ff] has been reserved
[    0.717998] system 00:03: [io  0x2040-0x207f] has been reserved
[    0.717998] system 00:03: [io  0x2000-0x203f] has been reserved
[    0.717998] system 00:03: Plug and Play ACPI device, IDs PNP0c02 (acti=
ve)
[    0.771758] pnp 00:04: [irq 0 disabled]
[    0.772631] xen: registering gsi 8 triggering 1 polarity 0
[    0.781377] xen_map_pirq_gsi: returning irq 8 for gsi 8
[    0.782114] xen: --> pirq=3D8 -> irq=3D8 (gsi=3D8)
[    0.790911] pnp 00:04: [irq 8]
[    0.791898] pnp 00:04: [mem 0xfed00000-0xfed003ff]
[    0.799174] pnp 00:04: Plug and Play ACPI device, IDs PNP0103 (active)
[    0.800152] pnp 00:05: [io  0x0010-0x001f]
[    0.800152] pnp 00:05: [io  0x0022-0x003f]
[    0.800152] pnp 00:05: [io  0x0044-0x005f]
[    0.800152] pnp 00:05: [io  0x0062-0x0063]
[    0.800152] pnp 00:05: [io  0x0065-0x006f]
[    0.800152] pnp 00:05: [io  0x0072-0x0073]
[    0.800152] pnp 00:05: [io  0x0074-0x007f]
[    0.800152] pnp 00:05: [io  0x0091-0x0093]
[    0.800152] pnp 00:05: [io  0x0097-0x009f]
[    0.800152] pnp 00:05: [io  0x00a2-0x00bf]
[    0.800152] pnp 00:05: [io  0x00e0-0x00ef]
[    0.800152] pnp 00:05: [io  0x04d0-0x04d1]
[    0.855784] system 00:05: [io  0x04d0-0x04d1] has been reserved
[    0.856756] system 00:05: Plug and Play ACPI device, IDs PNP0c02 (acti=
ve)
[    0.856756] pnp 00:06: [io  0x0000-0x0008]
[    0.856756] pnp 00:06: [io  0x000a-0x000f]
[    0.856756] pnp 00:06: [io  0x0081-0x0083]
[    0.856756] pnp 00:06: [io  0x0087]
[    0.856756] pnp 00:06: [io  0x0089-0x008b]
[    0.856756] pnp 00:06: [io  0x008f]
[    0.856756] pnp 00:06: [io  0x00c0-0x00d1]
[    0.856756] pnp 00:06: [io  0x00d4-0x00df]
[    0.856756] pnp 00:06: [dma 4]
[    0.903820] pnp 00:06: Plug and Play ACPI device, IDs PNP0200 (active)
[    0.904798] pnp 00:07: [io  0x0061]
[    0.914054] pnp 00:07: Plug and Play ACPI device, IDs PNP0800 (active)
[    0.915029] pnp 00:08: [io  0x0070-0x0071]
[    0.924901] pnp 00:08: Plug and Play ACPI device, IDs PNP0b00 (active)
[    0.925879] pnp 00:09: [io  0x00f0-0x00f1]
[    0.925879] xen: registering gsi 13 triggering 1 polarity 0
[    0.941182] xen_map_pirq_gsi: returning irq 13 for gsi 13
[    0.942170] xen: --> pirq=3D13 -> irq=3D13 (gsi=3D13)
[    0.951350] pnp 00:09: [irq 13]
[    0.954661] pnp 00:09: Plug and Play ACPI device, IDs PNP0c04 (active)
[    0.955638] pnp 00:0a: [io  0x0c00-0x0c7f]
[    0.965693] system 00:0a: [io  0x0c00-0x0c7f] has been reserved
[    0.966666] system 00:0a: Plug and Play ACPI device, IDs PNP0c02 (acti=
ve)
[    0.978985] pnp 00:0b: [io  0x03f8-0x03ff]
[    0.979478] xen: registering gsi 4 triggering 1 polarity 0
[    0.988733] xen_map_pirq_gsi: returning irq 4 for gsi 4
[    0.989593] xen: --> pirq=3D4 -> irq=3D4 (gsi=3D4)
[    0.998261] Already setup the GSI :4
[    0.999250] pnp 00:0b: [irq 4]
[    1.005553] pnp 00:0b: Plug and Play ACPI device, IDs PNP0501 (active)
[    1.013548] pnp: PnP ACPI: found 12 devices
[    1.014055] ACPI: ACPI bus type pnp unregistered
[    1.014055] initcall pnpacpi_init+0x0/0x8c returned 0 after 462591 use=
cs
[    1.014055] calling  pcistub_init+0x0/0x1d7 @ 1
[    1.035975] initcall pcistub_init+0x0/0x1d7 returned 0 after 2209 usec=
s
[    1.036941] calling  chr_dev_init+0x0/0xc6 @ 1
[    1.056849] initcall chr_dev_init+0x0/0xc6 returned 0 after 9552 usecs
[    1.057782] calling  firmware_class_init+0x0/0x19_bus+0x0/0x65 @ 1
[    1.080576] initcall init_pcmcia_bus+0x0/0x65 returned 0 after 230 use=
cs
[    1.081355] calling  thermal_init+0x0/0x75 @ 1
[    1.091977] initcall thermal_init+0x0/0x75 returned 0 after 221 usecs
[    1.092763] calling  cpufreq_gov_performance_init+0x0/0x12 @ 1
[    1.092763] initcall cpufreq_gov_performance_init+0x0/0x12 returned 0 =
after 0 usecs
[    1.092763] calling  cpufreq_gov_dbs_init+0x0/0x12 @ 1
[    1.092763] initcall cpufreq_gov_dbs_init+0x0/0x12 returned 0 after 0 =
usecs
[    1.092763] calling  init_acpi_pm_clocksource+0x0/0xec @ 1
[    1.133218] PM-Timer failed consistency check  (0x0xffffff) - aborting=
.
[    1.134062] initcall init_acpi_pm_clocksource+0x63] pci 0000:00:0e.0: =
BAR 15: assigned [mem 0xd0400000-0xd04fffff pref]
[    1.154163] pci 0000:01:07.0: BAR 6: assigned [mem 0xd0120000-0xd013ff=
ff pref]
[    1.154163] pci 0000:01:08.0: BAR 6: assigned [mem 0xd0140000-0xd015ff=
ff pref]
[    1.154163] pci 0000:00:09.0: PCI bridge to [bus 01-01]
[    1.154163] pci 0000:00:09.0:   bridge window [io  0x3000-0x3fff]
[    1.154163] pci 0000:00:09.0:   bridge window [mem 0xd0100000-0xd01fff=
ff]
[    1.154163] pci 0000:00:09.0:   bridge window [mem 0xd8000000-0xdfffff=
ff pref]
[    1.154163] pci 0000:00:0b.0: PCI bridge to [bus 02-02]
[    1.154163] pci 0000:00:0b.0:   bridge window [mem 0xd0200000-0xd02fff=
ff]
[    1.154163] pci 0000:00:0c.0: PCI bridge to [bus 03-03]
[    1.154163] pci 0000:00:0d.0: PCI bridge to [bus 04-04]
[    1.154163] pci 0000:05:00.0: BAR 6: assigned [mem 0xd0400000-0xd041ff=
ff pref]
[    1.154163] pci 0000:05:00.1: BAR 6: assigned [mem 0xd0420000-0xd043ff=
ff pref]
[    1.154163] pci 0000:00:0e.0: PCI bridge to [bus 05-05]
[    1.154163] pci 0000:00:0e.0:   bridge window [io  0x4000-0x4fff]
[    1.154163] pci 0000:00:0e.0:   bridge window [mem 0xd0300000-0xd03fff=
ff]
[    1.154163] pci 0000:00:0e.0:   bridge window [mem 0xd0400000-0xd04fff=
ff pref]
[    1.154163] pci 0000:00:09.0: setting latency timer to 64
[    1.154163] pci 0000:00:0b.0: setting latency timer to 64
[    1.154163] pci 0000:00:0c.0: setting latency timer to 64
[    1.154163] pci 0000:00:0d.0: setting latency timer to 64
[    1.154163] pci 0000:00:0e.0: setting latency timer to 64
[    1.154163] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7]
[    1.154163] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff]
[    1.154163] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff]
[    1.154163] pci_bus 0000:00: resource 7 [mem 0x000c0000-0x000dffff]
[    1.154163] pci_bus 0000:00: resource 8 [mem 0xd0000000-0xfebfffff]
[    1.154163] pci_bus 0000:00: resource 9 [mem 0xfed40000-0xfed8ffff]
[    1.154163] pci_bus 0000:01: resource 0 [io  0x3000-0x3fff]
[    1.154163] pci_bus 0000:01: resource 1 [mem 0xd0100000-0xd01fffff]
[    1.154163] pci_bus 0000:01: resource 2 [mem 0xd8000000-0xdfffffff pre=
f]
[    1.154163] pci_bus 0000:02: resource 1 [mem 0xd0200000-0xd02fffff]
[    1.154163] pci_bus 0000:05: resource 0 [io  0x4000-0x4fff]
[    1.154163] pci_bus 0000:05: resource 1 [mem 0xd0300000-0xd03fffff]
[    1.154163] pci_bus 0000:05: resource 2 [mem 0xd0400000-0xd04fffff pre=
f]
[    1.154163] initcall pcibios_assign_resources+0x0/0x76 returned 0 afte=
r 217184 usecs
[    1.154163] calling  sysctl_core_init+0x0/0x38 @ 1
[    1.388361] initcall sysctl_core_init+0x0/0x38 returned 0 after 183 us=
ecs
[    1.389212] calling  inet_init+0x0/0x27d @ 1
[    1.389212] NET: Registered protocol family 2
[    1.404778] IP route cache hash table entries: 131072 (order: 8, 10485=
76 bytes)
[    1.418009] TCP established hash table entries: 524288 (order: 11, 838=
8608 bytes)
[    1.429619] TCP bind hash table entrie: Hash tables configured (establ=
ished 524288 bind 65536)
[    1.437392] TCP reno registered
[    1.446719] UDP hash table entries: 2048 (order: 4, 65536 bytes)
[    1.452796] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes)
[    1.459438] initcall inet_init+0x0/0x27d returned 0 after 58592 usecs
[    1.460337] calling  af_unix_init+0x0/0x55 @ 1
[    1.460337] NET: Registered protocol family 1
[    1.460337] initcall af_unix_init+0x0/0x55 returned 0 after 4323 usecs
[    1.460337] calling  init_sunrpc+0x0/0x73 @ 1
[    1.486196] RPC: Registered named UNIX socket transport module.
[    1.487062] RPC: Registered udp transport module.
[    1.487062] RPC: Registered tcp transport module.
[    1.487062] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    1.487062] initcall init_sunrpc+0x0/0x73 returned 0 after 22944 usecs
[    1.487062] calling  pci_apply_final_quirks+0x0/0x10c @ 1
[    1.572298] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.573058] pci 0000:00:00.0: Found enabled HT MSI Mapping
HT MSI Mapping
[    1.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.584419] pci 0000:00:0c.0: Found disabled HT MSI Mapping
[    1.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.584419] pci 0000:00:0d.0: Found disabled HT MSI Mapping
[    1.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.584419] pci 0000:00:0e.0: Found disabled HT MSI Mapping
[    1.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
[    1.584419] pci 0000:01:08.0: Boot video device
[    1.584419] PCI: CLS 64 bytes, default 64
[    1.584419] initcall pci_apply_final_quirks+0x0/0x10c returned 0 after=
 134779 usecs
[    1.584419] calling  populate_rootfs+0x0/0xd3 @ 1
[    1.672231] Trying to unpack rootfs image as initramfs...
[    2.368114] Freeing initrd memory: 238536k freed
[    2.480588] initcall populate_rootfs+0x0/0xd3 returned 0 after 789869 =
usecs
[    2.481116] calling  pci_iommu_init+0x0/0x57[    2.498905] DMA-API: pr=
eallocated 32768 debug entries
[    2.499057] DMA-API: debugging enabled by kernel config
[    2.499057] initcall pci_iommu_init+0x0/0x57 returned 0 after 16624 us=
ecs
[    2.499057] calling  calgary_fixup_tce_spaces+0x0/0x105 @ 1
[    2.499057] initcall calgary_fixup_tce_spaces+0x0/0x105 returned -19 a=
fter 0 usecs
[    2.499057] calling  irqfd_module_init+0x0/0x31 @ 1
[    2.534754] initcall irqfd_module_init+0x0/0x31 returned 0 after 524 u=
secs
[    2.535735] calling  i8259A_init_ops+0x0/0x21 @ 1
[    2.535735] initcall i8259A_init_ops+0x0/0x21 returned 0 after 1 usecs
[    2.535735] calling  vsyscall_init+0x0/0x27 @ 1
[    2.557547] initcall vsyscall_init+0x0/0x27 returned 0 after 32 usecs
[    2.558521] calling  sbf_init+0x0/0xf6 @ 1
[    2.558521] Simple Boot Flag at 0x62 set to 0x1
[    2.558521] initcall sbf_init+0x0/0xf6 returned 0 after 4483 usecs
[    2.558521] calling  init_tsc_clocksource+0x0/0x5f @ 1
[    2.558521] initcall init_tsc_clocksource+0x0/0x5f returned 0 after 5 =
usecs
[    2.558521] calling  add_rtc_cmos+0x0/0x96 @ 1
[    2.558521] initcall add_rtc_cmos+0x0/0x96 returned 0 after 3 usecs
[    2.558521] calling  i8237A_init_ops+0x0/0x14 @ 1
[    2.558521] initcall i8237A_init_ops+0x0/0x14 returned 0 after 0 usecs
[    2.558521] calling  cache_sysfs_init+0x0/0x6e @ 1
[    2.621792] initcall cache_sysfs_init+0x0/0x6e returned 0 after 3525 u=
secs
[    2.622779] calling  mcheck_init_device+0x0/0rned -5 after 0 usecs
[    2.634743] initcall mcheck_init_device+0x0/0x11f returned with error =
code -5=20
[    2.634743] calling  threshold_init_device+0x0/0x91 @ 1
[    2.634743] initcall threshold_init_device+0x0/0x91 returned 0 after 0=
 usecs
[    2.634743] calling  inject_init+0x0/0x60 @ 1
[    2.634743] Machine check injector initialized
[    2.634743] initcall inject_init+0x0/0x60 returned 0 after 4395 usecs
[    2.634743] calling  thermal_throttle_init_device+0x0/0xa3 @ 1
[    2.634743] initcall thermal_throttle_init_device+0x0/0xa3 returned 0 =
after 0 usecs
[    2.634743] calling  amd_ibs_init+0x0/0x4bc @ 1
[    2.634743] initcall amd_ibs_init+0x0/0x4bc returned -19 after 0 usecs
[    2.634743] calling  msr_init+0x0/0x150 @ 1
[    2.705693] initcall msr_init+0x0/0x150 returned 0 after 886 usecs
[    2.706682] calling  cpuid_init+0x0/0x150 @ 1
[    2.716874] initcall cpuid_init+0x0/0x150 returned 0 after 609 usecs
[    2.717862] calling  ioapic_init_ops+0x0/0x14 @ 1
[    2.717862] initcall ioapic_init_ops+0x0/0x14 returned 0 after 0 usecs
[    2.717862] calling  add_pcspkr+0x0/0x60 @ 1
[    2.738993] initcall add_pcspkr+0x0/0x60 returned 0 after 136 usecs
[    2.739980] calling  microcode_init+0x0/0x16b @ 1
[    2.750141] microcode: CPU0: patch_level=3D0x01000065
[    2.755002] microcode: CPU1: patch_level=3D0x01000065
[    2.759938] microcode: CPU2: patch_level=3D0x01000065
[    2.764875] microcode: CPU3: patch_level=3D0x01000065
[    2.769926] microcode: Microcode Update Driver: v2.00 <tigran@aivazian=
.fsnet.co.uk>, Peter Oruba
[    2.770915] initcall microcode_init+0x0/0x16b returned 0 after 28032 u=
secs
[    2.770915] calling  start_periodic_check_for_corruption+0x0/0x50 @ 1
[    2.770915] initcall start_periodic_check_for_corruption+0x0/0x50 retu=
rned 0 after 0 usecs
[    2.770915] calling  audit_classes_init+0x0/0xaf @ 1
[    2.770915] initcall audit_classes_init+0x0/0xaf returned 0 after 3 us=
ecs
[    2.770915] calling  pt_dump_init+0x0/0x30 @ 1
[    2.770915] initcall pt_dump_init+0x0/0x30 returned 0 after 12 usecs
[    2.770915] calling  ia32_binfmt_init+0x0/0x14 @ 1
[    2.770915] initcall ia32_binfmt_init+0x0/0x14 returned 0 after 17 use=
cs
[    2.770915] calling  proc_schedstat_init+0x0/0x22 @ 1
[    2.770915] initcall proc_schedstat_init+0x0/0x22 returned 0 after 6 u=
secs
[    2.770915] calling  proc_execdomains_init+0x0/0x22 @ 1
[    2.770915] initcall proc_execdomains_init+0x0/0x22 returned 0 after 6=
 usecs
[    2.770915] calling  ioresources_init+0x0/0x3c @ 1
[    2.864024] initcall ioresources_init+0x0/0x3c returned 0 after 25 use=
cs
[    2.865004] calling  uid_cache_init+0x0/0x8c @ 1
[    2.875574] initcall uid_cache_init+0x0/0x8c returned 0 after 148 usec=
s
[    2.876430] calling  init_posix_timers+0x0/0x1f4 @ 1
[    2.876430] initcall init_posix_timers+0x0/0x1f4 returned 0 after 1 us=
ecs
[    2.876430] calling  init_posix_cpu_timers+0x0/0xbf @ 1
[    2.876430] initcall init_posix_cpu_timers+0x0/0xbf returned 0 after 0=
 usecs
[    2.876430] calling  create_proc_profile+0x0/0x290 @ 1
[    2.876430] initcall create_proc_profile+0x0/0x290 returned 0 after 0 =
usecs
[    2.876430] calling  timekeeping_init_ops+0x0/0x14 @ 1
[    2.876430] initcall timekeeping_init_ops+0x0/0x14 returned 0 after 0 =
usecs
[    2.876430] calling  init_clocksource_sysfs+0x0/0x50 @ 1
[    2.936487] initcall init_clocksource_sysfs+0x0/0x50 returned 0 after =
321 usecs
[    2.937473] calling  init_timer_list_procfs+0x0/0x2c @ 1
[    2.937473] initcall init_timer_list_procfs+0x0/0x2c returned 0 after =
3 usecs
[    2.937473] calling  alarmtimer_init+0x0/0x172 @ 1
[    2.961417] initcall alarmtimer_init+0x0/0x172 returned 0 after 255 us=
ecs
[    2.962399] calling  init_tstats_procfs+0x0/0x2c @ 1
[    2.962399] initcall init_tstats_procfs+0x0/0x2c returned 0 after 3 us=
ecs
[    2.962399] calling  futex_init+0x0/0x62 @ 1
[    2.984366] initcall futex_init+0x0/0x62 returned 0 after 17 usecs
[    2.985351] calling  proc_dma_init+0x0/0x22 @ 1
[    2.985351] initcall proc_dma_init+0x0/0x22 returned 0 after 3 usecs
[    2.985351] calling  proc_modules_init+0x0/0x22 @ 1
[    2.985351] initcall proc_modules_init+0x0/0x22 returned 0 after 3 use=
cs
[    2.985351] calling  kallsyms_init+0x0/0x25 @ 1
[    2.985351] initcall kallsyms_init+0x0/0x25 returned 0 after 2 usecs
[    2.985351] calling  snapshot_device_init+0x0/0x12 @ 1
[    3.029665] initcall snapshot_device_init+0x0/0x12 returned 0 after 22=
0 usecs
[    3.030463] calling  crash_save_vmcoreinfo_init+0x0/0x46d @ 1
[    3.030463] initcall crash_save_vmcoreinfo_init+0x0/0x46d returned 0 a=
fter 20 usecs
[    3.030463] calling  crash_notes_memory_init+0x0/0x36 @ 1
[    3.030463] initcall crash_notes_memory_init+0x0/0x36 returned 0 after=
 5 usecs
[    3.030463] calling  user_namespaces_init+0x0/0x2d @ 1
[    3.030463] initcall user_namespaces_init+0x0/0x2d returned 0 after 7 =
usecs
[    3.030463] calling  pid_namespaces_init+0x0/0x2d @ 1
[    3.030463] initcall pid_namespaces_init+0x0/0x2d returned 0 after 4 u=
secs
[    3.030463] calling  audit_init+0x0/0x133 @ 1
[    3.030463] audit: initializing netlink socket (disabled)
[    3.097108] type=3D2000 audit(1319628370.680:1): initialized
[    3.098090] initcall audit_init+0x0/0x133 returned 0 after 10737 usecs
[    3.098090] calling  audit_watch_init+0x0/0x3a @ 1
[    3.098090] initcall audit_watch_init+0x0/0x3a returned 0 after 0 usec=
s
[    3.098090] calling  audit_tree_init+0x0/0x49 @ 1
[    3.098090] initcall audit_tree_init+0x0/0x49 returned 0 after 0 usecs
[    3.098090] calling  init_kprobes+0x0/0x17c @ 1
[    3.152006] initcall init_kprobes+0x0/0x17c returned 0 after 15015 use=
cs
[    3.152060] calling  irq_pm_init_ops+0x0/0x14 @ 1
[    3.152060] initcall irq_pm_init_ops+0x0/0x14 returned 0 after 0 usecs
[    3.152060] calling  utsname_sysctl_init+0x0/0x14 @ 1
[    3.152060] initcall utsname_sysctl_init+0x0/0x14 returned 0 after 61 =
usecs
[    3.152060] calling  init_tracepoints+0x0/0x20 @ 1
[    3.152060] initcall init_tracepoints+0x0/0x20 returned 0 after 0 usec=
s
[    3.152060] calling  ftrace_mod_cmd_init+0x0/0x12 @ 1
[    3.152060] initcall ftrace_mod_cmd_init+0x0/0x12 returned 0 after 0 u=
secs
[    3.152060] calling  init_events+0x0/0x61 @ 1
[    3.152060] initcall init_events+0x0/0x61 returned 0 after 3 usecs
[    3.152060] calling  init_function_trace+0x0/0x3e @ 1
[    3.152060] initcall init_function_trace+0x0/0x3e returned 0 after 1 u=
secs
[    3.152060] calling  init_graph_trace+0x0/0x66 @ 1
[    3.152060] initcall init_graph_trace+0x0/0x66 returned 0 after 1 usec=
s
[    3.152060] calling  init_blk_tracer+0x0/0x5a @ 1
[    3.152060] initcall init_blk_tracer+0x0/0x5a returned 0 after 0 usecs
[    3.152060] calling  perf_event_sysfs_init+0x0/0x93 @ 1
[    3.257059] initcall perf_event_sysfs_init+0x0/0x93 returned 0 after 5=
79 usecs
[    3.258038] calling  init_per_zone_wmark_min+0x0/0x8b @ 1
[    3.258038] initcall init_per_zone_wmark_min+0x0/0x8b returned 0 after=
 10095 usecs
[    3.258038] calling  kswapd_init+0x0/
[    3.293133] calling  extfrag_debug_init+0x0/0x72 @ 1
[    3.293133] initcall extfrag_debug_init+0x0/0x72 returned 0 after 27 u=
secs
[    3.293133] calling  setup_vmstat+0x0/0xca @ 1
[    3.293133] initcall setup_vmstat+0x0/0xca returned 0 after 43 usecs
[    3.293133] calling  mm_sysfs_init+0x0/0x29 @ 1
[    3.293133] initcall mm_sysfs_init+0x0/0x29 returned 0 after 8 usecs
[    3.293133] calling  proc_vmalloc_init+0x0/0x25 @ 1
[    3.293133] initcall proc_vmalloc_init+0x0/0x25 returned 0 after 3 use=
cs
[    3.293133] calling  procswaps_init+0x0/0x22 @ 1
[    3.348690] initcall procswaps_init+0x0/0x22 returned 0 after 23 usecs
[    3.349671] calling  hugetlb_init+0x0/0x451 @ 1
[    3.349671] HugeTLB registered 2 MB page size, pre-allocated 0 pages
[    3.366397] initcall hugetlb_init+0x0/0x451 returned 0 after 6412 usec=
s
[    3.367255] calling  slab_proc_init+0x0/0x25 @ 1
[    3.367255] initcall slab_proc_init+0x0/0x25 returned 0 after 3 usecs
[    3.367255] calling  slab_sysfs_init+0x0/0x100 @ 1
[    3.401087] initcall slab_sysfs_init+0x0/0x100 returned 0 after 10697 =
usecs
[    3.402058] calling  init_cleancache+0x0/0x1nit+0x0/0x22 returned 0 af=
ter 8 usecs
[    3.402058] calling  fsnotify_mark_init+0x0/0x40 @ 1
[    3.447465] initcall fsnotify_mark_init+0x0/0x40 returned 0 after 234 =
usecs
[    3.448451] calling  dnotify_init+0x0/0x7b @ 1
[    3.459083] initcall dnotify_init+0x0/0x7b returned 0 after 190 usecs
[    3.460049] calling  inotify_user_setup+0x0/0x70 @ 1
[    3.460049] initcall inotify_user_setup+0x0/0x70 returned 0 after 6 us=
ecs
[    3.460049] calling  aio_setup+0x0/0x9d @ 1
[    3.460049] initcall aio_setup+0x0/0x9d returned 0 after 9 usecs
[    3.460049] calling  proc_locks_init+0x0/0x22 @ 1
[    3.460049] initcall proc_locks_init+0x0/0x22 returned 0 after 3 usecs
[    3.460049] calling  init_sys32_ioctl+0x0/0x28 @ 1
[    3.503949] initcall init_sys32_ioctl+0x0/0x28 returned 0 after 121 us=
ecs
[    3.504938] calling  dquot_init+0x0/0x121 @ 1
[    3.504938] VFS: Disk quotas dquot_6.5.2
[    3.519507] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    3.520473] initcall dquot_init+0x0/0x121 returned 0 after 10549 usecs
[    3.520473] calling  init_v2_quota_format+0x0/0x22 @ 1
[    3.520473] initcall init_v2_quota_format+0x0/0x22 returned 0 after 1 =
usecs
[    3.520473] calling  quota_init+0x0/0x26 @ 1
[    3.520473] initcall quota_init+0x0/0x26 returned 0 after 5 usecs
[    3.520473] calling  proc_cmdline_init+0x0/0x22 @ 1
[    3.520473] initcall proc_cmdline_init+0x0/0x22 returned 0 after 8 use=
cs
[    3.520473] calling  proc_consoles_init+0x0/0x22 @ 1
[    3.520473] initcall proc_consoles_init+0x0/0x22 returned 0 after 3 us=
ecs
[    3.520473] calling  proc_cpuinfo_init+0x0/0x22 @ 1
[    3.520473] initcall proc_cpuinfo_init+0x0/0x22 returned 0 after 2 use=
cs
[    3.520473] calling  proc_devices_init+0x0/0x22 @ 1
[    3.520473] initcall proc_devices_init+0x0/0x22 returned 0 after 3 use=
cs
[    3.520473] calling  proc_interrupts_init+0x0/0x22 @ 1
[    3.520473] initcall proc_interrupts_init+0x0/0x22 returned 0 after 3 =
usecs
[    3.520473] calling  proc_loadavg_init+0x0/0x22 @ 1
[    3.520473] initcall proc_loadavg_init+0x0/0x22 returned 0 after 2 use=
cs
[    3.520473] calling  proc_meminfo_init+0x0/0x22 @ 1
[    3.520473] initcall proc_meminfo_init+0x0/0x22 returned 0 after 2 use=
cs
[    3.520473] calling  proc_stat_init+0x0/0x22 @ 1
[    3.520473] initcall proc_stat_init+0x0/0x22 returned 0 after 3 usecs
[    3.520473] calling  proc_uptime_init+0x0/0x22 @ 1
[    3.520473] initcall proc_uptime_init+0x0/0x22 returned 0 after 3 usec=
s
[    3.520473] calling  proc_version_init+0x0/0x22 @ 1
[    3.520473] initcall proc_version_init+0x0/0x22 returned 0 after 3 use=
cs
[    3.520473] calling  proc_softirqs_init+0x0/0x22 @ 1
[    3.520473] initcall proc_softirqs_init+0x0/0x22 returned 0 after 3 us=
ecs
[    3.520473] calling  proc_kcore_init+0x0/0xa9 @ 1
[    3.520473] initcall proc_kcore_init+0x0/0xa9 returned 0 after 8 usecs
[    3.520473] calling  vmcore_init+0x0/0x39b @ 1
[    3.520473] initcall vmcore_init+0x0/0x39b returned 0 after 0 usecs
[    3.520473] calling  proc_kmsg_init+0x0/0x25 @ 1
[    3.520473] initcall proc_kmsg_init+0x0/0x25 returned 0 after 3 usecs
[    3.520473] calling  proc_page_init+0x0/0x42 @ 1
[    3.721888] initcall proc_page_init+0x0/0x42 returned 0 after 43 usecs
[    3.722849] calling  init_devpts_fs+0x0/0x4c @ 1
[    3.722849] initcall init_devpts_fs+0x0/0x4c returned 0 after 20 usecs
[    3.722849] calling  init_ramfs_fs+0x0/0x12 @ 1
[    3.722849] initcall init_ramfs_fs+0x0/0x12 returned 0 after 0 usecs
[    3.722849] calling  init_hugetlbfs_fs+0x0/0x98 @ 1
[    3.756080] initcall init_hugetlbfs_fs+0x0/0x98 returned 0 after 470 u=
secs
[    3.757019] calling  init_fat_fs+0x0/0x4f @ 1
[    3.767631] initcall init_fat_fs+0x0/0x4f returned 0 after 289 usecs
[    3.768620] calling  init_vfat_fs+0x0/0x12 @ 1
[    3.768620] initcall init_vfat_fs+0x0/0x12 returned 0 after 1 usecs
[    3.768620] calling  init_msdos_fs+0x0/0x12 @ 1
[    3.768620] initcall init_msdos_fs+0x0/0x12 returned 0 after 0 usecs
[    3.768620] calling  init_iso9660_fs+0x0/0x77 @ 1
[    3.800749] initcall init_iso9660_fs+0x0/0x77 returned 0 after 227 use=
cs
[    3.801688] calling  init_nfs_fs+0x0/0x150 @ 1
[    3.812546] initcall init_nfs_fs+0x0/0x150 returned 0 after 620 usecs
[    3.813472] calling  init_nlm+0x0/0x22 @ 1
[    3.813472] initcall init_nlm+0x0/0x22 returned 0 after 79 usecs
[    3.813472] calling  init_nls_cp437+0x0/0x12 @ 1
[    3.813472] initcall init_nls_cp437+0x0/0x12 returned 0 after 1 usecs
[    3.813472] calling  init_nls_ascii+0x0/0x12 @ 1
[    3.813472] initcall init_nls_ascii+0x0/0x12 returned 0 after 0 usecs
[    3.813472] calling  init_nls_iso8859_1+0x0/0x12 @ 1
[    3.813472] initcall init_nls_iso8859_1+0x0/0x12 returned 0 after 0 us=
ecs
[    3.813472] calling  init_nls_utf8+0x0/0x2b @ 1
[    3.813472] initcall init_nls_utf8+0x0/0x2b returned 0 after 1 usecs
[    3.813472] calling  init_ntfs_fs+0x0/0x1d1 @ 1
[    3.813472] NTFS driver 2.1.30 [Flags: R/W].
[    3.883777] initcall init_ntfs_fs+0x0/0x1d1 returned 0 after 4739 usec=
s
[    3.884764] calling  init_autofs4_fs+0x0/0x26 @ 1
[    3.895263] initcall init_autofs4_fs+0x0/0x26 returned 0 after 145 use=
cs
[    3.896249] calling  ipc_init+0x0/0x23 @ 1
[    3.896249] msgmni has been set to 6332
[    3.896249] initcall ipc_init+0x0/0x23 returned 0 after 3808 usecs
[    3.896249] calling  ipc_sysctl_init+0x0/0x14 @ 1
[    3.921105] initcall ipc_sysctl_init+0x0/0x14 returned 0 after 130 use=
cs
[    3.922071] calling  init_mqueue_fs+0x0/0xb4 @ 1
[    3.932833] initcall init_mqueue_fs+0x0/0xb4 returned 0 after 383 usec=
s
[    3.933746] calling  key_proc_init+0x0/0x5e @ 1
[    3.933746] initcall key_proc_init+0x0/0x5e returned 0 after 6 usecs
[    3.933746] calling  selinux_nf_ip_init+0x0/0x69 @ 1
[    3.933746] initcall selinux_nf_ip_init+0x0/0x69 returned 0 after 0 us=
ecs
[    3.933746] calling  init_sel_fs+0x0/0x9e @ 1
[    3.933746] initcall init_sel_fs+0x0/0x9e returned 0 after 0 usecs
[    3.933746] calling  selnl_init+0x0/0x4d @ 1
[    3.977248] initcall selnl_init+0x0/0x4d returned 0 after 19 usecs
[    3.978236] calling  sel_netif_init+0x0/0x66 @ 1
[    3.978236] initcall sel_netif_init+0x0/0x66 returned 0 after 0 usecs
[    3.978236] calling  sel_netnode_init+0x0/0x75 @ 1
[    3.978236] initcall sel_netnode_init+0x0/0x75 returned 0 after 0 usec=
s
[    3.978236] calling  sel_netport_init+0x0/0x75 @ 1
[    3.978236] initcall sel_netport_init+0x0/0x75 returned 0 after 0 usec=
s
[    3.978236] calling  aurule_init+0x0/0x37 @ 1
[    3.978236] initcall aurule_init+0x0/0x37 returned 0 after 0 usecs
[    3.978236] calling  crypto_wq_init+0x0/0x31 @ 1
[    4.033335] initcall crypto_wq_init+0x0/0x31 returned 0 after 361 usec=
s
[    4.034308] calling  crypto_algapi_init+0x0/0xd @ 1
[    4.034308] initcall crypto_algapi_init+0x0/0xd returned 0 after 3 use=
cs
[    4.034308] calling  skcipher_module_init+0x0/0x36 @ 1
[    4.034308] initcall skcipher_module_init+0x0/0x36 returned 0 after 0 =
usecs
[    4.034308] calling  chainiv_module_init+0x0/0x12 @ 1
[    4.034308] initcall chainiv_module_init+0x0/0x12 returned 0 after 1 u=
secs
[    4.034308] calling  eseqiv_module_init+0x0/0x12 @ 1
[    4.034308] initcall eseqiv_module_init+0x0/0x12 returned 0 after 0 us=
ecs
[    4.034308] calling  hmac_module_init+0x0/0x12 @ 1
[    4.034308] initcall hmac_module_init+0x0/0x12 returned 0 after 0 usec=
s
[    4.034308] calling  md5_mod_init+0x0/0x12 @ 1
[    4.103980] initcall md5_mod_init+0x0/0x12 returned 0 after 277 usecs
[    4.104968] calling  sha1_generic_mod_init+0x0/0x12 @ 1
[    4.115769] initcall sha1_generic_mod_init+0x0/0x12 returned 0 after 1=
04 usecs
[    4.116751] calling  crypto_cbc_module_init+0x0/0x12 @ 1
[    4.116751] initcall crypto_cbc_module_init+0x0/0x12 returned 0 after =
0 usecs
[    4.116751] calling  des_generic_mod_init+0x0/0x3f @ 1
[    4.140886] initcall des_generic_mod_init+0x0/0x3f returned 0 after 18=
9 usecs
[    4.141874] calling  zlib_mod_init+0x0/0x12 @ 1
[    4.152688] initcall zlib_mod_init+0x0/0x12 returned 0 after 103 usecs
[    4.153669] calling  crypto_authenc_module_init+0x0/0x12 @ 1
[    4.153669] initcall crypto_authenc_module_init+0x0/0x12 returned 0 af=
ter 0 usecs
[    4.153669] calling  crypto_authenc_esn_module_init+0x0/0x12 @ 1
[    4.153669] initcall crypto_authenc_esn_module_init+0x0/0x12 returned =
0 after 0 usecs
[    4.153669] calling  krng_mod_init+0x0/0x12 @ 1
[    4.191133] initcall krng_mod_init+0x0/0x12 returned 0 after 188 usecs
[    4.192121] calling  proc_genhd_init+0x0/0x3c @ 1
[    4.202412] initcall proc_genhd_init+0x0/0x3c returned 0 after 27 usec=
s
[    4.203388] calling  bsg_init+0x0/0x12e @ 1
[    4.213764] Block layer SCSI generic (bsg) driver version 0.4 loaded (=
major 253)
[    4.214752] initcall bsg_init+0x0/0x12e returned 0 after 7668 usecs
[    4.214752] calling  noop_init+0x0/0x14 @ 1
[    4.214752] io scheduler noop registered
[    4.214752] initcall noop_init+0x0/0x14 returned 0 after 3886 usecs
[    4.214752] calling  deadline_init+0x0/0x14 @ 1
[    4.214752] io scheduler deadline registered
[    4.214752] initcall deadline_init+0x0/0x14 returned 0 after 4224 usec=
s
[    4.214752] calling  cfq_init+0x0/0x9e @ 1
[    4.261873] io scheduler cfq registered (default)
[    4.262857] initcall cfq_init+0x0/0x9e returned 0 after 4724 usecs
[    4.262857] calling  percpu_counter_startup+0x0/0x33 @ 1
[    4.262857] initcall percpu_counter_startup+0x0/0x33 returned 0 after =
1 usecs
[    4.262857] calling  dynamic_debug_init_debugfs+0x0/0x6a @ 1
[    4.291081] initcall dynamic_debug_init_debugfs+0x0/0x6a returned 0 af=
ter 43 usecs
[    4.292043] calling  pci_proc_init+0x0/0x6a @ 1
[    4.303505] initcall pci_proc_init+0x0/0x6a returned 0 after 261 usecs
[    4.304337] calling  pcie_portdrv_init+0x0/0x7a @ 1
[    4.315345] pcieport 0000:00:0b.0: setting latency timer to 64
(XEN) physdev.c:155: dom0: wrong map_pirq type 3
[    4.325783] pcieport 0000:00:0c.0: setting latency timer to 64
[    4.332134] pcieport 0000:00:0d.0: setting latency timer to 64
[    4.338343] pcieport 0000:00:0e.0: setting latency timer to 64
[    4.344598] initcall pcie_portdrv_init+0x0/0x7a returned 0 after 28974=
 usecs
[    4.345583] calling  aer_service_init+0x0/0x22 @ 1
[    4.356587] initcall aer_service_init+0x0/0x22 returned 0 after 131 us=
ecs
[    4.357574] calling  ioapic_init+0x0/0x1b @ 1
[    4.367906] initcall ioapic_init+0x0/0x1b returned 0 after 155 usecs
[    4.368892] calling  pci_hotplug_init+0x0/0x1d @ 1
[    4.368892] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
[    4.368892] initcall pci_hotplug_init+0x0/0x1d returned 0 after 5491 u=
secs
[    4.368892] calling  pcifront_init+0x0/0x5e @ 1
[    4.368892] initcall pcifront_init+0x0/0x5e returned -19 after 0 usecs
[    4.368892] calling  genericbl_init+0x0/0x12 @ 1
[    4.408737] initcall genericbl_init+0x0/0x12 returned 0 after 139 usec=
s
[    4.409724] calling  cirrusfb_init+0x0/0xcf @ 1
[    4.420073] initcall cirrusfb_init+0x0/0xcf returned 0 after 170 usecs
[    4.421050] calling  efifb_init+0x0/0x1fc @ 1
[    4.421050] initcall efifb_init+0x0/0x1fc returned -19 after 4 usecs
[    4.421050] calling  acpi_reserve_resources+0x0/0xeb @ 1
[    4.421050] initcall acpi_reserve_resources+0x0/0xeb returned 0 after =
3 usecs
[    4.421050] calling  irqrouter_init_ops+0x0/0x26 @ 1
[    4.421050] initcall irqrouter_init_ops+0x0/0x26 returned 0 after 0 us=
ecs
[    4.421050] calling  acpi_ac_init+0x0/0x28 @ 1
[    4.466486] initcall acpi_ac_init+0x0/0x28 returned 0 after 196 usecs
[    4.467474] calling  acpi_button_init+0x0/0x12 @ 1
[    4.477954] input: Power Button as /devices/LNXSYSTM:00/device:00/PNP0=
C0C:00/input/input0
[    4.478939] ACPI: Power Button [PWRB]
[    4.490046] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/in=
put/input1
[    4.491034] ACPI: Power Button [PWRF]
[    4.501283] initcall acpi_button_init+0x0/0x12 returned 0 after 22996 =
usecs
[    4.502271] calling  acpi_fan_init+0x0/0x18 @ 1
[    4.512966] initcall acpi_fan_init+0x0/0x18 returned 0 after 168 usecs
[    4.513952] calling  acpi_processor_init+0x0/0xcd @ 1
[    4.513952] ACPI: acpi_idle yielding to (null)
[    4.530746] initcall acpi_processor_init+0x0/0xcd returned 0 after 603=
8 usecs
[    4.531593] calling  acpi_container_init+0x0/0x4a @ 1
[    4.547835] initcall acpi_container_init+0x0/0x4a returned 0 after 476=
3 usecs
[    4.548575] calling  acpi_thermal_init+0x0/0x42 @ 1
[    4.560053] initcall acpi_thermal_init+0x0/0x42 returned 0 after 184 u=
secs
[    4.561041] calling  acpi_battery_init+0x0/0x16 @ 1
[    4.561041] initcall acpi_battery_init+0x0/0x16 returned 0 after 5 use=
cs
[    4.571853] calling  1_acpi_battery_init_async+0x0/0x1b @ 5
[    4.572171] initcall 1_acpi_battery_init_async+0x0/0x1b returned 0 aft=
er 303 usecs
[    4.561041] calling  init+0x0/0x12 @ 1
[    4.595751] initcall init+0x0/0x12 returned 0 after 128 usecs
[    4.596739] calling  xenbus_probe_initcall+0x0/0x3b @ 1
[    4.596739] initcall xenbus_probe_initcall+0x0/0x3b returned 0 after 0=
 usecs
[    4.596739] calling  gntdev_init+0x0/0x4d @ 1
[    4.618410] initcall gntdev_init+0x0/0x4d returned 0 after 156 usecs
[    4.619396] calling  gntalloc_init+0x0/0x68 @ 1
[    4.629445] initcall gntalloc_init+0x0/0x68 returned 0 after 129 usecs
[    4.630431] calling  hypervisor_subsys_init+0x0/0x25 @ 1
[    4.630431] initcall hypervisor_subsys_init+0x0/0x25 returned 0 after =
0 usecs
[    4.630431] calling  hyper_sysfs_init+0x0/0xfb @ 1
[    4.630431] initcall hyper_sysfs_init+0x0/0xfb returned 0 after 15 use=
cs
[    4.630431] calling  platform_pci_module_init+0x0/0x29 @ 1
[    4.630431] initcall platform_pci_module_init+0x0/0x29 returned -19 af=
ter 0 usecs
[    4.630431] calling  xen_tmem_init+0x0/0x5c @ 1
[    4.630431] initcall xen_tmem_init+0x0/0x5c returned 0 after 0 usecs
[    4.630431] calling  xen_pcibk_init+0x0/0x152 @ 1
[    4.688965] xen-pciback: backend is vpci
[    4.693053] initcall xen_pcibk_init+0x0/0x152 returned 0 after 4056 us=
ecs
[    4.694036] calling  pty_init+0x0/0x524 @ 1
[    4.775581] initcall pty_init+0x0/0x524 returned 0 after 69853 usecs
[    4.776565] calling  sysrq_init+0x0/0x78 @ 1
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] console [hvc0] enabled
[    4.798374] co=EE

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:42:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:42:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJS65-0000O5-W3; Thu, 27 Oct 2011 08:42:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRzC-0006oG-5N
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:35:18 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1319729714!1283131!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15243 invoked from network); 27 Oct 2011 15:35:15 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 15:35:15 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8624638"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 15:35:14 +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, 27 Oct 2011 16:35:14 +0100
Subject: Re: [Xen-devel] Prevent vif-bridge from adding user-created tap
	interfaces to a bridge
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Date: Thu, 27 Oct 2011 16:35:14 +0100
In-Reply-To: <20137.29945.290531.658615@mariner.uk.xensource.com>
References: <4EA7396D.30103@suse.com>
	<20137.29945.290531.658615@mariner.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: <1319729714.9436.146.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Jim Fehlig <jfehlig@suse.com>, 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 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"):
> > 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.

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 08:43:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 08:43:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJS74-0000qA-B8; Thu, 27 Oct 2011 08:43:26 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJS5s-0000GX-3b
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 08:42:12 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1319730127!1923980!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2154 invoked from network); 27 Oct 2011 15:42:09 -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; 27 Oct 2011 15:42:09 -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
	p9RFg6fZ008627
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 15:42:07 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
	p9RFg6Y1006383
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 15:42:06 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
	p9RFg0GN032416; Thu, 27 Oct 2011 10:42:00 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 27 Oct 2011 08:42:00 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 2A02F82C29; Thu, 27 Oct 2011 11:41:59 -0400 (EDT)
Date: Thu, 27 Oct 2011 11:41:59 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Christopher S. Aker" <caker@theshore.net>
Subject: Re: [Xen-devel] Linux 3.1 domU + ext3 = WARNING: at fs/ext3/inode.c
Message-ID: <20111027154159.GB2909@phenom.dumpdata.com>
References: <4EA71270.2050303@theshore.net>
	<20111025201239.GA13747@phenom.dumpdata.com>
	<BCD23F9B-BB0B-429B-882C-80077B1D234F@theshore.net>
	<20111025211512.GA2561@phenom.dumpdata.com>
	<4EA86D00.1080906@theshore.net>
	<20111026203652.GA10737@phenom.dumpdata.com>
	<4EA87A5C.6060100@theshore.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EA87A5C.6060100@theshore.net>
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.0A090207.4EA97BCF.00A2:SCFMA922111,ss=1,re=-4.000,fgs=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, Oct 26, 2011 at 05:23:40PM -0400, Christopher S. Aker wrote:
> On 10/26/11 4:36 PM, Konrad Rzeszutek Wilk wrote:
> > I am going to bet that if you compile 3.0.4 or 3.0.6 with that
> > fancy new config option that turns EXT3_ORDERED_something you will
> > see the same exact problem.
> 
> Switching that back to match my 3.0 config is the first thing I
> tried, with no joy.
> 
> I'll reset and try a few more ideas...

OK. I am kind of lost of what made all this happen - there was nothing
between 3.0 and 3.1 in the Xen blkfront code.

Perhaps there is something new and fancy in the Ext3 (or ext4) that is
causing all this mayhem?



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 09:05:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 09:05:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJSSh-0001dW-ME; Thu, 27 Oct 2011 09:05:47 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJSQ0-0001Nh-0z
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 09:03:03 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-12.tower-27.messagelabs.com!1319731354!42331171!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5707 invoked from network); 27 Oct 2011 16:02:34 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-12.tower-27.messagelabs.com with SMTP;
	27 Oct 2011 16:02:34 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id 8C8B8C56109;
	Thu, 27 Oct 2011 17:02:52 +0100 (BST)
Date: Thu, 27 Oct 2011 17:02:52 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Stefan Bader <stefan.bader@canonical.com>
Subject: Re: [Xen-devel] Re: PV drivers on HVM using Xen 4.1.1
Message-ID: <86563686285431BD96E171DB@nimrod.local>
In-Reply-To: <4EA9741C.7020702@canonical.com>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>
	<30C4B98DD463F3E19F28AA88@nimrod.local>
	<4EA9741C.7020702@canonical.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>
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 27 October 2011 17:09:16 +0200 Stefan Bader 
<stefan.bader@canonical.com> wrote:

>> We now see pv block devices on hvm.
>>
> Hm, you mean in dom0? Strangely I do not have this loaded and still get
> pv disks on hvm...

I mean that without doing
   modprobe xen_gntdev
on dom0, I do not see pv block devices on hvm in a domU.

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 09:08:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 09:08:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJSVd-0002DN-OO; Thu, 27 Oct 2011 09:08:49 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJSR6-0001Pr-9I
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 09:04:12 -0700
X-Env-Sender: alex@alex.org.uk
X-Msg-Ref: server-3.tower-174.messagelabs.com!1319731445!25549014!1
X-Originating-IP: [89.16.176.221]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30534 invoked from network); 27 Oct 2011 16:04:05 -0000
Received: from mail.avalus.com (HELO mail.avalus.com) (89.16.176.221)
	by server-3.tower-174.messagelabs.com with SMTP;
	27 Oct 2011 16:04:05 -0000
Received: from [172.16.2.233] (unknown [109.231.64.198])
	by mail.avalus.com (Postfix) with ESMTPSA id 2F40AC56109;
	Thu, 27 Oct 2011 17:04:04 +0100 (BST)
Date: Thu, 27 Oct 2011 17:04:03 +0100
From: Alex Bligh <alex@alex.org.uk>
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] Re: PV drivers on HVM using Xen 4.1.1
Message-ID: <060EB4C4D628BADA5C8A78DF@nimrod.local>
In-Reply-To: <1319728400.9436.143.camel@zakaz.uk.xensource.com>
References: <A853EEFF3A385ED3FA09E5F0@nimrod.local>	
	<30C4B98DD463F3E19F28AA88@nimrod.local>
	<1319728400.9436.143.camel@zakaz.uk.xensource.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>
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

Ian,

--On 27 October 2011 16:13:20 +0100 Ian Campbell <Ian.Campbell@citrix.com> 
wrote:

> If you are using gntdev then are you running a qemu to provide the
> backend?

We are using tap:aio:/path/to/file which I think we have established
would fall back to qemu in the absence of blktap, as blkback only
works with block devices.

-- 
Alex Bligh

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 09:15:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 09: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 1RJScL-0002j3-Uc; Thu, 27 Oct 2011 09:15:45 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJSbb-0002WR-18
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 09:14:59 -0700
X-Env-Sender: evil.dani@gmail.com
X-Msg-Ref: server-2.tower-174.messagelabs.com!1319732095!36896899!1
X-Originating-IP: [209.85.161.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6290 invoked from network); 27 Oct 2011 16:14:55 -0000
Received: from mail-fx0-f43.google.com (HELO mail-fx0-f43.google.com)
	(209.85.161.43)
	by server-2.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 16:14:55 -0000
Received: by faat9 with SMTP id t9so3822995faa.30
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 09:14:55 -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
	:content-transfer-encoding;
	bh=34HznE9ulelD4DVqPFGGqJUemIP1pJmfuHSQqf48S4k=;
	b=dHfUWsJ04OsyxzeYrsepNYC/EIAJBxlEKO5llcW38nEks/YfrzZyyTWtwYkJjrIOUm
	RLxXoAe66PmveIlH751VySP6IOVGSF2fW64XKCWplH9EPKy2+pCjsCGbbgMrRMjWroto
	PErEJRPx6LJuRlzUxKx1wY9r3qEFWA3XGytJI=
MIME-Version: 1.0
Received: by 10.223.6.15 with SMTP id 15mr30015698fax.4.1319732095531; Thu, 27
	Oct 2011 09:14:55 -0700 (PDT)
Received: by 10.223.72.205 with HTTP; Thu, 27 Oct 2011 09:14:55 -0700 (PDT)
Date: Fri, 28 Oct 2011 01:14:55 +0900
Message-ID: <CAP2B85_+mKNBYTJp27Akcu9YZioAFyoGs2ziSDamiMohWMbgFA@mail.gmail.com>
From: Daniel Castro <evil.dani@gmail.com>
To: xen-devel@lists.xensource.com, seabios@seabios.org
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Cc: 
Subject: [Xen-devel] Question on virtual block 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

Hello All,

I am connecting my front and back for a block device.
I have collected from xenstore sectors, sector-size. But I also need:
    u16 heads;      // # heads
    u16 cylinders;  // # cylinders
    u16 spt;        // # sectors / track
I guess from the SeaBIOS perspective they are required, but from the
xen perspective how can I get them? pure math/translation?

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 Thu Oct 27 09:19:46 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 09:19:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJSgD-000397-TA; Thu, 27 Oct 2011 09:19:45 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJSfZ-0002xF-0e
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 09:19:05 -0700
X-Env-Sender: Stefano.Stabellini@eu.citrix.com
X-Msg-Ref: server-13.tower-182.messagelabs.com!1319732341!457592!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6525 invoked from network); 27 Oct 2011 16:19:01 -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;
	27 Oct 2011 16:19:01 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8625584"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 16:18:35 +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, 27 Oct 2011 17:18:35 +0100
Date: Thu, 27 Oct 2011 17:19:04 +0100
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.1110271659380.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 DOCDAY] introduce an xl man page in pod format
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 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.
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>]
+
+=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 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.
+
+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.
+
+=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.
+
+=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
+domain OS any chance to react, and is the equivalent of ripping the
+power cord out on a physical machine.  In most cases you will want to
+use the B<shutdown> command instead.
+
+=item B<domid> I<domain-name>
+
+Converts a domain name to a domain id.
+
+=item B<domname> I<domain-id>
+
+Converts a domain id to a domain name.
+
+=item B<rename> I<domain-id> I<new-name>
+
+Change the domain name of I<domain-id> to I<new-name>.
+
+=item B<dump-core> I<domain-id> [I<filename>]
+
+Dumps the virtual machine's memory for the specified domain to the
+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<help> [I<--long>]
+
+Displays the short help message (i.e. common commands).
+
+The I<--long> option prints out the complete set of B<xl> subcommands,
+grouped by function.
+
+=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?
+
+=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?
+
+=back
+
+B<NOTES>
+
+=over 4
+
+The Time column is deceptive.  Virtual IO (network and block devices)
+used by domains requires coordination by Domain0, which means that
+Domain0 is actually charged for much of the time that a DomainU is
+doing IO.  Use of this time value to determine relative utilizations
+by domains is thus very suspect, as a high IO workload may show as
+less utilized than a high CPU workload.  Consider yourself warned.
+
+=back
+
+=item B<mem-max> I<domain-id> I<mem>
+
+Specify the maximum amount of memory the domain is able to use, appending 't'
+for terabytes, 'g' for gigabytes, 'm' for megabytes, 'k' for kilobytes and 'b'
+for bytes.
+
+The mem-max value may not correspond to the actual memory used in the
+domain, as it may balloon down its memory to give more back to the OS.
+
+=item B<mem-set> I<domain-id> I<mem>
+
+Set the domain's used memory using the balloon driver; append 't' for
+terabytes, 'g' for gigabytes, 'm' for megabytes, 'k' for kilobytes and 'b' for
+bytes.
+
+Because this operation requires cooperation from the domain operating
+system, there is no guarantee that it will succeed.  This command will
+definitely not work unless the domain has the required paravirt
+driver.
+
+B<Warning:> There is no good way to know in advance how small of a
+mem-set will make a domain unstable and cause it to crash.  Be very
+careful when using this command on running domains.
+
+=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.
+
+=item B<-C> I<config>
+
+Send <config> instead of config file from creation.
+
+=back
+
+=item B<pause> I<domain-id>
+
+Pause a domain.  When in a paused state the domain will still consume
+allocated resources such as memory, but will not be eligible for
+scheduling by the Xen hypervisor.
+
+=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.  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.
+
+=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.
+
+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<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.
+
+=item B<unpause> I<domain-id>
+
+Moves a domain out of the paused state.  This will allow a previously
+paused domain to now be eligible for scheduling by the Xen hypervisor.
+
+=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.
+
+=item B<vcpu-list> [I<domain-id>]
+
+Lists VCPU information for a specific domain.  If no domain is
+specified, VCPU information for all domains will be provided.
+
+=item B<vcpu-pin> I<domain-id> I<vcpu> I<cpus>
+
+Pins the VCPU to only run on the specific CPUs.  The keyword
+B<all> can be used to apply the I<cpus> list to all VCPUs in the
+domain.
+
+Normally VCPUs can float between available CPUs whenever Xen deems a
+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<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.
+
+=back
+
+=head1 XEN HOST SUBCOMMANDS
+
+=over 4
+
+=item B<debug-keys> I<keys>
+
+Send debug I<keys> to Xen.
+
+=item B<dmesg> [B<-c>]
+
+Reads the Xen message buffer, similar to dmesg on a Linux system.  The
+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.
+
+Sample output looks as follows (lines wrapped manually to make the man
+page more readable):
+
+ host                   : talon
+ release                : 2.6.12.6-xen0
+ 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.
+
+=item B<free_memory>
+
+Available memory (in MB) not allocated to Xen, or any other domains.
+
+=item B<xen_caps>
+
+The Xen version and architecture.  Architecture values can be one of:
+x86_32, x86_32p (i.e. PAE enabled), x86_64, ia64.
+
+=item B<xen_changeset>
+
+The Xen mercurial changeset id.  Very useful for determining exactly
+what version of code your Xen system was built from.
+
+=back
+
+B<OPTIONS>
+
+=over 4
+
+=item B<-n>, B<--numa>
+
+List host NUMA topology information
+
+=back
+
+=item B<top>
+
+Executes the B<xentop> command, which provides real time monitoring of
+domains.  Xentop is a curses interface, and reasonably self
+explanatory.
+
+=item B<uptime>
+
+Prints the current uptime of the domains running.
+
+=item B<pci-list-assignable-devices>
+
+List all the assignable PCI devices.
+
+=back
+
+=head1 SCHEDULER SUBCOMMANDS
+
+Xen ships with a number of domain schedulers, which can be set at boot
+time with the B<sched=> parameter on the Xen command line.  By
+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>] ] ]
+
+Set 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>
+
+=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.
+
+=item I<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
+is expressed in percentage of one physical CPU: 100 is 1 physical CPU,
+50 is half a CPU, 400 is 4 CPUs, etc. The default, 0, means there is
+no upper cap.
+
+=back
+
+=back
+
+=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.
+
+=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>.
+
+=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.  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.
+
+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.
+
+=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>
+
+=head1 BUGS
+
+Send bugs to xen-devel@lists.xensource.com.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 09:23:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 09:23:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJSkI-0003fg-Sd; Thu, 27 Oct 2011 09:23:58 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJSjs-0003Tq-Qg
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 09:23:33 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319732609!36943603!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26928 invoked from network); 27 Oct 2011 16:23:29 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-4.tower-174.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 27 Oct 2011 16:23:29 -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 66B912654;
	Thu, 27 Oct 2011 19:23:28 +0300 (EEST)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 4934B200AF; Thu, 27 Oct 2011 19:23:28 +0300 (EEST)
Date: Thu, 27 Oct 2011 19:23:28 +0300
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: Re: [Xen-devel] Linux 3.1 domU + ext3 = WARNING: at fs/ext3/inode.c
Message-ID: <20111027162327.GQ12984@reaktio.net>
References: <4EA71270.2050303@theshore.net>
	<20111025201239.GA13747@phenom.dumpdata.com>
	<BCD23F9B-BB0B-429B-882C-80077B1D234F@theshore.net>
	<20111025211512.GA2561@phenom.dumpdata.com>
	<4EA86D00.1080906@theshore.net>
	<20111026203652.GA10737@phenom.dumpdata.com>
	<4EA87A5C.6060100@theshore.net>
	<20111027154159.GB2909@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111027154159.GB2909@phenom.dumpdata.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
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 Thu, Oct 27, 2011 at 11:41:59AM -0400, Konrad Rzeszutek Wilk wrote:
> On Wed, Oct 26, 2011 at 05:23:40PM -0400, Christopher S. Aker wrote:
> > On 10/26/11 4:36 PM, Konrad Rzeszutek Wilk wrote:
> > > I am going to bet that if you compile 3.0.4 or 3.0.6 with that
> > > fancy new config option that turns EXT3_ORDERED_something you will
> > > see the same exact problem.
> > 
> > Switching that back to match my 3.0 config is the first thing I
> > tried, with no joy.
> > 
> > I'll reset and try a few more ideas...
> 
> OK. I am kind of lost of what made all this happen - there was nothing
> between 3.0 and 3.1 in the Xen blkfront code.
> 
> Perhaps there is something new and fancy in the Ext3 (or ext4) that is
> causing all this mayhem?
> 

Could it be?:
http://kernelnewbies.org/Linux_3.1#head-12eb55d046763d8b789ff44c50b96c41b203d65e

"Filesystem barriers enabled by default in Ext3"

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 09:30:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 09:30:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJSr2-0004oO-8L; Thu, 27 Oct 2011 09:30:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJSqW-0004cp-MJ
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 09:30:25 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1319733019!988005!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31560 invoked from network); 27 Oct 2011 16:30:21 -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;
	27 Oct 2011 16:30:21 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8625859"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 16:30:15 +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, 27 Oct 2011 17:30:15 +0100
Subject: Re: [Xen-devel] Question on virtual block device
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Daniel Castro <evil.dani@gmail.com>
Date: Thu, 27 Oct 2011 17:30:15 +0100
In-Reply-To: <CAP2B85_+mKNBYTJp27Akcu9YZioAFyoGs2ziSDamiMohWMbgFA@mail.gmail.com>
References: <CAP2B85_+mKNBYTJp27Akcu9YZioAFyoGs2ziSDamiMohWMbgFA@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: <1319733015.9436.149.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"seabios@seabios.org" <seabios@seabios.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, 2011-10-27 at 17:14 +0100, Daniel Castro wrote:
> Hello All,
> 
> I am connecting my front and back for a block device.
> I have collected from xenstore sectors, sector-size. But I also need:
>     u16 heads;      // # heads
>     u16 cylinders;  // # cylinders
>     u16 spt;        // # sectors / track
> I guess from the SeaBIOS perspective they are required, but from the
> xen perspective how can I get them? pure math/translation?

CHS is rather historical and has no real relevance to a virtual device.
You can basically just make them up to fit the underlying device size,
take a look at blkif_getgeo in Linux for example.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 09:42:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 09:42:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJT2I-0006Ai-Pm; Thu, 27 Oct 2011 09:42:34 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJT1i-0005yO-Is
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 09:41:58 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319733713!36905866!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4246 invoked from network); 27 Oct 2011 16:41:55 -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; 27 Oct 2011 16:41:55 -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
	p9RGfhY3007744
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 16:41:44 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
	p9RGfhGP004071
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 16:41:43 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
	p9RGfb0b028769; Thu, 27 Oct 2011 11:41:38 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 27 Oct 2011 09:41:37 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 9D6E982C26; Thu, 27 Oct 2011 12:41:36 -0400 (EDT)
Date: Thu, 27 Oct 2011 12:41:36 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
Subject: Re: [Xen-devel] Linux 3.1 domU + ext3 = WARNING: at fs/ext3/inode.c
Message-ID: <20111027164136.GC23021@phenom.dumpdata.com>
References: <4EA71270.2050303@theshore.net>
	<20111025201239.GA13747@phenom.dumpdata.com>
	<BCD23F9B-BB0B-429B-882C-80077B1D234F@theshore.net>
	<20111025211512.GA2561@phenom.dumpdata.com>
	<4EA86D00.1080906@theshore.net>
	<20111026203652.GA10737@phenom.dumpdata.com>
	<4EA87A5C.6060100@theshore.net>
	<20111027154159.GB2909@phenom.dumpdata.com>
	<20111027162327.GQ12984@reaktio.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <20111027162327.GQ12984@reaktio.net>
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.0A090207.4EA989C8.01BB:SCFMA922111,ss=1,re=-4.000,fgs=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 Thu, Oct 27, 2011 at 07:23:28PM +0300, Pasi K=E4rkk=E4inen wrote:
> On Thu, Oct 27, 2011 at 11:41:59AM -0400, Konrad Rzeszutek Wilk wrote:
> > On Wed, Oct 26, 2011 at 05:23:40PM -0400, Christopher S. Aker wrote:
> > > On 10/26/11 4:36 PM, Konrad Rzeszutek Wilk wrote:
> > > > I am going to bet that if you compile 3.0.4 or 3.0.6 with that
> > > > fancy new config option that turns EXT3_ORDERED_something you wil=
l
> > > > see the same exact problem.
> > >=20
> > > Switching that back to match my 3.0 config is the first thing I
> > > tried, with no joy.
> > >=20
> > > I'll reset and try a few more ideas...
> >=20
> > OK. I am kind of lost of what made all this happen - there was nothin=
g
> > between 3.0 and 3.1 in the Xen blkfront code.
> >=20
> > Perhaps there is something new and fancy in the Ext3 (or ext4) that i=
s
> > causing all this mayhem?
> >=20
>=20
> Could it be?:
> http://kernelnewbies.org/Linux_3.1#head-12eb55d046763d8b789ff44c50b96c4=
1b203d65e
>=20
> "Filesystem barriers enabled by default in Ext3"

Oh, <smacks his head>

I hadn't realized this was a patch - thought it was some CONFIG option to=
 turn it on.

So Christopher if this:
http://git.kernel.org/?p=3Dlinux/kernel/git/torvalds/linux-2.6.git;a=3Dco=
mmitdiff;h=3D00eacd66cd8ab5fff9df49aa3f261ad43d495434

is reverted do you get the problems?

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 09:56:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 09:56:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJTGA-0006pV-Ld; Thu, 27 Oct 2011 09:56:54 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJTFX-0006dT-85
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 09:56:15 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1319734572!1879852!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7375 invoked from network); 27 Oct 2011 16:56:12 -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;
	27 Oct 2011 16:56:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8626289"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 16:56: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; Thu, 27 Oct 2011 17:56:11 +0100
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
	1RJTFT-0006kR-64; Thu, 27 Oct 2011 16:56:11 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJTFT-0007le-49;
	Thu, 27 Oct 2011 17:56:11 +0100
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: <20137.36138.798083.594309@mariner.uk.xensource.com>
Date: Thu, 27 Oct 2011 17:56:10 +0100
To: David Vrabel <david.vrabel@citrix.com>
Subject: Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h
In-Reply-To: <4EA7E5BF.6050909@citrix.com>
References: <20134.62279.50041.126603@mariner.uk.xensource.com>
	<4EA7E5BF.6050909@citrix.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

David Vrabel writes ("Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h"):
> On 25/10/11 18:35, Ian Jackson wrote:
> > --- /dev/null
> > +++ b/tools/libxl/bsd-queue.3
> > @@ -0,0 +1,1044 @@
> > +.\" Copyright (c) 1993
> > +.\"	The Regents of the University of California.  All rights reserved.
> > +.\"
> > +.\" Redistribution and use in source and binary forms, with or without
> > +.\" modification, are permitted provided that the following conditions
> > +.\" are met:
> > +.\" 1. Redistributions of source code must retain the above copyright
> > +.\"    notice, this list of conditions and the following disclaimer.
> > +.\" 2. Redistributions in binary form must reproduce the above copyright
> > +.\"    notice, this list of conditions and the following disclaimer in the
> > +.\"    documentation and/or other materials provided with the distribution.
> > +.\" 3. All advertising materials mentioning features or use of this software
> > +.\"    must display the following acknowledgement:
> 
> I think you'll have to drop the manpage because of this clause in the
> license.

Well spotted.  I checked the licence comment at the top of the actual
code but not the one in the manpage.

However I think this is actually fine if all we're doing is committing
it to our source tree, for convenience of reference.  We aren't
referring to "features or use" of the manpage.

But it warrants a paragraph in COPYING.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 10:00:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 10:00:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJTJf-0007HL-88; Thu, 27 Oct 2011 10:00:31 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJTHN-00073c-6m
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 09:58:09 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1319734685!992398!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12150 invoked from network); 27 Oct 2011 16:58:06 -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;
	27 Oct 2011 16:58:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8626331"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 16:58: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, 27 Oct 2011 17:58:05 +0100
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
	1RJTHJ-0006l3-3E; Thu, 27 Oct 2011 16:58:05 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJTHJ-0007lw-2S;
	Thu, 27 Oct 2011 17:58:05 +0100
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: <20137.36253.63788.350898@mariner.uk.xensource.com>
Date: Thu, 27 Oct 2011 17:58:05 +0100
To: Roger Pau =?iso-8859-1?Q?Monn=E9?= <roger.pau@entel.upc.edu>
Subject: Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h
In-Reply-To: <CAPLaKK4aqB1GT7_ksBmWwmPWVSbSLrr5aNh3mujNGMitPUm06Q@mail.gmail.com>
References: <20134.62279.50041.126603@mariner.uk.xensource.com>
	<CAPLaKK4aqB1GT7_ksBmWwmPWVSbSLrr5aNh3mujNGMitPUm06Q@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

Roger Pau Monné writes ("Re: [Xen-devel] [PATCH] libxl: Include a version of bsd's queue.h"):
> 2011/10/25 Ian Jackson <Ian.Jackson@eu.citrix.com>:
> > +#!/usr/bin/perl -p
> 
> This should be something like:
> 
> #!/usr/bin/env perl
> 
> For this script to work on BSD systems, which usually have perl in
> /usr/pkg/bin/perl or /usr/local/bin/perl

How unpleasant.

However, our practice elsewhere (eg,
tools/firmware/rombios/makesym.perl) is to say #!/usr/bin/perl but in
the Makefile to say "perl ...", so I will do that.

Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 10:13:31 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 10:13:31 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJTWE-0000n7-9n; Thu, 27 Oct 2011 10:13:30 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJTRM-00089k-Aa
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 10:08:36 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1319735281!46232802!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13455 invoked from network); 27 Oct 2011 17:08:01 -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;
	27 Oct 2011 17:08:01 -0000
X-IronPort-AV: E=Sophos;i="4.69,413,1315180800"; 
   d="scan'208";a="8626506"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 17:08: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; Thu, 27 Oct 2011 18:08:24 +0100
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
	1RJTRI-0006of-JZ	for xen-devel@lists.xensource.com;
	Thu, 27 Oct 2011 17:08:24 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJTRI-0008D4-Ib	for
	xen-devel@lists.xensource.com; Thu, 27 Oct 2011 18:08:24 +0100
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: <20137.36872.515552.56355@mariner.uk.xensource.com>
Date: Thu, 27 Oct 2011 18:08:24 +0100
To: xen-devel@lists.xensource.com
X-Mailer: VM 7.19 under Emacs 21.4.1
Subject: [Xen-devel] [PATCH v2] libxl: Provide a version of bsd's queue.h as
	_libxl_list.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

We would like some linked list macros which are (a) well known to be
sane and (b) typesafe.  BSD's queue.h meets these criteria.

We also provide some simple perlery to arrange to add the libxl_
namespace prefix to the macros.  This will allow us to #include
_libxl_list.h in our public header file without clashing with anyone
else who is also using another version of queue.h.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>

---

Changes since v1:
   - use move-if-changed to install _libxl_list.h
   - mention bsd-queue.3's 4-clause BSD licence in COPYING
   - explictly call the perl script from the Makefile with "perl"
   - move the imported files into external/ and provide a README there
   - sed out the include of sys/cdefs.h
   - improved commit message


 COPYING                              |    8 +
 tools/libxl/Makefile                 |   10 +-
 tools/libxl/bsd-sys-queue-h-seddery  |   70 +++
 tools/libxl/external/README          |   13 +
 tools/libxl/external/bsd-queue.3     | 1044 ++++++++++++++++++++++++++++++++++
 tools/libxl/external/bsd-sys-queue.h |  637 +++++++++++++++++++++
 6 files changed, 1779 insertions(+), 3 deletions(-)

diff --git a/COPYING b/COPYING
index 07535ad..524542d 100644
--- a/COPYING
+++ b/COPYING
@@ -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.
+
+
 Licensing Exceptions (the relaxed BSD-style license)
 ----------------------------------------------------
 
diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index 51e5132..f23661a 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -42,7 +42,7 @@ LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o
 
 $(LIBXL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) $(CFLAGS_libxenstore) $(CFLAGS_libblktapctl)
 
-AUTOINCS= libxlu_cfg_y.h libxlu_cfg_l.h
+AUTOINCS= libxlu_cfg_y.h libxlu_cfg_l.h _libxl_list.h
 AUTOSRCS= libxlu_cfg_y.c libxlu_cfg_l.c
 LIBXLU_OBJS = libxlu_cfg_y.o libxlu_cfg_l.o libxlu_cfg.o \
 	libxlu_disk_l.o libxlu_disk.o
@@ -55,7 +55,7 @@ $(XL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) # For xentoollog.h
 $(XL_OBJS): CFLAGS += $(CFLAGS_libxenlight)
 
 testidl.o: CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenlight)
-testidl.c: libxl_types.idl gentest.py libxl.h
+testidl.c: libxl_types.idl gentest.py libxl.h $(AUTOINCS)
 	$(PYTHON) gentest.py libxl_types.idl testidl.c.new
 	mv testidl.c.new testidl.c
 
@@ -63,7 +63,7 @@ testidl.c: libxl_types.idl gentest.py libxl.h
 all: $(CLIENTS) libxenlight.so libxenlight.a libxlutil.so libxlutil.a \
 	$(AUTOSRCS) $(AUTOINCS)
 
-$(LIBXLU_OBJS): $(AUTOINCS)
+$(LIBXL_OBJS) $(LIBXLU_OBJS) $(XL_OBJS): $(AUTOINCS)
 
 %.c %.h: %.y
 	@rm -f $*.[ch]
@@ -81,6 +81,10 @@ _libxl_paths.h: genpath
 	rm -f $@.tmp
 	$(call move-if-changed,$@.2.tmp,$@)
 
+_libxl_list.h: bsd-sys-queue-h-seddery external/bsd-sys-queue.h
+	perl ./$^ --prefix=libxl >$@.new
+	$(call move-if-changed,$@.new,$@)
+
 libxl_paths.c: _libxl_paths.h
 
 libxl.h: _libxl_types.h
diff --git a/tools/libxl/bsd-sys-queue-h-seddery b/tools/libxl/bsd-sys-queue-h-seddery
new file mode 100755
index 0000000..c0aa079
--- /dev/null
+++ b/tools/libxl/bsd-sys-queue-h-seddery
@@ -0,0 +1,70 @@
+#!/usr/bin/perl -p
+#
+# This script is part of the Xen build system.  It has a very
+# permissive licence to avoid complicating the licence of the
+# generated header file and to allow this seddery to be reused by
+# other projects.
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this individual 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.
+#
+# Copyright (C) 2011 Citrix Ltd
+
+our $namespace, $ucnamespace;
+
+BEGIN {
+    die unless @ARGV;
+    $namespace = pop @ARGV;
+    $namespace =~ s/^--prefix=// or die;
+    $ucnamespace = uc $namespace;
+
+    print <<END or die $!;
+/*
+ * DO NOT EDIT THIS FILE
+ *
+ * Generated automatically by bsd-sys-queue-h-seddery to
+ *  - introduce ${ucnamespace}_ and ${namespace}_ namespace prefixes
+ *  - turn "struct type" into "type" so that type arguments
+ *     to the macros are type names not struct tags
+ *  - remove the reference to sys/cdefs.h, which is not needed
+ *
+ * The purpose of this seddery is to allow the resulting file to be
+ * freely included by software which might also want to include other
+ * list macros; to make it usable when struct tags are not being used
+ * or not known; to make it more portable.
+ */
+END
+}
+
+s/\b( _SYS_QUEUE |
+      SLIST | LIST | STAILQ | TAILQ | QUEUE
+      )/${ucnamespace}_$1/xg;
+
+s/\b( TRACEBUF | TRASHIT |
+      QMD_
+      )/${ucnamespace}__$1/xg;
+
+s/\b(
+      qm_
+      )/${namespace}__$1/xg;
+
+s/\b struct \s+ type \b/type/xg;
+
+s,^\#include.*sys/cdefs.*,/* $& */,xg;
diff --git a/tools/libxl/external/README b/tools/libxl/external/README
new file mode 100644
index 0000000..f3a3ac4
--- /dev/null
+++ b/tools/libxl/external/README
@@ -0,0 +1,13 @@
+WARNING - DO NOT EDIT THINGS IN THIS DIRECTORY (apart from this README)
+-----------------------------------------------------------------------
+
+These files were obtained elsewhere and should only be updated by
+copying new versions from the source location, as documented below:
+
+bsd-sys-queue.h
+bsd-queue.3
+
+  Obtained from the FreeBSD SVN using the following commands:
+    svn co -r 221843 svn://svn.freebsd.org/base/head/sys/sys/
+    svn co -r 221843 svn://svn.freebsd.org/base/head/share/man/man3
+
diff --git a/tools/libxl/external/bsd-queue.3 b/tools/libxl/external/bsd-queue.3
new file mode 100644
index 0000000..007ca5c
--- /dev/null
+++ b/tools/libxl/external/bsd-queue.3
@@ -0,0 +1,1044 @@
+.\" Copyright (c) 1993
+.\"	The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"	This product includes software developed by the University of
+.\"	California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"	@(#)queue.3	8.2 (Berkeley) 1/24/94
+.\" $FreeBSD$
+.\"
+.Dd May 13, 2011
+.Dt QUEUE 3
+.Os
+.Sh NAME
+.Nm SLIST_EMPTY ,
+.Nm SLIST_ENTRY ,
+.Nm SLIST_FIRST ,
+.Nm SLIST_FOREACH ,
+.Nm SLIST_FOREACH_SAFE ,
+.Nm SLIST_HEAD ,
+.Nm SLIST_HEAD_INITIALIZER ,
+.Nm SLIST_INIT ,
+.Nm SLIST_INSERT_AFTER ,
+.Nm SLIST_INSERT_HEAD ,
+.Nm SLIST_NEXT ,
+.Nm SLIST_REMOVE_AFTER ,
+.Nm SLIST_REMOVE_HEAD ,
+.Nm SLIST_REMOVE ,
+.Nm SLIST_SWAP ,
+.Nm STAILQ_CONCAT ,
+.Nm STAILQ_EMPTY ,
+.Nm STAILQ_ENTRY ,
+.Nm STAILQ_FIRST ,
+.Nm STAILQ_FOREACH ,
+.Nm STAILQ_FOREACH_SAFE ,
+.Nm STAILQ_HEAD ,
+.Nm STAILQ_HEAD_INITIALIZER ,
+.Nm STAILQ_INIT ,
+.Nm STAILQ_INSERT_AFTER ,
+.Nm STAILQ_INSERT_HEAD ,
+.Nm STAILQ_INSERT_TAIL ,
+.Nm STAILQ_LAST ,
+.Nm STAILQ_NEXT ,
+.Nm STAILQ_REMOVE_AFTER ,
+.Nm STAILQ_REMOVE_HEAD ,
+.Nm STAILQ_REMOVE ,
+.Nm STAILQ_SWAP ,
+.Nm LIST_EMPTY ,
+.Nm LIST_ENTRY ,
+.Nm LIST_FIRST ,
+.Nm LIST_FOREACH ,
+.Nm LIST_FOREACH_SAFE ,
+.Nm LIST_HEAD ,
+.Nm LIST_HEAD_INITIALIZER ,
+.Nm LIST_INIT ,
+.Nm LIST_INSERT_AFTER ,
+.Nm LIST_INSERT_BEFORE ,
+.Nm LIST_INSERT_HEAD ,
+.Nm LIST_NEXT ,
+.Nm LIST_REMOVE ,
+.Nm LIST_SWAP ,
+.Nm TAILQ_CONCAT ,
+.Nm TAILQ_EMPTY ,
+.Nm TAILQ_ENTRY ,
+.Nm TAILQ_FIRST ,
+.Nm TAILQ_FOREACH ,
+.Nm TAILQ_FOREACH_SAFE ,
+.Nm TAILQ_FOREACH_REVERSE ,
+.Nm TAILQ_FOREACH_REVERSE_SAFE ,
+.Nm TAILQ_HEAD ,
+.Nm TAILQ_HEAD_INITIALIZER ,
+.Nm TAILQ_INIT ,
+.Nm TAILQ_INSERT_AFTER ,
+.Nm TAILQ_INSERT_BEFORE ,
+.Nm TAILQ_INSERT_HEAD ,
+.Nm TAILQ_INSERT_TAIL ,
+.Nm TAILQ_LAST ,
+.Nm TAILQ_NEXT ,
+.Nm TAILQ_PREV ,
+.Nm TAILQ_REMOVE ,
+.Nm TAILQ_SWAP
+.Nd implementations of singly-linked lists, singly-linked tail queues,
+lists and tail queues
+.Sh SYNOPSIS
+.In sys/queue.h
+.\"
+.Fn SLIST_EMPTY "SLIST_HEAD *head"
+.Fn SLIST_ENTRY "TYPE"
+.Fn SLIST_FIRST "SLIST_HEAD *head"
+.Fn SLIST_FOREACH "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME"
+.Fn SLIST_FOREACH_SAFE "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME" "TYPE *temp_var"
+.Fn SLIST_HEAD "HEADNAME" "TYPE"
+.Fn SLIST_HEAD_INITIALIZER "SLIST_HEAD head"
+.Fn SLIST_INIT "SLIST_HEAD *head"
+.Fn SLIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_INSERT_HEAD "SLIST_HEAD *head" "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_NEXT "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_REMOVE_AFTER "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_REMOVE_HEAD "SLIST_HEAD *head" "SLIST_ENTRY NAME"
+.Fn SLIST_REMOVE "SLIST_HEAD *head" "TYPE *elm" "TYPE" "SLIST_ENTRY NAME"
+.Fn SLIST_SWAP "SLIST_HEAD *head1" "SLIST_HEAD *head2" "SLIST_ENTRY NAME"
+.\"
+.Fn STAILQ_CONCAT "STAILQ_HEAD *head1" "STAILQ_HEAD *head2"
+.Fn STAILQ_EMPTY "STAILQ_HEAD *head"
+.Fn STAILQ_ENTRY "TYPE"
+.Fn STAILQ_FIRST "STAILQ_HEAD *head"
+.Fn STAILQ_FOREACH "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
+.Fn STAILQ_FOREACH_SAFE "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME" "TYPE *temp_var"
+.Fn STAILQ_HEAD "HEADNAME" "TYPE"
+.Fn STAILQ_HEAD_INITIALIZER "STAILQ_HEAD head"
+.Fn STAILQ_INIT "STAILQ_HEAD *head"
+.Fn STAILQ_INSERT_AFTER "STAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_INSERT_HEAD "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_INSERT_TAIL "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_LAST "STAILQ_HEAD *head" "TYPE" "STAILQ_ENTRY NAME"
+.Fn STAILQ_NEXT "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_REMOVE_AFTER "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_REMOVE_HEAD "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
+.Fn STAILQ_REMOVE "STAILQ_HEAD *head" "TYPE *elm" "TYPE" "STAILQ_ENTRY NAME"
+.Fn STAILQ_SWAP "STAILQ_HEAD *head1" "STAILQ_HEAD *head2" "STAILQ_ENTRY NAME"
+.\"
+.Fn LIST_EMPTY "LIST_HEAD *head"
+.Fn LIST_ENTRY "TYPE"
+.Fn LIST_FIRST "LIST_HEAD *head"
+.Fn LIST_FOREACH "TYPE *var" "LIST_HEAD *head" "LIST_ENTRY NAME"
+.Fn LIST_FOREACH_SAFE "TYPE *var" "LIST_HEAD *head" "LIST_ENTRY NAME" "TYPE *temp_var"
+.Fn LIST_HEAD "HEADNAME" "TYPE"
+.Fn LIST_HEAD_INITIALIZER "LIST_HEAD head"
+.Fn LIST_INIT "LIST_HEAD *head"
+.Fn LIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_INSERT_HEAD "LIST_HEAD *head" "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_NEXT "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_REMOVE "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_SWAP "LIST_HEAD *head1" "LIST_HEAD *head2" "TYPE" "LIST_ENTRY NAME"
+.\"
+.Fn TAILQ_CONCAT "TAILQ_HEAD *head1" "TAILQ_HEAD *head2" "TAILQ_ENTRY NAME"
+.Fn TAILQ_EMPTY "TAILQ_HEAD *head"
+.Fn TAILQ_ENTRY "TYPE"
+.Fn TAILQ_FIRST "TAILQ_HEAD *head"
+.Fn TAILQ_FOREACH "TYPE *var" "TAILQ_HEAD *head" "TAILQ_ENTRY NAME"
+.Fn TAILQ_FOREACH_SAFE "TYPE *var" "TAILQ_HEAD *head" "TAILQ_ENTRY NAME" "TYPE *temp_var"
+.Fn TAILQ_FOREACH_REVERSE "TYPE *var" "TAILQ_HEAD *head" "HEADNAME" "TAILQ_ENTRY NAME"
+.Fn TAILQ_FOREACH_REVERSE_SAFE "TYPE *var" "TAILQ_HEAD *head" "HEADNAME" "TAILQ_ENTRY NAME" "TYPE *temp_var"
+.Fn TAILQ_HEAD "HEADNAME" "TYPE"
+.Fn TAILQ_HEAD_INITIALIZER "TAILQ_HEAD head"
+.Fn TAILQ_INIT "TAILQ_HEAD *head"
+.Fn TAILQ_INSERT_AFTER "TAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_INSERT_HEAD "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_INSERT_TAIL "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_LAST "TAILQ_HEAD *head" "HEADNAME"
+.Fn TAILQ_NEXT "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_PREV "TYPE *elm" "HEADNAME" "TAILQ_ENTRY NAME"
+.Fn TAILQ_REMOVE "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_SWAP "TAILQ_HEAD *head1" "TAILQ_HEAD *head2" "TYPE" "TAILQ_ENTRY NAME"
+.\"
+.Sh DESCRIPTION
+These macros define and operate on four types of data structures:
+singly-linked lists, singly-linked tail queues, lists, and tail queues.
+All four structures support the following functionality:
+.Bl -enum -compact -offset indent
+.It
+Insertion of a new entry at the head of the list.
+.It
+Insertion of a new entry after any element in the list.
+.It
+O(1) removal of an entry from the head of the list.
+.It
+Forward traversal through the list.
+.It
+Swawpping the contents of two lists.
+.El
+.Pp
+Singly-linked lists are the simplest of the four data structures
+and support only the above functionality.
+Singly-linked lists are ideal for applications with large datasets
+and few or no removals,
+or for implementing a LIFO queue.
+Singly-linked lists add the following functionality:
+.Bl -enum -compact -offset indent
+.It
+O(n) removal of any entry in the list.
+.El
+.Pp
+Singly-linked tail queues add the following functionality:
+.Bl -enum -compact -offset indent
+.It
+Entries can be added at the end of a list.
+.It
+O(n) removal of any entry in the list.
+.It
+They may be concatenated.
+.El
+However:
+.Bl -enum -compact -offset indent
+.It
+All list insertions must specify the head of the list.
+.It
+Each head entry requires two pointers rather than one.
+.It
+Code size is about 15% greater and operations run about 20% slower
+than singly-linked lists.
+.El
+.Pp
+Singly-linked tailqs are ideal for applications with large datasets and
+few or no removals,
+or for implementing a FIFO queue.
+.Pp
+All doubly linked types of data structures (lists and tail queues)
+additionally allow:
+.Bl -enum -compact -offset indent
+.It
+Insertion of a new entry before any element in the list.
+.It
+O(1) removal of any entry in the list.
+.El
+However:
+.Bl -enum -compact -offset indent
+.It
+Each element requires two pointers rather than one.
+.It
+Code size and execution time of operations (except for removal) is about
+twice that of the singly-linked data-structures.
+.El
+.Pp
+Linked lists are the simplest of the doubly linked data structures and support
+only the above functionality over singly-linked lists.
+.Pp
+Tail queues add the following functionality:
+.Bl -enum -compact -offset indent
+.It
+Entries can be added at the end of a list.
+.It
+They may be traversed backwards, from tail to head.
+.It
+They may be concatenated.
+.El
+However:
+.Bl -enum -compact -offset indent
+.It
+All list insertions and removals must specify the head of the list.
+.It
+Each head entry requires two pointers rather than one.
+.It
+Code size is about 15% greater and operations run about 20% slower
+than singly-linked lists.
+.El
+.Pp
+In the macro definitions,
+.Fa TYPE
+is the name of a user defined structure,
+that must contain a field of type
+.Li SLIST_ENTRY ,
+.Li STAILQ_ENTRY ,
+.Li LIST_ENTRY ,
+or
+.Li TAILQ_ENTRY ,
+named
+.Fa NAME .
+The argument
+.Fa HEADNAME
+is the name of a user defined structure that must be declared
+using the macros
+.Li SLIST_HEAD ,
+.Li STAILQ_HEAD ,
+.Li LIST_HEAD ,
+or
+.Li TAILQ_HEAD .
+See the examples below for further explanation of how these
+macros are used.
+.Sh SINGLY-LINKED LISTS
+A singly-linked list is headed by a structure defined by the
+.Nm SLIST_HEAD
+macro.
+This structure contains a single pointer to the first element
+on the list.
+The elements are singly linked for minimum space and pointer manipulation
+overhead at the expense of O(n) removal for arbitrary elements.
+New elements can be added to the list after an existing element or
+at the head of the list.
+An
+.Fa SLIST_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+SLIST_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Fa HEADNAME
+is the name of the structure to be defined, and
+.Fa TYPE
+is the type of the elements to be linked into the list.
+A pointer to the head of the list can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm SLIST_HEAD_INITIALIZER
+evaluates to an initializer for the list
+.Fa head .
+.Pp
+The macro
+.Nm SLIST_EMPTY
+evaluates to true if there are no elements in the list.
+.Pp
+The macro
+.Nm SLIST_ENTRY
+declares a structure that connects the elements in
+the list.
+.Pp
+The macro
+.Nm SLIST_FIRST
+returns the first element in the list or NULL if the list is empty.
+.Pp
+The macro
+.Nm SLIST_FOREACH
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in
+turn to
+.Fa var .
+.Pp
+The macro
+.Nm SLIST_FOREACH_SAFE
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in
+turn to
+.Fa var .
+However, unlike
+.Fn SLIST_FOREACH
+here it is permitted to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm SLIST_INIT
+initializes the list referenced by
+.Fa head .
+.Pp
+The macro
+.Nm SLIST_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the list.
+.Pp
+The macro
+.Nm SLIST_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm SLIST_NEXT
+returns the next element in the list.
+.Pp
+The macro
+.Nm SLIST_REMOVE_AFTER
+removes the element after
+.Fa elm
+from the list. Unlike
+.Fa SLIST_REMOVE ,
+this macro does not traverse the entire list.
+.Pp
+The macro
+.Nm SLIST_REMOVE_HEAD
+removes the element
+.Fa elm
+from the head of the list.
+For optimum efficiency,
+elements being removed from the head of the list should explicitly use
+this macro instead of the generic
+.Fa SLIST_REMOVE
+macro.
+.Pp
+The macro
+.Nm SLIST_REMOVE
+removes the element
+.Fa elm
+from the list.
+.Pp
+The macro
+.Nm SLIST_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh SINGLY-LINKED LIST EXAMPLE
+.Bd -literal
+SLIST_HEAD(slisthead, entry) head =
+    SLIST_HEAD_INITIALIZER(head);
+struct slisthead *headp;		/* Singly-linked List head. */
+struct entry {
+	...
+	SLIST_ENTRY(entry) entries;	/* Singly-linked List. */
+	...
+} *n1, *n2, *n3, *np;
+
+SLIST_INIT(&head);			/* Initialize the list. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+SLIST_INSERT_HEAD(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+SLIST_INSERT_AFTER(n1, n2, entries);
+
+SLIST_REMOVE(&head, n2, entry, entries);/* Deletion. */
+free(n2);
+
+n3 = SLIST_FIRST(&head);
+SLIST_REMOVE_HEAD(&head, entries);	/* Deletion from the head. */
+free(n3);
+					/* Forward traversal. */
+SLIST_FOREACH(np, &head, entries)
+	np-> ...
+					/* Safe forward traversal. */
+SLIST_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	SLIST_REMOVE(&head, np, entry, entries);
+	free(np);
+}
+
+while (!SLIST_EMPTY(&head)) {		/* List Deletion. */
+	n1 = SLIST_FIRST(&head);
+	SLIST_REMOVE_HEAD(&head, entries);
+	free(n1);
+}
+.Ed
+.Sh SINGLY-LINKED TAIL QUEUES
+A singly-linked tail queue is headed by a structure defined by the
+.Nm STAILQ_HEAD
+macro.
+This structure contains a pair of pointers,
+one to the first element in the tail queue and the other to
+the last element in the tail queue.
+The elements are singly linked for minimum space and pointer
+manipulation overhead at the expense of O(n) removal for arbitrary
+elements.
+New elements can be added to the tail queue after an existing element,
+at the head of the tail queue, or at the end of the tail queue.
+A
+.Fa STAILQ_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+STAILQ_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Li HEADNAME
+is the name of the structure to be defined, and
+.Li TYPE
+is the type of the elements to be linked into the tail queue.
+A pointer to the head of the tail queue can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm STAILQ_HEAD_INITIALIZER
+evaluates to an initializer for the tail queue
+.Fa head .
+.Pp
+The macro
+.Nm STAILQ_CONCAT
+concatenates the tail queue headed by
+.Fa head2
+onto the end of the one headed by
+.Fa head1
+removing all entries from the former.
+.Pp
+The macro
+.Nm STAILQ_EMPTY
+evaluates to true if there are no items on the tail queue.
+.Pp
+The macro
+.Nm STAILQ_ENTRY
+declares a structure that connects the elements in
+the tail queue.
+.Pp
+The macro
+.Nm STAILQ_FIRST
+returns the first item on the tail queue or NULL if the tail queue
+is empty.
+.Pp
+The macro
+.Nm STAILQ_FOREACH
+traverses the tail queue referenced by
+.Fa head
+in the forward direction, assigning each element
+in turn to
+.Fa var .
+.Pp
+The macro
+.Nm STAILQ_FOREACH_SAFE
+traverses the tail queue referenced by
+.Fa head
+in the forward direction, assigning each element
+in turn to
+.Fa var .
+However, unlike
+.Fn STAILQ_FOREACH
+here it is permitted to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm STAILQ_INIT
+initializes the tail queue referenced by
+.Fa head .
+.Pp
+The macro
+.Nm STAILQ_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the tail queue.
+.Pp
+The macro
+.Nm STAILQ_INSERT_TAIL
+inserts the new element
+.Fa elm
+at the end of the tail queue.
+.Pp
+The macro
+.Nm STAILQ_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm STAILQ_LAST
+returns the last item on the tail queue.
+If the tail queue is empty the return value is
+.Dv NULL .
+.Pp
+The macro
+.Nm STAILQ_NEXT
+returns the next item on the tail queue, or NULL this item is the last.
+.Pp
+The macro
+.Nm STAILQ_REMOVE_AFTER
+removes the element after
+.Fa elm
+from the tail queue. Unlike
+.Fa STAILQ_REMOVE ,
+this macro does not traverse the entire tail queue.
+.Pp
+The macro
+.Nm STAILQ_REMOVE_HEAD
+removes the element at the head of the tail queue.
+For optimum efficiency,
+elements being removed from the head of the tail queue should
+use this macro explicitly rather than the generic
+.Fa STAILQ_REMOVE
+macro.
+.Pp
+The macro
+.Nm STAILQ_REMOVE
+removes the element
+.Fa elm
+from the tail queue.
+.Pp
+The macro
+.Nm STAILQ_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh SINGLY-LINKED TAIL QUEUE EXAMPLE
+.Bd -literal
+STAILQ_HEAD(stailhead, entry) head =
+    STAILQ_HEAD_INITIALIZER(head);
+struct stailhead *headp;		/* Singly-linked tail queue head. */
+struct entry {
+	...
+	STAILQ_ENTRY(entry) entries;	/* Tail queue. */
+	...
+} *n1, *n2, *n3, *np;
+
+STAILQ_INIT(&head);			/* Initialize the queue. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+STAILQ_INSERT_HEAD(&head, n1, entries);
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the tail. */
+STAILQ_INSERT_TAIL(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+STAILQ_INSERT_AFTER(&head, n1, n2, entries);
+					/* Deletion. */
+STAILQ_REMOVE(&head, n2, entry, entries);
+free(n2);
+					/* Deletion from the head. */
+n3 = STAILQ_FIRST(&head);
+STAILQ_REMOVE_HEAD(&head, entries);
+free(n3);
+					/* Forward traversal. */
+STAILQ_FOREACH(np, &head, entries)
+	np-> ...
+					/* Safe forward traversal. */
+STAILQ_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	STAILQ_REMOVE(&head, np, entry, entries);
+	free(np);
+}
+					/* TailQ Deletion. */
+while (!STAILQ_EMPTY(&head)) {
+	n1 = STAILQ_FIRST(&head);
+	STAILQ_REMOVE_HEAD(&head, entries);
+	free(n1);
+}
+					/* Faster TailQ Deletion. */
+n1 = STAILQ_FIRST(&head);
+while (n1 != NULL) {
+	n2 = STAILQ_NEXT(n1, entries);
+	free(n1);
+	n1 = n2;
+}
+STAILQ_INIT(&head);
+.Ed
+.Sh LISTS
+A list is headed by a structure defined by the
+.Nm LIST_HEAD
+macro.
+This structure contains a single pointer to the first element
+on the list.
+The elements are doubly linked so that an arbitrary element can be
+removed without traversing the list.
+New elements can be added to the list after an existing element,
+before an existing element, or at the head of the list.
+A
+.Fa LIST_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+LIST_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Fa HEADNAME
+is the name of the structure to be defined, and
+.Fa TYPE
+is the type of the elements to be linked into the list.
+A pointer to the head of the list can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm LIST_HEAD_INITIALIZER
+evaluates to an initializer for the list
+.Fa head .
+.Pp
+The macro
+.Nm LIST_EMPTY
+evaluates to true if there are no elements in the list.
+.Pp
+The macro
+.Nm LIST_ENTRY
+declares a structure that connects the elements in
+the list.
+.Pp
+The macro
+.Nm LIST_FIRST
+returns the first element in the list or NULL if the list
+is empty.
+.Pp
+The macro
+.Nm LIST_FOREACH
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in turn to
+.Fa var .
+.Pp
+The macro
+.Nm LIST_FOREACH_SAFE
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in turn to
+.Fa var .
+However, unlike
+.Fn LIST_FOREACH
+here it is permitted to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm LIST_INIT
+initializes the list referenced by
+.Fa head .
+.Pp
+The macro
+.Nm LIST_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the list.
+.Pp
+The macro
+.Nm LIST_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm LIST_INSERT_BEFORE
+inserts the new element
+.Fa elm
+before the element
+.Fa listelm .
+.Pp
+The macro
+.Nm LIST_NEXT
+returns the next element in the list, or NULL if this is the last.
+.Pp
+The macro
+.Nm LIST_REMOVE
+removes the element
+.Fa elm
+from the list.
+.Pp
+The macro
+.Nm LIST_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh LIST EXAMPLE
+.Bd -literal
+LIST_HEAD(listhead, entry) head =
+    LIST_HEAD_INITIALIZER(head);
+struct listhead *headp;			/* List head. */
+struct entry {
+	...
+	LIST_ENTRY(entry) entries;	/* List. */
+	...
+} *n1, *n2, *n3, *np, *np_temp;
+
+LIST_INIT(&head);			/* Initialize the list. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+LIST_INSERT_HEAD(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+LIST_INSERT_AFTER(n1, n2, entries);
+
+n3 = malloc(sizeof(struct entry));	/* Insert before. */
+LIST_INSERT_BEFORE(n2, n3, entries);
+
+LIST_REMOVE(n2, entries);		/* Deletion. */
+free(n2);
+					/* Forward traversal. */
+LIST_FOREACH(np, &head, entries)
+	np-> ...
+
+					/* Safe forward traversal. */
+LIST_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	LIST_REMOVE(np, entries);
+	free(np);
+}
+
+while (!LIST_EMPTY(&head)) {		/* List Deletion. */
+	n1 = LIST_FIRST(&head);
+	LIST_REMOVE(n1, entries);
+	free(n1);
+}
+
+n1 = LIST_FIRST(&head);			/* Faster List Deletion. */
+while (n1 != NULL) {
+	n2 = LIST_NEXT(n1, entries);
+	free(n1);
+	n1 = n2;
+}
+LIST_INIT(&head);
+.Ed
+.Sh TAIL QUEUES
+A tail queue is headed by a structure defined by the
+.Nm TAILQ_HEAD
+macro.
+This structure contains a pair of pointers,
+one to the first element in the tail queue and the other to
+the last element in the tail queue.
+The elements are doubly linked so that an arbitrary element can be
+removed without traversing the tail queue.
+New elements can be added to the tail queue after an existing element,
+before an existing element, at the head of the tail queue,
+or at the end of the tail queue.
+A
+.Fa TAILQ_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+TAILQ_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Li HEADNAME
+is the name of the structure to be defined, and
+.Li TYPE
+is the type of the elements to be linked into the tail queue.
+A pointer to the head of the tail queue can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm TAILQ_HEAD_INITIALIZER
+evaluates to an initializer for the tail queue
+.Fa head .
+.Pp
+The macro
+.Nm TAILQ_CONCAT
+concatenates the tail queue headed by
+.Fa head2
+onto the end of the one headed by
+.Fa head1
+removing all entries from the former.
+.Pp
+The macro
+.Nm TAILQ_EMPTY
+evaluates to true if there are no items on the tail queue.
+.Pp
+The macro
+.Nm TAILQ_ENTRY
+declares a structure that connects the elements in
+the tail queue.
+.Pp
+The macro
+.Nm TAILQ_FIRST
+returns the first item on the tail queue or NULL if the tail queue
+is empty.
+.Pp
+The macro
+.Nm TAILQ_FOREACH
+traverses the tail queue referenced by
+.Fa head
+in the forward direction, assigning each element in turn to
+.Fa var .
+.Fa var
+is set to
+.Dv NULL
+if the loop completes normally, or if there were no elements.
+.Pp
+The macro
+.Nm TAILQ_FOREACH_REVERSE
+traverses the tail queue referenced by
+.Fa head
+in the reverse direction, assigning each element in turn to
+.Fa var .
+.Pp
+The macros
+.Nm TAILQ_FOREACH_SAFE
+and
+.Nm TAILQ_FOREACH_REVERSE_SAFE
+traverse the list referenced by
+.Fa head
+in the forward or reverse direction respectively,
+assigning each element in turn to
+.Fa var .
+However, unlike their unsafe counterparts,
+.Nm TAILQ_FOREACH
+and
+.Nm TAILQ_FOREACH_REVERSE
+permit to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm TAILQ_INIT
+initializes the tail queue referenced by
+.Fa head .
+.Pp
+The macro
+.Nm TAILQ_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the tail queue.
+.Pp
+The macro
+.Nm TAILQ_INSERT_TAIL
+inserts the new element
+.Fa elm
+at the end of the tail queue.
+.Pp
+The macro
+.Nm TAILQ_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm TAILQ_INSERT_BEFORE
+inserts the new element
+.Fa elm
+before the element
+.Fa listelm .
+.Pp
+The macro
+.Nm TAILQ_LAST
+returns the last item on the tail queue.
+If the tail queue is empty the return value is
+.Dv NULL .
+.Pp
+The macro
+.Nm TAILQ_NEXT
+returns the next item on the tail queue, or NULL if this item is the last.
+.Pp
+The macro
+.Nm TAILQ_PREV
+returns the previous item on the tail queue, or NULL if this item
+is the first.
+.Pp
+The macro
+.Nm TAILQ_REMOVE
+removes the element
+.Fa elm
+from the tail queue.
+.Pp
+The macro
+.Nm TAILQ_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh TAIL QUEUE EXAMPLE
+.Bd -literal
+TAILQ_HEAD(tailhead, entry) head =
+    TAILQ_HEAD_INITIALIZER(head);
+struct tailhead *headp;			/* Tail queue head. */
+struct entry {
+	...
+	TAILQ_ENTRY(entry) entries;	/* Tail queue. */
+	...
+} *n1, *n2, *n3, *np;
+
+TAILQ_INIT(&head);			/* Initialize the queue. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+TAILQ_INSERT_HEAD(&head, n1, entries);
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the tail. */
+TAILQ_INSERT_TAIL(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+TAILQ_INSERT_AFTER(&head, n1, n2, entries);
+
+n3 = malloc(sizeof(struct entry));	/* Insert before. */
+TAILQ_INSERT_BEFORE(n2, n3, entries);
+
+TAILQ_REMOVE(&head, n2, entries);	/* Deletion. */
+free(n2);
+					/* Forward traversal. */
+TAILQ_FOREACH(np, &head, entries)
+	np-> ...
+					/* Safe forward traversal. */
+TAILQ_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	TAILQ_REMOVE(&head, np, entries);
+	free(np);
+}
+					/* Reverse traversal. */
+TAILQ_FOREACH_REVERSE(np, &head, tailhead, entries)
+	np-> ...
+					/* TailQ Deletion. */
+while (!TAILQ_EMPTY(&head)) {
+	n1 = TAILQ_FIRST(&head);
+	TAILQ_REMOVE(&head, n1, entries);
+	free(n1);
+}
+					/* Faster TailQ Deletion. */
+n1 = TAILQ_FIRST(&head);
+while (n1 != NULL) {
+	n2 = TAILQ_NEXT(n1, entries);
+	free(n1);
+	n1 = n2;
+}
+TAILQ_INIT(&head);
+.Ed
+.Sh SEE ALSO
+.Xr tree 3
+.Sh HISTORY
+The
+.Nm queue
+functions first appeared in
+.Bx 4.4 .
diff --git a/tools/libxl/external/bsd-sys-queue.h b/tools/libxl/external/bsd-sys-queue.h
new file mode 100644
index 0000000..274e636
--- /dev/null
+++ b/tools/libxl/external/bsd-sys-queue.h
@@ -0,0 +1,637 @@
+/*-
+ * Copyright (c) 1991, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)queue.h	8.5 (Berkeley) 8/20/94
+ * $FreeBSD$
+ */
+
+#ifndef _SYS_QUEUE_H_
+#define	_SYS_QUEUE_H_
+
+#include <sys/cdefs.h>
+
+/*
+ * This file defines four types of data structures: singly-linked lists,
+ * singly-linked tail queues, lists and tail queues.
+ *
+ * A singly-linked list is headed by a single forward pointer. The elements
+ * are singly linked for minimum space and pointer manipulation overhead at
+ * the expense of O(n) removal for arbitrary elements. New elements can be
+ * added to the list after an existing element or at the head of the list.
+ * Elements being removed from the head of the list should use the explicit
+ * macro for this purpose for optimum efficiency. A singly-linked list may
+ * only be traversed in the forward direction.  Singly-linked lists are ideal
+ * for applications with large datasets and few or no removals or for
+ * implementing a LIFO queue.
+ *
+ * A singly-linked tail queue is headed by a pair of pointers, one to the
+ * head of the list and the other to the tail of the list. The elements are
+ * singly linked for minimum space and pointer manipulation overhead at the
+ * expense of O(n) removal for arbitrary elements. New elements can be added
+ * to the list after an existing element, at the head of the list, or at the
+ * end of the list. Elements being removed from the head of the tail queue
+ * should use the explicit macro for this purpose for optimum efficiency.
+ * A singly-linked tail queue may only be traversed in the forward direction.
+ * Singly-linked tail queues are ideal for applications with large datasets
+ * and few or no removals or for implementing a FIFO queue.
+ *
+ * A list is headed by a single forward pointer (or an array of forward
+ * pointers for a hash table header). The elements are doubly linked
+ * so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before
+ * or after an existing element or at the head of the list. A list
+ * may only be traversed in the forward direction.
+ *
+ * A tail queue is headed by a pair of pointers, one to the head of the
+ * list and the other to the tail of the list. The elements are doubly
+ * linked so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before or
+ * after an existing element, at the head of the list, or at the end of
+ * the list. A tail queue may be traversed in either direction.
+ *
+ * For details on the use of these macros, see the queue(3) manual page.
+ *
+ *
+ *				SLIST	LIST	STAILQ	TAILQ
+ * _HEAD			+	+	+	+
+ * _HEAD_INITIALIZER		+	+	+	+
+ * _ENTRY			+	+	+	+
+ * _INIT			+	+	+	+
+ * _EMPTY			+	+	+	+
+ * _FIRST			+	+	+	+
+ * _NEXT			+	+	+	+
+ * _PREV			-	-	-	+
+ * _LAST			-	-	+	+
+ * _FOREACH			+	+	+	+
+ * _FOREACH_SAFE		+	+	+	+
+ * _FOREACH_REVERSE		-	-	-	+
+ * _FOREACH_REVERSE_SAFE	-	-	-	+
+ * _INSERT_HEAD			+	+	+	+
+ * _INSERT_BEFORE		-	+	-	+
+ * _INSERT_AFTER		+	+	+	+
+ * _INSERT_TAIL			-	-	+	+
+ * _CONCAT			-	-	+	+
+ * _REMOVE_AFTER		+	-	+	-
+ * _REMOVE_HEAD			+	-	+	-
+ * _REMOVE			+	+	+	+
+ * _SWAP			+	+	+	+
+ *
+ */
+#ifdef QUEUE_MACRO_DEBUG
+/* Store the last 2 places the queue element or head was altered */
+struct qm_trace {
+	char * lastfile;
+	int lastline;
+	char * prevfile;
+	int prevline;
+};
+
+#define	TRACEBUF	struct qm_trace trace;
+#define	TRASHIT(x)	do {(x) = (void *)-1;} while (0)
+#define	QMD_SAVELINK(name, link)	void **name = (void *)&(link)
+
+#define	QMD_TRACE_HEAD(head) do {					\
+	(head)->trace.prevline = (head)->trace.lastline;		\
+	(head)->trace.prevfile = (head)->trace.lastfile;		\
+	(head)->trace.lastline = __LINE__;				\
+	(head)->trace.lastfile = __FILE__;				\
+} while (0)
+
+#define	QMD_TRACE_ELEM(elem) do {					\
+	(elem)->trace.prevline = (elem)->trace.lastline;		\
+	(elem)->trace.prevfile = (elem)->trace.lastfile;		\
+	(elem)->trace.lastline = __LINE__;				\
+	(elem)->trace.lastfile = __FILE__;				\
+} while (0)
+
+#else
+#define	QMD_TRACE_ELEM(elem)
+#define	QMD_TRACE_HEAD(head)
+#define	QMD_SAVELINK(name, link)
+#define	TRACEBUF
+#define	TRASHIT(x)
+#endif	/* QUEUE_MACRO_DEBUG */
+
+/*
+ * Singly-linked List declarations.
+ */
+#define	SLIST_HEAD(name, type)						\
+struct name {								\
+	struct type *slh_first;	/* first element */			\
+}
+
+#define	SLIST_HEAD_INITIALIZER(head)					\
+	{ NULL }
+
+#define	SLIST_ENTRY(type)						\
+struct {								\
+	struct type *sle_next;	/* next element */			\
+}
+
+/*
+ * Singly-linked List functions.
+ */
+#define	SLIST_EMPTY(head)	((head)->slh_first == NULL)
+
+#define	SLIST_FIRST(head)	((head)->slh_first)
+
+#define	SLIST_FOREACH(var, head, field)					\
+	for ((var) = SLIST_FIRST((head));				\
+	    (var);							\
+	    (var) = SLIST_NEXT((var), field))
+
+#define	SLIST_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = SLIST_FIRST((head));				\
+	    (var) && ((tvar) = SLIST_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	SLIST_FOREACH_PREVPTR(var, varp, head, field)			\
+	for ((varp) = &SLIST_FIRST((head));				\
+	    ((var) = *(varp)) != NULL;					\
+	    (varp) = &SLIST_NEXT((var), field))
+
+#define	SLIST_INIT(head) do {						\
+	SLIST_FIRST((head)) = NULL;					\
+} while (0)
+
+#define	SLIST_INSERT_AFTER(slistelm, elm, field) do {			\
+	SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field);	\
+	SLIST_NEXT((slistelm), field) = (elm);				\
+} while (0)
+
+#define	SLIST_INSERT_HEAD(head, elm, field) do {			\
+	SLIST_NEXT((elm), field) = SLIST_FIRST((head));			\
+	SLIST_FIRST((head)) = (elm);					\
+} while (0)
+
+#define	SLIST_NEXT(elm, field)	((elm)->field.sle_next)
+
+#define	SLIST_REMOVE(head, elm, type, field) do {			\
+	QMD_SAVELINK(oldnext, (elm)->field.sle_next);			\
+	if (SLIST_FIRST((head)) == (elm)) {				\
+		SLIST_REMOVE_HEAD((head), field);			\
+	}								\
+	else {								\
+		struct type *curelm = SLIST_FIRST((head));		\
+		while (SLIST_NEXT(curelm, field) != (elm))		\
+			curelm = SLIST_NEXT(curelm, field);		\
+		SLIST_REMOVE_AFTER(curelm, field);			\
+	}								\
+	TRASHIT(*oldnext);						\
+} while (0)
+
+#define SLIST_REMOVE_AFTER(elm, field) do {				\
+	SLIST_NEXT(elm, field) =					\
+	    SLIST_NEXT(SLIST_NEXT(elm, field), field);			\
+} while (0)
+
+#define	SLIST_REMOVE_HEAD(head, field) do {				\
+	SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field);	\
+} while (0)
+
+#define SLIST_SWAP(head1, head2, type) do {				\
+	struct type *swap_first = SLIST_FIRST(head1);			\
+	SLIST_FIRST(head1) = SLIST_FIRST(head2);			\
+	SLIST_FIRST(head2) = swap_first;				\
+} while (0)
+
+/*
+ * Singly-linked Tail queue declarations.
+ */
+#define	STAILQ_HEAD(name, type)						\
+struct name {								\
+	struct type *stqh_first;/* first element */			\
+	struct type **stqh_last;/* addr of last next element */		\
+}
+
+#define	STAILQ_HEAD_INITIALIZER(head)					\
+	{ NULL, &(head).stqh_first }
+
+#define	STAILQ_ENTRY(type)						\
+struct {								\
+	struct type *stqe_next;	/* next element */			\
+}
+
+/*
+ * Singly-linked Tail queue functions.
+ */
+#define	STAILQ_CONCAT(head1, head2) do {				\
+	if (!STAILQ_EMPTY((head2))) {					\
+		*(head1)->stqh_last = (head2)->stqh_first;		\
+		(head1)->stqh_last = (head2)->stqh_last;		\
+		STAILQ_INIT((head2));					\
+	}								\
+} while (0)
+
+#define	STAILQ_EMPTY(head)	((head)->stqh_first == NULL)
+
+#define	STAILQ_FIRST(head)	((head)->stqh_first)
+
+#define	STAILQ_FOREACH(var, head, field)				\
+	for((var) = STAILQ_FIRST((head));				\
+	   (var);							\
+	   (var) = STAILQ_NEXT((var), field))
+
+
+#define	STAILQ_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = STAILQ_FIRST((head));				\
+	    (var) && ((tvar) = STAILQ_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	STAILQ_INIT(head) do {						\
+	STAILQ_FIRST((head)) = NULL;					\
+	(head)->stqh_last = &STAILQ_FIRST((head));			\
+} while (0)
+
+#define	STAILQ_INSERT_AFTER(head, tqelm, elm, field) do {		\
+	if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
+		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
+	STAILQ_NEXT((tqelm), field) = (elm);				\
+} while (0)
+
+#define	STAILQ_INSERT_HEAD(head, elm, field) do {			\
+	if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL)	\
+		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
+	STAILQ_FIRST((head)) = (elm);					\
+} while (0)
+
+#define	STAILQ_INSERT_TAIL(head, elm, field) do {			\
+	STAILQ_NEXT((elm), field) = NULL;				\
+	*(head)->stqh_last = (elm);					\
+	(head)->stqh_last = &STAILQ_NEXT((elm), field);			\
+} while (0)
+
+#define	STAILQ_LAST(head, type, field)					\
+	(STAILQ_EMPTY((head)) ?						\
+		NULL :							\
+	        ((struct type *)(void *)				\
+		((char *)((head)->stqh_last) - __offsetof(struct type, field))))
+
+#define	STAILQ_NEXT(elm, field)	((elm)->field.stqe_next)
+
+#define	STAILQ_REMOVE(head, elm, type, field) do {			\
+	QMD_SAVELINK(oldnext, (elm)->field.stqe_next);			\
+	if (STAILQ_FIRST((head)) == (elm)) {				\
+		STAILQ_REMOVE_HEAD((head), field);			\
+	}								\
+	else {								\
+		struct type *curelm = STAILQ_FIRST((head));		\
+		while (STAILQ_NEXT(curelm, field) != (elm))		\
+			curelm = STAILQ_NEXT(curelm, field);		\
+		STAILQ_REMOVE_AFTER(head, curelm, field);		\
+	}								\
+	TRASHIT(*oldnext);						\
+} while (0)
+
+#define STAILQ_REMOVE_AFTER(head, elm, field) do {			\
+	if ((STAILQ_NEXT(elm, field) =					\
+	     STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL)	\
+		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
+} while (0)
+
+#define	STAILQ_REMOVE_HEAD(head, field) do {				\
+	if ((STAILQ_FIRST((head)) =					\
+	     STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL)		\
+		(head)->stqh_last = &STAILQ_FIRST((head));		\
+} while (0)
+
+#define STAILQ_SWAP(head1, head2, type) do {				\
+	struct type *swap_first = STAILQ_FIRST(head1);			\
+	struct type **swap_last = (head1)->stqh_last;			\
+	STAILQ_FIRST(head1) = STAILQ_FIRST(head2);			\
+	(head1)->stqh_last = (head2)->stqh_last;			\
+	STAILQ_FIRST(head2) = swap_first;				\
+	(head2)->stqh_last = swap_last;					\
+	if (STAILQ_EMPTY(head1))					\
+		(head1)->stqh_last = &STAILQ_FIRST(head1);		\
+	if (STAILQ_EMPTY(head2))					\
+		(head2)->stqh_last = &STAILQ_FIRST(head2);		\
+} while (0)
+
+
+/*
+ * List declarations.
+ */
+#define	LIST_HEAD(name, type)						\
+struct name {								\
+	struct type *lh_first;	/* first element */			\
+}
+
+#define	LIST_HEAD_INITIALIZER(head)					\
+	{ NULL }
+
+#define	LIST_ENTRY(type)						\
+struct {								\
+	struct type *le_next;	/* next element */			\
+	struct type **le_prev;	/* address of previous next element */	\
+}
+
+/*
+ * List functions.
+ */
+
+#if (defined(_KERNEL) && defined(INVARIANTS))
+#define	QMD_LIST_CHECK_HEAD(head, field) do {				\
+	if (LIST_FIRST((head)) != NULL &&				\
+	    LIST_FIRST((head))->field.le_prev !=			\
+	     &LIST_FIRST((head)))					\
+		panic("Bad list head %p first->prev != head", (head));	\
+} while (0)
+
+#define	QMD_LIST_CHECK_NEXT(elm, field) do {				\
+	if (LIST_NEXT((elm), field) != NULL &&				\
+	    LIST_NEXT((elm), field)->field.le_prev !=			\
+	     &((elm)->field.le_next))					\
+	     	panic("Bad link elm %p next->prev != elm", (elm));	\
+} while (0)
+
+#define	QMD_LIST_CHECK_PREV(elm, field) do {				\
+	if (*(elm)->field.le_prev != (elm))				\
+		panic("Bad link elm %p prev->next != elm", (elm));	\
+} while (0)
+#else
+#define	QMD_LIST_CHECK_HEAD(head, field)
+#define	QMD_LIST_CHECK_NEXT(elm, field)
+#define	QMD_LIST_CHECK_PREV(elm, field)
+#endif /* (_KERNEL && INVARIANTS) */
+
+#define	LIST_EMPTY(head)	((head)->lh_first == NULL)
+
+#define	LIST_FIRST(head)	((head)->lh_first)
+
+#define	LIST_FOREACH(var, head, field)					\
+	for ((var) = LIST_FIRST((head));				\
+	    (var);							\
+	    (var) = LIST_NEXT((var), field))
+
+#define	LIST_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = LIST_FIRST((head));				\
+	    (var) && ((tvar) = LIST_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	LIST_INIT(head) do {						\
+	LIST_FIRST((head)) = NULL;					\
+} while (0)
+
+#define	LIST_INSERT_AFTER(listelm, elm, field) do {			\
+	QMD_LIST_CHECK_NEXT(listelm, field);				\
+	if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\
+		LIST_NEXT((listelm), field)->field.le_prev =		\
+		    &LIST_NEXT((elm), field);				\
+	LIST_NEXT((listelm), field) = (elm);				\
+	(elm)->field.le_prev = &LIST_NEXT((listelm), field);		\
+} while (0)
+
+#define	LIST_INSERT_BEFORE(listelm, elm, field) do {			\
+	QMD_LIST_CHECK_PREV(listelm, field);				\
+	(elm)->field.le_prev = (listelm)->field.le_prev;		\
+	LIST_NEXT((elm), field) = (listelm);				\
+	*(listelm)->field.le_prev = (elm);				\
+	(listelm)->field.le_prev = &LIST_NEXT((elm), field);		\
+} while (0)
+
+#define	LIST_INSERT_HEAD(head, elm, field) do {				\
+	QMD_LIST_CHECK_HEAD((head), field);				\
+	if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL)	\
+		LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\
+	LIST_FIRST((head)) = (elm);					\
+	(elm)->field.le_prev = &LIST_FIRST((head));			\
+} while (0)
+
+#define	LIST_NEXT(elm, field)	((elm)->field.le_next)
+
+#define	LIST_REMOVE(elm, field) do {					\
+	QMD_SAVELINK(oldnext, (elm)->field.le_next);			\
+	QMD_SAVELINK(oldprev, (elm)->field.le_prev);			\
+	QMD_LIST_CHECK_NEXT(elm, field);				\
+	QMD_LIST_CHECK_PREV(elm, field);				\
+	if (LIST_NEXT((elm), field) != NULL)				\
+		LIST_NEXT((elm), field)->field.le_prev = 		\
+		    (elm)->field.le_prev;				\
+	*(elm)->field.le_prev = LIST_NEXT((elm), field);		\
+	TRASHIT(*oldnext);						\
+	TRASHIT(*oldprev);						\
+} while (0)
+
+#define LIST_SWAP(head1, head2, type, field) do {			\
+	struct type *swap_tmp = LIST_FIRST((head1));			\
+	LIST_FIRST((head1)) = LIST_FIRST((head2));			\
+	LIST_FIRST((head2)) = swap_tmp;					\
+	if ((swap_tmp = LIST_FIRST((head1))) != NULL)			\
+		swap_tmp->field.le_prev = &LIST_FIRST((head1));		\
+	if ((swap_tmp = LIST_FIRST((head2))) != NULL)			\
+		swap_tmp->field.le_prev = &LIST_FIRST((head2));		\
+} while (0)
+
+/*
+ * Tail queue declarations.
+ */
+#define	TAILQ_HEAD(name, type)						\
+struct name {								\
+	struct type *tqh_first;	/* first element */			\
+	struct type **tqh_last;	/* addr of last next element */		\
+	TRACEBUF							\
+}
+
+#define	TAILQ_HEAD_INITIALIZER(head)					\
+	{ NULL, &(head).tqh_first }
+
+#define	TAILQ_ENTRY(type)						\
+struct {								\
+	struct type *tqe_next;	/* next element */			\
+	struct type **tqe_prev;	/* address of previous next element */	\
+	TRACEBUF							\
+}
+
+/*
+ * Tail queue functions.
+ */
+#if (defined(_KERNEL) && defined(INVARIANTS))
+#define	QMD_TAILQ_CHECK_HEAD(head, field) do {				\
+	if (!TAILQ_EMPTY(head) &&					\
+	    TAILQ_FIRST((head))->field.tqe_prev !=			\
+	     &TAILQ_FIRST((head)))					\
+		panic("Bad tailq head %p first->prev != head", (head));	\
+} while (0)
+
+#define	QMD_TAILQ_CHECK_TAIL(head, field) do {				\
+	if (*(head)->tqh_last != NULL)					\
+	    	panic("Bad tailq NEXT(%p->tqh_last) != NULL", (head)); 	\
+} while (0)
+
+#define	QMD_TAILQ_CHECK_NEXT(elm, field) do {				\
+	if (TAILQ_NEXT((elm), field) != NULL &&				\
+	    TAILQ_NEXT((elm), field)->field.tqe_prev !=			\
+	     &((elm)->field.tqe_next))					\
+		panic("Bad link elm %p next->prev != elm", (elm));	\
+} while (0)
+
+#define	QMD_TAILQ_CHECK_PREV(elm, field) do {				\
+	if (*(elm)->field.tqe_prev != (elm))				\
+		panic("Bad link elm %p prev->next != elm", (elm));	\
+} while (0)
+#else
+#define	QMD_TAILQ_CHECK_HEAD(head, field)
+#define	QMD_TAILQ_CHECK_TAIL(head, headname)
+#define	QMD_TAILQ_CHECK_NEXT(elm, field)
+#define	QMD_TAILQ_CHECK_PREV(elm, field)
+#endif /* (_KERNEL && INVARIANTS) */
+
+#define	TAILQ_CONCAT(head1, head2, field) do {				\
+	if (!TAILQ_EMPTY(head2)) {					\
+		*(head1)->tqh_last = (head2)->tqh_first;		\
+		(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last;	\
+		(head1)->tqh_last = (head2)->tqh_last;			\
+		TAILQ_INIT((head2));					\
+		QMD_TRACE_HEAD(head1);					\
+		QMD_TRACE_HEAD(head2);					\
+	}								\
+} while (0)
+
+#define	TAILQ_EMPTY(head)	((head)->tqh_first == NULL)
+
+#define	TAILQ_FIRST(head)	((head)->tqh_first)
+
+#define	TAILQ_FOREACH(var, head, field)					\
+	for ((var) = TAILQ_FIRST((head));				\
+	    (var);							\
+	    (var) = TAILQ_NEXT((var), field))
+
+#define	TAILQ_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = TAILQ_FIRST((head));				\
+	    (var) && ((tvar) = TAILQ_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	TAILQ_FOREACH_REVERSE(var, head, headname, field)		\
+	for ((var) = TAILQ_LAST((head), headname);			\
+	    (var);							\
+	    (var) = TAILQ_PREV((var), headname, field))
+
+#define	TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar)	\
+	for ((var) = TAILQ_LAST((head), headname);			\
+	    (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1);	\
+	    (var) = (tvar))
+
+#define	TAILQ_INIT(head) do {						\
+	TAILQ_FIRST((head)) = NULL;					\
+	(head)->tqh_last = &TAILQ_FIRST((head));			\
+	QMD_TRACE_HEAD(head);						\
+} while (0)
+
+#define	TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
+	QMD_TAILQ_CHECK_NEXT(listelm, field);				\
+	if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\
+		TAILQ_NEXT((elm), field)->field.tqe_prev = 		\
+		    &TAILQ_NEXT((elm), field);				\
+	else {								\
+		(head)->tqh_last = &TAILQ_NEXT((elm), field);		\
+		QMD_TRACE_HEAD(head);					\
+	}								\
+	TAILQ_NEXT((listelm), field) = (elm);				\
+	(elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field);		\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+	QMD_TRACE_ELEM(&listelm->field);				\
+} while (0)
+
+#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\
+	QMD_TAILQ_CHECK_PREV(listelm, field);				\
+	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\
+	TAILQ_NEXT((elm), field) = (listelm);				\
+	*(listelm)->field.tqe_prev = (elm);				\
+	(listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field);		\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+	QMD_TRACE_ELEM(&listelm->field);				\
+} while (0)
+
+#define	TAILQ_INSERT_HEAD(head, elm, field) do {			\
+	QMD_TAILQ_CHECK_HEAD(head, field);				\
+	if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL)	\
+		TAILQ_FIRST((head))->field.tqe_prev =			\
+		    &TAILQ_NEXT((elm), field);				\
+	else								\
+		(head)->tqh_last = &TAILQ_NEXT((elm), field);		\
+	TAILQ_FIRST((head)) = (elm);					\
+	(elm)->field.tqe_prev = &TAILQ_FIRST((head));			\
+	QMD_TRACE_HEAD(head);						\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+} while (0)
+
+#define	TAILQ_INSERT_TAIL(head, elm, field) do {			\
+	QMD_TAILQ_CHECK_TAIL(head, field);				\
+	TAILQ_NEXT((elm), field) = NULL;				\
+	(elm)->field.tqe_prev = (head)->tqh_last;			\
+	*(head)->tqh_last = (elm);					\
+	(head)->tqh_last = &TAILQ_NEXT((elm), field);			\
+	QMD_TRACE_HEAD(head);						\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+} while (0)
+
+#define	TAILQ_LAST(head, headname)					\
+	(*(((struct headname *)((head)->tqh_last))->tqh_last))
+
+#define	TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
+
+#define	TAILQ_PREV(elm, headname, field)				\
+	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
+
+#define	TAILQ_REMOVE(head, elm, field) do {				\
+	QMD_SAVELINK(oldnext, (elm)->field.tqe_next);			\
+	QMD_SAVELINK(oldprev, (elm)->field.tqe_prev);			\
+	QMD_TAILQ_CHECK_NEXT(elm, field);				\
+	QMD_TAILQ_CHECK_PREV(elm, field);				\
+	if ((TAILQ_NEXT((elm), field)) != NULL)				\
+		TAILQ_NEXT((elm), field)->field.tqe_prev = 		\
+		    (elm)->field.tqe_prev;				\
+	else {								\
+		(head)->tqh_last = (elm)->field.tqe_prev;		\
+		QMD_TRACE_HEAD(head);					\
+	}								\
+	*(elm)->field.tqe_prev = TAILQ_NEXT((elm), field);		\
+	TRASHIT(*oldnext);						\
+	TRASHIT(*oldprev);						\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+} while (0)
+
+#define TAILQ_SWAP(head1, head2, type, field) do {			\
+	struct type *swap_first = (head1)->tqh_first;			\
+	struct type **swap_last = (head1)->tqh_last;			\
+	(head1)->tqh_first = (head2)->tqh_first;			\
+	(head1)->tqh_last = (head2)->tqh_last;				\
+	(head2)->tqh_first = swap_first;				\
+	(head2)->tqh_last = swap_last;					\
+	if ((swap_first = (head1)->tqh_first) != NULL)			\
+		swap_first->field.tqe_prev = &(head1)->tqh_first;	\
+	else								\
+		(head1)->tqh_last = &(head1)->tqh_first;		\
+	if ((swap_first = (head2)->tqh_first) != NULL)			\
+		swap_first->field.tqe_prev = &(head2)->tqh_first;	\
+	else								\
+		(head2)->tqh_last = &(head2)->tqh_first;		\
+} while (0)
+
+#endif /* !_SYS_QUEUE_H_ */
-- 
tg: (92a50a8..) t/xen/bsd-queue (depends on: t/xen/gitignore)

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 10:36:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 10:36:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJTsa-0003nn-7X; Thu, 27 Oct 2011 10:36:36 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJTri-0003ar-B7
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 10:35:42 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319736936!1310835!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19854 invoked from network); 27 Oct 2011 17:35:38 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-16.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 17:35:38 -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
	p9RHZY8Y027726
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 17:35: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
	p9RHZY9V029618
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 17:35:34 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
	p9RHZSRk023588; Thu, 27 Oct 2011 12:35:28 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 27 Oct 2011 10:35:28 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 58DB182C26; Thu, 27 Oct 2011 13:35:27 -0400 (EDT)
Date: Thu, 27 Oct 2011 13:35:27 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Miche Baker-Harvey <miche@google.com>
Message-ID: <20111027173527.GA23839@phenom.dumpdata.com>
References: <20111027053007.GA32765@phenom.dumpdata.com>
	<20111027054806.GA1377@suse.de>
	<CAB8Rdaq2r4Uc-WZK-k=wiEW8DKdixn+9dB7E4_XDL7k8jCMwSw@mail.gmail.com>
	<20111027150826.GC1157@phenom.dumpdata.com>
	<20111027153132.GA2751@phenom.dumpdata.com>
	<CAB8RdarECbYFuuD7-Jz_o5kC3aBd5JAASB76B=ZioYo2-sjPfg@mail.gmail.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <CAB8RdarECbYFuuD7-Jz_o5kC3aBd5JAASB76B=ZioYo2-sjPfg@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.0A090204.4EA99668.000C:SCFMA922111,ss=1,re=-4.000,fgs=0
Cc: xen-devel@lists.xensource.com, Greg KH <gregkh@suse.de>,
	linux-kernel@vger.kernel.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 Thu, Oct 27, 2011 at 10:22:21AM -0700, Miche Baker-Harvey wrote:
> Konrad,
> 
> This looks similar to something I was seeing before I added some
> locking and multi-hvc console support.
> I think what's happening is that once the console is enabled, the
> first line in printk's console buffer is
> being infinitely printed.  Would you be willing to try another patch?

Sure.
> I'm pulling the patch into Linus'
> latest now...

OK. Just send it to me and I will try it out.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 10:48:30 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 10:48:30 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJU45-0004Nw-9X; Thu, 27 Oct 2011 10:48:29 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJU3H-0004BU-Jl
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 10:47:39 -0700
X-Env-Sender: anil@recoil.org
X-Msg-Ref: server-4.tower-182.messagelabs.com!1319737656!994520!1
X-Originating-IP: [89.16.177.154]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8951 invoked from network); 27 Oct 2011 17:47:36 -0000
Received: from recoil.dh.bytemark.co.uk (HELO dark.recoil.org) (89.16.177.154)
	by server-4.tower-182.messagelabs.com with SMTP;
	27 Oct 2011 17:47:36 -0000
Received: (qmail 2071 invoked by uid 634); 27 Oct 2011 17:47:36 -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 [192.168.2.3]) (128.232.32.220)
	(smtp-auth username remote@recoil.org, mechanism cram-md5)
	by dark.recoil.org (qpsmtpd/0.83) with ESMTPA;
	Thu, 27 Oct 2011 18:47:35 +0100
Subject: Re: [Xen-devel] [PATCH v2] 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: <20137.36872.515552.56355@mariner.uk.xensource.com>
Date: Thu, 27 Oct 2011 18:47:03 +0100
Content-Transfer-Encoding: quoted-printable
Message-Id: <92153636-70FA-4A57-BF1C-B8156BA8C641@recoil.org>
References: <20137.36872.515552.56355@mariner.uk.xensource.com>
To: Ian Jackson <Ian.Jackson@eu.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
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 Oct 2011, at 18:08, Ian Jackson wrote:

> We would like some linked list macros which are (a) well known to be
> sane and (b) typesafe.  BSD's queue.h meets these criteria.
>=20
> We also provide some simple perlery to arrange to add the libxl_
> namespace prefix to the macros.  This will allow us to #include
> _libxl_list.h in our public header file without clashing with anyone
> else who is also using another version of queue.h.
>=20
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
>=20
> ---
>=20
> Changes since v1:
>   - use move-if-changed to install _libxl_list.h
>   - mention bsd-queue.3's 4-clause BSD licence in COPYING
>   - explictly call the perl script from the Makefile with "perl"
>   - move the imported files into external/ and provide a README there
>   - sed out the include of sys/cdefs.h
>   - improved commit message
>=20
>=20
> COPYING                              |    8 +
> tools/libxl/Makefile                 |   10 +-
> tools/libxl/bsd-sys-queue-h-seddery  |   70 +++
> tools/libxl/external/README          |   13 +
> tools/libxl/external/bsd-queue.3     | 1044 =
++++++++++++++++++++++++++++++++++
> tools/libxl/external/bsd-sys-queue.h |  637 +++++++++++++++++++++
> 6 files changed, 1779 insertions(+), 3 deletions(-)
>=20
> diff --git a/COPYING b/COPYING
> index 07535ad..524542d 100644
> --- a/COPYING
> +++ b/COPYING
> @@ -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.

FWIW, the advertising clause was rescinded by Berkeley about 12 years =
ago and can be removed from their code. OpenBSD did this in queue.3 in:

Author: Todd C. Miller <millert@openbsd.org>
Date:   Mon Jun 2 23:32:09 2003 +0000

    Remove the advertising clause in the UCB license which Berkeley
    rescinded 22 July 1999.  Proofed by myself and Theo.

...so you may want to grab that version for simplicity. I'm not sure why =
FreeBSD hasn't removed it.

-anil


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 12:46:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 12:46:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJVu5-0000f8-V2; Thu, 27 Oct 2011 12:46:17 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJVtL-0000Sd-53
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 12:45:32 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1319744726!1312301!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31878 invoked from network); 27 Oct 2011 19:45:27 -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;
	27 Oct 2011 19:45:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,414,1315180800"; 
   d="scan'208";a="8628333"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 19:45: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; Thu, 27 Oct 2011 20:45:26 +0100
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 1RJVtG-0007hS-7E;
	Thu, 27 Oct 2011 19:45:26 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RJVtF-0003pI-Sl;
	Thu, 27 Oct 2011 20:45:26 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9641-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 27 Oct 2011 20:45:25 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9641: 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 9641 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9641/

Regressions :-(

Tests which did not succeed and are blocking:
 test-amd64-amd64-xl-sedf      7 debian-install             fail REGR. vs. 9609

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                  c33e15835e33
baseline version:
 xen                  81e39a4978ea

------------------------------------------------------------
People who touched revisions under test:
  Boris Ostrovsky <boris.ostrovsky@amd.com>
  George Dunlap <george.dunlap@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Laszlo Ersek <lersek@redhat.com>
  Wei Wang2 <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                                     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:   23179:c33e15835e33
tag:         tip
user:        Keir Fraser <keir@xen.org>
date:        Thu Oct 27 16:24:01 2011 +0100
    
    Return -EINVAL when trying to kick/kill a nonexistent domain watchdog
    
    ... to be more in-line with the NR_DOMAIN_WATCHDOG_TIMERS check at the
    top of domain_watchdog(), and also to follow the
    timer_(delete|settime)
    POSIX API's EINVAL return value.
    
    Signed-off-by: Laszlo Ersek <lersek@redhat.com>
    
    Also, replace EEXIST with ENOSPC when failing to allocate a new
    domain watchdog.
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    
    Committed-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   23963:7cfd5bb3b9f9
    xen-unstable date:        Fri Oct 14 18:08:04 2011 +0100
    
    
changeset:   23178:849bf4ab5fe0
user:        Boris Ostrovsky <boris.ostrovsky@amd.com>
date:        Thu Oct 27 16:22:53 2011 +0100
    
    x86/AMD: Do not enable ARAT feature on AMD processors below family 0x12
    
    Determining whether an AMD processor is affected by erratum 400 may
    have some corner cases and handling these cases is somewhat
    complicated.
    In the interest of simplicity we won't claim ARAT support on processor
    families below 0x12.
    
    Mirrors Linux commit e9cdd343a5e42c43bcda01e609fa23089e026470
    
    Signed-off-by: Boris Ostrovsky <boris.ostrovsky@amd.com>
    Committed-by: Jan Beulich <jbeulich@suse.com>
    xen-unstable changeset:   23925:08d6ba4e447d
    xen-unstable date:        Fri Oct 07 10:32:15 2011 +0200
    
    
changeset:   23177:9a38e30e5459
user:        Wei Wang2 <wei.wang2@amd.com>
date:        Thu Oct 27 16:14:36 2011 +0100
    
    Backport per-device vector map patches to xen 4.1.3
    
    Recently we found an issue in xen 4.1. Under heavy I/O stress such as
    running bonnie++, Dom0 would lost its hard disk with lots of I/O
    errors. We found that some PCI-E devices was using the same vector as
    SMBus on AMD platforms and George' patch set that enables per-device
    vector map can fix this problem.
    
    23752 xen: Infrastructure to allow irqs to share vector maps
    23753 xen: Option to allow per-device vector maps for MSI IRQs
    23754 xen: AMD IOMMU: Automatically enable per-device vector maps
    23786 x86: Fix up irq vector map logic
    23812 xen: Add global irq_vector_map option
    23899 AMD-IOMMU: remove dead variable references
    
    From: Wei Wang2 <wei.wang2@amd.com>
    Committed-by: Keir Fraser <keir@xen.org>
    
    
    AMD-IOMMU: remove dead variable references
    
    These got orphaned up by recent changes.
    
    Signed-off-by: Jan Beulich <jbeulich@suse.com>
    Acked-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   23899:a99d75671a91
    xen-unstable date:        Tue Oct 04 14:11:56 2011 +0200
    
    
    docs: Fix 'make docs'
    
    Signed-off-by: Keir Fraser <keir@xen.org>
    xen-unstable changeset:   23819:5fe770c8a8a3
    xen-unstable date:        Tue Sep 06 15:49:40 2011 +0100
    
    
    xen: Add global irq_vector_map option, set if using AMD global intremap tables
    
    As mentioned in previous changesets, AMD IOMMU interrupt
    remapping tables only look at the vector, not the destination
    id of an interrupt.  This means that all IRQs going through
    the same interrupt remapping table need to *not* share vectors.
    
    The irq "vector map" functionality was originally introduced
    after a patch which disabled global AMD IOMMUs entirely.  That
    patch has since been reverted, meaning that AMD intremap tables
    can either be per-device or global.
    
    This patch therefore introduces a global irq vector map option,
    and enables it if we're using an AMD IOMMU with a global
    interrupt remapping table.
    
    This patch removes the "irq-perdev-vector-map" boolean
    command-line optino and replaces it with "irq_vector_map",
    which can have one of three values: none, global, or per-device.
    
    Setting the irq_vector_map to any value will override the
    default that the AMD code sets.
    
    Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
    xen-unstable changeset:   23812:32814ad7458d
    xen-unstable date:        Mon Sep 05 15:00:15 2011 +0100
    
    
    x86: Fix up irq vector map logic
    
    We need to make sure that cfg->used_vector is only cleared once;
    otherwise there may be a race condition that allows the same vector to
    be assigned twice, defeating the whole purpose of the map.
    
    This makes two changes:
    * __clear_irq_vector() only clears the vector if the irq is not being
    moved
    * smp_iqr_move_cleanup_interrupt() only clears used_vector if this
    is the last place it's being used (move_cleanup_count==0 after
    decrement).
    
    Also make use of asserts more consistent, to catch this kind of logic
    bug in the future.
    
    Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
    xen-unstable changeset:   23786:3a05da2dc7c0
    xen-unstable date:        Mon Aug 22 16:15:33 2011 +0100
    
    
    xen: AMD IOMMU: Automatically enable per-device vector maps
    
    Automatically enable per-device vector maps when using IOMMU,
    unless disabled specifically by an IOMMU parameter.
    
    Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
    xen-unstable changeset:   23754:fa4e2ca9ecff
    xen-unstable date:        Tue Jul 26 18:37:32 2011 +0100
    
    
    xen: Option to allow per-device vector maps for MSI IRQs
    
    Add a vector-map to pci_dev, and add an option to point MSI-related
    IRQs to the vector-map of the device.
    
    This prevents irqs from the same device from being assigned
    the same vector on different pcpus.  This is required for systems
    using an AMD IOMMU, since the intremap tables on AMD only look at
    vector, and not destination ID.
    
    Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
    xen-unstable changeset:   23753:2e0cf9428554
    xen-unstable date:        Tue Jul 26 18:37:16 2011 +0100
    
    
    xen: Infrastructure to allow irqs to share vector maps
    
    Laying the groundwork for per-device vector maps.  This generic
    code allows any irq to point to a vector map; all irqs sharing the
    same vector map will avoid sharing vectors.
    
    Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
    xen-unstable changeset:   23752:ef9ed3d2aa87
    xen-unstable date:        Tue Jul 26 18:36:58 2011 +0100
    
    
changeset:   23176:81e39a4978ea
user:        Keir Fraser <keir@xen.org>
date:        Mon Oct 24 18:03:35 2011 +0100
    
    Revert xen-unstable:23871:503ee256fecf
    
    Signed-off-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 Oct 27 13:24:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 13:24:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJWVH-0001eN-EY; Thu, 27 Oct 2011 13:24:43 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJWUB-0001RY-IF; Thu, 27 Oct 2011 13:23:36 -0700
X-Env-Sender: joseph.glanville@orionvm.com.au
X-Msg-Ref: server-2.tower-21.messagelabs.com!1319747010!1895309!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29566 invoked from network); 27 Oct 2011 20:23:31 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 20:23:31 -0000
Received: by iaen33 with SMTP id n33so4650864iae.30
	for <multiple recipients>; Thu, 27 Oct 2011 13:23:29 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.231.5.73 with SMTP id 9mr3967810ibu.60.1319747009397; Thu, 27
	Oct 2011 13:23:29 -0700 (PDT)
Received: by 10.231.165.195 with HTTP; Thu, 27 Oct 2011 13:23:29 -0700 (PDT)
X-Originating-IP: [59.167.234.130]
In-Reply-To: <4EA932D5.3060504@xen.org>
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111026195543.GA6558@phenom.dumpdata.com>
	<4EA932D5.3060504@xen.org>
Date: Fri, 28 Oct 2011 07:23:29 +1100
Message-ID: <CAOzFzEiTzSDABmtJw3u+jow5Xw_wRYNxFr9U_G-q59-Qwv7j=g@mail.gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Joseph Glanville <joseph.glanville@orionvm.com.au>
To: Lars Kurth <lars.kurth@xen.org>
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"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>,
	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="===============2040779530=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============2040779530==
Content-Type: multipart/alternative; boundary=00151773db12b0468304b04d8b05

--00151773db12b0468304b04d8b05
Content-Type: text/plain; charset=ISO-8859-1

Great work on categorizing/marking all the pages everyone!

The path is clear now to write some really good documentation. :)

I have started work on a Beginners Guide which is effectively a step by
step guide to a functional install on Debian Sqeeze.
Currently this is the most frictionless and least "magic" way to get Xen up
and running and forms a good basis to experiment with more advanced Xen
features.
The aim of the guide is to introduce all key concepts, get people playing
with Xen in a environment that is relatively fully featured but not too
daunting to setup. It covers everything from basic virtualisation, storage
and networking through to starting, stopping guests and getting Windows
running ontop of Xen.

You can see my progress up on this Google doc:
https://docs.google.com/document/d/1q9odKP8Id26J8kHCAFt8aD5krXdUiZnZGw1Q-LGWCJg/edit
Will format for wiki and publish when it is done.

If anyone would like to contribute feel free to contact me,
comments/suggestions are more than welcome.

Moving on from this I will write a more advanced Debian specific guide that
delves into setting up complex networking, guest isolation techniques,
storage virtualisation and all those goodies.

Very excited to see all the awesome things coming out of this and
definitely recommend we have a monthly thing where we get together and
decide on how we can improve documentation.
Once a direction has been established it's easy to sit down and get stuff
done.

Joseph.



On 27 October 2011 21:30, Lars Kurth <lars.kurth@xen.org> wrote:

> On 26/10/2011 20:55, Konrad Rzeszutek Wilk wrote:
>
>> On Mon, Oct 17, 2011 at 04:37:15PM +0100, Lars Kurth wrote:
>>
>>> Cool.
>>>
>>> I am wondering what people think about archiving vs deleting wiki
>>> pages. Obviously some pages can be deleted (stuff about events, job
>>> listings, old TODO lists, etc.).
>>>
>>> Others may still be valuable to legacy users. See
>>>
>> .. snip..
>> Hey Lars,
>>
>> I was trying to add to https://docs.google.com/**spreadsheet/ccc?key=**
>> 0AiRyVp8djqV3dEJRdVZaQzZmLVNKT**ERwMDNGaTlKdkE&hl=en_US#gid=0<https://docs.google.com/spreadsheet/ccc?key=0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&hl=en_US#gid=0>
>>
>> a couple of things but it seems I am not authorized, anyhow these are the
>> changes:
>>
>> NetBSDdomU merge with How_to_build_NetBSD_DomU_on_**Linux
>> 2.6.18-to-2.6.31-and-higher is OK.
>> InstallationNotes - remove
>> KnownGoodImages - remove
>> InstallGuestImage - remove
>> RealModeArea - archive, or move it to be PPC/RealModeArea
>> USBCompatibilityList - remove
>> XenPCIpassthrough - keep, I just updated it
>> XenPVOPSDRM - keep, just updated it
>> XenSerialConsole - keep, I just updated it
>> XenPVSCSI - keep
>> XenUSBPassthrough - keep, just updated it
>> XenParavirtOps - keep, just updated it.
>> XenOnUbuntu64 - remove
>>
> Odd: you should have write access like anybody else. Anyway, I applied
> your changes.
>



-- 
*
Founder | Director | VP Research
Orion Virtualisation Solutions* | www.orionvm.com.au | Phone: 1300 56 99 52
| Mobile: 0428 754 846

--00151773db12b0468304b04d8b05
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Great work on categorizing/marking all the pages everyone!<br><br>The path =
is clear now to write some really good documentation. :)<br><br>I have star=
ted work on a Beginners Guide which is effectively a step by step guide to =
a functional install on Debian Sqeeze.<br>


Currently this is the most frictionless and least &quot;magic&quot; way to =
get Xen up and running and forms a good basis to experiment with more advan=
ced Xen features.<br>The aim of the guide is to introduce all key concepts,=
 get people playing with Xen in a environment that is relatively fully feat=
ured but not too daunting to setup. It covers everything from basic virtual=
isation, storage and networking through to starting, stopping guests and ge=
tting Windows running ontop of Xen.<br>

<br>You can see my progress up on this Google doc: <a href=3D"https://docs.=
google.com/document/d/1q9odKP8Id26J8kHCAFt8aD5krXdUiZnZGw1Q-LGWCJg/edit" ta=
rget=3D"_blank">https://docs.google.com/document/d/1q9odKP8Id26J8kHCAFt8aD5=
krXdUiZnZGw1Q-LGWCJg/edit</a><br>

Will format for wiki and publish when it is done.<br><br>If anyone would li=
ke to contribute feel free to contact me, comments/suggestions are more tha=
n welcome.<br><br>Moving on from this I will write a more advanced Debian s=
pecific guide that delves into setting up complex networking, guest isolati=
on techniques, storage virtualisation and all those goodies.<br>

<br>Very excited to see all the awesome things coming out of this and defin=
itely recommend we have a monthly thing where we get together and decide on=
 how we can improve documentation.<br>Once a direction has been established=
 it&#39;s easy to sit down and get stuff done.<br>

<br>Joseph.<br><br><br><br><div class=3D"gmail_quote">On 27 October 2011 21=
:30, Lars Kurth <span dir=3D"ltr">&lt;<a href=3D"mailto:lars.kurth@xen.org"=
 target=3D"_blank">lars.kurth@xen.org</a>&gt;</span> wrote:<br><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><div></div><div>On 26/10/2011 20:55, Konrad Rzeszutek Wilk wrote:<br>
<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;">
On Mon, Oct 17, 2011 at 04:37:15PM +0100, Lars Kurth wrote:<br>
<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;">
Cool.<br>
<br>
I am wondering what people think about archiving vs deleting wiki<br>
pages. Obviously some pages can be deleted (stuff about events, job<br>
listings, old TODO lists, etc.).<br>
<br>
Others may still be valuable to legacy users. See<br>
</blockquote>
.. snip..<br>
Hey Lars,<br>
<br>
I was trying to add to <a href=3D"https://docs.google.com/spreadsheet/ccc?k=
ey=3D0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&amp;hl=3Den_US#gid=3D0" t=
arget=3D"_blank">https://docs.google.com/<u></u>spreadsheet/ccc?key=3D<u></=
u>0AiRyVp8djqV3dEJRdVZaQzZmLVNKT<u></u>ERwMDNGaTlKdkE&amp;hl=3Den_US#gid=3D=
0</a><br>



<br>
a couple of things but it seems I am not authorized, anyhow these are the c=
hanges:<br>
<br>
NetBSDdomU merge with How_to_build_NetBSD_DomU_on_<u></u>Linux<br>
2.6.18-to-2.6.31-and-higher is OK.<br>
InstallationNotes - remove<br>
KnownGoodImages - remove<br>
InstallGuestImage - remove<br>
RealModeArea - archive, or move it to be PPC/RealModeArea<br>
USBCompatibilityList - remove<br>
XenPCIpassthrough - keep, I just updated it<br>
XenPVOPSDRM - keep, just updated it<br>
XenSerialConsole - keep, I just updated it<br>
XenPVSCSI - keep<br>
XenUSBPassthrough - keep, just updated it<br>
XenParavirtOps - keep, just updated it.<br>
XenOnUbuntu64 - remove<br>
</blockquote></div></div>
Odd: you should have write access like anybody else. Anyway, I applied your=
 changes.<br>
</blockquote></div><br><br clear=3D"all"><br>-- <br><span style=3D"font-fam=
ily: arial,sans-serif; font-size: 13px; border-collapse: collapse;"><b><i><=
font color=3D"#0000ff"><div><font color=3D"#000000"><span style=3D"font-sty=
le: normal; font-weight: normal;">Founder | Director | VP Research<br>


</span></font></div>Orion Virtualisation Solutions</font></i></b>=A0|=A0<fo=
nt color=3D"#0000ff"><a href=3D"http://www.orionvm.com.au/" style=3D"color:=
 rgb(42, 93, 176);" target=3D"_blank">www.orionvm.com.au</a></font>=A0| Pho=
ne: 1300 56 99 52 | Mobile: 0428 754 846</span><br>




--00151773db12b0468304b04d8b05--


--===============2040779530==
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

--===============2040779530==--


From xen-devel-bounces@lists.xensource.com Thu Oct 27 13:48:40 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 13:48:40 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJWsR-00043J-D2; Thu, 27 Oct 2011 13:48:39 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJWrU-0003jK-Nc
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 13:47:42 -0700
X-Env-Sender: florian.heigl@gmail.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319748455!1325029!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23763 invoked from network); 27 Oct 2011 20:47:36 -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;
	27 Oct 2011 20:47:36 -0000
Received: by iaen33 with SMTP id n33so4672557iae.30
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 13:47:35 -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
	:content-type; bh=0ZCXZI2PYeSkFRBoF/Fxerwo1pBEnHC17NhCWVuhvwg=;
	b=ZfhTuQxhPk2kFMLq7xdmGeWh5cL9e6EyMrnaMC2FCtI7wOWdowtf8/+1seMlnhI1fi
	rQAFvO/f1oUYDI+J8xPaLbPrZLv9Au1OEHITp8HRwFqw/tpH83b8pTHpEG4GkBfy0R9t
	utxk7BtHHWMtnvdZ1zji60wWFEuclL2Yy1LFM=
MIME-Version: 1.0
Received: by 10.231.48.142 with SMTP id r14mr4033290ibf.5.1319748454889; Thu,
	27 Oct 2011 13:47:34 -0700 (PDT)
Received: by 10.231.208.143 with HTTP; Thu, 27 Oct 2011 13:47:34 -0700 (PDT)
In-Reply-To: <CAFivhPmT1mfzaQbPDviB4jMAUBe5u-cruXtDz7U2Jh7jWrPCcQ@mail.gmail.com>
References: <CAFivhPmT1mfzaQbPDviB4jMAUBe5u-cruXtDz7U2Jh7jWrPCcQ@mail.gmail.com>
Date: Thu, 27 Oct 2011 22:47:34 +0200
Message-ID: <CAFivhPniexii22twa+Cq+WPk2GUp5i=bKJZKpo4BH=ev1A3Jfg@mail.gmail.com>
From: Florian Heigl <florian.heigl@gmail.com>
To: xen-devel <xen-devel@lists.xensource.com>
Content-Type: text/plain; charset=ISO-8859-1
Subject: [Xen-devel] Fwd: Examples for using xl migrate -s ?
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

sorry to disturb, but are there any in-depth docs about migration in xl?
It appears this is not just me not knowing it :>

Greetings,
Florian


---------- Forwarded message ----------
From: Florian Heigl <florian.heigl@gmail.com>
Date: 2011/10/25
Subject: Examples for using xl migrate -s ?
To: Xen Users <xen-users@lists.xensource.com>


Hi,

I must find a way around the way live migration now uses ssh. I tested
it and I see high cpu usage by SSH and overall sense of things being
slow.
My prod systems have a dedicated, fast link for live migration, but
with ssh it would be crippled down to a <1Gbit.
Does anyone have a working example of how to not use SSH as the transport layer?

I guess this is what the -s option is for, but I don't really get how
it's intended to be used.

What I can think of ( -s "ssh other box, run netcat listener there;
launch nc locally and receive migration data) sounds absolutely
disgusting...

Thanks for any pointers,
Florian

--
the purpose of libvirt is to provide an abstraction layer hiding all
xen features added since 2006 until they were finally understood and
copied by the kvm devs.



-- 
the purpose of libvirt is to provide an abstraction layer hiding all
xen features added since 2006 until they were finally understood and
copied by the kvm devs.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 14:16:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 14:16:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJXJb-0005Z4-Nd; Thu, 27 Oct 2011 14:16:43 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJXIV-0005M3-E7
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 14:15:36 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1319750130!36918592!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22294 invoked from network); 27 Oct 2011 21:15:32 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-14.tower-174.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 21:15:32 -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
	p9RLFP42003324
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 21:15:25 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
	p9RLFMeS008493
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 21:15:23 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
	p9RLFHS5017974; Thu, 27 Oct 2011 16:15:17 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 27 Oct 2011 14:15:16 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 768E882CE4; Thu, 27 Oct 2011 17:15:15 -0400 (EDT)
Date: Thu, 27 Oct 2011 17:15:15 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Miche Baker-Harvey <miche@google.com>
Message-ID: <20111027211515.GA5221@phenom.dumpdata.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-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A020205.4EA9C9EF.0036,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.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>, 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 Thu, Oct 27, 2011 at 11:39:53AM -0700, 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.

And you can stick

Reported-by-and-Tested-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>


> 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.
> + */
> +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);
>  
> +	/*
> +	 * xxx Use index 0 for now assuming there is no early HVC, since
> +	 * we don't support it.
> +	 */
>  	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);
> -
>  	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);
>  }
>  
>  static void control_work_handler(struct work_struct *work)
> diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
> index 7430bc3..03ff6ed 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
> @@ -242,6 +247,7 @@ static void destroy_hvc_struct(struct kref *kref)
>  
>  	spin_unlock(&hvc_structs_lock);
>  
> +	kfree(hp->hvc_console);
>  	kfree(hp);
>  }
>  
> @@ -822,19 +828,25 @@ 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 */
> +	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);
> +		}
>  	}
>  
>  	hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
>  			GFP_KERNEL);
> -	if (!hp)
> +	if (!hp) {
> +		mutex_unlock(&hvc_ports_mutex);
>  		return ERR_PTR(-ENOMEM);
> +	}
>  
>  	hp->vtermno = vtermno;
>  	hp->data = data;
> @@ -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));
> +	hp->hvc_console = cp;
> +
>  	spin_lock_init(&hp->lock);
>  	spin_lock(&hvc_structs_lock);
>  
> @@ -862,13 +887,14 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
>  		i = ++last_hvc;
>  
>  	hp->index = i;
> -	hvc_console.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(&hvc_console);
> +	register_console(cp);
> +	mutex_unlock(&hvc_ports_mutex);
>  
>  	return hp;
>  }
> @@ -879,7 +905,8 @@ int hvc_remove(struct hvc_struct *hp)
>  	unsigned long flags;
>  	struct tty_struct *tty;
>  
> -	unregister_console(&hvc_console);
> +	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;
> -- 
> 1.7.3.1
> 
> --
> 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 Oct 27 14:22:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 14:22:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJXPK-0007Sx-T2; Thu, 27 Oct 2011 14:22:39 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJXKN-0005kq-Q0
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 14:17:32 -0700
X-Env-Sender: hedayati.mo@gmail.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1319750217!43694299!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30449 invoked from network); 27 Oct 2011 21:16:57 -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;
	27 Oct 2011 21:16:57 -0000
Received: by wyi11 with SMTP id 11so4204876wyi.30
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 14:17:28 -0700 (PDT)
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=wa4GJSHgWRQUFQSs5yx0kGFBgg9hQ3bxdRrL3kKb9Oc=;
	b=fT1CMmVQPmfiAkbflGTF+BEVWCNdgSHPeOU1MEpFYKmvAS6Z12H3YbgZYiWVrTmYyZ
	qagQ0cu1rfhTcyXllqB5Al7JP5vRdp0BDWP1inaZWiWqp2v3kWWwYajw5HweS1FbF1bj
	mAws7CKkADOZo/92Vt0IofRiysjYaurMHDCHM=
Received: by 10.216.14.166 with SMTP id d38mr5539296wed.14.1319750248174; Thu,
	27 Oct 2011 14:17:28 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.216.26.76 with HTTP; Thu, 27 Oct 2011 14:16:47 -0700 (PDT)
From: Mohammad Hedayati <hedayati.mo@gmail.com>
Date: Fri, 28 Oct 2011 00:46:47 +0330
Message-ID: <CABA5EEvdQoM+Hc1PJBzYbwbw3aBOUDhWQAEFDMTukznsFs9zZw@mail.gmail.com>
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=UTF-8
Subject: [Xen-devel] Allowing several mappings of a frame
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 currently allows granting a single frame to several domains,
several times (to map or copy). Though the feature itself seems
appealing, I wonder if there's a real use case in any ports or PV
aware applications (i.e. a page is mapped or copied by more than 2
domains). Is there?

Except the condition outlined above, PGC_count_mask part of a
page->count_info can be more than 1?

Thanks,
Mohammad

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 14:26:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 14:26:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJXSy-00007s-Ej; Thu, 27 Oct 2011 14:26:24 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJXS5-0008ED-QN
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 14:25:30 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1319750726!1264079!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20364 invoked from network); 27 Oct 2011 21:25:26 -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;
	27 Oct 2011 21:25:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,415,1315180800"; 
   d="scan'208";a="8629181"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 21:25: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; Thu, 27 Oct 2011 22:25:26 +0100
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 1RJXS2-0008GR-1D;
	Thu, 27 Oct 2011 21:25:26 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RJXS1-0005QP-Lw;
	Thu, 27 Oct 2011 22:25:25 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9642-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 27 Oct 2011 22:25:25 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9642: 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 9642 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9642/

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-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                  0526644ad2a6
baseline version:
 xen                  c681dd5aecf3

------------------------------------------------------------
People who touched revisions under test:
  Ian Campbell <ian.campbell@citrix.com>
  Ian Jackson <ian.jackson@eu.citrix.com>
  Jan Beulich <JBeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
  Michael Young <m.a.young@durham.ac.uk>
  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                                     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=0526644ad2a6
+ . 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 0526644ad2a6
+ branch=xen-unstable
+ revision=0526644ad2a6
+ . 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 0526644ad2a6 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 4 changesets with 4 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 Oct 27 14:56:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 14:56:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJXw3-0002Bd-8W; Thu, 27 Oct 2011 14:56:27 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJXus-0001yx-Th
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 14:55:15 -0700
X-Env-Sender: keir.xen@gmail.com
X-Msg-Ref: server-15.tower-182.messagelabs.com!1319752511!1010993!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6136 invoked from network); 27 Oct 2011 21:55:11 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-15.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 21:55:11 -0000
Received: by wyi11 with SMTP id 11so4241443wyi.30
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 14:55:11 -0700 (PDT)
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=QRCy2idXIpYGFXH4gqGybBbVutLByy05KDIzKVKjM6E=;
	b=UPRpZG42b+Wb66kHWxRk9uE4ijEiWY27VQ3FmRH7PEV2WUbsjgJefKM6b2lCzqkQ2X
	4WHnZqL+ibqkfeEiBWssguyAS565DO43sczStzKcEsbiNqHkABPwdxocyYhLLgGnMsKM
	vCM5lSO6R/AnjqOQHlIHCIdfqXZI1rTpME7i0=
Received: by 10.216.134.155 with SMTP id s27mr14010716wei.103.1319752511201;
	Thu, 27 Oct 2011 14:55:11 -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 b5sm11885742wbh.4.2011.10.27.14.55.09
	(version=SSLv3 cipher=OTHER); Thu, 27 Oct 2011 14:55:10 -0700 (PDT)
User-Agent: Microsoft-Entourage/12.30.0.110427
Date: Thu, 27 Oct 2011 22:55:08 +0100
Subject: Re: [Xen-devel] Allowing several mappings of a frame
From: Keir Fraser <keir.xen@gmail.com>
To: Mohammad Hedayati <hedayati.mo@gmail.com>, <xen-devel@lists.xensource.com>
Message-ID: <CACF91CC.23D70%keir.xen@gmail.com>
Thread-Topic: [Xen-devel] Allowing several mappings of a frame
Thread-Index: AcyU8xeN6NIrV4tci0ql3NisExUtfQ==
In-Reply-To: <CABA5EEvdQoM+Hc1PJBzYbwbw3aBOUDhWQAEFDMTukznsFs9zZw@mail.gmail.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 27/10/2011 22:16, "Mohammad Hedayati" <hedayati.mo@gmail.com> wrote:

> Xen currently allows granting a single frame to several domains,
> several times (to map or copy). Though the feature itself seems
> appealing, I wonder if there's a real use case in any ports or PV
> aware applications (i.e. a page is mapped or copied by more than 2
> domains). Is there?

It wouldn't typically happen.

> Except the condition outlined above, PGC_count_mask part of a
> page->count_info can be more than 1?

Yes. Go trace some count_info values in a running system. Most will be >1.

 -- Keir

> Thanks,
> Mohammad
> 
> _______________________________________________
> 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 Oct 27 14:57:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 14:57:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJXxU-0002bB-2F; Thu, 27 Oct 2011 14:57:56 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJXvV-000224-7E
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 14:55:54 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319752548!1000886!1
X-Originating-IP: [148.87.113.117]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24810 invoked from network); 27 Oct 2011 21:55:50 -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; 27 Oct 2011 21:55:50 -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
	p9RLthwt029493
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Thu, 27 Oct 2011 21:55:44 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
	p9RLtg13025110
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Thu, 27 Oct 2011 21:55:42 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
	p9RLtat2009211; Thu, 27 Oct 2011 16:55:36 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Thu, 27 Oct 2011 14:55:36 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 1F20F82CE4; Thu, 27 Oct 2011 17:55:35 -0400 (EDT)
Date: Thu, 27 Oct 2011 17:55:35 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Miche Baker-Harvey <miche@google.com>
Message-ID: <20111027215535.GA5671@phenom.dumpdata.com>
References: <20111027173527.GA23839@phenom.dumpdata.com>
	<1319751802-27013-1-git-send-email-miche@google.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <1319751802-27013-1-git-send-email-miche@google.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.0A090205.4EA9D361.0050,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.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>, 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 Thu, Oct 27, 2011 at 02:43:22PM -0700, Miche Baker-Harvey wrote:
> Multiple HVC console terminals enabled.

Miche,

You might want to flesh out the description a bit. Perhaps include
such details as : "fixes the infinite loop that git commit XX
caused". Perhaps include some of the serial console output.

Maybe also change the title - the patch name (which is what shows up
if you do 'git log --oneline') is 'VirtioConsole support.' which is
not very informative.

Oh, and make sure to have the maintainers of the drivers/[tty|char]
in the 'To' field.

Cheers!
Konrad
> 
> 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.
> 
> Signed-off-by: Miche Baker-Harvey <miche@google.com>
> Reported-by-and-Tested-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.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.
> + */
> +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);
>  
> +	/*
> +	 * xxx Use index 0 for now assuming there is no early HVC, since
> +	 * we don't support it.
> +	 */
>  	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);
> -
>  	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);
>  }
>  
>  static void control_work_handler(struct work_struct *work)
> diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
> index 7430bc3..03ff6ed 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
> @@ -242,6 +247,7 @@ static void destroy_hvc_struct(struct kref *kref)
>  
>  	spin_unlock(&hvc_structs_lock);
>  
> +	kfree(hp->hvc_console);
>  	kfree(hp);
>  }
>  
> @@ -822,19 +828,25 @@ 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 */
> +	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);
> +		}
>  	}
>  
>  	hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
>  			GFP_KERNEL);
> -	if (!hp)
> +	if (!hp) {
> +		mutex_unlock(&hvc_ports_mutex);
>  		return ERR_PTR(-ENOMEM);
> +	}
>  
>  	hp->vtermno = vtermno;
>  	hp->data = data;
> @@ -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));
> +	hp->hvc_console = cp;
> +
>  	spin_lock_init(&hp->lock);
>  	spin_lock(&hvc_structs_lock);
>  
> @@ -862,13 +887,14 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
>  		i = ++last_hvc;
>  
>  	hp->index = i;
> -	hvc_console.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(&hvc_console);
> +	register_console(cp);
> +	mutex_unlock(&hvc_ports_mutex);
>  
>  	return hp;
>  }
> @@ -879,7 +905,8 @@ int hvc_remove(struct hvc_struct *hp)
>  	unsigned long flags;
>  	struct tty_struct *tty;
>  
> -	unregister_console(&hvc_console);
> +	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;
> -- 
> 1.7.3.1

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 15:03:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 15:03:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJY2i-00033f-Hg; Thu, 27 Oct 2011 15:03:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJXyU-0002mn-4p
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 14:58:59 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-3.tower-21.messagelabs.com!1319752734!1964595!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27925 invoked from network); 27 Oct 2011 21:58:55 -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;
	27 Oct 2011 21:58:55 -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
	p9RLwnEa008518; Thu, 27 Oct 2011 21:58:50 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 p9RLwnPQ013091; 
	Thu, 27 Oct 2011 17:58:49 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 27 Oct 2011 17:58:48 -0400
Message-Id: <1319752729-13990-3-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319752729-13990-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319752729-13990-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: jeremy@goop.org, xen-devel@lists.xensource.com, keir@xen.org,
	Ian.Campbell@citrix.com, Ian.Jackson@eu.citrix.com,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 2/3] xen/gntalloc: Change gref_lock to a mutex
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 event channel release function cannot be called under a spinlock
because it can attempt to acquire a mutex due to the event channel
reference acquired when setting up unmap notifications.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/gntalloc.c |   41 +++++++++++++++++++++--------------------
 1 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index f6832f4..439352d 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -74,7 +74,7 @@ MODULE_PARM_DESC(limit, "Maximum number of grants that may be allocated by "
 		"the gntalloc device");
 
 static LIST_HEAD(gref_list);
-static DEFINE_SPINLOCK(gref_lock);
+static DEFINE_MUTEX(gref_mutex);
 static int gref_size;
 
 struct notify_info {
@@ -143,15 +143,15 @@ static int add_grefs(struct ioctl_gntalloc_alloc_gref *op,
 	}
 
 	/* Add to gref lists. */
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	list_splice_tail(&queue_gref, &gref_list);
 	list_splice_tail(&queue_file, &priv->list);
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 
 	return 0;
 
 undo:
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	gref_size -= (op->count - i);
 
 	list_for_each_entry(gref, &queue_file, next_file) {
@@ -167,7 +167,7 @@ undo:
 	 */
 	if (unlikely(!list_empty(&queue_gref)))
 		list_splice_tail(&queue_gref, &gref_list);
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 	return rc;
 }
 
@@ -251,7 +251,7 @@ static int gntalloc_release(struct inode *inode, struct file *filp)
 
 	pr_debug("%s: priv %p\n", __func__, priv);
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	while (!list_empty(&priv->list)) {
 		gref = list_entry(priv->list.next,
 			struct gntalloc_gref, next_file);
@@ -261,7 +261,7 @@ static int gntalloc_release(struct inode *inode, struct file *filp)
 			__del_gref(gref);
 	}
 	kfree(priv);
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 
 	return 0;
 }
@@ -286,21 +286,21 @@ static long gntalloc_ioctl_alloc(struct gntalloc_file_private_data *priv,
 		goto out;
 	}
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	/* Clean up pages that were at zero (local) users but were still mapped
 	 * by remote domains. Since those pages count towards the limit that we
 	 * are about to enforce, removing them here is a good idea.
 	 */
 	do_cleanup();
 	if (gref_size + op.count > limit) {
-		spin_unlock(&gref_lock);
+		mutex_unlock(&gref_mutex);
 		rc = -ENOSPC;
 		goto out_free;
 	}
 	gref_size += op.count;
 	op.index = priv->index;
 	priv->index += op.count * PAGE_SIZE;
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 
 	rc = add_grefs(&op, gref_ids, priv);
 	if (rc < 0)
@@ -343,7 +343,7 @@ static long gntalloc_ioctl_dealloc(struct gntalloc_file_private_data *priv,
 		goto dealloc_grant_out;
 	}
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	gref = find_grefs(priv, op.index, op.count);
 	if (gref) {
 		/* Remove from the file list only, and decrease reference count.
@@ -363,7 +363,7 @@ static long gntalloc_ioctl_dealloc(struct gntalloc_file_private_data *priv,
 
 	do_cleanup();
 
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 dealloc_grant_out:
 	return rc;
 }
@@ -383,7 +383,7 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
 	index = op.index & ~(PAGE_SIZE - 1);
 	pgoff = op.index & (PAGE_SIZE - 1);
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 
 	gref = find_grefs(priv, index, 1);
 	if (!gref) {
@@ -400,8 +400,9 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
 	gref->notify.pgoff = pgoff;
 	gref->notify.event = op.event_channel_port;
 	rc = 0;
+
  unlock_out:
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 	return rc;
 }
 
@@ -433,9 +434,9 @@ static void gntalloc_vma_open(struct vm_area_struct *vma)
 	if (!gref)
 		return;
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	gref->users++;
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 }
 
 static void gntalloc_vma_close(struct vm_area_struct *vma)
@@ -444,11 +445,11 @@ static void gntalloc_vma_close(struct vm_area_struct *vma)
 	if (!gref)
 		return;
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	gref->users--;
 	if (gref->users == 0)
 		__del_gref(gref);
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 }
 
 static struct vm_operations_struct gntalloc_vmops = {
@@ -471,7 +472,7 @@ static int gntalloc_mmap(struct file *filp, struct vm_area_struct *vma)
 		return -EINVAL;
 	}
 
-	spin_lock(&gref_lock);
+	mutex_lock(&gref_mutex);
 	gref = find_grefs(priv, vma->vm_pgoff << PAGE_SHIFT, count);
 	if (gref == NULL) {
 		rv = -ENOENT;
@@ -499,7 +500,7 @@ static int gntalloc_mmap(struct file *filp, struct vm_area_struct *vma)
 	rv = 0;
 
 out_unlock:
-	spin_unlock(&gref_lock);
+	mutex_unlock(&gref_mutex);
 	return rv;
 }
 
-- 
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 Oct 27 15:05:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 15:05:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJY4k-0003Rx-T8; Thu, 27 Oct 2011 15:05:26 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJXyU-0002mx-DL
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 14:59:00 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-14.tower-182.messagelabs.com!1319752735!1001073!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1237 invoked from network); 27 Oct 2011 21:58:55 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-14.tower-182.messagelabs.com with SMTP;
	27 Oct 2011 21:58:55 -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
	p9RLwnEa008519; Thu, 27 Oct 2011 21:58:50 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 p9RLwnPR013091; 
	Thu, 27 Oct 2011 17:58:49 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 27 Oct 2011 17:58:49 -0400
Message-Id: <1319752729-13990-4-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319752729-13990-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319752729-13990-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: jeremy@goop.org, xen-devel@lists.xensource.com, keir@xen.org,
	Ian.Campbell@citrix.com, Ian.Jackson@eu.citrix.com,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 3/3] xen/gnt{dev,
	alloc}: reserve event channels for notify
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 unmap notify ioctl, the event channel used for
notification needs to be reserved to avoid it being deallocated prior to
sending the notification.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/gntalloc.c |   21 ++++++++++++++++++++-
 drivers/xen/gntdev.c   |   31 ++++++++++++++++++++++++++++++-
 2 files changed, 50 insertions(+), 2 deletions(-)

diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
index 439352d..c95181f 100644
--- a/drivers/xen/gntalloc.c
+++ b/drivers/xen/gntalloc.c
@@ -178,8 +178,10 @@ static void __del_gref(struct gntalloc_gref *gref)
 		tmp[gref->notify.pgoff] = 0;
 		kunmap(gref->page);
 	}
-	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
+	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
 		notify_remote_via_evtchn(gref->notify.event);
+		evtchn_put(gref->notify.event);
+	}
 
 	gref->notify.flags = 0;
 
@@ -396,6 +398,23 @@ static long gntalloc_ioctl_unmap_notify(struct gntalloc_file_private_data *priv,
 		goto unlock_out;
 	}
 
+	/* We need to grab a reference to the event channel we are going to use
+	 * to send the notify before releasing the reference we may already have
+	 * (if someone has called this ioctl twice). This is required so that
+	 * it is possible to change the clear_byte part of the notification
+	 * without disturbing the event channel part, which may now be the last
+	 * reference to that event channel.
+	 */
+	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
+		if (evtchn_get(op.event_channel_port)) {
+			rc = -EINVAL;
+			goto unlock_out;
+		}
+	}
+
+	if (gref->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
+		evtchn_put(gref->notify.event);
+
 	gref->notify.flags = op.action;
 	gref->notify.pgoff = pgoff;
 	gref->notify.event = op.event_channel_port;
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index 5227506..f87ce52 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -193,8 +193,10 @@ static void gntdev_put_map(struct grant_map *map)
 
 	atomic_sub(map->count, &pages_mapped);
 
-	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT)
+	if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) {
 		notify_remote_via_evtchn(map->notify.event);
+		evtchn_put(map->notify.event);
+	}
 
 	if (map->pages) {
 		if (!use_ptemod)
@@ -600,6 +602,8 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
 	struct ioctl_gntdev_unmap_notify op;
 	struct grant_map *map;
 	int rc;
+	int out_flags;
+	unsigned int out_event;
 
 	if (copy_from_user(&op, u, sizeof(op)))
 		return -EFAULT;
@@ -607,6 +611,21 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
 	if (op.action & ~(UNMAP_NOTIFY_CLEAR_BYTE|UNMAP_NOTIFY_SEND_EVENT))
 		return -EINVAL;
 
+	/* We need to grab a reference to the event channel we are going to use
+	 * to send the notify before releasing the reference we may already have
+	 * (if someone has called this ioctl twice). This is required so that
+	 * it is possible to change the clear_byte part of the notification
+	 * without disturbing the event channel part, which may now be the last
+	 * reference to that event channel.
+	 */
+	if (op.action & UNMAP_NOTIFY_SEND_EVENT) {
+		if (evtchn_get(op.event_channel_port))
+			return -EINVAL;
+	}
+
+	out_flags = op.action;
+	out_event = op.event_channel_port;
+
 	spin_lock(&priv->lock);
 
 	list_for_each_entry(map, &priv->maps, next) {
@@ -625,12 +644,22 @@ static long gntdev_ioctl_notify(struct gntdev_priv *priv, void __user *u)
 		goto unlock_out;
 	}
 
+	out_flags = map->notify.flags;
+	out_event = map->notify.event;
+
 	map->notify.flags = op.action;
 	map->notify.addr = op.index - (map->index << PAGE_SHIFT);
 	map->notify.event = op.event_channel_port;
+
 	rc = 0;
+
  unlock_out:
 	spin_unlock(&priv->lock);
+
+	/* Drop the reference to the event channel we did not save in the map */
+	if (out_flags & UNMAP_NOTIFY_SEND_EVENT)
+		evtchn_put(out_event);
+
 	return rc;
 }
 
-- 
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 Oct 27 15:07:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 15:07:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJY6O-0003qK-OP; Thu, 27 Oct 2011 15:07:08 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJXyU-0002mo-72
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 14:59:00 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-10.tower-216.messagelabs.com!1319752734!1233867!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23092 invoked from network); 27 Oct 2011 21:58:55 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-10.tower-216.messagelabs.com with SMTP;
	27 Oct 2011 21:58:55 -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
	p9RLwnmo019211; Thu, 27 Oct 2011 21:58:49 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 p9RLwnPO013091; 
	Thu, 27 Oct 2011 17:58:49 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 27 Oct 2011 17:58:46 -0400
Message-Id: <1319752729-13990-1-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: keir@xen.org, jeremy@goop.org, xen-devel@lists.xensource.com,
	Ian.Jackson@eu.citrix.com, Ian.Campbell@citrix.com
Subject: [Xen-devel] [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

> 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.

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 Thu Oct 27 15:08:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 15:08:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJY86-0004Dj-IV; Thu, 27 Oct 2011 15:08:54 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJXyU-0002my-ME
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 14:59:00 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319752735!36942341!1
X-Originating-IP: [63.239.65.40]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21565 invoked from network); 27 Oct 2011 21:58:55 -0000
Received: from msux-gh1-uea02.nsa.gov (HELO msux-gh1-uea02.nsa.gov)
	(63.239.65.40) by server-12.tower-174.messagelabs.com with SMTP;
	27 Oct 2011 21:58:55 -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
	p9RLwnEa008517; Thu, 27 Oct 2011 21:58:49 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 p9RLwnPP013091; 
	Thu, 27 Oct 2011 17:58:49 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: konrad.wilk@oracle.com
Date: Thu, 27 Oct 2011 17:58:47 -0400
Message-Id: <1319752729-13990-2-git-send-email-dgdegra@tycho.nsa.gov>
X-Mailer: git-send-email 1.7.6.4
In-Reply-To: <1319752729-13990-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1316207684-19860-1-git-send-email-dgdegra@tycho.nsa.gov>
	<1319752729-13990-1-git-send-email-dgdegra@tycho.nsa.gov>
Cc: jeremy@goop.org, xen-devel@lists.xensource.com, keir@xen.org,
	Ian.Campbell@citrix.com, Ian.Jackson@eu.citrix.com,
	Daniel De Graaf <dgdegra@tycho.nsa.gov>
Subject: [Xen-devel] [PATCH 1/3] xen/event: Add reference counting to 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

Event channels exposed to userspace by the evtchn module may be used by
other modules in an asynchronous manner, which requires that reference
counting be used to prevent the event channel from being closed before
the signals are delivered.

The reference count on new event channels defaults to -1 which indicates
the event channel is not referenced outside the kernel; evtchn_get fails
if called on such an event channel. The event channels made visible to
userspace by evtchn have a normal reference count.

Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
---
 drivers/xen/events.c |   74 +++++++++++++++++++++++++++++++++++++++++++++++++-
 drivers/xen/evtchn.c |    2 +-
 include/xen/events.h |    7 +++++
 3 files changed, 81 insertions(+), 2 deletions(-)

diff --git a/drivers/xen/events.c b/drivers/xen/events.c
index 073c11d..0237629 100644
--- a/drivers/xen/events.c
+++ b/drivers/xen/events.c
@@ -87,6 +87,7 @@ enum xen_irq_type {
  */
 struct irq_info {
 	struct list_head list;
+	int refcnt;
 	enum xen_irq_type type;	/* type */
 	unsigned irq;
 	unsigned short evtchn;	/* event channel */
@@ -406,6 +407,7 @@ static void xen_irq_init(unsigned irq)
 		panic("Unable to allocate metadata for IRQ%d\n", irq);
 
 	info->type = IRQT_UNBOUND;
+	info->refcnt = -1;
 
 	irq_set_handler_data(irq, info);
 
@@ -469,6 +471,8 @@ static void xen_free_irq(unsigned irq)
 
 	irq_set_handler_data(irq, NULL);
 
+	WARN_ON(info->refcnt > 0);
+
 	kfree(info);
 
 	/* Legacy IRQ descriptors are managed by the arch. */
@@ -637,7 +641,7 @@ int xen_bind_pirq_gsi_to_irq(unsigned gsi,
 	if (irq != -1) {
 		printk(KERN_INFO "xen_map_pirq_gsi: returning irq %d for gsi %u\n",
 		       irq, gsi);
-		goto out;	/* XXX need refcount? */
+		goto out;
 	}
 
 	irq = xen_allocate_irq_gsi(gsi);
@@ -939,9 +943,16 @@ static void unbind_from_irq(unsigned int irq)
 {
 	struct evtchn_close close;
 	int evtchn = evtchn_from_irq(irq);
+	struct irq_info *info = irq_get_handler_data(irq);
 
 	mutex_lock(&irq_mapping_update_lock);
 
+	if (info->refcnt > 0) {
+		info->refcnt--;
+		if (info->refcnt != 0)
+			goto done;
+	}
+
 	if (VALID_EVTCHN(evtchn)) {
 		close.port = evtchn;
 		if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0)
@@ -970,6 +981,7 @@ static void unbind_from_irq(unsigned int irq)
 
 	xen_free_irq(irq);
 
+ done:
 	mutex_unlock(&irq_mapping_update_lock);
 }
 
@@ -1065,6 +1077,66 @@ void unbind_from_irqhandler(unsigned int irq, void *dev_id)
 }
 EXPORT_SYMBOL_GPL(unbind_from_irqhandler);
 
+int evtchn_make_refcounted(unsigned int evtchn)
+{
+	int irq = evtchn_to_irq[evtchn];
+	struct irq_info *info;
+
+	if (irq == -1)
+		return -ENOENT;
+
+	info = irq_get_handler_data(irq);
+
+	if (!info)
+		return -ENOENT;
+
+	WARN_ON(info->refcnt != -1);
+
+	info->refcnt = 1;
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(evtchn_make_refcounted);
+
+int evtchn_get(unsigned int evtchn)
+{
+	int irq;
+	struct irq_info *info;
+	int err = -ENOENT;
+
+	mutex_lock(&irq_mapping_update_lock);
+
+	irq = evtchn_to_irq[evtchn];
+	if (irq == -1)
+		goto done;
+
+	info = irq_get_handler_data(irq);
+
+	if (!info)
+		goto done;
+
+	err = -EINVAL;
+	if (info->refcnt <= 0)
+		goto done;
+
+	info->refcnt++;
+	err = 0;
+ done:
+	mutex_unlock(&irq_mapping_update_lock);
+
+	return err;
+}
+EXPORT_SYMBOL_GPL(evtchn_get);
+
+void evtchn_put(unsigned int evtchn)
+{
+	int irq = evtchn_to_irq[evtchn];
+	if (WARN_ON(irq == -1))
+		return;
+	unbind_from_irq(irq);
+}
+EXPORT_SYMBOL_GPL(evtchn_put);
+
 void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector)
 {
 	int irq = per_cpu(ipi_to_irq, cpu)[vector];
diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c
index dbc13e9..b1f60a0 100644
--- a/drivers/xen/evtchn.c
+++ b/drivers/xen/evtchn.c
@@ -268,7 +268,7 @@ static int evtchn_bind_to_user(struct per_user_data *u, int port)
 	rc = bind_evtchn_to_irqhandler(port, evtchn_interrupt, IRQF_DISABLED,
 				       u->name, (void *)(unsigned long)port);
 	if (rc >= 0)
-		rc = 0;
+		rc = evtchn_make_refcounted(port);
 
 	return rc;
 }
diff --git a/include/xen/events.h b/include/xen/events.h
index d287997..0f77370 100644
--- a/include/xen/events.h
+++ b/include/xen/events.h
@@ -37,6 +37,13 @@ int bind_interdomain_evtchn_to_irqhandler(unsigned int remote_domain,
  */
 void unbind_from_irqhandler(unsigned int irq, void *dev_id);
 
+/*
+ * Allow extra references to event channels exposed to userspace by evtchn
+ */
+int evtchn_make_refcounted(unsigned int evtchn);
+int evtchn_get(unsigned int evtchn);
+void evtchn_put(unsigned int evtchn);
+
 void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector);
 int resend_irq_on_evtchn(unsigned int irq);
 void rebind_evtchn_irq(int evtchn, int irq);
-- 
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 Oct 27 16:00:01 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 16:00:01 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJYvW-0008Cq-I8; Thu, 27 Oct 2011 15:59:58 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJYtN-0007z5-14
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 15:57:45 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319756261!1963287!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25209 invoked from network); 27 Oct 2011 22:57:41 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 22:57:41 -0000
X-IronPort-AV: E=Sophos;i="4.69,415,1315180800"; 
   d="scan'208";a="8630508"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	27 Oct 2011 22:57: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; Thu, 27 Oct 2011 23:57:41 +0100
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 1RJYtI-0000L0-VC;
	Thu, 27 Oct 2011 22:57:41 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RJYtI-0008Sb-PV;
	Thu, 27 Oct 2011 23:57:40 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9643-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Thu, 27 Oct 2011 23:57:40 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-4.1-testing test] 9643: 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 9643 xen-4.1-testing real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9643/

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      5 xen-boot                     fail    like 9607
 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                  c33e15835e33
baseline version:
 xen                  81e39a4978ea

------------------------------------------------------------
People who touched revisions under test:
  Boris Ostrovsky <boris.ostrovsky@amd.com>
  George Dunlap <george.dunlap@eu.citrix.com>
  Jan Beulich <jbeulich@suse.com>
  Keir Fraser <keir@xen.org>
  Laszlo Ersek <lersek@redhat.com>
  Wei Wang2 <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                                     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.1-testing
+ revision=c33e15835e33
+ . 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 c33e15835e33
+ branch=xen-4.1-testing
+ revision=c33e15835e33
+ . 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 c33e15835e33 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 3 changesets with 8 changes to 8 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 19:09:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 19:09:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJbtG-0004CF-1q; Thu, 27 Oct 2011 19:09:50 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJbsI-0003zo-TA
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 19:08:51 -0700
X-Env-Sender: hui.lv@intel.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1319767700!55002035!1
X-Originating-IP: [143.182.124.37]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12301 invoked from network); 28 Oct 2011 02:08:20 -0000
Received: from mga14.intel.com (HELO mga14.intel.com) (143.182.124.37)
	by server-6.tower-27.messagelabs.com with SMTP;
	28 Oct 2011 02:08:20 -0000
Received: from azsmga001.ch.intel.com ([10.2.17.19])
	by azsmga102.ch.intel.com with ESMTP; 27 Oct 2011 19:08:45 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,415,1315206000"; d="scan'208";a="67851323"
Received: from pgsmsx602.gar.corp.intel.com ([10.221.43.81])
	by azsmga001.ch.intel.com with ESMTP; 27 Oct 2011 19:08:44 -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; Fri, 28 Oct 2011 10:07:32 +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; Fri, 28 Oct 2011 10:07:31 +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, 28 Oct 2011 10:07:30 +0800
From: "Lv, Hui" <hui.lv@intel.com>
To: George Dunlap <George.Dunlap@eu.citrix.com>
Date: Fri, 28 Oct 2011 10:07:23 +0800
Subject: RE: [Xen-devel] [PATCH] scheduler rate controller
Thread-Topic: [Xen-devel] [PATCH] scheduler rate controller
Thread-Index: AcySaGrlEA74+tPRTBK2FnCCe5TctgCo5Jog
Message-ID: <C10D3FB0CD45994C8A51FEC1227CE22F3428CB5EF9@shsmsx502.ccr.corp.intel.com>
References: <C10D3FB0CD45994C8A51FEC1227CE22F340768D793@shsmsx502.ccr.corp.intel.com>
	<CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
In-Reply-To: <CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
x-cr-hashedpuzzle: SVw= Bwtd HHOC HvYk IaNq LgSr M/hL O3qh S2il Tz8p U5qe
	VXs3 WFSG XFyb bBah im06; 3;
	ZwBlAG8AcgBnAGUALgBkAHUAbgBsAGEAcABAAGUAdQAuAGMAaQB0AHIAaQB4AC4AYwBvAG0AOwBrAGUAaQByAEAAeABlAG4ALgBvAHIAZwA7AHgAZQBuAC0AZABlAHYAZQBsAEAAbABpAHMAdABzAC4AeABlAG4AcwBvAHUAcgBjAGUALgBjAG8AbQA=;
	Sosha1_v1; 7; {9920D9DE-CD63-4F93-80E4-82E0CC62D90A};
	aAB1AGkALgBsAHYAQABpAG4AdABlAGwALgBjAG8AbQA=; Fri,
	28 Oct 2011 02:07:23 GMT;
	UgBFADoAIABbAFgAZQBuAC0AZABlAHYAZQBsAF0AIABbAFAAQQBUAEMASABdACAAcwBjAGgAZQBkAHUAbABlAHIAIAByAGEAdABlACAAYwBvAG4AdAByAG8AbABsAGUAcgA=
x-cr-puzzleid: {9920D9DE-CD63-4F93-80E4-82E0CC62D90A}
acceptlanguage: en-US
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Cc: "Duan, Jiangang" <jiangang.duan@intel.com>, "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>
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: dunlapg@gmail.com [mailto:dunlapg@gmail.com] On Behalf Of George
> Dunlap
> Sent: Tuesday, October 25, 2011 12:17 AM
> To: Lv, Hui
> Cc: xen-devel@lists.xensource.com; Duan, Jiangang; Tian, Kevin;
> keir@xen.org; Dong, Eddie
> Subject: Re: [Xen-devel] [PATCH] scheduler rate controller
>=20
> On Mon, Oct 24, 2011 at 4:36 AM, Lv, Hui <hui.lv@intel.com> wrote:
> >
> > As one of the topics presented in Xen summit2011 in SC, we proposed
> one method scheduler rate controller (SRC) to control high frequency of
> scheduling under some conditions. You can find the slides at
> > http://www.slideshare.net/xen_com_mgr/9-hui-
> lvtacklingthemanagementchallengesofserverconsolidationonmulticoresystem
> s
> >
> > In the followings, we have tested it with 2-socket multi-core system
> with many rounds and got the positive results and improve the
> performance greatly either with the consolidation workload
> SPECvirt_2010 or some small workloads such as sysbench and SPECjbb. So
> I posted it here for review.
> >
> > >From Xen scheduling mechanism, hypervisor kicks related VCPUs by
> raising schedule softirq during processing external interrupts.
> Therefore, if the number of IRQ is very large, the scheduling happens
> more frequent. Frequent scheduling will
> > 1) bring more overhead for hypervisor and
> > 2) increase cache miss rate.
> >
> > In our consolidation workloads, SPECvirt_sc2010, SR-IOV & iSCSI
> solution are adopted to bypass software emulation but bring heavy
> network traffic. Correspondingly, 15k scheduling happened per second on
> each physical core, which means the average running time is =A0very short=
,
> only 60us. We proposed SRC in XEN to mitigate this problem.
> > The performance benefits brought by this patch is very huge at peak
> throughput with no influence when system loads are low.
> >
> > SRC improved SPECvirt performance by 14%.
> > 1)It reduced CPU utilization, which allows more load to be added.
> > 2)Response time (QoS) =A0became better at the same CPU %.
> > 3)The better response time allowed us to push the CPU % at peak
> performance to an even higher level (CPU was not saturated in SPECvirt).
> > SRC reduced context switch rate significantly, resulted in
> > 2)Smaller Path Length
> > 3)Less cache misses thus lower CPI
> > 4)Better performance for both Guest and Hypervisor sides.
> >
> > With this patch, from our SPECvirt_sc2010 results, the performance of
> xen catches up the other open sourced hypervisor.
>=20
> Hui,
>=20
> Thanks for the patch, and the work you've done testing it.  There are
> a couple of things to discuss.
>=20
> * I'm not sure I like the idea of doing this at the generic level than
> at the specific scheduler level -- e.g., inside of credit1.  For
> better or for worse, all aspects of scheduling work together, and even
> small changes tend to have a significant effect on the emergent
> behavior.  I understand why you'd want this in the generic scheduling
> code; but it seems like it would be better for each scheduler to
> implement a rate control independently.
>=20
> * The actual algorithm you use here isn't described.  It seems to be
> as follows (please correct me if I've made a mistake
> reverse-engineering the algorithm):
>=20
> Every 10ms, check to see if there have been more than 50 schedules.
> If so, disable pre-emption entirely for 10ms, allowing processes to
> run without being interrupted (unless they yield).
>=20

Sorry for the lack of description. You are right for the control process.

> It seems like we should be able to do better.  For one, it means in
> the general case you will flip back and forth between really frequent
> schedules and less frequent schedules.  For two, turning off
> preemption entirely will mean that whatever vcpu happens to be running
> could, if it wished, run for the full 10ms; and which one got elected
> to do that would be really random.  This may work well for SPECvirt,
> but it's the kind of algorithm that is likely to have some workloads
> on which it works very poorly.  Finally, there's the chance that this
> algorithm could be "gamed" -- i.e., if a rogue VM knew that most other
> VMs yielded frequently, it might be able to arrange that there would
> always be more than 50 context switches a second, while it runs
> without preemption and takes up more than its fair share.
>=20

Yes, agree that, there are more things to do to make a more delicate soluti=
on for this in the next step. For example, we can consider per VM status to=
 decide whether to turn on/off the control to make it more fair, such as yo=
ur point three.

However, as the first step, the current solution is straightforward and eff=
ective.=20
1) Most importantly, it happens when the scheduling frequency is excessive.=
 User can decide which degree is excessive by setting parameter "opt_sched_=
rate_high"(default 50). If the system is crucial for latency sensitive task=
s, you can choose a higher value that this patch will have little impact on=
 it. User can decide which value is good for their environment. However, fr=
om our experience, if the scheduling frequency is too excessive, it also im=
pairs the Qos of latency sensitive tasks due to frequent interrupts by othe=
r VMs.
2) Considering the excessive scheduling condition, the preemption is turnin=
g off entirely. If current running vcpu, yielded frequently, it cannot run =
for the full 10ms. If current running vcpu, not yielded frequently, it can =
possible run as long as up to 10ms. That means, this algorithm roughly prot=
ect the un-yielded vcpu to run a long time slice without preemption. This i=
s something similar to your point 3 but in a roughly way. :)
3) Finally, this patch aimed to solve the issue when scheduling frequency i=
s excessive but not influence the normal case (less frequency). We should t=
reat these two cases separately. Since excessive scheduling case cannot gua=
rantee neither performance or Qos.


=20
> Have you tried just making it give each vcpu a minimum amount of
> scheduling time, say, 500us or 1ms?
>=20
> Now a couple of stylistic comments:
> * src tends to make me think of "source".  I think sched_rate[_*]
> would fit the existing naming convention better.
> * src_controller() shouldn't call continue_running() directly.
> Instead, scheduler() should call src_controller(); and only call
> sched->do_schedule() if src_controller() returns false (or something
> like that).
> * Whatever the algorithm is should have comments describing what it
> does and how it's supposed to work.
> * Your patch is malformed; you need to have it apply at the top level,
> not from within the xen/ subdirectory.  The easiest way to get a patch
> is to use either mercurial queues, or "hg diff".  There are some good
> suggestions for making and posting patches here:
> http://wiki.xensource.com/xenwiki/SubmittingXenPatches
>=20

Thanks for the kind information. I think the next version will be better :)

> Thanks again for all your work on this -- we definitely want Xen to
> beat the other open-source hypervisor. :-)
>=20
>  -George

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 20:44:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 20:44:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJdMb-0006d3-Nt; Thu, 27 Oct 2011 20:44:13 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJdLo-0006Qc-A9
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 20:43:24 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1319773373!41721794!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15607 invoked from network); 28 Oct 2011 03:42:54 -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;
	28 Oct 2011 03:42:54 -0000
X-IronPort-AV: E=Sophos;i="4.69,416,1315180800"; 
   d="scan'208";a="8633007"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 03:43: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; Fri, 28 Oct 2011 04:43:20 +0100
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 1RJdLk-0001wN-L7;
	Fri, 28 Oct 2011 03:43:20 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RJdLk-0005AO-FS;
	Fri, 28 Oct 2011 04:43:20 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9644-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 28 Oct 2011 04:43:20 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9644: 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 9644 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9644/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf     14 guest-localmigrate/x10       fail pass in 9642
 test-amd64-amd64-xl-win      12 guest-localmigrate/x10       fail pass in 9642

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-i386-win          16 leak-check/check             fail   never pass
 test-amd64-amd64-xl-win      13 guest-stop             fail in 9642 never pass

version targeted for testing:
 xen                  0526644ad2a6
baseline version:
 xen                  0526644ad2a6

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 Thu Oct 27 21:16:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 21:16:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJdsG-0007Sj-74; Thu, 27 Oct 2011 21:16:56 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJdqj-0007Fr-U1
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 21:15:30 -0700
X-Env-Sender: pankaj.kumarbiswas@citrix.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1319775287!41723460!1
X-Originating-IP: [203.166.19.134]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16146 invoked from network); 28 Oct 2011 04:14:50 -0000
Received: from smtp.citrix.com.au (HELO SMTP.CITRIX.COM.AU) (203.166.19.134)
	by server-10.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2011 04:14:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,416,1315180800"; d="scan'208,217";a="9132250"
Received: from banpmailmx01.citrite.net ([10.103.128.73])
	by SYDPIPO01.CITRIX.COM.AU with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 04:15:12 +0000
Received: from BANPMAILBOX01.citrite.net ([10.103.128.72]) by
	BANPMAILMX01.citrite.net ([10.103.128.73]) with mapi; Fri, 28 Oct 2011
	09:45:12 +0530
From: Pankaj Kumar Biswas <pankaj.kumarbiswas@citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 09:45:10 +0530
Thread-Topic: Help
Thread-Index: AcyVKC8TqKZ0bwEuR9+BD5V4mWdLrA==
Message-ID: <64FB1554ABC9B44FAA773FBD6CB889C2E1CB20578F@BANPMAILBOX01.citrite.net>
Accept-Language: en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
acceptlanguage: en-US
MIME-Version: 1.0
Subject: [Xen-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>
Content-Type: multipart/mixed; boundary="===============1180314167=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1180314167==
Content-Language: en-US
Content-Type: multipart/alternative;
	boundary="_000_64FB1554ABC9B44FAA773FBD6CB889C2E1CB20578FBANPMAILBOX01_"

--_000_64FB1554ABC9B44FAA773FBD6CB889C2E1CB20578FBANPMAILBOX01_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable

Hi team,

I want to know how the paging works in xen and what the shadow paging is?

Thanks & Regards,
PANKAJ KUMAR BISWAS

Software Maintenance Engineer | XenServer India | Citrix Systems Inc.
Ext. 41225 | Email:  pankaj.kumarbiswas@citrix.com


--_000_64FB1554ABC9B44FAA773FBD6CB889C2E1CB20578FBANPMAILBOX01_
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:Cambria;
	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;
	font-family:"Calibri","sans-serif";}
@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>Hi team,<o:p></o=
:p></p><p class=3DMsoNormal><o:p>&nbsp;</o:p></p><p class=3DMsoNormal>I wan=
t to know how the paging works in xen and what the shadow paging is?<o:p></=
o:p></p><p class=3DMsoNormal><o:p>&nbsp;</o:p></p><p class=3DMsoNormal><b><=
span style=3D'font-family:"Cambria","serif"'>Thanks &amp; Regards,<o:p></o:=
p></span></b></p><p class=3DMsoNormal><b><span style=3D'font-family:"Cambri=
a","serif"'>PANKAJ KUMAR BISWAS<o:p></o:p></span></b></p><p class=3DMsoNorm=
al><b><span style=3D'font-family:"Cambria","serif"'><o:p>&nbsp;</o:p></span=
></b></p><p class=3DMsoNormal><b><span style=3D'font-family:"Cambria","seri=
f"'>Software Maintenance Engineer | XenServer India | Citrix Systems Inc.<o=
:p></o:p></span></b></p><p class=3DMsoNormal><b><span style=3D'font-family:=
"Cambria","serif"'>Ext. 41225 | Email:&nbsp; pankaj.kumarbiswas@citrix.com<=
o:p></o:p></span></b></p><p class=3DMsoNormal><o:p>&nbsp;</o:p></p></div></=
body></html>=

--_000_64FB1554ABC9B44FAA773FBD6CB889C2E1CB20578FBANPMAILBOX01_--


--===============1180314167==
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

--===============1180314167==--


From xen-devel-bounces@lists.xensource.com Thu Oct 27 22:26:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 22:26:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJexO-0001We-B0; Thu, 27 Oct 2011 22:26:18 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJewE-0001Jl-UA
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 22:25:08 -0700
X-Env-Sender: zduan@ca-server1.us.oracle.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319779502!1026882!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14503 invoked from network); 28 Oct 2011 05:25:03 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-11.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 28 Oct 2011 05:25:03 -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
	p9S5OvO4003468
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 28 Oct 2011 05:24:58 GMT
Received: from ca-server1.us.oracle.com (ca-server1.us.oracle.com
	[139.185.48.5])
	by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9S5OtKf001558; Fri, 28 Oct 2011 05:24:56 GMT
Received: from zduan by ca-server1.us.oracle.com with local (Exim 4.69)
	(envelope-from <zduan@ca-server1.us.oracle.com>)
	id 1RJevy-0004zk-5M; Thu, 27 Oct 2011 22:24:50 -0700
From: zhenzhong.duan@oracle.com
To: <jeremy@goop.org>, <stefano.stabellini@eu.citrix.com>
Date: Thu, 27 Oct 2011 22:24:28 -0700
Message-Id: <1319779468-19146-1-git-send-email-zhenzhong.duan@oracle.com>
X-Mailer: git-send-email 1.7.5.1
X-Source-IP: ucsinet21.oracle.com [156.151.31.93]
X-CT-RefId: str=0001.0A090205.4EAA3CAA.0149,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, joe.jin@oracle.com,
	zhenzhong.duan@oracle.com, konrad.wilk@oracle.com
Subject: [Xen-devel] [PATCH] enable VCPUOP_register_vcpu_info op in hvm
	hypercall
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

pvhvm running with more than 32 vcpus and pv_irq/pv_time enabled 
need vcpu placement to work, or else it will softlockup.

Signed-off-by: Zhenzhong Duan <zhenzhong.duan@oracle.com>
---
diff -r 0526644ad2a6 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c	Thu Oct 27 16:07:18 2011 +0100
+++ b/xen/arch/x86/hvm/hvm.c	Fri Oct 28 11:41:20 2011 +0800
@@ -2794,6 +2794,7 @@
     case VCPUOP_stop_periodic_timer:
     case VCPUOP_set_singleshot_timer:
     case VCPUOP_stop_singleshot_timer:
+    case VCPUOP_register_vcpu_info:
         rc = do_vcpu_op(cmd, vcpuid, arg);
         break;
     default:

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Thu Oct 27 22:29:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Thu, 27 Oct 2011 22:29:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJf0n-0001zK-5o; Thu, 27 Oct 2011 22:29:49 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJf0F-0001n5-S5
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 22:29:16 -0700
X-Env-Sender: zduan@ca-server1.us.oracle.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1319779725!55011628!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4707 invoked from network); 28 Oct 2011 05:28:46 -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; 28 Oct 2011 05:28:46 -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
	p9S5T8Du007316
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Fri, 28 Oct 2011 05:29:08 GMT
Received: from ca-server1.us.oracle.com (ca-server1.us.oracle.com
	[139.185.48.5])
	by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id
	p9S5T6cn027052; Fri, 28 Oct 2011 05:29:07 GMT
Received: from zduan by ca-server1.us.oracle.com with local (Exim 4.69)
	(envelope-from <zduan@ca-server1.us.oracle.com>)
	id 1RJf01-00051o-OB; Thu, 27 Oct 2011 22:29:01 -0700
From: zhenzhong.duan@oracle.com
To: <jeremy@goop.org>, <stefano.stabellini@eu.citrix.com>
Date: Thu, 27 Oct 2011 22:28:59 -0700
Message-Id: <1319779739-19300-1-git-send-email-zhenzhong.duan@oracle.com>
X-Mailer: git-send-email 1.7.5.1
X-Source-IP: acsinet22.oracle.com [141.146.126.238]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090206.4EAA3DA5.002A:SCFSTAT1119972, ss=1, re=-4.000,
	fgs=0
Cc: linux-x86_64@vger.kernel.org, xen-devel@lists.xensource.com,
	joe.jin@oracle.com, zhenzhong.duan@oracle.com, konrad.wilk@oracle.com
Subject: [Xen-devel] [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

pvhvm running with more than 32 vcpus and pv_irq/pv_time enabled 
need vcpu placement to work, or else it will softlockup.

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 Fri Oct 28 00:47:51 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 00:47:51 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJhAN-0005dy-Ew; Fri, 28 Oct 2011 00:47:51 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJh9d-0005S2-Mr
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 00:47:06 -0700
X-Env-Sender: hahn@univention.de
X-Msg-Ref: server-7.tower-174.messagelabs.com!1319788022!36960762!1
X-Originating-IP: [82.198.197.8]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9207 invoked from network); 28 Oct 2011 07:47:02 -0000
Received: from mail.univention.de (HELO mail.univention.de) (82.198.197.8)
	by server-7.tower-174.messagelabs.com with SMTP;
	28 Oct 2011 07:47:02 -0000
Received: from localhost (localhost [127.0.0.1])
	by slugis.knut.univention.de (Postfix) with ESMTP id 3B049E5B104;
	Fri, 28 Oct 2011 09:46:59 +0200 (CEST)
Received: from localhost (localhost [127.0.0.1])
	by slugis.knut.univention.de (Postfix) with ESMTP id 25A26E5B10C;
	Fri, 28 Oct 2011 09:46:59 +0200 (CEST)
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 kpJIB0PjX-We; Fri, 28 Oct 2011 09:46:58 +0200 (CEST)
Received: from stave.knut.univention.de (stave.knut.univention.de
	[192.168.0.191])
	by slugis.knut.univention.de (Postfix) with ESMTPSA id 72304E5B104;
	Fri, 28 Oct 2011 09:46:58 +0200 (CEST)
From: Philipp Hahn <hahn@univention.de>
Organization: Univention.de
To: Ian Campbell <Ian.Campbell@citrix.com>
Subject: Re: [Xen-devel] [PATCH v2] Add HybridISO support for PyGrub2
Date: Fri, 28 Oct 2011 09:46:46 +0200
User-Agent: KMail/1.9.10 (enterprise35 20100903.1171286)
References: <201110251057.06774.hahn@univention.de>
	<201110251233.45315.hahn@univention.de>
	<1319710865.9436.106.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319710865.9436.106.camel@zakaz.uk.xensource.com>
X-KMail-QuotePrefix: > 
MIME-Version: 1.0
Message-Id: <201110280946.51201.hahn@univention.de>
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="===============1026875165=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1026875165==
Content-Type: multipart/signed; boundary="nextPart3003844.VCLHnCeY7C";
	protocol="application/pgp-signature"; micalg=pgp-sha1
Content-Transfer-Encoding: 7bit

--nextPart3003844.VCLHnCeY7C
Content-Type: text/plain;
  charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Hello Ian,

On Thursday 27 October 2011 12:21:05 Ian Campbell wrote:
> On Tue, 2011-10-25 at 11:33 +0100, Philipp Hahn wrote:
> [...snip explanations...]
>
> Thanks Philipp, that all seems to make sense.
>
> Tim had some suggestions on how/where this functionality could be better
> implemented though.

v2: For HybrisISOs use offset 0 in addition instead of replacement.

Signed-off-by: Philipp Hahn <hahn@univention.de>
=2D--
grub-mkrescue internally uses xorriso, which generates a so-called "Hybrid=
=20
ISO": The ISO images also contains a DOS partition table, which allows the=
=20
identical ISO file to be stored on an USB stick for booting from it. This=20
breaks PyGrub, since it (wrongly) detects only the DOS partition table and=
=20
uses the first partition instead of the complete ISO file.

Add a check to detect HybridISO files and use offset 0 in addition to=20
partition 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=20
devices, 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=20
identify_disk_image(): %d' % (image_type,))
=20
     fd =3D os.open(file, os.O_RDONLY)
     buf =3D os.read(fd, 512)

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/

--nextPart3003844.VCLHnCeY7C
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)

iEYEABECAAYFAk6qXecACgkQYPlgoZpUDjmhswCgmiKYnpVAFpR0AJ+NBON/yxTd
G3cAoJUcrLVAEc6wcPRAM0G8+Ty1LkUx
=wPnJ
-----END PGP SIGNATURE-----

--nextPart3003844.VCLHnCeY7C--


--===============1026875165==
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

--===============1026875165==--


From xen-devel-bounces@lists.xensource.com Fri Oct 28 01:05:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 01:05:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJhRV-0006Hi-9W; Fri, 28 Oct 2011 01:05:33 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJhOA-00062Y-Kn
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 01:02:23 -0700
X-Env-Sender: royger@gmail.com
X-Msg-Ref: server-8.tower-182.messagelabs.com!1319788921!1043608!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10738 invoked from network); 28 Oct 2011 08:02:02 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-8.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2011 08:02:02 -0000
Received: by gyg13 with SMTP id 13so5834994gyg.30
	for <xen-devel@lists.xensource.com>;
	Fri, 28 Oct 2011 01:02: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=s7KWFrTPQQmowfyV5dgFW7OEip7mkL87/pYFjl+IW8I=;
	b=gYCz9xqasXYVHJyskZY/fc+z7GyIJTIE3f0H4FI+UGtBeErNJh0CccmyrcBQzkpIFE
	dcfoJ0zXRMJvJCQKVXguCESUmxPL5VsMJRJBIg3Mwx9tsDDPkZjykxxZYZHguL8iaDVl
	mTuBFjmciXZNfNrXM9p4ar+4e4Cjf3qFD7lyw=
MIME-Version: 1.0
Received: by 10.68.13.35 with SMTP id e3mr3085545pbc.31.1319788920554; Fri, 28
	Oct 2011 01:02:00 -0700 (PDT)
Received: by 10.142.13.5 with HTTP; Fri, 28 Oct 2011 01:02:00 -0700 (PDT)
In-Reply-To: <92153636-70FA-4A57-BF1C-B8156BA8C641@recoil.org>
References: <20137.36872.515552.56355@mariner.uk.xensource.com>
	<92153636-70FA-4A57-BF1C-B8156BA8C641@recoil.org>
Date: Fri, 28 Oct 2011 10:02:00 +0200
X-Google-Sender-Auth: _m-IKGkDsoJt7DH2fT3T60He5-E
Message-ID: <CAPLaKK64fhfYgkiTspenN-xG9u3JsBM+EC_x_p5t9DKh7n+1Ow@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH v2] libxl: Provide a version of bsd's queue.h
	as _libxl_list.h
From: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= <roger.pau@entel.upc.edu>
To: Anil Madhavapeddy <anil@recoil.org>
Content-Type: text/plain; charset=UTF-8
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

I've tested this one on NetBSD, and it works fine.

Tested-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 Fri Oct 28 01:11:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 01:11:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJhXR-0006jt-LJ; Fri, 28 Oct 2011 01:11:41 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJhWh-0006XB-3P
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 01:10:55 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-8.tower-216.messagelabs.com!1319789451!1381833!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2462 invoked from network); 28 Oct 2011 08:10:51 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-8.tower-216.messagelabs.com with SMTP;
	28 Oct 2011 08:10:51 -0000
Received: from [83.211.176.139] (account d.faggioli@sssup.it HELO
	[192.168.0.4]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72747772; Fri, 28 Oct 2011 10:10:50 +0200
Message-ID: <1319789425.19320.12.camel@Abyss>
Subject: RE: [Xen-devel] [PATCH] scheduler rate controller
From: Dario Faggioli <raistlin@linux.it>
To: "Lv, Hui" <hui.lv@intel.com>
Date: Fri, 28 Oct 2011 10:10:25 +0200
In-Reply-To: <C10D3FB0CD45994C8A51FEC1227CE22F3428CB5EF9@shsmsx502.ccr.corp.intel.com>
References: <C10D3FB0CD45994C8A51FEC1227CE22F340768D793@shsmsx502.ccr.corp.intel.com>
	<CAFLBxZZ9nqeb7CVqTZCsEtJRjgGMTHF2Ak929kvauj2KUFSOyg@mail.gmail.com>
	<C10D3FB0CD45994C8A51FEC1227CE22F3428CB5EF9@shsmsx502.ccr.corp.intel.com>
Face: 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
X-Mailer: Evolution 3.2.1 (3.2.1-1.fc16) 
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>,
	George Dunlap <George.Dunlap@eu.citrix.com>, "Dong,
	Eddie" <eddie.dong@intel.com>, "Duan, Jiangang" <jiangang.duan@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>
Content-Type: multipart/mixed; boundary="===============1800198280=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============1800198280==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-dz5eCxUnYmjbB5Q5YNqC"


--=-dz5eCxUnYmjbB5Q5YNqC
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, 2011-10-28 at 10:07 +0800, Lv, Hui wrote:
> Yes, agree that, there are more things to do to make a more delicate solu=
tion for this in the next step.=20
>
Hi Hui,

Firt of ll, I took a look at the slides and it really seems there's a
huge amount of work there about benchmarking, analyzing the results and
chasing the culprits of the various sources of overhead... Great job,
indeed! :-)

> For example, we can consider per VM status to decide whether to turn on/o=
ff the control to make it more fair, such as your point three.
>=20
> However, as the first step, the current solution is straightforward and e=
ffective.=20
> 1) Most importantly, it happens when the scheduling frequency is excessiv=
e. User can decide which degree is excessive by setting parameter "opt_sche=
d_rate_high"(default 50). If the system is crucial for latency sensitive ta=
sks, you can choose a higher value that this patch will have little impact =
on it. User can decide which value is good for their environment. However, =
from our experience, if the scheduling frequency is too excessive, it also =
impairs the Qos of latency sensitive tasks due to frequent interrupts by ot=
her VMs.
> 2) Considering the excessive scheduling condition, the preemption is turn=
ing off entirely. If current running vcpu, yielded frequently, it cannot ru=
n for the full 10ms. If current running vcpu, not yielded frequently, it ca=
n possible run as long as up to 10ms. That means, this algorithm roughly pr=
otect the un-yielded vcpu to run a long time slice without preemption. This=
 is something similar to your point 3 but in a roughly way. :)
> 3) Finally, this patch aimed to solve the issue when scheduling frequency=
 is excessive but not influence the normal case (less frequency). We should=
 treat these two cases separately. Since excessive scheduling case cannot g=
uarantee neither performance or Qos.
>=20
Just something crossed my mind reading the patch and the comments, would
it make sense to rate-limit the calls coming from (non-timer) interrupt
exit paths while still letting the tick able to trigger a scheduling
decision? This just to be sure that at least the time slice enforcing
(if any) happens how expected... Could it make sense?

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).

For example this might completely destroy the time guarantees a
scheduler  like sEDF would give, and in such case it must be easy enough
to figure out what's going on and why the scheduler is not behaving as
expected!

For that reason, although again, this could be made general enough to be
sensible and meaningful for all the various schedulers, it might be
worthwhile to have it inside credit1 for now, where we know it will
probably yield the most of its benefits.

Just my 2 cents. :-)

Thanks and Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-dz5eCxUnYmjbB5Q5YNqC
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk6qY3EACgkQk4XaBE3IOsTE2gCbB73d1gSW0XPdvWq7/hF9nyck
cr8AniyqhBzjw2IiSfW/KdLt+ueHr2eP
=/04C
-----END PGP SIGNATURE-----

--=-dz5eCxUnYmjbB5Q5YNqC--



--===============1800198280==
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

--===============1800198280==--



From xen-devel-bounces@lists.xensource.com Fri Oct 28 01:48:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 01:48:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJi7W-0000JW-DH; Fri, 28 Oct 2011 01:48:58 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJi6b-00006r-L7
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 01:48:01 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319791645!61008244!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12884 invoked from network); 28 Oct 2011 08:47:25 -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;
	28 Oct 2011 08:47:25 -0000
X-IronPort-AV: E=Sophos;i="4.69,417,1315180800"; 
   d="scan'208";a="8639141"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 08:47:57 +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, 28 Oct 2011 09:47:58 +0100
Subject: Re: [Xen-devel] Help
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Pankaj Kumar Biswas <pankaj.kumarbiswas@citrix.com>
Date: Fri, 28 Oct 2011 09:47:57 +0100
In-Reply-To: <64FB1554ABC9B44FAA773FBD6CB889C2E1CB20578F@BANPMAILBOX01.citrite.net>
References: <64FB1554ABC9B44FAA773FBD6CB889C2E1CB20578F@BANPMAILBOX01.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: <1319791677.9436.181.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-10-28 at 05:15 +0100, Pankaj Kumar Biswas wrote:
> I want to know how the paging works in xen and what the shadow paging
> is?

I'm sorry but I'm afraid that no one here has time to school you from
first principals on such open ended topics, you are going to need to do
some leg work first yourself. There are various papers available on
xen.org for example and googling the subject matter should be of some
help. Once you are able to ask specific questions I suggest you reread
http://wiki.xen.org/xenwiki/AskingXenDevelQuestions post here again.

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 Oct 28 01:53:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 01:53:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJiBz-0000kv-5p; Fri, 28 Oct 2011 01:53:35 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJiBM-0000Ye-Ir
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 01:52:56 -0700
X-Env-Sender: hui.lv@intel.com
X-Msg-Ref: server-10.tower-21.messagelabs.com!1319791972!1979036!1
X-Originating-IP: [134.134.136.24]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29388 invoked from network); 28 Oct 2011 08:52:53 -0000
Received: from mga09.intel.com (HELO mga09.intel.com) (134.134.136.24)
	by server-10.tower-21.messagelabs.com with SMTP;
	28 Oct 2011 08:52:53 -0000
Received: from orsmga002.jf.intel.com ([10.7.209.21])
	by orsmga102.jf.intel.com with ESMTP; 28 Oct 2011 01:52:52 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,351,1309762800"; d="scan'208";a="68503257"
Received: from pgsmsx601.gar.corp.intel.com ([10.221.43.69])
	by orsmga002.jf.intel.com with ESMTP; 28 Oct 2011 01:52:51 -0700
Received: from pgsmsx101.gar.corp.intel.com (10.221.44.78) by
	pgsmsx601.gar.corp.intel.com (10.221.43.69) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Fri, 28 Oct 2011 16:52:21 +0800
Received: from shsmsx601.ccr.corp.intel.com (10.239.4.112) by
	PGSMSX101.gar.corp.intel.com (10.221.44.78) with Microsoft SMTP Server
	(TLS) id 14.1.323.3; Fri, 28 Oct 2011 16:52:21 +0800
Received: from shsmsx502.ccr.corp.intel.com ([10.239.4.96]) by
	shsmsx601.ccr.corp.intel.com ([10.239.4.112]) with mapi;
	Fri, 28 Oct 2011 16:52:20 +0800
From: "Lv, Hui" <hui.lv@intel.com>
To: Dario Faggioli <raistlin@linux.it>
Date: Fri, 28 Oct 2011 16:52:19 +0800
Subject: RE: [Xen-devel] [PATCH] scheduler rate controller
Thread-Topic: [Xen-devel] [PATCH] scheduler rate controller
Thread-Index: AcyVSSsCrlfu7By1SaOUymK1pDDarQAA2Tgw
Message-ID: <C10D3FB0CD45994C8A51FEC1227CE22F3428CB61F2@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>
In-Reply-To: <1319789425.19320.12.camel@Abyss>
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>,
	George Dunlap <George.Dunlap@eu.citrix.com>, "Dong,
	Eddie" <eddie.dong@intel.com>, "Duan, Jiangang" <jiangang.duan@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>
Content-Type: multipart/mixed; boundary="===============0030395242=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0030395242==
Content-Language: en-US
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

VGhhbmtzIERhcmlvIGZvciB5b3VyIGhlbHBmdWwgY29tbWVudHMuDQoNCj4gSnVzdCBzb21ldGhp
bmcgY3Jvc3NlZCBteSBtaW5kIHJlYWRpbmcgdGhlIHBhdGNoIGFuZCB0aGUgY29tbWVudHMsDQo+
IHdvdWxkIGl0IG1ha2Ugc2Vuc2UgdG8gcmF0ZS1saW1pdCB0aGUgY2FsbHMgY29taW5nIGZyb20g
KG5vbi10aW1lcikNCj4gaW50ZXJydXB0IGV4aXQgcGF0aHMgd2hpbGUgc3RpbGwgbGV0dGluZyB0
aGUgdGljayBhYmxlIHRvIHRyaWdnZXIgYQ0KPiBzY2hlZHVsaW5nIGRlY2lzaW9uPyBUaGlzIGp1
c3QgdG8gYmUgc3VyZSB0aGF0IGF0IGxlYXN0IHRoZSB0aW1lIHNsaWNlDQo+IGVuZm9yY2luZyAo
aWYgYW55KSBoYXBwZW5zIGhvdyBleHBlY3RlZC4uLiBDb3VsZCBpdCBtYWtlIHNlbnNlPw0KPiAN
Cg0KWWVzLCBpdCBtYWtlcyBzZW5zZS4gQnV0IGN1cnJlbnRseSwgd2UgbGFja3MgdGhlIHNjaGVk
dWxlciBrbm93bGVkZ2Ugc3VjaCBhcyB3aGF0IGNhdXNlZCB0aGUgc2NoZWR1bGVyLCB0aW1lciBv
ciBpbnRlcnJ1cHQ/IENhbiB3ZT8NCg0KPiBNb3JlIGdlbmVyYWxseSBzcGVha2luZywgSSBzZWUg
aG93IHRoaXMgZmVhdHVyZSBjYW4gYmUgdXNlZnVsLCBhbmQgSQ0KPiBhbHNvIHRoaW5rIGl0IGNv
dWxkIGxpdmUgaW4gdGhlIGdlbmVyaWMgc2NoZWR1bGUuYyBjb2RlLCBidXQgKGFzIEdlb3JnZQ0K
PiB3YXMgc2F5aW5nKSB0aGUgYWxnb3JpdGhtIGJ5IHdoaWNoIHJhdGUtbGltaXRpbmcgaXMgaGFw
cGVuaW5nIG5lZWRzIHRvDQo+IGJlIHdlbGwga25vd24sIGRvY3VtZW50ZWQgYW5kIGV4cG9zZWQg
dG8gdGhlIHVzZXIgKG1vcmUgdGhhbiBieSBtZWFucw0KPiBvZiBhIGNvdXBsZSBvZiBwZXJmLWNv
dW50ZXJzKS4NCj4gDQoNCk9uZSBxdWVzdGlvbiBpcyB0aGF0LCB3aGF0IGlzIHRoZSByaWdodCBw
YWxhY2UgdG8gZG9jdW1lbnQgc3VjaCBpbmZvcm1hdGlvbj8gSSdkIGxpa2UgdG8gbWFrZSBpdCBh
cyBjbGVhciBhcyBwb3NzaWJsZSB0byB0aGUgdXNlcnMuDQoNCj4gRm9yIGV4YW1wbGUgdGhpcyBt
aWdodCBjb21wbGV0ZWx5IGRlc3Ryb3kgdGhlIHRpbWUgZ3VhcmFudGVlcyBhDQo+IHNjaGVkdWxl
ciAgbGlrZSBzRURGIHdvdWxkIGdpdmUsIGFuZCBpbiBzdWNoIGNhc2UgaXQgbXVzdCBiZSBlYXN5
DQo+IGVub3VnaCB0byBmaWd1cmUgb3V0IHdoYXQncyBnb2luZyBvbiBhbmQgd2h5IHRoZSBzY2hl
ZHVsZXIgaXMgbm90DQo+IGJlaGF2aW5nIGFzIGV4cGVjdGVkIQ0KPiANCj4gRm9yIHRoYXQgcmVh
c29uLCBhbHRob3VnaCBhZ2FpbiwgdGhpcyBjb3VsZCBiZSBtYWRlIGdlbmVyYWwgZW5vdWdoIHRv
DQo+IGJlIHNlbnNpYmxlIGFuZCBtZWFuaW5nZnVsIGZvciBhbGwgdGhlIHZhcmlvdXMgc2NoZWR1
bGVycywgaXQgbWlnaHQgYmUNCj4gd29ydGh3aGlsZSB0byBoYXZlIGl0IGluc2lkZSBjcmVkaXQx
IGZvciBub3csIHdoZXJlIHdlIGtub3cgaXQgd2lsbA0KPiBwcm9iYWJseSB5aWVsZCB0aGUgbW9z
dCBvZiBpdHMgYmVuZWZpdHMuDQo+IA0KDQpJIHRoaW5rIEkgZ290IHlvdXIgcG9pbnQuIE1vcmUg
Y29uc2lkZXJhdGlvbnMgc2hvdWxkIGJlIHRha2VuIHRvIGF2b2lkIHRoZSBkaXNhc3RlcnMgdG8g
YW55IG9mIHRoZSBleGlzdGluZyBzY2hlZHVsZXJzLg0KSSdtIGZpbmUgdG8gbW92ZSBpdCB0byB0
aGUgY3JlZGl0IGluIHRoZSBjdXJyZW50IHN0YWdlLiA6KQ0KDQo+IEp1c3QgbXkgMiBjZW50cy4g
Oi0pDQo+IA0KPiBUaGFua3MgYW5kIFJlZ2FyZHMsDQo+IERhcmlvDQo+IA0KPiAtLQ0KPiA8PFRo
aXMgaGFwcGVucyBiZWNhdXNlIEkgY2hvb3NlIGl0IHRvIGhhcHBlbiE+PiAoUmFpc3RsaW4gTWFq
ZXJlKQ0KPiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+IERhcmlvIEZhZ2dpb2xpLCBodHRwOi8vcmV0aXMuc3Nz
dXAuaXQvcGVvcGxlL2ZhZ2dpb2xpDQo+IFNlbmlvciBTb2Z0d2FyZSBFbmdpbmVlciwgQ2l0cml4
IFN5c3RlbXMgUiZEIEx0ZC4sIENhbWJyaWRnZSAoVUspIFBoRA0KPiBDYW5kaWRhdGUsIFJlVGlT
IExhYiwgU2N1b2xhIFN1cGVyaW9yZSBTYW50J0FubmEsIFBpc2EgIChJdGFseSkNCg==


--===============0030395242==
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

--===============0030395242==--

From xen-devel-bounces@lists.xensource.com Fri Oct 28 02:00:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 02:00:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJiIv-0001HN-Iy; Fri, 28 Oct 2011 02:00:46 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJiGH-00012d-QB
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 01:58:02 -0700
X-Env-Sender: hedayati.mo@gmail.com
X-Msg-Ref: server-10.tower-174.messagelabs.com!1319792278!36970411!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5013 invoked from network); 28 Oct 2011 08:57:58 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-10.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2011 08:57:58 -0000
Received: by wyi11 with SMTP id 11so4752629wyi.30
	for <xen-devel@lists.xensource.com>;
	Fri, 28 Oct 2011 01:57:58 -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=FCPBzuCCF4I7rFfN+I8Krmmp+4SGyiuWgJ1t4ORWkc0=;
	b=ZcJhhxZc+gNtsSw0pgCzAVs6/wA1mnKZ/38C2WMhhoi8vNhrteAGRt+YAZflrUBJF2
	a8YufaQpk3nOBBFPWrf1RgL3PXoNEOAd9WXYWiQXYBnJt0qQCYabPCUfxj8V8q7b2V+Y
	PQbraYuinEd51OnvyJsfR7sQf6AjcvWnMEKhE=
Received: by 10.216.134.93 with SMTP id r71mr640184wei.59.1319792278196; Fri,
	28 Oct 2011 01:57:58 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.216.26.76 with HTTP; Fri, 28 Oct 2011 01:57:17 -0700 (PDT)
In-Reply-To: <CACF91CC.23D70%keir.xen@gmail.com>
References: <CABA5EEvdQoM+Hc1PJBzYbwbw3aBOUDhWQAEFDMTukznsFs9zZw@mail.gmail.com>
	<CACF91CC.23D70%keir.xen@gmail.com>
From: Mohammad Hedayati <hedayati.mo@gmail.com>
Date: Fri, 28 Oct 2011 12:27:17 +0330
Message-ID: <CABA5EEuAbJxn4fN3heDEKj-Cq0uNutjcc1TA8+JOaBOS176_xA@mail.gmail.com>
Subject: Re: [Xen-devel] Allowing several mappings of a frame
To: Keir Fraser <keir.xen@gmail.com>
Content-Type: text/plain; charset=UTF-8
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 Fri, Oct 28, 2011 at 1:25 AM, Keir Fraser <keir.xen@gmail.com> wrote:
> On 27/10/2011 22:16, "Mohammad Hedayati" <hedayati.mo@gmail.com> wrote:
>
>> Xen currently allows granting a single frame to several domains,
>> several times (to map or copy). Though the feature itself seems
>> appealing, I wonder if there's a real use case in any ports or PV
>> aware applications (i.e. a page is mapped or copied by more than 2
>> domains). Is there?
>
> It wouldn't typically happen.
>
>> Except the condition outlined above, PGC_count_mask part of a
>> page->count_info can be more than 1?
>
> Yes. Go trace some count_info values in a running system. Most will be >1=
.
>

I have traced the faulting pages in do_page_fault (where else?). The
pages with more than one reference (PGC_count_mask & page->count_info)
were flagged as PGT_lx_page_table or PGT_seg_desc_page (are the
mappers dom_xen, dom_cow or dom_io?). Is there more than one reference
for an ordinary pages?

> =C2=A0-- Keir
>
>> Thanks,
>> Mohammad
>>
>> _______________________________________________
>> Xen-devel mailing list
>> Xen-devel@lists.xensource.com
>> http://lists.xensource.com/xen-devel
>
>
>

How can I know, in addition to the owner, who has mapped a page?

What does (PGT_count_mask &  page->u.inuse.type_info) show? Why it is
not the same as (PGC_count_mask & page->count_info)?

Is there a documentation other than the comments in the code?

Thanks,
Mohammad

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 02:56:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 02:56:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJjAp-0002to-E5; Fri, 28 Oct 2011 02:56:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJj9y-0002gy-9j
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 02:55:34 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1319795730!1389746!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19308 invoked from network); 28 Oct 2011 09:55:31 -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;
	28 Oct 2011 09:55:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,417,1315180800"; 
   d="scan'208";a="8641617"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 09:55: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;
	Fri, 28 Oct 2011 10:55:29 +0100
Subject: Re: [Xen-devel] Fwd: Examples for using xl migrate -s ?
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Florian Heigl <florian.heigl@gmail.com>
Date: Fri, 28 Oct 2011 10:55:29 +0100
In-Reply-To: <CAFivhPniexii22twa+Cq+WPk2GUp5i=bKJZKpo4BH=ev1A3Jfg@mail.gmail.com>
References: <CAFivhPmT1mfzaQbPDviB4jMAUBe5u-cruXtDz7U2Jh7jWrPCcQ@mail.gmail.com>
	<CAFivhPniexii22twa+Cq+WPk2GUp5i=bKJZKpo4BH=ev1A3Jfg@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: <1319795729.9436.209.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 Thu, 2011-10-27 at 21:47 +0100, Florian Heigl wrote:
> Hi,
> 
> sorry to disturb, but are there any in-depth docs about migration in xl?

Not that I know of, sorry. 


> It appears this is not just me not knowing it :>
> 
> Greetings,
> Florian
> 
> 
> ---------- Forwarded message ----------
> From: Florian Heigl <florian.heigl@gmail.com>
> Date: 2011/10/25
> Subject: Examples for using xl migrate -s ?
> To: Xen Users <xen-users@lists.xensource.com>
> 
> 
> Hi,
> 
> I must find a way around the way live migration now uses ssh. I tested
> it and I see high cpu usage by SSH and overall sense of things being
> slow.
> My prod systems have a dedicated, fast link for live migration, but
> with ssh it would be crippled down to a <1Gbit.
> Does anyone have a working example of how to not use SSH as the transport layer?
> 
> I guess this is what the -s option is for, but I don't really get how
> it's intended to be used.

AIUI the argument which you give to -s must be a command which arranges
for it's stdin to be fed to the stdin of an "xl migrate-receive" on the
remote machine.

Probably that's a little bit of scripting on either end of the link to
spawn the necessary nc invocations.

Would it be useful to have a daemon mode for xl migrate-receive, i.e.
you would start it and it would listen on a dedicated port, forking to
receive each incoming connection. That would not be a good idea in
general but for a dedicated migration network it would be ok.

Perhaps an option to xl migrate-receive to have it receive a single
connection on a specified socket from a given source instead of
expecting things on stdin would be a useful compromise? i.e. you should
use ssh to execute that command "securely" then pipe the data to the
unsecure socket?

> 
> What I can think of ( -s "ssh other box, run netcat listener there;
> launch nc locally and receive migration data) sounds absolutely
> disgusting...

It's the Unix way, surely ;-)

> 
> Thanks for any pointers,
> Florian
> 
> --
> the purpose of libvirt is to provide an abstraction layer hiding all
> xen features added since 2006 until they were finally understood and
> copied by the kvm devs.
> 
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 03:11:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 03:11:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJjPC-0003eU-GW; Fri, 28 Oct 2011 03:11:18 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJjNr-0003RC-Mk
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 03:10:05 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-8.tower-174.messagelabs.com!1319796592!23313059!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9621 invoked from network); 28 Oct 2011 10:09:52 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-8.tower-174.messagelabs.com with SMTP;
	28 Oct 2011 10:09:52 -0000
Received: from [83.211.176.139] (account d.faggioli@sssup.it HELO
	[192.168.0.4]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72752215; Fri, 28 Oct 2011 12:09:46 +0200
Message-ID: <1319796584.19320.31.camel@Abyss>
Subject: RE: [Xen-devel] [PATCH] scheduler rate controller
From: Dario Faggioli <raistlin@linux.it>
To: "Lv, Hui" <hui.lv@intel.com>
Date: Fri, 28 Oct 2011 12:09:44 +0200
In-Reply-To: <C10D3FB0CD45994C8A51FEC1227CE22F3428CB61F2@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>
Face: 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
X-Mailer: Evolution 3.2.1 (3.2.1-1.fc16) 
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>,
	George Dunlap <George.Dunlap@eu.citrix.com>, "Dong,
	Eddie" <eddie.dong@intel.com>, "Duan, Jiangang" <jiangang.duan@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>
Content-Type: multipart/mixed; boundary="===============0914252001=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============0914252001==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-2YqhjpPiLYuGu/xiQIgm"


--=-2YqhjpPiLYuGu/xiQIgm
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, 2011-10-28 at 16:52 +0800, Lv, Hui wrote:
> > Just something crossed my mind reading the patch and the comments,
> > would it make sense to rate-limit the calls coming from (non-timer)
> > interrupt exit paths while still letting the tick able to trigger a
> > scheduling decision? This just to be sure that at least the time slice
> > enforcing (if any) happens how expected... Could it make sense?
> >=20
>=20
> Yes, it makes sense. But currently, we lacks the scheduler knowledge such=
 as what caused the scheduler, timer or interrupt? Can we?
>=20
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...

> > 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).
> >=20
>=20
> One question is that, what is the right palace to document such informati=
on? I'd like to make it as clear as possible to the users.
>=20
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.

> I think I got your point. More considerations should be taken to avoid th=
e disasters to any of the existing schedulers.
> I'm fine to move it to the credit in the current stage. :)
>=20
Yeah, and sorry (to everyone) for having pointed that out in so many
messages very similar to each other, but I was having MUA issues and was
thinking my mails weren't making to the list... Sorry again,

Thanks and Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-2YqhjpPiLYuGu/xiQIgm
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk6qf2gACgkQk4XaBE3IOsQIJwCfRwvtW6WZHFX+/XuH8Kh/JdfP
MfkAn1k/z/Kst9QlrgsV0vQ8mc2byXt6
=KNWc
-----END PGP SIGNATURE-----

--=-2YqhjpPiLYuGu/xiQIgm--



--===============0914252001==
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

--===============0914252001==--



From xen-devel-bounces@lists.xensource.com Fri Oct 28 03:12:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 03:12:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJjQZ-000423-Iw; Fri, 28 Oct 2011 03:12:43 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJjOU-0003WA-UE
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 03:10:38 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1319796631!1400275!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17378 invoked from network); 28 Oct 2011 10:10:32 -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;
	28 Oct 2011 10:10:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,417,1315180800"; 
   d="scan'208";a="8642066"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 10:10: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;
	Fri, 28 Oct 2011 11:10:31 +0100
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>,
	<juergen.gross@ts.fujitsu.com>
Date: Fri, 28 Oct 2011 11:10:31 +0100
In-Reply-To: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110271659380.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: <1319796631.9436.216.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

Hi Juergen,

Are you the best person to review this part of the xl manpage?

Can you provide a reference to the documentation for I<ConfigFile>
mentioned below? If nothing exists could you maybe write something up,
e.g. a man page or markdown document.

Thanks,
Ian.

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.
> +
> +=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>.
> +
> +=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
> + 


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 03:44:23 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 03:44:23 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJjvD-0005OI-5a; Fri, 28 Oct 2011 03:44:23 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJjuR-0005Bx-OR
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 03:43:36 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1319798612!36982682!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19257 invoked from network); 28 Oct 2011 10:43:32 -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;
	28 Oct 2011 10:43:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,417,1315180800"; 
   d="scan'208";a="8642792"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 10:43: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;
	Fri, 28 Oct 2011 11:43:31 +0100
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>
Date: Fri, 28 Oct 2011 11:43:31 +0100
In-Reply-To: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110271659380.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: <1319798611.9436.227.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-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.

> 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).

> +
> +=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.

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.

> +
> +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.

> +
> +=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.

> +
> +=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?

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.

[...]
> +=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).

> +=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. */"

> +
> +=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.

> +=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.

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?

> +
> +=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?

> +
> +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.

> [...]
> +
> +=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?

[...]
> +=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?

> +
> +=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.

> +=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.

> +=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".

> +
> +=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

> +
> +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?

> + 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)

> +=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.

> +=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.

> +
> +=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).

> +
> +=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.

>   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.

> +
> +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.

> +
> +=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)

> +=head1 BUGS
> +
> +Send bugs to xen-devel@lists.xensource.com.

Reference http://wiki.xen.org/xenwiki/ReportingBugs

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 04:20:35 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 04:20:35 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJkUC-0006Zt-5Z; Fri, 28 Oct 2011 04:20:32 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJkTJ-0006Mx-Vo
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 04:19:38 -0700
X-Env-Sender: juergen.gross@ts.fujitsu.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1319800774!1912391!1
X-Originating-IP: [80.70.172.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26589 invoked from network); 28 Oct 2011 11:19:34 -0000
Received: from dgate20.ts.fujitsu.com (HELO dgate20.ts.fujitsu.com)
	(80.70.172.51)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2011 11:19:34 -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=AcmzVviSMPXwF44zgMi1/LgbGU2o/iTg2vcHGPEYxAqpmrqZSO1Tg+zc
	KKb831J1vNucVMar7oWKlzbW+fjMlLAtc4Su6zUIE9opL1FMa+zL1P+iv
	xGgL9DepoXKUcrrcdnXR0aTuqjbPPdN/PEEwpG07rlKud+75R4qeNVMGA
	gn/oE31YdNolp2hWL7gBkUn8/8+UqnqKNxwk9UH+EF+GmiAadmy4TdYe1
	MJDjOPEj/8+UufmpY7pFlAONC2CDP;
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=1319800775; x=1351336775;
	h=message-id:date:from:mime-version:to:cc:subject:
	references:in-reply-to:content-transfer-encoding;
	bh=peDiGrme7bT7Lt/AYQPy2TLMCjL1NIT+cckqacpjHKU=;
	b=BmTi6Gl3ILZyS0ogxWZIMl1rVtHvgwELbJuSEyQSYMfSqU20DXsjJQKf
	lIY6hc+vwQHQ2/bPHr4aAnAFNyrKuzF3eRvbVszf+hx9sgGQqOJ1mIqiM
	KBRfpZQAwkrLy/T9nodkIwozadN+VxbhVrbFbBbs6l85oba5CLQlCeu+h
	PkmdRpKkJgM+usmJ9MIb0Yf5fKIYQr6+Dq9TnerqRyF8sgULOs0fKtJM8
	Nd8mWv1oCCV9Gyx+q8DaNbHkQ729s;
X-SBRSScore: None
X-IronPort-AV: E=Sophos;i="4.69,417,1315173600"; d="scan'208";a="77773702"
Received: from abgdgate30u.abg.fsc.net ([172.25.138.66])
	by dgate20u.abg.fsc.net with ESMTP; 28 Oct 2011 13:19:34 +0200
X-IronPort-AV: E=Sophos;i="4.69,417,1315173600"; d="scan'208";a="122033985"
Received: from sanpedro.mch.fsc.net ([172.17.20.6])
	by abgdgate30u.abg.fsc.net with ESMTP; 28 Oct 2011 13:19:34 +0200
Received: from [172.17.21.50] (verdon.osd.mch.fsc.net [172.17.21.50])
	by sanpedro.mch.fsc.net (Postfix) with ESMTP id 6E8BE9F6BD;
	Fri, 28 Oct 2011 13:19:34 +0200 (CEST)
Message-ID: <4EAA8FC6.9080607@ts.fujitsu.com>
Date: Fri, 28 Oct 2011 13:19:34 +0200
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 DOCDAY] introduce an xl man page in pod format
References: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
	<1319796631.9436.216.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319796631.9436.216.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>,
	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 10/28/2011 12:10 PM, Ian Campbell wrote:
> Hi Juergen,
>
> Are you the best person to review this part of the xl manpage?

I think so...

> Can you provide a reference to the documentation for I<ConfigFile>
> mentioned below? If nothing exists could you maybe write something up,
> e.g. a man page or markdown document.

Sure. I'll respond to Stefanos original mail.

> Thanks,
> Ian.
>
> On Thu, 2011-10-27 at 17:19 +0100, Stefano Stabellini wrote:
>> +=head1 CPUPOOLS COMMANDS

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 Oct 28 04:39:57 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 04:39:57 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJkmz-0007MB-BO; Fri, 28 Oct 2011 04:39:57 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJkmE-0007A9-8R
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 04:39:10 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1319801923!50588266!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22744 invoked from network); 28 Oct 2011 11:38:43 -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;
	28 Oct 2011 11:38:43 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315180800"; 
   d="scan'208";a="8644084"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11:38:39 +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, 28 Oct 2011 12:38:39 +0100
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>
Date: Fri, 28 Oct 2011 12:38:39 +0100
In-Reply-To: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110271659380.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: <1319801919.9436.237.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-10-27 at 17:19 +0100, Stefano Stabellini wrote:
> 
> +The create subcommand requires a config file: see L<xldomain.cfg> for
> +full details of that file format and possible options. 
[...]
> +B<xldomain.cfg>(5), B<xentop>(1)

The doc IanJ has been writing (although I think I'm going to pickup the
remainder) is docs/user/xl-domain-config.markdown rather than a manpage
xldomain.cfg(5).

Referencing such documents is a bit tricky, given the various paths and
formats this might live in (e.g.
http://www,xen.org/docs/xl-domain-config.html, /usr/share/doc/xen/xl-domain-config.txt etc) I think just referring to them by basename makes most sense.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 04:55:47 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 04:55:47 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJl2I-0000av-Ux; Fri, 28 Oct 2011 04:55:47 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJl1Q-0000Nv-3X
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 04:54:52 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1319802888!1090647!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11283 invoked from network); 28 Oct 2011 11:54:48 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2011 11:54:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315180800"; 
   d="scan'208";a="8644376"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11:54: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;
	Fri, 28 Oct 2011 12:54:48 +0100
Subject: Re: [Xen-devel] [PATCH v2] Add HybridISO support for PyGrub2
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Philipp Hahn <hahn@univention.de>
Date: Fri, 28 Oct 2011 12:54:48 +0100
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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1319802888.9436.249.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-10-28 at 08:46 +0100, Philipp Hahn wrote:
> Hello Ian,
> 
> On Thursday 27 October 2011 12:21:05 Ian Campbell wrote:
> > On Tue, 2011-10-25 at 11:33 +0100, Philipp Hahn wrote:
> > [...snip explanations...]
> >
> > Thanks Philipp, that all seems to make sense.
> >
> > Tim had some suggestions on how/where this functionality could be better
> > implemented though.
> 
> v2: For HybrisISOs use offset 0 in addition instead of replacement.
> 
> Signed-off-by: Philipp Hahn <hahn@univention.de>
> ---
> 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 
> partition table parsing.
> --- a/tools/pygrub/src/pygrub
> +++ b/tools/pygrub/src/pygrub
> @@ -40,15 +40,20 @@ def enable_cursor(ison):
>      except _curses.error:
>          pass
>  
> -def is_disk_image(file):
> +DISK_TYPE_RAW, DISK_TYPE_HYBRIDISO, DISK_TYPE_DOS = range(3)
> +def identify_disk_image(file):
> +    """Detect DOS partition table or HybridISO format."""
>      fd = os.open(file, os.O_RDONLY)
> -    buf = os.read(fd, 512)
> +    buf = os.read(fd, 0x8006)

Can we avoid reading all that just for the 7 bytes we are interested in.
What about (just pseudo python, I didn't actually lookup seek etc):

	buf = os.read(fd, 512)
	if len(buf) >= 512 and \
             not struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,):
		return ...RAW

	os.seek(0x8000)
	buf = os.read(fd, 6)
	if len... and buf[0x8001...] == 'CD001':
		return ...HYBRID
	else:
		return ...DOS

on the other hand I suppose it's only 8k...

Acked-by: Ian Campbell <ian.campbell@citrix.com>

Thanks.
Ian
.
>      os.close(fd)
>  
>      if len(buf) >= 512 and \
>             struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,):
> -        return True
> -    return False
> +        # HybridISO contains a DOS partition table for booting from USB 
> devices, but really is an ISO image
> +        if len(buf) >= 0x8006 and buf[0x8001:0x8006] == 'CD001':
> +            return DISK_TYPE_HYBRIDISO
> +        return DISK_TYPE_DOS
> +    return DISK_TYPE_RAW
>  
>  SECTOR_SIZE=512
>  DK_LABEL_LOC=1
> @@ -87,12 +92,19 @@ FDISK_PART_SOLARIS_OLD=0x82
>  FDISK_PART_GPT=0xee
>  
>  def get_partition_offsets(file):
> -    if not is_disk_image(file):
> +    image_type = identify_disk_image(file)
> +    if image_type == DISK_TYPE_RAW:
>          # No MBR: assume whole disk filesystem, which is like a 
>          # single partition starting at 0
>          return [0]
> -
> -    part_offs = []
> +    elif image_type == DISK_TYPE_HYBRIDISO:
> +        # A HybridISO contains an ISO filesystem at 0 in addition
> +        # to the DOS partition table
> +        part_offs = [0]
> +    elif image_type == DISK_TYPE_DOS:
> +        part_offs = []
> +    else:
> +        raise ValueError('Unhandled image type returnd by 
> identify_disk_image(): %d' % (image_type,))
>  
>      fd = os.open(file, os.O_RDONLY)
>      buf = os.read(fd, 512)
> 
> Sincerely
> Philipp



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 05:48:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 05:48:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJlrb-0002N9-W4; Fri, 28 Oct 2011 05:48:48 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJlqa-0002AW-VF; Fri, 28 Oct 2011 05:47:48 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319806061!2044141!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29320 invoked from network); 28 Oct 2011 12:47:41 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2011 12:47:41 -0000
Received: by wyi11 with SMTP id 11so5018358wyi.30
	for <multiple recipients>; Fri, 28 Oct 2011 05:47:41 -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;
	bh=/q1KA+Wyyjmud9BrdgqyIdnzCQllGAdufWewV47CWE0=;
	b=B5PySd0N04wwf0+pa+qmRgK5PyPBibeF67pTyuF1ehSlHF6ySnqvuDZKa3Eh8DK68I
	jmmd7ZSmIhPlvMsHuk1i5A3HnzvW6+emm/ImNsMe89bkTdkyXGaPbW9G+rFYYqni9FXo
	L0AKSOhZJUn1IjBMbq8CQ52EKYtac3hdIRkao=
Received: by 10.216.221.80 with SMTP id q58mr933461wep.36.1319806060794;
	Fri, 28 Oct 2011 05:47:40 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id eu16sm15377737wbb.7.2011.10.28.05.47.36
	(version=SSLv3 cipher=OTHER); Fri, 28 Oct 2011 05:47:39 -0700 (PDT)
Message-ID: <4EAAA467.2030503@xen.org>
Date: Fri, 28 Oct 2011 13:47:35 +0100
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: Joseph Glanville <joseph.glanville@orionvm.com.au>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111026195543.GA6558@phenom.dumpdata.com>
	<4EA932D5.3060504@xen.org>
	<CAOzFzEiTzSDABmtJw3u+jow5Xw_wRYNxFr9U_G-q59-Qwv7j=g@mail.gmail.com>
In-Reply-To: <CAOzFzEiTzSDABmtJw3u+jow5Xw_wRYNxFr9U_G-q59-Qwv7j=g@mail.gmail.com>
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"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>,
	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="===============1085940012=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1085940012==
Content-Type: multipart/alternative;
	boundary="------------080606010500070808090901"

This is a multi-part message in MIME format.
--------------080606010500070808090901
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Joseph,

thanks for doing this. There should be some stuff on the Wiki to build 
on. There are also some blog posts/blogs, which may have useful info:
- 
http://bderzhavets.wordpress.com/2011/10/27/set-up-oneiric-pv-domu-at-xen-4-1-2-oneiric-dom0-3-1-0-030100-generic/
- http://grantmcwilliams.com/tech/virtualization/540-updated-xen-howtos
- http://www.xen-support.com/

I managed to categorize most pages according to User / Dev / User 
Beginner (there are a few where I didn't get round to it though). I 
think another great thing for Beginners would be a new LiveCD: but 
nobody so far is willing to step up.

You should know that in the next few weeks we will be migrating to 
MediaWiki and we will make the existing Wiki RO (the plan is to have an 
html instance with the MoinMoin markup stored somewhere publicly or 
converted MoinMoin=>MediaWiki stored somewhere). So writing a Beginners 
Guide first is a good idea.

I am also thinking of starting the MediaWiki with very strong 
categorisation (i.e. every page must have a category). Categories would be:

  * By audience: User, Developer, Beginner, Community, Vendor
  * By lifetime:
      o Transient: limited lifespan
      o Archived: saved for history
  * By project: Xen, XCP, PVOPS, XenARM, OCaml
  * By document type:
      o FAQ, HowTo, Tutorial, Overview
      o Design
      o Dev Process
      o Compatibility
      o Project: page related to a Xen project
      o Glossary : there is a specific way to do this in MediaWiki
      o Index : may not be needed if we say Index=Category

There may be a few more. Will need to work on these a little more. It 
may also mean that the MediWiki instance is set up that pages must have 
a category and that only a subset of users can create new ones. 
Otherwise we get into the same mess again.

Lars

On 27/10/2011 21:23, Joseph Glanville wrote:
> Great work on categorizing/marking all the pages everyone!
>
> The path is clear now to write some really good documentation. :)
>
> I have started work on a Beginners Guide which is effectively a step 
> by step guide to a functional install on Debian Sqeeze.
> Currently this is the most frictionless and least "magic" way to get 
> Xen up and running and forms a good basis to experiment with more 
> advanced Xen features.
> The aim of the guide is to introduce all key concepts, get people 
> playing with Xen in a environment that is relatively fully featured 
> but not too daunting to setup. It covers everything from basic 
> virtualisation, storage and networking through to starting, stopping 
> guests and getting Windows running ontop of Xen.
>
> You can see my progress up on this Google doc: 
> https://docs.google.com/document/d/1q9odKP8Id26J8kHCAFt8aD5krXdUiZnZGw1Q-LGWCJg/edit
> Will format for wiki and publish when it is done.
>
> If anyone would like to contribute feel free to contact me, 
> comments/suggestions are more than welcome.
>
> Moving on from this I will write a more advanced Debian specific guide 
> that delves into setting up complex networking, guest isolation 
> techniques, storage virtualisation and all those goodies.
>
> Very excited to see all the awesome things coming out of this and 
> definitely recommend we have a monthly thing where we get together and 
> decide on how we can improve documentation.
> Once a direction has been established it's easy to sit down and get 
> stuff done.
>
> Joseph.
>
>
>
> On 27 October 2011 21:30, Lars Kurth <lars.kurth@xen.org 
> <mailto:lars.kurth@xen.org>> wrote:
>
>     On 26/10/2011 20:55, Konrad Rzeszutek Wilk wrote:
>
>         On Mon, Oct 17, 2011 at 04:37:15PM +0100, Lars Kurth wrote:
>
>             Cool.
>
>             I am wondering what people think about archiving vs
>             deleting wiki
>             pages. Obviously some pages can be deleted (stuff about
>             events, job
>             listings, old TODO lists, etc.).
>
>             Others may still be valuable to legacy users. See
>
>         .. snip..
>         Hey Lars,
>
>         I was trying to add to
>         https://docs.google.com/spreadsheet/ccc?key=0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&hl=en_US#gid=0
>         <https://docs.google.com/spreadsheet/ccc?key=0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&hl=en_US#gid=0>
>
>         a couple of things but it seems I am not authorized, anyhow
>         these are the changes:
>
>         NetBSDdomU merge with How_to_build_NetBSD_DomU_on_Linux
>         2.6.18-to-2.6.31-and-higher is OK.
>         InstallationNotes - remove
>         KnownGoodImages - remove
>         InstallGuestImage - remove
>         RealModeArea - archive, or move it to be PPC/RealModeArea
>         USBCompatibilityList - remove
>         XenPCIpassthrough - keep, I just updated it
>         XenPVOPSDRM - keep, just updated it
>         XenSerialConsole - keep, I just updated it
>         XenPVSCSI - keep
>         XenUSBPassthrough - keep, just updated it
>         XenParavirtOps - keep, just updated it.
>         XenOnUbuntu64 - remove
>
>     Odd: you should have write access like anybody else. Anyway, I
>     applied your changes.
>
>
>
>
> -- 
> */
> Founder | Director | VP Research
> Orion Virtualisation Solutions/* | www.orionvm.com.au 
> <http://www.orionvm.com.au/> | Phone: 1300 56 99 52 | Mobile: 0428 754 846


--------------080606010500070808090901
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Joseph,<br>
    <br>
    thanks for doing this. There should be some stuff on the Wiki to
    build on. There are also some blog posts/blogs, which may have
    useful info:<br>
    -
<a class="moz-txt-link-freetext" href="http://bderzhavets.wordpress.com/2011/10/27/set-up-oneiric-pv-domu-at-xen-4-1-2-oneiric-dom0-3-1-0-030100-generic/">http://bderzhavets.wordpress.com/2011/10/27/set-up-oneiric-pv-domu-at-xen-4-1-2-oneiric-dom0-3-1-0-030100-generic/</a><br>
    -
    <a class="moz-txt-link-freetext" href="http://grantmcwilliams.com/tech/virtualization/540-updated-xen-howtos">http://grantmcwilliams.com/tech/virtualization/540-updated-xen-howtos</a><br>
    - <a class="moz-txt-link-freetext" href="http://www.xen-support.com/">http://www.xen-support.com/</a><br>
    <br>
    I managed to categorize most pages according to User / Dev / User
    Beginner (there are a few where I didn't get round to it though). I
    think another great thing for Beginners would be a new LiveCD: but
    nobody so far is willing to step up.<br>
    <br>
    You should know that in the next few weeks we will be migrating to
    MediaWiki and we will make the existing Wiki RO (the plan is to have
    an html instance with the MoinMoin markup stored somewhere publicly
    or converted MoinMoin=&gt;MediaWiki stored somewhere). So writing a
    Beginners Guide first is a good idea.<br>
    <br>
    I am also thinking of starting the MediaWiki with very strong
    categorisation (i.e. every page must have a category). Categories
    would be:<br>
    <ul>
      <li>By audience: User, Developer, Beginner, Community, Vendor </li>
      <li>By lifetime: <br>
      </li>
      <ul>
        <li>Transient: limited lifespan<br>
        </li>
        <li>Archived: saved for history<br>
        </li>
      </ul>
      <li>By project: Xen, XCP, PVOPS, XenARM, OCaml<br>
      </li>
      <li>By document type: <br>
      </li>
      <ul>
        <li>FAQ, HowTo, Tutorial, Overview</li>
        <li>Design</li>
        <li>Dev Process<br>
        </li>
        <li>Compatibility<br>
        </li>
        <li>Project: page related to a Xen project&nbsp;</li>
        <li>Glossary : there is a specific way to do this in MediaWiki<br>
        </li>
        <li>Index : may not be needed if we say Index=Category<br>
        </li>
      </ul>
    </ul>
    There may be a few more. Will need to work on these a little more.
    It may also mean that the MediWiki instance is set up that pages
    must have a category and that only a subset of users can create new
    ones. Otherwise we get into the same mess again.<br>
    <br>
    Lars<br>
    <br>
    On 27/10/2011 21:23, Joseph Glanville wrote:
    <blockquote
cite="mid:CAOzFzEiTzSDABmtJw3u+jow5Xw_wRYNxFr9U_G-q59-Qwv7j=g@mail.gmail.com"
      type="cite">Great work on categorizing/marking all the pages
      everyone!<br>
      <br>
      The path is clear now to write some really good documentation. :)<br>
      <br>
      I have started work on a Beginners Guide which is effectively a
      step by step guide to a functional install on Debian Sqeeze.<br>
      Currently this is the most frictionless and least "magic" way to
      get Xen up and running and forms a good basis to experiment with
      more advanced Xen features.<br>
      The aim of the guide is to introduce all key concepts, get people
      playing with Xen in a environment that is relatively fully
      featured but not too daunting to setup. It covers everything from
      basic virtualisation, storage and networking through to starting,
      stopping guests and getting Windows running ontop of Xen.<br>
      <br>
      You can see my progress up on this Google doc: <a
        moz-do-not-send="true"
href="https://docs.google.com/document/d/1q9odKP8Id26J8kHCAFt8aD5krXdUiZnZGw1Q-LGWCJg/edit"
        target="_blank">https://docs.google.com/document/d/1q9odKP8Id26J8kHCAFt8aD5krXdUiZnZGw1Q-LGWCJg/edit</a><br>
      Will format for wiki and publish when it is done.<br>
      <br>
      If anyone would like to contribute feel free to contact me,
      comments/suggestions are more than welcome.<br>
      <br>
      Moving on from this I will write a more advanced Debian specific
      guide that delves into setting up complex networking, guest
      isolation techniques, storage virtualisation and all those
      goodies.<br>
      <br>
      Very excited to see all the awesome things coming out of this and
      definitely recommend we have a monthly thing where we get together
      and decide on how we can improve documentation.<br>
      Once a direction has been established it's easy to sit down and
      get stuff done.<br>
      <br>
      Joseph.<br>
      <br>
      <br>
      <br>
      <div class="gmail_quote">On 27 October 2011 21:30, Lars Kurth <span
          dir="ltr">&lt;<a moz-do-not-send="true"
            href="mailto:lars.kurth@xen.org" target="_blank">lars.kurth@xen.org</a>&gt;</span>
        wrote:<br>
        <blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt
          0.8ex; border-left: 1px solid rgb(204, 204, 204);
          padding-left: 1ex;">
          <div>
            <div>On 26/10/2011 20:55, Konrad Rzeszutek Wilk wrote:<br>
              <blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt
                0.8ex; border-left: 1px solid rgb(204, 204, 204);
                padding-left: 1ex;">
                On Mon, Oct 17, 2011 at 04:37:15PM +0100, Lars Kurth
                wrote:<br>
                <blockquote class="gmail_quote" style="margin: 0pt 0pt
                  0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204);
                  padding-left: 1ex;">
                  Cool.<br>
                  <br>
                  I am wondering what people think about archiving vs
                  deleting wiki<br>
                  pages. Obviously some pages can be deleted (stuff
                  about events, job<br>
                  listings, old TODO lists, etc.).<br>
                  <br>
                  Others may still be valuable to legacy users. See<br>
                </blockquote>
                .. snip..<br>
                Hey Lars,<br>
                <br>
                I was trying to add to <a moz-do-not-send="true"
href="https://docs.google.com/spreadsheet/ccc?key=0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&amp;hl=en_US#gid=0"
                  target="_blank">https://docs.google.com/spreadsheet/ccc?key=0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&amp;hl=en_US#gid=0</a><br>
                <br>
                a couple of things but it seems I am not authorized,
                anyhow these are the changes:<br>
                <br>
                NetBSDdomU merge with How_to_build_NetBSD_DomU_on_Linux<br>
                2.6.18-to-2.6.31-and-higher is OK.<br>
                InstallationNotes - remove<br>
                KnownGoodImages - remove<br>
                InstallGuestImage - remove<br>
                RealModeArea - archive, or move it to be
                PPC/RealModeArea<br>
                USBCompatibilityList - remove<br>
                XenPCIpassthrough - keep, I just updated it<br>
                XenPVOPSDRM - keep, just updated it<br>
                XenSerialConsole - keep, I just updated it<br>
                XenPVSCSI - keep<br>
                XenUSBPassthrough - keep, just updated it<br>
                XenParavirtOps - keep, just updated it.<br>
                XenOnUbuntu64 - remove<br>
              </blockquote>
            </div>
          </div>
          Odd: you should have write access like anybody else. Anyway, I
          applied your changes.<br>
        </blockquote>
      </div>
      <br>
      <br clear="all">
      <br>
      -- <br>
      <span style="font-family: arial,sans-serif; font-size: 13px;
        border-collapse: collapse;"><b><i><font color="#0000ff">
              <div><font color="#000000"><span style="font-style:
                    normal; font-weight: normal;">Founder | Director |
                    VP Research<br>
                  </span></font></div>
              Orion Virtualisation Solutions</font></i></b>&nbsp;|&nbsp;<font
          color="#0000ff"><a moz-do-not-send="true"
            href="http://www.orionvm.com.au/" style="color: rgb(42, 93,
            176);" target="_blank">www.orionvm.com.au</a></font>&nbsp;|
        Phone: 1300 56 99 52 | Mobile: 0428 754 846</span><br>
    </blockquote>
    <br>
  </body>
</html>

--------------080606010500070808090901--


--===============1085940012==
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

--===============1085940012==--


From xen-devel-bounces@lists.xensource.com Fri Oct 28 05:52:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 05:52:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJlv7-0003UI-9P; Fri, 28 Oct 2011 05:52:25 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJluc-0003Hj-Tp
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 05:51:55 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-11.tower-174.messagelabs.com!1319806311!37001627!1
X-Originating-IP: [74.125.82.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21662 invoked from network); 28 Oct 2011 12:51:51 -0000
Received: from mail-ww0-f43.google.com (HELO mail-ww0-f43.google.com)
	(74.125.82.43)
	by server-11.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2011 12:51:51 -0000
Received: by wwf10 with SMTP id 10so4813568wwf.24
	for <xen-devel@lists.xensource.com>;
	Fri, 28 Oct 2011 05:51:51 -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:subject
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=1/nbdqO8BzFvmWAY9rNcj/gwlGjfnWIhCYn0/OvNk0I=;
	b=l7iAV8Lg3JSY3CIpE+hRxgVEtn3hXmGLlicBQ84mqCmgiCY5BnVv8R5Ib4JFxWA3Wk
	AfN01WIbche6kNWOAJBefp+0u+fgmLm+xUrpfrXR/u8b2YCK7ZJFc5XCjxemHYTYOmT3
	vp4n0gKGj81aFrwVbzFU3TZPGWcszbvzFr0Pw=
Received: by 10.227.205.78 with SMTP id fp14mr3568354wbb.23.1319806311427;
	Fri, 28 Oct 2011 05:51:51 -0700 (PDT)
Received: from [172.16.25.10] (02d933ea.bb.sky.com. [2.217.51.234])
	by mx.google.com with ESMTPS id e7sm15385136wbh.12.2011.10.28.05.51.49
	(version=SSLv3 cipher=OTHER); Fri, 28 Oct 2011 05:51:50 -0700 (PDT)
Message-ID: <4EAAA564.1080301@xen.org>
Date: Fri, 28 Oct 2011 13:51:48 +0100
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
Subject: Re: [Xen-devel] [PATCH DOCDAY] introduce an xl man page in pod format
References: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
	<1319801919.9436.237.camel@zakaz.uk.xensource.com>
In-Reply-To: <1319801919.9436.237.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset=UTF-8; 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

When I went through the Wiki, there were a few documents that looked 
like man page material. Do check:
- XenConfigurationFileOptions
- XenHypervisorBootOptions
- XenBooting
Please do consider these
Lars

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 06:24:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 06:24:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJmQ4-0004i3-6U; Fri, 28 Oct 2011 06:24:24 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJmPC-0004Uy-2C
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 06:23:30 -0700
X-Env-Sender: cyliu@suse.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1319808205!1352661!1
X-Originating-IP: [137.65.250.26]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19098 invoked from network); 28 Oct 2011 13:23:26 -0000
Received: from victor.provo.novell.com (HELO victor.provo.novell.com)
	(137.65.250.26)
	by server-11.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 28 Oct 2011 13:23:26 -0000
Received: from localhost.localdomain (prv-ext-foundry1int.gns.novell.com
	[137.65.251.240])
	by victor.provo.novell.com with ESMTP (TLS encrypted);
	Fri, 28 Oct 2011 07:23:20 -0600
From: Chunyan Liu <cyliu@suse.com>
To: stefano.stabellini@eu.citrix.com,
	xen-devel@lists.xensource.com
Subject: Re: [Xen-devel]xl create PV guest with qcow/qcow2 disk images fail
Date: Fri, 28 Oct 2011 21:27:30 +0800
Message-Id: <1319808450-9617-1-git-send-email-cyliu@suse.com>
X-Mailer: git-send-email 1.7.3.4
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

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.c	Thu Oct 20 15:24:46 2011 +0800
+++ b/tools/libxl/libxl.c	Fri 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);    
+    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};
+    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;
+}
+
+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);
     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 = LIBXL_INIT_GC(ctx);
+    int ret;
 
+    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.h	Thu Oct 20 15:24:46 2011 +0800
+++ b/tools/libxl/libxl.h	Fri 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.c	Thu Oct 20 15:24:46 2011 +0800
+++ b/tools/libxl/libxl_bootloader.c	Fri 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

From xen-devel-bounces@lists.xensource.com Fri Oct 28 07:12:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 07:12:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJnAC-0006Ji-MZ; Fri, 28 Oct 2011 07:12:04 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJn9R-000673-I7; Fri, 28 Oct 2011 07:11:18 -0700
X-Env-Sender: joseph.glanville@orionvm.com.au
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319811072!37056401!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7418 invoked from network); 28 Oct 2011 14:11:13 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-4.tower-174.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2011 14:11:13 -0000
Received: by gyg13 with SMTP id 13so6377654gyg.30
	for <multiple recipients>; Fri, 28 Oct 2011 07:11:12 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.42.147.65 with SMTP id m1mr4498118icv.27.1319811072085; Fri,
	28 Oct 2011 07:11:12 -0700 (PDT)
Received: by 10.231.165.195 with HTTP; Fri, 28 Oct 2011 07:11:11 -0700 (PDT)
X-Originating-IP: [59.167.234.130]
In-Reply-To: <4EAAA467.2030503@xen.org>
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111026195543.GA6558@phenom.dumpdata.com>
	<4EA932D5.3060504@xen.org>
	<CAOzFzEiTzSDABmtJw3u+jow5Xw_wRYNxFr9U_G-q59-Qwv7j=g@mail.gmail.com>
	<4EAAA467.2030503@xen.org>
Date: Sat, 29 Oct 2011 01:11:11 +1100
Message-ID: <CAOzFzEhyskeJjhDoY5Kr6DnnCq+AagY9YbfZ4Ja=ryHc9NPr6Q@mail.gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Joseph Glanville <joseph.glanville@orionvm.com.au>
To: Lars Kurth <lars.kurth@xen.org>
Cc: Andrew Bobulsky <rulerof@gmail.com>,
	"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>,
	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="===============1535561411=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1535561411==
Content-Type: multipart/alternative; boundary=90e6ba1efd3a1f4d3704b05c7677

--90e6ba1efd3a1f4d3704b05c7677
Content-Type: text/plain; charset=ISO-8859-1

Those categories look good, does MediaWiki have a tagging concept that
would allow pages to be members of multiple categories?

How would a Debian Xen LiveCD built as a companion to the beginners guide
sound?

I will think about the LiveCD after I get this guide finished, my bandwidth
is somewhat constrained over the coming weeks so I'm hesitant to say I will
do it without knowing I can put time aside.

Joseph.


On 28 October 2011 23:47, Lars Kurth <lars.kurth@xen.org> wrote:

>  Joseph,
>
> thanks for doing this. There should be some stuff on the Wiki to build on.
> There are also some blog posts/blogs, which may have useful info:
> -
> http://bderzhavets.wordpress.com/2011/10/27/set-up-oneiric-pv-domu-at-xen-4-1-2-oneiric-dom0-3-1-0-030100-generic/
> - http://grantmcwilliams.com/tech/virtualization/540-updated-xen-howtos
> - http://www.xen-support.com/
>
> I managed to categorize most pages according to User / Dev / User Beginner
> (there are a few where I didn't get round to it though). I think another
> great thing for Beginners would be a new LiveCD: but nobody so far is
> willing to step up.
>
> You should know that in the next few weeks we will be migrating to
> MediaWiki and we will make the existing Wiki RO (the plan is to have an
> html instance with the MoinMoin markup stored somewhere publicly or
> converted MoinMoin=>MediaWiki stored somewhere). So writing a Beginners
> Guide first is a good idea.
>
> I am also thinking of starting the MediaWiki with very strong
> categorisation (i.e. every page must have a category). Categories would be:
>
>    - By audience: User, Developer, Beginner, Community, Vendor
>    - By lifetime:
>     - Transient: limited lifespan
>        - Archived: saved for history
>        - By project: Xen, XCP, PVOPS, XenARM, OCaml
>     - By document type:
>     - FAQ, HowTo, Tutorial, Overview
>       - Design
>       - Dev Process
>        - Compatibility
>        - Project: page related to a Xen project
>       - Glossary : there is a specific way to do this in MediaWiki
>        - Index : may not be needed if we say Index=Category
>
> There may be a few more. Will need to work on these a little more. It may
> also mean that the MediWiki instance is set up that pages must have a
> category and that only a subset of users can create new ones. Otherwise we
> get into the same mess again.
>
> Lars
>
>
> On 27/10/2011 21:23, Joseph Glanville wrote:
>
> Great work on categorizing/marking all the pages everyone!
>
> The path is clear now to write some really good documentation. :)
>
> I have started work on a Beginners Guide which is effectively a step by
> step guide to a functional install on Debian Sqeeze.
> Currently this is the most frictionless and least "magic" way to get Xen
> up and running and forms a good basis to experiment with more advanced Xen
> features.
> The aim of the guide is to introduce all key concepts, get people playing
> with Xen in a environment that is relatively fully featured but not too
> daunting to setup. It covers everything from basic virtualisation, storage
> and networking through to starting, stopping guests and getting Windows
> running ontop of Xen.
>
> You can see my progress up on this Google doc:
> https://docs.google.com/document/d/1q9odKP8Id26J8kHCAFt8aD5krXdUiZnZGw1Q-LGWCJg/edit
> Will format for wiki and publish when it is done.
>
> If anyone would like to contribute feel free to contact me,
> comments/suggestions are more than welcome.
>
> Moving on from this I will write a more advanced Debian specific guide
> that delves into setting up complex networking, guest isolation techniques,
> storage virtualisation and all those goodies.
>
> Very excited to see all the awesome things coming out of this and
> definitely recommend we have a monthly thing where we get together and
> decide on how we can improve documentation.
> Once a direction has been established it's easy to sit down and get stuff
> done.
>
> Joseph.
>
>
>
> On 27 October 2011 21:30, Lars Kurth <lars.kurth@xen.org> wrote:
>
>>  On 26/10/2011 20:55, Konrad Rzeszutek Wilk wrote:
>>
>>> On Mon, Oct 17, 2011 at 04:37:15PM +0100, Lars Kurth wrote:
>>>
>>>> Cool.
>>>>
>>>> I am wondering what people think about archiving vs deleting wiki
>>>> pages. Obviously some pages can be deleted (stuff about events, job
>>>> listings, old TODO lists, etc.).
>>>>
>>>> Others may still be valuable to legacy users. See
>>>>
>>> .. snip..
>>> Hey Lars,
>>>
>>> I was trying to add to
>>> https://docs.google.com/spreadsheet/ccc?key=0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&hl=en_US#gid=0
>>>
>>> a couple of things but it seems I am not authorized, anyhow these are
>>> the changes:
>>>
>>> NetBSDdomU merge with How_to_build_NetBSD_DomU_on_Linux
>>> 2.6.18-to-2.6.31-and-higher is OK.
>>> InstallationNotes - remove
>>> KnownGoodImages - remove
>>> InstallGuestImage - remove
>>> RealModeArea - archive, or move it to be PPC/RealModeArea
>>> USBCompatibilityList - remove
>>> XenPCIpassthrough - keep, I just updated it
>>> XenPVOPSDRM - keep, just updated it
>>> XenSerialConsole - keep, I just updated it
>>> XenPVSCSI - keep
>>> XenUSBPassthrough - keep, just updated it
>>> XenParavirtOps - keep, just updated it.
>>> XenOnUbuntu64 - remove
>>>
>>  Odd: you should have write access like anybody else. Anyway, I applied
>> your changes.
>>
>
>
>
> --
> *
> Founder | Director | VP Research
>  Orion Virtualisation Solutions* | www.orionvm.com.au | Phone: 1300 56 99
> 52 | Mobile: 0428 754 846
>
>
>


-- 
*
Founder | Director | VP Research
Orion Virtualisation Solutions* | www.orionvm.com.au | Phone: 1300 56 99 52
| Mobile: 0428 754 846

--90e6ba1efd3a1f4d3704b05c7677
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Those categories look good, does MediaWiki have a tagging concept that woul=
d allow pages to be members of multiple categories?<br><br>How would a Debi=
an Xen LiveCD built as a companion to the beginners guide sound?<br><br>
I will think about the LiveCD after I get this guide finished, my bandwidth=
 is somewhat constrained over the coming weeks so I&#39;m hesitant to say I=
 will do it without knowing I can put time aside.<br><br>Joseph.<br><br>
<br><div class=3D"gmail_quote">On 28 October 2011 23:47, Lars Kurth <span d=
ir=3D"ltr">&lt;<a href=3D"mailto:lars.kurth@xen.org">lars.kurth@xen.org</a>=
&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin: 0p=
t 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1=
ex;">

 =20
   =20
 =20
  <div bgcolor=3D"#FFFFFF" text=3D"#000000">
    Joseph,<br>
    <br>
    thanks for doing this. There should be some stuff on the Wiki to
    build on. There are also some blog posts/blogs, which may have
    useful info:<br>
    -
<a href=3D"http://bderzhavets.wordpress.com/2011/10/27/set-up-oneiric-pv-do=
mu-at-xen-4-1-2-oneiric-dom0-3-1-0-030100-generic/" target=3D"_blank">http:=
//bderzhavets.wordpress.com/2011/10/27/set-up-oneiric-pv-domu-at-xen-4-1-2-=
oneiric-dom0-3-1-0-030100-generic/</a><br>

    -
    <a href=3D"http://grantmcwilliams.com/tech/virtualization/540-updated-x=
en-howtos" target=3D"_blank">http://grantmcwilliams.com/tech/virtualization=
/540-updated-xen-howtos</a><br>
    - <a href=3D"http://www.xen-support.com/" target=3D"_blank">http://www.=
xen-support.com/</a><br>
    <br>
    I managed to categorize most pages according to User / Dev / User
    Beginner (there are a few where I didn&#39;t get round to it though). I
    think another great thing for Beginners would be a new LiveCD: but
    nobody so far is willing to step up.<br>
    <br>
    You should know that in the next few weeks we will be migrating to
    MediaWiki and we will make the existing Wiki RO (the plan is to have
    an html instance with the MoinMoin markup stored somewhere publicly
    or converted MoinMoin=3D&gt;MediaWiki stored somewhere). So writing a
    Beginners Guide first is a good idea.<br>
    <br>
    I am also thinking of starting the MediaWiki with very strong
    categorisation (i.e. every page must have a category). Categories
    would be:<br>
    <ul>
      <li>By audience: User, Developer, Beginner, Community, Vendor </li>
      <li>By lifetime: <br>
      </li>
      <ul>
        <li>Transient: limited lifespan<br>
        </li>
        <li>Archived: saved for history<br>
        </li>
      </ul>
      <li>By project: Xen, XCP, PVOPS, XenARM, OCaml<br>
      </li>
      <li>By document type: <br>
      </li>
      <ul>
        <li>FAQ, HowTo, Tutorial, Overview</li>
        <li>Design</li>
        <li>Dev Process<br>
        </li>
        <li>Compatibility<br>
        </li>
        <li>Project: page related to a Xen project=A0</li>
        <li>Glossary : there is a specific way to do this in MediaWiki<br>
        </li>
        <li>Index : may not be needed if we say Index=3DCategory<br>
        </li>
      </ul>
    </ul>
    There may be a few more. Will need to work on these a little more.
    It may also mean that the MediWiki instance is set up that pages
    must have a category and that only a subset of users can create new
    ones. Otherwise we get into the same mess again.<br><font color=3D"#888=
888">
    <br>
    Lars</font><div><div></div><div class=3D"h5"><br>
    <br>
    On 27/10/2011 21:23, Joseph Glanville wrote:
    <blockquote type=3D"cite">Great work on categorizing/marking all the pa=
ges
      everyone!<br>
      <br>
      The path is clear now to write some really good documentation. :)<br>
      <br>
      I have started work on a Beginners Guide which is effectively a
      step by step guide to a functional install on Debian Sqeeze.<br>
      Currently this is the most frictionless and least &quot;magic&quot; w=
ay to
      get Xen up and running and forms a good basis to experiment with
      more advanced Xen features.<br>
      The aim of the guide is to introduce all key concepts, get people
      playing with Xen in a environment that is relatively fully
      featured but not too daunting to setup. It covers everything from
      basic virtualisation, storage and networking through to starting,
      stopping guests and getting Windows running ontop of Xen.<br>
      <br>
      You can see my progress up on this Google doc: <a href=3D"https://doc=
s.google.com/document/d/1q9odKP8Id26J8kHCAFt8aD5krXdUiZnZGw1Q-LGWCJg/edit" =
target=3D"_blank">https://docs.google.com/document/d/1q9odKP8Id26J8kHCAFt8a=
D5krXdUiZnZGw1Q-LGWCJg/edit</a><br>

      Will format for wiki and publish when it is done.<br>
      <br>
      If anyone would like to contribute feel free to contact me,
      comments/suggestions are more than welcome.<br>
      <br>
      Moving on from this I will write a more advanced Debian specific
      guide that delves into setting up complex networking, guest
      isolation techniques, storage virtualisation and all those
      goodies.<br>
      <br>
      Very excited to see all the awesome things coming out of this and
      definitely recommend we have a monthly thing where we get together
      and decide on how we can improve documentation.<br>
      Once a direction has been established it&#39;s easy to sit down and
      get stuff done.<br>
      <br>
      Joseph.<br>
      <br>
      <br>
      <br>
      <div class=3D"gmail_quote">On 27 October 2011 21:30, Lars Kurth <span=
 dir=3D"ltr">&lt;<a href=3D"mailto:lars.kurth@xen.org" target=3D"_blank">la=
rs.kurth@xen.org</a>&gt;</span>
        wrote:<br>
        <blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0pt 0.8e=
x; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
          <div>
            <div>On 26/10/2011 20:55, Konrad Rzeszutek Wilk wrote:<br>
              <blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt 0p=
t 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
                On Mon, Oct 17, 2011 at 04:37:15PM +0100, Lars Kurth
                wrote:<br>
                <blockquote class=3D"gmail_quote" style=3D"margin: 0pt 0pt =
0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
                  Cool.<br>
                  <br>
                  I am wondering what people think about archiving vs
                  deleting wiki<br>
                  pages. Obviously some pages can be deleted (stuff
                  about events, job<br>
                  listings, old TODO lists, etc.).<br>
                  <br>
                  Others may still be valuable to legacy users. See<br>
                </blockquote>
                .. snip..<br>
                Hey Lars,<br>
                <br>
                I was trying to add to <a href=3D"https://docs.google.com/s=
preadsheet/ccc?key=3D0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&amp;hl=3D=
en_US#gid=3D0" target=3D"_blank">https://docs.google.com/spreadsheet/ccc?ke=
y=3D0AiRyVp8djqV3dEJRdVZaQzZmLVNKTERwMDNGaTlKdkE&amp;hl=3Den_US#gid=3D0</a>=
<br>

                <br>
                a couple of things but it seems I am not authorized,
                anyhow these are the changes:<br>
                <br>
                NetBSDdomU merge with How_to_build_NetBSD_DomU_on_Linux<br>
                2.6.18-to-2.6.31-and-higher is OK.<br>
                InstallationNotes - remove<br>
                KnownGoodImages - remove<br>
                InstallGuestImage - remove<br>
                RealModeArea - archive, or move it to be
                PPC/RealModeArea<br>
                USBCompatibilityList - remove<br>
                XenPCIpassthrough - keep, I just updated it<br>
                XenPVOPSDRM - keep, just updated it<br>
                XenSerialConsole - keep, I just updated it<br>
                XenPVSCSI - keep<br>
                XenUSBPassthrough - keep, just updated it<br>
                XenParavirtOps - keep, just updated it.<br>
                XenOnUbuntu64 - remove<br>
              </blockquote>
            </div>
          </div>
          Odd: you should have write access like anybody else. Anyway, I
          applied your changes.<br>
        </blockquote>
      </div>
      <br>
      <br clear=3D"all">
      <br>
      -- <br>
      <span style=3D"font-family: arial,sans-serif; font-size: 13px; border=
-collapse: collapse;"><b><i><font color=3D"#0000ff">
              <div><font color=3D"#000000"><span style=3D"font-style: norma=
l; font-weight: normal;">Founder | Director |
                    VP Research<br>
                  </span></font></div>
              Orion Virtualisation Solutions</font></i></b>=A0|=A0<font col=
or=3D"#0000ff"><a href=3D"http://www.orionvm.com.au/" style=3D"color: rgb(4=
2, 93, 176);" target=3D"_blank">www.orionvm.com.au</a></font>=A0|
        Phone: 1300 56 99 52 | Mobile: 0428 754 846</span><br>
    </blockquote>
    <br>
  </div></div></div>

</blockquote></div><br><br clear=3D"all"><br>-- <br><span style=3D"font-fam=
ily: arial,sans-serif; font-size: 13px; border-collapse: collapse;"><b><i><=
font color=3D"#0000ff"><div><font color=3D"#000000"><span style=3D"font-sty=
le: normal; font-weight: normal;">Founder | Director | VP Research<br>
</span></font></div>Orion Virtualisation Solutions</font></i></b>=A0|=A0<fo=
nt color=3D"#0000ff"><a href=3D"http://www.orionvm.com.au/" style=3D"color:=
 rgb(42, 93, 176);" target=3D"_blank">www.orionvm.com.au</a></font>=A0| Pho=
ne: 1300 56 99 52 | Mobile: 0428 754 846</span><br>


--90e6ba1efd3a1f4d3704b05c7677--


--===============1535561411==
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

--===============1535561411==--


From xen-devel-bounces@lists.xensource.com Fri Oct 28 07:21:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 07:21:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJnJS-0007W0-Vu; Fri, 28 Oct 2011 07:21:39 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJnIh-0007JG-Bt
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 07:20:51 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1319811647!481960!1
X-Originating-IP: [216.32.181.183]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12693 invoked from network); 28 Oct 2011 14:20:48 -0000
Received: from ch1ehsobe003.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.183)
	by server-5.tower-21.messagelabs.com with AES128-SHA encrypted SMTP;
	28 Oct 2011 14:20:48 -0000
Received: from mail145-ch1-R.bigfish.com (10.43.68.251) by
	CH1EHSOBE003.bigfish.com (10.43.70.53) with Microsoft SMTP Server id
	14.1.225.22; Fri, 28 Oct 2011 14:20:17 +0000
Received: from mail145-ch1 (localhost.localdomain [127.0.0.1])	by
	mail145-ch1-R.bigfish.com (Postfix) with ESMTP id F35DD12F845E;
	Fri, 28 Oct 2011 14:20:21 +0000 (UTC)
X-SpamScore: -11
X-BigFish: VPS-11(zzbb2dK1432N98dKzz1202hzz8275dhz32i668h839h)
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 mail145-ch1 (localhost.localdomain [127.0.0.1]) by mail145-ch1
	(MessageSwitch) id 1319811621834542_1424;
	Fri, 28 Oct 2011 14:20:21 +0000 (UTC)
Received: from CH1EHSMHS018.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.244])	by mail145-ch1.bigfish.com (Postfix) with ESMTP id
	C4A22BB8050;	Fri, 28 Oct 2011 14:20:21 +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; Fri, 28 Oct 2011 14:20:14 +0000
X-WSS-ID: 0LTS55W-01-7P0-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 20EEE1028281;	Fri, 28 Oct 2011 09:20:20 -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;
	Fri, 28 Oct 2011 09:20:39 -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;
	Fri, 28 Oct 2011 09:20:22 -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; Fri, 28 Oct 2011
	10:20:21 -0400
Message-ID: <4EAABA23.1000500@amd.com>
Date: Fri, 28 Oct 2011 16:20:19 +0200
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: Keir Fraser <keir@xen.org>
Subject: Re: [Xen-devel] [PATCH] xen: provide pse36 cpuid bit
References: <CACF3788.3340E%keir@xen.org>
In-Reply-To: <CACF3788.3340E%keir@xen.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>,
	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 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 ?  PSE36 support for 32bit legacy mode
can be done in a seperate patch.

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 Fri Oct 28 07:43:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 07:43:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJney-0008O5-Vd; Fri, 28 Oct 2011 07:43:53 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJne8-0008Bb-Du
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 07:43:00 -0700
X-Env-Sender: Christoph.Egger@amd.com
X-Msg-Ref: server-7.tower-174.messagelabs.com!1319812975!37021963!1
X-Originating-IP: [216.32.181.181]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1277 invoked from network); 28 Oct 2011 14:42:57 -0000
Received: from ch1ehsobe001.messaging.microsoft.com (HELO
	ch1outboundpool.messaging.microsoft.com) (216.32.181.181)
	by server-7.tower-174.messagelabs.com with AES128-SHA encrypted SMTP;
	28 Oct 2011 14:42:57 -0000
Received: from mail120-ch1-R.bigfish.com (10.43.68.242) by
	CH1EHSOBE005.bigfish.com (10.43.70.55) with Microsoft SMTP Server id
	14.1.225.22; Fri, 28 Oct 2011 14:42:47 +0000
Received: from mail120-ch1 (localhost.localdomain [127.0.0.1])	by
	mail120-ch1-R.bigfish.com (Postfix) with ESMTP id CA13C12601A7;
	Fri, 28 Oct 2011 14:42:51 +0000 (UTC)
X-SpamScore: 1
X-BigFish: VPS1(zzc85dhzz1202hzz8275bhz32i668h839h34h)
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 mail120-ch1 (localhost.localdomain [127.0.0.1]) by mail120-ch1
	(MessageSwitch) id 1319812968521170_19395;
	Fri, 28 Oct 2011 14:42:48 +0000 (UTC)
Received: from CH1EHSMHS017.bigfish.com (snatpool1.int.messaging.microsoft.com
	[10.43.68.251])	by mail120-ch1.bigfish.com (Postfix) with ESMTP id
	6C92673805B;	Fri, 28 Oct 2011 14:42:48 +0000 (UTC)
Received: from ausb3twp01.amd.com (163.181.249.108) by
	CH1EHSMHS017.bigfish.com (10.43.70.17) with Microsoft SMTP Server id
	14.1.225.22; Fri, 28 Oct 2011 14:42:51 +0000
X-WSS-ID: 0LTS67A-01-9JE-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 27175102827D;	Fri, 28 Oct 2011 09:42:46 -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;
	Fri, 28 Oct 2011 09:43:06 -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;
	Fri, 28 Oct 2011 09:42:48 -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; Fri, 28 Oct 2011
	10:42:38 -0400
Message-ID: <4EAABF5C.7020708@amd.com>
Date: Fri, 28 Oct 2011 16:42:36 +0200
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>, Keir
	Fraser <keir@xen.org>
Content-Type: multipart/mixed; boundary="------------060906030205020706090609"
X-OriginatorOrg: amd.com
Cc: 
Subject: [Xen-devel] [PATCH] nestedsvm: fix lazy fpu switching causing a
	triple fault
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--------------060906030205020706090609
Content-Type: text/plain; charset="ISO-8859-15"; format=flowed
Content-Transfer-Encoding: 7bit


Fix FPU switching uncovered with Hyper-V:
Do FPU switching always on the n1 vmcb rather
doing it on the current active vmcb.
The FPU state between n1 and n2 vmcb is already
synced in the vmrun and vmexit emulation.

This fixes the situation where the n2 vmcb had the
#NM intercept bit set but the virtual vmcb did not.
That means it was believed the l1 guest can handle
an #NM intercept but was actually wrong.

The result were three #GP's with error code 0x11 in
the l1 guest.

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

--------------060906030205020706090609
Content-Type: text/plain; name="xen_nh_fpu.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="xen_nh_fpu.diff"
Content-Description: xen_nh_fpu.diff

diff -r 0d092359d86f xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c	Wed Oct 26 10:32:36 2011 +0200
+++ b/xen/arch/x86/hvm/svm/svm.c	Fri Oct 28 16:25:11 2011 +0200
@@ -349,16 +349,16 @@ static int svm_load_vmcb_ctxt(struct vcp
 
 static void svm_fpu_enter(struct vcpu *v)
 {
-    struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
+    struct vmcb_struct *n1vmcb = vcpu_nestedhvm(v).nv_n1vmcx;
 
     vcpu_restore_fpu_lazy(v);
-    vmcb_set_exception_intercepts(
-        vmcb, vmcb_get_exception_intercepts(vmcb) & ~(1U << TRAP_no_device));
+    vmcb_set_exception_intercepts(n1vmcb,
+        vmcb_get_exception_intercepts(n1vmcb) & ~(1U << TRAP_no_device));
 }
 
 static void svm_fpu_leave(struct vcpu *v)
 {
-    struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
+    struct vmcb_struct *n1vmcb = vcpu_nestedhvm(v).nv_n1vmcx;
 
     ASSERT(!v->fpu_dirtied);
     ASSERT(read_cr0() & X86_CR0_TS);
@@ -372,9 +372,9 @@ static void svm_fpu_leave(struct vcpu *v
     if ( !(v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_TS) )
     {
         vmcb_set_exception_intercepts(
-            vmcb,
-            vmcb_get_exception_intercepts(vmcb) | (1U << TRAP_no_device));
-        vmcb_set_cr0(vmcb, vmcb_get_cr0(vmcb) | X86_CR0_TS);
+            n1vmcb,
+            vmcb_get_exception_intercepts(n1vmcb) | (1U << TRAP_no_device));
+        vmcb_set_cr0(n1vmcb, vmcb_get_cr0(n1vmcb) | X86_CR0_TS);
     }
 }
 
@@ -1191,15 +1191,17 @@ static void svm_fpu_dirty_intercept(void
 {
     struct vcpu *v = current;
     struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
+    struct vmcb_struct *n1vmcb = vcpu_nestedhvm(v).nv_n1vmcx;
 
     svm_fpu_enter(v);
 
-    if ( nestedhvm_enabled(v->domain) && nestedhvm_vcpu_in_guestmode(v) ) {
-       /* Check if guest must make FPU ready for the nested guest */
+    if ( vmcb != n1vmcb ) {
+
+       /* Check if l1 guest must make FPU ready for the l2 guest */
        if ( v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_TS )
            hvm_inject_exception(TRAP_no_device, HVM_DELIVER_NO_ERROR_CODE, 0);
        else
-           vmcb_set_cr0(vmcb, vmcb_get_cr0(vmcb) & ~X86_CR0_TS);
+           vmcb_set_cr0(n1vmcb, vmcb_get_cr0(n1vmcb) & ~X86_CR0_TS);
        return;
     }
 

--------------060906030205020706090609
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

--------------060906030205020706090609--


From xen-devel-bounces@lists.xensource.com Fri Oct 28 07:54:10 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 07:54:10 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJnov-0000mf-V6; Fri, 28 Oct 2011 07:54:09 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJno9-0000aG-Vl
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 07:53:22 -0700
X-Env-Sender: tim@xen.org
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319813598!2030174!1
X-Originating-IP: [81.29.64.94]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26919 invoked from network); 28 Oct 2011 14:53:19 -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; 28 Oct 2011 14:53:19 -0000
Received: from tjd by mail.phlegethon.org with local (Exim 4.67 (FreeBSD))
	(envelope-from <tim@xen.org>)
	id 1RJno4-000P21-SI; Fri, 28 Oct 2011 14:53:16 +0000
Date: Fri, 28 Oct 2011 15:53:16 +0100
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: <20111028145316.GC91085@ocelot.phlegethon.org>
References: <CACF3788.3340E%keir@xen.org> <4EAABA23.1000500@amd.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
In-Reply-To: <4EAABA23.1000500@amd.com>
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 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.

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 08:10:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:10:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJo4x-0001Vy-Tg; Fri, 28 Oct 2011 08:10:44 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJo2D-0001EY-Jd
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:07:58 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319814469!2064236!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21254 invoked from network); 28 Oct 2011 15:07:50 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2011 15:07:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315195200"; d="scan'208";a="18632812"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11:07:48 -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, 28 Oct 2011 11:07:45 -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 p9SF7eaL026231;	Fri, 28 Oct 2011 08:07:44 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Fri, 28 Oct 2011 16:07:28 +0100
Message-ID: <1319814456-8158-3-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
References: <1319814456-8158-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/10] Introduce HostPCIDevice to access a
	pci device on the 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

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 Makefile.target      |    1 +
 hw/host-pci-device.c |  252 ++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/host-pci-device.h |   75 +++++++++++++++
 3 files changed, 328 insertions(+), 0 deletions(-)
 create mode 100644 hw/host-pci-device.c
 create mode 100644 hw/host-pci-device.h

diff --git a/Makefile.target b/Makefile.target
index 867d687..243f9f2 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -216,6 +216,7 @@ obj-$(CONFIG_NO_XEN) += xen-stub.o
 obj-i386-$(CONFIG_XEN) += xen_platform.o
 
 # Xen PCI Passthrough
+obj-i386-$(CONFIG_XEN_PCI_PASSTHROUGH) += host-pci-device.o
 
 # Inter-VM PCI shared memory
 CONFIG_IVSHMEM =
diff --git a/hw/host-pci-device.c b/hw/host-pci-device.c
new file mode 100644
index 0000000..5eafc49
--- /dev/null
+++ b/hw/host-pci-device.c
@@ -0,0 +1,252 @@
+/*
+ * Copyright (C) 2011       Citrix Ltd.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2.  See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu-common.h"
+#include "host-pci-device.h"
+
+#define PCI_MAX_EXT_CAP \
+    ((PCIE_CONFIG_SPACE_SIZE - PCI_CONFIG_SPACE_SIZE) / (PCI_CAP_SIZEOF + 4))
+
+enum error_code {
+    ERROR_SYNTAX = 1,
+};
+
+static int path_to(const HostPCIDevice *d,
+                   const char *name, char *buf, ssize_t size)
+{
+    return snprintf(buf, size, "/sys/bus/pci/devices/%04x:%02x:%02x.%x/%s",
+                    d->domain, d->bus, d->dev, d->func, name);
+}
+
+static int get_resource(HostPCIDevice *d)
+{
+    int i, rc = 0;
+    FILE *f;
+    char path[PATH_MAX];
+    unsigned long long start, end, flags, size;
+
+    path_to(d, "resource", path, sizeof (path));
+    f = fopen(path, "r");
+    if (!f) {
+        fprintf(stderr, "Error: Can't open %s: %s\n", path, strerror(errno));
+        return -errno;
+    }
+
+    for (i = 0; i < PCI_NUM_REGIONS; i++) {
+        if (fscanf(f, "%llx %llx %llx", &start, &end, &flags) != 3) {
+            fprintf(stderr, "Error: Syntax error in %s\n", path);
+            rc = ERROR_SYNTAX;
+            break;
+        }
+        if (start) {
+            size = end - start + 1;
+        } else {
+            size = 0;
+        }
+
+        if (i < PCI_ROM_SLOT) {
+            d->io_regions[i].base_addr = start;
+            d->io_regions[i].size = size;
+            d->io_regions[i].flags = flags;
+        } else {
+            d->rom.base_addr = start;
+            d->rom.size = size;
+            d->rom.flags = flags;
+        }
+    }
+
+    fclose(f);
+    return rc;
+}
+
+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;
+    }
+    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;
+}
+
+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);
+  return buf;
+}
+uint16_t host_pci_get_word(HostPCIDevice *d, int pos)
+{
+  uint16_t buf;
+  host_pci_config_read(d, pos, &buf, 2);
+  return le16_to_cpu(buf);
+}
+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);
+}
+
+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

From xen-devel-bounces@lists.xensource.com Fri Oct 28 08:12:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:12:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJo6h-0001uB-RY; Fri, 28 Oct 2011 08:12:31 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJo2C-0001EN-Kx
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:07:55 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319814464!1430925!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5255 invoked from network); 28 Oct 2011 15:07:47 -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;
	28 Oct 2011 15:07:47 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315195200"; d="scan'208";a="168599440"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11:07:44 -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, 28 Oct 2011 11:07:44 -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 p9SF7eaK026231;	Fri, 28 Oct 2011 08:07:42 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Fri, 28 Oct 2011 16:07:27 +0100
Message-ID: <1319814456-8158-2-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
References: <1319814456-8158-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/10] configure: Introduce
	--enable-xen-pci-passthrough.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>
---
 Makefile.target |    2 ++
 configure       |   25 +++++++++++++++++++++++++
 2 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/Makefile.target b/Makefile.target
index fe5f6f7..867d687 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -215,6 +215,8 @@ obj-$(CONFIG_NO_XEN) += xen-stub.o
 
 obj-i386-$(CONFIG_XEN) += xen_platform.o
 
+# Xen PCI Passthrough
+
 # Inter-VM PCI shared memory
 CONFIG_IVSHMEM =
 ifeq ($(CONFIG_KVM), y)
diff --git a/configure b/configure
index 4f87e0a..301ab44 100755
--- a/configure
+++ b/configure
@@ -127,6 +127,7 @@ vnc_png=""
 vnc_thread="no"
 xen=""
 xen_ctrl_version=""
+xen_pci_passthrough=""
 linux_aio=""
 attr=""
 xfs=""
@@ -641,6 +642,10 @@ for opt do
   ;;
   --enable-xen) xen="yes"
   ;;
+  --disable-xen-pci-passthrough) xen_pci_passthrough="no"
+  ;;
+  --enable-xen-pci-passthrough) xen_pci_passthrough="yes"
+  ;;
   --disable-brlapi) brlapi="no"
   ;;
   --enable-brlapi) brlapi="yes"
@@ -979,6 +984,8 @@ echo "                           (affects only QEMU, not qemu-img)"
 echo "  --enable-mixemu          enable mixer emulation"
 echo "  --disable-xen            disable xen backend driver support"
 echo "  --enable-xen             enable xen backend driver support"
+echo "  --disable-xen-pci-passthrough"
+echo "  --enable-xen-pci-passthrough"
 echo "  --disable-brlapi         disable BrlAPI"
 echo "  --enable-brlapi          enable BrlAPI"
 echo "  --disable-vnc-tls        disable TLS encryption for VNC server"
@@ -1342,6 +1349,21 @@ EOF
   fi
 fi
 
+if test "$xen_pci_passthrough" != "no"; then
+  if test "$xen" = "yes" && test "$linux" = "yes"; then
+    xen_pci_passthrough=yes
+  else
+    if test "$xen_pci_passthrough" = "yes"; then
+      echo "ERROR"
+      echo "ERROR: User requested feature Xen PCI Passthrough"
+      echo "ERROR: but this feature require /sys from Linux"
+      echo "ERROR"
+      exit 1;
+    fi
+    xen_pci_passthrough=no
+  fi
+fi
+
 ##########################################
 # pkg-config probe
 
@@ -3398,6 +3420,9 @@ case "$target_arch2" in
     if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then
       target_phys_bits=64
       echo "CONFIG_XEN=y" >> $config_target_mak
+      if test "$xen_pci_passthrough" = yes; then
+        echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak"
+      fi
     else
       echo "CONFIG_NO_XEN=y" >> $config_target_mak
     fi
-- 
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 Oct 28 08:14:17 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:14:17 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJo8N-0002IQ-0o; Fri, 28 Oct 2011 08:14:16 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJo2D-0001EV-77
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:07:58 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319814464!1430925!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5187 invoked from network); 28 Oct 2011 15:07:45 -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;
	28 Oct 2011 15:07:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315195200"; d="scan'208";a="168599435"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11: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; Fri, 28 Oct 2011 11: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 p9SF7eaJ026231;	Fri, 28 Oct 2011 08: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: Fri, 28 Oct 2011 16:07:26 +0100
Message-ID: <1319814456-8158-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/10] Xen PCI Passthrough
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 patch series introduces the PCI passthrough for Xen.

First, we have HostPCIDevice that help to access one PCI device of the host.

Then, there is an additions in the QEMU code, pci_check_bar_overlap.

There are also several change in pci_ids and pci_regs.

Last part, but not least, the PCI passthrough device himself. Cut in 3 parts
(or file), there is one to take care of the initialisation of a passthrough
device. The second one handle everything about the config address space, there
are specifics functions for every config register. The third one is to handle
MSI.

There is a patch series on xen-devel that add the support of setting a PCI
passthrough device through QMP from libxl (xen tool stack). It is just a call
to device_add, with the driver parametter hostaddr="0000:00:1b.0".

Change since v2;
  - in host-pci-device.c:
    - Return more usefull error code in get_ressource().
    - Use macro in host_pci_find_ext_cap_offset instead of raw number. But I
      still not sure if PCI_MAX_EXT_CAP is right, it's result is 480 like it
      was before, so it's maybe ok.
  - All use of MSI stuff in two first pci passthrough patch have been removed
    and move to the last patch.


Change v1-v2:
  - fix style issue (checkpatch.pl)
  - set the original authors, add some missing copyright headers
  - HostPCIDevice:
    - introduce HostPCIIORegions (with base_addr, size, flags)
    - save all flags from ./resource and store it in a separate field.
    - fix endianess on write
    - new host_pci_dev_put function
    - use pci.c like interface host_pci_get/set_byte/word/long (instead of
      host_pci_read/write_)
  - compile HostPCIDevice only on linux (as well as xen_pci_passthrough)
  - introduce apic-msidef.h file.
  - no more run_one_timer, if a pci device is in the middle of a power
    transition, just "return an error" in config read/write
  - use a global var mapped_machine_irq (local to xen_pci_passthrough.c)
  - add msitranslate and power-mgmt ad qdev property


Allen Kay (2):
  Introduce Xen PCI Passthrough, qdevice (1/3)
  Introduce Xen PCI Passthrough, PCI config space helpers (2/3)

Anthony PERARD (6):
  configure: Introduce --enable-xen-pci-passthrough.
  Introduce HostPCIDevice to access a pci device on the host.
  pci_ids: Add INTEL_82599_VF id.
  pci_regs: Fix value of PCI_EXP_TYPE_RC_EC.
  pci_regs: Add PCI_EXP_TYPE_PCIE_BRIDGE
  Introduce apic-msidef.h

Jiang Yunhong (1):
  Introduce Xen PCI Passthrough, MSI (3/3)

Yuji Shimada (1):
  pci.c: Add pci_check_bar_overlap

 Makefile.target                      |    7 +
 configure                            |   25 +
 hw/apic-msidef.h                     |   30 +
 hw/apic.c                            |   11 +-
 hw/host-pci-device.c                 |  252 ++++
 hw/host-pci-device.h                 |   75 +
 hw/pci.c                             |   47 +
 hw/pci.h                             |    3 +
 hw/pci_ids.h                         |    1 +
 hw/pci_regs.h                        |    3 +-
 hw/xen_pci_passthrough.c             |  861 ++++++++++++
 hw/xen_pci_passthrough.h             |  280 ++++
 hw/xen_pci_passthrough_config_init.c | 2553 ++++++++++++++++++++++++++++++++++
 hw/xen_pci_passthrough_helpers.c     |   46 +
 hw/xen_pci_passthrough_msi.c         |  667 +++++++++
 15 files changed, 4850 insertions(+), 11 deletions(-)
 create mode 100644 hw/apic-msidef.h
 create mode 100644 hw/host-pci-device.c
 create mode 100644 hw/host-pci-device.h
 create mode 100644 hw/xen_pci_passthrough.c
 create mode 100644 hw/xen_pci_passthrough.h
 create mode 100644 hw/xen_pci_passthrough_config_init.c
 create mode 100644 hw/xen_pci_passthrough_helpers.c
 create mode 100644 hw/xen_pci_passthrough_msi.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 Fri Oct 28 08:16:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:16:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJoAi-0002h2-QW; Fri, 28 Oct 2011 08:16:40 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJo2D-0001EZ-NV
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:07:59 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319814464!1430925!4
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5311 invoked from network); 28 Oct 2011 15:07:50 -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;
	28 Oct 2011 15:07:50 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315195200"; d="scan'208";a="168599459"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11:07:49 -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, 28 Oct 2011 11:07:49 -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 p9SF7eaN026231;	Fri, 28 Oct 2011 08:07:47 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Fri, 28 Oct 2011 16:07:30 +0100
Message-ID: <1319814456-8158-5-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
References: <1319814456-8158-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/10] pci_ids: Add INTEL_82599_VF id.
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>
---
 hw/pci_ids.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/hw/pci_ids.h b/hw/pci_ids.h
index 83f3893..2ea5ec2 100644
--- a/hw/pci_ids.h
+++ b/hw/pci_ids.h
@@ -117,6 +117,7 @@
 #define PCI_DEVICE_ID_INTEL_82801I_UHCI6 0x2939
 #define PCI_DEVICE_ID_INTEL_82801I_EHCI1 0x293a
 #define PCI_DEVICE_ID_INTEL_82801I_EHCI2 0x293c
+#define PCI_DEVICE_ID_INTEL_82599_VF     0x10ed
 
 #define PCI_VENDOR_ID_XEN               0x5853
 #define PCI_DEVICE_ID_XEN_PLATFORM      0x0001
-- 
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 Oct 28 08:17:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:17:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJoBz-00034P-RF; Fri, 28 Oct 2011 08:17:59 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJo2E-0001Ed-Ur
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:08:01 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1319814469!2064236!2
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 21341 invoked from network); 28 Oct 2011 15:07:51 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2011 15:07:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315195200"; d="scan'208";a="18632814"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11:07:51 -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, 28 Oct 2011 11:07:51 -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 p9SF7eaP026231;	Fri, 28 Oct 2011 08: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: Fri, 28 Oct 2011 16:07:32 +0100
Message-ID: <1319814456-8158-7-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
References: <1319814456-8158-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/10] pci_regs: Add PCI_EXP_TYPE_PCIE_BRIDGE
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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>
---
 hw/pci_regs.h |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/hw/pci_regs.h b/hw/pci_regs.h
index 6b42515..56a404b 100644
--- a/hw/pci_regs.h
+++ b/hw/pci_regs.h
@@ -392,6 +392,7 @@
 #define  PCI_EXP_TYPE_UPSTREAM	0x5	/* Upstream Port */
 #define  PCI_EXP_TYPE_DOWNSTREAM 0x6	/* Downstream Port */
 #define  PCI_EXP_TYPE_PCI_BRIDGE 0x7	/* PCI/PCI-X Bridge */
+#define  PCI_EXP_TYPE_PCIE_BRIDGE 0x8   /* PCI/PCI-X to PCIE Bridge */
 #define  PCI_EXP_TYPE_RC_END	0x9	/* Root Complex Integrated Endpoint */
 #define  PCI_EXP_TYPE_RC_EC     0xa     /* Root Complex Event Collector */
 #define PCI_EXP_FLAGS_SLOT	0x0100	/* Slot implemented */
-- 
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 Oct 28 08:19:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:19:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJoDA-0003SS-LT; Fri, 28 Oct 2011 08:19:13 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJo2E-0001Ec-IB
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:08:00 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319814464!1430925!5
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5337 invoked from network); 28 Oct 2011 15:07:51 -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;
	28 Oct 2011 15:07:51 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315195200"; d="scan'208";a="168599467"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11:07:50 -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, 28 Oct 2011 11:07:50 -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 p9SF7eaO026231;	Fri, 28 Oct 2011 08:07:48 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Fri, 28 Oct 2011 16:07:31 +0100
Message-ID: <1319814456-8158-6-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
References: <1319814456-8158-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/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

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


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 08:20:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:20:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJoEN-0003qP-Ha; Fri, 28 Oct 2011 08:20:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJo2D-0001Ea-Nd
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:08:01 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-16.tower-216.messagelabs.com!1319814464!1430925!3
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5299 invoked from network); 28 Oct 2011 15:07:49 -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;
	28 Oct 2011 15:07:49 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315195200"; d="scan'208";a="168599454"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11:07:48 -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, 28 Oct 2011 11:07:47 -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 p9SF7eaM026231;	Fri, 28 Oct 2011 08:07:45 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Fri, 28 Oct 2011 16:07:29 +0100
Message-ID: <1319814456-8158-4-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Anthony PERARD <anthony.perard@citrix.com>,
	Yuji Shimada <shimada-yxb@necst.nec.co.jp>,
	Xen Devel <xen-devel@lists.xensource.com>
Subject: [Xen-devel] [PATCH V3 03/10] pci.c: Add pci_check_bar_overlap
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Yuji Shimada <shimada-yxb@necst.nec.co.jp>

This function help Xen PCI Passthrough device to check for overlap.

Signed-off-by: Yuji Shimada <shimada-yxb@necst.nec.co.jp>
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 hw/pci.c |   47 +++++++++++++++++++++++++++++++++++++++++++++++
 hw/pci.h |    3 +++
 2 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index e8cc1b0..9f65216 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -2120,3 +2120,50 @@ MemoryRegion *pci_address_space_io(PCIDevice *dev)
 {
     return dev->bus->address_space_io;
 }
+
+int pci_check_bar_overlap(PCIDevice *dev,
+                          pcibus_t addr, pcibus_t size, uint8_t type)
+{
+    PCIBus *bus = dev->bus;
+    PCIDevice *devices = NULL;
+    PCIIORegion *r;
+    int i, j;
+    int rc = 0;
+
+    /* check Overlapped to Base Address */
+    for (i = 0; i < ARRAY_SIZE(bus->devices); i++) {
+        devices = bus->devices[i];
+        if (!devices) {
+            continue;
+        }
+
+        /* skip itself */
+        if (devices->devfn == dev->devfn) {
+            continue;
+        }
+
+        for (j = 0; j < PCI_NUM_REGIONS; j++) {
+            r = &devices->io_regions[j];
+
+            /* skip different resource type, but don't skip when
+             * prefetch and non-prefetch memory are compared.
+             */
+            if (type != r->type) {
+                if (type == PCI_BASE_ADDRESS_SPACE_IO ||
+                    r->type == PCI_BASE_ADDRESS_SPACE_IO) {
+                    continue;
+                }
+            }
+
+            if ((addr < (r->addr + r->size)) && ((addr + size) > r->addr)) {
+                printf("Overlapped to device[%02x:%02x.%x][Region:%d]"
+                       "[Address:%"PRIx64"h][Size:%"PRIx64"h]\n",
+                       pci_bus_num(bus), PCI_SLOT(devices->devfn),
+                       PCI_FUNC(devices->devfn), j, r->addr, r->size);
+                rc = 1;
+            }
+        }
+    }
+
+    return rc;
+}
diff --git a/hw/pci.h b/hw/pci.h
index 86a81c8..0e1a07d 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -487,4 +487,7 @@ static inline uint32_t pci_config_size(const PCIDevice *d)
     return pci_is_express(d) ? PCIE_CONFIG_SPACE_SIZE : PCI_CONFIG_SPACE_SIZE;
 }
 
+int pci_check_bar_overlap(PCIDevice *dev,
+                          pcibus_t addr, pcibus_t size, uint8_t type);
+
 #endif
-- 
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 Oct 28 08:21:22 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:21:22 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJoFG-0004DL-Qe; Fri, 28 Oct 2011 08:21:22 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJo2N-0001Eu-5i
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:08:04 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319814455!50124665!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30577 invoked from network); 28 Oct 2011 15: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;
	28 Oct 2011 15:07:37 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315195200"; d="scan'208";a="168599502"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11:07:56 -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, 28 Oct 2011 11:07:56 -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 p9SF7eaS026231;	Fri, 28 Oct 2011 08:07:54 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Fri, 28 Oct 2011 16:07:35 +0100
Message-ID: <1319814456-8158-10-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
References: <1319814456-8158-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/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

This patch move the msi definition from apic.c to apic-msidef.h. So it can be
used also by other .c files.

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 Fri Oct 28 08:22:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:22:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJoGk-0004bk-UE; Fri, 28 Oct 2011 08:22:55 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJo2X-0001GJ-Vs
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:08:17 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1319814488!2032187!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13283 invoked from network); 28 Oct 2011 15:08:09 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-14.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	28 Oct 2011 15:08:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315195200"; d="scan'208";a="18632823"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11: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; Fri, 28 Oct 2011 11:07:55 -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 p9SF7eaR026231;	Fri, 28 Oct 2011 08:07:53 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Fri, 28 Oct 2011 16:07:34 +0100
Message-ID: <1319814456-8158-9-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
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>
Subject: [Xen-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

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 Fri Oct 28 08:25:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:25:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJoIy-000579-4Y; Fri, 28 Oct 2011 08:25:12 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJo2s-0001H0-Ib
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:08:36 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1319814508!37018570!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25018 invoked from network); 28 Oct 2011 15:08:30 -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;
	28 Oct 2011 15:08:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315195200"; d="scan'208";a="168599535"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11: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; Fri, 28 Oct 2011 11:07:53 -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 p9SF7eaQ026231;	Fri, 28 Oct 2011 08:07:51 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Fri, 28 Oct 2011 16:07:33 +0100
Message-ID: <1319814456-8158-8-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
References: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
MIME-Version: 1.0
Content-Type: text/plain
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>
Subject: [Xen-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

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'.
+ */
+
+#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);
+    }
+}
+
+/* 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);
+
+    /* 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;
+}
-- 
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 Oct 28 08:26:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:26:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJoKh-0005gz-QW; Fri, 28 Oct 2011 08:26:59 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJo2y-0001HI-Eq
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:08:44 -0700
X-Env-Sender: anthony.perard@citrix.com
X-Msg-Ref: server-14.tower-174.messagelabs.com!1319814508!37018570!2
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25257 invoked from network); 28 Oct 2011 15:08:36 -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;
	28 Oct 2011 15:08:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,418,1315195200"; d="scan'208";a="168599558"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 11: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; Fri, 28 Oct 2011 11:07:57 -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 p9SF7eaT026231;	Fri, 28 Oct 2011 08:07:56 -0700
From: Anthony PERARD <anthony.perard@citrix.com>
To: QEMU-devel <qemu-devel@nongnu.org>,
	Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Date: Fri, 28 Oct 2011 16:07:36 +0100
Message-ID: <1319814456-8158-11-git-send-email-anthony.perard@citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319814456-8158-1-git-send-email-anthony.perard@citrix.com>
References: <1319814456-8158-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>,
	Shan Haitao <haitao.shan@intel.com>,
	Jiang Yunhong <yunhong.jiang@intel.com>
Subject: [Xen-devel] [PATCH V3 10/10] Introduce Xen PCI Passthrough,
	MSI (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

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");
+        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");
+        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 */
+    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;
+    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) {
         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 */
+
+/*
+ * setup physical msi, but didn't enable it
+ */
+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");
+        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");
+        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);
+
+    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 */
+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 */
+
+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);
+        }
+    }
+
+    /* 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);
+            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));
+            }
+        }
+        /* 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);
+
+    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);
+        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

From xen-devel-bounces@lists.xensource.com Fri Oct 28 08:36:04 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 08:36:04 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJoTU-0006Kk-42; Fri, 28 Oct 2011 08:36:04 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJoSv-00068C-Lk
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 08:35:30 -0700
X-Env-Sender: joe@perches.com
X-Msg-Ref: server-10.tower-182.messagelabs.com!1319816124!1110590!1
X-Originating-IP: [206.117.179.246]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24387 invoked from network); 28 Oct 2011 15:35:26 -0000
Received: from perches-mx.perches.com (HELO labridge.com) (206.117.179.246)
	by server-10.tower-182.messagelabs.com with DES-CBC3-SHA encrypted SMTP;
	28 Oct 2011 15:35:26 -0000
Received: from [78.188.66.56] (account joe@perches.com HELO [192.168.1.133])
	by labridge.com (CommuniGate Pro SMTP 5.0.14)
	with ESMTPA id 18329246; Fri, 28 Oct 2011 08:35:23 -0700
Message-ID: <1319770558.2529.20.camel@Joe-Laptop>
From: Joe Perches <joe@perches.com>
To: Miche Baker-Harvey <miche@google.com>
In-Reply-To: <1319751802-27013-1-git-send-email-miche@google.com>
References: <20111027173527.GA23839@phenom.dumpdata.com>
	<1319751802-27013-1-git-send-email-miche@google.com>
Content-Type: text/plain; charset="UTF-8"
Date: Fri, 28 Oct 2011 05:55:58 +0300
Mime-Version: 1.0
X-Mailer: Evolution 3.2.1- 
Content-Transfer-Encoding: 7bit
Cc: xen-devel@lists.xensource.com,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>, Anton,
	Greg Kroah-Hartman <gregkh@suse.de>, 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>
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, 2011-10-27 at 14:43 -0700, Miche Baker-Harvey wrote:
> Multiple HVC console terminals enabled.

Just a note on allocation.

> diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
[]
> @@ -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.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 09:12:49 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 09:12:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJp32-0007gv-Np; Fri, 28 Oct 2011 09:12:48 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJp24-0007UE-HM
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 09:11:49 -0700
X-Env-Sender: George.Dunlap@eu.citrix.com
X-Msg-Ref: server-6.tower-182.messagelabs.com!1319818303!1119324!1
X-Originating-IP: [66.165.176.63]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14138 invoked from network); 28 Oct 2011 16:11:45 -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;
	28 Oct 2011 16:11:45 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315195200"; d="scan'208";a="168610292"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO02.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 12:11: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; Fri, 28 Oct 2011 12:11:43 -0400
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 p9SGBdZg026445;
	Fri, 28 Oct 2011 09:11:40 -0700
Subject: RE: [Xen-devel] [PATCH] scheduler rate controller
From: George Dunlap <george.dunlap@citrix.com>
To: Dario Faggioli <raistlin@linux.it>
In-Reply-To: <1319796584.19320.31.camel@Abyss>
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>
Content-Type: text/plain; charset="UTF-8"
Date: Fri, 28 Oct 2011 17:18:34 +0100
Message-ID: <1319818714.21033.414.camel@elijah>
MIME-Version: 1.0
X-Mailer: Evolution 2.28.3 
Content-Transfer-Encoding: 7bit
Cc: "Tian, Kevin" <kevin.tian@intel.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	"Keir \(Xen.org\)" <keir@xen.org>,
	George Dunlap <George.Dunlap@eu.citrix.com>, "Dong, 
	Eddie" <eddie.dong@intel.com>, "Lv, Hui" <hui.lv@intel.com>, "Duan,
	Jiangang" <jiangang.duan@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 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.  But I
think we want to focus on the scheduler itself raising it as a result of
the .wake() callback.  Whether the .wake() happens as a result of a HW
interrupt or something else, I don't think really matters.

Dario and Hui,  neither of you have commented on my idea, which is
simply don't preempt a VM if it has run for less than some amount of
time (say, 500us or 1ms).  If a higher-priority VM is woken up, see how
long the current VM has run.  If it's less than 1ms, set a 1ms timer and
call schedule() 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 information? 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.  Under normal
circumstances it wouldn't be too unusual for a VM to have a several-ms
delay between 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 solution.  That'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".

 -George


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 09:14:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 09:14:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJp4U-00084z-Kw; Fri, 28 Oct 2011 09:14:18 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRCk-0005Pf-K0
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:45:15 -0700
X-Env-Sender: miche@google.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1319726710!1879965!1
X-Originating-IP: [216.239.44.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14168 invoked from network); 27 Oct 2011 14:45:11 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51)
	by server-12.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 14:45:11 -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 p9REj8AL031279
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 07:45:09 -0700
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1319726709; bh=dALNkkuHm9vM4cbl/ikGbrvUqSA=;
	h=MIME-Version:In-Reply-To:References:Date:Message-ID:Subject:From:
	To:Cc:Content-Type;
	b=uTuRuirF6hutSnXJY5ffzQ8seYaS45vDPfGzwFm+BWVKjq77fwchMukXH6kCIAZVG
	YSHmqkXwn7lCrx1YG075A==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=dkim-signature:mime-version:in-reply-to:references:date:
	message-id:subject:from:to:cc:content-type:x-system-of-record;
	b=DRpmjVEmc2wnPvuxGQb6r5QUCWNMhqRz8eP/bJb0K9WCyCsIeFtJ1g5WH2lCZZOhm
	zAX/5kHYqNRSFpBB4t32w==
Received: from qyk7 (qyk7.prod.google.com [10.241.83.135])
	by hpaq14.eem.corp.google.com with ESMTP id p9REibwq027202
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 07:45:07 -0700
Received: by qyk7 with SMTP id 7so4353766qyk.3
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 07:45:07 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=beta;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:x-system-of-record;
	bh=r80JJmhoeFdR7YfuuMnswGq8tfJNIhT9gmIBn9+uG94=;
	b=tNMQk+gSrDa/sv2igeEr1ZF500RBZt5zdzF1+907N5gGX/GeTkbeMBk1ODSG2rwwnB
	CICE+kY7Ktt7lyN7L8LA==
Received: by 10.229.67.218 with SMTP id s26mr7012176qci.133.1319726707401;
	Thu, 27 Oct 2011 07:45:07 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.229.67.218 with SMTP id s26mr7012163qci.133.1319726707168;
	Thu, 27 Oct 2011 07:45:07 -0700 (PDT)
Received: by 10.229.175.10 with HTTP; Thu, 27 Oct 2011 07:45:07 -0700 (PDT)
In-Reply-To: <20111027054806.GA1377@suse.de>
References: <20111027053007.GA32765@phenom.dumpdata.com>
	<20111027054806.GA1377@suse.de>
Date: Thu, 27 Oct 2011 07:45:07 -0700
Message-ID: <CAB8Rdaq2r4Uc-WZK-k=wiEW8DKdixn+9dB7E4_XDL7k8jCMwSw@mail.gmail.com>
From: Miche Baker-Harvey <miche@google.com>
To: Greg KH <gregkh@suse.de>
X-System-Of-Record: true
X-Mailman-Approved-At: Fri, 28 Oct 2011 09:13:06 -0700
Cc: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.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>
Content-Type: multipart/mixed; boundary="===============1410931239=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1410931239==
Content-Type: multipart/alternative; boundary=0016e64de50494d7d504b048d186

--0016e64de50494d7d504b048d186
Content-Type: text/plain; charset=ISO-8859-1

Bummer.  Sorry about that.

Konrad, could you give me a hand figuring out what's up with this - I'm not
running Zen here.  (If there's a test suite I could have run, mea culpa, and
please point me in the right direction.)

The "console [hvc0] enabled" message is coming from register_console() in
printk.c, and it doesn't have any loops.
It's called from hvc_console_init(), hvc_instantiate(), and hvc_alloc(),
none of which have loops.  The call in hvc_alloc() is the one I added, so
either I've inadvertently made one of the other two repeat (I'm guestting
hvc_instantiate() is the one you're using), or you're infinitely calling
hvc_alloc().  There's a calls to hvc_alloc() in hvc_xen.c::xen_hvc_init(),
and in init_port_console() in virtio_console.c, but again, no loops.
 Similarly for hvc_instantiate().

So, could I trouble you to put a breakpoint in register_console() and send
me the stack?

Thanks,
Miche

On Wed, Oct 26, 2011 at 10:48 PM, 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:
> >
> > [    2.382984] console [hvc0] enabled
> > [    2.382984] console [hvc0] enabled
> > [    2.382984] console [hvc0] enabled
> > [    2.382984] console [hvc0] enabled
> > [    2.382984] console [hvc0] enabled
> > [    2.382984] console [hvc0] enabled
> > ..
> >
> > (see attached file titled bad.log)
> >
> > If I use Linus's latest git tree and revert your patch I get the kernel
> > to bootup (see good.log file),
>
> Ick, not good, thanks for letting us know.
>
> Miche, want me to just revert this, or do you think you can fix it?
>
> thanks,
>
> greg k-h
>

--0016e64de50494d7d504b048d186
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

Bummer. =A0Sorry about that.=A0<div><br></div><div>Konrad, could you give m=
e a hand figuring out what&#39;s up with this - I&#39;m not running Zen her=
e. =A0(If there&#39;s a test suite I could have run, mea culpa, and please =
point me in the right direction.)</div>
<div><br></div><div>The &quot;console [hvc0] enabled&quot; message is comin=
g from register_console() in printk.c, and it doesn&#39;t have any loops.</=
div><div>It&#39;s called from hvc_console_init(), hvc_instantiate(), and hv=
c_alloc(), none of which have loops. =A0The call in hvc_alloc() is the one =
I added, so either I&#39;ve inadvertently made one of the other two repeat =
(I&#39;m guestting hvc_instantiate() is the one you&#39;re using), or you&#=
39;re infinitely calling hvc_alloc(). =A0There&#39;s a calls to hvc_alloc()=
 in hvc_xen.c::xen_hvc_init(), and in init_port_console() in virtio_console=
.c, but again, no loops. =A0Similarly for hvc_instantiate().</div>
<div><br></div><div>So, could I trouble you to put a breakpoint in register=
_console() and send me the stack?</div><div><br></div><div>Thanks,</div><di=
v>Miche<br><br><div class=3D"gmail_quote">On Wed, Oct 26, 2011 at 10:48 PM,=
 Greg KH <span dir=3D"ltr">&lt;<a href=3D"mailto:gregkh@suse.de">gregkh@sus=
e.de</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;"><div class=3D"im">On Thu, Oct 27, 2011 at 0=
1:30:08AM -0400, Konrad Rzeszutek Wilk wrote:<br>
</div><div><div class=3D"h5">&gt; Hey Miche.<br>
&gt;<br>
&gt; The git commit 361162459f62dc0826b82c9690a741a940f457f0:<br>
&gt;<br>
&gt; =A0 =A0 hvc_console: display printk messages on console.<br>
&gt;<br>
&gt; is causing an infinite loop when booting Linux under Xen, as so:<br>
&gt;<br>
&gt; [ =A0 =A02.382984] console [hvc0] enabled<br>
&gt; [ =A0 =A02.382984] console [hvc0] enabled<br>
&gt; [ =A0 =A02.382984] console [hvc0] enabled<br>
&gt; [ =A0 =A02.382984] console [hvc0] enabled<br>
&gt; [ =A0 =A02.382984] console [hvc0] enabled<br>
&gt; [ =A0 =A02.382984] console [hvc0] enabled<br>
&gt; ..<br>
&gt;<br>
&gt; (see attached file titled bad.log)<br>
&gt;<br>
&gt; If I use Linus&#39;s latest git tree and revert your patch I get the k=
ernel<br>
&gt; to bootup (see good.log file),<br>
<br>
</div></div>Ick, not good, thanks for letting us know.<br>
<br>
Miche, want me to just revert this, or do you think you can fix it?<br>
<br>
thanks,<br>
<br>
greg k-h<br>
</blockquote></div><br></div>

--0016e64de50494d7d504b048d186--


--===============1410931239==
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

--===============1410931239==--


From xen-devel-bounces@lists.xensource.com Fri Oct 28 09:23:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 09:23:46 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJpDZ-00009h-2T; Fri, 28 Oct 2011 09:23:43 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJRO0-0006qb-8t
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 07:57:00 -0700
X-Env-Sender: yujiageng734@gmail.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1319727405!1863218!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17689 invoked from network); 27 Oct 2011 14:56:46 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-2.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	27 Oct 2011 14:56:46 -0000
Received: by ywp17 with SMTP id 17so4303969ywp.30
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 07:56:44 -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=lSJVjCsuMtqITD0KQSUyWkeBa295MRNiyoIaJ7CRceo=;
	b=Um3V9Oy1q21MpU1ueWcyrgn3+RwwstggcohNO5fy1K14cbjPA97ptujGJihey+fnaw
	8m27bRETLDJMoZtvhekLCndBGp6GpAG72AbpNQgnlKyKwgzBMDzO0iVe7Pm4ihPPjIB/
	gVL6SC9mPE51FxsQT/1SG9zSC0Hs2g1KCQNwc=
MIME-Version: 1.0
Received: by 10.43.43.130 with SMTP id uc2mr46589305icb.35.1319727404132; Thu,
	27 Oct 2011 07:56:44 -0700 (PDT)
Received: by 10.42.164.197 with HTTP; Thu, 27 Oct 2011 07:56:43 -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: Thu, 27 Oct 2011 22:56:43 +0800
Message-ID: <CAJ0pt15daSuXGi_8T3NS53E2Xv0bYV90b94100Wi6ajt99gedQ@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=bcaec52e601f1faeb504b048fbe0
X-Mailman-Approved-At: Fri, 28 Oct 2011 09:13:12 -0700
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

--bcaec52e601f1faeb504b048fbe0
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,

	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. Another
is the vga BIOS mapping (address 0xc0000-0xc8fff of hvm guest).

	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.

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=E2=80=99t 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 =3D data;
-	pte_t pte =3D pte_mkspecial(pfn_pte(rmd->mfn++, rmd->prot));
+    if((rmd->mfn & 0xfffffff0) =3D=3D 0xc0){
+	    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;
 }

--bcaec52e601f1faeb504b048fbe0
Content-Type: video/ogg; name="out.ogv"
Content-Disposition: attachment; filename="out.ogv"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gu9vl2610

T2dnUwACAAAAAAAAAACPYcYaAAAAAP7KBsEBQGZpc2hlYWQAAwAAAAAAAAAAAAAA6AMAAAAAAAAA
AAAAAAAAAOgDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPZ2dTAAIAAAAAAAAAAPQqACUAAAAA
sckddAEqgHRoZW9yYQMCAQBQAEAABQAABAAAAAAABdwAAABkAAABAAABAAAAAPzAT2dnUwACAAAA
AAAAAAC3kbsKAAAAABCFNZIBHgF2b3JiaXMAAAAAASJWAAAAAAAAh18BAAAAAACpAU9nZ1MAAAAA
AAAAAAAAj2HGGgEAAACIr+CLAlBQZmlzYm9uZQAsAAAA9CoAJQMAAADcBQAAAAAAAGQAAAAAAAAA
AAAAAAAAAAAAAAAABgAAAENvbnRlbnQtVHlwZTogdmlkZW8vdGhlb3JhDQpmaXNib25lACwAAAC3
kbsKAwAAACJWAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAQ29udGVudC1UeXBlOiBhdWRp
by92b3JiaXMNCk9nZ1MAAAAAAAAAAAAA9CoAJQEAAABVS1N1DE3/////////////P4F0aGVvcmEj
AAAAWGlwaC5PcmcgbGliVGhlb3JhIEkgMjAwODEwMjAgMyAyIDEBAAAAFwAAAHJlY29yZE15RGVz
a3RvcD0wLjMuOC4xgnRoZW9yYb7NKPe5zWsYtalJShBznOYxjFKUpCEIMYxiEIQhCEAAAAAAAAAA
AAAR9OFkLlVJtHYS9XC0mGuVoqlAlkih0EfTmbjWZDAXSyVSkSyURiIQB4ORwNBkMRaLBWKBMJRG
IRAHg6HAyGAsFQmEgiDwaDAU+5kX1pVVVBQS0tGRkFBPDw3NzIyLS0tKCgoIyMjHh4eHhkZGRkUF
BQUFA8PDw8PDw8KCgoKCgoKCgUFBQUFBQUAhALChAYKDM9DAwOExo6PDcODRAYKDlFOA4RFh0zV1
A+EhYlOkRtZ00YIzdAUWhxXDFATldneXhlSFxfYnBkZ2MREhgvY2NjYxIVGkJjY2NjGBo4Y2NjY2
MvQmNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjEBAQFBgcICgQEBQYHCAoMB
AUGBwgKDBAFBgcICgwQEAYHCAoMEBAQBwgKDBAQEBgICgwQEBAYIAoMEBAQGCAgD4vy30A0zE75C
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
gYWGrAQA8gAAEISUYowxxpBSjDHGmHNIKaUYY8w5pRhjjjnnnGKMMcacc44xxphzzjnHGGPOOeec
Y4w555xzzjHGnHPOOeeYc84555xzzDnnnHPOOQEAQAUOAAABNopsTjASVGjISgAgHAAAQIgx5xhz
TkJKjVLOSQgdhFJabRRzEEroIJTWUuaclFJCKCXF2DLnIKUSQiotpdpBSCWlUlKKrbYOQmopldJS
a61mzkEopaSWYqwtcxBCKSml1mqtnYSSUkq1tVhrDCGUlFJrrbYaaymlpZZqrLHWWEMpqaXYYqy1
xlpibC21GmusrcaSUkut1VpjrbUWAGDy4AAAlWDjDCtJZ4WjwYWGrAQAcgMACIQYc845CCWUEEIp
pURKMeYchBBKKKWUUlKJlGLMOQehlFJKKaWUkjHmHHQQSiillFJSSSVjzDkHIZRQSimllFJK5xyE
EEoopZRSSiollc45ByGEUkoppZSSUikdhBBCKKWUUlJJJZVUOgghhFJKKaWUUlIqpYQSQikllVJK
KaWklFIKIZRQSimlpJJKSimVEkoopZRUSikllVRSKSmUUkoppZRUSkolpZRSCKWUUlIpqZRUSkop
pVBKKaWUVFJJJaWUUkmllFJKKSWllFJKKZWUSimlpFJKKimlVFpKqZRSSkmllJRaSimllFIqpaSS
UkoppZRSSimlVEpJJZWSUkoppZRSSqWUUkpJqaRUUioppZJSAQBABw4AAAFGVFqInWZceQSOKGSY
gAoNWQkAhAMAAFJKKaWUUkqJjJRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJK
KaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSimllFJKKaWUUkoppZRSSiml
lFJKKaWUUkoppZRSSimllFIaKaWUUkoppVQKSSklhBBCCCFCAkC6MhwAAAKsSVcvUl3G6GB06cou
aHR4kaNDAAoAkK6R1YQlNGQlAJAWAABYaaWVllprrbXWIgSlpdRaa6211lprJYQUUmqptdZaa621
zkkKLbXWWmuttdZa6CS11FJrrbXWWmutg5RKa6211lprrbUWSmqppdZaa6211loLIbXWWmuttdZa
a6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprKaWUUkop
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
CgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQVKs4KUgoKCgqVZwUpBQUFBUqzgpX8n0Eju//7v9
N/+n0nLu//7v9N/+n0nLu//7v9N/+n0nLu//7v9N/+n0nLu//7v9N/+n0nLu//7v9N/+n0nLu//7
v9N/+n0nLu//7v9N/+n0nLu//7v9N/+n0nLu//7v9N/+n0nLu//7v9N/+n0nLVtq/u/0379PpF94
WGE0jrs5OVps4BZyE2TBky2cjXpnBSzlIarex//bbfpv/0+gQXnlNeuL5LZyvkl8kTXyS+S2cr5L
fJU18kvktnK+S3yRNfJL5HZyvkV8jTXyO+RWcr5FfI018ivkdnK+R3yJNfJL5FZyvkd8iTXyK+R2
cr5DfIU18jvkdnK+R3yNNfI75FZyvkd8jTXyO+R2cr5HfI018jvkdnK+R3yNNfIr5FZyvkV8iTXy
K+RWcr5FfIk18ivkdnK+RXyNNfIb5FZyvkd8lTXyS+T2cr5LfJU18jvkVnK+R3yRNfJL5JZyvkd8
jTXyK+R2cr5HfJE18kvklnK+R3yJNfI75DZyvkN8nTXyS+S2cry9ehk0whyfQlZpUH3C+8ITACzR
ImnkGuJ5B0ewcDiJMjMAUefO5NS1fGioCKSWcVJQqSBAuYCOk9ybcRLgJZwlmYpCmbcgDo2nHd//
xj/Tf/2eu86XnuzXpC9G3iu8rTEFXmGapZvF0Y6qz4SS38x8Ho/WvVupzJIwyFY9RMmQ9cY18YHw
1LO/tP46m2usV772+Pf3+3Vri3clJ+Ht9KjQ9cV6t3pUO5di824tXXv6NNe+9PWhzRZev91k7v+x
KKQzLrX39Yn//NH+ita+31FPj3tvo/rHVf9vvb+St0ejrFe7Pkj+ZDpd20FesdU+SY8398U+U2T3
5a1xoWLRsT7E5I7bJ7rjq3WSyt3N2/j9cVx/caLU/3b/xfXr3R3b3NR7rEsZeq26yp/FHvb+o0f1
jrFPPv9f9b1gWW3WOsU/hPkjv7utbfWJqtevUI/1C2n9gL6MX23/2/0fr3/1pV0JFK7oRdJLpO9k
zuKUp24NKT6EhcSriVMF40euHcAwXuGLsp3gCbLiHkqAM1R4kIyBXp3whqBiBK24AjIvZwMDdno7
v/+7/Tf/2eu9IXpCzXom9HXma8SnZFrvJ15QGQI0CbGBJ0xmINHQWkV/VlQcQMrGQoYkV4hkiUOs
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
vMZ+XP9xg28GMxwUb/DVn//2uBuBmvEGjSD/ndqFy8NcrzXAR9vMkP/B/teQLwyzXADm/+j//7Xl
K8Msz+WrJDppjccwG47O7nE6wc+35iP/M95l9gE5eM69nh4PvBl4QvHolOT89yIXLdu4E3FXebMd
vGbPZs2w+RN7zXBrebNeBc14zO5s27jBcYN7uMFxg3mzPicxXjPNm3cYLjBvdxguMG82a8OzATzZ
s27jBcYN7uMFxg3mzCmGeLxnmzbuMFxg3u4wXGDebMAuCM7Zs27jBcYN7uMFxg3mzZs2bNmzbuMF
xg3u4wXGDebNmzZs0o5t3GC4nTCPXFC4pLWFZs2bNmdduHhP8txABcmUDzZs2Z9BEwq4lYdLiVU9
jqzZs2Y5AekG4n4ZEuHUhZxIYzZs2YeGcVxguMAHu4wXGDebNmzZs2bNu4wXGDe7jBcYN5s2bNmz
Zs27jBcYN7uMFxg3mzZs2bNmzbuMFxg3u4wXGDebNmzZs2bNu4wXGDe7jBcYN5s2bNmzZs27jBcY
N7uMFxg3mzZs2bNmzbuMFxg3u4wXGDebNmzZs2bNu4wXGDe7jBcYN5s2bNkbR9VxauGRc7jAAWZi
eXO/l8m/7iAVBrh5ENmXO/lvKjw0RALgMcuPWzhnS5S3Bir//27mbub/////buZu5v////9u5m7m
/////27mbub/////buZu5v////9u5m7m/////27mbub/////buZu5v////9u5m7m///DIAfMhjGD
zXF0SkV8w9xkOCzvb33b30mcRHGgYn7t77t74BBpWGgHAx3t77t75hodcuANwrMSN299299EcGPv
Atw3Gpb7e+7e+JoOmXNLx2rt77t74UBJ5DdTZs3299298qQA8NNAQsU7e+7e+QRe4TYZcuHb8h9v
fdvfToD63EzIqNfb33b30YqUpUY9vfdvfRipSlRj299299GKlKVGPb33b30YqUpUY9vfdvfRipSl
Rj299299GKlKVGPb33b30YqUpUY4Hj4E7Xq5GKlKVGLxAiIEq+cjFSlKjEqbqMAC9a4xUpSoxcra
FWqD8YqUpUY4HgMUOE99GKlKVGPb33b30YqUpUY9vfdvfRipSlRj299299GKlKVGPb33b30YqUpU
Y9vfdvfRipSlRj299299GKlKVGPb33b30YqUpUY9vfdvfRipSskY9vfdvfRjm//jHt77t76Mf//j
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
cyWLituArwlTJ7pJdPfCWKJUyxF3e1JovajL2HasuNamdFiZFiZKmT3GhYtuBZfFt+ITW2pbLLbi
sQsse29y4kXHek1ly3ElhYixD3uXVq5LFqLLL5SpnQuvYaF9liL4TQi50WrktqLEqxCe91PZlVCm
oU8rlflQmKFNULqh7o6EKiRUSXro6Ojo6Ojo6L1l8/0dHRmejo6PLF9HRiDTyvRnfro6Ojo6Pozz
ByPRnsG3o6Ojo6D88+jFaMSoEujo3dHR0dBzqiDo+vfn5l6Ojo6Ojo6OjDYLOHf+G1gejo6Ojo6O
joMRQAehjHT0dCoA6Ojo6Ojo6Ojo6MHhjEwuno6OiOjoOE5T36DiSqi3246MIdQFAQcpjY87r3VR
R0dHR0YUwz2X3uA6Ojok6Oj3XM8b3Jvm/i+l/R0dE+Wbe70dGgHR8dHRe50dHR0L+hRDRsS51KqA
GqoN1/R0dHRelGioiujoN83sN4Kgc9ejoUAwMn49HRKduTy3R0GuaHR8/6oDwZndHQYygpx/t0dH
R0dHQY2BvYvR0UH7wODlPJUJdHQsQ/R0dHQZhm5E+J890dF4uLo6DmyOvImPkM+qDOjoR0dHR0KB
hQR4aDc2dHQl6OjnAdHR0dHR0dHQizo6Ojo6Ojo6Ojo6Oi/EdHR0dHR0dHR0dHR0Jejo6Ojo6Ojo
6Ojo6OtIs6Ojo6Ojo6Ojo6H6EyI6Ojo6Ojo6Ojo6OjouJFzdHR0dHR0dHR0dHR0IT9HR0dHR0dHR
0dHR0XMi4ujo6Ojo6Ojo6Ojo6L2Hew7Ojo6Ojo6Ojo6Ojo6Lvo6Ojo6Ojo6Ojo6OhZc3R0dHR0dH
R0dHR0dELI6Ojo6Ojo6Ojo6OjoWWXxHR0dHR0dHR0dHR0dF2ms6Ojo6Ojo6Ojo6OjoJHR0dHR0dH
R0dHR0dCPBQpKF7/6OhQuKFZUMKhvo6EKhdULpejo6Ojo6Ojovc6Ojo6Ojo6Oi9zo6Ojo6Ojo6L3
Ojo6Ojo6Ojovc6Ojo6Ojo6Oi9zo6Ojo6Ojo6L3Ojo6Ojo6Ojovc6Ojo6Ojo6Oi9zo6Ojo6Ojo6Ev
QoF+jo6OjG9HQYqoQ6Ogw8SeHR0dHR0dChR6Og6g9HR0dHR0dHR0dGZ6OjoUJeJ6Ojo6MYOf6Oeg
KoD6Ojo9+jo6Ojo6Ojo6Ojo56Ojo6Ojo6Ojo6Ojo6OjO89HRyqA+jBdEigoVDJx9B09B5GV0dGN5
6Ojo6OjoUKSiX6OhUJdChv3qEIxmgyoOjf0dHyHL57o6OjE9HR0dHR0dHR0dB/qgTo6DtPDo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojoy3R0dHRkcj0dGVzioM6O
jo6FQ//nr0dBxaujowYTf6Ojo6FQN99HR8Zvo6FAgoDTZ6Ojo6JDA46OjownR0YHF4zo6Ojo6DM6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6G9GQ2/XR0dHR0dAB9ejo6Og1Dr29HRgPno6N2a2F0dCgM24/C9GWyJ39HR0dCohV
D3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0Yfc82/dlc5+9HR0bPw5OhQAdHR0dHR0d
HR0dHR0eFcz0dHR0dHR0dHR0dHR0Tnd+ZHo6Ojo6Ojo6Ojo6Ojog6q9HR0dHR0dHR0dHR0dHR+16
Ojo6Ojo6Ojo6Oip9bcP0dHR0dHR0dHR0dHQoB/bP9HR0dHR0dHR0dHR0dCgd/1QFlejo6Ojo6Ojo
6Ojo6NOV/ujo6Ojo6Ojo6Ojo6Dk2dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRmOjoBg+joxvR0dHR0dHR0GPp6Nh3fYMz0dHR0dHR0dG7y
6DPzW1jOjo6Ojo6Ojoz/R0f/n0ePR0dHR0dHR0YHo6DE6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojogejo6OjoHoD0A0s6GdFOjo6Ojo6Hfn78R8OOjo6Og6vf0yOAS+F7ZtTJbb1berLEWXx7
6JOgrLEtliW+ktkIsssssRaurYiyyywbLHssssiqLLLLBvhFllliLLLLLLF97/1J7ZE4U9v6lexA
0DgEW22osssRnefAfZKoBr1ZYssSnelMLX8JbbQgRsz/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0TAQ2TXsmIEiMrkNmVplFRwXizTqlCP9T66IQN6+cjjNutmB37E
WpeW5JuV89t7gdCMMXpuRh917s9t7bXpUyZFt71ll70JbVyLchp05DIZDTpRs16NhTaQXrJ5Xo3/
GSymuoZR4lHj42lPvDkPvNatdW75xRs5+J9xwAeaiVgorHR0TtDTVpTo2JY6N4pct0BS/EliBZwl
tRN9BS7gWI6NvRettb2gWoT23tnIadOQyGQ06f4FPq+FiMplaZXoyuVS2efGXY6JdOb9R33rCdCP
HhEvR+VGEbEfBA8MFhPKvH30eUiXUFC7DI43e0TYa9Z722/ODyGA3ofoFLP9ZhKnvWRnsvb1l7at
vettSw6LbU6xA5DTpyGQyGnSmRGUyrd//LlctlcsjRwxmnj6yYefP+0eqWeZ5NASyf5WkrMHwc3G
C+dvhw+xvl5fiWXKz9A7h2bOfbin1/xk5ym6P/m9c+5Ze9sWXqy95Ne/be2ljrLE16yGnTkMhkOj
T0dGFvX2lsk8uOEHBlkZTK75tz8bmaZOilNPGRy803OWyYeKPWWWafLZf/CHJeOzf46/T6+r2/Ze
2LL23Ze5ZZe8tvy/LL3Ie9ylqZGQDGQyGQ06UoutWmGl9Eqyy9btdll7tliLLL3FlixCZMhMmOA4
Uyb635b9n2SSb6adLKRolyGT5mmzGXnrLpmm6Gapp/7J5aabLen19ePh47/q9rAssQssvc6EQtJL
YmsvfXZBvOQyGQ0yOmTCn6OjoMJKYQE1iLLLLLLPg4Tg6OgZEWdA2IwGARZZYjHJ0PJe61Lbbe5/
pcIlymRRVuVym9mlmhqEzapt27+yYX4gehHR0dH3ksF8cg6OhN0XpN0XvdHR0JuhHQl6E3Qmvcsv
XR0dHRe70dCLbEWdCbo6OhMlTpkuQ06chkMhp03r4ve8b3/m9s8ypkWLrbLLL1ZYmRZYmyWHQmTW
WYbMnUYxydHRlbLLLOjo6Oiyyyzo6Ojossss6Ojo6LLLLOjo1UhlllljaRWGlSyyxFk3Q3nno6Oi
xFllnR0dHRZZZZ0dHR0WWWWdHR0dFlllnR0Nb0DZZZYDok0DSyy9o5l/31gdiPm9J0JkyZEIhCa9
WIjZsC29y0UWIG92xOsK96yiUr1ZRKG96yiW292y96xi8m2ITRWcfOyNFliKJXIH0lTp73TGlR+1
ySVUPXro6OjovRiJczs0rEMbhjk6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6OiXlFA7JeBqFLisftzLMWaqpJKzzZq8NHLMgz86OhiZOj4yeP2+LMFv2peW5RuX9dt6D
pRhyvbPrvRid2y9sXwnvVl7QLLE2F+PjCYXC/HwiXZNIPEzUuMxb/P1jcZ4V50U40Uk+t5bPjnJ/
2d1+VQfM4pdvPzt2nFw8zEoKIbHRGxvLNWpKOxLHR8ChPmY5R8yJaAkvcm+wpdwEvRt6L3Nzb2g2
XrCfHxhcPh/j48S1LkuKxdMx0YvFoTo9eM0AkaNWf9x+b3MP0I8pF2of+owjaj5rJ5YbD+lZf3o9
JXRraiMSiTdgRmxCDhwG36wuSwPyguiET/WavbGTnvaXYhNajD/Hxh8Ph/j498T4fOT0YnFZjNo0
yABrk/cvzN7ZLT7pR2TlJp5LLf7aaSZieDslw3zu8uC219PT9S6Mxs6B6N47dnOBkp9ZPoyuwp+j
IzXoOALNXpPe0axLbYlw/x8YfD4fn46OjII13ro2NCjFYBGJxPzP8aqfANcvQxmqTK5vZsmzOY56
JKE3TomnzWayIect57fn08ff9/UtqW1FqLb2wnQsvaQ9mH6+cPh8P8fCV+hevziX4Syzp07p06dC
dOnToTW24rE226vbF5DbtpT5Zq1sZGrRk8vNs2ZvObK6dU88A1z7Mhls1PPmsB+/vp5+nz+3tm29
olt6i9tWIXW3vYcuvD4fD/G7ottKzo6M2jN1tvbGnE4no6E/KdP0EnTo+vpCdOnRl07xyltECW29
25rmvXmi5rmua5kfqXF4dFQ4rE/INYNTUoao+PjJZfkpYHovhHR0ITdH6WWw31zx0Jk3R0ITXt/o
vc6L2/0dCOhPe2uhL0JejovWH+PjD4XDb/i9XMjXbe5bbvvVt6tt13pde4uvfBzfl+MdeuXL78tW
Jr8tXrl65ffiy2/Fy/oXLr89cgsvy/Ohcu6F65fmzANY7jN6OjF9C5evXLl/R0dHQvXr1/R0dHQv
Xr1/R0dHQvXr1/R0fDSCvXr168DSY4BqvXL169fo6ASydHR0L169ev6Ojo6F69ev6Ojo6F69ev6O
jo6F69ev6OjjjoqvXr183Q+wfirV69fbasttXr16+2221evXr7bbbV69evttttSrlyVdbbg1AMY2
/0y6qLwnt+KiTb6mooIzLP/ZmMh/hOY7ziO0yz8y54njXOHieJ2504BPE8TxPFUTG1mFQXks5PqO
M5siT2dnUwAB///////////0KgAlBwAAADme6rER//////////////////////94nifYTxPHOHka
ezf/nieJ4njuPEjn1G2oCpug+vw8VQCf2c1gNrFqDE8urOnieKpXVPp4niqAb4OlQlKAQ8c7kcMZ
p2nieJ4nieJ4nieM3+oWVAYeJ4nieJ4nieJ4nhXP6sqeJ4nieJ4nieJ45XMfmAPHOHieJ4nieJ4n
jU8NU54nieJ4nieJ4nidvPiaBxHieJ4nieJ4nieOSNBQ6KGDA4HA6+rAqAX6ObC4FUEGJ0ALAS9A
G4HAz+e0/DqOHGqB80sYZAniY05w508TxVA6gAN42zQ8jxPE8TxVBioNwJwnieJ/HaYSoRMDq81R
EoOVB00+FAKoCf8JxnTk9qgJUBKoMP421ATmchk/Hec50KAk28mqB1ASoCTv35tQEyHiYqgtO7Oq
FVQGmMdqoVVE6oU/z06c9kP/fJ0KhvPi0JwU2bPjPZU6stmckcoZtigoO9UAZ7DnJns8cm7PHgqE
VAwY+AUCCofn1nyf2ezx7nJnp8x4ZcMdD/U+3KZ7OTZ46T0y3ATEVEf3njjPfPZ7PZ5UVKgdQLqC
FQGexwnhns9ns9OcH/mf5oJs8HPZ468p5HDHJ/HDns9ns8qDFQZivX2UBCozVIOez2ez06oWN/M/
0zz57K/WeVCy8OzibKqijPZ7PZ5ULqhLGYw3jbVGh+57PZ7PKhhUXGSoB8z+Tz57Pbc0cAW/PEqp
mVRWez2ezyoXy+KxhvG2qND9z2ez2eVDSouMlQY4TMzn5ns9neWB/G+OVPTK57PZ7PH9mNnJvqBx
UAHjns9ns8faoCUCWPUDeZnVGWez2eyFZ8zzzkju6P/PZ7PTnhonYoA1QYqGs9ns9nj1VBqgJNsx
VAKeiocz2ez2ennzP43xyNOc7ns8cZ0nFToNo7j9z2ez2eVAqoBUCygOUASgSVCufz2ez2ennzP9
O1o5rZns8qLlQVNxt6FQDm89ns9nj9VDCgGN40vZUQKkLPZ7PZ6dUUqCTM/wXnz31mzoVLme2fU+
wKpbOg6DoOgITcxBndCoNOA6DoOg6AqgUyMQcWUCE6Do5zx2sD0fFTwVA2ez2ezyoKO8xjfN7yVF
J+57PZ7PKh+fAKBAz8zOqDs9ns1+ZcZ+rMHQqKlRAchyHIch5dRyHIchydXV1dRyHIchydUh9dWS
k0uDg9z3pjTyVFGTy+zZszCoC2bNmzZs2bDi6+vq6urrP7JHSqCVQzs2bNmzZs2bNmzZs2bNmzZs
2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZ
s2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzr6+rq6uvr6uvr6
urq6+vq6+vq6urr6+rr6+rq6uvr6uvr6urq6+vq6+vq6urr6+rr6+rq6uvr6uvr6urq6+vq6+vq6
urr6+rr6+rq6uvr6uvr6urq6+vq0DZHV19fUoH1BSoG1BsoE1BEoMTbUEKgl91BgoSjd2qEXF4Lr
6+rq6uvnqaqL1AaoDVAcoDFAcoDlAcoDFAcoDVAYoDFAWoClAWoClAQoClAUoCVAUoClAQoC1AUo
ClAUoCVAUoBlAQoClAWoDFAUoClASoC1AUoC1AWoC1AUoC1AWoC1AWoCVAUoCFAUoClASoCVASoC
VASoCVAUoCFASoC1AcoDVAgoDlAcoDFASoC1AYoDFAYoC1AWoCVAUoC1AYoC1AaoC1ASoC1AUoCl
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
XqihQAKstVlqspVlqBdUrqjpQgqDFUJqhFQVKslVlKslVk8tO3B4ZUiKjBQlqslVkqspVlKApUdt
55a3lVkqslVkqsnlreeWt5VZKrJVZCrI5a3nlreVWSqyVWSqyOWt55a3lVkqslVkqsjlreeWt5VZ
CrIuFVkKsjlreeWt5VY6rJVY6rI5a3nlreVWOqyVWQqxuWt55a3lVjqsZVjKsjlreeWt5VZCrHVY
yrH5a3nlreVWOqxxVYyrH5a3nlreVWOqxlWMqx+Wt55a3lVjKseEXAqxVWLy1vPLW8qsZVj3MqxV
WJy1vPLW8qsVVjKsZVj8tbzy1vKrFVYrFWOqx+Wt55a3lVjKsU28BhDH5bVtQ8t6upvPLW88tbzy
1vPLW88tbzy1vPLW88tbzy1vPLW88tbzy1vPLW88tbzy1vPLW88tbzy1qoN55NUKgANU1VBUZRq8
nwqCFSI1vPJqh0mqauAUIhq88ta1vPJq7gmqaoqAs1eeWnFk8/zkjVUECgvNU1Q/Zq88ta1vPJqh
UCBqmqEJq88ta1vPJq+SgQNU1VAgoIDVzHO5Ubqiw5+TwNVQKKD41TVUCagNNXnlrWmjt5NXGByd
VQ8Hbx/qKRRjqLhRP/PGSZ9/PyqE1Q38/Pyon1E+on1E/8/PycBg/PzkDu+fn5UT6ifUT6if+fn5
VCaoT+flUJqhP5+flRPqJ9RPqJ/5+flUJqhP5+VQmqE/n5+VE+on1E+on/n5+VQmqE/n5VCaoT+f
n5UT6ifUT6if+fn5VCaoT+flUJqhP5+flRPqJ9RPqJ/5+flUJqhP5+VQmqE/n5+VE+on1E+on/n5
+VQmqE/n5VCaoT+fn5UT6ifUT6ifVCPz8qhNUJ43DqhNUJ4FUOKhpRPqJ9RPqJ/6VGSgCVCaoTNZ
QJqhNUJmmqGj0UT6ifUT6ifVA6ox9lQmqEzINRUJqhNQEKjRUOKJ9RPqJ9RPqg1UZ4hUJqhPGKAd
UJqhPUf5/qJ9RPqJ9RP/KoA+VQmqE/n5VCaoT+fn5UT6ifUT6if+fn5VCaoT+flUJqhP5+flRPqJ
9RPqJ/5+flUJqhP5+VQmqE/n5+VE+on1E+on/n5+VQmqE/n5VCaoT+fn5UT6ifUT6if+fn5VCaoT
+flUJqhP5+flRPqJ9RPqJ/5+flUJqhP5+VQmqE/n5+VE+on1E+on/n5+VQmqE/n5VCaoT+fn5UT6
ifUT6if+fn5VCaoT+flUJqhP5+flRPqJ9ROKI7I/X2qE1QnmcyqE1QnmMnsURyiRURyiOVAh/ZFU
JqhPfmFQmqE8EqCcmokVEcojlDN857YqEzqyuDCE1eQta1vPJqhCapqhCavPLWtbzyaoQmqaoQmr
zy1rW88mqEJqmqEJq88ta1vPJqhCapqhCavPLWtbzyaoQmqaoQmrzy1rW88mqEJqmqEJq88ta1vP
JqhCapqhCavPLWtbzyaoQmqaoQmrzy1rW88mqEJqmqEJq88tbyqHVBGbG0Bwf3znONxrqCNUNnby
fBrmvu443buONxrmuqBlSxnOTXNfdxxu3ccbjXNc/1RWqHFQua5r7uON27jjca5r8zKgdUOmua+7
jjdu443Gua/PKoyVDprmvu443buONxrmuqHVQ6qU1Q2a5r7uON27jjca5rqjhUJnLya5r7uON27j
jca5rn2qFFR0qDjXNfdxxu3ccbjXNfneqHFRAa5r7uON27jjca5rqk7555Nc193HG7dxxuNc1+ee
eTXNfdxxu3ccbjXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxxuNc1+eeeTXNfdxxu3ccbjXNfn
nnk1zX3ccbt3HG41zX5555Nc193HG7dxxuNc1+eeeTXNf644z+S44yZrmvzzzya5r5bAcf+RwmJz
Rrmvzzzya5r5XCcZHIGLpOA1zX5555Nc18lxxm8rxx/mua/PPPJrmvl+OM1u443Gua/PPPJrmvu4
43buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu443buONxrmvzzzya5r7
uON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu443buONxrmvzzzya5r7uON27jjca5r8888mua
+7jjdu443Gua/PPPJrmvu443buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu443Gua/PPPJr
mvu443buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu443buJN5rmvzzzy
bRs0k4n+JNeVNk2OeeeTZNjfx4/X/5g2m0bPPO38w3vzGmONLlV7LHWKiObhQB6fp8ADIZYefnMn
RxJ6534zTecZ+fv7/f3//5DIZDI5DIZDI5HI5HI5HI5LI5DIZDI5HI5DIf//kMjkcjkMjkcj//3/
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
vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8
u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIM4wsQs+von+vztx
GG35iMXiMR2/n529v5+duIxAQ7oxGI7fz87e38/O3EYjnJHufOIxHb+fnb2/n524jEQsNM+sRiO3
8/O3t/PztxGIiDFPrEYjt/Pzt7fz87cRiD6+VQ6e+IxHb+fnb2/n524jEZg9f2MRiO38/O3t/Pzt
xGIMh82dWIxHb+fnb2/n524jERAnriMR2/n529v5+duIxB3TRGIxHb+fnb2/n524jERERiMR2/n5
29v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5
+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMQ38/Nv1+fnziMRERGIxDOfz+2tn3YjERERiMRl9n5
N9S/IcRiIiIxGI3/n5lf78/MriMRERGIxHz+fnHb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n5
29v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5
+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb
+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR
2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n7GHxEREYjETfn49n78bcRh4iIxGIj
8+AzbvldiMREbptPlrBe5S9+bkEg3th725W9tUvbw3tFe9s1Sno1mKAjm9SUfRe8QEasGdAXd352
4TTe1gk+IzHl/fv9+/v7+/n5+fn5+fn59/f39/f39/f5+fn5+fn5+fv5+ff39/n39/f7+/mQ6Chv
7TQMRhNeIphSwmMw+G9zTMvB43E4/2m04D28zHZhMNg0GDh/YyMRhvIw/DX7eeDZgKXtp/gn3Yr6
Jj/RzZh7ZdlfzYcnxuz2Tn+s9mJglOW7KnH9/2Q//0O1rAlktmTyHz9zfe3oWByeT3ZX4+A7a/Hx
k/zIoymR/0bA85LLIyGR/kdFb3dHQPigzcD5Io+D9DH9jI88NpDJsMUwMcYWHxAlPKwwzKwPhgDC
MvH2V55lXGd5GNgMdhSlZGKxvn74XF4iXC8F4Dze2nsSlYl5nyfzTXpk6P05zh2/xwnAGdheLt3n
Acm/7zv4XIfbD+WjjjZMcXzv/P79rXx8QST5DMfs37/5CYsHisFobX8/cr89HxHl5yXth0vRu3Bi
A5Moif18W7x/znzXO5bi8R4eGIwfQGbNHBnc7VvRhMZpZh9bB2Zv4/f6bnV44vXe2Ie9Wkjop/CM
USwj6rF7Z3U065w6x+PQyMZ6Ytdv+7aZZvRhMJjMdjzAwGLH9/Zq7w9AMDjtfjivHVX6/gpYvcrS
y9x0FUfPyZ/f22S9+Udn9/D6I8RStvWPjAIi9zo6OczkzmODNnV+7Jg5vLnAcBwnJ+fAWtaH9zv5
McW/e1ratC1rWtaFrWtCEKGhC0LWhi9NCELta0M024Hje3ZJL0cnFfnIZX7zV7n395XK5XK/f3e5
9/eVyuVyv393uff3lcrlcr9/d7n395XK5s48lkL3M5mjgOE4zmzeUvcy2TOTP5nK/f3e59/eVyuV
yv393uff3lcrlcr9/d7n395XK5XK/f3e59/eVyubz3x83uf32dByZcdl7f8AbvraV+AS6eAzkUJa
rkMQxFEElhahxiIjzd0ziiJm9HKBm+s2aUkCMAk/572sFDeRfWFwuGwuFwmEwmEwmEwmDweEwmEw
mEwmEwmEwmEwmEwmEwmEwuFwmEwmEwmEwmEwmFwuF6Ojo82zl0Rh/HGMxFXw5gYvE4I3DTwxhYwx
MBzqwfv6GUDD4jCGLicCZeLxPmY/h4YH1wrMCy93UPRJk9UP+HZnF9una3+2nV8/Bx5bb+HHndjS
2F8Zk6P3/yWS/g720mLKbMtkvn8n/dvQXOUym/L/P1zuL5+cp+5LK5PI7eZspl8jkv/oaiJlr7XN
XC+dHw3uZ2BM32xOsMs5mGKgwTIxeMgtmgBkmhhPLBmMaBh2N55ltNPzMrBmDhy0AjGmD6YLD47F
y4aQvGk16dgMv+U8dUvR/nac27InOc3M4C8yDvOY6/r+OL+rNzgMZ6aZJN050fXx+5D/rX08+JNm
Tzf/P/5LJTlhcZhtIa/v9lvvo+o8/SW9zokkoT+Qu4MB5NlfJHacHPwtMHGePljcR0cz585jiONr
ejEmFrZjPFkbTg+8hkZ9nh54/yvT3tiEdDfEitr4De/odLNs6dofLV7mgYPuYC75/bWZuboxGHMI
xDFMbCY+Mh/zt+eXkwpiePoYHp41/clze4MXoekvhLuL09JQo5k9PT42lTKW/YuIj0dCwc9lztOY
4Dx+CXUOHOHOcxzHXkPpjGM5yJx/050/PzSlGMZSjKMYloxjGMYxjGMYxjAMAAAGAgAiIBEY0XvQ
gtowsFLBCIkKWISiQiJQlGEsC1owlgUsGbsBg8NjPcwYSjCWPf3xmMxmM9/cUoilH398ZjMZjPf3
FKIpR9/fGYzGYz39xSiKUff3xmMMQzsPhBSiMQJhmAZJlmcaRhYkRERERxeIM8yDBxnv7jAiMIH3
98ZjMZjPf3FKIpR9/fGYzGYz39xSiKUff3xmMxmM9/cUoilH398ZjDEMfy9BSiKUcD7GoZ+PFukU
oilEiEREiFKIpRIhERIhSiKUSIRESIUoilEiEREiEREiEc50Tef70ZVQPeNVRB+CqVVBRs/DpMHx
/X8cOO3YcE3Z2M/+zs8cMcJhdnZ2dnjmf3zyuGyPhzkzT7Ow0puzsMX2yedM/JdnZ2dnl2dG/cdP
QNTMxnZ0HR6ZPSYh0fGDMrs7PLy7OxUDUCoCezK4bNUB2dnZ2dnZ2dmezfYoD+zs7Ozs7OzsScBk
vjFdnZ2dnZ2dnZmsNk0/Zkuzs7Ozs7OzIRPiuzs7Ozs7OzsDjzl7Pbs7Ozs7Ozs7MrXYYXZ2dn52
HN78cdmG/fMl3lJ08b+zsmwR053PYXKGc3MnHEpGXJguzsPZQAYXiU8Ozs7Oz034gezsNgOVOw5P
32r2cHgZHZhTwPg8PPx7OzafH92GDh8J+h/NfZuzdOzsJzMUBGw1DFOLK5x1AKamN/9KgI8zKO/s
+8CZ/Z0Kgr6dnRpL0zvt2b2HDL/rHj2B/fHZlPns7PnX2HPk85i5c779mzKD2dhws7OzMGZurt4j
9q3X2f2S7K+RkaW57Jaew5VAF2dnYWVw+H986YPl2dnZ2dhwfYfh+zo7Ox8B8nBgJTHznZ2dnYZG
s68Xi/fC5Ts7Ozs7IEPw/PZ2b/Xs8ippBGUD2dnZ2eP6cGENw3sSYXZ2dnZmm7jO2fHZ2dnZ+cG1
pbok9VQDz2dnZ2eOHPDCG4b2JMLs7OzszDd03zs7Dw7Ox9Va/HQfE3j2dnZ2eWVZ4eRgZOfs7Ozs
NI7TDrKHsMHs7Oz7fsDUVAF7s8+zs7OwDEdB8/ue7Ozs7MNlDkadhoZvy7Ozs7Ozs2fGSw/Rvjs7
Mr5fWBaqAvY3Ozs7OymCy0+ffKY3s7Ozs7OymxDNvxz6dnZow9Jyl+Mx2dnZ2M2mBxg8JwZnZ2dn
Z2fxnB+Kx2dn75dmFMIEV7Dg7Ozs7OzsxnRM0wcF2dnZ2djcD58/fZ2dnY/YYgdleDnk7Ozs7JTJ
OX8/TBPPC9nZ2dnv2S51QCauw6+zs5wHv8I598jg+zs7Ow4Ozs7Ozs7Ozsk0//YULciTZPAxvXJd
nZ2YY9uzs7Ozs7OzsxOAxp0Yvy7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O
zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O
zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzdXo/uz6Oab5/lAVv6ML
gTCN9UB5L14klTJreyzstssSF3Z2diQnT9iT2JPZ2diS6fs7E0Juy2zs7Ozs7Ozs7Ozs7Ozs7Ozs
u+zs7Ozs7Ozs7OzsKFgv2W9nZHZ2W9iR2dnZ2WJuwWpNtmlUF7sHkjMqcRh9hwYwzP/GmAb2FMU5
ujR9aAGB9ZY6Mvlp2GQbp1YnJem3edZxZIpM+YBez2E0ObODJ+nO30uBYsWfvlh9ocV6b/+26vwH
NnW8W2rrxZcA3i82dtt4T3Vt+oi5Eiyy2IvNzW3aLUdlyDakXmx7gd0dll3ZcCLgvYxLr2pJJvCT
bewBu7zeLwn7bgvKyEPdDFb2XaRPZ2dTAAH///////////QqACULAAAA078ttBH/////////////
/////////4tudDo7EW9i68ovF5hFtl7DRc1yJbFpCK4dPOW19nlvwuox/DTl8yoEjGMQd+W46P3B
+X0C5WDsDjMJow/tLl8ZxT52YjGf2Q/aeRxTzaNuzF/2UxnX42p5sEDRhst0HR6hwPhJjNp0/2b0
mVm/7Vlziy2PyWnKzGDgcN7S7st+YCk2GDjtGXmynkcfN7ATFdZqnRJ4N8sUKPoyWB9c9VPbZaUS
dGc3Ydnkm7fHGYIcX+3iHWdmUi9gIvYEXMi9gXm7vKa2y5H77LHu3vPZZZ2XPebzcCLyV7GvcvF4
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
2dnYYWW9PfP5Y71AP2dnZ2Xk2TlVCe6RnZ2XB2dh2YO83m89nZ2dl5vN5vPZ2Xns7Lzebzeezs7O
y83m83ns7EdnZebzeby/Yjs7Lzebzeezs7Oy83m83ns7EdnZebzebz2dnZ2Xm83m89nZ2dl5vN5v
PZ2dnZebzebz2diOzsvN5vN57OxP2dl5vN5vPZ2I7Oy83m83ns7Lz2dl5vN5vPZ2D2dl5vN5vPZ2
H9h8N+3l4vawJlAjclydh69nZlzQ7LkMzP5FLclydn12dn9t7LkuS9y5Lk7J+zsOFUHdlyXIjwrl
rkm7NhodnZ5dlyXJe5clydnNOzs7LkuS9y5Lk7PanZ2UUAnZirk0KhBQJnbch6dhgZfs7Mlhuy5L
kvSoFZcnYYuD/dx+cySTdnl2e/PGC7NXZ2dnZiTPM4z+zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O
zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzFdnZmsz2dmeyfl2dnZ2f3wfvZ2HD79nZpyJk9nZ
2dhlZfI9nZ+5Ts7FAQcuR7Ozs7P35l7OzoxHZ2Ykw872dnZ2HZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d
nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djOezs7OxwdGZMHf2dmD7
Oz7x40UBG7C9hw+51dlyR0Xq5Lk7Ozs7LkuS9y5Lk7Ozs7LkuS9y5Lk7Ozs7LkuS9y5Lk7Ozs7Lk
uS9y5Lk7Ozs7LkuS9y5Lk7Ozs7LkuS9y5Lk7Ozs7LkuS9y5Lk7Ozs7LkuS9y5Lk7Ozs7LkuRLeeP
CH+9HPR2dnGs7ryY3Z2dnZ2dnZ2GVrz157Ozs7Ozs7Owcx/Zfs7Ozs7Ozs7LyeLezs7Ozs7OzsvN
55b2dnZ2dnZ2djc3843s7Ozs7Ozs7DDwRy3ns7Ozs7Ozs7FAJ4nHnezs7Ozs7OzsvOjJ5rs7Ozs7
Ozs7G77zeezs7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5vN5
7Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57OxnZ2T9HZ2V7Oy83m83ns7Pzw
7Gav+Wbs7Lzebzeezsp6dm0fgHh2dl5vN5vPZ2U7OwdPZ2U7Oy83m83ns7A9nZ99nZ2dl5vN5vPZ
2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZ
ebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2d
nZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZeb
zebz2dnZ2dnZ2dl5vN5vPZ2dnZ2Llxdl5vN5vK7sb2dDOiOjsK83m83nsWdHRMzaMXx2Xm86POTK
aoSbE34MvQushtttiZd0Ij+lnwGtH9DNX9WX9r4SXuT6vvz45YZHZ2dnZ2dnZ2dnZ2dnZ2dnZ2dn
Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2StDJ0N4rxNXyZp6AZSkmzcEJR4+C2SRpdH3xs6PiTp
6OjX0Ds44mRv6Jmf4KXvzgm4pPJ0CzdzWfoBPXjQyZ/jospz5YDFbt2Qk4+8D0dHPrrlxAeiVnDA
iVPGYOV8EDvjo8aYmyb9lo0MnnzukjW+kKX2Cz7Q9dPqPLz9Dghu/BA6OlleJuB17qs8mULoKvhs
HWMSR0U2+mZwm09nZ1MAAf//////////9CoAJQwAAAClFTDlEf//////////////////////ob0A
WkzTP8zI/9N7vr9ybfno9/Wadi+rfBtJP31n+Slkl2bPGQvB4qHo/Q4boXy+f1K9Y+fvXP7S9DGy
U26h/VgJ/WMA9dm3y2M+H9r1J2dn//on9WTP88jp1xory1YMjNnLeZuZqrmybN+7V47Jpv/75ebb
X4mEE/0gr2xOsXJY80TDe6AUv3487wkErWdHSsX64kkZ4sXzydEeXp87gatOA84qDoeToZLr1pby
96p0NXJRR2dnZzIj6Hjs7Ck7KN2IGanrkeikSxWJwo6CRvB8VpLOyt4vF4ReP1spPLN0dl4vCLxe
Et47Et4vCW8XhLeOxLeLwl7OxLeLwlvHYl7OxL2diXs7EvYl7EvZ2Jey9diXs7Et46OJpJgXu5HB
JcVmPHNYrs7Mz2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2fFRAFgx0MJmzsBxJ2dnZ2dnZ2d
nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2VZ2DItfZWjdn1Pgyre2rL3UyNMc9BJUm9s3i9Wrr3Vj3u
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
QMqoFVUCh9ELyqgQOG+2xGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOs
xGs6zEazrMRrOsxGs6zEazrMRrOsxGs6QHleYQ+w5NS15ji8HCm06devQxscQxscXryB+r16GNji
GNji9ettOpa7evQxscQxscXr0Bu6xevQxscQxscXrwbGsXr0MbHEMbHF69rF4OHVL16GNjiGNji9
euaz69ehjY4hjY4vXgxmBpvXr0MbHEMbHF69pWrXr0MbHEMbHF683p3r0MbHEMbHF69evQxscQxs
cXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evdsbHdbW
Nj1C9evXtS0BjY+9Bs+vXr16+wMZC9ozK3Xr169qDGxpXmNj1C9evXkmNjuwxscXr169DGxxDGxx
evXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxx
evXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxx
evXr0MbHEMbHF69evQxscQxscXr169DGxxDGx3b1682sTF3yY2Xq9dvXmJkS7ZWC9ejMVb6WFk/u
olcLlanZzvZYMb2JeaynoTy6UclGGazZs2rNmzZs2rNq1as2bNmzZs2bNmzZs2bNq1as2bNmzas2
bNq1atHJ73JvqCZS5jBSr8ovB7k5hKet95SI/dOlcxX088U+7kfynR9z0pJ4+T3JT37pTv6Qo/NH
reUdtjJ/pZvp1k6SR8nPlLPdy59I/73/iz/v9VH7qR+4qoSv3a7PRtnY/Mz17qaj/+DoI9d8fZwZ
FF8Wt8d6h6lHqXQRfyAt/1h0MOf9QLxrJDDmf2D3O6g/0+z5PKSU972Dn73mcnz/6XM+T+u8vVzg
SSZ+zmjtPN28fKaVHU3e//77upH7JmoxvR1dgntPx5GCmDdWOukZxL4Q6RQsIIONDBuuiXIxvGg2
DG5Y6XkrHJTmtgZ64Uev/T77S/dupZcgaEj3kznz/NblOOFf7z+TnXRRR1CaefLCn0046mpWeCiN
o5zo4setWTWOCU54b6f5/XN/u7u7u7u7u7u7u8y7/3rZG9vXEmtsa2tJJJJra2trSSSSa2tra0kk
kmtra2tJJK43Nuoahcu3bje3t7fdS7Sa2tra0kkkmtra2tJJJJra2trSSSSa2tra0krjQ0tTW1XL
tyWl8PKf1vJpBAXS5UTKsa9olGw66r3VrWP104tj/2lpaWhpaGhoaGhoaGhoaGhoaGhoaGhoaGho
aGhoaGhoaWhoaGhoaGhoaGlpaPbKj2X2djZvYMUhomw8HuyeE5QnykXaVeTu4j9zJBPu7H83KPuc
7Oxn2ypKe/f2Us3BR+Rd1vK71CDn+kdpuRk6SRz9nykfu9d+n3+//4s/7/VR+8mdKKqE2i7XZ4+t
3lDHUxH/8XRsIJccHwZGw5re+P6oensdO6Fh8IC36BnQw/f6gXjWiGH6f/+7qRSv9/ud9n7lNN0t
7/s6U5OfP/3K7Of1/l6iECuXDpH6/2nm9f7zcTjsd7vOUkryZ0hmo5/zlCdhb/xZkobpC0ghY3Rn
c2EULKNlBHw0TdIIEuRuvG/1jrrkbrxWeCjysXdUUxH/3Ekk/37yeT+IdQl20XO+85Pu04qPpZy/
fagpnrr0K/ddLyuYXiemA/fdgyM2bJrUpznhU5P+iD5iqqnXS9yBoLzbtI6BoOgaAiiijoGgaBoC
KKKOgaBoGgIooo6BoGgaAiijZ0TQtG0a1bt2dF0TRdEt2EEdA0DQNARRRR0DQNA0BFFFHQNA0DQE
UUUdA0DQNARRtsjKzM7Nat2qZSCqEPTvXqoNa8GBdMGKGGQYQydN1DRtJDDZGDSwz2HRtFZGSJZG
QM/Q2LQmRkZGQO7UNEY9EZkeiAcQfrIyB05ZGRHS9EIMDSyMjIyBpMmjWegzlUB4eUhlsLIqgiDM
fWTBm+VUJtOWRkIWGRkbG4Pq8yM2iW2JhZGRkZGRkZGTSMMqLIyMjIyMjIyMejYZbDIyMjIyMjIy
aDoPrTI7IyMjIyMjJo7H0iyMjIyMjIyMjFo9tktsjIyMjIyMjJoiCqBsNt3c769GrU+u+NrmqkOu
50R360bSW5rS1zWmi3prK0Bu6NpWksjIkQDG0bW1UA7IyMjIqgQVQHBn6syMgdjEfXwwWDQVVBKq
gn4c4eBmkMfWQ7LqRjB6h1mNqGtdXf6zrZjNoeRjBw3InUw4mW2HBqeqaG52oOnVNYDyDj1hhYLn
erd+sscagQDTDjDphw5iAYzLprbrbcHH0HIHGHGHJq4ceuB5qoELgYAYoa22hqgbGnBxhx6KHIHH
toaoxaJY//VCAZ2thxpNYcZtNu4fQQ7SAcfw+w4w4w/w41VAodl5usMGo64HGHGHGHHtoagwaMwH
20A4m0OIOPSjWL2NJbXDjDjDjDjDwDwi4x6KHKHGHGHGHGHHtoagQ0Zg/toBx65qgcacSx/SDjDj
DjDjD41zSfELGshyhxhxhxhxpqoAlVAsaNa20NtAOMOPUNf1DSfahgOMOMOMOMPhqIeIWNZDlDjD
jDjDjuKoAlVAveNG20A5A4w4w4m7NpBp0dgDjDjDjDjbbGk31UBoc+uBxhxhxhxhxh0YDK9o22hA
cYcYcesf20NGIaP/WA4w4w49tC1hm8HgHCHGHGHGHGHAH4ePH18PwOMOMOMOPbQ20NGtWP/bg4g4
w40dMSIaK0a80Bxhxhxhxh1B0KoEk9KvB7N4cYcYcYce2htoaMwH1/UA4w46T6t6S3phxhxhxhxh
yh8JEGIPsNEOMOMOMOMOPbQQu6Mwf20A49UDgDpD6gz+TDsDpDpDpDpTTYtPYtNsph0h0h0h0ppG
DA0NgTTDpDpbg4sZ8GfPSqCoOMOMOMOMO7W0qIMupByhxhxhxhxhrbaAYAYrBo22hqgcYcev6qyn
utxBjDmDmDmDmDDDmDmDmDmDmDmDmDm4smtXE/evI+4NQeOl4ZWVlxqzKysrKysrKy51vCethzMr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrL74dyqgPiGaGvpQZeiBrBhaHpoZCqAxVAqG4GHpHu9U1PVNT
1PUtU1TU9T1XU9U1XUtU1PVdS1TU9T1PVNV1TVNS1PVNT1TVNU1PVNT1TU9T1TVNT1TU9U1TU9U1
PVNT1PVNT1LU9U1TU9S1PU9U1PVdS1TVNT1TU9T1TVNT1PVNT1TU9T1PU9T1LUdT1PU9G0RwzmgO
bQw/dODLINIeeraQcPT5w1QxLZANYMNrvBxB2N+phshmXCBAPVBkVQEhh6dggmhc1ouqyQnNoh23
ZvJECDqXutxmyckLOiKNmNirsqQFLrccLGodTtoLCMyEXE5ZYpCfCIhY9mplczNVW2xsrqV1TgfX
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
lv6+qyFWQqyFWQqyFWQqyFWRo+qoqshVkKshVkKshVkKshVkaGGPaaVWQqyFWQqyFWQqyFWQqyKI
KshVkKshVkKshVkKshVkMBBVkKshVkKshVkKshVkKsghZveVZCrIVZCrIVZCrIVZCrI1PpVkKshV
kKshVkKshVkKsgOYMhkalWQqyFWQqyFWQqyFWQqyEbyrIVZCrIVZCrIVZCrIVZDDdVZCrIVZCrIV
ZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZ
CrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIMqyFWQnqarIVZDWqyF
WQqyFWRdMqyLnu7WhKshVkKshVkZhVkRxz6lWQqyFWQqyGRVkKsjq8qyFWQ1qshVkKshVkQqyFWQ
kqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQ
qyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQq
yFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqy
FWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyF
WQqyFWQqyFWQqyFWQqyN/vwFWQpVZGFWQI8DIQqyN4qyCZMnGHdxqsggcz/+OsihwmMyrIVZCrIV
ZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZ
CrIVZCrIVZCrIVZCrIVZCrIVZAgN450n4885flj3+ckMzMCPvRc5NERw3w6kcEfd7gCuU1y/8i+4
301BJycRRMVDg7jd91vKip4cQYIZeeHPD8REK9x4PFPyIQQiCE/IVGCETzHT1WJnuKp69LvX+RCC
JGODvIop6r8m5TRF98Q5T7lPfyDkZ5EazhyP6qoifVtsbbFZiKl8kSBn5RxFj1TwwRrHZA2PKsje
uP5oMOiL8SGSFerlBD88J4QPJGSH476rbQCarIVZEO6rIVZEKsjDzuOHvY/yd5gXKSBwOMqsjkqy
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
RUoqUVLQNkkFQlSypZUoqUVKKllSypRUsqWVKKlFSipZUsqUVLKllSipRUoqWVLKlFSypZUoqUVK
KllSypRUsqWVKKlFSipZUsqUVLKllSipRUoqWVLKlFSypZUoqUVKKllSypRUsqWVKKlFSipZUsqU
VLKllU9nZ1MAAf//////////9CoAJRgAAADB53wbEf//////////////////////KKlFSipZUsqU
VLKllSipRUoqWVLKlFSypZUoqUVKKllSypS70CpRUoqWVLKlFKNdUVXoqiLRVC5SbeogKV0VAvos
lu0VQFTqwqWVLKlFSipRUtCsUpUdWFSihKobelLFE4106nvtSNOioG6gq3RVGOiqD9FUV6KgNqKe
ioGNFq1GpbboqgvRUE+iyynamqzRVCGi526oVSpZUsqUVKKlFSypZUoqVUomUndWlD0qqqZDSKCV
ptU2hDUO9QVRVCCrih8X/vUBUoqUVKKlFSipRUoqUUoUNmaKoL0VA9V9XVaU1xSpylKuKllSypRU
oqUVLKllSipVYqVOjQKQaChavKUKcaChGwoUokpKomSrmopmrFNFjaLh0XXos4oqp2xvv8aajqlA
rU5RDc2cKQKBKQqCTQU8g9VAgaikSk2ttkUJU5QdUNtCnm9RUqnKRVbKsUp1FV9ApaaCgUIoUMUp
UHaNTlLFIFElPlG0qynanVcquoMBQFVVHQqKk21CUDVrdVQKlFSt1elSipXSpRUoqUVKq9BU9CdB
qbVKoaCmtFsaLcKXKT0XNUTfxoo6KgSaGkqWVLKlFSipRUsqWVKKldmVKqiqKkQYUNKZSNQVbttV
zdTxAUtNDKom2rqpKSaLkUuUnUO1UZU6BA3NGizSiyhqU6bYghQUqApCpKh0XSgQUqoqiqasqh+p
6ukG6alCqVauKQKPbN9tFw1a3qlNaLiplE1WUjosAoioajKEKH0XJU97FSipRUoqUVKV4VKKlFSi
pRUppfyjRaWibcO5VBRdNUpAoXRUBlSaKgJoVbV5UsqWVKKlFSipZUsqVQrFSipRSzc0lCtdKpty
gakbG1qwoWrUG1CrShKtaatqSpSg6KAplqKWKRqMonRaFlAlJaLuU7Sq+l1Rutvm01NU/MbGrRdz
fUl8fqepFW4o8o0pVyirVlWtlTUrKlFSipRUoqUVKKlFSipRUoqUVK5vUpSNlO1DUNR6LY0XENF5
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
ToK0ClEFTaLqKSq8oIolt0WO3VK3zqKi2NlQVdQKCqTRcaBtpzKfqCqd6LeUTd7NO97KVAm5kqqp
jOUv2qufJNdS1arQqGriWEmFJAgb55cuVQUhoqhYoMovRcWi2asqkoTRZOiwN9FUQlF3ouvmi86h
lJq0XYUJotUpGqGzRYrbV1UbFMNl1SgKk1LVF9qahtdVlHDWNpSWix6I6oUm01dotKqJlCNtQtil
lKlMthTBT02xRQFCaLRNBOoqFUVBRa+TKFqvRYdVTk7VjVVt1ZlO4Bua7GlvsrVTM1VW0mgqMXVr
QrVWtGgyn7agqKo/KIqBsjUVQaLVplGaL+p6KhP0WvVui4r4Ubotmr8faCl0BSJRJTlV/UZQdQxp
lOdolNqVZ/6LBbm6lVBSBS7Zyk0t6CgUA2VaaC6sUo1DUbeFkG5Rk9m9qbKF37c39lzJFPN2NY3a
6rKUa2neoqq2bKlKA2XJr6GC3ah2lvouCjUhTO7eUyUBVsGqhovCrygig41QUJS2kUognV1Q6L1q
ir2y6jOygKvynGBQei96mnHjTdHEG9S1aG4pEpuVRGpTKYp6LJ1vWnReRTBShT9QlCoKEtFjaLiq
XardFiIHSc/87xyq2igrVDbUWi5Bou9p0XC2lK6LI0XmUHvVOiqHKkKMKRb9F6aKoAqtBUXGmpJN
LVUFCkUFT0WNaihTei78qUaLlpNyDtUNCqqyCqG2oaM+tF6LHqvaqEG5SZSN1H1WvVpRop0mwoqo
aLXVTYrOoVagKKa6KCk0zjUIq6o1QU6Uo0thSrZKnULTOqW+losmoKlKFlSaygSiSlmtBVNBVSVD
6c6aDhTs6qUqXaoZFLqNTXOlMpVs0XFouNAruCmakUVPCXK3uNkKjaJQbSlaNlAVUUA0lFFHVA1t
JRZQ6lWtdV2U4UqCgShm7Ra5QrRMocpopbRbG8UFRtZQZS1RAp8oqrpVOUfotwpXHu1AUk2VDovD
xOrVL2qqjVRTdt5Qei928pDapyligfKDa6mspZtKPaSlKsbyhSk2urChqob/6U409qdWjMo2lUfd
F1NOiw6oqhtb6KihQbQUBVShQPyJtqp0ah3WlosGptFQBU23RYJQFXaL70X5U+i6inimO1VVVR0S
kSmSgGhTRbei8m0ospdulV7SUPUmi4SntpXvdTVVotLRYZRRTZQzXQqGpkCtRY271PbRvouMpT2g
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
RRRRRRRRSpNFgzq6iooooooooUWUUUzVNTVNUyKptFlspR5QFTFHVS2qt1U5BHTqapr0WZVtF7tS
N3dFhaLD7eiqAar0WPsooUkUBotnRZVQ6LqUUUU/ui4SkFFNFw1JotGrynGgpHRaui1cKd0WaUc3
aL8pFO6LtVKOKO0XTouEooo6rG5ro71aUoUcUVVOi5ijijimeCyhymdFh6KgEKYq7RUBOi3g2VdV
hRVUFMshSNUN2iqKbgUTSnRqK6WiqGtFwlI1Zoqhlpq0oyoSjCkCkynSkdtFUVFIlI6Koq0X0UiU
pouYpDrVoqgBuKV0VQfoqhEpEpHReOiqKikSkm6l98baTfVZSPbKRVqdTllD6LzKRqMospEpGpyk
dF66Lhbp6LjqqqylCkSkSkSkaqVpTkUjuUiUjUMuVBTKNKc6UiUiUiUjouPRclXFKNxS+i59FwFI
lIlIlIlL1fSnwpGq20pHRYVqta+i0ikSkSkSkdF1aLnKEbSkikSmSmykSkSkSkaoKDqzKXSkSkaV
XNYqPui2tFQXlIlIlIlI6LqbmxtKSKRKZKbKRKRKRKRqkoOrJlIUimikSkSkN+X22qoJFIlIlIlI
lOfuUbV1VlOlKFIlIlIlIlNFPUmgpWkUqUiUiUjVFJoa6oKRKRKRvyiKu0XJouspEpEpEpEpfReT
YUq2N5S2i7SkSkSkSkaXebXuUgUiUjOouAoeqClylikSkSkSkSnynaqb1GzRdNVFIlIlIlI0ps0q
upFIlI6LUKLm0lGFO7FIlIlIlIlN6LqqkpIpUpJo0XCUiUiUiUiglSnwpFtq8pYpiyi2gbFNFLFL
FLFLbbFGlFaLd0XXoseoClilililtrqookouo1NililtykWu+aLDDVoqAQpEpEpEpHRcRScykikq
qKTKbKRKRKRKRbmrRVAFX0inykSkaubqplosbRUABQqhShShShShTRShShShShShShShSmi8Kquc
qk0XToqjSq9F0lEIGpqavKUampqampqamqkU31uKY0XC1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU
1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU
1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NWX
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
KlIVVJsKCydIpYoWowSDHs3Sialqco0o2p6nKNKNqepyjUZRdT1P3KnqdvKbVoblNN9T1PmVPU+F
A1LKdUN2i0Shcqep8yp6nypm9QprRcKmVPU5SOVPU+caqob6sqep9F36Lvqep9F36Lu0XxOqt6rK
SatF31PU+i79F31PU+i7yltFUEq1V1v0XfU9T6Lv0XfU9T6LvqJu0XdU9T6Lv0XdU9TxvRUAl7aL
Vu6SmioE9FQFIMyoW6+ZUXOqNRQ9C89oqDO8xbMzKl0WHT0WBf5lDEAKOaiiSiY1WUpVpRJROioF
qmFRlB6LKKJ0WZvSbaRRJROizShJaLGKJKKqmkUSUU3NNQaKgC0WbUtGoSiSiSiSidFh0tFQH6LU
aCiSiSiSiSiigygygSjdFmcqQo8oT2dnUwAB///////////0KgAlHAAAAJX7H8ER////////////
//////////+SiiiSidlG4pip9FQVlElElElE6LLqUokokokokokokokokokokokokokokokoooko
koookokokokokokokogokokokokokokogokokogomsuUSUSUSUSUSUSUSUQUSUSUSUSUQUSUSUQU
SUQUSUThRJRJRJRO/ChdFgZmZmZmZmZmZmZmZmZmZmZmZmZIoXNFQQlClC6Lp0X4UKJFEFC5os4o
UoWovKFKFKXwoUoXRUDNSlC0X+AoXRVDEyhShcqEoUoXRUGdWFClC5hQpQuioK6sKFKFqxuKF71s
qhHsULT0X8UKUK2lMFC1CULouLFNmvRVDOioGqj0WposvRaGi056LO0X/oqijM0XYU5mi09Fp6LT
0WnmioF9FUoZmi9dF1ZotPRaei09Fp5ouzRdmZouzRdmaLT0WnotPRaeaLs0XZmaLs0XZmi09Fp6
LT0Wnmi7NF2Zmi7NF2ZotPRaei09Fp5ouzRdmZouzRdmaLT0WnotPRaeaLs0XZmaLs0XZmi09Fp6
LT0Wnmi7NF2Zmi7NF2ZotPRaei09FpoM0XZouwoQoHRdmi7KlKAKD0WnotPRaei096io6Ls0XY2q
6Ls0XYUKULtotPRaei09FplA1PUei7NF2FFVJouzRdhQ9RlBaLT0WnotPRaZQJQhQOi7NF2FCNWi
7NF2NeiwKg0WnotPRaei0yh80XZouzM0XZouzNFp6LT0WnotPNF2aLszNF2aLszRaei09Fp6LTzR
dmi7MzRdmi7M0WnotPRaei080XZouzM0XZouzNFp6LT0WnotPNF2aLszNF2aLszRaei09Fp6LTzR
dmi7MzRdmi7M0WnotPRaei080XZouzM0XZouzNFp6LT0WnotPNF2aLszNF2aLszRaei09Fp6LN20
XZouzM0XZouxo0Wbos3RZuizaG3dF2aLsnouzRdiuaLN0Wbos3RYnM0XYUrGpcwoUoXMKFKFzChS
hcwoUoXMKFKFzChShcwoUoXMKFKFzChShcwoUoXMKFKFzChShcwoUoXMKFKFzChShcwoUoXMKFKF
zChShcwoXRclR0mjRZFqFHNNKhUlQaLkpUmlpaWmlS6UMUTSpNLS0tNKlVjUUfUNKk0tLS00qWaL
0KFpUmlpaWmlS0X4ULSpNLS0tNKkULUOi0yi6VJpaWlppUtFhVKUdSpNLS0tNKlou/corRZFKk0t
LS00qRSRQ9Kk0tLS00qWix1aVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJ
paWlppUqVJpaWlppUqVLGlpvrS09pUqVJsoNNVT2QfSpUqVKi0lI1S1ZSpUqXWlpm3tLTTpUqVIp
hpaX2lppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWl
ppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJ
paWlppUqVJpaWlqVpKqxaWmujamlVVVVpaAXaKNJWPo63JFs+sas5znOc5znOc5znOc5znOc5znO
c5znOc5znOc5zr/3FOyUQKoN99tn8/fedLEE995zVvPld78VnS6ByKvMWekEkl+x7ljNTnbXhPn3
b/J9y0EkCDbqqgjLZByc1UCBBLq3ZP7bcnOYyMsTbbK5BUfzk5vTYeS33zguLDmIOZrdg92OXcM3
nOV/kFvHj1Hp7SwKbloqbPI+S7L4y7J+fM80w7iB/eVrs+yvz69y5oHuOoJ87mePzIXHJYrkthG9
hBWcxc4sObXdy2lK7u5SlK7u5SlK7u5SlK75yXOXcpSld3cpSld3cpSld3cpSld3fOc5y+Qrakvq
Z6xb9ttttttttttttttttttttttttttttttttttttttttttttu9UnsogpTQKq2psg7+++9LPnurO
dKd9+V3vylOVPoHHqXOx+9gkuS47HuWM1OTuJGzln3aDk+4gkgQbTnSUEZKIOT3VQILQbd+e37Kc
nPcZ+2JlNlcEKV5zm+702Hm26uSHIsOdEpZrdg92OXcMV332v8gtrRgoSe3Ulgoblo0NnhLbvZZ8
pykgnw76g+au1skdqXoN5vS49c0D8kCDeU7vVHdkbWzbFc2UsWoIUt53ybzD2kjzvd1Zz73vd999
+973ffffve9333372c597v2c+9333373vd999+973ffffve9333373vZznOfZ9qJBUdT9qGoygX0
L7U7Noq1UoMo/RYxQtQ7VFMoaoShChIKFCFCVHUVR1EUIUIUIUJTlUJQBQhQpQxRJQJQfShChKo8
oQoQoSg2lAlFTKEKEKEKEaihChCgiif0WSUnQ3KIKE0WhuUA17YUAoChChJbFCFCbNBRUihChChC
jtFhlBlCFCFCFCFCFCFCFCFBlC6LU0WIUIUIUIUIUIUIUIUIUIUIUAUcUIUIUIUIUIUIUIUIUIUI
UIUGUYUIUAUIUIUIUIUIUIUIUGUKUSUMUIUIUIUIUIUIUIUIUKUIUZosQoQoQoQoQoQoQoQoQoQo
QoooYocososososoGgUWUXRmqUiUggeBRZRbhQuiwdvV22KWac20W1osAoDRapQhQhRhRFSlNK0S
hChChChGprqKkUIUJVBQuixJtPKGioBtFQDON+i2Si5lAb1U04UWUXVdUFFlFq01Ot9JsKLKL3qo
osottQlI0lG0ocottpaLLKJQ+UhosCigqrEEiilKPwQbx4UC1ZMoHbr1UIGvGyWFClB5hQdQ42VV
oqgGkUoUCU+apQJQWY1lB4aCqqs6wMVt5TSDKuqjKtKRFGNCeNksxBlX1RVNVFJ1cq2ZmYatUVa2
eeczCk6Wc2qLanmZlU1TVpSBTui526rszMNWqqtbIniC8uKtOWZmVXBoq+rquqtvzMyFVVJ2raZO
Zz+OlK5RvMzKrnvV9XVdVbfmZjlVVICkatNuzM5GNPNilG7MzNpyqKlovlvbMzMbm+r9F6VVVpoM
zEDEdWoCkWJBmYdWqVAUlVP5mY2ttKqykKobatzMwmraedc5mZVBSd0Gv6XMzMqhv0X3VBTVUVWr
mZhNWtn5zMu6atQyvMzG+rKrq4pSjV1XZmYeylWtjEeXk9Fj9KCaI4ULOc55lBqaJ1Lyc5zyn7VU
VHMnPmboRkNylMzMqlspVdV1W1S35mYU+ZShQNXVaaDMwbeUqU3VlPve9au973ve9RNSBRpsNNCp
QUoU9Sq6q6rquril6rquq6rquq6rqspAparikimCm6rquq6rquq6rquq6rquq6rquq6rquq6rquq
6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6
rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6r
quq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rqtx6oanYKoKSp1XhSja3tjeU5ou8pQpWrroK
KKUFFFKFChQoKKKKKKUKCilCgoooopQUUUUoKKKKKKKKKKUKClBSgoooopQoKKUFKClBRRRRRRRS
gooooooooooopQoKNqvCiut5S+xS+i6FcqHaokFUzQVS2deqqr+W3XdOrG5Ag3pXVGi4CltFwoLi
1iqJFAHxob6qoNdOk0nWaKrbKjoN7e0UK9BEy6MgdbRqxAaKDX0dXOtooq6xrfeixihba5NLVzRa
NRlA1NUpQxRFQRpeURVLVv9+gbWppbsFR77KAII2gqlooVWq1NVVtlHmcO6NObTc0CnHOoNs32UV
qkomU2poVphAUPIpOoGtuqgocIm2Vop9/tOi0bt5Q1QdJbygKDe2xqZvOoKpqpRRUmFQN1UFD1M3
k1FTb6gfwnuiStojAQIKdVtVKqucKRnKjVs1ahKU0XFVdXVEULUVUN++iqA9Fwt7C2VJUHnZ9buS
ndOnd3FnqppKCb5om0oKZ5IUpnySu1C2hr2s6oamu50KXMwceotdHYUqBtAUiUFPZAwqWbV5Uqvy
2SFfjS0mUBQuWhsfJHKh8tr/RR62jpIFCl9FjlD1RRKKy6oVUFQNtQVPQqcoWBQBR03igrcpfSKW
KQQUmzG3jitUUm6v296+U1aW7fVZSTaipNgtBykG/elbh+TyqaTfV5t1L6SxrVm+mCBWA2BNKrm9
tJFUoLJQKXMkpGqG+qtBtpb6JhoirnUNR6LAqBsKZaCjqIqOo6jqMowo8oEoqopVHUdR1HUdR1HU
dR1HUdRqVGUGUGUCKU3sDmhsptl6M9k8ndXq9OudGqHNe8fCpO9OzqhtQGrPm1k7XNv0HKXaXe2q
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
V6BU0qaVNKm6FV1WTVdV6BU0qaVNKm6FV1WTVdV6BU0qaVNKm6FV1WTVdV6BU0qaVNKm6FV1WTVd
V6BU0qaVNKmtJNV1W00arqug0tZU0qaVNKm5Raarqu7quq6FRUippU0qaVNKKUUquq2u6rqtSo6g
KmlTSppU0oppo1XVbQ1VXVewqIqaVNKmlTT6dV1WTVdV6BU0qaVNKm6FV1WTVdV6BU0qaVNKm6FV
1WTVdV6BU0qaVNKm6FV1WTVdV6BU0qaVNKm6FV1WTVdV6BU0qaVNKm6FV1WTVdV6BU0qaVNKm6FV
1WTVdV6BU0qaVNKm6FV1WTVdV6BU0qbXKmvpUtV1WTVdVpZFTVyppU3bkKrqt5LVdVwdLFTSpqBK
5dV0+E84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE8MoApVTu3oJTUqpraDoKKT
nOaihQVTVEaik5zmoo+1FANSik5zmoodZBUiik5zmooTQqRRSc5zUUqRqKLqZRSc5zUUKCqCpTUU
nOc1FGgoipyg1FJznNRQ4IKkUUnOc1FChfJUUnOc1FNGKKTnOaimjFFJznNRTRiik5zmopoxRSc5
zUU0YopOc5qKaMUUnOc1FNGKKOTn3s59UU0Yop1WY+kqFFNGKKZk8629mopoxRTs5/k57qKaMUU7
Oc5qKaMUUnOc1FNGKKTnOaimjFFJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMUUnOc1FNGKKTnO
aimjFFJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMUUnOc1FNGKKTnOaimjFFJznNRTRiik5zmop
oxRTvZ99RTRiinZifVFCbXRVtX1Zea2OSKmlTSppU0qaVNKmlTSppU0qaVNKmlTSppU0qaVNKmlT
SppU0qaVNKmlTSppU0qaVNKmlTSppU0qaVNKmlTSppU0qaVNKmlTdLTw0H3cub7cV3ltvKUL5vnL
e/aL2/OS5d3y+RGse23Ybvovl3K1XLRsColdo/C4n+fjyyOd8H59317MzfvYOVoQ7vW3Efg+qqJq
7Vka2cpBdXeD0C/d53NR7HOK8YZ+wO1tL0eJLSMIELeEUl2FxCNy2ZHvr3+ThELwzM+Yc5LiR3P/
vs9atbuRDLDYCGyG3B8uOLcDwdrQ7wfwjCMg4Pyle0cYEO1alvvLkHlnb5vfz4yx6MyJwzBF5/AG
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
qYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCplENPeFTKBUwqYUXou0qYAVMKZKmFTNFkgqYVMKQK
mFTCk9FiFTP4VM0XwgKmFTKqKmFTOoCphUwqYVMVQFTCpiDCpnEG2xUzChyphUyygipjeVMKeoUi
nyhvKUKmdmUNOriplVFD1Y1WVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqZ
RKmFTG5uKmFTKobm1o3BUwqZUtVFTCpitLG1WmVMKmUsKmFTGq1Cg+cKmFTEHlTCpjUrOpCphUwq
YVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTPvyp
hUwqYVManiplU/SKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUw
qYVMKmFTCphUwqYVMKmVQqVM+qLlUZBlTGhvqEogqYVMIMgyDIMqYVM0XegKGKmFTCDIMgyDKmFT
MKBcKmFTCDIMgyDKmFTFAVMKmEGQZBkGVMKmVQCphUwgyDIMgyphUwKzqoqYVMIMgyDIMqYVMptx
RBUwqYQZBkGQZUwqYUSUwoCphUwgyDIMgyphUybSVMKmEGQZBkGVMKmVXMqYVMIMgyDIMqYVMKmF
TCDIMgyDKmFTCphUwgyDIMgyphUwqYVMIMgyDIMqYVMKmFTCDIMgyDKmFTCphUwgyDIMgyphUwqY
VMIMgyDIMqYVMKmFTCDIPFSDIPpUwqYVMKmfhB7cl2gVMKmFTCpn+QdVcseVMKmFTCpkiDIOXCDI
OqCphUwqYVMbSDIPyDIMqYVMKmFTCDIMgyDKmFTCphUwgyDIMgyphUwqYVMIMgyDIMqYVMKmFTCD
IMgyDKmFTCphUwgyDIMgyphUwqYVMIMgyDIMqYVMKmFTCDIMgyDKmFTCphUwgyDIMgyphUwqYVMI
MgyDIMqYVMKmFTCDIMgyDKmFTCphUwgyDIMgyphUwqYVMIMgyDIMqYVMKmFTCDIMgyDKmFTCphUw
gyDIMgyphUwqYVMIMgyDIMqYVMKmFTCDIMg0mkVMKmFTGAgyDINdCVMKmFTEiQIQCphUxz6ztYg8
rbdYOx97nET3peRDPyMLYursmQ7/OeF+edey/o0aL2Vb2H3ujv+9ePeuu4wMbBBkhaQiVolmRkzI
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
qb1Uz7RVU8q6qnlVztVT9VWqqd1XOernVdqpjVTk+VU7qaqWauqOnN3qpYq6qxVlVmpqyr6tqpzH
UZVboIz1b2qtVUjVW6qUqqWY+d4bD1fVcqp3V8VVyPVV+ql6q7VS7l1MdVMarVV2qnV1bVSXVTTm
696rPNVau6iqmtW1YaqzVuZzKq4qvq2KrY6sqtVWoubKrVAKqSN1UrVXYqqQaqdVU6qpTqu9KrfP
VSPVSHzVU1qpXqpYqp3VYPVTSq9VfMaq3Vbq/nquVe/OlV6cNdm7au0letXdpK7V2krtXaSu1dpK
7V2krtXaSu1dpK7V2krtXaSu1dpK7V2krtXaSu1VTiq1z89VKNTVY5llx88V1FWXaStVW73V1VPl
VTyqnnaqmNVMuZVU1quVdVT6JR1NVLFV+qmOVFViKrT5FUc9XXtnjqLtJXaqyqxVbqt9jXVTo9TU
1dZqrOR1Xav6Hquaqs1WLVDZz5lXVdV1XVU/qpxQ1WKmq1VTGq9VeN06H56qc3aSu1VTCq3Vaqt9
ldVqoPVYqpgfVXVflW1dNUB6CgquVabniqpjVcPfPV8dVu+0SNVsVVqpPVvPzNJ1dVTUyVBhz5Qa
qyrz1U4qIluq+Y1VyJuLtVtVO7Z+tAarLTqp5VTN9TGzp1nqqdOqnF96rFTL2R8Ndnw1XVdV1XVU
p0NV2qlaqkKqn1VMarFVN6qRaCqkerHVVHoKqcZHVT7nqLtJXaqphVbqt1UwoKtqphlRVTSKqmFV
2oiOfG6qYVEs6jVX3QVU9zvFrObKrNVzMNVTqqzdVMKuuq9Qnqu6iq7n5nU82GbqyrqqZVbVtXH3
VYiy6ux7780dRzxVXair6rJqA9SdHzDnoT5V1XVdV1To9VKvOtVUhmqMqHvm71U0qpdiqqjVU/Z7
tJXaqt1UwqphVTCrairIqCKrKu5z1fVd1z51dQY1Vi3Vnap71XKiqzVx8NfarVIfmup8NedKscRz
m6UJj1HPvVAYyvd3d3d3V1XVdV0lVKNVO6mgquVLqpvsyqpFu0lZ1z1bVTCqmFVJt1Uwq53VTqr9
RndV+rueq8erMqplVYqsVWqrLqvOqmJuZ1cbd1fVTo+VbVdqHOJ0NVNaBOLKuq1VUxyKrT0F3d3d
3V1XVdV1VKHnlVOHVSiqqZVZVTSqxVbqpAcdVNaqe1Uj0FVLdV6q505j1UzqpLqpGu0ldqqlCqlG
qncfNVb5qvqu1XKCg5ollQY0UVW81TVcPHUpRRLtVlVMHnNV9VyrlkXMY1XHq5HPhqvqpzVYqyqx
HVdqs1ZVZqsRM6y+fV8656uyMxqm6qdVfdRVtVwxsq+Oq/VYVVyKcycMaozeVWKqc1dkaznuq9z5
FVlQbnPkUWZZonUx3d3d3dXVdV1XVXvD1UpVfqqmdQZ0FW83ObKsoGrtJXa3VT6qnFVPKg9VOKqY
VW6rdVMOaLpVlV2q/lSe1VYVVMKrkUXV1NX1Wepqqc1NXVUxdV+rsqplVdOagNVTGq26r2VZVk3G
e6r1V7mqptz1XqqYqOqmMcdBVZqp5HVcj1Vud857PVfeqtuKq1QRUFV3mq4/NjPV93d3d3V1XVdV
3PVSlU1Ooqi6qTaqZ81RVTqo63FVYdVJmdI+1V+qlOOrz1XKCrc71UzqpBqpF5ua7SV2lQH3Ub6R
1WKqc1U4qprVYiqs1WKrVVw9V+qmNBZ6rlWxR75ubnuq5VqdRkV4ZnqKrJlUVWarFW3QVW6jDq4s
6OgdVNOlVMKrV1DiVTULrQVdUVWag3MagoMdVjOlT1qaqcLI3kXS6siNVTo93d3d3V1XVU5oKr9V
KNBVSjVSDdV7vVYqt1UgRVbU1PNRVU4qvVXKqUqudXZVnTmqpSqudKrNVOaqX7qv88iq+qnHNlVI
FVN6qZc9Xx89Viqmt1VYu1W1fVdqpSqtVUzqp9VTiqmlVL0dVNeerquurI6CKoq2qrDV1VKXMqqe
1Xo47tJXaqzSqyrFFzVUwyqmXNVejqyq3V0UetVbVcqtVXLyramLFVmsqDmaqpilVTSqmWYeKqmF
BQWbOnaqmVVieqyqmdBQmju7u7u6uq6qnVVPquq6qntEt1ZVsVX1U+qpQqpQPVT3GzVN7yoNzdue
q5HVY5lVZVmw1TU1XauqpYqvXEkrtKgPqqmFVirqvqphVYqplVYPVf5qqZVU6q2r6t3Vcq3muq5l
Vqq/VZ7qiqMx1B+a8qpjUGqs1WardVigqKqZO4jo1B0T1VTSrOlVqqmkVvsru7u7uqkGrr0erqC6
vqppHVTrv0u6irzRo1x1Uxqyq5fMqs56qdVVQNVU4qv3RVezxH69Oaoq01WVGjmyNJVWarKqyrJh
CrDRRVHNVlVMqr0dXVUwqtVXIueOLVW1XNZVaquXz1bzVMV5zKrMmqg7MZqoqpikqqaRVUyR6Cqm
FW3ZqDRzZ0dVMKqZdp6qmlVg1Ao6h3d3d3dXVdVT2qn1VPauq6r9ZUVZVtVNKqb1U1qyq9VStVSx
VSweqkfsftGu1V6qxFU1G26JdnpRxrKiqmFVmq1zVUyqv1U6qplzVXKtq2q5lW1XKr9VrTqs0VQ1
UHuoqpjhqrNRUVW6B1UyyKzmT2dnUwAB///////////0KgAlIgAAANW2BtYR////////////////
//////9UDqyqmmulVNKs7RNXd3d3dTU1dV0a0a8VX1Uwqt1XKvzLqu1WqrVVmqliq/zx1fVcqpYq
KqY1U7qplVajdXVXqqZqKqm1X1CjqphVTCq3Vaqt9ququVWqrEcUVBVZjq1defn5ua8y4osN2jbN
VZqEqqZVUwoLq2qwjXQdH0qtVUw7VUyjTqLu7u7d1NTV1XVWKrGK7oKrPa2bVBFQVCjq+LmqplV9
VPKqZ1WKrtVyOq8c2HqpzUx0F1Zz3FU3FUXzUCfPHV1V6qnF3FdV23V0dRFcdVxVUoLmqKqaVU+q
s1UzqpFqpEzdVuqmLs1VMDXd1U1qpijVJ6Cr3HG6qdY6siVTVvOY3MaqxVTSqlCOqzzVfHVSnV5q
CqnNVPk6qVart0J3Vequ1NTU1OVXqrlXRnq+q3VTqpypqpoe3FV6quxVWYoqqaTG9VUrRVU8oKqQ
Kqa89Rz0FVOlV9Viq1VvNlVvmqpDPU0G/aCgquay81VTI7iP3tn1fapP9hV9XW5jTq7XtTfOKHej
1dU1U4sEXVT+qk3mqKqf9KqYUGVZVTKPmoVVqVVMk2d3VTHN1Wlu5rJw83a1RTkRpidQpoLMzNOj
Y2taTy9cQ92Fzd+rXPzd6v1Vcs+VLkxq1VYPV3aOgy+dtuvxO1BCKgPQbfTouc9rv363QYeoN13u
LqbomjdjRxLdtt7hfWDPzKznquNRR7NFQmuOKbxx1WKjmjNz27fffOc5tRRR9M8bbhFFFDmyI3bt
jP2oampU7zqg3E+0facRqi46jV9XugoLvs+z2nFptsZDm5ooRGnubm5tdJypqenXpV9X783ro9OD
buBERc3NDm5qGa5ubmXY8dDV9X9u3apq7Xs/43224NsXb1DIRG7bPpaoamPpOzl9G2JAr79Ona6k
/b6KOGHUI7sVHegvOfm71XdVXTnNUuTHlxKqwer+0dAa+dQSXE7UEIqCNx7fTouc9mXfv1ugyoi6
9u0XU3RNG7mjiW7UElxLoIM/MrPHVdeRc+4uahMePmm8uOqzUc0Zue3b775zxm1FzR9MmFBJcTmi
ihzZHEbt2y49991dUrXOqDfNfaPtPbw1WHjqHafagoLP2fZ9lcUelBJQcKio5ocxqHmqKjXWOOcq
6runXpVcquJLXRtQSXE5qiohUVFDNVFRzLseOOhquVXO3ftV9X60vG+/ZQSXFOaHMbsj9M1urufp
qe3fRQSUGLxPt365VkW9oRbuPMOqE1X1ZVhrvmyoq88fegMeKgqpgaKKK4j1NWZUVXuerMqsGqYs
oKrFW1DoOeo3zipqKqdxOqxUKptqPn5+lTV8dxGsHVAzVNVioPFFQ0FBQUFRHHz1WYrcWZUc1BVx
kKm3zxUBzUFmqD1ZVjqeeq9VTQ9Ae6Cgu6qZZQVbVYqajnqyqmQzvQVXsNznYs9Bzc1RUK7yhjiq
+reY/PHVlCMPdBVx46Cq3UGFVM6qcn58cWuaqxQZRUEQquXVnNVdqs1Uwqp4a+e6qZ1UxqphVTuO
qnlVIFBED1WYxH2B6qe1UxoKqdVU/qsVabKqUqG6qZsXQKqnUVBVTqqn9VirTZVTyrqGh5rEdQer
qrFV+r+aqzQR0FV2gqpAioIc9X81BQVX6v5qqQqiqnVVIFBU1ZQ2Dnqy+aqzHVcquUNVM6uqsmqv
0C5qA4oKuyaFBzVZVTGqm9VIdVO+eq5VTmqkugiFxVcKvOKqYxc1WR1Xqqc1UxNQc1VOqrmKqnVX
VWKqYVUwqpnzxUMa6LoYVXuc1RnG5qroWojx81WUHGuqgGCqmFVyoqsUFVI1VO6rFVMb5qCNLKCq
CrsFXH61W6r1XVbVTmraiqnNV2OqmlXK6GrqqYVUp1Ut1UhVFVPqqcRUEVVipi781TlUJodeZN81
V+r6tqKm46squG5zR67OqCqzVTiqy1VcqppVTeOroqqb1R7oak/MaKhPHcV1bVfqarFVMqHHjdTl
Vyq1VY54uarjVFVgx6rlQzG6d10q2rzq6vVBQUPfnmKrVurasVBVTGOhP0oDR1ZUNR5HVd5jeXQa
70GWojXHV9BBqehOcTmqpx2VVKdVyrbqppViNFV0UTq+qmjoKodaFBHV9Aarr2apznoOcxx0qzKA
3egq7nPV90BqCgNVeoDxs9V2gygygq7rQUR+Y/Pbuqx2nubp2iq5c1VNbaO4ot80ajqOeKq/2xLi
9uLVd5rq8wNFz1D56tuoOjnqgXLmqKrlXVWKigiq6q5zc3Pd1NQuagdS1zHaiPdQzRVbGYy56moP
mdKrlp1OcyyqTn5tc9VINVKxsqtRxx8ajFVPKqZwtg99nnPl5UVbQdo6BVZzUFAegTqxx0FBPRTW
ueg6bBqCrYsoKDnNEj5zdjVZVJurzO7qpaq+rKrNVIvTKnKqZPmoMqsYe4+aqBTkXPiqyOKrar1X
HqarV0D6VU6iqOfnNVkaNkVBzRuJxGuq9l83PQZeVXorqyKOpqKBc1Sc9QbnqYqsqpnVfqvVW7s1
DZ76Opqatq2pNeHqyrIrPU81XrtzUPY/PGZR8yq81BQnqass11Zz9KirLq/n5o8quGPzxVfVJVcq
LquUFVirLqpzVlVpxqgq48dUExdVMHHEH2ioEaqzQJ7qOc0RzVWdc9BQUFugNQWfKi6CPMqauyhu
gNHQdanuqhmqKCrIz3VTg+UEd9LOqk16q+raB9u1BQ85ot3tc27yoyqSqxdXKlq26uM6vVBV2ZV1
Vm6vu6qdVZlVMKv5ojrmyo51dUNVMry6Cqm9VNaqfRg1WVOPD82VCquc+RxVJ6rxjVMR4o4usXN0
qyKLmqtG57iqs0FVnKsdVs9RG7jvObn79jVXLqeaOO6s54sj5qr9Vt4lQVe9ZbzKsqplz81BG3VF
HHVlVKFVk1V0x6qc1UgVW6qQlU85qrVV2qk+qmNX5z1UkVU8q+j51QVU3oKqWqrVVyq1dVwc1VPq
rVVMsqp1QGqyqnVVNaqXatq+r6rXWpPFGqvyOqxVdMerasqpxV1VOKqWaiqnlWVU4i6UFX1bVBfG
yIHtVdzXUXVYeVWjY6g8Ty7znq/UfPGeg5qrux7dV+I3Wr6r/eq5FQ9I4sFRUVEVUXNxDwq+LBQU
FBzc/PiznBgahqppFVT2qnNW5jqyro6qYVdVTKqnvNVdFLx6qc4Io8FCerXnMKGgoKriNGeq9z0F
BhjHiqYuvSrKCgq+I/NHzZdViN85oqrZ248YPz5Vcd1XD1QIRxiOq9VTKrGa6GqlKq8eq7z9qqRO
aqntVKZ4riq2q9VTagqp7QVG6uwc9TVZq81Vqq3z8/OaqLcWxYq4Wr5quzny6irXmVWjVDNUxc8R
8vNx1dzxxc1Vox4+aq7rub2q/FV/SKqzUR0NV+q5F0ob5oxFUVEVR2yqLA4VXeblEHVeoKrS5VWh
U51qtVfUVFB25+e+Jz1Ilo+Y+UIPQUFVxc5qr1BQWdRVJoqtoKCYiq/m5jxmqs87uI1Vt5G8GHqu
HPVcqg35CqwaraCz8QxzmoB1jqyrqsqyqnFVOeeqnHNkdBnOeKOoqp5HU1U9qyoh7vm73lXVa85+
aq/QWzVFTFGc8XPEfpQxRrn5ounOaq1GfpV9VmI9AecjqKr9Cfn5o6iI3Z8XOw76hsVFVnFdVqql
S6rRqqfVUvc1V40dRFVtAKqQKqVAaqmnNdVOKsNFVfq+q7VvPzVaI7EXMKAVWfKnmq6qmUdBQHug
7LMVBdxrtp1Uh1Uu1U4oOBmqrEO1VPKqRaCqnVVM9Y4zRVddVyrFFVTCr6qU6qSjUFVMMqt1U+qu
VWY+bpQxRrtQ3Vaqv1Ug1dVTGqlGOrKkyzmqud+c/GdVM6qRqsqKrlWVUwqv1U+73VTizXVeqs3V
9VK1VOqqVqqVqr2+aqmtV2rhnNVsVX0Fqr6qVaB1UgVUxqKsyPnqpjEarDHw1RU0FBFEz0EHlwyr
e9TCqnsXPk1VcqyqnFVPKqbGiyKq7HVSFHHVTK8qp1FqOOrTVUqR669tduzyyHqBD0Vwmx6Oxpeg
090HvtAuxBd+xreN0fWY7RztGY++J0qIufIn33S41OR/DGWqu5ls+s5zR3t3tvUT3OcSY2qidoPN
LHmr70HV9ncfdOi656Z7zE8127G5u61O0W84imFq5JmYozG1lnom5mzRJGvXhrmMmO3bOaLnPeHS
68T86UV676erFd9p/V9ZUl5R5vfGW+25+jt3htT/btfZUlvpRyXVBPJUZtx9TOd35yTTzb2NDsaX
pqJ7oJxUC7kM79ojvG6PrMduefozHXE61HNzm5n33vHmuf5EZdKuqM2fWc5ue9u9zr1F69znEmu0
SqxUHmljzR6Cg6vtd89AnRdc9iezYmbXbsaoa1O0S3nEUwtHkm34Y3Qx6COibmTxcyUV9PDXMLIp
jv2zm5ueO8jxdeIU+bfT3MR77T/S6CVZj0+z8xb3xc323RO7PkXSf7dr7rw966Ufl8bSXji7R0Br
ne3nEaaivWZrnoD81Aar4+erjzlRVfqp3fPd1WaqU6qWqipVVO6lVU2qtVZVShVYuPnPmVXbyrea
6qeVbVTugMeooDRc1Bz0EcdXJ3UR8C8uLfNUWakOY9Vypvrz2ufHQVEdAjLuapqptUVNXVNVLVX9
7qppFVTs58dTVvPQVEdVqOqkSqkBxVWauqp1VTA18/R1dVSqeKrqntdAaqmdVNIqCj546sPVZy46
vq6OraqeVZHvmuqnZoqm+h1VZ54quq6rquoDVdVYqtVXaiq9VSnVSIbtFQRZHVTKrqrtW83N27x6
PVSrlV66qe1W73U9ozzdXc983WpqyrOaguq5VTOM1W0HPGeO+tp1WKmq5VfqpxVc57qscx8dT+XP
Hzxc9Vyq/VTiq5z3VY5qu56nKCpyrlVdPV0dRlVir46qdVUlx9zR89V6Pm56r1VIEZ6mOr6qeVc4
4sNVZ5qjmu6rWc5j0FVqqmVVMairoqDmioKrNXd+9V2q1fSqn11FW1XIz5zc3Moz1J6qskRqsiiN
VZ1dBqq5zxVXXrKsdV2q1VTTqar6rsTfaLtM1caM9WxR1cfDc5uaM9V2Kratqe0VWVBrPz9e2dai
zVFBz1XaCrKvqsGqp3V+Hq6qndBVY56E9W1Uxqt1U4qv0FWuqn9W0FBVTw1RzRRYa43fNNWaz1NA
1QR1OVEdVmOqlWpqzmqp3Veqv1NW1Uxqy6g9RdReaq2OM/PHQXV3M85j/eao7UF51ygqajniVTFn
Mc5r783NdRV6dVMDHP058qaqcOrYrObneVeegdDQLDxqr6COgoEZ0F5QRR5/NBzmjqpNqv1Wqr9V
+zUF1U+q+gXNVcyq246CPmqpzugizM5qqZd49PmPU5Vt85wqrGVWKr1BVTKq8s63zVXarUVVw0bP
VcjZ6iPJx94ufrFQXfahOYXdVOqrJ+ftzKI11ZHG4z3Ga6rNTzVUyqpxZqrFVNqqZ1dVTmLnoNo+
87XFccd0HPjPz1F41Vhl1oDUBz0FWd3Viw56i1z2dTGVd0jqDbPVsUVBVc6M2XQJ1dQVZVTKqnUV
X1U9qs1NVyraCqntVMlVTjOd3VlVzKrGXV1Wc/Ne+aKOrqqYqLFVTiqmF0FRVfyKq5zYaq5V9QeK
pug7m58PU5Z5rnqp/V1V+q3VTk1VN6Cq7Q1ZHVSnVTuqkGKqm2X2q9XVZ5qrZ3VdqarnOerqrNVO
HUxUB3QUB6tq2rqt5ue6CJd6CqmPWgoKCrjxx1U45uZ1dV1WVZzX1VWXFu4jUFBzc9V2rKrKvOxq
m6BZVlVuPVRPZ2dTAAH///////////QqACUjAAAAYChn7RH//////////////////////1Qap5z1
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
qI6squmqsR1ZUs1RZqv6ursi6o2UHNz0G+9XZdVznNG2IwYUFWLXPQUEUfNHUxR85soKiw6iq7Vm
XHFHU1U4q++aOOrqnmoKssi6Gro6qdRFTVfVZ5+eKqnNVNOcGayKrak1VPaqf3VSBMa57q3ueqnF
X0/bJjnqphVT3minKrdWVhzHy7jjqv5z1U29j5oqrNV6rqqf1Uru6qbVfVTu6A9Xc2Yaruc/PU0F
0GR1GVNWR0Djq+rOahi5qC3cdXRx1Z1uq3VlTV93OY3VyVRVhoufKmq/U9zUFB0i5ueovn6c1W4j
VWKjmq2+eOO7q6pNUc3eJdTx88VVmLnq7nqsRnq52arFU1Odqu5qtq0/bmq3nzKmM/fMjiiqphVZ
jq+gNfWq3Q5UVFWRZner6tq+r6qZ1fo3NVYq6rKvq/dWiqmYqsiYWbqv0I6VcsjVXdKvqeaqnMcW
ZVu+egNVeqznqyqzFVa5446uqpA7c1RVdPEa6nnoI6iOqnBqrcXPU96Cr+bKvVRrI8NazKh1X4qr
dRU1XbquZVeqsVWqqdc/MarqqRqrJqmqkjKrNVyqmlVLB6sqsc1VuqnF1U1yqnlV+q5VaVVM1z7o
F2oKu59VNX1fVvNU0Efeg7RGoTxVXamrOeKOo56vNlWGq5x1FBz83Y1Vyqwbnqyg5qvq2h56rvMc
9xszqJ6oq6KoimIoucxu1BaqDGi5qmgq3sZXU0FBUzh0c+Zh3dBVbiq+gqv5QVdUVXOaqn9kXzuq
mtVOebnoKCgqsxXVTWKqnlV/mypqzyrqrnM+eqnNX1Xqqc1UyqT5V1VMeegqKk11dQVXz1XeazVF
VKtV+O6tqppUVUwqvVUo1UzqpxVSNV1ViqmJqg8dBUc5+1BE6t5qmr6v56FUEXfrVr5quq8xjVfz
xR1B+ZRVEfNnMbvUx1dnPFVY56irKmqxFz1XKCp2olqr6CKM/M6Cg56sNzY6rLq+Pm7VZzxVWKs9
qpvVaqpxV1VPaqa1UpR1UoxVWqqc1fU1dugjXaK6qZ1Wqvq+p54qCgU0eqwfKrvPnMaLnq+rqrdV
1xVYaNKoqLjquVX6rNVg1BVcq2o7VU5qsmqunjNfPt8wqtVNVqrYqqY1U7qpxG4qCqmNX3VTa6td
VO6iq5VTKq/U0FVzKqY1dVtVyqmdV2oNUdaigqLyoqsWbmqKC7edr5lQVbUVFW1fV/PzxNUD7x9q
t53VtXVfzRGq/nqI46irnEeKoXeLmijqaCPnq3KuqsR1NW1FTV/MaqxVd590FTErtmji1FzVU25t
NUFWVUo1Ur3VxjXQI9A6rMcVB2cdVqqmdX8+4u1Ccxj1WMqu8xzVfVTCr43VdqxRX3qKv58qs1X6
rFVztVlVOarFV3nNsz5nZ6mrKrlQ7qphViW1FVp95lBUVU0qsVU6qp3VtVInaq/VdPVh8PU1X6qb
c9ViqkOq/z6UVBQOgUfer+fmq2re3NUd8zr3joKCpXPVtWuocdWd6irI4uc0bq48VTHHQVBqCrOe
rsqauqI+aqxEorvnPzmwXU1PMqsquc9Vzsj3FVaiq6qlnr73qpxVZiyrarFRVTy6hVUqVFVyLtFV
ZNQVU7eVU6qIsqt1Wo6rNAtc/MZ5fNnTgTQPshU1Ui1NBQZUVXasupq6q7UGqDxVfUVUoVZVbNQU
Gc0bUd5U1UwNU0VTVf1VTOKrD80dBFV1Vuqn0VVuqmPftVkVViI9V5VZVfj56r1Vm3VY8548izKq
dLKtqcqKvoKrdVMKDmVVrmuq/3PQc3PQXVTnKBxGN3qp1zH5jZFU81RnbnqpjQUFVs9RijcXPMRU
F96sj1zGuqxFV0cXSrat8oLiu6iq/VYqpjHVeygOO1VOsPk5mey7txRc8nQ8VzMJEfclzs4zdMn+
2uyioNvtnbtQzjxXeuimfJTTelkweKyLR516mZuVZuc23uLt7kxfnfpqOJc64E6c9jpNvUfOsjeS
ZbkNQJZzTvS9+zPZL29Xje5vzW70n0IzJomr6H1dAZLqvD5OLHOK5tpR9bVp2a3OTlnNp3r71N3n
ZOnYgp+bxTtzumbpk/2fbOag2++d32oZx4rProvfJ2Ki6dFmj5Fe8aPPvUzNyrO0823zX2NOYr8X
fpqO4lz5pz2Ok7PUfOsjYyZw/ZyGoMXNPu9zk32SnL0ryJvbmNbvSfRzbyLm2r6H6RUBll0C8Pk4
jOcXS/GlQxx9Yry8u5w3Q7SnDzlmfZn0vvU1BPzL7egh2m9JEDVZz8xtUtXVfmVU4dTGuaOq9lVJ
FVMhVTqq9VTKqlaqn1VMKqeVUk1VR7iqvRVU2qqj9qC6qoGKqlyq5VZNVZXNfY8dXXdV7Wayr7t1
WEcx8xR81AeI1Cqv65cSi56CzdYqd8CFuk52coQOUq7nTPUHqu44ueN1FVyr1HVZqplVTJ1WqCKg
quVXOYzoD89VI9XUFVOj1XqCp5+Y1nqvVNVMKrZojVWYz81BlKbnqygV1XBURZWqpcqtGqptzZQ0
NVO6HtVTJVVTaqptVK756CrI6rEeVUr1dV9VJFVOLoG+2VaaPmjqtVXqrVXR8z7HupdTferqCji5
oouaqwarKsVVwx6DvWzpzvpFwIdX1ZVT3D3V9WGqyraC1UPmPQ1fUx4e6vqw1WVCoKDLvI6rEUVX
urd3mUF933M91U4q6gquO6sNVdN3qKmgtZXypPVZqtGuq7Vaq3neR9KCslZ6qd1UyyqnFXVPPHVf
quVXqrVR37Zz1dlRVaqpDqpDuI9V+qnnSKoVRUHiiqKtqsxx1WLoKuXXnXPurjUHbI6rlVqrDc7o
KrHPU1bVaNUrKHOc6oaBm5s7x9quqpjzo1W0BuaqmBqqUaqZ1Ui1Uwqp130e6qY1flVJVVyqmNWZ
FURc9Vyq7QUGqrPPVfqtVU7NQYsMcyoavoOarDmq+Oky6mpVVPsqplHVlVNqtqpxVTqqnlVPqqoF
VqI/NV8VWRxRVFBa62eoqyramOKOrarHOdmiq/m56rFViqmNVOIqvR4qu5446jmuNUEaOerasqtZ
UHzLoFhqirOepNdRQc8XNHaur7oKiz1W7jqBVmVXotxigqKrR+6qpjVc5+3NUc2R1NV67q6qzVTu
6qd3VaOfnPVZPdKfVXVFWVbb3rMuq3HVnPdTFVjjpdUDqsI5yt0Zz81XR3V0XSlq6gtUHMllX246
DGqmqnNe4goPKDm7VYbKqdZVbi5rjqKs5j5VTuKgdVO+fmiuqm9VJEZqqqQqKqec/TKmo5+eOp5q
qcUNVqqxVTk9VO6u5ndVMebD1bFURVWMqyqnNDQx4o6nn546rWsxxQjq7nH51XKrlRlXVWD4p6Kq
xVsdVM8qs5z1MZCF9Isyq/VTFGNVSXVTqq/zGznqpXqprVStfP9ej3m6WuuepzHuojY7CpPrayqz
zmoL2/vN0Z6lR9XYNd1NXc1RVboD44oqqbYar8oKqU6qt3Oo6qR6iPni5z1CPH3jfRc1X1WD8xj8
9XVWueM9Vyq0bnPOc9WGMrq7XXnXOqrnNVZqvKq/HzxHupiNFQVNBfPzGq+r6qbXQ0nag7xVWXUG
q5VCdRVsRriMqr/NdWxuoVTUVWKrlTVdq2oNURmq2r6rOuY8XPeUNXVbV99Lec0cWczk56U9Viqz
VSPzGqu5VkTq02GNao4oqus0ToN16mNx9qmo7VHPeHdnoKrsSvbrq+h6tqt1WKuP06dKjmqF0NVY
fTXOc3Pz1WOaq3FQWZ0aqu8/NjeVfQVCw/NQZQVXqrHOa+lBcdVMKtq+qndXmqpxz1ZQVNXVfQVJ
jVU5WVaaq7lV/KmqxVzqp5VTSq5Vaqzoeq+arIo46jtQR1ZVtDQRR1JqBqN5F3u6rFVmOgdVO6rV
Vo/NHFV1X5rmq26vq+q7VpqA/PdR3iPlqgqsdKmpqL1qgtVbkc1UUCyr46nmqtxVZaiqs8/OYjQY
imM1BVTfKr1VuKqnFVIFVL1VJNWVXuaq6eqkOgyqnNX1FViqnNVPKr1WVU2znqp4aq5VaoardVPq
qdLrVZ5o6qdVUlVPPVTPmqphVT2qkKr6qQo+agoIunSp5qqa0EZqmq1lVItVig71W6qcLmqt1WjV
U5qpD5+1Xbs8dQorqpyarKrlDV1DQVeagzmzmypw8RtUEVV3Mqu1U8q/mq+KrnHHVuVWKsqtc3Nz
1K56uPVcqx1U6q2poLaqKCqmF1WObm5+1BzH7VU6qyhPSVBqtq+q3lVMDR1WqqW6Crec9X7qp3dV
yqxdW1XuerD9Of7Sx1ZQUBoqm0jRvnjfdUF1WY6WjqsxKqndVrmoD89X4jpx1WLqu1Cq24s56g6e
W6rlR2qpWqebnqp1VTGqmlVPaqeRVdVdqpTqpdqpSVVItRdV+qn1W81TlTHVTE9T0quVdVbq6pNV
TqrarlV+rsiqObpQVNV19au7o27oLqw2qrmoqtoaGrqvioKDKBVBo8iyow5CrsoIqrlV3Lqs1Wj1
XKqeVfFzXHVtVjIqvq6r6rdW83PU81TlXGuq4d1ZVtS6CI6uzUEb5uelObn56Cq5QVXKCzx1Wo44
2aroj30jjqpzS/Y6Ay7RGjijjToI90tTFVZqp3QLMRzndVioV1U5i5z5luoquYbpHFVTmq6llVMV
Vut0uZlTU77xxGNVTCqmVVIdVN3FU1XMKdjUFVMaqYc1Vigjyq5Vfqu6idWVZQUNW1dVlCaqxHFU
vvFlRFV2ZV9V2qzd1WarXMeq1VTyq5lVir4uer7qu1fV1WVW6k1W1FnquUDPE8i1bd1Xau5rqu3V
vNlnqptVYqvZFVZ7moKr/PU1U/5j3dVPTUNVIiy6iPdW1XRlXOg6mqp7VTyojq28upqv0m65Qxnk
VVKNVKhqCpNFzZQVWDaq2zns/PlXRHqygNV3NdVNKqYxbnqigqKnnN0yqmMc6bDVNxR1U5urnV1V
LlVPKqexVF3HUVXKqc1WHXqv1WKqYVUw5qqYVUwq8XF1zm6VWbqvc1VP4orqqgUPNdVmqkWraqfV
Um1eqvOfFFVq6cxqsqs81QY5rqavq/pFVYq/1adltOpVBqOqkfnjVBVYqs1caqnVVuq/VbqptVT6
qmtVPqqfZUVU7qu3VZyqlWqndVKFVOaC21zRPrcxZs6Yfn29VmC8936UdPti4rV8+Zt4btmldDNZ
d9JpdN57XToZqY97PPPfZpzsxMX2fSaXTpvWP5t4nm832WP0+7cwvJPZienul5kanq81OZMbnppL
XAjPK/aenKGa7NW5x+L1Lgx6unkc9ceJ8x34ph6yay9PLzrepOivNUZ7mjc+daO+rnG8vJ1zma6G
wakvLoTZvXAjwhPbIQoaDpR0/Z9wjXFeXz5m2YzvNK9TWX0vrNLp2z1K6Gh3Me9nnk57NPTmJq+1
vpQmXTrrfTTx0fZ4nQZ2zfbM6v0/a7mF5J7MUK6GyNTymp7NbNuemktcCM172npyhmuzoctzzpfF
6s4MDpuOeuMyfNG/Is3ejTWW9PD9b1q+izWo7UXPnWjvq5xu8nXPG11NdbpmT2dnUwAB////////
///0KgAlJQAAALT16hQR///////////////////////NdCbI+yNrgRNGoKDmoMqznoOaj61U4qpj
zOpVVy6u60HPHzVWKqYZVcM7oKCrqCqxVlWM/joNnNQYc1Fz1EVFz2Y8fOzOKqzcVA+dUCVVmgZj
0FmoKCr1QPnoLjqKDmoOqoKrqmfTI1RU0hqrFX89VM6qaVETy8j7VbQVU5q+q4eP5V1Vox6mr6rO
Or6DmqznyqwfI6DvRc+c9WGq48dQo+fOaks++Z/epsoDZVY5n1oD0FBVfqT1UsHjqp1VTTq6qdVX
qvoLqc+0h6sygqyrqD2qmNVjVX3QUB7qIubOeq9V0vS6sjNVejq+oyoqKqY1U4ug56mrnlJz3kVW
1UxqpjVaNzKrKuqOerr1HS4egyLmqpjVTGq0bmVWVdlVOeerl8q6Q+VWTxmq6gqvnqypNVTJ0F/I
6spcjqsVXLqDX3iq+POerpMdV6ps1V2giP3NVSGquoDxc8MoKhugzu4lUR1Uyi5qqYVdSZzqq9Vt
VML6UHNVTq+1TFUdIpa1BzqoiqKigjNVTSOqnWVFADiqzdVjmq89rXMsqKuOar4jRVMWc9WRVUwq
26rhqrtVyKpqs1XWqCqnZ6iq3QVUz56rlVirI6AxqCgq2POZUGVUxqs0HfnqsUFXVU+qpCo760Fp
VPNVtXXffKuq6rVG4jPtCjxVX6mM1Vxc1VKNXVXKuqauoI+qqajKBLFVYq/n5jmiVBQZ0oKDL5qv
iVXVdUUCoKA5tVKPQHvqfrGeKPpz1fVTB1WKjnP1oI8qasqasqsVU5VWvr0NbqKirqrnSr6rFWXU
1Uw7LmqarFX1a+fm56tq9ZUVdVhj/T0dLzVXqt5geO6qd83NVTeOM+KqzU8/epqpbqpZq+6rMdHZ
tXh48WVXIqsU6eloLboMi54+eK6sMadeVNurs5quvPtWVbVnOozbnYnFfTDXVzOIqipoKmLF1NUm
znmeeqmtV+oqaqcnqsVfV/NVdPVYiZ6soLq44qKCgZ+9Vqq0lnNZ6DfaNKqy+c7vnq+6s6UFBtxf
KtNeDKrnZ1FRfNVcq7tQUFjmqpxHUn7UDoIqmKzVbUR3Vcqxx1eZVUwNVtWVWusVXVU5oKqa/e9G
o4jUf03Oj8yk+mb5zvHzWbHdTVsZ4txVbVtW81xx1fVTWg5z1U0q2qxh6m6qU6qeaqs0tVM6qd2j
1Wr5nZ7znSygloHu+/fm7JOgUXaOpNdB3oDdEegzulzmSVA6Cg57qavqsVFvI6CgoL7dKvxLKi7d
t0HY3NQUHbriuKo7Ogo6TrZ9R81VyoqI6lxKgyWO6KrqCgoKD7dV26s7A9XnjtH5rqsUFVNqqe1U
6q6qkTnq66NRd+erFR9M0aVnfNfPO0ctnS5j1lU4ajnaioquVOdY4uZXrKty/JMmfY6mjzRqqcmj
zMNHVdyrDZuLNVZj0qskqs1cepqyrKirarkdCqqZxx1XKsV1UwqphHzdjVBoqiqkKgiO6soDVKqp
tVTqq8ZM1Vn7U1fzxxztV2NrpVmp2pypPlBUVZo9V2qxHz1dlRQVFVugq6goDHqyr8ugx1Z0oOaP
VWXix1NBURVlmUHTMqI4zc9X1NRVlXRI3W91cazKrnUHfNV8xH36XO1PN8Tqp1zUBqrvM6toKtNV
lVKlV6qzeVPNQc1Vmq5VcqptVT+q67dTVTyOO7oIqtoO9WGqpvVTo+VXjx1DPQVU7qpnHlW81TFz
z9VIJqqYGqyree6qbR3QVWI42z3VTFPOlBV2qB0FQa6mrqrFVyKguqmV1NBdV/KsOarqCgoD1bQd
FUzvPFrtnmc/NU0FRU0HPbt81VzKuqwKqmFVypqp06rNxG56vaoFUmqyrY6qax1WKsPQH5+erec2
ZFVbqpjVbqptVs66s0z5UVdHVlVyqy75o5/Kqc0FRUVZVxj0FxK3V+qjmj6SX0jvHVlRU2bmzGuc
+VZeVFXc1TVeqp3VTCqmR6Cr6vq6gx1Uxqp7V9VP6vqs1X6mKrarcfOue6rcdV2q3VeoD30zrkUU
RuarLq7R1lVxUFXafSgoDXU1EVXVWarl0Grqt0F1UzoD1NXVYc1BQUFBQYegoOlW6qeeLO3SgSzy
oqaDnqaigoMvnt5zVXKsq/pnExVLqaiqwfns2RmqDVU5qp9zZFV2KiZ52O6rdB2qzJ3ToD1Jo6rB
Xmqv5Px1U5oKjKsOroFV5umo7mZ2N3Vh6jHzYsyOrLq6ooD1W6uqpxVqFVMKqf3Vhry+nNS9KqbR
1WD0FBZ6r1XVZVqO+egq6gfPVeszXXpjqzKigoOsVBkd3qrKrlRQVW6qZ1XKuugj6UFBQVca3lBQ
R98oOlRzY0vMoKCpoM57q+rM6HydfSg0agOb7QHiqs1Uwq9O0c3kVHdxR88dAYx1UxGqtp9YsRhV
TM0dRVbyLFzc+Zj2tUao6Cgi6nqyqxVT6d7Hqc5j0FQejquVWKsqatqI6rczQUGGOarqqaVXqqaV
afdBQRc56qYVU4quR8+YedoKDVWVU6qpAfNz1U/qtZzVU9iz5VSBV2UFBQUFApmTKqcuq5QVUw7O
qlHpmWc1W1fFVYPQHjj56r1X1W6vjznqauq6rz2u0VBi6RVUysjFe6Dtz0FV41BQUBqrlTVvPV56
qYdVVZoKA1BQW6ujqaqYx1YbKDmq5/LuZ6ZHOX2STjvRSgF2qM/Y552S9daCg69aB9Otn6Xa8HPz
d6BdO/bW30zrrvvt3oOt6o5b1EtRaWrj6dOnQ3bSoKDr063FedNJmnKBY7XedmO/Vds7TPfsXr0G
911bdAs3W+UGn1+ydXO6V9uvec6q5x7z938rb7xxUU++9Jvv0u7zv1XTeM/X46O+87p731mO67ZW
7dOvZXHdqj7HPPyX060FB160F9KA5+l2da5+bvQLpQdtbfR6W+2UFB1rfb1Ry3qJai6LV8/Tp0XQ
3bolQdelBfNedOiucoFjtd+87Nd+v1dscz3ZevQb3Xy3QLO0vyg0nQeTNA5/SP2oKCcoFc5az8bf
z7vvHFRUT773OUFB0u8oKBdNmZ+u2fvO6e99ZqgoMXbK3V0HSgcXNVTOqm+6CqmdW3FzVfVcuq1V
TGq3VTXm6x81TVTWqmuVU1qprHV9CeqmtVNaqa1U1uq7z1ZVbqplVTSqmbqppV9VNaqaxy1U1qpr
dRzOqmtVNaqa1U1uqmtW1U2qpnVaqaGqnFVNKqa1U4qptVSDQ1WvYqrMlVNaqa1VZaqslVNaqa1d
VbNQ1U1qpjVbqplVTCqm1VNaqa1U1qprVTWqmtVNaqa1WaqZ1FVuqmtVNaqa1U1qprVTWqmtVNaq
a1WKqbVUxqprVTWqmtVNaqa1U1qprVTWqmtVMKqYVU2qplVTWqm1VNaqa1U1qprVTWqmtVNatqpr
VTOqmlVNaqa1U1qprVTWqmtVNaqa1UzqtVUyqt1U1qprVTWqmtVNaqa1U1qprVTWq3VTKqkaqkSq
m1VNqqbVU2qpBqpxVTaqm1VOXVTaqmzqptVTaraqYvDSVX4veaqmNWVU/qprVTWqnVVPKsqp4t1U
1qprVTWqmvNzTlVNaqax1UzoO55i6qd1U7PV1VMnV89HV3tVMqqZc8dVM6qZW89iu6qZVUzcdVMq
qZVYeq4eq3h7q5ZVTyqkOq6jpmqu5zZzWniqt1bU3VZqp/VTSqmlDcdRdVuq/VT2pq3nqppFV1Vz
MNVTtc2VbVTA1Wmqu1U55zxnquVe7fPVc56rfNmc1Vrmjj56mq4+1XZz1XOdZVTt89VP46rGVNTV
1SeKq7VYuq5Hh6qczlVKdVWiPV1NTV1SeKq7VY1V1Vw+RxVW6sqtZrmq6rT2c9BVbqarlQqrkxVZ
VVqKoq+Oqxec9XR3z1XI8yrKreKLn61WD1ZHVajjdVznyqlCqnE5UxVWXHz1NV3mqvVdzZVc588q
qhUdRlVIxqsqatNec2ZVTfKqR47upqav5z1U9qt1X6rlVyrMZsqDHqvoy8dX1Uqec2VWqirKsqyo
iqyrKsqyrKsqyrKg1RzGNVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZ
VlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZV
lWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVl
WVZVlWVZVlWVZVlWVZVlWVUzqpGqKrFVMKiqyaqmNWVFWVbQVfVTKqmNVk1VM+bm5ubm5uaLm5ub
m5oouaKKLm5oouaKKLmiiii5ooooubm5ubmii5ooooooouaKKKKKKKLm5oubm5oouaLm5oooubm5
ubmiiiii5uaLbqv1U4Z6qcVUxqprVSjU0FVOaqdXVYqKrNV2q7V1TU1XamqnFVqgqpjVTOrqr1XV
X8iq2rcNVZdTz1FXzmR1cbmOaKp1VmRx5d0VDVTKraqd1UoUHSoXeq1FVlWVWKrNViOrOa6qYc2H
54j3EpKnNc9QaKOpqDnqDHPZrqKio57MfzKu54uaa58ecxnkd1W6rVWc56tqTxc1QquPVZ5j1XjH
iioKlRZzGquRVPNzI+C4uarKrkVXG5udThC+eqkCqmkRGoSNU0F1XKrlVO+erojVEbqLPHUc10lV
pc1RzVYqOjzniqtR1ZHVaqs+8yqJ+a5jZ5kU/VaNzZVZyraNYlFzGN4bDS1c6jPM9WjRVdlWdklU
VWKscw6qdVU9qp3VdiqpjVTBKPtdBzc56uvnqprU1e3VeqYqqYVXO9xVUx56rtXnq2q1HVuY46qc
VUwqtRur46qY89TGjR3QzHm46rkdqPnPHHGfIz88eo3vnj547vm5qqY81RVSHVZqpKqPObm5uaqm
HNVtRUc3Nzc3Nzc3Nzc3NzZHQ1Xqso/JoyzIpyo56Oq1ZsmqO6rXNMabofKNqq0d1anhpaMzPzc1
VNKrXNV1XVYsqsVXjKqn1VPqr3NMVUyqpDdVNKqd8+VPdRXVxmj1Xqtq68xn5o8NU81Rz1fMKoqT
1HNHOs1SeoNU1C5ue0+fyrY46rTVRFzY6rkVTzrndRVYqLqarFXOrMjvmjRoqnnqphqojqOdnUdV
nmNlnqKmq7VlVOKsq/mq3mj54o53znqHdVOKqf1U4quVZVTCqm9WGZ3zVW6rNVmqmGGzmqyqxUHq
02YZOvi3FRo1VqhnJxRRzE15P3fNFFdVzno5+e8zmq3m8nJqYwy0Y1X5lR5ugqwzyzz3lVyKoilu
PmMj1W6qa1NTVej5qqeHuqz2NkUVVlVXqrlTz1U25lkVVOKqQr54uaKruaodVjmiMqrFW81Wc1VM
arFVv2rebKiLnq8zNh4oj1MVxbNzKKPM5sji5ozGiqI6ioqzpURxZQmZsqamrOY3vNFUe+Tp+c2J
89xmq3EY/O+cxujj6nq0zMaOq5zPI/Z2rMqardVirajm5ubmq2qmtVMaiq1FzRRVWD1bVhuaI0XN
VZqs+c1WVbVTGqxUVWoqtqppdX1UzqpnlVMKt5ueqmHNlVqqxUVUyqyraqbVU6qp1VTH5qqm9RlV
IlR0PVTyqmFRfMaqm9Vuq3V9V6rqrdVIVRVTGoqprR55VTqqnFVOaqVJiLn5jVdHGY13znxVdHiN
UZUeUZzxGj54zRc2WeLnquZiq6piq85uagiNmVBnVTmqntVKFV6q/LVT6qnPOjVZQZVT2qntV2r6
qdo546qaxuqnFVOKqeXVTiqnFVOaqdVLqp5VdquVU4qpxVdPZ2dTAAH///////////QqACUmAAAA
uqaNGxH//////////////////////6qnNVOKqcVU5qp1Vcq+q9VTiqnFVOKqcVU4qpxVTiqnFVOK
qcVNX1fV1X3VdqOfmmMOfN89xfW6G0o8yLDxmqJioqI6si6RxTFmdTQ81S6GLm5qhc/s+duO6mrb
q+r6rtV+qn/NHGeqmtX21U1U4oHnPVfqv1c7q+7qar9V+r6r9WVU0qp3VTqqnNVOqqdRVU65z9Oe
PnqT1U6iiqp1VTqqnVVOqqdVU6qp1VTqqnVVOsqp1VTrKqdVNVNPtVO6qe1dVTWY5uerjRRRRxms
5lznyOros5llRkUVni544ubm5jR80Vni56g2VXDZV2c1TV9WRGPQc2Gw1R5OTlVPaqe1U1qpl7VT
2qntVOardV+qntVPaqbRVU9qp6eq0/OY0R6tqv82ZNHnPfZyr6v5qvq+qxVYq+r6rFVir6vqsVWK
vq+qxVYq+r6rExVTGqkSqxV5zc0xFhnuKadR5ajiRjT2THNURVEUxeGoXzUPNFze8z5zu+erauq+
qxqqmtVN6rFX1fVYqsVfV9Viq3VTSqmFVir6rFViqxVYqsVWKrFViqxVYqsVWKrFViqxVtVItViq
weq7VYqsVXartViqmlVNDVWKrtV2qxVYqu1XarFViq7VdqsVWKrtV2qxVYqu1XarFViq5SVWMdVx
YY0u8zKqZ1Uwqs1WqrGZmVWqrdVmq1VbqzKreZmH8NVYqsVUwquZlVyq5mVXKqYVUxqsVWarmZVc
quZlVyq5mVXKrmZVcquYUOaKroqjnOeKKPI6uRo4qm8zmzIolHzc/NEeOOrKioji56jpG6nDVXKv
qypqIjmqDeez83V+VXKrmZVcquZlVyr8zMcWc0TzMzmiq2qmVW1FViozMyKo5qjMvM9yrKsvMquV
XMyq5VZqppVTE2VGZVczKrlVzMquVFRVbiVVzMquVXMyq4tVXMyq5V+Z6qqbVWsqphdRVxlpRG8N
JimRFFZ46qUKqUKr9V/njqv1X6r1XfZ6qlSqrRVfqumoKmq/Vfqp3U1X6r1V+q/VlV+q/VS9U1NX
8/PHVfqv1X6r9VOKr9VPqqU6rh6r9V+q/Vf56qdVfVdqpzHVfqv1X6r56r1VKvPU1X6r9V+q/Vfq
6q7Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r
9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqvvnq6r6qQKvq/plX
+ZVTGr6qQ6vq+qkiKr6vq2r6vqprzVebKv5jVfV5qvq+qk2rKvq+r6vqqh1ZV9X1ZUVf7c1V/NUV
fV/NVYq+OrzXVtVLtVOaqc1U7qp1VTmcqp5zRc91U5qpzVTmqnNVIMdRz1U5qpzVTmqnPPz8/PVT
mqnNVOaqc8/Pz89VOaqc1U5qpzz8/Pz1U5qpzVTmqnPPz8/PVTmqnNVOaqc8/Pz89VOaqc1U5qpz
z8/Pz1U5qpzVTmqnOc/Pmc/Pk1OVU5qpzVTmqnN7i5+dUHPz98q6qnNVOaqc1U5q+hXPzmPz8/NU
VU5qpzVTmqnNTQ5z8/Nz86zKqc1U5qpzVTnn5+fnqpzVTmqnNVOefn5+eqnNVOaqc1U55+fn56qc
1U5qpzVTnn5+fnqpzVTmqnNVOefn5+eqnNVOaqc1U55+fn56qc1U5qpzVTnn5+fnqpzVTmqnNVOe
fn5+eqnNVOaqc1X+fn5+erKr9V+q/Vfd8/Pz8/tV+q/Vfqu657namr6vq+r6vq+r6vq+r6vq+r6v
q+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6qaVU2iqp5VTjnquxVUxoDVW4oooqqZ0HNFFFF
0qyKKKKKq3URRRRVU0qIoooqigqt1ZFFFFFzVEUUUVVM6qQDVbFFFFzVEUUUVR7FFFFFFFFFFFFF
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
iqyqsj0FBQRTFAjIx7XRmqO6qai4o6vRsjiNuPOuXEdUGc9C1FFfuKgMffPFGlavGvaonBQUZ1E+
JcdXxUCjfEOdGh0hh4849X3fXO7PVB6er7WVQXLy3DrVTGrD5nNZn1Pb79l160F0Buaq/VfhQI0K
iqxVTKqm4Z6g8KB1WqsgaGqCqxF2x3xKrdVq4+bvxLoDPmyg4hqrVXnquXxIlVQB9lpiggYRmFVP
4VWtQq2FXVWA0MUDwdBxKighQdQhig+cRCK8qum1VnEqu5ED8TmuOZqoA0oINwviRHhQRQVXcTmc
NZA6XEoKCFAoI9BxLqoBEMKWGs4jpYHYvKqAJdOFWVbHVchFzmqvVQRVdzVQZF5VBQUFUHNQVQUE
dAeqDLqKoKrtVu6CqBGqgq6qgD6a4rT4kgyZ6cWe4mcTKqAjf/qil1VQBcz46Gh1tzV+53NQ66qd
cWtZPZ2jXeifbrLNS+7nNTE9tzTXZ+dO3m306OaOtdvNbfkx8n9aVH696pK8z5090Jv15Rpr68es
Xme7vSoZil30U5q7WO90Ku2vZ7dDrXZ/Z7fuk+m8eeULV1k9erbXsz720s6Y6K9zum8fuXl0O5rU
6+/We7Zqca2p5vPZemHM1y+vpPPL7TXV0CmNe7afRM6Zr6QmaHtqtM9OmtJ+/dggUIQKVV77Ct90
9Uux8k4G6qoAr3l1UAW2fHQ0PTbdp53NQ6oFOuLWnk9nZRrvRPt1naH33c5qaodvTTb6dvN2+jZ1
rv5rs/Jjyf10VH6HvVJXmfOnuhN+vKPHlG8b1i8N7s+kpil30U50u1l3uhV28nKHtQ6vp3f2e3Od
E+m3l46G8t+p69XZ5uZ97fNLOmPy+07pvK2Xl63Q9J+11nu+dJ5p5PN57L0w5mvr6Jzud5rq6DJp
zm2n0y1kaZj+dIOh7almenTp0T9+7YKKlgQqr3yGvm83S6H2WTdVAFPtmV0FTZmerj0jyI1X89Vy
I9WVFWur6qcdJioq6q5VZ71XXVtVirHU1PPVcqpnHz5Veqebn50YZURTDvfWgV30fNQdO996Tt0o
87dY3EsqygiPz3h5ygq+r+ag781TzdKDnPG+apoDx80d856ioiqppGa/cygNUVcjdqsXzVVipq6J
aqvdz81VOKqcVbQHNVTKgiqyrKCq7Qdrq2rKqaVdVlVnL5u1X1GUFBUnPV3Y9XVOUHU2c+c1Vmq0
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
//9RXVfiq/r5lBUurKsqyKOOq5MRmqudlVbqLyqndVOarlVOKrkcePKqcc/eOoNQZkfQyuhq2gdB
V3Mus+3fNdX5zxc1TzR1NWGjjiPrOxoznw2X0PkUeo+faaiqIjUNWc0VXnq+KzGjSPqreY0V1dVc
uhyo5k7mIzH6GMY1X1NVOzqq0aoq7mNQVWMuq0Ryq/z96rNRVTTmj53mGiPHVeiqpxVbiqyrn36y
RdOaqxQVbVaNUUFVp1XKvqvniyq1G1z1WasyLM6VBz9omdVdUN1bc3aq08V1fJmVZUn5qnm5nHzq
zNaoeY98+syzXOHyojPFfO7cedN1dzrRqsa3Fh3z89W0GqqZRd85oqmqlA9X9o8q+qnFSZG2z1U5
bqKtc+zRVMV1eaKrOaOpqv1WarB3zxoyyoOePNRmPnTm56uNV0WXVc57bdW9qiq2aq5VtXxxxRKq
xVbquRdsoOerKqeR0FXc9VzmqKDm7mPQUGLtLMVbMNmi7HcfVVdVy7ureZub7qgyOOqxdXxc1WVM
fNU1PNEd80fPq2qHsbmvn0fMu7MecqI4jx6WWdGjq8/uVUwqt5Vczm52SznwtqqyO90OznqpxQVa
2ZZUxRXzVZU1War6PVY5zPMqDx6jwx+hquVrpz85xVePkV6iqarVjrEaguqmVXndWVWqrTN0yqxV
tB053Un6RozqKuSq48ffrRT9XmjyqwaOpW+bmqeaONHi5nQ9kc3Nd5hrPFqOKNPELqztV3WratRz
VFRVTKrlz0Cd89X53qarUVV2oq6g5qqZGoOnNz1bQz3PQVUzqenNzyMlMa7UGK2nQ9qr1DFV3U1V
w85Vkcw1zqK8PeXzVXKr/NV1VNKrHPFHVnePVBUUHPHzWegNz+Hq6q7VY1z8/Martm5qu3VZq6mf
PzxVFBl1NVo3NVcq9VG+l9T1WKrjq00Zr5vXlViq1VsT1FVZvEbXWr9x7NeXi6LtfSPpEePVVqoo
b55hZbq+q3z1W6rcdTznqtymqt1Ux5tOqnFtz3wlrsbJ4zj7Nva6UHR2pjRnH0orS1k7voVipI5x
TPSYp5F2u57SmDUTOHesZbeplJzuHN07NUdDmRULnZ3sfadFrPm+fOmabfW1ryV9u3imenXoiGpn
W45FrpetXHNpWfs5zmEgUzvyY2vaBdsc7qYS6Nv+Tf9ron6rzo8TxvSW6P2KXxzFzlzOvPPLEwtP
zeLrQJ2tzHTRnz9KK0tZvfQrPc1JzrHM9JidISLtdrSmKE1Ezknes0y3bUzRJzuRm692qPyhMbfN
QudnYnHuVOi1nm6nOmabfW1rxvt2mFM9aDqqXp4lzpa6XpHjm0rR+zVQskkeu0xMbXqXbHO6WNdL
t/0b+dLon6s6PE8t6xf3OLOz9O9t3OXM9PF5ZWcmC77rr3u+lXd2ZRx5HGj88fPVrqpxzdjtdszn
qsHFBEzVXojOgf2Og6fNUDxOovrlB2ZS85ophETC+kY6wq8UB6BTXWrT9quoDXrDc/NU0CiyMw8z
mPV0WNmqp3VYOUfY9Vg3fdxdKmhiu7quc9V7Mw0TjXTzI8w1TU0GGiZtK6rvNG7ocvpVcq+M0VBF
kdTUuM8dW6P0urucXQG7RUFAY1BVaMbOnNdXVdz5fWhn8i5qqYVUwqux81VKSZojHoczmqphVTCq
7HzVUpGqtOYN2qXQRxnqp3V/NS85qCrauqs1dUZQUFXx3V0dRVTOrrxmOsiiuKLpFlWc2RR1HS6E
6NnXnqzLqprQUJo6u5+h6ueVWFHUXQVXed9BQUD+0B8yqmFVMFFpmMaKgztHqYIKPFFkZRHoYqC4
z8x8oYqsoLaOaLnoKCqzUUFWx6NU1NVio5+eq5URc1SZ1U4s0dDV+GUZ013jfamjPQHOsVAma+fD
x1fz1N8/Q3vQ5zKO/T9DN0Eau+2dOptn6d6D4suKhNEVoc6p5a2uaru+RpUF6Ta5o8zKCYvq87s2
U0421fbtznedDG7XQPEQPVZj54qr9X9Y6vq7mNFm7dB0648d9bpOvQ+Xl81DeutF1ix9ihjdzZFn
UrQrrQXlBm4spnlFjiXONxCgPHVyi58jwzuzRpLSqOc/Me6irKmrqtqpiczPQ7yh6W7paFZ05j0G
zJa7UOb0+zjobv3e546jinrUWGyprYqWgmNb5FD4ZGyoqt811NlLqsVajboLxVBjX1oKCgy8SPQU
AoJiHeK+hU93FlAKD3VBFfW6BUlBuisUzx1NXUGGqppHdVs1RVxqiKrI+fL9oO3PkdBVjoKtqDZa
qv81Bzvd2b28PePVDHF13QULzI+nd76UBo+lBQ5fagq7HmVDxGaMjRRGvpVd6avFl4c10PNNR+9z
syuaoObrZubnPFhqjrzNE6uuLnoGY8dBz795qDKrk4+3WqnMxHVioKCrI12VX0BqDr075lBhzW03
l0FB1oFPUE46rhjUFBUGVBPRdZqIySvKFd1RUHVu8qbjiPh7q3nyOqnbPQc8aNdTU1FRV9T1Z6rJ
zHi5qioFTGc8RuftQ96F96BGji5jt0MeLSw8bvIjTEZxQxrtfXrQVdkXR9KHA8PQUDPfY3Ryn6nx
HoD5uq5jN1bzEqHpugtUITuqwc+VXua+aqmHNGarSr3hrwzquRVW6igVTZ7NUVdFHioOaq2arqm8
oD0FVigeKPOaq6eraCoqHURVZV1BQHq+o56ihSeRGN1XWgoak2zxHqYj8x+Y2jWtminLOdPFHNdr
iNGt5MTUz47xUCoHUvMtu6qc3zUC79N0HereZ83PQVWIsn+bmqvR1flTz505zdqGhoLoKKOLZscf
3KCc76nMO5w+TEdBQVZjj2qGg7THNQVdlBQugy3jPQboFQx1+brVYeKqnVVjnmoz5nW7NQH6myq5
zVU7Phoj0Hczqebv0s8cdDdK9U/S+mUNB35jm5+Y+z1MVRQxRvOaI+9XEacPHEbs7SjztFFF0j3i
mpiZ6Py0qB0Dw95jwzqzGufmWqrXVc3ePs6XXa+tFQRmyOgzxd/ZzN9Dx0FBNZVkdD27TF0HNV1B
Q0GY7fZUBaljfSlqFm7t88XPlBzuoqsVfUxxH6UESUd1dVb56rkWqDFQ96Ghi2fmqWaou2e3HzOa
yPocxsmKXH2T650ijmejzboGz0Hbt2FBGouezXlvKrR+fmcV82UEcbqy+eLmoF2q99HU51yq1zVL
qdR6HbzN3GfmP2oLqbVR2iTmb7W1dBQVbUVJjVWHkZ6sjqv0NBVtW9Isvmq7Kg0xQOgyIyioY+05
zRup5zI3NmUNVxVZUdDnoXQUh7qLoKAG71WtR3zXU9arpCJRc1XGqx0/Ta7dVfMeYnI7Magq2q/V
0R1aVBzRxnPHHFFjHRuZHbOkqKKk6N945rqsfrnEbaWroVPds3NSu9pUl9t+bdzsx2yeoSHvmM/d
x9jUXuOhptUKo0unbp3XZo0W3imp7fp308oboaPzyYnL33dAZ6IdJ6tQ0MRu2nPXfQoQnqFS1nPK
ZXaOhoT0M0us2n2Z6H16Xl7x68vfSchpkB0d948oaBY/XOI04lq+9CqFZualfe9ruqS+2/Ozudfa
eyhIe+Zcfd8/azUXuXQ2s1Qr1Lp260C7NThotvMmop7O1+6jvr4qG6HzzyYnL33vKDsZ6IdZ4jQ0
MRu2nPXfTpXpdpS1nPZNrt356GhPQzS6zafZnofW9JzvBHc5j6a6eX07dNlNbNFiy+eYZqrtVNTK
KqnNVPDVFVNbqYqDnVVPo7jocqphzbiqp3Vcqt81QqudTQc1VNqlVU279/h6C+0Z/kWRHiqKGo5u
azmvrhrq7nyrKqd26B88dVuKPmMeq5Vz5qCow1VPDVF1Wqqa27NQVFVPjVUgVU2fPVVgqpxVTCNm
71ZzxR1Wqqb1PNG7oKrdA6A7ZqB0FVP6qfxfLiq6gZrqpzdVMuxpcUTqt1bUboKqaVXqsqp07d0F
BVtBP0B6tNVYyoqsVNWXz96rXPVTXmVVMaA+L5z1Weer6viugiP1oFQI/y856vq+K6CI+HoI1Vkf
PFHU89BmUB+aOpoKA9A6vjqvc9X1Xuaq1cVVmq/Vci1UUCdX1PPQPnq5mq5Vaeq9QLmoKCgmm6A9
VMarNVqPniNQHN07ZVlVNaqRaqQ6qf9KvjqprVTegq+rVV1HU1UwqyrKiKgeUFB2PUVWL58qxnPH
lRfVJfbur6rlBVTuoq+q7HZvVQOIz7RVEzGeq9Vcq+qnFVyqzVTur6CgVX1FV0yqvVWaigVBFQRd
ebVVObzdJVlBOUDvm5lQZV2ZNOgoPtx1Brq+rTVdU85kqmpqu5QGfRtUB6CkjjmJ+goKCguouJHy
go7yPLykoMxc/M5yrFUxUFBSaoD0FWc1AeJ5dBHQXlW3fe6jO1mR8w9ApYj0FZJGurearqg91U2q
+qmFBQ96rjj6VfkbVVOKsPzUHa+aoxLKsNu7ioFV+VceOojvdBe77mKKKr4scdAbmugPcUdWVXKC
g5ru+e+fKvZiFVN+aLtJVSJVbq+gqpSMj9o8i5qA1BfN9ocuOhioL3QUHQ+o7iqNvLq+K9Z2ljoK
CgS5nKfmqvGju8PdVuq7V3MqqbUHaq/Urm5+eqmtVOjupOqCLnqKDmjj7dY+aqnNVyq7PVXMyrY6
mPniuqn5jHVKeqntVyOoNQVFBVTyrKtidVNue6qZRXVlSosq/KtM6vy757zvurOY1Ae0erasiqed
qoioDRHu6hxc/PH25soMj5+fn56mgnDPpR899LugyOpxUB46vs5jqgVBW7JnP0bqXQGs2XGj0HXm
5ukVXZ7nPQ3EqirarR6rJ41Qc8Z6iLmqs1NBd3VeurzRx1Xozur6mI9Q7q+q5Z+bncxdxcxusXPV
Tp1MXWrLVVOatqKs8yPrQTlTaoLygoKigVVNesVn7GiqD5HG6mKOKq7kToKqYo5+artvLzI1VeoK
qZs14ageVXaBZlV2rqrVy0FBE4lQa5qB5VYoMpV2x0Ga3cdBQVZ8ugoD7NHZ497y08qy4sq1UEVH
SOOg3nNzVXM6UDoMNQRZj7HjioO051Z4lU0BreROpzmqzKrtV3dWc+VXardVzKnEsqu0HNVeqRVd
tXUO6rV1alzUFVig5ufnygPEbHVT+pqp5VcquVU56WerKrdVip5qrdVyq6cxz5lmjVBHzUFHQK6C
zVWF7eKgoNXHed4z31PeVdVy7VBjZ356ujiyNXKZmztl75+eOrOa6rdVmOrqr1Vyq9nXnqud6uqv
VFBz0FV2gPZqCLtVeoNLMoI8qp3j1QboIqrEWXVlBkW6rNVmOzx7yOdu6DKtyIzqu5FzVbceHy5o
1Vw3OeqncdX1YfDx1bVStQGq+RVF5zcyjPUnVGsVx0HNQUHNR0Cu6CqwaqxQZ6rzSoI7uO8PGfvf
U9XZQHjypqDbWZHz1coqsvbkffKB0HNbq/nqzmvsYx5Y4qDtVdSjygqp3jWUFBVYiyKrDVWLjqs3
HkfedvLq02VXatclQlhz/c7d8i54quq+q7VfNGj5FEe6ryquVU8q+KqnFVyOPplBqg5uaqxUUBj3
VYqsY9ZQLp7dBHHe6A95lXHoOx46nNtGiy6syKLG8xXdX1c6rNV2qmdVg9ReUHWqnF3VZiyqyegx
xVXKrmVcapvKipqLoLNU5zG1VnlVNKr9ViqnEaugfPlWHd0CoKmgqY6CqntVKHMararEfOZUBnQU
BqCrjUF0FXVFBG5rtVnTnzmjqKjnPlVMKr11fVTGq9VTGqmNXPLSdWVZQGVAY/NVtVMav7urI5/m
Rs6dI5VPZ2dTAAH///////////QqACUpAAAAurvBlRH//////////////////////yoDGMive6Cp
oPlBvq6CM9XVMdQo+fnqypNVx7qy7qXnOa6GqnEVBnM8reflSPp9+P4tVEc4855KByZ0dfIu1pqX
XRdI+qne3ZpZG5rx97xCgtGZmz53jmKa6GJPqlh1255x/O8ennTpONTPagSXV67XM47azr8zMzZ5
KnV9es0mpjtd5fus3ffula966mLt/EQV9F97pN5r6Pg7Zqo55x5UyRUFyGTr5zdrTUuu3RdeegU7
a7dmlkbmtN301iFBaMzWz53jdNdDEn1VLmHXbnnH8oI9RvOnSceadAsXV9unY8ya5LeZQfMzM2fy
rtX163QaTUx2PZrXus7XQUCy1rr00e219+Lp0XfMVs2pPjP0oEeY9RupunlVNqmrz1MaqpzFHVTa
qmcdX3U89VIGVJqqdxo8eVXVVT6rqg3NVSPbNFz0FTdRVl0B4oqqdmqtPmix4Y+RajqY7x4ZUEVX
+VdVT2oPVTI2c1BHVkd1U2qp5GeWrmolz1Uwqp9cVTEjUHPi5+ZnqzIqrp6l+3VTGq51NEeYq66q
Vqsuq6c8ZqrNVIt1WqioqpIcZxe6qc1U8q6qkCq7QUFmqKrnNVeqprVTa6lHoOe4jZqq5GaqlDnz
nuKcuq9UVU/qp66rGVBsq3nuqmVVMqrtVMzRVfVbqppdVNaqcVU2uoNlVipjuqnlVmqmlWVWKrvt
VKOVfzuq9HfPVTZXVTSrKrFV32qlHKvoKrXPGzVU9q+raqfuq9VTCqmfP5VYnKrF89RVaPUHq+KK
qm9VyOOqw6rdXHqs1WanndJiPV1V2qntRVTGrKr1TLVaqtmqsGPUx1FV+KqnVVIHNMOqnMfPQR1F
VN6sqDRGq2q9UsxqrVVMjOrTVUzoXVTqoquVUxqpjVTOq+qqa81V6q9zVU3uq9l1B6iq/ctV+qm3
NGfmSzw9VMqr9ViraqSKiq/V8dWVbzVFTV3Njqv39qplVfqv1W6rJ6rFVOartVKdXGq+qmFVJVVP
KA2VZzVW6CKoqpxzR1J6uq7Lu4o6mKrI+bn8jiineevU1WPU6rdVON1W6r1VO6uqplVTXHdTzVU1
nMjq2r+aq5Uuq5Vej5qv7c9Vmr+ar6nXPzRVddREepcVW1NRUxc1WVPTt26VfFz2ar8oKDMnFVf5
quqyo7DnNU1WT9Oue1WKuNH7z1Y7xKgMZzGXlCZ1WKl7hVu6r11bVTaq3U1U6oaqUqrZ6qUDxGqY
ub51q+i56voKu5qvjoDmurcoKtvmqtZ5Ut5QGOaq3z7zs4++VWOeqxQUFznU1/I6rEXNzx1EbPVl
7q/I6sjqtVMUdz1RUUG99avnIj1dkvNcdVnNUFVLdBVSFFdVioq6rnzVZV1WVHPz7qKCp5pea6vo
+d1WavqKv53UC6jeRR1OsVW3Uc86apq2q5fNEf7Vbqp5GqsygqpzOLKqUMqpjl1Xz65qx6rTfPV1
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
hV1BGnlVPqqUKqY1Uge1MXSofOlVf5j1bdTFVSHFVSKY8Ruc/Wq9UdnQUFxRnyqnMdx5l3U1XrPe
VbVnNV0WVEOeoqvVFRVtqqyaqnFVw/a8qptVcXObInO5UZzHfMjLR761XKvqvZzc1WdKqc1XKuqv
x8+tqoVxZHz1W6jnqu1NV2oNVcqpzRVXKqeVX6rtXd6sq3mq2qmPY1VyOq1V3W6rqiWHveYeK+0W
HeuY9WTvNVcqI+eq4d3U0HPQWjxc8/Hz6nJyfNfaOdpObniNGfsY5z805N94rw9nXdGTqpzdTVmH
qaujiTyoj5p24+juzUZp3tq+pl5HmYuju57r1VReM9VmKOp56rUdV3mqpqapqpiaq4e+c3WrueLe
c3OazLnis56vXTtU/KvqtmVV8x+uaPma3VtV28fS3OHPVdis8VQzmazp0WHNU44+aOOKp95qqfRV
F1Xeeq3z1Xai+lvpzOKc3cbNJHFMRZ3in5rxzpsmKmQlzq+c3U94/HiTNUzluaqear2bMPVkUWGz
mqunyq5lBV/Mj83aqmFR01zHjqvn5z3HzdMaqtVXcmO2UMVVwe1WKijVW5l24qrt5FzXUZ73qw9X
1Xc56mqnNRHQVZVTHFVVFoKqd1X6qf0jiPVrq+r6qc1f0q7nqpzUxmqzLj5rzUUyzOrKDpuKcPZq
ulmMi5qioqLqb5znixRZP8/aI7jjugNHz1NVy3Uc989y4aza5+arqu5qg/M46s7ezOBKJGPmWej5
r51Ga3fk5Umii633pM0o6g51FzN83PkVVjmSqak1VqrZ3nqauvm782c1AeMxzqqxzxc1Vqq2bmqy
qwrmuYxozRYa4zVX6nOaNXkXPVTGqz1ygj7c661ZUWcxzo1XVXanItKI8cSVGfIzc+uBJqG6rvQ1
VnmqpFjuoqs92arqiqmVXVdVSpVlWmq493VtW1Bxc5Va56uqtRx3HKeoUc51UVSsOcx/cj5jN1B8
cxeRHqZ3mZqk3PijzLiXRc8cdBcVV3p0tWap2zXlu+9nMfFQVEzZ6BxHF7Z6rVRQ1Xj1U4qeaq7V
tVgybi56qYVbV11Z25siPbqtc9VuqxUc56rFVpVO6rtV+pq89XHq89VmoqsVXN89HOzNTVxz5HV9
TVZ6VWlQVbVSFVdjoajpVdqpzdvI6hc8p5iKpc4zHNZ8uLnnfVePmPhzasxkeI+R5jmz+VbVaqYk
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
Ycj1zsaM7oOtVugVBlXR96uo6A0VpqguqnFBUGfWa6aPGpijd95nW1faRTp2sOsqTmt3epcR2jTF
9u2NTe9dvPIux76e0a7RTDnGvH4lebqVhzxtS1XKr9Vg1B23HV8Y86fFLfSgfSo3Qa6KazbPN95e
nZz+vO1tx9FKqLFcVkc6m3FQSt4+8bV4+aoPzn3Ga+nNnriVW1fzXV1W7Hq3O326M+H1eGt5jl1e
euXs/LztOJXuis/TO9+Ufvb1OaT82ufzNa93V3XMq6LIoqtVVqq1VTOPLuO4quixx9L56sqLqN9K
vuMaoKqYc9Bq+egu46Cy85d+Q3rYqIj1WN5V0dRf3pQPUTbi56mpP2qtVU85jR82PIzXlBVc56ir
I+a+t1WKCM2rjzrQzlTau4ghedqrEVVMIoubtmorqYzzdTVcWKq5Ummqsq+6DOe+zort1Zv4PP4H
Yb3Qo/u0Y9Bs3dH56GOhoetB2ee0XbnNVmWh5Ju5ly780/fLml57curmEqHanPbz8F7OrDKcSlMv
BOk8acv8fxryiRd+UFuc3K29Tet0XRdr6zc/STxfVy2/MZ/WqJ5vazpkxO+Tu8nJHui6bud0vfXc
xmavG/ZmcNOTrtSXPbmPKNK968maPFOzF9tTK7SealRPT3MdJm/JxS6Gi5eXt5q/dXNLz08ur8So
eynvT5pezqwynEkZeE/N48uX+P415RIu/KC43ObltvpN63RdF3PQUXlJPF9Hlu/GdNUTzfbM6ZMT
vmp3ebke6Lpu9Ne+sTGYtSHNbnJmcyJTt2pm57faYmKNK96cxNyYp2aP315naR6lS0+0x0dbFfmt
5vTY3v5vrGsPZ22ndV+oj5jvtl0CTOarMmqA2dks6RLv3dQMU7ZHDnPz6V88fZkaDtpuRx4fXScv
o854j81B26KrEjnixdPDp3FdPrtdBb6fbxnPSm6zKoMR+hjXz87XP2y6rlTHzRsa3U0F89XXh+ag
56mOg54/JxRnpnc8ZHPlBV9V+r0bUUZ36R7UGZiq+0aKPOsXTF2zFV9o0V1deYc2UF1b1mj3VnaO
dKxxVDiugcd1cj5QZlSlZrVDijoMvTygNrcd9KigVAbIz6nKmaNQWtzmVJ6afNaquVXKI09jjU+3
2JdjEEzI7Vu+bIjWfmdSuY8e9P01xM75sqI+fso+lBUur8jfXo1nZRUHZzT9u6FdHmKgPdWKhPHH
1upnJxpd/DZnW7oTn3QuLGUPRKcn8oX27zDM7Pi1FGqLtd570vvZuk92otJzB/Na7HvnjuPmq6gj
tVGdauq/rz95i93F2ZpreUDedO3uIsbpesdXXv32YxGV+OLKU1mspvtRH6Tvfp30aKPKF1fV9WVP
PdxTUk5NUCWUGYu/bt06UKT63mW+xsPQVCoMNz9KA14bPImSSygai7Gzp2eo46jpTXrcV9J7XZ+0
HPmc9AdHjiNzns+Vb4qA+ojNtax8zijP0zLTtm3u7XY2du1JJ26OzxqeVB1vDUfk1nbHnQ7nPem+
1ypXMnfbvm6FadAnIc5+hsy5de5P2zKa60Dnm76a126Zz1GHXYk1m77EorZ1NYouzPOTyy30VPjd
5I+1zx0kuYoUPFV5+l0GGtRTh7iNlz9RiXPs54qiPKmN5e+3Tc1ORHRr6dKGZvNzV5nl++d5mhS6
PyIlfh7zea3nft2tdrTnDUBqBrQfNzH5qvquRXeZQMzcdXxt0Ci5nHlTHHQc6jWGzKssx8oIul47
joKrh8ypzN0E1z4ql89XM3Q1B16HWRGVC0fsnetWz6w3Toah79nMdbWdFnSLfmruRFmfDJn6Ejm5
6C6iLmii5jn6dtVJjdKEa5zXvPLvfMf538oaGe6eI78oFz0B6nmqp5z7ioKA9VvOaz80R77VHSqx
zRR3kUeqDWZnmdDpHyKgw1C+x76YnffNa3mWc2dt9DdKHu+1zHVREvGtbyeOne+a/aqYOgXaLXTr
UxaoedGvN3zbfy/KF0PRbP5Qds7R9Apg3MCPS6gxua7PhsBzRx3lx9O1Ajn7Wfr26WZtJzWt+ZmG
7Wu+vGiUV9M30PtKgPVu6rx8NVYXrNh4+lBU4Y2Z1fPz3Q85qtjjfPHIZugoOlBbxOejLGmN51dW
Z3fbqo48oOa6DVDUqzVZ0t40dKKI+HvUfbmUZ9dXULmSqypzGqunaDXRxdFzc1mMYdXQtxu0uiy6
l9nN522qduKrDR0FmqLoFkia83Lr1+bzou85397b6dzd9e9JiZo/eu68z3v3vK3l9PVLR9cmku3Z
d5iczXkXPJJLMb95ivWst6vtQKY0s7+Y46PUwKPUe5fJerRXD+zBl1zvo7dy5750ztrsT107Pcu5
T9jdpxdlvsS25d9PNS9F3nO/vffSgN3165jdH71rzPe995iVvL6erdHOdcc0l37qgmJzOnkVTMyS
zG3zFaD1Rb1fagUxvTzKDzHHLqYHmo94/PaBpFcj9mDJdc79D43csmerqZ99difTp2fb3ej9jKcX
ZLW+xCXcw5Vvp4ntqgtZjjodLmPzur6DKrVVs+RVX6qdN5VZoFVTjfPVTjKryvL97YzZ0tPx4+3Q
/lp65syqz27oxme075o6uqtR9oua6G4qrGY+moiFo9Xc8W+fmpciw5qqcTFNz1XVVaijj5z1Xqrx
zUHPQOq9VTCq2qk+utTa6Hw5qmM/Tni5+fOegU5FQWfn5jnioMoOZc5lOPmjWUNBm7oLdBTRm5ry
hoM3dBd3WoOlXOazmObmy46BI6pndTzGqygPfU/P1PQUFe1Faqe2d4+bOagzKbJiLndmq2rI6hKc
qFVYqpjVsR47qT9O17oKCgjoI3V/vq585nrny+kW/d5Z0fInmKojqcq2gfNvnWUFTQ1XKDo2qsqa
uPU81XXz1FWOqzVTirau5j0J2+hud733OagNXKXmR1FWM0fNQKq9edubMvpdBi6Rb6TyaPboKBm2
dZ3a6besM33u3a2d3ONPO90LTXTtlRl8zj5rPGZ1Xmql669Y5pPXW4ilCa869FS/e/asvTG79Wme
6A0U9tJR0F9+reHvKCrTnoDPtz1U4q+qkU+jxc/TvzZGfK+R3eUBuY1Ga6s5t83TcXY8XMeLIz3F
dXRXd7oY5xVWT5V3arebmdHHb8rX3o9C3Fmd7Idr69818o9a7d06CgvXNzPseaq3n657zRVUwq01
VOaqc4ftz36uecPNbanEuuz5ZztH82fUs5qg1260ND0s6jzsupo5pc9mztZ+28a79Do5sjtHoYnU
qPqpygPvedDY0prCEVCegoHQ2bNvdBfbtQUtMzZQXvVqjda1269LygXdZ2z2+nU/Y+kttdLfdUFH
vDWu2eyTx+e+3N0qu5Qc58qcNzRxc8UcdXPDUHNj5lQVZavtQZQUFBvIo331Gcxos7ugtYzT1rzt
3+nzUxQZ3iiemsW43QR8891fQ20qmoqT1Buaro7qKuMQqy4+eq5hqvPVTF1Cq+rLNVcqxdOepvD1
WqqZxVXajDVU7ibdVOL71NV+z9ObO0fNVpmbZsDu4o36rjoKCg0rRr1zEO8Z6G8iyetdIjvKTO5o
+5jRxm3Uc56CzVNDHHQc1TcVVvnfeOrKsqpzV+Z16UDioO0fylt6joO8XZ0Ftz1znfa7YfpHhj0F
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
TXnk7mTke+qQZp99Dejz3DtTieLDXFQSm7b1VuXU3UtNKeaveVZQ96nbqT8981X1M7uPnPPvHvre
R9e2zPFiPlJh86ducx+3ObIzxGfZPI9HPIzxu8nPLvLNvfbSNo/mtXFjUXmZHqXp5CqzQZFnPFVZ
7x1bdXire3PEY12aoHP15qv7VXKu54qBrndn54qnmq/nzD/zzZmsjq6PncRqsi5o6vqTc9V3rFkm
KYtx2bv0vOytLsn2aHSI/bpzRXbPkcdTmKPHnS47PRdpyKI2GRlQOjrmUtBz1WanLq6pqarNWVbh
qirKsM8vnnXHS0N526b28X1LKTD9tGjnprnkj5zRs+vuOPD6dKeNxyY7w9BV1447quVXcVx1dzrr
mVWTRVNTQdXfM33yoiu99ss/Q/fLGY8vcdt3HH17mPnbolavMOu3Zvt0iPzdO3PlxWz5HHFmVOKP
HmHPfS46LsPTmMeq4xQVea6T3yQe+wuYjftDS313lGhtYddjzU85OfnjdJ5mM9Kc7kjyz4mfnPFV
lmdmVq+epq+gurjxYeK6mrjq6mguNx887nbqc0XdZt0mHx2uh3zc/fRoo8iuOOKNx5lTh+kZ+l9n
6ojKoNUVZVtRVtWc/O6RRc1qqmFVnMfPG1PTXPeWfmSnpoUmS+Zz88dQ+lSvTVb9yPKsvnoJefnq
6cjjqv4bDnjqunNdX1WDKg5qh0XlXUGXUVUzqI3EaqnFVyq/VcqudF4uvRdzZvnVXRmPz4PbXQyy
hP5o3Xq1er3LOVU5cVxG5qrFRFURVX6mq7U1N5HV3c11dU88cPEvknxWQ34Frv5vaXTTmNzF0itK
z+7I+XMVr69t1966Zt9Jzp21cifTe++k9+X9QvLfu5kjbWUCXfcw9Ds3zudXnboc1517V9yaXm+n
brOLUXav64/vvbH6rdnzWu2tFclUxvteHxTXSc86b3l3hHv507dNqzXX8k87FIa7+LaXTTmNzF0i
tKz+7I+XMUl0Hbet9OmJ9ddO+DR2r6b29IPfl0aF4d+789u1rKBLv2mr6Idm+dpa879DxXneg7V9
3Jj0pjsOvegnE4r7ar+sc497Y9K3Z83rXbWvcelMbVmjxXNdXMde28tXnvfzp26byzXX3JMdFFJ2
NMpdJKTmUVXdOaLDdKsuofs/2ypoMuKgmeioD3OUGeO6nI88Q81eLHnr9e1nNM7o53bW9GNntB5r
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
OynNb5/EJhbvNXv2cfa81MdELfyY3OEOymvdTHSGuifNF2NrrGuainMN2nPMe313ilP0326bWr10
1OdKHpO94dhaoluYYaye2tk90dCpxHXbPgobirc981m1fXtHbz553jKDtp9hr2dvJ7U5OZ09N7S3
nfs8shk8rnR08Y132rq7Od1fVnNJNa6yUE1NOd3faTv2trtrp0dBNT/bcxRY7ygOo2rPHz8xjR1F
9b87vL5uahW87Y8vKXNbzskmtfXOb7ds9mkryg1GY04jz1Cs8uYmd3rzJg8ypqhmp7y3HQ6zV3eP
caJ7nJrv3ml0nJ3ppLxdJ07dDOdW8dB29nJhPrv3Ok/RSboXOe5Q+dnaD7c9Cc8VC3jPFs0d5zug
UxmVPNURaW+25ghUdepDTRCevzF5v7c9r3t2maHpvI7mtJMa2TRCdvVGp6Y6eanAimpqY9s0VFzZ
V7xurquXM+lTlXPmfPFbqHHFzn60GVcfrt3zZGUa8q1RZZ72fVVqKr4jT3PrMPqc3MZOFNrr1554
pPO/dzWWs+zlD00O09JMaUeY6Gzuu21zdrmDZzXVmVPPvObKihqKsqTRTB9qW9SuSo69Xrp69Ih5
mp9bHns9rfftNTIe5rLcVz2Ko1OH2zBI2MzXP0jMlz3buPW81z3vJi95MamJxFF1686np4oUd+5N
T13eKc+0K6DtqZnpjSyPKFx6rtKhWd99otro9mNJLtXro31XT1zSydpFvz177iae3NXzLNpc+9vm
u2ufpVsWzvKF83PFzOY2QzRCYo1Oc/Z1HXpPKaWXPEPBd0M927TEzp0MeW52O8iNHQGXWruY5z+3
etRZa5776Tji57mt0dBl6u9a6XeUPnTVxTWUB6FvFq7cR8qxuylmuh5o/kfixHjwy0c7TfU+Ce5r
obvMyO1lzHbp22tea71gehjyZPz+ZjUVRboPIvPLqxxp47XMHXuTeazyc3S68u173+zTnvNPPL30
ILdZb3039pV0pdjc5Me16w08iWB73Ofhv3TS8k9JPzvo6Uu10V9lO67TDS8LE3SKY0KV0qbSN6lN
Ti83n2ak+5S67UT9tTDS3f8TilWxlJ2nfaH3sCBaWBBuTZukeTE5uXpq7Xvej256d088tdKVbUi7
b6b+0q6b2Nzkx7XrDTyLujBxb3ot2z49NLyT0k/KDpGlLvOivtk5OvSmGs8LStqY0G2m0jelElOL
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
Mpy0z6tGPhj1BlvewfdWGutrwZGpiXJjPRvrI37s3PzxVprJpV9ZdxX0oQ7q5PMjfMf3rpTO6Drf
ZGO9VrScToOoWu9B33hsVD2EV96DvvDZ0oaHts67O9KU+us1QUB0kjJ48oez6rL5vJik8vtnbWUE
0G3u127s10HURp5Q3gyioD3dncVeaXa4V1uK67Z8Fc2uz6Lx5Q9860BxOYu2TRuaM56GhoKK5THo
TZtZ0vr2yYWVtdoteLs7YfviivcV93t349aUz5vO0508rjV6U4PJxNfPUftrfmLptao/OnnasNDw
IPtWCONR9Lvojcyutd7oK+++vPvirPp7qkS6Vu2u050r57Od2t/d7r7CricWNJDOkbXnbmoOczBT
UrEmeVneZMJ79thbvpvd+bmKTansvI331z1dmu1H632ZHrR1pB1uvL0f3utTGWvnu+3yFYRdb3V3
YOd7YmzHNuv0uYrTut+3u7uTWx8345rM7SrJycaW1qvNeIjty+5JXQXaylbaUw0FLuYSrYnSBYI3
toPu86V2Uk7Vvo7XX+3qk7dH0rbHSuvR1Vav91PefPs95XExqSc7Y/b16N0ZT2v4VndFLKXcPN83
Ol7e+l9M7PYoMPvZ83fiZhMdtetT0uG+jxamJzWb9Hr8zF7J2a3fvs5MLOmx4tLelLW12sz1V1Rz
nt0EvOahxDd+dIjJeOPoaay7q7cW/fRXi6bNHeubFfecXNHlBEqF7MrrdPN9JqZ+nFuYnND3t7W+
1h5Xe0u2Q50wo117qceTWUB0e8VmfbOlCu3mu/R+TgN9396eKcmO9wwa8WnIhqTa1PaO09qq8vcM
bXMjc7nqtj6dplt9rtzHdLx9N+dOkzMD6e5ckuc1rftbt76RwUnjk2lq122dip0IzZX81W6d3Ob+
7HTyY71heejxVtOQLS3q+zDPiFfFnMl16zW5K2zGeG6eLcx2WXkplIN60N7rY/VJtDV277ZzZHGm
dKLWuj15O/W4tTQxmjjzd3UM0aLM8Y6dDO6X3O6Co/KBmVa5zp50npxqYxtUFBNbn1fbqrPQLd9z
Zmc71vn54lNOgvvUROLI6BjdJMT5Ab32rCv0rYvS3k157V1nNvtQpJG17u8oOLpdizbluYmJic98
++Il5Lfk9y6DzE/MU5O9t9N+eMJyLYrp+WUc4Ra9RRFSGqT7766xH3Whrdekk8pUU3MoLfr89rEg
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
wuI8DB0GMQwYE1VEqoLDhkB/fJEUkfgHT8Af8b7KzXgnezhwiM7m+Tx7uerU7ueo3wkPZp4a+Fnh
b5oSeWT3SeEt6hBYWSzOc5BqWI5wxkssiPFABljieDFlfKkTY78ON5+TnfXFkRz+CsnnieeIeOJ5
81ylRDhKieY9nyLSXfwVk88TzxDxxPE5rlKiHCVE83wPjfkxvww3m4nM/BvejicyaaUCxTkphy8q
jStY/Z3GKQFRdF7fm+D5vanxO1PB8Fe1PB8RezwWmrngAcTpxtwsALEAshE4wURpIiQ4KKkISDDI
IaORnSABOF6pOhNYiPODznAxvODzoeQeeecThycpOlvYznnmh6KJeeeewArFQ8I9QNEAA8cchOBZ
eigSCTzfN83zfN83zfN83zfN83zfN83zfN83zfN83zfN83zfN83zfN83zfN83zfN83zfN83y4R7V
7V7I+D1fN8883zfZ6583sh1zzz5vm+bzfjenrhZJCtYlPgB8jJvhAB5BFDBNzo9PwsOaHwNtOLz1
8LyS83knPPP3z4qssVnOidHyLB7ODkD83FHrjqnAAamLefPBebeTi3zahzzbb55t5inIWKGDkBPm
DAFFSC4XEBJF1EQSDOCo9okSAOKeEALhE5CDyPB1fjmnxvxEhj1dNelBIoJBOQoeU7VoDFAIFHpA
t9BNAeOrtbtQfN2t8z5PZ2dTAAH///////////QqACUvAAAAfp9rThH/////////////////////
/xbficXBvx8pyW20AIRsWnxO3KDfAAchCcCjhkCC1DYmGiQ7UyiEt0ORzk+l83nm3m8348hhQA0n
IAQE07YezwfWTtCIcyCANuhadGC9Hq16PZiFOLj6t+N5588882/G+bTTqeIcRHzP2oNBMEVCqwLh
RJpRNA8DAuEcqHsBOQ3E5t5tvNvxvwKABWgAQeuFvNJiczk4ODpgnRDuFXtiuMVoEVVIrQInN+N5
tvPPnnm2/U6E+tFOUQHQn8IDsI2wzoMOFBjE0M8idQDwJ8JhAE7ZEgACE5tvnnzbeb8efN5vo8vW
bn2jLqAAQQYdHwaAogk/NgmCQ2IAB35qfa8/H83m83630dkbErWkcV+ZpVjlThfodo/EKEQPLwdC
Jh8CVYBS2834883m+bycXDvm35gJiWn6KadCewaRCHJ4AspX4A2oFBKB0EJHCRMhADpvNttt83wW
/Hm23m822236uAeQK+zs/L0Kiw5HOVvBL28Yez0JqQcKtVBXPN5ttttt5828883m3m2+bzfNtxHg
RKJThROwQhhBOBgdIJzRCCBicaY8FQDEbOUO7TQPBtkQIOJ2WF7gZQfKAlvPPm+bzfPPN8888+b6
KKhiKchDUAocpnIqBQwaGQQBsO1eCklirkVlisw9gclirQSTnnnnnnnnnnnnnnnnnmjLAA8z0h7f
geQfT6Q+B5aKnKZymcipyfc5PoAExPgfNudFfoeBPiJ4PofHE5B8ORPiM4fm+BPInhTwr2r2r4Pa
vavavZTt65+PR5Cd8cdRUwIOFeHJBKhTgIAJggAIMQbI88/H5PavamSEYBSOrAA+Z0JwWeQEkXm/
bZhtRNQ9qdPZLoRhBQ6WrDSlIQ6OWPsOj2+38zEpzAUB1w5A6PbEezsl6c+NIdlE0QMsOxKyhXwY
xqieX4NT4J0AHg4OSiRoCJwJToSOAJ2csjsPuSCuCU4O3sU7V656XRASgAAQ4EpQiJQfACACR4F7
UgACzo8nwE9vme50N7555555555555555555553vnu+b5vm+eE+B8259BORPiJ8cTkHw5E+Izh+b
2/Q7I9q9n0fAvavbDwJ8Ht65+PR5Cd8cdRUwIOFeHJBKhTgIAJggAIMQaR75+fwe1e1MkIwCkdWA
B8zoTgs8gJr2h9cCYbUTUPanT2S6EYQUOlqw0pSEAZ8Q6Pb7fzMSnMBQHXDkDo9DV7OyXpz40h2U
TRAyw7ErKFfBQuqJ5adt+adAB4ODkokaAicCU6EjgCdnCQWCv3WCmKU4PRjiNQU7V656XRASgAAL
wJ0ERKD4AQASPAvZ0CPLAOz4Ce3zPc81ONDu+b5vneeeQvm+b5vmhzz3fN83zfLQAAAAAAAAAAAA
AAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAA6qlRVVUAAAABCRKkpVAAAAAAQEDqmsq2W2ragAAAAAA
AGLGxowgAAAAAEYMFJVGwAcAAAGPAqqqAAAAAAACAAqqvVVAAAAAAAAAdqqgAAAAAAAAAXqqqAAA
AAAAAAVV+9VwcAAAAAAzrarde0AAAAAAAAHW1slsOAAAAAAAu1ctd7uuwAAAAAABe3uqq9Xd292g
AAMAAAQAAI6NVVVXA4oFKBAAAAAAdqqqqqqAAAAAHAECBRawJILhgQlXNQtp4OGkUBBwlgBHuLAC
FEQ5QwwuQtQvQ8QyQ7Qzwsw2Qsw9Qtwyw0QvQyw2QtwxwywswuQ0Q5Q5wwwyQ4wwwywyQxwtwtQ0
Qxw2Q5wzwyw0QyQ0QxwtwywxQ1wxQ0Q0QtQyQyQzwvQ4wtQzwzwuw2A2FyGiFyGCGOGeGyHGHaGC
HWHGGmGSGSGOHiGOGeGWFmHeGGGSFmGSGKFyGaFqFyHaGCGyFyGCGeGaHeGeHGF6HiGeGeFyHOGi
F2FqGyGyGaGyGYGw3Q3QxwtwxQtwzwxQxQvQxQuQzwvQ4Qxw8Q9QxQ2QxwtwvQ4QxQzQzQyw4QuQ
tw7QtwuwvQzQ3Qxw7QtwxwuQvQwQ2wxwyQ5wxwzwzwuQxw2QxwxwywzQtQxQzw0Qxw8Qxw4w0Qxw
xwzw0wzQ7wuQyQzwyw9Qtw5wywuQswuw2QzwxwuQ2Q9Q0Q0QvQtwyQxwzQ5w3w3Q7QxwtwuQzwxw
5QuwxehC1C3DHDPDPDPDxDvDJDLDjDxDnDlDJDHDtDbC3C1DNDHDHDjDFDLDjDXDtDNDHDfDjC7D
HC9DRC9DJDRDDC5DHDFDlDLDjDXDtDRDHDfDFD1C7CzDHDvDJDJD1DJDNDNDlDNDhDjDTDFDFDHC
/DHDJDHDJC9DjC3C3DZDHC3C5C5DHC1DvC7DDC1C9DvDHDHDdDNDbDPDlDvDNDLDtC5DtDFDHDHD
dDRDxC5DHDjDNCzC3C9DHC7DZDHDPDPDlDPDHDFDZDFC3CzDvDHDhDvDvDJDvDxDPDbDFDbDJC7D
vDHDjDjDlD1C3DPC5DJDLDFDlDdDtDPDhDvDPDZCzC1DHDdDJDHDFDHDvDXDPCpCpCpDhC5CpCpC
pCpCpCpCpCpDnDLC5DlC1DHCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpC
pCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpC
pCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpC
pCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpDvDvDxD
PDHDvDPDHDRDPDHC1C1DlDJJmIVHYYvShidhihikwBJC7CxC7DXC1DNDlDnC3DLDjDJDjDNDjDJD
HDHDjC5DLDPDxDDDtD1DPC5DtC5DJDHDhC3DJDHDNDNDFDJDfDPDPDZDHDDDbDBDNDNC1DFDBDJC
3DHDvDHDJC/DzDhDFDNDJDO7CwML0L8M3oQyesK0LUMnoQyevgYZPShU9CGaTRDFJkIZIZIWYbYW
4doW4W4cYeodoZoYoc4Y4XoW4eIYYduQuQzwuQyQtw2w5w5Qwwzwyw4Q7QyQtw1w0QuQxQ4Qtwtw
5Q0QyQvQxwsw2QyQyQuQsw5wzwtwyQ1wzQzQ1wzw7w2w8Quw7Q4wyw2QzwtQ2w7QyQ7QxwtQuQuQ
yQuQtwuw0QyQ4w0wtw0QzQwQyQzQ5QuQ7Quwtw7Q8QwQ1wzwvwsw2wzehDJDPDZDPDlC/C5DbC3D
lDLC3DDDbDnDtDHDX6EMkMkMUO0LsM0McLsLkM0L8O8mQhmk2QzSZSGCTAFELcLkLkPULcNEL8Lk
OcO0NcLcM8OMLMMkMcLcM0OMM8LkLULkLkN8M8NsMsOENcMcLUOcOUMkMkOMLkOMLkM0LUM8M0LU
MsM0MkM8OMLsO0MsMkMMOMMsL0McMUMcLMPUMUMUN0O0N8L0O8LUM8MkMUNMMEO0O8M8M8N8LkLM
MsLUMsM8MsLcN8McL8MMMcM0LsMcMkL8L8OEMkM0MsM0MUN8NsLkLkM0MvoQzw2wxyaIXIXJNEMk
OMMkmiF6GL0IZoZoZYZIZ/QhnhZhch3hbhkhehnhchshihihrhohehthihjhdhahbh4hwhnhnhxh
nhnhbhnhih4h4hkhjh3hjhrhlhrhbhbhshnhuhrhchjhmhyhbhkhghjhjhjhahlhbhjhihohihmh
ihohkhbhbhthshlhlhlhmhbhlh3hdh2hghsh4h2hl9CF6F2FuHL0IXIcYeIYYb4W4W/QhZhohbhj
hdhsBsmiGD0IaJMhDLDLJohjhchmhxhahyhhh4h4hxh2hhhkhkhi9CHGGKGeGOHOHGGKGuGWGOG+
GKGSGGGaF+G2FyGaGGGaHKGOF+FyF6GCHGFmF+GeGeGeGiHiGSF2FyFyGSFyGP0IXIZYchjk82WG
WFuHGGeGaGSGeHOFuGKG+GCGWHh2FSGaTAEEMUM0O8L0KkL8MkM8MsM0O0O0NcLMM0NkLsOMN8Lk
M0OcLcLkPEOEPENELUM8OEM8OMN0LkM8LYNhmhihxhohohzhyhehwh2hwh3hnhnhmhghxh4hth3h
nhxh2h2hjhnh4h4hkhhh3hchmh4h4hjhkhlhbh4hnhmBsMkNcNEN0OUL0O0LsMkO0M0McNELcNsL
kN8LUMcNkOcO0L0NkO0LkO8OMNkMkNkMkM8MkMkMcMcMnoQzQ7wzQuQuQyQyw4w7Q5w8Q0Q4w0Q7
QswyQuQuQzw4Qzw1w4w2QtwxQxw4wzwzQzQzwxQ7w2Q0Qsw7wwyZxtdJmIZoZoXoXoXYXobIZ4Y4
cYZoZ4WoZYaIW4Z4cYXoZIaIZ4Z4ZIZ4bIZIZYbIcIXod4W4cocYZIZoc4YIZYbIZobYYoW4ZocI
cIYIZIaYXIY4dobIZYYYZoXIcoYoX4ZIYoXoc4doYYY4bIcYZIYod4d4ZoW4WoY4Z4ZoY4ZIYoYo
d4ZoYoYYXIZoZoZ4XYb4c4ZYXocYWYcocYY4YoYoW4aIXIYYZ4bIWYY4Y4ZYX4XoXYY4coW4Wod4
XoZIeIXIdoXYbYZ5MAQQzQ7QuQzwsw0QzwxQ8Q5wywxwtQzQ4wzw7Q7w5w7Q3Qzw5w5Q0Qxw4Q4w
4w7Q3w0Q0Q5w5wtw0QyQvQwwtw1w5w7Qtw3wtw0Qzw7QuQxw0Q4QxQxw2Qxw5QvQuQzQ5w5w0Q2Q
2QvwxQ7wvwxwsw7Qtw0A2FyFyHiFyGiGaGiGeG2GOGeGiGaGKHaGOHKF+GaF6HGGOHGGyGSGeFmF
2F2GWGKGOHGGOFyGeGKGKGyHqGaG+GiF+GeGmGeHOHaHGGSGaGOGiFuF2GSFyGSFuHOHOGaGKGOH
KGKF2F2FyHCHOHaHiGSF2GWGeHKGSFyGSGSGeFr0JY6TAEMLEM0NEMELULcN0M8MkMcO0PEMkNEO
cLkL8LcO0MkMcOcL8LcM8L8NcLcOcO0McNcMcPEMMNkM8LUO0OUMcO8NkOMNEM0O0M0M0LkL0McM
sM0PUN0MUMcOMM8M0O8O0LcO0M8NcO8M8LkMkNcMULkMkMcLsO0M8NENcO0NEMkOcM8NMM8LENsO
cLkNEOUOMOcPEM0PEMkMkO8LUMkMkNEPELUN8O0N0N0LkMcNELMMUOEOUN0MMMkM8LcNEOUOMM0L
kL0McMMLcMcO8LcNENkNkLkMELUmyGaTZZMlC9C4DYc4bIeIbYZPQhbhdhohahrh4hohkhjhhhjh
lhnhrhbhnh3hzhkhkhvhjhjhohhhkhyhchZhehhhbhchohahnh4hihzhohthohghyh3hnhbhlhch
chrhkhnhohchahdhsh3hththjhnhmhihbhchnh6hmhjhchbhghshjh3hdhthjhbhlhjhoh2h6hvh
jhshchbhjh29CGaTAFEQ6+iCHYWYaIaIeIW4Z4eoa4aYW4aALDXDPC5DvDPDhDODYY4aIW4d4ZoX
IZ4Z4XIY4Y4Y4cYW4ZIZIcYbYZoZ4Y4XIZoaIY4Z4W4ZIW4XIZIWoXIZIb4XocYbYaIdoYYeIaIY
4c4ZIZoZ4Xoc4bYcoZoc4XoY4cYeIb4W4d4XoWoW4Z4eIb4b4Z4d4a4d4YYaIbocoY4ZIc4Y4YYd
oY4W4Z4coYoXocIW4Y4W4a4cYdoW4W4Z4aIbIWodoYIXIY5M5C96EMkmyGOGiHiGKGT0IZ4X4bYZ
YbYXYcIW4YYY4X4doZYZ4b4WoWoWIXIYoXYW4W4Y4b4d4XoZIZoYoaIdoXIXobYZIYobYXIXIXIb
IY4Z4U9nZ1MAAf//////////9CoAJTAAAABIrmbnEf//////////////////////nhch2hZhjhlh
khjhjhohnhehnhyhlhlhnhihjh4hbhjhahthlhchohbhbhihxhbh6hahsh2hp9IESZGGaTIWcky0
LkMsMULkM8LsL0LkNkLcMcMkMsNsMkMkNENELkO0NEM8OMOUNsN8McLUNcO0MkNEOMMcPEM8M0PE
LnIZIeoc4eIbYcYa4XoWoc4Y4Xob4d4a4c4Y4X4Y4Zoc4cocoZIWYaIZIcYeIeIcoaIdob4WoeIY
4coboYYZIYYcIeIdoWoZ4ZYYoXYZ4d4aIYYbYW4doY4doYoXIb4YvQPy70ABRjkzgIxXuTMHagiT
ZDDC5CzC5C5DfDPDtDPC9D1C3DHDPDtDFDtDFDHDNDnC9DJDHDHDHDxDNDxC5DP6EO8MkNkMEMUM
cLMLUNkM0LkM8McMkM0O8MkL8McL8LUMkLcLkMELsLsMULMMMOMLMLfoQww7wuw0QwQtwzw2wzw8
QuQ1wyQww2wuwvQ2QzwxwuQzwyQ7Qxw5w7w0Q2Quw2Q0ehDHDPC9DFDHJohnhfhkkwBpDPDjDxDX
DlC5DFDtDxDt6ENsM8McmiFyGiF+GeFuHiHWTRDFJohmhihihjhchrhihbhhhihe9CFuGGGSGyGa
GSFiF+HaGeF+HiGiGiGCGeGOFyHiGSGOGWFuGKHiGOFuGOGaGeGOGWGOGWHKGaGaHiHKFyGaGiFu
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
Wwa3xarXbeVntx/uW3nLWT9taU5z55u29SQrXxN6Sj5ac/p6471Nig0pVScK3AzVff4jRG/k1BnD
Rq5vcFej7c2NW3rpo1dKnvjifulTH70sOX9Tf6nEl5a7YLyLfLkLxrtouaa7vqvNr29wV5u31vel
XW1+vKvNj0c89X7p5bODwrAS0p9qpn8vGbU9/bPeiWiz0Rj+2945WHrm1NzyhTOHRZmtDmP0a2tb
O+mX6uJX4/+Z3vs4dBCkHu/9u+Qm6JVaG9Yf8fy9PX5/Uc3d7I6P1c9+5PubzyX+2t5RT+Fi/9Rm
aPa74CV4bPPo/iNFbiVt2y3WApq3+FzfV3UZtL6lnLnvvnQ87zzq06ueD8ZuR3Z78JBDPtfeE4bG
yb4f+73b4EuPfecXiz+6XipXz22eyumWfdqY7o7xia2x92ydaxFDk1Fs/e7gdnK0uiCGcSC5bxau
950QHRx7JlIXe2kDDWSs43C9vccltm2iGenK23LpF4ERO2ncY5e3afozWPZk5bc9H7X5exxZMFJH
r4frpDUjPbyvr2S3sCYXP+4hiFzsZjx77/u7sP26yt3Yr+5JyB//3tX4Pg2n5OJykIOk0TgfyK1o
gvujxCfOWrpGveld1rCaBmFul08o/2upEL6muKQ9XUDs6y6ZujwUrOzpUtpOHdq9q7Y5EGfPZubl
ursQ9b3r5uYOzz0I6Zuvewy/nNWHUduz67uTtE5k+Or0zZ027uRw2Meva+UgTV3awSRyrtjbOvqW
HS6vrqTLqqfNEFN8pFf7mJt3W91YUl7FWTDykixTP/FJjd9vNaTI2dIxZDZt14UR23ETW/1zku12
mKO27bBuHvJcayt7PWn7Wvu27C55M3ctnx76rouZbFNX7TCVja7NOI3zzObNV3Vx5y82bbZ8nJiw
MXGsuWN1W2UyWQtLJs0a8mqa7z0wXYv4EbZ5iZ6muPKOV+mhXw6yUpeHgup9nTvWtqxy965Ggku1
cf3UcLaeVgk0T7Zan7mQNsgYMD7srvpyrNy3MVMklk6txK6SFXsi+pKG2zxMtfheNsxWD3oriyx/
W7kZff2rxTzF1MZ0Hk99Dpf6HpL4chn5O0pLxcQl4/UZy9n6/WlzlU2+vOIlZZE0SHse3aR93isz
nt6mV9nvmydMcdF1rsiHanZ5DufJrGmbN03XYl33X4STSJ01sEyma7Z9W936gzhobDSxazemmy73
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
b5v68+Ay+rOZrW0rC+1kPcTuH3iLuYqpWutYmq7TndYEm1vD+ma+XjYHbWsrQrybjy8bVaapK6mH
6+t5apKsDZenj4urWL56NWljz/B8LQ+4qhFiHNel1mDNT0dWObPrRzeG6Hhj/aWlDNqf9VwMX+ks
OeQHLnKs4+N3BvQvcDD8yuwk16x8JsUV/Umsr1gehRh5VQOURMN2o2t38Xf7VYVy73Li4a9+wN6h
44U929tD5/7EsUoDv0His31jRmwXfh9d5nb7tHHfLFpbN56MNu+Pp02NzJ6+fc4Q/+w6+D1f9dMm
1u1ZdtO8+bSQnEwmjNfVh84vWDZMazN0D28r46r5aJUt/dMpte8jjUMze0ys0+h8WpLd3qxXHLZu
Nf3F9eX218Y4pLNaRvoTGYa0nV/G+/bk0Stcr31wucneumyWxU5GWcQmOS7Q2U8iKbtmWndw77Zz
By8HuF4zNu2D25od3Z+5bTzV4UGuY5qzFFavRC/C6HSsklmbMTQepdj5olag/SKauYN98Z8dzVkW
4i43FdyrK/XoTdmT+7a92zvOu8STN/5XMdYlJt6t9LarM9LZwWZywmoduD7EfkmOLtvD9mxslgwS
Q1t3kLjWnjzoyS+3w/Bj/2EY/aVEDRnsjkjznaZNo1w9GNnRT8Pjsf2W5Hab3/SS5DTq48Sq9f2+
Oh+h3Z6v6E/adVj4luz8nJ5qDu/ik+pfrVe3utnN7Syy8slz3zUhnaZ4cHyKNXR9pLXU9ahEJtYl
yehOU80i9uyRSOyQ5tLNWbJLiftg0ouGFC6iLDoxb8hkufZNch7FGHlCaHQ4kLonkedPextHpj3U
qdrd24fpaptb3dsi2uUfHje/e7qdMJzfetkdPrMFu8cS19YOYs6lnj/s+XlyWn830xDjdsVkJPuv
9qtGTamX/qj/Nm2Z0U8D1DCjfXk0fCdSNga3aN3e/jGD1l+PYRobulbbIubwNmm8xZHtq+Wmb+fd
uGUYxtoux+YxqfUWvyXRYJ/S11pfnW1XNWfn0TnzPEYaoc9Hf6UarmhupEWiGudqZME8v176EnKw
FixL1toEjuxM9r9ZC5unV7gPlpHMNykTtGtrRkVVCr+rAh6l2NhqnTi6iaNJbvsPGN3YynIv7yrq
HgM0rVtuSLnwaNaTuSdXQ9fXm8+Ydgf0rXfM25bGvj7Q2MJDW8utlAyfjaRtSnJfbqcQ061def9m
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
Jw+WOdF/f+k8zu7jT+m8X395EfpYlswa1NHoivQ4y/RJHR6VKCENAbHLg3TilhsxT99SPR3fw9zl
7l11tTCapOSj9UvcP0nAkjql+ehY+PbpZyznj4bv2oycS53bRxvGFD9py9bgp6Y/0hJ8wxKJLhlr
3SLB1vXNnDncHLbbTRYPH/3d2nrMlO3tn5P1GDXSe7v28Nhbfnu+L2r6p1GRZG20phu1bt/2ezS+
m2nZd8Y/24fj8tkGyxA2i7OYh3oy9C7nnPnD8PF8a2XWPV7Y/vmm663J6IDoteU6tcb6mWTMg0WH
4dK0Zy7pXbKT0dhbkdhz3dsTI1dYj12b7zcoTdVtd6XN85C7r/b0DR61GHihCwjtTiQ2Az4scl/r
4OVd2eSa9fOLi995ZXP397+Wh+Pw8M6r+fl3rpwu9kH/Qfdm3PttV4dbM3HJd93dRmJzfzR/8vQv
D5efnonaLPrqxtu3bg/rDDK7Zcm+2oNtXdQ8Gz1w7MjwB76nh1Q6jIhD6o5l2292/ScdeJ05dDfi
9torbQ1GpL7J85rb2JHst9hNymi4fTg/+OBV0SeblR4hqL3JEkGv7rnuX+XfOrCzZd58YLiu8f7t
cV5Fz791NsFHDZcYtlsuk8izvZp37L5VbdvNSXFBRmllKk1VfOWS0MNbAR6VWGQ1AnQwBXMvs7Mw
fBZODwdzDi+xBlQF985tI/5frMbPFV38yrGup9v29ftz75lv98PTI/bcGUo0a/9Can8uelt8WQvz
dRrz7PgcLcn130nEh+HHq3L5N+uhNdD8IeOU+cRt8rn9sb3s48VbDOZh88E80urGHmLaqPfrjy/E
zKd9Ztr7Vz9pe3b7beNmo3d3em5MXLTbMclbXTn+u1ktb/Psej2l4nlc8EMsIWLPbDrNYbg/fV9I
nNxP15V20faQ3KI/n5jcHX96V4Kpnw40ejfjfJS2u3AwyHXMSRkx+B5WHb4fSPspPS8AHqUYeBMT
UvFx7pbV0yvvzx1UTU8obsR4u3t1dWdSrL2bFrbqz9r6aOk24+ZoDLwZvfy2hBB/4u6a3Mz76WTS
bEYbdtwja2uk1NxqkQQubI8duMN5L7fP9udm45Cl5iuzWYNw9iTvRhhhxmS61W95DOn06zL8Y7ER
zqPvufw1QsyvfLsgOyzDtO/57+W2Ta+5DnnOMDb9lXZrPuTFz8FObNs3G3Ni2oEzRzPpQtIVadtv
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
Ue5PlO3k1BNY1rf1C3utbqFGj/W/1DrE/k38nPWt/W8m/re/qPdzf1vWL1jfbYlvWWn1iU/62z/r
P+tbrA63uTf/W9YHdS7m63mpen9cnLWWn9D29re+y0fa1PhY6fw3dbYlg0E+FOj7W/yfBPCxLP+T
+O/qX7x47iL6BcUhJkBAQIDfIGxCoBFDGCJ0jyApowjVWBTgZkARQIAgho8DEDq9NvGiORJ7SDuX
jQCaIuGnX0BWaEM5PJheJCUahEk/8dCuZwQLZ8iBkxO5N/vqui+7qdx7jrCLNDUEF3DwJMUgTGHW
taFDPd/Ju+3k3x7k8+5NR/qPW9b30LNS6zcnFkoJmTJ8o29b/9a38nzF1u2sibv63v7uTzpU7bLy
aintbybre7k+CfmmT+k5T3svdQt/rN1kT5m77Wt7k8+svW99vcnn3fb3fZOTdvrbEssf7re/u6y9
b9tNOOsiRb1qe/puo0baHUGaj7eyfl/f/J8xUbf7+7u31L2t7rPuTz/qVkQIYsZBA/GgICAgIHin
fxmpSs5M9mLlNmi8XTwLmLCwRnhMco7Af8+Sy7ZAQDJM42hMTcWAiJWri53eqhIBysZddrUgVtzY
TXVgebAKzIWqmYNq95AhnLZNCpzl4cxDbdteqlCYeLExbXYBGD4B4JMHfFNrg1MYooBPqKRb9mr1
jBeNop48yb7eJZTChQtHTvb7bEt7D2qjv9bQoWJSa3re/vs3W9/JrJb/d1v9a1gW+1tOyWbus3em
T4/S63+7res+6h39b3p11mT5j/kqhR5NR6i1G3ttRTdbQt7ut63ut7+76NG1PhQ9v7k47+t7+/qK
fKnUP+h1k/rL/d3J8G+n3t3W9veLGQQPxoCAgIBEdykxm8KXhu8q1xkYSK7I195lAiKyF65pVDXF
eSue/GtAK/kNEgM4AuLe7Q/teBnWcG21w5S5ncNaxSlYlg94h348wyCFAcYoWiVNuFy9LORXUfkY
/T7E3/z2DJkddYlSt/od1gCGCArWSto9uMOoJ8kUOtfMuMm/qff3x63JuNSb+oWDYm+ppt6v9/e0
etpr63iHWbv9ttD/s38m5I7m6m39b1m7u3Zf/k8uTjretp22TraPenFn9vWT7LYu08uS/tT3t62y
0rE9Iiv/ayUetoNb1u90up0+9PwTe1LrL/W0Uej/d9Oy2/yfKPtRpRpIaV0OT8u5Pi38nmyb+buT
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
eVAOoB+VQ+oB1AOd5jzqilVOqpxVOBNY71AOoB+ckoB1AOfxmNVRqonVTiqcUBRrTmAYJgGAHoVT
iqbVLSqLNHxVBigHUA51NMIwVA+oCFU6qnFU2qnMWbc5gGCd6gHUA/IfBVPKptU0qkk2cEcigHUA
5yHeoB1APzhDNVTap4VTSqaCEwDBMEwQhVTSqaVTSqaCHCeXl6BCqmlUyqmlUyEPJzmNzzicZyEK
qaVTSqaVTQQ8+GD59PBoQqphVMKpZVLhDzj/LkwcCEKqZVS6qYVS4Q86MdzJiQhVSyqXVS6qYCHk
zffnB6whVS6qWVSiqVCEwDA5UA6gH5CFVLqpdVLqpcIeVAOoB+TCMFoQqpdVMKphVLBDjzBuTHY0
IVUgqmFUwqlQhMEwV+PxwQqplVMKpdVKhDyoB1APzU1DVCFVIqphVNKpkIamoapqmiEKqaVTCqWV
TIQ8qAdQD8mCYIQqplVMqplVMhDjMKYeOCFVMKpZVKqpUITBMMwDDVEO/I1aY/V1dXV9zqCRQFKC
lQimttmmNA0DQNCaebk0DQM8z55p5jOM9QRKCP5+eZjPM8zzOmmn5M0zzOM6fmaczjOM4zZp5pzP
M8zjOnnMFQEKCJQRqCJQQqB7/LSoOVBEoIlBCoHjJUGOxQoKCFQQqCFQKG0YbqCFQQqCFQQ+fhh1
AKoIlBsoIFBAoG9LVBOoIFBuoHlA1jVAcGYzDKM4zAzTTGaZpmmbzNNyZpmmcZk8zWmWYygVUCXz
8/PyeyoPVHW75+fn5P44DqVGPz8/PyqGzp+M3NOH2E4VRSeOV+/zKqjBUUqi9US/+T5VCk48U2aw
t6urlsZ2tfGfz/MXi1QEw7Nfye0p4YvF78pnN+7cb5vm+b+7disXi8Xu3G+b5vm/u3N27Wt27W7t
xvm+b5v7tzdu1rdu1u7cb5vm+b+7c3bta3btbu3G+b5vm/u3N27Wt27W7txvm+b5v7tzdu1rdu1u
7cb5vm+b+7c3bta3btbu3G+b5vm/n9zdu1lNu0TiOI3zfN839p1adu2Xw27ZDhyZvm+b5v5s6h27
eJdu3UdZxG+b5vm/njrpt2s1bdvRmMwb5vm+b+7Mt27Wt27W7txvm+b5v7tzdu1rdu1u7cb5vm+b
+7c3bta3btbu3G+b6gn3t/crmJZJae/v7euPMjE++YzGYzGrV44D185cH78eOYzGYzA8eGiSXB4P
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
sB5b+zs7Oz87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Du0g7IcSXVpX6yE/Z2dnZFarmhAPR0dnZ2dj
iDhraBEY8Ozs7Ozo6Gzx0b/mPUPx2dnZ2DN2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2fAtr
HR0Wr38NPizjjoa9GDA0HkqCvADo6IDP0FSOifaU4wTJH6PLxeQPRQYmm21ps5HfyVXXQTQEFj+N
K9HQ0LIIujo2LfLwLh3ZxQUaGc8dA9CwZERe4XRtqx1smj6kElnIdg0maIjtn4kIgbbRW9FaUKAT
N6egemLFsPAxEP0dDrCrL0LaeWzos4vhHjxLb0T9C5tB+5JW86Z1i5rWjRkzV9CWRskbzx0dC2sQ
L9HT/TDW2Hrau6BrDd7J7eno6OhasWUqL9Eyzo6OgbETVv3IDVr8Ml54bNWmoPR0Px7Appr5eVlG
TUpxSs31zxkK2DQhnm6I5kf58R/35GC8K1C9WaK15r0V07egLWNpbQehozaUrdHIJWU6GPS2vR5j
0fL1kr0g6B6Fo7IB9SUaXTo45l6Hmjo6FnRKPhpbK63o5Lpq1KDo57POnp+9nZ2dnZ2dnZ2dnZ2d
nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2X5XY3baDs7Ozs7Owi54dP2dnZ2D2dH0B7
suzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oy8djC7Oyy8dnZ2dkdnY4y3V32dnZD9k00uUoX1
5ffl2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2f2FvY/PZFX6Krq0r+ZPZ2dnZ2QVV7Q8D0dH
Z2dnYVOJGhoEY9Ozs7OzogO2Oj4+vfn67Ozs7KT9nZ2dnZ2dnZ2dnZ2dnZ2diOzs7Ozs7Ozs7Ozs
7PPorXo6Hth/HV5skk6GlTgRGgzFSi7hnR0DzOzorQlr7NxTjBMkfo8/KXlEMpAejbWm3kfiepOM
E0BBYXnSvRAQsgi6OjZ0eXg/BOwDB0M54t6B6HiVApaRtID9Euj8lEhmDtEZm0pu2SSVIG20VvRW
lK9Ek7begemLFolA9HTBdHR0rCro6Fo+W3os4vjz40dHRs6FwaD+SytmWaZ1i+oWjRkwV9CWxslb
yDo6FtYgX6LP+YW2wVbV3QNegPyDYufo6OiIWDUXXzLFvR0TVHJC1sgNEzZGztHU3ogpPcFNVfTz
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
Kb6FKxIoJo6gzag3ZNR5625BvsgmgQBBU5Q2ZV9Molv7QqTZUp6m27blK0m6q6qqrjVUZQN1erUV
U0W1BNRAgQNjaU6UdVja0SKYbs61IKjHNkEt5XeUbzMSNSDNkkuUKdU7znPefUFDeatQtPe4EFt9
h2VRcqtBQgHRK7vvcfnv3vyvm/eyef9yM1f2neOY8Bkrfc3ti5cM/OK5FBve3ECH7lPsr4EEJO9f
QY2j2iS7nxiH//853J9gwPsS26C9pclO5biXBP4IOW9N2xCW378edQS34//8RvKei2jsBjD8HAgy
aDEDjsIX3vuXloEHHHLQfzHEGKdiglO3+zfUdYH1XffzHJWwc3QWg8fEegfCBB4zECBBL37VYO7Y
h7zPmJc5d4qOc52+S/kabKy0eP52T2dnUwAB///////////0KgAlQwAAADJeUicR////////////
//////////939BgtolMQjjA5fB7NzPxAgzvYvIxF/ggJTp9xAve1u3aBBc7vO47mKUu3taC5d3zI
Q5d58kLjr3Z5kA6JXd973voJqz78rkr3uzyD3YzV9Sbl45jwvNrQOK2xcuGZklcigV5txAhy9t+7
cQSCBi2d6gQY3D2mS/+89//+c7k+wYn2JbdBxSXJTuSo24JuQQcsTQctyW3q2+6Jb8e9BKLynoto
oFBeMOQctB+9oMQOOwhfe/C/tAgt1y0H8xxBlDtvIJTYEGTfoOrP/SQe/mOS4wcmgQAIMCCI9A+E
CDB3ECBAgl79qsHVMh3mfMS5y+qw5znec2/kWwMqBo4OznzKLA/bTtuP049YBzg9m5n4gQR73sXk
Yi/IQHJypz6Pje1u3y7QILmOd70d6pT7e1oLl1XMRw5dzjb6CDzsp5K+6Lhq3nOcKB5zmTpqqqqq
qqqq029vb29ub29vb28T2vnL5znPzo5znOsEI84UnVrZUt09ikykykyk2ner+K7lBaLJKTKTKTKT
5e9tLbouGoikykykyk7V3oe22UmUmUmUnybcgI3fYpMpMpMpPanouCop1eUmUmUmUnfzoUqVApMp
MpMpOo6eioC0EquKTKTKTKTVKTKTKTKTKTKTKTKTKTKTKTKTKTKTKTKTXKTKTKTKTKTKTKTKTKTK
TKTKTKTKTKTKTKTKTKTKTMpMpMpMpMpMpMpMpMpMpMpMpMpMpMpMpMpMpMpMpOdUFJlJlJttNNOu
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
loJF8uXeyl3sggtBR2mgtDCcmyn6DP25tPspdVqJtb5oG1slQ7PYIIDJ97vvLs9qq472QnvvOW/Z
bTQCc59n0Q7KU+ynvvObbTnLvZbdm0023dXfvVajbZ3LdWpd999950KvbKBreVRIS+dQNBVFXbaV
7U+ZvzdtpUvCBVBPZ2dTAAH///////////QqACVEAAAAy6wkFhH//////////////////////8p1
UgpVTLktqmxAhk0UUF82UtolyWzeA2SbGhfu282mVCXaFRToqVR3gbgJNUd+yaFXWjvduS2apT7L
ufzu1Fp5Ck1bNW1JpU5zZK1cJ+C//K50laO6ndkHc/96hlxWi33xAgoKbUGhSjVFPm3vUq8GiL00
CDfra1dl/eTntxQKclilQ87kuKKS2U33sWoUm2NXdikZ85OjKj6tQ0c5bRT+Up0Wmio0NN1Gq2Pz
U2U2o0Vd2xWoailyhQptitKTQ8gV7TqAoGhMudK5NYUX6Kqk3TtuE/Qdzt36DN7QN3dqNNVX+OtO
VXm9JpoDtNuurud3odveraSmfRaLsWrT4gotAUaagkop1Rq/7lQ4pCdIpKqG9sp53ebedclgUpq4
bk6VU0myYp7ybmSd8aeIG17btCqmyc24cnVftlLs5z4pPMvm/OXZN3K6aHfefZz7k95z3nvvvv2c
5/hMDZdGsNdY0uyhSI4gxSpZXQqdSpCgigii6sqIoQoQoSpal0WDUtS9qJThQhQhQjR2pal2qWpV
JFA2UIUIoUZSqWpalqWRQhQjWUAUXIoapalKCqWpWjYoQoQoQoQoKhTqWpe1LUtEoQoSomiqJqVL
UqnalqVrKKKEKJKDKEqWpalqUoMoQoMoMoIoYocoUoQoMoMoOpygShihigyhChCgyiiiChihygyg
ygygyhSialqUoMoMoMoMosoUoooAoMoMoMoMoIogoMogoMoMoMoOpamqWpSgygygyg6lqWpalKDK
DKDKDqWpalqUoIoMoMoSpalqWpShCgygygqlqWluUEUGUGUHS3VsoQoMoMoOpalqWpShCgygyg6m
KBqOpSgygygygqkqOpajKBa1GuUKgupijVHtttttttttttttttttttpbbbS2222amrbbbZoqCqGj
bbZoqAon6h2lKhURQlTbSlLnaiadmiWxQ9StVGTRKVRUJS2lLaUpSlLaXLq8pIpam2qlIlKFJt1z
7Sq2rNFwVYhhouDRcBT+i4ELe17ck2d5OSACoGtrmUBRnvQa6gOcjKmlTSppU1rqCoKgKmlTSppU
2cyZzMqaVNKmlTTnMmczKmlTSppU05zJnMyppU0qaVNOcyZzMqaVNKmlTTnMmczKmlTSppU05zJn
MyppU0qaVNkc585OdykVNKmlTSprvJzQIJztTpU0qaVNKmtV3OclpztTYqaVNKmlTWqXJz5Kc7e2
KmlTSppU3znMmczKmlTSppU05zJnMyppU0qaVNOcyZzMqaVNQJUtJkYYdlmQj2XoLmwy7nyQf6Pj
CuhyXvXcAM4I5m7nO7Zk6HPwK/+SenmUKV/m/OXLOuZbJ7Bn8A3vboYb9C7knuY45D8scy+X83Mi
/Xvbv9E3/veEt753kcQZ2OX7gwZaLL6wX/XpwDMMh7lNgu8zPART6uMmLvMjj17Tc/2HKeduwyWg
HQHO/6KUsYWXxYDs33AKiez0bdFk56mcxEzRZ+cxwCNfFM+bsruTbztGfoJf/eOPXtn9a/E7vBnO
ZxYclD2IerBWdeTIxdxFf0aPe9UUl3u34wDjIxssLdzFL7yh/PpMnVclLYXJBxBzd7g7UDXCVq+h
jyPsSGe7ngPDve9793fe97fe97d973Ozhfc/t9zMu773v3Z//+Tfzz7u7/9Qs5/i7/8BskYd27jk
ey9BNaU8+SD/4OMLIhzb3ruDgyQj3N3edUzJ0OZ4pfmSf5PMoU7/Fec5LHcZPYMyQV4pMMN/BCgz
Z7mOOQ/LHMvnP3cx5+F7d/om/97uS35zvBiDI9jluODEI7xFl4xX/XpwDMMQ+42Ru8zPAE+r3m93
eZ+P3tNzMGNmTu7+0Dvbt3M+W3cYWd+3A7u+AKkeyKNviL56mcxFB5FzmOAPV8oZ83ZXyTdzrRP0
EkH9469lqd+dQfc7vozbmcYECOUof4xWFLeXsXcX59Gj3vVKEuzRbfjAGQRFujuUOT5dHP59Nm7S
zbbYXsg4g5v/O1DUDm3KXoXuSj/z3c9yviX/5zMzOc4JznnOc5k8znOc73MlKWXLZ7uS5cszvOc5
PO95zgn3uXd33vcuV33vei81n8v8y7u7u7u7sWLAAu7u75lDKoKmFTCphUxsKmFTCpj6kyLIsiyL
IsiyLIsi1moqYVMKmFTCphUwqYVMKmFTPoEGQZUwgwQZBkGQb7zjjvIvkGQZBkH49bSIMgyDKmbZ
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
m1WVVVjQ1UaOKybs2U5ygo1VJSqmk1NSvZS7vK8QbcwILQIBy59n2fe1SpRb2+qmhooKUaMqNHbn
z2qqnQqNs32235GdHu0pZkkHOK0u0N83qxpaas5dH5UapbfaZzxZShK7oXY3nO0A5aDOWoooJbTo
0KbZNoUVzly3naCc8/+5QoNlOnQUbGpsaWnjbh3dPmzZLagg3xruWDYUZZVGbIOK77/UlLmXaDfK
DR1uoMFITqlrqCoKpVamnbLaEG7Q0bqNCqrY01QrvdUSqJA0ca9qtqiqOyvk1EFP8lUPKNXNG81O
ZOY24FdmlZvbKCm1BXJVTQpz37TmLp02HlQIAJUXpACHssUHKO/7tFDeTTantV7trZUNLtt3y3nd
BpaKg/b9sVnRxBQVpIG2hdBo3qqXA2N11C3PoJd33O8lvde+roMcy5Zmx87JD8LyKgFjpiy1FlAo
ubnq6rqr1XVWKrZ3lRVejyoqux81WVffTnj56qVaqVKr3arj0HPUmNQOrsoKrFVMKvqp7VYq1VYb
KrFVMaCKeq+rqr9VOavq+c6VdHVeq6rquqvR1U0jjqpqbt0qp/VTCq3VTs9Viq/0qpxVYoKLtVdq
s1W6rt1U4quHj6R1Up1UqVNVPKqf1dVcu6rudsNVd1V5vLP5QZlXxniqptVTYx8qplVT3nqp1VSB
VbqyrKrOKraqQqsqpBoDJH56vq+r6veNurqmq7V1XVdV1X1ZVrd1Uxi6bq6q7VYNz1XzZHU1fUUF
9KrlWmibqbquvtVfqpzVT2q/VT6Oq7VTx0B6Crj4apj5zGoK1Vw11XbVBVlViqmcXlV09VNKr9VO
Kuq2gq3DZzc1VmoNVTaqmVVMKjFV9X1fV/MYxquqvR1dV1XR1XqqaR9jVW7q2qnnSqmF1U+qsdKq
cUFViqnVWVf2qs1XT1XI+tXVUq1Upx9KqVKmrqqU6rt5Vx6k2dqrujH961XjGoKvjVVNjVUwqp7V
Yy6qe89VMqrNWLKrXNVSBQVZVSDUGS8q+r6vq8xjGq6q9U1dV1XVfVcqpjUO+kVVM46rdVO6u3UV
fV1RnPV90FViq/VaquznSrTOr2eq72PVTiqntVKFVOKqcVXqqfVU8qp5UnoKrl1ebD1MeG33PZqm
6nvlVMqsiqptVTqqm8dV2q/VTigqppzVZnNVbqyqkGgqKrNVuqysSVVyqnM9V56qaVU0MoqrFVir
qqd1WIqk/W3zGqphVTCr6vq+rzGMar3VlX1fVlVztVTqq1jjj6UG4zVU6NrUVVmrqmqx2zHFLdXV
NnqY3zXVdq3Mq3TquVXGqqYVWY6vygquVUzq26tzmqpjVZqprVYi56r0TqtdPWehO6vq+r6vMYxq
mqmB6qYVWKrG46r8dVO6rLqt1U5q5ZFlVmLVBQH5jm61fV0dV2q9Gaq67oOerMqphVtVyruagqu1
Z3qppVT3KqcUNTQPmq51U4qyqlKqmpqrNVOD5Vbquuqn1VINVOKqZ96sqaF0HNVhqqaVX7q6rjHq
pjV+6qYVUo1fV9X1eYxjc/PVTiq9VlW1bVnY1Xxuoq66tqphfPlmq2LtlRVc5sNV28oOfKuOc9Sf
n50fDc6qpgareeoNQ1XbyraqUOl1UyoMqu1bV1BQHqvUFRHnP05quqs1U4yq0jVUpVUg5lVPaDKt
q6ramh61UzNVTjLqy6Dmq6q5l26rNVKNVMNHqsPHFlX1fV9XmMY1V6q9VfqvVWu9ViqmVRFjqsZl
VpVWKi4jniidA6qYmqsVFVINVNjKq6erOaMxqqa3zVbV1VjLquR1HOI+dZU46qRKsqtVYpyOqnNV
MzUGu1DVc5mu9BlBEftU1UqVUh1UzNVTyz1W6qUT5VSDNGNVTztVfoO1VrV1Ugnqprzdavq+r6vM
Yxqr1V6q9Veq2qmFVMKqYVU2qKuq+oi6cxqtPzmq2qnPPUYc91JsqKjTioavz3mq9mqXU1XzVU0q
pRNVSDVT2gjqt1YY5ozOqmdVOKFmqyg5qBc1Vyqwqr1V+qmhqqUaqQTVbV9X1bVdq2rartBVT6qm
nVN766i54zVbVfs1VNKqUavqyrKvq2pq6rTVUg1U+fWqmdVOKGpq2ramgzKD3Oa6r9BcUdW1XKtq
2rsuo61ZVShV9W1XKrlWR0FBHU1NQqvq+r6vMYxqrtV6qlWqlaqx2urKrFVMIqqcVWec11WaqeZz
VWairKrqoIjVWzReXzVWDdFhz1GM+qqdnvrVSFVTnnqp2DOKrVlWOoiqpUqpSuz1Pa4jugqpQqsZ
U1Ze1FVTPn5udVUg1X7zuqqQY6rVWur6rdV+qnry6qVZlUGXVTmgOlzVWsur6vq+rzGMaq/VShVS
rVSrVZ61dVZqs1WudT9B1q+q13jNOJ9KA/PH3PMVJsqumcd9e+6rKjMqCgVX1dU1fzxmoIo4sMaq
5hlVlVmK6qaVX6qcOrKCrMNnNFUdjVU1qplVTDmxJHqJ6q5VTmPeHqsWfmOY6oFFQWaq5VTiq9Vd
zmoDVcueOpuqmHdZ35squVXT0FuLLq6rKjvfNV1VO6vq+r6vMYxqqVqqVar1V+qmNVO3UVbVtTVT
huOq3cZ8VVnvmXUVXKir121Vfugj61e8qptUVX7MapNblNVuYc5qrkV1FRVTaqkE1VPKrF5UHqp9
Va02qrMVVIFBkXPVTygqs4sqp7c9V9VIkXaqmNVOKtfS6rVV+r6vq+rzGMaqlaqlWqnBqqaVbVTC
qxVY6qqnkTs3NlmNUVDiugPnNV9VnvU3z8/brQVXKs62c9W1a6rNVOartVOOaraCgu6sqphVfqau
qasqyq5Vcq2rauqasq2pqaCgMarquqs1WaqcVU4qKs5+d1fV/NzKgqvVXIqqc1NxVXar6iT2eq7V
SuerquqaqVEepXfE6rEVxuq7FZ6qQqqf1ZHU1UxqpFMeqkGqnXPVYq6qmdVyofQ621m+1qgfZdcu
/LvzKsiV1WaqY1UxyqlaqlWqlaqlXpVTfHfeqnx6A56ri6HoKuoufMPVaMsqyr+lRNdtUF9+na4s
zSjNVmTcRk8VTVfqv1dVcq+q3zVZVaqtVWKioqpjVtWVZVhqmqnNVM6jL7dqA/Rrmcxl7ofdO9x1
dVee+fnjoKDmqKBLI6rVVmq1Vdqu1Wqrd3dVMamo5uapqVlTU1Ou1TGc980W9Zzs5zx0GRxx0FBn
MjbNiqKvq6rKiq1VcqardVMbu6rVVtxHji5qipPnlTzx73Hz31qannoKDm5uaI5zn56DrzxHeo1n
MqrVV2q7VZqauq6Lm71U8PVTGqmN1FTU1F5FHUzExU1NupvKlZnNFV9VjVVioOc57F3OB0nO6rNR
LNljVZ1iqpxVf5qiojqun1Zz9zqrahG7VWKtq6q9Vbqyq1VcqvVW6qcVW6rVV+q/Vfqt81X1fUc3
NV9VzmuOrT8756jDnOfHzHsc181Vmr7dVNelVrVV+z5Vc5qqZXVrPVeqasqphVTCq7HHVTSqmVVO
qqdVU7qplVTKq7VeVWbqvVWqr2Huzx3VZqsxRdaqYVZVTKqnlXVZVTOq9VfmjZz3QRVWKmznOeDu
6rtV6rsNzVUwygiqKB5VezmqKrlTUVW32qsmMfnd88c1E4+3er6rVVOFVaTj65nNF0qvnq2rsoKm
+eLm2eK6A1VyrOmG75kdV7dRkRznOHUrniquB1WcqsUmz87VRV1TfeqzU1U8qsuOgqp3UVUyju75
6sqvVWz1WO8dXrLq6rKrxr54lV5qtvnqKsqs1Jzn4la8vts3Txc3Pz2RV2eFniznvfPHHQKoqKDF
nPVbqt1W6r1V6q3VbOc9VMqmoqKirquWVdV1Xa7VPOc91EW501SzGiPQZGeOgRqjDdjGyrKvq+ra
sqt1XamqmFVMru6rdVMHFHz83NVlXR5MVNTz9t8/PfWpqamgoKioqOYxjGjoFHzHiO9RrObKrVV6
q9Vaqavq+Lm71U9PVTKqmV1ZU1NWXnNHV01MVdUu6m8qUY1RzVdVY1VYqDGMZDpc4N87qtVZqbLR
Vb15qqc1U4qKirI6rx+lnO+51VtWYbdVirauqk9nZ1MAAf//////////9CoAJUgAAAAORGpGEf//
////////////////////9VTCrarVV2q9VTCqnFVuq3VTiqnFVOKqYc1Vyq5VlRUVXKrlRcdWnqXz
1GGMY0OZ1HZVB+aq1Vct1U2t1W9VU4uPKrtRVTM9Wuueq/U1ZVTCqmNV7ccdVNqqZ1U7qp3VT2qm
dVMqr1V9Vbuq9VaqvGjPZ47qs1WYoutVMKsqpnVTyr6sqpnVfqvzRs57oIqrNTcDGMZQo7uq5Vcq
cNUVUyyg5qiioLyq/nNVlV2rqsqphebqtRGPUs9TEeY5nz3271fVbqpyqrbjoMzmi6VU4PVtXZQV
N88XNs/NdAaq7VnTDd8yOq/urM5jGMZBc6qasq8XVbNVZpNx1LyrKuq/vVaq6qn1Vpx0FVPKiqmc
Zz2fnq2qnFVMY6rPeOq4sur6sqvmup5squGqsXz1FW1WatMY3E+ZZuqP39dTVlRja+GMaBooz1Bq
mLuu1oX6KkG5qiM56ti3vSq2B6rFV6qzVShFdWxc8bs/NVf6xz1WVfzUCRqrPPE9HinqqZVNXVWa
jn71X2qqcVWquqpxVTCrlUVXAaIlCMVZxCx6CqmFVOKsj5qtq6q7zGoKA8aq+qxQXdVnI6BWegoL
oKrhldur3jVVjmqpzVTiq5tvpQRm56moyqxQVHPUVU7qp9FVtVygqpHrxCrIzupquD8KHtC89nIV
fzcqrFX1FV2KOqkCq6bmqpxVfMer6tijPjURulVqp5ozTTqvVFVyM9o18yoE+eqzVx6IxqEyitTk
1HVfqtVUg1XKqQqqY856soKiOqmJj1Xuaq/VTjmoKqZ1U2qpxVTaqmlVqqnNV2pqsVXqqcVXcH8F
/FxLqzkcVZVTiOqzVShVbqyrObmO6k91X+tXrKrEdVmgVBZ7SNZqrL6XV7VVyq7zVWKqcVXKqcx0
BuegtVPPlVioqp9VTqrYqr1VPzVWKCq4DHqpGfeH8fxxqv5VdzVXaiOqkAzqt1fVciq/Oar1Erii
NQVWHVaqYukc1UVXHdArOa6BWqrNTRUFV14Y2ZlDNOh61fVTKpq2oPQR30oKg1VMKr/NzHqpnQVX
6qa89QKsqpzVajqKmpypNdV+q1VfN0oMj681V2qyc1V+KOg7TceVWqr1UDXP0FqgqD1NWVdVTvKq
ZuKgyq1VTOqndV3n5lzdLVmqpzVaq6qmVX1fzVaY/NFV9SaqnnPUVWqrRqr1V6oqvVfU1dV9AY9R
zc9WVN1W6k0dW1QPdXcqqY1LdVzKr56Ax+apNdV6pMZ1bVTmq1VeNdVyr7oOfmoMNUVU0qpm6rNV
MHVvTO1W1UkVU9qv1U37UFVOqg9RVShRUHMegdTmqtq2Oqnryq/2qpvVTqgqpQqpHoKg9RVTrmoe
tBVTqb/IEKoXQc2KLKuuq/EeruZUEVTzx1WYqrtRVTPmqsUF1FQc5qvNVd56rFXZZ4zRVLuqnFVO
KsquxnqpzV8dBUR0Lqt1U/jqs1Uxiqp3VTDtGeqmVXGoKHnyoPNxcxqv54nPOq32jqprVSubpVTe
g7VU/qplV1VmOgoKHI5uqmVDzmVBbiBMa4vRhqKrL6HdRH3Nvnqeeq8eooKCrInVTOhioKHHzIzq
KrVVmM9XHdV51czGvmoF7QVWfeaq335lFVTGLrlBQcCHGePmqs1NVg0dBVTiqm1XROqn9f51uqm1
TFFNupjnKrtV4UFRzdjTNBVr5fhxM5VXOUVVyqxV9V91Wz1W7yPfNzZz1Z3oOe8NHUmqphU1W6qf
UFVMI8jVWXVeW+dzaqIqvq8758u+Yxu9VNe1VK8dViqmFVO6qZVU9qphQ0FVOqmgqVNxVDoKBaNd
DV9X9+d5Vei56rNBVSDUm53N0NBl0C1QurIqvq/tVTWq28qv1UwqyrqqcVU+qpjQGqYueKKrKFpx
R5VlXXb10yr6qYVU4q2q9VYqtc9UrPlBQVXOd1dmc+R1WKrqiq2qzV1V20zHoLUZzVUgc8R4mbud
GdVOj1GRXzVfQZVTy6t71dH0fNz0B8PnObmPV8T5lQZVc781WI183PVkdV+giuPHmLnqtPmj5z94
qiKLsIj1QZVnBQjF7HzR9754qqZVXm+c/Oc10F1Bqt56CgimqGq7Uc2c1BFzxmq7pVZq2pxx0NVO
O5o6rj56qY1WUdd4qCM9V7muq/zUFVM6qa1X6qa1UzvtU1XOeqxVdqv1XM5qnKmpqv1Wqv5z3jqt
VPNz1fzTFRUVFV03Oaq5dVyoPZqsWZ1iNo5jVU5qp3VSlVTeOqmfNlV3nqtYegNVG7jPlRQVZUXG
eqzVStQXV/fGc7uq90vKqe1WI6tjVVMFdV6rKioqXGeq4bmMfOaqzV10NWVbUduxjUDWd6rKunoK
A91XqqfZVYyrO9QfmqvH73kVB2qtVXo4j1W6Dsz1Q8GxfaqxFDtQVMd1Xqtiq7nNVeq08XNU5dRQ
VU1quZU1ZV9BQR1HW8MosPVeqt83OY7qt1U4qyrqsvKCgTntY6rdV+qmFVOarNV2oq4x6CgqsVXI
R8r7xQNUVdHg65UHOfKA1XVUxq+rD1U5qsnRj1XcuqmdAbMu6CreaqzzxWY8fPVaNVTGgjqvm5zp
ZUxRmuMcw5lo9bmyFgkNxH6rmXNGaOpjqetBzbyq52R6C1VtBHVeoarliqkGLmFgzoOgqKERjnXk
zCc1qqmELGVaaOrn7zKLJ6dMfNa54G27q/nqvVU5qyrDH6o3NHbVTHd0D1QR3naLPDVZVYqu1fZ+
2r5dKmg6LKs5qqY1Uyq6q8aq5nNHfePn5sN3qKjIjc9AegS3EZx3Mmqs85quqv1bVtBEePiKo233
3Qc67dat5zxY6DsZXk12PGagygd1ZQHs9V6o6RvtrrQKooDXQVZQcXOfoZ2cx6Dmiiy7yKJPvzmq
ux32i5qGpoFrIm4k8qI/MqKrp4rqarNVOKrXapqsRVXlfEiR7uLqr1U89Bq6GPd946ueb5o0vTXz
1Wbi7Y+udqCNemjyOrqsoKuqyn68+XzT99em8josOeniqOk3nEmdVW+cxndV3n61Uwt1blnjqzvd
1bzY6qc1J6qaVdFhqA9Vmg2rPVl1XO9VvpU1cendXuq1dRFVtRz81rnqsxVXItc5+vPioKBzMVXc
U1W1dVlBQXzKq7U1WOfnNVdztuO+lBVtW1W5yI+OpWkubnPVcqsGqzpui1VfMagq6q8bt066qI+J
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
RdTzmH5o+hz3Z6Wl1S5UHw/vbvSJUmnpU+m5qcvn56hc1X1U2oCm6rNzsq750NK+hqeJXkVBQPIq
mrOeq7Vaypq2gq7KuNVtBVlVMKr2zVdVbdB366oO9RVZuKNd48PmKzc9Vhcx430qM7n56rOPKtuO
OoqplVkdViLmq7yq9V7ij65h+1WfKr1RfbDVFRdSqiq/Vkbqv93negoFH3oJuqnFBVm73Hhu3bs+
eLuaq1lBVcvKg/NofJPlG43zVKoKCz9T1PMa7q+r6irKrtVParjyovmqY1Vaq2rTVZUvIo+fvFVa
q6gqamOq9V9WRc/Oeoq6poFVaqpgLWOgugoKCpoOaNc5rNnO1FQZUXQcx7qu1W41zVMHVnxRR1HT
vhqA1RznM6rEdVMqsqphHV2c/MaYq7qcxqCq8arOx6rzqyoqKm6iq3FV1QqsPVfINS3QdKDuo6Co
oN1ZVa5j9rzDm5zd4qk0Sqs1ed81vmj51QdbP2yrak+Pniuoqp5VcqI6iq9V3MePKtq66irosoIq
svnPFVaqYquq+rOfnRutV6rD1NBVTCrnhSgoOjoO9TFzm5+1VOO3Y2c8T5ri7XZ6uq0186oMiy+a
OrKm6rPNV1BFVc7mtYjGqygq6rkLqKnPqNVy3UVdkcR28oKA9TUZHkXObJvH3789AnpWzXhqjvVT
x3Hz5z1Wu5j1Uid6uoKCqxUL2KqzdVOOtBy+ZVtVw91ZdVMKqa1XbjquNc9xZVYqyqxVexR0F80c
WVXI4quq2Ooj79zVbz8/NU1XOxzHoKC85o6jOarau5jVMXbnqsVXOe6nm5z5QUGWbtVvNz81RV9T
QVcY/NBVcbZ7NdBQUGXV1S8uqmHNU89BVT0xrTj57oMflWTt3uoNFGZUEfNdV/Lqu1ZVYj57oKir
rVH7Goojc9XVZE+Y+bq7mzR4zm5ufL69+fLoKDIue6qc819ubm7Gs3OqtnZ03azmzn+5V1VNaB1F
QaOKos0VBMG52ZVbV5jN0EdWVWOeqm9VOVHa1FzR1U3urO9mqFdWBxKqxHugP13VdqDVWaruUEUe
qOq5URVO+p6jXSTn1QVNX1WObni5+bpVmKp5oo3FzuHl1XcqO9VpmqptHFVvarT1WOeOO6rFVPYz
djUEuPp3awGuKrKrtXVZzc8R6uq2q4rjec3PeUHXmquVDs9W1WKA8VWVfz8x4tZm+fn546tq7n5q
vquxnVQlfSLnq6o5ufDGw59RHq6rObnvD8/OfvEbr36dHzm5qrzqKDmWtVEd81THVvPHU899+tmq
u1FXXvpFz0xqC/Y92bO9RV9VMqrMWUEcczzXVT32g54s7Kq5SW6OOpe8tOKoyKqxVxqrsUeZnOa1
UUFX1J+tTHrpVdie47RtOgj7RZVejqO7qzJbax75zdUlQdzn544o6mo5+fRzxVHqjbjyrNbqpxVd
qyrbqpSqvRjKBVbVtWH5qsq62aKpqHUVf1546rtVuOOK+8WZ3qYu0dV+LI6CKgNzHeZUGuq7VbjX
Nz4qDnu4siyOrKrFXI8R8qtVWOarI+9xVNHFU3lXVXVU1Zz1NRURdLqaCgoD/XFmHqppVkcEu3NV
tXczxG5l2qyKfi6a50+fKk2UF9zOq6fHM0c5uq0c1XVdzmOegMerjHiqYt81VmKPnkPzvHcVSaKK
onKjKsnetp89ua5qm6nmNVShVf56jLuKOqnYuq5z2I3UVET1UWbVQryq7F1jPEz1U5Od0HbDx1GX
QKKI0aP3Zs2lPzuMyiiMbN6Ofn5zn79UuaKLmMYSnqpqsXWq7zHznfPVSDlVOaqUKuquXQGPV0do
x+1VParpqtPVTk9VOqqaXV9Xd+arKuqp9FGulVM4qiox2dPpQZFlB06xX0t9n2oKrpzXFzGqVVtX
VFWZzXnPVujdKqY8/bmcdVM75sugznqavqp3VTCr6uqsZVSxVShlW89VMOvWr6g3Nia59o9Vvniq
93cZ4j3Zznb7dlPzus5p+giVG77HM+0ebM3kfPUX91M0nY81OL5Lp71JEeOKO5/PJmNZZ+eKLI+l
rLqc1FimZ33SkpDd1HFSS/a1H012ojPGfm5zYfoZd7qL3mZJfnbIqntMs33Io/U7zptJrTW+nU9n
Z1MAAf//////////9CoAJUsAAABAEa3UEf//////////////////////O1/XeUdHR68fSj+ug9ii
q08R4/kUcUzZjzN0HSoVAtTU4sug+vKMxzSTeH3RM01LzOjzu+xjn652qs1McVHh+eq5E8nauoJw
z54qi1hrxdn7O6yPfSk7N+mNF05oo24ozfHRx5nZOzx1cfOuP44qDm9tZZnqd2ueLFSabM+tB3pJ
NdN0eUCo6PfV32PF52jN2M7Nz1NWH+6cz87RzU5Gk9Ue+m+Y/PFHHdEZzMaw8fPFzZkfS1l1OdIs
UzO+6Unw1Ao+akl+0fTXZxXjOfm54sj6GTPUXtZkl67Giqe23F9yKP1O86OgTWdGt9Ova/rvKOj1
p526bdA4oqrB+Y8fkUcWrNGj0HSrEukwsugeUZozUWR9qK4pql5nRm7vsY8aztVbq6OKjw/PVdie
TtX0E4a+eKotZFa7Pc7rIz76UnZ3RGNF0dRFztxR2b4/tHHmduluOOr4zdTP5dBUenWWZ3mt9lUx
YqSjtxX1oHSazfTsnR0DVVJdVIpjGNVZN4Y3aql6qlGojjPHGc5znqI/DuO/Op7yqmNVp856rVRU
1UxqpjVTGqmMZqrMZzHPVTGqmNVMaqY1XJyoq7n5ulTVTGqmNVMaqY1XLqyOq7UZV9VMaqY1Uxqp
jVTCq3Veq2q5VTGqmNVMaqY1NW1NVMaqY1UxqpidVZHFFHVTGqmNVMaqY8/lXHjq6qmNVMaqY1Ux
tOqmNVMaqY1UxVVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqYuqmNVM
aqY1UxdVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmKqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1Uxq
pjVTGqmNVMat56qY1Uxqpi60fOe4me6rGO41NPmjtXUnOaM8dV6pjjvKujuOrryM9nq2rexqmI8d
XZdV6qnAqp0ZmnrPhrq6+YVfVTXPD1Uz5k203Un5+eq1dXVFXHiNUVdU1ZV1XVU0Me+fLXPvKmq7
N1XamoqsVXKrtVmq5VcMaqnFBVdqu1XI4qsquVfzVfVcNlWZVeVVMHVdqtVXKrFVyU1BFVcqYueq
7VZq2Mxzm1cUZ9njq2rKmpqyp5zRVXoqs56rlVypq624c3sfPzOq1UVFVNGfN1WFNR3VdjNzvms5
qmOOrcdRdXnzLPHzZVTCqmB5qrVVnMeraiNXVxqqdVZU5VrnjmNh6sqx1X3V1VzIjnSq7nOeq1UV
MVnPVkUcVViM+c5o0+aM+bquTfNU1fVtViq5EaOq9HdBVTiq5Vd5o6rlWc1X4Y9XVJqhVUwqt1X6
rFXmjq7tHlRz1aa0aqnBjn3VkfPVlW1JjHqppzVXj88cV80flVyrzxxM9VOKtqs1fVfqpvVaqasM
vDVWarlSarKqeBXHnqs8WHXPUx88VWWsflTG+aI57qsvmiu75qmq/Uc1q3k59qyrX7Zsqsc1TVTy
pNVb1V1V3mixx1XqrFVurocx46Crarp3Q1WO9BVTL24o6Hyojq3nyKqxV9VKdVNzmuzHqsVXZirq
g81pT3NU1dUWe6ipqaioqeeou+p6irrMap5j97uoqamoqKmpqLPdRU89RFz1OX1drXpj9NUF80VV
NKqeRmjqpje2j3VlWRRne4qibqplVduq1VSNVZu6icZsqwxjn5jnNURvOeOoqKioqKi5Y6ioqzD1
Jj33oDmOzVFRU1JmbnNU1NRUc3eq7VTvD53jw56CoOd+ZFzKq0aqm+VEZzVDqpjVTE14qiqzhnHM
YdVX8zmqMiyrqrdVMIzLms0VDUc2YadyrpirSGqs5qrnNMRO+/NVh4ojGPzc1xR1WhMZU80R+pjd
83URYzRM3Ngaqp/VTK6uqptVaq6oNV3OY9V2qmi56rlG6rjqs37EfD5h5BFMW6ipi7nOoufmw9TU
1NVmqxUmNU1Kqp1URc9TU1NW1WarhjVJ+6OnU1NRUc5jVNVxdKF7Ocxqk1TUxdzqKNnNai56kxqm
oqKmpquRHqTbquVUwqpAq6rnVc1Q3U82VU9qyoqak5qrmVbVc87zlV6qz9y7qKvOeM3MY0cZqrFV
MueM+buq66uzmo+aos5/OZLMqpx0Nbq4x8q43PZ7qzyKqweKrz1Xe0lQe85o+aoqy7PVay8inIub
x3UuqmlRUGqpnUt5zYzVE7F3PdXVdqpO6t7SVdV3NVTSLnqu1U+5+ftHN1dU1FViq7z1WauquYZ1
XO5u19I+x6sqyq6qgwqv856supqwzyqxkZ93HVlWVNTVtTznnIzVHPV9Vypqbj5o4sR6rlX1eecj
jqs1XVz5VTi6rNV6q5VtViq7VTeq9V9V+rau5uaq5VTBVfVeqvVbV58q+rqmpqKrWM85Vcq1Vbzw
jPUvM1Vyqp7u6reVU0o1vU3P5c5UNRVU0jq2I9Q6qbVHTdVMFkfPHp1b3q5ztVuivIqr9WVKqw85
FzTS8mnVlWOq9Hzm5ozVefnjqLjnDGt1FVIFVmoNioXHVtX0E9VlVKB+zqu1Wqsqv3VkfnlTz86N
QGq7mjqKqZ1U51feqmrqah+VZVyNp4tzjP7U1FRUxxJmPU1ZUVJj1NRUVN4Y8fbzzMqsp5zYaKKq
nNVMqrVW1bVtRUVUwqKg5qqR6qZVbVtW1aeoqFUVGTlViqmVW1bVeq6qzVZqs1WZiratqt1WKqcq
qxUVFW1WarKq2ratq2pyr6rNVmoqFVtW1WqqYc3NlRUYeoqKuq2oq2rarNVmqzVZq2ratq2rObmq
Ktq2ratyIxqtq2ratqOaratq2rTZVZqsVbVtW1bFVtW1bVtWxVZFVtW1bVtVmqzUVFW1bVtW1FRV
Zqs1bVtW1bVZqs1WarNWVbVtW1WarNVmqzVtW1bVlRUXVlW1bVtx96tq2ratqKiqzVYq2ratq2rO
arasq2ratq2ratq2rarcSi8xRVWD3PUNWzKoVFuKNYl3NHkc5VYqtVW+ao5qrNVqq1URVZq6rNVm
qmlViqmdVNKqZ1U0yq2ePKjnnKjnPdWVFVOartVKtVPartDVcqKjI4446ioqyojjjju7uOOOO7u4
4447u7jjjju7uOOOO7u44447u7jjjj9u1u734Ujjjj15l3MdbvvMXHHHGeYmLtXeZHHHHd3etxxx
x3d3HHHHd3ccccd3dxx1dHl9s12RzTJ8mNR495dmj7ZM+TtmNpTjxxXEftpxxZ2n/D8z6GNe1vW4
n5e444teYzUFmoOfUR3FGn4c24qtaji8mOfm683TnqsRVXI4sZrw0wbazWRvrVTMx2c+VBsoW9R5
VYs8afWU5435nU+RZh5qcoI7l+Uduaj6vstzVx5U82rjnN5lS8txPmj7Zs2RL26uqyZPbdtRozNd
my2Yyw1HlBpDPKg/iuOcmryajq7LxzW8iPzzKdCY7XPS7q+oimJ6Nn+zGZUc3NzRkc7Z07I5j5Ma
jy94ezRvvmvPfLNZtKcac3FfMfvpxxZ298jqPehor9W9bij35aj7UMcWvMZlZqDn1zRs/Nz4/I4t
xVWHlHHF5up5utR056rDiquRxYzXhlE1msjToKqaGOznNVhsba1HlVizxrt18jPH08zqeXmzWHmp
yguO/KWju6GPq+nfDbVx1dzb1Z5zeKrma3E6iPtmzZzT3t1dVuj27t5GjbNdmy2bFhvMoNJ1FpXz
qavNx5V5ry5reRH55nT0aO1z+Oq5VkU1PR867Gu7u7u7u7xDFu7u7u7dXU1TU1PM2ObiH5c1VO6o
avh/nLgrD/BVvEviKgMc3E1bvin7HPz0FBxE+eJmZ+JVcqsVXKCgviVZdX7iq+Oq1xLPVTKq8FQc
TpQKg71dVTDiZcT6WZ8Tn6bqVxLG6qAPark1ydnoaCgO6BGqWFE7Ma1157PFz89AegoHedj1MXSg
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
XarmVZVfqv1ZzZzcwWd8qpziqVVYV3F/GSVNVO2jnqzmr5MVUwyqmItxWY9VPOd0EToLoGdXVePF
cVqq9kvOquvV9FHFVTiqmB47jfNdTVaoOcM2VU4XarKBVbVTnn5jVJonzaPU6yq7b5rfNz1UyuPn
jjRjurzvnMfw9fnuqnVvmqyrduZiNR1eeE9nZ1MAAf//////////9CoAJU4AAACaewkDEf//////
////////////////+bKCpPQZ26c1Wcxk4tZhsNUCgNz1LztQYeqkSqmFVmp7S9qXuaOqnHPVc1F0
oKrlXVXKsqD98cfPz1WarFV2q5lSRoLVTzSc8Ubj5uh8jqKiJ5zc+8qIrNzHs1rn12znyrKrlVOK
mq1UVB3zoR1ZlVO1zurVQVU65uarM3QGrKpPHklRVeqtVXDZkdJVe/WpqKv6p4bmqyqmnPnPzVer
yoXS7N1NG1QK6qdkFiquXdVMPtlOzzmIVNMazH79ulRQKdPQVHNqozvVru+epeHdQaYXe8qHHEaz
1FBzVZ3iMjRUEedoqnn56t5qqd1U5q6Pn54jKgqvVdVTOqyc57oKCKKrqnDVWqrVV+q/VYq27jjS
qs1WeekUUXPHFlnqpnQHqaiqn/MarsPVT05qreVU4oD1Uzy6Coqp1VTDIjmqp1HVuVFV+rqrB7UV
GambWdYzHzIqO7XKKg0dR0CNQVWMUnW36bZ9Rni5qDKg+Vblqo71U6uOYvKCKqnY56CgyjjEueJa
ZQdEim3q6A1XX1NHHVY7c1TfMagjii5rqcPQUGP3tEeq1VYPzPnFi0aoXc3NURVfV1VuqzznyKM+
HsxorzedaDJo0deq5zVbVcq6PvUGUWXVz65FN1UxqyrqrkWUB+Y/hqmz1dHG2d82ZU1XKrBz1Xk1
VaqOkxVyzm5lmH54zUFAegy4zLKioxc1ViOp9q2ram6DIqm7xx0FBQUF1Ybnqu1Xatznqyrj1Wqt
q6O5YrZj1fUxHVx1eero+agjqIu7Oo4lFQRs1DV3PFVbXOZOq1VcqpzVeqtVZVfquR0Go2zVNXxV
NVyrOaq/VTGds65qiI1W1bVTqq5OUEtQsPUPLzvkVRU30u761GSc7NGbvV1TVsUXOY/Pd88dBhqm
rwZ1NBkVW9DTFB21vDXVlS+epoKu54+1Vg5o76cz53zYoukR1VcioXluOLplX8xu9Bzc6qp1VTCr
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
3jMeM+RdeY9nvr27nmrNjoGj3lJQUB46uqeaI7+urKg91Ydb7G7JaoKA+Jcx8V3RlHOizXp7oLcs
Q2DtL6jzulUdaCfc7827qKjV0qt1LNU0GunOjy5gcqkvtQd+ZrDRPph6kLmt1OTN2c1BQPM9q27j
oLygoNUFA6BUcad0ch6C779enbt0696GhzKCgbu6Cg79evdZOVXVWi5rpT893VmaySgPkWHzLyKp
pbqy6i46u5sqxa3HzK5KCPaq2dn41SHedoorvKXmNUn5qM/NU6n8d75+fnjxHq2oznPUUFVnmqvV
dFlWC6Cgtnm+fddJpGzWWSkx910e0+2+m307fNeTO9avI8TdbHz2a9kTEJdr7nbJMt0Gp2Wkavpp
dpilS5zdvU9dLklwKc7XSeeJ68d7N7vTc7NTeuynvlIqOk889nJjyjo6Ok1Z5xCcvo870uTnhWk9
o+mHtdFu6Ht0vJh1Ezkkfm1HlKe5XM884bdXUSvNT84y3roj5SyPtlF0mu21t9vkiWYc1Hdx7UpR
1ktGXcl2vFSWzrLtNXid+0k7fTdeOk8Hk3bslJjS6XtN9tb6diPTtR68mXrV5Hib+Y3FzxxRWa9k
YpJ3akeds0imW6DU7LSNzl9NLtMUqXObt6nroeSUJXryYrY9eXs2t9G53c1N67Ke+Ui8fnns5MeU
cstJqzzjQnL6X93nelTmCtI6PoaM66Y7ofvS8d7qJnJI/N5Hmoj3LjmamLZvav9y9T6bkV7x7fZd
NdtrbfxYYzObV3z9lLI6yWjTjrdrzJLZ8zLOnk5eKO+l+0k/fXbjyk8U4PfJ8wW+1/UbKiZ5nRq5
c6VdVhjnjN7Z980fNz9sz3LeHcV1fURmMszrez+PrLimIuul2OY+g9tXbNo8VW1EeLxde9Lj79N4
bOnNHiPVq7pb112vNOZnqJ0R4opiU9mxZl9KirqsT5+bn5o7Me0cw57PHzVdVho4qttmzOuZFQWe
I96NPc1mqyrqtPdRV3NV2GkWuqXU3Y+7m449WvZcXTVXc6vXZDxxninPeZmj5sq+g98XXF079qDD
RGGR1fUo+djYbpvaVFOPth4jnWLpdTVmojHbMezLH0OeLnqyro+Z3FVvf3KCLLoIj67s09zGq6rb
iqLj54sNIO9HrSzrfbbmYo6K6DrV1WnjNlAaM9Wx5nNHcxzc9XGPgW3q++RPr2FJccWdL5zOk11x
5z3Yk5rvpFRXzOz325zTmWnVcqw9nXPhs75zR+YeYBr5u0VTVlW1dQ0Ew+arqrExzxHnMNuKPv0v
I4qsqY+agoO+dDxc5sjit507xR1NRzR4fvQUBjHjNbz4Oxu3PQHzrz71PRVHajq75V/c1Vyq5Vc3
V0uvZw3M10ea3dnijq451z0HMeOLekma7ji69/Tx3FzVdz0FXdutfFOYc+RS6y3vD1cz76Zt1Wbn
dYbZ+Y+6tqd1dlTz+dKt520fmivYvn59dovN9JzWW+a8NF812PkbdXPqY7MZ0YTztq3Rz3av4a+x
nU0EXPeRu1Uc1B0i57nMuI19O9To6MeJHPho+bI+sXPQde54uaPpU1NWc1BHzUB+pjnWHjiObv1i
Nhvpu/U8R+tAeJHPhj9e54ueKJxxWag6q6rD546GeugoLNFGaKM5qC8HyfnDHvFh6rG8cWdMTW4l
20ukut+65083UrXN8Nze7itI/TJ2PWOr+d6ycPbc5j8et3vpV89PNZvDvMPUaq2rpM53FcXOeO+e
3zxVdUYeKrHOZFFijfMa8queI7P0vMMs6pdc7Hs++Z6ug60dnq6ram5DvD1F8/Xqc9WZz5FQXzRx
HinjmjuNxZUVLy79q7Fh4t1OT1WCKcq93Gvnw3vvN5fSq/V73z+55UzHXm1V3Tm8rXvo60ZsNSb1
kwJjztk4IiF1GLuZyVzUEXPHz3mpzHqkjiWmeKr+aJ3z4ZRVZzc1TU80xQ1FTvzm51lmdHOLm56C
gjiijOagoObnJjcUmUKWsNpRZzx1X31jzpMpniqdKJM26LnocyaPFOXz41hsWY7E9rVC0u2YrLZ5
vq/sxOXqY8mJjeotZ9aWu10DjVx1dFF2PQU9RV9uOKO/OhhMaXQeOF61XreFJxHbxHRD717dvkvk
nlNu/dmUxOHzp279PNzicxQ+bmMt+6rUi9o9ELeN0cfj6O9LySX2doqH3o3nmzeeezi1vXRdunZK
8obmI7ucu8uk7vU56vE6PfZz01uPNY6PycmPPdzmuqmo96NWmOknNLk92vZlky3vXu/PaNerzp09
zbuZvpMTnSQ+dtJdNzFJ3t7c01u+2/M80MmlMee0Feao3b3WXq3PI53eI6XXtfajEvkj8plfuzJz
h86dl0mNzic1Q+bmst+616vaNsgfeXdHFH750d6W5mXU7RUOe9G88W7i3ucT7dOio+/dNXlCftMd
o7ucu8O6Tvd66Tm88V0e+z1Nb5zax0dJOTHnu5x9UpqPejfJjr7UZ2nVuhXa9mpFM0Le81fu5j1+
L1edOk5nZ3M30mJzp5GY+qddHMUlBb25prtfbzPJ4TWTHk4/v2ho7sdJrPj8XY2RxLf3STNFugPE
812nMNeXnPmVMUfZ1Dw5u2XjP5Z6h+/F6fwxqCgkYijy5reKjQy8qJyx2dAj7115hPZY3Hmu3a71
bdfPO12osMY1BQbyQYap5ufKDWpyYb0fMvDmNzxRQ5syp58NFU7PJUiY2aJ4zHMJwZ1N2NdvGe47
5rbuXp3o9/JyzGNQSRbqLBlveYYLLnOwjjxpRHqHrm62DmPvI70fy6izPK/mWeI2GoNydqCPMUZu
uPUxp27BsOY/PzQyoyKpiNlTEeSfWTETMcwzY96Y07zse4+a+j12lo99rjSsx4or5854rVTzXJeb
5n2W19w2H3Hrsa77fD98zZs2b3vktCdpKKgOaKKgd0dznNVen+tAsdLmZhjmeePLouerH35jNRY8
XazGPFdAbnqJig5qmOI+WaI+HPl2aKo56CYqeY9BkXPPWfnvLxeRXz1ZU9Kst2bTnnrpz6x3d5eX
t0PPlmjqZ6reeYjqOY8Zss+dumW8yOp5o6CYijoJyo5o7+Xess2IO7ji31y9moMi26rnbL5/e1nP
zTGdpiLJFjy9R5rnqIjc+X0Nfsp+aM3frnbXRajaw+Xrc48Hqjq7DVWeeoNzy28Z9xbi7Xzmvv1O
bObn0rs1myzGOfmqeePmoKCgqDmj58fNV14a8vLyzxRmvDVZQdsji5zRq7Nd5l3mXmXHzVMcVR5v
Jzr3MeO21U5l5edIuezxmPFF57GaOo54outA9aypuPArTjz3opgVGtP3PTo3aN7uXGt3ryonLifv
zKmYzLTWz+C+05289fXDXNexGioGaYs0mUGtajtny8PFFz8xg6k+c52MlWdHzc15H3Nbz4aduO+a
/fb6RvvLv5OXGDWlQWaevLqLoKnnjVBUxc/Nzu9Rb7ZeWo+eI3TdAezWzd1fc/Q0XsXdX1oUjUC7
Hq/KAezTPo/YxvNH3dQsG+aZHOPT54fm8jqLqL+3o4NFG48q2pd9KNVHbdHo+oo6PXTXhkfA8syt
VNRzc+XeXmXFHU1Hk5FHz8xzRRmPzrzV2jXrd1Gk96b59m0ZxVGa3Ed9It+ITPPMQyXTlvMkU7eP
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
l5l9XQZa7eZQPp27d432N0Xm6CLS7WusZ+m76yR/KNxUHffRnqwdkc183XKDOhzdalR7870D1e1S
Pt2mHSXtm726g7fTVvuos5qr0de5jmzeksuLy8zckfOaLLqec1WdbM+fmuKKOLnN17mbXagoL5jx
c7NHFzxMztm7+0Eazv2WXlRH0oNGqdxqo7RR1OdbvDOpt5k1UR9rNGbmusY9AtUFnPb5qA0cXbni
ts3Obv2PE62UGdutyLv1R3mPofKrmjN5z7uOO4qrl9cfaNKPIjbvb7xHqdUaXWgMM56POZ9nd0FA
ers2bofIrfboY/aYy161HePHnXaP1ugoL5jRvO3PFFz2uxleJmugPQa3ZjXzc/bGt9e5rN1dB03r
t3PzdueKKMxo8x9M6mqIqDfecs12a8y+15pZFzt/GM3Hz7cSjnevXEaz5fS/jb7/T83zIx50vn7Z
ds9T0P2Xz7FHUXh/lBn19Nbi1mXby26OY11jPzO3h+Y59xI07fnnbO2b6I7881l1dmc24769IpI1
0zs6m6sPFJ26WaPz2PPvbtlrDm5n0N57inL5ubnMfGd4ZodOY/PFeXiTvnuPV32vq4667ZnOrjSa
92bp2Vpm3E8kwX2Olez1HS7MbtHHQPD2apO7yghmYbmiuI58oKDKA963rsY0ceZ36pb024tGSwOg
oKCzxWr+nxrq6AaW8jii7JvtQHq197+719PeWFlGc/zvz0EdBrwR9O8x266P9ioNW88PFVY0n1Wo
Oc8jP7d9XHnT6472bpbqKPdnpokV34N6yM99Ft3keOgvIsnO1H3EWs6aio4tzhqNR31+NrxK7NKa
8dDeUNDQ3NGOcx3F1N7OJpZilldBmUB8oBFHQXQUGad6mIpm6Ct3uK6Cg6d7PHJ2XaoXnzJJg8tB
FR6W9pR76Wss2zxJPHvDd5IvOtH9WXhsyj8eRZ7s2sP7rLu/e0R9ZKJyYjPOXdA48f2k5+mXmzdN
XdRio92eWLuV34NrI9HP0TvI8d5Fk52o+4i1nTUVHFucio85x1+TrtNK2c0pnnShvKGhU0Y5zHfN
1MJxNLMUssToMNQXiEUdBcVBQZp0F6mJ+KZugrd7iugoOn1WePt07VYfJhZM7PO0EVHpPe8w++lr
LilPEsV4/MN3k5vO3Wj+o1myLMo/LNEtbNrDyrD2f3tFHrJDHk99GlRy7taC8mruz3QdZ++htGiM
rWUdpdLmKmWozzxbdDQ2KG5w8x7ktQ+eKMw3H0PExdmcUdDbXj7Xl8/SKgmInNb6c5hMy6xqaofU
YdMw/bD9VeedVk+Y93ZohmdDrLP6vVaRj67PpMVHvp7sZ74N0Pt+Xd0MwectX0qIzaiOa1YuO7mt
Ptau8znimJp1IqOmPzGp70GazO2Yn57PVKw/S+Z7sZH0ieHtxUtGkdWZ9Ij9qjR/aCY57v3O/l2b
H5zGNmWtxRqNWvkVxW+2YbWFKPZjWrzfa328PZ+x95QK880fI6iYmHuLWXczUo/Uzt3F0ed0ZXGf
Fh8qOeLnmjHeXQWjKOLvkZueow5ppnNlxKgs0fbrntg7ugxvKvV7Bo4sugu8u6N23byPdzydRlVz
dmOaKKYPEfI8cR8Zzu+aPtZj7qbqI1l0Jsu7dxGOnh7VWZuq5kcZsfSIxt82d6hds6Sdu0ezs67Z
ZrZqnt3dVo8WZHE6kdKrjqyYqYmhHQZca5o4jaIVHPUPpVaN5mbd32w+O+ZdtGRo+mTlRHMXlA+h
3FGfmrs0Zo4qnmnqGPRzHXTvkVAzxHjw8V81XTW/Rl5QHcWWfmqebZzHMfZlHdBdS+5o+bt0nzXh
zHMfXawfW46s5rztzTXNH4jniw9Rfnqqy+x0Qazy/T5vAZH7VdmdqB9JzmyooMqO2zGV+s3WKYdB
lV3xeqq/qYxsyaW2cO30B+n2tqb3jzt2zyI996PpdmzOlH11vLubenMVHvp7vPXne5jMm12xXZ7v
XfLw507uTp57PW+i9yJJnSzmN5dugi9y8ugvpCY10mjTTP5mbjjNcTNcl5Vxmr5ru+0voqXzYeYM
2s3czQXi2rV9o2eKoR6v6c+YaPq8uc8+RZndp9VzK5jDxRxRxR8x8u8OY5jxXjSbvEsxXzRxGjVW
VD56vUbVW1YrUfTmq3XNznNVdiiV1WEMfyJ++NPMGXlbIjxR5FFnztlTPyW+bDXZ47mO1++TANB3
fN27JZFVivnzxzlno9Z2s9fdLW7KYoHpUDvWzz9B2wWlFd3fiRnMcCBMXzurooo79yj7KLDXEdJI
8redoxuMxs3qemJFqa7dZh9X175Qde6vv1vp07teTkcxkwa+2WZ54zZMt85syPm8q6Lqj8/NR1NR
rnki7fc8vfSK+lBqrKmSo56Ub9zpWrSzy6n5zXQZkezXMd37QYmJzvzqV9V5Kbqe+nzSzZ/Mt3in
tdFH7iZpjMavVxm87dHUXuSlPepdxjd3zduyWRVYj8+ReN3kemc9fdbspigelQM+tz9B2wX0WRHu
/EjNFHNXzurooo72bfZRYY8R0kjy2+mdo/BvnNFk101PTTzU126zD63170HWgoFfegfTpQNanI5r
Jg17yzPJhmyZt85syPm8q+Lqj1NQquqNUvPM83b75vpFeqDVWVdJUc9KD79zpWrTqTPz+doreZz7
Ncx3clAZMT1BUqXqpJTUB76fJVnaPzBbvF0jfVdo/c+44pjFauivnN52WOotyUsdud32j9ZS7ydU
n13iaE/uPtbx0WHN0UwfLervO/Pd7Uxa3ed+ur6Y63fyeM567oZDTjc4kzN71mLRztZai6bjjMso
Mh9Qu8Nu8wTc/EfV6ku8u3udtTLyhOeSzNayYtvtitXazOl0PNMWaZPQT2dnUwAB///////////0
KgAlUgAAAAViS38R//////////////////////8FeXmXne8vvHvyeduisSTlDONG6HSNpvOmLM7c
6vXaIyvt2zO8gSvL66xoam4j30rdPbd3PGndqZdmPbdp6y8ez72sy1h3HfSh5jTEdAeR53NOeJ51
zLvmy7UXf2M6XkGksd5hqCDTeI+Xd3jOuzwNRMGzFuPdvEfplx1Eg7X2yTfur9v3O1FMPNGZzmNQ
K6BZa7ZfnOZ5QZHEfnqDxGOY5le8NebdBkec3ObnPEY+TketTmGw9T7MdNN9luWI8czGojZOpn1m
zYs6o2HR55oz5896M183PULn1HEcxzc3TD4l9s33o8vDRsc2Gjied5UzHnMOa8tmVA32uh7ZdTmd
ec3PQRTl5HObXuApmO2fonejYbI41051hvbOdGbizXRR9lcUeRx5hzmy3WvLa1Wvo3q02rnNrsaJ
R9YjR5zR2aL2JGMc5s+3dmvofMs0eXEr6RR85jHPhrMa1vor+3k+cxj5zc5zGOcxzmtfbNn28uJ9
NvHnSPmw/Pmc7s12ZrF0+rbzHmUGVC6Y+beHM8NO809vSygyzrGrdxzGKwaJ3cbc0tx21H1ML286
is9e3E0+aTonaXRP2zN7vrbveZmvT3lvx0Oa6ChuN3fqzs6GTmmLM7ygCvMNc554reW1bzI1eLQz
NNN2z3jeUDPudM43QXh6BR4se49290St2siRzxqw8ZluaDyLtzvFl327KMWdW8wZHz24wuY57ekk
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
o6MDe1NNbd1vY+4Um9qitfaAwTBxeKvap5TBMEwTB379++DBMEwTB+t+/eYJg4owfr9377jQYBmY
L3+vz5+b2p29qb6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoLo5bXocD9Hn8P0P0dBbOjo6MG3Syt+7f79
42N76h8wY/qYCZGFtUu8Hhd4MeGOPsc0hQYDOmDBi0y8KDi8TqUpX3USVGO7MGOmLuUx6asD+fWC
yuZzGZzGYzOZzOazWazOazOazfsjqX1rcd6svalLgTo289XV1dU3V1dXV1dXV1I6urq6nLq6urqk
6nLq6sBhOqI6urqbt2t3bjfN83zf3bm7drW7drd243zfN83925u3a1u3a3duN83zfN/dubt2tbt2
t3bjfN83zf3bm7drW7drd243zfN1QAbtzdu1rdu1u+ZQAKABQAKADK5Ou3aTdu2mX3qABQAKAAzt
3y+0PPV1JDAg4PA4HB4PA4HA4Dug1wTX5tmjTQSoFSpKUoSlKEoShKEoiNcPzT0DXmjSlKUpSlKU
0pSgnBkOif7vdu0fh/bgUABgAccAAxlGAkiZLe1MpF6vYNySsAS7ho4vD9MXs/btvZ/b20pSnb23
s/btvZ97P27b2f29tKUp29t7P27b2fez9u29n9vbSlKdvbez9u29n3s/btvZ/b20pSnb23s/btvZ
97P27b2f29tKUHnpvrbtvan72p/btvi+MgIiLwu27YT7dtNl/CI06Zujbz0I5tVVTqqq+L/iqqqq
qqqqqlvhT4cpSuV3fGA125VVSlKVVVSlKVVU5SlKc5ba+nzgfu9eWxnZ2JHZ2dibst7Ozs7Ozs7M
H0U9L3I8Jtpayrh8P0dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2D2F2dnZ2R2
Juzs2auzsp2dhaV3Z2YOrOxuzHGj84cOHDhw4ciSTvijhw4cOHDhw4cOHDhxaETOHDhw4cOHPScf
04nHDhw4ng4cOHE8HDhw4nHNsfOmlL3cWDw8r2Vh8UmpIlu9AP39xGIk/f39/fz8/Pz9/f39+d35
+fv7+fvz+fn4eGQ/Pn5+vj4EDGiCBKb/bINldv7+WiCXJ+Fh9c0fF4lilVdtp+MMSDFwuHw1bC9t
ga29ares4ZiSGhs3/hJUS82NmjaKg2NjY2NDQ0NDY2NjY0XWhobGxtbGhqaGhuuIoNDTfvx/MF38
Q5VMweeCH/T+41tW1AcTy4O6vc/HCSWDK60s10uuhE4zE3ZzZw1+IeWq3lWkqEEvkWQt/94atVvh
Re2gu/2WLFi1wsWLFixYsWLFixaILFixayWj5YtoKRcuWLFi0TvC2+ojh3LR7fNW8+5CrhYsnQ7H
QQWbOlBs23tbEuKKe4KKNBs6dFmx7Q2beZHxdbFW4tmR1Gy6rXi4vbVXcMh8Vzv2lWiHR88qePkC
CQ8g8bqtJxa4r1tzBcTRTaXRO4ygAbusaw134uao26vq2ravq2r6vrGratq2ravq2ratBlDHttKl
fj/Dt41bWbt2I1bVtW1aIu3bt2I1bVtW1aIu3bt2I1bVtW1aIu3bt2I1bVtW1aIu3bt2I1bVtV1b
u7du3WjVtW1bVoUXbqi7d5Pq2ratqH7p7mygFxfPKfPPPPMV0WC8zMzMzMzMwm5pzdjhJw4cOHDg
3QHn5SlKUpSlKUpSthk6J11bXSvbQ26+3PH1LUdR1HUNR1HUdQ1LUdR1HUNR1DUu0tSVqthSqSQ5
EIN5yFxNOZVZKrJVZKrJmU0005lVkqslVkqsmZTTTTmVWSqyVWSqyZlNNNOZVZKrJVZKrJmU0005
lVkqslRLymmmmT6mZn/0000/E5mSEvSeeLDduDSScJJJJJOc2hubu7u7u7u4v2ZmZmZk8zMD+Ztk
nd3d3d3d3d3h12zLbmZmZmZmZmZmZmZmbmZmylKUpSlKUpS1iupsTRnb1rtgVZCigiqyAsqyFWQq
yFWQqyFWQqyFWQqyFWR/uV7a6uTZp/e+vXW7bqrIVZG3FWQqyFWQqyNuKshVkKshVkbcVZCrIVZC
rI24qyFWQqyFWQrVZHt2qyFWQqyFWRCrIBVZCrIIQqyFWQqyFWRX92qyFWRc380qyMvdWF68GlkE
DdlEiiRRIokUSKJFEiiR0QU6JHc8iroutFrYVKldPb5/1I0vW6+i8Ouh13h19drw6+t//m9S9U3x
fF8XxfF8XxfF8d/ffHffH7iShvS07+276JFEiiRRIokUSKJFEhCm+0RQuAHbUq6e1DsszevO+O/v
7++iR39/f30SO+iR30SKJCHXRI7++iRRJ76JBokUSKJFEjvokd/fBRXor0V6JFEiiuO+iR29fX19
fX19fX10SKJHX19b3ouJJLudNRdAhZ22lWqFbGEP8m/vxBM+O/8sEMi4YIZVLVMOVLCvrB3HvsMc
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
o3+zaS4K7TMsvJvPOd/Xdxxxx3d3HHHHd3ccccd3dxxxx3d3HHHHdt3eRxxxi7u4447cMjAIk3kY
T4Od3JSuCb/o7sxP9CU+Sf+Qnuf1eNwzuIA8YT4N7kmmtzN/Ws9zNYpF6Egg9z8g1VVTJqplVp6q
Y1U5qpy2sCT4jxj09VYczdsNK1pj9I6uaWN4S4J59UFtJhJZ/m20m0m/w0k0g2uCwOjSo+GvfBPX
61UAXEOOQgw8hcJR5HP6RwWrL79NXBPv6NwK+UaO7TrozHDjjGUdh1U9DRn0M4YAIF9UIslH32f5
c5wsn6no1CmEcqg56u5fd6X4a4j0F2eCf+hkizka/oJ/GxwT7udi+uT+i23CX+/EFV1DJ+VaWX++
CK+fZP5cqf5vgl+Yb0giy/T76Pw8ehK/kvtpepeC/7lfBH4tD2O40nHfx0kvbwKDexRXrU9h2dXy
bRZebIvLyK6pmqPlvkgbEV40js6jef2km+zfdRoSrx8/N75i3+gb5EvOSf90D82/V/y4IwjSS4Ij
giQ2h+ngk/IcEvPy/RocEfxJcEmvyDGeyDIj2f8loqQvqWXlWpp9nehYI7Ge5adkmXqt+7r3S2eW
gzs3S+wzoaBeiks6s5spPvM5rDL+7T5K6A/qf5idX18/i6d+L/YVLoI9sFE1/D4H9RzeP9yGm3Qc
8Ev5/BNJbaUnBFNhJhr+GGixBln/LLz3ZZbNlVj8yvTXde/2QiahHkS7CUb4H1Dw/V59zd/IyFCw
LJMnQbFeySn8/1FHk+9ed1fz5+z/1/gG2mmEG9r4n+vBINjmQcEH/IQaf9f8mF8S/pQbCcHDagvq
/9ciDZZfulpVtrsrN9/r9kgttebTabSNk63WxEwEve5keAkTmQ0cDl7miZ6KfqK9ykJ8iSL9uUUi
YdjXmNxsTtfIWdf0M2hNBVTp4Y8qDf+N8v9X6ov/mx/gSgu30R/X/LC/5j8PlWZyLfP4+8n/JMfr
+gTLk/wQf7BFvn2HBFE2X/WV/SpX9X9YYeMJD7amn/pXXa+PiTN1CzPXIr1bg+G2ewjac+S7EkAn
xGMJ7VsT9K6/hW6omXK0cq2vMBl5p5SauuQ3NGqxhqqcVUyqpz94j+guuJHX5wU9BYhzVYVH4D/C
z+FBLB/mP8JQkH5j+Du1KPhZUp5JKgXo1ctpk+Ej5BWvcEY7CbsopnrZM5ZyYCl88pSL16N6TkOB
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
en2jXjIgzpKNrw/DKS8vNXwzptFgrEUtK7oHOpz2+3TR3Bmu2/I0bJQokXr+Qp7bUtORCQtmzKSk
8u5em+3ZxzZhu7Xf4X23uNGWCysfzW5r6bTnEtc+SkyVLA231VryfLT7YJuIaRUjO3K+3FjZPs/D
8qFbUq01/+ymvL/cQ4u+Pbwks+bLn5JXf0zf2m7X9dXOYdpU6Xz3+THxxLjtwoE0SJX86cn0q+1b
zOSbUJIurE27VtmPe55ZxBDaZBpua58BHoUoUatCW/UnqTu5/to7P6H3gsi6O1R5+zdWM5097ttJ
ro+FT8dbuCduWRzxlwxvf9a03LZre4Oot1q+JyVph/PRH76mU2M3op18UFp0Tv5o+HP6ae2nC9uv
KjaWN1O5uP6arGt5mtbdJ28sPi8xuOaxpLtPiH4eMr7SsDaauxne6SGxr/n+9Hi6pWbk/DQTmWSr
+tzMbdw5qetoz444t8d2LoaQh3mfGU6u5jJq9P0k96opFz3FjESO97rHFkoCs+T2g+gWO7fH7/1l
usVTkbunOsX1bq5WGY89fV4fjzwc5tuW+JkSQgQelShxBKCTSjJ36rMLTw7eHhXG2syu4N616lz/
j+SX6LZ02Xncr5qxDU+/uP45g+wk99+/al7o2drurz6MuWjMQ56m7Q5mSG0wuiV1CEf0eFrE+wMX
km1kJuOn/Ww97rbiSdiPLl+EfdirPZxSI2qzVmU05+Q8BrtTzcOTRLN5UJk2jLzfQ+IihzVzHH4/
/L1/lmBZTRre0lMfu1yE7IS5nLJSWxfzeFM/vrKYyXPmHm72z2p0mrfIRMzXNUvfKeuNf2t72nT7
ktvNT5Z3Xej6VPNBuui5RONWtGRnxGlKOeK29OpaNx616HgRI0O3V9SD0TvNY59w7jTfM8ThQdTt
wT3U3Nve8pNhih7/Xtoy9N7N7bsPYtPHYocvNmlLc+GgDa/WrYmdYaeRRLv2anOCKeGmmD5ZjUwi
2Zcki1X0NF7a6+d8OlvSlsG63XA7iU//i1N2P/vtZXZ5Oc1u2LZ/YszGnM+tW+LWEzVrIM9M83Ot
26KZPDxenobeu7bNknnPajiW02qv8RKHlvh22O/VtnWXdO/l2+ZHXG0y1Hi+sMTZKtpJoHultyU+
d7Fr5FovhDuW5vobdakl7ii0/Rr6pAkJTWmmZxYepRhpKwSEmN+VSd25brLq7K7q4t3nh9UbOoKX
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
kPeNYDBCQZwLeQUFB9+16q3ISIcgM/v4aqwQ1cMQQe7v2g7sBvYVrqqQcH78zU+L3CmTJEuG1xbk
CzE1MPBamzUxhU5idaeS2mAkJUJYgVWyXofo6N/QHomYD99tHR0dHR0L120LL4X9HR0Eu6JY6Ojo
6Ny5nxrO031Ggqii23GdFFDBKtW26EMIzYcBow2Gw2GwOGw3jhWNFN1P1eeBCEIa8t5CEIQctWZX
KhC0qdXkZSokMvLlt8wSbua02lwPHWxjGaGMYzoaPSIta1sQTCXdrWtbTjnkffANa2O3o6ODlx6g
ZXBz/Ib+T028DMBVhjKZADs2dnZ2dg9nZqsBE8vZ2dnZ2dl5Gqxf2dnZ2Ly6C6I7Ozs7HJm4xlAK
fPRutrkO4Md/j8NKAppWt8fjmWtX4HlZ17KbxAauGVB5BwzHluaITyJZj2DoeTMjYl6HPDt04Y1V
ACqhzW6r8Ckc+PGNRYIl+4oh7P6reR4tFgMwMXuDzGbOk/o/BAhsEHpI4+Ve91PKe9PDnVQCbU8c
+1Kf+0kkkrySX0qzlK7nOcxXZzxnOck3rtubs5+DGU72nhw1fRdS///+H/n/vP8OarJ///5XXD8b
6f//8X95+GNk/+F8vPhjDsBySM6rIdVkKshVkKshVkKsjiqyJVZCrIVZCrIXOHWqyFWQqyFWRR9w
qyFWQqyFWQqyPdsgcIdavh+C/LhSHRGoNPDi12NHTedC2Kxzeon0fIVV9VQK0XNzTvHDPLp3w/t6
hZQf85FoOdd1Gu+Efxy+bTnvS3/H273PGVJU+izqZotzFypRUoqUVKYPej25fkAQT5SG1Ut2uxB9
2L/kxFsKXpaLouD9z/OzvwHB8f9pqtpKTvwK7t8fzUI7vDzttNVlNXzba7u3bu+F8UzMxac8zMmp
Wn1vb8zPeU7yq7G0ru7u+XjhU3MzPQfmZnbztGjmZGfVqmczkAVMGjAZF4RZbRm222jLVnhUwqZo
XLja45BhZfQ/l2gcW+96uKEv7yYzfv8KAQVA3SLpxrPV9DaZtzdbk6E2+y3HBf58n0rJVlRNCwVZ
yCzMV2t2dL/+d3ytm0aPpRo2Gvmz7V1VOaqWr5dcN46A2g+dc8Tk++1ZVslTzd8oIsJTNxUDyOdq
pBqsVdVTDLsYeM/Ak9SrPVfqDVU3yvibjj0Z5t2eM6T7U/dGyny5n70vFUfKmOxHI+js1uOPs5yq
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
F51vYar1/ez8Ub15lypxly3rrsN7KvXb8hXrPLlTjLlvYk2YL2Vew1lL11lypxly3slwlezL1oJY
b2Tlypxly3sTQTvaN7cQMN7Cy5U4y5b2CHid62vZyvvb2XKnGXLe0MUb2LewWVewcuVOMuW9fvyf
ew727OxK9g5cqcZct7HxDN7avaRF69mZcqcZct7NCY3sS9b64b2Nlypxly3sCAje2b2fjIXsTLlT
jLlvY2cxeu71uD6XrXLlTjLlvXeUnevL2MOkL2Zlypxly3sQnC9kXn8QDLxnlypxly3m+8+fe272
5Br23lypxly3ttvvbt7d+N7by5U4y5b25vr23e2/+9uZcqcZct7bi17bvbaQ17ay5U4y5b23vr21
e3dte3cuVOMuW9uUrEvbl7e7r29lypxly3t+xUq9vXt7cb29lypxly3t393t69vc17dy5U4y5b2/
8b27ewFXPeS8uVOLhFlvDx24yyyn0JDu//7v9N/+n0Gq9hDml7CvYd7C8/MYOHiZcFM5K4mHX1DR
R4tA5Je9JsvBmR2cCSB6zGEOGgjDEQ4yBjEmzPgEJjkkSKHMeDjobNwIb2NSE4/I8yB1dgHphJIE
hCxUEMgY+fJmxDbh58EAjOKQR+vC5kqg2pGd7gRMMmTXcArwNeHrwI363g68LDueQuhTb/7qfNRE
PFs0LLR6xN/Ft82SwH5Ah0ftXZ98bAbhEQc7v+NS26NH+Gs2A57dBmgvrA9POQMgitM3/QsJJj02
iAnNl4D6z+8B93N/WI1vd2+7qXf3pW+33bT3sTk9+WyUkd6+s+5usT+6Ddb2+7usbvsD9xjS7dn7
Q5I+xIxb27Rlq6xrG9Pj3t8UjrL/b9v1U3tT3H+3SZv7qKV//Hf9Dd0cuil0Z3C6MiNxQuJuTMYu
JVxQT6Eh3f/93+m//T6DVewhRV7CvYd7BMmXTZMUCNco+uRBv/QD4ALFRgOzhQygZt14x8Le0QPw
C4fuI6Hv9NkiCZrBMASYczyJMZLEVy5cC6o83sXXSGaxuQOdPBEyhojoYaYAjEgD4RkATeIRiqtA
3pmiGzkCGVQFd7LQj8wXheyWF1jd3N/Qsb7EStpcF7i0etsSjZ/vuSGb47ZvZPFIZK9Pkzt8zWVv
pezJXf+6bdQsrWT/TdQj7U7P+ZPlNm31je3en4dDt99vt/dQ+jb39ZbJ9v2O1jf1icvl76lQ5kql
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
9izNGOm39NCPDQw89ADC4f/+3czdzf////7dzN3N/////t3M3c3////+3czdzf////7dzN3N////
/t3M3c3////+3czdzf////7dzN3N/////t3M3c3//4ZAD5kMYwea4uiUivmHuMhwWd7e+7e+kziI
40DE/dvfdvfAINKw0A4GO9vfdvfMNDrlwBuFZiRu3vu3vojgx94FuG41Lfb33b3xNB0y5peO1dvf
dvfCgJPIbqbNm+3vu3vlSASCzYALFO3vu3vkEXFHJaMPyH299299OgO9cNs2419vfdvfRjve9xj2
99299GO973GPb33b30Y73vcY9vfdvfRjve9xj299299GO973GPb33b30Y73vcY9vfdvfRjve9xjg
ePgTterkY73vcYvECIgSr5yMd73uMSpuowAL1rjHe97jFytoVaoPxjve9xjgeAxQ4T30Y73vcY9v
fdvfRjve9xj299299GO973GPb33b30Y73vcY9vfdvfRjve9xj299299GO973GPb33b30Y73vcY9v
fdvfRjve9xj299299GO97aMe3vu3vox7/+Me3vu3vox//+Me3vu3vox//+Me3vu3vox//+Me3vu3
vox//+Me3vu3vox//+Me3vu3vox//+Me3vu3BJjH//464K3MiQrMS17//1scIs6rtDUY//2KMPx2
dak8Om5f+LFj4d9Qs7PLbGW06dguixZ2+WN6FVuNbJadiVYxYs6KstMWL9AsWdvltMX6KLp2Hb65
5TrRlFi/QLFnb5aYsX6BZ0xVlpixfoFiztOihVMX6BYuW+WmLF+gX5aJh2mLF+gWLO3yirBfoF2W
mtuAGAXChGExEC3Mr+f4tT2XPRtcWeJYTb5dupRfoTpwBwm+T8374TtD6Lb5Xb8P3+TSA7B2ixZi
x2CxYgAWLHYLFixY7BYsWLHYLFixY7BcFix2CxYsWOwWLFix2CxYsWOwWLFix2CxYsWOwWLFix2C
xYsWOwWLFix2CxYsWOwWLFix2CxcFjsFixYsdgsWOSEGlX5kDBQ2B4+BVVXe6sqsC0KRiqqqMpwY
W2R1/NVVSt4wvv7xKNbrsVVW1YauMEjLN6VVXPSVDy5Y5PrKqq5KwmHu1q5YICME71VVURBURCB5
EI4ckNVVZIKP2CGLEyKaqqnDkXFcZi1VVWQ55JDkVVUqeDAYDCeB09COQQAwVMWBa3rMMGsaKMQd
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
UBCX2UAigdMLB54zjzStoqC71k4P86DgOA8jyS4vF5HI5HF4vI3uKB9GHZgFBUoKvNQoqFdCzoUV
qhENnBo3AxJofeRzeY/c6VmdPK4P47///PDP4UxcEZJrSacVjV/WYuMxWAyDco3IU4+jhJ8Lsbnt
WymD51DfHsoGCXvbilAO6phxKg8VYyq7VDmwwPTw56FAWoJzk6Ojo6Ojo6OjoZ0dBk4jL+fR0dHQ
d+3o6Oj16OjQe3R5/fR0G/J99HR0dHR0dHQqPOjoMb8UBag7Njo6Di6Ojo6FACaXR0dHRhfXd0dH
R89HR0dCo56OgwzjNBQa4no6Nhk9HR0H7lejN9HR0dHR0dHR0dHR0dHR0dHR0dHR0YLA9HRI3o6O
jo6Ojo6Ojoyjejokm6Ojo6Ojofo6OgS6OgZOjo6Ojo6Ojo6OjBaOjo6PLo6Ojo6Ojo6Ojo6C6OjV
49HR0dHR0dHR0dG4ujon19HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0PHR0dHR0dHR0dHR0dHR0P
0P0dHR0dHR0dHRu6Ojo6Ojo6Ojo6Nuro6Cm6OjoLo6KdHR0Dz0dHRr6Ojo/4UPCVRFKJLFIw5qmG
ap2HP0JjqrN+foMz643ozxj3uenQaigBUB/R0KBvNdHRu/s19XrSqDzm6Ogxze6OjAYjzvdmwfR0
I6Oi9dHR0dHR0YtPZ2dTAAH///////////QqACVdAAAATvpM4hH//////////////////////z4y
ORyOLxeRvcwaVUinlwlUaSifOL6Qo0lE2bJh5H1swZsBO0/Yvk4/nN57Jnd/Hn+f54nAaeMxYqAf
QYuBx2JMRN2m6YeTODiMi8Z34zPOFs5OP2lM9tvjyRnKAU03ReyvVQS9CoD/SVBWpBbFQEc5nYqT
oxeb6Ojo6Iua6S3J0dHR0dHR0dCQ66IT9HR0dHR0dHQ6Fi66vxI6Ojo6Ojo6OhY6a/F9pdEdHR0d
HR0IshM6yzo6Ojo6Ojo6L8vy1OmuC+ujo6Ojo6OjoJF8R0dHR0KCBQD9HQuvc6OjHm0fddvQhNe7
0dGPMvC5UuhMlixN0dHPnrUA/R0LEtqLEdHRnTqO+Qf+97o6DLUAioKw/RtS8zU4foqoDujo6Ogh
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
f/R0GQYWZznR0IzGYvXR0dHR0dHR0XudHR0dHR0dHRe50dHR0dHR0dF7nR0dHR0dHR0XudHR0dHR
0dHRe50dHR0dHR0dF7nR0dHR0dHR0XudHR0dHR0dHRe50dHR0dHR0dCXoUC/R0dHRjejoMVUIdHQ
YeJPDo6Ojo6OhQo9HQdQejo6Ojo6Ojo6OjM9HR0KEvE9HR0dGMHP9HPQFUB9HR0e/R0dHR0dHR0d
HR0c9HR0dHR0dHR0dHR0dHRneejo5VAfRguiRQUKhk4+g6eg8jK6OjG89HR0dHR0GsoBejoVCXQY
JoKEIxmgUCGA6Dq6OhUcqgfL57o6OjE9HR0dHR0dHR0dB/qgTo6DtPDo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjZ0dHR0TTdHRPvzHR0dHRn5v7o6N9OjolLB9HR
0dGW6A9HQ3b0dGGxGB6Ojo6B8B6Ojol6OiTVq6Ojo6Oj06Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6C6OWh6Ojo6Oh3B0P0d
Hn8V6Ojgujors6Ojo6MG3TJ0c9H/0dHR0HDn+jo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojow+55t+7K5z96Ojo2fhydCgA6Ojo6Ojo6Ojo6Ojo8K5no6Ojo6Ojo6Ojo6OjonO78yPR0dHR0d
HR0dHR0dHRB1V6Ojo6Ojo6Ojo6Ojo6Oj9r0dHR0dHR0dHR0dFT624fo6Ojo6Ojo6Ojo6OhQD+2f6
Ojo6Ojo6Ojo6Ojo6FA7/qgLK9HR0dHR0dHR0dHR0acr/dHR0dHR0dHR0dHR0HJs6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjMdHQDB9HRj
ejo6Ojo6OjoMfT0bDu+wZno6Ojo6Ojo6N3l0GfmtrGdHR0dHR0dHRn+jo//Po8ejo6Ojo6OjowPR
0GJ0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRA9HR0dHQPQHoBpZ0M6KdHR0dHR0O/P34j
4cdHR0dB1e/pkcAl8L2zamS23q29WWIsvj30SdBWWJbLEt9JbIRZZZZZeq3vjZY9lllkVRZZZYN8
IssssRZZZZZZC61FliLLEfUntkThT2/qLEr2WIGgcAi221FlliM7z4DVKbV6ssWWJTvSmFr+Ettr
ejjBe+A44p0e/jggdHR0dHRAuMUDsnn6Ojo6PD5+fjTrGA8hLo6Ojoro16a+HBFhtHR0dHQD9ve3
16Ojo6PXJXvJ55Ojo6OigEpWI9zcl6Ojo6L0mQmS9HR0dFtqQnR0dHR0IsQust6Ojo6LUXLe70dH
R0akatUkiJdKMCBmA98AyknGG9fbjj26KNdkdEbCm6Cm+dWvds+tGprQt3TdBSV4k0E8mlyIYtdC
y92xLZe5ai+L20uvcTJU6VMhYiy9W3tmy91P4eCbx8JJJJAgRon6Ojo6Ojo6PbgGAwmAYWnjdggc
YDo6Ojo0bSCyn97bOjon+vDw+9yXcBLiOavNprXSBC7+denOHDaPJ8H/Ie9y3dtSyyXvbr25Zanv
SZCe9oSdL4+KPHxkkkkbJr2TECRFdmVoWCaSPFmnVKEf6n10QgUvzkcZt1swO/Yi1Hp7YPzbrwWA
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
JP0aOj9FFKpQ8IwA6/P89UTI05G97bP0Xv7b25YltsvbFl7d+PhLu3zbL1zyjXeujY0KMVgEJPzP
8f2W+Aa5ehjNUmVzezZNmcxz0SUJunRNPms1kQ85Y4F3jkNfv+mB0Jejo6OhcvX9HR0JejoRb0dH
Qv6F67o6OhL0dCXo6OhevXr+jo6EvR0Jejo6Ojo6OjoAlkol09AOjo6Ojo6NiUZEs5dHR0dHQyKJ
fN0ouXR0dHR0dHQl6OhL0dHR0dHR0dHR0JejoQ/R0dHR0dHR0dHQl6OhL0dHR0dHR0U6OhKJJd0P
0dHQ5dGhLqVCV7hxbESzp07p06dCdOnToTW24rE226t3XkNu3K5b5Zq1sZGrRk8vNs2ZvObK6dU8
8A1z7Mhls1PPmsB+/vp5+nz+3tm29olt6i9tWIXW3v6/C9W06LbSs6OjNozdbb2xpxOJ6OhPynT9
BJ06Pr6QnTp0ZdO8cpbRAltvdua5r15oua5rmuZH6lJFQ9fyDWDU1KGqPj4yWX5KWB6L4R0dCE3R
+llsN9c8dCZN0dCE17f6L3Oi9v9HQjoT3troS9CXo6L3bmXXvXMjXbe5bbvvVt6tt13pde4uvfBz
fl+MdeuXL78tWJr8tXrl65ffiy2/Fy/oXLr89cgsvy/Ohcu6F65enqxtpLl65dbbavXr19tttq9e
vX222r169fbbfiF69evXr1y9evX35bavXr16+2221evXr7bbbV69evttttXr16+2221evXr7bb8s
tXr16+2221evXr7bbbV69evttttXr16+2221KuXJV1tuDUAxjb/TLqovCe34qJNvqaigjMs/9mYy
H+E5jvOI7TLPzLnieNc4eJ4nbnTgE8TxPE8VRMbWYVBeSzk+o4zmyJ4nifYTxPHOHkaezf/nieJ4
njuPEjn1G2oCpug+vw8VQCf2c1gNrFqDE8urOnieKpXVPp4niqAb4OlQlKAQ8c7kcMZp2nieJ4ni
eJ4nieLTXUPChLwOBwOBUBOBwOBwXGf1ZU8TxPE8TxPE8TxyuY/MAeOcPE8TxPE8TxPGp4apzxPE
8TxPE8TxPE7efE0DiPE8TxPE8TxPE8cllFCooJzxPE8dfUeJ4/RzHieKoIMToAWAl6ANPE8Zy2n4
dRw41QPmljDIE8TGnOHOnieKoHUABvG2aHkeJ4nieKoMVBuBOE8TxP47TCVCJgdXmqIlByoOmnwo
BVAT/hOM6cntUBKgJVBh/G2oCczkMn47znOhQEm3k1QOoCVASd+/NqAmQ8TFUFp3Z1QqqA0xjtVC
qonVCn+enTnsh/75OhUN58WhOCmzZ8Z7KnVlszkjlDNsUFB3qgDPYc5M9njk3Z48FQioGDHwCgQV
D8+s+T+z2ePc5M9PmPDLhjof6n25TPZybPHSemW4CYioj+88cZ757PZ7PKipUDqBdQQqAz2OE8M9
ns9npzg/8z/NBNng57PHXlPI4Y5P44c9ns9nlQYqDMV6+ygIVGapBz2ez2enVCxv5n+mefPZX6zy
oWXh2cTZVUUZ7PZ7PKhdUJYzGG8bao0P3PZ7PZ5UMKi4yVAPmfyefPZ7acWbmb+c71SKqcDoOg6D
oCGQz8QZhwBOg6DoOg9FQ9Q0PI4ghOg6Dm5o3JB8cqemVz2ez2eP7MbOTfUDioAPHPZ7PZ4+1QEo
EseoG8zOqMs9ns9kKz5nnnJHd0f+ez2enPDROxQBqgxUNZ7PZ7PHqqDVASbZiqAU9FQ5ns9ns9PP
mfxvjkac53PZ44zpOKnQbR3H7ns9ns8qBVQCoFlAcoAlAkqFc/ns9ns9PPmf6drRzWzPZ5UXKgqb
jb0KgHN57PZ7PH6qGFAMbxpeyogVIWez2ez06opUEmZ/gvPnvrKZ5U6nAHnwruVQGez2ezx+qhhQ
DG8aXsqIFSFns9ns8fqopUExuZn+mnz2eDnjtA3o+KngqBs9ns9nlQUd5jG+b3kqKT9z2ez2eVD8
+AUCBn5mdUHZ7PZr8y4z9W8xlRMqCjkOQ5Dk2545DkOQ5Orq6uo5DkOQ5OqQ+urJSaXBwe570xp5
KijJ5fZs2ZhUBbNmzZs2bNhxdfX1dXV1n9kjpVBKoZ2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZ
s2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmz
Zs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZ19fV1dXX19XX19XV1dfX1dfX1d
XV19fV19fV1dXX19XX19XV1dfX1dfX1dXV19fV19fV1dXX19XX19XV1dfX1KLZQ8W9X5ls3izXVA
Si2UWyi2UWyoBNiU4DyMCqoEUWyi2UWyi2PHF445z1wigGVB6i2UWyi2UWxz/3Bwqg42zROFRbKL
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
63kwcL46fDGyN55+NHs3nJ0b9ctbzy2bJH57Y/E6P2ZvPLRP9vNaz7VRwaSrLVZZwGQYWOVZSrKU
LCovy3jy1UQdCrKVVWExo6lWUqylBAqMlRUoHOWt5VZSrL996rLVZfuqIVRCoTFBiqO1QaoClWWq
y4VZKrL5a+WUIyovVFCgAVZarLVZSrLUC6pXVHShBUGKoTVCKgqVZKrKVZKrJ5aduDwypEVGChLV
ZKrJVZSrKUBSo7bzy1vKrJVZKrJVZPLW88tbyqyVWSqyFWRy1vPLW8qslVkqslVkctbzy1vKrJVZ
KrJVZHLW88tbyqyFWRcKrIVZHLW88tbyqx1WSqx1WRy1vPLW8qsdVkqshVjctbzy1vKrHVYyrGVZ
HLW88tbyqyFWOqxlWPy1vPLW8qsdVjiqxlWPy1vPLW8qsdVjKsZVj8tbzy1vKrGVY8IuBViqsXlr
eeWt5VYyrHuZViqsTlreeWt5VYqrGVYyrH5a3nlreVWKqxWKsdVj8tbzy1vKrGVYpt4DCGPy2rah
5b1dTeeWt55a3nlreeWt55a3nlreeWt55a3nlreeWt55a3nlreeWt55a3nlreeWt55a3nlrVQbzy
aoVAAapqqCoyjV5PhUEKkRreeTVDpNU1cAoRDV55a1reeTV3BNU1RUBZq88tOLJ5/nJGqoIFBeap
qh+zV55a1reeTVCoEDVNUITV55a1reeTV8lAgapqqBBQQGrmOdyo3VFhz8ngaqgUUHxqmqoE1Aaa
vPLWt8Z+TVxgfM4M+aqpT4/FAoomFDAb+6VUem8ZO/flM5v3bjfN83zf3bt+FUEG/eYuvfu3G+b5
vm/u3b8plN+/KZTfu3G+b5vm/u3b8plN+/KZTfu3G+b5vm/u3b8plN+/KZTfu3G+b5vm/u3b8plN
+/KZTfu3G+b5vm/u3b8plN+/KZTfu3G+b5vm/u3b8plN+/KZTfu3G+b5vm/n92/KZQA5TKdBxHEb
5vm+b+06vTKZTXgcplNRw5M3zfN8382dXRlMpLrymU9TrOI3zfN8388ddMplGeuUyjcxmDfN83zf
3ZnflMpv35TKb9243zfN83927flMpv35TKb9243zfN83927flMpv35TKb9243zfN83927flMpv35
TKb9243zfN83927flMpv35TKb9243zfN83927flMpv35TKb9243zfN83927flMpv35TKb9243zfN
83927flMpv35TKb9243zfN1QAbt2/KZTfvymU+N8ygAUACgAUAGVye3KZSb4ymUpl96gAUACgAM7
d885T6CZAQmryFrWt55NUITVNUITV55a1reeTVCE1TVCE1eeWta3nk1QhNU1QhNXnlrWt55NUITV
NUITV55a1reeTVCE1TVCE1eeWta3nk1QhNU1QhNXnlrWt55NUITVNUITV55a1reeTVCE1TVCE1ee
Wta3nk1QhNU1QhNXnlreVQ6oIzY2gOD++c5xuNdQRqhs7eT4Nc193HG7dxxuNc11QMqWM5ya5r7u
ON27jjca5rn+qK1Q4qFzXNfdxxu3ccbjXNfmZUDqh01zX3ccbt3HG41zX55VGSodNc193HG7dxxu
Nc11Q6qHVSmqGzXNfdxxu3ccbjXNdUcKhM5eTXNfdxxu3ccbjXNc+1QoqOlQca5r7uON27jjca5r
871Q4qIDXNfdxxu3ccbjXNdUnfPPJrmvu443buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu
443Gua/PPPJrmvu443buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu443
buONxrmvzzzya5r/XHGfyXHGTNc1+eeeTXNfLYDj/yOExOaNc1+eeeTXNfK4TjI5AxdJwGua/PPP
JrmvkuOM3leOP81zX5555Nc18vxxmt3HG41zX5555Nc193HG7dxxuNc1+eeeTXNfdxxu3ccbjXNf
nnnk1zX3ccbt3HG41zX5555Nc193HG7dxxuNc1+eeeTXNfdxxu3ccbjXNfnnnk1zX3ccbt3HG41z
X5555Nc193HG7dxxuNc1+eeeTXNfdxxu3ccbjXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxxuN
c1+eeeTXNfdxxu3ccbjXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxxuNc1+eeeTXNfdxxu3ccb
jXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxJvNc1+eeeTaNmknE/xJrypsmxzzzybJsb+PH6//
MG02jZ552/mG9+Y0xxpcieyx1lVRJNwoA9P2+ABkMsPPzmf1knrnfjK5jzkloYZhGFj8eZGJ98xm
MxmNXGBw5jY/F+ZlmF4YbMZjMZhnhhfXy9DLMrAYLTgcxmMxmPPAY/GGWYph4+BlwuYzGYzANfp6
ZjMZjMeUuIlzGYzGYH2TnR4YPMZjMZjMZjMZhGYzGYzCXMZjMZjMZjMZi+b5uurq6vno9pyLk5Mz
lziObPb5vLxwGIAz5y50ZPJ5Y6Mu/30YhknQ36yP3sOE8f/ITtxOnXiG780cJ25w4DkqRfXralvu
+77vvq6urqzTZNE082zZt2buc1NX204/y9sZ6eAQ5nOZc5PrfpxZjePkZWM0fPH0cf99clSXF+Jb
jm+8kcHw+J1Yr2CHL37yKB+EdGRqi++rqvvq6urqxgOgOdxTA32ZVMnfPVrpk8rowOCIGCwWnO7u
C6PL2Z0YfC6Nmtl8s4yE2XObdzx5Gf7GRjtHj/nPnZg/czaaMD5mSZGvAc5nOfH2c+f+fDzNEyzM
M/z8fo4Dn/Pg5zk/PPWZJpGKYXhr+fnL7mesqxDrGQXVfd9331dXV1YBgc3pxAOh+o4KGIKczjNN
Uw8FvzOR0emVy+rSHxMAwDN8MNGYyuI//nHGEYOP3ZD54rfdNEmvAdG/J/BwZUOZ3z+I5TMnXlM7
mucjYs6MdiujNZ74Oo6zjzmZ6MTjOjoxWH6Mzmfs58scGczPRh8Z0YfS3L5jPHH0YvE9HRi8T0Fj
sBJi/Ho6NPCStaxlLSajqvu+776urq6jpaOOQmTatxxX31fhybJgdAyfB2nFlzxk6PtnH+dJ54D1
MTW3on9PWbdi8fidZgYVhi6MEDjEt+nwurB43FmHiPZnjXo3Yts2uMeYBjmhjjF8NW5uCwHyUuBM
XCmuZRk+eB5bpHHz/Bi/n2ZJoenzh/T5w+JCdBkGPn9+CwWb3+llXu0J74gk1l933ffV1dXV1Iyl
95ktJi33ZhMJi8fjtQ4rHySYn3xGBw5imYYescdhJC0GGYeLw3RkDz+m33XOnCXR9Zs8cmdH/lDr
+/+jnKcjejLnEcP5lN/RnMnz0dHR9nCcWQ/zi+ct0R0dGfzGcqWf39HRn84cE5xIdMit933fN99X
V1dWGm2UCOAvu+9+Q/sGO/f9Zw5Dryv5njj/sgcOZOD852fxw585v/7OHPfnPx8Zv5CX8cWvZtOH
A4I+z7Yxh9n3gcFgcCfZ9sYxh9n3gcDgcCfZ9sYxh9n3gcDgcCfZ9sYxh6nt8/X59Hqd4AAAep55
T820Pk9OAccHsef78fX6ep68A4AfZ94HAYD3Ps++OOAH2ffv74CuCPs+wAAw+z7wuFwuFPs+wAAA
/j7wuHwuFVAqoEYxkKgRUDYf0wGR6tIz19sLffjg/auzjo4xGFMsxMGYRgYbEmFgMbp6ONGLwuOx
WIMUwMTL5eGBpQGjD+Pn54DHhAmJNQwfTn5+ZuuTxKb5+a43yHqqTnAP1/XzmW3zfJao+2nPmc1k
t2Tk41Dns0Djjj4y/DxGWyYAcA4ADgAAcABwDjgHHHHHAOJOJJOOJJJOOZt3Bm4HDI0+2YyBFBLW
wHYtWQhsPYs6FjrkYsX2r5Ev3Xy9qyeZgYALWtbz9YOXFmB7S6AGUYpjmIYZnYzAmAYBgGB4SYPF
mYYmP9zOMPxxhgGAYBgSeeH9/byNE08HgvDCGAYBgGB7YMw8eaZkmSYtB0YgwDAMAwJPBGA9zAMA
wDA9tKfFaTAMAwDABgDt8sMYBgGAYBgGAYBgJ0GAYBgGAhzAMAwDAtMAwDAMBEI6urq9Y95+hrTo
zeZOc6zi+J/LywOMk4+c2duVy2aOzNP+FjAaOiv5lf6c5T4yeSnbitXjim784cR3nAcRy2Wl9ez2
oe/+q/+rq6urB00YAAGA444knzk7fXwMPz9zB9PHmbOZ3MnP+/GvGGV5+Zn4/T9y/pzfv2EmS4zz
LcdHxlDk+HxmnFe/Ic0tmoO4co3qv/q6urq6urLVWsw+TqwTQplrOrwHL5jVhcOQMNhtRw/Ejejz
9gdGKxGrb4A6mSZOfNHV8B49DRwBlmDo8sgdZwTh/Zgg04T0M4y/HBzZvPfP2dJw/Ph5mqZ5nmp6
ef0cZ0/vydRz/vp4Gaa5lGN5eH19ZncD10Jb/6urq6urq6vytMLNk2r3OUBlDfhrGobpkYX5zmT0
+uXzevVz5mGYhpeOJHN5jF5H8MExjEMH4yX2CvVTRJ4YHo+ct8nJmOc587fKMtnDvy+fzk2Tu1nQ
YGN6M6cP0dx2nNnc30YzHdHRjMR0ZzOfZ05g5M9nOjE47oxWluZzJxHN0Y3GdHRjsZ0EYODlxvl0
dGtFg9XV1dXV1dXVjaFlUz+HydH6dW+eToGT5E9nZ1MAAf//////////9CoAJWEAAADgGhJREf//
////////////////////9jozR9SdH5xJkTvPzBYAyvLktnv7zb8eYWN8DFxADI04MHGND+PiNeDx
+OMfF+wPNvRuxoZ/ATCMQyzVMEyfLVvDhcF9lowZk4c2zOMz0wc9dNDCn+TI/fwzDT9vvEe31icW
06zNMs4vjB4XP/Hql6urqv/q6urq98KXgZmIw5gGMYXgOOMSWXG4LG4TFmYaZleHQYmHkLUZBkGB
inyh+freppwnM8fpwH1ljtyWXPD8yjCOo6G9GaOY5v7L/DnDl5+jo6P05TmyWQOb6zXR0dHQcWcz
9WnH89HQcefOPacvV1D1dXV1dX/roVC/PnKZH+Lf8/pwnUeWZ/zkOnI5Q6M8c3/NuyB0HMduS/jo
OTITfv0cX03nEmPkN28xs1mVAaoDWqAxQG5nM5nMqA1QGtUBqgNzGZzGZUBqgNUBqgNzOZzGZUBq
gNa1rVAKoBvHz9vNQCm81rWqAVQBYf21cqApQCNa0KgGUAfvr8/dQCqAULWtUBqgNzGYzGYUBqgN
C0LVAaoDcxmMxGZUBqgNa1rVAaoDc7nM3m1AaoDWha1QIKA3N57N5tQNKBhrWkoGVA1nf/LYbqnJ
LJHz/emHwVssvRJjcUaZlYgyTGxOOMjBmFr6JNWOxBi4/GmaY+O0e3jhaM41Y309fbCGKgeosxv1
6+OsO60GvXlNpdQgu4w6x9fk6Dp5LwH+5Ps6TqOH4y0svhBynCFrW/WbkKBzeZa1oQta1oWhCEIQ
hCEPPIQzTczc8888zTABoqcV+Vq7Wtb9/7WlZSFzfQ61Q3o/dZmmB+bZtaomUF2W/uYy/l5y4fOG
Z0f2jMY/H1yWPx/Pp8YHH4/H49UMYXK68Biej55NXM4/HnwHH4/Ya/wYIf7H4/H4/H4/yw3ydCof
OQ9Dklx6oMOX0yp2HPVQvZkGPx6gCNbH4/3dQvYrH4r2yZx4vH4/H4/H4/H4/ThGQY5jmOY+wxzH
Mcx9ftu8cfj8fj8fj8fj8LhAf2P9Mfj8fj8fj8f4mB89GPx+Px+Px+Px5ha/o5MHj8fj8fj8fj8f
gMEqLVQdj8fj/XH4+mPx+PwpoeCgtUGZk9GkTCx+P6PKWTBc5DDEOKHo/uP1QW4/H4v9MrInAYeP
x+Px6gOUCOZz+Px59GFglQJXwxPn5tPQxTD/sweB2KgfaYZhqgc+jDMPLnJ9/P+dJymGYeSVARhm
GdmQyZj4o7cEYR15sxdfNDtUBmKzKoGOjNewQ6cT0B6I4D/mDjjoPDd/Hb0MDHgoAjkwJ0G0bR0H
QbUHQcqoDNjywOiWD6ODBHQdG02jojoxnlFA1yu0yc8dBx7DoMIzONjMJ+9B0YCY6DosOhUNn0Ym
CUERhZY5ToOg6DojK6/PR0z3IdH4dB0Gj66GbtWD9DoOg6DoP8/zExCgaUCp4KhU6DoOg6Iypqee
iGwdGfyh0Y2NfAsxx0HQdB0KgoBgYY2DaVBJ4nQdB0HRk/jdjvOWIOg6Mgdcw9HRq8/zJnieJ4nj
t2+Z1eDc5tPE8TxPHPKgQ1zbyfxt2nieJ3/gd3NkngZWAOg6DoOjB4D91GoaZ6HKdB0HQdB3nqY6
gbUBvnDnQdB0ZqsecR0YsOZOg6Dog1OgfIzz/I6DoOg6DqOowzewpiHQqDzoOg6DoiPOVdo1h/Dn
Og6PU1PDIeJnZz1Og6DoOg+D0NMxDBMBUD5U6DoOg6Ijz0D0dExyf50HRjcRpkHywGk6DoOg6DxV
BRimwb31vVCx0HQdB0RlzE89EVg6MrnjoUBVB8/QBGmdB0HQdB4qgoxTYN763qhY6DoOg6Dxy5im
t56Lkg6Do/Do0z9PH6zSR0HQdB0H6cnma5sGEf54nQdB0HRLGB0Gr5x0HQdByZfCzD7ZkwVASdp2
naduPzR2nadp2nadp2nbCgAzgZ1lJ8AoDA/H4f/tLhsNhpc3hsNhsNhsNhsMR1UnOI8cNhsNhsNh
sNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhs
NhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsN
hsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsNhsMqHVQJ45nWeWdwiodVDqodVDuEOI7de/
9+MCqHVQ6qHVQ7p25PVpOr7wKodVDqodVDsnqcfnhTi/QKh1UOqh1UO4XMZrZ0HPwqHVQ6qHVQ7g
jh+cHrOPhUOqh1UOqh3w+87hsJmziwiodVDqodVDuW9t+G3ZjDqh1UOqh1UO6fKvnycnKodVDqod
VDuBOvPPgvk9WKh1UOqh1UO6MoQzZLL4ZUOqh1UOqh1hxb9eDzpx4JUOqh1UOqh3CZ888NrL681Q
6qHVQ6qHZDw3SnQcZ9qh1UOqh1UOvezITWqh1UOqh1UO3gr2bfN7JVDqodVDqoduW4huG/FQ6qHV
Q6qHexM5CKodVDqodVDrbVQ6qHVQ6qHe1EKh1UOqh1UO3JfiodVDqodVDsXlPaSodVDqodVDtH6D
oVDqodVDuR20NCn9Z+7tGLxmE8f//b4YLdlVAFxPhZ8T67tjJp2HI//JjTFw3iVMRy/i/xU5/sws
J5Yfw8tJweD3x0cFIWOwRh/nx6bToT9H1nt+u3X75fo8yySf//cnksDgYwJx2GjnveW5SaSYrbpd
2w5XhIdPVsIpciLHWLyviBtvZyL2fSCFPCx+4YtRcFyX499O/sbVyxXse26JyuUncnuaI7bIe/KJ
00Xm9qUdNai9jvdXtSCZ0yBeEzQwV7Bh3KHInJPe1IlUrtON1Qncuzp6VsorJ5wdH0sy2T0eGGwu
d3Y/EYkxslnsLg9GV2/GBzP19YOYGCyRweGjVql0YGTMnXjMb+YX7zOU0eX3h8LHuR24rAGDhcxk
8nhtm0Vskp2stxeGx+ayXOBwXHh4JHRj92H1aMT+fH3rweCwmCweCymVxGM+sBUspmMOIHK0bbBi
6sSXrfg3bjEQkdtyXB2LnTLiK4BuC7uBM91ciSuJ3GgjY5Qk3CiIEbwxZCLkJtey1cmtTwhO5FcF
4uRLZdFclwxcl7UbcIlY6dHWV1bAbLtMwXTXscneIuC1xWavNd5UtM5ZsuD/xOs8jgz504HFflmr
y2YZQByBw37v25LA4qamyW7/jCxZ0fPscPlhqYb26PpMcmEME4v7LZnC+PppHxIGMXCdRxfRhYT4
9a/3w9M54HJx+5z2l6PPJ/97LyWEwWbOLy+Pahm+5wBi723su1l7OQ98Xs+9PZeb4X3seCsuWIe8
VQJO97PvS4r2c9x3DF13LEVuRO7kTkRXBc97NR2p3K9i2lXsuBlyPcFhQI2W9qfrKHgrkttTDcjx
ZBDd2dLdFlvzbkq79OEz+IMFn//hMnDnDhslkPyfOfM+D25PZNgZc/5acodXEmXxmMYcs3Rhf7MZ
X8+Drwnu3A4r55ODThDByP7uzI8HTii43nRjcNkw8ZnfrLHasO36b/4jR8feA+8ngsHksXh8h+Z3
3+a5SKkODzKJUWZjL3snn91vlUXPeb2PzoZk83ltO9NcD3xn8H6yA0feYvA5TKZs7rlK5BgU0XCM
RDkRRfDwV0hai4BWJ0m29gp7pcnhJiHSCK77LjvYD0ijEzvYspb2jCE9zJFwwncb2ohc49FSd3K2
/EdKgCUD/QcLTjzuS35/SdR4iY2awPmwHsoDlAqoElAqoFVAooFVAsoFlAuoFlAsoFFAooE1AqoF
tOvZswTMIaJZLBZb5wGjB4I5Dzxc2cwWr7zfj/5PAax0nj0enloxBgfHRjzt/vbBYGv+d2PL/xWF
ynxrOM49VN3h8f5dqPymEcGCOI9L2fpWRrp0dGbp8+Xhx9UhNYnyuEthFyprLgJCQSBRezkXse5H
uG4bEXnteyiLqxCxOmT3DFtyD23ntQNyJ7juYYud2rhvalCudo2O94sER7RbZczHs7bgGsVtJIEm
2W9ZOSyYPIroiE9wveIQ4iPSY3H2eagDMM1FArhzHUAhj8e50GFg8+qCP7oOD0xHod2szt31ncf0
YPI+xsY7DGoYwYE5MsYJ8T4ZIezwzBk4HMZTA405U8PcCSTzYzVmsyZpmZLGusSRLossviE1V/Yk
PZeybkGTAEesglLa/1PKJ3cai5k+fm/BlOb516wYboO076+v/5+3o2U48nCf+0bCJ8r/4TLf+F99
+U8fj+TXIOTyWEymSweEyOY8/vKXBlvz13/2GwvzvwH9lYjJ/Pjlcrg8Hkslgslk7fz89cvkvXCn
BlNfxlbhK5U8W0cYuoKCuC5UlHbfCIsowbt1lwouFK6ZBIuBCRBXIUIe4L2cVwuMXKsTPYhcKXsF
hW0KlKUvJNp2wIXejRaJJlwrnJfV7HAJXig3NcDroW9BJEXIJXfThsWoAVAticgaPjglAicKoBVA
h4mwbtMZ0KgQxbc+dH804v/EZo6DHwWbOXBSh3v0eGz6MD8yOMxZ2HZs58zi+vqNxHIYnpnf30zf
Pws/sh8//v/5YxcSqAv3FZfOZvMg+9I+eK1+fudeVyzMRlzG+JsBgi8Nc+Q+/zBeE+jATSeEbZvD
Nf+W8+jjbrwf8WvEbdP7LowmHzWNwuW/jE8vnx99mTyf9g8FlDQSMnlPAyfz0wOQy+z+wft+4jB5
bK4nw//fC79uUymD8vrUjJZPAmPk8Hg8hkMts46PEyTAzOV9jA+NeEbofVpgzcU43tRGG19yIS3B
Aoe5Sh3i4Ui9jiNEXshK8XsexFyrrqoUWOi5Lsbp3tIqWlVNFHti/GON7LvainR2wnvJdbumir5Y
71AGaqoD16FRJ/e5pbf3DfRuqB1UEKhcwPTNn0eePwqgJPStTI/zqxvjGpd4s/Py+Lr8+PPdd6tY
4TX0UMjPnEYOKzCd3I0zi/ljODh1bMYUasZFDlyurWJ1mXhk3H7/Ai4w+qS25S4zuMffzNhudd7P
3hIL+XOj4OXC+X/Dt681nsEYv97en/KMGEYGvYCRmGx3OquZ8hTdHnisd+6L2ajVk8JhMnk8H6/R
k4b8yWZkxGN+/XC5XKYX3/ccYCxrfH48sHkslgtBa/OeSTT76vjz9PzLYbC5bB+uuXg1cL/e/j8v
dYoz9HkEsPfjiSL4gbtM8J4Se1D3dsJiurluC9k3s9BXAi5YhNdXm5b4sR2XsNqcRsuCLgu3vakE
i1ZcL3Dc43seOtY94uVr3TaouDkDx0r23xcGya+FsRCL2pFxjuvYaE42F2pngZFQgqADh5PGdznP
s8Mqc6oJl9H6MYb9ccd/4XQcH/0HNkMZtm2nN9XIR25YXDkc77GBhsuHwt+fhzlOPO4vxMQxFxzf
V1cuX5jK/DMCYFPlt5JJrezPrxxepJvZN7F3kfu05yOI88Hnfr09Mp84Wc6+c4c2S0Lg5Q7tI/3b
RYsvYCLhQ/QI5TJ5DJ4PJ5PB4PJ/fnmcjksxv//748/3KYbCZb/9pvj63ZbKZPJ+P1ksFgclOORy
GRyeZ+PjLeH5+emFyuXwu/+//vdmsxP65H58PX8xeNxo/2Yy3/g8l+eft+5XD/274/Pnds+MNlv/
38PvJ4PKZPK5TJHccWSweUyeE8/yeh0nBksrk/r5zJZmbBeWe2RlNmzL5XJ5DKYH4OaUndyRbCBW
3Yu0lt3ECTlfEXBcFyO6BCKQhPEM5enAFlXoSdBU7riue4alfF4KYoLtG7ftoNgemnTu+DNxRrKE
YxtRhePx8fHwoCVAqeecO72+T2dnUwAB///////////0KgAlYgAAAGNbPtwR////////////////
//////8+Pj4+Pj4+Pj4+PgOP8zxbrx935XA97BLu9n0YG8bEi4fFcWK8E+rH9qZM/jfF8ZbojQUX
57X5HnZJA3tRGnz/qbzkFZXF6xMQlnwPHR+YJvz7YPjA1rjpK9tPmvh6GfL0YXbtNExRI0sCcOry
wmG5AbA9Gv2rGnR4mhgfxE3xjjJEcNls0ZXvjMFu8TCyYTDw39/eHxr8PBnvu6Pn0MXJhMbJf2D9
MFhNz+c3R642YBp/HhgzCNLV+Z4z3jCGjh88aWH1660M/zhMgUDZYMQIpr2IhP21G9npkyTD2kK6
LoSe5XSuhOgltwwIrBvK4eF9REexbfCBFibmhLAU6Hq0YuikZoFkJ6dI06Yq7LgpYK+r9NmcVA+B
waoLVAKozVFOTyuDzXlgTFNfbpwuFUBOMNszG57A8f+In9Mwd0+SO/5ONURKiPJ1zONy2X+/Ajn5
y0Tc/cfWS6Dm8Bsjnjb+78DksucfPgHMpyTPmPHI/MZjL2k/9mfaSTjLgzJwb874688csehcdHRl
snp8cFg87txuNxvtkM9hMJoye7dgMz8/frjMBkc95atOnRpwXGWOnGYkwMD85jK6Nf3hMEPsE7fX
Ba/XL/+Qw82zRoOmJNH1i8vkQ4LBcatdcZvwpgYj6+PrXgsFgcDgsHkcnrw2DxBFk8vhRBhcJlzL
wGMmzOWkb568NycIfLAQOx/WeTVIDVlM3lkR0asHNp0y/3/Og6swO/Vp6EzTsOZJymewNwIwWpHh
9517locOQvYG/Sl+3ftRDuVwwi5HvMJu100dt+WBJvTUr2PcFyvfFzu8W1goGLxew680Iewr2DEd
C8NWxcF4dFOgUQVwxd3JezkdJimaqSlRQqAMYZSoiyXH7Q9Vp+Hmd57Kgk5ziy/7hPqPLGqArIT3
MY3vGS147zMSk10bRkWG3iLzHt+6A+14pi3rlfMw7zfjmAwyfvB4nJz2GCaOvF+GvMZTHGJ54UBS
YPw/XTHuYBgnhnc6dBh4bJkX3l9urX8/E+T0UJG/cOSwJhHT9ehxmhg8ndcdG17g/QaTi/svl9Uk
82Q4qYuBE6Dg+MFifTX571uOyWs4QfubMfGtMQyJJJWa9EubOHy+DCMcGIMub1xGIyOJM+fL+Prj
/LEUi7/f3MZG9dx5HWcJWOi5Um8FctyFktRzdCSnQ/Za95vYd7NRcFt7PEbkXC6HRFti5JGIuARs
i8va1AYex0C9ER0u1FW1ilwX42HSL5pUrlIgrhFLahUEqhz7yA/ygR1Tbj6z2zLHCf5/Zr/VAJ9q
gw+y5VC2SOM/lBdgDiPs1jYP9ioIVDaggN4zlBWdf+oAFQe2fRKqJlQIfCgON03fTMHgqKPAByZj
IQYnx4GO30OA5THn/Md6ac97feTC5as4WRknrj/7K484M7YWWPYwN/1nGP8mOcv9cz+Bx7sZuBgd
WTuspVZPzS5EHGe5he7N/zncL4nFkvw6C2ZCuvVt0ZdzBMHy+/sB4Zz+PDC4D++Pj9xGDOTLemT/
f7wx35uynDMlunymWuDK5TI5LJ5PL5m8F8fH9+7/ifZlsplMrkshkcmi5cxmN+///pp3Q9wX5ApS
vZ7prnvZ6ISxeRTOluB0WXsQkXC73I5XSE94Q9UOV+LItIRe1M2wA8CmQmJdQRvZ7ihdV2dCchsW
Pci7ovEXm81rZ134SRSoimpV7w9+Q6OwYE0sQ6gUVAby/C0wVQIfygPN0wlAicKoLNtQCKAc3DeN
Rza1nioEsgoDTXz6oFlVCPQoAfMHmdB0KFp/dROYHEeRx+OOUDygaadBqyB+GYIxFAiYOfUCBy8n
GoAvn8051QDdPbCgN+cpq6TNOX0/ucvt/TBMQ54jPffv9+eAzOf+4xYGmDqmztufx+M/8qBuGNDL
WYsf3wOgx/TOb9GcweGO++Ofi2CwRyHMqbPaz5xigfyueUFagfQYxpqnlUlqkpUlxCFAgoEEHeoE
FAh+x6KrlUmKkxUmR9fqgQUCCNygQUCBzGPaqXFVwqS1SYaRjcKBBQIJVAgoEERjlSWqS1UUqWzG
9jmUCCgQ/kKBBQII+oVJipLVJSpLxWuRQIKBBH6oEFAgiDLVJipKVPKqZUBOEyigQUCGU/VAgoEE
fnsqS1TGqSlSVEIUCCgQSqBBQIIiFSUqSlSUqSohCgpUHiVQeKDZEQqSlSUqSlSTEIUHagtSqDxQ
coiFSUqSlSUqSohChMUISVQcKD5EQqSVSQqSFSREIUGyhKSqBBQRIiFSSqSFSQqR4hChQUG6VQlq
B1EQqR1SQqSFSREIUFKhFSqCtQhIiFSQqR1SMqR4hCgQUCCVQIKBBEQqSFSQqR1SREIUCCgQSqBB
QIIiFSQqSFSQqR4hCgQUCCVQIKBBEQqQ1SQqSFSNEIUCCgQSqBBQIIiFSSqSFSQqRohCgQUCCVQI
KBBEQqRFSSqSlSTEIUCCgQSqBBQIIiFSUqSVSOqSYhCgQUCCVQIKA9EQqSVSSqSVSTEIUCygkSqA
xQJIiFSQqR1SMqR4hCgNUBiVQIKA5EQqPNfQuXGh4g8VCGoHUfujXrBgujyW3AoD1p2H6oLlBT6c
ccY3jhQCGRjvvyyxwcce+jjjMmHoNQ4eOOOOOOOOOKG4qEG5pULehqeWXML5fVh/bGnKZBgHBk/T
0+/L04x+YboxBZCucz+Ox+fMEzZfXhJPgwc3lvphkHQn1++FjDUHdjcCcmU8fAzO346D2CZGY8ju
xfp0HllDkmd1QAqAEKgBUAO7uqAD/svZNsIVACoAd3c/z/Ij+P53dz+P6+LU6RYf6oAd3c/T+scb
wR/n87u5/n+i4T+P53dz+P69kn8fzuqCDvP0/0H6fp8/2rcc5/H8fp8nEeW7IH6NwIP0/T+P7K/p
+n7cqLgP0/VQflMwdJ9nQfh+KgRUCnOdp+nLfz9Dn2fCoeVBDufZ8uNjoTn6fju7n2flwLFz2CfZ
+O7ufZ+Xs4/D8d3c+j8oVL8tPQ8nd3UARvmFqUEOHd3c2TENpQNMMkwlA07u6gJMlQBBMDQYZuOt
9cd4mVjzfNJQMGr05jMrVA4oGFA6oG+nycyvfLqg3PG6YhpG6eCoP3U1e32cH19HyeH1i/efI5jL
YHGfR9nx9fX070pSjv9fX19O9KUo7/X19b/p3pSlHf6OTf9fC+MmXTX1UAigBwvRcpZn4/uk5vTL
85Dom/fvYYpznCYOD/PzzzmZ056k0foK84zHZ44Mfk/3+ynx9zUNHKjiPT+OcyN+cf420zmrEnhN
g8L8IvZJx5EchOaCDoH9w+z7jLfmN9rgvZNzoiO1EChY8CjtIogie9g0QmRD3b3p7EzouW9gotRY
mSxFyEi4eOAwgQVsTvbZcNjUsXs9Ca5b1cvReiIA2VxKgBUANy3KWZzxEVy3KoAVACoBpK2v+OVF
AEoAVADctylmf8iK5blUAKgBMKq73/sbq0GCYON9zBxZiqCQ0jB8zBMEwcF7mCYJgmCYJgmDtMH5
/65D5+TB55MHB884zH884/H884/H884/H884/8NA0tOP5fw0+P1ey8OZmO9jmOH0yn5548Cf1x+o
OYxJZzTZns+ZpgJk0Y3z0HxlgeH0c2FwHhcmG6Nxxj45V3MxFhmHgZPjL4nb0ebczfCLgRct6tRC
E6CRezEJD3sVxvVz3KgUyCTFenvdTXCiEXDe89ypXuG9PCW4ErxcN7PJGKDzj/s1jVx/POPx/POP
O4/lQFj5+cfj8fj8fj8fj8fj8fj8fj8fgTSLH+xqY/HmoamPP4/sxjzUNTH481DUx+PNQ1MfjzUN
TH481DUx+PNN8f0xFonGqGJvVUNKhrd5/6gMYNyI1BP44L2pC9qQOA4L2pDDouQctOYfve1IHAcF
7Uhe1IHAcF7Uhi+DhOnN7scYl7UgcBwXtSF7UgcBwGHvRcmrJHD7qAVQBnAcCgDUAZwHAoAzZMQ4
+VAGcBwKANQBnAcCgDUAZwHAoA1AGcBwKANQBnB84acwTFzHRkcwYhkGB+7N+P9vvN43DZ7OS+fn
kSmZ94HED/GD5ZXKZDGmCYOb/PinObRu+ehhk43A03akjOHJkfDL5CDP5/cv7Y3F+aLgdLciL4va
iiSb8Qni5UE6a8kl7kDewe5EIhF4Spr1ct7lwohFSRckIuS1MiL1Tg2s4cCgDUAZwHAoA1AGcBwK
AOxaoAzgOCS9qQOA4PwUXJ0Gr4ok/DgOC9qQvakDgOC9qQNXDaf7PfSgbN69qQOA4L2pC9qQOA4L
2pBDDxuRuHYC9qQOA4M7e1IHAcF7UgjUZNyZowumDgODKZQ4DgymNNRhx7j1Zj8ocBwZTKHAcGU5
OUTs+eERlDgODKZQ4DgyiXjgGRyfTlzgODKZI4DglWCCDDpWP9UBb6KgbLZlQI9FyRFyZXJjckly
RHIx+vsBr86bbk7YgqTXJAeYGLkuSIuS5Ebj5xmV/ds1tyXJEXJXEXJHT0sp54NQXqDDEnKep0KC
9QXZSX82Ej3UDagvUJnzkzz+1BcoLzE8ML7ElJQXqC5UAb1BcoLjBMP/yf6eGc2qC5QXui8qC9QX
EgyfTeZeZ2KC9QXKC5QXFljsLo6ATKC5QXKC5QXEj11eh7eW9QXKC5QXKC4y84giSkoLlBfeyVBc
oLSSkSUlBcoLlBcoLySkSUlBcoLVBcoLiSkSUlBcoLoQoLlBaSUiSkoLlBehQXKC4kpElJQXKC5M
oLlBaSUiSkoLFBYhQWqC4kpElJQWqC1QWKC0kpElJQXKC29kqC1QWElIkpKCxQWLFBaoLSSkSUlB
aoLEQoLVBaSUiSkoLFBa6FBcoLiSkSUlBaoLrkQoLVBcSUiSkoLVBalUFiguJKRJSUFqgtJQWqC0
kpElJQWqCxmLw+PJFpdMRclyRFyXJEXJckRclyRFyXJEXJckRclyRFyXJEXJckRclyRFyXJEXJck
RclyRFyXJEXJckRclyRFyXJEXJckRckb4jy7Tr8vLFM8oODDqBGIiPLt2eXliDR8oiIiIjyxPb5e
U4+URGC0dEbfLD4jy8u3b5RERERHk00/Ly7e3yiIiIiPL9NPy8jTMTy/YDXCZeM15YpQK+Xli8P5
RERArI8jJ7ePXLmaZ+ro+lROqAaduBxZpY2I/8nHb20pSnb2wqFqRCgHykdvbSlKdvbH//xH//x2
9tKUp29sf//Ef//Hb20pSnb2x//8R//8dvbSlKdvbH//xH//x29tKUp29sf//Ef//Hb20pSnb2x/
/8R//8dvbSlKB7Y///z8f//15DI0pSlcj6f//4a///15OelKUzGT1f//7s///TkctSlKZTLeP//+
ft//+gfmlKU7Rj//4j//47e2lKU7e2P//iP//jt7aUpTt7Y//+I//+O3tpSlO3tj//4j//47e2lK
U7e2P//iP//jt7aUpTt7Y//+I//+O3tpSlO3tj//4j//47e2lKU7e2P//iP//jt7aUoPPTH//9vb
///TfGQERF4H//6X9//8my/hEadM0f+1/Lt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8
u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIi
IiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIM4wsQs+von+vztxGG35iMXiMR2/n529v5+duIxAQ7ox
GI7fz87e38/O3EYjnJHufOIxHb+fnb2/n524jEQsNM+sRiO38/O3t/PztxGIiDFPrEYjt/Pzt7fz
87cRiD6+VQ5PZ2dTAAH///////////QqACVjAAAA5/R13BH//////////////////////574jEdv
5+dvb+fnbiMRmD1/YxGI7fz87e38/O3EYgyHzZ1YjEdv5+dvb+fnbiMRECeuIxHb+fnb2/n524jE
HdNEYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnb
iMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxDfz82/X5+f
OIxEREYjEM5/P7a2fdiMRERGIxGX2fk31L8hxGIiIjEYjf+fmV/vz8yuIxEREYjEfP5+cdv5+duI
xEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnb
iMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n5
24jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5
+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb
+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
dnRpL0zvt2b2HDL/rHj2B/fHZlPns7PnX2HPk85i5c779mzKD2dhws7OzMGZurt4j9q3X2f2S7K+
RkaW57Jaew5VAF2dnYWVw+H986YPl2dnZ2dhwfYfh+zo7Ox8B8nBgJTHznZ2dnYZGs68Xi/fC5Ts
7Ozs7IEPw/PZ2b/Xs8ippBGUD2dnZ2eP6cGENw3sSYXZ2dnZmm7jO2fHZ2dnZ+SmPqbJw57r+zs7
Ozs7MpiePHjs7Ozs7A4fbgPPd2dnZ2Fq5L76D4m8ezs7OzyyrPDyMDJz9nZ2dhpHaYdZQ9hg9nZ2
fb9gaioAvdnn2dnZ2AYjoPn9z3Z2dnZhsocjTsNDN+XZ2dnZ2dmz4yWH6N8dnZlfL6wLVQF7G52d
nZ2UwWWnz75TG9nZ2dnZ2U2IZt+OfTs7NGHpOUvxmOzs7Oxm0wOMHhODM7Ozs7Oz+M4PxWOzs/df
Z7mp0M9JmHD2dnZ2M2mBxg8JwZnZ2dnZmv4yvYPx2dnZ0dhiPsrwc8nZ2dnZKZJy/n6YJ54Xs7Oz
s9+yXOqATV2HX2dnOA9/hGW8tdezs7OyTN9nZ2dnZ2dnZJp/+woW5EmyeBjeuS7Ozswx7dnZ2dnZ
2dnZicBjToxfl2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dn
Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dn
Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYqC+jfncphxb2dnZ2Yb6bj8JkfJvZ2dn
Zqz9M1mjC15Ds7OzsBkuavjuiTs7Ozs51tyo8mHnezs7Oyud/gSTZ7s7OzswPRukCHFZzs7Ozs//
/XsYcGE7Ozs7MVzzjzh3/nZ2dnZ9dHtkclqBx2dnZ2aecDPgc9o57Ozs7AHM3ccGWx/92dnZ2FSt
N+OyeO7Ozs7Pb4VBGE0S/HZ2dnZ13wmu+zs7Oy3t7Ozs7Lezs7OywuyOzs7Owb8Wdyfs7Ozs7O28
3l+zs7OxI7Ozs7L4vN7I7Ozs7HtvJeGzs7Oz78Tj6NXPR0Yzd0eGG9CvgedtJRO7w+8H9/uZ37xM
rxsyPleJPTb9+j4IOKyckj5PaWPMLXhps3kjG+zAwRM/3wDU27op0ZHETe/l5UyeBpqfKef7gCuv
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
iXs7OzsS9nZ2diXs7OzsS9nZ2diWOzs7EvZ2dnYl7Ozs7EvZ2dnYlKOzsS9nZ2diV+wuxL2dnZCX
s7OzsS+P1GlKXZbRLWlkyXKjsx+n66BxO5BnB24TzB96ujBdnOzM9nZ9KBHs7DM/81kMioEjn7Oz
OYHs7MNm2Hphezs7Ozs7Ozs7OxQG4435zaMvzEsLlJrvC9BgB6L94/Di+9p1/WjJ5XzLT447TJgs
D6+hhdByrI6OMxHtXZtkODnPhxheJico3TdBfxp4Wes/J1fU8uNOkz8xrggdnZ2dlnZ2dnZ2dnZ2
XAkpuzs7Ozs7Ley8PeOzs7Ozs7OzsuSI7H7Ozs7OzsSetL2dnZ2dnZ2diyLVlnZ2dnZ2dnZ2diLx
2dnZ2Yf27Ozs7PKfzwPz2WdnZ5GRroXZeUvZ2ZABp7Ozs7Oz+YYpz0y/Z2SAxX72fK5hQuph+zs7
OzrrfHZ2dnZ2dnZ2PCOzs7Ozs7OzsvXZ2dnZ2dg9k/HR2Luzs7OzfKaPhmD+7Ozs7Dv9Zfv5VC2Q
OXs7OzsNfT0fOUzR1H52ZXAmIdRgZH97FABs1bOzwsgvDDnhrOPbkuTr+xlw/zlZK9nZ+j2B/8EO
XzI7Oz0NHs7Ozs7LxeLxeOzs7Ozs7OzsvF4vF47Ozs7Ow5uzs7LxeLxeOzs7Ogx+w8HA7Dub2e4b
z2eWXwkz6PvdgfP7yOD2eZg4Qx9vn+c6/bbP+mBmSz2YOL6MR8T6fuZjy+MtJu6MXx5GBowPxxkM
ucOmccNjs6cm7FHJfOrdrHoBg/zddYU4TMyvbebL2BZewELl15SpNxXSLxciLE6Lwi8JNyXmHu+y
y6uCy4Ui9s9d6iZPSOEVqmqVl5ReUBvFzOSYh/QHP2dl57Ft5vI3ns7Mx4h6Mj0PNhOzsvPZjrze
bz2dmODvws+S29nZ2b+zEHYdz9nx2dnYZXR2dnZ2dnZ2bez2yhYX/Hs7Ozs2dnZs7Ozs7Ozs7Ozs
7Ozs7Ozs7DByPYfXZ2a9OF6OcducMn1lZ9OTr54U9vHy1S6PPG+Ry9HQslzPHvvFrDhLFdF7CMTx
3vNhfy9gI5p0bPqTo/8bmsGckiLEXBewEXIgrzYi8J7whPciE6O1D3i5LkvN7zpbgQkXsBDwltvV
4tvda3s7DU+WdnZ2dnZ2dnZkrw3sfR2dnZ2dnZ2dnZ2dnZ2dnZ89nt2cdnZ2dnZ2Xi8HX2dnZ2dn
Z2dnZ2dnZ2dnZ2dnZ2dnY/p2NIaDEdnYWotOJLfxlezs7JDnycmYx3Z2dnZ5T2dnUwAB////////
///0KgAlZQAAAGcvigER//////////////////////95e+B/xyBo9nZ2dmV9z29jNODO9nZ2dnZ2
dnYeOZMhQE9nZ2dnZ2dnZ2dnZ2dnZ2dnZ2eGrT8l0bv3B5b9OL0wX+On6KTX+++o6/rA4PbvMHN5
398sxziMx9mD0N2eUZb5+UYLIcZ6afoODLzI0YlBymiifSm8Npw4XKmYdJnpbHSpCLgvdvKW9lod
F4RZeb1ciLylsvbVzXuZDW3ns7Ozs7Ozs7Ozs7Ozs/OzswG7eYX1ryHZ2dnZmfvOe/QYfRN2dnZ2
f/xl5cL4dnZ9dnZ8Tt/fbKdnZ2dnZ2dmV9smYZq++UPbs7Ozs7Ozs7DFNvk6zQQfXZ2dnZ2dnZ2J
eg4DT1dnZ2W9nZtPe8R0NkRlz15MzBmr+/mAS580j1nSy2o/Xm55n7JvNLsl0o8J+zfehm6DG+gU
S1UCSGaDt/+zs9I4MPs7OiM1hrzicQmyGLzHsdnZ2HmZGIK83ns7AB7Oyoj+5KU+lAb2WI7LbyWB
yYf/G9nZ2dhhZb098/ljvUA/Z2dnZeTZOVUJ7pGdnZcHZ2HZg7zebz2dnZ2Xm83m89nZeezsvN5v
N57Ozs7LzebzeezsR2dl5vN5vL9iOzsvN5vN57Ozs7LzebzeezsR2dl5vN5vPZ2dnZebzebz2dnZ
2Xm83m89nZ2dl5vN5vPZ2I7Oy83m83ns7E/Z2Xm83m89nYjs7LzebzeezsvPZ2Xm83m89nYPZ2Xm
83m89nYf2Hw/7eSi9rAmUCNyXJ2Hr2dmXNDsuQzM/kUtyXJ2fXZ2f23suS5L3LkuTsn7Ow4VQd2X
JciPCuWuSbs2Gh2dnl2XJcl7lyXJ2c07OzsuS5L3LkuTs9qdnZRQCdmKuTQqEFAmdtyHp2GBl+zs
yWG7LkuS9ZK5OwxcBiNx+cyS5bsNfs9zu4wVyXJ2ark7Ozs7LkxJn3JchnGfcnZ2dnZcnZ2XJcnZ
2XJ2dnZ2XJ2dlyXJ2dlydnZ2dlydnZclydnZcnZ2dnZcnZ2XJcnZ2XJ2dnZ2XJ2dlyXJ2dlydnZ2
dlydnZclydnZcnZ2dnZpuTs7Nu3s7N+wHZ2dnZOHI9nZv47Oyk/r2dnZ2ee2bs7OZ+zswnzP2dnZ
2ctp2dnRo7OzT5b+zs7Oz8uTs7LkuTs7Lk7Ozs7Lk7Oy5Lk7Oy5Ozs7Oy5OzsuS5OzsuTs7OzsuT
s7LkuTs7Lk7Ozs7Lk7Oy5Lk7Oy5Ozs7Oy5OzsuS5OzsuTs7OzsuTs7LkuTs7Lk7Ozs7Lk7Oy5Lk7
Oy5OzsHsLo7Ozs7I7E3Z2bNVezs47Oxuld2dmDrJ2bG/vZckdF6uS5Ozs7Oy5LkvcuS5Ozs7Oy5L
kvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5
Ozs7Oy5LkvcuS5Ozs7Oy5LkS3njwh/vRz0dnZxrO68mN2dnZ2dnZ2dhla89eezs7Ozs7OzsHMf2X
7Ozs7Ozs7Oy8ni3s7Ozs7Ozs7LzeeW9nZ2dnZ2dnY3N/ON7Ozs7Ozs7Oww8Ect57Ozs7Ozs7OxQC
eJx53s7Ozs7Ozs7Lzoyea7Ozs7Ozs7Oxu+83ns7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7O
zs7Oy83m83ns7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebz
eezsZ2dk/R2dlezsvN5vN57Oz88Oxmr/lm7Oy83m83ns7KenZtH4B4dnZebzebz2dlOzsHT2dlOz
svN5vN57OwPZ2ffZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz
2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ
2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2d
nZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2di5cXZebzebyu7G9nQzojo7
CvN5vN57FnR0TM2jF8dl5vOjzkymqEmxN+DL0LrIbbbYmXdCB/pZ8BrR/QzV/Vl/a9AL3J9X35g7
BcQlzxX6yE/Z2dnZAea9E27Qzo6Ozs7Owgatc04NtGD4dnZ2dnQM/5ToyeWHn47Ozs7OjW3js7Oz
s38IF+zs7OyvKMN8dHZ2dnZeuzs7OxL2dnZ2dnZ2dnZ2dnZ8DNzHR0AXwXhgPGXw46Jq8aGUYCm9
sgOjVpfopt+pICCov95Bv1SjZfGvRicNXy3XtA4528Xtjo4BEwdtabOWb+W1KBbMAgsfxkD0Ds2y
jVvR0fr+XhXXUpeJAI9ZedQs6OhFPBFL24GTobxXiYvJmnwpJs3BCUePgtkkaXR98bOj4k6ej+qx
8RJ0bdICW79mygPmegyT/esAW6P5wdHR0DHR0cclHQyyi16VWsgaELl0N59I6AeX69nF8Xthck3S
ycE3FJ5OgWbuZ+gE9eNDJn+OiynPlgMVu3ZCTj7wPR0c+uuXD7/CRsTtdssT+fkDmsT9EVboZ0eM
2xd19FC6Rr+9GnZ0dHR0dHQthnR0F/fDJl3R0BXLugHMN3y/dpdHR0dELaVpXomjo6IS0WQkkPsF
n2h66fUeXn6HBDd+CB0dLK8TcDNq8ctL0B5kl8Q7Pv8oCJeQVn9gcaefCXw4wXTx5U6Ml+fb8ZAO
d2U1bQ/DRH/8izOHB/l8DDcJzztLmX2Dzu5eb2/ujbsY3guGPMPz73u2QlttR6/cm35W+/rNOxfV
vg2kn76z/JSyS7NnjIXg8VDoEOC1M6OHKm6vR5slrxs0V5oDo3Stb9ED7b0dHR0+mjoJj/I9HR0d
HozCe8/oXR0bg2VRPe5/on9WTP88jp1xory1YMjNnLeZuZqrmybN+7V47Jpv/75ebns86egJ/3s7
Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oy/K7G7bQdnZ2dnZ2EXP
BJ+zs7OxnZ0fQCdy7Ozs7Ozs7EvZ2I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7B7Owh
lXP2dnYJLJpvPKImG90Apfvy53hIJWs6OlYv1xJIzxYvnk6I8vT53A1acB5xUHQ8nQyXXrS3l71R
DVyUUdnZ2cyI+h47OwpOyjdiBmp65GkSxWJwo6CRvB8VpLOyt4vF4ReP1spPLN0dl4vCLxeEt47E
t4vCW8XhLeOxLeLwl7OxLeLwlvHYl7OxL2diXs7EvYl7EvZ2Jey9diXs7Et4RxNJMC93I4JKs2fU
+DKt7asvdTI0xz0ElSb2xeCvbFq691Y97kRe7eL3HSwL9CNHQU3ilBtRgmdHN7kmzX8c9g1fo5eb
iv5k9nZ2dnZAQ89E+3Wx+js7OzsaDX4TbAbmAp6dnZ2dnQOz+p0ZXMzfXZ2dnY/i3js7Ozs+eEor
Ozs7OxvKMP89HZ2dnZeuzs7Oy9dnZ2diXs7OzsS9nZ2dnn0Tc9HQ/C8S8cB56PGTonbxqAxnDPgM
nHRr0F0U3fckB4qJf2Rb9UFujyq+LxBFXz33upF7QAs+OLxeLxeLxeOy8RKCAltrTbyz4nCRUFsw
CCwvPgPQO3dopVvR0f3R5eFfCpSglB6y86l0A6CQPkil7zG9FA0aCvoDUv8aI0bN/PJU8/JbLwFK
UfnG3o+Zekf+oHxkvRu1MLo+Nu1jPrZSTZ+eHAa6f9wdHR0DHR0STEPQxZRYTKuzoGlYcuhvPoPQ
zy/ns4vi9cNAEuArxZ8TzwDbXjSzYX10WUm9MFjt+/IycfmD6Oib38JcV8+MrejY1wyjP6+QJi6J
+gSDpB0eM2y3ooXSNf59Ozo6OjojoWwDo6H//mky7o6OVy7oZN0B+dH6uLo6OiB6BrQl80dHRF6e
9fRa0r10owFJq7eh+Ib84aTo6QVln4FE3h55qWOeZJfPnb+f1ADomkrs9wSaufGXw4wnTJ506Mp/
fpSZLk4NtNW4Py2g5DzLN4oGRL6GA4bnndUMvvzzv56Jvf/6N2xgZH4Z0Tj9YC9z78NG77X4LAz7
GRVvkFkv/gNn5XTLp27fPQXiQtDqpzhfAESdDjvr0eoJW8bNNeaM6N+hrfyoPwPR0dHT7aOioH+q
dHQt6PVmHwM/tXo6NwbKz2+UbqgjWEdWx9TZmrKSs2zhnnmnavbLu+fjw89s2zIf8zzh7Pv+zINu
B7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsvhmoGqybs7Ozs7O
ylJZhs7Ozs7Av0e00QPZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZXs7K
V2rI7OzsKi7Rp/8UAkt4vbIejXv5+QwCvSxa63o8RllZ5g6Nkrx6e/588eGvB+8VB0PJ0A1eXleq
0sK8dnYAOroD2dkBS9hJaXqRHCIK9z59GDoio7Q9H1x9NZo2MreUXm8ovP+GUi0z9F5S3m8ovN5v
N5vN5Rebzebzebyi83m83m83nsvKLzebzebzebzebzebzeUc3ucXuco4alh0t5vN7t5vcvN7l5vb
Hp+3viiwqIK9rAovN5vN7avN7WBdeb3Lzeb3Lzeb3Lzeb3Lzeb3Lzeb3Lzeb3Lzeb3Lzeb3LzeUq
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
NW1bVtWiG5ubm6I1bVtW1aIbm5ubojVtW1bVohubm5uiNW1bVtWiG5ubm6I1bVtW1ZqhubmC23N1
ls1LVtW1bVmm4Zubstzd1ql7VtW1bVtRu2G5uYztzc2tGratq2rag2225uYOm5uQb9Q1bVtW1aLT
c3NzdEatq2ratENzc3N0Rq2ratq0Q3Nzc3RGratq2rRDc3NzdEatq2ratENzc3N0Rq2ratq0Q3Nz
c3RGratq2rRDc3NzdEatq2ratENzc3N0Rq2rarq3bc3RDc3NGratq2rRDc3Q3N331bVtW1D+W69y
1SI1nWYjWdZiNZ1mI1nWYjWdZiNZ1mI1nWYjWdZiNZ1mI1nWYjWdZiNZ1mI1nWYjWdZiNZ1mI1nW
YjWdZiNZ1mI1nSA8rzCH2HJqWvMcXg4U2nTr16GNjiGNji9eQP1evQxscQxscXr1tp1LXb16GNji
GNji9egN3WL16GNjiGNji9eDY1i9ehjY4hjY4vXtYvBw6pevQxscQxscXr1zWfXr0MbHEMbHF68G
MwNN69ehjY4hjY4vXtK1a9ehjY4hjY4vXm9O9ehjY4hjY4vXr16GNjiGNji9evXoY2OIY2OL169e
hjY4hjY4vXr16GNjiGNji9evXoY2OIY2OL169ehjY4hjY4vXr17tjY7raxseoXr169qWgMbH3oNn
169evX2BjIXtGZW69evXtQY2NK8xseoXr168kxsd2GNji9evXoY2OIY2OL169ehjY4hjY4vXr16G
NjiGNji9evXoY2OIY2OL169ehjY4hjY4vXr16GNjiGNji9evXoY2OIY2OL169ehjY4hjY4vXr16G
NjiGNji9evXoY2OIY2OL169ehjY4hjY4vXr16GNjiGNji9evXoY2OIY2OL169ehjY4hjY4vXr16G
NjiGNji9evXoY2OIY2O7evXm1iYu+TGy9Xrt68xMiXbKwXr0ZirfSwsn91ErpcrUxneywY3sS81l
PlMulCSffnz8/+7uSX00009zuj93O6udpndNNNMQp7+O5ez3lNNNNI5znuJdqcnTTTTFik0000/5
qU0000r6PBNNNNNNNNNNNNNNNNaaaaecnoyPVhBCyZJI6TjNjq0hiOj5TOSxY85kOjbrd4Py/nm/
XSOOrMqwI5KFKX0J+9f7Su9xw8/jdYzzSPSaR8fyjAxRU/5DMh0azgXQJibwZfuPbxggs5Pe5N9Q
TXcxhZpReD3JzCU9b7ykR+6dK5jPfZL3jYtdYrPf8p3OXjIoOh08HPHec5dGzjq1b67777PnOcWE
ekGDrvvvs+e+3YbDoK+lJPHye5X791ff0hR+aPW8o7bGT/SzfTrJ0kj5OcWMqaxX8uJ0PeUT2oT3
1pHkORK+P44+AtWTIG4HSFxp+P5NiX6nj3x+nh5nrjB+Akq4kMvXHHDjCs2zsfXM9e6mo//g6CPX
fH2cGRRzXbpTXfeD5T5Z/tO85G/afUZvXYylCXecEkoxUp3Pwer1878/5A5ZaE+0k0u0k8Y7/PBJ
KD12495OazU3P1EwdX7B7na6g/0+z5PKSU972Dn73mcnz/6XM+TWEJji9ggLHVizYJGQNviGOuAk
UEGF0UX4cZsdbiy/uAuPE3rCCLj48KRj3UdXYJ7T8eRjBurHXSM4l8IdIoWEEHGhg3XRLkY3jbx7
HTBywzsLD0Z3dzdMLCwsJjO7v10wsLCwmM7u/XTCwsLCYzu7ooszPoDIjY973kbDMys7J1Y973kb
DMzMrOij73vGMwsDAwGN73vGMwMDCthMb3vOYzGxsbGY3ve90ZjY7bHYsu7zYsMTHh+SnNbAz1wo
9f+n32l+7dSy5A0JHvJnPn+a3KccK/3n8nOtSUUdQmnnywp9NOOpqVnhaNo5zo4setWTWOCU54b6
f5/XN/u7u7u7u7u7u7u8y7/3r4eU/reTSCAulyolY17RKNh11XurXGK6dGylh857/3eySzZs2bNC
P3dSq6e4d7NmzZFPNL47t6j95s2bNlM/Z+7qSUryezZs2TVcs2bNn56mzZs2QE2ixws2bNmzZs2b
NmzZs2bNmzZs2TZ7qTWELKFi2ZNM6bjwZBgwiaEEjpnJYsYwZFDojWD8s55v0gibq1K6AhUFsb3t
/obz7j/2leyl/j6cddYPzTPVxI+P5sQMVVP+QzI9GtYEgD0TeOlGOPb/wQ9sqPZfZ2Nm9g216mw8
HuyeE5QnykXaVeTu4z2kS94xrfWKyl/Ny5y8awg6HTx2eOznO9i0bq2wdJJJJHPk5rNjHSLCh2kk
kfKXfmKy6OM7Oxn2yp2vv39qlm4KPyLut5XeoQc/0jtNyMnSSOfs4sHU1iP598To+8onvc3N9bsc
5kSvjmiHgLVoyBuB0uBCvcf7w2HfqePfGE8PM9EIPw4JUQIZejcOMfW7yhjqYj/+Lo2EEuOD4MjY
zSbp8OXfZu83OWf7TvORulcQg9+7GUoTSzgkn/FTcu/g9X2g7885A5ZabiSdxNJO4bHeX4JpweO/
D3k5rMTczEwf/+7qW1r/f7nfZ+5TTdLe/7OlOTnz/9yuz9WUZji9mRG6s2rJLpE2+IG64CRRQY/W
LD8OJCbCG4tPjhwIcevWUbD8uPASMe6nKE7C3/iy5Q3SFpBCxujO5sIoWUbKCPhom6QQJcjdeN+L
3d7kbVW5uTTiIhNNubm5tTTiIhNNtbm1tTTiIhNNtbW1tTTiIi9d1PVdW1K9fiIi9f1TU9V1G5ei
I/ev6pqmparevfiITTbW1tbU0/x+E021tbW1NOIiE029vb29NOPxCabe3NTffaYiKv327UDxwUeV
i7qimI/+4kkn+/eTyfxDqEu2i533nJ92nFR9LOX77ULz116Ffuul5XMLxPTAfvuwZGbNk1qU5zwq
cn/RB8xVVTrpe5AV0sgqhD0716qDWvBgXTBihhkGEMnTdQ0bSQw2Rg0sM9h0bRWRkiWRkDP0Ni0J
kZGRkDu1DRGPRGZHogHEH6yMgdOWRkR0vRCDA0sjIyMgaTJo1noM5VAeHlIZbCyKoIgzH1kwZvlV
CbTlkZCFhkZGxuD6vMjNoltiYWRkZGRkZGRk0myqgdDPd3cOF3d9Hwy2GRkZGRkZGRk0HQfWmR2R
kZGRkZGTR2PpFkZGRkZGRkZGLR7bJbZGRkZGRkZGTRGBhRZGRkOyMkasyMmu+NrmqkOu50RkZOtG
0lua0tc1pot6aytAbujaVpLIyJEAxtG1tVAOyMjIyKoEFUBwZ+rMjIHYxH18MFg0FVQSqoJ+HOHg
ZpDH1kOy6kYweodZjahrXV3+s62YzaHkYwcNyJ1MOJlthwanqmhudqDp1TWA8g49YYWC53q3frLH
GoEA0w4w6YcOYgGMy6a2623Bx9ByBxhxhyauHHrgeaqBC4GAGKGttoaoGxpwcYceihyBx7aGqMWi
WP/1QgGdrYcaTWHGbTbuH0EO0gHH8PsOMOMP8ONVQKHZebrDBqOuBxhxhxhx7aGoMGjMB9tAOJtD
iDj0o1i9jSW1w4w4w4w4w8A8IuMeihyhxhxhxhxhx7aGoENGYP7aAceuaoHGnEsf0g4w4w4w4w+N
c0nxCxrIcocYcYcYcaaqAJVQLGjWttDbQDjDj1AOVoIEoshyh8h0h0h0h0ppsPWn200w6Q6Q6Q6Y
MGCjp2hpph0h0h0N0XLSDTo7AHGHGHGHG22NJvqoDQ59cDjDjDjDjDjDowGV7RttCA4w4w49Y/to
aMQ0f+sBxhxhx7aFrDN4PAOEOMOMOMOMOAPw8ePr4fgcYcYcYce2htoaNasf+3BxBxhxo6YkQ0Vo
15oDjDjDjDjDqDoVQJJ6VeD2bw4w4w4w49tDbQ0ZgPr+oBxhx0n1b0lvTDjDjDjDjDlD4SIMQfYa
IcYcYcYcYce2ghd0Zg/toBx6prYcaaZNlYuUagHGHGHGHGHKHwkQYg+w0Q4w4w4w4w4w5UE40Zg2
0NtAOMOJtDiwfwZ8T2dnUwAB///////////0KgAlbgAAAOy8tfYR///////////////////////0
qgqDjDjDjDjDu1tKiDLqQcocYcYcYcYa22gGAGKwaNtoaoHGHHr+qsp2JVAGGZo4cwcwcwcwZ+hh
zBzBzBzBzBzBzBzcWTWrifvXkfcGoPHS8MrKy41ZlZWVlZWVlZc63hPWw5mVlZWVlZWVlZWVlZWV
lZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWV
lZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWV
lZWVlZWVlZWVlVQDBqWWRMMTR9VVQDKoBlUAyqAbWNFZmuxc/hVAMqgGVQDKoBtW6Z2/XNO0YONV
AMqgGVQDKoBtTYNGv67o/WpqoBlUAyqAZVAMnpGhak+l68qgGVQDKoBlUAzdpGihw3dGvKoBlUAy
qAZVANdtaK0ahomktqqAZVAMqgGVQDMlkMy70ztSqAZVAMqgGVQDamxykf2l60qgGVQDKoBlUA2d
NkOgOLRdF1RVAMqgGVQDKoBg4ELieqIaJdVQDKoBlUAyqAbU9Jsa/rWjaLrqqAZVAMqgGVQDaroo
Yjfqnrd9VAMqgGVQDKoBta0kMe8HFpAdiqAZVAMqgGVQDOqgGVQDKoBlUAyrJeFUAyqAZVAMqgGg
BVAMqgGVQDKoBqUztucFUAyqAZVAMqgG20AaBVQDKoBlUAyqAanWFxhRVAMqgGVQDKoBglISWqgG
VQDKoBlUA1D2F7biqAZVAMqgGVQDUsc6JqyqAZVAMqgGbeobqmxtsENT1MOSzoWhMeq6nqTZYZc3
NAQ+m16GytlcNXbOGpByO26toulMtvV3adQpxa3r4EappOg22dv1y3Lf/VQNWkWi6BpLdq9NAce5
O329WsxYZNXvkM3NxDc06zqTKztrGqoCRDSYnQ20O3oqFwmrClbaAtmJh6lVkUDVUEocchdcrCQX
CTSHUPcKHUrUAzS522AJXVKQjO4oLKZCcUILVGxwkUhQKDCZAg7kBkCFprZbwcKWr6zoyOl6Czsb
Jo2r6s2Ntizh/3UuzaBoGjJaw3tuva4HFroZunaNozEy2dDaNTvazrAcGptem6foTHYZtBdsv6pq
KmNc1zTNF0DRAyWXWG4OEODV7l3QEdB66Z7aLRcvapqjc26wz6BoOh2GzWGy8yXbvYUCIAG8CqrJ
rgqTO3HlakI7iluFvwAEhSsXKl7gAF/7bFBGdl5EtwrMUvbQmaCUztoBDbch62AuOFMgzEVIM2/2
mpAOMeo6FYDB0XRGdi0LUbOr/ZmVC+le+gzM2h0PatmrE5bNJ0TTNDYdHt6Bho4azqNaBpej40PQ
Ga1riLfWqaHpmkaJpLLq5Bs1e2jot61obEjfIavqOsMjLoWkWQy2Nt6Y1VAGQipXga4UDmQN1VVA
G2hGy6vYqBU70sIwt5cQSiVqXpcjqXBqJCm2hC4rbY22IWOh1toPtsBeeUOL+4EOhDilE++RRvNd
kOLV9G0LSSGpam1MWh6Pq7eypo+yl3lPVmtkxpJ27QNM13Xgy9F0PUw49SrQGDQmjV7Wn6u1aYya
Hreu+1BntS2N+g65pmhzqd0OPRdAZ9X14Mqxq97QkdCy3ZvaAhZvamws2p6wzaFoDY0BotlhtvXt
XnLZb60FqMwtDVpCsN/VtZ0zRNU16wFFwvRdY7x69peiaHoehhg1LurEF11UrrbYCCrJXvBBOFiA
XM8JlcztoVw20NkFYwNzIG2psVMAB3KqA+IZoa+lBl6IGsGFoemhkKoDFUCobgYekey1B8qqAFVA
Af4f6qgBVQAqoAVUAKqAlVACqgBVQCH8qoAD/VUBJ6jqVxsdmDC1HX2WtDDiDjb9f0kMTQ+9QZbK
Fm0yMydyshgsAceoaFpN1u0fT2IOBtbA59MDB0dt1LQGbXLyOkaRcDpTRYAmF9JQa9e1Nt0fRA7L
usBwhwhy7baSd2+HAHcHNELDj1qtkJBLZgLKj7akSretvKRK6WoWCuhbbC6iXrbUel+nej4DU8nL
8qw+43kcuFCiYC8uGc0BzaGH7pwZZBpDz1bSDh6fOGqGJbIBrBhtd4OIOxv1MNkMy4QIB6oMiqAk
MPTsNI00LmtJB40E5tEO27N5IgQdS91uM2TkhZ0RRsxsVdlSApdbjhY7n95toLDG1sOiU3E6qgYO
fWWUM4Od/sLU0WAm6LJrDbobVfDiDADMDmVUEB508NgfGuhlMs6M362tqvoW2DDXoGl6qHHrMyvX
9e1LSdJ1PVNI0rVg4tf22Nlu1ts0JkbGzQdCa9a1Zda8HFqmlaRqWpaRo2o69r+tBx6rpegNjVoz
Pe1Rtle4GN1xtsCkLPEbbEqFG2wsVQ9CXK4XCwuoWqyarbQXUzycYn22I5Zj2KA9OQiKfrp4+Kod
YnldPUr2ZVQBhnBhhw3W/XbV0P46HWjhwB3cR6EHCn3onRDKCdwhGEWkh3pFnJCCCDWnlsfL6S36
Wy2GJm3DkOHfiFvT0SDEQ/aog5msOAhhP+l6N300RbXolhl+rDBZw2w6GjU9ND/QZGVuTIHYdBtf
uBw9MiIeiKqggOfXw1VUAYZENgcYeKLKQGjomt6loyWWq+hojObWNNshxao16HpelaVqWp64GJru
vWdPDh1bU9J0vQmJpa9a0NmbdW0CzrDU1aBoWl6TqeqBwo67rzJpuvapqek6TpjVq+uhyabpOrNj
Jo+o3Wptbl7aEWLAgw9ECdbbEaDZCcbKuZhXIWpey77Kulg7G2hCuAm9A7bITrYiY9KwCwM8NTDr
14N0PK3bVUFtTFm2wENBQ00PYOINpm0gOsOa4qgfDDDnIcCBA8peDMIkCep6loOg2bVx3v6vq6dl
koH3tXDoArWUtEeLOgMkSjhzsGhVlsuzQcyqgmtT61BNbe36/c1wPBrjDfrGqNbVdu8rzC06vrfJ
DR9FZNL1rWg4dUD31nXVVBGj2P6XZ0DRg59Wb9UbH5MWgs2p9WNf1HUg4Ne1LVQ4NOZ0dD0H2haL
rTY1NuqtbZrOi6RbZM2Q4NV1PXtf1HWQ4bDDqZjIsVkOjVG3Wm5ra9WZmJGzqGAy2bWWvVA4FWTW
hBhGsoC0AQO4yDtuLgKQF1AK9gLLBl5kewrpUnbYqFxtoQFZ20NiFihcZJvQ5zwgJfnefI8xBKFc
K63kkyYdenBmaIHDq4YiTQHZrpBi7Ygxw0dGVQCB0QqgAbmjReOsECGj2+Z+tHw+iWmdl0QiK7LE
QSOQoL6Po+hXc6ulWjm6+5Cdc804MQ/XKK4muB0hmo6V1pgYOr6HomtavoHWpI6ckzaYwkK1itPT
bHWLlNK+I9I0fSdJ1PXw4NS1PXw4dW0rSdH0rQ2Rl0Rt1pta2vVdZa9C0Fn0LStI0jS9UDi1/U9S
1/WQ4dJ0jR9H0vQ9D0zXQ4dZbWpt1Zs0BkZNA0PStM0Ns1nX9UUt7IwJ6A36VpOl6TqQcQcGptut
NbWyaHobHoWhaHoDXq2steqBxa/qWkaZpWkaSGDpWlanr+valqwcOo6gGRp7Lo7NoGgsgcgcGpt2
qaJrIdGmaFoWlaTpOk6SHDoula5toALCm2gr22HCQx8qkWwrpcyr3LqRTPhcnhS8zA6WNXtsA/3n
LgT0DQw29MQDZ1zW9bR0PQ9D0MOzUGZhsNeh6Hoeh6Hoeh6Hoeh6HodgNO4qgCudkHE/Xoi3P1zo
I72gYq5LvPEiWniNdY0m0cMtC02tTRnWtwTDj+hquiWtN1LVtcSvNudY1BjZkGVr1VqSlep6khYY
Qw+mW6kGHpmu6mwH0exbZtAwGKQIWWK/r6PWo2gxGVDUQ/dG0/XmZg0zT2PQmRnsaTGo6ToGuN9g
ga1Ywxaq+q6gw6W3Nmls2gM1pjZf6iwtTUw9XU9I0lBn0gMSyiGEGGzBhrHoAYQYmgIoouGEu2Ar
oLrC8riHVB/UAvL0rkn+MvVbiKmiEj4ffdCX7czLgvvJiVCwvC6nSwwQydID50QM9VQe3aAG8Gsa
2GeGaGmGNYVQGKoNjKoBvI2rRC8GKhfPdYrusJ6iHDqYYBrLH649iqserU/cLDFZZ7iHu7THozLh
IKwijipR05icgjYqvXE57P49uCGgvYaY15sukCDFdDgT1TVdEsaHo2i6Wy6JqurNrbYsmfN5j0Nj
Z9HPq7c3a5rgcWuBl6VoWg6SGLa0Fo1K9q+sa9qLTpunaUzWrWgy2XdS1BTret6YLTNJtaGGSy6s
2hwa7q9y7oFhntaHbs37l7VNSbmzV2VmRZWTQtWbLjLcunaWy2GAx6IbQWvUDxm/qesaR4MBiVQC
+1wOHWdc1vVLmp6EGUwBr65qnfmvUGudNhem6FrGuNlzU9V03Sls2iapQccX7WiKslTZ0bV1hy6v
Whr22F1tp7bC3mP0NeRKsiZ2J3oBOgY/XDdcnFyX7bYpe9VyHAHZY9rush1h0fO0EE0yAYWm6MGC
mqgKIMum2bt/HwwWLSHWzHxJBewQoMbSIWGMGEshZz+1ZR5steDIYr253g3uJSw6BY0DyFRf73Vl
n/f/oCDWtg0nSgwNE0Rk0hmDlC2pN6hqsWk46ZUJgOG8HAzaPpuhW9GDEZQ4LmoauvVQw7GjY0PQ
LH7qSabfpjJpmjaIyaBrdidW0ZnsD0e9a0PTtFYNK07rHWLCHWhaPZDL0nTTaEGB5h0HQQwNCDD6
Z2Jh0Zg0B2CxWjxoenaMjsrrbYst2u68EAvtoKVc7aC3de2xKsF5GuRKjj4S61EbH45bzc0BIVBG
Pc0sNZVAYHQ36f+gyLd5p0xjZtYDvDuDzu6SzEH0BVQuqoAbdaDvDMVUMayR+GOHe3B7KqBVUCAa
1g4cDUHijxjxg7urAfYdwdzRc0EO+x5v0FpIXPW9VvECHpqYaM6DqGp+uDa0kg1wwA8jW/z1c7IA
Dua1cQsaEM0HneXWntF+tRbWDbdaLuomtbaC9LDI0jSw5burtDJa0kMdVAAGWfLGwI2tX1ohqDBo
uh6FYagwA1VUAgZjKx69q+raloLMGWGRTIsej6NY0doTtpHYND0PTNLXOj6VpOk6PpGmaXtoaHoj
Iy6BoOh6CvTNM0nSNI0nSdI0vS9E0NjZGRjXtqbfqdtgJyOJAV7P/5VZAC+G2hO4iVfIAYq223cJ
VAnJtTe36L9gudMIfQd2th/HsXULLS06G16gztmnqqANWPpXO1pgeCqgdoDq1e4bX8EFUG2lW9HY
g+A1w9LWlBpBq6gGSHMH3rIZqqgAPINrStQQYEAxUCa+lUAEduglzt6ijE/IOQa7Gpahhg0EOe/k
MrS0+noBLuPI6bqqfw4dCc9ggcWSHekEKfbZ15t23L7M95gfRAzyCqAHsMVw3NSYLbAG6G6GYG6G
6wBmKoKVVALBbYLVsN0N3Abobv9BIKqAmBg00jaDdDdDdDdZLdvXiDsGmBuhu6aG6G6w27bAwMHb
LbDdDdYA3Q3dKYGDUg6gztEIBuhukGAN0N3T7DBbtsAbobobobttgYLaqBBVA+qgfVQNMFtgtsiq
A9VA+qgdtsDBbVQVqoI1UDiqCG3bt21UDaqCoN0NhgYGBgVQXKoG1UFaqAhgtsFtVAgqgmVQJKoI
2Bgt2w3Q3Q3Q3bdtgYA3Q3Q3Q3WBgtsAbobobobrAwMDEG6G6G6G6wMDBbDdDdDdDdtsFtgDdDdD
dDdYLbCwBuhuhuhuMFtgtqoAFUBYa4brAwW7YbIa4bYbFsMvRAxb1EI0QgHUHDd1HWssk6YHAHdr
jFpPZ2dTAAH///////////QqACVvAAAABtNvixH//////////////////////4pJIamkkHnq2L4d
yqhgM1JIM3Rkkg3NQz0G4kkkkkkkkklkPCzz0Q2pBz2tBuO3IxgKuQ/TtGo6miQtaSHg6eoBqhg2
+6+n2ZhDEsanrVzRLkkDqE+jRpvI6GotLS2zpS87jTektAtN+h2kgyFUCNj8QxMS2JiiIhiYWJii
IhiYljVsTFERDExUpYmKIiGJiWxMMREMTEse1VZLExREQxMQgGJiiCGhsTExMWhRo3elsW2wxMWh
aCmYMxiVsTEwhg6toDEwrYmLQutC+x6UxMXkjyxaXvGFjdhiGJiCQQWxMUREMTErC7ExREQxMW2w
xMUREMjFQmNiiIhiYtbDA0HQ4iIDADADxVUCMqfWhREQy6SGhpOiqoAQ1gzYp504M7VlVBLVpIZh
NBDe6PpOkaY3ZppYyFg4Yuth6h3aDpGgEdQZtC1fQdBDqDj0Fr7YGfRNCaf6CHYHVoOg6DVbcqtB
0HQdBqtuVWg6DoNrQarblVoOLWgsYbSmvhmho6ATWG+dhlLkjqLSQqZiXIfM1anqOhMP9CDwNeDm
DN0vx/12mh5+ukdT0zIcPrnA5DJD/M2DaSesa6QaW5lYZadQMmCwkMGatV0C0tx7dGqAK3VgUrVZ
NK9tCie2htyo84Dw7jle2gudtBXR1zBqIBohorDeDZV9rDRDRDCmiYZW5rhpgaIaKw3mFUDRDR6g
PVpOQDR77VQPKoEOwzmIMIMftn777YGrvvvvvvti7vEHIXr3YYoYvd8MUMXVNWDFDF1bVgxQxdW1
YMUMXVtWDFDF1b2hhpNWrBisd1usuj1JAh7U0dJtIJIOHg3hrJJEEmAwQ0BEMPWrmqXJP10ivTvn
aeVNGkoIp2m0g3pEDn2dsoKQCqBZW4TVH25qYYAYurWNDDE1YMUMXVtWDFDF1YMQNkMbVgwv6tq2
ratq2ratq2ratq2ratq2rMAaehateDp1bVg6Q6dWDZDZxqwdIdOrasHSHTq2rB0h06tqwdIdOras
HSHTq2rBzPq06yqoCyZVQGqoD+HgHEG+0SQyHbq+r6vxkNENkMrUO9X1fV9X7D/DQDJDc0jq/q+r
6vq+o5k7AGadqDp1fVw6Q6dX1cOnWGkM0MEOnV9XDpDp1fVw6Q6dX1cOkOnV9XDpDp1e82ajcIok
GjQLpD5AgQ4O7CiloGhfaNQDAtGDyDnvXLz36QQf6VzREUNMXqn565YpHUesdr0llYWzQWhDUdVa
7WgaHbheyuVhRdK5dcLnbQ2NuvSyBg49T1cOkOnV9XDpDp1fVw6QQ6dX1eNX1do1mWrPtbaNX1fV
9X9a0YNkMbTtPxq+r6vq97SZjWA4UdX1fVdX1edDkML7Jq+rhghg6vq4YP9bDY0Vg05j6DB1fVww
QwdX1cMEweIaelIEAwdX1cMEMHV9XDBbiAYer6uGCGDq+r+ZVqoHX4XNJ7ZA2LOkkNGVZKrJbiDL
tsMSrJYDMX7boR0Q22FWTixKrJPJlWSqyVWTtsfyGUQDBPG2wqyVWSQbVWTaVUABlKqBVVAaDnhV
QGqoEVUABk5adtBVRNoiqgMOvq8HC2qqA1VAhAMMMhr20NtBVQIqoDDiuKqA1VAaqCLWQ1w7NX0x
mMqoDVUCKqBFVAe2hr+nB0EAxWhVQGqoDWqoDVUBEFUCIZxDUw1WBJVQGqoDVUBqqA9tBq0JVAQH
yGUqoTVUBqqA1VAaqgIwam2htobaCqgNVQGqoDVUB7aG2htobaCqgNVQHtoKqA1VAe2htobaG2gq
oDVUBqqA1VAe2htobaG2gqoDVUBqqA1VAW2htobaG2gqoCVUBrVUBqqBNtDbQ20NtBVQGqoD20Fq
qAlVAW2htobaG2gqoCVUAqqAlVAW2htobaG2gqoCVUBKiqgJVQDtobaG2htoKqAlVAaqgJVQFtob
aG2htoKqAlVASqgJVQHtobaG2htoKqAlVAS1VASqgLbQ20NtDbQVUBKqA1VASqgLbQ20NtDbQVUB
KqAlqqAlVAW2htobaG2gqoCVUBLVUAqqAttDbQ20NtBVQEqoCVUBKqAttDbQ20NtBVQEqoCohcaN
tAoTVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZ
KrJVZKrJVZKrJVZKrJVZNu+qyUr99ovX+3Yr6rJaL98O4Oi/f1NVk374aSF/GJ/f1LU799Vk2r9/
QA6b99Vkqsm/fkOm/fDp12/cz3Hf7+tatfv6wHdfIKb9KslJpZm1n0mUlWSkqyZxdVUCh1NR5lVk
qslVkqsmZIauH3dmVWSqyVWSqyZlqampqmVWSqyVWSqyZlqampqmVWSqyVWSqyZlqampqmVWSqyV
WSqyZlqampqmVWSqyVWSqyZlqampqmVWSqyVWSqyZlqampqmVWSqyVWSqyepamq1YampFBFVkqsl
Vkqsmet01NR0mpqRQYVWSqyVWSqyfIINTUwS1NXXuSrJVZKrJVZJCxYamq1LU1GgyrJVZKrJVZMt
TU1NTVMqslVkqslVkzLU1NTVMqslVkqslVkzLU1NTVMqslVkqslVkzLU1NTVMqslVkqslVkzLU1N
TVMqslVkqslVkzLU1NTVMqslVkqslVkzLU1NTVMqslVkqslVkzLU1NTVMqslVkqJeWpqVtTUTJ9T
Mz/+4amqCbU1f8TmZIS8NSd5Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/fV
ZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSq
yb99Vkqsm/tsB6I6hubyqhHWmwPi+vUCF3G2xqWoagu/fV3769Q1C/qGhbbGoagu/fV3769Q1DLW
xZ1DUF376u/fXqGobbAm7rUNQXfvq799eoahtsbbGtdahqC799Xfvr1DUOmjQLeoagu/fV3769Q1
DxHRNtjUNQXfvq799eoahrjZnRdQ1Bd++rv316hqG2xzIG1DUF376u/fXqGoY722NtjUNQXfvq79
9eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUN
tjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2
xtsahqGb99Ntv39R1DUNtjbY22NtjUNQvX75rzRqmoahqG2xtsbbG2xqGoNLbfbdfabp9Q1DbY22
NtjbY1DUNQv37mo3759Q1DbY22NtjbY1DUNUv3zrv316hqG2xtsbbG2xqGoLv31d++vUNQ22Ntjb
Y22NQ1Bd++rv316hqG2xtsbbG2xqGoLv31d++vUNQ22NtjbY22NQ1Bd++rv316hqG2xtsbbG2xqG
oLv31d++vUNQ22NtjbY22NQ1Bd++rv316hqG2xtsbbG2xqGoLv31d++vUNQ22NtjbY22NQ1Bd++r
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
ON9StbXyrapqXdsp3eR0yfJwscF4RJehkCS7hOnkfPDskvbniDzlVzUquinakCCg3oG9uKQbWhWo
asKT0WXURSJRRRpS9IoWpqha/KQ38pBqo7FCVAUugb8qlAUNUyhSDaUvVRQhQZQMm9vq7z0laBFj
btR4gtBVpQRT3SkyjqrqBBSqP26pCkWi6qKBqBrlVqjcgp0dGFj8aGkY0yYHEmBe4f403IaRpDv5
yTihvVNGoEF3Tqn2goFubaoamkpEo0pwoekU6UPVG9XFIVNSqJpKVKEoqlJNdR0WydRKlI1FVVUl
DIKtKGKD0XFVtW0CjKBSZQDXOqykihAaqlAbipebjlOqMKCqmr2mrZlBBA0NtKoqp5yoikmipW6l
vSa6gq6qGzlPnKAqlWhV1TNjVosQpir9Fh96UFdUNFNolVWi4SmINbUUIUJb55jn3+HkSQTAx4J0
06coXRcZSei5ZlLFFlDVYUVQ0WTUuypQNCels0IMailylmspENNSVZR32KEqgoK6lKTqqqVd2qoC
mLqsoApRppBuqHKjbmypWm6NGTcglUrbTpdaG2lUtUtdUFJ8KKFQU6lKKqpQpSUqs5osqyhFFFDa
aoqhtKW0XPVkc8vpEw8HZwPIHdi8APtg7uCP/z0n18h2/hHKrqwo8pPRbOi4bKF0Xbouf9iid96m
pINF1FDVaURUd6La0XBouqoUCDZQoXRa2i76noVL7Q2U+0uWpUzUgpoO6Zx0jKAobN227RUP8GkS
LaVc+pelG6LHKIZCkKienVtT1K13NpKFqgpaoikCk6qqZB2TcgDU3qVE3pCmihNFi8eqlk1PZ2dT
AAH///////////QqACV7AAAAjDXzZhH//////////////////////+oSlSiiiSlindFxirKqqIe1
VWU0UNosCpqh0WOUSU9VDXTqIowpXRchSVVlOlLlE1DVKBDVTVUw0WLosAoUpopQoeoPKDqopioi
8fOILI8cO77fLy5ZzK45GzjeHZ54ELKVKdKMKVa1Cg6n0WW0U1SkSlShIWUM1VBgqtBTqqpKhto2
nVHFNFyVZvKi11C17t6BBwoApQoranKqTQIGjZBVpTNNBUl8qGSD26q9Fy3bc2FBNFNoqqr0CvqU
GspeoUGFIaLDaeTKFaRTq8oap3mjRdm9TCnQ5lWtONgaqpoUJoKZSeixChSnKhbtrqmqigWrRcTS
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
NFn6LP0Wfos7RZOiyNFkaLI0WCUTosjRYmiyNFj6LH0WNosfRZGixdFj6LD0WDUxRjW00ylalKFK
M0WKUTosPRY26raUxouMpzRc+2izdFm1VeizdFmlH6LRVbNFQIaKgqqPRZuizaO2izdFmtWi2Cjt
Fo1Pos3RZuizdFm6LN0Wbos3RZuizdFmlCVFouLRcZT+i3yhmiqyktp4/UdU1VUdCqKt/beqEDcp
lVlA1MKgqOq6vqd56rdkGizCkatatqsqypO5KdMoLynGprKQ33bfpWUFVVHcoWpKTXos0oLCkCkC
kCkCkKvKQKQq8pCrykKvKQFXlIVfV5SFXlIFIHdXlIVfT2dnUwAB///////////0KgAlfQAAADxM
hEAR//////////////////////9X1fV5ThSNXlIVfV5SVVUUVKr6vq8pKr6rVoVfV9XlKYU7VtX1
fV9X6LKoVdouGradX1f1vFW1cqWq6rtFwFM1dV1X1fV1Xn51fV9X1cdXVeUjV9mPq2rCgygmjRZB
QqDdv0VAXotLRbZSpQhQRQWaL60Xzoqigp4p2r8bOKteiwCgijZykUcUaUeUf7O11Q2aLhVKRo6K
gSKJ0XPovkoLRZRQGi8ygygShShdFgFFlClMcaGqi1VZVJQuiwdFgFClClClClClClClClClC9KF
KF36UK01cXg3U+lKQq2r6BRRQcqdXlJlBFBVBVtWVGKSCpagqKk31GUhJXRdSCNSVJVVXFAFEFAl
JlLlPlIlC6LMqcpT6m2bquKAKEKDplLVfVmiwmprplKtBQdOpyldigqZR1WNGi9Cl98KVbNDxY/g
DDdbOlo1r3p0ykymNqdNuRo6obadMpNsp01W9uKcKGKfKfVkU/U9S41FP1MU+U+U/YKfKfKfKfKf
KfKfKQKfp06hptlMp/ReGi8Cnyk9F4aLwKTKU0XhovApQpTReGi8ClClNF4aLwKUKU0XhovApTZq
qbcpTReFXtk6MulHv1JUm9H9rqmeiyFNm+qygag7UlTPvVNtV2izWv+7VJLKDZMoJqm19KP0XEUC
0b7zpblF6Larj/BlI6Lp0XgUpdRlCFKaLw0XgUoUpovDReBSmi1dFQOaKgGKU0XbZShShShShShS
hShShShShShShShShSjXUhR5SjWUQUoUoUQUQUpoqBzRUDlQlKFEFEFKFKFEFEFKFKFEFEFKFKFE
FEFKFKFEFEFKFKFEApSpqolVNU1S1VZoqjurW++VPmVPU+NMm5XRdGi4sqep8yp6nzRd+iqEKppV
bmi4NF5ZU9T5lT1PUH32qtFy6LgKNqepyjSjanqco0pXReFVoCjanqco0o2p6nKNKNqepyjSjanq
co0o2p6FQFAlA1AUVTlVRSdU1SUlV5QTWUCUDUN1I1t9KqKtqcFI1FSKCKAkUCUOoUOUwUnVZSBS
VWlIlO6LMKGKDKEKXp1XVeFN1ZVzVosGpilSkKqk2FBZOkUsULUYJBj2bpRNS1OUaUbU9TlGlG1P
U5RqMoup6n7lT1O3lNq0Nymm+p6nzKnqfCgallOqG7RaJQuVPU+ZU9T5UzeoU1ouFTKnqcpHKnqf
ONVUN9WVPU+i79F31PU+i79F3aL4nVW9VlJNWi76nqfRd+i76nqfRd5S2iqCVaq636Lvqep9F36L
vqep9F31E3aLuqep9F36Luqep43oqAS9tFq3dJTRUCeioCkGZULdfMqLnVGooehee0VBneYtmZlS
6LDp6LAv8yhiAFHNRRJRMarKUq0okonRUC1TCoyg9FlFE6LM3pNtIokonRZpQktFjFElFVTSKJKK
bmmoNFQBaLNqWjUJRJRJRJROiw6WioD9FqNBRJRJRJRJRRQZQZQJRuizOVIUeUSUUUSUTso3FMVP
oqCsokokokonRZdSlElElElElElElElElElElElElElElElFFElElFFElElElElElElElEFElElE
lElElElEFElElEFE1lyiSiSiSiSiSiSiSiCiSiSiSiSiCiSiSiCiSiCiSicKJKJKJKJ3soXRYGZm
ZmZmZmZmZmZmZmZmZmZmZmSKFzRUEJQpQui6dF+FCiRRBQuaLOKFKFqLyhShSl8KFKF0VAzUpQtF
/gKF0VQxMoUoXKhKFKF0VBnVhQpQuYUKULoqCurChShasbihe9bKoR7FC09F/FClCtpTBQuyYoXR
cWNdDRZei9dFQU1GWKAqyVS90WsU3oqgWqbqWpalqXRUHWiqLSkm+palqWpapqmqapqWpalqWqap
qmqalqWpalqmqapqmpalqWpapqmqapqWpalqWqapqmqalqWpalqmqapqmpalqWpUFU1TRoVTVKlF
oqWpalqXNrqmqZ5VNU0Wm6lqWpalaKG1U1S07VTVLQo0VLUtS1K0NFCqapo8qmqeVDtUtS1LUrTV
NU1TVNS1LUtS1TVNU1TUtS1LUtU1TVNU1LUtS1LVNU1TVNS1LUtS1TVNU1TUtS1LUtU1TVNU1LUt
S1LVNU1TVNS1LUtS1TVNU1TUtS1LUq9U1TVNU3UtS1LUtaqapOqapR5UtS1LUOkdU0ygswoUoXMK
FKFzChShcwoUoXMKFKFzChShcwoUoXMKFKFzChShcwoUoXMKFKFzChShcwoUoXMKFKFzChShcwoU
oXMKFKFzChShcwoXRclR0mjRZFqFHNNKhUlQaLkpUmlpaWmlS6UMUTSpNLS0tNKlVjUUfUNKk0tL
S00qWaL0KFpUmlpaWmlS0X4ULSpNLS0tNKkULUOi0yi6VJpaWlppUtFhVKUdSpNLS0tNKlou/cor
RZFKk0tLS00qRSRQ9Kk0tLS00qWix1aVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaW
lppUqVJpaWlppUqVJpaWlppUqVLGlpvrS09pUqVJsoNNVT2QfSpUqVKi0lI1S1ZSpUqXWlpm3tLT
TpUqVIphpaX2lppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppU
qVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaW
lppUqVJpaWlppUqVJpaWlqVpKqxaWmujamlVVVVpaAXaKNJWPo63JFs+sp8F4d79isP/OsMK/xZM
j+ZPta869eYuO592yevDBCERGvW49b/ruLXfBd/8LhyF1smuwJLY6/vZjlgV/7igkogVQb77bP5+
+9dIL4Pi88MA9J7wvPld78VnS6ByKvMWel/4OYyjmCv1h4nrsNf7+snZWGGZX7CfPu3+T7loJIEG
3V3xi3ssF3PYPgwfBgEVuwervMuD0f3mYjDuneRlibbZXIKj+cnN6bDyW/yAzgut8brV62PRgnrs
MC44uGDx49R6e0sCm5aKmzyPkuy+Mq8BPkru7u7u7u7vguUuXd3d3fOc5zl85dfzIUdxA/vK12fZ
X59e5c0D3HUE+dzPH5kLjksVyWwjewgrOYucWHIVtSX1M9YtTz4BeE+/YrD8ybDBl+MOxzuTn2tf
TevMZBn39skPXhliEIiIrcft/Txfrn5d8u7/4XDkLrZNdiSWx1/ey8c4B3ql7KIKU0CqtqbIO/vv
X9iSDnB84vPflgek94X35Xe/KU5U+gcepc7H72/8vmMo5HICv1h5XZWGv9/WrsrDDudr9I2cs+7Q
cn3EEkCDac13xjB8GWC//H4MH3DxHGCbj1d9lwej+8zEYd07z9sTKbK4IUrznN93psPNt/kB3mC6
2R5WrsPXowTsrC4XElwwa0YKEnt1JYKG5aNDZ4S272WfLmT5vOc5znOc5zn2c+znNXfefe973vZz
nOdznO7ueMJ31B81drZI7UvQbzelx65oH5IEG8p3eqO7I2tm2K5spYtQQpbzvk3mHvaiQVHU/ahq
MoF9C+1OzaKtVKDKP0WMULUO1RTKGqEoQoSChQhQlR1FUdRFCFCFCFCU5VCUAUIUKUMUSUCUH0oQ
oSqPKEKEKEoNpQJRUyhChChChGooQoQoIon9FklJ0NyiChNFoblANe2FAKAoQoSWxQhQmzQUVIoQ
oQoQo7RYZQZQhQhQhQhQhQhQhQhQZRpQZRBRZRZRZRZQJRZRZRZRZQhQBRxQhQhQhQhQhQhQhQhQ
hQhQhQZRhQhQBQhQhQhQhQhQhQhQZQpRJQxQhQhQhQhQhQhQhQhQpQhRmixChChChChChChChChC
hChCg9Fo6LIKEKEKEKEKEoFCFCUZqlIlIIHgUIUI4UJosHb1dtilmnNtFtaLAKA0WqUIUIUYURUp
TStEoQoQoQoRqa6ipFCFCVQULosSbTyhoqAbRUAzjfotkouZQG9VNOFFlF1XVBRZRatNTrfSbCiy
i96qKLKLbUJSNJRtKHKLbaWiyyiUPlIaLAooKqxBIopSj8EG8eFAtWTKB269VCBrxslhQpQeYUHU
ONlVaKoBpFKFAlPmqUCUFmNZQeGgqqrOsDFbeU0gyrqoyrSkRRjQnjZLMQZV9UVTVRSdXKtmZmGr
VFWtnnnMwpOlnNqi2p5mZVNU1aUgU7ouduq7MzDVqqrWyJ4gvLirTlmZlVwaKvq6rqrb8zMhVVSd
q2mTmc77pRV1Posuc5zzOUWpTmTnOdOpaaGoKizJznx7KGbFKN2ZmbTlUVLRfLe2ZmY3N9X6L0qq
rTQZmIGI6tQFIsSDMw6tUqApKqfzMxtbaVVlIVQ21bmZhNW0865zMyqCk7oNf0uZmZVDfovuqCmq
oqtXMzCatbPzmZd01ahleZmN9WVXVxSlGrquzMw9lKtbGI8tBkikVYNGZmN9WVXVxSlGrquzMxv2
Uq2rWwnM5m/jIblKZmZVLZSq6rqtqlvzMwp8ylCgauq00GZg28pCrSnqp73vaCve973veompAo02
GmhUoKUKepVdVdV1XVxS9V1XVdV1XVdV1WUgUtVxSRTBTdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVd
V1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV
1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1
XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1WUhVSXnbbaWxSBSBSBSGyrYpaBBVhSB
SBSBSFHN1KDYUhRKQKQKQKQo3S4pTbWgpApApApD2xVqRtlApApApApCVMpGhynVxSBSBSBSHO0p
SpU9ikCkCkCkJ8QKH+cKQKQKQKQo2d9+m0lIFIFIFINpTLRRKRb2opApApApBoKXf+i2tjhSBSBS
BSDRT61KUlaBSBSBSBSG1Ju25DqApApApApBobd5NNOqCkCkCkCkCSkCkCkCkNGFIFIFIFIElIFI
FIFIExKQKQKQKQrmUgUgUgUgSUgUgUgUgSUgUgUgUhowpApApApBLSbSkCkCkJ200zenNstRTaqp
nNW9t2rejvbWpyd/T33oU96DRtxWqKaCZq5W72ipyg307DdWr7nuailGnvPqiCpaatnyVL550mfV
VdlGjmiw4Um2QOWjvJr6IeVAua5jREtX0PNbR/nWJIGs/iVb0HW2bW0cU2pY0bKNG9KWyjWBVaCq
MAElaaCiopQoUGhsp0KHVOqtdHjRtQoyVbFNqKiqtFxqazYKFCnQUoU92jajRUvm2UOXQn2XFFJb
Kb7qUMkUo2NU1CkZ6OraMW0RwILQ/RhFaIlqxLBoxlrkxLpWOkgujSbJqW20qTbtQnyqZynQa78f
vtQuasKTRQbCkLpcUi3937PajSbaaql0rWbnt6BanSKQoy37SVp8pVdSlf9VVV22VpWgk0UpaLDk
f6C2gvomWJX0YvohjoxfQXZTrOPZFK1NnWjamo0RnNVoUpbVAr2xVAQbtVLeV0kCitOhRbKFBWg2
INu0mtom2ykrJRXEDao0KtDWrGg2UEW/VKCm9Gi2Ypza1MqXOqXklJ7qKbqKdm2yxsaikilJ8mFa
iP53zc96FFupVI0ZS2469fVSd1aTbo1cmudcmGiRcmsRB1DU7BVBSVOq8KUbW9sbynNF3lKFK1cJ
VJU1TVPUtS1NU1TVNU1TVNUtS1LUtqJPZ2dTAAH///////////QqACV+AAAATc0kwRH/////////
/////////////7mzNs1NtKRTBSFBo2oU25TN9uK95vvG7bZNrepRn2i2btG0igJttHOqbUsunS5U
yC86tOalStO1JvMpPlQVLVjduP407lIaG+xI0SVjZV9Hf5+D8gWE2f2XRorcKK63lL7FL6LoVyod
qiQVTNBVLZ16qqv5bdd06sbkCDeldUaLgKW0XCgVi1iqJYU+y8aG+qqDXTpNJ1miq2yo6De3tFCv
QRMujIGrSJqhSr1Sk6qottQ/FRBwgI22yoIG+6DY3FA6Lhqnvd22i2TPuyp9mN72323333lvvKW+
8t9z9Xae4vvZb7q7bzlLffm+5Ku8t99rpb39c62iirrGtoWeaEbOFciq0KzBBh0K0KzAcK2ixihb
a5NLVzRaNRlA1NUpQxRFQRpeURVLVv9+gbWppbsFR77KAII2gqlooVWq1NVVtlHmcO6NObTc0CnH
OoNs32UVqkomU2poVph9soyoWps2706j51opPS2bL+e/ZXVAlwWe5QKm86XUFFW9uWpuoTOwLobI
ZtHJ7SV33lLrV3smmctp79mh2mpt8FOTkh7vOW0773Zo7KW899mio6bTQ78qFoZbE84bTQJU5W0U
OGjK9Oq2qlVXOFIzlRq2atQlKaLiqurqiKFqKqG/fRVAei4W+s2VJUHnZ9buSndOnd3FnqppKCb5
om0oKZ5IUpnySu1C2hr2ye4KB0XDvs2q77VJjcUHeRPra27t/bZOtvKNNhlOlKjTotbaUrUNQlL0
OIEF11KFLba+nxTZqu95SnvtLdp2jv1RTfYehlvQooEDIfN9ub7y2qrkmoC9rpylv4Q7bcahUCm8
pbmo1SU0UKtoijox6OjQahS+ixyh6oolFZdUKqCoG2oKnoVOULAoAo6bxQVuUvpFLFIIKTZjbxxW
qKTdX7e9fKatLdvqspJtRUmwWg5SDfvStw/J5VNJztT1SeU8bG3akUgpQVbr62Nza2T6QLRVrZaC
S2jBvvOcu9lLvZbz3n2c+7boLjCcu93nPfafZS6rUU577797Oh2ew+Ayfe933lOe1VcQdkJ77zlv
2W00AnOfZ9DnZSn2U995zbac5d7LbvWmm2bq796rUbbO9t1al3nvvvOhV7ZQ0dXJWP9GIzraPqGo
9FgVA2FMtBR1EVHUdR1GUYUeUCUVUUqjqOo6jqOo6jqOo6jqOo1KjKDKDKBFKb2BzQ2U2y9GeyeT
ur1enXvnUEGg6EJbqXRbCpK2VZurOk3dlsNpttVoN5y5JqU7jU0VZTmJ3zZS2hzkt6rsNPGvZDTq
Cg0L92pNMqG3aHtlFRt7xAg5wSaoq9k0KoGjvduS2apT7Lufzu1Fptyk1bNR7UmpS72DVI1tBbRt
cq6cSYRX9aGjIaNXNc6rqwpspGrJWUlu0FD1WqNFyaLhqyowpilXlHlA1BGptFjtW3KpDTHe5+o3
0r5sgu0Wymx22Nj2WguWyFB6CgEHi9tooGkWgtAfGts+7u0Hae7c2VC1tVOkgQdami9pUsoUKEt6
UtlGuxVaBvzahJWkgoqKUKFCi206G1FTqrXR40SoUJKtktucVVo+1NVChTrS52g2b0dqDQpfJYpR
U7kr4opLZTffm2yhSbY1d2KRnzk2mVH1aho5y2imglKdFpoqNDTdRqtiCaklNqNFXclsVqGopcoU
KdPelI2h5AqfadQFA0J6PX0aQTKsXJXOubS1lHFCNFGoWsToUagKMKIKG0WBtUqlQ286gQFAlCNF
DJxVnTNA07NOTzcebs50zqhh3wvNuaAg5e2W0KVS3pebNN/Quk20aLcrSbaOzaTPs7v0Gb3CLb2l
tRplIcpNW1JVtpb7XSbaat3+bqtjRtTpFIbKVbfd6HbpVbSaKH0Wixdq0+IKLQFGmoJKKTUavy5U
eKQOdIpKqG9sp4fd5t51ya2jhXOua2gsTA6uKWqyqykCgdFiFN71AoUaJ06pqlB5RRQdSVCglV29
OqdF7UqdQN+i5apQVXV+iqBNF2VUUm2zqAoMReFVVKUVUlQVDwoKqrCqrRGqNuFJbTaWhssNjcgn
Soc2aLaPQFAoG0IG5qaDaeN/PVbIIG1rlW5R53l1Y341qU/mbZVFGRSHaTZK6e+7ZH53xp5jbRoo
N+t7ZObdts2b7zU2bKXZzndDudE99yd5znvvvuTPs59zfec9577779nOf5ogZyYH8TrkwNl0aw11
tBLsoUcUQOXdSlAVJUFGoygSgK5QtSc4UFIoEo4ofRYO2xRZQei0ahaKi0XqU4U5UXUBQAVaafJa
LUqQpKqaVMpls5VzVUlCr5VQUlTc+dlLFOFO6LqvO1BObYgu2ym0NDS6pS6gnz2wbtttDW3NgFFu
bW8oBShxpb+5cv3pUaha2/1KlldCp1KkKCKCKLqyoihChChKlqXRYNS1L2olOFCFCFCNHalqXapa
lUkUDZQhQihRlKpalqWpZFCFCNZQBRcihqlqUoKpalaNihChChChCgqFOpal7UtS0ShChKiaKomp
UtSqdqWpWsoooQokoMoSpalqWpSgyhCgygygihihihShCgygyg6nKBKGKGKDKEKEKDKKKIKGKHKD
KDKDKDKFKJqWpSgygygygyiyhSiigCgygygygygiiCgyiCgygygyg6lqWpalKDKDKDKDqWpalqUo
MoMoMoOpalqWpSgigygyhKlqWpalKEKDKDKCqWpalqUoIoMoMoOpalqWpShCgygyg6lqWpalKEKD
KDKDqYoGo6lKDKDKDKCqSo6lqMoFrUa+b9qgptv5tsFAgKbbapKQquV2UXtd1Dsg6gqhvuymaruy
kZCVV3d3d3d2gayghU5QJR7VxWqJNKCbQ2NjRxtVoCfFG1DaD0HtDQ2N7U221cqik0ybG1rt3FUD
LztWUWuqO0JQqC6oV4UDQ5RqYo1R7bbbbbbbbbbbaWxbbaW20ttl9tttttmpq2222aKgqho2PbZo
qAon6h2lKhURQlTbSlLnaiadmiWxQ9StVGTRKVRUJSlKWxylKRyltJ4suycspMpKiUGUs2tqpR1T
lFWUiUoUm3UKkKNqC59pVbVlCoGrRcFWIYaLg0XAU/ouBC3yUKB2aKJQ9QlBFGVMUUgm2U2xsqhu
bKq9Buqq3tjZVFUNjY2NjY2NjY2NnWxsQzbFSkymynKoKTmvUE0Da0PXYtsaGhtxpoUpoLmUCgyx
u2NrQ1tyAAc9uoVQUCwts6DS331Egu/5SoVDvVFQH+V2htpVBNUpJuaajleiJcRZoR/R0MZ/KcKc
KUq3ynCnClatKRKcKcKUmU4U5uspNtWKAbm4osohu0XGUlovDRcTdQbm5u2k3Nzc3Nzc3NLd30P9
63FBlBtz5QZQdCgUGUHQoFBlB0KBQZQdCgUGUHQspnRdX0Cg2jjTySDs6LTO6AU4G20Lag9otpal
LbZNLVyTXjvECvKPWuh2g38aulA0ettW6NoFAFB0PKb0XFQKDKDoUCgyg6BRWiy9Fg0CgnKFChQo
UKFChQoUKFChVei6uULa6FBra6Giy9Fl0aDW10KDW10KDW10KDW10KDW10KDV9BFTq7cpGrquQNJ
Qmi89kv1TSJpUjVKXKQqziA6VImlSNqVqqrasb2xAdKkTSpShe9UIOtNKk0tNKk08DfVjTSpNLTS
pNLTSpNLTSpNLTS7Jsb6aB5oVqhsbBYp1RaDrbOaBupIPQFA8bm/xVUwA2N7fSzlBuy0EG1t7Vl3
z/yqFWik2VI03KhzQGjQ0UqTS00qTS00qTS00qTx0qU0EpPoJ0qRNKkdUt9VFKt1OqarOlSJpUjl
SQVD1AdKlSOlSOCBuVUpUigyg6VIoPqhSnZ0uUig6VIoMoOlSKDyqCkd8QFB0qRQZQdKkUGruUHS
pFBlBUqSBSOFFH0pHepigtid90BqnRtWIUHSfsHn6N9qqHZrN7QkdJkplNVFUVGomqoqipVYOnIp
2oigEDSUM1VFUVKqimZE1FURRWfUVRaL6olKK777oKiqKoqiNpKSKSQVT2oqiqKokBSNUugpRWdR
VFUVRHKqtF1UqtbaiqKoqilVOhUVRVFUWjKiqI6iqLRlRVFUVRaMqKoqiqLRlRVFUVRaMqKojqKo
tGVFUVRVFoyoqiqKotGVFUVRVFoyoqiqKotGVFUVRVFoyoqiOoqi0ZUVRVFUWjKiqKoqi0ZUVRHU
VRaMqKolAg80uisCW+GUfzhQZQ3H5lMcMo3nCjGnnFD5zRZ5Q/KaGHNFhqc4dHnNFQBNXOE85oqA
Jq5xqo8dzN+cUKN5yhUPEHKiMcKKKNwpV4oFqKm92aSgSZyMqaVNKmlTT0WTosYmoZmVNKmlTSpp
zmTOZlTSppU0qac5kzmZU0qaVNKmnOZM5mVNKmlTSppzmTOZlTSppU0qac5kzmZU0qaVNKmnOZM5
mVNKmlTSpsjnPnJzuUippU0qaVNd5yc0CCc7U6VNKmlTSprVdznJac7U2KmlTSppU1qlyc+SnMPb
FTSppU0qb5zmTOZlTSppU0qac5kzmZU0qaVNKmnOZM5mVNKmlTSppzmTOZlTSppU0qac5kzmZU0q
aVNKmnOZM5mVNKmlTSppzmTOZlTSppU0qac5kzmZU0qaVNKmnOc51ypuoKmlTROc5w1hU0qagnnC
ecJ5wnnCecJ5wnnCecJ5wnnCecJ5wnnCecJ5wnnCecJ5wnnCeGUAUqp3b0EpqVU1tB0FFJznNRQo
KpqiNRSc5zUUfaigGpRSc5zUUOsgqRRSc5zUUJoVIopOc5qKVI1FF1MopOc5qKFBVBUpqKTnOaij
QURU5Qaik5zmoocEFSKKTnOaihQvkqKTnOaimjFFJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMU
UnOc1FNGKKTnOaimjFFHJz72c+qKaMUU6rMfSVCimjFFMyedbezUU0Yop2c/yc91FNGKKdnOc1FN
GKKTnOaimjFFJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMUUnOc1FNGKKTnOaimjFFJznNRTRii
k5zmopoxRSc5zUU0YopOc5qKaMUUnOc1FNGKKTnOaimjFFJznNRTRiik5zmopoxRSc5zUU0Yop3s
++opoxRTsxPqihNroq2r6svji2VmGH/kI/cHEt+45bkQwrsn12aEF7iPjXr2B4j6TIDt/+Bd7q95
8OCEcsvBaPriA8MN+yO5bw+EIfgX8PZ8a4/sV7wDxp4aD7+XN9uK7y23lKF83zlvMD2RRh4eGG3W
WP+yrrewrLMv1l2Fl9dbNNKsy+wxYcX/UjWPbbsN30Xy7larlo2BUSu0fhdJmfYSsj3sq/sIhhZl
u/YWVhZWVjZ2Fj9GzxDGzjGNeLPxlgzsLHXZ+Z+Q7BytCHd624j8H1VRNXasj4uPY77Bkrev8fyP
snLW4sjLZXrMWkz85/859/XrVoYktIwgQt4RSXYXEI3Jg+8GYv34QjK7v0Y/Lj7JFZetWt3Ihlhs
BDZDbg+XHFuB4Oh4eP/////////ve52cO5/f/////P///PBgf8HB+Ur2jjAh2rUt95cg8s7fN7+f
GWPRmROGYIvP4AyX1icvt2OOWwgflavXrfpcC9aMP/HI/cHEt445bkQwsjJ9ePwhcR//XsDxH/yA
7f/gXe6vef/BD+iy8Fl4+yXAYGG/gyIMt4fCEPwL+Hs96A/sV7wDxaD+fKSqkqW8lFdtq0J3zfOX
7A9GKMPDww26yx/GVdgxhWWZfYV2Flz11s09JZl9hiw5lc3tt2G7nfOXcuKuWKQldo/wLpMzLCXx
7Kv7DcMRst37CzsbK09nZ1MAAf//////////9CoAJX8AAABPaZE3Ef//////////////////////
OiRMKL0aKIRM4xjXeRcZYImFFXRcz8hOAjCE1aysxH4P0qQ3pbRR8XHsfOwZKw/8ev8j8eOWwcWR
lsrMXhnlL/5z7+vWYRDPSWkXAct4PJOWF7hHmzBl4FvzF+/AR2u79GPy4+zPLQIn7dy2eGwEFEM7
dDL+0nVuB7w7XxL954GZmAAZmYABmZgAGZKUrls98uXLMAAzMwADMzLu7zPy7u///FuA8p9vZ7GC
aFRhpqqy5B6Lty3v5T4yjpgAf7+AMlzYvdvt2ODjDY/abf1B3RckoVMg0WFyoWlrKmZVtRaLIQVS
USVMKmNxUwqYUqU/ovZAVMKmFTCphSDQ1qN7XUKDRdBTFVFTCphQHSphUyoO2U3UrYVMKmFTCplU
FTEG6jagU+p1SpiCrlGy2p1r7wqYVM3sqYVMqTktypjfUFHtlTCphUwqYVMKmFTCpjbUON5UwqYV
MKmNpUwqYVMyi2bAqYVMKmFTCphUwqYVMqioeKlTKZUwqYVMKmFTCphUyndS+VMKmFTCphUwqYVM
KmNjRRKmWVMKmFTCphUwqYVMKmN9HarCphUwqYVMKmViphUy1Why25nbCphUxBU6C+NmKtpSmbZV
lXSKmFTJ71NS/pUwqYVMKmD2hAVMKmFBNkykShabT5Uyr5FTGnKVU6Ls2KmFTJlJdKmVC00qVBu2
KmY3gqYVM+q6nKTKAnTbW/GvjlApJSpDVo1KVMdKBxVuUKbqo99F0UeXLJ0pHotVpJadFpnVjY0c
soprQVBoqAAnRZeiyjKSVwUs7se9VGG6VQFC0jaqvJVNA28Vo0KhU0ZVKv9QGgJ5mU/KTKCQaMqT
ajxWQaNGU9/6c6B1RbRzRm1R1DxDQqLRitRUc6Srxr22p/owgyDplNaLk0XChIPRm9X6LEKIokGQ
ZK8l2tB9HNGVCg+qu8bO6MKAq7dSf7aCvzVU0GhQoKlSpaMaaoenTxv20ZncQTWJvEDUUm18KD0Y
GihdGTZUGjEOdxQkVWNslzRgmogBQaDmjKlqH+nS2PerFCiNGCaiAFBoOaMb6lqGn/SUBtiDNmm9
GcqR+gp3rToxrsorfhShOUWjrcgatFxaMlUOiAoykVM53Hin7Pao6pbCphUwqY0lIlTCphUwqYVM
KmFTCpjVUDRVjXsVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCph
UwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTC
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
bEfVV865qqfVUr1UoVU8oXVVhznur6qR6qY1U1M+eK6Cq9Vfqpd5qr9VIb7OKqzzdjrpduqntVm6
ig7VbVfqqk1Uj5z51iqpcqs1U4dXVUk89VPKqTKsquVUyqpAqyq3VTWqk3pGZ6Oeqkqq1HVTSqlq
KKqxkdVIvPVSPVbqpzVShQVZVeuq9U1WburarFVP6mqmF5VYqvKqmVBur6rVVLfeqqBVStVTaqz0
5llWGNlBVdqt1bVSJVTBZHVSzVTmqlqgqpnVdqppVTGrDGyrKrtVOKrEd6qpxVSlVTyrqqeVXO1V
P1VaqpQ53V9XVfVTxVU2qtRVU6qaqc1fVTjtVbqp7V0cfapqpjVTk+VU7qaqWauqOnN3qpYq6qxV
lVmpqyr6tqpzHUZVboIz1b2qtVUjVW6qUqqWY+d4bD1fVcqp3V8VVyPVV+ql6q7VS7l1MdVMarVV
2qnV1bVSXVTTm696rPNVau6iqmtW1YaqzVpsiquqq9171Weaq1d1HSqmtW81WGqtYaqkjdVK1V2K
qkGqnVVOqqU6rvSq3z1Uj1Uh81VNaqV6qWKqUjOqzQUBjVW6rdX89Vyr350qvThrs3bV2kr1q7tJ
Xau0ldq7SV2rtJXau0ldq7SV2rtJXau0ldrnq6rqr1XVFW28qKr0eVFV2M0VS+nPGeqnlVO6u3Hf
c8eZ0dXZQVFVjnqv1HMqsNlViqmNBFPZ1PVTibRrugoL7x89VOD9zZvccZ6BVWeagoKr8bs1BFnP
2urcU9zRc/POdLtJXaq6Oq9V1XVdVejqtHPVbzeqqc1bVtV26rFV/pVTiqxQUW6uqyraudVypu9V
U7qp5HVeqpxHU26lbWVdOc+SXdBi5z2aq3VTDLVVmq+eq7VTGreaKrFQc1VMuaqmVBnb02VPPz8/
bG3dpK7VXVNV2rquq6rqvi5m3VYNrfPV1RkdXmyOpq+ooLqebDdukd1d33V9Vyq/V9VOD1dVemqC
6CO8yM58ztU46udB3iqKrOVN1Wqvquc/N15lmGNVkWVW6rNViJa5+fn5+YxjXaSu1V1V6Orquq6O
q9VbPvKtuoqv6q26qcVWOlVOKCoquxc+6sq66m+kdVPKqd6qp5HHVTupa57jxbq7Lr9KuzKDnPQV
UwyqxVfqFdV89VmrIqBVYaqmNBzVUyiz2c5+fn5zGMa7SV2quqvVNXVdV1X1XKrEXe+mVWj1bVe5
91FX1dUZz1fdBVYqv1ZV2ubOvP3urrquVX6qc1XKvq6q/VeqvR3QVN8+ZcZ8ztdmqbqe+VWYsqt1
XaqYXV1X1f1qtG5sNVvNVTGgiqyq3VZWaoO1TVcnOe6rdVrO+VFRHVeqMjvo2bKrFVjn5+fnMYxq
qcVWufnqpRqarHMsuPniuoqy7SVqrTVe6sq+r+aq52qp1Vaxxx9KDcZqqdG1qKo546jaWopbq6ps
9TG+a6rtW5lW6dVyq46CqxUH51QVNVrmfNnNVTGqzVbqIueq9FurNUF0N0HPz8/OYxjVU+VVPKqe
dqqY1Uy5lVTWq5V1VPolHU1UsVX6qY5UVWIqtPkVRz1de2eOou0ldqqxVnPU9jRc11U6PU1NXWaq
zkdV2r+h6rmqrNViqxdViqxVY2er6rtWVZV3OsiyoNqgoLNedKnnurqvPlTQ31PzKqxzVPPFQVPN
2qtVX1VcoY6D03O6v5qqdVW8qyr7yramgqv1UyquVWu3NHQ0BubKrdXvn58qsc+6rFVOufn5+cxj
Gqp/VTihqsVNVqqmNV6q8bp0Pz1U5u0ldrn56mp7K6rVQeqxVTA+quq/Ktq6aoD0FBVcq03PFVTG
q4e+er46rd9okarYqrVSerefmaTq6qmpkqDDnyrKtq2rO2VXI3Vaqeeoqsuq/jzmMsiqTLOeg58q
67uOznoLzDqqwuY8WdauaqKr+nVa6UFTzR0FDV/XObKvZo6sq/KrSyqnVVMkqr9BlW1dzR0PSq1l
VzHzUBo6lO3VZqpzVs9UdMa5+fn5zGMaqlOhqu1UrVUhVU+qpjVYqpvVSLQVUj1Y6qo9BVTjI6qf
c9RdpK7XPU1PPQVbVTDKiqmkVVMKrtREc+N1UwqJZ1Gqvugqp7neLWc2VWarmYaqnVVm6qYVddV6
rbiqsRRVWrqyoVVMaDdVMKg99KrtWVbU5QdaG+fLqKqZVW8qY+aq3Vb5sTi5uerE6k8XOLjquur6
GcXM6v61U0qprVTLmqt5VTmqmOUFV/tQ1PM6rPahq/KCLtHVTyqmdVrKueVW6qdZVTGaw1VPO1V+
g7VWnVTG6rZunPz8/OYxjVOj1Uq861VSGaoyoe+bvVTSql2KqqNVT9nu0ldqp5+fnq2oqyKgiqyr
uc9X1Xdc+dXUGNVYt1Z2qe9Vyoqs1cfDX2q1SH5rqKtqsVWKqYRVdV5lQRZzXGaraqc8/NFzHO48
UUQjoKCOhq/Pear3GY0dWVfV9WZVbqpzlVMar9BV1W1bU80cfN0qs1fQ5FQGoKA0dWVZHV9VvKqc
1Uxyravq+ranm5qmgqv1Wuneh6b66i54zc1XvKrVVOavqyrKvq2pq6rcqplVfoOlVqr6GPm5o6DM
oPc5nV/V81Vyratq7LqOnNVTnn5qmp5o6Cgjjji78/Pz85jGNJVSjVTupoKrlS6qb7MqqRbtJWdc
9W8/PVSbVT/nq53VTqr9RndV+rueq8erMqplVYqsVWqrNVjtdWVFWqq5Vfqy8dRHEqrnNVlV15U1
bVbs9RnRVUzt1WqqYqKqwu9VO30qplVcPVd8zZqqYaizs6qd1WGoqqeVU6u49urebXeqnUS5+Z7U
VVo8R6qZVe87UFVMT1ZzOr6rdV+qnrTqp5J17J1XOtpGq1Pn5+fnMYxqqUPPKqcOqlFVUyqyqmlV
iq3VSA46qa1U9qpHoKqW6r1VzpzHqpnVSXVSNdpK7VVKFVKNVO4+apqpxV9V2q5VT2qnnNEsqDGi
iq3mqarh46lKKJdqsqpg85qvquVcsi5jGq49XI58NV9VOarFWVWI6rtVmooKrtQY1XVfFUdXdVjK
u5syOr8w/PV9RfbOfmw3bpHdXdt5zVXquqpwerqr2+90EePtkZz5nY5qsx1LoO8VRVZioKrVX1fz
83XmWYYx6t3lVuqzVYizXWguKcqarh/VdQ7NeXQdcoHlTV9XVcjUGc/Q543VvZZ35squVN0DZlzx
Rdr5ueq9z8/PzmMY1V7w9VKVX6qpnUGdBVvNzmyrKBq7SV2t1U+qpxVTyq/VShVTjnqardVMOaLp
VlV2q/lSe1VYVVMKrkUXV1NX1Wepqqc1NXVUxdV+rsqplVdOararsVRUVFS7q26iq8qA1TV1VnLq
KrkXPt5V8dBfTnqp3VTtZVbuq9VboLyO48PV+c2VW1fSrsx1WsiqphVTLKtqvVFxXVTirJ7tVhqq
Y0CMeq/1qxT1V9znPVTTN1WavqKHpdWVfz8/PzmMY3PVSlU1Ooqi6qTaqZ81RVTqo63FVYdVJmdI
+1V+qlOOrz1XKCrc71UzqpBqpF5ua7SV2lQH3Ub6R1WKqc1U4oKrlVOavqsVWqrh6r9VMaCz1XKt
ij3zc3PdVyrU6jIrwzPUVWTKoqs1WKtugqt1GHVxZ0dA6rFTz1bVYqsVPPkdVOarVVOMyKrqvzIo
nEag6I1TFdTfPz1Lquc9BVu+brZz83NdXVXec8UVTV3NzRx0FAY0fPVlWVXKrlW1bV1Tzc0cdBQG
NHHVlWVXKrkUXPzvn5zVZ0MqCqlKq50qs1U5qpfuq/zyKr6qcc2VUgVU3qplz1fHz1WKqa3VVi7V
bV9V2qlKq1VTOqn1VOKqaVUvR1U156uq66sjoIqiraqsNXVUpcyqp7Vejju0ldqrNKrKsVVOKqcc
9VO6qZc1V6OrKrdXRR61VtVyq1VcvKtqYsVWayoOZqqmKVVNKqZZh4qqYUFBZs6VNxVXar6iT2eq
7VSuerquqaqVEepXfE6rETjdV2Kz1UhVU/qyOOqmNVIpj1Ug1U656rFXVUzquVHTVrbW+zVB02uq
XMamdVmqmNVMcq+qn1VKFVKB6qe42apveVBubtz1XI6rHMqrKs2Gqamq7V1VLFV64kldpUB9c9X1
dV/PVcqplVYPVf5qqZVU6q2r6t3Vcq3muq5lVqq/VZ7qiqMx1B+a8qpjUGqs1WardVigqKqZO4jo
1B0T6VU3x9KrVVNIrvvVT49Ac9VxdD0FXUXPmHqtGWVZV/Somld83NVSMe9GoLq+qmkdVOu/TtdR
V5o8xaUdVMasquGqzJuIyeCPmVWc9VOqqoGqqcVX7oqvZ4j9enNUVaarKjRzZGkqrNVlVZVkwhVh
qqc1U5qv1U4qyqmVV6OrqqYVWqrkXPHFqrarmsqtVXL56t5qmK85lVmTVQdmM1UVUxSVVNIqqZI9
BVTCrbs1Bo5s6OqmFVMu09VTSqwagUdQ75ua7vm5jnqp7VT6qnpz1frKirKtqppVTeqmtWVXqqVq
qWKqWD1Uj9j9o12qvVWIqmo23RLs9KONZVe56vq7mqplVfqp1VTLmquVbVtVzKtquVX6rWnVZoqh
qoPdRVTHDVWaioqt0DqplkVnMqB1ZVTTXSqmlWdomr5ua7vm5rs541o14qvqphVbquVfmXVdqtVW
qrNVLFV/njq+q5VSxUVUxqp3VTKq1G6uqvVUzUVVNqvqFHz89TV1VvtV1Vyq1VYjiioKrMdWrrz8
/NzXmXFFhu0bZqrNQlVTKqmFBdW1WEa6Do+lVqqmHaqmUadRd83Nd3Uc12c9Viqxiu6Cqz2tm1QR
UFQo6vi5qqZVfVTyqmdViq7VcjqvHNh6qc1MdBdWc9xVNxVF81Anzx1dVeqpxdxXVdt1dHURXHVc
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
F957vzL8m8jeTJ4qnmnjxRc+/74nSoi58iffdLjU5H8MZaq7mW0860D1d9qm5d99s77fbm17vx81
49dNLdFesucs5qI5qfV5eT/uum1dFjp4jUU3xJjaqJ2g80seavvQdX2czUHVBzqI3SJM95t3mVdG
erT9u/Tpki3s0faoyNljvmdRFFl4+1xR59vWLtuZPxFMLVyTMxRmNrLPRNzNmiXObv1s1BU83Paj
Uvfd306xZVk5mdKKb3jccSN03Ra50j86otarmviUor1309WK77T+r6ypLeHNd6kH98lvtufo7d4b
U/27X2VJb6Ucl8SeSozbj6mc7vwdBu7jqauqyrDH69Flvzqe599uvva3io8i5udPZ2dTAAH/////
//////QqACWHAAAACb+aEhH//////////////////////429duhqDt3boM79OT6rKsq2r6lc5st7
s+LNmxUD6d5j5iujkXNeHqYoumXfEa2333Qc+u3WLnvF07djK883drqu1BMmoHOXz25rojdk+xu3
ENL0G4nugnFQLuQzv2iO7x9LoHQZmKdvXfO/e478Nk5ep3yYwvvJze8uYmcjvJs/NU808eKLn3/f
E61HNzm5n33vHmuf5EZdKuqM2rygoHo99quuXbcb7fbm17vx8149dNLtRXrLVnNRHNT6vLyi9102
rosuniNqb4k12iVWKg80seaPQUHV9rqI1Qc65jdIkz3m3eZV0cdWni7d+nXJFvZo+1Quey0b5nUR
RGvH2PzR59vV4u25k/EUwtHkm34Y3Qx6COibmTxc2c5qDqc1BU83PajU7QbOfp1iyrJzM6am9475
+ZG6botc6R+dUWtVzXxCnzb6e5iPfaf6XQSrMen2W7ijzPzztL/ZQp5DN9t0Tuz5F0n+3a+68Peu
lH5cNJeOLtHQGud7ec9AfmoDVfHz1cecqKr9VO757uqzVSnVS1UVKqp3Uqqm1VqrKqUKrFx858yq
7eVbzXVTyraqd0Bj1FAaLmoOegjjq5O6iPgXlxbqKk1RZqQ5j1XKm+vPd98dBUR0CNQdzVNVNqip
q6pqpaq/vdVNIqqdnPjqat56CojqtR1UiVUgOKqzV1VOqqYGvn6OrqqVTxVdU9roDVUzqppFQUfP
HVh6rOXHV9XR1bVTyrI9811U7NFU30OqrPPFV1XVdV1AarqrFVqq7UVXqqU6qRDdoqCLI6qZVdVd
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
iPFUcxrboMzueq7V8e46mgoO9ViPpGro9R9upnzVXDxxG1V1V6q5VZjR6izOKKgqumOjOPKhGq18
/M7t5P0E1FUXjjnueJ0HSrxQO8oDR9OY9VpK+a6rfPHEarllCfVBVcqIsyLn7Kge+eKOq9zUF2ZN
HjyrEaPrkeI1VnOvPh6DMoD83aqzs9Vo8VB1q/td9OtB05jVXXzqpjZrZnR4qrdWc11W6CgqpzVS
xVaNVcqv1flRUVW6DnquVX6ruqqYUNVMDHyrqrVVMKqYc0UYZqqfVU5MbmqxR80R+Y9qgoKCKrOa
gquc9W2cz5qsqY9VZkdTQGqLq6pjPV3WrTnoGjxRGVAa6mNqrqqU6tNUc5+aKpNHmVXatq2gP1P1
qO3W+aqxVboKCoq6rLoMvM6KgqFV5o6r1VmgoKqY1U5oHVTiq33oObnq6rDVWar1BQVU5qpi6Cq3
VTigoOfmq2rqqb3VTk56g5qqdVU5NUVU0qs1Wj0FVw/Oaq1QVXnqq/VTWOg5qCKKK1GfndVKFVNa
tq6gq+gqt1XqqcVNVOqqec1W1U4yrKmLDx1ZzVFR0uNx1css1Xcy56tiyOgRzdj0HNzniqDHq2NR
Xl1ZQXFFQVbV0dxc1BFuPD1WJiqmVTzHjqamq5VdeZUVNVOO1RFQVHNz1U5qtVdV2VFTUVU0qv80
Z4qqcH6drioO3WqzVTKo71Wz0EdV49BQLZu8RzOqy6CKrec/PlV7pU81WdarVW1XubtVShQOroqt
uqxHV/OYVFVN6rNW83NEfnioKCgdWK+bnq06oqnn71bVlSqg1WVNBQc3Orq7muPrVocdTVZFBcZs
/CgnoroLqsn26qcROrKmqn1VugqyrMqpzVTGrqvqpeqKrh+fv261bQR1WKOKq13qs1WboKrOqrRz
VfVTuqmzq6qlSqzVl6qpxV1Vyqn1W0dB2qeeKr6nmjqw7qpiararKo6ChMfZlFaoKDdV/Xex0jfS
46DmjaM6uoDVdUVbU0FVznw1Au0dTb5uY+c9Sc3NVsYs94qiKrsuK+tW1dFcfM7NmGygznqzpHEa
Ln8ygqt87M6soMqvGoaDKuqp9V3PdBV3PzHiqKCgoEe6saObn56sqyosyoKCp5rqKC7q2NxVWamg
OMN0jioGe3qgzpVlRjWVZrmOZOqmMZ4ueKr+eJx55VTGrKuyq1h8eKqmlV+I1VMM5qrEfNzUFWGo
KCKgPzqKrari5uerk4zOPDu+aM1RU1J6nmNViq6KPrd5cXNd4bnzpVlVk+Xjaq3nq6oqsVf3oIqq
dVU5q+q7U0BqC6sqasjoKqYVfVtV66rdVNqrNVLVBV1V91XqCqmVGeqnTGR82HqpxVtVPOtVMqqd
RXdDZraNGqrFVOI4n1qKrFxmNQVXKqcR5nPUUHPU2ararcR6qU6rlTVlVNKqa1bVTWKr6rh6rkdV
Oav546qZ0F5z1fQVX6mOr2roKrPOuY1VznoKrEXs7bjqp/lVuqmdVM6qZ1UzquXdVOY8qOeq/QVZ
VTDpz3VTW6qZK6mqmJ0fnqY+ZVfzxVjdJjtIa5qeuqnBnGuarOe6rtBz1XOaqxVTyqmVX1UyqplV
dqu1dFVTDplRVZqygqunZzdD3qJrpQXtc/aI1D0++Om4FET00z27JPpZu/a5iyJzpaJ28+edNLXa
jek/wVI4ivROPcqotyeM/3Xa14zTuFbeJEdP2c8nZid+Zms+bW7XS8zprtqSMp70o86bejLZRY/t
vr2fQ2iSN42vZrtvtFr096mF0bkxa91ve903wi21eUyyyjosb+Lx+qjG3ucs9udoEdSbk6S3EnSU
EfeK7oMzpz7qNR0G5nKDrnbnkZr7PRsoF27SPHroWNud3ad07k7GV9pnrwIi7banUslVPvL7RqmU
7O6ftuS/NP1S9PNLNudXm4neJbdHR6dx71KlplV0NNbKdsvuW1QdN099tal96YzY1Qv1u11UxtPV
9t9M9oqDD9D0iob69c37nSdvTU5txZpzuKjmX0W36WIn1N9uyT6HM+1zByJ4zpa4EK3lHvqlrtt9
E+BK8cRXqnGtzqojdvfLPJrva8Zp3Cp3iT1fs9MTs1P/DZrPm07XS8zprvqZja96UedNvUWbKaxy
W+vbs+htU6N42l7vvvtEvY71MLo3JmdPdb3vZbfz420rym7qLLdFjfxeUd+qjiJ9mftOXHbnaDDq
Z3M9JbiTpKCPvzO7oMzrU7qNRugW3lB1ztzyM1BfZ9DZQLv208u9fepU253dq7ynuTsbL7zNBwIi
7beTqzJ3KfeX351TKdndU79tyXMDT9yXp50WbudXm4ruTMzs6Oj0zx76bS0mVXSKh3rtllKDu/eh
bpQdd6P21qX25WY15QucuzrqpraazatLNugyPqf1UN9eub9N1nT23mz7uLFc7me+Ppp96iJ0B6rd
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
8lqI6qZVZVvOozZJz9LzKCrubd1dvmiijcVW5HEua6v6oPrrtuiPQRUE7FVhreZeR52jw0tWc8Tf
NGfr36O9rmjvHzxXUVU8quVEdRV3PFa5o3FzmXbOZx3VkeR8/MdZ0q6K46Cqxz0CHag6Og7R5uq5
vO5rNt3V1WmuPr2RkzH5o3VkdBU9s6IZkXfn5+erIqqYVbdVw1V2q5FU1WartHd1FTkX1Gq5bqKu
yOI7eUFAeOLLyLnNk3j79+egT0rZrzIu1V5s6PVncx6qadquoKCqxFR0eVY6v6UArUFVOz1FVugq
pnz1XKrFWR0BjUFBVsecyoMqpjVZoO/PVYoKuqp9VSFR83WgtWqnmq2rrvvlXVdVqjcRn25qmgfM
6rFVurnQVLXPZsqsc1RV6oD0DMqmzc/NcR+3bOY54o6nd5ffq1FhubnNGY9RUnuM9rr3V5vmNFzx
948s3Eqv1MZqri5qqUauquVdU1dQR9VU1GUCWKqxV/PzHNEqCgzpQUGXzVfEquq6ooFQUBzaqUeg
PfU/WM8UfTnq+qmDqsVHOerjbc71ugtOO91azRn7VX2bLTtHdAt5zLduOKM2WrM40z8xz3174+/R
XjRsjj5ma1O8/NmjnvIjp9Ox0+/VOq5zX25jbx4ea5p2dN2d81V6reYHjuqnfNzVU3jjPiqs1PP3
qaqW6qWavuqzHR2bV4ePFlVyKrFOnpaC26DIuePniurDGzpGquqpjmjRKpyooLzrVcjq/plqrKuN
ma68/NQOqmVVygcvvY11UwcXa8iqBlrrvHFdGa+nNznMfOapXQx9UceXvqeondA8725+aI+Hi1Vm
Kp5oo2Y456qa1X6ipqpyeqxV9X81V09ViJnqygurjiooKBn71WqrSWc1noN9o0qrL5zu+er7qzpQ
UG3F8q014MqudnV2RZzUGVUwiq3tdRQRx3UVXz5vL79bx9O7WJGzDc8Ro8vn5j62c92c7zv0NUrr
3RjGi5zmvNZmznOfm5zxc9Sc6qEnrniMfDGw59GuPmO8s577xG69+nR4ar6CKgiWtVEdx8xzxnvv
1vKui57quVY46vMqqYGq2rKrXWKrqqc0FVNfvejUcRqP6bnR730iix6xzsZu9WRHVQjb2zR1XKr8
va1s+tnPVneJTuPtXMMzKuwVbKbdJlB0jzJiKN7i6Zz30jndTs7j3ayj60F7yrjxdtVZkttY486d
elB37XZzmq2rat5rjjq+qmtBznqppVtVjD1N1Up1U81VZpaqZ1U7tHqtXzOz3nOllBLQPd9+/N2S
dAou0dSa6DvQG6I9BndLnMkqB0FBz3U1fVYqKsjqena+aNUFBQGO4sd8/PUVZVdqp5VcfQ0Z1VnN
zRRvpjoO1Wc8cdXc/NjPlxx0FJVtW0GGtvv3oI+3aONdu/c2OrqtP3Mdde3U7ZkoqiP5ZryrKiLs
zR0eRtc9XUEfMeOoqIujjoO/W/rxZdVNOY/I9XnjtH5rqsUFVNqqe1U6q6qkTnq66NRd+erFR9M0
aVnfNfPO0ctnS5j1lU4ajnaioquVMsUWc8V5edcie8MdPnUedHvKCrs5j7WUHNFQTsVW5HeVj1dF
Qddb7RrI8nYqsy+8dnefbUeGio4lzS9HQM78NG4zZVTmrzxK4rqvVZVlRVtVyOhVVM446rlWK6qY
VUwj5uxqg0VRVSFQRHdWUBqlVU2qp1VeMmaqz9qav5449VXY2ulWananKk+UFRVmj1XarEfPV2VF
BUVW6CrqCgMerKvy6DHVnSg5o9VZeLHU0FRF2fegMzc8U5rmNkXa8quxXHF1qIz1ec7oJzV2lcxd
AjGy+19rzU9nZ1MAAf//////////9CoAJYsAAACvNgFOEf//////////////////////nOc9317p
GNm9HOc9336pGNmCU9VP6rqy3U1U8jju6CKraDvVhqqb1U6PlV48dQz0FVO6qZx5VvNUxc8/VSCa
qmBqsq3nuqm0d0FViONs91UxTzpQVdqgdBUGupq6qxVcioLqpldTQXVfyrDmq6goKA9W0HRVM7zx
a7Z5nPzVNBUVNBVd5j5zvnqpByqnNVKFXVXLoDHq6O0Y/aqntXGq09VOT1U6qppdX8/fmqyrqqfR
RrpVTOKKJdbOn06qLKDp1y+jvGbmuI3PV7VAqk1WVbHVTWOqxVh6A/Pz1bzmzIqrdVMardVNqtnX
VmmfKiro6squVWXfNHP5VTmgqKirKuMeguJW6v1Uc0fSS+kd46sqKmzGqVjXOfKsq2rqirM5rznq
3RulVMeftzOOqmd82XQZzVNV2qndVMKqZHoKvq+rqrGOqmNVPavqp9VTnKt56mKraqYdetTHzrnu
q3HVdqt1XqA99M65FFEbmqy6u0dZVcVBV2n0oKA11NRFV1Vmq5dBq6rdBdVM6A9TV1WHNQUFBQUG
HoKDpVuqnnizt0oEs8qKmg56mooKDL57ec1VyrKv6ZxMVS6moqsH57NkZqg1VOaqfc2RVdiomedj
uq3Qdqsyd06A9SaOqwV5qr+T8dVOaCoyrDq6BVebpqO5mdjd1Yeox82LMjqy6uqKA9VurqqcVahV
TCqn91Ya8vpzUvSqm0dVg9BQWeq9V1WVajvnoKuoHz1XrM116Y6syooKDrFQZHd6qyq5UUFVuqmd
VyrroI+lBQUFXGt5QUEffKDpUc2NLzKCgqaDOe6vqzOh8nX0oNGoDm+0B4qrNVMKvTtHN5FR3cUf
PHQGMdVMRqrafWLEYVUzNHUVW8ixc3PmY9rVGqOgoIup6sqsVU+nex6nOY9BUHo6rlVirKmraiOq
3M0FBhjmq6qmlV6qmlWn3QUEXOeqmFVOKrkfPmHnaCg1VlVOqqQHzc9VP6rWc1VPYs+VUgVdlBQU
FBQKZkyqnLqubqpgj1Uo0GVYegNVtXxVWD9m4zxHdnOd6U/LKuaf70FV41BQUBqrlTVvPV56qYdV
VZoKA1BQW6ujqaqYx1YbKDmq5/LuZ6ZHOX2STjvRSgbo2tzCt/abxUffUr3FH58+7d50tS5T/aal
rreS/aPpTJPE0tvK3yjk3l/btUZ+xzzsl660En3O3Tzt587dPdSS7phz83egXTv21t9M66777d8x
/FQbSo+ypVNS7fii0tXH06dK8U7le73fZI0ua938pCkyqPMsaN8z1d52Y79V2ztXdNRspvvpefPl
papOy69N131+ydXO6V9uvec6q5x7z938k766bjiop996Tffpd3nfqum8Z+vx0d953T3vrMd12ysk
qOj6t5uYR39pvFR0Gt6nnR7ij8Xz7vo7zodS5T/SFLSLtkv2j6VsTy8tLbNW+KR7w+7ju1R9jnn5
L6daCT7nbp7528+dum9SS7o6Wm5+bvQLpQdtbfR6W+2UGY/FQdNpSdl9lyapdvai6LV8/Tp0pIpz
vO5Xu732WGlzXu/lHSFJlUZssaN8z1d+87Nd+v1dsar2e6ajZTffSmPny0tUnbOvTtSJ0HkzQOf0
j9qCgnKBXOWs/G38zvvp2T+xxUVE++9zlBQdLvKCgXTZmfrtn7zunvfWaoKDF2ys4uaqmdVN90FV
M6tuLmq+q5dVqqmNVuqmvN1j5qmqmtVNcqprVTWOr6E9VNaqa1U1qprdV3nqyq3VTKqmlVM3VTSr
6qa1U1jlqprVTW6jmdVNaqa1U1qprdVNatqptVTOq1U0NVOKqaVU1qpxVTaqkGhqtexVWZKqa1U1
qqy1VZKqa1U1q6q2ahqprVTGq3VTKqmFVNqqa1U1qprVTWqmtVNaqa1U1qs1UzqpIqpDqptVTaqm
1VNqqQaqbVU2qptVTWqxVTaqmNVNaqa1U1qprVTWqmtVNaqa1U1qphVTCqm1VMqqa1U2qprVTWqm
tVNaqa1U1qprVtVNaqZ1U0qprVTWqmtVNaqa1U1qprVTWqmdVqqmVVuqmtVNaqa1U1qprVTWqmtV
Naqa1W6qZVZVaqprVTWqmtVNaqa1U4qprVTWqnLqptVTZ1U1qprVtVMXhpKr8XvNVTGrKqf1U1qp
rVTqqnlWVU8W6qa1U1qprVTXm5pyqmtVNY6qZ0Hc8xdVO6qdnq6qmTq+ejq72qmVVMueOqmdVMre
exXdVMqqZuOqmVVMqsPVcPVbw91csqp5VSHVdR0zVXc5s5rTxVW6tqbqs1U/qppVTShuOouq3Vfq
p7U1bz1U0iq6q5mGqp2ubKtqpgarTVXaqc854z1XKvdvnquc9VvmzOaq1zRx89TVcfars56rnOsq
p2+eqn8dVjKmpq6pPFVdqsXVcjwRVWPKqQaqoaizmurarlCbmzIqrdWVWs1zVdVp7Oegqt1NVyoV
VyYqsqq1FUVfHVYvOero756rkeZVlVvFFz9arB6sjqtRxuq5z5VShVTicqYqrLj56mq7zVXqu5sq
uc+KqrN5VdPVSxHz1NV3mqvVcfmNU1XOfKqb5VSPHd1NTV/OeqntVuq/VcquVZjjqpRqpweq7V1V
9GXjq+qlTzmyq1UVZVlWVEVWVZVlWVZVlWVZUGqOYxqsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqy
rKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyr
KsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrK
sqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyqmNVp891EdVMaqY1UxqpjGaqzGcxz1Uxq
pjVTGqmPP7FHz83SpqpjVTGqmNVMeeZiqTLnqpjVTGqmNVMasqyp5ueqmNVMaqY1UxqeY9VMaqY1
Uxqpje4ooo6qY1UxqpjVTHn8q49xXVTGqmNVMaqY89qoqaqY1UxqpjVTF8x6mpVVupqpjVTGqmNV
Mam3z5VlHVTGqmNVMaqY1NVirucxueqmNVMaqY1UxjqyM+3VTGqmNVMaqY1NVio2+aOqmNVMaqY1
UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTG
qmNVMaqY1UxqpjVTGKqmNVMaqYutHz3k3b5k7m5p80dq6m3lupju2o7dxtW3FzTEdxp1dV9X56vX
axxvnqsqWzVWKk/Pz1DjjvMNGeKOOqyY98+WueVHqZmpji5uepqOfnzKu7VNTz5Fz85o+fFEqmhq
ypqOfm587c8Zueoiy88eXOxRHiPmVORH5+eNm9j5zTdQaqzq1zKajupvDzhnaPd8ykM40m7Mqsqx
zEXkV8zjyr4o9xe+tYnFFMVdHzq7q7nO6jHdxZHFVYjPnOaNPmu15zzJo+eLm58ypt9qu56k3PEb
nWXHHhqGrKsq7m58q7tHlRzxY/Mq7Lc7FFzHzLqsmqT88cTl547vKK6v5qjnq6q3UHinM5udRVXa
qZ1UjVFViqmFRVZNVTGrKirKtoKvqplVTGqzV9VuqmFVMKqYVUwqpjVTCqmFVMKqYVUwqphVTCqm
FVMKqYVUwuPPTWeLDrnqY+eKrLWPypjZsu3UPmiu75qmq/Uc1q3k59i5u028XMaOq7Umqtz1XVXe
aJXU81WR1X6qcM9VOKqY1U1qpRqaCqnNVOrqsVFVmq7Vdq6pqartTVTiq1QVUxqpnV1V6rqr+RVb
VuGqs5U89R7VbnMjq43Mc0VTqrMjjy7u6qcRVN6oea6rtW+3Fcx5URxHWc0dVOardpvHzVPkZr8o
vfTHjM2zHNGczerNG8w5r22aM5jmdsxzmw6ehVTKraqd1UoUHSoXeq1FVlWVWKrNViOrOa6qYc2H
54j3EpKnNc9QaKOpqDnqDHPZrqKio57MfzKu54uaa58ecxnkd1W6rRj3fNVaqu2j1WaG68UWXvx5
UTdVMqr/PUVUy5nUmm/Zbw8SV3l3mXP5Gc0Rj5jPhzmNErPlvfS8OzGiOfJvD4cxt1NVzD5u07Me
5b56qQKqaREahI1TQXVcquVU756uiNURuos8dRzXSVWlzVHNVio6POeKq1HVkdVqqz7zKon5rmNn
mRT6ykqt3kVuKqxOZVTHPhsjnvajOa1V1W3zVYrq2rbw1HmUJjYso6jxmZjM1QbzLNmto15mMxnF
HUIxr1i2qOoixmieGVVOqqe1U7quxVUxqpglH2ug5uc9XXz1U1qavbqvVMVVMKrne4qqY89V2rz1
bVajq3McdVOKqYVWo3V8dVMeepjRo7oZjzc/Veqplcbqs1EZsj5zHyqx2jquUb56GodEcx8PmHMY
5ztRHzd30w5jxnNFHmH3VcMc8cRufMPe+jTPHEY+ZHzrVC9nOYx8OfN2oo2cz6Yc+Yc0Rz1XIjny
c56tqtxxuq5qhuMyqvRGOc5udRc/NzVUx5qiqkOqzVSVUec3Nzc1VMOaraio5ubm5ubm5ubm5ubm
yOhqvVZR+TRlmRTlR539q6peXZqm7sxvnjRramzmypqInZvJ9Xz+VB7qvGPlWndxUej4d0clRbRo
om6hOKci5vHZ5+qyaqxLRoy5uaqmlVrmq6rqsWVWKrxlVT6qn1V7mmKqZVUhuqmlVO+fKnuorq4z
R6r1W1deYz80eGqeao56vmFUVJ6jmjnWapPUGqahc3PafP5VscdVpqoiqw5+eOouOKO8zLjPFHHV
Yw98+HSPzzPPHFzc/PUc/PmR8/Pzmi5+c3Pz2vFU0NWVNRz83PHdTnPnPzRY8NlztxRHiOtYY/Pz
xu1q+fn579u+apOqudRU8/NzVNVqp56u5ozG56soeepqatq8+Rxx1C1fvPVq5j1U4qp/VTiq5VlV
MKqb1YZnfNVbqs1WaqYYbOarKrFQerTZhk6+LcVGjVWqGcnFFHMTXk/d80VxudVHHVdu6sNVYvFO
6m5/L9N5lxKSI+XFiiMqsqzzyZVmPFUT7WVdFHuK/cNMeTHnkUXlTZ8Nec9nt37mPUVVuoNmKhoa
rdVNampqvR81VPD3VZ7GyKKqyqr1Vyp56qbcyyKqnFVIV88XNFV3NUOqxzRGVVirearOaqmNViq3
7VvNlRFz1eZmw8UR6mK4tm5lFHmc2Rxc0ZjRVEdRUVZ0qI4soTM2VNTVnMaOKq/jq61z1FVmq5F5
5U8/sZjxYo6iqmdVObu3lTUPyKOYyjWHNFGeI5ojxxJmPHEY5jxmiO1lx81VnzzzmqyraqY1WKiq
1FVtVNLq+qmdVM8qphVvNz1Uw5sqtVWKiqmVWVbVTaqnVVOqqY/NVU3qMqpEqOh6qeVUwqL5jVU3
qt1W6vqvVdVbqpCqKqY1FVNaPPKqdVU4qpzVSpMRc/Maro4zGu+c+Kro8RqjKjyjOeI0fPGaLmyz
xc9VzMVXVMVX5VZTzmw0UVVOaqZVWqtq2raioqphUVBzVUj1Uyq2ratq09RUKoqMnKrFVMqtq2q9
HUVFRUTFW1bVbqsVU5VVioqKtqKhVbVtW1bU5z1FRUVCq2rarVVMObmyoqMPUVFXVbUVbVtRUVFR
VtW1bVsRjVbVtW1bkRjVbVtW1aaratq2rTZUc1W1bVtW5zVbVtW1bFEaratq2raioqKiratq2rai
oqKiratq2raioqKirKtq2raioqKiratq2rKioqKirKtq2raioqKiratq2raioqOaratq2rYjT2dn
UwAB///////////0KgAljAAAAJThGIgR//////////////////////9zRVbVtW1bFzRc1WYoudGq
ygyqntVPartX1U7Rzx1U1jdVOKqcVU8uqnFVOKqc1U6qXVTyq7VcqpxVTiq9VTmqnFVOKqc1U6qu
VfVeqpxVTiqnFVOKqcVU4qpxVTiqnFVOKmr6vq6r7qu1HPzTGHPm+e4vrdDaUeZFh4zVExUVEdWR
dI4pizOpoeapdD5i5qhc/s+eKqwe56hq2ZVCotxRrEu5o8jnKrVVqpq2q3UVHNVfqp/zR1WarVVq
otqpyLV1WarPPVfqv1U0qsVUzqppVTOqmid1fd1NV+q/V9V+rKqaVU7qp1VTmqnVVOoqqdc5+nPH
z1J6qdRRVU6qp1VTqqnVVOqqdVU6qp1VTqqnWVU6qp1lVOqmqmn2qndVPauqprMc3PVxoooo4zWc
y5z5HV0WcyyoyKKzxc8cXNzcxo+aKzxc9QbKrhsq7Oapq+rIjHoObDYao8nJyqntVPaqa1Uy9qp7
VT2qnNVuq/VT2qntVNoqqe1U9PVafnMaI9W1X+bMmjznvs5V9X81X1fVYqsVfV9ViqxV9X1WKrFX
1fVYqsVfV9ViYqpjVSJVYq85uaYiwz3FNOo8tRxIxp7JjmqIqiKYvDUL5qHmi5veZ853fPVtXVfV
Y1VTWqm9Vir6vqsVWKvq+qxVbqppVTCqxV9ViqxVYqsVWKrFViqxVYqsVWKrFViqxVYq2qkWqxVY
PVdqsVWKrtV2qxVTSqmhqrFV2q7VYqsVXartViqxVdqu1WKrFV2q7VYqsVXartViqxVcpKrGOq4s
MaXeZlVM6qYVWarVVjMzKrVVuqzVaqt1ZlVvMzD+GqsVWKqYVXMyq5VczKrlVMKqY1WKrNVzMquV
XMyq5VczKrlVzMquVXMKHNFV0VRznPFFHkdXI0cVTeZzZkUSj5ufmiPHHVlRURxc9R0jdThqrlX1
ZU1ERzVBvPZ+bq/KrlVzMquVXMyq5V+ZmOLOaJ5mZzRVbVTKraiqxUZmZFUc1RmXme5VlWXmVXKr
mZVcqs1U0qpibKjMquZlVyq5mVXKioqtxKq5mVXKrmZVcWqrmZVcq/M9VVNqrWVUwuoq4y0ojeGk
xTIiis8dVKFVKFV+q/zx1X6r9V6rvs9VSpVVoqv1XTUFTVfqv1U7qar9V6q/Vfqyq/Vfqpeqamr+
fnjqv1X6r9V+qnFV+qn1VKdVw9V+q/Vfqv89VOqvqu1U5jqv1X6r9V89V6qlXnqar9V+q/Vfqv1d
Vdqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+
q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X3z1dV9VIFX1f0yr/
MqpjV9VIdX1fVSRFV9X1bV9X1U15qvNlX8xqvq81X1fVSbVlX1fV9X1VQ6sq+r6sqKv9uaq/mqKv
q/mqsVfV5jnqt81VWWqnMdVOKrkc5VSjVtW5HHHHVSL2qsxxxxxxxxxxxxxxxxxxxxxxxxxxxx+0
cPCkcccevFuYuOOOM8x5mRxxxjcccccccccccccccccccccccccccccccccccceRxxxiOOMVdV9X
1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9VNKqbRVU8qpxz1XYq
qY0BqrcUUUVVM6Dmiiii6VZFFFFFVbqIoooqqaVEUUUVRQVW6siiiii5qiKKKKqmdVIBqtiiii5q
iKKKKo9iiiiiiiiiiiiiiiiiiiiiiiiiiiiiineBSiiiik12PFFFFE/Ioool52NFFFFFLFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFcUUUUUX5fZau5lm
pWn2kvs2r3Mu/J3SWvH8zf2lvNy0cmk6OjxzGR35jXadXS8by1MxTHNlbPcMfe3z55FFHLQM0fOa
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
FB1CGKD5whEc1V02qsgcVU4yIH4nNHM1UAePiH4mQ8mITUxxKCG6qATCHHIQY9qoAl04VZVsdVyE
XOaq9VBFV3NVBkXlUFBQVQc1BVBQR0B6oMuoqgqu1W7oKoEaqCrqqAPpritPZ2dTAAH/////////
//QqACWNAAAA9Pk5jBH//////////////////////0+JIMmenFnuJnEyqgI3/6ovkp0Lw625xepX
mP3KZ38uYZr326ZdrUrdfUx2zWS9THT+ZpUfmrR7zNFtyLGfKGh1tzV+53NQ5eXanE7x6U35Oe0l
JJMRrvRPt1lmpfdzmpie25prs/Onbzb6dHNHSzG7WvZxTF4a5Ua1qdsTfryjTX149Ynky7d32lnZ
nM7b7eaom9ro6O7a9nt0Otdn9nt+6T6bx55QvW9NdL6PXnmphPKWj9xaW9v3Ly6Hc1qdffrPds1O
NbU83nsvwzf1zG5P69pNaEo+vpPPL7TXV0CmNe7afRM6Zr6QmaHtqtM9OmtJ+/dg12Y6e3OZ7LaV
myjnMlc5cx5JMWa99umXaepbdfUx2zWe9THT+ZrKPyk1aPeZpdpFntnyhoem27Tzuahy8PanFd49
NOb8nPfJaSkpKKkkkmI13on26ztD77uc1NUO3ppt9O3m7fRs6Xpsbta9WTF4a5Ua1qdVib9eUePK
N43rFR3NZMu3d9pZ2bzO2+1E3tdHR3bycoe1Dq+nd/Z7c50T6beXjob1vTXQ/R6880seUupzFpdt
1svL1uh6T9rrPd86TzTyebz2XRmknpTutaWx+Ak+vonO53muroMmnObafTLWRpmP50g6HtqWZ6dO
nRP37tizK6CpszPVx6R5Ear+eq5EerKirXV9VOOkxUVdVcqs96rrq2qxVjqannquVUzj58qvVPNz
86MMqIph39oGZXfR81B0733pO3S7jjcSyrKCI/PeHnKCr6v5qDvzVPN0oOc8b5qmgPHzR3znqKiK
qmkZr9zKA1RVyN2qxfNVWKmrolqq93PzVU4qpxVtAc1VMqCKrKsoKrtB2urasqppV1WVWcvm7VfU
ZQUFSc9Xdj1dU5QdTZz5zVWarSqp5U4ep7H3sR1NV+q7Vds0dVnKjtUqLec3NFHVcXPlBzdKu56C
OgjquVUjxNc9VOu2u1ViqzHz1XueN1XozdqmOO6GrKBG5oqqYxK9ZZqrp1U1X6qdVU656k8VVjsc
2W6mq/VTqqnXPUniiqsVWexzzx3VaqtVW+bmiqplQVPSg3nNMGPdB5QcxsZ+tBFZ4qg1BvIueMyi
73GdHiq7mq232zvGa3nNV0VVuOgt3fTT11qLzRkbmqbq1qI0Z0dWbI+eJXnMfKjvQaPkUSzIz5kR
+ZH6x80dRzWldBQJXQXzc1Wc1x9ruzZZsaygvr25+eKet2aOOLtnc8fPcSs6iiq6rrP25qBY71Mo
xrfXDK4+mGqauiOeOrsztMLWabU06E5tI/a8XNkRlmHyKI189o/Nzc1W9ldAu8Z7V80VVrmdWXdB
dvetGOZq83154oo2aPtdqOOI+M6PEfmqT9r5o0qDH0cya863QUF7yPRrqYuaM56nM7TW9Z0nvJih
cZkfoepdmoO5o4oj4aNTmz2rqsc1Xd6rNVyroqrtX1U55+jXNz5dBVZq2+dUCdq+j3mZzm6mOc/W
rF2uay6nMoqsq5HXWgNU9avvvFz1bG3UVWbNdRVtV6IxqC6u0agoI+ZVbVTmqlSOr6sWsyKrIubn
3FzR854zGiqznNQc/Q2bi5phVdlTVTCq05lVbUrcUc8ZuYoY+Y+RnNQTFBcZux8Vsx71MPDx4fmj
oJjr2Nh7yz1DNVhjVXz1fVeqvVU4qp9zqq/zc9qzm7vyojNQd6CgupqIqCPnqDvO756jHlBQXOXH
FzPvF2NUUFBHEZ26CYqZq29VXFMUNTU1PNs8WruzZh0/DNrnPFQeHzvq8MfvbObLbw8x2iZjx5QK
rO1BbeZkV96mPLNVcuOqzVTDnjoKuqXzc0VV91Y495htTGlGeraCOrjWk8ijPbPVnNE4/bPfTpl9
TGPV9WVKq2q50j6ZHEa32s8fNEeYoHccWXaMfofUwfmjZqnPDR3itYY5pjV2nVZjUVTa688VAapq
Y+egqpzdWHyPrnegd9YnHu6Cq5zxTF3QI1DFlRnM6DpfPGc61jw5r5nUs7P3nYo8WI8UZzUHnfMo
NnvRjvFQnM7tvE12PHEj5lBvXegObLoVdnttsx3MVBz1EZuvfD5QeGO8vWz23aoTmmNnxvMNHEY/
lBjzr3Pdx81XxyUFtt5l1anFHnNboKqf1XqkyNVYq6KPN30vHHHzOI3aNR3U813Zqm8ceGvmt9+3
Z9Hzx0Hap6RGyO3QdDK8xmNQSHqD1EfNVTCqmFVvnq+KOr6qc46rOKpivGfrd0NCaOOgqygv2gMu
uY3pUB7oH5d3qLn6pGvtQUPSNvuaOdm6C+u+fni3vrdmjji2u54471uzqKKpqbP25rxvpMoxrdpX
HrDVNTEmeOpzNdNazpOzyucOacR9JM9TUYbubebx888jnqcoHHUxRajuauLmNGouf3Ls/NlBcdvE
nFzVbVTXKCrjVET7Rdu1BhuZOcvtF1i1HzYZJVEwuarMiMqA7juKKKrd3lRcfbvGe1G4qrWdNUF2
+3XWrfapV9bztq+fpQZ0Mzx1eazGPVtX0FAegSPHFVb5uhjH7GqptzdDR1UiVZjjquVbcXPz1Xqr
BufnquM3O4r1z81BQUGUFnNhjKOgOc3Z0CqyrkZVZZrupqNRYfVBVxsPlR0PFmY6DOmTl9DGioG5
jDnWeueu228zMoKDto57ttvMzOvfWz226rFR5Vew3PU1X6r2c0Xc9V6qn6qLiq2q/VaVV6IxrUd0
OZFzG56mqndAqnKiLnzKqZdkfEbFlRdBQUHNz7vLtWzUGJVdVjoE+Y/NVTmKo553pkcfNVhzGR8z
Iuaro7qvUNXdciq4x8oKs56C6uy6jvhs3ec/Oo6Gr4sy447PHHFkV3s5zR329WZz81W1XMoKi3QV
WeagNQYeqx3qanOerjGdTz81BrMOaZcUS6UEfaNOrKuPnOqsMa6moPh6uiOa4zRc8XeOkPVcjyq5
V1VOelRVaqs0NWPnNlVg1R271U75ryqxVYNVfjvmq2qmfNVY56r/PUv5lRFzZQTG6rpoqruLrVc5
6rnNkdBzR81Rz0HR30UfNQHPSdEcyuo56CgoKDm590F2Y9qgu8ugwzVXVYqCgV8z5qqcni5ufpOv
ygyPmq2MxzZz8zPi5o03FEaI8cZ6qRKqY1UhVWUdczzZs8qcqdTOG7KLpQHSq7Ebn5j5FZ48VT95
4m9XdW81TU8+VFq8i1EfKsd1XoqrHNznqaDVW3QR1alzVbVl85nzUFBQUEdAquu6DLP2w9ni71CV
A6sqw1vmnel3Unq+g8w2GNzvmab12aRk6r1TV9Vyq9V1X1U4jqO8eH5zGoKiqnV1ac0SfQ9AuezU
NBz2egvX11X8q/KnmoKuvIoz1bdRVYjq7ms1TzVU4xZ3ypjZqCOqx0oKqcmjyr6tuOgurc+burqr
NViMzq01XVUwV1B6g9Xaq6rqHteRUlVneZVd79b56qcVG6qeUHahWs06nykM9TFmqKsNVZPVtBHV
tTVTjnqpxVThRVXKl1ZdV6q9VTmgquUHbs3ugfXu1Rzkj6NrE+mt5dHPebnXJ28esPm+2lOp321l
JReZ3ku5rbVG1vE7uT+Xr4az+q6Oj+V0/u321PdM8o17rb6TmX7ru+2abo9a3wSm+m/szr8KOZ1P
5ffFNPpfaj1vW6Na12k01J3X1z3k7cszedlujuRdFOUmqRzPk95MydNUi/HpQrycentK5jupaT7r
68W/e2l30ro0K29SxPFM3FG6Ts2SUxlHq63mpHtya2vj3qckfRtZj6a3l0be+jme3j6YfN326KdT
vtrKSi8zvJdrbXfVreJnK27WjX1Pv1Ho6N18f3b7anumeer3W30nDH90rvp2zKDo26PWtb4JTfTs
+3mluZ1P5l9zKafS+1H07a7SZpdpno8k7r68dD5eO5Zm87LdHci6p0mtOZ8nvJmToqTPvSh1nm30
fXaVzHfJaTVHebyPfvbTXfojujz+ZKTsrvepeaOgamzxc7yk7O/M1mtX93qZT7XIu2fM6dtUFWPW
XlBUdzXLGarKCqkiqlGhqpnVaqv1U0VX89XLtVSRVSIaqlCrT1X6qR+ror6X0S29dueKgNrrE+by
76PmoDROos0dxPE6mLtUUSPfbmiuK6JROJc9V6rXQR4Zc8WRVUz5qirsiizLmD1WKA/TvlVMKtjt
XzXHFQXlVI+c1V+7qpIN2iqbjqamqmUVW2a6vugjqp1VdqpZquH65g71Zq6s54+eq7UGuPnjRqg7
70W31yq5Fz96Bugxc6quR98yq3HQ89TGd1U6qp/QOKq53Z6r9XVWE6rdSaq/Vg5s56Cq7FVlVk9T
URnNV5rPVmqv1QVWKsw3O6mo533oBHFz1EUTqag1SaruuY6mK87c0dBdVznoEfuHPR1ZnbmjoLqu
c9BUI/fvs9Ear7j6dDXz3dX9alHin+qq5rcTjMbrFGczP1nzc/PRbdTUZVyvt1OdGqtmnO0Sq5I3
WgtLvFUo3Pk4z6ypyg7XdGulW8xqrcbuq5mGq/WdaDOaoNRaNQYbZ6vMe75sFW7s0hweqxVcN0qu
XH2q2+ubx2bmqvHXePMiqcVX83PzR1+idVm+fIo1QI5pygqLqLZ4qsPZzzB2+y7Odec/Nz5veqDR
jx1CeZfPlW5zFjN2Zoxz3cb682e9u2Xz8z5meLOq6nefxU0E3QJx9+3TMiXXO3dKSg6LRjmyrTbk
joqnm9PVYMerdH7dbq5dT7y8PVe7o1VvI4lnNziOKr0ulVm3GorSoDThz1Di5854j3dQdn7Psmbn
zm3rVBMVXMPlQj1bnPnNlX3Fe28Mdntm5quztz82dOa4/Kvi5zcxuts7ioKs/jKCbdT1P2y4l1R5
iTos7n5reRzfNFq6u5snOlRuhO6Cg7I8VWXzxqOO75zX07H63P444oueq2bnoO0eXb5jqPokzVf3
5u0xcVBeXzz11WD0PY2dorStnupq/O6NhzY+eheqg+RKpno6uqKr9VPaCqnER+bpVeq+KqmFVg9V
MYjVU4q+qlCLIqtO6DKAyurNrniPdVm4ouY+Ya8zmNFV3eoT808qTXHV1BQUFWzjtc/e6OKrqB5E
485pOd9pDRRnNO3HeKLI6DmccnZmmT5Oxs/MbbMqrlV01VOTGqp/VdqtVUzqpnVZquVU4yO+Y1nW
ZdRkcXM4oz3Qdo4qDpVTjpVy5rqxXcxrmq61kdB3UR1UVbFmN0Jmep6VZzxTGR9sS3U0EVW3cRo+
bmo8oM54rtXEazxqLO0zU0FxRxTJ4sydiPQX1iu3GopKm10imeyPHaqyN0R+jW8WPG4qg3Y0dRVT
ypVXRXzRVNVLlVIdR0imDmqOaznWZdRHrvQcxkaLO76YZ48oI6jaiifNfMs6R1bHmUGZ2iw8fbmO
qtjnT0PdxvI7zt1mO3NJ2w8zHFz52jmo4p27NQZkd77mmebO0/3tUVAFV9zpryg30oOmWfEu3apq
Oa1U1eaqx0jjqFVSNVSB0qp3U1WarcdB25ozc1WZUc5qKrznqKrEW+fd1FRlXXQRRVU40agPQmjf
NVtGeq66mr7MaooMtnvp2jjeRTNTfaZiiOaKOLJ0+XFcbUTjiXSpk7XF3OmaLcU7mHtxR5E6COzX
FF1qMq0x5k0WTp8ijyKN3FdTMxJxvqddrimYqCgvpGnmJKKOeUcTjeRGqt1J7GJxLeVUiVUzqv1U
6583UVXqqcXdBFdB0NQRmqMqD7XMnzO9c1V11NWHq3niWzR1YeKqw8cTenZo8mOh1OTmds11vI6k
/Sg6d40bubO0Sjy91WT7oI9nzKGeNHkfMdRUEwa+bvQdqE9nZ1MAAf//////////9CoAJY4AAAAQ
WaQ2Ef//////////////////////L7WnjvmNU1Xt9LyhWVWKrVXHqpFqsxVUs1Ui81SrdXml63Vd
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
5VTCq3lVzObnZLOfC2qrI73Q7OeqnFBVrZllTFFfNVlTVZqvo9VjnM8yoPHqPDH6Gq5WunPznFV4
+RXqKpqtWOsRqC6qZVed1ZVaqtM3TKrFW0HTndSfpGjOoq5Krjx9+tFP1eaPKrBo6lb5uap5o40e
LmdD2Rzc13mGs8Wo4o08QurO1Xdatq1HNUVFVMquXPQJ3z1fnepqtRVXairqDmqpkag6c3PVtDPc
9BVTOp6c3PIyUxrtQYradD2qvUMVXdTVXDzlWRzDXOorw95fNVcqv81XVU0qsc8UdWd49UFRQc8f
NZ6A3P4erqrtVjXPz8xqu2bmq7dVmrqZ8/PFUUGXU1Wjc1Vyr1UdOlnqsVXN3VpozXhohSRUA15o
7lj6RHj1VaqKG+eYWW6vqt89Vuq3HU856rcpqrdVMebTqpxbc98Ja7GyeM4+zZ99MNQ7XudFry9p
ZtPUut5Q33R9PtvGroaHW/fNryjo92tX5ZlrszHXfx3nuWbN3l56VNtdujmnPeNdKDo7Uxoz817r
WLXQ+0rTTR1RHVF5RZlFs8dE8eRUkc4pnpMU8i7Xc9pTBk1296fOnTT7qOYmNZvN9ufR+3MQp71v
M3z9evNMRnN07NUdDmRULnc6zWL27zpavJhp54444973vKK95Myvt28Uz069EQ1M63HIu10/rnkq
CYNFp7mNRy/LeZz5kUpCwpnfkxte0C7Y53Uwl0bf8m/4LRTp0T9V50eJ43pLdH7FL45i5y5nXnnl
hM++mGVDvHnRa8vsszaenrtq+6P0fbeNq8oaHW35tePWz5q/DmWr7Mx1QPRJ3jyzZ2ucy89kNtPo
5pzz8xdaBO1uY6aM/NTi1mPR9pWnkbR1T2dnUwAB///////////0KgAljwAAAM/8k8AR////////
//////////////9EdUXlFmY9xx+PHk9zUnOscz0mJ0hIu12tKYoTJvO3vT5066ffI5jV7mJ7WbNv
vz9NH78xCnvW8NvnoOtRNRxm692qPyhMbfNQudzrQu6GPPTnzpavG8eeOOOPe97d7xTrfbtMKZ60
HVUvTxLnS7K7p5x7SoJg0XR79mNR3L8t4bnzIpbIW9dpiY2vUu2Od0sa6Xb/o382tzT7TPRP1Z0e
J5b1i/ucWdn6d7bucuZ6eLy33XXvd9Ku7syjjyONH54+erXVTjm7Ha7ZnPVYOKCJmqvRGdA/sdB0
+aoHidRfXKDsyhnec0UwiFe+kY6wq8HoFNdatP2q6gNesNz81TQKLIzDzOY9XRY2aqndVg5R9j1W
Dd93F0qaGK7uq5z1XszDRONdPMjzDVNTQYaJm0rqu80buhy+lVyr4zRUEWR1NS4zx1bo/S6u5xdA
btFQUBjUFVoxs6c11dV3Pl9aGfyLmqphVTCq7HzVUpJmRjuyl0FW1WDqq9zVFCbfapdBHGeqndX8
1LzmoKtq6qzV1RlBQVfHdXR1FVM6uvGY6yKK4oukWVZzZFHUdLoTo2deerMuqmtBQmjq7n6davoY
uvPVmXVTWgoTR1Xqu5xQP7QHzKqYVUwUWmYxoqC12j1MEFHiiyMojn63QdMiqLju7tY8oW832nFd
BGbsprrcR4uzjZ32R3hseJu1T9+2S9ujyLHQUVBE76dnfS3Xy3l51yqxVcbpok46BjVRh6nru88i
Tj1rTfNMVZV1BeqDMV4kegqznoKsPF1NQVbbzcMy+nWgoH36azWOOK8qaBmMaM5st0Hdu1qhboCN
CM0ue8cxePKCgMah7EejVD0P36mivnuLIr77jdLvFeX1fWqw8j25aCouxqrr6rMveRvt27a0yGqu
yO6DTWKYtdY6soIjxUButA8ed+lA9dHVcoMvVTHlAbQZjGy8oO9WKit6oaGgI+RLmmOmc7mFjqyg
zKA3ShpiDVQ6HuY7Pz3kXPVsXd3S0HM6Dedp67STjoV27Jb6UMVBcZ+Y+UMVWdi3aIh6jYmagdFV
x8Md9dZNNO7oOrdVjnx5zLth7eotUHV9tx0DysfD0F8/WghQW0c0XPQUFVmooKtj0apqarFRz89V
yoi5qkzqpxZo6Gr8Mo0dNd432poz0BzrKW4p53lDlDkdo1XYa8PeUGZcVBZ+aq4zRxLDdud9Ks56
DtUR9qirqm2a8PidRVnP2Nz9qDmq7pUbjy7yTmqQma+fDx1fz1N8/Q3vQ5zKO/T9DN0Eau+2dOpt
n6d6D4suKhNEVoc6p5a2uaru+HayLoe7R6hmN1Vn62sgfp1PkTjzpZsuNYlmdebs7PUUHar+3SrO
s5VzqYkfMN0qKm1l2az1Hbm61f0x1Z2oKmKgiw052qCj55Mw2XQnoHiIHqsx88VV+r+sdX1dzGiz
dug6dceO+t0nXofLy+ahvXWi6xY+xQxu5nji5ufNnZRdqhp301h++J9xLfVRK+bo4nnO8oGkQoOa
lV1Z26VcqiY67is93U1GJ7oO9B15+1WdO152oL5t3U3lQCFB3oE12j63Vho0lpVHOfmPdRVlTV1W
1UxOZnod5Q9Ld0tCs6cx6DZktdqHN6fZx0N9+nddFeWe6CgjzVDz0FBUVf07VZVziqaiNmOsqMup
x2Y+G56g/bmq/t0dTQUHNG1F2q7MqKmzHMfDHu1F2fmc0cVTVlXPKjDpmvLNdTj7c1X1Bzc9BlB2
VWOru2jdTWzmxtM94bnoKCoavryKHwyNlRVb5rqbKXVYq1G3QXiqDGvrQUFBl4kdLKC1Rc8Wby9s
7UOl5UVZL17JK9Odu7S6+0CoMxn7e55HlBQduuPncRrxR3HVmWZI66xxGzpZ+fK56Bdd6b7d+Zd+
93VgpnjqauoMNVTSO6rZqirjVEVWR8+X7QdufI6CrHQVbUGy1Vf5qDne7s3t4e8eqGOLrugoXmR9
O730oDR9KDD9OtBQd4nrHHFeVPXDGjObLdB3vpFQ6oZh0HtCyl9ud5OTF49dqCgw1D2pugjR+/U0
XOb1X33G6V0HN3j3QI1rr2v2goOtDnd5Qcz7PntJn7T9BZ6CgoKDplArNYaJ1dcXPQMx46Dn37zU
GVXPX261U5mI6sVBQVZGuyq+gNQdenfMoMOa2mPt9bN1dB0VBH36dea7d0FAks6m6UF3QZ27Fet3
qg21H1mupt5QzFo806CHRA8VBvb56Bn7LH2P18zZ8PdW8+R1U7Z6DnjRrqamoqKvqerPVZOY8XNU
VAqYzniNz9qHvQvvQI0cXMduhjxaWHjd5EaYjOKGNdr69aCrsi6PpQ5nRVWMzLocy8hdB37TiMfr
cR8M6rlxUGWR0fDXHHlnNz1FBQVFTFG0cxzXhj1HPQUFTURxKzHij56rdREqmz2aoq6KPFQc1Vs1
XVN5QHoKrFA8Uec1V09W0FRUOoiqyrqCgPV9Rz1FCk8iMbqutBQ1JtniPUxH5j8xtGtbNFOWc6eK
Oa7XEaNbyYmpmgvr07x0xql5Vhz0F9qqanNVe7moDGtbfPVx+mcydWR4e+tRfmNnM+/N2uqnN81A
u/TdB3q3mfNz0FViLJ/m5qr0dX5U8+dOc3ahoaC6Ciji2bHH9ygnO+pzDucPkxHQUFWY49qhoO0x
zUFXZQULoLW3jPQVXF256r9VO6s56iN+3HVmXPXdDmRVMVDHX5utVh4qqdVWDzUZ8ygfPlAfqZTP
cRZVc5qqdnw0R6DuZ1PN36WeOOhuleqfpfTKGg78xzc/MfZ6mKooYo3nNEferiNOHjiN2dpR52ii
i6R7xTUxM9H5aVA6B4e8x4Z1ZjXPzLVVrqubvH2fkna+tFQRmyOgzxd/ZzN9Dx0FBNZVkdD27TF0
HNV1BQ0GY7fZUBaljfSlqFm7t88XPlBzuoqsVfUxxH6UESUd1dVb56rkWqDFQ96Ghi2fmqWaou2e
3HzOayPocxsmKXH2T650ijmejzboGz0Hbt2FBGouezXlvKrR+fmcV82UEcbqy+eLmoF2q99HU51y
q1zVLqdR6HbzN3GfmP2oLqbVR2iTmb7W1dBQVbUVJjVWHkZ6sjqv0NBVtW9Isvmq7Kg0xQOgyIyi
oY+05zRup5zI3NmUNVxVZF0OehdBSHuovcT1l6j9WWuY8xOR2Y1BVtV+rojq0qDmjjOeOOKLGOjc
yO2dJUUVJmot27oT9FbmscuHvtq5qkv2+ujdekxQZ07UJtTE9Mz3YtvpfXpqM/aLMoHkWLToOm/c
trXncx3LQPo33jmuqx++4DrcdCunT5fmlnbvQX2oXQuanMTSt3F97ootXQqe7Zuald7SrUHfXbc1
rrRXRdKDHQUFs9FRdOlB064z93H2NRe4zPq6DvMWqC9e730y/N5rWi3byYzePv0nOmXuczp2oN5a
zSNFt4pqe36fO3c9ugvc5zK6Hp960VDjZqLpQO32oJrrutQ0MRu2nPXfQoQnqFS1mnNBdo6GhPQz
S6zafZnofXpeXvHry99JwMgOmTWuZ7t3uhjzojvWPUuYe++71czQ7ten66N1UxQdO26E1FqYnpme
7FN0HS+vTXOftGosygoMixLToOj9y2ta87ms7naCi10d948oaBY/dGQOuyjoey69fl+dMzt3oL77
6Ohc1OUOJpW7i+90UWr70KoVm5qV972u6rUHfp22aa11oroulA6CgxnoqLp0ioOnXLj7vn7Wai9y
zPq6CgmLSvp6u3S1vNa0U7amM3nR0Gdd9MvtOG6dnQby0s1MKcNFt5k1FPZ2v3UZu3c571QH7T1Q
r10+0HWioW4qLpQO32oJrrsjQ0MRu2nPXfTpXpdpS1mUD6DNU9YLt356GhPQzS6zafZnofW9JzvB
Hc5j6a6eX07dNmixZfPMM1V2qmplFVTmqnhqiqmt1MVBzqqn0dx0OVUw5txVU7quVW+aoVXOpoOa
qm1Sqqbd+/w9BfaM8UZTmyI8VRQ1HNzXHfXDXV3PlWVU7t0D546rcUfMY9VyrnzUFRhqqeGqLqtV
U1t2agqKqfGqpAqps+eqrBVTiqmEbN3qznijqtVU3qeaN3QVW6B0B2zUDoKqf1U/i+XFV1AzXVTm
6qZdjS4onVbq2o3QVU0qvVZVTp27oKCraCfoD1aaqxlRVYqasvn71WueqmvMqqY0B8Xznqs89X1f
FdBEfrQKJJxqrqqf1U6iVmqauqasj54o6nnoMygPzR1NBQHoHV8dV7nq+q9zVWriqs1X6rkWqigT
q+p56B89XM1XKrT1XqBc1BQUE03QHqpjVZqtR88RqA8XNh6qY1WarUfPEaraA9X1aquo6mqmFWVZ
URUDygoOx6hnoMqxnPHlRfVJfbygoKrkfNFQVdh7OuiUV/ZzosOulTzn56DDmqal89VirLypikPZ
qTvkSMbOn2NmqObOeq5ULpzK46DO2o446rdVuz1dV3OYx8NF795ua447oNtug687tRXdSdR1Wqsi
3OUFmi5siqXVTCoqLvn765qrtqStWioDR89Vx80VBQUGW6ui7qzxxpdukUSoKCgxrt0yoV4z9unZ
UHNUVPOfvYquVJtUFTz1PNFR/Oc9WVHTI47qt0FVzmrVcY5lFV1nVQ48X2coG32fOrtVJz1KjoJy
6DDxZFFdRz3Uuqx3ivUjNFHVc56rdXc98zq6gb7xGvmrHjVrtEVuOgoMXbmD6xLHfbLqtVZQVB+b
vcW+d5U6quRUFTzfKOqmFRVd5+Y9SlHFVctYe3Qcxryz3V9Vygqp3UVfVdjs3qoN5iu1FdR0P0Zq
Dmk65V1WXfPFUxJXVlXH5oj1NBGrqbiiyPm56rdATNEeramIz7RVEzGeq9Vcq+qnFVyqzVTur6Cg
VX1FV0yqvVWaigVBFQRdebVVOebN0lWOgnKB3zcyoMq7MmnQUEZojx5Qdoj5aqKig5oqjDHiquRx
xGjypP05k7jcVSsjurKr9WtXQZdBQHiqTRmeKrKr1WtPrlBUHoKCoNdX1aarqnnMlU1NV3KAz6Nq
gPQUkccxP0FBQUF1FxI+UFHeR5eUlBmLn5nORc2ZdV01ugoLdA+aI+NLZz1XjH5u8XaKgPFz32PU
1NTz82Zh0arsqyq/dp1WLPQUGR0Bj2eI8VTlWJ3q6r9Vi+fvh46D5QUFQnQZcR6CskjXVvNV1Qe6
qbVfVTCgoe9Vxx9KvyNqqnFWH5qDtfNUYllWG3dxUneO46j01V1LKvxO+bnyM5s0Y5roHffnd1Zm
VWDRx7Mdu1UVX+m8oKAx4o1zRYzd6rlWPMoKA5qqUY77RxZlTRc98+VezEKqb80XaSqkSq3V9BVS
kZH7R5FzUBqC+b7Q5cdDFQXugoOh9R3FURxc3agUeUHNVlTUHvUdWVXqr9WXeO6rFWs9BQXlBQHM
c1XRRVKqyrMTMeqxVfqv1a7u8ygoDHioKCKpSq4x8Uh1VYbqsPHlBQUF3QRVNXRHMcydWYqsqvI1
V/LaiqaDmiiq3KvdNdAnlXVKqyq/VfqwyM5T81V40d3h7qt1Xau5lVTag7VX6lc3Pz1U1qp0d1J1
QLO+VXMj9qLNQG56r2zuI3N01dVzKrx6nM2aLt1vd1deSuNRuzHNen0PVcqsI7xx1HQ4ZlVc+b5q
DXNVcPkeG+aPU6yq7fbRqrNnPRZZjHVKeqntVyOoNQVFBVTyrKtidVNue6qZRXVlSosq/KtM6vy7
57zvurOY1Ae0erasiqedqoioDRHu6hxc/PH25soM5oqCgRo46rlB05onQUCt1JrPGdLt0NEljXbO
boe8Z+nZc1RU85+9Bz1PZ2dTAAH///////////QqACWQAAAALgZ1thH/////////////////////
/1cqc1QVPPU80VBQHqOapqVQUEZqU9n6I8USNvInkTx0Gu2c65qmq5HVkUVvnoOehuJVFW1Wj1WT
xqg54z1EXNVZqaC7uq9dXmjjqvRndX1MR6h3V9Vyz83O5i7xVXI+agqucyqKvZ6mzqYq6KpxL7OZ
cdBVsdx81VqMy5zxTGrw770DqvZUuqx2oI8eX33F1oJ2gi1FG6mKOKq7kToKqYo5+artvLzI1Veo
KqZs14ageVXaBZlV2rqrVy0FBE4lQa5qB5VYoMpV2x0Ga3cdBQVZ8ugoD7NHZ497iZ+e6DKmgP8o
IsoOzUTjvmUXeI1BFHVZqsVdQZ2iqTniNdTUx1NXYqsqyq/Vfq2qxbPdBQRRVdUrKsqyq/VfqsVa
3d0FBVlRz0lVzIsSyq7Qc1V6pFV21dQ7qtXVqXNQVWKDm5+fKA8RsdVP6mqnlVyq5VTnpZ6sqt1W
Knmqt1XKrpzHPmWaNUEfNQUdAroLNVYXt4qCg1cd53jPfU95V1XLtUGjiyz1UzoD1NRVT/mNV2Hq
p6c1VtVU4oD1Uzy6Coqp1VTDIjmqp1HVuVFV+rqrF01Game1nWM1rMo8oM7Ze+fnjqzmuq3VZjq6
q9VcqvZ156rnerqr1RQc9BVdoD3FQRdqr1BpZlBHlVO8eqDdBFVYiy6soMi3VZqsx2ePeR6PdBlW
5EZR0CNQVWMUnW36bZ9Rni5qDKg8UVW3Hh8tGquG54u9VOrq+rI5i1h46tqpWoDVfIqi85uZRnqT
qjWK46DmoKDmo6BXdBVYNVYoM9V5pUEd3HeHjP3vqersoDx5U1BtrMj56uUVWXtyPvlA6Dmt1fz1
ZzX2MY8scVB2qupR5QVU7xrKCgqsRZFVhqrFx1WbjyPvO3l1abKrtWuSoSw5/udu+Rc8VXVfVdqv
mjR8iiPdV5VXKqeVfFVTiq5HH0yg1Qc3NVYqKAx7qsVWMesoF09ugjjvdAe8yrj0HY8dTm2jRZdW
ZFFjeYrur6udVmq7VTOqweovKDrVTi7qsxZVZPQY4qrlVzKuNU3lRU1F0Fmqc5jaqzyqmlV+qxVT
iNXQPnyrDu6BUFTQVMdBVT2qlDmNVtViPnMqAzoKA1BVxqC6Crqigjc12qzpz5zR1FRznyqmFV66
vqpjVeqpjVTGrnlpOrKsNQUBj/OaraqY1f3cueVmU6JFN6uM9XVMdQo+fnqypNVx7qy7qXnOa6Gq
nEVBnM8reflSPp9+P5Z763cXbmqbxXmTdvt27dCm8PzRPJqS57mZ7o40l3yrubm53QNNZ0XTXaM0
Z72tM7WRTdRVlXRxKgeeGqbPdznZzmamI4jvnpOaemFuojnHnPJQOTOjr5i7Y1QUFBp3tdMiiizD
3QWZXHGazHfMa+kfVTvbs0sjbPGu3OzmoLN363lAqCgR7zmVqg1zc9Xc/NVnPHHQS96BWeI8dWc9
QZmbPneOYproYk+s7WRlFzVd2+xKg79Ektb6bV94zY7bu+1dH9PkSmKD79TUz2oEl1eu1zOO2sug
Z3cTWljfXMfPeS+H5lvplXVHWaTUx2u8v3UlrsHaoO/dK1711MXb+Igr6L73SbzXw99buLtUVNmV
5k2e+3ZdPd5HzRPJqZvdQzn9yNJUGZHV9RzVLTTzOqmOvTvHFGe9rXdnugzmVFVlWVdHEqC8fkVT
bPc92uezUxHEd89JzTGbqOeceVMkVBchk6+Yu2NUFBQae10yKKLD3QWZXz85rMd80V9eegU7a7dm
lkbZ412qbOags1BQZQKgoFHeVCOqDXNz1dz81WVMcdBLQUCPHEeOrKmrDM1s+d43TXQxJ9Z35kRl
FUVfH2+xJ0HfpiSzWt9Nq+8ccWO27vtXR489PkSmKCg+/fuPNOgWLq+3TseZNclvvh6C42eKNrWY
31zHU3mvI6jN9Mq6o63QaTUx2PZrXurfQJ0FBQLLWuvTR7bX34unRd8xWzakP0oEeY9RupunlVNq
mrz1MaqpzFHVTaqmcdX3U89VIGVJqqdxo8eVXVVT6rqg3NVSPbNFz0FTdRVl0B4oqqdmqtPmMY5s
eGPkWo6mOYeGVBFV91dVT2oPVTI2c1BHVkd1U2qp5GeWrmolz1Uwqp9cVTEjUHPi5+ZnqzIqrp6l
+3VTGq51NEeYq66qVqsuq6c8ZqrNVIt1WqioqpIcZxe6qc1U8q6qkCq7QUFmqKrnNVeqprVTa6lH
oOe4jZqq5GaqlDnznuKcuq9UVU/qp66rGVBsq3nuqmVVMqrtVMzRVfVbqppdVNaqcVU2uoNlVipj
uqnlVmqmlWVWKrvtVKOVfzuq4e6uqpm6sygqpxVT18+zVJ2aqntX1bVT91XqqYVUz5/KrE5VYvnq
KrR6g9XxRVU3quRx1WHVbq49VmqzU87pMR6uqu1U9qKqY1ZVeqZarVVs1Vgx6mOoqvxVU6qpA5ph
1U5j56COoqpvVlQaKLNxVU4mHVTmPnoI6jyqm9Wc9QaqmeOqnVRVcqpjVTGqmdV9VU15qr1V7mqp
vccXSOqxVeqKr9y1X6qbc0Z+ZLPD1HvNV9Rajq0/NHVtXVEfNVczrV3NzVWKu665n26rmN2quVZV
naqmFXOoMer1V/PRmcXh+bpksnNV0dQ+Y/TmdVip7VebmVzHPVxpFh6ir3UXQJmP7Oc3PzHqeZx1
E9zxH5u3SPtFSRKpq2rqg3Pf27v5Qdu1Cegij81Qc0ZrqtvnoD1e8u3VxqrETizmqc5o+arlaq6L
ytU1ZVxo+apijqKmqxV7lqsc5o8vmPzdfarlV2qxVYq7mqsR6PVpzdzH5utXUKa7aqKvq+Kro6r9
WHqyrqtZ8OerYsjqKu545Pai4n6eourT1uY85UUjPPVbV3NVcli5+0cXWpipFU1dzmdXdeva/t32
XMY9DFHQcx6s7VW7Nvnqt3juoMqvq7It1MeVdzXnkVBnPzVNar4qmrKviqarE1U8x+bnNdVjqfmr
9ulW1XarlViro6rFWnqKAxzH79e3mquTVDV/NFQUB46uqD1Xj1bh6udViKrY6iPMvVWc/yrD1ZVe
xXV8VTVtXxR1XNddc5qtq+qmVV+qxVtVJFRVfq+OrKt5qipq68qs1OZGY56nm3MVfi6urY+ar7yL
qY3XniVXGjqDx81bKOPMqyq5nNfNzxGVXR1c4jVfz1ZdBVrzVtVX7+1Uyqv1X6rdVk9ViqnNV2ql
OrjVfVTCqkqqnlAbKs5qrdBFUVU45o6k9XVdkV2oo6mKrI+bn8jiineevU1WD+R1ZFVdcdW1dhzP
chqiM9WRTNRURmNGZdrnqCrqrh4j80cTqs1XNVU5qpgeq1MVY2aOrLq09VMarxqrtVuM1V+qy6qY
1U5qs1U51VcqyYtx4eOq7Vt1YaOq9VtV2qmNVuqnG6rdV6qndXVUyqprjup5qqazmR1bV/NVcqXV
cqvR81X9ueqzV/NV9Trn5oquuoiPUuKramoqYuarKnp27dKvi57NV+UFBiNmM91FDVTPnqyq5ec6
w+RtRVfEeg56k54oo+eLXU57uqxVvPzHVXZZqqcUhqqYayq7VZq7MnKrswaI9X4eKrqrNV+I9Vq4
6qc1Uxu6qcI9Vuq9VYq6c8qpgeq6bDHzIquoFmVbVTiqzFFZ4s57q3dV66tqptVbqaqdUNVKVVs9
VKB4jVMXN861fRc9X0FXc1Xx0BzXVuUFW3zVWs8qW8oDHNVb5952fc1Qe1lSrdVg5nHVYznwy6Kr
zVF9DUFTVkd1ZFdm54++WuegVVu6rMwznNdWuPpiqvGjqpjVTkzqphX9oMqLqpxqYqsxtc/tVigN
VYs1V6qmMZqqc75quVVMHqqnN0FB5V85Eersl5rjqs5qgqpboKqQorqsVFXVc+arKuqyo5+fdRQV
PNLzXV9HzuqzV9RV/O6gXUbyKOM1TV1Rz3nNHVlRz1WeerIo6CgoI+e+fKseVdOVXYkeKr8q6KOr
KrtVuq/VZPVaqpzEeqmNVOFVeqt1X6rNVyrKuqsaqphVdnMNE4sfPVlV2qzV2VfVaPFVTmqmJ6rd
V+q3Vfqs1XarNV5VU4qpjpafTnqyrojxVfh6rNVOYqr9Vmq7Vbqv1WartVs9VMaqcLVVMKrs5V1V
mq5VjjixGMfKvMomepqtVX6rdVw9BVjq3nq2qxVdqs1XKseVdFU1Dqt1U8jVWZQVU5nFlVKGVUxy
6r59c1Y9Vpvnq6g6G7edoqsqPrygzrZ8zm50oqrEeH587GP5dVObZ85+c2eG95zOP5Vx1lRV1BnP
QGNQUF3G5yKPIz5dVOHm45igw6dBfPd81SsNUfV7nXcwa7y6sFVzMs1WVUg81X1XY6mqntRVTeq+
qti5nVdznoKsdVipqsKoqt3VTiq/V+M9BFEeoqTVWKvqKr3NQLvzxGkq7LN2qt1WKuyOpq2oqarF
Vur3zc8XPVvNV9WR83Pm8qyruaPmq9Wqujqyroo+apijqKmqxV5/TVWOc0eXEeLrXiqKrFViruaq
xHo9W3ncx+bqc1W0Ka7Lmq+r+aeqvVB6irqs2fLPHVYr5HUVdzneWfm+VZzxYar75zedo9njq2pq
sRc6joFH0OZVcvatPFzTGM2Hqy+ffQ1TUVXuaq7lWc1qrKsq6KKq1PUGbNVShZ6rvPqg5qnyLmw3
PFz3zRqrqCp8oKCg7UfPQVXnlvnNz83POZQUEdxVF1Ye6E9TdWHNVtXc1VyTrlDF1qbOa75u5j1d
16dorqDmis3XmMfDVHQ9Wbqtm5j0G1UGVX3HzdJiO6M3mVdFFV1WRUFVyrT1XKioqTVMVXVXuekj
q6YNU1U5R5irJyq7VT6rqrdVK0cxVTg85VTCpqpCqptVcquVU6juOqnlVNaqa1U4qearamqxz805
0vnqs1fU1ZR1FTVlWVPmVMVXdefIqrlVx9qvq2oquUHPz1bQRZzR5QR1FTlXVZFHzOrbj56sqatU
R6SOgjw9XxVZVkdRV1pm563NPc9BVtXx5lRz80dVmq9VZquVZV2OOKrqsqu1WaqcVUwqv1UwqvVW
arlVirqseRc9WVdVZqu1UwqpxVlXXV+RGqtXdVPKqa1Uj89Vyr46A56qaOqnNX1ZVTM9TV3NVTzn
qpn5Vbqv1Weeq9lVO6qamqu1NVNKtqu3VTqNVXKqQKCjqs1U4qx1Uh1U85+ZTHi5j1NRV8VXVFXU
dW1Xc1Vx+arqgx6j46rHPzXkVrrFFU507d/KnKgz6XU5QRGq2Kq7VcoKts9V7J6rryq/bqpnzYZn
jqt0BzR1U2q+OKM1XVUxquYaq5lc11sv13OKS8s93Gaq72qKA91PMeZN3dVMVVSBV1TVZPz5HFVc
qplVZ5qqdVdVTGLmqs1U4oJyrefmqygq+jqs1NRVhroD5UxVXOagoMjq26OrarnPUc9WnvpFhqCP
KA5tOrZg0edI4qrFXbvKujy9XV2c2c3M6vzmnbqpC5+ecNU1Ug1dVf7uZqt1U4NU9hfNVTapurc7
aV1XqtqaqSD1U9yraB1XMqeaYXMeq7z89ROxR1Z8Pl1fU1FXRVNVipqyrqirarvh8q+ruapqyp6V
B6hmqsc983Pnar4jWqnrEsquUEUfft5U5QVMW6rkfNQRc9XZVssVXuq3jTisVU7q2Kr6l9IqGOcs
1X1Y+Y9BV9Vk1TVgoL81HU3lVzmoKCPLquVbVYqec5uh4qDI6BzFW/DdLPVbq6TOY8d3Zjvmqp1V
TSqxVlVOKqc1U6qsVU+qpAVVP6qZ1XDqgqpQurKqYR1YfmXSKjq6qxU1bz+1ZU1E9V1Xc1yVdVlT
URdKuk9nZ1MAAf//////////9CoAJZEAAAClD0eYEf//////////////////////o5lUXnPVYq/t
kWKgquVGGj5u3egq2pRueLKujxHkiiNbjqpnmUEdBVTlVWKrl4eq7zVWKCqxV9VOqsqpjzVNQ6qf
VXasw1QYxzUF2eKq6aq53MagPjoDPnP6bHVcw1XTFVqq4a7qyp5ryqmVVKGVNXR1WqmPHFGegoMq
uVWKigznNVbqp9VSFVxueqxV1X1WM56qa1U4OaKqnGVFVMKrHPzc9VO6qYc3eo57w9VlVUx56rnP
z1U4+0T15VSBQVUxWG5qrlTVt89VNI46r1TFnyazFU9K1J9pMuqneHqs1XKqdzNVM+xzVWKrVTVv
bKrOZVay4+fKrUVVub5nnnt1l5389k1vzDTsxcbdBQM9TEaO1qPqbOjNm5m2Z+ba7Kjm+9zsmGyZ
6n6xxKgiqOc8UTmNznc3y+zyzZd9d4umHnPetmP10uyzsaO10qMoI5haU91mb+dbu88mMmFQdjdJ
+aU35QUHvP06PT8yX7Ls3nwI9TEaPm56Dy979jue0bLqasw+VFXVZU3V1Rl8+dXnMcjnPvtcXh/T
qLtSH5umvXvN5uzSp9NuKzfaiOY1+lrmT8oDHvpUGjiPQUBpzvMHXNHqhm6FdKC8iiioDmoN3NLp
POgoJyg91o696LrV2Z3pJzF2m1fSZuejqI6BRbVKe7vubXbI+Zx/3eRLU4SqzMfplfTbmPMt9Pj5
6jZ1cZzxVcedk72Z1GqOLZ6OOLr0x967Zsiup9oI8+6nKuN2MdCgoIr9loKDvQu9mm+kXNkRp3yo
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
8qsHifdRXm1Veqv1dft83TKrF5ZksPiy4ua6jPe9WHq+q7nPU1U5qI6CrKqY4qqotBVTuq/VT+kc
R6tdX1fVTmr+lXc9VOamM1WZcfNeaimWZ1ZQdNxTh7NV0sxkXNUVFRdTfOc8WKLJ/n7RHGa79cNK
ZuiPHMdMiMfIoo7WHNz9jGOeYfh8iyK4o46g8dyc8xeG9PrcxMTs+u1R2SMY5kbms3NULHQHequO
e+9VxZQHxmjw8UuLZpybiPEfLyYxGiR/TSO3qKoNz0TaOePfZxKOoOdRczfNz5FVY5kqmpNVaq2d
56mrr5u/NnNQHjMc6qsc8XNVaqtm5qsqsK5rmMaM3arqqcRGjuizMVQVjMfM6c7jPhmzOzRnw8aP
lrDWc0SM1VYPncx6rrj66WGZzZl5isyxZVY7dKruRm59cCTUN1XehqrPNVSLHdRVZ7s1XVFVMquq
6qlSrKtNVx7uratqDi5yq1z1dVajjuOU9Qo5zqoqlYc5j+5HzGbqD45i8iPUzvMzVJufFHmXEuhu
ls8UxFHzdo+arDLXbR8js+O6Cr3a31uYoDc6R+aKKPMO+1BV9X1WKrFXVcY3boePm5qmpqyrKvq+
rarFXVcY3TtGeKKpqajmvmwxj26rXPVbqsVHOeqxVaVTuq7VfqavPVx6vPVZqKrFVzfPRzszU1cc
+R1fU1WelVpUFW1UhVXY6Go6VXaqc3byOoXPKeYiqXOMxzWfLi5531Xj5j4c2rMZHiPkeY4js5lz
Oq3UR1fHVeqMqphVfVVMsuq9VTrpVd57qtvd1Uo1admqyOKOI3PVZjq3nqGfLaxR48eMM5j7oKqQ
ee75sP1dV+qmFVMairqrdRV66KKgq+q5HVnOQqw56mr+az1Bpir6rbU4dHNlxXfr5+Z5MNXVeqyd
jiw98/OzG1V1WYs51aq/sIlHVejij5hHhoqhZjdTq6qf0HNmG6tbVVypidRVnPaO6rkaM8dQY3O2
qsqardV89XHyK2KjnXa4sjtXngzJVzzB45Yqmpic4ZmOe8PmRc/t+J4fmqDmjzV5zI+H3zR5GseR
Rnm/IqrdT3ygvYXbOs8gdBKp5759vD48jmTdqiYqKrdX9ZzDmiudu3z56rqKrxo5/DmNzmq7RqjO
dKr6tUVV55fOua4rWYdRLnqtVXKvq6q7VczmqsVdz1ZVZqvHVVmrTVZcXMa2e5iWOzqpii56m1Z8
R+Zmy75nGc9R4jxZGfObfO1ijis/PNnXe6COJmNQXUJmWVEUdVKEdVnmR1Qd41VTf3mqpzVcu6sq
pvdVypq6rnGe24k8uPmqtHuJWMqI6uR0dI9WVWAarbPQWerKrVzlXc2dOxqrlV2piwxj1NXVXOfu
47qOaLVFVz60FXVUzoPFQVW6vPUc8ckqqphVZ5z2arquyq7VcTbaq+gugoI3VYq+ooBzcCe56rGC
LKuupztuTviQrvo+Ie49UlVmoq01V5Gj5+bFmVOXz1L5oqmKgq3Z3gYxeWt7ccXPeaNXNONyY0Ua
x2VXbayrGjnvzM6JGuOI2XZC/TRY8+12/wsg7mNNXt41cj2egvcXPlRG6sjjTPtX51d5zpZzR1EV
xd9S+XFLmZfOaI18/m53zDGi5zmqKjnOY5qipqTmqOe8Nz2mZ4sW5ikbX4+e6uZ669eet1PNEa8z
LuL50qzmqavqeZzPPUVbUc9XVEUWZJOLnOf11fz1FW1dzxVF67c9WRd4/DqTI4lbn2fxLt5d+mij
vDdsya7qsk37Op7Mqz0pFeNUDt4s+7+I8axAxDteM0VzN71zLcnOfr2P8vd0BP1Ix3+PPzRHtIo8
jqKvkkurauqFL0frzFXusoovY+hvbdzvPcW/ccyUxes7C8PUx+xLd37kVREeRebZSZ1dtGMr6eXM
yc5/Z9symLW+zj5qmzM1c083JjRRrHarrsfeVZajPM3MZnVTCMePmMY59X6bmefa7f4XWu5jTV9n
lo7cSPQWoqnKiN1ZHGrPO7V+J3kdSlnNz1ZzXzd+mncU7mGvnNzRXzzG53zIjRc5zVFRzniOaoq6
rjmqOe8MbntMzxYtzFJdtEfPRq5nrr1vPW6moiivMyzxfOlWc1TV9TzPJnnqKtqOer6iKOLMknlz
nPOOr6moq2r+eKoPrtz1ZFQR+HUmR8yPRv1n8xdvKCz+xc0dmNmLuq2Y79nU9xKs9KTLy03d5mG+
7+KPnzEIq/bpeM0R42feuZdpKk8/17n+X2PQR8CHiMe/d1NREe0ijznqyr5JL3VtX1Eal6P14ZA+
siii951FOHZ/Km+bsjKd1b0okiOTB46u5/Yk+xz+5kVWc0ci82ykzq2oolbbuNyVJ1PtrXonJzvw
J8Oqv581JlTzrnqLObmw9XxeKLtHs07Veq+rH1itVYj+zMcsW6JOZizXvmzm7Opi93z9Y9c5teBI
15ZsWTln7SGyzW8VAe4zdHQx5HMndWRx487LI7NbPVlX1XssLp7z877c3NF1jV6Z43LQ1XNXfPz1
c8oqJqOrqCo7zjeVUxijioIlkdVirIt5qgqV2VBzxxdb5ojYZnquVJ91FVioq6g53dziT2dnUwAB
///////////0KgAlkgAAAGXvKOsR//////////////////////+KqxVTOraAzNOPdX9karcV3HFl
CbIz9Zi7s1T154j0FTlAegyruehiMmY8bPFOUBrPfPHV3Y/PV2aoUbrFrJl3dV6qn9V+q3HVlW3Q
c73UXHdV6qn9V+q3HVlWnqp3Qc5ozR9qqcVU4urU6KizRfLyTeJF9Gdn6xPavV+0MV9Olmo51meu
na5ih3NbjnTTEx2oe+9Pos74jtKPmqHmTEd2ezzBlvc0/Yj6vMtSUT8q+rbji3h/lxSmmGdXRO9T
w0u0k0zUMyPJyfNjizoa81N7mldxXmqlXFhqPt0mLt0eyeXuWKORR9DHsxzOZVH0Rza0bO2p5zG9
a1Kahk6KejM+nY0ce7Wt7tGnVJj7pncbifiiTq10PTpHkW7o6Odc0Z0V9rodE9SaZpvccxMOfnH2
oe+RGtbT0u93eGiZsOo+1HMPpMbySNeVfFuPoY3p0uh/mj3el2Niedp7U9qh0aSaZphdI9z3ZYY9
x7W76TfSpUqeR9ztW35FFHVzUzrLPPO5jW9dM6qWU7w9RUUESi5sNz9aG6DU5onK5ztfS8mtn7Lo
qON+6naNztqrc7Nb6ZUR486anLzzw8WHolj0jrtGe+aKr4j+aZ+lBdRFUnqyramh1UVFBh+e+agd
+cxjVXKuvt07LXftnuZbvt3Vt72pnYudM6OLw7iozdLfOY+1u9mZ4+q5rdTU+4fJ7T5u1+Z073Hz
Kpix36fM5qut6npjztKlFvFUmVntd6COqweqxvy70fU410uevt2ky+5lMLyXMPvbu1vfpkjYbZzz
rVqIz2ZLw9vsFG+1s1no7eRLD3ceZtzVRFE2aos+3zm8s1Wc9zi1c1fTv7mPceKoai588PdQveez
XNbR79WbjffW+j8w3SL8FF0oLiq8+VGc9TN86xTnN0mpe3l2a8uXLvZvX5269Mi1F2e+h3FR2Y9m
eXUxFJ5RTS7krvM5lO57bUe5KP16qKE3dJ44pelFZ6nmzT8yp85832vztuJqp7x1djqT7Wubo715
fbs4qWUz7VKeIUHPz4ZnznOtVWairO9TQRWu2TGTOaidHOZN0lDcxfSc6eO1Hl5Ry5tu+mu16txX
Ma7tHnMuYqw1861NT2dOl+5vuo6h88UfNc5MGVmqLo7yey5rFnvfcai6dI+a853UWt5s89NXzrXu
b79LzpHzc8SjqGrmDXOY1Zqs570pJyzxxc1A+3TeG5+a5zLmLZ91c+cyiqJy+9TF1ZXtqhGk6DUS
ZrbP+Ub7nMk9pz3h7i1Q5Uc1uO+iwKPt5paZs25423mXb81qrN+9MuZ6PWSNurObWdDqo3n28s1X
Gjis0xOqcupmMvgR0zM50+1Hnx1dq46CrKsqs+zHMeOr8uq4c9BaSlzpjiec+NdjI08s0uuuY2ri
zni8Zray8WXvauhmn1Nl7lijWuhj2Y5ml7mKza10NnZZqe1MbntTUpqG7no87OOPdrXAjZslSx90
zuPUsT8UVRHV14tu7inHnmzGot5PZhj9xmRzk89ZnbyMwyaoN7SWJZcUfPfNHfZ23qovEfzt2oO3
nRdOdRGN7vpMvp06Fvcfe76X17Lp50osuh6dJmPKHV3RzroV0ivtc1d9pjJiIy3HMTC1Fk0lfah7
3esVyTiel383M+zO2eP2/YmZ8y3IT0bM10zFqco52cqsTu+3Tsa86t1aZVZVivzKsPUJ0FBQI54k
rne0qvOh3jvKjpRLd6naHtk4d9rSzp37eNaPOLya8U5lpT/TWtvpOXlzDuNRszw1THFkS21wIzDz
EfNzmucmLyansvp0ji5+azTE5lz01edOmWc2aN5QbR6DI6Cq6qjxVEfP7lCjWczfAiOg7nOeoPzx
1fVTGpqFGecWujNl9pFiPiqbRzZLPK+hpjXa+03vUvlxdlZ+3rimHOLodJCYuYjvI7iqy6uPMVUw
y5pX0yNUNBUOrYutBl9Kk3l1ac6u+lD2TwyeWPS79nIpzD3z2turKrlX3zXURLKvPVvPzdqrVBQU
C73Q32lVB0N06ZlQ6Da6TSnp3epw/eiU/2V+Z37auN9L8Smp2ivMUXmH1V8fPkw+ZYvaFxxxuO7N
EdDsaM7oOtVugWVdH3q6SaEWzRWn8HW2qC6qcUFQZ9Zrpo8amKN33mdbV9pFOnaw6ypOa3d6lxHa
NMX27Y1N71288i7Hvp7RrtFMOca8fiV5upWHPG1LVcqv1WDUHbcdXxjzp8Ut9KB9KjdBroprNs83
3l6dnP687W3H0UqosVxWRzqbcVBK3j7xtXj5qg/OfcZr6c2euJVbV/NdXVbserc7fboz4fV4a3mO
XV565ez8vO04le6Kz9M735R+9vU5pPza5/M1rdXdcyrosiiq1VWqrVVM48u47iq6LHH0vnqyouo3
0q+4xqgqphz0Gr56C7joLLzl35DetioiPVY3lXR1F/elA9RNuLnqak/aq1VTzmNHzY8jNeUFVznq
Ksj5r63VYoIzauPOtDOVNq7iCF52qsRVUwii5u2aiupjm6mq4jKq5UmL7mL897FKFH92jHoNm7o/
PQx0ND1oOzz2i7c5qsy0PJN3Muj+ey8ys3Z34nma7a9X359kzUceZ2t52Sk9mdyZ5nt2qWg7P3pL
qfnX7S9N+Uq/HwS5p32+tSS7W25y+fMaKZbzn9afR6+x6+cCFeNTW9Hmd+F375c0vPbl1qVqg6an
s3bod7r7Rnvzy7Xs4n5WaytXpHvz2kU549L74X9vPwXs6sMpxKU3wf10yczWevzEn005NSKjdM9q
XW12e5Yo4o6fuaOSWRb6SrfY9P315QW5zcrb1N63RdNrd+zN6XbvS3Oz6WTm+nvzwkvdLOj/Wny5
I94srd73nSXNEHKTW1nTJid8nd5OSPdFvY3HO8CMfzxI0U766yIG76lRSXet9opV5Tz8hnjfszOG
nJ12pLnt+UctLZfWiavevJmjxTsxfbUyu0nmpUT09zHSZvycUuhR/fVUKzdneknma7dNqd+0f2Qy
jj6Ybtbzsu3dSezPaTvjN7dqloOz10+aop1zlL03uVe+CXNO+3jySd3nm24nOXz5jaKYd5z561vo
9fY9fPMs2NTW9RzPbzd+6uaXnp5da1LaoOmp7N26He6+40Z788Pa9nE/KzWe16R789SnJh6X3wv6
fNL2dWGU4kjUY/rpk4bWavzEn005NSZp0z2pem12e6WLn5o6fvFHJK1vpKt9j08ffXlBcbnNy230
m9bounZdj+zMd9F2oKW52iS6499PfnhJe6WdH/RCXLkj7YsrUF9s6y5og534u2Z0yYnfNTu83I90
Xbf8KPW+BGP55mG5p310mSm761nu5d632ilXnXU/IZmtzkzOZEp27Uzc9vtMUczJhPsy4V705ibk
xTs0fvrzO0j1Klp9pjo62K/Nbzem99Y1h7O207qv1EfMd9sugSZzVZk1QGzslnSJd+7qBivsRw5z
8+s54+zI0HbTcjjw+uk5fR5zxH5qDt0VWJHPFi6eHTuK6fXa6C30+3jOelN1mVQYj9DGvn52uftl
1XKmPmjY1upoL56uvD81Bz1MdBzx+TijPTO54yOfKCr6r9Xo2oozv0j2oMzFV9o0UeZH2dB2fQ+V
MfNeHNlBdW9Zo91Z2jnSscVQ4roHHdXI+UGZUpWa1Q4o6DL08oDa3HfSooFQGyM+uZa3HfSooFQT
RsqyM56afNaquVXKI09jjXS+8+S7GIJmR2rzzvb6rLdDrU5vvMdkfMNOizZ0tPL60J+nXo5nXSef
fso2fE57ToKDUlBQ0O05yg2taW+nTptzG+udddTvU5nScZ4reHb3MLXnfr21iu3fbonQO8xWFra1
r3zJaDea6SbmOiw5rPFna9TpphULoJOlDvrOPvb3vo6DtrUxnXrWx9u05rpOY7PmYLcwtdZe9BQ5
drtMPqtXj3el06dHvp7rqfzdBmaeu0nTJiKz4eJ71MW++8eHvsrkO9dXfNkRrPzOpXMePTIzlDa7
dCRnQdujoLnNzm8oJ43R9mtevc4npTG+hunsvWgfpriZ3zZUR8/ZR9KCpdX5G+vRrOyi06Ds5p+3
dCuk4eYfTuNtanNp9rLaRuse+rZlq02bLT6PpfbrvHaN2ttLo9PtnW3MWqA91YqE8cfW6mcnGl38
NmdbuhOfdC4sZQ9EpyfyhfbvMPpqdbqJiOaWdNqYnNlttrO2aatZOLKHpOds7aPIfpothvGrT7K+
mdNW+2u966LsZY7SfbV4+j7Ptb7S93sjnY988dx81XUEdqozrV1X9efvMXu4uzNNbygbzp29xFje
67Po57TmKBaa7X1Xd6NOZj6uLN+HaM7XTOzued+9d4jSc/WYbV50oOkwz9c7NGTZGIqp7v076NFH
lC6vq+rKnnu4pqScmqBLKDMXft26dKF9n3osug6Ty6efhQduzavOz6X26b13zoZW3aTdrtj7N63r
pffpjdpWjNprs6G++tu7edDbbtJPqn2zo786T5mzR0KV2m6Hp1Nh6CoVBhufpQGvDZ5EySWUDfuU
KenueoNuYnOzmKHWuxGnaI97tqnVfzfdkrfah7GcxIl2oGczSoYko7nMPTrpd9uz1vXbv064kRKv
2g58znoDo8cRuc9nyrfFQH1EZtrWPmcUZ+mZads293a7Gzt2pJO3R2eNa3rfnfr4rt326LxuQi7z
FfY2mlrXu8313mo9zHTxYc1nimXqdNMdL77jy8eWyK77NffvbelPZOLfWc1FZnevcn7ZlNdaBzzd
9Na7POeow67Ems3fYlFbOt4+nTp01bfXpQkZzpfV67bpZN9pyTem+3bHmC6ic9l5iOIq8oGaR82H
iq8/S6DDWopw9xGy5+oxLn2c8VRHlTG8vfbpuanIjo19OlDM3m5q8zy/fO8zQqfva7R9QW2j+vfr
e3a7Tsxl0M7Hk5rceGOrtJvp23pu7Sb7dNbmdUEXNkeVMcdBzqNYbMqyzHygi6XjuOgquHzKnM3Q
TXPiqXz1czdDUHXodZEZULR+yd61bPrDdOhqHu2+1mP2wyiyrj9jZbzpZn25sq9UNR26Lsagq3T3
Hc76trLvVn6dIt+au5EWZ8MmfoSObnoLqIuaKLmOfp21UmN0oRrnNe88u98x/nfyhSnOniO/KnvQ
2+l2Zem6rtjxdz5dyLnoD1PNVTzn3QUB6rZj80R5Yr7VHSqxzRR3kUeqDWZnmdDpHyKgw1C+x76Y
nffNa3mWc2dt9DdKHu+1zHVREvGtbyeOne+a/aqYOgXaLXTrUxaoedGvN3zbfy/KF0PRbP5Qds7R
9Apg3MCPS6gxua7PhsBzRx3lx9O1Ajn7Wfr26WZtJzWt+ZmG7Wu+vGiUV9M30PtKgPVu6rx8NVYX
rNh4+lBU4Y2Z1fPz3Q85qtjjfPHIZugoOlBbxOejLGmN51dWZ3fbqo48oOa6DVDUqzVZ0t40dKKI
+HvUfbmUZ9dXULmSqypzGquoOri6Zzc1mMYV5jp4V2qduKrDR0FmqLoFkia83Lr1+bzL9+dn000s
9sydkm9vW5j3F7djzpeuteOuphTlMV9ptzivK+kysm5hZbo9FelcZ9Z3JOPK63PXuTo+i7znf3tv
p3N3f3I4j0l/e2+3TXz6l819+cCPhUotCvM9797yt5fT1S0fXptbpZ+/VMOkpDV/Pdbp+vbXecnH
X915PL2di55JJZjfvNdM2pEW6YVZF42VIzlznVzvu5iREenm3tOOj1MCj1HuXyXrhXtT670jpBo2
b90930I9pc986Z212J66dpz3cp+xu04uy32Jbcu+nmen9+dn000jVrNPZ2dTAAH///////////Qq
ACWTAAAAiWK1RhH//////////////////////ydolb2+m9e5no810t9a8evimMnKbzgRTdpxWavr
LKybmFluj0V6aGfTuSceV1uhvcnR9F3nO/vffSgN3f3I4j0lydt9umpPqXzWtlflGVlWhXme977z
EreX09W6Oc69NrdL5fqmHSUhq9f3W6fr2131OPzz3XlCvZ+KpmZJZjb5rprvJFTx9MRV1n2y2nOW
m533cxHIiPSY3tOOXUwPNR7x+e0HbLK9qfVBSOkGjZv3T3fSm7SyZ6upn312J9Onbfivej9jKcXZ
LW+xCXcw5Vvp4mqC1mOOh0uY/O6voMqtVWz5FVfqp03lVmgVVON89VOMqvK8v3tjNnS0/Hj7dD+W
vT82ZVZ7d0YzPad80dXVWo+0XNdDcVVjMfTURC0erueLfPzUuRYc1VOJim56rqqtRRx856r1V45q
DnoHVeqphVbVSfXWptdD4c1TGfpzxc/PnPQKcioLPz8xzxUGUHMucynHzRrKGgzd0Fugum53lXVd
2VS6r1W1jdKuc1nMc3Nlx0CR1TO6nmNVlAe+p+fqegoK9qK1U9s7x82c1BmU2TEXO7NVtWR1CU50
ZuZ2arasjqFQKc6dr3QUFBHQRur/aU/PnM9c+X0i37vNbi56DtHes1NM51kXaos8dSeYb7a6PzPM
y76Iho9AqhrJzO/O2d6iR7R85+aOLr2Mo96NZrjOsTy6BLe8WtLbzV0HMZdqCgtaUWhPW8aMdOPL
138Oc0d5QHNnWI5pimmO2b1X+V+20zeXve8j5ouftGbWprd0GRPDx81x1KxNugWUnTo8Wba5ufqb
tQJfNdtHansNGa7oNRnPdAbFEbrMU2PM7b+Uq3us2a7MbPKS7oL12oOxoulnR8ieYqiOpyraB+9N
RnVA+bL5r17H2irRrubyKkxbmM975HMdO2OPm3zrKCpoarlB0bVWVNXHqearr56irHVZqpxVtXcx
6E7T6G53vfc5qA151ug3fdryg1huyXZR4fua0e13vKA1BeHzv0Szvis9AagvL7z3a8jqKsZo+agV
V687c2ZfS6DF0i30nk0e3QUDNs6zu102+jOeexekH546CgPQJXd52xvveOaw9BZrzrfd5nd9GzUG
Wb2gPjNhu3dJtZUZfM4+azxmdV5qpeuvWOaT11uIpQmvOvRUv3v2rZtm7Rs3nZ4sdBh7rLmVL1zv
5fx5QXQXjmL6d76Lu+6ugy3GiCoLvv0mHvurWke8oKtOegM+3PVTir6qRT6PFz9O/NkZ8r5Hd5QG
5jUZimtKg7cxqG6Xp81Hox6CzUF5l536d22kfMu6A3Y5r750d4lZm+951oDvdAqC8zveKeb6d8u6
DLMj5QZaTPmc3XoZzxzHV3uhjnFVZPlXdqt5uZ0cdvytfej0LcWdDRXbyM1Brmvzq550rrPBXmL2
jGvdohdvmystrXdb9+p9Nuk1fbUxntCkr1zcz7Hmqt5+ue80VVMKtNVTmqnOH7c9+rnnDzW2pxLr
s+Wc7R/Nn1LOaoNdutDQ9LOo87K1zVjrtQUFrXylnreNGOnHh9d9njPXrKgObOpzTEwbeb1S/KXt
hvLuI3S3eiE5Q7zbjdBtHoO1vtfN2r6oH0xKawhFQnoKB0OWbNvdBfbtQUtMzZQXvVqjda1269L3
S7yLn7RxrU04u2Wo5h82rj5zW29Uu30eNZl6OfIj5310VBPH577c3Sq7lBznypw3NHFzxRx1c8NQ
c2PmVBVlq+1BlBQUG8ijffUZzGizu6C1jNPWvDaXXGZHTO35QpGOdX3pKXvhk8Oc14m0fDHy48qp
i8Sq+rLNVcqxdOepvD1WqqZxVXajDVU7ibdVOL71NV+z9ObO0fNVpmbZsDu4o36rjoKCg0rRr1zE
O8Z6G8iyetdIj0ms0zRN1WndV83bLquUHbDZHU3VTp9DVZbqpjz+rpFUZzd753169TRxm3Uc56Cz
VNDHHQc1TcVVvnfeOrKsqpzV+Z16UDioO0fylt6joO8XZ0Ftz1znfak7dsP2oF16KgypliygW6Dy
+jwx3VlRVdq6oqav56vquuoVAqg1Vyre3S6CK6vdAbJi+k5zT0Zpzpl5o712y90FBQRrVmZsvXMQ
j73k9lDkVz19EaI/d0nfE+6mjOyB4oqDp0uqmF0HNnTrQUHfXxJ3G9d+zbnL7raztkfTOde3VcKX
zd6vtW6DKmgjqaDmT6Og6VWLZ8i0nFnbeWYzjw5jXd5EfFQroZzx+bvndHeN5EutBzK8oMs5qvij
UZo3Fzvm6HqXqyGZV3Z1fVTuPV5M4otajqKqYzlBQUEc12qyLtlAuZRvD1c+Y1xmiqKjDXGaLtmZ
VnNG4o7uM8VBnTceOKrqrnWq5VcqtRXhrygqp1z1dH2NV9XRc9BVYz2rFOGiy+vXKrMfPlWqratq
Tn1VYqsVYagjbyW9Cj2KQ1MfU0npr2YnCWX5ojSkKZeSuYyzZR9pTXe6PSlnenTSJSlcoz6pqX0h
MXkw/c1fmUqIatX41dBQddEqzfssh7z7cRpWimOSXFc0ZGlS6bPcufZfiu87Ue/d61R7l7dJ7pW3
rVH50o/vNqgzpRyLWtd6NKclYIXJqj6FK6WvUQpZflb5l+Undpw01NtVplnu9LKYh91rpRlKXetU
fwr2G2lvM7YjcCV4SldBXavJ2gzs/TukzTNt3iImpjqaV6TU5MTkmX49EaUhTKYlcxlmo+0prPtU
empZ3r06JOUrnh9U1L6QmLyYfuavzNIh0tXMNHK0Cygj6Eqzc5LIe8+3EaW8KZczO4rmoiXVG9Wd
NnuXPsvxM587Ufac3vWqPcvbpPdK29ao9dKOTm1QPOtH6o9ZrVBRpblYIXJqj6TBSul09T1KUpfl
bsbWX5Sd8aYIaabRqyd6ivospu9clH9eulHso961R/CvalFrot4fLedzJGV8CXOep0H15d5O0Gd7
17G86M3ZnNedl/OLpeo+ZRUByLj6HmE6rnNQc7yrqDnoObXZ6q+rqvqz2pk6aXXKCOKgznPuhoDd
ta6PI533yZy+3TV9HRGvn12PbzL7bOfbIbMddO1Bl3U5zmzFh+fm7X06UXN3ejdu2UGZLU3296qq
4bmqpwfDnPHkVVMMqKrUbNmc1Bz1dS81VOarBul891dz0Gjnq6q0aPnNF70zpeulVyr6tjoIrquc
4P2Sugq+PKqc1XMqedv6cM3WJVYZn5orsx+lWVdVbu0qrz5+fnoGfnvseI+c93U89xZFQbjqphF0
qp1lVnI5IubpFnbsY1Ad1fGag56WTmoM7GNQHdXxmVVrnjjqu1XTR1FVqKrdUFvJlyzve8ky86OY
oKCLdxPLXNHF86RX0V9KC9vsfpGrl12imH0rp0Gc5+bvzRHKC08ncygoFpK+vS+bo5JYzLp2O8jj
V2nf28oKg0uNmjUfZHFKn0zJ370v5IZ2b4o8vJ1UfbrIPoUUZqCgoJd77xc1xxRSdAq7zLs/P1oJ
q4upuY51S7uor3Z1mz2eTOkXzvJ07drjMfs5qg2I0azujs1RLQc0vR4ZnV9LVLtqgoO2pb6GP81G
rzI1LLqj7SdlHEagoJc6R7ij79zdLCrmoL5+uUEamrj6nMePtrKVXUbOskNvGfFX1azpEOsnffbp
d4KDsjzDjioKi+a6DXTuaq7VdyrFVZijPVYqs1aeq7U7tGO+Y/NqK0p2ROj780vbvHug7Lb+dN0b
+dekVs95LuOgoHb8w/OdxG56reUcxHEc0d85uer4u57d1U0qyq7rKBRts10HPVkWG510ygyr7MZ4
lnTnoHFJVqoO9501LjN3mLN0ijygoImzH5zZfft27muI1zGR0FA4o+mHM6OzYagUfOaoVRVZqs1E
URj9+vbO7ijmYzepTmGjs9R0NFaoObna116G6UmR5ff58+R0HM/dd4utAo9VDoOfKCg9PUtSrqt6
tK8s09lBQRxa7nvDmb69LSs1yyG6dZzI7xxdgeKgoG+lBkeYbcuRZ8d/bPHt3dmy6rNXm5ueq5zd
MqphiNz2dHoOd/Y6CZMbPho3ztKjOngvosqTrtt2Y9BvmjXY9XS/Zjda8uP7FHQdI4jHyk6Xlms3
T01xxdKDNPdLzmvDXpGs07hk1NXzYapqOapq+q2epu7NhjboD2+bzOq7RRLn3QdHvn3iVHkas/Mf
m6Gyh7UHl5QUGRxd6CI5zNt9+3TreGs3Xp27zGZOXkUdB3dBQN9+r5jqzX06du3eanuuZdWazn6t
uKM5rw3Tr37duvSzXkUeT0xlB0ugoO54jHP2P27dOh4oz5OdZrKCgw8V8z6UFAQqpxz1fVejHPEr
vPlM76ebaqaBI6paDo44qmW3cVvUvTR3vGp1SfTx2OkzoSbzsmalfxRUl0cpscaeUnazbndL79R7
zn5zuOgVVqpNVqjlq6Ln3U5ur6t6UHelS630Wdzyfenrccfa8R1utQUGdlcscV63GagoKDF3iiuM
0Xfde8y7Pz9aCXvcXU0R1aG7qFd3QdJrvvNnZ8xdIn032uYvK67UFBlc7Xc5+fniNfWtPc0Vuovt
Ls3bqtUFBa5jrqpJLVWc0fOfNvO3TWZtxm5r63l5zczi7n+v6k6iOWYoNy4e2l2uWWgiHQ5++a+N
X0VmpboH253nP2+dDq0nR6KPdB2iazDPpfPdzGGivn6VfUR1WO2Xk/VTlrnjqu9jHqp3VTSKrzZH
V1Vmq1zRGuqzSrstni5udxvTjiuNvnwys/SNd0uya6pUHNnOu3eV89HMu7yg6vM5n0oOuUFBF06R
0FB17red+s9NZlBQNt9+vTt26de81PZlBQNt9e/bp2WThqtVZ9arPNzRXQWarDdoqv5+aKPpQX3z
KskMe7MbPVV91XTRKg5zUFVzdQeO3HrIu7oMbj5+aL7FHmux4sxGOZXrJi/q2t0B0dc/Ma6U/Pd1
ZmskoD5Fh8y8ijpbqy6i46u5s5lrcfMrkoI9qrZ2fOqQ7XbKXubLq7EbtlXRVNX2c773VZqphRVU
6qN5V1Tznqv0O0rl5ueOJxxSczTcZj5E3GuizrfVUHPzR1NyPmNUn5qM/NU6n8d75+fnjxR856io
yOKq4+c9RQVfzVWqrFWc1V6zurrPHhjVXzVWarlrOxsMe8lvtlA87N8/NFGaKN60+fD5EYx7StZM
adpdkqDaOj83ObDc1RnbtR4D9jmyq46qYVUzqFtyvnNu9vvzRSRfcT5tOMzcfRdb+9eePOepPJeX
ho4qCpiljNZ6qc1XeaI56jmqyoNe6Sq1z1NTVaqzeUHfslzxuZoHpdez043nOfUSV2jHS7xJdkqD
N0Bs5uY3ajkcj1q1zkMw1VmgPz0Bufd7oz1amd0HazVdr5VdWvYooqnPbjPFFbHyunug5ufmmarl
81LHQR7jqtXGutBFH2Wpigvnq+7nqs5vaCznMfKrEaqY71pVdV3Wdy6svtz6FXb546CgoMGS5mVW
4z1DqtRSKgq/nqtc+bCISJGzWfbx7q7mdB254qKgcbfNU1bUqLdAeq5FyKMaYfrJSPuum96ZTW/w
+fj596UtaTUkkle1eKsnn8ZXS+FMvfavLSUr0QW5j59zt6Q89uk6pbjiO8w2Z7krmVBSdPEyxRpb
175LMTM7uc+VvtJTEPn35SVnc5oLfS3mTkfyY6fheu2/e1L2+1qz6Ze9SSfSCRS5k/kxHvz2OJv2
RX4/Zjeary/XumWXj2pRKQ35p9O+KYvLra1JFqvvKQhOTF+0mnr2d6ThSlrPto67aN06tekE/V7L
J75N23zbPMdF2zceXOGpWtedvFf8Pptq8V1nM6k8TE9nZ1MAAf//////////9CoAJZQAAACHcLoZ
Ef//////////////////////lIml0dZdimt/h8/HyXFSyyakkk1aPilrKN4RNLIiObXwplvvXlpG
3ogtzFL8+x529l81f3qluOKN5hsz007E5lQUnTzGW8aW9PyWYmZ3tOfK32kpiHvnnz78pNO5zQW+
ju56P5NdPwvW+299qXt9rVn0y96kk+kEil3Mxn8mOffj95+Zv2ORH8fscxvNKSX66zSy8e1L/EpD
fmpq+nfFNTFmP5rpJFr3byQhOK/aRaepfaSd6TlLS7fbUa7aN06tMgrnFv5LIpzXvk+YP3b5txzH
RdjOMxrnovLXTfbzD6vpu8PivxzOpPGfprO0xH2PV0bpN2eq4aOzJxVbVkZ9x2HlTVgyoz09XH3f
pjVMUxe2r2tBTDMZUmralmNcy5tW9bjPa1W5nUTVFHJemzLo6mrvNVWaqcRz1WRjtl8+bquc9TU7
06DKrpojx1FxxZQYeoq43PHGaI1BVTOf7d6C3p89BUGqcNFUVYo0e6AydVyp5+egNd1ZQmoIzRHU
TvI8tdc7HqOf21rJoexVWt0FAqvjNQVJ+nOqm+ydBG8MaMxsqFz6j126rpHVcdTV9Vx33oKigNzx
1DqavquO++UFRzUGYpFUVFWmyKq6aOgq7znP2GJOXePLlzpzxGOeM3t36fm5+2JPrfmPnijNnZZ0
vfaO8txuLO+d6C8biR7NFz9ry4/KMdJcXnT4N3l/A9tXbzVm5ojiWa6dqVdu2trFox7qPe3ZfNdN
7o/J2SbnZmzXjxZj1FHzaZjmuzHtHNdnNz82XzYl0XR3lsZOGec3PzXFGbnWa6du3TN3czRPp7Li
6fIzq/m0PHdm9+DDmqe8o6Ja7b65mBH547XbFmvm9qZnd3lrFpx83mWzHsyx6uzc3PYNzdqXF0T6
ZY7aycNnPzGqLj54lg7UcnztnS9zPlE+3Tn5rzLvmOsMd+GPHlRV0faJVdVnNh+eoqsxUB8GLb1f
fIn17CkuMy0Z0muuPOe7EhtTL5nZ325zTiTqebMFfD89BV1TdX89XVZzaqOeq5zGqumx48qzI6u1
UZHzG5x50mMzm79MNQTPbpmWMu+Y6xdl0w/mX4DWbcfNzRzXXobnqPMtZvO2mrNFGc3fr2XS8zMe
1rsa44jHV9uvfMvH0faJ8+ZQc9X8/PU1fV6oO9mjV9uiPhzU1qM19umZ0yPn54sO34ri1l7jW3eZ
8fbn7rpvU5Fujq75V8UVTU1Nfmj+apMtzHx4Pm+lnjiy7+b6dzH63eSa7LLs+dO3y7NFGfrz7618
7K7RpdenSTq+gu6tO2cx9dKCwbsej81q3qLmN8mN9DXEe+frEsoflGbBc0nMH9t3Ma7nXSjWP3sn
uoj2r5/NVB1Zsv0NXGj9e2t0e9Xma3mNG+a7Wo3Jzvrl6zN/AnnbVHu8ykxIHt5zxVG6Cp643mHX
Q0Rj82XUJnygPz5ZlH3y7lP2+5fbHHQGO8jdxG6Gjfpooz5cRr6d+pzd7ztdrLMfp2vItYeOI3fr
fTLvsrvO3Q2G+m79Tmvp3vO12svp2vDmiccVm79N3UUEdDPX17vDRRnzs0Ksjqypi789XI77czvQ
n+ntHg+T85nNWdyXFMN4t6xdJw2b+aPKK/yw8qF02bSkvWpZ2OYUnOd0atyucx+Pz55rnnJxi3tY
+bKOqxVZ5pKsq7Obu8qsHxnaTSiopg5uYxju+xvk4d0HUx+fmnDYaLnPe33V5j1FHFqFmOY9mPas
5ufmy+ZpdEujvLdzhm85ufmNGbnWaXTt26Zu7uFE+3R8/NG7ncuJ9Ol3zI6Zjms04aO43kUbTceJ
XjtxVaqA+GzyIxqSZ9x3vyY+ZXnKTzd885QzGeT7vfkp/PTZGfe+i+fDe/Bp8/fTS6rBL5501zx6
fzXStix0lIvPBv3CDi7ZSV86mOc7yh9WGuKglN23qrcupupaaU81e8qyh71O3Un575qvqZ3cfOef
ePfW8j69tmeLEfKTD507c5j9uc2RniM+yeR6OfMNuj7yWaOLy+d4txc1TU82ljqKnfgTwx44jH69
zmijObv1huzSDn681X9qrlXc8VA1zuz88VTzVfz5h/55szWR1dHzuI1WRc0dX1Jueq71iyTFMW47
N36XnZWl2T7NDpEft05ortnyOOpzFHjxLWG0os546r76x50mUzxR6USZt0XPQrJo8U5fPgzMWZoT
2tTQW9tGVA6OuZS0HPVZqcurqmpqs1ZVuGqKsqwzy+edcdLQ3nbpvbxfUspMP20aOemueSPnNGz6
+448Pp0ueOOTHe+r+zE5epjyYmN6i1n1pa7UFXWnHdVyq7iuOruddcMbsepqaCgp4nfM33yoiu99
ss/Q/fLGY8vcdt3HH17mPnbolavMOu3Zvt0iPzdO3PlxWz5HHFmVOKPHmHPfS46LsPTmMeq4xQVe
a6T3yQe+wuYjftDS313lGhtYddjzU85OfnjdJ5mM9Kc7kjyz4mfnPFVlmdmVq+epq+gurjxYeK6m
rjq6mguNx887nbqc0XdZt0mHx2uh3zc/fRoo8iuOOKNx5lTh+kZ+l9n6ojKoNUVZVtRVtWc/O6RR
c1qqmFVnMfPG1PTXPeWfmSnpoUmS+Zz88dQ+lSvTVb9yPKsvnoJefnq6cjjqv4bDnjqunNdX1WDK
g5qh0XlXUGXUVUzqI3EaqnFVyq/VcqudF4uvRdzHzfPo1XRmPz4JjQ8Y1qvWqpy4riNzVWKiKoiq
v1NV2pqbyOru5rq6p544eJfJPishvy50p7Rnavyk6drx+S+SUlNu5K5pi1qjl92SnJn1OjKIt9Gi
FvHqk0vZ2hcwtd/N7S6acxuYukVpeb89l8121Wvr23X3rpm30nPbvp7l46Sj3cx7757SUc5uYnJj
eaz2jpJjz2k9HRTHl/ULy37uZI7T4FbkNLMS+byScZbyj+S6nde78cj1Ma87dDmvOvavuTVrwsnM
PyYowlMee95hv772x+q3Z81rtrTzdZSqY32vD4prpOedN7y7wj386dum1Zrr+SeFBk7ucRztpUnT
Ox8x+S+SUlNu5K5pi9eS+qWemfZhN0f1faMMgfeO/fNUmlR6n6FvXfxbS6acxuYukVpeb3775rfb
VJdB23rfTpifXWKz309NeXSUe7mPfPaSj3MTkxs2s9o6T2Y89pPddEpjy6NC8O/d+e7T+KSzSzEv
m5mebo2Wo5j2j8o5dTvT3fjkepjp536HivO9B2r7uTHq80WXRzD88mKMJTHntBMNj3tj0rdnzetd
taGdJrPj0pjas0eK5rq5jr23lq897+dO3TeWa6+5JhRSdjTKXSSk5lFV3Tmiw3SrLqH7P9sqaDLi
oJnoqA9zlBnjupyPPEPGLxY89e10Wc0zujndtb0Y2e0Hmu2bSb3Fa+zfTr2E7ugZu8uH7bi3f32g
zPhu5om8qFHcais5zHqXec11XI+eI7NV9Xd+erR8PH1u8fc0XbpV1TQGMbKmPr50+9I9GNHfuVXF
zxny9RxrpZufceVOUFWKJqrrjcaNQ1WOePpV0eGjT540zR1Ed0Bj6fPVciZ8M5FlB2zniyPrlRdy
LKDtnOolVkfW5Mu6mpZnHHZqsUs3udo6N+rfvLTNN0B4nmu04seXh0o73E8vO2Xny69xP34vb6Jt
Oe5zZkcQuKVXvDx51m9u81zbRjd+4y8ua3io/E8i9Y9l6GE4mLW7rqTdyKLDGzrQTcFkZj5Qa1OT
DerxNXmHNgSjOsj+3Rx+YZdsvB6FrN438W7OZuj7Ue/nrMbuJuKxi3RpYn6LXvW4mDdGLy/Vbuvc
WISK7iNmUE2O50hGbrj1Madt4ryzmGRKPFHdHOznhu2XgWx70xrbW7OZ7o6PfZ0fS8szOo8ajifx
qdM9r2rKsqelXWY1XHw1W8ya2l9w2H3Hrtje/h++Zs2bN73yWeuk7fZk3Q5ooumro36arpelBttd
uYxrqsVaaqzVYPhqtuOq7V0dXVXrzDVU4PHj133vvfTTiSP09X2sklkeNeNOZPFrt26myVT23mW+
+Hi86mjtPMtXePIj9fIzXQJ2e8as9RGqs5qjm5jOqwqjPNaRtdOzM/PFF6+jzKOKM3az5vGeKTHb
yP197O14Pb5o6OrG8n3OPXYx6NZbTTy2ryP3qY++5jxXeK8VvMjNffwx+vsR38sZeYhhoO4uZHqK
lGtVbMVY8yg1aXV5uPOzXVWdzwzpma7m6LpqO0c28OlRryjTT0fD9e9mr4naxwsx879c7aR2rQ3O
PAe+kWzO44oqsqKl8z0c5zGXezpVK3UZ2yrrvt03nvW76RMw7WcR86yrI4sPLby/IvM24vJyM19+
pzRR5l2njxXmXcUdm69+kXvkeXHazHl5d5azm6dsjiPivLvMu8x4rs0cXm8nOvcx+0u41l5edHeX
F57HkR9xxRtRx3dm5+d7tHNF0wYfveAy6I2ve21F723MWfca8f3Y7WYfFH5mNrZ/A9+7o6/jkOc6
UdBiqpgc8WGoTsfKM+3LRx1D8SztcUfc/tfzI2+msijajPm9nbXM7vePH56Y2des3MZGY6oNanJh
i8TV5hzZCYUZ1kf26OOYw0q7ZeGowtZvG9L5OnM3RvtRj568uj6dHjVxPrGc6oIzRHoL8NJl5aj5
8zU31u8ZY3fTo6NUeWfrRXEa7t5HOTNVjdIt5aP0vom/cE3E0s7q1l7c1LcTo7xyZ8uvcVHRr6aQ
HFq6M8Tif25H903Fl5FHnPdVMN7URzZQSmRluq5fNNVbVYqsc1t60zGPFZrx2EfO8aM87b3dc+eO
eesP2eexx77M2GV5Ed0as0suUTijo9e537WGZXjTy8ijnPI4su8vMuOLycijvMvLqIqPmq2qxZ1V
0VBlxnVBz9aBxRPmTlmb53zTdWVb2Pi5+tWnPVtW1fz1OWla8fZR4d3jZ/Lt2jq+jo8+9NmmNTq3
08iuLzV2jXrd1Gk96bPs2jOKLNbiO+kW5RJzzEPrlXjuOo6H1R9KmOpiiMY1HVnNVvNVeqpxFVd5
6tNmKo1erMe8oFrCR3iPvZ+2snn9u+3uRudMdbd4+7XZp+RHw56Cgq+giNh6Cq8ap1HUc3lRFnzF
mN81Vzn5sbmpU0rnPbxWujXmdm4o8O3eHdm7x+Hu0c117T6byj6TBvG8ndb6eI8UXPd1Bzs10cmX
Vd3Hh6DvmxenZsdBrDo1Hm+x6TTu83HdQa0zppT0SygyjxGvojVWasqsVbHVdjPU89BVzur6rpue
qnNX847b743Z4o+z7djmu/Y+90d+Xs5ns9e1Zph+ZPdvcczOxc57t7UqPE7s9XUGdqCKJHzdXVdR
7SWRm1VtWWvKqcnvI+bPNTFBQduiiqyk6qM55npcVVyr4+aKd6ZFz9rdXZeczifftnNzs1Viq5HP
fVHz5ayg6G7Z61ePnbk1HhtXnkZ6g9QK4995mqM1HrJnD4dZQUEdBQGPEbdQ6B80e/fKSt55oZeJ
yySbo/cvGmQo9TE7fQzvLXRdF3kbnXevOzRrxoMEL9UWoT3S+66TGe37tOS82uldUfYbchV5O2KN
yTlta+Jp0cR5Zl+qU+rN8913kaf4J/Uu4nN3IvXqY+Xj96beX2LEXMrS2W13zsT6JX/H1CZrZcvl
52y8aLbFzqa7fnOdMvsve0nRUcy9yKc2y22zHMnLJuj9yzNMhvTmJ++hnc7lro10XdSNdnO3rxNG
vGgxu5xXFrpPdHbXRZ6f3bTkV5J7tdEqPtEL234VeO2NpyTl2tfE06OKPUy/VKfVm+et5I3j/BP6
l3U5u5F69THxfD499N3kXanT9Ws2T2dnUwAB///////////0KgAllQAAAPKJ6KER////////////
//////////+1QZnYt1UatLUyqTLl8vHl5eN7BTJmumrRac6ZaXb3sPeiWpn5TvtMpq5Xc5Ef1N82
Y6soHfS/MNLZ+0TjMarFGs5zYkYj55rpOe9v6969/coRK471zqavR08jj6AzWK+i7UEdXdOgztEb
oarLwrl69MbtkzbPH0Zmc1BU1cznZ6CK3RuO6DIz7O+ZN4mldV19OmnzbyhM1NRdKuOo9Kgu+luo
Ns6ivqfmQq6rXzUHMqHUcW+yvnPHt1cfUaZuuR2hcXNF0qyKZ0Y2td46nm5qFG5iJ9PvHU83NQ+I
y5rt527c/SToeOp56Dro+ea9UXXr2V69zfp77S3JneS95r7nvvRPW6DXSwtWJwH+Ye7Xc/i79rme
nTMo5d7iPLJu/lm7Z0PEdZnhpTGOeM8y7mPbnVg8k0z+xLU737dVEc2+1zc/mH0kukvt3LcZxrd3
mazMNimfJjyX3et68v+vm4l1c6ezXrsfdbsjeSyZ3kMfemeO370UxcvvtAlrxyeRxSb127ztmvpn
TtP7Waw8Rukz7dy6jGZe80fMzFNzPiUx5u+3YrvOktui2Zy9++0PZaJ4bd89qoqyfjNzbgvEbyX4
f08knvrCnukwec9Usixe9PVK3NRZcV76R8073oN0B+vU3mLsY/NVvP0s2Hqsnqervzcz4PZD43Ob
eGPMOUZ7PzO/ntpLt2vU772Obc10127TpzTr7TaeZR+zu7mDH7a6du07H2Mf2bXTau8jWzPIsi7d
85qDprvqbd5e2p+ZzoOkmWs1Lre8vM123to0tFlE6Pc5uhuZ2rkmPBMeS4Fk9l+dPU9Z1oJox5n3
ou01uUx+nT1NT/Txuamc896b7HNMb6dPUpjE3i1Pz9dJ5u30mL7dXQTJnVj2b3fO0ovfJPUmxHjP
u/KLaS7Z6c1znvlF0+sGm0YHc10nexzTPlE+3abTvJ3blmjH6TTzDzfZrLzc6c3mM5ups7HPQZ2i
NVlXOf8mdKZM9zltzNrVGMS28wRNS++Tg9fXr7afTzzSU5rfaa6bMf3p2nU2p/o1jmpn3yj97a30
Oaa7Lp2nUvbN0n03lG90fvbp7MzRj9Hned96dGY8/0aaTo/faPHNTJzTXbfTtr3fU5p2h6bo6N3G
fpO+9Pfe2tn91eLsbpGZduddLoOfvFfsRkc7ivxOcUxMduh5+5xY35Oa8ntGuin3be9ubHm/6Nk8
OfKnOd5zPKl1EUa1c32ToFMprt1zM7ePaNnZu916yd4vZlyDTP75O9+/VRXvs5ufzD6xS+u5bjON
bu8zVHMZmZi7THm/Zxb15tvt27lVj3vwXd6UvP7m76xK/HM4laaztOXuZ/KXeav1VOa8u+vbrmLp
zrL+9Va69pWZ3qePut28MrkzvJi3r75az3pMe0Gd9dBq897dXOxktPDL0/QGzVAZazyM8aq5zvao
qsc2HoIu/agoOm5VvTlvWpcy9TyfxC3O+Zjau5X7fsxrbydcjmNPoac050ZqSZ1v1TBpOiyVLs9X
7707a326ezqTdHR++9um9dO076k3JLUipoO/P2oD0EVBQ3GLw1VznypNQ3c5d3EfrQLO9mvv2mrN
HQWds+sba+5m93jXa56PF0Fp5juZ6G8t2ks5w3EuvPzZdEj9mz1ZzxmdRGufq976a6O3iXQ28Nrp
Ho1AqvjzLNqgNzxxuXI9ay1afN67vGoqOV2ppamHjb3fmjYfesPVznHiNuLDZkfPzzHNlQjRRZzx
tvs+eZMsd3cdB0Zuuj9zdJenTpQXcpUjjnUty5n3e7ztjU9ep6djXTMtO8x3M30NMX7ttWp33WLz
D5itqrozVHPicer9eveZ2LUX21NamH0tzt+ZYdmNcR1Mo15H3c7QdM5uaPnj+NauPqqhbUusyWly
56e1anY1gbzHLdzN+t7U7m/c1hxlmzn1OZV3PU0Hf7tXzZ0t9ebvj31oUyqOd9o6jw/MkeJO7jSm
IsXZmPUROix0HS1uayKO8Ebvunz9ObRjWjpVJnPVZnaowURjHPg2DJrD+dpzmj5+bmzm5o3dBUPI
sn+kM1vx+TWk+y1tWyWunkmz1leGPS6+J7wYzT3gvZFezM716dvdPpR/CkU49TvYjb74Ry2VvF6O
vQ+rKdO3aYnNa3R0dH7ujo5dee+amsnM1bWvmp29Td+LJdre6U67EbvKLJrV9mymneauc3LbeuuX
3mr3e718ZI5q5co/Fnb3KXG9SkvNzKlnZ3Jlb11mFRzvSu9znPcmm7nN2pZn8HqTcx38S7TuNWpN
mrrCtjRD3T0l40tSblO0FO4/XLOTMPJzfjmJrSfb4um8tv7ro5Nn3l4Y9Lr4m8Is094Q2RV7m316
dvejUnwo4px6nexG3QZGRNd1ut4vYdeiR9X86du0xvWt0dHR+7o9y68981NZOZrpbUvTWp29Td+L
Lnpd5M73s+diJ7yiya6Xfa2U07GaPa3KdvVAozH7zV7Ps/T5ZI5q5fb8Rh2nDUuW9SlPO0ypVvJl
b11msmKMhO9flzi92ue45nTZ32tfZn8C71MTO7mO9+Jdp3Ly1JszruyMm9Se9HpWvLeZqRS0Ubyu
t4/Xucbcxno7b3mdN2z9D7ji5+bmqsdLzO9BlDhqvyO9fKDq/q79Z6l52Y3NaVTVmVY5hUfXe0qB
1E9H03u4zNVKi1Qc/Ne+z28oHlBd1fZo6BXQK7EToaHfPU9lHuh04ouaPeRm5+aL009dzy79qDa5
zWddrj60GLv0IGVDzxbodKIZUVDuZ3H5nc3XKN5QGvrvnVSu0WzurrtdFQ6oDHzdBe0rOe313Z6D
RsygXf01noNGzKDF3TvO9DQnoanMXuosVtd/Lu+2rem/d7vq+nc9SpgombWtvfqu+/dB5tLtR0c7
lvEZKh0pwhQvw3qfdugepzTRszm3W3Od++prygy9mc5vLfimvdJNKYnLzO/bq9zg83ST1jmc5O0a
vMk0ru6HQnE2aVy93652c6M2XU5tVtzy12o6DM3OOzLPEtepUPqU5ioJrt23nk4PfVSXzTw5rc48
vWlQS7qbfbDrm7x7083OTr7uocx5m7nNO+vTMu86ZKpjxHaeqDt1+9jp4ouehuMxo6hn2tRKJPT6
Db9O8dt2Lms1OKcC15p9s306Z33lq+6U5jvEr72su1NTkwasdrVW8/bmqJdUOiioR7oGXZLOynNb
5/EJhbvKE6Xi1OdGnd0CjePvvHdrJhvd413fbWTAnnnRPmi7G11jXNRTmG7TnmPb67xSn6b7dNrV
6VzmUNzC972joPv8oaEb3m+2l1h072k7nFiV331Mih1k5eKg7Wmdds+ChuKtz3zWbV9e0dvPnneM
oO2n2GvZ28ntTk5nTc0121YoV3d41cxlvH3zU9l28mHa74nXy3cxivHbxzHdW5zdD506PHrXfaur
s53V9Wc0k1rrJQTU03aoTaktqztaE5JHMbW5zspI9q8kbzJ7rebV+sdvfN9t9m7ygOo2rPHz8xjR
1F9b87vL5uahW87Y8vKXNbzskmtfXOb7ds91ue79/KDL3m8t+LXukmpiYnLzO/bq9zk6FSXzNTkw
UTQnOinPOnX2YV7fuZhuveedL2mNZq7vHuNE9zk137zS6Tk700l4uk6fRLpFpdfKG9Xavvqd3OSt
0N71OTGt6up6dZe3nXxB9uehOeKhbxni2aO853QKYzKnmqItLfbcwQqOvUhpohPX5i839ue1727T
ND0e9Z5UihU7PKZw/Tp1vLvMtO8aqOeJ1Dji5z9aDKuP1275sjKNeVaoss97Pqq1FV8Rp7n1mH1O
bmMnCm116888Unnfu5rLWfZyh6aHaekmMbr5ORn2ZVY4u7M1Q6Ubt3HUH6I29HzMV5j8WkGubtcw
bOa6syp595zZUUNRVlSaKYPtS3qVyVHXq9dPXpEPM1PrY89ntb79pqZGtbmsug6UJllCUwpNKOVL
T26XU9i5tTh9swaNjM93qM2Jc927j1vNc97yYveTGpicRRdevOp6eKFHfuTU9d3inPtCug7amZ6Y
0sjyhceq7SoVnffaLa6PZjSS7V66N9V09c0snaRb89e+4mntzV8yzaXPvb5rtrn6VbFs7yhfNzxc
zmNkM0QmKNTnP2dR16TymllzxDwXdDPdu0xM6dDHludjvIjR0Bl1q7mOc/t3rUWWue++k44ue5rd
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
8ibOd3zR9rMecqbqI7mDZd27iMnFVlW2epvKrEb5quj54+sXbWsiy+j8leK2bPusq2oedZOarN+V
OYt826tjjqCu8iZ4rZ87ZZrZqufPMTkWUDqtRYozRc/Sq46iY54mo6DKBRxG0KjnqH0qtCgNfOaq
xd8/ao5juq+09ZpO02fI5hmNeZtvLvsfLvmzsY0ZjxRzlRHMXlBjijPzX2w5jmqeacmI9GPkVA4j
x4eK+arvBl5QRZcZ+apqJyMxzH2ZR3QVL7RR83bpKa8OY5j67XlVlZ3dTErw9V2N1CyRd6moMDqr
ObN9PNHV824qi3Vjaay89qzKr8edquzN0HtRnN3yo8MZXIzdYvHQZVdQVV/QxsyZ05iPnV5dVmrK
qc1Xebnt1Uxq3mquYqjDUDq/MqyKruZbNls044rypnE8549xvD21MTlGumZe8vory8WS2a7NFmmj
rpZ6Odo1fk5revKiWQ93jztfl5ki3iuznHbLw6d3J0+Uc5b6LIjZkZjyNW6iWodapixVbHdBULMu
6jrM9BlyZC9xGo7uci1eXQX5qYM71Hhr91Gbtl5drGry7y+wqebD+Nq8uSgvBzZdzFVjdX1WarSm
I7qsDmFWVPPQVUyP45Kvq6pqak0ZzdJzGMj1e8Rl8is87E1H723FiKWbHGeLmOc+Gj6vLeXmd2jp
ZkayzHNHEfLw5jmPFjq7MuOM0XQyqGosiquXU9efIr5ufZ1VtV2oq6o6mvnqJp5z1XsyrtazWGG8
S7CP6j52iu7zmzFfNHEaNVZUPnq9RtVbVitR9Oardc3Oc1V2KJXVYWfIn79aec6it3dmq6rsqKu5
o9ReVPOerD6T96Hvb07CiyKdiPF0s3PH7MZeVoXeRHijyKLPnbKmfkO+Y+c/NlVOMuzx89xi7jOa
YNm6COLyjykWprd4zbxNLsI8P2uKNXa5nfnueRxM+XVaFXHjzNmoR1Guh9bKW2os5jxW+c0eKF5z
9NGZ7ZjGj5uaOLtHUZV1mPFzGOnMJ2b4sSiP7MK7vyKO4NKrj1ffNQdate8qLq6rzxVNW1OueqmE
a61FW6qcCq6e2soO2LK63Z9uo3F2uo3V1WLKg/NU2btqOKo6c+H56rV1FXVMSqdGq/m58qJzKkzq
Ofd50vnmMXRJ0NCqi+1TfOfnoMmMq8w5jXFZj1Xe0ZruNVJzYO07u2bfZLMi7HUz7dld3dd/KQ7L
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
9asOysLH4jd6+5m67dIPsNDdisNyz3nla5lPXmdJh1nrUwESmJj2c15MQmOm/danLfTyY9BatXKl
StbW/BugI68nMrudMhYZU9aYrWJ5zgxTFjRrma60QbpBrexW35PVq93MrWdJhuc0FuYITHWWYnPO
yeodPZjU538stMCtX2PtcrWK734KBZ75qY3v2XpLM9pBnT1m12fRePKHvnWg3D3T7KYWp5bj8Xll
fGd1q32spgrqYddJbz1IiNTk5sqve316cJyucTmLtk0bmjOehoaCiuUx6E2bWdL69sEwsra7Ra8X
Z2z77VkW0PYZ8+zk59b3HdfYcnZPsmplaea+N+70pHvsuycyse3pY9zrWlFe4r7vbvx60pnzedpz
p5XGr0pweTia+eo/bVfBMUkg22pZOgdevNKvXY2lnRwY6dk12mGwtOda82t19eBa099K+5gNqdah
809p16wrhHGo+l30RuZXWu90FfffXn3xVn091SJdK3bXac6RbDreTnz7m88cPhVV/PqGqTfEfbXr
7TmLTh7D4963p+fKRduzHtfwpWvT3retglt9kNBIZ0ja87c1BzmYKalYkzys7zJhPftsFZjxzvvm
Kd9W9b8aTT7TDa052ZT98S3revE1InvpuY9nJ1OZTT6La3rzT89Ui6dplOddrS3rfifqkb8XZ9mn
OeqYb0h5089c4nMTBTs9zwkTTmFOeKey8jffXPV2a7UfrfZketHWki8+7rb3WC9a3bz5Xg/tcew9
rCvlZEhutoTDl0mVKD0TAWq3V6ac5yaYkUPkKwi63uruwc72xNmObdfpcxWndb9vd3cmtj5vxzWZ
2riWe88r3Mp68zok09amApythKYmCU5ryYsOY6b91qclx9PJj0elSpWtrdcboNrGPd+C0+nno3L2
mF56/nTzyaIfK3ixUq97Lt5SBYI3toPu86V2Uk7Vvo7XX+3qk7dH0rbHTYPWc6YUleu2vvStMBqw
9155zjWnBzFsareV1ohWhWhsGlCEfLy9r2dk8o9FLKXcPN83Ol7e+l9M7PYoMPvZ83fiZhMdtetT
0uG+jxamJzWb9Hr8zF7J22pa3r+zBq/vScykrtS6rryc3OTX1Ov2GdNyNOZnWmvPU5Gmp2ZTT98m
JygoclG786RGS8cfQ01l3V24t++ivF02aO9c2K+84uaPKCJUL2ZOt0830mpn6cW5ic0Pe3tb7WHl
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
n8pX7fac5hOszTu96123XlvFf2Hyjbfqx/L6S2QKUeum8Yc59nPkjV/NSnb+Xaw+GzFzRY47oqiL
n5/I92txq6jdD01211E57ElJs+eS523qgk8w/SVqYoKumPefXPGvTbq6rk5czmNHz5z3jztvIt4e
3Fk1kVxxPnP5FjWdO3bmZqDrU3lS9RoUG+ddeZuNDtQRRGurKDwM56m0egMZmHlQZG3HznObUWGv
cfOc5tGizMEaljjix34jaSaQx52XboumdNKNPo8Mx6N6nJy9OcauTLDWeH0vND2UzB96zPMSdpvG
sNnbO3RdNhdMgbc5aT+WtLPEtejWSmYPreZ5k4kZzlpNM+G1nZdIeYhMT15edN+538jcVxx7y49b
eL48zebHT3eunYe7qw85EfrEqCg77j5oupouY3NEj1flmvcxnt9G8nd78effBrycnLztrsa80PVl
vtl63rzL0k9LnO0eKdlnfNZd4rNrVqXzr7nbpvTHmG829OY1edN9O2aO/fJHnTeX07aPnbabzfNb
ouroKBTmGo8mNeH7N/Z3tp0YalW9eCZY321rteaQay9dlehpJi889js2sfa7vZ6ujiBpyY2LcazW
t9NLfng6b6a7Xh9+SN5eX02Y689cjy7zR3Zj67ZvyR3jy+m+nbWX0vJzNdOnTmoI/bOujjm+zG5h
ePyclUq1vG99hrY1gW/MhsN+4qCONH9j6GpefwTdH6D6o+3RtZbN279ugzpZ96zPEnlrWNZmds1v
oum10weTE9e3mj5p60dC157tamfd86Gr86DS887Oj+seDea3p4a9rE9aXkqa1nS5Jgd5TzUnULxm
115hUuPnU/k7HMbme2rxmW3epzeN68epw5rzoY9Fz9J244ubtknObnOj8yVmkmarC8oFU0F893QU
EV4F8Wm9GvXZaUZ/emc0Zkz3Ifb7Xt658ayo3r3iZ1P3sxnFfY1njqaA1myKo3J590PPdfKPDPfq
SzWpiTUiblvodN5Fzn5zc9CubJrne0jdZjes1vaUq+Lsbo3q8vFrspNRXZqQW1kWd+XeWT74N+e6
o/mG9UN56zM1maE6kbfag54rOero10fPz50jWz9uhmtalyW8trchrpLdxdHzRG5lT2dnUwAB////
///////0KgAlmAAAAORjuEMR//////////////////////9A86zl7z6uvQ0xHQeNLKm4molUHffO
aRurr79s5jNZMUDb5qDGlaUvdx0F9MyKoyoqLmKMc2KKo1zbyzR3QbuzxaoLMHEfbHfrSGy5GrGr
Nlj7tqY6SP77K0lMKj+/PPnw8PNNalxyI5vs59exRzB1OyTBmLc/JudOrTale/FrG5ixNdNSdt4p
0T0xNOf9n5v2emphzU/77NzExMT1nl3LbT0Jh+ye/WpjW/njQ0JeSkkcmtDbh0tShDewpU14lMTk
xPTHvs97k1J9kdddPXg1rL155Lq0pgb7TO4e96A2HmWr91qzZex9nNtTXTx/fZbSUwnt+fEcVoea
azUuORRxfZz6+w8mjqfmZhoW5/pJudOrTdpJ7r5tax25jya6ak7bxTonlNOfm/Z+b9oZqac1577N
qYmJ6zvc7btNa+zT9mfftqY1v548GtSw80pJmZcmtfezGtdLa2J3L8rb3sZKrWeJTE5NT0177Q+5
NeSOtIununm/ejP215OeTu9XnqmNb7XM7hLu5J6z+u78uhtmvmNMG0fTquX0ygobo+1Rvtt9B6DR
Ue1E3MLTeVKWl0oTwr1FHuh2qC0pyzGePy6F3UZnow1v3n73vpSDKGKaHMZx9sNMc3NR95iavmMZ
Ax6F86u+f3WNc0dCsi7Pm59c6PHzc3NhnzdOhmbVCr71NFEKAGu7j7ndjp1jqxPvzGFXX06x1Yn3
j5jHBootTXjuJwXRZCc2Frxe56tDKzGl6l7t9q85l5E5Axnmrk96BCR1rzoN6Y8mNa2uwlrpezl3
Meyy6vTN0euWx36dPdej3M891OP18q06GGk68nvjPrtsbr+vGs83qc2ug8UtdYpixpeyp71qcy3k
Rm2NDeu/vTXo7LH45fX74J1+ucv1SLxyta7A+/XnSti8cF756hg+TFHivpsa8Oj84d6003DJel62
H0nA5d26+IHk5qNtxx88iPH2nIj2ztafRZrNfTZIre5hXO+TmwmPIY1re3617ptPN70/X6HtVPtD
aupj9wfV6w3p3MUfnoxnuRjY9CR880vaRsS40PNNp73rPMfi0rT1veNp+Cos28PVlDE4541jXmw/
FOZ2tO5HKq3u/fJ6Hu9esevTT1uYr377ptG55g8WwbKmMxu8S25we6ujzovs0fz3t6/PJwe6l8ze
9bzzGn5pJ4096Eu9vLXi0mmrabbeZ5401pJ2t+je9eKXzz618k0rvN70Pc7Rm3edMmRYmHuTJhzj
lmPd6hoLHOicbs0VnVrdSaLfXpni8Xlty+g6ll9HsxlH7Z9cti+/TXuqPM891OPyE6GHakk98cwf
XbY3B54k/HyWD3fj88SZvKzPvcEJem75h52eKTK9zm1MeJNY9QXu0+08605l5FjDZh2ns25x1KuK
JR5PcxrNHDS95LyDkbRjJzAQ2PFft+zHo6BhJrfVuGrze02mse9tJp0Pho8ieTiMepN0ZrR+KY++
0djnuITCj5qiLftWroeB/AzGE8kFy6aG53Bzc95EbBl1F8+qHfezPFfvEvMjuPEm/r1azIjc50ZG
5JQYezKsFtZbtIMLT8+NI3u4/ebfnY+GoOmdDJ2Ls0Yd2+6YlBzw98fhjeUMEgmDIdBr2YHm53Xx
6rd14+gi33q3ucJBvsZVkFu/h1FhgbG+0b0Y5/Dx4Y19bgfl728Nvkq0jCMJh78gtd6z7a7MH79u
ajqY1Ge8amI5i1i6C989Qs+Cg8XuL35u9p5LmZfvg7eWnvoc9zVT157iXQ0xOKI21Zzya6Rm26Pp
fTpnsdBl80Xh7RuaK3cwFLzc4fTV61F1V2ljMssfE5V4/WErtXnZ2vJXqXet61uj+jYNZjzr9TVd
/Z3fza9hre9eaQyjXjHl+zgmB20m9L375vXsxucXtDQ0O6FTkxv7559hNL0dn4JrwehC/gSHTQ10
91BJ22tetu5R5rNJ6+zmn7LoanO2tfZiR9tCc7THgaDe6Ojna8lbe9V7E5MSTmh4GuW4a8knPo0x
ljcx25RRmxrDj4m0ntvAss+Xjd5569Tvol83retbo9DYMc0afqarujnd62vYa3tvSrZRrx6HlqcE
wm02l7983r2Yc5v2hoaHftCpyY398Ex9hNKcSfgmvB6ELpAkgtDp06e6CTvzq3mtetu9Ieazonr7
Oae/Zeg1k4O2unvsx7bHbQnO8x4Hgb7ac7qu6283pWJwbmPJzXg++B7D7aHmpjz57OfF9+dLWMe7
mO2/nKg663et9ndG/aDH2VBnM+e8NYY3zHygRo1tnu7Gl269rP2P2P0XQ3Ra5tZrmdAh4eamroOu
9b6b2ju0c9igO9G0j259PRs+tzFtGoc25FOpzlBfxdIku2ZnWgWa1pXrKDS277edY+agNQbm9eDN
96B6NE5Rm+9A80Z9sx611hvfY/LeDa1r75vT7ahI3BDa7/dzCk1DO3Qe7hhvNNuqDWx7r6Nb6PIN
IfMGxvebWvB9G9a7SNiRsSjXE12389h91rDb6eZBLeDHuenPkNB9p7Ere96bHsxv7revO2xLr3fU
Wvoy/nfMw01l96C4qD2LeulBK7U7q/vTENyazpD2Dcg1pqCg5BLI3rX0JCWG3y3i0D9L0hg3tjQ1
0lHi0HLuQZ06Y/gPxNfIMSa6Wt7lEickFoNSS/At7cgWs2tQdFQX8tOJNe9Nq92rnKDNrtfZdlLB
sa0th7etO8Nraeu1B1muj1vJZ3cnTW+07uG5V7DcExINJCSErcsskskJBvbSUNByQlkHkq3tcRQQ
kDEsglklka3triSQlEsmwhLIJZO0va81qKLtbFig7LtbetZDT7Nh6CxGQuIR4+nTspya7bQk3vrr
526P7rtvWuyHksg1xdD3Wvuu/R5BpDBuGDfnvzsL+jos3Ow7dxg7UHRb3cPo6PwTt483p7193r3e
hI0Nh769IXKa2OkXZ5NWjdJqZWK7103oaYXQdhqFoLcOnrGu7Goew3nTUHJJL8EoShJCWSWTiJDU
nEW5VfbvZksoLoLuPDdqDZtm6vfe0bpJc522Np4PgWhm1GFQJ5dAnH1oFvtQXfZK5DJ51lzpQdsf
fO7PeRxR7a7N66DTHSH2whJv16kndPnvQksS9FugBuij5uji5mNhxXL2oLVElLxKANic7a1DaYXb
B8gh0gug2p+G86X0sah0H2xJv1TuXaNGbF0WHjXS+mtPDNjtrpodGgx2zkhtDp8Gs6430eZZrnjt
dgzaNQJWjUEkduPdB7e773QuoW99t9OzkoOnQXox8zLx6zSU4bvFvr1oRppTlGN6mew5770HfqlQ
dlfdIJqclo/V5Oyw157DoKOb9c7RwuR3OGb89Ely7Vm98ko5mX2ZnfJGxLJ2kbNoPW4XjeuWao12
Hi1iNu4aNfZ2cS+zglG/Ld2bfs4Gh5vszb7CSVCxsP7fl6a2btyUokT5NyyeBDaanJaP3xNSw175
09zcOgo5v216JRp3OWZ9pj3Sv2XaOb3z2WZnVOTM75I2JdZ07SbbN0G2LWthS28es+wsbz5qjXcT
C3rEY0e8uGjX2dnE77OCUb9du7Nv2cDtDzrv6OzN27QknV2HtjWw6O/L01rW/po+93yT1I0huDnN
tLfg+qZDcV1Iq700Y5prLqsxZFdxR5bcxHnPOPOy3uIyqup1ZFED3pVHQRznTnGuho6t3ZxNc87d
W6bj3kVxBWc8dXZVcNnR1Cy8qKl0HTvdA/fb6vM6Pe9OK8v07vIzRDLoN9Nmi5+vnbvVyturGeO/
V0Nl9ee6l93vI8XSgnHvI8U50zM6dHg9zMC6LfYTA15nS+29e7FzjyGTnuH8eBwvL8G+VDfQetZ6
+0x2mNdO3g8GQnPD63yYzwXDKHpD2Yz33MDmO3TfYeC1maSGax0CWPN77Tl2H52mMt+eNBnfN2v3
DbURzxxXEHVtTdjo/Rr1eZsKx5pDqrbaseD30JNq4eeoJuhiVmTweeb6QSGO3vms3Jvb9XsF62H6
mEx69sON1A6zk5Fd1MxceavoLfTXh3nRa3ViHib3mm9m9ggkm9YEEk3CLfVGfvNmDPLmMvwe75Z4
gvQ/WG0oe+e+ehtr3z1sN+pDxD3b98WxQT0XRPeVI3BVZ5DPBbUNQ8eW4a9CZzqLv0WHjEfOeK7z
LQ1nvQev3PdiY3Ma6Dfg8FrNdH76Nzg6drteJHzo6rlwtb7Zrzll6QsbxYLGG6Sa6TEUXO3i7c+G
oMRui2ze7h6H0t2Hm+XVYMV6Ft++evz1+xxLojGvfSM1Q4zVWPIxVxpjDdpzyrHmdvVKPDYPGpi/
LPkxza58yKL0+c8Ub786UxaDXYRdo6ndnWub26DO85cd8nDuOjeg835QPt00veacPFU83mS3E3Uq
h1EZx78Neut5E5peqXwemjvxrV2PfNWpyI/nYOHcdL088fk4n6sTeeZlXX07W9qTb8h57A1phq8G
ubpQ8/Z+ZOJZjNZzZ40bDRr3cxOZzGjnlOUHSLHesPzn6c0bifY2d+a3zns2T3Ttttug76MbI3lW
XHNcjjIz3nnvompzHseBjUHpPpvV9fQxsP0ILJKFb10ydxC7yce30egnviehIetM5moo4lGbejuY
WTGP0edMHoWe93lBaRqCgoL654Ftw1vdBlBQXQYhvXehSGt71MeDY3p6h0acPdtYg4ehw12SeuU5
72Xo7Lek9d6DlQUFB1Wx7d5qz8tje4bV4biabdw0hucx71OQ98g5wa2HpPotLrMehjsH6MYXuSUM
0FvXTeTuTCB76ZOXt9HoJ74mvEh60zmaijiUZt6O9LJjHOOYHXPPfVnvd5QWsoKCgvqbzAtuGt7o
MPQUF0GILp3ocUj1vpvWpjYet9H0h1acPezxDHC5wOGuyV9OJOCc7KcbyY3pPp3oOVBQUHVbHtq8
6WcL3ibGtDfg2rsz68l7pu/Gr5aoKDv400sx4bA7GVfo9uczvi0vY88i9fmvAe3Vo7c4qKk28Gmt
huHr8D7Ys6OB9h9Bd6QzPe+tZV7iQxR82nmpg+o4+bm89oDZ37iayeoOfOaguM7DXT3obmY1NKK4
z+d1jBsNuJVWe+a5u/NQNWOk8a5xuNLmNVuO8Y5/MucjvbXNU3OR3trm69Eunuo+bIpywt2hiD7b
6eheejzxb7PXbNe7GtTE5p7hfEt8sggoNqx7YQ7w6dkO24JL0eepe6Y2GxYfYPpy89h4/Nq/Rthd
oKHYbuHqWDziP1e3p8t+93tTnvaC8ht3eog8XNUJ3B76aUNjt0Gwu2hqcW7UMP2YxKejS10oOTdp
Z0GBNZ68tODCHaY5a1xNDXE0O3Jxd+mo7sO235rxw97e+C+Lv18TXaGxrOKuJd9H5xNVQ+Q3qF8c
+dcZ7DvL5JQ3xGcbGxizah0CSaa8DQ2GPRrj3y0qpOzwY9d+yUb7anBuYUxroGF65iDDG9Q1vyG+
WuP4N8bwa4m+Xg82N9tjYS5rWxfYzYSWBckEoewTcHywLMCsPlabSq86oNWkzZvLwMa7DNcvd736
HMP2YDaHonk3y10XFSXsNepe+dn6PXinPdckFuc9HbBtWrQ5x1fEe+SDu4MOwodGh56LVuHkH5sZ
Db1DtnkJycqzE0Fq+zicWXHQPMTx5nuBctziHvZ+dnB56PRMQ988ChrFoaHa5jWgzoNPMNh7Ru59
HNzdr95mDN51Bnzxu7iMJjlpB8lfRTA6COg8GbiwY6DMTtJwjSugM+RrS0jVd2cwYVWO3ObxYY85
nLc5YbDGew5+jG152YuJGSiOdn1GcLmQs6t3OJ5ymPeL0QWuwatPZ2dTAAFAEAAAAAAAAPQqACWZ
AAAAsNpCHBH///////+x//////////////Ow6KY95ZkWZa4rnLg1DwJ47cbNcEDMZ2XowMTHuQYS
S7B9vGx0mPcheN9Kl2KDDXmbvH6n72fSgygfTlt0HNgy4b7dKCq6vBo2IIdpiaimJ48U50P1zBeX
j6RNLt359b3uI+Yre8dWaa1p9prIn0jPh8OulrrcLxDSHTQeO1fquC3q57UPFrEOmbtN9N68bmtY
HvxjegtQ307Leu2k1MTkw8nN9O2nb6IILOM/WvdjwYeI+QnDmjMeKMxt+8SI5o4jmjt6T6BDbFoL
1DY3B+BjzYSvNsMNoL0ZY82opiOKMMZfmMKYv0MKFpBjy85PBvzTaG4XiGkOnQaeN2rHrSUM2NXP
dAvFrEOmt2m/em+ibmtYGvGN6C6DXbptb120nkxPTV5Pb6dtO30wII3Hc49rU5seDDxHyE4c3OY/
NGY2/Rv0RHNz8xzR29NPqENti0EPUNjcH4GPNhZZt78aew8agvRljy/Om8UUxz80aYy/FjCmL9wN
7Wt8rxBjPLCnBribTwbWm0PBFHBm1qJ294zKgP2F1cMNzi4Vc48dBlTQRYFncbGwzPsLhHCz2Kua
10DyoqB06UCfNz0FB3dVyIVZ15+fVAaMX0qKkHyq6egNHt5mVblBUdtdqu6UDGVZUrtq6CgMKrVT
kXR9xQGCqzL3oH70HegPp2ePaugNQWePaugMLu6BOg6crCUHsILLDh032sa2qoXDUI1uDuGoYExt
6SXGeghGhsXxtcTHuDyG+2Pr1u3nTFQQXYMdB2vb3vWoO0IrtRQ0DiK+Z7szO9ayxrehoPVUDj6m
hvEFencMS3BauGlFivQwO+g3xNw6bGNQvltcmN8R8aMIzBu1Rj1C9wShrWtwZz32iHY8ZoXxtBQ0
NctaGt70NdlmRJ3eoroO7zWxodob5b5a0LHRbuDuG9QwJh3l607CHTYY3fYIdRriahqGuy0kGE2H
uCCgtXsXiY5ug79N5fPdBveoJaWaGdtsWhu+TwJXyS68+YdKxEagd9M30BmjHqYrzXVYbpDUFrai
5z40ItLurw/QWH257XSPIzNAwt44mfe09cRiwtjKvggm+vUJdOt9Brv0jYq8VB864NOPib6DtxFm
+ju1ZrNGcPk7htmxnGC+g1kT7jsrNodhsbQQd52jzLRmriB8wR30xp5HQUFRgXPEftljUbzvuK+l
0DV4F0Z8WRPb6C4RdHl9Isq6Go+fnadvGO2ol264GO3Q/TtpPXZtweY0ENct9N8fY3giGGO+zu20
+V4NckhYQfJPp27dE3oaHR8XoobGnrY1uGhvi71DeuShEHbyCGxsYE+nTXF3De7Chvfa8CG0t6xi
3sZg7YFyXG0xrtDsNcs2NOG4b1qC1DYMO3U/XtpPSdug5XmNBDXLfTfH2EMEQMd92hZ3t2nyvHrk
sWrCDTDCfTt26K3mhodHxeihsaetjW4aG+LvUN6CChzB28gg1tOGBPr01xdw3sXpQ2N9ryCG+ize
sau9w7YFyXH0x07Q7DQ1C0wnDcN61yWnDYMLyOPIryw0d8wu8MuWWKrKeKHPA1RUGFjI+Zq8XFuG
A1jEEcxooYcRiOPOa6uQ5hfNlVk1WQq64O7HNhhdvlHCq1mCO6rr5udnjscz5kIuSjF1bV91XOeP
nPagcHHNlVniHB4c2XmcSIZELQzi4G8DfExrEuShdUGcr5Yg4POOoZx2Mb4ucrgoPOKoWHBpR3fP
zrIWFCxkMGB8lyawZkIjo9pMVcGguS4yqhXFV2HjhnJ8RWwgwnDGFb474+GEcMPgvip2+TcHxI7M
uSGGML4zziLk0GqoXVWLqgcHxG+O+KsWVA5wgeJ1RZCzRcwMKueQQYUHDOJYxBuDzjJhwQSCheQU
eQwPkgm8DhguGGyGcxlz4OfksDcFyYXJOqR8fHyMMWDOfnHOLyxZ+VsWapEYMMyCfEUcTTuJc4iW
QPgbCEeRxhDKnMFiohUA4t8VLlV6gqoLfNyPd5xb4iaTfHUGscEDn46hgVTU88cLNCpYTXHfNDMh
zDArPmc3HZ1YjY5ojoOChcQsWuV8syK7gg7B74jCFn4tVyIzXOIqrjvkaxYbDUMwO+Sd4e+JjQTs
LBFyVoKqBDGZWbiLIZYfJBXh+K+TT4ihjy8tXlpq8dUMZlVBkGMCtcZ8mEuI8DGWg+IlfJcnxb41
wXFx3h74mXagnYWCLkrQXJ8ZDLNlmDQWQyw+SCswPxnyeB8ZQePLNavLTV46oYzLjviYwxiVqDgu
Tgxi4rwMHQcL5Yr5Lk+Pi4iqgsOGQH9kW6lIhj0SEa4Qj8Sr06nt1r6OvSe3X3eB7IrOviy29fDN
9D3Ge3vN6nh6Nry98nxekz398nr6SzOwm9yuOOYG4Wbx7iNGb8q7OPdfDN93cG8k7dxV5vxK8In4
GnPmTwRmdJlnSHfCWJPDvpIW2RIeZvgg9y1GX8DXnzJ5szpMs6Q77wk8O+khbZsPM3zfC/Pbek8L
4Os+J4PweHrPC+Du/E8X4BjgwAIcmsA4PmQhp9D4HZ8D4HxPgfcTpD4FOynZjyaezT2cmkE+ED8A
J/T0w7Ap5PM9ns+J7YegOyAejyw/U+AH7NPAH9gdBfDDgpyD5E6YeROpD09ie0A5LOlOyzsTw+og
fA5fB8jVcKICAgcow0WDHIkwT7iVAB7MILFEg3mfIiJQEIafd+R2BTEFCkE0BEhSFAwQbA6McIVH
DSOgpQAARQgB0cMSBYqa9kOwBDk+p8DydnaAAoqmoUSqBTwB2N6YB5IAnYHR6PgdAeAnkAOigcKg
AgHo+Ynb6IV6KcEMOlPKFBiCQAmNEBNKCCUCAJCFK0iIYcAFhANOSIBAAx7AQU4PBwIn5IAo46e3
XCGiwwgmsiACY87gHkj2IsIKkKeEA8n9E0TyXA5lIYAAeXyfESDRw7ETlRERCYcNBXww6VWiCGMF
omgoPxPRD0fBD0czEKQgAZPBgiR0wwBMBtAA8ChoEU0BfgfI07PofJ5eVKcmAYbeRCJhovQC1Xsg
3AnD0QkCwOgUwpy6fCZgQ04mnImn4PCnSyGHBCgejVIprwByUXRI4Yww9tA00phBfg+34HJWHQHk
+JDss5AQcBQAHwhBJDOjsgAgEAQCr2M6O57K8g+1eTX2ByDXweROzDgwRGdC1AwIaaUh0J5Pqdnl
+Z5PgQ9ngpTwJhCnRDkgIQAA5KIgohaQiOnkAPAHwQ8HBTTk7OH+GPVD2dGComCJ4W5iYsggB8X/
mH1OxNYAnJAaQhpCxA4PkQ+hDl9Gn1MNA6AANEhCFq4LTJoHAnZT4nhDyf08z0cHwE18kB/B7PmU
/p4OD9lA+h4NPAnL7ejD6H2PiJ7fgeQPifA+x83k0ypy/sXwDRPiLnm+b5vK15a8teIw9n4jp9TM
V7VseWvQiB9Yj5zqw4Icp2dkfrHt6flnOImEE5FhZF7g9no+8zDaia6cC9c8+4p7fofU6Cjxzod3
yBHycU8lmeRU5FTkVPgci8H3SIdkOej8nxXVeuaT9if6gnwPoU/B8yngHycCd+b5vm0i15a8teIw
9n4j4MxXtWx5a9CJ95nkLzYcicp2dkfrHt6Uh3nOJyKnhhZF7geD6zMNqJrh8Tt6559xH2/Q+p0H
HHOh3fIEfrTDy55FQNFTkVA9HIvyiHs56PyfFdV4Dnn0e6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAYiGSFmFuGWGWGWGGGSGGGWGOGeHGGeGeGeGCHWGSGSGWGGGyGeGeH
GHiGaG6FuGKGOHqGKHCGWFuHaGSFyGWGeGOFyGSGeGWHqGiFuGOFqFuGeGeHeHiFqHGGKGWG+FuG
SGmGKGOFuGOFyGOHeGGGOG6HKG6GiHiGOGyHGGGGOGyGOHGHGHqGeFyGSFuHGFuGOGyG6GKGOGaF
2GCHaGWGeG2FyGaGOFyHGGGGWGaGyGGHOGGFuGOF+GGGSFmFuGSHGFuGeFyGKGeFuGeGCG2FyHCF
6GMGwzwvQ1w9QxwzQxw2wyQzwzwxw2Q5QyQ0QuQxwuQzwuQ3w4wuw7w3w2QxQyQzwzQxwxw2wtQu
Qzw3w5Qxwzwxw0QyQtwxwwQywyQuQ7QtwtwxwyQuw4wtQtw4w2Q0www5wuQzwzwzwwQzwwQxwxww
QzQuQ4QzQ1w0QxwxwzwxQzQxwzw4QwwxQ5wuQ2Qxwtw2wuQ5QzwzwxwuQxw4w0QvwxQxwxQswxwx
wzwxwuQtwzw4wyQtw1wzw1w1wvQ7Qvwzw2QrQ0w4wzwyw7Q0Qzw2Qxw1wwwvwzwywzw5w4wzwwQy
QxwwQ7w7QyQ3wxw1w0Q4wzwywzw2Q1wuwxwxw7wtQww4Q4wtw4wtwwQ2QxwtwxwyQzwzwxw7Qxwx
wxwyw4wtwzwwQzwwwyQzw2wzw2QtwxQtw7Quw5Qtwyw4wxwwwuQyQtwxwzw2QxwwwwQtw7wxwvw2
w5w2Qww7Q3QxwwQyQtwvQ4QzQzw5w2Qxwsw9QxwyQzQ7QtwzQvQtw8QzwuQtw5Qzwywtw1w0Q4Q0
QvQsw2QyQzwtw1wzQ1w2w2QyQ7QxwuQuQ2QzwxQtwvgWFyGSGGGiHaGWHIGwxwzw4wyQxQtw0Qxw
2Quw5Qxwzw5wtw4w3wxwuw5Q4wxwzwuQuQyQxw9QwwxQtw7Q1wuQ3wzw2wyw4Q1wxw5QyQ4wyQzw
ywyQywxwxQ0QwwxQuw5QvQzwxw2www3Qzw4wuQxwyQzwww1wzwuQxQuQ5Qywxwxwzw7QtQzw7Q8Q
wwywxwzQxwxQxw7Qxw7QtwxQ0Q2wxQzwzwtwzwxQ8QyQyw1wtwzw3QxwzQtwyQtwxw0QwQzQxw2Q
xwyQzwvwyQ5Q7wxwzw5w5w5wtQyQ5Q5Qsw4w7QzwyQ5w5w2QxQtQ0QuQ0QzQuQtQ5wyQ0Q5Q2Qxw
xwuQzQ7QzwxwywyQ7Q2Q5Q7Q1wxwzw4w4w4wzw4w3wxQyQxwyQ0Quwxwzw5QywwwxwtQxQ0QtQtw
2Q2QtQzw3wxQxwtwxwzw7wvwyQyQ0wywuQxQ7QxQvQ5Qxwtw2w0QyQxwxQtQvw2wxQxQywzQ5wtw
4QtQzwzw5Q0Q5w5Q4Q4wzw4wzwyQww7wuQxwyw8QzwzQ1w4w4wvw4w7QyQxwuwzw3QtwtwzwuQtw
4w4wtwzwyQxwzwzw2Qzwzw2QxwwQyQwQwQwQuQtwtwtwyQ7wuwzQtwzwuQ5QvwuwzQwQ7wtwzwxw
vwtQxQvQxw0Q2QtQ0QzwyQzw2Q4Q7wtw5QzQyw2wtw4Q4Qxw2QywuQvwyQvQvwxQzwzwxwxQ4w5w
5Qzw2QuQ5QvwxQ2QxQwQxwxQzwtQtwzwzwwwtwtQ5wxQzQ8Q7QxQywxwzQ7w7Qxw0Qtwtw3w3w0Q
4QxwxwvQuQ2QvwxQvwswtg2FyG2GOGiGOF+HGGOHGGSGeFmF2F2GaGyFyHaGaGOGKHGHKGeF6GaG
6GOGOF6GOGOGSGOFuGKHKGuHGHeHOHKHaHaHGGeHOHOGyHKHGGuFuGyFqF6GWGaGKGOHaGKFyGOG
iGeFyHGGaGSHeFqHaG6FyFmGKHCG6GGGSGeFuHKGaGGFyGOGyGaGSGeGGGSF+GaFqGOGSGGG+GeF
2GuGeGuHeE9nZ1MAAf//////////9CoAJZoAAAD0u9ILEf//////////////////////c4ZIXYYY
aIYoaIbYYIW4XIa4Z4bIY4ZoXIZ4eoY4W4bIY4d4XYY4coaIdob4Y4Z4d4eIW4d4doc4aIW4a4a4
aQLDPDhDRDPDNC5DHDJDJDjDbDPC5DbDHDNDPC9DlDjC3C1DvDDDdDlDHDJC3DPDlDFC9C3C3DXD
jDtC3DPC1DtC5DxDPDbDPC1C9DJC5DZC5CzDLDHDPDPDlDFDHDHC5DRDFDjC3DZDTDZDbDJDRDbD
fDHDRDPC5DbC9DvDlCzDJDxDfDHDdDDDDC1DPDLDFC7DPDRDDDbDtC5DfDFC5DPDHDPDtDFC9DHD
HDxC5DHDHDJDNC/DHC5C7CzDDDDC7DZDPDnDZDHDPDxDPDPC5DDDFC9DtDRDnDRDFDXCyDYW4YoZ
oXYWoX4doYYYYYYXoY4c4XIXIXIXYW4TQBCfCSCITQfCa8Qkwmg4AAUGgiE6EmE+FUDgUAAgFAKF
GE2E8EgAAQng0AAcEQpAAGAyFQCgeFIAQog0GQog2EkGggAAKE4CAaFEFAMGwngkDAMGQkwogwGA
0HAgGQnAUEAYEAuEkAQoggBwkg4EAYHA0GgMGggAQownAgCgMGgMCQngEEQnAAAA2FGE4GwogEGg
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
kq7XJcpCFyV4WB5yT2dnUwABTRAAAAAAAAD0KgAlnQAAAA/Xs34b//////////////99//+3jygk
HR0dHR0dHR3/10DLGtoUqouvVsIFH3HOfKfN7Ay5I3Hs8i05/I3fQ+8wiSmQvsP/c4tLyym/c6b8
J5om8pRiPczuVnmU82mTz5OQjOR8I9uJU0yc/SZe7/knns4NpsH+SOX15E335P9klzTn5bLeCcZ0
vLctbls5+7RNSny+aMx/Ypy9uuc18tpHN5iXsP7jKZ6SQl8nMkAcnMijfSxuMvT9jnlE7P2w3Of+
T+w9nzc3NfYfmzi05ZTZP2dhJA5onrzUnczo+3If4y+Ul8tjs5ex58nIMnZbNC+ykrbqP5262fLm
XtAnYSdpN/HJ7KVlJ+tNTu9lPWTluWDOlvnI5S5LQlK7zaBuP+jsnmjnBmhOc55NaWvu9yU/nPm5
7Ebbbkcckccjcbbnbh/MsRmSPTZb5S2guQ850mQtzMnd5I/s5XsgNlsjkWNkE//lMSfTZyTsx9zP
clspfNBkZzpOxKef/x2WWX0NZErmxIftmPAJy/sLWUJjhmzQuXheHhxKbIoSF0JjoECYodQyjgFi
XbUkYKocvJRJqCKLhZyFpITG46DbLNygWlSQxaVHHCShKcqFmqlAsWEyjHEIWyQuWLAHupM3P3J8
05c0bTll55S+Xpp3HNyXJzjMIDmcmYrs7jly57qeXNW+tzcwvdFYrvy7mrcllyM/ZeW3JmbhE7nM
Hlpuc/0iQnmj09yfPKXnN5z5m4Ml7B5uTm/hLmSHMkL8uXP8w8919+/yZefk85jQu5i8ybluJj5z
J8mbk5DHOduPTm3XqFCAGypTFi6ls22U+OIAs9M6ZewAXtZ9hfbZXRd7QCpnAVKZJBFcipT2iANe
o9pFOwsrYiKiB19rLF6jtIAWIi2EvY4QRTBmboKzZQsRFpfae0RYTK5YvFU2m2gbK9NNbamxlgFf
bt2V6a27NreybbRD2li1cvTLuxFtm0gQ4WoRbaEANstDEliyJ2bfEGWXz+hczc5aJTk+/kTFMrOc
0Me3CNysjLPLluZWa8sZoTz9Jm5egzmL/9zmzsluXNd+XnsLr80HYS0Z7FDkTx9f68dgjMzUuTkv
OX3Jkv6UtcP3OTzRM+uZclrBz8+hM/NexliTFI9ykNHy9jFCzH4kSvTjrskgEXJsrmIpU0WtsILF
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
xkxTnzxb+YuNxvdvDEaKlHcSQIX3PnIcUhykKgeviDijbKPwm4BaCY7OF0qO7sr3HJXCUEE9pU8l
3VZlqc3Cu6k+SQb0w58myYlKVPP/Gn6CCirT78s/ntDZiCV5b4QE/ooCBAgllLJy7bZdCdKpsKXt
TeRbnHd1SYVLVfY9yi/87zbnHtdhSVnE4djOIqzeFOjIU96moo2yVEpVtG/JNauNrRt815tPaowv
Ut4o3ykOlK1L2qKcmlrk0UeSnUDYrVHXeCqKTS1q1RlS0aiVqNrVqjKlcqNCbYg2QzmpvT22y97k
0Y2b3S+khPWNWjI0SdqGh1tOVpLlVFD5tPKUrnv82vOt1RFEbVRSyneIFYszXd/jk+cbvxUVblQ0
KibVaDVUdJtotjZSbG9Rr7QUvvcpvKIN8qDf57oN6jpUqjoNjepQbGxTOX9QXVm875PdoaJrtVUN
+9GbY1IBtUHKsbEHfnV/BdHjRSlSlTlQQcaaK7R0caXJqfjavRahte7U2P7XVFhvooLzaVEN1F6T
RUHc43IGvjTuMkg7Q+kgX7x+lPuzT+VB1uvahO2uc+NVCj25UHN/tqYqpdXoNkcptVps+ljY2qTy
0HaiaYi5qKtPKfM2nOTYqgaraVZts84MyrqXFaFQNfOSbINO7qtD+tfXOSyVBTlKpm2oFKH8lttu
7v7Y5QAqj2xqHdsHeZajkygsypkFq9bLlTEN1M3pSQU9rqFonQX7Qv1M2p1XydOje7SFJb9kpClL
N+5mVRPh9zvJN4oPU/3qLZB6CW27vHG3eYQK1TSzf9kFQtykkMlJbbDv7b2hqvf1cG+Y2qfJWo6j
aWjvZzbEFqOT6pQtUO7WO9a2DKF8lY3QSk2VBblAGAgqnrZT//27taXbKO8J41Uu8QXitCqaUob9
E2K+JmI2bo2lVW0t+8otuRck21BPect5t3UDTLYpKfMvNVQp1ehum1IKSu9SzU43yHZT5vy/2oT3
l/BUftjVdF/s/UQYOFBb1BV/bo08qb7kqUJ1tahlFxNFs/ZskTv26JSas73kg59/t3nUBSeZJ76C
lPaNJ1soUGvfvW1Ap3elf2ohydNBs7NBvkkFQ1E2IEHeGwHn1Q2Toca1GtAodLn9kFVdpUptFNV6
jOlvCnyYqhZon2re2oh5SQcvelvU47Fu3+oPl2lvUaibvoCkN/l+ykLbKO2UuOtPZ52cqcpij2n1
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
UyVTFQHyouqxnPzUBnVcyJuqnnfnR71V56CqndVOFZqC8ToJOaPm1zc3OaPvUUFDVe5z9OyyqmFV
rIqsqO1VOLqtVWL1UPEaqyZbqKHo46qV6iOgqtmqZg4qvVWTUd0HNV1V6qnWu2VW46r3PdVPKqYV
XaqQqqUqrVX1UhVXqqa99reRVX6jnqptVStVSLz1X46r9VINVP6qaK6rW6qeVU1qpTqpDqpzVTPd
V/V9pjp3qsUF3VTKgqpVqpFqp/VTPtqqnG+kw3p9b7RRVFVuOq0eLIrqtc9VuqnNVODY6g0UVW1d
FVZqs1XamLOeo5nFnfdX5Q1Xueq/Veqp3VTq6tqv1W6qdY6A9TQxZU0BqqQaqeVUzqv0PeYqyq5V
1WVWaAx6uqtY6hVZz1U5qp3U1U5NVSjVSDVT2qmndqq/U88d0HbpRVbVfurKsRjVU0qpRqpBqp8z
UPeqmdVOMqx3dV+gXN0dX1WKqUKr9W9t1UgVWhcVRzH551x1FV89XKqmNVir6rvNVnOfOjZ7qs1Z
Vbqv1WqrioD1bVdHVVZVvWgqKsq/vV6qsVfQKJXVlVigztH0vtFQZdW1W++VWar9VMOaq/HVlVMK
uXMeM13M3HU0GZzx1FRVZqv1fVZiqasqtVeaPpFszncjoMNFUJVW6squGqphzX25qk7VTzx877G5
lVx+6PzVXMqs1FX0Heq7VfqudKhJUOZFnNV9Vw1WVHPlViqkY9VmqxznNEa8Nd3np2+xz3QUGZmd
XVdoD1bVduqzHVYqprR2fmyq9h6rFVOaqdVFqgq/mqphfQ5ryrfIrugPVtVMau5qnmt1WFUO271m
Xz6q3VW1U5qvVb0zmqtVXJxs99KrNRLlWUFxmjqtVXKr9WVU8qxmjq6q3VTDm54qrMUVVzmoKrT1
V1TMGqIqsIK2fzKl1fVfyKrt87qte6zrG7Pz1WKqZZVfVVmq5VaqppVTurqruqqZVXrRqtqvnupj
t88UdVlR1Wasqp5VTOqmVRVTuqmVV+q/VTI6qzNxVWY91U5uqkOq2L5qsqI+efcdRVTiOvV6qplV
Yq+q9zVbUx50dnuq1VtVMKqc1Uwquqgjq2q8Oqqs1WFQVZVlV3vV+VWarj4LrmV1bVZoDdufpe4l
l1WKqYLKrdVOKqY1FVOI6sqpjVyqI4zHvd89TQGyp56sqyq1VTiq5Vaiqatqt1XYo+kXYzncjoMi
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
Qaou9c2VXbicd9rPU1Od8qKs5kufn6KOOZjndIskoz4ZY7idWVcaq7V1V2LO8UyeLpz81D0qDVd3
ijoNpGoKDnXuHqpiY2Vc8vKrHec0Jy/Mq3sbdVMJ7VW1BWoup8m84F0Ebq/r16XVk0qhTFDORHq6
6ig7ZdBz5j56mruY1WVFBFv6HG6B2pd8591o6HI6CrricWR0FWH7dTZOWag7G3zKgyJuPV1F9ndX
UGVd2O+yoKBxVc41Vj9zn5tu6Bc6nNTj7o1BIznM+dqPNU98z789vpUUeXdXfeqXe8NuSz85l5kW
VdUnqKuoNdIuxW6nU1drrkXhqC3QVeutuPpiob5stKgNSdUeqnfW9dObmiWZ3nLWUBo+erTUGzNu
rbeGiqsVYarLeqjKrt8z577XHz1djyoqyoSqefqueOZ5515JmZznwyTvmdW1eaq9V9V2I1BzTLvm
fPzUPSoNV3eKNpI1AsqV7h6qY4bKumDXVZc5rQnL1lVjsbdVMdaq2o6U1WHq7ybMSoOfvqq46DpV
s1lRkxQznMc9XXVlAsP3XObHU1dV1BUGqyrKCLf0PneUDtS9uePfyOhznoD1dfNcWR0FWn7dYsnL
ifY2+ZUGRNx9Luovsz1dQZV3Y77KgoL60EXW6A11DyK4qvdRdXVZ1jiPV2UFRH2q03aZqpjbvrUR
nP1ioM1/FXGvrzOgqtd+sdV/n6ttX2PVbqwxt31oDo1BQXV6qtW+p3lBVTmqxZsioOxz4ag632qv
3Qc1BVTiqx2qvZVTDtVlTVqqu5VTGKgzmPnPlWdsqznqvPnNzLpeqrdVznqL6RmoIreHqvc0d1fV
bzVRVTqqmaq+qxlX2eqmFVyrLiqKnmquVdVioKrVV5UFVNqigyrqqe1X3VYq11Uxqpx056DmqD1b
VcqartV+rKrFVMYo6h1U6qauNHQc91WKqZ0Dupqp4qsqXVtVyq/URVXKrMdVOaCgqphVYyq9dBVT
2qmrqpxzVUzjqsVXKrtTzKoqsH5qrNRVYyq+arTnyq5ztcxzcx4qsqardXboasq6q7kcRvLjqW3Q
VZd86y1Vx46iq1lXrneHjq68qvdKC6rVBdVrn57vmqaqYZQZz1XatqHUVGM+HqpweqnMRsqvnoKu
71fGepqs5Vauqnh6rCyq/E1V8bq+rKrtBznquUFS8PVdiPGaq1zUGYbmNV9BVeNzd7w9VjKCq7Vb
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
Z6A7w3PUxqojqKnnq6Kq26uoM7Gq/njVAuvPQHyrzGyr6rFn69jHPFeGq28qv6NHVayraluoqtVX
aBHiqcx2lV0dViq8apqOY1VyLtVbyq7VYjtXVaVV2yRjmyNHiPlBQKfiqO1Qar6v5qtNkdTc/NGz
qfIzVFT3jdAouagzMqvVWKqYNxRx3QK4+sZ2bFzVU6qajnVW1UzidX1Xz0FVrKsjjwboG3Vsc9hu
uqs56nKmKPm7HqY5y8zrOGqOfKjnmo6B8/N171dVlXRbquVWqsfNVlVyqnNXczPzR1dkdBVTCg3n
U8VXXjuqmNVm6rp1VfzVTVTGgZzmNVxz1WFHQLO9s9RVfqzVxVNRkWR1XqvqtVNq+jypWXHFzqPu
7J1BouY1RFFHnNzUHbKrhtVdV/OqvoC5yHbnqyqzE4qg656tmFVpue6uj2fmWrqbcXaq17U1eMPF
3qphqpqWartVXKmpqux1JqjKjnOep51ViPVnNjoOtXm5uepqKCo61dQVWcugq6zc1RFVTKrKmg5z
1dV1VP6t0u6NHzTVVir6qZ9Y+bnqu1fb0eOgdWVdnRUFV2rL59T1VOYquqphQ0EdT0FV2ooOfmNV
9Vur6iLueNRGoLVVy9XQKgjSqObOlX83Xn71FSagyr6i46qYVft0EdXUEVVOO1Vk99qrlvmqphFF
dXc9V51Uwq2OOq9VcPUUHeOr6rlVOo6qYVWXZ6qeVFVM6mgqKhc1Wc1VNoj7quGoIqrNSaq9rOsV
BV9Vo+VaarndWVXKsKUOR9qtPmo+ar+3Z5UVZlDz5mOgoI6rFXVJ4+tBVkdDUcyoah1fVdq6q1zZ
znxVXcqsRVPPV/MegygUS1HUZVjzGdH5qr5syrIzaiZzRc9Tzqq6Ufaq7zUDq3KqcVXLvUfM6rFn
iqxLnq5ZVTh9uxqrMVVPY6uyp61W3U8/fvVlBzVGVU6qearaDvV1Vy46rRumu91XaCqzVTDnPVx6
mq7Vp6rEVAfnquVWe/Ndaq46CrXQc9RkdBQRT2dnUwAB///////////0KgAlrQAAAIrf/9gR////
///////////////////Vd5+aKKqmvNzc3PQPyg796CKgoKCq9HU1U4qY8oKCo6Jc1AqtoKDKCgq2
gjqvR0FBU1U4qaCK+eKqnNVMaB9IjVU756rHNV2VW+9V3mtc8VVNKrlVMu8dVl3V+qtTOeOq0j1F
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
tZZqPUnruSjo1k45dbU2+aK+b3o80lQayLfSkPqr99o6DpnbtS0lJ5EqP2jfbUlHO4aLdV89BVke
qOJ1dlyvOerVvWs7aRnSUh89qzmqIulu3v7b6Nd+jN0vVWHP0x46DKiPnvt9Ua5u19um7zr0iqtV
Xd5zd35lHuf5zGji3z2dS08R/vakSzwWtK75oqs7tR0Fu6tzbbifSTrdQrOQpVh4uyw0i6dvX5l/
ldnqOhtbj35dx3zdr+305+dG5ou13lBQZj+c1X/MXipjabjoNxu1lxa199s8j1mTjnem8or5orqN
9H7kmkqDejRb6Uh7xRVazVadzFxx5FF1fNNzExOc+LFVTC497oDZVTGod2OdJfd4tzLubyhPbmMO
8W3qjbu8d48PbozWfM698o27PhzmqpwY9n697PdXnob7nuzn+89VOKqYmqplQuq7UVFX1fFG4jO6
Cq/UY/Kr9xx1NV6q5zc1TV1WVNRzVU+q6qzV1TFUVBnVeqyr4zVYfKrFTnNEY8ZtRVFTHVlVPamo
qKioqarsUccSurrNnNUVdU1FVKJ6sqpQq6h72qioqamoPUVYa6moMbmqbqKioqanmqKirampqKiL
Kr1TVTaqmGZdV6rKCoqyqlDnqKsqKir6rlVmqwaomPhqqcHy+aqmPbnyJdcqyqzlQqtuiqzNVWOY
9TdVugzPHVTGLtV8dQ4qvt89Vzueqm9VIOVZflRlQa8s6do6masqyLLy6tqOfM5utVMaqR6qR6rc
Wcx7qv54e6qUDRRZUnqveZVPZ2dTAAH///////////QqACWuAAAAIsu7uhH/////////////////
/////xlXGqY4um7j5l53591fEY9V1urzW4qrX7nqsTly2r5z4c9VypqJzPs9HVe7R3V1Xnt0OOPr
QfnVeq7nqyrHVlWHPzc9V1VdGaqnNTVlWveZlxRH56nyruY57Nz89V7LajqamrsyOhqsVZdDVcu/
Oc6q91U5qu85z1X6rkdBlVyr8q6PyOo6H58up71dVd5snfKub5+c2Hy+dVWak8RvKvquGq51E2c9
VmoiqsRx81VMsvnt3z1U5uoq+q5dW1B48fSq7zR1XLuoqyp58PH27VUwqs1XKrd89Vu4ufmiqs1X
OeoiPFl1ZG9z8VVjnPVvPnOc/P5HU278bPQ9qg989XOKrD1OZVe1z1aufD9H0quVb3qasx875qsn
ua6vPU1U5oUjxd3ElzdEnfY9V1VN1NWHjqt1XVV/qfPVlVur53MVTNVMxVTGoor17V7nFz1KW1mT
1RMeGyq5z89V3dVPaqfc83V1W1bVZqt8/Taw57qvVUwqpierjHquVZVSJVT+LmqvVfzniyq7zTkX
OaqxUnOY0dTEj1Wcmz800eKYtOV1WKvyr6rERs7VFVNKrJ6mN4nlr1qi86HeYazznj0fUftHdrVX
po275jOjbc5U1cZJeZdXNtXVdPG9TnR9r5zZzVX+fMqs1XY7iNdWVXKmo5oqrCdu+ej5qrd1Uwqu
x1aeq5Vciqbi7darjqtVWYqqcVFQe6qczxqtq+pqpvVTmz3VvPV9Vu12is/Nz1caoqKiqweN1Wqq
dRVU9qOnPnarqrlVygUZ6rFV98xj5cVVNMqtVFV+cq7mcb9in6qZ83l0eG9iUyY9VIFqjtZlVmqz
VZzXkUVnzEajd8yiV3u88zxT17WZl2lNVWL2ZWeqxvMnLtLm5j3hqqdZdmMqHM8bbWZhjHPGbmii
d2fM99MY9nN4jmNHz82VKq7KI1V6g56t52rPVTrmdz3NU+PKqYVU4jqppVTI56qZWsVV9m5qqc1U
0M6iou71hqnmqtWa+Y1x3dRUa6OqzVYVW1HPVdsxmaKrrqs1eY3Xvd1HNVTmqmV1U5qplFHLV2Hu
oqD1Ug1E4aoP17n5jVFRd3zVHNUXz1dfWKrMuq7VeOY26+8qze33oj+Z9SUfnNEaWNYaOJnUZjHS
iNcTzdRzHj6VZlRrpaii3ffdBHNmjvceGPUTsnbxZHHm5y/LSt823rn5k8MeV4eSjfR+PTyY9fse
Zd9Y8zURo5yLKsVrXhj0CM2bJDZzVJ5zObz3ph5nM5zzR+daR7i5jmmcy4+0xErU3HUNqruy98Nc
e12qNmP5GY3nbD82XHRYa033oPamcVTOKPddGqNvuz59SyPzmiNLGsi54nQR9jxRHzIjXEZ5Q1ZU
R87yrKM1Wa1ec0VFo9Bugjmzc95uPDHqz3XfxZHHm5x+Wulvm2+fmx5EeV4eSjfUpMPT08Exp+x4
a76xmzURo5yI1Wx5eaaw9A3GbJIsqKk/s5lQPXkcyY1TNHqaC0c/NURxTJsuPfhk1Nx1Zdqp7J+G
u+dZ2yo2aNec5ovO2HdRl3z0RjWm+9BLUziq6cUedeYc5+vapzVmoO2uehcZ1QqhqsI/Ntd76m51
pHqudUuvVUCwzRkfmM+l9G+ydB270FB27rSPFzHa6dDnNznNU1XqA3Nz3dBzXvnPdBEbPM5r1Vck
5o+e6Dv3quVJ31jqvVWIpih7Rba64c8VBQRxUFA+eqmHPz1ZEepq/nqKrFVyolqeZ5Vaq+pNVpkz
m1lBQXU1WqCgPU1fVZw9uM9nznqOeKrasq6q7VZquZVlB0oEepqwxzZV1V2p5qrNX85qtqu1PNVZ
qyKOrqsNQc5qCgjOeqmFWVU4jvO3Y9Rzc1VypqsVYagq26sq+PplVygvs6uURnwS7R0N96qYZEs7
UFXUN9IjdMjjxXVhDn56GoPQRZ27d1U9TVU7oaCp687iRjPXTt2a69dT3kSjoKA0ZjxVdkVXVWaq
auPcdQerKFHSu6r2Z3TyrHGeqwaro+r60HR0Fnqu0Bo6uoHU5V+o6m+1Wxu+uONms9Vyr6rEUdBE
1qrHe1bNU1FVnnqH1VWnoHQUFAbpQGoO56qZ1Uwq+gitZQ0Dxmvo+eTpVcztHcdnq/boO9BNPmRq
rF0FTVTLmjqyzxxqgoJKm6mgUVV6rekdxVWj1WTHUdXnoO9A12aT6c2tTWnzG6z3ZrXaObm+c+3U
1JuftfegoL56B88SPqq8brG6v56qZc2VbVdquZdVqgdxOr6rjqOm6vquG5ucx46qY1X7O6mqmfeg
oKDnoMyPpQYeo7HzvVtT2ocu981zR/I3uOPfS6F9Fo+qBGoD8+Hqsxvt3Mqlu9Zd1WOarqs32Pc9
QVWuegqVFVnrNU0FWPDp9+a6mgoDHyKPKr1Vl1Z20j813Oe1FXRRUF0Kt1EbVC+p6vMnU1F2aq5h
zd6CqnEdRcTxmPV1VmgyMyjursPMHOk0fFU1bFHhzc8Tq/mTOu/eeO3Q48a71Wqr5qrlVMIldAe3
QUCdR3Txqhoej5zm1lnoOroIuyyqw6CY7KI+dG6rVWG2u2UNV2LsbHdWnxG6Kg6buLpjob5kqC+z
6m56uqIqrKeTC51QO6CrrPUVFX5UI8dVuPKqZ1WL6Kqzz1aY/Wz+0BqiqnNVrMoo91XaqYVZFV56
vqso8VVmg6aq24+fMqsZVbj70FV2Opq5VYeqzV7qYqCrKrreaoHU1XzPDvdXUNqhcc5zLvV3P1aN
FEar1HlBQPr2oNd732PQVcdGu8VxVGdOzxdT9u9BHZjVc6CgUcVWxHvDVdVTldndEd9E+negzDY7
NQUFnoKuVDQUEdBQZl3QNUGc0bzL6LFVYPQc1V+rD1Uwto1VO0c1BVcmF17xxTdX1U7u6qZZEkfr
QUC7d6rNVOKqZ1U5qTo2XGfmqpx069ul1aahq47NVnSgqsRR89BQVHfIz1XT3fPzZs3PGerKtjqJ
yY6UW9njoDVJzVfVTDnq/m56tMarDugR6Crqk1QacfNh4zxXnvbdmvvMLbVmnNs6nDdEjmN3z7U5
hlkbs5qDWmn2aoZiT29+urOZnxpTCorS6dqA6MY+VJqPni9s0fPUPtR5kxR5H4ukb6LcV5inI32f
PEul52M1d1127ayamrmMZs79f5cfNeI/u589xxrpQUFBUxt4jTR1rIu1+3ZjXjnTXlvm3aZ8i85r
9q6cn+z0Y8y6Htp0GJ5zHxLmfjNraa03SW5yPDOimXRSUPftbiNk1Mb70XtA6Ka8jlvtuzX3mFv4
8uhNObZ1PRdFQnw1Bn2pw0SzUcbPE6PTafe1QzEm6Q79urKhxrG0pjNXRJdO9BHPmjMfKk2+eL2z
R89WX2o8yYeR+Lpz9uinoryhXO1a54l1s3Y1q7Wdu2smpq5jozGoOtZx815l+qfPqduONKg7qpjb
SNNHxZFu1lnMa8c/FZrcW7TPkXnNftXTnqejHc8teUGK8i2fEqhuVXFrsrzTe1e/bnIzRKaevs3d
El2VvmZsmp2a33ovaB+TXkZ8NnSguoj6Hy+r3z0HX1mvpV2TWLMy7qsVWI6rFAeLn7q8qamK48zp
nbUXNE1dBQVdkRzxG6mZqnp3qu1WqrFBVxz1c6irai6qeHqdVFViKpqdZdX1EdxZFz5l0B8q41zH
NfarauquRVbcfNnNGaPObnVRFz9XVaqbjPd3FUTB8bS5ou9Qaoq+p1Vjugnno6qLPGbKiYPdnd1X
6rNXR9qmYoOaKh6UHTn5+1QbKi4z3ZjWuer75ubmioHdBz1W8XP23QRUFQqmr8upu6mKos3Nais1
1NBq7vyOr4z1bdXuoVBQUFVmpuKrsqPartTVx+9WVPU3SrjRrq2soIojVdHQVX6veUF1XrzpVtTz
1flV2OJHjMc9xqN8xnQWd2qrF1OHquKKKYqcjx9Ksq+qnDVVk1BGeKKO6A5qsjqVVb3VTGKqnV3Q
UEbVX5HUVGM6jyqxzxVdV1VN6tqtxxxn1GnV/Wz88XdXNandVBuZ1FVmLNxRXV6R6CKOpNzc8WRs
95zc9XRXFhj5js8TjugqKmgPFzOOro+aq5NdsVzs1bPQx0B48iq5uq7HuKM0eXFHGoo+vNUZs0xU
c56rVWTc5QdLs9BQKr2vey5mo4s7xVNTHV9V2gq2pqpvQXmLLbqMurDLRmfO0Z41nNcRzVbVcjt1
WrM8obi6ozoKjmNVlBVtVqOJUFBVkWVcdR1bZ77LrdmNzVbVbjqsnw5qtu+bnqypNVa56uoKrMZr
qphQR6ugoLiNHkVRUVHNVe6c9AzOrKDKrj7VXjpOgjNz1W6GqnN3Vf546r/OaoMaOOq9VYoKmrTR
4z80UdRUj8C7xZkVVnM767xUGVbe46qb1UyjqObnjqbPFVqjSoFVx4sN156GoqsVYu3SoNHUVZQV
Caw2d6Cci523z75lU5M3V1Tiqec5ou1rso+3arD81W4bmS1lXVNCbmbq7mqyqzU5PRHjoMoMOqE1
BdQagoOar6v3h+6vmeVbnOzK8uKqzFkeVdfNU1NQqtXOeOzmmOfmMah56rBosqv1W6lc1VzmOfLi
mKOJugqMs3TD1ObVTHz1FWc54qCqxFUniznzDrFHz9umO4lQaygOeKKKKPnq6PqY3cxj9ukdBz5E
lEazdzn63z8575o1FFFFEbubqbnOfnOeI+G5zaNVuUEaqux0NTi54rqvHuqzesy2eOI1C7ec0Z+y
ioZipqKCO8NcanKjMdRzpxVXo4+e6v5jRm8uzGtnwxz1LVR2dTUVbQa56GLnNUVcc9TzZzp1FVio
56uimKCN5EegoDVJrO8UdBHjoZrt2VWdsnVH53urDm2agXnbWdpjmq6OhaUdDhouc1nXWOcod5qZ
O8oaOKgzb8uR944j3QT1tRtX3MmoldBZ+aOgSzfnSI94ePMi54rzeT17oKDD7ePsaoPtdYznug6x
R8+dMiotUHfacu6TpmK7oO/Ptmec2mke87W8R9uLHtUNCpJ3dys+6C194KN6quaoOlEbssMz83Q1
E7i1qzKOgjx0NCu2Vb17ZOqPV1YeOLZlnnbpnZ1FXRrelkdCzG5qmKzyOPdDOZrR7yh85jdk5HQR
xR2p67Ubzpfcyz1RKgs/NGkrNuYNas+ZFzxXm8nr26Cgj3rI77Gqw+0nznPdB1zm5zdMiotUHfaT
1ud3SdC+Zju6DvU79ZryLV4j3l28V93Eag3lDQqTpvtftx63QWvv4tqjqu6oNUWdO3uKgiszPzdI
ncWumRxe3zHYiiw9Xu0aJt2qC+sdXXz3zK+2VX6m7uq1wJW811yOq1l1fH3oI+3Sg7TCqOnSgjHT
sagqD9MjN110599uarp/t15qDr06boKDtU51qaun4qCpyrTOq7HFQc9WmdWHlvmed8idBu+vNoKI
1HQKOgoFvFQGtXVcqxPOluq5VkV4qCPpVlWUCw+UFB1kja7ZzZcdBdBMHuqzH0i7nZqmMxrqKl4q
DKtqphnlRFHU1FSc5jVGXU0FWVdfSZoN81mjjzObtHeOOKLmq43WZoKrMfPEbD5VcqvvO/PlX4qr
MdVk11HNz1fFqq7eG56DIzH57i56A2VbHqpoD3VtW0DoLjbqvHq/mqKuvSMbnypNzG5zaP2qu0B6
CI0e+eKrDx9KvijjqarVBz1B4uerMOa9mqatOjXzVdV1BlWuKrzJVd57UVCUfQ+R1bhqmKPn5nMc
3PQUHOezGJXVlV91b36KpjvGegcy8qpQqpANQTCF8/PU1NWHmqrzqGZKr6CqmVqpwyzHFz5cdVir
98ErquRx1U9nZ1MAAf//////////9CoAJa8AAABh1g+KEf//////////////////////ZqI7eHd5
2s0dVMqtq+gotbiiqp3Va56uNVaXNdV1HZmzbjqyrKjIsNV1Vyqy7qKipdWVX7znqIo7OzTlR1P2
q6+mXZ/HZvZg/aTXdmq7pkUetXcTWOq8cVFTfSj5+ehuavsaLKCqmzi775r56mq4socyKgyq6kjd
euVNWRVL5oonU9z9qCgoOmRc+M8dQZZpvdmiPONYY8Te0qtMuZ815U86qOeIyqvc+uapPVTSMx6B
81Wc0dV2K+lRFlWxR4aKqmNXVWaDNd4otVdQRxR9auq2Oou7qD1F0F5Un7ZG1zx1Xj0DquYLiccd
V2OKrqrB+2RRu+p2o+1BVjM771WqqY2t623HlXUFBQZFVk8qBc8x2qFuKrqs5p2J9996iO6ujiBj
dOvtAbnyr6BRXryz1YqrjuqmFRQONUDjjqtyW6PdFuOI9WVdFHzrnx9qjpQUFVo19Dn7n5usz3iP
HQVcfps1QuZ1czVMVAagj5+1xGqvVJniO7j7R4/aDmiN17de5uerD814u3naOgdSeqxz1bkVBVuX
QOK+Y3aIUNTzxRczqaCgioI8j1QVJqDKirHUnoKCreaoiW7yaWj7oDRY+kXhqirj0HNQUFBH2uKh
1V9QftlT3oDUM093zmw/N07VZ2qKA0T7VXququZUOcoamPrEnRKgNFdnNkfSgoKuvpebN2wxqk1R
fPzu1V5+lxVZ2jqu73lB160FB1dBUXug7UFTVx4oqDt1XTY6UHXdXUEdBE+nXmoEaLfP160HXrQU
G6DfSKgj6UBr71N8xvaBVU/56iLr1qsUNA97qKrFVOKrPXFvmoKDoY656CeygoJnpMc2dpE+ZTHP
Uzpj3a56su7iNFV+Vb71dFH3fNV+6DD1fO3EfKDvQd48PFQc66GVBQLOnPU+c0dAc8/FQc5jTPXK
tNz+UF1N1F3LHVtXVbVdiOcx5HnaM3MW0fOaOM0XSLMNlWdufmdAbw3OfIj9rjNe1PPtkd26B9c0
bypvpGjG79Ob3uvLWTVQ7s3bpmdHNXm297j5j1XD0Uc/F0iSPUxrI7aNHd3iqemUfda9Xsbjiney
t9kezbNH7dBUcxp2gs2bznpjzxsPsPazuozaqebJzo8nPeZxc9BfR1EwegPHQLvHQRdUTo8Ro+ft
9Rp43bsdHuN9e2Gj28ioGvJjKmgd+HWOpP0w8R5HnaPmqH0PaqI4+bpzZhsqztU80boDeRVJzRHn
ey6XzxX2nr75z3dugdBmojVdfSgjRs79Oa9LyO8yhmqh3ZlrLxuaueygvez1B6rlFHPm6VB1h6nI
1kdvec5z7ztU9Mo+616pyN88U+rvvh7NmGj9ugqOY07QXFFvOemobnosPt7Ru6jNqrqjJ7o8nJzm
oObnoL63UeHoD0C56CLpgo0aPnx/cNPRb7HVEe46Cg7KN4oqBryYyrqC2fMdTH0N2oKsVBmqi7zX
e+a+fmmorMc3t82TpxVhz9md736eYM6moHuayru/aqmFWx8/p4jVXarlRV9Vi/Tc91F+1eZ1ZvnP
VZq6qnFVjmPV9V+qzVZugiqs1dVfqs1WY6r/PHVTCqnNV+qzVZjqvx8/XnPlTh7XPFEcnUVFV2r6
Go5+fq+bn25jDXiiycqauq6PnyKpqD1WMqLVSeq1Uo8dAqtvaiqyPKg989xdqsqsVFTV1RU1fV9T
lTUVWsdBHU0FxVZVx6ioPUc9X1FXVWKrNX1OZUx3VlW3HHU1NQfnqOfVDndn5o+bnPzmqs4lzX4r
689Rt1ZFVYugdD256rn41b0i9oajRaLubcXNkRszD1YunY0RqszN53fTmu+fGqrh6squbqLNu6D3
KCJ3kfNzHtR1NBOVbkeVfQ1bVYoKC6BJnqCy789ROVFX+81FfP7V2qirunPFZzXVm0onZ6mr/I06
nOeqxVYq81TUVbdTU2Y9FQUF0Brqzt0Nz2aq5VuXl26sNHV11OR4fniq3mjoOhzc1XurutQeK7xx
x9zs12o8Ts/pqA+ZMg3SO4jmjRj1ESMo6uyXzpvDx89Vu6GLrJzXkR2ar9VB8zn54sq85egdAaLS
7R0KVBzHajxHMznyKLvNVOTWXzUBqnnNHzc13qpqyI1R0vvQVXk46uyoqphUXV2VfVTkEz1JsoOa
ro6rqNl1PNz9rbqy7575qCpnua5zD5NXgoZ5qI1REZHcXNzFi54qG6rh4oz3lA6rBqvZ4xFZ6Hvd
0ESNzHnHZutVrIuaq1E446vjqar9B1qD1bRRO7fTKGq7V5qg90B6A1DV7qar+c12eM9u7qLjOegq
T3VYyOguz1bzx9DVbVTugupP2V67c1TVvNUcyjuqzVYu76zRqDrzZcVV6q6fmq1Rc1VznvKOeVV6
ruY2Hvniq6q8erXz9j1WOe6jVTh7NZmqioVBGsqsVUwjPVTi56qzzRnq/pFVnOck+3c9Xs1XVW8q
+rec3NHdViO6rpzVcaourrq91U+PFHz4ftQRZVymom6BnxRVFBF5lWRZk0bn6RVH4R1Nq3HHVTzD
VdVxrqw2c2UEWRVPPUx1eaKgu3QRVMeuao54+ar6iroqmrqtodz1V00XPEagPc1VYNHFU88dV2Kr
osi56v5sPV7r3dBeexYfWufm5uepvfM6vqzObndXem2aOcurn0iqsK4+eNVW+aq7zVU4q2ov1x26
CqznpyVXdarJ7qpxlRVTDmPVc5qtPVfurutAyT9uro6sqphVTurr9i9s1VlxGNdVOaGq3Vbqv3V1
+xe1WUeKq9zUK5jT1BVZPUXVTCpVBlX1WjRH56Hmi69z3HHVdq+I9XnVRVlVMarHNVYjjiq/nq7n
5nnNV9VOsqsR44znjqpxHFFZzc/PdXc9TVfqsVWeaLmR4+epq6+5qrGR9+lXc9RU1X6rHNV1ViOq
9FHzVWeao52zmVWUE5vq7MtzOjCroqszm58Odn6Tj7aMezSaoaCgOfmfOsNIbmM2rc0fpfPzVFRd
tVdurjRZQx89T0ZnFl7Mar10534ubKDmoDc6Oz75rqUdnelz1E1mVB8ygVuzmi7n9zm1ugqu3lB3
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
tVfJhr27qKA1V3cdVldZnNx1U4i74agPlB3uPao+i5uepnOaOKojoHQUHtC6Cg61EfOegMY9BzVH
SOgzMi7aNlX16rFBnQ9XM7q2Pne6qYxpmygNlBQUFW9zVJ3lTQUFRHz1W6qZVW6rh9qooG2apoDb
6VWKu5qtTfNflX1FVicxVdfPQTHSOKqwa+/WO3Qd/pqqZG8M/bqTTG+aoFDnk5ZqSqmVTVrPOSKe
pOagoKrtV2rKqdVUxoKCkoKCqnNVqk+Rn9oCBroKCqzVTiqmtVPaCgoKCqmtVPX5z1Waqc1U1qp7
VTSqntVMeerrPVaqp7VTSqntVMecTFTVtX1Pmqlvmoed3q9OrrqYqjnoKtq6qxhquPmHqyq7Vh6i
rKrNVyqxVxjnMaq7VTZI9WRTNX1W6qd6mKsquVWe1XYar+apuzHiqpxVYq6ojqs1U45qsqphVTuq
mfPFftV+qmFVObq2qmHNFq2Y9VirqjnquVUwqp3VTOqnEXPFdVMKqd1UzqpxVbqu1WKr+pq8qbzm
q66rF81SapupqzKr1Vuq7fs1dX1B8nTXEaPniijM4qrM1uOSqxHlTVYjq/Pcr48ii7dsqIjn6c3N
1tc5uY89z96vquVXqiozMVVMaQ8UZ6urxxH5jmfPzVZVTG6g0dmq+qnFV2r4z5F7MVZV5816bnr9
KtutHUdc54jVfFrHzeDObnNz3UVZkT6noee6rmVU0qpx4acnqiOrqtjqKDXvaL3tHFfTmJx1WT89
GaoeH5j0a5uz9PZ+3XtFQ83c8dR7FMGdVMj2fLNUM9Xc9VxVXI5jeVdFV2eKgPUUPqVS6rlVm4qv
1zXz1WMuhqyrzRxVWqr9VuKrOvPUd4uvaPXlVw5oqvoOc9BVdqKqcR2d1dkVW1bHkXvPUe1ZOVB/
bjquVDNU80fSiqyeq6oq6oquZMniqu9Lq/UcdTVa9q+YoD83PlH9jqaiojZ2nPRHq2hPVh6v5qDr
VeqsbNdVurTzUV3VYNURx1cquq+jf08waLyJYcc7qv9KCgvm5j0PNVl26CYVWx/D4lcfa9dtqgNH
Vbs3neOpji53zHjoKrmGj7c3e6rhqrferauidVrn5lV6quXkVRnMdVHq9Nz1ZlWZFFU1FXmsuugN
VlTzTlVm7c9VaPVt79Nl2aOgq7tFVcPbMsq41Br2+aq0+eruarFV8R5mqnXObOqmDx89VjOzEstz
MdV2q1VTGJxKc8qZgziKd1VcoMnHkR6qaVU8jquTHtAlUVPntAS9dBz1W3LVTiq3NUFBOeUFBVTu
qzOzFXR2qDI4ubnqTVUxqu1KmLw9Qecqaigiq6rKu56uNz1es7Ti1VciJUZr3UdD0EzHHU5VTFT1
1XJyojZqlKK+0VXVXNzyNQHyqmjq2zRX0qpgerMqefKutK+cc241Q85nVeqtVJ+Za9z2rOarnHV9
TFQVFWJ1XuaJ9+eq3FlAzRVGVqA+zRaju6jBlDVlxRUFmF1U4uJ5MPVV6gctBV1VqPnoI+tBHFVT
SqlOqmFV2kqaTmoJwcxCKKq7VlXqgoKDnqu1Uxqp1VSBQUG9p0EuLKCkoKQ3tB5OLD30XSgoKD2k
oKTygydPkU5UUFW8/PVd5qk3PUTnSKpq6oiqOa870FQ6sq2qxVciq/v0PFcdRzZdVmNzFVPTVWKu
qp9VZOaOqzVeqpjGbn5nmc1xVU8qppVTyqmE17LVlWVWauNzq6rlV2qxVdNdV2rKsyqmNVOamqmE
XPVTSqnlVNKqee3VTw1RHV0fs5Jz1WTm5+aLvzxVU4qppVT2qmlxTXtVPKqYRxmuz1Wefmq5XVcq
ajpH7X52ePoaKc6c9WRVWarNVPqr9WVUwqau5uY+RVXKrlVOaqZVU4qs30iquVW6tjdLz1bVc/iq
5jqpApdVJqrM3zexTG8y06rETqKvyrqrcfNVZurlz3i3h1z1d5IapqOaOpqKr1Wc1XVWeeLnqZjm
cTeXQ1ZMXQRs8fNdVznVDzxdc5qDmitvnoG54651VkVVidRqA9HH1NmHquVfHU1WatjPUVddRGsV
BU1HRRd477YzbRqu5755hZrzKl3zGVA6mrXHVmZzdD81BQeeKpq3mO4vJiN0fWcnI6r/Ux1Q6qsZ
5UbkNGrjq6q1VZquvIqvqs3lV6q5OOo5rznqt1U/qplVbq6qmdXdKDm5zGiq6pjqsVJqrxuc0c9U
mmPavqzNUauhjquRVXN1XML32PqQ9W1ZVTrnqpnVTmqmVVM6qdx0FW1NqrKr/PfPHdDavmVViraq
d1Uzq2r6tqar9VMaDIqGY71WI67qpw6lx8/Q3NOKpq2KqzVaqp/Vfq2qmFXVfUVB85qrtV2qnVVM
6qdVWr6RVXaqY1Zz0FLU1bVd+1XcdVIUmquNVam+b3mmNmitVWYqCrKriq6qmFx1FVq6uVTeZ2w6
qau8Zqmo5o6moqv1ZzVfVa54uerpjmcTauhqyYugjZ+eouq5zqhqebrnNQVHNbvnoLaOuddKs5qr
E7RxUEbj6xZh6rtVznqarVVjnPUVc+aM2UFTUWbqubvHQX2yzbRqv5755jM6TGVLPzGxXU1Wflx1
WMyo6XzUFAmquqsVEbi8mo7zrOTkdVOOpjpaqsm8qNyeGjV89X1W6rVV6zRVXKrR6r9V2cdRzHzn
qt1UoVUyqphV1VNKu6UHNUmiq+p56rNSaq+bnNzupimPavq3JiVR0PPVdiqu7quTmFL7WfpIdVWK
sqp3U1U0qp1VTKqmlVO46CramzKraqcVN88d0Nq+ZVWarFVPKqaVbVcq2pqpxVTKgioZjvVZjruq
nNu0YyMoqmaPFU97iyER/atOfpGlZqDdTfPVtpfFkSqs1fGjJx5VTKq+6qYVU86UGHurryr6iUx5
VEeZqv1WU5Kqc1Uwzr3OY8R860Cs8dQfOtAqDsfR6g2s9vLPm+btF1qamKPueofXnNU1dLc4rOc/
cx+lGeKq0l0Nu6mrOtTVYqsVcahzMMzHNFGc+c1Sfnqyo54zXVlXVd2urbn9LZjnVAu54ufniNGa
6moqKmrannqxruY3WMxj9IqmKotmzFzWzZa69zUEXp44+e7tHNainIo6COq5OHNOc9xdJ2MTnlo+
VXKqaM9HQR/Kt1lpd4qqcOOM9VOYp+rIrPau8OqnO0Xh4svVVMMqxns2495vm55y7TNjXNQUBukV
zzP3x6975fTFU5HU5mRR6dTmHjcxbNUxrXMcyPrDrJhHw3ivVWW6uxVc11je7SeVbl5qI9FQc9mW
nQJM3PurD9ucbygyPmMvDUijkjqybPmHeUERzXUx1XIqCQx6DfTm5jWj1ds2OzUV573MY8WYeIx8
s2t1J7mLXMeOiqcPl326HN2ypNMPm58SZkZVGTF5VYmlHQ6iUdX97ZsSN5Z8keX29ii6X2s0vNzd
ZyrpOdTc/l1c7qKiYqcnFU4Y2KgTy7jOqKpuYjaMabdXnO7XWr7q0xo4jmoI47iUceZjq+N3nt5p
+Gkd3OTHMdTOWnFrrlW1fdrvF6zR4bnNQWroFlBQR5QZfdGPz63tPM5lLVdqztE5x3QUhz1da5sa
zpOnqznqtba5lqqzV2+2nQVUxqvuq1Vfw/Q7+xvD1CcR85nUWg9UHPFFV0dSbnMuzMfmFSbt7FlS
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
ryN83PKpal9qCrVuzY1l3FGY70Y7juq9ZulHhqmo5nrdXUHPrpV6oFQRUFB1ioI6vz3EfDHrUfxU
erR6Q8VVOMw/aVKglNG6g26C9dMiq3FSa6RmPI+k7VnWTn5xejY73ZzP3dHU5rMo5MPznkN1O78N
qgzm680jqLs3TR8PzyRUFXcxzK7nb2lR+RYbGjmiiieNxHoaCIyyK+x+e2ZurJ+h5plx0HbElQdl
QTCkat5SmvVAdfJw1WLm6UfNeR5nOot7tfJm+fIrVoUHePoO2tb3EzNxHzBobenduTp2kNvfbWm+
l32vFbNqq4Y2Rde0Xbt3dX5z0C7I10FH0oIulBGjd9Rc1Tz4a4+hudxVFSdI5ojUHTnyzO+mRxHi
OZKgoPtXxxxcyuO8iPGbnOao68/NQXFG6DMs9xHoKmn1JvxCcjCyk+dNrn889+63SP6kpzLmT/Zb
cj7383cevKPvR/H2W6RXNTjr3NYrTtdmtbKZ0+eLXS/JJDHNJazO11syz0Rqn8LN2OSrkbxKSTL1
2zNX3IZbpOi0v4eMyx992l9p5z35XODqczc6oteL5SKXWT86c/SYWqTKO96ue3Saukoxvv/Hnd8C
O3ePG1RqOkfnrmZOiWbuM0c5bb9FDMzs50lklp6OTcxgnIxk61Jrptc/nnv3t03SP6kqSexzJ6PV
3JdA/na49ePzs9Put1ke6F3XuhxZa7OJa2U6dqPzF0P8kkNGaS1hu11ss9FFU/hZux5ZLxKSTL6d
jYzqYIUJrcnTNL+HjiWPveefaec9+VzwOpw251qLXm/lIpc6Z7OxnU0lIajP209pukl+b7+eUHAj
t3jbVGl5rxTczJ0SzZ44o1bbanJKGZ0ukskrmbNQa+n0xRm1MRLW/gk1uOc53WwXOYKGeCIjO84t
zl3u/kPBpBSbHc/R/PZijvp7UGoO5+jvpneat30y8i7XQc7NdxHzniN55ijug5j89Wc3PHV0Ztug
qD0Bs5+bnoKjPeazRdjmPVx+riqypjoIuc/U5jRd44kqiLmXvPQUHNz0HNzxGNFHFHF3jqb5qsq7
n65QHqzM56hUBzUEXeOpzmjs1+xGUvP5zxUJ8Ns0VSPUtb55qJVXeijztnXKtVAeIwvnNFPRe32H
mSjafz5U1XGzX05jmzpVfObDb1G6rAc5UQ5uy+g2l3vWRUnrjRzTppw7jfTKmNUFp3OGPZ4+acMu
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
ytGzR80TXPUVMUeR8271Pc3PEfN2bnNzc+bs3PGzhG74j25mM1g7x4eeoMu4jyxRR4fLMe4syY3m
Pejs15QYcx+aI5u3txHNedl9fSYi6aw8R47iOYxzHNa96N9soFGY0cVxI1meHM+l5d5nnhu93tXd
52vXXXZ4qztvvE1zVdmXGb1rmita5smNt+I+6y6UGqGrnbVB7ryJRG10bxansvp5fQLbvLxZjj3P
2brW9uz4zbtUV9PA1ZmtO8zFnsd6iSN03bV77417iu+nXOp7oCnaSidQ/Tc9u50RXbtJ++HVBmJ3
XP098Zs6Q7n8nMzL7IJbZ5iYi9u9y+Hy7oc1Rc2PTw73GsdBh+1BGst1BzbajjSuaywphXfRrc1M
WlfbG8S63Pd9tN5zJembscyz2Yzn1zNeRC8z3NZJUZfPFQb7UEV5kUUQqVlt83QEKG/Jg9C1ZzXu
OKPRu3XGnlF1NnmM16vOa1GmJzWM04943b8MaMXioFt185oufmjqKmo5zc+do+hueoqebLXMc2z+
1pzm1Gwz+OO5y7zpHlwNO+aWuna+fGpvIpy8VA7znyO3Xw5j8xzHw14ZRHVAZmoMuVvM8P7QHN7Q
R5FHeaivXSovWP4QZ8eaugxt89F2UprXaKpEfNU1Zzc8THO47mojWa+eKOPnNFHzR3h+9XVFTzH5
nzW3U1EfM46hMWMvD22tznTDxO0DmvaPl88Rzs0faoe5yKz5zc5jnyM7OeTtZsVmyM54soD85ss2
TSMc+bvLS5nMzpuf2c5uc+HMY+bs2Wbn5soMPz3mOa7G6jpWvDR3qI9L2cUZmqDpMvIu3N5na+vk
qM44ufNc6NdcNZqkWtNqKPS7eRd30tXl+o1zEVCrUyqS+lp9pg3xfZ3t70772aTNec3lxzC8vW13
xTppezGl06DL55yTp0vex5jnD2Qmu93OTa9S2fD9DY3481K7PaNz4+lLh7NjXfrnOp3o/buZyLS2
akxdHQdcijNz521EfzvceGWj67LTffrQdNd+ksfXTWDo3eRR3rmPS9krjijiaoDTLzm7c3mdr6zE
prji581z4a64ayg1SLXRtc3PpdvIo+76Wry/VFcxEtK8avpaT9TN6qP3sOnfe+kUznTyomHG0717
2XvfFs0vZvWdegy46DU9J162tjeOcPashqaoLc5NxL1LZ8P0MsdvNSuznRueLO3SlaPZsa79edTv
R+nuOZNE1s1Ji6B0FBkUZqnO3SI8x3uPDFlo+uyTfagoOmqDruOZ66axbZq8PK2NXOV4b17eWDnG
bVpqI9AgQ0um9duy7PBqGux86duxDphjrq8oLnD0GdsoL37W96anF2zp235fRfRqXc49xnMft3XX
WPOnTtu8w9507KW8zdDcZulnM14832y+735NG6ZMzvS7ze7vtlvLObuaPJu8n2Fk10SUxs/f2hvu
aOazSjfatW3QVjxczr+nWPmGqA2M+djhPVRmuZg1x9lWZCvXYcxt8+Zp/Z48XPUmVJuGHug2u0dZ
GT86ZFHFcwaXDx2H53zHz2ZdHLpaHTc4zYJjSP05sR/Ohs8vy123ob87b7VhdfJnZ6DfNYMu/ZNb
x49Oukpzvvnrejdf6FvYreJz1eKYS053mDcW8dmfTerD3m+x3QzGtR5QRKNV/C0wrxNkO+saoN7Y
1sPZuY9VzNvXho684Lr9tdPYr+Oj3p4sFq9mzmfuulzNJQL1IPt1bNVii1rH2O+4oddF1oLK4w/F
fV7u7PcynOY8330e8DvtI36Iql79trmfa3Ofd65lcYXTr3oDmP2o9dM70Gu3eM1R0oPLXeooNLfm
tyqcra9+aOuw+i+fGM101u90lvI6HqeLD9BvNPtlmx3jU6rV6fkXc54p6YR83fXn3fsUxnbpQZQW
O5pNt/ROLpX6RWhtbkeuxqB9KB526dR97eduj3179LmBl0HTXcdJiW+nvfWu5u66cmn36d+udzb8
16bK1fU4bDc7WO/volzJz3pQ5mpZOzpNX26YY/zW21eeyXjvKDvJvL7eZHzq/j0bZp6YXbp2zvc5
MUn1Mx+mbObt2vOjtd8oLNkb6W69qY9V13FEbfh89+atfPd/MW3F26pGd/dvD47NMa8o6Hx5Z8Xb
ZjO0zds5zeJ6uNLfd6lnJ5+j5IskWxXo6nDSUGOgnIrWuw9cI17NdnSaj1rVZihjWvM6s5vna9v3
ykmJiY389zU4+mUcUeRxedjWWJXi76o8106OPodo+/lrDS0GmOkdzk4nJ7r3vhvjb2ukesZ7fyWL
mi34de/NJWqPW/Mze3zdqBYZ3rt8vDmdxTXTyj35eHiPi7M0TtOLtlTH4r6XGvKHu9SzkxQv1fJF
kyr6bFejqcN7QJ0DnNRWtdh64RoTXZ0mufzT0pHqh51rzI+rPF87X2evKTTet/PTauc7LKOKPI4v
Oxq3t4qCjzXnTo4+sbw59/LWGidBpjpHEfc8nM6173yL42qDazpFHHrGcMUA6b0JJdyAzugGu0Dc
8dAMPGrzth7Rj8x7tGjoJ2ruyNHQIc+/iMms1m3dzuPLeZOde6u9Ogjx9UylrMnaDygoA481jvMl
8zKDMoIqDbtdc6Ls5iWJY0nRxcx4zBya2m3dH9ujBziJ/PvQ40Njo7k5smYulHbDGYY2HYiW9RCj
fb5910Sa5n9oE8+ddrf3vHt0B5gY3O2utrMv4kurNu+1o8S0E0h1BpMjt5VczsNxK1Fe+ioLGdcX
VI4vrnQ/0Z0zWJPrd31aRrT0lUdT4+eLL1z3E3rDdOfM86QPMZFFyts+UEXOEe9c9zNg/S/lBrDs
b69xma1VlTIrq/4j3M+joj/FFLC1z83WWLSrrpsUGGPQGd5J9szPj9Htj6nY6ZvVXb7aDfuSIwj7
81pVKYP9FGaJ55HoNTjzsLfT5nTOhlJ9lsyw9Gc+/FFl9qBOgWXneK1sxyHdUCoMilj7/TUF38+/
Ny0Y2fp9vnBo8WK9RmlPZ2dTAAFOEAAAAAAAAPQqACW0AAAAsnNuTBH///////////////+z////
/4zORwryLpcd6MnqBxMTmzrt0zvQRxHSKb6ey4fZozJboKBWr1mI0vbpzHj6PLtS5EaOgijoAfp2
Rr6aXvps7UdGqPVjWbCxtZXXa48dKYS6lS30Vft9lo+/Qp9vwXfZjfTcrl6UdtzPad2Dez29fYju
W11vb0zavmOzRmvm59h507d9w19oxg6dsqRmXezI/Ue6ZlrBWcol+X2PYa0+jNO9FR9qOjbdrfYd
TPt8cxS5OeGwe+RdGnR9F03Rzsl5YnZg8jd9uydtTtHY7Dpr7n2ciN3o9Kj1YKdM7BY3ayvEu1x4
5DSSvpKltralo6DoUd+fLvs2N9NyuXpu32c32ndyxTlDv7EeZEtrqr29XFP3zHZo4rqOc21ePt33
KOz+0YwdO2VOgZ5d7NmdRR6FmWsrNzsKPt0PYa1nQ8S6Kj7Uem7j21vsOhunb4/Jj1aRs96e+c3T
SdH0XTbnVeWOymI5G77dk7eTtHux2IdOVWybqwHj9mB2jcUxPffNP59+Z21MffIvHf3yYNqrmbx3
MRdo5i5iLtHizxqLrHdm3rdpmqe/XVRHU82R6y96eY1tRm9vXSo6XHUxdo3s/TprI7w0fMepMfnH
aOozn1l7eGjNup696iPUVTUHqGos5+aPUXMLxwlfTGfNZgzQTB4s7dhpHl6LIumQjvU7ozDNnms3
Gb4gdqWcnDA2SDso5x35LDWVJ8y9LNb9lFu3CU0zENmWavGzGEuZE1kF6tb6dDVEtoYfVg1ThtqP
my83IaK8MZDxg/NU6xDfTwJJA0fPvNRWlV1RgeukInFKlnOxz1IxXz8zPUtVZtKrd7imcuX3oa4s
6DBJzBC9Tm7i2pyQ3ozURo7vHvkeIKCMtStKOL3S1zPMuJpvpOzu4o7W6nth8R79w88nzWbmijvZ
ubzaXZTD1fqnPPH4pTHw3i8Hk5MReTHzt0N4g2LwfPoNmdJy/PZhiV6Hu/t70uzc7s617OPV63SC
M9meZUeZGzLdy0nZHiv2Pw25Oxkj5uQ67CKzmjx2bm1H4lrzKn2PpzJcwmJ6Y7DxD75rtfQfJhR8
4+fVH5V3g9++fJjr798+TCeby/ulec63rmncT549PtrRqsq6Pt0MFpGji7aj3zWoue1q7vplmx3M
Gj1GzR9sXmPx3MG1GbtH07RRm0bSG5NmGXjbePB7ud3ObamTaYtWsxXjj83D3Ns6y0qRs3uXqLxX
rscIeTmwpjp4jbknPvSjy/t/AqOKC6NWrveXL7r253I8caUe1Oe1r5OZvLTFjyfwx40FM4FbSHvZ
dPNZHifk5ks/FjV0c4EpVOaSvLExuRGGXl228eee7ne04rUzFpi1aTxHNh/XHG12CebcaxKk63F7
l6ijV67Ha0/N/U+mlm5PfvSjw/2S9ShLzmUF0tWjg5n49M6wR5fP9Ue1Oe+1j6HxjGJk+XjVyeTl
Fhjxpe4MO19l2NdPNZHj3OXk29eReZ0U5RoJSqcaV3MTQ9W0PdqY9HTGGtNNNNNdJjs10C8C2JQ9
etoLpgSQ+dtC8eSr1dHtrL08vcPd9vUfLaa908Wre3ftsY0vdNXj7De89uXetPwYxj7afjdd7TYv
N+JUAcvnYeWjmt46RwbFjOnYe8T2/cfQbmB0e9CcGT3QLzXuV0/Q9XoSeryVe327a6Zk5D5bnFkQ
M3496hqje+wWN95UJyYbt3v3xytM9cLoqwaE5vY0O68C96dOmwh06cp1jE9DJnTzU4vfKC1e5zN3
q/LzFE0HMaych283LKpBsTk1cJiY6S6U5MDWmr2zQW1t+b8xjHBmZl6nsJuDUuPvOZfb1DSbC9mF
Bb9Gp0KYE94tNqeuek2+oe4Kcuusd9PBsYPov0MNdreLx++X5fmt62lduVDEE6PzTFHoNXizfE3u
cdfeja8DvWDTyx2g0vYXOUdpLJjpK/LQR5dbgn6/fmN5rek8eWO2pi/bTw95r1NPwNeeBP10d+r1
6a6dk/Lgu8ofm9eybHz7y98Hg3j1nfQecpda1uh051zOxv0eTVD5OUOh0HvScBzJ2ZpNr3r5jxjp
27dz5rzt0EsxLJ090n038HnSc9fgzSutoLfstIJjet/ZelwwPYk8mFrQS8SblHo3rPJ50KDmPZZ3
eu0o6KD12Gx0W9V/ZzsOnzB8++p/Z6Ymp5bHQewb8Wpr2TY8+/Po980Jj6g8fTO+heQ993rprdDr
TnXN7G/fdDzt5uhmJyhntDpqc6Tgjjx3l4m1718xjLY6dujOs6b7dQ5iXzXuk+m6MedJz1+DNYd1
tV9re5xy0gmN6396XDA971MNaCUwlblH30b1jmvZ50Kg9TCb7aUo6IW9dhvfTHr77OIdWPn3t6n9
nphTU9MIdfvsJU3B6bG71blG703p5esThpZ8kGgtBhbW36Nj0bkl0oeck5HoSDQklGhJLyYQzBqX
k5JZJeJpZmt6GpRpdhfbQzL1q7uPKPSXTfRXYk9Yoz+Wwh2ux19FHeC9GG4L6N3rcluSDDtQaVw1
2Hg37DRshryCziJZpbGgvsNx4zsb7Glkktw2GFrePmvN7Ml0094oNYO7HZw8U887CxJmxrN5M65N
DofSD3y7a7Si2n1F7Y+/NrBee6fJwb3rS0hsL0MW0tpsbYlC4m9h9nKqNPXubZ4XrciCverxOTT7
CZnRtOc7Qa+alTDD3ncaa0NYvbDuEnbpsbetQcoQTa1ptbGxpw0PdMIdbS6DLnfAb1TlHv78EsPs
u9XD2VTvnnJmb8zvy9CMpz6p83bfXWlsWFcmPrQY/ux0836KOSXN9ZeJ0wLXnrx6YS6WsDGW/Aac
U5R+/UJfo+y76XD2VPzzlbNZ1fi7jXvnowyf3rP5ra660um3aV6x6oKDHv32xL9m9jp5sTgo5JcW
31tSS8R48wZkLXvJNr3kt6fkE7QYTaz2Hvr5b9HiSCtpQ98ggmHD3xJw98TgnyPkPWGhjxhq2PRJ
CIXtJuHmZieQYWD3w+koe3y1B5xPMnuSh7eeqxfLwXy16HpPHDcNDaExg6PQ8Ge4xah4cZxMHjG8
8vwIKe5eh3DXtoLlJvzThsbaHhhsJjwGzq+yChob3kEx0CD8vW/ZzptMYoW+SuDaCeXCLiJtSB+Q
VnDy+XvJjSQThrfJbCGth9tbl9ehsY1DB6F6Gk2HpDAgk3knnJBNoNcTM8lvD5uYW2NwuO4OCg9W
aOJTvuHXKNqI6asaexMQc1xOjTHnqD0jiKCNNKYvzzG92w/cwb95WEuwbQzPXeXHEbwP225sbl99
QvEzdsa2oXl3amsh57Z83MJuGxoXHcJh8a9HNHzdsa89w6QnBFG1EmFYWmNiYg9TnL3o09D3Yego
x25uSNQqYveu1t+3oW/ceQ3Ocs1YQ7ehtemjz12eKOI2eB+25sblnPQhee+dmczW1CzXdqa2uK08
GoahcNVQ6S4mmwh5xN+8bW04ecnxNcfeuWt+8kL1nFQ6LQcNBcVPkhMBwUGhHxcFtje1xULvSfTf
tUPg8Www9jtxrgsqg9t8Tux26e71y8hrxIdhsNjYbCeZDtBwyG3xN8W/RvULUHxdtQ8hvpy02OyH
lwfJhKCGrCGuIrHSY99DgsG/IIL16qj1qGBcfwe8lDQTT2NQ35Dewtjx8ph5xVDW+Ir5a5NPSh57
VD7reqo9Q92MgxseTjmNJoag15OZoPcxOTHngWhrWpicxq5jW2gxj1vQuDwNXljNeXt9gxY83Oa6
KCb17yYS2Ni+SCC5ejzevZh+e+Q92Hy928v0b0pyYNl5qGBzHt5ebnA81Bve9TjmNdE0xqFrxZrx
vcxONeDNDprcNanMvLmNbaDhmloXC8GXl5qC8W33bFjzc4uiC7PXvKx6t+7FwQWtYHD1a3r2Y9mH
575DWw+Jt5c5pTkwYx80Fgcx7eXm/Q81xN1SuGuNrQsbW0oN8RBcbb5aCW4KFi+Nm1pMLiuCd8Vj
Y3DS5a5bcNuD4ucffH6QzfFxweLQy6q16crzia7Q1yXLOT6dm9be1uGDY3voxretp3u87dOm12VB
BjtvXE0NDcOz0EH0sbhsbW+nLUOnLBvYY6bG9Bct63xX07N9OzelsdobHTeu3RjW9bTvd5269Ntd
jZQQbh23obh0Gh2hsPB0iCSUOg3ySe+nLXE6cXew9dNjetrlretwsOqgC1cr4mcTL4yuqFPjWFyz
jLMhmQfJcVPj4MSggwxgb4rqrO3VA+KqoUFxkLx8mlyYy+LcGHlwxPiqJQeLisXDOV8RKDecR5xW
g1fJKCatXj4rQT5Oxl8bLQYvLhicFBRBoPFBMWLhnK+TCQXFaeB8Rm4zyw1fEyCAfz8XqJOfoZ4f
OJXHz3iR9EjGPpcT6/T6PL6vL6lSh9Dq/UwIn0IFZ8+K4/Czfhf9eRx7Z5c+ck+C+fXi/CS68jj2
zy586nwX05/A0fjL58+fPx9Xh8/X4Ju/V19XH00+efjQPLPnnpn4Wzyz53pnm/A0cidPsFOynZHo
XyfI8CJ0fc7HiiUkzDT4IfEe1e1e1e1Y4/P0dXnnkGH1MO3tXtXtXtO+Cg+2ny2/UThnwPoQ8Hvn
k8c8+ZmwTpdhb2Fg8DdQk8AMk9yKyyDLFZYrJVro2ZbglIeD4sOUCW4MOUznpXth29Q5573nnoL0
t5QTpZ9rzzochvqP4PYbz6nxPiSEPFJ0khqc4fCepy+bwPInxKZEPgbbzeah2dpfd83zd+MOVvOD
8n1fPP6O7zzzzzzz+Tnjnnmp0G88dq9rOjuH7Q/J3xziYnnp7455xPMgAtDvIsNB8ipyKPPOHkHy
QBhL5D0da6VuHwPsmxj8jRe1dX0fPjnnmh2G88dq9rOjuH7n6O+OcTE89PfHPOJ5qAEid5FhiPkV
ORR55+YPk+BAGEvkPR1rpW4fZIkY/I0XtXV8cAAAAAAAAJInpJEkopgAAAKBS22222qhD/pYRJ7J
ptgNt9OlW222222220LAJAJJLrcpZJpJr9V1yK0k/rkokkkklNNNMklHJYH7JU/kJE0hf8o0YH9L
bgoo9E02CEmIAAABgAAAAAAAQmAkEMmGACSNgAAAAAAAAEEsnULohLsDkRAJAOEokm1I9Ul7xJIU
wojEkkgmAA3Yo3JJJHUnEkklEkloBoSG3bInLfc8klBbElCE4kklEpIApbZEEslWNhCIG02na222
220LDIKGjZJxtt+Oh2q36222gRaOUafn9HLP6uQdn9I4ByX8g5RwD4Vp4Ty0oAc1nL/AAfBA+vXo
dqxPLX4noHKuVcg5RxjkGUcw5Bxge/DS8/FMN0SFxjjp4aer25qRTzgU0enLVy08zco5Vwzxzyjo
XCuUCeVaDy09FPKKPrlHMOH+5R0cPav7/vp7FknnppPKOwUIxoHAOGaJaeNdCChcktIXKjTy0hcg
4ZZcg5A1PJSB/EUvSx3oYgOgAMeYco5ByjcOkMOPxQ4f8LlHwuVuQOOQOOocNOGnhOkMOUbO3jDU
yNgeOX79wDcB/8v3yisEcgrjhHS/KOi3kGwDt4RyjKuCof7AVD/5T0DgDDjHGEOEKjk/ekdH9yHl
HPHBG8bhk/uAA8i6J/D0/3SgeEEcoBQcuOVcQ5Eh41GjpHJdAwrhoQ3f21xRhHSKOzlAp6aUOIY+
fEbHFFo4wKeiej+5ByRyjgjNzOrRwgLqp208Mg8o5Byh1yjBCHKAOUAOT2dnUwAB///////////0
KgAltQAAAPU7EV0R//////////////////////+CE+Y0+Xk+Yk+YU+Wk+ZE+Xk+Zk+WE+YE+Zk+Z
k+Zk+ZE+Yk+Yk+Zk+Y0+Zk+Zk+Zk+ZE+VN7x658OXDXUgOTBJcgaG54J1OPx2yAIEnihAtp2FWta
BC80PDslTLJ4sD7Phg3IGZbqvIFHgTB5sscJHK/Wnywny8nzYnzOny2nziny2nzenzsnyynzcnzO
nzOnzAnzGnzEnzKny4nzQnzGnzWnzOnzGk00/Kl6fLyfMdkT5iQIQMEj1nyR1nq+zZK1K5PaNdWr
Ea4RfchHlV5GzFGjvJyjOLb2i9c1dWhog1kY/BzX8G2d21T/fmIJGuhjAAChUSsielNDT/KSeNn1
GhSTyTxT5jT5aT5xT+E8KFg0k+VFJ8op+/Wf2BQ+uFdT7nRxc0FwTieybb0bDZwK5k+ZrMnzInSf
MifQJWK98MghWDEHk+d68gEIA4p/DUg1+nzInyy5E6XOl3sZpXWFGQRcDmHSOYg/CG9Sj+AwAHMD
j2HJs3hMZcJhWlDf6Z0DN/iABVFPmGknkn4oC68GE6BmMJpmT5UTzs+T5kb9W25uMUDXrP3UrIQ2
DiupIKHYKxC5Y5oAnYl3qnsJMdO62wXZ+pvOSLBPjVzuQllbVl1bVMGeQgmcoLA1xwZMPc/EoIf3
sjd9n383bXuj7UehGn9Gh/x+Bam8awMZwIDkNccSceWTOYsjpj91PYG7WUiOUbJIG6t/XnW9DgjW
o252ke3HM3uwyvVfjyOa6RxDJqdpAcXVXFWPKVOVVoBgC1WbqVvlaxQEDCixZXaZLJ/9vH/ZyTrm
TEgGTWSDaG83YoHwvUtCuZS5/Gay5CPNAnriMs84YVwgDYrAsRsmguFAJEtW9VXAyTNVar2utv/t
w7dlQFd2V4LE4cvMXwe6gOCwqxEFEy2Cvga4D8xqmgXh9PALPAWrj+iyEiCrkeVrUt/IYziuCSBp
wEq+cbgteDHwVw6R+pALChLDqp7ocF59xOAWAsbKQW2coxm1PnZPm1PmZPnNPmVPnZxP4bIny3iT
5mT5jT5zT5n+t0y5Ur+2nzQny2nzPB6BsknzinzsnzYnzOnzEnzP6fNubvT5mT5jT5hT5kT5kgnz
fCuPKT54T5jT53OhCfMh3NsTFgEX2vI7EltwhDkCs7VOUsmWdIAJHJqaHFeV3EZ6rfH+/FUo1Von
y2nzMnzEnzmnzOny0nzOnzOnzinzOnzOny8nzKnzLyfNSf96fqnzKnzGnzGnzinzEnzOnzOnzmnz
Ony4nzEnzAny4nzCnzOnzgnzGnzEnzOnzCnzBhjCKfNFvUeT8Gp99tgWBzDqZPl2z7TXIRZAj61R
cQJXmWBWESh4BFcOdVjRbDHdb2N5PlyG0CoxeBGFpGT5nT5s5PlMXkKYABnU+c0+W0+Y0+Y3yRop
nw7inzMnzHVHdUdM3tRbcbebk4jyfD49vafw3d/MnbYWcXMoGxRnuU4eANU+Uk+W6tYEpBGgs8F5
asjj2z5CCAgK+GWrsmTG5i2TyoAhpSdOgJ8Ff+OIhn1mPbu41kwsvMihAjmYwXQDOv4qzjlZYjjZ
XMpfnBD6y26vfksTEZ0izd/dZ9/bTb5PmiBHJJ+8CfMYBkxdXYsUB9x+4CaCJ5xzLI8hC83Axyp9
UH4wwrNYnlLrMgKBhAjwg2mByGoKgVuTVKcYOwW6Y2GxPHGrQA9VZVpoQJEKGxHOo88AgJt3QceM
C77quexTjcAx/UxgWNXASfpvky8FXhLFt8WPBBvGT738AacfVS0Azwl+99uoyQGXNfyPJColNqyZ
NNdmLCyaeRzq45FeOqEVkDP/V+K8AczjMZS82HcDbnMvuz7IEs5QwAjwZXlcrNoCB9eUA21vQ/LH
bu6q15vT5bABPR4z+B5AycBq6jtucMGSOPIQMZE+VrSp8EHJjCE+U+t7PjZ60Fye39+0Fs/J8p2t
7J/CfhbQ+O/oW+XsxJPmRPnHMNSTiT5YT5i5746/rt15XoCBDVRYQADxOaxSQAI8kQNDkhAOUTB2
+vEIrmGQhuBgFAVamiBh5wseJGse/EbNZ+nzInzGny0nzanzAny0ny+nytST1oJKBv8Bpx00u1vP
pz0es+s4fTs/t5PoFafLKfO6fMr9uyNSmUnzsny735VOkmPJ8yKWrbpiCACl38GPR0xnIEymUxDM
4aNenljdzFDSfLyfMFtCgn+Jk+ZqFG1PBPlRPmBMnhSTx9PjT6inyjanyknymny/FScb6HYMkItv
JznNlTgp+Bemqop3ony1Gkn0CCF+ayKyBBCwZylFauJsGyEe0OZwFAICBACCNCpmk1lEGrWONBpT
krn7S84e6/SSnA/QVxP9sxxFCNQgrSpj3citYXEhfJRdSHk+4AfJllI5nublBlgmNX0CHmjJoNH0
4D7G8EGjlbY2WZPySgkD9ghazBBVWVjh2JcUjFkRcJAFXM5t/v43HHGi4y5Z8oIkcllaBZycLLZy
PCoDIIe5H6lZwO/OfufAiY2pFVoEBADBEJMLflq/A1lZcBQIDAQAlBvJyFSHYAAAEQIF+0KGKdWN
D1zLLCIBVgNNIXH2UvHBYAQ+tW13sjSwg+SjCFZSey/NB4Ex7HWFGQc6Dm1IESROVICe4wSHQAgY
AUsqX/cPeyHdbX9kDvWs77qsElNd9PY14BKLK9837+crnXCD+xx+gzkcoRAONSyiHQGyImpSmuVX
IrVghxaAENhoCziXOVzgOgMuCFgcEI7v0EPdAASboJBpCnwmnNlbWRyCXQKnyKnHWVKJL19z3H2C
NL4T9r06n/Qa20wdsJsK77Yd6rJlgAvxlkUkECCwaCuEi6kcDbNoIcTjgKAQGCITq1zSayjC0taU
aTSnIsEcJfXGWv0kpwPaCOJ8pgiURQgIoQXe0w5OZ8qwycC/ko/U4864AfMxSQU9yc4KWC6QD0Dp
ZpSaDS9NzlFCDSCKwRjaZmWRGQVxlr/ZggpVlCcmtuVSMsirhIEoRToIT8vTdgONOAS/eXKCJKCX
LJAwhycFPZyl6ByDy3I/Lc4Svzm5y4GdjckWvAKCIeIUQRCT5IoNZWXAACAMEAJYUeUEQkgAEOIL
9qxWYkDHO4suwClgYmmMAOpfjiWAsVWvjEPaB83viyUlpDyOF5jYgTFzfAPIOQ2DckGJIr7SCnyo
IAQMAAk/2964uVkgetr+1Hen7qsicprrLJIBAPYvs5BDf9KWCK4wf2OLoO5EoQ41lLKIdAlkUNXF
kBPK5Hk+4IgGgBxtaBM4n6CFFwugXvBCwOCEdxXM90AfHN8hbh7IfLAEomVtZGYLdA1WRc44IlSj
pYQEOR8Aca3v8IfC4Gfe9OW3ECNjmwmyrrhrfUsmWAL2qO9qhljwsytI24ST/l8/q0xlQd/BdIrH
Hlg9U5SgpiSxv+HnibIA5+cj0ME+cid0F/dD5H74AU+nFJ1sYbTYkzz/OEqZHQi9qlvatctgY1sw
Pnp/EXtWLZEqzIBXfHppr97p9rs6BwDfHXK82/Aa9XMdGU/ys/PDbk+fHZ878F9dF+YL0t9k6a9q
42XEXMunojpvapOjpwmFWbZL8poRgNtz/W0KcA/e05mz7A8DKPRMcE/R6+pc/4B18Dx0aJkb56MC
ymza2Rmmff51OCXowDHZjb4KfllHJg7Qfgft9mc38TLPPZTRhaYP26OR6KyU6Oi0dxLJZdgcns2s
kboxdAxsfx0aJtGjAYuezHIDfQjaYemaHyORrEdHwMnyH4+zuDiDIoQAyj5ebp4XVsvt7LSIr2De
yEOuscbykJIW3lNsLIUEsguzeVyP/+7jqya4G+Rur4AAfdb5vooYJmYbG47HmAYIieR9ZFlDuyfn
0fmaOf7+8F7b1lJMVh+SA5c9CyXomlR5ZPY/JdE377aPL6+/D7/MViPbFdH9/5LJY8wDCMHTEOHo
YOfOD/yDa6PjKvisNgtGCL+ZiMWYuF9NA+pn06MR6g5GbOMau2c2V5vYnWU2rovw5z82zVofD5k6
vsvz4vFMHq9KcPL0P6eV7OGm+YILh2fgzbMhT12dDI8NH47a4NmoxasQ/8h1vLqgL+m27NPRr/jN
tllv0GQBqNoyPXF7BMizR5YXiv2Hn88C6NOn8OzZlM9H7kzDwmb9PSuz788p7mxg9v1uXnFZUuNF
7Vkjb9g6A8Xd7Vle1N3tTd7Ux5iC9qfG9qdvan72qLdH4C9qjLMb2ZX9WPa229qS95c/owPj4+nl
wn88Xmdmz8+z9jP8cmZ8e2Hmp0cjznMFNncr9YDTh/FF7U1ouk6L2Tbci5HWnRpvzKeMNZHmVy7P
5UCZDLcaucg+jxFvFSZf43fydfhs9tw0mskUAbxv3f4NvT90OPgOh9T6d/iBF7Umi3RZZZFie1Nf
F/EkQSRZeKePHiOC9GCHSxm7JZciacx95rF/hwKgD0ru1U2Z2bRLr8xje3xk6OMEHx56PPDbeJMF
x0ePhlaZfx8L4aZmJ8SwbN+4xp9LyBzu+9qRk+m/H9tBlf4/uAgyRrYUw8gJjG7wcxrmgoBTokeW
9qSTAhJWrnsudF7U/gDGvanj5wOH23tT2VyLAbQ+td+AqHdq+3P/KYHTe1TFsuueiC8Ms4di+Oei
dmn6k46J6/G7TXazAYs5t9y5AuQ3tVwVAGFHHQWQwnHxnkXMw4E3xnitD0dB/fB3nPew0Gyi1QD/
0SmEDNmxxp/N9z8OkH1oWFu4I7tyd0ya4788cpkglpxgKVxpQ35y2QS7N/lt1Y0wZfb4L7vanecz
7T7WyySR0S6OJasjAeuaz+Z6Pvzfo8/HIafVvRLg/prK7Nnxk/APLc4nzmNkyk7NcyE1+Vam9cYi
1PNiuj0G3KovanvJOKI1Ted7VGuyIVlPVYmRiNk5I+Py9qbwSViZCe5v1nlzirb4ukpRczuuvh7j
TXMlvapbGZOMC4OJOAUlrcUzQ3DsLF+L7Mj7+mAAAwo1eJr+XzzIPQjbc38d/9YnPVn+/RnRrg8P
pvao72p2NGJvYfz+724OQGNssXITLb8sQKRhfD4nLcPv+fGzx0R0dHqXwmkweUy+Qyf740+8xlX3
Bnzo7eZL2p29qX88Vew1l7U3s3+XRJLo89vRvrrm8b2qW9qaxvjiNUmny5kval57jvZYLfLwknF+
j+/cJhOB+Pu52UDtQILa+3Bc6qloLWxx4ryM9LS4n2a+j45eUueivgy737fh3BLWJm0ayYIGxISC
5Rq14DTTjf84imA8/PXyjYGs5T2Ty7kJ7bYFHr0fP4YoMLxpa3SVQkP3iG5z2JoZAt3ScS9HR0dE
peVJifoqDYvkLirNjZprW3ssFwWFcZFHR4V6B2IBXon/9TCSv0aGwuivQD6EeFg8U6MFgsBx0dE4
dA9DAhlKo+GuefwkqXNdPkt0A0106SSeit7lJZfJ6sbxJHPRz4rgEwnrXo6NO7jo+vCvHRUejjZT
0lHnwr9DyJBpom35bo8ML8e482c83uPoawRShRgL2BTi9qoYNBps6KsBexKbtHPjg9n/g2fH0zV0
D9tKsdfNL2HsmZ0B3B6b1Ne1M8X15+Oidjx+/mEwsg/X3e1PXtRDKXtSfO5HQxc3AyEHwqWnUxx4
ryOyi5+Nm7wj65fQ83QHxAm37vlyBKTIvjY2gWTcyB6JHQXKP/wwH9STf94qmB9PYaePKNjZ67LJ
5d1iFkI9n+f0yeMPJraHURNIf3Fhz+AIIeOW75eNHR0dDydJeQA1Lo5BtX8Fw2m0M0wb2Ky1ZW4y
XEN7E6PGvQOxDK9GzIaQEh30N6Fw1cH3FOLIkp0YTCZPZ2dTAAH///////////QqACW2AAAAeju8
wBH//////////////////////w5Ojo2N1U6Ac86Cb4eE8/jITzN0+enjVWunQTvW9M06MyVWBZxL
E0B814HqwnKvRGvfJ0ffjWTohsdHG2ntLTnwr9jNQg6J/jMdHjiPnADyibm9x9IWCKUuUYO42SXt
VAGMhmyKsBe1Ls36ZvLC7MjhQfX2zX0D+tIKRNS56XszbyNnQHdz03uT4D46Ml8SbpWY4+84Zs37
hBZCwD/nhkMlo0yh0V8C2HL8gphgj8u/1guhlcps2SewMrmGaZ7mf4K9qftp08ebbb5Z4nAm1s8N
POB9BHa3AexxhbP5jXTgPj9wWKwbjkMJ9fngs1+/7dYBi7Y3o3t9fbZ+Wf2Ax1y3i6uYh6Kzzxx+
eQf3P5qcJx7QVp45VPL4ZLAetJWa9m/w0btLOfT6lKgJPTd0y6RDqZTVppojbvwW8dE+R9mLm07W
8TZOlJrIBz5aePKm9llZ9TQ9GotsvAOImkByX1NVvRv/ujx19BauNe3b4Do+/nd0avB90nkvT3xi
ckzskkHWvt274kwM5kGps+DBrWoR6ejow1zk/eKdY9i5ZSvPOkMmz18P3y4yWIF/DVTo+cJ0UnHo
k0w/zljeM86TMN0/FQCoAcVlzfN3O5sO7ViTqMo1j3+vEGn0m+gYIY/CB/4nMacgeNNQFrehm/NY
D2+9eB3N+9o6v319v46TJN8/ZgtD5fCoBUAagDVAGTwfhvxvpPsr9B9zkNQ01QFnTNw+Tw2G/+ct
nTdN85sNhvkOW0L+r4DICugB3eAZfnJx556m5nzoL953OK6fi5dOQDzu+QT8zes2XwU9KZzA7Z1u
wm1+wzeH/U98VTTOjnOaNWR/VQEfeA45+t3vsL25zma5Pk2f5ur7OH189+pNxlcjncH6bmfW/eVM
hgcKqBlQKe+b9ugw4PdUHfO34kX85n91w3jnASSh1Jpturf4C5hizE6NujfkTAxmNUAjd+X9NOI3
fOhdgNJnGrs2/3x5YMeJ6TbVmLwXkz9gvncN1uoU7+miDHUA55fE0M06cA4PHRpjj589ANVCrjYv
ak/Wq3kG+Xw+8v5eWW+kw+52tbcXdW8121yBZjEG2qAQ7Q9HMrOjIajsx/KoAUAJnZw7CBS+PBuy
sk7zNA+1mtuU/N9P359my/cu3zysacJlfAtrMKd2FLee6oRM9QBs+gTZfEY0GE+v4AR35roNQ8T2
NQ1j3UABtnoejFQ0oE/LJ/SgLPIRZeyL5/+rd0GDzrydAD++LnF+eHGiSbRwdH9vjy6vuzZ+ZH51
N3fE+8ff+8pA8afsWfnx85X/kb0FtILjncqchhzSz/w5as+74//Lb7/3v8eHvk8ocX9pKSWWuSjC
h/8tysExLMGB5GzfgNnE/79c/X566daaffvyXQ/vgtfx9t17/JgGs0aWFtTyRvx+r8zWKymXwHtD
OihOzwgOnT8RJN05Lo+8DJtaoBjjxTPnQDy1Hme53Hd54jRiC+s95jgNHkdp7nueGI46A+WZy6gD
y3P0euahl123BBgc5bYPRvLpn1cFJJzXiJOSbg/To1e2Iaehwl0atHycselMD0ZHw8vPbtKlLejV
btkTryD5A2EGcdWVrNg/DRFKZLJYST04lDWuGP811Asff3hpfL35X/Xuzn6+/Dz+/ae9qUvan+fG
XZK3VP9ekW/3l8y5X20/VP/fro7GGN48yenpNgffX5+JjsBQmho0l3S2flv3zUWUKrS5p+7JJwsG
QeinR9cs2bbdvYGepNeZcsjooCmQyPw3If2vx1jGQmv3jhZv4Di2Uty/yVOGL+jicNi0DJQYh/Li
odm+cLtMTjoxHlgMZ4l0ZnPbNtX8PPVhzBMEo/OdvQzV0Dy49HRs6N3znZ5C5eHJmtkk2/I/OB98
RiZ65fnE4bDa56/HjKP0/HoLMUHM0YGcpt1ZdYkGlS+gvICu0Grob8dEuB9NzcMN3LQgcS8LualQ
PRo0mhKZANS8qhwHlmvqbXL4eWF8ZZA4XBbdwNVfQBlYLHmLrw23B4TYHRo/MPsMXAeHS2fT7vJ7
eTC2eIN5RfF8Np0c/v4c2/526GB+d/zt+Gh3fEsNWWdb9STeBWFIygeinAWAMvz5l9vWfC4PX5eh
mMkoTQsa6/pbPy37mbQFCrUph/9km7kFJBdnR9Tg27h3P2BnqTXmXLI6GApksp8zZLIeXlrpd5HZ
dgk6PgHONZR7cx9VpIxdEk/NlgGS8Yp/Piodm+flwmPJ0YjxwWP836M6cO7bXo8fXVijEMQo/pt3
QDX0Dz0U6Oicd/2cM5SlMQkTNbJZ/nJfWDwOMxeyuW5xuJxPjPX58pafZA9RozGBztGBnrPvbLro
QWNL85eQFdzNfQ35Z0S4L2384iLLuSjg4llXzNrQPRq1GtoM3jwXtrzgfPOfc/hL4+WH9NEgcNht
27jwb7cGhgzCMnwxW7DYXYHTp/cTtMjAeFgdmvAvJ7+gK7fHj6KL4vprI5//07Pn63aWc/fx9/Hy
3nf9aICs6uskm+bxR6yspz0Uk543+tm3x507/HFFUzFn3+e4ZCn3bvCP/Ro3aNGUGNJhauQmAXhV
2bPfZd24HTp6JKf+WZrbeQ6BKgJWkWEHSz61tkmYCOjmmmlQxrGafTlvjoIC74//iSTRtmmugRzs
n6A+k0mkPD/Fy35G+LgjgL8hDRjGJgl56tvj6dAejoD8yZDA//4W1no3IeerQBvAyyaPhktNI7Wu
zxBTa0ZV+jXs/H3SaZGSlyHjRZVNx+cDz0g8h01AW/VSb40M+Z+Qt304KrrPOS5dvzt0erPDVtjR
SmjR88Vp46t2rwoO5G6Pg++alp2bdbQaC92Z/NavSLNY+2U8Cu0i4LxZYPaNU6E/RTo0DJZPwD9+
tOX+9HRz/EAvDboD9hn2i0POj6yeD88tlcplcpkjlO3B4PKZSZ66DjzG7e3c3oqwM3RIRcdDfv19
OjV+5VojH1kPzwZKDgG3fzwC3jjV75fKZPLN5CVJslkMlk/r5372TbynD0UzuWyf1nvA5j7k07ec
lk8LhvljMi/htWfVoCnZsD0f1ovXx9t/+DfWbii3o6AF0Q37igWSB444n3gCv36NbSrSAX1OD1LR
zgjyr0ZOXJYuvRyzA4TJ5MfBmlZA5bK+Gt8OxHrxP5YzO6fDet1y+PJaqy66vWlMrjPTnwOjZndr
cdx0cxGgOR+OOeac+FGFK3bp26Br8JMJ2JsRJMwecfjMcZ/+P156fbPat3txhMMGefb44EeAzA5w
NPIGuckQnK4fHX/kL+F/SPuwU2U18Npq2dDeN3BBWgfZN8so9YxIPXI9HE3xNr3g8fKXx/gNZCYK
HQmTQ9fhnr06jwz2E6OZeNkuQZ9V+Prd6ZrZ9fX+8uxg6G7Pyk/pPo1aPvno4/5NWzmfnhsu35Dt
8Pn5aJ06GRkclmZA+3PHtrOAD8c+mhjPvV+ZnB4HNHBgcJgspk6kORyvlvwrzDF7ATjs+cHNt4et
fCdZ9/OrhvRgZNuCbqIunZz9/GzimnXJ0c+AQAIq6P/Z5a9eE8PPnZXb/B4bisEYP5uo5X1ks3v8
Ea/XJv66+j4Rk8hgsJHucPT0RoLIl9t7ffDSAwnm0uaA8pv3hujx48azz6W+GrAAZ7YQFfivgIef
jolyMuljJmEH0LXr8qcevrA632LK7+KfAdnPHL87JOehmB0ah5l416sNh8D5P466eC23jjmo8cx6
4QbgwvtHk+7ZxxowWmk2G1Jnh0XKi4cf74WOjXrps0TaJa8RE48DnMD6/0nphv00MeDb8f2swW+j
4HnAvt+vvTLQaB06QxJIwPAglvVwXIXGVn1NDVa3f0fmgG2NvuUtMCdMv7yW6YAfnxBXL5EpvkAU
XtSLohJDkgs453yzfgFxcyF+5zl/0IdF8ScMzU+lu+o6NvNOPgh6F3D7ajooDTTdOUfny1og6CqW
C56N8/JB5mn0uAipy/R0Ui2mh+KShYv5qAabtjb8k0Sh06aePRJ1YQLBCQKTcdCWVfwDzADRqlHi
BADDeDPDAyeIMYYeIx2jRKYPrEmN9MR4st8x0+lOgxPGQudPgZ2CMMHjjvYpawEoJcTKuXOz++Oe
jls1cgGjQrimrt6AV3r21xlOjnDGDjVlS6FzfSk4KFS1g8dOmTxkMynpq6We2iuEMYyTCxEe9YRQ
ujYLGvt+/wd5eHGlvRV5uj6ynMk0SUBS/A5D92bRALZvUQeVWl//0wOGfDaa5eGzoL8eha7C2cVk
llvhoW/MmjxHgzJGMpv52VGNAZmL6v0Mh9vNdcwJJM7s1N+K01zTAk+KivXA6NtY0MBppunqs/vp
oaA6CaWE5f42TEGaefV0AqVHmfo6GRDND8U0TAXzVALPjaHjRo5Zp1M8uiW3CTAEJcU54W3qVfwD
14Bp16KcdA8cYjxB44SXzBjzGxJhadMpiewyGB64zzAm9B1ejOgxvKVs2rxNLBmLx5GDgKyVeOSg
lxMJym25D556Jgz1yXNGzOU1d3QAvhe0sePRNiDEx6xpdC4PozYBhUXUHjp1S+UpoU9vDpZ76G4c
yTNMTErMBWKE+2jGlv/P2PkvLjU3oq+zo+8vNLMMrJKWhyX/s304oGb2jjyq2uQyMwOGfLWeEvAd
hfrsLWsLZw3Ro0XxVofqXT59HBpSAZT452kMaOZ2dDRLoYsfdNXwn48RDmK9HhhW5nBByO7AZXoY
mt2PN4/HRr48NtR26Jduhp7j8dC945zHRhBt1SyTTbvHot6Ph6PewGbgb2uH5m0swm9u35ov0/Lf
n009EZDR/AIm/snl5aY9PX42zwTzy/Xjv8uKaMAWr36Ei3b5XsPSmT3RJKbhOS+sq2larPX+2+N7
AbuyHh6aZHA3z3t48JJ6to2rdtmv4po89ox/L9WnfoFjK89AOOhgdO/T/l8fO3z8uHJiboln/WBI
HH4zo+GeU950dun4HbqZiNpS1cOli3ovYWuhAl8OI3/C6s2v6bxGd0F8fHR4eHR0CGjxhs22bnd0
Qkj6DLt1/GTwv9jZh21kfo9osuS+FyTZ12cstk9hbLt8OjB5KYH59eezIB+ON2h9taM1e3PMmGpi
MZWnt/P0ZvEZSIk2fMn54fGv5yGDk5HXu/fbAUr4fO/Xtr5692MBPM0nWb5vXb4+n1syX5GB9P3+
9qg9v3xkGJ3XP0ZLAg51/HhvwHRP++vjPJ0B6MPpLzk9fKkRidtG/PH1SNFB6B+eiDI/X/PwDdE3
sH7B7av/ZvoGx10v47fJqYHRqlrUP3kGdH1Pt6NA8fQdwKVio/OCl6MTPsk2B+ejCLdc/JfZlGDk
M/I3y3zxPSs8pDt3Rz4AB0eO8cjk/L9l8vWmR2euY0emr7J6FLp3//KzmX3pwPzkJa+H0zo+0nnC
69eqH9sD7g+Jfybf8fuO04ozZQmU2rAP0T0nZ9yy+nz5+Mv5S822Xdm+35kIA7tuzRkPiPnRgq+E
7eZQTdFP5v1rBuZUX0f8aNWVk40/VOik2v5+33V5s5uRNewHT2WDtZ/ZXFCQfDo6AeuSr4MwH94T
en9gTC9/PTo43Ft8F9XIpq+U2lm+vR9eEk0un5noOn7qAt0c4/O+g/pafugP6pcc5vj5p6+8nH7g
OjbI2uJzJi/45jQzIyf39rnTU7Adn/4Y3GV2dAV0/nwIMntn4B869+B3/D+iK7KLcBLBaOjVXxoM
o8P5emgfEOYyJibwls0Te9Zyo+Rk+vPAoyeBpKWS9f05NU3RgC354OO42U/OhN/zD57R2fNwXdwW
XJ6/W2QX+Z348+RLjyyzfjd41+iHVk9nZ1MAAf//////////9CoAJbcAAAAgHS2UEf//////////
////////////G+q/YPPo1aNLYjT0dDNMvRsf1yONOGXGZHBEsn+v3fxyzbJ/Rw3f8M8vCXhuefFG
C313ceu1Pc4gvHxnViNuOFn76Xkujy3fqPSlnRvReMbPuDLkPOiX1m9KZ2xCQluaQxOjmTBz7ZJG
ePRs3SVn6NkeJzYfBZrZIPQ35OH1yHMuzMdD5XowqWRsW0+6NwHR4JvgkAYzbx47OZe1Y4t3YKfo
2ZEG3o8dfRb4z8im0zfuW8fPJ9FfuuuvxN0ZD6wXE3kN7VDbPuf40aW02a+Gy+k/57MCynRzSstC
DzxNHR4s+f0Ly6m8aC4t6JdlJtLJZ6Dt6JaTr2u1jejSFydnwOl+eCLS+6wueYtZ99AkLJgVpyyo
6hpUdJTskmGfYwfDZWuhkQu4WsRbbZr15Uv2dx6KTEQeinMm+mH2U6HpVxLmYehsL7JXr0cs6Hd3
jo6HDQq1jmW1pQsHo+Ja03AbEvvu4J33MKBa4dDi2o05rkN9VpczuGpFVjClcax4yCt8FkrB6C5+
R5YTh5yFYaIaC2zgfpr9F9MZwU0uSY3jno1TyO7BWyby/doGTx5Bio8zadv1hSyf7p+qTvK/NGUI
HPh0dBDtq3UxtWdHHo3Z4U2bqcEM5dDIZzMLvQL9EjdDHDNLNHR5A+f6bo065NBcW9Eu2k2pmjZT
d0aKTr2u0AejUEq1p8U1vNIRayLdYXMy2/HB+dEENJwNEIK08Bo2mkuWSzjs2sHx2VroBERIttXW
a/DLP/TkPRSYiD0Umk+KYrYK0qVca8zj0NhfZKRdEzFrkXRHR0PzQq1jnRZfoSFYPR86G038NjRg
d3BEXwwngWuHQ41KGctyfwXRWad2lUqgZXQQ1jykot8Vmhg9Bc/NoWF0BmyTRCPNBbZxT7b09F9A
BIU0uTYHibo17JXdkLJPh//cBk/R5hiozc6t35h65X/1fdJ3leajKFxN49HQQ7at1gbWnRJ6h2eL
Nu+nBDOTQDTmZyoF+iVld9v9tZPisI+Z171hhYzXx913fINDWW5BvRu2zF+hyP5kTkyI3xnZT57d
PRhcKxQJmxST8zIHK6lXFmVuVr/VutpTi+xwO2teZdtJuPDTUFenbWuy7Dv+uQ83d1Ju3NrNpoWj
VWfz3bSnSMjXMhG/B+/l92czf3GpgUza/oMi9UwNOsBbms4MfbMCteeegQsp17tPUOCHnXSJAcWf
nns9AUwrFknrLUcdaXNd9fr/9eejN15EwGeMtJOR4GKR7VlL4rlTgCxmT6Ge0lNUstmB05+AMB0Z
/7wn+989l8pH1lvlJDr9Ar+OjQwGvCmBnDffBRZ7M48Z5rHQ6Sxkn7l/wp/jIZNfp6N/Iy849vph
8CYno3C+0n/x44r9O3++tuazX79/n5PH/lN7f7CPz9ZWXj18/KXjxw/Qxoy9Dcvs27Gj/ZbASiHo
6HoU0/gXPgCTZLrll9c1m/375kmbt4/P7fv+N+DwUjcHpx/QWpQAGQbygBOD6OQ7uQS5X/35T7+d
+/6kzHyCNGUgvwt+1+Iqy9iViu2mUD7Y76LymLRraVfWebbsZrFoMFok9dO3xMHVJ46pPKAO+F0/
LDJM9Z//O7Z0ZCmzfqrOADIB5F0bTQyPpLh1QFU4WzM8W87ZcNxOX9UGS9+NXBSmJjTJ8sB8neaf
jsm8AM1UioG/HHHSIbseismmPmOj+lZzn2cS4KTeaG3ZvOE4v/FnNUHqoI9J4KAbS+Bzk7MoW5os
jHcYUwsB4Ls/GlyLIcRFss+I+/DEYYDMSwGnIh2ZH6B9unSOjZWbD6qRS39wW3dOwA13DJp6CJlr
QuyW5bxKQXl25sP/Ps17YoHo+tdBMLAmGAcID6+6UryVNUZD6r+bf/MV+//Pb/H3eXjj38TCk4xG
CMnji1muZo8GNkP/V74PazOHVq435fozf59Zb7zeryx+jLff10GNlt+Zys831nchKymB5O/oMNvz
Tkcp+3Z2e3LGl4Yf68PJglDMEzAYjbPM3lucyM/p+fAfz/phct0M1S+igxZJATvDggf0vzl8d0bT
DVAGlUAbgjg81uMXeA4cV4BGY6st0bPsc6cWjo8+Iz2XDiMh0dFj/Op8//7gz/G/oYDwZobu0eIN
TfkE+hulrPQX2bdm4uQNk9PPT747DjqjRp1jt8vAo8ZxYs6tP/4ffRyWVvHOD5kBSR8T56dwQTf5
W/GF9Gs3fNMZjtfjo2P66fX4nGbF+CP7Obcn7aFnRJQhayBnpt2ch99GjEzzTy/X3nNhxbg/k+2f
QesueweA6MCNMHlmM/K7fR+iuXr0fyN82fZzLSlA6ptXzsyez93T54fPE6durXX9wuJk6NeqVvhg
3/L2H+/ebGTcH7/Nv5sn17f7I+GUys3Ro6A9UgAZXbWGSzN+fmreQtGRkjZtaZOHWzbyD7FlBpbT
obJIFvRPPyvC3wn6CbzWA0ilOj7tbSvQAeKUB0UZzUYBPI0i5yBMn6OiVgYJsBJk/QEq/tBa2gwI
7a8SaKDzk2M+9M20AOj2+ZfrrCXmEZWCzo+9PH0Cbop8zXUPW/bor5ZyMjKOuGuvQ8bSA5bXcuK7
BmkijSn6sFgvTot100zyBLbX5qI+fro0eUvyHjUGsvj7++YzJERa611O2YIrv5bxNg7+6Jh0yV6B
k1uDoD5+cNTUkBRfs528a/fcDooMwsFY8+R+dRUiSS70BKch6GVAHYQrWycSDJWfVs+Sm+mzB004
GZrWsEDayaFnQ1nFZpXl44zG1os0TF+/TQzTNWSslbN4JrefBm/kH6IKRQqdAZZQh6J5gr+Q+Oxy
CFscxDOj9Fot6OKcCzjooyZtI42SB1lNkSZsLofSwIk2AkXE/QEm/zKB5YPR0RurJLqoM2Up+apt
3AOj3+tP3yXpMOgWdH5qk/GT9DPua6XFV1xXyzmkgKOuGvjpcdxcOW4nKSuwZpBoEp+rCYT16GdX
hTVs4DXa36rQfT306fXR9tk1ct0eWBwGazZEReBVA4ZgwvyC3ibC39OOqWvRSTwqDo59PUSampKB
nRs53Sa8DuB0MpMLKLH2ZL68K0GSS70hrOQ9HDeOdhQtDLxKMrduvZ9FP9tm50skiZrWs4a2XTHQ
EHDZ9Gp+q4f3XtQsB5m6DAZD9mHWENRIX9cIaZzxq2pkDRb020QsBi7mdHoMjxrjdBkGs86oo19x
c1Gg8tAlVwAuGRBDUcNHjEeo7iL11obULpDXDXIQDAwRi2w3WpqtIW2Admz3jBjx22NDMJsu6DI9
tVlFZ4MtxyKJD3lwibUdUIagb+PXkvfIEDtCqgJpxqj+se8l+ynkhp6X3Ida/q3KaIf64e6fWD+y
/VnHRHuSGgcF/TDFP+dW8bXXeNGINPQcZCxkh5SeLl77IhLL/bbbevkLGqmIBlBjxjUSBBtYWzJA
PshlDVtT0Mww7Q6yE3Zx5F0MJ6NdDQtXI4mIes6hqAU2JChMDgMQyf/wloxCDMjBRAhcuU52zQNF
yQYzf0Rhy0aqkmza0dVAQwf/kMgMm1a0ZlaJZw/mpgt0m1hlhlosOhW7lq3c1pLjc1HtBg7js7Rf
7avuZPhregaAxshrGiaLqToNOCF2784Y4ZEdNZzGYOVmyHCHGmnZsssndjae7OgKoBVVAIeHUBwa
nTUHVCqAhmlh0ZDtsOwPkabFtTJbBvkSG2hZ0whorbhmVQBHbdRaKvEHzabH8RsH1Bve5LWbutAh
BDpLLFAdxkHu1mGrDI3EENUDtDnfrQEW1CO2PSGYM2GHGJaW6/e1/WoSDA7IMYYvf9TYreuWj6n/
rTLZDQ9ANnRtbSVULBisYcup6cG8Hr8g+k9YQQo3/ELFt3xlLu4mK1KZD/tLDEU5Wnf78zoeuJtT
QGDoweeK/rOkModJ60DSQ0Aye+iB3/oOlZjWEj66dFY1E0rS2WqJ9BCrVrTmfXVVCJD8UQId/aG1
gxdg7/P7uXOfTCHWPeMdi6u2z1j9+PYCgrCge5JqFzdxdfWQ5kZz1nihZ0A2lsOiaGqoS1sPbRdB
D293DuxXO0/pGTIWerWq6j3hu1hptspBI3TJZTIkLmbxEhnQEPRZYXQR7uWLLBozJixaNGoMbFpa
qAm6HZoWs2bc6qys4fctIeAc6qgNqdHAWBkqn9VQf01EPamnwdNiDjvs9v7Fe7VUZaWz5qMLP0+h
2CFm78ggfWr90Pjx6R0n2kdWSD59q50fENWzpmT+Ox6Af2t+01kDANaaw51UBWgBiKoBg5WRtt41
R2hVQWcgQwjswi1+6dVAmyLbtRQ7zkheO3637JmIgHAQ52pqg4NWIHTb+WUbNxgstDQj973VmNUi
2wW2K0eGU2KwjbjnhHR2G5BC11ZuMr2LXR2SyazGJsaFrmsQoM1p9vNvvmx6HZ0bQVtms/TQNoN2
+aOiGgnUL2fspAgky3da75tUQQdPLf14gH+QlVQQGL+ac4ZBDjoNqDEGUgGOQ0YhdTQ4vDXr0kNU
VeD2WXGOOhkMTwU7FBZPTt9DWbyNhp15M8oaSQQ0GA4w+FVBCqhK1hhuWGEyV5BJtsOwMKeqSd9A
N0Q0Rmudtl1l0noie9dbTpWb0Pm4QwjH4rHTkPR+KGQTuEJNZRNH7Nwhk7v6OaCTF5/9PzzzQIQl
nr3vPHDlc/R8biBdZyZBHvpoTIVRjJEbqc64QS6N0wG6YLWeUxmSNSiiDvLhBpIRx9m171niknx7
6e/dP1dt3r2LCUWUWI+T9/z/QjO9u9butjNYYMNJG9ezymnr88nqwQo2b8IWMePzhLNcuVVZIRHj
x8yCCCNohHJ7iV7tL3k4e4l/9y4lmzZsXYsWLKady4KqIVyuGw2YQzVP7z9Z6OQ7T66wjP8oZuIm
o8Hx6LB7KKf+s4/UU5t8nFjEe9F09ghP2u5m65DyacdnPnh10i8mw5DMSZHvPPPuc/S5EE5Q42E2
gWgkc3SGLEf/GEHl4z8gQuXXEazZNH7d0hk7+9+CCKTFj3+n5ZIIEPpnN73prjzuZ7NFVKGc9IIn
QabhCK6NYI3rDpkE+uumHHTDbOPcRlyMPYRB3lymkhHHGbeMMBBNPj315ovH6vMF+/i0nFpFjPk6
X81/RDedgvW7rboFlhw1EWi9nlPp/JDl6rMx1m/CFnHu+f081ymotEPrr3f/mQQQRskIp7qV9JL3
k4m4l/9y4nm1as3os2bKad27wAohFXesZwj2Qp/YfrKHZDtNDrCL/yhm6jijwc2MxZ7tIpwhnH6i
nNVyLJo96Lx7JCftl0995e4nHZz549dWHkxnIZgh1YTzR/c1zlLmQTd0SFq41cNDaToKt3UWDu1c
wQ0O40eSaGMgZS6JBlQdvRrHN+7T6N1+tXfw9IYCW/aOfrTP1retIoMo++yDCQIYunu/vvoTdJKm
mDp2I+c8WfJNd0xDshg5sJJNLGqy+4utSX7t+mtsYmLM7IAChTOiBV2KqjNxGLwYGnMeb5+j4Z+t
n/fbQ1o5aej2SNxCylVpLDQfxz5+xMHk/nsEOyGhIdVca+jbx9tmMZsA2TWvtt2k69hGo6ZjxZSm
5//eWbJkoIGNlp7PJDoh+ybq9e1a3qCdJEECBDwYDYBfsXYIPbibJyHVu7pent+tEMy2mMYhcABh
ajemPuNydh7S+ZqdFoYzWUzanca7bLbbjOx3USDH1bNnSmloatM1whTWwW2hs1AOLXkW/KWiakQe
6Y5DzAdCfWMf1NFgvkMMLDqt3B8o6M6SVhhOiwEIhC7hA+ma4QgBJH300GpgttFq8yNno7vHReyH
OxMocWn6hr2lp48xT2dnUwAB///////////0KgAluAAAAHMJzjoR//////////////////////+1
Byag02Wi+h2ZoIFmP0HykQs4YXYMt4czVhqM19BT6V6ow/vo2ED3VXBCPf23uZstOvXmL6b9wlH3
vtzFkO67OoXGIbE6HrDAl1rwdmbF/6Tcl4Mu5oTclq+DELNk7MkhitUStSztKTbFy629n1NvDrva
sxtjK0MJC93ntgfj121oIGw6XhZsW2x+dmzhmb+rM9o+amlpbA6OkWsx0NAv2mS+wfYNeup9NrUf
3SMJnrQmAggQ9vOHrlkLYIU1iv9MLFoHaSToIsjRduMyad7hP/WMWvfh9UDkaCBDrqLF17EEP2Tr
TOh2luN5sWCH3e016MxJ3zX3mXu22/Vbvr+go9MrVOauGOxPWopxoCDCmkxkPMLVZSjFlpuaubQN
VYj7bZtPoh9t1i21ZveacBgByQZrZSDpNDUykOmsOG23MzbybWVkY9SbGFrv6IUc2wcs0Bg+1UhP
diLPrRr3UJWyDW0XjujvLZrvRtJ0axhExH96WhsPc0PKFyjtd47HZtulY7DFfRb7NpIYHFK3yRv6
swoZsX2nXdP0G5pjai9nO1pjsefbba0iOpXJ9rtxjSfkJ2yxFzzEhaNbtdXO2jr+WdG2nmyli/1j
xCr7V2QIJHeyxt9/QdYafMT+zes2kbGIM0EOufnvXSHR9XYNGMdDFn4AcWoJsXdo9+B3LLb1dZCG
uBwJsKN7N9CwlY+lrt/V9ZYGC1YIEIx8h0jH+iFhHoM23bDs7vXvaBoLSwnQ0Xi01b4X9Yt9Py9g
40NtTtsw0fexfMQINCelnsT7OIb7bYnBskH2p9P0emxLHTakwptKJBKiDA3MuWNe02h7KdxG/ZTb
9AYmgg237f2xk6fRtS9T5OydGq4kiYyOCL+weoy/jZsHuffo/fvwQ4P93z2eSF25aTx9+WH+L36i
rzA7+xwx4glPj2Pxgscsmng3RBqwQG5iBFB4/1kgQMYz23nD+/Fs54PEdRz8kY7wf2TJ4IVk6BDy
RAh9+yBAh/MpVOYz7pBK716CFDvdw99Ii9n6PDEd/z+iD9MbEPJDrvoi5jfu+/FrH0sv10lBCs3I
v3qwxCF17sg7eZE5pzVuLvu3R4QhjzkNDvZS9hqvUifNiesTYNZTvt1nCef3XMYhNu12/ni4khHU
O71ghmn8QTYUECJDshm4Qg+Y+wY+8cBuOiGUEBxHvefPbP11Vy4j7qzivYxXcfz41Ztd3f+6P3j/
yHHL/dzpZITdzctXDfmMPnh7I+Sm+w8Jl5xxx4glPj2Px4t2WT7wZAg1GrdOYgg8ZQyQk3RnYHk3
sY/DAc8d/jqObpm7eD+P0n4hyI5OgQwnzIZ92QIEMndKpy+eQsdIJ3usQQgjfSh2lIi9qP2OGP9/
zEEH6ZGPlnqEuiL9Gzex+LZvpHdBBP9Rm5+/eozGJDFdkH1IyPZpPTBF/3b2KhHHvENFv/TxhsaI
R7zZEhjhZxZuNDfZwnnN1zdEJ5sNvv2Hi4mjHX/P6Nk1ZB96bjEgjJBIhm4Qjs8fYesvHxcp5CnK
CJOMQ/vNTp38EL9hr1hr1lvfUGbU+rOxwRYGi3H7SBrxBguJ2Lj9QGjd3kapqZBJhQ7zcYObAEPE
L1ZzgzHXcWXzb1K5Z/wzAiGitkNlHlKu8WLFm543j+tsNUglaINH9QsX0sDaCF4fAIgr3FqriF2i
FxKeZ+3Y0cGupEO5kf7p2a+kj6nabdm/j/0+kHv6rNp7Vy37BvGN5lzZu27zLeso2CH+kMwikib+
HYOophq/darFz7RSGp4Z3IJentDxCZuf+ZhaO077RcP3aa8dkJaSDBbRt27X56BuaK6nDsFp3b8m
IakR1TRWm0yzLLEfbmMCVECCwo/v/EGM7Xd9HssbJSdiUmmkWXzD15Bsvulhlm5YIBxhxN2ofOz6
Z2QIdEE2SGbStM06kGZhhhu/rEJXmluabF7UbV1kRId9+60Kw7B4haIJpH9fPPJyAcYcOoahZu9k
DUL/7NtjY9B0FhwyMFyEmPV7SHQcOQ4dUIJIkEyE9dpIsr24NSf8Sw25S6n7Ef1g7CwfuJYfnVh9
nByDX6HSc8XWEhoL0QtWcp+ObMH/2aiD5IIVahKzq+HQIMOMtnI8Sb+hsLfYtMLokLViUfmuJ4kh
n72ur53IeMQIaC/TbqiTWxNTWy/7IMJqlB7t/D/RYXFdloQsXnw796HYR6qyy6AzkO7vtTvX0mpK
1oyJCyy0h8gQS8nPfaDCQOwIWr690K0xtSWJxHmEgyMrCnZzbYUjo95iPNrTYuXueIMAg1Oe43oW
R/w99K0gw6jSfQB9tJyDQdjzaY4IVaydF+v9RbaA49SZbd1rb7xApetXDIoNvkmNE59SaM4sMvEi
xaCw9I95uNfaI2Frzm6y2YPH2vW/dTEaXrsEJazdvVzQNQ7nQtZtWbl6Whn1PV2fQiN72GK1ol60
gabDZdz3rdzu6QdjN5ptvBvtNghk9SmQOhMo9dp3XufaOtHYrN+3CbZ21YRf+hsCSLFp5CE5NN7Q
7DTeRe3XTkGlhbCDJ21oqIvLYWOz2wNjUY7w/fdEL79tHmEyVrQ+6jFohd+QId3LD8c6ofxmRL7G
0NLOHtqGgxKfU8emtK6in2Y167YsddkCCZBgo13pjuvDS9xnzcdBCXYe0LVhJoYcXL3rvckEELFm
OtHkhCKFiz1jRrSZkiH8RTRc0XQNIZ0H9hia2oPK2mjU6pqk+8Qtey2W7dSvrvu/2dFBOXIWHcw0
2KXGhXusaMdHVTXPGa9SghRqP2ixak2Q1kOe2xONL49IddtXNo6/qOUbli/3DUmjVranf/kCFQ/D
l2j2QP4aj4kfDz3Yj8Q+O0PZfrrExyTO+e0ed3/MggLFewJKt77EUTPL+nv5CDEE38aI93k/mBBo
TSTu/q513PukDd2WryRmg/fH/vZ8Umz76CLXTp2Y/7yOa9l07iUXvYxJ894gx+son64+Q2T9AgZ5
Vx97LpYzGfGiK6d5fMIPjNP3jkhN9vk4Mfz/9jrKeXj/XR/wkQ3iXyGUmzz67qUtP5rvn1XA2MGQ
kh/r3W4mPZr5yBDNz3uocfKYkhhJ+hNNJe/f7eu/IHv56uufyaSWeCR/RXriWQB//j0/t5Nd6Ofq
EHy5DuO0HUOpGj988v8MGRqTv/CBCsvx5JI9yQO4ytSj4ee7H81Dm7sueeujT8dzt89oze+QlCsc
HrFJ0+MHcDzpfmOiCc+6qMd578woNKaVy/mLvSUugibu01eSM1HS4/9g/hTa9lGw209yzGcesZr3
/J3U7rmxPaXv9d9HsH6nCGz2gMR+dcfez5M2Yz40RBnmXzHT9HqUsEEHaNQIdgx8/82UMpnePoId
/+kQlP85SbfPr+py15mkuSAuPXsGsSQz15AfD0YzX+yBDN33uo8Op+Qwl1waqSx+/29JeQO0Z6vP
35NNL/BI/or11L/LP8YnNuuzXuu++oRk/iHcJI+UemxD55/446Rh+73eLvSfj6SlqIYvkyDN/ngh
m05BFG+dG1XBMOG7pnWmtmpxdZm9O5bRfVtUNaghchRdItKRyQOPsezPbB/JAhoHbR13my0oYdC0
Zkvy26q0EyHaPveUg9Yyq3bhAT9UjbsG5j2fpUJVt6ALqY6Y7J72M4skMaA1YQwC/8oaA3MrD4hh
ks6Bbsv/B0/9Pd8hZuETotM/ZvOwsbo2077UZhdJtSwQ0veAYPj3YNnFmy04tkLuNmu7KKWUbHaJ
jGtWjWUxnOjPrrXNuyQdHGE7jAgxsF+4QsW5tMTdO9y13pz7UjiSSrmmnr39QadU8NvHBAghTwIL
zMEEj/aUDJRY7IXPpnhM/z+c5CzYvNLQQQam6+2/xnDwQvtDQ2NlxFouHfH5If7aEqQYfd8G+zFx
p8xIhhtkJP1etvCDQR6pOfYYe7uHN/H/HYrFhOHr7kCBDOoalGTonva33Y8ZtIX7ufpNzZeaDtTS
QMQw9JHarvJDAYX4udX23QtLTQdF76mmWN0xGbmCmLBjEAgfxrCV9DQHR6uo9e3B6tHxoM27GiO2
n7C1vWLeoaKgzIW9PRMO7mzEaSYxpDHa2NlaNbDHYbxuzkDPY0G5atXptsOENDsaIGdhib9HbQzk
fId2567zeTqEiBwt4gQwublhrNSeoLF7Rmo9OlpejaTpd1LFhhsWdS9q7Yxmt2dTb2xsYGd+rl+k
2phwwXc9qLzQ2pvFwFcELHWvh3Xe7/kWi9XViiF2uRvT1f9l9GDiYk48Zkv2r2p2mHVbrYk1fsQv
LKa57BC4xGzY85BuQxmyzN2q6U0NumWuDAg/V0V+d9e95L8f0K3qDtlWZd2y320tjIgwTWjNO5IW
E9YaD3CBjZnu87TaYK6wQS9YuJ2GxpRRu6Jc0NNo0tKOcLs3dQ6YuFgi5nPYB1sOeyZou6Rpl7+g
XapFNu12/c7i5fStP5ru8iN7USBmFpvNGo2cJREJ+yGH/V9Q16xohAh2pZG3Rrl5q0O0i16k0aRo
re36A2ppRH9U0ew7ZqPeDIz3187V1cMxINB2hGWSz6xeutxAgy6BRsIYzZhkOikgj41A4ZCDQc39
W1JmYheO7VxabPK3Yf5kiOJ6vdII6ixHAwiZgsS6LMwMP+qCrmg9/nFnGEYutV2kOm9CpwZXtdMu
6mw22m6JkuWdIjogcWJlI9XdAY9WIMWh2Q7dcYmvpuu67hiYdAIN/XZriZF/ESFi64Pdi2jhhjPd
Syo41huvH90QNrEXe077Vqcs2Hqk08tN7pAggaMoBFISN2sd9/iqTijIZtP5s989dQmfPzp95g/f
6GhXHAvuYdmc90l8iOOUm+aPdxXjfd/EB1W891/hCEcN+TdyCHRkLBkXx18g8ZG74+/TneFGRvKj
3sdK690/Z68/o5S9e5ZjKRyHHeYnBDjkh6YFiT2iPuZDHEgaE7hDjNIe6/0q4IPUriOz/hPv9z+e
/pZST77rv6X68b8dd74gS+5/cJwYx5O+DxAyFcRcTf7MYzwdLEZpQop1vXcxmuxxdSrNS5P0U+M5
zcrvmOkevpbt6i5nu5CR0EI9M5+Q7OOIybqv9zGSBuSPbuN2J0bB6OluX8jjrz46jjuZ3JTdb133
vIdEahyHLqLhzwe73mEkvxylARDAvuhVqT9kEskRxynqDf93GYxk3/T4hIhUMWOv1FiCQLuQR6Mj
Z6sPjr5B6zD+xl0DvCj43lR7GOlde6fvuvP6pdwPV/50jkCE43BiHE5D0wIzntkcTWCBDH7twhxm
kPY6yhHdSuI7P+Lnebv89/SOkn2eEvpfrxvx0lGSBL7nxwfGDduecH/AyFcRcTf75GMafnTxB6UD
r0vSX8wlMXk6zDk/fIObJ83a7kZCEespjeoun7uwkdBGMPOckEjjiMm6r/bxkh1yRS8/J2N7Fk9H
TAf1jCGHx1BADcCKbre7yPPvedEahyDbcpCydDQs6G3KqBwwOFhqZJFnNtFuRQQ1cONBjZUdHsIB
h6KHq2OLXWVnZ0ULyfTS0mQbBgWkapHyP4dsCfdjtA6LJWOonNwgkz9JH0Jp70rQ7TfqTYjouhHS
obCw3c4zNy5Fubd1i2g1O2js7DUOmP/kGhIgh6IYWRK41I3rn/Cf3TMyNTRGcWo0O0jm58xAgaLv
kOkT6008/MXnYGPyDEhZY3/BkbXvm6zhoUUZgwiwWvWWOxnbQ9CKNjpFCyglkKKtH/2NAzGyddcU
krDCwWbCOEDIIIXb2NVs2EUbVvUWlnI/cKIhmdrymk2x83u2O6HAi3a62SyVfZoWEybyFlheJqYk
W2hPZ2dTAAH///////////QqACW5AAAAULWF5RH//////////////////////2qamlGgmsszJ5jY
mjnqDc3NfZ2KwZi6Y2RFpv3rwcWvarq2l6Zpej6TpWkhg6lqQcGvt96+0Bh6Zouhmtshmm72lqGp
ZZLJJltZvWNR0HxAh6zoTLoB7v/3m6/2e/eogQS0zS9K0cHj32k1kZ0nStK0hjZLVrU23tp7TutI
aWiMei6NqulBktCbW368HBqmpaG2NjIc9n0sHvcP517S3IDtMeo6vpGJPmyymaBfzRBtm9da8pGr
qwQbrmpapd+fP0sQfGoPlJt16GHQOruh6o16nc1dvDq17dNKdi0d7uq3rp7yLDcvWtFDnsWdXS6O
mn2ZFNpsWmi54PVs1TXA6L2rqqCNRVUEB0ahlNLUJ0BPNVchLOeznwQMmj3MX2IDGhXo71who2ia
LoV5uag7raPWNd17UGEzOytDR3ftMjmy0RF+0z2+/mpYT227D++8I/7yfu4jho8jDRBv3cZkeGpC
H741y0TU2BvrrFy5mweLVqUfXgxXODvJonG8PBDxrgYGiaoYhzygf5s9WEqwQsXP0jVWerthO7jp
NKEGiwwnvaHzu4n1mbV5M9uzerTNca2NlDI13VmsxtUuaLeO0GtI2u+d23obQ3aHo7ZrGpMrI16r
fuMlgMm6ZXcu6le1u/R6zN/WLGO+0UcnvWOFumFL7Bdb9SdGz002eztiTUkQSt2bDO267DpQlnOp
kNDZNJbdWyh0vVrerWEWDVbxDXw4bur6iysrYxB/NFpKA4G7tbCzY53yHiGX9bvseGxrtYs4PfRt
ZsIsmEGNk/0z5T85rp3ZekHOQEQaO2h7l3TNJZLb/zfj6P8dYx33jpsPcNrrfd90a1Y22L7XtsNe
qbNrR/2eB+1Wzj7RhtaltbUu4nc7P9LWl3q803pV6Mws7sOrWLCSOmws3Rsdt5sPoDKwavoDBoDO
GNogeqqgkPIhZ0hnYMLZGdk1wj0ghL2EEGtNpf+SD+eK2V7bEaJ3qOrajeGydNxu51E+rh16zcbN
LDCDE0HrCKN1rTScyLOwdIMFxrsMBzPk1//UDaqd+7OiG+1YwlUV8Wfbw71HEX5jnPI4gRPEPiBn
s+4bp//96MSR51A/qY3lHl6FIjpen6ER+DxuKr+MP4fU/3Xol5jJCSFPORJEJ8J7D0Q94R5o9Cxu
OBHEHIkX7xDz1B6gh5HHiHLcYhzEDwKqchEUB+HxM5iMgS70ePjzEe9D+w818jwQj0zABD09ovnc
cny5DgRI8iC/RJByD0aecRkRDiRsc8esPNVR/8un3kVWYmSNcOIA4FEcjcY5csuQcVEYqeyNRXf8
EPzkh888vxOB0Q54IcSPOwLljlHL3BE2f8v8P4nt6jiLLxygVZBwL3/kXxAz2scIf+ceg3EcxFZ3
sVHdVwkU5TxP0K/+O43EV/GPPJDqfkcfmXg8yQh5zSRCcC9ZfezW/9g8TXdCNjluCJo7I06WIeco
RhOKIOibBDluDffqac4IqePEIigPw+JnP4yA/nruM8s/j3oesY9NfI8EP+maGQ9KSL53FOdyHAiL
kQX765IOQciaecVGeBDiN7PPHrLvUbjv/L6HqiqzEyOp4gDiYjljjHPkdyDigjQ+Hc1EJZwQ998k
Pnnnn8mHRAhghxI87OB451zNwsdHuEPYibbTjVbt1taZ1L1SkQuW9Dez00dxHkEbqOoBiZ1Jl4KO
tRIKsiNCflZaukbKduCpC94I27hC5/Jmpt7+l3ZvpSQQ9hsPOpOcg22iFdEe/If7Sd/posHyGU+6
Y7HXeQue/G20q2xrkJqtfbY1AQmp0eyFruRHNhjTex0uk+v/Szm10l/0tPVq6RuO6F7MxcIImuo5
xg5sYIJZRm9ZYLE3bjCmap083aGM4x09khepgSRA6vnmfW+6QirBvdEHM6rXmLZiF68Q8ewfPUIM
fr97natEEP6AE11llQ/aZGTkoIMBzCs2G++wX9XdQ2cOyBA0VtAeHAJypV8V1wuQQuEDJEIIfe35
HDo27DRNm4wy03u0ftzVc1b+P+epwiQ+ZG7oVoh22sllpYL52G/YZnOm1cGhJrYrLMH4Qwftz+xV
jBzMFloQfUT3OrHfzf91iuuT1E+/lFgYcp3rV9i0dNK5GoveaGv91oyQvQ0saCVyfvd81qSCRDUm
DmzY+3JXk/WoackGdi5hNqYDSeDesNSTazMbwl0aLXXzZs5t6HlEhweI660OGZqQbutE6fPA7Awt
De2x1cuMl1mtJeymhnujWzRqFpo6IUmw9NiWNB0X6eu9MvdQmwpV7Cri67PUGEgav/P/qMd11ZCX
egXLFEL7IzMZ3jHd695NK6fohGhdtuCBDvyTDiUYR/bvQntFK1NwbS2RiX9jUNA8HBfRfNlrx9DD
8Mv5rIDQPYONFpmEWozaiP3+u7LdebUCB121jkLOWqmTtOMNBAh7ogQ/b+lzYb/TQ1NFi1flJFyE
fN00W3rGSFXL/yHkG3GHZcdtU+IIsRC9EmIWGhE5C3BDKCVogwd8cwQwZyH8NjA+LnkNGvNaZrnF
aDA1o/qDqE2IxBDRLiSN22GLoGq6ZejxD7mIao5AggQuUQx7rpByKVh7edUt/av+hOydhwlXruSJ
jaxpLY6BC00JM6Laz3Iu6J3Fx0WpZDldtkWG52sJq0D3unq+i3G7d6MQx3ezZtw0QazoT1ZTedQp
J8/Rch9JLULzYmfph0RuZq4+c35udsB7eP4/eOQz1g+GAIamlV0zFc/Wl6JcZ7jQ5AgKzh9bbLWl
ZYMtMGzTT2Nssr201Y1fSRA91gSS76w3fTnpR0QexNpr0Nm133Txm/oTG0sCKbOQvajy0I9zk+pe
+iQtXfI3rMGZkzoBMJr9ibqJmJkaGP16Yw0d3rHTN69NQ0dW/GN7OLHTVHV7O29apoozzhC/F+iC
WL7kLrE/u183h35njn9xn2FD8eyCfn/xP2YiQfr5nzmJ9/1O/U/zXPgQ3H+/PXGHJbjHo32QH96p
TqPGIKM1/1YhoaPdkfpexh43xrXFxcOU4+QIEOZvm8Qev2PEPeIciWUCBAgSF304RCO0P0Ll8LFI
oK7UTkMPHCanMT6CEVVS/4qqQ4VSNSPBD8ewYz479E48IhJ4jtSQ7yjc8QsexXN+zTTpzT+/Xvzx
iIr5t7w48oifOLdcIIIY5IQ9O+4cUVmj4fcfiscfiN/g744GxH8THHJD2V8594hJ4n78jqQsQ+ly
IJ+n50jUQfr/VOc/39/9eIP1yn+Y5iiCD1nvzg1Hh7o2I3xxP56mk6jBiG5PH3rENLT7sjP+8YM8
GtkHELk+PkCBDmbJA3iEx+x4h7xDkSyiQIECXBJB9jbQUn64D+oCwQIbbG2xuQo5DDxwmpPE4ghF
UQl/xVQhUcfoxPLBD8Ywbp8d4iTeFTniPpbJBLNgVzFWXxT9mmvJvvnx/hj71H4+blveHHkQqJ87
uIXCiCGOaMO5CvCivxspG3r7j/6wQ+LGZd8Z4dGjj8LY5wQyQfNg73Gnq67dUJNDt99gPZ2pPu9n
q7hAf2khpOnXo1XvGn6xeuQzsGZtkCButZDgsdWVWnhH/6s2iFzbbyw2uoaew4dTxcizA07nTJJt
5qJ6Qa7Fix0hjEED7GD93u7qOIx0gn5K5csF6CzQpY/M/spHdBBCWpphHxDuCBD/iP7RHpgY7GTs
KaN57nVo6VrUz+ybHLVUZ9Hk9DuPYaeuVrGbxnfrjHwh3/Hf7h9H/cc6UcIT22Hb+mHohZq4h5zG
wdjZqzm1bv9YxXV1jsmYrNl8X0CCHRBgINCBhmZEFWpHaSFmxdR+xygmQs0YhqNo4lgLL17xBpm0
QSu+Y2RG2QPZOyfZ/NL+1BrarqXUV3oLAkg1XbrGzBhafo7Cjav3DfSO01Ed3G25cIXHZOU+IevJ
WnYDtGeo90QsnSIZNdxEkET5Te9dvMjP3OLTWiGEGBpelkCH4u4kh37x7+rhwaqdshhS/5BO/aQz
GbER/ubaj+gWuq6taDof75rGjH/+50Ljlir+ooVzw/H2etSYXuoEHIPg2cefqUI1K53DPFrLVolJ
H43Gi5Zs28dWHhgv/QjpgzFy4ZJPtI5zJeZUkGHyJC31nUe7Vxk7Ymr6bIQfnyO/eDtPXpx2YhlC
xekhZQdHRjI1WE2xoutWpdHwyZQthwXWNptpahfup+bGk/urKWOf7OOWIvwwIO4789kPU1oodc/d
IJHvRCD1LtKV+Zr+qa40d5MZ/u2thD5A1yMmOFgivam4mIdn0IMhj53L9hkOgjZ1Hqf6hqaCepX0
+Rk72GFAgdgM0me3/PXzmPcvpInIXUoTt9977Gm6HbZLyTAQuWCCbS7TF5AhblFJr/YtWek051pC
0wHq4wsl2Ly46us3WfsOEn59nseT6jBBHCR+oIkbJu6N9vuZS7IIJ3E2iJY0yEmYrKKFgrelLB9c
zqdpsYbubln2gtKWLU3MMpBFgZE7133zkPa/ofegIyjqHd/BAhNNrxbO0pXWFC/0mka32/2ZAzSz
/+fxrhBqIReaHY/fc1mmE3rN/zC8IkHIHS7f5D5uBG/oPuiBDtNv6eEMWf6OznaUmOu482Idf7uo
IHIZOnkhd0DL9f1axfj3+VdY+9vrt+eNBIJn1m1aT0C7dYG9vbkmuylqbI0zatM5/EI967hDqx+8
ZCv2Mz12lE8zdz2k02TNGPf7SOi2aTrV+NA7YLtm62SQ+1XWixm5ZZsMfSEdoXW0gmx2T9W9RN0Q
R0fTEev+zh4qn/DhTeEYeO+FT7imn00G5kOfPBAhCNHnPceybuTYy788pz42f4GQwfMHeDZOQO+J
Idez/h3G+IXaPzP4X3hLP/UKK5ybPz46qLhvmM5R4TNl8/Ru945URflGa5eLdfzHPkQwQgg+Ymsx
EdeN50zewaD/gwkzwKkI96x54uZ7S8KrnlKXdwhlKYf+fPPR/xukzQ7n6/z59dVNeRIHn0PPuNJV
7wvx/G84c0uEzPFBwqQ76igjDzsV0hOD04ksXHMKodHhjL7z9T35/8IIVj6XWcZNmPR+If8Psb7F
eSinw+LiaDSQ65kJrGCBCEa7nPceOY8mN935nTevdZzjJDBDCR/9vBs9x37E4IdYP/glAyF2j8jv
w+9Jf/7ETFc3Nn58IVF03zdSL0JmO+f2LyWOVEXmM8sFuv5+Q5EDEIIPn81mIjrBne45sdR3+MEU
+4mEY957GHi7ntPwqueUppXCGUp/7+fTPWe8/FcNHnP1nmj1uR+RIHf33I48QpKseF+vm3nDmlwm
Z4oOFSHfXCKrl4KUj05jxjwksPcd+hR97PDGZ9vvxuEve4fwQg30mgz3kM3NHiw1IIum/dYXmmTl
o+j80yBiDFwSw1YDA5Wkh1LvvYu2+v9acHL3NkEXLhtv7bN/9q/ghGh+82+Y9VYTONG7fvtWifva
+9hzENUQIfcg1XmRnYQLqCVtgT1OxCJCGti1FjaNJ22Ft22ptpGluPRCLj/93YzoekPoJ+qxm0me
6QRZdEbnaOvWmiLOGrQu7jPcyQATTaCDsVFL/T4IZQP2hE2PYIVRCwLqz0l+buED/8fk2doza6IH
Qx6+dip8vhMhyvyhyIfjrHGSFzLV1yIcjkGxpYHKa7p/OTR7Pr0IMPtJS1UO+6QlI5qnVwisa9lQ
LOFHTVn9jUGR4R7aWLJCyyff9i8x+1C4Qust69FZD20OjuGqHs1MNq/qTtoZjGQYc6Vq4YQcmbGL
t9hqmR2jQUjNyJDydiPWjke+0reo6CwtXVvNyx0Qbf5v2suGqHtmwaEvsAmliDsDPU9nZ1MAAf//
////////9CoAJboAAACmzPTOEf//////////////////////habNzQSDEc/2hg1MNwPEMtuIajpB
Bv0CA9m19Db7V1nxcauM6l3LuRe+YSKR9U0ONBy0YYHT6f5Mgje0BGE0eP/JEEkOmszcQz079P0e
40P3o1r8fT1C735HUdX1Hm9J/h9RZO86dKAcwY4vaOibtla+0DaNhMhE2UksW71jXgxNQDK0UOLV
7mhQQ17uxSB8PaYjS5vpp3rrDN/UM+vhiLPdIRhtN5ovNTKk0hhdVxZNQTtpELegapqL5pJ8tUGQ
yfyHlhCxuPmsfxytJaNo4dOk8sfllvZbWNE6VABRJux0/e8E+0S1KksmwdO0jFlKEvXv4PspbVZR
Y59b56aHJZyhT2W5h9Z1DU09aDDDw0VAM46Nz0XUbHzd5MkQIW780b7E0sNg1lG92hHLPVTnRr3T
tNxKzZs37LS1aBY9aS7+yMR9enXQ0dTusLTjVsNLPLTrOmp/iXMvbZ6s6q3W37tZtN1eZ2HLG0Jo
65rXpqy+oVx0JE0XOj+aLdJS7Ufppaa+ZC92243TSfQoQyj17vH+KXaHbVoKqgLrRrjUGEx6c196
TFogkmwdRtNC70PKewfQNVsM9jqDeSSTvfMk1Mmrcn7G71JBK5qiPpSppa2v+DmasfnV8NLEwN17
+UkOq6TacTn2lNzB8xBGyzNR7t4yWpWMpfNNvUNODBIIXP3PSihTFoTRrusaAGF2kbpp6cxkuOsW
V7Jw4qM2ww+TIXh/zH6S+QDE5yQYjyQ+iGB9itNWGUpJAgQhrtWrqfvs3Cau/t4aOhdT3d+wap9q
QxnGk6PeTIdJEDf20fsweYc4aiVi3ZtSyN7RYy3WmBqYL1nYVaTnydHg36AkiyNTA1GsWk2m3Zv/
Yp3aKDkEhRJuFTw/MENxwMh7hXEfNF7CGT5zgjysZQ9WD8Koh9G73/0kHxz334zXiD/nvo6X7Bx5
SMQ4mYSHVfjufYgWBCxHaRusEK946BD5B7v8dP7eEPz6PiuX/EPe4vSEkY7IEMoGIcIzwoftja5H
wesSfusWnykb2RkTGeZiLkYS4P1UeeOXrM0R/8yBAhMvGT5/Mc4fB+bxnlHyGxsQ/u/pezFY5whB
D8Y6If3HKnogfGSGP86xRzcuCbnz6X/WOXhHiEnQwd4tRAJyAz5f/CuU4iSHDFEHIEKxQyAyE8a5
Rk/RA3+oIRYQchc4R7rgQnh+fkOkfSIhgc2PeRQz2c5sxPKydHwjd8YohlG939yEzjmR/GXrxB/y
l12kQiyecykYhxMyShGYSl8fFihY/2l0hghGPZRIEHm783T+3hD84j4rrR6veIPSDkY7IEMo9c+E
Zqnj07jOwJ8SdKDZtPlI2D0R6M8vUXYwlwdCv+f/L1l6I/n+ECFbJB4yc/5jnD4PzeM8o+Q2Bw/u
8p+PFe5whBD8e6IZ5PRDvByGM7XFH654m4/efS//UblgR/wm6GDv+0BB55nP7/CuU4+5DhiiDkCF
YoZAZDlA4yfogbPUEG7wBB470bVIDxVQOdbjSQ7Yxd/EpaR8hqnejt/dJNwfwdOpEwwOwxjxIcDR
7UA68U4cnFoafMdIALae0em6SBv/r5BLRL5k2pNSA2Y9euFTtrXfvnTsI0eCEfIGa6xmiH+qtpuk
w4uC6jrq4+iMf+LQn8CP37mg4Pk3LLcSn9zO8SnG8YCGEWSPskbzUfZjW4196lCUGJyF8GEt1JBs
M+W2vEkCVvs5KNKzO21wplsdN3kmvvrHZBqJIXobjMGl9cAwPhihw+nX/ByoaYwRoX9P1Nq1agQ5
NbIMNjrh3+TJHvXyCqgR9R3keRsNjXET5zOQQxh7UdWGNktdWNBYR3Gs3aYm251oOSGraUGYy+Zt
O021aDwDu1fUj6wqoG1PQdFNZDD0kMAMD/aD5y36t+vHR3VtiId5TIX0/e49kNCZGdraXIaM3NbT
fIJXtI0DTtNtWR9tGLJ0w8A72loZGOzZR6IO06kfuyQidOZ9A0Ow7LobKqoH1g3cEEsabblDOUrE
ZSDnm95w4VVDd5gvUg64TM1R9HDW2YNEeIagbjrf+nRbm03o6n3mjzH5iMQa3bWDDHGhD6tt+rqq
D/WMzjStC5Ia+k2dJtgYuBoaTk+qyY7Ba0RGkNWitR1m6GAqoGatA0Jp1IMxVQYHXqYdV9NPUgEa
3j8s8ozHH9OZiO5q823PQily60q0SH9iT0MgSrTNTVQC6TyR0XVDsAcQdbjedQYHTtvnzF9DN3v3
bnOHMGfkwbE3PRYau57S+jGdQ9/rGB2VIciUvzIJZ7iMR+6hewhEXYu6nr4eutehPF0OHUc6i3MI
YIY7LoTAGEGA0WMkLOjR2hhCkM9Wrl2bmOtGtIMF4TcZh19ghDphjFogQnoP4PjUg7k9ZOfQ9KM6
LNzsWr9xrDmD8uagHwzIMOrh42w8NYsh0hwB7kNRWhjbQuaiGsGffDl1/Xe6JYp1VAqqCQ+4TvMw
b4aGY+5sMO5jVEmskevaPbIXUDfM8e0fhCCVaKZseP2cDae1VBKqhm5wRDKMGSh39VQGHRdDp18O
fQ1VBX/akfVQ+D6m19KqCGBAk+A5+TXqzHJLwDI05Z9UnwkmPukMe1jVDJGIWHYfIPjdR/cRz+zc
WSOLLYt6kkhxoc9ELlmAGfrxBt6O8p+YtSapOg8ZO2inNxdxowymaWjU6YW6+b9xLq7exeQIdeSj
XLHVxpgONN+9ENyYnMZ/57wQ/hK3kNJ+R9UaOSAdYct7v+tXMhi502/qT/d3uxUz8OhpuNZz20E2
p7F25hg1I+i5IdkIbtSvXQ4NYaGpttf7pl61IhVlix1+997aaaBvYaGhKs6zzYGLigwTJC3M2YfK
eTG9yaEsIYNzMNF7r5sOfg/AgARlODyibOMJ/PWc2use5Pd4RuKIMRAwR3SJD5DHkzuaX/jNvKN1
D29852pqPXe4yxXe7naeTmGiQYWEg0Xbl8g1VE2KPjDiuNBvx2Q+jNn5BLF5Pqf5Mm1+tzL/FUFA
ZfkmpdwD2pzkc+QPXlJ2joTDxIet49FYixdjGLLDnvYsb2eDc0tIiDS5vJPoDxjHt6kgkkQrgQx+
fW6g10/DJyAN5BC0Q7FY2RbCGIPDvGyQxUUQ23ps4kgpl48xIZBBew/SMV+ODvSCE5xj03cdXb//
9d+xTJRjYQR6IWaaCNqHynkxsS1J4Q2MGIdexY/N5/2vHr3EgARISnGUTZxhPJ6Odg6N4b3uECog
ykDFt1Yr5DGLh/Gp3/jpg6sMyHqw6TW2npLcD+djunupXMnNysUxMRBpvXmkg11E2aPjDzdaTZjs
hnCIM2oIJYvJmmOrjX71ua98EQ//Bf3JNS7gd25Pkc1hHuvKe2lDgxkCHmDGIo0WbsexZYu+7O/n
hqDU1cCDU/WEn0H0YxgBPq471wIY99/MFbs14/A5yAN9BG0Q74Wsi2EMQ/cO8CIYqKrbemziSCmX
h2JDIIL2XsIV+OPnIIov3g3pvGQvNMfQ7xhng3RkbCBC1TRU/qX31KreVKM41lDX2Q+onqizMpVc
Krz7z98japYuUlZTQQBq6G2oM+oanwv0qpUuVJZSYbFMqCoMnR53mRp0GydQy23tBVCqClvOi2oE
E96pqnf1Kl+lS40Ub31lGW4TltOoK2caaajY2Ktza12fWtt40Zd0kBRKDOhBd024N057UZNhSKB9
39qrzJ532HFcQUhQqPm4m35yZSevtArULZUSBpxiFAKVLT+2/iAY1NXFeVMgqcpDxUT4qmrLcH3u
rUBQzuKegQ5V9RvIBOYA1X5d8nUm1OpOVXFs7s1OIIQMutpLf+Y2VD35tO9DlGhlDlSUKiqDao6h
Qe2d7Sk2K/Tl/z3nvU9SNOUtqjoZjTQVVVpqCezY01ApsgQe2T73s+utE2nFGju/UElarqrregpV
HUV8/570Nmveo+uT3oUKFFRSkgaJO0cxpqGqm/vKla5IOUsVynTV2U6UQpkd6pQfr1Wje2goEIGk
PU0HGyn+8Y96gHIIECDvJNCBRBUO9WbtCtR0KVSx72OL+gqJo3UqspZ9qp3VDlSbVDVbZVOi5PcQ
voFKu9soN+VDV86pqinoulB7RVG86hq1sqkVYUFty98QFK9lvNtbaNXUptbQoULJS235D6FDu9ij
y+999BUNNBdEoOqGiiMqtBV7bu0qt7bVXXA5IoX6lb9+8KKuyxoN23iByqfQVEUtxBUORqRB/GzP
b73ao/uHWyY/GtWYUVyoLUuqfQKVRd6SQ36QbHkHPy383ulT4r2nVjTe1OrKLW1bbKFBtO26BCtT
flTAqO5VAUG0UEHtEmkoJvee3bacIegnP0F0JVVQb6KCnVOCnVO1UcbZttCbRUhSFX06iainECtB
Ageam2+HTKapUplO7PB66t2XqgoH7wVKUtz8/nWqygkCtUYOFA1BKatB+mUl7XUbqDxVbtSoKqzP
QSoKtu4q7Kv7+Sbe1I26VIp0oDakg3aCpaC2zOtHOXTQDkUGdQFAvvS5vUL/yc77FVGf2VHKiyhv
Nvp8uqag6g5s10FOwtqp2Kl2QK1W18HQrRqD5d2qJVWVTjo2QIJRmgza6mnRQTyWS6g36qgbJKoO
/2W5/QQfOp5NYlUaGHJHObWg6gqH+iaApZBlXb9zM3BTIKQqhru2kZdTPfUBWfu5QYoxqJAKtOyq
XeSUujKjUVRTpUEE6Tdau98nSKAnbSqUg0VBJTvb63VXKoSONq9ooSUq0pHek0VAgureVLU0uN8+
D1aPHN5XLnc76BBwvnoFcVyWCXH82oSltMUMp3Pk985NXalFBNsQc4Fc5e8qQpTQboO94gFQbP+g
7THW3rZePKXCpLsY/Yp22faBBQU2lNtbd23/bd0G3H0CvgJECuU3HnKXLyF+rLcYooqrtquC+JHP
eEUAmX/3BjuTccp5djPnSp03ggxpobSlUFOnd3128V62NnKGWUAKobGyU2xD+Utd23Y5kpBpU5T3
pbS2Wc7ydoZ/Y5TpKdzaU9mV2+X/aHYxxWnByM3pEdkmXKDnubUd/krDeWkwDahte3KG2+3q93/E
CC7kr211dn+05DuF+9p5Pfk9mhAq0cd32uUu5nfQILXzH6U8pR7tl7S/u1Da9tpihjZcxNXvN6Uq
cUG7ag5x6dPJXupTunv6qDM4guoVH//amNm+pW22THqEoVNdjLDZbYg4gGym227a2qt2Y3KoNuIE
CuAJIIN8puRdpcvIWtSluPUUVV21XLviR33L+dr8HXnMm442ZdjMnTptjwQY1UVJbSqBsbLu5i0C
vW1slQyygnqpbW2U21D+Uu8djmSktbXQ49vupsos53k7mgCC2ynQzu209oOiVoOtE4xyk2OOR7GW
l2TLlBz3VKO+bUnFZVmK1KO17SoqbqZS7v+IEF8lS7bIqp/Wza+52bZ2c5T2aPQKIO7NFQXUZSVG
nRmgu5IJ1d3Jz5SQUwpdH+qS0XGqgoSz+SUKNU+lWeHChvpNEkF9qylRypOKoJ7tm6ClVN0NkDcp
R2k3tyCoW6oWukRDTUVVfTmN+/SKQulzOqEMWcqrUU7qJpm0/NA0ts1CmKuldR0Zd41t7LQQbUkG
1XSQUaSi+9VlAcaaO6HiqDbjb1RoH42NyCVVT6LxBOU2Cdte6CfNrX261IN5NgUp7tFCqkDXlFXr
TUHPHUHeN05lJtNFrtzJt3FSlCh57/Qa0FKXKHQ31Vosbr/FJUPKQlPfiubdQK2ryoapqKhm9X+2
43FCZZQVVNZSc+1JVlXt+xQpThRbW36LN0XWUqUTvouIompd6voVT2dnUwAB///////////0KgAl
uwAAAOBVoEoR//////////////////////8JSxQ2izdF2KUm+6StTlAYpJVtqGqUG4b0HaEn0Cs2
4pMoaraiCApOoKONuUapKFKXKdKNqBvjS5Ok1U9Fm6Lrqyo6qqGoKpapb9KCVbSkaRSDRouEoSpy
kaglVTa3lEaLiUvqBqnVOICpUobIPl2Eqgqn6W86ei4mu27jZt1TLVp1Jm9tCvD3QVB2r1Fd2woA
O0BvQnNSrFb0WDQpKtTfCk3lAFHlPVDNVUoIFP41VLu1FL+0WgbSi1aDfxXaqqpKCKCClPkW1taq
lKXKAKVKSqTRdO1QqlB6LOqGjNtoZaCe+b9Qzy1KmpcQZyjVEp0HMVqJBTpIG5Blq1LVNVoGgoMp
RUKFBILaW/rR1BnGTg5sVI5M9myo4KqFPTaikblt9N6mgoS4p1W+/z3sQKqNXOPUFVSiijsU7tSU
qee4faShSkNF46LDGW0FEVerVRQRSOiydFglLlFVNounRc1RN/cqjvONkqNJsUqJszdTZvplAZhS
dFsKEp83UlUSBBlPRY+ixSltFwtbZTUKVKB+6NUIG1Vu5UuaLnaihtF5UKVQlPaLPptVTN1XlBlM
lC3JoKlUil6rqOrmm+zaNFxUhSqepCj5IJOdZrdqCVChQG92gAUqCqraqhQNrS1UKlkEE1LQVLR0
XRV7dlUPK71E3UZUfqgoOiUPMpSXShaBTStJoo1Og3nSpYUgqgm1t28poKgbt0HVd+0G3YUcbM5m
4zED3RUw7U1Gqyhaob6GIKM6DU/UlCaBuakF23KU6hbfUUQIKUqgftVvaKnpFKUG5vqzGinUEp02
htqOpaVUqYpk6Wi5KobdqiqRBosBp63FC0kFU3QqcKIUCBTdqKWnuUXTQUo1EgVm2K0ee8qgU0WE
rV3eUL5Teuh85tFOnQUqKjR5dFubpUrq7JoJw7fLbygquptDXdJrQVfvUfcVKAaO0KfVVKDRilvo
KpqGirKoIVVS9pbOd7u6RBFd5+3R/f/MaqFJW71pUjk965FIOLTUX29Wk1IEd/iDdAHmyX8Qf9Hv
EP9nSUkHLzJdQcucuieSVoS3lQUmryRUpldKlbd3GS7u95bvNOoKooSnKhRCHUdQIFI5l8canhSG
79a0c7KkdYhDvEbL9sKDvPg8INtx+Qex8sRGVoT/FZKN3y3dGOZvKVJqV/nfeg/+8XmRDtSz0HwV
QYpkG79nEH3y9x2buBxBtNoxVUSc+njbHdTiDefOdaFY0/kwKvUJd5llSHL7Q3be4g/2zJZJcxJk
+bqBZB6DUc5Ht3cLqmhQbKXOcQPQcAqn99TKV7d9BsJynz9uoM7/5lQUadKutxWugudGO2Uu02tA
jv8G6CLzZL+IMyj20KDs6dCTjl/tP+C+7dG+SVaJKyoqbqy2KlB0qVt+6Dt9Ve8t2fNOoKpoSnKh
RHl+oECkcy+ONQE6Q3fYbnZUibEB2UfthQd58IiDdcSy2SWy39eRHN+6jtLag3/JV28czeUqTXSf
533/GbvPCHFKfXEHuUvxSDdmziDOc5vDWz7+D0Cm7SrSuQ9s63R3Ule85XNo3ebK8oKvUdp7ZyDi
99o7t3cQOe25LF5XfGRg3dQMCDEEpR7d8hdVUaNOlLkkD0/cEKp/cgJbXQn6BQb1HJunS5RlUjRU
tQ0RViDfah+1EIKpaEGFKDZuqRBQ7UM5ICnKmq1AUUugaW0pIoJSoqt3QUbQPIMynKoZVd1RqyqC
j6gaqcM92ba21ZvvKqMvv1TQQdqnk1W1qtop0qNDcomqqqbqFG92i2xrUb8QcxBvtTbWxsaZttXK
0nd7dKkIIzpwQUqsKRqzrZLjV7Z1rpK06vbJ3R8oNsjhQWFL7SyV0KuoCTRcrp+ogfV3baCs6e8l
ObTooG2g2hRCg2Koqza95lCb6oX2i39QNSiiCjtmzeMQW2tG6BBvJqaW7f4VBQldBXN5VC9tUM6j
oVRt9b0GIG8oarmHWLQPvYO1eEDXyVCSu7ZTbFaLQ2FKXUO/aFP6gk0UmydStxThRjTIFAlBtTVV
UymuYUVRpNNMpmrG2m2NyAU2rGqT3Ko3nu00ttqVFA0UN2lqbbFz7KjVVUtCBuqpBSzvLKBKC2yh
dQci0tNV1ZTpoULTjZJWVWtHOzypWpqbdqqqLcpzOFGN7XVCo6Uvt+1AoJee3T2ql2r1JFCVarVm
/ae+WhnUcY8KRpVPkrDRQeQK5bZxAq0t7R3jn71Fs3cnjc0c4KJSjS14rUiB+r8yfL3b6sqTRYFV
O3U9QoEJSVLsqhqGoUCBvQcb0CCfFG6jS431KUhSqKqKJQaDKi45m/2rzlFrHb2nSp0msN1W5bY0
7tvq7XJvbH2irJVEpim1Tb0KXKpqyrqtQTQK3OqVe0pKdykS2G2NFQ7T/ttpRRRRTxQaCbZgllWA
XL3led3nbnKVXINtpK06NApGlnehC2bTcoqoKouXLUk9VzVSmgKAbdF0FGFJ1BS0XQpe7bcqE23e
bVQU63t9QS2V/qtCqWuVQUN5oAgQK9u+tVQ0PU3tok3d7Q2bN/odUlsKtqGhouEpHhQlFShTKc3q
GeVCo0VAgbbk00G2nYbvtt5UX1DUXWzalMoMoql93ugpNu4aFeNNNryfECC6saagF7hSdCSBr3q7
lKVKfqyDZTqtSoavj2p+1RUCpQtQqVXam9QK7U9F47lIyoCoqtbKtpqjfrRS5zm6ltBQCBppIMyq
kCs6tqG6e6ilTNlQt85VRSttpKUUFQSUUqhTb9kDS1/jVUbfvlUULQoKrzFEHVaj/OyDVOZTDTFS
ipRsjXO9xApIoMoOrSmKokrxUogoNSlKZQdVz0XAgflQFUFI0/qpp7RvepEHEBRCAaLG2mOUkFlD
lIVD20BRIqpuqNtaCgOdq1AgaOUaso8dV/ZArm8lUNC93G+oW1XCkhVrRhQuaLAKE6paCjTUp06L
WKFUceKpNjQ1KFJUFEGz/et31UgbvV2pNlWbylzgt6aFXHHipARi6y73ub/Lf0Hfuhvv1aV/LOTU
Q78eQRf2nB3J5YjByan4o67jjBKfbd3k09lbqfa6EkG03KeUt487z9+X3+UZrjfenJA7sg4LRvvU
GjOvvXvN2lQm2bCmKELIR6uPu13suH5xm2F57nrXLPHevBy+dn3s/+X5dQ0foijaBBLaL82yfNVX
5Pf7vbl2gef3e7fFslRQZMZvKQoTWXuVbvBNff4/MfFgu+XqVb58rp9v9mJxbbf6UtrkgFIFSLc8
Wi7T2yUORsf2bg63bUVaqlLnBx/cUuuPFSAjf4HmR1VyG2/oJvco779ZZcyXOqMysnkCV/acHc7g
eg5Oh/VEDvXGDafbd3k1T2t1OpbJQl+27jZ2lvGXbzeVz/lHddAN1WzZAgUQZwWsHvotOdfetzeb
rZQm2bCmKMLheQsRey4fJmUu89z1r27470D+Sn3onPHv2/KiovNAaLQIJbRfm278ZeTV/l3xTOXx
A8N/5O9lsaEGbjN9pCjNa5RrZy5sk/j+4+MLvnNTSv5cp9vNo/DabZspeyAUwVItzxaLrYp+0LkH
PnODF1v2aKVVtk0EmpVppXm+7c63qVBvf+ogb9mhol9ObyvtIKCUq2ylavqHjU0oKT1z5KqGujLh
EoFaftvX3JNKGofbuNDZOnVFCnTQIN9qEymM3bWlpqCoalQVJV6D/GVA3trY3NVGjxBULQ0Y2t+q
prAa2p0FWjajv423qGo1VabbLYb42Kt1UtXfqDlBDdHelFX9py7Od0mrG/lNtQUd90FXNLWpTqmq
tl+VOJSaJdyau6voLof+zQrNolT65Pu896H95T6g3mP2QcaNmhsbKjyoFfVQKIEE2yfwvkigA2N7
XCh1SqqfCk6msVUm29VuQYLXGVTQaPKBpVTJRuad+1Aog2bWzN6gm2WpKraTa2tPUBQDcrtVdRVF
Vk6JQhRjVUHKhp5VFCpqtjQad6tpuIG99A3qcVaUFW2UposajzZBtVXd1bG3W5qbOSuqWltlS32q
uovVptrdQoVFVja0TlVtCSnROqqqaajnSVkg3poPQNZRhQVRqcyhnefKAk1e7Squq0GNU+FB85xp
tXWyoZO1Jr7tqDfJ3c1EFPaolJtTRt+6yC6jqHqlEo2KlGoHCmAUrynIoVqqfqlD1VeWU9s30GvR
cEmyjOaqlSTKGzZVt2VltS9r2trKFqcoFsxBUrWUMUsogz7Qc3bJIJbIFTUe3226Ht+fMoXaigbk
DZ7e3VTRVQSmpyrmtpqlqpFNzaqG1SN+97N1P26lckG1O6cA6uUMWQU6jbSmykVd6p5tbRvTbtuV
B4oINm1XOFJVE3N9y2QUOXjcg7tPrXubVmai9gqg2bCn5Ktm00FHZrQVKrTKByqaDXQQfLs2ibTf
KLXKhk6o5Sa7zmSqOqLuk0YrTFQ8UBSOi4KlTtUtFiFFFGyoUKe9RbK74gaajU5gavatudu2nOeg
qBubmqdNBu2qKNqt91CiDKr9pbKWwvKmq5qad8QN+1T1FKlRo8oSQd3G1JBULagbp/vVLZQzbvQr
Ue9UzKBbaj5VWbU1yhaDfUNDtGfN6r35VSlQtFVbqjirS1/V1IKZ2grbzIGmnjZOoFGhvbW7a2jd
u27ypKGVU1UN2unbT1sn7a3IEHA620appBtKWp213zfek5S2q2hlDj0nqr4gaRPtEygWxwKSaMqm
q6had6gvuo6NtkGVFUlS1C3t8GwDfRYCDNqkqIykiiGqqZIEFLk5Yp3FP5TobFLtLTVWNjZSqWpi
hihqnalCgQ3tjSG5vVoW82843IFFf5SUqNSjxBScaqqxRueeqGj6rXQpbt1CpKjKSKToIKPZN2ys
t35v9nRbrMNAKByUt/ze2iQo53nZ1A2KT5zZzJ3td9jEB6WSddWy774ZKHQg3n3fdTOudZLDl7dc
73JMSH/VcYefj10VOxZr4hHbfkyUFOIu8eVUniTel2jPrbNkS8e2W52Fry53HKKrk0DAwy/noBeD
P0riW2dYAsyMk7cv8ihYmDMeQdk0vzZEE7cZN53ugulaHM4g7mZRUAxxTaI2tksdEY0+fmSc5Mt6
DaPuz8Q3A7biD8/XZpwL/jDdLW62QpXPWR+KDnRi/ckpfHP7Hk+2hzbnLjvQQfelqMSDtrezf/L7
2fOUHez4gUvnx8PSQZJ3J8vuAUO2g336qqpnXMX5x29uudl3JfD0KrrDz8f40UOxZucZr7b0mSgp
L5yCu0/+lTm0S3627slaU3mDZbnYLy5H+9caFRNAxMO38zx95Fg1PrW9+zrAFmRknblpcihQ/mZb
yDNmp+bMO27Hed7oLpj+8QIO5mUaAHXFNgVVG3GSx0Ri2c/ubTczky3/tFkdn8EM4XO3UGZf67NO
Fb02MPKWtTcFO56yORQc7eL9vNqEnM7G1e3DFOS5FVo/+aQ9IM6tn5wd7P0DW0yQNtV+Uig0WDVb
XUlXzVDBR2qBpyoKMt73+lSoqqoMqhpzRY1XlNVcgqihJ+1Wir6gabRt9JraZU6tpUmlo73927t7
VXTbmugopjfaFBdP+UqO80DzJ9W1ZlQU9m2oKMd96h22qNuoVHAqlV29zjTx35cQVCpNs/Zo3E7z
tJs3UvYUspNrFUGKoBxuco8aFetLVctpS43zooGim2yoZRzJUaJ6S2+zf2S7RKWNrrY2N21MVQ2q
5LilQWq7UO10PDBiDjU2zqhsbashNRq5NBVLUq0tNRtDRUDZbeCWirlOUJNbFSlRo0WncpIoEpcp
Fp4qKhwek80njjcgmq00eOb/VdV1AgoVKUC0UVJPZ2dTAAH///////////QqACW8AAAAPLo5EhH/
/////////////////////65upttFoqCpW7rfVxTtWVSUuUUUXUNRCFUlKNWIKnqWoqkqCrynNFwF
PtzXztBsq+rd6i2o1HtVd0W6p2//njZVFX5LiD6gqWjSqpuy+bSKKKMqKotQ42dtpzWoXKpqqq6r
qqqWhqmULynjRVVUlAVAUKUqUQUDVNUFIVZVY+q1G+oKoU25P6OdQNgKDKUjRWnIoPeru3SUa6no
VUk/9nbqjfKgE8p0+Y1NGIKe6qu/aK29LlPmyqDiCqFanKQuoWlWoKZQ9rKVQJNyrXyrsbqNC2hs
VUwbq8brm3q31taLQVRjZsUzatVVQoqU/vLJSaG1p+oaO1UuUUFDZTtLd+ht786Kk6mbLpt3ahqO
ot6GFIaLBbGxSgUWUgUhsgaGrrZiBBvau0rlOhUTTTVo0OKtsmqqShinqTTu2TaKoQepxRBjnKpq
Sn3jVeeXUpBom3bNUe8QU92iTRJo7Kka2nugfWlTbh8hzm+SwegKbKMKXUKHKeKMp1Faq/WxoiNq
ittQTlKoo1cpRqlzhSbZUTi8m7Kgbqfagam/UKUu2KopcQe1qApEoz6TXBtptFJShVNQZOqSgWwp
GouNFW22VRUtQtStGdJqKX3KAQNEqDf3sZ0aW8e1FUNWFDlINEKhCDJoEFVbxQKoKhukglKWco8o
Y2yKAq5vpW05SzdWCg7V3J1BAoAp0oLFQ3VEgqFRvKQqO2ireCqqgbao81KaBvoHSwXRm0oOSat/
ExnGxvVbbapbNFTS9q2pQq7il20UA5QqeU6hp1bbTURSqCq6j8cn85TbRQlJs9VWXVOVKUHVKrZt
UFMSKWKWOkUTSpb57l0NyiGpsKVqhpbMUl9Q83a6q2oICkBUqiiDbhSPaVLehQKSpoGwoqp6jqzm
1941U5UECtCKDtWlL1dosOqmlBUF9p1A0NFWhoqb8n2ht1u3otClQBBRb+/atOkpzenVe+8uY11P
26CrVUNtbfVxfUECJVSgoWxUaiUqPoQcn2qL2uoKlz6dqQji81O/5fP+Alhee3YPq/3Zza1d77OT
D9wsb+vP7Wj9eMRYliPjK4wIOdlk/czPQI/HvfJop/YwKuW45WpPu9m45/yeeZrst+8+dufHcvx6
SZeKhZzM+JeOW4bAp/6eIx3N3Mm7PvegZ1Qc+aubUO3d+O5Mc5uL485blDr3Xl+3YQMiinUFYTQf
sts5AKYZZ7PW0/h71uYwI99p5ywCOnfWD5Iq88560OuFwugEmFYtH4YkH3gh3nOKQj/zU7/l8//h
H7l0vOhjBY+kyd2D2101b7Jhy7vf15xv9L1xF+2CWDjKHWCU5Zv7nc9BBy/e+TS2QY78Y9T9y3fr
U33e7uOegk8+huy2erPmXyfEGX9pC8y5ZRG5mF4x07diwKfmOxvuKjJjefe25naA56Del8qPbF/f
cmOc38Xx9zjlDr03l+3YQMlFRA/P1FtnIWphcs9/raf/9x45jBX32n3li+Ctc+JOsHeIob5zFodc
Lj0F7MKyWvH3OpA/+I0XebFI09rpSpNtEoCnVZRKObc1y5GT21DG9Tbqu1VU/VKRpNipQFWdGQbK
g+zqlVW+7U5UJkN9IfuhbaXV7FSEOBNp69uMaFw76Com7slaLRtUsqSDe0EsuTqDmv7Dgkh62fs6
OoMItA0929B8vuoWt3k6EtuLgXpSp1S1tN1DxRTjQo18ntcr2U4qh5wR9pu/7xRsnTqlszs6pUtx
Xk2t6dC7lU9F6lzyK3oUJ0lKM9ucoS5Ldg3IShySrcwUaDyksVVlUFQFE01X1KLxQrTVVc+lGy7S
bUDsxm7/fKSKZ0XBvNZzqDcGP88OJo25slznZ3OVqypNu9N2V74P/JT3HW2m2tqDx6CmUM2tjZTn
nd1A/wIL5SnParKtvagOqU97oN9QU6ePcz5Uuc3cnNvkgnNWW1UBBftSlCr3h6BB1op83Qb3NsqX
ec1G5sKM37m7ZTbm7m6qjt536K+VOFLc55Sn1BTqioShCnN/QD6qpUC0CkGtoz2qoeVBOm2VTQob
VCUJttQ+VHtQ9o1AgmpUV1UULM9Fk1c2tHA0NBRJQlRVBBXeX1FUfJDhQzdUDS2FIlGbU6lodF82
a1WipqVU1DRpFFNFQNCDlHRaFR6LQ9oG1RlBjZs7s3TpK9bqVNSgqpnW0oY7+pashTKUmUBUxQBQ
NUlKfoutpUoVQU0U0Uq07FAFA1TVLa3NFQCU6XMqtqKAaGyg0E4rs1b3UKCc+1JUSs2/lCqmzJNt
VKvYvJvbgr0f9SlM+0lJ9ocpP0FWyi0NqrXu3ZiM8Vp3yqFWm73m9nLIxomrMoHRY5S216LtaJ5k
qkxVth+/Z2gvk5tAbOPXbTeS62+3NO8ttqdVULb2rjZouA/nSfye/PpbUKdNRupy2q7RaGi5m6o1
dFQDIKPzylVtX1bOor4GntXlMUb63t6ltlJvrtO7bTplG1MrTm0oG9sKS3ztUNVQtbbSpVSUQUOq
496o6URV9UlJaLVqZVSqNFiFAUqTbUtFUpTRckygKnqmqutrbVjvcqqXW6qp7FJKh6WNhQRQPKhK
BpzbGzjVQ35SpVQ5jXUHoKjylzJ/2pNtt+XaqDu9837TqBrXuUv+fOCn3bkpoW17u97Y3KbwvblG
hQobNLQULbUB/j1KLTtSCiD7tv/ZfjRthQFKq4tzTSg1bqKclLvhBOftVQtKCk01HVRThSBQ2izy
gGukUi09qHKoab4rv0D3lFdmVsUtBxT+rY20eK1VlfelNv9DLOqtmb1VVdQSHfl3ecxLalSUlS7O
I3qWfF6hzrT4VlYqGZSIDc9GhtF6SqlLLtlcxxl/gtkZWZDgGde5jBfBk6LjzCrfUEMGXa+DPQT+
95/NXIKXe97/85i/d/+bsTM69+fFQeggw3fJuZ2+bYiQMOXY2c5yX1nhJ6f6Y0sWhX+4iCXudtSe
QuHL3ee7DnL45tlJCr37xBn/CV08kk7CP8EvxZftvdczfu874vnFL2mrNBSEJwZLxb42amf4Sajs
P7/+grawDiAfwDFpPbCclUHuRWWYtkVLGjYPbIlVKWXcfGI2Uv8hcGVmQ4hsT/vGC+ch82j3mFW5
oBgELZMvEE2H74rP5q5BS73tX/nfu5/N2Z178eCgvMcgw8lMZ25bYiQMOWBs5yXNvWekJpNP2H7i
HEvc7akp4yXC5WrIP5DOc44p9P1e/foM/4SunkknYRe4JZiy/bj2Gb9V3u1+Kc23pboKQhODJefk
bC9D89YtqMHz/8FYILlgzlv9W2eUZxvJVAtBlFb9qeNH1fvRnt2U1FPKVaOCWXOctmzkqq0XFJv9
BtR5sKDbNc99vLbS27jvejZXJe5eIM9wpOjv89h2arEpKqL54V73dunQKBowm2UuS7Oain41NU+0
lp7bgidcRhAGKhHZZlQ0V21su+Supar2QY84JU2inSjd7SzaWZaCfBUKHktpFJVBygL/tyeltUii
olLl5LOU+XwQy1JeXQZtLiCSmdwd/gsCTmd2oKbCXOy4hpgpVTaShSO5QC+VTUM6StRoMlPlQ022
qZnxTfsNGkUSuatJShTefpKoWLeSiqBXNpoMpfuqglLKW+8tt95777tjbKW+86dCVKfcV3y5b5mK
UGyVtsu3dRq06fcpq5JDK9t0GKqc5KVBXec4j/qrec957qqtBQG9O99kNNVB2lKm3ylurvOUm2jQ
bLnkN+dKpcGVJubMgU26rtOO1tnb/mHxAfKgbFcqm6TX7c44qFPb+ZSGN10LlUG1PFN+ToINqjoU
OTptrdKSBB8+cG3KHeqUGy+boIyUU7zabftxt7zv20lA8V3V3KB2tBuUhGpKeUZNyKauN6tJTtCc
t+zp9s6FNsqBBRoUWltUtrUlRQdbWyje2yu85qNDloOzFJokpOmgPkkHQu2y3mA0yukJIN/5Ubeo
Wd5jXBAHOBTc1KHaN1HPbN1FN5IA3j5foK0c3420ts5O7aetTo9BVKC8b1eU1KFRTYut20/QbS2k
pdLkqdNR71VWujCkq1HToUKe7ZRoqUqvo3Sq3imS7Ll9VlJWlsopvvTKTKRae2g285tGKt1Qik9/
t+y3VeWgfqihO2vZha9pq83bKpHFOKyb+1fvn7t85qbcUbqWfN3N2OhtRpbq0Nl2ikrfJUvnVFWG
g3322oy0WDVTYgVOcpbD285y6IqTVttq3a1EPZyQd22o3La9+KcnQyoebt8pWEEdmioJc+xiDaTF
c2vkmvrlRPb5yf92cfpUNr7wcsxZy25Lba5d2apfsEMkEqjUvnFDsCzoyauclc9uXwW9Tb7sd2k0
fQaqbVQG+/OUXqG23y3iglzrjyDaU6YQb5NBegxdeq6olVHXaFKRQYqkp1unR42XPO97srPt3Tpq
q9Vlv/kEq2ztXmKxczwxVQrVGIKcrQF4DdS/5lsCMexuVhaDt/16+5DgQdvrIwZsrH2a3hWYnEjA
LpSXzJTHevBBuHPnv7gdd76Ry3pZ6ClCdJgAYlnuWvteM9b77fsPUDyz43nNlh3ccRMuQgy8WjPM
1GMX6mF9wf4z8ZZ9zv/+29xrB17/RIO5zuX8wPveTnjNMuoIsi/3BX/28dy98vj0+7OchJjh2Tjq
NkcxFe3+/Xit1FxyvwbzVtiVzH7nPkWDrL+0pRruLfJBL52xoC+X1TmSxhtgLlh/uLDt/17ncZJX
N3AyYpuHvFvuQdu7pSsPd2mwd74Qbh1FNX3A6BPEjlvy/EFOHYUkLBYjB6VrqdRVvud3jHPqB9Z8
Up9Z8mqOImXIajmR6QmLfqfvuLD/vMxln3F+//7K8FboQPfiIfiCXe8yYe/m8nPuJegIsjJ9wVz9
vvveb4Lem7+znHdvc7Jx1GyODEV7f8H2WM7Rccr8G686SGl/Yv33nsHWXFJSecEFs2l+52G7nUFG
hu393p9otu8tT80FCh7dQlT7nLkpOXOoO2dBuDSH/xxD2ir9KvJX9860U553k6Ylsg7jXVW+8+UE
HcvvcQcsRta77ykptSo0W3fM6VRl1ANX+tKnIA293A/sr6go9QIO5vLOtVCW7cPpFB0kKCqxKhd/
tRFLa5T+d84gauqUlGj6oG7T/PCv8m1876DiCqEFINE9pU973vaf7Rx3aV8QYEG9GVKmguewyVQX
tTpfQowacUyqEAoAc+hR2tS6DXwpGc+2g6wTQD0CBA5t/yoUb7Pa5oO92y0DY279V5noAgk22g+9
uc22clvSoYgGbcq6rr409m09bm+U5INpO9QBDtyhvalS7K/zYCfM8bX9QegQIEHubN3Oq74KFESb
JK7tM+06U8QT2zlJA7cmm6g9AugQNO8uY2IKm2/EFVttD296hty6rHEG3PaMyoL5RzZthydRduoM
QIEDJs2SKcaqjnJiQcqhVyltDrVUDYJILz9qVQKbuoO8xRfa0FUUG99BUcmhua+IPn/aiH8zN9mz
jRKrbqBRTanjYrxrl8+bqIMaaqebqrp0KNDGmqkBRNKlbcUJVJSEsar63WgQT3UG6BsupqLe00N9
mj+Xxoqprq+hS2bcoU9s2bKOIG0oFrbNsHAB2VKXNlb3E6CqtQS70+kq0pXIUUCAZxAgQIEFUIG4
ooods7UBTVQz++06iQSpZ+dlOWKiaiDeVQZ97qNIQoG5BfMxBJBPnEPoKFQ/xBQxB2jl7xHJ3vxB
dU3sq10qQobuKVa2tUhu0UlONeToVDSqFu7Tb1c9AgqfiB/ZA3e22pd8aKoKRqkUcbigONkB+80H
UAllKpPUbaoHHKKtlA3NqVQb909nZ1MAAf//////////9CoAJb0AAABa7daREf//////////////
////////BV3A2oJYhU7aDtKlK6dS1JxuUCCXO01NqONnoNmkfQ5ugcQIH7obIEFHbu35MZLdqptE
pdQykgDrnMpIPQ/DbvQiVlQnfeKTqXuWgQYrwTQcVQKIEHfQTmglc0FQIKo337y85vvL0CiCg0NN
FAJXfq0EHN5TQW2hppyiOy+gvSUaaUpSobzqiqb2uTbOaBBTzAgo93d9A721OwUm28qiorpYrrCr
a6rZcsmg4or/aglNA10h7ROFD0GZRYHwi+DANKd9267s7tvYsb5yxdxzvwfhePd4v4eQ+4OBsFPM
hzwyBe13km+Szk+Wg3wIHkfHLg5DLsTceuDFni5bvdl1lZXl/QQvoXXE1h+BnWGZsg+wgyHPm7+1
qyzmPXG/eLczJ/iiBAFs2tiYBC0W1hRByOYg+Odhu5ZfHFl3+eITuxiHLZO5AbpfU71CHkHz9km9
42GU5tHjO0WB+0T8B4ze+7dQbO7K2/wK5blhD/fggQOejHv9lCIeQ45wY2inmX4ZEHOLgBJvkuyn
K0G+X7I8j45bjjmXYn8bRCH+L2V+HZTedXgECPkwuuJrD8izrDNkH8tB+Ql8pu/txWWSwWtwFrzJ
xxRAgtgza4MAc4i2t9RBL8z3o52DBScsv49xZcS8Q7dhz2Lnc8bj1Oz9CEGTcZpw5cnspjreo2Sp
KSQSdpUFWiU8VnLalUaj1TFAIFadPG/vSl28o2hVylSKIEE75JvaJdyoHqKjqHuBqQUkDRQ3y+fv
iCqKO9Nqq/ilVtqrQ0VCRe9WlJcQcaWhWkq3tzR3GlobOUadUEFa0iAI9rzvOq9QT7UtRtFBoaN5
7/LmYqh2aWtv7vJpob06W3X1ZoJyyXBU1QC6ttWrLvZqk9QnPFLauOUeM2X3Kc6WbtvqoGnu/i5b
UWmjRcoWO97VFVZT6goN8pKIJNDTQ2a6NBvzeSDbbZApUO/Wyo73ptGSug62VLlW1Mgdpq/SqfdA
dSlASyqcp1XVLcgo1Gq3VW3cUDTUlQ1FQUVbqspICgag7Yq2rCkyk6ppVHU5Q9T9pdQNFQNW1QVK
01W2bt+6iBBQE8pKVEgaSl2nl9qrKMkGb0qsVp771RneVABVtW93aWtTYpMpSrasuXKoUVq9ubm+
qanqdqKBHom3qragKBKHqeoatU2VV+QqkvlUIJyoUqstsvtWNXbVmopQbHKgQSUad6qtSTTvR2aW
mmqryfYK7ZSxozZVtVb8bqrQNQaKoVKSq3u+1/2gUi0z3bv7lCkp3pQ+5SmKUEGyqjS39oY21a3I
OSluUO1q51WhGkJ0r3lm9CCof2CD/m2q8l1WoaVJWldCpKood2QZ90mjeqFaMuNTbO5b0+zbbaHt
6e2cV4gpAVQgVb+7SbeSVqPtJqaFdsiMliCnfX6oa4NtSyG3MQX1sQZfFA083ZlECsA2VdU+2Ddv
23UaW1pbaaCg0NqDN0DqH3W3YONGyrdP9/afuW9tFNscltzadKUlasqWoKoUKVqSpFFamoIKKrqq
DlC0HKNBuQdlaBonNsdV4pttt1WakkHOK/RlzecpS2kN95KVVLKultUaqs+t2K0cQUKU6WwlQ2m3
tFMb0ZtdUKNn1JOjVz1JBSnSpoKVUtnBRnOc6T13osZBu1SXaUAtAgj9R08vjbvT32UltOTRO6ja
ZTbG/e6c6VCaBsbabfgQKbNqDKdTVEKAUFOg1VUqglJyNKq2nNqDZTzbmyC9qXeyufWjeQQSVqmq
qbZSulLn7VPd7VS21RbYUHVWRQT51TstrU3baCs+KKVQ306dUtrcUKUNosNB1vKQbcUqJSraSqCV
85R22bROqxPudEg1+p9Nro02nqCjKpajKG2qFuqundKnSqn6SCi0Cgryk3Ckqg4g2lSzYbBXja0T
3toqyrleoI5LJ9648LXwPjO47y87m0sz+89/j0ypU+uvZt/bu18cvlwmOevk/WHKWBH1Ahy73/kI
9rd2kh6rGSjiDmPfS7e0r6wRGULLDPmBW+Wet2Iv/z8Q5O+b787f2j+xlqzQ3272mqwIUPZ7UJRA
/7z4WMc+Vq+tyTBnMhNX0AUu3RbvOuW4/i+SDnc54d6sv9Oshd5NDStA7cbwCxNzFI9uOKZPs7Ru
3bNiH0GS77suYptmfnv3x/cqVvPfqB7OKBB2x+O8tyYv1/VxYcpeEc/Qehy73/kI9rdU2Q9tW4yo
OIOY99OYvaV9DwyhYx7L/etX2z1uxdv/xD3e5b787f2j+xnKW6G87d4pNVgHZqPUNvA/x34Xbvyv
FfWuS3OiavoBLgdF9NBztZzjgfxkySAgMl2Q+3epGDGyHu8nlNAEF49zLE3FIlAS2Q0Z0u7tBRdC
22q588boOvfSQdGyBUK8qgo+rLoFLmUnaAU6NUNexTmi1931ED7hAqNgmg60FFKtGzY0U90Cg5vN
AgnSsNt/9Rbf6C0HYy3bmqXMtsbmpuaKHeaau9VFXysB7VVlSCQn1p+6ajV2hQpcl+ToT3QUKibK
q6pzjRV2UeTndCnNAvS2nVSAZhampXlQnS/G3oUlKbqCTNKj+/bfkog70Xj/XbQWgmVVU5fz9BbR
auW+3DZ9Bf8bEFoEEv2eQPboO9zz2p7fQ6rj0m55ShypbqINA3/FRh5jZLjVU1Uc62tFGm3Nkg3N
qnGlu7Uu9RqN3VaDS2qlG1FU1XFMFDz24CmpUWpBvJuq+oilShKNV1LPNqbQ0U5N/eq0VGntKqyg
6FGatUFDcpVBVTc1vyVQNGU2zu9FWpauKYKHCDflKfZFFFMU6PUCDrfP2ptlUtX8q1qqeqqNOgqr
R4UYUC0tzdu1q4Kg3apvWgfhVNCZSVQU6lvjRgEqVtyhQNV7tke0lUFSNP3Ve9BuqLJbMw2cpTae
bUZlJbVTSaWzKXthQJQhQdypT+llRdKf6gpApeA6pKbVVNWS39BQortMlefNA42VR1sU0WN1B2XE
HOoFFeS2oyVfltv2gG0op/91d2zZrZqe9tzY1/VvKg29qoN/VKUikCl59u3Fb7Km40tDTvsoqdC2
hSbilemCkSh25pe40TxollVU+ijau982of5q3853KStU0GmauXdAKTa8VntvUaKe3JdbGm2z6s0W
HUJSuxQWi4arqi1GwUBTbKggga8u7aqhvNu0qdQXm/LbdpIMbqpobCipS2aKqvlVc3E+NrdQ23lS
qCjO6DRQtoQIKdJS1XGyhUqBolVDT1o3G3Koa+1Q0ToFBlK2L5O/x0oLm301BfWgfJVtxqKAb/zY
Cn3nINc8U6pUPJvbHOoVW+pWnGnjfT7SqjfmNvVds0Xk01P2k0tm/aKkqgtVBzsldsk99B4X9F1U
U3t96g5dV40Kzk3u9zaggttVtrsbbZJSlRko0qtrQriChu2yaco0+qtoyQaShCkakqpSVQ1A/38q
je2+qWio6raqp+6ii0So5SqmpJ0kDY1W1cpIGjvZZtwbdQdefkr1A52g15UJSLfxsrVK+gfKDlu0
U+X0pFA89Mg+7e0WVIsb0aV0L3qBR1BT3bKU8nNBKqfqsoAoBuHUDZxuqsoju2VLNtaN99vKyWrv
2Q2bJb72pLtIToZvwNuby3dQdg9wfNaMfxyDrAgm5NBSveco8sRG6DvjO87Tlc+Y7nGK5hAhQBB8
6ctmjM67k983octeQlxVVokvMDOK0d3UftHc4gf2Udadpdf9s1tBR/ZA+gbnHbQU7yF3+lrJBbcQ
wF/+HGKXe85/Xh7A5eZOXP69/Rt3o3lPOSu/0kHJX/dbdrOBBq9fY/4u4/78EIVsctXrF8+zhcq6
AexcuWcertH0trz9sVtgV99DaqGUP/b+dVQf6Cxi0kH+gpbhVVAg6zP8Gb/96nMccg4wT3+f0ubz
k9LgiFR3x2fJtkr35jsvkhuYQRQQCCPzbJbNOZN395/OhziLZ19S1aTVITD/eUmjdAMae8QPzoUE
DVtLqD232hT6CB9v5Bx20DZeQEMGkl2DB2Ay4fyXf7zP68PYnOZ+8pZj3zvafYbynlyGVkHJegv+
kHd4s6EENfy+ZiFB7/vwQhWxd0rmEE+zcGxrIHMYpXL5certX0trxIp1dXOQpe+htX0Eofm3oJdV
QfL/QWmzYZiCluPqqUeTbKqKC01G+WopS/qi058qBvmqoFZ1b6uTtvWo7zyrs7xqQCn/PbPFBBLJ
VTlWIW7skGNU6XtSC1ZIGxrkq1qBPlGqOZToKUN909JrqCTb0NMuUap2oWogvZzeqe/OfZNDS1tC
kt96SCeocxWg3b0PnjBRauKoSmM2FH+bVTvlRd+5zzMotY4Giq6rzC3WzUWqD3HyeoL7VYO1FvrK
71WUEMld1aOzZUs/6UxgUVeaxUvSlWiXNpcqSf0utnagoNDSeyHopTvtNVTdAg7SqVzfGwIG1ppE
gQpUW+XzlQykrOoEE6oQKUqjqComoUm2oqL9KpKqb+8a/zl85ivasqW6p60VA2q1FUSv0utrZs0o
O7dU2G6B5Tdzk6ckEfqgp2o6lbKXGxroOcVm2XUH5zk5oOZnOTnvvRotTJUlGpmhVto7tm4akFQb
Kt+VLVloO42OUCkNxzdprU0E6c2iT1CoO0fpcxyFFz8bVKPqvtMuya2zaVoJSbRecEmvjcKEkFHm
1qIvbZC8b2tBxqQjZAo7TylNyaDr8NqU+oPlijVUGN19tRSbW2tF9n1r5lPdBRoadEYgfwf28xBt
UKtycob3iFpdqmgvFsp4Gov+Yq20/2vvQ1VE9d0OtCtPnMye97bbU/Q1DV30W4KX3ftK7xB3utnV
AxTM/40yHjUSsrdekq2oc2veWdlmg0Xl7yqvMo03dqVNWqagoKtSjWpjZtLtHrUgoXT2EqUt6o32
poNtmujQqtTtH+X6DbblAChRamzdu+nPb+/e6DKpca+wasbOq2gb98kpVVCUBSmT3rartUbe2Dqb
exRb+je2mlVz9z/jEgg2qcbV6Wbb9u/kvSV+29/u27m9BKg5k2z4Nk7amzfBm08KC4rfKKCpsvfq
kyhWqjU1HGK+ZSoTEZRkh3VkORqopbm6u23J73tk8gNmm9hiApPtD9uBTelRp/EUVJULeva7eUUu
25qVaKdujvN3lIX3dA2KNfLn3KjVZt+5QbG7anmbe0U6pqBo2bKZ43toH0KLnLoVDRTNu7JtSf2b
m/ED1Km42coKT9vFXTqGoOd3u6VI0AypsbEFLfvN6kkg3pb0GqmgHPoqtG50qEuXtVlU1TLrd6vU
FQUWymAg8iiDpv1ApL0CDeaBWoSgL62oNu7zQbhifQIBt3w7KdgqqteC3GKecuip3O3yfPzqt7IJ
UlFG2aHxmcngtQtzfbZHm2bBDYkKYvqveb2ydfeaduZcW8IBRyne/dp5Lm06KEX9CWXC8QIeoXLp
4rmbUOUqE+SmGystW+T8YXmYNdy+2Mt/eIxBl81u7yr+PsSqHM3zEM3Od33uTB2tdBooytTu76BV
V7s5pwg3QfLl5Hnvz72e1LbbLQf3a/zJYh4BwMW2BAXu8zdD/oK6DUdV0xaAY5tPH6Vi2jJb8l34
zyFXSr9G2Ptk3mxpoeEAltPw7KfIjCMxDbs+84KNHM6OTuOTpXsglSUUblRl58p4LoL8322xTNnE
IQbCnd9pdvex195q2D1UBBbRHKd77b5Lm0kU6Mbv1NsuFyxAh6hd5NszWK53NqHKVCfJTtt8sX+T
/wwZmD+X2FjLf3eGIMuWtVeVfxAxKocxXMj3nd1eSYOlrotLRK1O7vvIKSr3ZzTBBug/aXOY9z35
51XZ2kptl8/uT2dnUwAB///////////0KgAlvgAAAOeTP4IR///////////////////////Z3JYh
4BzAxKYAXsZ+6H/QINRNXTFoB3PQQ2nj9KwGjNqUtu5HfHCkJTG2Pts3mxqoEHT6p2V0pjfmdty6
wqgvJu73tG0G8p3aCo+BqtCedzfcVArn0kIIE/nqaq2qWnaAg83o5UVKl3wOUtKm0U36V0kDQJVB
xxspIGxtQDehVVQ08oVdJsaVWmiNm1SyplV/rrpNm7T7TtVFQNCC25p71t52g57NLbOOdtBK2+Sn
/Nq2bZ49MMKCreczv/2+OBp5UcKpH+4rtTXggqHOJUl2fLoZnMm8gkga0uINLlUZ1XOoFrQfftd5
PKmoJLQYkQWUg0oJ85PiAqR1SxR3qJTelZtObYgQeN5IN+/Ve341t/aLXV82upeT35Qmo2fSqjZq
bKcttx/JtTc0Zxoq/fuNjTvs11U0q92qOrG2gpbv0qh2f7jXVM6gp1EUipTbVJUmkoJXKdWVJfdt
x+UWuqZb78mgQN9QKKtjXPlX9nTUpKbW1N2yDtQNvMpqUlOoGmGnQF9do9bKGb8ey/+nLaI7gigQ
IJTKBf3eoKzpcp7VZT6LoiVoHsqHalUNVhRv6lqWCtVVG0ZVYasfaFaTZu0t1WKbNFX+FKW21U1P
KqWygrlzG1O5yljk1aEqpbKFFBQSSqhgzYCXtDTNXgyTT30rZRtSntPA68g2QdVoTujaBy9L9kra
J9l/XI4o2zcc2uoOXSus3/7c2d61dlRS18peOb9gWyd73vjc0SKICCi3Ty0BdRCgFoLCBoV27Jpq
tp3oNlRt1VVQps2NTXSU4gcbMp0JqY0bym20u4GnZWq2j3ZtfXXPlydq/3ZBSa2rtGn1I2NMqqqD
JUeUpVdUrZUGVL86KBBQoQ403RnQ53HMn5e1f/eSC6pvlaNDKTinLYZoMU3QNE5w5t8A2TbYyKHy
yyCaBob735m/LtAg7SCCrd1aCBRsQVdLoGdy8QQ48tN2hsN1Wyx/15BAM/spXVAUU/afy3eqHKhl
P73bqE86X5OhyNQqfRae8nffVbVaFRKUqouYm8gnug9AKgVbd5q87aDfKSBR0i29BwT7tm/nmUVW
y9qIiqHZYzf3u76B5Art93UyAIfbato9yV5SQ/amyvKvaaC2VUOW0NO0mjb9tm5Vpf7lCQpYg/lU
0miqadQbUqFCeSyoapNSlp8CDZQoApFXam0ZQ3qFsaqgqilKqaOqoNm8dqed7fOIHr/19K0G1Otz
mXsECjwa3+qRnSjt1VB1Xa0F0UG17zHMCFBSnJBkqHyQf27QSQIKiVeGbvqoFN9UGnlvazdqClCb
0+7xfQZm852Lg7xBFAgQILQNYxGgDiFDxxAhkg33QIECCw9/38IOI+aX+Fvelx7SDQMGZtRaKOmF
myhOW3oBXH8z910EvpIdoOxk8ggvvcvQZm81ZIFGmnvtGNz2etB+yDNvpqNG8+T96+O/St5B6irI
wRF9f3r2RO+96enPf7S7KXRHNxvv3qvoPQC0G6BAgQIM9sQT7uPQW7PtFt3eUbMy+cDwX15eN7IK
a0ts4oBQeuoEHVHp01O0kE1drFtCCSDiqo59oUFPeUkE5UEBAcQf20EkCCo1fGKoKSCgrqHg1ct6
G7WgoUJvz7vF++93nO74HeIIoECBBaCoR1GgsfHjiBDsg33QIECC0D/+X07z3HHEfNL+siRY3pS4
9pBpvB3NmhpaK9rNlCc9lPQD7++Z+4QbfSQ7QD0nkA35z0GanN5qyeUa23faMbntWtB+yDtB9soN
Ks5TRPXJ36XHkH0KTIwRHOjevY33vUae6uXFHKgKI4qOK7z7S9B6AX+6BAAgz2z9+7hAgt2ftktm
gQyiUDUqjHQqz58vegzM9RlI9aWxlYmXjQ2qtWVq3OFLVUKpqpavOvqrqZylxcoBgQUt85yg4JAI
cHG3k2tqoTqtobZ0VVWijQO0CCw5VPLv2xBaiDhaj9VEU17K0KWBBJpam/bfFMoK/n7lE3c7KG7O
7lVF09at1qfaG4K1pVEUJeFN40DJz3Vuq26tSbJdUGVDULXU9WeflAMLZdRRxQTeUU43e3/Or5sN
1QwtXYR5GBQOyqrLRZaRQNVtlQNXFMGKDJWGzfvKsi3uffFNiRULRU30FKjaUCBvpd32qypKmFQN
dS8qNtnJpozblMqBF+eoo2tre3QiUjUjbQ5nVZSp71bTzN+DYUMVVn3+9aZiElOt2yjQ1b8veo3N
rbmxtVzFFO5QunVu/G5uo0VaTQ0dVkgU3mpUFBRXOoMUvtQFIxRVDLjQChVOUZCeBWqmFtKUlUpQ
DlHda15KtK/ie22znCkpVcrxRB/ZblB1BmIa9200Kh32pNwKI8begpUCgikBtSylv8/lTEEGN9Q5
MpSXGum2taBupqVkBSnco1HtbbSEGioinqsptzZSbKqlS8BydYi35NbaKd8pdup2mvKqetdQD5tl
TbNNZSlQ45JqKBqbRZlXIFmmVU0JbYgsXjZPlEojbkpMtUWjzf1W1UZks1+95XsFIXjC72ouKT9F
Tui3NdhBTp0GhvyjWdaUFQVA6UBR24pxTaXKf3iClzi97qbUak333+c90G1Qci08oUc5zvDuLy/C
lap7VdVFOdqme7nWx2pKhaalo1PJobqVV1RSQVYUjUbS31A1VK20bplL7U59qmpbYamqbRYEufR2
qKhtxGFNJrqtRsk/PfCgWj+ttQ7hccQOtwqr7r79qkpqntbY5T/nGmp1KtqKgUpVWTUcQ1NKPMp7
2xgoCW1RbVqeypQfH/HtcRYwoJoZQGxorVF+/WnZokzB2oX6chsOUt3L5Xu8xhqGo6NOrWmjLvJV
GUj3tCc7VyqvrZebYJNFH6lntvtknp7fctlagV7wPeyznQoNg4UvbyiLvI/iP2upmUpVlo1Zupxl
b2qtW+q6u5yCwqhlZd/EqFTtio7URFdn/ECivNqp32kOVFVNKoptLRUNRVTzEHM5VqDZSoBsglKe
81VL6gxWnUpQElZVGq17zqOo/3Bs8rh20HbAvlOg0FvbWu6dHqzOFA8pjAg276qBu7QlcdlVGqfq
vTVFHae+6qnKFKkrtS2zeXahbspNV3yWNeIKBSEp9lttguEbUaKEqXVH6F0qXUG++SUtjqmUt6Lc
gUozbKaiBoaFZIGpVpU3nvVbS36UFxBdxe+B7B6qAtxv56NcQ4HBWQNKzTzv0GqjTp06i7OatANq
sqtYRaDs8ndLKUpSlK1JfO7QbKNjzTT23roBvv3LaVGtXjgsLuAWr6shdzo8phYY0f2Q27rbutaC
Y/Of9Dli1aDR85SaN92vdA2bMVFsVF8qFSqKgpbtARbch3iDt3d8bKDS3VBfG0So94z2oL2wIFVO
oaXoG/tHa3lKSjVv9J7ekGjae+9KhKi2U1VKe3aUp1FVHabXd5KV1FO0FTFI7b5JRTBaGN0Gmhs2
9UfoWqr1BvvklLCKqpS3aG/1KM21soIGlo5+8kDWq00N5q1W01QkZPQV1xG7GD6SCtW5VHPRrgct
wMKBp9p532hraKdNsqNfec6TRbcqhlVzCAg52eT+1cpSlKUuKcvloFKDa81Nm2+IBvPvGnaoVeOC
1/cF3v6shfJl6PJ07WWvGn+7RU3HGO0E0C2Sx2hyxdKg05vtJo33qDdA2qIWltVAuoqFUVFTVaRd
9+bDKqkyqmdV01Rtp3VzoKr1V2goar9896oamqxVaugqt8/lTUVU7qp4n0qpVjqsVX6qVEc0dXYf
Hhz4eI+Gqv1aerqqddY756A9W1WOfmq2rcjR6mpyKr46CrqCruCtVOSlV8x6v5nQ1XDVNTVryrol
VYi6b6X1qppFEbIqrXV1OUF1e+bnqyM2nVaPVTWqmRulV7tVSLifMzZzGq3tV0ccwa6qQV3oKrva
reaqxVT3p0yrMqpt2Me0Z1Xqui7ZdVO6qRYsqp3VSDVSxVTWg3VTqqn1VKFVNaqZ89WVWKtqTx1H
agRma+sUSqypsxoohVf5qtzn56rWR89XVdZ6mqnCqu1NV+gquVNX1WqqZVXqqdUBqqQqqVarVX9u
bmjjoKDMzmqv1BrjjqyrKuquVdeHqpTqprVSiY9BV8dViqmCfTt08w89dBcdViqxVequ0GVUzqp9
VTPmyrarFVKVVKXNzRx0G7q+rKsq2goKA0VXVc6Ax4qCqn9VNVzmOY3N2qu1XW6qfVUzquKq7aqx
1UzqyhuP4fnqyo63QVEdVq3VdyM/Z80dVjpMRRRRc7R1dViqz3qt1FX85qsqptd0D1VaNzIyjqvu
qkKr+0VVPc56vPz3Qb5uvQ9VP8faKgj3FFVTfn6UCt1U2qu3VlTFVTegqtVWl0qpxVTOoq+qnh4+
eqnGqCrrPzGVVrmi7Pmq3GaqxUdMPQRZqqnNTz1bZ9re46qe1U4wx+eOq3rDVfVTiNR9IqrtViqy
jxR1Uod2HPXug5+eLpV9HVdqpcqsUF1XqrWqrtTeUGRVXHV/Srr7K9RUETNVcjqsZvMqyJr2OpqY
+arbeHqs1Xqr6qpysqKrh+fKir6tq95FzVd3681pZUqq7VTqz1U4qpTqu5zVfVfRqqdVJjR89SY3
Tu871L53QVFW1FVMqsPz1dz1X6jmVWGxcxjVW8VVmraqYUEU8quqp3VtWHqpm6qa52qp3VtBU3M3
Uc1VOKt79rfNdW9KnnUdVKlV+pqpnlTuoqsdrqvZtZV0T6UHa6DFzx8+VUwqt41VYqvn5qr1WRVY
qDmqpjzRxXntBuq+eKqkSq6jc0ZqqfVUzvpU3VbdC8qpBqsqcdVmqzMVX+p6jMaq+piS0jZd525n
qLnO6rlWc93Ec1BQvn5+dHVWp31yg6aNlVMd1WXVTOq5lBVd65lB20ZqKrqCza1QUHaq3VTnZqqQ
+eq9Q5RXzm69qCq/QVU5689XWez9KvqtVWKrlW0F6qs1U6qp0W4J3HVSzHFVZoKrlBlBqPmMqiKg
eH7dar9S6rt1bVYq2qxVh7qcqpgarYqCgoMyqxVTKgqp1/FV7rHEqmqm9VIB46qY1UziqprbqudK
iq9VTurKs56n8Muqxp1WarFV4227yWoq3UlWWzRx85sqpjVcVWm5qr8dWdKCp6VUwNV/PaP35uaL
cd3VTOpiqarNTeKq1FQc1WR80dA6rl3z0EVVnrvpUVYKnBVtV9uos1VParBrv20bHfN0ugx1W6rK
VVmqnNVMqqZVU5qcqt0N1U5q2a5+c1BHV7q6pzFHVtViqmVVOaqd1FRz1WqqYVU5Nzo2auqxz2pV
GvhMjmJTNo9WM9ptVU8uqxUI93Q65qlJRGqs1WasiquVbVbv2oPVlRUHqZgx6nnbPl32mTGVV5Ve
qrJuao70H90bqxTFVxx9KqcVX6hS5VeqphVtSc3XpvpmPNHvv2fOfMeKzUF1bVY6VF+c56tqyrI6
qcRVWMqpxdWGjttqoq1RVbQVbVdurqr1VOLqplVTSoi/K8PHVcuOqw6qYq6rOnVZqs1U4ibdmlqy
qx7Vt9jc65+eLMqplVcugq03Soqpxz1b0q7pVTE1Vyps0feoqObcd3VTSpiq6q1V1rKrfTKCoq3n
5o6B1XLPzqKq11XSoq0VcYVbVdd1YfKqf1WTXadGjJ3VnS6DHVTCq1qYqt1U6qpnVTOqnVTlVuhu
qnVWzXPzmoOer3V9XZi56rNViqmlVOqqe1ZVnPVZqpjVTk3Phs1dVmpuRR58+AxkpLR6ss9ptZVT
66rNR0oD3dDrmqUlFlVmq1VpqrtW1W7maj6erairD1M0Y9Xc7IX2s/abMbVV9VXDVWYqirKCg/tP
Z2dTAAH///////////QqACW/AAAANqy7uRH//////////////////////6N1ZlVyg3H0qpzVTioy
XKr1VMarFSfOm+uY1o90Ha+ePMsyOaguqxVYdWWueOjqsVbVvPVTrmqs1U6PVsd23LVlVhRVWKCq
xVePV9V+qnJ6qaVU2qIt3kfPVdvnqsuqmV1FVh9oqrWK3lAq3R1XKqd2aOqyeh3cVBzxnq+q1Vaq
t9BwKdX0BqrtAaqzV0aeUGJ8/PeczqIqiqmNVmrsqtVU5qvc9BzVNV2q9VZPeG70FVNroHFVTrnP
UmiqtVUyqsqKrKjKCOq3VfqvVHNlTFVcqObtQ0B+aM9WR9e0XNVnaqzURUFW1Uzvn54oj3R53Zzc
11cjVU4OfVTzUH4HiyqmNRFhWOq9jV3hDmy6jmqKreKq7V10E9RUHTdV3t0qpFdBqg5qr1XVZV3N
dXxVYagZooz1fVZ0nvKD3mqp1VaqsUFV6qzVevnqyqnNWH56qcVUwjjyraruZVTuI9uqzz1NVMu1
V9UFW1fVTGqnNXVZQdqqbVU5qy4jxc+XVZqaDI771dVnPlVhRxxc11U5ygq6qyerbiiq6pNEaq9V
tWm5j1XqraoKtq+M9X1U0NHzVUxqpzVZqu1FXVZVx3Hz1fU1POeqxzVMV4erarDqv1U27VXKjmqv
OKrfxquc9B8u7qI7q7OeKq3dBU7jNV9BUZHV00fpFzmu6CgzI6jmMaoivnxm5ueoqWagoKCgVBUV
NVqq7cVAs689W9LzpVYiqYj0BqrVVOOlVqro3HFVaVX3UVDoavqKqcnq2q1VZqKCq9QVXHmUCjfB
R9eaqmVVOKrpuaqzz1XKt61aepyN3fOagjUVAaramr6uqphlTVcq24uY54NUNWVXDmqphVtXmiNQ
VWDs9XVWG7PVcXPjoKCM+v4jqpjFlVuqkK6iqnFVPbnKCrFV1RVTg1W9KCpqpxVvX8KtquRtnyJX
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
dVdvZj8zw3NQLKvpMq6Kg6VdEeq7VYt1NWug01V9RrrEaNVZz3GaqyZHyramqz3oLq+85jVWo8Cs
1nqtXkVTVxtVdHz5URZnTGdRZVh6uWPJyzVdzqOovnVVw0fNHFV1BQX3d1WaC8qpwSNzVfVZjq01
X1Bqr3NVneqzHdx+3FQ80USvnqphVeoDnoKrFRjqareRdartTrceZ0iqvVWnzZz1UxqAu3aqnFXR
7VA+c1V/mjq5c/vP1jqFQUFVPMqumqe9VMbs+c0UVSbrfXrzVYlQHug7xOgi68/fmoI6vqygy6rF
BtUDyqzQdL6RH56r0XPlVMc5oqrp32jbdV2c6nqTR1HNqoqu1ZQRGqphV9WX3I0NBRhhVNDVTJKJ
c/NVhqiq3VZ5zxH5jxGqsVanm3ufNlMf8tJY6D+NbO87q+huppp0Vu7uLD3uPmpSTNFfY+GvHe7k
qMd8/YvlmzKuPK3HfWKLD9c5+qOerK/Q3arKv0ufXsZHpEQJd1U9Y3zVF9sXPV24svKuquxfKDuQ
ZK6Zm7xlM22k5DPvzkR1ydWVnZs3tWfZu1NPX2TmX3iOZnqsR1McUSdBEjZ0zunh70u1QrMjzx4r
xGn3FnTmPcdPeRW8PTK3NMmozFUpStSu0XMme76Wer9HnDR1NGbygNOnjVAu/alVv7FrdNOc0vOa
o0Yx8NtvzDU0b/zS7GloNn7G7q+mdYpp0Vu7uLMjfam5+bxGqGo8iPjvtclRjvn7LgRl82Kro/Mu
z3dxcx+uR9VHdW66G7VZV+sqdSx0+oiBKgVXR9Y3Q81WX2iXPV24sPlX1Xub5QUFKzkGVs3ePeJt
bd/TOg5yL654s07Nm0rPs3avPX2Tm335jms9VqOr+fmiy6CLIs6Z3WHel2qLRlzqPmvDKKfuLNVB
7jpzRHzmu8PTUq7tsso4iiXpWpXaKoZ7vbs/tV1nnIzR1dRxeUBtnjVAu/fzd24tbppzm3UmqNGM
dVWD1WDVWI6si56CgPdmi5s6VZFdB07XuqzVYqMqMUVXdD63lXVXlzRKKpHO6Cgq6p34utXdKFxV
blBHUeboIjc9X1FBzM8dVyq5GddamLplxnijPfagoOeOgvm76nD0EUVztWRvtVbqsW2fMNibijq+
q4Z1f3oIpi6rHNHUZHlReM7Od1U46VNW1dFznoLquR89Vw2UmFrqDVXL55jnjoKPIu5XrFU1FWc9
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
+ginXeZVlBRn3lRuqndVOKu6GtXQZFzHquZVvP32dvOdH51UY8Me4quN0qptUrni6aur3QVXarkW
OLnNM891BuY9BeRmN1vtHfPkeZa5maN0HW6rvOfOajq2rFV2z50ygoM5jYbKA0bP2qtVU9vfOeI1
VgxqBd8t81tZQHOeLr17GV3zDmqRLVjqTXHEajVXni56v+muqzEfKrNVzD0DoD0FXVbzHNUZU1dd
XVZVcEi9fPVYygjUfV1d66r1uro0ubrU9vPdXH5u8+ds1uoibzGumczUZqDt16Lo5Xenn3pOdI6S
RLfRx7yrGc19Dms+6DL3zRburDZmo6igq+R0dGsmKZ5RP2+eOhd0bN0xu3QbM3KRlkmdfaMSdtnz
dHR0dfs7Tuj107zMU/QH5tx5Hf2gjN3d83c+U32tIvdW9x0uRzJ8o1nuurMmzTHSdkfTpt+RuK1v
mMboqmeslUHjx708M6WOTpSdDR9Ddaleeu4/N3Xb1urIm8edM5ryKpN37voujd2199nPeke96zfT
n3lWM5r6GOY50svmi7Hq02Z1jqKCq5Myujo8y1TXlE05OeOhNd0dm1jjdug3q/8ib+03aWTX2SRO
PNuSWWVXcnrujiXXvqKid81DHnPaUZu7vmoD5Tfa0i3q7UxHJh+e8o0b3p1fQxk2bzpOyPp0pXfk
b5rXNuzGmYsq6emMuoPjS08M/I5PvZGNGsYTdV+r+c56rFXp2aYvI21R1XDVfVYzFHlVNarOrufT
y89dxGovPMPRte/0u3a5ve1VtWc9BVTjOaqmR6iq7s1WRGjqsuKqzRKqkWqlSr6rFVIFVmaqvVWY
6mz1ZV1QY0Z8quVXTc0UYqaioGVU4KCrzc9V+rqrNQrjn6qd1Uwq5e5VTWpMbIqrZr59uM3SqmGK
+k/VTCj7ZrVViqmHmVUxu6uq8+rjjy812N68WIx5z8XQ5l5lT2dnUwAB///////////0KgAlwQAA
AHtsMPER//////////////////////8JpjFiSnJGlcaNnhsnLuLmqpld4aq3lV1VU4qt3z9KqZGs
3aPmijyrYusec+VHjfNzVNWVFTU1ZVZqajmfOfqaKpqDHi5quqObvG2Y0cRo4qrhncdRUVMUUeHi
itxn5uapqsVbV10Pedq7Ld3V1RUc/NUxZUH63HUVEx1qtxxRHquOOKI9TURVXqrdVNj7Z6siqvRd
bOaKq/VnMe3FFVcqs1WKvOeoNVfuq5bquVZ70P8yrI7q2q1nlViiqv1GVWHFU1WOaq21VTqrqKrN
6imt46vijqvHqp61dVIFVNqqd1dz1ZlRUHfXurcZsjmZ+q3VYjqalRXlWHqKg2Vbq6mq/dVM6qZ1
X4zxVWzR3zZUu45wVdzxs0l815dx1dLlTnPVT+8zIqmq95VeiyoyM54t9Lj5vO3Y2+eKrjH5m3+b
FvKrl5Vpm1HzW495z2qmpuNVNXGzSyKq9cSqv85jGu6viqt7s9XzlX3URnzms1VMD6qph1Pln58v
Oe6u9jNURUZ4ubnzDVU5q7dRHVcqzKvt2dVXqrVVMKrdVuq7zc9W1fz82VPNlVyKM1WXHz1Zu5yK
KI8URzxR8/P5V13V3tx1U977nutVg9zKfPaqT86txVdQ2fKvPVecdWWY53FE5qevpOXHZqGpq9T6
9cfOscdVzNd7fkkbqVkeVU4UVVo9WZmVCPfP54kbnPz1bGaq+bnqpRzmjuKpqpxzZXtHOlKdVUxO
eqmJ6Cq/V1X86tc3Xo6u5o8R8m/Jm7OdXEyh44qrJsPdnyqmNQY8cUbtzfOqrtVO6qY2zWaqmLUb
TbjSqKrEVRVTW6iqmZvZ+zRYvXmeeGo8uKPfRpdmvlVIeUFVM1Vijq6qzzbqpB7GOc1Vg9W80Z4o
o6g/SaXar6rdVqq9dWVBx2NVT0+dqr1ur755//dZVlVIx8j3qWr491KPfkz8quKjfOunP27VWKna
nOmZz1XYz37pujV2nka5ou7PFs0WOrHzGrmR1bOaLnqzI/F7vs3lHs8c55c539mtG9US9aiSbval
jjfu887RX6aOpitdtY81UxHuKMpKnrJy4+53jd9Iux99map6Z4kavvVWqNeutHFaqaCKq5M3VY5r
3HmJbRpnJig6xu0erqA73JutVdUj510qe3aqxV3ZPpho6rxr93bZqNTNn3nPlRzd6x+bZojOrHMv
mNXNkaOzm5qmow8wpzfbqzUaP2jnPLnu81o3uTkW/WubE3e6yO1HHfjv2hyK94uep5rXbWWbzxVd
zR3EeOdxzOe3zmPeTFu+nMo9bZqlZpLPb29VWMjXsWvsfNfSrs5qrquq1zXuPLxpTWTfs3FMXmTV
BnV8kM3VYqX1iq/mdDQPHzWk6rxqrlVvFdBNHed+xu6eNUOzHNGeVhIJhbqciXNca7Hq+oznqsRV
blVuhi316Yc1BQR2dZFVcqsVedHiPVYqpxlVioVVyrYvxEmkKqYVWDRaNV1xNVWt9qrh8xdHVezq
7s/PdDHVqzn5u9VrN3V1BQVU4yK85squWahw6ic4u/XnoDmw763QGvt0fTM7JFlrpZlRHO8oF3io
DHOY3NQcy5qnDVXMr3V8ffbi5z5biPMOgoDRxdKA0dXVZU3hubnq6qzVdqajnqKrFV2rebndAjHM
n163zOgoKA3NVdqdnjiqKmoqYqu5rqT81WVXqrdW1cz894bDR1NWXFccdVzmjqarHNz4cytUNR16
9Wqsq6pqphdVODvnNH2fa8yOrKt5z9aCgV1ZV9WxZ0jquKz50itUNAer91MVViq3FmT1BQVXKBXi
yqnFTHQxxuLninsiVT03Qcytbqp1VbqcmKmgqYmbpu1rdmy5nRqrFBfOfrGaM/WrosNzWePzVW7u
g0bKiPObKrryrZjIud86ts1W0ToTWuq5+lXVXr7Lt35j1ZdxqKz5QH6UFAznoKrpo6s2l+W27vKn
pOXZr6Vaa858ugygioL3HVYq0153oKDFPKqykqFvOiuq6ecs9S6l3QUDs95lVzKrzMz82HoKqcn5
ue6tSq2gqyq7FQVN1ZV/aKr+eqzdHdQqr9VvnZ6qYVXqCgVBvorugioOx6iKruuGuJZOavGa+zP2
ccfTdn57t1YufNbvLqstdee6ufRvpQds7Hqe5uqNV9BHQmZqG+9B312R6rHNVjoe2soPZzpuPaqu
qgoboelBMc156e6ryjNQd1rqz1cjUB+ijZqirKCqmOVHWhquZQUFXVXNd6tqsRYmZtRmoDdqrRqk
1XH7J2eJKOzZeWu0Z/Ohoz0C63V1CeLHHdRVuGygqsGzL70AqphzVXW5hKq5d8yO7Xdc6XM1QH7d
tWu9RQW1dTFQ0Nmw/MjGWNnoI+dVXD1FV2qmPNlBQGu90D2bFFV/N3qtVfVTOqnfWqwqtjtVWoso
O9Qqr0R6CrL5nVTmqmNV6I6NZjugt7uh3UHNzuoNGZZuazpjNdFjZtyUWuniXlDrvtdnzuL5h3uI
6oMmD1d32+bqcyznioYrb575u32cou2qsZ0t0boO0TnenlyLPf0l03uYN03r1zfOZd45o5jmNQRm
q+ojiiPMT1xZU1Bu3bos1qKbwxsjNQduy7aji5873fAned1UZl28s3Pp5zVffNdS860Gu+XQUS79
d733nebOazo1xR2r83dDurDm53UZGZd8oaE3UziuiyebzeukwnrzVBOrb53Fh2+Y6oMPV/fd83U5
lnPzbitvnuo7LVE3P1YzraoFzPTczvPV/UvSZvcx7F03r1zfPioIznMeLoZRmq+o5zczPNT1xGqa
g3bt0azpUR6wxvVGZ3L2XaYj5s55c73fAneJVGZdu4ue6ir75ph1NBioNUGUdBRUHfrQrvqowJB3
VvdXUxxVPSoeY8SO8qsdzOqm9VIVVmrI2arVGkbDVP6mEv6E/7qJtdGY1V5mqavu7P64qrBpqgVT
Eaq/Vfqu/hhmsifarHQmNz4aq5dWdT1BlZjx4ubmn6rnMY1BV+86JWzT3NVlBz9LMbudgy58jzMq
pGq9VXVHVvPlXZs0dVyeMk8PnPG8joLvftSaLvFFzmdBnegjvVXGygyKKKKp586mN3NVlVqrp7Kq
c0HNQVfl1ZGbcXQ9A4syq/VYq2q5U1bfNFEdTFXVZz1cfKjt7U1McZ6Dm5rq/UR5hvMNh4+aKgq+
qxqg1s9TUxmqKudXX3qIzGjPVYq6pqKrNBV6yrMOe4pyKoqT1NTUc2KNvMNzZlBQXdVnnPVTvpV3
NUH7UHnTFUVL5uc9895FdmoOaPLjNQc1TU0DqMu8znjqu1NVygqzDVdQKooKrFQzUNSfnquUVmqu
VZU0HarKDOagqYqrpjd6CYV3zRm71Ux77ugNV1Aqr7yp7KodBqpoelTVvPQXfBH2rqC6igjkfBF4
xHVYYMueOq6qmr4o3lXR2bmoG3zXfMaram8PHQVXIot1NXlvz2CLoMoKqY3VduLMMfM56rccdV6o
5zJxKgoJzOapq6LO39y95qgoHKpihRlUxxbyLnuIxuY5ud5VZ73GeNXHU0DNVlBFFzVZV0ZucynM
7YzUFX1FVm46uPzKh5zmiqar1WVJ+9RVSBVcoLii7bePT1NOe6I6Nrrz8/Pn+1fesugzMMuaK4s5
qr5quq2qmMZ448qN1PPzrFZouao5o6sqv8132q42VKSqtGqyK31oOegjiqY+bI7zmveVbQVFBVZq
uLIu/PV1BzGquNTS7vWRnqs0NTVadSagzpQnqygquHoKsuLJxms0xd5Hvn57RsRjHiuz1N0LzFz1
FBFQtXUZndUNV2qnWUNAlkUcdRrm5qk6R4oqCIzypf5/iKCgZ3Hfd1WOaovKsw1VnIqhVXeeqkCq
kWqmOVXoo6E1BzVFXUHWPnjuxUVPBHZNTGUHZ1Jj1dd82bfPhqA1ViqxErikLt0DWOPWn2WPxWlQ
UKu0aKXV9unegflBFrdAfW6JdFs9+8z759Ns7jfPnf03UnVY3jvmqT1Bjo6eTXM97fycySz9D9Fp
21fuczjMdUEV9EpqgV0cVS9a3GY5roDdKTOaR8zNnd++ddX0au43Zu+7au81EegmO+vIul8/u5nm
quGzpdWxUfaokLu6B6M/Y+jvNdsxtHocoKHDnRjPD99d6C5h9GqCKYkoI90B+m999Ldnv2obX03Y
7j1Urv7F19qs7ygluoqTnqIozo66ZQ81t63521kln6R9EusbtPLZo6iYjMfHFfRTVAro+apoNb50
Y5roIukmc3nerGbO/RzHVatnabjdxd+16VnNRRRqY79FF0ivn9j3zVXNmd1bFxLwUUVx1fURdsuh
ccXuo6s3Ve7XVbdAdn8uqxJbo90Qqas56rFXRPtz7C6fmqvoD3Ujr1oDVcsoearF3NQc1TGqrVXe
RKq9V6NQVednOZRs2G6c+c+uY1Rf+dOBOBxKgq62qBqgqzv25zwNfSos9X0EVVmKq9nOqsPzDIqC
Ogoee6D3n5+ftV7o6v6ymqv3Vc56qcb7RZmdnd9IuY9rDRUB76dsN1dB3P+/5CI2j1dRUC58vtV0
XbsuqoOqoOlTVvag7UFWc1y3HV1WuLDZzO0aLrQZQc1BVaMrquVGXEfnqFHV11Z0uKrsurubmV3z
SNRRtHoJO+R88fPUR1NVg91Zz0FvOtRV3NQGq2qmGdD1fFHFVdjqznNFznuow/MbLq7mdBFHk1dX
Gvrto5qjnNkb56u5qtqYzOOLrFUrmztJHzxVWXVhjVXIzm0fO/POVbVZPzvmq7VA75qruM0XOe8f
Oeg54uc+R1ZVcoOfmOfDvSoPY76Pni56jns0VqJUFV2q0bmvtnPQx1U6idAdGi7c9WxxH6VcfvdB
VkdBQKo5zKpyo61dZqrVWuIaeTnBKrqrX2KNZfMj1ZU0F2aq9VlBVxnVseUCjXu6rFVhZ0jV1bzn
izmqY4v6SXholVdiq/nqyr85r7ZzXtVEdX0FXxdlHVrdXxbcXtW2bmijjfVW4lnNHHRboN85qrVV
w9iqm9RVyfPlW5Q1EWdufnOeqzcdAsNU9ctmq42jm5+aOgyq9mG6vnoKlzdXG12i5+3PQHPQm58n
FOdO+Jn1HFnWoqunq2Q9RU1ZQVffTD96tvqmaq4qi+lVPqkzqYjZUVHMaYoFV9Viru3ROqyfpmUP
MeNUCOY9XVW7qLcVQeznO32WqCq8agquOLT71NVzmiqp3kZ6rNmjoI6qY9oprsl0j6Kq1VeVWR7R
jVXKsyq5URRVF3QX2tGO3lx1ac0VBzHqsxvpzUHbGr3Fz3z1aut9FcfQZl3fY/Olmm83/XtAqiqx
VvPQRGtrIri3vtZ6B0GVMfN5VTCZj3Rbozqo56rKuruw7RBXHz1DBqDHfWpq2raj+rOeq4e1wSoD
1W6A94e+azVHMd1Xah3HHlVyI0aY/iLmdQoorw5lQc1XOrKvqeY03fRZzmoPcb0lF3XuqCaoFUOg
RsUXPznd1Bc95mRGXbvHqLdBH2PM91UPt2j+nJuW8ypPFG1Erzrdnoe2UUdB31LcXt5dq1ffI6LG
r32k30a/vpeLE99FkkRzjN4bnNQH8ove2Ko60B+2RTjWrivt0UTw8TsXQ3zpKJ3eXvFeHy9Y1HIf
NTkyaVdHi186YpDm9qelqpzr1PvDXmk2c3XI6Cg64qmL3Lz7Iou2TnW6CaVR0oMNiqIufnSjdQXt
g3eI1B37x0XNQR9pm8qH2P2j+xq5byrjxRvtFl5QXcd0PZUUdBqW4vbx3QHVB3znosay3vvvTx3i
xPfRZqI8exm8ypN3oDm8oteLO/NQX3NFONNPZ2dTAAH///////////QqACXCAAAAvJtWoBH/////
/////////////////3cV9uiieHiZ1dDbj6myeiu3hk8jPQ3nRc+zm9NqcRpV0eLTxXZt1drR1U51
6RvLzonkZqBGjoGG02mqqaG7YfndVgRZmjHvnquVWY+c9Wx1fH057dBZrzm5qCPdW1XRlVMqvNGm
ua46rNWVaagtVZVtXx89VyOqyepq2g5ouegoIubfW7UVVznoKuqtqramoqYlBXzg5qqY1HOYVXKi
Opq2otmqxnNEOY/N1PVk1FFz8981mXPUZGe4rNVvSOrLjyPKsNVTOq/EtTSOjOgnKA1VwlcceazK
rDqv1HNUotUdYonQRpVceqwaqmBqrtXxHqpwer6GgNQYj5Vx486XhukfNO807V9Wc9CquzZ8w0eV
NTz1FVi6rkV0FRVaqsVNX1FVyq9VlQeONLm5u0VXGqsKrMcd3hqt5quqeeq9FVl1ceruegxn7mi7
J3U1fU3QR8xz1XKrZueKg56r8caoMqsR1XarvNzN1NTU1NQepqs1XqqcVU6vnopioe+nNVZqsHq/
nPHFHU1WTVAOegznP1q2Kh6Oq5Ge6v5qD03NQ81V8+VEWRPmRs50uY1BnMotUJuePMiiwlU3z1PN
NPDVdFuKpi6Xs9BQGoNRO6tR858PEue8urFfaPKHnqOaKrIqsoKBIVZdoxojmygje/x3HijP3iRa
gucqI4vfav7VZz366u54o9XFzHq19sTis91XKk3ndrehh8RqlLmqsRm66VAaoyru0R89j5rXPUl6
A8aygyO8uJHq+oNb0VoNmPHHVjjqbUToKJ7oKBc5ufu+bOmRVdUR9b5rugjyq8fDVU4qDxVbU1fG
Y/NHH3w3O0ri6m5ubOz2133zTz9vDmHY7qs1d2p6vvmdrmoD4f08eqtypU5z2agqyJPrV9W4eLvZ
uaoPhj0BOO4uh1UXbNbzpQnRz0DoM71fVfqKm7msuhs05sxY9RGzo26i24jVbd1ae8t0FW2d3QXV
YNUxmqpxfbWwqh1BotmOfLPGlV5oo3zc5r59I5rNkdRcYOe4j85rR91WciiMd1XKvu6GodXLmoLG
R811WYoquqc7c9x6fNeroLqv1OXVmZFVcq2ustO+eOL8j1X6Cr4smN1ZVtXRRVGR1UwvmMfn043V
TiLmeVNXVNWVcfmqKKKrbYfrJuqnN5U1WarLs3NdXxM3NkZoojRfi0bzDVFX5Fkfbd+Gw8cemfmq
zbqciOaKc5s68+R5HFlT5ed8yNN0EeXUPOnO6tVXxs04sq+Pw1RQZQGzLoKBxc2c5z9qB1Exz3kU
eqtvnnFGUiooqHOaKg56G6CY0neWsmOyVDfPRTkXa99vMM77dqtP0Z6uP35j81XNYZpZE755LqJX
Earm9Q6Ptdm79pbpcJVZd9znq+7NmrS8UnXfeZNjXTNKGl6rdBQ890HN2fW1HFF17moFcVBMYz5z
0Paq5EZ4arKvNzG53aiNHGecuPtUVbu6uiOaKc5l1qaHIzc8Rqum7NQZmR6ygbMerD87q1VXOdm7
pKOq5H5lRQYSoIsNdA60UWVJ+1BfNVmo7NFz6q2+ecUZSL2KhyLmdBz0MV0Ex0Qtm6eZcw/EqG+f
c5F2Pvt5kV327VWD9XV8fe+aoq+gmjGYUxkTvnkuonXzGq9vUNC+3W75u0t0uEqsPajPV9niWdDr
PJKDfabnTPHNLpnTIaXpc3lbLoauPQc3d9bUfNE+tB2NQK+agmMs5ueJ0Paq7FVDVTh2bMiZ8uPO
ouSrfKqcVBz0EXdZGrqcwldx1U3quVD56BO2kzkueOLKCF/9VeNURdo6CpPHzqJZFEerD87qaGKp
UUcdBVtWUBooxU1NW1dzdOar6mrqsTqyoqt7gSoBVh6v6VYs58u6uOjmyoGB3dDhqDrffmqs9aCr
8i2aqnEVRE+1BkxQZlX3z0Fx50Ns9TvWE6mOKw+j543nlBnl9Ea8t2ftQGiurhzMVYe7OvFQLLqc
tc0cXmUFlKCrarneIGOaOOOrYzxboT81Xc/NQVUwfPz1ZzUFVqq5VtXqcqpzVTCgqp7p9oqqcVWK
mrD1WGaqzfPVnYx6ipoKDO3SrqqYYfOeJPD5dRHU1W7qv5FEfn5ouY9mqvVZzZU1U1qpydVU5qpi
epiqv1WO9qroueIx6ipZ856mpoKCgqair6te1ZzOqzVtX9o87Mx6rlW9OyoKCI/PbDyqw6g1Qd88
XZdDG5vmUNTV1X0FC8yq66DO98/PVaq2o56rGRVUx3NI3bvV1Tqg1Flx0FWGqM52nz94qigN3cVW
c1VqqnHNb60BqmgqznqpzVTB0FXc6qsc9TmN9Wc+LKiq5FQNFsL6d1fi7FHQ9YmuYEsVVO4q/Qc9
QsRze2ouZaPaqplVZyLoitV2q7S8xojmLJtJ47/pt7qphFfXo6ipioMki6EulVq7V1XGZuq3h3UK
LDqMu06qZ1U/qw2v+SqsVU3PnSp6ugq5PKs6nwXVkXNcdTnMjGqT1NJUd6Dmnqs7WfdXcyzmyrFm
d6ruI8XbtauK6AxuegoOymLoXVtV+gq3rcR4ufvb3QRvRj1N1dQKqmSi6lWarmeglMkqr1W1PSr6
lbj53FHVlRVYR+5DWtOO6s7xVU4upoL1z3eJ51R8RqCrDxdTKqkGgugqzLedamrfcqv0HRKPnqpn
VTVPRl2oHrVBV5+a6rPaJrmfNG6qfmO6A9dYDGs+R0EZrZsjVRUHXPZjGsZl9MV9j7e7qcxxU2Zd
3negoBQUEej5I+agNfPlAoqrr5uc0TUVmDoM7536HzrVe54UFRd1Uwyz0FqKI9WHNUzjNdWC6rFT
Um7c9VOKsNFqKgi5oud53NVTCzc+6qfVWqtVX1abOcVHPW/UuD3UR5cVSaYqYmapL27PkVSs/JTF
Qerl0rea0Z/geIjrZ8XS3z3iPQKgiMo6lvvFmRT08u1Bln5o+ud+bnTix0GTh1EY3WOreY1VOD1j
+4qqcG5tHypqu1ZugM+ZdUfmyKKpy7i6VXT0HPioLNz9j6qaio5qCgoOaV+pOt7HmiX5Zv9PNKgC
6IpQs4V5Vfqy8q7FqKI1BV0UXVnv19LqzDo9B1xjmPHhp3dVjOfvzPofn3qhd5lAbDVZec29dnlx
23faa9mM3+GRv4+Y7cdDQxLevdxt5VvWz82UB6t5j5X54qB0HNNVGj1cutJ5rUR7Jvpz83TZ8TPz
vFzvvQRGUdS33izOae1Hnagy46iPrnbmq6gcWM04dRGi63VYqDVU5usf3FVTqKrNHyrqr1WUET5v
FQYeoyKKpy7N0qunoOfFQWap7H6VNRVnNQNcy1pYykcxOD8s3Y/jSoPF0RTTcYV5VTirLyq5jfNE
agq6I1nO7q3Do9B1xr3mPHhp3dVqp7VGuh6mg3qhPdmygNhqtvObtrs4tWe277zW3mymZz6fMzt8
6oYlv77uMzmjVbGeoygPVYqD5vnioD0HNdQ4sR+aq5Veez47KN1WqrN/aqdVFVPqqafbImcZoqs5
oqqYJVC+nqpuPn0Ewyozn6VXKt+c7NV1TV56rh7PrmZc6q2rKiKpioNVWOaqznPU1XDKKrKig5+f
rQdKuw9X1XaruIVXTVWhUugqceHoO/Mag5roDVNRQX9ZqrBozVca+aq+6rtXVZ3oDKpHNzxmuqmV
1W47fPVcs0YXNz3kdVPYqqb1UqRMWK9Tz1U5Tqpque6mgPVadTeXV2sqN1ZelVT3p21z1X6D7VTf
7HHUVWOaKYecxqDnVRFdWRqgPUxHq+q7lVmqxVTmqnFVqqmFXHvD1NVOzx5FVaiqpzVTyrOeoqvZ
eZVlWVX6r5leR5Z7s9Tz1U0qtHuoV0Cq2q5V3Mbn2rxe9a6qyrXfPHUnjUdBQVYaqxVaquVX1lWV
Yd0FVqqnNWGiqv1X6rFW3boMqsTBuapvmoKA5+apNfPUc3NJV9W3Ibmq3grFU3h+n8VWKs5rquau
PXNVdFX88dWHyqyUjiqzmo7ygXegq/HhqrlVOz3GeoxVU9mqC7PiqD3FQ3Vcq4xVZfaqnFxxGq6r
enNG6tqpwVi7R01V3nq1mugVWMxj88ffmqyIvVzCSShVaLitVd/xVcbmyPnIVb5Uo9BUxkciN0Nf
Wgqu1U4qv1U1xVXHVs+leFxWFYv8H4Fv1+lxaygoOerFVfNF3srViPV87negP12qqYK2wqrOX83W
jw1W1UiUdH+2Opqp7klW0E1QVfHqjnqr9VizG5qCrk6Cpcd5GeONKq1Vlx4agmJygSMqg14fpfP2
XTtlRzH5756uoKU3fnqp/FVcw+VNS+epoIuY/NVYqG6nD81VMbiIc9V+r6Cq5z1WkaLB1Fioqphz
xxUHbpdVxMRVWMquZa+VWsoHdSdVfnOpyguKLIunPQVF3z99c1V6rz1WVJ8TiqsVXKiPvFQRO6A1
V1GjV1G6r1XD41QVEVV2N5QO9H5oqsw8awxsjPvMq2qweo61XKg8T5j9z0FBz9o+YI/PUxLmjqcu
pqMoDxE5asVVioq61QAqfndBEoqszvQG545IqG7PU3zr6ciaLnI1LqKsNFEZI1VNK4vmqKr1Xc9B
HzjtVTCraCgoLqyqzVaq2go6qcH5qipjoOeKrKrHMo6ts3aqw+eIx8lXMagoIj1ZEaoqOeozFHG+
c9A06Ck6RUD01hr69qk+VX+epluPI756uvpH5FjqKtqtnjdBFz9Tmis2qDnikquc3PV8SttGM1FV
aqTdKuquPDVMfPHzVYd98iiw1BQ0NArOfdWnuKrqt5qujiNUUtV6q5QVZh7q+rKvquc0XNVYq+qm
AW21pYr1zm5zVLC7KtpUF88ds9XVU4qearIqviXNUVL79+eOoHaN0DPHlqrzH5jx3h2o6BVFWHjP
V/Pzs3NlRzX26VKNnYpFNZQdI/tHFMmSquUGfe+EqmKz0B29mjiXM6Gaq41TQUGc989WX+RO6uqp
hVfq1RxmoLVBQUnNQOs1kV9sqT5VTqpq71x5Hz1dfWPzmiuoq2q3fPQUEXOozRHi1QVPNJVcqOeq
5ErbUVmO8NVTCrjdauqu3hqmPnj5qsb75FFFhqBPKBXHHuqxGeKrqtqKujiiqKWq/VdoKtyO6rlW
1fVdqIuaqzVcqpitvzOuZl65zc9BFUtqg75SdFQPnjugPV9VOauqKsiq9VCqKirrx88dWLtG6Czx
4fHVcMfmPHeHtVNBVlWH7Rx1XKnns1RlRzX26VOG37FNLKBx/aOKZMuiqu0Bv1ZGpiZ3HdA980fa
Jc1DNVeaKpoKDKm6mrDp3V1VMKr9VjI48fWojuMzqum7bHs66tqsROKKcoKmYyhMU7Kq5QZPPoDH
FVM6AeVW6rNV7XlVPWfmq6rIt5vtdxxVWLjjiqp1V3Woq3znPQUJ6rlVyrqvqs1Xee8qaihiqvc3
Sq3M1XRVTSt/FV/sePn6TlVupqKrEd1WKl1XI950joKnnPU1ExcfSYP2yrnVmR1Uwo3hooo/L9zc
WPnUcVBPcxRVddCIzVZfroKSrT5QN5VYoG5aA0XOagqvugkOY1ViqwegoKC+Z1NV2goKrNVzdWVf
V2+/SY/01Xa5rPUc1Vgyq6K6CoqplU4arKrtniuq7VYOaqzU81XO6qYR1WqqdVU2qp1VTaYiqpQq
pAqpzVamNVXKrNXVY8i5zXGeqzUxHq2rqrNV2rar1W2bnqpAqp5VTeq8d1Wqmq3VT29ez0mG7VdV
TSqnFVMKqcVWWaq/VTGq/VZqDVXardVKVVIVVyqzV1WL2qnVVmp56t8eRc9Viq5l8xzVWKqeZV9x
1FTV6quVWfbqppVTyq1Hc09nZ1MAAf//////////9CoAJcMAAACRoQ+yEf//////////////////
////FQfKvRp03MzUCiZkbI8jtR5VwznznqDztBzdjdqsiurIqrkVDlrIz9+ez1FXrtzq6r1RVZNU
VFR9mMXNQYeO+btV/OfzURzVZz1fVnPVTCrKi48q+r6rvNVjqKl2eI3PFhuaZFRVZzMEZqrVW/Tc
81Zqsq6O8yvX56rHS6SPrFGaKr9c1DnnMKhc8Zuc/tHKb8Io6Dm8yq/VlTNcx5atmLNlXfU/cO5z
tSzVRzdau56uquc5+Y1VMHGqirqi10qu1WKv5m46sq6oqYqvqsVdVZPnPVlV3OlAt7xZccVVo9BH
qqnSuqzF2PUPt1ank1VbvKvqyrKrtXxc5qjtVbq51Bj5Vpzx4eoq4Vfz0aFWVXI90PMf1c09UHqu
VaY9RPP4qA/nWcfN5zVe56r6rNVOJTVff27vKC1Vc+9qE9BFz89WXEc11Wnzmq/Lt1dUYuZJ/a/P
UZV1x80VTFkVJzVFRfbaw4WV3zVMlXSc1QzV7iyoqed5cZrw+XGdRc5sbOeoupi85uepj5/LPQnW
kbvVaFWVU0qs5dV08R1FcvMehNHWi8mj1Wrm4+erqv6avbjmKrXtXVM5NzFSfrZovKGgqsVdiyIS
1XKCqnRudVXIqsmOfn6RxxGVmq00XPMRRdsPU1WOap52eqyaq9cfNR8zuq/VamaqZ1o+fMq6qn1V
NrqpzVTE1VOT81RVlV+q1VcqsVdVu8quT6quVU4qs89zlX1e/KlaiNGc9Vir3lW5VcqKuio3V+VW
47qfO2zxR4erqqZc9Vurqrlniqpk+1WXV175o8uOSoqseadXVB91ZVYoVHhlZeYjz9KntQ4cpEun
PQHj5qmrDR1fdBVae6A+UJ1N5zUO+1BlWVZV1Bl0FBVlV3PaLv2nHzHY1pHeV64QMYgj7qKvsyaa
uqmxqrnOXi6GN4zY+3bm+dqtM6vPVzoTy0Fx9bvrfOtx1bzGd2erJirY6ipqKvRxQx3zROKPnq2r
6rP26t56v5sM2MHOfMZ7qbNZxngqarlHU3ORr5VlWlarMdV/mqyrnUXOeuratWRc+rqvVcagNhva
iz0Ht0HlBlVyfVV2qnVVupy5yq5Vcr+VdnriiqbOY9Vmr/cq01V2oq7m8dXmqphz3UzHbZ4ueOOr
qqZ89VMKuNVds8VVM7dW3V97qOcx+eZqyqz5p1fVh+1W1WaFR4bDl5qPP0qe1DkcS689Afnqyrqs
oKA0dVy6Cq090B8oY1pc1DvtQKrKsquUBroKCrKr2e7oO0505jvaIJHXiBjfSOH3UVXLMmqzV1Ug
Gquc/kXQ0XmosfbtzLtVpnVcjPV53Qx+y0F8/W31upRKOreYzuz1WJiqxHVlXVZV6OKGPmio+bn5
6rFVyq1u6s56v5sM3/JlznzHHV2Wa79eeCpqu0dTej1Ko6tqsFarXPVTmoq2q5dRbuqxVqiqdHqv
1cagMY3tQHLZ36egm6Do8xZV9V2rObySclq+re0RuaptnPVzzLVVMBzKOKKh7xR3V9R012Oarn0V
BGhuK7iWI8RjYdUFB060FTupqam4jd+fo2Y9nioF3F1BjKKrrd+xfT5faq/vmvtHQZV65k4upqCp
uYeY72qqYLnmZYvfmjmqKu9qs3Zrqv3VlT2uLvzSZFLLV1W+Or/VQZV8UlVuqnMbPo5qjLw26nv6
eKY2epiug5+vPV04agRznSN3qw9Wmiw/NVlX1fFZunWrarFXVcY2GNeHNox+c/NzWerOY0eHoMd1
PPUVWVrvj56nmqOeOzH5nQYaoqzn56tqsVdV35YdR4Y3Tsc5jRdHVt5z2zc3NmK869ceWjHoKA6j
jZzdTO7zDZrrOicNz0EUfQ/Wq5d8/PFQ985pZianHrnyq5auqmkpvOerGedvOk8zxc7PHFdVOTUR
rPdugw+R5z9lEeI5j8+7qpnN1WMOl3tmw1RmpxrmiV35htn83m4pzns7zDJxUBoulueP3QugyM1B
HVvPZrqLXRGDPM9GxWM+x6Cq1QJ3Vc37EzXRO0sNiizI7iS7x2s1z3z5mOoqx2dVOR9PMztOHzUx
Q52VR7jZmuh8S7VbdVgzj6rKigZ6uq89rv7cyd52jqy8vplTub7x3o53zRxxnjyoWI5udzGZGc76
XNmvKvZ4863V+IxqrJo4jdI0eI/MsnczJw7PkcbDzHlBHc5H0Pd55QZed6BLMs6y4/bTb5jc13Fo
xz0HXuY7s+Wmr5j0Z7i54rM4ojm55ncRo47q9VZOGyoNeRXOVceg5+zNFVbVnqOuJI7np5zhXser
qtMeJnuNxndDfPl9WaKK1E6CovE8nJjDY7vKnuzZkfPvot9zXnkvTOv9+dqCgvsM7VsPSy0GUEVX
XVjtqYNeRGMactH6c5uerOcx8w3XOY8VB2qetBQG7iJ52k6n8narVS14uhrdnXPV9QapqKvqvVWD
Hs0RkeoitZEoquuq7VlVrnPUVfV3Na54qDzdbUs9+/n3xGKovd49790S0ueav1aoNtRxOgPV9XVb
zHvEcLnjuKW4tKVxN552vLmObDGmKD4fcVq/lXVcZe+Gr0EivcyvmIJWD3h+yVfdA++roNuv7gvO
a3kcppvnak8Zu9JQc8dRzUNWT1VzvVeOqBc2VMfbot9zXnkvU3UdqBUB/FnesaPVBlBzVfdW2d5M
RXnNFEaeOj9Oc3PVvOY+YY/XKg8VB3qetBQG7qJ53k6n8dVurrXi6GtnOvOeq5UGqasquVXqrJj2
bmiR6iI6NEoqvPVeqyqmHPHUVdV3NcfPzUBDdZT0v80e/EZfhd4xvfuvEqlWlqg3rnM3Ier6uq3m
PeKNc8d80txaUocXR552tXMcxjRTFB8Pvms/tX1cZPw1dSK9zKowZfaRWjnMftir7oH30eg20YPK
i3nPFN1J8k7eM3ekoKmOo5qGrJ6q66rx19oFFlXRmn5Xs1V9mbMopepqCO6jZo7pbzRt1fQLm12i
oLqT0B5u7yYqHz5VxzKKSPtz8yeT95t0FX1NWR85qhXdmmju8NnTt1itZNdGZupZu5nzGqehpg+c
1r6ahJtuptVB6k5pzNvtQUHkXSgaxUDj500+nag2bVVxt0FBlBzSGvHmUKSxRczoJlRVXD9tVZGa
10NVvfKBm7dDc/NVcqtXVtVOHZpicw6eHqea/Ompq8V80boN1FV42zVHPFGbtVmXQWbL54r7WY1X
4qrlVipis0xOYdGiy6Ghc9h8qDHoEfZ+nbxqr6k5ojZFFzHq3My/caOUjvpz3V5j8/THh+aLKA9W
9jJXQLp00Z1d17rW1mXvn7vVmVXmvLyLnyKOrO/NnOzrndHMxTx6OccT6H337zExzc9qrLoL6LL9
6mdLeWzxVbHVdnah6Y8qsGvKqcH7n6fCzjvn6qcvTV6tc9BEz0F97ctDFz779TGMrN5OuZP6t9LM
fp26GNQdzOgvU1lD2VCe99eeeNrfags5o++nrtte5JnfEdn7xtxReI6u6rFDfPMZHdmo8fMfpp9O
vquKh6Ocn753Vzizpl3m1dmvInZkaj7dMqypuO8V2o+t50voaPn9m12R/PamM3jvO1R4jxDs+n3M
6G73OT3O+c08a8VBUxet2oqh77T0wd5uNe904zXHH1p+7MfnXScmLy+i2aMxzx3Vsmc0V1MdBVt5
z3HMdutX0Nrm3zPrFFUny7T7Xs/Z3FFE91cux0r1eSRm7X06dqAx0ur1RxKPoH1qy4jI7oOtLbO8
VTvuqPt73Ocg8M3syXfztMRKOI1A7sVXL7UbWc0UXsfPF7210oNG6PLPmXnMz9ts0fN+MfPz27oK
nD7z3fTLzt2qznzmra3nZvXmnrp0pI+yZ1c5lSjZeX3zmcZnQUfbT19o79P5ixpYeZj3FHUGnpjf
ZRHUSM7Gvh83LJ2NFH4qj6a9x0tDMGxY+b5HEeNBXS2byN0FWdMXR0O4lz9Bt9atPFcVCd0HWltn
ZlV2+62ve8ZyDwzZAyT87THMo4jUCZziq5eu1HayoiiR+eKc7dOlB0M9ZZzZeczP22zR1H49Y+fn
O7oKnL7Ge+iOag7dqs58qKxHxdnevNNa6dem5I+zPlzmVOGy8vvnNR88TVH309faOzpY0jHce4ue
rDLt3UR5za5ka7LzrjwL2TsaLn8VRR3uK9x+0M0b3Fj5qOOI8aKK/T2ZRugq3rlQ116UK7ps3Rn7
VZU5qaxdVPc7qyrkHnPF5V0ZsuKq4acXeRGfRI9T369zmupNOTmuiPFmZqKOOPcdBfYxuff3ojGi
547527V9D0On2mIruLFt7qbb53joH3qvZUmqI2a12nnF8jqI133dWbvnfaTpnPlQeg7K6mJR5N5p
mu7zL1fq2bmPza6xdcvoqCgPvO8fTZrvvV3U1BVrtNJtdX0zsfNbNzR9OaOhqy8PZorxpx+5zRXm
rOfrZ6jWG3HGl0jjiyPbfbpNmfeOq5lW8/Y2neVDvOiOqDvmWL6Og5jrMvc0um79NrO3fsr7H7Tm
RRH58529du2ZFfSgq+N8w7Wojxs+5w781HVkSqeZduYyZpzJ1Jn58bU6zd++syPojo9Bjnet307U
F5QTtBV3fMocFIbp3I80U51Sic9Qq+iu5jSqbyc7XzxZVZ1uLamDLveYdmj6Ls48Me86ZzXfM+jM
xi10ij3mdTR9lejdkfMNcR5XMTtmoXFQdP5oOi3nS3OUFnzrrZvXMGec3bT3rN9c6+6Mnqczpr3X
a3h+nqauYnO2nucnOftM5bXaM/X3tUnXMdUNB68XhtdbV0GGiZs7Tvhg+x5F3w+zYlnfDdZipoM7
u5zRs7WnMx9+mOh7anddlzJUB6uqBbXTq1VnVdOmdKI2RZc0ahmjVWLoOsVAulAaoNd+noOpjHvn
jNma8k6dO2tm3+UXO2lqYNvcVB1jiieedO7VsgVit5aozNrV+R9lEeKnnDqLqdTLlmsnDLO8W0r8
n86TCI0FPvvcXtF3d1L8rr3r2yLsbdZVwyvm5idtyXf4ZFMvpMLFM2c+RTZ7cWa1FtXvWexz/SzZ
c410pFEds+yJJvpn3NrZVpdlii54lZ+3baM+2dqzj8+mrf1z5Gbobp08k6dO2dO0X5c1TMPotUZG
Yze+brH0iiZt9O7R7ZArFby0jM779LcfbcR4hT6OubodTMzOzWbi32S7xbSP5P50mERoPm+9xOi7
u6m5ikxe9e2RdjbpFX/r2mK+bmJ234rP8yKZfRrFpxnyI5w4s1qLzsr30z2Of6ZcWWmu+tKI7Z96
mSTd9Mpjb9GyrSSS5ufmyz9u21F07G7VqaPf03v9a5zRm6dKFNJNYal07NmXs3q7I1XZG3ShfPee
t2zX02ubDqpq+++XQpdd0EXdW0c8VBmRWZZF1NGr7boO6242dIzy+1uz0Npr12qCgxGbi1Ue3V0e
7i7fbVLPfN7zpJvA8cXScPWeUHX5r4s3b5usfuvOiNzs3U1BqKJ0El9PL+XdDbisx4uc7MbMPhtq
4+2ZQWcxj7oLwx7UZ3QUDw+KhNz7ugfeg50jxHnnlAjvt1jOc5uuRHZjxxKeuO+cxz89s+UGZdBz
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
seih3D/W3a+SsWsxP1k/sjMxXu6smzY2dA01OW/vbpfcDBrNo5MCHqVotKmLajQFaYzcXdz6+aKI
0XYqjbP6tB7Ku+vb/nbKvkLev/e1uln+zt5uWe40mba0uU/8/W7nbfzFfvr3/bDUdL0un0/5Plvl
+RS3uBas8nRY69e/JuOmz9NpSE06kfsbNdm9jqo7GGVLbHaSomjuP6VzcyIqniRTUPOf9yVd6zxc
z+fusdd1Usb9F4MZV/9NH7dbiPfVZv15VJLddq26vPlqooS9+Mk8GZN3p8bYkp8oa2vmxEsnJk12
e0aH8UWwa7N+4C0N75hpZ3yz8bd5PUzebokTnRbt+Edt8Cs3+9a0P4dJol4AHqUocV03l0ZTfYbM
nTzMY+Oi4ymvh213t3uX/1Nwc1kzNxf76YeN6PHLpwNu3N58vJq/HHTBXTzIxz5IivqtN+7TFrVO
lfspcUZnlkqblm7Spx74lbnkdD06yGEjYvrq1tMv0dJhnDTX+qbJqcu5TdQbNNSaOB7JogV/024y
0jncT2Kqp8bso2/bwzY+cbW7jFftcZrua/btZSQ27/I2HLZXXljWtzasSdh1ec7Qky12SA8Wnzhj
oRnd8kReOJHt1LabWOf76QejtJGJ8bFRZrcN7hgHbd6ym5PRsjDPux/7OazXxjGA/gMepRh4K5rg
2o8EMw9nzj/5lRFxcHvarjWTUN7uXYHm8i+0rdbhutPzNR42ea7fzaXwbysof3n71jv9utCzaO9a
b6vTOPzpXHzT3+H08O3rZphtZTVPz2Z4nZ7P4xaH2MJlOo5qvVyt42OPeZczx2TfWFK105c3x25Y
S59md9u+PTDnLvb+7n7EPo5lmqdV8Gnd44rQr2fbLdh8+8d8s0dP3fTsMljjdeqmIHssGdVkz8pM
2W09+UJjzWQ03Q2fh+OH66t2//DC7NLlXvrG1hkDNxtMhqgv7UZWEo7tu1JKBs/L07ZvMuTGLUEB
HpUYZB1FuRKNM9tt+tXu0c9ah+AeSpdeQcDl0N/G7NFW5u3pf6eeH3vim823o/mJ4RcN7m35V4ez
6KG+wkYMMyO2x9eDBCPZNw8vh5vzWbEZb1N8ydr14+ja4A8yy+j3ZzZtHxl5+GhKeqlec4jfJ39j
m8wkGauln1S37nbLloWjbsOHZOpliSds2LhlW6ZmPiRSs9bzxQ+zc5i2TcbTeuN6tcrt3a9+0+E8
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
KrMdV6SrqDKBGqyrjd4qqY0ExlxS525ojOgR1z0HMc1BfXsu9XVXsyrqgy30oY6qdW6Cg5u3PlV3
Iueq7Qc/NlxRGbqZyOKpZu/uZZs7xH6Vb3i1UVEeVdzGoFUb39qxax1Nnv96qYVe6uqtZVuunOz8
9VugoNc9VN6movnNferNVNWVXVJUVfV1Vqg1HVTdtx1GVJqCJR1W6rVW3U1NVM6Cq7QVUzNFHdWR
Rur+/P1qzKqYx1FBVauqlA9W1W6qcI7NVaVWGjPMx1NV6rqrZqqdm3VTOqnNXVWVVva7q81BEqrt
WVbVT2rOeOhNlBlVmOq9rnoMoEarKvN3iqpi5rDxS525ojOgUa53zH5qC6DtneKrqr+ZV1WGSyhj
qp5boKDm7c+VXs5ueq8+eoNcURrdXT3PFUs3dZmXmd4o3VY780xUc3OqviM1Vm6sWsJips91UxWV
c6k1BVTDnqMMYyjNVcvnjyKreeq7VfNzKpqu1NT2qss9TV9V2r6rlQerIj1WKvquXFVh+Z1Xe1Ae
rKrdV6qmCq09V3uaLKBx2c/aredmPzPDnqxGuh5jmoT1B3hz1Wqi6uoLoDR1dqO+d5pVaep7VU0q
p3VsVW1fVTLmVA+eqkA9BN3FQN4z1PMaqmFV11WeeqmMVVPHlVP6qYpZeHoarx6qbLKqeUB6Cgio
I4rq2J50qyLmuq9VaM+fHUVPP36RVZF3q9c9VM6rlVMM5uc8dWx3Qc1Viq9V9WVW6CoeVdVdqtI9
RHVT6qmtVO6supPhqlUHNVdq3rVTFVXPXQvLs9DqqmVqgqaiqnFVKG6qec3aqliqmlVyLoeqnDqa
qaVYaq7lBVlRUmjoFVTnmq6r+ar6qaugzniq+OqlOr6rGZUnqvx1ZU1ZZroajn7c+RVUx54u56jn
ygyOqmUQ7RUT51Fz85qrfagqpjVT6KpNznqzHzurqtqKu1VTZqz1WKiOoqc5qrbNUxmzm6R81WO1
zaXOegNVddxR53PdVnmqTKr+c9Viplq7KioUWVX4qmq1cVR4+bnjquGjqcupvrkVVO6qc1UgVUpn
q6q1Q89Adczqw/NVnTmVTHUc2Kr6Dnqp1VYqvKrzUCuoygquVFRQRVPWp6UFRzVGCK6rNTkVnVW1
Fx5Vdyr4ueq1zc9WR1U8oDVXsNHVfqtc1BVuXHV19DM9XdM1QVXaqdVWKsoKiOqmFVur6qQKrFDM
ZVlVo9V2Lnyq/VlV+q7lTUmuq2aqnFVmqnNViKpqyq5zx85quq3mqyrKCgyoqsVEZ85kt1X+eJd1
VbqyrqrtVmq5VTg9V/KGramOoPFV2Y+Zo9VvnqsVFV+7vOqj7HqsYar8591War1Wxb3FV9V01TdX
c9rt3w2O+Y1Vhs58tVMVRV0d7iqbPVtQ6r56G4rxc/NdViz0F1McdmdVKFAc8dVMartD37moKrOR
nqsqg7891UyqLq+L33qrPh4jK7qair+aqzVdxXlWVU6qarF9qtiUdVjn71e1VtVNbqzfvapqs9co
FQc9BuKq4z8/NVkbqKsqpxlBQT1WZVb5+fnPQG71K6HNZud1eutI2Y1XX51q/rFV/Rn3QGqsu6mq
x4Keq5Vb5rd51Xsez1WDRR1XM59zVVmqnFW83bfNV9V02VddX8952zuYxnfMY9Vl3Z8vKu5qiruc
+6m46rFWTlVOI6G+a8znqLqsWegurueNXjqpQoIzx1Uxqvdu/c1BVaNznqtKg7VN1Uzqy6vi9fVX
Hh4jKz1NRV/NVZqvGy8qyqndTVZvtVYioo6rNT3q+5iraqb3Vm/e1TVai65QdXz0G4qrnY9S8qKr
EbqKsqpylQOrVVTCpqec6N3q7OpzWapoKvzrSbbiNV9zHXKv6xVXOjP2oOaq1d1dVZlquVUw5r4I
32dSaz0CqObnoI6r5r5qgxququ1XHV1WKozKtqp3VvPQ5mqr/M+/N3MfrHQcx7iioHNVXarFRU1B
4qC6HmfPHGbntc9XUFVOYtGquqM9mqsLny+a8ypoHlTHZ76UEfNVTEzoKiOrbiPHzVFTaqu46qcJ
28uoqs1FBztVZ1oKrdA6uji6c9VO6rkdRUGfPdW1WKi46CM9VOL5o8qearqqcRmiqpFNGuaO+eKq
7VTI6qpCR6jKqaq0dWY56nZqiOrqrvY/PGeplzMoMoHdTHQVU7qpjzOroo0ao5+eKpquZVaqzn5z
3VTKrKvoLugjq3moKCq125qrlS46tdTUHq6gqunNUGjyoqzKqdGquZVlVirqrdVOKtoOeqxQdqip
R8qp2bmqsRc7qajOa8y6qSatjznjqcuoqu3lV2raqQaqd1XDVWTXdBz5lndBdAeg5ruooKDn5uaK
OgoMe4s56ipy6CgRqkz56mg5qA0ec7qPearqDLqw8ayoupPnp+t9YnzxVOc9RQLnyPdt3VYvxndX
VU6591GVUwuI/NVcq1uq7QVW4quq81XVXMqyzH61eez0CdAsu+1QZZVYMaq9zxc3NV0WueYjqumu
1VTqKgPFnNzVHRYdOq1Ux1dGaOqnKqavq2rJyq46s5jVW3ZosnK9X8y5nV9VNaqZ2brQUXAuOpWV
NXXUOp6c53MGaj5qrvNF40dmug9d3QVbVd0+er47urY6Creer4seVbQHVXUGVU7t40lFbOaoWGNU
cyqygqpjVZNQUC3PUD2eo5pjq/MoVkVXai7Ru7ozugqy6r1BdVMDVU4yoqpnVTPnicXOe2ODKdWU
FX1U851VTOq92yq6tqq1VlBe7j2+mHi7VN7w1W5QZij++TGXfaZNHVdudxmy1bt3hqm+xjs/d9s6
ds0e+brdHURVZHVciajPHlHV0ec2UHSPmyq5fY/RRVHPVe6rpEa3qqxVlBUvWUCv5VYP2qYj8084
jH56CrLMz0LWRdenP2qT0NJeZQRrnqamOI1PZ2dTAAH///////////QqACXPAAAAqKD17BH/////
/////////////////3nN21zG+5OvOd3FFnRc17q1R506Gtz/eOr40dYX69u3WLos5o1URH1HQeTN
r+coPFVsXbKrq2qrdW0F9o49vph+btVx94aqxlBmKPX3yay6BaNz1XjzpmYzoLds5jVJ+x+0bvOn
Y3SO6h0HtRFVh6rsV0EcceUdXxmqMoOkdQaq7N9j9KCKoqar/Wa6RGvb1VYq2gq56NQZq/lVg/er
oj82OKI9T3qy4me1kT5+1XHdJeZ15+erqu54jZzdunMaXJ15z3cXN3N0NUX2qsLnzp1Nbou/PV8a
Osr9e3ag5ui5o1VnNz6jyYmbX80Hiq2K2egjvrFQVXKqQ6rFXxVXarCeUBoj8/PzR7oKCq973qtP
MjzLRlzW6tw2qrFVPuapO7juqnNAaN1WaCq7QVWzVXY6rFVt1N1WaCKoo4/cq1mjOzmqpFquVWuf
pHVTCq/VkaPUqpiPFVZMe1VeiO6rkWRVZdX+xRxGq6reY2H25q3V1Aag7VWKsqvmqwx43Vt1JjRV
fHHlV2oRzVFTUVYeq1z5FURmiMe6r+GcdVyoPdBHdVuM1Xxx5QOgoL6UHTrzRc1BVTigoKuqyq2z
1ZVZdVio5j1XKigqplaqaBmq2oqp6apNz1BqqcHqtZzxRc91dlVP6qYVd1qpQqplFdWnPFQZVTSp
OaqkmgyOqxV/NlWLn7VdzmljXapqIqrrzmmKuj5ue406sjyq1VTmPKCOLKuqpjFQVXIo6r0XUzuq
wcz7xVdVTh1dVtq6DtVlVqgoKjmqsVX6uPQR1WaqcaqaCrndRzVWuerqrHarjxmqx09Vk9A6Crqr
Wc1VOOaq7V9Viqzz9rq2rnVYRqr0dVMKrlX1fVjiyr6uPU5eHZaOgj507N03VYNUVWqtsx441l1F
5Qc/O6rh7iVX8CI6jeGPVxqt6VFRVcij56A8fNkdBUuoiy3U1FRVYvnurXQRXQVFQaKKrKipqu9u
lBzR1ZVjNVTk9Bz0FBVcq+ojs9Vk7NFOUGVXKv7VNVuq8+bmqpnqooLNz1UwuPnq+8q00WVW6qZR
d4nU3QVEdVOTPn56qcbjyq1FuI3NkZufOZnqtx5VYiPUx1WKqZKgOagyoy+ZxHqauqt1Got1XD89
WTnNVequZffDVXal5VnaJx1cj7oOdUFxRZVh3V1W0EWVNo0cdXWaqkCr8qphdVjusq67qsdo6DFQ
nOerIz1NVuqzcUWUFu6rmW3eGqpzVSE+f1rglwY6xVU8qpjfPTRKqwfLygzofnq4zWPOvNho+BEx
Vd2lU83XO5nrZjzz+Y+ls2LVBeOpvUTuLD+1Ye31qT3FFzmjNFztHqxxc7jq689w0c06rk7Vna76
UB8iw/fn8NQR5H0w99Gz52oOaPofalqudrqY99+nPkckus9nImzUD5jPM7WqCg7UPkz3oFjyJPm9
uO4ueLXPb3btLHnNz9kuvPFnXmoKCgNHVeuS+e+epjNeUBuh6mrzdljfN1ij4ETFV7dAqnmRqAz1
uK455/DX0P1ixaoLM6uvo+aPDqrY731iqbvm5qmI5uaO0erbi53z1deayLndV2fqztd0B85sOqnw
1BGY/XD30tWfO1BEj7U7Vd7XUx7i79OfI6BS6z2cbNQXzRM2drVBQdunk26BY1Fl1Ha47i54ulTd
7tnztlmqIo+ySqYsoKhUFAbnqvu5L5756u57iPEa6mLHQ87q06vLiqsRbPV+Lm56sR+1BFQUEVRm
H71bVcsc9BUGqp/2qs81VqPPb56vUce6vqt86qv1WlV1Vyrzc9BQ1Wbq+Oq08quqca3UR53vDXVT
2qmVVwzqbJ1XTRc1B3ugNIeM7Xero6squVXD0CNnNVTGq5z5QXnPHzRVNVqq3QboOx9VXKqd80XN
Vcqp7VcqyroqsqsVfVdqu0F1WOaoqvUFVMKrJuc3NVYw6s9VOVVYuqzEoo3Vxt5VfjMeOoqKrtBF
lX3VdVV2I0VVM7uqkGrarV1XqsjNU1U5PVdqyrlVlXXeuaqnOZG8q89TPVNV6h76dViN89BVcdRO
UF0MUZ6r9V/OaPI6rdBQUFWRVXYqrtVurqiq5fNrOa6vjP0jzmqZg2RZvMJVWu56qad4+uVWtVXK
rnPV1RVZq2qmFxVZz1UyN3qah1FQqqYW4ubKrVVypqe11U6yrKr7vO9XVXqmqn7oedxVWedGqFkU
fM6v56uqp3mZFVqVA6uqphVaiq3vV1VObdVyrqHD1d1NU80e44jUGz8/NUHjoOaqmNV1Vf2Oz7dn
PVeMVjOojc6oOrq6rkueK8NV/dVLqyKodTV9VmLOeq5VThOqnlV2JXEjmoKA0XNHzrn7UFVypqs8
0VXVbQXzc1Wdb6nO3Uc/PVxqqaRxRHNV0eVX+aq1VTFdKir6rJumRUGR86jtvKrtWKro3ZA1A+fd
njOaraCqxVazIquRtVXIz856g/NdW1dV51zx81VhtVU6noz3VZqwx6CrYvmR3QXz88VBVT3pU1Xl
QKoPVtXVWLjznPUOq7dVzKqc1X48njR83NVtViLmPUHWTkesqu3dXc0T56qZc0d0EZojHqaFH61U
xPUUHO0+fmdWd4sqzKCq3VZ3U1U51dBVTyqn8Zvz+ZVTqr5ahVXqC3071YR53V/Yx+jkMQRTCht1
GZEY2itBVh2zxRY6vjNzVdqJ/MNwIRzrtdRVYqXTUXTH2qOaOTVzFXuJRpT2RzPSq3fW95z9o4kZ
9tPKuvUXXCCpSRSoLPObtzPDROOpWo6rB+8SyOpTUb5+s4r5tvrzRczuZfNidSlFzPqnzxW4qHtl
le9Cc17U5UkcNZJ9qDnw6Xeg59SNM+VZUcxulRmmRTIlbN2dvVAqsI8/aq4zH6UxiCpTGpd1ZmRR
G6U1AarIz7s/M6jHV8fNV+om8NIo6btM1FVipdNMUXTLqKg/urdXzHMjrJ7I9dKqYX1PS5z9+eJG
330WNV16i64QVKSpeY5Z5zKoeGicdXHS56rJ++RLOepXah5/efrOK+bzbXNFzO/XzYrqUoo+Zrx1
MTuKhSsqqGMx95OVd5hrfZc+H7LuudSOLLjiyrKjmN1qM1ZFMjhWzdnVl1dU1ZVTKq7QGoD1dzVZ
VTCq0d6PVZqtqKqnx0aoqyqnFVOebnijoKmOg5u51MVF3VbqvZzPtZlnZx0OGoLs5zmPaaqOe7oK
mOo7ZIaq/kdRVeNFVsUxFGa6viqs6dBU1B4o+qqu1XautR3cfN0oGbvfTdW1ZioGsPEbKmoMzajP
dXmNUX1PU3Rni5qrsXOqiKq726UB6tuPMqauq6p5/m8jq3fS6DLqYuagzn1QVfV9HVvNZyG2apPQ
VXLvtVxqqY3UR9DHyqzHQHiv8rqarcVWVXz5EagPHlBU24jHiPVnbms0Z6qY1XY6hxxVNWuK1z81
VMqBZUHquq+arV15o+q50+ehvKrlTU2a6m6DsbKv53Vd6RHt91QHzn5rVBznqyLKvqKCz1dlBjyM
1TVcuooKA0VBHGqiq1dVPqrNWX3dXu3VkTiioIjRmoLvnq6J0FDFQd6Dq7VVMOeLOY1RlVMebOlm
5+ercqc2ZuL2Oo6VdVd5+ZMpFlmqKrvNVTGqzVkeZzniiqvnfN068x6jn56siOlQ4quq5UFTcVVg
1RVTE8R6mrardBfbnidSaOKI9WI9TV9Csq11blWHXSgoLoF3eLLPnOaLKqaSVU4oKCgoKuq7I+bD
1XZk1XXVSDVTWrKBPKndnqundV+gqKrUVVq6rhTn5rqyM6q6goEbKrbusaKjw1TQGoOtQfVAaKcV
Atnj71Zz1NDdV2hoI4ufrvmPV1VOI+qqT9zI8R6vyq4854zUPWq1HFVc7R97ZkbtVaj8qvxG0e3z
xxKNnupq7mNVeWR0Bz1U4qv9qrkdVirUcxsMfni6c0V81qrqhH6c3NPVXqrmzbNz3nMeozyopPPb
6SdIuh+dnmuvYzUsjXPRPH9pZzFZr69mftS+UOTnau77bNnOjKgoE9GPQUnMf169r0eOK46tPUJv
o7xns0Vu9mVT3qw9AbbPR4egzN0eRVmbaeTHal8rnwypFt5nMk9G+Lu4rnPDHV5qj6FOnP12jkYr
V5qvQ0BsPuoi8kNWdcoU1Wr0md42aNG51zWerDeVDUzfSTpzUJ6lnmM7GyWR5nPRfMv32czdDjP1
oX2eerx3fbdAbOvOZUFAnqI9BX5mejfTtlmvnqsHqxN6t3lnvOa7vaN7V3eoPQG242bMWRVmba7m
zzvS0tePDL6tvDVCTiNSLvfNbPOHmDHyO81L09pulT12q8R0rNr2hZvD7qIihQ1Z165StXpM7x5L
VtX9zc1SarjUHO6qb5QUBnnPVbozR40rPnOY8XbOfncfOerb5pX2jeVXz66GqyWOguKqzznR4ozU
DPz8/NVZiNVYq2+eq+c3aq6+x4osn927PU80UQ5nVTCqnGua6qdVU4y3zPaNLFrVxuKqmPNGaKLm
VVl5zxnoKSgcW+0XMzZzcxt3UaqyM8ZjR1dz89TZ53Dn30VQmepNEaLKsn91Uwu4k3zXfPlTz1Uh
nr0lRVlRFVYoHHVtVpRmdXHlqtZdVzna5qCqnNVIVVICq24z1bzm5ozc+VZVkedFd3QWZXk43V13
VTFUFVMTc1V6qyQqp9fO8U7bnYu2upnrZqDr13256soDRGvnjzO07Vi30NVTiKrYqvoKssRd989y
81Fqq5dTUGiqvUhtuzVNRV2c0R+eLnd0FB3qu1fzvNXz3zVZV9TnNz2zxLu105oueq/fPUR1Gc8V
XVZ85jR3kzzXaP256rFVO/lmqaP6+xlV9VnnqIsMaz81V3OlBl9FU5HnN2qpzVh9ZF10vc7jrrzo
eOq5nTnittVctmqyr4urqYkjmyjqypqeepugRjmO6BVHNVl1NXVWGbKDn+9KCqmdWnq5dqrEcdRV
TGq7V32oq3aMfrVejoKCqnHa+z58nMPVdNzWZm1QVU0VV188eUHPFzYdR5Ee48q2r8j7GqsXzfak
3bmoFFz5dHUVNu9HfQ1ArqppUrKBUFWVzz15lVgyzplx2egoKCPIjR3o1VyKouQ6552gqyr7loKm
+luz3ZsqT288y8N2ncldXHO9VXKsR+3Pu+l3z4jb7RTvN05pHnmqB9ObdzvRZcmZuj7d/L3G94+Z
XUHR7UckcV4fNYepo8+Rto2TvSkPLURGj7nx77NdpZedrpeZdG7qDc1Wdt3LHn3rmkxeuhzTsRu0
erw2VufZ+0hqrMnfn7SXOxRZX5zzOX52W4t3SHeRUfTv2u3a7fenRzN9We+fO5u3aKdqzWtc0yze
aoLN0qOx53osvM8o/He7oN2+aguojR7jo44rw/TOmHqTUsdnokbN9KQ8tRFFH3Pj3tpzvnPpdLNl
3dQaoq1z2rljyk11M0wfSNO8xu0fQ5omq3Ps+5k1VqRxqS5+KLK/OeZy/O2dotn2dmi979rbtdt4
jx89X5zPr2iTPkdX7887RVYrsx2c+Z0UTOe7OdR9jzlWVUpVBrmo37ccdVyqlHvVkd3VvNUXUnfO
d88dTVTGq3Vrqyq4+h/YtPDZHeVU1juLKvB8jt1FXKbqKqZm9m6r1W4a5c6R3R3mG9Maqz7eZzc1
TrXTKrUezZm75szFlxm5jLbxVWFOHw2OZ7d5qh0r7Tt1WVF7MRGj52c2VUiVZVafaOpqs1U2s1VM
jVPNVSFQdqF5VTu6rBqrcdqraiqmVVMbuhPzVBsq66Cq66qY1bdVNOfFJRurubmqXhs3iyqnvTUf
PFVed1Warn9uzTlXTa7ZzU9nZ1MAAf//////////9CoAJdAAAABckXNHEf//////////////////
////Hu/kZ6nnqplFZoquqTKqnFBUbbxH5zxVNXzFVqrIsqp3dBmXVaPdViOqnNBlWnjzKmoqvOpq
poqrqPHjx94qk7PnTMjPHmzVNV2q5dDpGPVeqefmVV42k6mr73z6yOLnnslqsJVfzuOKq0bRs3Vf
jqunuq9dV+pw5sx5UH1u1ceZzXlVw651Vdb5oqh1dVcqvVBjKrqrmVXqr9X1fU1deqrs4fmq/3mq
s1WKrNVINW81VMqqYeYqiqxVTGrqt9quXc0+aOPnquR+1dlXHqvR1X2fnqs7vZ6uqp5znb5tXV9T
HGbni6WbKvv3pnarN1WDGs5jqp3kbVVuo51lV3vVT3n7UFVMjRnTiqsZcWRc3NVT2rsiqar1VIKP
nkfSqn1VOqtqtTmT2qk1TdVurOaOq9jnTVZEZVZFVjVFU1Wo6snKt7tVbVTIx6r5qirU0vPHFVZq
sazmqTHfNVeqvRVJ1G4ooruXMia5qs7VXHQuI9BHeRqcXMfo4tnjy6sPfSM5zK+3NfSOLyKcqw3b
mN01N0OH9nZrMoLVte27XOs9njd+keJGPfuqJo5ojK7RsN1VBto0hlh95VkVXWbLZ7qLy8U26uN2
Pk5E5zI6rXQZ289SjcUXNrSUTXNVqqu23EegjOo8PHqcVR0cW448urY76xnRzYftzW44vIpyrTb5
jdNTeT53OzFDmUFq7z22z1KN7uKg1z4kY93qjTzDmiMrvMNhs6qg20aZiWH7GqyKOrj2bLs56i/m
XmTbq6JR5Pczznqph0x+rMfNUuI9Q6DQs3PVTWK0egU40nQK+zPdBZ3dQag7xc1BVeOm6uUXaOgq
8y75zmjoKCKqzzc9VyOOq7V1X8yq3mjNVf2j6dAleVfFjcZ3V+Hyrav+76WtRVe+3Ro/PQxtRGiq
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
UxqpyeqyaYm1FrMPlXxXdVPKqYR8x1VTmqmVV2qmOpxHii5qrpkeraDnq11bzOrKnKj3n6TtXcyP
OVWMuq1ZjXkcVVjOerri54gdWaNjKCro+c671OXzuq3VeRpmq5VTKq2e+eo9mcvnq2RXUrmieZ5U
VW5zMvnyJVXKs5smLqzdTVuRmvcR6DKk54nz4fDVceq5VZ0qip5mmeqx9fM3NVbQRq8q13UVcfvV
0d813HlTUnqM5t1WKuPVmc3jqpweqxzVZcZ9Rd9G+XOVPTHeTHPU5V9Qo6uqKtqzVVw/NUnqY6tq
u35S1fVdcdVqpiq89W87qajVXzdWxTHd0MxXi+0i543FVvry4qqYLyI0t52jfNVcq2rKk9Vg3W9K
q/ajVBefmP8uq/Veqyub/OaruarLq2q5dXzKquc3inJeaqlCoqasi37HHzc/nyr6s56rPNz1Wk9s
2qviOarr56qY1ZUG71Lqpgaq6aqmWZzXuq9VZ7KM/lQeqwunPd5Vsffmq+hOt1fU86x0OVEVX3Vn
Oer6sie6DgRrXM6G+3Nz1acxqJ0M9Z+tBOVZOTl1MdXVbZozc9V2YPUc+Vc6si7ZU8zqO3PlX28m
HjiquVUxPuI0VXa7xmq6oqph2cTqT0dxVW+a6vqtqKrIznquGY5oqmN+Zmt52/VR83lV33n3zVFF
lTMxTGVWvPAWhV+tVFW3VZqu3Vckyq7zeKcJVFVKVWVdVnNucPHzc/nyq5VlTVZ5ueq2r7OLVX8x
4ql89VMqt5oqCrrqpiaq9FVTXDVG6r9VrtkcflWHqs50q647yqxzvmquONTVX1PPhr3lWRVXD1bz
x1fVkVBug81rmuhvtzR1NViMxqK3Q2frQTlWTk4epjq6qxZozVNV6YPVlTlXVZF2ypqLqFzqr3OZ
MPHzVXKqZH3Ebmq/T5zVfVlVMuz5nV10Z4qqY8x6rlVMVFVsZ46rhmqjmq6N+Zl6287G9UfN5Ven
Of2oqKLKuXNvO0lVvXhMsKrmpqoWrdB3lzHVpjON3OZMHPcdmjyZy7uJrpcdHWqsxVdtZeuhzZ06
pmPh+ZugjqzD81WHjMzHjxem5mbmqTX7eDuarpPdIx8iMaLIj3mHix2Nc9/avvH3NjurnhsNdTHz
RLnaNVZ7VPXKCPvzZUXV53aPl1WjOplyYMz5E1Vt1WGoufHVhctkRjT1TV9X0BufD+nNHVdPFHFH
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
TFiky+u7rvpXXbe5XQvrFZ9nl3PdvF8M5DnVmj6HPl+Oj93qkoZpvXvnbnpHOe+dWlNZtTuaXTt2
5n5tH6TnSVZ0t76T66nmcPm86NbveXNrt0i3qg6jW9bv3t5MWUax5o2qBH0z6ycBntZds1WsVN1F
6tXlXHqeagPz+mj3zUB1GfnM3mhVZzLtb6pp8+Y+r0dR0HZdFEazI+yHMzI9B53NF081rsvYeVec
9RVTirqrRtnqIsXXV1OJH8WXjTWTUdmu3UVM4nQ32Sqe1WZGd7ki81aqzU5KuagoI5rmjjzmPtzm
GNZzZkc9GqDdBV9AahjVQj2s7TlWGoD5d4Z2ss3U5u9xvOl3h4uaZmIrtxWL3bug8zObmoMPZIdu
f32gxLvvTfo6MeWa8YtOLmqe287Gi30eO06Dn56DmOY9X1XKA/MoqDLmLzfxZnZuTfZrpErjoFQR
PbzOerOY69mD6yo2sttnyK6BOTUWRRZV3PJtp07XY24hFzmqsybOfLo4p+Z56Ci2M9TxzfuqC14+
xtnq3tiNz3dRU5bGRqOYPfRy25tdr7Jpuj9y8ud2lPXYxY/njOu1vPfO1BUamXQenzpeZpb6Stve
m+3km5Ola9Z2rpG6PUw8+2db3GjX0oDamdOW5vu1j7W8a79X76z5azt0SVnKJXfjOu13j987OgqE
pl0Hro43nRXi0ttvbb7eeSO9Gzs8yLo9TDUpzre41fSgN7N9JZblcTj6VHQ+dOftLV1i1NaXShjt
OO1Wjz3qbfPjqDVdhnzdYnEnlAaLV0F4fzmkqczwzxH8e1N9Od1M0Y0btZjdWdH5vuc/q7N8xnUb
is1u3MdJqrIzz087KrNUJzrpHaqKJ/ejqM51zZHo9C71o7fl9ur0l6lQHe+uZu2sjfNz5qh5rXOl
fShmI13UzUpc2HvplVyLnqajmvog9dFMnNNYe5i+sXU5nfXeZMzTmjH7ddzvNznuNdD+nvVJcWH7
K7NdTqgvnTamdxxt0cfSgnuj6TnZTTa7djlLxDw05uYvJzt4Y8T5j9KmPLtXUGMe8yKp72jdaiLv
Fcel0MZ1BtvXPVcjkWs6c+H5pjMy+3Oku8Sv3HUc9W9t76dVUrXMuu9ad89zDNGlQdKPT0+bxD01
xXHk5vneXfa86c0WjW7ggm0+c1A9baM3joPVeLKCM9op0Sxa3tvs6O5s04nQn6ST/Y3ZJRxkbw2R
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
s/e+46BTtLHXjOl2sgdc25dZ0GhroYqvPc6ZJQTuPdyMKO7XTM3frMZb7Jq6s73e2qOM05nk5Q9m
/VFeWpDzQye86nE4qB3MXFnsXlxLPHjugPcLyVd99O17Wtqz97oB0GTtLz/eePF2Fo6qNzukNDXQ
1+lWvPTdDOgnUM3YkuM0l67II+UEvzIuttY7eGvv059WOe0dNRUEeGjiUZ5OaM3ZWZrHkVmqeaJL
p9+yHw/KMZepUJImH1HRsx/osY9u2oYDby+wvrfR9rqX0wdmtHP1MsugoNkHDFpOW4X1qQ++VXFe
dtBw0LioHbuKP634LfSWIzx9kbKDFdn79DS5QSa30RjX2SMryXM7Xl780e+rGPD/GxJrqf78THTu
hE5R2Q8Tlz4Y9+fD3DN9n2VB1Qy4u3NlA7XRd515JnW3nOZOZN0UdxDrfb22vkOnMztRuCObnoIs
CvVAwz76DWapddsXcdulHJtHG++X06YMupWKLSUtvQb5N1F1cdjo9xy5e7uXpImH5MiWgdGF2e13
en0XaTbkuTXyZGtvp2Z9GZmO2a1vHRnyd37Hlzrudc7G9yalPJo871UvazCVrLPKheS2GNzKDyZU
nZHxytGNuF+BW7q+9vu5ntfTeo5cfqZ53pMp67Dz0S6oL2F2e0516D6LtuTb1qvrXaGtsdOkR9Yz
N981rHIfJ3fseR23c7c6d7kTjk0fVBpTrswlvoazyoXmo7D+KZwXkypZOyPlZ5LhsNuQH8R3d1e7
oN9HMq5XcWC7UUg2h7DxKLm3eGxxdXuYO4uu+e6jdn1m48jjqJyQRGMEdSyzzOlc4k88MeZ87m8H
trml7R+cn6MjWpR2P4sGSS3xPA4nuW2t2eG/LvNznp2weTfPz82Vdm897dajnOE9LtugGD137H2j
i6DeOPt0icS9BhuLfNHA3lVyc5ua4xfoV5ZoqnV9M7BheK76Xm+naOKczUsk4ufycZr2G0Fe9HvQ
cHa6cTyOx6wuaL3mNzi224hG2+kWYfmGTmLkbznvXvsxM0ec2pNadxZVivn7aNg5oqk3vP26c1R2
XRG27UZ6Pdw1VksuWLzNbqKsOFtRe6jzNriOqI5qnHcO0wszdvNYe08+cz8O51ZJfpo1auG8mpjK
zfuKc1N5PTF68clz83JMC9W5MD7NalmpHIMkxSN6142HDWV128KCtOiTJJNPLrfZzWOc6LY3Mepi
c81mZttaWHx5Ocz0dzqMd37Fz/Mk87TUxFJb9GYpzU3k9MXrycuS3NyIa+PTi+zOfG+145ZqRitJ
mSN6142HDWk2u/jFIhM5ItPF9nNY5zotjbXuO+ecvwNjPZbc4101rp7OXy1psJ40u2eeNPDXYv1B
yJO8cN+y55iDNrlsYH0V5etDwILS6b0hprdrt2hMbnpNbHQL3ah6F27NzkD4og2rk99fbSGeeXpI
LGmHK96wbcWk+Itt+Ym/NJrehngk1a16PdTGX2nHq34PbmOmxXGKaXlB40w9DfjRj3vslOdYZ7vw
Jre3Lrfmgu3vl+tdPfM1pwQ9c4+wOPIWJV0NfQetdl8gw+nzeD35lpt7E55DXj8wffbB5hbXh+21
xEMYb8YWmte7934h4tph9NJe9Nb2p6Y37qk8CnPJUH4FdIokraHQbHSYh2nNp9c9zS321Cc2370D
6C5waW5xhvHxtwY34LCa6er3fgQ8W8TnJe3Roe9fNb2p6Y29aCnNa86IPwZYpFEldodBsdJiHac7
Ke6vBrO2l20JzbTnOgfQbucgvu05x+Bv5j5eQ6Lsw+q37djaTBs8Ghm3p72laHZP49mSoOf4jhBZ
h1u5A3rb6fZltjW1i7721oSQdB2kSlDHQaCfKRCW0N497vENPe1DFCRhpve0JIbSverWve2a6Peu
8aGxfYa6S75JZgsMy8fR2Oku1sax2jrpljIaDe94N7GvgWQnULUVwjzty2JHKgkO3V3oXnRjWm6M
Lel7m9w7Rt7D35y2+wXZv5r19OS3vfRCjo8gn5ia9wLq0tZ029603Rhb1nptuHY0be4b85dn2guz
8b+a9fTktjfRQoxR4ENj27wWtybfu2lydwPtjzKs5jeMaQ1JAwMcTvq9g4ahj3xJztra5KGwZe3x
UF4KsyPa3oIPiO/UEgxgfJr0LiNr1qDe/d7GBsO1yfLBkFynM0NDY0Nse5eQdjcLzOJOa3uxuY9a
14lDoNC4R5hoHVSMfaBrkmJG0mvIeewse5D1pM6Q1g8l8HQKCHrw99OWxl4ta7UK881JDPRtw94i
9We8SxYag4KSYDeBNeCY9DY80aHuNJnSQ1gQ0OgXoxD14c76ctjLxa70I8fmhno9uHvJetZ7ycLF
wtDT2EEwhtcVclybqgW3ySG0uS4ljXvnE2NCxvjbGsgnBBeb3va5Zrjb4q4njW+P5x/fBsb4uIah
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
4GXCzDC5p3FOFnCFw1xQhixQs4QxYoQxYoWcIYsUIYsULOEMWKEMWKFnCGLFCGLFCzhDFihDFihZ
whixQhixQs4Xo+TlIKCpSDZwQVKQUFSkGzhKUmqQUFSkGzggqUgoKlINnBBUpBQVKQbOCCpSCgqU
g2cEFSkFBUpBs4IKlIKCpSDZwQVKQWgtrODaQ71Yes4fiXvlE/s4ceLIPSzqgpxcSbiGWlEHGZYu
GNwHHZhvGRHeAvAMBbNCEIJxCEIJxCEIJxCEIJxCEIJxCEIJxCEIJxCEIW4MG4QhDe97hCEN73uE
IQ3ve4QhDe97hCEN73uEIQ3ve4QhBWKGm4R85op34i8vhMij+DwyTxmQpiLBPiBQbDhgAslg+OHS
972tIxEREREREREREREREUEhhERoiIiIi6QdkCdIICBdeiIiIiIjZB3veiEmogICFo2kwwAXy4YY
RljGQ0uXRjKpRAQQHvdPZ2dTAAH///////////QqACXVAAAAfhWQ1xH/////////////////////
/70QtEBAQtGAGhkwZXe96IWiAgIDADRSEloV3vRAQEBAYAYEKGIhUhC93aICAgIWTDADVIkIg5kf
oPBsQuWqOlgJ3ZRxc63ySiIiIjQRERERGmERHDQRESVd5btJhCiAgISYYAQocYAJZL4ICAgICEmE
BAQkwwAVw4xUOMNCAggcsQpYK5EgGhBFBxERERERERERERERERERQdB/BGUIiIiIwRoOoj6KCIiI
yhEREUHlbYRERER22EREREdthERERHbCLiIAiIwxEB2shgz08g6Hyp6enp6enp6enp6enp6enp6e
np6enp6enp6enp6enp6enp6enp6enp6enp6eHCGXZiiAgIOPQwREREREREREREREREkkERERERHC
Kcq6EH1sIF1EREoiI4RwgICAgIIDhAQENhsgIwAXjoUYRHDGQo4dhjhFnkIgICAgIbCAgIbDADQV
OyhAQEBAQ2EBAQGAGgQISXDCAgICAgICAwAwShiGSAohRAggICAhkBGAGpCEF9AEJ9NPQEqWs5OD
5QcqcnJyehiVpycnJyRiIiIzk5OTgiIiIjOTk5OHERGdnJycnBERLMTk9ZyYmLZAIYQEBBARgBJh
RgAlkHggIUQENhAQEEBGADWFwxMKMNaoXKEM/pHJ0ILDiMGYiIiNwiIiIiI3XQaQaeQaDxEREREf
BoNBEZgYRERGWIiI0EYNZZWYRERoIiLMzCIiNBERZmYRERoIiLMwjREaBURhCobaqUtCYKQDoxBo
m0cWc6MFgZs9KOj1xeGwJkGQZBjmcYhiGIYxhGCYxiGIYhiGMYxjGOYhiGIYmBUBH3P0XtA1pZ+i
9sdCM5+dF71qfo6ELuhHRJoMZFtfu5kbfy5kbehL0b0u/ejf0Wx0dFsdFlxWXF0dCXovc6Oi9zoW
2XwtypiGIYhiKC1KoLVBaoLb3ctkctkDEMQxDEUFqVQWqC1QW3rIZfIfZiGIYhiKC1KoLVBaoLUv
zmMxlzEMQxDEUFqVQWqC1QW3rMZf7zJiGIYhiKC1KoLVBaoLUv7lsv/GIYhiGIoLUqgtUFqgtvU+
Vy+XwGAwGAUFqVQWqC1QW3r4zGcyhiGIYhiKC1KoLVBaoLb3MzlP/KmIYhnGgoLUqgtUFqgtSqo1
VlqgtUSCJbHEuhf00lp0A6LGAb0VB0PWjl0U9MMbWpQWpVBaoLVBbelWFhehVDZbLdHRu/8BFOjo
6N31Po6Ojo6BDXJ9HR0dGry9C6JOjo+snhdnQzo6OjK2dHR0dHR0dHR0dHR0P0dEdHRpm6Ojo6PX
G9HR0dEvRJJz0dHQexf/m79DOibw0ZVQWpVBaoLVBbe5lstlssoLUqgtUFqgtvcy2Wy2WUFqVQWq
C1QW3trLZbLZVQWpVBaoLVBbejxVHirIVZ6gtSqC1QITKkbo6CUBXR0dHR0dHR0dHR0dHR0dHR0d
HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRbbbbbbbb0W222222222222
2222222222222g0v0Tt2Tz13hb++fQxvwBvRup5yKrtVWqp5UhUP/cbPRsIwOjo6Ojo6EdHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHReujo6Oi9zo6Ojovc6Ojo6L3Ojo6Oi9zo6Ojovc6O
jo6L3Ojo6Oi9zo6Oejp/Ojo6Ojo5/suYP10SeHR7mCeuTN0tlKl0PJ0A6OjoKboYzoBx0R0dHliE
uIxGIvbeuTS+IS4jEYhL0DXEJcRiMQ3R4sfEYjEYhHnr8dKHxGIxGIS+6Ae4KCxLWK3qJOiEdCLe
hMhNeqYhGIxGIvXHHHGIRiMRiL1xx44DEIyuI6Mh0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dBS
dGzo6MEZWCXqA/21haIAcSsYxm3o46OjoYDULAdHHER0dHR0MYxmfS5/P5+9tN6N7GMZn0ufz+fS
755/pjGMz6XP5/P/ZU2MYxmfz+fz6GQTBYzP5/P59Lll02X2tIK5cDoY8/Q/RC6lG59Gfz+fvWzZ
s259Ln8/n73Nu3I5jPoxWeLEdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0U6J+jV0d
CMyfGYUECgG09VuNUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECgg
UECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggU
ECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUE
CggUECggUECggM3bL47urjq1BH66reovPq6urqCXV1dXV1J+rqjq6urqUBv9VQPKQ5SHKQ5SHKQ5
SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHKP9SDKQ5SHKQ5SHKQ5SHKQ5SHY3qxeCwWCwWCwOCwOBwOCwWD
weDweDwfV1S8eLPFkmjUzUxiGMQBjGSysZLok44BPN1dXV1dXV1dVdFfDq6urq6urq6njEN6urq6
urq6uoq9XV1dXV1dXV1dXV1SzdXV1dXV1dXVLN1S9XV1dXV1dXVX/6nvm+b5vnq6urqAG+5urq6u
rq6urq4+wdHVGazXV1dXUeb4qbK9A5dnR0TOPPoCebVI3ivp6enp6enp6enp6enp6enp6enp6enp
6enp6enn4aPTy8/Tz9KQ2Tq6urqBgVEYaHV1GiaOeY4TJNA0DQz34ccGCaJoGhmsl9EaJomgaE82
7KmgZJoGhnOXOA0TJNE0PnMGgaBoGgaBoGgaBoGgaBoGeaBomfv3+2CNA0DQNA1t2/eaBomaaA9G
zG405MD8bNvwchyHKce3ftPTq6urq6urq6urq6urq6n6urq6urq6urq6urq6uo/nfq6jz3qhFUKq
hVU3HSqFVQr8/KoVVCvz8qhVUK/PyqFVQr8/KoVVCvz8qhVUK/PyqFVQr8/KoVVCvz8qhVUK/Pyq
FVQr8/KoVVCvz8qhVUK/PyqFVQr8/KoVVCvz8qhU4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4
jiOI4jiOI4jiOI4jiOI4s7z+ZnI/39kMj/feRyhx5XL5bIHhmMtuzmWzJ31zfpU4PrLm8qCDzVGi
oHUMGD+flUaKjQ8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8z
zPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPI8zsPVuzYcZxqhBULZfF/OYVB6oWVD6oQw
2U4+t18B6urq6qTXuenv7+/v7+/v7+/v7+/v4+Xl5eXl5eXn5dXVAfX0w/t76dGvXh/HD4bDePN7
nV1dXUEpJr3Orq6urT1dXpe51dXV1egeOq9zq6urqk4YN66urq6qelb/BwDTxRsjASfPx8fHx8fH
x8fHx8/HV1dXV1X/f9/3/1dXV1X/f7L/6sochsmEoCDBVAKoBVAKoBMEwTBMFUAqgFUAqgEwTBME
wVQCqAVQCqATBMEwTBVAKoBz2eMEwTBMHPZ7PZ4wTBMEwc9ns9njBMEwTBz2ez2eMEwTBMHPZ7PZ
4wTBMEw8/ns7nDCN5QCG3m8/f/3573b1dSOrqpNe59ZXK5XK5XK5XK5TK5XK5X7/Pz8/Pz8/f396
uq/85u35rdt/v79/cz9ZnM5n6mvc6urq6glJPe51dXV1aeq+/W9zq6urq9eQdV7nV1dXVLIAUXaX
q6urqrkBvuaeb4naDYGbZ6enp6enp6efp5+fr6wjq6urq6uq+77vvq6urqvu+69XVjDPVA5zqh07
FAkoElAkoEjsO07DsUCSgSUCSgSO07TtO1QJKBJQJKBI7TtO07VAkoEjGMY7DtO07DGMYxjGOw7T
tO0xjGMYxjtO07TtMYxjGMY7TtO07TGMYxjGO07TtO0xzGMUxDtVCaobVBxhmO/vkDizGjFnEcRx
HEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxH
EcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxHEcRxf+4Ifga
SU4WeYKdIZgfeOx2Ox2Ox2Ox2Ox2Ox2Ox2Ox2IxeOx2Ox2Ox2OxxieRlmWZZlmWZZlmYZhlmWgyz
LMoy3MoyzKz17BzOdz+cz6oaVDWdODOnAdLnUdLnSdTnSdTnSqGVQydR1KhlUMqhlUNqhtUNHVcB
1ZiWsjWS9OyhFun2zcNm6W7ZuA4HyeX4z6zx2tMcxDHMExzGM0yTFMgxTMw2NM4xTNxZgGUYJk4b
DYbDYbDYbDYbDYbDYbDYbDYbDYbDYbDYbDYbDYbDYwwMRisTiMVia9K/0r+Kk04DjOPASVYdRxnG
ceA8fZh5HGcZx4LA6JDjOM4zjw+jT5nGdRxnHhMJ4+hxHWcZx4zCxBxnGcZxxEQcZxnGccREHGcZ
xnHERBxHGcZwxCXZvOM4oiIOI4zk8ksQcZxnAccW878xl8c3qmn6cdjsfj+kC7y6cPZYYiw6TcNx
UUfpuG529puG529puG529puG529puG529puG529puG529puG529puG529puG529puG529puG529p
uG529puG529puYxLjMYlxmMS4zGJcZjIjGYyIxmMiMZjIjGYyIxmMiMZjIjGYyIxmMiMZjIjGYyI
xmMiMZjIjGYkdOFwEuj2wEur3wTxhMFqwWEwmrTg8LhPDD9HRhA68V+5jL5k2fPt7cvl/n5+fn5+
fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
Pmf52T7NjuUyzz1bym+SyvRBbQkIGta1rWta1rW17e3t7e3t7e3tvhgiNIYClBgRjtoxnRup0QLa
u2ynNMLgMRhMRg8JhcNhcPgsDgcDgcDgcDgcCjA4HBVzn6dCoBOvJ/Pz8/OTyeTyfz8/Pzk8nk8n
8/Pz85PJ5PJ/PzNNk8nk8nNNNNk8nk8nNNNNk8nk8nNNNNk8nk8nNNNNk8nk8nPz8/WQOo5Tq+vg
qiO5Y0RERERERERERERERERERERERERERERJaQAAAAAAAAAAKiIiMRA8CPbToowRjtiB7ZaM6N7H
6BC0g3wVwSVzeUz97mZz+ZzVwXrN53N569zL5fL5e9zL5fL5e93L5e9zL5fMPe47oEw8EaagQNnF
evr6+uJxOJxPr6+vricTicT6+vr64nE4nE+vro0YnE4nE6NGjRicTicTo0aNGJxOJxOjRo0YnE4n
E6NGjRicTicTp0evthjYNI2fbzcadmb39EnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ
2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ
2dnZPJuOGf4d9XRgJBzHG3V2dnZ2dnZ2dnZ2dnZ2dnZ2eGzs7Ozs7Ozs7Oz07Ozs7Ozs7OzsR2dn
Z2I7OxHZ2dmqJF3FvZ2S9EvR2I7OxHZ2I7OxHZ2dnZ2dnZ2WWWdl57NW7oinPGwejoZWToDLSCZo
pUujJnGoAsz6z1GUa0eOhu9vZysXczcdDOezs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7LGNtp2
L+x+dE9nZ1MAAf//////////9CoAJdYAAAA/jhSqEf//////////////////////zSdh/9nY2gZg
dnZ2N+W9EdnZ2SP+07Ozs7OC+fHs09nYT7eOxnZ2PPeLx2dnZ2Xi8Xi8dnZ2dl4vF4vHZ2dnZeLx
eLwk9nYV4vG+Xs7LxeLxeOzsyBy3i8dnYDsvGibs7OxQBVov7Kdi3QoETAUAnZ2QcvZ2dnZ2dnZ2
dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2Xm89nZebz2dl5vPZ2Xm89nZebz2dl5vPZ2Xm
89nZebz2dl5vPZ2Xm89nZebz2dl5vPZ2Xm89nMjOjSyunSAZAAm7Ah0cgmHobM/RkGZ0cgqDPA3u
zgjN7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7Ozsn7OxnZ2dnZ2Tfvn0dmj07MFyHMRDi3s7Ozs7Ozs7Ozs7Ozso0Y7KAd+yOzs7
OzsbMGSgeeeaUkATRAIIileiWvR2dnZ2dnZ2dnZ2dnYuS1xM/tlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O
zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7I7KrbzofaN8f3
mlhZe1gWPx2dnZ2dnZ2dnZ2dnZ2U7Ozs7Ozs7OzscemjHfsjs7OzsmnDIwM83LBkYLH5Ll3bTo2s
6Ozs7Ozs7Ozs7OxHY8Xoc9pzGP7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O
zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OxILsp0dm6Ndb8W4LIe+D9MdiwAPlz0O89fcFPAwz
DMMxPUAAGIZBkmIAAAGGYhiGIAAAeBke8vRzk/k9D1L4d2zVn/eQAAAxzHMcxzi2HJlQAAAxzHMc
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
ZZg0WHQNAaWy7lh0DQNAaW+7COgaBoFxqa9a0DQNA0DQUNTvs7FoGgJ570Bh0DQGu9oGgaBoGgaB
oGgaBoGgaAz6BoGgNF7QNA0DQEdY0DQNA0CD6HomuarnOua5rmt0Svdah3rmuXc65rkRrmuRGua5
Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGuNbW1tbW1tbW1NTU1NTU1NT
U1NTU1NTU1NTU1NTU1NTU1NTSP1+571y56rl3RGS/dx1evQhevQQaEmjtNuutOmoaw0f/pumsjIy
MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy
MjIyMjOx4x72haEGUGOQxkMoMcMQMpqzFzJu7169evXr169evXrzXfv379+/ev3+2lpuNLTfv3r1
y5cuXLjuPPfcvG8lKtR1Ju1Bv1Fu1DUNQ1Fra2tra2tra2tra2u+Ud+z//jGMf//+MYx///4xjH/
//jGMf//+MYx///4xjH///jGMf//+MYx//4xjo34joyn97jk1thYWFhYWFhYWFhYWFhRYmJiYmJi
Y2JjZEUGBBCzYtWWBgYGBgYLDk//Ol2+8hF9I0nRdH0bSNE0fR9E0hnZ9A0DQNAZ2fQNA0BnYykf
6f3jnOf3veOc5/e945zn973jnOf3veOc5/e945zn973jnOf3veOfJ/e97OUu3w7p9qMaToSGiaTp
Ok6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpO
k6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOk6TpOksVz2N
K5Z8Qd/+i+1/vqqBlVAyqgZVQMqoGVUDKqBlVAyqgZVQMqoGVUDKqBlVAyqgZVQMqoCVUCKqBlVA
yqgZVQMqoGVUDKqBlVAwfQewdQdQdYdQdQdYdQdYdYdYdQdQdQdQdQdYdQdSbsa/Mi/aHoLF5i9b
tsFu1ts27W2za0PQ7drQ9C0PQtC0S3K7Zj/9/9lieoP2c7xYynlHq5f+wezSOmaX7R9M0wMHTtM0
3SwwdAZgwtLDB0TR9P0jTtA0DQNA0DQNA0DQNA0DQNA0DQNA0DQNA0DQNA0DQNA0DQNA0PRtB0LQ
dB0HQbrAQsW/RSUpulEUkk8NFRB79juqqEoSmEoog7kKSqiB5mIqJmZqqiZmaiKmZlVkxETNu3UT
MzVeZ5mo/U7JDkmmw6c7sLCwMR8tr7lldwzOndW7q3dW7q3dW7q3dW7q3dW7q3dW7q3dW7q3mZmZ
mVWTts7bKrJVZO2ztsqslVk7bO2yqyVWTts7bKrJVZO2ztsqslVk7bO2yqyVWTts7bKrJVZO2zts
qslVk7bO2yqyVWTts7bKrJVZO2ztsqslVk7bO2yqyVWTts7bKrJ5JD4dpcePd7hwTukxpYIiIXCM
X0iJCckE1UAdBjhttmVYY4Y+g6DoOg6DoOg6DoOg6DoOg6DoOg6DoOg6DoOg6DoOg6DoOg6DoOg6
DoOg6DoOg6DoOg6DoOg6DoOg6DoOg6DoOg6DoOg6DoOg6DoOg6DoOg6DoNhFFHQdBDGDGU4kwYwY
wY4Y1onhNP8Omc5znOc5znOdrv379+/fvXrzTdvZvXk00083c5zdzwp8exUzyOT8T6YOrGLCFjFj
1q1atWrVq3bt27bD1jBjWsYxi1atWsYxi1atWsYxi1atWsYRRtWrVpFFFG1atWkUUUbVq1aRRRRt
WrVpFFFG1atWrCNm3Zxg1iy9z8Pa6666666666666RYWFhYWJiYWJhssFvq3aYmNhYumDrrpg9wp
8exMz2TWcncbbjSleurvd3stbW1tbW1tbW1NTU1NaR+0+2nOc5aWlpac5zlpaWlpznOWlpaWnObt
1paWlpu3bt1paWlpu3bt1paWlpu3bt1paWlpu3bt1paWlovXb7VfOfu+0QqyDXelWQqyFWQqyFWQ
qyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQq
yFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqy
FWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQc9hHj4+YudZ/K
eVWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyIlVkKshVkKshVkKshVkKshVkJKslVkqslVk
qslVkqslVkqslVkqslVkqslVkqslVkqslVk8IbIa6VZCrIaYaYVZCrIVZCrIVZCrIVZCT2dnUwAB
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
SUmracygqnjVO+yypEbN8iIbap5+6DmUv5m+0pyRb8/elk+oNuzupWiqGqlIFSSl9mvbtVlSdtmv
2DHLv2St8q9pdQLFwtkvIuL3kGBlRTqDMDt8v62Sr3W+7eEOsGXB5inx5k9eO3KCvKSCoPVxXaql
ZIG3biAK51AgGD7DapvyTW2jk9pqTVnuHNqf85jVVN702prblGpq2Qzbld77aDehVCiDLxCJ7tjW
UQ0ZT2KIKBUxDVpSHoWioGzdWoL5tOjYaqLl1PK0MHm7bYILhts5iDHMe4hpiPztDO7lL8V3nT5s
UK0NyL5bZ3KHak5HbOf+CNdYOMnPyK6FBb0nv/j22Pc/8tgkj+wGSXYLIRNze3HQ2tmzZtPidS0A
ue/N5S2nyVVZs27Nuzbs2oEDsnsv+d+L2eugd2v85Of81VOpZ7XteNU7x1ByjzHEEtpoO7d5jQ0J
FJ/bVyX3RuW223d6VC95d4MQvVY2gVGHFCgkFXtCDe6e6CmOP0LnRaEH96EA2QUFCnJKoEF0kD28
9g/nfeQIPAd2g9vNA8gQflh+HZuoHHfF7OfwsojeV2QIAgtA8g620lKnbW1tbW1tbW1tbW1tbW1t
bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1t
bW1tbW1tbW1tbW1tbW1tbW1t33nQqJVNctvl2RSO7QUroujRdGi6NF0aLo0XRoujRdGi6NF0aLo0
XRoujRdGi6NF0aLn0XRoujRdGi6NF0aLo0XRoujRdFUlNlKZdK6VUVSKQpUlVaVJWlSqmqKVKqap
qiqKqqilSpMnfm25Gc+7c7WnK6W3Wpq7aChRKGa6FDagpR5UdS0OVA1bNO1R1HUdR1HUdR1HUdR1
HUdR1HUdR1HUdR1HUdR1HUdR1HUdR1E11HUVR1HUdR0mmloulvb6oo7Yx1ZVFUVRRoKWUjVFUVQ0
BqUqhvqhvqrKDXVFWVRVAkgUqirKoqhraW+qG9vb29vb2+qKoqiqKoqhuqiqKoqhB2qKob29zja2
VCUndQ1DUVRfpbUWqoqmqbRYW1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVM0N
DQ0NDQ0NDS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tFd1ooOOUKMEFCjKi0ZOjR3daGpA60bKd
k3lC85Uui485y7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7u7pUqdPvVZ08RKzVRPbqqZ
NXve973ve9nPJ7zn3th6P93Vptu7bTp7qq777770qVKlN97+qqqqqqqqqqqqq3aqqqt3dqqqq3d2
qqqrd3aqqqt3dqqqq3cle9yUkzHSoZK7u7u7u7u7lKUpSlKW1yAu5Xdy5IBGKLU0tUqio1BUDVRo
0aNGjRaWlpaWjZA5fOUaNGjRo0aNGjRo0cyjRo0czMo0aNHMzKNGjRzMyjRo0czMo0aNHub0Ocvf
evCmrKoKdOnTp06dOnTp06dOnTp06dOnTp06dOnTp06dOnTp06dOnTp06dOnTp06dOnTp06dOnTp
06dOnTp06dOnTp06dOnTp06dOnTp06dOnTp06c76qq50RQX2NQUW+pSjSjSjSjSjSjSjSjSjSjSj
SjSjSjSjSjSiyjCjSjSjSjSjSjSjSjSjdFiFFFFlFlFlFlFlFFFFFFFFFFFFFFFlFlFlFFFtbTNq
m1UKE2mbTQoUKFCgpQoUKFChQoUFKClDOIXL+wv/e3BD88vuyg4p9tDQ0KUGhoaWloaGhpUUamhp
oUWmi0qKKKKKKKKKKKKKKKKKKKKKKKKKKbKUNtttttpy4UEpUtSqtjRUVS1LUqrZV7zXUtS1Lu21
ZVFS1LUtS5bbSqWoqmqWrm+mrU1RVLUrbvUtS1LU1S1LU1TVNUtS1LU1TVNUiu9TVLUtTTpVNU1T
VLsUCUFVWzIvVVVVVVTBvKn9UVQqgqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqi
qKoqiqKoqiqKoqhvb29vb29vb29vb29vb29vb29vb29vb29vb29vbGxtUbG24trdxqbW6TdVFFvQ
b/n6LturdFxY9VtW1bVtW1bVtW1bVtW1bVtW1bVtW1bVtW1bVtW1bVtPZ2dTAAH///////////Qq
ACXYAAAAJzUYqxH//////////////////////1bVtW1bVtW1bVtW1bVtW1bVtW1bVtW1bVtW1bVt
W1bVtW1bVtW1bVtW1bVtW1bVtW1bVpSFWznOZSZSZSZSVLykykikSk9p0M/JXd3d3d3d3ttttttt
ttspQUtRRRTZS9ru9rtxnDDH4/R2o7UWl6jtyjznOc5Lgu72zMnmZk5znmZk5znmZk5znmTnOc5z
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
mgl69423JKgh8AvLfac5W9JAr3JtmXx3FEFKOXHvc5OraqqGoOcqjYpYpYpajQoKFOlPFPFPWU8U
4U2U6U8U8U8U7RKBqLZO1WUsUtTZ17yhQoUN0HW2hQoUKU1aFChQpIKFChQpIKFChQpdqihQoUG3
6FChQpdaO0KFChJBv97UKFChVxS1VlJ9ZxWZa1+GWsysrPz5zoUKFApC6tlVO2ZJZR5sbOq1PveI
lUGb5X5iaXBQoUKFChQoUKFChQoUKDaUqUtQobNF528hlaDrDvKtRQRRSEMmClCkikqu40T7TUhx
ozf8VqydV4+HgK7DXapbXLnObKbS5wcoXdyoNm3N7zZBKUpcldiKdPXcu3KtQcu7EruvWG0+q777
752e+9NXO5u2Ne/d6GXP9999998z/uCes/162er6uqpzVTs56rVVqq1VTiqn1VPqqe1W6rdVuq3z
1dV1XVW6rVVqq3V1XVdV1Vuq3Vbqt1dV1XVdUVU0q4+qsyq1VazxeKpqp3V1XVdV1W1bVtW1U5qp
zVTqqnVXVdV1XVbVtW1bVT2qndVOqqf1dV1XVdVtW1bVtVPqqe1U7qp5V1XVdV1W1bVtW1U7qp5V
T+qndXVdV1XVbVtW1bVT6qnlVPKqdVdV1XVdVtW1bVtVPKqe1U7qp5Vdqu1XartW1bVtW1U/qp5Q
1U6q6rquq6ratq2raCqnNV6q/V1XVXKrlW1bVtWs1Tce976bI4uvNFVtW1bVvTo6qeVU8Maqw+xq
Cooua7NVeP1urqs7VM4u/T4KAxH7mB1bVtW1bVTyqnlVPKqeVbVtW1bVTyqnlVPKqeVbVtW1bVTy
qnlVPKqeVbVtW1bVeqTGq2ragc/bpnXp379cqOadmFzVHbFFVaVX2qgxlFm5jaoearaCr6rgfbGf
S6UFRURRVBjRRVHNFURc1W52yKOKgyrqDdV/tVaqtRRRRRRZjdNmVXKv6IW4zI/Txbq85+fnjqan
nqTx1J6nns7PU81TQXVtBqqmXSqndVORU1NTU1NSc6ST2c5ox/B+5qqZVaPRmpFxFxL7ceXi1Xas
qKuB4HoKDt2VX1Qc8Z4qoIwa6oelUkxqqDdi6oD9aopiI9UEZuZQ7xcSrBVcqLIEONV0IjxVEVR2
oOehuqx0oaDHV2UsUFlVe1bxM571rud83R7MrDXPzRXVmbpTC7FVOI8qch1OL1Vd5nMb1A2bwaje
cqsq7myLn5u07VA2iFLBKruR6A/K955Vc5qGa2VgYzMNRvBkKrlViro+erI6CZqgWNvVLSwt5FuM
8cxh4quqsc9JFec657fMbO0ZnOc/PUVUxiijjdRHzHoPLxZrEo6CpoKrkVBfaI2VXXHF2qpzFVd+
1U+iPSMy281Q9OvR9VQUFQrxzLlqD899jmbVHH1Pby8P22c/eYPFqLr3yc6ZQXbZD570bw8SP224
zzFvmnubpQXlAegzFMc3zyY+UlJO9t0EaqKuR8PEbniyNZQUFAsoMoOmk8PnS26CJeUC5o0j1ZQ9
PIl1i5sifdxvr1oFczQ1PNVTKq7QVPPdVuq9UVFVJHPVmRddd6mgNV1Gc2VZs/VpRdzRZ2NfNkXO
pnq770GI6MdzdH097S9c2c/Ag/Q1HR0dG470r7YR5s548fago9nj4EH0Zqjo6M8cZ1fbKaLn6R3z
c15dHJHzKLpzxZrI8jZubOvXn5ufmjjjj54uepPFeZFUYftV1TVYq3I46svtqmOkdrvFz7/iguqn
uVNBQHyi5jHPd0N0J6m6CN9Kry2jbUUxvKhZzJqi73U7itx0Wuj71Bt3VYvrF2d0TsphzrR6sUzR
RbeRx5b5r7XMUVuhe8jtaqLloufpkcXMfpzR9+d1cfMMeoIdouzy6C6CgoKCgs0XzLMdIqa4lHU0
sVn5o3zRH6mNhjM9vykpKV5lJ1j55ig2bn56jKsccmXVkdBU9jc3PFV3bPOC1mzNtdE+vbNRLtUX
kdzmH56DoLtKg1Q7xX0TK/aQtre9X0vOl9qHzN5QG1rtiWk6Skp3t7xmvsbKHb1z5hsq3L0vh4me
PmVV2Kq7FVciquRKPedcPLMtbRr9olZm1nOjyzrcstJRyKkVHM0ec98+XzVds/aqnHN151FVTrOf
KC6vq6zVWzniXxmiw0RqrPPdTz+ugvNnLXQGqKrnV30zO3PugS6e5O91QNUHapmWlQRr3KOd+9bo
Mw+OgqIsqyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiqzflX1UsR6m/jyqm+qtqpp
VYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVUzqpAqphVTCq3VTCq3V
bqphVTCq3VTCqmFVMKqYVUwqphVbqphVboKqfVXaqd1Xaqd1XKrlVyqndVyqndVO6qd1U7qp3VTu
qndVPKqd1XKrlVO6qd1XKrlVyq5Vdqu1U7qp5V9WedjOY6O2o6rNT55kmZpBZREvauuqnFVOKGq5
O1U5qpxVTiqnNC46qeVU4qpxVTjUdVOKqcVU4qpxzO6qcVU5qpxVTigoD81VOKqd1U4qpxzTVVOK
qcVU4qpxVTiqnFVOKqcVU4qpxVTiqnFVOKqcVU4qpwY1VOKqcVU4qpyaKqnFVOKqcVU43lVPaqe1
ZQVZVlWVZ0OY/NzVXObm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubmq2qxVYqsVWKrFViqxVtW
1bVtW1bVtW1bVtW1bVtW1bVtW1bVtW1bVtW1bVtW1b99q2o3O1FR23UVFW81WVZMbqyrHVlWurc1
VYioKr1BVSJVeqvVU+qp9VT6qn1VPqqfVU+qp9VT6qn1VPqqfVU+qp9VT6qn1VPqqfVU+qp9VT6q
n1VPqqfVU+qp9VT6qn1VPqqfVU+qp9VT6qn1VPqqfVU+qp9VT6qn1VPqqfVU+qp9VT6qn1VPqqfV
U+qp9VT6qn1VPqqfVU+qp9VT6qn1VPqqfVU+qp9VT6qn1VKFVPqrFVmqxVYqpSqpSqpxVTi/aqcV
U4qv1U4NVY5nEYxjGMYxjGMarKioqKioqKjmqOaoqE9nZ1MAAWoQAAAAAAAA9CoAJdkAAAByMBmJ
Ef////////+z////////////yoqObm5uY1QY2VHvszRy+RdMi54lQxfnnNd3fNzc3Nd3fNzc3Nd3
fNzc3Ndxx83Nzc0cccfNzc3NHHHHzc3NzRxxx83Nzc0cccfNzc3Nzx1dVc5szKuq72omKk5znOc5
znOc9TV1XVdV1XVdV1XVdV1XVcerquq+r6uq89XHOertyUnsvsdxx83O1U7Vs9XGMY1XVdV1XGMY
1XVdV1XGMY1XVdV1XGNVlRV1XVdV1WVZUVFXVdV1XVFRUVFXVdV1XVFRUVFXVdV1XVFRUVFXVdV1
XVZUVWKrVTdnqsVWNh2qqAW7qsVZzTSPEutVYFKosqrKqmB6sVQocy5qCqtOep6Z36de19WY8V32
2JPaqAJchQVHTlQUCouRqu4lAagQyEfM+g6QVU6rivD+zG4JDK2cueBDkazVUAhad2e5KvqwojPr
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
oOttFsx7hQbWUk106jj6nNo5Pndno6ije+9HbdBm/ZDj+R9t7QoNsp7fxSSrk3UEX1OZRV22wY2/
S7mMvv9llwvN8022jtQoeIXnGf0CBlqOpqtoZTaGSlUuiy9Fj7bNdQ1PosFqQZUDXUVSdVpYUHoq
ABo/neoO1EUoU3U71FpRKlOVbVvWyykeVQUugpb5VVWqUlbQFIaLhaSiCm7lRQbzxXtWIG+lDlRl
FlC0bqJBcuVrUoUWqhiCWNCBjb6rbW6oJMxQHdF1VRloqtq0phBSKbqeoilGl6jouTFWy6t7VBS5
SPGtBUVSaLEqGoKg0WDotKpcUxoKD6gr8qZo/lQlAVZV+4qf9FjaLJ2/eks20Gxpq0Db1ZU5t7di
tCr2yp2qqL5UTHRbH6q8H2WdUtS1a3erf+dLS3uSuUsoMvJL3co7y+agObn2s6a689A+p6CrutRa
6moM6aOaKOXtbq6qndWVZV1V2qmNVOT5VTupqpZqppccVVP6rFVI1XVUwqztUVNX1bUm5qmrYqqa
VUw61WaqQud1Uo4aql+qkeqm0VVINVOqqdVUv1XOlVPbqptVSvUmzmqu1U4qppVTq5q4qqcVUqVX
6mqlDoftVTupjquVdQKgqsxZU89VLdVPKqbVUw6c3NzVUxqtGjqp5VTOKqkqqmmR1Wo6qQ6mpqsi
gq2r8q5VUyoN9KqdVU6qpS5qrpqqX6qUcqptVSPVSZdRVc6VU6qpfqptVSvVT26mpq+raqS6rFRV
1VK0T7G7HjO+fmFVzn3VtVNqr1VmNtOqnUR6uPHVrUsdxVCqarcRrdVir87vnoIjxcyyq7V2GVWH
MHOhGioM7pc0T7du13QNx89AfrfapfOuj6mMx0q+NRVXqrFXVfmVUxqsc1DmUEXOeg2eoiqpjVeq
+q5Vc7HzKCgoOYR1B6uqsVX6vPVT3m5qrFVuqnVV2qndBzRQqIqvq+qkGqlLnU1HQUN1UxquCr+p
6rFXVWKqYVUwdXVU8iq2qmVAD5GDR3dBVT2q1z1fVY5j0Bw6rlBV15z0Booqqc1fdVvohQVBqBVb
fNdAe6A1CKm6rcViqmdVOaqYVUwqpj05xV9VMarlVjqeqmEdVyrqqYOraqZVU8iioIOqmfNVTJ1U
p1U4qyoqpwdUJhVYMKqc1Uyi51VSC6qf1Us1DOInVtV+qxQWZmqy4qsPE7qyq9VT+q3VZPEapU5Q
HPPXFoc8RoquqzKu0aI6i17Uc8fPVlX1ao+fIrjqw9BdVkx4qs79qBduZVaeOrKrOVbHU88Udx9q
BdueKqxV7x0FXRx1NBU5Vyqunq6rOlV2qxz1NXVU/q6M8ZoosqT81RVaNdVnKmbuI3PFVdeqrVVl
0FVy4oo99T0MdVOI6rEdWVWuY0feqmsVBU5U+deaOgqvUFRQVU4q42YbmqKrMXNUVWauNFz1dVa6
GxGoNuPT53qgqy6mbNFVfqatqsvVVq4qCq4aI1BHQXHVTHmqsRzVVMjZnOaOrKriWUFV6qka47zs
aqm9VPKrNX1WKu5qqYR5lXGqs0FVurjR1FTHQHqsnjqu9amqmlRQZUYY3PmH75EY1AreVddTHVkd
moHcZz0DzLjSjjqakxsqy08jiyg6R3QR1WMoLjq+rY6DRqsvmNHHrpE6t4EVUwqvVXpvtV9BUZlX
1PNmbqOepjqs1Xo+naq4erIo6uyPKsjqplVl1blVPMqOfKuVVItV+gq/KrFVOKqdHqpjQZQVXqui
qpPqUqtq6qnVXaygPzVGVddXVU1qvUBueq1zNGV67VbVjqu1Ui1WTVZVTG4r785zUHOqqaVWqrmV
bdRVTzKrlTQVX6CqkWqxVTir87VU6iq7pdSaqyqCp56rvNU1UyFVNMPdVuq3VYq6q5Vpueq86lXV
1n5me+aoquVU6qzmqplFVTeqkOqxGuag3VfVVm6rlXVU7NVTGOqmVVsnFvd9JhcyzrtmjO8zTqcm
jdta54m+/RH5jdLvmjNVTmKgy8y8788R758joKnKCq1uOg56A/OeLvU81upijw+NqrqrTqyrLqKC
hq+ravqs0HOj1ZVSvVcyrI+mXz5VvPVZqs1dVfqvVWqtqO9X96qakqsqvn61W6ra56v6VbVSDkd3
UOOq5UHq2rKtq/pGj0B6qYR1cqiouq1U0FXVdV3PV65qru6rvPabiqsHoOeqmFV11U4qatqKrEXa
OrjYt1fVfqt1W3Vdq7vV/erKqakqDni56vqtqqkHOlW9I6irXU89W1Uxiq2piXNVtVMjm53z1Xam
q51oKrDyP1KpqsdaqYO7dVmgPQHoavq66rNWVZV9VMqqd1UqVXaiqxU1ZVtVqr6nZ6v56qYkb92l
Elju0QBHbMt243do2squ4dUFxVXEqrMV1fV0Rz1eaO6DnqKCr4z81T15o7PUYaOq7V3MqrFQSi7x
+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
VVPKqeVXqr1Vqq1VaqtVU8qp5VTyqnlVqq1VaqtVUv1ValVTyqntV+q/VaqtVU5qvVU+qp5VTyqn
9VPKqd1U5qp5VTyqnlVPKqeVU8qp5VeqvVUoVU7qp3VTuqndVO6qeVU7qp5VTuq9Veqp3VTuqndV
O6qd1U7Zqk5nVTuqndVO6qdVU8qp5VTuqnlVPKqd1U8qp5VTuqnlV6pMa6jIqCKrebKmOoiugyPB
WUItOo5ltc2KKq1lWrmPH0jNV988S78x8DzeA2VZEpjtm6sq3u48NzyttxGwzbqpgaoNUGqt4uYx
jGMYxjLDVORRRRZkUVBQKoMaI1B21bpszSjNz+pJVPOepSXaKKpjq4/Oar756nnqeepqann57PU1
WD1NTU1Jz1NS6DpVx43zxvp2NlNt7Ofnoee6r1RQ7jOaro6svfbXbpVWlVigoKsHY1TCJOBhfPVD
dVY1YHVY8q6Eu6o6rEKirarEUdX1W46uypyKzc3Whquzk4Ng3uCw1HVcqu1U9q2ouKq7F256CqnJ
qCqzR9q2xEI7sVU56dDUayqPt33j6DsxlUhqoeeJ5UVGXzR9YrpaWWlUO/WKjSqjyg7J9R3YyqTn
qhqOc9XVdZqnmoI8dLqlmfbhz1a6ShN3oKBvnPzHocoLzpQ5QHWVFX1bVT/nvKvNugoKKOrTxxKq
xVdXO6tq7moKjOar1VYqu9VQa3MuU1W856rV1WY7qpSvm56ioupT+Ya3mqmgtpqr+1muI2Tk5zR0
Exz4ldJ0zHguOq47NnOc+5ip5qB1EcZ3SXi9pKSd7XzVW8ypqu81WVKqIoqDIqnVWqrqDKl1aquo
MiuqlCq9Vaqq0rnNfNkVWUPXvQ/h1q6gVAeqnVWUFRVTLmqKqZc1VuKqzVTOq26ONVFVl0NVOOh6
Hnq6qyeoqyqyerKrdWdF9c2unrdBEZy2u0t5l0VB37UCW7M1Rm56PzNYe6OSjUlrct3vLz7dFQd+
10CW8jy1HVnZ7OrNlHKqOTI71UnoWc/Pz1U4dV2OpqpxVTLmNQO+eM3MZUDPzxtHqvVWqqUMjqe1
VhXUPtVcqsVNW1WLqu1U7u4qCgygPlFzq7uhyrsyPVRVtVOamOq06rdVMjn5+0UXXyPy9T0UxUaP
IbtwNKEOBu4u3NOY3p4bMd5uOdBu0sspCXcXbmnMWbWUUcdFbtYkfDJKo63Q1ZQGqMjyo53VlVqr
evPV1Xc/erKrVW9eerue6rtX1bVT4xtXaqtXzRG5owaqzz1bQxZdVO6qUHVfq+rqtqtXdXFc+0dH
3y1Oc9AeN3V1V6q6zniXZLCk8pT8xszDvrHukprVuaatPpQjKHZsw3p3QR7k8y8VCrePO2pycnNU
O9VFTVTCOourasoKuji57qzmypPQUFBURHqaCgoKiKgw3XvQfearqtc7VnPvnw45z1U7y77R1dVb
5qsoKsi54onZrzIvc82ctVlTVciep6qzkWlVTGq9zX17HwxraxZM2+n5Rbnfm6DWYegoO+UFBQXn
e7f5VZudi+boN2eJ0FBdBQXdBVaqv1dVaqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVW
KrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVcqp5VTuqnNV2q7V9
VyqnVVOaqc1UqVU7qpxVTuqnNV2q/V9X1dV1XVfV9TU1fV9XVdV1XVfU1fVTyqndVPKqeVU7qp5V
cqu1U8qp5VTyqnlV2q7VTuqnnOeqmUcXPky8ztMWfOeqxFUGxVFVjm5qrNVk9WVb11e7v27durat
q2ratq2ratq2qxVZq3mqs1WarNVnyqzVZqs4areY1W1bzc6oKC46nDGWGNEbSNVeqvVU+qp9VT6q
n1VPqqfVUoVU+bqpSqpSqpSqpRjuqlKqlGqlGqlIyqz1TV7WZmZkc9fnNccfNzc3NHz7i5oqmpq6
o5ubmPceGWGjzObmjj54+bm5uarqrlXVdFzezDPdSc93d3d1dQ35VxqsqKuq6rquqyrOnPV0fPVY
q3mqs1fU1NTzGqw7PUMHq6rqioqyoq6rqnnqsVWqtqsc9S6rFQbKqxKVV7VuxZjY7vKrDsUFBHfb
rQUG8x3260FBvMVVYHw585o6suI/e8NlVPjVNTqqndxxZjNlzFLVWLFXVA+8TqFkdX0HPdQfqzGq
t1FBnagoL5ZxEsqhzjfOjDsUN7vYxLjRuaNx9zAdyvzfnr8mJ9jyjlhkMqi+DsKX35lBtdMtKYkn
JyYknOPzuaM+PRTww28fSU9nZ1MAAICoAgAAAAAAt5G7ChQAAACUk05JEt/i6erq6O3j6+bs5+jw
59/i6x71WHhxBBBCImKyDb9wO/wzPJR7pziNgWeWaw76w7lNS/HP0ZX3DzYiV4dCcjgtvm1Nvlr7
+Yt03fn6x/zll2H09fDWPXPQ19s5jVdtXF0lz0bq6aqb5nAR517P21klt2HNu2CWaOjeFy9G66ep
6xIZ/YtuM69tdTuFj/DMNOWndQTBnr5lv+xTJJhKuF9hfBK2fbocbD2sdUmGjS6ams8+v65HyC1N
7BlXGZbl+ZBXt28Ma+1AP46TuP7yy+vkmJ5tvpwnjjM91xe6ZZrMYzAS8F21OnHOp53NU9bZNwMe
tQio5U1HFV4DlOtOtvNm/ni8PqiHs6GCV+jMSf8xu46SNK4T7z1mYmggtokLSb6MXTKwPWarnfrw
KGUkbcbDfMNf18fiw5eXfr4G1XZ5YdMy5aabI1aW00RJdUm8eE5yyF2XHOwvc/cxydJ/Py/BQ8na
Of7Ycn/TQ8tqSUYSF7d1wGTjMPZFJM1aIl1Mu+SzeT4uq88bu83VPeT1dO52l9z1xjp2So7T716U
WfZ9s41V5GChvd5MnN1fdLKzm1zUb7vEdRr6np3k1ZXLZvGN+PGb2Og40OKFHzr4tRe+5U0CHqVY
22bXeos7Zh0aPdZsfNnigaM9bMDLg3c+vXTpX2XseXH1bz5AVXSd9u3hV282kK+GtsOFoQ+3J/9a
l3/0K0bUEXe0rb3n416PZvZ+7mn+RWl6n+7sNG6beFOHvNns9189is2LnzxkrxNLqt8k6mryp4zp
o2pgbKh56Sc3M/XwHnykTZGWLX9dUTrIi3XH3Hmk8+HNrQerTm5O/HTdbl7b6sM8p1FOY/m0iWPn
OvTaL8PHJP45KX62vj5G0xbiXcsFc2qTajjeiKTdqxkN7/T/Oz5b9kXXRumM6Wmm3U7nZ/eefFyY
bgEelUhJliIQiqv+mds5r+161wt0CG6dg8Tc1uQ6v/zzfrMY+xX4LvXWs70/s4ZB1+//PiFe6l8O
3zV3vjdsd/poJlFJ3vKWu86Iy7tr10/c2tIfE3O2sX8xf822TD9WrVnXd1N+nzc1q5t6u71IG/Yw
uk1D3TNouGb6Iub8wrS5lncne47W7Iy90JsuP+kvp5HjvnsfLqZ/LdazXE+h9bXjlvljCrq+Z7SG
VC3yqazu+vtW3N8L+aXN8Zgp4zHcnTg75qK+m2N3073n7MJv3pWNxPRvNrvtS2wXqa6td4Zl7t3W
3vtqZbj/RQEehRh4a5oEtJ80Zt49GKZ6KJ4OXnwtN+dWBffOeTqOvXOfM8817BfTszf74t9fzMP4
S3pW0cg/DVvG4ShLre2sM20g2m99aydINay2r3XM/CI2Onh6IqLJduzW2Oxv89d1/8pXI5rd5Z7Q
8+kK87w6v7peX7Rmzu6nK3SNZGwkZ2sYa19LLzNejuNNstc6jVBmebfavo0P/SMv27XYVx4r8V2b
duw+mnfZn09T+agx8ryWtpP+SDzj1tqBmLpwZP1IN040v/ri0QPzCtuvL/+u21L8W5O447jcVP8D
wzkXKdkdtJv19XT+tm0epRhxE01RxStJ6uUqqXoU+fWp82nYoUttgq7g3nk7b88xEcuXrql+VM73
rt8F281BfrPH6ByeSyYty++HdbCThWkyJeWP3t2y3hnT/Jioht84q2YehxNphmZPysLruQdjdT1f
T2Mz/5Z8233+Z8qs8edU9EEm0rB6mD4mYxNdNTsLxTyzcMWUmbv+GJ2u0Ud/Fn+CTTE18xVf2NNh
mFdp7OtpV+TzeDevEnIPwUccgr4992AkrcemHfQTUUukHjRlFQYOp1v4lO/K3tgICfneZPqLcVLd
9WYzanky6nIuhydKq/u3bOE9HnVYdJVAowvj7A79ctNDnx9xe/zNw22fluJfpUMI3m7Wxw31uGOb
7M3/+W5nejft6UHAr5ausOWuXqfSvZuXxDNpqchxjUQOXFLUojO3ONK8e2qk69Fkfzx/ouo0Me52
u944VkN3H8coVr8QxBzqCty4G2TEHIcQogcd2xotR/1XvzBL7B8fMR/WW63erS0drzdCcmFt5s1S
JC0VldbuYa9x8qcfNns9hCEkvZwtvy+p3z7V/V03khgLzEOcun7K9Mwtb7f9cv1ud+bciU+lN86s
/ka+WGyuMmZmHM3Uuy+2iZqbjaCd3P0SHeIGHoWYZVGhdGilG6buZD6un1i+W1/goFjoqpJ2NF0p
zz232xtl3Tpv0/CtaJxz4bfdzVTqdrvpbtyaZGdpfiNJZ/bPuvWux/nIxE0Pp25tzWtOutBtxDc7
tUacy7Y1tNp9SGvbsTE/uTdv2p453JhG0x41O+NaTHnyN7nP7dxQWV75cI9Y5xrbJH63mZj+gCg8
bqt8Ca/XXBaSUaOo8Uzao75PC62Wstx/Pc+Pvk1cbuPDVZM4Ku3M7Zubcvn9hjadg2haA03e/PhZ
0fEPR9T0kRTnt1v6k5lNEo3aaxJNQ3wTsycedRh5XRkPIYhNG7Z1A3KXv9TtwdsD82gaj6sf947K
vVb3wO28+C/a3NY56PsmruXch32xFyz350fDk+t9b9NextTuAH26ezHaA1mXcTMtpLZt5gtL1ly6
2cBV9OYUY9Ixh+OU7GLN0rAtzVScTrl9bDmthtPNPFvDw1J7npjLkvGYuJzE9xhsbM+GV8prXY0b
nXB/7JTQ3VIuRJtGGR3Rr2W61rxeI2ozrKUqIZ0jMXM0n63zA+Nkp1POJIZbkdTZWB9jva1zRqbJ
re8K9J8oOjU/9+S4vduYL77q9prbiL4vmqZvrjVb4qUJHqVY24QSVCgeI5PajHyb03ajt5f7wCyT
7NUOXQbs9WdnrYM/dXX5cOfcjcbvGfsMHPZ8nqsoh2/+sK8siju/9cTiJb8wRvTLBzk520j1l1sx
NjJJv7byEk1LzZw1qD39NzXv02e0+WBEXi9Df2ea0+mx8jRt+jbOmhnV2hnF0juEgW3aw4nrzRyL
eeRHH6nh0/2U6PyYbc+fNs+g87c/iTfv6Xh/vBz1kLab53UxvSd7iKFvcdlry9DzMmrIxkCU2jat
6RaOBpuW9YPESudwHu9cX31rY0LHiEPrLWlPU0J4fbd3VAQehehwU7Yp1EJU4NzNsMcXPn6+j0dm
YfygtNzdh4aCv1zM1/YgNd39v1vFnGgzjVdipCCePr17oKnb+pt2PzJ2x5eXV7N5Kottb/Onfem2
5/088rtuzJHfbFft9DpNa1fX+bZnOOqWWXRqs3R5vvfbUVjC82DU727uT8kpe8XbXIvtXkwP0u8L
z+/DSzabscuRD39XnnCfnldf0/Onb6vdshiREZXnJ9/nzO3S1mwfR+DB1mDaDK358flsNnNMa2pe
XHyk5mYafX7c9c2IrHa6NGajTMPbsKw7Ypj89+HJ8ipjSKzS35Jkb4kZDP6kGGihAUEicxPzL+P2
+vAibopVpyj3Cl0j8O2bwW0+NheGaZ++cVV6f/36yNIbELNaUrewzIv1SSR65rSRF6m13fbKvMLy
j2WayDMXPTuZ9yMar2Q10GNdYWZaH+c1t5GxtauTsc79+6/babE+3mVjf8tfY1ks8oX1bjyP+9b/
a/bu4pbjB4d5Ekvctwd6k2z/k71XmsTexwtGtPEWrLqaNL9ae/XgjmYkBszeQTQyX56tQVZl3caS
o25bjG+/eWR8JJ0H23y85H1n+c58al1ayuBLO6kc5mGcHpR5VVrSNlHdereGDx6lUKqlhlnCJ61a
knt6xVSt8qEL8yGmYcEZelS7e+d4szwpptsazdqvp+jh21O/E1xdy+VDVsgf/T5E2hiS6SUyz+0N
q4Tny7eP9PM6sdc45mmdfqLkrTYbbSSyYbE5fS+m2tF6GPFqjT9pu6Vvr240UzJjtRX2Mv6n2+nc
x3nGr+YtfYXs1912P8KGT79NDZmpS5LP+UCbLvbpF0P+VP716ryfY1Bj6h+HTjXJ0b0NmVMyG9N0
5eNEzxi3lWZgm3uwtvvxknj9JTJgtW++n1q9LeI/8pZos9+THD5IVS17VV3jw/YPbQcelWi0SgRa
Eklt5cu2ywWf1SGB8vKuIe1H4VH+91mW75+OvfmFrD7aVS3G1/WvRrUWGL9+Z4dtMfb9OJx8EQeb
RJLumXPfDlhop810s8TOZoi39ecGz5eUctiZTK0009/meZxpMW9tNq/tazLn92Qz/OkrVj7bPs91
feY099cQ9tPI5yuz9yXsI1yQnFhqtKvmGbsru1x/LOblc5PxDxkHTKxtk0x/fv8Uk7hc1tRrex6h
buy73DPzzO9n6fuaJQzqH3z7/Npqd/dbJ56+P2lM2lHafMsjy9KYg05i0mY9lllkFaW5ZUsnwnb1
ZPE1QwUepZh5KZqWGMKCqRfWcDs+utnBuR6mzvG4V1lXCn5r3Wx/lRt28af2a1svTP7KX1Cv153v
VjP+2K/DiCuctxH992B87dPqguTteFu21bTYUHv+5D1gay6/ynibYghwjo+Z9y/arbAYhS164eDq
wotOxHcxr/1t7fepeerYBo36OXqNu7EemE7jRWtMXz2G5IP6YjWs5kxrM2o1HEml/vA+6Ee3tc2w
Fm2rr+abySku3tlu7Ry6tMudPXHL0rusV89YV3+f6ixJDI3GeXOr3FpUdlcvt725/XAtMhHCtdTW
N7Mml1yMJQAelRhkE4AWydwwfjnLpjuqqm/OTx3cvX3fgj37+lt56QtfPHsv6xVPmstu21vp8vDK
+8XuieEGentqbvGdNavLyzSvmpGi4cDWHV7w1kgdgxwPop7N2CzZ0cy59CNbu2klWu1J3Pf8kt+T
8yv2dqV1LNofXtg5/bDpXP142ZvlVefpNf56Zirbvt2HWfObzZUmybUlUqaNL2WZo5y34ec0o0tu
lW0rjZIWZFCjY2nTt2jTmhfGffJxGWaV2HDRtHlMDpoJY4nEWGLmKXPJTK6zhpGptFNksIPPZq9b
6WwLHqUYeemBLjqEyd3U1YULRryImyPmunIdyt27JOS81S/MwXmh3X376ETcK8xny/d5c2l610h6
ymZsl6Y/L+dTKBtRuweuYOOwI/OO9xupkCrugte1XIrkB3k2ts8j3/331pNf2I3cuBwnJZE5BGo0
ivXnFft25XiS8PxxbV6a8q/GcEvD6HWWLcNhP/DrhUwb04WbpefTdM5cb7S2mWKsW1H7pemVtslI
2lIfuTWNWutKwq42115c642bN4JLSHP56+NrZ43D0VZ+buOHG7QSI7ka6YTI3ER98biFu32vQabx
AB6V6KBUDmIQNEHmpt6fLx7swavygtwb7e3elXUvT/Lp9xaZsu9w+2H0lHSPLdHlk5eEjXnHNqLb
ns1VK3EO+7X6MQ+kfzP9ZCfHO2kNZEs7/fhpj/f1GjKEs2ecj0v66oe+jItTHgv7MjQnk0DswavZ
bLbbKf6htT05eyJNrqp1u++n31lsrxh+ltG5PO2kthdWq+7H8tU8GbaGh3aut/xYFkvLSpv4+Fqe
t0T9Labf2+oYQj5ZNGyYtvs7luhdNimb5r2u3jJ5bcuivrC1T/5gyezNbrcdzb6LF2tvboauL3Tf
NbRhDvEtZO9PZ2dTAAF2EAAAAAAAAPQqACXiAAAA6jPnkBH/////////ff///////////90tzlEh
7RycVwdUX0p1FL5K76W6iz1GbxVWarVVMO1V2rIj80Ub7H5oo+l4egoKqanvI6viNhsq6pafPkXM
6HD3QcweYLP09pHV1VOY+eJ5VTOrqigV81DzRjM+9RSX4qNVto2OkSfS6HJyFeLeRGmKRRqgnceP
dzEM71WJGDRn7Rx1WLoHV9VMriqKCp59ZcVRQVPOjz9TVbqt1XzqrTxVXFuz3jyqnFWVfVdyoqph
VY5qs5jqKrvwQJk+0w7k5jRHq2Pnqat5oqsTjievFjcZrFBIfInrMucd+M/XLOxr2gkObmc4787R
3eaoDLL/hYfn5j1dzVWKrlWVZUZlRVbV0EVAfv0V0EVAfXfKqY1U1qprVSk6BK8vFuemtULqMqb5
qqcGqIjxdjZQd6tE4lV66UF9eaoO8PVYyojdWjgSd+uhuMp3qEfX+kSP8b/OrcV3jnDRR0K3vpm5
mppe9Qr0VIka2/zqsGy47U0ep5nrXe4tauM9SbJI3HU0MWR9eapzZ4qOPFs8VHHmc1ViqxVT7XNV
2Z28NV/WNVWcqMqs1FX3Vc5lQR0H2FHVuVWearuc9VhVffaq1VnNVdiF3s+jZz1o8NvWZ3d9VdCZ
dvwxrDc9Jz0tLht6y8N3eUNBG+u7V3buOf7y9FGznMtzMmnpbmZPj1s9BQVU6qKt79L6xRR1dVZX
eoi5qCoq6I9BzRRqq2PqquGiqpxVfVWxc1VOe11XLjqphQVYDXd5VaoMP1oCxKo5sx5H8MozEK+g
z3veOgMfrQFiVRzJM8UTPfNGUrbrqLNdtHqu1XatPzZV1Cc573inJhTnNVTepqaryvLv3n71PMKu
zn50eq5U9ojVdU0GeXFGOfD9zKrenPF0ivnxRzxufmGGNcM3VTFR+do4448nIqrq3V/46q40Sijf
vhrvBz+d+eOOMyNVdzdVm9ztViPnup5lMSex5h6g14Fvr1oaDXiXec8nO3s5p1UxqKmO7j3Q7zKA
8wczcXtzkRs9njc9B7RLBgjcTiyLv2Mfn2fAntVcZOazsjnw0iiWTOs7fLfETc0bZjn7YbxuO7bP
0+5nFcvvQLznqD4a7FA1Hs+XQRJvcXOe7V52PG52w+1BQTnSpw1Ba5qA6Q2c0q2pXtuy2LzeYy0l
IlK/G72ruc07u0Szodn54sN2yOYoc7n6ZQ53PpVX6vq2r1kfO1zvz2/TLOtXbyooKBG9zfNUZl8y
5+fpzRRc7/lvtZEnMbbJe1tla3m9+kgrITGb+2yXvq152K6XTwiqm+/TIjxGkNhqCgNZ8oKA1uq1
Vdqs1U+lyt2i17HfalnOsbi5po9Xrnjjq+46uPMdY6De6Ayvuuh3cUen5UyVuju+i+7rkpOve7f1
VvmiGbCjNzc9Hbqt3hqDnNVnSpji5j85qs6VMcXMeiaMt97P2i3tny6A5nbKZ1zm5o6DDzjoHQHO
757ZEiVrBEr23JXsj54QrBZ5iVrTpLbM7NicRsPUY2l3ugVtLvdB2MerzzXvsikffO3NUH5ubXY9
b2ou+nRmNzPD1HMaLFU7qsGXT70vfbcxODJ59Pm6/nLXbtNaGTz123Rrpqc1DYb6mMe1PXF1oIp2
gjyKgjNEePIqCM0Rzs2PPvxYc3foegqY5hcwb1d9jxc+VDoIo6A7oDqzc+KdtZM7CmFsxl11GzVd
7F5z+cyOf2Jc75kc8fXqn2aN4j0Gm6mgd0UR9aITHY3bbI86ixxRo/Soi2p+eyrwQ54yvz+qBelS
DIc8dlfsvz2gXqevWLzOkwyF0CV352r7ra8121XdbV1XZjD+TpsuOpvd3kZje539PHeUHTfeYvrQ
bWqGPrm5iLfQp21oENdcUxFvoU7LWuxDdB1j6mNh+aK3jqsUFBVYvSq3azVs/Y7u2ZmdwMa7iq2r
+ZVF9rN7j0svot/cyrFtW+yzFj7Us7RzctHSztHNyyrn5z4j2Pdo1Di8eR91uLF22e49uI0lFmaz
5leGoot3778zyZ10TF+v7Dfa5yc+EPJnp50axv1Lzz16Zz9ll1+mGzWJR1FTVSVnTd88q8Bgz9Oj
fTL6dLui98WHPzRLJionKF9OZdJyGloWQGdE5wFG+z1kg8UxuY0lnS4z9OnPzc5q891Xuho3MsjZ
9ypnkXd48vN4+q9Q7eEPSHzTHnqHbwh6Q+ad7z0eWFs65871WYoz9taHSavN50jjnKBS0G07vnPz
WZ82+1SI7NCj3y5zmEtHqT6NaG1s2PUm9G7R9Tbuzdo+pt3Z4o6B2LsGqs1EXNkUUofi1rLRjbiu
87YNVPbM0mkOxs8xpQtiVD3peZ8aefGroKuq6JN719GSdEMGRBu4eL4OnYdcD8Bh2P7vsvvyXb36
NcT3fdfZZdvfo3se8u+/m/Qxd5xELziKFXVXKrlXiT69PtuQLt086TqYwWPc6hahoe7GdJjycmPK
ir6vcPdDXLzEk/H3Xu/Hg74N+e2M5TW7gqCqxVcoOS4nrhoNIavOJ0vOIt72r6VWarFVzm3bu1sL
lvpt8l26dnxHVBVTur6vfGt8nB8kuIlAfz8Cp+KSro8fwBX4Ar8ASejzeD8AV+Ap6eL1PLwe3l4v
TwRxr0j4MenLhhj0+PHp8ePT4/hj4Me+fA+N7vT48fOi5H3vwL+W/C5cMfC+F8L3HwuXi+F4eHzv
wL/P6XDHwvhfC9x8L4XwvDw5flYT5p88+F8F/AnfBfu5/Jpz5n0PCvg+Z4V7I+Be1e1e1e1ez4Ho
+R7E5E84nxE5exPfm+aPV8z1eC3zfN83zfN83klisRnYYeEF7V7VhqvavavavavatMVsissWmvfs
TDZ6vnI7fN83yh5vm+b0KM7b9H4GwPqBoHg7fZoPggkOROXyx43u8Mzn29q4M7aHxR5NPJ0+hBp4
ByQZaMbGEsUtYssIyxWWMJZAtkGWQLYrND2+FpwYoOnYFA+pZ2cg8g0Hk5KaeCkfJoToCvxIh8mA
HwGdgOEPLDk9leDoCno5K4Ydvk9lOTkSno6I4adPk4NKcnBTzHwfDow5KcnBCnRD04Ydvkw5KcnB
CnRD04Ydvkw5KcnBCnRD04ZHwM70SnAnBpTk6OAPqaV8lIUTT5Pg7eTo2U+JCnR8nwYV+dnYeb0C
NF49vl931PIPkHzfKHmer5vm+b5nq+Z8BnYdJws6Sdq9PwV5niq9q9q9q9q8DB7V7VxjxYrLFZYp
bDm+bFZYrLFZYpbFZYrMfBD9vwvPPPPm+j5nxV7V7V7V7V7V8C+Be1e1e1eyH0NfifMp8Dpj0xD8
MemnB8n4EPTgC8OigTqCnZ5OBU5IJyfk0+Kvavavavavavt9vgXtXtXtXsh2/E+ZT4HTHpiH4Y9N
On4EPZjwcHs6dPwcCrrD2fZAQ7ovVVVVV33d91Vd3ffuAIAAAGAAGDHcAAo0UAAMaPYsMa3AAAAQ
AAAAw7oECA8AgAAYwBgxMD7kFAIAoMwZTaTZt4iz2nsNMxtfAIAAAAYAADbAwAGC/cAAAAGADAAA
AADAVAAAAAAAAMAAAABVyABB4CDMAAYGAAAAKAQEqqtttvbaqV6r3ruAAHgOAAAAAuUUUUUUUUQo
oooooooCilVXd3d1CAcAFAbAA7AeADAhgJscR1APAMwxcUzMQ0VsYVldhkAigNAGACdsQAYIoNhA
A+gJcklgETET4QwtJQJQxQtclIQQEP1cgQg0AFFdIgdggdFhA/4MVQjisiASUVZdslhFYFQAlAUA
ANANtVGFdFAeAjAzAClADA/AmA+A/ACE+a0+bE+c0+cU+Y0+Wk+Wk+XU+eE/9PltPl5PmVPnFPlx
PmVPltPltPltPllPmZPltPmZPmRPluzonzEnzKngngnzGnzxZ0T9LRe4LnZAAByY8ElCBECLC5Ob
jnPh2IGGxcLkmRrw3M4dcDgFctlZukY6dmQgASnMoNhvRFw0NgcQC8N3lPHMxUreNxYCmi4Czv8Z
TEQIjMoEvGTVPQoevFI3LcpXg28NySBH/L9MwPrkAF55KaYSFw7wSBPglK94ZyGZBDyTgmobvBoF
MQDkvDY4QERUHltRk6SBCaAeAxkLG4HTro8QG5vyhZ2d9HlPyfeF5Ao2a8AZYXAC8AXAQhlWzwoE
bWKTuQvBE7zdJ94JwPikiSVMosJGJFFwOTZ+fmmU814gnsgMXimQc8nQKoD1wQmj7wIRcEjN51Lr
ccAmMTDeIICGeGDYRLE3Cp0jCeXwLcT5MJmCZhuUZ3lA5rIj72HpqdJZNdddMcTt4byDOuuK4zYr
gLOYqdJoFwJGI5NXCp0Z1kGZDj0HM3go1Kohmk8sgPEcwsBO66jf9gHJFmBejVmtbRua5KC5okiT
Z1kWaS4mMGTpNAGXZXEAQkbPgU63jKTZP1LCUqifv4cJiZpKnGT/kw7ME0hS4Cd4IuA0kzLItwEX
IUiR8QLx1FgrBMg/Il4EuAk3SYdI5iGHLIAuRnOU5GmCUhILvAF4gnDap3lebZLG5AM4JikCbZPm
ANGoA2muj4XiyaqFiQ6gIEiSeKBMhzBeEp0uBV4Gly8AZRuRZnzYY7OYxtAkCQDgBK87hQ43GRfM
X0Bph8o03CWROMG5THDoY/eC7gcDzWJiBsAFQGYom8SBMpo/eMnzElAs06yAKZs14KvDmCZpPxoE
kwMgTs3SCq8ETLHY3cAp5ka8F3g0zk10vRJa8LSYVynzt4TuCRKA1cETpA9eIJUHInLw3qA4YHcE
3KkRQtJTXguSx6atTs7yXMUniOuSbhuSVTBcIpgCxkxPwefPQeFn9SUzCADcCLwXJ8vj94tQHgvA
JXhK8DSLhnHHgVreCZDvDd4MuAkcdxr11xyIffF5Tm8JC5s4UD9H1HajoFMtYVMDGcWCXFqnhAkG
QBzJrIfoCAcVmDLjjK5F43N94XczGTozMAFJovkfMzTKQYrJeF04XOIMPybGc7gQCXgS8QYSswCg
fLd4TJoBkmgYPxyneAJNrED0t3gARlEVBpgGjguXeDiR0Mg9q0Z/vEEiAQ5KRWF4Kk28i3gGRwrL
DWRiwBMhsCHX5glu8PQQMkM4IDBg/I87VzoByMCjdwHvGkwkdbwvjlt52SZAMybeNysxyGOF5JkB
AIoD25XvEH5IuMFqNzKU0jzkAILhlg5mn8CFg5AQCpEXLID2asXm4oVex6yTICA4+QGxORZQQA+b
TQAgIGGQEB/AM52yAyAdJHKs+DIRa0SB7gxM8wHAH5IczTeLzvOJOVzI2sys7N8vhd4ACzC5UInZ
AuDlWHIOyBlGsgBkkrFkm/FeKbgsPzfcFLgvEKHOcEDOTJN4QWyZJPBZvQI5LgAJY5TjM14BwSUD
3hHNN4xeKQYvklfPkm8veKYggDrDNN84iAZklkiJZloAAgZnzs3xBCwNKonN5+8Z3h3HLBXJhkzJ
UGzkEzlcHBub0ByslN0kDwwdIsSCw7JkyXBKb9JCnkSF52uBVdwOk+QK3sq9v4tCJWSRG8BSPK9c
oSBOQi+CiR0DmnDkILwCWYYB8J2QLgBN+C4ZEg0alQXmmYpAHsmSR7gbN4noLTtnm+crgYfuEsxX
iqRRIFFZuZ+ScwLI831XDK8AXg68Sy4OYBJOJgmGSgnJkn+bw91VT2dnUwAB///////////0KgAl
4wAAAPm1LEQR///////////////////////iQnOFwlGCLXgmTQKRrwlJYkeAAbJ8zZJvxDEvAc8a
hWKap4nc7LWKRgfJgPXg+QjUjZLw1N4xjMy3MFwGIETw0SkGRsgHeIMmgXeDycgBVwMzzfVXeEgV
0m9NJ4fJOSMGCWa8DzfI5ERDz3S5XUCgchO3AHW8HkwIpIRDJMojkmB0FAsUF3gVc3yBXIL9wGuA
OXIARHQYddJZJqm+twIJbuCt5Am0WNkQy4A5ByfsnhUR2TbwTcEFzfpXeDQALf3NR2exoLuAOuTJ
N03i5QzNJo5cLK3AgMBSdwBEiLTQM4i2QcFck34K7gK7mP3i52c7xJIrwRcATJ6RbwBM/3i7FKt4
bqcGipKVptrmmZjsiCoRIR28HzIJE1SyKXjfFkT52MnhoHyKnIzN7meWJFBsmSZsklNJXSeF5Cs3
5A8JLV5LwPN+fBUEoEsZMk3zuFhUn5NJuyZSmQpPcsA034s4YVdDh09kyTfkISeRyZJ/m+XhWQgj
JgljPhIkLgISk+8I5JvyAgiRyLmbJN7meWJFDcmS8LqD2lINk8CyY5vGJ7YJM5Lw1N+d3wIjLGTJ
N8/yEFSfkLXiDIZxjEtgEjBM3kckoiIaUmr8mSbxgiH4ZSO5JvIteCZUyBkjZCIiCSGGyxeA8k3j
EpZSGQ9MOSbymSRpSjkyXhfCGZStwGlgjkxTeMTuKSidyT3N+QkdKyBI2TJN94HJStLGTJeD8mUg
MXgAWkaQZvIZJOFZVem7DkyTeMEpYK5Mk/zeSheDsYaMMnzsmOyFMkpRzGhnKPFQTJkm+RIExQaj
Iw/IsxVHrxAuDkoauySGzSVyZB3M7K1VbXgSVwE3cErwGSyZJEkcRNhw6SvOcn3gbJN9TEhee5JL
kxp3DEkHgmQjNUgbrXO8pyuGXgSpABw+SrwBhvAJi44gMZGO5DRszeG7gvjyHcgRrOB+e7gU7N4Y
H5dMc5h8zH8mSb6oSGCZMhiUpvkshu8J5CtwKF7wFJvrKzuYLiolsrrkxZJvuAw8L3AoCjkyXiCA
CYwXArI7N+eTwAC/JMsmzeL5yWHHcCsmSb7wPeHCA1kK1ZPdzgUjyeBTfcDbgBUVlMkGzUvJkm/P
helTCKkVze4RCLgXkB5PqvFGaQAK4GXgPJN+cjVgyZ8eSb5PuEtUgSWXAjqptMy3PcpSdMkizPI9
Z2ZRKTjxyZKtbhNeDCq5+UGSuOSmEjgrIYXIF4FrEgeQpEOgVWB6fnZzE6kCvBEsI4I5IYI5Y4+e
0crwm3chMxDM2yJ1yOM6I11IDIAIaQSYk5vGecZ5rMJTyH6ZA9ZybJDwniQJULbAyw5JZjjmQEnG
8N3BvJeG7yBeAcwdeHrynI0iTGYEci3ZEOjN5ABnDpeQ9RKqYLzgBEZnlRAkBSBcJJtyASBeF0wt
NckKOnbgFMAsF1nwQo9nPyHMGcOmkEKCsrC94buEZAfkoemUMvE95Tk+4XYZovBEnqnKQVBgtO6r
gJM0iT4VvEMskRiXbwmB4xDMaCBXOEnSc2ykgCgJeG5rHwOeQwZPY7w3lxl52lcGvA9471G8gK9g
EMOQPWAC+Su8XaoCBOyfNyae9Lg7lwxQJUfMnSYoTOoCAgIB4qKAb804F4zLzgCOXjI9MJeQwLaA
gIApyxU6TmiSMZl4ABloAzqDtFkB2TBkSECYgWZWbBK38+bksUnnIRz5CATmdC5A3hzXBDgM7Ms7
hccjmwKSdTCAgIGS8QSBLge5tw0gCJCRbwUbNE0DlPSlklu8QZHM5HcXcxkHG1EM28gkFlshHVAQ
CJUsLoGMy9qLj6ABR3LzpXBkOgD2bAWDw/JEoIbG9COVPm9k+a0+Y7PQniBwXDFDFDFDFDFDFDFD
FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFCwBACCQGCAC9gAEQqgj1BDsMQDhavroWoW/Qhbd9/WFsA
DCT6MKkKckVCpCpCo7C1DC+eoEBIA9QAIS731hUhUAAMAEMUMUMUMUMUMUMUMUMUMUMUMUMUMUMU
MUMUMUMUMUMUMUMUJoBhefQPCfCiAQTCbCeD4UfShUAHogiFv0IW3fb1hbBAgh2FoQRJbACHOG0G
AyFKFcJ9CGSGR0FAgCBHioBVALkfrx3YSn+aKgD/TC/1QyoE1QnnCwudx53HMoA1AbnPBQEGaeP7
8UVD6oIPAH/nz68j8mmznqdGSNE/58FowioIVFighUHtP8yjD8M4qGf/C5z//VQngsTnOhQDnhu0
mSqRTK8NigmVBGCx+C/z1VBBgF/4TH//h4qAg91QyoDjux3xlFQYfeZwWJ8T7VIplcbjk//BUFtw
PrglQycmJ8DjzR45xUMmr/t/zkMTwPnxVFR4GdJizu+sz7kZ6gZ8Nagt2/WRUFvvgtu7EnIfdMJu
Pv4UCaoZ+P9uSwJx7jQVAJ3f+7djvH/zSoZOrOGqfOdx5pf/+fngqRTQOKQJoZw985nMkfn5tyG3
oMdUUnNuP5mRUFPHQE45hVBfr4aZsxhj2OM+T4wR3ZL/VEGZNdUJZzEmQcx/eu7/xeLkkkkxeL//
89j+8cXJN4Z5Uimd6+B45w0M56zbc2fn5/+EHiY6op29HG0+lBT8f0xpmjobm/xUGTYQ+chkDj8/
/OZlUAKiL8zvgBHp6mh4KATwNDcfiogOPoONUQeB45z/+VAJtUAnzMfxlGmZxpmV4Y08fj/VGCoJ
VGH/nP9QOHgfh4KBz+Nf9VFaoTVFf7/nMb0xvHN+/GP/8f8HJ4KB4+j3PpQPZXyznllVQR/0mz81
DKzqgZ6DwHaJ4HcaOcNE7sya+ZOjPnRmTu15rWdxoZww8MZphmHizIxOLxckmLUEprqCXF/s6ogO
RUQTn3gj1NH/NE9T5OtUBnWfJx7NZjepja8yd2ZO7MmueKoUPvxPtUKHnoPs8lSLmfhUMqBJQZKh
neFUCZ8zcefG40M4fnRtmwR1H8dChI9Q7fHg/jOVBOczu3bmvA/vVQkZ9QJfn+fhzqA5UiZ9QHfW
EyWdzX/N/5LMqAj/oeB+ZJQSqA4dv9nFQQeufzRr/6os+tygDUE3/n86oDlAR/4RQU5JQHKgE0c/
0BzmZO3NKA405v/JKgxQJKA5QkGvn80aB958zTNPs0ufE0M4ZuJkUDvkoMlAdn80oDs1Ia+SPvHn
b/53H/+c8VARn5jRwX+qAzjOibKGJz/qkXJKA5QEbPX7wqgOPvdnzNNE0M4aKojPHxPvMtwv+ep9
f6oTVBqgdzn+fmcM76VFgGbs0fWSUJGEUB0vGfUByogVC6oIOauFVDPwfHgqC9HGJwWIzSog9FAd
mtqhszSoCUCKgc9MeoCTaPTJKgjbmjUPX/VBOSySpCPhUJqCxQZKiA9ODE/VAcqDMeqBP9UEbTuy
SgsUGW7EfBhm5n1Adwbv+qLN3gqCNuawQQn2ZXCoRzigDUDufmVFngoSDe+FAdnzcVECoI2nifig
sUGX+dvp0bQ8Y/g9FQRtPs+1QX6zH4ZWE3KBoyj+wmcUCSoL8vT9VBG3NYbBGaZplKA47VQRtzX6
Ym/aoIVBLlw87zEP2mJz/HnmJziYcDPXo6M/g85hVQp5GJ+qAM0TC/TE/A+x3KA49Mt9nb+qgjbm
lAnp/TXPxUI4XNKBY5EnkxP1UEbc0b6gOPf8hUMt48cy+JS2m4hUEKkUzVBkqCMafqoTPhUHn54f
ngqQlRAoE1AI1QZZI4j88JlQf8H6f3qoE1AJ4YnBTYJUEKCXBHQoHVQQfp+KghUWH54KhwzlA/t8
FAmoBP7CtUGSgOUGWLVBB+eCosP1UEH4oE1AJ4bVQRtM9UEeKgf/siZXioAz9Mo/PDIqANUEKixU
EKBNQCH54KhbBfygf25pUEH54YI8juP1QJqARUEZzNKifaqCD8+lBL4fyoP4wCgfPzwzJrqCU19J
6qgjEGUfioIVFmSVDX/htvgaJpqhI6VCQoAzKPXwyR+KixUEHqqCD8xBleG1UETfuCVHWGVCRomm
qKjB1/nQCT/zaoaVECgcPzwNA/VQlhtp3KhPOeCglO48Mea+racSosVBB+fu1UEH4qDPHw2qAjSo
DlBKoHcFnPBUWKEhUEH4qBFAR4bVQRtVDR+eCgyUFW3SoSFAcqO1QQejM0ce1UEH45o+BxnaoIVA
z4KADd/8KAVUWGb4qgg/FA74bVQQqCvDbnlA1kVRYqCMKYu1QWGV+4I7FQQqLFQQaSgyPzwVFmRU
DW392qgczsEqIjhVBG3NKCwwFQQqLDs8Dj2qgg/DK8MiqLFQR7ZdQNf6gOOxQS4jaoLFQRmsEfio
IVFnhtPtQB4bb4KixUJZxUEbTPUEp5nZ5icKgsMhUEH4oJfDaqCFQ7mjsObDKhJUWKgjOGftUDSg
y8NpxmuqCFRYqCM2oJT88FRYqEter5m3f/gqD80qCNptKBr+VBCosyR/epw7VQQfigy8FQkqLFQQ
cZx4bwyX+oMs1tUDSoIPjwPxUEKizJH98TYbb4KixUJZpUEbZlBkcfhkv9UWKBr8VBB+KDLw2qgj
cqGvBUG4ZUJKixUEKhT32qBpQO5xUJqgvFKghUWKgj8UGR+eCosVCWG2ndN4KDI484qCNpnqBo9T
sP3//5vBQCKBPgzA/qosVBCgZ8Drz7P8/c1tUDR2eH4oMtqgEUCc+CxPCgM5VBEGBx4H54Kiw/VA
Ht91QQfigyxvuqCNsygsNJUEKizw2maZ+1UEH4oMvA/VRYqCDhmUAaoIPzwUDvvtUFioINJQZH4q
CFRZtMAxVAHt8FRYfvqqCNpnqDLGqgg/PDaqLFBZ4qgg/FA74bVQRls0qCPNQBn6qLFQQAxdqgsM
o/PDbiVQQqLFQQaSgyPzwVFh+qAPbiFQQfmCO891QRtzSgsMBUEKizwyJhGftVBB+GV4H6qLFQQW
CUAaoIPzwUEuI2qCxUEZrBH4qCFRZkTCM9QWbfBUWbTNVBG0z1BKYaoIPzwyKoswNM6figl8NqoI
MU2lQQaCgs2qixUEGaZ+1QBqDI/PDI4tUEKixUEeyglPzwVFm1QWbc0qCD88NZnqgjabSgDxaoIV
FnhkTFm2qgg/FBl4bVRYqCDGNJQWKgg/PBQZZraoA1QRt8D8VBCosyP57qCzb4KizaZ6oI2zKDI0
lQQfnhkVRYoA8aqCD8UGXhtVBBhGeoE9d7U4oDlAyYvz+5LWqIDqzioXVGCoIPzwy+VVBB1f+48P
9QTYSb8zShs8fBQCZbBZs+s5nFQQfgZjJOQOvo8DwUAioLPo05sEqCMf44rLZv/M441RgaZ+eEx+
5VUL5w8FAIqCP/LKgndhMuZyoIVDXioJtuvjBHgoBFDZ4TbVAdMqBP/LKAM/Np0fDf9UEZ1b6eH1
hFQQoSD8VBCosmyJiqCzb4Hh9nbnKmmoDlBkaSoIPzwmVFioF0qgg/DqzHhtVBCoSzSoIMBQWfio
fy50qAPgysFk5ZsyqCFRYqCFRYfngdeI/FBZtxCoIPzBZo8saeqgIVBCos8D99TP2qgg/Mydnh+K
Bw0DwMhQWKgg/PBQSmuqDDFVBCoNzJ+KghUWH76meoLNvgbXjNtMnPGaoJTDVBB+eB+qizHmGqGj
8MnK+G1UEe5tKgg0FBZNj9qgOPVQEKDI/PA/dSoIVFioIzJ2H54KBw0JlBZtzRr68EoGzQ8FAtgc
duPzEKA3JHQqIFRDhz8mOg+/H1UEOa6Nv/glQYqAFRqYJieGk1MEoJcT/qio+FQyqC1Allt/BlH3
0bdu3oDtOzoDt46AhisfHId2dz84eM6Cam/bm+BPZ2dTAAH///////////QqACXkAAAAf76jPxH/
/////////////////////yHfrVBGfDt6G/Ac3xv25vgIeEGioAfwwFAE6oK/f/6M3JaT/3bj8ySo
rP0/MnlT8yWXUB0/qdE+3/2qg9QQ4LOZP4P6Dk9cFNN0eHhifChpnmZ0yoNMdu5QJKiD9NDxzkuE
PXxNFQBmKauZUAqgFUBx9YL/wWJ/8h+bf/oPxUV5VUEKAdUAqg7JGh4z+p0f//nOhUMqCHBY40j3
VECgOzmc/8x/n5/zH+oHP9QBqEjJYJUM4JUFqhlQBn5mtp/YnBeuJOTwPH/bnP85DOyW7/UBzf/A
//hksKoA/9QTHrP0f//gsefxomF6//6d3hhK//hgT58TOVBf1kegIdqgmwnr4YLJKAPC7Q7dphGj
u/zqzh3fpz/nH5nFAd4Zzd4KAPC7Q7dphGiqC/XwPE7v05/zjLHcZ+c//CDX4OKRURqkX/3f/+qQ
j4OI7fzObjuVCec8P5UWKBLCHFt4UHtJsIaCoQ6Og/OjoVBCofVECgOy+3j8DwffjmQ7Q8GUaCgm
PXftzl7UzowWPVIqgO4vaozikvamb2qgJoZxUMmVxe1TXtUZx6L2qO9qm4xOC/zky35t4wLcL/9G
0O00VAH+mFtOf84wJ3KCU+f411QH0Kh1UiqidQSnn+GL0B+lSIZOE5yU22Mdj+L2qzDIxIxkjiUA
CoJPhQFG2qDVRIbaoPVECoZOs2zowKgNM7g6TXzx6/qogVDJnGCqKz+UByoZVAH+caghPdQDm2oG
plQ4oAVQkfp3HwcZnHYqIzOwp8Kg1QQnV1Hj/m2qMfvwM5UAm2dOcyioZUBqoMVAZnGcqMcsbZ8q
jg9Tq8FQmqCzeUBSo4VBhtqiI6MkcRnKg1URG34KjNUVqBo6M8qBlRWYKoUPpQFKBlUGKgNQFH4e
p1Kgs21RHlPA2FQSqB1AeqDFQCqI1QGYJ2qjVQHGcdCoONtUE5QP54KgVUEqBpQD5xQfKjg6ehUk
4vBqBY3vhUD4RQEHwqCcIqAVQYoCDbVAaojUBSokVBptqApQa4E6FBrlFQSZyoHO021Q+aHQbZtm
2qH1QWbao1OhQTGcqDlQKa+eVEptm2oLvA9c3jDCxaofzigaM4zlAaqBlRXi8d7GCdU2FNtQCqAu
PTjwMHEqhJUZmwoDzBPlUJKBpQHqAhQFHiqIMKbJnG3l1SSoC1BooA1COqITnUAqgPNs21RwqOFB
8oPlB8oPlRwqODONtQEG2qCVRwoPlA5rxB65xQHmCoDjOVD+cwWrF45UDKis2/DUoFzqm9jA4xOb
9FBqoLFA4qWDsMXF47xPpUJYI8VQCoHFAV64HIKkno+DF99bdKgPVD/l0eSofNtQAqhLM4XMqhIw
VAcZxtqi9UOKAhUOKi821AKqMTLxhlqjHwNlQLqDXKEapZQzjbVCR7qC491QkoLDRUAWXUBuXUAR
nH4qUTbVKJ+HcSoiNtURF0eGmZQNTaT6VDhnKhw+lBCbf+fqgaP3/yRrnVhTgVGagIVGZwKgY6DO
OhUDKCFQFqkk5FBmcipJVB6oHwyoHVB6hDUAZ8Kg9QhqjU+FRwqIVCOqOFRwoPlB8qOD7NE+1Rwd
yor8ujyVFagKUBR1Kg821QedR4nmoDTzPFQFKBhUCHeoDzvVAipJVAyghVAypJUBagXPE/FAUfh4
/xzqApUMHqoGVBqqAfs5DowmLVEWEUA6oiPM21Q/nFADhVAQbaoMVGKgFOM6lAfi8WqB1QWoBcYa
pnKg86lAQeKoMUAqgPOrCfaoDNtQXGJhFQThMIfCoNM5UAHiZxtm2ZyoNVFZtqiQ4FBcYJ94Tjgy
jOUEJ1YQ8VAObaoePg21RAqCzbUDRr55UVm2qDVRAYOEVC52YTwMEzlBCqODxwipYVCRnGCfX3hD
qUBagzwyhDbhDNUIbTpUKao6VD6gDUIahHUH2WNU5MJhDxwh4qD40TOUBSoiVHBnKgBURG2ZyozV
FagaP07FAUbagNUBRxqhL1/PQ2z1MHPKitQMKA/D68IfiokwigHOxUPmcdh5qBdQFKApQMqgk6Tb
VER2G2oDVQFljOyKoGUCmMPhUL6cAbZ4nsYJ1Kg3CKgxUF4TCKhI7DeyTqis6FBqechsGL7KgNUG
f3R5KiDCH3P8HifyoFVCSog14RQD5Izs9P8KjE6jbNUzjBzh5qA1UHnIoAMkzw8MIoU1REqIjOz0
/QZxynIbZxkYmVwhnKgtUZG2dRt+GenPvJGDi1AUaB/nAZyodyygaNs6vA6lSiZ2EwmV8s9P8KC7
8OQ28oqIMKoCMXxPxks9P8H4bCgPNtQAqjFUGm2cPsoBfTKfZsGqOvPTn2dHkZqgUUCmEy+enPvw
8MJi1QKffPtgvbwVDP/NhFAvg/PK4b9VCyo4wur2wPRnDpUCRq+HgqIFQedaoZ8MJq0nrnsjicJj
fDPTn3zNrUA6guODPn2dp9YTw8M9OfeQwigawvscJ6qgtUFmSUuWUEJ6qgI5DeN071AaeaoBUFxg
qBqTOKABUHqhw5jk0mcoLjBVCSoBME71AKoD1QeqHDBVAaoMUD4FBCfeFVDuWUEJ3qC7PHUoLjBM
zGZycwVQeqHFA4bX6chtnJkVBCoLjBOo71BCoLlQeqHDBnzxm9CghObOKBw4vZQDmcd/soLjBNoz
s8dSghVB6ocUFxgnT5KBzOTn2oIVBcYPkdyhBO9UHqhxQQ/RgGFPnlBcqBT7MFQOKgFQXKgrOKC4
wVBCaJ9mifKoiUEJ9KjFQXZ46jOM42zonME7FSwoNDAOozvbd4GcoLjqOhURKCFQXH0qMTBnzxt5
XC/p0KDQ7FSwoGt8uF88BTX0Gd5KhJQXGCqH1QyoNDon6FAaZ3gfZ0qAfWaPRlTNOpQQqC7Kz55Q
XH0qMzBUDiorVIptn3m8KZxgnUdSghUFyoiVFZgz55QEGcoLjBORUBKBxUinUbaoWUEOSYbfhPnl
BcqHlQeYI5nqN74Oo2zb4UAB1NVHSghUF2WMGfPepgqAjk4TaOrPKBTfP+eygSAoDc8dSghOk5FB
cYJ1G0cM+VUBCgfxnl8KE7PTn3+H8oITqUBpg+E+eUF3sYJtHVnlB2chwmAbagNPvbP+KCFUC+Sg
uzx1GCoCPkzjonME6lBooA89P0H2FQGjh934qIVBCoLj7MGfPKCc+1Aac50KDQ6s8oA+ic4TkMFQ
EKBQ0c8dSgh6D7UFxgnUoNADmvU2zb+P/DZ6ehwnEoITqM5QCqA/onzyguOQwVBodWeUAB5nR4Gc
bZyH3OcKgh+vhQXZ46jOUAuANs6JzBOpQaKAXPTnscn14GcbZ1HCdyghUFxyGDPnjbM7wVAR0KDQ
6s8oEszOcOWM5QGmwoD88dSgh2nIoLjBOpQaHRP0G34HJpwmen6DhP1QGneZxtm34KhxUHsmwRhn
Vnje+DqUACgINs7z7nOFQGmD5HIoCFQ4qDzOws3GDUKeeOpQQ534UFxgnUoLFQ7PmVBCoLjkPRQT
Z6c9jlVFaghOowTNUCnRPnlBcchgqCw6s8oNFRWqHVBCoLjBy2ZnOVQQqgI5FBdnjqM1QQb1Q7OY
J1KCw1c9P0HJmlBCoLjBM06jlVHSghUF2WMGfPKFo+1BCeCodUFh1Z5QBb5zl9lBcYJmqEfPHUoI
TpORQXGCdSgsVDs+1QQqC7yPdQeZ6c+zlP5QQnUYJtKDbonzygu9jBUFh1Z5QUqhNUOqCFQXGCfe
2c5VBCqBfJQXZ46jaUG3R+TmCdRmqEPPT9B9nwoIVBcYJtHVvrrUFx9mDPnlATRQQqh/8M06s8oQ
+idUOnIoLjBNpQZ546lBCdR9qC4wTqM38nPtQQqC74VA6gWz09FQ6qEFBCdRgm0oOD2nzyguOQwT
NOrPKEBUV/ighUFxgnIfc6odUEJ8fCguzx1G0oRsz+TmCdRmqEXPTnscioCUEKguME2jqVDqodUE
KguOQwZ88oB+jnwwxvG+qFsbp8FAB7GcdhKCFQXGCeB9KCH2Ns2zgNtUFqg1QPqAU+/jOGCqHDuw
qoDOwzs4oIVBd8KB9UcRi5MJ4HAqHDYzZlqAoCghVESozUB53KgM258cRlqC4wVA+oGD6OwzjgVD
ighNs7jrNtUGnhjFBCZ2cVBeLk9sKcCoc+DBUD+JNtUJKiIzju+1AD65PSqCcooIcfHgfCoNUEJ1
KC7PHUoHzF3qg+cwTgVBJj4Q8zLNs5DpUEKguMFQPnV+nyoIVBcqGFQYYM+eUD59qCE/lQeoGjjP
AwDOVBZ1aTK81A+oDM8dSghOpQXGCep9KBpUHz7VBCoLvJUCmVvOpUVqCE6jBUFigk6J88oLlQac
hgqBpUJKh9QDqiFUHqCFQXGCfZoqkU31BDsONQXZ46lBYoJOg5ZzBVDCoLUD6gIVHGa8D7PhQQqC
4wVBYdR35wzlBcqOD6MGfPGvRQQqh85VA/rUBBtnUqKzkUFxgqCxQQ546lBCqDTkUFxgqhJUPqB8
5Zz7yFMkdyof8jOVA6oZNtQAn0qGTOONUJHSqGVBcqEjjUBWSPjqyHgoCDbVBioOUAZxn4axgqkV
UY4U+1QGbagaPNUAmx9qBbCcHUcOFUBGLxfgYOLNHwMHF8eBg4uyuLxEvnhtRi6cUAwfPE0wmLNT
2MHFmJ4KCFQNYvF4TCGjisIanGExZq+xgYrhQCqCE/P9QBHyfChINs+D+M4+TnNs21ACZ2XVDKgu
VB59KAEzjwzxnHwcZnZUwVAQqAerC5xUHmCoBTxPpQHqgxUJG2Z3gqQlQGYP+qWFAljFQlmmnqqJ
PvyO5UPqgs7lQAdCoiVGaoP+1AkaefOJQAG3m1AUbaoMVAZtqhZUVqAg2zOUF2XPpQQ9BoexnKh9
UFmcfBxm2cJnGcdHVhVQ+qJVA0oAM9nDOyioMNtQXG2baojVCRtqiA6lAbhVQCqDDYVALFACbagI
UAqoDVBigPVAaojMFQHZRUEmdlFRHjDONs288qCTbVA50eBnHSqIDbVBZ1GcoCDbM5UGKjhQCqg8
61AebaoZPXwYqAzb8FQOqBVQTnDYPhUE+BhYvFqgtUGqA8wcKZyogOnF4vF4s61QebZtqCYzj1VD
JiYWTC5zPeBnG34KiA6cXi8XizrVB5sKA8wVAceqoZMTCyGEqDVQoZxt+CgSPszsaYZ5nqbZtm2b
ecPPEY7CmCqJD1UBpneCgsOr79DPxch4/6gcwSofPDwML++fnWcaoSzx4YuTC4tUFn4qC1Qxi8Xi
5DqVD6oLOrC4swTGVBio4PXPSY0w8WqH84qATqkxRi+yoDVBmUVEZi4XFyKgdUEnSdBj4vF4tUHq
iBUMnXizEwsioHPU+1QLgs9lfmXKHifYcdi/Awj4VBKoYVBuLND2xZ4qiufi0+4BT7gEWn2CSfYJ
KhA4t50nFijXzB4muqAj6P8+DXzft0GXOdhknNnf0+j/MvHn0cWFP9URqgQ4jLOLFGvrYqKvFUCZ
syzsOIyz9Ocy8GfWYMvO5hUCGuqEFQDrMs7jXOw5zsP/oO46TLMvwOQ1zxVBf/jdf4qCejFKgs7j
Xz+b+vwy8wqIzX1nOfWvNgOVUL4/Jnnr/DuOnFZj/xuWNc7js1687nzLO47juOnHnFm8KZebVBpr
507PodeROkH50azpOf9PXDfR69GtUJIwagDOI6cGdx3KAM1zpO7WeOYNfWH2zYTszpl584jXPjCq
Bs1zXNc+Npr5vN4My1QbkTJOZUAmua5r6//no88SfBz6zLMvozoMTJ64/O/6gzNfB436wvGvH8Kg
RUG6zLx54qgTWZeDzBxAweDMs09nZ1MAAf//////////9CoAJeUAAABugTnaEf//////////////
////////XPE9TQxGTCqBszgzLNc1zpOnXr16zpOkyzXwfQdJ069cpf/QZePwplnwc/RqxMmdAa+t
QQYPO//qYAOPrCh16zuP3B4mTg81QJ6HEd2vMavw9j1OdUEs2S9BrmWfG1QN7T4NfxCeeDPMOPwp
lmvljzUAZ55Y18GqEDB6DBVCGs0MGE7KjU7DLNdUCHEa5xKgTXiDSP/oP80jL8TzNc8/Ey82qIzX
VEebUDevFM1sxR5qioy1RUeZlmuqBM3rzaoEOQyVQbgzuVBqgDVBp3HOcplnKc8hoHqcuPOU9WKh
JUAqhJm/J5Rm/N5Q6VQME6Tp16zp34jedJlnZtUDe07NeKzqoCNdUBZ04jz6DzOLMAOI4DLOA4j1
OeQ5z1NDB5nMYrMZno0a/r//AndkTkzeDxORPAKojPg1z4OfxwagDNc7vzBnFnTLxOJ8ctg+gTLP
M8VAHhN+DMvOnhkVQua5r9B4HSeB4HFmDLyeEMs1zXMvMH0a54nca5ybzw+eODLMvOnhhAmvnziN
c+lQSa+syQH0a+Y2HIeByH6eGvHmXJvwh4HcqBDLOQ88ieGdNDHqgHfOeCoq3znYYn8fGT3h1/h4
HIeB4YQ8MJrxBl61RHvMvJqiM1zLOc+tebP3FGv0Zg4lQJsp6mv/nIA+gGWIDwzB0ngE/T4Ms/VQ
Dg8Vr/M6dhr58/TX6Nf4ZeUzoeg4jz0e5r4TLHJncweB05Y8DwCqBuj7CqF82E+A68H6nSd3p7bT
6PA1z434TIqhBUCH1mDwD+GWfR8KCdUIZ01xMs5DnPjo/zk3/hZXKngYiojyJln0fCgzMthyGucW
bCE8Mxlj1NfOmvrPo+DX9MfidchznAZen81mvndedPPMHgeAdp9HwoJzX/zkNc/T6wagDxPE/H4f
R8KCfMazLNfxVCGYNc+M7g3HI6zwyOWPo+DXPPaqKjpOQ8Ps+j4NfK5XB4k6d/76YH/yvQqBCPA8
InwXj8HcqC9Gn3+GnOdmIPDK5U+lQEfB/5XB6cdnQfnRhOcqfR8Gvz+ZUJrnAdhrnYd3zlcqfR8G
vOeGvB+hwHdltvt8ZBP8mX/znJ0e2W6D4O418frCc+9UIHnqOT8wZr49UCHdj8tgzLVCB5486Tu3
5My9+D9Pwy8sa59Z018eoLOg4j4x6oQPPoVAPwcms5D9Ms18fncsZZrqhA88efB9Z1QBmWqJji6D
xzp69GWzpr4/I9B9Z0y1QgeZr487NvQcR8GuZZr4/aqIZssqEDzMvo6FBOfB9GucW/H9B3ZhULnE
a+PkxG/EHjnzLPNUIGufWdMtQZmueZ8Y8/TuxB053ozp7azLNfO5vPmWa55qhDHnwfRrqBvBniee
IP07gTc4Tz99Wf/1A3tVAhr48+OjEHmfCgz6DL17zn/MxiPr8wmdMs11A2fB9GueZz4/oPr8172Y
My8fnc6ZZr5E+sefB9KANQZmvjzkzfR+Z3WcRl/jDXUH58H0a55qgLHjm+jWeprmvxvzs/8ZZr/m
PPg+jXx6gDVBx8ZHOn0dJrnx/53J5PoPrOmWdhyGvj87kT4PhQNqAMxOjaqCQH0fBr/6oVMvO9GP
UH58H0a+dx+Rzp9fh/nwdOvo3qBQ+P8y1QhtNc+s7j1AHheg8z4x+dxGTPo+FAHv46MLhN3+qBjL
Nffjz4Pr0NfozJ54jOn1k1AGfB8HJj1AGHEH1nTL/d5r4/O4j4+8R6mua+s81QCfR8GufB4mXnTL
wZlqDM+D6Nc5MfiM6fW/9PPWZZrnIa58HwZaoL1mufWdMvBqCc1zzPjH53EZ8+j4x5ycazLNfOnw
cplmucmPPg+jXUGevWeeIzp9Yg1z4Pj8Mvo1mWfWdMv9OQ18fncQeZ8KDM19Zyfp6n0fCgDPjf0Z
YyzXNfWeaoQrP5HrnT66NZ3b1AGa+WNc+D46MecpyKAM81QgZeDLg9TEPrOmWdOs18fnTQ0nwa5l
mucnRnz6PjHsOwy87j86dKgDPg+jXOTHmhnT6xANJlmvj/w1z4YZeUOQ1z6zudzpr6T4x+dNA9T6
PhQBnJlDLNfH53Os/jLNf8x58H16GuZZ+6TQzp9HSa58Mzpr4/OhPrOmWdhyGvj86aGk+FAoZZr7
T4AfR8GuxUKmXncfkcmoAz4Po187jzQzp9fh3aTLNfH71AofDDLVCG01z6zuRyagD/z4x+dzu8+j
4UAe/KGWa+PyOdAdUhr78efB9KgE1zLPj/zudPreoAz40nIa+PyO8+s6ZfRvNfH53O/58GuZZr61
Qkep9Hwa+k4DLzuPyOfx58H0a5yY/O50+ug7P8yzXx5yGufGkyz61mufWdyOINf/PjH53O5M+j4x
5yZQyzXx+RzunKGWa5yY8+D6PVQB861QD0YU4ufzXvzplqgaplmvjz1PMy86a5rnca6oJzG/Pmvv
ODHnmcuDVCR+mWc5lmuoD96oL+sSHB6zuPPX9GCe+TMtURnOZZyqhI193NTBNfH7wHmqBjLO48zL
Nc5T4NfMHr0GWoMzgVBOJD64M7jz34/eqDdaoEyJlnL+ePp8ac6dhl6qSazizBl501z6zu9UAmv/
nxjzuyxrnqqATB1nIdhlmvj9+dzp4mWa4qgvHnwfX8a5lqhX/1nEep09GWxv57+W85D6zpl5018e
qCzz1/58KBQyzX2qhAdmdPoy87jzQyagDPg+jXzCovx+tUCHx+Kgb/Ms18fvxAcKZYnma59Z00Mm
oA2Hxjz927zrVBZwGvvyhlmvjzQzuWOdQNmuqCzzx58H0qATXMs+Gb8wdevOn0chr480N59Z0y8w
qLzXx6oEPjew+DX/9/oZZ8bTL2qiE1/E8z/Ms4gnYf5rqgQ4teKOz/1qAM1zuOI3DizCgDx/4qEM
HvOk1wHwd2vIjg+MacGDUAeJxOvH4mXXj8Txrx+JbicLo9GfXlqxPGvzxFMHicT64/E9Gsy9eJxO
DwevE4PE8YPE4n0x+K4z5lqhfLZP/VC+PNc4jiMs8VQ8a5r+Jln/0GueZ5+JlnqAyzsOIy1AHj1A
Gd2DOc88fgz2O4yzuVAhrmXrPo6ceqBDux/QqBDl3HcdOR2mWfG0yznzefOdUBfmTCqBDi3mv9Yo
1zuOk1z8AoAzXMs1z/PMyzLwpsmWfG0yzsOI1zXMsy83gz4VAOveA5zLOxUFmua5rmuc6oENc+s7
0YM7ju1ndnfE11AHgzpO4yzpO7H4U7M6ZZ2Hd0GWa5rgzpr5/N6zLOw+jXVBOdMtQBmuZZ3KgvBq
gI+DLNc/87rO7Nmvrz+ROno1nEdOswMVilQTmDLx+DMs+jsxWKxWKPhUBGua+DMvOn/0YSTCHODW
ZZr6z6OzFYrFYo+FQFrMvH4XOn/0YSSfJ4kyzX1qAg98X0eaoB/zXNc1zXOc+BDhPA6c70GXr153
I9GExUmYVAmv0PhUJeBgKArt7VBYcQQHripMHistmNo4nE4njGnwqCc7hMV4YQ7lQX/g46PPEnwc
53Y3jjB+p0ncdh3eGDxPGfzp2ZswcTicSqAj6P8+MT0YPjP53fkVAQoGVAR2mqdmY38b+NePOI6T
9zGJ1+uJPZULz8BKUp6ElSX4y32oGPHf9fwcudRzfJ05fBqhtUAHT5nKcpze/BzZ46fU7VQDnvnI
7TPVBmEyuXzpu1O3nCGSqB8dmztUBO7F+P8qDDFP/bl//J+p0mHlzlyv38qgD5VAp09h08/Wg5TS
Pf1zKoRP0cv85fbjMhhsv/bcv6mEdp/YM5sVlv0BmnZm/lUC79JpHvt+st9+qoF59+j5MPLKgX1O
vLZ46cHpy/P3qyPr/nmqIcqdJjqg/zwGvCeCgEUCH7P0fHioGOgw/n4+lQLljsD/fR2ZxUN4POff
Ob9zr+s9g8hl/r6OdUI5fLYM7Dp0/5ynMc+Xy59eppHJnOZs9lT+Ok6fvUdvzlPnownOM+jz+dao
h0dExweeaVAvR66PPL+J25GTdiz4zeXNTWoAVQBsNM8zBPPo+suqD1QeY5jmOY6oPVB+Xy52qgE8
1QeY/j55g0jp6PXPHTnsrp2/OU1Hbl/VQLZ3Cc/PRoz6gNVEOc9vEJ29Acp9mbzi5MHkcj6bDE1m
OoCPjMefJ2dGe/Z/3PfR28//R/8+ueOnLmUqJvhUTGVtPP/P4yT+//UyM7nPtQOH8oHPs6cuqGsI
fWEVDXsoAc4oAlQAoAs5l1BLTbRQS4Q5tuX2nNP6qio3T+N1UVelTpr6KgzL7cJncJtzJynv0ZnN
fGazOQE6RyEigB14fO4fW8887qADYcB+KAQ+DgVB55mmqD1QeY5jqg9UGKAFUGKg/CfP9P/fJ2Dh
Dqy51YSTzO7zkyPsfU3RMfWvISZDWoAc6a2nfpNb1qdmo0s3nDDyZ4YP7mNv7+NuJ+s9lTt6Pjb8
/55449+ib5zu08zJP46cGc/xj/g8+g9/vJ4XLn1nsYoGPvGeP9m64/L7cvmyO3LhzJ9CqDMZLozh
0qgzCfePjLm74/RzKhHL505TmO3L/2THGazt++iY6ZMfj8YHnLiZuTxh7qAHOzqADz+8GoBPM4Jp
87sUAhpmOcGJPDGfePxmPMdQA5s7NuPy9duXOkwjtzuEO0cud2Rx3PzkdmXNITmO326PTF4zTX7+
Dtzx0naZud3nZm+Tly+3D5dUAG2cB04/UcRk+KgGlB9Y/6E9/7Gbdv3jOTYP1o/ODzmJ0qgXo0Kg
X5yJif2WxhjZb6x7VQWqGst5/fGAzZq5Yxs5hMuf2bE28SqABPBUJYAHpPjFQztNvLmrlvHNieH0
qEjmUDJq/eM2ntlzF+vU1csY2ZmmOzG4HwOnEnBndpi+p7088Z9mr/GrltJ9CeGXxGW6PibRt0YA
1ctXSqBejadv//fWBwh54L0yaoFxIzmrljGMH1wagEN3GYY1csY0/p9/P6qDOJtnR6f22f7znGS1
9HwoC8ZrJZlxypyqhTE+k5zHUdPz6ZKfT7nNgP3JHNOauWMabmeD68D6MYsDL6TmrljGyuMP7JLD
B9NqoRzGnVnVQYaXmeB++hiKgDE4U+vX00m2qElQqqJug8N5xn16+eF/TEPPoVCqom9VQL84PhUG
KgzF4g4FQYYh9GqYp9evyZPplvVUKqibSYfQeCgNPCZUGH16mKYioMPpUKqib1yxq4JQbqgzx9NO
AwmCN4xMIfXrwbxqmKqDFQqqJj69cf66fTLGMqDD69fXEHeYioVVEyoM8MkcOWNU+v5UGeunC4LK
+h9esigBVBigB0bVQZ0f59GqYub/8uYOW9TtCqAMse5vYQ0vXNn0YuM2qgw+uj/9csau018WoAjB
VAB2hVEP1oyXQBnsR5/yoaPr1z38qADBy3iqADp9VQZ55XzUAP9U4zFVBh9GvljVPozTC9cEdvuo
DVQYOLOn1MU91QYfRtnb65Y1fj/Pr1PAGC9z3UBqgZVBmA4ObEZY1T6N46vVQA59QIfuJ+svo+zF
851QYfRweuWNXZ6/Bs4HgxTVMNQU5YcJo4O81TFVBhwHgfXqYvGByxr/CoCMn1UBGeNXLGMP4qDD
FO/1xGWNU+sJ68GKapiYHA6FAad6oMUFeWFUGP6n0api+vxjDeMHLepiqgDYauWUG6oMxx3+NJRP
NUGH0qDPXLGqqDzGO8wTBVABimrsUG+WwJ4evxOoATVMVUGGIqDD69TFVAHttwGz6y/6bc5q5ZQd
YEyFQYYubPPoxmWNU+jw9VQAYpq/eOMH1zeXPAxstgVQYoAf0+jVMXNnmY20wct6mKqAJzVyxmHh
jvXN5cxcCYioT2dnUwAB///////////0KgAl5gAAAFxbo9oR//////////////////////8w+jw9
csav1/+ptmCqADFNVUKKBTLYE4DpVACoF9TVMVUGGIeB9epiqgAwct47fU8MdsNXLKDfAqAE7zEy
+X2+qomVCuj9m0GKaqgQ/cRnQZcxDGy2BO/1MQ8PhUTKhXdi59GyY1TEVBZkfp9epinnicsoFFQY
fR4f5gmrljME4FQYYvrglAIoN8sap9Hh6nmYpqnNLiVQYfXqcCgUywqgw4DwPo1TFwRpKCnE5b1M
U8zANXLKDc8P9UGH164IxRnVBh9HB65Y1f8xlQZ0Yk8zFNX2UFOWHCH164I0zVMVUGHAeB9epinn
icsoK1QYfXr5nmauWMYfxUGGL68GqoN8sap9YT1PMxTV9zixKoMPr1VBigrywqgx/U+jVMXg1VBu
OW9TFwSgENXLKDdUGHAqDD69eDF6Pk4D6VBnrljVNZQdKgzOjgjFNVQCKDfLYk8D69eDONUxVQZ/
qgw+vUxcEOWMZUGH1+zqAQ1csoOsT+KgwxfXg1jMyxqn0eHrgjFNU3TgFUGH16ngY2WxKoMl/T6N
UxeMioFBy3qYuCUAhq5YzDwOBUGH168GLif9UGH0eHrljVNVQbzec6gQOJQM/m/zVCWUOk2FA4qD
D69cL6KgzKZf6zOXVCP9g9hjfR7+qomri8VhzpyqoMPoxsGcudm0dnrmVRMqBVAafxcKgzaYXrXF
ZfecygcP4+vXBqg30Ng6cyqJlQZl64z6/sKZKoM/z3VCPzo0YvMqib69cHVQG8m3l6/52/OO/eft
UGZ3pm9fH+VBh7n0api4P/UFI5b1zKocNrYZx/KA08DgVBh9euDMVQMaFQYfWf6PXLGqqGjGVBn4
PoZ+FyxvbT31//Rg/81TFVBhin16mN0eg5ZQVqgw+vVzu+sIdqoMMX1PMwFBvljVPovH19FQ1nsq
eYqgw+vVUGKAHGnEqDFAeap9GqYp5mAoNxy3rllQjg6nKcag7VBhwKgw+vU8zFMRUEnmfRy+nrlj
VMFQdKgzOjg/OqgNwh2ngfXqeeJNUxVQYXifXqqGs9gxyxjZamZwme/c2oBefo7ejPZvHcqAL+Pr
nHHYoC1QPi+j4y/zgWfenN+vvnMWqDFQLl1RDiTDVAuTyH3oPcxuj4+fnom+Tl6JvnR0TTCEf6bb
typwfE2jOSbAffzmtE00/mqDM7N89gds3ZmtH385rRNNoOQ2/XFZE0lBdmsv4qgHN6De+vo7c2oA
v4+tPodubwpzblQPjtygJy/xhcXldP6ee7A9Hz57ez1ORUC+u0JyGTyZe/0rk/7CZ5UImSqEMZtM
I6v89TAMrLfZyqA0cv8qgXLyHb8ZfsPpQBeioMVG+DymbzyoR3KgfHZc2zp7MHiznOc/lQkc2VOn
76MufWX2qAlUNZc5j3+8WYfyqBTDYdpzfB5qgX56FQLlvXPffJ0/eWMnN/WXObnL+5z+ubOU5suq
EcJu6Mvl/nLnmdR09GX+ff1OfNZf19/88zpVAvioGOiab5VCP90euLzZzHL8zfPydJ1fWXOw6ff5
z2S0ZLKnN6nT9epzHL8zfPydJ1KgXo9c97/OeyWj4zM505f1dUGAznJmmll/rL5c28TnTmyWXr7q
gA6fX2MXJ4I4/nQf+3xxeeLo6DtVBhn8nNhfnRkptulUI5ab5m0HvnlQjhPv5y/R85c0jm0ZzmbP
ZUwz30HB0aFQL8/eW/Ml86Pfk5Tn6Pmb5Oo5vk6fnPZLR7+6oM//ZQAn+qHTZMtUGY5pidE3ioGM
//TZTZ87stt0WcOSOHFQieewyT+xoDiUEGs2AqHw+daoDUBSgG6FROqBTJUDaob/w9HRv5PQ2lD4
caoWxExtems8z4NM1VECfXQYqoUmObb0eh2nFN6KBpQNqhbWYCgp19B+a1QKqM1ROofFANmsr0G+
YgMthOjG6z4/fTDYvNayVEXNPw4jd1689yfSoDNpQEe+9QLnhiDOzWVxqon6MacgFDWqJ9ZoHyYR
l5o/FDXld6oIUBRtdCoDN/WfKon8MVrP5QmGSchlgg+cQoDY5wxv61Bn7+h/GT7/+a9AZVQ14hQQ
HEDEZhQFKgPMKic+ZjCVBAJlRLk9YAYNUI61AUqAzu6DfP4yVA3969YNfQYcvoMyozPro6D/ULSo
F4wHIOTr9AG4oDVQQoFON8uF1mOaBl78trUEBiGJmD+Nr06Jtag4UBuBNpUB4HwVBRuGWDXEAAAE
R+azENxQmQBQJa9XQZZl7za6JlRn5bOMQoWlQLr1ljeTr5BwA8FApmP5QJfRzYMsPIeCiBwZ/KCV
QEZjom/lAaoDFBj7+usCgEMuZUC+CoFmAaqg9VBGTVBCg93m10az9OP0OM/Qm4YBuGWbhgayxuYV
E6gnMlQTqifo15I2gG1kv4yehQcKAZQcdH4qH9odqofyZym7rN05c1rUB58H0fCgPUDJp9BpqBmb
WqFj6PM+lQsb5kqELJqhQx/Qx1QofKgI6FAQfOTwKgNzZ05tQGqhtQZ59QZqhvyVAagiUC2z7UEU
eGBiAAhQFGSoCoyagbVGOaVGKgbxGGVEBsazYVEB/KAHBqAE/swoGVCkoAzLUAahSUBp85M+VAbg
caYionxqonMTXhsQbXQZ2YPxQEKBZUB1FUVnmbRuqGgEyozNXJ+gc1mjcVCiggMseMachuGWZPR/
KiL03qjU3DLUEB5qAgxNYDANoTzNo/jimVB+/8DrmUBfOtQQKhQBzqAo2vHjJdEyogPPeaev2P4A
f3WeZkm1zrOJQKHObR1nMee+Xoyaoa3m19KIH8Oc8FAQbSggwJ05/y3nmYWzeoC1A8oNGqgPZgQK
AydQLG0ee82t4DJmxBuqhr8VB5u6+jPcnmfRzYbXg8wqFFEDh8Xzr6DnNrlQMmX91NpUTkeZtHNN
0HNn8bjcQZx8qgXWShc1qAYyVAZ0a1C0oEjLP72prBvyZzqCA4jaO05DzNpQe5P0YswyoDzCho1m
hg+crmsYfSoxUFhtb1QUoPd555fJKCzEbjJlmMlUFb8SqINZkzHOoJ1DQoBsEoFjal4xWXNo/DdV
Ff4ZKoK6JlAyoFgZE5d5hHmYRybtfoDWZKoK3+ko4jSdxydChaUBh5h9Nagg2nEbR5mEqMTJVBX8
BQYqBbXvUFmT9B4xHEpkqgreqJzQMsJqmAcQFAFjTcweGUBBoT6MuZKoK3qJL0MIwpDaAZKoK35f
FV4M9QFHNsBkcUZyoWwR5qAv0xG8/sKqDlBHg+jj3VGaoFx8+Ky4TYPlQ+YroL9VDZtS4boxWXMl
UFbzc8csaYDkO3eoFVAN/YrLmSqCt5nG0fXQdZ8nIqERbgjLm6D6UC3pgVROoBlDQqAwb8/rUE5t
eBx6VAt6VBv1qgPeqJzcMvwOPflc0f3pMoCvRQDKAyZUTgMn0BvMQy1BKqCt/gcZ14HGqBY2lAsb
UwN/oqJ5geBx71QUZMxnTeSglOv5xuNNVUT40G8BqmT6TeBxg3qD30OtQSqgrfMDf6KFpQLqifwO
OZ/X+VBRkgzigK3nWqAwNUEoN+TMlQFGTlimyhgAMn0mm1qJJUFbzm+ja3qCA1cac2uYHoqIimBl
DA3qgoyQ5P0UECiSNo5voycPL0ALd7eeaVGOSBvmM42lEkqCuhQDdGtQFHycmIMk6zYr6TAyaoKM
kB4Z7eeXJ2G0oClCT6dG/0UEEwFRXzvVBRk+kwN6gWxx5HYoIDaPOaWm8CoKMkB4mxv/iUDRv61C
0DXxs9MWoNJgKAzeqCjJVBe/0yqgCB6GSZJkqgpQY41UB+h/mT6TKAtQLA3+gFAEqCsn6GWZfooM
VBGZKoK3qDHFzeh/7wKgoyQY3eD0Mn0OhQBbzaP9QFY1UFKDGZQ1+gDJ9N/pvNVRJKgrf6G0qAzJ
VBRnKArEH/5y4FQY+EwFAVvVBRkmrvP9UFKJI2vQyVQGZyoKUASgW3+mYMkyfSYyVAUDf6G0b+Rm
5Br1mTnzJVBRpqAI+ZvSY3DL/FQUZIFAtvNr0Mk8FQsoktc2tQLb1QUoApja1gMn0mNzHhUSSoK3
+htKg8yVQUBQLf2ubX6KAJUCzAUC29UFGSCbWZKiSNr0MnH49UFKAJQGdCgGNDFGT6TEoFgb/Q2l
EkqCugOtQLAyZkqgozlAEbR/qif81h1nH4cmJLk/QyTf1qAZUF9GtUT71QUoAj/34FQLehx+HR6Y
Lj3UDxkmwYCgE1g3+hoKFpUFY+YCgWMnPmSqCgKBn7m9N8xhGcqCjJAoFt5oehkqA9QVKFqYG9QG
Y9UFKBmY01AsAyfSYzjJULSoK3+hoYMyVQUZygWUAMwN83ooGVBpMBQGb1QUZKgo3zYFQtGh6GTj
zJVBSgZxoN82BMn0mUBagWBv9DQULSoKxswPRQwqBkyVQVvUDOLm9N4PkzlQUZIMbvND0MmSiham
BvUBWNVBSgZmUNfoAyfQHyZygxVBW/0m2GSqCjOUBSgimBvB6e3tKBQFb1QUZOBNOZqgxm9DJ2Gc
qClC0oFgbwAMn0mUDKgKBv9JlBiqCt8wNagzwxkqgo01C18zem8GVAqCjJAoFt83oZOn7UGMwN6g
W3qgpQtTKCnWAyfQCgZx6gxVBW/0myBkqgoCgWNOYG8HooWsrMBQLb1QUZONM43JZTfMnecfpKbW
N6MmoJ5gb1QUoGZsbrAqFNf6cR/Z/eoPT53nGD0wKhc6FRnMDPn9hFQGMutUKHGaB4G4f3pMbuex
QMDrxJhKCc3Abz+NBQM5PoVChxzawKEkBxKgoy5pj5/eJefRUKHGoPd5/TG0ogVRX+ANU1aj0Hyq
J5tPlrP44plBAAyfQ/gGTglQVvVCnvn8ma5uG0oFlAXMDef3pk8tMA4lDvvVBRkm1vmxeCz+IVBW
81TkxvoW4/smZPpN6A3nNlM/glQVjZgeihrwWFVEHM3pvNDJmcqCjJAoC1QBvz+SmOTwwUwN6gKM
nImTNiFQUAyfQ0MmZygZVBW8lQifx5YT0NpQFKCKYG80PT4/M0DCKBneqCjJ1mnM1QMn9iDyNpUQ
cqBYG80AmT6TKAtUAA35KY/lAyqCt5ky+nvMqBTAOP3AauU6JlQooPcQoMQKIFUKYjGmKoGt+/01
5o8FAtn95ubzsxPooCsrrMlQ0H4aCgIUDNeMaqFsn6ccb5eMRvl443yjBUGu2by3TjwMRSvA8yjn
ZZjzHjoygjxXgeZR4/TOUC3vkMkYhhaz+PSbLTAAasyg4M4GVUDJqzKgo2ugxVQp0em/0VAaga9F
Rnld5uY9QDGXmtYdflld6oW+lACZaiBz5gnySgIVGOTmVCPQYE5Z42DVm8lQCeezFnhhteayuvDK
gX01gUHCgZmN9US42aZUI9BiqhTXr6FQGoGvTB/Z9G0bSoz6FROod9YNYduS1hUEB/+h+Zo0D8NU
1d/obmVzRl5VQ17zaVE589ConUNZlzA1m0fOswlRPrmVAodf6qIOjTr/M1izcNg+TL1qHxUN61Av
gdeswj+UJhlmgfxk75R4/TiMvf6TBVAvA8cHybANZ3dCobUPhgdHHQqMza19ANYVQLwPHB8mwaBl
7zaVDah8MDo4/z5M7o168CoLDDl9M/0awa9agnUNGCxXRiyVDagG6Nf96KAjB144UDaoWUCWDmVD
u8BqzYhQem0qCuOOgTkVE6oRVAI8DxjZv1UQV4xeDzWL6Da4l9BmVGZ+Y3jC4PnK5pUTqGvFdHHB
hHyqBVRPq4Hg2AqHw+eDA6ODCVDagKP7+MnEGqoG8QoCsRn8Vv0H8OIOIcrzxj/fEcSlo6CDCGRP
Z2dTAAH///////////QqACXnAAAA5lizNRH//////////////////////+juqhVVQgaCqgFVQzMQ
ZugqoHg1rtpAMLtm0a2qhmVQyWrQbgZWWINbSlUBIYCqBrQtBVQBqoGgyKYFUJFppVQeJqoBVUEG
mIhoqoVQwA31UCIZ+laCGCGTatX9BDCtaCxXVUBIZloMtgdVDboCqA9jtKoTw2AwEQxFUBOgoKoL
2K06qFUMPQbSqAcNwNpVA9pyqE3QryqAigyw0VUBIZmjsaqA9jVQpuhoNrVAxgxw0lUBN9AMy1oa
qDrNpVA8G1oIY2goMtrSESDAGMGGGzowZKqAY1oMPTLSqBtsZwyWFs1hVASzuGYgGWqhAVQquGWq
gLDWVQPKoC9BDGTDH0N1UMiqEzRtBd1UKej6Cqg6VQPKoBbQbWkdsyqAHQdBDLtKoD9BZmGVUMlo
Nq1aVQG1pdr1ogqiIDw0p2rRrAaJiFloDN07VA0rSqG0M1l07QdD0gNVHRk9BIKoBtGRtBmKoBNK
ag0n0ENkNkMMMMMMMMNkNl9B0FqRDZDDYLTAqgPDGDStZtKoZLVn1ohWl6DaZAyVURAeFoh1DWGi
qgLZmAN1VALo3RB6YNB0hVBGGjobF8NhVANq7Ro9y11qwaSqGRVB/dVQfqoZHpv0Mhobfaza0EMU
NJnDSDFYGoMEN0MYN0MG10GSqgL0EOS+HJoNrQQ2lUDQZaqBoNpm0ZibbraxPZDbYA27LEqiPDD0
EMNVEehaDTVQNBtKoGg01UHoZFoMhVB6GBoOlKoSFUAaqEjSmPvTCDBpzPpzBoyqAW0qgF0bQdGV
QDKoPFUAaqDxVANoyqBvCqBvRg1LQbwaYZQbwbwbKqAQMwNkNkMMMMNkMfRgxw2WJVCEqhQQVQoK
oQgy0VUGKqAXQVUAqqDHSFUGIbCqDHSNDIdqoBw0lUA/aqAbRtB0ZVANowZKqC1j0djVQW9BmBlq
oMlUB4aKqAu+GyGiqgezLCqgDDKDD0R1UMlqiDOwKoCTNSqDwMwNKbWjqoU2oMa/aY2dnxaag0gz
FUAYbIaGghln07SlUAenBkqoVU1UHWHYNBTVQRBuaCqhAYAy1UBoY+nMVrTrQYCqDFVAHjRtBDCD
JdVDMGxoKqAPvTg3NBVQqhoqoDdO+qgFVQBkLNrQdCxpwbrA6qA2g2dODM0ZVAHgNRjVQBhlBlMa
qAHSUVUBNoMoMwMMNdVBcGjpyqAPGnYDD0ZMMsMPQnVQdBh6DaVQDhuKoA1UJCqAVHQQ2NDVQeMC
TKfQVUB6qA3Tg3CAaV3rTmPQ1UAYZSqAVVDJaVQC3AydHDLDRDGDC0FDS9BuhxBr2tBq4GMGSGFY
M+NMVQGhmKoVdODRVQpqoA9Ob3DADEDGVQPKoC9EtapoxgzFUBNpVA0qhQVQZadhnDfwqgnDdDaV
QZMwaQYGmpqoEmfDKqgx0G+mqgN1XRLqqA8NFv00zLp+nWgw2F1UCTPoyaqA8NF1UQqqI9VBmGcq
gD05VCmG/oIb72lUCTPhGzIZbIqhT0S1oIa6qANgDftBmBtqoC9OVQBhnKoUFUCTPkMtVAeGjoIY
6qDIgzyZmNpqqBJnY2PVA0mCgwVUKrqoHmNq0CwGzqiqC6NPVQJM+AwkQygylUE2nBgqoEmfGnsu
bSqBIMcMIgiGIyqoD9KYVUAaqARhakQxwwdMVQGaN3a8xWgwu1UFzLp6qGZVAKGaxMvXSGjadpv+
runqoEmfGmoafowZeiBhYVQMKoJcBhsunqoEmfGjacG11ZZwxlUKej6ZoLBWihgKoD6DRDA6VQW3
dE1sMu1pdrVW8NoNIMYNFNmDLtBm63eVQWtQaQbQaVoMxVASwIhgBjot4a4YCqC0MtVAkG+GXaQD
GVQCM9oNoNIMMMIMYNHTg0Q2QwAy7Qb6qC0MAMsNoNK0zqoEmcMMMBVASqgEDDDVY9HDBVQWsYZd
qwGCqgSDfDADaDSDLtQiGGqgEZ8BgBl2kWTRlUFobQaQYDCQDFZ1UCQZYZIY9oMPWwxA3FUAgZdr
QdGDH0ZVDagGAqhwDBDLVQJBvphn6CGEz2lUAobqPIMwMFjDCtJhlhvqoL0AwAy1UOAYNpnVQJMD
EjqAYSKqAUN0gwY6Rdh0KyGeqhQDaDLtKoZFUB6IYTPo121aDH0ZgZtGyZmDfDADLYmdVAkGXSqA
e0zhuBm6cGOqgMRtWg3wzAwAy2ENy0zqoEmcM8Mu0GiqgWZwzQzNOVQCBgab7Ghs6qBIMsM9VALa
0PVVUCOmWlUFL6CZAN+kQwAyw17TOqgSDctM4ZSqB6wG+qgSDCDFZ1UB7GxIhsKoEg3wwFUAIaIZ
doN+wqgeZ2JnMGMi0BgKoEmfCqA9VAiGAG+Gxa0NnVQJBlsdqwG+qgSDP05VA9oOnBsBj6WzqoDw
wNERDLVQJBv2mdjDBDCZ7Qb6NpVAkzhhhjs4bFxFBVAeqgEDADLDHtM6qBKzgNjSgwkQ31UCVoMN
nVQPBo2mfQ9GVQJBvhgaQGOGXaDfRYr7nfQbQZuFUCTOGAqgeDCDADfTag0mRnVQJBlho2kQ31UC
Wh6GGFaT0ENHDOqgeDADVtBlqoEg302oNZgDCZ7Qb6OFUCTOwBo6HaT0EN9VA9pYYAZYaNpnVQJO
GfaDiDCRDfVQJdhlM6qB4Ne1d1QMhVAkG+GBpYaIZdoN9EMJn0ZgtBo6HaVQJM4YaqB7WQ2FUFr6
CwWg0g2jaTZYg31UCWmWlUACqAOzoKqC3DOqgeDYtaWGizhpBtaYiwmPpKqBIM5n0S0GXaDf9oLO
GUGAGWGiqgGDLVQJM7AqgPVQAhgBv2mcMoMNnVQJBlho2vBvqoEgwGDQQwAy7Qa4ZTOqgPDAVQAh
ohlqoEg32fTwxdBZ7Qb/g0lUCTOGGGiqgGDADLtM4b6qA9EMAMsNe0zqoEtOwGAqgV0Hwb6qBIMc
MVnVQHsYZdpnDMVQJBvhgKoAQ0Qy7Qb/tBZ9LDADLR0kMZVAkz4VQHqoEQwA37VgM0MNnVQJBlsd
rwb6qBINNVAToIYAZdoMfS2dVAeGBoiIZaqBIN+wGaGGqgPZ7Qb7OGUqgSZwwwxw3gwAy7VgN8Mn
SGcMsMe0zqoEgxQwAwFUBKqA9nDfVQJBlBhs+ghohl2rAbKqBIN8MBVAGGOGXaDfZ1UB7PgMAMu0
qgbDDVQJM4YGgqoDgwA37VgMVgZ1UCQZYaNpnDfVQJBrqoAVUB4YAZdoNHDPoIYCqCC0GWqgSDfs
aWGUqgPZ7Qb7OGGqgSZ2ANFVACGAGXasBv6CqgGDADLDRtM6qBIM0MPTcNGmBihp6enhva7ThyBg
Bl2tOVQehgNeguwaCGwqhVYNLwG/o9oNIM9HSNLtWgwAy9FYNAVQ2Ti0wBpao1husCIYAYaqAcMg
M/SNBZEg5A3Qy7TB5VB69pgDSDA0EM9F1UKunBjBgBn6OGxawZFgDSDftMDPpzAwuGeGDWCDIGNo
IYDPa0G0GSqhVDADMDLVQJBvsFgMVVAez2mBvDHtKoCA3dODRVQAhgBl2mAN9pVQ2hgBlqoL2W0z
qoEkcBgKoEVUB+lqoCdO5BgqoU2NHRLDBoKqBIN8MAN8Mu1fVQ4aWqgPZ9LDADLR0QgwKoMQ3AwA
37Xg0gw2dVAkGWqgiDDtaWG0qhkYFUAiqA8MAMu0GPoyqBUMUMANpVCAGWqgSDf8GkGGqgPZ7SqG
HR2Bn0CAygxw3gwAy7Xg31UQaqIMM8MvQFUHtpnVQJBlhgBgKoCVUB7AzM+nKoMQ3A0Qy7Xg3lUC
Qb4YCqCIMMMu0G0qhkYFUB7PjRsIwqhkVQf6oqgG0J6VQ4KoZE1UHjeqgiVQYBlsCqDwMvR2lVAj
ggz6CqgJrVw+1UEIbVoM1lRDHDM0Ehol/VA2dKyZjVQdEGe1aIWbRiFm0YhZmcMSHo0m6zsUmYKF
7NrQzWZDEwGAqgDm0yadOhmza0M1mTBk6IqgtvsIbwZAbeghkhlJqobbLvSbaqgPDLyqg9pPTtO0
xpVQeaYz6Cz62qgRRtZvNSqBJVBKGkqgJDNYLWlhmWtKDdbAxmDStKDG0MNlVCgxKoZNHtX1UQyC
qAdVAKGDp7CqhAQQaGtHQVUBIZmg6LpbPoIZbaqg9DADLVQmMKaqGTR9MaVUHmg6DaVQPKoEUVUK
aqAENpv061a0Fl0EMvQWBVBAG1oKqGYMxVAajfVQE6pfDBrDO1BmKoCQ0gzELWdBDGtaCgGMm+g6
cGNoIY+g2kwwlUM2ghsKoMdMIaC6qAkMRqVQChmhpaCxaNa0ANfQbQY+kIhjaoGSwkLM2g2FUKoa
VpFNVDMGFam1aDNVQCvoKqAW1ozEfo3VrTrVp7SqGYMK1Nq0GaqgF1QNK1nRmI/RkNGDDtaDaZNG
MzMNxVAfoL6DoOq6J3d6S0PRrtq0zBvhs6CzWjBn6UwaCqhk0AgQoMBVAS36dp1o3UqoU2PR1UIE
2pMxqoZA2FUGObSWjKoCQxFUB+nGZmGVUMlq+xmaNGMGYqgJ0FCOrRgxwxgwtBsWptKoBVUMzEGb
aP0YMfRgx9IZtGtWW4MUMdn6ZCFkMnSlUKCqFWQwO7SqBLQmY26rVQMKoFlVAQcYbugoMIczJdyq
oZDeZAww9FUA5BVA4qgCDX1hVAMyZIEGzQgzg1VVDIaaqBnQmrH2TWg1A9AzlVCzKQ7DPuhoauQ0
INthamAsHUqgZZNR1ZkIaAyKoAlUBaqBVVQyqgHDCDcIBzh9oYbCAczJ8MAzBqoYTIHvpTxqTCHu
yMiOhByBh6xq11satJ0DRgwg3NBDdIBzOgqokVQKsgY4aiqggMYMLQFVEgbjYqgJD1DVIBhqqE2Q
NRVAq1tLIG4qocDAD5DmuaGqga1JVQ6QkMENhsVUEa5oQboceuaAGFoSAbiqiTQA5mFDQG4PQMNu
VQKhqXVVBCqAlBr0nTGRBBIMBkD1DD1MgqoTDcDX1jRWRklkIaw9rzWqgLDkIEA61VA+hI6ImgGM
GVoSAbCqBJVBUHui2W9B7VUChjhjNmO1UCemaYHsqgX1jQrN1kD0VUOswbCqguAxQ1w2AxkGTQ9D
uXLlzQ9D1Jk0wMtVQ5odxVA4xdEA5gxmwNUg1qoC0byOiqqB9CZGTOjhjBlJoI6EGAHu3a4qgcvh
oaD/ROtJVULaSqgXaA1w9skG9VQ7qgcTNoDF2qgJDGa2DQ2BrQDOVULKoI9cVQRqqFmwNUgyaLoO
haDoqQbGohzBjBzaiyZ0duVQK6zpusqoFSDJpmJxpmuBnpa4qgH1xLUgzk0kwztMaA92QPdo0NkD
7DUDkDUD7aA9CAejQ1MiqBll1plVQM6iGuHNriqBpVQLoSqgVVA0qgA1YhqyqAAOFmVUOhhtoYaq
h0MpVQRqKqggMq6qoLDgDyb7wcGhhixoeh3Lmhh6hnh66HpgdTBobAHVoDAGNdZLoYyqBf7P9VAu
HsqgbVUKayGNrKqhRVQ6qgADhVQAKqHWbRyAbughukE0tA1ghozdoGrBxhhn9pzdowe6qgVBrVQF
hna5oSQYWohsBnhzBjeRDmcNgMbTSFoN7QmHTQ2Axg5m7Vg5mSQwdGDjbtGDdYbuhMOpJMl1r0Jk
DmVQNT8PXRkEW8g1BjNzCysge4bqGQwGTWg19Y0JkYdY/o0hoNzZbIBwsTDo19VQtqX9J1bRg5mZ
t1G7qTci36kH0qgP7QVUFt8XNb0MOPRm5h0ZhuBn3dAD3YtS0IPdkII6FrTKGgwMjOHsGeqoW0Np
TZCH9Y0JVA2GN2nowbtxu0YNBrIBoNmj6DoGjBqKoAmQPdVQcyKoBwy9bIWFVE9nZ1MAAf//////
////9CoAJegAAACdy+dIEf//////////////////////DhvBjBuh4YZEGFh+HMw6MGg7doyqhZIx
5bgw25VQLYDH0FMNwMK6GCwa7ozIqgqSYWcMPTNdYW7CF3RlUFTI0BjMmm3fhwqqBVUA4aYcYa6B
mG7owdoe+naloyqCrTLvg40NdaFUAwbDd27MyMCDJoyqCpk1G37QLzDppDRtb1pJgZA5k8aM3BsM
GjKoKkJ1kONkDL13XNC8j2ihoyqCpkDdDHDGSDO1FhQ1VlDY0H2rBj6GQu6MqgqZA+2BEMQMTRn0
ZVBUyXWE6KqAYPXq+hTDrKqBk7dpdvRGTQLwZiqg7QY8QIKoC1UAWh6Gw3c3Q3lVDLCQhtVQDawh
oRDSbujKoKmT/rjLOmqoD2TRiFOw3dGVQVMjXowchB2oN5wwOdizWpNRANoOM3WjKoB1VAuky2B1
2A4Q1wztBIBx2E5bO9JbNGDYDGDO0FsDcDCD3M1B66FomttWjTozBLYG2GMHCqgqbAztBDqZdcDj
DXDjDkapbGDRmqQztBbFUFWjGVQDtQcAcIdWsMumhoaMyy2aAGhozA1BnaDLYH6wB1BwqoKmRqls
YFVAqqAXRgztBak2aVUFWjSqgED1bA6tJ1UNsOGWwOEM8PUM/Ae7UyajOjMF1lZA+1UFTYGhfDYD
mDQZe2S7LBpQe7VLJqLYqgq0ZIhoQcwfYbAaF8MC70QN9p0hBlYNMlsa9ZDYD7VQVaYqgHIMgeqq
BoPlhDP0bU02Bqkgqgq0adJRbA9NC6DXD1zoRBsYA5mqdO0JsVQVaNoTLLYHGGGHp0HMGu3NSBmw
MNVBVo06ZdbJ0QsGw2BzIMiKqgJg1LtqnW2xVBVo2tNmhRqugMGjBnKoAFUFWssofxg69GYGoPoO
OWxg0DVVUFRDQgwwxmAOJVAtoyqCpk1kPdqYA62wMNVBVo0srZoDBo1xVA/qsBrh1h6qoAFUFWst
SqhxgnRmBs0LSg0A+1UFTYwBsKqC9GVQVKoBw9WQOu3ajWQxWqQ9WxVBVowaLIHWGuH2GwwaMqoL
VQDqoKtVDjbNCDoDP0ZgatAD1lsYA2GvSbKaDI2alqOjKoKlUBOqhuNTBdDYDGsqoKtGkONsDYYN
GVUBKoCA+2S6yBxsiqCrVWptbJ0ZguhsBrpB9qoKmxgDYVUHaMqgq0AOPQmS6yMGqqoDGqQ42xVB
VoyDKyBlh9hsMGjaGGuqgq1XWyCqAcMdn0ZgatHDjlsYA2A+1UFWmJMgcd1u0ZVBUqgH1UM8OvRt
SZEmTQQzk2u32waMGw2B0h9kGTRmRVBVqodbYcOPQtBDOIaEdFuVQH6MwNWvtktjAGVoyqCoNdqk
OPUQ49GVQVaB7QmpgbDBiKoB1UFWjSHG2BlMGjBvPozVLZrYa6qCrzVrIcc6MwGDVVQAaMqgqbGA
MrQ9GVQVKoBw4w82qWwzB7tqnW2xVBVoyqBxkag79GDKYNGDEVQAKoKvMstho0Zgag+g45bGAMrR
lUFSqABqlgVUKKoDNGVQVMng92pgbNA1ZVAOqgq0aWVsDKYNGbQzNGapbA9VUACqCrzUqocYJ0Zg
0DVlUA+sqoKmxgM36MqgqVQDh6hwNUtmgMFixiQ9WxVBVo2lKoCWpDWTMGjN6qAdVBVowcctmgNu
jMDVrAestjAbWVUFTI1S2KqCAwdGVQVKoCdGYWpgbNA1nQFUFWjSHG2GYNGvaFrLVLYHGyKoKtGa
lVADZOjMGgKoCA19ZVQVNjAbUtGVQVaAHHrLVLZoDBo2lNUhxtiqCrRtNVQD/t6iGw2t2t2LYa7K
QS1lqlsVQFtDUysiCqBpkDAYQ9w/mRJVAk2aDoehawqoOIKoC2qWQPdsx5BkVQNaCGOGAHMqoKM1
B7os+h6wyNGk6yHNLYHvo7QkQVQNaC1MmhqqAEGFVAWGM1MqqBIMBFBPQlUDWgpNge7SGuqoW07U
tDaAzv6z8NRVAq1WZ+yBusLUHNOjMAe/lUAAaaqCpsVQNagHW3Ngcwa4cYfTVLYHuwEMNU/VUJti
qCrRgxWRqD3DTDr0JVAWGg4c1js4e4emjMDUwS2BjsgdYaaqCpVAA1SwKqHGZoDG0JqYGwMoOBVA
Oqgq0aWtVAa2B16Y1h8hihptUtgeoZ4fLa1aSGJOjMAZQcCqAfyqCpsvhgB7qqB2y0GuHqHA1S2B
lMGjayyy2NDYqgq0bQFUBLUh4PdhVUDhrhjaEHHLYGVq+jMDU1qoDZbNMaw9/KoKmRvfUdMa2C7k
ggGcyELoZ6qhZh1mVVCwZ+gaD2W1Ns0JkDCwGaqgBDdZ2zpo0IPUNxkDAVUC6AGPqyqAk6IcwYeu
aEii2W0dGbLaKLZb88Y8e9w6bbvkSE4OiQTt+1O21a15Ehf8QROiQTt+RD2DGPrSqgGzqWgMgboZ
13H0EAzruuazOgNAZ11VAXrBDsM8hoTZoWkltCVQF6A2BsIEAxgwu0mQOANxsVQM3w3wxlVCx2gN
65qzBpjWGAQu6UHujdaA5roYyqBZVQE1hgMDIGEG4yB06FoTJOuNDUqoF0lVAfdawwCHYZ7IyEAw
y2hJaKHIGvrCqAsgqgVVUJsksiWr6YyZDmDr0LQAwgx9AgM5s0INgNwMIMYNxVRI2BqqoFQ1CCqB
VVRIGNdQZNYDUZFVBAbbJdVQBZZAwAxiDCyakGFqobF0N4MZkVUMqoBmQxmRkVUEBuKqHA5gxw3Q
42u35EMBhDGbNCu5VQBI+RRDeuoMmpkFUAyqhkMEgiQVQF6wyEEGTKqAJHyKIb10McMZsDVVQDKq
GQwSCOtBstRBkZNID1DLe02EGRBkZA4VVArJpJDSriqAZVAOQZNcYNW0FNFEOpVAyqgc0lrDfbEA
zmrQlVC2sKoC0USHnDdDAv+R8iHM1hgBjHR0rQQwtVIawi9rzWqgL0AOZHQdBTDcDCVQKqqJNIII
oqqCA1FUAQbbEj5G7lVQyG8iGCQRVUEKoBg9Q3NcDPZAxA6mEPVkDj0hsthuhx/YfX00ULvdiVpa
7pAZAYd4P5p0LUdW832e9WYVVC+ihzBq2tWDe70Jv1QOZkDl0PTbIYrfpGq6QqoJ1b4aOvM+Mhza
3a1q/Zu6UHLoWq6eHA36tq+lsgczFq1pltWdF1cM8ObXA2WnULugBjMgYeqIB46lq+rBrotuq6ro
WrasyByBy66w9J6m2BjI6G16uGeH9OgBjMLTpNpkud/Dm1di0kM9kDZNpoczCHvq3dph8yBjaHQZ
5BVApYYNe0Jm04NEgyNRBovBhkGLV2hpDP0nQ9R0Jp0MPRVQuwh6Wu9a+Gy06wGgH9qzS06mGxqx
mFsDmD3DG1YN4O3VtWuMmgJ41xLWGXXQ5g5mANAMhostBBlwHm0oBzKoEVVByJDs7SQuBzMmoNNz
WmDTmZVAZpWva1q2n6Fp+kBjBu6oHCgHM06tYsKoFFUCiqBRVApYsarqzBquh2FUCgZlo2gEA5mT
TQ5tYZW260WQ0AyNWZEgwWXDQQsHDSVUHB6KoFAzA7L+ons5RxobMjnTutA1rQtHM/VtRrgc2sMA
eLBrDSzqoFQwiAYSqBVk00ObVm6WiW64hq6qgAgqoA1dk08MEPS0qgS8qgStBzas36Rc0hvVQKae
HVZ0WyHVqujh5XA8tH1Js1bVtWbA8WRVQSGjroaKqglDXg5teQ1XVm/P8t9jVmUgGSQaCAZLBeDm
vMCqA7T9Cn86F21BhtXYZAYwe+qBqByh72NUDdsWFUCiqBSw2ae2WNSa2APFga9DDxZfat5lZmPT
GNm04Ndk7Dm7ZNCYFUBzBoWnhg2JD+mxYIaHo2gNYejFrAdzC1JX9FVUU6sytOsMrOQaLmrhqoWg
5g5kmgNhhQIeDmRM0NlIBzBzaLrDRq1xgD+DD0UP69oWtaS2arc1bWgxQ5dW1EMm4GM2B/NyLYHN
qrLorYqod1YNC80t+qat/Vug5dW0IPcMYP7R7+ikOw5lUBxBsD+DsxqoYyOsB/Bzaf8MMMjUdF1M
NTUVVAv9bVUEBjBqBuqoFNT0UO4P7RWwP5sVQKafrWh6sQ1XSdW1YOYOQOX+b4eOraZp1rDN5LVt
ADG6DlDXDmDB0EP6dA0VVRTf1gOa+yBgh/aG192tWDXZtW0VDUw5rQaGuEL2jImaWwNYMYObQg/t
RYdFD+VQK2UNH8HAwh6MqVzUUQz9X/prBAfwcevtLZo2ut8BwaKqoYZdajXw42tl1b2tBjBhsui6
+HdYZf64wB/B06tf1WNfD+1rXw7mnVGzyqhXRQ/mHX9W09pZI18OPQe0tD1PUAyQ5utT/c09kDmD
yDUD+0VVQqwRr6qgK5r4d2rWIINCSN9FljX1VB03A5rjPq+hNOthzIELGsXNF1dgjXw49OaNTDUD
ED+Y418ONg1xqaLbZ13c0HXFUBbf/RQ99RsX8mDt/eirPbLaa9F1xgb/d2dc1FJu76ZWPUTMEa+H
GlqbAqoduBk6iHHpdvZ0jXGCNfDjuB/a7qM2dUYQ2GfVdq3aroGoh3IBxvorLo9xkVQDpBh2PTrA
d2gtFxkadHbHQDm9LIGfq6qALWtVbNKYNT1V7kafcZNVIBza+yekNjRtYDuYQ7lVDeq3GTT31W56
WTX4VQC6rqqqhcOYNjVA5rJBw5rjIGoQjT9V9NxkDFaA2A5tfDj1W4yNGqNr+nVWZjD91+LjM2Mg
bGj6eHWHNcZFUB2ntmn6gGvqt7V7kafrQduradr7JfDs0jRg5iAc2tMmtXNPRDX1W5e1dk1+Lmpa
Vp+naRfDsq73qJAyV7Qw7WBvuMmsKoC9I07Xw/tFDmZGxgDPDg082GjT9Vualr8XEQ5GRVAKHL2w
tmpaUHMyaeHNqty+HKya/DQHbcZA7g4lUAvYczCx6qymDjDw1+LgeXmTRmggyaE06siGRp+o63qt
zU2TX4D3ZGgPnWw1NPjRg49f18OYNTWm+NP1VVQKHdcZNPDU1vX9SaOJBoNUa+HHr6qgHVdPb2QP
DX4uBzMgamnwGe2a2Guwt7ZnX9f1X7RcjT2Ro8Q07X2TT9IDGjX9VbNRb58wa/qmq3Gxk1+GIONv
Dh07SNPgMbVdf1sO5kaFUAGnxp+qh3tlxk0/SGTV29Np1Zk0MMONfDj1tVQBqun60gHMHZr8XA7m
TSNPgMjXtOZNa1YO4OPX9b1XtkuRp+tIKqDrmna+yafpAYca+qoCDu15k1rVtP1sP3VbgdzJr8NI
drIhp2kafDWHHr+t6mHNotzVY0/VQ/Q7rjJp+kadr4f1xkDu14MaNf1XW9Tb31XVrjJPkb/Yamnw
QZNJ+bVnDj1/W29kD9DuaJ9d0r6IY340/VQwGS4yaew9a+HHqtwO4OkMONfVUBa+qoF1XT2RVAKG
pquvxcDuZGHT4a89arcZNTDj1/X9VVUCh3XI09VAKGIHH1r7Jp7CGNGv6qHcHTqtxkVQC6fr+t6r
c1Nk1+GAOPVQ5emHT40YOPX9fDmuMiqAUN2NP1VVQKHdcZNPYetfzqtxo0So18OPX1VAOq6eyBqB
jarr8XA5mRh0+Az361W4yNmdf1/VftFyNPDUDG1XX9fZNPVQChqRr+qtge+q3GQNTT+0mm42Mmvw
GGHHqqqgjX1UAunwGpquv9B3XGQNQMiNP1XW2y4yaeqgF1/Xw49VuMjUGjGvhx9B2arp7IGoGGqo
C1+LgdzIqgF0+A1lVAuv6rcZA7g49f61VgZLkaeGo1hx6/r7Jp6qAUNGNfVUBB3KqBdVuMgamn9B
06rcDuZNfgMbVUmIMMgqoOY40FisBjBzWVUCWq3GTX0NVDG1T2dnUwAB///////////0KgAl6QAA
AFkuSsUR//////////////////////9mkMnVtU0JVAEwhxtPbJIYWlJMwczLqtxJVAFd6S7ZAyZu
BpKqALGtarqwcmqhhJas1GVQJKqALjIqgCDqQshzBkzqurBhaI06Fr5DVQ7e9UaO0dKDJlpZFUAT
Aw4v6qGFqbO0otndrVUuNpkvaFqoc1yNPVQBZDj1/X2QMnvSwxmRVQAwh3KqBdVuMiqALTw1NQ1W
4Gplk1+NbDj1VVQDr6qAfSNf0Ygwhjaj0QVQBaBGn6rp9xku3lUA+v6/nVbjR8g0Mocuq6eyMIY2
q6/FwMXR2RVAO36wGfqmv6rcZGzTw11VB2qqoB9euRp7CGNquv6+ya8GwqgCYLrbrDYHvqtxkYdP
fWQ7bl1Bk1+Aww49VVUEa+qgCDgYGFlDlDuuMjCGRGn6qGLo9xkb9YVQBa/r4ceqtWg6lrDBrOoa
80s97VNatKoFWtK5i1oYf2t5INGravpebUtDJ216U2Bn6tTKxXNY81IhjSQaGhoIdtCJDtoRIdpP
l23u6jcaUke+rmGpoOj2kgxar9JoOZI6LU0HR7SR0b4cOsaUm2Bzate0PWtQ1BpaWfWrKqAu5oCD
PrWv9XdbtXWjVmjR9KZdAbEGS2HNq7TcZIDPZG8OzQCGPNWqaBrDBqWsBsBzaqiGuHJ7U7QcAc2k
BkBxhpB46tq4Z+raCGQ0atcsoaqHoGhnWtYDYu63a1bVg5mHStTDt12x0yhzWs6tc1a5Zb9Wbw5m
DSmLV7jEHMzhxtCAZ+rhzBn6Syaba7DmtaSQ1pp1brvVv6cya1ab9W1RlukNW1XV9SQ92HNq1ntk
Zwz9WZPhjaGQuXgwyHaTRqmhBzMmla032mhJoaO/NOrNgc3dlg1FHUWXpkDmaWRvtNCTQ0d+uBzM
mm92WDUUdFDCvBzasyJBkfxrjJoGrNOrasGGyubUcaB3ooczIqgU0/WCDQ0IhwN4Zmh6wG6QIM+q
6QqgV619oR1FJhkNgM5JoSRDG1jVGVqaMajq+paB0jjXEtYZWIMZE+oohn6va0lk1FoR/3a077Qk
0eb7PbQwaij/tsDGVQKafltDFDAbNR0FEh3eDD1jQkk02lk1O+is2IfOsazfVUEohoh7qqCw0Q8G
/XFVBwaIeAbDeGNdVULaMHOHU2t+uBjaWHcqoRYdcVUAqqANYYw/NGDRuN/Xg6VVCgc2p6wGMH0H
cGNoKqgkPdja8qqAA0Q5NQtBjaoGiqoWDlDy1xvDyVUFhjBjaQ2hoqqBdYD7a7V0PbUkdYDyDRbA
8GxtDGD3bA0bQeQd1wPAOdVQg26WHUHC0B6h5KqC0deD7a1VDgaLQHla8qoODg0sPLVGhVQXpYdQ
dTCGMHgwhoqqDg8mzUbQed8OQOa2HHrCqgFVSRhmalVBOpXp0ENxVQTf0HVA8g3A0VVBbQ0KqCw9
w0WgOcNgPAOcPJVQcGMHAHUGiHogQDRDRDRD0D2DRDqDwcMZhDz0YOfVw0Q0dGtB9o38aMHoHLcD
GDGb1VAgd2jOx6W1t+ghosJshgmtaXIdLH7S9LVUCh03NLOHaHo36DcDGDRVUIY0RvDhD2DhVUKM
Olhoho6xrAcYcYcYcesawGMGic9/WA49X9dD7t6XpbCGMHoHLds6M6qgQO4NG1+GtvY9LM6IYIc+
p6uHAH0x6M6AcIdKIemqauHaZpVUO4DxVUG6k14Dj0sPTVCGqB6Bo+DpDs0EOwOnS2EMYNFVQbqo
bmqqqDQ0WEOTTL+mByWgxIDnDy8n4PIMYNEOkPzRg/A6dTwGIHm3h5hiBjUHaGiHbQcwdLYGi2B0
kLQZrfcbwzQ4egxug4WMNFVQAqoUuKqFFVACejNeghwMYbjGHA3aSGNpLdqOiYVUNsCqhvCqhCQ+
ZVUIB4hwqqGVVCAeIdSqhnWA4Q9tY1gOMOPWGPDHrAcwf2qENUD+aEWsPANEPBrD0VUBN6qgIPQO
3UW0MbSwxm3DdqLdjRIVUTa8jryqibUtcaFVEwfYeoc+qaggHhoOja7q7E2B2hoh6By+0ENwNEPI
ORh1hr0vRtG01VQ4w30wxlVArWG4waiw6W16vqGoho6Nd1e/q+rqqCQ9wxr7AGMGiGiGMHuHcGiq
oLDg0ZsY9XaDHDGY2vV2BiDRSVUEhot4ewaNzRg5w7g0Q98tmrt4fWr2tLDG1HWGDVw4A6QxmwOH
UNXa9EYA+Q8VVDurqqDQ8VVDqqhbU9VD0DhDxD2DjbQ40NX1dg1dgDjwGM0NmsBjX2wNEMYPIO64
qoUD6RDRbw7dYDpv6ixhoh9tgc4d2o6Wblq+vB/6uxB9B6BjB9EIRaA9VVByqhYNFsD6DRbw9W0M
YMFVQJrd9VQSwWGUNFg1tsaw99XVUDqqHNX1cOlo1LVLbaHgHOHa0eY2NVQWHkiHZqjfq4eIet5g
Dr14Olv1bV2JMMYOcPW8HI1hophjNgcodreqoQQ1pPtpadX1Ns10MYOcPUgGMqo9QDR1gOlVQ0qo
C1ftVQ4HCGi1ho2g5w9Q8U9L0ZoaFVBocAYwczbcDRa7TWHb3q+rqqAtUDnD1vaMqooQDRD7b9BD
c0Y2oGTDnD1va97Sw0fByB7hoh+BxsJ2bUPBxtDQHOHqHiHhqiqg1VQCHPq5AOcPUPFpadB0YPNj
1liZ7jTriqgDU9XDuTu6jeOHxrHrLJq2ohyqqFkw42lpbw8FVB2uNOg2dPDqDnuf0BqaQ5w9Q8Tu
0sWjBwKqBA8Q6g9ftLSHOHqHjGr3NBYg/FVCCqhwPbD5hjD7VUCoal8ONvDt1TRtLuNAcutB4aqq
pjQb0dG0sOnVNLDjYdLDw1XS1VBYeWpNLGx6CqoMbWMOPRg52vRtLDjvqqFg9dLDw1VrVULqqTkG
tBVQax6NpbWHGx6MHhqulh6hz64qoBYw4lVCzWqojDjVUGasHGHHo2l6jqwc7Wxh4aro2lqqFtUa
1VCweoeLHo2l6pqyqgoOMPDVWP2phwh6hz6MqoZY9La9UVUGawqoW0bS9Rwx4VUCtjGHCHJowc7W
GNqwaIeAeulh9BwN4czXqwcaqgu0GNozWHg2MejBwhyaWHqHOGjqOgh/h4N4fQcAcid/QWFlYm3O
raoHTo2lh6a43h4B6kG8Ma0xqqAQ5tWwldsNbHo2oh6hz6MHCHlpbWHcqoIa2NVRXoIY2ltbWx6N
rod2lh6hzhuato2loKqBWtVQQ1tcMaeA0bQeoc+jKqCA8NLVUHB2aleaw0Q0Tay1qqHNVY9GbdLD
1DnVUC6WG4qoaD81FrDnVUAqqDA9VVFAceutLeHO1saqhZDRtLa9RD8D11ENy/qiqg0P8OcPUPFV
RQHWxtbfpdoPUOfRg49L1FrDnVUAqqEA/A5mtvYw7Q9VVFDHr2qaMHO16WG4qoS1YPAPXS2tvDhD
nD1VUAsaqjpv0fQrqqigOFj0Zj0sPUOfWQ8W9VQoHg3tYc4cKqgEPUPxDSw3NbwHO1saqkhj0bS2
tv1Np1VjDRDRva0HyHOHqqoID8VURsbWGMw6WQD1Dn0ZDS29rDn1pVQ+HhaDGDRQDxD1D8Yw6b2j
BztYYzDqIaIeAeultbeHQHOHqH+gqpMtBjBotYfiqi1j0ZDSw9Q5w0dWtB6h4N7WHOmH6HqH42hj
N/tLDna2NVS0ho2ltbeHgHqQDRtIKqNg8Q5w9VVAIfiqgNvDjDGDRDRtaqHhFxhDuaw59SvB460G
4GiHGHiHqH436WqpFQDc1UPAMbQdTMHjqYc7Wx93tG0trYQ5g9Q/WPRkFVIoegc4eof6qj0P5ja9
L1xVQCqoBD1Dn0ZDS2FrDnbw7g5mPRtLbQ/Q9VVHrGqorQ0YOdr1wPdVQYHMHrpbWwh+hzh6qqAU
FVF7Ho2l641qqPdVY9GbdLD1DnD0DxY1VAgczC1hzh5KqDA9VVHocejaXrgewc7WxqqFkNG0trYQ
5g9Q7WPRtUD3DwDnD1DxVUeh1sbXpeoh+KqAQ9Q59GDj0thaw5w8g+g5mPRtLYw7Q9VVHrHr2qaM
HO16iH4qoBVUUB66W164HiHOHqqoBY1VDLHo2l6i1h6N+NGY9LD1DnVUKKqCGMPRVRRrjWHOHiqo
BD1DmQ0bS9RD1Dna2NVRmx6NpbXriqigPUPFj0a9KqgkOcPVVQQHMqoNY2vS9RVUBh/h6hz6Mhpe
uNYc4dQfyqihj0bS0A8Q9Q5mPU72jBzteo68H6qooD10tr1wPgOcPUP9BVRWx6NpeotYcyqhhj0Z
DSw9Q51VBiqgE9oPjUrUNTfa1oOMMZo8x6NpYfIcLGHGGiGiHAGiHsHvqQdAeN5VQXpeqqqENBDl
D6DGDlY9GvalrCqgXRmjQbQcGq+R0wPZpY2wPLS1VCAcoaN1q9pmjaXqWohwtAYwcGqsYaKqhBVQ
cGiHuHzfY9WVUFh7aM0Meghware0vUlVADWHTroYyqhAOTzFcRVUHB5MedTtKqCQ92Nr0YOdr1IP
VVQYqoQD10sOCwHeHiQ0xrQVULMejaXqTXpaqgVj0ZVQBqOlh6hzh5h4sYdaqhC5rAfIc2rKqHGt
vMhqQeoc7WxtejaWHeHDcVUIB6h2sejaprzfdaw7mNr0thDsVUAh6hz6MHuHlpdwOkPQOYOFVQgx
6NpbHhutMbGH9owc7Wwh2KqAVVHoeulqqAA9tSDv1jWA9mNVQyx6NpbC1hxhy6to2sBw6WHqHOqo
EVUEMYeiqj3UtWDva2sO5DRtLYQ5Q52tjD3Dy0bSw6Q9NSVUeh6h44STDmD01QMYOvXA0fBw64GN
rAdKqhbXNGDp1hoVUE6ni0G4GiHlr5DWNes6WqoIDk0FjVUFhohyB26p7UG7QTNYfmghuaNo1rS9
GarWl6Ma1pejT/RtDsMkNvC1o3X2HRH0HRmFj0vRrtpjuaNo2g6DOi6Cwm0HRmBj0zRjB0MdKqCw
4VVAodGoBoqqCVVCIYyqgXVw0Q0fBjB565oyqgUOHwYwfIc4Y2p6wGNqOlhuapoIcqqgXS2EPQPX
Sw8g6Q0QxrVxVQXpaqgAODQ74dKqgm8qoQD/1DVA5g9A9g5r4eDYHkHgHJruoKqBNY1kNFFENEPJ
VQWGiHQHcG4GiGNoweYcLGqgBQDjDGD0D2DG1PWA0dbDGDGDw0EPTV7mtBzhyhjB5aiGjowaIaId
wdIaLe1t+g6oHl7VA5vBohuMKqgsPLS1VBbRpbCHkqoODGDyaL4YwaIaIc6qg4NEOAPC0GMqoWbw
0Q9msMYNwNEMYPLWGEPBVQdpYaOuB1WlVBiqgsNG0HAHnft+VUE37Wl6Nowewe+l6XoIYzeqoW0b
RtG0ZVQcHgGiGi4YwdWuXdBNoIcoc9oMYNG03qqFtG0bRtGVUHB4e0vS2EOrXLugm1AOPWgxg0bQ
bLHZv4IB9hohohohohyh25atBQD/DqbwxrWpteodo6MbKqgDV0Q9NYtaXrMQ2awHSHOHzoxtB0ZV
Q5rweyqgDRtG0YzWHoHs16DoyDGHlrAfYc5r+NGD0Dl1RrNLGxqqCw8g8mhDQNGMHAqoOVULB4aV
o2jaMHg364qoO0a7oBg4A6mMPMPTWA7IVUGB5ZY1VHTcla0xVQTfVUAB76LLHo4ejbqBqnjgppkL
liwHSyhk2CAZIcFggyhk3AyWUMCxYsBkh5NtggGBo4dNwMkgGTcuMujhpBk6Oy6uGBc0cMCxcDA1
cgGAy6vYZSFi4GSQ0ewGAQDJsNurkGUPKwGAGAHAQDJbbBAhYbW0gy2A8gydXuX7AYFjVwybDKHT
o9yxcIaOy3LDaHlYZQ6SBAgGSQ1exo7bYDBPZ2dTAAH///////////QqACXqAAAA1TPL5hH/////
/////////////////wPIgQsaPYsBkhgXCAZLbq93FixY1cgQuWG2wy2mRlIWLjKGkHTYZSAeQaQZ
NghYIWAybFgMm5Y1dtDAsWAySFhVAKGSGSGSQbQybFwMAMAhYsBkh0hkhk6PYIGIWNCINujhgBgM
pAOnQmVh0cgQVQLhkhgENHDJNY0dhuNujhgaO23NHDAIWLlhlbQwAyW1lsXGW4QbQwAwAyQybFi5
cuXLFgMAMkgGBYsXLhDBAgGBo4ZIYBBtyjoTKQDpDJsBtspAgw6Nhh0cMmxYuBgauy6EysNy4QuE
Llj2g6sytrbqJAgG2GAQbVUAjaQDJDAuXGW5c0cMkMAMkNK4GlcDSDJDAIBgEAwCFjR2Wxq7Lo7L
q4YAZNzR9H0e5YuBgEGUgGAGAGlowZOjBpBgavq4ZOr6uqgFsBpMujsoaVzVwwNXuMoZNzR9H0e4
y2AwGUg2hpNpBtDpDADpbWWwy3AybjKy3NHuMthlsMtixYsELlixcuWLFyxYDAsNqqAVtsWGUgHA
GSHAQuaOy6PcsWLgcAYAcFxlbWVtZbDLzDpZQ6efmSxYINtghcIXGXQtHsBk6u2hkkG0MBlDSDJD
yIBgXCAYGhaEHAQDAIaOGBo4cAaQdNwMAMAhYuBwBk6PYsWLFgOmwGA2h0hgBkhkhgWA6QySBDR2
WxYMZhDAZSFgOkMkMm4HSGTYbQydHsWA6QybAdLLYbdXsWNHDAZbAdNgMC4GAy3LlghYDJ0exYsa
PYsWG3ViDLYuXG2wQsWA6bAdNy4GBY1ewGA26uGSGAyh06Po+rsoZLLYuXEMMAZJBlsB02AwNEsB
02LAZOrkAwNX1dlZbDa22AydX1cMllDpbQwA6SFggHTcRYgyQ6Q8mUhYsXCFixcDgIJtpC5Ybbmj
srDYDyvhtttiwGSQuB06u23LFiwGSQDAsEFUBwiAZOjhgMra2spAhYIHMaw26vo4YFggqgXDAZSA
ZNzVwyQybGjkA4AySAZNiwQDJIaPoVggGAHAGAHA26OGSQsENG0exYDJbbBBVAdo5AgGTq9hlDS0
IzKYhYIKoDg6dHDADJDAIWAyQ4CAYBBhuaPYwawQDJ1dt0ewQsYsEAyTGZdCuWItslg3G4w2LFeZ
kLAYFhFFibCDbYuWDGsBwMpAzKiwh5WCDCzGNYIBk/t4DJ0cODRwyQ6QwGExrBAMn9jR2VgbQ4CD
b09kzKQsECFggytpDR9H0e422CFwNIgQsaPo9who5AMAMAhc0ewHkGSysthlINrKQ0ewQ0fRw0iF
gho5C4GBcDAIXCFhl0fRyBBl0chc0chYDADAZdXsBgECBBtIENH0cMltsEGUhc0fR7DaGBYIBksu
j6O2toeRAhcZT6mG2QsaPo9jRwwCGrkLGj6Oy3LFxt1dluENHsEAwFUAoZOrkNH1cMC5o5BtIB02
AwNHIXNXZdHuENHIWAyVUArKHBq9zVwwNXq4y22Njq4Gk23NH0chxuauQVQLsoYFiw2kLFxPuwQZ
dHVQCkLGj3GXRwwA6QwLlggyhgaOQIMuj6OHTo5CwGkqgF0fRyFwMAMAhc1dlIeDJVQQELGjhkhw
aOqgODJIWG0MkMk1ghY1Zl0dt0chYDb0cNLVg4AySFixo5AgQDAZWWwQZbBDR9HIBkhwEFUAoaRA
g2todNggGSQ1dlIMujqoICFjRyGjhkkLDaQDg0e4y2AwCBBlbW3R7BDRw0lUBzbq5DRyFxlsEAwL
FxlsM5yBBl0exo5Cw2hksrbq9whYZQwCAcBDRw0rFywQZbFjR9HIXNQxoTAGSGTY1fR7BAMkOAgy
kAwAwAwFUC5Cxo5DR7hCxYuavYDADJIBkkA4GW5Y0ewQDADAVQHBk6uQ0chc0ewQDbIWLAYAZJAO
Cwy6OQ0chYDJVQC2A6dXuELFwMkgHA2hgMujhgWCDLo5DR9HIXNXIKoFwybBC4y2CAYAcGrspAMA
MkMmxcIQnaDAIWCFhlsBpBkkAySAcDLo9ggGlcIBgMrCZlbbBBluWNH0chYDgIBksujkLGj2CAbb
LYZSGjhgWAwCFjRyGj2CFi4HSHAy6Po7aGSQZWXRyGj2CAYDLo4cBDRyFhlsEAwCFxl0fRwwCDLq
zLo7bo5CwHAGSyh0hwWCFjR9HIMpDR9HDAuWCDLYIaPo5CwHAQDAZdHbQ4NXsEAyWXV2Uho4ZJAM
AhY0cho9ghYINocDLo+j2AwCDKytrbo9ggGSQDAIENHIBgWLBAMCxYZdH0cMkgxRjR7GjkLFgMll
IEAwCFiwGAQDgIaPo4ZNywQZbljR9HIBgECAZLLo9i4y2CAZIcDaykNHDJsBtkLGjkNHDAIWCFgg
y6Po5AMkgHAy6vY0ewQDJ1cMkgQ0cgGAy2CAbZDR2XR9HDJIBwXGXRyGjkLBAMA9jRiAbermIWLB
AMAOBlZdH0cOC4ykAyQySAZLbYDJ0cMm4y6PcuMtjVwwG1l0cNsMmxY0K4y2CFzR9HDADJZWXV2U
MC5YDJOZlDA0fRwybFwOAMAhcZQybjKGTYDgIMqqAVlbdCuMLKQuXNHDJDAuXNHDAuBgBgW/oNur
spDxCwHTYZSGj2CAZIZOjkCGjkGUNtl1cMC4QsMuj6OGSQINrLo9y5o5CxcDJZdXIaPcDg0dtIEC
CFsMllsEGUho+j2LmjkCAYDLo7a2tNsgHSykNHsMoYBCxo9hl0fR7hAgQIMuj6PYuauG2y6PY0ew
QsMoYDKQ0e42hkhgWOGj2LDLo+j2CBBtDS0exc0chY0cMllIMoZNgMC4QDpIaPo9ixYIMthl0fR7
hAMllIBk8bBAMAg2hgECAZIYFwgGBcuWOOj3LlhlsELAaQZIeVgNK4HSGlo4YAmWxYDJ1dtIaPc0
dlMQbWUNLQtCsaPoVyxo+hGsaPoUxoTOixW3s6EYhb0F2XQmFh0fQrFhl0fQtCZWVl0JlYTMuhML
Do+hG0ZlIMrK2stwMkOm4GA2toZIZIYAYBDjo+j3AwAwA4LAYFi4GAGlo4aRBlbdH0cMAOkMAMAP
K4GSGBYsWNHuBgBkkLmrnDgsXG0MAg2hgMtzV2UOAMAMCxYuWAydHZQyQ8rAZLaHSGkGSGBo5C4y
hpWFUAoYBBtDAsXAyQyQwAwLjKQDp0exYbQwNXuBk6OGSGSQuBk2CDKykA8tHIMoYAZIaQYFgPIM
CwQ0cMnV20MDVyBAMAMkMmw2hk2LlgMCxYDJbSAYAaQZIYAeVgMAOBlDADJIB5WAwNXDJsWLFgho
4dNixo+haE22AwNHZQwLFjQtC0LQmUOAMkMkMAMAPIhYZjMzbYsBgBk2LFjQtC0LQmUODRwwNHDJ
DyIWGYxBtDgDADJsBkhk5IWNXIBkhkhkhktrawmZmawHkyhgWLBC4QsaEaxcuECFixo4YStnuXLA
cGhGZtCIB0ttzQtC0IxAg2kGbQmZmDysELBiFnQiDaQIGYWZhsB5auQ0Jm0I1htsXNC0LQtCDgsE
GXQrLMawHlYsWkklter2LFywexo4dNi5Y0JlYdCDpIMpnt44HPLKGaGBrTeqoPaA69N1PWX0RPUw
09ZDNDiVQGtvYejOd74cTEx3gxdE1Sz04caqgPU7KqBfQtJsh0hhIXNXZlVC9zR24Ot9D7s6nb1V
iDi0zU20MnR9EDNteDiJWmBo6Yw0tQYmXRNGVUCaNa1M+me9qQdZ9TYk2NsDTD00jR2oOdjDFbbX
lVB4YAaWoao0BnaOxY1VVQeHla0wM7zEGQqgGDFDiDT1DU9V0e1rDEGkGUGKGkxhqqoFAwNDvWdE
9rLUxELzfrRDTLV5o8GcGLpodbQGKH1rIaYfWj6rq6qg8Mho0VVAA26m0NAZuiamqgGDTgOLUA0u
w9Ax9T1NkYg0rLCHL3ooZLYHEHFomqsd9ivkLFnR2hlDgVQNh6IEO3Q0/AeTF0g0BzhiBkBnp6Pc
1fU9SvYVQA6LpqqAcM9lDyaNTVQKKoFA1Q1Q1Q1VUCiqBTUtTDESDKVQKBqhg9MAaTGHkxBihxaK
GTrFy+xaqx6mxBthpWLN8gi6qAAPQPpVAWGDbZtXyxdsdm0Ge0WQyO2Lu921mY+tDDy0XS+9L0Vo
0myGKQDFssQYocWph0Bu3g3Q6E2W2Hy1h822LRA0g+tHDeYg3tHDi1MMMONkDjDDVQF4DxOGacPH
Ug0fp/DR0Do+pn67Yg5VUC7YqgXDljQg4tCh9Tsh02Q6bN3vUCAa+n3tPDXVQQqqAw4lVAaqCFVA
bi9VmrwbzFobEG8joqqCBVBaZVBGqggVQKKoB9NVQKKoFA1Q1VUCjPhnVQKaAGZpnemBmBiqqBLG
s6nrNgM9vDLbwzwyNNDTD0DyD0DTvKoIVUBqqCG9gNIMBVQeGBpLUGLAaTaH1pmq9BptPbKxKqBj
maNFDJ0kheTtMDLc1APLu+H9qjK1sQcWsqoCbybMyh5agxard1Nk0TX9aYtfbw69XYk9ST1PV9cY
9T00Ndk0ln19tQuBxPYYkw+tT1RvaH0TU7PYejHqYdes6Tr4YbMxEOw4lUBuiJ6/bs6lpLHquv6h
izoaKqA1iumVQGqoE/aMqgW0U2mhq6lXWvsSevphq41cMU+iakxH1MOJNjsh0syqgTUwywyLlnQt
XS1MNLSQ9GPTQ8tFYNfDA1NiVUDM2ihxMzIGkqoPDFbdVbdTOjqYZt7Ug4g+tVDla290MNCf9J1A
OvX2vVGLX7NaNo9wMINMPozZjV0PWsBt6Yya/p52hMNoM8MNk19iD2t6vfPp9jU2LV9JYDBmqoAO
tOt3G1HXyB2XUr57erqoAOmjRekGpi1/VNK1PQ2hivn0+732GKHRr9wOKxqVlPQ2LUPhja+xNWmX
z2GRVAB1qYdDIQvdoashbvn+GBgPJPSbYdbQGEHcypzquKbEb59P0HW7pu9fxfPp6La03w1GdmOm
xNtnW2K5rbDZxYbQ72yuOg6wGS26JTai+sp6I2t3eos4elvQG9lRvn0/vtEPpkualp+o6zoLajfP
p9a+2N4mbWNU0SzZP9w0lUBvWjB7soZptBZGINxsYNODCDdZetElkYkNBamVlDyDCDdYvWgz212f
Rw5dSdlZL+hsjEqgTaw3TsQYQboYupMvWodKoH3ZGLQ2V2QMIN1iPfDRYnVQAhuhi3w7g4ddZQ7m
RiDC12/obhhBusjFrGthihun092Ri1sNBJlDCDddEMEME99k6Z2IMXQelUCYbrIxKoDcM+Oju2W2
S/oerhoanoJ2JmtqoAbWoa6HczMWrsmh6Yd2RstsR76YZ2jvoKqAFmthiptbcQw1WMaFpgYbIxaK
qgB0E9sM0OJiZwwA0tfxhGdDdkDOPfZGNNiDRYw4tQZ1UBujhxMWh6g7IysbEe/eDQZGLpVAGGiH
FqGoaw9vGv6Ie+yBwayxKoFtU1lqy0amgGBoaqA3RnZNSYj39KYrxAMIMLQ7+pOdVAAHcGE2nv6G
6qBPpkYtDDCDCOGdeDDa9ba0b59PVQABqvoZ2LRD32QO5iDC0O/oDMGEGJqB2cMI6qABwxNbZL+h
sV4NnXdBOxaGqgB0W+diZw2Tz5hVQAKoB3ZGdiPfDU084Z+gqoAdDv6KxHDC6YryqAHF/Q3DHZ2R
i0NVADaaWVJo1Nq1PQ75+gwtNfQ9XZQ8tHPfZOmJVADod8MAMzQWLV9T6084YThytTJf0PV2VuT0
E7FoaqAHQ752XoMxi1fU9DDC0p2TpiPfaA0GK9oKqAHQ7+iM5wwtSDiDNwHHf0N9K6ZGLQ1UAOgn
tpsXQZmi3zsQYWsHZdS1NE9nZ1MAAf//////////9CoAJesAAACI1XhJEf//////////////////
////2IN0MJC/2GFod/WWoPKzjU2XTzhhHYtK6vBuhhXNH1tDRfX9Dew1MjFoYZ9g7O7J0GsjfOyq
oAFUCb6GxBomYj32TpiDP0O/Yiw7IxakznVQAOqgT6ZL+hho3XsHYtDDPs3zsXQazsjEGjoaqADR
nZNSYj39A099HsBn6HfO51UAAdzIxBo6bf0N1UCfTIxaGGfYOGE7JrdrRb59PVQABqvobEGEmxHv
sgdzEGfod8MIMmw7IxM4YR1UADhia2yX9DDCTYlUAB2LQw0TXzsTOqggdkYgwtDDE0yGRnYj37vT
qoFlUAAaOh3zMR7HTIxBhYv6G6qAJnZGLQw0VUAB9PdkamL18/VgNl9DYgwrrKe+ydMQaOh32NVA
mqgAdkYutPPYdqamS/oYYVxnVQAHYtDDR9fOy9KoE3ZGIMLQ7AazsnTEe+mxdsOh6yqoX1g2iMOn
BnBxUG87IxTDhnam0Br6nogdYZ7Np7RrjEG6qoE0cOBEOIMl2TTwz2PWu2skxBrhu4VQAB89NrnT
DjVUCBwam0MobwfLIxBn9RQcQa4br6mqoEbmgOuWtw0Nc0S+1oaOGuG60MQZ6OoWWXUlVAgeGk32
pq1XR36I60xN4db6gyX9DDPSdVAAdiDXDLVQR6Kxh86h0qgTdkYgz9DDQ6dk04MBiPf0PT3DVVQA
BudTa13VNQ1RmsBn6ff0N9DZGJpbA3FUABwwnZNbDE0C9YY30NiDPssR77JriTEG4GHooaSqAdVA
A7IxM+A7VVC7hrtrJf0MM+yxKoADsVrRAz0WNlZ1UEDsjEGfobLa0JkY4Yj30enVQLKoAAz9fR1C
wx9MjEGfoF/Q31xJkYgw9FDPVQAH0+5d0DRdL1bSLLRpLZf1e5ZZmSzcDF7QaSF7U7TKGno4YCqg
5iDi0dn9qYYptMxqtNKGoMRC9fvkO7+kEO76BDvucu2JJIMJmrtBDpPDTfsId9sDC9nu+Sza7JWE
Gm/YQ77Q0jXwxVUBLEGyqoFDq1Nvvav03tDRpOrnZA5I0nV5D0uIXLgb2p3tB0cMkORqZde1kPK0
gmSYg0PMVm3pTXZlo1jU9V0zQNF0QMLQdMOnrIeDCHiYM0MDX1UACqgTU7XtTDkY72pkmQ8O1qoA
AztX0XRLiFzUw0Q4iQaejhmhjtmnB6BkhxaOGBqbJqaaqhcMPU31DRNH0y1jTA89J1+8y+tB5eDO
YgxdH1UOLRwzmvV2jUw9NV1NVQfpTFq7a+p6JYuENT1K1ozLrKYeWp6IzsXw/dTYlVB4aQZTHhv1
oh33f0QOsPJi0fV3bb/d++nrLRqcBxM+iaI3INwZIejEHE0MTtt/u/fT1nAeTEGKz6JojchoyqAc
PwOLU2JpZ7jCHKyBpam0anqbAZBlbrGps4ZocTEqgL0PVU5vod2QwbWi6QQIaS/VkPSb6Dd3qgYG
iW+7/aGoaLolhpv2NXtaMGkHogwhy96KGTpmoIPq6HrWjhnaA3X0FVB+qtulJX+7+svoid/RG5BV
Qezs4aSqAvGi6WyMDOGywXSHbfrWnB19wle17R9WRqalo0or2FElB6iSj2NqKp6+/vok2okjLEHd
/SNR603WmMPrwelhjDBDt0EgGVogZQculNfiBBr601APS75r1FrDnYwyg0NEIB7hgkNU0S51pRDQ
etN1G5q/mMgqoAYyGlMeiaVogemgsHiGom6ZOyGlMYZhDUda8wMaqBYMQ39R03SGNj0HoMEMH2qN
DXquidhzsHtRDBIaUGP0HPojH3pSqBIgwaUHP5rY2tAgGCGax6Von5Y9EDh7D0Ia32QDBbfs+nEG
O7rWg6R/WtKYNB68HP3rWm9dsYdoYLHomlXFUCTH0wda0x9dWA2mNrDBDQIBm6IGUHL5jY+2Mgne
veYNKDBIENK1VVAAiQT60ohoPVjSmMOpFrtf6DH7INbJ13cuKqBPe0HSrjHrTb2x60HdqoaFgh0x
9963ret6333qLHc1EOHvWwwbVwgQINaBBg0ppuIkNVVQAMbH2Q0ogn0jkMoOpj1sMFl6IfIZ0QPf
QfB4aoqoEamJVAs260Hg+LRAOEgwXA47jB0Q8lrSXmtAgxhhsegsYYfdggHGQDjIMfZBj0Roa2jR
CDH5r7a/a3omoh6aCHpqOohtMfbGG1rWu6Qx6RrocbGHOGgGCGgHPruiENE13UWPwYIZQYPg4Qyl
VA+tEAx9BDHIENUIaoQ17tt0gNfSG0Nq7o90NoO7Wg7ta1QMoO7vVQ7u+9b1vtr0Rr71rV7gcdzV
+9a0oPpjD60r2rkNX8qoE0QOHUSGohwtpDXiDb2QuBg6iGDc/HfiAc7HpWqa8GCfwZQZodWkB4dM
GlENa0HtgDZsaJrRDyOlBj2CDWQ0TQdB7DXsENaDN1TTmPu0HV8M0OrSNNuBh96j2x3EumPWiHYb
rWHU0osxDUdKDN7DzY0NI68QYwygyvdMemhwhuh1Bh9BmtdohrwafYdTKHvqIbuiaoHVrXYa+jh3
BlBm67qgZVttVUR6NrWqB3a3qIZuvB1Bm9h1d63olzvSA09RDD0hjIaD0GUGD1rTGQVUCaIHvT9s
ZAN33WiELrQHUGDpoZodXTAQ6DXIaj2HPpWiMaqBYOpj0FVQTqJDvVdYIaRfMx9d6iG7rWmh1MYY
4ZodXg0NR9WQwWMPDvsgn5g1MMS4HCHU1svfYZWfBw6uGaqoAPcDhZWu5pTG13A3deDw0EMPXuj/
1LRA6mXSAytRDhZSFyxr3QcOusyqgkM1VQSGPYY7nTGHCytbHa92HhoOtEFVA+ohld3GPWmNVAIH
UGaqoJuBwsuqdhh68xh7hw61oPkbyJw4WVrDB7IdkCGm9KoGdasEL2qdhmtuiBwsrXrFzXWYNQOq
g4WVr0TUjo+a9CvoaZqWg++GaqoAukGvUU2XXSEXz6VomqBm6long+rAempEIzpXj/Ie0QOFla/t
2iB5961ojWHDrWn6logcLK1/DqDBIBoaCGOG1lnbWnUSAZWvaiHCGPoIeGg9ter9691rTHY15rvd
tfWgtYY9ghrTG1+YOtR1Fr0FVQNqOohj9hw3O2ttIKoCWVr1pjIfDE17rXktR7a7gY+o960xtbKH
Dp1zUQylUBJBVAzrTAQDH1rtrDOIBw3NR1pj7a9XuEFUBLK16j213FVA+ohj60x6jY6DhZQ4e/Nb
WQ0FVQIHOqgJ7a9e0Rr0RkVQLaj0Q7DhuXNRY9YZWvplY9H1ohrSqBZjud3AxFUC2o99EGtlDh71
rQda1hj6Ze7pyBv/Diaw8Lnu2tg0Fj1hlIaCQY2sgHpq+iWG29c1HvWmUOHvRNBa7nQZvTXqOgkG
u5rWo9hldNbKHDoOo9tevBp3Azda6DB1E5mvplDh7Yw+msM5rIMbL0xoh3XAylVEeo96i1socLG1
6CqgAVQMhnXA4dIa2UMPWiGo6UHDc1G3r3bXcDOVQMsutaDcIXA8Eg4WVrDDDc1G5pTX0yhw9601
hnXA4Q9NRVQM6P1pTXYZQw9RD0udhw3GvQdIIawytdxj1oOFluNeqaUlZTDD1XUe2trZQ4bDXpQa
GsMdwOHWrjKqgZ15r0EOTRA4bmoh1NfbXcY5sJpdMbGx6OHCytaqBnStRuXLBDUWUOHvXmtjuBwh
3Bg6wx3GPXmtlVQM6j2x9hw3Llhr71hla7jG1hwsocOvIMdxjuKoGWPUe9ea2UOHrUWNVQTrDHcD
h1RrZVUDOokNB71EOG5qLXr3bXcY9YZSHbHrwYLAHCy3FUDKqh/Sgx9RY+2Nj1pO9aDHuBwkGNlY
yDGGO1sqqBnSmtj17QWPWiGg/RYG0OG5qOiMfbXc+qoHZWvUe9e7aw4WUOGxb1G416czXGUOHvXm
v9wOHVFVCyqgfUe2vUWtlsai3a92HDc07TmtVQOytdz7AHCy3Ne0TUe2vTrlhVRHqPeotbKHCQa9
RVQEqqB/3A4dIa2WxrXbXpwdwcNzUbevdtdz6qgdlsaj3cDnSDhZWuwG5qNxrDO1q4yhw9601/uB
wh6NCqgfUe2trsMtjUQ9LnYcNwM7WrgYbK13NO1QOFluNYd2o9tYZ1w12721tbKHDo7XqOjBh6dc
Dh1S4yqqB9e7awzg7g4bmohwtfbXc04MNla9R7Y7unBwsrWqoHDD1G41hnNYcLKHD3rzXp1wOEOe
2GHqPbXrzWyqqB9R8x9hw3AztUaww2VruadcDhZQ4debtR7awzriqgfRNR715rZQ4WC5+1o5AOoM
BFrtda0QDQaNR7a7Gu6jrTH0QYyGm9KqBGvsMRrYw4dBDBDqIaVqPYdXXbX47GQY+wyg4w4dR1HS
NB1EOEMFjv+aA4+2voOrXQ0CBBj1FjDhDn602wQ1HUQxCCJ09BIMfbX1c6D3DK1EOHUSH7UaVomo
mwx6Rpuo612HDc6Qaww2VrIXNXYA1w4+tet6j219XFUAzJqPaqAAPtrZQ4dYa9RDcDD1drsaOQDH
0pruH6VUFBw3NRudtffWrhhstjUe7gen7uldajca/61cZQ4e0mxr1fzAHpqoYeo9tbXoiqAAOrUe
mPsOG5/Wrlhla7IbXQeHbb01h3aj21/uBjhxh4d9661socOjteo6NY61cPDrSute7a/h3Bw3NRSb
O2vzB1YZWtsvMetMFy4G629EOiFzRPauHH2Hvoneo6oGK16CxsAZQYYYIYOgtYZtzQWvzH2HhpXe
qNZ0dK07WtBRRa7SJmu0ii12vPGPZvs7a3peR/M4Oj9O15jtaiGV5Eho3vonR+na8j3cD5VQIaiG
oHGHCx6Rptxk0rrohcD00Htj10hcseIapohDQWvQdB0HSmNrsB560QYOu2Ni81+ZWMgHuGVf0HTd
Uua0wBtENRDEVQLaCH1qNgPfpiDuagytaY2DzGGyqgA0Fj7D013Uda61q4wBtENU0RjYyAYOg2PB
g9e0ohogfbH2x96V5j9rWlaDpTB3pWtEGvQbHmAh4OdrQ0TSiGiBzkLnTH7SmNVAkGUx3NE8xkNK
IMDHqLB6wH1YIMYemlMYeGrsbGqgS0QOEh3pH2u15EhppBr0G57REfIo2A+umMNAhpQelogiQ0rz
GQ6Y/aIj5FGwH12Qa0NKD0tEEdYZckGNj0QPfR714Ncgx9MbHrweCfiBtN0rQSDHrdzVCF5FHV/B
g6CwW2vohqLX71hFEh4McMENpVAJ5HyOlMBDSjomIMHiHkb17zBpWlaUj8gn5g0QOfxBFFVAlpWi
BlW0fIh9eD0sI2iCKqBLSmvRNb0TVNR1fV2vVGvDXa0j/Wm+0ZNEPNovIr6EO1GsWz1TPYZG+NB8
HwHppWvqqAbZtKDla77H5Hu6wJKqAVVAbGxNlWLdM4dmnh6smlKoAA6zW7Ie7XkOW836kGTaOHxp
4ejcz6UbWGJj0XSkbDLbv6qdj1vT/KqEtNDg1BiVUH3wzDoarpXQeuD+D460piDjbA1Q5bofulNS
qgfTg2w0tVPoOA4NQD/9hlYmz1wNLVdFwdiuB9WGMOXUNK8y2DsTXoPkQ4gwdX6+HUgjpektTkNG
hvIaLqujePgNsPQPjwbYbjWHKG4y+vXLnlVBF8+le8Hxf0oPoOVVAIx6g193W7StKDPYg4GjQ7Tq
qCLAarGxqoD9AbGPpjIB26La9DKQakCDDcyQbA0mJVQlnQdGDHtIqqErWg3tK0oOrSWLwYWpEIDS
9pWr6uGCGCGCGDq+r+0oMdp0HVwwSDCyhwBxBpMVhjVUEWEMMfWgNmlMSQa4duisZBC4ztQbjIQ1
lv0ax1jTT2dnUwAB///////////0KgAl7AAAABeXH7gR//////////////////////+s6OiqoaDf
tMd7Uw6g0gyNIbGHsOENJVQR3rfaqgj1uywkGGyxWGPSr7bozbfZINqQYWpGYrAa4bjLon9EZWPS
roeoZ4et1k0liDFvhisXmzW2TW2zUNf60rrX9bYmgOsNUOtoVUJGYzKqEtP0pnD3VQAB7s93vUCH
RDRiHSQcTGHEkz6SHUHUqgADqDqvvL3wyva5r+m67rmr6kGFq+rhghg6vq2k6tq+oB5d632HkG2c
O3X9K18O1EO4N4O5G0e2HAGkHBbDqSZ0g6tJDXDlxoOA5U24NsOoOANINzRdY1EOXt72k6d0/lVB
Fi2Q0Zk1U0By6gGk7HrIf8BhfY9E9ox2iA0tQ0nWI0oM/tmb9JZoD4vB7n8yaVeD/bNKD06DPDI1
ZmMjpDHp4duknR0rWI8qoBv6UqgA7utmlB8aqGQzMbfpJBhY2fUDs2s2fBkadrDNqGkqoAJDK9pO
g6b5vDCvaz7TQwgwdWVQAaizaSdmOGDpN4NvrUPB79aUxhxtiqAAPdvPpQb1oOWz86elBwBkXWw4
aToM2GPSdOb1VBDG36OGvoIbYaXkdK6Q0q+y6sxkNAvBhRqrAh4+phkagHwzEA/9JZrOnhmNmcBy
huPYbNGQPqpHQO1VA7N2bBw72i6qoHtaToOsXg6jd6WHbpX7wZAYb30NR1XWMWWJmt9XvB1G0S8h
qPtV18MKNJZg/2rSg9PMQdRu7rC4bfQfTSxsWrKoAGQPRi1DWwxWbSY7DqM2BnoajpWVVA5DRnQh
DWA6jWcNgaTJbMHx5qsQzJaw2KoAIYg6jdhh9aDpobDNqodRu2Kz2x+1a4QtaFZVUEs5DSQ37V+6
wNxAOTR7jFj9hFFVABZYlVAOvmt2UUbDBd1jCLQxB1G7fDEiGe03e7wfHWgWWIOo3cMwaqLDagP+
+GC6NzTw4PaiGZcD3vuGiGexaPYDD1VqbX1HLKGexZDRag94DSam1iPqrA+n6tatatp4e4Z4dQeg
Z7EwhhMxmJqbQxdBfUdJ1FPTwz2IPQPfTwz2ptYjB1MWh6frDMGK3WENND3sBnsRDTQ6g9NPam0M
9i0/oMVmN3p4Z7F1ough7tTbp9whpJg6gz61ZiDFDR0a8zBnsTPpOraSqoS609VQWYM8OoPS8GRp
QYZmJv1liv6hpti+xXgzw9A9etPDPVUFmYjB1Mli0GMGGxN+s+P5G35jaGpi7uhnsSqghVQSxBhm
0S+xsWrdI2tJNeZQ9NPDPsGDqDP04ONiYmzUNJ1bu0xsQemoaeGfebGIwdWjBkBnsWo/YtQ1DSdR
0/WPdaAYOoM9v19i+w6S1aP7SkGQPT17Twz9WYjB1BlsWjXWogHoHVoOjmQsMbhoh1B6ae36iGex
B6EGo1jRtCDC6DIDADqN2gHJp4egaLFoBg6gz7DEQD0DqDFRamXSQ0dW0MyGnsPQZ4dQejFo39ND
DMxB6MXg6jaHq2Q0YtXkNS08M/VmIwdTL2GiQDDYg9A6vaGZq1Fi0bQtJDqD00+tWDPYg9GLQkfp
+0pq0qQ6jaG1Pp4el6A0rRg6gz9RYmIPQOpksBhsV7StR7M1afpjUGeHUHpegMxkDDMxB6MUh1Gz
qNhivaUHo1W9PDP1FiMHV4MhiZQw2IPQOpHTDNWrMd9sDEDqD00+3qIZ7EHoxBhm0RkYtRseDqNo
bVoAaIe/tKZGJtakGhhYw9A6tJatDVQAMOlB79mag0WK3qOjNrUGTaIIeDCDqD00/Q2oM9iD0Z2I
2maeGfqOphhh1Gyg36eHoxMWm6GYOoM/UWJnD0DqDKamLTwz2LVtMMhp7fqIZ4dQejEzaOxGYg9G
cMUOo2h6jqenhnsTEHohe08M/VmIwdWm96eHQxM4egdWjaOZCwGexMQYQdQemnt+ohnsQejOxG0P
Twz+rIYodRu0A5NPD0YiAYGhmDqDPsMTOHoHUGVqzFp4Z7Fq2hmQ09h6DPDqD0IBgaGgZiD0YtND
qNoera5p4Z7EQD07yzBn6sxGDq07Q9P1lBiD0Dq03QzMWohnsRAM4OoPTTw4NWDPYg9GJA3enhnt
T6WHUbQ2LXdPD0YiGnZMHUGfqLExB6B1BlN6GnhnsWo9mYtPhqDPDqD0IBi6YgZiD0YtLDqNnUW/
Twz2IgHoxanp4Z+osRg6gwNDfqdJ/qOnZ61W4x6fomnhnsTEqoS0+5pXutKvh8MDN3hJibWq1oaD
HY08M/tg01J/MXTa2M+pefT+g4wxGrQ9KamjRNSDPYmCyqoS09j6bdP0pq0zwfDEGFp4ZCV9j8ha
6bcMTAbSbN7zVm31Y0LzLp7OxXWKA+NP1AM8OoPRgu6OgZi6u2/aNqWk6i36eGexMAemgqqEtPDP
D6sMRg6jd6eHIho4djFf00P/UMaN5gsh1B6aeHoGexBtqqC9HQNoenhn9MLph2tmnh6MTOGLoZg6
gzw/2Bi0e6qoIR1JDTwz2LVtJDm/p4fQdgZ4dQejOGLoaBmJVQVfYDabfYdW1zTwz2JnD0D31diD
P01VQkxGDqDD0PT9ZQYLRtJDtbNRDPYmcNMOoPTTw/2AM9iuqqCGBA3d6buoKqCO72t6L62qoLVU
B3g5bOqqqCQz7Icobd3JAho2lara8y4DHYtQ0u1qx9K8+itmsaf2hqAdhDRmNjIMLHYIMLGgQYXf
rQbRq0pJnZ3QtQQx2x6KgwuGL1p6qAB2PQtMfRUO2PRUGF0A3mMP9j0kOK6GlpUVeVUJBg+9bvBi
qqCQzw0FVCVu8xXQychyhkn0rRg0bVgNBqgOcPgNLVcsjFR2Jn1nsMKyzNUMesd6gqoIvtcB69Bx
6/kM/oOmwydM59K1U+lMjZo2lBnhiqqEtP1C/cvKqCL4ZOQ5dKpjDltB8Nwauq3bDGy2NKDP0pk1
K7pSqgHUFUB9rRdVbNFuW+tGg+qhpHwxWGXzGy4DCve0q77SrnbFeRVUA6VfDtDJIaV7VUI18waW
lW2Biv6ppTFca9BDibIbyDC7HfD4DSYrV5VQCixuxsZtf9pSqARjYLfaKCNi6xMfmJVQCixuxsZt
fbA0mKwwW+0UMXWpj0pi0TVsaHa0cODSvaVpQYb00I0xsF9jYmQPTWGZlY0G5nIaOqoI8QIW9PDs
s3WJjQRcP/F9VQU7G6GoKqCL4dvbHWjaqgHBdQ0O06qgixouoIXNGQPqrLjCLGhc8j3bY3Y9fVUA
2zMfaKFxg1ZrZNJ0joMgP3VsyxkGGG8PsPh9PSYw59KhHdsqgW0hLVVUEBDRrCqgSwGBYIKoKbFj
RiBBVAaqggsWFUCzLYIENGVQGqoILhBVAaqggVUGhwKqDWWxoxBVBAQuWCCqGmwyqoRAwOPNVBBY
DgVULKoBLCqCCwqgpDJsEFUFNhVBAqgWVQQECCqDtVAaQDAZSGjaeqhEVUCELDKqgWDyZVUGSqDu
wqgNuBn6Cy2FUBtiwqgpVQG2LFjVlUJ2jB5KoMg6Q8lUHaqA0gqgNVUCECGjEFUEFiwqgW0bT1UH
aqCkgqgN0ZVAaH3cIWAwLCqBZVBA1GsBt6NcDA08MkNsNLRmVBEMAhYDpayCqCDVWtVAMqg7IaMq
gNIB0qqBLGjB02NGsWFUECqBZl0ZVAboxC4Kxo2jMqqBawH3YZSAYAbdiwqggsWNWsKqBDasQYSC
qBawQIMpBVAaYgewqgEVQ5ENGZdPDbsGsEDKoV1UC9jT9G09VCuGSGk2hkhth9821lsMrLo1wNIM
lVAIqgEZdP0awG2G2GSGSGSGSG2G2y2G1l0YNsMmxY1NVQJp+n6NcIEFUCzsRiBBVAbYsWA8lUAi
qHI9g2FUEFixo1hVAIqhEZWEgdVBlcZQ222wGSxIhksrKQqLCGq6eQ15r14hoxC4qgNZVUBtzRrh
CwqgEVQQEFUECqATRmVVBSGlp4aSqCmxYDysKoIG242qoICFhVBAqoN1ZVQaqgg0awykCBBlZQ0g
29GDbDSIBkqoDbCqA0MllsMpCwQZQ6VUEBBVBAHSHBYVQQWNGsKoICFggyqoBFUC5BVAuqgEDSDJ
IBkhpBgaMy6NY0ZlVQLB06MHSqgW0YNLRmUNtVAbowbaqAQMkNsNsMkMkNuxYsBtkA+yDKQD7DpZ
SAYFgMAgG2qoNDyVUGhthk6MGSGlp4aQZLKGkGAGky6MHkHkqgNIKoDQ8tSbA6Q+1VAgeVhVBSGS
y2LDCG3csKoDdP0YgqgWIMpDRlUHaqCllsENPYTECDLp9wgqgyVQLELCqCBl08hcDJVQd2NWIWLF
ywqggsMpCwy6NYZVVBqqA2wqoEVQCasQsWDGMQDgIXLGjWLCqCDRrCqBaxo1iwqgNsWLBCwqgpVQ
iXLBAgGAG3YsKoBLjKQVQZBk2CGjWNG0axc0YNuxozKqgNVQLBpBthkhk6fozLYuWLFgMmwyh0qo
DQ22UgqgNsEFUFKqA3RrCqERlsB5Bk2LhDDBYVUCELCqA3RtPpisKoDVUGVywqhEIEFUIiqA0PIg
HSHkqgWVQQWFUBoZNggG3p5CwQsaeqggsWSGjWAwCBCxYVQQELli4qgXDy1vyqDuxY0+xYZWFVAa
qg7uEFVBtiwqgpsWLCqClVBAqoNsBz6MHSyqqDVUFIZKqDshYuMpAhp5BVAsy3A6TGPYDSVQGhts
qqg1VBSysoYDLo1gMm5YuaMQVQLWFVC2jWFVBqqCmwQIMIdLKyhgEFUAmn6NoyqhawQDbuWLlggq
oNVQU6NqzKy2AyVVBrKQYTWDB0qqDVUFNhVAbY0/RiCqCmxowYBBlZddDJsaNfyqoNVQU2LHPRtG
IWA61VBqqCmwc1gwbdg1nBAyqhZVBAa4HT9Eg1tSqASwxMCCdhVAsqggsaMY9gMBVBSQMQwgqgWs
B045nOqoNVQU2DJH0bVgwFUGVgMlVQIjkx1VBqqCmwaxYIIBgKoFiCqBZrN5Zg4FVAgZbKHloxAh
p6qDvVtG0awQuKoBFUEAYDKQbdW0ZVCuqg70Ygy6eqgEVQQaMqgNVQdht8w4LHNVAJp4cBDVlVBq
qhbVtGZdPDJVQU6MqgEVQQBgaMysthl0YODVtGVULEA4NWVQCKoINGVQUqqDWVlDgDJDJDADAIBg
MpAhq2jaMyqqDVVCwcCqARVBBq2jWOYYAZKqCmwHBq2jc2URBVAIqggDg1m5qyqClVQbqwbdjRgw
FUHYZKqAQMnVtGDAsWLGnqoDQ4AyVUFOrKqDVVCzK22LCqCnRlUIiqAS5oxBlIaNYZdWVULXFUBo
cGrBkqoKdGVQUqqDdGDA5kLFxVCIqgEuVzIIMT6vrYcBBVBBq2jEFVC1ywqgpZSBCxYDSDAsWNKw
2qqFg4NWDAVQUqqDdWVQZKoKdGDSVQGqoBLFhl5kNGVULEA4NWDbVQG6MqgpVUGkG3VtGZVUBoaS
qAQhY0YOAOnlYsKoKVVBurKoDQwNG0ZVD2qgEIWA8tGsGSVULaqqgNDg1bT9GVQUqqDdG0YhowYG
jKqFlVBoZOjKoKWUgqgE5sqqg1VQsHBozLq2jKqFtGDAVQUhgEGXT+ZCwqoNVQU2GUMkOBVQsy6N
YVQUqqDdWIaNoyqhZVQaGkGkGBo1hlsMqqCllDgZeerKqDVVC2jEAyWWwqgp0ZVQtcDSVUGqoKWW
xYZfENbZVUAgcGrWNGVQUqqDSFhlVQCWLiqhZVQaGkyqoKQwGXRiAZNhVQaqoWDgsWNW0ZVQtcZQ
xMMOjWLAfejKqDVUFNgMBVAIHAqoWZWXTwwFUFKqg3VmXRriqhZVQboyqA2xYZbDLYVQUhhPZ2dT
AAH///////////QqACXtAAAA+0IFaRH//////////////////////wHAH3Y1ZVQaqoWZWUMnRrCq
CnRlVC1wNtVQaqgpsMujWGWwqoWDAVQGhwasy6MqgpVUG6M22A27FxVQsqoNsBkqoKQwNPIELAaS
qg1VQsHBozLq2jKqFrlhVBSy6NYZbDKqoNVQUsoYAbbKQZbGjWFUECqARhZSAYCqhZVQaQsB5WGW
wQsKoKQwGXRrDKQVQQKoBOPMxmtlVUGqqOlVAaqh6xq2jKqFrCqARVBSGSHBqzKG2qggVUGqoKbA
YCqCAOBVQtozLozKqgpVUG6sy6NYVULKqDQyVUECqAQODVtG08MlVBSGAHAGSy6sqoNVULMoYGjK
oBFUFOjKqFrAaSqg1VBSysoZIcGraMyqqFgwFUBocGrafoyqClVQbysBwBtqoBLCqhZVQaG3oyqC
kMAhq2jMoZKqg1VQsHBozLq2jKqFrCqARVBSyhwatz0/RlVBqqCmwGAGSHAqoW0bRlUAjKqgpVUG
6sQ0awqoWVUGqoBFUC6qAQODVtGsMqqCkMAOBl56sqoNVULaMqgEZWVVBToyqhZlDbVUGqoKWWxo
wcGraNoyqhbStOT1axoyqClVQaGTYDgVQLMrKqoWVUGhtsqqClVAIy6to2jBkqqDVVCwcAZNjVtG
VULMrKqgpsBwatYDpDAVUGqoKbCqARVBSHAqoW0bRlUBthVBSqoN1Zl0ZlVULKqDQwFUEDKHBq2j
MthVBSqgEDg1axqyqg1VQto2jBksqqCnRlVCzKqgEVUGqoKbDKGSHBq2jaMqoWVQCKoMg4NWZdGV
QUqqDQwGU3NIhoyRiHO4QIKoF20ODVtGVQLB0hwELGjKoBLCqBawG3o1iwqgp0ZVBAGTzVQQBkkF
UCwcGraMG2qhEsMPNlsKoBFUEFhVBAGkG3zDgVQGqoKQ0gyVUEFhjO2hpatowbdgOlVAuQVQCKoI
A4LAZLLo1hVAtp4cDaqgpVQLG5sPNVAIqggsaMG2y2LgbbKGSykPMyCqBZVBAHBfYWSwqggsBwEN
WVUGqqFg29G0ZVAsqgp0ZVAIqhy0ZlVQrhpWGXRg4NW0YNtVQsqgE08ODVrFjRlUFKqg25YDgDJV
QLaMqoNVQLaMykCBC+gG2GAqoNVULBwKqFtW0ZVCIGToyqBZVBSyhwatzZT/IKoDQ4FVC2jWFUC7
KqgpVUG6sqoNVQCaNoyqCAgGAqgEVQLBwato1ixo2jBwKqILGrKqDVVC1hVAuyhgKoKdGuKoFg2w
0lUIiqJexY0YODVtGsKqFlUAhAODVlUIgdOjKoKVVBobdgOBVAsGAG3YDSsEFUBrLq2jWA21VBqq
hYOBVQaqgE1bRlUEBANsMBVBTYscyGvENea2tVCdoxAMkgy2LgfaqhbVrlgOkgqhpVQCWLBCwqg7
VQZEFUK6qFfT9GVQCKoO+dhVAbYuaeqgpsBk6NYMQIMpAxrBAxCwQMawQYXQOQ8h3nUcMJm1jYPW
DNLCQYbHMODRmEzLxsMLK0msGaWEgwm1UMBVQI7tZDVrCqCBVBAy6eqgX0bRiDKQVULasqhEDpIM
qqBaxxVQ02OJC4QVQdqoBOaqBZVCJozKqgNVUCaeqg7VQr6MGBYVQZKoDdGVQQKoBLGn3AydCVQL
KoMgySBAgqgWIKocg21UBqqCkMBla7FzSEtVVQQMthVB2qgNsKoF1UBpCwGBqxAOkOBluEGUgqgW
4qoabFiwQDAsKoBObKqggsXLCqBYgqggsWNWsaMGAqggsWCDLzVQUqoO7CqCllIWCDKqgNVQd6eq
gNIaNcVQQKoFiCqCAhp7Lo1iwqgWsaMqggsMqqCCxYVQLEOLLYZVUHaqDJlDAVQU6fYIKoFrDKGT
YsaMG3o2n2FUEGq2CDCZVAtY0/RubLYVQQGYTGVQUhgaNYZSCqBYgQIGIKoFrFgho1iwqggMwmMq
gpDAsafo1xVAsQIEDMoaTKQsWLlg2rEFUBqqgSxo1iwQ085yFhVBkqgWIELGjKqFgyWVtMawqggs
MpANuxYIBwKqDblhVAsYxBhIKoDVUC1xhMwmIEFUCxCwawyqoO1UGSqgSwbViDCQVQLKoKSBjMrC
qgNVQdqoICByBjaMqgWVQQKoIDmYTBgWCCqCkxAgbRlUC1gNvRrGrELAfdixo+LBBVBBYsWGGywm
VQGqoTrBnlit3d02xubikbbFNF0TQFMaLt2xBouTKgnuq0AVRou3Rec5VdTls19KLqUoW0BSGi5S
kWnymZ6LoKf41aLhQaLoqUocoht6g0XIUBKZSiBWaDaoKgqiaBVsUpFLte8inqvqXpT1QICkykak
0Whvougp5BLRYtXVbouTcocpGdRFIFAtdQVQ2Y17lKqUUEuzxpqApSjVEt9pT0XIgQTQVLvKhVPG
yoW7ospKlv1ulUatKykVSmqgpKVRRKBnouhQoEpPNFyFJoJ8zdQpvRd6BRTRdzYg20XJVU0FBoCq
BAUDJrpVK2KFNzq2c6taaaCigQNxSjcogqdtqqSCl1tKV60ypNrVUlQb0KhHEFQlJYgnVCBuQNKi
DvW5ubm7vd0FQIKp63fQqdrqFplKZTc2yigaWmmglVFRNxSiBBJsKVqopOrfqRqafaeFIfQoFHFB
73VVApJslUqChtNpKb0Xnei8ym1Glp3QbtMpTQFCN1JuKE9BouSpKhqTRckmyoik0FQUKgQTQVSU
KUCULVNW5tUdQVHtuUI0+0lCbFPFPICninqMqei5at0XLT0WMUjMpHRY1SoOlMlIFM9bmhuQNhSt
IpVsDVNqDdhSRT5SBT5SQqMVGKrnVVXU6qqrqCqO9bm7tLKXdr0XbR0XbZQPdFxlMICmNFx0CiKn
KIobtxSdStNSlJlJBuBSWVFUmNmVJUlUFA0WtrKTKUqKei5OKFDFIUyniiVCm5tKCl9QFMoCn6ra
VEDYUqgqGhMpalSEkDTVZSFRdQFA1BvVZSG96Lo5ouYb+g4UFVyCbYUDVtLfqCr51LouMpAYgq61
NF21egKQaN6uQaLoqqrdyl2opBBSm3FBjepP3q0pCot6rwpAVXhSFOnitU1S3Tp1Q3NFKe5SA3Dd
nCgSnig99FzFPIJ6LFq4pAplq6gqfcp/2ndAga6t3q5uaW+98KYKQptRTc2qrqibCgWuaqApMoRB
UFUNE0DTTqG6uymoKqq2q9F0boClSkN2mqqlo+UvouQpMomXWmVUVBSq7RdtS7ilVQ0XNTqmpQUs
2FD8KIpAp3RcaChyramKJqCrZtJQ8tykN8KeKG3KIpDlWzU0XwU8UsgKQ3KVb0BQ6kiiKQ3pKFA7
lK1RMpRoKQ8oeVVtJSe5SCDRdpRFKRQNWzQN9SoKSkrkUOURSzOtPtOi5NF0KVRugqEouou0qtKQ
KIpBWnTKV3KIKIpApDfiBvpVZugq3coLuFIVBSQbaLuKNKGKbqDb+Smq20tykNF2lMZtvNA0jcof
ZpKQKIpCqqsKQwoGqFQUuUSClNykCiKQbt6tmg+ZSrZU9U9bala6c6lbCl6gKJq0oGVOVTNJSjdO
e1SlAybatmUugaSlG6VUVB9S0m9oqUpcoEogocoGTdUJSFKRSjdVCs57z7UpQMihyl6lKBKUbpUi
iKXalspCqEG7ZZS+5QMm2yiCh6lKUbigZUaoKQpCpSgZNBS5SjdUpRCCpqRRBQN0pVRVrdwpAoGT
dlLKRSdSlKaLkKBKIKH4UEgVpSaqkQU6rvdBLhQJQ5SJSdSlAlKaLklSKI/agqgaqk42boNrKHKN
KC0XbVJQMimygkCtIVBOVINgyoaiqUoepSgdqRRBQJSGixZUquKB3pFLTkUPVdSlAlDVdKkURSKC
KBlMpKkUDVe5T9SlDjekUQUCUOUxLcpYohulJRBJuKHp1TUpQLRKkUQUlKl2qG0ocohXlKrd9ilC
iCh6lVmUDIodtqiltSVqGWxRFIVb9SlDlKS3pFEFA7ybShyiKWVQg3KUpIKVW1KoUCUQUPKllq0p
FDoJlEUu0qpKUqGZR9WoKlKBpSpFEKApRuVQFDlET7SqicqW+FEFD1LVlIoGRQ6Cm0CaiCVSAoik
2VRVFSlD8QNKCkUQUDOSAocojfdWXEExSqipahkUCUQUPxA1+rSkUOgBRFL57y4gKHqinUpQM5Ui
iFCgpVQqgKHKIbajpVQ0TqDrSUQUPUtOZQMih0CtIfKe8yiKXaoqspQpfdB8m4pSTRS2KHKIbpVK
UhTQFLilVBSkqc6TcUpkm2qSiCgWuoZFAyKHbylKVR1KUDNSoyiKX1arUpQ8qVPtIogoGcm8ocoj
bylKlKBk0VHSq2pVZlAlEFD0m/hSlKRQ7e0lEUuzUqUoGVIoerapqUoFolSKIFStRSjeUOURQ5Sq
3coGVKqCiCh6lVmUDIodvKUpIKlKBqWpCiKQq36lKHk252kUQUDvJvKHKIUqApSpSgZUkFKralUK
BKIKHbc7VtKRQ9KmURS7SqqpSgZNpQ7RRkUDSlSKI42VK3VbSKHKIp9pFKTKBk29KIKHqXKRQMih
6VW0hUpQMqj6URSbClBUpQ8m3n0iiCgZypFDlENqtW1KUDKYpFKVKUPIoEogodtp1HVtKRQ9LpRF
L5q1KUDJtKHKUUqUoGcqRRGdqqbdzRcpSGzTtOqqgqUoGWaLGqXZAo2IKv0XR9MVU2SbqpqwoSc6
lKBaPKX0Xeogk2N3Slak+pSntFitNU1YgKAo1BUhQMvb9FjVVNsbqlQVS1KaLoyoalKCbKvQSbG6
qpfS38obeqbaadWIJoKlKF2qSV6LoqWqygSiCh/beVbSk2FPt82mpN5q1KUDLyh6vpVKUDoulqlS
KIQCpfq2mUXlOyld96n57cUQUPUpQ5QMqsKUp1bSQVKUCpyq9Fx1dUpQ8m9p7SKIKBKCapU6pKbb
EFW1KUDKlmi5eVKUMUsUCUQUO3tPatpS0XC2fSKXqmnSqqpSgZN5Q6DRfxQRQJS+ixpUiiKjbKlb
qt8Ut9Fx1dMoGTe0FEFD1KUE1FAyqkpv6tpCe6EpvRefdFyFIqNJSmi8+FPtNQNZQPlPlAtmi6Ci
OIKSCoCkGwpgoWjIoEp2lVCDhRJSnaiKA5LerUFJAgQUkCiCkgkgpKBB3ecu7VIgUlUvFL4gKBlS
Uq2pSkFECApdRAUDLiAoGVJSRSdMoZvqvRcJS9RoLp8pVaoo08qMoIoGr9FjNPM30XQU/SQUqtKI
nV80HCiWmoG30Eim6ol2pFah/lRTKYqLRduxTbZPRcVApPRYpTFlLt5Szc3TKV6gqCqEBSVOkgQF
A1HosapVdF31Hwpts0XQU+gQTQaLkKI0XcrVrTvOaBqQFAoP0XDVKDRdtV1aUpUHSlLaRSQVRUDT
VFGUkE5oKNQ8UQbzQYglxXRdqCr9FxoEG9QFPICmMaUGwlQqxBLKFU1D2ykUFJRBV+i6GmXNF2qo
FECDCmFEFVTG1QTlOe8pqS0XaqgUQIMKY60ykNqgnJsHZoJVRkqlbKua0CiBBUxRNBpmgKYFQTlV
pQ9RVDUqCTb36BTbSgQNNSlFtO+IJTUKVxsKWUQKS3Kbq/RcfECBpqAp5r3lUrYoU3MpTeXWmVUV
Agoymglk1UFUIFEBTGi7dsQVBOWClQq3GhSoKmpVTPdBSuq9F6aLoUqqaDhSNyi8vHviMXvEsL1a
Lu0VQJoscoTRfFPRYNAo+oKroINF51BVFBpQaKoF0XjUFDRc1OggQaLB0XbovGqEBTWi8dFvlK6L
fqeoChylNF1IKRQyDRc1AoTRVC6BAg0X7QKV0WwVKoaLxqDRVApTNQINFU9nZ1MAAf//////////
9CoAJe4AAAAnXEhuEf//////////////////////QLUGi8dF8aLxQNOiqDNF9oNFnUylNFg1boqh
co9BUFX6L40XxUmi/dFUGVBouSoCkqRQlDRclQVBourRdvKoobaKok0WDoqAzRfui69FUA6KoM0X
3T0XaUegqfRYO+i8ag20XMUAUZoqgzRVAu+i+9Fg6KoP0WDVCCqKNQaLm0XipKoNF76LopaLPKc0
WtoujRdVEoZpUqZDVFWlCINF8FCFCaKoF0VQYg0WDovvfRdZR9DRYOi61aFUK6Lx0XMUIUBoqg/R
YNT1QgqDRYOiwVdF8VBosGqKiQUdF71BQ0XnUFQVRUBR4KanU1T6L44gQVEg0XaogVqBAU+g0WDU
pRmiqD6gUqBBzRVEei4tijNFg1boqiPRYOi1Sm9Fo6Lj0VAIgKQKEqBtKGKLpaLY0WjovAp+pSjN
Fg1BoujRdGi1tFraLW0WtoujRdBQlQFN0dF0aLo0WsUI1lLFHlOFGaLBqhBU+i+MKAUQINF21BUF
RaL4QFPq1ApeiqEagV0WIUI2aKoXqOpkCui/aRQWi49FjN2i0amUqUobRdSCVFrV2KMqdAUIgqfR
YKClovsoTRfdLRYNUIKgbNF7INF7Nmiwal0VQLVpRlW6KoFqCotF8K6Lxq+qKv0XigqDReOi36o0
W/ovHRYlCp0DSgqcoQpiq9Fg1WUwgKZ0XJUGi5CmShKgqcpThSlTlE6LqQaLqKJKVqDReJQxQ5Q2
i8XagQFCaKoC0XEg0XFoqgLRdRTKApnRdWizyiyhikuFJFDaL4q2pKt0XxosfRbHdtFtlOd0XRov
DRaOi6NF0aLW0WtoujlDmi6EGixkBQiDRY2i66kQVXUFVoNFx6LW0XdotbRcei0SjinikijCkini
htF1aLP0XUUMUXovgoXRdtPRdpQqm2i69FjFH6KoBV0VQKUyrVFQVNVbc1aLk0XDosGp9F8IChEG
iwdFUGaKoFqWggKMqZRBU9SlGVQg0X7ovhA3FO1KUYgbimdFUB1BVGzUUI3NWi+KBQiBuKE0WDUB
Qmi39F21AUfoqgKqL41SUCApVA3NxR9QFCaL40WDQ0XxUBQ9QUNF21BQbratFUC6KoXbqgQINFn1
W3NTZSKEvRfpTLUgKL5Umix6lbihNFt1K10NF8aLk0WxotvRaOi1qvKBVam5uam7Ra1AoTRdei5K
rKEQaLkqBBourRdpQ5Q2iqF6kqDRd2i0aFJBypKgKPuhou0o4oyoanatF26L9bmrRVC9ToNFUL6L
k0XxT0XXoqgHRc2i8ag0XIUzUDTovOr0FBB0ozRfBQlQINFgt1V2goNWi6anbmqkU7ovhq7oqgqq
FdFw0NqjqbRfeiqDGluQaLfaqo0XJUDdVGi/tF46LfoNxR5RRQmi39FyaLB0VQ8gqCqChLd0XC0l
Pq9KKltu1aLG0XJVZQmi39FyIChNldFg0CmW5qbij6n0XNUGi2NFg1Bot/RclUIEFTaLrqQoSq0G
i5qvKH0WDotioEFVtzU3NSDRb+i5KgqgolWoKei3yhEFTKWoUVot/RclUaLt2KM0WCg0VQLQ0WDo
sRBUtRlAlM7FA776Lf0XJVFQIChKkptRQ+i39FyVRvtUChT3O1DQG2i2NF4ybtF2ttFA11K2FCNN
StFLfRfGi8digdt6FV6LzQbIKDRouagUVsg/fRb+i5KoUyZR9UVXoueqO6Lda99t9Fv6LkqhoauI
Ghv0X1U+i+GygpIpUo/Rdaui+CianadFw6KoeqjRYOix6DvdFUBaL2QKoKoqjRYOiqI9FUPaLBqe
pSjNFUBaL20WDovvRVBmi20BSvEGi7KvKVqeqNFv6LYqjRYNMoyotFyaLB0VQFovYo+pChFeK1CU
rVGiwdFsVOUrVGiqAtF7aLB0XJot+oW0pUoSoijyj0BRNRVOgqjRYJQ1RaLf0WwUroqgLRe1UaLB
oICj6i0XJVBStUaLBQT3qfRVAWi9ilanpaLh0XJot+qNFx80WCUfoqh7RaOi7qiqjRYOiz6HKFW6
LkKVKZ0VQLVGi39FsFCFK1BUGi5NFg6KoXbKRQyCokBRFQFCVRotioNFyFK1QUzoqgXRYOi5NFv6
LBKFQIagpaKoXbKQfQNBQEigigSlUGi8ao0WDU+i2KVQaLkQNKCoOaLq0WfQoNiCqNFsFK1QULou
TRb9UaL90XVosHRbGi7WznKiQINFg6LYQFK1RVei7dFg6Lk0W+gKVqjRYKpSWi2GxBymUqUU7UFU
aLk0W/VBTVV6LBqTRcRUpDVCDRYNQKaLH0WxUui+Claoq/RYOi5NFv80WCgKI0WIUNotjRb+ixea
LkKJQaKgHQVFot/RbBSrWrVGiwdFsFDaLE0XIUKgqQoxAgo6Lf0XJVBRJQRSui2Ki0WDVGi5NFv1
Qg0WCUNotjRb+i3tF1aLEKG5UXFdFyFElKqoKo0W/otjRYKAoaoqg0XJosHRbFLRbGi39FyNvOVF
QsoAonReBStUc0WDouTRb6lUVEU/UFLRbGi39FsNui5NFiK6LBQaLboaLf0WwUrzlUaLB0WxSqls
pVLosGoKoqipNFv6LkqjRYhT5Sui2ChKlKMKF0XJot+qFdFg0tFsaLf0WPouuoKgKEqBWqNFyaLE
KVqiqKo0W/otgoSpan0WDUGi5NFg6LYpaLb0W/ouSqFadQFCVBotjRYmi6ylaoV0WDouTRb+iwSl
ag0XnUFLRbGi39qn0XJosSr0DTtotXRb+i2ClaatUaLB0WxSqDRciDRYNQK1LUOi39FyNuixNF51
FU5QlQaLBqDRe2iqAqmbUBROi2NFvoao34UJUFT1RouTRYlRaLBqVVBovbRVASBBJSoaGi39FslK
1RVFUaLB0WxtoubRclTlK1QqUtoqBzRb+i5Ko20XiUrotjRYNQ1I26Lk0W/VCuiwdtFsaLf0WBoq
gfRcxStUaLBq+p9FybFK1QrVGi39FsVCUTzRc2i5NFg6LY20WVot/RcjarhStUaLBqHRbG2i+Cla
oq/RYOi5NFv71QUq0aLm20Wxot/Ra/NFybIKo0WDUOi0dFv6LYKVa1ao0WDotjbRc2i5FSlaoQVe
ULot/RclUbFBFK6LY0WCUNoqAdt0XJot+qEGiwdtFsaLf0VAhov7RcxStUaLB4rouTYpVVBVGi39
FsFDaKgHbSidFyaLB0WxUOi29Fv6LkbedKVqjRYJQ2i2EBTWVRzRYOi5NFvlF1QUrouQomodFsaL
f0W226Lk0XMrVGiwShtFr6Lf0WwUrVnKo0WDotioSidFyVQUrVFUVbU2i39FyVRoubReZSui2NFg
lDaKgKqjRcmi36oV0WDUOi2NFv6LK0XiUSUrVGiwVao0XJouYpUpyqKo0W/otgoap6nKJ0XJosHR
bFQ6Ld0W/ouSqFaoKVqjRYJQ2i2NFzaL/KVqhXRYOi5NFvlEtqiCpEPaYQIOoEBTtXlK1RosHRcx
RJSqCoNFg6KoCqDRfFDRbeix6oqDRcmiwdF7U0Gi4CmUGi+Clao0WDotvRVC9CpnihKg0VQFovbb
RVCNW6LbQFK6Lk0XVotWnouCoKq+r6tqjRYOi29iiSnUGiqAtF7FK1BT20WDQ0XMUYUqUrouTRfC
j1TINFUBaL2qDRYOi26h5SqsoSnsg2QNOi5tF4lKzqWdQaL4oFKoKo0W/otjRbZQ3Cn9FyaLB0VQ
FouTRY9Q6Llq3irWUrVGiwdFt6LY0XjVpStUVRVGiwdFyaLfpVQUqUEU/osfRb+i5ihqiqdAg3qT
Rbeiz9Fv6LYKV0WxVGiwdFULlM6LHKf0XIqUrVCBWaBBou0pXRbGiwdtFQMtui5NFv1Rot8pjRYO
ix9F41Pos/ReBT5StUaLB5Qp9KV0WYUNVGi39FsbaKgZbdtFyaLBqDRfGi29FsaKoX0VQLznSlao
0WDtotip0BStUaKoXKJ0WDouTRb+izaoKV0XJtotuhotjiDRdqtUaLB20VARot/RbBSui3ymKo0W
DovGp9Ft7aLkqjqBBU6AoSeiqNtFgoCmUBQlClosbRbFUUqGi66ei5ipVCoEFQaKoM0VQiroqgDR
dxRmiwWzRVDyDmi+6gpaLh0VQLsUzU9QKIKnKEQKKVAgU5UCBRSoEFTcaVRyiqrVtCplG8oKpeVA
orUyCpqKApUoeplChEFGpihFVKgUVqZBUynNFiaLVso+ZQxSVQaL40XiUJVpTuiwdFgoChEGi2Ko
0VQuUSgKE0XNQQaLmoIEFUINFUPFSkGi+NFUL6LBqXRdOi3SjNFUGaKoj0WDos6oNFUBaL70WDov
Fs2KMpTqrRfWi/SmUCCp9F8ICn6g0XJouqq9qiqIoHRVAmix6g0VQjUlQaKoM0X3UBTui7UFQaLO
qhAUSUrUVUIChKn0Xwg0XNQqCoEGizqoKlIFdF587Q0Xwg0XjVFQVRUGiwUGi8agoIKiQaKoF0VQ
ZtoqgWqkFQIKl0X3oqgwozRfe+iwao0XjouZBovHcowoTRYNQUNFzVAUBoqgWoChNF40Kg0XwgQF
CVAUJoqgzRftS1XovMoyoEGi5qg2p1BUBQGi99F0FObaL4KEqBBUymi+KBRmiwUBQlDReKlTKKaL
zqvRYNQVEg0XMg2QKINF8UKgQaLBqChovFSplFNF51XsUZosGqNFzINkChQui6poKgqBu5Ipqei5
Cj6g0WDUFQO6LhV9A0aL90XM0oKg0WJotgpmo6oUUoaLxKEKCqcp+oKgQFK6LfpUNFzKKIKmqfRd
ui+KgqZSplEFT6L4QVAo0VHoqgzRfpR9BQpqdTVPovjRVAqBTlR1NovvRVBmi8d1UCihQGi5tF46
KoF3UqZSq6CDReamyBQoDRc3NF76LEoaLn3oaKgE5woq6gQaL4KEqihU1CplNF06KokugMe8RJb2
RvGryl6rVp780XDoukogaLwplKlEaLppZUTe3/U7bR0Xhou+oqhq6mUXTKdKSKQspBuKIaNF3oCj
qRT1RFLaLlbilNFw6LGaqu0XDdVVWUkURUHKhqIocohvVb6eFI1XUSJvKT5ouyqimqiqEpMpAoop
pqKRKIKIKZm2XouHyiKhq6rv0XT+i7G+qaiKB0WQ1FI1XvMpqoim+bt9Q1G26LtqIpEofeq6hQaL
oKLqLRdOi+SiG1vmgqHZuk3IPKSqner9ptlQ6KoTQFC01UBQ5SJQvKr30WRounRcPNFkFIUtF0lI
N7a3aLtQc0XX5RxRHOaL6aCiNF0aLpqCotF87fU9WFEFEVJUJTVKosvRdav1FURQVBqqKpKiQFP1
bosThRVVVe2UEFQUWh6o6iqHRdjRUjdotgpSqiimqqG4ohBV7RUNVVSUlIoqouFEFJFJf/+UkUlZ
RGi2LbikvKVaWsppBUVQlF1FoutVXlRVJQaiiKhKE0WIU/VtRIKFEoFsKQ8pWrSlKNGpaJQNKp6q
zRZRSm1WVfV+NzRVjT5R9RaLrk0S0XXwo4oKr0FXlBVCUXURRFKryhavpVGUVUFUIKoqCoWjRYhS
DfwoDjfURRBSRSFSFIFJe0IKeU0Fq1XUdVq1PVPlEfVLRULdou/9F3txTqCokBTtlEFJFPNBTxSX
qIKpeKFeqmqSlKiKUqlA0Vfou1o0XbV9Q6KoTV0VQnUNV1U0tFW7tJSRSVUlJFJf5SVUtFUlJVPo
uqTRLRdWiyCminwUQCn6q0XKUPouWqilG3ClaiKVyr6pQVTV7RosQp6e8ynt2/RZBTZTTUUgUPVt
UaLp3tBovLf23mi61SjkBQtRlI6LGKK0XLVVRXUTQU2UT2dnUwAB///////////0KgAl7wAAAOQ1
e/wR//////////////////////9SAoCoigW4oW6JRVRVVovKrZlEVJ9Xq6Lyq+nouFuKbu6jKIbq
sq4ojRdNU1JouSqavp0EFRWU/ovKymiiPp80XgUgUQ0f9XFEaLhqjRclXlFlKaLyQVBUSCV1fVtK
9FyFA1bV9VNDQrVaDReRT1WoKpKIqCdVVbVP1fovKqKv0XldX37Q3aLI+VlN+URUVXVc0FPFKFNF
EFDlKaLlpNCBUogprRcn1c21F91fMobReW5Smi66iKUqHRYm+iyGptbyiCiKpKIwoGr6ib6HUFNt
a6HLKA0XJVWi4avKTKb0XlV5QVEoqrpVDoukpBtVqOjQqspFvKUkU3V6mi4OXouSrikim6r0XlVt
NuKb0XApVBT5RBQDdouRtzlUVXT62lL1fQ9BZTei4Cjm7lUcb6pKfc0XlV5TdXlEVVyoSm9FwKUa
gvRZFX6LsqOoiiavaKjqqoaqqvRdFX6LyckU3ouDepOVQUQgKbQFC3QbaFMpvRcBQE6jqKoyjqg0
XDxvqoopBlW1HovLcpcpvRcClGZT1W6L2q9sKb0XAoUu271ErVNWoGkpBtQFJd0Xk092aahbqsKQ
oNlQ9xVvKM0Xk2lL6LwBStNtotCjb9OoqNMpcpvRcClthS5TVSVHouNSpintikm0pcpvRcCm1X/R
qDReW5TbRUxStKnZTSCqCiinSmMbbqSoVVarKYq9WqKIqSoWi6pKYKKqIpir6hqspHZuuqWooCr7
KYqQpuqqkqHRZiDui4KhKYq8oEphWqO1QUrdSVDVRTF1IUxV9Q6LgKbnd6Ll6UCUhVWi5kBTFVVJ
UNWoCm6qspir6kqH5lA90XApdSVDMpBtKYKYq+0CtHRcBTdSVVVNQlA2UoU/2pKhQNFUtGi7CiL0
XlUFSFN1U3FAlEUdFwVCUpVtQlMVUgqqr6hbqkqopkoi6k0XlUFQ6LgKbqOp2qjUJSlWyp0WrlFX
hQMikqkqHRdaCoaOi4CjsqKoapqluqtoa2kVVdSVPouApupCgauqGdXZ2qShWqoqhqqqrqRBV1Q6
LgKbKFKBqSoaoa55VXSnLpqFFaLgKbqSqxUNTlN1DoqgLhRFCq6qQVBdSVfUOi4CmxUJQpTTfVtV
FNlMKaLg5VVFu3Kbqq6pqipKhqqrW/RcFTlC6LKQTbpFN6LgU4UxdVb1CUVouApupKqqGraqKbbi
lG/+71TUWi4OW2TqQpuqqhKFbEFHRcFQ1VUNVFN6Lguqal3qBpzhSV1JVNQ6LgKbqVTeVGoaqKbq
q9FwN9UVCULJoKbqq6NU1JUNVVDxt5S4URUOiqClSm9FwKN6t1U3FFVEUDouApupKoqGoaqKbqve
jULcURVCmi4G+9FUK1DUhTdVNxRRQFR0dFwVDVVQqlN6Lg3qjeoW4oiqm+q7qSqKh0XAU3woGoSg
aNQ1UU2UYpouBvq+osqOym6quq6oqSoaqqGjouAo6o6hqjeqim9FwW3tW5TFlEVHUNXlMUG2oKNV
FN1DoqgtoqAogphTRcDfvUNV1QULV5TGixmrtCqiiCm6qvRVA1Q1JUNVaLGKJ0XApdSVRV6pTei4
N+VTdVVDOrb0XAU3UlUVDosaqimyjKBRN1JUNXqaLg5dU1RUhTdVTKbUKJ0XBUNVaLGqopvRcF1R
V91JUM6q5UF1JV9Q6LgKbQKWU+UTosaqimymFNFwcqqpKhnVJTdVXVNUVJUNVaLGKJ0XBUV1JOqp
FN6LgU4UxdVVDVtVXouApupKqqHRY1VFNtxTBRN1JUNU1FouDltk6kKbqqraqvmi4KhqqdWlN6Lg
uqWm6kqGraqlVKCpKpqHRcBTaqlz5Oqim6tvRcBRNUVJUNW1YU3VV8qmpKhqqfNFwKXUlQ6KoTbC
m9FwKFEt11VUNWq76LgKbqSqKhnVRTdX1Ty6kqGqFNFwFE3oqhqoakKbqqrSjFOaLgqGqpthTei4
N6oqm6kqGraqKJq+6kqiodFwFN1Vd7KthTm1Haq6iqKjy6kqGrynbqIojlUlEFIaLh2KWU4UrUNX
tLUrVNRK3UhRu1VfaKoapq+oygaoqtuv6utpVKIbKfKoqSodigSnaNRVTV9lENNVc0XDV6CygSlS
kKioNVU1fyodile0kFtNXlHKNhQLa33yokFQ09Fw3VVSFN1VtouNTmi4KhqkpVoqqoao7VFU3UlQ
7VVR0XZdSFM71DouApukpZTHFSkKvKYQFN1FTaJbFIFN1VdVVJUNVaLyV5ouCorqSbZapT9XXVVQ
6LGqq9FwFN1JVhTNQqlJaLrbikuXUlQ1S0VY2WUhoumpCm6q0WNVV80XBUOi6WjYpWqimmuqWm6k
qHRY1VFMNxQNSVUU7UOi4Cm1VLnzaqylelP1dVFSVDosaqym6qurCmakqEpLRde3NFwKUt6NT6Lr
k3aLsbOFHaLy0Xe3aLlKC0XUUzUlLRcuiyNylik0BQpRBSOixaib5lC1DlUNVU1WURJtKHqOrSgN
6FRFPoChaiqJBUFRNCCoKioIKgu9qnatvaNuVJdBXIS3qKjQqC2va2i6iRFA8tFRob1FRoVBdCp6
s0XIq1aLoq1vKIp027RdnecKObqaCpJlOlHN1X/osYpbRcuixihSiChbalZ1SUVhT1RFItFRoqhq
Gq6hKSq0oZBS0Xw2blDVbKp9F1tFRFMFMlEVcKvUqvRc5S9VqFAlNFEFI1WURUDUUKUQiqSmU7dP
9FpN2i62jRYxS2i5SiCiKiRaLpatF9VZ9V+rUTfuURUhRFR6LhKSKI0XhVRQTUUOUjUZQ9VFHKFC
lFVWUjUVV71CUW3ttRN+6Bu4UR7aURou2jULc36LwKIKQKf0WMgKIspFqKKBStRFEU22od6iKIqH
RduzcgqOmqgqC6iKQ0XDUVQtTdovBvqK6iqIpUcKIqCom2n9GhRV+oai5UOi8G+orqKoilRUdRVC
UW20/o0N9xURRFQlCUe1FlQlNFEcKIKIbWmnRqIoZtyoqh+qqtQCoqFVlJFK1PouuqUCAo6ykCgv
q+oqFGym5tFVXUV0Ki0XWUgU/vUVRUSkWopr6FRZei61Sh6ioUaNCqykW/eo6NRUNF2trfRa6iuo
hovCmUrUX0aGi7W2qdvaNFlNv1HVNS08QVBTV0XxouEKUqhxvbaCa8VEd+rn2vFH/iei4SnaeioA
9F5FOqFM1VUOi0KFWaLvqEpGq5oL0XwURougpQo2ghQVSUlovTtWaLl0XJouOrdFUCaLnqHRa1Or
GwpMpNBouH6ZTGyCp9F2lM1aUlT0XJUNUVbUKDlQ6L4byl6smUroqhNA0aLHUFsFVVCUCUtVGi5V
SlahKYqYIKvKZKYqGocKS0WcUjouiraNU6KoGqlBouopXRVCZTtNgqopVSRS9Q1dovUpuqileS0V
QnVOi9GvqApFpqHRepS7QUlUOi+ahbSk6iKUKe0VQFouXRUB9IoYoQpCqW8pep9F5aKgDKX4UrU6
miqE5IKqKZUQVHVZSNRlL6L1plN6L0UamwoeoVFCmSlqhaykdFuIGnRfJRGi6G6oahnULApSqzjU
36LOQINFkaLxKToTpKVFouOp1N2YpgpihVLS2VVV1VVSKqKdKSq4p3Rfei6Kn0WNTqHRcWioDymG
lr0XLou3RfW9VKVCU8U8UoUoUoUoU8U9V9Q1cUvUJTxSlU7UmCoqqqnqBqb6vbKE9F4lJ1DULbQq
LRcdJSg2VGUxUatU0CmKfZzqkpNq0X3ouvRdZTpSBQ+iqBdFQHlIlL5vsGiqmopKpykmpRsKT0Xu
UvovcpOqeoKhKdQVOgKdV3qgpuqim6oqFtoVGUuoUkoUugqGr9FUCT0VQJV6vlM6LhnouEpmryiU
CqAokofRchTFQlMaLkqeoSkaeizqZSOi5KsQVZouSrah0XIUnotYpPRclMoiqil9FzVPouYpOrUF
WlJzKY0VAfoqgDRUAWiqANFQH6Ljb9Fit+i4ymGtv4qUu3lPaLt0XKU8U8UoUoU81+1lPFD0ykqn
KSpoNFy1FotCodFoVFovvRem2i9NF9lO1WG6qm4aKgPKTmUnoqA8pihouqmU7T0XVwphBouhg0XV
UfKt6UjPlRlCFLFMFKqNTe2FL1OqUrVG/1VVXKFVFK71UUkg0XU11P2p96qqooSrSm6hnhS2ioAy
hCltF5FM06n7V6tQ09F/lJVDVWi5p6LCaylqqoFCIKtqIoTpT1Q6KgI0XkpQKWqHRaxRGi6CkqhK
Zq3RYRS1ApgoSqWlBOp+lLUCk6v0WFVNWlLVUUxoqALRYpTGxQiiu16L3Gi5WtXRcpSlVtPSlihO
lLdKU+mgKYqer6nKYqFBhSWi1ikymNFy1DsU75SapSStQsGiwtF0FJVXVSCrClqei5ShClimGpAU
xVNAp1BourReui+KhKYbKhnV1VoKr0XjovCqtF5aKgb5USndFQCaLCqopkpbRdhSpQhSxSZTNUIL
eKRqMpWq6up0tFUJlK76KgEKSKbKWqEpZXtW1TV5TZTJQei6W+novApaoZ1FUJSVPRYRShSsymu1
a306oayliiimKjq/ReBSxQ9MobqhTei5CiyhNF5FK1XUJSSlQ6LwKWqGm08QaL5qnRb6DKr0WsqU
lUNVINFjlLFCFJaLwKWUn/ah0WCU2UvU/KFX0G/ReBS1Q06uqpVsqgplQpvRcG9Krqtq5pb2vReB
S1Q2UkpUVApZXReBS1QtdUToaLwa2tuUqaqNFxaLkKUKE0XHVdKod51TotSllqlJN+i+NFytNUNd
DRaGi76sqhBkilNF0N6qBsa9F4FLVD2rGsp6ei39Fw1DotnRfflA1Q16LwKWqGyltFnIBosTRexS
pS2Kbzq1gKV7VGi6yhZlKtU6pa6rKUq3ReqCrO1a2TqmqmqqShd6q0XqgqnRVCZSuixKoq1rqfRd
NV1aULPReBSU6pp1VVhS1U6L1QaLDnoujtW9qKrZ1SUkULVs9F6oKpKW0XhotCdW1XVmiw9FUD6L
gaSkihdFwTqnRbxSWi8Ckqt0XqgnVOi5SktFh1YUtUNWzqkpKptF1lC6L1QVbITKW0XhPRVDjXVO
iw2rRfGi4KsnVM/a/BTFW5VE9F4FJU2mobKWqkpig06LKqopLRcGi7ahpzKSqYpirZ5VFUlLaLwV
QVPVVtJTFBtxvQS7IpCbSUlV86patFxNNlLFDzQVC16KoCKTKZ+jVDYUlVs0BS2i8J1TlUlFlJFM
Va11VU6CqSkqqq2dRlJVSUtovCp2mdU90XQUWUxVVW6LSq1v2qko0pbReEyldFoVTotnRfRSFU1U
pUNCmUlsKtnVdUlLaLw0WtVNT6L6Kb0W8UlovAoNsKW/RcBR1UaLI0XgUlVt9nVJSWi3imylkFTl
L1UUkUuU5ovApaofKYq0pLRZFUlGlLaLwnouCqdFvFJaLw0XVoqg8pvRZVW6LIa6gKW+rVCkp6Lw
KSqmp9FQDFJWUtVJSTS16LwKWm1lOaLIqlobf0XbVs2uqSltF4SqHRZGi+raSktF4Ncylim+1TU7
b+i8Ckqt0XS1zqkpJpaUFCkpUNUlOaLF0XgUtTKb0VQPVpSVPeqqJS2i8J9qlpKS0XhT0XZdQ06h
7UJSxTdW6Lpqmei8Ckqe/q2UtVJSTSUBovApZB1oqGnUJSRTei+atn2qSltF4KNNQ1dbSUlovDRc
vlLFN1WgnVxT2i8Ckqtn2dUlJNNlLFDq1D2rijNF4FLTKbKc0WQULV9Qq1Cg0XrSptOi1CktF4FI
VTovYopBUJQtQlLFN6LIqkpvtToNF6pPZ2dTAAH///////////QqACXwAAAAgiAh8RH/////////
/////////////wqcpSgUZovfReBSVWtlUzqkpIpHClvq2fajU0XgUsgKGKXq0pKqdFoVFMpbReE+
1SUiUlovDRejflWzqmq/KWKGq0ons9F4FJaLQKJbMKWqkpIpGpdF4FLT631bOqdFoFJFDCrZ1XVJ
S2i8Cl6hq3Rc2FIlJaLwKLbClihtFwTqnRaGi5dF4FJVbfZ1SUkUjhS1QVbMpKmUpovApaoShimK
tKSqnRbzfMpbReE9FwVSUiUlovDRcWi+8q2dUtdQFLFDVaoUlPReBSWi3m+flLVSUlotBXReBS02
tvq2dU6LeKSqcpSqZtdUlLaLwqanVui5f0WgUlovBWZS2dnVOi3imtF4FJVaUq1zqkpLRaHlLVDV
s6pbyhNF4FLU80XnVpSVU6LexAUtovCfap0WgUlovApQpf6tnVPahKWyrSlapnovApLRb2i/P8pa
qSktFoc0XgUsg6UTVs6p0W8Ulmi5atn2qSltF4NM+tOixSkNF5aLSqKrWmrdFwICmVKtnVOi4dFy
VbouCoVNFzVCUsUzosQpCoVdF1VSgqWp9F4tiBvq2dQ6LEvRVAnG+odFzIKuqMpujVFWlMYU9Uui
8ahbGxQpudU6LE0XlouQplBouZBVtQ1KU2oUzouGqqtadF1FLUG+lU+i5kCtU6LEqerSk6jq+pdF
xtndFhfovUperVGApOodF5FM1bVU9F4FJaLEKNbCmilqp0XM3NZRlUlN1b26tnVOixCkkAq2ei4G
6qSltF4FJVDVpTBTTXouPRcOiyikilaqq2lVGixNFwaLwKSq0pKdU1djWU0UtUFWzKSU37URSVWl
JVSUjOZS2i8J6L/Kbqlrq9qKT0XaU1Vs6pa/0WHovKrWyc9F4FJFIzmUMUtVMiltFiZei5Kta2+r
Z1SUiUkULouJpnei5KpKW0XgUNTq3RcpQ2ixCmcq2oikuzqkpEpLReBSVW6L/KbnVNXtWixChilq
h+lTKHaikqdRIFGzENPykymdFxTKT9AU7ouFSqanqEpVvq/amU9VJTE6na9FUJ1C2lK8q6rdFwzo
VVwpep6FCqWmhdUtNChVLTwZznW6pSkKsnyhg5OhlJp4UC01botblBAUXzKE6GUmnlCpCm6obqnp
6LC0XlUOi8tF6UxoudRRsp6Lh0XFPRcWi5GynouHRdCDRcPoKnqmp2qp2/RcVU76LN0X3VRStVK1
DUOiqE6p0XJQFVFJlBtmi9tFy1aUkUO1FLICmqmKYzRaGi4yitF+0inadU1HouWoSldFUJ1DovYp
Op6hnouHRclW42VPTailkGi4fqGoUBSNTlMt2izqt0XQ3oCl26oZ1CrtV9Q0Kq0WRU/Clau5ouRs
qmp99FUJlK1VoqhOVU9KX0XqgKXlVVNSodF0aL1qEpspWoaei+KFQlLVEga6hq8pVXfRaGi76qqG
rClKh0VQQUFUNQlN6L5qGoqu0XloqAOqWnlApYpmqqpqenQ0XxQ5QoaLv0WgpUOi3EBSlWYgoIG/
RdFQoFKhoaL4ocoUNF36LQq6qqp6UpVmIKDfoubRdaCoahqVroUqsqlgqFSoahKUKVbmxBmi5SlJ
oKhVKSq2m2UKFPRclUtTVlUqNlW6LjKT0XRouGhQQcKVplLS5Q5QqpqKWqKdDKZSqrBouihSqzjU
38qqg2U6WiqEylSl5egoUCm9F66L4KVaKHKGi0KFWaLvoYgoFNlKNei+VfKcq6mUy1lObNlUtOi8
tFQB6LgKZ4UXSoaLNo1fQyNR3sk59wZRxSd+HNFpFAFIVTot3ReTc1IKv0Ww1VLoqAur2oprYpzR
bei3qgKf0WcUS1FOVBotvRY9KpdFmaLHpb6LDq+r70WIUPVtAoApyp6oKSKB0WhTKC0VAo1b7NWi
x6vzRetQFOZV+i3ijKnqXbRaFTFOaLG0Xk3VRUqCoCkijN9F0NGi0KvKHypKvq9qKHq+oNFyaLbK
Qampuo1QgqqgUtotCptF5aLbQUW6p6nqApjRUDpQxTmi0MqepqgKAqCkU41VHV+ioHan2UqAoChU
lNAUgUBVUs53RciCoGpA26LdqlBmi0G1uqap6CBqbqGi5SmmrRctT6KgdKSKGKAbqOi0dF3Ve3Nx
QBRlX1A1UynKjKAqAp/RbdX1fQqBTpS29EowpApwpyoql0W22tjagQUdFzN1V6LCKaUQb1TVGixC
mCnKgqiqCmCkig5TbigpFJVe15VGiwynKuolJ1WU43VeUAUAUgUgUgUgUAUBV9XlB1XQKAKQpPqo
CnKgpFOUSjKrpNrZUui26vqCr6lQUW1ApVJRBTWi5ZUqvKBqybZVVVUEEykGqVJv0WBhTDT/H6+i
6SnKJQWi5CgqLdVtCaCdCoKRTlXy0WS26LJlSqvNFyINFyZUFQVLouWp9FglNaLBqcpyr9Fj6LDo
aLD0WPKqNFzVLtUui5qvQFNUimkFW1AUPV5Q9QaLkqCr9FiFIaLEq/cocpwoffer9FjlAWUBoscp
KoNF1IKOixG3RYlGqigSnCgaqqKqMqC6gyomoppqqIpApyqEGi56gqgoCjVxQBQBSBSBQFQVRUBQ
FWtRQei5Cg2qhouhBotir9FsIJ6LXQaLXnIpoooowpwoworKqqKqsqipb0W3ovLRbdqfQailtFy4
3IGpv3KawpEoebdRKMq1A20tFoZVdUICnN20oyjVaApopwotpbSiinarKcQY3VJV9DjVVONWi3Wo
pIpIoqr6VXlJVHotur0FGg01A1bKNxTm6DCiqoq/RcOi3W5qKMq+6gatFt1e1FFNLUUoUDiDcpyo
tF4lFNVX0KvaaqbmpBVFlNFIXhSOi57uiUQgKc0XPVxSBSGIGrCimooopCqCkqBQ+i8avKSKHq8p
zRcmi27KAKB0XRV6CVUUM2Vq9patFtlNFOb0WrRbbRhSJQNEpwoEoepdF5UCltFQO6Leq8of6v22
KQKcqepdF2oNFu6LhU43FFaLAaUDU1aKgqo41UKi3qyomrRcs6oKYqxSptFoc4UHUbUU0UU3FFVQ
UZoseo2rGzhSVRlFFNUUFXlNFJNO89qaClxXb2qpyhymqvqMorRdxSVNA3FG1BV9LGqjoqAWr9m6
oKjKKKaQb70CkCjdFsFOVKUhdLaoEBTRQDVlIoOoyitF40KaCr9FQBVGgbd1CglOVGUVovvRbZTB
TlKrcam4oNBVaDG4pjJfUZRRTXlJFI6Lnqhq7UZRRTX7N7b2oO7q7bbaLHqTNqtm207q+qaeeoCj
NFvVNm3tWi2NFQF1LtVm/dFnNXJ1XP6jKKKa3o/VFDRbGi3imtFm6LQSNW31GUUU11qKQqwaLN0V
APRKM2tq23tBuU7VG06NCoLqjelR0WTosBAg7QqCqKNUVRVZTlHRZNQVNotCkUFvUBQWi2ikN6oo
VHtQqBrQbFFVBR0WTV2i/tFgIG5Ag3oVBtVG9CjosmoCiqjbdFyblGbVdoqABBoqgspCqEFCoCkS
kKj23o6LJoVBoscpKrtiiimt6FQFJUasqijosndtKMKfKKqOhosWoKgq6jouVTahUFRVRUFUVQUP
u3ZQqPYpIpKr/KKqAoGr9Fh6LpQFIIGqoCkqG2FD70G7KgKKqOlVpQVU/osMoGr6kg31Yg5Vk6gK
SKD0WPQqCjtosPyitF3bFOVBUFVU2qqKgae7b0KtKKqOhVWi5KgbdFt1e3VAUkUEU5UGyDegU1ot
uoCiqjbSkqFQIG5tq9A3VNvyRTWi4yiqjob6LYqDRcei3kFQIG6r1CkNrKI3oFIVAUVUei5KgbSj
igykdqj0X9ou8oqmgq0oJtqPbe0FCoNikSgyiqtbSi0BSTTvUZRRTVMo7fZtqDRcZRVR0EFQFI7V
GUzRKDq9ubag0XMUVT3aSkqFR7VA26L7KQ8oqoNtFhlOVGUVouSoCn21q4pTo70KgqAoqoyiSmm0
pP9Fh7VGU5ouQoooNBUDbKqKj23qioKFQbaLDQ1DVVJuq+oKoKaqMoopooNBvsUlVZTmi4SiqjoI
Kg0WHtUZSBSH1AUlV6ApooooPdqqChUexSVV6L7peUVUG2iwymqjKKpICkKgKSq/YoO96CCoCiqj
bikqg2/RYe1R1MU0UUUGUgU5sUxV9R7b2goVBtosPyitF3UqgQFIFOVGUVouQoMohtqir6vpVBos
mio3b1btUaCoNFkXKr6oKaKKKDbagtA26LJo0ygqkUKco1Hsq1VBQqDbRYtSlFFNb0EFXFNVGUVS
p3vtUDboufRchRVR0EFQaLF2qOpqFS70KgKQKaKKp72goVHs26L00XfUpRVQbaLFKcqMorRciCrt
6FQNu1MojegUhUBRVRqFNb1BUuixdqj0XTou8oqmgoVA21dUe29oKFQbaLFqUorRc29ApJvqSoyi
imqZR2+1QFI6Ly0XIUVUdBBUGixdqjp1RUu9CoKg0XMUVT3aSkqFR7FI6Ly0XJTKKqDZt0XPUZRW
i5KgqjehUBSOwvehUFQFFVHou8prdBTbdqj0XPouQoqpUFCoCkdFy1HtuU7UFCoNm2mUUU1vQqBq
0XJUZRRTVSlIb7VAUjou+kUVUdBBUDbtUZTd096FQICmiiql3bqgoVHsUjhTVMoqoNm3RclRlFUk
F70KgKR2qWrt6CCoCiqj0XlouTdrKaQb1MEDXSQFOVFosHehUGioBt90FXt1GryjGqlZTTdotKoN
Fk6KgaKC0VAN5ThRm9DelUui1N2+oKOiySmCiNFyUigtyh9FyVfoqBrRUA1X7z0WDouShUFLRYu9
RFOUdFk71foqBrRajc1aKgGQblJaLSKMbW9QoKjosluqCk2t1Apqr9FQNaLKq1tuqNFQO1PuPqDR
brVugoVHtSKR0XfTKKqCiUYU0U4UPouRuQXvQqCltotaqN6DVQqAoqo9FhlNblHU7paKgG0XSUhR
QIGtBSqKo9t9qFQVK3XTKK0XNvQKSaWioUGi299qg0WKU5ouQoqo6FR1BUF6LHo06NPehUFQVRU2
+5R/aFR7aLFKc0XJTKKqDCjKTbUrToueoKo3oVBosXaqCgikqFS71AUVUZTRTW6CnSam1uQaLbQU
Kg0WKUhUe29R1BQqDRY9GlTKKKaQNaCraJQRSVUUW6rW4pKqKDUpQoVRQ0XlU9FA21fotBq0XFU+
i222oKvolBVBU1X1JPCmG4ppvUQVUgbW1tQbttRIN21RBvvWndUq0pNqCqd1ObUuN7bJTfei173u
2zU3ko3tslN91CkCkuVFouZp7ouOr9Fu6LHKSqjRYTc3VaUlUu1DRYu9WlJaKgGaqdT1RTbavbaJ
QRRmixaoqvRZui0CnNFoVRSqBqqaoNFj1fugoaLA30VAO0NxQdW0SjCnCisKH0XJotjRZRTrdUxQ
BSBTRRGi6Kv0WhU1X6LC0W221fQqXferdFolPlJUSjKdT1RV9XlONRQRQGi2ykKTUUYU5U9Cr6FX
0tFoaLHq9qQVEUFmi0CmMKEq0pptquptFoFOVNU9QUqn0VA6U5U9ToCkm6r2rRUDtXlDaLJqApLR
bzVV5RiCmgq+r9FoNFV6LY0VAWU5V9S6LOqDRZWioA6vqAoYoCggKY0W7VKDfdtKMainKgKCKSat
FvNu7a26KgL0Ww3VfTKc0WdUvKsUqwoxqqApxuqBq0W827trboqAvRbBTBTlQUtFnVLyrFJ1VosQ
pyr6gq8p1XpSxQ9Xt1X1fvOqp1ZTaNFnbFOVBLZuQdbVGrRY9JBRtAgq3elQatFQDNqlWb0dFtlG
Zu27qIKJRiBvbadWaE9nZ1MAAf//////////9CoAJfEAAABCn0CkEf//////////////////////
tBoalOlLb0SjMQKVTVilTaLQqep51Y2qFDaKgd0W9osltbd23RbDVUuioC23lWKFDaLOqAoCVUNR
RPW6oCn6s3Qb6LdqlqalZ0m3RZtEoJTuFEL0eRFiMC5dH8KRxxfAFmaSiKgKFqHRbRRZR+iyagKP
KOqYoGoij2jRZ5RpRGiwShZlHaLUa6mKBKIKB0W5os7RbRQOix9Fh1AUKUBotco/RYhRWi1tFplC
VGUxosKoCiCgyhSiKh0W1oskoVqo6LDKPKHo0CiKjKPKFqOpigSjdFs6LXKIKI0WsUAUfUhQjVQK
GKGqMosoTRbJR+i0mhrmURosnRaRR9CjotzRYjQUc0lFlA6LHqYoKptFs6LXKL0Wi1aLHKPaKmoF
GaLb0WdosDRbNRtGi1ygak7otoohoKKKP0W3UylS0CgqhpFEUygChCjqmaFCiNFt1HSKNqHRY2i2
qhqGo9Fs6LGKP0Wu0FBVBosko8oLRY+iz2jRY9TaLbKI0WdUhR9SFDICjyjyj6kKGKP60aLLKIKK
KCmUdoqAEo8o8o2hlGo6lqSo9FiFEFEFG6LM0W5UpQ7UUC1FFVCUfosPRZOiypUCgakKE0WEUZos
AoGpChNFiaLAa9FhlF1NUKpRBR5QjQpQ0WAUbosmhosPRYBR5R5QhQhQBQBQBQBQhQhRBR7Xoseo
ShCgKgqGnosAoHRbRRFSVGopUpQ+izNFuFH0KoKJaiimooGVSaLB0WVoscoqoKJQdS1KUPUFTFCb
lF1HUGiw6JR5QzQUHosZvapaLAqTZBtUhR+i0yhChqhKGKEKB0W0UQUe0NWixmpoKP0WGUPosejo
scoehUZROix6mKO0WWUdUxRBR5QhQBRpQBQhRVPRYWiwSjdFg6LCKIKAaij2ooApioNFpFH6LSqB
BQ0WOUVosQorRY9TaLWKI0WtUxQpR+iw6j0WJUeiw1JtVQlB6LC0WNosIoMoTCiMKE0WMo0VLotK
pWiqCjdFrFG1RosXRYFGqNFi9olCaLJKNKEKEKAKAKE3p7lCFMNOyDZpKCKLaijijyjmootrKNay
i9FhlAKb6LA3UaChNFjFCNChRLTotEovRaLT1rKC0WBU2ix6jo1G0VDUqCmUBotIoEo+pKj0WnUO
ixij9FslD6LDqBq0WBUtSjRY+iw6OiyyiChWrRY2i2yiNFh6LAaqdHRZ5R5RtSU6hp09FtaLJKIK
P0W2UQUeUeURosnRbhR9QFBlGx3ptcqnKIKFaqei2ygCj9FhaLaKPqYoYo/RYkyjtFuFH6LJ0VAN
GnosUoOnQKBKI0WMUJotunRKEKIjU1Gm1KaLS0WtosVpp6LE0WK0lCy0WvUmiwNFilGlAFAIKjp0
9Ft09FtlAUyiCgtFpFCFEFH6LSKPKIo6Lc0WJUZQZRZR5Ruiw6gKEqWpWko+JR2i3CgNFgFBZT0W
jos+mUAUHUhRBQeixyiSiygqm0W2UKUfotIoMo8o3RZpQBRFPRZhR9HRbTRs1lH6Lb0WbFq0WTT0
WhosenTKE0WTUdCpii2jRY5QPCjKlatFr6LZplI7VNTKf0WXS0W2UaUWUJUxQdMoBQogo7RZdIod
qKP0WWURGoygSjaoqMoZQTnTlotJAUQUdostAUQ31GUfUFQFIaLgp0NFj6LaKPaij6BR2iyyn1Cg
alKCqXYoMojRYBQGixCj2qg1NVCnT0XBsUdosukUbyoyj9FmVNUOixqlkgkoUdosulotEozRYBR+
i0yh9FklHtRQ2iw5TolGIOzKO0WWU+0baLE0Wh2moUdossp+c6hqUoLfZpqCMygdFh7U6NBoqmqW
4oMoRooNVOVRlCxQTnUxR1RFAzqFTmi1CjlChKhqCZR2iyyn5zmUAUaUGUCU/UjTKcyjtFllPzp6
LEqFpa9FQC6LHKGaqopSKFVqOoyhFCjSgajKNKB0WJyoyhijmpSo6gqAo0oEoSoygVNFh6LAKOai
gdFr6LZ0WyUCULvUOi0SgChVCjSjmoo0oEpGirossoEo5q0WfosKp6j2qOpyhSjSgWpQoUo0o5qK
B0WWUdotopooUohXRZ5Q5Q2iycUKGKNKB0VADhRzUUKUc1FGlAlC7aLPV0WWU+UKUaUDsULVihRz
UULOqG3RZZRxRuiw9ygdFn1HU2iw1SjSgdFjU96dSaLSKFqYoco0o5qKIwo9o0WWUCUHRoaLTasK
GKDoFEFGtTRotIoUo2pihygdFllHFH1TUJQDRQKDo0uVE0NbVUdHNihCjSgakKBoNGiy0BRpRFDc
o4ogoOmgo1C1FClG1Tosso4o2pqJQOiz9FuFHbb1VUJRBQLU1FClGoNFuFA6LLKO0WNhRpQNRq6L
PKOatqjKFU4UfQ0WWUcUbRKOKB0WQUNUdJqKPKPkUK1NOi1yhSjSgCgdFllHYUDosbRZDVoqAFqK
O0WhouLRZfChtFpFAlGlHNRQpQtRlGlAtWioAWrRZdU6LGoUdtFjNpR2iyyn+FGlCtRRpQNDRZZR
xRpQxQOioAWoo4obRajVotPYo3fRc+iy+FClF7FGlHNRQOixihsaNFllAtVDRYBR2iyymt+lGoKi
lzRZJQpRu5QOiyyjkBT5RtBooNRR2iwCmtFltVRlA6LGKPplHNRQtTblGlAtVCpKtaSjyj6RQWi1
ijtFllINRQ5QrUURosPRYCDRZZRxRtRlA0Goo4oZA0UCiCj6jKf0WW1FC6LIpFGlHNRRGiw0BR7R
ossoFqoaLLKO0WXVVRoKBRBR7U1FAFClG1GUDosso4o/KGizWig1FHRKX0WW1FAFEFGlGaLAKOai
hSgajKNKBaqDRostAUfQqOotFllHaLLKaatFQBFGqFEFHlH0Goo7Gpo0W61FHVHSKHKG0WMUeoU/
ostqKNKB0WBUeixmoo4oiodpaLLkUc1FC1LSKNKBaqh0WBosspcoUo2o6k0WmUdosuqm9pKFaigd
FtaLQKa0WWUcUbUZQNQtRR1DRbmiwChSjSgSgCl9Flt5QrVUZRpRzVotrRa+i4tFgaLLKBaqh0Wm
UdosspqoyiihSjSgdFtNTfotcoUo0oAoHRZZR2FPlC6LC0WBULUUdotrRcWiy28oYo0oHRbRRpRz
UUKULUZRpQLVUOiwNFl6LnKFKN20WAgKO0WWU+3lGlCtRQOioASjimtFllHFGlDFA1C1FHaLA0Wd
osAoUo0oHfRc+iy28oUovYo0o5q0VACUcU1zRZZQLVotrRYpR2iyymt6JQpRpQOioAWreppFG7lA
6LLKO0WoUgULUnNFtNRR2ixSmtFl6LAqMo0oHRUAJQZRzUULUG5RpQLVotrmiyynyhSjaRRui2yj
tFllIaLAKBKFaigdFQA6LJqrRZZRxRtRlA6LaaijiimnhQpRpQNRlP6LL0WAULosKkUaUc1aKgB6
UvzRZZQLVotrRaBR2iy6qqNqKFKNKB0VAC1aLAqIoUo2oygdFllHaLJKanQ0WtUeiyKjqCoKBQxQ
xRGiySjihSjSgdFQFVMUKUMUeUeUGUeUNosnRbOiyyn6RRhQLUUbUOixigyiKjKFKNpaLZKEqKpe
VDQKDaijNFg6LH0VACUCULotKjosAo3RYxR8qgKO0WOUaUDotkoCptFklEFBtRQpR5RtRFH6LJ0V
AVRKFwowoapeNVQlBtVIoHRbOioAdihEBRBRv6LTadlNFt1MUKpUdDRbWiyShWoo0o5q0WzoqAjR
cVUaLLKBKDKCa9Fl6LH0WPtUZQpQpRpQOi2WrRblSFClG1OUQUDosso6oSnyhSjao0WJUGioCtFp
5osdqqBqaNFs6LOKOaihWoo0oHRYlTaLEqjRZei5yhSjdii50WrRbhQrUUDUOiyCmtFllHFG6LJ0
VACUDosQoSpCiNFk1QUKUaUDvTKG0WQUKUYUUUaUc1VDosgppv0WWUDU5Q2i2dFrFCFHlJ70ShSj
SgahalKjwo0oSpigdFllHaLeKQKFqRv0WyUHotbZq0W5UZRpQNQlGlHNRQuiydFQAlGlAlCVJotl
v0WWU/RalCmKk2KIaygSj9Fp1MUCURUBQhQpQJRpQlQFBFK6LCo0NFjFH6LZaKnqDRaJQJQJRxQ9
Q76LXKPpFA1GUZR0WnUMmprqHRY1S1LQKBqVBQKBqWVAoGpcqWo1Gmoqho0Kl5s01JdQ1LUjUUDU
tSUChdFiVLUtQ1CUHUtQ1JKoalqRqKAqWWiyyhSgBosCpCiakKP0W1os4oipNFvlHlH6LTKI0WCU
CUaULU2i0yiNFQFFHFEaLCqAoiqSgdFjVHUNRlClA6LDKLadFgaLZKEKPKIoNei1ygdFh0dFlUSh
KhloqAXRZ9HYpipChimCj2jRaVEo79FpFDlA1AUKUfosEoso/RbOi1yj9FQFaLc0WMUeUQUbosGp
ihSiihihiiKkKGKI0WFUBR5SJRBRDRUNSaKgB0WIUMUdUZRFTFEFHlGlHlHlClCFH1M1FG1DUei2
SjKjaNFplH6LG0WHotfRbOiwNFrtBQOi2qm0W2URUzRRKIKPKPKO0W2Ufos5ooFEFC1MUeUM1FEa
LGKPKI0WyUJosMo6otFgFHlA6LUoFC6LXKPoaLOKCqGmUZotqoaBQNS1KUNosnRYBQNQlEVMULUt
S1LUtRFHFHlH6LLKI0WoUDUlRSqKoyjqBRBR9CpihalqWpalqIo4ozRYBQOi2tFqFA1JUUqi0Wlo
qB4ogo+gUVu20aj0WOUeUeUeUfUZQJQdQVFU+iz9FqFGlEUCimqjKoKllR0WHUG9SaLIoFA6KgF0
WRUBQhR2ioCqllUVS6LH0WiUNU9S1LUvGqpChmqoqlqepdFslCFHco1HUtSVHUbVyo6latFr6LZq
ZoKKqGpeaLO0W2UK0VFUtS1KUdUxQNRVLUlQ80WdotTcoLRZrSUGUDU1HftTXQKA0W1UNT6LJqUo
NqqUosotBIYHj7Lw7h9UtQZtUFQNYKKayjqNQlBNZQLUgaShShN6roFD0ahaaFGoKmqGhU9QNNQV
A12URlSVOUC0lCVA0lEVM07UQ00BU7XUqC2lqayhKmKEqFA1bNLSU37WUU1lB0rkUKgqBramukUC
0VI0ig13U1GygVSjWihvUlyatqgBQdKo2tqKEu6FJpampq2oVAUDUzSUD1roFCVErbTsrJBe1TaL
BvlG0F82qKoNtmpqqJr2arKKDXajUUCoUJQaaVQNZQVTVO1tbWUE1tZQJQOzT1p3qtA1tbXZQeIK
gaygqmtpaXaCrXUlCoqBQZQjXtSqWpr2qK6n7bTQKKqe2nYVArts0tZRVy/dRQo/Zpa2vba7u9tm
lr2QbbXc1Cg0DTQqZpKCqahs11JQVa7qHagUHQqK7qWplLtqKIaWupLqSp51A1WGlr0WBdTFCq8m
1tJQTXU7WUE11IpUm1SKUKmaWuo6kqKpKja9qlKBQFA1LctlChKnqGpyhGlrqeoGuoKnv6lqFBUN
StNSVI11JUjSUDQa6BQNT3UBRFlEVBUmNOVI0tdTlA2UDU/d+7NXai61VMUa0lG1NRlZRtAo2yiO
IOFEZuUSURhQJROyim213tn5s0lCNdTtZQl1BQKOayjqFQVIgqSoArUBQ7SUPUF1NRqa5bFHioAU
fUiC6lKDko1NPlAtLW0zUoFBNZQVTVJtUTW1S2qCg0tbXUlR7IKhaakKKqIpnNmmhNpaGtrQT2nO
oA07lMtLW1tIotZRTU15MXbS00JlMqNdKoGuiUK13urRawUlPyiJ7VE00cKZm1VO01I0zoSoIMKF
nmFCT2dnUwAB///////////0KgAl8gAAAIBTjnAR//////////////////////+UIG4oLfFLlP5z
KZmUzftN0Mad6DW01NRsoEoioGtAKgqdpVoNZQatFVp78xtNQogoJpKIQbVBcqBQjXSKIa0FyaSi
aCiCoKklRaymajoCe1RzmoogqarGgoFQoJS2mhs1bNTXRm1lBYUy01LU9ETUoNNEoIoGpaDXULTU
xQSAoP8oKTnMUGlpolBFCNJRHtdQFAqKTFR210Gu6JQTXSqJrujUxQ7S3ytroXQqQTmo10SgigWs
oP2soijtUTXcroUSgigRbS11JUoaygqGyCrGm57zolBNdSNebfO6JQTXObS17ZU9BonCp1JzodaW
ioGprlKi3tdTFCTnOiUcUFUM2mVQ0FaFQtGTolBNeVT1RrKHKEayhGoTnRKCa+ztpoFDtVRtdEN4
aSgyhfQNVRoCgmproWpU2VLUmiwPoNLXQqdqoVHs01LUlDZqzdpzacmmo2ujQa6FRoKgKCoVLUiB
AUX9+UQ0tdChUbS11LUlAoKjQqJpKGqBAUVQtDUdBroNKGjQaalqRroFCNaCoCgmtpa6DWUBTqOp
akaWimUCUFRa6gyggag0VA10KP55RVJpqSpWujQaShGupCgqBRDV+1BDQ0WBbS10CgaTS11JUtAo
Ki11PsUVUnlENStFraKDRtUClTtdTtdAoKH1IUEUIgabyppD6gaWmg0tdTlBUWupKmoIKMrwojZp
oUKDS1tNGgUFRqIoRroeUCglQuoGmgGsoYoKi11IUdQqEoFBdtbXeUChW5pa5UCgqLXQqIosoJpo
UdmsoIoOhvugo0GkoT2uhQaSgigqnqIIGsoVWiUE1lBlBtNBBQKGKCotdCg00KMqhKC2tBjUUEUG
01K1tdGhQqKpkNSFBUKH70SgqizRYyBpamgoNRpa8oFBUZtaAo+pPoUd6iKCKC+hUSn0aDTosHGu
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
WVWTQNdNSpWtRA3ZeW4006lqVvkoq0taCpVKajW001KpVqVAUvlSlKPIUDQqrimNNNRR7G6ndQNN
NTLa1FVd2tSVtdU5jbVPoKIqgK1I0bIG+qcy8ydXu2gUo1ZjXsgUxppqKbZUNSzqlS5NWXjTTUqC
1UDTRp02+o6PMayg6tk3tNNrnVdS1KUFiBSdW05OtdS1KU7VdS00M6tqVWr1GZrVflTa6dStLXUt
SyQFIU6lnVqBuq+Ssqta6lqVrptdSzq2pabTugaymikEBTr27JTeqWpQyNLW1zq2palx5AUhTUa6
lqV5BOnOrWsSqWm01LVKtSoKrqFvKQqWpanxXG8p5rVKXqVpa2soNRSnUtW1RYQMjxTSjXUrWqU8
11KqUvUtNpqUoN9ApdW1RdJ5BRqei0UWtyqalqWm12pTa2tAoq31PmFIda2trqUoOm01KUzVlStd
U1QqqgfQVK1oGupW6qalptKAoOpallVrXVCBXGtrfUUptNSt06lblUCmiyalUUKCa6taWupadS02
lSpUBTRSga2kKU295rZkDS1tdUyqWpWsFKUyg0EkDyC2mmo3lLtbWgqVSm01K9Uoa2mp28pQKoFZ
U29rk9UrS11KgqBkUp1K121tNNAqqgaraW+m11KrUtNpoqICk1La2lrQUylJVKgKFxpa2tVWpala
7aqSlSVKoposNuaaahShSbW1taEoOm01LKpba2koKrVFGtSSlMpRr0WGpUrS1taFSpVKdStdqNNN
SSqjWo1lKVa11LKpabTUpQaiiltbTilMpSmga1Wtpa2tWVS1K12pTa6lUlVu7TTQFKKIKbWpUqlW
zqWmg3a2lAposBVrUpqUylEFS1bJBVs0D+Kb02lra9FhqVLUrXjXTUa6llVKjTTUdqlra6l3bkFN
pqWVS41tOY1tdS1LTUputeSqVpa991GunUrXm7TTQSKVa6lqXdrdaWupadS02majXouNrxraQpTd
eqWpd6haWtrqmVS1K14105NdSvU7aaajpS7W11KGtBTaaleqXGtpqer2trqWpVZU3WuT1StLWGtA
306la91GmmgVxrqWpQ105VDUqtS02luUa6vb92tpUQU2uVS1KCgmlra6pVqWpWvdvpqNdSqaLGqx
ppqNZTbW11KFFKbTUsql3a2mpKpb2upalkpTa2sopSpWlrGKN9OpWvdA001JY11LUoa2spVrqWVS
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
7bP9+SKRbW9qy6ik305b3S3aW8Nu+cQNTeUjJs3bailTb21Wq5cVKRaN9+NVKom1vlSzu8m/EDbv
TaGApGolav43tVRNEt23bCkUHcb21BT3lcqWdbW9q9oqKTfmVfm9ByaBA27tkkDU38U7u21Fcsb2
2avZccvN5NSCdRNrfyX93k34gbd8tWXHG+SrVUVy3baFQS27je2tjRvLebV3Ztb2pW6ik353fPla
qBt3pykUi07ufJSW1Jsk3ttOalW03GnN5FIyVukpKSmztVNre1CdRSb2+od2hqqK21qbd8xqb5Tp
U922ork3t7aBULVUUt2jdqy6ibW+bd9Q7yb29pbd6dtrVUUpt7Q1VFvLdtVxqp1C3t7ap+9RSnVD
a3tWXUUm9vqHfdqqKqmpt3xA1N8qaCnu21FJvb22VX1C1VFJo33aqVRNrfTQU+byb50m3em0Saqi
lTb20pHlRNEt20NjVLk29tpU96huopU+tre1TaKik3z5vjVUU5Ktu7ZUM2pvlTGbttRXKbe2tuca
qileb1C1TnUTa306bRzeTfNVt3y8aqilTb6hbWqorlu2oKbROFPepCkp0ZtdNqqKWFJNTlD3OFAd
nlDJKUahKQnjVUWdqZRoSS9TtRNqBqqIpLajULlUtFNtqKXW0pJrn6jU5RVoFAY0tVQZxzb1KEu+
qgbt6MqLbs6gQNRQeysmwoBqUqJtb+7/zeX0cQNLareNVRS630eNVRFCTlu2oMakHKTbm5QClSZ2
k2t7U31FJqulzfdqqKkKNQ21N8m9pp7ttRb1XKlQKDVb+NVRSaOlBbtVUNdRNre3tNPeVT879TN+
NEmqopN7e00NqiqYpKW7a1NjVLt+rUN3UUm+g2t7VvVdRSoFB93zlBUoPlSXQo3U3KjQTVqJBUdS
5tJBScqqoKqQTaJTqJoUcQVbUnW6oZbKVGgpOOIGxxRA2ObIGxoFzpbqW1oGjaoZUeScqbZsaKtm
1Va0OJNimmhJU20nKm2bGjarG1udp1MpQcbNucaqFCjzdWoqhKSo8yhLao5PUmjKhnTpqVVt6SRQ
ikkGKtKDlUtpQbcqUHyTRUNRFJNEikKdSIJ3UU3KqUcqS6TiSotykmppQcKD5Lao3KM0lTFEfVVG
hk0E3Kic8oGg4UEpVNSVV2pKVG6SlVKKXJAgQTQW08oOUEDjSrLllBOcqGSBzeqihWgKOZJRqck0
1aUE29bKCBsaHOFAKS4UFbjQ44Gig43Tyod9t8oSnQkUFbjQ44GjqkkGVDvtTb1JuSqho5UtUtKr
lBxydW7NG5QeNU5VU3t1QVC5s0IKdAoOrECCi1NqChjm27QUBPlTtDjRsoUHyoZOUKqKFVobVLVL
QUHlSKbTobKVUgsbubNKC1ascaHGgoIOVDvs040VbVXWq6VVtDB7YgbGygUIUA01Tu5Ta9tqFiIX
j4WMv+94+CBKUnKpqsV3aasq3YpMpCo2yblWlJTb6r/ZA5hTxSqpSZTBSD9JXtQVLVGFMKOFLVNS
qhpQdq5ppdqNvKQKRu3Nykqvq0pObdVTjcN2spNErdS6Lg631Y3N+xSGi4ONJSVlOlPKVGrQq7KX
Y026qlatRK/uUhVt8KQbaLduUhVWUmxVyo24pCrSkad1ZOf0dylykEN1Q2t7ddPtWVNbd3eqikI1
Y07xfbKjfq0pCk20t6RQM995FKNlR0XG6rJt5Sm9om7tJWlV6jjjVVpSUG8oyn3fa6VXXv2V1Vyj
jXbUBGrFewpVRdNVvplK1dtR3KXKX3333KXKX4NplL75tSRUaOKuUqvp75VpSVt6pRlNvtr7Vz7Z
mi8KoaVMvpTEqsUoRbmxsu6vx7bahRpFDdKGpb5VtKdKrcVc0XQUx0pjRdG2xSO1HYpG29V+rW2b
bVrhTau6pTbZONUTqiPNFxaL120XrouKZQxSRSRQzddU1KpUtUyqhyqJUikFKgUKQKXmUjNsqrtV
NhSFBygUhOndSSqS6rpq06rqlv3pVaUpuUuUrTKXKX33KXbJthS82+p26p2+LfUlW1bUlWIJIKsj
LjXRa+WUhMpC6aoq1WrQUi0RVRU396FKo6aui5KgVKS33pVfk+7NzdtU1WUVVf2ozcbCku4U1tRq
yoKA3VVa6gVqxppVDnNqTYU9VjZvUTYr97OUqkqDKoaKs320XBUE1SnmmrqiVp1RUG/XJ6LnxXRe
BTHKi7QVqynJWqcqBtq3GxBTKSb6tp72UBSVqDFc3nSiUlouflQlJOFOlPVApVDfKNTFMdpqoqiV
KelRpbq1a31ArVFJyqFVVY0ykCkm+lOduXVuUasaKWb5OoqsaVau+oFatn1V5vqN/e+NOVU3VSpU
9VK5V1W5UBSxTdVVigJ9pTq7CmKknSqJt3mU9SV7dOo1dyktFycnV0KRSdLeiUNjbUDb5TPd7nV2
UuqxbaPuVbdQbdurNF6tKtQNtTzq5s3q+llVT6reX2dXZVvKO2FItO5S6uzSUpQ4UBVlSTq7Cm+t
rbQVnOrsqOnTKfbFZVNTplIb1A2bqb1K2aLl3a1eNgq8pJQoCnUe1WlIFJ03Wyq1euO06jnV2FI1
TUdUb/V2VdOdQU6jnV2VYqogumUh5SjaorVVJE20u02me7fvittqpSpTDbSpU98tvxp2olKlMZVT
dVlJs7O6TTvPu+CiUjV2FKlMU6atJWkrS3zrTS3KVKYyrp0qdKqSkadUqqtKu+bz7SKVKY3yre0y
kauylvnatpNJSpTFJubmyrp7lItmU2/cpIpHfJzbJtbfSKDKR3n2lSKbq7Ko0XgrlWK1RdLfuzfS
3KDKRyrp7T7VhTatUaLwm39dVbKubqnKb3ylTVKbq6E3LbCkPrTKTq5s7S3nV09+lO5VRT2i6lWy
q+uZ2rKW+i5Cnsq6faW+UinKq0XVVitQUu9zerp76Lmq3GxvqNuurd7l3anS3vKum0Z2qil9+znO
rqvVb2qfaTZS3zu5S9XT7Ro9q/edXZV9WUutWb1dPdXN+z6UmUvirU2K1dV9IpDu8+53Cm6uzqrf
OrqbY1SplIVeUrS3bMq6eY1VcU2r2bfTq4pelnYzn2lNs3zqreUj3N7mrOrqoKXKQpdpbUeVdPel
ivZ9KQKbulSyril6St7z7S2U2Kbq7Oq1TOrt6TZdLpS5SVLellXT3pXMptXs1FKuKXtyfGqfaTfS
3zqpTdXQ2ulvOdXUyl1Wpp5tZTBSuc7Ps265tCBpyril2rKdLpTBSqDu9oJ7IKF753lW1cpS3pTV
nV25SZSlLuUm2nV096Wc7OoRVtLfLUq4pOlVFLefaVOdW1dneSnV1Okhpb5S6UnTpb3lXTbcpU6t
52ak6uKTV3ylTn2k2Ut87yrauVpb9b5Tq7Ck6spdzeqadXT3VznZ0Krq2lvjYrVxSdIpDu8+71TT
q+rs7Sq2dXU2zelvm/Wyraq3bMq6dOqKRSVX0uzq2nV1W0t833n2lJs3ztKr6uylvdNvnV1UVbVN
Lub1VvV096WUuzbSlKvpb5SyrqtpC9593kpV9XZ2lV86u3pVRS3zftW1VS3pZV01aZSPW6ZQDXS6
qq5Ntpb5V0qSu7ZouBpqxXKtKQwpjftOk5V9LdWrCk6jV7bYUxzu1WUikinWrenUzc27b5VnJTcb
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
Mq6gjyqmVVqq3VTXnyqkCgqtZz1X6qYVFXVU06VU55syLnqtVWDRZVlVMuaq7VlXVbVmVdlVIFTV
YqOeqmtVvmqphFUZHVTWqkCq3VYoKrqyqmFVuqmFVmqkHD89TVcqpMqpCq66qeVXKrtXxc/NVe54
856qQKqa5Uc+NVXXVbqphV8VVvni782c/O6qaZVYqu1ZQKqkGOrKqYZjqpg6rlXxVWuagoKrNVM6
qZGMeqnlTUH56soKqaRGq7nqyq9VnNUVX6r1Vq46qRasO6vyK6rlTVeqv1Uj81WVHPlVJlVJlVyq
5VcquVUmVUmGzmyqkyq5dRU1NRQRVWqrtXGNVTOqmWVX46moPVTw1WuJ1U4uqkKKqxVpoqqZRVUi
1dzR1U5quR3V/MzVEdViois9xc+VUyqpnz1UzqplQZVTWqm9VN6qa81WZVdqKruVX43VbqtdqrVV
ugyqm+PKqb1U453VZ56rLNVTOqm/NVTeqmfNVciyKq5VlX81X1ZVcVAqrh8qt1W6rdViOo56qY1Z
VlVMaqRauoKuqpFq+q5dVOVVTm6iI8VRVTqq9FVYqp7VTKKqkyqkeq/VSZVSZVcquVUmVWOeqxVS
ZzVWLuqxlVOanmzmqaqReY3NVSLGuaOoj5rqpFq+qkW6rkcdVipqsR1bmVZVzjq6Kq7Vfq+qmNRQ
RZzxVWs5+bMqznqKirzVFWVHagoKqYZVTSrKioqKuqu46voKr1RQc1Xnw3NlX81VMsqKqYuqxVYo
EarKA9TUZV+Vfzc5qqaZVbjqyqmWVbVYoKCKoq7noKvqpplBVSFVTI1VirqCoquI9VOqi6qe0D5q
rNV6qntV+q5VbioKjKDKrnPV+RVU0MeLKCrKqZVW4qqc4aPnqpkaqzVcyqxVlVMlUVdVcoKrBqig
iioIrjqcq6qmFVMsioM56CgVVM3Uc1Vyq9Hz5lViooKqYVFBVTJ9Ks7UFV15zVWD1UgZVTOrbqyg
yqmPNlXVUyqpvVlQY9XuqmOVWanO1X1WKrOc9VMYquPlBVZoDxVUxM6qY81X1ZFz1ZVcNzVEdVNc
vndVMcqsc9X5VeoKsqt811FVNzUFRzW6qY87yLKs56vNzGO6qY1WOao5sznqLqyqxVtXc1Vvnqsu
qmOVUwu6rtBQHdVMcqs0FV81VJNVjmiNVTCgiqt1FRQVNVmrKrdVMueq3VcNVc56rVVMqiq3QVWT
c1VMaqa0FBlV6qzVh6toKr1Vl1UxyrT1WKvdVNM5s54qCqy6qY5VTOg5qBZFVTSrqDKqYnqsRdKv
vnyJ1XKrNXVU3qpvzRR87qvRXVlRVTeqm9VIGVU66nqsH5j23b5qhVUxqpvVTepq7pFV0Vnd2d1U
3qpvVTF1POdKpiuO7tx27PVTeqm7qt3UqqmOHd1WKuuqm9VNz1W6r7qpi3VSPVYqYqrlVIqdX89V
jnqvxHqpxjd1esqphVTGKqkKpoai7ur3fPEd1U4yqmL5qA9RVTCpiqpCPzHoDVf35+ZXVTdxRVNV
MKqY83PQVWKqQufnqt1Uy57O6CqmLdWVU5qplVSBV1VioPQXUHdVMaqZVUxacVVuqnNVIFRV3Oc/
Pbqpi3VY5qmqwKvqOfDVNn5juqmLqt3UR2+lVMcuq51qsuz0ETuOoqpjQVbUXzRuqmOZEe6rLqpi
3cdurqqQaigq6qzVYuqmOHqtW3cV1UwqpjdTVedVMeeqw6rJqr1VjKqRzuqxVTF6yqzzVUwqbdV7
nqpjURH53Z6rDupjqpiY/PjO6qY1NREe6vqyoq2qmLcVTbqasqphV+RZVTGoPbd1fVlW81VMKqY3
U1XnVTHIqCr8uoqDuKqmL51QVUwqbdRVtVMaig5+aqw7O4ndTVTCqmPNzRc53VTHnqHVZs2c1VN6
qbnj5+lur4qtoMvKqY1FVmpiqpvVTfqeoMduz0Ds1WVUxq07i53VTHKsqtnupqu89VMW4jW6rd1Y
d1bVTGrD80Td1NX9KsqpjZjOqmPPFUndTdWcx3VTF1XcPVhrdR0qpjVlupqvuz0ETs1WVUxs7vmM
6qY5VkR7jqpxz1Uxbs1tVUg1Yd1WLqpjVh6rVt3HVTjnyqmN1NVPXVTHnqsRHcd81VJlVOHVYqpi
+epPVZypt1U956qY1ZE46vdnuqw7qcqpjh3FVddVMamrIj3HVTjKqYtxVNuqnFVvDuLKqY1Ye27j
iq3KqY3U1U+dVMci5juO6sqDuKqmLj56t5z1fV3PVbj56uugdVo7qs1XD3nPVTHKqaVU6q7Oaqml
VNzHoKCq0d1U6qphlXnqpjVTfmdV2q/1PFVlVg2VXqr1Vqq66qdc1Vx0FVMaqbnw1Vrnqs1B1VTS
qmhjnPVTGqm/NVTqrqqZVUxMY2RRxVUwqtnMeg5j1Dd1U66VUxqpjVTGqmNVw91XauioDuqnV9Kr
53HVTCqmLPh4qqY1XKCqzQ3URu6qdc7s9vmqpxVcqpjVTGzu6rUdVMamqmR7Nz89VMW+aqkOq5VT
eLnqpHqpid1WOfrVx6Bt2bn56sqpiqqaVU6qv1UwurqrER2a7iTqphVcqpizVJ6rNWVU6qv1dU1U
yiZtOz81VIbqpvFVTqrKqY5zOqxzRXV9TQc+VU4oKv56qZUETqplz5U1WhHV2ZU0FVmqxVYqpAqs
nqsVUgYfI+arqiq+aoj5zGq7nN0q7nMaruer6uq+7qpxVTa+erKvNHVcqvms/PV9VMuc9VurzUFV
mr7NVfNZ+erzVZVdoYz1fVfq7OaqmtX1X75+fKvqsxOrarmVfVZqzrVa5+txA9Vqrasq/KjKr3Nz
VUgVW6qQsqKqZGqvRGq6+aKqmlBVTHniqzmNVZqvnqpjU26qc5lVIGRVUyx1Warh6s71ZV8VVNOt
VrnzKCq6DuqmHNV1WVWqCq3VTDHnNdVN8NUVWTx5zR8+XVlVIGVFVIFVNardVMKCq3VTWoq/nyrK
qYZFVYq+qmRsqppU9ar2GzmqzmqpjUZVTWqyqjIqqQcqebmqvVdz1eaqmlQerzVUyNV5jVUx5ufK
soKrNVNavoDUFVqrKDnNVTI1XmNVTHm5qiqzVTWr6A1XVUjVWKDKvqsVU7dVy858yqzneq9QVWjV
WeegqpxdXVWOcxqrFVu4oqqQquqp5h6CqmVWVWTGoKvqsVU0VXmq81RFVTSpqvmqtVWM5qsM6rlX
xVWo6g1WVWD1UgZVbqprz0BjRVUwqplVYqvmq83MaqmtVMTVfQGiqs1WKqQaqcc7uqxuqw6qd1Xq
u5+aq9HV9Vk5qvq3mN5dIg9lcH8P9KrFQriquVZVlVygqKrVx0HNVY5o6HtVtX98qtVUxjiqHz3V
cNV/PV5qCpNVbVBVTCOKrTUFQeoqznqUagoKvijPQds7XzUFWRnquVZVY5qqcRxVWqi7oKCgqtXV
Spz1ZVtBFVTmoPzHqp3Vbjj56g9BVlVzKqcR1WKsq7tE+546A9XVZFVTGqnnPHzVbQd+3OeKqkKq
5ZqA9VM6qbxc9XUFX0UVV2gq6K6A9BV1WVZV1RVcqyrKir6rHNV/buY9VMasqpgqCrKsqLoKqecy
jq2qkKravqs0FA4qqcc5qr9W1Uww8cd1N0GUFBVZdV6rMiqsc3NQVXLqaBxxVWKlmqpi6qa856tN
QUHPU88UdVIzyOrKCqmdVMznOeqmdVM+egqpjz1XKqZnqp5URVU4oI4ueOqmGVXarFBlTdBFVdoK
rLoKDmvn5qvPVTyq7Qc9q+eg5qqax1WXHV1W88ZuaqnVWdYo6qYOrXVTCrFV1W0FW1dFzx0FVOLq
66qcPKB0DoIqmgq/tz8/aOgNV7q8x6mevmue56qcVe6vqpxzR1bQVbHVsRjHMaq5Vbjqt1XOegNV
TCpqpga6tugqs09nZ1MAAf//////////9CoAJfcAAABBFsq5Ef//////////////////////QVdQ
VWaqb9I+lVN6Cp56ipqOerKrt1XasUVVi7qarFVM6qRo6qZ1UzOeqmcdTHVTPmqvurXVfqLqs1FB
UVWaqa1XqtqvVU1dV6gjjjoOeqm9BVTfnqaCq/lVzKr9VPaqd1FVO6qcHq856t5oqtqv1Uziq2pq
yqmGKgq50FXZVsUdW0F1WMoI+c1Xa5sjiqpmdUDqKtuqmdWxVYaqxrndAaq5UUFVyqy6qbx1bnMe
Pnqs1Uz1VaoDxVZVaqKCpq09RQVZzVU3q2OgqpnQVXI6CqnGqtqu0HPVTfnPVsVTU2jVUzqt2aq1
VTmqmHNFcZ+eqmdW1bVTPVW6PUmqKtqpxz1WKtoI6qc1FTVTCgugq11bQI7oKqcVU3PUVXo+a6ty
pqpnFQVUwjoIqCq5UH79qCgjoOao546Cpq6gioD1XKs1QVU3iqyrT1WKqZ1bV2VU95uar6m3z81W
UFVOKqbPnq3OtWaiqsG56qZmq83P1yrarNAaqm/PU81VmrVV91Waqb1bFVtV/n5+qNVZq2rKCOqk
GqmNVM6tqsRUFTVkXP1znquVbUc9ViOq1z1LqYoqvqphVtVM6qYvn6xOqzVtBz0FXVbzVdzVfz9T
442qCrKsqpjFlBV53VTOqmNVN+frnMqrd1Watquc/XKqb1WYqCqkWOqmVXUFVIlVmq8a6qZ1Wqri
qyqnFX1XcurHVyztV1VM6rNVN6rVRHdVnnoKt7nq/njyqm/P1yraqYVU3qtOrsqsVX8qpnVZqpvz
9cqpnVp+egyqzVYs9VItVnOeqnBqtquVUx5qmJxO+dVUxvKt56lxVMUdVMcjqpjcVWUEfPGc3Pz1
UxfPUuKq5QVb1iqpjdTQVbV1W1WedxVNVMed1UxuLrzrn56qY1bU1ER9VUxicV656nnqpjbiOqmr
euc7iVRU1UxqpjfPMVXY+vO6qaxxVMXSqkWrXFQVMdTVYoOerKB89SagoObrFQVXeeLUVWxGdTVa
oOd1ZQRded8x6Hm56Cq7fPlTQVZVTyq/QMziqphVe5+bquaOKOqm5qmhq2pqed83XnfPVTmJVFVO
aujq08cVTFzuq/URdeerqBxVbEqqcxVdVnPV585+vO6vqIqv56KKq9VlBzKpNVTDnfPF156viq6q
1VTG6nnoOtVmLKrnPU89VqrXFU3VTHrzVdHQI18/XKrNVMuepquRc/XncUV1POaqkKqmNW1dVcjj
61WeerE+epiq6o1zdYqnni5+vPGaq5VYqar1VmqkbnccXXnyq4+bnqeeLn61Uxq2Krqsqeep5+aN
xVPPVp1z1ZQRVU7vn65VTHOepNkdB153VsXPU86i5ojUFW51qpjz1U5ifPUmw75usVTz3z9Yqtii
NQVNVMas53VsXXnqygiqObnqeers61Ux54+Z8/PU89WVa4qnn5uqcVWxRc/XnqpjVYquVUx56BxX
VTHmqarlTz0UVVPqmr6CqmOdaqY1XIqsq2rrqpie+aKqnPPU89VPInFU1XarXXOd1bd8/WKqzVa5
6mJXz9ed1bFVdqeerqCq1zuLnzrVZ56rVWvnqVU1WusVTVdi5+vPVt87iVTVZqphzvni689VzOfK
rVV2p56DrVZicSj56nnqtVa4qmq7Va6x87VTfP1yqzVTLnqYri5+vO4oqrtTzmqpjVa53FHH1qs8
9WJ89TcXPVZ6xVKvn688dVjncV1NViqkw7ji6895z81VlVPPfP1qtVa4rXPU88cbiqVVZ65zuKq7
V/P1yq1V/PUxXcXXndWxKp5+eq1VZ53FVudarXPVSlE+epursqs9YqlVfz9Yqtqtc7iupqtXzurY
uvPFz1bG7ouarKu541HHnPzuKKq5zx0FWVWaCoqyOLKsjiugPccec7qsR8x6tUVVm3ztc9W1U556
C6A+c7cUfPVcyOqzfPQUFTVlWRUHPQR1FAuY9Vm6sijqyrqCq/z0HOqrvNQd+3PFUVfFFVnPE+ep
jNVZ6xVWY6mKJ1dVtVrncUdTVY53QRRdeegznqplVZdXxaqsR8x3HUc9Tz1Li5qsdVnrHztVYera
rNRz1MVV2Ln687quXEzVUwNVSNVZ53FHU83PV9VMnz1NV2Lnqs9YqqZXHVnNdV6OqxzuKq7U1UxN
QPmquRdee85+aqzHVlXVWairXFVd56nnquW4jVUwjqs9cqsxc/NVTBmqsVU0qxVZVTE1W1dVft0F
W1FVyKgoKuoKCgjoMq6KqnNWnjqygupOz3FzR1WaCrqCgoKrlBQVXKDmoKrlWqgjqefmVTV7q3mq
asNFQXzVXKtuPnqatoIqqdVbfNFQXzVXKt5qvqu4erarFVygiZqrHNVlWI11XnlVxGiPFVtXUFXR
HzI8oKr8dBUuKrqsiNVdjoKCgPVZqTvmqphcaqtUFVOajnqvqqm1Qs57oKCrKBXV1A7quc91Yaqm
FxVbQUEfMeoqsnR8j7RUDoHUGoKrUVnPQM8Syrsqygjqyrouft3j7VdQGqygP3oD80Ru1VqgqKrN
BQc9BeVEcdBfeKq5QUER6qQqrlA4roKrlW0FRVkcRzVWu1BVtBQR1FWUCj73Uc/Nz4eKOrIqrXag
q2goI6hxxc/e6jn5oqqa3HQRVXarlmqvxVU4oKsoKDnqc5zVPfmjiPUnoKmg5kaqnnNVTCOgoFz1
fVx4qDm56tqsZdWVbQVbzR1UwqKrMVAbnoLqpwfmNVfq2qmGHj5r5+arKDtV1Xc9BzH79uaq/QVb
QVFVq46Co5+Y/eOqkI9TVZqTxm5qvoKviuqxVlW5z0FBVbq6LQMsiSRl3V+CjjqpjVYqpV57qphz
1X4qqd89Aoo+erKCLnqpQ55ugqphlx0FV26rlVNqrlDFUVXKsoOapoKqac9Vjmqv0HVc9VNo+e4q
qbZFQVU2iioKsiqKCqml1ZVTCo5qr9DF3iiqyqmMUVVM4qnrVY56qZxRVdh4+eq6qqYVU+qpjVuR
VF5VfoelVMMiqu1Us88VVNsqKqYVZVTqOgjqpeiNUxVWarfNFzUFVuqmVVyqliqzVeqp3HVTmqxQ
c9VKtViqm0VBVTCoyrar/PVTCrefnj56rFVLNWVUw6R0EVVMKqYVXIoqqdRqgqpeqsxc9XRRVUhx
VX44rqpn0iPQUCoM5qDnqtUNVugqphU89WRc1VqgqpxVSBVTCq7z1UwqKqQKqdRc+VWaqc9cqsRV
dVSxFzR5zVW6nnqphFVbqt0FBQUFVuq3VYi56qcVW6rdBFFzVX+bnqphHQdIqCqmvNQUGRRVWYqG
q3z1Wuaq/VTKLn5oqqcc1TVTOgqu1Ux5jVWar9VOcqKrtVOaqWKqZUFVNqrcVV3n6darHXpVTCg5
qiqxUc1VMI6CKqnE9QT1VOKqYVNVNqjnqKqbRVWYuegjoKCK6rlVIdVy+bnoKsoKrFVOKvqphV9V
OKDKqZxVUzyqxFRVXD1XKK6soKsuqm0V1NRU3QRUFViq1VTCgqphVaqplQVUyiiqpYqvHqvVUsRV
U5qpxVTmKqxHVfqamqxVfqt82VW6rdBQVWz856rdBVTzrVY61U8q2rKGqncVVO6GqzQVWqCqzkcR
+c8VVLFVMoqqZVUsRRVU+y8qp9VTmqnVW1U8qv5z1U2yq5HVaqpnV6dVM6sqph0ioKrFBVTCKqm1
Tz0PPVTPmoOlTzx0FVMYqC6nnoVlVNYqqQ6rDqpVT5+eqx3qsVUwiqsVXMiqv1WqqQ+Y7qeaOgqp
tQqrYqqVeeqmHPFFURc+Rc65nVTbmVVqgoIqvdVOOaqxzVUxx0MR6qcVWLVV6puq90qp2aOpyg6R
1XGnQc9ViraqZ1fVY71UzioKuyoqearIqrWc/NqpqphFVf5ufI+c1Vp5VTFPm6UHNVTOK6tyKqme
RVZV3Sg56Cq/z89VKtVqgqphVTvmoedzHRPmqtRVU/NVZj56s56rtTVTOoia61XHHFHU3Vc51Vsd
Viq5VTCqzQxR1WOagqyrKrdVw0dS06qcVUzq+qxVcoKrFTVcqphz4mqt6HijqphFVcjoaCqmdW1Y
eqndAfpUVUwjioavTT61XIqqQzVXIqqUarlVigqpnzH5o6rkeVXeeqmFBVTbnqpgehqak+VXY2qr
kcXeq9VTi3dVyNOq1zVU2PVlVqoqxx3UrKvq+gq+q9VTiqlWq9VTKrKrdVyLI2ueqnaoHQVFVvnj
NQRKq5HzRqraqQ6qd1EdV+pqspqq5HVZZ6CraqXb6RVUjVDqaqbVX6tquRVWqCrKsqs1Uh1Uwqsc
9Aaq1PVU6quUNVIdVIdVMKqQKrNVMKCp56rU9VTCoiqetVNj9ar/Sqm1BVSHVcjqpDqphfPVZqph
Vanqr9VOKuquHquVNVNqqQ6qYR0FVNqqQ6rU9VTCq5Vdq6qm1V6qzVfqv0NVygoaqQ6qYVNVyOqm
1VqeqpDqphz96r9VmOqm1VIdVMO8eUFVqeqptVlVMqrlVIdVk9VMKr9Vmq1VZqpDqphFzn56iqmd
VNsqptVSHVcjqsVU2iiqphzVU45qmhoauiqsVUhxxVUzqptVSHlVNqqYVXKqYVWOsXNzVU45qrNB
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
dq2rTVXKqU8qpnVTy8i54osq2qxVczniqaqZ5Vdyq5zxVU4qp1FlVyqndX1Xat54ooqqZ1U4jPnP
Eo4o4qqUari5+erarBz1WKuquxR0FV3WVUoxH56rBqqUarnOueKq7VvNUVXququx0FVOKHnqKrBm
6tPU88VViq7V1V2q1VY5oonbjqu1fVfqsVXOeoqu1bz1XTRVbU0CiPzRVWKrnPlTFVdq2rT88VAq
toFQVXKreVWartW89Vmqn0VVm4lVY5qmqwerqrnPFVdq3niq2qn1VPYqrFW5FVduoq6rarFVw9Bz
xVWIqqe1Xaireagq+q9VtV3Lqp9VcqsVdFVZqu1bzxRVWKtoMqp7VYVXRHqu3Vcq/nq2qxFVtRlX
VXYqrFV3mq2q6aKr6uVW1ZeVXOeKKq7VtVzKuPV1V2qxVvMaq7VT2giq3I6tqsVXI4ueKqxVdq+q
naqVVYijyraruVU9oarlVg9Vrmqyq7VvPQRVXarFW1NTV0R6rFBlV2qntVxxc9W1WD1Wqjmq6q7F
VYqu5VtV3moKmI9ViqxVT09VznoIqrtWo8VV2rqrtVirfMqu1U95qrFWbq2qxVcPQc8VViq7V1V2
q1zRUFTzVbVdNVT2rquioKrHNFnMaqzUVWKtiR4qrEWVXaqe1dEegq3KqYG5uararFVxxc8VViKp
qu5Vc56DeVbVd5rPVcqsRVbUGqu1bz0EUVVirevPU1XOeLKrt1XD0HPVtVirVFU1XYqrEXNVtV01
BVc54qtqsXV1Vzniqu1bVfyq5VTypiqsVbQRVXb54qtoKtqsVXD0HPFVYiqarp6rnPU1U4q2q7l1
U+quVWIoqsNVdq3niiqsVbFU1XOeKI9V26rlX89W1WIqsNdV2KqxVtRVtV00UdVzniiqsUBqr/PF
FVdq2LKrlBdW1WKtqDVXamg54oo6tqsVXLi54qrFW3Vdyq5zxM1W1XcqcquVWIoouaq7VvPQRVbV
Yq3nPdVznioMqu1NVxRc9W1WIjZdV2KqxVpqtqu81Aeq5zxRVWKmhquc9BFVdq2rDKLKrNBHFzc1
VKtXVXOeKrqrNVyqwsqsc75j4quiqp3VTurubnquc9VnmqpzUKOiiyrKuNzVXKqUTbqp3VTuqwqi
rjc8XNFVZqpV5squVWKqdtOrqCq4erueq1HzYouarVz5QVU7qyo5qrVVM46rlVyq9VauJuq5z1bV
Y5oorquxZz5zVUomVAeq5zxc1ViqlOKq5zvniqu1bVdyq5VT6z81XaypzmVW1WKrlVjniqpyj3Vd
PVc56vqp3QVNVyqxFFzGqu1bz1bHEepvLquc8UUaqs1XKtNz1bVYi5jXVdiNz81W1U5q+oijquc8
UVViI/PVTmqzFVdq3MquUF8zq1VNBzxRVNW1WKrlWx88VTzXVdygiqDxVU4VQjx87qsc/PHz1ZVc
5qCrarHO6tquVNWxUFVOIqCqxVTiPnqxZHzUFW1WqrVBVZqtVXqCqzVa5qCqylFVTKrDN3VeqtLm
qp46E0dVqp5qrKyKq4dVWqKqmnOqKp5o6rVTzVWVzVJ4lVbqzmqv1WHUniqpSSqD1NVjnqvVWag9
XOqmFVyOqmFW1WKtqpxz1Xo6rVVPaqZ83PHzTcToIqmgqs0HPzq6lVHPzVXTVUomqp9VlV1Koqcq
51WOegqsVUpVNW1WJvnqarNVyoyq2fnqphVcjqsVWOabd1NTzPn5qrnPVY56rHMapqsNc/PVnPVY
qMq2q1Qc/NQdYuaq5HzVXOtAdVWHHVYNEe3VY56qYdarFBz1NVqqn2c1VipqvRVZVT+qxEao56Cr
HzUFVlVWud80R3dVpVWqrWVU+VVi+aq9U1W6jmqOdxcyid1WlVaqtZVT6rOaLmqvVNVuo5rZ+aqx
FVYvnqv1bVSjQ1WFVYqsVXI8qKiqmNTVeqsc0WVWFQVX6rXM6nm7noKCoquc3O6uqtc1QqnnMqrS
5ueOq1VTGo56mhfNVfq1c/PzVWKjmoOeq51qKiq1zGjuq1VaVVqqnzqcqtVW6jmNVeiqMjdVyq+o
qvqMoKrL5m1fPVaqp7VTirai/ECtFsWIsqsR1ZzZVYiiqp3urOeKpVWUFBQUFVMOaqlTdBHVtVmq
m1WaqDOoqIo7VVNKtPQVee6A++aKqw8NURM0VBzxUB7qyrKsqpvQVdU4egiioFVprqyKgqaGrueq
xQRRR1bU1NVMDZHVSFHVbqphVlVN+aKKrMuKoq2qmMVWc9VN4zUFVNqCpqIqtugqppFzRVUyqtR1
bVtVmq9HVcoOeojqtVfzVZHV/PVnNlVN6rcVVjKrbVS7q26qYmw9RVsWZaioKm6Co5qCqmFViKLI
u9Vmow56mgoKvqppVvNVSDzxR1XubKrNVqh5qrlWVbcdRFGe6rOVWqqZ1WaqYcxriqI6rtVNzVUx
qphVcqsxZFVtW1bVtW1bVtW88VVqq3FVtWx1EcUdVNqA54qu5qqQaqaVbFFz1Uwjqvc8XNVroXVT
COOg5rqpBijq2qzVTCq3VTOq5VZcdRVbqpjcdVMYj5zYfKqaVbVtX1bVsdVNqCI/Me6rL6RdHFz1
Uwd1ZVTGrLoIqCoyooKqYHuqmFWVUwvnjPZ46t5qCKg5uaK6m+ZUC5nFUHjPUc1BFV9WR80dWVYa
gNVlVM6rsd0Nx1XqrVX1Wqr1VMjVWuaoqvVWqtqphVTGratq2rat7H7VbVps5sNVbNHVTuKqncdV
mgqsUFVmqmaMaIxo6sqpnVkdV2qmEUXNFFQVU0qt1Uwqpg+c3NUnyrlz0FWYc9VNKv5rqx1WTxRZ
zRVZVZiqpjQPn5quyqzFEjUEWVWOeNc9WVWL5qu57iuqmVWxRVZnN256rfNV9A41V1XRVFWZtRR0
FVMKtiqsH5ueKgVVyrKCqmeVdzx1bz80ZueKq7Q1fVTKqnSq6oqp1VdMapNUVUxq2o5ubnVXc9XV
ae6rdBnPzUEVBHVsZ6A0VViqmZ6tqpAqppHFzVUwq1RVU2qvc8VWrnoD0FBHVTDmqt1Uwq2gioKi
KrKCooFVTSq1FVlTlVnKuqvc0VVjnqxc9W3VpsoKl1Yqjm56qb1ZVaqpjnNzxVWbq42UHNVYVV3L
qtVWYlHFVTG+bmqyrKv5jZlSueq7QVdz1WqrNW3Vc5s5uaqmJlVfqyrIsyKq1VZi5qsyq2eq5VT+
gjqI7yKI9Rzo2VWqrOZVTzmiqvc1X82c182VWqrMUVRFdVNHVYypqs1WebmNUc3OqrVVmKgyrqCL
nyq1VZiVSfmqztVcq+Koqaio5kararFVnnqv0FWWqqa8x6DmqVuqnfPVlTQO+aqmGVU3oIlVaqsx
WdVdlVP3FVSjQUlW1KqtVWYo+epoFVtVmrEaqmdXxOruarVV1WVYfI6qZLmNVahPZ2dTAAH/////
//////QqACX5AAAAY+reEhH///////////////////////mqt3kdnjq6qzFVajqpvVhqtfbmyodX
ZVazI6tiVVmOq1Vajqvcxuaq48jyrnlVqOqzVaNVjSqtUFVnWVdVZyOoyq1jqtZHUZVaVVmJ5HlW
1Uwq6q06mqmOVWarWVW+0dVo9ViqmKyOqmZ+xz0DoHlVrLqIqCqzHQR1U3iyqyeK8ypoHlA46rNV
q+/NFQVU3oI6qZZQZeVUwqyoygyM9RVTegqs1bVlBF2qs1WqrB6vqs3jzvVZqtZHHHVtW1Bu0XNQ
R5E8q6rY6rNVrmqMj5qr9W1ERqueGjqsVWarWVdVTuM9VOaiOLIuaqxlVOjPKiOqzVajj5uapqMq
tGqKrNVPKrKq2r6rWOq7zZHlRU1We/MaLKrdVNKrVVmKqnlA8q+OqxVZqtZVZjqMqtVUwqprUo1X
9lVZqp46szKrWR81VjKCqzHlVNzVWqrNWdqsq+hqDVU8qpg87R1WarVVNYqvquUFVN8qtGqyqzU8
0fNVTI9VrHVTLtkeVU356rHNU5FHVlX1WqrNVipeXVZiyqzVazmjqpvlVqqxz0EVxc0VVmpdVMo8
qtZdVmrboKrMeVU3PVaqs1W+apiuLKkzzmjqs1WsqIqCgqpvlVqrarNTUUFWVFVrHnNkeVU3oKrN
W3FzVU4PVaqs1ZU1bV9Xc8VxVWueras58qtVEdVmq9QxVdFVZqavj5+bmqtb5ubmOaq1jqI8jzmj
qs1a85sqtVWardVy3kZqCrKrNVrOaPmyq1FG8jqKtqs1XHfNlVrDc1RHVZjzmyq1VZqzmquPIzZV
cM8qI6rNVqqmsTUfNlVrmqKrNVyqzkZqqY1WsdV3myPOaOqynmVbVTaq1VZiquUDyOo5qsqs1Wsq
sx82VWqqZVUxjeR9lVZquOrMyq1lRzVZVTyqzHhqiq1VZqztVaeR1GVXqqaHztHVZqtVNVh1NVPD
ZVaqKsqsx82R1FVqq1jqt9sjw1VPKrMTyOq1z1WqrNViON5HUUFVuqzVazmjNlVqqmF1U8eR80VV
mN1W48qtZUKraqeVWY8NQVWqrNVvmt5HUZG85o6rNVqgqy6sq+oPV1VOardWGqs0F1Y8jqphzOqz
FlWRKqwaqmkV80dVO+bnqKA7yI1BUZkVWVD6c1Wugjqp3zxRRVZ0yM1Wc10FWOKqndBlViqmETqO
Zc2c/NVlxm5jVbV3PVTu6qaHquUFW26tmKqZRVZVYcWVWsNVYqKvqsx1ZVfqpkePobmquvIzZQHe
XVYjqs1WqqQonQVfVTI1VMMqyKq31Oaqm1VrHmR1FBVTKr6rKeZVlVNYo6teR81WVZVZqtZVTKq1
HVTKgPVaqphV7yPsc53UZlVrOarKsquVWY7RqrVBVcN2qtPI+bKuqKjKDmjqs1Wo6rDqarhqrFVo
0dW82R81VMarWOqmVVrI6A5qrlVmKoqs81Wny4+mVU0oLPVtVioyrT1W+ar1Vc5oqsquRRxOOoXN
2qpvFVTKrOeoNVTU/NFz1fzc3NVcqzmqpCquVZzc1VyrMx5l1ddVqrz5zG64fmNz1ZlV2rHHnN2P
huY/MbnqzOY8xVpua4jxVZVZs9RmVU0uqmFRi5qqaXVTCqmG6vPvmj5j8x1HVZqp5QRVZdxc9VN4
6iOq3FVtVmKqzVpsq06oKvqaCOqnd61QZVYjZoqsqpvFVZq3miyqmHM46iqkSzrdXniioKnmuqxU
mqpgeguqxFkVnoItxVfzc9WVHPQVU0j5qrNVN6siqpvHVTa6toLivIqqYVbFVTGroroNxKPcXPVl
1Waqd88UVWc0VW1dFFVTHmijqKsjqu1ZnMqrEUfNe6Dmzm5ueqneRXQc1WVWKDmoD1UwioMi3Qc2
c3Nz1U7qIo6qbc1WVWKDmqpjVTWrKCKI1BVcqs1EcWRRc1WVU0ioKqYVbzVZQRVUww3NfNzGqIz5
VciqpozVbVTCqmHNzUGVZErzmzmiOoz81VMOarLqphzVWajDn54uarebnqpvVl1Uh0HNzVUxq2gq
43NnNVTvdWc/NVYoOaqmPN25qqYHqyqm5qrHarIoqrtWVZHdVjD8/NVTzL5gnMg5eEz/yLIByFyE
VU6qvrmqsHurqvjqp1V9V6OqnVTFU1XKrlWxRVUt1Oc1VPquq+qnDjccdBVcyq4fKk5o6mKLmq6O
rlVTiO6qZ5U1fHVcqpzVcq+KrKqc1NVqqnV0HPVTmpznq9Orqsjjq+q3HV1Wx5Uc3PVTrnqauupO
aKrKqcndVOamqnF1XqrmOK6mrKvqvVU5yrqqd1dU1U6yOKq5Vdq7I6lR9Oeq5FVdM6qY1ZQZerqs
c2qvqy7qpzVeNV9XWZ1NVOnVcijurrq7nquR3dVOaqfx1U7qp1dTkdWxXHG8qpyoz1dVTnnqanKq
c1dU1U5qaCz1faqIzdT3QUDqcoKBxupdXRdY46A3TmqLq6q6qm46rlVzn5+fnquVXI43HU1XOePn
PVTnpU5V1TV1VOTR1NVOaqc1dHlTzWfnoDWd88e6mq5dVOaA5zurD1PNVTKM1WR0HPzqOpq6q7V1
V2rrquVU6j1HVTrKuqY4qqeXVTyJq+15P8zquR1Xo6rlTHVTht1U456Sgq+Kr6COKJxRHurY6tur
sjquc9VyNZU4o46qcZQZVTiqkGraqY6quUF0FVyKpqamLv0Nz85qqe3zXVT1VFVPqqf1bVSlVT6q
5V11XKrnPz1XKSq4eqnFV2rqrtVODO6qdR1U6t1dzVc6k1VOKr1TVeqpwaLvEbpzRs7jqpTqp4aq
n1VOYnV9WyVU6qT3lV2rXdXVU5quat1ZVTlGqKk9TVT+qnC7VXqk8d1UwqvqpqMq2qzG+aPmyOqx
V0dVOKqYRuOOq/zR1fVcfNHhquqY7yqmFXx89Vi6vjoKt5+aOrqqbc0dVPqnOp6nvVfqphHs8fMe
rY6jpzKqn+ZVtVP6qUDUFVKFRVt85skjyqmEdVMOekjNVtV+OqnFWx1NRzUGVLj5qkx6r1XHjqpz
zc/MapqtVEbqpxlV2pq6pqc5jmiiquRx3HFVZNU1XKqc52qsVUzzLqphVS1zVFXR5VTjI6qdVaqq
tNVMarlVOm6h1XDVU5qw5qrtTHz1U6uqmFVKlVOqqcVKyrqrsdTVTrnoLjqvR80biqpRkVV2ramK
PtVtx1NVOqrkdVKMl1XL71dkdVOKCOrrypqp1z1XDnMbrVShU2agdXZURVZHlXVXamqnVV11UoyR
1U/qdWc3Maq7U1U6qvN1LquXV11U7qF3oKteVMVTVTrnqv1Wcq2KOOpqp1zxVNTU1fVeuOrKmqnF
VOKtw/TOeqnNVOKCq1z31qKqZVU5quZUxVU6qvVfU1XD1dFz1Xar1X5FU1U65z1Xear3VShVTjnq
pSjqtVMVTVTrnPHz1XKCq9VlVOKqfurKqdZHVTmqn8iR4nVzyoqI0eqnlVOZKrnO8oKus6qT1U8y
qnNWVWY44uY0Z3U1c8oO1VO6qdYeqnlWxVU5kySqnsbyrjxs9VPMqp1U1WY46r9VO6tq+o2eoeVb
upq6M9VPHnPVZq2qndVOueN5VZq9nPVTyM9Viq5VTqpbyrauq7nqp2870lJQRx81upq6Oro6r9VO
sqd80VRuojyN1dV8cb5ryqnVS4qCq/zVO1VYqplVdoMPVT+q5V1V2qnDyrqqcc1V+qnVVyKpyKNU
lVOau56ujdVOqlnqMqs81TlVP4qnKuqI3fNlVOqm6ueSVUo1Wamoxx1XVz1dVTqpcVVOsiqaDD3G
ZVdVT+gjZsqp1U1fl1fVTurauqYueqnVVKNRVsZ6mro6qUJHlXVbVTuqnVxdqrMaqaqdc9VKNVOo
6uPlXVU6qXUZVtXVMfSqndW4epqp1VSjHVeqsupq7LoN1X6qdZV3NUVNVOo6vPlV+qlGro3lVOqk
3Oeq7Vf5quqaiOqnVVO5Mu6Spq6Oq+8q7mqp9VTyrz3HlVjmqaqdc9VO6qcx1dGqmrqqdVLkzmq6
pVV2q/kccnPVTqqncfNjqaujVV51X6qdZV3NzVNVOqrslV3I46uqp3VTmNyZVTqpursqs1X+arqn
nqp1VTs1TE46mro6qcyPKu5qr9VOqrjySq7UVNVOo6qd1BzxxvKqeHNzHq2rqmgyKgjPz1U6qp2f
KqcyXVTw8VWmqDVNXRvHlXVF1U6543JVTzmqaqdVXaqUaqUI6uyqzVsdVOqlyZUVdUo1xvDc9VOq
qUY6qUJHU1dVZqOe6qdZV1RUVNVOo5KqeRvKrNXVUo0EbNlVOqk3PHVeuoq6pi56qdVUo1DyqzdT
V0dVKEjyrqi6qdVMbqs1cqmqnXPVSjVTqOrsq2ojqp1Uuoyoq6pjPcbypqp1VSjHVeqsupq6raiO
qlGqnWVdVZq2pqp1HVT6N5VtXVUvVXOd5VTqp5ueOqlCqlGqzV1TVsdVOrkeVaqmro6qdPKuqs1U
o1U6543l1ZU1U657qp5HV2VbzVXaqdVLkyqzV1SaqlCqlGN5Jz1U6uPMdTV1WrnqpRqp1lXVWasq
aqdVXZKqUI3lW1ddVPI3JlVOqmojPUc1BQOgquVCqamrY43lAo6mO6rkdX1dVZPz3VeyqnlVO4qi
6mqnMbdVnn5z1Uyyq5VTxnUcdW1EdVO6iOq3kbyqydVbU1XKqeRx1U7q66uoO0dXVXqvqaqZGiqu
VU8vKrOYe46qdmquc8VXRVXIznyqxV0dQ6mrqrNBz1Uo1U6yq5VeoKjMkqpQjeVWauq2gjdVKFV3
KqdVJ+eOqnVVKNQ6CLdVOKmqxVlVmr6mro6uec/NUVUo1U6qY3VZqvZV980dXZUVEdVOql1X3lRV
Tiro6uqpRjeUlXUEbt1NXVFRHVSjVTrLqp/VZzncdVPo3lRVx46ufOsqp1U83PHVShVSjVZWZfNI
8qFU1dHVfbyqnFXVWaqUaqdc7qarh6uqux0F1XOaM1VOqqcNnMY54utx1ZU1NVx3lTQRVU5jTq91
bVeqTVN6upqep6nm6nqTdTnV0FXHjoKqdHqTmuPKmpsxzmqI6A9Th7NU1NmOc0XPVTmKq7VZqY6r
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
OGyo5+agzDWarqvjqs82G61Xb5o6rGGyrjUFVvDVGc188eVU1qs9TXVdj5qBmyro7NhjYbrVZ5j4
aoqplV180dBVbw2VNV+Pmszzqa6mqzVZw2Th+agyqxUGs1TVfjzmw1XVXr5o5yow2VJqAyNOZzXV
Tirsq3KuNdV6Pmqsmypq+zZVbnDYars5o8NMRVX75quqs1Uxw2VNVO6r3NZsq411fVmYbI+aqzlV
mYNZqm+fObDVdVTq+aq9mGypNVZqphhs5rquRs1V+PmqyqnFmq5mqtVbhsqtVZjiiyKq2qqcVU6j
o4sqsHXNVTA1VjDdKqcRUFRVa5pjKrEdRVtVKNXZVZiR+aKraqcVbVpsqpxVcqyq0bKrGRHqyJVW
scVVuoqtRLKrFHlVOKqdzdW9THvIqjKrFVvJjUxVTRYY1mqpxVTqOo5syrKrlX1bVs2bDZVTg1Vm
qmGGqtVGc11X48qt1FTUVWqvqw1mqKqcVX7NhjZQVZU1HMfDVFVir+Y1VNcNnWqnEfNZlV2VNW1b
HFUYbJyqxzZzUBrN1qpxHQc2VWqrdVOKqexVWzzlRhs6m5qrDNFVmc11U5q7KtoKqcR1U9mzVU1N
nWq5ZsVXGyratqpxQc0eqqccx6tqDVHNFlWcxqirTcxqtqD3VZ7RRVU2NU1FVMqDLqxTnaLnqsxR
xd+ZGqtRVFRVtRV1W1Cq2oo+1RUZFV95lQtGqNc1RzRVbUVXzZU1FRzc1Vyo5uZc1RzRVbUKqnWV
W6r1Vs3aKqmlWGqpgaKLDZzGurMNVas1VmoM8iiVVi8PUUCqptVsUxF2zmPVtVMatqphkVQerarZ
6sq2qzFzXVTm6tqKuiqDRVU27RVFVNYojZVmRVazVbVbNVZqIrNVqq2qmVTV11WDVW6iI0USq2LD
VcoqqbRxZkUR+1VNl2qMNVbqsGqt1BoorqsROrZgxsiqtmNFEaqm0R+arFFzVU1mD0EUwzKOqmiq
yoqKraWI2GqKioqKs5oouc1VNeaq/zLmqsXMGimMNUVFRUVZzRrDVU15qr/Mqvq2qwaKYyhjq6oq
2rIoooqrFVlVU45qnKqa1caY5zRRmqFMc1urT1ZVlWVFW3VaqFFUVZVTKq3VaqKioRqtqtm5qipV
VNoqstVdUVFW1WIjKrsi7VU2qt1HNzVCdVg1WxVFRUc2c1WVFV/mTqprOG683NHVb1OVW6qfOrKq
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
Krj1aquqpx27VNVox3l96LsegOqI9B2qpxV1WX3qauqtRmdV6i7c1XH7856LtVcPVaq6qnGVU7qE
epbuioDJ5dVygorzmw9B1dV2Pm56qc8/ZaTNQHiiPht0HU56Bnqs0DPlA3o9x5QUB3is51jcRu9A
z0TM6JYc6xvKtcdVyqzV0TqpxVdeVXqKioHV/WiquUFA6qeuhPlCZ9Tqq5Vc7c188dV1TVEftVfN
UXdTVZqp3HFUo9TnOeOrI3Vhz89WW26rrq+q91dFRVfQd7jTPU0J8ZroqlVNVOKCodVy+eN0Tmqu
quNmxHquxHygvrzVXY+ftQc9VPr5+e3RN1U+d1XHVTlupdDpuq6fmjquxvnqvUFXOz0GRVU4VA2e
puPsm6qcnZz1XY6J0F1XueqmXPnPVcd0TqpydnPVdjij7UFV7nqplz5VuVdburKrMdXc7om3QXVT
HnqtR1Xqssx4uegPlV9M6oOtB3oLdVPT5zuOT2dnUwAB///////////0KgAl+wAAAI4paWMR////
//////////////////+qc1NAzvDHqWc9Vqq5VdPzvKrMbPVcObKrNVzKrvPz5zny6qfVU5quc52e
N89V09VMufLqvHn6DrZqqQqGgdVOFHboLPZz44Y32qE5rJ2UMeeKF4COBjHNVh6r3MapiyqmFxVG
RdDdairbq6Kqmd0HU2VbFzVWqrVBlRUXVlQfvQUDq2Mxqmo5s6dbyrYqtiNEbqaq4+tBHHVh87RZ
V1TQVB6mgzoaKK4n21EY3Wgjq7VW9Io6CK9Gqy6t6xZFVtVw9RHFnfMqs1W6qcc9V2p6Hj5qr0bi
NrtFU9qs6RVZVsTjqyOrY8qOuXFUdai6uoMyg5+ZRxRdesVBGaqmB4+plHVhqnmZufpQM1A6iqxZ
o3kVVOKsjzmqpiqDMzMzMw+VEeZFHV9B3oKt6xxRmqphQR4fvH1OZ0FWZEeraB1UwuoPVYqInz1F
VOIlVlRz7joI6jnqI6suqzHVZureudMzojdTd6sq2Koiq3rnNVaqtc2GiNEY52zx1WqDKCq1z9ai
Ko61Wr63VazmPUH5j3cfNz8/NVZi6xVWYqqcVWqsqtVU4qw9XHqw8dBGfmoM5szMzMjyo56jO2R1
UwyqmEdVirOtWVWOmjUBtVU4qsxVWaqcd6jqbrUHN2ug1VlxRWuegPQVEcVWRxc6oIqBGjq5dajq
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
dzajyOqwak9nZ1MAAf//////////9CoAJf0AAADDWfNgEf//////////////////////rtVMIoqm
qxVSAapqphlVNarFBQ0FVm6CqxzUEVXn5tR1XOfec0VBFVZ3V9x2agoarMVRlV6gqu0FVO6qd1X6
tPVThugyrYz1FBHVZiPz1fvmiqefmj5qGOKro+eM0fPz0F0KoKrNV64qqYc2aPzc9XxxUFBQRKqm
FVO46A/PVkceGqeerarFRzUF1dVY5quVV+qnNnjq6I9VyOOqndTVZqyg56qd1U7qp3VTuqndVO6q
d1U7MjUFVO6qd0EWaoKCzUEcVTU1UwWVXKCOgqp2arareR1U7oKqQDUFW1Uwq2qxUGqpyqr9VOnU
HiqyKo5u1BGqr6j56rFXR1dZqCqmp6qa81WVUyPQHqpllVygjiqIqCo5qiqnfOeKI5qqQKqQuaqk
KqkCOqmFVMKr+UCoFQaqpnQVUz0aoquVFVyoqpndVmOpqD1FTVfoKr9VOKrh+0fY9VirYqtqsVXI
+aOq5Uc1VO6mqndVO6qd1U7qp3VTu+e6qdx4qr6zmqux5kdVOY46qc1X+fnPQH5z1X6qcVXz1XKB
cx+ZVWKu5r1QR1WaCrKGq9V9VNueraqYLnjiqsRn5oqirOeKgq+Oq5VlBUUFVioP2qygi56CrObn
q2g56tqKmruc3NV1ViKp5j3VpjOgNHz9LqOeqxUXVYqTHq2qwbnqeegqpxVTSraqQKgx6rFBVsVV
yOKq5Uc9Vmq5UVUxoKCqmcdVyqndVOz89WVbz1bVTvnq7mqphVTQ3PVTCgqprVYqKrhqrtV/nqKq
YVfo9VjnoKqe1XKt5qt56tNHQGq2gPzUERosqT0G8oKhVXD85zxVNW5Vc56tqw3Oqqa0ManeagPV
8XPVThGq2qxzXVbqDZz1Wsq41VirI6irjpVW6s58dVur6toKqYVU2MaqxQVdVlWc5qrkXPFVcqzn
w1Vip56v5quqv3QWeo5siqpCq+reeJGqsVXOaq3Vhoz1ebnNhqrF83NQc1ViqmVTz1WYqsoKtoOb
nqplV5qrFWqqzVdq3DVWKvqt1Xqvuq/Fz1W6jnqtVWqldaqQIjVebnyI3Nz1W6vxRVW6CKr4sqpn
QVfV5qrFW1Uxq/pzWY189VOKrdXmqsVUyq2goE6rdVygiq6q0Y2qirDc9Vxc11U4nVz2qsqObmuq
xdVyrKC7q+LnMaz1ec1VzmNzXugqppVYu6HvUVZz1ZVTE3NdVw3Nd1WDVcaq3VTShii7VXIua+/Y
xr5rxUNVNKrBua1VZquWar6rnaqwbmqpzd0NV+pqppzXVTjnvnq6I3PVTLmNVxqtqsWaqkCOKLtF
UZV3NUxG5ueqmV1WDc0Z4qtjNVSAfKCr8qptVYaqOa446tqsUFBl1X6ruc9VioiNzR1WDc1Viqmt
1dVYqpnz2Y9BcRuaqm1Vi6rBjm5rqyqmNXVUzi5zmyPnqsG5qqQsu6DKjnNVcqKA3Me6rBrPVYqs
9zRXVYqtxUJojGqpjVnNfeqzVYjPVlAqs6GqsVW6qYGivnqsG5or7mqu1XKrMXPFdXVWKrZqrK5j
WeLtVtVi44zVWKuvvEeq7VlVupNzXdVgyiqs1bGaOrqrFVmrLPV/OY2XzXHVaqpmc/PmRGqsVWaq
YGq6rKA1Vg3NVlxmquVbVuVdVlViqybmzmNV1WXzVbVYuM1VirDZV1Vmq0bmqy6rBuc2VNWxm5rq
sVWT0HMYxqirOa46tqsUHNlWVbhqrFXVWTxVXDc2Wfn56g1BnTKCq5VYqsxXVaqw90BzZQGNQ5zX
l1WLNzVZQWaqxVlVMTXV1Vg3NVl4bmqu2bms91WKsNVYqzmM7uqxeGqsVdVhjc11ZQG5j3VYNUmy
8NFdVirIua6qdmNVTGrOa8uqxVxuZUFAaqxVlVMDX3jq6qwbmivDVXaqd2bmu6uqsVYaqyuY3eOr
qrdVi6rhqrFXXzG5r7xVU7vmu6rBojVUzqtmquVdVYurOa+9Vwxue+a6rdVg3NlWs1Vi6g197qsG
5qss1VOqqY1Wzc11ZVYs15zG7811W6rF1caqxVlVg3NfezG5qsuqwbKuq3nioMOao5+eKgqyI3Nd
WaNFz1NVip56nmqLOfmygiNzVPPzUFX5lTzVWzmNVTCqmpj8zq+I/NfPVuqsoKkx+3PU1ZQGNUVW
MOep5r5+bnqKqbGOeqwarojVWz1XMqKk0XMbnqy6rdVi6l1U4yrT89WVUxNzXz1WauNzc9Vm6rBs
NVTCq3VTigqyLtVcjqKtPz1cY3NfNz1U4qt1WKuNzKqzVYjqsGvI6uqsG5qsuqnFRHVdqarZua75
6vwxqnmNkdXVZVYu6DnfN2575jc15Vc5nzc2rqsGiNVTOrOfHzx1WKs5ryq4Y1Wc11EfPVlViq1z
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
WY+fF2q5dtdtI9VqOi7PZueq8orWVdVj5u1CfnzV9lasy7Rrsz86yp7HjPVadDivoqnFuraCgztt
Jn7I3O1UmiypzVDlVg9SdUHeK8jqal1XDm7djruegxVNFdXVXqvugPU5E6vugoI8s9TUmzsczq7s
z9+eKq4fmiMjnP0R+19j1OlVyWKhjw3PzM/btQPWVWLquXHZ8PU5Guegt1WqCpNV9Srj51QHqY1V
1V68s6q+r6r1V6q9Veq+r8RqCiq+q9QrKG2btzPI8qsPSUfa47quZQW6rlDV2XzVWFUtVJu1X1XD
VB+Y3Mor5szmPVjquVXGzdlcdx2bLzLUfZnfMz9lHFkUdVw50fDnMc5uba3zKM8fNV3aruZLmzmz
WVdz3z1dVxuxququVJ9c+jx1fFV8Z1V0aq6rqvqvVdV9X1Xqr1XnOerzXmWa6rKqs3UqbVTV/PG7
cZ6uquVcep7UGs1QGwyoYnHU9qu54z5vqfmdWWbLw+Xz5lVjObtHc1zZeHxZmUB8oO3Pc1hlzxLK
uyz5QZH2VnmjqgoDx9FmkuyvI8PH2quc81lXPLqcyp54j9D8y6VMVBVdSq6q9nPU4eayaqvH5zb5
8va7PObFN1ed1WM51Q2ue6r/PmjnzObtj7YaLv2W8Sq3O1s1BdTZ5qrLztmVWD40rqu9n1oLupyO
87YjTTq6Pt2PFz4jWubnuPqqmeNHl7jzDc9WVJ6DmzmP2qsI6xZzmoKire1VjMMsPz4fmzMiqVVv
a+fIszVBZqsvseqzFkVBzmjxZzGPkWKM1XYz1abLNEc1RkRuePOfOd9ubnNHHVZznN3yM6qtd6GP
FzZznyrTKq1zVeaPFVmH7UNQqrHShdAdUJ6lUES646vjnqmPmqeZY3Fl1MbqcSPdWYoszHFjqY4u
bKnpUnWOJZUxvElmRVbFVkUWM2Kpjx7yLEsec9BFUxqr8zDncXPV+Y6rhznqtbSvM54k8q6PmyKq
wufKt2sVvDdLyPKuurTd858P0iyPHzRRmXZHurux6CNLOmZUt9z9Dmvs8WRvLix1PTufOh0d9szr
VZednh1lT0oFmPMd1WarJsq3miiiVDiqanGaqz0uoxYotKhfbMiZsjoKrPN0oT3EquzMd1a41iOq
GpyKq8sO8aobjxKqzUu6k+Ix8cdVqLLOnuLIqrNCufL5sypceVPVc6qVVZWPM58M48ypqFzqqyll
S8PEqtjzm+1Wc7Kg7YqsqccZjKpMbFVZqsUMWIyjqbNUY6B91EqrNC4qm46nV4aLFbx5VY+rKmom
sqyq4mjLMqXmGqyqwsefasR6nMXNzVWHmYqkyxqrKBZjy0qtqsZhuarIsaq7FU1OPKrFrMUeKrNJ
m5lmRPMquXVYWM91YquzMNzKJpYj1csZqtq/ph3lWxKq7EsSqsVOM14kfGoksdXxZFVYTNUZlS1l
TVciWOpVVhdHmGq37E1lSdYzVWKBZUvKsXMeI98x56Ls1jfMokerl07Ro2OOqzedmscXOqujoLyJ
Lb7VWVFQvMdRzdqujSqs4fs1FnTLurozPm6OPKrJqsygzudVBlQdlmZUczq6pq8zzpU1Kx9qrSxV
XHjS1V75qrGcxj1OLHQKr7WZVx7tPOyzIqqcur4+arqryxnPaiNmZ2VWOqx0M+p6uWPIoosfM8NE
qrtWdjdLqceVdiiqpzjj5qsVX5hubOc2z1YqLnO+0WM5soYo7Wc+UWu7Oaz1KvrHQRVdmVF5keOP
Mj54+e+9XHqO0XPmc9XYa+egOs586XzmyrsNfPnW26jmwyoN89Vqznqzniw3NVnO1qhPq3dszyq1
zXhlV1S6ubiiR8NzdO3PVu3VZNmc1TUu1lStWs5lzxVWefm6aoTpdu1nq488n2PVcWI0ajyguPKC
M1WO8qcupqWY/fsep5zpd1EuftGul6q5ZlTlVnLXOdVFVhKKpoqCgoOfOna3fPH2znzMqsnV9j8+
d87tLsdR9s58zKrNBbMfnzvlV3n79kj1OGdCjpR9asoe5jnXZVXFmXQrmqpzHVcqxNPM789VjXSq
xz5z5nN0ursNeVNCsw3PzOPMV3U4epi75kXftnPlVmPnzM75Ec9TVcOj30OsoI6Cg7c93lVrnixk
XLL6c5qrnMbKDpl3Q9JpTW4rXa+7Z76Y8oTtRVXnE1b6R8yj6Z0tGq6gqzOkc4k6ipN0uLmvojGv
G6Dn6xGq405z5nRRVX7NHlXI67VXOnSKNHNzdjHjqKuoIzT6ugPzVXKCMx8q7OtBnWrZqreiqvnz
nuh6ZnP0XNVcPNLp0oFl1EXPhor6G7UFC48qOnPlBHVvaK10iTqKnHi6VZVzy6s51UXnQ5zGMY57
6OoObtfa1258qOboa+ioKF9qDKtjq2ouI9AarOeh3U81RHV3NV3c1VtdpKi+dmfPmeVNBU+Lt0OY
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
FFRZzc0TiiyKqmKyLmouaKq1mZiiqxaizKirObmiooqjmqIp7MqGoo46tt1WL7doubsuaiy4qrRs
kRz5st6aLnqPLzVWtRa6SxdXqqxVZfWWaqwyoFViPqrcoMq+SgUxUVd0VW3F0WqA3kt66mqxVb7K
fq6DWeH5ufbq3UcVDa146sqw1BNWo+erffKjWRz1WeHxXVtz3s12lzWVZz9PO0bt96irDupj8Mqi
6tXs9Hlx1Z0qyrMmF2PzLWc2qtlzs9VGtPzTq+YOarJZasoKsTvEeNLOegPc06DntVMXVTGrP06H
PlQe9d+7bffvpVdH3cV1XNXNSnNNKgqzXjjvGudqrLiPUH1GscXV1Kqe50eh5ruzxKI+RRZNS6q7
FlXTR6DMoPHHVlWL1VZLqJNRWsby5q1Vi0qsXnTKszpVlBLQVZpVfVtXozxHNKY76HyrcPhjZV5z
8/Oj98P37t92n3XWJRdY93VuqtuKI8UVTQq1QnOzn6R0NU9nZ1MAAf//////////9CoAJQABAAB9
+w7tEf//////////////////////HlRQ2aPprnqyzKajPiMcymqtoDrLWRn9l55xXo94c2aeHyou
YVzWpiKrNYzvDqq1LZ7zSqHzaq11Zqz4qg+St3h8OjZnSravqw8fPVlWH6mPznZudYe8tqYjTS1K
6sq2r6jej1Kyi6PWj1Zd9MqLPlQeWooI/I+fOuqDURpTUEdRUrLqsHy8qIz5mc+boKsMY537VtVy
LmzL5oouazqrJjMoL17MHiNidWcxufIlHmKYq1c1Wc8R52Oo1F5mGyO+eol6Gq2ai8y7w8UWY6ha
i5kqBVZmeVB7mqC6GdPVZMfni58w8UdXc+RZnOaaTqVGaoXOdc+doqnd76R9zdb5zc7q2JG1MVWK
s1fPmc3PjqOao5qGM3PmZVmuhoo+a6qcbWjLn5zNzUZombOZNzVA5rnPZsmvat52jm53kTmlk0bL
q8yVWOai52bJrM50rPO1fzzrmo8iNjmqmK1jmorPzmyqzmY7c1bjTmmmn1oHkUxrR8mqg/Tnyd5v
JhxRvrQTWZNUKw/SoO8qNdH35piKJzR6jofFL46i7SiidDmNOaqyNxqWaixx1ZNZi05pZHkdWTuZ
jurZp0HmaXPFVnVmmsyrZpboY4sq7Kid56syKrE5qKOhyhUR7zKhRVZNZmOdmo4sj7UPPVjzKi4n
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
z1zF4um2hnddLs6Z7dmxPtOK+jzoLO7N4jM1t2YzNeW13xWoj5zdM5u1mdvmw2dWuzezG7WZ9Ik9
mtu3QLtjvsosFxjyzPs7fXIpieS6Gudjc0zRGmsvvsws09hlZ2ZbMjTBz3dtbN079Jrsuh3dvZlh
tTW9m2ukwYyFq7Ps2M72Y9m6VN2ZXOLOxji5jLuzmtGsx9mZzrpnWYjs+zPXd4redOyN0nliNvoj
dEum+hre+nTfboto4w2+msMzLoui30Ns76LNG6K+m+m+ix6w3RPprfTp1NtG6aMsRs6ZU9HMLfXD
M19O6j6JzBtjGa7XRmV4bpQmzMzp0RtrOrcT6TXRJm31RnE+htq5o2LOi7G32oDXvqbN999IjKzG
Yci2bIunc21ezbNb79EbOjW76Ybpsz6d8i6Loba77zfRmMaLN9OiUWzGXRdDbRt5rDGN0S2uuG2a
ZMzSdEY2+t5u9GN2XbfSbMsMbV7MzX36b7bN3MbvNm6bVn30xHmja6Iy3s0youh2baMfc10XbRl0
MtnP1mjHvZmbOiOs6LsbdD0mj76mSPm+kRkeaMuia2ZRdLZto+zZNdF0Rl0a3bwx9mfTOivKjF0N
u+nNh9s00ZXm+lB0R8N0XMfZprOlzsybaMfaizojGmuhlu9YY72aZN0VzWdEY22+/XokfpOeGZs6
dOjmOiamLnOiV76de3Toe02frOdOnRGQ6dc8uc6NtdNx9s6YazdFtvrhpx5ds0XROp6KI286RZkw
r6NacW+iTzDLomH0P0ZtpVGGs0WdF0zT6d1s/Ro3PjCO+mdEfokc276cyeBhmR830VQjW0aLds7G
JWt9Iuhp5K9Hwd0l0VAkna6HvrdSjKaOjTE0jzHS+hjGnAj9zW7yaj63teOcxOzZ2Rj9PXeI0xkS
0YytLujX0Ms7YgbtEsN4LMrXQ3mRZ1Cs/huhsVmmDGxWuhuY0WdIqDsaew3NY6YaauLpMGT3h78G
dLN2NQXMJdEa8UXbEazGUXTObLoc6N2cx83BOhcSeLW+mWunl5q2Nn63h86a99yN9Ndc6506bdnT
oLNQPGzZd26HrkTuI6XTbfVWKDOivt3vpmJT0y6Hq1axrL6etNYl06ZQdvLPmZEneZ6lY3rm29Jd
H2XuZoNLMzp06dMzOmdOwcSy86Z7MK+hvb317dHvO/R6Wmtzk5sZmWm10S6Z1zr003FcVCbDUKbo
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
I/O3Nm4py91Xcszj+K91X+atOsz5qtPlW9txZp1bH4ubNxK+1V3LuIz5ynl7qpxUVnE+arT5VY32
iWGxlCpXgzWjuhqpjeRKq1VYoIo6uioOa1zugiSoY6sqyovDVcfLdBQVFRU0F1X1QULqppju3QUP
burjjoOtTdD2tVdd88W6E/dVFWxRG7c1W89Bjq6gq059Rc1uoNcVBQqrLq81V1Sc9To+pL54qA91
/MupoOipN0Oqm7Zpm6DFiNkzz1dfQ+rkPzxM7vzLq5dcodVdl3Zpm6DKDMMjvmInj6nyo3VdqMiy
qx1q2pju4+c0R+a6iow9WpnflWHoI+aq9Oc9W4e+l3VsUeRnObDc9xUBueg5qkx8s1BfVVXOtBFG
6v5zzUV4aa5+7oOerevWqmNV2rqs5qqcH5oqqYKKgiV1YqrPSeebnFHnWp5vailebUfN265nNRNG
fMqrpsqNXH26p5uW+ezUHPzUtW+Xm1HzdumLmorx82VXYsqNH5+9DHGkmY8VXRx1bVTaq7VdiyrK
vqKDnvue+aPcVvIud9HQVNXZF3qypqxXb7x85+fDxZHV7yq5V9V3n5qDVTzxUGRUD5qjmVQbn56s
w1VvnqOaONVPMe7NQc+jUB6rFBz81VIGd9VWD89VMKCOPmObnqyLmqp4erujV50Ldtdj5UvsumsP
lNJVjjjx5rKuvetc8WJ0drpX91s65qnsl06YdUz1Vlxx5eayr72tc/NlWVXZeCK4K8F+aPm6GPzV
W4qqfVXauu04siqY+brijq51NVo9xVXcVV81Vg3NHVTCrKrp+hoqrVSc1Rr01Wnq6r3VtW1bFcXN
QVdZ8q2qxVhqti0fm5mc5qtjjq2rYzU0VRVYq2gqOeo5quSj5lzZlVKUxFVTyzRK6sSi56mY8Xbs
ftcl3oo8S6J5S3v2RmWu1VhWlNR0LnD9j0p3Jp5mNePKWyE4zb6d1VYVpc+RyNK75uaj58q0/Ncz
HOqonamqndXVEbz5lV9R1NFV0V3H3fSOo682nPKLDHtI5o6uitxVOVdQHqyrKuNurqA9Xc9XUDyr
Kszm5ojc1TV1WXQVZzxztBz0FWRVZFVcjM+3MeLm7VFWTeUFEY9RHHVvMc+c/PVTE+qH1b1t+yG6
dJDdp2j1dIadoOyjZtW5OfHu1Rp2uznKxuk0bb1Ru6TDaoO1HQc8y4q1rny3akmrq9/r/24z4Y+V
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
2EQnL1yJd9WXeuv0ffDd7Fpl5umSbn2TGx6lGHipDOiWA4kb1+udz9sLbqqrT3bq9vLOOHu3EvTf
T1vp+iu54sGzOrvy/pcHTevriOzG9Lk8e3K/Oghxor17b59bHI3Lp20Z9huLzq3JUcy26CRNb9ht
O5FVjb7ZXIsd1n4nKyYNdbfqwFkb8WbNhv3xHKMls9lulml1MUxm5ZJLWOdqTA6nak0+mV9EPIdT
C83TVPlyNX0ajLcg8yIhpCurXTSIvQe8JD+7PN/HWeNlMddNmjOd5nj9xkObE5trn9x9vfbZ34yR
hQ9fXPduezonzuI9WNYkYqeDOEtEZky3GQNZvMhz2WbwHoUYeVabSG130sSJe9c16rlqxLU8xqdb
3R68fc0zyynmOCWlvscOHfwVGPSOjO0OO91+89L1ZwV8fTRc9s30up547vCoW29md/SqLIqTr4b+
clevHZCMebFPHkvWuC5IL7pxwm/cIMct7kVMare2NZnWp5Zq97XE3/ooz0NynWrrydPezVe9goxa
exzxZDS+HTWp45RPktKa2gi+rk7NHmDe4rEivPIKx3Hd7NtKbI0R5rZGpzlf7M+dW/XdmP/CokjM
9JTPes/H7Wl/Lpjt4vLXuFdtT//3c+ZDpu017NfjAX+LGj5uMdt2q+dNAB61WNtI5xYi3SS8zc29
XG8OWwcr71K7H53fk5vhkc1jcHvk1cvuxh9d0Qdb+ycn7qf1WX+u1pvdaXOfaDSMtvPObXWXbjQt
/e217zDewBAjKW6UPWRad73er46354Xoa6exkmrHQ/Mgkuwru7od5+cPCpc+Ut/dW/s8+RmSC4av
6WSfLSHYkWiUmBcWT663ley3570I8paLf6jHKM0HQzbDzBMNDzbnqW/hlqzObERT1ReZJkQ6k8nm
mXQf0be0nI2+lyQjQ2U+GJh/cjpTH3kx8RU1dlszYMhgZOmT0zAiHrWYZRVFmRarsLSO2/wiX38o
o68moNvLuzLyZPN3a1/AvmN7NXrq/bmlb0u5a4K9i+Lm35Lm7PTpwUv2e8O83TKaJ4a7aWvjy9Qw
Vr9ZU5fWkNob1ho1d18/3ylSx5t2OtJBQtM5hU6YPowMx6xlSKf09aHPXz7t/b577dFMVxqmmr6O
a0yOtWx0p3f25Xy8sdQWMvvy+RhHI7m/1rp+fkhaIy+xpKc+qLlVWwwbYUknLpNtM0OIcH7Nzpjn
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
YRVbVYNVuc9WXQGqpzVShFVTHmqartVMOeM9VOKCgjiq2rqtqvHVBlB0qsVUkVdzVWKuqpphqqd1
bFFUuKq7U8182XFUWdUGVXo6Cq/V0VxVU5quZVT2q7VYuq5VTOgq1VNV2qzGeKPKqe1FVOTVGUFV
+rz1FVPXVeq246qcRVbVeqKCKoqasuq1VaiPFV1Vmh56Cq7kVTzZVcjqphzVbQZ0qsVUkUGVdzPn
qtXVdoOaqxlVyqlSqn1V6oqarDqDRVZFjPd1WKr0dRzVdVd5jRnq/MiygqpcPQVNVK1V6rMuqxVT
Dnq+qzV9WVPPFVZqpWqajnioCBCk9Vdx/j+PAuusx9N9stdn03kZ7xYe45KB3ba2+mulI90ho5Of
pzn5ubn5+eqlCPmoKmrjx1W6rFVjmqt1Uzt5VY6VW6rFC6r/NVTiqqAZ1War9VMqrFAeq/VdqpQy
6qbx1U4PVT9UHPVTGpqpzVSFVSBVS0bpHdTVTvKrUWUB6r9V2qkmqzVYznqs1XeeooKtqsVXaCqn
dVOo6qeVUzqppVfqp/VfqpQqT1FVjKrkVVvmNVTSqxjqphVTt1U1qWuegqpAqp9VTHtVTuqzzR9O
fmPz81TVShQVceOqxVYqp3VSDVaoD1U7oKrCqpxVbqv1XcuqlCrqqbxnj5uaqntV+poKrtVODRVU
x7VU7qY46qamXOqqc1U4jqu1U5qpJqs9o+c9BUWqrKqu1U5NVTGrOlViqndVIR6qT2dnUwAB////
///////0KgAlCgEAACPfIcwR//////////////////////9jVTtVaqqeUFVP6mgq2qxVStQVUhVU
756mpqpx9z79O8i9+7o6NN3RUdHZ+84nnvPR6o+9DR4zeRqNUBtZdzKt1XnVqqt0FA6Cqnaqamq9
VT6qmlVNuaq3UVbz3U1ZVtTVdqKqZVU6oKCqxU1XKrD5qsoKqe1FB3qpzVTeqlXZqirVV1W1Uzqu
VZVTmM1RVTzKr1BdVNamoqygqp7UVZdV/nNlSbmqKqQaqa1Ur1NBlVOrq6re9XVU1qp3VYqKiqnl
TFU1bUVWueq/z1ZHV/NVa5qu5ueqzzVXKqQ3Qc3Wq8qtdVuq5VdqpLqp1U1Uu1U0qt1Lq2q9VnPQ
VFVPFUmqp7Ud6qc1U3oKmqlXdWXVbTqp7U1NRV9Vuq1VSHVe71NRQc/PzKpq/Kr1WVZdVPOaOq5l
VMFVeVRU0NVJlVMKrdV6q1zOgdCqrlVINWVXaqU6sqaqTqqUKrVV6Oq9VlX/w9S7Bu8tBpUOYfcl
6uZNk3NmeY8VBHQTbvpN0Dzavdmq2q7VlBV9VNYoqs5o7qpnVSrznqeaqm1VKtViqnEXTKCqlaqk
Gqm1VPauznqpjVaqsnyhqyqndWmqyqlWqxVTiq8ap5qA2Gq2KqkA9X1XqrvNVdqeaqnPNlVir6rJ
qsqpVqsUFBVSrVSHzUFVir+aqmfNVTqqlaqmfNVTyqyuegs9BVSBVedVMKrNVOqvqpxVYuraqVaq
Q6qY1dlX1WsqpjVvPVeqp3Fz1Xaui5qrtW1fQVZVTWqkCq9QVU+qpw6mqlU1XZHVTmq/zVUzqpge
Kr6qVarFV41VOKipyraqa1fdVKtVyqmdVi6k/PVd5qqZHqph1Nz5VTHsaqn3NQUFV2pquc1WVfVb
qKrWVWKqf1VQqm6qVeY95zYeqxVl1ZVdqKqc1U1w/NVeqpkYxf0iU9POexO3t1zTXjOtmjmlQmya
narrjvMNHeae8vtQVZVYq63UVNVir7uq/Vbq2qnFVOqmOPnurqrVRVbqy6vq6q9U8/eg3VaNaquV
Xqqc1U8otVZV9VOFz88eVWPLjqpx2qvmiqyqmVWVUyqpvdXxVWarlV6qnNVPKrlVOIqrk7VTCqml
Vy6rcVBVTmq/VT+o56voKqYRRRRRVNVo1V2q7FfPFV0VVyqmNVOcwyqpzVh6rmXVlXVWOxo6soLq
6qw4+aqmNVM46CqnUd1WMmYqsqpvVbM+eq7VTmqnmqsq+iuqnCqs1a7qsVU556r9VPKhZVlXVUyq
piaJSmyqlCqnNX1NVyqnFXVUyqKrFX1UoZU1flVPLqpvQczjqpkerKCqm98zqplV8d1XaqUuarqA
9VMqqZKqnEe72t0FBJ71ugyrH0yJug6rE+vSg6UDiXPQUDy7dAunWgfSq9VsWqtqwxooovKiqkOq
3VlVmqzVSNVYqpi+ZVFVMqsq2oiqpnURVWeaoq2rqtqKirKsq2oqtVWObM4EbqKmqzVZqtVNVura
rNVMqsqxVNWxVFWVZVtVurarFVI1W1bVSHVSHUVHMqirKqSFVZqtVZzVUyVRVZqpnVTKqxFVTCrY
qqYuqxVYqpGqKiKKoiqM1VaqKrVV2raresq2q9VuoqsqsqqmNVIVVOartVmqxqq3Veq2qmtWVFVi
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
+UHNZuagvO0ZsVxvmPzLJ2OK4r1HeXnY1Qje6iy6CpdHz9DX15qrvagZ+fLoDPmvmRri7Rm6nypq
sUBotUFrobWXQGjqeeLms99I9YagoOfm7dWbp0xh9LMrzPe/e+nTZjG2q8w1jV679dH5t5mje985
zd+9Wmw9XdTVZQRdz1HftzWzdauSx503FvMqum689mqOY3bmtxLrk+nz9bqzvdxnq+rDVdHZzVXe
Y1W0F9ctnt3mXF3tde/MfW7vnqe/a6s7UF9T1Fs3WrkZb5o7zu7qOaLvaWY4zVfVeiXftzbvMfOY
/vXvdQfLy4qufNFuOgqL7XW1ntB1vr29Xuscxh4l7z506dDYfM8ToOkxuPyg57aVRV9vr2zO2dut
WXfac5t9+1D1ur6haoD0HY2UF1HSrXFvrR1XLzmO6vqFz5zW7qHzVfk11j79BVlQunMZRnzKrq5k
6iPpjZni6i+fpfOu3VR1ZfeqnOVCoD6ug7YbD1FVxHoLx7NZ8vI/cPz51ift9LWOq6zn3eLuY9XG
ja5jvT6uWSDGs5RzkEaY1mtPo9Z4Ya3Y7Nuc57cQcQ6mzeRN4vD9z1FC8695y+9tdXGbHFajoLju
Pq+ivZs6HUlxmxru57q1Z0foftGz0F5faTrlA3Pd+fak6sxufoazdc3kV93RM1qrH0OsxxWnGqCL
t2xHZ6jOhuqedLt860u5gbWO311QHfXL6WO9scz788edddBJxJIdml4FamTpZL5t0Y7L1qf7Z5Rr
s8u8uehm3MHoVjsHqLVmQ9Mfmj8WUN+T3OqjyNZb1zUFxW9ZbWUN9VluY5jzHPgizUXObmqVdSlj
M43Vmsycu8nubzn2mfDnmrmKm1zUNz3OvDVHlxT1D2mLmJ68jNZstmzrjoUe7uMNnxZbvTis5zBj
e7yCaXTv738CnEpxZDzcvu81nurVp2o7dBEux8xIzoLzrz5HzJ9cimOpjHS3HdWraSt0AfXMeXZz
x5mZlnUcWZEGftmnkxaPepxVLdq2rj5ztGtUNBcWW8imL64d0GJuzHx9bSsK8aM3mLFfVK+zu3ix
vFna2azjsO++1AY+2+wOliV5Zrs7sVWQY8d1dm+m1lAu1xrtQLrz9zRbXa2jY9VYqC7ji0ojRb32
1m+mjRdLNs2G6c0fR33766RazcbelfZXlmZ7dRzx1Ze7wRa75h4tqLfR1dFUbtX0XRPEMMN9ruro
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
6Q3fIb5Fvr5EtacLXfIm++R3yFvvkC1pwtd8gsv3yG+Q+18fWtOFrvj1gxvjt8e774+tacLXfH/3
fH74/R6+PrWnC13yC3r4/fIKdiXyBa04Wu+P998fvkEGvj61pwtd8fb75DfIfjfH1rTha75Bvr4/
fH/++QLWnC13x+LXx++PpDXx5a04Wu+P76+PXyHbXyFa04Wu+QUrEvkF8i7r5EtacLXfI7FSr5Ff
ItxvkS1pwtd8h/d8ivkXNfIVrTha75H8b5DfBFXPc+tacSIuYM2KUk+gm3oy9Mpr0zembOV6ZvTK
a9M3pmzlemb0ymvTN6Zs5Xpm9Mpr0zembOV6ZvTNvXo69Kf/d/pv+9M3plNemb0zZyvTN6ZTXpm9
M2cr0zemU16ZvTNnK9M3plNemb0zZyvTN6ZTXpm9M2cr0zemU16ZvTNnK9M3plNemb0ynN56vQl5
+vLd57vEc73oOZgNeXADOGs2iyefTSJHJVgN1nJmvC65CFAOqoePE9DwFgUMw3MOjbyBZ7C8M4iZ
oFECuzoFr7gzoskfASIlMlQUAnVaiF4KxZhuSJ+UTNansJnrAImCWgQPYjuQBmrQFGn4/gexzUvH
eEQIY0JTTJ2Hf9uHNRjva4WWjtB3+6e+b+ggw6Ktrs+hSsBujuNPv/ei2huj/f3d7cr2hHdgenn/
7ZM2EXoWEkx7o/1DrP7A7ub+sRre7t93Uu/vSt9vu2nvYnJ78tkpI719Z9zdYn90G63t93dY3fYH
7jGl27P2hyR9iRi3t2jLV1jWN6fHvb4pHWX+37fqpvanuP9ukzf3UUr/+O/6G7o5dFLozuF0ZNZN
IrehiT6CRebL0nqgICBrqnV6TvSd6TvSdnS9J3pO9J3pOzpek70nek70nZ0vSd6TvSd6Ts6Xoy9H
3pO9J2dL0nek70nek7Ol6TvSd6TvSdnS9J3pO9J3pOzpek70nek70nZ0vSd6TvSd6Ts6XpO9J3pO
9J2dL0nek7yTeSbOhxn37Om382ezocyZ3rOjbtes6PVvV2dHnnnrOjz1b1nR5+t6zpW889Z0eefe
s6V1vV2dHnnq7Ojz0l6L0VU0bG9u9Pw6Hb77fb+6h9G3v6y2T7fsdrG/rE5fL31KhzJVL7Got6U3
9vqaJ1kawIpXt9iNS/aevWx9v/u5uZu+nH/7vjTSodvrP2+Kqfeun39FB7vawkP+pN0O+j9iM0dt
+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
idlqlmZ6sI3NErlgzD9dwSLoKDLIqZ1mbZEWOFUFBKZkFBuCYRIQnJpmY2GZFQcYIP5UEwKSu0l8
LDbVlVywc/wkXAf4CmY7gE/+Uo/7wFkK5w0qQID3+JIP+g/8IPwFUCrRgev9IgaBjFkDXVAQEDXV
PoxGkbgoGy1cULlbcarkt/3JbFi6n/YcNyV/7ktcl/+5LYsPd/YMNyV/7ktclv+5LYsbdQ7HguS/
/clbkt/3JbDhtT+G/DiuS//cl7kr/3JbDj625/mV3I3B8dxVDe4Cbdyb/////Td3cm/////03d3J
v////9N3dyb/////Td3cm/////03d3Jv////9N3dyb/////Td3cm/////03d3Jv////9N3IGuqAA
3Ay4WYYXNO4pws4QuGuKEMWKFnCGLFCGLFCzhDFihDFihZwhixQhixQs4QxYoQxYoWcIYsUIYsUL
OEMWKEMWKFnCGLFCGLFCzhDFihCU7kdCzhC463HWELjzcSoWcIXHq40whce7j/CzhC493GWELkDc
d4WcIXHq4wQhcgrkBCzhC463DWEMWKFnCGLFCGLFCzhDFihDFihZwhixQhixQs4QxYoQxYoWcIYs
UIYsULOEMWKEMWKFnCGLFCGLFCzhDFihDEVqs4VSFcUoQuHkiQs4QuHgErchXDj04uJNyVuQtxDu
K1xluMNyH3ve2ZmZmbe973ve2ZmZmbe973ve2Zm5aAgQQYeve8OaqLRjvRv9AdUvsWZox02/poR4
aGHnoAYXD//27mbub/////buZu5v////9u5m7m/////27mbub/////buZu5v////9u5m7m/////2
7mbub/////buZu5v////9u5m7m//8HGZYuGMgYwcxo6JSdcBx2YbxkR3gLub245vbmDBve94MDm9
uOb25gwb3veDA5vbjm9uYMG973gwOb245vbmDBve94MDm9uOb25gwb3veDA5vbjm9uYMG973gwOb
245vbmDBve94MDm9uOb25gwb3veDA5vbjm9uC0xEGCwM3W5vbjm9uA8hzKTx6gUyOb245vbh7EIA
R3AQA3N7cc3tzazOMmckXO5vbjm9uYpqCHkrpTIOb245vbmDBve94MDm9uOb25gwb3veDA5vbjm9
uYMG973gwFHj4USr1JYMG973gweQImAKviWDBve94MAKbq1CF67wYN73vBgJVtiI6oLuDBve94MB
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
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oih/7jZm37srnP3o6OjYRgdHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dB45Wc6ujo6Ojo6Ojo6Ojo6PrEZnjo6Ojo6Ojo6Ojo6OgTK9jB6Ojo6Ojo6O
jo6OjoMdQLGhlujo6Ojo6Ojo6Ojo6PYejo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6O
jo6Ojo6Ojo6Ojo6Ojo6Ojo6Mx0dAMH0dGN6Ojo6Ojo6Ogx9PRsO77Bmejo6Ojo6Ojo3eXQZ+a2sZ
0dHR0dHR0dGf6Oj/8+jx6Ojo6Ojo6OjA9HQYnR0dHR0dHR0dHR0dHR0dHR0dHR8dHRnejo6Ojo6O
jo6Ojo6Of7LmD9dEnR0dHR0dHR0eHR7mCqQ+joPbo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oi
B6Ojo6OgegPQDSzoZ0U6Ojo6Ojod+fvxHw46Ojo6M1e/pUaAh4Y68D7odpfXRddT76FBD+un9JaK
Q66666t11266667v0/rp/WC/T+un9E/rrrrrrrrrq3Trvrrron9dP+lPao5hwuv1/SG1BQrBoD+8
arvL/AqMhllL66cdIZvQyFr+EO2CBAgQIECBAgQIECBAgQIECBAgRwIsbbiBG6hAERpubYJvuuI8
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
yFSMfuez2ezx8qjE3fbMzPPnsr9Z7Nrwzy5HaqAc9ns9njpVCPwoO1AmbR0Kg3PZ7PZ6c/TGzP80
M+e25rPH3TxO/z8D5OLPZ7PZ5UEKgXOqBVQCGkqEjwz2ez2ennzP9O1o5rZns8qAsqD9n2KgD5z2
ez2eVCJ3qChQMG3unPDPZ7PZ6efLzh5/n+spns8qIVQ5yITFVEf3ns9ns8fqoKN83mZmdUU57PZ7
PTTzzt4VEYA57PZ5UXqonnoMY31QUd+ez2ezypGP03jIN32PlUY57PZ7IVnzPPIVQZ0f+ez2enVC
oZ1Aobx+qgrPZ7PZ7LqkE0ujozM8+ez2emrP+N2YZUrHOcx0HQdGVVBy30O+io0VB50HQdB0KgFU
LKAyTKHEEJ0HQcX5kh3/ejGKhxUAHIchyHJkcichyHIcnV1dXUchyHIcnVIfXVkpNLg4Pc96Y08l
RRk8vs2bMwqAtmzZs2bNmw4uvr6urq6z+yR0qglUM7NmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2
bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs
2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs6+vq6urr6+rr6+rq6uvr6uvr6ur
q6+vq6+vq6urr6+rr6+rq6uvr6uvr6urq6+vq6+vq6urr6+rr6+rq6uvr6lBAoBurq/Mtm8Wa6oC
UECggUECggVAJsSnAeRgVVAiggUECggUEB44vHHOeuEUAyoPUECggUECggOf+4OFUHG2aJwqCBQQ
KCBQQHrhpsivHAnooIFBAoIFBAfeKUBCoRzmKxyggUECggUEGbg2DyPk1zZPpQQKCBQQKCDK/qgQ
PdIEjfUECggUECggwKenYoIFBAoIFBATWrlBAoIFBAoIIWEoIFBAoIFBAV0SggUECggUEDbhaoIF
BAoIFBBZEOoIFBAoIFBBBKCBQQKCBQQC6dQQKCBQQKCC5XUECggUECggbFxPZ2dTAAH/////////
//QqACUSAQAAfIwLQxH//////////////////////6mJQQKCBQQKCCqggUECggUEC5c1CggUECgg
UECaiggUECggUEApiSFBAoIFBAoICWdWHzCggUECgg/vNR2qQ5SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5S
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
43KjRUafPz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu443Kj
RUafPz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu443KjRUaf
Pz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu443KjRUaGWoJFBMoUlRoqNN3HG7dxxuVGio0U
AhjKABQDKjRUabuON27jjcqNFRooKVAwoIlAOqNFRpu443buONyo0VGigSNBQIGgqNFRpu443buO
Nyo0VGiggUJxrfKo0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu443
KjRUafPz8/Ko0VGn1xxn8lxxk1RoqNPn5+flUaKjTLYDj/yOExOaVGio0+fn5+VRoqNMrhOMjkDF
0nAqNFRp8/Pz8qjRUaZLjjN5Xjj/VGio0+fn5+VRoqNMvxxmt3HG5UaKjT5+fn5VGio03ccbt3HG
5URKjT5yGZzKoQVCG7jjdu443KhBULZfF/OYVB6oW3ccbt3HG5UPqhDDZTK8mvu3ccbt3HG41zX5
555Nc193HG7dxxuNc1+eeeTXNfdxxu3ccbjXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxxuNc1
+eeeTXNfdxxu3ccbjXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxxuNc1+eeeTXNfdxxu3ccbjX
Nfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxxuNc1+eeeTXNfdxxu3ccbjXNfnnnk1zX3ccbt3Em8
1zX5555No2aScT/EmvKmybHPPPJsmxv48fr/8wbTaNnnnb+Ub35g560xxpO7gzO6CcSLcJgHp+1r
0HioVZ1z81nMzFPWu/FWqVSqVSqVSqVSqdSqVSqVSqVSqVSqVSqVSqXmpRKitkrJfO6j0n31cey9
8h04K1N8KMzw9fj7o+Sqh/+mmg+dAplZ+vCi1atUDdRb7N/z8b9+/4+PrfhWS0SicQUKFCpFChSC
LRaLReMChQoV70mj0gV3T8gIsUKReMChQoV5Vb59RW3lw+XDIMUi0Wi8YFChQoUKFCuEly1jLdm1
4pFotF4wKFChQoUKFdXnFfhREHg6RaLRYrGBQoUKFChQp84H3RaLRKLSxQoUKuKCj2A4AHnnnjjg
HPPN2gABgAAAxjIFChQoUKCKZgPBbIPpz8/KwtTxNb5+b03yIVcUKFCmI/gUKUU44UUU45W3Cqpm
TLOQkwITAhOAU4BTgFOAUwITAhMCEwITgFOAU4BTgFMCEwITAhMCE4BTgFOAU4BTAhMCEwITAhOA
U4BTgFOAUwITAhMCMlZnTgHN+Z6ZlLJGSsyZpzLmnKWUMpZFzFmhOAc6ZbTAhMCEwITgFOAU4BTg
FMCEwITAhMCE4BTgFOAU4BTAhMCEwITAhOAU4BTgFOAUwITAhMCEwITgFOAU4DTgFMCEwJTAfL2f
s+Z7TgJMBMt0n7R+n2rFQM3Ez02AruI76cOXEz30hSyna7VfaP7ny9nIPPIGT+Wta3n6oatNpFIp
FIpFIpFIpFIpFIpFIpFIpFIpFIpFIpHsrRvelZNyjSqLTKZQfBSg0em5JyJSaNTvGmKeftQfejZO
8vL08KJ7UPILKD4UnRah76Q3ZQqHQqDQKDQqHRKB4YUJ7fD8XFSRQoUKFdChT5R4pH4wKFChVApd
KpQoVkHIgpHihWMChQoV51n69hW7lBHihQrGBQoUKFChQp/RChQoVjAoUKFChQoUgKFCkfjAoUKF
ChQoUKFEKfioChQoVAo7ta1jGMC0LWMZDWta0LWta04QFChQoUKFSQo6xv16+BYd3YNeuqbTFEKF
ChTRXIoUtzzzzyssAGgVTMnpwPe+Z04dTh1MEkwSTBJMEk4dTh1OHU4dTBJMEkwSTBJOHU4dTh1O
HUwSTBJMEkwSTh1OHU4dTh1MEkwSTBJMEk4dTh1OHc8ZSU9nZ1MAAf//////////9CoAJRMBAAAy
5dXpEf//////////////////////MEsuZTzOnAWds8ZPyrlDKqcBJwCnAecsm5VTBJMA04NTh1OH
U4dTBJMEkwSTBJOHU4dTh1OHUwSTBJMEkwSTh1OHU4dTh1MEkwSTBJMEk4dTh1OHU4dTBJMEkwVT
BJOHU4fTh5OE0wQTA5MDEwVThtODsxe8+h1qhvR+6zNMD82za1RMoLst/cxl/Lzlw+cMzo/tGYx+
Prksfj+fT4wOPx+P1qhjC5XWYWznH8mrmcfjz4Dj8fsNf4MEP9j8eYHjj/bd4486FQ+ch6HJ6ZVU
GHLj8edhz1UL2ZBj8eoAjWwuE93UL2Kzudx+Px+Px+Px+P8sqqMMrj8fj8fj8fj8V7afvDY/H4/H
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
dWeVD6oXxhjG7nMxk8YaxkGDgNeK+sZjDLN38yAQmgaBpGllwnH+GybvkqAsdrCaCgCUARgqgLWo
M8uZZs/2aPbWaRrKAJQBZdUG79ZjGCoAjdVAx1Z47DBNnGGNrVAJ7KAI1jZMbWce/eaRumsoDlQC
exZdQBGMZpm+h7fi65Ur3DenhLcCV4uG9nkjFB5x/2axq4/nnH4/nnHncfyoCx8/OPx+Px+Px+Px
+Px+Px+Px+PwJpFj/Y1MfjzUNTHn8f2Yx5qGpj8eahqY/HmoamPx5qGpj8eahqY/Hmm+PuVLcKIR
UkXJCLktTIi9U4NrOHAoA1AGcBwKANQBnAcCgDsWqAM4DgkvakDgOD8FFydBq+KJPw4DgvakL2pA
4DgvakDVw2n+z30oGzevakDgOC9qQvakDgOC9qQQw8bkbh2AvakDgODO3tSBwHBe1II1GTcmaMLp
g4DgymUOA4MpjTUYce49WY/KHAcGUyhwHBlOTlE7PnhEZQ4DgymUOA4Mol44Bkcn05c4DgymSOA4
JVgghQW4eyxBElJQWKC10KC5QXElIkpKC1QXXIhQWqC4kpElJQWqC1KoLFBcSUiSkoLVBaSgtUFp
JSJKSgtUFjMXh8eSLS6Yi5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5I
i5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5DEWHSbhuKij9Nw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O
3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3N2cNw
3DyMM3Dc/cIbhuZryNw3GdBuG5/cG4bnzlTcNw0jXNw3M0RuG5/9puG529puG529puG529puG529
puG529puG529puG529puG529puG529puG529puG529puG529puG529puG529puG529puG529puG5
2ioAlAP97lAOoBgYZQDqAbXwoCFAPjGKAPop29GED/xH//x29tKUp29sf//Ef//Hb20pSnb2x//8
R//8dvbSlB56Y///t7f//6b4yAiIvA///S/v//k2X8IjTpmj/2v5dvb5RERERHl29vl5dvb5RERE
RHl29vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5
RERERHl29vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERrxX7mFn19E/1+duXzJs+fb25f
L9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+f
nbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb2
5fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8ucRzZvOZfL9v5+dvb+fnbl8vmmnpqy+X7fz87e
38/O3L5c2SMb2y+X7fz87e38/O3L5fCZnOGZl8v2/n529v5+duXy+81dvbl8v2/n529v5+duXy/b
29vbl8v2/n529v5+duXy/b29vbl8v2/n529v5+duXy/b29vbl8u38/Nv1+fnzl8v29vb25fLs5/P
7a2fdl8v29vb25fL5fZ+TfUvyHL5ft7e3ty+X3/n5lf78/Mrl8v29vb25fL/P5+cdv5+duXy/b29
vbl8v2/n529v5+dv1l+2O3tIu38/O3t/T2dnUwAB///////////0KgAlFAEAAI5TbB4R////////
//////////////8/O0plnnq3lN2/n529v5+dvyWV6PCMR89v5+dvb+fnbiMRERGIxHb+fnb2/n52
4jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+
duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+
fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fsYfERERiMRN+fj2fv
xtxGHiIjEYiPz4DNu+V2IxERuW0+WsGMFjVsYW5ApjM46Tx1FjrLHSzHZOOg8d2dGspQH8v+uVLT
oeDVQ86iJmZ520TTjgCSqxjGMYxjGMYxjGMYxjGMpkKO/Ki+mvhWjUnIlGPR6+3jqV15F0+Xl4G2
gRsXB55HyLRNP5cvT5/hG6j3DI2ZS5mZOWY6xMmhOM+2jzo9O90JS9ggK2znGZfD56wYylSxTd4D
nHRPSB9Pl8zJ4xONRaAM444YADwccccAADuwOAASwcAAgAACQhC8dYxLzuXn5M/v7apjapbP7+L0
f4kg1LMKDQhDLWtCsturn7mhBOAc15r+fn5+c15rzXmv5+fn5zXmvNea/n5+fnNea815r+fn5+c1
5rzXnus/NWracB54z1n+vVmuVrPuec9JwHXq781HOOa815r+fn5+c15rzXmv5+fn5zXmvNea/n5+
fnNea815r+fn8+c15pzJmqs1qs1bMualnnji/gDd9bTQYgzTwFd+Ezg33QYhw/Chd/i7mcDxD/CI
45uI5QiIjl/1W0wCEQRQBT/XxwBQ2BCEIQhCEIQhCEIQhCEISLIEK39aP7eINNJpZERZJpM6vf38
/XR5ZJ1kRF4+fjIaAIX2s98mERFkuj6f9pe/3/iN9JIiJqx3MyIied7mRETzN4SIiQIiLGSIixjs
iIiIifEPmMZmUEd76PSk5BoMFCXtEcr7eUMOMdQ+MdcXC/q7WtQCEIUGta1AIQvag1rW4y1rWoGc
oNa2UJl8CUCfPwhuP09FQv5U9PT42nazAMAAAGAeQCIgERRoxqH5DoWUyhMEMsoZZ9fX19csoZZy
yhln19fX1yyhlnLKGWfX19fXLKGWcsoZZ9fX19csoZZyygmBmQPWm5DTBZBMCEwLQTBLI2QMiZBT
A9BMCkwKQTBbI+RfWjJgChlnLKGWfX19fXLKGWcsxGWfX19fXLJFlnLJFln19fX1yzBZZyzD8s+v
rQPXLKGV8oIZYyDkLINNykhlnSgTykzNAkCJAkDM7oEgRIFe5G8kCJAjMiIjMkCJAjMiIjMkCJAj
MiIjMkCJAjMiIjMiIjMiznRN5/vRlVA941VEH4KpVUFGz8OkwfH9fxw47dhwTdnYz/7OzxwxwmF2
dnZnvHM/vnx94Ps5yZp9nYaU3Z2GL7ZPOmfkuzsScB5ZL4xXYdPQNTMwcvQdHZ2aTEOj4wZldnZ5
eWawyoGoFQE/fn2dnZ2dnZ2dnQqEexQJdnZ2dnZ2dmVw2RXeHZ2dnZ2dnZnuPvB9jezs7OzsDj/2
zB9nZ2dnZ2dmVwNcV2dnZ2dnZ2dnQqEexQJdnZ2dnZ2dmaw03HZ+dnZ78dnZhv3zJd5SdPG/s7Ju
w4c7nsLlDObmTjiXd2SYLz7D2UAGF4lPB+zs7PTfiB7Ow2K5U7Dk/favZweBkdmFPA+Dw8/Hs7Np
8f3YYOHwn6H819m7N07OwnMxQEbDUMU4srnHUApqY3/0qAjzMo7+z7wJn9nQqCvp2dGkvTO+3ZvY
cMv+sePYH98dmU+ezs+dfYc+TzmLlZ2dmzKD2dhws/NPZubmMHo8uKt7Oz+yXYoBNuOzB6vUyew5
VAF2dnZw3J9AQ9nZ2dj6q1R0HxN49nZ2dnllWeBxmB45Ds7Ozsx51mAbhth7Pvs7PvzY9Rkki/uz
s7OzO9iDp0mkZvh2dnZ2dkygH2fCOzs7OjsUB7/5w6lQ34dnZ2dkpknL+fvH7hezs7Ow6AKhkx6P
z2dm/17GFQzTq/qz9nZ2dnH9g8PnQHT/dnZ2dnZoOemxuns7Pzjs0eWYweOzCgE29nZ2dmKMraYW
KUB+Fy/Z2dnZ2dmpqGbfjn07OwIMEd4+3xP2dnZ2ZP+BnJPXsOfs7Ozs7OzcivRio/dfZ2f2kZWn
BktPZ2dnZhZfz9M/V2Hn2dnZ2diX/UB79HZ2diob8Dh1HL+SmT2dnZ2fuF/eFQyY50A7Ozs+37KV
Fm5nn2dnZ2S1QJ55z47Ozs7MsYRwHH57Ozs7Ozs3S9nwkdhnj2dnZiD98M4qB5vw4ezs7OwvTy6P
JnZ2dnZPgPHZ7nXyYnZ2dnZ2bPrs7Ozs7Ozs7JNP/2FC3Ik2TwMb1yXZ2dmGPbs7Ozs7Ozs7MTgM
adGL8uzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7M3vzuUw4t7Ozs7MN9Nx+EyPk3s7Ozs1Z+mazRha
8h2dnZ2AyXNXx3RJ2dnZ2c625UeTDzvZ2dnZXO/wJJs92dnZ2YHo3SBDis52dnZ2f//r2M+ezs7O
zB9nZ2dl0kdnZ2dnWkLLu21d2dnZ2J7Hvm89nZ2dl1Zdv2dnZ2WXIm7ezs7OzrvhNd9nZ2dlvb2d
nZ2W9nZ2dlhdkdnZ2dg34s7k/Z2dnZ2dt5vL9nZ2diR2dnZ2Xxeb2R2dnZ2PbeS8NnZ2dn14Z/s7
Ozs7Ozs7Ozs7Ozs7Ozs7PDZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2eeXL8UH3ticJNiOP
r3jwx/lfGT9LcBk64nTvp+Mr14fF2enheOdH0XGC3uz5/Nj7/csPgo9zn8sl69kPXst0TGlTO8cb
t+t7Pa3szNRx8hHPluzsm1v2W9nR835k8mYe3DW2YXfZ2ZDK43kysHHZ2JPZ2Xm28XIk3js7K9jx
dXgrk7OzshIuuzs7OxC51l7O7Ozs7HvOm8pPWmvCSizsi2/U1zIXdnffrp0m8XIi5rEi+LLykRD2
lDpFyWWQhIu4vaj1yTclwrnvZiI7YSXXXAvvZScuuyxyj8qwN10dCT13m9i3i5hvHY6bsvFj3m5F
13exXstJJuBJIVvWmsQuvN3Y9z9sReXWJC5xIohIG28DbC4uzo6NmA6Lxaluuu7vZiBSOxJuC1BR
cj3Ii5LXvZF7Nu7py7b2ZeLbxRFyJPYEr2beyI7O1YndIT3s7reFxPFxrFye6foBjscaSHRELE6a
HstvPZUnWI7LzCS9xpV17GuFMSI67q4LgSLbUCuuncrp4KFtgtK7K1M8DbRGE6Oj0wLNA5P4+8lm
M/8ZzMVKv0DFYOy5L2chMixZaixNeI7OsI3tSae82IdPdWXsZ7g7LYSOuy13SH7k7Rel3aIzjey0
PYhIgPR//HZaOF7F15ReLzCLbL2Gi5rkS2LSEVw9fbfsdnZanhI7LxR7XXLHBW2y77uuhCL0q5Cm
ft5EexHRgzB2qgTR2XF9ITpbtF4SUdiftS9l7iZFwIvNwdllt7Asu79suSLE73B0NdO97KK83I6Q
VxWXISboLosuAXTwvK1F5vZl7Ni24LxF7UQ6Re1J3my7i5FiQ6a/LL2BeLu/ObapMgYu7EXJ2rEW
v0VurbBvF4fsvaibynvKe83lFt4SkkJNEDDpr2ZdwSd0i5Oy8J72Lclrii/YqGtRJeNBvCyL2B1o
FNcFaLovY15Gx6NpW4O226e8XixZHZeYJ7mSLYXovkrkSEm6GtLCpYV3P0F0P0UCMzrRvYxONW9D
ixdCW9nRSq0bCsHovFyIurkvFw29iyzrvN7AQTpU7ldpFHEmWJDrRewoewrQNchuS4CBW1Y7OhKL
boUWJMOlvFiZMi8XhNcjpFl4WWpKQ95G9mXlDpN8pNlxONiWLzYJVACvZZZbS7tv2tWC4tK9dC65
FiWlwXwi9qSRcURHQtKLkIaOVeu1D2OuSFvAG1pcjIhc5WIT9cDWlzrrwNxdt3Z0dFfzoHw6MmcY
mJilAflvmMbw/O/s7MwOZMvdU9zrObGaae/kdWAUAPYhvQzlL2dnZ2Jezs7OxL2dnZ2Jezs7OxL2
dnZ2Jezs7OxLHZ2diXs7OzsS9nZ2diXs7OzsSlHZ2Jezs7OxK/YXYl7OzssS9nZ2diVjbaJS7LaJ
exf2Olyo7NOn66BxO5BnB24TzB96uiXnsP5cwoXdOns7Out8dnZ2djwjs7OzsvXZ2D2T8dHYu3ym
j4Zg/jv9Zfv5VC2QOU19PR85TNHAfk3BiHUYGR/exQBVov7Kdi3Rhzw1nHtyXJ1/Y43AnkqOTaM4
sgZMmNOLOmvQ2D99MAexvYtUg/agA5yR/dngNIKtU1SsvKLygN4uZyTEP6A5+zsvPYtvN5G89nZm
PEPRkeh5sJ2dl57MdebzeezsxwTBxOeOEejk8sioDJt2d//fLnu5k4sDf7J40wsscXR7/hGQceLz
agA88geoFQLizh6Oj1HBmEYhlmUYuCzJ3GtnjiOY5duR6DDNLAKAs3DVwwOg5eQqjTNHH/+5veyo
ex5jYLXhVQpQ+joOL/9vhQDVobWA3dGFNDyM86zyyfRtML89zCwXQa51qh8+JK87vE7p8dkMbi/c
2zjxcJbb1eLb3Wt7Ow1PlnZ2dnZ2dnZ2ZK8N7H0dnZ2dnZ2dnZ2dnZ2dnZ2fPZ7dnHZ2dnZ2dl4v
B19nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2P6dl7Zua9zIa289nZ2dnZ2dnZ2dnZ2dn52dmA3bzC+teQ7
Ozs7Mz95z36DD6Juzs7Oz/+MvLhfDs7Prs7Pidv77ZTs7Ozs7OzsyvtkzDNX3yh7dnZ2dnZ2dnYY
pt8nWaCD67Ozs7Ozs7OxL0HAaers7Oy3s7Np73iOxQI3m83ns7E/Z2Xm83m89nYjs7Lzebzeezsv
PZ2Xm83m89nYPZ2Xm83m89nYf2Hw/7eSi9rAlMBQCdnZBy9nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dn
Z2dnZ2dnZ2dnZ2dnZ2Y7FdnYZpkdnYYG3s7MIoBuzs1a+zsl9+zsPc4+zsODD9nYAuzsyPZ2dnZ2
dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYMnZhMr2QOG7C3evZ2T15yHYzOj2XJcnZ2XJ2d
nZ2XJ2dlyXJ2dlydnZ2dlydnZclydnZcnZ2D2F0dnZ2dkdibs7NmqvZ2cdnY3Su7OzB1k7Njf3su
SOi9XJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJ
cnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyJcgqDPA3n+9HPR2dnBGb2dnZ
2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ
2dnZ2dnZ2dnZ2dnZPmNuR7Ozs7Ozs7OzbKcJ79nZ2dnZ2dnZRnmY3Z2dnZ2dnZ2G2Y5kZns7Ozs7
Ozs7NY9HZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2M7Oyfo7OyvZ2dnZ+eHYzV/yzdnZ2dlPTs2
j8A8Ozs7OynZ2Dp7OylPZ2dTAAH///////////QqACUVAQAAWHNupBH/////////////////////
/9nZ2dgezs++zs7Ozs7Ozs7Oz77JOzs7Ozs7Oyb98+js0dnZ2dnp2YLnVeexUA9nZ2dnZ2Xm83m8
9nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2
dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89n
Z2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2Llxdl5vN5vK7sb2dDOiOjsK83m83nsWdHRMzaM
Xx2Xm86PNSqao6Pvv8JUR1LHono3Zs/lV6Brf/MvFtX8IV/b8gxhfV9+YRgwYMGDBgwYMGDBgwYM
GDBgwYMGEewQIsIEaKgvAdxIwwQRiBBgEDCVv1o/S8BBAsfkV7t8fgO4YMGDBgwY8YMXxxD5qKlh
D7K46dnh90Hi2MuknEcIWcQkmWM9Qh33jBGMMYMGDEBgx4wYMGDBgwYMGDBgwYMGDEBgwYSCVul2
e10gTxgwZyo/6LgYMNQZZt3jHjEBgxAYljEBgxBKP4WUpK/tVBgwYMGDBgwYMGDBgwYMGDBgwYMG
DBgwYMGDBgwZoXGccqcnab8WbztMYAZr3jBgwYMGDBgwYMGDBgwYMGDBgwYMGDBgwYMIYMFpXQEQ
xETtpf9s+l6Gd8dMnjHbpDTHIhBJQSiEvLp6UQJL6Qk8YjHSXSUnGYKRGiUIEGt441G6hMV5xhTZ
r+OBgwYMGDBgwYMGDBgwYMGDBgwYMGIFfcUCLCBGip7MYgO4oPixHIjGGgEDC0N60/9vTGBBAsfp
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
3Bg6AxsSfZD1wNoNroNpmuW7Gn23DRDOIENODXRDVDH0itMVQEBsBlqqCAwdI0jSFVASqgAOzW9I
0gPTQtADy1ZiD0DYDZyHcGGg2B6twcgc1xBAP8PS2hqjZm3ruuBwoW9QD7QQDnyqoRtNwdFrWQ59
YaWhPQA7A0bGvB1EQ69fbA5L5DrQruW72qqqBQ9g6w5A7kw5w57mj6CHFpAdYfwd4dYdYd4fgdYc
Yf+laGHdoMQHkHi2B1h1h/h36sRjT21q1kwc+uqoBw6w6w+A7Q62XWtQZNMDJD4DjDr1ZqDrDrD7
DrDgVUEhlhqBhBhRAdYdYdep45ahrAcuoB1h1h1h16UM+ghuhph9B9h1h1h1h162qoFDLVQG6OGF
F4OsOvX9e8aurAdYdYdYdaEBjqoBA0w7lVAwdYdYdYdcBxaOGEyQHWHXqQdb9YnE6KHWHWHWHWHy
HFoQagaYaweQdwdYdYdYdbIGsHZpYYXoDrDj1oOvXXbg4HxrQdYdYdYdeusQaWk69rgfgdYdYdYd
cB3M4YTORgOvVg5w69ZM2tWoMjLrQdYdYdYdYe4cgbOlaMG8qoA1QOsOsOsOuIDCZyJg6NWDrDrD
n1fVtc60fSLIdYdYdYdYf4cWg6VeNAcYdYdYdYdcRp6HtaDjDrDrx07+DFuB1h1h1h1h3B8hqBph
rhhQHCHWHWHWHXGH61IOsOsOudFnGhBqB8hxB1h1h1h1h5B3BphrB2aWyBrB1h1h16/AYTUHp7Xg
6w6w64D2vacGmHcHyHWHWHWHW3B7BuNLSGFEB1h1h16m8MjEGKzB5B6B6B6J6P5gZdQi4HoHoHoH
o16t0GA5kEA9A9A79cbbLCGexh3h6h4B4B4B4KqALgeAeAeAeAeAeAeAeD60HDfu+SDnDpH0qoEV
UY6yHbruu66HcqoS13Xdd13Xdd13XQ9lVCgdgfiqhhVRLruu67ruu67ruu67ruu67ruu67ruu67r
uu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ru
u67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu
67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruutV5S1XTELzI1NTU1MSelMVvQW/WGpqa
mrRk3ZNHIMOkNTU1NWgtWMaTeaNFampqatPY9GBIaQ1NTU1WO2HRjZINTU1NRqTxZuJotTU1NSd/
TCAuw02pqampkoJNTU1NQG4hqampqqoampqanampqasQ1NTU1baLU1NTUtqampqpqampqampqavc
YampqaniGpqamqI+1NTU1bLU1NTVVNTU1NVVrAdTU1NTTlsOc5znOc5znOc5z/yc5znOc5znOc5z
nOc5znOc5ztGqkLTNoGgsbByZEQ4Ne1PXwyAw2CzpemCY2e9f43tL8+haFO8cMHRdf1LUw69BDBI
dTDBowYGiXkkL7DoUBjhjBjBjHZftwceq6jpDHbDGDGsBjBi6ZqNXdbDmIIBghjhjBj2AxwxXdMO
wO67/RwxgxdMDUDHDG0bRIaVVAjeGMGMsMYMcvEhjBiuGOGPtdrQYwYwYwY+2gNwxgxgxwxwuGMG
OGMGPGgBKttAT7aDv5wkuJ20QFvtoi22JgYX5Vsjeq20XKZE0XI//tMHevDjeZGJ90/Be2jtFASW
LYkcbE0MVADpTMj4PqP5EpF8e2zycTvA5en22HgUeqo2QVgqa5CQZGxGl8uDqFIG1G66V7aG2pMj
qHmp4bmoWwuwW2q7DdqOm5DrYjIsrCwsbLrqIYGsLcUKYkW2gt4fIwJjlG2hQqcBxefBcCXoUVDC
zROiv6H572twqyNgfo8EsG5dwQxEJPCiFxWSm2i/pgJNGLBRrp8r4Opeo5PtozXhLgRdew+122JK
bbriWL43pVlDlaiMzP4fI5d908FFieneH3FV8J7Xae3itxOKn2Pg/4/HW8hYMD4P71BJUl52sbbK
xcnW/IJRw/W2xAh1Rx8CQPNRkA+5kEcuMcyBHKoh+C1H49l5rcejeDjkLYA/U7v/+SkATzIlY+Ui
dYliiRKBVmBKaqOUOPaU6rIgShTMcI2o11l1M8IXnlDz5fIDcKQHrcUFXjcafZ17ULWGTW9U9daE
mrXQ2tLZQ3g3tEKBoEGvXtV0vVm9vjX7DJr7UHsbpiQD1D1D1D10PQ9D0MPYPYPUPbQ9D0PQw9Q9
g9g9dD0PQ9DDzD2D2Dz0PQ9D0MPYPYPUPXQ9D0PQw9A9g9w9tD0PQ9DD2D2D0D20PQ9D0IPYPYPY
PbQGTQ9BD2D1D1D10LQ9B0MPDTmNizcKdNmpN4dgcgcGqaujqOgdGDRYRcqDRDOY7QaAZ87IaIaI
aAaAaAaIaAaIaIaAZwaAq4SGYGW0XmEMLWvahd1HVfZR1htufZbQfuo6x43tR8yhw65quc65rmua
3RK82sOnM4dDGyXWHRbwdIdLLea9b1FEPnzdeuaMHlooeHbW0teq4DkYLjSqpXbq+7weOUueEh3P
oKoB1UA+v6t0qgHVQDhuRGtwBAaaqAdVAPr8qoB1UA7Heva3nW9bbtRbdbvahe1nWbbdabmvXm4O
PWfBzNbde1m623p1NP+stkB8ByNd7Ww4lVAwczW3as0hyZDgDga2u5rYdWt6No3feo6i2B6avGva
2QDFVUBqqDNG71nWWnUVVBiqgIPS5rwdod86jqLdrOstcXbt5p1nW9fbNEDAadea713q7rLdr17U
b7c16jrbcHGHNLa16ze1PU26UXsNjfZ6VUCqqFrLe32bLe32bd+y2ms2bNmzZs2bNmzZs2bOuqqF
9Qs3mizZaGizfstDRZstDRZstDRZstDRZstDRZstJ7Lx3rGjaVrmuaVpWua5pWla5rWlaU+laU1N
xtEYW1q0rStK0rXg4NeD11jV9YDn0rStK0rVbh2IOY2laVrWlaUfSimpMV/StKTT0rSk1UA4a4fJ
zpwmnpWlJp6VpSYY8B5JOyJ6VpSaelaUnomEtK0pO7pWld6LonWh6GNeiaHoeiaHoeh6HoeiaHoe
h6JoehtOrayHRqHeua5dzrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rk
RrmuRGua5Ea5rkRrmuRGua5Ea5rgYeia5riqAY2ua4G2fXNc0pl1zXNPZ2dTAAH///////////Qq
ACUYAQAAbgS8WxH//////////////////////00M/XNcDa0jXNcDMDS1zXJ13XNcVQChla5rjPGu
a5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5r
kVrwcAYWlBwa/kODX+0A4Q4EVOvJatDR23NzdEatq2ratENzc3N0Rq2ratq0Q3Nzc3RGratqurdt
zdENzc0atq2ratENzdDc3ffVtW1bUP5br3LVIjWdZiNZ1mI1nWYjWdZiNZ1mI1nWYjWdZiNZ1mI1
nWYjWdZiNZ1mI1nWYjWdZiNZ1mI1nWYjWdZiNZ1mI1nWYjWU2660sIfYcmpa8xxpqGsNH/6bpsMb
HEMbHGm6b///6bpsMbHEMbHGm6b///6bpsMbHEMbHGm6b///6bpsMbHEMbHGm6b///6bpsMbHEMb
HGm6b///6bpsMbHEMbHGm6b///6bpsMbHEMbHGm6b///6bpsMbHEMbHGm6b///6bpsMbHEMbHGm6
a2avpes6bpsMbHEMbHGm6a03PY03TYY2OIY2ONN02LGrh0abpsMbHEMbHGm6a2f1bRtN02GNjiGN
jjTdNaQ4mH+m6bDGxxDGxxpum///+m6bDGxxDGxxpum///+m6bDGxxDGxxpum///+m6b2xsd1tY2
PUNN03///03TdS0BjY+9Bs+03Tf///TdNvsDGQvaMyt2m6b///6bpuoMbGleY2PUNN03///03TUm
Njuwxscabpv///pumwxscQxscBh6b//wygyoY2OIY2OAygxyGMhlBjwxscQxscBiBlNSd7VIY2OI
Y2OL169ehjY4hjY4vXr16GNjiGNji9evXoY2OIY2OL169ehjY4hjY4vXr16GNjiGNji9evXoY2OI
Y2OL169ehjY4hjY4vXr16GNjiGNji9evXoY2OIY2OL169ehjY4hjY4vXr16GNjiGNji9evXoY2OI
Y2O7evXm1iYu+TGy9Xrt68xMiXbKwXr0VjUdzfOl/nO63zu1Zc4FGUn0ZM7UumSVFxBBBBBBBBBB
BBBBBBBBBBBBF/ocJy6XuvsLFs/L/XIPKlQRccOlK31KPLgjfS4vvPGkEEEEEEkkkZ1iOH958rs3
TFftVET73o///ve9/8dj3vT73vTM43eNroLLr7os+WXF2bkzMzMzmTM3n/+lKU///6UpT///pSlP
//+lKU///7qEEnrBSAgkks95ZKKhv//+lKU///6UpT///pSlP//+lKU//9xrjRH280nC/ss9Ng/d
b4yzOr60FRaHie7/1yK/bpKSJEiRIkSJEiRIkSJEiRIkSJEiRIVT/L5vJS8xOU6rqt5VkEn7IcqD
yrKpE14afkHvqWfOYl33L5pRR41IkSFpEiRIkSa8E04f6lTdMH/PoiImZn8fiZmYiIj8RERrbtbr
vQJ667te483dj92z7xznP73vHOc/ve8c5z+97xznP73vFnSJTUlAmSJUqA1yBNyTle97xznP73vH
Oc/ve8c5z+97xznP700KvLvmaNiCqEPTvXqoNa8GBdMGKGGQYQydN1DRtJDDZGDSwz2HRtFZGSJZ
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
3bQ20NtBVQEqoDVUBKqAttDbQ20NtBVQEqoCWqoCVUBbaG2htobaCqgJVQEtVQCqoC20NtDbQ20F
VASqgJVQEqoC20NtDbQ20FVASqgKiFxo20ChNVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqs
lVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkvuWV3DM6d1burd1burd1bur
d1burd1burd1burd1burd1burd1bum7uw+d2jt3ZEHdlvO6d130Gw73dGd8kndiW7q3dW7q3dW7q
3dW7q3dW7q3dW7q3dW7q3dW7q3dW7rHKrJabyrJFZVZPLrtVkqslp5EFWTM5ampqmVWSqyVWSqyZ
lqampqmVWSqyVWSqyZlqampqmVWSqyVEvLU1K2pqJk+pmZ//cNTVBNqav+JzMkJeGpO8qyVWTfvq
slVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJV
ZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376k9nZ1MAAf//////////9CoAJRkBAAA1rt+x
Ef//////////////////////slVk376rJVZN8gmqgDrc3lVCOtNgfF9YY4bbZlWGOGOu/fV376wx
wx9uBjhjrv31d++sMcMfbgY4Y6799XfvrDHDH24GOGOu/fV376wxwx9uBjhjrv31d++sMcMfbgY4
Y6799XfvrDHDH24GOGOu/fV376wxwx9uBjhjrv31d++sMcMfbgY4Y6799XfvrDHDH0nTFUBekBjh
jrv31d++sMcMfRUch0Bjhjrv31d++sMcMfVG0OkPMMcMdd++rv31hjhjtenMjIGOGOu/fV376wxw
xw4Q/iCwxwx1376u/fWGOGPtwMcMdd++rv31hjhj7cDHDHXfvq799YY4Y+3Axwx8376bbfv6iGOG
PtwMcMe9fvmvNGqagGOGPtwMcMdpbb7br7TdOGOGPtwMcMfUL9+5qN++cMcMfbgY4Y+qX751376w
xwx9uBjhjrv31d++sMcMde9VhjBjLv31d++sMYMZTiTBjBjLv31d++sMcMa0TIbbGoNi799Xfvr1
DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsb
bG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22Nt
jUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC7
99Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfaa1DUNtjbY22NtjUNQTamn7U0
d6hqG2xtsbbG2xqGoU0tRDzTe3uoahtsbbGBuGQNwob0qZOq6pgV5gMDgEN1hAZLhTuAgKnOc5zn
Oc5znOc5znOc55XF969OcKWQ52CDnDxwAc+33gsDC5A+UdZyiphwtkOc9a1rWtdAUwQ6c5kbbO+u
8zO5mZmZmZ3MzMzMzMEie//ub//ZGW7tyVqGupQxjUpShjGNSlKGMY1KUoYxjUpShjGIpT1LriKU
pSlDGNTKUMYxqUpQxjGpSlDGMalKUMYxqUpQxqUoahqGCcguBgAwBo0a2HAYBKhaFjKAFEOFu5AC
NdddddddddddddddddddddddK4oZe3GDlgZDG2DXB44wC40GMCwMLkD/rlnp6YcBMl1111111112
AgKYIdOcyNd67tt3d3u7u7rUbom2072ZxeTMDW5gw1qUe/pd99a1rffffWta33331rWt9999a1rf
feWetallFnrU9T333nipyr7761rW++++ta1vvvvrWtb77761PW+857yj3nvBtwnfaQx7AfBDTwxQ
140HEhoNkqoAw+9Lano30AyJYwwFWQqyPagqyFWQHVrhAMFVkKshVkMzRHtDaHMqyFVBVoNJVkKs
gMrtVkKsgPMMO619N6rIVZD39XboY1WRptX/6roCBDRVWQqyM671Fi+qyFWRqXWg6jGqOlUqshVk
KshVkKshVkKshVkTrqrI01VkKshVkKshVkKshVkM2oNx7SrIVZCrIVZCrIVZCrIZmhzKsj6rIVZC
rIVZCrIttrVmwqyFWQqyFWQqyFWQqyNA1TgiqyFWQqyFWQqyFWQqyFWROuqsjTVWQqyFWQqyFWQq
yFWRoOo2LirIIKshVkH4qshVkY9rH3SOSwZVkKsgyrIZLxq1fQbbQHWQv31WQ0nYVWQiGIGB5nbq
VZCrIVZGitgYjqshVkBno3g6NI1HQvqsgwdDEqyNB18OD4cNtVkKshMO7pVkaXoWgNWnalZVZGNW
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
IVZCrIVZCrIVZCrIVZAd7SqyFWQzhwKshVkB2eVZCrIaG1VkKshtDAVZCrIDC7VZCrI+GeqyFWQ0
B1KshVkaWqyFWQyKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkK
shVkKshVkKshVkKshVkKshVkPq2kJp3LlhbSZVkBcLqshVkBfbgXVZCrIC4XVZCrIC+3AuqyFWQF
wuqyFWQF1arI9uySrIVZCrIVZEKsgFVkKsghCrIVZHBVkKsj/92qyFWRc38wqyE/dKshYCtVkKsh
VkKsjbirIVZCrIVZG3FWQqyFWQqyT2dnUwAB///////////0KgAlGgEAADdY6YgR////////////
//////////824qyFWQqyFWRtxVkKshVkKsjbirIVZCrIVZG3FWQqyFWQqyNuKshVkKshVkbcVZCr
IVZCrIVpsJDVfhkaHqgeCrIVZDQqyGhVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKsh
VkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshV
kKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKsgyQZJlWQqyFWQqyFWQ
qyFWQqyJhnZ1WQqyFWQqyFWQqyFWQqyOtR1o6rIVZCrIVZCrIVZCrIVZGotLXaVZCrIVZCrIVZCr
IVZCrI1EgwKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkG
VZCrIT1NVkKshrVZCrIVZCrIumVZFz3drQlWQqyFWQqyMwqyI459SrIVZCrIVZDIqyFWR1eVZCrI
a1WQqyFWQqyIVZCrISVZCrIVZCrIVZCrIVZCrIVZCrIOqyFWQqyFWQqyFWQqyFWRFhF1WR5VkKsh
VkKsjpVkZMqyDqshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKsh
VkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshV
kKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVk
KshVkKshVkKshVkKshVkKshVkKshVkKsjf78BVkKVWRhVkCPAyEKsjeKsgmTJxh3carIcHNP/r/t
VUFe28i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8jczYDBXraM0Gjhk
t5A56Mk4q3kOGZgnxNvIt5FvIt5FvIt5FvIt5FvIt5GOT5EgW4Yt0BXbyLeREzbyLeRFvIACVtvI
t5FvJt5NvJt5NvIt5FvIt5FvJt5NvJt5NvIt5FvIt5FvJt5NvJt5NvIt5FvIt5FvJt5NvJt5NvIt
5FvIYmS3kqhnYPa31gZNjJF+W8nGK3kW8i3kW8m3k28m3k28i3kW8i3kW8m3k28m3k28i3kW8i3k
W8m3k28m3k28i3kW8i3kW8m3krt5NvIt5FvItdAxerpudt5E4bDi+beRbyLeRbyLeRbyLeRbyLeR
byLeRbyLeRbyLeRbyLeRbyLeRbyLeRbyLeRuTsBuN9rYCM0Gjhkt5A56MnsVbyHDNs+QW8i3kW8i
3kW8i3kW8i3kW8i3ka5PMSBbn27Avt5FvImLeRbyBfgEh28i3kW8m3k28m3k28i3kW8i3kW8m3k2
8m3k28i3kW8i3kW8m3k28m3k28i3kW8i3kW8m3k28m3k28i3kW8hTFbyQvOmT8jyzMWTvxXFvJ1z
byLeRbyLeTbybeTbybeRbyLeRbyLeTbybeTbybeRbyLeRbyLeTbybeTbybeRbyLeRbyLeTbyVW8m
3kW8i3kbIUKwDQtMa7dahrAdCqBrUcBktaqBK9oGh3tW1WbIRu6JpwdehtWk/va8GDd1PONZVQP6
Fjmw6IGKGp7vDE4cLHfKsyLWjcY86AhavhoXGFjZ85jqPtLQi0C0xFHRmxsuXDYvZxzYdEx8hF66
1MWjNjY0tHumTBjMpqYSFXSDBrzeHaxB4695PQtcSR1ogQS1G1ot5gVQYqoPLwY9cmthy1BgeO+d
RVQTokFVAzQHUQIaprn7weAeYdJDUw0QzFUEgYwbGjtiR9AIUb1QwM3WgtHSDGmxZxCWDhwoXmXU
0iFn12y+samGYGY0Z1EMgOfUE9DVUA6Pq+g5sUjpegMBresBnhwy029BDl0WdF1FVBJRAh7WSBCb
t77QHCHe1Jf/qLTgMQMEOjUXMwEGnrqxYvNWOeuMWoEMaiGs3kEb+W1g003ZbQ72pZ+1MoYZAOLQ
UiDoEE7V9FqtaEiHezM2hpasHGGcHaQ/YybQGBHS7egy03NDIXVUBYdTZohC5YuYOHK0t2qJXdY0
XUXshka2QzSNmUYi/37JyAYeh5/qBAMhgy23+y2mm1LOh3mUMP7VoKRAOLqwQT/Y6g4YPg47WpB0
2NBskLvaNx9Q95gtBgBxMmptocWkwQ6IaB21NF5p1xpIJoc+HjjgwY+kfv6lmAwNT1TTgyrBFo67
0EMljshgMDVqaDpItjXqOj6czdNXu70xZs6HevR4MDRbYYOgM7S7Uk2ZRYbJkr7GzXr5G8yBULBb
YBBAWUCAAiq62V7aG0BqOQHxhLakSKXsoWSH2Cw5G33dtUQrUNFadQuWXs18h5C8n3hg1iKwmCBl
JtvNdtFrq6NLuIIcmfQmmyQtoHekXNe1iw2XMpZvNRDQ0LyOi2H0i02NmnIJ377Q22GtNrLLLiVi
Cqv6ysRC3CAQkQRWFtigkPl3ds9c6CoWhZcIhDYCwMAK+C4iaetwFIKBWETkdtHhS3jZWFZpYVWI
QIqqlwTYg8g8taCCwqJYRFQVpeyUjkXCs1EQ+21tY2HhBN2O+joUaDYa2Ix2lC1cSv6K96giEaCE
ltoqydoXBcqFNmCwQ/RSPfG8CWENqEmLSu1vDzRaAoWBLAyFH4bUcfra1igNja0FajccvD427zdR
xbEVO20txkSsUOgsEtnhn8Ff8DWQhQgiEeVOEKcKrE9eNy4RULpe6BCwVjhUbQBbxG1Gq0qLbTlQ
olx4GI0i/toFdgtuIA3G0pYRXQSWPahV4Az9YneKK1tpLCKoVWEfPDhGNl3rcF+UPtYXIRBCI6qa
KoNmohyMSedBs6AHs4fAYAYG4uXrh9SDC1IOENgMAODtFlZ7Va2gw9kHhy8jZQjg6HTLolz7X7U0
GLQfdJMOuLvILLV/lOfkA2Wr+jGDd0QNDUbuptOoWtF0pVAzolP+1cDCDFZ9XQmxhq0PXdNPoJgy
w7wwbmutQdutELDA1dhwam0a730GGQVUKa1pWj6b2QDWatT0fUZr44Cj7Rb1Av+dhSuY6z79YS97
Gta0HsxMDLoLUQ1EPa5rvXQZ4a2h6PpoYFhqYtTDADDaA7OgwOyHWo6D0GBqPWlNWm602h8WGXWm
gMlqamIM/uxpQcDRqP/fDm1pqatT0PStKDAZQ4NBDgau9a660dVAQGAGPoephrEG5iYmJo67DWDA
DgaiAcDEyh061121NWtB2dkAwOmjsMzoO9qDg0zRLlyw1dBv967qIYzR1qKvuU/GZ/wlqf7V4Zlw
33+iti6hF1k6uhl6AifRWFiDC0a5aZrjUw2j6NpbXoiqAgM32oN4ewYDG0m0LU7+p6/D9axoqqgE
gmQu328O8Pd9bQ0pp1TV8hwY1LT2W026XPLEAfhAheghZOfHf6wQzPFAgy00aR79U0zb18PtvDzR
OHRr1oMxs0MO66GfoQaWQ1e9XYI7pgg2IohYSxbeLvctBCHstPf7+cPFZmYx96GP6e5E73TTMQBu
z6WT856Pz5iDm+9UsEBbeRIEZVwdVSXMQpzG4cbQGEUtxbu7K3LjcD+NC279/Wtbv7jydwWbM5n6
79imI9H59m0m/SlSwfyCifAxlXF+VAQOfwE6/uXsGgN+i0UxCscTrjw/gMxWG1fR+2GeiDNqV02n
ZR1Bp0YMW+xXatnYNQ0YOVj9rDCyaCykA1A1kdG8j0m0tvbUqpJDG16xOA4U72dKlpxqtJkNLnXg
4cNwYekYntktTqt2zFu+2Ndgdoh5G1/zFxR0C3+xFu/PbWxtLIZFlYj01ny0mbOpzpDeQhkk2WJk
70JuYP4Dd9pGoh1Zb7N/oweRQzNqzM0hihwMlvQNBa2BgVUCZDjDfyzNZDyIe6qAD94+q3NG2rZo
3tAgOmresDuWNwGQi5kLca9r11h1vpsPWuKqM9eDI7QQNoAYzTq7SfRtV1/W2TybY0phzo4QDIIB
kBns6behYDNvs39XY0w7w52hooFmiELAYOpa80MNxjvmOHHo+ghoptDQOrtvUXNY0QPfUNUDj0Nu
ar3NoINPrbEHNdDQVUUqqKtYVQJauG7qusB3WLGcs5C60tcapoSqBJqbg4g4bk3tIsMCfsBzotKa
beGez6ndwGNoRDXaZ7CKX40NovWGbXAyDhja8qozaQ4ENAbLMYwdhbu8qoEQ+LGrhzKqKVVFQczO
Gy0tBDmxethoKqKQ5rqqBLV1VFWsawHcG7qo7di9Yu0mhdDnYNIb9R1BvYGoBovPalm0KWUN12JC
8qoH09i7tHSIdodGt62GDc0X2KSEw6mxJSzsuptLKm1veIM3wwA5LOdJD+ZtW1VLXQwukQ4NDT0g
MAO0hYT0tsOGFqLDmSG9Po167b67bNCshwyHAGrqd9iagwLlV69aIbUttJCg1QXKSdPsHzauGz+z
4977bD6+PUQ1iCXtTarBrNvKnXQxWth9dZuwrFxjwQ0ch/RUdBDsjzDSUmN2lctaw6gs06hrGiGP
omu6g0Rqha07ptDUQTZmOxtsV3cuB6kGq7eLMesmssGuBEIr20NqrCDSrhWFFhFZZYtkKllhQVLE
tRsi5S7TYcI7bBAhO1XtSiwiLZ2V7ktSvaBCOSwupEU2VEKFHAhdIEFe0ce0V7RQEQhvQpPAosax
bX+0CGwTGr2dB17X9XGoEUUhSSqlRtsLEvaTtBC22SgR22QiMmEJIe0E5kcoOw6DCZg5gwq1P7KG
uQDUDgaNle2jtslRbSgiEVEldptQquRC20BSTfZ2FqU70tKy07I9koNRyCJTZKrKKVBTbRGsqV2g
UVzBDQ+2DV1OjbbA9iQhtRBSMCEFAjtXXOwNcL2PKCine7aGa2hRYtosIyV4bK5471QATr/wqEFS
RbQKE4ILJipYUkKLVZRXa08j+5MSgQqXwcWwLai2FjpWoEt3pQFAivgNVoqFz7iLYoovgVcW1CIS
25syT5CmqCoq2J2doVUYFRPZCm5qBTG02tbCvYGudhRtNtBYVDBAQ1ggxNCKOvIKqNg5WVK3j9aq
HpkMnSdL0+0HXNB/huvocVeaBlCjqNpqOf3Wp9SR1Zm8GKGhn+mWsI6lXEQ9I0cnjlJjKoGQxG/t
kaEAyWezr+sHvByhraIHtokjliaFVAmjaujJByG6SZw4bVhVBkHzpKqAjiHMHOzaSza7eDS0fUtQ
uhwBj6qmya4zNmodWk0AyutF7tEBUQKjXtdoUXtdq1QxTY1fH4aKnP7+uEGjV9DDYDyIBpVoYd2n
dhj6xpGgBjhs6Fa10NMOy9dDEuBwENIVUHeDB13RtWDhZFVCgZyYc1pgIEulVFYdgYHWt61p1zUb
WgG1DTLGhaKSbZ1fIcKqgHSddIabAdrN9l1jSOte0AOvGq/uBoKoKQ8AzA4NY0PrTWC7rocgeBAP
9VA0ztGlsQZhBkVUCqqDtIDA1Uhp2oBzhna8GiGG1MWtsiqAnWQ59G1whrujZyw3MezXWl3D++uz
/5/9TV1G+9KqKSDUGvY10Nc6WmWbWqEPWNG1W8za+HMGSGGGYqof0oOKyG7r4doYrY0atGyx39IR
YmluPqOsauqgC0kNcN3s4dt9VAtpx2JVAHqYYwYXaqhPidBohK22yJJDAuXo++eNiHw1alorL0Q1
H86iy6WyqqEg5k1VCc6UGBAfAcjU3h7aBrmuEFUCuLbpkL/yBvfw1eYE8HQ0Toj1Y6nPRBA+NSYI
IPPGIfz8JhX1SMtPZ2dTAAH///////////QqACUbAQAAWl7F7xH//////////////////////+2s
TkZ1ozZgvIfNEhOJae5vX2y5eDNC1QDIXsgbaZnmkGAq5M1caM4N4BxUyoA1qFaPmfqFsw/F2jrh
g8uLQYTBuz3BBnwp1Tj7fNFXc2Vt2AGrQtX3EheyBv7TM8058KszM1caM5N7HBzZAVtI0RWjg2ZS
PVFua/wUDZ4PVg1AP5QzNVnXmMlZ1XUyBg5VVADw0pphwqqcVVAYcoZQY0aqqpPVVCBia7qbYiGo
qgWhjoOtvD8nIY6qga4qgxVQdWcKoGeXSLHqeuBpW7NanYDDtBwOGSqoJDm0WLbDoobP60kxtFtW
ksd96nDHTVGpsFWrrg6LatW2FjY2zXW7CcEPFGLrpkZ+ryTBqtjU2RlDGVUBsY8aqPStLDnSSVQm
pKoHFUGqqg/UiAGrNaqjFVQZpCqon+NauqqKmi7qKSJBii6yOqgyZGtqOhcVQ4qoHA91UBlnUM6v
obQqgXDI1/WNAgM/RFUDyqDph0rjrN6/rTqoMVUCnYeCqiPLZjQ9cVUIKqANRDwVUEKoJFUEgZDF
9VR0Hzfaw5VVBraqo+ZZDu1QO+4H0g2O3KoDr6qBoOa/5VQIqokVVL3WwNMN5VAZpOkqqO1UJzOz
qbFI6EgkwhzUyqqEFUMqqIUxAPvRFUEmvs7OnGlaHoOk6tqV5oDYVQuKqGVVJKBtQVUU6tf1QNMM
8PLoOzU7uFUAehaGqgXZaDXYA31UEGja5qwBJuZtE1hHVUmfUtLDb0NVASqgh8ydqoINGYQ7w7pd
BsuB9eVUCBzX2ptVURKqAA01VDvXTfdDvDuy76Bq4eV+FVCAeF3+oqqAFVHQfOrsWqBiKqBQ7NMB
3bCwaGGC0zrKdXdC0MMpv0sM8PLVA09T6DsVQB6Fdwy1oaqBcN9VBAGuwaHo2g6Sx6HpUaLoKqCT
Q6aLoZgal1p1Ztv6kGaiBduB26Y2KqPw4WwMfQFUBqqD+1oT8FVA/1VBmgMAaSqjBVSBpOk6zrOu
szJruTwgYO8qHIkQYLN72g8+/c7PNVAEqgCDq1nU9fD31w97VG1hDDDIZc37H3t3j29LDQ0AMMNu
cW9HPnFsgHMqoMDpDl0HTOmwOoP+7qYfWgIhyB9kNTRDSDKDyDyCFBBc73abaG2iVCAagaeCLUnc
EpVQDEVUACqClVANop46SDlPdm95VBMH6x6ZHUB3n7uP0GcwXJTbFVDPSTXHHVdZjUISJnvQcMxF
rgwcGqpB4hh2EXgOAPBNS2OGq4NnmcOcP8x/Ah+eqR/DH4brv+opmZtWgClaKkKKslXsr2ZrabRQ
ogNcNa8cNcNdNtvNNzXte17XtN07TtNWA6wVNTIG5BoNcNgNgNnu+mmnr2va9r2nadp2nAL3OzuQ
pNL2gVUTQUUu4bAa4a4bCaaaeva9r2vKoGlUFBBp07TtO05e1rc7aCgBRvQdkNcNcNYNZNNNPXte
17XtJvB96Np2iakicNgMnkGZpuGbGsKqB2W520El7NKdqpU0S3m42sAhrBrhrhrpppp69r2va9p7
Bp2m6dPHbQVCkqHdT7gUDUDWDXDXTTTT17Xte17TugzA3tN1TQLMhFQ6grO93ThCFAaoa4agayaa
aeva9r2vadp2nacofYXvQH2JzIawawawaaaaaeva9r2vadp2m6dD0uiagFamgfCmIAj9BrBphqhq
pppp69r2va9pq9O07TggrCDxEyUgo+8d8E689C2iw1g1Q1g1k0009e17Xte07TtO05anY2dioeAJ
UuTWpDWDWDWDWTTTT17Xte17TdO07Tle0BeKC7qI3u2hQUDVDWDWDWTTTT17Xte17TtO03Tn3Dgu
UWTCSlQ4EqQ1Q1nDVDWT05O5cvB2ajjVFVGLOqhVVQhqoFwwmBqYw7G4MyVUAoazUk1pZDJDTDdV
Qza9r2va9p2nadpscqKld6phhQY2aWgPIOUPdC5ei2y93LjWHPoQdOva9r2vaWQ03TtO2mCEuaCp
vtDQzs6qkfWQ6rwcrRpYbweWshk6k1sOkKoUwzmoPQORq+oDO0kNNVBmqoA8+OEKcpdKqCdR0rSl
UDiqCdVQ6GOHJr2va9r3Kwqoe19tbSGjaNY0Zl4XFVGDay6Np5C4y3CFhVAZo1xl06dO07TtrTQz
s7Q0NDOz6zrIZAaoaGs6zoXu208B3h6h8qoAg3Q3lHem40YN0N0NrXte17XmUNEPqwQ18hoyqF0g
qpCIcNW1ZVQHcVUPWGW4Q0ZVQZowbTKysurKqDFUGGnqoHg0WUPrVlVCofWn2GVl1/np5BlsXLmj
MqqjBtIaMQDxVQGWFUGBDRtGVQYXFVAbLc1+5zuB9XCGratcsKqDGVVAZo1ggH0GQqoduMurasqo
e1awqpCbbFzX1VBhC5q1ywQZVUITKqoM1Zl0ZlVQPKoA1VGGjXCGntuvqoMLFzVuQaJBVAGqgeDR
07TdO05oZ2doaGhnZ9RbdZ1nxvYwBlnSvWNnrXte17XtO03TtOaGdnaGhv0Bn1DVNZ1kMMMhgnxm
Ru9LSlliDMsqoI1UHQcN712017tHrWlUAKqDrXNTDu1FIPAOCwqpBD8VQL2LKqgnWWfQObVoKOgB
jMQYmva9r2vadp2nacsO4M5mbtR1LUNQ17XtVPrWlMmv+IaOGEZMO7pVAMGCG93pNlVA0qg4Dc3P
WUb1XLadrTtO0U04T7+7vtUdr1W8Ubs7Tq+qo6u00e5e1zT7FvR9Kb3IBlhrGua34Mtn0cPMNGwq
gpDBDM0DQNNtNNzjrvd4OYO1pixw8GYyaJjT2HkQMyNLUicybImQiMwZ3eM+aLkBNDBvW4g2/zbd
NfQDD+++9/0T9UeyCVX3vfeGn/o0X3Mo3q0pta1qlSGytTFJK3t61rWta1rWtT1Oeta192p61jdA
AbQDVpVCgAFPse1OBaN2zfqllb382nq+invqik/JAKve+oN73/RqrmUbx6UyIiLrrroiINl13roi
I8rLqMsREXGMaIiDXXGiIg1xroiIuuuuiIi6666IiIuuuuickIJc0DNaZ4KcC0LYUpWSa4oJVAUN
RQc2pTqyrt/qXRZLVm/e1FoqBHRadS6LOKSfBQuiwGnRe7S16KgeKP0XY4paCo22/KWKSoFClGUa
g0WtdlBoKu0WKUHRCApLRchSVQhoKKqRqCtClv98vMQIL3oLdaXFLUcpTiB72IECtCjTlUFEZOoB
0BtpBtayhm4UECAoWjPKqqyeiw3VdFjXVClXoNkFQ6LQKHKX0XYPaeVMUIUhUfM3U/6PbKe3tBiB
pqzRcFTIJKzUVpaLJqqZR79RoHtF6FGFPaLoq6rVaqdKF0Wxd1NiuU6o0XOULIpLRYTS0z5woHRd
eUKl0WXosPRdFXuFDAotBOnJ2qdF70qVRIGkoTRYxRKANeiw25sBS+i8mlpKNc0WE00colBgaLFK
Nq9saKnaSjNFQBlANPXn6lqurSgKuaKDYUBxuKZQcqzReF7oKjnuUfvouart5NdX1eU81f9LRYDb
TqBpbqdIpBVt788QaLh0VQAg5NBou6mgKLKGcdpyQTaShKiQIL0WZotTRUABTF1JOkUqUgHHOKVL
2houcpLOSKFKB0XffBnECBu2UKQ2qqnz96vq9BNTco+o5oKu30XM11fvJq+ryntFgNv0nqrp1aUA
URUNSv1SUzUui9NmjtWaKoCpTspjcpspdu43VYUtU0pX9VlPBWk7MU2mZTRQBQTW1ylQKVqmggEV
ONWn3k6dGU6UpXdyu5yld3KVyld3KVyld3KVyld3KVyld3KVyld3KVyld3KVyld3KV1fV5S1VoJI
PaFKaCnVrXfKia9t0DduoUOUK0qVE1SbabiD0ExVNGTZVP7ttHdoqUpIpD32pt4UDU21CFdgrQr6
9JXPUaWlWWNc9LWaZlIlJXUFR/K7lKykNymikKc0F9cqiqfvtlAVSg5XFzl6Bmuhv3ldl3Vexz0H
tnV9lMqSnp6LiKQ71XKkKRQY2D3/6gQIC2FJuZlUFB5HLqgFsbiiuv1Gg40XowsjIDuhX041onpE
6lHqy5SZSW3Ckyku1BUlR1Kqqqr+Zho9eSWLaZ1tBZHXPSRxWXYCkykykyk/oNLS0qqqq5mYdevF
Zcll1cYVypGhEpMpIpIpNpaWlpVVVV0WBotVSeZmErFzXKkLVy9Yvq4xYHCkykykyk2lpaWlVVVW
XajUQ0Ck0CBAUQrxBKnlL/qhp0z16OvWXgwwgUkUkUkUm0tLS0qqqqudzMhHVRiXSJAvFhMssaQ1
rgUkUkUkUk0tLS0qqqq5zds9qqWpNedc4El62pNbWQeeKSKRKSKSaWlpaVVVVc//OFfTJXhCss8w
e+eqKSKSKSKRaWlpaVVVVf8iiK0iSAKkGwnE6/veaD6xjTYEkYlJFIlJFJNLS0tKqqqpFeRXxrxN
h0jjHSZFtTBzVLRZGSvBneWXdc02VbSOMFoLFJFJFJFJNLS0tKqqqv//kw04uMmgs8wI1vZC5uVj
SFJFJFJFJNLS0tKqqqv+RRFHpLnEMjGu5Eu5XrQKSKSKSKSaWlpaVVVVfIoiiKJgcaxYl4s8elB4
pIpKZSRSTTotqi01BU5QrS390XS26LpbtFw08BQlTlAUalaSj6iqTRdPWpC3NFS1cqqqrUhQZQhQ
DvXr7C0iozqBoKFKAKIqGpqku6ku/UqeoqnVVVVKDbKj/1ypEG1vMu97xZB6qv+U83tUsspTRdtX
S0XHV+yiCoWloKY7dvNCqAospneYvgQ88oajUlXaLn0WsUBVTbRVVVV0XIpsKMkDRtSmoUaUXau2
8uSqGrUCCdCusvW/0hxV/1VVf9vb9FyaLp0XM3t9WflH3igihiiNFjaLJ0WPdT/lNtb1VVVZt6hS
s0EqBRGi5GnRYk5NdWlEfyjLuiw6W3ZoJdFQq0qDXOk0+UDySAoOqJNG+NVlO09vqnRZtVaLjnOk
gq/RYmi09F10UFEoGjosaU5SqdtqtRApKqao0XbvOcmpv0XOUaKbagqspurUG2VAgBQfZSQIKdVF
K6LFoy6UTosKqdFxlPzpVEgVKA//+Kv+qqr/tlJvb6Y+We0yzklVVVf//NX/VVpoPptre3lCFC0H
KiQfSqpwpdBlUcqBqaavKYujQammdXb9KQbdFhFAVEUJVVSVI2VXVFPZuqWqbqpWoCgeFAKqqq/Q
KDKDqtBlPfem2U6aqs87R3UqSplAp2gUBTa6VWoFG/fs0FxooIbfyMSgSgCgKkixflhmdZscD9v9
9Cq3NsrV3zu5T1VStq3qYoNtaBQpgobeh2q97p8badBArSxoAaFe7URtKg0ypqT41YploMeqTdYq
XBJEB4OORvnHowcuDm23b8YEJCqMkTEnELJ2dHSFMt/tpO4mZhk7efvjmkTLMAABgd3ED8+GAN7g
GAAAwAAGAAAwNG6wAAN3mANAX6c15x/baS4Brwu1YmOkTGziFHJ0YkKRf7mJ3E4n5Tt1JfHTETHm
B3dzAaa49358MDu7uYHd3MDu7mB3dzA7u5gd3ce1gd3ct09zj/xi+N3ds8T3FB021vKQqeoim6sq
e5VBVeiytFnaL8yomlp0XW2t+iytFQBtJTZTlXlCaLnKDKRquodFmVcgKR3KEvcozRY6Cpigahno
qA5A2NnlB972qbKTV5wovakVKKdKI63VVUVQ8BTdKkUrVFUtdNoaCg6uQVOUHVqCqqjKVqiqW6qq
vq9rKlVVtVFUUp77oN0GzTJA2VRtouWV7aLBQKNiCocxt0WK0lBFESKbQFF1fVBUqqdF0T2KNqmr
bU9nZ1MAAf//////////9CoAJRwBAACv5+apEf//////////////////////BVra1oKpzuiqCe1c
1lI1DSaKo0XagbUFQ1CpouIoyo2nRcVBubCktF/1OUCgqkptAVK7TQVNoqAtoKXKXUqpTcqVygUz
ouYp6o6jVKAnoqBEoVpb9FlN1UaLqllXlSlKv32VqFxBouKZQtRFF6KgVqmqSgyn/0WJosXRaeiq
HqjqP/KlVNRlUmi7GxBosPRVAei9aCDRexQpThQVUVG3IOlSipVChVFUaLRKc0VAFoqCNpoVfotk
pBs3KVmVK5UrQUtVKmi4qrqzRVFNQ/otGpClyligA3lJNflJtVU41lNlHaLk0XnVui7pFBtmi6ig
GoqVm+ylXlC1FouKdX1ZVNCp9FQJ0e1XTKlZs01Z9UFDc0XNkymaGioEShcKAq8qVZTdQ0Khq3bm
FP0vqmq6s0VQBVZRZUrhSs9ylqlaNFxVXVKlQ/VmiqKSlyltFo1J0oAqUVKo1IgqVTRVA1WfVtU6
LTKdp0SkEO7YVKKlNdUt0NFxaLmKL0XYUpotMoVs0XlUBQyBWSAoPRdjTouMoYqUVKKlFSipVWFC
FSlVOKlKtTagqOoaqkUSVLKllSipRUoqWgbJIKhKllSypRUoqUVLKllSipZUsqUVKKlFSypZUoqW
VLKlFSipRUsqWVKKllSypRUoqUVLKllSipZUsqUVKKlFSypZUoqWVLKlFSipRUsqWVKKllSypRUo
qUVLKllSipZUsqUVKKlFSypZUpAVKLIKmKHKS0XposdRtbqnKS0WXosMpfYpQoC+1M33VlQNBSmi
7dFqtDZVFQylUqDRZRTui5tFmFLFBfU3dF2NZQ+i9qLYUKUyUPa7YgKlRWQS5NqKlvFSipRUsqWV
KpKcrUSiOz2pVWKiQVL3RZBTrWUVt9X7UGunQukgbKpKZqGpeIKq2q36W7dOoqoqRoVqKlbdVFQV
W2SqRVuKQQTbhQfaFKckG6C2z/bhosymUEUpjcIT4jYW5vGFSipRUoqUVKKllSypcC3xFKkQJAkC
VKKlFSipRUsqWVLKl2VKKlRwgSBIEgSpRUoqUVKqyUygipZUsqXXXKlQ1RAkCQJAlSipRUoqVQqX
RdaCjbfQKLtAUAURTKWV0WEUy11DymVKKlFSipRAkCQJAlSipRUoqVURUsqWVLQWs7EqUVKKlECQ
JAkCVKKlFSipRUuVV8Klt9SVVWLhcgSBIEgSpRUoqUVKKllSypZUuuVKKlFSsIEgSBIEqUVKKlFS
q5UsMocmIVypVlSiBIEgSBKlFSipRUoqWROsKlFSvKlECQJAkCVKKlFSipRUsiSpZUt4qUVKKlFS
iBIEgSBKlFSipRUoqWRJcqUVKKlFSiBIEgSBKlFSipRUquWFVoCpRUogaubhg6UEoU/oqBurtFUR
aKop0VALos7KDQUcVKKCKI5ouPRdVTlP1dVOi2dFilPaKoFKlFSipRUpAVKKlPoLRo0dSthUoqVt
VjWVK7vVDT2o6VGqKoKTKlUSpRUoqUVKKlY3oCpZUtSkFZFSipRUoqVoqgUqUU1UOi0am0XFosvR
d1U6LXKGKAq/Rcmi39FldatFmlAFStF+6Li0WboqA0pTCpaBAVKR+6JVUUPouTRcZROioBNF3aLJ
notIqUVKKlFSkDfoqgjRVAxQhQiDRcEqFRFJIKiKUFVVRoulA0lIFD1VS0WyU80tBElSypRUoqUV
KKlFSipRUoqUVKqD0BUoqUUrjQUI7YKldGcq/erOgqUVKKlFSipRSiui9eoNFm3ouAonRdFUIEBR
xRzVouDReraUhUWFHaKoOqLRaJShSRShR2i+akKL0VA/oqgApLRaJR2i99F/VNZSBSmizdFsICgE
BSTe0tZROFLFCICnkBSVJtKEmg0XBouBo0XdoqAyp6i0Wa0oM0XW0oCjijmlTRZbRouYp5tQaLPK
JqdrKSKO0WHoqiPKsqgoRtadFm6L2QNZSTTVSApSoEGi+SjiktFxlKaLI0VALVmi+WuWi6ygim9F
QNZSKKQaKoAzRUBeioHygipZUsqWVLKlFSipRUoqUVKKlFSu9KlFSmjebXtsUHVVQVA2lSipRUoq
UVLIkqWVLKlFSipRUoqU0qlSuzKlFSplSqjtspNoaVdqp0X+UhotfRUDBRFQbzkUlUyhUrRVB+io
DBVWi4ym6g0WlosTfRVFOi8tFuNFVaKgPKNoFSkGFSmgoL7KlFSipRUoqUVLQFSipVKhUlWFSipR
cqUVKKlFSipTdZQBSBStQzQFN6Lnq5TRayDRVBpTei76jqvfRVCeiqKynype/Mo/TooSpTVhlypR
UpAVKKlA6oKlFSikikKlwOlJb3U9VlAaLGqq0BReiy2ts0XOpotYoAoDRc2izmjRbeiy2rqCnlt6
C6be0tFV3NBxXpSRSP7hAVLUyny1VPKC5XjFGVKR/eR6xNrMyTJ1j/S7t9+HC4cwCXO4Z306U5lc
ZlRIxjGMYx7GYsYxinDfCMdjGMYxjGMYxjGMYxjGMYxZlRizKZlRizKjFmVGMY+2ZcZeo5ZlMyox
jGzktrN4i8L+jb7+/vfTMpwy+71EjCE37B/pd2x34c505vAJc7tzvocut5ldvEZlMymZTMrCEhmU
zKThvgzK1mUzKZlMymZTMpmUzKZlMymZTMpmUzKZlMymZTMpmUzK89RkzKZlMymZQfu88i8zNtNp
Bf7+/sfePbMqrykKrbqtQdKVqaeix6FKrCjm3RUAeioAKharbKZTlFt0WXoqhnhSRRVQY2U9Fk6L
nqgoHjQqUFoqBqoKsVKX0XEU226KgjFQlB0ZcqvygvqgUUDXQqGW9WKtMmikrqfQlAUKSBua2mVN
tp8aFW7rRVOTnSFNA3NbRSaW1snyoVask3IVZ1ehbqqKHqopYpAoGqqjqMoWVQNO3tNQ01NFx90V
RpoqBopydXICgKSDRY2i99qlqWpdFQD6LNaqkaqnqdA1tVSS0XtoqAmb1VIOVBotidUNvaNMoVBU
GxQKBo8oDRbCCjoqCOjVDZPa27G0oRpKJKSVQNjpSpSRThQSgFTVPosQp8pZs421HouDRcmiqHLo
NaqhSBS0mjRVAeioCP0WBVNW4UPospp0XQ1SqKlovzrQ0IKrvYpLZQoQpGiGmrtt20oMoCp6iaG9
B7Q28bckUuUW20Sk9Fw/UTVRQVEgbaroVbouNsKKKaKZKV0WQUqgKQKKKYVKk05zqrypNJsqlp0X
eUA0FNVUUaU22BtKZVbKFyKQKWVUqmrf0WAUk101OlJlN9qlWmp3CmqqBS9lKlBVJosQpwpIp8px
qqdrKkqXKjtOqO6LRKQdKV0XGU0UyU/VJQbbUSBBVtV0CiimtFxtmiyClSmSlSiimEBSCBtV3qpo
+pNqgqtrKGq2nVwoNVQUcFSbDRYeUMp6Ly0VQIp3adL5UKNTtFU7TbeLuey1LsUlUPRUtSFI1dUF
KqrlVdTN97bFPFJ5U9LRdRRxSe1T/VzU1tOiwKtbKVUNtXN9RN++0o9aaikrTa6DdlRUdFxlJyKG
aFKFGon25uaDXYRYu17Wotdtc2yei4W38xRAdQ+gU6UFUGNM/6vU5T1RVU00uUW1uQPeUmgkUnSq
0o32qggQUqo2nSbSkpRApVMUsUjvQKSqehVRSDTjw2aajpVMiqKjWKIoUaDVQqhtbqiqDRcrYUHT
1FwWcidm9D/YCpKC6akkCx+dvHWrnG9SsyYPvrfoyuTCL2WD/ygNFjaLmKNNdYlkWxY4cEM+VW1J
vTUqHKpqvai2FFFMtJRnOlNoPKDa19I8zJMF5h5T3FUGs5WrV7g55qNvKmajof9ezwm/OypJ+dbN
N+s9kTWPAsT8YcuA+7EDz/xyL4vWa0G5XOPsi5Llb3HNS4Ics1seyF/Z60+Mp1rs4ahZ5yDxUnRZ
bYUZVEVLZLqYpHRaeiw6qVqSoYlFaLAalCjqp8ozKsaNFxS6gKBQVEGlrRIo1Wr/N6rKGKA2qTlW
/1tb9Ficq2o4N09TffZpz0XCUo11ArUCmizarqooKp2povRYFLRVCFXNFdWdXlLNlU77LKkRtVxQ
9U76KgSKBolEtZQZRjYUZTKFqLRc9X76Le0XbosApwoGRTyDRYtGoqbc0VdVhRDfRq449Kkz7s2/
hUkqTuVJ71tqSmCpKjbotAoHRY6DRctFBVBTihThRBTBTNWaLpqtuKK0XTosvRZei7dFky0WAgKY
7UaCp6uqYpApIplvKC0WK3KoEEyjyj9FweUOUNUJS+VVVWFD1Xos6gEBQFOp2ypUFXFFIKsbinmt
UpAogpimUDuUEq1hTdSodFxaLAKIbikKrDQUKUXosZAUhVzWUKUv5T6Cq6PSmNFwNaDmi46h0WOU
ZouMpRq0XKURU+iySiyjKuqQo2p6uPcKoJ1IL3aCkWmg0N9tqnWkVVQqOo2vyjaeaL73KF0WPQa7
bymhUilWVToqgcqSgqVqqttq4ozRa+i86l0WXoseo6vKQaykfQFSdFxt9QFKSQSIhtqnhTZQBS+i
9X2goAoOqqm9pKfa6qxEUR2S4qm9snXRTtEiliiJAxU0FStFUNREVUgQIKUqsqpq0X6UXVylRIKk
bGmoW3RYtXN1EofanzRcFQtlNWWKzVUqGlJsKOKXlUeVTIFSSl9mvbtVlSalKARBzECKHoGDpUpE
eu4QR17ObMtsA7cvY0XGTxzK9/+3OxJcwELAQpZkxTDyQ+3G3LmTd2Ec3My2wHxfnsaHk4CTxyXv
/3Cudi1zCCWEgR6/9g4T7ELzVUytP5FClO6LdvpQV6LH6Us0NBRxSdQb7FAaLiKRaCi9FmdKTKf0
WLVmi4mipCjdFQCNTcgbdFUAaLL0WbxXRZxRBR9UVE3Y0NFQ4pVdXVSgqJq0XVUFRUqpVbPaqt7v
1uq0ZjRzjdQm2tLQ3IG0pFtakCktqb9Jo5zfqloNnqVQlDT4gBQylJSk3FBUW3gpbICmUCDcpHt6
LPbtFQNaKgiV0WGgpNGNpQaDN7nV+i0ykyjNFwt2i5kChSVW0mkpGqdFyFIaLL0WOUFoqCSoasqr
lRVMga6sQgpBs27JRWonW+VGlv2dUSadFUCNymwq1uvRclR6LA0WBKdX1JPRaJSDRtouht7Ol2rV
SgqEtFiVXoqCspooJtVqelUAqPRe+iz9FQLoH80XWgQBso2UE06LhbimG5vKS0VQXoqgHRYBRui/
J6LiqJpQN6m1KlxtU5VBQdQ05VeUHovBAUA3K1Btts2lAtvdFUB6KoDquoCj6Wi8CmrQZQQUKdFr
ugUNR0XQUNou2oSkikyn9Fk4gpUpyKCoVaqrU5QTbTqEoa2mjVVSoCklaEplI9aai2q3RcjVV9t1
SFP6Lnn3lIUKDY2K8qSoijygdFUB6KoDKWQFFbK1A3Nu23dFUBlAttQFH6KoDqspq6Wi8FKSCyiK
WxQ6AozRUAZT7SUgU3ot+nVyBskUBUAqz5FD5otop2o2+nUtWh/ZBVsqgspHZSqVqmoQqLuiwyhb
bqvn5RtWFJFFaLF41tPqVRouEpZsp1PlSUmypqVRlBaLkKQqCrae+27RlQ84UJRaoFJaLik3N5TF
OpNu21+1KSm31Q0Um6oT/D1Iy1zrQ0jYDsevUmKVTugFUNqBquVGpm6g21DUlGnQbmjKppKfQ5Nv
u1ao2Up3ULdSqKqmxI0NCDjW21LVFQtjW3ICg7xAgKQ9pKGpqtnYdm26yoUBSdZBQKBaEFOoahqO
nSbm5vKXhUNQK6Gaw7OFk4BpjA400O8VbCpOH4v9PRsdMxbBeZh6z9Z+VHVTIyHmT2dnUwAB////
///////0KgAlHQEAAPcibG4R//////////////////////+wZrDWPW6R/5UgqQUbosbRc1TW9Am2
A1ydRzzWOwYFQ1LUlGqW3pSHOU6i5lQtJSBTjaga2yrmle1oLZYFif97scRnFzBioanJVg5p5mGv
jA4uFrsRtZg+Brtm1GnUO5Os8wv5+bhPg7/SXXWNaFwxfOe9a+c+BpdYbkcetcXDUEwMGHF4iFiE
OPX5dx6zzULnEm7OMeHDxd5Fc9ZZLg9aOfmk8DhBa0otfUMmswjIY3+ULVuNVR7tFQlL4U4gUQFA
cqqqWhvbdF3aLvq1qxsq+pygao2qhRBl4haEE25uo1Q6UtVIFQVAGqqKGVAfKfYZYQFBcUKSq8o/
RcZSBQLVRnVBR1S1BNsasbdykNFyVdU8rQwebikajVfKU20VBLRbe1BVzTsg2oVCUzei8OVB0p8o
ooIpwoeqqrqjRdTQposIoqqylb5gPG+6iammqYY1Z+VdV1T8KH0VRJVFT0GhuqEpJs0WhRqApYpb
RUCFQtlV1Q31DU5Qei8KhKS5UpS2i5iiKqampu43051KUHVBQ7ZoqDMoKqKi4UwUEU0rQ0XZtVRQ
dLRUAui/ylfKAqKoahKXq3RVB2i7W9oKPqj9FvFB1EUsUtVdRlB6Lm0XcUUU0g0Xt0piqeFLdqDR
c1TVCga6LQgqV8oooLaoqlU5ouYpbnatKQKYque9W1JJqKDqEo3tQNRTKBqas41FByoVRzarimtr
pUai23jcmyrKlaKmq9s0XeUyUzouXRfWi7NF76KoDKN0WE2dKIaagbZlOFFUakKI0X/dOmUBJBwo
BAg2KB0Xu/jY2qaLDKUaKGwQFAaLMqco6rij2so5rKCKMwpfRcLVQtC2WydtWhUCu88vrhw2eQU1
KfNihcKKqVvpNDdU6raUhxsqOrimCkCmOFINLXLRcja2bv70agQt8rQbTQUhnOqNObVQgX+W2dyh
dToedQ9aQpj2ZeXL0tLwuR8w3By475+b/JvkQTnS2gLwEj8B/JsuPAr0IIogLOY/ZbUuE/MMHb70
NLeEQb5Hy50Jb5Pz8vkOLibFx0hagOgIhEFdAU7ouGZ6LDQVRtouMN30tFk86g0XEUM1t6CrVFO7
fyr2kKaLZqkpSrahqLrfsU9UGioB9Fh7lIjmiqCCiasFAompJ09FxIKpkU/VqqAo53RYW9JTYpJS
nRq4pPeq1VEEt+tVR0Wyqet+3LqGoFHW6hsglvTo1XUdDjXOlxW9t7KK2bWyqKBQlXTqwpkoCdEp
Mo1vq9uqNpbqCApSpG+9Fj/os3Rcei5qs3uWi4Sk6m20XKUzUrTS0XOgKG0WDQqBsqhoQFJXn5ZR
OixKpKKq4pPClJW1VM1lEe31WUTV+e3lIca9FUEFEtBTkt41FtSqmqWjRVBJRRRRRpTdWaLNbmnf
tQlB1VospvVqFuBRtQSQFJb7oCg6sq4oullRT0W+0SpzoUPo3cuUSk6i4pViD2mqqmKFKdbyk6Dc
3tbjm7W1t7XosCfSj2hrq9qqNBUCChK6s4oUZRz6qqGpkGixt6qnynUBT1tP1K2U9qkqApDRUCGi
6CnKpUKRm1Kt8ijagbhVlXICgygailTUKQqUp2qdtlJtdIpmoaNQ0mhvqyqap0WbouZrKbqG/qho
ot1No7osaoWGplM8pSqboVAgQVZyV0cUKMqGpvqreqkGixm9yZSOi73GvRZlTNBRhSbZV5S7TVFR
NVOdRlICoSgOYUeUdUxRSDpSAqhWom/lVlOFFz0WSUKrVM6CRoKKqqrKn0XMUCUDUxTZQTU27VHS
qgfUFUNxQRTpRhTLRVLcUKUrTkUJVNRVCUu5UZTFVFEUihSgilcUV+dSSspIo2hVlQ5vVRQTZUlQ
tdKjFsqUmJ6Z1vsscY6XDjEkJ6sbasaUE+NpQFRN+i46vKBKRo1WUk1N/tlSVHAoKqwUiUEUgUDS
aY1DVNlLlNo/quqjp5RQTqvjQ01JQyoCkKBQnSlJt9CqPgXVKSqDpQOTqSqKCApQpQ/KUVaqunRa
KNSVI1VDU9SNlVtllIVJh5hMKJLhwOJNgeembhbNGfp2CcCRAgSJECBeESXoZAku4Tp5Hzw7JL25
4g85VcydIxpkwOJMC9w/xpuQ0jSHflPymU4+eY59/h5EkEwMeCdNOnqamUlU9VlLFA/UtV1FUhTu
i4ylil6pwVU0FI1JVZwPIHdi8APtg7uCP/z0n18h2/hGq2upb7fLy5ZzK45GzjeHZ54ELa2p4ooo
QFOBJ5h4Rrmk0aXJ0sJdFlzzgsnMJ0i+GQY0P+7vUDTMB7HnCRn4eleHni/MayBg43kEpMT07r+4
NL7iDs7stZP1r8Hn2eEjHHIZkHPBPB8cBdGUVU1VlMaqnUtFXRdBRRQkqkqBBlT1TVV1NU9DRYZS
1Q1EU3qN9FkFN1fOmg7t3mIECCp2hrHlDyVbqJSnN6PM5NB9npY56F6pKhbG0p0o4oKp9Fg6Lhqx
taJaLEKJqqrNF4lJPtSDRYLdTqMOKFIIA2UtFhlDFK6LBo6Lnaym6i2Ka0XRVFVtpS1NruRSGi5K
lQUCks4UNU9X0kGXnLJvz2zvaUUFFsqfCk0hJSZQDREozRe7VovAopApV+iw0G1GnvtosHdpbSkq
jbaroNtSlJFLINm2ggKQQIKvvYpGoiiSkinECApLRcaAoZrKA0XM3lOaLE3QFMzkUG3lKIKgqfRZ
GiqCKv0XAUrUaDRcxQWi0CiSnao32oFC0r0VQJU7SU5otAolrKWKW3qOlSKQyosKAQVLVrUUhxAg
oaLmbdihqnQNqBrq3eqinEBQFT0saqKDfYpBBtSb9Fx1OUwULKdVVdUdHvGi6OyDtRaLGqMp/mi6
Kqp1WU415R0XR1vKR41FItzdZQhSFGrSieVVRqS6ua9yh9FxVY0IChak+RQJQVU0ZoEFXtAUqAXv
U1V6LAoIGupdu6LC7Jobrug0KIBtgggVroEFBQpyyhKgq7RckldFxbFH1X2oaNU7FJFOVRousoZU
oApRBParaqzrWNqd71TU6G9qioNApUkCC6SB7dA1joQPIPl2Wyrrj4NwrVG3wAfj4k6/78X3R7Om
V7njftvF56S4N14yK9FiC98Sc9+v33O+zvSvDDgeN+69vvS7r2+i26mY9FoFAS/RaGizqWVIUJLf
ReU6s0WDVZTUiht9F176Kog0XoopjQopovPReOiqANF4qKKaLBKb0WHovbRVClSNWKaKoZ0VRMUE
opouDqimiqH6XdFUNaKopblFGjRZGi46kbWhSpCmqdlM1LoscooppRSpI1TUvVFNFQUaKgvKGKGq
Zr0XTu2tqiiiiiilDRZeaLoxRRRRRRQoEowoGrWpRRRRRRTRYNSNWKVKoooopUmiwak3UUUUUUUK
LKDqukoooooopQ0WXmi6MUUUUUUUKGKG0XrovBREooylHqKFHVS2qt1U5BHTUUtTRZFF7tSN3dFh
aLD7ZQuiwtFj7FEVMUkUBotnRZVQ6LqKEqapqm/ui4SkKmqbRcJQui0avKcaCkdFq6LVwp3RZpRz
dovykU7ou1Uo4o7RdOi4SiijqsbmujvVpShRxRVU6LmKOKOKZ4LKHKZ0WHoqAQpirtFQE6LeDZV1
WFFVQUyyFI1Q3aKopuBRNKdGorpaKoa0XCUjVmiqGWmrSjKhKMKQKTKdKR20VRUUiUjoqirRfRSJ
Smi5ikOtUyldFUH6KoRKRKR0XjoqiqkKXLqSVXUm8pEpHtlIt/eNRQFX6Li0XiUjUZRZSJSNTlIl
JaLt3KapUikSkSkN+XbVUEikSkSkSkSnP3KNq4pTRcei5CkSkSkSkdFz6Lqbim26kqUiUjVFUfR0
WTosopEpEpEpHRdhRJSBSRTei6ykSkSkSkSk6spdKRKR3KR0WBKnU3CjdFQYFIlIlIlI6LiKTmUk
UlVZS5TZSJSJSJSLeULTb6XCkarbSkVLoUKVKoykSkSkSkSkNFzlCVXVPKv0XIUiUiUiUiU3SpTB
SNKrikakly+NTf0pEpEpEpHRcOi8WpuKTq3Rc+i4ikSkSkSkaU2aVXUikSkai2eKAqgowp3cpEpE
pEpHRcxSZSBSEkBShSJSJSJSNIcbarKRKR0WFotK5WURovMpEpEpEpEpvRcRSRSVXUikykSkSkSk
aeiwJblIlIlIlG6KgwqbkyktFxFJlIlIlIlIlLlNlJVXTb28oUpEpEpGqKRQuizKoKRKRKR0WTUr
eUkU3ouIpEpEpEpFu0XCUrzlIpEpEpHe+tNU0SlSlililv5cyjtFQLaKgQ0WQUsUsUsUsUBU+xRl
RlF7bFLFLFJtzepVui4yi2rRcRShShShSipQBShShShShShShShSmi8Kqucqk0XToqjSq9F0lEIG
pqavKUampqampqamqkU31uKY0XC1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1
NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1
NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTbSbKl5VW7S2tra2tO9
X8V3KC0WS2tra27cbZNLbouGom1tbW2Te3VD2ruNra2ttCmUhh42tLa2trbtT0XBUVtmi5G1tbW2
Xae1ClSoNra2ttR09FQFoKOiwW1tbW1os21tbW021tbW221tbW2y9tra2tvm2tra242tra2n7a2t
rbf+2tra2g/bW1tbVw2tra2m2tra2lg2tra2tra2tvW1tbW2tTKUbW1tbaei4dF0aLo0XRoujRdG
i6NF0aLo0XRoujRdGi6NF0aLo0XRoujRdGi59F0aLo0XRoujRdGi6NF0aLo0XRoujRdGi6NF0aLo
0XRoujRdGi6NF0aLo0XRoujRdGi6NF0aLo0XRoujRdCtV4mUKY0XDUmi/inNFQB6LbKTKSqopQoQ
o3RchTflKFMVmppptm5RLIUvouUvouzRdJQtSlKVVVBTZQxQui59Fwt2FOFJFCFCU9F09pUKF1RV
FU1RVBQrXVZStXVVU+iyaFUVRubfVBQVTthSBTG5QtUVQUNKqaoc3spsp1WdSVRVBQGiwW+qKnq2
bZosgoE6oqiqaoqmqLqiqNCqapqiqDqhv+qG8vVFUnVFUGD6ASAeGM/NH2f2f6Fkr9Hl2hSxLYHh
2ef54PJzPJ+sjP8oS/1s0PBiv5IwwW85N7XoqAJOZcnML6A0atozycF/+aMRmwoy0mnjS2tG1UVU
UB0pxrU2aWloaWkpTRbJRdX/5Ky2j17tGDiCwPtbPzK9rLmXRtHKl+zXwAy3sJcxXrmwXnczMNbw
T/1zLZhPmGnhSzaBUYO/0dfmXJ801+XJyz+7rLI69eswjhPmXTk+DB+RQreWw/NZeF17RmDH888r
V02jK/6Hn5PlmHLBPeA7WJA55ptAGW/PMqj5ceekSwk3oSGE3XF/5Nc0YMGn0PrSFfQBrE2P0K4V
aNFUA6LR61SqworRYJT1WNhSBR5R+i89FpaKgF0XpovTRYOi6XdFi6KoB0Xzoqgvu2i2NFiaKgy0
XIU01aLHls07aLH0WRosfRY9R1HUdR6LH0WPosjRZFR1HUdR6LI0WRosfRY9R1HUdR6LG0WRosjR
ZVR1HUdR6LI0WRosfRY1R1HUdR6LF0WRosjRZFR1HUdR6LI0WRosjRZFR1HUdR6LJ0WRosjRZFRN
dR1FosjRY+ix9FjVHUdR1HosPRYNTtLW00ylalKFKM0WKUTosPRPZ2dTAAH///////////QqACUe
AQAAm0thHxH//////////////////////1jbqtu6ui6G4toufRc7e26Ln0XRoujRdGi6NF0n56Lo
0XRounRdB6Lo0XRourRdFmP0XNouVo0WQgKUKZ0XBoqAvRaWi2ylUHcKW0X1ovnRVFBT2i9dF0VY
Uo16LAKCqEpO6hqGoqi/S2qhs0XCqUjR0VAkUToufRfJR7lzKPaigSiCmmvRcWixCj9Fl0EF3oth
qKCaig6kadFwaLLKC0VBHUGt/lcMN1s6WjWvenTKTKY2p025Gjqhtp0yk2ynTVKPqar6RQJQOixC
iJN1KqSjyjSjSgqooY1NGixKpbNFxFBNWixCjyjSkVaJTNR7aLCKNb6rVaWoo8oEoWoijGrRYkig
ihOlE0Gpq0WWUCUWUhQoaLY0WwUQUQ0FBlAtDQUDei+8oUNFsFGlGlBVJQKQqbRZbQ0tBTLhRGix
CjSjSmarpUijygijSgaob6p0XMUE0NRR9IpYpEo3RYjQUe4UtVGxRBQOixChqkKZVKZKNKPqOo6g
KZ3KR0XTovApS6jKEKU0XhovApQpTReGi8ClNFq6Kgc0VAMUpou2ylClClClClClClClClClClCl
ClClClGupCjylGsogpQpQogogpTRUDmioHKhKUKIKIKUKUKIKIKUKUKIKIKUKUKIKIKUKUKIKIKU
KUKIBSjN0ompanKNKNqepyjSjanqco1GUXU9T9yp6nbym1aG5TTfU9T5lT1PhQNSynVDdotEoXKn
qfMqep8qZvUKa0XCplT1OUjlT1PnGqqG+rKnqfRd+i76nqfRd+i7tF8TqreqykmrRd9T1Pou/Rd9
T1Pou8pbRVBKtVdb9F31PU+i79F31PU+i76ibtF3VPU+i79F3VPU8bKJoFElEFElElElElEFElEl
EFElEFElE4USUSUSUTvZQuiwMzMzMzMzMzMzMzMzMzMzMzMzMaqiqaptFhbVNU1TVNU1TVNU1TVN
U1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TFI71NU2i+KoqapinOVNUzcU1U1TaL2KYq
aptFwN9TVNov7Rc9TVNUBS9TVNoukpypqmnU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU
1TVNU1TVNU1TVNUxQBQe8ygyhKsKDKEVZCgyg+FB7VKp2qapqmpalqWpapqmqapqWpalqWqapqmq
alqWpalXqmqapqm6lqWpalrVTVJ1TVKPKlqWpah0jqmmUFmFClC5hQpQuYUKULmFClC5hQpQuYUK
ULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFCybyheNG
iyLUKOaeVLouPOcaWlpaec5xpaWlp5znGlpaWnnOcaWlpaec5xpaWlp5znGlpaWnnOcaWlpaec5x
paWlp5znGlpaWnnLQFIU+caWlpaecp5V5TfONLS0tPOVWUoUmUvzjS0tLTzlOdJr5xpaWlp5wpnR
cDdzjS0tLTznONLS0tPOc40tLS085zmNLTfWlp7znONlBpqqeyD+c5ylRaSkapas5znOtLTNvaWm
nznOFMNLS+0tPOc40tLS08VVaWlpaVZ08RKzaWlpaVUUqSBpaWlppUqVJpaWlppUqVJpaWlppUqV
JpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlp
pUqVJpaWlppUqVJpaWlqVpKqxaWmujamlVVVVpaAXaKNJW4+/WERM6PTSEIQhCEIQhCEIQhCEIQh
CJy7sxq2czJxwTGgNyjEn7iE3UDghCEIQhCESZk9ehugjdtz7wznOc5znOc5znOcy7nOc5znOc5z
nOc5znOc93Z31/W9LMVZTy5JN1LbbbbbbbbbbbbbbbbbbbbbbbYgHU2TkaN1LbdrTZts7PN7PT2N
/m222222222xmT1AjuWq7o9+HOxjGMYxjGMYxjGMYgMIxjGMYxjGMYxjGMYxjG7joX32okFR1P2o
ajKBfQvtTs2irVSgyj9FjFC1DtUUyhqhKEKEgoUIUJUdRVHURQhQhQhQdOVQlAFClClFFCFAlB9K
EKEqjyhChChKDaUCUVMoQoQoQoRqKAKOKEKE/RZJSdDcoBr0WhuUIUJthQCgKEKElsUIUJs0FFS0
WBosAoQoQoQoQoQoQoQoQoQozRahRhQhQhQhQhQhQhQhQhQlT6LCKCKEKEKEKEKEKEKEKDKFKFKK
KEKAKEKEKEKEKEKFKEKAKMKGKEKEKEKEKEKEKEKEKE0WGUcUIUIUIUIUIUIUIUIUIUZotQowoQoQ
oQoQoQoQoQoQoTRami0ihChChKBQhQlGapSJSCB4FCFCOFCFB7ertsUs05sUUUIUBotUogosowoi
pSmlaJRJRZRZRbU11FSKLKLqgovRYk2nlDRUA2ioBnG/RbJRcygN6qacKLKLquqCiyi1aanW+k2F
FlF71UUWUW2oSkaSjaUOUW20tFllEofKQ0WBRQVViCRRSlH4IN48KBasmUDt16qEDXjZLChSg8wo
OocbKq0VQDSKUbSVSgSgsxrKD46dWYhKV57eU1mVdVGIKsaJXVlU0sbJZiDKdW1VV9W1aTmZyMc2
KUbszM2nKoqtKQqmqczMbiktF2FPttWnmYgQMTE2byvMzPOiUhVzfVmZmHVVWVbTJzOZt+5SUFOZ
mZVLZSq6rqvqpvzMxBVJQVU1bE8QXhSEd2i7KQzMynDalovYpmlVWZmG36Lnq1sdPOfhSvMQtEkF
WZmZVFOlTbykqrnmZhNWtn5zMKTquiGuSDMzKqbM0VQCUnVptmZmE1ZBitBmStu7GhPMzG+qauq4
parTqnMzCd9v5mYpwpKFKrqpbMzMqpvq6rygqpQVTmYgYjq1BVbEgzMOrkDZVzfVOZmTq4pQpVtq
0nMzjh0+aLjpznOc6tc7UFDRYNSznOdGio10aizJz6JZ0pIpRWoO971RXve973vUTUgUabDTQqUF
KFPUququq6rq4peq6rquq6rquq6rKQKWq4pIpgpuq6rquq6rquq6rquq6rquq6rquq6rquq6rquq
6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6
rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6r
quq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rpqx5222ltTp06eyrYpaBBVlOnTp0c3UoNhSF
GnTp06N0uKU21op06dP2xVqRtlCnTp05UykaHKdXU6dOnztKUqVPanTp058QKH6WoKdOnTkTTp06
Z1yadOnTOudOnTpmsdOnTpxOnTp09D6dOnTJp06dPRlOnTpk06dOmTGnTp06506dOmTTp06ZNOnT
p6Mp06dNLSbadOnOyiCjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSiyjCjSjSjSjSjSjSjSjSjSj
SjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjbUvlTjY6oUbVaNFSjNtO6JyE+3biBt/bL2bO0dpN
TdSUoqnQoVp0rUuWevQoGpQVbFdmihtvV10FJ0KFDt0Gn2hSg02pQrA2pq5KhQoUKgoUFGgcpdoU
FFCVKBqKH9CgdBQ6FCualDQoKUKBvkrmuY0RLV9DzW0f51iSBrP4lW9Bo2BBaH6MIrREtWJYNGMt
cmJdKx0kGjFiV9GL6IY6MX0F2U6yBAgKbJXJrnXJhokXJrEQfA53mftt3jVOctpS7OirvQ0Kxsq+
jv8/B+QLCbP7Lo0VueamiBdY1tCzzQjZwrkVWhWYIMOhWhWYDhW5eHOkTUGiWGjK+ja2iKOjHo6N
GgNEVclY/0YjOtoiW0bXKunEmEV/WhoyGjVzX0QL6NIJlWLkrnX0eK51zW0FiYaMZyYH8TrkwNl0
aw11tBLsoUcUQOXdSlAVJUFGoygSgK5QtSc4UFIoEo4ofRYO2xRZQei0ahaFCg7aaLSUGUGUGUGo
oooUGUGUGUGooooUGUGUGUGooooUEUGUGUIooooUIUGUGUEooooUEUGUGUGooooUIUGUGUGoopsU
IUGUGUGpQ22KDKDKDKC2222KBa1Jc37VBTbfzbYKBAU2gsoFQoEoHaygSgSgSgSgSgjKBKBKCKBM
oEoIoIoF4suyFAFAK70Sg6dGi1lHVOUVc6W9GhUhRtQFAVF+SUoVA1VVsyL1VVVVVUwbyUKB2aKJ
Q9QlBFGVdyqqupVTVZSbTV5SNXFKKbIdymaVUUld928pSqCh+RZo/o6GM/lOFOFKVb5ThThStWlI
lOFOFKTKcKc3Wq6jRUqmqSkarQSvarqvq9pzPpUykaE6v3pFI1dV7fVKBvbe1XV7bSKA3pVdVNAo
7ekUjvVDZdQVLSpFKVTxoUUKZKZquqwp/KdU1bVVC1Cmavq+qKnuQKUplBlAN9VlI1fV4qzLq6qK
vqlsbaRSdUU6VXXVTfV5SNOrvzKrqkpGrKqb6pFX1c2tvW/h0CgCg6HlN6LioFBlB0KBQZQdAorR
ZeiwaBQTlChQoUKFChQoUKFChQqvRdXKFtdCg1tdDRZeiy6NBra6FBra6FBra6FBra6FBra6FBq+
gGilSaWmlSaWmlSaWmlSeOlSmglJ9BOlSJpUjqlvqopVup1TVZ0qRNKkcqSCoeoDpUqR0qRwQNyq
lKkUGUHSpFB9UKU7OlykUHSpFBlB0qRQeVQUjviAoOlSKDKDpUig1dyg6VIoMoKlSQVFLQqKojqK
otGVFUVRVFoyoqiqKotGVFUR1FUWjKiqJQIPNLorAlp/VFUKoKoqiqKoqiqKoqiqKoqiqKoqiqKo
qiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqNpVRVHO1RVFGFUVRvRqiqKj2qiqNkFUVQ1oKoqirGmq
Ko2YaoqjeqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKpqvuVXVaXa
q6ruq6rtLVSAqbv8yZzMqaVNKmlTTnMmczKmlTSppU05zJnMyppU0qaVNOc5zrlTdQVNKmic5zhr
CppU1BPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE8z9F233b0Ep1bouLHqt
q2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq
2ratq2c5zq2radOr6dW1bOc51bVtLGioqtq2c5zq2rblKVW1bOc51bVsqVLaratnOc6tq1olKrat
nOc6tq2ratnOc6tq2ratnOc6tq2ratcnPvZz7VtW1bVvVZj6Soq2ratq3MnnW3s6tq2rat7Of5Oe
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
rPdVWpal2aozatFwBu/ymCnQ04ha+UboFIaLnobVLtdQU5tja306WytRNXEDXKjUONdChQoNhSpS
yrfvNTbfffehQ2aLxubZ7Uaq5x/iDd1WfoOCjfzKUKSKSq7l9znVd+NE+9KbKRp01Jtje2VO1U51
qHBbdlPaTKyxr0BW7O7r8aM3/Fao7d5Oe0FQOPjk3mz8wzgdzuq8aiewWvXtKGi78ZQ33d3d3cb7
suJNPr169ev8f//3Mk+k/HBL09PzhTOB3O59Y1qfwWvXttEw7u7lOWt2aO7d3d3d3d3d3O7u7u7o
GOGQIWFhYWSIe////vnm2eozqjPvzJ6qpzVSsnFnSq5VSpVT2qnNVN6r9THVVhqaqa3VSVVYqp10
54qqYVXOeKqmtVJhrqpMboKqc1WDm69zVXMMoqsiy8qp1VSo6ri1roeg6X054ms6LWrwx+hsR9VX
z0FVPqqV6qUKqeULqqw5u6vqpHqpjVTUzfPFdBVfqv1Uu81V+qkN9nFVZ5ux10u3VT2qzdRQdqtq
v1VSaqR8586xVUuVWaqcOrqqSeeqnlVJlWVXKqZVUgVZVbqprVSb0jM9HPVSVVajqppVS1FFVYyO
qkXnjqpzVShQVZVeq6pquUFAqrFVP6mqmGVWYqqVKqVlz1fVaqpbq6qkWqlyrKsq6q7VTGqnJ8qp
3U1Us1U0uOKqn9ViqkarqqYVZ2qKmr6tPrI6tiqppVTDrVZqpC53VSjhqqX6qR6qbRVUg1U6qp1V
S/Vc6VU9uqm1VK9SbOaq7VTiqmlVOrmriqpxVSpVfqaqUOh+1VO6mOq5V1AqCqzFlTz1Ut1U8qpt
VTDpzc3NVTGq0aOqnlVM4qqSqqaZHVajqpDqamqyKCredc6qplQb6VU6qp1VSlzVXTVUv1Uo5VTa
qkeqkGqnUVVzpVTqql+qm1VK9VPbqamr6tqpLqsVFXVUrRPsbseM758ZqrnPuraqbVXqrMbadVOo
r56qV6qWar9VMaqa0GGNVbqt1fz1XKvfnSq9OGuzdtXaSvWru0ldq7SV2rtJXau0ldq7SV2rtJXa
u0ldq7SV2rqtVWqr1XVFW28qKr0eVFV2M0VS+nPGeqnlVO6u3Hfc8eZ0dXZQVFVjnqv1HMqsNlVi
qmNBFPc0VVN6qQOfnquVXcvSV2qrXNVYqsxdjmdTdAquM91WauvN4znjq+6DFVeqt5u7PQVUwyz5
VcyqmFRaeVUxqtZFVTLLqpxFdWN3VT3tuqwsqsR1PPz8/ar6r1V6q9VtW1bVtV6q9Veqvc/Pz8/P
V1XVdVtW1bVtV6q9Veqvc/Pz89XVdV1XVbVtW1bVS/VVqVV6q9Veqvc/Pz89XVdV1XVbVtW1bVcy
qmVX1Xauqyoqp66rVV+g6TmVXLqebXPz8/PV1XVdV1W1bVtW1Xar1V6q9z8/Pz1dV1XVdVtW1bVt
V7Kr1V6q9VlVyp5+fn56uq6rquq2ratq2q9VeqvVXufn5+erquq6rqtq2ratqvVXqr1V7n5+fnq6
rquq6ratq2rar1V6q9Ve5+fn56uq6rquq2ratq2q9VeqvVXufn5+erquq6rqtq2ratqvVXqr1V7n
5+fnq6rquq6ratq2rar1V6q9Ve5+d8/PV1WdKuquVXKqUqrnSqzVTmql+6r/PIqvqpxzZVSBVTeq
mXPV8fPVYqprdW1bVtWsxkRxPpFFV9VPqqUKqUD1U9xs1Te8qDc1W1bVtWmdV6q9niu+bmqpGPej
UF1fVTSOqnXfp2uoq80eYFHVTGrKrlAYj9zA+ZVZz1U6qqgaqpxVtW1bVtDEer+uHoGzUJ+eq88Z
1VYqDHPlV6q7VeqvXzc13fNzHPVT2qn1VPTnq/WVFWVbVTSqm9VNasqvVUrVUsVUsVbVtW1bnXLu
gx9qCqlCOh5+arMqVQYfnZ2ai5qqYGNU3h6Cred1YroKBtHidBk9nU2UB6uk5qDEaPnqu89BQGd1
XKrl8/NVYqygObDVbVlm5+ZVXTc546CLnqpyo3RG56qYcxzUTqpnF1yOz1PTnobx1PNVeqvVXqr1
83Nd3zc12c8a0a8VW1bVtW1Xqr1V6q9fNzXd1HNdnPVYqsYrugqs9rZtUEVBUKOr4uaqmVX1U8qp
nVYqu1XI6rxzYeqnNTHQXVnPcVTcVRfNVtW1bVtV6pMa6tiZz3d3VtW1A5+3TmNFQUBjZcUV0GR5
k3RxGo5NGxRVWj2yB7dyu7VX2gRdVP6qTeaoM+ZGPQaupZzUHY2XNZOHm7WqKciNMTuKLNzG1Q83
N2QpoLMzLETLurWRPYIjcdrXi4eNsGqHajVEa1cs0ca7Tq51xBDX6q3LkOQ5IbiFQ2SXJJJJJJcu
7u7v5h7u6QmfMS7r2J7gWJ/5YhEbjta8XDcbVjVjtRqyNRWRAdldp1ZuIIaqodMryvAyZw2zBriE
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
fQZVx3QUEZu8aoO0cfWLI6veVdU1fHOdciqzm5sqzKrEZzxHu8Xft06iLD1XqrVVKEDUFXRXVlBH
FVacVW9z1W+pzxXkdRVc5+NYqp1lBVZjqy6qaxVU8qv82VNWeVdVc5nz1U5q+q9VTmqmVSfKuqpj
3i7bdBQc9WG5sdVl1fHzdl26VWqmq1VsVVMaqd1U4jdVmgqpjV91U2uq3UVU9qKrlVMqryqaCq5l
VMauq2q5VTOq7Vci5lVY56Cqn1X1UzqpjEeqm2VU8qec9VMYqmq5VY5qC2aOLUXNz1U1d81AeqxV
T2gqu1WarvNVZaPVtXVfz1UzqpyeqmNBVdXPQVPfrVYqpzVYiVn5qCgqprVTmKoquR81VNKrmVU0
qp5VSrVaqtUFVqq5Qc1VirKuq2gquK7qvVWarvPVShzc1DVcfMriqaqY1Wat5uapMjVFBVTCoqv1
Uo1NVug51VdqpzVcoKCKqnFVl826qYVXOY1VMe9VyqxU97PU1ZVcqHdVMKsR+c2C6mp5lVlVznqu
dke4qrUVXVUs9fe9VOKrMWVbVYqKqeXUKqlSoquRdoqrJqCq3VTDv22jVfVnNdVyKgoKDKA+UUc1
nPmH0+3R96irI9cxtxVX6rsUeHqsVW7uPsY3XJzM9l3bii55Oh4r85pmEirvoLHrRkvOwgyQUpba
m3I5rXaIGaTEoBsuCe1YsemeUvIbBkDUrzNTblma1zIgZoUmrnDqkUiBqs5+Y2qWrqvzKqcOpjXN
HVeyqkiqmQqp1VeqplVStVT6OqmFVPKqSaqo8VBVTaqqP2oLqqgYqqXKrh6rMRlzX2PVTirr1msq
+7dCqrCOY1XVcY7q40cVBUxc/SI982ZV1XUKqzmp+BG6TnZyhA5S+dM9Qeq7jiNG+1RVcq9R1WT1
Uyqpk6rVBFQVXKrnMZ0B+eqkerqCqnR6r1BU8/Maz1XqmqmFVs0RqrMZ+agylNz1ZQK6rgqIsrVU
uVWjVU25soaGqndD2qpkqqptVU2qld89BVkeZVSvV1X1UkOgyN0Cq01TQRc1VMo6Gq5Vaq6coelW
9++XkdViKKr6irKrNViN51P3O2aKONnygXPUc1BdViq9VYqDxRVFWVWeaqkCg6Vs6UDyro46tyrK
qe1ZFU1XarZ+lA06DI4uapoLquVWPanI6DKyRqA/Nz1U7qplz9qGgqsROgvtkejGqtVXqrNRFFFQ
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
qiqmVVNaqa1U1qprVTWqmtVNaqY1W6qb1UwqptVTWqmtVNaqa1U1qprVTWqzVTOqmtVM6qa1U2qp
rVTWqmtVNaqa1UzqtVU2qplVTSqmtVNaqa1U1qprVTWqmtVuqmVVMKqZVU1qprVTWqmtVNaqa1U1
qprVtVMqiqmVVNaqa1U1qprVTWqmtVNaqYVUwqyraqa1U1qprVTiqmtVNaqcuqm1VNnVTWqmtVNa
rDw0lV+L2qm1VIFWVU/qpvVTaqnVVPKsqp4t1U3qptVTaqm3NzTlVNqqbR1U0oO55i6qd1U7PV1V
MnV89HV3tVMqqZc8dVM6qZW89iu6qZVUzcdVMqqZVYeq4eq3h7q5ZVTyqkOq6jpmqu5zZzWniqt1
bU3VZqp/VTSqmlDcdRdVvnqat56qaZVcnYqrUwaqnfNkVVnaypjiNVdqpzznq6q5VcyKq3VlVrNc
3PUxx0NX1XKmOq5OJHPVTyqntVg1TUnj56rlVyOqnLqpxVTiqrPHd1NTVc5zxVXarVXVXFlVueqw
5qsqsGoFVZuM+VXOfKrUxOxbUVVk8V89XxxVXOfKrdVk1VmO6moqx3VcxVU5T2dnUwAB////////
///0KgAlIwEAALDoub8R//////////////////////+qlDnZqtPHU1NVOKrnO6qc1U4qqz1U4upj
vnPU1XKrVXRVXVVcqtVU0VVM6rDqTx7q6q7Eaq5kdVPT+1c4qqRaqZVbzcxs5hjqKrVV+ro6r1X1
X0ZeOr6qVPObKrVRVlWVZURVZVlWVZVlWVZVlQao5jGqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyr
KsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrK
sqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKs
qyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKiJ891EdRUVFRGaqzGcxz1FRUVHP7FHz8
3SpqKioqOeZiqTLnqKioqKsqyp5ueoqKioqeY9RUVFRe4ooo6ioqKjn8q49xVFRUVCqKioqKioqK
ioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiKoqKh1qrVVi
qxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrF
ViqxVYqsVWKrFViqxVYqsVWPHRzFBVdVVOqvqux3drKrlXVXaryl9m/MquVXqvq5HPFlXVN1dV6y
LzxVXartV2q7Zke5io9quVXXVcquZV1356aq7VdN5VdquTHhzyDKrtVzIqrlVzHVSjV1V2q5Vdqu
1XarlV2q7VcquVXKrtV2q5Vdqu1XartVyq7zyGPVTK30TjakPmHjPlx5e+iE1eVHNQx81Vnzzzmq
yraqY1WKiq1FVtVNLq+qmdVM8qphVvNz1Uw5sqtVWKiqmVWZVpSratq2ratq2ratq2ratq2rKtq2
ratq2rasqyratq2ratq2ratq2ratq2ratq3KsxEudGqygyqntVPartX1U7R6uurquq6rquq6rquq
6rquq6rquq+rquq4xqmrYrZ6r9VP+aM0RnbVTUn79Oeq/VfqygqyrKsqzo7q+7qar9V+r6r9WVXK
rcVWG5qjKqZVWKtqyqxGqrRuY0Z6iqmNVjmjmpycqp7VT2qmtVMvaqe1U9qpzVbqv1U9qp7VTaKq
ntVPT1ZHVTeq1zc1W1EdQ6sqyrKk25wxqtqpAqs1WKA1W1ZVlVmqzVbiVX1ZVlWVUiVBqs5qqa1U
4NVuc3PlVMqrBjVWObVxx1WqrVRUVXJur4jc1VuqkCq7VT2Oq1VlWc1W1U97VU4qsGqt1bVbPUVb
VlWVU0qyhqzmqzmqyrKtq3mMarJuq1VZqyrTVYeqmRqGo5qtqy6rdVmqmlWVZFF3qturauq+qxqq
mtVN6rFX1fVYqsVfV9Viq3VTSqmFVir6rFViqxVYqsVWKrFViqxVYqsVWKrFViqxVtVItViqweq7
VYqsVXartViqmlVNDVWKrtV2qxVYqu1XarFViq7VdqsVWKrtV2qxVYqu1XarFViq5SVWJur8quVX
Myq5VczKrlX5mY4s5onmZnNFVtVMqtqKrFRmZkVRzVGZeZ7lWVZeZVcquZlVyqzVTSqmJsqMyq5m
VXKrmZVcqKiq3EqrmZVcquZlVxaquZlVyr8z1VXz1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/V
fqvvnq4x+bmquc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzYubmqtc3NzG5uag
mubm7Rc3Nzc3NzVWebmqsn5uarKt5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm
5qiI1RUVFRLUVFRHkccccccccccceRxxxiOOMVdV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9
X1fV9X1fV9X1fV9X1fV9X1fV+qrEVBVTyqnHPVdqvUFVIlV6q9VeqvVXqr1V6q9VeqvVXqr1V6q9
VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqryqyoqvVXqr1V7mUVV6q9VeqvXzc1V
6q9VeqvRRGVV6q9Veqve1FV6q9VeqvVXqr1V6q9VeqvVXqr1V6q9O8ClVeqvVXqr0mux6r1V6q9V
eiflV6q9VeqvLzsaq9VeqvVXopar1V6q9Veqv1XqqcVU4qpxVTi/aqcVU4qv1U4mYooooooooooo
ooooooooooooooooooooooooooooooooooooooooooriiiiii2QMo1XapWlyTLLEE20WvbPuzMzu
7szM7u7MzO7uzMzu7MrXZXV1eZnd3ZmZ3d2Zmd3dmZnd3ZmZ3d1Y+uvu3QEmhNY6YG5pnWWDla2n
a3WGuuqqqquuuuqqqquuuuqqqquuuuqqqquuuocOysdUNhw+sbVVVV111VVVV1111VVVV1111VVV
V1111VVVV114OGw4dlayOp789QHMZ1yrcPg0erOuRQcL53yNHGj3ligiqyGQoKCqzVffK6BqdFVw
1VlUFV6FVjfPAzijq+o/VOqDoYH48Ube+Oa8sdeKY812fHij3dUHQwPx4o8vjaUgNvlnd9uY7B6t
9FV2rzXR65UFBQQNlWGULquBUF1fCgP6MVndAPHQQoFQVWMzmbHPugVVgYFVfFVzZ4xVZoN0GeGN
QXQuq5QUFureuLrFz1FSDx1YFFcZ6scSoarBqrFDNe4rvaup50egdA7PVZNcMjjiq2Lm5s70HMeP
dVMFqq++uazEdZH0MoVdQnNQaiNVcNVfugoGjwqyNnqxVWKrPSgq1RRMc9XGygbobq2r6izjVSjX
zVWguuZzRWqqYbqvvWs64dYuhsjCq+q6KrFWXVz1h6qccx9xwiqVFVpubq90F0MF0qarFQYVXKuq
sShb3VwoMO+SPVAsVqgqoCKfY7ugoOInzxMzPxI4o6CgviGP7h75uI6s56Cg4nSgVB2PUcRZOdLM
+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
Pd5fnV9kifRyKyxUDH5vEBPicH0PuU8A+TgTvhl82MJacY/U93l+dVifRyKyxWY/AXigAAAAAAAA
AAAAAAAAAAAAAAAAPe973gAAAAAAAAABiIZIWYW4ZYZYZYZYY4Z4YIdYcYZwbDxDPDJDdDxDLDHD
DDiDYeIYIdYbIZ4YYcYeIZoboW4YoY4eoYocIZYW4doZIXIZYZ4Y4XIZYWoZIcIZIZYY4ZIW4a4Z
IdoY4Y4cYcYYIcYW4Y4WoZIcIb4aIdoYIY4Y4XYXYbIbIZoZIcYcYeodoY4Y4cYcYd4W4cYeIcIc
YdoY4bIc4a4bIbIboYoY4ZoXYYIdoZYZ4bYXIZoY4XIcYYYZYZobIYYc4YYWwbDIDYY4ZIY4YoYo
aIXoY4boYoX4Zoc4X4ZobYZoXYY4Z4YoXIbIY4Z4WoY4Y4eIbIX4XYZYXYbIcYZ4YocIZoaId4a4
W4bIWoXYa4Z4a5ATzdhhhrhzh2hfhrhwhihmhbhoh2k9NyQknBRpHJZ8uCSeF5JCSMkOCJApYTIL
IyfKkSh4hnhthnh6h6h4hvhhhjhxhihbhch4hchohnh2hkhyhyhohbhrhkhchchnh2hbhnhbhoh4
h2hghrh4hjhrh2hnhvhjAsPUMkNELsMEO0McO8M8McO8O0PENELkMUMUPEMcLULkNkMkMcNkLkM8
McM8O0MUL0McMcPELkMcM8OMMcNkMUNMMkO0M0MUMUMsO8OMMEM8LULkMkMkLkLkLkLsLcM8JoAh
PhJBEJoPAcJrxCTCaDgBCcCIToSYT4VQPCdCaAgUAITwSAAABQZCrCTCuC4UwODIVAKBwECIUwID
QaCAAAgMAQQDgICYUQZCeCAAAwMDASBAHCoCISQCAIVACCQTCeCQABwYAAPCkDAUDgGCwIB4TYUo
TYUgBCaAITQBCSAAXCTCSBQQAAGCAAAAGCAYBwOAAYDITQIBAAAAcAIUoUITQADIVwWDAZCcBASA
AZCjCxCbwGwpwkgCFIAggCAmE2FGE8CAgAACE0CggCA4DgiEkCgAHAEGg8DAgCQmwqA8AASFYGgE
EAwEAcEQngwGQpACFcCAsEBGZxl7VAjJ7PQ5c5/9Bh4JUE6VRadLMZ5qAzo+89g/ZURGWoE1AgqF
VQUqAjpCoAVC2a50qiNUKqhdQYmwoM1REdL0cucUAW86j2NY0jUxmTOo9snjFASaxunsqJTqUAWM
+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
mKLK29u9l7AqJ0zdt7DpmdlHc7fwoYUTqTOLU7bPLamja2tK86JkKPIWkdsxbUs+3uZM859RvveF
zkHZ7R2t5eFHxtYznLFcEffCGKdja/vxOfH18zQipKtohJZfYTPsiV4ccbic1A1997+fb4ThM1Zj
OL6Bd000WIxkm9wb0aMZ6qaaQJs1Cb6R/2PpRhlYE8NM+BT9khanD58k17w1Y07czVs2rzpNu7fH
GXr3M9q8a7Z16VBM9/bq+epFuo1+HY3O9GSIhtC2JS2Zgpq3LB6lKHEZmoBqJ41kbuoPX6tu7j8W
0/jYjGx391Cd3nC7pCfGihnToaO2Zmzf4KhakhemK/cm0Wa7M5t2ZwPGYzWEtGPiJ7Kxt4lcSPY6
g7oyyYc9zfYlt1z46TI+Zzbzla9V2PXA9onl9vVP2zKea9E/m4bXfXv3x0uNxq//jetarN30NavU
W3j/vpHh8rqtqG254mIsXwfrao9n/ixmT9I+DfWP/mOEo96m1WSjTe1wrSG7mibJXGQw/5Fq9bNp
nBuc6tzaBXtOte3SMLHPuDc6b11HVzsbQZpVpkawa+Fk+smkm2MAHqVoqBmME/OZ1J3qm8pxNjw8
moZShQ3twbu2+q1tHnaXpKx9f/0c0ddnY/O5yf5BKnHgVkv6Zn8MI/8Vy7bMz4aMJw23fVzC4/Ag
Tmczujq82s2Hka92a3JR+cSixGYmvzTyaK39icVI7iqXxux/me9TPHVJy79mbjajpRmavFner87L
6hEOc/xaMm7hXvWvDvvuenMwN8VM1TJhHy6qLImET4beTxarXM+Zq482zpOVTGuHW/r/lDFizdbp
VYt1kG5J+dSCi6yWiZyxqQkeN4aOn7rnQuLWXhnHklzt81aO44OIC5Vb4BYBHnUYdUkRdAipSO6l
OCvE7Yv7d34fzDGpHq9RIbi3t/qff7ZVZNWha/uV9f6tqJmCnnuqDIcrc2u1822/fIh6hRNWKdaU
v2ybfp7fLKuxf2kMx/g08qWREN245/omfUrt9ZOJ+mJMxcjtRCbr1pyx82X3BFfZjYM44ieztGR9
PqhRQ91O7W/Q/JWOz1MeexKmIc7Xhln6W3zODTmLmY7cpE2LupztYTrM6JXE1LCuvT6tUywLo2G1
XIyIqZuHP4lePaqL4tdpvh/Nt02P+rT/8v3yZL/66I8yj4ybTMdeMK87yCbzeOwelehoaQJ0yyOZ
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
8taylp4iuftbgMOQeLyLG5pmR1bYuGjJP+2k3Rya+Mqa8dWTivj766OFc6Nf7W41bdJvHNq7Fu4c
qlr/YOv5Wni4anM3ksrt1FgXr9PFNvRB4pY0b6RlAx6laKiUoRPDUyBzJ1e9t5UPDuaC+qy83Nu9
Wcf8qp9JOnUrOjn28lqPmi+Knv+tLtdmy+EZHtrq7nUNZTNSIn+tawvbvcZqgS2514oM9x/PX6Vl
mtuTlXVLn/yY+8dJ01P9bGSbOqlnm808Cw011dVJyx8uPq/7zRpqNW1f3ea+/2P5E81tbkfWMkpb
dtWQbjZ/DZarWq1C61nr1cn4Gw1Nk3QeotSL5FtyY39I2qzH7zGG4wafON76xs10s0HcBZtLr49H
+4j2xaZa+8z+PHA6X3OI10nNri1Z8kkn1ax+rAoepShxPaFKaFFcdm6bX9xc6/2yddEV3ENJMb/1
vTg8OPGffV8f1w++/FHnjbv6otM8OJ7bpWbaG2ue9I5c5LzTUiIXnS+vVj4Owy45JtvTw/0U41yS
tW8Wd4NPW/NWCSMen8F2hO0VY+P7qoah1+qZY57n1DyXbYRg25apTiOL4i6svqnDQ+ljr9Xs/fNe
xkppiRmaZR5Ntx5XNfdm+poN0eRHENkTnQwfPOpYBy/a72ib9vOSRusyZD7af7fVMsOLBiwaz7l+
4pzbbcCqfRcHk2ZUrTbdYFyTKXRKdT/edqOyYx7VGGkSAzq8SNzM15K8yYPP+bzq06nbq7pqbVsa
EjV9X4j3LscS67nz8S+2iWpzpnmu7yBy7Df5qx3fxzx/awh7+6cjPI6N2TQSx2aMRNfl6MP+KvHd
QcTf7CWeGT6UKY9TFuNweJkwznaLkQpXt5+jzvjKtmrK+O1i6L45z3FIMl+Z/nWcaKTOv7U1um20
CdPNg4P+7PU03m66Xb+v1I+vZ1fcoW82yHJomCv1Op+nnO3SDfNY1bmFSFnXtLU8G5B+bflOMhmI
Ho8/lfG8PfFvb8bBbo3aGRT1wZmu2ZwEH3RTVL2qFAWxAB6VaLwZnE4dJMvMLedzZ+emg/Nv4+cn
sdXVITiZkLs7c959Vq9HJwY08tRkEiey9OVErKPdzvlZsp2nXi++ntBoSok/9LcsU23za/tr+eRy
KANDbgf2rcdLlVJS0yNLzkZiKvjjr0qkuJWlQ/KEtHRyPONMkHGU27WamR9601WeHd0h2ab1RLv5
xhi059ftGNqMaWVTZkbQXqbr7kvX9tvg3JtvUavblchBJPplN6w2atgtH1x+9JCZ21z+u13R737P
RC9rhW8di6T5B7nG/VKfrX08fTOvixbVJYQpfkkczGv1CP60WGxpkadqQhxr9JYdj6a6+q6tHtG3
j7bag7dnLzXopcYaP13l3OF0daqm5Ytk2nqc8ZL4+VXMiaRffaFjG7EYqXTWSbl4rZ1r/MNuQ5Jw
JG52rKmR/memfyLO/s6W9VxrvBAh6me51Jt5qq9gPeJj8v34PZewv5rV5siJQ273KdNg8ve2raaY
Z27fx8L5OfuZuHNZUyuNJEYerKIbe60mP7XbtyhbhyFuSU2r8P46W4xbKcbEdd5q6F5ut9lMSE2G
E49uNHjy5HfsPLpZdpgeX9Y/+k+8HjaNljUjD9Z53BK0U61k69ZZAR6lSFAnFoJuqohktv71d5WF
35YOHrzLidPj79LD0U+4de6e7J1JsKb1vr023N+3TOdge7Zvb1EYYI23W1hZ1OJq9wk1Jjmd0SbE
J9Mbesl0c+qXMWaHnvroFF5X/IhN5TdGs4wtzQSmvuoXaWbrw/WI1Wi0N9s5bGO1tYaYhrw9v2QS
0xi9Wd4f9+iDaqZ/TPbjZpdwbRqRt/cLprlYo06itvi1NUkk20eUiB9XBN92ixuPxj5xkpodHg60
Pj+RYHTWztm1Xyf2pu0Yu6QuxJl0VTfOnVnYwUg3GnNJ6/jgyzhuRI1heqKqHpXY+NSDiG5XEBzc
nfqxnOavZ8X7Z2etLq9QXdI/p6uEY8rWdPuTCUnd1j21uyRG7pzpbPdvrq0henrZf1DtRtru2Ujq
SFr0NME2O3dmq5otD5ebKZ5dbU9Z6s1Mr2/bdF2x7W+xvwLDhi9G8w1t0xQzu4vNYlvH/fSvZbst
bU6fhKGPW56MHHxQptNhz5w3GM8n2W83O2anNR/myfAtixpGmboxBOLaPpX12Pp+r3TV5LaVGyOe
m7P45pqFlU5+Ufvft4Zzf/oLz5/+/ac3EhIz+AtzF4n4da/JWPTIp7dRH2qTmsw8AB6F2Og4KVHV
dsdaObfZvl0woNLa20MoUV18sz1a8Ebn1Pb0duWsspzzDeyZp1vuZk1cs0/UsL5H58lxa6wlfNFM
nW+zn8+Iaxn7nZmnDW2CizzX8mik+dtyscvJkqkj05JR+6vSHONmH/bs3vTfv1r21tSZ3Fl8GE2f
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
GqiiQFHdGV3fno7Lz8/VVWf3u6qqgre7+szYPt/a58r3+qLu10fHZ+fkzDPb1cCd6iBJ2cY9l3pR
bj929oKcia0x+55x93EZDOnTz1/Vrx3tTqep44866tmYsUg+WC7X95BImM39bib78qTullezW+qd
Gs4WU3NgGTHN9pimxpPMvN6GcyaWh+vczyl/PeZomsSEQcM2jySnMuhw09qGOpJ+3b5dXkpt3hH9
EpqP5aRRronXb9us5/rDO/vjcWfpE+My9sdpbom9sdSvGLi09Z5hWW+fbPOXKVOuSWhbTZNq2QQe
pWi4RQIVRNKZm2v1/Dx+0fFwGg6o7lDu7dX2Ys36u66iT6asTW70//1BjkmmuZvVzrWeDWfW89Wj
rckaue2LvsuOdG1hYIhGOi/GZqR85a+nlRkzjhKT8WjASDsb0ct9b1J2CzG95La1duz56NtmKBPD
Os+TzWYsNT0bl3+Ozf48B6sRLXqc/f+v8P3LfPgoYR7btnH40tzl68swBttgbiQtvH/VrGWZLW/m
ubX0vBmZFYx0Gs3Dk85STbEM6xOntkoa0YSduKduij9R1zaj3ezjP9a/f7CYdOvveanZsQ9GP6aB
PxNuAh51WHSpADWUZLbPt/lRPbu9vL3auBW/ng8KnPfg3e60drG5fkVreTgP23vHZ3OpPhr84YLN
o9g+M0G29I59UM3db+3v9bLUxbtnB6fr9DVTdsqwpvXy1q+bZ70xzo5Hlq61ncRo1pAal/clZ9v1
aI+H3rJzer65+W6dzCX82Mer8GW4L2WUdae+OV3SyZOwqfPRm9nK0qqN2Maum1kxPqRy2oKnMlzP
+bw3z4ftw1ZOpq+pHET1xmM5PWb224WunoljszZ2zd4nniVPrVkOB6av7qWvD9mP6jOZMpofHmbd
0yXWEYzTnwZPZ2dTAACA7AMAAAAAALeRuwodAAAAcR4kmhLl6ujo5urp5uHx5O3n6urk6OkelRho
BiC2s5Da+rdrvt7FNd3u3qVquFmdPeObnbmIy9VTt5c9PrQTvbF053uWleqLTUtbXVsOIuX4qxzt
xfqJtx61Y8zUz+J8MZ9Z0vvuWsobm6/PmUWC3QFOaudqNa2x3Vp1eGbGKy47N5IBUeMKxku0qPzs
tNparIfa5UdlrMRcrcZvkv/ejfPW8Z4d2XuySkfH7eH5Jf1iSmMe2x8kJEc1Dfl7UqWZ1tuUiNrm
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
ybBrKPGquESZRuMa0iQcaLOrYX42ngTDt1V67mZ/T493dZjGZV19u0m89LP2WCxtsbwNL76WTsqX
yVHq9hJZXfah7a2u+bKth5ssnUZVc34ZczF15mEn5V3xTammspxEdwlRLIkCHpWYdREQUCEwyHtp
P/u5mK8Uq1Wd5lYQVPBQ7TGMlfSsfFX6H/Ph2ZGj0xrdYm3vbBngGxqc6mUx6+79DR81pg/TjdpX
0yUhW9Hzuzn05PExzPF3huTqBWOfSk5uiYx715R1g82JfyLFtsib75br5TRp6m2Pn/WjtyQzs8eW
+hu/Zup0nN5iJh/W5G4enPUlBLPBtDpJJXEa007cK2ekpBmJVlWroCiVDnGrr8tqEtk90JJK5+9H
v5mw9GDa8JSINeZ30WO2/dPfJu/N+hGvuN7/fF19Gm/MutvKWAHt2y7n13D6AR6lWGSRmhCb0kjd
mfFw/HjeHzEN9dMnc6jgofNpNqftrXxkrrCP1C+953rznXJsm+3rFYt+wfa0rRkZTvd3yzzttsu6
f1epzXO7pTldiUtLN3twsutmnWXKyjqVpnflsPOuNfznrtnBuqZHxp+t0eXJFI3xa1glw7oP+WYk
ZTfsR7N97BnofLA11/unEEdvNo1rWW+LstKrI7fECPnZDF7vNW2MPduXXKRtB5KnveyKXTcVifVp
bi0697vneWCz7qyxci6t70X8nH9Zz2fjqp8abT7zxE6S5rLVRFa7AoJr22Zfyy15PB6VWMviMLrX
Vk4idUpfdGMwW3AU2jt455/5g/rbM4vnvtLpT93C4TP1oEqz2h6IqrnOeSqewNhZYmxjTzP+wr69
OMRa6dRwcBQ3/W5iONB98qBNDXEMQ2rrybZqNS205+Z7Lif9LPfV+IK/yW5k4aZdcyHSn5R+2I3n
Yic9a+2Wtbp0QIuT7byemzYBXUZ994nHuHlcpvPOgzpNNj0e7J/qM3HVX2/9+jQbocc5FX8Jm34t
jOn62Yu1M9dHXULMikQba+zlJdIcx8XRb2IGfPjR8yG6GJswplKTjuTP+bYqQNA/jQ8bHoWYZRkA
uuVG3m1Nl4e3g2vp8VkPL6euELzqjVr41rbr1ybsw7rcMU51H4d3mY1+o9uOXrohflu2DgivBvTi
mwOW9Pud7hdOdnMvUhfrz9TMY7BOLoTo4NXuxPaY0bwg/ef8PqqrkfOjZ0dlizXyfpHZz8NK0jlz
ZRuz5UB39WwzeT92czzXXdvStl39ePA8zY8RxuN8YsO1m2EtTnLUh71DH+3m8HCd2+7C7Z8/3Tvm
bIrLdusg1mhTEyNjrrqKNUmcdC+88+nfq/lk3RPj4+HLPR0ZEkhNn0mzMzOiTYsxTU44paW6dxPp
+1sLHqVopDUtE6EpPnbuTrrO00XXa3U9Pq+uEHxAOia5ZNn2a8P8P3fwN4/cyCbpbcl0T2ZQXRw6
YjtgSfvm6mytf+dvXbjRvDVL7n8SL7bsTnoba3o1LQ0ZTpoHbXFLnzFbLYRJG0a/Q5Ncj7JbEJW3
H/tbpo1VhjK9XV7Nn5NVfyXnNhj//b7U85POxBhTZqe6G3Zjd7dIqqz77TWXdZjTK0ecPl2NR08t
u5OpitWJocahMr9sf66ovrG19SJO07YFGbxs+mLWNCOuacYOp8Um46c1uBmz3xY337b4NdGzYZZj
0wQt9HQEBx6VWHsfhwq6p7BUSd2ZdaGkizcuvbA4VV0udHvwUN5X3WJ0Zz0Zlda3+NJti5473ZK2
5M5Qsq40Zi0hO71sfeu26Np+6KM8WZuS57J4h3b3IPTMjh1raVORcTKar4022puOa82gISQ77gNS
vvWptLZw7HHsz7G3XsuwZrzMKaPhEX2OD68ln9m6+Zxnuxlks/a7UpFYv+Yiu9vix54Rk8xVdkVf
lm0yLjKjq/f7T6fUNz4yXv9oVzOG/FB7zambV9he5X+fE7nteP97+n9snc3sNmwfDxr6zkN5fc9w
c8rWxIsaG5bROGnTtjdiXHMDHpXoaLMUKqpms3j4dvbKrnfvUmv34OVNg6HWl7PZ5/zIvebrN55r
m+3t20+fbc4/1N3o4TTdxfFBgxtbLb/PL09Ybk+blJMWt+5JxR7zrzpTO9a16JO5p+P2NRTG2TOo
uudplthqWr8svurp/Gj/uK1jmTxu4fr6i3puRje+6XNi8x63JHOh7OY+aRqGtgX2uRjz/bfWrDa5
WLJVzfn8qL5LGd1I+mDsvNmcj4eKz21V55g9ZtPRzV191ZlYU7bLWfTq0dupmWfjbI/TT+/7v9sQ
1u5X6CO2yaFHzIzqaSR07fLwMjYedVh0iQg6tIipvlvK8deH+dHxpYr5YitU+QZi1Pf4mr5vW22P
cTM5o709vSq0dtDYf12f7C+Knty938iunrArCTxONzC6qH+x2bWze1v02rxr0Y1edDr6XpP1LYtd
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
SCMuy8aK2cFKx3DuWyalWcFKuH4BcO7goRUnHd/rUN4DsqEyn+nQhiCLiogoKlWcFKQUFBQVKs4K
UgoKCgqVZwUpBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQVKs4KUgoKCgqVZwU
pBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQVKs4KUgoKCgqVZwUpBQUFBUqzgp
SCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQVKs4KUgoKCgqVZwUpBQUFBUqzgpSCgoKCpVnBS
kFBQUFSrOClIKCgoKlWcFKQUFBQVKs4KUgoKCgqVZwUpBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOCl
IKCgoKlWcFKQUFBQVKs4KUgoKCgqVZwUpBQUFBUqzgpX8n0Eju//7v9N/+n0nLu//7v9N/+n0nLu
//7v9N/+n0nLu//7v9N/+n0nLu//7v9N/+n0nLu//7v9N/+n0nLu//7v9N/+n0nLu//7v9N/+n0G
wyO3mG8/3l2+B3xPFG+ALWnC13v7sN8Ovf78hXvda04Wu+ETZgvh18HWUvfy1pwtd8NcJXxC98CW
G+GrWnC13wjQTvit8gQMN8GWtOFrvgoeJ3vq+JK++RLWnC13xTFG+E3wVlXwVa04Wu+BvyffB75D
Owje7FrTha736Q3fIb5Fvr5EtacLXfIm++R3yFvvkC1pwtd8gsv3yG+Q+18fWtOFrvj1gxvjt8e7
74+tacLXfH/3fH74/R6+PrWnC13yC3r4/fIKdiXyBa04Wu+P998fvkEGvj61pwtd8fb75DfIfjfH
1rTha75Bvr4/fH/++QLWnC13x+LXx++PpDXx5a04Wu+P76+PXyHbXyFa04Wu+QUrEvkF8i7r5Eta
cLXfI7FSr5FfItxvkS1pwtd8h/d8ivkXNfIVrTha75H8b5DfBFXPc+tacSIuYM2KUk+gm3oy9Mpr
0zembOV6ZvTKa9M3pmzlemb0ymvTN6Zs5Xpm9Mpr0zembOV6ZvTNvXo69Kf/d/pv+9M3plNemb0z
ZyvTN6ZTXpm9M2cr0zemU16ZvTNnK9M3plNemb0zZyvTN6ZTXpm9M2cr0zemU16ZvTNnK9M3plNe
mb0ynN56vQl5+vLd57vEc73oOZgNeXADOGs2iyefTSJHJVgN1nJmvC65CFAOqoePE9DwFgUMw3MO
jbyBZ7C8M4iZoFECuzoFr7gzoskfASIlMlQUAnVaiF4KxZhuSJ+UTNansJnrAImCWgQPYjuQBmrQ
FGn4/gexzUvHeEQIY0JTTJ2Hf9uHNRjva4WWjtB3+6e+b+ggw6Ktrs+hSsBujuNPv/ei2huj/f3d
7cr2hHdgenn/7ZM2EXoWEkx7o/1DrP7A7ub+sRre7t93Uu/vSt9vu2nvYnJ78tkpI719Z9zdYn90
G63t93dY3fYH7jGl27P2hyR9iRi3t2jLV1jWN6fHvb4pHWX+37fqpvanuP9ukzf3UUr/+O/6G7o5
dFLozuF0ZNZNIrehiT6CRebL0nqgICBrqnV6TvSd6TvSdnS9J3pO9J3pOzpek70nek70nZ0vSd6T
vSd6Ts6Xoy9H3pO9J2dL0nek70nek7Ol6TvSd6TvSdnS9J3pO9J3pOzpek70nek70nZ0vSd6TvSd
6Ts6XpO9J3pO9J2dL0nek7yTeSbOhxn37Om382ezocyZ3rOjbtes6PVvV2dHnnnrOjz1b1nR5+t6
zpW889Z0eefes6V1vV2dHnnq7Ojz0l6L0VU0bG9u9Pw6Hb77fb+6h9G3v6y2T7fsdrG/rE5fL31K
hzJVL7Got6U39vqaJ1kawIpXt9iNS/aevWx9v/u5uZu+nH/7vjTSodvrP2+Kqfeun39FB7vawkP+
pN0O+j9iM0dt+kLmZczbmf/3OkqD4i6AgYcKfQSEDXVAQEDXVPoxGkeq00jH+5tr/o0Os+Tyo9b1
tkp0vp83/ybmSqfWJZGsFI6m39/fRT+KNFPdvsnduwe61lMn5WNRj7d8f6P0OsSxO+ybjtm6lyfK
X96fJNJt9YXNFqXx2v/799vus+T+qPN/b5J3yfBK6n1HfJHeq5lXM25m/u5mIGHCgICBhwp9BIQN
dUBAQNdU+i+XAcheCQ28M3iJOtGjppo0e/kprC72s/Skj6fdyfnyfw32Sn2277W5voUO3H+t5PlL
7P6NH+76PJVvfYHr3GxOsaP/GDf1NvsDceawaHUo2pHWM3/YnWTvb7BTzoUbFsSwENBT26y0aNid
tv3/Ro7j6R7RsRDamlUqMes/6yeq5lXMy5lw+5lIGHCgICBhwp9BIQNdUBAQNdU+i8XgaRLOgDaT
JSC6gEZXm5hPOSyQ5Tm3CAlIR7NJY8nl3TKLJ4dtrJTtsndR5NZOZE9rB6y2LvuS/+lSj3pH0kiK
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
ixQhixQs4QxYoQxYoWcIYsUISncjoWcIXHW46whcebiVCzhC49XGmELj3cf4WcIXHu4ywhcgbjvC
zhC49XGCELkFcgIWcIXHW4awhixQs4QxYoQxYoWcIYsUIYsULOEMWKEMWKFnCGLFCGLFCzhDFihD
FihZwhixQhixQs4QxYoQxYoWcIYsUIYitVnCqQrilCFw8kSFnCFw8AlbkK4cenFxJuStyFuIdxWu
MtxhuQ+972zMzMzb3ve972zMzMzb3ve972zM3LQECCDD173hzVRaMd6N/oDql9izNGOm39NCPDQw
89ADC4f/+3czdzf////7dzN3N/////t3M3c3////+3czdzf////7dzN3N/////t3M3c3////+3cz
dzf////7dzN3N/////t3M3c3//g4zLFwxkDGDmNHRKTrgOOzDeMiO8Bdze3HN7cwYN73vBgc3txz
e3MGDe97wYHN7cc3tzBg3ve8GBze3HN7cwYN73vBgc3txze3MGDe97wYHN7cc3tzBg3ve8GBze3H
N7cwYN73vBgc3txze3MGDe97wYHN7cc3twWmIgwWBm63N7cc3twHkOZSePUCmRze3HN7cPYhACO4
CAG5vbjm9ubWZxkzki53N7cc3tzFNQQ8ldKZBze3HN7cwYN73vBgc3txze3MGDe97wYHN7cc3tzB
g3ve8GAo8fCiVepLBg3ve8GDyBEwBV8SwYN73vBgBTdWoQvXeDBve94MBKtsRHVBdwYN73vBgKPA
ZzIT25gwb3veDA5vbjm9oLYNkF1VRQd7qwb3AXxEC+sPDMG9wq3vHJ4yAHtbiwEgY9vYp299GO97
3GPb33b30Y73vcY9vfdvfRjve9xj299299GO973GPb33b30Y73tox7e+7e+jHv/4x7e+7e+jH//4
x7e+7e+jH//4x7e+7e+jH//4x7e+7e+jH//4x7e+7e+jH//4x7e+7e+jH//4x7e+7cEmMf//jrgr
cyJCsxLXv//Wxwizqu0NRj/zWQqJsbY19OsrUsU34xg+sDjjreh5/W9atW48MdbU2HgYzxDsbtX2
reWHoY07H2oYyQY61atq3JBjrY+FhjJBjwt62oYyfd8LcYyQY62PoaTDHD4+1DGSDHWya2oYyQY6
2rVq4yQerY+1DGTahJZtMgTITJ4BCYAC1jUzczcbX71+LdaLcsLrR9U59Wq22n4kltMyXM3TVzdr
dNDW18k2x8s02E280lpvVvMaMdDmMGOYQGOYwYxjmMGMY5jBjGOYwYxjmMGMY5jBjGOYwYxjmMGM
Y5jBjGOYwYxjmMGMY5jBjGOYwYxjmM4xjmMGMY5jBjGOYwY5gPFWBUniJiog8RMVEHiJiog8RMVE
HiJiog8QTz1+W0rBPqm8pmlWuUktyzT8+sNu/UdvJL04qFTOW9YpxaMs02RIpt0tqUrNbLXOzZrJ
PklrZNCtTb8f0zkkM6p/6pguIJIjQqY+b4gkZHxVev45JEcVGCxhnZyTxX8Iya7CSIrn/9RBIpg6
oVBLLMAET2zKhUKjYm22mM22mM22mM22mM22mM22mMeWmTGPKpmO3UzGep7TGPtpjNs5MyMeFn0e
vvRXofrfUP+vXr+vor1vQqihn8Un/7cv1x/pP8qCvSo2wO0wAQqjZUKhUbTAGAt/kt1RFaC4t3lm
t46jVoOV9xaAjg7g8/9euGUEl8M5/W9iBL/+VFcaoVGwO0wAQqjZUKhUbTAGBLPWhuvLLetU2Y3t
G/++iuVSPXqHgqvu8V69b140G9vX31PGk9eBrkqh4OqFRsDtMAEKo2VCoVG0wBgQwGFjU3z/7lwC
Gbi3qK9b1GJOD6bTxCe06PBi9t3/Pz9UKitSoycDtMAEKo2VCoVG0wBgMZXdkfi9c/itu9RqFx1A
2s0R+/VDiDP5O8P2QqLnP65J8SKjQffJB2mACFUbKhUKjaYAwGM1djAdXFweeD/76tFeMEV/3ivX
DPW9f+vvvXPj8FUKit1QqMSbE20wyqNlQqFRtMAYDLSxUuqJ6e22VKiFSqY/22VKp27P1TDVTtnz
1tP8YzjzqlU7bDON/W3dU5Rtj74kkpuDAzg4l8wiqNlQqFRtMAYH44iRUPHp35LwefioVfcVfjvS
3ofbSrctM7btJMh3lsW59a4hYq2mK2Pr9vYdZppr1MWmfnLdNGwV6mzdTxLsfYlVGyoVCo2mAMBU
Nl37H9cr4rcorVhV96VOKVKpKKVJ9963nO+PiW9LWPsfSV5STH2Pp22WmfJMfY+mIx9j4kVGbNXa
pnN1g62qYvTREl69ClTEKVMXrxJevQpUxClTF68SXr0KVMQpUxevEl69ClTEKbz37xJOSS0tFo2U
qIgkhQyelZCnG+oJLRapLfbpIUqYvXiS9ehSpiFKmL14kvXoUqYi+pi9eJL16FM9EKVMXrxJOXoU
qe1rvenCTzjJ9+tE1Sxa2Ted9jiOIRxH22OI4hHEfbfUI4hHFsSbCOIRxbEmwjiEcWxJsI4hVq2J
Nq2PtWx5vHVE0d5RV6fb6LWuZABLLr+uVQqLJC6eOqK9csslL5xSs3LLO3fMr0I4v4NRReeK9f0W
WSFl+vtG/xIWXX9eoeiyQsvRvX9Flk3qHVHrllkhZdeuKmSkxZcPz+uWWSBtCqH9eiyyQsvnFvGx
ZIX/uf16LJA0NeOk/ty05k1M2tsZap08l+9LaL87bPad83C/yw29v4Ki3zPky+ABKZFmlm49ecJP
/Wha1lmiW6flPgitMUEBAQETGE9nZ1MAAf//////////9CoAJSoBAAA6AxsUEf//////////////
////////EBAQKYwICAgImMCAgICJjAgICAiYwICAgImMCAgICJjAgICAiYwICAgImMCAgICJjAgI
CAiYwICAgImMCAgICJjAgICAiYwICAgImMCAgICJjAgICAiYwICAgImMCAgICJjAgImA8Va1Sd3m
Kdzu8xT47XmKdzu8xTud3mKdzu5L+ty3qbSsU/4ts1C2qf/1pWW322123NnfPb/+9OMvqFpWORbH
Webj/+2rVftNtmjttqnJuFkt3/9piaRbr89nbT1//s6pc+fVv/8/2bmKK2//2323fbf/7OGGk/cJ
1f/ifYt0ugvb//bfVn1bf/3sf787yDmACGLX1QqFR+Tf/zGf+Y2P/MZ//MZ//MZ/aVExukUTGSNb
5jGRebMYokl8xnj+Y30wma/oTrfGwOoRyq20YIx9WPtW2rfcdN+xef59q59WFtUZ2Kgut1R+D/pg
AgVH6oVCo/mAMCbZ1Fv7v61a3RPTIOPiTVtqx+9fbV9hbVj6sXsLatMRsPc/VCo/BVETABCqP1Qq
FR/MAYFsWi1NrrCotE2me0Pqx8fH+rVq27/VtW1bdz5CT6tWr6sfY+VHx1QqPwfEwAQqj9UKhUfz
AGA716e1qVIO+JNybTEY7kmoM6S9QZz/C2xIXq2OqFRXyo6o4P8wAQqj9UKhUfzAGA7gu9auSbc+
JeC4ufbV8a59T7b561atvq59991QqNsqP+D/MAEKo/VCoVH8wBgPgXeYj7fCrVj7vMRsOt8Sb4k1
bfVvqf7bqhUas6o8A/zABCqP1QqFR/MAYDbbL2Ki9OR//K6pVLuqf48f/Z1T28K/iIj/2q+WGnDf
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
xBp5Xozv10dHR0dH0Z5g5Hoz2Db0dHR0dB+efRitGJUCXR0bujo6Og51RB0fXvz8y9HR0dHR0dHR
hsFnDv/DawPR0dHR0dHR0GIoAPQxjp6OhUAdHR0dHR0dHR0dGDwxiYXT0dHRHR0HCcp79BxKC1Ko
LVBaoLUp5XN0KjxVkKs/o6Ojo6Ojo6IWR0dHR0dHR0dHR0dHQssviOjo6Ojo6Ojo6Ojo6LtNZ0dH
R0dHR0dHR0dHQSOjo6Ojo6Ojo6Ojo6EeBgGZ/9HQZBhZnOdHQjMZi9dHR0dHR0dHRe50dHR0dHR0
dF7nR0dHR0dHR0XudHR0dHR0dHRe50dHR0dHR0dF7nR0dHR0dHR0XudHR0dHR0dHRe50dHR0dHR0
dF7nR0dHR0dHR0JVBalUFqgQmVI3R0EoCujo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Og9Pbo6M4e/R0Hpo6OjoVB3R0bN
HR0avzo6DWNvo6MOcHR0aR6OjG9HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR9B6M9juh9uX6BwPz0dAPYCq76OhVWqp5Uhd
HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0F0ctD0dHR0dDuDofo6PP4
r0dHBdHRXZ0dHR0YNumTo56P/o6OjoOHP9HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dFD
/3GzNv3ZXOfvR0dGwjA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Dxys51dHR0dHR0dHR0dH
R0fWIzPHR0dHR0dHR0dHR0dAmV7GD0dHR0dHR0dHR0dHQY6gWNDLdHR0dHR0dHR0dHR0ew9HR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0Zjo6AYPo6Mb0dH
R0dHR0dBj6ejYd32DM9HR0dHR0dHRu8ugz81tYzo6Ojo6Ojo6M/0dH/59Hj0dHR0dHR0dGB6OgxO
jo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj46OjO9HR0dHR0dHR0dHR0c/2XMH66JOjo6Ojo6Ojo8Oj3MFUh9H
Qe3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dED0dHR0dA9AegGlnQzop0dHR0dHQ78/fiPhx0d
HR0Zq9/So0BDwx14H3Q7S+ui66n30KCH9dP6S0Uh11111brrt11113fp/XT+sF+n9dP6J/XXXXXX
XXXVunXfXXXRP66f9Ke1RzDhdfr+kNqChWDQH941XeX+BUZDLKX1046QzehkLX8IdsECBAgQIECB
AgQIECBAgQIECBAjgRY23ECN1CAIjTc2wTfdcR4fO2N4BHFACd9BEf8sZ0vXofVNggQgIEdv77eI
QEYyIeamN4H4EvvtIw4x0911332/H3GdT9Wp9IQpFIpGOAFyqr1VXusYwIYUMD3D+kvvHT1jOHw8
MHj4TMzSEKRSKQhT6bzsVUS1/nCl4H4ccSwoePi/x8ZmZpCFIpFIQ8vX6/3qaix0ddY1CHbp/eM4
ensQ7woCMZPy8n+PlMzNIQpFIpCCnCimMdvw946yUcRNrm/pLhL8fFx4+MzNIQpFIpCHCiHCiHeN
d9oRL++8Lh5HwXeAny6cvM294x4+L/HxmZpCFIpFIQBw/vjjHS4lx1gxiOkssMTjXaHh4oa/CZlC
kIUikUhD3V6fQfcQIEIIxGYehCAgQgIQEPsgIECBGNCBCCIfgQECIQwYw46S6QhSKRSENGp4jRrc
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
OW+h30VGioPOg6DoOhUAqhZQGSZQ4ghOg6Di/MkO/70YxUOKgA5DkOQ5MjkTkOQ5Dk6urq6jkOQ5
Dk6pD66slJpcHB7nvTGnkqKMnl9mzZmFQFs2bNmzZs2HF19fV1dXWf2SOlUEqhnZs2bNmzZs2bNm
zZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bN
mzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNnX19XV
1dfX1dfX1dXV19fV19fV1dXX19XX19XV1dfX1dfX1dXV19fV19fV1dXX19XX19XV1dfX1dfX1dXV
19fUoIFAN1dX5ls3izXVASggUECggUECoBNiU4DyMCqoEUECggUECggPHF445z1wigGVB6ggUECg
gUEBz/3Bwqg42zROFQQKCBQQKCA9cNNkV44E9FBAoIFBAoID7xSgIVCOcxWOUECggUECggzcGweR
8mubJ9KCBQQKCBQQZX9UCB7pAkb6ggUECggUEGBT07FBAoIFBAoICa1coIFBAoIFBBCwlBAoIFBA
oICuiUECggUECggbcLVBAoIFBAoILIh1BAoIFBAoIIJQQKCBQQKCAXTqCBQQKCBQQXK6ggUECggU
EDYuVMSggUECggUEFVBAoIFBAoIFy5qFBAoIFBAoIE1FBAoIFBAoIBTEkKCBQQKCBQQEs6sPmFBA
oIFBB/eajtUhykOUhykOUhykOUhykOUhykOUhykOUhykOUhykOUh3Wo/1IN1dXX19SkOUhykOUhy
kOUhykOUhykOUhykOUhykOUhykOUhykOUhykOUhykOUhykOUhykOUhykOUh2/K06tahqMLBpJsmE
XgYZynDljlwwFxiGFX1wAPT43B25OmIMNOaprcGAcuTyp7CDcbhr1cxcAv9w/R2Zrf4+lvACdniJ
i5M581k9pwaQe9+GHS+B3nCdj58yDOlZ0bD4PafnGMxxus4xGoP1xiux3YyL2oiLWAuFgE92G6k4
4pfljxcLGMEhAxA04fLkUQsElwrCuC9qRokXAmhwgcrBte4baxFyNi/b9K7i4bze1I3KNwusXCLh
TVgKyHHr5ZRvx8Ub1dXV1dSdnVauKhQLbVzaQuAL8iKxc2y4Lw7LyBYV7CTlYTrqCN81e6foWssc
LxfDtiOq+77vuFhu+fV1dXV1dXU5W9XUnTQi7WLITEMJSKF1RqRXtSNBvZAk64SWWOVl8XiLbkWP
bfd933b1X31dXV1dXV1dR0naZv71dXV1do2RY622/EyHi+IG4LHseEycgtTjZdRYQtaQ3hxd1y4r
+Tut6uq+77vtnVffV1dXV1dXV1f57mF8fjZMjlpOg9PIwjwPE/j/xeFOYwFmdWEMD0O6LuOtNHHF
UwxXorcsNvgSu6OVHYGpFE6y4BKkFzcFvVfd933HVffV1dXV1dXV1eWP6urqimLe0YrF7CJeNlzM
HonGjGEBleNdQ6rurKrGQN1W+SYTBtnrVgtA23qvu+776ovvq6urq6urq6urL5eTqLDjnxWNQVxD
FSFND2UGHIrUiy0lm3mru2L8crCck9i5ZW+77vt+q++rq6urq6urq6urqT2kSKExtaNWxWGuutTi
4osZHRW6GsN2LrFk7OGy+NOQRe1Ite9nlZVYV933ffVS++rq6urq6urq6urq6qpk/LQPba1l7HTj
Rtag454epWXdU/RYVlSflmoZ6am3spgSXxQkLhi0RmEXsuts0l4jgeq+77vuYb76urq6urq6urqT
dXU9w99gBrDgQuomiq6+otdM1oCKJ5hhZQqOx4J6FToWXxeVgNMMgeBCJW8XsCgGrogpuWz1HhPD
9V933fdLL76urq6urq6urqeOrq6isuUkyVcx4ti7EXcqWvW+3ZHQskGQie19fA8FEMpJNEFy24AL
qTtYyi6iBWPfBR1Pfd9331dV99XV1dXV1dXV1J+rq6nuBHKFyLVhQsqmbympCwoXOuZWCQG6mJoA
CV5Cyi5yK6o2nI8FToa10dXVfd9331W331dXV1dXV1dXV1dXUmhOJDauhcgr/ZVla3x1VTVcA7mr
dpDHDVlEwjRkgGsgaTux9jgiOGVnC9GTTDDnaqAL7jqvvqUGaopjNZqvmqI1Q6oFVBEoJFBIqRFR
bvPM7/z/OWGHuqD1BUoV1ACbp1Ki8VRuqQjG56urq6jyVTAXKjeeeK8hCql1UsqlFUqEPPp6c8+n
pyEKqXVS6qXVS4Q8+npzz6enIQqpdVMKphVLBDz6enPPp6chCqkFUwqmFUqEPPp6c8+npyEKqZVT
CqXVSoQ8+npzz6enIQqpFVMKppVMhDz6enPPp6chCqmlUwqllUyEPPp6c8+nnyEKqZVTKqZVTIQ8
+Gjnn08uQhVTCqWVSqqVCHnz9OefP05CFVD5LI1bJkNNhYzyAoHDwPNQKqCM8Tk9GSMp1dXV1GWY
POMURZodXVSlAqIlRCyYPfvURCiGpDqItRF79+/eoiVEWxcoiVEXv3796iKURVwqItRFb9+/eoiF
EUllloM6h/UPu/fv3+2C6urq6lRJ1H3kFAZv3795hqABUXnIc6oyNbdv379+k1zmyhjTqAQxd+/m
FADiTuVCG45MD8bNvwchyHKce3ftPTIGEoMTJPpUSqio6VAaoPOrq6uo/s4oDdJ/HSqF1QUbGON1
UKn8qCcmqDDtnVCZ0nmdOvyUBBoKgk81REZagTUCCoVVBSoCOkKgBULZrnSqI1QqqF1BibCgzVER
0vutHq6vNHk5T1caEi5UVkuYfPw6urq6urq6urq6vB+erqMcyzL3blAOoB924yzLN/W3bXqNct/B
vmWZe7coB8Ru3GWZZmzP1dXV1dR/HcoCFAQqF1QuqFVQVtNL4yh/KiJURHQZfhnzpVBioVNFQdG6
Zh0qhU/lREoMdeMUCCoAyR+qiJQZmqYKgIOk/lQv7GLhjpVCp7HmeOJxOAOk6VQSqF2nBk8mqE1Q
mqClQV5fZ8e6oMVC58fXqd+TVCaoiVER5sO/3VByoJVBmHOdQIe6oKVCqoiVESg2NXfvP481REqF
1AgoM5TCPNUGHSf280lBiqIlQqqDD+91AuZZsqgpULqhVUXKFlQIa1BsqIj+VACoA0KBDBQu6urq
ukFcSLn6urq6urq6urA4LC4Tq6jpVDCoRwmFwuEwmFwuEVI6oyVGGEw0mEwmEwmEwmEwmEwmEwmE
wmEVE6oOVHmE0fGEwnx8YRUZKjI5cJ8fGEwnx8YTCfHxhMJ8fGEwnx8YTCb/LCdXV1dXVcXV1dVx
IhOKOrq6urqGTq9sRjMD1dWBxmMwOBxmMwNQ4DGYz/DjMZks1M0yvf6mzWSxmMCHGYwKoB4wCgsU
EhsnwqAw4zGBDjMYGZUWKDJuDNXVmA4zGHIHGYwM3/kmrVBUqIeQYzGGIYmMxhiKkZUEKBdQSGSo
TlRwc5iYzGGIYmMxhiKktU5qBFQcmMzk8zExmMMQxMZjDE55YxmMVBwcXjMYYhi4zGffJ5sr1dXV
1dSrGP53bzy1vKrGVY8IuBViqsXlreeWt5VYyrHuZViqsTlreeWt5VYqrGVYyrH5a3nlreVWKqxW
KsdVj8tbzy1vKrGVYpt4DCGPy2rah5b1dTeeWt55a3nlreeWt55a3nlreeWt55a3nlreeWt55a3n
lreeWt55a3nlreeWt55a3nlvV1HnvVCKoVVCqpuOlUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqF
fn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqo
V+flUKqhX5+VQqqFfn5VCqoVVC6pEVCqoVVEipNVCqoVVHx9KhVUKqi5UWqhVUKqklUnqhVUKqkF
URqhVUKqkxUaKhVUKqlxUXKhVUKqkdUnqhVUKqin5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqh
X5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqq
Ffn5VCqoV+flUKqhX5+1Q6qJTwOlUSqiP8VAqolVEeUziolVEqoW+1Q/6G/uqcH1lN+/KZTfu3G+
b5vm/u3b8plN+/KZTfu3G+b5vm/u3b8plN+/KZTfu3G+b5uqADdu35TKb9+UynxvmUACgAUACgAy
uT25TKTfGUylMvvUACgAUABnbvnnKfQTICE1eQta1vPJqhCapqhCavPLWtbzyaoQmqaoQmrzy1rW
88mqEJqmqEJq88ta1vPJqhCapqhCavPLWtbzyaoQmqaoQmrzy1rW88mqEJqmqEJq88ta1vPJqhCa
pqhCavPLWtbzyaoQmqaoQmrzy1rW88mqEJqmqEJq88tblzeVBB57QHB/fOc43KjRUDqGDB/PyqNF
Rpu443buONyo0VGnz8/PyqNFRpu443buONyo0VGnz8/PyqNFRpu443buONyo0VGnz8/PyqNFRpu4
43buONyo0VGnz8/PyqNFRpu443buONyo0VGnz8/PyqNFRpu443buONyo0VGnz8/PyqNFRpu443bu
ONyo0VGnz8/PyqNFRpu443buONyo0VGnz8/PyqNFRpu443buONyo0VGhlqCRQTKFJUaKjTdxxu3c
cblRoqNFAIYygAUAyo0VGm7jjdu443KjRUaKClQMKCJQDqjRUabuON27jjcqNFRooEjQUCBoKjRU
abuON27jjcqNFRooIFCca3yqNFRpu443buONyo0VGnz8/PyqNFRpu443buONyo0VGnz8/PyqNFRp
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
AGcBwKAOxaoAzgOCS9qQOA4PwUXJ0Gr4ok/DgOC9qQvakDgOC9qQNXDaf7PfSgbN69qQOA4L2pC9
qQOA4L2pBDDxuRuHYC9qQOA4M7e1IHAcF7UgjUZNyZowumDgODKZQ4DgymNNRhx7j1Zj8ocBwZTK
HAcGU5OUTs+eERlDgODKZQ4DgyiXjgGRyfTlzgODKZI4DglWCCFBbh7LEESUlBYoLXQoLlBcSUiS
koLVBdciFBaoLiSkSUlBaoLUqgsUFxJSJKSgtUFpKC1QWklIkpKC1QWMxeHx5ItLpiLkuSIuS5Ii
5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLk
MRYdJuG4qKP03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7
e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc3Zw3DcPIwzcNz9whuG5mvI3DcZ0G4bn9wbh
ufOVNw3DSNc3DczRG4bn/2m4bnb2m4bnb2m4bnb2m4bnb2m4T2dnUwAB///////////0KgAlLgEA
AJuzsBoR//////////////////////9udvabhudvabhudvabhudvabhudvabhudvabhudvabhudv
abhudvabhudvabhudvabhudvabhudoqAJQD/e5QDqAYGGUA6gG18KAhQD4xigD6KdvRhA/8R//8d
vbSlKdvbH//xH//x29tKUp29sf//Ef//Hb20pQeemP//7e3//+m+MgIiLwP//0v7//5Nl/CI06Zo
/9r+Xb2+URERER5dvb5eXb2+URERER5dvb5eXb2+URERER5dvb5eXb2+URERER5dvb5eXb2+URER
ER5dvb5eXb2+URERER5dvb5eXb2+URERER5dvb5eXb2+URERER5dvb5eXb2+URERER5dvb5eXb2+
UREa8V+5hZ9fRP9fnbl8ybPn29uXy/b+fnb2/n525fL9vb29uXy/b+fnb2/n525fL9vb29uXy/b+
fnb2/n525fL9vb29uXy/b+fnb2/n525fL9vb29uXy/b+fnb2/n525fL9vb29uXy/b+fnb2/n525f
L9vb29uXy/b+fnb2/n525fL9vb29uXy/b+fnb2/n525fL9vb29uXy/b+fnb2/n525fLnEc2bzmXy
/b+fnb2/n525fL5pp6asvl+38/O3t/Pzty+XNkjG9svl+38/O3t/Pzty+XwmZzhmZfL9v5+dvb+f
nbl8vvNXb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb2
5fLt/Pzb9fn585fL9vb29uXy7Ofz+2tn3ZfL9vb29uXy+X2fk31L8hy+X7e3t7cvl9/5+ZX+/PzK
5fL9vb29uXy/z+fnHb+fnbl8v29vb25fL9v5+dvb+fnb9Zftjt7SLt/Pzt7fz87SmWeereU3b+fn
b2/n52/JZXo8IxHz2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/
n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEd
v5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIx
Hb+fnb2/n524jERERiMR2/n529v5+xh8RERGIxE35+PZ+/G3EYeIiMRiI/PgM275XYjERG5bT5aw
YwWNWxhbkCmMzjpPHUWOssdLMdk46Dx3Z0aylAfy/65UtOh4NVDzqImZnnbRNOOAJKrGMYxjGMYx
jGMYxjGMYymQo78qL6a+FaNSciUY9Hr7eOpXXkXT5eXgbaBGxcHnkfItE0/ly9Pn+EbqPcMjZlLm
Zk5ZjrEyaE4z7aPOj073QlL2CArbOcZl8PnrBjKVLFN3gOcdE9IH0+XzMnjE41FoAzjjhgAPBxxx
wAAO7A4ABLBwACAAAJCELx1jEvO5efkz+/tqmNqls/v4vR/iSDUswoNCEMta0Ky26ufuaEE4BzXm
v5+fn5zXmvNea/n5+fnNea815r+fn5+c15rzXmv5+fn5zXmvNee6z81atpwHnjPWf69Wa5Ws+55z
0nAdervzUc45rzXmv5+fn5zXmvNea/n5+fnNea815r+fn5+c15rzXmv5+fz5zXmnMmaqzWqzVsy5
qWeeOL+AN31tNBiDNPAV34TODfdBiHD8KF3+LuZwPEP8Ijjm4jlCIiOX/VbTAIRBFAFP9fHAFDYE
IQhCEIQhCEIQhCEIQhIsgQrf1o/t4g00mlkRFkmkzq9/fz9dHlknWREXj5+MhoAhfaz3yYREWS6P
p/2l7/f+I30kiImrHczIiJ53uZERPM3hIiJAiIsZIiLGOyIiIiJ8Q+YxmZQR3vo9KTkGgwUJe0Ry
vt5Qw4x1D4x1xcL+rta1AIQhQa1rUAhC9qDWtbjLWtagZyg1rZQmXwJQJ8/CG4/T0VC/lT09Pjad
rMAwAAAYB5AIiARFGjGofkOhZTKEwQyyhln19fX1yyhlnLKGWfX19fXLKGWcsoZZ9fX19csoZZyy
hln19fX1yyhlnLKCYGZA9abkNMFkEwITAtBMEsjZAyJkFMD0EwKTApBMFsj5F9aMmAKGWcsoZZ9f
X19csoZZyzEZZ9fX19cskWWcskWWfX19fXLMFlnLMPyz6+tA9csoZXyghljIOQsg03KSGWdKBPKT
M0CQIkCQMzugSBEgV7kbyQIkCMyIiMyQIkCMyIiMyQIkCMyIiMyQIkCMyIiMyIiMyLOdE3n+9GVU
D3jVUQfgqlVQUbPw6TB8f1/HDjt2HBN2djP/s7PHDHCYXZ2dme8cz++fH3g+znJmn2dhpTdnYYvt
k86Z+S7OxJwHlkvjFdh09A1MzBy9B0dnZpMQ6PjBmV2dnl5ZrDKgagVAT9+fZ2dnZ2dnZ2dCoR7F
Al2dnZ2dnZ2ZXDZFd4dnZ2dnZ2dme4+8H2N7Ozs7OwOP/bMH2dnZ2dnZ2ZXA1xXZ2dnZ2dnZ2dCo
R7FAl2dnZ2dnZ2ZrDTcdn52dnvx2dmG/fMl3lJ08b+zsm7DhzuewuUM5uZOOJd3ZJgvPsPZQAYXi
U8H7Ozs9N+IHs7DYrlTsOT99q9nB4GR2YU8D4PDz8ezs2nx/dhg4fCfofzX2bs3Ts7CczFARsNQx
TiyucdQCmpjf/SoCPMyjv7PvAmf2dCoK+nZ0aS9M77dm9hwy/6x49gf3x2ZT57Oz519hz5POYuVn
Z2bMoPZ2HCz809m5uYwejy4q3s7P7JdigE247MHq9TJ7DlUAXZ2dnDcn0BD2dnZ2PqrVHQfE3j2d
nZ2eWVZ4HGYHjkOzs7OzHnWYBuG2Hs++zs+/Nj1GSSL+7Ozs7M72IOnSaRm+HZ2dnZ2TKAfZ8I7O
zs6OxQHv/nDqVDfh2dnZ2SmScv5+8fuF7Ozs7DoAqGTHo/PZ2b/XsYVDNOr+rP2dnZ2cf2Dw+dAd
P92dnZ2dmg56bG6ezs/OOzR5ZjB47MKATb2dnZ2YoytphYpQH4XL9nZ2dnZ2amoZt+OfTs7AgwR3
j7fE/Z2dnZk/4Gck9ew5+zs7Ozs7NyK9GKj919nZ/aRlacGS09nZ2dmFl/P0z9XYefZ2dnZ2Jf9Q
Hv0dnZ2KhvwOHUcv5KZPZ2dnZ+4X94VDJjnQDs7Oz7fspUWbmefZ2dnZLVAnnnPjs7OzsyxhHAcf
ns7Ozs7OzdL2fCR2GePZ2dmIP3wzioHm/Dh7Ozs7C9PLo8mdnZ2dk+A8dnudfJidnZ2dnZs+uzs7
Ozs7Ozsk0//YULciTZPAxvXJdnZ2YY9uzs7Ozs7OzsxOAxp0Yvy7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7Ozsze/O5TDi3s7Ozsw303H4TI+Tezs7OzVn6ZrNGFryHZ2dnYDJc1fHdEnZ2dnZzrblR5MPO
9nZ2dlc7/Akmz3Z2dnZgejdIEOKznZ2dnZ//+vYz57Ozs7MH2dnZ2XSR2dnZ2daQsu7bV3Z2dnYn
se+bz2dnZ2XVl2/Z2dnZZcibt7Ozs7Ou+E132dnZ2W9vZ2dnZb2dnZ2WF2R2dnZ2DfizuT9nZ2dn
Z23m8v2dnZ2JHZ2dnZfF5vZHZ2dnY9t5Lw2dnZ2fXhn+zs7Ozs7Ozs7Ozs7Ozs7Ozs8NnZ2dnZ2d
nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ55cvxQfe2Jwk2I4+vePDH+V8ZP0twGTridO+n4yvXh8XZ6
eF450fRcYLe7Pn82Pv9yw+Cj3OfyyXr2Q9ey3RMaVM7xxu363s9rezM1HHyEc+W7OybW/Zb2dHzf
mTyZh7cNbZhd9nZkMrjeTKwcdnYk9nZebbxciTeOzsr2PF1eCuTs7OyEi67Ozs7ELnWXs7s7Ozse
86byk9aa8JKLOyLb9TXMhd2d9+unSbxciLmsSL4svKREPaUOkXJZZCEi7i9qPXJNyXCue9mIjthJ
ddcC+9lJy67LHKPyrA3XR0JPXeb2LeLmG8djpuy8WPebkXXd7Fey0km4EkhW9aaxC683dj3P2xF5
dYkLnEiiEgbbwNsLi7Ojo2YDovFqW667u9mIFI7Em4LUFFyPciLkte9kXs27unLtvZl4tvFEXIk9
gSvZt7Ijs7Vid0hPezut4XE8XGsXJ7p+gGOxxpIdEQsTpoey289lSdYjsvMJL3GlXXsa4UxIjrur
guBIttQK66dyungoW2C0rsrUzwNtEYTo6PTAs0Dk/j7yWYz/xnMxUq/QMVg7LkvZyEyLFlqLE14j
s6wje1Jp7zYh091ZexnuDsthI67LXdIfuTtF6XdojON7LQ9iEiA9H/8dlo4XsXXlF4vMItsvYaLm
uRLYtIRXD19t+x2dlqeEjsvFHtdcscFbbLvu66EIvSrkKZ+3kR7EdGDMHaqBNHZcX0hOlu0XhJR2
J+1L2XuJkXAi83B2WW3sCy7v2y5IsTvcHQ1073sorzcjpBXFZchJuguiy4BdPC8rUXm9mXs2Lbgv
EXtRDpF7UnebLuLkWJDpr8svYF4u785tqkyBi7sRcnasRa/RW6tsG8Xh+y9qJvKe8p7zeUW3hKSQ
k0QMOmvZl3BJ3SLk7LwnvYtyWuKL9ioa1El40G8LIvYHWgU1wVoui9jXkbHo2lbg7bbp7xeLFkdl
5gnuZIthei+SuRISboa0sKlhXc/QXQ/RQIzOtG9jE41b0OLF0Jb2dFKrRsKwei8XIi6uS8XDb2LL
Ou83sBBOlTuV2kUcSZYkOtF7Ch7CtA1yG5LgIFbVjs6EotuhRYkw6W8WJkyLxeE1yOkWXhZakpD3
kb2ZeUOk3yk2XE42JYvNglUAK9llltLu2/a1YLi0r10LrkWJaXBfCL2pJFxREdC0ouQho5V67UPY
65IW8AbWlyMiFzlYhP1wNaXOuvA3F23dnR0V/OgfDoyZxiYmKUB+W+YxvD87+zszA5ky91T3Os5s
Zpp7+R1YBQA9iG9DOUvZ2dnYl7Ozs7EvZ2dnYl7Ozs7EvZ2dnYl7Ozs7EsdnZ2Jezs7OxL2dnZ2J
ezs7OxKUdnYl7Ozs7Er9hdiXs7OyxL2dnZ2JWNtolLstol7F/Y6XKjs06froHE7kGcHbhPMH3q6M
3jpeew/lzChd06ezs663x2dnZ2PCOzs7Oy9dnYPZPx0di7fKaPhmD+O/1l+/lULZA5TX09HzlM0c
B+TcGIdRgZH97FAFWi/sp2LdGHPDWce3JcnX9jjcCeSo5NoziyBkyY04s6a9DYP30wB7G9i1SD9q
ADnJH9ilQwaNTCwHQd3Jv/SoINapxdjTF7PYyBpBVqmqVl5ReUBvFzOSYh/QHP2dl57Ft5vI3ns7
Mx4h6Mj0PNhOzsvPZjrzebz2dmOCYOJzxwj0cnlkVAZNuzv/75c93MnFgb/ZPGmFlji6Pf8IyDjx
ebUAHnkD1AqBcWcPR0eo4MwjEMsyjFwWZO41s8cRzHLtyPQYZpYBQFm4auGB0HLyFUaZo4//3N72
VD2PMbBa8KqFKH0dBxf/t8KAatDawG7owpoeRnnWeWT6NphfnuYWC6DXOtUPnxJXnd4ndPjshjcX
7m2ceLhLberxbe61vZ2Gp8s7Ozs7Ozs7OzJXhvY+js7Ozs7Ozs7Ozs7Ozs7Oz57Pbs47Ozs7Ozsv
F4Ovs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ox/TtPZ2dTAAH///////////QqACUvAQAAbgRqBRH/////
/////////////////y9s3Ne5kNbeezs7Ozs7Ozs7Ozs7Oz87OzAbt5hfWvIdnZ2dmZ+8579Bh9E3
Z2dnZ//GXlwvh2dn12dnxO399sp2dnZ2dnZ2ZX2yZhmr75Q9uzs7Ozs7OzsMU2+TrNBB9dnZ2dnZ
2dnYl6DgNPV2dnZb2dm097xHYoEbzebz2difs7LzebzeezsR2dl5vN5vPZ2Xns7LzebzeezsHs7L
zebzeezsP7D4f9vJRe1gSmAoBOzsg5ezs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz
s7MdiuzsM0yOzsMDb2dmEUA3Z2atfZ2S+/Z2HucfZ2HBh+zsAXZ2ZHs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7Ozs7Ozs7Ozs7Ozs7OzsGTswmV7IHDdhbvXs7J685DsZnR7LkuTs7Lk7Ozs7Lk7Oy5Lk7Oy5O
zs7Oy5OzsuS5OzsuTs7B7C6Ozs7OyOxN2dmzVXs7OOzsbpXdnZg6ydmxv72XJHRerkuTs7OzsuS5
L3LkuTs7OzsuS5L3LkuTs7OzsuS5L3LkuTs7OzsuS5L3LkuTs7OzsuS5L3LkuTs7OzsuS5L3LkuT
s7OzsuS5L3LkuTs7OzsuS5L3LkuTs7OzsuS5EuQVBngbz/ejno7OzgjN7Ozs7Ozs7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
nzG3I9nZ2dnZ2dnZtlOE9+zs7Ozs7OzsozzMbs7Ozs7Ozs7DbMcyMz2dnZ2dnZ2dmsejs7Ozs7Oz
s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7GdnZP0dnZXs7Ozs/PDsZq/5Zuzs7Oynp2bR+AeHZ2dnZTs7B09
nZTs7OzsD2dn32dnZ2dnZ2dnZ2ffZJ2dnZ2dnZ2Tfvn0dmjs7Ozs9OzBc6rz2KgHs7Ozs7Oy83m8
3ns7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebzeezs7Ozs7
OzsvN5vN57Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83n
s7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7OxcuLsvN5vN5XdjezoZ0R0dhXm83m89izo6Jmb
Ri+Oy83nR5qVTVHR99/hKiOpY9E9G7Nn8qvQNb/5l4tq/hCv7fkGML6vvzCMGDBgwYMGDBgwYMGD
BgwYMGDBgwj2CBFhAjRUF4DuJGGCCMQIMAgYSt+tH6XgIIFj8ivdvj8B3DBgwYMGDHjBi+OIfNRU
sIfZXHTs8Pug8Wxl0k4jhCziEkyxnqEO+8YIxhjBgwYgMGPGDBgwYMGDBgwYMGDBgwYgMGDCQSt0
uz2ukCeMGDOVH/RcDBhqDLNu8Y8YgMGIDEsYgMGIJR/CylJX9qoMGDBgwYMGDBgwYMGDBgwYMGDB
gwYMGDBgwYMGDNC4zjlTk7TfizedpjADNe8YMGDBgwYMGDBgwYMGDBgwYMGDBgwYMGDBhDBgtK6A
iGIidtL/tn0vQzvjpk8Y7dIaY5EIJKCUQl5dPSiBJfSEnjEY6S6Sk4zBSI0ShAg1vHGo3UJivOMK
bNfxwMGDBgwYMGDBgwYMGDBgwYMGDBgxAr7igRYQI0VPZjEB3FB8WI5EYw0AgYWhvWn/t6YwIIFj
9LXuHy+sY5+BgwYMxgYMGDMbGDPDHHpEY6/mpqMsrjO7x/aHxbGJxnsQMIYMGDBgwYMGDBgwYMGD
BgwYljBgwZjAwYMNLvbo0oMGADqEBGDICgMNCyXZKpVKpVKpVKpVKv5xjjGOX17TWImnjBgwYMGD
BgwYMGDBgwYMGDBgwYMGDBgwYMGDBgzfpGLqrq2aVl28Ka7DFhn14jBgwYMGDBgwYgMGDBgwYgMG
IDBgwYMGIDBjxgwZcYMgZu4EBRka8yPoTnHE0rjCVSuMJVK4wlUrjCVSuMJVK4wlUrjCVSuMJVK4
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
daFdy3e1VVQKHsHWHIHcmHOHPc0fQQ4tIDrD+DvDrDrDvD8DrDjD/0rQw7tBiA8g8WwOsOsP8O/V
iMae2tWsmDn11VAOHWHWHwHaHWy61qDJpgZIfAcYderNQdYdYfYdYcCqgkMsNQMIMKIDrDrDr1PH
LUNYDl1AOsOsOsOvShn0EN0NMPoPsOsOsOsOvW1VAoZaqA3RwwovB1h16/r3jV1YDrDrDrDrQgMd
VAIGmHcqoGDrDrDrDrgOLRwwmSA6w69SDrfrE4nRQ6w6w6w6w+Q4tCDUDTDWDyDuDrDrDrDrZA1g
7NLDC9AdYcetB1667cHA+NaDrDrDrDr11iDS0nXtcD8DrDrDrDrgO5nDCZyMB16sHOHXrJm1q1Bk
ZdaDrDrDrDrD3DkDZ0rRg3lVAGqB1h1h1h1xAYTORMHRqwdYdYc+r6trnWj6RZDrDrDrDrD/Di0H
SrxoDjDrDrDrDriNPQ9rQcYdYdeOnfwYtwOsOsOsOsO4PkNQNMNcMKA4Q6w6w6w64w/WpB1h1h1z
os40INQPkOIOsOsOsOsPIO4NMNYOzS2QNYOsOsOvX4DCag9Pa8HWHWHXAe17Tg0w7g+Q6w6w6w62
4PYNxpaQwogOsOsOvU3hkYgxWYPIPQPQPRPR/MDLqEXA9A9A9A9GvVugwHMggHoHoHfrjbZYQz2M
O8PUPAPAPAPBVQBcDwDwDwDwDwDwDwDwfWg4b93yQc4dI+lVAiqjHWQ7dd13XQ7lVCWu67ruu67r
uu66HsqoUDsD8VUMKqJdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd
13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd1
3Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13
Xdd13Xdd13Xdd13Xdd11qvKWq6YheZGpqampiT0pit6C36w1NTU1aMm7Jo5Bh0hqampq0FqxjSbz
RorU1NTVp7HowJDSGpqamqx2w6MbJBqampqNSeLNxNFqampqTv6YQF2Gm1NTU1MlBJqampqA3ENT
U1NVVDU1NTU7U1NTViGpqamrbRampqaltTU1NVNTU1NTU1NTV7jDU1NTU8Q1NTU1RH2pqamrZamp
qaqpqampqqtYDqampqacthznOc5znOc5znOf+TnOc5znOc5znOc5znOc5znOdo1UhaZtA0FjYOTI
iHBr2p6+GQGGwWdL0wTGz3r/G9pfn0LQp3jhg6Lr+pamHXoIYJDqYYNGDA0S8khfYdCgMcMYMYMY
7L9uDj1XUdIY7YYwY1gMYMXTNRq7rYcxBAMEMcMYMewGOGK7ph2B3Xf6OGMGLpgagY4Y2jaJDSqo
EbwxgxlhjBjl4kMYMVwxwx9rtaDGDGDGDH20BuGMGMGOGOFwxgxwxgx40AJVtoCfbQd/OElxO2iA
t9tEW2xMDC/Ktkb1W2i5TImi5H/9pg714cbzIxPun4L20dooCSxbEjjYmhioAdKZkfB9R/IlIvj2
2eTid4HL0+2w8Cj1VGyCsFTXISDI2I0vlwdQpA2o3XSvbQ21JkdQ81PDc1C2F2C21XYbtR03IdbE
ZFlYWFjZddRDA1hbihTEi20FvD5GBMco20KFTgOLz4LgS9CioYWaJ0V/Q/Pe1uFWRsD9Hglg3LuC
GIhJ4UQuKyU20X9MBJoxYKNdPlfB1L1HJ9tGa8JcCLr2H2u2xJTbdcSxfG9KsocrURmZ/D5HLvun
gosT07w+4qvhPa7T28VuJxU+x8H/H463kLBgfB/eoJKkvO1jbZWLk635BKOH622IEOqOPgSB5qMg
H3MgjlxjmQI5VEPwWo/HsvNbj0bwcchbAH6nd//yUgCeZErHykTrEsUSJQKswJTVRyhx7SnVZECU
KZjhG1GusupnhC88oefL5AbhSA9bigq8bjT7Ovahawya3qnrrQk1a6G1pbKG8G9ohQNAg15PZ2dT
AAH///////////QqACUyAQAAUbk8YhH//////////////////////72q6Xqze3xr9hk19qD2N0xI
B6h6h6h66Hoeh6GHsHsHqHtoeh6HoYeoeweweuh6Hoehh5h7B7B56Hoeh6GHsHsHqHroeh6HoYeg
ewe4e2h6Hoehh7B7B6B7aHoeh6EHsHsHsHtoDJoegh7B6h6h66Foeg6GHhpzGxZuFOmzUm8OwOQO
DVNXR1HQFVDqqgnowaLCLlQaIZzHaDQDPnZDRDRDQDQDQDRDQDRDRDQDODQFXCQzAy2i8whha17U
Luo6r7KOsNtz7LaD91HWPG9qPmUOHXNVznXNc1zW6JXm1h05nDoY2S6w6LeDpDpZbzXreooh8+br
1zRg8tFDw7a2lr1XAcjBcadZbu5btRDga2GwHbcaw5m7W7oeDZrLXX3eDxylzwkO59BVAOqgH1/V
ulUA6qAcNyI1uAIDTVQDqoB9flVAOqgHY717W863rbdqLbrd7UL2s6zbbrTc1683Bx6z4OZrbr2s
3W29Opp/1lsgPgORrva2HEqoGDma27VmkOTIcAcDW13NbDq1vRtG771HUWwPTV417WyAYqqgNVQZ
o3es6y06iqoMVUBB6XNeDtDvnUdRbtZ1lri7dvNOs63r7ZogYDTrzXeu9XdZbtevajfbmvUdbbg4
w5pbWvWb2p6m3Si9hsb7PSqgVVQtZb2+zZb2+zbv2W01mzZs2bNmzZs2bNmzZ11VQvqFm80WbLQ0
Wb9loaLNloaLNloaLNloaLNloaLNlpPZeO9Y0bStc1zStK1zXNK0rXNa0rSn0rSmpuNojC2tWlaV
pWla8HBrweusavrAc+laVpWlarcOxBzG0rSta0rSj6UU1Jiv6VpSaelaUmqgHDXD5OdOE09K0pNP
StKTDHgPJJ2RPStKTT0rSk9EwlpWlJ3dK0rvRdE60PQxr0TQ9D0TQ9D0PQ9D0TQ9D0PRND0Np1bW
Q6NQ71zXLudc1yI1zXIjXNciNc1yI1zXIjXNciNc1yI1zXIjXNciNc1yI1zXIjXNciNc1yI1zXIj
XNciNc1yI1zXIjXNcDD0TXNcVQDG1zXA2z65rmlMuua5poZ+ua4G1pGua4GYGlrmuTruua4qgFDK
1zXGeNc1yI1zXIjXNciNc1yI1zXIjXNciNc1yI1zXIjXNciNc1yI1zXIjXNciNc1yI1zXIjXNciN
c1yI1zXIrXg4AwtKDg1/IcGv9oBwhwIqdeS1aGjtubm6I1bVtW1aIbm5ubojVtW1bVohubm5uiNW
1bVdW7bm6Ibm5o1bVtW1aIbm6G5u++ratq2ofy3XuWqRGs6zEazrMRrOsxGs6zEazrMRrOsxGs6z
EazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGspt11pYQ+w5NS15jjTUNYaP
/03TYY2OIY2ONN03///03TYY2OIY2ONN03///03TYY2OIY2ONN03///03TYY2OIY2ONN03///03T
YY2OIY2ONN03///03TYY2OIY2ONN03///03TYY2OIY2ONN03///03TYY2OIY2ONN03///03TYY2O
IY2ONN01s1fS9Z03TYY2OIY2ONN01puexpumwxscQxscabpsWNXDo03TYY2OIY2ONN01s/q2jabp
sMbHEMbHGm6a0hxMP9N02GNjiGNjjTdN///9N02GNjiGNjjTdN///9N02GNjiGNjjTdN///9N03t
jY7raxseoabpv///pum6loDGx96DZ9pum///+m6bfYGMhe0ZlbtN03///03TdQY2NK8xseoabpv/
//pumpMbHdhjY403Tf///TdNhjY4hjY4DD03//hlBlQxscQxscBlBjkMZDKDHhjY4hjY4DEDKak7
2qQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69
evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69
evQxscQxsd29evNrExd8mNl6vXb15iZEu2VgvXorGo7m+dL/Od1vndqy5wKMpPoyZ2pdMkqLiCCC
CCCCCCCCCCCCCCCCCCCL/Q4Tl0vdfYWLZ+X+uQeVKgi44dKVvqUeXBG+lxfeeNIIIIIIJJJIzrEc
P7z5XZumK/aqIn3vR///e97/47Hven3vemZxu8bXQWXX3RZ8suLs3JmZmZnMmZvP/9KUp///0pSn
///SlKf//9KUp///3UIJPWCkBBJJZ7yyUVDf//9KUp///0pSn///SlKf//9KUp//7jXGiPt5pOF/
ZZ6bB+63xlmdX1oKi0PE93/rkV+3SUkSJEiRIkSJEiRIkSJEiRIkSJEiQqn+XzeSl5icp1XVbyrI
JP2Q5UHlWVSJrw0/IPfUs+cxLvuXzSijxqRIkLSJEiRIk14Jpw/1Km6YP+fRERMzP4/EzMxERH4i
IjW3a3XegT113a9x5u7H7tn3jnOf3veOc5/e945zn973jnOf3veLOkSmpKBMkSpUBrkCbknK973j
nOf3veOc5/e945zn973jnOf3poVeXfM0bEFUIenevVQa14MC6YMUMMgwhk6bqGjaSGGyMGlhnsOj
aKyMkSyMgZ+hsWhMjIyaQHdqGiMbDLAyEA4g/WRkDpyyMiOl6IQYGlkZGPRg0sMthkDOVQHh5SGW
+sqoIgzGRkMGb5VQm05ZGQhY0HQWxuD6vW7bIyMjIyMjIyaMgyoMjIyMjIyMjNokaFaZGRkZGRkZ
NIYZYGR2RkZGRkYtHxaY2RkZGRkZGTRGNitsjIyMjIyMjJoyDKgyMjIyMjIyaDoIaYZrIdkZI1Zk
ZNd8bXNVIddzojIydMmktzWlrmtNFvTWVoPqelaTedIgGNo2tqoB+3d1UCCqA4M/VncOzx9fDBYN
BVUEqqCfhzh4GaQx9ZDsupGMHqHWY2oa11d/rOtmM2h5GMHDcidTDiZbYcGp6pobnag6dU1gPIOP
WGFgud6t36yxxqBANMOMOmHDmIBjMumtuttwcfQcgcYcYcmrhx64HmqgQuBgMW2htoaoGxpwcYce
ihyahtoaJYTDCbdfIBnBxhxpNYcZBgdh6SDtD4Dj+H2HGHGH+HHrIfjYho2jbaG2gHGHGHE3ZQad
HYA4w4w4w422xpMXA8A8A4w4w4w4w5Q7wwmD2jbaCYcYcesax//Vu6kHGHGHGHGHDtoaHRAOUPkO
MOMOMOPbQ1Jn0a1tobaAcYcTaHE3H7DAfUOg4w4w4w4w7tbSohoethyhxhxhxhxkFUAaqgxg0b+2
gHHrmqBx6PCLbbSZA4w4w4w49X1vS76qAbTtWDxDjDjDjDj20A5dE0Zg20A49Q18OMMJtsJuwkGA
OMOMOMOMOwPnRG3thD0DnDjDjDjDj20NtDRmA+v6gHGHHpDPhotaa3XQ4w4w4w4w89bbVUCDHo22
hrgcYcYcYce2htoaIf+qa2HGHHdzZRfQQ7SAcYcYcYcYcod1ENL0bbQ1IOMOMOMOLbQ20O247aHE
HGHHqHQYDpUHdrYcYcYcYcethykNDVUGMBBVAGHGHGHHrH9tDRtKDY/rAcYcYce2gGvojaQDlDuD
jDjDjDjag42EMJh0bbQ20A4w4w426NtC1b0pEOgOkOkOluZfe01VBUGFaDpDpDpDpTaPhiMGhpph
0h0hy6qxXXtqoC1UDgZgZgcwcwcwcwaehhzBzBzBzBzBzBzBzcWTWrifvXkfcGoPHS8MrKy41ZlZ
WVlZWVlZc63hPWw5mVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZ
WVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZ
WVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVl0nQrLImGJo+q6TpOk6TrGiszXYufx
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
JaqgFVQFtobaG2htoKqAlVASqgJVQFtobaG2htoKqAlVAVELjRtoFCarJVZKrJVZKrJVZKrJVZKr
JVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJfcsru
GZ07q3dW7q3dW7q3dW7q3dW7q3dW7q3dW7q3dW7q3dW7q3dN3dh87tHbuyIO7Led07rvoNh3u6M7
5JO7Et3Vu6t3Vu6t3Vu6t3Vu6t3Vu6t3Vu6t3Vu6t3Vu6t3WOVWS03lWSKyqyeXXarJVZLTyIKsm
Zy1NTVMqslVkqslVkzLU1NTVMqslVkqslVkzLU1NTVMqslVkqJeWpqVtTUTJ9TMz/+4amqCbU1f8
TmZIS8NSd5Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99
Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm+QTVQ
B1ubyqhHWmwPi+sMcNtsyrDHDHXfvq799YY4Y+3Axwx1376u/fWGOGPtwMcMdd++rv31hjhj7cDH
DHXfvq799YY4Y+3Axwx1376u/fWGOGPtwMcMdd++rv31hjhj7cDHDHXfvq799YY4Y+3Axwx1376u
/fWGOGPtwMcMdd++rv31hjhj6TpiqAvSAxwx1376u/fWGOGPoqOQ6Axwx1376u/fWGOGPqjaHSHm
GOGOu/fV376wxwx2vTmRkDHDHXfvq799YY4Y4cIfxBYY4Y6799XfvrDHDH24GOGOu/fV376wxwx9
uBjhjrv31d++sMcMfbgY4Y+b99Ntv39RDHDH24GOGPev3zXmjVNQDHDH24GOGO0tt9t19punDHDH
24GOGPqF+/c1G/fOGOGPtwMcMfVL986799YY4Y+3Axwx1376u/fWGOGOveqwxgxl376u/fWGMGMp
xJgxgxl376u/fWGOGNaJkNtjUGxd++rv316hqG2xtsbbG2xqGoLv31d++vUNQ22NtjbY22NQ1Bd+
+rv316hqG2xtsbbG2xqGoLv31d++vUNQ22NtjbY22NQ1Bd++rv316hqG2xtsbbG2xqGoLv31d++v
UNQ22NtjbY22NQ1Bd++rv316hqG2xtsbbG2xqGoLv31d++vUNQ22NtjbY22NQ1Bd++rv316hqG2x
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
vIt5FvIt5FvIt5FvIt5FvIt5FvIt5FvIt5FvIt5FvIt5FvIt5G5mwGCvW0ZoNHDJbyBz0ZJxVvIc
MzBPibeRbyLeRbyLeRbyLeRbyLeRbyMcnyJAtwxboCu3kW8iJm3kW8iLeQAErbeRbyLeTbybeTby
beRbyLeRbyLeTbybeTbybeRbyLeRbyLeTbybeTbybeRbyLeRbyLeTbybeTbybeRbyLeQxMlvJVDO
we1vrAybGSL8t5OMVvIt5FvIt5NvJt5NvJt5FvIt5FvIt5NvJt5NvJt5FvIt5FvIt5NvJt5NvJt5
FvIt5FvIt5NvJXbybeRbyLeRa6Bi9XTc7byJw2HF828i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3k
W8i3kW8i3kW8i3kW8i3kW8jcnYDcb7WwEZoNHDJbyBz0ZPYq3kOGbZ8gt5FvIt5FvIt5FvIt5FvI
t5FvI1yeYkC3Pt2BfbyLeRMW8i3kC/AJDt5FvIt5NvJt5NvJt5FvIt5FvIt5NvJt5NvJt5FvIt5F
vIt5NvJt5NvJt5FvIt5FvIt5NvJt5NvJt5FvIt5CmK3khedMn5HlmYsnfiuLeTrm3kW8i3kW8m3k
28m3k28i3kW8i3kW8m3k28m3k28i3kW8i3kW8m3k28m3k28i3kW8i3kW8m3kqt5NvIt5FvI2QoVg
GhaY1261DWA6FUDWo4DJa1UCV7QNDvatqs2Qjd0TTg69DatJ/e14MG7qecayqgf0LHNh0QMUNT3e
GJw4WO+VZkWtG4x50BC1fDQuMLGz5zHUfaWhFoFpiKOjNjZcuGxezjmw6Jj5CL11qYtGbGxpaPdM
mDGZTUwkKukGDXm8O1iDx17yeha4kjrRAglqNrRbzAqgxVQeXgx65NbDlqDA8d86iqgnRIKqBmgO
ogQ1TXP3g8A8w6SGphohmKoJAxg2NHbEj6AQo3qhgZutBaOkGNNiziEsHDhQvMuppELPrtl9Y1MM
wMxozqIZAc+oJ6GqoB0fV9BzYpHS9AYDW9YDPDhlpt6CHLos6LqKqCSiBD2skCE3b32gOEO9qS//
UWnAYgYIdGouZgINPXVixeasc9cYtQIY1ENZvII38trBppuy2h3tSz9qZQwyAcWgpEHQIJ2r6LVa
0JEO9mZtDS1YOMM4O0h+xk2gMCOl29BlpuaGQuqoCw6mzRCFyxcwcOVpbtUSu6xouovZDI1shmkb
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
JSJSJSOi59F1NxTbdSVKRKRqiqPo6LJ0WUUiUiUiUjouwokpApIpvRdZSJSJSJSJSdWUulIlI7lI
6LAlTqbhRuioMCkSkSkSkdFxFJzKSKSqspcpspEpEpEpFvKFpt9LhSNVtpSKl0KFKlUZSJSJSJSJ
SGi5yhKrqnlX6LkKRKRKRKRKbpUpgpGlVxSNSS5fGpv6UiUiUiUjouHReLU3FJ1boufRcRSJSJSJ
SNKbNKrqRSJSNRbPFAVQUYU7uUiUiUiUjouYpMpApCSApQpEpEpEpGkONtVlIlI6LC0WlcrKI0Xm
UiUiUiUiU3ouIpIpKrqRSZSJSJSJSNPRYEtykSkSkSjdFQYVNyZSWi4ikykSkSkSkSlymykqrpt7
eUKUiUiUjVFIoXRZlUFIlIlI6LJqVvKSKb0XEUiUiUiUi3aLhKV5ykUiUiUjvfWmqaJSpSxSxS38
uZR2ioFtFQIaLIKWKWKWKWKAqfYoyoyi9tililik25vUq3RcZRbVouIpQpQpQpRUoApQpQpQpQpQ
pQpQpTReFVXOVSaLp0VRpVei6SiEDU1NXlKNTU1NTU1NTVSKb63FMaLhampqampqampPZ2dTAAH/
//////////QqACU4AQAA56BB9hH//////////////////////2pqampqampqampqampqampqampq
ampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampq
ampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam2k2VLy
qt2ltbW1tad6v4ruUFosltbW1t242yaW3RcNRNra2tsm9uqHtXcbW1tbaFMpDDxtaW1tbW3anouC
orbNFyNra2tsu09qFKlQbW1tbajp6KgLQUdFgtra2trRZtra2tptra2tttra2ttl7bW1tbfNtbW1
txtbW1tP21tbW2/9tbW1tB+2tra2rhtbW1tNtbW1tLBtbW1tbW1tbetra2ttamUo2tra209Fw6Lo
0XRoujRdGi6NF0aLo0XRoujRdGi6NF0aLo0XRoujRdGi6NFz6Lo0XRoujRdGi6NF0aLo0XRoujRd
Gi6NF0aLo0XRoujRdGi6NF0aLo0XRoujRdGi6NF0aLo0XRoujRdGi6FarxMoUxouGpNF/FOaKgD0
W2UmUlVRShQhRui5Cm/KUKYrNTTTbNyiWQpfRcpfRdmi6ShalKUqqqCmyhihdFz6LhbsKcKSKEKE
p6Lp7SoULqiqKpqiqChWuqylauqqp9Fk0Koqjc2+qCgqnbCkCmNyhaoqgoaVU1Q5vZTZTqs6kqiq
CgNFgt9UVPVs2zRZBQJ1RVFU1RVNUXVFUaFU1TVFUHVDf9UN5eqKpOqKoMH0AkA8MZ+aPs/s/0LJ
X6PLtCliWwPDs8/zweTmeT9ZGf5Ql/rZoeDFfyRhgt5yb2vRUAScy5OYX0Bo1bRnk4L/80YjNhRl
pNPGltaNqoqooDpTjWps0tLQ0tJSmi2Si6v/yVltHr3aMHEFgfa2fmV7WXMujaOVL9mvgBlvYS5i
vXNgvO5mYa3gn/rmWzCfMNPClm0Cowd/o6/MuT5pr8uTln93WWR169ZhHCfMunJ8GD8ihW8th+ay
8Lr2jMGP555WrptGV/0PPyfLMOWCe8B2sSBzzTaAMt+eZVHy489IlhJvQkMJuuL/ya5owYNPofWk
K+gDWJsfoVwq0aKoB0Wj1qlVhRWiwSnqsbCkCjyj9F56LS0VALovTRemiwdF0u6LF0VQDovnRVBf
dtFsaLE0VBlouQppq0WPLZp20WPosjRY+ix6jqOo6j0WPosfRZGiyKjqOo6j0WRosjRY+ix6jqOo
6j0WNosjRZGiyqjqOo6j0WRosjRY+ixqjqOo6j0WLosjRZGiyKjqOo6j0WRosjRZGiyKjqOo6j0W
TosjRZGiyKia6jqLRZGix9Fj6LGqOo6jqPRYeiwanaWtpplK1KUKUZosUonRYeixt1W3Rbmiz91d
F0NxbRc+i529t0XPoujRdGi6NF0aLpPz0XRoujRdOi6D0XRoujRdWi6LMfoubRcrRoshAUoUzouD
RUBei0tFtlKoO4UtovrRfOiqKCntF66LoqwpRr0WAUFUJSd1DUNRVF+ltVDZouFUpGjoqBIonRc+
i+Sj3LmUe1FAlEFNNei4tFiFH6LLoILvRbDUUE1FB1I06Lg0WWUEUbVFXFM6LEKIaikGwodVqqHR
YhQJSLe3lGtWt/lcMN1s6WjWvenTKTKY2p025Gjqhtp0yk2ynTVKPqar6RQJQOixCiJN1KqSjyjS
jSgqooY1NGixKpbNFxFBNWixCjyjSkVaJTNR7aLCKNb6rVaWoo8oEoWoijGrRYkigihOlE0Gpq0W
WUCUWUhQoaLY0WwUQUQ0FBlAtDQUDei+8oUNFsFGlGlBVJQKQqbRZbQ0tBTLhRGixCjSjSmarpUi
jygijSgaob6p0XMUE0NRR9IpYpEo3RYjQUe4UtVGxRBQOixChqkKZVKZKNKPqOo6gKZ3KR0XTovA
pS6jKEKU0XhovApQpTReGi8ClNFq6Kgc0VAMUpou2ylClClClClClClClClClClClClClClGupCj
ylGsogpQpQogogpTRUDmioHKhKUKIKIKUKUKIKIKUKUKIKIKUKUKIKIKUKUKIKIKUKUKIBSjN0om
panKNKNqepyjSjanqco1GUXU9T9yp6nbym1aG5TTfU9T5lT1PhQNSynVDdotEoXKnqfMqep8qZvU
Ka0XCplT1OUjlT1PnGqqG+rKnqfRd+i76nqfRd+i7tF8TqreqykmrRd9T1Pou/Rd9T1Pou8pbRVB
KtVdb9F31PU+i79F31PU+i76ibtF3VPU+i79F3VPU8bKJoFElEFElElElElEFElElEFElEFElE4U
SUSUSUTvZQuiwMzMzMzMzMzMzMzMzMzMzMzMzMaqiqaptFhbVNU1TVNU1TVNU1TVNU1TVNU1TVNU
1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TFI71NU2i+KoqapinOVNUzcU1U1TaL2KYqaptFwN9TVNo
v7Rc9TVNUBS9TVNoukpypqmnU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1
TVNUxQBQe8ygyhKsKDKEVZCgyg+FB7VKp2qapqmpalqWpapqmqapqWpalqWqapqmqalqWpalXqmq
apqm6lqWpalrVTVJ1TVKPKlqWpah0jqmmUFmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQp
QuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFCybyheNGiyLUKOaeVLo
uPOcaWlpaec5xpaWlp5znGlpaWnnOcaWlpaec5xpaWlp5znGlpaWnnOcaWlpaec5xpaWlp5znGlp
aWnnLQFIU+caWlpaecp5V5TfONLS0tPOVWUoUmUvzjS0tLTzlOdJr5xpaWlp5wpnRcDdzjS0tLTz
nONLS0tPOc40tLS085zmNLTfWlp7znONlBpqqeyD+c5ylRaSkapas5znOtLTNvaWmnznOFMNLS+0
tPOc40tLS08VVaWlpaVZ08RKzaWlpaVUUqSBpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJ
paWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlppUqVJpaWlpp
UqVJpaWlqVpKqxaWmujamlVVVVpaAXaKNJW4+/WERM6PTSEIQhCEIQhCEIQhCEIQhCJy7sxq2czJ
xwTGgNyjEn7iE3UDghCEIQhCESZk9ehugjdtz7wznOc5znOc5znOcy7nOc5znOc5znOc5znOc93Z
31/W9LMVZTy5JN1LbbbbbbbbbbbbbbbbbbbbbbbYgHU2TkaN1LbdrTZts7PN7PT2N/m222222222
xmT1AjuWq7o9+HOxjGMYxjGMYxjGMYgMIxjGMYxjGMYxjGMYxjG7joX32okFR1P2oajKBfQvtTs2
irVSgyj9FjFC1DtUUyhqhKEKEgoUIUJUdRVHURQhQhQhQdOVQlAFClClFFCFAlB9KEKEqjyhChCh
KDaUCUVMoQoQoQoRqKAKOKEKE/RZJSdDcoBr0WhuUIUJthQCgKEKElsUIUJs0FFS0WBosAoQoQoQ
oQoQoQoQoQoQozRahRhQhQhQhQhQhQhQhQhQlT6LCKCKEKEKEKEKEKEKEKDKFKFKKKEKAKEKEKEK
EKEKFKEKAKMKGKEKEKEKEKEKEKEKEKE0WGUcUIUIUIUIUIUIUIUIUIUZotQowoQoQoQoQoQoQoQo
QoTRami0ihChChKBQhQlGapSJSCB4FCFCOFCFB7ertsUs05sUUUIUBotUogosowoipSmlaJRJRZR
ZRbU11FSKLKLqgovRYk2nlDRUA2ioBnG/RbJRcygN6qacKLKLquqCiyi1aanW+k2FFlF71UUWUW2
oSkaSjaUOUW20tFllEofKQ0WBRQVViCRRSlH4IN48KBasmUDt16qEDXjZLChSg8woOocbKq0VQDS
KUbSVSgSgsxrKD46dWYhKV57eU1mVdVGIKsaJXVlU0sbJZiDKdW1VV9W1aTmZyMc2KUbszM2nKoq
tKQqmqczMbiktF2FPttWnmYgQMTE2byvMzPOiUhVzfVmZmHVVWVbTJzOZt+5SUFOZmZVLZSq6rqv
qpvzMxBVJQVU1bE8QXhSEd2i7KQzMynDalovYpmlVWZmG36Lnq1sdPOfhSvMQtEkFWZmZVFOlTby
kqrnmZhNWtn5zMKTquiGuSDMzKqbM0VQCUnVptmZmE1ZBitBmStu7GhPMzG+qauq4parTqnMzCd9
v5mYpwpKFKrqpbMzMqpvq6rygqpQVTmYgYjq1BVbEgzMOrkDZVzfVOZmTq4pQpVtq0nMzjh0+aLj
pznOc6tc7UFDRYNSznOdGio10aizJz6JZ0pIpRWoO971RXve973vUTUgUabDTQqUFKFPUququq6r
q4peq6rquq6rquq6rKQKWq4pIpgpuq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6
rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6r
quq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rq
uq6rquq6rquq6rquq6rquq6rquq6rpqx5222ltTp06eyrYpaBBVlOnTp0c3UoNhSFGnTp06N0uKU
21op06dP2xVqRtlCnTp05UykaHKdXU6dOnztKUqVPanTp058QKH6WoKdOnTkTTp06Z1yadOnTOud
OnTpmsdOnTpxOnTp09D6dOnTJp06dPRlOnTpk06dOmTGnTp06506dOmTTp06ZNOnTp6Mp06dNLSb
adOnOyiCjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSjSiyjCjSjSjSjSjSjSjSjSjSjSjSjSjSjSjS
jSjSjSjSjSjSjSjSjSjSjSjSjbUvlTjY6oUbVaNFSjNtO6JyE+3biBt/bL2bO0dpNTdSUoqnQoVp
0rUuWevQoGpQVbFdmihtvV10FJ0KFDt0Gn2hSg02pQrA2pq5KhQoUKgoUFGgcpdoUFFCVKBqKH9C
gdBQ6FCualDQoKUKBvkrmuY0RLV9DzW0f51iSBrP4lW9Bo2BBaH6MIrREtWJYNGMtcmJdKx0kGjF
iV9GL6IY6MX0F2U6yBAgKbJXJrnXJhokXJrEQfA53mftt3jVOctpS7OirvQ0Kxsq+jv8/B+QLCbP
7Lo0VueamiBdY1tCzzQjZwrkVWhWYIMOhWhWYDhW5eHOkTUGiWGjK+ja2iKOjHo6NGgNEVclY/0Y
jOtoiW0bXKunEmEV/WhoyGjVzX0QL6NIJlWLkrnX0eK51zW0FiYaMZyYH8TrkwNl0aw11tBLsoUc
UQOXdSlAVJUFGoygSgK5QtSc4UFIoEo4ofRYO2xRZQei0ahaFCg7aaLSUGUGUGUGooooUGUGUGUG
ooooUGUGUGUGooooUEUGUGUIooooUIUGUGUEooooUEUGUGUGooooUIUGUGUGoopsUIUGUGUGpQ22
KDKDKDKC2222KBa1Jc37VBTbfzbYKBAU3UlQoLKBUKBKB2soEoEoEoEoEoIygSgSgigTKBKCKCKB
eLLshQBQCu9EoOnRotZR1TlFXOlvRoVIUbUBQFRfklKFQNVVbMi9VVVVVVMG8lCgdmiiUPUJQRRl
XcqqrqVU1WUm01eUjVxSimyHcpmlVFJXfdvKUqir8bW8pGq8pbtrfk9nZ1MAAf//////////9CoA
JTkBAACDvaiQEf//////////////////////9JuKRqlva22r6UWaP6OhjP5ThThSlW+U4U4UrVpS
JThThSkynCnN1quo0VKpqkpGq0Er2q6r6vacz6VMpGhOr96RSNXVe31Sgb23tV1e20igN6VXVTQK
O3pFI71Q2XUFS0qRSlU8aFFCmSmarqsKfynVNW1VQtQpmr6vqip7kClKZQZQDfVZSNX1eKsy6uqi
r6pbG2kUnVFOlV11U31eUjTq78yq6pKRqyqm+qRV9XNrb1v4dAoAoOh5Tei4qBQZQdCgUGUHQKK0
WXosGgUE5QoUKFChQoUKFChQoUKr0XVyhbXQoNbXQ0WXosujQa2uhQa2uhQa2uhQa2uhQa2uhQav
oBopUmlppUmlppUmlppUnjpUpoJSfQTpUiaVI6pb6qKVbqdU1WdKkTSpHKkgqHqA6VKkdKkcEDcq
pSpFBlB0qRQfVClOzpcpFB0qRQZQdKkUHlUFI74gKDpUigyg6VIoNXcoOlSKDKCpUkFRS0KiqI6i
qLRlRVFUVRaMqKoqiqLRlRVEdRVFoyoqiUCDzS6KwJaf1RVCqCqKoqiqKoqiqKoqiqKoqiqKoqiq
KoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqjaVUVRztUVRRhVFUb0aoqio9qoqjZBVFUNaCqKoqxpq
iqNmGqKo3qiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqar7lV1Wl2
quq7quq7S1UgKm7/MmczKmlTSppU05zJnMyppU0qaVNOcyZzMqaVNKmlTTnOc65U3UFTSponOc4a
wqaVNQTzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPM/Rdt929BKdW6Lix6r
atnOc6tq2ratnOc6tq2ratnOc6tq2ratnOc6tq2ratnOc6tq2ratnOc6tq2ratnOc6tq2ratnOc6
tq2ratnOc6tq2nTq+nVtWznOdW1bSxoqKratnOc6tq25SlVtWznOdW1bKlS2q2rZznOrataJSq2r
ZznOratq2rZznOratq2rZznOratq2rXJz72c+1bVtW1b1WY+kqKtq2ratzJ51t7Oratq2rezn+Tn
vVtW1bVvZznOratq2rZznMpCrSkyk5znMpMpKl5SZSU5zmUiUnhqUZznNRTRiik5zmopoxRSc5zU
U0YopOc5qKaMUUnOc1FNGKKTnOaimjFFJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMUUnOc1FNG
KKTnOaimjFFJznNRTRiinez76imjFFOzE+qKE9L9M3VvLl5JQ5Ju7u7u7u7u7u7u7u7vqBzudtcb
nk5hQ4527nMDLCcnTlLQsd3d3d3dt31A+vR3b1bdO7u7u7u7u7u7u7u7u7u7u7u7Lujd/AAGZu7u
7u7u7u7u7u7u7u7u7u7u7oA3dDM3ffsXsq4y9jGMYxjGMYxjGMYxjGMY9X7jzlxx7vXQ+uOdju6B
hITj3EtbY47HYxjGMXt31A+h7okkI7Hd3d3d3d3d3d3d3d3d3d3d0nccYiAnut3d3d3d3d3d3d3d
3d3d3d3d3dxOOxgnabf1B3RckoVMg0WFyoWlrKmZVtRaLIQVSUSVMKmNxUwqYUqU/ovZAVMKmFTG
0pBoa1GhqplTNF0FMVUVMKmFAdKmFTKg7ZTdSthUwqZlCqGzYFTG1Ap9TtHEFXFTCpltTrX3hUwq
ZvdUVDUnJb0KRUwqYVMKmFTCphUwqYgaSpjaVMKmFTCphUwqYVMb6gp77FTCphUwqYVMKmFTG1oa
qZUzyphUwqYVMKmNjRSn0qYVMKmFTCphUwqY3tPKZUwqYVMKmFTCphUwqYgaSpjaVMKmFTCphUwq
YVMqioagqgqYVMKmViphUy1Why25nbCphUwqZTQXxsxVtKUzbCplXSUKmT3qal/UBUwqYVMHtCAq
YVMKCpdKRKFptPlTKvkVMacpVTouzYqYVMmUl0qZULTSpUG7YqZjeCphUz6rqcpMoCdNtb8a+OUC
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
FiFBtgKEQU2+ZTi9WFM3UT3KFXFO6LEoUKFCrililikmVn5z5zlRa2jxOe9K7/eqKbfQoUKE0BSr
9XcB1+9VV3Vp/fGkoKoJ1NzLKdpb0uXhSG9W6L/q+XA39ptWixUG9Woo0KFCh9RTuHZbKK8/FSiF
ZqrDeqLqlZ1rp1JzpSdSVSrQ40Y91VXveqqqqlG6LAKOVVqH96pqyrSjNFglHVFCqSntFw6LjoUK
FCe6vJKyxvaatqL8ylUCATk0tKu45jaUlR7OVzqnaaATUKe5UinJ7Wpk+qqzqBQoIpWmpmi4aiKB
2mrbTSqJTMWbapbapVe5UjTfMxRtqTISQKqyKQc2bFClWptzlTO71FOSBoa1akez5ipOtfVVe96q
rvNVWhX4K6gthuhQoUOqq97vSVnuqrUtS7NUZtWi4A3f5TBToacQtfKN0CkNFz0Nql2uoKc2xtb6
dLZWomriBrlRqHGuhQoUGwpUpZVv3mptvvvvQobNF43Ns9qNVc4/xBu6rP0HBRv5lKFJFJVdy+5z
qu/GifelNlI06ak2xvbKnaqc61DgtuyntJlZY16Ardnd1+NGb/itUdu8nPaCoHHxybzZ+YZwO53V
eNRPYLXr2lDRd+Mob7u7u7uN92XEmn169evX+P//7mSfSfjgl6en5wpnA7nc+sa1P4LXr22iYd3d
ynLW7NHdu7u7u7u7u7nd3d3d0DHDIELCwsLJEPf///3zzbPUZ1Rn35k9VU5qpWTizpVcqpUqp7VT
mqm9V+pjqqw1NVNbqpKqsVU66c8VVMKrnPFVTWqkw11UmN0FVOarBzde5qrmGUVWRZeVU6qpUdVx
a10PQdL6c8TWdFrV4Y/Q2I+qr56Cqn1VK9VKFVPKF1VYc3dX1Uj1UxqpqZvniugqv1X6qXeaq/VS
G+ziqs83Y66Xbqp7VZuooO1W1X6qpNVI+c+dYqqXKrNVOHV1VJPPVTyqkyrKrlVMqqQKsqt1U1qp
N6RmejnqpKqtR1U0qpaiiqsZHVSLzx1U5qpQoKsqvVdU1XKCgVViqn9TVTDKrMVVKlVKy56vqtVU
t1dVSLVS5VlWVdVdqpjVTk+VU7qaqWaqaXHFVT+qxVSNV1VMKs7VFTV9Wn1kdWxVU0qph1qs1Uhc
7qpRw1VL9VI9VNoqqQaqdVU6qpfqudKqe3VTaqlepNnNVdqpxVTSqnVzVxVU4qpUqv1NVKHQ/aqn
dTHVcq6gVBVZiyp56qW6qeVU2qph05ubmqpjVaNHVTyqmcVVJVVNMjqtR1Uh1NTVZFBVvOudVUyo
N9KqdVU6qpS5qrpqqX6qUcqptVSPVSDVTqKq50qp1VS/VTaqleqnt1NTV9W1Ul1WKirqqVon2N2P
Gd8+M1Vzn3VtVNqr1VmNtOqnUV89VK9VLNV+qmNVNaDDGqt1W6v56rlXvzpVenDXZu2rtJXrV3aS
u1dpK7V2krtXaSu1dpK7V2krtXaSu1dpK7V1WqrVV6rqirbeVFV6PKiq7GaKpfTnjPVTyqndXbjv
uePM6OrsoKiqxz1X6jmVWGyqxVTGginuaKqm9VIHPz1XKruXpK7VVrmqsVWYuxzOpugVXGe6rNXX
m8Zzx1fdBiqvVW83dnoKqYZZ8quZVTCotPKqY1Wsiqpll1U4iurG7qp723VYWVWI6nn5+ftV9V6q
9Veq2ratq2q9VeqvVXufn5+fnq6rquq2ratq2q9VeqvVXufn5+erquq6rqtq2ratqpfqq1Kq9Veq
vVXufn5+erquq6rqtq2ratquZVTKr6rtXVZUVU9dVqq/QdJzKrl1PNrn5+fnq6rquq6ratq2rart
V6q9Ve5+fn56uq6rquq2ratq2q9lV6q9Veqyq5U8/Pz89XVdV1XVbVtW1bVeqvVXqr3Pz8/PV1XV
dV1W1bVtW1Xqr1V6q9z8/Pz1dV1XVdVtW1bVtV6q9Veqvc/Pz89XVdV1XVbVtW1bVeqvVXqr3Pz8
/PV1XVdV1W1bVtW1Xqr1V6q9z8/Pz1dV1XVdVtW1bVtV6q9Veqvc/O+fnq6rOlXVXKrlVKVVzpVZ
qpzVS/dV/nkVX1U45sqpAqpvVTLnq+PnqsVU1uratq2rWYyI4n0iiq+qn1VKFVKB6qe42apveVBu
aratq2rY4zOq9VezxXfNzVUjHvRqC6vqppHVTrv07XUVeaPMCjqpjVlVygMR+5gfMqs56qdVVQNV
U4q2ratq2hiPV/XD0DZqE/PVeeM6qsVBjnj5qvObr1fMqtMY3PFzVXqrtV6q9fNzXd83Mc9VPaqf
VU9Oer9ZUVZVtVNKqb1U1qyq9VStVSxVSxVtW1bVudcu6DH2oKqUI6Hn5qsypVBh+dnZqLmqpgY1
TeHoKt53ViugoG0eJ0GT2dTZQHq6TmoMRo+eq7z0FAZ3VcquXz81VirKA5sNVtWWbn5lVdNznjoI
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
1bU1WI6Cro6rlVzDVHNVTCqmequjXPFUR1U4PQVZFyxVLqaiqwfnqpjHEeqzQKq/QUFEqmOJ4ZR8
0dVrnPVdqpxQRZ2iMeq1jiw8dVOaDdVnMqphVtVo2VUhVU4q6oqpxz3huagq2q3VTOgvmvmoKujy
q5zVfHFVYPVd5uaqxzVUxquc9VOKqcR1Y1zTtVpc1AzR1Xar3PdAqtyKqmFVigvnw1Bz1XnHHEqg
1BFEagPVbq6qnFWoVUwqp/dWTr6UGjUBzfaA8VVmqmFXp2jm8io7uKPnjoDGOqmI1VtPrFiOedoK
CJfIzY46Q9XVbhutWRc8UW/iGzlu9BdAaooKCgNVc61Z1qTXOVZ1NQUFVmrjPt8u5npkc5fZJOO3
fRaiCGhvtNkYAQrEEWmj0pZJynpCavOmk3CFckEWEBuulCTPmkiAgRBxc1VM6qb7oKqZ1bcXNV9V
y6rVVMardVNebrHzVNVNaqa5VTWqmsdX0J6qa1U1qprVZuq7z1ZVTOqmtVM6qauqmlX1U1qprHLV
TWqmt1HM6qa1U1qprVYuqm1VMaqa1U1qtVNDVTiqm1VINVOKqa1U1oarXsVVmSqmtVNaqstVWSqm
FVMKuqtmoaqY1UxqprVTWqmtVNaqa1U1qprVTWraqZVFVMqqa1U1qprVTWqmtVNaqa1Uxqt1U3qp
hVTaqmtVNaqa1U1qprVTWqmtVmqmdVNaqZ1U1qptVTWqmtVNaqa1U1qpnVaqptVTKqmlVNaqa1U1
qprVTWqmtVNardVMqqYVUyqprVTWqmtVNaqa1U1qprVTWraqZVFVMqqa1U1qprVTWqmtVNaqa1Uw
qphVlW1U1qprVTWqnFVNaqa1U5dVNqqbOqmtVNaqa1WHhpKr8XtVNqqQKsqp/VTeqm1VOqqeVZVT
xbqpvVTaqm1VNubmnKqbVU2jqppQdzzF1U7qp2erqqZOr56OrvaqZVUy546qZ1Uyt57Fd1Uyqpm4
6qZVUyqw9Vw9VvD3VyyqnlVIdV1HTNVdzmzmtPFVbq2puqzVT+qmlVNKG46i6rfPU1bz1U0yq5Ox
VWpg1VO+bIqrO1lTHEaq7VTnnPV1Vyq5kVVurKrWa5uepjjoavquVMdVycSOeqnlVParBqmpPHz1
XKrkdVOXVTiqnFVWeO7qamq5zniqu1WququLKrc9VhzVZVYNQKqzcZ8quc+VWpidi2oqrJ4r56vj
iquc+VW6rJqrMd1NRVjuq5iqpzVShzs1WnjqamqnFVzndVOaqcVVZ6qcXUx3znqarlVqroqrqquV
WqqaKqmdVh1J491dVdiNVcyOqnp/aucVVItVMqt5uY2cwx1FVqq/V0dV6r6r6MvHV9VKnnNlVqoq
yrKsqIqsqyrKsqyrKsqyoNUcxjVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlW
VZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWV
ZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZ
VlWVZVlWVZVlWVZVlWVZVlWVZVlRE+e6iOoqKiojNVZjOY56ioqKjn9ij5+bpU1FRUVHPMxVJlz1
FRUVFWVZU83PUVFRUVPMeoqKiovcUUUdRUVFRz+Vce4qioqKhVFRUVFRUVFRUVFRUVFRUVFRUVFR
UVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRFUVFQ61VqqxVYqsVWKrFViqxVYqs
VWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVY
qsVWKrHjo5igquqqnVX1XY7u1lVyrqrtV5S+zfmVXKr1X1cjniyrqm6uq9ZF54qrtV2q7VdsyPcx
Ue1XKrrquVXMq6789NVdqum8qu1XJjw55BlV2q5kVVyq5jqpRq6q7Vcqu1XartVyq7VdquVXKrlV
2q7Vcqu1XartV2q5Vd55DHqplb6JxtSHzDxny48vfRCavKjmoY+aqz555zVZVtVMarFRVaiq2qml
1fVTOqmeVUwq3m56qYc2VWqrFRVTKrMq0pVtW1bVtW1bVtW1bVtW1bVlW1bVtW1bVtWVZVtW1bVt
W1bVtW1bVtW1bVtW1blWYiXOjVZQZVT2qntV2r6qdo57q66uq6rquq6rquq6rquq6rquq6r6uq6r
jGqatitnqv1U/5ozRGdtVNSfv056r9V+rKCrKsqyrOjur7upqv1X6vqv1ZVcqtxVYbmqMqplVYq2
rKrEaqtG5jRnqKqY1WOarDVWKrdW1Bqsq2pMaKreaqzVSHVlWGnJyqntVPaqa1Uy9qp7VT2qnNVu
q/VT2qntVNoqqe1U9PVkdVN6rXNzVbUR1DqyrKsqTbnDGq2qkCqzVYoDVbVlWVWarNVuJVfVlWVZ
VSJUGqzmqprVTg1W5zc+VUyqsGNVY5tXHHVaqtVFRVcm6viNzVW6qQKrtVPY6rVWVZzVbVT3tVTi
qwaq3VtVs9RVtWVZVTSrKGrOarOarKsq2reYxqsm6rVVmrKtNVh6qZGoajmq2rLqt1WaqaVZVkUX
eq26tq6r6rGqqa1U3qsVfV9ViqxV9X1WKrdVNKqYVWKvqsVWKrFViqxVYqsVWKrFViqxVYqsVWKr
FW1Ui1WKrB6rtViqxVdqu1WKqaVU0NVYqu1XarFViq7VdqsVWKrtV2qxVYqu1XarFViq7VdqsVWK
rlJVYm6vyq5VczKrlVzMquVfmZjizmieZmc0VW1Uyq2oqsVGZmRVHNUZl5nuVZVl5lVyq5mVXKrN
VNKqYmyozKrmZVcquZlVyoqKrcSquZlVyq5mVXFqq5mVXKvzPVVfPVfqv1X6r9V+q/Vfqv1X6r9V
+q/Vfqv1X6r9V+q++erjH5uaq5zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Ni5
uaq1zc3Mbm5qCa5ubtFzc3Nzc3NVZ5uaqyfm5qsq3m5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5u
bm5ubm5ubm5ubmqIjVFRUVEtRUVEeRxxxxxxxxxxx5HHHGI44xV1X1fV9X1fV9X1fV9X1fV9X1fV
9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X6qsRUFVPKqcc9V2q9QVUiVXqr1V6q9VeqvVXqr1
V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvKrKiq9VeqvVXuZRV
Xqr1V6q9fNzVXqr1V6q9FEZVXqr1V6q97UVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr07wKVV6q9Veq
vSa7HqvVXqr1V6J+VXqr1V6q8vOxqr1V6q9VeilqvVXqr1V6q/VeqpxVTiqnFVOL9qpxVTiq/VTi
ZiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiuKKKKKLZAyjVdqlaXJMss
QTbRa9s+7MzO7uzMzu7szM7u7MzO7sytdldXV5md3dmZnd3ZmZ3d2Zmd3dmZnd3Vj66+7dASaE1j
pgbmmdZYOVradrdYa66qqqq6666qqqq6666qqqq6666qqqq666hw7Kx1Q2HD6xtVVVXXXVVVVXXX
XVVVVXXXXVVVVXXXXVVVVXXXg4bDh2VrI6nvz1AcxnXKtw+DR6s65FBwvnfI0caPeWKCKrIZCgoK
rNV98roGp0VXDVWVQVXoVWN88DOKOr6j9U6oOhgfjxRt745ryx14pjzXZ8eKPd1QdDA/Hijy+NpS
A2+Wd325jsHq30VXavNdHrlQUFBA2VYZQuq4FQXV8KA/oxWd0A8dBCgVBVYzOZsc+6BVWBgVV8VX
NnjFVmg3QZ4Y1BdC6rlBQW6t64usXPUVIPHVgUVxnqxxKhqsGqsUM17iu9q6nnR6B0Ds9Vk1wyOO
KrYubmzvQcx491UwWqr765rMR1kfQyhV1Cc1BqI1Vw1V+6CgaPCrI2erFVYqs9KCrVFExz1cbKBu
huravqLONVKNfNVaC65nNFaqphuq+9azrh1i6GyMKr6roqsVZdXPWHqpxzH3HCKpUVWm5ur3QXQw
XSpqsVBhVcq6qxKFvdXCgw75I9UCxWqCqgIp9ju6Cg4ifPEzM/EjijoKC+IY/uHvm4jqznoKDidK
BUHY9RxFk50sz4nP03e+IqqAOI5jk8qrEpVXrqErocoN9t6dCnOJUHegoKCgod6VB1oKBeUVvnmO
IzOhdBrITEHULq4dYNqC3BrKmqtD3hz5jaivq08NGd0FB07UFpDLqIosj5z1dV5/LNQfVQQs2Gyq
9zqgjdVqqx2uqgElCciZ6iOLt5o7Rk/gyFHVWFcZmRVHPU5UMxo3VeoHQVbUVFBVcHPAhyWUGJnq
yLnurXQc54qiq3VTKq1zZHQe4c0ajyhqDRO6r9VznqaA1WH6HPnNwJ5qqYUR74hoR1NRyigep5rq
p3HQd+arqt3ifMdWqrNTVa5ouagd5cbXM8jqplzKooO9RVr5z89WZUVXTH5soLPQH56mq1VkV0F1
ZVd54zJx2qqYnurartVhc3Mjm5uegugdXxR82Kgq63znoHVTw1BkWlVt1WKC3QxtqFXVFUEYMPap
6uHoNVAaqt17VE4KCjOonxLjq+KgUb4hzo0OkMPHnHq+7653Z6oPT1fayqC5eW4dQaqsstWaqgCe
6mCPC4VMDQSgzQy4TFLBVUASHNxugQyqvSHHIQY9qoAlq9xCrKtjquQiBqqASGftdUGsdUHXulVB
zG6z9UHWgqr6a4rT4kgyZ6cWe4mcTKpCFUFJrjVxPD2qgG3/6ogJTieBFaxa63PcJidnKV/xEGig
QhOj0sfATpqBrtHpL/R+ZRooEl/RdlsCNlsK0EaZIAtdXcBmrhPQT10sw0r8SRDRQIQ3V2uhQP10
E7XB1Cd49WKSDRQJLOB+zK6CpszPVx6R5Ear+eq5EerKjdWur6qcdaDdXVXKrPeq66tqsVY1U3fP
VcqpnHzuoqvVPPzow6PKiK75uaYfSLfWg33pM6O+bm6PnjjfdZVlB8Pz3h5ygq+r+ag7c1TzdKDn
PG+apoDx80d856ioiqppGa/cygNUVcjdqsXzVVipq6Jaqvdz81VOKqcVbQHNVTJPZ2dTAAH/////
//////QqACU+AQAAWUu9wRH//////////////////////6irKsoKrvbrlW1ZVTSrqBUBqrJzVfUU
FVjt26Vdz0EdBHVTGqmPNFznq6q/nbH0UfPQqgqyqx2qbOw6rVVqq1Uc1BVTDro2Lmqaqcqq7zn5
6iqkPWZ1oDUCZnGezdKg9rtVeP0P3NU0NB2mEnzduaq1VaqOnMe2KrTqOaq1Va60FVMNdTRbjqvc
5+eqnVVOqu7VJ7PURR4aq7m7vpcd0HlBzGxn60EVniqFQbyLnjMou9xnR4qu5qtt9s7xmt5zVdFV
bjoLd3009dcoNNT1Qu9WVFBQYc/NURc3NdWRRZHfZRzzjN0fZXfe753edj0FBVTXE7x0HWgvscyP
HFzJ517p32q11WKjyq9huepqv1Xs5ou56r1VP1UXFVtV+q0jXs5zR329WHoDd6qd815VYqsGqvx3
zVbVTPmqsc9V/nqcqIubKCM0VV3F1quc9VzmqLoI9VNVy+1BVZiqIo6CrI47qT0F1fdVqo3kVx1J
6A8fNFlTF1iiNEeONc1WVXKr99zVdUVUwqpg6sjqavqvXVlVmpPFVYqphFVY69THjq881FVcqY6r
dTzRRXV3NlTFUx9qrHPVl5zRXdAlV9V+q4aO4oqqYVUwuq9FVZq2r+fdW5mRVUwi54o9VbVeqvnj
oKvq40VVigiqphFFVc6O46r3epV1bHFUGj6m1d1bzVNTz5UPXZpGTqvVNX1XKr1XVfVTiOo7x4fn
MagqKqdXVpzRJ9D0GZ82n0oKDGzGoJjD3QGd0jpLkNVz1MWajjqT2qrBqChcfbs3ugfXu/+AQkzD
pkyxEw5oUt40fnUJMw6ZMsRMuYlYT8iizp21QVY9ZeUFR3NcsZqsoKqSKqUaGqmdVqq/VTRVfz1d
V9VJFVIhqqUKtPVfqpH6xN1F9Et9XrtQG11id83l5dEY9vKvzD6XSiMezHdTF2qD325oritROJc/
aq9VroI8MueLIqqZ81RV2RRZlzB6rFAfp3yqmFWx2r5rjioLyqkfOaq/d1UkG7RVNx1NTVTKKrbN
dBQR1U6qu1Us1FBmd6siPUx80dVirueq7UVaxnPQVXYqsqs0FAnHFzHjugw9ViqnD56v57e+lFlV
npV9x9OmXz81VMqqZUHPzHPkVVuM2+a6Cz5UUFTHEfnqea7up6KPvURXVtTeRMbs0fPV/TpFedKL
fSqzH0q+75+mVUy5qqZUGUMWc0feK8DosfSrqmpquUXNE8jnDd6rHXKua3E4zG6xRnMz9ZTc/PRb
dTUZVyvt1OdGqtmnO0Sq5I3WgtLvFUo3Pk4z6vOaTN3Fuoiqv0DoOeojqaDIj3QHqMZubvQcy3Eu
fnVu85ukXV81WVYdM4oIjLq7t2Z5HMz+VNVuq3VfnboLw8XWpcV9JO11Peq9Vl3H2sx3cVV2q2jO
qmdWVdVTjD81WVFWRVX6qZx0FW0DPUnqs3Ld5GZ3zm1KaLOfOeKq7VcPdVmq9VlQaq5QZVdqpzHQ
VXquqppV9RVTiqzQRGqw9VyqluqmNVOqredY7q+hurqqQ6rt2aOq7VmRZfNVtViq7HVtBVdqs5QV
aeq5HN3FVdq+q3VceLO15Qdeaq7VdNQ0Dq+rqsd1dVmVMZ858q6qzVSHURVXaCrKu5rznqt1U6Ne
c9BQTEUVVmM/M5g1W3VTnDOOgquVbnNQUHPQVBzO6rFXVZFHFVuVWVUVWalVXauquVFVirL73QVG
VWarpqr8dBVeq6rKrNVmgfPQVdVyq6o5qtqu5dVo95lTdTUVYqhWDRVXzjHPc7w9BVYdVnnOJ6q5
QG3zxnjdRVTPdVPKiK7qsjpVjR5e0dWXV1BzcxqjmOouffjkyzUB7ivLM6CNRG5tHNQaVH1ipJPZ
k2SvTSfbr4GgBUiDBPBN6dG10n2nLA0CeFSITDBPCJpaPtz1eaq5lDFU80W9Gqsc3MzVUxq2qnFX
za56rlVOyJ4qqZm5tOqnBqrK56GqxrD1HPPRx1XHc1QmZYlvV3Fc2RPFzkYqvisb1NUPfplWZlDG
jR1XF3qtVXTHl6Ptz3z1U5q/qRiiugqsNaPHFVTE9m7yzGKpoOeiuqnNBVc2bpVcq00VRQRxVXL5
+eLmF9lVZuqmW2qsquVcfLtc3Q9BFzc1XVUgVWLq08U9HQVUwzsazGw9T0cVVmqz1qs1dV3XKA9X
1FRz96qY1U0ygdTVYNV1XXvmlSqKvqp1VTrMqy6rEVFVYOsqt1XZiifNz1XMqsXNXFbq+q444+lR
dVNarkc9GeKzdjc9TUOgqu5Vhl1jq2OrDrpV1Vw/SqxzVar5s61ZMHqt1ZVcoqrGHVV2Yqt83PRP
dVzpFFN51jPVZNzVWO8V6oObdXOPtHV+tYc9Qp2gor7Rn7VZ2tdu9mjmu9RlBQUVnMY5jH6n3OZH
z3h+bvzmSzs90CNc4fD7Rt5HmXhrjEaoHz1XrSVnyM0/lRnbne4qsoEomzR9MNkSmlZ6HbN0uoVp
a1Va0Wv2JXAxqqY1U1qprVSlz1e92a8Gqioiq899ffZdRnvaaQqpnvLouYjlV/n71WaiqmnNHzvM
NEeOq9FVTiq3FVlXb103rOm6u51o1WNboNXV0WXVc57bdW9qsqtmquVbV8fPzYqrFVuq5zxdsoOe
rKqeR0FXUB6rdTU1WKrB6qZdKCq5VcqaiqxQ6NU1UyoDGMY1VygN2qsVNTuoqpls3Q1RVfqp12WW
dGjqKr5z1X6mqxVT2pNQUBz1WzmPU1XKg9VyqmR6jpUHObsfp2OepoDVNRVfqt1X+vYxjnqplU7N
QdqqUD1WKrdBVYqsVU6quVFVuq5VfNs5jUBzmqsHoDmP3MYx+h6qdHquGNUmqv1XKA9Vw1VjvUHq
Dn7VUyqD1FViqweq/UUFAYxqrFB0qKk/RWunPznFV4+RJ4hdWdqu61bVqOaoqKqZVcuegTvnq/O9
TVaiqu1FXUHNVTI1B05uehqu1WNYuag63cZszn7Gyg7804K8vboojx6OtUBs5oueNXURdOZue+Et
djZPGcfa90LJrv11a2mXtxy1rBAUF59XIZd3Vd+v1pLaZOtxOWvawQFLHljwRY2fdde930q7uzKO
PI40fnj56tdVOObsd1PvPVYOKCJmqvRGvH9joOnP808TqL65QdnGlU+x5h13KX0jHWFXg9AprrVp
+1XUBr1hnz81TQKLIzDzOY9XRY2aqndVg5R9j1WDd93F0qaGK7uq5z1XszDRONdPMjzDVNTQYaJx
q6rvNGahZ+tVyr4zRnuM/Y0dTzznNV1Xdql0EcZ6mrefmq6q7FHVtXXnM8q66r1VOZxc1XswjjMf
MqphVTCp5ueqm9RUZQdefso7iPVZw99jVHQ3VnPcfU1DVlRVeRjc19j1ZQZkuRmq/KE/TOkcxh6q
YVUwZoowaPKqYHzmqphU1U3qOeoqcqKr9VOua6sq/cbMqnniy6t6KM9SlHqYIKPFFkZRHP1ug6ZF
UXHd3ax5Qt5vtOK6CM3ZTXW4jxdnG7dcoKAh3wWjX1TjoJJ1u116h3mZQdKDrQGcfSrjXeUCvrru
3vqaa67xRzTFAKm4qi3DN5zVWKrFVPrqTaoKXyo5svt26Vf1vlZVNcXnqt1ESqbPZqiroo8VBzVW
zVdU3lAegqsXVTm+agXfpugjtUMdfm61WHiqp1VYPNRnzKB8+UB+psyq5zVU7PhojxVPNVfOepNF
U5Gehqw53Z4qrPbuudxs9AaKrKscVLQ4e8x4Z0GG56jtVjoY+arI7yr6jmu+93V+Z17ZFQc0Syru
aq/dB0oOY8R+hzUHNnMegiRzUHNU9+xz8547x1dz1Efegq9dKi6GpPVxjxc3agq3m5487UFxZQ9K
mgjj58yrqrmVFDURXU8xaljfSlqFm77duwoI1Fz2a8t5VaPz8zivmygjjdWXzxc1Au1Xvo6moNtO
g5qBIzoKDFQR0BXZ5icjNnNQex30N7G980XPEOjcyO2dJd+KIhTsVWFWOoiqpezVcok6daBe5MBz
OxVYVbCIqqXs1XIKiXMy6tjsjRYsvnmGaq7VTUyiqpzVTw1RVTW6mKg51VT6OgyqmHNuKqndVyq3
zVESyI9BzVU2qyqm3fv8PQRX2jq5s8dC6A27NdXNxc3NfXDXzZVlVO7dA46rcUfMY+VXKufNQc2G
qp4aouq1VTW3ZqCoqp8aqkCqmz56qsFVOKqYRs3erOeKOq1VTep5o3dBVboHQHbNQOgqp/VT+L5c
VXUDNdVObqpktJROq316xZVcqOarKqdOgoMoKCOrI+eKOp546qc83NQI1VOT0FxntnqtVU+ugNV1
BQLmq3sY1HU1UwqyrKA0VXVFBlW1YoqCpq2pqv1UxyLKBaUWdevNVTnmjyKgoKA1BVd5m7oDRVXO
/wyyqmtV6jqyrKsoIuarTdjVUwqyjqTVZQVdURHoKCrY6sqp9V11Zd1eqCpUTznqw0aqpn2VV2g7
PLd0F5VjOePKi+qS+3lBQVXI+aKgq7D2ddEor+znRYddKnnPz0GHNU1L56rFWXd9taimVQc0dWJ1
e/p4158oHzVdU5HfWj796toLj56/NVbNMRavu6B1X8zO1x1X+vWtW6HoKCqnRzZdVw2I8Vx1PY5r
oKDnpKrmRYllV2g5qr1SKrtq6h3VaurUuagqsUERD7lBnbL3z88dWcxu/eLHFFVtx4fLRqrhueLv
VTq6vqw9Hh46tqpWoDVfIlfNHt5fNz1dEqCqnnSOOO3Vc61X7oKr3XIrjZu+R1EWPrtyPvlA6COq
7UR4azxVcjnq6Ogt81x1dVaiPQVdQc5zUBzc8VV5x1U3dTFFcVQ+jj57qvR3lTFd83PVdqu1Yfpd
BEc90FBVfNU9jZkR6mgoL2agq2PnPFV8XN3oDxc9XXQTtA6sqyzUCPQR856tclQlkWN5iu6vq51W
artVM6rB6i8oOtVOLuqzFlVk9BjiquVXMq41TeRua7bPFQUFWGqKDI47oOaKNVaRiZ6uqYzx82VX
I6g1XOpZ6rFBVmVvPypH0xVYCAQK8EPK5VDYa+dMF6zhndP6sbSSc1nTh/clAOARK8EFUEDhrDXy
qYL13NeTuVuHjYJvV9Z04f3VHPJieGu4/SgR5j1G6m6eVU2qavPUxqqnMUdVNqqZx1fdTz1UgZUm
qp3FHlV1VU+q6oNzRVUj48i56Cp55iooDxRGPVTs1Vq5JXzTCiq2p63Hu5JTHjieGVBFV7qp7UHq
pkbOagj9juqm1VPIzy1djUS56qY1U+uKpiRqDnxc/Mz1ZkVV09S/bqpjVc6miPMVddVK1WXVdOeM
1VmqkW6rVRUVUkOM4vdVOaqeVdVSBVdoKCzVFVzmjqptdSjx8/MbsbNVXKqbuqzVuVfz3FVf56qR
qiojNVT2r6tqp+6r1VMKs56uqKqUardV+LnqHEfM56rF1U8qpzMVW6qdc7qpVyrY6qQKiq5VTGqm
NVI1V5VU+PVTyq1U5VZqYqqfvXPVlVPKrdVNKCrFzrKmOM3bmqpu6rlXxq6qceRc0VRVlVyOqm9R
VTmqkA1XVU8qKu59RVOTXOlVTGqmNVM+aq/VtVKuVUgR1XKqY1FV5VUxqpGqp5Vaqp8c9Tz1Uyiq
pxUdvYmdpc6dSKrVVmPLvKsZ6ut1XartW1WaqcVFV+5ar9VNuaM/Mlnhze81X1FqOrT80dW1dUR8
1VzOtXc3NVYq7rrmfbquY3aq5VlWdqqYVc6gx6vVX89G7PQc0cVxxUN1MZKrLMf2M+dYqE92a6Dm
ObmqyzRHMfDmqOkZuY9BmY6TKCq1zc0lVN6mpqvRnqpi7u+bKk9nZ1MAAf//////////9CoAJT8B
AADUokOuEf//////////////////////pjVTlanMNVdijNWR+2VdVl1fkRqrV3VTyqmtVI/PVcq+
OgOeqmjqpzV9WVUzPU1dzVU85+fQuOq72qKA91PMeZN3vmwldVIXPzzhqmqkGrqr/dzNVuqnBqnd
81VNqm+ZXVeq2pqpIPVT3J7mjuQ8Rj1PPPc1Sc+c2j81Sot89Vip5o6GXoao54+fFV1WyxVe6reH
56AxvT5Fk8eeq2r6m42dXV1TUmznoavqtOI+XVnSq3z5UHN5OOq7fNU4Yzl5zzp1UVMwe46rlTUH
Xt9L5jVbV+ooozRnq+o5zc9W1dlTVtXRVHvMfLurMoamq1V/NHQ0D5o46gxz5z1ZPZHo+VdJnMeO
7R5IojW46qZ5lBHQVU5VViq5eHqu81VigqsVfVTqrKqY81TUOqn1V2rMNUGMc1BV2VBuZR88c98q
efvmc9TQZ5cR48PZ+fO56rNVztZlUHzrMHjzuecyPmzz26y87+e5jzdVqS+nD4/TERAQI2zQbWHz
YimGqQbl3zKhHOw66a1pVYddFltOH69xEBAjWzQbWHzYirmmqQb4r5lQjnYu01Q7DXUtNc43Ezdb
qKuupvmMKrtV+Orj1U056qZxdYz5VlV7I+Zc9Vl81Vjmiqp5zHqvWz1NRVSzV/NVtVJFQDaw5qAK
PSjjZ4+ar4lhtHNEfBFdxRVKiqvWeo5+1RUVJ6rSquVZGj3UVMaj56qdXVaqp0qlUFVPKrVQo4g+
eq5dVM6qen6O46rplh4uZ1WrloKqexVU8naB83PFVe1livVdoKuqKjn5+c2qqeGNV1WVU4qp9VTA
0XTvNRHqpR1UVUydVMqqb5V9Viqn9BVeuqlOojjNlmqt891NVk2VNR3iqp2apjZzUJtWqCr6m6Cr
ouh3R1Gdqiq9UVFVMGqA7qtROq1F0qvPKjnq3Oaq0o1VTOIxprp3qpk9VFVyrqCq1VStV9nPzx1X
7qIqrtQarqDVVOooo+1a6rhlUVFWHujO+1RlV6oqGqiqmDqtUBzRHqsnquZV0TM87RPoeoiSZ1Z7
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
WPKCgVRzH5qCOgztmXlXHZzuKgoo4+cy59LnqsVXe0cx35ue7iyPKCgjRueKO+agqTVd1j5peaKr
L6q3QUDVA6tioLoI+erqDtEuYxqhxm56uqMq82ZeGjioKmKR61a5yGYaqzQH56A3Pu90Z6tTO6Dt
Zqu18qurXsUUd60rVfr269Tmdsovt5QPbiugnJygoLPAoxpi4zqYTvPUy4qKRLX0WjlMnkyNGFLd
KYfApEtcI7TZZL0vhGWXwz9NZ2mI+x6ujdJuz1XDR2ZOKrasj7bjsPKmrFlRnp6uP6Y1TFMJXY7P
xO7zJhmMqTVtSzGuZc2retxntarczqJqijkvTZl0dTV3mqrNVOI56rIx2y+fN1XOepqd6dBlV2I8
dRcdBkcweoq4xudc3SoNQVUzmqDmoKDseo5/bqyrOe6soDUEp7oKDbi5qCOpFW1KkVRUVYbKrEdD
1urTmquaquc/NfNl9VHMZzo26g5r3QRYkbnquW95QVbVuqCzRYqioioDCpqatVQpDZUVZHQ1WOuO
pvTquxUEZ28qu2luOe7RW2ePsMScu8eS5054jHPGb279Pzc/bEn1vzHzxRmzss6Xsfeko9Bu+G30
3QJr56HFj1p4lKPPOmtdL91WkukXlJyUudPTHq+7SHbtl9DRWbqNUnjpIbs0g5+vNV/aq5V3PFQN
c7s/PFU81XqDRlQOjrmUtBMugq6047quVXcVx1dzrrmG7Hqamg6475m++VEVn56qYVOjRbiqsms8
UaxGvOerDLnPl6NzRnzD3HV99B6cxjrnqprVZiqF3jq0x6mpy8Rouaq3VhqriuOpqvVf3ayLHVmG
VTHQXaNVcw5s+xrL66q/ceRVFW89TVYPdTUqrqrMeG79j3U3VT2q95qPmqKrdWR1WjXcfvPVeqbu
KpifN2N4bmq+q5Z3Qd+7TPzniqyzeqIyqDVFWVbUVbVnPzukUXNaqphVZzHzxtT006KzLOmG12PW
9i10accVmNhmnFhlHuoxQ8S+SfFfTTgX0uG8JlTtcOtnfz+J+wbwnWSp2pule9tbNRSdjTKXSSk5
lFV3Tmiw3nSrLqHlTQZcV0GKgPctBjupyPITT2dnUwAB///////////0KgAlQAEAABHYHmoR////
//////////////////8734unj7Z7QN+iZ3tNZzZRzu2tGNntB5rstpN7itfZvp17Cd3QM3eXD9tx
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
GSFyGWGeGOFyGWFqGSHCGSGWGOGSFuGuGSHaGOGOHGHGGCHGFuGOFqGSHCG+GiHaGCGOGOF2F2Gy
GyGaGSHGHGHqHaGOGOHGHGHeFuHGHiHCHGHaGOGyHOGuGyGyG6GKGOGaF2GCHaGWGeG2FyGaGOFy
HGGGGWGaGyGGHOGGFsGwyA2GOGSGOGKGKGiF6GOG6GKF+GaHOF+GaG2GaF2GOGeGKFyGyGOGeFqG
OGOHiGyF+F2GWF2GyHGGeGKHCGaGiHeGuFuGyFqF2GuGeGuGGGGGuHOHaF+GuHCGKGaFuGiHaGGH
iGeG2GeHiHiGeGCGuGCFyGyGSGOGyFyGeGOGeHaGKF6GOGOHiFyGOGeHGGOGyGKGmGSHaGaGKGKG
WHeHGGCGeFqFyGSGSFyFyFyF2FuGeE0AQnwkgiE0HgOE14hJhNBwAhOBEJ0JMJ8KoHhOhNAQKAEJ
4JAAAAoMhVhJhXBcKYHBkKgFA4CBEKYEBoNBAAAQGAIIBwEBMKIMhPBAAAYGBgJAgDhUBEJIBAEK
gBBIJhPBIAA4MAAHhSBgKBwDBYEA8JsKUJsKQAhNAEJoAhJAALhJhJAoIAADBAAAADBAMA4HAAMB
kJoEAgAAAOAEKUKEJoABkK4LBgMhOAgJAAMhRhYhN4DYU4SQBCkAQQBATCbCjCeBAQAABCaBQQBA
cBwRCSBQADgCDQeBgQBITYVAeAAJCsDQCCAYCAOCITwYDIUgBCuBAWCEh66c3c3N3deprQWzRU91
dtO8GiFN5sgrvZoPLrWrN5Es3kWfYrpaBGn3+6GgbNaV8U0RTp9DXpUipFTzzyNaj3vqU99/sQ6P
9asGQbh0xVq19n83dApwacR3c2ln/f4gr29vHU1mIkphgbQvd/8Xmhej+Bp33EVhHY/A9Hki0aOV
2lgQcTXmBLmiqAqg2DY9B/cu6B//t0cXf+MccBEf9F7vbd+szsTwgPrTGWvLRnD+FUuY7d/6JRxc
tPG4Re8x4Xe/GDAUWM3KOizTHdjP4yJrScP+rLa39wsR7lXPDYOOhR2HL8dy4xYjI9+Ne0q01Znt
6L1oYoh2J/9HeN3e6wjGvH25WeIXesDd8lhmxAtVASWhrJ2InIiEeuNIgg50XxIAcVh5gEiuNeH8
/JTF3xIY+skQCJWL5EAg+ET8XCP8n+KSIV0HxgU9mHtIAkTajugpH+mL1gQ3joXaDHErgsjLQOqP
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
GEyKt2MVlu9GtyemHN8yz5jduG7H23v+63ppoT3msxaKFN+UmqbyYMsF68jn7SPc8zl8TEv78vHQ
NYPk109Gw2xsukihZrsJu9ynTM3MzV68SZ53bzUxxZtb8uFxt/XC4WjlWO+29mzTpqGcXU8s97S2
bpYUoyajxSqUrgJuNsEWHpVoPCtJiQoRuVvGo3eP1fs5ldzJs8Jc7e5d15Tvxmb+uu1bu8Y16N/y
wWdkf3C1xm1ubBsOti9S/TZm3zOtK9u0yXzLlDTb09W3j+yQSX1hzXsahtvuQrOUzubmxsRuau6m
LqZqeK1oqj8tPeyyZglLN49Ixks72vr4eRRt9ZZXmsQ8teoPa10Z8/Ou03/3Ux6MJ08fz4eNmB2i
apDH56lI7Yl8JLFp3PRvm43TP678PN1M20i3eSZaDrdy3g3qD4l3bsbd0d3f6dqxDNzS6K1vXNwB
9hjzWVlPSj2svpqJmYaEnm/hSGc+Ah51GGgmgXkPJ52U2t547l4U76rQ5dx2oLfwsjHdPgge7Om/
k5PLWWwSP4xajRyz09eOb/fh4nO4aptxWaa4LF82/zXeH22es6PPUePVbvafG54fRd5ciMSZRrct
xJ184W8krdwyxy1r1pnrtOPxeibm6NWxpLP6sLfNk0fd+mq5W3fj13WyronjcHa2spuq7WzVNrhx
TC23YfEYVxprvoX6pPTp1k6+sh2V2syWiFYzvGp6LnC42m9dv8RH3eH99uXM5quDmOs7757+ksbH
md61+8Ziu3EvfXlV47TbD2+7zZQ27gb5/L2dV7cVxnhn6CYeZZh10QOFDrlQwx36NA3Xn+Vwczkf
ClnBK3St5p6tpcRR/dfO7+OmO3rQ+JubPqTvtLfCd/Yuxt2I52MTr9pOE816xiY/rie3BjNvlmf9
nsiKZbheC+xJ/CyhzKaltdkVIey3c+thYgY1H1+ix7D5+kXN0L/MOH6jRltchvSc8dtR95XUYMaK
zbZUz/m1uZ9bzZLWdav71TDNoe2JUI2Hom1dmBsc01Gilv591Nt5tR4n984PmOzPnEttKb9uY0+f
bDn4bn/aOfN8Xda3B8+my6QG3IxsJpt1c6Jtq8f1+SynPsfVuMn7eQcetRhxFQNBEknca6fyCw59
fPc183yGrhC8Kx7nj2/+b1Lbmv+nfZxwc+B5ffDJcKPsxaKXNk3S1tS4fr0xS/yptdGYhaRhnjPW
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
EL8tqTvljt8/N7xqmgvVVYMK7t5V30a8+e3rfuPc/EdfDmnP1dgY2x/+cqtNurnlxnrfbyLBTMbt
ixluy7E4orp8qB/t1X77bp36mrXFZn7avl/r/eFjvHfW5IPY6LxKiHGpHjnPvDa337Ka63Sdv34x
udda6WtN9j9vttN16Nbpw3yrKf32ajIiw+RDSz4lVzT5J/rfjFKpmWYTQ6sP+ubLZOzThMhrbcs4
PYr90XZ3JKd+pnZtfWeZs+dD8/D0ZKQe6924GS/O8PHV6sK6731gdX4S4jZXLhWSu0vcU0de8znT
7w4ehVh0vQN0EJG3vc9dtPquq+Duwatu6NqzMOftF1yduh5s1T+3nh4WuxM209XL+e6b9/XFycZ5
+uoyh+ax1hreOkgLmQ8y1td7rl/o5R7uk1lX1vzPiHXkZeavyaZM4vj4a6muZXSdgwnBnWvppg2b
b7Um0XiIPaOM3zNU/GVS4+HJ2/rT0n9eJXMil8ZLHr/+11dTJpUe4bpvsdU+LXFdPkSs55VGIzbG
3RLFMOViVZXEg3jR2utIb+crrDa3aP9mW65gnxubV6esvzR+huF/Hn3e+s20D0VhqOwaJg/N/RXv
ybQ/Ax6FWNtyCkCHypx3o7raqdwF+xDTsOXlYdA+QmmPo9X3lf1mb++sagPz89uP1u/tBma+3huq
yetU8rP+M+k4cX6MJjDe5abWm0+n9cXNTWJn2f3Un5/M9ks+ejHw+XTVm5i5HFXZocxM2a1iK9G0
2Mfzh41ozvvX676k4u5jDoJEpZqH/nrxnJ7NjzcZ+uIy2+pJ7PuHzcyLeWirtR+rITzNJkazV8he
rrW5Dc6UNdN0cfNtciFZCdN5Kxp9vZsSt+Hflpq6Kleb8SMnX9g9SKZiPn6izlaeME2O+t6fz2Mp
99UwDIMPHrUooaULRWiiyUrcMk5D1eX7549LDh5j6PaqznpWoX0aXRxWTzz34pN9xsv70zidmXn7
L5+e0GPrtmf6sqX30I6ZNiVxe0zdFz/pdIwPd0Mzhz7pbswO1tdfDvRfRl5uP3oZootM7Tk5s1tm
fb1g+bT0t/c+Hibbw8ZHO7pHK4z1W57x/VInjdi1yWOrISWrM804umutfZ70VMMzObOxTLRT7E5c
M6RN0oYlYL090pokN9teYWUaXdc8Fjk8ZNIc7kyvGyxKze93n6yf58SpHh1/9Afpvb1y4uMb/a9v
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
FvK4WM5/y04fO9wqN3ZOrT9aPz/a2bkkt1MmbkCkM/ZM2vUGPrZi7Q7GxKN72p/zI5SvAB7FaKSk
6QTJJHUzDO+vf1LfdNUUg+PyKm/vcZ8t5v3+pa9aXwIJJp/fS4ydadgWOejf7A7Rc+Nwupwqtlfv
OZI2bYi+2rol5Mr2MGSzQ1PRN9fqYRWzvIfn1Dj3/Isv79eX2d24n41qZMt0XNwfd5+WfNjcmm2p
fvTrL2MYhrdsWsPPt/vdaVxZu15Ia+V4d2vZq+fKb0+FZrQYjpl/Vz3/m/fLVdvqfq5fhf9W1wkd
mQyjmuxK0vAO42X647aPxsh+6Eiyh8Hjz9lNnS4PbVqMzVhJSn6p9NZ2MLZWdsGnV9rGHrXocIkD
HVLJzE3kFl5+nPXY6iic1+XB221Ic539Z2f2N/TFQWfI+fs+n360s1GSCYyWY/0bYtuu15gT0RPx
VvPEWd9BJFvX+vaJM9vZ6/g5FT+m3W6euTFMkxvpYzOOw1ps39ObrbbbiBBCzMwcdB9Msdpa6MEt
4XivDC25SFs1NtOqcu1Zi72Ob0Off4f7a9FJUt26jTmmqpyb32rW69trstZ06sTmsQx2TukhZdoM
NiWtc+GWSy1Mv3vBu9Xit/vONL6X2Hy31erjuW3qYOvf+eJZf58TvadRaR1aLLLpjk5WCSYexVhk
GRVQIUzmbut4KijvL7Lr7Cqvzj3GaeXvzm32/dt+2rr5S+PLunR3zTIhTpyYy7ZiqbPuW+L3YRzX
EyexZi/xur1rv3smTjY+DhykJRDX7Gz4W/260e2UzCsye1PbT6vQ6a/poTmr7h2NMyh6UK11vx45
xZEZjF/X2Zd3tcywjfpwX2USI5fUo17fVz8eZFWH9fJxwEbzSZZJWn6RilbVluSkLlv39lDa03id
tUxx2k5vPslbw9vrr9KfnHaMAbFRc0cfx0aeX6WwdhZfaK5Z6mRm6vtChKqm3hN2Ebrh1i1PZ2dT
AACA6AQAAAAAALeRuwokAAAAflVq5RLh6ezj6+Tl5uLp6Oju6uzr5ef+tChpHaNS89/EiYfK90yX
Hx4u7PGsihU8VJWH9vyd3a/7Ifvu7bHKKlj7lNzRUPWbNe2iJc2mJRI09eXjxBAeuWgcZg/SbFqi
bzxs6hdKg1Sc9Uld2+2kbF329OTG58SvwwhzPj3/4xVNbwK5M9WkxJ8PnV1aDi8uVqe/Leh4+uq6
/ytEz+up7ODh8yLP2bYZ5lYDvX8sS8uNseVmXKzoGLjgoi6VMo3pwxrGnAfsb8SLnYud3dWxs0P+
XD48fPWvJ26d2Fwb8q83cz69aP8YZdn6vh39LIEobcPNks2cLgAetdj4skOBSG57n5t9YURGl7sP
1KCGhd06zGfmdgL+3T8dcPZOo6qTD2cnBwFVUdkSy+K3uuPxX6jprRceGGtntsz+MMdzietdc+sT
RUtH27X7u+WLnwwP50k8H0m/+PQXkQhr+9Tk+LqxNN8Qe3jUDKPJkkr2azSva4pnmrj+9/fZbS76
vPwq/LYma2ltr7LI895eePDJ3G/XGW/p3TDGX//Knmn86i9b8yEYR+BLzxjPtdi38K+Lp3X0iWDM
qW/zxXi7kZaKlXa6vtt39/o0Tax3R+6qyemZo1Roc3EzJ1sXb0wbXdwvAB6FGGRdEuggFkrctvv8
nAf5erQXtr2Ct/d0Pzh1c2G7upt08eJ+tZzG6+NipDulNtfGOw31j37u/nsSffSZj67Nxe1x82ow
zndOSaX2cc60/aq39/F0OYVPNvqjzemc3tR6r+fvvZIe228zmHaS0ZaanY9tRkvlU83vOpyHb81M
wtscVy3mcvmokxn/zsFuj0YkH0QWLkamV8NDSUYkk0w/52R8ZU2jtWMwZmuP7TwyXz9Ol1Xc0j8x
ndvVeczDQYmnj8byiRPJH9/b0us+y9bu7O7Nk236T/KaLVe+LO1di1A0q3FxmMv2yGAWHqXosD9O
o6LO8N05n+LQ7c3r5+ZDPZceb3tw72Kc+s29i63FN/yTYobl3jmXthAGHKXdnUDPrWKWOm8z06T6
+3k0kq9SiRF11SxJMy2ajql6DFl3q0fjYmU+HJn+CukKod0j2r7++YbW4JU00zCDPVq7et6I14Wr
ddNy46zl+iPz0ohvbj5OsmXj1S01rsjz83Txy0n29PSnbltJfDyOdcJI6U+SlXQ1nbR6GKyrtNvM
+aVtUw7a5K1Hk4XkVvMS2/SWhnlRKq0ztbk6eMnZ3VFdSR+RsHLVVbOkGtPU0jqavRwetVjLWFMN
oX1kmrpTn7pqqH5x8+qzaWvV5d7u07HU5vZde4jG2rNww++w/EF/nKHPnzz1Y8tzxOnvlo3Iy8ls
5+htqZp+y/dtdfRXzdP+RNp2/OMlp2xciD1qtoM2osVg1THodSJj2ar32/55rDVaIodtanXMbuzZ
rSZThsNvlpaNfTH263D5avt+hczJkdtmX8n0POdfHszTV+PYcmPrmWKsFpkt44/0j7m14M2erfKL
0zFvH9JGtxUyeaDGQtw4sZH+OC79oOW0XpxdaNzk5gC3mWOyJMFm6/Ph2DP7hinE2GmtcrZFl7dn
HrVYdAlQSqqD3FF8u6vdCzZic2yADu7eVVfsOSZFX6v21zt3bqj99uvez/TPSvWf2rpciIGrbTZ2
b/c2z2zT4/uND8xTjDpm3R9jPqtNOzZtkczVdApPr23x4nn+zVTGdFI4/EJKajNMYm3c+NuXqW5h
yT56BZVP7fWd47vVePM25LzP6bq235pf2HVp6ZBp/lP6jzmNwBJkD8tkZhrfGEu8MOY3FyRVZsTq
FC2DrdXaXZXOaB4tp0tOnf9oPJgl2iwkPkq/4R9N2sQ1q5snBonu1LD6ghq1Vl/ENZbHPq/tl2kA
/pRotGhJiW4aiZTerUUfdbq99OzQVBUZ3cG9y11TbamkYl/ejMZ/NvtH20tnD4b97vii353pddt0
vR1iRhbVa9nPx/X+6MLr2o2dn/PS0E3iquEn3SCJT8RmFoKbjSnXntI5M5at40RSWnvY0u/m0b/8
ZA9DZmwap9fxZrOX0tlBQ6+xr+TL/iFvh2iSe9j+bA99N4gYgd4yM3icTM1aeje3R4s1zTMbKoGa
zGBcrLXcpsxlGLkfnfW52NLL6S0LjTVd5ORteexzpy3z9nYLUev7byIGyVxSfs55yC7JkQyZweeI
Ax6lGHhVFZUQwiaDucnC8/hwuBin08112moPHrxn0/dxfTRZROayvf0X/ms5Y8Wir4eIHjt7NOC2
sye32MqzOqbzlXg3a08Xa9MnBMmcPhVH0yJ16pneOrb59uZ1uuP99UW0d2s6m/rajHW9yQU9mEuZ
Vbf9tvr6S5vh+qwN0y83z4ZXs74pD1In//VsueR2Rc0TF5348XFEok5KGb5GX4wosn0aEX/TXU/W
CsewEC/DpV979jU6bWrPZVttv/j6dj+ev/n2tt7FejNxNGZ2bNr02n5eP0z1tljLkK49lkTrtMyG
VLx2HpUYZB2nlRYlcje9UeJO6diy+uAm6woevH2GzZQUtpnONG/1AQvW22KPXXCP7Tle3vJp2yfp
5+nX5t14cdVWrifa69YQJb8PTB/rmFUX62c35u04Z1gTfTMeetLiHpZWHXWK6w7YxxjPz6Fv5tFt
15tp80Sl9QwmA5XJwrveVy1oILU+m/P6Pvh4J5mvLuSzsbGi1eyFJBK/Xm/J/bKrdViabQ27G01M
4/weU1N0+jIspE2aY795w4iWupx97U1/fJb61ZfuI3dF7rfcGvcRq+QU5XcYXM063CbNDCszJq3d
AB6V6HAZUvTaItfWxPbqn19tWisd3ENX2x8+BGYu1wenVsPW//W1HJ3OgL73x2Bz+2G0P+3dZpp4
5iBlj8yTalXcedqopLqmXUvK6bhluDnGq4+9fuHzao8Xb99XvcTuJw3d7ZtW82rzRj49mG/Jaotb
sp3vm9/y85WS/TAOaYear5YZ/5v/jvwWzE8G00jRqU9h+XrZgfxknnu35/Ej1zmzVZiHTQwdimVM
q4mhtHPbyZtsTNbCSiQsJK7GJSWx0YP56WVhM4GGzcvfDF67VfxR0xxuZPhc6LdMjWnV8SBaryJ4
zTF43vwq/qToaOYu6NhUkl1dt7r69OGp649v4rjq9vhUXu5drgtq+dszRf+y71Q17Y59Q7rpzYbd
xMhPYo9FN23Xm5Yzk/X6Yt8Zk6a9/5nCdTLamtykji/2v/rdj1PTT9+eexQP9lpIy/px2Vbb39a/
OWN9a2wyfpwcnVXHoPn+Q/um433a8qsxFYIl/D7n133wJL/+djz7164fd6u4rG09SqFzfrfGeS3U
vr88fTF4GDeGRzdGWpSQzWbju745sT2z1UzwnbShvqQnOxqny0e2f87Ntelt5uvhdD7GXNomqhG0
mtRQHWOQ8rhYAB6lGGhdA3S+MHjbaK5dt2xZIYTqavcPK8fu4v/fw1VuXK9h+uknyxBJb43n7Fwa
e+ZIBw/3khJb++9HcdEHcY/5DG1vr/4+Wfv9te4qv11pyTjenk+aIc5tTJK6cZ/zyVTzUeyqXhfv
F3cyOf/VlizmaWphbSHZ8ecWGNxOYrpt2vX3s+l7l3T8ZxxmybjCrw7k1ouY6Muel9OnVd4yo1bD
SIwctKlkYb5WeT9WkMhj5kq3KFVnRr8fa6S5OjB/LVvPHJ/GNpJcxdx+24Kut+nSHd4ruj9WNgzP
OGtj+5J3o7G1pDdNclsehZh5CbSOErlHYY+/FoqVbz+oeq4jW2+gKpQPrx3kXpI7v+Q1PmuTuoOJ
nX/37vB2x9K09rz3bZdDr47UtiZXSx4xSLpf+q3nkhOJJi7qbdjeTHSnwbK62z7nuV6Gx8xZLOsH
D3qpua+piRrcNrn66W9I66FF0tt4/YP+s7J+KfPa6Dq/1z9p2eO1ez5qm9gNEl1SZLOcGzanu6Id
y8nEGDMaBt8cDmtJbnDdU2lnvCWzRnuGoebzeVSixh48rXRLDzHk1dZ03x2PIu1bEanHZ7o+C6df
2j6V7sOXZ3c+q80wb5uxrOaq+7SWUIx5HqUYeVEcxCcOwtHb1mZlcen9S0/18XxBt3toD+GL2XHq
2d9/W9F01c4iO2JdnK4xcWOnk9W5hbg7DFy/GJPPpdt5Yn3mwVLZ3ly1ec2n853tlrY7X6vRUw6M
3D0yNiX9erGJe8J0e154r83I6T0/TT1TgxplczUy2WyeJ5vsEk7G/OWe9o+vIfQUa7U/216PcUvR
Idis6qM2WsLbQHp69eQlw20JsaUoribHaZNmt32Zy1bN+UaqLk5d/tjLF2bvnVk+/HjWF886YH/p
P8et+dRtjPz3MWRIasT9bFsVjShhNJ1DgazpHNUBHqVoshWEmxS66WTu3mEaSk5513HxyNCmLg/e
fsMJgT/natrd52j0R2+e70s8/oR/HZOyu0iWs0aSZ8Ibzjlvq61NzNUgiXHkaL+1dM6Q49skO7MB
q6qzPMvBIF4rQcyfYxMd5JVxrmhLWj7Q/h61hMl8GD0ab3HE25DHRC9/acPGk+NsbLaWJL1IzcfH
qTWTKyatXRpak2fSnRstqv3rr5mY6a9vVyWsHvquA4cON/OfsPdt1PDJuOtre2vD7QuT7vl44pKd
1O5M9m1vyY2B5exyh6f/V/P1fM587jbfM3MJLXTNz777YWtUXQAetdj5hFZbkEuN5umYX7nz/hQX
9NPnCrcjMiboEMq75P7Bl+zriE/+YQ6/gs+1zc98Led5atDkR84MOrK9Nhf368CkEUmUPO0sH/rN
EOOPdkdLpFNums3uR1ns17/yuc/5vt5IMzbDgWlGGsTMXF89bLRHhrNaDCycdGXmEHvtpZzSjm6z
eVjO+VLcqiZO3eYsL01NG8Pgq0vzsnYVIx38zWqdv4rY1kmlezCnYDzumXF6RsKFdl/lmMGqJ4Ou
ErKku3Lps3MPd3JA5PA7lqntvnN5M26cvsgykdGXRNzqAJWqLU6SatszUzMAHqUYeTMOs6ugkNna
l/3Wv109D+7e3k7vP+XZg8PtYf3h14X9mp07+/hXTrYD2tvXjz5xzp5XIz89/FnW2vxkaUsGI4yn
Neuyf9olNWLqP4z2zmst/Xnpre2z8+Xf26RMdrRz9RO1ueMTE0dG40NPR8RT+qxh1tqzh/65ZQa5
mdeG7eNvbvTzn1cZmdfrGFfI2JUr5mbI3AyvmJsPWW2nGq+2JdiY3goMM7wkvswMtjIbaU7NqbVU
OktkY2UZuun9eHqcq1teX0cOuE7I8cWrV19mTm9rv8Xb2amd6gUyXU7NEsWxRh6VGGWrA/SOnMyd
pgvGi1VHMkqLt7IrePAutztds5oQi7u/KfLZaZuvLybPpZ0t9eVmaiO6a5cHqTZ9TBh6fR7MOCFc
v8T+6+OPT9mF42J9fNNs/jK8f/4YJfndNn0k1t0Pfni9zsi2bWsnURvnTJOQtP3jNjybmVYnjdvt
93duI6vvMngereeTufQwzyznDp7bbaPr5rGim3s9WQP5Ob02fHEN6d7Xzy206Smn7tIYEXdjEl2+
abq1oxBy5PyA4bU4NpaE5AtxX/YSTKA7nTUn1T18aTX38vx8msvYzOjRC2xTXZLpBk9nZ1MAAIAM
BQAAAAAAt5G7CiUAAABSFms1EuDp5urv3e3k4e7t5uvo6eDn6h6lmHXWXbXQPtCDqW2tufkv7qhX
uXuXzDTs1IrT8eu/L+/n+gWDU+7YlavHEtojMTb24bcn4xMhGxqnHlkXj5Ljt3VIzGN+zq234aKN
d0/otRpXx43k4WrzrPEb86a758ayqivDZhyyiTLOSi0Z2XzNSJKwt0NV3+h2lZjbQMWyG3+vpcye
awVD7fxdVs2I2dQYVuxGa9fnG4fuhtwyw7Vt1JreEvN+2yTT96iLKrO0VCekH2Ajy9k0H4/vMj9a
fOFRsmf7ifHcACP1ibSDs2VuJr1qiSIupno70gf3GsIKHsXY6eoMCIUmL3qnjj5UyOMX9+PyqLm7
PXiXxG2cuQU/Ut3N4RK53momYI0T7bMZWttU86j9jt2fLrXcmQ/S9U8tfvHbyd3NfOv1cBzXbTbS
n3YlwuaQRnv7ZO5bF+ep3aP1MXF3OcNAI13aukbNrhWz1tb+biJBw29Z9iMfb2P3r8nXx0riYHEX
acfo60ffpBE3NbKdyUYnibTBjBPE1N5xIzG9VtNui0fl1OpP3TI56n9/LTq6c7MDLT7W+KDBKovJ
ZPC04bLT7DzpPnV7X1c2jv5Y+8Q8s3WeXe+IkqO+mmir8M6zog0epWjQMgdRFErcOLmtPP74w8WF
QpwyVLl3GZES5lr/Ga/+p1xcytZ4awvx+4PdupFTNl9XL+3Xg370IzzHKZwSutbp+ngzTZLJAX2T
g7WSp37JKjb9UVODRCMZrpe+WGL/fuByHTWN1L5subhDu1XOpsOYz1fLw159W297mm5zfns2b6ev
V8T6PbvJ+91MV4stLfkYG4mZ35I9DOtgHdxscbnOvdtOLd0zL23nVnm4GLZmL9fhk7G95EY0ueXg
X597l71bS9q5lOXo6PreI13iPW5qtz8t1UV0nEQnvPUKJVYj1LAUBR7V6KCJQcUgS4pvWT9+0byx
91xYv6ynbS/v9mDOyjYtGz6dNq1Txf3m3qJXV0e3D9443PjEvD/6cbb6ZJw+rdtOL4u6ua9OxUh7
OfVj0g99aF3bn8OTUy+xzZgxLDaNvspsU3Ux/pGY1LS8bvjQPDhWQzJand1J5Pg+Z756fbXab3Gs
hmFfb4YhLQlxf+rNkofFNN77wv78dpo2+2FMZPNGLi6i7RUii25WLrGkXkSTE4mt88mlcdO9lNSk
Ft350sfr92XWIazGxMXbbpZ1TWW//ObRasm8lv9dEafx2r7F2vFZJxVQqDoSWx6lmHlVKagQNA05
nCdj6zx9Uz1Nt8XudfzR1cG7mrGjuOPkrvvH6V71FoeqQU3z3ZurSfWodbI7vnVwlrLWTP7Y8JON
XamLOrNnjr1VyFGfS53bhFRnpawflbHh9CBSxvtk9+mq+lnMb9atN03bbE7778+Tlr7pcelfsOak
OXbynTK4+qJkNem6Ft9OIVngvU03mgsROWmnRE4v17Vz4D1fnrtO2oe0NTesYjXnw7YvW5kh9y/L
tjjWF2tfpMXKctx+96tw/pOTSHLgZBLTUIfPmU82tn+ZtgxM27Q9m34z2k0mm8ytVxq1meqWKfYA
HpWYbbMGgJ+1rMFtc2431xdSuZe3q7reP4/Tzy1bvLVf75Z6aDSS+hvrpXeat8nfdatP2pmf6R9O
lRN6mPeD12Rj+sVxiSEEm9bpZqvvjRiSt5rLg616r26bXkzaRGRrMUP6OzGzQWWCtP1ZRqaGX8Tg
43HQs8QjTC7lLRU97ry158sNadNKQgvzORtvQ0lmT3tP7H7bSLf8VDokYUg8jL6dbezoOpLoSJif
rm30LfnN0mMxB3FL3+021f1H6iMZvLA1n74uv4gPF8YkyTgZWCYjEW7TdHg6G7f7Jm8etZhplUaj
eV95qWcjfr8Yrl9G9OPTVOwPOigv9/ZU++r7eq+b13yTlhel5XR2sKdWnup9NBYONU8e2K/BHSMf
pH13d3ge6Tr5FY2M2r1nQzJdb/mny7N1WyHTp+X0aeSU4XGYRqjPw2Z/0MkPiJSyK/pwV6KsUvOL
fLZk191/vl1ur/N7DNHrT/q85fM/V8jqbHmWsOy3KbcXD19l7UdF3Grsbbec1cjcrKM2l2YOyvNM
+X0Z3pptOLBdfPpRpxtd5UbvPxj+6GnraO9wZBw2w5F1/Wvbv//+fE5O4yn9atQQvYXq2iFO0/X5
GgEepVhkESNtoeXIMrP50hfWDsdZHjx0+Xv5JYsP3uun8d9vJ02Zl8dbrj53siXm0bXfYf+IL2Kt
ke1rTbs5psx2f22xxIyY8bu46bav4F/lbuj6No7ezI/Qmq1K9ea/ili8relQ5tl+k2vz4qnQ95XV
3kUzO83Vy85mx1p1arcOj83D8BKDFTblYZrTjNk0je3H6znW9NYPf8gszLGRbL2He493qaXZ8ckS
ZnZMnxiZzMmyKn5zVfYxP4rkkpD1/UbfdGJ71Pfku/Lpie9aj9uIl07UyO6GGW06sypDoOBmJMag
LQIetRh5s2pGEGfMbL4YX27+VIfyrkZR1Q12QUvsq+Vn+/ber+G+7UN50Mjj1apObLK13u+6G+Vw
6s8cRjv2felCJzMhc2w5od+M6UqN+/x4s1vudKebtpHZSxc8nXxuOhmZJu9TmvvodW9yVB99Dicd
0ou/xjx2I11vLWJ0NAeDhxFBm+MTu+QGEa199dQrj5JJnJ6T6h9+6tXeYsY4HEm13jMLtD5rNJ73
FXF73xq3unbruNb14ZSUxqaP15dg1MdMX5oN5vmtgxC7KM4Hg+N2Zj7UkthVJXaNNaWiqR4r7RYe
pRhophzocJFM3LnXvV46nJsOTVXHm9PG82gv79rcLH0raTyn0RtbFaPTq6H2k91kGjwFvbt9jUm8
O93ui3LBYkyGuLf5MWeU6dxug8mCdXavYpivYFtok87XpLm+Ht4JfsC6zfVVeT+53l8P/I3m7obB
6u5jvBnT8bbesKjF4prhObzysdlPrHJvX/Bt3keNQbSPa9mFx90+L9Gw/s40jDcznX117etn0gzX
q7htO3bTkDhSLdPQamzKMqnHL44R42D+OnJikjjbSH0r/cHgnZ+MXG/feuS3GXanJbVlMu94ydNR
iZ0qfy13bxEAHrVoqCMOD5tjkcSd4uH5y/PZWGd5O19HVAf3LqPDSt3+10tcfpj+/sjimPe0dsbe
6YcXtrlgY1m3TZO0RuKk1sfJVknaXFn66Ijv2Xk8LWlufLRtkC/jxhqNjpthVQ/PHqTZPGl08jFz
P7pJuuZ+yGA/9Sv0PObVpzY3F4nEm9nJzUlk4Sjc7LqRPxmzZitmUNN/m5bFaLUzr0VjHKOGfOw6
/n0YxiaswhR5+ZHckxVrD03jzT9VE5tjJxd8+qP94aLdB5e4/S8kxDpGb/S1ETM5/nTW3Jp64pix
Ph/u1zSvavooXez0tinWNC4GHpWYZRKAKh7IPF2/u1wdlfugo6RqqgXQ7V7t4daRYpdhuzgfSvzJ
jvafipTa6B3L5/zB9MX82Ppu8DZX76dCMn20dWumDra90XJ8eL8+8XH+tzZv5OiEGCMcrN2JGtOF
SGqK96kHAzp9/uLZY5+DhP369F5iNVgaoZn57WNgmz/1jz2DZf9Dreoyt67ehienPjb+2odzZoWs
+7xREv3qBaRFd3NaNsaiueVmaCKG779eTn1BXLsofSeajOjZ1RBvElhfFJo/OXXfzQ8vqrwrH+zr
uyWF0ayGisNlj7Ih3nyVJKZprE0epVjLZtWg+rFBYrMLDY5uLFTl7u2D7qjaG61sxn8ae4EFt7J/
+treAc2BaUsusYmfFm85mi86MZ3+zeTy9ZZLv9qatgjjyH7+J39dyv1PXkYYmYpJHelYWsq0MVE/
dp97snrfN0vWR+w0m1+8BjmvM2yWdPTwdBoZN0PqazB1Ud/9+5VWXRt7+DnDt23YdM268nRvKvOf
rBnbMlrRwNrP83LUZdVLOtfJiJsxfi2jxpzXjW2Qa3d9qz9qzob72gY+Js7OdXMit7ZKv3zQIP32
D/v/yYcMcv9vSEPy5MnIkGR66UQPI81YIt0WHoUYaAIQWyCk7s2+c1fx8FxSMr5F1dte7mMWoJbY
jTzTWi5oSTp9HD/orpR8/3qxMvCqn0PPk/GflvjDb2LD+vB8Fr3YW1k2Nk/JqYYWYyNWbzsKZv+F
2VZ3Nbe66Lu75Xt+qSH8ef/HzXZezIHEGq9I8j9LPI/qMB+12Sn5trT6sIr3sXK6TUu2tKe4iOhh
/y1vqZQOLxuWi1r3wtm3C5vGBdfjv+8VA9cq6bPoHmYRN5P5wn4Qg37A85vxee/m2HcYmuxooRnO
Tmf5ifjto2mkxDFqXxijndhkGRvWMKcP7WE0qJh9Ah6V2PiiRqHEEBmkbj3P998X7udQXrycPd7u
7qFWlmmr3/Kmzfvy3E4tRwtpr4bLzrHPHbp5oi6Kv5GcLOSrN4z7emJ1lqNQr9bmbjvvvCqp4USb
EaP+ZHX0/UWPcvr9nP6VU74sN0keV3/jj63pRZKkxK1lvn0axfoKY/t1kLj2uKUZRp7iFF9hfoU7
WWysrZMxlU6LuZFdRdvFnHmbLb4/D+mTDAsVqlam2iVEY/ZNQpL59reVXL/9ZyxXTyPtPTsyw3Vw
+pCaQLtv5FNutu8ZB3biHsUsWo+3TkxVL1FkU/IpDO3cs2kCHsW4rf3mSUS1g7hDqZssXi+eb96q
T12Vqd29QgXqnKam9DNFfUjgyq+ufDBZf6gfayp9PQjfXnxkJE+5lvF1Z3kj+0n0akNq8TPn0muO
5mPBuLFaxf6QfbZ8XXzz5cJ/XHUbc7Ztl8Y2YLnvZam627qZ23hFhEGkTcdNltdM+71Xz/j49TLI
eJ/q4784zadRueg8Phc6DsoSo981J9Go5GTy2Oym4xFpN0zPFzlG0zGrKX9PA/+/4vlZzOmoT3fN
tfNP8e/jOXxnmnxpvpZQmk19g4txAbn7MBMh2bRaLh3+hBh4OZsogTfJ3FyL+c01D73m8ec2qWr3
LrftIfU1x5aWndMvb+8qNjzz1driJwZaY7ubySdOefziic/4wxLScpvOxtWI5POdfMpNPT5GaGeb
myQedY2B3WR95CZ5/ferGRL7HBov9q1b6bhYj700S6TvzOHMhZteY+9fDbXq1fVU9GCauiGp8N6t
11fm6X1Jx/OfrBrnbasRnlhS7u2DNJ/3KBbDtDwvUXu3XYIEmSzR9PYG40YbEUtClru2NMfaWCwD
78qW7yQ7LycbWmkmXj2lRM1RtkaNlPe0cn+Luk+iZb7FHZselVhsMSmYbpEy322K6ttz86/Vquc9
tEN7t3fl1e//n3Rb+9wKufznUdk2S/cqGS67Lc3aX64+YXl8vC9qxHczuTppI4diGyFm2j2K3Ixj
2pl3r5k+DsviOmLtbWu3i9cw7jbsWNm7LZttsGOWuZ/WSJi4ah6tHaytN/Vw4iMu8bif2i0LSxcb
+yj9JwpVtZaQ3bXfMK3BvRrPtusafkgTo6UJaZM3S/bmQUwfl/eW3Y/PuuRnGvvjw8aNEu3zPi0Z
p32xOcTgZGFA+lnaLG70+mS3f/P+5Wvpb3SzGIZblZHPsZm4q2WsZwBPZ2dTAACAMAUAAAAAALeR
uwomAAAAPaXrOhLq6eXl4uLh4eTs6uzo5evm7PAetdjbdESo2BKkuaI7N27w217V7R26AuRTLw6J
yfHZenevWG82t69aP3Eltq/vvr6r0b1fG/Shdd2xKF2k3jck1dS++5ZbDdLSH39nYxr1ER4vVO16
ndSIdSNO2iTHHzW7XKNG6xPLhZqYeiOLxfs2tg3Dfr2Y39S6/oy+0jkjhsGTsxmxFVEXXSs5tZ5Z
xXM9ezs1xGyNSlsMczd6a3UtvfbT9rCXcZm6XqeNo75Tctr7NY+TuLrRHqzFpq0NTDaXlsFXj505
tCk59SqFZnt602Z+K2nmASvLtVvIiblWFTdXIbRuRHnwdAIedeh4naFbFC1ym33b7rQx3Sv48AxC
6YcP33PX3d+9e3xD2rElI7m+PN51RerELnq3F4Yrlk/bXj+1O+072Tc5Jd2/nrczFmv+Yxmes8MV
ltVzIubXYer+lp/a1t++Zq70YT4MmyPtq7e3dL6wXEpf/yRDt1wZ7d3Qmlnw6SWH2k7jvI5YU8mR
e4Y+6xJP4+yUareerA97ONri7cu+jptvwzVNy+zGzrF1Y4Klhq1hubRm5TDbuK/PR4nN2d3aV89t
Qyp5q5SQqEaXmWydxr60nPx40rk0MXI0fNU0pGi18cyozb7vSe7RTx6V2NhCmWqhKJjmjhuwsetv
lAECJq/gHpnt6FyXNzvZxm/q/Vun9nlUl5llNSztLS7TbF82zAUWfmasPV6wH8qJKsPR0dpTc27z
73+aHv+Lv7gMma+194PwY/dtHFdmpktadre11zov1vRbP6mV5dTstvr1+/nvlIztq/3DDH27HLDs
0o02nFXXh5Duw5uJmvsm6zU2qvU76JIuVnvi9p771N7k9bZ5eEVpLbiE7c8I9iV542IbVk3MzTLN
18vYMKZq8tGP9qQuX7M0y0gP42zt+/GWvMn3czD7vaGrLbSUshj9vQMelVhspkUQHV42mTvt6cDr
1bfzJawj86CCuw9LoIy4zUoMwX491LIp4edU3Vxoqz2j6WnmUqNn4p9paH3/jjdt7a7O/fXeUv2Y
qYfOzcvWGZPbstHWh8l62m0efA/34Zwuev5ssR9lGhmek+8jEgfGRl3x2bPEeqNpxia6pSv6uS0Z
8v75ZORr291qTlIi57zk1lv4VyeuGKG96uLX9RbdbWtbd3xqiaalKk+SY3+4W8Rjcr9Mghh67ffh
+3VeRjKUTDaMrs/Nur/Ndpu/MT1V+qYNGkeP5vrcnAQh0pXFMqj0tzMCHoUYdJQUUZFO6k43dc2W
Pl9Larvl7hW9iaC255LuK/7qh7j5NicHewbx11WXv4qe5uuz09en5+v8cHtI7D4t928aqfDO9Ztm
TMRq+mwbnWrG1h7slnq7+pqOl22Pi9mfYqRZ0/lPSeJltemfxC2t+eO818+MmG1+CzHGsOdbwnOa
TW2TVfz57ToO3awebVY9f49YjR2pkX4yc4/7k69zfra9ev5gaTlbJRvTF+J7AkmTdFVBhhiHeGi3
PmXJnt9uF79a/tHY39I5nu1a267bBjec7K9ukpEjvvIo5z2k7fn4AB6lGHgTA4iy8m5punn6UY4f
qovFy+Pdod2Dv+bD/LFDexO/s2P3NLKjjw+NWNsvEmOJ2mna9iJrp8eNs1M7MaOUane3c/62Cbsl
+M1krI+3anbil4Z1S2xabnqydOOJdiRRpd/7vqWdSNaqqbQyGmNhL2Mq3hTpUZ486vWmYvEkupDf
4/3z1bJuL98GPas9mNj26iP3NiXNWLFlzb9ZW+PjMf4OSeriXlPF/NK3+zGFe6++teV6b4xc+fXp
7sPO3aU35CW5/zDd2sVm+H6s5r8xnbuN0ZhTq5bjbXrVGx+91eAetRhoS4wCXyNz59y7Xy7Ve3+6
Xk1V5d7etlZfN113Yloh7U81/ux7NoZ4MY4LiaPGtTva29m00avTjFyb4VY0ysJFxpZNP/Ti4n03
vayaocbs6JGU3GyutxXi0LtqRvnS1rPBVo9ko2BpnZnYXR8THMU/nicqewtH+k+72LtxpZGptlHn
66F/umKes6PtNNXeF19z+RgxvGbpvdpk9EQ/uX3Yo/S1XE1sY7ydk6lxsDmtvqfxU9q7GtYWDV9c
dtecR/64ODPt9qVxkl/8t3/f327rln3pPhAloP5S7n2aFlUepRh1hlNKwpPKd6f5YJjqvuu747Gg
cgevLo9dkum9xy9+fcX9OhI3nz8Ta1lknkyMww43tjeXVstB2ZWb8zpbi1yYSGdwZ5tRfDYeptKt
tprz8brfn6RyTH+ft+1YVLKfhUWHViNjfZjdcGl4q1d4346XzLOm4cwlHtYs6BjLzR0m45bRMuR4
bPjGoYm8nntSfk7a9G/WW096lgYuLVqi/pjLdRJ3UrLFG2CUhclD1q1Zes2yZpohJhmxc+Oizbp1
e0+rbWYbVqcltPUPq+nvvJ7lZbEpsgvPBiEAjD2mbLYexVjb8kgzIspV1p3m53304n59VlpyXXW1
u7dLSGFtfKO2sMdzx8HTR5dFFt+zq2fjGTd2zUmDiwnsrl1NJ1tu9EUHDIusGX0keWZNX57rzTmY
xXHS4MGWtHIn63hgrFUjFKO4PKhtO7nk2tfSN/OeNILp9tqS8MTYk0TNtqJ6Zk8Y2k+nbdVU5elR
m5Ot9uvhCnN8WK17msw6GVdrfPi7xd4l74NYq+02ny3TnrRMyW19crQxOR4tnXx1sRwtn1P334me
PRnnfvJAZz37Ntwf11u4PF0i4f3L2LXPewEU5v3NMWgelZhlPUIITczWqa3X17vJ1loHdxud2mxk
d/r7957Vpj3yeVl5nT8939gaPdNbJzv5X6/qmeFNw+JnTJ+1EWnfX85lDZiFgTvsRndP1f8P57oh
La1GTWvMWgK5HsjueCc29bwR7rerbvydv7D56U1r4ensqMXbfRS90HNeUpsW6mGacTqePb5+Tz4v
df3VF/OgzJMtRt5yG5t5of7XXDJuw+b3MFT1i2ZptvK+ZBqLKrcT/XqOeWvJ5G/6fnf5QfgsldXT
fw+3QBSP3lgT/TyxE0ttrlTDwtZ7S+uzHKVqYoyUIsZxX0zO7tD3Ax6F6HgrJiUhX5nMNoc2uWj2
bi8P7TRu2c/54j+z4CXbZ+4tVqc7L3lzRjSuf/LZrGl96588MT2M3JFj7qmbbXf3jPdhrZ09nq/n
R7t1d3tNGW2v56cXmupmaRvy7YbjRvtqQGdjzTxoTuKVSIzbVAszLl2mPKj96bqFF9Yog7l/AsJs
8G31MERzG0kndWpdG07TFip5JW+PnDdptdt7UDdeZ8vXSjOKtpU1Vx8H75JPS83W1fbF349h+ikY
O28tZpmHfYNiY5YcncqePzxa+sPP/ayjtN5mm4zREIarpsS5TvaOZLL6sSTlIR61WOs6ikKLOjDx
UjzKh5GFy7dV4/m8KiboUO5dt+s7Vq/54x7I8nO74am7d1+z4xvWi8qkcDKNdyctf1ZOqmG65EL6
4w3u+GK3XL6KmgdR3jzq50eR50f9OmGuVG30jm8Z1mi+fDKJ2TwqtUZXo3W6cp0z0fVD40bqwae1
1k9u+3VQRgnT49/Qpvbb3qZx/pof1t7dqO2JGcLQQ9RpkYp7Lpa6aPKFq5K8ovHNkzIyHrZf+xzs
tqffNs0ymU3c7LBb4nX61tmMEzcPfmbk7A3fjZnaEz/5aMgBm5McnSolGYq4JO05lC5RIv8AHpUY
cGmK0EOsJxO3Pt7pztkrryq5sPIBc4Xg3r6uXX7bYujt29v2Tln+ki+nr9rOxrQsJQxqDatflQ8K
pdemOWvvgyTW3be5f6pL+5skI+TCjJ/1qGUUV2/Xt+ZjX2fS6cvtwvQJ8xjZn9LLPl+9eczwcA+7
mSfzgw0GDDC/idvG1FF+5+NtsUtX37a1Oi5sjPt5hG2WQaoaokad/UXT2Hjg3O6zmMOSNT5KP/Lb
+GZtx80Lq2Zq40Tqxb2NMe7m+R1LH++5CROs086YPjxx7U//Jk/r5R6aPdM6trg003tJWm8VhDQz
Ah6VaLRUDglybcls/fv9Nz986N3uHirX044/H9986yxPmd5BVff0488wi02xXbsou81Igs3VWcto
Nuebyee+3GgwLrSJkzYepvPaGon+aumE6TQtZmmnPZSQ6LRv0+0ni9t7Zu7+sBw0o1XkeW9m5qde
L3P1cF/9a/t0LpftPYiwTm1Ls0xisczak1gWLKmNY+0sPN8mWaZU5Z3F/tUwSHsyWNo+FH3IRjUr
Xu0eZBpW93Rdv97822ddzHxeKu1P0ozZ89v3Lw4Suo9G2BtvysRM+k73QjdMKkU+HWExbV21jfdj
ngEexRihCAJ6SRVO3Jnz48MIH3yebqbTEN3t7u2u+VfarNuJt4RQI/MrkZOJZdBbma/3+2rcD8n8
hPebOzrYJ3bybY/XvtxpdzbVLWupvhvGzExrXy6UW4t7MUftPpnYBu3bXz1mPacJHoT5NE6Z7vdf
H66v9zaa7lt82G2tTywyYmV+j7Yr44o9PE+rI4S6WTPHNUn+6anzEZO3vG3uZZ2izYNrU3qM+3S5
7BrSJSevLg/0x3V7W2Vmnh48uSV2d/Tz5Mwd+dGHow/SoqfXnmE1f7E2jTvJ+YeLV23v4WvY8jb1
k0AZMZmmE9gBHoUYeVUDQlGSudPUc33X9MTxm77cuR2qfJSpY+bsam7G5/lStH/1F5NS78K/dP91
w3A+Ojn38FQnTrd7wDN2fME1Ptg/cpDg3jDb6N4yUYlcnHEmmLpeo73DI6pEx5DQ+OVr+MK0rxuH
ZU9klTRse1PB69Vs2rikUat5MEasVae+8/ie+CoPY9vjU4bDjF5heRye54a3ZuvCbrQqVnH2Gtbn
TsR8KGP0cxDjuayLYjkWM4y6B06Nq2bme9c95L+nvkPTHfN2fnMmONvzSdtVdMvdYVxyfe74hmsj
1PWSFDXJ3U2+LLQetVhkMQNq6ALRbTt4u9r8TrM7lIfsbc1px/brmL39y+vfehkluqiNXXqud7gk
bxg3fnG4Luip7m9N4M3a+v650URjc7Ju52+5emlrrgXbtPT2toc5TGJ0h/4oOU5SjVW6SIx5M9kO
F3nTmURiRKKlm8vZssj563g/Mvgbf7M3sdakXyfRTZtBY8tx3zl/vNHhiS8brNp52TLDLdGq5aR/
4/gtZMiS16/h/fHDQ6XBcpIyr89d5eJHIv6krhfbrhlCTffPYVs40Mjxs6tY706UvzmMecWQdXV1
Y1zvpsbQTOw59nafp7aoxTmCDh6VWOuoAaFdA7kbcX9vHqsLe1Z8upj73kfQXh51ZXz0XM91c/ua
dYGr8zT8luL1Q6ldeVYLvWFvta1/6+RvRlt88bXd12yOgh/ZvB4Uz4y8um1cxtVtm7MLJ/q2Phhw
MMg3Um9LP/kB8aPN8Y/m+/Pr63laa3KgG9g1zdWr+4PZW5q9WemB4z2ZlnqNmLbzWebU1sLoEzfD
hU3L5/HbZNqZJhZzYtppuC+1tEs+HbbtOnbmbp+T3ZSVc63LQ5APdYzoZgy8tsW3IL/3tnqN5Z8L
/888jGF8LUNaNLbh1lWzKylz0bA4NUPOkO9udjnvF09nZ1MAAIBUBQAAAAAAt5G7CicAAABylgkV
Eujr6ebt6vDr4ejo7OXt6OPo7B6VGKCpm1l6k4TEbfvG0PnKRXtc/YRzxQqhvKub3MMu3q/xm2wl
erJnfNlxix8m0x0xrLOt5x68urf2xoMvvSVjx+Izts6Qh+/CYL3lEuS3zZNYp+fpw24Y97AMa2LI
NsdGI+1Y+mC1xNPpn/vVlolcJKduzVHbbp9lPKid4Q9oJWbzZkk2CHmq47GN6MTclellfWjJkWGR
43XbmtbbMPXgi1A9qRa0k0ebXk/27SaTVsy+wfnR2EyZi+7bDng4uis/MfA/b2b7hcjkGzdoq82+
/GRQss/2ghGMvrplMsKRahfMW/O97VIehVjbJADdTkbDtrX+xbUPseHQXtXeMqv9F/WC7dvXZbEv
eLnu27YorLTG4Fva4Dh3vccbWe5T9rrQ3/nu6tDmnk2bd3LbXI1frw19MU3XDdGTOyRau75Pzxtr
heg8Rdx+ksk63VpGruYQ50eyPpo92ivGshpj+1r6kUbLFF9mPW/Htp16MURuXJW0laZKfrQlnzhC
eDzHGIZxvj78NSfR+lCmOg2TYPYZdRedG9Wb4bK2/I05S3Lm5jGxqVTyh63GNGJPX/+tM89spm/H
B8/fGtrm9Lbs+W3M+PMVNrdkyadkSH3h2Wn5m5ICHpUYZZIEOtLJ3VYY9lR2bvDY7Kzb3drf2GuM
o9gUh/3Cvf3mQe+7R7diFj08Z9GFAYcLW4wPrUY4MA/WIgPjtDuZpklL6mm9Yey80Jtf7GSbo83p
QdzOyt4BC+lmo8uDt/bbEkkmJa1jumi8xJJ015N5So/X9+PZE+OVhzq/zBNd/hxHhhjyR2sw/0yQ
5Nbt28PYqHHynMx96DbNk/m8HDlv+3cfH8e3eNQdazxK0l2jfXQ4d2Ya+zqZ1zbiTm3OzV3Kp13x
sL3yrh36pjufSX4xfxt3a2Kb+dWGzZw/2jzaqkTJpYKsDA0epehoU6eADgYyt3R7Kunxs/dZ0tlz
BS8PHrc375svf2aX2ZrtnY0jO0sfxA7fOpEadOf5kLY5b/erx4kHZ21Cjpc6+PyyJql8H9Wrj54c
7ZWsGVtIj5s8fIT9yjpZp5MSdKEYflpfp9K7SayxvbE2vM+Z298jg7HH23R+G8btFzZSr3PHt2dq
4tChTtu+9dlq9WkjtNi0sNbs3evty/u1vpnpVDbCyc/R9jkeJq5nX23nU2qOzOX5+k2Cpmlm7W+T
uL3d7qvuCR9Zzb7wsVO39deTXpf923tZlRZlGsdeyR6fB8a7Ax6VWHRVK4JqghkU3i09XlWMjxzm
qfqudQqhPAzFhBqm65XdeJOHsYFMtbhIrItbVJHLq2fzJ+k7xz4Km29uRM/u/Mhux17/d+TJ/f3t
ylv++89dc+Ieyf2N+bol6t3k6p1Ne75c3ZLRdDWPdeX15PVb1s6nUot1Z+vV/qSbWBZ0b52tphTL
1sSxvE5ufXwc2T5Ffd4b45G5vuUtXvxqXvgSXLLdaivhyer3UsvedXx+nS5CknnkvzoBnrsxSJmM
1ZRpF+d9yPEsyuxGHk5k4XiMnbBqlpvN6Iszze4k5HId0VQJJSRH+X2waF1LBB6VGGUZjBYdknTm
zvXr7p3qkYbbqarnKncP+dvy3j83U2/ln2Vc2SbBro0l0du+OrSmLWt73fdFJ4NiL/jOeKLvxnDb
WX39hfFEhovj3Rx/+O1Cp9fDvcjh2lPeziA5HH3GPr69v1b11MeHPishpn+uuKs+3PtMtbLBasRD
/S7LNDLOeYvBMz7X2Xr0tdGgg818tWbO97fzW2uGtOHIrCmX811/fy1S7dqCXqTMr7bX/GSaxubf
8yb19uh7fN4sl8eT6ziTJ9PKmc9nmuybnzu3z40c/HhqxFkz3LRdn4xrrc5jPxrNQDCcAh6lKKHU
KYnhqgVTt40eXhyXXni9zlMcmjqE9nYbbMrO9rY308sMp6+n+5H5ursPq63P6Gy9ueWtRpKxk25q
9e25MRztpe6anP3e6YsbTXcsZu0Ly+NknJFfn6N1pKk+51v7HUNKlrGmH6XshgedHdxWNT/+zvOP
73/uF7dlwZ77Wno+sfd6UzcjTefWtbm4RuJqWlcKDWo0VaRIqkbF9PlJZLfthkyX7DdkH2ThCUYb
fzK8+VT5a/lkzBP7LszjbqbVaX81e+HD2MTRbmTX+pMdpbt+l/H6/UPr0+sGy/W7f28Mt9iFfNAY
izBL5qXuAx5lKHk1OAgtJeHcndun4az69OKx8s42vpyX0O4+AlBm1vPa7lNg7M0k+duMdf5/R/kH
b+53T3q25zwNHl9tUPYCttc6g8JHY4ztydhInHExlnhJl6ifzSz1z5HZdaRm/DG0HWy2moY5Euk8
Y+UNlcP+2NRHKmuxUb1TRbY8Mevho06vrOHddk/X2Zur++/tsk777xExWD99rWXz2TGT3WZ26OJ9
jWaXSqZx7rfktNyTV4zB1CSuYp/NJzdtzZDFwj1xLRTjYqx8sb++WppXnqY/eftT362RiU8M834d
D+Y9ZA57XcbmF7c2/AwelRitfzNa6UhKlPWleapj1LgRZ8MpVw+gggdv1xS3lu0s9f+xtj0UZ19f
5pdovzNqbVnT4amYdNrZvvMsrT140ZyZt7yZCpc9Tn97/uAWs/9puU4Tdqt6rd6ezZ5EXpjxi4aw
rVVX1d2vQ7O9TrSXVs1tvxysIU2Xc5MX3RreZWUc0bhzz+mmOd/rdG22imwm1NfS1ls6fjZC3VOv
V5PWPESj2x5DEPOCVIarNU+b02z0xW9be9SecfCgY7ekOzj3/vWe3cuP58/EZtogQ8/0oe7Lmx75
rbY18knmB0+CJ+4epRh4qYtedAuDae4esvP69mg6HT7XtxFbVWVdYmS0/udtT3Effn7C/HZ6s9t8
MfTtPwvfMSInB3bkflLjzoNt1PWX6Blz9btzVMi4braf0/xYERIlNAfUEw3vvPXrdn78Xs61TNXX
1p7M8npF+5ozv+Rg6iKKSKwcmZbjvJZnf/jpbRiu95rHScyUNWG+VnLM0MHa93m3/W3v+9UeqrRb
7OnRq3qSIXN4ZptVE8T7+K3uS8VoOVrrJpufPhfOXn4meOtwatAN4+puz9iU/mNv2U18sj09n/FH
fhZqtmpLyeCL2efATRPpHnVY8xg1pWt4kdvmtOjHUi+vDkMPgmqMcyMjZ0K9z6XCfk+WiECqt5s9
6OsoLlcZnj85veOGPm537NrZujrtyfQl/QBuRcr+lJp4SG4wpurx+DWkRvmt9eHa1W5bX+8W85Jf
vrXst1tc13L+sVzaKBaxZJPzmg8PT2vD9Dn6jtGmpZGKGM3+1e4lOVfXLv+xDd1df9A7k1+rpk8O
cJPxoY77kp2Po97c3YdIbumJocakT5bmTWGKqy7k/UA3tTvst4d1lr9qMCDEnbyu5k7TP3ErJ8Zd
qD4xJA8P+zdLqElhEXs3wjTaAR61WHR5AEKrnNSd22f1XFqIj2+rp2lWIZSHun6Ud7K5JW01ltTo
wHHAIrEZ/urG4Le+O986IF5o9r7n9A8O+04/7BjGmm22Nx59fUuymz/76vF/X5r5r3E8W40knfmo
9dRBYsSa4/Zmfd8Xlxxoo//T4nKpxhCX9ZuxNqbZsYw5j7Gmn+0aC73p3mozdanpwUFzmd1g6Yk5
sj3Yb+kySUj1YPJ/9s7Jk3T4KLtoi6wIW32oJ6cr0jk8/truzzn6e27/fP1Iap73ljw4SE5i+n50
ddxfDE3rjp6Oe3JcI2YyzbNy9HJmFk0etflUHoUYeHUGxGCSuUlfj+/cFL4Zn8ZvhAdvH2YeVN2l
6d1K2OjB/7bAkxvR63WDcvAwI69xdjvpe/GtAxZNTloOLyYvHBnGT883rz+GdbKuNo45GE+NdUuH
bkPWT7llSPnS9J7ZPp1GM9th48AHtV0tSo5Zhici8WTVp/PGHn7aje18M5OtZ6fj0EnMkBn6dJPd
XvqVcTCDOEbD4eTE9eqLqNMNQ6Ky907SypxXQs+lDc+zYWaQFGv/1J9fYtdtrmt14fjE9ulOzz47
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
I4eyez89r+ZXfV/nY3PBcn7rxnUY6G5+cI+vts352tZREn0zwTBLuermi5pNmfhob79o1mn0XgfT
dDEuuWs3ffr1IlMPukm73n8Zd2uZRcfhWc9ZI7uD+8etEZuGTR+f0yfPdd2HkpjLytaTtvrSeA1f
DVbpokVjjnKWiBkvJFPW9N/zdEQZKp+31O0t9aWV6X2eJjcJa/3plkx2r13lYe1LvJ5tTQ4l3JHp
6MO8s5dpUpynz1b9p01W8B61mHkMgROVJqmbrKqc9x++Xbg9bsWu9la6LNtytXYT9hqG4WLity3X
iy7dlSHH9uRBL7b4hunSYpM+sqhBbf1a/t/RL846fcteW/XLrP35S9v0NkZEMDur/tGwiWLkti9S
I5ve6+t9TbllMcuo2jf5/uOJNZblyvP1h/7j6dfTcDfN/UKdZVxS3piJ3YDvtUaqtvPO9OpbzaSf
1Keci0n1jFpfll2dRTuRyebZXt7qb6QanDOeSHTOjZJd/sD1fb011rC16KkeLxpKwx2t5Gg+eXkq
d+5WmfZd7XezTshviA8+Vd+sSRmaAh51aLSKE9MhEDfcOvr0fHt211D5VGW7KriHrP9vW/enZ67Y
zzw5652iCb0ZE7u6K2xpnl7Wb77e77xb52fSgrsZiV1deVU9CdOXF2/T+Lb6PPmIncTd6o6s7Vrv
xNiW+3Kc/NtSxPa3PST/DNsnfz4nwbnxJB/dXfOqOZm2mppJvJ4WqT+2Nmyvn3q7vxDqbJz0s+Z9
bLtqijfJuP8ewqShHcZx+ijJD35PdhLtqj2YfzL6aZXjPvcWZPz3aXt0nMZdt9x1FN6831SN/dlh
zAM9JsPTyTyRYelNX3ve/87pPG1/uwEexRh5JIHuyk7ubnPhgr35Wj/c3J7Vq7vag78skneR4/79
u8+ljzZMi1M2d59ePR8xFtxVS/dWeyufi1sTXx1cP31OOrctNs5MP7DaXf7YJunaa10cFf9iczO1
TefGtCpnz505cn3NBpqWGPy5pnSSYta0UVYpa4iDnVW+zHk2dds8ldZTny+MD1nIm9ODFfX2ptGR
mr0/mhgvy3EzmzX8He1f7tcJ3PIp5rGRJP28vXUrm2j7moy/IsZ4nM/hIXqY3YPpbr70f5klTsz6
gM24T2TR9RduhDdvQuyhV9z2RTx4/4TVAh51mHl9Lg6PzUkd5G02/aJ/0V7u7fLq96t1dvxytq8f
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
WpkUQsxUt4Zk8Pn15j0BHrUYaUtDEfYgBolt/NXXX1qrWu4hhOz1v1ra0GgudYq/G+a+frXj33au
mcDl318zF63plugrU2wtpsT49L0Xfbx1jGxzP25yF304bJOTOcXXsXZsj2eXr4TQ1gn6yTXLH/V2
2962dR7+br2urfIaf73I2zxfTSaTfF9nGeabZcjZev3zmhO5un1uZl2MozNeNbs1edFfMHyeyOa5
Qt1v5nu+n5I2hOvSmlVqKJ/IV0vnTCeZtq32sorxYf3vbelL707EjT56Jvp7m6uW3vDOswtx7T12
c93HW0i1FeGhhvH8le9knzcepRhlSQqoEImm7pQbu1UjDsrrwoEsL/fgRoskL8Zsyy3zzv2a+Lv+
1jb9naMh5rHNIYNaXwx8uZPXs43FFxZSMW5M0sl2+3QZ7D+Pjt0I/uN8xMp8MLbMKRnNvgIY9WzE
Eb6ddk+vvx5qw5sy+ppHKMzK7/0IMmJAnw9bX+cTyDL9mRd9u7Y8lX6jB5vDnnn+UkJ/HOJiei37
Fp97AGP/fjNrS3r6WJfLVnl/Or5R+Z8/1ny+/l+tluS/lrpXzcQjHZho72Vpp++7ffGtbUjH+f7r
tR4ynMb9FmM1u1a3jVQTAE9nZ1MAAX8wAAAAAAAA9CoAJUIBAAB2tdKbTf//Q28aDxAJCQkJCQkJ
CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ////////
////////YqzX53MIe9c70yS62OxHNb2xB1xcsD0aVeykTXBhKbYVKQ5ME2WeSNm5zL955pjbpG43
s2V5/AlTZO6KNnsEHKV4u35iP+TzSzmVQ5YFWprcc58p84y/fzyySXu2ZCzHKY0fzl5e/nklyogT
V4xyNuekGXOSJBRPXlZWxxw0kJZZwuXgmyg27S1RlCVQsRLYhbYXACIJX891yRJm7rYZo++ea6C3
Ur1ChGyntpgBG3ZbNtlOmq+xmB2bRIgTDADE09tBnMvJkxQY7CV9of5qIkrtkkREkk1mn+W4c2Qm
Xk+b+/R5tbOJNpX9U6JNWi7Sa1NTbSAVuchksB+ZBXf7ZKrZ2Z2q09Goexxo1L8iUy/R++ReccvM
ORK5u1O1nsbljbbtheM6lWoeo3I2Xy5sRmfgmxmgBCWy9agjnRc5jFixthtjLFixapFsMmWLGLGV
BRHZaNVNpi209VGMc5thdyHzicx5yGnl+JfLkJiaLoksV87YSyvhKcILlmtjccZcl7WthdFi22q4
pzOUfL5kFYNmwrAVlW3ZZ2xWUNuwnZaibVaSVkVlnrLVt2raSSRbZbsRDEUoa0Hix0ShrJbbyQwQ
URDAEZLySNu8O44joI6I6SENoxt5cxt9G+cTafNNTnGjej8/NG6xPmTJGS5DGh9GTZPHgIP4CBA1
FLyJ2PVtqfTrY3JE07pu2N2PJ4SyK1RRyKPz85d3v1sU5uOS1T9PSHScRvOfJ8zbgZsTpo6Px3id
H4+czOVoELk5plaBMH8+58r4X4lz8ARX5Ez8K99T0fgcz8KJ+CvPwCXwvwYXq/dMdn0E/R2eT9Hx
E/xDk+Bwezg8HyPgfItAMRDJDJC3DBDPDxDPDtDnCrDMBoVoaYaYY4XvEK8K3ZdIHou2ed0VwuHY
IvOo7lPv7yl1AH8/Teej8Xl+Fk/dbB/iHnwiFaF8Gh1uVJRgfz9O1+Sc/ddfA8IhtDsAfz9O1+Sc
/ddfA8IhYCijgH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/
defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defu
veAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAA
AH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/
defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defu
veAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAA
AH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/
defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defu
veAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAA
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
N6Zs5Xpm9Mpr0zembOV6ZvTKa9M3pmzlemb0ymvTN6Zs5Xpm9M29ejr0p/93+m/70zemU16ZvTNn
K9M3plNemb0zZyvTN6ZTXpm9M2cr0zemU16ZvTNnK9M3plNemb0zZyvTN6ZTXpm9M2cr0zemU16Z
vTKc3nq9CXn68t3nu8Rzveg5mA15cAM4azaLJ59NIkclWA3Wcma8LrkIUA6qh48T0PAWBQzDcw6N
vIFnsLwziJmgUQK7OgWvuDOiyR8BIiUyVBQCdVqIXgrFmG5In5RM1qewmesAiYJaBA9iO5AGatAU
afj+B7HNS8d4RAhjQlNMnYd/24c1GO9rhZaO0Hf7p75v6CDDoq2uz6FKwG6O40+/96LaG6P9/d3t
yvaEd2B6ef/tkzYRehYSTHuj/UOs/sDu5v6xGt7u33dS7+9K32+7ae9icnvy2SkjvX1n3N1if3Qb
re33d1jd9gfuMaXbs/aHJH2JGLe3aMtXWNY3p8e9vikdZf7ft+qm9qe4/26TN/dRSv/47/obujl0
UujO4XRk1k0it6GJPoJF5svSeqAgIGuqdXpO9J3pO9J2dL0nek70nek7Ol6TvSd6TvSdnS9J3pO9
J3pOzpejL0fek70nZ0vSd6TvSd6Ts6XpO9J3pO9J2dL0nek70nek7Ol6TvSd6TvSdnS9J3pO9J3p
Ozpek70nek70nZ0vSd6TvJN5Js6HGffs6bfzZ7OhzJnes6Nu16zo9W9XZ0eeees6PPVvWdHn63rO
lbzz1nR5596zpXW9XZ0eeers6PPSXovRVTRsb270/Dodvvt9v7qH0be/rLZPt+x2sb+sTl8vfUqH
MlUvsai3pTf2+ponWRrAile32I1L9p69bH2/+7m5m76cf/u+NNKh2+s/b4qp966ff0UHu9rCQ/6k
3Q76P2IzR236QuZlzNuZ//c6SoPiLoCBhwp9BIQNdUBAQNdU+jEaR6rTSMf7m2v+jQ6z5PKj1vW2
SnS+nzf/JuZKp9YlkawUjqbf399FP4o0U92+yd27B7rWUyflY1GPt3x/o/Q6xLE77JuO2bqXJ8pf
3p8k0m31hc0WpfHa//v32+6z5P6o839vknfJ8ErqfUd8kd6rmVczbmb+7mYgYcKAgIGHCn0EhA11
QEBA11T6L5cByF4JDbwzeIk60aOmmjR7+SmsLvaz9KSPp93J+fJ/DfZKfbbvtbm+hQ7cf63k+Uvs
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
yW/7kthw2p/DfhxXJf/uS9yV/7kthx9bc/zK7kbg+O4qhvcBNu5N/////pu7uTf////6bu7k3///
/+m7u5N/////pu7uTf////6bu7k3////+m7u5N/////pu7uTf////6bu7k3////+m7kDXVAAbgZc
LMMLmncU4WcIXDXFCGLFCzhDFihDFihZwhixQhixQs4QxYoQxYoWcIYsUIYsULOEMWKEMWKFnCGL
FCGLFCzhDFihDFihZwhixQhKdyOhZwhcdbjrCFx5uJULOELj1caYQuPdx/hZwhce7jLCFyBuO8LO
ELj1cYIQuQVyAhZwhcdbhrCGLFCzhDFihDFihZwhixQhixQs4QxYoQxYoWcIYsUIYsULOEMWKEMW
KFnCGLFCGLFCzhDFihDFihZwhixQhiK1WcKpCuKUIXDyRIWcIXDwCVuQrhx6cXEm5K3IW4h3Fa4y
3GG5D73vbMzMzNve973vbMzMzNve973vbMzctAQIIMPXveHNVFox3o3+gOqX2LM0Y6bf00I8NDDz
0AMLh//7dzN3N/////t3M3c3////+3czdzf////7dzN3N/////t3M3c3////+3czdzf////7dzN3
N/////t3M3c3////+3czdzf/+DjMsXDGQMYOY0dEpOuA47MN4yI7wF3N7cc3tzBg3ve8GBze3HN7
cwYN73vBgc3txze3MGDe97wYHN7cc3tzBg3ve8GBze3HN7cwYN73vBgc3txze3MGDe97wYHN7cc3
tzBg3ve8GBze3HN7cwYN73vBgc3txze3BaYiDBYGbrc3txze3AeQ5lJ49QKZHN7cc3tw9iEAI7gI
Abm9uOb25tZnGTOSLnc3txze3MU1BDyV0pkHN7cc3tzBg3ve8GBze3HN7cwYN73vBgc3txze3MGD
e97wYCjx8KJV6ksGDe97wYPIETAFXxLBg3ve8GAFN1ahC9d4MG973gwEq2xEdUF3Bg3ve8GAo8Bn
MhPbmDBve94MDm9uOb2gtg2QXVVFB3urBvcBfEQL6w8Mwb3Cre8cnjIAe1uLASBj29inb30Y73vc
Y9vfdvfRjve9xj299299GO973GPb33b30Y73vcY9vfdvfRjve2jHt77t76Me//jHt77t76Mf//jH
t77t76Mf//jHt77t76Mf//jHt77t76Mf//jHt77t76Mf//jHt77t76Mf//jHt77twSYx//+OuCtz
IkKzEte//9bHCLOq7Q1GP/NZComxtjX06ytSxTfjGD6wOOOt6Hn9b1q1bjwx1tTYeBjPEOxu1fat
5YehjTsfahjJBjrVq2rckGOtj4WGMkGPC3rahjJ93wtxjJBjrY+hpMMcPj7UMZIMdbJrahjJBjra
tWrjJB6tj7UMZNqElm0yBMhMngEJgALWNTNzNxtfvX4t1otywutH1Tn1arbafiSW0zJczdNXN2t0
0NbXyTbHyzTYTbzSWm9W8xox0OYwY5hAY5jBjGOYwYxjmMGMY5jBjGOYwYxjmMGMY5jBjGOYwYxj
mMGMY5jBjGOYwYxjmMGMY5jBjGOYzjGOYwYxjmMGMY5jBjmA8VYFSeImKiDxExUQeImKiDxExUQe
ImKiDxBPPX5bSsE+qbymaVa5SS3LNPz6w279R28kvTioVM5b1inFoyzTZEim3S2pSs1stc7Nmsk+
SWtk0K1Nvx/TOSQzqn/qmC4gkiNCpj5viCRkfFV6/jkkRxUYLGGdnJPFfwjJrsJIiuf/1EEimDqh
UEsswARPbMqFQqNibbaYzbaYzbaYzbaYzbaYzbaYx5aZMY8qmY7dTMZ6ntMY+2mM2zkzIx4WfR6+
9Feh+t9Q/69ev6+ivW9CqKGfxSf/ty/XH+k/yoK9KjbA7TABCqNlQqFRtMAYC3+S3VEVoLi3eWa3
jqNWg5X3FoCODuDz/164ZQSXwzn9b2IEv/5UVxqhUbA7TABCqNlQqFRtMAYEs9aG68st61TZje0b
/76K5VI9eoeCq+7xXr1vXjQb29ffU8aT14GuSqHg6oVGwO0wAQqjZUKhUbTAGBDAYWNTfP/uXAIZ
uLeor1vUYk4PptPEJ7To8GL23f8/P1QqK1KjJwO0wAQqjZUKhUbTAGAxld2R+L1z+K271GoXHUDa
zRH79UOIM/k7w/ZCouc/rknxIqNB98kHaYAIVRsqFQqNpgDAYzV2MB1cXB54P/vq0V4wRX/eK9cM
9b1/6++9c+PwVQqK3VCoxJsTbTDKo2VCoVG0wBgMtLFS6onp7bZUqIVKpj/bZUqnbs/VMNVO2fPW
0/xjOPOqVTtsM439bd1TlG2PviSSm4MDODiXzCKo2VCoVG0wBgfjiJFQ8enfkvB5+KhV9xV+O9Le
h9tKty0ztu0kyHeWxbn1riFiraYrY+v29h1mmmvUxaZ+ct00bBXqbN1PEux9iVUbKhUKjaYAwFQ2
Xfsf1yvityitWFX3pU4pUqkopUn33rec74+Jb0tY+x9JXlJMfY+nbZaZ8kx9j6YjH2PiRUZs1dqm
c3WDrapi9NESXr0KVMQpUxevEl69ClTEKVMXrxJevQpUxClTF68SXr0KVMQpvPfvEk5JLS0WjZSo
iCSFDJ6VkKcb6gktFqkt9ukhSpi9eJL16FKmIUqYvXiS9ehSpiL6mL14kvXoUz0QT2dnUwAB////
///////0KgAlRAEAAIWFrrMR//////////////////////+lTF68STl6FKnta73pwk84yffrRNUs
Wtk3nfY4jiEcR9tjiOIRxH231COIRxbEmwjiEcWxJsI4hHFsSbCOIVatiTatj7Vsebx1RNHeUVen
2+i1rmQASy6/rlUKiyQunjqivXLLJS+cUrNyyzt3zK9COL+DUUXnivX9FlkhZfr7Rv8SFl1/XqHo
skLL0b1/RZZN6h1R65ZZIWXXripkpMWXD8/rllkgbQqh/XosskLL5xbxsWSF/7n9eiyQNDXjpP7c
tOZNTNrbGWqdPJfvS2i/O2z2nfNwv8sNvb+Cot8z5MvgASmRZpZuPXnCT/1oWtZZolun5T4IrTFB
AQEBExgQEBApjAgICAiYwICAgImMCAgICJjAgICAiYwICAgImMCAgICJjAgICAiYwICAgImMCAgI
CJjAgICAiYwICAgImMCAgICJjAgICAiYwICAgImMCAgICJjAgICAiYwICAgImMCAiYDxVrVJ3eYp
3O7zFPjteYp3O7zFO53eYp3O7kv63LeptKxT/i2zULap//WlZbfbbXbc2d89v/704y+oWlY5FsdZ
5uP/7atV+022aO22qcm4WS3f/2mJpFuvz2dtPX/+zqlz59W//z/ZuYorb//bfbd9t//s4YaT9wnV
/+J9i3S6C9v/9t9WfVt//ex/vzvIOYAIYtfVCoVH5N//MZ/5jY/8xn/8xn/8xn9pUTG6RRMZI1vm
MZF5sxiiSXzGeP5jfTCZr+hOt8bA6hHKrbRgjH1Y+1bat9x037F5/n2rn1YW1RnYqC63VH4P+mAC
BUfqhUKj+YAwJtnUW/u/rVrdE9Mg4+JNW2rH719tX2FtWPqxewtq0xGw9z9UKj8FURMAEKo/VCoV
H8wBgWxaLU2usKi0TaZ7Q+rHx8f6tWrbv9W1bVt3PkJPq1avqx9j5UfHVCo/B8TABCqP1QqFR/MA
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
AQAASJcxDhH//////////////////////9ZZfCW1CeE0KgxUFml4bFQYqDdhievgYhnGglMExcZh
z3NbAeZvgHI5bo6DxNLAG1u/lAYapj4TV8Xu+agD1mElUFqVQWqC1QWpVUd0dCrLVaKqs6OjoqDo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiOjo6Ojo6O
jo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oh46Ojo6Ojo6Ojo6Ojo6Oh+h+jo6Ojo6Ojo6H6Ojo6Ojo
6Ojo6K06Ohy6OjoLo6KdHR0dHR0dHRTo6Oj/gwUppm1qS4c1TDNU7Dn6Ex1Vm/P0GZ9cb0Z4x73F
BalUFqgtUFqU970biFWDo6FUOeh63hHM1OH6OjEdHR0dBCKVYv6Ojo6Ojo6Oi1ZcUWLLOjo6Ojo6
OjoTpnS2pujo6Ojo6C6EQ84Zh6Ojo6Ojo6NM2VypgmCYJyIMXBGh0dHR0GP+USj6pZPXG9HR0dB1
7NqVUWKDdKaWIM/oryDOGAoEEsKla9dB7f/m79F7jOibw0JcrelCaYt624vFpc75pcj4hveUFqVQ
WqC1QWpcsqMr0de47TjZ7qAPB3uqAfGIwx1qkoN7igCVDX6ZJ4ZI51Tfe4oHvf3NBGT2Xu+hy5z/
6DDwSoJvc0qi06WYzo81AZe70feeSns2FQGeh5LFoXuxEXgC6GJCyxde5cS617e+9WJ0XFcSa+Iv
cshtq5OhNYHrTkzKmCYOVyuVMEwTkORQkKDdQhHIcig46Ojo6F3RVcuv5C7o6Ojo8c00yDJMa93C
S67rXgOjo6Ohd0ZdcuSrujo6OhUjJVSkqRVSAlUFqVQWqC1QWpc4qD71uwrehhkKEcN7hlqA/Def
2lPy9w5lSRnskFnQdt7igHN/BYzo+83Je4ZqoBymEVF2/7VC97hmnNksYjo6MFes4j+zmcOM+TAv
cOFQaGGdOJxXv73uH3hOjNnR/qBDJXuaTDD0emCQoFr3DOUFGL8/s8FTzl73GHX/7UYxQJ3uGKoI
jBxnn95dQHpVQ2qSjt/OOj0x97ihvNQwzG9uiS90Ob+85/9B7qhW9w2NYWS6DCzN7h9mR55bKfR+
KgG91QDIPKEx4HkeV7ixMltXXBYuudFl6sQntWJYQsQ723GSdLfkXpYjvS2JbcqYJg5XK5UwTBzO
U6OhByHIaPhVL0dHR0dHR0dCU4ugN66Ojno6EdHR0dHR0dHR0dHR0dCFAB0H2l6Jejo6Ojo6EvR0
HDeujo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj+6FBalUFqgtUFqU84tPQ8zyRFqLLL5SpnQuvYaF9liL
4TQi50WrktqLEqxCe91PZlTBMHK5X5xRg5jPdHQg5DkvXR0dHR0dHR0XrL5/o6OjM9HR0eWL6OjE
GnlejO/XR0dHR0fRnmDkejPYNvR0dHR0H559GK0YlQJdHRu6Ojo6DnVEHR9e/PzL0dHR0dHR0dGG
wWcO/8NrA9HR0dHR0dHQYigA9DGOno6FQB0dHR0dHR0dHR0YPDGJhdPR0dEdHQcJynv0HEoLUqgt
UFqgtSnlc3QqPFWQqz+jo6Ojo6OjohZHR0dHR0dHR0dHR0dCyy+I6Ojo6Ojo6Ojo6Ojou01nR0dH
R0dHR0dHR0dBI6Ojo6Ojo6Ojo6OjoR4GAZn/0dBkGFmc50dCMxmL10dHR0dHR0dF7nR0dHR0dHR0
XudHR0dHR0dHRe50dHR0dHR0dF7nR0dHR0dHR0XudHR0dHR0dHRe50dHR0dHR0dF7nR0dHR0dHR0
XudHR0dHR0dHQlUFqVQWqBCZUjdHQSgK6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6D09ujozh79HQemjo6OhUHdHRs0d
HRq/OjoNY2+jow5wdHRpHo6Mb0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH0Hoz2O6H25foHA/PR0A9gKrvo6FVaqnlSF0d
HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQXRy0PR0dHR0O4Oh+jo8/iv
R0cF0dFdnR0dHRg26ZOjno/+jo6Og4c/0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0UP/
cbM2/dlc5+9HR0bCMDo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoPHKznV0dHR0dHR0dHR0dH
R9YjM8dHR0dHR0dHR0dHR0CZXsYPR0dHR0dHR0dHR0dBjqBY0Mt0dHR0dHR0dHR0dHR7D0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRmOjoBg+joxvR0dH
R0dHR0GPp6Nh3fYMz0dHR0dHR0dG7y6DPzW1jOjo6Ojo6Ojoz/R0f/n0ePR0dHR0dHR0YHo6DE6O
jo6Ojo6Ojo6Ojo6Ojo6Ojo6Pjo6M70dHR0dHR0dHR0dHRz/Zcwfrok6Ojo6Ojo6Ojw6PcwVSH0dB
7dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0QPR0dHR0D0B6AaWdDOinR0dHR0dDvz9+I+HHR0d
HRmr39KjQEPDHXgfdDtL66LrqffQoIf10/pLRSHXXXXVuuu3XXXXd+n9dP6wX6f10/on9ddddddd
ddW6dd9dddE/rp/0p7VHMOF1+v6Q2oKFYNAf3jVd5f4FRkMspfXTjpDN6GQtfwh2wQIECBAgQIEC
BAgQIECBAgQIECOBFjbcQI3UIAiNNzbBN91xHh87Y3gEcUAJ30ER/yxnS9eh9U2CBCAgR2/vt4hA
RjIh5qY3gfgS++0jDjHT3XXffb8fcZ1P1an0hCkUikY4AXKqvVVe6xjAhhQwPcP6S+8dPWM4fDww
ePhMzNIQpFIpCFPpvOxVRLX+cKXgfhxxLCh4+L/HxmZmkIUikUhDy9fr/epqLHR11jUIdun94zh6
exDvCgIxk/Lyf4+UzM0hCkUikIKcKKYx2/D3jrJRxE2ub+kuEvx8XHj4zM0hCkUikIcKIcKId413
2hEv77wuHkfBd4CfLpy8zb3jHj4v8fGZmkIUikUhAHD++OMdLiXHWDGI6SywxONdoeHihr8JmUKQ
hSKRSEPdXp9B9xAgQgjEZh6EICBCAhAQ+yAgQIEY0IEIIh+BAQIhDBjDjpLpCFIpFIQ0aniNGtya
HWDrG3T/r8S8F5wYCwiBAjISGQgYOn9dddddfGYcwCBBKP6EF0+gUB/XXT6QhSKRSEPGgYBD9Wnp
/QjAIECMCGHBjWDGPjGvHG/nHTSH1WkCHXdQEICBAgQIEICBCAgQIECBCAgQgIECBAgQgIEICBAg
QIEICBCCqggLOHhuhYQQb3QbsQENEbdqAgQgIECBAgQgIEICBAgQIEICBCAgQIECBCAgQgIECAiB
CAgQgpYQIECENmSEOn5KoWOAEeS/76oOx/yl4X4MHUIBwP6sgezYEQg67J/WM9PtKXhcIdPsHGen
wFL6fbGOsY6shLjDjHRYxF1y8+u9HR6eulpkH0g7d4OsDjp+SNDt/7euoJwaliBAgQl5EQrOzS4e
EQIECBAgQIECBAgQIECBAgQIECHbvj2oOprRAgRuovDt27dwI03u2zA++2Xbt278v3eIjeAQrRFm
u3bt3fUwjqK5nTvDS7du3b6zuECEBAh7t27d9ICJEYHu3bt31gRAgQ/relu3bt30gjMKGFL6du3b
tx10iHGF7t27doduO0Hbt27xiEMCDt27d7HrrkT7V9Cv1+v44AXfv6/9/X9IdP6QRiX0hjy/DjXT
+oS3WMYen7t7/jexjGPr6Ffr9fQ8da21/7+Ja3zjpddpeDHf8fHXx8MYxlfQr9fr6Czfuo/m8scS
66wY6+8Z+Pl/x8sYxlfQr9fr6H39v+/vGusZRjp8Sl4Ovn47f8fDGMZX0K/X6+h9/f3946On4O0J
xvrHX3h+PhL+N7GMZX0K/X6+h9/f394z0h31jo6x2/Hwhu3sJjK+hX6/X0Kv+PcOqzVhAgQ6dCMY
dOhAgQIdOhCAh8unQgQIEOnXaDp0IECBDp06diBAiXTqyXavoV+v19D9/f397xvX4JfdhHfZ9CBF
bfW7946NNJpIgRh5w4RB4cL/r6fhw4X19Cv1+voVCsPEP/f1LEICEBAjGcfnWNY/P194x33vS+0v
vvWlusYdY3X30qvGy9IEOnQgQIECBDp0IEOnQgQIECBDp0IEOnQgQIECBDp0IEOnQgQIECBDp0IE
OnW1cRwFZ06UY6dNk1GMdOganTpggAjX4OnQgQ6dCBAgQIEOnQgQ6diBAgQIEOnQgQ7diBAgQIEO
3YgQ7dCBAhQQIdOhDp0veBAgQ6das6unXWeKz3327du3ffffbt27d99ozrt27du++++3bt277777
du3bvvvvt27du++++0HTpB133g1AMY2/0y6qLwnt+KiTb6mooIzLP/ZmMh/hOY7ziO0yz8y54njX
OHieJ2504BPE8TxmVExtZhUFnZAnicZzZE8TxPsJ4njnDyNPZv/zxPE8K7s/qyp4m2oCpug+s5rV
AJ/HieIDaxagxPLqzp4niqV1T7lcwqAb4OlQlKAQxDEPE8TxPE8TxPE8SxChZxB4nieJ4nieJ453
I5bAHQeJ4nieJ4nieMx2QJ45w8TxPE8TxO3nP4DPHieJ4nieJ4njkswZuGPE8TxPE8TxPE8SxChZ
xB4nieJ4nieJ45XMGCYh46+o8Tx+jmPE8VQQYnQAsBL0AaeJ4znjpPw6jhxqgfNLGGQJ44s1jhzp
h4FUDqAA3jbNDyxmBwOBVBioNwJw4HAn9hDCVCJgdXmqIlByoOmnwoBVAT/hOM6cntUBKgJVBh/G
2oCczkMn47znOhQEm3k1QOoCVASd+/NqAmQ8TFUFp3Z1QqqA0xjtVCqonVCn+enTnsh/75OhUN58
WhOCmzZ8Z7KnVlszkjlDNsUFB3qgDPYc5M9njk3Z48FQioGDHwH/PPrPk/s9nj3OTaGfLt8TvPum
an257PZybPHycXn4Y1QWqghUC544z3z2ez2eOxUOKBwz8zmZ589ns7ywM7fHKnplc9ns9nj+zGzn
FeqoMVBmez2ezyozVKXub+GzM/9ns9kP/orzzE9nZ1MAAf//////////9CoAJUYBAAAjJphiEf//
////////////////////wFRaqIs9ns9nlQ1POZGON4/VQ1ns9ns9OqKTJzP5PNPns8HPKiMDeOeh
UXqonPZ7PZ5UFHeYxvm8ZCpGP3PZ7PZ4+VRibvtmZnnz2V+s9m14Z5cjtVAOez2ezx0qhH4UHagT
No6FQbns9ns9OfpjZn+aGfPbc1nj7p4nf5+B8nFns9ns8qCFQLnVAqoBDSVCR4Z7PZ7PTz5n+na0
c1sz2eVAWVB+z7FQB857PZ7PKhE71BQoGDb3Tnhns9ns9PPl5w8/z/WUz2eVEKoc5EJiqiP7z2ez
2eP1UFG+bzMzOqKc9ns9npp5528KiMAc9ns8qL1UTz0GMb6oKO/PZ7PZ5UjH6bxkG77HyqMc9ns9
kKz5nnkKoM6P/PZ7PTqhUM6gUN4/VQVns9ns9l1SCaXR0ZmefPZ7PTVn/G7MMqVjnOY6DoOjKqg5
b6HfRUaKg86DoOg6FQCqFlAZJlDiCE6DoOL8yQ7/vRjFQ4qADkOQ5DkyOROQ5DkOTq6urqOQ5DkO
TqkPrqyUmlwcHue9MaeSooyeX2bNmYVAWzZs2bNmzYcXX19XV1dZ/ZI6VQSqGdmzZs2bNmzZs2bN
mzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2b
NmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2dfX1dXV
19fV19fV1dXX19XX19XV1dfX1dfX1dXV19fV19fV1dXX19XX19XV1dfX1dfX1dXV19fV19fV1dXX
19SggUA3V1fmWzeLNdUBKCBQQKCBQQKgE2JTgPIwKqgRQQKCBQQKCA8cXjjnPXCKAZUHqCBQQKCB
QQHP/cHCqDjbNE4VBAoIFBAoID1w02RXjgT0UECggUECggPvFKAhUI5zFY5QQKCBQQKCDNwbB5Hy
a5sn0oIFBAoIFBBlf1QIHukCRvqCBQQKCBQQYFPTsUECggUECggJrVyggUECggUEELCUECggUECg
gK6JQQKCBQQKCBtwtUECggUECggsiHUECggUECggglBAoIFBAoIBdOoIFBAoIFBBcrqCBQQKCBQQ
Ni5UxKCBQQKCBQQVUECggUECggXLmoUECggUECggTUUECggUECggFMSQoIFBAoIFBASzqw+YUECg
gUEH95qO1SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHdaj/Ug3V1dfX1KQ5SHKQ5SHKQ
5SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHKQ5SHb8rTq1qGowsGkmyYRe
BhnKcOWOXDAXGIYVfXAA9PjcHbk6Ygw05qmtwYBy5PKnsINxuGvVzFwC/3D9HZmt/j6W8AJ2eImL
kznzWT2nBpB734YdL4HecJ2PnzIM6VnRsPg9p+cYzHG6zjEag/XGK7HdjIvaiItYC4WAT3YbqTji
l+WPFwsYwSEDEDTh8uRRCwSXCsK4L2pGiRcCaHCBysG17htrEXI2L9v0ruLhvN7Ujco3C6xcIuFN
WArIcevllG/HxRvV1dXV1J2dVq4qFAttXNpC4AvyIrFzbLgvDsvIFhXsJOVhOuoI3zV7p+hayxwv
F8O2I6r7vu+4WG759XV1dXV1dTlb1dSdNCLtYshMQwlIoXVGpFe1I0G9kCTrhJZY5WXxeItuRY9t
933fdvVffV1dXV1dXV1HSdpm/vV1dXV2jZFjrbb8TIeL4gbgsex4TJyC1ONl1FhC1pDeHF3XLiv5
O63q6r7vu+2dV99XV1dXV1dXV/nuYXx+NkyOWk6D08jCPA8T+P/F4U5jAWZ1YQwPQ7ou4600ccVT
DFeityw2+BK7o5UdgakUTrLgEqQXNwW9V933fcdV99XV1dXV1dXV5Y/q6uqKYt7RisXsIl42XMwe
icaMYQGV411Dqu6sqsZA3Vb5JhMG2etWC0Dbeq+77vvqi++rq6urq6urq6svl5OosOOfFY1BXEMV
IU0PZQYcitSLLSWbeau7YvxysJyT2Lllb7vu+36r76urq6urq6urq6upPaRIoTG1o1bFYa661OLi
ixkdFboaw3YusWTs4bL405BF7Ui172eVlVhX3fd99VL76urq6urq6urq6urqqmT8tA9trWXsdONG
1qDjnh6lZd1T9FhWVJ+WahnpqbeymBJfFCQuGLRGYRey62zSXiOB6r7vu+5hvvq6urq6urq6upN1
dT3D32AGsOBC6iaKrr6i10zWgIonmGFlCo7HgnoVOhZfF5WA0wyB4EIlbxewKAauiCm5bPUeE8P1
X3fd90svvq6urq6urq6up46urqKy5STJVzHi2LsRdypa9b7dkdCyQZCJ7X18DwUQykk0QXLbgAup
O1jKLqIFY98FHU9933ffV1X31dXV1dXV1dXUn6urqe4EcoXItWFCyqZvKakLChc65lYJAbqYmgAJ
XkLKLnIrqjacjwVOhrXR1dV933ffVbffV1dXV1dXV1dXV1dSaE4kNq6FyCv9lWVrfHVVNVwDuat2
kMcNWUTCNGSAayBpO7H2OCI4ZWcL0ZNMMOdqoAvuOq++pQZqimM1mq+aojVDqgVUESgkUEipEVFu
88zv/P85YYe6oPUFShXUAJunUqLxVG6pCMbnq6urqPJVMBcqN554ryEKqXVSyqUVSoQ8+npzz6en
IQqpdVLqpdVLhDz6enPPp6chCql1UwqmFUsEPPp6c8+npyEKqQVTCqYVSoQ8+npzz6enIQqplVMK
pdVKhDz6enPPp6chCqkVUwqmlUyEPPp6c8+npyEKqaVTCqWVTIQ8+npzz6efIQqplVMqplVMhDz4
aOefTy5CFVMKpZVKqpUIefP0558/TkIVUPksjVsmQ02FjPICgcPA81AqoIzxOT0ZIynV1dXUZZg8
4xRFmh1dVKUCoiVELJg9+9REKIakOoi1EXv3796iJURbFyiJURe/fv3qIpRFXCoi1EVv3796iIUR
SWWWgzqH9Q+79+/f7YLq6urqVEnUfeQUBm/fv3mGoAFRechzqjI1t2/fv36TXObKGNOoBDF37+YU
AOJO5UIbjkwPxs2/ByHIcpx7d+09MgYSgxMk+lRKqKjpUBqg86urq6j+zigN0n8dKoXVBRsY43VQ
qfyoJyaoMO2dUJnSeZ06/JQEGgqCTzVERlqBNQIKhVUFKgI6QqAFQtmudKojVCqoXUGJsKDNURHS
+60erq80eTlPVxoSLlRWS5h8/Dq6urq6urq6urq8H56uoxzLMvduUA6gH3bjLMs39bdteo1y38G+
ZZl7tygHxG7cZZlmbM/V1dXV1H8dygIUBCoXVC6oVVBW00vjKH8qIlREdBl+GfOlUGKhU0VB0bpm
HSqFT+VESgx14xQIKgDJH6qIlBmapgqAg6T+VC/sYuGOlUKnseZ44nE4A6TpVBKoXacGTyaoTVCa
oKVBXl9nx7qgxULnx9ep35NUJqiJURHmw7/dUHKglUGYc51Ah7qgpUKqiJURKDY1d+8/jzVESoXU
CCgzlMI81QYdJ/bzSUGKoiVCqoMP73UC5lmyqClQuqFVRcoWVAhrUGyoiP5UAKgDQoEMFC7q6uq6
QVxIufq6urq6urq6sDgsLhOrqOlUMKhHCYXC4TCYXC4RUjqjJUYYTDSYTCYTCYTCYTCYTCYTCYTC
YRUTqg5UeYTR8YTCfHxhFRkqMjlwnx8YTCfHxhMJ8fGEwnx8YTCfHxhMJv8sJ1dXV1dVxdXV1XEi
E4o6urq6uoZOr2xGMwPV1YHGYzA4HGYzA1DgMZjP8OMxmSzUzTK9/qbNZLGYwIcZjAqgHjAKCxQS
GyfCoDDjMYEOMxgZlRYoMm4M1dWYDjMYcgcZjAzf+SatUFSoh5BjMYYhiYzGGIqRlQQoF1BIZKhO
VHBzmJjMYYhiYzGGIqS1TmoEVByYzOTzMTGYwxDExmMMTnljGYxUHBxeMxhiGLjMZ98nmyvV1dXV
1KsY/ndvPLW8qsZVjwi4FWKqxeWt55a3lVjKse5lWKqxOWt55a3lViqsZVjKsflreeWt5VYqrFYq
x1WPy1vPLW8qsZVim3gMIY/LatqHlvV1N55a3nlreeWt55a3nlreeWt55a3nlreeWt55a3nlreeW
t55a3nlreeWt55a3nlreeW9XUee9UIqhVUKqm46VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+
flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX
5+VQqqFfn5VCqoV+flUKqhVULqkRUKqhVUSKk1UKqhVUfH0qFVQqqLlRaqFVQqqSVSeqFVQqqQVR
GqFVQqqTFRoqFVQqqXFRcqFVQqqR1SeqFVQqqKflUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFf
n5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV
+flUKqhX5+VQqqFfn7VDqolPA6VRKqI/xUCqiVUR5TOKiVUSqhb7VD/ob+6pwfWU378plN+7cb5v
m+b+7dvymU378plN+7cb5vm+b+7dvymU378plN+7cb5vm6oAN27flMpv35TKfG+ZQAKABQAKADK5
PblMpN8ZTKUy+9QAKABQAGdu+ecp9BMgITV5C1rW88mqEJqmqEJq88ta1vPJqhCapqhCavPLWtbz
yaoQmqaoQmrzy1rW88mqEJqmqEJq88ta1vPJqhCapqhCavPLWtbzyaoQmqaoQmrzy1rW88mqEJqm
qEJq88ta1vPJqhCapqhCavPLWtbzyaoQmqaoQmrzy1uXN5UEHntAcH985zjcqNFQOoYMH8/Ko0VG
m7jjdu443KjRUafPz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7jj
du443KjRUafPz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu44
3KjRUafPz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu443KjRUaGWoJFBMoUlRoqNN3HG7dxx
uVGio0UAhjKABQDKjRUabuON27jjcqNFRooKVAwoIlAOqNFRpu443buONyo0VGigSNBQIGgqNFRp
u443buONyo0VGiggUJxrfKo0VGm7jjdu443KjRUafPz8/Ko0VGm7jjdu443KjRUafPz8/Ko0VGm7
jjdu443KjRUafPz8/Ko0VGn1xxn8lxxk1RoqNPn5+flUaKjTLYDj/yOExOaVGio0+fn5+VRoqNMr
hOMjkDF0nAqNFRp8/Pz8qjRUaZLjjN5Xjj/VGio0+fn5+VRoqNMvxxmt3HG5UaKjT5+fn5VGio03
ccbt3HG5URKjT5yGZzKoQVCG7jjdu443KhBULZfF/OYVB6oW3ccbt3HG5UPqhDDZTK8mvu3ccbt3
HG41zX5555Nc193HG7dxxuNc1+eeeTXNfdxxu3ccbjXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7
dxxuNc1+eeeTXNfdxxu3ccbjXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxxuNc1+eeeTXNfdxx
u3ccbjXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxxuNc1+eeeTXNfdxxu3ccbjXNfnnnk1zX3c
cbt3Em81zX5555No2aScT/EmT2dnUwAB///////////0KgAlRwEAAL2dRBQR////////////////
//////+8qbJsc888mybG/jx+v/zBtNo2eedv5RvfmDnrTHGk7uDM7oJxItwmAen7WvQeKhVnXPzW
czMU9a78VapVKpVKpVKpVKp1KpVKpVKpVKpVKpVKpVKpealEqK2Ssl87qPSffVx7L3yHTgrU3woz
PD1+Puj5KqH/6aaD50CmVn68KLVq1QN1Fvs3/Pxv37/j4+t+FZLRKJxBQoUKkUKFIItFotF4wKFC
hXvSaPSBXdPyAixQpF4wKFChXlVvn1FbeXD5cMgxSLRaLxgUKFChQoUK4SXLWMt2bXikWi0XjAoU
KFChQoV1ecV+FEQeDpFotFisYFChQoUKFCnzgfdFotEotLFChQq4oKPYDgAeeeeOOAc883aAAGAA
ADGMgUKFChQoIpmA8Fsg+nPz8rC1PE1vn5vTfIhVxQoUKYj+BQpRTjhRRTjlbcKqmZMs5CTAhMCE
4BTgFOAU4BTAhMCEwITAhOAU4BTgFOAUwITAhMCEwITgFOAU4BTgFMCEwITAhMCE4BTgFOAU4BTA
hMCEwIyVmdOAc35npmUskZKzJmnMuacpZQylkXMWaE4BzpltMCEwITAhOAU4BTgFOAUwITAhMCEw
ITgFOAU4BTgFMCEwITAhMCE4BTgFOAU4BTAhMCEwITAhOAU4BTgNOAUwITAlMB8vZ+z5ntOAkwEy
3SftH6fasVAzcTPTYCu4jvpw5cTPfSFLKdrtV9o/ufL2cg88gZP5a1refqhq02kUikUikUikUikU
ikUikUikUikUikUikUikeytG96Vk3KNKotMplB8FKDR6bknIlJo1O8aYp5+1B96Nk7y8vTwontQ8
gsoPhSdFqHvpDdlCodCoNAoNCodEoHhhQnt8PxcVJFChQoV0KFPlHikfjAoUKFUCl0qlChWQciCk
eKFYwKFChXnWfr2FbuUEeKFCsYFChQoUKFCn9EKFChWMChQoUKFChSAoUKR+MChQoUKFChQoUQp+
KgKFChUCju1rWMYwLQtYxkNa1rQta1rThAUKFChQoVJCjrG/Xr4Fh3dg166ptMUQoUKFNFcihS3P
PPPKywAaBVMyenA975nTh1OHUwSTBJMEkwSTh1OHU4dTh1MEkwSTBJMEk4dTh1OHU4dTBJMEkwST
BJOHU4dTh1OHUwSTBJMEkwSTh1OHU4dzxlJMEsuZTzOnAWds8ZPyrlDKqcBJwCnAecsm5VTBJMA0
4NTh1OHU4dTBJMEkwSTBJOHU4dTh1OHUwSTBJMEkwSTh1OHU4dTh1MEkwSTBJMEk4dTh1OHU4dTB
JMEkwVTBJOHU4fTh5OE0wQTA5MDEwVThtODsxe8+h1qhvR+6zNMD82za1RMoLst/cxl/Lzlw+cMz
o/tGYx+Prksfj+fT4wOPx+P1qhjC5XWYWznH8mrmcfjz4Dj8fsNf4MEP9j8eYHjj/bd4486FQ+ch
6HJ6ZVUGHLj8edhz1UL2ZBj8eoAjWwuE93UL2Kzudx+Px+Px+Px+P8sqqMMrj8fj8fj8fj8V7afv
DY/H4/H4/H4/WYWznH+mPx+Px+PMLX7f2Bx+Px+Px+Px+Awxx5PH4/H4/H4/H4/yyqowyuPx+Px+
Px+PwuE/cjj/XH4+mPx+PwpoeCgtUGZk9GkTCx+P6MfokwXOQwxDih6Mfp/VBbhjHxf6ZWROAw8a
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
I3VQMdWeOwwTZxhja1QCeygCNY2TG1nHv3mkbprKA5UAnsWXUARjGaZvoe34uuVK9w3p4S3AleLh
vZ5IxQecf9msauP55x+P55x53H8qAsfPzj8fj8fj8fj8fj8fj8fj8fj8CaRY/2NTH481DUx5/H9m
MeahqY/HmoamPx5qGpj8eahqY/HmoamPx5pvj7lS3CiEVJFyQi5LUyIvVODazhwKANQBnAcCgDUA
ZwHAoA7FqgDOA4JL2pA4Dg/BRcnQaviiT8OA4L2pC9qQOA4L2pA1cNp/s99KBs3r2pA4DgvakL2p
A4DgvakEMPG5G4dgL2pA4Dgzt7UgcBwXtSCNRk3JmjC6YOA4MplDgODKY01GHHuPVmPyhwHBlMoc
BwZTk5ROz54RGUOA4MplDgODKJeOAZHJ9OXOA4MpkjgOCVYIIUFuHssQRJSUFigtdCguUFxJSJKS
gtUF1yIUFqhPZ2dTAAH///////////QqACVIAQAAeP4mDBH//////////////////////y4kpElJ
QWqC1KoLFBcSUiSkoLVBaSgtUFpJSJKSgtUFjMXh8eSLS6Yi5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii
5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5DEWHSbhuKij9Nw3O3tN
w3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3
tNw3O3tNw3O3tNw3O3tNw3N2cNw3DyMM3Dc/cIbhuZryNw3GdBuG5/cG4bnzlTcNw0jXNw3M0RuG
5/9puG529puG529puG529puG529puG529puG529puG529puG529puG529puG529puG529puG529p
uG529puG529puG529puG529puG52ioAlAP97lAOoBgYZQDqAbXwoCFAPjGKAPop29GED/xH//x29
tKUp29sf//Ef//Hb20pSnb2x//8R//8dvbSlB56Y///t7f//6b4yAiIvA///S/v//k2X8IjTpmj/
2v5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERER
Hl29vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5R
ERrxX7mFn19E/1+duXzJs+fb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+
dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v
29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8ucRzZvOZfL9
v5+dvb+fnbl8vmmnpqy+X7fz87e38/O3L5c2SMb2y+X7fz87e38/O3L5fCZnOGZl8v2/n529v5+d
uXy+81dvbl8v2/n529v5+duXy/b29vbl8v2/n529v5+duXy/b29vbl8v2/n529v5+duXy/b29vbl
8u38/Nv1+fnzl8v29vb25fLs5/P7a2fdl8v29vb25fL5fZ+TfUvyHL5ft7e3ty+X3/n5lf78/Mrl
8v29vb25fL/P5+cdv5+duXy/b29vbl8v2/n529v5+dv1l+2O3tIu38/O3t/PztKZZ56t5Tdv5+dv
b+fnb8llejwjEfPb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+f
nb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/
n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEd
v5+dvb+fnbiMRERGIxHb+fnb2/n7GHxEREYjETfn49n78bcRh4iIxGIj8+AzbvldiMREbltPlrBj
BY1bGFuQKYzOOk8dRY6yx0sx2TjoPHdnRrKUB/L/rlS06Hg1UPOoiZmedtE044AkqsYxjGMYxjGM
YxjGMYxjKZCjvyovpr4Vo1JyJRj0evt46ldeRdPl5eBtoEbFweeR8i0TT+XL0+f4Ruo9wyNmUuZm
TlmOsTJoTjPto86PTvdCUvYICts5xmXw+esGMpUsU3eA5x0T0gfT5fMyeMTjUWgDOOOGAA8HHHHA
AA7sDgAEsHAAIAAAkIQvHWMS87l5+TP7+2qY2qWz+/i9H+JINSzCg0IQy1rQrLbq5+5oQTgHNea/
n5+fnNea815r+fn5+c15rzXmv5+fn5zXmvNea/n5+fnNea8157rPzVq2nAeeM9Z/r1Zrlaz7nnPS
cB16u/NRzjmvNea/n5+fnNea815r+fn5+c15rzXmv5+fn5zXmvNea/n5/PnNeacyZqrNarNWzLmp
Z544v4A3fW00GIM08BXfhM4N90GIcPwoXf4u5nA8Q/wiOObiOUIiI5f9VtMAhEEUAU/18cAUNgQh
CEIQhCEIQhCEIQhCEiyBCt/Wj+3iDTSaWREWSaTOr39/P10eWSdZERePn4yGgCF9rPfJhERZLo+n
/aXv9/4jfSSIiasdzMiInne5kRE8zeEiIkCIixkiIsY7IiIiInxD5jGZlBHe+j0pOQaDBQl7RHK+
3lDDjHUPjHXFwv6u1rUAhCFBrWtQCEL2oNa1uMta1qBnKDWtlCZfAlAnz8Ibj9PRUL+VPT0+Np2s
wDAAABgHkAiIBEUaMah+Q6FlMoTBDLKGWfX19fXLKGWcsoZZ9fX19csoZZyyhln19fX1yyhlnLKG
WfX19fXLKGWcsoJgZkD1puQ0wWQTAhMC0EwSyNkDImQUwPQTApMCkEwWyPkX1oyYAoZZyyhln19f
X1yyhlnLMRln19fX1yyRZZyyRZZ9fX19cswWWcsw/LPr60D1yyhlfKCGWMg5CyDTcpIZZ0oE8pMz
QJAiQJAzO6BIESBXuRvJAiQIzIiIzJAiQIzIiIzJAiQIzIiIzJAiQIzIiIzIiIzIs50Tef70ZVQP
eNVRB+CqVVBRs/DpMHx/X8cOO3YcE3Z2M/+zs8cMcJhdnZ2Z7xzP758feD7OcmafZ2GlN2dhi+2T
zpn5Ls7EnAeWS+MV2HT0DUzMHL0HR2dmkxDo+MGZXZ2eXlmsMqBqBUBP359nZ2dnZ2dnZ0KhHsUC
XZ2dnZ2dnZlcNkV3h2dnZ2dnZ2Z7j7wfY3s7Ozs7A4/9swfZ2dnZ2dnZlcDXFdnZ2dnZ2dnZ0KhH
sUCXZ2dnZ2dnZmsNNx2fnZ2e/HZ2Yb98yXeUnTxv7OybsOHO57C5Qzm5k44l3dkmC8+w9lABheJT
wfs7Oz034gezsNiuVOw5P32r2cHgZHZhTwPg8PPx7OzafH92GDh8J+h/NfZuzdOzsJzMUBGw1DFO
LK5x1AKamN/9KgI8zKO/s+8CZ/Z0Kgr6dnRpL0zvt2b2HDL/rHj2B/fHZlPns7PnX2HPk85i5Wdn
Zsyg9nYcLPzT2bm5jB6PLirezs/sl2KATbjswer1MnsOVQBdnZ2cNyfQEPZ2dnY+qtUdB8TePZ2d
nZ5ZVngcZgeOQ7Ozs7MedZgG4bYez77Oz782PUZJIv7s7OzszvYg6dJpGb4dnZ2dnZMoB9nwjs7O
zo7FAe/+cOpUN+HZ2dnZKZJy/n7x+4Xs7OzsOgCoZMej89nZv9exhUM06v6s/Z2dnZx/YPD50B0/
3Z2dnZ2aDnpsbp7Oz847NHlmMHjswoBNvZ2dnZijK2mFilAfhcv2dnZ2dnZqahm3459OzsCDBHeP
t8T9nZ2dmT/gZyT17Dn7Ozs7Ozs3Ir0YqP3X2dn9pGVpwZLT2dnZ2YWX8/TP1dh59nZ2dnYl/1Ae
/R2dnYqG/A4dRy/kpk9nZ2dn7hf3hUMmOdAOzs7Pt+ylRZuZ59nZ2dktUCeec+Ozs7OzLGEcBx+e
zs7Ozs7N0vZ8JHYZ49nZ2Yg/fDOKgeb8OHs7OzsL08ujyZ2dnZ2T4Dx2e518mJ2dnZ2dmz67Ozs7
Ozs7OyTT/9hQtyJNk8DG9cl2dnZhj27Ozs7Ozs7OzE4DGnRi/Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7OzN787lMOLezs7OzDfTcfhMj5N7Ozs7NWfpms0YWvIdnZ2dgMlzV8d0SdnZ2dnOtuVHkw872
dnZ2Vzv8CSbPdnZ2dmB6N0gQ4rOdnZ2dn//69jPns7OzswfZ2dnZdJHZ2dnZ1pCy7ttXdnZ2diex
75vPZ2dnZdWXb9nZ2dllyJu3s7Ozs674TXfZ2dnZb29nZ2dlvZ2dnZYXZHZ2dnYN+LO5P2dnZ2dn
beby/Z2dnYkdnZ2dl8Xm9kdnZ2dj23kvDZ2dnZ9eGf7Ozs7Ozs7Ozs7Ozs7Ozs7Ozw2dnZ2dnZ2d
nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnnly/FB97YnCTYjj6948Mf5Xxk/S3AZOuJ076fjK9eHxdnp4
XjnR9Fxgt7s+fzY+/3LD4KPc5/LJevZD17LdExpUzvHG7frez2t7MzUcfIRz5bs7Jtb9lvZ0fN+Z
PJmHtw1tmF32dmQyuN5MrBx2diT2dl5tvFyJN47OyvY8XV4K5Ozs7ISLrs7OzsQudZezuzs7Ox7z
pvKT1prwkos7Itv1NcyF3Z3366dJvFyIuaxIviy8pEQ9pQ6RcllkISLuL2o9ck3JcK572YiO2El1
1wL72UnLrssco/KsDddHQk9d5vYt4uYbx2Om7LxY95uRdd3sV7LSSbgSSFb1prELrzd2Pc/bEXl1
iQucSKISBtvA2wuLs6OjZgOi8Wpbrru72YgUjsSbgtQUXI9yIuS172Rezbu6cu29mXi28URciT2B
K9m3siOztWJ3SE97O63hcTxcaxcnun6AY7HGkh0RCxOmh7Lbz2VJ1iOy8wkvcaVdexrhTEiOu6uC
4Ei21Arrp3K6eChbYLSuytTPA20RhOjo9MCzQOT+PvJZjP/GczFSr9AxWDsuS9nITIsWWosTXiOz
rCN7UmnvNiHT3Vl7Ge4Oy2Ejrstd0h+5O0Xpd2iM43stD2ISID0f/x2WjhexdeUXi8wi2y9houa5
Eti0hFcPX237HZ2Wp4SOy8Ue11yxwVtsu+7roQi9KuQpn7eRHsR0YMwdqoE0dlxfSE6W7ReElHYn
7UvZe4mRcCLzcHZZbewLLu/bLkixO9wdDXTveyivNyOkFcVlyEm6C6LLgF08LytReb2ZezYtuC8R
e1EOkXtSd5su4uRYkOmvyy9gXi7vzm2qTIGLuxFydqxFr9Fbq2wbxeH7L2om8p7ynvN5RbeEpJCT
RAw6a9mXcEndIuTsvCe9i3Ja4ov2KhrUSXjQbwsi9gdaBTXBWi6L2NeRsejaVuDttunvF4sWR2Xm
Ce5ki2F6L5K5EhJuhrSwqWFdz9BdD9FAjM60b2MTjVvQ4sXQlvZ0UqtGwrB6LxciLq5LxcNvYss6
7zewEE6VO5XaRRxJliQ60XsKHsK0DXIbkuAgVtWOzoSi26FFiTDpbxYmTIvF4TXI6RZeFlqSkPeR
vZl5Q6TfKTZcTjYli82CVQAr2WWW0u7b9rVguLSvXQuuRYlpcF8IvakkXFER0LSi5CGjlXrtQ9jr
khbwBtaXIyIXOViE/XA1pc668DcXbd2dHRX86B8OjJnGJiYpQH5b5jG8Pzv7OzMDmTL3VPc6zmxm
mnv5HVgFAD2Ib0M5S9nZ2diXs7OzsS9nZ2diXs7OzsS9nZ2diXs7OzsSx2dnYl7Ozs7EvZ2dnYl7
Ozs7EpR2diXs7OzsSv2F2Jezs7LEvZ2dnYlY22iUuy2iXsX9jpcqOzTp+ugcTuQZwduE8wferoze
Ol57D+XMKF3Tp7OzrrfHZ2dnY8I7Ozs7L12dg9k/HR2Lt8po+GYP47/WX7+VQtkDlNfT0fOUzRwH
5NwYh1GBkf3sUAVaL+ynYt0Yc8NZx7clydf2ONwJ5Kjk2jOLIGTJjTizpr0Ng/fTAHsb2LVIP2oA
Ockf2KVDBo1MLAdB3cm/9Kgg1qnF2NMXs9jIGkFWqapWXlF5QG8XM5JiH9Ac/Z2XnsW3m8jee09n
Z1MAAf//////////9CoAJUkBAAAvD5jfEf//////////////////////OzMeIejI9DzYTs7Lz2Y6
83m89nZjgmDic8cI9HJ5ZFQGTbs7/++XPdzJxYG/2TxphZY4uj3/CMg48Xm1AB55A9QKgXFnD0dH
qODMIxDLMoxcFmTuNbPHEcxy7cj0GGaWAUBZuGrhgdBy8hVGmaOP/9ze9lQ9jzGwWvCqhSh9HQcX
/7fCgGrQ2sBu6MKaHkZ51nlk+jaYX57mFgug1zrVD58SV53eJ3T47IY3F+5tnHi4S23q8W3utb2d
hqfLOzs7Ozs7OzsyV4b2Po7Ozs7Ozs7Ozs7Ozs7Ozs+ez27OOzs7Ozs7LxeDr7Ozs7Ozs7Ozs7Oz
s7Ozs7Ozs7Ozsf07L2zc17mQ1t57Ozs7Ozs7Ozs7Ozs7Pzs7MBu3mF9a8h2dnZ2Zn7znv0GH0Tdn
Z2dn/8ZeXC+HZ2fXZ2fE7f32ynZ2dnZ2dnZlfbJmGavvlD27Ozs7Ozs7OwxTb5Os0EH12dnZ2dnZ
2diXoOA09XZ2dlvZ2bT3vEdigRvN5vPZ2J+zsvN5vN57OxHZ2Xm83m89nZeezsvN5vN57OwezsvN
5vN57Ow/sPh/28lF7WBKYCgE7OyDl7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz
sx2K7OwzTI7OwwNvZ2YRQDdnZq19nZL79nYe5x9nYcGH7OwBdnZkezs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7Ozs7Ozs7Ozs7Ozs7OwZOzCZXsgcN2Fu9ezsnrzkOxmdHsuS5OzsuTs7OzsuTs7LkuTs7Lk7O
zs7Lk7Oy5Lk7Oy5OzsHsLo7Ozs7I7E3Z2bNVezs47Oxuld2dmDrJ2bG/vZckdF6uS5Ozs7Oy5Lkv
cuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Oz
s7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkS5BUGeBvP96Oejs7OCM3s7Ozs7Ozs7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oyf
Mbcj2dnZ2dnZ2dm2U4T37Ozs7Ozs7OyjPMxuzs7Ozs7OzsNsxzIzPZ2dnZ2dnZ2ax6Ozs7Ozs7Oz
s7Ozs7Ozs7Ozs7Ozs7Ozs7OzsZ2dk/R2dlezs7Oz88Oxmr/lm7Ozs7KenZtH4B4dnZ2dlOzsHT2d
lOzs7OwPZ2ffZ2dnZ2dnZ2dnZ99knZ2dnZ2dnZN++fR2aOzs7Oz07MFzqvPYqAezs7Ozs7Lzebze
ezs7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7Ozs7
Oy83m83ns7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebzeez
s7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83ns7Ozs7Fy4uy83m83ld2N7OhnRHR2Febzebz2LOjomZtG
L47LzedHmpVNUdH33+EqI6lj0T0bs2fyq9A1v/mXi2r+EK/t+QYwvq+/MIwYMGDBgwYMGDBgwYMG
DBgwYMGDCPYIEWECNFQXgO4kYYIIxAgwCBhK360fpeAggWPyK92+PwHcMGDBgwYMeMGL44h81FSw
h9lcdOzw+6DxbGXSTiOELOISTLGeoQ77xgjGGMGDBiAwY8YMGDBgwYMGDBgwYMGDBiAwYMJBK3S7
Pa6QJ4wYM5Uf9FwMGGoMs27xjxiAwYgMSxiAwYglH8LKUlf2qgwYMGDBgwYMGDBgwYMGDBgwYMGD
BgwYMGDBgwYM0LjOOVOTtN+LN52mMAM17xgwYMGDBgwYMGDBgwYMGDBgwYMGDBgwYMGEMGC0roCI
YiJ20v+2fS9DO+OmTxjt0hpjkQgkoJRCXl09KIEl9ISeMRjpLpKTjMFIjRKECDW8cajdQmK84wps
1/HAwYMGDBgwYMGDBgwYMGDBgwYMGDECvuKBFhAjRU9mMQHcUHxYjkRjDQCBhaG9af+3pjAggWP0
te4fL6xjn4GDBgzGBgwYMxsYM8McekRjr+amoyyuM7vH9ofFsYnGexAwhgwYMGDBgwYMGDBgwYMG
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
rOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEaym3XWlhD7Dk1LXmONNQ1ho//
TdNhjY4hjY403Tf///TdNhjY4hjY403Tf///TdNhjY4hjY403Tf///TdNhjY4hjY403Tf///TdNh
jY4hjY403Tf///TdNhjY4hjY403Tf///TdNhjY4hjY403Tf///TdNhjY4hjY403Tf///TdNhjY4h
jY403TWzV9L1nTdNhjY4hjY403TWm57Gm6bDGxxDGxxpumxY1cOjTdNhjY4hjY403TWz+raNpumw
xscQxscabprSHEw/03TYY2OIY2ONN03///03TYY2OIY2ONN03///03TYY2OIY2ONN03///03Te2N
jutrGx6hpum///+m6bqWgMbH3oNn2m6b///6bpt9gYyF7RmVu03Tf///TdN1BjY0rzGx6hpum///
+m6akxsd2GNjjTdN///9N02GNjiGNjgMPTf/+GUGVDGxxDGxwGUGOQxkMoMeGNjiGNjgMQMpqTva
pDGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr16
9DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr16
9DGxxDGx3b1682sTF3yY2Xq9dvXmJkS7ZWC9eisajub50v853W+d2rLnAoyk+jJnal0ySouIIIII
IIIIIIIIIIIIIIIIIIv9DhOXS919hYtn5f65B5UqCLjh0pW+pR5cEb6XF9540ggggggkkkjOsRw/
vPldm6Yr9qoife9H//973v/jse96fe96ZnG7xtdBZdfdFnyy4uzcmZmZmcyZm8//0pSn///SlKf/
/9KUp///0pSn///dQgk9YKQEEklnvLJRUN///0pSn///SlKf//9KUp///0pSn//uNcaI+3mk4X9l
npsH7rfGWZ1fWgqLQ8T3f+uRX7dJSRIkSJEiRIkSJEiRIkSJEiRIkSJCqf5fN5KXmJynVdVvKsgk
/ZDlQeVZVImvDT8g99Sz5zEu+5fNKKPGpEiQtIkSJEiTXgmnD/Uqbpg/59EREzM/j8TMzEREfiIi
Nbdrdd6BPXXdr3Hm7sfu2feOc5/e945zn973jnOf3veOc5/e94s6RKakoEyRKlQGuQJuScr3veOc
5/e945zn973jnOf3veOc5/emhV5d8zRsQVQh6d69VBrXgwLpgxQwyDCGTpuoaNpIYbIwaWGew6No
rIyRLIyBn6GxaEyMjJpAd2oaIxsMsDIQDiD9ZGQOnLIyI6XohBgaWRkY9GDSwy2GQM5VAeHlIZb6
yqgiDMZGQwZvlVCbTlkZCFjQdBbG4Pq9btsjIyMjIyMjJoyDKgyMjIyMjIyM2iRoVpkZGRkZGRk0
hhlgZHZGRkZGRi0fFpjZGRkZGRkZNEY2K2yMjIyMjIyMmjIMqDIyMjIyMjJoOghphmsh2RkjVmRk
13xtc1Uh13OiMjJ0yaS3NaWua00W9NZWg+p6VpN50iAY2ja2qgH7d3VQIKoDgz9Wdw7PH18MFg0F
VQSqoJ+HOHgZpDH1kOy6kYweodZjahrXV3+s62YzaHkYwcNyJ1MOJlthwanqmhudqDp1TWA8g49Y
YWC53q3frLHGoEA0w4w6YcOYgGMy6a2623Bx9ByBxhxhyauHHrgeaqBC4GAxbaG2hqgbGnBxhx6K
HJqG2holhMMJt18gGcHGHGk1hxkGB2HpIO0PgOP4fYcYcYf4cesh+NiGjaNtobaAcYcYcTdlBp0d
gDjDjDjDjbbGkxcDwDwDjDjDjDjDlDvDCYPaNtoJhxhx6xrH/9W7qQcYcYcYcYcO2hodEA5Q+Q4w
4w4w49tDUmfRrW2htoBxhxNocTcfsMB9Q6DjDjDjDjDu1tKiGh62HKHGHGHGHGQVQBqqDGDRv7aA
ceuaoHHo8ItttJkDjDjDjDj1fW9LvqoBtO1YPEOMOMOMOPbQDl0TRmDbQDj1DXw4wwm2wm7CQYA4
w4w4w4w7A+dEbe2EPQOcOMOMOMOPbQ20NGYD6/qAcYcekM+Gi1prddDjDjDjDjDz1ttVQIMejbaG
uBxhxhxhx7aG2hoh/6prYcYcd3NlF9BDtIBxhxhxhxhyh3UQ0vRttDUg4w4w4w4ttDbQ7bjtocQc
YceodBgOlQd2thxhxhxhx62HKQ0NVQYwEFUAYcYcYcesf20NG0oNj+sBxhxhx7aAa+iNpAOUO4OM
OMOMONqDjYQwmHRttDbQDjDjDjbo20LVvSkQ6A6Q6Q6W5l97TVUFQYVoOkOkOkOlNo+GIwaGmmHS
HSHLqrFde2qgLVQOBmBmBzBzBzBzBp6GHMHMHMHMHMHMHMHNxZNauJ+9eR9wag8dLwysrLjVmVlZ
WVlZWVlzreE9bDmZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZ
WVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZ
WVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWXSdCssiYYmj6rpOk6TpOsaKzNdi5/Gk
6TpOk6t0zt+uadowcek6TpOk6mwaNf13R+tT0nSdJ0lPSNC1J9L17SdJ0nSW7SNFDhu6Ne0nSdJ0
m7a0Vo1DRNJbdJ0nSdJZLIZl3oMzSdJ0nSWDeTA9J0nSdJA4bbAQ0nSdJ0mHEvcVpOk6TpNKsmve
0nSdJ0kVBPSdJ0nSdmNJ0nSdJfSdJ0nSVWS8aTpOk6TAGk6TpOk0pnbc4aTpOk6TtoA0DpOk6TpN
OsLjCmk6TpOkhKQkvSdJ0nSaHsL23NJ0nSdJpY50TVtJ0nSW3pVQMqoGVUDKqBlVAyqgZVQMqoGV
UDKqBlVAyqgZVQMqoGVUDKqBlVAyqgZVQEqoEVUDKqBlVAyqgZVQMqoGVUDKqBlVAyqgZVQMqoGV
UDKqBlVAyqgZVQMqoGVUDKqBlVAyqgZVQMqoGVUDKqBlVAyqgZBnRqxqqeg7bGr32Bt0rSdA0nVA
5mto23CdhFt1BHpEOOBELnDWdacOG7pbKxhi6iHFWs6ikK/0Bq+t2QxosJXfaJoeh6Jcb0mXTtFZ
dZ1tHQ9EIaJoekaA7oaMGF0waZomiaebRNDUddSGGGMxMWh6JoejBm6Joeh2ntqoAWCiuh6JoeiK
wpW2hoehxOiaJD1KrI0LQ9D0QGq0PRNE0XQ9EjRNEHIXXLKsJBcJKx7hQ6lagGaXO2wBK6pSEZ3F
BZTITihBao2OEikKBQYTIEHcgMgQoLfgAJClYuVL3AAL/22KCM7LyJbhWYpe2hM0EpnbQCG25D1s
BccKZBmIqQZt/EEVvLiCUStS9LkdS4NRIU20IXFbbG2xCx0OttB9tgLzyhxf3Ah0IcUokMQgQD/X
VSuttgIKsle8EE4WIBczwmVzO2hXDbQ2QVjA3MgbamxUwA1NertbBoLGxszawBhhx602arqepBwa
/pTZqmiK6WoWCuhbbC6iXrbUel+nej4DU8nL8qw+43kcuFCiYC827ErgDQlwsLqFqsmq20F1M8nG
J9tiOWY9igPTkIin66ePiqHWJ5XT1K9mbiZAMXRgtqdL2XfZV0sHY20IVwE3oHbZCdbETHpWAWBn
gFlgy8yPYV0qTtsVC420ICs7aGxCxQuMk3oc54QEvzvPkeYglCuFdbySZMCK20JkLrml7aACwpto
K9thwkMfKpFsK6XMq9y6kUz4XJ4UvMwOljV7bAP95y4E4h1Qf1ALy9K5J/jL1W4ipohI+H33Ql+3
My4L7yYlQsLwupXS9thdbae2wt5j9DXkSrImdid6AToGP1w3XJxcl+22KXvVcztoLd17bEqwXka5
EqOPhLrURsfjlvNzQEhUEY9zSup22AnI4kBXs//lVkAL4baE7iJV8gBirbbdwlUCcm1N7fov2C50
wh9B3a2H8exdQstLTobXqDO2aeqoA1Y+lc7WmB4KqB/W+tP0jTmBgt29A0DQNAt22Bg0DQNA0BgY
LbBoGgaBoDAwMDFoGgaBT2dnUwAB///////////0KgAlTQEAAIIXHJAR////////////////////
//+gMDAwW9A0DQNAtsFtg0DQNA0BgtsLBoGgaBoDBbYLeh6NoOhMDBbt6DoOg6DbDL0RgvUQjRCA
dQcN3UdayyTphAg5C37eW2CTW2AJBBdu3bYFYXt22C3tsW7bDboTAwW7ethgM2gabpoeKqgRlT8z
sWjBoaToqqAENAMp5ZtN1ZVQS1MOnO7CwsDEfLGQsHDF1sPUO7QdIbQyNG09tIELgZGjBkNrbq2r
ae26Nr5C4QsEAyAyNWuXNG08MhtuMpBlZQyGUhYbSYZDLp9whLgQ8O45XtoLnbQV0dcwaiAaIaKw
3g2Vfaw0Q0QwpomGVua4aYGiGisN5hVA0Q0eobQ0bGrECLbcZWWwytty4y6NcsELDbo2jBkBkEG1
tuBkaMQDIIENGuafowgyCDaRIh46eQbbFzRrmv6sQIasQIWNW1bX9fuXNGsae22CNgNEMhVAZq2v
3LlzVlUBjKG1q1jX7gZFi423LlgNrRrDbcuEdG0+wG1csEG2wGiGRcbbDbYZdGsXCDaQDRDI0axc
bSBAgGQQ27qYYAYurWNDDE1YMUMXVtWDFDF1YMQNkMbVgwv6tq2ratq2ratq2ratq2ratq2rMAae
hateDp1bVg6Q6dWDZDZxqwdIdOrasHSHTq2rB0h06tqwdIdOrasHSHTq2rBzPq23HpZAwcep6uHS
HTq+rh0h06vq4dIIdOr6vGr6u0azLVn2ttGr6vq+r+taMGyGNp2n41fV9X1e9pMxrAcKOr6vqur6
vOhyGF9k1fVwwQwdX1cMH+thsaKwacx9Bg6vq4YIYOr6uGCYPENPSkCAYOr6uGCGDq+rhgtxAMPV
9XDBDB1fV/MqtVQE27aG2htoKqAlVAaqgJVQFtobaG2htoKqAlVAS1VASqgLbQ20NtDbQVUBKqAl
qqAVVAW2htobaG2gqoCVUBKqAlVAW2htobaG2gqoCVUBUQuNG2gUJqslVkqslVkqslVkqslVkqsl
VkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqsl9yyu4Z
nTurd1burd1burd1burd1burd1burd1burd1burd1burd03d2Hzu0du7Ig7st53Tuu+g2He7ozvk
k7sS3dW7q3dW7q3dW7q3dW7q3dW7q3dW7q3dW7q3dW7q3dY5VZLTeVZIrKrJ5ddqslVktPIgqyZn
LU1NUyqyVWSqyVWTMtTU1NUyqyVWSqyVWTMtTU1NUyqyVWSol5ampW1NRMn1MzP/7hqaoJtTV/xO
ZkhLw1J3lWSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31W
Sqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb5BNVAH
W5vKqEdabA+L6wxw22zKsMcMdd++rv31hjhj7cDHDHXfvq799YY4Y+3Axwx1376u/fWGOGPtwMcM
dd++rv31hjhj7cDHDHXfvq799YY4Y+3Axwx1376u/fWGOGPtwMcMdd++rv31hjhj7cDHDHXfvq79
9YY4Y+3Axwx1376u/fWGOGPpOmKoC9IDHDHXfvq799YY4Y+io5DoDHDHXfvq799YY4Y+qNodIeYY
4Y6799XfvrDHDHa9OZGQMcMdd++rv31hjhjhwh/EFhjhjrv31d++sMcMfbgY4Y6799XfvrDHDH24
GOGOu/fV376wxwx9uBjhj5v3022/f1EMcMfbgY4Y96/fNeaNU1AMcMfbgY4Y7S2323X2m6cMcMfb
gY4Y+oX79zUb984Y4Y+3Axwx9Uv3zrv31hjhj7cDHDHXfvq799YY4Y696rDGDGXfvq799YYwYynE
mDGDGXfvq799YY4Y1omQ22NQbF376u/fXqGobbG2xtsbbGoagu/fV3769Q1DbY22NtjbY1DUF376
u/fXqGobbG2xtsbbGoagu/fV3769Q1DbY22NtjbY1DUF376u/fXqGobbG2xtsbbGoagu/fV3769Q
1DbY22NtjbY1DUF376u/fXqGobbG2xtsbbGoagu/fV3769Q1DbY22NtjbY1DUF376u/fXqGobbG2
xtsbbGoagu/fV3769Q1DbY22NtjbY1DUF376u/fXqGobbG2xtsbbGoagu/fV3769Q1DbY22NtjbY
1DUF376u+01qGobbG2xtsbbGoagm1NP2po71DUNtjbY22NtjUNQppaiHmm9vdQ1DbY22MDcMgbhQ
3pUydV1TArzAYHAIbrCAyXCncBAVOc5znOc5znOc5znOc5zyuL716c4UshzsEHOHjgA59vvBYGFy
B8o6zlFTDhbIc561rWta6Apgh05zI22d9d5mdzMzMzMzuZmZmZmYJE9//c3/+yMt3bkrUNdShjGp
SlDGMalKUMYxqUpQxjGpSlDGMRSnqXXEUpSlKGMamUoYxjUpShjGNSlKGMY1KUoYxjUpShjUpQ1D
UME5BcDABgDRo1sOAwCVC0LGUAKIcLdyAEa66666666666666666666666VxQy9uMHLAyGNsGuDx
xgFxoMYFgYXIH/XLPT0w4CZLrrrrrrrrrsBAUwQ6c5ka713bbu7vd3d3Wo3RNtp3szi8mYGtzBhr
Uo9/S7761rW++++ta1vvvvrWtb77761rW++8s9a1LKLPWp6nvvvPFTlX331rWt9999a1rffffWta
33331qet95z3lHvPeDbhO+0hj2A+CGnhihrxoOJDQbJVQBh96W1PRvoBkSxhgKshVke1BVkKsgOr
XCAYKrIVZCrIZmiPaG0OZVkKqCrQaSrIVZAZXarIVZAeYYd1r6b1WQqyHv6u3QxqsjTav/1XQECG
iqshVkZ13qLF9VkKsjUutB1GNUdKpVZCrIVZCrIVZCrIVZCrInXVWRpqrIVZCrIVZCrIVZCrIZtQ
bj2lWQqyFWQqyFWQqyFWQzNDmVZH1WQqyFWQqyFWRbbWrNhVkKshVkKshVkKshVkaBqnBFVkKshV
kKshVkKshVkKsiddVZGmqshVkKshVkKshVkKsjQdRsXFWQQVZCrIPxVZCrIx7WPukclgyrIVZBlW
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
kKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVk
KshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkK
shVkKshVkKshVkKshVkb/fgKshSqyMKsgR4GQhVkbxVkEyZOMO7jVZDg5p/9f9qqgr23kW8i3kW8
i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kbmbAYK9bRmg0cMlvIHPRknFW8hwz
ME+Jt5FvIt5FvIt5FvIt5FvIt5FvIxyfIkC3DFugK7eRbyImbeRbyIt5AAStt5FvIt5NvJt5NvJt
5FvIt5FvIt5NvJt5NvJt5FvIt5FvIt5NvJt5NvJt5FvIt5FvIt5NvJt5NvJt5FvIt5DEyW8lUM7B
7W+sDJsZIvy3k4xW8i3kW8i3k28m3k28m3kW8i3kW8i3k28m3k28m3kW8i3kW8i3k28m3k28m3kW
8i3kW8i3k28ldvJt5FvIt5FroGL1dNztvInDYcXzbyLeRbyLeRbyLeRbyLeRbyLeRbyLeRbyLeRb
yLeRbyLeRbyLeRbyLeRbyNydgNxvtbARmg0cMlvIHPRk9ireQ4ZtnyC3kW8i3kW8i3kW8i3kW8i3
kW8jXJ5iQLc+3YF9vIt5ExbyLeQL8AkO3kW8i3k28m3k28m3kW8i3kW8i3k28m3k28m3kW8i3kW8
i3k28m3k28m3kW8i3kW8i3k28m3k28m3kW8i3kKYreSF50yfkeWZiyd+K4t5OubeRbyLeRbybeTb
ybeTbyLeRbyLeRbybeTbybeTbyLeRbyLeRbybeTbybeTbyLeRbyLeRbybeSq3k28i3kW8jZChWAa
FpjXbrUNYDoVQNajgMlrVQJXtA0O9q2qzZCN3RNODr0Nq0n97Xgwbup5xrKqB/Qsc2HRAxQ1Pd4Y
nDhY75VmRa0bjHnQELV8NC4wsbPnMdR9paEWgWmIo6M2Nly4bF7OObDomPkIvXWpi0ZsbGlo90yY
MZlNTCQq6QYNebw7WIPHXvJ6FriSOtECCWo2tFvMCqDFVB5eDHrk1sOWoMDx3zqKqCdEgqoGaA6i
BDVNc/eDwDzDpIamGiGYqgkDGDY0dsSPoBCjeqGBm60Fo6QY02LOISwcOFC8y6mkQs+u2X1jUwzA
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
zwWUOUzosPRUAhTFXaKgJ0W8GyrqsKKqgplkKRqhu0VRTcCiaU6NRXS0VQ1ouEpGrNFUMtNWlGVC
UYUgUmU6UjtoqiopEpHRVFWi+ikSlNFzFIdaplK6KoP0VQiUiUjovHRVFVIUuXUkqupN5SJSPbKR
b+8aigKv0XFovEpGoyiykSkanKRKS0XbuU1SpFIlIlIb8u2qoJFIlIlIlIlOfuUbVxSmi49FyFIl
IlIlI6Ln0XU3FNt1JUpEpGqKo+josnRZRSJSJSJSOi7CiSkCkim9F1lIlIlIlIlJ1ZS6UiUjuUjo
sCVOpuFG6KgwKRKRKRKR0XEUnMpIpKqylymykSkSkSkW8oWm30uFI1W2lIqXQoUqVRlIlIlIlIlI
aLnKEquqeVfouQpEpEpEpEpulSmCkaVXFI1JLl8am/pSJSJSJSOi4dF4tTcUnVui59FxFIlIlIlI
0ps0qupFIlI1Fs8UBVBRhTu5SJSJSE9nZ1MAAf//////////9CoAJVIBAAA3Bj1EEf//////////
////////////lI6LmKTKQKQkgKUKRKRKRKRpDjbVZSJSOiwtFpXKyiNF5lIlIlIlIlN6LiKSKSq6
kUmUiUiUiUjT0WBLcpEpEpEo3RUGFTcmUlouIpMpEpEpEpEpcpspKq6be3lClIlIlI1RSKF0WZVB
SJSJSOiyalbykim9FxFIlIlIlIt2i4SlecpFIlIlI731pqmiUqUsUsUt/LmUdoqBbRUCGiyClili
liligKn2KMqMovbYpYpYpNub1Kt0XGUW1aLiKUKUKUKUVKAKUKUKUKUKUKUKUKU0XhVVzlUmi6dF
UaVXoukohA1NTV5SjU1NTU1NTU1Uim+txTGi4Wpqampqampqampqampqampqampqampqampqampq
ampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampq
ampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqbaTZUvKq
3aW1tbW1p3q/iu5QWiyW1tbW3bjbJpbdFw1E2tra2yb26oe1dxtbW1toUykMPG1pbW1tbdqei4Ki
ts0XI2tra2y7T2oUqVBtbW1tqOnoqAtBR0WC2tra2tFm2tra2m2tra222tra22XttbW1t821tbW3
G1tbW0/bW1tbb/21tbW0H7a2trauG1tbW021tbW0sG1tbW1tbW1t62tra21qZSja2trbT0XDoujR
dGi6NF0aLo0XRoujRdGi6NF0aLo0XRoujRdGi6NF0aLo0XPoujRdGi6NF0aLo0XRoujRdGi6NF0a
Lo0XRoujRdGi6NF0aLo0XRoujRdGi6NF0aLo0XRoujRdGi6NF0aLoVqvEyhTGi4ak0X8U5oqAPRb
ZSZSVVFKFCFG6LkKb8pQpis1NNNs3KJZCl9Fyl9F2aLpKFqUpSqqoKbKGKF0XPouFuwpwpIoQoSn
ountKhQuqKoqmqKoKFa6rKVq6qqn0WTQqiqNzb6oKCqdsKQKY3KFqiqChpVTVDm9lNlOqzqSqKoK
A0WC31RU9WzbNFkFAnVFUVTVFU1RdUVRoVTVNUVQdUN/1Q3l6oqk6oqgwfQCQDwxn5o+z+z/Qslf
o8u0KWJbA8Ozz/PB5OZ5P1kZ/lCX+tmh4MV/JGGC3nJva9FQBJzLk5hfQGjVtGeTgv/zRiM2FGWk
08aW1o2qiqigOlONamzS0tDS0lKaLZKLq//JWW0evdowcQWB9rZ+ZXtZcy6No5Uv2a+AGW9hLmK9
c2C87mZhreCf+uZbMJ8w08KWbQKjB3+jr8y5Pmmvy5OWf3dZZHXr1mEcJ8y6cnwYPyKFby2H5rLw
uvaMwY/nnlaum0ZX/Q8/J8sw5YJ7wHaxIHPNNoAy355lUfLjz0iWEm9CQwm64v/JrmjBg0+h9aQr
6ANYmx+hXCrRoqgHRaPWqVWFFaLBKeqxsKQKPKP0XnotLRUAui9NF6aLB0XS7osXRVAOi+dFUF92
0WxosTRUGWi5CmmrRY8tmnbRY+iyNFj6LHqOo6jqPRY+ix9FkaLIqOo6jqPRZGiyNFj6LHqOo6jq
PRY2iyNFkaLKqOo6jqPRZGiyNFj6LGqOo6jqPRYuiyNFkaLIqOo6jqPRZGiyNFkaLIqOo6jqPRZO
iyNFkaLIqJrqOotFkaLH0WPosao6jqOo9Fh6LBqdpa2mmUrUpQpRmixSidFh6LG3VbdFuaLP3V0X
Q3FtFz6Lnb23Rc+i6NF0aLo0XRouk/PRdGi6NF06LoPRdGi6NF1aLosx+i5tFytGiyEBShTOi4NF
QF6LS0W2Uqg7hS2i+tF86KooKe0XrouirClGvRYBQVQlJ3UNQ1FUX6W1UNmi4VSkaOioEiidFz6L
5KPcuZR7UUCUQU016Li0WIUfosuggu9FsNRQTUUHUjTouDRZZQRRtUVcUzosQohqKQbCh1WqodFi
FAlIt7eUa1a3+Vww3WzpaNa96dMpMpjanTbkaOqG2nTKTbKdNUo+pqvpFAlA6LEKIk3UqpKPKNKN
KCqihjU0aLEqls0XEUE1aLEKPKNKRVolM1HtosIo1vqtVpaijygShaiKMatFiSKCKE6UTQamrRZZ
QJRZSFChotjRbBRBRDQUGUC0NBQN6L7yhQ0WwUaUaUFUlApCptFltDS0FMuFEaLEKNKNKZqulSKP
KCKNKBqhvqnRcxQTQ1FH0ilikSjdFiNBR7hS1UbFEFA6LEKGqQplUpko0o+o6jqApncpHRdOi8Cl
LqMoQpTReGi8ClClNF4aLwKU0WroqBzRUAxSmi7bKUKUKUKUKUKUKUKUKUKUKUKUKUKUKUa6kKPK
UayiClClCiCiClNFQOaKgcqEpQogogpQpQogogpQpQogogpQpQogogpQpQogogpQpQogFKM3Sial
qco0o2p6nKNKNqepyjUZRdT1P3KnqdvKbVoblNN9T1PmVPU+FA1LKdUN2i0Shcqep8yp6nypm9Qp
rRcKmVPU5SOVPU+caqob6sqep9F36Lvqep9F36Lu0XxOqt6rKSatF31PU+i79F31PU+i7yltFUEq
1V1v0XfU9T6Lv0XfU9T6LvqJu0XdU9T6Lv0XdU9TxsomgUSUQUSUSUSUSUQUSUSUQUSUQUSUThRJ
RJRJRO9lC6LAzMzMzMzMzMzMzMzMzMzMzMzMxqqKpqm0WFtU1TVNU1TVNU1TVNU1TVNU1TVNU1TV
NU1TVNU1TVNU1TVNU1TVNU1TVNU1TVMUjvU1TaL4qipqmKc5U1TNxTVTVNovYpipqm0XA31NU2i/
tFz1NU1QFL1NU2i6SnKmqadTVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVN
U1TFAFB7zKDKEqwoMoRVkKDKD4UHtUqnapqmqalqWpalqmqapqmpalqWpapqmqapqWpalqVeqapq
mqbqWpalqWtVNUnVNUo8qWpalqHSOqaZQWYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC
5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYULJvKF40aLItQo5p5Uui4
85xpaWlp5znGlpaWnnOcaWlpaec5xpaWlp5znGlpaWnnOcaWlpaec5xpaWlp5znGlpaWnnOcaWlp
aectAUhT5xpaWlp5ynlXlN840tLS085VZShSZS/ONLS0tPOU50mvnGlpaWnnCmdFwN3ONLS0tPOc
40tLS085zjS0tLTznOY0tN9aWnvOc42UGmqp7IP5znKVFpKRqlqznOc60tM29paafOc4Uw0tL7S0
85zjS0tLTxVVpaWlpVnTxErNpaWlpVRSpIGlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUml
paWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlS
pUmlpaWpWkqrFpaa6NqaVVVVWloBdoo0lbj79YREzo9NIQhCEIQhCEIQhCEIQhCEInLuzGrZzMnH
BMaA3KMSfuITdQOCEIQhCEIRJmT16G6CN23PvDOc5znOc5znOc5zLuc5znOc5znOc5znOc5z3dnf
X9b0sxVlPLkk3UttttttttttttttttttttttttiAdTZORo3Utt2tNm2zs83s9PY3+bbbbbbbbbbG
ZPUCO5aruj34c7GMYxjGMYxjGMYxiAwjGMYxjGMYxjGMYxjGMbuOhffaiQVHU/ahqMoF9C+1OzaK
tVKDKP0WMULUO1RTKGqEoQoSChQhQlR1FUdRFCFCFCFB05VCUAUKUKUUUIUCUH0oQoSqPKEKEKEo
NpQJRUyhChChChGooAo4oQoT9FklJ0NygGvRaG5QhQm2FAKAoQoSWxQhQmzQUVLRYGiwChChChCh
ChChChChChCjNFqFGFCFCFCFCFCFCFCFCFCVPosIoIoQoQoQoQoQoQoQoMoUoUoooQoAoQoQoQoQ
oQoUoQoAowoYoQoQoQoQoQoQoQoQoTRYZRxQhQhQhQhQhQhQhQhQhRmi1CjChChChChChChChChC
hNFqaLSKEKEKEoFCFCUZqlIlIIHgUIUI4UIUHt6u2xSzTmxRRQhQGi1SiCiyjCiKlKaVolElFlFl
FtTXUVIosouqCi9FiTaeUNFQDaKgGcb9FslFzKA3qppwosouq6oKLKLVpqdb6TYUWUXvVRRZRbah
KRpKNpQ5RbbS0WWUSh8pDRYFFBVWIJFFKUfgg3jwoFqyZQO3XqoQNeNksKFKDzCg6hxsqrRVANIp
RtJVKBKCzGsoPjp1ZiEpXnt5TWZV1UYgqxoldWVTSxslmIMp1bVVX1bVpOZnIxzYpRuzMzacqiq0
pCqapzMxuKS0XYU+21aeZiBAxMTZvK8zM86JSFXN9WZmYdVVZVtMnM5m37lJQU5mZlUtlKrquq+q
m/MzEFUlBVTVsTxBeFIR3aLspDMzKcNqWi9imaVVZmYbfouerWx085+FK8xC0SQVZmZlUU6VNvKS
queZmE1a2fnMwpOq6Ia5IMzMqpszRVAJSdWm2ZmYTVkGK0GZK27saE8zMb6pq6rilqtOqczMJ32/
mZinCkoUquqlszMyqm+rqvKCqlBVOZiBiOrUFVsSDMw6uQNlXN9U5mZOrilClW2rSczOOHT5ouOn
Oc5zq1ztQUNFg1LOc50aKjXRqLMnPolnSkilFag73vVFe973ve9RNSBRpsNNCpQUoU9Sq6q6rqur
il6rquq6rquq6rqspAparikimCm6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rqu
q6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq
6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6
rquq6rquq6rquq6rquq6rquq6rqumrHnbbaW1OnTp7KtiloEFWU6dOnRzdSg2FIUadOnTo3S4pTb
WinTp0/bFWpG2UKdOnTlTKRocp1dTp06fO0pSpU9qdOnTnxAofpagp06dORNOnTpnXJp06dM6506
dOmax06dOnE6dOnT0Pp06dMmnTp09GU6dOmTTp06ZMadOnTrnTp06ZNOnTpk06dOnoynTp00tJtp
06c7KIKNKNKNKNKNKNKNKNKNKNKNKNKNKNKNKNKNKLKMKNKNKNKNKNKNKNKNKNKNKNKNKNKNKNKN
KNKNKNKNKNKNKNKNKNKNKNKNtS+VONjqhRtVo0VKM207onIT7duIG39svZs7R2k1N1JSiqdChWnS
tS5Z69CgalBVsV2aKG29XXQUnQoUO3QafaFKDTalCsDamrkqFChQqChQUaByl2hQUUJUoGoof0KB
0FDoUK5qUNCgpQoG+Sua5jREtX0PNbR/nWJIGs/iVb0GjYEFofowitES1Ylg0Yy1yYl0rHSQaMWJ
X0YvohjoxfQXZTrIECApslcmudcmGiRcmsRB8DneZ+23eNU5y2lLs6Ku9DQrGyr6O/z8H5AsJs/s
ujRW55qaIF1jW0LPNCNnCuRVaFZggw6FaFZgOFbl4c6RNQaJYaMr6NraIo6Mejo0aA0RVyVj/RiM
62iJbRtcq6cSYRX9aGjIaNXNfRAvo0gmVYuSudfR4rnXNbQWJhoxnJgfxOuTA2XRrDXW0EuyhRxR
A5d1KUBUlQUajKBKT2dnUwAB///////////0KgAlUwEAAAOnl6UR//////////////////////8C
uULUnOFBSKBKOKH0WDtsUWUHotGoWhQoO2mi0lBlBlBlBqKKKFBlBlBlBqKKKFBlBlBlBqKKKFBF
BlBlCKKKKFCFBlBlBKKKKFBFBlBlBqKKKFCFBlBlBqKKbFCFBlBlBqUNtigygygygttttigWtSXN
+1QU23822CgQFN1JUKCygVCgSgdrKBKBKBKBKBKCMoEoEoIoEygSgigigXiy7IUAUArvRKDp0aLW
UdU5RVzpb0aFSFG1AUBUX5JShUDVVWzIvVVVVVVTBvJQoHZoolD1CUEUZV3Kqq6lVNVlJtNXlI1c
Uopsh3KZpVRSV33bylKoq/G1vKRqvKW7a370m4pGqW9rbavpRZo/o6GM/lOFOFKVb5ThThStWlIl
OFOFKTKcKc3Wq6jRUqmqSkarQSvarqvq9pzPpUykaE6v3pFI1dV7fVKBvbe1XV7bSKA3pVdVNAo7
ekUjvVDZdQVLSpFKVTxoUUKZKZquqwp/KdU1bVVC1Cmavq+qKnuQKUplBlAN9VlI1fV4qzLq6qKv
qlsbaRSdUU6VXXVTfV5SNOrvzKrqkpGrKqb6pFX1c2tvW/h0CgCg6HlN6LioFBlB0KBQZQdAorRZ
eiwaBQTlChQoUKFChQoUKFChQqvRdXKFtdCg1tdDRZeiy6NBra6FBra6FBra6FBra6FBra6FBq+g
GilSaWmlSaWmlSaWmlSeOlSmglJ9BOlSJpUjqlvqopVup1TVZ0qRNKkcqSCoeoDpUqR0qRwQNyql
KkUGUHSpFB9UKU7OlykUHSpFBlB0qRQeVQUjviAoOlSKDKDpUig1dyg6VIoMoKlSQVFLQqKojqKo
tGVFUVRVFoyoqiqKotGVFUR1FUWjKiqJQIPNLorAlp/VFUKoKoqiqKoqiqKoqiqKoqiqKoqiqKoq
iqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqNpVRVHO1RVFGFUVRvRqiqKj2qiqNkFUVQ1oKoqirGmqK
o2YaoqjeqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKpqvuVXVaXaq
6ruq6rtLVSAqbv8yZzMqaVNKmlTTnMmczKmlTSppU05zJnMyppU0qaVNOc5zrlTdQVNKmic5zhrC
ppU1BPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE8z9F233b0Ep1bouLHqtq
2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq2
ratq2c5zq2radOr6dW1bOc51bVtLGioqtq2c5zq2rblKVW1bOc51bVsqVLaratnOc6tq1olKratn
Oc6tq2ratnOc6tq2ratnOc6tq2ratcnPvZz7VtW1bVvVZj6Soq2ratq3MnnW3s6tq2rat7Of5Oe9
W1bVtW9nOc6tq2ratnOcykKtKTKTnOcykykqXlJlJTnOZSJSeGpRnOc1FNGKKTnOaimjFFJznNRT
Riik5zmopoxRSc5zUU0YopOc5qKaMUUnOc1FNGKKTnOaimjFFJznNRTRiik5zmopoxRSc5zUU0Yo
pOc5qKaMUUnOc1FNGKKd7PvqKaMUU7MT6ooT0v0zdW8uXklDkm7u7u7u7u7u7u7u7u+oHO521xue
TmFDjnbucwMsJydOUtCx3d3d3d23fUD69HdvVt07u7u7u7u7u7u7u7u7u7u7u7su6N38AAZm7u7u
7u7u7u7u7u7u7u7u7u7ugDd0Mzd9+xeyrjL2MYxjGMYxjGMYxjGMYxj1fuPOXHHu9dD6452O7oGE
hOPcS1tjjsdjGMYxe3fUD6HuiSQjsd3d3d3d3d3d3d3d3d3d3d3SdxxiICe63d3d3d3d3d3d3d3d
3d3d3d3d3E47GCdpt/UHdFyShUyDRYXKhaWsqZlW1FoshBVJRJUwqY3FTCphSpT+i9kBUwqYVMbS
kGhrUaGqmVM0XQUxVRUwqYUB0qYVMqDtlN1K2FTCpmUKobNgVMbUCn1O0cQVcVMKmW1OtfeFTCpm
91RUNSclvQpFTCphUwqYVMKmFTCpiBpKmNpUwqYVMKmFTCphUxvqCnvsVMKmFTCphUwqYVMbWhqp
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
cqap1GVu9zygil3PYdrtTeOfUE3uNdQVBFlqCoMldChQoVBUFQVAvdChQoVBUFQVBQoUKFVFJv7V
BUFQVBQoUKG8+0sptVOd5e2IgUjUFtbSdQVBUFQUKFChjLE6gqCoKgoUKFDqCfioKgqCoKFChQqC
oGtroUKFA6gqCoKgoUKFCoKgqCoKFChQqCoKgqChQoUKgqCoKgoUKFCoKg7UFQFFC9mva3u1cg0W
IUG2AoRBTb5lOL1YUzdRPcoVcU7osShQoUKuKWKWKSZWfnPnOVFraPE570rv96opt9ChQoTQFKv1
dwHX71VXdWn98aSgqgnU3Msp2lvS5eFIb1bov+r5cDf2m1aLFQb1aijQoUKH1FO4dlsorz8VKIVm
qsN6ouqVnWunUnOlJ1JVKtDjRj3VVe96qqqqUbosAo5VWof3qmrKtKM0WCUdUUKpKe0XDouOhQoU
J7q8krLG9pq2ovzKVQIBOTS0q7jmNpSVHs5XOqdpoBNQp7lSKcntamT6qrOoFCgilaamaLhqIoHa
attNKolMxZtqltqlV7lSNN8zFG2pMhJAqrIpBzZsUKVam3OVM7vUU5IGhrVqR7PmKk619VV73qqu
81VaFfgrqC2G6FChQ6qr3u9JWe6qtS1Ls1Rm1aLgDd/lMFOhpxC18o3QKQ0XPQ2qXa6gpzbG1vp0
tlaiauIGuVGoca6FChQbClSllW/eam2+++9Chs0Xjc2z2o1Vzj/EG7qs/QcFG/mUoUkUlV3L7nOq
78aJ96U2UjTpqTbG9sqdqpzrUOC27Ke0mVljXoCt2d3X40Zv+K1R27yc9oKgcfHJvNn5hnA7ndV4
1E9gtevaUNF34yhvu7u7u433ZcSafXr169f4///uZJ9J+OCXp6fnCmcDudz6xrU/gtevbaJh3d3K
ctbs0d27u7u7u7u7ud3d3d3QMcMgQsLCwskQ9////fPNs9RnVGffmT1VTmqlZOLOlVyqlSqntVOa
qb1X6mOqrDU1U1uqkqqxVTrpzxVUwquc8VVNaqTDXVSY3QVU5qsHN17mquYZRVZFl5VTqqlR1XFr
XQ9B0vpzxNZ0WtXhj9DYj6qvnoKqfVUr1UoVU8oXVVhzd1fVSPVTGqmpm+eK6Cq/Vfqpd5qr9VIb
7OKqzzdjrpduqntVm6ig7VbVfqqk1Uj5z51iqpcqs1U4dXVUk89VPKqTKsquVUyqpAqyq3VTWqk3
pGZ6Oeqkqq1HVTSqlqKKqxkdVIvPHVTmqlCgqyq9V1TVcoKBVWKqf1NVMMqsxVUqVUrLnq+q1VS3
V1VItVLlWVZV1V2qmNVOT5VTupqpZqppccVVP6rFVI1XVUwqztUVNX1afWR1bFVTSqmHWqzVSFzu
qlHDVUv1Uj1U2iqpBqp1VTqql+q50qp7dVNqqV6k2c1V2qnFVNKqdXNXFVTiqlSq/U1UodD9qqd1
MdVyrqBUFVmLKnnqpbqp5VTaqmHTm5uaqmNVo0dVPKqZxVUlVU0yOq1HVSHU1NVkUFW8651VTKg3
0qp1VTqqlLmqumqpfqpRyqm1VI9VINVOoqrnSqnVVL9VNqqV6qe3U1NX1bVSXVYqKuqpWifY3Y8Z
3z4zVXOfdW1U2qvVWY206qdRXz1Ur1Us1X6qY1U1oMMaq3Vbq/nquVe/OlV6cNdm7au0letXdpK7
V2krtXaSu1dpK7V2krtXaSu1dpK7V2krtXVaqtVXquqKtt5UVXo8qKrsZoql9OeM9VPKqd1duO+5
48zo6uygqKrHPVfqOZVYbKrFVMaCKe5oqqb1Ugc/PVcqu5ekrtVWuaqxVZi7HM6m6BVcZ7qs1deb
xnPHV90GKq9Vbzd2egqphlnyq5lVMKi08qpjVayKqmWXVTiK6sbuqnvbdVhZVYjqefn5+1X1Xqr1
V6ratq2rar1V6q9Ve5+fn5+erquq6ratq2rar1V6q9Ve5+fn56uq6rquq2ratq2ql+qrUqr1V6q9
Ve5+fn56uq6rquq2ratq2q5lVMqvqu1dVlRVT11Wqr9B0nMquXU82ufn5+erquq6rqtq2ratqu1X
qr1V7n5+fnq6rquq6ratq2rar2VXqr1V6rKrlTz8/Pz1dV1XVdVtW1bVtV6q9Veqvc/Pz89XVdV1
XVbVtW1bVeqvVXqr3Pz8/PV1XVdV1W1bVtW1Xqr1V6q9z8/Pz1dV1XVdVtW1bVtV6q9Veqvc/Pz8
9XVdV1XVbVtW1bVeqvVXqr3Pz8/PV1XVdV1W1bVtW1Xqr1V6q9z875+erqs6VdVcquVUpVXOlVmq
nNVL91X+eRVfVTjmyqkCqm9VMuer4+eqxVTW6tq2ratZjIjifSKKr6qfVUoVUoHqp7jZqm95UG5q
tq2ratjjM6r1V7PFd83NVSMe9GoLq+qmkdVOu/TtdRV5o8wKOqmNWVXKAxH7mB8yqznqp1VVA1VT
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
KCLmnaDLrHq6J7NGufJ2NneYaI2Gis8c7QHwUpB0cOb4br3oDmsx87bsxj8/Nnfo8uI4rH5jQu3H
Va4sp6qf1XVlupqp5HHd0EVW0HerDVU3qp0fKrx46h87maM2XEbnq9qgVTV9Wjn3Sc1TVdqp3VTC
qmR6Cr6vq6qxjqpjVT2r6qf1U5q3nqYqtqtnj51z3Vbjqu1W6igeVWqsqu1U7quVbz1U4qarK8PV
tTVYjoKujquVXMNUc1VMKqZ6q6Nc8VRHVTg9BVkXLFUupqKrB+eqmMcR6rNAqr9BQUSqY4nhlHzR
1Wuc9V2qnFBFnaIx6rWOLDx1U5oN1WcyqmFW1WjZVSFVTirqiqnHPeG5qCrardVM6C+a+agq6PKr
nNV8cVVg9V3m5qrHNVTGq5z1U4qpxHVjXNO1WlzUDNHVdqvc90Cq3IqqYVWKC+fDUHPVecccSqDU
EURqA9VurqqcVahVTCqn91ZOvpQaNQHN9oDxVWaqYVenaObyKju4o+eOgMY6qYjVW0+sWI552goI
l8jNjjpD1dVuG61ZFzxRb+IbOW70F0BqigoKA1VzrVnWpNc5VnU1BQVWauM+3y7memRzl9kk47d9
FqIIaG+02RgBCsQRaaPSlknKekJq86aTcIVyQRYQG66UJM+aSICBEHFzVUzqpvugqpnVtxc1X1XL
qtVUxqt1U15usfNU1U1qprlVNaqax1fQnqprVTWqmtVm6rvPVlVM6qa1Uzqpq6qaVfVTWqmsctVN
aqa3UczqprVTWqmtVi6qbVUxqprVTWq1U0NVOKqbVUg1U4qprVTWhqtexVWZKqa1U1qqy1VZKqYV
Uwq6q2ahqpjVTGqmtVNaqa1U1qprVTWqmtVNatqplUVUyqprVTWqmtVNaqa1U1qprVTGq3VTeqmF
VNqqa1U1qprVTWqmtVNaqa1WaqZ1U1qpnVTWqm1VNaqa1U1qprVTWqmdVqqm1VMqqaVU1qprVTWq
mtVNaqa1U1qt1UyqphVTKqmtVNaqa1U1qprVTWqmtVNatqplUVUyqprVTWqmtVNaqa1U1qprVTCq
mFWVbVTWqmtVNaqcVU1qprVTl1U2qps6qa1U1qprVYeGkqvxe1U2qpAqyqn9VN6qbVU6qp5VlVPF
uqm9VNqqbVU25uacqptVTaOqmlB3PMXVTuqnZ6uqpk6vno6u9qplVTLnjqpnVTK3nsV3VTKqmbjq
plVTKrD1XD1W8PdXLKqeVUh1XUdM1V3ObOa08VVuram6rNVP6qaVU0objqLqt89TVvPVTTKrk7FV
amDVU75siqs7WVMcRqrtVOec9XVXKrmRVW6sqtZrm56mOOhq+q5Ux1XJxI56qeVU9qsGqak8fPVc
quR1U5dVOKqcVVZ47upqarnOeKq7Vaq6q4sqtz1WHNVlVg1AqrNxnyq5z5VamJ2Laiqsnivnq+OK
q5z5Vbqsmqsx3U1FWO6rmKqnNVKHOzVaeOpqaqcVXOd1U5qpxVVnqpxdTHfOepquVWquiquqq5Va
qpoqqZ1WHUnj3V1V2I1VzI6qen9q5xVUi1Uyq3m5jZzDHUVWqr9XR1Xqvqvoy8dX1Uqec2VWqirK
sqyoiqyrKsqyrKsqyrKg1RzGNVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZV
lWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVl
WVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlW
VZVlWVZVlWVZVlWVZVlWVZVlWVET57qI6ioqKiM1VmM5jnqKioqOf2KPn5ulTUVFRUc8zFUmXPUV
FRUVZVlTzc9RUVFRU8x6ioqKi9xRRR1FRUVHP5Vx7iqKioqFUVFRUVFRUVFRUVFRUVFRUVFRUVFR
UVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVEVRUVDrVWqrFViqxVYqsVWKrFViqxV
YqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViq
xVYqseOjmKCq6qqdVfVdju7WVXKuqu1XlL7N+ZVcqvVfVyOeLKuqbq6r1kXniqu1XartV2zI9zFR
7Vcquuq5Vcyrrvz01V2q6byq7VcmPDnkGVXarmRVXKrmOqlGrqrtVyq7Vdqu1XKrtV2q5VcquVXa
rtVyq7Vdqu1XarlV3nkMeqmVvonG1IfMPGfLjy99EJq8qOahj5qrPnnnNVlW1UxqsVFVqKraqaXV
9VM6qZ5VTCrebnqphzZVaqsVFVMqsyrSlW1bVtW1bVtW1bVtW1bVtWVbVtW1bVtW1ZVlW1bVtW1b
VtW1bVtW1bVtW1bVuVZiJc6NVlBlVPaqe1Xavqp2jnurrq6rquq6rquq6rquq6rquq6rqvq6rquM
apq2K2eq/VT/mjNEZ21U1J+/Tnqv1X6soKsqyrKs6O6vu6mq/Vfq+q/VlVyq3FVhuaoyqmVViras
qsRqq0bmNGeoqpjVY5qsNVYqt1bUGqyrakxoqt5qrNVIdWVYacnKqe1U9qprVTL2qntVPaqc1W6r
9VPaqe1U2iqp7VT09WR1U3qtc3NVtRHUOrKsqypNucMaraqQKrNVigNVtWVZVZqs1W4lV9WVZVlV
IlQarOaqmtVODVbnNz5VTKqwY1Vjm1ccdVqq1UVFVybq+I3NVbqpAqu1U9jqtVZVnNVtVPe1VOKr
BqrdW1Wz1FW1ZVlVNKsoas5qs5qsqyrat5jGqybqtVWasq01WHqpkahqOarasuq3VZqppVlWRRd6
rbq2rqvqsaqprVTeqxV9X1WKrFX1fVYqt1U0qphVYq+qxVYqsVWKrFViqxVYqsVWKrFViqxVYqsV
bVSLVYqsHqu1WKrFV2q7VYqppVTQ1Viq7VdqsVWKrtV2qxVYqu1XarFViq7VdqsVWKrtV2qxVYqu
UlVibq/KrlVzMquVXMyq5V+ZmOLOaJ5mZzRVbVTKraiqxUZmZFUc1RmXme5VlWXmVXKrmZVcqs1U
0qpibKjMquZlVyq5mVXKioqtxKq5mVXKrmZVcWqrmZVcq/M9VV89V+q/Vfqv1X6r9V+q/Vfqv1X6
r9V+q/Vfqv1X6r756uMfm5qrnNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc2Lm5
qrXNzcxubmoJrm5u0XNzc3Nzc1Vnm5qrJ+bmqyrebm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5u
bm5ubm5ubm5uaoiNUVFRUS1FRUR5HHHHHHHHHHHHkcccYjjjFXVfV9X1fV9X1fV9X1fV9X1fV9X1
fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fqqxFQVU8qpxz1Xar1BVSJVeqvVXqr1V6q9VeqvVX
qr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q8qsqKr1V6q9Ve5lFVe
qvVXqr183NVeqvVXqr0URlVeqvVXqr3tRVeqvVXqr1V6q9VeqvVXqr1V6q9VeqvTvApVXqr1V6q9
Jrseq9VeqvVXon5VeqvVXqry87GqvVXqr1V6KWq9VeqvVXqr9V6qnFVOKqcVU4v2qnFVOKr9VOJm
KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK4oooootkDKNV2qVpckyyxB
NtFr2z7szM7u7MzO7uzMzu7szM7uzK12V1dXmZ3d2Zmd3dmZnd3ZmZ3d2Zmd3dWPrr7t0BJoTWOm
BuaZ1lg5Wtp2t1hrrqqqqrrrrqqqqrrrrqqqqrrrrqqqqrrrqHDsrHVDYcPrG1VVVdddVVVVdddd
VVVVddddVVVVddddVVVVddeDhsOHZWsjqe/PUBzGdcq3D4NHqzrkUHC+d8jRxo95YoIqshkKCgqs
1X3yuganRVcNVZVBVehVY3zwM4o6vqP1Tqg6GB+PFG3vjmvLHXimPNdnx4o93VB0MD8eKPL42lID
b5Z3fbmOwerfRVdq810euVBQUEDZVhlC6rgVBdXwoD+jFZ3QDx0EKBUFVjM5mxz7oFVYGBVXxVc2
eMVWaDdBnhjUF0LquUFBbq3ri6xc9RUg8dWBRXGerHEqGqwaqxQzXuK72rqedHoHQOz1WTXDI44q
ti5ubO9BzHj3VTBaqvvrmsxHWR9DKFXUJzUGojVXDVX7oKBo8KsjZ6sVViqz0oKtUUTHPVxsoG6G
6tq+os41Uo181VoLrmc0VqqmG6r71rOuHWLobIwqvquiqxVl1c9YeqnHMfccIqlRVabm6vdBdDBd
KmqxUGFVyrqrEoW91cKDDvkj1QLFaoKqAin2O7oKDiJ88TMz8SOKOgoL4hj+4e+biOrOegoOJ0oF
Qdj1HEWTnSzPic/Td74iqoA4jmOTyqsSlVeuoSuhyg323p0Kc4lQd6CgoKCh3pUHWgoF5RW+eY4j
M6F0GshMQdQurh1g2oLcGsqaq0PeHPmNqK+rTw0Z3QUHTtQWkMuoiiyPnPV1Xn8s1B9VBCzYbKr3
OqCN1WqrHa6qASUJyJnqI4u3mjtGT+DIUdVYVxmZFUc9TlQzGjdV6gdBVtRUUFVwc8CHJZQYmerI
ue6tdBzniqKrdVMqrXNkdB7hzRqPKGoNE7qv1XOepoDVYfoc+c3AnmqphRHviGhHU1HKKB6nmuqn
cdB35quq3eJ8x1aqs1NVrmi5qB3lxtczyOqmXMqig71FWvnPz1ZlRVdMfmygs9AfnqarVWRXQXVl
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
dQM11U5uqmS0lE6rfXrFlVyo5qsqp06CgygoI6sj54o6nnjqpzzc1AjVU5PQXGe2eq1VT66A1XUF
AuarexjUdTVTCrKsoDRVdUUGVbViioKmramq/VTHIsoFpRZ1681VOeaPIqCgoDUFV3mbugNFVc7/
DLKqa1XqOrKsqygi5qtN2NVTCrKOpNVlBV1REegoKtjqyqn1XXVl3V6oKlRPOerDRqqmfZVXaDs8
t3QXlWM548qL6pL7eUFBVcj5oqCrsPZ10Siv7OdFh10qec/PQYc1TUvnqsVZd321qKZVBzR1YnV7
+njXnygfNV1Tkd9aPv3q2guPnr81Vs0xFq+7oHVfzM7XHVf69a1boegoKqdHNl1XDYjxXHU9jmug
oOekquZFiWVXaDmqvVIqu2rqHdVq6tS5qCqxQREPuUGdsvfPzx1ZzG794scUVW3Hh8tGquG54u9V
Orq+rD0eHjq2qlagNV8iV80e3l83PV0SoKqedI447dVzrVfugqvdciuNm75HURY+u3I++UDoI6rt
RHhrPFVyOero6C3zXHV1VqI9BV1BznNQHNzxVXnHVTd1MUVxVD6OPnuq9HeVMV3zc9V2q7Vh+l0E
Rz3QUFV81T2NmRHqaCgvZqCrY+c8VXxc3egPFz1ddBO0DqyrLNQI9BHznq1yVCWRY3mK7q+rnVZq
u1UzqsHqLyg61U4u6rMWVWT0GOKq5VcyrjVN5G5rts8VBQVYaooMjjug5oo1VpGJnq6pjPHzZVcj
qDVc6lnqsUFWZW8/KkfTFVgIBArwQ8rlUNhr50wXrOGd0/qxtJJzWdOH9yUA4BErwQVQQOGsNfKp
gvXc15O5W4eNgm9X1nTh/dUc8mJ4a7j9KBHmPUbqbp5VTapq89TGqqcxR1U2qpnHV91PPVSBlSaq
ncUeVXVVT6rqg3NFVSPjyLnoKnnmKigPFEY9VOzVWrklfNMKKranrce7klMeOJ4ZUEVXuqntQeqm
Rs5qCP2O6qbVU8jPLV2NRLnqpjVT64qmJGoOfFz8zPVmRVXT1L9uqmNVzqaI8xV11UrVZdV054zV
WaqRbqtVFRVSQ4zi91U5qp5V1VIFV2goLNUVXOaOqm11KPHz8xuxs1Vcqpu6rNW5V/PcVV/nqpGq
KiM1VPavq2qn7qvVUwqznq6oqpRqt1X4ueocR8znqsXVTyqnMxVbqp1zuqlXKtjqpAqKrlVMaqY1
UjVXlVT49VPKT2dnUwAB///////////0KgAlWQEAACiBfg8R//////////////////////+tVOVW
amKqn71z1ZVTyq3VTSgqxc6ypjjN25qqbuq5V8auqnHkXNFUVZVcjqpvUVU5qpANV1VPKirufUVT
k1zpVUxqpjVTPmqv1bVSrlVIEdVyqmNRVeVVMaqRqqeVWqqfHPU89VMoqqcVHb2JnaXOnUiq1VZj
y7yrGerrdV2q7VtVmqnFRVfuWq/VTbmjPzJZ4c3vNV9Rajq0/NHVtXVEfNVczrV3NzVWKu665n26
rmN2quVZVnaqmFXOoMer1V/PRuz0HNHFccVDdTGSqyzH9jPnWKhPdmug5jm5qss0RzHw5qjpGbmP
QZmOkygqtc3NJVTepqar0Z6qYu7vmyqmNVOVqcw1V2KM1ZH7ZV1WXV+RGqtXdVPKqa1Uj89Vyr46
A56qaOqnNX1ZVTM9TV3NVTzn59C46rvaooD3U8x5k3e+bCV1Uhc/POGqaqQauqv93M1W6qcGqd3z
VU2qb5ldV6ramqkg9VPcnuaO5DxGPU889zVJz5zaPzVKi3z1WKnmjoZehqjnj58VXVbLFV7qt4fn
oDG9PkWTx56ravqbjZ1dXVNSbOehq+q04j5dWdKrfPlQc3k46rt81ThjOXnPOnVRUzB7jquVNQde
30vmNVtX6iijNGer6jnNz1bV2VNW1dFUe8x8u6syhqarVX80dDQPmjjqDHPnPVk9kej5V0mcx47t
HkiiNbjqpnmUEdBVTlVWKrl4eq7zVWKCqxV9VOqsqpjzVNQ6qfVXasw1QYxzUFXZUG5lHzxz3yp5
++Zz1NBnlxHjw9n587nqs1XO1mVQfOswePO55zI+bPPbrLzv57mPN1WpL6cPj9MREBAjbNBtYfNi
KYapBuXfMqEc7DrprWlVh10WW04fr3EQECNbNBtYfNiKuaapBvivmVCOdi7TVDsNdS01zjcTN1uo
q66m+Ywqu1X46uPVTTnqpnF1jPlWVXsj5lz1WXzVWOaKqnnMeq9bPU1FVLNX81W1UkVANrDmoAo9
KONnj5qviWG0c0R8EV3FFUqKq9Z6jn7VFRUnqtKq5VkaPdRUxqPnqp1dVqqnSqVQVU8qtVCjiD56
rl1Uzqp6fo7jqumWHi5nVauWgqp7FVTydoHzc8VV7WWK9V2gq6oqOfn5zaqp4Y1XVZVTiqn1VMDR
dO81EeqlHVRVTJ1UyqpvlX1WKqf0FV66qU6iOM2Waq3z3U1WTZU1HeKqnZqmNnNQm1aoKvqboKui
6HdHUZ2qKr1RUVUwaoDuq1E6rUXSq88qOerc5qrSjVVM4jGmuneqmT1UVXKuoKrVVK1X2c/PHVfu
oiqu1BquoNVU6iij7VrquGVRUVYe6M77VGVXqioaqKqYOq1QHNEeqyeq5lXRMzztE+h6iJJnVntn
vLqDXzHyJzuVGcx3zIy0d4a6JxYY8WZGbpUnZ/OeOPnPmpjssM0eqwZx9VbXd3vNYKqcZR9zRR5V
ijKnM3MOM2Gc4+vWOzWc+I8Z8sxzRI2H7mPVdtnt1MV0eMG8qpjUVMeRR2pir3V1vLa7xxVKo7N0
xXzYYx7dVrnqt1WKjnPVYqtKp3Vdqv1NXnq49XnqsnZz7oKqQee75sP1i5tnLqq5UxOoqzntHdVy
NGx1BjHDVWVNVuq+erj1dcU1h4nUxHNVvc3U+R5VTnms1Ac0ZqmKzGiq05j7C7Z1nkFUVdQXmu1Q
apqKqZnzMPQHypqsuKoj59xXkcXQ140lHzdudGRkaYvM0aKrN4e6vi73U1F0GUGYojpxVJunNVcq
yaccxnWPtG+aKOojyKrkeI93zVYeOzRXzrmuK0zGoLqEzLKiKOqlCOqzzI6oO8aqpv7zVU5quXdW
VU3uq5U1dVzjPbcRo5JbpPG4pw0UXVG56D2izBnFNFceqSqzUXzvmTMbtuKpmD4d4Gk2qrhmqrcI
EeOG6XYRxNZYHEiE4UVY25JU8mulJZqtwgR42Gul2EcTWUBxNhCc7qsbckn5Bdqy8yy5la9E5Od+
BPh1V/PmpMqedc9RZzc28PV8VA49mnar1X1Y+sTt1MSP7Mxy0Scz7uLNe+NboHetxX4vdnsJGvL1
iycs/aQ1mL28VAz3GbpdDHkcyd1ZHHjzssjs1s9WVfVeywunvPzvtzc0XWNXpnjctDVc1d8/PVzy
itR1dQVG5zplVMYo+pll2aqxVkXehno6CgzIz9Zi7uqmVVgxuc2qqYUDzNziqaC/KmgnLjZSPtVT
iqnBqtURqsfVz9xdNxdlzVWVaNa6xb6GXXDRVWKqd0EWnrtQX0oKG9PVVzmjnNOYyNVU4qpx21Vt
xsp2qpxHVqqpwarHEbOvw+Ho6iqmHM6uqOacNpRR1B1UaNF16l9OX3pvEi+jOz9YntX9v2hivp0s
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
SYeUroZiaWp+4KJRtB6I5mzsNsTYcuNjOpkkxg0d8nj3WCEZHysjmRO15N73ePMc50bSzrEjnTBr
/Q9vadzTsHY2Ll7RRgLc7HYt7YjtfRhOMq2FmUwDrVZm9SpdtboMswAepRh5oYZLoZWYzE3Ho+oR
p/3ZZvG0XR3cg9s77Wvfb0uqJXzlxrMli53JaOfMlkh/X+fEQuzu05v9KX14vO2YcpapkzHeX6k5
/rhei93oHdl82ReziNQk+fbV2obl7zAWf7+ktWPpzur6aaQcmvxJhv0tt5zMRf104iRVHpiLrxPX
WrHMw9/ZrhdLWEZiHc1tz/EI6XJ6H/TtYVLr1JPD6kmdtuXNXMtjhez4XpsU08lff8IyzN3Gp22f
64xWkq93NyKpg3L/S8exR4Nuj2V7zF4xno+LU3rYjQHMGpYj7L0/aSFPTU9nZ1MAAIB0BgAAAAAA
t5G7Ci8AAACZer2qEunt6err5Ofs6OLt7uTp8e/l7R61mGkdRUnIRwap26p+4dzw6PyIwsuNQrsH
79yN0fOnreVfd1U+XaK9e7s69U+9Mc49+zMnG7MH5r6p1hubV1OWAUsjMYEUsRHvJta1eV27LzZM
Ps978qkxcspw2BjSKKYaiZCO2msdsb9Zz/Gnuk6+zGDLuuabIK8RmZv5/Z81s19n8z1k8il5y3hO
U6OiNf/aqTVO6rbuPJ5221Yv6nvZE2Nuez8mbze17NWnm+WPTvW4kpFTjeeaMZJmjZ1NhhzuNIf7
/ONFsdHkjQY1VSZX+y0/GkL75MPqqYeTqJgY29eXQj0oscL5HrVY67Jqgm4JNsxsv7bmS7toF0W3
B+9SZ+vz+XdX7bre93udxfeaC6c+/oock/v3v3D+mPFWTBxJjP+qDEhtmWqed42+/cV+OfX89Lp+
OERJ3Tzyds4eizvGbXjcWc4Yw0bV5qGoZSFFCMbUjkwH2I7ft1n6ltlsWoe3dJ8kuk3R9FOrP+Pz
P4YRbkPo4WYfOL73OZa+aVL6jQU91Nhjg51T59yHXn0KGeLolD8bb8pKNPjFufJlL92QYxvOZJb0
Z832d92FfjvW3UmxG6cduHaU2rJ+Yzdyy3cXN3jcy/Mxt9y7igQJpwpTGlUAHqWYqb8CxMiR2f7b
ytrP+uv28i7nndPZX3/yJ2Xfi97WqVennPypvlX9U9Zt5sFtF7/sa1PDm+cs7c/ST82jyFodd0cf
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
tnJ08e/X0fzve128Z3TKXyOn0d1NfW3TxrWcTfbFXbd71EZeDYqrbohjcf+gtyjZUPwqgWaEtNHM
8/vhy+jhYDu1QeLV69Cnsa3UfJaSYJ93hyF1tNDX7E3Ctc/tKjpypK3P8WOklbDZLaGevaWrvfI3
r+sPOGibDsmTUc2NllRyfnArIr1Nb4lNyuDj180zUSN5ViPISD3JEW9+rmmLXw8zgyeZ3c82b9/X
4ib9zHdcHdjOehu3IgXThZlu+Ov3tC1TzNvRAB6VWHRVK7roIJPa1o1czyYWTlXBvau6/rj/uHen
K76zun8c1DS3/DvLYaSdPP/mnbn15GifhzHNaLxuPn7U0c21VN/Wc97rMaxZREbs4ROHju53kTfn
Fh8tLv29wy4tR6aGu8wPwy/yczGHo1lH24PN/c9eT1y2fSh2j/yxyFjN5sQf6Eqso0ZbZDu0rX8q
LH8WP9vuPml2Nf3J3NVy7avW69o4JfZu3LZJNbFa6rqOH3ktH2mbpptjTbbRV9WmQWJ8m6Y9Dw0j
5vX5vpM2MR9cXBgTX53rxnc36uF8fjxRNA8bv5Nt3Jox3mLm0gAeldj46hRoFZoCFc4d//WsNqts
1pHQ3u2h8nE4aOuOEDctH/uHnz8alZ/Wi/UexblskVxLHb3r9ak/PRysBV0ymrfFaCqNiMZqn8bt
f7Da0mix7O3D3OL2mmyD7r9TmoQwXPZ5f9Ln02Bki+7PqaMhyYa5re1a2Ge73O+UScfFnU58sPq0
wWYKMQwnya3dtKxGbD1spRrJtMTXcgsl+urzMMVh0nTv7YOvy9BDhbGfQv/IGRmOeyL5iDf56NPY
9t5cPmS0zP0setvV+NHbPl3rZZOjyL6TRI+PPjVaPXQ0ePDcn3MedWhQVykWHVKhjn0nXdzT86Oz
63NJbHcFry6Xmr6eZXwp9BDq4NbOzW2Nc273+ZbD55qn3Jr0bUzd+fhba5+fN1jbjDuzbGnOjnvZ
vBMJH5qHZlq6phkdJ80NU5LNb46Sp8l+2/O+Sn8bqxNmPL6bz6tXbAff2tvD8XfT5TDWGnv/WH8r
4ywY4d99asbF9vp4vBhs1vNmWcp7hsyWHl95UcvhEPOzW1MgkVLEi+SlE0ecWK9rTU1gPGubyIcu
4r/c0oyb2IBbWz7obdPxspgby41NciEnNiP7R9pzsxXscXbqzZMy5flEBB6VWOsCAVGSSN14X9jp
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
5DhSTXtK+t/nsvWX67SppF+NqrtTp+lXoTe7+RxmoiVJ1v/+Hi58ervlEvNTzqtn/vm0fC9h289b
uAWjaTAMMVehJk/Dt+TG2DmXPvuYzqrBIt3dP9b/W/3HOe5UYvqKNPEiRA2xMT3LBh61WGShUhRC
ouFlXq75bGwc3F3Zy6cW6uipk9Xycg9++Xbvzyxqp63Flr17s4P12aWRtbx3+t+8nf5Yy0biq7Vc
0lJF9snT/C07NFbt90Xs19fByA5/zzGMMIf3f98yXKfb8201WZ5+2C7fbG2HJrvX1hmnX1vrrXhp
5qSeDLq9e/wjzRqW2h5GdOvqHNq/P6bkoyXT84eu5tttdL7n+s88ezvs3UZaYvrSPnmIp9Vgu2pp
qrGZ3w5La+n+68+Wt9XP/fOZjwz7yFO9ESa7c1OuF/3rC2/5dlzb8GyNr98cfdF2/RFwqUZsN9N4
EaMVHpUYeSpGS2inHmfuHKoeny5PpWcfHzueh2hv91Bb61Otfv8N7Wj2F6zv6lzd8kC39sXx+4W3
pjetad6w24yGN32m3S15vckk+nxNH4mmRqNaInFP5unLf8Z+azZStZ78Nvdf01LrnoZ2nVrOQ97P
NJbs+/XDpUfZWUg0uxu76S/GSm7qAW9WyPdk+qhfZbr2MDYny7vZCz0nqyuHi6/+s1UyPcQ5nSX1
T0NdJwxeYSXhMMq8fH/riaz7tq9a14z/fLkg/3qud/bkvbNs5hsJXneuz/cm1m9sjlK7RTVGu7F1
M2i2MXp9PI7Brh6V6KClE8QdMakHz7d1afGhMKpabCigystDVQlILrme275RnX9CvV1dnHnVf9dd
l9M9m7qk4eccS3XS1o/nbJ1s3VLjT/ZyuLKubLv+/voc8b2N7jNuP641cTzup2ufbX/39dtnDefp
8l0PG+lvY96lj6os5BeZmbZuu+7v2i3rdK+34euQFkklmgfDr9SY7jsxyfXBmO7Go+V4t79tWzJc
ma4S+8lc61vGi2v2b3dEh9Ccxrdf81aPw9Xn99E2Tq/X/w37XzOXwvwn5zWyNLo1JuUGf/rYi7st
NTnsZ5SrR643XnhL+uOkbhp0S/8GHpXoaJ2hokRyN9Hn3j4+fnp8GnvQOZd78FAvc+LZ0zHr3bQ5
sddy+4tPnIz20sXrXV29CGm7yQQPr3Bw7l3JbQ39/GQ3Mxklnx6T8Ve1X77/SK7GHtq2+u1f/9QQ
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
8MfC1jDa+rR0+ynjp6z1sD337W3Hj/k4bn9plcnBMdn8aGG0dLKO4r0LdC1RlaZmd1msHsUYoJSk
VJS0YrHeZF3fZBw6u74/3xtdwb0zbp5Plw/BfJL24N/zN6tIo9YFmy2Y20LDNbM+6sVOfPNl2uv+
lPX2YdOS/aq6BZ0u7c7tc+wgV6+WlG86o/V9Deaj2dNg3v7cGqPpdbTxz7ni8F2GoZ+f7eO3yjv7
yTtdU2vaooVuNm/5PsQlXGGR6oF1rWy6FidfZtvXefX982lZNDPYro4wXI6jbfp1eXyLk/0wqkVz
T79uxvO4FpumBzaxHTdrnzqY34jtWKd3nW7z1lrTapt4YHbKrfyvm3FaupOUmpOcL3ehTjM+/Udv
Bh6l6HBdOy1RzBrUprIfXfAFHqpqIFoj6zam8DW3dYc3B3NnlK3lNrAn9PL6SZ5/f+VtnPO9HT7r
4O1a4z1eKDb9nT9OPdVfy9ftdrllz/Efm7mNq/nW7b9Waj4vpk7rbptBaDbXNXexgSl+7Sd6082t
NA/dIda3qpmtc0uQ3atRrGNvjB96Ml7T3HLynZXprmealsjCm9hJTOjUMVKutL/SPVO28abm6zQZ
Rxa/hHiulFmWTop9T/gQoUIfDm/zXPs6TvPRzbOPFru5cfdsf/xU+/5Q+pLzUXvNkM3FVPKFN5xH
+woepdjF+hRA8IvUrHdyc/6Cx2/PcrpOeURVBe/S8M/6/rt3h1vTdZ7z1bO+2Bt77GK6t+YzM7o2
T1ibPMa539HUjfnR+uJYlfGKZuhPtBDveOzgZNqDqYwXSq/s0+pN4++0p43v/nwzFh/6+uKOi1X1
hXi15P792s1GHt+f9N51yRt6Wm2W66ax1u9bk5FmxxV10zbXr8ZZ2e0UNuvaos/WzRqHU0T9i8mz
WaOFj1oMGyKRciG13p6wDhAt2vxq+yV3P7NbQrHd2/fYJy7p7CwHhnW14J6wjq4veNTSehAzaaYc
XUofFB6lWHwGIIQrieOtuTdHPTBVe4UudTd7cv6n6XWxXtsnRprPH/tWRWb3fb13rz8X/jttp9a1
IftPxtx2GHc45Bit8UT7tD4dWrwkzY1P0UUHW11XDbtj4mGYdOsZiznamyVKN2Km19odBt4qe/a+
rD51w9h1mlCzWXy2NPMYt1q6VLlfJaJV1KhhkN+071F/B2KaYj/F5qFntYs/11IP1HeJ1uZBsg1d
2xxbZSMSDiM8jKzpRWv//hUHPua2hXPX9ul4M+65/v11buR2y81+MWfJQvGfouSh9zx6Qt/fGh6F
6KCpkwoxaHphx2z9m+P1jqhdu3uFWjyZ0/Uvn7s9nNOt+q+0N713UtbY+XH5edebvWva8HA3pn5C
e5NyfKt9zLV5kxM+Tgr/iGbdPTRWzXqczOuVq+HT6VeNw304PW/2tn7tHzGb+nNJDPw6Xa+TpN+9
hl+v4yu7h0q/fjUfDvTY+7OpLbuoTRuX/u3HyNKMXeZzd52GczPbaVNnzeZUc+wLF7vrS0hWGnoj
Fob1yI95WowlrM1r8+bpZqx4b+wk1vMx1yePXdw6v+PjO+kkIKHtdBbUWVx2633215b3sFqmbZkL
HqWYaRGMxNpSYBgv157eHVf3iMuXC8VcKSTl7d41Md78rBhdOqJpuBNDm8HutrfdcrJd7XJnvlpu
ghs8f+5NN9Fm+Laun1bbkMz3jHeaEb/O1usw6m0cnl6bz9PFPcOT5qNJINuubZuFRFZDNpO6931O
QqUdpYq/0UlOXaSGeGeKmZDitbK3y4PbZbVPel+7uBxbHyebc5vW3S5bt75ZWHcl01nNpV+d3mOj
2ntY8sfY6xDzalkRzh9Gzmddj74zsyY+sTo9tXF+VhcNLM1V7MueLE13ZNgR16xlSimye4yaEI3N
/faedR61aKgVDIRCJJ26tSfu2cfzTZVDj+1cV1V7156T28yoc3WTbantpwz35cBL4liHXeoU23p4
9ZTV8/vm5Mn5puHXHy3csT4TxTImj7+M/ZxY2w/C1vZFr5OTp9fU5Doao+yfxitNPS6GGtmYc343
pt+/rH2xYyqrYbv6nOT7FZX532VKrWa3pPhm0q9214q7GokdjgatfS11KqXXeX2zN49mPG/THM2s
jnCDIY95Xpmv0NubL61ZcnI0b/AitmPejx6Mjxqu0nTyKHr8iYp5epw0EoeeH7M0m0eJuV2v1WdC
Mw9QqyVTm7mmEx51mHmmjAo1ksjcOlJxODRSFvJOzu1ePi7+GlE99BXedk6cNznjl3/q//G+K2yq
X5YFh5linfvfXL09vmWM3EvWU/bErsdWY3jx31jOmXf6bnY60cSb0Uhg2rVofRQnnl9InLZQ09ua
p+Z8fDOPxXKD+Z/SOkZYUhY5xquW4frbOkt7E8/4mBinhzyf8uQ59j/a8k/CJHHJ+LyZ21jpJa6O
Sb9iHvJkD4k87gQbFPOmRtK3+nXaatnI0XE+FuOwXSuZ09hkjdKtJzqT6cHPbTWX39y07Titwa5z
kZqvg6wtk1vTXm/b6dC9AR61GHmhXFA65Bojc1td9uhRMUeUVu1c1O7lXTpjT6WvU/vL+5O7ftNL
INU2dpBG79xf5L7+nGPb2xqJdQOnDfdmIpNoSTBRerP1+Nr6lF+/0ZRVvsb18/U/SeUu1in/8XWd
MGLb/5XGYJ2a9WEjzuHXxZKM1HD9u9V6S83Wt3vYp/T5lduJOzkoKccWV7LcOJTr/HH60NdwSsh7
Hckt02rT7cm05CtHiGtVKvcQDhtZlzn94VrV6TQSSaU1lLgdP77j06XmqXTNOJNUv3UhevskX3nY
lW2xGu1MU7OuWhqWqqASYsgGAB6VWPs0AWq7O+E7d4+nIV9dj09bMsxTBy8fmz+gylpGdh12DzIv
T/2T/TPaznR6d+c8txPZfN1wp+e7/T/aHNCmteGj9mzE2uxcsdi8dTTprZ8v3bRHfnGwPWnmTrGx
M4/k/84ytvxJ4+/bk4rn+ypjfikEI3kUmYaBFSPY5GEe+81UrMswvoW7bmR6MnAytFFLjO9o70w4
EzrFvdpX65mNjZq+Z9THcUgzJUSdNlOXuUl23OaoLKXpMbya3jOXbt+c2bSH80Nnw869rJ800tdk
07JphOpXJXezocWY73/ilqysxtEBHtVYy9YB0PlE6mYnj12yGLd9nYf5psvLIxaCstnuR5f9Wi1G
h6lf6Xm/AqqpXIn2br4z0ZUR/zqv5zV32/bTh8qafi3SiGLZvFwf9v/P/QuLrTvosbduuFtJrpu0
RjI28cyXg9LWzbPNeJdPNnjQPH2zZB/Or3D99XMtt3fjMnmIk6/epkamDRn3c/+YkovzRzAnz+ew
Hfpo6qid+m0LdRKiJHgSHb1bzsu77kvGOZtn9vEuWlfv/arCrV6GJPHCuEZj/3Y655ZbD85mtR2I
P13IWHY0LScrdBWTSM6huYHSpG6uIgBPZ2dTAACABAcAAAAAALeRuwozAAAAsfYHZRLp6OLt6+bk
4+Xk5+Do7ens5O0ehVjbZJoQlfIyt+n40qrueVSf9n5n3cHdu868JaY2FPfOVvv63m7nBxKwuXly
ns70dlKR8uQF43SvB5q4bp7epBlh/dbxNt3UhTs+7Oj8dRyvbM/t4bsb7Z/7nLHVcFgm1qWLk7J+
Phmra7bDbs80SVtuhwfpz99tx8MwTV9vutJzUtfZtWlki9+tnoyzxqLJ/FDGpEGWFtc93bX+ntUI
x5uIG+21xxFdYh53jpgHLWux7UTtXLXSNV6WZUZf7a3+/UtsjP96T7p4JybvDPI/Olpq2d7WOLGn
zPCpaapbaIe07DwMEv1kAh6VmHUzBYQ9dl2Yudd2v/h85SanQn1B6/LyrqXrzNcWoY4e3/fB+8/5
cquzd9rhQzNtH+/Dc93+UhuKdTet+MlwXo9RM7m75dKawM1FoVrP9PtpQj6IOH+h+zhwbD215iP7
P+3iyrPvaonu24jZjck6j8SwVilheRnFFE2Ri3UP7zKxpkpOdvz0hev1VRGhMpANi0ifT3ozljTU
3/a8m88i7jEx2Ppz2le29yGVbQjbZ5H4+eZunM7pXIyeasHm17brZ+LGHfjq1rjJqXYae/f88Lhh
5+Q8aeZ+pz2ZmscSDyFF+qKW5AUexZh5qgDdviT16I2zY+NvNzd3svPA0x7KO2uY9zVq/Zp136kH
Qzf2eHA4XKju7AwdH/5s+qnNwotxUdrrza47DDnmep42PUh1cjr5G7Jt0mlbBrWS2T8FtZlNGJ7I
YdVRuf/NYNnHI64JW+48WOdcfOI51Bg9aLdWtxmZ5juPSvCTsQ5a9cxNnR+tpPmqYcv8dn02/fZm
CZbdYklepUaiqbboc0bzrL0Z15N9fG2G93IzOUy+e9Nm3916fGVJvGuju1/svOYPxnqbT1xoJnv+
7/yRdBNbZ7Y6W1uXpc9nW10dHnWYZRGgdJXI3KnPXz6VH4/tqK6up6zQFdo37+ZbLbo11/7mtrx9
/lyyOV+0tnl6ffFh2u1pke2r2dk6xp/3jYubebQ+rnS47ttrV2w859+2aZX5kse+sumTrdHJnO66
ZDJVmxNR71/l1twTPxLxY8XcPbLOtq4fyWYcR2un0H9UnCbNRDN3S0Njkti3Ms1Fy7xqnYymlzks
+9JlOVkyfQiV5D3tuJ9WEW+tWUJs+rfuR7csGjhL3PXR+uukrUuLY0/ik3L8g184sjGOnrl1ycm0
Mw+vdVp4S78+rT6+9bV2bTfLj2FJ5w/ZVnoGHpUYZOaKoeWWJe9uXXg8hg9dOherS6p66uAeuv51
lyuyD39G34tufLz0CvFeTq9elLjtgNTiTt+ruRHZTYuz5WR5f/fA1LnlwLiqO3CuPSjzght+9atq
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
w2/70Lr9+Jb1yOiPD7Ss/K6R3frBt/qkT1MXR/z7xFOZvnQjcRvqNTb/vSc2ttaPB828aFwE624b
MkrzuKc2xxbLvk76GpbplDT7whWHVKtUzxa12viw+PPPI2Ncpw8frynOTnLs26N2JWrUmmPX2rmL
1qZzbc3JosSnM4q2L3b9kaSM5nFp1zX333znN/aaG9cXj1w32fl6O2r5V49j6qff5rivJjON1HQy
ozHfaB6VGHhZkYSQCqVuzgrVxay+f8dDlYxud+8a3HvbK+G+qVZ4q8G30ssAL6f8bJy035yYNLd8
1XyT1rNG+9bTEs8cubR16/B4ePbqwZ+tmsfdDjaR+MmBUyOPZvr108+5jrltFt2ycOCjnZvV3TiM
lzTVuO46sqeDbJtPY7PWyS8reT/ZptPPpzzze8+n5P0Dm8yf9f3pmPj5q17kcRJ/Zes0pQ7ta76H
nrQ4mTDbxdxksc+puTd0OnPJk7YhLFlLdq+3530j3x77u0dfnB7/SbusEnPiidF41Y3OU6nmmvZ0
0okinptWczumRWXcAE9nZ1MAAIAoBwAAAAAAt5G7CjQAAACME7trEuDt7+Xf6erq5Ojl5uPi6Ofi
5R7VGGmpAFoKJLb/fvHCteuKh3Jvr65Gi5Ycb/P3t1Pvedr5c19+e/l4R+kfdo6mZzg6PppX6PRT
M+Sq/fFKj9Ha+1xWS9itX1pS76f/t089nYfjbGuLJfOwzV3oLLeaMd1Ed1Cm0eoTjeSN4iad+X2i
MYy2pvTltIeos91Mx+N0fGE1auo2NLtN5jhjPjmjv08eY3Y55T6v61ldQbgw/lyuNGamaU/McaKS
XB61I0OPq5cI1abTdzLunqU58qNkf5pPdfRC0R3rpqz5nGE1X3jAMsz70TM1dDeKRpwqiGQBHpXY
2VgVqOGTyGx94wu7/tLOryt4hdqup+3TfxaG7iv1k9e+pzN3nV18I+1JGTTYtndP7IFfP7d+wt6r
cd918d/9ZWjhkmh+ud6cx0mXG+RFnb50lkj9MCTrtrbM9FsT2zxNXvycf3nxftss77c9eRtXHLWM
/zdtt+ZlU18epg91t9etU7dqyl37my+n4a22T2L20/3F0koz2t7uizltQ+7nUcuWzU7JuMV9mifJ
8kqHWRe2aNyTPYgEnrfp/XGUwGLdbDPPSee55njMuxzZ9sHCesxTsdOF5Go065PpQ1MDYtJTDUK0
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
62NyRNO6btjdjyeEsitUUcij8/OXd79bFObjktU/T0h0nEbznyfM24GbE6aOj8d4nR+PnMzlaBC5
OaZWgTB/PufK+F+Jc/AEV+RM/CvfU9H4HM/Cifgrz8Al8L8GF6v3THZ9BP0dnk/R8RP8Q5PgcHs4
PB8j4HyLQDEQyQyQtwwQzw8Qzw7Q5wqwzAaFaGmGmGOF7xCvCt2XSB6LtnndFcLh2CLzqO5T7+8p
dQB/P03no/F5fhZP3Wwf4h58IhWhfBodblSUYH8/TtfknP3XXwPCIbQ7AH8/TtfknP3XXwPCIWAo
o4B/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/
P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn
7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3gAAB/P3Xn7r3g
AAB/P3Xn7r3gAAB/PwBJ+5s/dceHItF1BAsLCAgMEhggDnDI6AR43su9qipmKZQegTBxnzK7A+pu
3uQ8GKa5Lb3CsQa9kHKiuV1UG4ILKE2pBXepUBQHNVSfQVMfMqrEVWZVZdHQDnoFVb+o0fBRVW46
qZ0FVuojKxVU07R1bqI2sfaoYqwUEcVm775plK24MH8/AFfubP3XSeqwAG8Ifz915+694AAAfz91
5+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+69
4AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+694AAA
fz915+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz91
5+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+69
4AAAfz915+694AAAfz915+694AAAfz915+694AAAfz915+694AAAfz8iZ+oq/ddW8uOICGJ2FsQN
CSZuwH8/Imn4Ak/MEfiOvwhX7rC1O38z4ladlHkEGQXpuGD7jdMBy8CyjTT4nSgubAUZ02lBqcPk
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
d7Au3VmjVu3FvcQLe8VvZokxl/S4X6v3Ay4/99wvgTmkMuAAwBShZw0PFLg9cNHVNZwxKQRl2XjR
WzgpWO4dy2TUqzgpVw/ALh3cFCKk47v9ahvAdlQmU/06EMQRcVEFBUqzgpSCgoKCpVnBSkFBQUFS
rOClIKCgoKlWcFKQUFBQVKs4KUgoKCgqVZwUpBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKl
WcFKQUFBQVKs4KUgoKCgqVZwUpBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQVK
s4KUgoKCgqVZwUpBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQVKs4KUgoKCgqV
ZwUpBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQVKs4KUgoKCgqVZwUpBQUFBUq
zgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFK/k+gkd3//d/pv/0+k5d3//d/pv/0+k5d3//d/pv/
0+k5d3//d/pv/0+k5d3//d/pv/0+k5d3//d/pv/0+k5d3//d/pv/0+k5d3//d/pv/0+g2GR28w3n
+8u3wO+J4o3wBa04Wu9/dhvh17/fkK97rWnC13wibMF8Ovg6yl7+WtOFrvhrhK+IXvgSw3w1a04W
u+EaCd8VvkCBhvgy1pwtd8FDxO99XxJX3yJa04Wu+KYo3wm+Csq+CrWnC13wN+T74PfIZ2Eb3Yta
cLXe/SG75DfIt9fIlrTha75E33yO+Qt98gWtOFrvkFl++Q3yH2vj61pwtd8esGN8dvj3ffH1rTha
74/+74/fH6PXx9a04Wu+QW9fH75BTsS+QLWnC13x/vvj98gg18fWtOFrvj7ffIb5D8b4+tacLXfI
N9fH74//3yBa04Wu+Pxa+P3x9Ia+PLWnC13x/fXx6+Q7a+QrWnC13yClYl8gvkXdfIlrTha75HYq
VfIr5FuN8iWtOFrvkP7vkV8i5r5CtacLXfI/jfIb4Iq57n1rTk9nZ1MAAf//////////9CoAJV0B
AACBnWdyEf//////////////////////JEXMGbFKSfQTb0ZemU16ZvTNnK9M3plNemb0zZyvTN6Z
TXpm9M2cr0zemU16ZvTNnK9M3pm3r0delP/u/03/emb0ymvTN6Zs5Xpm9Mpr0zembOV6ZvTKa9M3
pmzlemb0ymvTN6Zs5Xpm9Mpr0zembOV6ZvTKa9M3pmzlemb0ymvTN6ZTm89XoS8/Xlu893iOd70H
MwGvLgBnDWbRZPPppEjkqwG6zkzXhdchCgHVUPHieh4CwKGYbmHRt5As9heGcRM0CiBXZ0C19wZ0
WSPgJESmSoKATqtRC8FYsw3JE/KJmtT2Ez1gETBLQIHsR3IAzVoCjT8fwPY5qXjvCIEMaEppk7Dv
+3Dmox3tcLLR2g7/dPfN/QQYdFW12fQpWA3R3Gn3/vRbQ3R/v7u9uV7QjuwPTz/9smbCL0LCSY90
f6h1n9gd3N/WI1vd2+7qXf3pW+33bT3sTk9+WyUkd6+s+5usT+6Ddb2+7usbvsD9xjS7dn7Q5I+x
Ixb27Rlq6xrG9Pj3t8UjrL/b9v1U3tT3H+3SZv7qKV//Hf9Dd0cuil0Z3C6MmsmkVvQxJ9BIvNl6
T1QEBA11Tq9J3pO9J3pOzpek70nek70nZ0vSd6TvSd6Ts6XpO9J3pO9J2dL0Zej70nek7Ol6TvSd
6TvSdnS9J3pO9J3pOzpek70nek70nZ0vSd6TvSd6Ts6XpO9J3pO9J2dL0nek70nek7Ol6TvSd5Jv
JNnQ4z79nTb+bPZ0OZM71nRt2vWdHq3q7Ojzzz1nR56t6zo8/W9Z0reees6PPPvWdK63q7Ojzz1d
nR56S9F6KqaNje3en4dDt99vt/dQ+jb39ZbJ9v2O1jf1icvl76lQ5kql9jUW9Kb+31NE6yNYEUr2
+xGpftPXrY+3/3c3M3fTj/93xppUO31n7fFVPvXT7+ig93tYSH/Um6HfR+xGaO2/SFzMuZtzP/7n
SVB8RdAQMOFPoJCBrqgICBrqn0YjSPVaaRj/c21/0aHWfJ5Uet62yU6X0+b/5NzJVPrEsjWCkdTb
+/vop/FGinu32Tu3YPdaymT8rGox9u+P9H6HWJYnfZNx2zdS5PlL+9Pkmk2+sLmi1L47X/9++33W
fJ/VHm/t8k75PgldT6jvkjvVcyrmbczf3czEDDhQEBAw4U+gkIGuqAgIGuqfRiNGjppo0e/kprC7
2s/Skj6fdyfnyfw32Sn2277W5voUO3H+t5PlL7P6NGp6RSlHkq3vsDxIbjYnWNH/jBv6m32BuPNY
NDqUbUjrGb/sTrJ3t9gp50KNi2JYCGgp7dZaNGxO237/o0dx9I9o2IhtTSqVGPWf9ZPVcyrmZcy4
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
xYoQxYoWcIYsUIYsULOEMWKEMWKFnCGLFCGLFCzhDFihDFihZwhixQhixQs4QxYoQxYoWcIYsUIS
ncjoWcIXHW46whcebiVCzhC49XGmELj3cf4WcIXHu4ywhcgbjvCzhC49XGCELkFcgIWcIXHW4awh
ixQs4QxYoQxYoWcIYsUIYsULOEMWKEMWKFnCGLFCGLFCzhDFihDFihZwhixQhixQs4QxYoQxYoWc
IYsUIYitVnCqQrilCFw8kSFnCFw8AlbkK4cenFxJuStyFuIdxWuMtxhuQ+972zMzMzb3ve972zMz
Mzb3ve972zM3LQECCDD173hzVRaMd6N/oDql9izNGOm39NCPDQw89ADC4f/+3czdzf////7dzN3N
/////t3M3c3////+3czdzf////7dzN3N/////t3M3c3////+3czdzf////7dzN3N/////t3M3c3/
/g4zLFwxkDGDmNHRKTrgOOzDeMiO8Bdze3HN7cwYN73vBgc3txze3MGDe97wYHN7cc3tzBg3ve8G
Bze3HN7cwYN73vBgc3txze3MGDe97wYHN7cc3tzBg3ve8GBze3HN7cwYN73vBgc3txze3MGDe97w
YHN7cc3twWmIgwWBm63N7cc3twHkOZSePUCmRze3HN7cPYhACO4CAG5vbjm9ubWZxkzki53N7cc3
tzFNQQ8ldKZBze3HN7cwYN73vBgc3txze3MGDe97wYHN7cc3tzBg3ve8GAo8fCiVepLBg3ve8GDy
BEwBV8SwYN73vBgBTdWoQvXeDBve94MBKtsRT2dnUwAB///////////0KgAlXgEAAJfjTpgR////
//////////////////8dUF3Bg3ve8GAo8BnMhPbmDBve94MDm9uOb2gtg2QXVVFB3urBvcBfEQL6
w8Mwb3Cre8cnjIAe1uLASBj29inb30Y73vcY9vfdvfRjve9xj299299GO973GPb33b30Y73vcY9v
fdvfRjve2jHt77t76Me//jHt77t76Mf//jHt77t76Mf//jHt77t76Mf//jHt77t76Mf//jHt77t7
6Mf//jHt77t76Mf//jHt77twSYx//+OuCtzIkKzEte//9bHCLOq7Q1GP/NZComxtjX06ytSxTfjG
D6wOOOt6Hn9b1q1bjwx1tTYeBjPEOxu1fat5YehjTsfahjJBjrVq2rckGOtj4WGMkGPC3rahjJ93
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
Dlcr84owcxnujoQchyXro6Ojo6Ojo6L1l8/0dHRmejo6PLF9HRiDTyvRnfro6Ojo6PozzByPRnsG
3o6Ojo6D88+jFaMSoEujo3dHR0dBzqiDo+vfn5l6Ojo6Ojo6OjDYLOHf+G1gejo6Ojo6OjoMRQAe
hjHT0dCoA6Ojo6Ojo6Ojo6MHhjEwuno6OiOjoOE5T36DiUFqVQWqC1QWpTyuboVHirIVZ/R0dHR0
dHR0Qsjo6Ojo6Ojo6Ojo6OhZZfEdHR0dHR0dHR0dHR0Xaazo6Ojo6Ojo6Ojo6OgkdHR0dHR0dHR0
dHR0I8DAMz/6OgyDCzOc6OhGYzF66Ojo6Ojo6Oi9zo6Ojo6Ojo6L3Ojo6Ojo6Ojovc6Ojo6Ojo6O
i9zo6Ojo6Ojo6L3Ojo6Ojo6Ojovc6Ojo6Ojo6Oi9zo6Ojo6Ojo6L3Ojo6Ojo6OjoSqC1KoLVAhMq
RujoJQFdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0d
HR0dHR0dHR0dHR0dHR0dHR0dB6e3R0Zw9+joPTR0dHQqDujo2aOjo1fnR0GsbfR0Yc4Ojo0j0dGN
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Oj6D0Z7HdD7cv0Dgfno6AewFV30dCqtVTypC6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoLo5aHo6Ojo6HcHQ/R0efxXo6OC6Oiuzo6OjowbdMnRz0f/R
0dHQcOf6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6KH/uNmbfuyuc/ejo6NhGB0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0HjlZzq6Ojo6Ojo6Ojo6Ojo+sRmeOjo6Ojo6Ojo6Ojo6BMr
2MHo6Ojo6Ojo6Ojo6Ogx1AsaGW6Ojo6Ojo6Ojo6Ojo9h6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjozHR0AwfR0Y3o6Ojo6Ojo6DH09Gw7vsGZ6Ojo6Ojo
6Ojd5dBn5raxnR0dHR0dHR0Z/o6P/z6PHo6Ojo6Ojo6MD0dBidHR0dHR0dHR0dHR0dHR0dHR0dHx
0dGd6Ojo6Ojo6Ojo6Ojo5/suYP10SdHR0dHR0dHR4dHuYKpD6Og9ujo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6IHo6Ojo6B6A9ANLOhnRTo6Ojo6Oh35+/EfDjo6OjozV7+lRoCHhjrwPuh2l9dF11
PvoUEP66f0lopDrrrrq3XXbrrrru/T+un9YL9P66f0T+uuuuuuuuurdOu+uuuif10/6U9qjmHC6/
X9IbUFCsGgP7xqu8v8CoyGWUvrpx0hm9DIWv4Q7YIECBAgQIECBAgQIECBAgQIECBHAixtuIEbqE
ARGm5tgm+64jw+dsbwCOKAE76CI/5YzpevQ+qbBAhAQI7f328QgIxkQ81MbwPwJffaRhxjp7rrvv
t+PuM6n6tT6QhSKRSMcALlVXqqvdYxgQwoYHuH9JfeOnrGcPh4YPHwmZmkIUikUhCn03nYqolr/O
FLwPwkl9PcY7sKHj4v8fGZmaQhSKRSEPL1+v96mosdHXWNQh26f3jOHp7EO8KAjGT8vJ/j5TMzSE
KRSKQgpwopjHb8PeOslHETa5v6S4S/HxcePjMzSEKRSKQhwohwoh3jXfaES/vvC4eR8F3gJ8unLz
NveMePi/x8ZmaQhSKRSEAcP744x0uJcdYMYjpLLDE412h4eKGvwmZQpCFIpFIQ91en0H3ECBCCMR
mHoQgIEICEBD7ICBAgRjQgQgiH4EBAiEMGMOOkukIUikUhDRqeI0a3JodYOsbdP+vxLwXnBgLCIE
CMhIZCBg6f1111118ZhzAIEEo/oQXT6BQH9ddPpCFIpFIQ8aBgEP1aen9CMAgQIwIYcGNYMY+Ma8
cb+cdNIfVaQIdd1AQgIECBAgQgIEICBAgQIEICBCAgQIECBCAgQgIECBAgQgIEIKqCAs4eG6FhBB
vdBuxAQ0Rt2oCBCAgQIECBCAgQgIECBAgQgIEICBAgQIEICBCAgQICIEICBCClhAgQIQ2ZIQ6fkq
hY4AR5L/vk9nZ1MAAf//////////9CoAJWABAAAFzkkJEf//////////////////////qDsf8peF
+DB1CAcD+rIHs2BEIOuyf1jPT7Sl4XCHT7Bxnp8BS+n2xjrGOrIS4w4x0WMRdcvPrvR0enrpaZB9
IO3eDrA46fkjQ7f+3rqCcGpYgQIEJeREKzs0uHhECBAgQIECBAgQIECBAgQIECBAh2749qDqa0QI
EbqLw7du3cCNN7tswPvtl27du/L93iI3gEK0RZrt27d31MI6iuZ07w0u3bt2+s7hAhAQIe7du3fS
AiRGB7t27d9YEQIEP63pbt27d9IIzChhS+nbt27cddIhxhe7du3aHbjtB27du8YhDAg7du3ex665
E+1fQr9fr+OAF37+v/f1/SHT+kEYl9IY8vw410/qEt1jGHp+7e/43sYxj6+hX6/X0PHWttf+/iWt
84y6S3XaXgx3/Hx18fDGMZX0K/X6+gs37qP5vLHEuusGOvvGfj5f8fLGMZX0K/X6+h9/b/v7xrrG
UY6fEpeDr5+O3/HwxjGV9Cv1+voff39/eOjp+DtCcb6x194fj4S/jexjGV9Cv1+voff39/eM9Id9
Y6Osdvx8Ibt7CYyvoV+v19Cr/j3Dqs1YQIEOnQjGHToQIECHToQgIfLp0IECBDp12g6dCBAgQ6dO
nYgQIl06sl2r6Ffr9fQ/f39/e8b1+CX3YR32fQgRW31u/eOjTSaSIEYecOEQeHC/6+n4cOF9fQr9
fr6FQrDxD/39SxCAhAQIxnH51jWPz9feMd970vtL771pbrGHWN199KrxsvSBDp0IECBAgQ6dCBDp
0IECBAgQ6dCBDp0IECBAgQ6dCBDp0IECBAgQ6dCBDp1tXEcBWdOlGOnTZNRjHToGp06YIAI1+Dp0
IEOnQgQIECBDp0IEOnYgQIECBDp0IEO3YgQIECBDt2IEO3QgQIUECHToQ6dL3gQIEOnWrOrp11ni
s999u3bt333327du3ffaM67du3bvvvvt27du++++3bt277777du3bvvvvtB06Qdd94NQDGNv9Muq
i8J7fiok2+pqKCMyz/2ZjIf4TmO84jtMs/MueJ41zh4nidudOATxPE8ZlRMbWYVBZ2QJ4nGc2RPE
8T7CeJ45w8jT2b/88TxPCu7P6sqeJtqAqboPrOa1QCfx4niA2sWoMTy6s6eJ4qldU+5XMKgG+DpU
JSgEMQxDxPE8TxPE8TxPEsQoWcQeJ4nieJ4nieOdyOWwB0HieJ4nieJ4njMdkCeOcPE8TxPE8Tt5
z+Azx4nieJ4nieJ45LMGbhjxPE8TxPE8TxPEsQoWcQeJ4nieJ4nieOVzBgmIeOvqPE8fo5jxPFUE
GJ0ALAS9AGnieM546T8Oo4caoHzSxhkCeOLNY4c6YeBVA6gAN42zQ8sZgcDgVQYqDcCcOBwJ/YQw
lQiYHV5qiJQcqDpp8KAVQE/4TjOnJ7VASoCVQYfxtqAnM5DJ+O85zoUBJt5NUDqAlQEnUembUB+G
P4xVBacOcUKqgN8ztVCqonVCn+enTnsh/75OhUN58WhOCmzZ8Z7KnVlszkjlDNsUFB3qgDPYc5M9
njk3Z48FQioGDHwH/PPrPk/s9nj3OTaGfLt8TvPuman257PZybPHycXn4Y1QWqghUC544z3z2ez2
eOxUOKBwz8zmZ589ns7ywM7fHKnplc9ns9nj+zGznFeqoMVBmez2ezyozVKXub+GzM/9ns9kP/or
zzMBUWqiLPZ7PZ5UNTzmRjjeP1UNZ7PZ7PTqikycz+TzT57PBzyojA3jnoVF6qJz2ez2eVBR3mMb
5vGQqRj9z2ez2ePlUYm77ZmZ589lfrPZteGeXI7VQDns9ns8dKoR+FB2oEzaOhUG57PZ7PTn6Y2Z
/mhnz23NZ4+6eJ3+fgfJxZ7PZ7PKghUC51QKqAQ0lQkeGez2ez08+Z/p2tHNbM9nlQFlQfs+xUAf
Oez2ezyoRO9QUKBg29054Z7PZ7PTz5ecPP8/1lM9nlRCqHORCYqoj+89ns9nj9VBRvm8zMzqinPZ
7PZ6aeedvCojAHPZ7PKi9VE89BjG+qCjvz2ez2eVIx+m8ZBu+x8qjHPZ7PZCs+Z55CqDOj/z2ez0
6oVDOoFDeP1UFZ7PZ7PZdUgml0dGZnnz2ez01Z/xuzDKlY5zmOg6DoyqoOW+h30VGioPOg6DoOhU
AqhZQGSZQ4ghOg6Di/MkO/70YxUOKgA5DkOQ5MjkTkOQ5Dk6urq6jkOQ5Dk6pD66slJpcHB7nvTG
nkqKMnl9mzZmFQFs2bNmzZs2HF19fV1dXWf2SOlUEqhnZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2b
NmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2
bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNnX19XV1dfX1dfX1dXV19fV19f
V1dXX19XX19XV1dfX1dfX1dXV19fV19fV1dXX19XX19XV1dfX1dfX1dXV19fUoIFAN1dX5ls3izX
VASggUECggUECoBNiU4DyMCqoEUECggUECggPHF445z1wigGVB6ggUECggUEBz/3Bwqg42zROFQQ
KCBQQKCA9cNNkV44E9FBAoIFBAoID7xSgIVCOcxWOUECggUECggzcGweR8mubJ9KCBQQKCBQQZX9
UCB7pAkb6ggUECggUEGBT07FBAoIFBAoICa1coIFBAoIFBBCwlBAoIFBAoICuiUECggUECggbcLV
BAoIFBAoILIh1BAoIFBAoIIJQQKCBQQKCAXTqCBQQKCBQQXK6ggUECggUEDYuVMSggUECggUEFVB
AoIFBAoIFy5qFBAoIFBAoIE1FBAoIFBAoIBTEkKCBQQKCBQQEs6sPmFBAoIFBB/eajtUhykOUhyk
OUhykOUhykOUhykOUhykOUhykOUhykOUh3Wo/1IN1dXX19SkOUhykOUhykOUhykOUhykOUhykOUh
ykOUhykOUhykOUhykOUhykOUhykOUhykOUhykOUh2/K06tahqMLBpJsmEXgYZynDljlwwFxiGFX1
wAPT43B25OmIMNOaprcGAcuTyp7CDcbhr1cxcAv9w/R2Zrf4+lvACdniJi5M581k9pwaQe9+GHS+
B3nCdj58yDOlZ0bD4PafnGMxxus4xGoP1xiux3YyL2oiLWAuFgE92G6k44pfljxcLGMEhAxA04fL
kUQsElwrCuC9qRokXAmhwgcrBte4baxFyNi/b9K7i4bze1I3KNwusXCLhTVgKyHHr5ZRvx8Ub1dX
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
wKsVVi8tbzy1vKrGVY9zKsVVictbzy1vKrFVYyrGVY/LW88tbyqxVWKxVjqsflreeWt5VYyrT2dn
UwAB///////////0KgAlYQEAAOpZ7qUR//////////////////////8U28BhDH5bVtQ8t6upvPLW
88tbzy1vPLW88tbzy1vPLW88tbzy1vPLW88tbzy1vPLW88tbzy1vPLW88tbzy3q6jz3qhFUKqhVU
3HSqFVQr8/KoVVCvz8qhVUK/PyqFVQr8/KoVVCvz8qhVUK/PyqFVQr8/KoVVCvz8qhVUK/PyqFVQ
r8/KoVVCvz8qhVUK/PyqFVQr8/KoVVCvz8qhVUK/PyqFVQr8/KoVVCvz8qhVUKqhdUiKhVUKqiRU
mqhVUKqj4+lQqqFVRcqLVQqqFVSSqT1QqqFVSCqI1QqqFVSYqNFQqqFVS4qLlQqqFVSOqT1QqqFV
RT8qhVUK/PyqFVQr8/KoVVCvz8qhVUK/PyqFVQr8/KoVVCvz8qhVUK/PyqFVQr8/KoVVCvz8qhVU
K/PyqFVQr8/KoVVCvz8qhVUK/PyqFVQr8/KoVVCvz8qhVUK/PyqFVQr8/aodVEp4HSqJVRH+KgVU
SqiPKZxUSqiVULfaof9Df3VOD6ym/flMpv3bjfN83zf3bt+Uym/flMpv3bjfN83zf3bt+Uym/flM
pv3bjfN83VABu3b8plN+/KZT43zKABQAKABQAZXJ7cplJvjKZSmX3qABQAKAAzt3zzlPoJkBCavI
Wta3nk1QhNU1QhNXnlrWt55NUITVNUITV55a1reeTVCE1TVCE1eeWta3nk1QhNU1QhNXnlrWt55N
UITVNUITV55a1reeTVCE1TVCE1eeWta3nk1QhNU1QhNXnlrWt55NUITVNUITV55a1reeTVCE1TVC
E1eeWty5vKgg89oDg/vnOcblRoqB1DBg/n5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5UaK
jT5+fn5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5UaKjT5+
fn5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5UaKjT5+fn5V
Gio03ccbt3HG5UaKjQy1BIoJlCkqNFRpu443buONyo0VGigEMZQAKAZUaKjTdxxu3ccblRoqNFBS
oGFBEoB1RoqNN3HG7dxxuVGio0UCRoKBA0FRoqNN3HG7dxxuVGio0UEChONb5VGio03ccbt3HG5U
aKjT5+fn5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5UaKjT5+fn5VGio0+uOM/kuOMmqNFR
p8/Pz8qjRUaZbAcf+RwmJzSo0VGnz8/PyqNFRplcJxkcgYuk4FRoqNPn5+flUaKjTJccZvK8cf6o
0VGnz8/PyqNFRpl+OM1u443KjRUafPz8/Ko0VGm7jjdu443KiJUafOQzOZVCCoQ3ccbt3HG5UIKh
bL4v5zCoPVC27jjdu443Kh9UIYbKZXk1927jjdu443Gua/PPPJrmvu443buONxrmvzzzya5r7uON
27jjca5r8888mua+7jjdu443Gua/PPPJrmvu443buONxrmvzzzya5r7uON27jjca5r8888mua+7j
jdu443Gua/PPPJrmvu443buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu
443buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu4k3mua/PPPJtGzSTif4k15U2TY5555Nk2
N/Hj9f/mDabRs887fyje/MHPWmONJ3cGZ3QTiRbhMA9P2teg8VCrOufms5mYp6134q1SqVSqVSqV
SqVTqVSqVSqVSqVSqVSqVSqVS81KJUVslZL53Uek++rj2XvkOnBWpvhRmeHr8fdHyVUP/000HzoF
MrP14UWrVqgbqLfZv+fjfv3/Hx9b8KyWiUTiChQoVIoUKQRaLRaLxgUKFCvek0ekCu6fkArosUKR
eMChQoV5Vb59RW3lw+XDIMUi0Wi8YFChQoUKFCuEly1jLdm14pFotF4wKFChQoUKFdXnFfhREHg6
RaLRYrGBQoUKFChQp84H3RaLRKLSxQoUKuKCj2A4AHnnnjjgHPPN2gABgAAAxjIFChQoUKCKZgPB
bIPpz8/KwtTxNb5+b03yIVcUKFCmI/gUKUU44UUU45W3CqpmTLOQkwITAhOAU4BTgFOAUwITAhMC
EwITgFOAU4BTgFMCEwITAhMCE4BTgFOAU4BTAhMCEwITAhOAU4BTgFOAUwITAhMCMlZnTgHN+Z6Z
lLJGSsyZpzLmnKWUMpZFzFmhOAc6ZbTAhMCEwITgFOAU4BTgFMCEwITAhMCE4BTgFOAU4BTAhMCE
wITAhOAU4BTgFOAUwITAhMCEwITgFOAU4DTgFMCEwJTAfL2fs+Z7TgJMBMt0n7R+n2rFQM3Ez02A
ruI76cOXEz30hSyna7VfaP7ny9nIPPIGT+Wta3n6oeim0ikUikUikUikUikUikUikUikUikUikUi
kUj2Vo3vSsm5RpVFplMoPgpQaPTck5EpNGp3jTFPP2oPvRsneXl6eFE9qHkFlB8KTotQ99IbsoVD
oVBoFBoVDolA8MKE9vh+LipIoUKFCuhQp8o8Uj8YFChQqgUulUoUKyDkQUjxQrGBQoUK86z9ewrd
ygjxQoVjAoUKFChQoU/ohQoUKxgUKFChQoUKQFChSPxgUKFChQoUKFCiFPxUBQoUKgUd2taxjGBa
FrGMhrWtaFrWtacIChQoUKFCpIUdY369fAsO7sGvXVNpiiFChQporkUKW55555WWADQKpmT04Hvf
M6cOpw6mCSYJJgkmCScOpw6nDqcOpgkmCSYJJgknDqcOpw6nDqYJJgkmCSYJJw6nDqcOpw6mCSYJ
JgkmCScOpw6nDueMpJgllzKeZ04CztnjJ+VcoZVTgJOAU4Dzlk3KqYJJgGnBqcOpw6nDqYJJgkmC
SYJJw6nDqcOpw6mCSYJJgkmCScOpw6nDqcOpgkmCSYJJgknDqcOpw6nDqYJJgkmCqYJJw6nD6cPJ
wmmCCYHJgYmCqcNpwdmL3n0OtUN6P3WZpgfm2bWqJlBdlv7mMv5ecuHzhmdH9ozGPx9clj8fz6fG
Bx+Px+tUMYXK6zC2c4/k1czj8efAcfj9hr/Bgh/sfjzA8cf7bvHHnQqHzkPQ5PTKqgw5cfjzsOeq
hezIMfj1AEa2Fwnu6hexWdzuPx+Px+Px+Px/llVRhlcfj8fj8fj8fivbT94bH4/H4/H4/H6zC2c4
/0x+Px+Px5ha/b+wOPx+Px+Px+PwGGOPJ4/H4/H4/H4/H+WVVGGVx+Px+Px+Px+Fwn7kcf64/H0x
+Px+FNDwUFqgzMno0iYWPx/Rj9EmC5yGGIcUPRj9P6oLcMY+L/TKyJwGHjTHMcx1AcoEcznzHMc+
jHwKoEr4Ynz82noYph/2YPA7FQPtMMw1QOfRhmHlzk+/n/Ok5TDMPJKgIwzDOdUDZMyTAPrBGFn8
0Yuv4odqgMxWZVAx0Zr2CHTiegPRHAf8wccdB4bv47ehgY8FAEcmBOg2jaOg6Dag6DlVAZseWB0x
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
4/H4/H4/H4/H4/H4/AmkWP9jUx+PNQ1Mefx/ZjHmoamPx5qGpj8eahqY/HmoamPx5qGpj8eab4+5
UtwohFSRckIuS1MiL1Tg2s4cCgDUAZwHAoA1AGcBwKAOxaoAzgOCS9qQOA4PwUXJ0Gr4ok/DgOC9
qQvakDgOC9qQNXDaf7PfSgbN69qQOA4L2pC9qQOA4L2pBDDxuRuHYC9qQOA4M7e1IHAcF7UgjUZN
yZowumDgODKZQ4DgymNNRhx7j1Zj8ocBwZTKHAcGU5OUTs+eERlDgODKZQ4DgyiXjgGRyfTlzgOD
KZI4DglWCCFBbh7LEESUlBYoLXQoLlBcSUiSkoLVBdciFBaoLiSkSUlBaoLUqgsUFxJSJKSgtUFp
KC1QWklIkpKC1QWMxeHx5ItLpiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5
Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkMRYdJuG4qKP03Dc7e03Dc7e03Dc7e03Dc7e03Dc7
e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03Dc7e03D
c3Zw3DcPIwzcNz9whuG5mvI3DcZ0G4bn9wbhufOVNw3DSNc3DczRG4bn/2m4bnb2m4bnb2m4bnb2
m4bnb2m4bnb2m4bnb2m4bnb2m4bnb2m4bnb2m4bnb2m4bnb2m4bnb2m4bnb2m4bnb2m4bnb2m4bn
b2m4bnaKgCUA/3uUA6gGBhlAOoBtfCgIUA+MYoA+inb0YQP/Ef//Hb20pSnb2x//8R//8dvbSlKd
vbH//xH//x29tKUHnpj//+3t///pvjICIi8D//9L+//+TZfwiNOmaP/a/l29vlEREREeXb2+Xl29
vlEREREeXb2+Xl29vlEREREeXb2+Xl29vlEREREeXb2+Xl29vlEREREeXb2+Xl29vlEREREeXb2+
Xl29vlEREREeXb2+Xl29vlEREREeXb2+Xl29vlEREREeXb2+Xl29vlERGvFfuYWfX0T/X525fMmz
59vbl8v2/n529v5+duXy/b29vbl8v2/n529v5+duXy/b29vbl8v2/n529v5+duXy/b29vbl8v2/n
529v5+duXy/b29vbl8v2/n529v5+duXy/b29vbl8v2/n529v5+duXy/b29vbl8v2/n529v5+duXy
/b29vbl8v2/n529v5+duXy/b29vbl8v2/n529v5+duXy5xHNm85l8v2/n529v5+duXy+aaemrL5f
t/Pzt7fz87cvlzZIxvbL5ft/Pzt7fz87cvl8Jmc4ZmXy/b+fnb2/n525fL7zV29uXy/b+fnb2/n5
25fL9vb29uXy/b+fnb2/n525fL9vb29uXy/b+fnb2/n525fL9vb29uXy7fz82/X5+fOXy/b29vbl
8uzn8/trZ92Xy/b29vbl8vl9n5N9S/Icvl+3t7e3L5ff+fmV/vz8yuXy/b29vbl8v8/n5x2/n525
fL9vb29uXy/b+fnb2/n52/WX7Y7e0i7fz87e38/O0plnnq3lN2/n529v5+dvyWV6PCMR89v5+dvb
+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb
2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n5
29v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5
+dvb+fsYfERERiMRN+fj2fvxtxGHiIjEYiPz4DNu+V2IxERuW0+WsGMFjVsYW5ApjM46Tx1FjrLH
SzHZOOg8d2dGspQH8v+uVLToeDVQ86iJmZ520TRjgCSqxjGMYxjGMYxjGMYxjGMpkKO/Ki+mvhWj
UnIlGPR6+3jqV15F0+Xl4G2gRsXB55HyLRNP5cvT5/hG6j3DI2ZS5mZOWY6xMmhOM+2jzo9O932e
UpewQFbZzjMvh89YMZSpYpu8BzjonpA+ny+Zk8YnGotAGcccMAB4OOOOAAB3YHAAJYOAAQAABIQh
eOsYl53Lz8mf39tUxtUtn9/F6P8SQalmFBoQhlrWhWW3Vz9zQgnAOa81/Pz8/Oa815rzX8/Pz85r
zXmvNfz8/PzmvNea81/Pz8/Oa815rz3WfmrVtOA88Z6z/XqzXK1n3POek4Dr1d+ajnHNea81/Pz8
/Oa815rzX8/Pz85rzXmvNfz8/PzmvNea81/Pz+fOa805kzVWa1WatmXNSzzxxfwBu+tpoMQZp4Cu
/CZwb7oMQ4fhQu/xdzOB4h/hEcc3EcoRERy/6raYBCIIoAp/r44AobAhCEIQhCEIQhCEIQhCEJFk
CFb+tH9vEGmk0siIsk0mdXv7+fro8sk6yIi8fPxkNAEL7We+TCIiyXR9P+0vf7/xG+kkRE1Y7mZE
RPO9zIiJ5m8JERIERFjJERYx2RERERPiHzGMzKCO99HpScg0GZgoS9ojlfbyhhxjqHxjri4X9Xa1
qAQhCg1rWoBCF7UGta3GWta1AzlBrWyhMvgSgT5+ENx+noqF/Knp6fG07WYBgAAAwDyAREAiKNGN
Q/IdCymUJghllDLPr6+vrllDLOWUMs+vr6+uWUMs5ZQyz6+vr65ZQyzllDLPr6+vrllDLOWUEwMy
B603IaYLIJgQmBaCYJZGyBkTIKYHoJgUmBSCYLZHyL60ZMAUMs5ZQyz6+vr65ZQyzlmIyz6+vr65
ZIss5ZIss+vr6+uWYLLOWYfln19aB65ZQyvlBDLGQchZBpuUkMs6UCeUmZoEgRIEgZndAkCJAr3I
3kgRIEZkREZkgRIEZkREZkgRIEZkREZkgRIEZkREZkREZkWc6JvP96MqoHvGqog/BVKqgo2fh0mD
4/r+OHHbsOCbs7Gf/Z2eOGOEwuzs7M945n98+PvB9nOTNPs7DSm7OwxfbJ50z8l2diTgPLJfGK7D
p6BqZmDl6Do7OzSYh0fGDMrs7PLyzWGVA1AqAn78+zs7Ozs7Ozs6FQj2KBLs7Ozs7OzsyuGyK7w7
Ozs7Ozs7M9x94Psb2dnZ2dgcf+2YPs7Ozs7OzsyuBriuzs7Ozs7Ozs6FQj2KBLs7Ozs7OzszWGm4
7Pzs7Pfjs7MN++ZLvKTp439nZN2HDnc9hcoZzcyccS7uyTBefYeygAwvEp4P2dnZ6b8QPZ2GxXKn
Ycn77V7ODwMjswp4HweHn49nZtPj+7DBw+E/Q/mvs3ZunZ2Z0jMx+dNMxTiyhyuoBcFjf/SoCPMy
jv7PvAmf2dCoK+nZ0aS9M77dm9hwy/6x49gf3x2ZT57Oz519hz5POYuVnZ2bMoPZ2HCz809m5uYw
ejy4q3s7P7JdigE247MHq9TJ7DlUAXZ2dnDcn0BD2dnZ2PqrVHQfE3j2dnZ2eWVZ4HGYHjkOzs7O
zHnWYBuG2Hs++zs+/Nj1GSSL+7Ozs7M72IOnSaRm+HZ2dnZ2TKAfZ8I7Ozs6OxQHv/nDqVDfh2dn
Z2SmScv5+8fuF7Ozs7DoAqGTHo/PZ2b/XsYVDNOr+rP2dnZ2cf2Dw+dAdP92dnZ2dmg56bG6ezs/
OOzR5ZjB47MKATb2dnZ2YoytphYpQH4XL9nZ2dnZ2amoZt+OfTs7AgwR3j7fE/Z2dnZk/4Gck9ew
5+zs7Ozs7NyK9GKj919nZ/aRlacGS09nZ2dmFl/P0z9XYefZ2dnZ2Jf9QHv0dnZ2KhvwOHUcv5KZ
PZ2dnZ+4X94VDJjnQDs7Oz7fspUWbmefZ2dnZLVAnnnPjs7OzsyxhHAcfns7Ozs7OzdL2fCR2GeP
Z2dmIP3wzioHm/Dh7Ozs7C9PLo8mdnZ2dk+A8dnudfJidnZ2dnZs+uzs7Ozs7Ozsk0//YULciTZP
AxvXJdnZ2YY9uzs7Ozs7OzsxOAxp0Yvy7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozsze/O5TDi3s7O
zsw303H4TI+Tezs7OzVn6ZrNGFryHZ2dnYDJc1fHdEnZ2dnZzrblR5MPO9nZ2dlc7/Akmz3Z2dnZ
gejdIEOKznZ2dnZ//+vYz57Ozs7MH2dnZ2XSR2dnZ2daQsu7bV3Z2dnYnse+bz2dnZ2XVl2/Z2dn
ZZcibt7Ozs7Ou+E132dnZ2W9vZ2dnZb2dnZ2WF2R2dnZ2DfizuT9nZ2dnZ23m8v2dnZ2JHZ2dnZf
F5vZHZ2dnY9t5Lw2dnZ2fXhn+zs7Ozs7Ozs7Ozs7Ozs7O09nZ1MAAf//////////9CoAJWMBAAAJ
YUcpEf//////////////////////Ozw2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnnly/FB
97YnCTYjj6948Mf5Xxk/S3AZOuJ076fjK9eHxdnp4XjnR9Fxgt7s+fzY+/3LD4KPc5/LJevZD17L
dExpUzvHG7frez2t7MzUcfIRz5bs7Jtb9lvZ0fN+ZPJmHtw1tmF32dmQyuN5MrBx2diT2dl5tvFy
JN47OyvY8XV4K5Ozs7ISLrs7OzsQudZezuzs7Ox7zpvKT1prwkos7Itv1NcyF3Z3366dJvFyIuax
Iviy8pEQ9pQ6RcllkISLuL2o9ck3JcK572YiO2El11wL72UnLrssco/KsDddHQk9d5vYt4uYbx2O
m7LxY95uRdd3sV7LSSbgSSFb1prELrzd2Pc/bEXl1iQucSKISBtvA2wuLs6OjZgOi8Wpbrru72Yg
UjsSbgtQUXI9yIuS172Rezbu6cu29mXi28URciT2BK9m3siOztWJ3SE97O63hcTxcaxcnun6EOiI
WJ00PZbeeypOsR2Xn1zaS9xpV17GuFMSI67q4LgSLbUCuuncrp4KFtgtK7K1M8DbRGE6Oj0wLNA5
P4+8lmM/8ZzMVKv0DFYOy5L2chMixZaixNeI7PbT1hG9qTT3mxDp7qy9jPcHZbCR12Wu6Q/cnaL0
u7RGcb2Wh7EJEB6P/47LRwvYuvKLxeYRbZew0XNciWxaQiuHr7b9js7LU8JHZeKPa65Y4K22Xfd1
0IRelXIUz9vIj2I6MGYO1UCaOy4vpCdLdovCSjsT9qXsvcTIuBF5uDsstvYFl3ftlyRYne4Ohrp3
vZRXm5HSCuKy5CTdBdFlwC6eF5WovN7MvZsW3BeIvaiHSL2pO82XcXIsSHTX5ZewLxd35zbVJkDF
3Yi5O1Yi1+it1bYN4vD9l7UTeU95T3m8otvCUkhJogYdNezLuCTukXJ2XhPexbktcUX7FQ1qJLxo
N4WRewOtAprgrRdF7GvI2PRtK3B223T3i8WLI7LzBPcyRbC9F8lciQk3Q1pYVLCu5+guh+igRmda
N7GJxq3ocWLoS3s6KVWjYVg9F4uRF1cl4uG3sWWdd5vYCCdKncrtIo4kyxIdaL2FD2FaBrkNyXAQ
K2rHZ0JRbdCixJh0t4sTJkXi8JrkdIsvCy1JSHvI3sy8odJvlJsuJxsSxebBKoAV7LLLaXdt+1qw
XFpXroXXIsS0uC+EXtSSLiiI6FpRchDRyr12oex1yQt4A2tLkZELnKxCfrga0uddeBuLtu7Ojor+
dA+HRkzjExMUoD8t8xjeH539nZmBzJl7qnudZzYzTT38jqwCgB7EN6Gcpezs7OxL2dnZ2Jezs7Ox
L2dnZ2Jezs7OxL2dnZ2JY7OzsS9nZ2diXs7OzsS9nZ2diUo7OxL2dnZ2JX7C7EvZ2dliXs7OzsSs
bbRKXZbRL2L+x0uVHZp0/XQOJ3IM4O3CeYPvV0ZvHS89h/LmFC7p09nZ11vjs7OzseEdnZ2dl67O
weyfjo7F2+U0fDMH8d/rL9/KoWyBymvp6PnKZo4D8m4MQ6jAyP72KAKtF/ZTsW6MOeGs49uS5Ov7
HG4E8lRybRnFkDJkxpxZ016GwfvpgD2N7FqkH7UAHOSP7FKhg0amFgOg7uTf+lQQa1Ti7GmL2exk
DSCrVNUrLyi8oDeLmckxD+gOfs7Lz2LbzeRvPZ2ZjxD0ZHoebCdnZeezHXm83ns7McEwcTnjhHo5
PLIqAybdnf/3y57uZOLA3+yeNMLLHF0e/4RkHHi82oAPPIHqBUC4s4ejo9RwZhGIZZlGLgsydxrZ
44jmOXbkegwzSwCgLNw1cMDoOXkKo0zRx//ub3sqHseY2C14VUKUPo6Di//b4UA1aG1gN3RhTQ8j
POs8sn0bTC/PcwsF0GudaofPiSvO7xO6fHZDG4v3Ns48XCW29Xi291rezsNT5Z2dnZ2dnZ2dmSvD
ex9HZ2dnZ2dnZ2dnZ2dnZ2dnz2e3Zx2dnZ2dnZeLwdfZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dj+nZe2
bmvcyGtvPZ2dnZ2dnZ2dnZ2dnZ+dnZgN28wvrXkOzs7OzM/ec9+gw+ibs7Ozs//jLy4Xw7Oz67Oz
4nb++2U7Ozs7Ozs7Mr7ZMwzV98oe3Z2dnZ2dnZ2GKbfJ1mgg+uzs7Ozs7OzsS9BwGnq7Ozst7Oza
e94jsUCN5vN57OxP2dl5vN5vPZ2I7Oy83m83ns7Lz2dl5vN5vPZ2D2dl5vN5vPZ2H9h8P+3kovaw
JTAUAnZ2QcvZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dmOxXZ2GaZHZ2GBt7Oz
CKAbs7NWvs7Jffs7D3OPs7Dgw/Z2ALs7Mj2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d
nZ2DJ2YTK9kDhuwt3r2dk9ech2Mzo9lyXJ2dlydnZ2dlydnZclydnZcnZ2dnZcnZ2XJcnZ2XJ2dg
9hdHZ2dnZHYm7OzZqr2dnHZ2N0ruzswdZOzY397LkjovVyXJ2dnZ2XJcl7lyXJ2dnZ2XJcl7lyXJ
2dnZ2XJcl7lyXJ2dnZ2XJcl7lyXJ2dnZ2XJcl7lyXJ2dnZ2XJcl7lyXJ2dnZ2XJcl7lyXJ2dnZ2X
Jcl7lyXJ2dnZ2XJciXIKgzwN5/vRz0dnZwRm9nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2
dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2T5jbkezs7Ozs7Ozs2ynC
e/Z2dnZ2dnZ2UZ5mN2dnZ2dnZ2dhtmOZGZ7Ozs7Ozs7OzWPR2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ
2dnZ2djOzsn6Ozsr2dnZ2fnh2M1f8s3Z2dnZT07No/APDs7Ozsp2dg6ezsp2dnZ2B7Oz77Ozs7Oz
s7Ozs7Pvsk7Ozs7Ozs7Jv3z6OzR2dnZ2enZgudV57FQD2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ
2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZ
ebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2d
nZ2dnZ2Xm83m89nZ2dnYuXF2Xm83m8ruxvZ0M6I6OwrzebzeexZ0dEzNoxfHZebzo81Kpqjo++/w
lRHUseiejdmz+VXoGt/8y8W1fwhX9vyDGF9X35hGDBgwYMGDBgwYMGDBgwYMGDBgwYR7BAiwgRoq
C8B3EjDBBGIEGAQMJW/Wj9LwEECx+RXu3x+A7hgwYMGDBjxgxfHEPmoqWEPsqliHOM7PD7oPFsZd
JOI4Qs4hJMsZ6hDvvGCMYYwYMGIDBjxgwYMGDBgwYMGDBgwYMGIDBgwkErdLs9rpAnjBgzlR/0XA
wYagyzbvGPGIDBiAxLGIDBiCUfwspSV/aqDBgwYMGDBgwYMGDBgwYMGDBgwYMGDBgwYMGDBgzQuM
45U5O034s3naYwAzXvGDBgwYMGDBgwYMGDBgwYMGDBgwYMGDBgwYQwYLSugIhiInbS/7Z9L0M746
ZPGO3SGmORCCSglEJeXT0ogSX0hJ4xGOkukpOMwUiNEoQINbxxqN1CYrzjCmzX8cDBgwYMGDBgwY
MGDBgwYMGDBgwYMQK+4oEWECNFT2YxAdxQfFiORGMNAIGFob1p/7emMCCBY/S17h8vrGOfgYMGDM
YGDBgzGxgzwxx6RGOv5qajLKunWM7vH9ofFsYnGexAwhgwYMGDBgwYMGDBgwYMGDBiWMGDBmMDBg
w0u9ujSgwYAOoQEYMgKAw0LJdkqlUqlUqlUqlUq/nGOMY5fXtNYiaeMGDBgwYMGDBgwYMGDBgwYM
GDBgwYMGDBgwYMGDN+kYuqurZpWXbwprsMWGfXiMGDBgwYMGDBiAwYMGDBiAwYgMGDBgwYgMGPGD
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
A5riCAf4eltDVGzNvXdcDhQt6gH2ggHGHUqoRxrAelrWdb1dpaLGgB2Bo2NeDqIh16+2ByXyHWhX
ct3tVU9nZ1MAAf//////////9CoAJWYBAABxwZAuEf//////////////////////VQKHsHWHIHcm
HOHPc0fQQ4tIDrD+DvDrDrDvD8DrDjD/0rQw7tBiA8g8WwOsOsP8O/ViMae2tWsmDn11VAOHWHWH
wHaHWy61qDJpgZIfAcYderNQdYdYfYdYcCqgkMsNQMIMKIDrDrDr1PHLUNYDl1AOsOsOsOvShn0E
N0NMPoPsOsOsOsOvW1VAoZaqA3RwwovB1h16/r3jV1YDrDrDrDrQgMdVAIGmHcqoGDrDrDrDrgOL
RwwmSA6w69SDrfrE4nRQ6w6w6w6w+Q4tCDUDTDWDyDuDrDrDrDrZA1g7NLDC9AdYcetB1667cHA+
NaDrDrDrDr11iDS0nXtcD8DrDrDrDrgO5nDCZyMB16sHOHXrJm1q1BkZdaDrDrDrDrD3DkDZ0rRg
3lVAGqB1h1h1h1xAYTORMHRqwdYdYc+r6trnWj6RZDrDrDrDrD/Di0HSrxoDjDrDrDrDriNPQ9rQ
cYdYdeOnfwYtwOsOsOsOsO4PkNQNMNcMKA4Q6w6w6w64w/WpB1h1h1zos40INQPkOIOsOsOsOsPI
O4NMNYOzS2QNYOsOsOvX4DCag9Pa8HWHWHXAe17Tg0w7g+Q6w6w6w624PYNxpaQwogOsOsOvU3hk
YgxWYPIPQPQPRPR/MDLqEXA9A9A9A9GvVugwHMggHoHoHfrjbZYQz2MO8PUPAPAPAPBVQBcDwDwD
wDwDwDwDwDwfWg4b93yQc4dI+lVAiqjHWQ7dd13XQ7lVCWu67ruu67ruu66HsqoUDsD8VUMKqJdd
13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd1
3Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13
Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd11q
vKWq6YheZGpqampiT0pit6C36w1NTU1aMm7Jo5Bh0hqampq0FqxjSbzRorU1NTVp7HowJDSGpqam
qx2w6MbJBqampqNSeLNxNFqampqTv6YQF2Gm1NTU1MlBJqampqA3ENTU1NVVDU1NTU7U1NTViGpq
amrbRampqaltTU1NVNTU1NTU1NTV7jDU1NTU8Q1NTU1RH2pqamrZampqaqpqampqqtYDqampqact
hznOc5znOc5znOf+TnOc5znOc5znOc5znOc5znOdo1UhaZtA0FjYOTIiHBr2p6+GQGGwWdL0wTGz
3r/G9pfn0LQp3jhg6Lr+pamHXoIYJDqYYNGDA0S8khfYdCgMcMYMYMY7L9uDj1XUdIY7YYwY1gMY
MXTNRq7rYcxBAMEMcMYMewGOGK7ph2B3Xf6OGMGLpgagY4Y2jaJDSqoEbwxgxlhjBjl4kMYMVwxw
x9rtaDGDGDGDH20BuGMGMGOGOFwxgxwxgx40AJVtoCfbQd/OElxO2iAt9tEW2xMDC/Ktkb1W2i5T
Imi5H/9pg714cbzIxPun4L20dooCSxbEjjYmhioAdKZkfB9R/IlIvj22eTid4HL0+2w8Cj1VGyCs
FTXIVL5cHUKQNqN1+1ZXtobakyOoeanhuahbC7BbarsN2o6bkOtiMiysLCxsuuohgawtxQphp7kW
2gt4fIwJjlG2hQqcBxefBcCXoUVDCzROiv6H572twqyNgfo8EsG5dwQxEJPCiFxWSm2i/pgJNGLB
Rrp8r4Opeo5PtozXhLgRdew+122JKbbriWL43pVlDlaiMzP4fI5d908FFieneH3FV8J7Xae3itxO
Kn2Pg/4/HW8hYMD4P71BJUl52sbbKxcnW/IJRw/W2xAh1Rx8CQPNRkA+5kEcuMcyBHKoh+C1H49l
5rcejeDjkLYA/U7v/+SkATzIlY+UidYliiRKBVmBKaqOUOPaU6rIgShTMcI2o11l1M8IXnlDz5fI
DcKQHrcUFXjcafZ17ULWGTW9U9daEmrXQ2tLZQ3g3tEKBoEGvXtV0vVm9vjX7DJr7UHsbpiQD1D1
D1D10PQ9D0MPYPYPUPbQ9D0PQw9Q9g9g9dD0PQ9DDzD2D2Dz0PQ9D0MPYPYPUPXQ9D0PQw9A9g9w
9tD0PQ9DD2D2D0D20PQ9D0IPYPYPYPbQGTQ9BD2D1D1D10LQ9B0MPDTmNizcKdNmpN4dgcgcGqau
jqOgKqHVVBPRg0WEXKg0QzmO0GgGfOyGiGiGgGgGgGiGgGiGiGgGcGgKuEhmBltF5hDC1r2oXdR1
X2UdYbbn2W0H7qOseN7UfMocOuarnOua5rmt0SvNrDpzOHQxsl1h0W8HSHSy3mvW9RRD583XrmjB
5aKHh21tLXquA5GC406y3dy3aiHA1sNgO241hzN2t3Q8GzWWuvu8HjlLnhIdz6CqAdVAPr+rdKoB
1UA4bkRrcAQGmqgHVQD6/KqAdVAOx3r2t51vW27UW3W72oXtZ1m23Wm5r15uDj1nwczW3XtZutt6
dTT/rLZAfAcjXe1sOJVQMHM1t2rNIcmQ4A4Gtrua2HVrejaN33qOotgemrxr2tkAxVVAaqgzRu9Z
1lp1FVQYqoCD0ua8HaHfOo6i3azrLXF27eadZ1vX2zRAwGnXmu9d6u6y3a9e1G+3Neo623BxhzS2
tes3tT1NulF7DY32elVAqqhay3t9my3t9m3fstprNmzZs2bNmzZs2bNmzrqqhfULN5os2Whos37L
Q0WbLQ0WbLQ0WbLQ0WbLQ0WbLSey8d6xo2la5rmlaVrmuaVpWua1pWlPpWlNTcbRGFtatK0rStK1
4ODXg9dY1fWA59K0rStK1W4diDmNpWla1pWlH0opqTFf0rSk09K0pNVAOGuHyc6cJp6VpSaelaUm
GPAeSTsielaUmnpWlJ6JhLStKTu6VpXei6J1oehjXomh6Homh6Hoeh6Homh6HoeiaHobTq2sh0ah
3rmuXc65rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5E
a5rkRrmuRGua4GHomua4qgGNrmuBtn1zXNKZdc1zTQz9c1wNrSNc1wMwNLXNcnXdc1xVAKGVrmuM
8a5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkRrmuRGua5Ea5rkR
rmuRWvBwBhaUHBr+Q4Nf7QDhDgRU68lq0NHbc3N0Rq2ratq0Q3Nzc3RGratq2rRDc3NzdEatq2q6
t23N0Q3NzRq2ratq0Q3N0Nzd99W1bVtQ/luvctUiNZ1mI1nWYjWdZiNZ1mI1nWYjWdZiNZ1mI1nW
YjWdZiNZ1mI1nWYjWdZiNZ1mI1nWYjWdZiNZ1mI1nWYjWdZiNZTbrrSwh9hyalrzHGmoaw0f/pum
wxscQxscabpv///pumwxscQxscabpv///pumwxscQxscabpv///pumwxscQxscabpv///pumwxsc
Qxscabpv///pumwxscQxscabpv///pumwxscQxscabpv///pumwxscQxscabpv///pumwxscQxsc
abprZq+l6zpumwxscQxscabprTc9jTdNhjY4hjY403TYsauHRpumwxscQxscabprZ/VtG03TYY2O
IY2ONN01pDiYf6bpsMbHEMbHGm6b///6bpsMbHEMbHGm6b///6bpsMbHEMbHGm6b///6bpvbGx3W
1jY9Q03Tf///TdN1LQGNj70Gz7TdN///9N02+wMZC9ozK3abpv///pum6gxsaV5jY9Q03Tf///Td
NSY2O7DGxxpum///+m6bDGxxDGxwGHpv//DKDKhjY4hjY4DKDHIYyGUGPDGxxDGxwGIGU1J3tUhj
Y4hjY4vXr16GNjiGNji9evXoY2OIY2OL169ehjY4hjY4vXr16GNjiGNji9evXoY2OIY2OL169ehj
Y4hjY4vXr16GNjiGNji9evXoY2OIY2OL169ehjY4hjY4vXr16GNjiGNji9evXoY2OIY2OL169ehj
Y4hjY7t69ebWJi75MbL1eu3rzEyJdsrBevRWNR3N86X+c7rfO7VlzgUZSfRkztS6ZJUXEEEEEEEE
EEEEEEEEEEEEEEEX+hwnLpe6+wsWz8v9cg8qVBFxw6UrfUo8uCN9Li+88aQQQQQQSSSRnWI4f3ny
hJumK/aqIn3vR///e97/47Hven3vemZxu8bXQWXX3RZ8suLs3JmZmZnMmZvP/9KUp///0pSn///S
lKf//9KUp///3UIJPWCkBBJJZ7yyUVDf//9KUp///0pSn///SlKf//9KUp//7jXGiPt5pOF/ZZ6b
B+63xlmdX1oKi0PE93/rkV+3SUkSJEiRIkSJEiRIkSJEiRIkSJEiQqn+XzeSl5icp1XVbyrIJP2Q
5UHlWVSJrw0/IPfUs+cxLvuXzSijxqRIkLSJEiRIk14Jpw/1Km6YP+fRERMzP4/EzMxERH4iIjW3
a3XegT113a9x5u7H7tn3jnOf3veOc5/e945zn973jnOf3veLOkSmpKBMkSpUBrkCbknK973jnOf3
veOc5/e945zn973jnOf3poVeXfM0bEFUIenevVQa14MC6YMUMMgwhk6bqGjaSGGyMGlhnsOjaKyM
kSyMgZ+hsWhMjIyaQHdqGiMbDLAyEA4g/WRkDpyyMiOl6IQYGlkZGPRg0sMthkDOVQHh5SGW+sqo
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
hg6vq/mVWqoCbdtDbQ20FVASqgNVQEqoC20NtDbQ20FVASqgJaqgJVQFtobaG2htoKqAlVAS1VAK
qgLbQ20NtDbQVUBKqAlVASqgLbQ20NtDbQVUBKqAqIXGjbQKE1WSqyVWSqyVWSqyVWSqyVWSqyVW
SqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWS+5ZXcMzp3V
u6t3Vu6t3Vu6t3Vu6t3Vu6t3Vu6t3Vu6t3Vu6t3Vu6bu7D53aO3dkQd2W87p3XfQbDvd0Z3ySd2J
burd1burd1burd1burd1burd1burd1burd1burd1buscqslpvKskVlVk8uu1WSqyWnkQVZMzlqam
qZVZKrJVZKrJmWpqamqZVZKrJVZKrJmWpqamqZVZKrJUS8tTUramomT6mZn/9w1NUE2pq/4nMyQl
4ak7yrJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN
++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN8gmqgDrc3l
VCOtNgfF9YY4bbZlWGOGOu/fV376wxwx9uBjhjrv31d++sMcMfbgY4Y6799XfvrDHDH24GOGOu/f
V376wxwx9uBjhjrv31d++sMcMfbgY4Y6799XfvrDHDH24GOGOu/fV376wxwx9uBjhjrv31d++sMc
MfbgY4Y6799XfvrDHDH0nTFUBekBjhjrv31d++sMcMfRUch0Bjhjrv31d++sMcMfVG0OkPMMcMdd
++rv31hjhjtenMjIGOGOu/fV376wxwxw4Q/iCwxwx1376u/fWGOGPtwMcMdd++rv31hjhj7cDHDH
Xfvq799YY4Y+3Axwx8376bbfv6iGOGPtwMcMe9fvmvNGqagGOGPtwMcMdpbb7br7TdOGOGPtwMcM
fUL9+5qN++cMcMfbgY4Y+qX751376wxwx9uBjhjrv31d++sMcMde9VhjBjLv31d++sMYMZTiTBjB
jLv31d++sMcMa0TIbbGoNi799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr
1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahts
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
i+ikSlNFzFIdaplK6KoP0VQiUiUjovHRVFVIUuXUkqupN5SJSPbKRb+8aigKv0XFovEpGoyiykSk
anKRKS0XbuU1SpFIlIlIb8u2qoJFIlIlIlIlOfuUbVxSmi49FyFIlIlIlI6Ln0XU3FNt1JUpEpGq
Ko+josnRZRSJSJSJSOi7CiSkCkim9F1lIlIlIlIlJ1ZS6UiUjuUjosCVOpuFG6KgwKRKRKRKR0XE
UnMpIpKqylymykSkSkSkW8oWm30uFI1W2lIqXQoUqVRlIlIlIlIlIaLnKEquqeVfouQpEpEpEpEp
ulSmCkaVXFI1JLl8am/pSJSJSJSOi4dF4tTcUnVui59FxFIlIlIlI0ps0qupFIlI1Fs8UBVBRhTu
5SJSJSJSOi5ikykCkJIClCkSkSkSkaQ421WUiUjosLRaVysojReZSJSJSJSJTei4ikikqupFJlIl
IlIlI09FgS3KRKRKRKN0VBhU3JlJaLiKTKRKRKRKRKXKbKSqum3t5QpSJSJSNUUihdFmVQUiUiUj
osmpW8pIpvRcRSJSJSJSLdouEpXnKRSJSJSO99aapolKlLFLFLfy5lHaKgW0VAhosgpYpYpYpYoC
p9ijKjKL22KWKWKTbm9SrdFxlFtWi4ilClClClFSgClClClClClClClClNF4VVc5VJounRVGlV6L
pKIQNTU1eUo1NTU1NTU1NVIpvrcUxouFqampqampqampqampqampqampqampqampqampqampqamp
qampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqamp
qampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam2k2VLyqt2ltbW
1tad6v4ruUFosltbW1t242yaW3RcNRNra2tsm9uqHtXcbW1tbaFMpDDxtaW1tbW3anouCorbNFyN
ra2tsu09qFKlQbW1tbajp6KgLQUdFgtra2trRZtra2tptra2tttra2ttl7bW1tbfNtbW1txtbW1t
P21tbW2/9tbW1tB+2tra2rhtbW1tNtbW1tLBtbW1tbW1tbetra2ttamUo2tra209Fw6Lo0XRoujR
dGi6NF0aLo0XRoujRdGi6NF0aLo0XRoujRdGi6NFz6Lo0XRoujRdGi6NF0aLo0XRoujRdGi6NF0a
Lo0XRoujRdGi6NF0aLo0XRoujRdGi6NF0aLo0XRoujRdGi6FarxMoUxouGpNF/FOaKgD0W2UmUlV
RShQhRui5Cm/KUKYrNTTTbNyiWQpfRcpfRdmi6ShalKUqqqCmyhihdFz6LhbsKcKSKEKEp6Lp7So
ULqiqKpqiqChWuqylauqqp9Fk0Koqjc2+qCgqnbCkCmNyhaoqgoaVU1Q5vZTZTqs6kqiqCgNFgt9
UVPVs2zRZBQJ1RVFU1RVNUXVFUaFU1TVFUHVDf9UN5eqKpOqKoMH0AkA8MZ+aPs/s/0LJX6PLtCl
iWwPDs8/zweTmeT9ZGf5Ql/rZoeDFfyRhgt5pzLk5hfQGjKjomtozycF/+aMRmwoy0mnjS2tG1UV
UUB0pxrU2aWloaWkpTRbJRdX/5NNpWW0evdowcQWB9rZ+ZXtZcy6No5Uv2a+AGW9hLmK9c2C87mZ
hreCf+uZbMJ8w08KWbQKjB3+jr8y5Pmmvy5OWf3dZZHXr1mEcJ8y6cnwYPyKFby2H5rLwuvaMwY/
nnlaum0ZX/Q8/J8sw5YJ7wHaxIHPNNoAy355lUfLjz0iWEm9CQwm64v/JrmjBg0+h9aQr6ANYmx+
hXCrRoqgHRaPWqVWFFaLBKeqxsKQKPKP0XnotLRUAui9NF6aLB0XS7osXRVAOi+dFUF920WxosTR
UGWi5CmmrRY8tmnbRY+iyNFj6LHqOo6jqPRY+ix9FkaLIqOo6jqPRZGiyNFj6LHqOo6jqPRY2iyN
FkaLKqOo6jqPRZGiyNFj6LGqOo6jqPRYuiyNFkaLIqOo6jqPRZGiyNFkaLIqOo6jqPRZOiyNFkaL
IqJrqOotFkaLH0WPosao6jqOo9Fh6LBqdpa2mmUrUpQpRmixSidFh6LG3VbdFuaLP3V0XQ3FtFz6
Lnb23Rc+i6NF0aLo0XRouk/PRdGi6NF06LoPRdGi6NF1aLosx+i5tFytGiyEBShTOi4NFQF6LS0W
2Uqg7hS2i+tF86KooKe0XrouirClGvRYBQVQlJ3UNQ1FUX6W1UNmi4VSkaOioEiidFz6L5KPcuZR
7UUCUQU016Li0WIUfosuggu9FsNRQTUUHUjTouDRZZQRRtUVcUzosQohqKQbCh1WqodFiFAlIt7e
Ua1a3+Vww3WzpaNa96dMpMpjanTbkaOqG2nTKTbKdNUo+pqvpFAlA6LEKIk3UqpKPKNKNKCqihjU
0aLEqls0XEUE1aLEKPKNKRVolM1HtosIo1vqtVpaijygShaiKMatFiSKCKE6UTQamrRZZQJRZSFC
hotjRbBRBRDQUGUC0NBQN6L7yhQ0WwUaUaUFUlApCptFltDS0FMuFEaLEKNKNKZqulSKPKCKNKBq
hvqnRcxQTQ1FH0ilikSjdFiNBR7hS1UbFEFA6LEKGqQplUpko0o+o6jqApncpHRdOi8ClLqMoQpT
ReGi8ClClNF4aLwKU0WroqBzRUAxSmi7bKUKUKUKUKUKUKUKUKUKUKUKUKUKUKUa6kKPKUayiClC
lCiCiClNFQOaKgcqEpQogogpQpQogogpQpQogogpQpQogogpQpQogogpQpQogFKM3Sialqco0o2p
6nKNKNqepyjUZRdT1P3KnqdvKbVoblNN9T1PmVPU+FA1LKdUN2i0Shcqep8yp6nypm9QprRcKmVP
U5SOVPU+caqob6sqep9F36Lvqep9F36Lu0XxOqt6rKSatF31PU+i79F31PU+i7yltFUEq1V1v0Xf
U9T6Lv0XfU9T6LvqJu0XdU9T6Lv0XdU9TxsomgUSUQUSUSUSUSUQUSUSUQUSUQUSUThRJRJRJRO9
lC6LAzMzMzMzMzMzMzMzMzMzMzMzMxqqKpqm0WFtU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU
1TVNU1TVNU1TVNU1TVNU1TVMUjvU1TaL4qipqmKc5U1TNxTVTVNovYpipqm0XA31NU2i/tFz1NU1
QFL1NU2i6SnKmqadTVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TFAFB
7zKDKEqwoMoRVkKDKD4UHtUqnapqmqalqWpalqmqapqmpalqWpapqmqapqWpalqVeqapqmqbqWpa
lqWtVNUnVNUo8qWpalqHSOqaZQWYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuY
UKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYULJvKF40aLItQo5p5Uui485xpaWl
p5znGlpaWnnOcaWlpaec5xpaWlp5znGlpaWnnOcaWlpaec5xpaWlp5znGlpaWnnOcaWlpaectAUh
T5xpaWlp5ynlXlN840tLS085VZShSZS/ONLS0tPOU50mvnGlpaWnnCmdFwN3ONLS0tPOc40tLS08
5zjS0tLTznOY0tN9aWnvOc42UGmqp7IP5znKVFpKRqlqznOc60tM29paafOc4Uw0tL7S085zjS0t
LTxVVpaWlpVnTxErNpaWlpVRSpIGlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSp
UmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaW
pWkqrFpaa6NqaVVVVWloBdoo0lbj79YREzo9NIQhCEIQhCEIQhCEIQhCEInLuzGrZzMnHBMaA3KM
SfuITdQOCEIQhCEIRJmT16G6CN23PvDOc5znOc5znOc5zLuc5znOc5znOc5znOc5z3dnfX9b0sxV
lPLkk3UttttttttttttttttttttttttiAdTZORo3Utt2tNm2zs83s9PY3+bbbbbbbbbbGZPUCO5a
ruj34c7GMYxjGMYxjGMYxiAwjGMYxjGMYxjGMYxjGMbuOhffaiQVHU/ahqMoF9C+1OzaKtVKDKP0
WMULUO1RTKGqEoQoSChQhQlR1FUdRFCFCFCFB05VCUAUKUKUUUIUCUH0oQoSqPKEKEKEoNpQJRUy
hChChChGooAo4oQoT9FklJ0NygGvRaG5QhQm2FAKAoQoSWxQhQmzQUVLRYGiwChChChChChChChC
hChCjNFqFGFCFCFCFCFCFCFCFCFCVPosIoIoQoQoQoQoQoQoQoMoUoUoooQoAoQoQoQoQoQoUoQo
AowoYoQoQoQoQoQoQoQoQoTRYZRxQhQhQhQhQhQhQhQhQhRmi1CjChChChChChChT2dnUwAB////
///////0KgAlbQEAANxvJpsR//////////////////////8KEKEKE0WpotIoQoQoSgUIUJRmqUiU
ggeBQhQjhQhQe3q7bFLNObFFFCFAaLVKIKLKMKIqUppWiUSUWUWUW1NdRUiiyi6oKL0WJNp5Q0VA
NoqAZxv0WyUXMoDeqmnCiyi6rqgosotWmp1vpNhRZRe9VFFlFtlVFI7yqgocoukrossomHlIaLAo
oKqxBIopSj8EG8eFAtWTKB269VCBrxslhQpQeYUHUONlVaKoBpFKNpKpQJQWY1lB8dOrMQlK89vK
azKuqjEFWNErqyqaWNksxBlOraqq+ratJzM5GObFKN2ZmbTlUVWlIVTVOZmNxSWi7Cn22rTzMQIG
JibN5XmZnnRKQq5vqzMzDqqrKtpk5nM2/cpKCnMzMqlspVdV1X1U35mYgqkoKqatieILwpCO7Rdl
IZmZThtS0XsUzSqrMzDb9Fz1a2OnnPwpXmIWiSCrMzMqinSpt5SVVzzMwmrWz85mFJ1XRDXJBmZl
VNmaKoBKTq02zMzCasgxWgzJW3djQnmZjfVNXVcUtVp1TmZhO+38zMU4UlClV1UtmZmVU31dV5QV
UoKpzMQMR1agqtiQZmHVyBsq5vqnMzJ1cUoUq21aTmZxw6fNFx05znOdWudqChosGpZznOjRUa6N
RZk59Es6UkUorUHe96or3ve973qJqQKNNhpoVKClCnqVXVXVdV1cUvVdV1XVdV1XVdVlIFLVcUkU
wU3VdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV
1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1
XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1X
VdV01Y87bbS2p06dPZVsUtAgqynTp06ObqUGwpCjTp06dG6XFKba0U6dOn7Yq1I2yhTp06cqZSND
lOrqdOnT52lKVKntTp06c+IFD9LUFOnTpyJp06dM65NOnTpnXOnTp0zWOnTp04nTp06eh9OnTpk0
6dOnoynTp0yadOnTJjTp06dc6dOnTJp06dMmnTp09GU6dOmlpNtOnTnZRBRpRpRpRpRpRpRpRpRp
RpRpRpRpRpRpRpRpRZRhRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRt
qXypxsdUKNqtGipRm2ndE5CfbtxA2/tl7NnaO0mpupKUVToUK06VqXLPXoUDUoKtiuzRQ23q66Ck
6FCh26DT7QpQabUoVgbU1clQoUKFQUKCjQOUu0KCihKlA1FD+hQOgodChXNShoUFKFA3yVzXMaIl
q+h5raP86xJA1n8Sreg0bAgtD9GEVoiWrEsGjGWuTEulY6SDRixK+jF9EMdGL6C7KdYlcmudcmnS
hokXJrEQfA53mftt3jVOctpS7OirvQ0Kxsq/N9Hf5+D8gWE2f2XRorc81NEC6xraFnmhGzhXIqtC
swQYdCtCswHCty8OdImoNEsNGV9G1tEUdGPR0aNAaIq5Kx/oxGdbREto2uVdOJMIr+tDRkNGrmvo
gX0aQTKsXJXOvo8VzrmtoLEw0YzkwP4nXJgbLo1hrraCXZQo4ogcu6lKAqSoKNRlAlAVyhak5woK
RQJRxQ+iwdtiiyg9Fo1C0KFB200WkoMoMoMoNRRRQoMoMoMoNRRRQoMoMoMoNRRRQoIoMoMoRRRR
QoQoMoMoJRRRQoIoMoMoNRRRQoQoMoMoNRRTYoQoMoMoNShtsUGUGUGUFtttsUC1qS5v2qCm2/m2
wUCApupKhQWUCoUCUDtZQJQJQJQJQJQRlAlAlBFAmUCUEUEUC8WXZCgCgFd6JQdOjRayjqnKKudL
ejQqQo2oCgKi/JKUKgaqq2ZF6qqqqqqYN5KFA7NFEoeoSgijKu5VVXUqpqspNpq8pGrilFNkO5TN
KqKSu+7eUpVFX42t5SNV5S3bW/ek3FI1S3tbbV9KLNH9HQxn8pwpwpSrfKcKcKVq0pEpwpwpSZTh
Tm61XUaKlU1SUjVaCV7VdV9XtOZ9KmUjQnV+9IpGrqvb6pQN7b2q6vbaRQG9KrqpoFHb0ikd6obL
qCpaVIpSqeNCihTJTNV1WFP5TqmraqoWoUzV9X1RU9yBSlMoMoBvqspGr6vFWZdXVRV9UtjbSKTq
inSq66qb6vKRp1d+ZVdUlI1ZVTfVIq+rm1t638OgUAUHQ8pvRcVAoMoOhQKDKDoFFaLL0WDQKCco
UKFChQoUKFChQoUKFV6Lq5QtroUGtroaLL0WXRoNbXQoNbXQoNbXQoNbXQoNbXQoNX0A0UqTS00q
TS00qTS00qTx0qU0EpPoJ0qRNKkdUt9VFKt1OqarOlSJpUjlSQVD1AdKlSOlSOCBuVUpUigyg6VI
oPqhSnZ0uUig6VIoMoOlSKDyqCkd8QFB0qRQZQdKkUGruUHSpFBlBUqSCopaFRVEdRVFoyoqiqKo
tGVFUVRVFoyoqiOoqi0ZUVRKBB5pdFYEtP6oqhVBVFUVRVFUVRVFUVRVFUVRVFUVRVFUVRVFUVRV
FUVRVFUVRVFUVRVFUVRVFUVRtKqKo52qKoowqiqN6NUVRUe1UVRsgqiqGtBVFUVY01RVGzDVFUb1
RVFUVRVFUVRVFUVRVFUVRVFUVRVFUVRVFUVRVFUVRVFUVRVFUVRVFUVRVNV9yq6rS7VXVd1XVdpa
qQFTd/mTOZlTSppU0qac5kzmZU0qaVNKmnOZM5mVNKmlTSppznOdcqbqCppU0TnOcNYVNKmoJ5wn
nCecJ5wnnCecJ5wnnCecJ5wnnCecJ5wnnCecJ5wnnCecJ5wnmfou2+7eglOrdFxY9VtWznOdW1bV
tWznOdW1bVtWznOdW1bVtWznOdW1bVtWznOdW1bVtWznOdW1bVtWznOdW1bVtWznOdW1bVtWznOd
W1bTp1fTq2rZznOratpY0VFVtWznOdW1bcpSq2rZznOratlSpbVbVs5znVtWtEpVbVs5znVtW1bV
s5znVtW1bVs5znVtW1bVrk597Ofatq2rat6rMfSVFW1bVtW5k8629nVtW1bVvZz/Jz3q2ratq3s5
znVtW1bVs5zmUhVpSZSc5zmUmUlS8pMpKc5zKRKTw1KM5zmopoxRSc5zUU0YopOc5qKaMUUnOc1F
NGKKTnOaimjFFJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMUUnOc1FNGKKTnOaimjFFJznNRTRi
ik5zmopoxRTvZ99RTRiinZifVFCel+mbq3ly8kock3d3d3d3d3d3d3d3d31A53O2uNzycwocc7dz
mBlhOTpyloWO7u7u7u276gfXo7t6tund3d3d3d3d3d3d3d3d3d3d3dl3Ru/gADM3d3d3d3d3d3d3
d3d3d3d3d3d0Abuhmbvv2L2VcZexjGMYxjGMYxjGMYxjGMer9x5y4493rofXHOx3dAwkJx7iWtsc
djsYxjGL276gfQ90SSEdju7u7u7u7u7u7u7u7u7u7u6TuOMRAT3W7u7u7u7u7u7u7u7u7u7u7u7u
4nHYwTtNv6g7ouSUKmQaLC5ULS1lTMq2otFkIKpKJKmFTG4qYVMKVKf0XsgKmFTCpjaUg0NajQ1U
ypmi6CmKqKmFTCgOlTCplQdspupWwqYVMyhVDZsCpjagU+p2jiCriphUy2p1r7wqYVM3uqKhqTkt
6FIqYVMKmFTCphUwqYVMQNJUxtKmFTCphUwqYVMKmN9QU99iphUwqYVMKmFTCpja0NVMqZ5UwqYV
MKmFTGxopT6VMKmFTCphUwqYVMb2nlMqYVMKmFTCphUwqYVMQNJUxtKmFTCphUwqYVMKmVRUNQVQ
VMKmFTKxUwqZarQ5bczthUwqYVMpoL42Yq2lKZthUyrpKFTJ71NS/qAqYVMKmD2hAVMKmFBUulIl
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
hQoHUFQVBUFChQoVBUFQVBQoUKFQVBUFQUKFChUFQVBUFChQoVBUHagqAooXs17W92rkGixCg2wF
CIKbfMpxerCmbqJ7lCrindFiUKFChVxSxSxSTKz8585yotbR4nPeld/vVFNvoUKFCaApV+ruA6/e
qq7q0/vjSUFUE6m5llO0t6XLwpDerdF/1fLgb+02rRYqDerUUaFChQ+op3DstlFefipRCs1VhvVF
1Ss6106k50pOpKpVocaMe6qr3vVVVVSjdFgFHKq1D+9U1ZVpRmiwSjqihVJT2i4dFx0KFChPdXkl
ZY3tNW1F+ZSqBAJyaWlXccxtKSo9nK51TtNAJqFPcqRTk9rUyfVVZ1AoUEUrTUzRcNRFA7TVtppV
EpmLNtUttUqvcqRpvmYo21JkJIFVZFIObNihSrU25ypnd6inJA0NatSPZ8xUnWvqqve9VV3mqrQr
8FdQWw3QoUKHVVe93pKz3VVqWpdmqM2rRcAbv8pgp0NOIWvlG6BSGi56G1S7XUFObY2t9OlsrUTV
xA1yo1DjXQoUKDYUqUsq37zU23333oUNmi8bm2e1Gqucf4g3dVn6Dgo38ylCkikqu5fc51XfjRPv
SmykadNSbY3tlTtVOdahwW3ZT2kyssa9AVuzu6/GjN/xWqO3eTntBUDj45N5s/MM4Hc7qvGonsFr
17Shou/GUN93d3d3G+7LiTT69evXr/H//9zJPpPxwS9PT84UzgdzufWNan8Fr17bRMO7u5Tlrdmj
u3d3d3d3d3dzu7u7u6BjhkCFhYWFkiHv///755tnqM6oz78yeqqc1UrJxZ0quVUqVU9qpzVTeq/U
x1VYamqmt1UlVWKqddOeKqmFVzniqprVSYa6qTG6CqnNVg5uvc1VzDKKrIsvKqdVUqOq4ta6HoOl
9OeJrOi1q8MfobEfVV89BVT6qleqlCqnlC6qsObur6qR6qY1U1M3zxXQVX6r9VLvNVfqpDfZxVWe
bsddLt1U9qs3UUBqqoNV+qrFVS7fPlBkVVIVVmqnDq6qknnqp5VSZVlVyqmVVIFWVW6qa1Um9IzP
Rz1UlVWo6qaVUtRRVWMjqpF546qc1UoUFWVXquqarlBQKqxVT+pqphlVmKqlSqlZc9X1WqqW6uqp
FqpcqyrKuqu1UxqpyfKqd1NVLNVNLjiqp/VYqpGq6qmFWdqipq+rT6yOrYqqaVUw61WaqQud1Uo4
aql+qkeqm0VVINVOqqdVUv1XOlVPbqptVSvUmzmqu1U4qppVTq5q4qqcVUqVX6mqlDoftVTupjqu
VdQKgqsxZU89VLdVPKqbVUw6c3NzVUxqtGjqp5VTOKqkqqmmR1Wo6qQ6mpqsigq3nXOqqZUG+lVO
qqdVUpc1V01VL9VKOVU2qpHqpBqp1FVc6VU6qpfqptVSvVT26mpq+raqS6rFRV1VK0T7G7HjO+fG
aq5z7q2qm1V6qzG2nVTqK+eqleqlmq/VTGqmtBhjVW6rdX89Vyr350qvThrs3bV2kr1q7tJXau0l
dq7SV2rtJXau0ldq7SV2rtJXau0ldq6rVVqq9V1RVtvKiq9HlRVdjNFUvpzxnqp5VTurtx33PHmd
HV2UFRVY56r9RzKrDZVYqpjQRT3NFVTeqkDn56rlV3L0ldqq1zVWKrMXY5nU3QKrjPdVmrrzeM54
6vugxVXqrebuz0FVMMs+VXMqphUWnlVMarWRVUyy6qcRXVjd1U97bqsLKrEdTz8/P2q+q9VeqvVb
VtW1bVeqvVXqr3Pz8/Pz1dV1XVbVtW1bVeqvVXqr3Pz8/PV1XVdV1W1bVtW1Xqr1V6q9VTnm5+fn
56uq6rquq2ratq2q5lVMqvqu1dVlRVT11Wqr9B0nMquXU82o+fn5+erquq6rqtq2ratqu1Xqr1V7
n5+fnq6rquq6ratq2rar2VXqr1V6rKrlTz8/Pz1dV1XVdVtW1bVtV6q9Veqvc/Pz89XVdV1XVbVt
W1bVeqvVXqr3Pz8/PV1XVdV1W1bVtW1Xqr1V6q9z8/Pz1dV1XVdVtW1bVtV6q9Veqvc/Pz89XVdV
1XVbVtW1bVeqvVXqr3Pz8/PV1XVdV1W1bVtW1Xqr1V6q9z875+erqs6VdVcquVUpVXOlVmqnNVL9
1X+eRVfVTjmyqkCqm9VMuer4+eqxVTW6tq2ratZjIjifSKKr6qfVUoVUoHqp7jZqm95UG5qtq2ra
tjjM6r1V7PFd83NVSMe9GoLq+qmkdVOu/TtdRV5o8wKOqmNWVXKAxH7mB8yqznqp1VVA1VTiratq
2raGI9X9cPQNmoT89V54zqqxUGOePmq85uvV8yq0xjc8XNVequ1Xqr183Nd3zcxz1U9qp9VT056v
1lRVlW1U0qpvVTWrKr1VK1VLFVLFW1bVtW51y7oMfagqpQjoefmqzKlUGH52dmouaqmBjVN4egq3
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
fQVGZV9TzZm6jnqY6rNV6Pp2q7Roo6uyPKsjqplVl1blVPMqOfKuVVItV+gq/KrFVOKqdHqpjQZQ
VXquiqpPqUqtq6qnVXaygPzVGVddXVU1qvUBueq1zNGV67VbVjqu1Ui1WTVZVTG4u0ZzUHOqqaVW
qrmVbdRVTzKuXPlV+gqpFqsVU4q/O1VOoqu6VJqrKoKnnqu81TVTKcdWYe6rdVuqxV1VyrTc9V5n
7X2vmqt6vn32qcPQPm51VZoDqg5t0B6rVWpL2rqlPFQx5lTHFU5z1X+bn5qC48q3MxUBqrMXN37P
pVas/R4sugy4jxmi1UOq2eq5VfPHzmiPrmqs1XKCKrF2dVpRc/aMxrvI8jPeGj6mj6m58PlBfTrV
/SgPQVfznmjXGf+fwzLyqwftQR5UdelW9uernVYqvOI1VqOqnHY1Abr0zvzJVU3uqnJz1Yc1VOqq
cmqKqaVWarR6Cq4fnNVaoKrz1VfqprHQc1D51oDdzmdVl0EVW85+fKr1X0RqFmo4qrXeqzVZugqs
6qtHNV9VO6qbOrqqVKrNWVU4q6q5VT6rNn54qvqeaOrDuqmPSOqm+VbVtBVTiq/z1WD9qrFVqq1V
SFU0LyrnVtTVzdVmqnNnqpxVvV1Z3ocPVTCqkA1WVU1qI4jRc/mUFX1U1iqv0FVNOaqnFVIFWx9O
1WVZVcqpxVeWVWOero6rFVKVXnq+rKiqnHPVTuq6er6sNVbqp2fKvqppVT/vFQnjcV89VyraGrqA
9VN6r1V2gqpxVTiqmVVNqqf1U8qsVU0fU1WugqyrHzVfV9RVyoKqcXVciPVlVNbMo6tTqppVTGgi
qvOq5Q1fF3qKsPVT2r9RKoiqs1Xzc1V43MfpVd56sqp2bpVlRjWVZrmPl42qt56uqKrFX96CKqnV
VOavqu1NAagurKmrI6CqmFX1bVeuq3VTaqzVS1QVdVfdV6gqplRnqp11atqrs7dKDI6GLmqplzVW
4qrNVM6rCOjHcadDVjobvO1VOKmrT81RVp+aqzVjOboe9RNdKC9rn7RGoekzR9Pe0vUwMuhg6dOn
LK9Z87AhYlZXsJaacPVBJ4iYmhPSwnYiakuddOnTlles7AhZdKyvYSvpw/qCTi1E8E73EyhNd6iJ
0B6rdX5VhqqaxRHzfOaqmxsqUeM1VPqDKiqmFXVXKCqxuq26qcc91Wud1bVZ7nypioIqrEXWgPV0
dmWc95nP2jitnR8oKrGz0B4zmivtHFeXiqKi03wI5nQVJqvdVig5qrdWmqKjm5j8zMfndTQHqp+u
bmoKrdVIVQaoqO0VAqrlVNXRc9BVaugi56uqsR5dXxzVXVEWVWearejq01VMFfAmI1A6rvPVZquV
XMqKqYVU4dXYaqzUc9Vi6io69Ksqt0FXVWqmI1VMavoaqdVUp81xmqyrLqKChq+ravqs0HOj1ZVS
vVcyrI1QUFW89VmqzV1V+q9Vaq2o71f3qpqSqyq+frVbqtrnq/pVtVIOR3UOOq5UHq2rKtq/pGj0
B6qYR1dUVF1Wqmgq6rqu56vXNVd3Vd57UVVg9Bz1UwquuqnFTVtRVYi7H5zYt1fVfqt1W3Vdq7vV
/erKqakutVuq+fnq+q2qqQc6VbHUVbU89W1Uxiq2piXNVuVBzc756rtTVc60FVh5G3kd3wIXTn3V
0Wd6jmq7nivnoOeOKYaq6rKvqvVWqigij2Y5t1feRVdzVO7qttHNox8td4z1ZVlXR22Y559RaPUn
oas60FVMavP16VZz83Xn50e+aPZsyr7ur6DKuO6CgjN3jVB2jj6xZHV7yrqmr45zrkVWc3NlWZVY
jOeI93i79unURZFVcgagq6K6soI4qrTiq3ueq31OeLnqsXkdRVc5+NYqp1lBVZjqy6qaxVU8qv82
VNWeVdVc5nz1U5q+q9VTmqmVSfKuqpj3i7bdBQc9WG5sdVl1fHzUHZdulVqpqtVbFVTGqndVOI3V
ZoKqY1fdVNrqt1FVPaiq5VTKq8qmgquZVTGrqtquVUzqu1XIuZVWOegqp9V9VM6qYxHqptlVPKnn
PVTGKpquVWOaq/VTPmyqnNB1quVWqiOqmNFVtWUVW0Ns0cWoubnqpq75qA9ViqntBVdqs1Xeaqy0
erauq/nqpnVTk9VMaCq6uegqe/WqxVTmqxErPzUFBVTWqnMVRVcj5qqaVXMqppVTyqlWq1VaoKrV
Vyg5qrFWVdVtBVcV3Veqs1XeeqlDm5qGq4+ZXFU1Uxqs1bzc1SZGqKCqmFRVfqpRqardBzqq7VTm
q5QUEVVOKrJPZ2dTAAH///////////QqACVxAQAAQqTXaRH///////////////////////m3VTCq
5zGqpj3quVWKnvZ6mrKrlQ7qphViPzmwXU1PMqsquc9Vzsj3FVaiq6qlnr73qpxVZiyrarFRVTy6
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
VOat56mKrarZ4+dc91W46rtVuooHlVqrKrtVO6rlW89VOKmqyvD1bU1WI6Cro6rlVzDVHNVTCqme
qujXPFUR1U4PQVZFyxVLqaiqwfnqpjHEeqzQKq/QUFEqmOJ4ZR80dVrnPVdqpxQRZ2iMeq1jiw8d
VOaDdVnMqphVtVo2VUhVU4q6oqpxz3huagq2q3VTOgvmvmoKujyq5zVfHFVYPVd5uaqxzVUxquc9
VOKqcR1Y1zTtVpc1AzR1Xar3PdAqtyKqmFVigvnw1Bz1XnHHEqg1BFEagPVbq6qnFWoVUwqp/dWT
r6UGjUBzfaA8VVmqmFXp2jm8io7uKPnjoDGOqmI1VtPrFiOedoKCJfIzY46Q9XVbhutWRc8UW/iG
zlu9BdAaooKCgNVc61Z1qTXOVZ1NQUFVmrjPt8u5npkc5fZJOO3fRaiCGhvtNkYAQrEEWmj0pZJy
npCavOmk3CFckEWEBuulCTPmkiAgRBxc1VM6qb7oKqZ1bcXNV9Vy6rVVMardVNebrHzVNVNaqa5V
TWqmsdX0J6qa1U1qprVZuq7z1ZVTOqmtVM6qauqmlX1U1qprHLVTWqmt1HM6qa1U1qprVYuqm1VM
aqa1U1qtVNDVTiqm1VINVOKqa1U1oarXsVVmSqmtVNaqstVWSqmFVMKuqtmoaqY1UxqprVTWqmtV
Naqa1U1qprVTWraqZVFVMqqa1U1qprVTWqmtVNaqa1Uxqt1U3qphVTaqmtVNaqa1U1qprVTWqmtV
mqmdVNaqZ1U1qptVTWqmtVNaqa1U1qpnVaqptVTKqmlVNaqa1U1qprVTWqmtVNardVMqqYVUyqpr
VTWqmtVNaqa1U1qprVTWraqZVFVMqqa1U1qprVTWqmtVNaqa1UwqphVlW1U1qprVTWqnFVNaqa1U
5dVNqqbOqmtVNaqa1WHhpKr8XtVNqqQKsqp/VTeqm1VOqqeVZVTxbqpvVTaqm1VNubmnKqbVU2jq
ppQdzzF1U7qp2erqqZOr56OrvaqZVUy546qZ1Uyt57Fd1Uyqpm46qZVUyOerHVejqt5d1csqp5VS
HVdR0zVXc5s5rTxVW6tqbqs1U/qppVTShuOouq3z1NW89VNMquTsVVqYNVTvmyKqztZUxxGqu1U5
5z1dVcquZFVbqyq1mubnqY46Gr6rlTHVcnEjnqp5VT2qwapqTx89Vyq5HVTl1U4qpxVVnju6mpqu
c54qrtVqrqriyq3PVYc1WVWDUCqs3GfKrnPlVqYnYtqKqyeK+er44qrnPlVuqyaqzHdTUVY7quYq
qc1Uoc7NVp46mpqpxVc53VTmqnFVWeqnF1Md856mq5Vaq6Kq6qrlVqqmiqpnVYdSePdXVXYjVXMj
qp6f2rnFVSLVTKrebmNnMMdRVaqv1dHVeq+q+jLx1fVSp5zZVaqKsqyrKiKrKsqyrKsqyrKsqDVH
MY1WVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZ
VlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZV
lWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVl
WVZURPnuojqKioqIzVWYzmOeoqKio5/Yo+fm6VNRUVFRzzMVSZc9RUVFRVlWVPNz1FRUVFTzHqKi
oqL3FFFHUVFRUc/lXHuKoqKioVRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRU
VFRUVFRUVFRUVFRUVFRUVFRURVFRUOtVaqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVW
KrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqx46OYoKrqqp1V9V2O7
tZVcq6q7VeUvs35lVyq9V9XI54sq6purqvWReeKq7Vdqu1XbMj3MVHtVyq66rlVzKuu/PTVXarpv
KrtVyY8OeQZVdquZFVcquY6qUauqu1XKrtV2q7Vcqu1XarlVyq5Vdqu1XKrtV2q7VdquVXeeQxjW
+icbUh8w8Z8uPL1m+iE1eVHNQx81VnzzzmqyraqY1WKiq1FVtVNLq+qmdVM8qphVvNz1Uw5sqtVW
KiqmVWZVpSratq2ratq2ratq2ratq2rKtq2ratq2rasqyratq2ratq2ratq2ratq2ratq3KsxEud
GqygyqntVPartX1U7Rz3V11dV1XVdV1XVdV1XVdV1XVdV1X1dV1XGNU1bFbPVfqp/zRmiM7aqak/
fpz1X6r9WUFWVZVlWdHdX3dTVfqv1fVfqyq5Vbiqw3NUZVTKqxVtWVWI1VaNzGjPUVUxqsc1WGqs
VW6tqDVZVtSY0VW81VmqkOrKsNOTlVPaqe1U1qpl7VT2qntVOardV+qntVPaqbRVU9qp6erI6qb1
Wubmq2ojqHVlWVZUm3OGNVtVIFVmqxQGq2rKsqs1WarcSq+rKsqyqkSoNVnNVTWqnBqtzm58qplV
YMaqxzauOOq1VaqKiq5N1fEbmqt1UgVXaqex1Wqsqzmq2qnvaqnFVg1VurarZ6irasqyqmlWUNWc
1Wc1WVZVtW8xjVZN1WqrNWVaarD1UyNQ1HNVtWXVbqs1U0qyrIou9Vt1bV1X1WNVU1qpvVYq+r6r
FVir6vqsVW6qaVUwqsVfVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKtqpFqsVWD1XarFViq7VdqsV
U0qpoaqxVdqu1WKrFV2q7VYqsVXartViqxVdqu1WKrFV2q7VYqsVXKSqxN1flVyq5mVXKrmZVcq/
MzHFnNE8zM5oqtqplVtRVYqMzMiqOaozLzPcqyrLzKrlVzMquVWaqaVUxNlRmVXMyq5VczKrlRUV
W4lVczKrlVzMquLVVzMquVfmeqq+eq/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V989XGPzc1
Vzm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubFzc1Vrm5uY3NzUE1zc3aLm5ubm
5uaqzzc1Vk/NzVZVvNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NURGqKioqJa
ioqI8jjjjjjjjjjjjyOOOMRxxirqvq+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6k9n
Z1MAAf//////////9CoAJXIBAAA7+3bVEf//////////////////////+r6vq+r6vq+r6vq/VViK
gqp5VTjnqu1XqCqkSq9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvV
Xqr1V6q9VeqvVXqr1V5VZUVXqr1V6q9zKKq9VeqvVXr5uaq9VeqvVXoojKq9VeqvVXvaiq9VeqvV
Xqr1V6q9VeqvVXqr1V6q9VeneBSqvVXqr1V6TXY9V6q9VeqvRPyq9VeqvVXl52NVeqvVXqr0UtV6
q9VeqvVX6r1VOKqcVU4qpxftVOKqcVX6qcTMUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
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
qplFVTio7exM7S506kVWqrMeXeVYz1dbqu1Xatqs1U4qKr9y1X6qbc0Z+ZLPDm95qvqLUdWn5o6t
q6oj5qrmdau5uaqxV3XXM+3Vcxu1VyrKs7VUwq51Bj1eqv56N2eg5o4rjiobqYyVWWY/sZ86xUJ7
s10HMc3NVlmiOY+HNUdIzcx6DMx0mUFVrm5pKvjPVTF3d82VUxqpytTmGquxRmrVU6R+2VdVl1fk
RqrV3VTyqmtVI/PVcq+OgOeqmjqpzV9WVUzPU1dzVU85+fQuOq72qKA91PMeZN3vmwldVIXPzzhq
mqkGrqr/dzNVuqnBqnd81VNqm+ZXVeq2pqpIPVT3J7mjuQ8Rj1PPPc1Sc+c2j81Sot89Vip5o6GX
oao54+fFV1WyxVe6reH56AxvT5Fk8eeq2r6m42dXV1TUmznoavqtOI+XVnSq3z5UHN5OOq7fNU4Y
zl5zzp1UVMwe46rlTUHXt9L5jVbV+ooozRnq+o5zc9W1dlTVtXRVHvMfLurMoamq1V/NHQ0D5o46
gxz5z1ZPZHo+VdJnMeO7R5IojW46qZ5lBHQVU5VViq5eHqu81VigqsVfVTqrKqY81TUOqn1V2rMN
UGMc1BV2VBuZR88c98qefvmc9TQZ5cR48PZ+fO56rNVztZlUHzrMHjzuecyPmzz26y87+e5jzdVq
S+nD4/TERAQI2zQbWHzYimGqQbl3zKhHOw66a1pVYddFltOH69xEBAjWzQbWHzYirmmqQb4r5lQj
nYu01Q7DXUtNc43EzdbqKuupvmMKrtV+Orj1U056qZxdYz5VlV7I+Zc9Vl81Vjmiqp5zHqvWz1NR
VSzV/NVtVJFQDaw5qAKPSjjZ4+ar4lhtHNEfBFdxRVKiqvWeo5+1RUVJ6rSquVZGj3UVMaj56qdX
Vaqp0qlUFVPKrVQo4g+eq5dVM6qen6PmuOqmZ41hom6rVy0FVPYqqeTtA+bniqvayxXqu0FXVFRz
8/ObVVPDGq6rKqcVU+qpgaLp3moj1Uo6qKqZOqmVVN8q+qxVT+gqvXVSnURxmyzVW+e6mqybKmo7
xVU7NUxs5qE2rVBV9TdBV0XQ7o6jO1RVeqKiqmDVAd1WonVai6VXnlRz1bnNVaUaqpnEY01071Uy
eqiq5V1BVaqpWq+zn546r91EVV2oNV1BqqnUUUfatdVwyqKirD3Rnfaoyq9UVDVRVTB1WqA5oj1W
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
48ePH4PnHjx48ePHjx48fgLOntXtXtT4navavavoe1e1e0x9Dqvavaznpl1ry15a8teWvLXlrtt1
ry15a8teWvLXlry15a8teWvLXlry15cnwV7V7V7V7V7V7V7V7V7V7V7Vwavavavavavavavatar2
r2r2r2r2djOxnYzsZ2M7GdjOxnYzsZ2M7GdjOxnYzsZ2M7GdjOxnYzsZ2M7GdjOxnYzsZ2M7GdjO
xnYzsZ2M7GdjOxnY1e1e1e1e1e1e1e1e1e1cGdjO7zzzzzzzzzzzzzzzzzzzzzzzzz3vPPPPPPPP
PPPPPPPPPOJ5GdjOxnYzsZ2M7GdjOx6555555555555555555555555555555555555555555555
555ozu88888888888888888888888888888888888888888888888884n1E+ByfFXtXtXtXtXtXE
qyxWWKyxaUqyxWWKW+b5vm+brEGd9x6YgzvuPTEGd9x6YgzvuPTEGd9x6YgzvuPTEGd4r2r2r2r2
r2r2wsissVlissVli1BnzYgz5sQIrLFZYrLFZYrLFZYrLFZYrLFZYrLFZYtYVZYtOxlis0T0r2r2
r2r2r2riVZYrLFZYtKVZYrLFLfN83zfN1iDO+49MQZ33HpiDO+49MQZ33HpiDO+49MQZ33HpiDO8
V7V7V7V7V7V7YWRWWKyxWWKyxagz5sQZ82IEVlissVlissVlissVlissVlissVlissWoAWpr/0D9
3cHY2Nh3PY2H47tttttttfbtttttttttttttts8AAAA67urqqq7vbvbbuoByMtgCAAAAAvAAAAAA
AAAGwAglSCqqUUSAA2AIAAQEIACE9u4AAAAAAAAA6AAAAAAAAAOgAgAAAAAAB0AFAAUBAAAAoAIA
AAAAAAUACAAAAAAAKAAAAAAAAAOgChUAVFCgAADQVUqqipSqqKKlSpUuwAAAKAAKqqqfX3333324
AAAAPAAA/H4/ftgABjHKqqqqqqqqqqqqqqqq8/xcNwDB0CEbsHHUVy5Tr4fsY+H4Zj439Pfrsv5B
0Dibgv7ujy8f4BBBBBBBY9tQCdTcgSSfQUFBy4UGBQDT3w4qfIKCgoKDx7BtAhn1KZKntXHP1Vm0
ZApf6D26kjCcXHvhusnzhUbIbOuvvV1uEWjvaCgtH+V+D/jqzR6Bx9sWqBVkFYcgkEFBQUFBQUFB
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
RERERERERERGCcRERERchCCIj0RIRnESDhF7JGEBAQEBDCAhRAQEBAQuogyGDMIyoaMRERERjjjj
EREREY444xERERGOOOMRERERjjjX06EbKMpjPXpjLMNREqxxxiIiIiMcccYiIiIjHHHGIiIiIxxx
xiIiBY44zWw4iZZER1x3nHPObac+9B7MTFtCNMCHUDYRERERERER1ERERERERERERERERhIYRELf
QzEERERER49MgiIiIjBbxhARERERThJZZKMweI3WFIniJiIiIiMBIRERERNCURERERERERERERER
ERERERERERERAQKSiAgIScssggIJiCFELItB4hBGCzFZy62kTLLKEWXWogWgUfW2tAttoRQGvR5R
BhBh0MSktaEdJaNL5b5VTq3yrRAQlYQENRAQEBCHhIeE12IPHiEuyFDJDCCEI8tJJcqSUuGlyF4T
eWGEJNkOIISBCNKH7CNoeCH4QkA9OsIbVh+roClJwEKQGTqhIAjZVyGraNdLZCZGmICAgICAgICA
gIDyS3TdiWy67SIfSyxAiQiPIIlInpKIS3LC0QlFo+joRNAR7DocrbWWmOkDksNhFiS9naTZsOaS
IHKZMQEGTbS06r5KGyiIKTyBD4L0xAQEBAQEBAQEKwhdQbcWDG1sIttNVprWsIiIgICAg4gICAhK
CDIRNszMzWhaSyFLYQHLV1G9Udi6jVlsCwjS6NLr6CShAQEBAQEBAQ1cQogXUQTeD8RAhoS4mhSt
S7CDPaIXFECuyV7RGTyAQaiAKcrtKVPNqNLsPYktxiB44fCSxBR1o1q1au8EBAQEBAQEBC0QIOEG
vpCPEBB6FKH0RhpaVSSEBAQcrgOVxyHWpjxBJDpcqsIpDx1di0MQrDmTlEUehggICCAYaM7FGJup
B+qtAsr0EsoQEBAQEBAQELBUOgzg+0Hwj6RQawToIgw5NMRQpCkxERunkHEfSFCkKTEfSIRQd3lF
TEUKQpMREYIYJhEREd6QwYIfBsIweCIiIiIjB8hMG8G0HVg+ERERlIZB8hg8gh6TCMmlCLQZyYRE
RERERERERGD4RERERKmmmIiIAimm7UsMIl0jwgICAgICAhRAQEBAQEBAQwg8EAyFCcLOCIiIiM5O
Tk4IiIiIzk5OTgiIiIjOTk5OCIiIiM5OTlGQKEXH3TwiXV56enp53ESTmnJwRERERnJycnBERERG
cnJycEREREZycnJwREQ3nLOTj6RWcnEJlsAeDif/Rs6Jhm3x0DeL2qPo+MDhsxe1N4nwWdHR0dHR
0Th5b0dHR0UaCzno6Oh2A+v3AI6ND9HR0M+czLFXLo6OgaPF8Lejo6I84WST/zcxxL0YDbP0Kgg/
9Pp0c4YwOjo6OgHR0KARQCe3R0dHR+fmzA4UxMzsr05IjFx+FyBx5DDxfC66dcvsTusrpRcyIJFr
2xe1R3tSa6y+FAOoB1AOoB1AMoBlAMoBtmGXFW9qSvapePnII016GcbP/ykzHjo+81mvWUJYAv3X
9t9sT64ExsGwcB+hn+PWs3LpP3ksje1SzcXfRGoi38aPT29QWrrVke5hYaB/t37kMh/J36J591Wa
AMohd7evt6ePsMb/79i9qknyGR/fnYHzw+H6EO6ZDp4vcukWrrXvcvYLpbq2FyLEty2JK5QDqAdQ
DqAdQDKAZQDKAa423tUbZqrPuaUPRz0B/sTbtOrlNgTo1YHoDv0y6QSdBhQCXEyzVpToRvS7crsu
PMeGzoLUNZ59Evpo0U9sIPQDD8dEZfnZk9jcplAgDtpsDp6aaJ9DGD7YTjR56OMPToDmG9EZTK7w
78tu2btLZDIkDkfZYltRaltsSxe6mS3seyEyL2qFCa9JkQhQDqAdQDqAdQDKAZQDKAbdjYmaiIQ4
LCwVb8OX5STqyJ/npz8x7fc+S+M9hdWAwuAjISGaZJk23nyvZfkce/6wWAynxkDwyH50EceYzpxj
mvDI+WK1ai9vGbAYy29ql9DBMIROA4DmOPo54l+9Gsvz8HjjXp1hzxj4y9qXuJmOx5gGCInkfQKz
V+Nn3XNHP9/YjwDV0UyeC1S++nUYZhLkbcabf3mP2wKLb3F17i6Lb1ZelAOoB1AOoB1AMoBlAMoB
govapqtQ67DT5NG3J5Q5hDks5MEGnormG8+GvWjRgjEADWlvYF7jp0179lrWpbjw1BMwGHHoDl8n
Pk8pv/N1Wc7aag06ZtDJaevp4YT10+mHB0Qcm47qUyX7u5yjcpTYHT00Aysvpk9nZ1MAAf//////
////9CoAJXgBAAAe4PcxEf//////////////////////BHRP76bZZkfUiJN37k8lzk8ns200hYHd
WnqzRTpm0afPEAwfr6eInQqBGdEZYOzKeG6fPbPoV+vBKAdQDqAdQDqAZQDKAZQDNMDfPuxEV9Zb
irgWJTluJGazHxPv+/vfkbg0pcJncAYxarMF6JfNL8TlsLdvzeU59fpCcIPAyZtGB9sN4mD4g6Ob
ivY3g7Zk2Z6PhuzaHo9JPn8rG6YTHxNNGgHi2NPpLwEM2yTom2bR+Ml+fe2M6ZDfj0DTRorvah6a
4RIWJvaoUN2ZDO/1iJb1eNoaab2p+Eto6eOhtqF17mzYNzqAdQDqAdQDqAZQDKAZQDbvfEtaH3Mn
QzoHo1A2zZH83fTduaze7R9eeQ/uj3s8yyPGn0wlAeGrw8fGfKQH3m6J2B2/PL5L79/jwplx1eRM
wXje1KmHgcTMXRgejo2/bo5SCt+8vzXbna9G5mH8BzEmrwZhTA9hyIEuQ222feZp85G9ZO45NPwP
uu1yeCFntrss0N1Mn+0vhmUuYpvRJHyjfjbbaS+pCK5G3AIuDJfbEWKgK51AOoB1AOoB1AMoBlAM
oBgmLgwhDhDGwjegb2pRHoOSz1U+SD+5hUCZDLcRuz/RmsEi6yNdOBxg8ea63GeujbGq/vJpap9m
1bHG3/87rmf71ebUMx6Usf4bkame0fG3YDcl/ec70I5yv4BrQ6Mai3aYGI+g4XD4H5CBZemXq1La
i9qjRflzXpci29XtSt7lqLLUXtUNt7oqAdQDqAdQDqAZQDKAZQDBMTH8taZWJ16BiB9o+sjlN+76
zX6cx95rF/hwKgD03enl8NyHp6+GD8NPHngfYp/RvtN0PT453TaJ+jx8MrTL+PgmLCeXje1Jlg2b
9xjCZH82v5yiT6r8ffPGW252hDuxHh77YwJu8HMa+FMDJMsYi5riAhOltQkItuO/Eqe9XslLai9i
3vXFF7U+krlia4r3bivaobhi9k34oB1AOoB1AOoBlAMoBlAM33MdtWmNg7rCC4+bOgM+eyT5HMlk
VQJwzozvxqk04LN3WRwcIx3mj1x1OOejZp0rCFGnajYAO0dXnkOZ/KxFcejH1RTofbr1A+Eu3cjn
9dFejozvOWalbjUGDt6Ge9PvE4bEhCgCe9koBYh70nvapUW3q4kzpr3bgvesQmQmQsRFqFigHUA6
gHUA6gGUAygGUAwcGYjW5DXjaaninqHob+ZH73k+T/a6Z/RUAZHKlp9N/xXx8/HTAPbA0l8WwXpz
8zTF8bp5dmz71+MZTHfnijT7eWDp7RzgOOefpIrJvbOD9AH7y+R2cbfJHvgujnRgvocbifGTIAhG
//vTP/7vX4l9ejJpcFgtaX2waXZJrvRyfW1L0eKX9+BudGGwGCRhr0uvcvakrb3LaX4NxKAdQDqA
dQDqAZQDKAZQDHR5MbXb5GP7ij7ro8OdoOJyst5ohNk5+NmE5wmmXzcBieKNPswEvG/8DX42oyOZ
SmCBv3oxeRvbWnFYp73EjM7cje5ig+DL3KXvxe5c97YsvfhKmvbKgHUA6gHUA6gGUAygGUA1bmS2
JvmnL3tUGY/S+v/x+We3n45nM5DRgDkyFffxODBGAUuGMMxsHhgGqXwml3+vMyMlkftFmYHo3aB0
buhnHr6emgfUy6DhjBMERz+fOU4/zdlMmFld31+jAJNGnQLI9cH4+np6+3tGfz2RGh2ZMO78/8h8
7pv3z9fOrDBvbKSixPe2EyWy9t3MoB1AOoB1AOoBlAMoBlAMqj8SoPFXEq6VRtsMD08OehQFqCc5
Ojo6OjoX9HQzo6DJxGX8+jo6Og79vR0dHr0dGg9ujz++joN+Sfo6F/R0dCo86DG/FAWoOzY6Og4u
joUAJpdHR0dGF9Q9HQv+ejo6OhUc9HQYZxmgoNcT0dGwyejo6D9yvRm+jo6Ojo6Ojo6Ojo6Ojo6N
eqhdHR0dHRlG9FK9HR0dHR0CXRDOjo6Ojo6OjowWjo6JOjo6Ojo6Ojo6C6ASL+jo6ErSqzoC1nQU
V6AKAdQDKAfSoBlAMoBlAMqMP0lRBJ0YvN9HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHQoIFAP0dHR0Y82j7rt6Ojox5l4XKl0dHRz561AP0dHR0Z06jvkH/6Ogy1AIqCsP0Zz9/ejo6
ML0dHR0dFvR0dHR0dHR0NlttucFejotttt6Ojo6Lbbbejon6LZ5uOjo6HynvNN0SdGz2HNqAZQDK
AZQDfv7+/qgGUAygGUA37+/v6oBlAMoBlAN+/v7+qAZQDKAZQDfv7/fqgGUAxqWGt0OSxYsWLFix
YsWLFixYsWLFixYsWLFixYsWLFixYsWdHrzp9vUujC0rUH7/7Nfz0cLFixYsWLFixYsWLFixYsWL
FixYsWLFixYsWLFkg9CyQejXvnpPwU5HCcfQaU5l7tfRsI6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6O
jo6Ojo6Ojo6Ojo6Ojo6Oj92V+ujo6OgOjbHR0dHR0eXHh0dHR0eWJ9dnR0dHRx0dHR0dHR0dHR0d
HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQ/R0dHRNoiBjoBTbNOXR0F46tQOiWlWTojo4EiL
BKDyo9GRK9y1FnQxjAfPz8/MkuvgAPLSAeJAejGUqPQPRt2eGvXtCDobEQ1ta05KOhxelBqIhnZS
TaG9oGjToQAAAfPz8/PhP6g4Bo8aUHis3lpq3fNWdt64iWQRbsRc09RoCb5kk3tGOjoInLgm/IWB
6ZAdAWySI2hjelHo6K9DkgqdHhZxp0AAAHz8/PzrDu0+WkaU0M1SapBa/1z0dBAd+Ono56Ah+QhA
2wnpo1+EdExQvmZLWemnoBAATQ/QVejo6GRVs0gxSpWo6OiEdA9CwCBAAAPn5+fnUNNOrVSlKYLB
YCg+A9HR0dDWh6OgM4JJ555OK1rV6kAgAAWkDu8vD3tGAAAPn5+fnTSmrVrKlAcevt0DJ0dHR0Q2
HpxUJC2bgHM3MA6GuUV4IFKV6GPoenCK8g4rWt7nBRQm3ugAAHz8/Pz4EzTJJ4+Xr4SSCAms6GiA
Id27x8Z+joEisRENbNzxRKOrlL0RUq8cJX+L3GAn3Xt8DAA+fn5+cCt+df1mejo6Ohb0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dDQlO3o6JCDJ0dD9BfHRt6Oi9qS6Ojo6Ojo6Ojo6OhnRFW47zZ8/Pz87
du3b8/Pz87tu3d89HzNpTtEuhxgA9A9HR0IyW5JQ96uZLceqnR0dHQO753A6NDKybEdEokRYNQlN
HoyhXq1C5HPPPPt7e3ttl8Nu3b56uBkk49wUZUega9G7b4eHht54gMRDWlUWckPR0F0dHQ5UGsDz
sAyXdMiy9up0vx8b0c888+3t7exbPbbt26vFjBkrz566h3zVnDepB1SxQOxLNUaSTfksvxWkdDS4
IP1zTnplBTo6OQySI3B+EtIq5VS1pzLZx8fHPPPPt7e3tXnfz0BGgs0g1y6pKN6PuboIDrZLOibo
55+Qh4CsIqaNfjHRMUUp0L5maK7KaegEccTwXQVW9HQXQyEVbPKI0qSHfohA9C3hA8888+3t7ewR
pyELKUwmEwdKeI9HR0dHR0BCEM4JJ555JCbVyqB344A+kDu8vD3tF55559vb29pqM5CEqMBL74GX
o6I6OgQw7OKhKgZ5ATTTRx0B6CishEBjehj6HZI7eQSVrWvBRQm3v8888+3t7ewSBs37/P0wHjLL
ThrOgNOAh37/Py2R0E1KIhDNNxRKPhMlilSLjhK/zegcbN17Q+eeefb29vbMrvH59jA6Ojo6Fy9f
0dHR0dC/oXdHR0dHQvXr1/R0dHR0dHR0AkppB0bBknfo6Binn0eMPe1EdHR0dHR0dHR0Q4ejocAD
oyHPt7e3t4+Pj4+3t7e3j4+Pj7P7S7Vy9ladC/oipcl0LiXdHR0dCMV5asYofFBAYRhGEYRvGEYW
NfnOnEcRwnAcBwHAcBwB389XW+8IQhymU5mDzkcqEIQ5H8CT/2VDW+OqnVGTKgAAXbesHRLM0AAA
bN4cWMABhdHHANPhxyoBjUHqMwzDMMwzDMMwzDLMwzDMMwzDMMwzDMMwyzMMwzDMMwzDMMzqP9uw
zDW2dWTyWTyeSyeRyWTyeSyWRyOSyWSyWSyWSyOSyWSyORyWSyWSyOSyWSyWRyWRyWSyWSyeSyWT
yWTyeSyeTyWTyX7k1ANzBxfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn
5+fn5+fn51dQcw3CHF5yz7qlkP7716bCDF+2XWL0Jbgubq6urq6urq6h9berqznht+viTwzv6Y5w
KhNQGSTfPlkNnEu+Y481hPzJYzEqgA+DZ+f3JNr+xkMJmd2uzIe/97yZvLYvMZnF4vK5bBZLN57O
qAA/lQAoA8fncxhMnnRzeaxWWzWMx+ay2NzefzmSwmXzuMx2czmOz2ezeVwmXy2KxRwZH2/80i7T
3UIcbkSp7erq6urq6urqT9XV1I0y8z6dWW29GnCl0aI5Zx54fkNfDT0a/bEFmP7o6AAmyK71HX0b
+MBg9mwAsk6NXiXzu9pfH0+vq3x9Ojo8vJb8/XnJ6+W3d0atKzVq6PjZ7e8nj8/PV4ePV0ePkv+f
nz8+NX3k+Pbw3dWmTo52+nlUk3V1dXV1dXV1A+tLOrquJNi/n0esnsqElAjgcz/4TDf2L1B+NpaM
B8efXyqCjdNA8anueZsKAs+DYUBZ/5g0DV5x3t+cyCYxnfuBpkOjXBYXywuQ8/M/jdUASoAVACgC
Mw61AIoCT4yJwnCoDDbPk2TaPtUAqAE3T7NNQEZPLfuEOkzDdPxUAqAHFZfzwvxq16PbyOoyjWPc
+zaUAKoB8MV8a93OLw59m2YxzqAE1sNv/6mFeyOrq6urq6urq6rOrqdmZ/Po+jgH5+9en7/fDV8Y
GP3PfG7j7ruDNBPQ/T+xeF+bej5+ehb8g885mMrmfP039Fmzb0bjBMM+Dwy2c8pPrqt+vrorkcVj
D8P3L5X0B/dHRv22bPbxzOZy2Vp7b+hb8g14n0/83l+PX56Fvz8dHVt8/TK5k+TxMMwdkbvnqj58
OMrnD+PHdifnoX/P0sb8TByGRLfP1dXV1dXV1dXV8MZXN6PQ5foumSXKfHpp+v3FfM2ot2AEtfxl
62eP1isz94jE/FMCzL8z48LfTDbt+vz3+HhnPo5zNwv9i8rN4eOrT/zmFkfkwMZl8v5/e7Tq8fD6
oX5lcGYJzEYOYyfj5eOv63YX5+MJiajhW7NOnX45cOIRj8PYYf+Hw8S5xEuvTo0OiPDw8vLx1cdX
V1dXV1dXVTD/HV1dX/P5c/WJz31hsThfX+zuI+t7PXJbSzuUwGPwOQynn9bvPX95AwDiy+Gxphev
5kNvzMOL//nDfhx+uA9dGzLa5vko+9WV1+XGOOTM+Xx/Y/z58/rA4TAZb66OdmIxPxvxOZzOFxeH
xmX3z/24w+jCZgz/bB1yO3z6Pv59MBk/7CYrHjkDjblsfL5+GW35vIa/T08TiOHOZ7E4zX5/uR/K
dXV1dXV1dXV1Qzq6ur16vvAeO7br1fPG7yxZQY6gHPLz6BBqBRmrkfT0qt9Y+NeAwOI+efLV8p9c
U2gDh/HU/otFZXAa/7E+tfjxBvCXMmnb7+f38ePl9aZOoGmnV6YTPhK6Qu6urq6urq6urqiXq6ur
Zv+fLF57HYr6zOZ+cJjs9iGfp2Y/lUAKAEzs4dn39+/jkvTzT2dnUwAB///////////0KgAleQEA
AHJM5G0R///////////////////////+y2vHnFhsP9HF8/uH4yG2n6cmKw/5hDAzOTy/RpwmV8S2
j4ZXClvPdUImeoAz1xKgFVBXz5enGE+v/5zGM9frow+WzOHxOZx2Ly+XYqGlAn5b5zDy0UTWR1dX
V1dXV1dXVkI6uqCZ9702vaH7+931qTbqyF0HnjQUyWz73M1C1Cyvt0feQ+Z/gff61T/I+OQ+Jvjb
TibUuhbH58ZD3br/S373aGbbIHTt/Pj7k079/9tA7Oo4NIa3q1FsdXV1dXV1dXV1eo9XV8ZOTFHF
mcdmPz28vPF/WaxucOPCYPI/WNOzNmOoB2avz68q/OAwxwZnCnL8+fr64n9+AZjNYfH/WWwmTzXn
pxHiOWwn39acxlcL8F54n0ObM4/IZjC4T6B//XkDAeOY+vTJZfGYv7x+ZzHj5+uEOuJf3LmSDP4n
Kr/mX0xOe+snkMHgsPiPr45zGO9NYOgvj78/FL1dXV1dXV1dQOj5HqB5R0gHflzBMfGYnd9eHr0N
n5w3jTy+tgwzf566f2Qw2JxUn3/s06wADv8sT5+GI4HwkbskrvdGm24Lerq6urq6urq6urq6vLfh
EeM2WN0zj0UBigWVAW6Tx/vbRXZkclicEe5lG4qCThxRs5g1TI89ta4bIYPU6Pb+wHPx9e/tlcVi
8zm8Zg8lhcL/85XNG4bp9m8oAT+P5QBGWdOHxn1z+fOJwh6GubR9H6oADbPfC4n+/pvnF4XJYLGZ
s/jfUAB/G4bmbzU35hcNksHicrmcX7/PliPrd1dXV1dXV1dSoQVPviRYQ2jlVFpsKAjk0TaVNKqb
VTSqcCEwTBVD6gHUA53mPOqKVU6qnFU4E1jvUA6gH5ySgHUA5/GY1VGqidVOKpxQFGtOYJgmCYIe
hVOKptUtKos0fFUGKAdQDnUYJgqB9QEKp1VOKptVOYs25zBME71AOoB+Q+CqeVTappVJJs4I5FAO
oBzkO9QDqAfnCGaqm1TwqmlU0EJgmCYJghCqmlU0qmlU0EOE8vL1CFVNKplVNKpkIeTnMbny8whV
TSqaVTSqaCHnwwfPp4BCqmFUwqllUuEPOP8uTBwAQqplVLqphVLhDzox3MmKCFVLKpfBa8B4YnE4
nE4nE4nE4nE4nE4nE4nE4nE4nE4nE4nE4nE4nE4bAYvD4nF4jF9XV1e3V1dXVsnUICgfUIaheNbb
NMbpum6bs000xum6bpuzTTTG6bpum7NNNMbpum6bs000xum6bpuzTTTG6bpum7NNNMbpum6bs0xg
qAhQfKD5QfKD5QPf5aVCsoPlB8oPlA8ZKgx2KG1QfKD5QfKBQ2jDdQfKD5QfKD7z8MOoBVCAoVFB
8oPlA3paoJ1BAoAurqzOa9sZ8/KgeUDmZzWZzOZzWZzOazOazOPwxw588DwPA8DwPA8DwOw8C6NG
dzudOHmteThzpwZsPLnv1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1Z/EHmeeU6Tz
PM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM8zzPM88KYh5nnijHPM8zC9Dz
PPGYw8zzMUxzzPMw8SeZ5mNjjzPMy8aeZ543JHmef2eZ5nmeZ5nmeZ5nmeZ5nmeZ5nmeZ5nmeZ5n
meZ5nmeZ5nmeZ5nmeZ5ieJ5ieB2eXgdh2yudh2AlOw7MQJ3bRyHV8eJv47BG+aZb9+CwWCwW/fv3
4LBYLBb9+/fgsFgsFv379+CwWCwW/fv34LBYLBb9+/fgsFgsFv379+CwWCwW/fv34LBYLBb9+/fg
sFgsFpxGKMnBYLBYL1l9PbBYLBYLFYXEe2CwWCwWC14HXgsFgsFhzH8d+CwWCwW/fv34LBYLBb9+
/fgsFgsFv379+CwWCwW/fv34LBYLBb9+/fgsFgsFv379+CwWCwW/fv34LBYLBb9+/fgsFhMFv379
+EwmEwe8E+/C4LBYRm+s97UlJ469evXr169evXr169evXr169evXr+PlPfPoYRhYH4+fn5lM4zsX
8/Hz8t2T/Pz8/P4Xx/Yfw+cl976lv37927du3bt27du3bt2/fu379+/fv379/V1dU3V1dXVyHo67
u7+ecnk9uyv368MpPtyWR/Nk2+YJVqPt68t/MlkP3I5XJfs33gvf3wE8//k8rkf3JZfJTze2C9fJ
vPz8//11dXV1dXV1dXV1dWzd0dcXYNGM9cD4ScTfOyouXkPQDJzZbeRY/DYPz6H25nLZF+jyweEx
nngffHF0N/fr6fxwGF8/HAamEHL/Hng8H5YrC4Pyw2H8vLjq6urq6urq6urq1afOTkvkuj4/KS65
PTxZ69AOd8bt/zQfXzwXnQIztn/9xTaNXpgtWoLfr9D/beX8NGC9sB0dGyacOnI5Dx+/v1w7G7JP
n70a/jJ+jQhD5ZPZozberq6urq6urqL/+qkyWtdOKDmfn/yPzkv/454nZ48Tf8/zkt88+x5KV24L
jomyGX3f2U/9/RqlC3xi7uD5/36urq6urq6upnt7wvGNEkfXhj/X2wOn1wPlpbTx6K9HjgpfP28J
JdA9EjPHkGrCYPV64DCefFd/ho2dGiPbARJN9enru+9eA3808fjq6urq6urq6tv7+h6+t5s5J0cz
5H+3t+Mp8b6Pl9pdAf3K7/nb9fdej4znR0fWQ2/vPz0R9/XR0Z37+fnorv6urq6urq6uof7Pemd8
PA+82xjD7Pvw8PDwzebYxjM2ffh4eHgfebYxjD7Pvw8PDwzebYxjMxmdm3425g7wAADMHn/7+Zc0
enAOOMyefxN8XU2YzGbzeB169ebzebzevXr15vN5vN+Hj4+Obzeczfj5eHgcGfOA4PGXVu6urq6u
q6vm6vnq6urqvm+bq+erH4EHjj8fj8fj8fj8fj8fj8fj8fj8fgsfhsFgMHgcHh8Fj8fj8fj8fj8f
j8fj8fj8fj8eYBgY/GYzHy9S6Hup7v9+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr09b/v+YyTCwfr6
+3roNQ1cR6+vr6lzN7evt7fz/P8Pl608/Spenp6enp6enp6enp6enp6enp6enp6enp6enp6enV1d
Wnq6urqm46Lvr6/qbK5bdtr+e0nn5zbcplP7bP8T8kUo4DATV/srk/7J5nK/835g8DgcFsnyOUy2
T/snmMnsmwGEwHrXn6+sh+dXV1dXV1dXV1dXVt3dHX19fGnG4DBeMnE/1sr0E/oPRJl58t8ORg4j
CenR0bMxmMn0dHphcPjfPC4EwX6A//39dHlgsP6+WC18Rzmvr0wuF88dhsH6YnEenlx1dXV1dXV1
dXV1a9XrJyX2XR9fzNHjJ6+TPbo4m+B3/H0Pv6YP0oEZ27P/eU2nX7YPXra37/ef/dy/lpwmAwfR
0bJtgdWTyXn+/ntiWB2y/f5p8PnLezeeQ+mV26c8Hq6urq6urq6q5H7aTNDa6sYHO/eRyX3lMj9T
cbPOSbIbPrKfGyfa8tK7sHx0T5LM7//Lf/x0atHPPld2WfWQu+rq6urq6urqZgMEK8ejTLH35GF7
4DCa/bBeWoNPN69HnhNHp7+MujSLyM8pmg14bDa/fBYb14r8+Wjb0aY98Emkn+vb23/mvBfE1PL5
6urq6urq6urdkMhzd3ZTnBL0Tbcrkfhv1l/r5YWZ3F0c/+Y+Pvd9/rej6ODo6PzJbf+b76Oj8/Oj
oOH9+vvor8dXV1dXV1dXUWJMrImJ9/agNMRqgMUBv39/f2YhiNMRQG/f39/agNMRQGqA37+/v7MQ
xGta0wDB1eHn4GAbzWtaYCgCwnlJtMJQCNa0JgKAP00eN+6TBMExTFzH19fRimKYpi/f39fJimKY
pi/v39/ZimKYxi/f7+fhlmYZZmfu748erq6urqv2/b9v3q6urqv2/bu/eo58s34Ok6TpOk6TpOk6
TpOk6TpOk6TpOnMHTncw1uWzOXzOfzJ0nQdJ0nSdJ0nSdJ0nSdJ0nSdJ0nUdR1HOcx1beosDHgxj
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
iYNC8sB7eJN0bDB8sNhshtrVtchkMNhsNhtu1tWt25DDYbDYbIbW1a3IZDDYbDYbbta1rZpjfNoz
VADNO1rWzbjVUARrGvs3ta1s282TeNjGTTbdpn4bDYbbt27cNhsNhdu3btw+Iw+H27du3D4jEYTZ
Ps2YTB+Dd3x0QI7du3aIiO3bt2iIjt27doiI7du3aIjH/t/sigYjJf+RyEQMfeS27RER27du0REd
u3btERHbt27RER27d+4REf7If/6Iv8aKqAbs7Ozs8OzsBL5lHZ2dnZ2di7s3019nZ2dnZ2djIrHZ
2dnZ2UEHZP2dhV1F2dnYz4Dz0dnZ2di8VtsdnZ2RQpvPTTIyT9mT7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7PD42dkvx2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dn
Z2dnZ2dnZ2dnZ2dnZ2dnPZ2csyfZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ
2dnZ2dnZ2dnZ2A/PvXp+NfuPFKTLuiix4tstvaibRTadaL2LchYDon+NHiHok+Z2fW7fq3en3gvm
WfowhA59eB6PzL4r/kH3+5o9PXiTZHnPLt0FzHQLzB/B6NCXo24DM16N2v0mBqSZppJYk6OjmbR0
bein59aegvDfr6LZ+JvXx4kB9e39MlJKGGbOiXhY1bsZ0D8FKkcc//yPGQ8NX3skHoeb+0bWgDmO
h/jo8KV8LRno3St8PD4+f76J+ibol6Fq3nf0eEjdHrr48V3xz0dDPBbvD0fv10T/HhKs6OVsnQ7d
Hlx5dXx8fM0vRs41Mu0t2i83s65JvxfzT5D9dCH34v9zeMk/Oj4+t3n0aAePp+e8uYxerYgsf67/
zop+eLMx8a6V8okMzZnf/+Z/dHiOB1sy3ws9f726OjAZL40yz4HeYuc8d/zr8vroH69PDcYhx/El
ae38/Rm8QBrPybo+q+Hxr+frwHol6Lfb9KTB+n1LNtxotigbxerg6K6i1YPC4fD8PTVx7TPr/wcb
9wPicZuYS3tUC3MVKs3Qt6OFvR4aK+Hpo6NXr4LujhvR0fGf6Oj4/Pkvr46J+hY/nMVcJ6S+mjiI
8eOjob0a46Jvzd+7+jo+L2fRuWl2+Hpo6eOjo1+C+TV66I6PnPdDeh/j4nL6+/kjJ2dDrOiTX0M8
vmbX4t+tP7yFmThu0PR9IA/v4792v7+ujz8AS+cnh9TFcE/QXA7Nvl8y4BHGzXVmnBfu30r9y9HH
xy1r+hYKvPx8c+H7pk9ejo8/YH18M8PCXc1k2hjOifTtjb8fHricqPpv6GyT+HRyzX4fEk9PFEs2
znfST/kR8cg8H8Jeia9nb/ijWfn+HxCUFvGbn69Nc0ngW3TNLXX/xgPvj92fA+oeQbPr08dnQ9N0
vQXoDX0dHR9feC3b6gL6rW4W+v54ejORL76B2Vj8H5/dlNPQCzkn58fotlPDxbt2/pcR+eDfrbXx
L95n8/zA7puhEnF7UlQdrQV1fgG6gjkC+PTZ+i4l6b/XnezAEGF/kuKQN4ibI10ZD4jJ9EwJucFX
zk3M0ySj0aaeOyTZTbv3h9fP32z+v756oZtfTu6PCvkOmTfJxq3y759P5w+mbXt1P6TU8vrw5qi8
pb2feUag/fx5w8A3vJL+/Gubo9cB/eE3p/YEwvTo8fxn2Px9evG6nt9bZn+K03V6H9OgdjfsqDp/
KgLcivr+eg/pafulc5+spX74+aeurgH5q6A0IvL6wG2PnQzIybdnDRAhJuS9XsW9f7CXR4heTwlJ
dUI6BOzjnVzs+OecFJulpK2fR0ai8fjim4Pp7ceNfrdgJ/XVG3S7egejd410ySb9UMs36Nmno0be
jV0c/peg+M3KK3u3tTV7U6gcAXrv002lC74D0c5GWTeL/m0d+oxMBkPhvgXt+M+vL02vTb+A0y7H
5KTw3tHftL837/3zGn3/+2r4//T9B5iB4n4n+acetN8n7xxq/MDqZt/MD9DNr8/uGM+27+C+vRbq
m/dWv4+dGA85m/HjJtLym6K7fz11J5vsM3r0TD0U38R0ek+kN7U5s5RJpnBrb4/G70k5Z47eeeI5
DwzRvKATALz9vr2Az+KgacdG/ovcvP3E2ZHfvr8cZP50/WCyOsOrauwHhp20LwjEHBiMRhf2YU2n
09dnRPL91rX40hgi0Ti/nx6+NIpiP726OjA5Hfp/N7Nn7ufZ86fH66I+/STo6PTxjy83HRs6OjI4
DJjEk/5s/OOatB5N9H3T3pQNHLlc37mX5/IcnBpdnZ2JezsHs7DObicl2dnYj0D2dmC7OzQDJYLs
7M8Hns7OzsR8dnYe+CyeVUA/Z2HT2dnj/9lnZ2QcDezs+uzsQyzsPI0pM6YXZ2bzO7Oz5k7DE7Ox
L2dnZ2Jezs7OxL9/QaJezs7OxLgOAgS9nZ2diWouFL2dnZ2Jc38dk6Xs7OzsS9AzbUvZ2cUZz2dn
Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYtBz0MKE9fDicJ7a4IHZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ
2dnZ2dnZ2dnZh/bs7Ozs8p/PA/PZ2dnkZGuhdnZ2ZABp7Ozs7Oz+YYpz0y/Z2SAxX72eXZ2U1dnZ
2dnZ2XudnZ2dl7nZ2dnZe52dgNvLOzs7Ozs7OzsD2bZezs7OirG9gE6wcHk+zs7G9nZ2dnZ2dnZ2
dnZ2dnZ2dnZ2dnZ2dnZ2dk9nZ1MAAf//////////9CoAJXsBAAA6gGfiEf//////////////////
////dnZ2dnZ2dnZ2dnZu2dnZ9fPZ2bqdnZNkuzsa3s7K89nZ7a+zs17Ozs8U3Z2N7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ox69l+V7Nmjs7OOzsZz2dlFlGZIs14eHZwXl2dnZ2dnZ2dn
Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZXbWbs7OzsqPx/9nZ2dkA8ezs7OzA+Xlt7Ozs7GL
Ojs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozst7Lzeezs7LQg6IGOzie8D2dnZ2dnZ
2dnZ2dnZ2dnZ2dnZ2dnZ2dg9kbdg9nZ2dnRD07Ozs7Is0dnZ2dlCrWXb2Mr2DXs7Ozs7Ozs7EdnZ
2dnZ2dnZ2dnZ2dnZ2dnZ2dnZNG3p1yE7GCxrQgkbAGu1ujgWs2p6LejoglhV6X6XF1qxa5dCyIWC
PR02EUlVo8bAgD012hIugW6KAqxlWCGaWj0LoYPT09PRsYyfo6OiFnQsW0rToCttXryIl9ojzXoa
NenpjohYsWMJnOybiWvHRaQrtIrx2ckzpEIBfihSBZIvl5EQ9G6pRonB9PAAtJnQNfLT+6uN/Q3o
6FuoMB6XCy1ZUnhoNnFSpUb8e2LaCvkp0U6OiBq3Ib6k/AjHQRLo6OjoIMDzOwLi8ePjC1+KSEXD
Ojo6OZgePQuLo6OileB1cVpWYl3R0C1e83AAtEDeGRJ0bZpiEIi3oiearB5B47fnezniela0aXRR
tGAFdLJToHhwgFaHjRUNR6OJyAQejoWlXo6Ypqebo6Oha6zoG34Fa4X7POT3/ezs7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7L8rsDt7AdnZ2dnZ2EXPDp+zs7Owezo+
pei7fs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyOzseGXV2/ZVsu/sZNoS9nZ2dl7nZ2dnZe52dnZ2
XudnZ2dl6Z2Vomipcl2dl67Ozs7L3Ozs7Oy9zs7Ozsvc7Oy229di4r802Qx69nZ2dnZ2dnZ2dnZ2
dnZ2dnZ2dnZ2dnZXsLduHs7Ozs6I6GdnZ2dgrNPZ2dnZQq10b+wFewa9nZ2dnZ2dnZ2dnZ2dnZ2d
nZ2dnZ2dnZ2dnZ2dmiNseEhOygsa0IJQxw0gh0SUazc4rejoglhFY9ri62xaVehZArBGIgqyVW04
2BRwHprtCRdAh0UAxlWUDNLQqF0UpY/T0bgcT9HR0QsiFjKitCtt6F1SJfdDTmvQ2jX6Y6IWLVgC
ZN0bOZNBcdFpUX6qLx2TVZ00CAS4oUnLJF+jmB56PipLdOwH3ZAAtJnRSvnp/tfHx0N6OiNfMB6X
5BbFSeGg2yVJlaESaOxg9EtOhnR0LqNbk/gieQRFyqvjo6OioYHmdjAkLx5eULSkpI7yM6Oh+Zrb
ePLoXV6OjoY2QdfFaVnqv6OgWr3n44C0eG8AiTo3TzkIaN6I2T1YPPHluj6+Gc8T0rWga9FA0ZwK
7RLToGQuQCt5401DUeiScgFz0dHQVejpimt5ujo6FixZ0Ut+RW9Aejs+/nKYHs7Ozs7Ozs7Ozs7O
zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oy+Gagauybs7Ozs7OylJZos7Ozs7Kv0e2
zotjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Owuzshw2WxawG3zgLJkvZ2dnZe52dnZ2XudnZ2dl7n
Z2dnZe4HsY29OTBvckZ2dl7nZ2dnZe52dnZ2XudnZ2dl7nZ2RF7nZ0DfCXfOCPjUAZAQn6G/XRWr
r3dZXjpTMB4en3O5dAZdwRJIutj1m9/NgOPMzDKVAZ9cyLPXBhyOVlUASgCM3y4VA2O/ffzwHpgw
eNP71vyHsyOjM5nM5nE4nE4k5fI6zrOt/rK/04WuO7+56Mn4aAeHj5sB46tmA5434PIfnP5HwItn
Dv+p+eUxbtwQPgcRgvLR5SA5+/uSfZ/feT/edvPxv59aUH09sH6cS8YPZ9/YZ9mzft55np8fHLKe
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
jqIc+ukL+Ucf8NLogPFx4soaK2NstDGwpXqskCDEwv2wXEq/30fn+fwQ2jJ4PlKEAx2Y5kZTjUHa
umBsIfIYIEPYNM+RiODBzxHvQ5BH0ftXY975hoS+Yn1kg7nMbrJA38In+4hSQISQIEIqc1XGCBAg
5Ag5AjIspP8hEeP3x9U9kLUJYlhM5nq6ek+3N4hWH6O5nqBzGbNhGEM0QIEJkh3jCaJCniaMQrIn
kgnjBB/cTmNiPEN5z+cg/3ivkD/IJJZSj09Iy/Vo3XonHVcJ6NHZpnohWN0/B5SyQd5mYz3x8+Ij
nRAQyEdcHmuc1ib7fnvPFyGc1GY6wQ/xPFV7rqIhrIbzpE1EO03129cqKIEPkPSQZNAxLwQ875eT
QQxj2+oh3HD1CHPaRDLkCHjZIWUK6qx7bRivGjnERXvvvs0ch+n+Qj7pmIGwkcg5Dcd8OPsYkh9z
Vn/o4G6uYIWXufPlprJDHaJAgQISQIECBAhd8lNQ+YnDkMO9zzywkMRj0Pzs+j9u//3vpSiQfMP6
0Q85+uuvkOv4sHghwFJAhJAgQohJ6qSEVMuQlyEzujp+IR/x0iHolKmCE8SxdSZ6u90n343iFYdA
/jPUU8fs2bH0M0QIEHch3gydiqeJrohWRekhcxgh6j9GxHiFT/sh77xXyHf6TTOl/09Iy/Vvrr0T
Ruq4ygaO+plAgQwRfhMp5IO7vMZ74+fERVEBDIQh7i71zIZicO0ahns/HxDOa/mOsEPkD/ivIIf/
9sIShYNRBK4+v37kVmiBD84kgzaEQNLwQx58vPUEMG9VUlHH1CHPaRDLkCHuskLSNdVZ9tIrBv84
iK94ieDkM/p/kP5m4YgbCfZB/kN12Q4cfYxJD7mo/8cDdIwQaIte6MyyYgdG7RAgQogQIECBAgwZ
sTXoNPqP8geIDlDhZGxsbGxBsbGkehMbGyMjIyMjIxZ1LlqWr5znLc3f7Ok2t2c5y3NjxF9uz/Ym
zj2MY3puRkEMYxjFY9jGIjge62t9Xk9V1XVdV1bVdV1XVtW1XVdV1XVdV1bVdV1bVdV1XVdV1XVd
VD1aY1VtS1jWNY1jWNY1jWNY1jWNY1jWNY1jWNY1jWNY1jWNY1jWNY1jWNX1jWNY1jWNY1jWNY1j
WNY1jWNY1jWNY1jWNY1jWNY1jWNW1i9/Gh6VpWlaVpWlaVpWlaVpWlaVpWlaVpWlaVpWlaVpWlaV
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
GxsTDpGk6TpGp6lr+vtzXcaWNjSssFy7Z7TuXlmvMGiBnkFUAPYYrhuakwW2DTNMDMDdDdYAzFUF
KqgFgtsFq2G6G7gN0N3+gkFVATAwaaRNpmmaZpjJbt68Qdg0wN0N3TdM0xht22BgYO2XrTNMYA3Q
3dKYGDUg6gztEIBuhukGAN0N3T7DBbtsGmaZpmmW2BgthjBmhmhlsFtgtsiqA8M0My2wMFtVBWqg
jDMDOt27dtVA2qgq0zSWBgYGBVBcqgbDTDBYLejafpGnaFoWhaFoWhaFoWhaFoWhaFoWhaFoWhaF
oWhaFoWhaFoWhaDoWjM2gs7NoDOxbjSrIZCqBGx9FFFFFFFFFFFFFFFFFFFFFFFFFFFEhobExMTF
oUaN3pbExMWhaCmYMxiYmJhDB1bQGJiYmLQutC+x6UxMXkjyxaXoGgdWIhiYtB0HQNA0HQdA0DQd
A0HQHdFGZl5d386ghwRsIoE38pQRRsJQcgsgqyVWTojqslVkqslVkqslVkqslVkqslVkqslVkqsl
VkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkvSrJVZOSCrJVZOHVZKr
J7hVkqsnvyrJVZL+VZKrJS+qyVWTcVZKrJTUqslVk+VZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKr
JVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJGqyRqsk2FWSozhVkqsmHVZKrJ6AGQG
no99VkszZlWqyVWSqyVWTtxVkqslVkqsnbirJVZKrJVZO3FWSqyVWSqyduKslVkqslVk7cVZKrJV
ZKrJ24qyVWSqyVWTtxVkqslVkqsnbirJVZKrJVZNm1o1lVkqslVkqsmx5pVZKrJVZKrJTO1NyrJV
ZKrJVZJ7fXSrJVZKrJVZN/USC1WSqyVWSqyduKslVkqslVk7cVZKrJVZKrJ24qyVWSqyVWTtxVkq
slVkqsnbirJVZKrJVZO3FWSqyVWSqyduKslVkqslVk7cVZKrJBVZKye2xtsKslVkqskEo4AKlVk+
J73lwsW7du3bt27dq3bt27du3bt27du3b96eXiHve9Ixcve95TVe9734/df28N43P3ve973ve973
ve973ve973veec48QIRHIe79f4OKnOlVVU8fx7wu/EYoX88+QsYd4rnQM8c/3hGce85HlB4fkcx/
1+kMfz7HPGOXcv0vcfzz+RIULhxz3uMEPuP8ERR1kxCOeYICFniQ/mCJCf8v9csfp3P/1cJ6qKjP
qogb3CcS5CpIdRHCPp8v+fcO5+dZ8bhD7muFerGK4EE4P/3Dl6uWDf//P8oPEv875l5wbDzmE5FU
eMiQch/mfB+X0X3O45EOHuXoIcXFyIDcgOpOKaqJ5QAchB8cn/8g5vik/yCXAhWCBDkRo/vuQ3Ht
0PJGCGRZN7wvD95/v1jmfmhAvT73p5A1lzb6DORH4j4w9xxQ4CIcuaO6pxIG4k11Wbt+/GduRF+/
fv5ztzMX79+/GduRF+/fv5zMzKXcf7+l+ZmUv5j/z/mZnv/4/CSWc5v37+c5zfv372c5zfv37+cn
zfvNFw/Zz3L0VcuV+5cuXLly5cuXLly5cuXLlxO5cuXLlyLly5cuXLly5cuXLly5cuXL1+5eWILc
r7S0tLS0tLS0tTS0tLS0tLS0tLS0tLS05+lyR5///8jFj///U1X///+Pnf96v4pf////////////
///85/////zDmN6iERy5bv2bDip+0oqK58eox4XfiMcRT2dnUwAB///////////0KgAlfwEAAAMZ
TWkR//////////////////////9nPOSOMeeKmBzWf7wjOMOR5QeHo/R81mso4/n2CBsckndDcZzz
x8iQgXAhnvcGx8h9x5giL6GTEIIZghw4HIEPnjgQnPLPXLH6dz/xXCeqiIziORA3uE4nxCplCI4V
m5y/59w7n50fxuH3muOKxRsVwIJwf/uHL1csdf+fP8oPEv885n046x6cwnIqj09WCHiH+fZj8vov
udxzIcPcvRUuLkQlyAhxJ5fMV+eUCOQg+OXv/Ie6+KT5IJcCFYIEKI0f2PuQH7dDPXyB6P17AvDx
7336Nz755sRw8+PYnkDR36I/M5EeCPuuW4xxR/wEQ5kEd1T8ETcSa5k1thYXNtx3YWFhYTGpUM7C
wsLC5lSndhYWFhMbbiKPsIeRwulaODexjrFLqkcYfGEUYMbpiYmIxjGYmJiYTGMZjYmFhMYxmFhZ
LaCKCFtid7Vvk9mzZs2bNmzZs2bNmzZs27NmzZs27Vo1mzZs2bNmzZs2bNmzZs27bCyW2HGkxqCr
IVZCrIVZFpVkKsj/HupVZCrIVZCrIVZCrIdVkYfKrIVZCrIVZCrIVZCrIIORVZCrIVZCrIVZBHcC
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
ozMyqKqoqt+YrG+c5jK/TQXznOXHnLYPjQqKolHKSpTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJ
TJTJTJTJTJTJTJTJTJTJTOi4ik9FyFMlJqtTU1NTU1NTW1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NT
U1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0tVLvVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
VVVVVVVVVdm1s0XeUhVdUttNuqkpkpopar2/qMwYq0bUPNBvUlQNEqNDbvGmbzu7zJLjSpUW8xm1
Q5VVSyk0tDQgllBTn21SIVA5KTj/FECB9AgaGkKKIECAql6D72Etrffn6BBsog22QIAgQKc8KXfo
DGbTqLYoGqqT6lRNl0OdYfkga57qUFEFNpqSqqsbqhKGalJtvtPaDyuzJ6qohfH1KK7ZS4pLanT+
hReeo0XqdPZTaW9J6hsieUUfVVW4ptTpxo0PeotD1OnLbbGyqOtNCKJST81UE90CnKVSNFV4UhUa
m5TNvVV3jTQbWzG2gUDf2UZNuajynUm7ZUFUNj5QbZTKC3/6ZS5SiE9nZ1MAAf//////////9CoA
JYQBAACA34f7Ef//////////////////////FeIO+g7Or6pKW/LQADtNsqltqltneXlKg+GylVN5
iDx6CmUN/asKRKRqzFA/zxQ39WdWVT2+vvhA3Xou0pCnkyHuqyiLaxosMolsaSimxtaGulQKDHEG
yjYUJUPe9aWlpaab1Om89TU22U5LkqT6Lfd59WjbSpttspTYXqVN7Kpammi0Kc2UblnlVUT245tt
zZTlJ96nUbc1VXJRTlMRp0nkSvJc2atqFqvP0qcXqeym2zVZQbTTeptkcp1GUFfFqTEg3utS2aeD
KrkUhRqKoVNtmlsbW3CgH6Ffa/KT34g7ULUgVoNtP51nZyqHylKpo0VVN9w0ZvvRo0FLblRRmrQv
8nspRo1V3a+zkgntdFooqUqt7yXd5PznuptQoqoJidNWjRyYQUNtlDo0WhooqbVqdH50util77zw
bdbFWzBNqKBye875bZSnu2N1WUNt1aU7venOeN1JstTvdx8pzpNqRtVU3xVVTtJvqzftXdQcD/VZ
zpKz5yatLdBRnm+iwZDlLs3bVunfJzoBUpWrKpQULkUnjb2VyQN3coKbUln+KIKvqpppNTQ21E0t
NSybmii2T7UlRN32rxpb+UGyqWloKTqIokNTc3tbWrVLQpVFdpqGoailSUoVQ0VVUTSUQ2tTSUnv
R5SaSgJNG6jRvSotDY0tO6lVtWFN549t3nRFLZVUc2G+2NtqzKB0WOUttei7VJdyQne29W0N91OU
KSo3mpjZfVdpW03kptvq7b7bbU6q2VKcqGdXOzFICe9vz5Kc+KzvlXaLQ0XM3Ue6LBQSmCcqtVua
ai62NlKpGptbJZ2oykleOTbKTTxvbaqKUKJqFtb6c2kN7dSqmqaham+lOlUNQ8VqiqqibaTeUQ0t
pSatKp2ns92iW+9NsaWmlS/feqynNs9qbRyatBTcNTRRo7c3UQcF1Tou+8qW6Gyna7mb7b82aWmo
GpRXiCkq1ZKTQpQotF5tYtBvs0tbTdMXOY+kGjijRd7oEE5835dFoasKFbd+bFITU6LU37Ty6KDs
0ExRYLVdztD6g4gmP4001VaiVqClVdWFKUspNiiCpmvef9rUmzcoGtyoqLU3N3d5t7Y3NTS1y7SV
m/+7dVHZVCUANig6iad6lVKTbZ0qX7t9TfGcfzedUd7TpYURRlVJR91QrVDZm/MQffd5i3IIH30A
373enTbGxBaCwg333373fvPH70H3+7x7vPfdAgCAIG1tp09+9VQIN7p9lm/Xqk0W21VPotdo0Wzo
qAvRa2ioMSi9FQCaLJ0WRoskoUoXRUBOiz9Fn7aLI0VAxoqCvRZOiyNFk6KgA20Wfos9o0Wfos9o
a9FpaKgq0WTosmp9FQWeUKUKUKUK16LI0WRoqA7RaWioMWrRaWiz9Fn6LMKFKFKCKJ0WTosnRZGi
ydFQHlC+UKULtos/RZ9R6LJ0WRoqAXRUC5RFQtGiz9FntG2iz9FnlH6Kgy0WTosHRZGiyChShShS
hdFkaLI0WRosipqgqCotFk6LH0WRosjRUBuiw6gqHRZGiyNFkaLIqMoKoWvRY+ix9Fj6LHKIqQoU
ojRZGiyNFkaLIqEoiiUDosfRY9RUagaKlqWpalqWpalqWpalqWpalqWpalqWpalqWpalqWpalqWp
ala2ioagqGoqgqFr9t5toscoLKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoKcKR
KWKWKWKWKSqqiiqkpYpYpYpKr6rVQFLFLFLFKYU7VpSxSxSxS2iyqFXaLhKVqopYpbreKtq5RtbK
tqmrqubW1sbW1tbW1tbW5tbFWtrqBrqBrqCoGuoGtr60tLS0hqaWpqY2WTQrUNQqP1DUNQ1DUNQ1
DUNQ1DUNQ1DUNQ1DUNQ1DUNQ1DUNQ1DUNQ1DUNQ1DUNQ1DUNQ0LqGoanlUNQtLDUNQyaahqGpmio
aha5VDUJQFQ1DUM2ioah3pVDUNQ1DUNQ1DUNQ1DUNQ1DUNQ1DUNQ1DUNQ1DUNQ1DUNQ1DUNQ1DUN
Q1DUNQ1C13bW1cxrarWa2t5rUFRTbFKpk2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Nj
Y2NjY+/S62NjY2djSbmxsbGzenTbWxsbGzv9k2NjY2NrfNsbGxsbGxsbGxsbGxsbGxsbGxsbGxsb
GxsbGxsbGxsbGxsbGxsbGxs9sp02z7bGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsE7ziD6dqZ65aln
OMn83Vpc/nJPQiw9pd3y5bbwGYOd7kpX/2MlzuXx3mC8z0f/na0Rcs7YVrI66fcBUO9gwjg2mrOP
Nubgbgbueh2eE1Llzv8HJj9pS+ggUG18y3eMdviSAT/agwX3g33nyd9tz7zOclQQKYg/oR92v+8m
FVJU4clved45t2lt/eqfJzfrql05ySY5GMvdy577ZtFZdBQj2SCkry+ODHOc6wqu+vPn8/g32/cP
57zr/Zwpbdyur2D1qZ8XuTsDl5RltRmHlpQmopcZM/K2yCe/yT15bIr3+S/JCSimKKKKZmKKKKYo
oopmcvktlpUBmXtttmZiim22ZmKKKKZmYopKh2hJn1CCv44N5zmmaWtra2tra2tra2tra2tra2tr
a2tra2tr25nM9ttrzPLvZKTJ/Nx/MlyXwiw9+e+XLbdy88cn3vZSvPsZLnb47kudF530eex52ERc
pZ27pMKOun3AVDvYMI4FJ0pvSU4qBuAq57NtN4b0ObT5P5XyYzbZBL6KBQbXzLQS4x8fEkA3xSgt
eSG+85Tudu/ed5yVBB1TEEOgZPu1/2W9jtJTZshnNt7zsnNp0tv7NT5Ob9doXTnJJ1yMdvdydzVU
zast6ChH57fSpS5x1mxzkpsNIZHeSCfPkFVPmrf9jbzr/Zwpbd7XVn7z90Mcee5O7AyV40bbNE98
Dy0odmopf7chxhUQb7o9k7LJRFxXJCW3MVbGzjY2NjZznGxsbGzjY2NjZzk+znuqFd24ZKXWxsbJ
SlJsbGynKUpNjY2NkpSk2Nm9OUpNm64QVooZ5tzm22zCUGUXRo0aPaNFQIFVaVKlSpUlco9o0czM
o0fzPo0czMaNuZ2VHM8XdxztKd3d5ne/93Y5Q3QPVQ2UqVKlSpUqVKlSpUqVKlSpUqVKlSpUqVKl
VFWFJ0m6ZSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRS
RSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSRSBSVUZe222222222222222222222222
222222222222222222222220m4pDvZNF42tm+887oLEUrnk55VEoJsqig0c2bKe/Kj335bQ0N6Df
ku70CgZtzapQoNE2ylRf6pOdHm/buUt95znttPeW2+8znOeyGeIZZvvvtKc9pbq793V2l3vNvyej
JVLykrSatpNPXZfbzZVF853aTT6jVTa6A3V5bQKG2226HbnRklFNpzn1TbFNtlNtu93+W20pbSl2
fdlFNs2UU272faDRyhtK+c3V8+7yHW+hvvVst923rYrOjJXt7yl+TqqbZT3o1bs1tjZSbu7trRze
qt21qa6e/cn3jQ3NpSH8nvvvPffeo9sKWqrsmrvZz7naLS2qz5vvPffdsbb43VZVlUKXSn2c+9aE
MW9swoRTfdQoApBXffY7ailObXVrYp2mpQmg29tujUSDlBsbLuUpd7tsop2cttrQT2lyU4Idtpdn
sptJo72UpbT7RlKUPCHbac5bTvlVuyl3fbNpS/eQQ7ThyWynZ7SlUavVFNr2pFIKKbK9uUqDZ3ff
lWNzZtKe9Cavd7kjlTpdKQzbfCgKgbVahxuV3qPOdbbq9sUU6au6lSt1CkU2pttJtp0Z0mnZsV5v
kpbKNuNlK2ulNqbW/ZTaSrfe6vL61VdkpcUzRcJQOxQO2+i4VNu5U50ZSltsopse0pNk2i221KW1
tDRRqRTakpJs+2tBVY5QltQ/aW9NSgUhQoUJUCieUebcpUqGzZRoVJsFGlynyStBsoFCVE0qUNqW
1EpBXlXco0WnnLlSV22pbc2k0S2ndHiBB/GiVR0b+m0ZU0qIbClykG5ooe0FLe203KLS00+0lVFN
tqTcgtobaXfoqTbJzqm5qNG8wGme06NzpPS33UoKKqhWbfT7t6qm2dnSbrFHZsU333pz6pQofQuo
1aXqz+1M6opNVXRYMlc42CWjGxqufG2lts05SV3a5SpNqg9BVKC8b6SskFHFdlKZSFCjQptiuNDX
R5S5QpttCUqaqqrXRhSVaqdCgKe7ZRo7UikKF0qtUzbOqStWUlaeyim+9MpMpFp7aDb5m0UiqMez
bbUUlVE+782m0zoza1Np3T3VoUlaFBTm8W+nk1cn2jtxRupWgbd1aG1GlvPqn1HSVu5Uvn/ez332
2oy0WDSbZCXadqNTRQoypZRUUaN6UtqDXd2gb8tAJK0nVKDRtRbadBTu3VWvYoBolyppKtikqOyq
tHLalKkoU6G1Bs3otO1FS+SxS7U7kqgqRRRApvvQoZIpNsaeNJSM9uT9Woec3m2zoUajaMpUtr6q
G3dVUE4rsqq2q0tmopEpdupyUzffvObzbVJNtt/Z9o0d2xs3Uo972ll7Uqedm30ik26rHJ1fvNtb
1KuqkpOoKGK026M1PsSbOKIN+t7ZObcUDRqrRcLdOi2UuznPZXvbE995S3333lLec57777ylvvv4
2n2c+5JDvvvLbfec9577ylPfffaW+6m9KW29j2ipZUKnUqQoIoIourKiKEKEKEqWpdFg1LUvaiU4
UIUIUI0dqWpdqlqVSRQNlCFCKFGUqlqWpalkUIUI1lAFFyKGqWpSgqlqVo2KEKEKEKEKCoU6lqXt
S1LRKEKEqJoqialS1Kp2palayiihCiSgyhKlqWpalKDKEKDKDKDKGKGKFKEKDKDKDqcoEoYoYoMo
QoQoMooogoYocoMoMoMoMoUompalKDKDKDKDKLKFKKKAKDKDqKpqjqZra2tra2tra2tra2tra2tr
a2tra2tra2tra2uoKgqJqqBramtrowqOygtFgqPNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0N
DU1NDQ0NDRUFUVA0NDQ0VAUT9StDQ0UKiKEqZoaGho52omloqBoaCh6laqMgVN+oVJSKmlTSppU0
qaVNKmlTSppU0qaVNaFCkykquq2ratq2ratq2rqu3KSKSKSKRQsxSJSRSBSKrdTqyrCkasqyrKsq
yrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrO5VlWZdWVZvVlWS3qyrG3tWV
Z1yrKspIKsqxqVqyrKCSrKs+rKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrK
squrKrqmxVNU5dU1T9VVTVUFWwp+W5StW77777777777777777777777777777777777770u7777
5zbfffdCAN999xmDffffgG+++++++++++++++++++++++++++++++++++5O+++6XNYtvvvus5y/2
222222222222222222222220uQ32j+Trw/8QRpvc5S5t/9h/WTdV1F3Z8RRT7xdEMzJ3cxWWYIMj
IO2Ozu5gMCyIcEwjlRv2UIOQ4Liq/zZzJjjDy4PagXbDG64/3MRDiKFLOOXYYbuKO53ne5zNpb8z
5oMzKyDmK7S/NubIP++8pYN7E8yY5s/8OWNlmTf5T2dnUwAB///////////0KgAlhQEAAPrXIvYR
///////////////////////Jk2f+8pclLMn+1zEszMwMDA/+Pd27YZO9Dr0nH/HHOv5zJi8+/5vL
/YRxgza/Q/lubiWOcUzNszr/EH4pO5sM7kg5/5LbMlfPRywKZzGYPeFeKffWal4ll/C++hzucnGU
o5nfG26JlemgdYQIVrii+w8O9vve9u773vb73vbuc553eFz79MXf97l3d5ne3d3Pve3d33u/bu77
3bYbbbbbbbbbbbbbbbbbOLWkcltttttttttttttttttKW17bZ+9KlSpUqVKlSpUqVKlSpUqVKlSp
UrE4bXd3H8y7u68Lu7z8x623lxlJTPxz5smY6imo+I4ih3i8bzMndzthWYIMgHbvs7ud2wLIhwTH
8k0c9lEkEoSQXGkOKO5McYeW494u2GN17z3MRDiJmpZxy7DDdvfyd5PO8zaW/M/dB3MrIJZSUlmb
c2QZ995Kllq2J9zcS2/ISu9mBk3ycobPs3MpSlLM3xS5yxFmZlsA/HuqdsMk5hA9J1Bg451/OZMX
mc/m8v9hFsHdr9D/b+O4zbrnKGYp3vZIPxSfLmtO9kHPzNtszbneCXXaGcxmD2RCslP6zU8uWXkO
dxD3uSnHaX52fw9RVEyvTQOgQrXFFH7z3PlLJ5kpSlOc8lKUsnmSlKU55m0r2zOSUe7m3LaMz5zH
OcnOc+c5yc5zlznJznPklJd73sufvvvvvvvvvvvvvvvvvvuyW9PffffffffffffffffffelvSpS9
vKmFTCphUygVMKmXcvBFkWRZFkWReHgsqZowqYVMAtg8toxlxAK9IqYflTOGQZBkH2E12QgyDIMg
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
urquqKqcVWarJqqcVUwM6rtV2qmFTVtW9KGpoHzc1BVaq6rrjqs1U45nVlWVU4qplVTOqmdVM6qZ
VUyqplVTKqmdVM6qZ1Uz61U+Pqqm1VOsqpvlVKtR2qtKKqxV9AbXP3oKr9BVTmgq+q8fnPfSr6qa
VUxqvVWaC6r2ulVMKqUKqaVU+qppVTjKqcb6TFVrdVO6tqv1U1qpSqpBqpXqpGqpQqpCqp9VTOqn
HSqmm6qcLpVa12yraqcVU47X2qpvVSxVTGqmtX1UzqpnVTOqmdVMqqZVUyqplVTOM1VM6qaVU0qt
VWz1UwqDVZVt7qplVTGpjPVTmqmlVmq7ORRNVfQUFVuqmFVrm5ufnq2qzVZq01Cbtzc1TVt1dV1R
HHUnoKr9THHQUBjc/PUZVTOqmVVMqjFVlWVXKrlW1bV1Sczqw3NzRx0FBmVXavoKqf1U3qpgqrEc
dWVZVcquVbVq70EVVKXOapq7m5syqzHVSDVlBVTOqmdVM6qZ1UyqplVTKqmVVM6qaVUzqppVSCqq
d1dQd6CrNVW6v7VU0qpSuqxQVZVsce6v5uxqrExqheVf0qpxMdtVW6qd1X6ts1VKNVNaqQaqV6qR
qqf1U4qpllB1oaqcVUzqppVTjp2mKrF82WaqmtV/Kqd1Ug1Ur1Ui1Ug1UpGfWqmlVPqqf1U0V7Tu
q/VuqrdVO6qQKqV6qUqqamygqpxVTKqkaqlCqmlVOelVOKqZ9aGg5s7TFVvVVO8uqw7iZoqsqpnV
TOqmdVM6qZVUyqplVTKqmcdVM6qZ1UyMaq7VTuqmBzVHUxj1XqsjqppVTmOq5VYiqpk46rVVN+eg
qphVTOravNVYiuqlCqmtVyq5VfdWmNVTDDUG+lVKNVi7q7KqVKqebjoD1WOapqKqdczqevbp0qph
HVp4uerKqa1X+lBVSA46rFRlXVdVTK6qd1Up1Uo5zxxVdVdqKrXM99H1qpnVTOqmdVM6qZVUyqpl
VTKqmVBVdqppVTSqmdTVTuq2btbq26ujqOc1W6qp5VYoKqc88XOqscVR2q9nqee+lWVUxqu89VKm
qqU6uw9A6g3Ojc9T2w2usdVmqmVAnVdoMNVbNVY5qrBqsq6qnl5VYqs4ojZVeqpn15qqYVUgVZQL
FeVbuOqn3Me8qasdArqaqfc9T2oIsqanndWJVUxdVPKlUF3Earr5u91UzqpnVTOqmdVMqqZVUyqp
lVTOqndTVTOqmdVM6vqp3VTOLpHVTSOq3VT66re6uqp1VYoLqvdKrdVParNV2q10qunnKr56rlVK
dVKdTz1U8qvVU4qp/Vcuq5dV01Xnwx/Lq9Rnquaiqpqaqm1VPKqY89VOqrp6qb1W6GrKrNRVSCao
qpBqs1FAlVTOqmdVM6qZ1UyqplVTKqmVVM6qc1X6qZ1UzqppVTuq7VtVo7urKqYnq2q7VfMaraqe
c+VFVw/PlRV9W1ezc1RV7vrV1Tbqu1Xqqd1U8qp7z1UqVUp1XXVx6A9TQVJjR89SY3Xu871NBV2U
FViq3UVUyqv1UzoKr9XVU8qsVZlVmI2VbFzVW8VVmqmFVN6DmSqpnVTOqmdVM6qZVUyqplVTKqml
TVTuqmlVM6qZ1U7q6qmccdVNDdulVPqrdVuqnV1WKr+qqfVUwoO1V2qzVaqunqpxVcPHqqlOqlSp
qp7VShU1XD3VczthqrtXG8u/KDFV0Z4qqa1U1NeVUxqp5z1U6qpvVbqyoqs4qsqpBqKqQaAyVVM6
qZ1UzqpnVTKqmVVMqqZVUzq+qnNVM6qZ1Uzuq/UVPRnqphF03V1V2rTUHaq+apq2r6vqKC+lX1ab
tjqXdV2g7VX6qcVU8qvVU+q09VPKrEZ6Crj4apjq/DXVveq5o11XTVbQVFViqmRqrp6qZ1X6qcc1
XUFWdM5oqrNQaqmtVMvbxNT1VyqnJ6qaVU0q8xkqrFXVU7q09Wm5+luqmHMaqmFVM6qZ1UzqpnVT
KqmVVMqqZVUxqtKqmdVM6qaHqpzVSjHVTQ11dfNU1Upcz5tOrqrDyrOk7VfjquHjquc9VuqnPQxj
VW6qcVU4u6qYKq4qtqpnVTGqm9VNKiqndVp0Jz1UzqpnVTOqmdVMqqZVUyqplVTSqmlVM6qZ32jq
v1ZVe56sqtVNXGNVlWGyKqxQUBjmqYrqb5+c/Sr6udV26A/Pz1bVuVUwquVbFV3PUVFV2q7VtWd3
VT6qmdX5Qxx0FAY0fPdW1X6qaVUomqyrKrlVyratq6peVUg1U9qpnVTih71ZVtTU0FAYy5qr9VNM
urququVdVTGqw6v3VSjVTCqmdVMqqZVUxqplVTKqmVVMj3FV9XmiT2eq7VSuerquqaqVEepXfE6r
EVxuq7FZ6qQqqf1ZHU1UxqpFMeqkGqnXPVYq6qmdVyofQ67NZvtaoH2TzIjV6qZVUyqpkaqmVVMq
qZVUyiqpvjvvVT49Ac9VxdD0FXUXPmHqtGWVZV9TVStVStUJZnTmqDUUWJmjqplVTKqmVVMqqVqq
VqqVaqVaqZVUyqplVTKqlaqlaqlaqlaqmVVMqqZVUyqpWqpVqpWqpVqplVTKqmVVMqqVqqVqqVaq
VaqZVUyqtVX6rHaM8dBQHPeR5QUA2ajo93VSjVSlVSlVeqp1dRVvbOyfWYpL13maDNZBGruq++eI
+VNTFVYq0p2quOpqann3QNupvmqph377NF0qKqc89RVlVmqnNV23HZ7w9BzVYadVVmrKrlVOKqZ1
WqrMdTVtX1bVaqv1X6qeVUzqtVfVfq3m5qvqYneWePnqtVNTU1J3zNvm58qtVU7jqv1Y6rWVKjPn
OarLioKQ9TVTmqmdVMqsqXZ6tqyrqqeVU9qpnVlV6qnGGmudVW6r+W7PHHVYqsxVWKqY1UyqpnVT
2qndWVUzqv1XpircjPUVNTU1J6Cg56r9V2gNhjxnqtZV2c1WVNVyoqt30nqrNBl89BffmjNnPnPV
tX89Vu1U0HNz80WVdU81TmRnq6I1q2zVXIuizt3iqpxU6y6mpqamq7QKq/Vfqv9lzcyS5uY1Vqq5
VdqtVWarVV2q7VTGqmN3dVMaqY3VlTU1FRUVNTMaqampXlTU0F1NTUtmqKioqampqar1BQVXarp7
oMvuqCoqDVWqrtV2q1VlX1dVaqphV7uq1VavmqanmiNQn3kdTiqY2c/PV2XFmRc185lURc3Yxqmp
qanmjqs1XWzxGpO3a6E8dV6qnh6rEVTU3ccdBVbiqut5lViqxz89RVTKrD3lVO6uqyqmVV6q8Y0e
7jqplz1NTU1MLy+2zdPFzc56rt4rV1NTz8/Pz88dTz5QOpj6dr5xm6ruXEfKuq6KqzVY+dqrt1bV
tW32oMzKk9RVTGg7zcUXSoqp1z1FW1WaqdVXruM5z4eg5qsNOqq1VtV2qnVVNKrdVqOrqtquVbVb
qpxVTiqn1VNKrdX1U4q3mqKrlTEz5ccfPVbq2ratq3TqMzOapyq1VT3nqpxVt1W8qVHHlSarbioP
D1NVOqqaVUzqypdnq2rKvqp5VT6qmlWVX6qcYaa56CqmFVOMtnPHHVZqs81VmqmdVM6qaVU+qp7V
lVNKqcVX5iraDnPUVbVtW1bqgoLquVfQUBjGPGeq3lX5zVZU1XKiq3fShqs0GXz0F9+aOgNnPlTV
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
32fMeKpoKkx5irXz4fIqnDHmObOZ9Xe+bnvHcR+fpV9Vy0fpzRR2fbP1t3KbplGoutx4sw56jXSc
uIyu6A+zxHZrinKCgxUF9VurMyhjiMo44ufodLuzVF9jzTqVdqrTZMo3PQXz5UYeYPUHq7dSdc9Q
brOOpq/mR+c16yhy4ooz2d9TZE7zsd7jxdIqDmupoIjLpvseYdXRVWqCOLvlTcRo6DpHvmd0HPV1
6u1229ZqjnHLR9qF2vKFx73qJmOTeHug7Vet5QRdIo3QHjfXvvmurD0Gc1qr4qCO6hHPEbmqD1FV
ypoKscZqDpzVWXzdFZozo3PzurOlzi+4t0Jo46C+5jn60HNhqu5+27quVfmVZUGzKCpqGeg5sNU1
NBdV3rhqrkXbnNPVebfd1EfNV1BU7Md1a+cx8iqciPMc2c0boHe6jnvLuI9T0q+q7eH6VEUZz7s6
dym6KP1Rdb58xYdR1HTpq+Y2XdAfcfNGzXFOUFBlBfVbq3MoY4olHHFz9Y137s1RfY806u2e1VYN
k2jGqVfPmVZh5o9WWert1J856gz06mq5zI9Sa9ZQ5cUUZznoDZFd4z32jMukVBzXV1BEZdFvtHMX
V8VVuKg5+bvlTcRueg6x7qGeg56uMs2a1aXff49rVH0UlHF35jqfoFkUxd5GdG7dJhtXFZzHW5zm
6ndx1bUn56Cr6hrO5x1fPVdoOc2VBuaOq0dHO7iugqpxUcx6uq6Jqqxh+aqyY7qu9O0Z6A1VOKqY
89VOaqY1GXUVXarioKqcVXqtWVUyqu1NW1bVTE8fP2V8zeZFVTiq5VcqKrNVOEqrlVMaqYKOrasq
6h57P2qsVWLqyq3zc9W1Xaiq5VfquRc1SnHnNFUHNEegoKsq1JHtLmaioKnvVnNV1XVZQZZqCOq/
z0FVMKqZnoKmqnNTQRVU05ubm5qiqntVyrXQVXerqygoKCgq+qmFVMqmOq9HU1U5ioKiqmlRQHqp
7VcuLKqcRUFVxmqtGvIqmrDo543VYquVXDmqpnV1Vk1V2qyagoKvM3VvPz89VmzVZdnqy6tiq3mP
zW6rmRR1WI8q3Yqsxc1VOqDdV2q8lVaqtVZUVNVqcq49W1WqvjjtmiSqKCr6rNV2rqvqu1Xu65kY
/NdX3o9Vmoju4osoFZzR4lV1XHOc9Wx1UwjiqeeKgquc3Obm5qCgXMqrHN1685ueMVb2uq3U1U5i
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
h+fm5sNzc1Xc5ukVWxxn5+fmNboLzKDmii5+fmMarYry76XfbofO3PQHqphVT6LfPzRVUwMZZQRX
dW3eZQH5+erFfYybiqObmq6pP17mN1Pz895FVnMfn57zm5sPV3PZuaoN0u+/XIoj1L5+ezGOerop
rV0BrMqrLygiy6mgjqcdXc1AegNHz85+bqjnx5lBV1BUVUzqs1XarXOagj5z5VYq4+DLoKBKrqqZ
VX90HNEbNHPuOOznu+/U0XWgoKrdRdXdUY2ZqqynV3PuI5zxx0HNz7yKM1ReVWIz1bzd4qqdPnqp
h2iiqu2bIs79LN3vniy+er+fmqznvObnvObmNfPzG77qV073HV9WRWo7w/NzxVbzc9Xc3Mfnqu1f
z3HE7UfPl81WVfz5zc95zc0hr5+bO9Sbp3Vxx1MdVMTVXI6hTUVvo6ufXMqs1bUXz0GUGc8dXe0E
fNQR1WN0C71XKuqFVTpxbyqwdZQVcap5zde6NQVU4qtVFV6qkS4+e6rHMczqvYepVSdc3MagznjV
WK4+kfPUny6i6Axo6sqpzznzm5sqpQqs0DoO/NccRquqs895zDmMr5+dVJ6jIs70FBUVfV9V+r7M
fnqI6rdXVU4qsxqKrKrJjc1S8NVdw11Uo0FXGP2qyovnqphVdPVfq7pVcqtbizmqcdVMaqY1W7oF
3oOlRuqz3qu89W9zX2PF3ypygj5uY2RmqsqK3lBV1VyKaVXVWMqpnzRG56qeVXKrpnVeqptdVs26
rtW1Uwj6njXNQUFBF8ieRPnZ769qjplVi8PU1bHzVFVIFTz1Wpirqrt81XUGc0XU8tWOq7Vl895z
xmiqKsqvnZ6iq8UxtUEd0FB25zVU4qKDD4bt2j5mbnq895zVNWo9BQUHPQGqKuuzVFX1Zz1XKqeV
F1XI6mrMqs5U1Y6rpqsdTFQVNVmrjVZQHqKqYVXqvq41WVNXVW1s1TVaoKDu+/XVB3qKrMVT3jyK
M0dA4qnOZ1czVbGaJXzioHOft0qM7n56rGZVtxx1FVMarUdVuLmq6YqvVczH65EfdWUdV6rLaNUc
186qKr9Qd1XnQZ3oKBR96DtVTigqN32Phu3bs+eLtlVlUFX3nMnUnqsVbzmqaCgvqepqDXQHq+qx
VSrVcdRfNzxqrYqCrKm1EfnoIqrLq+pq7vVTyr6si5+c9RV1SndVMOeq08fW6COp7xR9+c2ZHVeo
InzHfMe6rtVs1Vnm56BUFxZHVlTzVJ6rPNFV7oMNaw1RV1A6uNVcyrarktV28fNVdqscxo2LSjiq
OePmiqAaro+hjXlAe+mGOa6g0eZz88VVIdVMKDfNVfvqegtVZVbqsVNXLVQqvvmuqmPPlW1EZ6vO
d0DoDVXDHoMiiq6reY5o+5zd+fn5+fmq2q5U3vrl317pR2bmq3m56uMbN6OerYueq5Unzm5+c5+/
VJ9d5zVbV/PzRc9RQKrKnOfmjq7mPzvnqpByqnNVKFXVXLoDHq6O0Y/aqntV01WnqpyeqnVVNLq+
ru/NVlXVU+ijXSqmcVRUY7Pl9KDIsoOnWI9BdmtTHNUqrauqKszmvOerdG6VUx5+3M46qZ3zYqAx
zR0FAqCOrKt54j2oqQ1WVefvV0fMdeP4OlX1BsquR50pMpDSy3l2soO8zGZdOaONKeXcyuLec95v
LnH36UU3vp20u3Sq6eKJnz5FeO+9FRqjztR507UV0fOZXdGuiy99PIo4j91M2YzSXPHfxRHvLqcv
mi7UEzfXPKTbNM499+zV96DsaKg74baw+pOZ9tUmN6P07HmYzPLt82zc9rIzHuoupUl5rW5M91fd
dqO8kjijoIj9ryKq4oo+3mN9Y8inNZzx5UbpJFMxX7c0dJ8/TNrO8aOZKjWHPkzuR0nZ0caoG9Jb
zXSSSjoLugoLf03toz7vnMunNHHinl3NlxPMjPj7Zc5rv0otbT7Ui79arx+bvzM+UcWO+9FLRqjz
tR5rtRX5UxI90a6LL3085o4j91JZomlnPHe1FHeXU5dRF2oJm+ua+bZpvNrtRbvvQd4oqDuY21h9
dpOa+3Skx6R+vY8zGaiy7fNs8XOdZGa7qLqVJa103IberoMerx8/Nz0ER+15FVcUUffwzeUEeRTm
sqefKjtSTKmeY/t7jSk51ii7KPKCNRmS2sjOaZ35I6Ts9Rqguj0s3nbp2T3RxUBsoKDKCq1VSRVS
BmZlWZmVU0uPnq+M7Oe6m7j3qoyK6rvOedvSIVfVT2qlGqnSqplVbqpAqpAqpAqpAqpAqpAqpAqp
AqpAqpAqpAqpAqpAqpAqpAqpAqpAqpAqpAqpAqpAqpAqpAqpAqpAqpAqpAqpAjqphVSXVSBVSFdV
IFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVI
FVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIFVIF
VIFVIFVIFVIFVIFVN6qQKqZOYqpRqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpV
qpVqpWqpWqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVq
pVqpVqpVqpVqpVqpVMepq6rqrlV6rp6pu7faq/dTU1UoVFVKMxUZVTqq7Vl1XarT0erI12qKsNz1
ZHGao56r9VM6qVKvi5pqq9VZqvHqasq6JGPGaoqamoq6pqamI8VRV1TUVdU3V1WVJzH5+apqauqK
mpqKipqaipqampqyp56jKmrjR28qpo8qppzxVWsjZ1cTq82VWarEVRVTSpjqtVUj1E44zRZk5cRj
Z5KbDHcRjHMkY2znMaJXe8zyczNWdRGNZ8NRmozmiMfnuI2GWneVCvdVI1VKhozVXbjiqtXHVSSj
xZHHs+VeeI6zm5zVcaramoqsXVeqs1War1VqKes56irKnmqw884qrPPVaqvGPFFGeKKOqxE7uKoP
EnEeoqNTGRxGjiquRVWarlVyp5qmKKNqrcXPVZqpDqw5oo4qrdXHNVgqaqYnjvmPlSc+VflVmOq7
VTmYPVcibw+H8PR+nMapqak/eK+137edLPU1JjHj58PU88Ro6OeO5y13OfnqTRX7MHqp1iquqpqT
YfvRnPu+8VSdnzpftnsxqmpquLyjOfc6eqzVbq6rznqXsc5qvPGqr1XVU9PlXVMR47PV15V9TFVf
qKmqm9VMaqe1XaqYXl1Uznsiqaqe5VeqsvKrlV+qxVTSrqsPZjZhj1WXVeqt1FV+OKhvMMaqzOVX
KmKqmFXzFVMMRjZdVmLnqYoj3VbffMw1nqpvUVU3qw6MYzqpAq3MzDGMYxsqphVcq51WXUVceqxV
Zqs1FXVdUHuqmkR6rsfPz81W81TVcnD3UVaePKrlVyqxVlViqxHV7PUVEd5V9VyoqKiq7VbZ6rcd
W1fEar6tquc9RHVlTVtVMarMadWVZdWVPOuaKoqarjq66r0dRHVb5qrR6vdVmq7ORc1V66rEeVU3
qu1XZyq7G8qt1XKr9V2qmXNzVXKvq6rqiq0rjqu1bV9V64osq1WaoO1HzVdQ4c0e8PGY1V6py6uP
VfoLObKnLqyrEaoNUmjNlTdBFVeMqqcGqpzOZdmMaM2c2VfVd5qqZ+HXPV7quHqtVFXVZVaPU1NT
VTOrKuqKqZ1J8s/Pl5VcqaiZquTlRU1XKtyq7VZqsVfV9VyPmqu1e6iOq5UZV/NUVXKvVV6q1VTC
q3Vbqu1bVcq2r+fmznqypNVlnjqzZ1VkfPVlWVNW1Zz1J4o+eq46r/PHbq6r7iZ3VuHOpp80Z8PV
dPZozx1XquPGfKvjuz1NqM7PVlWI1THEeOrldV6qnFVOcZpyz4a6uuKr6qaZ4cVXec9XVfVaqu1X
asqTxGqKuqairqrlVNIjnquYdR7ypquTd1FViq9U1WarlVwxqr9BHVcquVNVP+arL5qvquGyoNVe
VVMKI9Vqpqp3VtXmoKrlTFVdqarNWGsys0Z91U4qp5VtWbqyp5zGqu81Rz1fHVeqbq7mjPVcq8zj
PV1VOKtqsVU2qsnqvKpqwxqrFVyWqndTlQjHPHVkZrqTc9Vqos+RVXautxRVWj3VYVWXHHzVWKrF
Vo8d4ZO6tqzDc1ViqkCo1VlVjKrVViraqUat+VXaHVVjmuq1VdurD1G6GOr6rEVWHixR1FVM6qc1
W+azmqsVXarNzVWVdUH1NJYapqKsqajmPbMeI5oj1FRdn6mqI4kzH5jdz3dRUVNWVFSY5nZ6ioqa
jvz89BUVOG6s1VlZzYaKKqnNVMqrVW1bVtVmqzVTCoqDmqpHqplVtW1bVp6ioVRUZOVWKqZVbVtV
6rqrNVmqzVZmKtq2q3VYqpyqrFRUVbVZqsqratq2ranKvqs1WaioVW1bVaqphzc2VFRh6ioq6rai
ratqs1WarNVmratq2ras5uaoq2ratq3Iuaoq2ratq2o5qtq2ratNlVmqxVtW1bVsVW1bVtWRVZFV
tW1bVtW1bVtW1bVtW1bVtW1bVtW1bVtW1bVtW1bVtW1bVvNFUVFRUVEVR2RqtOc5znOc5znOc5zn
Oc5znOc5z3PUNWzM5QqLcUaza7mj5ooquoYoooooooojGNHbdVN6qbVUxqpjVTCqmFVuqmFVMaqY
VUxqphcdVNKqaVU1qppFFVRPZ2dTAAH///////////QqACWMAQAAJy/8ABH/////////////////
/////9Kqa1U0qpqqs56rVVqqlaOq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqr
VVqq1VaqtVWqrVVqq1VaqtVWqrVVq3VaqtVX+eq1VaPVaqtUE9VaqtKOq1Va56rVVrnqvVWqrVV6
Kq1Va5uaq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1V
aqtVWqrVVqq1VZqY6rNVmSqzVZqs1WarMXtVuqmGXVtVJXNd3d3d3d3d3d3d3d3d3d3d3d37l3dq
7u/bu7SrXd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3urFG9x845hIjmzm510zbijyq5VZij0o+ixL
dHhzUmbj00agNdo0x1zVHMTE5ugoPMRpHNG8olMTWWaK4t+0LVzji04jH54lRHmzn6Xvmi58zItX
QtvnMbnnDM88e777y0maOKOh12PFcxQUBj9ubXPzHjijs0U6n00bbnDzk0d52qehj4ouc2HzN32f
q3d4bUa5/O3h9ecxj0rwyudyZN0TzXSotXFzHmN7mkfObtJS1CmD5mZmZmZmZn2YjzMzMzMiXNzc
3Nzc3Nzc3Nzc3Nzc3Nzc1RVlWc1WVZzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc1WVWKsqxe1XXe45iNc1z
P1uKMyqOddTbVRz9squ1WubneRmxYtvI4qTNxto1Aa7UU11zVHpezlBQeYjSOaN5RLyayzRXzP1u
bucfN0cRo+eJUUc2c/W+1RFz5mRKLLPQ3UmNzzkVnnj3dB2y1jNHFHrtHFcxQUBo+/Mtc/NHqOKM
5op3LWjR7dzkbnEf3O1XIx8nIqk2HzNvtE9rdnwz1GqmY7eH1zGiw/t5FlqPJkzTNp1YfLi5o5rc
7uaR85u3lWKYNd3d3d3d3d5oYt1F3d3d3d2eMVcer6vq+r6vq+r6vq+r6vq+r6vq+r6vq+q7Vdqu
1fVfqu1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9Vyq9VcquVXxnENB6uTj5KqCS4a69OjryOjUx
cHyMeO4+JQYuNVTGqndVPqqZYhz1V5qpqpkMPVQBwoOKqsVVXuRx9b7GoKrKj69evVdT1bV5rq19
lVZqtVPuc7NVcizKDmq3KrEXaKhugosPQx81x2dZVtVyqxeCS4jmeVWavqasq6q7QHV0HU5qirqs
NzVWartVjmqeaOq5VZqu86Z6uqyrjxUFAaM1BVZqypqKiq7U3V/NHUQa7UCquZqhups/Mjs8XdVU
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
OarLvUDI/bKsR6A13lxx3QKo5qCKoqsVO1zUDoLiPGqC46CgoHjjqu1bFV1W1dVcqt1FBlNzUFXH
vKtNQ0eZHh5rmP0qOZ0DjmKB0FAqmg7RRm5ryrKuqv5VaquKlqW+d0FA1QVOWo6rNXR1eaqwaour
air6rp6DvFFQHNzGOaKrKrFRQVXOY9XHoMfVzmZQVMdWVfV1RUVYaKOrsy6nnqvXHQH0apqT1FAe
gRubrkV0GnR9M+m+UBroI46vq6qndVOairIqrnMqDOao54zVNXRx2Zt0EccSNH3qcqs1W6vqux4q
CM1AbLNVaqKqd1NVnnWR0B6A+VZFlRFzXQXm7Nl9u3tVl8x6riqOY3MeKpjPHV6qHV8Z6lqQ3PVc
j5807qY4quqsxWeqnFVx9zRUBqmr6iKrar1VO8qskH0gsbS5zc+UtcHVRHIRy9dmgb3eKtXte+SV
UwqppVT2qnUSM9c8t1fVY5nipOeq5Gmbnu+fKuoarlVjn5ueZqs1NWVdUVdl89RHZqrEdV2N80UU
dWVaeq5VlJQUN65qk9Vmq7z89WVNCeoqpxnlVuq/VTC6rFXzmLmjNVcqsVNVNKqcVUwj5qqd1Uzj
yqnNVMKqd1WKr9VMPJ6q5mH5qm6qcVWKrhoqqYVU7qcqs1XKqZiYiMqrPOegN2nV7aygq6PyqmLq
uVM5uYq+NWaLx0FVqr4lmfJXQUFVPKqaVU45vaSgpPKCR0FJzVXaqYVU8oKCgoKqa1U8qprVTiko
KSgoPKSSk9iiquxem5q10FBVYqu1BvKtqu5dXXVb6VXats3PHj56g10OVNX3jO6sqyKOoquVfVnN
O81RZzc3PU0HPVc1QVFXVZV+Pniq6rKrEVV6OrzGyq7VZqpxVTCqnFVMKr1VnniqsVW4qrlVmrqs
eRc9V6q6erKmqnJqrNW1dVZqu1UwqpxVTCqnHzmzmq7mqs1XqrNV3Iquqyr2nz1bPSRVZSVFXe1b
z4eq5V9VyK6/rjoROZFVepKCg9pJKCq7zHNHzVU8qpjQUFBQVU5qpideT1VOKqaUFBSe0GGiNhzR
1UwqunoKCgoKqa1U95o88qprVTygoN71mHNVd5lM0FBQVU8qphHzHVVOaqZUFBQUFJVTiqmnk8nF
F7QTKoDVHMqk1Rz1FR5cVLUVWbyKrqnI6toOd5z1HOarulQ6mq70q+q7VYquVNV6I9TUVXOaqxzH
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
FfO3u+tH3Tk9o164485lE0l19qI4ryrbObNZZqWz475s303po+6NOpN0qVeR944vuTM3tvJd5P9p
g9q8aNmZPt+uOg581peUCvelfbsaKrqDpVkzJjJ9nwIL5i735Z8km5fex1i2/X2c1kfPlzz6TiN2
zv3oGdKRW8s12l3PNebqTRZrotZzc8zzx4fMjvsuz7X0i7dOe4sjPeZeX3vt0vfShWrq/VVhXjt4
mbOxu15aj79Yjvs53XdGWldTFUWc29R9TrmqetRZ4o9bN0Pmduz5rRni7RUG6K3kxl710q1dnNXP
3kxOSRc9XR5k1FFfPrI6CgM307b2jI29N3ec1DiTa65j1tvVBd812kddOe/cXWhygoLzpfN25qBd
Oi7Zcez9LjOuapN0xHw9xbjrdumdnQRrm6xxK7qKmK6Cz65j0EeI3TniPZ87PNx66d+vacjyoMnP
Hi7dqA1BeZuXpkeu8U1dBFlWR0MeGoFqo6xdbqub6Xo6i5qu5zc56CrdYaPnzDZixJH5zvNK90Od
JmgR7O869KDoY93G2bnXQ7vprfRxxaXPe+po+9zdQ8mO7fPEaM3Nzs3NPiM6N0q1nw5unTq+frdB
0ub0ndCqCg7B1dea7ztBQUNA6E051nrXbNdMT6zZ307K3QaVBFqg8qX0NrPez54sqLO+0Vp6zc5Q
UFBMUGHOe+i7M9miPcUbyI9Beni10jiij3mdd902bqu/PnPEaI/PURyuYoip+ZUN0FBqZmKB0LVz
zvsunTE2o+jXboroNLqY1Bqgqbbi6afPUHs0cd2mbpZ6B77zpsPh+843QWc0W8PNrs2rxX2ij8Nu
goZ42n62+uI3OeOoiztEfUXVUB6A1mjzGddIjR8+6DnPpkp5uLtGoit0C7n1QHc8zUGqHo75mb3o
81ab9VTz6td5pfGsx6z1vbtdriy6k2uioLivmjyOPMvKi7zom+na+56CPem7vIu3NZ8vM6dm+3R9
M7HoHeoz7b7WY/bDKLKuP2Nls3SzPtzZV61Udui7GoKt1c5uO/PfVtYfI585+i3U96G30uzL03Vd
seLufLsOKLpOX1n6PF1oH29378RLs7x9R6py1nPtdsZ12vrOxW0vu/M9Rn8eb8N0Z5NEPfaO9ZZ7
R+1Jcx5235nqNp930j6UGopykUx7ni90Y56Dpb6qYP11v696jzzM4EytU3vXG149Lfa8fS8fTpOS
7ZsyYt25qM85ezRTL6TC6LMdxvIjR2m1mp7dMa6+H21r2M5nnTtLOPDL3Uc0d5H6e89kzpOaKXbp
kz9lvT3j7O/b81pLm70nXt2K7zp2j3Seb8993nbm6+51ek9nZ1MAAf//////////9CoAJZABAADK
ipgKEf//////////////////////152d5aHqnL6I1TtdumM67X1UVtpfd+YkZ+vO3hujPMoh7W9o
9W8s50dUlzHnbt5nqNp53fTn6UGopykzU5ni3o0Z6Drfjvqpg/XW/reufPMNwJbVNH7QY350elvt
ePpeWus572ZsyYt25qM85ezRTL6NdEbHcbyI3PeXeZqe3TGukw+2nORnM869lOXkWbcc0d5H6e/Z
M6T2il3t02Wfsq2295fa7nL3rWLmoKTr27Uyzp2590kxF2817vO1R134Ffdb3292s6Z888vMPX1N
b1kxekyufMtdV1j74Y56TKGNLIueLF79bu7y7U0qBa7qz23EomZ3hj0PNQHoDRc5qC31O0ozGoOe
g5o4jXdzRuhjYr71LzJzeZOKzac0fa3QR0CmPcvvUo2tdz2aj3R/DnNel87Zq6A586Ue6Mx49Pp8
W3dCc2Lonzn69jWfUe+mukUdBinNWr3mW7yjMfOaLw5lQZ1vE2uhjX6cxj72eNZOXltVPNtvunhz
O9976bT6R83t33u+a6A10e9/D0BqA0evjveu/RmoLPqj2agNGfr81fztZqDrZroNdNR0FBHQGOvm
vjNHQdH3vtrpRns1B2Nuj+JdzWs59Pnj5o9RXHzGaoU4uz1zn73MRaVD0zpdnazMMarro8u43s33
vkUT82ZKemObmu13P3vmMsXRGN25qmN3l0Hep5+3SKza3QnygyOKgoO/bLiqOsWKj2Yxz4aPnyrr
uY6dey7306Ul+accb8Rsz02uln+5mUHSOgq3FF6aI2N5QOOro3dmup56jmcXXRkbW9xXqPGeLnPG
e4tuLIseKgNlBi7ds2jdsdvqu3NV0cV1Z3xUFA+e9fLXVxaobjPQYzG54+kdBnN2iqztkfPnagMY
5zG6mj5zzDyY126m6X210vz3fbwxvMPlXVFTzUHV9jLnntm6RXlxgxjxXz9TqOJrIosdBhrXegxP
Zl0pErxt9VlBFVkWd6BxLXT5FpUNvWGT5zbvpHQd6COOaznPceUBlugMbdBzRTGll9ez6G7Ufnbt
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
mAbueNbo2No/WJT1HR4budezAfrUZ+uXRBD18zctTFcR7feN5zR9VLejnu+/bLfMqnKv1dW1PNa5
+2c9RzR9u7MeOIx+vfO9H57pKLm75NHNFH0uq7u+eK+sVxK+aM6zpMUCax3QI5xeRxX1HXzXbIrV
GpjfU8VBGdGnqOjxXfWI/cTCo7iNQRm69p6jxHOfr3NRzAqwxosioOsasTyijPd4qOj9mEfv1iiz
VGhVZtx+W6l+PVxYeLdWRXKe1qz1bF2UTPzxVc/H3PfvbnyJzdRVhrzpQpjD1Y6u5jc9BaDq+SI9
T5V8cbGc5+aMUdD3dS6FjniDYoDZLqpqOkeOpj5udRHPOH56sjP6+arsoDVZV0Z48z1eZQbw91MU
Vs2VdVmGPV3NUrOvN1W9Z2c4eOgNGfD94qC6kxjym5rqXQR4agoDM981xniyoq55d1OGmIup+2jO
3nYZZteHiurI+b6s6r3vrr2zAbpcUdnurR3S317bzWvNzNFFHFKfM0bpU1FTfSrObnPHzc8Z/bRr
54j+80dWVdQGPV1WRZkXXPTZdBh4utnnjRM11dVlXVabnjjMYykXXFhut9ve10UZ7zJiPppdjmPo
Pd4dm0eKreaPF5nXvWx9+m8MHFHiPVvdLelteaczRM8UUpzZceWbmqas6Pn5ue7izpmc93FV0R4q
st5nVmioLiPejT0Rrq6rbPfNV1WOrsNIM11Xars7XuO1q6soOp6uq00Z6DI48yrJjmjvmjqTAyOf
sZ9FQHdAKSpi59ReX0PQR1ejzF65uk3FGe9RY3Vcq+refO2HXTufInF7MHPFzbi5qmp5o4+s1zOr
qrFVzcxzc8R95Zo4u5r6KOzHjiMfr3oI87nZjGM76ZH3jiijOY8a7nioKCgPkUeGbSw2lFnPHVff
WPOkymeKp0okzbouehzJo8U5fPjWGxZjsT2tULS7DJjfV/ZicvUx5MTG9Raz60o87h5TmK3s7uzz
HQhVyzHFX3nYH6Pcus12nVb6LpnbrR9t76b7dsn3mI8S3MXm6SjzyYnN71896Tk3MaW+kUcwdUlH
Oa2tzBHx34jzG5jNdOk/facmMS96P7rFqY3vd7KNdFt7hrZZvfjs+O656OzRvp2TvtivUm5dzk7m
/Trmy0pzskk1MPt1o6OjnJzp06LbT22tyIk9TEx1WXNTmprpR73uY81r3r27Umt1l7vfsIunfcus
12nZhW+i6Y1R7107dN99ds31eM2eo8S3MXm6SjzyYnN69817J03qa0tqLnmDrze5z3Xi7TBHx5fi
PNbmJzNdOk/facmsSXS/usWnve7eyga6Lb3Ccp+ze07PjtVzxUdxR9Oyd9sy9SeS5ue9Nv0+c2Hx
TjSSINTTvt1o/etHrp06LbT22pOzp23MTHXOmXNb6TXSj3ucmPPdTnXt2pN9JrPj8zonvYtetzEw
R3Imk95ngu350fNbo0fmzv2ts1s0Wdoz4eJ30UPJ2zPUcXajdWaYiwzV5IMvLyzXHEeYqIzdZyo5
4+aOpiMfDRms5jnqIo+apnqDnqKmYNz80fQ8cdmPFOR3VZqxymue0cd0Oy7C1Y5xl3kdBIgnFZ4a
GjZGmE5KCI8520NRZtaowdUFCbE8Nh7GXMK8PeH9ijy1RnPfXOxjHNGap67ijnPI4sObLvLzLl6I
0cXnu71lo657zLy/aA73Ee8zLcch7jSiZk7lmL1FQG69zoOLnjwx7GtLHfNGpDd+p48vWjHyz4Iq
qYVYag54zPQu8M7WaCj5uvTuHzrnTXNtiJI9Bz7oanmR+jyzVGTExEzm3ZosvzN5psR1J1zpA+Mz
zm3Fi0HHUWdZcioTGPjy7ONCLv26JHz5oORdOfmiik3Qc98xs5+Z3mbnulBq88McdozGPzmPnO8i
PupM3jqJNA5nzCI3Y27Pqu+xruobvpGfn9+V8P3PzXQZeH1FdDV0ec5o+ZnqHvDrnqTG7UGzny+n
NFzSUFAY4zLepjO2Mw9qLnKBHizfN1npjYy0ecG7s+eUfazRc0W6CgNupNQc3PUXmlOTGnl5hrMe
M3Oc0VTmc+ZUxH2epkM4nUXhzHNpPN5eM/mW75o7uot9L9o+w+Z6e4oqCgDMfLmO2ZvzLyonLHZ0
CPvXXmnsyxs+bu9GvTr552uoNlxGNz0GyCw1Tzdqmg6XQt6Pl4c3bniNCLMqYjGi0jyVImDRJxUB
zCcGdMjidvGe4z8z9uXvR7nIroI7SPEbInzmtc9TzX8vO24nix4byPmPzNg3Ybj6UEx2iyLsJxm2
ehVRUJXO1Xup/MxZnNG76XluizKJxR0eT2dnUwAB///////////0KgAlkQEAAKWLem4R////////
//////////////+7HZlFl48avLMc0cWXnfqeKOc8jii5j5h7y7y8yzZdm54o6mo8nIozde95cXPz
Rz3ObLw+XvzV2jXrd1Gk96b59m0ZxVGa3Ed9It+ITPPMQyXVzt6nbx92uzTxsGedryYNl7XTDTtB
eeDrj6UeCQSaXQ46ObU711pPO3ej9ud6Gm3mbDzJNdsoL+u8a7vVHz1Dt9kum06GyXU8qtvr686z
plN987dHRBzi7zj1bWaax73Op+zt5aNGY6leXR0fTd41jugvMccyuz7d7edGfJX72yg0Q2d/PiGa
ta7UxLd9KDp3QsXO1g+g6eTanVrSvH317ZjXk70m3hth5klH2yguju8a7vWs56h3fZLp2T1ZLqeV
W319s2+splrvnbq3sOcVBOPpbWa01l9tzqfu3lqKOI+SvLkk6bPjWWegs2OOZXZrvd2boz5K/e2U
GpKXZ0/nxbzVrXfZDS3fR9O6F+ApkzKM6KfppzRKu6XEpzxNzBEjad9J6rLNeGkwb25ro099PZLl
9amejS3k5NLDG2pzMPQOgzpuZ5+vfS32dBzzk5QXme5bNM9tNUHXnaqE3ns5U4+3u9W5jnoT6ms9
7eK+xsjfPdBFQbmHrmXOLGcnUdbvXMoWMHO+bq1Ej3GpjYemneuqc5i99zNe63kw5/0/aoM9JdMZ
4ja326e+/ZyimPUtOjo/fbZ+3TevVbcylr1Jujo+bnzrHnu+nYyZ/Oydh9BLUdlmanXzs/aaFw5m
ufeWpp5M87XNY30599ebd3hpnn5td6C+sS5+axfXeZMzTsLm52sFEfHPdjRdEaW43GbWPV9VQLrm
TDboH2uO3a6i210i5+wuYm7eUKocOKCg69s3d6oGkt96Bxc5qGIZnkO3R46huznVBQBx83N7aT5z
GoI+dRigUpozu5iNUCMc8RujaibfV6W+++lSfrQdHaqzIt9DmZC3kfOc/uUC59XQI+VEyzdcUxz1
HPLzuROzKPubrHVnPzPOZdIhzTHNFHHz1dqOztT3Zrrhlfbo8qKipVBO1FBQUFq77Zu+npk+foZZ
6z3HQKNGVT07HjVAo0YyzM19xPImprE+qfTe+0xQdDtc/PUMc7kbtR83c3XnqOccxonFqo3zRRx1
dzzNxuaZ0u+G8Sd1POqhBKgoI6huzLuvTRs2Lq/bnEepjXSRR7OaIyiiyciiWPbmksedsyY63QHq
HQa1Ebr2047itugXbFOLJbly4ppqZ3h97zfPNdc55bkya11iOroVjNjPMUNsS+qKc6ezOt+r5Z85
sMsycoG+lBfQ+t0Hfnne3NNdNb7dPZ3nXSo7nz1Jujo/fZ0x+3Np89BQJdO3adqO/vP7OZQdPUbL
PnOG4l15+bLolz9mz1Zzx1DqI1z+9b3uLr0oNGw+9YernOPEa+tR744tPzrNCTrufjTG1IJwHL4n
72ptJh9YrvtOdekT7dNTXtHnr303R67Uc555M5b1c1c9nbzpEe9a5smrmX26Ly8vpfa1eLt08U4f
pjeTEWtc99LudlXePRs60Mk1MTb2pJE5W99u3TVkN7y/KNPxPfRujVA+1HkqtfGUvanFcx5rI50+
eLV0UxFMY12fRkebnPhphXnadXQg7NvvOYec5+e7vLos1Xbor8jsLCth6lyefvbxMPrzRR32nOqi
u+3TU17vJx76bo+najnPJiby7oNHmjz2dvOvMc+tc2TR9vsvLw/U/S+1q8U12Xk4fpjeOLWqm+l3
qVd4+hsoKGSaUc295JpPE327do+mr3vD71vHMJ76N0aoGqPErz4/bkucVzHmsjnT54tXRTF801jX
a+jI83OfDTFq7ztOroQuzdu89ka56m7u8PRZpq/I7DsjIbeA1B4u7vF9IaJTCnleTgc49VU4WOZw
9Xmw8WsycXTCF50U9rD5QdaC/TmNGeJxZ3iiPGcx4s0dZGaO6CKKMx8OY5sy88vMu6Dfbs8x9D9K
CLKuVWigugNQUXd3MdaKF3QCgoKCiNd75utEOwPmROej6ai7eZQe2a9dOlAp7WUCvspigrUCTugv
pvMtzt9KBTHlBkw96vGqDr2t9L2uzvt01Zjd+pz2Z9Nd8oKLvdxHimDdaKDs0dBdBQS7zue+/UUQ
uYiOZ0EeHiPZ1360UxFbhQUFBZo+89rKLv5pUF1nFjfnWPprs4rnLw182UB9r11E5l326dn23l9e
j6HobPk7dAhHz7ugZuaO8zOZ+xDPV06eO2NPOjoO2ZOWouY58mI47oM7LL6bs5oj570Vxu/btdE+
fSs+u57oKC53a1lt9ujNH4ezVXYsW+9ZdMvPkdBvm6Wu1873nbfPHGegoGbNu++tzuzdMduckMz8
xDMZmtTHk92vml0su7ygaevbfusjUUWNVbt9uydBQPoo6COLmOrs+Zu99ke92bM9z3Sj9t37rM2n
zpWc2ds326vW62t9MfZuNXzVXbZ++9zvQ1HfS5LNnh+bMfS8XR77WNb5ll0F3aoGnpdHfvfI+aIx
sqsPbKG7O8oKDprJyOOgugN27RbxzllDHoM8yY997Zmj61eI280bDUHfFrVbb10vNY0lGHVt0B45
y4tnXTPboI49a7JXWZ53ft1WVuI/inFfQ1Aa3mRx50cby6B97yanNUM5jDc8tTnhqDt1oPaA5o6C
p7RnNEfL75Hk5HlpmzDHjivO94ZxXkc5NTDr5ORn2ZVY4u7M1Q9FG7dx1B6BG3o+ZivMfmaxxb6U
HShMsoSmFJpRypae3S2/MmNZ6ejl3OeTguL536X6xd7PnlKrdH1XW3rOtq+3XT1dDvvpLOl2ryW5
yv0x0Obp1nQ/Q1/dJzGUJC5j26NrJw8U10jdzGTWdWZWh6pKNLVu5vrf3uYZvdHeBFAdHx0GuyVC
Y/N2PlzFLOeLyg6UHkm8WTGl7ffc9d76K4su14X6e7lnMxZIpjXq6pq/Htk7XTzWUe866nNd6Dof
Ja99KTN0l0hrRKlpfBrzifIvnS/WLvZ8paVWnR9c66trKC1fbrHp6uh33Szpdq8nbnKTpmXQ5unW
duh+k4a/ulcxQ5eUKuanLo2snDxTXSPo7mMms6sytP1SUeLVxPpQXvrf3ubWe0G96vBkD4fLoNdk
u1CY/N2uP3LmKWc8XlAqDyTeWsmNLd99z13vor5sPa8+dNuWezrj+ZIpjXq6j28vy0Q2yZ117eay
j2brqc13XQ+TtJ9vpSZQ7pLcVspS79G9gohUShP33E+1BeLxbZsMkunSjpNGx9/hz0Gj2bdTq9Ts
UTjzKsMY9XO2Y1xR3mM3V9kqDpQXajMbtFHFzm7uJddrUTfbLqauoPhvkl6jqH8idStdqnrURWfp
kRo6jm5+a6uqGZ5Gfm5+aoq6otm2o7TP0FBHvKrHMbnjn6DFH37+0FBmRdz3zRx8+3rOfLPmde58
1vp2oI+fMu8yKg7d967dHFnRPMbivEl2uI8XW2sdXcxmbq6C8jug7Rc3PUVdzN51dmWHoKDtz80d
Re/cRuprobdBQXkdRV0XP2idRrnts7UnSgZzGoY+fdBP533HHay2bmNiNjyJVu1B16WqieiiMZ+R
s8Xp3dQ8R7iP38Nz5HkWWf3zOnNz50Nox6mIx8jfM8+rXbzyLtGOvbV9TW7ta8fWI0dt88UbMa7O
ounTUWdms586D3y6h9I33eO71h77Zz8/NZjbs1Tq86nyboHQUFug107dulBkfZ0FAfN1ZO9cvp0v
od0fyIzV53oBrPenNz8/bmPUGMepF5ayzYni813zztrsO3XV9+xl0u09eebWdfe1pmj6Xsz6x9Nv
E/LN0vrhzfaCbdBQPVB16du2UGzRugoI7w+6s6Z2do7i0az9llBa0+/e+fmqTm5+tRGbMWX52izt
17d+/bsjdLZ/NzuR3fa+m9X1UkdH879DZ2cd1ZJ2NfMeg650ypObqfdqYzWrStdFz7kveork1e7O
a+az9I13fNVdN4zRMLtFFkbfPHFFmXz1PUxnVl2Y3Tm53l3mde/czNdBreu1AeLn5ouhjRx5nfrj
M+/bUeLKDBQUFBZ4rV/T411dANLeRxRdk32oD1a+9/d6+nvLCyj789BHQa8EfTvMdutAfBfztL9v
xX7o/N0VAJFc68cin1IjRu8b696Ghvvs+0QniEzJMZjuTaV0ioHe6C6Cg6d5aO5m6Bt0ZroKCg6S
5i6vmPOYl870ZrlMrNe+k56qOY1fVxnNb7eR3rJ3psboPvx30nEaKOjeNZkU4ftR70fUUeePt36W
c9AzFX1uN/d0HS8MsmLkiyTt33rt2zHs9teZOjmoKC9UFB2nc6Su8uo6KgEiudZrmUsaNGzmdC6B
d6FHoO0R+y1PKZkmMy3cm8VyKgd9N0F0FB0uglo5m6Bt0d0FBQa6azKPq+Y84bF877NcsSs3a9jp
r1Ucxq+rjiOa3rt5Hesnemxug+0bvopiZnEaKOjeWsyKcP282dRZHkw+3d2eNsxV0Fxv7ugfS8zF
cWSLvrv2zHs9vPDT9jmoKC9UFB2o53OkgyKRDdoPTWojazQxuz9rWWldAY8W+bYw/U0UaNft98y7
O0dZns1HdmPhzR7UR7yzZZ4u8d53Mc09HFQnMfLx2ZPygygqY7zPoeZQXz+1Znupijy+egbnEbNF
OapqIx2oKDKB0FBo/NV3MU70Ajyg9zKDt36e985+fXSgy+x7135+ksb7VZGbn3HF8znXNF5nvp4o
u8flWeaNGY+XzVec8bNeH5+bMOaMxzbPVhnjoZy6uPFlmPszjqT4H0fS+shkarN5b2LqNqOo7UFB
QYc8ToKDXMePdRUlO4oMyOYs7oHQUFAeKOp5tFJ6a9PQZQUDPFHzHoNFO/NU7mNR0FBkV3zn5+/o
5+fNLOlvv05+mue0bot526mezYzeL5qrqrGdKmOo5jZ0mDs9XjUS97ux72qKPtLOTTdW9ud3Vlve
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
1Q0M5mGPX7RGcud3Znan76Xkzs5s7bu83Jhu58iPPzdny+jNu8a30u/va6jJ7Ot7a7O5676M92aq
x1vuu/XVBeX06a79Fffv10j4dc/Tp2mMqR01GqTycdr3D/TRCuGyNcST2a2uk5ObaczOtCtrG156
nI6+adpr2c1mma940/fGt83Tak3S0l9q3njvH50vplu5jffpqgw99M7dH0136b0u5+99+kHMPpjw
d+mu66drzvfXL6Yf2g6dOjztped+nfvfc857MdNUELazaoKmtm+i12oY8379OaLSnD4vuutC+67T
zE5s7U5e5pc5npXvFnbSe/omlHc5F2ugPrbnsN2S36ndzGqCcVztRu2lmasz6dDZQaeqHQXRX07W
HrpK+yzDmXTfl352XSTsbsPO1XrreanuwTnsWm8y6BPV2fHd7ajyLnyOYca56BdnhzZcH05qBPse
ZpGn27PzcXZTF7mJl5c7UPzOjeZ00Z66ZQ7eulDpOh2rfbXTpp+K+mzdHoeeVvPOnZig87Pf2OJX
znwR7XO9TXZ4eGGO85ulAu3h1d+NrsvO3kT7d9vFh5nOjmJiLpMXfR6zW6H50oNbxqFCs2l00ft8
mprY0155QKtb3zvTyJdZ7tNdt0G5yZzQs1BOTnfLZrVD2q5GPMXW57SbNbRsw3acTxXi10q51kWp
JF0TUuq48zbmqGh1l2o6v+V4jPs+952bTmZ1rphjrp2trz1OS8eUHc5mp2ZTw6vpl9zT+Xedujro
dk987P0ssnmUGl2zpvme+iZnuO/Bjbma9+kIb26MYsHZ9q+5yMosuvNB8u2YvCPnN08rJs2M9GfO
mzm9Pl4lrfuojzhlMPNeya63MfWY8VH2zLV6iP0PZ4hiIKgRldzWBBq/b2bWTmne23fgea3tXmt4
4/rjl1I/ey3Ob1Ma6TU9rNTBsV1/kmgq8kRjHWPzs3itUEs5qcc84XerPuY0xXN5rp26dtNYdoxt
dtR9ktjF9lHNW6+Vk2aPN4/DqPOmzm9jNeJa37rmjnDDophm17Jrrcx9dGY8Wu2ZlHavUcR+h7PF
XxNUCMjn3gQaucvcWser2278D6b2r1szj+vnWvWuy2pzd6mNduk1OUOamDYrr/JNBV5IojR5jWuz
eK1LOayceULhd6OfenuubyLXTv07aayNoxunbUe++eDUDzMG7Gl0zXr+hdryciXfLRt99tKws96O
jyTp0+y5d+WfIp2goPHizt1jzLeZkuZQUBsajbzI7ivr3b+ZJHJ2WDo+23rrJI7Z4ZZnHFd2ZxX1
Q5kMN1+pab+UHTtSUfmH91233XS5yY690q9sgUS99+9uvdLv16OZWkU9SoOx+6rr7EzPt9uP7vO0
dxR5csRs7Xl3eSmmMRjR2aO8lMbtGtdjfY0Lw3zq9vPnVTh9t5vtQUGVmaM8zO+GNQXh5zwyWW9R
qKIPpG9axUH2gURo6BWZHZrS0kY/N1Poxn3cXWg0lQOrtdRJl3fOY3eftc/OaVqgToDtRta7G5ut
BQa6Wty7FAusTEQ3Ot9Nc/3LPH1OqC0MOcZrpzr50NKun2XDHqufKBaoKCgoKB5HHQdVnfpnojSt
I3N1P1Tifft11QOPrq7ivMiN3vKCgz6zRbE6+fV/cs+ozpq3hz6QzXOkxIbSls0eXVcoPi3QUHTc
HH0Mbu1jXXOtRioHELoOlB1j+dPscesiy8iFW3QXna5zcWR0CiNIFz6td1QH286v5Lj647iTZuqw
de7yZvPtAZ307We3ft7lt5cUz5cXlBQSm7dMnJjr3SjiPeelEpctGjNQUGZ36307Ye8zO3Naz5zG
+ZlCKA0N3GDdsVB9+UBsoFY+fIXYs4+dI4/lybs1Tkh6AdPfUOzh219BTeLWr7db89oHvt1NnZ6f
bpR66KXXbtvdH0dHK9ZnobyI9/Il2o39b1O0b+LMXQSPpcl9HR6dHO9vPZMEl6w/ZJxRzc7FDtrf
TNnW1gYcug9GsylF5fZD1/aVTyuQ160fph76dBuQS7kxVkfJmVtxm6O1FuEkoldvRpJlvsLG13Mf
Mne212abd5O4zrNLNfQU7Ytat9b89oH27UBs7PU6+3Sj10Ur7du29dKDUrWZOC7yI9/Iuy7Ub+u3
qjnaN+rMXQTL1cl9HR6ujo53tr3WDJL1h+y8Tijm52KHbW+mdjrtiyVh9pdJ9DWIlOi8vsswev61
Qq5DM+t6P1Mfp26DtoS7eL4j5My23Gbo7yLcupZJQ7t6NJMvp2FobT7mPGbJ3sl2adt3k7jPhr6S
2t+O4WoIYLy798yc0bnmXrcnt5KlzHxKzPB7HUb1t3MWoueoqe3TfSKpqL3pXhj7j7c3PFvrUR9K
ndRUxPRu2rhoxw4eqWET5mPHra8j6RfJie87R+IfB5kfT5MT0XaMMfPd0R8Pzznj8if3UsrqM88T
ObXvbd5O9Oywe4fLcWXIsu5jtMh9he/cNvp8mJ7yPt0iVrwfPvicW+kfyY7aiXkcwPn3FZ4o/Kuq
dX0ij7TA+LxXf3z50ji3MT0xQKEdFcTyzuPyRryzrduO9+dtxxyXLcTk9vXSPmUkyjC+g8Pb7dr2
9eGlOrHqFTzRhm1zcx0bKlG1rORnFeajtyc/PmGd6iZzWsfMDRS5d50HudO3Pz66Dmw/prOMzTqH
Vxos58PaUV4a4+a95kce81nustZd2sBjHiDNeGXPLrPeUx4qjOawhU80cXPzs2+kR1nmlDVmcQyO
KK4+e858jwRXdnMa8PmZ2uLMNZu3TOmdO3RZzdGsjijzepzR0MtXkh4GMY7YNeAy55dZLnomF4PR
Uc14EueKLnezGqIvM0Ze5EOY9xbjjucyKL2znjw8fNd5Zn0edO0MMIrjmsjeGiOm/d6EfPFtu3Fz
tdMVRc4pIueUy36hvpak7TmHqtxGU6gzXsP6eOo91vXitPfPzRzBu2jmj7dDePHeGuYi7aj5qnp2
3o3jj5ucxt6zHajP70zmjMmeOQ+32vfM9c+NZUb16FcNamJNSJuW+vOnQ84t1Nm1fkt67dN83PHE
mrmcu5MyzW50Tjve8cw0vdC5icnlR+z83cxns7NOcy5hzk/Nznk5t4aFudlXnskqbDWNctN6lyYh
uQJJDcN6pGrs0Uft3mWJNHNzR8p6+nZxmckyLcw5MzW3kJhSazsFedNdKPk8R8mPbUwnPTE5tBe+
qefaNDWXqSYF67dHuoqY4siauZw9pZh4rVz4nHe945hpe60pyanl77PzdrPZ2anJzLmnOObnNzm2
jQO52XPPZJU4rDRmuI29TuTENyS4khuG9UlI1ezxc0ft3mW5NRmqOeHkJ6+ndqOK1Mu3MOZzNbeR
+wmFJrPOwV9Nddw8GPFkeTCtqaTnpqc3gXvqoX2jQZ+2uOuIuO3BCd66vfVw7bd+QmPQ2PVBNNPl
36NK87b35lp+NaeWt9t3nmPGsrZ6E9IeBCXPNNPpjT6ZfZSOYtL3fvaYCmJzfnzt7Irg+UwHveW0
17l72PUJhnxNMde4nJLvPUh707DzWa3rPH41pPW/Hifmkw35ndvzSa3KNRa08DbkmFOW/e2phvbh
k5b9nR9+CczcMeTic4bJ7a5P2HbpKunjE5uGC14gveljF4unvjxjENB2nDPV70nL7PfacyF9oXXz
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
ivE4WWobEutRbzY/cJZJzq87u246PDVkG/Qcw7Ey0vXd/mXFiZ9PxPtDO51U9tvHaDtGvLXWTk+e
l3FMW4f4ks3+0TP3Z4/Dc41GxoOy0XxtbR+vbPN3zua5OX/yb/iiDr9opNv6J0eafcqw2jCeu8fQ
Y6KZ9t7tezpXEvy8Bh616GgpLqAkUpvh3OXmZJZ7e8hZPjxD2sHZkU2Q7O9p1jvzhw3Nb3YUc+fi
zIx53nrZbXv8uc66PTw4yO68luluvWjWo1bX8dDlkisnzfPpnNdt/b2fMnNpy+azZV7c1vwsGSy2
8sXg5fp9c56MvJ33mLqZnG3tR/pcc5JfGBy4+aTsNXqjbxoTeSnr3dlr0T4/tfi0Oknyut4Om3Ud
nm1EzUU6ZabxQ3fEkuoyvvNsXp/GCcsee5D3N/eD0+XPbNiGVMyAmwx9q9doshnPqF7INFuXne+f
r/Pnopc5HqUYeR1XXYvCue0t2I5fvVYhlHdpK6PT19ff2VePs3eiIXszPvhkb/5/Jn7tsnBn83w3
uj26YO8nDxv2h/3u0QvmiZlmnKnfm7HMq/Er/f988e0Lm1ZPLf+dMve0hbOG9bDZYLV9ouH4QXPQ
aDyuXPPQeKaO0PonxmhcH5vqlWgmMRSzlyOm0cCHlEQdNpPO7sQwR50/9Uw23bTW6arrZ0mnffhr
s8u5peVdcjHYuIyJdqd+1YuMM06fvUmuT4d1/MI2cqrTD+Kl+zDZNjfvRJe3U3erM+ezcSpSxBed
fB01kFnDUh6lGHi9GohNU+no9rJvctcDdJV7Z626dO9kIs/Udy/e/u4CdhPs/NIaVzudy7cft7Mo
bR57/MpvJ+PHFYy+QS6t55Nz89rW7c4689Tyt9+Is239govI2TBJ3BUbCakdYjKM+90yhFN+cewP
16Z1rWx+sohDZpNmZL0TN0tv72bWpunlxXnu6z5/nB62r5UfW3+W1MhNm13ldkGP//TvyaUe5dLn
C7O3Fnot9cxmLHmemTSdx6frZjWT+21Xb+rm1YS1mJH4J2N+/nvSP7g6OTfVB+8tfhvnzTi0c7KH
ibk5dfVRNkEeRn7+7dNtHrUooVwNaDnRbV/b3IuOiw4efJgFlCrMsrPPfc+y24Hbg5eHXv2jnfl9
Xcungljq6WoCv/7cb62OXtgkF/w3Z17uo7GcjdmyaOuHZkzZvkjmr50fjYjbeq/ZubVVn0xiz8WR
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
w0gw/GLveLxSisqqsFOVSq5m/1WHEHoO9d/B3aOXB38YJ7ZcOTp1Ygp1LLqB2hQbOS5vtsgQREYe
0d6Hg97T3oQerkqdFrb/QVApKjS342AY6opzOyAzvXeZ2QHe9Qb087uo3Um+jsgQINkFNT6c6U+o
GD871YX+cz8zvVrv852TZNlblKnqBShu21TOgpVVLdXjbbS2772tMIJ8Gnjm4tgmEE+BJjm6u7T2
fd+0FHkWSeyVQ1FSnSqHjwGbYK76LgGbYFn0UpUOKyv5bbcu6U9r2bsyFgQigZshdiDyBDR41bqW
gUnTQZt897q6j9Oo5oGZGI/N+CMLfuglQ+e1U0m5tobNdCotqopbU6clJd22HUD2XO+oHsHznN8W
Ot0qFL30CBTnGyaCoH/ti4g1cRtYGOX3Vx2sDMcvkt77xsaOVXQpW0U+btEpq795jBcvy03eZ9y/
L1GYo+kqKnIoG7ceQJN1cbsSQtxxbg9D3unmcW4PQud6MzjDDiC3/gw0mvFsUHLWHM/vbWHML/3r
uqmmVUo1U3qpWoKqYbqu1PbDN96qeVU7zqfeZ3qp7VTxdT7zOh98xqGb6UFBU1U6q/tboKCYzSyK
OazSyKM9WVdVlVI1VPYo756C5qKI852uz2uh5ztdntI16y6t5qrhroO3NlWVJo6vyOK6DVXHR311
Vx9nfXO7w1RrGqn01V7nPVcqzvQXHz5zUunaLYc3NS6aLI9TkUccdTzG6fIncVW1UwjPVkXWk3lK
9DVzXi6Ur0NXNc9qrDVbV3PzXzmPh6s5qlVFV80mfFtP5X3d+1X2eoN1zNpMyqx2z1ZHPPPuGDwx
jKqnFxVfzs6y4mkbqereZGTmTTmzY5k2RYarqgx4suM0ZsoOfMjO8We4snOyu7Z44unaioOmX2PV
THn7dVcdBYtHM7RzM1xL3m56moyr8qw5+aKK+rP0oDz19WfpQHnnfTqR5+eq/i7UBGqxd3ZDoumd
/afIzxd6f2nyM8Xen12VBQdK9ViqnNB59jjw+UFnXR5QWddHnSqnJueqmlBQc9V8+enudnfaqd1f
v0HN7VTyq5v0HNIvD5HEqvq2q6zmxSOrcSk7VWMS1q+1B21M0DqFRRPV3bTs7ToI+Yx9Pt0vKQs+
sovPpZ9Z0NXEqA6+dO66HzppS6VKN/e5rji0DOMblzB402DxG6T1ImYG7Yf2Zw+CZzR80sZ4XkWu
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
Nttbd1fCi5C0FWFITpy2qjvGnkmtubFaKDahznaaFoykW+XV5PZyU191O5UOc73FEE+1B3V7Kcph
M53erJfSuqKEw1VR3aVRFKUOP1FSUam7ZWVFsaZr9b2u8qSq96JduoVGUp1uqChSaGxua5coNDY1
932a293e47y4XGTk2Htu3td4v2oG7bKkqzLqioNqWSb6DdRlKqO05Ns9letjS3cL5Fdp3qvP+hPm
UGyTarP6eb78tuqr6TneXLW32k06Lg7Iber7XJBvvVWVE0yt97u7jZvJvVoFC7oEGdlVS1KqKgQI
KCCn1BVzTUNUNbvJ42NLn25xpQUt9rqXjQFdxLm6Df6faq3KA2oVNs00kFFDfM9pv5Oc35lGlha1
dhLO7b0pcVpNFQ0G3AHGjeTBvQU3qzkmioxPvWuCGQqjbt+GjPGU190Fq0du7x51DVsp0+fQVpUc
3amzdotr7Lm37dltvU2ZUG209t+fm7kh/Wxq3FJ/ZXs2vJ5vUFToLzdvhu3KKZNlvbmyCqw2NFQi
igXzoko10Mo/V7cLG06Kj9Lg6h/+yyTu8qiRTbt21Xuf9yFB7GxrqPA5bl789BzZsdo1Sqg3Q5VO
2K09sqCX7KVUpLbvM6OK45la/niDOS5nJf6WD3EcEl/O0HZDsvQS+9uynLvoMnbneDfJCd8Cksvf
d/qDwyZklOQ2R3LJXckHEF/xX/VluKQaFNn1Ln/9yd7/lQ8Cs0aDJ/NzluMwyeO5Q7f2qqJXdoOB
t6gb26/5ctvQdzHLtmduXVGiTRs7LqCj2amTnJznRyGa2QzLbY3Fu2Q0dsrYgV4EPECHalLOcvk6
g35NRTf5oecmg7TQoc3Ax64bbyQT3kLwWMnTUkh22khbNv7z+XIbZiBAgzmc62IO9/Z392zO3zbb
fm+IN6Vev3u2Td6gtokNt0Nq5zee8My+/3USzafMmOUsh2tf74Hebczkv+EHue4kv53OQ7t6Db+K
d23lmIMnbnZDfJDe+XQlnN1X+oPuOZspz1Edy7tdyQcQc+Sv5S23ukGmgpik//uTvf+1Fy1d1kGT
/eErcQjN8d+j2/tVUSvloOBtxBVDfeSuW3oO96LuDvJdUaJNOzu00DR3dTJ77W5zolDNbK8y26PI
t6iFoUeW7JBS5aG/Q7UnJZzl8nUG/JqKb5uJcmg62BDm9jH7htvIb7yF5YzdsU2QqKSQtu3zl/OS
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
yqmGqrdVyq5VlBdWI9VP8qp2qm8qsVUyuqnFWVUqVUgGqt1ZZr6VU/qsVU4qpp3qphQnoKqc4bOe
qmVxM+HoObtiN0qp3VYdVg1VM3dVM8qtb71WKqYdD1U2Rqu61WKCrX2yhvpU8xrqM5u8biqpDqpp
zUFWOooNHqpx0Nzx1Xqrj61X9Gqs5VbqaCqmtVMqqQqqYPnjOqqcVUhXVSlQc1WHoetVM9VU4N21
HQXVcqp3VYXaq/VlVKVVNcPQUFRVft1UoVFVh1Wza7XQa7VbVTRVUqR0EV8x3tZFVaqcqKrW5q+a
q/lW81XHuq+er6qdVUgVUrKq/z1fVSCagqp7VSLVT+qmdV/dVM+1DVTgyqOiqtVU6qpAqvWaqmtV
KOVUg1UrVUi1U/qppVT2g71U0XZq6rRqtNQdFHZ6qZ96GqnHaKqnExVY79MfNVfd0F3QVUyqp7VT
VPpzVFTVTmqn9VNKrnmqqcb7VbQvW75+c9R3PURVGo6rNBU1XcqFQrL5qrFVs3NzVFVOaG6ir7oK
rFWGqtVWqmOqxVtXxn7GjqpnVvNUXmVXI1Hz1FVOEeqnFxnoKg27NVfqtc8VR1jmo6rVWVUgx9+Z
c9Wx1NVi6sq2gyrarJj1XqrdVg9V6q5Vc7c9V+4+egqwyq01B2qp7z89W77HVVKFVw/U3Nuqmt9F
z1U6s/agijqu1GbqtN5VTyp5qrDNUmq5VEdV69moFVYq7vhqrVWRnjtnXY1VqgqpY06rZ6qfVWNV
U4oKrFVOYqr1Vmq6cx8dVw9TVTqKqlRVPObO1V03jZsoKujVVgxo8vn56rdVmoWZVtVIFBVlVINQ
ZKpqavqpjVln6RVUzjypqe0dV6q9VdqM56vugqsVXzRsxjWzxmqvVUoVU4qY6r9VPaqeZzc8drmq
+PMPUxmN38Oa6ruVfdVMqsiqprVeqpseq7V9VOTVUyyrMqyq1VlVINBUVWardVlYlFVYMaoq+r8z
VXopV3d3eVdURHu71lxVXKrtW0FV49VzOaLpZuagw6qudarFBUVKyp689BQRJVdVY5ucx+erru+f
mnXh6r1WnjqbfRvprmuzKOgqauqsx1WKrmc3N1oKOOM9TVTlx1WarVVOKqcHvtHQVW6rNVO6DMyr
atq2NVaqsOePnvmOzZUVWarkdBUVWOlWVXr5ou1Bz1Wqtq+q7lWHOaozmTjyqzQOr6rFV+q1QHq+
q7Vaqphz1fQRVbvnNHV2quq7I9VbzdO3NVlWNO6h89V+gdRzx1UoVWIuc9BjNeJ0NvyKhq9XVTCq
1uq/Vbqp5VTOqmVVOanmqpkbnqp0ZVX6r9W3Gez1KxR1WarNVMe1VMasqv1UwqpjGo0bN3VZqbzH
ErqszijcdVy6jKmovZ2a4qqe5VZqOqoOh6r/SgqIklzI1Qu9VqqxVfqvVW6rV1bVtBzHqasqyoqa
kxqmpj82d0FBUnPu+bOaoiqsxRVFVyr8Nqq6vlX96C7NV1Wcx7u1l81Vyq7VYoKrl1XVURdLiqKD
D1XVVY61ZVyVT1qaCgqEqvqs83OY/PVc3fPUT7w9V+qweOrr7dG30iqLuJR0FTV9Vrnqs1XTc1RQ
UFHHznqaqd7jqs1W6qc1U6PajoKqYVWqqe0GZlViqxVY6RqrVVhz89TfN0w2VFVqq5HQVFVnrVlV
++aLvQc9Vuravqu5Vhzm5jc2OPKrLcdXVWaqcVWmer6rtVqqmPPV9BFVY3Umjq/VXVdkeqt5tdua
ratesuoy6r3V1ZUx1UpVWYuc9BlzsWZdDbmIqGq72uqmFVrdVOKrdVPqqaVUzqp1U81VMzc9VO4l
VfqpxVp44znqVijqs1WaqZ9qqY1ZVfqpjVTI6jw2buq1U3mXzK6rPq53z1XT1GVNWWjs181VPsqs
1Z1VA6rvWgqyLMyow1WLvVbqs1U4qv1W6qYXVYq2g5j1dVlW1ZU1dFFV1XR+exugoKuOftdQaoqB
kQpPZ2dTAAH///////////QqACWhAQAAX7RQ6BH//////////////////////7uY6PUxVXKvqs1d
VZdXxVW6rkRjxUFX5dW3UVU47RVPPlnugVuqnF0NBi5lQH9koDZ2NHQM3TMjvKCN0FWRUKqai8NV
1RVeqpnVTqqm1VOKqc1FVMEuerqtMZnquxbqyq5VcquVca83FV1Vqq8qCr7oOarqqYVORRnqpT5z
VXYqvw/NU1feUEec1V6qmNX81BzGizKDmyqnNVqq0fnuq1Mc5jVXKr1WVZzdKCqzU9arFVOI48oK
rMVWc3NHdS6nplViOg51UXFd1e1zVWKuquVXo6A1Tz5VYqKqfVU6q2KgquR1aeqkZ1dUnqxZo1Ab
n59RR1W6uqpx46rlVItRVZq2gPdBGaro46m6B1U7qs1Ugm56qdOq0eq7VbiPFVeuq5Pc9Aag5qDI
46vdV+LpQGb5o6CKq246sqv8/NcWUFW1N1Uwq6q5VbO+ahquZzmyqmdV3KCqz3jq+qmUZqqdKq5U
VNQ6rlVyq5VvNV+8VTz1Ux116xRnqsc1RQVX6qeZVYoIj1bVcqsVFXmj2ueOpPzc1VOar0dxx9ar
vOfn5qigqtc/M6rVBVvPFHHVZNUVXTXVeqZiooqrxpi6DnNVY6mqOeqmLqKrLiOc9Xx1UkVU7dVM
FQVU+5qmqmFVKL56tq2qlHuc5o6qdZVcNVY5j1U8qpAq2LnoKBxUNVOzVPNV+VXarVVKNAufn5j3
VcqplFGa8qKjnNz9eaOojqu1ae6ipqsVUwOqjmqDRHbw9WUFVyqnEVVM+aqndVurqCpqzVVKFVmq
nNV26A9WYaq9z1fzc1VztVTWqljpVnbmu1HUzXe+nNUUNVM4qrd0NVyq4aqzVeq2r+2VNVmpq8UF
V6znPijnjRt4a46jVVOu9W1War/OeqmB7NRUHSOrVHHU1bVY7UGqCgdVPaqR+1V6o6UFBRT1Vg/M
pt1MfSgoNUFW1b2Npug3VSjQHjoJuK+1VPeaq7lVNu1BVTmoPURnvnugoOeoq8zi1QUB6vyrpKDp
V/Pz1WqCqzV1Vyq7VZqpzVZqpAqpysoJ6iq+rearas3VSk3VZjqyp56Ax6A9V6OqxVa6OPOap5qq
Y5fNzGoKqcVWaCqmPegq2qzVfqtVXai0c9Vyq1VZ5qrVn5sqpkaq5V/NV9WHiVXc1x89VuOqmdW1
fQ3lDVeoaqdVNWVU0qs0FXVX6uqT1Z1q7mqHlViOgqxXhqrFBVnSOq7VTWqnFReVXaExsVVuq7Ee
qmDju4o3V3PPVUxqKr9VMKqa1dVdq+qm23kfNdViqleq1VlW83MegqburoquVAagdTGagjZ6AzmO
Z6ur3UKq7FVYqpxVcqpwagNlBVTmrqmPnqsc1VPaqdVYagqpQNVYoKrgMeqkZ93V1V6rartRHVSA
brVboKt5j3VlVOFFlxRGoKrZnQR9D0CqIqGp6UFtOgVV6oznObnqaDvkWZlDNNUFV+qmdV+rag9B
G+jqDVWqrxqrFBVTHrVeqpB56gVZVTmqzHUVNTl3qpPVcqu5vmyr+k+o8yI3OePnNFUn5o1rKtiq
ypqKqZVU6joY6rPee3zc8SiXSOq/Vsb3lSarXUXFZ3QZHu8oKLxx9o4rvcd7Wqnne6tvmtZUxntm
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
Ugxx1WsqDnyN83NVcjvmPQGwVWaqa1U0quVffNFVZVxUcVVmqybnPzcx4uZvKmrqrNVN6qY1F85r
mO6fbLqyq2apqTHOaoPVTvn5mY9u7OerasqpG5+fms/NVSDVlWWd3Zz8523ZzVXolkUVHV9rmq5R
VYYZVe6YadyV83M4qjnNPZPZl8xuvc3MfM9MY9RUXUVZV+eUe57DR1FQfqY3fM0bL5qi6r6NVTrD
H5l7R7uoqLMaj8MY1DdRzc/NFFdGlV8XW2oqk2ZVeiNGeKoNz3HVYq+hqp7Udrqv1dzVZdVqrKr9
V2qwah5ormI6qUKqQOY1VNauiqvVFVmqzQ1B8qs0Jqsi7VWKqd85sqpxVh6uqb5qrtVNKqYVU8q7
nurag9VmqxVcqvRRVOVYeO1Vc5uapq+qmNW1bHdAfOeoqpjUqqzzUNW1NVOLqplFVTKqnEZ/asqp
BiPtVfzPw7jqp2ZVWamM8ctVOo83d5Qnji2z5UVbV0XNV56uqannjquc9XVWu9Vx1dVcquH56mr+
e6vVXXE+26qZnqsN4qrCmo7qunijvn2zc1T0OeM6q6zbjs9BVTCq2d1aqsw9ViPLq7tVTmKp7VY7
5jZdWVZMVUyurqvyI8dV2r+c9VqoqYr7VeqmoqpnV15z5GnzVPOaq4qmq5O3Veq6M9BVfquVXOaO
r6jmq9GqTVOuZVUwqtVXqrFXmjjqv5HV0VVmq9VprRqqcXZnzqrOfnSqTGPVTTmqun544rmPPIzz
MfNUGpBM88XrOeQ0ZrjqyMwmIsPeXs0b1mKLZ+aZw2+0dno4pYueoZsP9Nu+l8/nlmvDrnObdX44
j0SmIsWs5ozGW9OPp7SN3MRnqseb0eouKoRqjVTEmmeKrec13eXkeXWqD0Dfl3HMZh1m5upfM8fP
HFIquuO8qc7KPn7+mt9ImeLnpetxdo6BGfRSpmbdAqDnpKmcmI3NPtQ3fluzzcXNF7QXkyseGsy1
FedIroKBHiR9c0cWrijiN0vTN7F4p3n546irDUi854tTmjnmYuc189Wc5vkxzGvD7NzuhwyiZ6iZ
yLfaOzpRTsXPUOLD6i3fQ/Pry4rw65zm3VcxxR0WTXNmOYqIzGWb15G/U6E8xHHVYpN6jo6sPFUL
Ks1UxY0zxVWOczu8s0eH+1ZHQNzGfbjeYdZvyp1zPHzxxSKruc+VOd1Hz95wx2uY7PzVdS9XEo6B
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
yoWOKejqsXVlX83PURxnqLuPMuPtdBlxVcarYu2ulBEqrtWVdVYqznq3nyoyr7i7p2vIuerKiKqn
Brqu1WaigivIz1bVcqKviqObKCN891G6rPN2qHV1Bz9jHjqw3lDQW8TjjoaB9FnfntX0Od94vJ+4
4tc5ukduo6c/dmoGaM/TI+l4jLKA/ds2+ziXObWrSVDHR4c+IRUSoL99yJLypiT2dR8xsPcbx33o
H52oKC08oOZ6Pd+RxqpoLyI7eZFdTlWTBqvxRxRxcyoKCN0B86tVLzKDdBeN5k4agjUaUW29I/Sz
YzOPa50a4o4+d3l0HkxEquR3Uxro7653zr2oM6ze3Qniu6B9t86iUeKOi9ZjqM1zUWVPPtc9qKJG
P07O2eJ5OCI6zUdAzeM6jifPEbpHbqOnPQWbKCiijP0yLndmw2ZQH7tm7dr5ulSaLpq1ioY8o8jO
ZCL1UF++5FimauiTjR85jGPcbx3QUD2qCgugvKh0Fnu/I42qmgvIj21kV85sqyYiquGyOI5+ao60
EboDmUTypzHugoMts2PKCNRpc3ZvXaPpeZZnvnUWOKOOpZ8ug8mIlV0boak66Xaygzq6DKCZ26E8
V+XQPtupzObOcy56LTiOsjNc1zKrufeue1EeJRR9OzOZOKgycYiWdHdXne6mq1HQVXb8dSbmurYs
inKnvzVX6v2arI6GrTeRdV0xc0XNrZuaKq9Vcqu1XHVTHIvau56rCRu8fPQUHTrQUFBFc5U1Oqqa
VZVmZU2Ksiqt85jXV8dDFHhjLn5qg1THzGWGx1EfaK+eNP1Jtx893HQRxRHidVrmPqe04+eoPVdq
sXfAjxVUwdBuqmAqO5oz0B+ag60EWd6irLVBG8w1Vnmy+a+3TvQVN1Jm6tPHU8+c/acoD1fz+mPF
EqCgzTvn6UEV0HMjGijq1c1B0PV1WKrbuKzvZlzqzc/NQHPQmw8cTOt4c8aj5+Y+KN+3GbKjnquP
mOagqczI6mKK7oKB1b3j5uc2WerDVX6rbPQVfn8x1ZkRt1Xc50lFUUF7tx1B6Cpq3nq7DxnNFiNF
Ve56vq5XU1X6v2egd1U4q47PGaOh3zRmjs11ZZqrHPVdN0iq+pqO3erDc3WgdBZ85oo6rtV+6rFV
nKrtVjmFAueqnNVMYorNbqx83bObnqv3GmaJ+VWtZEqu5qqYx756iq5VnaPOZ5lTUVXIqGrjdz3V
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
Lm5ubmquVfR/KqZVPPFVTWKLIjdK1V3mjizFUbw3MbmupiKZQWdiOpyYw4v6Oeq5lXUeOcPUc2VF
WHqsVdHQc1VMarZ+jyoxXzLAUoDx0EUVXRYGdOpqtVZkUdSeOgoFQUERueM2LD0tRQR0GR3VcPVd
51VTgyz7GZ9o+cx8NkbqpieOrKmqm13eUNVrKjmq6p5qOOoqt5zZz3jq7vVdoKB83fn5qqcc3Mqr
VW0EUZqvj51QXQVHNzc6o8uOrJM53VTzndX1df3Io6s5qtPz0FXX9qb5qs0qvquGqsRVZVZirVU2
Oaq9zR81VPOfmF8z5+aKrfsVHbMZVJj3VlW91UZV/PVtVyjqObnPEq6WHu6vuLKrpzVWwagMY5r5
4qDOfmq02HqyrYqCos3PVaygjTqM3Qc5jUFVM+bSPU1CjPVlWy8/NG6BnqKsrmPlVMee8q/DYbrz
5VZi5rqpxMx5zVUpmx89Wc3lTVeRqigNzqgq2KriGUFWOgq+q1VtRQGNFzKpiiqy6rmXlrrHVZUW
M2quN21Fz0FVM+2Z5VlV4WeN1OhdRuLnq6ref3WRZGeqnVVlY+aq5VSBo+VXKvw56qfVWas1ur7q
p1zc/NUjdVOKqbc9VPss0fPFVSVVSlzVZs1moKDn5t9KqcVU3jHPUGNec11UqHOa8Mc11NVK1VJW
j3l3ajqpxVc1zUBiNVN+eqnFVIFTdVxVdLVTirzx8/Nl0Zz88R6rNVhRx1KoLq2g5qvoD89VNIz9
eeM9BFVuOJ3UXFUc9mq+r6uVVjzOfthjx8+lHVequVWjVcbKm+1VnmVVNqC4qrFXHq2p78+c/NUW
6tqLjuIziq2485ll80lWrPtTtn54jg9X/Xs1Rz1XO0VViq9VTSq5V10dW5ijUVTzc9m3QNOlq6Lp
V182qvq6rqs70F5VaWUFV41XVXeaMypqiq7QH590dVjvzUGVbzugs9AepPh/uFJiOOq5lTk5fWKq
/Uc1VmoqpkeqxVx6uoLqsd+arD9Ha5qiM1XVU4q6qmsdVyoqsupoLfeI1xVb9PH1Pzb5uf71quUF
BFQZQZnMa8jPzaNls/bCguqzVioIlR1Uxyl71j1Har+Yzuq5FVTwyqumo6Oqm1ViqnVX8x8Meg56
uNQZaVbWm879VS/8bmz1HqTUC5ojRXHEqvqaCuegz63EePvo2Xs3yKgr81lKCgNQVFBFzHNerygq
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
mvVBVs5euZ96DW90HV1WJhH60HToQqL1rO+e0BsxxVGRI2J9kvoKav4950ijUXNQ71QVd0ejYuc1
BPG3sZHvWqFdPOuUOaNXMa7vDGqVGqDpV1WG9cWKPsYgLNanIj86MeYUUXTRsvsqBZSdMiMn0fvb
HnPFF0jjiSy6CPn5ubuY+Gu0+u+kTt96g7eo4tm3Ge4uaJI7fNzZ2mOnuscUb51Hz48TZriPHQHf
RYagoDWe8tZna9LKGavZ1HQUB7uY903MXi5zd6XveUhoj21UxbepzKmoT8VAZb70EXSU6iVTFHGe
0fnjVnygjoKD2jj58imsoOnea7nNUHoIul8/TtQ0HMzO9ZzXvtUroyJnnPmXMPNZtc9xaqYu3e+f
LMxSHxm6UBzvRu5rXY8dBavmpFfRvKA12rzSPeX1oOdxd41fPQX1a57Z32SNZo9tny/NfEbOud96
6UeHoDHfPuj+adAeI9B1Xztrp3w+UF0Go1QfyU0sPQGe+l0GHi6Uvu6FRxLWvtLEuePtF1NFuIzq
HUxpG753VD0x1Bk6mPOc2ULPMXHnNQHjoOY1n0ahPtdKiKzXvSfMqD0167O12kO6mz29Z3W/m1fT
135QKr17tmoGaoifScP0q6JZG+/VXHfc8cx0WvMOzc8RqiM98xlz9nHhqCg1i3Zu2GMj9T1cosiy
z2fv3VAjUnSd6RLF1xqKrKlmoFnzXZRXs9L/cW+cKKI9TH0jy3zRxZQbjMZRKJZMax0GNKgoLXfO
3bdsx3tXSEGzRX0i62+nbp5qI7j+pdPcTVfp2es7HyvZj2UjpNOj35HXMr7R0RsqOeK6ntdpUi67
pJaXd9NvnpTmWRvnPfsfqdzhu04+2jZh9dFeeprd+UdHa8j573ZrS7azMWbvacktHu8vEn9yL2/a
BUkv1ZlfvRvVAl0ZHvOXMzjpNdFv3oeLxc/lnx01xPUx68NeseLfbLo1MbV+kJpxRXO9Ikc76dun
muY9xuXF09ylCaXTs9Z2Pm7MeykftJp0fbcfhA3mX2jojZVnPcV1Pa7oEs60kstLuYP03fPSnizD
R3znv2Pau5yLU49GzD66K897Rrd+UdHeTHPzuauK1nnYazKDd9svctHs6vMWP7nN7ftAvNfczK/e
W9UG8XRkZy5mcuk10W/TxeLn8P0jy6bDxOanJ14Y/TGn2y6NbVpdzGM3gR43UM+78mLi8eUcz5Vf
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
XdyPS1PzRj5bw5ta6J9MmZ7JzRqBGbiu9HyWjduSRo05cwzM2GxfNab3Fd5Pc3bV+Z0VBrRpmOLa
1d41l32nW0zXccVpPJJTxbx471z34er90GdlzdYu2UM9LVlqUpUVFBEeqnXvUjQ1HTn3rt267mem
YYzzomRKqg59PpbRz4r9uenIu2ZZ+ivXSe+6Pi7WsM+ftbqD4bJdbb1fTG7tG6N9sqKlzR/Z188e
Xza78+Rc3Nnbm5z7jjvTOn3zJqzMx4+mTCme3Ms9+0GWfKI+NWRzXTv255p536cz1rN531h8M4t0
PNlDeRY8yXnmo4+lDKsjuPDLq/Dn7UF47wzzF2aRtm3z89ugnKA1BFMbfu776dBMWaYXTepjDTmt
HqypXOvk5QN66Ts5Fz8yqaHqqsyYOZ2r7I2OaoD3FzpxR2p7n0kfp2w2R3naXfbMO9YtTgtPaup9
SijaeXkV1Y7mFqojGWPuKoMYRug587W9Z7QHvDZQc/MFUiLmtznbmNi6q8uLXTpCaDcxOdLjzpMY
zGj1fNz6znqO7Mc5p3tY5ufrqpqLjxm59d7wx+07z82vO9Bqg5ud6DzUfadqOf3t4bOxvnSoifb3
Oq53FMHvuZZfaYdTzKJH6d012u4p31eUXaomoo+1BUG7bPEe27WqPUfSzVNmbZ6Dv33mTMxpJOao
ObTmH7kxNGNU1buLs1mr5776MY76OoS7XOZijMZM6byI9AbtPS89rmj135zPRnzaBqBc0ePnq7nu
+i0zqg79u9BmdNWlU1HO6Ht2qJ2zXF07bXTw1TVYi652s7VXdzRRnRlHFfao5scWTO6BxTE52PzX
1PbnPJzTPMD1dI06136+2dntetN3rylz0xl1bNXWe5k7bzLd4prW8PHVvMfpPUXf2fi3ib7TkwM0
cxu9LqcSpXOb17OHmJwyvO19MeZ0nqTWK6Lrj6Ly29Tl5lF2oddrM5rnXna57tktu+mTS0qKjHSM
5jKOPbSnJmZebl1Z5pZ0tH7dHOJ6uW/Zh6eXOTGW9zmmeYHq6R4n1irX60j526Peae0+l2/KXPTG
zqzSrPcydt5luzKaeH56t5j9Pe/uot9sTfZhTmozG7vU4kQ3fuvZyYnIo1edj9MvMdDSaxX1NfRe
NvpOWfMou1Drszmc1zrzseeZpTu+mUK0qKjHSM5jKPnTSnNTLztLpHj2stXOI/bo57PdXay0rzpH
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
bG6kUXot66j3dqDMeQNHYBr48GhBeN971BN1ye3ceqT51G31QIN23ZyxsbqiXFPvZVFMIaPCpX1U
r/Oq5j2yDKiaarKVaqjuq9m5ByjOlPehSqSrCmCicvajSpt27UUY2t5R/NFylI7KY3dqKVQlJ1VV
aijQUjvATQTSUhzelltlVcviCTdV9VKqdVfp/Yzvu4Uo0DMfXf7RFScQeOXVTehA5Qt5RBlJuow3
amuDe0KtlCXHeqtqm23v0kDZ1v3a8mi9anQUqjs57TbNrpTDa2706FU1S09nZ1MAAf//////////
9CoAJbABAACAkf87Ef//////////////////////Xwf8EEqLZNqqLrWgujFBf1HyXaXd1JNVFraJ
S9VAgva98YO3nM420JNf3ChbtTlDlANOyDaVBTjQpVCBF2aDZ2Ss6alSNzvZVb7Sp+UfqBqa2tsb
M5tRsePcqudFAgav32ksyqcbN5/k+IL2llScbO797srQtA51u32URSks0NdR3LYO40oOtiuUBUWw
5QqrN4y2+oqm7dFQcobxqr9l3Kg3oFGlGSzZ6Y+4hr2ujtUUpXja2IECiDerrzRZ1R0d6d+gQC6k
qDYeP3QPqBAgQeOoEFGpN5q778qLm2+/0V1Knym17zVa6KtWUiCUq+6hk3K06fappLUWpupT7bFt
lIoFsXa6j4pur7dTaWun3lRtvbVqag29QOVY1NLYrMpQpOqSknKqVb6pqiqG1tpTKanQo1XJrDQ1
NLS1UdqDVJoaZVAwS2qXZ+vVKByh1fKqZl75+R/uOQlLbYXJEqp2+c3nGeK3aimd6jd47xyectZB
lqidauvKGIBP59HOXcqXd/D/yHN75G3kH3NBfGBS2G6DuDa/2Hds2Uxhhv1XqC4T3zsJWicncJvq
qzWZXrQSQddySjKgzb0Enb3z+oJifGCQST3QD86iQV2VF/ubDbkrv3rzr97hztr5zAL76CFjJztZ
BnewU2lNxd+vsgcaJr5shF88R+eOw22U2HNl1VO3fN5zjzrNdqKZ2ZZ3jvHN8laPtqi961deVuox
ePiebuRvl3JXquB/JDl73J6+PIPvdBfGChbDdB3LUv82HdseUoYww3nTQSsT3zrkrDk7hP1VZrMr
1/JB39qC46p/yF74g6gm93fnyuat/nUSBlZUWYFBttd+/zvev83Dk7/MlgF9/4cjk97CDO9U2lP3
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
1VTiooKBVFV+KzVN1W1z1Ednqt1fVTiqnFVqq3FzHPV/NHHUd6rp6ipq3moFVaioMNzRHqu81VOT
UCqyrsjqprUx3z0FViqnGVX8qvZcV1XlcVVMKrDqsXU24756A9RVTDIqqc9Tc9Saq5QRLI6kzMqr
F1U4qpwjVfVTnvUVfUx2eq3VT+q1VlVM+6qp3VTOpqyrqrlVmq5VSHU1FVMKg7qt1XdRZV5qrdVK
lVt1BrurqqQzc11WjVZVtBV1V3mquVFVyqmR4zZ2q2gqasygqpxHz1WuY0dVjDUGsqpAqp5VTaru
l91QVU45rjyq9lVugjq+qnd1Xe1RF056qf1Z2qpE68+czu6rNV6q/Ea6rFVipqp7fNNndBHUmq6q
mx6k2RVJqvq1ZJQ5VaquVWarlVnKC1VeqphVeqtVXsoKrNViq5VSRVfq6gqtR1NQjVU4qpjFV11U
wfWq5U1U9qppVZoKqcdI6mq1VTI7VBQZo10Diqs1X6sPVTmqzfNVTuoq6qmVVmqnFBUUFRU0C1Qu
q21VfqphVdqs1U4qyrqipPU81Vg8dWGquVXoqiq5QUHPlXnjqprVlXH6VdQVHPFQR3ZlFfSLnzsz
1CuOgoIsyqx0qu1Wair6jnqI3Vc53VvXm5qvqTurz1LNV3PVbq6r6nmjqaqYZUmNQZzRZzc13eVP
a+1Wdqjn5szWt2qA9Xxnq6POapvmqy6CzVZV1WGq64otnbit5rtFU9fSExEtx1dzRdj4fVB7Vcj5
7znzvVh6uPV11ddW8/P0vm60FAmc+Rc9BQc9RQUFLjiqv1bVsZ2m4+eLnOaK4jxHM+7w9p3z3V/Q
x46iOKrscboKqcZVY71WDR8/NQUEfNUx81BnfLq9c+HMbmXerqCq9dTVZjoMfSgq1d1Vho6igoKs
VTnaOg3Ra1QYarqmOq9VTCqmNVO8ijs1Xc2nzRndSqqYc/fnvMqpm4ud1UxjNVyygqboOk9V/p7N
V2z7qzvVlTUZnTW7VAeq5Ger+eoq66irXQM1W1fVpquPFE45LcVvNdoql++zHMtx1dzRI+z6oPar
vPUm58VWx1cernV11WOfn6Hvm60FBlAePObnoKDnoaigoNp81VOKrFVmO03z1dFUnMa4jxHM+7R2
rPz3Vc6xHjqI4quxx3QVU6yqy6rBo+fmoKDn5quj5l3RrquLnw5jcy71fQVX7q6q1HQY+lBVYXZV
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
uararhoqqb1U7O6rXNVTnnqaiKPdVpuo9Z6rVVI1Vh3ccd0Jufnq2q6erDGqu1XIjvmi73HVfOao
qKqfZVTSqnZ6sqIuarqrtVrKiKOr6ioqD4Z30w3epjyciq/Izx1FVMarWVdVT+rvKqQIsqppR+Pn
5qsuraqYGdRVp8q8xsqtvmiiiiqtVWjHw2bvOe6qYVYqrJ6Dm5vamoq1nNUc9XnNVShU1BqsNVdu
piq+6rGRVPsVBdVurI6nmPHUVXamKoqaqd1Ugc1TQVU+qpnQKqnEdXmqtRnMe6rxrq9Vea6h1ZVl
xVXKqeHoMypiVTH1qphVeqvs1Vjnqas5qqUKrVVw9V+qmUdDfepqaioPVb5sqKmzmqKipqTmiqKm
q9VevrFVnNz1U/q+r6rFVngpVfNV8+fod2bIqrHlVjKuPUxdarExFdXR7fzVVy48Z6ioV0HU/eM+
GjijaqzI7O1z5UVZl1U/qvVNVPpirjVPOc/c65kqr/hojRVYbKiLtQc3iyq5jvS0o2bJczfZLsfx
+RrHT2dnUwAB///////////0KgAltAEAAA+tohUR//////////////////////9xZZul3F5OX6Y9
TO3MdsdBzeUcV6Mrmat39q1x82d+b1z2KqzPNWbnuePHHN887mG61OjJHiU5OHw2KZuONc99qsWV
cfrEczis6iOrNF5jjzmiOo4osR76G56NYa8uOq6d1NtmztQWqT3zJjp4b5zTq7TkUXNUXHdAczeR
YQTez3kcdxs7RmbxdEzZLmbVrufx0UZ0nfMazPV5FOT8nsR6lHmHjdR5R816MrdVjf2qw+erM782
2aeyqzPNWb3nuePH5UzuIzqdGSjj5p6cnD4bErj5+e32dWHWVcdcx4qCK41zHVmi1lHceVER+3PF
zZh76GVT4jRHNcdV491NtmztQXnnvmdPIqWon99pzmiqKg8d0BzNmizpTJ2c+Rx3HMynaBqlXnOq
ttdeeooOfrQUDzcdn30oD9DdT1blA9dlQR1Y+ioMx0Dq9WebjqvxXhmaPnqp5FQHiNVTDIjx1Wue
I98+VWuaqnNRV5olVcuqnlVMUZM1V6q/zxHjjoFlX0HegOe7MarKmOgRsq6q1V/NzxRVYnQa7UCj
Oaqxlx1W6uqFC7PfTDVd/ORZedemXtLO+llVOHlnXa4rOokagoLoOarDGqe/MdvSdQ+tmuiisyMu
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
nypqKrZj3QnoObDx96qcuqmdVKVVPqqaVMc1VT2z1UxqphQJTFVOKjmqu1U456rsUVV2oqKrNRJQ
VNWx1bVT6qn1VjDVXY6r9W2qC6DmugqKrmZVdzdVvmOY3PvnVVMbuqmEdWxd1z86iqauiqtGyq1V
eq2qxVfd3zUEbj5+bmqIqs5hdWVWN1U5urIqrDPVcdTzR0HNVidR35unNFzLfyz80aoYo7u6qcdq
DOaoqebn3Fz89WkDWQ5qmpoKmLmdV+q7VTWq+6rnnNFhjLHz2Rw1nqYkll5QHPG4u1RcSoNMo6h5
RuhcVV490HPz1WKig5818NvEdCpiiqvXQVbQdqiLm3rt0q6zxGjjdx1FxKrKqcd8qphzVfFnNVZq
YqrFXHqTxurZI1h6DnjPURrpUHWRxYfZj96vjjoGueN0GXFUVb1j71W4+apqyou6uiNUcxqvj5qi
gq5KgdXnozHjs3NzVfVbNHV3PQVNXVfFV6Pf2qyfms0cUec/PFFUUdVyqnMdVMqqYVU4jpTVfV+c
1VzmqsVNVg1VMOaq2erKjOaPn3F0XzDrr1Mc/eKraDnj+fOlSY/Mt0GdtaOqA8fPcXarL5lQdL9d
WPKN9nzVXjnoIlz1NViooOc0hu2K0Kuiiqv26toO1RFUR71211q644jR87vnqD82VbVTmgyqmPNV
8WVFVqruaqzV9XRx3VYkjWHqYz1ZGnUHRo4sP2iP3quR89A85+d0GXFUOraCOgqphHzVNW1ZZ6Cr
ojVZzGquHiqygq7FQOq5G6OI8Z4qsqKvVVuKOrql1NX1fFVcUd/arUfMc1x80ec/PFFUUdV2qnUd
VM6qY1U556U1Vyq4qiq5zVWeeqyaqmNRVTDI6tqzKjn51F0Xw1rOpjx94qrFBUx/PjqYj8yWdtdD
80ds32jjqJ72o1zvwhV9XdoqndXGyr/T2eXtQnoIo+aNx1WnV2Hu6BVWz80UwN0UdVyPbuJ1bVTA
6t9+c5ue46tquxnqypqsmvdVmq6fr3VVzOazVu1Wm9yh5udHqu1afS6R1fkXPVajyy3brFHzVWzy
rnw11WMmikW656rF1efmOarjmN8qygZz1ce6luh+s5jG146u9eS1XYqHPsTijPmVWLqs88SbqtKP
IuvSrL5jRmzI6k9Xcz52jxy1WTZs9WeG7qrKqcOI9VmY8c1U8zu7NbMKvjqp9VZ56rNV2o1Us2R2
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
9T+X6nHl6zDZQKJGocjuzxGOeI7PZua7eWo5mZuj87ynoKC6Ghi56CTZqud25ea6Pq6Dv269MoaH
KBugu+9B2PQKPLd1ZUrnS57FBOmdHffO13JvKjmXZEHs8Z5cyKTn5s01NyYo+ZXE7TqKCpvphjdZ
t5R5camb75iu8dqkpLfzrv78U4qTIp2cuXPZ1rJNmvXbOezlKTG0a9XK30bvs6Gj1LnmnfmZme7d
JR52fsniyjou2nQzNA7b3pemN6nO589NuI/2fT9OuqxznWJyVGPs5Z2zmOZx98b8veTBhSe5qgsZ
0GmpAfKTZ387faPJxUmRTs5dPkyJ17NfTXbOe4ylJhRtoy1crabvs5lUevU5we34szMo3e3nZ+0k
xMZR0Xbo6GboHbe/VNThjTic7kvpjbiP9n1QdfbnOv1Z7OOJ0dRlszlnbPFHjj743avJg1J6bNUF
w6hNSDLb7e7au+hl0yoeZ0XfpvMUeX2TfVKeonRHPVYx79u4qrtVjrz+VW+bFFUVF9Klx9qDnq7H
FjFxKpnL6aq30980dxPIs6+xnB+Y54sh0ipI75zMUBzdOxvQarses7Cr3uY+Yj2g46nka94oouw8
kNuV6sHx9+169O7zm56igq/N+c8dqgMsPnTH0PHV1XtxVDizmquxmqO3NU+4s96XfNcVVi+Y7fXs
N5337QdKip9924svmj0bt0jdWA+R2ao9UaZu0V+HPFlW8+G5ubnqcyWKp5uq60F9sNVtViY50a8N
URKrqDniyhzm72feI5rq7JiofeOLXlTRVDvI4vOackFVyq5VcpH0iWje7cV813p77LteR1dzd4qB
HqLoObvFVnOY0fSjP5QXV/Oe5fOxjd+95hupz1ZFe6DHGqDM7VZzLVvW6Cj8q5yxbnJNd+bMZjA0
dXZZrUS7Rc2XHVt5VdoOe6uP2jnOacvKvvn32XarIuapjw6zdBQZQR0HPFUUGG9vn1UmqydTv2pq
/p0iq3mvHlTzxHi6+m7RVfEubmoKCNm5ufniiMeOgoOfrEegoDc2WeL5Vs4j82xF2iyrtb3Fz5lJ
nXfgy4gacvd9Fa6Uew+mRs6s0WTlRVnfPNLPXaMftVYg2bGfvSDpb30oVlv70fSj+a7NOSjr9vMa
XmbnKDNb3Me+LrXQ1nfU463SI0w83mmbSbf1T8zRzFzi7HU7pa3rWt5rNx5uZ8N01njU4lu/POb7
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
k6ryYsmTmDfScPPctt7u21sefP94THSLa5xXt9vcuS1uJ/l0A1t7FuXycv3wlHNluTc3fuStnaTa
H/3iUdYRf9efL5ZhHMdOd9HkyX5jdNcqiXnT2h6vLt9ShrFk7tFcukZ1Vz80o9VPD/zx0NHf3Wfr
p2mxsWPM03WsObas0nocunid57e/vBl9C7pqZU08bocwt2tDzLcHY+pp6DRLnObeHDB7EZ28+dHB
fmIKcxld05nJEBbDXcbUaW6Y8gwelSihwEEIL3HmJnp2pHA74unjYY66q9y7CK981s6zpdhO1ffe
OZNPP9+MPG+fA2dd5kKN4S3LwrmoX1l6u3K/eGucBB7ceKmrnlFkd6/7ed0SyvOpI7HdtKl+96D1
WYY3w3gL27CnS7bsVhvLrbql4Rab6ZarOdVOTbNmWy51eM2rd66NX1cGqrZl/zqON82GNy6MbuHJ
v3u+Wj8+a1mj8RiHeDVq1Hm9udbmGC+DD3li3e2zThu9cSAW2/J029z/F5HO+2dj0n9RWZqH75+q
l+7RgJuhxAnFxrWliG3Y2q6pLvbxrYU9jM8elWi0iQuuxSdk6mnXR4dK77kg5/qm63pDwbRwoD14
e7CqfubfS4h7//7DX/eUT7t7dy5lpznP0rBrXrJQDrmJV5rZ8Vqd1N/s4VtdjMifPq8ek51BxvD2
ToxY8XSrtStu90RaZ7KeWPKLSMRfv3uFVzzMLtV668/Tr4e7/v00i5GbaezXv/L5vuTi+eWtxWj2
e9FJn2vKNHXfjz53rq5W+YwhmppttVhpd4bxx9SSPHNlz64Nn09fz21OeqnXqXX77g4w+4djhy3P
dwf90xOmTcqOuZ7k6tmG3YZYsy7zMkU99TmOpxRbMUgaHqUYcT0KQs2Xakjc0qGHg/0sPf+8dRSn
ELy8S6MflReNjDK+5mTo5qswWSV4iulivjNUq5uzZLS+h4t0P/9txJ9bpymmHyfy+KAkDtPqv/Lh
5Pl4uzK7jna+b745FlY+ebZfDsr66X1nfNG3V8z48M22/fccQvbhsWx72b812j+XPsfEqzVMm6nR
pbPW7qtZmz//2EYbzZcwTPkafpEnP2btdq/Z2kNSYZSjW+Y0BmN8rLi5vd96mOeIv6GDLcX2aL/r
juff5U1Lqvm4NkPyXsXmTtNiVmLJdb0Y5aj0dB7ClFyHHR6lGHkqAB2OxKlbXahzOKp4cFw8tR6q
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
sVZUmOt6qpi8ijPVTmrF1o+tVM6uqs7N01h856jVS7qVQVFRs8wqrtTlDV9WugMsq67vKuqEd4qt
ygqsbygWqtjjoIjnqsR1U6qpBMaq30jqp7VTi8qs1bHlBdVM6turc5qqY1Waqa1WIueq9FVa6c7q
pzVaoGY/aOq/G6COgx9IzVXj5QdjPfZGqpzVzw1X1WIrqp9j5siNV9XmVV458Rjc+VUwygNHeXVT
3pdVM6C8sxqDKtNVYiP3qpojVUo1UhmVVOcqs0NWVU0NVfy6sqp1VYqu885lVKVVvyrLNe4sfPVl
WUFVmqzlVuc7HqpvVZjiuq1Vcyg63HV0dW1ZGbdTHzVWzVaY981W1XarWHquR1EfWq5VTq8dVI1V
IdVItWp9EerqtdB0P3qvTlVIFVMDKYqpBqpVWrq09VNeagq2rul1ZcdWZzOOOgqpT5zRVEdTi0qq
e46tqv3FVSBVSnHFVSHVT6g61UzqpxQmqygzHVlWdKqe1U2VBVT6qmnVbdW1X7NVTSqlE1VINVPn
1qpnVTihoF7nNdV+guPnoKrFVOarFViqnGXUdasqpQq+gugqp3dBVShU1NQu509nZ1MAAf//////
////9CoAJcEBAABpBsqgEf//////////////////////2nHQVWTmq2rqqc1ZQVNWVbVTeM1W1WDG
q9m5nUVWsoKm+/Woupjsziqps+y/q6qUqqY3lWVUqR3dBVSFVT51Ux7ZQXzGq6rb7ZzVU054ufDV
Uw6Z3VVIMdVirVb61U9qpzm8uqlbqlQZdVOaA6XNVby9VHaPL2ar6tNajimaC49VUx2jqequVOWf
mOY6Rrq6q9VdzmXOepuqmHfHQ1NV09BbjNdXVZF2fNV3NPUGUFVo9X1JqmJ9qmo7R0HNQc9TVtBz
5zxmiq022fM7znP03OTlWc3nPVfiN8u3dx9qszfSg2zVU46PKrVVw66HRjZVaR6qdXVaoKqdzNVI
VTUbyKPnby1QVZnaqxh6FXVc5qv01Vl3fXtzn5qjpVaq6retVmqnFVMFV1T1s/c6q3KmqxUHqtVW
ar1VuqnFVt1U4oKrNX1XKjKrnM46scb54umX1qyOrardVOj1XqrNBVayqnCj5zVU3vmZ6r1VMrPz
1Uzqp1VTCq+qjtQVW6rna6CqzVYqphVTKqnlVM6r0RsjoqCKqzVevmZqDDOOodVnKsi7uqzQR1OT
BryNqrqrUVDVa5nlBmqr9TVZq41BGc/M6C6BVXKs6Yu+VdVe7ZVzZqCqmF1fdXGq64ux6rLjoOa6
mrqtXOapjNFVYyLs48zvPVPTc5OVZUec9VOIovl27uPvVmb60Diqpysqt1XY10jURsqto9VO7qt0
FVPd1UiVNWds5o+d2rygqw3aqyaN5VdqKrnR0FW3Hd9e/OfmqzrVbq+qx1qs1U5qpiqvqXZ+51Vu
VdVZqOp6rdVqq9VTCqnFVu6qc0FVmq5VcqzKrlQ+erHG+eLrjqwR1bVTCqnh6r1Vugqt5VTnL5+c
1VNz81BIeq9VTOz89VM6qeVUxqvqrO1BVTCq52ugqs1WKqYVUzqp5VTOq/EbI3QRVWar11DNQYag
jqx1Wsq2KgqtUGR1OTBrznaq6q1Fuq1zXlBmqqcVdVZq4y5zn5u1BdAqrtWdMzvlXVX+2VdHkVWc
5qCodBVqoFVdOtt9LyqmFVIdirLPVTGraiLmqurXNVb5ooqrtXVU5fN46qZR0RjVX46sNVlV/Ruz
qKi6moqKrNV/KjWRVfFVcqvVYY6Z3QKhqp1VuHqsXlxR1f1q5Gqs7uKLOvagqzIquyq7PNm14agt
0FV7nxI9BVZoO9XR1HZ856igquUFW1XqGgqyp7xVfdVqqnqiV9I+fD1XasoFzR5mUM1z1WumUE9H
UVbVTOgqv1U1qaHKqUsqTR9Tp1Uwq7rzVXarMdViqndViqmtBFHlVK9TVTk93fNVlS6t56qY1War
C5ss9BUc1X891U+qatqpA53qrKvypPVbqpzQVU9oDVU2yOqmCNhqrDjqvR1W1VYMo+c8WVFXVWqq
eVWYuerKCq/Vc5qqfOraqZmqvKoqvVfU1dV9AY9Rzc9WVNVug7UDqtVWqg9XVUxqWqsdXc56rlX1
XDuOq7UnNdV66rnNVcq7mxvKrPXmqsUPNVYjurau56tvn5zRVJ6sijs9BV8ffm577VXKrcVVK9VI
HO7oKsdQebqtm5qrtVygoHHVaqpXN0qpvQRG7c1BdVNqDHijcR48qs1PTnjiqKsPVfVRFVdoMiqK
qY1OVU6VVq4qrfPzZVY5znO6rzqvs2XzUFWe1brnXNVTGgoMbPQVNVMYqrzqp5z6vKGq9VeB6CKg
oKtcVXZ0qu0GVWquqplZqqcVFVIdVOqDOeooKv7Wbn5qqa1UsdqCqm9Saq5VlBlW6quVd3qpr2qp
XjqsVU0qp5QZzxUNmqKvq/vHlBVSDUm53N0NRFV9X9qqa1bV9VPqqY0BqmLn5lVZxHNQx5VlXXdR
GueqntWVU6qppVeqsVWufmZqqcxUNXGoMyr4uru8qt3UqPV1U0POROrOa6mgVRVT+q/i1FcVV2oq
p44qrlTUH6Kgqpwfo+aPOc9Vl865j1U5VBzZQZVcqyrMi56vqyOqnGRYeYqy+aPOeqmL5o6k/eKo
ii7CI9VNqCPm5quyOM/eLmqTGqc5zVX+vPjqtR83PV8TqDmquXVc5qs6Z1iiyrqqc1U7qpSqpueo
iyq7z1ZQVdQKr7qzmqDXccUUceUCMerIqmLUVV49RVciPGdUHY7WVFSbnq9LZsiPGqJOqnHWKKou
rqm7jWdqD2e7UEWXUZnNfNV81U0DqygPHnRtxxUFBVlBi8oOavntmq4/fOeLnyrj1PPnNnOfIlUm
qum6VYbIuribivmq6Y5oqrtXVNVmq/VrqarFRVTg9nqKjKB0B6uuq/zm1HZz1OXzaj3d1WbVBQRq
g5rznqOfnoea+uR0GHPFUI+VF1b05qvqu1UwqMq3Lvm5qmqnVV+gqphVdqygurTRx9u9Vmq+aqzd
XHq89Vm6qZVWasqw+7fapqsxVfE+c3XnoOlBQb3FVc71XLqzmqw0dBcfNzR8+UGGs9W81XRaiqvx
1FV3mPzx537HeKrKuNz1el2MaKOPsp2qnFBFzVF1dUnw6ztQez3Zc2XUYbmvmq+aq5UFW0B+fFp3
HFQKrKDFQeUFRXz2O4qvPQZUxc+Veep585sqT4aJVJqrpulWGi6XzNxH5qu1zRVXavq6qzVfq26m
qxUVU5PZzVZUZQOgPV91U45za56Bxx1OXzR0N3VZvKBRqg5mapqzn56HmfXI6DI46GKoR8qy6rC5
qrlV6qmNWZVYNd83NU1U8qv0FVMqr1WUB6rBo4+3eq1VTiKqzdXn71eeqzdVMqrVWVbHu6mq1FV8
T58689B0dBe9xVXamgiqpzdVupjqpzVcq6z1U5fPVtVyLmqsVFVNYrvMuM10FAroD2fmboDVWDRv
nuq8Z0Hp1dViJVWXU1ffOnQOKr7qsc+RXQGqanmicTqpnV58quI9W0FVOXU0CeHuqnT7dkdR3Gz1
XKsdDfTMqv80eUBlHzUXPFQxnoYqrB6GqkWOM9Bfaoqze4qGavKqUW6rNWdqviyqmh1Q1FVy6r3N
kUXeqmNAepqyq/1q2rKBOqzUUFBHUVbUVXOaqnFVh7qpDw1V2qnEeYc8dA1V8aiqvX23VTiqwstU
FVOKqdupj1QGoHGeoOznqphUVdzZ2VXRRx1UxPQrKt6VWj8/Nz1bzc9Qd1fbqY4qjmmOfm5j5Veq
umNVa1hk7q3Lq+q4eoNVzq+qnFRVtQoquqznPQHq42VCqt1ZQJ8+VEdWWjRc9RVa56vqp7GapjuI
0dBkfU5quq3nyq8bn5qr+7Oo3Q1WKDvHzRI9SfmuK756CqmFXGPFVtAzc1WVcfm58PUXlm7XQ1FA
arnQR80dBzVPWrasvmiquc8d0HPnPV1VipVTlScyiqpwo+Y+ZUaxmqtVdjOaKM5nQZVdquUPPcdW
UF1FBUVY1lugoI6mqnZ+a+d1U6tVUwcVV3Ku56BVZVaqp1UR1fec3Pbij5rqv5GqqRKr5qlHqpjV
SDVTW1QUGHidXKq/Eagjq51ceoquxy1fzs26vqzKsq6goO+VNRQOgyoqcqasqamKq9VdNdBfPl5f
NdWVNBQRxJ3mc3PUGypqKCgvKrVX1XKmq9VTKqm5mapoKvqai+fnuqmSq6rHkcV87PLV5+eq5VaU
dVuoqzHU1ceram0egoD1XznypNzmqM58yo5uY1BGfpUZVTm6uqsXVas8VVOKrdWnNVTrD1U6q6gi
uqxcVVjm57q2qkioj5uagnOfI46tquVU7qpBiNV9Xc8dSaqmBrPdA7PQI9BQc1Qa/Kh80Z5zKDOe
PO3PvKAzNVdVV2r+bpdWaNQH55g9V1ruc11ZQGtVU6iqsYbKA8UVTVTiI3NzVFAu+HqatNVeyg1h
zOI8Ru2kfJzxVNW31y3RXGztG1MLp01QTddHlXZuJd6irDd6O6Dnzrh6r01fNV9XKK1UOO5rKDnq
p1z1aePniMZRXdXxH5jc65oo77HoMq5Gzrz3kaNlRlW9qrBkd5V1x1J4+x5mpTNmYc1ntG50zxdu
9t9D9tGeLmquXVl1fFZ5Ufn5sNHdV3LW7fNH0iiqIquxc81l5G76xUFTVj65nU2Rnq2py4rMmua6
E1TdXR0HRx1ZbPVhqrnOfDqd6s/Sq9kXPbqY3SXEZZFlBUx89XR3zxGVBkdTVYNVTjKDpkZnFHzG
30w+Tmsqatvrh73bPeG1MZqLp0e66jlXZxd6siq03fV0HPlBh6r01fNVcq9RHVWajuhM6npVTvnq
sH5+eI0SiPdXxH5jc+VEXOftG8q/Io861N5HQGyoyqx3qsmw7VXXHUnj7R+1KcRsw5rs6NUpn5uz
PQPpH26RWlUVXLqw9X81no1Hz1BjR3Vey1u3UR9IuarIqvzKlZeRs/TmoKuqx9DLqbI8PVZq7Lis
2Ncx9xVddXR0HRx1ZbPVpqrnOfI1O0DP0qv5FzndXRukuIyyLOtXR89XR3zxRc8RzdaC4quqs1WK
r/PVcqumR1VTCq1VTK+/NlV2roqtjVmyOpPV8VVjn5zVXN0Cw8eY4jVfdWOr4+1RzGq3nuKrarlV
qgq3KCPmqaCq/d0FVO6r5t1cqujqau5qmq5Vfy8uofPUVWTH56mLnqu1fzUGc0Zss2HPVYqs1XHw
JVAZ1UxjjjugoObSoMoOePmUdD3oKDrVcijq6Ogi6RVbU9MZuc56qe1X7q6KrKvPz3z1XqCpqasq
w/Mbnw9WxmNFFVa56jmiBz1U5vnP1q41WH54+kVTU946sqvc1m5+Y9SaqmPPHHVciq6q7fNUdObK
Dmqefm56k1XVNR3uPnW6rEdVIBquuq5nPU1WKmguq9zvtzVWT1dz5VTs3MrPFlTz0UbqvVW6rFVI
NVxVWKrvNiNFFvo6jOaM98yzmw6qu0FAeraCI1WVZV0fNE6s6RVbzUEbiw1BdurLi3lW1FBQHMdd
YqrmVb6ka4zYoufN3EjHuPpz1W4qqfc8VV7nqzmZznoKuiPlWx80VV7OfpVfiNzRKr+eq06jMN2o
DVWauoKrWc2VU4iiqYqrpqrEdV2Orebnug5rq6q1zZU1U5s5qCrY1VkR3Eeq1V1WG2oz9ekUVVIE
VVMKr1VMDqq1Vh3QG56jcdXVZVcdS6rNVjmqp3VTioq63FHnPVeyoj58nObO546rXOY3Oc84erDO
+eoquYaPKg1xRmizyr+lDFcdBfeNdHQUFRVTigquRUFBVZqsW760UdTV5qrMfNUVfQHu6uPUbw9V
OarWGqpjVcqvRxVWqtVV+r6rN3VaqpzQVbVcq3Kr9Aer+bmdVmp7VWqvoDvDVUwquVfVcqsVWr7V
NVyq1d5V1Viq8bKrlVMY6vquVZVTrKqf1NW1U1q4zqyr6rpo4z1Zjq6qmeVdlmPQVUjmT5qr1X1U
wqu9Y8VBFVb5uclQVFXbqt1BsiqpxzTHMj7w/NQHq580aPfPVcfOz80dWEqDO1WVJqrlVjIo6uNQ
G69KrlRFHV1XRHqsWa1aqvXl9IqrVWd6CN1U4qs89VioqLoKrNXKpdXGjPUGqartO6sqs80VV/v1
590FxO6rp8dlua+Y9TVdoI6su6tup5uc1BQc3NZ6rNRVtAd5HzVZVkXtBhmeqnFV2rt89XKg71W6
r3Wq52uZqT811fupNzxEXVaiv1vDHzv0jWaiZ8M9qKWpWPnfQ/ag5sj7xaMeg5zdamPmqHe3QXjo
F4uc9Vy6CLM7tXUVHMold2zdz2qB1ZUm70FSz5wIqux1O1fN0s8fegqFfXva7X2vpH0PFlnw1mNH
V+4s7x5zR0F5vqa85zRlebvQRPpzxRH7NOrrzVBmVX+1WdaqT2dnUwAB///////////0KgAlwgEA
AC/imlYR//////////////////////9yj3zZdWWeKKg5/KujM8i544862zXHFfuM56DvVrj0agU1
08NaNGaq5dxTkTuKLvHz28joNS0B30nFFlBpm5jWedw3btcc3Un5rq/vUmqYk6rfMf1vDHzv0jWd
ImfDdphRaqVjqX0P3oObI4maOgqTKKpj5uZ3vvQXj70FBznquXQRYu7V1FRzaiV3bN3OfG6tqTUF
BUuPOBFV6Op7Yfm1Z+egoKsw/Xva7Ps+sfU8WWfDXhjR1fvmw9x5zR0F4+prypijK83eg5r6c8XM
fs3V150eKqnHerOtVOUe761GXVln5olz+VdGagyLnPz51uzXHzHnO9xnoO9WuOhioFNdJiK0bniq
u2fmnooncUXbn5z3nPQa9oDvpOLKCas3NFcc7hu3Wps/Pz5HUUFxVXKtquVfVa7vD0DquVU1qpzU
2cxXKuwx5y46qcVesyqxVt9at5qqY2e6uuI9FzOqmNxUJuerOd83tRHV1XVW2c9Vo1AeqxnctVlT
VsZ4+aOrqrlWVXY42quqsx4qqZdI+c9V26rvPVYqKtq+qzQXQXQR5HV2VOZznPbjqppFz1UoR46r
K58qzFQRLcXPzR1WubmjPHzVUzMbmj51z85jn5+Y11XKjm5uc2GoO+OpquRXVajqs1XuegPFUnq7
mqt1fVTGOr6irVVTjHFHMLKDnq3mq66sqw2c+UFVNKqeGyK+eKgqT1B8qpzVftVXmfE4qrmc8fPz
c1VMXVvNUc3NVTA5qrWbqpnVnPVe5zVXMjiquVdQVflTFbqvVdm+dVFViKournU1blRUnq2pTSPV
Yuq9V8dVNTVNVirLq7KuPrHzRVFQzc/NZ+fsZxdnUROpqtK6sqKrUdxxx1X6mpPVxqCKoquGPzLm
oD1UoVbsOLe+fuV586zlX1Z3uOrLyqnlXVNQj1WqqYZVcN+5jx1fU8196A8eUBquq/KuquUGGqKG
q1V1W4eq5V3NVb3z1Xu1VmqmtAj1U9quc1X1Xak1X1bzVfVd5uagqu1XKrJqqYc+VWD2qqeVXuZ0
VVrParGdjVX6rmYY9X4aq5VbqD5V11UyqpBt1N1XcdVyJRVdVl1U4q2q1VsdWVfV5jJnq+Opa55i
rLi5+9DVd7urueaqpj15qqdVeaoqu1fVYugqu1aeodWRuqxVpud+R1dFHQVXIryq7VnNVdiq2q9d
VupNUnq6oyOrKnnaqxqq6SqtVU0P3quVU9quVdzVW6sqs1FX1F81VMKqZVWe56m6s5o6qdVX6sNQ
9qqfR3VbqOaOgquVU+quVO6tTq++aqmFVMqrPO+91U5q6pquOh544o+6s+dak9RUm544meq9zGqv
djc3OeKgwZTqLLxUHPVeqsUFXVFX3V56dXHz5UHPhzxc/M5jDGMagXPQcy5syPvzVNBVdyq2ag0e
rIqtupiizDVUyj7XzROh5ueKq9VZNVceK4oj6qe3PV9V6PKnnqDLnqsrolFmZfP0iNd89V6Ir1qa
vs0XMqk/PVTSqnlTQGNQZzc3Pz5zc1RcVXVbV1WVEaqpwqs63UVWqqYnPtrVRz1Zz1fVYyNS83aK
93cXaI0dWVKUd3pZi8MZ30y8PUznayRI6qH7qPmy4oz6873qPpFaUTjd656B6yOLn7c8WHqYjRRM
y5sOu7qNRnOY/TIvY1lQ+bv0ejRZ4bne8j9qzO0V5s0SPSpOr+lo16en2TqH2pumc0Sq93NGdx0q
6TNny6rfmyVXxd6DfbpU1ZU51yYonLW12q4tEZ83NUHXNmY8ijanj1Jo1VY7R0F3FkWc8cVTHm6n
UeOrr69T5Er5ouq7Oci5ormac8WR5vm7xPtbi7EIjR1bU535zzx+iWKkoDRO+iw9TOdrIU51Vj6e
6jqMuKOPXiV6mo+kRjrIrjec9A3kWufvzVMWHqeY0UTMuYx+7qzUZzmt5Eo0aofkfNQdHo0WTBud
7yP2OrTd+a82bmno6VJ1f0tGvTlvajdRfam6ZURJ1XLuaNbjS1qzmuqmHm61Vzm70HbvMVNRUjOu
TFFctLrtV5aIz5uaoPlRhjM0Ub6T1XGjmKrPfnoLvmzmznjiqY1up95zUtXX16xmiy+aLquz3zc0
VzNOfmzqrq+goKCgqpxVdqpvFzYeq9VzqtOqm3NQK6kx+x1dWZUVZdXxdz5QRZQGXWo56Cr426Gg
i2ar+eq4ZG7XVmXQXzHy6vqptVi56EHqHSTnNzG5tHuq7z1UyjzKjrVTPmqv0lX3GZ1UyXSqndWV
Wo47qMidRQCrkmqDKCOKNqqmNRVlTV1WVWKmojVVyLOegUdV2gqu1U6qu0Ed0FRzVo6nVW1fHVp1
VajqsRR8/NUuqxHUGPFF2w1VOObmqpyup5D1WXQVXqvyPvUVU4xVWbUUuVYzHoDUNV9x81BQRVd1
7Z3T541Fz26qYVWuY90EV3QVNVygvIuegOUIx1UxqT4cx44z4agq+M9VIFX4fKCrz1U1qpLq6q/k
WVdQVXIuaKhR3FF0qv1e6rDq+qyY+qrhqqQKrJ7w81QOrj3VZqpg6DKA65opT1U2OZHqp7zR0Cqt
VUwqKqc1X6g3PzVXJh1BunaM56DujG57oLqtXFE+a+9V6rz3V1TVfiqyrKti5nXNQVNV9VHjOaKr
Yk6rDygNEaOcoDZaq8/NVfN3qp1VsV5VcVx3QRXeR315o8NZzHqw1VyrjnNl0FAaguooOc1R0ivD
LdV2q5VxqudDUR1eXjvKnO3eSKLmq07qw9BU1U5iquXVc7V3VYiurPhqrNWVWY6DmuqwarOZc7Va
rMuq9QZEubn5nFUWcXQRaM47o7qeaKOq5l5QR+1bFqKPnvpQUB6sq+q51oyD3vMqauPVTCKMyxVf
ULnqDO1fPVqGVNVw9XOgdXIxqrt5QG57q+rqDUzGfKvPVcqKDmioKrNVPasPVcoKA1RFEbmoKA3P
burqm6B82VHNQLmyhoIqCgoHcVBkdV2qmMdVM6Czxc9Rqqmm4qqc1bzFaqYVWY6vq2qmSqzmZqm4
khHFSGPz1XKu5uvTOfneKJuKq9F1vtU1W6qa1EdSczij6VXHFdV6Lmq5R3HFcfUhVa547NUmqw+U
GUuJ1MVTVaM6u5+uRxq6mq1UHbvn5hFlRdBUZvpVa62arI8cVBkfPboIuaKqxVajUR6rHSp7ugoL
cUfMlQGq1PFU3V2XeJ1C5zVamsv0/Oc99sj9Zzdat77zHFJcXTPVrOmRY1aypN1oDxc+N43d3zY7
TiiP26H54pzFHfZTnuZcp3zM1TQnnpyeypM+9rXU2qCgugoDZq+a4qmeXMk6jTqy/Y8VL3fuO5Mp
Zxzmb22+1f4uegPz9+ZdMN2oMoDc9Ec2J1FHbUzKnVrVViNn6b5+26Ax2Z3E0774qu9UVBU93UUC
r81/Y3hs18vF3fM9G3znN37GzylZ8Nj3h/Y+eM99sj9uJ1WO2GfN9uLS9WsXNl5u1lXRde5+bnxv
G7PZ6jJw6cXMffSNc/NPI1Ce8U5OZjlO4rNUo85OT2VcZ0Foz69jKgZ6CgjizpfMeKpoVzJd6jTq
1+5Hi9c5lJayWetZ2+vx9q+lU0B+eg5l0MbvSUGOKpojmMrqHdqcy6rDoKrMbP0dT23QGOzO+Z3a
eVc1EqnvQVFAqTmPRxvDZ0vKPvvmejb54zd++TFKz5EZqqxHHUVUyqu1XHlRuM11X5JnvQdqqcZ8
2eLNLnXeq/0Nd5Vdqvc1Vi+arOt83Qz5+fnqMdBzms3NQXVTiKq1z2656iKqwczqKCrqDMjijqt1
eY9QbFZ6u8qyqw8B8i3V5uaz3zaPEbDpRuoyovm8oosib6vt1+Pd6i+yGuO6A0XMbmP2s9VO4+rN
HGao54j1dZSqybsr5qlXQOWrFHzqouoqp5Vcqcq5PmPQUCqu1b9qaCqmFXMX3quRc5o3zXVdq2K+
dUBs7aqv1cepqpjzVdQRXV9VMIoj9qB0CP2PFo1BURc9WVXLXXVV7mlUXNQVUwoKmNc3PzGuq7Hz
0Eby/tGY9Wc6NzZVtXGj7G5qujoDGoKB1NWc6+5QRVZQRLrna6CrqrsVRbw54jmvmqvnvnznqtdz
HqpE71dQUFVhe1Bo6sSPVlVygurLyqm1V6/Dmji5oj1XezfMz9tvfRPo6sy6k9VrtdB2qvXzdLnc
t2aq2nd1NWVOH1ZqnL585z0BjmXXDOI/ep56sifNGY1SjVHPkfXvz5dVOOeqysiNVht75nZ861Xq
qaGfNUHpOar5+M1RVTmrqr8fU2ZVaqpxFnM+fmoHVSDVThXa0bOY9VN7qzvzmqKs0Y3bmvVWHjqO
duOrUePXPrnyKrcxrnq5c/MaoqKrFBVTKq5H3qtdMVWup9P+MVV+r8i69aC8i57xR4erqs5ue8oO
vNVcNcXNU1NRUqrau5+ar6rsd9Iuerqs5ueI9XVbzc95URd+nR85uaq9U0FXVbzH5o6iO+apjq1G
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
QdqN5EY+cyNU8z71B6rERh281QKqn9VyM9VpqpqIo+aYq+POeoc7UVeObminOep56rEZqrlLzR89
Qbod3ZjayoqznquHuLWUbqu1WKu1PztVw6dRVcq39MqMZnHlX98VTLVt3l6huWpOtn87V/F0yrI/
fTvW57VfMNQOkkqp5nkfsxVeioK2KoqvRZlVzms0eHPWqp1VTar4qmqxs3fqjTtXTEUedmmu8UUZ
6rJjxuq9V6y4s9lpO9Wc6uq7zVbV0VXVWnVeoIhzGPVYqpmqtzD1XjVWt0DpVVTnrVcqt1YJyr6s
qphu/T96rFWGqtOckqtVbFzzx6ujw11XbjWOoW6vuMeG5ouYxubplV6o56qbR89RSc3TnNzVWarm
dLqOlRFlVyOrnFFVd56sugqtFasXXnqsa6Rx+c9ViPdTU9LXPFUDnXSpqs+uM9W3Vbyq1VeOapcz
UnfPUVfV0d1WjGtHPd1Wj6jqcOqqeeGqppNGzI6r0xFzR3nPFVTC+eqnlVIp7qp9uq9PVfVTSOq/
EaI8weq9VaTqp9VZcSuPmylqbq6rea8zE8uq1G+fKnDdD5VcyraGrNRKgqasjq+qxzRnPFV1XdjR
qpoIqqYHNfP1MrlVAarb8uOcqy6CKdqEqU9BQUFDMc+b6VXUqsPVtRFFqrO/Pmc5ql1U4iw/NVdN
U1Uyqp7zc9VNqqdryqmdVOJ7Iqh5eqnv2qp5VTQ+VU8qpp5mkfmqumjqphVTzmjqprVTzPKqaVU4
nrSMY5qrsSPQc9XVUyqpxVTGqnB6CrLqs1NVjI+Z1U2eqqfVFX1bcvtX+d1zVZdaOgec11bz1XT1
WKrRzUMcUVVOb6VZdXc8VTVaw05MdYucRNc7urjVZVcoDVPU5jT1BQXz9kqrsXOc0p6qd2aZXOap
iR1dBczz2jxVea6SzVWPcycxTcxFd0OXze8+HUVTVuXlmy+d1UxpMuNSVWMMqmKY2egqtVFTlTcW
VXEc3NUTGPnMerT8+8yrqtTqv4uerNVFTEeOJ1ZU1WD3UVPNz1WY6t5+tRUVFZ8+ez8cFVcoKsq6
q/kV5d36aOY/VzUd2qrxqipNVczpedsyzc5zZlX7ySpu/DXh46jzcxUzkZ6jsjfE6CNr7z8x75n7
Gqv5vKrNRz1U4q2qmMVV13H2i3Vc1V1WmqOeqmNWVUwqp1VTKqnPeqnWGPVe5utVqpzmqvbSjqse
HckXTvdWxn5vleqmFV6aSxVUwzmPdRV/PdVMKtq6o3QeGqphV9E9UPPVtVir6tq+o72zanjnoNVM
i7XORn5qu9VXM11XKuNMc9Bzz2HjqFEaKr4z1XKuiqsnzeqqZxPmeVEXP65xTHbmqfLxn5qrlVMW
jxZzJ1U4yLI6tnKsqeY+4rqyrqrJ7qypXNz1Wueqxz9asqw1R6+fPfOeFVxVbV9VODc15du5w3PM
Eprnu1VeNVlXGquY3nY2PKujizKrm89qbvw14eOo83NVM5HHVnZRay6CO8+8/NHfNO+xqr6jyqzU
VNVOarFVMuaq87j7Rbqu0dXVaaoqaqZVZVTCqnVVM6qc0FVOzGuq9zdarVXLmqv77ZHVa8O5mKPo
z1bzx80slVMKr9CkbKqY5zH+uoq/nuqmFW1fUboEaqmNX0VDQ89ViqxV9Vir6jvbNqhjPQaqZM7X
ORnqKu9yr2a6rtXmmOegqaHIyEdQuY3NV8cdVyroqrJ83qqmkT5nlWZFz+7yY7VFT5eM/NVcqpk8
PFnNd2eeqTe1DoDVZHFzvm56rXXL2MPdAa1MeGtuV5UZZjI1HeM2Hb3160PezxmWLmw/ZZd0dDLV
1Bo15fY2rVXma1Uy3VTZxznSjzN4ZKM5jbu3cW4sazpz7nH3quYZXQWrMeOh6myK1l6oJasPk5uh
xUF5qLyg5l2vnq+r/coDmx9Lx48s7qsc1Qag7UF3ht8x+5qmU8ZzUFDHnnPfNcXS+ePqbLtX0PGd
ZVjcffp4NLOlnu7zmjeYaM5ri2bFUUEaNEbWRmV5zUEaiZrszi59UerzI7RrCNzX1qs7qYqmzWss
xqm8y30XT2dnUwAB///////////0KgAlxQEAANYCRaoR//////////////////////98wy+XmRWj
5fc/VqgV4qmzHw6NFQYo4ou+cyt2qiI6FxePIzvDsyw1xUDnKjN+2agQztdQjurqnHFk7FHFHOGi
qLs2XlmPzx/Xz2nU85k91WKmodnq/rVxpydw+3dW1WOdxRTxjZnaNGjq+pq8/Sc1Q0CeWY8R4o4j
0FugdA8fd4cxzXjmJjLMcx4ozHy3QLo0cxzaW4qi75qigo6i8iMc0bNVxo5izLm12iiyq5PxUGjm
5jHvFl5UuJvnzKubvn75vD9f45ncR4sZpirnd1Xo25zvGbI+a7yrDm60GVYfWdlVcqu89q9xZUJX
iSNaSdAcTV/TGyaDRt/cZ53MoD9XFnuKcNPK6h5vMOjTLbPUZHRM6uz7Mn7Oa2bKiOot97Tts9o/
SZjqahX0PeHWDdrNiKK25Vb91uT5LjjmJgn2fAigxm6x9qhKOgdX8xjVbOXVZquxR2dG3MOg7x9j
RbyqxcToKk+RNzlni98jiiPVZijvXm10M4uY8fNVY5+aOLnpatqYzHzy4r7XmTlBJVcqOaK4q5sN
zXz1FI+lRV4s1FVtXVEZjUY59lbq+ravqLoNd6mqzjvE1QHK3nMbtzVGzekDWr3O4+/Ni3kyDmqc
oDs+sM+sTXR+5kdXL21iU5rcWVEdWXdBeHtx3kfRR1NQr6HPh0YbtZsc0Vu5Vb905KPHHMardnwI
oMs1BzurMSjd1XKg0VVhXVaqvc0dnRu0w6Dvz9jc28qsnifWrj5E3Z4vZmOKKOq1FHfRdl0iuLmP
z81Vjn5ueKPnpatq6Mx88uLveTuT1BuOq7VnNzXERMY3NdTUbvpVlVwWaiqsVfVnPKaKTn3O3Vcq
sVfVh6DVBU1Wcu8TmHGVPnMbtzVHY3prV7n8feoS7G8RzVOUB2fWGfWJpN4aOrl7eYsOsq8/xxrn
zuriw3TWqr9Az0PRR5z8/h4niqO/RrDn6o18+R0F5fPVdjeXU8yVBiTN0quGoTq4+iuOgT7xeqru
x0aOOoevlnznodZnagP0IqjoKDDOq1ffFGfD1MU4b06W7Znzd2bnoaA/PvO01Hz0EdzFWVbU1XDd
8Oc60eI6PdBanY+aI5nvv097Hs0ec3XO5kfmu6tOac2egvrkx2jRz9c7c/bS8uoqsZGfs0bKt50Z
mxn75MOPmw9EsfRHXbnzzN5V1BHbvsulWZdvvEddstHyo7RRra7roquq81pSo5+fDbqDVZdxVWLu
KOOrauPOUKOZGNffnw1RG1fPVYWqutc0d0ElXx9k11vWHs8UdxR9I6vqNLm0ag3HcSqzIzW1Hrzr
fSrdxUGKzPLw80artVcbtQdueq5hulQOjUffO1BV1XRWd4+p76p23zXNdHz1WIj1dnR46DOerOh+
eKqwf03aiqsX179ufHVYP2PV2dNmdBnPVrPHZqs576ZJ1jvnPUVZQNLtmVdh5yotHuPnqpx2jMrc
XXceWoqrNWX8cd6zS5+9n1Fz8+GbMTw13eulVqXVAY13qKOrnVYqOplGqtjVWXzxVXYo+bvcWlvZ
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
dXnSLns9QpypNHUc7bNzb6mGrs5hivpdHexQWqs1LOZOUFApo8bq7b9yg336ZOT0cUx7RfFGbpOd
1HMLO05289mZjQO3FzfRP5bjNa63l1F0HPHQVMXPzWbfbDirqrkRum6A5rLVGX0zXfoZkNKgd0f3
t0+LOd5R5fudrm323ct3oyi6HujytaozdZy6E29RTix0na7yduZzMyYvpZQUdx6bjvOixq5aPm0u
0zbV25jNLpuZkSpkvZnd+b0rfbzfTDa79DO6VKgTvtR+dunT4s55zPTXvZh2PNvtR35d3o2c3Q9y
ZWtUcXWcuhN2XNPI1y9m1d5Lc3mGzfSyhSjvnbjvGstX5R7qOiUXaZtXbmks6PcqzSXszezzDmN6
6K+j7ea27d/Ks689WGXM9LFdW+UD/iN1EXrPmvds47PrEfp8TyY58oKuvI4+3p30cfSO336czzDX
d0MR4tK/Gx25nz9O/XtDOi6Zvm9jNj2RaTyzUFQbL75vDulnZiM6Moot82TuLpMdto7oOpuh8VA7
b5unPu2+zfNeGu87mZ+yuoobQfeJ7cdnvH0OjXqe3z9WbtnPKLoLij9xTRol709iSlz2hnYjaoLl
TvrzRhmN1imtPFG8PJ5zvxrDGNz3MdZw3W9B8xzZzNc7eVFXZnVO32oTZ35+Y3O6CLMZj433ypjm
D0J8dxdzbzXPEd5MUXT63zdpvIlHvJiivvbcxz6qLNMT2pjerboFG6Ay10vM75z81A+bnn+jxO98
8S783PnXvnPUc3PrU5kzrm5+tq+bn963hr1M8/Mm6HfXn5p099Ffiu4+dJ2317c7Z+lA7qI7PbvX
ZGPznZ+e8nsbjjju7mKHW6HpHzRqKfs/Q7mmhkxZ8Uw+utqdbDoJxPV9u0xrmO6unDdo8uYtXl1B
jNHvDezni7UZ9xVONdMOjay3nftW7dnnkteN665QZmm+nq9u26B2qPcxanusqvr1y5i6OYoKDDxx
H11ml0T32nJZO3vkzOLZu2T6W327expSEY823faK67RQ3S1MHe/iI9Lv1VlfeczeUOG7UuZedOkp
L3fi7UZ1uKpxroY+G6Zbzv2rdrzyUexvp1eZ0t9PVOXtugdqTcxbS6y5fXqlc0ej+uYoKDI+fmR1
1mtpOc3OSydvfJmcZu2aSW99+/seLJkjHibXaK1a2bodI738tJEX0tWqyug3iyhw3ZGtdOnXeFL3
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
Uz99OOtrxiQauzXsZJD21eXKg7zV7y7w+Sws23b3QOPJL7Y526/egeHY9a6ZebsUqc5a676K+2h6
OmdNnmelHQY5OwcOjlmMkoM6PsdpNdO2Pfa1Y1JMikHns6HFrs87ZmnnaPfTH8kydik2HZXbeTru
9yKNPXsY62vHuQSnOfcuSDftqzHaDvNWDznS3kSN95xoa5ko1qKLm7dDA8MPPaOhc9U3lWXZo8mI
jRRVG/TZimWtTAqefl1dxqYlN2ooT2aS1Yjnuk5oZ4Ms85uJI3t3Fh4zIy7dM6RXNI7zmyJaNe4b
aE5vYNmTcYU7j15OGlW7qOeruZW8xWqi44osR+nPKbe0OlQfLR9SX07Tj1fS96Mp1nXiZzRDPBLP
RIY7nE/I4tcyHmz6eo8uPfSLtHUXe/PVge4o1EO3U/NfgySclkF4sGK3gMD+euDFtg4lgxHJKUkb
h49azOezs+ShKovt0ij6do4jOKPpuOLOaO+bLji1z307RxLxXeRR9N8/bUUZq8V1edTkXPrO3PUd
YngOvcmVkvO2nf017DbY9FqMPfMsfumIjcs3A2eD2x5uDQkig5YjQ27msEbv1xCOKIzHNb6G54sx
n5nL30aZvS0LBufHryY9lb3rzfMnYzOnWRiLH2WsxSLn+zV37vmblbcfNGsZmc143iZssTgmrN08
1r1vBOhRuevycucc2JgTE45xX6QWNhvNal8GVsySRu5NeaDbGpe+jTN6zQsGPz49ReTHsra15vm9
V2Jg2dOnUMhFidJ2STtSLn+zV2PYt8zc67fPzR5jNeHMfG8Tw2OQTRui1qZuYwToU5zuhF+Tlzjm
/iExOTVzimLHrWXYu805fNZWzJN2/XcmvNB2xrUo7Sv3y79XS+rWr8GmPQ/XmKD2GFk49+6HgfRp
htJbDbfztvaHQ1HYSEmgt6YY1vt701nsw4WNtBeMHHYbfmDM3QeBw8wep9uvnYaT5XPN3JMC0nfT
pvSfuB3Z1mUex0vt0c502HnYOx2th69Fh+TsgYx2hrT0qwaDlx+jtptrfboMeBp9E807OwvRepPX
Lro837216Ne5PdtLQ29wfSHRaCucFrrmPW9e4Nds81fmr2n20JWk89Bm03njfmkmt68yHm719Dk0
rXbt0WvWO25Dedu2ezE49ee+WJz33fQNDXLNJY0GGFy2hvftjVzEPKB+BoZ7vx+eJmTTP22NtQl6
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
s4KUgoKCgqVZwUpBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQVKs4KUgoKCgqV
ZwUpBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFK/k+gkd3//d/pv/0+k5d3//d/pv/0+
k5d3//d/pv/0+k5d3//d/pv/0+k5d3//d/pv/0+k5d3//d/pv/0+k5d3//d/pv/0+k5d3//d/pv/
0+g2D14QvOt7DVev72fijevMuVOMuW9ddhvZV67fkK9Z5cqcZct7EmzBeyr2GspeusuVOMuW9kuE
r2ZetBLDeycuVOMuW9iaCd7RvbiBhvYWXKnGXLewQ8TvW17OV97ey5U4y5b2hijexb2Cyr2Dlypx
ly3r9+T72He3Z2uPV4zy5U4y5bx+LZ727e3t9e3suVOMuW9vN97fvbrfe3MuVOMuW9uWX727e3fa
9t5cqcZct7asGN7ZvbXfe28uVOMuW9t/u9t3tuj17by5U4y5b25b17bvblOxL25lypxly3tvvvbd
7cg17by5U4y5b2233t29u/G9t5cqcZct7c317bvbf/e3MuVOMuW9txa9t3ttIa9tZcqcZct7b317
avbu2vbuXKnGXLe3KViXty9vd17ey5U4y5b2/YqVe3r29uN7ey5U4y5b27+729e3ua9u5cqcZct7
f+N7dvYCrnvJeXKnFwiy3h47cZZZT6CbeOJkTXla8rWcryteVk15WvK1nK8rXlZNeVrytZyvK15W
TXla8rWcryteVrevJV5Q/+7/Tf95WvKya8rXlazleVrysmvK15Ws5Xla8rJryteVrOV5WvKya8rX
lazleVrysmvK15Ws5Xla8rJryteVrOV5WvKya8rXlZOb2EOaXsK9h3k68On5jBw8TLgpnJXEw6+o
aKPFoHJL3pNl4MyOzgSQPWYwhw0EYYiHGQMYk2Z8AhMckiRQ5jwcdDZuBDexqQnH5HmQOrsA9MJJ
AkIWKghkDHz5M2IbcPPggEZxSCP14XMlUG1IzvcCJhkya7gFeBrw9eBG+8A3g68LXAa80AxORabf
/dT5qMd7XCy0esTfxbfN/QQYdH7V2ffGwG6O40+/41Lbo0f7+7vboM0F9YHp5/+2TN/0LCSY90f6
h1n9gd3N/WI1vd2+7qXf3pW+33bT3sTk9+WyUkd6+s+5usT+6Ddb2+7usbvsD9xjS7dn7Q5I+xIx
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
ve+797/97/u3ve+797/97/u3ve+797/97/u3ve+797/97/u3ve+797/97/u3ve+797/97/u3ve+7
97/97/u3ve+797/978yc04hgy1/vf/vf6YTOBVKB397/97/L1bq9Ph+9/+9/HXXRyOB/97/97/j2
BB+BL/3v/3v+7e977v3v/3v+7e977v3v/3v+7e977sTx8EwV64O7e977tSBE8Ur53u3ve+4ubqzg
S9V929733YK20d1Qd929733YngMSNE9/3b3vfd+9/+9/HtqWrkH97/97/LzlSBCNW977e97w5qmQ
FCO8m9vdvfRjve9xj299299GO973GPb33b30Y73vcY9vfdvfRjve9xj299299GO97aMe3vu3vox7
/+Me3vu3vox//+Me3vu3vox//+Me3vu3vox//+Me3vu3vox//+Me3vu3vox//+Me3vu3vox//+Me
3vu3BJjH//464K3MiQrMS17//1scIs6rtDUY//2KMPx2dak8Om5f+LFj4dH3wWdhi60Ow6dOwXRY
s7T6rKLF+Krc7actOxKsYsXjt8tMWL9Is6bRvKL9dvlFWekWLoqw7TFi/XY1FWCxfoFizt8q99Qs
WrXy0xYv0CxZ24ztMWL9AsWdp06cF+gXTt8tMWL9VMVj5bgBgFwoRhMRAtzz/n+LQgCu3RtcWeJZ
lL5dulRfoTpwJwt+n+X74TtD6Lb5Xb8P3+TSA7B2ixZix2CxYgAWLHYLFixY7BYsWLHYLFi4OwWL
Fix2CxYsWOwWLFix2CxYsWOwWLFix2CxYsWOwWLFix2CxYsWOwWLFix2CxYsWOwWLFix2CxcFjsF
ixYsdgsWOSEGlX5kDBQ2B4+BT2dnUwAB///////////0KgAlygEAAAXg+KIR////////////////
//////9VVd7qyqwLQpGKqqoynBhbZHX81VVK3jC+/vEuWBX/7FVVc8Bf4K7uWCQamqqsWQ5LBDkV
VWSiYaxTkiqqrJRCOHJDVVWSCj9ghixMimqqpw5FxXGYtVVVkOeSQ5FVVKngwGAwngdPQjkEBwvt
rdaxeEIAAsnRsSpuE8KzI2/Fu53hipVsNgOG3Im8knkF3MHHwSZ5IcsOL5Tl9EsgsQpJHguqYF6E
qwjLLOkvGy6eZMLho0UskhK5kU5L7KvsDchgllx32zLvPblJLYX3J++FIRgV2ZAYAQdkHyDkECFK
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
ejo6Ojo6Ojo6OjKN6OiSbo6Ojo6Oh+jo6BLo6Bk6Ojo6Ojo6Ojo6MFo6Ojo8ujo6Ojo6Ojo6OjoL
o6NXj0dHR0dHR0dHR0bi6OifX0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHRHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHQ8dHR0dHR0dHR0dHR0
dHQ/Q/R0dHR0dHR0dG7o6Ojo6Ojo6Ojo26ujoKbo6Ogujop0dHQPPR0dGvo6Oj/hQ8JVEUoksUjD
mqYZqnYc/QmOqs35+gzPrjejPGPe4oxEqjEUYijESnvejcQqMP0lRBe5J0YvN9HR0dF7nR0dHU9n
Z1MAAf//////////9CoAJcwBAAC4NsupEf//////////////////////HR0dHRe50dHR0dHR0dF7
nR0dHR0dHR0XudHR0dHR0dHRe50dHR0dHR0dF7nR0dHR0dHR0XudHR0dCggUA/R0XudHRjzaPuu3
ovc6OjHmXhcqXRe50dHPnrUA/R0XudHRnTqO+Qf+9zo6DLUAioKw/RnFQwqGbwjmanD9FVAd0dHR
0EIpVi/o6Ojo6Ojo6LVlxRYss6Ojo6Ojo6OhOmdLam6Ojo6OjoLoRDzhmHo6Ojo6Ojo0zZXKmCYJ
gnIgxcEaHR0dHQY/5RKPqlk9cb0dHR0HXs2pVRYoN0ppazP6P7IeucMBQIJYVK166D3aqAjT+vno
vc9ejJmdrSqhW9KE0xb1txeLS53zS5HxDe8oxEqjEUYijES5ZUZXo69x2nGz3UAeDvdUA+MRhjrV
JQb3FAEqGv0yTwyRzqm+9xQPe/uaCMnsvd9Dlzn/0GHglQTe5pVFp0sxnR5qAy93o+88lVDTVROq
GFQssWhe7EReALoYkLLF17lxLrXt771YnRcVxJr4i9yyG2rk6E1getOTMqYJg5XK5UwTBOQ5FCQo
N1CEchyKDjo6OjoXdFVy6/kLujo6OjxzTTIMkxr3cJLruteA6Ojo6F3Rl1y5Ku6Ojo6FSMlVKSpF
VICVRiJVGIoxFGIlzioPvW7Ct6GGQoRw3uGWoD8N5/aU/L3DmVJGeyQWdB23uKAc38FjOj7zcl7h
mqgHKYRUXb/tUL3uGac2SxiOjowV6ziP7OZw4z5MC9w4VBoYZ04nFe/ve4feE6M2dH+oEMle5pMM
PR6YJCgWvcM5QUYvz+zwVPOXvcYdf/tRjFAne4YqgiMHGef3l1AelVDapKO3846PTH3uKG81DDMb
26JL3Q5v7zn/0HuqFb3DY1hZLoMLM3uH2ZHnlsp9H4qAb3VAMhULQmVCqoWVC17ixMltXXBYuudF
l6sQntWJYQsQ723GSdLfkXpYjvS2JbcqYJg5XK5UwTBzOU6OhByHIaPhVL0dHR0dHR0dCU4ugN66
Ojno6EdHR0dHR0dHR0dHR0dCFAB0H2l6Jejo6Ojo6EvR0HDeujo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Oj+6FGIlUYijEUYiVULxaqGFQuqFkRaiyy+UqZ0Lr2GhfZYi+E0IudFq5LaixKsQnvdT2ZUwTByu
V+cUYOYz3R0IOQ5L10dHR0dHR0dF6y+f6OjozPR0dHli+joxBp5Xozv10dHR0dH0Z5g5Hoz2Db0d
HR0dB+efRitGJUCXR0bujo6Og51RB0fXvz8y9HR0dHR0dHRhsFnDv/DawPR0dHR0dHR0GIoAPQxj
p6OhUAdHR0dHR0dHR0dGDwxiYXT0dHRHR0HCcp79BxKMRKoxFGIoxEqoWuboVMCrtVefR0dHR0dH
R0Qsjo6Ojo6Ojo6Ojo6OhZZfEdHR0dHR0dHR0dHR0Xaazo6Ojo6Ojo6Ojo6OgkdHR0dHR0dHR0dH
R0I8DAMz/6OgyDCzOc6OhGYzF66Ojo6Ojo6Oi9zo6Ojo6Ojo6L3Ojo6Ojo6Ojovc6Ojo6Ojo6Oi9
zo6Ojo6Ojo6L3Ojo6Ojo6Ojovc6Ojo6Ojo6Oi9zo6Ojo6Ojo6L3Ojo6Ojo6OjoSqMRKoxFEEHIdH
QTejo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6OjISdHRvyHR0ZCnR0dGZ6OitOjoZz0dGAwXR0afjo6KdHR0a+jo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo26ejo6J+joB0R0DHQq3+joVaKqcyfR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dBdHLQ9HR0dHQ7g6H6Ojz+K9HRwXR0V2dHR0dGDbpk6Oej/6Ojo6Dhz/R0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHROZe7XNv3ZXOfvR0dGwjo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6P3ZX66Ojo6Ojo6Ojo6OjoDo29HR0dHR0dHR0dHR0dHlx4dHR0dHR0dHR0d
HR0eWJ9dnR0dHR0dHR0dHR0dHHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHRmOjoBg+joxvR0dHR0dHR0GPp6Nh3fYMz0dHR0dHR0dG7y6DPzW1jOjo6O
jo6Ojoz/R0f/n0ePR0dHR0dHR0YHo6DE6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oh+jo6Ojo6Ojo6O
jo6Oh5tEQPR0dHR0dHR0R0Ap/9HR89HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0QPR0dHR0D0B
6AaWdDOinR0dHR0dDvz9+I+HHR0dHQdXv6ZHAJfC9tpkVS23qywbLH99EnQiyxFl6vpLZZZZZRPe
7bbWxFliLE1bEWWIsFFllllllllllLF1tlllgossR9Se2ROFOu/UWWI2WWSDQOARbbaiyyxGa58B
0pTavVliyxKd6Uwtfwlttb0cYL3wHHFOj38cEDo6Ojo6IFxigdk8/R0dHR4fPz8adYwHkJdHR0dF
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
xxvH6qGs9ns9np1RSZOZ/J5p89npjoVBrh6MrOqFVTmdB0HQdAQ44xMQYh0BOg6DoOg61RBiJji2
1CdGb+s9mxDPLkdqoBz2ez2eOlUI/Cg7UCZtHQqDc9ns9npz9MbM/zQz57bms8fdPE7/PwPk4s9n
s9nlQQqBc6oFVAIaSoSPDPZ7PZ6efM/07WjmtmezyoCyoP2fYqAPnPZ7PZ5UIneoKFAwbe6c8M9n
s9np58vOHn+f6ymezyohVDnIhMVUR/eez2ezx+qgo3zeZmZ1RTns9ns9NPPO3hURgDns9nlReqie
egxjfVBR357PZ7PKkY/TeMg3fY+VRjns9nshWfM88hVBnR/57PZ6dUKhnUChvH6qCs9ns9nsuqQT
S6OjMzz57PZ7mk/436zSpXOrO57PZ47lQjkTCy6gMVJaoiz2ez2eVE6pMUHRpf2Znnz2ezX5lxnb
gDGVBJzHIchyHJtzxyHIchydXV1dRyHIchydUh9dWSk0uDg9z3pjTyVFGTy+zZszCoC2bNmzZs2b
Di6+vq6urrP7JHSqCVQzs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZ
s2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmz
Zs2bNmzZs2bNmzZs2bNmzZs2bNmzr6+rq6uvr6uvr6urq6+vq6+vq6urr6+rr6+rq6uvr6uvr6ur
q6+vq6+vq6urr6+rr6+rq6uvr6uvr6urq6+vqUWyh4t6vzLZvFmuqAlFsotlFsotlQCbEpwHkYFV
QIotlFsotlFseOLxxznrhFAMqD1FsotlFsotjn/uDhVBxtmicKi2UWyi2UWx64abIrxwJ6KLZRbK
LZRbH3ilAQqEc5iscotlFsotlFtm4Ng8j5Nc2T6UWyi2UWyi2yv6oED3SB6j/UWyi2UWyi2/E9Ox
RbKLZRbKLYmtXKLZRbKLZRbQsJRbKLZRbKLYrolFsotlFsotm3C1RbKLZRbKLayIdRbKLZRbKLaC
UWyi2UWyi2F06i2UWyi2UW1yuotlFsotlFs2LlTEotlFsotlFtVRbKLZRbKLZcuahRbKLZRbKLZN
RRbKLZRbKLYUxJCi2UWyi2UWxLOrD5hRbKLZRbf3mon1HWo61HWo61HWo61HWo61HWo61HWo61HW
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
55a3nlreeWt55a3nlreeWt55a3nlreeWt55a3nlreeWt55a3nlvV1Kjvbl1UOqhz9+lUOqh925VD
qofduVQ6qH3blUOqh925VDqofduVQ6qH3blUOqh925VDqofduVQ6qH3blUOqh925VDqofduVQ6qH
3blUOqh925VDqofduVQ6qH3blUOqh925VDqofduVQ6qHOI81UOqhznPZVDqoc8cwqh1UOdZ1qodV
Dnqe6qHVQ55HOqh1UOex2qodVDn4daqHVQ56Huqh1UOdO5VDqofduVQ6qH3blUOqh925VDqofduV
Q6qH3blUOqh925VDqofduVQ6qH3blUOqh925VDqofduVQ6qH3blUOqh925VDqofduVQ6qH3blUOq
h925VDqofduVQ6qH3b1UQqhslkFUMqh9+YVQyqG+fxVEKobO71UN6G/uqqCvjKb9+Uym/duN83zf
N/du35TKb9+Uym/duN83zfN/du35TKb9+Uym/duN83zdUAG7dvymU378plPjfMoAFAAoAFABlcnt
ymUm+MplKZfeoAFAAoADO3fPOU+gmQEJq8ha1reeTVCE1TVCE1eeWta3nk1QhNU1QhNXnlrWt55N
UITVNUITV55a1reeTVCE1TVCE1eeWta3nk1QhNU1QhNXnlrWt55NUITVNUITV55a1reeTVCE1TVC
E1eeWta3nk1QhNU1QhNXnlrWt55NUITVNUITV55a348Tfx20Bwf3znON2CN80y378Fgt3HG7dxxu
wWC379+/BYLdxxu3ccbsFgt+/fvwWC3ccbt3HG7BYLfv378Fgt3HG7dxxuwWC379+/BYLdxxu3cc
bsFgt+/fvwWC3ccbt3HG7BYLfv378Fgt3HG7dxxuwWC379+/BYLdxxu3ccbsFgt+/fvwWC3ccbt3
HG7BYLTiMUZOCwW7jjdu443YLBesvp7YLBbuON27jjdgsFisLiPbBYLdxxu3ccbsFgsFrwOvBYLd
xxu3ccbsFgsOY/jvwWC3ccbt3HG7BYLfv378Fgt3HG7dxxuwWC379+/BYLdxxu3ccbsFgt+/fvwW
C+uOM/kuOMngsFv379+CwWWwHH/kcJic1gsFv379+CwWVwnGRyBi6TgwWC379+/BYLJccZvK8cf+
CwW/fv34LBZfjjNbuON2CwW/fv34LBbuON27jjdhMFv379+Ewm7jjdu443YTB7wT78Lgt3HG7dxx
uwWEZv3cmuY27jjdu443Gua/PPPJrmvu443buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu4
43Gua/PPPJrmvu443buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu443b
uONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu443buONxrmvzzzya5r7uON
27jjca5r8888mua+7jjdu4k3mua/PPPJtGzSTif4k15U2TY5555Nk2N/Hj9f/mDabRs887fzDe/M
E9mmONJEsIiqlVEk3CgD0/e1uAZkMtHPzmcyyT1zvxlcx5yS0MMwjCx+PMjE++YzGYzGrjA4cxsf
i/MyzC8MNmMxmMwzwwvr5ehlmVgMFpwOYzGYzHngMfjDLMUw8fGc8MLmMxmMxTbmMxmMxmMxmMwn
zGYzGYzGYzGYRmMxmMwlzGYzGYzGYzGYvm+brq6ur56DAm+t+VPk5P05svkhr4xivXJbTgzOU43f
k3/P+b8lbh5vr/3fHzqLV44D6lzh3/mS8435dyiPLzm//35+/r58kfGqU4v/7Z8+OAwF933Nsyl9
331dXV1ZA8Zq+2rH+XtjPTwCHKfW/TizG8fIysZo+eOSpLi/Etz/D4nR7Y0IegUDvRkUTLDizGQ+
839Z/Lhj/O3I/d99XVffV1dXVPrZft+gyE2XObdzx5Gf7GRjtHj/nPnZg/czaaMD5mSZGvAc5nOf
H2c+f+fDzNEyzMM/z8fo4Dn/Pg5zk/PPWZJpGKYXhr+fnL7mesqxDrGQXVfd9331dXV1ZHIfN+37
100Sa8B0b8n8HBlQ5nfP4jlMydeUzua5yNizox2K6M1nvg6jrOPOZnoxOM6OjFYfozOZ+znyxwZz
M9GHxnRh9LcvmM8cfRi8T0dGLxPQWOwEmL8ejo08JK1rGUtJqOq+77vvq6urq9vUxMCHon9PWbdi
8fidZgYVhi6MEDjEt+nwurB43FmHiPZnjXo3Yts2uMeYBjmhjjF8NW5uCwHz9S4ExcKa5lGT54Hn
5+Rx+ZzJi/n2ZJoenzh/vJ4fE5E6DIMfP78Fgs3v9LKvdoT3xBJrL7vu++rq6urqrlziDNWbMZjk
OZOY4ctnt+SOjLZXd9nH9SfBwnPlsnlvmf5yP44fk5Nr/GQPE4Mhmc4defyPRtODLthY5xZ90OmR
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
nZ2dmF7Oz7wWRXeHZ2dnZ2dnZnuPvB9jezs7OzsDj/2zB9nZ2dnZ2dmVwNcV2dnZ2dnZ2dnQqEex
QJdnZ2dnZ2dmaw03HZ+dnZ78dnZhv3zJd5SdPG/s7JuzIZ3PYXKGc3MnHEsdkmC7Ow9lABheJTw7
Ozs7PTfiB7Ow2A5U7Dk/favZweBkdmFPA+Dw8/Hs7Np8f3YYOHwn6H819m7N07OzOkZmPzppmKcW
UOV1ALgsb/6VAR5mUd/Z94Ez+zoVBX07OjSXpnfbs3sOGX/WPHsD++OzKfPZ2fOvsOfJ5zFys7Oz
ZlB7Ow4Wfmns3NzGD0eXFW9nZ/ZLsUAm3HZg9XqZPYcqgC7Ozs4bk+gIezs7Ox9Vao6D4m8ezs7O
zyyrPA4zA8ch2dnZ2Y86zANw2w9n32dn35seoySRf3Z2dnZnexB06TSM3w7Ozs7OyZQD7PhHZ2dk
dhvcfWR4VA0nZ2dnZ2dh2D84T87Ozs7OzP5M9sSzo7Oz69exnRQzTq/qz9nZ2dnH9g8PnQHT/dnZ
2dnZoOemxuns7Pzjs0eWYweOzCgE29nZ2dmKMraYWKUB+Fy/Z2dnZ2dmpqGbfjn07OwIMEd4+3xP
2dnZ2ZP+BnJPXsOfs7Ozs7OzcivRio/dfZ2f2kZWnBktPZ2dnZhZfz9M/V2Hn2dnZ2diX/UB79HZ
2diob8Dh1HL+SmT2dnZ2fuF/eFQyY50A7Ozs+37KVFm5nn2dnZ2S1QJ55z47Ozs7MsYRwHH57Ozs
7Ozs39HZ8aY7DSjs7Ow0j7+jwVBXGz67Ozs7G4GUddOzs7OznAe/wjj88jKObs7OzskzfZ2dnZ2d
nZ2Saf/sKFuRJsngY3rkuzs7MMe3Z2dnZ2dnZ2YnAY06MX5dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d
nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d
nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d
nZ2Kgvo353KYcW9nZ2dmG+m4/CZHyb2dnZ2as/TNZowteQ7Ozs7AZLmr47ok7Ozs7OdbcqPJh53s
7Ozsrnf4Ek2e7Ozs7MD0bpAhxWc7Ozs7P//17GeHZ2dnZlezs7Oy6SOzs7OzrSFl3bau7Ozs7E9j
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
A+HRkzjExMUoD8t8xjeH539nZmBzJl7qnudZzYzTT38jqwCgaOXK5v3Mvz+Q5ODS7OzsS9nYPZ2G
c3E5Ls7OxHoHs7MF2dmgGSwXZ2Z4O/s7OzsR8dnYe+CyeVUA/Z2HT2dnj/9lnZ2QcGzs7E9nZ1MA
Af//////////9CoAJdIBAAAn6aSaEf//////////////////////+uzsQyzsPI0pM6YXZ2bzO7Oz
5k7DE7OxL2dnZ2Jezs7OxLm8zs4S9nZ2diXAcbNCXs7OzsS1Gu1L2dnZ2Jc38dn4l7Ozs7EvQP1/
Jezs7OxL5U1/iXs7OzsS9nZ2diXs7OzsS9nZ2diXs7OzsS9nZ2diWOzs7EvZ2dnYl7Ozs7EvZ2dn
YlKOzsS9nZ2diV+wuxL2dnZCXs7OzsS+P1GlKXZbRLWlkyXKjsx+n66BxO5BnB24TzB96ujN47ic
J7a4IHZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2
dnZ2Yf27Ozs7PKfzwPz2dnZ5GRroXZ2dmQAaezs7Ozs/mGKc9Mv2dkgMV+9nkuYULqYfs7Ozs663
x2dnZ2dnZ2djwjs7Ozs7Ozs7L12dnZ2dnYPZPx0di7s7Ozs3ymj4Zg/uzs7Ow7/WX7+VQtkDl7Oz
s7DX09HzlM0dR+dmVwJiHUYGR/exQAbNWzs8LILww54azj25Lk6/scbgTyVHJtGcWQMmTGnFnTXo
bB++mAPY3sWqQftQAc5I/sUqGDRqYWA6Du5N/6VBBrVOLsaYvZ7GQNIKtU1SsvKLygN4uZyTEP6A
5+zsvPYtvN5G89nZmPEPRkeh5sJ2dl57MdebzeezsxwTBxOeOEejk8sioDJt2d//fLnu5k4sDf7J
40wsscXR7/hGQceLzagA88geoFQLizh6Oj1HBmEYhlmUYuCzJ3GtnjiOY5duR6DDNLAKAs3DVwwO
g5eQqjTNHH/+5veyoex5jYLXhVQpQ+joOL/9vhQDVobWA3dGFNDyM86zyyfRtML89zCwXQa51qh8
+JK87vE7p8dkMbi/c2zjxcJbb1eLb3Wt7Ow1PlnZ2dnZ2dnZ2ZK8N7H0dnZ2dnZ2dnZ2dnZ2dnZ2
fPZ7dnHZ2dnZ2dl4vB19nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2P6dl7Zua9zIa289nZ2dnZ2dnZ2dnZ
2dn52dmA3bzC+teQ7Ozs7Mz95z36DD6Juzs7Oz/+MvLhfDs7Prs7Pidv77ZTs7Ozs7OzsyvtkzDN
X3yh7dnZ2dnZ2dnYYpt8nWaCD67Ozs7Ozs7OxL0HAaers7Oy3s7Np73iOxQI3m83ns7E/Z2Xm83m
89nYjs7LzebzeezsvPZ2Xm83m89nYPZ2Xm83m89nYf2Hw/7eSi9rAlUCGC7OyJuzs7Ozs7Ozs7Oz
s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ners7PXz7Ozxr2dmjDdnYDs7KSdnZkfns7PjT2dg3x
2dk/Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ0W9kk3YnXydnYB+wlnZkexioNp2
XJcnZ2XJ2dnZ2XJ2dlyXJ2dlydnZ2dlydnZclydnZcnZ2D2F0dnZ2dkdibs7NmqvZ2cdnY3Su7Oz
B1k7Njf3suSOi9XJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2
dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyJSzXh4P96Oejs7
OC8uzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O
zs7Ozs7Ozs7Ozs7Ozs7Ozs7K7azdnZ2dnZ2dnZUfj/7Ozs7Ozs7OyAePZ2dnZ2dnZ2YHy8tvZ2dn
Z2dnZ2MWdHZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2M7Oyfo7OyvZ2dnZ+eHYzV/yzdnZ2dlPT
s2j8A8Ozs7OynZ2Dp7OynZ2dnYHs7Pvs7Ozs7Ozs7Ozst7Lzeezs7Ozs7Oy0IOiB7Ozs7I7OIvPZ
9dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZ
ebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2d
nZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2Llxdl5vN5vK7sb2dDOiOjsK
83m83nsWdHRMzaMXx2Xm86POTKaosK238GXosdiW+bCXkz+lnwGtH9wGGav55f2swL3J9X35g7Bc
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
gNVQGqoDVUBqqA1VAaqgNVQGqoDVUBqqA1VAaqgNVQGqoCt2FVASqgOFVASqgKFVAaqgJ1VASWrR
qx25ubojVtW1bVohubm5uiNW1bVtWiG5ubm6I1bVtV1btubohubmjVtW1bVohubobm776tq2rah/
Lde5apEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6z
EazrMRrOsxGs6zEazkOLXUmEPsOTUteY4stgf2pf/ZswxscQxscWbP///ZswxscQxscWbP///Zsw
xscQxscWbP///ZswxscQxscWbP///ZswxscQxscWbP///ZswxscQxscWbP///ZswxscQxscWbP//
/ZswxscQxscWbP///ZswxscQxscWbKd2zes2YY2OIY2OLNns4yFmzDGxxDGxxZsxN5ss2YY2OIY2
OLNlL91GzZhjY4hjY4s2Umr37NmGNjiGNjizZ///7NmGNjiGNjizZ///7NmGNjiGNjizZ///7Nnt
jY7raxseoWbP///Zs6loDGx96DZ9Zs///9mzfYGMhe0ZlbrNn///s2dQY2NK8xseoWbP///ZspMb
HdhjY4s2f//+zZhjY4hjY4tWf2rUMbHEMbHFqyIUWrMMbHEMbHFm0f96/DGxxDGxxevXr0MbHEMb
HF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMb
HF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGx3b1682sTF3yY
2Xq9dvXmJkS7ZWC9ejMVb6UytP7yulMrrO9lgxvbHol3rKZ5l0oST78+fn/3dyS+mmmnud0fu53V
ztM7ppppiFPfx3L2e8pppppHOc9xLtTcwdNNNOYTTTTTTTTTTTTTTTTTTTTTTTTWmmmnklmTWXs9
I+NjFdpD/HsY7znv6Xzny7vYd5w8/Fu+mBCfZ8YytTjokRMkk6HLHvP0g/+66x63P3H/tK73HBDr
GeaR6TSPj4oqf8hmwLqrUvHHjn1512EH+8PLprYM99v42LXWKz3/Kdzl4yKDodPBzx3nOXRs46tW
+u+++z5znFhHpBg67777Pnvt2Gw6Cv2M4r+XE6HvKJ7UJ760jyHIlfH8cfAWrJkDcDpC40/H8mxL
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
a/r9y5o1jT22wRsBohkKoDNW1+5cuasqgMZQ2tWsa/cDIsXG25csBtaNYbblwjo2n2A2rlgg22A0
QyLjbYbbDLo1i4QbSAaIZGjWLjaQIEAyCG3dTDADF1axoYYmrBihi6tqwYoYurBiBshjasGF/VtW
1bVtW1bVtW1bVtW1bVtW1ZgDT0LVrwdOrasHSHTqwbIbONWDpDp1bVg6Q6dW1YOkOnVtWDpDp1bV
g6Q6dW1YOZ9W249LIGDj1PVw6Q6dX1cOkOnV9XDpBDp1fV41fV2jWZas+1to1fV9X1f1rRg2QxtO
0/Gr6vq+r3tJmNYDhR1fV9V1fV50OQwvsmr6uGCGDq+rhg/1sNjRWDTmPoMHV9XDBDB1fVwwTB4h
p6UgQDB1fVwwQwdX1cMFuIBh6vq4YIYOr6v5lVqqAm3bQ20NtBVQEqoDVUBKqAttDbQ20NtBVQEq
oCWqoCVUBbaG2htobaCqgJVQEtVQCqoC20NtDbQ20FVASqgJVQEqoC20NtDbQ20FVASqgKiFxo20
ChNVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkq
slVkqslVkqslVkqslVkkGVVkqskM0yrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKr
JVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZPyCrJVZJpVZKrJP9Vkqsnp1WSqyUMqslV
k/yqyVWSj5VkqsnNhVkqsmt6qyVWT0qyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSq
yVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSCqyc/VZKjCrJVZLwAqyfqskgqyZIZampqmVWS
qyVWSqyZlqampqmVWSqyVWSqyZlqampqmVWSqyVEvLU1K2pqJk+pmZ//cNTVBNqav+JzMkJeGpO8
qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqsl
Vk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfGno9/c3lVCOtNg
fF9arJZmzKtVkqsld++rv31qslVk7cVZKrJXfvq799arJVZO3FWSqyV376u/fWqyVWTtxVkqsld+
+rv31qslVk7cVZKrJXfvq799arJVZO3FWSqyV376u/fWqyVWTtxVkqsld++rv31qslVk7cVZKrJX
fvq799arJVZO3FWSqyV376u/fWqyVWTZtaNZVZKrJXfvq799arJVZNjzSqyVWSu/fV3761WSqyUz
tTcqyVWSu/fV3761WSqyT2+ulWSqyV376u/fWqyVWTf1EgtVkqsld++rv31qslVk7cVZKrJXfvq7
99arJVZO3FWSqyV376u/fWqyVWTtxVkqsnN++m237+oqslVk7cVZKrJvX75rzRqmoKslVk7cVZKr
JaW2+26+03TqslVk7cVZKrJ1C/fuajfvnVZKrJ24qyVWTql++dd++tVkqsnbirJVZK799XfvrBVZ
Kye2xtsKslVkrv31d++tVkglHABXfvq799alVk+JgbbGoNq799Xfvr1DUNtjbY22NtjUNQXfvq79
9eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUN
tjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2
xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799epPZ2dTAAH///////////QqACXaAQAAvzFgbxH/
/////////////////////xqG2xtsbbG2xqGoLv31d++vUNQ22NtjbY22NQ1Bd++rv316hqG2xtsb
bG2xqGoLv31d9prUNQ22NtjbY22NQ1BNqaftTR3qGobbG2xtsbbGoahTS1EPNN7e6hqG2xtsTzIb
zmQEB5xbxYli3Avbg3EhxhSPlwlyAiccuEu4xwLcQSji7u70OYqOXOSDu7/5ip54bjcu7uR4cd1I
DxDkHd3Fyd3d3d3d3d3d3d3d3d3flwp+dSQ5DkUxwmNxva31cYioqoEQcfIXCIEJxgVUO/OaiXiH
iK/HCZfxGhDHyneRwfiLk/F5mJeh+449PJ3Izunrny84uFcd4Q5EajgvkKqpycTJChkZ3kvGNwLd
Pw4Vy4PHB53BGCPDcb4hzGLfTMuTFy3nChTyIkeUzM8hPG/oKfoe8qXNvSPhj5ULjL/50BuOXDcV
UcuPPhwIEORDhEbrfA7p95H95//Dlz4cMbghhxq+FPweCIhkKI8aoGJrkJ43mYjlURHCQJrdRHAR
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
CTQ1oG2qZOY+hySrdPL64cNnkFNTObKYUVUrfSaKuUztKOKKtlJtFLkrqnvd396NQIW+VoNpoKQz
nVGnNqoQIRbyFChtLQQ86h60hTHur3rInqtd8R7NXW8LMkXI/YHssBHHE0ccteLDbjAVI9a/mhTQ
/LFZOvBcLi8GtHx/3v9grWGRkYmCH+li8ysnQ9gZPhDGYZ72OWLvsXAK/59iI4Ii79G4GbFgxR+M
V1lkusFfwPWWAiw4ssuyZbIyYyZ//wAfWWy3veZGCtAW885dgRYWR67cYIMbM9BytizBWi5Wdgme
+3ANNAPj4hCvWZsYbr6qKZe2Rf+4xAPMmBdggvCFuZpB/q2X+WB3+4LHb4ya6OogysXoctziVeB6
wCZs1dbxBki7HLuI9lgI45aaOOWyRYb94DIrX87Q1oflgaheC48X41o8f+R/2CtYZGRCwQ/PSvPM
rJ3A9gj9eEMZhnvY5wXfYuBa//PERwRBe79G4GboEfesessl1git4HrLARYc01vZMtkZsZM/84AP
it23seZmCtAW885fRcWFkfu2Bxih7M9Byti0WF5ys6me+3APQYPGCDleszYw2y6qKa2Rf+4xMgHx
y2SLghC3cAE2DL/ljudwWO3xyvFdC9aG8QFO6Lhmeiw0FUbaLjDd9LRZPOoNFxFDNbegq1RTu38q
9pCmi2apKUq2oai637FPVBoqAfRYe5SI5oqggomrBQKJqSdPRcSCqZFP1aqgKOd0WFvSU2KSUp0a
uKT3qtVT9FxWUdVza1VHRbKp637cuoagUdbqGyCW9OjVdR0ONc6XFb23sorak2VRQKEq6dWFMlAT
wpMo2r26o2luoFKVI33ose9FmaLj0XNVm9y0XCUnU22i5SmalaaWi50BQ2iwaFQNlUNCApKyk6uy
RRmiw6pKKq0pnClFbaqmayiPb6rKJq/PbykONeiqCCiWgpyW8ai2pVTVLRoqgkooooo0purNFmtz
Tv2oSg6q0WU3q1C3Ao2oJICkt90BQdWVcUXSyop6LfaJU50KH0buXKJSdRcUqxB7TVVTFClOt5Sd
Bub2txzdra29r0WBPpR7Q11e1VGgKExv3RlKSspOqasoNVSDvW6oCnrafqVsp7VJUBSGioENF0FO
VSoUjNqVT2dnUwAB///////////0KgAl4gEAANvujSYR//////////////////////9vkUbUDcKs
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
GWmrSjKhKMKQKTKdKR20VRUUiUjoqirRfRSJSmi5ikOtUyldFUH6KoRKRKR0XjoqiqkKXLqSVXUm
8pEpHtlIt/eNRQFX6Li0XiUjUZRZSJSNTlIlJaLt3KapUikSkSkN+XbVUEikSkSkSkSnP3KNq4pT
Rcei5CkSkSkSkdFz6Lqbim26kqUiUjVFUfR0WTosopEpEpEpHRdhRJSBSRTei6ykSkSkSkSk6spd
KRKR3KWqvlAo+rSkSlilililttmvRYBRWi2WjYpYpYpYpZp0WJoqg8oQouWxS1XtpSKl0KFKlUZS
JSJSJSJSGi5yhKrqnlX6LkKRKRKRKRKbpUpgpGlVxSNSS5fGpv6UiUiUiUjouHReLU3FJ1boufRc
RSJSJSJSNKbNKrqRSJSNRbPFAVQUYU7uUiUiUiUjouYpMpApCSApQpEpEpEpGkONtVlIlI6LC0Wl
crKI0XmUiUiUiUiU3ouIpIpKrqRSZSJSJSJSNPRYEtykSkSkSjdFQYVNyZSWi4ikykSkSkSkSlym
ykqrpt7eUKUiUiUjVFIoXRZlUFIlIlI6LJqVvKSKb0XEUiUiUiUi3aLhKV5ykUiUiUjvfd9F1VfT
KQKRKRKRaKqqvdt0VRBu1FIlIlIlItVR7FLTpFIlI1c3VTKrildFs6LEKVKUKUKUKUpVKUoUoUoU
oUoUoUoUpovCqrnKpNF06Ko0qvRdJRCBqamrylGpqampqampqpFN9bimNFwtTU1NTU1NTU1NTU1N
TU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1N
TU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1PZ2dT
AAH///////////QqACXjAQAAfnL38hH//////////////////////01NTU1NTU1NTU1NTU1NRSdW
tlS8qrdpKTKTKTKTad6v4ruUFoskpMpMpMpPbjbJpbdFw1EUmUmUmUnJvbqh7V3Ckykykyk6FMpD
DxtaSkykykyk9qei4Kits0XIUmUmUmUnLtPahSpUCkykykyk6jp6KgLQUdFxFJlJlJlJ1RZlJlJl
JlJmUmUmUmUnZSZSZSZSdl7KTKTKTKT8ykykykyk8KTKTKTKTPykykykyk7/ykykykykwflJlJlJ
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
Zeiysr6LL0WWNFlSqWpO1TVNU1LUtS1LVNU1TVNS1LUtS1TVNU1TUtS1LUq9U1TVNU3UtS1LUtaq
apOqapR5UtS1LUOkdU0ygswoUoXMKFKFzChShcwoUoXMKFKFzChShcwoUoXMKFKFzChShcwoUoXM
KFKFzChShcwoUoXMKFKFzChShcwoUoXMKFKFzChShcwoUVFNo0WRahRzS2KVTJsbGlpaWlsbGxsa
WlpaWxsbGxpaWlpbGxsbGlpaWlsbGxsaWlpaWxsbGxpaWlpbGxsbGlpaWlsbGxsaWlpaWxsbGxpa
WlpbGx9+l1sbGlpaWlsbOxpNzY2NLS0tLY2b06ba2NjS0tLS2Nnf7JsbGlpaWlsbG1vm2NjS0tLS
2NjY2NLS0tLY2NjY0tLS0tjY2NmNLTfWlp62NjY2NlBpqqeyD2xsbGylRaSkapasbGxsbOtLTNva
Wmm2NjY2FMNLS+0tLY2NjY0tLS0tjY2NjS0tLS2NntlNpaWlpptn0ptLS0tNKlSpNLS0tNKlSpNL
S0tNKlSpNLS0tNKlSpNLS0tNKlSpNLS0tNKlSpNLS0tNKlSpNLS0tNKlSpNLS0tNKlSpNLS0tNKl
SpNLS0tNKlSpNLS0tNKlSpNLS0tStJVWLS010bU0qqqqtLQC7RRpKx9HW09nZ1MAAf//////////
9CoAJeQBAAAXpRaUEf//////////////////////ki2fW2+C8O9+xWH/nWGFf4smR/C945dy6yPZ
BwuIoyxd6MF4giYj13Fru/+F1smuwJK/vY44LYeWI10gvg+LzwwD0nvD/wcxlHMFfrDxPXYa/39Z
OysMMyv1d4Yt7LBdz2D4MHwYBFbsHq72D48zMsad4Lvi+Xdi4QZOXC0jAwwgI6ivnBLnOc5znOc5
znOXyW0uXd3d3fOc5zl85dfM8fmQuv8K2pL6mesWpZ8AvCffsVh+ZNhgy/GHY537PHLuTJ1keytC
DhcRgEeRRl3ouLxlICyJiMX65+Xd/8LrZNdiSV/evHHBbDyxG67EkHOD5xee/LA9J7w/8vmMo5HI
Cv1h5XZWGv9/WrsrDDudr9XeGMHwZYL/8fgwfcPEcYJuPV38Hx5mZY07u7zjJ27+7u4QYGTlwtIx
McICNavnOYrOc5znOc5znOc+znuqrvPve973s5znO5znd3PGG71R3ZG1o9qJBUdT9qGoygX0L7U7
Noq1UoMo/RYxQtQ7VFMoaoShChIKFCFCVHUVR1EUIUIUIUHTlUJQBQpQpRRQhQJQfShChKo8oQoQ
oSg2lAlFTKEKEKEKEaigCjihChP0WSUnQ3KAa9FoblCFCbYUAoChChJbFCFCbNBRUtFgaLAKEKEK
EKEKEKEKEKEKEKMKDKLKLKLKLKLKBKLKLKJKEqfRYRQRQhQhQhQhQhQhQhQZQpQpRRQhQBQhQhQh
QhQhQpQhQBRhQxQhQhQhQhQhQhQhQhQmiwyjihChChChChChChChChCjNFqFGFCFCFCFCFCFCFCF
CFCaLU0WkUIUIUJQKEKEozVKRKQQPAoQoRwoQoPb1dtilmnNihShCgNFqlCFCFGFEVKU0rRKEKEK
EKEamuoqRQhQlUFC6LEm08oaKgG0VAM436LZKLmUBvVTThRZRdV1QUWUWrTU630mwosoveqiiyi2
yqikd5VQUOUXSV0WWUTDykNFgUUFVYgkUUpR+CDePCgWrJlA7deqhA142SwoUoPMKDqHGyqtFUA0
ilG0lUoEoLMayg+OnVmISlee3lNZlXVRiCrGiV1ZVNLGyWYgynVtVVfVtWk5mcjHNilG7MzNpyqK
rSkKpqnMzG4pLRdhT7bVp5mIEDExNm8rzMzzolIVc31ZmZh1VVlW0yczk2qHCiKOiy5znPM40NVA
ZOc5q1K3tVRZk8vCkI7tF2UhmZlOG1LRexTNKqszMNv0XPVrY6ec/CleYhaJIKszMyqKdKm3lJVX
PMzCatbPzmYUnVdENckGZmVU2ZoqgEpOrTbMzMJqyDFaDMlbd2NCeZmN9U1dVxS1WnVOZmE77fzM
xThSUKVXVS2ZmZVTfV1XlBVSgqnMxAxHVqCq2JBmYdXIGyrm+qczMnVxShSrbVpOZnHDp5VpRnMz
M41q3VbfouerszMp01aubKtJzMG3zq+rW6oe972gr3ve973qJqQKNNhpoVKClCnqVXVXVdV1cUvV
dV1XVdV1XVdVlIFLVcUkUwU3VdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVd
V1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV
1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1
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
lAg80uisCWrmwpkpkpKZTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJ
TJTJTJTJTJTJTJTN2UyUyPKZKZ4yFMlM5wpkplSymSmbeKZKZkgKZKZVkUyUzekUyUzhTJTJTJTJ
TJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTJTPspTJTIKZKZrl
NFMrlMoCprd8yZzMqaVNKmlTTnMmczKmlTSppU05zJnMyppU0qaVNOc5zrlTdQVNKmic5zhrCppU
1BPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE8bCn5d29BKe5StW777znOe+
++85znvvvvOc57777znOe+++85znvvvvOc57777znOe+T2dnUwAB///////////0KgAl5QEAACLE
dTER///////////////////////77znOe+++85znvvS7vvOc5775zbfec5z33QgDfec5z33GYN95
znPffgG+85znvvvvOc57777znOe+++7k597Ofd999+qzH0lRvvvvmTzrb2e+++/Zz/Jz333337Oc
57777znOe+5O+85znvulzWLb7znOe+6xqUJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMUUnOc1F
NGKKTnOaimjFFJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMUUnOc1FNGKKTnOaimjFFJznNRTRi
inez76imjFFOzE+qKE2uiKu6vtrL+4tlZhh/5CP3BxLfuOW5EMK7J9dmjAYvn/xhzGH9Nbxfo7/n
/z/LWiLxHhhv2R3PhCH4F3s+P9j1e/HY9hDIMD2RRh4eGG3WWP+yrrewrLMv1l2Fl9dbNNKsy+wx
YcX/U1sz7CVke9lX9hEMLMt37CysLKysbOwsfo2eIY2cYxrxZ+MsGdhY67PzPyHB7HfYMlb1/j+R
9k5a3FkZbK9Zi0mfn/zn34r1q0Ak+I+/dehgX69Dx668YAY8y5Ffx9wAeH/////////Oc87vCff7
/////5///54MD/GZE4ZgGV6/5pAL1ow/8cj9wcS3jjluRDCyMn14h6A6vmffF8z1iy33fo7/n/zP
LBEyF43gYb+DIgz4Qh+Bd7Pe/ser347HqzkI5BgeijDw8MNussfxlXYMYVlmX2FdhZc9dbNPSWZf
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
3Z3cq+b6V3k54f6XiPoP5xRRWnTUzLv/v3XHAP/JUlaUpc5kpro/dlv/y27nOd7jL9f4c/DWseHB
d7vitf8d/57K01LyM6HdkHeSpc2nITQYEF56DuD+LZn3d/1wIHA6gta693OSD8QIP/J97PacpXNz
BmZ2XOIMxXBIK/fj6MxKX7yYEGKqKbKqylLxKUt+SV3nLdVBcpKznS+7vw57JJTm1PnYOQDI+gy5
Ob784OFleU557LHZA7YjYCBnZXRz756DnFFKdOlQkr4vMy/9AgDkQ66P/N5SVpUpS5zmYRQ7LL1C
COhOs5yXJSoUFWynQzLv/v3XHAP/NqdKlLbkj7Lf48ltvn7bdznO9xl+uv8OfjCssPmHBfN3xWoZ
zbnz2pU6HMjOj3b+82pcUnITQYEHO+gng5xa75y7/rgQOB1Ba117uU57cQZiBB/5OfZ7T2lyf8F3
c5c4gzFcEmQStX78fRmECCUv3kwIMVUUUVV222wSQSlvySqs9leBXaVy2pb70su78O+ySU5tTl2D
kAH0GXJzffnBxZXlOeeyrTrBRA7pWI2AgZ2V0c5znJSlQoNjZSo7K+LzMv/QIA48HXRn5vKStKlt
KUuc5a2S3u+roIc2z1GdUZ9+ZPVVOaqVk4s6VXKqVKqe1U5qpvVfqY6qsNTVTW6qSqrFVOunPFVT
Cq5zxVU1qpMNdVJjdBVTmqwc3Xuaq5hlFVkWXlVOqqVHVcoD0HS+nPE1nRa1eGP0NiPqq+egqp9V
SvVShVTyhdVWHLq+qkeqmNVNTPniugqvVX6qXeaq/VSG+ziqs83Y66Xbqp7VZuooDVVQar9VWKql
2+fKDIqqQqrNVOHV1VJPPVTyqkyrKrlVMqqQKsqt1U1qpN6RmejnqpKqtR1U0qpaiiqsZHVSLzx1
U5qpQoKsqvVdU1XKCgVViqn9TVTDKrMVVKlVKy56vqtVUt1dVSLVS5VlWVdVdqpjVTk+VU7qaqWa
qaXHFVT+qxVSNV1VMKs7VFTV9Wn1kdWxVU0qph1qs1Uhc7qp1mVUvVUiVUwqpAqv1X6qWquqvVUx
qpX58XNVdqv1U0qp1c1cVVOKqVKr9TVSh0P2qp3Ux1XKuoFQVWYsqeeqluqnlVNqqYdObm5qqY1W
jR1U8qpnFVSVVTTI6rUdVIdTU1WRQVbzrnVVMqDfSqnVVOqqUuaq6aql+qlHKqbVUj1Ug1U6iqud
KqdVUv1U2qpXqp7dTU1fVtVJdVioq6qlaJ9jdjxnfPjyq9V11UwqpBqu1WY7vOeqnMV1NVK9VK9V
KBqtqu0FAY1Vuq3V/PVcq9+dKr04a7N21dpK9au7SV2rtJXau0ldq7SV2rtJXau0ldq7SV2rtJXa
56uq6q9V1RVtvKiq9HlRVdjNFUvpzxnqp5VTurtx33PHmdHV2UFRVY56r9RzKrDZVYqpjQRT3PHV
9Vzn55zpFekrtVdHVeq6rqCq9HVaOeq3m9VU5q2rart1WKr/SqnFVigot1dVlW1c6rlTd6qp3VTy
Oq9VTiOpt1K2sq6c58ku6DFzns1VuqmGWqrNV89V2qmNW80VWKg5qqZc1VMqDO3tnqefn5+2Nuqm
lVNKqaVU0qtVNXVWqrNVqN9+mcy0bW+er6jOc8V0HPzUF1ZV9Tz81Viq5U7q+q4Z3lTlTdWRZQK8
y/XQVERuarYqrG9bxKgTw10GTuubnjzfPz8/PzGMaqmlVNKqaVU0qs89VqqzVa5j5Qa7RVFXPtzK
rKrtVrGeq7VZ3Vk5VeqtXFHV89i7XfbUejmqKqYZrtVTF6zZlpUHehtrtVnMo96q/LNVcqOfn5+c
xjGqppVTSqmlVNKrNVurKrVVqq1V9VyqxF3u91XIoso6ir6uqM56v5s68/e6uq6q/VeqvR3QRnzO
11PfKrMVX1f1qtG5sNVbqsrNUFTVcnG6u58qKjm56r1VManTqpi8oIrqucy60fWq1HUbN0NVZNVb
qeaPUcdVO6qcxRXupjjq6a5+fn5zGMaqmlVNKqaVU0qtOrKrNVqq1Vc7VU6qtY44+lBuM1VOja1F
Uc8dRtLUUt1dU2epjfNdV2rcyrdOq5VcdBVYqD86oKmq1zPmzmqpjVZqt1EXPVeiqzXO6qc1ZQUG
c/Pz85jGNVTSqmlVNKqaVWrqtVWqrWz1fVdqyrKu51kWVBtUFBZrzpU891dV58qaG+p+ZVWOap54
qCp5u1Vqq+qrlDHQem53V/NVTqq3lWVfeVbU0FV+qmVVyq125o6GgNzZVbq98/PlVjn3VYqp1z8/
PzmMY1VNKqaVU0qppVaqtVWqrXbKrkbqtVPPUVWXVfx5zGWRVJlnPQc+Vdd3HZz0F5h1VYXMeLOt
XNVFV/TqtdKCp5o6Chq/rnNlXs0dWVflVpZVTqqmSVV+gyrau5o6HpVayq5j5qA0dSnbqs1U5q2e
qOmNc/Pz85jGNVTSqmlVNKqaVWbqtVWqrUVVq6sqFVTGg3VTCoPfSq7VlW1OUHWhvny6iqmVVvKm
Pmqt1W+bE4ubnqxOpPFzi46rrq+hnFzOr+tVNKqa1Uy5qreVU5qpjlBVf7UNTzOqz2oavygi7R1U
8qpnVayrnlVuqnWVUxmsNVTztVfoO1Vp1Uxuq2bpz8/PzmMY1VNKqaVU0qppVaqtVWqrVVMIquq8
yoIs5rjNVtVOefmi5jnceKKIR0FBHQ1fnvNV7jMaOrKvq+rMqt1U5yqmNV+gq6ratqeaOPm6VWav
ocioDUFAaOrKsjq+q3lVOaqY5VtX1fVtTzc1TQVX6rXTvQ9N9dRc8Zuar3lVqqnNX1ZVlX1bU1dV
uVUyqv0HSq1V9DHzc0dBmUHuczq/q+aq5VtW1dl1HTmqpzz81TU80dBQRxxxd+fn5+cxjGqppVTS
qmlVNKrXa6rNVqqyqrlV+rLx1EcSquc1WVXXlTVtVuz1GdFVTO3VaqpioqrC71U7fSqmVVw9V3zN
mqphqLOzqp3VYaiqp5VTq7j26t5td6qdRLn5ntRVWjxHqplV7ztQVUxPVnM6vqt1X6qetOqnknXs
nVc62karU+fn5+cxjGqppVTSqmlVNKrNBVdqtVWqrVXVfFUdXdVjKu5syOr8w/PV9RfbOfmw3bpH
dXdt5zVXquqpwerqr2+90EePtkZz5nY5qsx1LoO8VRVZioKrVX1fz83XmWYYx6t3lVuqzVYizVBc
U5U1XE7NeXQdaB1fV1XI1B0OeN1b2XNlVypugbMueKLtfNz1Xufn5+cxjGqppVTSqmlVNKrVV2Oq
1VaqtR1XqrZ95Vt1FV7VW3VTiqxqqnFBUVXIufdWVddTfTnqp3VTuqnccdVO6lqO48W6uy+lXZlB
znVVvKtqvVCuq8eqxVkVAqsNVTGg5qqYxZue5+fn5zGMaqmlVNKqaVU0qtVXueq1VaqtVfVdqsRO
+hqrV1bVd591GVfV1RnPV90FViq/VtXa5s6VPZ1du6rlV+qnNVyr6uqpxVfqvR3QVN8+K4z5na7N
U3U98qsxZVbqu1Uwupq+r+tVo3MjVbzVUyoIqiq3VZWa7c/O+fnNVnQyoKqUqrnSqzVTmql+6r/P
IqvqpxzZVSBVTeqmXPV8fPVYqprdVNKqaVU0qpoe4qvq80Sez1XaqVz1dV1TVSoj1K74nVYicbqu
xWeqkKqn9WRx1UxqpFMeqkGqnXPVYq6qmdVyo6atba32aoOm11S5jUzqs1UxqpjlX1U+qpQqpQPV
T3GzVN7yoNzVU0qppVTSqmkccVVN8d96qfHoDnquLoegq6i58w9VoyyrKvqaqWKqWKiaV3zc1VIx
70agur6qaR1U679O11FXmjzFpR1Uxqyq4arMm4jJ4I+ZVZz1U6qqgaqpxVTSqmlVNKqaUMR6v64e
gbNQn56rzxnVVioMc8fNV5zder5lVpjG54uaqliqleqliqli+bmu75uY56qe1U+qp6c9X6yoqyra
qaVU3qprVlV6qlaqliqliqmlVNKqaVU0zrl3QY+1BVShHQ8/NVmVKoMPzs7NRc1VMDGqbw9BVvO6
sV0FA2jxOgyezqbKA9XSc1BiNHz1XeegoDO6rlVy+fmqsVZQHNhqtk9nZ1MAAf//////////9CoA
JeoBAADKhTAmEf//////////////////////rLNz8yqum5zx0EXPVTlRuiNz1Uw5jmonVTOLrkdn
qenPQ3jqeaqliqliqliqli+bmu75ua7OeNaNeKqmlVNKqaVU0qpYqpYqpYqpYvm5ru6jmuznqsVW
MV3QVWe1s2qCKgqFHV8XNVTKr6qeVUzqsVXarkdV45sPVTmpjoLqznuKpuKovmqppVTSqmlVNKqW
KqU6qdVU6urYmc93d1U0qppVTCq/UYl27pbkWunbIVU7qp5VfMe2QPbuV3dVOrBF1U/qpN5qire2
dk+sxSXrvM0FzWTh5u1qinIjTE7msgsQpoLMzNOjY2taTy6Hn54+/bDUCWR83NzRx83M26g5716c
59dj233zCmWc546M56nInZ1QHR7xVBt3v29b3OGyjPzxbnHfT3fazddde5znPlTrnjiO9WsUfMer
qui5u9XOouj6xWeYmbv2gMsiOr5/EePmj12kiNvnOc532hu3zGLSFjaiqec0fO23t6MaRbiNHHzc
3NHz81Tzc3Pz1PNzRxmzI48oLM7dnOc71nLLzmq++erKDm1U21zmqxxdHU1NWVZVlTu7q2rKuq6r
qsqzn55g2+fm5023dxRRRaqKsqyrquqyrOfnmjbu6DIqmQ5znc7QH545rvi3QXQcy50Yxz83bmoE
766tzl9uapoeagvXagzfOcx8oLd96Doo+2t9lHz9MOc54+nWPn59dMxJYka4+bm5o46iobdRzdTn
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
ZdV6gw24ozaNzWd0HSgNlRzZ3WTDPezdLPz3HQR1FWHq5WfqjVEXMfn2c/e+eOOzc1HqgPUR0FAe
pj/ijpnMOgzR1UdLi796mo54qigF1fVidq46uupffrh+psdm5jRGioDpmxq+po7qamgwxz9TWqHq
Y3MaJNM2WegiNQVbVTmoq2I8fXqa6u69zcxnZl7FaiNFQdTR3l5ceZV1TfdxRmyJeqhoIutB3dnN
lmVVMKCyHI6vmjqDGqvVZEarhVYqLPV1RUY7urajI6qY1WOi5oqicNHHUVX4qUxqmOsrdXRGoDRc
9VmqmPNzndBzvn3VkdV3miqe0dnM4+gqsR885lTVlVjn96YUSquVdHVYq6Oqzm+ePoqTE+eqxzW2
44hkR6B3U7P3u+aNXQKgqsVXqvferMqEeKhoaCKq5UxxxPph5w1B2oObLy4qChoarnPkVSuieX17
tUHNOa77XXsbp17L3qeONxNRtuoNVkR0a6qYLn7PrQJmPFQEaC6igoPKDOe6nHeJ1Guc1ViCMbmq
pxUKoioKiq7dB3oKA+u1VtVPOaraqd1U5qKrFVMGfIqyNQVWLoKuw9x1BuaqnVRVYqKqbRHquVUp
miijs7w0SeR9KA91KcUD0Bt5U1OVUwqs1dQc/PlBUOgqvVfnSgoKmq4bEeoqu0NBFHU1UzqIjXfX
DPKCg5u56vqcV0FDVcqaqZTlVMamNdGbr3M/XnbXfpOLt17PtHm4o6BR3+nOqr1WPmznqp4aq5Va
oardVPqqdLrVZ5o6qdVUlVPPVTPmqphVT2qkKr6qQqs5jGiqO1VKFBzVU761Uo1U9575+bD83PlV
u4qDmqpQ5uerVNVUw1QXfNzmNH1qpTqppzxVbVY56iratimj1fHG7zpHzVXIul3Q9T83Nz9qDmP2
qp1VlCekqKuqI09nZ1MAAf//////////9CoAJe0BAADf55kJEf//////////////////////oOf2
o5pyg1HzVFXn8q/OaU5qrnNQVaqr1TUd6qVqmLnqp1VTGqmlVPaqeRVdVeqpTqpdqpSVVItRVYvu
eq5VvNUq7oaEgUPUx1UxPU9KrlXVW6uq+oqpzVYoKrFVMIqqd1XYuer6ujnrquVZEqtXXKqc1UxV
VO4o4ueKqxV9VmK4qv56h1crs1BG6sPVfq+qmFVNTRZV9VMcq+qlCqlCrIuZVbVZqppVTztFFnPV
eqpQqptuK6sqs3lV6q5VtWVU9qvXV0fPQVW+e4oqrEVBVTjnqu856mOKKoPVnNVZqprFVtW89BHV
ShVSgnVdqpzVTHmoKsi6R89VKFXVW6qbUEVBVdqpnVTWqn9V6q1VSzVbjjqvZzVU2qpQ56uqtZVT
Gq5lVMnVZ56rsVDV1X3VZvDdI4qqc1XUsqpiqt1uLVt3Vdq7muq7dW82Weqm1Viq9kVVnuagqv89
TVT/mPd1U9NQ1UiLLqI91aarnnc8drnqZiLpZf2H5nvnjVBL28DPrzzynmG1zRPrcxZs6Yfn21qs
wXVKVmNzik2R7aW6QpS6N6iBTf1OmmdusPOzK09zGtvWXWmK9atfrVZENO8nJ2YdfdLS0q3SOnxr
xucnlmt9NaWum+mqanv3E6PtQmlkl8MsdLT09KQpaUh74QnJilLSPedlvaVKUXtLS09L9I0u9RXO
TlLS0tPszfylumpdOnoJ1Pf3brB7e8r3KvPF5usmtopXpW1WmZ2c7LdH8fbbXrpKX3w3mltvc4tu
c1OebIQtUuqRucUm3TdtLdJ5vRvUQKduy82rptTO/HWHnZlac8xrb1l1t161a/WkQ6O8ntKYdfdL
S0q3SPzLUw3OTyzXZvSWum+utEb99xOj7UJvJJZg1InS++UtLS0qIe+eTkxSlpH2zst7zKWlXtLS
09L90Rpd6ivU5S0tLT9jN6pT/aX7p1qBpPdG7rdg8295XvSrfF5utitbRSvStqt7qe7LtRuYa28n
LpKX3w3mrW3aGnpabmpxmoKDmoMqznoOaj61U4qpjzOpVVy6u60HPHzVWKqYYqrhndBzxVWKsqxn
8dBs9AzGOai56g7ouc8fOzOgiqs3FHFQUDPjNlqg54qCgeZQUD5qCrqsoKmo5qDqqBTPpkaoqaQ1
BV/PVTOqmlRE8vI+1W0FVOavquHj+VdVaMepq+qzjq+g5qs58qsHyOgjPz5dWGq4/PUKPnzmpLPv
mf3qbKA2VWOZ9aA9BQVX6k9VLB486uqnVV6r7palUFVyPR6soKsoKr0R6rdBVaq+6CJfJD5VZPGa
rqB4c11U3Nd5S/MjeVFVMKqY1UzqMoKrHPV3Sq9TXQVWM5zxxVbQR/Lqt0izM5u0VVqqmlVLVVMq
m1VvPS3qq5GqCI9BVeiqtVUh0FVMzUFRcM5qrVJHrrQHqpYqtc9TUyUmUGHqpjVY0ZVFRVtRHzXL
0NdxVCqIzVGUEVBz38oKilyrj1X47joKmoqed1dkZ6rHPdVOcquVU5oDRUFWA4iyqwbOerz2tcyy
oq45qviNFUxZErXWgeRVNWc9V2rFHzUFXZz5zduaraupMjq2g79dUHaKrHl948PmJ4eoVX81Wnve
ol2s9WLOZxx1FVMqsjqsYbnkq6p7ZfRZe+arontZFFcczFV/NfSr+3Rb7UCPQTNVyginXRnWb2z7
yrFU2ojClIfKN3HUOgtUF9Ljxtt89SbIsqGar0eofRoxz0B7iT6ZhrNHVcqw3PbdWUGVF4KCgOLW
by4sijaw+c1XVWKu5vmXFdxX07YfrkZzc0RrVWnqcM7Zoz418+xKJ302ZZ031fbr81O3qKB6ruN0
HPQc1VnDYa93dVypxnqIjmuOM3Nm75oz9e/Uxj4+eK6iqnlVxc0bi56sjyPn5hHQVWOegFB2j7mu
rqtNcfXsZP5V/PQR1WI6CrqszL7UDoPl9ryjzpURc9WVL6dNVXuaXoY1BVp4z/DRmNM1Jz9T9lrL
qKnPqNVy3UVdkcR28oKA8cWXkXObJvH3789AnpWzXmRdqrzZ0erO5j1U07VdQUFVijo6g0cVArFb
mqaB8zqsVW6udBUtc9myqxzVFXqgPQMyqbNz81xH7ds5jnijqd3l9+rUWG5uc0Zj1FSe4z2uvdXm
+Y0XPH3jyzcS9ud63QWnHe6tZoz9qr7Nlp2jugW85lu3HFGbLVmcaZ+Y57698fforxo2Rx8zNane
fmzRz3kR0+nY6ffqnVc5r7cxt48PNc07Om7O86VdVTHNGiVTlRQXnWq5HV/TLVWVcbM115+agdVM
qrlA5fexrqpg4u15FUDLXXeOK6M19ObnOY+c1Suhj6o48vfU9RO6B53tz80R8PFqrMVTzRRsxw6u
yLOagyqmEVW9rqKCOO6iq+fN5ffrePp3axI2YbniNHl8/MfWznuzned+hqlde6MY0XOc15rM2c5z
83OeLnqTnVQk9c8Rj4Y2HPo1x8x3lnPfeI3Xv06PDVfQRUES1qojuPmOeM99+t5V0XPe+mRY9Y52
M3erIjqoRt7Zo6rlV+Xta2fWznqzvEp3H2rmGZlXYKtlNukyg6R5kxFG9xdM576Rzup2dx7tZR9a
C95Vx4u2qsyW2scedOvSg79rs5zVZHfNGqCgoDHcWO+fnqKsqu1U8quPoaM6qzm5oo30x0HarOeO
Orufmxny446Ckq2raDDW3370EfbtHGu3fubHV1Wn7mP17dTtmSqI/lmvImaOjyPnoI+Y8dRF0cdB
3639eLLqppzH5SxRxa7LrkR7TqI6qY1ZVvOozZJH0vFQVdnNu6u3zRRR3FVuRxKK6v6Kg667bR6C
KgnYqsy9tZeHzcebqzn6ROg5o46Dv0d7XNHePnidRVTyq5UR1FXc5mdc0bijMu2czjurI+2R8/Md
Y6uiuOgq2OgXag6Pu+0ebqubzubburqtM40JT1U/qurLdTVTyOO7oIqtoO9WGqpvVTo+VXjx1Dq7
mPzvnqpByqnNVKFXVXLoDHq6O0Y/aqntXGq09VOT1U6qppdX8/fmqyrqqfRRrpVTOKKJdbOn06qL
KDp1y+jvGbmuI3PV7VAqmr6tqVVtXVFWZzXnPVujdKqY8/bmcdVM75sVBnNU1Xaqd1Uwqpkegq+r
6uqsY6qY1U9q+qn1VOcq3nqYqtqph161MfOue6rcdV2q3UUDyq1VlV2qndVyreeqnFTVZXh6tqar
EdBV0dVyq5hqjmqphVTPVXRrniqI6qcHoKsi5Yql1NRVYPz1UxjiPVZoFVfoKCiVTHE8Mo+aOq1z
nqu1U4oIs7RGPVaxxYeOqnNBuqzmVUwq2q0bKqQqqcVdUVU457w3NQVbVbqpnQXzXzUFXR5Vc5qv
jiqsHqu83NVY5qqY1XOeqnFVOI6sa5p2q0uagZo6rtV7nugVW5FVTCqxQXz4ag56rzjjiVQagiiN
QHqt1dVTirUKqYVU/urJ19KDRqA5vtAeKqzVTCr07RzeRUd3FHzx0BjHVTEaq2n1ixHPO0FBVtQ1
QdG7MtYrk3V5bvQVBsoKCgNVcjzpSZSGl+Xcz0yOcvsknHdBopQW6Nrcwrf2m8W/jfqC+AyZQq+/
TtJL9o+lNtPGlt1vn1STi398k7dPO3nzt091JLumzH8VBtKj7KlU1Lt+KWvFO5Xu932SNLmvd/KQ
pMrWZY0vme0e5fkz9WJ9G8vdelpvlb7ta6SLFR0fVvNzCO/tN4tyt+oEkCuzKym779O0lJL9o+lb
aeWlt1vn1STmJbX2Yk7dPfO3nzt03qSXdHS02Y/FQdNpSdl9lyapdvalpIpzvO5Xu732WGlzXu/h
WjpCkyuhssaXzPaPcvzciy8x9LZj7r0tN8rOTsu3Tsn9cXNVTOqm+6CqmdW3FzVfVcuq1VTGq3VT
Xm6x81TVTWqmuVU1qprHV9CeqmtVNaqa1Wbqu89WVUzqprVTOqmrqppV9VNaqaxy1U1qprdRzOqm
tVNaqa1WLqptVTGqmtVNarVTQ1U4qptVSDVTiqmtVNaGq17FVZkqprVTWqrLVVkqphVTCrqrZqGq
mNVMaqa1U1qprVTWqmtVNaqa1U1q2qkCqkiqkCqm1VNqqbVU2qpBqptVTaqmVVuqm9VMKqbVU1qp
rVTWqmtVNaqa1U1qs1UzqprVTOqmtVNqqa1U1qprVTWqmtVM6rVVNqqZVU0qprVTWqmtVNaqa1U1
qprVbqplVTCqmVVNaqa1U1qprVTWqmtVNaqa1bVTKoqplVTWqmtVNaqa1U1qprVTWqmFVMKsq2qm
tVNaqa1U4qprVTWqnLqptVTZ1U1qprVTWrXhpKr8XtVNaqa1ZVT+qmtVNaqdVU8qyqni3VTWqmtV
Naqa83NOVU1qprHVTOg7nmLqp3VTs9XVUydXz0dXe1Uyqplzx1Uzqplbz2K7qplVTNx1Uyqpkc9W
Oq9HVby7q5ZVTyqkOq6jpmqu5zZzWniqt1bU3VZqp/VTSqmlDcdRdVvnqat56qaZVcnYqrUwaqnf
NkVVnaypjiNVdqpzznq6q5VcyKq3VlVrNc3PUxx0NX1XKmOq5OJHPVTyqntVg1TUnj56rlVyOqmM
xVYqphVVDRsqzLq2q6bm8yq3PVYc1WVWDUCqs3GfKrnPlVqYnYtqKqyeK+er44qrnPlVuqyaqzHd
TUVY7quYqqc1Uoc7NVp46mpqpxVc53VTmqnFVWeqnF1Md856mq5Vaq6Kq6qrlVqqmiqpnVYdSePd
XVXYjVXMj9qaqSqjKqY3lXVUuVUpVXuepjq7nquY6ioqpRqp9Vfqu1dVfRl46vqpU85sqtVFWVZV
lRFVlWVZVlWVZVlWVBqjmMarKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKs
qyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsq
yrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqy
rKsqyrKsqyrKsqyrKsqyrKsqpjVafPdRHVTGqmNVMaqYxmqsxnMc9VMaqY1Uxqpjz+xR8/N0qaqY
1UxqpjVTHnmYqky56qY1UxqpjVTGrKsqebnqpjVTGqmNVManmPVTGqmNVMaqY3uKKKOqmNVMaqY1
Ux5/KuPcdVMaqY1Uxqpi6qY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1U
xqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGq
mNVMaqY1UxqpjVTGqmNVMaqY1UxiqpjVTGqmLrOpqampqampqampqampqampqauqampqampqampq
ampqampqampqampqampqampqamN895N2+ZO5uafNHaupt5bqY7tqO3cbVtxc0xHcadXVfV+er12s
cb56rKluqwapvLNzVPPnPV2YY8Ud5VZ5+dc8a55VnOar7zneZV3bnqzFEs7Z48zKnKtq6p3zVdOK
Zq6pjqsZZ6r9V6Juobbquxc0ej1U4u6HnqcNlVhzHio1ZzZdx3FRxzdRaxzPPOqjXrqKsuWYzZ/O
a/MzyqzUVPmVXKrlVypqeepquVXMozuJUZ1MKYtqhmHNTCfuc53UZU1X/MjiqsRnznNzzJo+eLm5
+epNzxG56GrKsq7m548qOeLG52KLmOfnjifPHfPlV2r9VHPV1VurarPPH5OVXs5jevKsqD89nuoi
T2dnUwAB///////////0KgAl7gEAANKkE9kR//////////////////////89THVcyK8dVMKuqvYp
iN3Hntniw656mPniqy1j8qY2bLt1D5oru+apqv1HNat5OfYubtNvFzGjqu1Jqrc9V1V3miqvVX0q
Krbju6qcRVN6oea6rtW+3Fcx5URxHWc0dVOardpvHzVPkZr8ovfTHjM2zHNGczerNG8w5r22aM5j
mdsxzmw6eh5d81Vqq7aPVZobrxRZe/HlRN1Uyqv89RVTLmdSab9lvDxJXeXeZc/kZzRGPmM+HOY0
Ss+W99Lw7MaI58m8PhzG3U1XMPm7Tsx7lVVu8itxVWJzKqY58Nkc97UZzWquq2+arFdW1beGo8yh
MbFlHUeMzMZmqDeZZs1tGvMxmM4o6hGNesW1R1EWM0Twyn6r1VMrjdVmojNkfOY+VWO0dVyjfPQ1
DojmPh8w5jHOdqI+bu+mHMeM5oo8w+6rhjnjiNz5h730aZ44jHzI+daoXs5zGPhz5u1FGzmfTDnz
DmiOeq5Ec+TnPVtVuON1XNUNxmVV6IxznNzqLn8VXVLy7NU3dmN88aNbU2c2VNRE7N5Pq+fyoPdV
4x8q07uKj0fDujkqLaNFE3UJxTkXN47PP1WTVWJaNGVWH546i44o7zMuM8UcdVjD3z4dI/PM88cX
Nz89Rz8+ZHz8/OaLn5zc/Pa8VTQ1ZU1HPzc8d1Oc+c/NFjw2XO3FEeI61hj8/PG1q+fn95qk6q51
HNzVWqnnq7mNVlDz1NTVuRxx1C1fvPVq5jx8+TdWGqsO1N8ymo757y/TO8ju4lJFcaU87Mqsqy5i
LyK4qFx5V8Ue4p/1rE4ovKmPnV3U857qIsbuLDxVWI7znyNPmu15zzJj8/NUc+ZU2+1Xc/ObniNz
rLjyPDUNWVFTzc+VPbObnix+ZV2O52KKI+ZdVk1SfnjicsfNVZ8885qsq2qmNVioqtRVbVTS6vqp
nVTPKqYVbzc9VMObKrVVioqplVhqrKzmw0UVVOaqZVWqtq2raioqphUVBzVUj1Uyq2ratq09RUKo
qMnKrFVMqtq2q9HUVFRUTFW1bVbqsVU5VVioqKtqKhVbVtW1bU5z1FRUVCq2rarVVMObmyoqMPUV
FXVbUVbVtRUVFRVtW1bVsRjVbVtW1bkRjVbVtW1aaratq2rTZUc1W1bVtW5zVbVtW1bFEaratq2r
aioqKiratq2raioqKiratq2raioqKirKtq2raioqKiratq2rKioqKirKtq2raioqKiratq2raioq
Oaratq2rYjc0VW1bVtWxc0XNVmKLnRqsoMqp7VT2q7V9VO0c99karT3PUNWzM5QqLcUaza7mj5o5
yq1Vaqatqt1FRzVX6qf80dVmq1VaqLaqci1dVmqzz1X6r9VNKrFVM6qaVUzqpondX3dTVfqv1fVf
qyq5Vbiqw3NUZVTKqxVtWVWI1VaNzGjPUVUxqsc1WGqsVW6tqDVZVtSY0VW81VmqkOrKsNOTlVPa
qe1U1qpl7VT2qntVOardV+qntVPaqbRVU9qp6erI6qb1Wubmq2ojqHVlWVZUm3OGNVtVIFVmqxQG
q2rKsqs1WarcSq+rKsqyqkSoNVnNVTWqnBqtzm58qplVYMaqxzauOOq1VaqKiq5N1fEbmqt1UgVX
aqex1Wqsqzmq2qnvaqnFVg1VurarZ6irasqyqmlWUNWc1Wc1WVZVtW8xjVZN1WqrNWVaarD1UyNQ
1HNVtWXVbqs1U0qyrIou9Vt1bV1X1WNVU1qpvVYq+r6rFVir6vqsVW6qaVUwqsVfVYqsVWKrFViq
xVYqsVWKrFViqxVYqsVWKtqpFqsVWD1XarFViq7VdqsVU0qpoaqxVdqu1WKrFV2q7VYqsVXartVi
qxVdqu1WKrFV2q7VYqsVXKSqxN1flVyq5mVXKrmZVcq/MzHFnNE8zM5oqtqplVtRVYqMzMiqOaoz
LzPcqyrLzKrlVzMquVWaqaVUxNlRmVXMyq5VczKrlRUVW4lVczKrlVzMquLVVzMquVfmeqq+eq/V
fqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V989XVZU1WqrVVOrqtVWqrVVqq1VaqtVWqrVVqq1Va
qtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaXaq1VaiqtVWlVaqtdvKrVVry
q1Vayq1VayKq1VaidVqq0aq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1
VaqtVWqrVVqq1VaqtVWqrVVqq3Vbqt1W6rdVqq3VbqtRxRxxxxxxxxxxx5HHHGI44xV1X1fV9X1f
V9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1W6qYZVTyqnHPVduraqSua7
u7u7u7u7u7u7u7u7u7u7u7v3Lu7V3d+3d2lWu7u7u7u7u7u7neBSu7uTXY93dxPy7u152Nd3cUt3
d3d3d3d3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFcUUUUUX5fZauh7
Es1K0+0l9m1exMy5MPKWRfPLMe/E19zMVuPzGu07jeKZzCF0nlGc6eRRRymb+vzFMPerUTaevPO/
Sjbt+eTF+e/JiyCyko0qP2zukfiWtfPFSdNfFpY1vt02/sl5l5qVYf7MZ/XyQec73nSdafby6NNq
9rSyYeUsiVmB78VqXMzFbj7eY123lvMuZzJLpNKONXlJFFzzpm25jFMPerUTacuvPO99KN3MW/PN
WvPfm7pVlJRpUftn26RzCWtLxedNedrWlnl5vt03f2S8y81LmGzWLayOp789QHMZ1yrcPg0erOuR
QcL53yNHGj3ligiqyGQoKCqzVffK6BqdFVw1VlUFV6FVjfPAzijq+o/VOqDpYziKBo298c15Y68U
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
LLtGP0PqYPzRs1Tnho7xWsMc0xq7R1rHhzXzOpZ2fvOxR4sR4ozmoPO+ZQbPejHeKhOZ3beJrseO
JHzKDeu9Ac2XQq7PbbZjuYqDnqIzde+Hyg8Md5etntu1QnNMbPjeYaOIx/KDHnXue7j5qvjkoLbb
zLq1O44+ZxG7RqO6nmu7NU3jjw181vv27Po+eOg7VPSI2R26DoZXnc1BfXfPzxb31uzRxxbXc8cd
63Z1FFU1Nn7c1430mUY1u0rj1hqmpiTPHU5mumtZ0nZ5XOHNOI+kmepNvN4+c58oHFqO5q4o1Fz+
5dn5soD5QRZEZYj5FE47R+bmiq3augXeM9q+aKq1zOrLugu3vWjWbqrNvrzxRRs0e7vpHHEfGdHi
vmqT9r5o0qDHpzJrzq6CgtGj0a6mLmjOepzO01vWdJ6dmKFnMjuqxUeVXsNz1NV+q9nNF3PVeqp+
qi4qtqv1Wlh8yLmq6O6r1DV3XIquMfKCrOegursuo74bN3nPzqOhq+LMuOOzxxxZFd7Oc0d9vVh6
CLvHSHquR5Vcq6qnPSoqtVWaGrHzmyqwaoi7d6qd815VYqsGqvx3zVbVTPmqsc9V/nqX8yoi5soJ
jdV00VV3F1quc9VzmqLoI9VNVy+1BVZiqIo6CrI47qT0F1fdVqo3kVx1J6A8fNFlTF1iiNEeONc1
WVXKr99zVdUVUwqpg6sjqavqvXVlVmpPFVYqphFVY69THjq881FVcqY6rdTzRRXV3NlTFUx9qrHP
Vl5zRXdAlV9V+q4aO4oqqYVUwuq9FVZq2r+fdW5mRVUwi54o9VbVeqvnjoKvq40VVigiqphFFVc6
O46r3epV1bHFUGj6m1d1bzVNTz5UPXZpGTqvVNX1XKr1XVfVTiOo7x4fnMagqKqdXVpzRJ9D0GZ8
2Z3re+/qYpD0nQx3qYs13Mduze6B9e7o6OckfRtYn01vLo57zea86TExvp04E783J8o5jY1ReZ3n
9tLeK29bcr+Ufyun92+2p7pnlGvdbfTTdHrW+CU3039mdfhRzOp/L74pp9L7Uf1z3k7cszedlv2R
dFSapJO6vNO73NUfZWtdmsvNdmKwo96nJH0bWY+mt5dG3vpnTfSY326dOBO/NyfKN7GqLzO6213W
8VlW+i25XujdfH92+2p7pnnq91t9OjdHrWt8Epvp2fbzS3M6n8y+5lNPpfaj+46Hy8dyzN52W/ZF
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
e9vRJdssdG5kds6SyIoqTNRbt3Qn6K3NY5cPfbesanvO+LzedqGhnCmyNKQNrO+u3ehP2UWZQYtO
g6b9a0Y9y77KO8mOidH7gOtx0K6dPl+aWdu9BfahdC5qcxNK3cX3uilag767bmtdaK6LpQY6Cgtn
oqLp0oOnUz6ug7zFqgvXu99Mvzea1ot28mM3j79Jzpl7nM6dt3vLWaWauOgmOnTFhvaE09MZOu/J
6Z62bsVTmgyA6ZNa5nu3e6GPOiO9Y9S5h777esa353xebztQ0M5S7I0tKbWd9dqChP2jUWZQUGJa
dB0frWtGs9zvbsue8muqdHoyB12UdD2XXr8vzpmdu9BfffR0LmpyhxNK3cX3uilag79O2zTWutFd
F0oHQUGM9FRdOkVB06vr1dBQTFpX09Xbpa3mtaKdtTGbzo6DOu+mX2nDdOz3e8SzUwja7H56BzC6
7xZF7s09MYnfk9M9bN3nWH0Gap61g0WLL55hmqu1U1Moqqc1U8NUVU1upioOdVU+joMqphzbiqp3
Vcqt81REsiPQc1VNqsqpt37/D0EV9o6mgoCB46F0Bt2a6ubi5ua+uGvmyrKqd26Bx1W4o+Yx6rlX
PmoKjDVU8NUXVaqprbs1BUVU+NVSBVTZ86uqnB044r54o6rVVN6nmjd0FVugdAds1A6Cqn9VP4vl
xVdQM11U5uqmS0lE6rfXrFlVyo5qsqp06CgygoI6sj54o6nnjqpzzc1AjVU5PQXGe2eq1VT66A1X
UFAqsqzubmqyqmVVNKCr+ej71ZQZVtWKKgqatqar9VMciygWlFnXrzVU55o8ioKCgNQVXeZu6A0V
Vzv8MsqprVeo6sqyrKCLmq03Y1VMKso6k1WUFXVER6Cgq2OrKqfVddWXdXqgqU6Dmw11ZU3VTCqz
Vt0HY+nQUGVYznjyovqkvt5QUFVyPmioKuw9nXRKK/s50WHXSp5z89BhzVNS+eqxVl5nbUZo46rd
Vuz1dV3OYx8NF795ua447oNtug687tRXdSdR1Wqsi3OUFmi5siqXVTCoqLvn765qrtqStWily48O
+Zat1FBF3UboI6DnXWgoIo1QWKP5z4sR44qmO4jM3XmP3PhrzodxGi396Oq5FG1U81A0jOg5ujNV
5SoqphUGqwYeoq3VW5bzS8mjc5p5Z1qvXVTtmyOp1Ker7NFHVcj5o+Z1dQNnjVrtFi7c2O+2VB+b
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
VYqvVFV+5ar9VNuaM/Mlnh6j3mq+otR1afmjq2rqiPmquZ1q7m5qrFXddcz7dVzG7VXKsqztVTCr
nUGPV6q/no1lXVFX3QJmP7Oc3PzHqeZx1E9zxH5u3SPtFSRKpq2rqg3Pf27v5Qdu1Cegij81Qc0Z
rqtvnoD1e8u3VxqrETvn5qmoqI/boMcXlapqKuNHUR1Jj80bl56sjqKuq08XtVyq6foc1XRVdHVs
XXDq9PDe4uaojq6q5U1WLuea54ri1Rur6s5+kktX0B+Z+ZU1bU4uZZHVp8q6PPKCgu6DcdrT9r96
5Tr0yoj99P7ucVK9ZlAyVVzpH9FVzKC6ipq2PKu5rw9fpu61XxVNWVfFU1WOc11WOp+aqxV0dVir
TmP36pqhq/mqD1Xj1bh46iPMurOf4KTvzRq6viqyrjR1DqvUEUU86sqph3qMw9VzKrG6B0pqv1V0
VWR1PNuz96s5utR29yqzmRmOep5tzFX4urq2Pmq+8i6mN154lVxo6g8fNWyjjzKsquZzXzc8RlV0
dXOI1X89WXQVbVi689WdOpz+R1ZFVdcdW1dhzPchqiM9WRTNRURmNGZdrnqCrqrh4j80cTqs1XNV
U5qpgeq1MVY2aOrLq09VMarxqrtVuM1V+qy6qY1U5qs1U51VcqyYtx4eOq7Vt1YaOq9VtV2qmP1n
uooaqZ89WVXLznWHyNqKr4j0HPUnPFFHzxa6nPd1WKt5+Y6q7LNVTikNVTDWVXarNXZk5VdmDRHq
/DxVdVZqvxHqtXHVTmqmN3VThHqt1XqrFXTnlVMD1XTYY+ZFV1AsyraqcVWYorPFnPdQe1lSrdVg
5nHVYznwy6KrzVF9DUFTVkd1ZFdm54++WuegVVu6rMwznNdWuPpiqvGjqpjVTkzqphX9oMqLqpxq
Yqsxtc/tVigNVYs1V6qmMZqqc75quVVMHqqnN0FB4apq6o57zmjqyo56rPPVkUdBQUEfPfPlWPKu
nKrsSPFV+VdFHVlV2q3VfqsnqtVU5iPVTGqnCqvVW6r9Vmq5VlXVWNVUwquzmGicWPnqyq7VZq7K
vqtHiqpzVTE9Vuq/Vbqv1WartVmq8qqcVUx0tPpz1ZV0R4qvw9VmqnMVV+qzVdqt1X6rNV2q2eqm
NVOFqqmFV2cq6qzVcqxxxYjGPlXmUTPU1Wqr9Vuq4egqx1bz1bVYqu1WarlWPKuiqah/X5nWz5nN
zpRVWI8Pz52Mfy6qc2z5z85s8N7zmcfyrjrKirqDOegMagoLuNzkUeRny6qcPNxzFBh06C+e75ql
Yao+r3Ou5g13l7zmj5qvVqro6sq6KPmqYo6ipqsVef01VjnNHlxHi614qiqxVYq7mqsR6PVt53Mf
m6nNVtCmuy5qvq/mnqr1Qeoq6rNnyzx1WK+R1FXc58s/N8qzny+c3nbZ6mqxFzpRnMquVWni5pjG
bD1ZfPvoapqJzmsz9PUXVh63MecqHHPVbV3NVcli5+0cXWpipFU1POa6u69O1/bvt15jHoYo6CI9
Wbqt2bfPVavHdQZVfV2RUdTHlXczzyKgXPzVNaroqmrKviq6qxNVPMfm5zXVY6n5q/bpVtV2q5VY
q6OqxVp6jqY5j9+vbzVXJqhq/mioKA8dXVB6rx6tw9XOrYqtjqD47q/IjVWruqnlVNaqR+eq5V8d
Ac9VNHVTmr6sqpmepq7mqp5z1YZnqcoIjVbFVdquUFW2eq9k9V15Vft1Uz5sMzx1W6A5o6qbVfHF
GarqqY1XMNVcyua62X67nFJeWe7jNVd7VFAe6nmPMm72c3SOKqxV27yro8vV1dnNnNzOr6qYc07d
VIXPzzhqmqkGrqr/dzNVuqnBqnsL5qqbVN1bnbSuq9VtTVSQeqnuT3NHch4jHqeee5qk585tH5ql
Rb56rFTzR0MvQ1Rzx8+Krqtliq91W8Pz0BjenyLJ489VtX1Nxs6urqmpNnPQ1fVacR8urOlVvnyo
ObycdV2+apwxnLznnTqoqZg9x1XKmoOvb6XzGq2r9RRRmjPV9Rzm56tq7KmrauiqPeY+XdWZQ1NV
qr+aOhoHzRx1BjnznqyeyPR8q6TOY8d2jyRRGtx1UzzKCOgqpyqrFVy8PVd5qrFBVYq+qnVWVUx5
qmodVPqrtWYaoMY5qCrsqKsqsRkH6L3ry+3oeVdbquYeqzVcMN5W1p6FKs89usvO/nsUnTfmGnZi
426CgZ6mI0drUfU2dGbNzNsb71dkVfofmsx+nNR2q0oj6Gj58GxJKS16jzEkwUZuf3rZ+ul2U9a6
VGUEcwtdZm/nW88mJi2t9LCoLnMx5LLs3nwI9TEaPm56Dy979jue0bLqasw+VFXVZU3V1Rl8+dXn
McjnPvtcXk6n024rN9qI5jX6WuZPygMe+lQaOI9BQGnO8wdc0eqGboV0oLyKKKgOag3c0uk86Cgn
Jwy7zavpM3PR1EdAotqlPd33NrtkfM4/7vIkpwlVmY/TK37MeZb89a56jZ1d0c6fr7OYu3Y2ZFfP
UK41qecUUwbr1v5d765d5fzTi5+dPXmTsxcbdBQOOp5jc9rUfWzGzqzZ2VuxvueKrs5iR+p+azH6
VFH9lsR9TR1JhsSSkteqOYkmGzVPvWzR0HRdkrXSoygj2tdZm/nW88mJo7W+l1soLnMy4/uS+7NM
fCqjqYjR83PQeX23OR3Q6iy6mrDHyoq6rKm6uqMvnxPOY5HKnfa4vJ1PptxWb7Uc8xr9LzmT8oDR
xHt1ZFHFHQUBpygmDrmjdDN0OulBeRRRxUEZqDdzS6UN0FBOTxl3m0frM2o6iOgUW5zw93fc2u2K
Pmvn/uzc1pTmqtzHOGR3OTHmW5j1rnqzZ1cm4+vs4Zdu0WG5j89RErjWp5xRTBuvW/l3vrl3mXRx
7qairHcTN1uoq66m+Ywqu1X46uPVTTnqpnF1jPlWVXsj5lz1WXzVWOaKqnnMeq9bPU1FVLNX81W1
UkVANrDmoAo9c8UcbPHzVfEsNo5oj4IruKKpiqvWeo5+1RUVJ6rVVyrI0eoqY1Hz1U6uq1VTpVKo
KqeVWqhRxB89Vy6qZ1U9P0fNcdVMzxrDRN1WrloKqexVU8naB83PFVe1livVdoKuqKjn5+c2qqeG
NV1WVU4qp9VTA0XTvNRHqpR1UVUydVMqqb5V9Viqn9BVeuqlOojjNlmqt891NVk2VNR3iqp2apjZ
zUJtWqCr6m6CroulV2g+5lW1NVMaqZVUgVfU1U5iO6rUXSq88qOerc5qrSjVVM4jGmuneqmT1UVX
KuoKrVVK1X2c/PHVfuoiqu1BquoNVU6iij7VrquGVRUVYe6M77VGVXqioaqKqYOq1QHNEeqyeq5l
XRMzztE+m+8aPdW0PY6q/D5FeG6c9xHyJzuVGcx3zIy0e8NdE4sMeLMjN0qTs/nPHHznzUx2WGaP
VYM4+qtrus3muYWbnqUqI3PzmPUm9znq056tijjtc8VRz1ZGaozFHFNmjOeptmPlXuOKq5zdLquY
jGqs1FmTsG1l3dTHkVmw0R9zEV886frceGvO/MY/vzaPji7RqY34+j+nugjiWUUU4d79RmbDR7Rr
v75MVX4rRj4rZvbVSa1OqrqqZ1d70zmNm6BKOMxm/PVd3FvMS6VMWz1XDGR5XRH55zIjdMitMx+e
YPl81WG5z2ZbmO1QjoxubmVBUYznq+rsoGY19DmcRzRp1WOaoi2z4bfNH2NUy3z8/NkxMc8UVSeo
ObSxXEzRn8Pzx82Nx4rN6azxnPkx2NH3s0XPZrNuLFlWJc+GiNrOcyvOagjUVmOeK4s6c/nOtXjq
sVfG6ui67ObmPh75ojHeHPQRXV1W9MzrVxrN2jOY/NHFzVPPFVlXXkfV1bUs3Yx1GY8ai54ud8yN
UXVpufmqbi6Wa0u2roLNVZquWbD3aR+pjRYc0T7ZQUF5z5bur6rFXGfdHNhjm6H5qnnijRuaPMy4
qsq+qxVzN3Vs5mbofmMsy+fmfPMWY9xZzGjiv2ozUZqAwXPdWI5qrlTloyijijjiiyzxZeWaOpO3
U31eHMc2Pn5zY44ueKOK8qt1fVt9OuPDnqvVeaI8UfNzxRxVCvLd1Wak5u+RI0Rs3z8xj88dVyrq
vyI8zOP3pHUmNV3dMxzHP17R81TU80R+bnijy6vqyrKuq2pq6qw+7TN0Mbsfm5jxmji5+aOKrKmp
qyrqrFVir7x+eJRn6mOY8UfNz1PNzVNWVdV9WRR5b71dVYq2pMbDNHMc2lR5F2PVlWOjqLNzRR1W
Kuq6rakxqu8uLFzHqIjXcZ5zm6/OdM1WXnWI2VfcZ8Z6nNntKpM2eoM75o4scSit3Z6r1XWc7ypz
nqLvKrB4n3UV5tVXqr9XX7fN0yqxeWZLD4svMNKZuiPHMdMiMfIoo7WHNz9jGOeYfh8iyK4o46g8
dyc8xeG9PrcxMTs+u1R2SMY5kbms3NULHQHequOe+9VzKA+M2S4tmnD5eTGJH9NI7cVQbnom0c8e
+zivnoka6LM5z8/uZnTnPVkUZ41HzuoNkeHSwxzxzZmqrGXHV9X2sj66RjcxqrOjYeddFFz0HOa8
izpkVq+cx6s7GPzs+RVFJ7dPZ2dTAAH///////////QqACXyAQAA7DyPHRH/////////////////
/////81RFzntVZHN4cy3MPtUI6NFU3FVcj7G5uZUFRj5ul7Rz1fV275sMY9uq1z1W6rFRznqsVWl
U7qu1X6mrz1cerz1WeY7OZczqt1EdXx1XqjKqYVX1VTLLqvVU66VXee6rb3dVKNWnZqsjijiNz1W
Y6t56hny2sUePHjDOY+6CqkHnu+bD9YuYGj5hHhoqhZjdTq6qf0HNmG6urtqq5UxOoqzntHdVyNG
eOoMbnbVWVNVuq+erj1dcU1h4nUxHNVvc3U+R5VTnms1Ac0ZqmKzGiq05j7C7Z1nkFUVdQXmu1Qa
pqKqZnzMPQHypqsuKoj59xXkcXQ140lHzdudGRkaYvM0aKrN4e6vi73U1F0GUGYojpxVJunNVcqy
accxnWPtG+aKOojyKrkeI93zVYeOzRXzrmuK0zGoLqEzLKiKOqlCOqzzI6oO8aqpv7zVU5quXdWV
U3uq5U1dVzjPbcRo5JeeK5V8SlU7WhzcVVZceqSqzUR4Q9cp3gYOMXlre3HFz3mjVzTjcmNFGsdl
V2O3s95lxq9Xa16YWlIa25V7cm6RK5Hs8XPlRG6sjZ/OtAfDb4E1FmPeZL5cUuZl85ojXz+bnfMM
aLnOaoqOc5jmqKmpOao57w3PaZnibqeaI15mXcXzpVnNU1fU8zmeeoq2o56uqIosyScXOc/rq/nq
Ktq7niqL1256sZ/Eu3l36aKO8N2zJruqyTfs6nsyrPSkQvGqB21jz7v4keNYhfioD9MxGuzXzxbj
P7ZD63XVGvxtX18u7e3MlMXrOxZlMWt9nHzVNmZq5p5uTGijWO1XXY7ez2Yx41erta9MLSkNbcq9
uZ3LSJHkcSP3iqcqI3VkdnnfFQHw2/tWHMe8x3FO5hr5zc0V88xud8yI0XOc1RUc54jmqKuq45qj
nvDG57TM8TdTURRXmZZ4vnSrOapq+p5nkzz1FW1HPV9RFHFmSTy5znnHV9TUVbV/PFUH1256sZ/M
Xbygs/sXNHZjZi7qtmO/Z1PcSrPSkwXlpu3mM33fxKPnzELmFQH6mxGPZrqYlHHu/n1uutr8LVry
7e1O6t6USRFa9E5Od+BPh1V/PmpMqedc9RZzc28PV8VA49mnar1X1Y+sTt1MSP7Mxy0Scz7uLNdO
3vjW6B3rcV+L3Z7CRry9YsnLP2kNZreKgPcZujoY8jmTurI48edlkdmtn2er+z0Eb1c77c3NF1jV
6Z43LQ1XNXfPz1c8orUdXUFRuc6ZVTGKPqZZdmqsVZF3oZ6OgoMyM/WYu7qplVYMbnNqqmFA8zc4
qmgvypoJzI2lFz1cz5Um6ufuLpuLsuaqyrRrXWLfQy64aKqxVTugi09dqC+lBQ3p6quc0c5pzGRq
qnFVOO2qtuNlO1VOI6tVVODVY4jZ1+Hw9HUVUw5nV1RzThoqN8x7jqyq5VZj6l8ZtXvEi+jOz9Yn
tXq/aGK+nSzUc6zPXTtcxQ7mtxzppiY7UPfen0Wd8R2lGskdE35V9W3HFvD/LilNMM6uid6nhpdp
JpmoZkeTk+bHFnQ15qb3NK7ivNVKuLDUfbpMXb1Rk22j9KFRroY6R7fSabxG7a3J0RrT13965cUZ
3l6lzeNTXTWbWs6VNmNQ9Em7KdLP37Ogk5+m795qrh+Z6+Xa51uh1ms32eqfz8InvOvPE95JHd57
0Mb06V3pdjZPantUOjR7nux7j2typ5H3O35FFHVymVZ7mNWZ+26C1LEazPfbXvZ3kwjb7aycuK2Y
XOE5XOdr6Xk1s/ZdFRxv3U7RudtVbnZrfTKiPHnTU5eeeHiw9Esekddo88za5+57b3tTOxc6Z0cX
h3FRm6W+cx9rd7Mzx9VzW6mp9w+T2nzdr8zp3uPmVTFjv0+ZzVdb1PTHnaVKLbVqIz2ZLw9vsFG+
1s1no7eRLD3ceZtzVRFE2aos+3zm8s1Wc9zi1c1fTv7mPceKoai588PdQveezXNbR79WbjffW+j8
w9HZj2Z5dTEUnlFNLuSu8zmU7nttR7ko/XqooTd0njil6UVnqebNPzKnznzfa/O24mqnvHV2OpPt
a5ujvXl9uzipZTPtUp4hQc/PlHLm276a7Xq3Fcxru0ecy5irDXzrU1PZ06X7m+6jqHzxR81zkwZW
aoujvJ7LmsWe99xqLp0j5rzndRa3mzz01fOte5vv0vOkfNzxKOoauYNc5jVmqznvSknLPHFzUD7d
N4bn5rnMuYtnZ433OZJ7TnvD3Fqhyo5rcd9FgUfbzS0zZtzxtvMu35rVWb96Zcz0eskbdWc2s6HV
RvPt5ZquNHFZpidU5dTMZfAjpmZzpmy9yxRrXQx7MczS9zFZta6Gzss1PamNz2pqU1Ddz0ednHHu
1rgRs2SpY+6Z3HqWJ+KKOrrxbuceeGNk9mGGRzk89ZnbyMwyaoN7STq26Hp0jyK6OjnXMGdFfa5r
Q1JPUJpnccxMOfnH2oe+RY+m09Lvd3horMjx9qOYfTeSRryrotx9MN6dLoeVnvS7dDYnnae1Paod
GkmmZdI9z3ZYaO49rd9JvXOpU8j7natvyKI5s0byg2j0GR0FV1VHiqI+f3KFGs7OkJi5iO8juKrL
q48xVTDLmlfTI1Q0FQ6ti60GX0qTeXVpzq76UPZPDJ5Y9Lv2cinMPfPa2ads2qvj58mHzLF7QuOO
Nx3ZojodjRndB1qt0Cyro+9XSTQi2aK0/g621QXVTigqDPmj56BLoePUeXmGq2puI2aqFzxrma59
YeN8/aew5zVfdTQP3mzI47w2RnqTxHjiw1REnQ5rJoxry49UG48zOmatVK58OrjvMznioOc0Wz85
3HnY3Mr74+a4jxmyOhjw5sNh6DDx0CTiRtxUEretbq7rmVdFkUVWqq1VaqpnHl3HcVXRY4+l89WV
F1G+lX3GNUG4zKXXxiX31sNTB/doav5sLdoeSbuZZOco/nsvMrN2d+J5mu2vV9+fZM1HHmSTOx5r
pkqUrPelL7KPkjkU5tV7witrbc5bRTLec/rWvsevkbo5p/cP36Zo2ealaoOmp7N26He6+0Z788u1
7OJ+VmsrV6R789pFOePS++F/g/rpk5ms9fmJPppyakVG6Z7Uutrs9yxRxR0/c0cksi30lW+x6fvp
rd+zN6XbvS3Oz6WTm+nvzwkvdLOjp8uSPeSbrLeSrRByk1JLvnucx5jl6e4m09UvnT7p/OBC912t
q0/stLZfWidH99VQrN2d6SeZrt02p37R/ZDKOPphpmZ7EPNdM8xTtnvSnfZSfyS5lTm1XvCK3m24
nOW0Uw7znz1rX2PXw0bo5p/cP36ZqLNa1LaoOmp7N26He6+40Z788Pa9nE/KzWe16R789SnJh6X3
wvRj+umThtZq/MSfTTk1JmnTPal6bXZ7pYufmjp+8UckrW+kq32PTx99Ndj+zMd9F2oKW52iS649
9PfnhJe6WdGQly5I+2SbrLtkq0Qc78Uz3nd89zmPDOXp7ittPUvnT7p/PF7rtbyI6fkzJhPsy431
jWHs7bTuq/UR8x32y6Bc3c5qsyaoDXhHD50iNO93UDF2M3zd8sy7LXPH2ZGgbkceH6Tl9HnPEfmo
O3RVYkc8WLp4dO4rp9VZQP6dBnPSm6zKoMR+hjXz87XP2PdVypj5svdTQX2onlB2oKDnqXHHeHNl
BeuaM11XKsPG2Vj3Hvm5lzR5dNaxVZVvN33eGBGPU9QGqvGxXvrrLon270BnQRKrDc+ozI3OqHU3
h+aeuq5VcMqZqq5aNPVXD1ebrZVudobwzqznNixTkesqKm12qzojJbvtPkuxiCZkdq8872+qy3Q6
1Ob7zHZHzDTosyIz2tzDoKDUlBQ0O05yg2taW+nTptzG+udddTvU5nScZ4reHb3MK0rNdB21nt3M
dJ2e2qDFftoH350k3nZ3fTpQZl5N6pmuqGK6Fn9P2p+znuk0Y8eR1Y/eskZjXj10ygTokSaicTF9
u2uu1FdrtMO8e76dPd0GZrpkxFZ9TFvvnZZ2XbXdvnoeie1rbnV07H6mUXa7nbfVkZyhtduhIzoO
3R0Fzm5zeUE8bo+zWvXucT0pjfRZeXOHmH07jbWpzafay2kbrHvq2ZatNmy0+j6X267x2jdrbS6P
T7Z1tzFt1ExHNLOm1MTmy221nbNNWsnFlD0nO2dtHkP00Ww3jVp9lfTOmrfbXe9dF2MsdpPtq8fR
9n2t9pe72Rz19HPacxQLTXa+q7vRpzMfVxZvw7Rna6Z2dzzv3rvEaTn6zDavOlB0mGfrnZoybIxF
VPdn3osug6Ty6efhQduzavOz6X26b13zoZW3aTdrtj7N63rpffpjdpWjNprs6G++tu7edDbbtJPq
n2zo786T5mzR0KV2m6Hp1fvShT09z1BtzE52cxQ612I07RHvdtU6r+b7slb7UPYzmJEu1AzmaVDE
lHc5h6ddLvt2et67d+nXEiJVa879fFdu+3ReNyEXeYr7G00ta93m+u81HuY6eLDms8Uy9Tppi++4
8y2RXfZr793pTi31nNRWZ2qG6CTpQ7oJx0Fve+lD21qYzr1IPt2nNdJzHZ8zBbmFrrL2oKHLtdvH
1Xmrx7vS6a6Pa9mOp53fXM09bk6ZMRWfDxPN6mHugi5sjypjjoOdRrDZlWWY+UG2+1mP2wyiyrj9
jZbzpZn25sq9UNR26Lsagq3T3Hc76trLvVn6dIt+au5F1W6nvQ2+l2Zem6rtjxdz5dyLnoD1PNVT
zn3QUB6rZj80R5Yr7VHSqxzRR3nPErqD5Qa5sqeZ3Od1QHzVD3jc/o1A4+aYer341reTyu8qaCr6
Dufn5jHw14nQKgoI1rufKDoag1QxmToKBUFDo8TUx5z0EdAaPrQROgid9TRGP3qO8WqG7n1z6N73
Nd0GLDOh79KLD675pWY73V/XvdTz0DRt9s7R9B0zfQ+0qA9W7qvHw1Vhes2Hj6UFThjZnV8/OfNC
STfffu1T+/EvNy69fm8y/fnZ9NNLPbMnZJvelW8zTCvRbXiHadKzKyvpMrI7dHor0rjPsldbNl73
t6e53x/cjiPSX97b7dNfPqXzX35wI+FSi0Om1uln79Uw6SkNX891un69td5ycdf3Xk8vZ26a21Ii
3TCrIvGypGcuc6ud9vxEeni0HtZe5Jjpry66d4/uHTnKYk6+Sb37np/fnZ9NNI1azJ2iVvfRVvM0
/0V6p9bwdp0rMo1fWWVku3R6K9NDPsldbNl73t6e53xv7kcR6S5O2+3TUn1L5rWyvyjKyrQ6bW6X
y/VMOkpDV6/ut0/XtrvqcfnnuvKFez56a3eSKnj6YirrPtltOctNzvt+Ij0mF0e0a9yPpry66Z8t
4dpzk5TEnXxb7b8VqgtZjjodLmPzur6DKrVVs6yKq/VTqKqzQKqnG+eqnGeVXnmXeMzzpeYjpRGR
6g84k1zZlVnzt3RjM9p3zR1dVaj7Rc10NxVWMx9NRELR0bnw/brvIsOaqnExTc9V1VWoo4+c9V6q
8c1Bzt1XqqYVW1TZkfbrU3FnWro6mM9RUYlW6Vc5rOY+KYjugoKBOmx1Zdo10BuZYjZVaUVTV+Xc
cadAvTZTR9szIo4o+a1joKY9AbcXPlBHHz2Z4c10FA3Gc5qCgvZ6BUBrycpqHV3PZMUFegcR2fKs
7mWe6pak/PnM9c+X0i37vNbi56DtHes1NM51kXaos8dSeYb7a6PzPMR85+aOLr2Mo96NZrjOsTy6
BLe8WtLbzdlO1KjRniiiN2oKDpcWgj9s7XTXXo72n0zJ3sdR9oiHfndNrdNrtiy8yM597up7Hvpz
9qA3bDXulk9nZ1MAAf//////////9CoAJfMBAADABCfFEf//////////////////////hapdt9dP
3tq3H0cUzrr37bnTN+Rjou/bquY33XagS+HansNHQajPQGyI3WYps7b+Uprs3RXQavtju8Mec3as
/ZdWvqpbKdIzqgfNl8169j7RVo13N5FSYtzGe98jmOnbrbPaoLzrdBu+7XlBrDdkuyjw/c1o9rve
UBqC8PnfolnfFZ6A1BeX3nu19Gc89i9IPzx0FAegSu7ztjfe8c1h6CzXnW+7zO76NmoMs3tAfGbD
du6TazbN2jZvOzxY6DD3WXMqXrnfy/jygugvHMX0730Xd91dBluNEFQXffpMPfdWtLWlQduY1DdL
0+aj0Y9BZqC8y879O7bSPmXdAbsc1986O8Sszfe860B3ugVBeZ3vFPN9O+XdBlmR8oMtJnzObr0M
545jrpFdvIzUGua/OrnnSus8FeYvaMa92iF2+bKy2td1v36n026TV9tTGe0KStc1Y67UFBa18pZ6
3jRjpx4fXfZ4z16yoDmzqc0xMG3m9Uvyl7Yby7iN0ZCcoduNqg7PtfN2r6oH0zeR80XP2jiMo9TX
tp5HzXHzrE26BZSa6PFixrm5+hu1Al812tqew0ZrvvqM57VAbEbrMU2fVnbfylW91mzXHlVMXiVX
1ZZqrlWLpz1N4eq1VTOKq7UYaqnesZom6rTuq+btl1XKDthsjqbqp0+hqst1Ux5/V0iqM5u98769
epo4zbqN9qBdeioMqZYsoFug8tPDHdWVFV2rqipq/nq+q66hUCqDVXKt7dLoIrq90Bu11XTmNrnq
t7qzpVmGjqDVFTHV5z1HPUG3Hz6j56rpqrL7qaMeoOt1Zzc90nSgoOfnRqirOfmq6rKrR6BxVbFV
iqaioPVlT1qyz5rnRqBc5rqu0HPzqO6sqw+znoKCgq8xqDNZQVWausxj1ZVf7Yz1c6Cq7FVzyqzd
0FVztFzxVbnOvbquPG8iXWg5leUGWc1XxRqM0bi53zdD1L1ZDJyKPdqc15D1PJb0KPYpDUx9TSem
vZicJZfmiNKQplRqtR7xP0Zm1XZ9TK9PqmpffLyYvzCGpfFKrna5KsH7LIe8+3EaVopjklxXXz7L
8V3naj37vWqPcvbpPdK29ao/OlHLrXajSnJWCFyao+hSulr1EKWX5W+Zp+Um2nCzS6PR2iCuYfns
7L0y9SlaUhT8CV4SImrHU0r0mpyYnJMvx6I0pCmW0qPtiaGG2q9s+amV6fVNS+u8mL8wh0l8S73O
18JViDnJZD3n24jS3hTLmZ3FdfPsvxM587Ufac3vWqPcvbpPdK29ao9dKOXNa7UaW5WCFyao+kwU
rpdPU9SlKX5W7G1mr8pNhpghZpdH86HRDLmHLMezs71y9XKVpaVeXwJc57i6XqPmUVAci4+h5hOq
5zUHO8q7pQc9BzduaZq+rqvqz2pk6RzuUEcUlBzn3Q++UBqTH21R9n07c0y+3R3mtavPfD46I185
7eZezn2yGzHXTtQZd1Oc5sxYfn5u19Itcx4u3bKDMlqb7e9VVcNzVU4PhznjyKqmGVFs2ZzVds1B
zVU5qsdYr7cyq7noMm4r5+e7MfpVlBnRmqpjHV/O5rv16nq6rqm46Cpqee6isojRUF5V0dEfVQli
oKt5l2dTFzUGzX1itVEfapP1q2Ln58oebHEeqnFVMKirsq4pS5257jqu1XYqtNhrjjqux5VdVVlb
qpjFEa8jqedHpekV81R2uguKgj7vJlyzve8ky86OYoKCLdxPLXNHF86RX0V9KC9vsfpGrl12Ukqj
MunY7yONXad/bygqDS42aNR9kcUqfTMnfvS/khnZvijy8nVR9usg+hHPQdaDrQS73FzSJH6CYzob
rNKlkz53kiXXdegjoKnrnfozed+zRrtd24pmRUclS3QXZm3SugP8e5+gXaZ+tbnI1Sdo4jUFBSUF
xR9+5lXNQXz9bj6nMe6jZ1vGfOkW+3S7yg7ZdBkcVBUc3ad53z5Mulnb7Wc2hGtxm7G7Jo90m9bt
GO+Y/NqK0p2ROj780vbvHug7Lb+dN0b+dekVs9y0FQap7Pmygyr7MZ4lnTnoHFJVqoO9501LjN3m
LN0ijygoImzH5zZfft27muI1zGR0FA4o+mHM6OzP5HQcz913i60Cj1UOg58oKD09S1Kuq3q0ryzT
2UFBHFrue8OZvr0tKzXLIbp1nMjvHF2B4qCgb6UGR5hty5Fnx39R08F9FlSddtuzHoN80a7Hq6X7
MbrXlx/Yo6DpHEY+UnS8s1m6emuOLpQZp7pec14a9I1mnVZ+Y/N0NlD2oPLygoMji70ERzmbb79u
nW8NZuvTt3mMycvIo6Du6Cgb79XzHVmvp07du81Pdcy6s1nP1bcUZzXhunXv27delmvIo8npjKDp
dBQdzxGOfsft26dDxRnyc6zWUFBh4r5mqmgSOqWg6OOKplt3Fb1L00d7xqdUn08djpM6Em87JmpX
8UVJdHKbHGnlJ2s253S+/VHFGagoKDF3iiuM0Xfde8y7Pz9aCXvcXU0R1aG7qFd3QdJrvvNnZ8xd
In032u8rrtQV2u/PzmvrWnua6i+0u+3VaoKC1zHUZj9nMUG41l2nR2aoloIh0eGZ01fSlDVA+32W
+mX86HVrI1LR6o+0j7KOI1BQS50j3FH37mdqvlBfP1ygjU1fWzHj7dMpVdRu6CQ28Z8r3mdIh1k7
b7dLCycNVqrPrVZ5uaK6CzVYbtFV/PzRR9KC++Zq6U/Pd1ZmskoD5Fh8y8ijpbqy6i46u5s5lrcf
MrkoI9qrZ2fOqQ7XbKXubLq7EbtlXSH5jVJ+ajPzVOp/He+fn548oFHznqKjI4qrj5z1FBV/NVaq
sVZzVXrO6us8eGNVfNVZquOpoL5s5qjm7X00bnt5dQarMjqb576c8d3zURz0VWHwH7Hj5+egoM5q
Ax4o6i4seUFAqjmPzUEdBnbMvKuOzncVBRRx85lz6XPVYqu9o5jvzc93FkeUFBGjc8Ud81BUmq7r
HzS80VWX1VugoGqB1bFQXQR89XUHaJcxjVDjNz1dUZV5sy8NHFQVMUj1q1zkMw1VmgPz0Bufd7oz
1amd0HazVdr5VdWvYoo71p/Smmt/hwJX3Oz2T5FGNMW/WSkfddN70ymt/h8/HwV6WcZRKSY8vF4p
JVJfxS/CmX2ry0lKQW5j7298JJn9vexJ08TLFGlvXvksxMzu5z5W+0lMQ+fflJWdzmh72pe32tWf
TL3qST6QSKXM+yK/H7MbzVeX690yuVySiUhJJ83d10q1fs/40QuYwl6vJu0yUiaXR1l2Ka3+Hz8f
PKT41OMokpFNeHzJjFJKpL+Zvfwpl6715aRsgtzH3t74SXr9vaEnTzGW8aW9PyWYmZ3tOfK32kpi
Hvnnz78pNO5zQ32pe32tWfTL3qST6QSKXczH7Ij+P2OY3mlJL9dZpXK5Jf4lISSfHd0iVav3f8aI
TFKaX5va98nzBn6aztMR9j1dG6TdnquGjsycVW1ZH23HYeVNWLKjPT1cf0xqmKYSzGOz8Tu8yYZj
Kk1bUsxrmXNq3rcZ7Wq3M6iaoo5L02ZdGqnb2nVZqpxHPVZGO2Xz5uq5z1NTvToMquxHjqLjoMjm
D1FXGNzrm6VBqCqmc1Qc1BQdj1HP7dWVZz3VlAaglPdBQbcXNQR8wqeaePHzvpz1Z2urTmquaquc
/NfNl9VHMZzo26g5r3QRYkbnquW95QVbVuqCzRYqioioDCpqatVQpDZUVZHQ1WOuOpvTquxUEYiW
c9VqK7VVh9YufofsMScu8eXLnTniMc8Zvbv0/Nz9sSfW/MfPFGbOyzpex0lWNedPg3eX8D21dvNW
bmiOJZrp2pV27a2sWjHuo97dl8103uj8nZJudmbNbzMXPUR1Y9mOZcx0c5s6a7Xgy9TJzb6Ko68z
6GO39l6Ptdzl2unuQ9auM/aYu/m4mpoHnI8vweh1IOMqZixHoc1WGiNvmCD7DJzXjGLTj5hzKjBj
2ZWbm57XRPplzhs5+aPniWds6Xuifbpz83bOdK75jrv57O1GUg7xRa107izVB7zHL2TPgW3q++RP
r2FJcZlozpNdcec92JDamXzOzvtzmnMibzDXfMdYuy6YfzL8BrNuPm5o5rr0Nz1HmWs3nbTVmijO
bv17LpeZmPa12NccRjq+3XvmXj6D4+3P3XTepyLdHV3yr4oqmpqa/NH81SZbmPjwfN9LPHFl3830
7mP1u8k12WXZ86dvl2aKM/Xn31r52V2jS6TP7buY13OulGsfvZPdRHtXz+aqDqzZfoauNH69tbo9
6vM1vMaN812tRuTnfXL1mb+BPO2qPf3L7Y46Ax3kbuI3Q0b9NFGfLiNfTv1ObvedrtZZj9O15FrD
xxG79b6Zd9ld526Gw303fqc19O952u1l9O14c0Tjis3fpu6igjoZ6+vd4aKM+dmh8n1nNWdyXFMN
4t6xdJw2b+aPKK/yw8qF02bSkvWpZ2OYUnOd0atyucx+Pz55rnnJzusx6iji1CzHMezHtWc3PzZf
M0uiXR3lu5wzec3PzGjNzrNLp27dM3d3Cifbo+fmy4ndnTMacNG8ijabjxK5UunyM4v5tDbuze/M
Obn7yjol07b6rMCPzx2t4s18nN9Jmd3eXmLTji8y2Y7MsxrV2bm57BubtWxdE+mWO2snDZz8xqiP
nMs7UcnztnS9zPlE4bs0g5+vNV/aq5V3PFQNc7s/PFU81XpYbSiznjqvvrHnSZTPFHpRJm3Rc9Cs
mjxTl8+DMxZmhPa1NBb20ZUDo65lLQTOTG+r+zE5epjyYmN6i1n1pR9qCrrTjuq5VdxXHV3OuuGN
2PU1NBQU8Tvmb75URWfnqphU6NFuKqyazxRrEa856sMuc+Xo3NGfMPcdX30HpzGOueqmtVmKoXeO
rTHqanLxGi5qrdWGquK46mq9V/drIsdWYZVMdBdo1VzDmz7Gsvrqr9x5FUVbz1NVg91NSquqsx4b
v2PdTdVPar3mo+aoqt1ZHVaNdx+89V6pu4qmJ83Y3huar6rlndB37tM/OeKrLN6ojKoNUVZVtRVt
Wc/O6RRc1qqmFVnMfPG1PTTondhSVljiuKvvIeJfJPivZDflzpT2jO1flJ07Ftznz7Me+VlLX2lp
WnL9c4NgobCFvNe574m9+ey+a7au+nuXjpKPdzHvvntJRzm5icmN5rPaOkmPPaT0dFMfJfNyGlmJ
fN5JOMt5R/JdS6+78cj1qTRDHTUnivWvaTs0tbrIpA07ucRztpUnTO2t0M5917SeOsva+0tK8cun
PDYKGwgfee+a1mxSeJ2979981vtrLPfT015dJR7uY989pKPcxOTGzaz2jpPZjz2k910SmNzviks0
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
3sc0z5RPt2m07yd25Zox+k08w832ay83OnN575OD19evtp9PPNJTmt9prpsx/enadTan+jWOamff
KP3trfQ5prsunadS9s3SfTeUb3R+9unszNGP0ed533p0Zjz/RppOj99o8c1MnNNdt9O2vd9TmnaH
pujo3cZ+k770997a2f3VtxX4nOKYmO3Q8/c4sb8nNeT2jXRT7tve3NjxyaZ/fJ3v36qK99nNz+Yf
WKX13LcZxrd3mao5jMzMXaY837OLevNvt27lXvfgvXP7m7V+NK01nacvfzZl17SntGvXY+63ZG8l
kzvIY+9fTx2/ekxMS++0CWvHJ4eSZ137ztmvOnaf2s0jxZ0mfXcuoxmXvNHzMxTMz5LqY826kVNB
35+1AegioKG4xeGquc+VJqG7znDcS68/Nl0SP2bPVnPGZ1Ea5+r3vpro7eJdNGw+9YernOPEa4sN
mR8/PMc2VCNFFnPG2+z55kyx3dx0HR0C7Xd0BszHQR50oKvPJnP0xuezOrZue9dOf2WJ8zPFUmxW
85oqCM5phKgoKCr3d88aoMix0Cj0o3fuGfPkdVv3n2007uWYd3VnUxrqu1bURx5rO9BQZ1MvZ6bT
ToKnmMruPq4tWqB1DqTurtUDd1ZQRm6JB2Y1xHQyzZz6nMq7nqaDv92r5s6W+vN3x76+Q3DaakE5
Cxmt+Pya0n2Wtq2SNz5OLvshm7XkK5BOi2RXszO9ej6UfxTml16J2vR16H1ZTp27TE5rW6Ojo/d0
dHLrz3zU1k5i3ulOuxG7yiya1fZspp3mrmLvd6+Mkc1cuUfizt6qXHqUlWFqZ3vp19XzTwaZT45x
zngWFbh5Ob8cxNaT7fF03lt/ZTc4Nk4lutm7zzz0VyC6Oi2RXs2+vRqT41OaT69Ena9h16JH1fzp
27TG9a3R0dH7uj3Lrz3zU1k5mTO97PnYie8osmul32tlNOxmjzV6Ps/T5ZI5q5fb8Rh2nFS49SlN
bHxY5vfbp19XzTI9GU+Oec54HZGQdt7zOm7Z+h9xxc/NzVWOl5z9O9BlDhqvyM2vlB1d/V1nqXnd
rn6WsPea1U1ZlWTCo+u0qB1E9H03u4zNVKi1Qc/NcTuYoHlBd1fZo6BXQK7ETod756nsqFx5txRc
yfTfPzRH9mjpdzdco3QZzxJn1qh0z89THPdHFFQGbidT1dvrm3Gnpd+3WrKGhOr73ioImhQ4a+1D
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
GmV0Ef//////////////////////XE+dunS7zv9+D59UnQa7CUpmRNQ8+BG6b6MUfT736591O2+q
H1ydH2fzroSkddOkLeo+nbBffHOtSkOnQedtZnSLIjd8Mel7pUHS4pyg+cxvmZQigNDdg3bF9+UB
soFfz5BNSmnBR/Okcfy5N2aPp1fmPtUo8sq13oD0GZMS0ZzmkiN06TJukfSK99T0c7vUz1k96XM0
DvWt46CKPpVxnZjHoItZ17d+fpimaI708w/W+lBmTMmSTNWH0fvdxGj6L3Fhj7P0udObUya86UHT
KF9ropKVnme9EqCgSPLHFvMjOdvGa4pZi3QaioLuguJmjSyz3QR9g0Za39Ezk8rvluXU67k3I9dZ
ZH7oJ11SuTehJ0XT5fSjzqJJO669O29X0Wtzet9KOj7Ue+najY0QHkzq/EQ3na9KdnV8o3O5O7nZ
2dnR8nXc63uSST01hzqrasfJXlyzItSyOFKnkl5eXrY1IFn0rM5Q0qu5RK9y6nXM3JtSTr11cy/d
BOuqV+yUfbQk6Lp8vpR51I7k7rr07b1fRa3N630lo+3Ttuj307UaY6EBL5M68Wa3na9KdnV8Tdzu
Tu52dnZ0bnXc63uSST01jo/FW1Yo5XlyzYtSyMfKVXklmvUmXrcutyQvpLd2sPhsxc0WOO8qIufn
8joelryNXUbGTOOE57ElJs+eS523qgk8w/SXXMJigq6Y959c8a9NurquTPmcxue857zOkeZErPFF
15m6nn3rFQRH3zc3Wpuo3Fuz9rzMzLqLxRR3R88Xpo3z7FTGquHPQROo6dBo95U35UXmc5qh34ja
SaQx52XboumdB7vU5OXpzjVyZYazw+l5oeymao0zXvXZLB2fTpY3Zsu5M1O6Mlv37VjUxJmty0WQ
POebzPEa2sNnZdMQmJ61mt7fu9jNHS157rbxfHmbzY6e7107e71fR6yd3vx598GvJycvO2uxrzQ9
WW+2XrevMvST1vTHmG829OY1edN9O2aO/fJHnTeX07aPnbabzalW9eCZY321rteaQay9dlehpJi8
891vppb88HTfTXa8PvyRvLy+mzHXnrkeXeaO7MfXbN+SO8eX0307ay+l5OZrpOSqVa3je+w1sawL
fmQ2G/T71meJPLWsazM7ZrfRdNrpgmJ63h8etHQtG3OWk5LWlniWvRrAZg+t5nmTiTnLxNM+G1m1
0h5iFFz9J244ubtknObnOj8yjP70zmjMme5D7fa9vXPjWVG9e8TOp+9zupiTUiblvodN5Fzn5zc9
CubJrne0jdO3NQdu7j7XU5lBVj5o2az1ZuM1i3uKKg646t5ta7dunO1ho5jpQVOB80zeqncW3QXV
1As03VkR6nHlvfboagxdD307GqIp3s6igO9UHTtV0XbZuqy4+mW6kM1mat3F0fNEbmVA86zl7z6u
vQ0xHQeNNZmntjv1pDZcjVjVmGH3rJmULW02vNPtqXJEf7NN+71PybnTq02pXsTXTUnbeKdE9MTT
n/Z+b9npqYc1P++zcxMTE9oTD9k9+tTGt/PGhoS8lJJuTXmhtw201KnmNKSQ2ay9d6A2HmWr91qz
D7h+2smZQtPfqdteafbUuSKP7NN+7c/0k3OnVpu0k9+TXTUnbeKdE8ppz837PzftDNTTmvPfZtTE
xPa+zT9mfftqY1v548GtSw0pJncmvNfezGtbaalV5lpKSKNn7aknrP67vy6G2a+Y0wbR9O+lVy+m
UFDfao322+g9o9X0TozRbUTcwtN5UpaVDWuvUUe6HaoLSnLMZ4/DXQu6j3DRYa2+Y6W+lIxQ0HNz
ZF2fNz6o+1+xxLm7joc6vyrPY+e9bq7Mq5qcmDS3Nd44+8WGO+ZJHPZ3FzXHOZ05vY7iiy5qcVTF
qKcq2OcyO9Tji0ZW1zG7dTn3HHcF0WQnNha8XuerQysxpepe7favOZeROXWtrsJa6Xs5dzHssur0
zdG5jV9r+vtrVj3QfrXr5P6FOP3Yz0e+PTEjWL1/F9xGo7CxCZGCc9Ghvv701j8fgnX61IvHrsD7
eYvGPF6t68GvHWhc43clh3rTTcMl6XrYfScDl3br69ud8nNhMeQxrW9v1r3Taeb3p+v0P2kbEuND
zTae96zzH4tK09b3jafgcjlVb3fvk9D3evWPXpp63MV79902n55OD3Uvmb3reeY0/NJPGnvQl3t5
a8Wk01bTbbzPPGmtJO1v0b3rxS+efWvkmld5veh65MmHOOWY93qGgsc6JxvXLYvv017qjzPPdTj8
hOhh2pJPfHMH122NweeJPwLPd+PzxM3lZn3uCEvTe9Tm10HilrrFMXBeyp9tanMt5EZuGhvXf3pr
0LH45fX7CdfonL9Ui8cr12B9+vOlZKh8NHkTycRj1JujNaHNz3kRsGXUXz6od97M8V+8S8yO0gwt
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
mhkhxhnh2hbhahnhdh2hkhvhmhnhjhnh4hchnhahghnhjhkhzhrhkhzhch2hlhkGGWGQGw2w3wyw
7QqQ0Q2wzQzwuQyQ3QzQ3w4wyQtwuwzQ4wsQxQ4w1wtwyw7QxwxwuA2HGF6G2F6GOG2F2HqGaGWF
uHWHaGKF6FuGKGCGiHCFmGSGeGSF+FyF2GOGeGeGiHOFuFqFqFuFqFmGiGeGKGSGyHOGOGOGuF+F
qGGG+FyGaFyGKFsGwsQswxw0QswtwuQxw5wyQywuQswtw0Q2QyQxwxwyQ1wvQuQ5wzwuQuQuwvwt
Qxw2wxQ2QuQ3Q7w4wyQ5Qtw1wyQxw5wuQ4wuQtQ7Qzw1w7wzQywxQyw7Qvwzwtw2QyQ1wzw2Qyw7
QtQ0QzwywyQvwzw4wtQ4wzQ7Qxwzw5wzw5QwQtw8Q7Q7w7QyQxQzw4Qxw0Q4w8esM8M8M8LkM8Lk
NEM8NkOUNcLsOcM8MsM8McMUM8OMM8LkMcLcMcMcMcNML8OUM8N8O8McMMOELcMkLcLUMsOUOMNk
MsMkPELkM8MsOMNcLkM8MsNcLUMkM8LcM8LMMMMMMsLcMsOEM8LkLcLcNkO0M0OMLcLsOMO0LcOU
MENENkMcMULcMcLMM8MkM8MkM8OcLcLsLcM8MsMcO0MUMcO8O0McOMO0McM0O0PULMMsOMMcMULc
NkM8MUMcPEMEOEO0O0M8PEMMLkM8MkM8NsM8NkNcMUNEMsLULkNEMUMMLcM8M0PELsOUMcNsLkMU
NkLUMcMML0L8NsM8McOcNkMMO0N0McMEMkLcL0ODsM0M8OcNkMcLMPUMcOcO8MkOcLUPUOMM0McN
7r5DPDHDFDHC3C/DtDJC0BYdoZYXIc4ZIZ4YoZIZIYYaIcYbYWoZ4doY4YoZYcocgbDHDPDDDZDF
DJDjDJDFC7DtDRDJDFC3DRDHDZDJDPC7DtDJDPDlDHC3DHDtC/DPC5DjC5DvDPDnDnC3DjDtDfDt
DHDFDNC7DlDjDJDJDFDHDPDnDZDjDPC1C5DxC5DJC5C7DtDJDjDHD1C5DDC/DFC5DNDZC5C1DFDR
DDDNC7DlDlC9DnDDDnC3DNDPDHDDDbDDDdD1DPDnDjCxC5DlDHDPDHDJDPDPC3DtDbDlDlDvDHDD
DXDPC5DFC5DDDZDHDlC/DLC3C/C9DJCzDFDHDHDPC1C3DFDLDtDjC3DtC1DPDtC1DTDPDxC3DDDL
DHDNC1DPDHDjDNDFDPCzDjDHDtDHDNDt6wuQ2Qtw7QxQxQ4wwQ9QzQzQ7wwwtwxw5wzQ2QxwyQzw
2QvwyQswvwyQ7Qzw5Q58h3hjhjhnhbhnhchzhzhzhchchahjhkhohohyhyhZhxh2h3hkhjhnhihj
hzhzhkhzhch3h2hzhshihfhahohlhyhkhbhchohmhnhch3hzhchahzhkhohyhkhbhshkhkhjh1hj
hchmhzhmhbh2hnhnhjhwhlhkhkhxhxhzh2hzhmhshbhmhxhthlh2hyhth2hrh3h3hjhnhxhbhihk
hohchmhjhnhyhchihlhnhhhehjhnhahzhihdhahnhnhohahbh2hjhchkhnhshsh3hmhkhshchahn
hbhnhchehchvhihkhjhbhihbhjhvhjhkh2hahbh2hjh2hnhnh3hbhihnhbhahfhmhkhkhnhxhzhb
hphlhchih6h2hihihkhehxhehmhjhchbhlhchbhjhyhchnhjhbhthjhmhvhihohnhkhnhmhahjhi
hkhahkh2hfhzhth2h4hihihlhshs9YZIcYcYX4cYWoZoWYdoZIY4XYXoc4ZIZ4boW4W4WYdoeIZ4
XIW4cYcYW4Z4YoW4Z4ZIY4Z4Z4bIXYZ4Z4Z4ZIZIbIY4YIZIYIYIYIXIY4ZIWYW4W4eIZIZocYZ4
cId4boW4ZIYYaIZIZoW4aYbIZIY4a4bodoW4coX4boXYZoYIYYZ4doY4bIX4XYZIZoWoYoXobYbY
Y4Y4XoaIcYZ4Z4Y4cYc4ZoWobIXIYobIY4XIXIb4bYc4XoYoZ4YoW4Y4Y4Z4Z4X4W4W4a4ZIZ4cY
doY4ZIdocYaIZ4ZIZIXIWYZ4X4YoZ4XIZ4c4Z4Y4Y4YIbId4YIYIY4d4aIcYa4W4bIWoZ4Y4bIZo
ZIZ4YYZIX4ZoWoY4ZIYYb4Z4XYa4Z4a4YoZ4d4eIW4d4doc4aIc4a4a4aQLDPDhDRDPDNC3DRDtD
DDxDPDbDPDxDxDPDBDXDBC5DZDJDHDZC5DPDHDPDtDFC9DHDHDxC5DHDPDPC3C9DJDNDNCzDNDND
HDNC9DBDNC3C5C5C5C7C3DTCaAIT4SQRCaDwHCa8Qkwkwmg4AAYGgiE6EmE+FUDgUAAgFAKFGE2E
8EgAAQng0AAcEQpAAGAyFQCgeFIAQog0GQog2EkGggAAKE4CAaFEFAMAgABwngAEDCSCAcDQRCgA
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
vKP/enLujadx36l9nvO/u+dOiRlo92Xvelv34I6RthabbojF0zPPenO9/u3os077Yku693n6/GnU
5od380fyEFnbd+ZlTXbTou6rmTW5XBHHGdPlPV7NuDdzyl3Qg4ZbOit7Y6VPGqZuWdpxXz1cWk6x
vdoy2e4ymf5Ylr8r11ivJS1YrZs2MQ37iy9tWmfV0jlj4jLedblmanqRdHML9PlI2qg1uXpbMv0H
LXUaxqkf9NXB75PJi/P/tHva5tFEIg3/8Njcx6YS7OTZerPUUdbXOkGaVHKp7bCUD3kAHpXYeH8i
hZJrldzxbtdrVhu7FR3KvbxrXq3WeHm+0+x/33D6Y3/5PdQ/E3ikvx/5tERsCuXiuIaUna2d3PaF
8kpcn+/bdGTO9ywWi/etnezW78lfbGNS+xwSy7ad1hkiNraH0B6skandf+7jXeTFk+mHgeH+oz2c
MttpGbLWJMTpnUuWZH8qeks6Id6FzLIvTiwW8sa0jG1nWY55xLwMbYve7zGh+XjbM+7DvWWQ9qX1
aLowb0ZvxbgB8vhCO1lvrQtnNwdHB2232Th+1qZ/QGKnLpnS5mPJUqMymMl0qj3Wk3ltdW8elWhQ
CjLUcDZO3TU3h8bejnjV5YMX0+4QvMq7uj8zbL9s3i3CkUtOb7jk+Quz6TPu8nc0P/Djd5sZKtgD
I0aGZuVUHtiaZjfS0Dxgbc3FKWTbw8SIaIhhphtXQ5crf+5Xk2nZbDAt1sXN+faIjuHkK66uN6dx
689n5PfXxBQ/r43umnPInX1sStaXXMcP076uLdXzNLIdaTyFlZQUGc2zyod9iva/vFwyLIZ7ZBqO
91lS5rFadX1iNayy+Nz8Mv/7T8XuxLHTdHn74KsN+l4NbdnYDz9FbsfpuLhtd015Vu3HRdNKer/R
AB6VWGwdDRQvkHuYs+xgGll9vqqPW5qgQ3APpd/dRSKnmBElm/7vwv239p0MFg7xPIymuxNr+pBW
e8ut0ZV1mjyMOXawTacdO/1hsSXIXndTaZ+nY9Y/j1S6zBhTadQcmGx9iaY6B35rGfXI/dHTxPa7
eziebF47MQy1+NiJGScV1/ZtWOfJo7E2PWaeE9u/a+dZp1irPGN4tlFzkurysBa/27OcNNoQyStf
3utL6dWGjz/xnGY4jy5aVtXTdNgPzRAbM329YY3fbK4n2sqb217GadoTZBxO7LHVHe9WsWaMod+2
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
ZHWrk2wnC6kzB2fOpvcdebRwtJvuyW37rfkue5xG9ynXSe017GjzMkKYs8cg0QEeheh4MZZuMVxJ
3TKe5XB2c2nVaXg40F7u7eok+Smbm/7kNfPTdtINsjxXJf0bNU+enkyt75d+Fzur2AdxL7155qRU
6e62dhJdnyYu0M4j16twGBIOzL//PZqn+XS78ku1vGA1askf5ls/nB5KCZYe0dw7q2unipx7ksrj
vF/R12RSW57tn7P2Ut1EqIZ95O+hJ3oywu7L6rgYW0OdTtwezUBU+2bm8SKGP2aG7GS1vKfm2aO+
63tWG8G4lI867WDfmXZsLhi2ixK3vOvX0cKSZl6Nq+27eenrpv14beF6MlnyQLSb4cgBT2dnUwAA
gEQJAAAAAAC3kbsKQwAAADDHjnoS6+zu5uLl5+Xh5+fe5+Lp7uXkHqUoUcubQN/jJcO3oYf7VXeK
04uxW7h2ocvLQ+mVM972SfPr3/6ewNHNWzbWm+bV4ZdR6/pEIglEGF/bPeq2897yWWJDtfTGE2m+
tJEHKbPdvH51tGXv3Imr++7w7ni4St/V+tbD/oyRrtn8eP0t07ctWX6X5DY3OS20W3K9xnNbx6C9
ja0LA4KWVAdj5bw8X7WqLNaqZn2P859rD8+maU9LffvQJdOctutbzFPLMp6T8SutPH+4+M9uzNts
j38+GTr+0FkTXJ1IHGC7Zce5MPDKsZPnxm66QqK2521zx4h2N/IKrcd+6obfHB6VWHS1AhRH5oYR
j5f18/ytbDm3B/cNqOc+TNOWvqNbFR+kEn4E3/TPLOQWjzqrPu5e2Jjv2NXJWuob611bT6/nbdId
ubvb5tLbGxPTNbrdM7cNHDeNNqEp45S7Uke53tnB0IeR3t+GXQ2bbx+D+JOkr8Np/1Wt5vHpWae1
oVlXYlq8djfy8PHWq2nnklHV2r9uVDMmz+TDtmS95P3EYZ0X+zXfPfvbsLlsLA9918WoS9c99HwR
jxIrOfSQHtfd/uibdUedtGezTR1PSJyj9fmQh6nPpDY3yjtPlvX15LnEnN08pjn/rApnWoEJHpUY
eYFQaDm5Z/frQZY+3PRp64PbawehqtxHyMZUum/72KuXv1W34m6z7cmflfojysns7emDu+O3/Zdj
bf9D4NbjwmPLLV84t/XhwZMX7+rGBjXPVwm30/kjRHtcVIcrnvd5Y3dIr81jZbzaTB10k/vlqGSe
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
Uz5IhObcu8g4vtg0B7ftVePJuo/7SqKNK0J2lfaD1B+HPjZGSDQOU7Q/T+TNWF/32ZqutbENu0dT
3yuN2qS4+mC9n8+bXXbDMsn0O/xyI70l8XH/bjAndaZNf8FeU399s3lr42Ss5Wo3Yk3UddfJn+6f
PkIsI9dudBftJVRNdNEMHrUYcBkAscVF6iZelmb0N+Vn12v2bbsH7xqXe6z8V2IX+Xxnn5+PPu9t
jiXaRqNHVl1bLV+YxY5PTrrr2yPToWucdvjpmTWxVyR5LZ3oU/PLWMUxLWbD8MVm3OTXPpiHVnxO
Z1V8GHEMX3V8Qd4GbW3tLb2ifsvqq3l7X7qKVHrsH/PSUhtPV/CJpiupdoz2DexESokdHFtVv3C1
fRe2PGnKR0qso9+XtBnt6zRBP0mV5ugT794nz5cl09SN8gN+6ORhPkwe07rIH10/shm3EOmrYBRo
5tTNSYlUo9sBHoVYZKkjLISQSe5mqr5zPd18eXRVMG1Vu7f/t3651e4UF751niO6cPU7J8+XgcZp
bf2So/uD5u2udtLSjDcdm9gY2/6Hzug+zT1/Ox4TY90nNyfTaIzvpEXTDo5607PxXVrzmA/X17Gm
8iMSm6zXMf72G8v4NXNxc8p1Plfdomy3Oz0KK3OqE8n2x/7HPSv9+PrKrsnqirc6WbbSsJN5DOIv
XVVFI9R60UzfpJjyP3vd6tcFJ0e7jM0x0vt0NmJ+euic1HZdMcZ76JOYqXkRjiMxR9xfT1bH6ixn
HoY8XJzm44hxdLwAHqVYdBVAFEnc2bnzhSVPrTuuez3bDiGHrqZf9eXc8A/RcfStZdIPMbWsHTT2
7OHJpM0+dulonL7eWhuG42kGltLxfQfrp7pQp4kbvB5TVjOD+u+v9q624xqSsH/ozta4Ow9I3lLT
Gz5rzu5cRFFPRzZrss6YauWYTEUsF8r9sbOAK5Naor2kFDe/afYefvX+J3Lx+23pYdaSNnm577nm
xHVsp6nUvmkxOiXCLmvL+0jMfL8r1W5kTaZvWd8crpkfuTbF8wO3WA/PBOtNkpGl+1ivefegFGLQ
CjopRteQ57dDAB61GHjRtYL+XGkcvenb8cv5SlV9UUSdG6rcu2w1scohxmQ2nLn0tn+Ibeay9Pqw
b9k7vWDP6q/lNW6W4ql+0o9a/ll66W19hwvW4V7a9MVzr7feto892qHtnJ2Y2zifJ5HIKaM5ZaO+
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
W83Srb5qigqI8yhx0EVTV1W1ZVp4jx1dQ7x2+fni65QGj5s7UBKrKqYs1VzeRZnNd1XavZu2GXNV
Z7KpPZroI+e4t1UidlMc9V2q2egNU1HN1q26qd1WOlVOKDeVFXVXI4+lVKlTV1VKdV28ztVd0bw+
UFXxqqmxsPVTT2dnUwAB///////////0KgAlCAIAAK4YBbQR///////////////////////eeqmV
WRLOaqmUWIy7bqp9znaNVTq6iqmhrqp5VSBV7qtvmioKqceYY9BVTPKqQaut1X6qcUEVXc/PHzdD
UFX1WaqeVddBVYqvqrLquVXKnmq2q4erzYc9mqYqqbc9RUxVWqs5o+ap7VdUULMfKrFWHRSqndVK
Wqtqu30NVdjNV1FlVOqqUYjVXz9MoI6gx6DIqrtBVZ1zx9sqtztVo0VVMKqQqC9bw2zLpQJugqyq
nZjR9zm5qrt3zYqrN9HVTJ1UwuI+VZVfMjXqqnK7R0C61X6qY5VTF1XXzt5j6c575roTUEUWz9rV
VM3VZPVYvM5qjKBOrYz1U7qpzd8yMbmO6meqyq/z1NK6qYVXelVO6rR76VbZ4ufnOd1F5VcPnY0W
+dnqKmN9arsdX5VcPQXh4z5a6UFBVfupurcqObnquR1YbFFVtVMW6Ce11m7qv3jiq+1VZNV9Vjnd
VNKCLIqu681VMz3VYoKqY2ehqv1X3QHjt1WauquVUoVJj1LyrzR24u8XM8iw91XY4zVXuagqp2d1
Uyqx1U4q66rlVugq/DY+eqm9QlZ6rt3VbqpSjXbKqYXQ0PN0qpxVeoKtqpvVT3nWdVOxMzNUmq55
HV8dx3z89Bz856Dn56uzm5quqKjndV6qwagqp1V1XFaqWKunqCqwufn6c0dVMKCq/eZHVTZRZ3qy
JdDJzNVrtVnaqnXPQXV8fXZqrT71WKuqas7RVU2qp9vXaYq6rtVUyqplVT2qz03qqlmqkV5Viuqn
FVNO/Sq/VTW6Ce6VU9qtR7oD9qqZ0F1Uh5QY+9VOqrJ6qYxVWc56sqztVmUFBVtVjm5o6rJ4jHOe
goFzRVOVXD5lDVZ7Zlxs8dSqu55ygqtGVTVTw3NQR1bF3qYjc8dRzUFXVNVqKPI+bm6UMadrOeq4
bDVdZs5zmqt1FVOOcxueOq9VfoOptZlAr7dKBnyg6ULyqmSoJ7JyY5qrR6qdvtln3U81RkwKr1Vk
2r5qirNdsqtx1XqnKr1VOqqaVU5qpjVfqtVfVaq+Y6d6rF9sq2q/VTTKqdVUgVUrVUi1XqqQaqfV
U0qp/VTRWrq01VrZlQA/PVTPdV/VVmqnZqjXaY6bqtVU7y3VtVPqqQcPVZqsVUqXVT2qmdVODdD1
XKtdVqqz0b5z1dct1WIsoI6si1UxVB7quVWriqs8wVRVtVzrdBVcOaoyraiO6mq3zVPPacUdVmqm
GGoOaqnL51QVco6qU6A8d1WqrHeroueg5+0XSPWuaqxVaPHEfmur6rbqpAyOrcq2oq+pqKqZOOqn
dV5VU5Pl1dz1Wai+a771Xz1Meqry8fd3eVdVlVk91XT6q7pzVWqrlVyrOap61MXMu3NVt4ar31qp
jeqip8qevPQdsSq6qxGY/PV+/s5dVxrnmj1XqtNcfZpPbvmt1aquUdBVacWVXKviUfU1VOVdRUzF
TdA93YNVeqyqyz21fTmqar1W1NX0FX5nWoqsVMeGqbiqt1Mb56Cq/QPukeLUa7HqW7quVB+y6VfU
VHaPn6dl1e9dDm5nFQc91NVk9RVd0uaqmFVNXuOO6qcRxVWKqc1N3z3QVW6mruzzKtq2qydVblWx
1Uwd3VsEaqyc9BVb1VtVOd1WnLHVZznjWHvpVZoDPcxV+6rVQeqnVVMaqeVZzKq9VeqyqmEccRqr
OVXOY9VzofnmDurebZosNoz6WI8FRVcoNVFXUFX1WOptc/i1j64+0XTs6rdVNKr+VWarvNVlVOqm
oqpl0uruYy5z81njurqlYo6rNWVWZKqZVFV+qmNVi6A+VbFQHqyq88Nbqpw+ePVV9b70F2arqtqt
Huq8dVd05qqYVXKrtVMKirutXRc2dqiqxZjVXH1qpleqsq6YqetTQdjJVfVZjMfnq/tu6rzXPNHq
v1WIj32oFj23FUXdVhVdkZ6CgPdVu4sqvVfFnP1NVTpXVlTMVc3u7NVfq2qyz21fSrauqvVW46mg
quGygqKrNXRmqbiqt1PO+fVBVTigfdI8Wo+nY9XO7qu1B+y6VfVlR25+fp2Se+nQ5qjHFQc91dVa
PUVezVFVM6qb9d8547qpzfNVZqpzV1n57oKrdTV3Z5lW1bVZjVW5VsdVMWc9VjQUVVqM9BVTDVVi
qnW6rbljqs5zxrD30qssz7TFX7qtVYeqndVMqqe1bzZVfqvVbVTGOOI1VnKrvNHVd6HqZo7q3m2a
LDaM+ljnwVbVdoNVZVcoKrlVnqbXPjWOgx94uidVMaqa1U4yqzVd5qtqp3U1ZVTPpdXc0SqY+Znj
urqlYo6rNW1Wu1VM6sqpxVTKqzdAfKt5qA9WVX3z3fBXmdVMI6vq2qnFRHkUaoKCKo6x1NmjVRVd
7RVNnugVuqnF0NBVTvOZUB9dXzVZ2NjoL6GyNVfzbmFEfDVN3HVeqplVTmOiqpzVlVMWufvV9Rhu
0eVZV56uivO0VXVZVTnnugqyq9VTtc8dVKfPVTGq7FHVcZ+aqnGZVeqpnQcxjUFWmqp90qppz1Uz
56nKqYd3dVzmiNVvNlVjvHzc1Vyro6sqpxUdtVWeaI7jqyq33qsR0FntI13V9o1RVTiq5VTmOgNU
8+VWKiqnFV2rYqCpGXVTV1dUnqxZo3Wp5+fUUdVurqqcB1NVInNVZq1u6mKq7HznugdVPKtqpBR6
rtVw/NVlVMKuq+KKI1BVTHKC46A9qgquvDGuh61fHfSq3VboKrPPUVZVTOq8aq1V1nyrKqeOpjqp
7VTHmiPFUc8zVtXVXKDm57qpxlVqq8u26CLtzx0FBEdXEaq0fmoFzec/Q2d3VnP253QVWI5pc1BQ
R3VtVo/PHdTVnS7PEapiqeeoqypccSdWxHqpxVhqi+1VMLqtY4zGqt0XNzc2VUp88VXHPUOrI712
WVZV1WRm0aI0Roqi6qc1NTVZqaA9V/pFjuq71qyqmGVU5qtx1WLqp/VdqKr9WVdzRVPXuznZ4zVd
0Oc9Vmrp5KgcW+2VWOczNuo0dVWKqY1Wo6iqlQ+d4qvq6qmNB2NV1VOKrdVqr6uy7qOr581PXUVa
7NVdqsc9V7L56qac1Vh89TzxVWee4+c91XIqqYVZdXOoqv1WOa8urLqpplWdLq48UWSZ0j6VORc9
XZVfqsVWojVbV8dTiNdXnqeaoiXNVuXQ1UwqpmdXV8VVPD0Cq1Warqmq7Va7ZHQWc+Oq1FVYoKio
quVYeoqcq+rYqCqxz80Zquq87VVmqmFVOKqc81V6qnPNHVe54lFz1FWRVWqr1XVGRHPUmoLimDdO
psqv1XE+9VqKc512q59T3dBVYdVugioIuuqA9As5sNFU6oKCgqKqY1U7NfSLmjjugiqp5HzVXKA9
WVKSq/mq6qnEfPHzHyLnRsNcd0XNV9VMKrtB3qyojqu1PPQXVTLmedFUxXQTcdV6qkKq9VZqv1Xq
qQauoL5qqdR5VcNV+c9V7o6rlSz1WOfFV6oKtqp72oHUVU2y7kqTVcbnqyq8qsjquUEXNVkZ8yr4
qg8VBZ91DoDRc/Y34XzVDVTFFVtV2+egoT1Uzqp5zR81T2dBVTCrutVvobKsqt0Gs5+1VugoMyql
eqkCpd0E9RUHTdB0qtGq/tqgdBHlVIJqDtQRZN0FBFVTGqliOgoJ5O5q4qrMV1ckePqjzVX9qqa1
Urx1bVqqt1XXlVo9WRRd4j1bHVcqpjUGeRJ62apiZ6udAaqnRnJVYq91WYjOrqrlVOKsqs3QXaVR
Ve5qsqpz1V5zc9VMG+2XVdq2q5zR1ZU1W6Bx0Cq7DXVdqprVT+PmquXjztVkWVXKrVVODVZV+VfG
moqvq7KrcWH51OKq1VsWVXOkseGiNV1XR89XZtc166qrYo4qqY1dQ3VsTmKjXeo3FHVfizeVJnUX
FaMZ9soOzZ+jjcXOZG1V3PQd6toHHwM5lbPz0HlWc+Zz0BqDD1XajmOjGis/SPS1GqnIrqyKo56u
qtc9XR1FW8DK1mZlE10/g1xVfE0jqPI4u1o3M+kZ10q6gOrtUD+5zXVnqznoLj6UHNFUUG1VcuY7
vtugoKnrEerM56HI9c9WZFVaqpzV5+lvnyVYqrZnnNUUDq2r4jM1nqu1M9UbP0jq1Xl1FXONRzPY
8VXVfVbqasNV5+arolZjms1W3QXV1DV/O6g/kXbd5UHP21ZqnnTu86XQ4qA8ZjVXaqZVXqqc1Uw5
nQ8+Kq1VayLpVsZ6jnqs1ZVeq+q5VTmreeqnWKczpVZqsRGqu9NbjMaI1Vyr4+erzLaqD665VYNH
FVTOr9HqsROYqzTqNxR1U5iedsq4zqLitGy1lB2tn6PncXOZRaq+poO9VigZ+BkXMvTs/PQeVbz5
nPQGoMjqvVER8Mbms/SPopiNVJua6tiqKmr6rfPFV8dRVY4GK8sy5uudK8VxVXImsOo+eLtaNzPp
znXSrqCPsjXaoGjc11b6s51aj63zVY0qrtzHe+26CgqesR6tznoTc+uerMiqtVU5quH6W6mPJViq
pgagyoqygdW1XIjM1nqvVdPVG76c9Wq8uoq6ajznXY8VXVfVTCrqsyq5HUVdErNZryqyegur6Gq5
UurD6i7eK8iqDn7Xq4qujx3edL2bEeOI1V6qmVV+qnVVMeZ0PPmVWqreROrYz1HPVZqyq/Vcqu1U
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
bPzVc1VYqKg1VqrNVXuZdrPcZo8NmXj157iqsfMPU6R7vmyO5yKLpK6vpoorUTfSK1Zsu7OtPeze
e9s51Wiw13zmJ9jb7Zpxnw8R+rqedq+vcxsmbygP1qKjZ12uLud1b3PHmXFH2i5j5HXWH6RWfeVc
d7PHdlJ3dNVhL5cmsy+bnvXddqkz8y3QdtYlz249xbPolVYyJs9XZzc993UVPhzVEVA+/SojNF2q
etvO6dBrKaPZu7aeuc/eglezHs07U1ZF0jqcuzs91Zl9o43nNreumr3d4RMq/dbSLXGeI/NO3FVk
Z6tx80nNXeHyKmzm3fMtR8/ObFzUFTfyOZqyrMqc1z9O8ZjIzwz149ZVZ1h6u1o53cWR3ORRdfel
1fTc3MfIm+sSs2XdxrgRp73F5H6s570ubDN1Jifaa32xXcZzR8x+rPlTzvLXeKJTN5QHoKsqxnXc
65qA7q2gPHmXFH2i5ozR1+xj9OZx7VXn2ePU7umVWkvbIyaWTl1FTeu671Jn4a7oOzxpZU249xbP
olVYzm2z1fkXPfe1Vnep8uKouKgdB0qIzc3arutvEm9GPTXHuLtdp9KuP3oJb2aOzTtXVZzdY6uN
d3Z7qw1vn52ao1vXTT7HvGZV++bwsr5z8x+afuKrYz1WE+aTmrvD5E8qEfmWufn5zZnNQVdZTnm6
tqzKnNVPTvz1XKiqxVTDKqfZQZiNVeqsJJRHqpybVWHZwj8xoqA0R6CLndWmc5Vx1ZqirOlW1dzM
1VzmdAaKqnVV6gqvGoIuegNz5QRvnjjj54qr1VOYoqqdVblBdXTmdat7Xmc57s1B26ni5j6qKuUa
oMj7OgPQG6R8+JYaJ1WldT3iNQZhmo1HFZuaOK3FVfVxI9nqKv56vqvUF0Ct9U9nZ1MAAf//////
////9CoAJQoCAACWrxlSEf//////////////////////qt3lWVU6N2RoqqcVWaGOKOPmqpoeq13o
KA96HPVZqKqf1U8NzfaCKgqtnOeOrIqsqp9VvMeqnFVLUVRzPObmTznPUzF8zPV0VVMKCqxVcaoK
ir6vdViO1VlVM+qqTVWajmqt3Va1VTKqnNV81WXmO+e1bpb7nNVcoLN0oKCq/VdzI6mqmdQbIz81
Aeq9Vc58yr6qbTlVMaujNE5xzV9+fD94ruqmvPUVeqrFVKNVO6rHbcXNVdSqtVUxyqnLNQKrqqYd
aCovpQXQqKI9BlXJRXmVUpGNVaq26DpVeurulWNUFVi6u71XKqcVUyqtUFVmq91oKuoMj6VXI4kq
qY1WY4zHqpjVcjvLidQftPVWKtqpqRT6dzVXozaqvXcUZ6DOhzxkDVWec9X1UyoOpjq12oOvSrKC
rqtjNVe5kUbPQVFX80VBFUVDu6Cq3UGPQxZlTUUEWRRVfV56B5z85uYVbnSgzXPVZy4++Kq3VtBE
j1NVMYj1U2dDG6Dm/qI95U1XLuLDn9NVtDQo1WnqpvGZzk5HfP0ug0aI8UXWKKKaXVRpXFUugNQH
MLWNVdVdyh1lBkR4+8SoD0B6WgcVRUVUwiq+3VTmqn9VjvzWfmqTGq8ohV1V6qxQVWebKr1WzVV4
9V6Lyq32yq3hjjKtdqrKuq7UWdTdEe6lx1qr0VQerKrzouvlSacuq/HboDPnM6svOeq9Fhquq7n6
mq6M8VmjObMiMqs56j/2KuVRlXY8dTFVTNR4Md81GrPz8xsfeKOouvz9ueq1VYqKircyKpqKr1BQ
a9956lc58qD1WelBkeqt1kdVip56DujVWMq7mcXNU9uaOq3S9uezc1BiUZz83lXVXardRUWjc1V3
nyKruc3OUs9Aaoqt30x7Pzpc51Vt997PFUUGUER6r5r5+c0fNcVHQVBoqCOMzugUUdXGUcWdqDKC
6BmPUXQLnj6o+6uztt5fW0c+R89RvyNUFBzZFzVWD8+XnfvU0FBfNQKhO9dboOlxRUHW3dTHV2VH
PUVW4+bD3zRdVlTVnM/dVXlfTDUHPQVFTfQ1QbtzUvOaI0cXWj6x0uqvjNVtVyrmY/Sg18qKh1NT
VZNzGoI/sVBR1XaqQarNVO6rnMapoyu9UdBz/Oagyr6rlXVFWqr6npqgPQVNVMasNV1Xc1WqJWfm
oOY3PVcNFVTy6mLnNBVbVaoKmq1lRdBdV19qCrIu8ccVWm65Vd7VXuaooaGOtQx0NW3HUuq5zqq7
UohVTCgVQe6v57q86WVFRHzR1XIm5y1zVWLoDHqygPEYyjxnqp3VfjMZ1YqmKrDuJR89V5zVuzug
Vns5vaTtbqJhFDZdBi7UNBVtD0nNGijV4rw1miKd7fQ3iZpdZVhA3nQ+94bCAVm7VN13rOvVc99m
a8XU0bs+7M+lLHz6O4+hr7e35mYa+0fShzOhmlduhN5QXeHj9nOp93by1inL3OLJd9rrRZfj11mn
q77Tlxua7YoqBbiu56+9Wn6fH2pOa+h4rZ6Q2tUud06l9rWGz3I7iqdTl4nFhSlNJrb9nLXbWZSG
PEegut0i6eczxI1rnjSq7zm6q+tKUKXb7UvAgqpq1V0adW5MWy/yOlptxKlPc0e481SdrdWbRQ2X
QG7UOqCqxQ9Ns0XPeXmXkVm5qzt9IvNM0ulVhA3nSPd7yIhX+I+dqk9d9MaXPe7NeZ1yN2fdmcXS
lj5+h3H0iNd9vbozR4bZo77R9KHM6GaR3Qm8V3kZ4vZzqfd2zWsU5facWLfe60XbL8fTrNPVn7Th
45rss5qBbpOaz0J+9Wn6b+2qTmuPpHFdncWtR9KXO6dXNnWGz1R9oqmldmXaLClKaZ12fs9eu3RZ
SHiPzUB61J05unhDmsyy1U86yryE7UPH1ZQpd2u3vAjxTVLadX86dW5NWyGo/ZZiLbjuaPV9Qc1Q
okz3GacVVOKqYR80tHi5qrvPV2UF326Cp56rdVIl1Xs56xuYxpKBVU9uPmvnPQUGfMHN0jPVTGPm
oKC4jc9Vypn4+dUeR1U4PfPFiqasq6K+aM3XnpKrmeUF0GRHVTlV075r5+ZHFV6rFV1VOHH2fPGa
qzQYarT1U5qsVF3R1ZjNVvNzVot1WbNVcqu3lVirufn746m6rdW1XL5oqqc1FX1Ux++VYegN2irn
ii1RZVTKp6TtBV1RHVTKrKtNlVn2zmXY9V51ZUVFTdQqsPVfedtqOgqKDfa8w+Rm7y1Zz81B2w51
VbqsUDqKir6ujqcdVpRfNcz0erqqUJ/njeGqpnnMc9BVSBdVi6Pd7oOao55aiOoqp1V5rMu2RXcf
Pzo3Wq9Vh8paCg6M3P2qpw4u17cayM1RVxu2UX2gv97WM0d3UVfVfqsGiquVNVnKm6CNRVNSarjx
dMNFUc1BM9zx1Yegol9pDVU5jy7oKCr6qY1ZlVzm56rpz1bVcqI4qv7VO8qLquGOagqsfT97q09W
nNV/OfKuq2jiqzmq6reepy9Kq1VezmoKLn74egoDxxxGjdXX1dVlmi506CrKqcVdErdTUc+boMdV
xRc1Vmp54ueouP5VYMz1GRGoLqOlXnMc2Nc9VyrOarMyNGdV3J3vUuM1ROuq3Vc56tpMy44qDvnc
9xTtWbMo1H3R8MZ7vPLyg+1WKrZ/tV88fMbdBZ/vVRx9Y4qrlV2zVW6CPnq7UVRUHM3V8WneVHM4
oqruXF7z9MoKs50ZbqsmoObuc3azOKKkUcVV3niPzmvHzRc0Ud1XI47qFQHoKrl1WdUD8kqKvPG6
lXiq6NnugPlAarb7VWKuMbv3Mc6vKsqY+f6LxXUxXcIsMrT7VNVrV0ec/ZXuq1zq86qIyoLPeXzR
VWjn1nyqzVd+mqY6r06ao7zOLpdVMufDnPUxVNV1LcZkbFV0fN3uLnoDUBqKOpRrjqKv9uWPD2aO
Z50nqgx4kfdWH7PpckR+lVjfPfSrueOK7546Ay5qDOnPQVYl1u6hTHYx8oKBc6iyJ1WaA3NFV/Pl
B0j5+eznV0FBeVZedXcXPV9vniNszPzRVbzZfNQH8XepqT5zZQI6PVY575uY8TNGsw3OldB2N0W2
3zR1bFfOc+kYyvnO8zrHP1PfrkVWc98/OfD5Zj1dz83Nzc189XVU56XPXzGNzR315r70nW+fnjqe
eqmMfc/ZGurGfmi5uarue+sZo+aLHb5zxdM6VY4o48XNz9DqqyjHRzUVRVeqp1V3PV6PGp9VEeVf
UVWaqY1KyOp7UFBVTDaq6rOaOqkWq4aoq6+eooLuo5+iuNUHSM2XfNQcx3lu6irqrlmqppFHzYeq
5VTnKsoKA3Y0VVmruiqI2lzqgqHz5huc9Ni7Xfbtb553MvUzn2yMiupVKtydsva89NHm+vQ1IjY8
xmP7l1dedc6NRmoOa1eVJsqLjupo6sw90FA8T6UCtq8ieA+XhTd/MS60iNl4nmvX2Mr79bdBf22o
9ZFtb6xH54u0dHR9uiq3G5nt1eR5pdomoq+X+V78zZAzoOrj3b3kW5zdm9Nn2LKOgnMfbUzH2S+q
SW7sz53ksV0HNHQGNPJ685+1Gtb7Lervm959c9A7u+nN0VWc9rOcKgqHdSbDVMeU2Ltd32d9uedz
D62c2jyK6lUq7Sdsva1RxRrtQRdYqRGx4a4j+4errxmoGozUETy8qYsqDx3V3tWZGegoKDE+tAra
eczwXl4U3cvzEutJo2Z3edNvsZen79XQX9t5HrItrt1ij54u/PR9+tBVpnQHme3W8jWs7xUbRoqQ
1/ldvpmyBroKBx7vec3btOdovuG+xaoEr7amefaX1SS2eMzqXjiPQRR0ERp5GeqTznW1033XbV3U
b59c9BSHd9OZOrKrGWqqfXfaqn2mc0/z1McTuq3VnNVan3VY5/TRXQqq1Vkb5kaOO+Y1VNMs9Tuq
6aOOq/7dVOD1dV1VO6qd1U7qp3V1Xc5jOYNU89nt1Bo302Y5z1blVjnzccdVOzmjNEYzjzN5U79i
qp5z88VVuqzPrU5zVX3Vaq181ViPrFQXUxXVeq2r8quVWTmquVfV9X1fIeqn9W1UpVWKqQKrkd9I
qvqKtqsVU25uaq3FZ4pyrpiq7ZsqyoqunqsRYpqO6m3dROmqednq8+ZZ4zzVWqrIjq6uNVTpzl5i
uPnR4tnVX1dFHIeOI+VWkeqykeq186cyqxxc1VOqsqp4sq2rKrZmbKrp6tqprHVkafNHa3mVPOeg
qvYaOrqk1QaOruyNVTizGPVTDKrst1UxiyrT1U/qzr+657Xz2raqYXGaOpqpwcxriqzZ3nPVkdRV
saqtVX2fyOq+aPmdVM8urqr26m6rtVmYyq5VTqqnVV6q7Vcqu1U7qp3VTrDnTmDVU+qTnoTzR6ut
mPHVtXpuq9VcqdVKVXxpKp5zVU+qp3zHii1r2bqsVX5yKK+aruaq1U28ucqvXFVTRVfV8tXOKeqv
VNTVfqv1XqqcVPPZ6qUatqvuqmHPVxqs95zVJsW6HOtQaKq4+7qs3UVU4PVYurqt5r7VUyyfm7Oc
/P74aojPnPz1XLjqairMq+q7U1Z55Vh4ufn7ZzxHvLqIvIjn5/Dnqbu753FVcquVU65qiq3VeqtV
WKtq2q2aq1VTGqy6rVVN6rNVN6t9iqpFqKs5r5rjMqmro6r53HVcPNHnOlBU+eRx0UXNV1q4jVDj
73nlHimbi5qrKudVV6qnPic1jMsqI+aqn1WVU/uqnHQ9VMzdN1U79OsiurjHquVZVSJVT+qmVRHV
Tiq7NOqzVd5pyrKmKMxjmNHUxVZVzoefKsqVMPqc2VWZ/pEaPHK6rFX+vMqppVYPUxvKChqu1ZON
etHOueqmCqu488ypx3lV6da1V6Nl7WlRtucqauimIrqsc9XVLt9buq5Gr8Xnbmq5vPLqplVTnLjq
KmqmtVNOfd3VePdXmVW86iqI6rtViqzVTRVUzqvVXajmyNxP2ozKsq+ruaravqasupOeqxUOpqs8
91ZVl1WKCrKircPHFGc1RU1NW1U758x1Xasqant2PdTzuZqyqkOp56rHPU1WNVWooqnZz1XI47Zz
1NTP3VTCoqtHPVcT5/rizzy6r21NxRHWLHfMoldpdqNJvpmZd5nhucxjXHRmzeZOXdAjGPeGqp1l
V0xzanDGOcxsOaj9NktnqtVWKDn5zM+GfOeIxjx1JrtbNGc11N2arqqc1Oc0au4vavZtxmyq7VSB
zc1RVdjqvXVnNqeeVWHzVZFVciqp84qrNXc0dV8/Nz1ZVvR2qsqKqYVWartV7qaMznPajnyI9V+q
zdW1ZNKqxcUXPzVWqk8XNdWZuht1WoqrVs1WVU3fPzHNzR5SFJOeL1nOzRrD3UVYZ9FnbLu+hlFh
+3NMmNvdno8yKU0SzM5/r73O9KHznj0zR4dHPfTWOZi59xVKobqea4qDn1GosjZlFjNGqsq+r6sP
ccV9EovOl4jR2emqLvq8X8Xbd1GvY8xTp8U5GrNpRx82o94bfY6jxWqlK41rm06Ezqcqu5MY5LUd
u7zHl85lo8VH55HOHxmMdqLnNEr89dQsi5ukhootpVJsjiXfEbKiKXMWGoMqzKsc85yJ8/M44qjn
ykXnPEpzRz3FzrD3VlWWZ9Fvtl3bvRsiw/etUTJot7s6WRTpuZZmc+onlvpQzPPHpxR4dHjfQ0wa
K5nm5981XKhuruY8VBz658iNG5gyiM4o1VlX1fVh7jivosifW8UXPZ5ai7+qmzX8HbdRrUeYp0+J
86uLWc8fNqPeG32vd5iqcjy4815zTboTaq7KruTGXJa57d2YT2dnUwAB///////////0KgAlCwIA
AFBhEsYR///////////////////////TTw9TFlA44luPR8eRRtRb54osvzbqFlRUdZIuaL1r2pRs
jiXfMNlRFbNmGNQKSrat03OcygaI981AY0eGsVGenNNuqzV6qp1VmlV8zrmPjqpxHj5llBQXQO7N
ioKCgqDqqnN1XznoOtX1Uyq03Ma3rVWYjXQ1cfmPVYqYo+arNOPLMarcyoPlmVTh1VciqtVdEer6
qcK+apVVmg3FUHqyq5zxx5V2J1XOehxVXldViqw6rlWVNX3muY0dVirarVRVTirKvqphU0F1F1NV
ygdBP8zizrUx8+GvnT6VFBQXvtlXUB40bDq6toKDtqgOY9VM+9CsycToI45vpHqhxUFWR0Bzmjsy
oKmrc3QR0Bo2uY9BV1Wo65umXeOrppuq7FHVvSzc8aXegcXSOq7d5VZNVxo1Qdl3V9arWazWWrc2
eq6D1WKk8V0EZs5u3WgqOh6qYVbVZqu3zZdV2rXHk7o0dV41TV1WZGaM/OeraBHzUVBQHquGoKmr
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
sXVn2OJ1O8qs9qg2VZzVYa46u+c9VIWOqkqqnxqrvNVSne1dTQGUxVTCq46qdc1VPcWVU1idVK9V
J2Rxrmw8VTSa5qqc1UwqygiqunSPFU1YagoKCPrQRH59dchUc1XZQVfVedV3myovVBG4qDdRuOOq
nVVMKrGVZVfqppVtAe6qYVc4zVU6q7IqsiqTGVV0x4qsWVZVTvDVZVT6J5Vx7NlTQc9W82RdKigq
uVXOYxjoxsO7PFVx7uzxxx5UVU45kY1BFVlV4VqqQKqfb5sq41WbNFlHU1fVTAx06qcVUlHdxHyt
nNurOm6qca7R83PgqpsOa4rqpUju+eqn3NQG5qqSqqUubKvjoOZLdV+LubnyzRVNXy3UYaOqndRZ
unOeNVNBzaoDc9SkegdVMqqU0er6rFXqPrU5Hzm5qCNVdmVbVaVRFHjN2oKqaYc1rOY9XO+0W6rU
dAqsq6q/V5qu5rqs1LqOfrlRzVYoz5dV2gjPFzRc/art0fXSq6r0dBb1q2Z9VHlL/wy6TI6m6CLK
uq6KzWY8e9ay9m+fMr81kannR1QVFAaeMrqKCp56rlXxZQGuO6nVVOT5V8UVB1VV7OeNur6mLn0q
Crr6xUqoqty7yooIlVbqsGoKCgcS7805R6qw9X4jaoMxXRu6B5dqgTTzeO8xWegoHccavmqDTtXn
699GNbcWOKr6r1Bmqg/PV5nFV3Qx6I+Zeu+VdHQT1V3pFz9zyxx0FWugoKCgNQUHOar46C6CJkY6
rFViq7V8VVijzR10quVU1I/cdVO6C6qcVfz1HNH2dBQWqCKgiqVhulBz1HOs5qrERlzKgdBQK8Ti
q6rHV+9ddRKq5V6OhrVsz6KPKX/vuXSG56m75nlVyruazMaMePa1l7M/maqLIx1dVyjVBUUCinjG
V1FBV3PVdquRZQGvnPU6qp0fKviioOmVXs543aq+pifPnRUFX31ir0uUVW5ceVZQcyqt1WI4qCgb
cSfNR6q09X4jdFmK6N3QXl2qDHl52xu8xWc9A2eONH5qsNO1eegejRXbiM+ar6rxulQfnquGcVX9
aAx6I+G0sq7noJ6q70i5+59x89BVrVBQUBqCg5zVfHQXQREeeqzVtV2q5FVZo6DItH76quVU3I/c
dVPaC6qc1XKmrKjn7O3QXQUHNQRVKNE6DnqKlZUVWYjLmygdBQUFBeJxVdVt1XI6k0UeRR83sec8
eZzK6soYz3UnNz1WG+a2vOyaoKu6zXrkN5Ndqrme3U9jZPUM9vSNOW6mq9M+it1VnoG6tqpzK6mr
JrmqVz0HlWnqee7i54jqYN25qrtW1XKrNV0/NHFV+l0Pf/1ZHNdpiOrKtP75VtXrnqt9jVMfarjV
WqrPQ8dAe+ao5qOrdW4orE9nZ1MAAf//////////9CoAJQ0CAACRmhMqEf//////////////////
////8RjeVW6GZPVYidDHV1RVuTER56opGeelyqzfPzc1JlX1fVxrP6e2ehqOfvURnidTVTK8d1dk
Uwn77UtxxRnqIosj5quqw9Aaq/VTuzXrOaLmq+1V/PFzCq6ecq4/PzVGVNWVfNVPNz1W6/bpVdq/
nqyLqaPt5qrvnNQVdVYqu1dVcuoqtVUwi1VtVOJ1Vca6tj53VTWqndbmNM35Vx6tmOfn54+eqzGr
Mu/VZle9/e1Gev2ofbPVYjqajcxf3c9Sq9Pmjz72NORR1bV5qk6qvV6qdu6k+zGqeaP3DigxOomz
bq2q8aq85KtuoiVfyo6ns05MHojVCzH5Veyq12NLz1e6GeVVyoqtVWj2egw/PlRVqUf8nqw+VbUV
Hk5VnNaquHvmqIukVFVhj1dUR5HzfarnTmqavidVrmq87qu2ZyG5nzdjWuyizmurD1fV1RU9Kg17
jq5ZlX0dYzi8vnqsMRR1dVtTVSDORGPVTjdRVajo+ZVWDnnar9X9FV1TMc5vlXVbUc5jx3z1dVTH
nvdJGsvsaOOPntvmNVcaiqy+fI85u91EVVg0XSrMV83PZrP1So3QdlQyZVbqvVXKrPPVl7999jR6
iKruegq7tFVcPHUc1DQVN69vmqtVbV9Wc9RUqr4jzNVOqr1Vqq7Vu6rlWXz1DVzBjHvmoM9lluZj
qu1Wqtb93UzBnF0ioMnHln91QHv1e0FBF8qux0DXroL5+bKrFBQTnlBQXVTaSTw9RJqg9mIpLit1
dFExkVX1ZU9PhqsqKvuooZmq3UVdV11fGrnqA+c65rNVcdVjvanaviivrHQVdV11Warl+3jq2qnh
6nplVjmNHUR1FXVZVyq+qzVTrmq41WVXKrOpyrjYfpHdXVXjX2quGjNV3NHVTSq5VTLn5qujqpjV
TzNc0WI95qcxqOoOtT2GvrkTkoKsjjz2rqm5L0cVU4s1IY/TOjloKuqtRx0FV50FBVTGqnFVMKrt
JQUlBQeTiN7zRVXaqYHoKCgoKr1VNaqeVU0oKDe8fMakmX23qZoKSgpKtqpzFzUntB45KC8NzVFV
6qmtGerEeorZVTyqmlVOIqTmjiq2Nx3QXj53UxVPtXc0Z8f6GqaisagdV+ffQ3NzxVXaiPmj5uer
KujjmO+VZVdzmNHVajZnVvNU1NVirqu57q6omqu7R6zmqVVtXRbiiqLqDxR1fVTk3PVdi56rEdWV
NTVayqzU+GjNl9Oa7qtZzZ5Vrh5h6tq+r8q3tfNz1XKrZjanarvNVnjyq/zVXzGquzFVi5RzVdR1
Pj9m3z1EZkqvCNFVtV1R1U4q3najS9WquiqIzxUKiqI6unOfVVy7qygi7XG6gVbaj544zKYF1Wec
+tCaW6uqyqmB+ar91dzVWcmKmq5UVU5y4qk1WHMftamKru0QNt+Rs3Md7WqrXPVZOnVdqyrlUc1T
6qNiTKrtRl96CWoNVp6rEeXMY6vq05z1U4PzUH3w2pzmurgpyYjoKsajNFlXyKj5nGa6rlXVWqqd
0fNVpqvqv5VdyrKrDqOfKqZVU5qpnV1TFFV1899elV66rHPnMaPD83Pk7GaNc+TDMfFQ5QTVXVWj
c/PvI6h9qF9rlqKqaVX6uqpnVTirKsqpyfKCz0FSbn56hnjvnaSPVYqsyVUxqpjzVX6qYVW+fGqt
oeeqzVfZ7qpgubPKrDExh6rFX1eaqxZ6ipqu1UwNhtbqvc1WePKqcc1VOIjVXpiqyeWoq+jqVMWv
Zt89WTMZsyq4F5EaqxVeUdVOat53kaz3NVfFVnPHE1zVEdVyej1Vdu6sXN2PG6sFVi1z88cZlMA9
VnnPrQebq6rKqYn5qv3V1RVZyaq6q7VlVOsvmqTR1afuY7tTFV3aIG2/IuecNzHe1qq3z1WTp1Xq
tq5VFRU+pMLzKrtWZfeglqw1W1WY05jHVcqsnjPVTqI981B4janKi6vCnJqOgqx5GaI1XyY+by+e
I9V2r6rdVPJT81Vg1VyqnNV3Ks9qs0FWVOVUzqp1VTSrqui5qvPz3QdKrx6rPObmNHh6ipydjjNG
ufJhxYqE1BNVfVbNz1O8jqH2oX2vVWVU1qpxV1VNKqc1ZVlVOjmoLoOc2VNTVjPHdS0sPVZqszNV
MqqZc1VOKqY1Uw5zUCq2Kh56rVVOL6KYyLnzDc+NYo82jXie1kceK3OOg+b1FivnjS5rS7O7Ue1l
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
ujq48VmdxHQjjiUU50NhnkmrHP2vFmdDrUdx59NRmXnWiy30jujlpJjs377Fz1EcXPVvWJdqk8lD
lVkRdrqKuqpxVlTUxc1VjzdVyrKu9ijRrWrjMQ5uc/NG+8R3cmpiPcjnFFzvtV9XLPel1EZ/fmqJ
PpR616HR+B5Z5xdO+UfycVqhDqu5zVBkqKvdueowaVZqk3GZrL53fRau307mvvz50NHV9VqptmNc
biN23zG5+bmq6p5qCg5uaozOfms9RUHPzG6YerqiI1WHvw9BQHOfn6c1vniP1oEePvEOmRZ3Pd30
iqPmu6PtHR2h038j51PTzmoHuLtOL5RrO1w8g4z9YuwnqPvhu4o/ZirDRcx1bEwGh3PH0TG7qs98
uPp3kC9N3PGOagfTw++06a75lz1ZZ4nXdHsp07bw/Nqq9Z6sPQ3fbtdJFVdyKKJzOVZcSZ52hvDR
X15qu54+1A8nOc5t88Z+eKgOY89R9e0c1MRc9JW60FHSd7ncWpzJxd9SryklplNHHbuLrdDSvur1
02ePyX3c9dB5ro7bm6Cgo6O3nRrcmK0naan8XzXszdznmUer6SZ2va0Gpjcnbp1VDanO3boujr5j
3rXk4p3c531c5MTG5qjl2ecLao11VGvd5rsu0fu1rWlWldHJ1y+vuh83MtxH9xLL2dny6N0fPuj1
0XZe9ulBpdJetBR0lAedygTnMnktSpvxa3TKaOOykIXroaV98vXTcce5JfdzzoPNdLoDu5ugdHR3
eX0a8mcVpTLtNT+L43OTLu5zzKPpfSTzO17WtBqY3J26dZxbta7dunadXRrM3N615OLe5zp31c9M
TE9Q0cuzzn3pqjzqqNKjTxY8j3rU6q069yS9cvr7r5vTvmPrFhr7Hdx5dG6Pn3R6XRdl2nO2+lBp
EOegu7wbuYoL0+kZsqwa8E5uNRvtQemOnk7NxR3pMa0IjmjjvLw1BRRT3bOtGbFGVZz5Qc5onu0u
egquxxJmrpXZuY3RHi7dsPV3aM3PqjvZotJXajXQ0UXXvN9jUG6sw63RrHOdmqDXN1se5HerMxIr
oZxdnuZ6HNM0FWdEY/acoPV1uqzup57qGuZLvmadtjIsijn57JgZse9j9O0u2e6DxJswwx5T83eK
e10j6VY+1ViO769qvoJDq+eg32vt3yKbnzHjoL1FHZj5vLvOyi7GoKuqdYcWt1e8y5od47jw3S6O
cL+uKrF0w6nTH8mHkfP1tmkxXl5a5pYvNxc7w/MdTmmsP27ZmRo8Wz7qVLF8vM2aZq+6/znfvxW+
ivMjij95maI/aPw6tVMVn7n5nErzLNdBee5JEejXc87rmMnhu1qzuaRjeNPw9Bs0UVTV+VWee5pe
OfxPXMl2o44tRYa2rVmvLvLw19ukcWWjpHqsZLj0jzG5zB2EYOZemqZOkLteSUA2EueR4j5pzt3b
t0dGEaOpwymTZ8xX4fLjqypObR7dm7x9Lzy4qmooNVEcfNU1NX1EVSY3RGeXH7Uo8Ro/aCOLc1N2
qvijw14fueIxzXz9MznZuvT1O+agqNyt0btR0EylzYfUnkMR5FJQRWNaBsiqphlWGGg0egckO8Zt
bNo/mR0E5Erhe+8x1WR1OZFePzeH1HQd++4+pk5lx5zbzx3dVyr4+0axWnhnvUSMd3HF3r20ahwx
+Y+H1bmb32w8Zt47VrW120ksfaYwJkU2orrrtke3kfNcV9nMS2Zy3l0FBjtK4j7oFrWa6K5g5rC9
eTly6avPX0nMey3PQLv03mQ876eTHo7NX0vsfptX0R0tp70sOn5ctnNnRzl95nO0xZj8/c3sZo99
omj5aPp779npI+Y+ywKQineRHrrtke3kdRcVp6ls1y3l0FBl2lcR+1AtazNdFcxZmE3k5cras3r6
fZzOy+c9Bkx36PMnIed9PbxK/bHbs0a1fY739tKNLvl70sjLq5i5bjMbpc4fvrO01Zj1Pc3tBznP
V/PfTmeu2Y5cs4qKigiPVTr3CLFR2fk+/O/br5M9J6jVucWkyOUF1ce+rjVrb2ffsSzLPMaoHqoo
HMppJWpzOnPVlx4ZN93mZ2mjaV7imMc5Fke7NHz2bvGMfNUal5uepq6O9M6fdZNWZ7MePp5PZ2dT
AAH///////////QqACUPAgAAKLIBKBH//////////////////////0sz25lFqgR8or6ZuYw9o19D
UB4jTdFgiij0nRdWz889QVLx9ZVkZn8dReOLLseo1SZRUEa7a79enfr2izniRjGuM+ESryf547Vu
ducoO0fSZmM7PpuPJ0Peamd9H3vW732CnqNvIw76dsqG6m10oLubelo+Snugw0d91vMoKCSc96G9
1Qa6NQuPKE3uPpkWdelmK3FFztdrtLH0ppI093zc1Bkd5FlAehUSPQSWaSzZ00vT8+uk67Vq5umj
nFM7V25Oxl6ZGNHvNpUB+l0EVAb1znvZql1Ee+3RzO+mwdK7OnkXmGiiYvedtx3aPQxdL50nRvqu
jPRehUMa35OampVpzuX7lRc01l+vdzinBfvWgyg5qDOfPaC4piavPcbNnro7eu3Q/bfNQTm8uc5/
ZjDWfJzI+8z2mee0baB+yzJk75vIl6unahNvnvIwZ0CO5o01rOd8y3d65u9B1uxY5lz4MFFHfYUH
NrmXPE4sesv2rnpmxxrq0fvY9quELi57frmDzp11qPLizWGqfGps/Nfep7TE1233vp0tJugXZKrF
2NQFMnMmMtd5x6Z5gezlBEhl+9su6WjyW/G714nhourNKua95PvMj+UczMTjv3aaKK+0UR0LpYmR
UfRSPzt08fZmdHJ1xrsL7Xfu9R71Xt3Re3q/ehur33nNVHPz81yHWd1NTDPOxHdn1euxpSPTt214
/b1lp+THVkTl79SxVqLW5rtR9LTRpn1dtLol01OLzSnjL287zmmeYHs5QRIZ723h708V78fS76Jm
iiU/1NKqi1nrNkfzczMTju90KaKX2iijwX5FZFR9E3rt1T7M10cm6DGuwvtd+reo96PXt3v23fpu
pV9t91qo56nmuSJrGlMWfXNG+ln6dOxpSPTprtrPJy8vWYfJgqukx1sifsXOklmvNbmu1HaaN5OL
t0XRZ01OCaXmsnjJRZazXNz3FGeOgNfTE28MbKTWk+bb0soEZ9k2bb3K2HpM5Sv1ix9KCgbabWae
mfNLa1Hqg5s7iZQXZY8uJYZnv3LimsvU16foyltX0sbnaPo+86N30NkmlHrpavL1rmEt97V6edL9
ZjZtbjzVKQ2brOdFNUNnpLcfS79P2vpQI15OO6jmS6UO1rKCaazoo6tP1jy8qca72+9x303dAaew
9He+0ak7NZdBcZBxdNLsNx5rqhW6dXls+pg2vVQHTWPD0HQ27zDR3eLHQavGlaDz1c8x0BzXEQzH
QdszSiPd3u+lA7Um45ndt71b6c0eaupRSYmFffL7Rz3beb6JGzeunf1FLMaYMfMquatJTK68+R+0
C54rl1Q9+duYyhN9dBh5xZ2WsaSProecxUHtBdAzXkZriyrnQDRj94o+nWPHeJ+9t0Hbp0jzOk90
5r7W6B0FA9oUVAtX01a76x0Saib6btdum0Ude77dFQY+eh6ZMLFmdikVBH3vmNe403Faat9O3fKC
LHmHcR58x6DozGvdxZ3nu6vI6DNafNcWqAyHRK48oZOqb60E7s12bv0ooTF2KCMx0O1BQH6mVFO6
SsTmRUIugzpeRTTOcH1IrmGrbvDdl3yg7PvzHkjxvZ+7Idj5Zl0juhV311Wvp1Z4qCTO0cWZ275e
c2er2c15q2zXvtGehiIUpQ7oOjV9lu9nZ0ZzFHvtW81by+u6+1imO+Y9D3O0fbKCZiTzHS0tczmL
Tt9LU4sDcxrfXeSdGqCYireKlXwg+t7oN6dxUOUE528o7jpMxdYuj5zN3i+q37cxk18rvs3rMNqO
g2brkx0IdnT7vLjvNc97V7ms+a69+uTvbebtbyd6I1tc53FS0tcRug6Pur7q9nmY/V4ZzFHvtver
Zr67pNp4phZjofnudsj7ZQexfXnylpa5mzpM7tLNYH55rfXeRSdGqCY5q3ipVWIPrtUG9XcVCqCc
7d/KM8dJiXWLo6mI731dpaVv2/Mofg7N6zDaPQPOuTBDp2beHj7XmunPe1e6HPNdaDr0yd7bzdre
TvVI7ayLNdOe8524jmj6ZHFH0mOlrEdCro6iq/o9Xs1yb6/b3d58q61QmyLvFVcjnYulA7NRp5gv
q8zclAlHVcjjMsv53aXa1fXLjP1oDUF+mV12jyTraNebj117dulBmUDPvOzMnkkd9tpfH0xOgt9I
uj3EZ3lA8j7LKnL6x5Qbjfagi1a6xx/KNxGoEnd1NXGvA+meX35unOu/mPMqMypqphcVRE/F7q89
y+yVmN05qm+e3o+ffHznzni7tXd5fV3V9VjL3zZ8vL7S9I8SSzOnY+ZF2u7w3NiXudFzVOG0azbq
/LVzHTn87edu97oGtedaCLr2P23nRUFfoj9pjnt7x5ne7j72kQinLZ9KgP33mPO1B1zniqb7K8zv
H2wdzHfSOq7tmq7nyo74epGnKnm4+bUTNFE4+sd2karGY5+lTF0S03HmNO0N3Xfx1MXbI6gxsw4z
nHMeHNVyPG5BQxXQW6vqFfQYL+RxdgjLq+Y3fmzdAZdY8oMaUd8yw0ccVBcVA44szolRt0d5nbLN
zmjzVHrfXdBQZ2iRuftnxs3bHQUHaLnN37btR51uc5qCOgPQxH18Pdnj5rtmtZfNzx1F7x3Q1FXV
N5zH0c5/kfbObnivVA40ejM6C9Ya87Ye6PO+8j7PIzGozReqJmzLu+bp27rJi+drtlB5rLtRN1F4
jnqH3xHyK2zrvdHJk5biOm29Yj7s73BhJ7kzwN9r9XTLPcT7c2s3K7Uhz2+mt94qBs3Xoumaz7vW
6PT+0Y3Fa2a19kko/mroDXFMPt7nqjzLu2a4uag3eX1syaeYagwXhunfUzKe7696F4fprWNxq80+
Y0Uc78pL7XJdn+5rLepe1BmdulI2a7drsz0ZnebeZq2fs+925KDJy75mm6N6xKjON6s+u0LSfaSh
8+N9j36l0yz9bifao1mwzo5zvp01e+8VBjTN16dl0zWfd7o9WqMb5rWzWvsklH8oNXQGuJvt7nqj
zLs7NfNzUFezX1uJTlA8MagML7Ybp36TMp7vr3oXh+mtGdx9M0+aLmjc78pFd9rIP0939x3I9S9n
hu/SkdmuO3a7WejZ87PDSYvAnUH57WuijmqHJizIx/On0KxdHJP5KvBimNtOVUtDPTzz2I1/Oh5b
uJ+xLqfmo7+9scw/Ms+ttK9DnsXRnMp2zLzygNajivWolH7ccb1mDDYo6idycuYseXdDMHz3tzmi
PYuO5jT7XeZzxTT1kyecg7vSxXlXVZUTJ8oM1kxFe+8XY3hu2Lp57dX8yqIo+kTyKlM8iq+KgmKu
jvV+zHfG0aYDvWZtWkfIpXRtX9ncnMz0O7u0Jj6p6hoZqanj9KCW56ZNdBmXF30a9vB0vOh82jIN
69PrE+nsx9ZsrI5lEY/qfa7xSdjc6s1BZ7oB6byh7XiveHvLXW5bMrvZosV6y6OpR/NLLqZcXNt5
M0B96O46DTdGZdb9Mc2YObKC4u8XMc+/fdx5zXelUoTM4jrUfY7R8uzxm9lqXQL5zYqmOjmF1jNl
BFmjC875avqdrFGp9zWcx87Ix2FfPL3y5jM7B3VvOOcacxnOd3LQIYbPfKiTQoO4q89BQM8a5+bX
f2SgkakFWUHmUPP7eSVc46k+aPjM7+5s/SO4jm7HZ+a4+zjUXNnq7Redo9HznnqGoPfNjMagM7w5
nHhu58Mc05GahvtFd4dRR96G4jx3EbeXOTF3FHtYL6ZAy9qDXUXVsaoHE7oOdrm76PzVNQW7UA9w
R5QN0FBQH5qnoUnprebkKd6uqyPQoKDIjnP351zVNRGaP2gGZOc/P0tTHivXbpNPnnkY7SzedWzR
XfTEaro6rFStPnPFUG5sujNOYfw7q+J6POd7dR2nJOxtSs7mHured1DPm71eW44xGLiEbuaTyguI
1Y8vbwPZ/NeN9Fi13ufvrdBPe0auQ6UV4aON8+VvI+yiM93mTKfR5zxTEy89zs+f36Mdht41Hsyv
tGo0pzqumjpc67TCx1F6u3F2cXTR+/ag9iucuOdKhRR99yG0bLjijNQPr2652vs1R2t4sOfPfGbo
6Q5PfaOb7X5cnPMc8V0HW2bOZ9O3vmbxbXp+1BHZjqj5g+3SlvpauPnEfyZPvmHOzzS7KguI1Y/b
z2+0a815YfQJaoMR5/rc97RqzyHWRdrMbnjcdaYj7KIz3eZM+p9Hi54piZee52fP74Muw3KzNR7M
r7RqNZONdOuo1lSnMLHUXq7cXZxdNH79qCcilvZ40VKBRR+0G5ItGUR44ozN9e3Xsfs1e94sPHnv
jN0ukOT3355vsrmDyVK54j0HW2aLOajzr298zeLa9P2oI7Mdb5g326S2fHd67Zj2aceI1AfK8/OV
oo+dVPP02trPV42aS6lx80i8eGmrZzLL+W/pz5fkeXFqYcSvmzygSw/S8iuOpeRzfRNY0fL2fD0F
4707sSTlDONI2l0xYr12ixZm6CXLks2NPyrEbtHUXRG57OpT2mPci1q+i8nDXFOzLdp7PvDs0ccz
GKCOTmeRPIr2/dWa27vmzD36fZnUKI2TciayrFedo3cavfTL6GOz7MrRjJvFZ/Fdhbqb89Sjeaep
DX0vvFze5t7wKO8EWXeIZaW3h/LE3fXHmlOrojsWmncbNiy5tO727DEw8ltHjxVdZ1zR5Mcyt0UW
YYZtR4306TZ3QZiOa/Vu4k0rWlzjJrYmTB5cdxvnqYrzps3a+acmqH2Q5txxR6N2nTzJ9rKLqY13
QKNM16+/LoY0kdRtVmr1jNvZ3b87YUjF5t8269WVdUc41HI44xd+VdUXGIzST0uLzntQ5ry0cye7
WGyZ2eZ76nJRHIsNlqzdLMfI8w8UeMx/TX6a93e3N6x5nq6ZJFEczw5jXk/faK8SzMzFZrygyg9N
W87a1naNZFUyx81Sqs5ueJ3Ug2fbNzPn5ucyqzn5oz59vvzVPaLn5qmoeVHPinZpv7Zue6DvHhj7
PYd6M76Mxz6xmd4ss2avDrJhEYz3F5luh2bDKhvLcWLJ5m0j5nR9WtnmbnXE7SCORVCjKLupzdtc
+kyJrfmSXlwmfF4r6uxHPPDY3e7vJh5fS30tPo1OnyhtmnfLzz2umfOyvnzPLzFI1bty/JxTnaK8
uad2Oj6bR5F3DSNz7KZhulzKd4nOS/O8UXju+Y/S+ZL1p9kzxe7T6Ut9L5+bR+/WcfXtWiKAxrR/
tB2zDd71t5FGel7KzJiTou77Y43503HFnfppJXIqHDLm7p7tc/RMhFb8El4cgJnxNR+X1dqOeeGx
u93kx2y+l30tPo8nTmyhtmnfLzftdXHnbL58zy8xbfY7tztG1OdojmtOzjo+m0eRG7kWkaPZ9V8R
ut+9WfMc57QRRefbnuY/SO+bFOWn2xxxTm0+lLfS6nm0fv1nHP9fYigMa0f7Qdsw1BeunZ5Fznpe
yZkxroqB9scbmOu4+bO/RGzJzn5jJ1B7i1eLnQ5mfKDXNg0ukUm0NTXYThp55qhs1Cq6GIwXTL9n
PZx65s7phrfN5sz09d5yo3vVfzT7ZNLO/R9NTmXQm58qRY2+e9HgbB05j+K78C2K1VMFWNfTLPm+
yNr1o8d3OI1pjHzxzF7mtvDuHdrtp11zbd4s65kxV2NWdedZi9aNnj73OVYHPdsPd9rUsUfSZnpy
h3d0D8wTi7u1PUCjVGejH06tQb3bT2x1yh3ryh9fbzN6weLxTjz3FbimNdQ52xzOu/EmaY0NMaG9
Pbc4xMa6au41X8LDYzetwj35NPxdsmVOdnMHlcxuaoOj6a97Psdrod13zU9nZ1MAAWBgAAAAAAAA
9CoAJRACAADwD1skEf//////////////////aP//0nEa9J5iSP2N2rh6r2um91kpy4dr6bnphqWX
q93dfWqGcx4nF2Zj3g6HaW6uP0kd1GC9+36+1u9cy31696B66dM1rt33Me9F0595WpHusVVJeT1Z
lfa+ZK3uvYwKcU9c1r3dniU6fpeb0+63ePWY2ttRX23rL6Z727Xa7Req953wpusftOe6fq7HirVK
t5nyv2MrYoHnbpB/e2vHvt0Cw+Md+mu/RX0R/R3oFOdNUAbekDB33T56mtMLz23lD2rq/ptanvYl
Q0E4rnH1z2Uejpis+6D3bfPMKgR+n1dO1Ct6pBMKW6OuPDq7ycXR/K85iXbaC6+9FbeyKvpqjtM7
xa3eteZHOYEe9vzdres6LGsHRPz6/fZi9CYzLObM17JK7amJzdJQb6W6124W73s9fBSI99jq9zlz
E7lAqRq3o+jbvxGj6i4pjcqjpJh76djdN9py24jmv3eLpea2N7y3SN4430rLf3EY+5zXnc1qv8Ty
30nE/Yt+q73DKD3pltoh2V2/bxnvKCd3etTBueczoEe+zY2121nXMawdF59fvur0JjMuzZnnrldt
TE5uke+lutWtiv2t3vZ+tfBSI99jq9zlzE7nVUj9VvUeu1+I3PQC4zTW2o6TT307G6Pc5bcUZj+7
xdLMtje7w9pvHH26a+J7jyhMftOLbNar/E8jt9JzH7FvU4rV9ge8W7trAbQs3aX7QM9Bbu+zjtvT
Hfn60sxOBJqp7dZLNY7h5lt7cW9mdq8OYwOe9IbQozdJPr7DOznbYs+o3aPLgTk+G1d5z9pPps+C
z60a6Dr17mPjoGca3LEth7Zjp4fXxS5Zm+qy4N77ZgwXQGVugN2oA2nEfVBcxSz5jzhrxxDDd123
l1HWg+vKCcyxocyoKn7rpuHaZObtpZY117WtKg+UFAd31C+D5pdTnztyedCj1Oxa6b1725gjbN32
1R91elfdN6x4bpgi0+htCjihQJ5LFsLpsUGGEn28898itnx+88We28wSZH8lHQfXoOvI/fdda8aV
+8uaTdf63L1Gvu8GeeeTOe5Qd8iRz4ozudZpb0pT7nO+KgoI3fVZiNh78naCPO3aU1BY641O+PHc
ZsjxLEHFd2aYw2GNG4x0x9wZ/L7DLQzpfN2Ovst0GzYczqDONZ7QY6CozXXOeLnke6ubS5s8eaa5
+cyvK16ejx7leLpR/EO2UYzAux7Bx0w33vQKjF6amflHd9N9KC8v5rOwSjPL8u8tzNs45lizct9B
fR9hm3mIdLuXz33YnJIrvt4MtWc176duv1sX8XZNrWr6b309k3R0edu0tH132Psgygo6OSWTV3d4
vFzyLsNr70+9sPqgo8uHZ39F9szVHRvp87DDxc/aW86Oj+ZrZsxi8yULtHYOOmG+pqj6C+l2pndH
Z9NCgvLo65uwS5zy/LvPFbVs4qFi1m9y301fR9hieZL0u5fPfdickt9vBh1ZzXvp36xfbsX8o+yt
ta1fTtteyb3rO3aWjoO2+xyhBlBJR0cksnS7OvGueRDa+9Pq7R4fVBR5cOzv6L7ZnSjo30+bGD02
ebQ5pcyh+Dm1nNrTx84P7H5CJGHQbet65cxxbO+a6mKpq7IuwP6ew1cDdni0d6w4NUzRraxrFs9x
5mRHZlny+feTl7NcgPGZvDI0ua9EprGLMyxJk4JyLyM85h4xEujycXjnGYwNZ5de8piIyNhjRc29
3m44uyrjUVTvb5z1I8PVYBumt1Gal3FA9nu7fmnzebFxTlx68PY54dvXUxI24ta2wtPp2zBU81SO
fp5EjptjnGLMfbOwwXrp26Z5fjzI0zmjjt6s+px4rxYFvMPOGucPjGtjL2J8dIsYUZ7v3A0+azH9
5uZbauYer9MftmoUV4G1KzeZKPJleTHzyeCF+zvz6DZ6LPB+znreY4zb1fnjqem46hm56scxnbte
/l5h+13m+lRH0uOpxZzxIWfDx5nNuKpedM3vNxvwdvRLhlzCYnJjsPFD75fT5MCLtH5MD59WR+Vd
qpY+R9IpiemOqwHj6RXRXzONR9lJYi0NDfTcdCDWbM81zpR7Pl44jfXJrLuPXPUb1MyH0zn8t+m7
Zq99tS/Re8jPnxj3R9eePeO87Tt5lxvaeriiQ+5DZrFzmujfp6tiOrszY8nFs8TkSSWTi2pmVLy3
4FrTQzG36MtaYmN7bmUrVy5pzHj8WMbyd2L9EtmPknjlE88V4b35ZjPB4c1uTzp7jGK8zck7Heds
2k9kLxHNGczbnNZG5PPH5tO80fMvne09HuLmQ8wPZrhc5ro3Me4erYjrLuJseTi2eJyJJZpLeTMq
XlvwLWrQzG79Yy1piY3tubUxafmZpzHlzGljG1vBfvu2Y+OYcuTzxRZF7rFE8ExHFbk1099NYyNH
xZuSdjy87ZtY1t4jzic9jxi2qGjtIa6K1YMNLwaGQ8XnL1rUSNp+mhbHZ8b3Bl7F4hnL1Ww88zLy
2obEvJj1Mb1rzppBV/Bkxa8T10x7nDN8RZPdMucHnp9rM355nTTHmD0dlL7ynLTaCgk9qc8W/tic
R+w7L15iDQzFY+csUot24Pt0nITDebmM8vTh12O0Ek9wRx6HmPxwae4Oc3sYvF7rF26a9YxaDkz1
e7NOZbyJiTYOGqMKckHvEYz1+2vOJ7fle9+jt0h4n69fOtvy2tdp5792n2YrMVre/vqg1LjTh6td
10bFmSYxQVZTAnPRK+gk3MDt17dhOJehewQQmJxea+bkFaD3H27LzAZw9818D9TXbsNbCgfPGPNY
x01cmK36FuXWtLtQDSNoeJ6xph33ehrxC29V5UJySWYsP1/fJh6l+e35d7v2dT6fBOee5nscFbV9
s9aM8U9sIWOzGxpdMujCmB7xfVknl2HDW/vYaHacHrYk6Me9EOjvKPd/bRpZxPfzaGcR9GNTDla1
5nj7PvrQ2Na98H3idmJNQmO3j9Gx02x2o+0k6NzG10xrXkwn0z1uUa1qYHj30mp6a3CY9kD+oMbO
8tY7XniExvUsk5oTg38+rx/YamK4l8nNbw9HIFMScveN29WeeXfrEut67DptTmpx2H0DHvnRD7Zq
Pd0Z0acT3rtDOI+jTmG9vevM8fZ99dBmwunT3wfeJ2Yk1CY7+P0bG3X7Ue5J2tuY3nTH21MPL6Z7
5blHTWpgeTk099KGemtwmPfA+iDhuN4dGteeITG1K5zQnBv56vH9+LpMOuJZic02+mLdiJny9jtx
HKLDyTUj8fXsG1pnwSSrptDIIbfkM8Q01yQZn75D1aba752bV6eg3ob9w2/MHcdH13d9YI/XSeh3
5LpY1vW5MyTXxIb3rv9d6u5A/ssKMa930vyxLHL7JylQYSwbHQL7tg/aRCRwYXWHaZDMNejV99PX
RxM2r2GHOX0DHsuhrN8nKLk6H0pZNGhK9jsuXbTXg10QfTe533iLNvL5bY+jaCDDklHkmtwW4bUX
TG9NbckGtyZKxe3ra29abzWK8HNb8oNC36N3IOj0MXutTA6TEJHfUGWaG9Jw6DVyNTmISQXKRuUa
ozb8Uvzl2+MNhj75xXvpvf1nCNvpisLp9iFyd/sz0+udsUeeIfZZJExO94WF0WmpzM7BCxg1CRv3
pRm34pfkO3xvA/TXDzzkoMdNj6zhZvoZBden3cQvVB9886eN2JM8xD7LMyJeMTvfl4waFi+W3EGH
2hgXk55Dfmwm9bHnEnFm/V44Gzlpv3w7DGcWhgob8how3saDS9x4HysehiY3vB5Bewe9b4mMNNCO
YnB7754ZqG4PShsLUxDzOl6C7bhmdEjBC8y1loGHqGaQkDDtvbQS5wz7DNoOGk9bcMYnIZesvfvk
PILwe4LacPYH8DfgUGGoYLGIZoe8nrQ9Q9g/dbHg2nyb9TjE5sb0MHnfUIh6H2CQ9d75Lwb1tw98
YtMYNPsxgUxg08OghMa10zAbY8GobULHvLwJ7x+ZuE5MQv1eyPb3MOGXk6NxjQ01DsLyw2ZtXecs
0pyZS8R4e+YZXv3y8CnAxYT3g0L7eP33PAhrNjTw6CG9a6ZnmA29y74m09WEEPAg945gZuE5MB36
1ONv0bmHDLxjdiOGhpoajQOHEzNq7yDzSU56kvFY0vDRK9++XgU5bGmEHyQ6D30e8noecrG/VDcN
B2NwfF2+NcEMh5D3oxuCG7hnK9cu0xcOoXk5Y9G0doPx+2GwuyY1DXG8YfJjt0C2PApweeLYbwTn
rh5a9HgT5ecRbWOD1C2HnJ66ewVUG/HpuDBhF5uqFBwzb4jCHuh6+Wcle4PcNBqDFjzibg4b4jC4
uoecTY3ri7BoJa83xX4HBBDTzW1vzXEc5xWhra95MMMPVhBbcNQb11tpacPBiSuC4qY2h6HOclcP
fIPWhvweWE+Jqc357MZMTjzY92oJJsTkF7rfo3qc1mw+l7DG9+6htTg8DDDGknq+SC2+WoN6620t
MPwYMSsbD2FxU956G5zl4r175C9dNDfg8sJjWoanL3r2YyYnHm9a2kPEkwx2aC91v0b6bnNG2L6X
vYsb3OahvQ1Biw722hmDW75a0uJGlvsNjWhvi6XJrlY1VDrOSa2xsIWrCsa2gx25JhOG+K04WDwz
fGXG1BIPcN8XcNjVqqaxrWDFrBrXYOqDUNhb1yx77cRZy3xtu0+zh0D4lvtDfHXLGM7Q6cTQ3pbG
+NoPpvpahj2lxczl23yyCerxW+zh1D4iF2O0N75a4mcXBnYa6cTQ1votjeb4uu+kNX030tDpyab4
yDYYdUL4q5PjH4lrjLjWHx0+ImM4uN8nxlxHxGHBcnVE06qwcHVGoOCguIuLkFxE3C+T495eMy4i
C4ifGfFTecVjOPYavEcZagwmmxjuwr4r5PiXl4zZxEM4qfGfEvknjwNcRjMfHtPLxHGWoOCeNgB/
PxouvCJ76m0+Sy5VX3wNbPhw4ksfB3lU+HuOM9+EPsyUT5/H69d/PXX1eH4zUKXrXHWQh1rjqs8u
fPU/Cehc7ycdZCeGuOqzy58+fwNX7KbD7HJpRPAgAmkKaBpjAeDp7PmhTT2cHSAJDRQDy+p8D2cD
IfR+h6GUzREPL9RNSU9PL1PmD9DyJ8QYYBVE+p8KnSHwv8PQnp9Hs0ZSnsSFvm8nyNafUSz6HgxD
kTAIfQ1gC+D2fRr8Dk5mmn2cce3xTPO0LXycaRAGgjGpKHWSDOz7IfA9nwP8dynwOMK3435G3QQ/
mc3yJ2fB8nxnxOLg38iUSocQIdSdeU1AxN8Hm9K9vUiICtSBXTg4tFReSCiABon3JMPDj7RqKpyf
QDwDkjTUODo9+Vw9nJ8jw/UgAdZgGnJ1E7KQ2cclt8dc3o8IfN6PgJ8Ts+JJr8BU5AEOj4iClIU4
KBCAY6J5PkJgCQT4CehPgU05ejDwcyDA5XB5DYyp5NKdGHkDpgkJMPJTCEEirNNNMPydnkNEARqq
gCAxxpDi4gAd8UGLGIHiM1BgDyp9CHzKdIfN6Po9ifE8AE18mKcgD5EFKcnBQOj4nJD6mAaJ8BPQ
nwKY9HQHM2AGrg8hsZU8ng6MPIHIGiyYeTshBIkTkSGmH5OzyPIAiAAqhYxxoo25EDvigxVPZ2dT
AAFhYAAAAAAAAPQqACURAgAA+XU9gBH/////////////////////gZEDwgAagwB4iVTwfCgAAAAA
A4AD3GoADsAbgAH446AAAAAAAAOzmASQAAAAAAAY2OAPAAAAAABWBz58WjvkoFMBREQy+YYYY4W4
WoZoZ4aIY4ZIXoZIYoZoZoZoZoZoZ4ZoZ4YIcodoW4XIZ4XIZ4b3iFiHOGKHhELsN0M0MsMUL0M0
MUM1yIY4eoXoZocYbTEOEMQw7Q5mQE/Q8QvQzw4QuQwwyQxQtQuASHGHiGaGeGGGeGeGCGMxZPOL
sM0PEOPoQyPcL8MkM0L8L0L0M8NsLMLQHhrhehnhmhdhahmhWhohlhkhahsevWGaGiGSHqGiGKG2
FuGSG+GT1hi9CGaF2GWGKHqF6GGGKGiGx5hShlhjhkhYhahbhbhzhkdhWhadhkhkGGQADDFD7DlD
jDNC1DABPEN8L0NcMcMkM8McMMM0MkMsNsMcM0LMM8MUMUMsO0MkM8LkLMMUOcO0Lj3DJDFDvDNC
5DjDZDLDHDNDJDxC3DjDFDPDPDNDjDJDlC7DJDBDNDHDFDZDPDBC3DjDPC1C3C5DvDlDPC1DbDRD
PDHC6A4W4ZIb4ZIYoYodoXYaoW4Y4YoYoZobIZocoYvQhm9YW/Qhk9YYobIbIXodoY4ZoZIbIZIZ
IWoZIbYXPWGD0IaPQhjhihkhxhhhnhihUhjhbhhhahgh3hnhnhthshhhshahuhmhchahbhrhchch
3hbeYXwdDdDPDRDNDJDJC3DP5hjhhh3hih3hchdh2hzAsNkMkKkL0LsM0McM0LML0McLkLcOMMUN
EL0OMOcLsMkOcNcNkO8NELsMgLAEMEML5Dq9QyQ7Q7QyQ4w7wuw0wtwuwwwwxOwyQtQzw4+hDnDD
DPDIJmwswzw4wyQzQxQuchghiO2hchYhkhnhmhkhmhnhbhyhkhjhahthahbhXBYHhSetDvC5C5DH
DNDXDBDHC7DBC5DJDPDFDPDtDNC3C3DnDNDbDZDNDRDHDJDBDPDvDHC7DPC1CzCzDnDFDlDrDNDJ
DjDRDvDPDJC3C5DvDxDPDaiEmFGF+FKFkAAAGAKEkBwoAgAQmwzvoNhchYBoEAgFhdNMQGAAYD4Y
AaKBhaeRBQCiAkKcK0KYMBEOMJLoHA4CGEkGQuA0YaYT4TYTQZDQCAa+Ah2FOFOEkHgYBgiE0GAg
CggFwkjgYCHgFwrAmgiEnkKUKMNEJINhXA4KAgOhJAD6CAZCeBYUISYSQAINAHpACFYEQtwngAAQ
ogOE2FUEAmGgAQyQmggEQkg0GADgMAYAAIIhJAcQAAgLBgAAAC8iBQQCXYUQcIMBAMBcJsJoAhWB
ELMJoPhJLChEDIagGAIUQSAQWBwaBAJCSBAZDNCzDUiGuEmFPxDjCy/vIPAkKYAh2hTBoIhJAULz
6DYWgOAAIBoKIDBoMB4I9CFGHcGA0GQkwkugcDvgwkv4MBogCE0CgyEkGvcJMMDoIhTBADBEKoCh
OBkKMKgMBYFdBgIBgAhVBMJIMhaB4EhphRheAUKAMAgEhRAoIBkJ4AhQhJhihJADoN9EAQkwtQng
CEmG8BwowmggDAwAGAABgRCSDQBDIAIXAHCkAYSQOAwaDgBC9DwBAWDAGAAHDiIFhVBzsKIOGFqE
mFoFggBgAEAGE0HwkiDAcAgGAIUYWwCC4UAbCmCIcoSQIBIWoVodQJkPkViweTBb4cEqfJghTzZn
elzrW+z1NCGhCzd3M3dzc3Ny25u2w5mbm5mZtzu2p7KmkqtqXke2tR/SptnkEbyRR7O7q7EUbe8h
SaPP9iL/Wt4oIldO9UEO6paXhWovv9TzStRRf7aTy1dXQheJeL3VfDx7H3x4o9FPoQaf7n3/dj1Q
iizpUlmoX2LRZwkIPxL+o2QtSF49lnNUhgzOrejyODfFR8czfnwz1EzymeEq8hBUq0tMjV1oE5H/
euhC4RH7TXDPgtmhTOi8x+L3xho2DRzwsl8IZDH7W6CrkaR/7cy0yIxi/lXeEEvLN99ZQroh8JhR
LF8SWrBi4snDFWimtDVRRfPH/4kEcz/vesK72R6v8uAAtGrAog3A14Nd+PRR7zGlrN2OLD7uPxAx
Y3yczo65A4cXmq9aEHEyOa00exdu0P3iB7fNbAS0bHuYaEd/74gGvsL7R/HacbgdHuoACvE5htdJ
RY6LujQ1k+w6aB+1lYo446A7DwjxBi9EdyTk+YxFi2NitH/E+j8W74VpxX/Hci7yA2PJiO3LgxNe
rlFov5ILDFqE8+AlJZkTVxNc0ktitOxOQKYsIssS7cgGw+dE21cIgUAKPcMffjy8ka34iV/7XG1A
/h3Cwh+4//AmIxsJetPo/FrXkG2k0WPHITXE4fLbTFu/+FBFaPdhywEh5h1DAzo0liYh9dI9w83x
R/a+aEw1cS5R/ElYrjhj/Ynfju2saOSfXbU76I+P/j93FphZnrFfVrrfhY9h12xENCiiGczF6MD6
H4WtYmT8/wz8eiFARHF/J4RXCzEcywBxPCtBeiPXT2HuZGBnwLaPy3+Tk/UbW+HwaEB0eT/3I6DF
FZ/ReyER+/0auncX3rnj8YlYD9vl5Z3hkcbRsIvBMasY7C1j+0uKKOL8HzEfi1c+L1gLyEj5ZvrQ
/YGmrCLhx+tEwNbx73b3MaRBEQesEfDXf+eN0E4iGbBR+tFn43d65uV3XYhBJcbRHmiTlcDFiDUU
ZujdeTlsZtptiaWesn64Xxd60WRYDVqv7ATjA0T5bmpR+R9xKqL5FYkjyRLO4J2kfyvCEviEetBi
QOcvfxgWBkncgSuqPzHiVmfasLHGpp0sHGsSL/liFbiND7fn1JYmKEiu8R+tMkGB0Qs4g5f+7NjQ
cijgUEAxF8on3mh9sfl/J5oJGxu2kBwc/wPmiY7UmAsIjNrW2zqrY/oRtKExmXMw0hi4HOwxaM4l
ix4BjE3Yt/2JY/yblp7FXwDGNJH+sEcBGLAvwsk1o/3d4NsAm1CeJ4UWIGP3QPDYueIBDd1OpNNG
yKbbRpVJ6N6K19WsBSsRL6GkO4PbvCj8GP//8ogxxcNEGv19YealYiiVpaooCNE9FHhsZRa/Fxxc
P38WKInikf4xGL3fK9NShXvgMXP/S4PfOdi8JmKf/bHu4e4/K0n2j3cpC3cXvqTl8D5KJNh+VO53
by7F37JC3tGruVbvqUv2Uf7nVbPVM7NZ+/m76k6j+YE9z3YsnJW/fvIHkBomKvP65X/sWX2pfWVE
QxZ48OPO/HGLLsHeafsL1mglak+OpI7ifdiVqSc6U7Y9oy7P+5GeOZVJBSVNFzKvknue8NSVPu8l
PU+4dBPZPu48376a8h9ZDxh+xTRMx05XBC816Z/oOdqOOLg/e9wcP86Y/zKHZFV5XuzkqhGVfvKZ
zRMN5HL+YGjnJ7NauZ6pWLCOfY7ORyKEP8ojuf7qfTnCtr+nRtO6fgxYR10RIM7/k51qvc91ImeP
rsd2Sgeo39a66kIrV/95ZyferOf8+nSM7P8hfc5dSJnc9a2fY9a8o/P7rqRXyBftGY9l4UUT0SLW
8aQ1ivcs+4/DLZioWKOozF//ys2ZC/I++CflU+uO7NRd6vhY/K37oUJX+wi/lmzXPM6D+mdV9gpY
R5b9UC/6P/7tmSPzK8rf8fUBwKJg46ShNj2rx58hyvyruJqUGRt1TMo9RJU+YMixaZITFPLn8dnu
VSwRa2ryoAf+7nOYg8hfOcUn1WsSp+E/0ixaZIlBJI8UGqbv97diikoMVP38/GjNoxUyr3dVP9xp
QqasxQz+PLIoZSiq9kgfOfwSdUsWVTR2ez7yp7/lTUtm/vP+rNbwGXpP1buAdjP4y+UczImALA+k
L32afnQ/s+F4z///DA5+17FPBmDtjjj/xTfhmj9SR4AGvGZz7k2QP9yzSxVBdf8pqhWGxz1UVh6s
svLKc2Scwc/juUkC+59TToIZQ334XjC62/sAxx/wHT/nifC8xDjFMP3wIxCDU10+QMihA1Eys5nt
RP6A7v0b+1vfNj3khGpH/rLr9ndIrJB7HZB8N2UmZo1HV7NAfLLn9CfHQPeXH1uys3p97lWKKMPw
S3hx7vffxKPTn+VCxRe4mjY/cj8wGKTyxT/ROH6HG4n5QYonZ5f/c3Gp8oYpUeKe0n4v361J/+uz
S/dCPHmLHygm9R5glZNe/oR7/Y7K9gWR/M6jzpFSw3p9dO91yoO8iR6EbR6MWrQqAxeKjRtHypWj
FFijWKL0kYqZJGKlauTvi0kelYqN2KOKHcnRv7BOSUlT7h3tbBj2oNalrSFux8o87Aymp//JlK3j
8aHqSkZJs/8hcD/dWv3j4ge7j9lN/7+e5+Sk+T/Q0cT//noc5xieGF5h8dMP3//g7n/avP/Dnuv2
9A1dxaIQHuL3QJ2e6QbOXcPxdeYJ1SmaQNWf/ouz7sC9Ffn1+mLINCV857Sz8aKryH5AKCBf33UX
XYvm9/8p2J/5XoFhX1O/Dly/KsPUTWH/r1XXncb+aDh/3j8K8o/7lU7xT9yRVgORNIeiqtHLcSkD
fnQ9ob/7loqv5yDL+Z72m8dI+J9Lc9mld9xG+pzciivPRufV3Kn7jl6Ua5Xoew2h3Pq5bqXX9UhO
w1G9lJn/RvI+2H+xU9Yvkuyor5e+J9cE9SgfLSCN9R12ZJ8p5qRG4JkDihTmW41sjQdkzZEEfqO4
pDLBGOCWo0eo9T0yqZWU436T7zEvMI+vtgKe0OoDL/Jfws/JkSaXIcsn2pAf5m12vzsAEAatsC/e
JmflfC9nLzJf0E6CJC/5mtFbP+p9yklQ1kiXuFEVQvuVTJC+4JppQZrTb5z19xKnolMz2DmkTUhn
28TlWTkT96yU7A51KTmDLPPPlHdGeZozTz3bXRsM4oaWta3ri9B7v5S82Jq2wX3JT6Vs836XlsPZ
/RJnbASf8tmEoAm/KXmkfT/ZcvGMrZ5JLPNbcZ8tg9hJRykcoeeJ/ObPaXN2EZjE2exPScz+vIFZ
FG156HEIXjwMmePTzfpDQ5/N5of0vdRS/IS+fPPIPm91Epjcu/KvuVWSNwGVYk5Tg58T5TRPi0SM
kAUT4VPRNy5/kH0zOZPfMGamctAu0ynIczxlSOYbCNlresrlam96eo070yebzyymeRIkkAcsnlll
n8Bd5DXe8iLRDUv1xbp+1yx+bLkpYfn8sRH80+czNAf/RDFPUtRNa8OFS3DFBo50yRIPsg/Tn7y8
wOQlygQ/ZMaY4cv4c4DM/PzBlj4PmALFAgmhlpzDH/o+5Pg5v8tmdkmZsLy0Fy+M2eGUw1cvLvMW
WOOH7L6eotYZIgy7lVIzQXKymeVimwy9KkxYafr6I+84/D8F2elyj8I+x5bklyoo90vBtm36DLZd
fzKMplW7fq2b+lyjqXLv36lY5+HOBdlyEv/Q5rRD88/JaYGjXWtaZJNSXJLWutG7VrWtaNMuVrUi
5IGreRKIbUoaYrdHPJn9ACyUweDziQUMoJPIeH/OcPT84SA9D7PQEBDD/B5LDwkwN5FcMNw6h8ww
BRsNrGjb/0xv2H9Dm4FAo2uBcMb/62X0bFOiAxAf9D4Y6H+h5qbyBpfirfYyfffIVpWhMNQ87RS/
cWmxX0iIgw0CJZgDEN2GGcxkxlwyWASBf/wvhgApKE9nZ1MAAIBoCQAAAAAAt5G7CkQAAADXWv6c
Euzi5+fr6+rn4+vo6+rp6ubm6x6l6HhRHOhwJDSZbT+Hn7taU+vgVe2X95fc3ujcfuWd3lrMa99f
H7vx7fknYo9SF0h8HSfOztOb5Qm7x5u9LTfustewHlv2pKaZ3g0fzYPluN+Sajgu2YdaxSBGdqlf
yz/FcTd+5npx9qWbeXKax7n51nj+pB1/Xbi+PxqzZ68nX/fjn5WGZd13ptLsHB6zXSLVCDn5vmyG
ZojN3KyHGM8ug/r41ZylXI666slmZtKGV5luvhn7DVt/LNdWdt4Yj8ebpHvjv+l9d9Glrw4vTH+2
Q6Iv0RH1T5xfp6/DZRv2rkdcyMVFrcYxFq8OHrXoeAsBiiuV1GPY4/tHvbjN4+2qebDuUWgvD+3/
2dLo3X3rS/HU4NGM/fLXesNhw5UMqIh87A7+jh1zrb89Pc/3F+huts14/esbY7cj3Zgv1qbHedrz
Se5xmlfI9u3xj6G9QpsyU/ZE4/5VJy2mjWqWqPhp5GB1E6nJH6JYpWfb2jr/C76kt/3Qrb/9GN/2
v6tPhlo3c9rz0xJO82dts4a3kJ0m4orgrhLCVEfm6Mu0M7VThaZLzJMzh2cO91/ldA2jkdp+edAO
+Xrf/LJ76Nl0mV7VKVm0RY+PuMtkj9iDJB6lWHR96jzoQgil7sx9vi3tp8q6cJpi29s9ePt8+6I/
sWwj3dhfRfymfS+NLEr1vXP7+sue3RKb5uqxd9KrNXd3D+uArlVDx+iGHc5L5IzkhimGeTbuszbD
+nYdZJYpxEz3OFyejxbd+q1i2qy8mcFIJ9HogRZTHqv3pl7Lvu/xLSzNgwbrP/LzvrTbdgvzc/w9
vMsmY5dh9sc0tZ2GS2P8MlllXD7VWYJWbiPe/3cR+q0vt3SdJ/krGv8LtqN5u6uxAz520/FBWsNU
23CL8fvv8c/oYXzXH+17Hicx+/Mmuqow82xUAR6V6HgRE6hwMM27s/fd+YfrdYuP7ky9usu9fTsm
lbcd959x/q7L5WjAU+mnn/D9nbPfXdlvoX+RH3ipHQYXczf0G+u9LebqCsPG8eFJa0lbH/tKd5GL
Xs8azAl7MxLnWb1eVFPlbtfM+Jp6GCNE1Yu0GPMJZsiP1Jj/GOZZVx9Dmfv67GnMkBh/e10cwdji
6RSN+X+xt19tYzhdnfPuaDQf9I21E3lmm4sDQcwkjvKOMVkfjZfC8OaBzXWD3dC48Uv88OB4zGY6
S/7WF9cxs3C2/87wWOtGM5VAvEWVNIyYzX6Y84vVBh6FaLiUQmoMp1BuG/Cl/Y6/ChXcQyj/erT1
XnPzUbvyy6Okdcbenp2NRuc5TurmrfWw02TXvLoevbp7/uZb6w1212zHGss+2Hgsy2a8J0WS/dvy
1+1069/cbZ+crJtNpDN30Qvz2x73zMPgp3rs9NUl+/I33v7pkT3z4a7ztF9s1ivWzGXxKTP/Y5jr
LuF4vUcZpx9ZPdRMfhu5fs2tybDW23dl8ObLDLG5jJKbwq7KW0mM1Oz9ur37SL++SGLmOpvd29M6
a8lbyV6Cp9JbcWSy/k6DmJhZz2pN9Wkqrdlsy3ZspkvaosyyjQEepUhIuzy6az/aQGr7uOmuNmZR
5RW66nJSefl7/PfdVtGel52a9u9ST3q7za9MecvFHV68f3jBrrNu4m5du9r/Iruxq13/q0Er/PPZ
ek6XpO7Oi+2NxPXYcScfXDgIz/G/od9zmcZ7/Rvv/uzXVfH4suUjhvEqTf+URTOXqelaNjHM8Wxe
T1JZpa2R5qNqtEnjXG4dXunX7PDxluFkHi0me5C4/fVmjbdZjNqG3bZKZ/qqN3VbqoRFMfv+zsHZ
xwt165n2K8sZP3vmwSub3cO3ptM334o5aendjN5MTXkQSXVV6IFnlF13e6Q6HqVYy+oECE0Vcsd+
4VeDQ5HAdZd7KO/cqbYLPWeNZoGbzaC15fz8U8Ys3JKXmrH11s7YUw0PzjxxmvNets8Xn2Jd33X8
6JjNqms0j0cPLVsT/yimF7s/rN22NNwPH8Xc+GbTmZurB6n2XMF209LVPKEdtUTHuFsfqe3UcskX
Z7NFPqXH9Cu/k4uH2y/77e+TpLOPt/zIjOkkeXo9RmL9vTBdOF4/hlM4o+Zrrq27kTVUpQ1rpv1i
78w2Wsy4qXJx1eT6OX+qcSVFzK326IG5bfPcbBLlbNecDybpci0pRwtL7623esTsEtcAHqUocakG
CO3kZG7RB+onlBfP8tSF4+zyqpCD+puymDPHf783llx/O3GrLCqPb0wXXhn9e9mWN13bcEx74pKt
4fJwwk1/k3p6UtK3L9yOvbhksqQ8ZHh3YO/arx/2n8t2jo3wvH9pDHvvxlr2f01P+dl4z9fkCw0P
D2+cUk0nNiPvo5fPrXqGOrTpssS0u518916bHMESMuZpTFSGdoQSJ97tQJw40a6ZmUTNJi42TaPQ
aT76Zrdn49n65u/2a5/6KTy0nR3cvPhF8sXVYjaazuKeNk0Tv7inN+eEMKl3vJj/XV2N76YHHqUY
ZekuiJLIu3Oe+jbj9oJDlT8412fVHdy9s9lS307c7IvtRTHnY7+OXraKnD9w56PxBlxb5ptbmu7h
+bLw2+aWcc98Sr9LTKDVMDUC+6uGIavLZ81eHmpMQ84Im+abPI+6VDJL89yUKnnPHFtz7XOi55en
zimG4EumZMzz7j4t0Z6Zef4VXcUMH3cjHFaXXeJQnsHtNIPl+CxGHOsmIbNkXauYLddJjbF320ki
Bj5yFLP0xcP+7npNt9AsDf8wcn7JavHy013r7mocrz/qfllfdI3ge7nj9u45udncPVL+VgcepZhl
NRrQQRDMvI58GJ7r4vThs8KdKpmK6HSFCsGr9TWu5drowz01Vgn1b++bj8X7nvR1tKJm/HDDe52w
uXDCtN1yGPfFu87N6vqWC8s9cNeWwNIXa+5aLvZK8ov5WvwBAy9MSlpaffnITNp4usx3f1VGk177
OntUi3Tfa93azLUpaQ3XU7Ya9q3ObTkOY9TWkGbi/LUuLd00WA0vnLBlDnGqKVthXFe8OdVK88Bb
pnmx08RSH+7S/2xnybYf9wzH5agNP/bNKs4Ju2fe3y+4RzUa340I4c//4+ilJNUT3fJdDyZoNw3i
yS0BHqXYeb8QxQxfCShO7bPeq39hVIdQ1Vn5/j4zkvdNAtXDpqs/L/LDwXHTvXlP+hvTuxItdsb1
YH7RvM2tmw0Sl9wgub6eqs6yZLbecZO217VdOH3015I362OyDFf/CYNdh1iUohsxz3gsmQszvbSp
NV0mJ7URxlL7W5vTp4wQ33lzTLYjfnu1FBrd92I7Y+Iqji9yYUY/w2JUXMnqm3jU154hKXmZjPbP
aHV91Vg1M2yDvNu+zqx1IpH9YZjNWxfCicFx486Sozmw+0Tre0v7j6edxjsJbLrouukt2Sh35tlk
Nj8hpoH8Ev6kWHRRRSA2NViknozjc8Pz9fzBXb0XZLXEr5X2rupyxmW3vZKTSPjOzczrnB7u+gH6
x1fL3fSrMGZi7cRsJBSL321Ts0l3Fe/sQfPF5sKZadk1FkgZ7xK/XbzFJzXt4U+amPPWDvuxW6wZ
vw48+dbKk/vrcXcSmUQM0jfblbHu1rVEFlxpxsMFw9UwbTb0kbVj++gk7N4z4GXi8DHtzThZmpEq
3eimxdVgvg57WPUThhy3VDabLXSM9MYqdNrI+UHbLpnlWdx9+j88HrkrfW1Nd7AIczgpxFwY2JC6
NeIjTVHFw8Zd45p2fAAepRh5CXSJEuE79BauffnX2zv15XqOCl7e9XJZI/Q/9c3NuuXbXq7bObH0
XHf87vwwefQiLRq39kcH1qYbl92V/nkzfvF1Zfdwzp9/r3LX5OH2zy+e7Zmz5ZkQPu4nu92Npt9c
5CbRjTglfRSr4Q/L/ENrv4h+dUtqSNPpY7u8XX2+/6do80Wk4tdSS7sl9XKv7VTJeG9k1nixnkzX
1MgfIYpIzXHfzX3sfUuWevttDoYclwlu3e/FTsiRSP9a8/KX7k2398FGnGA9Zeey2azlsGlYr3e4
cTigTdyfN6OpUVxj2+mK7THeQwL+1Bh5FQOBF+TWLn//YouvydPtVk9ZFTxUuV77TXHsa25f4Tt+
Pt07slzO3mi4cfMuf7gwExvvyqC7jv7GWJ7movL57b23K82vf79/ejAs7/ODo7XN6WTROLNd6Ymz
5XSdEuPV7p/Owf6n6824Pmv2dB1PahpiuWVOkd3dbrAbrMaam2UxxZz4cUwP8dSloUuoj9mwrcG2
JRWWIT2RUbduO20ek8chw4VPejFjcTm2FYsR8+LtOjt+2n7r+UdxJ08upF3Y/17XZfW49X9+fm7L
vCSXZ+0YO82+6sGCuWZIcZmN6ihDHER7jx6FWMsCoWOVhHKbWLu5v88va6/gXY0eT9Lc0y24e1Uw
dNhU/PatGJu0BG4Mp9mo5ao13jRid5U6+/Dp5QdfR+LODtZi1yL5uBGNTcC10UjkTDMntxYXUzON
tO2tRvbT75plMUaXPlnDvmTWfLP1aRu9qNuUPGxHzqUXK1vemi3L5fH/1Havh718j71WkxYZWstu
jCPagY7lYzHn8nkZJfNnU/2eDj17muetBeONOS4tmNfJJNXJVY8Z9VhtNnf+StxVOw9q3IsPdMDR
5vrB6btrtovk4mgnbTqdx0zz5nSbohHfjPZ61bEFUh6lOPrqXAXijkA0cbueIjyq6rMs5ktzVyhv
ZyfobKYPnjkmvFwffuLsT48NtxeMZbxx7m7SYg4GTbn8N4ZLmjbSHsSw2/ZCdFrHrX15jFcPXhvN
xBovTzVaW+flx7fM1obP87Xxe/WRy3Ycr/zrb+vDkYT92D934ueHBmU9xJ2WA1xf5P6mIW36KtIX
a/EbPh9XXacsRtrLHWlhOHGaOs9qrFa3d20l0vSwuX+sziLjqK3abadOi3k82802R8sP3l0w+m+P
mXxz9e649rFYr7z6ZH218zerhPa9pXZTxXS3twO1e9AZHqVouBldlCAuV2oz0LebHCjXlnt7V6Pp
j4yerovX2rvzuvvP3AqDDu5fn7kTk1Zv37qsR03tWxwjzeHLzw9HFpIMnHL/l6WtNcvv1etqfP71
l+Ywx7U4/4t+aQZZ6tUyt1Vlo9n+EEzZslfokKZ9vIvN22uvQQwzY+s6dHkNTYhJVyITv9TU2Yb0
RycSVp358Zg6Jr50Wa+uboTG/2+m9tRcKsdIw5RmmM4Wv/VwXj3k2bJ97sK+zJbrxkWxyXpgORwe
H0rcmfUS37ywO2ixPO5bMOzmgwiW4quXuUvPCpO+jWpuRgUepVh0qQTooiCUuVsMDwfPp8LNqJvI
SbeXB39hzJeTjStLmcv8enbbubSv+oZTy7fXD0PZLTt5eifO7fenlr5lhlC1+gV/s2SNtGnXb7P2
6vGktstYL4k2b64Xg5pcHGPl0OG8n9udhjGbj6dwzGEtnTxe5l+3y/nn5fj5N62i9/32et6iyZzq
mIn7jWyhE8JXSPzW+vnzZfY5eUui1CYjLg+Pls+55rfM3Vwbe439PFI1ro3sxtu615KeZLRNvybP
l7UPvKq7Zwenu9OdXZzfdWn3+6ePbx9W2xFDWJ7/2xyavZ3AYPKpV3ooT2dnUwAAgIwJAAAAAAC3
kbsKRQAAADjc3wgS5ebj6uvk6e3p5Ort6ebk5enlHpUYdVkMhCIsK3PTs8qn6fEjNzfTdeoOXh4h
oTSoC83Y5upeEdsX9SwL3xqvkn1le9EeDbZd9Nry8ORRZPYg9fSC9cD0l/7R5rEly7X6pp0416rf
ds6cJODOh1mM3knV87OOJpnN3jPV6LuP6EbTdklgstJQ4qcEu3n6XLbab07ML3ozMjkN6WYMOs/b
1XlgtdGMvzpLOajJ5GSl5fNafIXFppFphLf03jM8NLbyOZXH1YquD61ljIMlt/X9Rr2Ll/2nt3mr
ZPT4vo4uexq/L9+sKfxo9c2YVHDPU8xqd8bGGO1LBh61aLQVDagmchJ3dh/36WXhledp1Lx7Fjy4
jwaoW2/+UqxhH9dv9Vbvvw0SXbDxmNh4tXST61wfvHWJ7cvtR5HYw8W3tS+/1aGv5378tWf21eY3
Y0DI1rf7JvNNs6+VyXC2TtOpqizm/L2lmaupYS5/zOl1+fE4n6RtJ/Vx0m3uyUvjhlnjw+6051rT
sXCmNDFWa357S8/2vA3pkH0Hi92vjvP7N5+uEdvr8zjasNwODdctdOP3bkh4noZTMMLzPnYNaxFZ
7WtfmjHaxx/vfBYLRxfS5IlWpi4ptU9YWghiHui93Y4FHmXoeB0hdJHMTW0qKB4pbvlBV3eVl4dK
Xr/jz3fonz2bPHFbw+ufnPDnxjt7y3EsDeztbE02Z/vYE7PbIyttpu/9NSI1e3467tNhefLpYGNm
IiViGwYdBjsur03W8fGwWsJF8nXYz2hoi6/9Zkw71dZNPEPV8dw/afXvWl9zNeLlgKb11spaaEV0
lqlvVo3kNr8MI9K3dKGbQ5PJOJVhVs+fpaXpymxG1vi69fV5nPanoua/x/+7r10+TsiqUfc7o5M4
Pe4G9qKflT4BY1/WV7o/mMT0d0qwy+W97Ed6wzj6fg8ehRhooRzokJK76eLNKEM8RfFaLXRw967v
8/6LizZM26qLdge92xex6RYvXD9cj7NPa7Cn2jZ6T47GRNNv0nnriWvK1nQLw9FkTjw5y2WH/r/9
cnq7zowjM9pHYklGSyrxoOThm/FbcrRqq5fGp7P5mGF6f36YUn/8MPuPkG/vR3to1tS0TkP4dZ40
fTL7+D4ifhy/62n3vvlxxVriSTokc8ybES22Xwdrsj+gLAvD3LMp96PycycISbU040tfXFeOXRzX
BzzKnev2BfZ8fCcaO/2unpmFNvt5cny8smhguLlPtS3mtmmSngAepWjQwkENmkhi33/n6o7XfpjV
7T6YoAq+p0v6ey93XzYtmv5k8FIg2qJQUS7Lo+YCvdzgY8Fta63L2qgv3BAb67PT99NzdYpxtc9H
1xuOD9w3b8HcFjPjZin9XTHTMkm0Oj26TBltmrXulk2fFvdk5BQxzDDxN1bGdN0lu55jkxz2cYLR
2N1jRTupYFbLGalLJtY5Ny8243ndq1/K1KV3fYnb1/4Eda3Duusco2lc1rOL58/TlE8ee+/Pq72N
htz4+T5d6A5+cvM2S9QnN+x9otm0k2+rFo2+LJ082ftoxBC59ea7lbPdRN8AHpUYeUFRCXLj3B1M
8fXxkWcHVVF3R3sF79qrKx0Jd+h+o+iTF69aFm9cqTunJ8bm2W/ZpF1cvzv99mCTrr/ZzHVv+ygy
6dPV447r7O4TvYjoSJusj7VOqCGV/F7x/Gc6x32w/XUSw5z2yQ5n9+ZB71rS+/fl+i0eWePp/LYb
j0mYCH/iyLm2MmZbG8stfY3c9SE8RA4aeNe6duz7XBT6fWTXLTBuhC57W2xnOSZcrJNNiIZ1tnxT
FxW19B9311Y3eDztkm7bqMb6ODfuHMQsNdr5oDYnm0h2yWel2VCSKTRj73EBHqU4xaJPtOn8JpG5
J8O0ZY/v2csR9TnDtgf3rnXKv+/mG6c8dTbWHTXKycWJl5lsOXVk9NYzjXSHj+zG7tcmJ+cTOxud
tV57aKu1gU005HkYEH3XZBueu1yPN+GwDDfOI7/4HPXZYx+bv23XyT/Oo+fHy0/Pzw9GtJUQsbQH
W+K7Bj4/GM5tepPN34a39famGS7Vw7JZkrR65pPX7dlY2lurNH58GDK/NbaZJrlwHEFT9+nXbDvs
0z2enE1jupHorhEKVx+cWFmnsYbRRuo+NmYyv7brbhydawdvEDSaVCMP1lbCxCKlg6EelVj7rANU
uMjk7qUuPTeNHB4N/VA46Xb3rj2cPmJ9b9/80Rfj3to5svyOYps35XSN3GYT3Vj7yy2LNi5Y7v4X
3Ydx4p5WrYuaS9fdYQNrTOyTMRfVjK29REr3ro3UxznU1PlcbS1vjLqAEZNX46Hpvt1UshJ3m47t
MbJ7i1M04sjdnCq3h6Dzhy9/z8/jYtZw/SQ/Jb2O/8bbR7foZbLU75FXfFxbxxzp5z3/XTGc89as
++FyXL3fd08yRoyxp/7OaW3jm7X95FTMfP0vj8VbDbZMZ2sTd/7Rhdb3GaVzrf3t+DBG+kayqWV2
dQAepRhlWYMCLXBx5k6mm5Ln85VLC5cjo729vMv/30tmlGzPi9XG4S+CcVf8T25c1Xul4nYiCc43
idf+2u5r6+o1j9eZcuWlGS+n0cr/2I9gjX4wrpduw1najS3NXjSH9q3mqkbHxE4yQJp/eJcvH/vr
PtkOS7w6eteZ8Lj6nvpu7X/D2X7jIHE3v3B9Z4xJ6dOUueCJVfxzZsIcY7xcG7W2zQyjN7PVjjk3
bfdwDJ+Gf3yrKfu6asyZBJcq+4T3jzem6Ur30HhztfeifzogOV6M3FV3y5Nydb9tYrUehWTxYm4x
bxStCcu0Bv7EGHWG8Yq00dTddgrDqayuq4eDg2j34MHz15uUFDG1ZrPqsq7afjA4emaRsR6X6/rO
vH/VF0tz7ajuLv7O7TWn+Rrdf8ksdkoraZ2VH7Hwd7b/zv0YrmuEZmriy1ediOn+x69oCWEyHp6n
exj+y69TIz2l72qzjxbIwz1rWZmyz+fk8onlWM7fcw0bacNuQjmXOiaS39w2/mhJDzLCr63nZc+3
Sh/VRiv7MvV9e87pmk4PiWGv9v/x5/E/f6Z0j+x98PHkMCcurK8vpKZ21y7Syb/8NCpiNSeOtqFE
msdwUP0tAB51WHQZjSZKwrk7Ynp+nuL8PdPjuXXxoDu4R7Gug+o2eXTI74x+jm/Xsz0i9VEHT27/
E6dzevauDyf50N7bovW6+fXyeVUeTjie7sEp+yZTb7FNezyf6sSeZN/epx1XvzXylF76WJrGpCxo
nMGzmjdX8W+kbGvFj8e7W7tkrRoGA79Mbvm5k4y/oJ2yb9NGPYu/ufCc9q/5df7weprCyN+zuTUp
d9Pe/R1zCWUrb+lJtGuiTx3rZubux5hEzufVsd+P24WkcwjL6OrLx2/Xbcl29/sbA2US4pxV49jq
4f6H6KnbS20T3wJdAR6V2Mm6npiq/iCSu3H/wvn5vlpFPaLQIYTqCl8Za+35+/5Tv61uvdRmqWn3
eHP7Xs+nS9gTnJ0tHPUPD38jbkuzE94Ku8l08wVN5gXrLOSXuWa+zV/NcX3KTFrof3VTmQ+n7WZn
+JQxcL6+9GnLcLWsZPLO+HR8cXT6a8cm1P4HNvOF9egia8kVR+Y6DcMZprBnduKpxcx+HtsXezzX
lFEnzdpwKuH4NMwODqZAGT3fkq1C8qzJNhncjLgqeuPqvITRbLjlxlLLo6N7Lb/9QndHOx/P+fyj
22vfoLKPuWRWY0JU3NC5fEvE9MBdFx6l2OgUAgjFUzB3k30zFW8vF97XcTzV3e7ewbIVtIdhNqfq
6sNXQ3VXzzh8YmM5P7UtGbsZ3or7danDzm5OSPdqXZhL3GmsMT3f2DNT6y3Tul87fUASw25fiJAu
5XVz0fnm6jrt1YtzR8025LWkxeXXfnrbhovvFX/b0IxjXcaPR5qOhj7ibnr8bHOq7p75zxfdxFRu
mc/xvN28e6bHEsk9UtbbB5CV8eIXp5d16dFPphXqlrl18vAqIsbO4rr5sDX2n22TzqY5XQ1eeuEH
ZqM73recvm5mtWAdqlP7ZqmjuYpC8Za5TPN9HpWYeR0EgqgRMlulslHb4Svu5d611N3daU1l/fmV
dmfJda54B/t/8myDuyO7b8L8Oq69Fx5EY1t3v9KI0+98++FX6kssLZanV3wXyy5GeltNcXqu1ps6
X/tl8zl70cxcutttJu9LOzjNKMfqfjJpW3PNiAjNPqy7Xc5hfMUVqltZ5fy5Vk/UKrp92y3mkFG2
FtP3s6u9v9szQ2ai337E7UwaPiSsuhKXPt42plo7x9nIOHB9Idp5sx/iRRzzq+HDZxo1zmlDsukn
b1kPtM4vTHfTL9d65mSyqu8cJqF7n8Pk03Cp2yYetdh5/16Bbk+kT1K3iLfxqfDo8mmonmIHD+3e
Zf/fZ+8KruynlrMT+zqz55TGpq/dxJeluz2tjbj8nv7/tWTmX8ffTf/nR+DXN7VKwohYqqOSl0jL
/kS6yJAtDqNLZXi/xfebhibHpAywzsRIizgx9okvZHStq2ZyeeuBq0fdvsUlMe9vbZ3E8CaGNzH/
nEZ2WyYvHefTY7vsw9lOkdlSL2OZysis1CWPz5JpLjPbqf9qafS1hPF1j7l9b67SnSLvr2+7MDvs
uUYHrkLqlukvtG2uDaaafSfli5aF8VvYuhCvo84etehoKx1a761bpB49fu2n317Mw/m+i5mT72hv
967dtfDX9O9wx9LV9Rdsfyy7zt+8vPKZL/MwyWhskuftj6dSN+e95oBi3Dh/1Jzsa6dsPpAyiPPA
3CrNvP19PJ08tkBq45yGk4S4SkWnnYNkZ/2LaVrKk7PzxZq2tJOPrp1V22KKkXr36Zucnlwvs7We
b6cgY/mcf02avAaM7fTWpW+G18Wjee3vS+t1R1ZfZTHHYfvhKMYTR8ZiOZ1jyYlMrm/bevh4XLt6
a/mrjZywxFx2X/L8yNhHq5swRpMaNl+6lJR9csNwHsUYaFUpBUJA6l6nt8qZQ+XDl/ssUkQShC7v
mvW1t9nq9XimSUd625Mihscy/iPV83678uzNN9YGVlnk2vjSPw46s9KR0bwy07RpXZ0Tj9vHZr2e
vng413nYLs/hnLWMGzEyTY8uk9paJC9eL2avhrk1742v6+6mGxA3dfd0XZvDh31Gjt5WR5r7Go1M
8+HWm490sn2FwyW7ZO41K3KEPvrks5rPPju2x5tWMPzky6nvdyzjY7IZd5UjPas2tq/PvBlNs0bn
db5p7dWro3SeXD18u6brdjtmt1eTEzejE2PXuGvSxHR5rAIedQiobgNoSbph+9gX2QW1tdrbq2te
Fmnv69z6KJdkj44/h7+fknPhtV+b3IxfB7yO263a2F6zw5aYEhLPWo/inR/n5cZ0rRmnN9aJtcTa
7e7Nel4n23UV2iE+ZTbr164jU/+Yeq2CLjQfzs82x3ZtPXqtw4vb3WAeFdd8MexijWzjPD6J/v1I
bOPtfVw9pv/aiRjkPZMjvxMVfVUiV1MWepLBhy45hBovj1KxHW7aGXa+DryO/8XKNPKnbDaGnCZK
5PTe31yNty5pJ7qBUxZOOVg4M7URtx4ljL19lB5TCLNtuDgAT2dnUwAAaWAAAAAAAAD0KgAlEgIA
ANYdJqoY////LxcJCQkJCQn/////////////////fz8aVHij4bHAPlayWV7iAk4fIOFvxhIxy+I3
xfIPwAn4AfGPrcJE+mrH1S7+M1DXhCb3pXeond9+fPfwohSdkhDrQO9he3wcenH4Gz9r18D4HR8D
4HyOD0fc9H0PidtPT9DweROT8HxKfw6fniez9XzeTl/Rwfk9oL7fZl4PoBydHBokPucnRr5P2eDk
/xT5nzOhPiejo5Ew+h4fmJ5PJ+bUPiBydHs0/h4IdnxNE/BAOgOjyfU9HxOj5A+TBKQ+QHR6PqcH
R8D6Hkp5A+J2U9kUw8HAVPJpT9GkPoQ9mHwECmGHg6ODk7Oz4vk5lOCPzns+B9Do+Z8TwQ9HxPJ9
AOj0fs5E+AnxPJTyYeD9GgeSI4cEOBicnQnk7JMPBDsC6AfAgAdONE7dIdFIxh0Q04KB7EpDxQA/
DzuBttsC/ZAAAAAYLwAAdPWyR0d8QAABDTDlC8AABCpC3C2MM8OUOwCsnnEAesM4JAEL8NMmRAEO
8LkMsNMNvpAwAehCnC9D1DFC7C5DEAIZoYYXoZ4eYZOAAAQ0Qzw0ACHKGSGGFiGmGMAACGeFR2F2
GMDwsegdtDRCzDNx4hhhlAEMkKwAh5huh6hbhphhhzRDlCzDlCrCnCmCIVzThWhXhYhY9YU4Z4WH
Xz0ABDM7DTCzCyMLgwowtQpgCFOHSEmFiF+F4EQ2Q0g4APgBhZBAKAELMM0K4MhxGGiGgGwyAGGC
HcSg6FWGeFyGKGOFiGyFeFSHqFqFUFwUUjDjC3Du6AHv1hTGF8YVxhXhUh0hnGGKFgYUgVDHDPDJ
DDDtC+CIX4ZALDDDVDQDYbgbCvDdDmAIWwLC+DQIDYW4WwdDFDw+IhvhohbGGeFmFQGAwCw3Owrw
7QyQtwyQo+IbP2HA8PowLo0bdSZnZdIx9KatwGAcHMVS0jblmKV97zOVn7bOVN2HLEdrZ5l2/eaG
ya3Kl5v95skct7Ta9HU6kTm73m97y+0cqTcTvl+OrM66kFZHfJfEmokmYizVy9EDTDqfGDa2S0Gs
kPljLVPmaVDCfBa4z0zKpoC4DybXtYbsoIXS+GqlF40jV8hzWn0qa+RweuB/P2n34Bj8G1+646Pm
TwiFeHUOLcnEAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/defuveAAAH8/
defuveAAAH8/Gi6ysT3zrx9/CVz81+zrKxPe9+PudTx9+U+zv7ek+tfH5yzg+ic7+Mrk47xx1rjv
HHW+vXl1+E9k47xx1rjvHHW+vXl1+Bo/HUfgivhfgNvrvzo+fr8Z98D8Mx8D8FgSEwavaHwvSVN4
hnHSYdhwymrpFp8wJzWvpnz7hSXzd4fxosdfBNV4SfMsivanwt/HXLTD4iy8MtFcooFosvC5XbSQ
76ZYci+A/Hg8DVL8GHr6jA556Wc8dc58LzymcwvPPR54ZXE4Vf0KPLX0z59wpL5u8HOix18E1XhJ
8ztXtT4W/jr2e75vjOwvm+Mw28w7HV1OFe1e0/Gq9rVMXtXtOfLh7MV+BTs8EPMqc6HSzfd55555
55555555e8WvQ9q9q9q9q9q9q9q9vWKfE7V7V7U8i9qex7V7V7V7fpHVueb5PEVf1fN85Pnzt+d5
vPPPPPPPx550OUgcpA7vd8teUfheXtOkznnnnnGJ9kZjA8xPTPYqchQ5FTkVJPLt7vk05F+F5e06
555555xn5RmOeYnpneFO1e1e1eG6nueb5vl95V7V7PCfQrXnnpZzIoo8K6vw550OUgcpA7vd8teU
fheXtOkznnnnnGJ9kZjA8xPTPYqchQ5FTkVJPLt7vk05F+F5e06555555xn5RmOeYnpneFO1e1e1
eG6nueb5vl95V7V7PCfQrXnnpZzIoo8K6vgZGUPr8AxgAEfEH4hYgOHd1fuX/YCDzZXbndtrAAAI
Dh9fn3zfZvHj749x+8b7q16+v/2//utfrfd60RYBYp+q9V19fim5X16TE/qq1bbbtbbbbbbbW2zu
V++9X6z7xebzXj9q9VX+1f+Xff7rr9vr1Xr/3a9d9f9+uqbbbbGrfq3rVW5X7Qv3b///y2/32dft
16773Vfe9at04Fd+/6tX6v1fedw++z98L/TVy3+2v+7dra22qttnr373r6Ech6VwjJxMUEOsdY5A
DxDlHKOUcwI3jx50EASEB//3Aw2mkIcNK+R/9P6FyjkHL98ggJUVeP3wgf/iP7i4IH/yBj0rISh/
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
Qb1ZQ25+9HbYoNBjXhQW1Qd5VHJ0pN1QoHN6qU3yYl2NFuiNFxL1L/NpK7VDwKQpybO/VTlQ1DTz
Z7dR6dUKUuNE97zdBStvUqRsQONzXz+FFbybGlRsQLKoKkqi/lO+0pUlK9Q1fUOx1UCkOUJtgwNz
R7Q3/JA56lD0FOhS41U2nCg6gtttTqqrQ1qbtGKSQFBt7bvs3b0VKdPKjaKc8qKbdl/VNVIGgBoj
uortNBvKaCTZTaJlBU5UGxVooPyvfepW3loXmRBjQ3t20p93CircgxTjfTz4KKSlKjKrca6FR0M/
fsw3NLneK06dQiQvnLsotTvKinovKjRpzd3Qq06htAUoordtFUbVI3T40i+KyQVJO+NFIcbqs77m
6FAr5TuXvSotLyBRuqQpQVagquVU7NrZUaApUpJoQYpVsu1cKooNChSVRtBQXClVBSvao6olzjTu
g2mqgeaW+bXtTVAFClTq1qKKKGqLLlUOzQ3tTTeIKqVqKjNp3mgpNKiCpWxqqtoKL5gKOmUI2VZy
hU/W6ou1FTnOqN6j2KV3qCoJUJVVTobz43oM625UtJoKRkqrfaTZvUZR9t9DfJN/zodplLN9Cr6o
Qb5UVUoGkpFsqFWrarVQSp3zjUgk08KDQIGyVWucbKl3QfSpUkFO7Vq9sVkrNSpmnehSbG8bOQDZ
SaaMmio1ac7q0fu7VqBA1lE1LKSC6sKZKKqSk2UaG9XFNlPFEVF1zKSlFuKcKLaGgo4pEoelUxRw
53dBz6SCnvToVEgoUrcmUS2tRTFQUdF3lNYgaikKVFBUNGnVWbIN2toptzRUVVNlRy3qv6iqoSp0
cKCf3qLtKm01U1qb9/m+sh6OdsOf71rYALZJ9udotnnhdrq9l6C5804vcj8bWjCYVQG2r+gQR2pj
+XzuJ1JoLu+0eXMtLanlCTk9rZgr+d2nnN/7kaKi8miNPcNr3sNb/isu9vjr2fdDal/yhzm+/dr3
dgKWe47+PvcZJMU3e+EN5l732U/UkHO/vzeugFi8m8o4tKE99pfPedPvFNhzl/P9hsHhvO5K53OD
577e7n07l1+DKqAoplJ6WyrBxGgmnwUJSnjYge60Xa0eDHezYr+k8/e1vSj7iYtxsnxhk7Lnq8dQ
dnYWRffLk9PLsT/m+s7X3r1u/lrYLFsk8E7vZ54Xxen3bEFz5F7mZONrPQndJA3MmIEEVKY/l87i
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
3frJzg7liVAUg39DiCAQTiL563fLINm2e7/Id3/rUKdOoN2DMQczfdpQoV2hm+W/5LYZnOVRRQNj
crh1mGCmbf62TQb518vaAftJkesLZ6y9oFN9+4gVApXaHitRM1C9p1T2o26+93o8kglwK5fe+0sg
pNNEiMuvxSWyJDdKssJIL69Oly7lt9KfWr2toQeogp08Uye6tQZNS87jAiZcScezslFPZ2dTAAH/
//////////QqACUbAgAAt9DfDBH//////////////////////2o3CnVY/bOSovZKg0NvfbGingvJ
Wq2MzQ0bFIN+1BBGV3u0QaMblGxTPpVQc91fGaOU+jzlRVTDzKk0flBuJ0Cq2rqsuqzV1V4+Rcyi
VA+tWUHdxc3Q3hqCcoKC41QVZHFV180eqs61Wsqpnzo56rPWLKuq3KruR3nNl88wnE761U0boM3Q
GVAsqu0fR0HZnOYx7qDGZrZjHO6rqjjugq0yiqpyapNVYPdVMM787VV/qbm1U6MqqRLw/PV04ulT
VdqMjiqKtPVTo+XHVlW1XKrlAjmqyg5zGqeroMq6qmFViI3PFVZw1TEerZ6hi1VYoLztlVOqttOL
OlRVYqDb5uxjW6r1VM85qrtVMzxxVfVh44s6Ht5QntvmNzbjqtVZ2itWZ77duagupNVTiK46rlRq
KLtvmqt2agMap7qo7Lm01QXFzVfu9G2qDMtKg5qDD3U1bVtXVZz77OKqyfrUVU1ugxUCNQVU48id
BVTA5qrV9MM1VZMjOKrOe26r9VOKvqu3hkagiq6pdWrnnbjjq+Jx87q+q0cVVYLMqr2XF2qplVTv
R8PVaT7xn56qRTc9VOrN0q7tUx1dQO75olzVU2tHNVsdRQUBufFU5Qd6rNV4xlVT6r3HVY5r5vcv
ndVN7w3Nz1U5uoj61elV1X1cdOgMe8ju06tNFHQXVdq89VOutB1qKjpVTOqlHpQZQUHPQPnqsUDq
p8eqnVXVbFVaqp1VTLO1Vypqtc9VO6qUM58qp1VtWVcujb71FRFfObR010qbPUVJtOrG4nkXQ8dB
VaqasqpDqp3VvXrzJmiPkfNHVdNlBUUPPz1U0qphVTKq0Z1GVUgqqyZ89BQKg7qq3HV1BVTqpq55
FVtVuqmLqsUFxUEfeq90q2q9Vb06CoyqxVbNl2aPtVf1d4qtzqepdXR1fU1XaqbVWarho+mXQRUB
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
qM5ueouPG4reENxN++zGdd9zRVZKjHugoarvPUtJGq7Nc5utV03TTfmR8+uaqyftzXQnw0aoajnq
tR1XHzVW+5+BNnvm2ojxxZfU9BRO4+zNeW96iVXR97qsR1DNUVNBHV9BFVfjqpnVfNQUFAzxRZUm
zV0HXnqsPnRppdKtNV2VB3QVHPzUGZ7FzVHa6uiPjj3WqsVfHVj3Vlmj5z1NVrKqcLmcR1rDxnx3
RRxVFAjR87PVl83eqxZS1zqq641QK9rq8yYquVUw5qsupygzc1lq4prVWVJqsurI3V1V09XgmjxV
WqgiP1IL+ZiNZ1oKtq51WTH9qyO6rLyKpqphUKgdXVFVO+arKiq3dBlX1XIj5FV8WOp5j1FXxXzn
cVBVcoD0N0GlVtV980S60EdBzVU6qu0DWVOZFQc1VrKrNV/KsijNfXuuluqmB+lV056rOd48jugd
BVTvmcdVOIj1Bqr/NVTCqntXVU5qtUHNzOraip7VbzZU2aqmCMkqEzqyqzz8xz1FRq6HZ3VeqKjr
VtSzcx6iqzVTF1fVaoOY5qrmOqy+99KCPI2o6uqp5QVXMqp7Vduqx1u6GoqzIroKDvVZ5u9R3jqu
UDqyg5ql1UxoTM6eYzM9BFqJRVWbq09RFUVWXlAbHdWbqKrEft9OmHq3oaq7VThXVc6Xz0FRG9VX
HaquVU1j681XVXO9V9xdIsV1OG71ZQndBnd0ER7vmq6YqaHOtRfNVYqT3dVheRUBqCpq2oq6Kpyz
1bzVUxqs1WDuOO+aqzMOPmj5qC1kdTUJvnNVvMeqnEVV3neLtzmurz3VvPHauLKrVt3Fz0FV2475
+tVMOfF27ZVePVTCq9VsVRzRVUyiqF1iqpi4+fmPHGqmqnFS+lTVfPdBVaPEfmjqp2eqnMXVVWak
9WRVbZuczq+q1VYurOaK7quXQGqarO3QaoIuY/NUVZzR81AarutW9Oaq0eq9FVeqarN83Nz4fKDK
DVVOYqCLrlWZVTygqI+er7joKu5sq+qxFU65u9XVZHUGqv1Ug81BEsq49X1ZU5EaI13Efmq6M0XN
QfzUVFWdo3lTU865j3VlXR0L56k1RVZq7vzz1VnnoKsqKqcZkbqtVPPUuoiNUVbzc0VXRRVfzrmq
6LmqsRVPPFzVZQVbVzVRQVXqqf0EccdViqmB8VV+q7lV6Oq/VjvIjOdqwyj95oqB9ardnNFVtVND
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
jznVydaOO+58ypeGuOzKct3o/Wos0WR1WYyt0HeqyfrcdVypygoJjzDUMx3iqxc8ZzPKh5aWLMVq
qw7vObnzmjqtRcx6tq9cx/MquGEclB1uPsXvmw1Xc+VGZH0NVfoI6uoKrEZlQJvtUH6OgvdFZu/P
GzxRVUwnDx9olHFQUKZupqA2dCmVY6mKgzKjn9uZyq7zVZVYi56rmdannqarEkSquVbfNji56Gqn
1V2ocTuKpvDkqqd8/NV5jc5uaPn56nmNVtV2OgPfaKq7wYPzc9VOarJ5y6i++RZG6uvKrHNVYwzk
fNVlWc+VWbqyr6rNm6VXrjOqmrqv56uqp2R53VfqefoapPU9I6vqp9z1ac2Gqpia4zR1EVVo/NVT
1pXUZVvQ2RxVXD1afM1V1WI5z1bl1ZQPrVTOo5+fqaWKq/UVWqrtBzXFHUOro6rFV2rKjs1V1Vqq
9dq6qYxxPD5QZdX83NU1NXx76c2Vc8qsNxHEUXNVejoD3UxTkcccdtc5oqrF8+VWaviSq0+qCrLy
PDqriyqaBUNVJF1U4M6u5riMZ1aoqm7qpvfNz1W6nLqyrtnVV2M3OeKo5ufOdnqaqYHq+OOr3V9W
PR46i+/WKNGugtPIqmLpUrNnoK+u9VOqvfTL7Lnqaqec+VNTzVXcPRVbVlRdVurKqZdKsii5rqO3
NzVbVaqcvnPVTmrIo4o6vPF1qu1Wo8s1TVcPU81B0j3VcnOc0UTyqmPPVmUHNzVfHVl1Xqsq+NVf
QFzkO9XROJTV6jqM5ubnurqCqytVLcUVVnKnBkVRVTKraqac5+tRVy6VU4qv1fz1Xavq2PMdVzOe
qlV1FVMj1Y8591WHzc9TVds05pRTtXxTziqv1Xz5zc9WKqxV9VM+rqp3VtBQVWKvi541PR1KqpzQ
VFBlNVTGOqmFX77tx89B1qu81BVtTVTSqmtVyqnlXVZVcPVTCqyqqcvKqaVG6rlBVcNVTDniqpxF
VZqyKgq+qmPPQK6qcHi56uqzDZH2qtxm6aj5qv7dsq+gWVFV+pquVcsx0FBHVYq6q46v61NVrn56
t6z1VKNWVFVOKqeUNBzVU4iqKrlXUNVigqarl1W6k26sqp0erz1XEqioVXmupdDV5zVMWRGN0qp5
VTvdV6odVIF1fnNdXx5z1XaC6r/TtQVUxiqpzd81XUGRSYaq5HQVKq2goOa246qdx0FBU1U4qaCK
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
p2ccR+xn27apMVfmGZRx1KvLaPtVce2Z8/M5O1Isul5oro80s+5kVIdPcdJ3NR9HJIbsQc5z4rcX
Z3famqEcU3NjkcVqg6eavDo9326aV0EuRnvyLDG64+h+l1dfaI/ToaO7Nzc/TdWXt+453pfNeX1u
W0e+tA2Z9L7UG1EzdNZH2oM6aqakxjuk1QR7dA7pN6dBdBcbu1m3EbXSqwrq6j8w8XfM0+lA6O3H
G7ioKGg1QX1vvfPzGPH2M+z0snK9RGMyjjqby8u8j33q67ZqDnqLk7pXLzRX7j0s0bIqQ+8azKuj
beOqmPvNV2j1XWKrkvP0oaGPmPVTnvQVFBVTC+fKqYc1V6rjLfjqufKtqtRRRZV3sXNVTOziqncx
FZ6qYVL5pw9VMeaKq7HEaqxUZMeOcq/yqzHVYi61XPHlBVxnLHFzZzx1Z64qnnaqu83nM3kXNV8e
ojnUR9KJVW1HGc56rdX41FVh6g1VMTXdVw7dDQxGvOx1G6rqqu+VXKnmznqw9Xuq1U1NVMz4c+6m
o9qp0o47q6rubKDnq6q7Vbqt1bVcqamrDx1Z2qyrKmpq66uuqmHm4o7t3cZ/HaVXVejc91U9yqwz
VU95jVdHnPVdqtVHN2qTVW6uqss68e7qpQVVnD1HQ1V5VWMqvKrKsod55lVPMqatqpx0oollTznv
mqyM6qesxVZs8cVRVeqvUPSrr56jm1zW7u7uYdz7jvy6rNW1U6qp5pOeqs1UxqtVXannqsuOrI+n
N23Vequ1fVYqs1XPIqqRIqrtV3nqaqa3HeVbUVU+PVT+q26rtVyq1GerKvPzOhjN7V0085j1eqqd
ZULNrXNVcq3vU1ZFvVV277Z2qavoUj1ZcS5lRqcOj1Xak9WUF1Wqrhqqcny6uqs1Uxq+i9N1qudq
vyKq5VtVMzXqrquuJVWjrdXRx0V0HPHznNz1WKHKGLnqbqvVUwqpjzVFV6r6vqasiNVYqT5Umm75
qE8fNh7tuPnjju71caWUCjepzNM5zGyqnNVznyoqyqnVVOHHzc9XXFzRVWKuvnqHfPR81Vs9TcVV
49XxVU7qp7Vbqbi7darlTuoiNVTjnMaqnBqCqmFV/O9VzmyOq9VTGKqxzZHVcqakxo6rp6qe7qKj
KrlV+zp81X5QVK5qqRaqQ9VEdVOJznqHUXVSFeavR4jTOXuqkHKLaiqyKq3FFVimJ1x7mMqtu7w0
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
1aeqmNnqyoOzHqOararnPIjcyz4jxRc9Vivz1HTn3FQVU5NS1MVzHeo7rpUVXKuqyLdTU83PzVGH
rfUt3nc9RUVU7oOagq6rKrWVdd5QUEaqtVY+Y6PFUR0FBVTqo51O85zc8UZr7XfNHz1FxnqsZVc5
nhufDnyq4fniq/mPOmN0xc8eVNT5QKq7V3NFlVmq4bKnLqI4qrVTVbVBVTHD1ZHVtTVcqsc8fNVp
zZE1UHjqt5UVUwoIjZZ7q2rI+erqi6reVKkqvXVkUaqpmareiqyr+arubKr+VZFcfOa444tbqp++
tVILK1U+qpLlj0eOPm56rOO6PmquPPuc/NVtVvnquRN1FXVWzTrur6ruUGTFW89tc9BUM5sqc5jZ
V1WR5caqsRXVxqriZ6rl1NVmrKrUdn7qrI8NGaK28R8s0Ud1bQVHPQc3Pzc9muK8vKqYc2VEVTV7
oERvmoAWoNf32yji6GboMquajOe+ZX8NvN3lXZVdugnu3Nql6VXLN66CpPQXV181WnXMroDxGq6O
dqDmj13zDRmNUxY6vXNQXU1dd/PnPzOt80XoO9XWagyooDRcy7GraoOaq5U89XxKq7dBFQc+Rupq
5ZQGs0xdW86u8dVm6CLnug5+fmqu3F5Ej9uzoDxnijoMjoOx6mgXWqxzVN1ZHUc1TFzUDd80XP2f
RHiiPz91ktvt8vu8PFzV6rL1V9p1Xo7u6tquRUPW+1BZ+ZUGqiq7QVU0qsxn30erNz7uSqxU1Wqt
XO3zaoPwvmoG+/4RZR81fqZ0GVXaPnw5z82drkN2zdohV2VXrcWu1R27PtX61XbN7dBUxu6uuoqs
R5zI9BHEar452oOaPV0GYY5oquUcWOOq4uagvnq67+fKmodb5oUFBQVec1BQZUUBoubOxq2qCoqu
VPPdVzmVV26CKg51G6mrkagis0U0eqxU0F3dVm+8XPdBU8/NVdcXbmVn7d3QHjPFHQZHQd46mgXW
qzzVNWR1HNUxVFA7vmioOftQdEfmiPz90lG3QfPkZu7PFzV6rT1Vdjtdj1X47dW1XYqGguLvQHPz
J6qKr1BVTWq1GffRnNU7PR1WKuqt1audvmjj17U7q7JQpXHVcmLiquKrrqVVcq2q5HVdq2q7H1Ou
1VzOazLtVpvcoYo9E9SLqc8XSOqxHzVWDVEdViYq23cXOb54bdTVZPV5+Y5quOY2hQTF+Hq491Ld
D9ZzGxeOr/XUxVXYqHmuKM+VMSbqtKOLpqLn5jHNhzxnqOdHmKsj99NlViLoqqcUFWe28q6rY6jn
NQVYzc19OYnz1ZVYcT71dSVHZpdjc1Viq6erKsiqxnqar1Vyrtur62WaK/b56tyrXV3lBVZyrr37
fOd1bVffNHHHVaq0/MbnbvSNkeTjqx1qrvPVpryP2PneqsPVYfS+eq1HXqypr4rjVWR1E0a6tWTx
+aoqvSxfIpyMXQnOa7dXP6eLObnquVbVaR9RVUyPMVdVYj5/bmO85HVeqp1dAvKrMXPV3SPWKLtH
lTz1deVfz1WKrV2azmqKrsfNzTnObmnOersc428NdSeh5sqLPVkwqtj+HNkfaOKLnqauiPVtm87S
5zvZ46Cq7ho+3eqnCqKCrI6rPbmqX2qTVU5luPVTEqiq4ehq+rbjSqX88qtnNU0HWroqh1WcquVW
V0zMszvn5qrkXE9nZ1MAAf//////////9CoAJR8CAACpZuDvEf//////////////////////+oqs
5zZMKYjdWec9Qaq1VY7c9Vzm3VaquxVdGqr1VMar9VmqndVnnjqyLIsqTVUxqu1NReTp3V9W0EVX
Y5b6ZHMJ1ZVciJUZrnrqOh6CZj5zVKq2r6qZVXKrsUbNUpcx+aKr6vzdViYdRQVUg1WKr1XGurVV
TzKrVBzx65sc5Q1dU87quKoOaOoqv1XKtNVamD3OVNVjmqs1X6qYxmq/s6qZRYbvQX6pk/NlAe2s
joearlVh47NfiNOYbnuqwqvL0F0HtJQUnlBHzT1W0FW1NTVnPHVd5kaj7UFWVWKsztUGvO3SrKqc
HkuqmPPmVU9NQVU6qsWY9W1U5qptz8xzKgeZzXzVU+qppVTmqzMalqyrKsPUVXFZ+eg7LdTnNVcq
2r+eq3lVM6qeVUwqpzp1U8NUR1dH7OSc9Vk5ufmi787qpxVTSqntVNLimvaqeVUwjjNdnqsc5qqd
4eq5U1Dj9r1Z81VbqyLKj+GYKq5ht5JUVfnWr6tU4c79PZjBHw1Vl9artqMx9899r3lDEapq51Mc
VRVc+nM46tuq61HmRHPzc/Pb99zFV1B0q/DLw+VXKuqsVNX1XKt8o/PTmOpirOfmquZHEeqnFW8/
uUFqj9iq81RV3PzN7s1Vyr52ruarMoNd6Nx1GVXYuh6BVPSrPe0S+xurjRvtQWZaq6LcU1lV2LwV
MVVipfNFU1Wai6r3M87Y4qmqzVTqq3dWVffNz1OczPVcNV9Rz4+Ze1caYqtR3guVxTVV0/NU5Vdm
FVzqLu7jq+gqw9qYq1uNUOKrauq2poIqH3vVZjruqnDqzVVMP9qObKj+MTMFVdNFOG9qyq5nWq5V
qZ4yTfOY1dR4aqy+tV2Nc5o9899kbUUVTV7q6PmqKrv2OJ89Vi6rzznzOY/PFU893H77mKr6DpV+
YvDqq7V1VirqvquVb5R+enMegmKsjqeaq5kcR6qc1WOf01Adee6iq/Kirueod7uKq7Vc3V/NVmUG
u8lx1ZlV2o6HoFV2qrE44tfZauNG7oLiWVMW+aa8yq9F4RqYqrNXXzRVdVaqD1X+Z67Y+apqtVU7
qt3VtXvm56nKh89Vw1X1FTl83nvtXxTF1Wo7wXKzUNV6Pmq7Kryq+6su3ccVVygqw9qYqsNx5rFV
tX1bU0EVDO96rMdd1U5u7XPz23l65jmqBM4n15jmjiPQXh+ZZkWst3OUL7YZmPEaQx2c07nNQI99
KCNI3PVmXeGy9ajzI7zme+mqreGqpipIge/uGH3Izc+OgNVi0fbiPeXHmRS893QXO+ZZje5U4eOL
t0SzIo8dSsZ42erquOrNo+syh7YkzUEUdAfp261ZUdKDW6l270jN5rm5zLcxeXtdelHqgx0NXG6R
TDWjO85j0FBE75zTFp5nds8Ug6XHfMY9WPO5s1Pd/VFK+3Yyq6OPJjDGvMRsRjtWa+ZxdKrXTKqc
nj9pL5ulTJdmj2ZGUR4ulr5Mc0wc9AfpmzGzOc9naZ/udqPXNRJWZVGX0medTc+ruox3cdV0yiqc
psoE7vnSojnO+c1mjPz0GVFXYjUZj3VcidBH2PNmmMznyOZXe+vU91WsR3FrrmzRXhj2fMvFVd0+
btQVfVtWUHc54jVEVz0fNdBh6sjjcuI+czq6JCgjZoqujqWc228eGqTd1cWVJzn51HlXZEazPMoe
jWd85j1Y9xVae7w8V2fmjqcqTOOpiyKo7Hxxc1nPE7jRqux5Hz5U1GK6uJVddVs2VGdHQUBnVas1
1NVw2GoL8OezOd8yOq1Ruq/Va5+e44qlHzIulTFz7znMaKgqKizH7xxWudVXeaKMxzHMeKOKrOar
KtoI8xmPnTrHV14fpjw9RlWcxlGd+mOY+O6u5tqq5UHMczZo9UER8s3WgV45k+OrjZZ5aky53ZG7
z+LIUAc7njnkfmU5UxenzrrGuxmFd5V90L8WK837qco2z1r6JZ19IK3VczsbZrii5zI0eXpOgO9L
mjq82nJmPPDRPpdc9J3RqutXIo9muPpt9pntKuhsqbPQdoozx4dZzpm6niVT3NbMo5DmjuNszVG+
tRzR9Yqrmaiuzcx+nkxs6ygs+ZzR6uPnqyrWfO8WqA8kpz6ec2soHEdvtMWeot9qNx/a9AfMmI0a
p56ti7VdEZ9KfVBQdDszkq+OravqJPsUff2d1Qf9dnvP4L2QCHd5455R8yq6L3sdPejWmbvWV3lV
y6F+I1q83uZ1OUbs9IfolnT2sjuq5nY2zXzRc5si58vWOgjesqI6vi6OTMeTpon1tR/e6NV9o8ij
Rrj6b87TPadXSLKmz0HaLnPHh1nOmbqeLKu7mu2aM5o7uN2Y/xTib61bzR9YqruaiuzVB+nkxs/a
gs5s5o9Hj56tq1xmUWqCOSU55h5zZQOoO3uas9WH32o755n71ajw0xGjVNTVsXar4on0I6oF0PZn
JVcjq2r6iRRR9/Z3VArzZtZIs57Sqyh2dmjcSPQXGdo61eR1CNzR80Rs6b73pxdz6N57kce6rlWq
5IphF06Cq3emtTilVVpY8qMjx5HZ6smMfOY+I1xWeOY7UPU1XVfFcwa4raqLvmoDo3fDnPdztGZx
O9aq63QUD79u5r5+xt6oN9qHpfR1Hfmijq+q5MVZZlpKgq5Gd1HNEZxTEal5sM+5vO7VAqsjOost
J+9qDnucdBQR6zmR8qzpZ7Oe6M2c96bixXaNR9rXWzdsj8zm7XQR0FXdKnxHjV8yluKg7JKKo2bv
HUHR6nnji6zpszUdDdWHNH2S8NFeO+t686TOubSycuOKLsZnyOq4m1d8+dOah7c9VjKrPPEeo5qD
pFebyrqrHXOePKDLu8123s5+19jI0zz3FFQGq+4+r7HquKq5QXFFRnqIrqw1X8yjqy+0VX4fnqw9
XO8e4oj5Unc9ffr0uYajUepzueo30WXM0dnijzLoM7be6HHFffpzLEj5hr2bpOvt2joKNRpm5jGa
fOcxtYfMa56Bau+l5flA04zxRac7KzXdTVkXSpvnzHu85o1UO6g7XcRa73VzdAe1zZV0WLp2S5oj
9LvKCOZ7TEVXnNfbpugoNZzM/agxNzEXPQPofmq5vOeovZ6lGzqc/Pe5yK3395qnGkp3HqrX0M4j
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
99phTFIP+g587acIGArj8bM8cxAp2lQHWvive717CkgspxVv3uEkO8s6xV9nvpL2i/fnX0E9gzMm
K9qFup1FtSnOc2+U6Eqt5fVe0M60bqNN8ZELNQmEAEu/TmpcuOUkHJbfXvFWvae9Fo3Q5S4102nk
psPbQqcpCnz6bBsEFUb3/+qqpaneZKnm6CFZobmnr1CWbqUKp3pyVbywLYIw9zBrmHMSVroCQrxj
fb4v/UDV7ZSt/EHPnbT7BWCMcbc/ksQKdpKDO1BxXvd4ZYUkPocVb97hJDvtnWJl2fyl4H7876Ce
z6FkxXtQt7ZUalPedJv2nQ2q/l9V7QybQrs0iS6GNHN7QC+d9BTnQ5zbjtL0HJKfXv1Wvae7Q0Ko
Z9pyqCnjTx6bD/MoSbA2SQNigQVVvf/6tJS1O87Knm6BxZpbmrr1CWbqUaqVbNqVUMsm9/nJU48q
sn7Kpd1FSapiae9Mmm32+0ER+bF6ZN62ncZfceUFViqnHbmq/tjPVnerajmvtVdNnh6DnWGqptUa
q2rsqs1Cq7KA6P0xRH5ufvuqnNVmq9Vfjjqag5+eI1Qj6ioKCrOtWbqphEegquGSq2q/nfVugqsm
qaDO9RkdAagq2rqsq2p7uhqt0GGqu3keVFBqYZk+9BHnPFQdol2qu1WH0qpm94a1eVZdnbugqt1U
yN33d856jD1U5a6bqsc/PF0q4+VBqrtVLlViguq9Va1Vd57ygzmquOr6m2fUTiiq89W1W99KqdKr
IqDt1zm59UZqC6qQ4zZfPzH9qpDu6DKCq5i6eUBozXUGNQc0ZjuNVcfObKqcVJ+dPtz1ZQ8/NV1V
PardWXQc9XZV75o8TxmoKGqmC6VFVg8Z6Cgu7qpAq+q5VtBlWmUdX1LiqphQcx7qs1Y6qYVFW1Wa
iqmFVMKsqvVXqDm5qqcHuqnKdAbt1qp4ruqnaqyKqkOqnKjqN83PjfSKrqrtBFU1U8qs1WKCr8w9
niqv2+aq9Vh6qcxn61U6UdVPTc3NQZQWjVXKCgqs1NVOMqec9BVa5qsqsc56tq+qzVcNVtTVaoKr
1VMKsqt83NGapqeao5sqv5VTk9W5Vf5qsyqnDypzKjHURI9WVFVjrGfLq7faPm6ZfP0qphcV1UnZ
0qp12qpBqpk+bpuI1WdqqcVZUt1dz1UwqpjVai5z0EV1Xaqf1UgVUxygdVuqnq56qYGqt1Xcupd0
FVk1VqLnPlWUHNzxGNz89VrKjmq/nqphVbqpzVTmqmNVMartVyoqprU1dQUBsa781Vh5Vequ1War
NV2q7VtWp9IjRxxRVX6r9W1bU1PNzRxqgoKAxquqXQPnuoqpQqppVxjmNVneqnVVOVV1WVUsN1fV
dtVDpC7o37uR9KZ6y9UD4Io8dBUb+3Ekaq5z81Tqpx0Gvlryq4feXUHq6oiZ6v5nVcyq48qyKK+j
7c95dVjmPVfq+I11fbs+VZQq+26sq/D1WKrkdzB1Eaq1lVmpcdVOrqphdVPHzVNW985o+d3Mny9p
Vcd4fniPlBe6sPGe3z1W7q+LmoD1fmnbqKjnNzVZVeq6rXZjXU1WmagoOmVY8jNUVU+PU1WDnu46
iq1ez7PMVUwiu6rNVOqqYVXZqre1RV9/arFWVWKsqpzVnOY2R0GoqrNV68X3HpzsrmJC/zs88bnK
70bVA9ViGHjoKidjiWGqu8/NU6q7Ld6l4J1XL7ZlVk9XVHMz1fUdKrhqrjyoi5r6Ptz3l61VYqI6
qcVXOY11ee7PlWboaFH7zR6tq7KrNV2NzEaiNVbNVZqZrnqp3dVMbqp5M1FTVvfOaPndyR5e0qvj
Zo+eKPOt7iq0/Odvnqphe6viqKCOq5mrt1FRzm5qtqv1dVYdxGupqts1BQdDVWnijiqyqlA9X1WT
q7fPUVWz7Ps8xVTHmu6rVVPKqY1Xpqre1RV9/arNWVWKsqpzVnPEbI3qKqzVesNkuDKKp1Xz9Dc9
BlVug5qrVRUGTptosT9T/htFec9WOPrV1XNtNf3wS4KJcG+CMW1kZ6DLyqzznoOlBQGq92qir6rh
sPQVZFzRVU+qp1Vs5HVSDVaZ6rVVNKDmqpRoKuoKrMdVrnoue+bnqarFQeq5QnPVYjq+q7VTGoq+
g61XaCKrzUCuq6qDmquGqypqO1W89VzmqyqzV0VXVZzVXaqcc9VuPm56ruWY+KovMPzmyqn3PVd3
V2c9QagXOlHHzVWI+yjfegqyqzzVU1zmiqL7Gs9VmO6qZVXauOaqmCqyrKCSravNEagqsHs9XVWH
2s9VyM10HXntR1UxNnPzOrKqcVU8qKuqsHqsOgoOerVdVOKsqtuM/PfPUZaqsxVW7jq+LnqaBHsz
PQKr6ipqztHVZw1Bz1WDmurKr1BPZ2dTAAH///////////QqACUqAgAAQblESBH/////////////
/////////1W1XzVU+OaqmPNtUEZncXPVc7c8fegyOo53VYyq9VZqciquVWz1WqqcVU4qt1fHzVU2
qtUB6jnqKr1XVflRUxVbVeqtVU+qKnKsNdVyqkCqlA1x1EVV/nqI3NUB7NVePzGuI1ViOq53qD1X
aioau6rFTQc1VtcFqqY1WauVVo3WqndH3yon2uY1VOnlVOTx1Jz1Yeq7VZqtVU4qvVUyqpwozVU5
VAbmqpQNzVUwPU1ZkdBV1W1U8qKrNVMqmqmt1bQc9AaoqvKoqcoJIsqTVMXWraFOq9cbq2gjNzVW
I48cVVMrPnPnPQI026Chw1V+qnPM6jtV9WVZqpqpnU1EeZVtXnq66qQaCraCr6rtVMj1ZVdjypzK
sq6qmO6jKvypquxaT7K6r1Vmq8eq9VTCq9VaqvVWqDKipjXNUVYeqmFVOauqw6VVOMygoFmqGzc1
1XqrMcXPUUFAnPaVBVtX5VeqphVTiqzVdqKuqyrj3UHq+pqvHqsc1TVhzdIqs56qfVUid6squVEV
V7U4W7XM7Ux/G/faNfdzH0j2XPVr3ujdWYeM7qcqz3tQZrV5VlXx6vXZr26sSqHZjR1ZdSojVX4o
mfDnidurtYbnW5jccdXRdzz3TKrmVHPdBEjnurufnq2rKs0dX1ugoKBeVXcPFQUHPQcyoI9ZzVbb
v3OsSiPQVXed1dezxaq2pZoqOzd8O6A18/SPvV5+ZVXD1X6rGVU4uqxVdqy13VRFQJ1K55OfMOur
qvnSqenPzOKg7m5zmOulBQc0/Qbor1Qdquw1THOJfS323kzMP2WjzfAhd+eqxujdWYeM/Sr1Vnag
x6s1W1fHMXe7qzFUXZjR1bdTEaqnEUTPmbPHE7dX6yKpW5jfPHV/N3PPdDVXcqypdBzdo447q6p5
6rFWVb0jzrdBQUCqvYeKgoOegqFQR6yoPVZfS5zOsWHVV3ndXn3HF0qsVczcyuLvQHdAa6nrGqvP
zKq4eqnFVjKqcuqxVeqy0sqzmSurs55OfMw66uqnB0qu6c/NcVB2NznMeg60FBzbXaieqDtV2RVP
P9/Z/4H/BOOraCq9FVZoelTV56hZVmE2Rf8fCPBgfz/JOgqsVfVdqsxVdfBOQuP3Xz35X/mO+bMq
s1Lqp5z3Vcq08ec1XR1cqCOaurqCpquxRxczPVShz1Yeq3VcVVyq8zq+aq5dVOIqjNc9T0yO6sqp
jFdSfueqnfNz+c1WVZlX1fzVXZzrFUR1WKrMUQTyM51EjXzVXbqsVdlBVhsmOag5ux1U8xqjmqpz
VdSNV7yq26DmugiyzVbVboDmi33OY57qpkmaougT5quUR6qYVZHVShVdurKsNZ6sqHai6Ya6rERz
UHSOKqkKLnM6rWRVNV+6riPboeftfPRWd1eznyooLyrat5qqYdcqs1WcRqBJ1bzR1WTnWOpqprVT
mqwY0fSqmF30PVdVBHdBQXVTqKqnEfNHkVRVfqpjQc3NHVTA19ar9V6J1XearI46k+aiNkfeo54u
d3UG56r24752oqCrMNHz756v5qr0VWVWr56vWZQVbzKgq6qneNdO2c1BVZqtRmNVtWHVVpVXYsmq
iLvcd1UzjuqnFWc1XH6VU4qphlBkdBQG5qsq80dRGd5V11ZVTqruuVbQVbV1TlBzxHPdV6r6Ayij
uqntXVdQc3Megq6qnEdBVlVMaqcVXavPlWVU9q2oMc1VvpzVfuqzVYuKq/dV9VFTUc93VTrmqs1W
avqci63Q0HNz5V9QZVWj1B73Uo8fTKsqt8z3Z7oObmZ6qdnyq9uM9VNObOfm53h6uNHz1NVyMxqq
cKNxVBqCoPU0BoqvoKChnrqUdqOqmOVFWVbFzugqpxVY5qudV+q9VTGqmVTHVTuqndVqq0araqc1
U7qtVUiUDPQc3N0qKs5qiq5VeqpnVTGq5Vc51zVXKrtVqqzHHVTuqndVqq1V9X1WarMZqB1XartV
MKqYboDKqnNVNaqYPmtHNzVfQHijoKruHOo4owUzaK9PluRyeOm56nt7spZ6jDZ23nPeoqi+9BdW
8yW0vuOLm71LvreqC8dBajduY6dJ/nyz+5410ugu6DnxTpqC4ub3zMaqee6tNVedTVTi75olnPhq
iPnoKqcOrOt89R2i56qZx3HU1FDHNxZUWc+d9R3h3c8qiLXPnNVmI8RqvqznPFdqoR789WHVn3+K
7PKr1Xc24uerLUcfqoDH571lBRnNVlAbrzUHPFV1xVFxRVXKDpcWdpwpuW1ujdvNa8cnPU00vYoc
9QY2b571FVmXQUDq2oVM/MvM+Y4uagqW+p9UB8dBajd3MdOnvPlx+5410t3dBUpbNQXzVHvmUC56
mrTVX3V1VOrvm5sNzm5ufnoKqdXVjvnqO8XPVTSO46mrKE6iqLjPj1z3h9XPdKsi6VJqirdGnDxG
quVZzx8zjtVYue5drI1Z+3ApH7XlV+ruZxc9WdFHH7lAaPnvpmUZ4qtoIqDm788UlX3zVZcUVVyg
dxZteqtHQRLI6jKh1HPfPVTBkV/BHgvznq2rD8/fmtUH64e+agoKDI+9Vqr/OtV+qzhnVlXRVU0q
uZHHE6r/eoqak3P2VRdVP6DMM8qp/VnNa0dHoFUZzR4Z45413UVU55qmq3QZz1ZUJxVbG46sNFV1
V26Grouab5+erudRq8NVTi6irIrjqtRcxuagqY4+aramOOq5z1dV9VjHF2PzczqsmS6niqyOOpoO
cxsoIyWllqPtZrvM5zvtEqDmqTVWzI9VjmoN9Kjm5onFdV2qmJqjmq6M3WqzFzVFAoryq6rNVTCr
nz0FTz5z3N53qt7qplUYbvFVnPkdxR1bV9VMbyq9EnHh8w9Xx1WIoj8/Oguep56sPfNQUFVg9VPO
aKp56tqv1XKrPNQxOPmidVMIzVcfnN0qphVdfPz1WI6mgoLNVYPUVbVdRqsoKuq3pVdRzec8VAep
q6gqsVWKv5o+8WVU1xPmM7quc8cWZFztVcegj5qqcmPVTPmqeeqntVrmoKqe1UjUFVs+YeePQXdB
e6CrMs8VBnNz5Z1o1XVUwqyOPm5jXVZS56sq7nV0FXVCqXl1U6RquMeM9TVTyoq2q9FHV1XVW3lW
VU5qt8yuPmoKrVBVTiq0qir6rdV6gqw9Wu6qc1WOx4+ao1H3qyqnlWVXVzJGjyq5UTFBVtX1YaoP
Qc9THwIVB+J46k1881VuVFRVfMulAeresVBHVYqJ6rI486VbVc5qsqu1PNVYoKr9VOTVWz3z1U35
+apZOPnygq2q+eras56r1XXV9W1UziqtXGaOq7VZoKjLq7Io6rdV/D1U4qpgfmq2M9BZqqaVXo6s
qpzVTFc9BeVU7oDPVVqroo6qc1UxoDc9BQVU4qt1fVYqKmrqsNVZqvUFBHFVTiqmLoKqZVU75jVN
Vg1VqKr6r/Muapqs1WDxVoqk9TUVdQVYc+b176nI+iIzPx+K+ipf4fTzDazmmPuds7VElV89RZrP
V0WHqLzVLOdL6EtyTGnFQTHV6juJRzWUN0HZzioD5M879yptZkSqe9mVxTcVXYqju6tvPX1vnd3a
+UFmPfNVvO47qOY+aNkdArlcZufLu+nNd0T2s2o8uI9Qbn3tbM1nW2quUen0j5t9Ks54rkNz9aI1
vmPzKSguguKL03d3canqCKPtVZcfVaqaBrn70HSrd0EdSe6rXzRTNtlvXM7V9M/iZ10LYbWc2vM7
Z3qzdVOD1Fms9XR82HqLflK+l8CeBBGY0+ZRzHXv0js2c+sd0Dc4qCPJnntGqbWZFlT3syuJ81XZ
lR3oKrFm26C+d3dqvQHiPfNVY5+3PdWc2HzRsjoFbfPFNc5rOfpzWe6J9jb5zXzR1Yap2tmOjUF0
Cq5c+qDpHUb6VZUxHkNUqiMd3zH5pMtXFF7F3u7jyhRo+1VqJ9d1dQNc/egoOtW7oD1OHPVaBVWW
qXWqy+eI1mNVmdXVTOsVZVlUfmquHqyoqT9KrL7djHqI6tqW+aO0qtmqmrqrFVyrEqrtkjKzXlBV
tW1U5qpxzVabOa6JHdBnNrmq21QXV1X8/Ouah64ffQ89VcVWVbVdvmiqp7Q1dFQdj1PNUVdkXNQc
1VqOI3NzxVX+Z1Zc5V1RQqq9qq1kXNVcPHVtXUPNkaq3N1bmNrmqx1FV26iqkLmuqnHWJxHvn3z2
446k5jnsx6DMyPDmq+q5URUBqqfVdzXHULm5o4p6qx0dxdz8/Nb7ZlWVXKDnq3mzveHoOerLqp1V
ZquRxGUdXVa9s1BQM1TU1EVX1Oul8ys1XVFAc6qw7qOr61ZVTGrcvmSZ6rlW1WXdXVcqnnq6qnWq
kzquR89VP6tqpg8ji5qiq1lm5qtquZlTU8/Oc1VqOqnHPVTapiqpxdQaq5UUG1U85qvqs1bFVT5G
q+rqqc1WauqpkutxR89T2qatq+4otHw7UfOqg9V15V3PVeMaoqsVWKrFWVFWVUhVbQVU4qamPnmK
mqzfNVTGqnHQ+o4ou5qsw9RVThnqs1WvlXxKq9VTl1aud97NUc1X7NFVbuojqKtw9VMIrPdV+oq2
PmNUVWeepqpybvV9Vxy3VTCqmMdRVaqtKJ1dVb5+bnq7KCrKr/Sr4qrqztVTCqkGr+egqp3z9ueL
nqsxXzRmOerTx1UwjqVQVZV3PVT6K6CrarFW1Wuc9WUEaqs1OXF2qaqYVdHHQVUxNzc1QbXfKsyg
qzssqtdKsq6r6rNVg/Oaq4eqzVTO1VYiq2o53HVZ6aPVZq+q0Y9V+qzVtTzWc1VyqxFPVXM56sqv
1XLVVMardVqravqvVfVcPzR0FV6pqp1Vf7rmVVyOKqmFVqq4+1VM6tzKrlVznqtVNVuq1UVFnu4o
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
qraA0VAer+mtVWciNFeRVfEZuKPpQdz2rPFQZcT5jVfzOglyrMu3HqrLPz1ZHVy6njqLq/mqOeo2
d1XoqqY1FVzKA56CgzmqzrmVBkepj5zx9+uRPOY0UUWY1zx8/PkdVjFzcxjb0c5z3dWn79Uooqsq
yKrqqcVUi1U0quRdzrnVTzVfU1X7vaqairqhdvPHJTvpK9Udy8FN+Zsh7JR/HKKU2r3M9m1QM7oP
hHmvpUdude+y9FzVJ+yNnPdNEs7VCoLfP0oFe22e1QXnpsoIjWpvpVnbFl4dPuYG1nMeKO5MjoOx
4+bue6C7Nb1fa6A8XOqOj6fezo+kcXM+0ybL6Z75zzPT1dqDfzVRHFkacVA+jjmam8oItffX26OO
KhjNHGfZzugk+si5PJ16zTk8+4iDmSHT59rK9jfb1r+qDts7oN1ZbqO3OvZnxc1SfsjZU3TczRu1
WUFBZR8/Rq03cdqgvE8xRc2X3melWdsWWrT7xA1FnMeLnfzI12PHzUGj3QXcZroNX2ugP5Fzp0dH
112uj6R80Wn3mYsNfTNrnmde9qDfzVWRxYo0zc1A+naOpvKDm6/XR9ujrRxUMeRxn2c9HQCtMVez
dDXUVbzNc9VqrozJ1/HXbzHjdDrTbflfxet1fUVZdq+eYP9no6r3Y95zms7qyrDnjNVTlmzLq64j
jt72OdVJ6rtV9Oq7zHq8/PErursq6q/VTHURtOpqtVbVtWLVVP6mrVUb7Vduhur6vw3NV7NzGq89
1U8VR0NVbygPV1Vl8xqmdqYueOramqmFVmh89cVVPbMY2R3VYdTls9RH8OeoPVY0e7jq4515z5VT
+pPVnaOh0ehVW1XKuPUYc6uPaquX5VYj5qqdRW1HzPyPec9qpqbjfBPKkyRoqr18yqpxzmNkbq+K
q3Ox1XLquqq5U85uY9Wc0RpKqdxRTEUWVeolQGVVuOq3V6PUc1VOrd3U1GVfdVoxsoDxZ3jq2M8d
1LdVgzPVa5qqZGq+q7FlSaI1VPDqq5FUVdU1WDHzm59WY3NzVdVT2pqtVUx56rtVOqqZVZQz1VOK
qeZQOqkDVXbb9VW92u3s5EDTDzU14c/PlX1abVx1XKrcdRU1NWVaeqzRVUi1UqeVNVmpkupijPHV
dqudqvPVfjNV1X1NXVZVSjzVGVXM56m6uqKr1TmVeeoq6gqyq5FZsPVfqw/PHV9Aap75dV413Vej
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
rarhnfNV9V2rqtq6q3Veqtnq+Oqminquqt1U8VV6qzV1XGqKioZ+1V/tVY6VXKqdVcqrUdVM3dVi
O6ulyOgfObn6zEyzX2ayN0FVMvDGx1afyg9yavnmDJc2VFDmcxqt5qrLquxKcRua4qrZ6F1WKrlD
V9WqoquKz6flRHVTioPUVFVmqwquiurKrlnqaiq7VlVOqqY1U8qppVTyqmlVOKqYVdVTWq5VaeRR
27yrJ2qmNVOaqY1U5qphVTiq3VfvXPFV1WVdVtVOqqZ1X6rdV2qzVcqs1dVl+PIo6rFVzL1z8/NV
bqp3lVy4+bnquqq9VatVFV6qkGN1XOY+VeWlGEilet4RH4AjWf4rY/z8y65mRyr7v+aA45pypNf4
c3PlVOuY5ueLm7WcOUV5B9dWdrq/myrDxO6g/51WD1WT7oDYrSjWZVcPVYqu1X5PZ2dTAAH/////
//////QqACUtAgAAOpwPVhH//////////////////////6zrkfPu6G+bmnJw26PtQVJ1U1EZznr9
O3Maq92q1rofpU5V1CfnoDUHTnXPUb7WeOp5r5/DRn7XVlTcXzPTR5hXmjj6Vc6vvZufmqY+eq3U
1WKvNV0ZsqpwqmrKviZ6mjNHaXPz1DpT7mD81VjVnoKuuq3QUBtp1ZV6inaCqyeraCgoM77TnLyp
aFYpWK/gPwEnv38uRfmv+1VcvKA45pyr4r/DmqTVqqd1EZqnm5rsFJdy/StWT+Oq5UZVh+acuoO6
rB6rR90ESOlGsyq7HVZqu1X6t65z8+z0J+Y/NOTht0fagq4/SpqOeM56/TtzGqv9qta6H6VdlXUJ
+egioOlSueo32s/PU811PhuePvdW1Nxer00ZkV5o9Vceq5fY3PFUx1NVMKuqs1ear48yqnKqatq/
mcdSzRnWVNTUNx7mD81VnRrjoKvd1UxoKCLadWVfkWqCq0eraCgoMoKLTnLNUsiV2fDn69j9jmMb
nsETXGvvOaBDXpt9KnKjDxSW4jYDrDxmN5dVOqBVc1zZVaNd819D9F3PQK47OcxuZZmXm7vupw+a
VXGvLvp7056CgznzvhqBGy4875z1ZedDHi1H0tZnXc5elg+1PunMPIpyiO0bqer1Nu2egw8WHzIz
UFRznjq3nsyuo6NdtI2z9G6xn2PQRTCzvdVzdmNOZnPHeXec0eXE6rdVMMxrm1QG+5h41VhjaZ4r
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
JxqeygSoMdTjP17nZudRdHPY2+jRrfV+ayjVs9uZurtaw56DOj579ur+a+19FlReRdLnZYr+4rUk
iqNxNc/Oediq66u5v4qsnqdHyJYzUGUFnjOaKOhocioKC+nPkboHQUFDQmq5ttvr37dOveYnszFQ
UDd33oKKq1UR0FBfbI1Z/ahOOgqai/49lUvwkC4+yy1sRuiTe76fAq4PEb3ebfu9yI3bPVzxsoUc
zjycty9lTvboGtUfacdK0rV5lJdmRrv7SbvHnnptTNteXr1epy0fb5mOdzp06rp0nriM8Uytxnv7
7Q240/41LB0Y+yyyGRumN76Uf4CSB4je7zba3R7kzobtk4qnnZSV5kuo52Xspcb346OZSXbJz2/L
SvD5n13o2Gs9HJ2vHlJ6bepu2pb1SL1PVG5YjXO506p9Ok9cRnnbyZXkcUd/faG3GnuDlRueV2aK
oy6iOOLRVppxwNrCcn0qmi5EGvbtOxi5s307myPLS2lp0U4cx6rfvNdSszFiRt5VtSrP7nNdx+jb
bP6bOdGj3158qFfP16XUdozm2aPn9l2aK10urnlV/zm8dx4FQ3UjFE0rqIsF6tUfU0Rjnu+g8nKm
I0bzXh4rvmRovcVq6t353S1Nvc3FvR6sYPkZnoy7ebWK42uYbtdvDTO8fa+fmyoUxdX0FRi75QRa
jXe4rj7mi5jZz1dV/NkdV3mqefmzObtUc/r6RXzdWfrkcR9e83M46jtHR+67RdFm1LcTNUo67WeK
PHUZdV2q5VsXlRVcv6zKp7zvPl9utRFz1ZV3O2ZVdzXZjc8UdBVujx9IufM325tM8Z0aJmuYjVXR
6o6DV0VWRDbj389Nmk6vrLPteQ16Puc7Zs3bmqyjk7UBu1o3U59zUVBmdjUFQ3Ucy11NVd5uerqj
HQUFBHrnfPHFFH0jMj0EXPHzRxSRcxj9e/PzHNo0UZzUFAaOoi2bfPF1oKCzaiNlXR8x7whrVfwj
Ct4O1mj3QqujtdHXh9317alo+1J18eWhR7NQZ7uY9b336TnzKz15FmNm1FOvo2lW3MUej4ftnTpW
edVmZO76bejbUw5aBqcWHSKzXTeJWa6NXrxUM1FflHMee0dvWtRKBeuJYEx7qsmaPdCgjtdLGwqT
r20u2+1J18ateUezUGdpzcxMePffWVm5iKjwz7xS6ia30bSo5Zij0fD9s6dKR51WZk6303robamH
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
L+bZrI06m7E9Oz25VoqGSdgmI17gx1bP7v0MHrXYeb8oNCHKtWJqe4u8Rb5+OnTwrvplu7XgsFt9
bL/J+s8c7L5/9tns2+ZnuOl41B1/7vb0N2bTtsFhYiQVfX8eW6waO0/bat7+cWr44JyN9k7wNfls
M9PQ9pYab1nZTqs47mJzcVSPXk7yenDaEl33DzvJqIvmIi4qneQ3Tqy5a5Gszbwy+ht19mM04zxi
Z3hJJJhvzKl25EDdOp1B9/EKW3NQuw5SbVcNnxMfW6JlkVieB+xqjESNfb3xidtN6Fu6liov67pO
bg92d57YMZPntg+2WDLT4Jzm6r9nEvVarrsYWSIepRhokiAJ4TlL5ta6sLXK52qPjkzRFdy75l+t
rq/W3Zy3zrvkVKeU4Tv2XWw5Zl14sm/JPpVmazkmvTAub/bvI3U8PClTOr1pzNYEmwdhMk086w6o
i+wc5FSq2WWaDmJ8XGbb3/et9KdHvzz/fO3HSnrm8Dm795HWBVztPiy53fU3SkSvmOR5o+9tNWns
Y5savq5u3Wth6Au2tfKFl2o4L4P0rrwlx2LOwZ9tfZPEOKIbfTn2zvpQHuavpoz9h5MTN9KdEn/p
W/mjXv/GsD0HzcnRzoYlXdkwy8C1SdRrC6FqG03NGMTuAf6ESHGJgxBCZLbteoaDC8xyD95+ERbt
jtJ8+i1LW2f6/TcJLGoOmW+kjt9o7J3X63Rvnb/1n2Zacng+OdsfzaXXG4Y/x2FzmI09FZP3bS1z
pFXmyVnZ8iElepxsLKxlxrRNz+u/W7li680NKavq83Rl67LSj7ekvwxO/+xqaaEdtic8CcunbhrD
qLI/vDq7OXkdsxmp466Z6eE8GXmX7LJMrx7J/q4tW+MtNz86u+RwuOs+2PdvHIv++ooi1i3XFmMM
g7fHpszDu/ztB4aRGlK13A4zvVwnzZRn3btZk7cWX9dtAx61mGUWAEFOYnvbXW+OZSvd7t410F/W
XA1+/7uW/yqfmr7TfIj3P826xDlp09vtO57W9zOfF/ru2xinNe//wqKn5akXF3OM3WTPLU52DHM3
lPnYSTRPv85EhzCrJdKZRGsqYlcNoWmEVY3zcmtmXEJ24/z2WSS2sT3mY7m0tR55sxFEzN6WP9nY
KqD7Mod3nJte8fGNpI0e423eN3vpIKk9LFGHbpnCp2AeffTTMNqPindkJMde7eh6zTEu7flhEoy7
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
f6b/9PpOXd//3f6b/9PoNg9eELzrew1Xr+9n4o3rzLlTjLlvXXYb2Veu35CvWeXKnGXLexJswXsq
9hrKXrrLlTjLlvZLhK9mXrQSw3snLlTjLlvYmgne0b24gYb2Flypxly3sEPE71tezlfe3suVOMuW
9oYo3sW9gsq9g5cqcZct6/fk+9h3t2drj1eM8uVOMuW8fi2e9u3t7fXt7LlTjLlvbzfe372633tz
LlTjLlvbll+9u3t32vbeXKnGXLe2rBje2b2133tvLlTjLlvbf7vbd7bo9e28uVOMuW9uW9e2725T
sS9uZcqcZct7b7723e3INe28uVOMuW9tt97dvbvxvbeXKnGXLe3N9e2723/3tzLlTjLlvbcWvbd7
bSGvbWXKnGXLe299e2r27tr27lypxly3tylYl7cvb3de3suVOMuW9v2KlXt69vbje3suVOMuW9u/
u9vXt7mvbuXKnGXLe3/je3b2Aq57yXlypxcIst4eO3GWWU+gm3jiZE15WvK1nK8rXlZNeVrytZyv
K15WTXla8rWcryteVk15WvK1nK8rXla3ryVeUP/u/03/eVrysmvK15Ws5Xla8rJryteVrOV5WvKy
a8rXlazleVrysmvK15Ws5Xla8rJryteVrOV5WvKya8rXlazleVrysmvK15WTm9hDml7CvYd5OvDp
+YwcPEy4KZyVxMOvqGijxaByS96TZeDMjs4EkD1mMIcNBGGIhxkDGJNmfAITHJIkUOY8HHQ2bgQ3
sakJx+R5kDq7APTCSQJCFioIZAx8+TNiG3Dz4IBGcUgj9eFzJVBtSM73AiYZMmu4BXga8PXgRvvA
N4OvC1wGvNAMTkWm3/3U+ajHe1wstHrE38W3zf0EGHR+1dn3xsBujuNPv+NS26NH+/u726DNBfWB
6ef/tkzf9CwkmPdH+odZ/YHdzf1iNb3dvu6l396Vvt92097E5PflslJHevrPubrE/ug3W9vu7rG7
7A/cY0u3Z+0OSPsSMW9u0ZausaxvT497fFI6y/2/b9VN7U9x/t0mb+6ilf/x3/Q3dHLopdGdwujI
jcULibkzGLiVcUE+gkXn29rZ0BAQM+dOr2te1r2te1rOl7Wva17Wva1nS9rXta9rXtazpe1r2te1
r2tZ0vaF7Tva17Ws6Xta9rXta9rWdL2te1r2te1rOl7Wva17Wva1nS9rXta9rXtazpe1r2te1r2t
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
R3uMd7im000mzdsd6yJ2WqWZnqwjc0SuWDMP13BIugoMsipnWZtkRY4VQUEpmQUG4JhEhCcmmZjY
ZkVBxgg/lQTApK7SXwsNtWVXLBz/CRcB/gKZjuAT/5Sj/vAWQrnDSpAgPf4kg/6D/wg/AVQKtGB6
/0iBoGMWQM+dAQEDPnT6MRjy3A6RLklclLjTcZLkt/3JbFi6n/YcNyV/7ktcl/+5LYsPd/YMNyV/
7ktclv+5LYsbdQ7HguS//clbkt/3JbDhtT+G/DiuS//cl7kr/3JbDj625/mV3I3B8dxVDe4Cbdyb
/////Td3cm/////03d3Jv////9N3dyb/////Td3cm/////03d3Jv////9N3dyb/////Td3cm////
/03d3Jv////9N3IGfOgSbcXbl2BOXNK5auWcHLlxcuHHLlxcuHLODly4uXDjly4uXDlnBy5cXLhx
y5cXLhyzg5cuLlw45cuLlw5ZwcuXFy4ccuXFy4cs4OXLi5cOOXLi5cOWcHLlxcuHHLlxcuHLODly
4uXDjly4uXDlnBy5cXLhxy5kXNlyzg5cz7me45c0bl+5ZwcuaNzLccuaNzTcs4OXNG5kuOXNS5oO
WcHLmjcx3HLmpc03LODlzPuXDjly4uXDlnBy5cXLhxy5cXLhyzg5cuLlw45cuLlw5ZwcuXFy4ccu
XFy4cs4OXLi5cOOXLi5cOWcHLlxcuHHLlxcuHLODly4uXDjly4uXDlnBy5cXLhxy5cXLhyzg5cuL
lw45cuLly5ZwcuX1y8ccuW9y+cs4VXLe5dOuXMC5bVJxcjbijcQbkPcW7hFcQ7itve9szMzM2973
ve9szMzM2973ve9szNy0BAggw9e94c1UWjHejf6A6pfYszRjpt/TQjw0MPPQAwuH//t3M3c3////
+3czdzf////7dzN3N/////t3M3c3////+3czdzf////7dzN3N/////t3M3c3////+3czdzf////7
dzN3N//5Ya1ytjB5k50Skd8AmeVCm+Ofvf/vf929733fvf/vf929733fvf/vf929733fvf/vf929
733fvf/vf929733fvf/vf929733fvf/vf929733fvf/vf929733fvf/vfmTmnEMGWv97/97/TCZw
KpQO/vf/vf5erdXp8P3v/3v4666ORwP/vf/vf8ewIPwJf+9/+9/3b3vfd+9/+9/3b3vfd+9/+9/3
b3vfdiePgmCvXB3b3vfdqQInilfO929733FzdWcCXqvu3ve+7BW2juqDvu3ve+7E8BiRonv+7e97
7v3v/3v49tS1cg/vf/vf5ecqQIRq3vfb3veHNUyAoR3k3t7t76Md73uMe3vu3vox3ve4x7e+7e+j
He97jHt77t76Md73uMe3vu3vox3vbRj299299GPf/xj299299GP//xj299299GP//xj299299GP/
/xj299299GP//xj299299GP//xj299299GP//xj29924JMY///HXBW5kSFZiWvf/+tjhFnVdoajH
/+xRh09nZ1MAAf//////////9CoAJTICAAB6GEAcEf//////////////////////47OtSeHTcv/F
ix8Oj74LOwxdaHYdOnYLosWdp9VlFi/FVudtOWnYlWMWLx2+WmLF+kWdNo3lF+u3yirPSLF0VYdp
ixfrsairBYv0CxZ2+Ve+oWLVr5aYsX6BYs7cZ2mLF+gWLO06dOC/QLp2+WmLF+qmKx8twAwC4UIw
mIgW55/z/FoQBXbo2uLPEsyl8u3Sov0J04E4W/T/L98J2h9Ft8rt+H7/JpAdg7RYsxY7BYsQALFj
sFixYsdgsWLFjsFixcHYLFixY7BYsWLHYLFixY7BYsWLHYLFixY7BYsWLHYLFixY7BYsWLHYLFix
Y7BYsWLHYLFixY7BYuCx2CxYsWOwWLHJCDSr8yBgobA8fAqqrvdWVWBaFIxVVVGU4MLbI6/mqqpW
8YX394lywK//YqqrngL/BXdywSDU1VViyHJYIciqqyUTDWKckVVVZKIRw5IaqqyQUfsEMWJkU1VV
OHIuK4zFqqqshzySHIqqpU8GAwGE8Dp6EcggOF9tbrWLwhAAFk6NiVNwnhWZG34t3O8MVKthsBw2
5E3kk8gu5g4+CTPJDlhxfKcvolkFiFJI8F1TAvQlWEZZZ0l42XTzJhcNGilkkJXMinJZV9m8ABhG
VN9sy7z25SS2F9yfndgjArvAZdGHQSQfIOQQIUroiAtYrfy/a3AD3vdedtoA3OHLEESDCdZeO354
hO8L3sMO1ue5ydNskEyjBcc5qOZk71ohYxC17TFSwSFsOR9+WQQ5YIRr18c9D62/77JILNckPebn
ofrYKqiRB9XN/cnLyQ4ce7xwyeviScOwc1eb3HiMmeLBYwGEg8YQcggVK9ow7GiVXTeEkPGtyDfa
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
zJ+Z46D/zWM6Ojo6GnRj8ViDOw2B6Ojo6Nhh/dGyZrd0dHR0SHrh8OITPxPR0dHQJl5CT2dnUwAB
///////////0KgAlMwIAAILg53gR//////////////////////+hz++66Ojo6P9UBccgyhs4fo6O
joNVQEnVIMqoIP/o6OjoUG6hKSbmX1pcfR0dHRct+PcSR0dBdHR0dEQuXXwmfo6OjoGy1JcVnR0d
HR0LnXvbb0dHR0RFg350dHR0Fflt7UeutFP0dHR0RC5P12us6Ojo6IRbC9de1JLujo6OjoXLndYX
R0dHRfF8dcJN8Xwu6Ojo6L4i+IXx0dHR0XMkWxc1z9HR0dDlCy20k/R0dHQiE1ioKVBejBdHQjoU
QKh+Sm70dHR0dHR0dHR0dHR0dHR0dGL1z5HI4vF5G9dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dCjOMVQKqM1RnqGxQImcJoSPxj5In/lQMdQnUfU2UVBMgOhUGZPx8PYzj6g6TKvwVAJirDDUAc
un56P/29NnQBmCyZfvlu/5cBjDo3fWLceVAKsUBPPHQ+QwmB0ZTofI5O+txxNWcjCoG3nntvy3Yo
AU6gLyFNBhxnTaNQ3Nu59Cxy1XeXNCx4ddCe1PZFY7192Vot6YXp1lb9bfkWXPDj13LdwiCi29qS
FxWr1y9rih4cl1lr299q2+HvwbpD3NBDasdetssvi50XhM9qdYvd7isvi1YmuOFw0RBLOh3vakkz
r7nWwud7SF4uNF1b0QsFOmi2xMVtjxYkCud7SuVe9zLHhcudfbdP0LhJOQprXVCCoP1e3kqEFQdV
RUJVFIonVFWlUYiVRiKMRRiXtYGDTQMxvzzilAPqwG45ZzA2juOHN57I5P/OLnNe8pmHp/ZUPsaR
gGIZOGNmi4ujD4KXyw08b5k1olbfIl+f2dwdtaJ09RuxFNIYLOsXd3vm17Vn7LntKe2F1l8Wp369
3oZmZSbzeItTJC9Z0XwsW9a4rRKy8FfgouVxse7sJJXusJ0tzLV18ohZdxYi+R6K2rD1zO7+Cc5d
F/GwaGLWw5O9sLjmjwGb/zN7UQhdnr4t6E6LIvx4dNAem0Oq9hLxvwo6CtsRZbsW7EdFpkeHziVx
vXtSRDcfjCLu+sp8O9tttqQ5LnsuAbIJddLIi9qIFz9fpvk9D0y+SxGE+Xc0cocOSxZsqg9UH7Nm
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
0dHR0dHRuLo6J9fR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dEdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dDx0dHR0dHR0dHR0dHR0dD9D9HR0d
HR0dHR0bujo6Ojo6Ojo6Ojbq6Ogpujo6C6OinR0dA89HR0a+jo6P+FDwlURSiSxSMOaphmqdhz9C
Y6qzfn6DM+uN6M8Y97ijESqMRRiKMRKe96NxCow/SVEF7knRi830dHR0XudHR0dHR0dHRe50dHR0
dHR0dF7nR0dHR0dHR0XudHR0dHR0dHRe50dHR0dHR0dF7nR0dHR0dHR0XudHR0dCggUA/R0XudHR
jzaPuu3ovc6OjHmXhcqXRe50dHPnrUA/R0XudHRnTqO+Qf+9zo6DLUAioKw/RnFQwqGbwjmanD9F
VAd0dHR0EIpVi/o6Ojo6Ojo6LVlxRYss6Ojo6Ojo6OhOmdLam6Ojo6OjoLoRDzhmHo6Ojo6Ojo0z
ZXKmCYJgnIgxcEaHR0dHQY/5RKPqlk9cb0dHR0HXs2pVRYoN0ppazP6P7IeucMBQIJYVK166D3aq
AjT+vnovc9ejJmdrSqhW9KE0xb1txeLS53zS5HxDe8oxEqjEUYijES5ZUZXo69x2nGz3UAeDvdUA
+MRhjrVJQb3FAEqGv0yTwyRzqm+9xQPe/uaCMnsvd9Dlzn/0GHglQTe5pVFp0sxnR5qAy93o+88l
VDTVROqGFQssWhe7EReALoYkLLF17lxLrXt771YnRcVxJr4i9yyG2rk6E1getOTMqYJg5XK5UwTB
OQ5FCQoN1CEchyKDjo6OjoXdFVy6/kLujo6OjxzTTIMkxr3cJLruteA6Ojo6F3Rl1y5Ku6Ojo6FS
MlVKSpFVICVRiJVGIoxFGIlzioPvW7Ct6GGQoRw3uGWoD8N5/aU/L3DmVJGeyQWdB23uKAc38FjO
j7zcl7hmqgHKYRUXb/tUL3uGac2SxiOjowV6ziP7OZw4z5MC9w4VBoYZ04nFe/ve4feE6M2dH+oE
Mle5pMMPR6YJCgWvcM5QUYvz+zwVPOXvcYdf/tRjFAne4YqgiMHGef3l1AelVDapKO3846PTH3uK
G81DDMb26JL3Q5v7zn/0HuqFb3DY1hZLoMLM3uH2ZHnlsp9H4qAb3VAMhULQmVCqoWVC17ixMltX
XBYuudFl6sQntWJYQsQ723GSdLfkXpYjvS2JbcqYJg5XK5UwTBzOU6OhByHIaPhVL0dHR0dHR0dC
U4ugN66Ojno6EdHR0dHR0dHR0dHR0dCFAB0H2l6Jejo6Ojo6EvR0HDeujo6Ojo6Ojo6Ojo6Ojo6O
jo6Ojo6Oj+6FGIlUYijEUYiVULxaqGFQuqFkRaiyy+UqZ0Lr2GhfZYi+E0IudFq5LaixKsQnvdT2
ZUwTByuV+cUYOYz3R0IOQ5L10dHR0dHR0dF6y+f6OjozPR0dHli+joxBp5Xozv10dHR0dH0Z5g5H
oz2Db0dHR0dB+efRitGJUCXR0bujo6Og51RB0fXvz8y9HR0dHR0dHRhsFnDv/DawPR0dHR0dHR0G
IoAPQxjp6OhUAdHR0dHR0dHR0dGDwxiYXT0dHRHR0HCcp79BxKMRKoxFGIoxEqoWuboVMCrtVefR
0dHR0dHR0Qsjo6Ojo6Ojo6Ojo6OhZZfEdHR0dHR0dHR0dHR0Xaazo6Ojo6Ojo6Ojo6OgkdHR0dHR
0dHR0dHR0I8DAMz/6OgyDCzOc6OhGYzF66Ojo6Ojo6Oi9zo6Ojo6Ojo6L3Ojo6Ojo6Ojovc6Ojo6
Ojo6Oi9zo6Ojo6Ojo6L3Ojo6Ojo6Ojovc6Ojo6Ojo6Oi9zo6Ojo6Ojo6L3Ojo6Ojo6OjoSqMRKox
FEEHIdHQTejo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjISdHRvyHR0ZCnR0dGZ6OitOjoZz0dGAwXR0afjo6KdHR0a+jo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo26ejo6J+joB0R0DHQq3+joVaKqcyfR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0d
HR0dHR0dHR0dHR0dHR0dHR0dBdHLQ9HR0dHQ7g6H6Ojz+K9HRwXR0V2dHR0dGDbpk6Oej/6Ojo6D
hz/R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHROZe7XNv3ZXOfvR0dGwjo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6P3ZX66Ojo6Ojo6Ojo6OjoDo29HR0dHR0dHR0dHR0dHlx4dHR0dH
R0dHR0dHR0eWJ9dnR0dHR0dHR0dHR0dHHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0d
HR0dHR0dHR0dHR0dHR0dHR0dHRmOjoBg+joxvR0dHR0dHR0GPp6Nh3fYMz0dHR0dHR0dG7y6DPzW
1jOjo6Ojo6Ojoz/R0f/n0ePR0dHR0dHR0YHo6DE6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oh+jo6Oj
o6Ojo6Ojo6Oh5tEQPR0dHR0dHR0R0Ap/9HR89HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0QPR0
dHR0D0B6AaWdDOinR0dHR0dDvz9+I+HHR0dHQdXv6ZHAJfC9tpkVS23qywbLH99EnQiyxFl6vpLZ
ZZZZRPe7bbWxFliLE1bEWWIsFFllllllllllLF1tlllgossR9Se2ROFOu/UWWI2WWSDQOARbbaiy
yxGa58B0pTavVliyxKd6Uwtfwlttb0cYL3wHHFOj38cEDo6Ojo6IFxigdk8/R0dHR4fPz8adYwHk
JdHR0dFdGvTXw4LBqDzR0dHR0IO/be7b0dHR0W23tjo6OjovcKy9dHR0dF6TITJejo6Oi21ITo6O
jo6EWIXWW9HR0dFqLlvd6Ojo6NSNWqSREulHuHTg8HhJBYI8uTNW2T0+toEJkv3kOhrEWotRZZai
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
x908Tv8/A+Tiz2ez2eVBCoFzqgVUAhpKhI8M9ns9np58z/TtaOa2Z7PKgLKg/Z9ioA+c9ns9nlQi
d6goUDBt7pzwz2ez2enny84ef5/rKZ7PKiFUOciExVRH957PZ7PH6qCjfN5mZnVFOez2ez00887e
FRGAOez2eVF6qJ56DGN9UFHfns9ns8qRj9N4yDd9j5VGOez2eyFZ8zzyFUGdH/ns9np1QqGdQKG8
fqoKz2ez2ey6pBNLo6MzPPns9nuaT/jfrNKlc6s7ns9njuVCORMLLqAxUlqiLPZ7PZ5UTqkxQdGl
/ZmefPZ7NfmXGduAMZUEnMchyHIcm3PHIchyHJ1dXV1HIchyHJ1SH11ZKTS4OD3PemNPJUUZPL7N
mzMKgLZs2bNmzZsOLr6+rq6us/skdKoJVDOzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bN
mzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2b
NmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bOvr6urq6+vq6+vq6urr6+rr6+rq6uvr6uv
r6urq6+vq6+vq6urr6+rr6+rq6uvr6uvr6urq6+vq6+vq6urr6+pRbKHi3q/Mtm8Wa6oCUWyi2UW
yi2VAJsSnAeRgVVAii2UWyi2UWx44vHHOeuEUAyoPUWyi2UWyi2Of+4OFUHG2aJwqLZRbKLZRbHr
hpsivHAnootlFsotlFsfeKUBCoRzmKxyi2UWyi2UW2bg2DyPk1zZPpRbKLZRbKLbK/qgQPdIHqP9
RbKLZRbKLb8T07FFsotlFsotia1cotlFsotlFtCwlFsotlFsotiuiUWyi2UWyi2bcLVFsotlFsot
rIh1FsotlFsotoJRbKLZRbKLYXTqLZRbKLZRbXK6i2UWyi2UWzYuVMSi2UWyi2UW1VFsotlFsotl
y5qFFsotlFsotk1FFsotlFsothTEkKLZRbKLZRbEs6sPmFFsotlFt/eaifUdajrUdajrUdajrUda
jrUdajrUdajrUdajrUdajrUdfWo3FHH1dXX19SjrUdajrUdajrUdajrUdajrUdajrUdajrUdajrU
dajrUdajrUdajrUdajrUdajrUdajrUdfUcV8dVqgHTcJOayZYT/35fNZLMYRdlp/APQexg6QHZkM
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
1TbkDCUGJkn0qJVRUdKgNUHnV1dXUf2cUBuk/jpVC6oKNjHG6qFT+VBOTVBh2zqhM6TzOnX5KAg0
FQSeaoiMtQJqBBUKqgpUBHSFQAqFs1zpVEaoVVC6gxNhQZqiI6X3Wj1dXmjycp6uNCRcqKyXMPn4
dXV1dXV1dXV1dXg/PV1GOZZl7tygHUA+7cZZlm/rbtr1GuW/g3zLMvduUA+I3bjLMszZn6urq6uo
/juUBCgIVC6oXVCqoK2ml8ZQ/lREqIjoMvwz50qgxUKmioOjdMw6VQqfyoiUGOvGKBBUAZI/VREo
MzVMFQEHSfyoX9jFwx0qhU9jzPHE4nAHSdKoJVC7TgyeTVCaoTVBSoK8vs+PdUGKhc+Pr1O/JqhN
URKiI82Hf7qg5UEqgzDnOoEPdUFKhVURKiJQbGrv3n8eaoiVC6gQUGcphHmqDDpP7eaSgxVESoVV
Bh/e6gXMs2VQUqF1QqqLlCyoENag2VER/KgBUAaFAhgoXdXV1XSCuJFz9XV1dXV1dXVgcFhcJ1dR
0qhhUI4TC4XCYTC4XCKkdUZKjDCYaTCYTCYTCYTCYTCYTCYTCYTCKidUHKjzCaPjCYT4+MIqMlRk
cuE+PjCYT4+MJhPj4wmE+PjCYT4+MJhN/lhOrq6urquLq6uq4kQnFHV1dXV1DJ1e2IxmB6urA4zG
YHA4zGYGocBjMZ/hxmMyWamaZXv9TZrJYzGBDjMYFUA8YBQWKCQ2T4VAYcZjAhxmMDMqLFBk3Bmr
qzAcZjDkDjMYGb/yTVqgqVEPIMZjDEMTGYwxFSMqCFAuoJDJUJyo4OcxMZjDEMTGYwxFSWqc1Aio
OTGZyeZiYzGGIYmMxhic8sYzGKg4OLxmMMQxcZjPvk82V6urq6upVjH86ZvPLW8qsZVjwi4FWKqx
eWt55a3lVjKse5lWKqxOWt55a3lViqsZVjKsflreeWt5VYqrFYqx1WPy1vPLW8qsZVim3gMIY/La
tqHlvV1N55a3nlreeWt55a3nlreeWt55a3nlreeWt55a3nlreeWt55a3nlreeWt55a3nlreeW9XU
qO9uXVQ6qHP36VQ6qH3blUOqh925VDqofduVQ6qH3blUOqh925VDqofduVQ6qH3blUOqh925VDqo
fduVQ6qH3blUOqh925VDqofduVQ6qH3blUOqh925VDqofduVQ6qH3blUOqh925VDqoc4jzVQ6qHO
c9lUOqhzxzCqHVQ51nWqh1UOep7qodVDnkc6qHVQ57Haqh1UOfh1qodVDnoe6qHVQ507lUOqh925
VDqofduVQ6qH3blUOqh925VDqofduVQ6qH3blUOqh925VDqofduVQ6qH3blUOqh925VDqofduVQ6
qH3blUOqh925VDqofduVQ6qH3blUOqh925VDqofdvVRCqGyWQVQyqH35hVDKob5/FUQqhs7vVQ3o
b+6qoK+Mpv35TKb9243zfN83927flMpv35TKb9243zfN83927flMpv35TKb9243zfN1QAbt2/KZT
fvymU+N8ygAUACgAUAGVye3KZSb4ymUpl96gAUACgAM7d885T6CZAQmryFrWt55NUITVNUITV55a
1reeTVCE1TVCE1eeWta3nk1QhNU1QhNXnlrWt55NUITVNUITV55a1reeTVCE1TVCE1eeWta3nk1Q
hNU1QhNXnlrWt55NUITVNUITV55a1reeTVCE1TVCE1eeWta3nk1QhNU1QhNXnlrfjxN/HbQHB/fO
c43YI3zTLfvwWC3ccbt3HG7BYLfv378Fgt3HG7dxxuwWC379+/BYLdxxu3ccbsFgt+/fvwWC3ccb
t3HG7BYLfv378Fgt3HG7dxxuwWC379+/BYLdxxu3ccbsFgt+/fvwWC3ccbt3HG7BYLfv378Fgt3H
G7dxxuwWC379+/BYLdxxu3ccbsFgtOIxRk4LBbuON27jjdgsF6y+ntgsFu443buON2CwWKwuI9sF
gt3HG7dxxuwWCwWvA68Fgt3HG7dxxuwWCw5j+O/BYLdxxu3ccbsFgt+/fvwWC3ccbt3HG7BYLfv3
78Fgt3HG7dxxuwWC379+/BYL644z+S44yeCwW/fv34LBZbAcf+RwmJzWCwW/fv34LBZXCcZHIGLp
ODBYLfv378Fgslxxm8rxx/4LBb9+/fgsFl+OM1u443YLBb9+/fgsFu443buON2EwW/fv34TCbuON
27jjdhMHvBPvwuC3ccbt3HG7BYRm/dya5jbuON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu44
3buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu443buONxrmvzzzya5r7u
ON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu443buONxrmvzzzya5r7uON27jjca5r8888mua+
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
Vx/POPx/POPO4/lQFj5+cfj8fj8fj8fj8fj8fj8fj8fgTSLH+xqY/HmoamPP4/sxjzUNTH481DUx
+PNQ1MfjzUNTH481DUx+PNN8fcqW4UQipIuSEXJamRF6pwbWcOBQBqAM4DgUAagDOA4FAHYtUAZw
HBJe1IHAcH4KLk6DV8USfhwHBe1IXtSBwHBe1IGrhtP9nvpQNm9e1IHAcF7Uhe1IHAcF7Ughh43I
3DsBe1IHAcGdvakDgOC9qQRqMm5M0YXTBwHBlMocBwZTGmow49x6sx+UOA4MplDgODKcnKJ2fPCI
yhwHBlMocBwZRLxwDI5Ppy5wHBlMkcBwSrBBCgtw6xBElJQWKC10KC5QXElIkpKC1QXXIhQWqC4k
pElJQWqC1KoLFBcSUiSkoLVBaSgtUFpJSJKSgtUFjMXh8eSLS6Yi5LkiLkuSIuS5Ii5LkiLkuSIu
S5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5FAus5UJyhOy0KE5
QnXLcqhOUJ1y3KoTlCdctyqE5QnXLcqhOUJ1y3KoTlCdctyqE5QnXLcqhOUJ1y3KoTlCdctyqE5Q
nXLcqhOUJ1y3KoTlCdctyqE5QnXLcqhOUJ1y3KoTlCdctyqE5QnXLcqhOUJ1y3KoTlCcH5UJyhOy
HgoTlCdPKoTlCd8MUJyhOWkoTlCdP0KE5QnTblCcoTvbAKE5QnfBKE5QnbLlUJyhOuW5VCcoTrlu
VQnKE65blUJyhOuW5VCcoTrluVQnKE65blUJyhOuW5VCcoTrluVQnKE65blUJyhOuW5VCcoTrluV
QnKE65blUJyhOuW5VCcoTrluVQnKE65blUJyhOuW5VCcoTrldQnqE6eZQnKE5wKE5Qmr+hQnqE6R
1Cb0U7eg0g/8R//8dvbSlKdvbH//xH//x29tKUp29sf//Ef//Hb20pQeemP//7e3//+m+MgIiLwP
//0v7//5Nl/CI06Zo/9r+Xb2+URERER5dvb5eXb2+URERER5dvb5eXb2+URERER5dvb5eXb2+URE
RER5dvb5eXb2+URERER5dvb5eXb2+URERER5dvb5eXb2+URERER5dvb5eXb2+URERER5dvb5eXb2
+URERER5dvb5eXb2+URECoAcf7LPr6J/r87cLg1CPju3twuF7fz87e38/O3C4Xt7e3twuF7fz87e
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
mdu3JVCHel2ZD//toR3I31rPl8udmS5yPM3Hx8ZZY6I2c/eQ+v7M5Yvvnbt/vjZmMltZqn3/vy+7
By4JmNNQ0zJ9cdj8E2fwk9/cyDLx5k43GeuF48vbEGH5+mGweFwXh547VjuZJPDT69C3XVEuBWyD
epOj1sibjojT0X58ZTMndnsrkNmd9WU9vvLHVn//Mfua/fqbZqZr0/+84TpOM5TvOI5jp/sjq1Sy
5PIHQc50nWc+WO48Ml+6tWjjf+5zNnNnt+T/r3dv746PHEGQZ2Gwnns/J9+ro5xfGC98j+bpugUG
AZ5kYvVq+fz62Sy4wyzPMHFGNjzB8NXxmPn5l04kxDQMHEmJi/TSFm3FmUZmNME0DHxWDNHD4IwD
GwmJMAxb3oJujYYPkaRpZDIVq2uQyBpGkaRpZDINq1uQyBpGkaRpZDINq1uQyBpGkaRpZDINa1vz
9G+bRmqAH4na1rfjcaqgCNY1/3e1rW/O82TeNg3Pn5a1rchkDPM8zzPyGQa1rchkDPM8z0GfkMg1
rW5DIGoaRpGlkMg1rW5DIGkaRpmZ+/TWtf8/TMMrCzxfSUUP8JdxenpKFHMnp6fG0qUYBgAAAwCB
AIiARGNF70IaXQMQKUa1rUUoilGta1FKIpRrWtRSiKUa1rUUoilitatvQwlhrWthLApYa2tRSiKU
a1rUUojEDWtaiIiIiNa1qMCIwga1rUUoilGta1FKIpRQRElFKIpRSkRVSilEUo1qJIFKIpRIhERI
hSiKUSIRESIUoilEiEREiFKIpRIhERIhERIhHOdE3n+9GVUD3jVUQfgqlVQUbPw6TB8f1/HDjt2H
BN2djP/s7PHDHCYXZ2dme8cz++fH3g+znJmn2dhpTdnYYvtk86Z+S7OxJwHlkvjFdh09A1MzBy9B
0dnZpMQ6PjBmV2dnl5ZrDKgagVAT9+fZ2dnZ2dnZ2ZU/6qAbs7OzswvZ2feCyK7w7Ozs7Ozs7M9x
94Psb2dnZ2dgcf+2YPs7Ozs7OzsyuBriuzs7Ozs7Ozs6FQj2KBLs7Ozs7OzszWGm47Pzs7Pfjs7M
N++ZLvKTp439nZN2ZDO57C5Qzm5k44ljskwXZ2HsoAMLxKeHZ2dnZ6b8QPZ2GwHKnYcn77V7ODwM
jswp4HweHn49nZtPj+7DBw+E/Q/mvs3ZunZ2Z0jMx+dNMxTiyhyuoBcFjf/SoCPMyjv7PvAmf2dC
oK+nZ0aS9M77dm9hwy/6x49gf3x2ZT57Oz519hz5POYuVnZ2bMoPZ2HCz809m5uYwejy4q3s7P7J
digE247MHq9TJ7DlUAXZ2dnDcn0BD2dnZ2PqrVHQfE3j2dnZ2eWVZ4HGYHjkOzs7OzHnWYBuG2Hs
++zs+/Nj1GSSL+7Ozs7M72IOnSaRm+HZ2dnZ2TKAfZ8I7OzsjsN7j6yPCoGk7Ozs7OzsOwfnCfnZ
2dnZ2Z/JntiWdHZ2fXr2M6KGadX9Wfs7Ozs4/sHh86A6f7s7Ozs7NBz02N09nZ+cdmjyzGDx2YUA
m3s7OzsxRlbTCxSgPwuX7Ozs7Ozs1NQzb8c+nZ2BBgjvH2+J+zs7OzJ/wM5J69hz9nZ2dnZ2bkV6
MVH7r7Oz+0jK04Mlp7Ozs7MLL+fpn6uw8+zs7OzsS/6gPfo7OzsVDfgcOo5fyUyezs7Oz9wv7wqG
THOgHZ2dn2/ZSos3M8+zs7OyWqBPPOfHZ2dnZljCOA4/PZ2dnZ2dm/o7PjTHYaUdnZ2Gkff0eCoK
42fXZ2dnY3Ayjrp2dnZ2c4D3+EcfnkZRzdnZ2dkmb7Ozs7Ozs7OyTT/9hQtyJNk8DG9cl2dnZhj2
7Ozs7Ozs7OzE4DGnRi/Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz
s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oz
s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OxUF9G/O5TDi3s7Ozsw303H4TI
+Tezs7OzVn6ZrNGFryHZ2dnYDJc1fHdEnZ2dnZzrblR5MPO9nZ2dlc7/Akmz3Z2dnZgejdIEOKzn
Z2dnZ//+vYzw7Ozs7Mr2dnZ2XSR2dnZ2daQsu7bV3Z2dnYnse+bz2dnZ2XVl2/Z2dnZZcibt7Ozs
7Ou+E132dnZ2W9vZ2dnZb2dnZ2WF2R2dnZ2DfizuT9nZ2dnZ23m8v2dnZ2JHZ2dnZfF5vZHZ2dnY
9t5Lw2dnZ2ffiqEOzs7Ozs7Ozs7Ozs7Ozs7Ozs8NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d
nYcfQoHNXPR0Yzd0eGG9CvgedtJRO7w+8H9/uZ37xMrxsyPleJPTb9+j4IOKyckj5PaWPMLXhps3
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
8ydhidnYl7Ozs7EvZ2dnYlzeZ2cJezs7OxLgONmhL2dnZ2JajXal7Ozs7Eub+Oz8S9nZ2diXoH6/
kvZ2dnYl8qa/xL2dnZ2Jezs7OxL2dnZ2Jezs7OxL2dnZ2Jezs7OxLHZ2diXs7OzsS9nZ2diXs7Oz
sSlHZ2Jezs7OxK/YXYl7OzshL2dnZ2JfH6jSlLstolrSyZLlR2Y/T9dA4ncgzg7cJ5g+9XRm8dxO
E9tcEDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7MP7dnZ2dnlP54H57Ozs8jI10Ls7OzIANPZ2dnZ2fzDFOemX7OyQGK/ezyXMKF1MP2dnZ2ddb
47Ozs7Ozs7Ox4R2dnZ2dnZ2dl67Ozs7OzsHsn46Oxd2dnZ2b5TR8Mwf3Z2dnYd/rL9/KoWyBy9nZ
2dhr6ej5ymaOo/OzK4ExDqMDI/vYoANmrZ2eFkF4Yc8NZx7clydf2ONwJ5Kjk2jOLIGTJjTizpr0
Ng/fTAHsb2LVIP2oAOckf2KVDBo1MLAdB3cm/9Kgg1qnF2NMXs9jIGkFWqapWXlF5QG8XM5JiH9A
c/Z2XnsW3m8jeezszHiHoyPQ82E7Oy89mOvN5vPZ2Y4Jg4nPHCPRyeWRUBk27O//vlz3cycWBv9k
8aYWWOLo9/wjIOPF5tQAeeQPUCoFxZw9HR6jgzCMQyzKMXBZk7jWzxxHMcu3I9BhmlgFAWbhq4YH
QcvIVRpmjj//c3vZUPY8xsFrwqoUofR0HF/+3woBq0NrAbujCmh5GedZ5ZPo2mF+e5hYLoNc61Q+
fEled3id0+OyGNxfubZx4uEtt6vFt7rW9nYanyzs7Ozs7Ozs7MleG9j6Ozs7Ozs7Ozs7Ozs7Ozs7
Pns9uzjs7Ozs7Oy8Xg6+zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7H9Oy9s3Ne5kNbeezs7Ozs7Ozs7Ozs
7Oz87OzAbt5hfWvIdnZ2dmZ+8579Bh9E3Z2dnZ//GXlwvh2dn12dnxO399sp2dnZ2dnZ2ZX2yZhm
r75Q9uzs7Ozs7OzsMU2+TrNBB9dnZ2dnZ2dnYl6DgNPV2dnZb2dm097xHYoEbzebz2difs7Lzebz
eezsR2dl5vN5vPZ2Xns7LzebzeezsHs7LzebzeezsP7D4f9vJRe1gSqBDBdnZE3Z2dnZ2dnZ2dnZ
2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dmvV2dnr59nZ417OzRhuzsB2dlJOzsyPz2dnxp7Owb4
7Oyfs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs6LeySbsTr5OzsA/YSzsyPYxUG07
LkuTs7Lk7Ozs7Lk7Oy5Lk7Oy5Ozs7Oy5OzsuS5OzsuTs7B7C6Ozs7OyOxN2dmzVXs7OOzsbpXdnZ
g6ydmxv72XJHRerkuTs7OzsuS5L3LkuTs7OzsuS5L3LkuTs7OzsuS5L3LkuTs7OzsuS5L3LkuTs7
OzsuS5L3LkuTs7OzsuS5L3LkuTs7OzsuS5L3LkuTs7OzsuS5L3LkuTs7OzsuS5EpZrw8H+9HPR2d
nBeXZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dn
Z2dnZ2dnZ2dnZ2dnZ2dnZ2dldtZuzs7Ozs7OzsqPx/9nZ2dnZ2dnZAPHs7Ozs7Ozs7MD5eW3s7Oz
s7Ozs7GLOjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7GdnZP0dnZXs7Ozs/PDsZq/5Zuzs7Oynp
2bR+AeHZ2dnZTs7B09nZTs7OzsD2dn32dnZ2dnZ2dnZ2W9l5vPZ2dnZ2dnZaEHRA9nZ2dkdnEXns
+uzs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebzeezs7Ozs7Ozs
vN5vN57Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83ns7O
zs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83ns7Ozs7Fy4uy83m83ld2N7OhnRHR2F
ebzebz2LOjomZtGL47LzedHnJlNUWFbb+DL0WOxLfNhLyZ/Sz4DWj+4DDNX88v7WYF7k+r78wdgu
IS54r9ZCfs7OzsgPNeibdoZ0dHZ2dnYQNWuacG2jB8Ozs7OzoGf8p0ZPLDj9vx2dnZ2A+Ozs7OxH
Z2dnYjs7OzsvXZ2dnYl7Ozs7Ozs7Ozs7Ozs+I4Bok18VC0atB4+mrZ7juFGQwY14S7ir0Pe5up6/
P3KGvj/ef3gdE0/3evstXvQSmj23fC52UDqnr7i+/0/nLoZ0ayBFX6In5+shv5+0otCHojomp0B6
BqDVPXxAwX8kFKM8dHxkxl5RIwehFiGJdg6f29SR0JdHj4bF0qCpsdnlICXRJ0Mp0QBnpp3+IN8I
2YRZy0KPno8pg/WrmTzymCklk+W1KRH0jkGDQuqXjEdE/3VfRdVt1p2T+m386PP9APRQvCkkdHQG
otq9W5BxKvQGZkceGwZds/LA11118dBce+mWRu4IPt8kl1+mnVRZGnc7kMz7PjZPhNkbaEF55msp
8fIeAV/9IfgHh+OyH6GVjo1tEaMcVtQUaBy4h216At9dJFq+ZR6OL3bIS226cj4aKENfB9nn5152
TbJqkzwBJ5877V1ejpGG/VaB6C6OjocugRm6P3+Zt6GUJcub0RKHcD/hd0dHR0dBdHR0Sr+XbXm9
x+zzk9/3s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Oy/K7A7bQd
nZ2dnZ2EXPBJ+zs7OxnZ0fUpO5dnZ2dnZ2diXs7EdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2
dnZ2dg9nYQyrn7OzsElk03nlEXmt6ohq5KKOzs7OZEfQ8dnYUnZRpJexHYl7OxL2XrsS9nYlvCOJ
pJtF7WBTs+p8GVb2y5XuWrkumOehKkpbxenvUXuxerErle5F7ZGy8Pe7Av0I0Np0FN4pR2owTNPN
7kmzX8c9g1fo5ebiv5k9nZ2dnZAQ89E+3Wx+js7OzsaDX4TbAbmAp6dnZ2dnQOz+p0ZXMmJv+uzs
7OwH12dnZ2Jezs7OxL2dnZ2Xrs7OzsvXZ2dnYl7Ozs7EvZ2dnZ59HHGiXVI0LaBaDz9te3ARtHJY
UQ8I31r0dF7qRet1PZ/v90819P7z/MFomn+0v6h/DAiVZ4RgN/07gYhqNWyuAF9/t/lXoB0a3BBE
47JvzJfE/8lFoQ9A9E4HD0UqDXsr5AZTo8ilHZHR85WXmQAklYjaOr+0R0XrT5I8dukqbOgHpJxL
qk6AM6IYD01fHiD46NuGWTNRyj56PPkP3rmk9ctg+JZPoNSk++eMMudvkvh9n7VdRtdG3Z6bfzo8
v6lOij+LJB6OjltAtIg5F6Vr0BnAMnhtFGjbs5ZzXxr4ydFZMBqlkrv5B+vlNftr1pdW9cTpZuja
j72z4bZG6hBLZO0DPn5bIBuQ1B+GeP67BfoZXo6PFsDQBCtLijeOgpIdtegLfXURa/mUejhLrynl
pZUa+PRt9fSs22fZO1weIJPOb4tXV6OkYD9toHoLo6Oh+haNJuj/yDN3QxhLlzejolDuBkIt6Oh+
jofo6OiVfz0NrNb0dn385TA9nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d
nZ2dnZ2XwzUDVZN2dnZ2dnZSksw2dnZ2dgX6PbZED2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dn
Z2dnZ2dnZ2dnZ2dnZ2V7OyldqyOzs7Cou0af/FIrSwrx2dgA6ugPZ2QFL2ElpehvN5vN5vN5vN5v
KOb3OL3OUDfLIea9rBqtvaHeb3Lzeb3Lzeb3Lzeb3Lzeb3Lzeb3Lzeb3Lzeb3Lzeb3LzeUqoHm9l
QonmyOMzO6hymcaqgjO40vMwP/203W7AHj6GkoLFBRUTrPs7/HiZUhGmoKa9XgYRimyIVBeEz5j/
2DgN+nYWfPYZ9hhnH85aY7NWOVER54CoXOE8NcHtq1b90fGBrrpPxXq8PavR0fOv8p5gyORC+jSc
R0ZTif06KT9GibokNlQWqAHQoIcd64jI45NrkxXuZk0ygINM0lGDjeiuawCgsVIaoNVCItjV+KlV
QK+aoH25/o9/46T+2f6ovz0/6YnmoV1Adg1BdxhzG8sjHuqFGHkeu0CgVMkBwn/Jkf/SYeN9zHbN
4z4tUwByPicyhB/RUCigpUCagTOGv4eagZMLyNLCqg6FAVXWLMufeSyrMWZxwTKgMyDUVGigJVCs
fubPyTo6KGH0dET44scYmAxOhQHHAdShEzuzFYgx8+dXgf3RuAD/zGbyH1qocSoeNsafigMNLo+t
vRhMHp3k5Y/AYvVTy864jozWckXmB6eBn+ec2HDxiMKqFP7w/8yYSgF6AM11Zksrlz7NRUaKgMyJ
v5QbmMe5o/HT0ebQT0b+GAoA/A7FCCoFMp+D+nmoAnqMqocVA+uOMHoYYf6fyoL3Yr1klM7oMk0f
JzN2tLdQz5PXZgMVKEwcRggAzHRm8hhML/gxZjKjCfNaP06pTj/uiYw/oxcp1nVGe1GIeSgTVIio
Bwp05fGfgeinQqD51Qpn9nRJg8YYZh/f2ZCgHUAxkcLSAahOYmNwIdn5V/v7+8R//2Gx/39/f39/
f39/f39/f39/f39/f39/f39/f39/f39/f39meoJFBJjfbZnW5D7I5ujgTHwWPx2T5b4HLuOJUGKg
PKeADK9zLUDvn5CzTziMTnw586/FH3mtfgYOjLfrfs4MnoVAZ9KBJQPQkrI67hGLtJiB6+uBvCSo
BlAICU6zswvRz9/f2oJZTJUEqgjxpkc5wMNOQOQ+9R0hD/z+n7hjAxH35efjrOA1RNs4b7w5xnPh
v7dunVAKoV/VQWeeUH0NVzU1S6NWj2UGWlQTeZcYJ8EDIavrLmBpNDIXlUIMuPSqBN6YMYLO7897
GSchx43Xy8x25nwzJ1lqlsy5govYUXSEm7TJkWD13PbcF8pDoft67bxeURdpEPdlF5SU9sXRLLFq
gIUBPhwoCVAT8nCex+HeoIlBEoIlBEqG9WNVDaoRVDXrsn5+CZzsyH1/5fn9/v1/H8MMwTZ/vHFa
NX5jjQ17RHO7uP/ccefBgCi5ejTj9CTBWW2/7MgKZPLvkjrGAlsi82jYRXKTxdQ4pN7KGLHukySw
OswfYCQRlmRgKIvPjdZH7OY6dHQnK8OfkWHKfvZc5SaYwHjhsAny39eej/TJ7Lw8WFaMUhJ25duA
wRoprvXpwGsPuoC1AUoC1AT9nIeJ4nioIlBEoE9nZ1MAAf//////////9CoAJTsCAAAqpmtPEf//
////////////////////iUESoQBIqEftUHyqgzZb58fIfUvnZs6I40ZRNLzTxNJQEza2GwDUe0dt
tkJ098oErI7LbEXzbCWzQe2jxM4zXYbANbBODZoP7OZDfv+f/kwv7/yjCuW8KhLfedf2qC7Y9BvP
hg+iJTG6+j/y0f2V/+gf9J6LykDGw6N73j53nDs/JMuzQangHCmJi55dRe3hpUBSgIUBigKPE8Tx
PFQRKCJQRKCLKKhLefioZVDWBw/3lP5od5x4I48bsb9ZuboYYmEhIsMvCzZPzmymXc9D3PE5fIfM
zFAabGrwpzroY+v/yB6ZTX0JOWyHHuZHR95iBuAfjZlc1p35ZF10HXIYhpeeJtwuM4zpx5a1HWnj
4yBznuZPtCLvR5mS/7hkmk52G14mHqzjy45QDGAe53/+bh4vy9hpNmGOAve9mXBkf06cgfR80zzx
DDHvZV3L23d7L/cyqAlQLgTjC2Hdy1+XjoMQ1cJgFAUoCVAWoCTxPE8TxUESgiUESgiVDHtjVQ0q
GlQ0Y/DThDkm5vb//QnK37qc2rx+sT4GJAMJj+chj/E0c/p/sMcu05NTdxwZRUBqgv4VCR+7JdJp
SmQDXgDK8PBQM61Bj6SgwX9qYn5w3OexGjH5b53KgLVcmo6s79+OvNhzeCHwxRxNy8uP/A5HOfcZ
g6+dEtl7DSLymRfKSL3my8XsQoi50iwbtdbDpKSkRFwXyNl8QvG2LYeKXURfagKUBCgJUBJ4nieJ
4qCJQRKCJQRKhroMdUMKhFUMYvI//IAyy3U2aD9tysen6avuoBP+TBZQ1sNi/0Ga+JPz/pgW2aST
3hPqSYvZo9b7iSAFft4urUiElJSLzcF83Y3zfLQYcwPfwvakTcwxghOb5ymWEH7fqoSPs5YsvlNf
OofMbLx0GxsMmP/L5T96P38KHsu4vajet4vHbeKaBvz5DljO8zGEDQ+zPDDYPUoCVASoCVASeJ4n
ieKgiUESgiUESoP27z8yioP+zun3U48Pnl/qpdGytOPny2zeWPM/oLAGZnSvajliL8uotXQVwJ3i
7urw4xUbHTu5XV+9ZW7AZ7mmOx2BModcHbL4HVnf/4yuv5ygJtDfzVp9XPzOxq6PtUCFGniSTC4P
gej+yHzlv7hhaXvZiQ4dh5TXf8cP/Srct6SmCYk+c0aNOvSD1wXqoCFAUoCFAOeJ4nieKgiUESgi
UEX2qBtioPVDKoZ0mRnNmQCcnicuGb9f3/9+GIw2nQbGjVn8P+fBxUeLslQNnjgPT16NJnlew1BA
YGrxpb+4K8mfT//lQV1aKZv4k9TI6AnEmkyxbjpl6DgfccHBrY7wxly3gxPWb9On8SYe6uJLayY5
1QUa4iPqZnOu4jrNT+MIG6IHX6qAbFKgs8d1z3sJI67tzAOCsRdEceWVCp77VxgsuwLKbsgqDj88
TjHUDwMQ1depQEqAdQDqAk8TxPE8VBEoIlBEoIjozOeOhUNKg4z92cPRns3J5f5znjJkv84TC0+m
GMPVLpp86jN0y6jNNv1n9MHsDraY+KzRx7N/jX6yBx4718smeQmrjXwpf/9kjhxH7lTnueh0+5OZ
vWkS6DvzGfOG5zmqeZQMIuRBQKRexKikJyTXd11vEReykXV1W/YZWL+tAnZoDBBeBuB7uwlAQoCF
ASoBzxPE8TxUESgiUESgiVDN0qGFQ0qGbL4ITt/TvXfLzVz3Rmde2+DCxevHmhYDo3Yn30Y1uj7O
af88/z6+/0P79ZA4MjnpT00dFVAEoH2KA81wafM7IPmTTHx/sn+P7f//QTgc65Pp9HiY7ZdBh+Xk
afnpkNby00+Jz5E7P74/93PyAH/9PoqdTnBhNHmZxx6tJjeOgkmEQh3F7mSb2L2XwQkkxb2FdRD3
zbfsFAkxyaNG8aKlQVlb4TrmVvm0PKQyKdaa8jAqAhQFKAlQDnieJ4nioIlBEoIlBEqGVQyqGVQb
8d1v/kjwyFmQnHKBzNc7hpvbCYXE+nsHF/hibMHMZGRm/By0037ZvyuY2+27W3/yHPv5mMaZlmbi
sT4YP9zOY8NO77yf7+fk37vbTJ5Td/b2Y3H8SZATAMmXO+PgZGO07vn8y+Z2/n8YOY37/zJ/vxXd
/cb9EuPw3r5+ePw0uczP9su8DpT2Qk2DXrK6FyDUbBi2lrxYPQxl5bdVDzyx4Q9vWoCFAQoCFAQe
J4nieKgiUESgiUESoP/rhVDSoaVDO85PjdkmaZQdE6gOVAEigU6NvyoAzQyemUw92G/eiGdFZslh
I3GBv/9SoDr7ffhxu0qB0zdPkY3rq8PWQAMqYH/8T/H8Dj6c6S+c6zOrvLRo8jGNby0yavLoblvj
oPqPicH/u8dn+qC1QGqCjrlkOh5WmL5eJqeXiRj+ioAjTJphUA5syw6kt2KWxLZezYuiSL57LwV8
XJF7EvhrCv4uvuvjrv3uTounSFAQoCFAQoCDxPE8TxUESgiUESgiVDSoaVDSoa/Mt/nH+qC31CX2
WY8JDSM/DGBnTdrgrrVHBkz82JKQykv9uyn3+fv9+bt2Tym/+rn9Bh4tkmjHmCY5k+Phqxxo+Z2f
33uzOa/fv7/Zh/cnuCcGim/7ykkmPx5jmPjsWYZo+Z57dPh453O/yP0MfuXg4N37NvymUkkx2Pxj
NJhGh56ccY5k+HjmMx+/f1tOv92y/OS/PzdvymTMgyfTkwf8yDRxuLN0xjbNvP/JxHZt0+Z2fu7I
/eXyeRzN1ebOsWBECcUiHvYsUWJ4reLxccEJFF7NXX7WEi6YMdV83mxQDqAjDalAQoCDxOA6TvPF
UEmLisdIEAz+RlvP0YM7sgYpnKCP/zKoFOP824xuKxqgiUESgiUEX1kVRb6e55+Ocz/QxQDdH2YH
3glAr5m7hvzKGkm+vLxz/0dnR9qAZUWfn1Q5FQGoCAGZhPvz8zv3Yz7Bmfzy35XL5PZlcruX6cL4
68rwEdf1iPjoe7s67JeAycQmEM/tfKoAVBioP+dfhjffKwqCPhnR5a9BHAw6FBEoIlBEoIsn0Kgb
ASBkus9lFAodO5Uteh7fO5UEHrrXmthFA0oHMpm1CjKPiFQDqgA1lQEqn1U88dcZO+byMXkXv1jQ
WBb8/P7+nEcU3/GBnPM1vNUR85jJHIcedONUIGPJ4aN0v2zFKjHb6euEn5+vmTfjVR4cBkT+HQqF
FAEZX0oIlBEoIlBEcaoqMhQF9Hpg94cdnvw49+eVHJqZ7J4zDmGoIVBtrVBu/D5dUNHVmvzeanp6
KHnNKA7GZD837d/QqnuuxVKKp9VQW32h3spcKyECN2n+f39+fn5/f04jiVCaoCVBJxHEeNfvJVOs
7jtxfl7p92B37f76+FBEoIlBEoIsmfZsmfg8Zg96oCUHSgTVI5x798x5YfDmGZGDNY4c8Aw/w9N5
gqmQyjvyeD1mQoDg5NQAGHk84oMvxUP5z8MgOvHGoZHpjM9k/HHKlxU+HVnN+/MqirPm2ZGM1/hw
4BUVZzfvw5g+SgmVBu82egz80a2v837z5MFUd7+g6MPjDZwagkw4f7OHoqfD9MHf+bzUUJqxQQqD
UyMH0bcrnlR2qAN5x5Mw1CCd6gCVUCQqolVCqofn9/fn5+f39y+SOI4jh1UyYE3OH1eP6m2qCJQR
KCJQRKqBVPqqBVQul+f39+fn4/P3LZw4jin2/Uxi6g5Mx5lQocOYPw4TjOEcFjtmzN/mrM/xiUxJ
j43o8Q6jsOrKqiswTIMAxDlOXd/GBvD+78ptUESgiUESgiVUCprVAyoBtszx4ZDK5zMZfNZbLKCJ
QRKAgOI65PjDYPV8exkMwLOgwPjoy3tN9hIQlojoVB6oZPbACBgGNEFGBm/2yAWc/2fzs3v9Mm37
zgMzBeV3k//2wvrtxJme/ttp4NBmNeTymGM/b/5F9+gHGnAFGU2MzOQ24PGa8EFoS0QVtcES5oei
Rjd9GMiScMxZM5tgMjIX8wAbsiT18Jv3ozHw0HxbqZiQcCDF4DLz8Nbh8Fg+WtLAYPBBDgcF68tC
2efZN5+vnp8fPbu6OOPn38NUnj75DIlzlMudmxGSyORXes3374LA7/utfXy8OgsBwMV8MTDVumJg
Sg+ZNPzJ9fvjx9bppNTS2+/iXQUtScuC0T7SIq8UJ8JhPTbul8cNiMfkslkslhfgOIw+CaELcHgs
EHyDgsFgmhnDs2bJ/T19fPz9PnbJxx8owHj46/f3zORIvnM4Lw+Ag/Wt9PKnGF/OjewLfBjMlksl
kvTf+e2E9d34GnjJ7R0YSjCHxwVi1oz6dW7o+vmXT+fW7TqXTT+vmJV6OiQq12Vrz8dFSrWSQJYL
z8p/rRhGYbC4fJZLJZLD7g4TD4TIb5I+/P0bq4bgvXw4CT4iWefz9Tj0/n1J9e/jT756PnKNwfhv
5p+NLz8QS+/2KEno3WQhMVdLMlkslkt1eAlTf+5fKgBmdGrRxJ4jx0fWz5+q8/M8jG7eacbt1S6N
+8dDJZVtAdBbfjfQHxJ4e7AcSeozilgUEzJZLJZLTtpJtnbql85t4sZ0f7GN4+wycap/D5+uiPj8
p4YBkunSAFGZL6/gbmcuGWQEsoQyz/AC06AAZTJ/WviZkn18IyWSyWSpL+nhgiFi+KwB46tA6g0k
iyKRTYN8lUfDfkmhal8fOg9HUBnCYI+XnVrZJQgbhDH0h9Ng18pmsbS7ga1JDjI+rigdF3NU4p56
hOX5wHDQBxmGw8wWlhMLhQhwmE95ghrs2bJ/X39NXn67t8SyfeB8vCX0wOSypTZnNnluvWIxGJWY
Cb8wOGwn1+NL28/HorgeKRXxxcN6NUT8aAfUur6l/P/x4/N+yXUGu3A+ZdD6K1IpK6dm6ta1rJSr
4jDeu740eeJxZhtxOJxOJxP0HGYzDBCFuFwmED5hwmEwgQzh2bNk/p7e/p6en3ukkk+8D5eWvA4H
NZMi+c1hPH55B/BD7+jOML/P8kALfFrW4nE4nE4Df+4HD4Df+tZ4y4AejDMYQ+WDsEIz69e7o+/q
XV+/e/TrXz7Pb0Eq9HRIRV21m+eipFVkoSwfr6TfmrDtxOGxbW4nE4nE4neHD4rDZLfJH56eodUg
cH7ePASLFS7J/T3OfT/fcn1gfGn7z0fWVDhPH45Z+tr5+QJcB+9G4UpN1Na1uJxOJxO8gBqz5/8z
l+AZzRr08aPGJOj82ff3Wb72SMbumpJv31Lo3/I6AS6OhknQW74+KA+ZfHAMBJL7DPRrW4nE4nE6
dwyb9jdej1n+RYzoyLAcyfoZOPDZ4/X04/H6PlgGaNOkAGZT8yANzJnDLIDRo550bPkD6dPHDKZX
88eJ2Sffw1rcTicTiQ7/Y3MuNQ9DgKaH6rrbX52E9SbqK/aMr9+eJ2bXd+poZrtj7/geeQIDdvRV
AA5lUBckGfVPZsqoDmPQM6mqofD9tYIXPpKqK9TbAyn1FVAyHmyKoLDBjKoCNP1D6TAHkzNGbocW
uKqHHm+qom6s+ayAcqqgu/PRBlVQEaCGOZVASqgYDO0bx7DOGgwVZRTstA2Gz5k73CZvpJ+uXgEm
5LyXk0T2GBo0cMPQsdNIYfp0MxtKDBMw6B2HdqAYZ9DbmT9pFFsOjqCqDpVBCqoMD7+1e1C6Heqg
p0INHnhh0BhVQHqqFlUBNuwxMbLY0YNDyqABVT7/UL5DRlUC6KqAwPFrR0TQru6Z0lVAgcka6QVU
eqqCSAczpBiKoBL2jTGgQqocVUQoMyqA87f++HEqgIVQQaoGCHp72vsWlKoDFUAbJ3qaqixVQYqo
LDdchqP2YOQOax7QtQ0IPwNVT2dnUwAB///////////0KgAlPAIAALrG0wwR////////////////
//////+K6qgeDwDm09uDBVQNqoYLfaqE8MpsbBELr8w/PhjhwB4NUqqBtUDjxkOTQPqqHg7Gy4QI
W/4670HGiEAze23WNEaW5pINNizqbFpbKNVREqgEVQHKoMwwAymxrVQP2NH0X+khihihum1lNsY1
UDKqFoNjSFUDqUptNpk+Qfwc1hmDkuqoHg1WJsbVVD6qhjWWnVNEt93OogMNsvG1RVAQGC26Vqiq
CBVAYqgOb2LUQ6EUg6PeaGBmamNVUaHrZb9aVQZKoM1UFeiBpdB26wYhpY2INZVReqgy1pJVAM3q
oM1UFdxVBAqgEbiH7WOgwtGtkNX13SlUC1jQGluDZhobiDC04v2haBpejIB16QxJNaqhlhb+7UH/
12GCxY0sMHTNO04OQOS0qgHDEtO9TYh9MbLXcsLA2XrySSV5qsd3pvXkkkr15K9eSSSvXkr15JJK
9eSvXkkkr15K9eSSSvXkr15JJK9eSvXkkkr15K9eSSSvXktEDSDSbm3Ww6LBBtDxVQBM2jaCqoZ1
xLAcbcbQNNDDMH6HxrWgWgzGW5qnKIyz9WGJF2LR2XTFUB98O/Q9assAdaqghr9YD8D0DJDMmhiB
3sUp35MS9kczsKaFs7FCmRqBj3Ag/w/7RAPAOy7ez9JK9eSDRbDhpBp6B3rKqgm0BbD9vELMKoDV
VByqg8Ny1e09VQsQVUahgaD9MgHtDwHrGlqoCFUAOknlhuB+h36jqgfDVLIG9AbNljMQz7WEtZeZ
jTgdNyfHbJoEMjBAYttkDBNaaw6VUBuhKoCFVBL+0YqzNtr2qu1KqD25VQdc5o72xqjKp2aU7oKb
Cge20IQq5bwISoGV2JEsKcp3gtnYAUch7O25W9GLZXttCAUgi3vgFVACqgJ45qqAg/7geYf6qgQP
sOEOEOEOEORrSDkDuDkIagyWnYEdFIELWiBoh5Nrbpmj2mePG01m17MB1d93tZDmjfwG6qgAa+7m
varhuu7PEALDt0lCjcQB3j8wgGEwg0LgFFFcL39dOXqRbAO8oEF5nlttj3nBXy2uxshJz6Fo2htA
lGlhhWv6ky+1NssB3g7lSPbRUMu5sG2OShQDshDsaYbzVf0IM4hfRtj5SPlUgrGPYZASmjaFozYz
Uwvz1Po+G5pVUBqqAVRVQGqoDSDiDoDoDoDhDhDhDhDt1Kg7FVEQdhCFUCOp5aNMZQ8QzcQHjGAx
FUAeyHxdZtBskA9iCTndVQEoU7wCgVA45bzfkwiMLbbFDAUUp5qJfZUbhQsELblajkMgGQQOGFoY
JtBxeOnf+npyJBNVBEniNWwLyOBTsMOLz6YsqLg0xd0q6oQDJuX1JAFoIW7HK1YGT3C6AS0c29sp
BjJWlVELH5C3npu0edbMcNa90HcqoCVUAqiqgNVQCsOgOgOgOgOEOEOEOFVQwQ0oPsOUORrbQ79S
8jm4qgI1QPHSEQ824MkMdn0cPwPYF+9SDhZkGENEKbFwOsOUOpjt6RpxMDg1NsTkSGhRQ2JFB9DZ
UbGxWyGiGtaVUBs2qzoAlIAUD9DxaJRbCAY4bSGua1mmmTXA4Nc4ExBAEeh6IG+GMxWwodoDWDn6
DJGPF2+GjpCqAdvZt4p1PWQ9Q52fo7HtskwaUgTqCX2qoaQ8renEMeUBQSgAKGZkxagcO4ODUw8L
P6nacuPL9pVAxo7JoLPnZVUBKqAVRVQGqoBWHQHQHQHQHCHCHCHCHI1twcgcgcmWy6H1aIWA5tad
tZg3w8LKqgxVATTNpyqjLKqhfQ9G1ntvDhx2QD1IH0pVACQ0vQTBgG1cPYPthDuD5uMdsNlwyrDK
yJkK1J9W9lQfTT6Dnqx5Fg8zsZzBgsrJo7Dpgdl5VAZZVQFh0tVpsZcWNa0JgDpdsVUDaoqoMaZs
L2ERjUbzbaBp1I9twLKd7ttytQvba3C9rOyKBBJZNQMHfVuABqK3RFST5VIO2ltuUqoCVUAqiqgF
VQEsOgOgOgOgOEOEOEOEORqTDlDrDkTbc6H1YtBkg2lUAyqguwHcGh0jpRv2NM7ISH40vkOjUY0p
VBG00o1Fpxqn4XtuJr21FC6UUFNpudACGyFGmgAN7sFVKx8AgpdyYqaNK6DGvLDJ0JkX/VNNQ1BL
+A+wgvRmQ81y5XvtVbS4Gc4YNy+Qq7atqbVnh/kIDhvCe21VKH0OpZqb7bEZl+klrAZHVdOqoAVU
AKiqgFVQCsOgOgOgOgOEOEOEOEO1uuB9qqGQ63MGiQ+2XWRlttuiW9d1JF9NDLDg1kMS06Qcbbfw
HYsYJPYEPkU2nDccq3Ozs74mV3g1jUSoUCU7ahXYpYPmTRmX2jsrAxPd/qmGhkw+iBrWsTdpG+zJ
fuUDhh5XU09Epe/vdpMehaUfu5fMchbxhHoYuROpT60emg+k/RD70Pp2XOKRNql2yGJljalVAIf6
oH+qoAWHQHQHQHQHCHCHCHCqofY8h2Bxhxtf1VAr1bDf1MO7RFVBdjQw2tOZ9dVUIkDqfwQDy0ju
4qgFFwBnU9b1IPdjtQG4IK6uf7nPpjLirYYfVlSqgD09gVUBvd/oSzqqCtc7TsNkBQUhtBh9B0tW
YUDbjXHDxaV7kmoWoGDvdnbTU7IwoIIAMmFUB2maJIQ20obFUAocjIA3BlhnKoBGoxOa3HK/dD/D
zDCsY2V7OtmT4KBXQ+mLRiHVE2W7A+O9lPwdgeGpB2bwR1UDuhMzNYuCGqoCD/VFVAAf6w6A6A6A
6A4Q4Q4Q4VVBXyCqggOMO121IO0P0PBrYw0dRSY2BpSDoDQ0K2xxm8GAqgMDsu6VZ7a27RCAYKqB
e2jZDQVQCMKqhIMAMHXHZQ7229fsVpDJoOmMl/QOtdZNUDm15VQiHzrmh+0XSAzwzwwV6hqLfd0/
X1qdltssIdoxBYGSsjJ7GyvbT3KipncjEpUVtqVW22vmp3rr5KBjUUfjPEgP71vt5EzPJ17VfB1V
AIfyoqoAVUArDoDoDoDoDhDhDhDhDlDlDkDkED1hVAP311rKqhLoO4yGmsuWYMrCBlVA4fxAOEPl
+w2SHoVQHHf9rTbM2wx9GIBkEGFqbLWEGo5BVQsdNBVRrKd6NBVQVXlUAzPFkP3WrIdyqh6zYmFU
CqqBcgG8G3E64qoWIKqNQ7nIJXlUFSCfaqAa9TOH5ZVUO6DVqwQVQMB22daVQTkI1sO9AOtVAnHT
7lSvZA4BDbS3sgqBhVewCAvaj21AK4Azs7A9je89gClKrMUqaUxweCFEd9n/+ZDk9PvNtKuW9nlt
p8gQJjeD3MrVUAKqAVRVQAqoAWHQHQHQHQHCHCHCHCHGHGHGHcz92NNDJK9B4m1oOrXrOp6CGIHd
ataOx+1JPW+w8k27XtA1BTMhm2JPoOjNmsB4aEwoaFoa2XQdRabTKQadSD41bSz/D41jLAQsBjhj
cLIcOvhhNbWHFfrRtCDGDKDK0DUgxdT77D3D31Rs1n9sMfJ9ZDGstt4OEOOy7RQZGls13RNCDKDF
IO2toYzKQ2TahfvhyWQNtUSxinYkKbaYE0p5ej70QcH8frnIya+Qx5+4HNe8mIgEW5LKqAVVACoq
oBVUArDoDoDoDoDhDhDhDhDrvhxBxhynVUCpbF2xpiTWqoo1DAeAYmGPF8wZSqgjvXe0WBPUsNJ1
UHx7GoKqAVVFLQkGYlSqh0MhBEMK0xMQZGoZMYM6farHdNLTmryqCq/WhKqHrVgO6xaVUAKoFg0Y
IKoGCEKoFQ7nlVRtLhxB9kLySCV5VBVoVWtJ8QcOzSwwyDIHbYIKoF1UCkEA7pr2va/rqRBVRrKb
CHeHUqogtcFOwsLBRQoCQ5JhRRtpjJ7xSv++HNLAeJhVQAqoAVFVAKqgBYdAdAdAdAcIcIcIcIcu
1DlDkDkDuDpYFKqAVVQFf/dDvbNwcN/TWHSNFuhoWLkbvWNUZAwdQ1CgNpnPaqAZmIMAZAY1myHE
HC1tlXw/NaDeDb0HRgywywxwx9T1IPgPrWGvW1VCx1UAzB/Jwxwx7NrRWW+QZg/NZDd0WEmwMgMo
MYMfVNTa9BDb1tVQsQ/rAe4fEEL/d/u/eD31mmjXg4GttDKDJDEDG0HRQ3Q2daVUK6w16nqQfAfH
zhihjsEHVQCsuhMpCzZDgDia2tnZtOlhDNVQB621sugKoAg/g7Oo17Uv6wqoUOqgEZ3YAz2G/ra6
HDvTvINSTgY1gjFVf4PvdtjjuOY55cH3gAwhvhqqAFVAFnpaqgBVQAsOjXdUDoDwVUEaq0Pq4eqq
CENlp1BGtUDn1wM7QFVC5AOoPoOlsRDgSIKqBFVDethwhwhwhw37KqBcuPVGnRgyDJBtBldMra0K
oEWFVQS0sYccsLSHSqoYaNBamkNpVAuQ6VQfqoghB3ux6c4u+lUF+r39DbdWYX6vHRuaIdAhqSSS
Os6hqaVlm9oGiD/RBHO8G9fstms6xrJBpzqSbdrOjsLhwh5/hAMUPwMsOEOEOEOGxqWqpJ9HuhwN
qqBMNZVQ+dVDMyBrB4Boa4HQqoqVUZKoEbugB0qqMnSVUIMKqExVAoGKqgdVQO/ohw4qoQ1UFm52
uzW2nVJRWctjY2NiqCXXg12N2qwxIBhhnaRoT2GvTUFVCmq/POGhhD7OqoRQtnsPhigOAMGy2qoJ
NJSTVUDKqF1UDgaedPDhDhDhDh01VB+zKoItFQDl1HXg+7ei66zKoOVVGgYGjMTHlMO4PENTUdRx
qiqk8NBVRfqugkEkT3Q42utFZw0m/SVUDqqBhVA6qgemhvI1iWSobY2NjY2NjY2a9rzL5HXten/b
K0QGcGmGoGZpwYdjRegw1UAiqAZVAIHCHCHCHDa0TyqDoMUgHLQYaqjZVCyqpR13QNQD+VQRKoAm
5PRA5VVCAd9tBHRSGoKqFL4YoemoaAGveVUABv6qqoGTvECCKqi4MLVe9DY9LDsVUAJNeWBVByqo
VVQd6sQtToKqAxVQiHYqhn0QhraKqgVVAkqpQvaBqGQ71VBQZTNoL3tVVQXqqUg4NF0BvZAyFUI6
qDnRdLDDIB9KoONNDh1NpDiIX1VB6qhTUNV0EgHGqpHVQU6IHLrdsNMPtVB2Goz6bqGjtIegbSqB
5VA+qgeVQPL2FtjY2NjY2NjZqmoa9rzIj9M52GZIEA4Q4Q4Q4VUDyqB5VA8qge2pNsbGxsbNTbWz
VNZ17XmXQHnpDVdRzSqlzQGMONLRdFaNd149rXzvdZ9F0sN7RrAdYd4cocIc6qBcgQcMjQQyQ4Ln
dhu7ietBNoIcIcIcIcKqB5VAJoegh3N1zUGNh1TV9T1MOEOHWM/Z7OrNTc1uQYp1xsdPUkGpq0dx
PGTYIT1/SNNZ2mP5PL+Icod8nngh/z9tmt6zlvaSHd2+k3t7X6xrOo2Q5zYYiAcTR3d1Ehdv1o2p
nbdG1m4jouMaOHA0toc3ftC1LQ9c17WWCfVn3UzPWWt85f+EHxH3jOXn5BgsMESQORkcgfIT+pkf
Oa8jbT/wlz82mCE2HfqSEfb2xu/+yj10hZaUku77TGfddHufzCVw57FmyknZQRSTTucctlzUcqlX
bt1qIS2Nl2vWGLzmsII3kztjUl4gQjM4ohi1NhJNP6R56sd0ezayn3dmeEpQmknEYxhP/FHrq2/n
/UZ+QiL169evv9vb2z/7NrpBCyi0pJJNLSf/XXR7n/5uXEj2rVlJOzZRTTuJ8BRcRt+b1sCbwih7
NyGDsV17d+IiL169eaqdsbLhB7TD7kggj1fufbGjvjD11Ywil2l9LshYsfPZtPwyn3fmZm5EJZTp
CtxjFw8oo2lPZ2dTAAH///////////QqACU9AgAADQ5EqhH//////////////////////xIYQIRD
/mIvXr15pf7ZeayHPr2IRs9EGlI97vnjoyHR7n+7v4spJ2ej3eoTpFg832U3hDrBBL4l2DpcLN2I
iL169eS/2mnd+chg3sEK9B8/P2c/RDDv1iYSuRRDu7mDWbH/2MH7Mgfu6ch71xPyCfdm0hnNUYYC
lXyWOIiL169eaYuJpJ3YYLM2rDL1Y7q5/Nwdv/VjpojveA5zatWPp9Pk+Oukkr123iynHrHRBC1Z
J8r17/02shZtWkOkkr163hhR5jab2aiKi9dvXkvnpO4l4T86h6qugkuOQNcCE8OXDlXkrt1UH2lQ
5SSIGwQ4+MNXzIcKINL0QNEjmvUQdYuYqmR818l8q/HlvyqscGXxCr8EMkCD/PX8/t2EOkbTUmn2
0tUH8gge5/P0rvfdm1bTTtI2Ek7l2st13VDiYGBg25JCapCvWWPzmsoI37h25rT8QwQheZxRDFub
KVxP6R36s9kO7TBlPu7M8OKcXE04jGMXPkLHXTB7z/lz/IO7AwMDBtzD/Oev/tWukELVhqTTTamo
/0EED3P/zduJ92rVpO5asopp3E+HCLq7DB7UWG4/7COM3IYO5vOwNDu7sDAwMG3Jp+NIEHtsXiKK
KPTTc+2tKXuMerqziwkkllNIhYsf7s2n4HTSvzMzdiEs3KRrGLp5sWLVggZGXl/y7sDAwMG3Hf8d
ECHND2IRtIU1JnaOyGOjIoHuf7vfi0mnZ6PeQhOrDB7UbSbwj1ggl+yffJitXnd3YGBgYNuWP92L
HWTkDG9ghXoPn5+zn6IYd0MTCd2KId3jwa1Z/+xg/fSGDpXuyGPXE/I3O7NtHOaozvLsDAwMG3Hi
7YsWL32K1NuzoHVjurv83RsGerPTT/veAnzbt2fpoeOfCCCSV++wYtJx6z0QRt2ifJov//cbCFq3
bQQSSv32DDCjyItV7POZXLAwMDBtyx5B7FpH+BwQn0PLynXuNTM1y41wfNhgYNuVVUY0iGYxD/yH
L+duVVcePJcrIL0rU+mpl0rTm3Qs3mrVde04PkMJVAvq+oNDBo4caAfIYDLmDsZwz++w73ZTNgYy
Qd/kmZw7tK0RobdSZL9uxp7A7WwB5hyNyNsMXloRYOhnyxWdR6ZKZ2lpuoWNZYEz2+zNmq4+QZD6
N/UNV0fRmKzdvsZZu6huvHdMiQlvIt+ixZag7U+/vZYcvd1Ig2B1yQ1kMqsaZojGWR1Tt+9TM1qq
G9YaA7SDbq2oqqObet68HYhqgamg6f7RNFRbtf0DWdR0G2w62h1lVA/0nohB9HgKZYzn0rVbem6+
g3GksmwOG8GNYsJH1JHWtath8/ZW9lzdcIaDorZbNZ1UMf4fmk+0QPkMOc3NADPIEM6KQIXrPtZQ
s2FUAbewalpQaIY4YehByhma2GKQauurl13jv1B2BrBxexqSqB1AhfaeTHm3qKNMLBCfmNjRv8HP
ZIMV2dVb22NasesqoDGrGrhyhokOWAhdyZst6DovtED80m52HPqGpNTbaIMAUv2TH1jQde1WymG9
3qTsCLRoh3l9Vuyix2LecEFVAt0MXRQxQxPkA1ss0srR9ottoYui39FDFDEY9CbtAudXeTv8hc6x
AYwcgctvUw9w+zWiF21fi7q4ctrLNoCqAhVQppod2r68qgQzyMQ1azluvkCDCgWLFixaWMsjxjj8
MCn1MMrSu2jUzwXLly5cuGG2asGAGaXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly
5cuXLly5cuXLly5cuXLly5cuXLly4eoizDqNto0lkYNC7e1qWsXw5GPW7ZwwtTsBidm0i+4YWoB4
6U0bzrT41pivyGEHLDMQQbA5GDUGdjbb+i14tbbZ3hOXUAbJBTtqbbe8U7zY20lGzvBhEVbXhRBP
H9cLkOy5cuXL75pGPgqgALWKZNe09HGk6E02NGfVtITIMlxmdpab2oNGtMDm0tw4mRiDL0ZhZLPI
7fZYNXGjdBYULl9rudsbBfRne/DoDH9Oj3mfSwwmOqlj/e1lkRPbaGqUANERu6e3omtZnurV7vea
uGM6xbkICncld5uN4oFtFKgKyqytztQa5qSO9pZt1wa2TxyxYsWLDZNS4IqW7Quv9XtYvtOs6lqb
JqV6yyd29DDk0XWbbDoFthYNfDDarNUDev51ZsDh1j7RNMQZTEQkmvV+9XGpBCINm9Y5DId3WhYw
upGANanbQnbTFsbnbQ3jBLZZ71DXNJ1T4cWhot+rXNQDA5Bj6+Ltovaj1rV7YDA0QhosgDccUA0W
myW9i1X3KXYLtm0WdRDWwFixYsWLFqDLvNJZgt+Z9yzJaAxM2gttu3oe2vjQ9Q1E379vQWtrTwiw
y8bXefEFNtOttkFTtYfba2ZngBtQjulMLHbJNGiaDZ5J8eq68GowX9Ss6Qz+btW0XrVdGvdbCbGj
qVgH2UQwJaAwSCSepa7qZBMg4DQysk6Axh5tGogaG1MGntqAYrdf19paq9ZgtUSWLFixYsWLNHd/
TChbQG21q7XrJ2xh4INd3UGjUdC0G8jZJvLXozTpgck6qzgxp+st+jR5iDmUb0PUMdEh24cICjc7
3WMtVsMHW7JAFl+a+2cm1mZm3VGW016RoRB9d0a1I2/Q7ehItwX3gl7b7fqOAwb2h7adjbSPoeta
ro2L1q8GKxWw4N6bT8oaQ26vrwqWPbYSu1otaxqbdGn6Z0HEg12LuuMlrghcPtsD3LAZC2wdaQzF
posWLFixYsWLC1Ji5FhlrprGnaRpDRZYmD3egaBoqLTfapv6tqFi8HDa1th1Jh1q/ooZLEwakGCe
wGHo/R2M5G3d6YbwYWGjUA8L9aW1sKV7wYuihgGrWpvMN8MDSWZj1e/AcwYLK1mII37R27TbiLda
DiZmLRb7WYt+2l4LuNe922AXU7gKcFWVCmo3IEC5P5T6KBreFiwJYsWLFixYsWLELlWxald1a9rD
TrWtJ1qjfqLG+hMGraC/bBpc4Dh0nXbfXDXG+F6hq3Ke9oITCw7hpN8IKV7hc+3/Bu1YMZi1Zo0r
ViEaRf1PWejgUjp4dDzKfvxvSF9q1khooYDKwEGDRn3u+ojDcBDTnRtYZ2DV5muDDaaG6yWfalix
YsWLFixZHQmfXGFo0DWmBgOw37WLl48do+zabhPZsW9BDC/Y1JiB10D3EVOoAngoGCvecOVv+sMD
Dpeg6oj+7loamkOFsYrGGxmDF0Ww0HbGtq1T+vhgsRDQLe0kFBJFgCmtadcghqOksutan2kQvcAg
MFjZ9RwJhDE1E5tLttlxgDnR1tCMpJ6o36m0qK3KksWLFixYsWLBxwwiLMcsrRq+usbK0Y1PUdT0
dhYtA7aWjzAwaWHJrLYwej/QcGsMCJBhTFO4vhjsCEPqgcnFLV6Y2DIh3LCGhEO0AqpvTcv2Wgho
AtPb0NQ01j0XcbxsZr2st+pg7DrGa+QIAL94szaCySmzBosqDYByZdDIBjmvNNaiHXmDo6U+vNi9
8RED8bK5B2hIg3MzQxEMsR7bBuBgqSxYsWLFixbWwwQ5dLG1XDafqOgN5tUZ/6B9DVWfUgx2ltt6
Xd9Yv2Ew4tB6uMGg6ka1axwtNGtagw6vlBl0Bg0PUWZus6yGBpDtZDSCOpW7KDdTcHB/Q9R0PUww
U+tM0LU9dChTVMaY37At6oAUgiCAKihCBUVQR3Cgc77eYfwPa+T83AeoBJlixYsWLFixYs5YF5bd
atKYZHs6H0Q0C413LzHJCskGIOsMu2cOW1qKCWomaNA0DREIIaxPtIt8L9YZmPrWtXQYutJcgQaI
ZdG4kG1pDh1bUNcYoIAM732+iFt2dn0C10wkCGoNH2UhT6U0turBxa43i46PoL3yBCmNoYGdDS7d
U3NG8HK94EI3AV5i5z/M16DwZ6yIGsepQWLKQCxYsWLFixZTEFh3WP7JoWsWKuXcM+gh2ENUZrWo
WdS1XQGW8GAkHO2aswaK0odt1kgQvQQRTtag0tHWraU0aExh1B1hjB563oE6toGuaXSLS0N7RRBg
YMENQ0Foa2ohpqTkNFdFn+GE5Br09FqaI03XLZC2HFpltoadRamk2l9szMQzY1Ruchc0m3p+mss6
lcAUjB2s7SRe3kCIZfZW5bjwjeEMPy/j0BUABQWLFixYsWLFi0NUlizb5jZr9lqvaQ973aIm0gxN
2SGvtF8MNq0loiSBDGcpUykGzV8G/o2ityYYd7Re2hu0TRGL7kEmC91ozKQbdXnhqEEH0Br7sa83
3iFtnIEGdhINGoBx6t2ywQltIcdXarVvR+mlqDmvXZi2QIMzOQ1BuDw0QOlrhppgch0qgD9hSCoB
UAKskHw3qgFWSIsWLFixYsWLFixYsWLFr1nUEbgcmjn1C+yWTaZqelBgN+sEM/Owa0QuVvAVmz20
hwt7RBBgaWhg1DQWlr11ifQNMkg9jtsZppHT7fWlNN9q0vXCFNTBbaGtvDh11jcg1aJqJCU7DK2a
fpjPaQDAakSDhwhgaJqDkGC2HExNLW3sGoaDJBG5ppB9AtdIae1sjkNL1shF9p0ppDibmhvabdto
0DUNN11gzqX2W1p+lhzMTIHDpmoa9pTTY60lqDhbGhn1TU2EAAEpDlPzy/Q+ZQGf7iCsxW6gEtpF
FixbTw9YR1eNXDFstAYkBo6aGvPeoNlaPoQbQfYYsBnh3NzhgsgcSqC4sWLFg4NJ0Nk1EOUOghCf
WgBkNr1qAcYYWoa0GnoOohrWb4eBDQU9C1Jt/rQa6OA0tU0HUEWZpDFbU/6DqDJp4YTOwafp7Hya
dfbmzSriH2zQA5GUgIfBNCE/+j2iWi0tDIxjq0QVQBthmBtY9A1iKgsWLFr5B0bWs2NUlVAm0aYk
GVabtMaUM8s6vqWHshhNzs+qhqiVQHBoliy6jOrW91Kj3LmIs/WCxYsWIFtE0QhrKF5VAOGaHhYD
A0YMsNXStU13WEottV5l00MTVAyM59vM3JnD6JqgZQedhVAJN/QQ9mQsWLFgzoIB0kG7V2P/ta0A
M5h0sOUO/UtMDlDgDuDEMGSqoTZg4NMDQDladAY1VArccN9pDTDl0XQPMzCQp5LFuXJQU3gRqVZB
QWLFixYsWLFizJHAsWsEOtIsZkEs3zXTDa1B6LFixYtpmlMAdWrhxayxtEBs2QzrNkMkOzXw4A7g
89V0nV9a0QO/QFUAVkN9sDFDk0nWWkPMNOewwg7tMDCVQStAYgYugB7WEQwpuNwcoZOjhkKoJ9G6
DXDFY2P2sB+h1h5hxGMHfqjcGLZshwdhuKoJlUAzMqoKIINOitegWWFoDfYWMgGnrgcTL3oCFjQg
xVUASAeIb9nQGFVQFp+phgSHlrXrbcHTdb2EM7SQ8A0A5NJksWLFixYsWLFi2cliwcV/N7COg6W3
aigWLFixYsWLFixYsWiyWycsWBnu7F/UGkhdNY0QNzR9N0lVAWy6059asMX9B5X9JpltBltF8NEN
AOAPMMTSg4A6wzA5i2i6AWPyctr7lixYsWD5qqCCjQNBS1OZBksWLFtMdrvs7RqJ7OohwEWr/Wus
R9AbrBExZyBEuaD1JZjjX8xO8U7zfURx428P7fNW8+YhDZJbLCzIvTdYPbamTVfMuEtD0TpnQ5sd
92lh5v/NedKjHQQ7/FVeNnyVi7WK3lA5wQmBH3nOiO8Ikfj9A+xxW8Izn/fNyJDRm1Ht6t467H98
siaGLDT9p4X5ST+xeN+ymaE7yXRD0NnfXvXG5vRNZmwYhby0NWWq9ZcFNK3dvX/tbdbIHwx4aE9n
Z1MAAf//////////9CoAJT4CAABz0EonEf//////////////////////WESwRIEGD9mww30+JBhZ
0s96rPvWOtAe/xYHuoWUGxL1xkaGuwnDBZT+Q6SY7XphH9eP7Qvpx/MeNnNpjZLzBdalaFrQFYRC
IRCNi7nCd6a97vpjlHn643G8wWTT+ybtoa7+bdlNI6HDu+0N15iYINnHuDp1Vq1MI98U8QkU24EQ
iEQilZH71tKBHYdYghq1z9Zv6AQT7e9cSaGI7T00GYrVy4Q6hgxHjOwRxf1j3iH2j+fe8e50Zlx6
4xXdVVpcWVWEQiEQiwXe7BBtQIGxTEQRuQwevXY7TSSNadszWIII8uiHVy5XRkY/LV+WJhMay0Lm
rvKU/bcCIRCIRLdeLFk3rGGxBlOQ0M95q7y0I3bmbzmwgjaPBFO9jn7+P9oWP98PZqyQnKKXkLnd
ntK4cg9t/2c7cCIRCIRYO+ixYsfJAgkZiq+JnvEG8gQIXCOL+gJm7IbsXrl+wwMnDrBDk7847aUL
jDyaU+vQYgQz1du9C4kMTz5+vkCHefd/24EQiEQiO5obewkYnE07kal3RRqDJf93dCPx4cgXNRDI
W/k2SGsMqeIeuFwgc218/oIkOnsoxZtYbv58l13FxoSQIe+3Jde9d1DUbBrPNHp2A7S2nbGi09XU
2C+0NOW3UGEh4+GTppLFixAgw/tWWFpTISxaDcPc1eX9Z60J75Fie4jaRbk/XGZqbEU/sVq5kggm
y2vTSP47xoubn8//gx8ZYWNnaGG82CWhb0JWWLFi1q8fFxomPeSQZJskHuN/XmGyaf2TJNTZfywW
riZ0K7aGhvvsjBBj4NT3IIW7bwikQuSaE524WLFiydoji2l8R2LWfkNYufg7RoJBPv166k0sZ2vp
p6Y7d26Q6hix/BnYY4v6z7BD7T/Pse/dQ6ZjeTYmjVlaRBmVlixYsxXu7RBvQIdYhjII3fsOGi7n
/d1NI1vzdmsQQsckCHVy4Q66sf+7X8gxMXRrLTV6U/bcLFixYt1gsWu+jBm1Fn7IaL3fa+ztKN67
m+/WEbNvv5G7ewQf+M9oWcn4ezVsg50UnRupWkk7hyHmDH7WduFixYsxd9FixbvJAgmZlINBHQbx
DUSBCbpEzToNwyRAQsXWiwwMvHrBDlPucJNaF1i5NKaGIwQIZQvXuhcSGH5c/NBAglnySoWLFiwm
HVtDbCPoPEm/8i8R+6Fbk+/3Y+bKLCWCoVCoVctBAvkRDC35BUKnxqaqCpVBG0To5BVQgqgT1d7f
2emzCqBuNPb7F1isKoFcaoqgBxqCqhxVQ21paK+hhk61hFr60ttDPStNjLYDo1G9Y0FHVAxSGrBj
hi6kmQDl1wOTGjJJWGJq0Eo0uGHZu4ZvanqbE3aBf0XCLXjOqMjYzffUCAbYfbE1ECGpZ84bTdJA
Myw+lMDRq4YzCn3pepsJyENbNVppMGD8wZbhq51kOo1wMH3QdrZojAqoXatRYLgehDTgzg0WRpq0
Q1n2t6oqoDVUHhxBoMzVqQcbE2w2Wg4WIMM7VqAdB9KpyBAzHYtW2DVkuKR0EG3sNhnZ/By6iZM3
8Bk6eqgkdrvIXdZDs1/rOippVe61Ttv+qgKYCBA2Q4tRxirOPFPNFu83szfjUGdgb9Dv67oehYam
pirgVKkIfIZTt3gyrfmTqxPyrXqbwZkSQe60tDezj+0smHK6JpjXb0nrR/8WTsOZtRudXmvoOzX7
us9apV7SFUBes6YHwHHoZBN7Vo7GGD2xsjUh3pmotqBtUQDlQKlbn2y31CBvoBvi0NHUG9BPWSrT
rJAholg5j6giGM+ht9/XWEhprVwKlbNimK/d7jWr+qoXUker37BS3q86dp+o63oPbFp0Y1V0zs7f
a0XXGSxoDDrrhwN3AhYZMXLYYaOo6KHnpAYDOHLpLDpVjU7TFBDtl0yGFoDn1LU2EOKGK6f1nQdO
IMIYekaBy0rW+4vsxB+q/pYcFzRNRSIaJrTBrLNokxfYNTLQIdLjlnaARsxtshZxBTbYJ8Bg1qye
oJBsGyhroZYmqqbLRBp1RpIbwg9zW2Nm0NjsPfZdFYdApntxfb2FsRYWwh9jTvY13V8a5f1XGksd
lqabABmtsNwsEM6Jb0DyYktBDAIRN1zPeIMfC8e+hLBBvAhpU0NNtK/oQ4K1y4bL0DsbG2zyiIB3
GyT2Fj20VPAQ62dtEWw77whm7HRC42mYNW8zkNMYJvEGnWEWdPu5ek2ihkWkMMaeiZD0Dn8w65Wj
X9LR0DUdV3r5mB6hqrRpOeM2Evct5qjE0MHDcANeht9zlGzInBrbYcEB9gnCJDRELrKr2U2jQv8V
pNhBq6adBELkQIajT8vhRoXr2mmYNVcgy622E9wMdVw2HCe4qdKZWJrp9DZx02aQxIy1FeLOwMGp
aM1tWjaJJoYsSy6ZrLbpKdi1DFZM1XdR70PvWO9D/LiFvdpMKCa620uQgV7aAgtVcXBrVdURvNaH
Tb3o9rSL9mKZO2Tsh67HJJg6H79hZDVOHHGX9q7GwNutthCzyuNss2liFoWlaEK+YzXdQDnY9cua
w2alpt1mbkdb0H5URVhwxNWpJpsjkIZ23VcamynZtHuMDK08Jb28gHAloDTfAlmaskNGY0WJRDax
39bzsM14RDXWw8kP63ZtnhO1fXOpaA0GbHZ0bj6Ri5rHG2kZqGInW2kQIECGoM8VjGuXMAjM09tO
gP9LV9R0KUdIQISENwMH7VoXbc/DbT9oLQnc71bUhoWjBBZNnIZxqmokKHI9TwRPr+beilR6kjZs
NtEIY7TpZ0pmaCF7U3RY2sONpYNQ1Mhr9tlZ2DREW1gYM32N7LhgaA1fm/reNW0gMVh0Eaet6T1a
YtHw1o3M0yECBnlh0P8ENP1/S4T71DQkyBndG9a1rQiFvWBaEz17o9/gBsLp5Xs7kDbScdBAczBM
F/Oo+feA0+iXavtrMgQYcH1lP832ZBv7Qt2tXY2lKdYsIB5RoCrJY/3mHqaBapVZKrIZxNAGxoTS
9bPIQuW2kMTPos+u6sw3cBgctZhlYtCc3qzQOw4gPV7MNn2Ro0pkIEE2Kw16zRDkKneLCjnfcMHS
2Jnsv9QndDHvJ8Mamm1MTQQnUmH/qQfSu75zsOqYsaQHDYaCAYwcmtS26R96jbacVVEvAGyPaCet
tLeAL3QIl6w1UQRhsAZm14If0dB79VhMg2auzQwN2lNydvlqHKr+jMUT7/2S3q9zR2Sx//NPWNWb
GEJf5DJoM+lWU60LOqIaB3qjAyWWHGmN9hPRbbJ+EtHakyrVdcgJgNY1B2jWCDCQZGXRmumfvQWB
pdjbH8+T3tS1Vo1rUdT1bgoaWrSLJgEGofeLiWosGgLvsDFdadBOo0gq3XWi3lkARfDIxNZ9tJJH
QWJo0FwBbxc7Vq1jLV7/dn1EGvvWiFe4MVph1G3rdLE1ajo0D5js40O/YjWVtnhSmOUMI4QEFGzV
NEYd5auC4MWvhwsTWixRqNk9NN9D2jMhDEt96g49Lwh5jafNjLWGbWUfHy+GiDaB2chLJ3c0RtYW
Xz3GtnvslmxrPutWatLUasGMijobc3aoHHrgcKDG06AJRAlahfIrsbWPeGuYnbVrz5rlRT/nFyhc
SFxcAaUj4ankw9Q1bUGI+rtesNzt7Nqdmy99o/o93RWe5oDDa1AyAYbF6wn40Bp3q1TVM1rFrpKE
9CYCGh6Qw6FobFNtguEJvITqTbf1LU76bZqd25fRQYNCYWpDQ9EYbej6GQuMLkOrxC/qeqNrdqT3
9TvYQY7id9kAfYXW3MbyqJvD0v3vkMDqPVEf2OE8q/ueDqeEODw5RBP2iCZiGgaINqyzoWmbs7Q0
Z0R8sdxK10GAHM2SHdr03f650yMsMrca0e/fsaFohBC6ja1GxrGj6y3dBxBxa00OgQjUG5l/a60D
StMtJRasMemaXepjm+bWdbpJoIItwcYcNpu/lgtW/ylH7THovkmZjrUrrQxsOh9P1C2ohyoe421V
wope4UczgUBJ+WD4A/96qgaHNr9N2hN7H5BpvezrHPTSCCJDSat621272LupWtJY9JvNWhI4ZUWb
L6brR+u27Qbml6QytdtLQE89MNJtDsNthnF/Um7UrzDfY9Tv6o16pfuNSOhMWhIWs6uw6HpGhsNu
W2NYITlyGqXmrUtUbLl9FpRvTN6NE0Fh0LQ9AO8Ms7A1+cEUv+doS9U1wBKxwm7oiSGTTTIl7QWX
VdSI6pozTZZSB2Rob2AQh/yvimQIIt7f/9q1pemfSQe+nYtaZpbEx0Q1jW2hJFhIJ2CAcIcLfqH8
sulpECCD37X2XStL01kZCFJWLiDBJBo1rWNd19k1AOa1cZMPCTLb0rS9M0piY7Fq9cRYGlIgQ1jW
w4g4G5vQkgnXV4hH7NvS9JDFDFYkdGi8j2jqtnpEODIcGpEGhhlOiCN9pYtPjaL4bTY5URneOT20
qIRAlAuYE7D7bEd7Hv7C1VAuo6hOwwte41LR0Q4db71AOQ1H0AMOjZgMFoY2PSIssAfIYutBsBh6
mV19v00gZg0HsPBJnZGTQQ0mBhfQZ0DUchlohlhp6joOphlagHNJBj03rsMogGeHfqOr6Omzhx65
rGk6RY7RTsXPes6TbQIQwsrTF5jINDCQuEH9JAg3GK6e19tzIGC293m/9MyW0DA2gaYe4MXdMZde
ua+13LmrXmi42MTDe0C5jSe9YDpfVdR1EOfXQJmCCWuPyghY7bQ7WUMjRov6oHHqdnRg5O9aMHWH
MyBh8m9i1XTQ69LDWDo5WdUx8ho7ONVAPqwYKej5RVQBa96zqPtVYg49eTnLWHQz6CHFVwgjdDFD
p1nT9CbNVtBk6kzBihhN9ENO1mzr+khywz6hrlzW4HiJlYsLiNpraHfdjJRhH+cw36bzKtrGHsqg
jRIdaaQDtQtaCwNGrMuA4NZkgHFpwdGp22cg0MNwho2paFp95LSA7w9NZZSBC+2tjfqusNLGqoOY
9ODlY9G0HRM9kNU12tf13QZkgGtrLGH8lojA0B03lVAAcSV7ttyHEx6GzsFzSLGmfDja2EhpGhaw
w6QGIyELAabC0N94g0hgMehJR2jq+qp2GbUdSa7+jakVX3LMY+gmdMOYNTVNbIENCuX+itlnYGjX
mW63pa3ff7c3EA2LhDVUHaWEMLuCtgPJo9qOpNAc6qg+yjrbLq2dNDMxZubTXypWQwdKtSWGVD4B
suxNzWiwTfpsa4Qa7KN/sgY9PwnxDaBsdEOj55R7PyBBJ04IA+D5Sjl5F4IIBjsxzIynGoO1dMDY
Q+Qx0zaGhmxYstNtCyhHrmG9OG9iMQIEPYNM+7eJIECB+vvyN791o6nwqT64YFPuEYajH76SQ7g+
7dJi9oVdTbv5Sf8x2iQ0D0onjCBDKNUjbye2avw03iBBq81pECHumWNGu6ji9ZMm/v0QabrpZhH1
Zs3iH2u/kyX6ISwI94zKRmi4gm1W8GQbPML5l5fhT5MKsPi4j6bb5QNjBvEErkTP++7CLzflFKDZ
OdCzbRTPbYDQdraSBB4aGxL3tR6qdQ11+mSLf2O2lq0Uj0O0bh1mz1083TdpUZH0Wu6+m0j7ydgw
a009kMNWTJagwkOiDS/Z7ds0uvPKrrbMo/d146QYEUrlvPqiMZ9+5m5JrubTekeZTTsmqxm25BKD
UxXGx2CsMJFvTbUukWKf8FsVEO/eZRrsVZXXz3vde0Q9hBFDx/p+6O6H7jQQtMaHfLuvQ9Vlpeao
hHyHyD550d8O/iEEIezZuNEOdcrMZpy0Zzmny9usWblnq7khFvhPsROY6zHjT2dnUwAB////////
///0KgAlPwIAALvjMCsR//////////////////////9EWfw6USQ/WSHsNV3zT183qizm21UdF/MF
zBCy9z5yGWmsuQzjtF5cgQcgQkgQIENQQr3+U3OkoRcHx5QT6mu/+s2fyYX0D8lyt5NEzD5dI0+3
sWG7OsSflcsmSeCEJ2SGhemz38yE5RiywH7YUIz9raJog24bUyBDyDP/Sb+qGvraEE/YzVNeL2Ez
wiaM2b/H7bfyZOKIOxWO8d8EjNV1BNrYMdIN2GT0bR5xwrx+uFYfFxH0sD5QxjHXiCd38v9NKxY9
LQ6OU/4z2dGwwWEzsDB1B2xqog8O0tqWMamhU6lrzoMrxbhlYO9Y/FjCFMJuBM2bXXTzeMdMh0j6
LXdZuNQ+8nt4Naau5w15MlqLFPRBqfs9tgNLyflV5u4zY/hzdIMKKdy0c0RiDH9+5m6Q6v5t6gkc
gQuXLRqs9sLkEo6hjuNrsFYYiOoXG1Pqwxz/gtiqkveZrPG3WT3nQxo57NhFDx/3PdHdD91pIW2R
Hvl3XqeuOTtPnqpiJyQfJCu3w7+IfIfezautMOfpBqO1ZzmPZdhrFq7b6vZIft8AfY/OY6PGDRFr
8eSggQzGSHsNd3zUh/rERZzbayB7EuwowQaIte6IGZZNBAx0bsVBAh8gQqiBAhoqf3FSGTJKIx30
eZqwqgnDt7AVQEqoD25VTiqgK0K34ONVAZ2kHuGdqmjhuhthvXNVVUEJNIfIbQbUXg2g2lVBwcZl
VCobQbQbWjqqBNfD3aQz1UDCqBANoOsPRVQyG0G0HlkNoNoPLrUFVAocjYG0G0Gwzh5KoCVUCCqA
kNpv1Bl9aVQFqoMtGthtBtRqGWO7YDaDaYGUMQMOdU6SVQPKoHg2g2g2g2g2g2g2g2mBgDhZNI0j
SNIVQD6RpDNpqqBFVAgqgCDaDaDaDaDaDaDa0cM9VAwqgQDaVQFhtBtBtBtBtBo6MqgJVQMKoAQ2
g2g2g2g2g2g2tPDLVQQKoGg2g2g2g2g2g2g2g2mVVA6qhEVQOhtBtBtBtBtBtBtBiBhhvqoBA2iA
bQbXmgNoNpuDB0BjYk+yHrgbQbXQbTPct2NPtuGiGcQIBrhtIhqhtBtVpiqAgNgMtVQQG0G0G0G0
qoCVUAB2a2G0G0HoGjoAeWrMQegbAbOQ7gw0GwPVuDkDmuIIB/h6W0NUbM29d1wOFC3qAfaCAcYd
SqhHGsB6WtZ1vV2losaAHYGjY14OoiHXr7YHJfIdaFdy3e1VVQKHsHWHIHcmHOHPc0fQQ4tIDrD+
DvDrDrDvD8DrDjD/0rQw7tBiA8g8WwOsOsP8O/ViMae2tWsmDn11VAOHWHWHwHaHWy61qDJpgZIf
AcYderNQdYdYfYdYcCqgkMsNQMIMKIDrDrDr1PHLUNYDl1AOsOsOsOvShn0EN0NMPoPsOsOsOsOv
W1VAoZaqA3RwwovB1h16/r3jV1YDrDrDrDrQgMdVAIGmHcqoGDrDrDrDrgOLRwwmSA6w69TDz0L1
lqFoTOHoHoHoHp0howagZYbt5APQPQPQPRgbtTZDdIB6B060HXrvm4OB8a0HWHWHWHXrrEGlpOva
4H4HWHWHWHXAdzOGEzkYDr1YOcOvWTNrVqDIy60HWHWHWHWHuHIGzpWjBvKqANUDrDrDrDriAwmc
iYOjVg6w6w59X1bXOtH0iyHWHWHWHWH+HFoOlXjQHGHWHWHWHXEaeh7Wg4w6w68dO/gxbgdYdYdY
dYdwfIagaYa4YUBwh1h1h1h1xh+tSDrDrDrnRZxoQagfIcQdYdYdYdYeQdwaYawdmlsgawdYdYde
vwGE1B6e14OsOsOuA9r2nBph3B8h1h1h1h1twewbjS0hhRAdYdYdep4hkSDrVQaacHWHWHWHXeDa
boDbVQIKoEwzw6w6w6w62C00hms4YUQHWHWHRrmomYAxTqqE1VDweAeAeAeCqgLIeAeAeAeAeAeA
eAeD60HDfu+SDnDpH0qoEVUY6yHbruu66HcqoS13Xdd13Xdd13XQ9lVCgdgfiqhhVRLruu67ruu6
7ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67
ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67r
uu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruuhwauUarpi
F5kDgDgDgDgYk9KYregt+sBwBwBwBwaMm7Jo5Bh0gOAOAOAODQWrGNJvNGihwBwBwBwaex6MCQ0g
OAOAOAOCx2w6MbJAOAOAOAOA1J4s3E0Q4A4A4A4E7+mEBdh6hwBwBwBwNISDgDgDgDgA3EBwBwBw
BwVUBwBwBwBwOHAHAHAHBiA4A4A4A4NtEOAOAOAOBYcAcAcAcFBwBwBwBwBwBwBwBwe4wHAHAHAH
A8QHAHAHAHBEfDgDgDgDg2Q4A4A4A4KoOAOAOAOCq1gOoOAOAOBpzpIagagagagagagagagagaga
gagagagagagagawaoagagagagagagagagagagagagagagagagagagagagagagagagagagagamgAe
UsTZqOvctO06/qurN9rTtfa7JCyHf7Tbv2fVNRZWZ9SbJ3gc7SgGFrAcGrNGhui26nagOf1sMXXt
RaNTYMI6g04Di+GHnWdQDgR0axrbY3aZqGi3pvNmh2kW3UdU1jTNI1HUtBbk2sprDMltoWtSS20F
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
Y2OIY2OLNlJq9+zZhjY4hjY4s2f//+zZhjY4hjY4s2f//+zZhjY4hjY4s2f//+zZ7Y2O62sbHqFm
z///2bOpaAxsfeg2fWbP///Zs32BjIXtGZW6zZ///7NnUGNjSvMbHqFmz///2bKTGx3YY2OLNn//
/s2YY2OIY2OLVn9q1DGxxDGxxasiFFqzDGxxDGxxZtH/evwxscQxscXr169DGxxDGxxevXr0MbHE
MbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHE
MbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxsd29evNrExd8mNl6vXb15iZE
u2VgvXozFW+lMrT+8rpTK6zvZYMb2x6Jd6ymeZdKEk+/Pn5/93ckvpppp7ndH7ud1c7TO6aaaYhT
38dy9nvKaaaaRznPcS7U3MHTTTTmE000000000000000000000001pppp5JZk1l7PSPjYxXaQ/x7
GO857+l858u72HecPPxbvpgQn2fGMqT1uiJkknQ5Y957Hn+ePIY9bn+H77//JKOCHWN1nunpM+Pi
gU0LN0/YzYEfu4lntdPHHjn1512EH+8PLprYDpHyh0h6vC93k7Sc+Y8+bkQfNyziZM5KqjH0bSEv
7PeMLUrF1yJeIQpX1Vl+mGxOf5SrvrCCKH+OKR9n7v43jejgSNOe4RyOH6PPSFk2d3xN0/efzzYO
jdYfpaDqOdnocpYf1zgas3O/3IaO+T+uHw8Z7pPu53kfs98Md3byR0k0k8+fufd3bx0j9p3Lpsfw
bpWJDz5z105sG66N1uohR0haZEcDV+4z0h0wsFpFA3AXU8SGMGRQsIIGfj0/DFrq1YM/HgboXGf8
ePZqn3upewa3oDGx9Gd3c3TGxsbGYzu79dMbGxsZjO7v10xsbGxmM7u6KOgaDoLOjY973kbGgM+g
s3Vj3veRsaBoDMzoo+97xjMLAwMBje97xjMDAwrYTG97zmMxsbGxmN73vdGY2O2x2LLu82LDEx4d
akoo6hNPPlhT6acdTUu7u7u8y/03w8p/3rrNIK6md670Ne0SjYS+66/7q11FdOjZSw+c9/7vZJZs
2bNmhH7upVdPcO9mzZsinml8d29R+82bNmymfs/d1JKbpj2bNmy/7NmzZs2bNmzZs2bNmzZs2bNm
zZs2bNmzZMSPPVp7SCOEDYpJOfx43eTpfSyfs6389h+Rnn4hoMKEvnBulco7oj0kk6HI2PPZ8/zw
vCOPMG8/h+0s5yS/xQ6xujpU9XO8fFUyMWbp+xmwI/d1I6St4Icc+v+UWUffeHf1JsB0u8ooI45e
F7vJ2rs+Yw+bsQf92yZ5M5KKjH7FtCX8dLBlqVYkOVEIlGLL9MVmc/ynHfRkLCH+OKsYz/z46x1i
OABp/3FjI4fo+76QsmySIdde7P+aYUDGw/SKjnb6HKeH9d4dUe53m7DT3zf1zvDxnuE+7iWRnS4G
Sv30u0ridw/vZSnHd68dPvu5evdY/jroSPnOdDp+sdIdGQ3UQo6QtsyOFeOJB+kUGJhYLCBuHBCS
BDBurCNlFHp+PT8cW+rdgzkOBkOBCf8a7NT+91UXu2nVW9vTTiIhNNvb29vTTiIhNNvb29vTTiIh
NNvb29vTTiIi9d1XVtX1O9fiIi9f1XVNX1K5eiI/ev6rqup6revfiITTbW1tbU0/x+E021tbW1NO
IiE029vb29NOPxCabe3NTffaYiKv327UDwoXnrr0K/ddLyuV1VL9XRBVCHp3r1UGteDAumDFDDIM
IZOm6ho2khhsjBpYZ7Do2isjJEsjIGfobFoTIyMmkB3ahojGwywMhAOIP1kZA6csjIjpeiEGBpZG
Rj0YNLDLYZAzlUB4eUhlvrKqCIMxkZDBm+VUJtOWRkIWNB0Fsbg+r1u2yMjIyMjIyMmj6Yqgb0l3
dw4XezocaFaZGRkZGRkZNIYZYGR2RkZGRkYtHxaY2RkZGRkZGTRGNitsjIyMjIyMjJoyDKgyMjIy
MjIyaDoIaYZrIdkZI1ZkZNd8bXNVIddzojIydMmjtzWlrmtNFvTWVoY2TStJZGRIgGNo2tqoB2Rk
ZGRVAgqgODP1ZkZA7GI+vhgsGgqqCVVBPw5w8DNIY+sh2XUjGD1DrMbUNa6u/1nWzGbQ8jG10PKG
LWg7GW3q2p6poZztQdOqawHkHHrDCwXO9W79ZY41AgGmHGHTDhzEAxmXTW3W24OPoOQOMOMOTVw4
9cDzVQIXAwGLbQ20NUDY04OMOPRQ5NQ20NEsJhhNuvkAzg4w40msOMgwOw9JB2h8Bx/D7DjDjD/D
j1kPxsQ0bRttDbQDjDjDibsoNOjsAcYcYcYcbbY0mLgeAeAcYcYcYcYcod4YTB7RttBMOMOPWNY/
/q3dSDjDjDjDjDh20NDogHKHyHGHGHGHHtoakz6Na20NtAOMOJuDp1bNn+rB8B0h0h0h0ppoaPp/
TQmHSHSHSHSbDPomhz2mHSHBqgcejwi220mQOMOMOMOPV9b0u+qgG07Vg8Q4w4w4w49tAOXRNGYN
tAOPUNfDjDCbbCbsJBgDjDjDjDjDsD50Rt7YQ9A5w4w4w4w49tDbQ0ZgPr+oBxhx6Qz4aLWmt10O
MOMOMOMPPW21VAgx6Ntoa4HGHGHGHHtobaGiH/qmthxhx3c2UX0EO0gHGHGHGHGHKHdRDS9G20NS
DjDjDjDi20NtDtuO2hxBxhx6h0GA6VB3a2HGHGHGHHrYcpDQ1VBjAQVQBhxhxhx6x/bQ0bSg2P6w
HGHGHHtoBr6I2kA5Q7g4w4w4w42oONhDCYdG20NtAOMOMONu/toWkg7WXwcQcYcYcfrLe0aYqgjV
QHBqBxhxhxhx6Tp5BFg0bbQ20A4w49f1VlOxqoAVUAaqAxVAOHMHMHMHMGfoYcwcwcwcwcwcwcwc
3Fk1q4n715H3BqDx0vDKysuNWZWVlZWVlZWXOt4T1sOZlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWV
lZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWV
lZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZVU
AwallkTDE0fVVUAyqAZVAMqgG1jRWZrsXP4VQDKoBlUAyqAbVumdv1zTtGDjVQDKoBlUAyqAbU2D
Rr+u6P1qaqAZVAMqgGVQDJ6RoWpPpevKoBlUAyqAZVAM3aRoocN3RryqAZVAMqgGVQDXbWitGoaJ
pLaqgGVQDKoBlUAzJZDMu9B2KoBlUAyqAZVAM0zA1UAyqAZVAMqgGA4bbAQVQDKoBlUAyqAaHEvc
UqgGVQDKoBlUA1KsmveVQDKoBlUAyqAYVBNVAMqgGVQDKoBtmFUAyqAZVAMqgGdVAMqgGVQDKoBl
WS8KoBlUAyqAZVANACqAZVAMqgGVQDUpnbc4KoBlUAyqAZVANtoA0CqgGVQDKoBlUA1OsLjCiqAZ
VAMqgGVQDBKQktVAMqgGVQDKoBqHsL23FUAyqAZVAMqgGpY50TVlUAyqAZVAM29azrOs6zrOs6zr
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
CWqoCVUBbaG2htobaCqgJVQEtVQCqoC20NtDbQ20FVASqgJVQEqoC20NtDbQ20FVASqgKiFxo20C
hNVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqs
lVkqslVkqslVkqslVkkGVVkqskM0yrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJ
VZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZPyCrJVZJpVZKrJP9Vkqsnp1WSqyUMqslVk
/yqyVWSj5VkqsnNhVkqsmt6qyVWT0qyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqy
VWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSCqyc/VZKjCrJVZLwAqyfqskgqyZIZampqmVWSq
yVWSqyZlqampqmVWSqyVWSqyZlqampqmVWSqyVEvLU1K2pqJk+pmZ//cNTVBNqav+JzMkJeGpO8q
yVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslV
k376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfGno9/c3lVCOtNgf
F9arJZmzKtVkqsld++rv31qslVk7cVZKrJXfvq799arJVZO3FWSqyV376u/fWqyVWTtxVkqsld++
rv31qslVk7cVZKrJXfvq799arJVZO3FWSqyV376u/fWqyVWTtxVkqsld++rv31qslVk7cVZKrJXf
vq799arJVZO3FWSqyV376u/fWqyVWTZtaNZVZKrJXfvq799arJVZNjzSqyVWSu/fV3761WSqyUzt
TcqyVWSu/fV3761WSqyT2+ulWSqyV376u/fWqyVWTf1EgtVkqsld++rv31qslVk7cVZKrJXfvq79
9arJVZO3FWSqyV376u/fWqyVWTtxVkqsnN++m237+oqslVk7cVZKrJvX75rzRqmoKslVk7cVZKrJ
aW2+26+03TqslVk7cVZKrJ1C/fuajfvnVZKrJ24qyVWTql++dd++tVkqsnbirJVZK799XfvrBVZK
ye2xtsKslVkrv31d++tVkglHABXfvq799alVk+JgbbGoNq799Xfvr1DUNtjbY22NtjUNQXfvq799
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
kKshVkKsjRQ2g9MYD80FJVkKshVkKshu6SuHYVWQqyNH0UhoHWcMSrIVZCrIVZDe2aZAbWtBwqsh
VkKshVkM33arKrIVZD3ar5lUBGVWQqyFWQqyNBQ1jWdVbu1WQqyFWQqyMuQIKshVkKsj/XRm/WEA
wlWQqyFWQqyGPQdZ1e7eYwz1WQqyFWQ0kDsenEGFVkKshVkBwXpDC1e8qyFWQqyFWRqWo6UqgB1d
iVZCrIVZF32hWVWQqyA45VZCrIVZFoNXUZVQA6BpAbqrIVZCrIVZBC7rT6gdVkKsg7KzXGtFj1/R
VWQqyFWQqyA9ElWQqyFWQqyFWQqyFWQqyPNirIiK4a3aq1p+W9VkKshVkaEHaqyFWQqyFWQqyFWQ
qyFWRouhaIHDo1tVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshV
kKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVk
KshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkK
shVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKs
hVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKsi33GGkgQVZCrIVZCrIT83
6kxNCDYqyFWQqyFWRo9n2jEGjSLarIVZCrIVZDe2nIalc7DgVZCrIVZCrI6hl0oV6FWQqyFWQqyJ
NoRyGUFWQqyFWQqyPkMG8QgyrIVZCrIVZF9sudBNO0qyFWQqyFWRqCrIUutVkKshVkKshVkKshVk
KsjehMtKrIVZCrIVZE04WraKshVkKshVkLVZCrIVZCrILUoWqyFWQqyFWQsarIVZCrIVZAgktVkK
shVkKsiVhJarIVZCrIVZEKHouqyFWQqyFWQ61WQqyFWQqyBllWQqyFWQqyFqFWQqyFWQqyB0qyFW
QqyFWRS50SwqyFWQqyLtzWVWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWREqshVkKshVk
KshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkeYvsl7JCHIXCDBoV
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
XlONBSOi1dFq4U7os0o5u0X5SKd0XaqUcUdounRcJRRR1WNzXR3q0pQo4oqqdFzFHFHFKlMiqdFj
aLh0WHoqAQpGrtFQE6Letsq6rCiqoKZZCkaobtFUU3AomlOjUV0tFUNaLhKRqzRVDLTVpRlQlGFI
FJlOlI7aKoqKRKR0VRVovopEpTRcxSHWqZSuiqD9FUIlIlI6Lx0VRVSFLl1JKrqTeUiUj2ykW/vG
ooCr9FxaLxKRqMospEpGpykSktF27lNUqRSJSJSG/LtqqCRSJSJSJSJTn7lG1cUpouPRchSJSJSJ
SOi59F1NxTbdSVKRKRqiqPo6LJ0WUUiUiUiUjouwokpApIpvRdZSJSJSJSJSdWUulIlI7lLVXygU
fVpSJSxSxSxS22zXosAorRbLRsUsUsUsUs06LE0VQeUIUXLYpar20pFS6FClSqMpEpEpEpEpDRc5
QlV1Tyr9FyFIlIlIlIlN0qUwUjSq4pGpJcvjU39KRKRKRKR0XDovFqbik6t0XPouIpEpEpEpGlNm
lV1IpEpGotnigKoKMKd3KRKRKRKR0XMUmUgUhJAUoUiUiUiUjSHG2qykSkdFhaLSuVlEaLzKRKRK
RKRKb0XEUkUlV1IpMpEpEpEpGnosCW5SJSJSJRuioMKm5MpLRcRSZSJSJSJSJS5TZSVV029vKFKR
KRKRqikULosyqCkSkSkdFk1K3lJFN6LiKRKRKRKRbtFwlK85SKRKRKR3vu+i6qvplIFIlIlItFVV
Xu26Kog3aikSkSkSkWqo9ilp0ikSkaubqplVxSui2dFiFKlKFKFKFKUqlKUKUKUKUKUKUKUKU0Xh
VVzlUmi6dFUaVXoukohA1NTV5SjU1NTU1NTU1Uim+txTGi4Wpqampqampqampqampqampqampqam
pqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam
pqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam
pqKTq1sqXlVbtJSZSZSZSbTvV/FdygtFklJlJlJlJ7cbZNLbouGoikykykyk5N7dUPau4UmUmUmU
nQplIYeNrSUmUmUmUntT0XBUVtmi5Ckykykyk5dp7UKVKgUmUmUmUnUdPRUBaCjouIpMpMpMpOqL
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
VosrRZWiytFlaLK0WVosrRZWiytFlaLK0WVosrRZWiytFlaLK0WVosrRZWiytFlaLK0WVosrRZWi
ytFlaLK0WVosvRZf/osvRZe+iy9FlZX0WXossaLKlUtSdqmqapqWpalqWqapqmqalqWpalqmqapq
mpalqWpV6pqmqapupalqWpa1U1SdU1SjypalqWodI6pplBZhQpQuYUKULmFClC5hQpQuYUKULmFC
lC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQoqKbRos
i1CjmlsUqmTY2NLS0tLY2NjY0tLS0tjY2NjS0tLS2NjY2NLS0tLY2NjY0tLS0tjY2NjS0tLS2NjY
2NLS0tLY2NjY0tLS0tjY2NjS0tLS2Nj79LrY2NLS0tLY2djSbmxsaWlpaWxs3p021sbGlpaWlsbO
/2TY2NLS0tLY2NrfNsbGlpaWlsbGxsaWlpaWxsbGxpaWlpbGxsbMaWm+tLT1sbGxsbKDTVU9kHtj
Y2NlKi0lI1S1Y2NjY2daWmbe0tNNsbGxsKYaWl9paWxsbGxpaWlpbGxsbGlpaWlsbPbKbS0tLTTb
PpTaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWl
paaVKlSaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWlpalaSqsWlpro2ppVVVVaWgF2ij
SVj6OtyRbPrbfBeHe/YrD/zrDCv8WTI/he8cu5dZHsg4XEUZYu9GDBEViJiOwXhd39bv/C+wzIwY
Elf8ccFsPLER4lDHmfPZo/9eCWwAXeei5WX5y4CfOQuHBeMdoK1+tGw54z60EogF/e7fQ/XWGQh8
C/+5D+WLhbnwZPzlauCyeuwsN17jf5WT12FNfBLnOc5znOc5znOXyW0uXd3d3fOc5zl85dfM8fmQ
uv8K2pL6mesWpZ8AvCffsVh+ZNhgy/GHY537PHLuTJ1keytCDhcRgEeRRl3ouMEZSArETETgvDLu
/rd/IXOGdjBiSV8vHHBbDyxGxl7DHmfB6GP/XyFYAI5vPTiKy8uWLhPkoXDgvGO0DDeLC1w5efWH
hy2T3u30PxhXvJwhkC+e5B7OWLhbnwGZxhgCydlYYchcb/tauysML5fMVnOc5znOc5znOfZz3VV3
n3ve972c5znc5zu7njDd6o7sja0e1EgqOp+1DUZQL6F9qdm0VaqUGUfosYoWodqimUNUJQhQkFCh
ChKjqKo6iKEKEKEKDpyqEoAoUoUoooQoEoPpQhRPZ2dTAAH///////////QqACVMAgAA84oFWxH/
/////////////////////yVR5QhQhQlBtKBKKmUIUIUIUI1FAFHFCFCfoskpOhuUA16LQ3KEKE2w
oBQFCFCS2KEKE2aCipaLA0WAUIUIUIUIUIUIUIUIUIUYUGUWUWUWUWUWUCUWUWUSUJU+iwigihCh
ChChChChChCgyhShSiihCgChChChChChChShCgCjChihChChChChChChChChNFhlHFCFCFCFCFCF
CFCFCFCFGaLUKMKEKEKEKEKEKEKEKEKE0WpotIoQoQoSgUIUJRmqUiUggeBQhQjhQhQe3q7bFLNO
bFClCFAaLVKEKEKMKIqUppWiUIUIUIUI1NdRUihChKoKF0WJNp5Q0VANoqAZxv0WyUXMoDeqmnCi
yi6rqgosotWmp1vpNhRZRe9VFFlFtlVFI7yqgocoukrossomHlIaLAooKqxBIopSj8EG8eFAtWTK
B269VCBrxslhQpQeYUHUONlVaKoBpFKNpKpQJQWY1lB8dOrMQlK89vKazKuqjEFWNErqyqaWNksx
BlOraqq+ratJzM5GObFKN2ZmbTlUVWlIVTVOZmNxSWi7Cn22rTzMQIGJibN5XmZnnRKQq5vqzMzD
qqrKtpk5nJtUOFEUdFlznOeZxoaqAyc5zVqVvaqizJ5eFIR3aLspDMzKcNqWi9imaVVZmYbfouer
Wx085+FK8xC0SQVZmZlUU6VNvKSqueZmE1a2fnMwpOq6Ia5IMzMqpszRVAJSdWm2ZmYTVkGK0GZK
27saE8zMb6pq6rilqtOqczMJ32/mZinCkoUquqlszMyqm+rqvKCqlBVOZiBiOrUFVsSDMw6uQNlX
N9U5mZOrilClW2rSczOOHTyrSjOZmZxrVuq2/Rc9XZmZTpq1c2VaTmYNvnV9Wt1Q973tBXve973v
UTUgUabDTQqUFKFPUququq6rq4peq6rquq6rquq6rKQKWq4pIpgpuq6rquq6rquq6rquq6rquq6r
quq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rq
uq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rqu
q6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rKQqpLztttLYpApApApDZVsU
tAgqwpApApApCjm6lBsKQolIFIFIFIUbpcUptrQUgUgUgUh7Yq1I2ygUgUgUgUhKmUjQ5Tq4pApA
pApDnaUpUqexSBSBSBSE+IFD+qCkCkCkCkOklIFIFIFIHXJKQKQKQKQOuZSBSBSBSBrGUgUgUgUh
EykCkCkCkNDykCkCkCkCSkCkCkCkNGFIFIFIFIElIFIFIFIExKQKQKQKQrmUgUgUgUgSUgUgUgUg
SUgUgUgUhowpApApApBLSbSkCkCkJ2UNosLRYWiwtFhaLC0WFosLRYWiwtFhaLC0WFosLRYWiwtF
haLC0WBosHRYWiwtFhaLC0WFosLRYWiwtFhaLC0WFosLRYWiwtFhaLC0WFosLRYWiwtFhaLC0WFo
sLRYWiwtFhaLCaWmmb05tlqKbVVM5q3tu1b0d7a1OTv6e+9CnvQaNuK1RTQTNXK3e0VOUG+nYbq1
fc9zUUo0959UQVLTVs+SpfPOkz6qrso0c0WHCk2yByqCWjvJr6IVzXMaIlq+h5raP86xJA1n8Sre
g72VlD7NFGi2daNlGjtKW3LqOhR3pUgBKqas3qDi9FslQodUOk01jXU2oqRNYudBSgNGUOXQ0K6l
DJaIa2jFtCk0tOVU2k0sw4ktzTsUhVUqRBaH1RoVNTMitAU+coHKR7baMWrEsBtxtlX8QZvVDLX7
S6pyZdKx0kGK7Xe3W2goUvSpKtLRSVbp0uSKR3zm14JYcK65jRRFtBfRBtkjn3pIcOwogaL33UUF
BRoFE6Ozi6t3KpNGLxbKrO2ye5Mzqyq6rquO576C5NDjSe3BUG2VC03yiUhOk38k7tLO8tK1NnWj
am00aCrUFqFLaoFe2KoJpIFFadCi2aMpNbRNtlJUiiVWhrVjQbD/ejRbMU5sTklJ7qKbtjUUkUpP
k1aiP3GtRtOm1UW6lUmiKoakqyqbw3J1DQUJcaZ512+G1tLdUFLFOQNA2tHk0WltoNrQo1aC4lI9
ihelIKtajSREkGIHudtK0cbOqUm29tlG2kpOqduToNaD0NV0dlcoDfagrTolINlChR5S4oN+Uezk
20qNBxqVp8ptqkd6DZR2oFIUpb0qPFadXUuXJXt+rKSqu1NWW09kF0dFhyl+gNElY2VfR3+fg/IF
hNn9l0aKzdi192oTbNlagPmTUpdk0Kq3vtdJsqpSq6otRWozb+7tOhZ90d3Qrm3S0bXOtojamxs/
erd7w25spVNRq7K1LRlXVQoa70FjqJBRyW0qjqPNCoqklI4VyKrQrMEGGqiVKNKf71dWYJ9Qb0qF
aRQtC85JWlRoN1GSlHa6koFIUHpqt9qVHPfbKU9GQNk0IaJ6xtDRvtSnM/ib5wp1NdKnttvKjvPa
2nvOUGyVZRRQ1qNtgUquq9qNV1UopVV6OtopFAS4UnQodqraeNdUub9u0El1a/0L79FSdJsbXTmo
0bzAaZWdJ6W+6lBRhJp929VTbGRkhXFHZsCm59UoUPoXUeh9qd6opM5ZxsElaed7dV+TVF0MbGrR
K0NECYoWygS2S4bRQ3ufK2jrQKaETuraVWttkvRNAdnu1htbG0x12aCHcVVyxRKA3bdlGhsnu2bN
NDu3KqbdpczMo8babTRmqpQk2bzbqkoUFaW2zZ29qGUszgJqJTdspb0ajOnara2th5je3NtM6pqj
tLRONEVclY/0YjOtohq9SRtSjRNAp5SjTwS92+caeyk2SoVVouFqp/QaqPJP0G2au23JZ0d6Jb77
f2Sm22bb77bb77ftttKW/yl++2ZKW22ftvvttvvt+bbbSz9t+7Sze5XoxbQW0bXKunEmEV/WhoyG
jVzXJ5dCMykKEqjbc7UlJCpKfx9RTlUIN0G3d0E25soFAUGGbZS5t3jROewE+0Wlrlvv2UpS33nU
5z35Ue++8pbIe9608n2hfeiUpbq78nNSpN995Slara21I19mhaf+fJcMoDbZBokX0aQTKsXJXOue
IGqm1Nst7UUaIb1BLnObtm+/LeuLVKhdDnCkaPKNFo7vRo9aWn51Q28UvaSCS1tnM22zbbM22/bZ
XdWcpSlkpdlKlug22YNts2Uk0bczN9qO0slLJShT8pTaXZbVfvvwmuTW0cK51zW0FiYE9qgoQ8V7
UjRS2aKVOVz5UNNuqqc1GjJ4deuw77ylvOc99995S3338bT7Ofckh333lLfec95tjbKU9999pUt+
znPvUI/feUp7y6LqJXu8pTnvv3s5jbf95Ie5vvOctt571VtLec9991VWqp1W0IbpKoOqypt8pb77
7yk2UaDZoM5MD+J1yYGy6NYa62gl2UKOKIHLupSgKkqCjUZQJQFcoWpOcKCkUCUcUPosHbYosoPR
aNQtDRUsqFTqVIUEUEUXVlRFCFCFCVLUuiwalqXtRKcKEKEKEaO1LUu1S1KpIoGyhChFCjKVS1LU
tSyKEKEaygCi5FDVLUpQVS1K0bFCFCFCFCFBUKdS1L2palolCFCVE0VRNSpalU7UtStZRRQhRJQZ
QlS1LUtSlBlCFBlBlBFDFDFClCFBlBlB1OUCUMUMUGUIUIUGUUUQUMUOUGUGUGUGUKUTUtSlBlBl
BlBlFlClFFAFBlBlBlBlBFEFBlEFBlBlBlB1LUtS1KUGUGUGUHUtS1LUpQZQZQZQdS1LUtSlBFBl
BlCVLUtS1KUIUGUGUFUtS1LUpQRQZQZQdS1LUtSlCFBlBlB1LUtS1KUIUGUGUHUxQNR1KUGUGUGU
FUlR1LUZQLWo1837VBTbfzbYKBAU3UlQwqOygtFgqPNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0ND
Q0NDU1NDQ0NDRUFUVA0NDQ0VAUT9StDQ0UKiKEqZoaGho52omloqBoaCh6laqMhKVRUJSlKWxylK
RyltJ4suycspMpKiUGUs2tqpR1TlFWUiUoUm3UKkKNqC59pVbVlCoGrRcFWIYaLg0XAU/ouBC3yU
KB2aKJQ9QlBFGVdyqqupVTVZSbTV5SNXFKKbIdymaVUUld928pSqKvxtbykarylu2t+9JuKRqlva
22r6UWaP6OhjP5ThThSlW+U4U4UrVpSJThThSkynCnN1quo0VKpqkpGq0Er2q6r6vacz6VMpGhOr
96RSNXVe31Sgb23tV1e20igN6VXVTQKO3pFI71Q2XUFS0qRSlU8aFFCmSmarqsKfynVNW1VQtQpm
r6vqip7kClKZQZQDfVZSNX1eKsy6uqir6pbG2kUnVFOlV11U31eUjTq78yq6pKRqyqm+qRV9XNrb
1v4dAoAoOh5Tei4qBQZQdCgUGUHQKK0WXosGgUE5QoUKFChQoUKFChQoUKr0XVyhbXQoNbXQ0WXo
sujQa2uhQa2uhQa2uhQa2uhQa2uhQavoBopUmlppUmlppUmlppUnjpUpoJSfQTpUiaVI6pb6qKVb
qdU1WdKkTSpHKkgqHqA6VKkdKkcEDcqpSpFBlB0qRQfVClOzpcpFB0qRQZQdKkUHlUFI74gKDpUi
gyg6VIoNXcoOlSKDKCpUkFRS0KiqI6iqLRlRVFUVRaMqKoqiqLRlRVEdRVFoyoqiUCDzS6KwJaub
CmSmSkplMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMl
MlM3ZTJTI8pkpnjIUyUznCmSmVLKZKZt4pkpmSApkplWRTJTN6RTJTOFMlMlMlMlMlMlMlMlMlMl
MlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlMlM+ylMlMgpkpmuU0UyuUygKmt3z
JnMyppU0qaVNOcyZzMqaVNKmlTTnMmczKmlTSppU05znOuVN1BU0qaJznOGsKmlTUE84TzhPOE84
TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TxsKfl3b0Ep7lK1bvvvOc57777znOe+++85z
nvvvvOc57777znOe+++85znvvvvOc57777znOe+++85znvvS7vvOc5775zbfec5z33QgDfec5z33
GYN95znPffgG+85znvvvvOc57777znOe+++7k597Ofd999+qzH0lRvvvvmTzrb2e+++/Zz/Jz333
337Oc57777znOe+5O+85znvulzWLb7znOe+6xqUJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMUU
nOc1FNGKKTnOaimjFFJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMUUnOc1FNGKKTnOaimjFFJzn
NRTRiinez76imjFFOzE+qKE2uiKu6vtrL+4tlZhh/5CP3BxLfuOW5EMK7J9dmjAYvn/xhzGH9Nbx
fo7/n/z/LXjCIjxGs47nw+4uXi72W44w+yMkK69+Ox7CGQeyOsu8YfZll/z8gtfwhWiXeHP7/LSP
Ma0M/13rWH37Kj8tniu9griXOOBlXu7XYXOJeYuwj7xdlWYay6zClzLR3XeiM//+CSvD/9lY/XY2
VnresiwM8fixsbKzo8EETK8Hh/////////znPO7wn3+/////+f//+eDA/xmROGYBlev+aQC9aMP/
HI/cHEt445bkQwsjJ9eIegOr5k9nZ1MAAf//////////9CoAJU0CAAAb+iruEf//////////////
////////ffF8z1iy33fo7/n/zPLDPEbwRrOIM+H3H7xd7LccYfZGSDKvfjserOQjkFnsHjl4w+zW
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
+1BB3YdzLF/W/+DMcsWtcVpxYRrvUzktpfN7ak2UOXnZ0e7eHe9yVLm05CfEGBB8OZ6CeC+XcuW7
OCDEGegcdrwuxye3J7SQIMxAgxBne9lupvsw2t27ucuIMzm+bCVoFft2v1kU6gxBKW/y6g+koooq
rttt4QSlvySqs5K8tbJb3fV0EObZ6jOqM+/MnqqnNVKycWdKrlVKlVPaqc1U3qv1MdVWGpqprdVJ
VViqnXTniqphVc54qqa1UmGuqkxugqpzVYObr3NVcwyiqyLLyqnVVKjquUB6DpfTniazotavDH6G
xH1VfPQVU+qpXqpQqp5QuqrDl1fVSPVTGqmpnzxXQVXqr9VLvNVfqpDfZxVWebsddLt1U9qs3UUB
qqoNV+qrFVS7fPlBkVVIVVmqnDq6qknnqp5VSZVlVyqmVVIFWVW6qa1Um9IzPRz1UlVWo6qaVUtR
RVWMjqpF546qc1UoUFWVXquqarlBQKqxVT+pqphlVmKqlSqlZc9X1WqqW6uqpFqpcqyrKuqu1Uxq
pyfKqd1NVLNVNLjiqp/VYqpGq6qmFWdqipq+rT6yOrYqqaVUw61WaqQud1U6zKqXqqRKqYVUgVX6
r9VLVXVXqqY1Ur8+Lmqu1X6qaVU6uauKqnFVKlV+pqpQ6H7VU7qY6rlXUCoKrMWVPPVS3VTyqm1V
MOnNzc1VMarRo6qeVUziqpKqppkdVqOqkOpqarIoKt51zqqmVBvpVTqqnVVKXNVdNVS/VSjlVNqq
R6qQaqdRVXOlVOqqX6qbVUr1U9upqavq2qkuqxUVdVStE+xux4zvnx5Veq66qYVUg1XarMd3nPVT
mK6mqleqleqlA1W1XaCgMaq3Vbq/nquVe/OlV6cNdm7au0letXdpK7V2krtXaSu1dpK7V2krtXaS
u1dpK7V2krtc9XVdVeq6oq23lRVejyoquxmiqX054z1U8qp3V2477njzOjq7KCoqsc9V+o5lVhsq
sVUxoIp7njq+q5z8850ivSV2qujqvVdV1BVejqtHPVbzeqqc1bVtV26rFV/pVTiqxQUW6uqyraud
Vypu9VU7qp5HVeqpxHU26lbWVdOc+SXdBi5z2aq3VTDLVVmq+eq7VTGreaKrFQc1VMuaqmVBnb2z
1PPz8/bG3VTSqmlVNKqaVWqmrqrVVmq1G+/TOZaNrfPV9RnOeK6Dn5qC6sq+p5+aqxVcqd1fVcM7
ypypurIsoFeZfroKiI3NVsVVjfa+7WUCeGqL3HFRt9jc/Pz8/MYxqqaVU0qppVTSqzz1WqrNVrmP
lBrtFUVc+3Mqsqu1WsZ6rtVndWTlV6q1cUdXz2Ltd9tR6Oaoqphmu1VMXrNmWlQd6G2u1Wcyj3rZ
j1XKt5+fn5zGMaqmlVNKqaVU0qs1W6sqtVWqrVX1XKrEXe73VciiyjqKvq6oznq/mzrz97q6rqr9
V6q9HdBGfM7XU98qsxVfV/Wq0bmw1Vuqys1QVNVycbq7nyoqObnqvVUxqdOqmLygiuq5zLrR9arU
dRs3Q1Vk1Vup5o9Rx1U7qpzFFe6mOOrprn5+fnMYxqqaVU0qppVTSq1V1V6q1VaqtVXo8qtn3dW8
3XI6r3NqraqcUFViqnFV2oyM3bni3VlXXU3H0jPV1VO6qeVU7qp2ql3z7oD5ke6uxX0dBlXUHOsy
q3VtRz81RVeuq/VZSqyKgNViyqxFQVUx5qqZbnufn5+cxjGqppVTSqmlVNKrR6rtVqqzVaq5aXMu
l1XatqKvuLnVXc3Sq1Vdjq+rIquq+444rOc2XZl3ZlHl3zc1Viq3VsW3ixUHbp06xUFTiXNV/Pz8
/OYxjVU0qppVTSqmlVluqzVZqtdKsPdBQZ27c2HoDKoq6rKiOgqat7rmqvOqwjH6VO86NugZ0c1B
uLW6rFR0qta3pLO7VA26CgoOaow9uPVxXV3bZufn5+cxjGqppVTSqmlVNKrNVM/arVVqq1z1XqrR
ul1Kiyreeq7VYoLqvVZqpur6r1X1fVTipfPay7qTVW8qu1N1Uwq3mVVMaiKg7dcquVNHbqu3s1Vg
zqpxVTOrnVTNsxqCq5i1MZVTKPHFlVpVUy58P07VU7qpyosquRx1f06c/Pz85jGNVTSqmlVNKqaV
WTGqs1WqrVV2g56qcVbzd7q66CPRj1XknFrD1NVjedTdbjqavPcdS6t56nmyLmw9XVMdBFVZdXxH
qzmoKrFRVtVmoq2qxUVfV6iNVddV2Kj3zc/Pz85jGNVTSqmlVNKqaVWqrVVqq1261X1VTmoqplVd
NUbqyJZQUFB2q+ru1Vyr+t896oamqxVafeqxV1TzVX6rVVqqnG/KvquZrmq+q7VlVPaqY1WqqdVU
yqv1U4qppqr6rVVqr9ZzVZMbqpjVdq/nqt1NViqnvPz8/OYxjVU0qppVTSqmlVqq1Vaqs9ekVXVf
QZHVcqyqxQVfkfNFFiy8s1TnaK4o+fn6HZ+t1HMc3NzKKM8cVTQc3NU0HahoI47oDc1RHGZ5V9WV
ZzRVXKtM6mpq3KDtQx83NzR0F85jUE46nmoearKv6Giiq82VOZUZz8/PzmMY1VNKqaVU0qppVZ3V
aqtVWtVUx3cVRVb6N1Uyx86yrjVZz63j59TlxVW6rS1Vd3VTKqmT5um4o6s3VcijmHcdVzdX68qy
q7VTCqmNVqKqmNVPaqaVU5s6qtVf5rtUPZ6qdVUxqsKq7VTGqntVNKCaVV+qnFVqqyeqxnPz8/OY
xjVU0qppVTSqmlVqq1VaqtVWKtjqvVGOgqM56tNVcquxRKrOeO1kUQq/KGOOgoDGj53zVfVbqp1l
WVZVcquVbVtXVNBlVMar9Vqr6Htzc0cdBQGxc1X1WsccdWVZVcquVbVuVU6qpjVfqtdqCpqebm67
126UVRV7iNHHUVFX1flVuqnNVMar9BlW1bU1PNzRx0PaqzV+RUE5QUBjRx0FBl9aiqnFVMcjMcxu
btVdqu9qCq/VZquZOUNS+sXPzvn5zVZ0MqCqlKq50qs1U5qpfuq/zyKr6qcc2VUgVU3qplz1fHz1
WKqa3VTSqmlVNKqaHuKr6vNEns9V2qlc9XVdU1UqI9Su+J1WInG6rsVnqpCqp/VkcdVMaqRTHqpB
qp1z1WKuqpnVcqOmrW2t9mqDptdUuY1M6rNVMaqY5V9VPqqUKqUD1U9xs1Te8qDc1VNKqaVU0qpp
HHFVTfHfeqnx6A56ri6HoKuoufMPVaMsqyr6mqliqliomld83NVSMe9GoLq+qmkdVOu/TtdRV5o8
xaUdVMasquGqzJuIyeCPmVWc9VOqqoGqqcVU0qppVTSqmlDEer+uHoGzUJ+eq88Z1VYqDHPHzVec
3Xq+ZVaYxueLmqpYqpXqpYqpYvm5ru+bmOeqntVPqqenPV+sqKsq2qmlVN6qa1ZVeqpWqpYqpYqp
pVTSqmlVNM65d0GPtQVUoR0PPzVZlSqDD87OzUXNVTAxqm8PQVbzurFdBQNo8ToMns6mygPV0nNQ
YjR89V3noKAzuq5Vcvn5qrFWUBzYarass3PzKq6bnPHQRc9VOVG6I3PVTDmOaidVM4uuR2ep6c9D
eOp5qqWKqWKqWKqWL5ua7vm5rs541o14qqaVU0qppVTSqliqliqliqli+bmu7qOa7OeqxVYxXdBV
Z7WzaoIqCoUdXxc1VMqvqp5VTOqxVdquR1Xjmw9VOamOgurOe4qm4qi+aqmlVNKqaVU0qpYqpTqp
1VTq6tiZz3d3VTSqmlVMKr9RiXbuluRa6dshVTuqnlV8x7ZA9u5Xd1U6sEXVT+qk3mqKt7Z2T6zF
Jeu8zQXNZOHm7WqKciNMTuayCxCmgszM06Nja1pPLoefnj79sNQJZHzc3NHHzczbqDnvXpzn12Pb
ffMKZZznjoznqcidnVAdHvFUG3e/b1vc4bKM/PFucdnPvtZuj13Oc58qdc/Pz9qHMSWKPm5uaOOo
5m3UWc8xo5zzEzZ7oOxsWRHV8/iPHzR67SRG3znOc8d+Hl5zmxs6yPI+iyLO225zc5rUWWeMzbfT
p7t5t+M5znyp685o4juktYo+Y7q+roqieq91B+3Tms8x0Pc52MsiOrj2r5+aPq98xnznOc4cG75u
pbUWuap54r59Nt30iNLIjGjPnNzR1NWVfVnNz88fNzR3FmH5zO6h2ft16Yc5zvOWXnNV989RQG57
fseVFvn56irKsqbvmqyr6uq6rKs5+eaN25zdrbbuKKI2oqsqyrquqyrOfn2ahu9ZFU9jnOeF5fbZ
unnNz85Gzwu3J9FHDLVDzxx0HYxqDFnPzc3Nz8/NzNurDnPr05z67HtugzPhr2Y0R6O3zVdkTOdI
6OfFUGvft625wxqM9TFtuznbs3R67mMY0VXaj54+1DhsSxc/Nzc3Pz1ZzNurDnPMaOc81NnPdB2N
iNEdXzzGHjqI9OTmM+cxjGPbudi5zmxs6znNztZFm+225zc5rUWWeMzbfTp7t5t+MxjGNU9Y+Y/M
d0lrFz8x7quVfFUT1XurD9lzWeY6Huc7GRojq+favn5o+r3zGfOYxjJw27qOpbUWuarqmK6nVtu+
nMaWZRjRnNzc0dTVtX1bzc9THUc0dxZkdTE7qHZ+9B0MYxjTGcjHzmquXU1ZQGqbtc5qsO6mpqyr
Ktqbuoq2r6vq+rKs5+eaN2qTR9rbd3FFzG1FVlWVfV9WVZz8+zUN3rIqnsYxjQyzdUfv7U1ZUNfD
Gi3ceYdUJqvqyrDXfNlRV54+9AY8SoKqYGhPZ2dTAAH///////////QqACVSAgAAbsjhDRH/////
/////////////////6giPU1ZlRVe56sqctqpiygqsVdVtBz1G+cVNRHz1U7idViraCg5op5UEd7u
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
PQVXaqYVOZFQVUwq6KqTfkKrBqtoLPVLnYd9Q2Kiqziuq1VSpdVo1VPqqXuaq8aOoiq2gFVIFVKg
NVTTmuqnFWGiqv1fVdq3n5qtEdiLmFBxqrEO9Bznqgi56nMRu2phd6GFiNQpYUuXDmi58mqrlWcz
ji7UW4tde2u3Z5fI5D1Ah6K4Tfmtjbvnqasqwx+vRZb86nvb7dfe17xUaNFG324nXppHvmNzrp25
7NGZnvGjHVnSWRm6VPSl6XxOj3tn56sN264unRPq/Ln/H2oOvr7KjnLRo+z6Lou3vTyTK69R98Rr
plyrIzTnPUzhuchd4tnLa8shu32z3XPKY/ENaoLb73fPEbH27ezCnJxWutB0fPQUusoGvj66yj3s
9aO/44h3u81MugWUGY8zvbZ+fnfe5hnnfMM5nM3s1+zKvOY8fNU8yq5GviaveIgz2pI3hlQPn0ux
3N78R+Zq5nXTbyis1qpqDUVOfNc3XPJ/pp7os1On9x8TDmu9SD++N7voN3cdTV1WVYY/Xost+dT3
Pvt197W8VHkXNzxt9uJ1oeusPfMapXTtz2bnicZ8aMzq40uyNGa76VPT50vidHvdn56sN264unRP
q/L3u+1B19fZUc5eGj7Pouq7e9PJMrr28Pe+I106ZcqyM05U1do1Tm7vM2chrw5Ddvtk5rn+GPxD
WqC7vuc/PEbL7dtNTk4rXXKDpfPQb0aglXxvWUe9nrc9/xxT7vOm3QLKDMeZ3u2fn533uYZ/Jgxn
N5m9mucm1ecx4+ap5lVyNFfEPsypWe1JG8Mlt1PRdjub3tH5rVzeum3lEeK1U1BtynzXN1zzfTT7
UWanTrHxLijzPzztL/ZQp5xOegPzUBqvj56uPOVFV+qnd893VZqpTqpaqKlVU7qVVTbmqtVZVShV
Yq3Myq7eVbzXVTyraiqndmpKigNFzVaqDnjq5O6g5o+BeXdRzmVWn5qtyo54zWeg7djmqyrsdBUR
0CNUmqaqbVFTV1TVS1V91U0iqp2c+Opq3noKiOq1HVSJVSA4qrNXVU6qpga+fo6uqpVPFV1T2s9V
N6qZ1XeaKj56uiPHlx1fV0dW1U8qyPfNdVOzRVN9DqqzzxVdV1XVdQGq6qweoqvVUp1UiGqfOuVM
dVMququ0FV7mjq+poOY9VKuVXKqZRx1NBU5Vyqunq6rOlV2qxz1NXVU/q6M8ZjZln5qiq0a6rOaz
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
+TP06rdN+OTT4Fr3+qSC1X7SV03LI5yY2a0uv9ON3z5Ma6MyTmjxd+/T27Mbof1znTueYWUZ9vet
30udbfvlpw3T93faYnd8CLWjTvVN3zPns6s2LZpo/Xpvn7WqsdxevsLW9Nfb9lN87b3UezkRsSw/
k2uBdBpua2uvaYnF7MK+rnNdprXZR30vf4ukyOWjT6NW/Y10OqCY6bozqcZJdd5QXksxvv22b17y
Pv07UElvzb6dJjnveXMXnTpidpbaanemGu3kXROcav2b0deLbb0yy94F0n2C1J3krp3K3uY2a0qD
T57vnyY10ZknuOJ0HT27iN0OnOdO55jMo4+z3rd9LnW375asTI353d95j3Za1o07107vmdTZ1ZsX
bqaajfR8/a1VruJ9tGtb1Rr2/ZTUfbe6icnIosSw/k2iVBpua7JdpicXswj9XOa7TWuyjvrfbgU5
Mj3Rp9Grv2POkaoJjpujOpx7oOu8oLyWa337bi9e8j7t9qCQnmPouznPTcxr3VlTVmqrvSNn54qA
+ZHVTqq+fnqYz1WarlWHt3HdAdRRUF26qd1U15+ZZ0PzR81Bz8/SKOPms9V81BrDX2NvUXNFQJmM
e6A9WWepqD6y+bDHP0VTVTurXzadVzrHQKPLO8oDRmioOiiqamqkiq9QXQdKGqxVced+eraqa87P
FQUHWrHzUFXWY1W1U4qpXNQdqCgcXNznqs1fUVZz9qtqw3aqmvQ1AfEeraqRartWUFViqxVTOrHV
ZNV1Vg9TH0qdVUxygqu1XKqZnqMPzVFVrnuqnNWmqpjVTGraiq9VenO1X0FRmVfU82Zuo56mOqzV
ej6dqu0aKOrsjyrI6qZVZcxVeyioIqCqxho6uOeKqmNBlBVeq6Kqk+pSq2rqqdVdrKA/NUZV11dV
TWq9QG56rXM0ZXrtVtWOq7VSLVZNVlVMbi7RnNQc6qppVaquZVt1FVPMq5c+VX6CqkWqxVTir87V
U6iq7pUmqsqgqeeq7zVNVMpzrVh9826rFRUGoOeM9RV1VOu3ZdzqqmMV8++1Th6B83OqrNAdUHN3
oD1WqtSXtXVKeKhjzKmOKpznqv83PzUFx5VuZioDVWYubv2fSq1Zu7xRX2XWqxV89QZ1dBFdBcWU
Dj7ZV9WVdVtVjnNVd7c0cSMepyq/lXVWnGY5s1VZqu9qg1TUnq2q2+y3HmVddxOOzZjNV/eo5jxL
tGf+fwM42fpU81Vyq7FU1Y6BpnzncbqsUHNm6A0ZsfZRqrHzn7c0WRR2Y3PU+HSyguLoaou6CrKr
rP3XegoOtBzrnoDboKnd1WMzHlmugzpHQVWKrGc0fOdH54leZdDly3QZVlW876ZQZVaOc9VPKDvF
pUGUEcfMjdT0PegoKDvQdau6n5z0BtVWo+fcfNs8V1Xo2c3NVcqvH787quUDdSerKsPzZzxULPUc
x+bKrNWKojiiurrqvZd9XHcVxn1Z+5+bnx5HZjx5VajdTvnqb1zVHTmVBEeOKPnNV3Pzdrj51Q81
DVboI751HHUW3V8b7RczjuguKcq+q0erV7QKgoKBUFBkeVdVzUdCu9WVfnaq4bmWVMa54lEd1Wqu
zmqvR88Ud0BzVXO2KraipqTR7oVidVnDOrksM+3Nt1WelXZFdmM6s7RVXaiq1VlxUFvpdVi1rnyo
q7v3qDZjPl3E1UR80fO+fdViOq5QGoaszp35l3oOveg69d0G6sw1XVXaHnoI46nrh6lOKOPKDrVc
u6sqLuoi5sMdnPFFZz1dHU1fUG5jxRGqppVtAqDpfMeOpPQPM7nEaNfWgZqDtfXZlQRHyI2R1B86
c0UR0+lVjDKpq02qrRu9WGoFFeVcqsqsKgjP35+eq9NZnOehztVYq2LdVuaiztFEdnuKzR1F5VeM
egoMqu0NQY3RR89mPfNlBQVCq+I3PHUniioYup06rJ8qbJZpVEbu4r5z0He6jnuqzUR3Z+agvmjS
XOo6Dn56tqI4merqjmq1LWGmaB44sztH3VSegPFztVZFHlV09WUFVug7HjTdX4erNncUUeRc997z
nfN2qEarsq2oqy6DMuqnFV7Ksqs4+1X3QdFnWgVVo9V66CgzL7XVmG7PpQHWUFBdXqq1dB1zKC6r
1ReKrMoOx1QZzc7PQLnqphVkfOagNHFl80XN1PzR9evPfbInQVdVlBby4quqavoKhvI7qar1Vk3N
ViquVU5oKCOqmLoKqcVW06sqKu5+6w3NVpzRmq6q5zVYqCq1VeoKqY1CaqpzVcdWVZHdqO+aq1V1
W1dz1FpGjSjaVRV1WHNzUBj9TRxYahPU4zR0GVEed+lBdR1ioI6rFRzdD5UVd/BoqqcnoOtBdBnN
VYoKr95edqAz6I9V+rKsygug6s9Vs0XPjoLvthqA9x87oMXR3QVXbqEar7jb7VWTVZV1Sagq6ooK
g0aVVqq4qCgqpjVTmgdVOKrdWM9V6rKuqO9Bzc9XVYbmqudqvSqyqzVeoKCqnNVMVzuq5VZuq7Vl
RVlVqqnFBQc/NVtXVXKu3VcqOaOq9VaoDRx9YqCq7VjoKCqnFVvuubnq6oqzfNVcq6rDVWar1BQK
rKvVVnd1XKqcVUxdBVbqvxVYeojqKrlX8y5qmrasOarObtV6qs1XFUHvKqb3VTk56g5qqdVU5NUV
U0qs1Wj0FVw/Oaq1QVXnqq/VTWOg5jUEUeHqsTFVMqnmPHU1NVyq68yoqaqcdqiKgqObnqpzVaq6
rsqKmoqppVf5ozxVU4P07XFQdutVmqmVR3qtnoI6rx6CgWzd4jmdVl0EVW85+fKr1X0X4KhdVOIn
VlTVT6q3QVZVmVU5qpjV1X1UvVFVw/P37datjjqsUcVVrvVZqs3QVWdVWjmq+qndVNnV1VKlVmrL
1VTirqrlVPqto6DtU88VX1PNHVh3VTHpHVTfKtq2gqpxVf56rB+1Viq1VaqpCqaF5Vzq2pq5uqzV
Tmz1U4q3q6s70OHqphVSAarKqa1EcRoufzKCr6qaxVX6CqmnNVTiqkCrY+narKsquVU4qvLKrHPV
0dViqlKrz1fVlRVTjnqp3VdPV9WGqt1U7PlX1U0qp/3ioTxuK+eq5VtDV1Aeqm9V6q7QVU4qpxVT
Kqm1VP6qeVWKqaPqarXQVZVj5qvq+oq5UFVOLquRHqyqmtmUdWp1U0qpjQRVXnVcoavi71FWHqp7
V+olURVWar5uaq8bmP0qu89WVU7N0qyoxrKs1zHy8bVW89XVFVir+9BFVTqqnNX1XamgNQXVlTVk
dBVTCr6tqvXVbqptVZqpaoKuqvuq9QVUyoz1U66tXG0frueuhXNkSiqDRNGcaeUGtx2sNIZnN0Pe
omulBe1z9ojUPQfffHTcCiJ6aZ7dkn0s3ftcxZE50tE7eePUXSl/i324E5tF2vEf+Mem7zLxrsQZ
adzRHgUd9rXmdEr329zpMWjaJtefb7btFXZDcXArxZNLoW6dul+L+Evune1KXx06efOlP7rtMXfT
5ieedKPJzCm76dZXWXwjfzLna+beW8WpN/Vuc5+1CndvpcXTdnkJ35M5n00m9L7c77lami7rLoOl
9ubyPRuqugu+lRugi1fbbXm36WIn1N9uyT6HM+1zByJ4zpa4EK3m3rm6Uv8HfbgTmzazwva8R1j0
35eZeNdiDi9nc17wKO+1rWdErfbuvc6TB7UcWuBDW5L7dt2qZnIbi88WXpUfQq+3S/F/CSTvaleP
6zfOhXWnMXfSTMd5voajeTmFN3060bbWyJ5cuubbN0t4tSb+rc5z9qFMx7fQ8XTtZ5CJ/JnM+mk3
0XlzvuVvvN3WGug632qJiPRqCgy6Cgu+tRugxxLNq0u9RE6A9Vur8qw1VNYoj5vnNVTY2VKPGaqn
1BlRVTCrqrlBVY3VbdVOOe6rXO6tqs9z5UxUEVViLrQHq6OzLOe8znXfvEezo+UFVjZ6A8ZzRX2j
ivLxVFRab4EczoKk1XuqxQc1VurTVFRzcx+Yx+d1NBGeqn65uagqt1UhVBqio7RUCquVU1dFz0FV
q6CLnq6qxHl1fHNVdURZVZ5qt6OrTVUwV8CYjUDqu89Vmq5VcyoqphVTh1dhqrNRz1WLqKjr0qyq
3QVdVaqYjVUxq+hqp1VSnzXGarKsuooKGr6tq+qzQc6PVlVK9VzKsjVBQVbz1WarNXVX6r1Vqraj
vZ6qfZVaq/njypqpzVT2OO6hx1XKg9W1ZVtX9I0egPVTCOrqiouq1U0FXVdV3PV65qru6rvPaiqs
HoOeqmFV11U4qatqKrEXY/ObFur6r9Vuq26rtXd6v71ZVTUl1qt1Xz89X1W1VSDnSrY6irannq2q
mMVW1MS5qtqDVKq2qnVVOKmq5lVNLeRqgnI7vgQunPuros71HNV3PFfPQc8cUw1V1WVfVeqtVFBF
Hsxzbq+8iq7mqd3VbaObRj5a7xnqyrKujtsxjz6i681BQUHPQc3fnjoIufnyN1NWugoDZQZUHN1q
I7w1TF0q+pqyOo7q6vPQDMVmPu6CgoMiq6rja56tq45qs5s6Yf01m79unWPUUwbOxnfegiq7mqyr
qu57jPQVd0oat5r61PNFFU1FnvLUTqs2YTxrqI+2TlWHquVLqDR4qCgurKDtznsVEcWc3epqObmq
DXQ1WBEY52c7qeZ85z1YsuodTfPHVtWRVdVve769efvU5U5kd22eqmBqCOqnioKrK585sVBFugNH
FHEeqxEc54qqYHNl0FBVuVfHVZNfOaKKPrjdQueroqirqsdVmq9z0HPFo5jVNWZcdW8+c3Sq6mY6
uY9xniNV/PUc2ZedaqY1U5VAZxmvnvmvKr1S6l2nFVcUfU8UVVrpVvNUc0VVqzVWs3VaoI+fKnDm
q+Mx1zmuDquVJ+BB6CPn5o6CgcxF2q6r6sijioKtqW6iq1VdoIqGPKDvkfXDm7VdFl82XHVkdR3q
ear3auq1QVfYw5nh8VmvO6uOrKg8WVdUxVGZHU3PzWZ0vL5ux+h27VBFUxxVZEah6c1BcdRup5ue
gMbpjPvVzjoNVFVjnqT1Fx3UmugoKhGjjjiqfYuagiq24jRGOoqu6tqrDVc7nKkyqzIoqujqaipo
YqCgVWc1DUKI9xc2uaq7fbmqprE6rvQziO4+eyx+fZ6C7iy48zLq6roomaqnPXm71OPDRRmyo1NH
54lQUB75oquoOerebO95fV0Fx1ZVy5qviqXQVWL2Z5QTxo7qKsqednvJyzVdUUFqI9RkeVWasy6u
qzmd1dVy5446u8581Vx46uNULI4hUK8iqD4c5znyoPVyqw1SfdW1PNzx52jNUnnjRlDdo+eq7FMV
ZQburqBVddS0erKnpFU3mI8fNV7yrueq9mVEUVVjm5jVWTnoI46shzxmNVhje1fkXc8aNnNfVx9W
6BVFA4jdelX83Xn71FSagyr6i+tVk9X9z89BVejqt3QRVU5q6LmqphFF2oKu61ZQUFXdaig7n56r
1Vw9Vmq3T2dnUwAB///////////0KgAlVAIAAEimEKcR///////////////////////PQHqpzzVU
woIou9Xc0VXdurPQGq2gziRVXWeqzVYExVajiquVU5dW3V9WW73nU/MeLdW527e1blxVZqz2+9BV
dqtR88XNnNHV9XY4qt696rtV3Sqtc1TUVFVmrudUFxx1bcVnxGoHFVtV2rqviqurHVZqs9+tXc7V
XUFXHjugurKi11jMc9WnFnqsnNdBQVYerrq/O+VHPmVWKvMY5Xmqbqbi7VdnPHQVWjc3NUG1V+Zl
Bzdu2d+lBz1XuegqphFFzRRVZV1X1WaDvV3WgqKDr3oIsPznquH56r1BF0VBQGug71ZzRdauoKCo
oKCgw0Z+/U9XnPVvSM8UdTFV9WVdVsVm57qy6rMU9V67RVfqq2frVtV2q8u9Vmq1UVHPV1VOauqF
Qx3cUWJ0FTVaqt1bFV1X1Xarvdcyq7qeqnNXVGueqzURx3cRmqmqzE8yrqujqsc93VTqruer6rdV
qoqI7taqKluKJKrqvqu1Xatiqs1W75+vdVWqrNRUdukd1d1upoKA9BFzc/MeKJ1Wardqrak0cQqp
1lBVZjqy6qaxVU8qv82VNWeVdVc5nz1U5q+q9VTmqmVSfKuqpj1i585qCrqqe1OVGKoqOagvnqvV
FTVb5uapqaqe89Vq6qeVUoVXaip54ryrz6oMVX9ozUFWUDquGNV9V08VWqqxVZ6X2t0FBz1Ybmx1
WXV8fNQRx1WnH1oMqpCurKBxW6mOKLDaNQmqzKCq1U1WqtiqpjVTuqnEbqs0FVMavuqmx6raqKqe
1FVyqmVV5RxxVNBVcyqmNXVbVcqpnVdquRcyqsc9BVT6r6qZ1UxiPVTbKqeVPOeqmMVTVcqsc1V+
qmfNlVOaDrVcqtVEdVMaKrasoqtobZo4tRc3PVTV3zUB6rFVPaCq7VZqu81Vlo9W1dV/PVTOqnJ6
qY0FV1c9BU9+tViqnNViJWfmoKCqmtVOYqiq5HzVU0quZVTSqnlVKtVqq1QVWqrlBzVWKsq6raCq
4ruq9VZqu89VKHNzUNVx8yuKpqpjVZq3m5qkyNUUFVMKiq/VSjU1W6DnVV2qnNVygoIqqcVWXzbq
phVc5jVUx71XKrFT3s9TVlVyod1UwqxH5zYLqanmVWVXOeq52R7iqtRVdVSz1971U4qsxZVtVioq
p5dQqqVKiq5F2iqsmoKrdVMO/bujHOu/fv1oH5Nvq+3Ah98qyPXMbSj7M0WpxpayczPZd24oueTo
eK+BEzCRH35TW59J/draMrINzkw9EE12L+39pSGitaYKvw+08fqJ0xOmy8ZGdwwbTpp9O2r2rVtN
zXbE9LspnWLw23ucxers2QpdPej6nUwnTWbLtM9t03aZ2nvEVnG3pe7R0sz2bxTvRbWtyvN6umK4
pi8pravHTUx6amrWmXfj7bW5bIFrpkykZaIlTHVLTx0m87W9loyhaIhTx6potkB9nRLLhDPVTHc+
lcqW0ZWQtzk09EE12LI/2l9IdKatMYVdY9fSeP3ClMQumy8sjO4YO/4IU1efTtq1dOY6u02+2J6X
ZTOsSNt9pzF6uzZCl087aPraZUTqTprNlnLKz23TX2m9494is43el7tH9zawZ7N4p3otrW5Xm+h6
aXFo95TW8vHTUx6amrWnwIvzbfZbnbIFrpkykZYhESR1SlI6TcWdreykcZQtEQ1z6fN2IFXJMlcm
d5aCRA1Wc/MbVLV1X5lVOHUxrmjqvZVSRVTIVU6qvVUyqpWqp9HVTCqnlVJNVUeKgqptVVH7UF1V
QMVVLlVw9VmIy5r7HqpxV16zWVfduhVVhHMZ1cY7q40cVBUxc/SI982ZV1XUKqzmp+BG6TnZyhA5
S+dM9Qeq7jijdRVcq9R1WaqZVUydVqgioKrlVzmM6A/PVSPV1BVTo9V6gqefmNZ6r1TVTDmq2I9W
4fmq7ChuerKBXVcFRFlaqlyq0aqm3NlDQ1U7oe1VMlVVNqqm1UrvnoKsjzKqV6uq+qkh0GRugVWm
qaCLmqplHQ1XKrVXTlD0q3v3y8jqsRRVfUVZVZqsRvOp+52zRRxs+UC56jmoLoDVFbdVOqqe1U+P
2qp5VTZbedKB5V0cdW5VlVPasiqartVs/SgadBkcXNU0F1XKrHtTkdBlZI1Afm56qd1Uy5+1DQVW
InQX2yPRjVWqr1VmoiiioKtqsVWKr0VQerKrMVRVSBQcz6HqXz0NXR1XTVNVyOgygr2c/Nhz1NVM
at58iqatoOi686q6raDmq3moO2R1XKrVWG53QVWOepq2q1ho3UXfNQUHaqmFViLKmhqsVUxtnfag
q6LD0FVihqKqbtnbPPG60DiOriMeLtHnPzZVTCqnCqzmoKr1VqrroKCgoD0Gr546rBqmr6qZ1FVO
aqeVERjVqCIx6vqs0Fx3zVYaro6qZVU6qD81VKtV2cqplFQRGixxRL2PL68+HmquZ32sHoDUOLnq
6ruegnOfLbNcUbzLi510NkfWro7uhXcyypjq7Nm7c2Xq6uyzVXbdVNOZRxxXdqgqIu8XPm4jnMO3
M6Duc0dVs5zZ0quHcVVNebm64aqlC6vNVbU5VTrKrR3UYNVOldKu2UBzHPVfqzmqI6nmqsVNRGqu
iznoBVlAer+9X1X6rFVuqxQVf1O4uaKmPz6Oc3aPOfmqsVWDxxrIz80w6A2zVLjqye79L51QVDoK
r1X9z1FVyhoIuuGnMoKDmugyhquLpZuvfp36zi7JxtRt1ZzGu6Crbvrz1f17UEUauEdVMak6uznO
agq+O6qaVKPlBVx6rdVMuerklU0FSjRTiOzG6VXKmlqyPMVVOKsqNXQc3NVdoI9UB7qt96CrYqlR
5VtRVTuqnNVMKrFCdncRU2XQVWauScVBHkdRzHqp1UVWKFUNVNqg9V2qlSKI3NHe5w95EZx9GqDq
bpEe5q4uTiNVTmpqefnqs1U3v2qzzxznfmmKrkZjUHU1BMc9VmgoJ6zc9BUxuI7sVU1yM1TlVirI
0g3a6xVERqA0XcVEVAnVcPV1TfNzUBjox+aoieULoczaqpir5utV3ozR85jc/MDXEtd81g5s7G6V
dHFVT6q+fOsZ6mK6DmqQqsugoKtqzmqt1a3QHyK+a7q5qp3UVY6uXPaVWuq0QMdHqaqYVU5PVyqs
89BV1B0ygPUmq+qmXPHUAzZj96vDqVkdTVTKcPU1UxM/e2OPteXE78PVdquHKKKq9QVB4qrVo/al
uqn0V0q3kcVR05qqenq9h1NVKdBUHqDcx2erjy1WqsIHVWVcz3QvIp7tQRHygzusNz1XaDq9op1q
u1Bprm1NRpH7q+aK22Z1bH02fMiurp7OjjPVYquG7drquZnNVjjIcqrFTgioDUJ+9Ae4jY+xqCoj
78/l89VirObmqMVT0Pr33nqVURYc/WjpesVRS0sZqip5+Zd6XXN3jpdXz83NZ6Xtz9YqWj6nNHU1
HNz6pajm70dL3UVVyrjdqWOx32+foehs6mM1K56NlKDRqCpNQGeVdV3SPNLtGc1Bz2fIsMdO8NQd
ctGzVB16nzuo0a7xrpZzex0HXHl6RomY+d1VlBE9W+a97XNboHigjqOI1RU8x7ppg4zy9GdnqTn+
noOlBqgR89io46mrboKjnjtmMeM9QbKCoipY6ml1z96XvzeRUMXPR81L25qXnqt1WLi60fWOlpak
5qiq6c9WXrvR0sXN25+erOaqxfWl6/Kmq8obj7ZzXQx5QVdUUFSfZ6CrqDmoO3Y1Rlox869e+cyv
nOa30aOagjs5zZ1y1Zsjyo5lfc3U5k04z89nP1oDHvIqtPo3PzLvkedepraPfPZ6CNo5stXnU5qj
mNmH69VQXV1xxmjjdB1y+tAc5qg2RUCoP051Veqx82c9VPDVXKrVDVbqp9VTpdarPNHVTqqkqp56
qZ81VMKqe1UhVfVSFVnMY0VR2qpQoOaqnfWqlGqnvPfPzYfm58qt3FQc1VKHNz1apqqmGqC75ucx
o+tVKdVNOeKrarHPUVbVsU0er443edI+aq5F0u6Hqfm5uftQcx+1VOqsoT0lRV1RHQc/tRzTlBqP
mqKvP5V+c0pzVXOagq1VXqmo71UrVMXPVTqqmNVNKqe1U8iq6q9VSnVS7VSkqqRaiqxfc9Vyreap
V3Q0JAoepjqpiep6VXKuqt1dV9RVTmqxQVWKqYRVU7quxc9X1dHPXVcqyJVauuVU5qpiqqdxRxc8
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
737al3QdLvOlHS0ks1ZBWusjl6dunZP64uaqmdVN90FVM6tuLmq+q5dVqqmNVuqmvN1j5qmqmtVN
cqprVTWOr6E9VNaqa1U1qs3Vd56sqpnVTWqmdVNXVTSr6qa1U1jlqprVTW6jmdVNaqa1U1qsXVTa
qmNVNaqa1WqmhqpxVTaqkGqnFVNaqa0NVr2KqzJVTWqmtVWWqrJVTCqmFXVWzUNVMaqY1U1qprVT
WqmtVNaqa1U1qprVtVIFVJFVIFVNqqbVU2qptVSDVTaqm1VMqrdVN6qYVU2qprVTWqmtVNaqa1U1
qprVZqpnVTWqmdVNaqbVU1qprVTWqmtVNaqZ1WqqbVUyqppVTWqmtVNaqa1U1qprVTWq3VTKqmFV
Mqqa1U1qprVTWqmtVNaqa1U1q2qmVRVTKqmtVNaqa1U1qprVTWqmtVMKqYVZVtVNaqa1U1qpxVTW
qmtVOXVTaqmzqprVTWqmtWvDSVX4vaqa1U1qyqn9VNaqa1U6qp5VlVPFuqmtVNaqa1U15uacqprV
TWOqmdB3PMXVTuqnZ6uqpk6vno6u9qplVTLnjqpnVTK3nsV3VTKqmbjqplVTI56sdV6Oq3l3Vyyq
nlVIdV1HTNVdzmzmtPFVbq2puqzVT+qmlVNKG46i6rfPU1bz1U0yq5OxVWpg1VO+bIqrO1lTHEaq
7VTnnPV1Vyq5kVVurKrWa5uepjjoavquVMdVycSOeqnlVParBqmpPHz1XKrkdVMZiqxVTCqqGjZV
mXVtV03N5lVueqw5qsqsGoFVZuM+VXOfKrUxOxbUVVk8V89XxxVXOfKrdVk1VmO6moqx3VcxVU5q
pQ52arTx1NTVTiq5zuqnNVOKqs9VOLqY75z1NVyq1V0VV1VXKrVVNFVTOqw6k8e6uquxGquZH7U1
UlVGVUxvKuqpcqpSqvc9THV3PVcx1FRVSjVT6q/Vdq6q+jLx1fVSp5zZVaqKsqyrKiKrKsqyrKsq
yrKsqDVHMY1WVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVl
WVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlW
VZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWVZVlWV
ZVlWVZVlWVZVTGq0+e6iOqmNVMaqY1UxjNVZjOY56qY1UxqpjVTHn9ij5+bpU1UxqpjVTGqmPPMx
VJlz1UxqpjVTGqmNWVZU83PVTGqmNVMaqY1PMeqmNVMaqY1UxvcUUUdVMaqY1Uxqpjz+Vce46qY1
UxqpjVTF1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY
1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVT
GqmNVMaqY1UxqpjFVTGqmNVMXWdTU1NTU1NTU1NTU1NTU1NTU1dU1NTU1NTU1NTU1NTU1NTU1NTU
1NTU1NTU1NTU1Mb57ybt8ydzc0+aO1dTby3Ux3bUdu42rbi5piO406uq+r89XrtY43z1WVLdVg1T
eWbmqefOerswx4o7yqzz86541zyrOc1X3nO8yru3PVmKJZ2zx5mVOVbV1Tvmq6cUzV1THVYyz1X6
r0XnO2Zt1XYuazaquvnqIzo2VWHMeKjVnNl3HcVHHN1FrHM886qNeuoqy5ZjNn85r8zPKrNRU+ZV
cquVXKmp56mq5VcyjO4lRnUwpi6syhyYc1Me5zndRlTVf8yOKqxGfOc3PMmj54ubn56k3PEbnoas
qyrubnjyo54sbnYouY5+eOJ88d8+VXav1Uc9XVW6tqs88fk5VezmN68qyoPz2e6iI9THVcyK8dVM
KuqvYpiN88c3lRcccdVmK1E7V858OfnOb28dx305ufn54pLVptG54+erKsiiu+bnqY8q+OK4tz/u
JOKI/PU+R3cfvlx1dz3Vem2jo0fOfn8PUKLnzpV0fluNVZV1Xbq2hxe1MdVrmi9oamq/FVzxt1dV
1TVznRzxc0c5W7VdOTyqauiw0d+zGGuo544siyq7zq6jKC46rCNhz4c+HqyrNzPhqrrqyKONXQ83
lTjmLiuzVDqPL5+fn57vn8Oqrx6tvNXZtVdhld0PvlS8jquPIraj5n5fivMqbq7s7xRmyPO1TnlX
PMx1JqrE7dS6umOeO8OeI2TFVzJjM+1dSedMn6iOoqfLNFVcc87jizyXnqvVHNzc3PV0fPFVnPEe
7ZzGduouratqann5qmqnBubnNGfmy4ubn9eGNHVdqarVWnq+q7Vaq2cnKr1VOOaLKqZHq493URZd
mmLTlnaiNR8yy6rPNdz6Ty161ReJtO7x43lHdtzivSW2qNu7xvHlHbeNpe35OPy758i5oqrNV6q5
Vbjiv2KLEeI+VFVMqqcx81Vvm8qea3dTFHF76uepw1XxRnMY0ZqrxrquGOcxjY44qlc5joxjHjis
0dV0xzGdTVd5qrlXGVTltqq9HHhjVWT81RMWbmic2arKg3nlQs9t0VW3kVRlWHXNhneYlR5ntqjz
Luq1UNpUaTfNErvMw6d0eJL1v3DVa2sqyZyq/VTGfftVmojiqI+c15VsXWPKuiqH42Y8RzRHMZu9
YaOJMxzLdtmNHEY8VVwzdmNUmiO0s1tuIxzRRuh3LV2WzGOYx44k8Net2bDHjiMc0TccRjnNlTVl
Vm6F7WVXYutnNFVfMZtm5+bmjj5qrPnnnNVlW1UxqsVFVqKraqaXV9VM6qZ5VTCrebnqphzZVaqs
VFVMqsNVZWc2GiiqpzVTKq1VtW1bUVFVMKioOaqkeqmVW1bVtWnqKhVFRk5VYqplVtW1Xo6ioqKi
Yq2rardViqnKqsVFRVtRUKratq2ranOeoqKioVW1bVaqphzc2VFRh6ioq6rairatqKioqKtq2rat
iMaratq2rciMaratq2rTVbVtW1abKjmq2ratq3Oaratq2rYojVbVtW1bUVFRUVbVtW1bUVFRUVbV
tW1bUVFRUVZVtW1bUVFRUVbVtW1ZUVFRUVZVtW1bUVFRUVbVtW1bUVFRzVbVtW1bEbmiq2ratq2L
mi5qsxRc6NVlBlVPaqe1Xavqp2jnvsjVae56hq2ZnKFRbijWbXc0fNHOVWqrVTVtVuoqOaq/VT/m
jqs1WqrVRbVTkWrqs1Weeq/VfqppVYqpnVTSqmdVNE7q+7qar9V+r6r9WVXKrcVWG5qjKqZVWKtq
yqxGqrRuY0Z6iqmNVjmqw1Viq3VtQarKtqTGiq3mqs1Uh1ZVhpycqp7VT2qmtVMvaqe1U9qpzVbq
v1U9qp7VTaKqntVPT1ZHVTeq1zc1W1EdQ6sqyrKk25wxqtqpAqs1WKA1W1ZVlVmqzVbiVX1ZVlWV
UiVBqs5qqa1U4NVuc3PlVMqrBjVWObVxx1WqrVRUVXJur4jc1VuqkCq7VT2Oq1VlWc1W1U97VU4q
sGqt1bVbPUVbVlWVU0qyhqzmqzmqyrKtq3mMarJuq1VZqyrTVYeqmRqGo5qtqy6rdVmqmlWVZFF3
qturauq+qxqqmtVN6rFX1fVYqsVfV9Viq3VTSqmFVir6rFViqxVYqsVWKrFViqxVYqsVWKrFViqx
VtVItViqweq7VYqsVXartViqmlVNDVWKrtV2qxVYqu1XarFViq7VdqsVWE9nZ1MAAf//////////
9CoAJVYCAADtM52+Ef//////////////////////qu1XarFViq7VdqsVWKrlJVYm6vyq5VczKrlV
zMquVfmZjizmieZmc0VW1Uyq2oqsVGZmRVHNUZl5nuVZVl5lVyq5mVXKrNVNKqYmyozKrmZVcquZ
lVyoqKrcSquZlVyq5mVXFqq5mVXKvzPVVfPVfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q++e
rqsqarVVqqnV1WqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1Vaq
tVWqrVVqq1VaqtLtVaqtRVWqrSqtVWu3lVqq15VaqtZVaqtZFVaqtROq1VaNVaqtVWqrVVqq1Vaq
tVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1Vbqt1W6rdVuq1V
bqt1Wo4o444444444448jjjjEccYq6r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r
6vq+r6vq+r6vq+r6rdVMMqp5VTjnqu3VtVJXNd3d3d3d3d3d3d3d3d3d3d3d37l3dq7u/bu7SrXd
3d3d3d3d3dzvApXd3Jrse7u4n5d3a87Gu7uKW7u7u7u7u7iiiiiiiiiiiiiiiiiiiiiiiiiiiiii
iiiiiiiiiiiiiiiiiiiiiiiiuKKKKKL8vstXQ9iWalafaS+zavYmZcmHlLIvnlmPfiazLSevJV52
7TuWleSbmcwhdJ5RnOnao3K5XjmcN9nL+sxsxxXf299FaW7lnPTpJmvF8mUeJt+Nn8zK61kePFR9
8zfnp/sxn9fJB5zvedJ1p9vLo02r2tLJh5SyJWYHvxWszEn07eTqk7dt5aV5rdzOZJdJpRxq7T3L
byWzObyzfXf22Y2Y4rVyH3O9FaW7lnPTpK0zXmeTKPE3dtveZmj0a1kePFR+dzZuk89NmsW1kdT3
56gOYzrlW4fBo9Wdcig4XzvkaONHvLFBFVkMhQUFVmq++V0DU6KrhqrKoKr0KrG+eBnFHV9R+qdU
HSxnEUDRt745ryx14pjzXZ8eKPd1QdDA/Hijy+NpSA2+Wd325jwPVsKrtXmuj4lBQUEDGqwyhdVw
Kgur4UB/Ris7oB46CD6rKrGZzOxz7oFVYGBVXxVc2eMVWaDdBnhjUF0LquUFBbq3ri6xc9RUg8dW
BRXGerHEqGqwaqxQzXuK72rqedHoHQOz1WTXDI44qti5ubO9BzHj7VX6Cq1y7UDoMFm1dDCrqE5q
DURqrhqr90FA0eFWRs9WKqxVZ6UFWqKJjnq42UDdDdW1fUWcaqUa+aq0F1zOaK1VTDdV961nXDrF
0NkYVX1XRVYqy6uesPVTjmPuOHO6rLurqrnPVc7ZugiSVTVTJ1NWVfU1WJQt7q4UGHfJHqgWK1QV
UBFH7Hd0FBxE+eJmZ+JHFHQUF8Qx/cPfNxHVnPQUHE6UCoOx6jiLJzpZnxOfpu9cR1UAcRzHJxVV
iUqr22eaoKB9+6P165ZjWuvP1eXdA6Cg79u22fNdFF3vScVCroKDvrsqB9lzVY1rU1vXs903HtRz
c3byO7vKCgWLpvu7SaV0ERuxoulVhKrjRtG6vv2jm9t2u/d61PLnuM3NcScdAc6zrQdTyvfbsu3N
Z0jGvm54j5dxNddedqDq7zsbHzUOPeONNHq+0+bXft270C793QdzKOgqT9LoMiNUJ9u2+xtTyOu6
6bs9u6Cg97PdWPHzxHzmoI4o6CgMzRx6w8fNfNz0FBu106HxLJztZmeN9nQvFcR6DnNHhr5zdu8X
fpvW5rtEZ89337O4u+JGqxu7ocvdWOdeRLD26DvQW6BRc77dbXXHGzWeOOLpj70FBugoLNs/Z6vu
rPnNz1DoTOg70FBqgVBpdnVlQfspzO9D0nFIa+j55OkfTd3d0Pfous1rr2SfWIzmOaKKrjVcl15z
9Nz70ebjiqznxUHP1OdUHVc/bs5jt2oL5s7ZZzY+apivI87Yt+anboE7iygV3zN0HYyPeKhPFHV2
c65ulBa6dpjdA1169n26Y04779qDEon1tboJlNI0Vny8SPNb70FBqLr2vL6VaZ2roO6eR6TcStH7
0HbvQdHza1qa3PKj853N0NB1fNQHtRrKF50oaHp1qWkrMegmDUUSxZHFbj5uk4zThtYezaVvmZjW
m1dBEe5ygtTl73EmurSvLOfpiaM8582c1Subv3qYzmy9NLul2uNzVBvHj7c3Oo6hdqCg7Pp27d+x
u6eNUND0atpvt37daDv26p9kujzp0tdG+yfXt3oOvbv2SaT6X0xZMNKavN7it6jw8WG8ijyhnqLo
1QUDb1pc0cR/MuKpUVox44jZQdWqDrfsRzJnjvIo49Xl9oo7RjJnM869ImutAz6VQc1Bz3o+XmLf
Y9Bry/e3OrvVC4/KG7780UVCnOHoey70HO+udF0OeLXSPqmszv27d+zXahq/m6J9OifS4vOzXbv2
XfdrTfTp06Z2TaWUFCor6880nGbI+zNznznNjmOtBQJrr1VnMd9VlxxR3l5FHErfVGOZPr1uJ0FB
1WRn2eOLLy1dsxo4jH7HjoEdpnNFHeXHlxK8ijOZNGfWgy6Dr0aMe+Z87mFfZ9rzIzGt9aCgU4Y5
osj5z1dV5/LNQfVQQs2Gyq9zqgjdVqqx2Pbv26rUxvmqsZxTwygquvlHHC4aagerI+MdczqYVZBv
iVb3PDpBQvKqZ89woMhQVIuqJugoOJioKDidqLpQcR9BOcTVDMdOJ2oO1DVQB9S64tLBCcyJnqI4
u3mjtGT2YUDqry+JQR8qBOi5XzcSgugfIy7WxXGZkVRz1OVDMaN1XqB0FWVDPlRQVXBz2ak5cyyg
xM9WRc91a6DnPFUVW6qZVWubI6D3DmjUeUNQaJ3Vfquc9TQGqw/Q585uBPNVTCiPfENCOpqOUUD1
PNdVO46DvzVdVu8T5jq1VZqarXNFzUDvLja5nkdVMuZVFB3qKtfOfnqzKiq6Y/NlBZ6A/PU1Wqsi
ugurKrvPGZOO1VTE91bVdqsLm5kc3Nz0F0Dq+KPmxUFXW+c9A6qeGoMi0qtuqxQW6GNtQq6oqgjB
h7VPVw9BqoDVVuvaonBQUZ1E+JcdXxUCjfEOdGh0hh4849X3fXO7PVB6er7WVQXLy3DqDVVllqPm
5XVQBI4TTg+IoTFLCYUKSYh9IVUAWoRVV6Q45CDHtVAEtV14Ksq2Oq5CIc1VAJBPdUEnWqDUxVBh
WSqCZqr6a4rT4kgyZ6cWe4mcTKq1IVQ+1UA2//VF8lOheHW3OL1K8yiTtKtp6STafbycvxdWvN2Y
5m2vPcuzHstktZLxZj18abWt/FuVvFfsx77nfScx2zV+vsdKcmFR/czPVR79tfKzmPx1bvLxJqcp
bVGnuV+NUlJqXcprnD3mt415MP12t3nmP7Mbk/r2k0JYKK7MdPbnM9ltKzYN6oldpdK3R6xK2nSd
tT1+Lq1MdjmOZtrz2XLsx7WS1kp/xZj1OtNrXb4t7lbxX29mvVnfX3HMTPbNX6+x0pyYyj+5meqX
ftr429VtW7yYsyTU95ao09yyvxqWl1SL5LudiucPea3lryYfrmrW5288xJPU7rWlsfgJOVmV0FTZ
merj0jyI1X89VyI9WVG6tdX1U460G6uquVWe9V11bVYqxqpu+eq5VTOPndRVeqefnRh0eVEV3dmb
6Rb60G+9JnR3zc3R88cb7rKsoD894ecoKvq/moO/NU83Sg5zxvmqaA8fNHfOeoyqmlBa9zDmqKuR
u1WL5qqxU1dEtVXu5+aqnFVOKtoDmqplUVZVlBVd7dcq2rKqaVdQKgNVZOar6igqsdu3SruegjoI
6qY1Ux5ouc9XVX87Y+ij56FUFWVWO1TVlVzmq7njvtVeRsXNU1U5VV3nPz1FVIeszrQGoEzOM9m6
VB7Xaq8fofuapoaDtMJPm7c1Vqq1UdOY9sVWnUc1Vqq11oKqYa6mi3HVe5z89VOqqdVd2qcMa1V9
XVZzuqmN63l7mKCz3QeUHMbGfrQRWeKoNQbyLnjMou9xnR4qu5qtt9s7xmt5zVdFVbjoLd3009db
oNHPzZFEsyM+ZEfmR+sfNHUc1pXQUCV0F83NVnNcfa7s2WZ4rMqr9TV8cZraNHHrdWmMdRKhOei2
o+lAuuGR5iadDJH7fTHF1qarPNNGjS7YZvuz0D36aJ9nrFVaM3zOLnqeegTSVB0fZugq4x4nnXm7
5UVbUd86u5p5caV5vrzxRx9DR9rtRxniPzVJ+2Po5k1x6NdTEepzO2s6T3kZkfoepaij780cUR8v
LqObnia6Vf2uojjj1eGeRvO3WgVAfrFFm+eOJGxHiijugOuaz5zc1WxVdb7XQKPvhsZ7XNFV0dVq
Lmqy7ugbvtNandGM8Zjm1pHxUGrMehoX0TOfOmsqy1UUHPo0UUenV9TO85ndAe13uI1V/mXOY9Se
OZOere2aqd5Vh1FHGzxSK7jS546Dmq+hzpzrOnWoq2o3vvdXH5uxqDFb7W7MZmjUXNjjuLE0fms6
oFfXKCgMnzHjmu006HOe+tSk6Cot1ZPmoO2VFBH1ioMvVBbbdTdBUnT37eUPTnq4xtrtqM3PQRni
jjzKvPGaN5cxFjve833URz9jKhzKDrzYaovsr6VGZ31lAouyqtVUwMarVGlQI+u2LpzUHTslHdnS
6Z21zdlfSg0j4+fMqT0Eb9y+huZTDieVdU1KW5g3u4p66JW1ptmmDx5nPhu9Bh/DYfesPcTdo0wf
G95vMjPMWsiq3VxNnxHqXlmx3mru96qplU3cT6c6547ePKCg6dqCgVrM576Z2ca6Kzrol2Nzay+c
0biObJqLoegfTm53zRnzMygoPD0Ed4bto57tsys+jzDeYbDx81BGbyg1s93ay7PqYM3rdRHU1HNQ
eHNnfrvRz4aO7OZXbbeYeY1zGceZQd26g7quWsPug865MGPQ80ZztOqxUeVXsNz1NV+q9nNF3PVe
qp+qi4qtqv1Wlh8yLmq6O6r1DV3XIquMfKCrOegursuo74bN3nPzqOhq+LMuOOzxxxZFd7Oc0d9v
Vh6CLvHSHquR5Vcq6qnPSoqtVWaGrHzmyqwaoi7d6qd815VYqsGqvx3zVbVTPmqsc9V/nqX8yoi5
soJjdV00VV3F1quc9VzmqLoI9VNVy+1BVZiqIo6CrI47qT0F1fdVqo3kVx1J6A8fNFlTF1iiNEeO
Nc1WVXKr99zVdUVUwqpg6sjqavqvXVlVmpPFVYqphFVY69THjq881FVcqY6rdTzRRXV3NlTFUx9q
rHPVl5zRXdAlV9V+q4aO4oqqYVUwuq9FVZq2r+fdW5mRVUwi54o9VbVeqvnjoKvq40VVigiqphFF
Vc6O46r3epV1bHFUGj6m1d1bzVNTz5UPXZpGTqvVNX1XKr1XVfVTiOo7x4fnMagqKqdXVpzRJ9D0
GZ82Z3re+/qYpD0nQx3qYs13Mduze6B9e7o6OckfRtYn01vLo57zea86TExvp04E783J8o5jc6PN
dJHnef28b6Ke1fmJt625X8mLpHeb6PVJWo8mA1J7cnxWro7VvF9+PydXvnzz7uTXuuk86Pbyj6Uc
5SSdtyy0a+9lOte3mHfi2Kwo96nJH0bWY+mt5dG3vpnTfSY326dOBO/NyfKN7nR5rpqR53W3jfVd
57V0eLoyrfRbcr3NXJSO830eqTVHm5gNb9uT4rV0do7xefPl+Tq98+ePZeTXuuk89b9ZqPpRqcpF
J27SyztGvvZbtK8Md+J7/mSk7K7zp21QVY9ZeUFR3NcsT2dnUwAB///////////0KgAlVwIAAKKa
DRwR//////////////////////9mqygqpIqpRoaqZ1Wqr9VNFV/PV1X1UkVUiGqpQq09V+qkfrE3
UX0S31eu1AbXWJ3zeXl7aP0t5V+YfS6URj2Y7qYu1Qe+3NFcVqJxLnqvVa6CPDLniyKqmfNUVdkU
WZcweqxQH6VYeqmEeRqoPccVBeVUj5zVX7uqkg3aKpuOpqaqZRVbZroKCOqnVV2qlmooMzvVkR6m
PmjqsVdz1XairWM56Cq7FVlVmgoE44uY8d0GHqsVU4fPV/Pb3z3VsVBVSDVTY91XqBxig5+Y58iq
txm3zXQWfKigqY4j89TzXd1PRR96iK6tqbyJjdmj56v6dIrzpRb6VWY+lX3fP0yqmXNVTKgyhizm
j7xXgeZzm6GPVZzKCoqaCgRqiZ6qrmtxOMxusUZzM/WfNz89Ft1NRlXK+3U50aq2ac7RKrkjdaC0
u8VSjc+TjPrL5nhxVu7NIcHqsVXDdKrlx9qtvrm8dm5qrx13jzIqnFV/Nz80dfonVZvnyKNUCOac
oKi6i2eKrD2c8wdvsuzU7nP27ax0HTe6Cg0Y6qE+qztzmzmLHRj893G6B8zefxmRSR0FRfSgoo6r
9WOgzI+10WXQHjy7qzMugMsvdV2gNzTVTOdetVm+Zc85HfPvN7ot8y630znesqsXlBzrdBG7oH0v
tHRRTMcV2fLMbFeKPrY5ugjy7Wc29XzKrqCoR6tznx4Y7PzZ05rjN1tnoJt1PU/bquizufmt513H
0urubE+9Xbs9Sj2ryKgw2XFVj7mUnNz1DOePvUrI+9XYKDncZlvWo9vOapuqwcOre/RVMd9rP1y8
2j1Xu9VsyNOM+Gj5ucG7YlV/Sqy1GjKgSugMdM9Rzxd1z4erIj4dtbZqjpfaN0Hbp6eq4aow0eRu
OKfj3URJXOXNmqLyg7Ogjo1eVXqBq6DplFOp33nzRdXz1PN2oF2w/a8oOtWd6BPa73Vf53507o13
GbpHR5dB27Y+tBs1XHfNQW86ZnfF27dVE1MxvLq40nY8UV7ioLMeZVTfNzXz0Gt1XqCqxVcw5qvz
mvaie2a7iq6N5V45ufmeOLqv4qLy1EeSOrJzLuKJHqs8/NF01cUUfWNHurl7z1B46hWaOqxkfNnQ
x+mW4ufD1bQc1qgtZnfvZ6tyLU9056C+c+dFUvXS4z9T30Mua4s10TaNdRVfTqDpJ1K7q9ePcW6n
d1bQd+1qg8uqxJbo90W44j1ZV0QPQbNo/NnQx4z76dtzpunSgjHTZqDmP0w5uh97j3057yg6X3iP
QxvKsVB3vy8c/lx3faqxQVdHQLvz3d7ugdBeR7TiyTs44qDDqI0l3H3cTtRxLMmY2ol3OZ9pnFFU
9zRUFBQKPN9+1u3jvOfOfIudOJurzHVu5iOgjPHFlBez9sq48Z6Azbi0vNx1PToY/Qx6uiqyrum+
2+nSHSYZqA+jdenTLR9x77dOlB06UGj8290ERuejur8yoWVFnZ0aLqbt0oObO0kcSZjxxTMcc6Y9
xR444sygj5pGoo3h+sz2w8c7dRHHE8yzUEeRR5zVbnSOOZw8Ud3OmoD5mOOJ0EUczzZ3n+zw5osR
+1Segy4zOM2H5s7SHNUXFVdqtozqpnVlXVU4w/NVlRVkVV+qmcdBVtAz1J6rM+c6PV+VUhW4o46r
eHnueOKqzVSAzRRVUhHqsndVuNNOq5Qq055mV1dGroKjMvmqD8/apq5Y4zO+c2pTRZznoKtzp3dV
2Lvvn3QVbZlFeZzHqxc8VV2q4e6rNV6rKg1Vygyq7VTmOgqvKrqqaVfUVU4qsuI1WHquVUt1Uxqp
1VbzrHdX0N1dVSHVduzR1XasyLL5qtqsVXY6toKrtVnKCrT1XI5u4qrtX1W6rjxZ2vKDrzVXarpq
GgdX1dVjurqsypjPnPlXVWaqQ6iKq7QVZV3Nec9VuqnRrznoKCYiiqsxn5nMGq26qc4Zx0FVyrc5
qCg56CoOZ3VYq6rIo4qtyqyqiqzUqq7V1VyoqsVZfe6CoyqzVdNVfjoKr1XVZVZqs0D56CrquVXV
HNVtV3LqtHvMqbqairFUKwaKq+cY57neHoKrDqs85xPVXKA2+eM8bqKqZ7qp5URXdVkdKsaOu3TM
Wrm71QHuiUkw0vFR9YqST2ZMMu/O/ZPo5i6ORO51+Z5Jmyfl+UWdundTF5ckl6abvxTFzF9vJlC7
d6u5Xm+0775q7oveu77TlqjS6dDUjNk7maee9Oz6dkpn359TLmvtl0VBRazNuiosmJWvC+Xfnftj
6XNK6PffSadz76eYvJnpi375ed/KKezt07zV5cmr08du/MmLmL7eTKF27d3OvN951+au6LXXd9py
1R4unQ1IzZiyXWrz3p3fTslcz78+qy9775dFQUU1rM26KioMmNLeNX7256vNVcyhiqeaLejVWObm
ZqqY1bVTir5tc9VyqnZE8VVMzc2nVTg1Vlc9DVY1h6jnno46rjuaoTMsSjj3dxXNkTxc5GKr4rG9
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
2ZXmTZ77dl093kfNE8mrfR0G4lUc1my+muus9KGzrhrvNIg4z3Z6m+1RVlXO8MrvJs57nu3bpfuR
xc0U0e0l3yvaXWgxxdTxGTOknRvMzNM6NK33yJc/NFHQKKKrubnu+09JEkeOrJ10EVBlBQdMUboF
QUFCqOkoM5oj2agoLMaPnug76MY0d0eOzxq6C47Oe+m6DKCgoEeOKTKCg+b56uqzmjqaB0FAozqo
jj5uaKOoIPoE6A/SgR5j1G6m6eVU2qavPUxqqnMUdVNqqZx1fdTz1UgZUmqp3FHlV1VU+q6oNzRV
Uj48i56Cp55iooDxRGPVTs1Vp80euaYUVW1PW493JKY8cTwyoIqv1VT2oPVTI2c1BHHdVNqqeRnl
q5qJc9VMKqfXFUxI1Bz4ufmZ6syKq6epfMeqmOHjiPPGq7KqVqsuq6c8ZqrNVIt1WqioqpIcZxe6
qc1U8q6qkCq7QUFmqKrnNHVTa6lHj5+Y3Y2aquVU3dVmrcq/nuKq/z1UjVFRGaqntX1bVT91XqqY
VZz1dUVUo1W6r8XPUOI+Zz1WLqp5VTmYqt1U653VT9VbU1U1PzRVbVeqp1FV2VWeeKqn71z1ZVTy
q3VTSgqxc6ypjjN25qqbuq5V8auqnHkXNFUVZVcjqpvUVU5qpANV1VPKirufUVTk1zpVUxqpjVTP
mqv1bVSrlVIEdVyqmNRVeVVMaqRqqeVWqqfHPU89VMoqqcVHb2JnaXOmqvPVTE9VMKrxjnNVcq09
1N9oqmq/VYqvVFV+5ar9VNuaM/Mlnh6j3mq+otR1afmjq2rqiPmquZ1q7m5qrFXddcz7dVzG7VXK
sqztVTCrnUGPV6q/no1lXVFX3QJmP7Oc3PzHqeZx1E9zxH5u3SPtFSRKpq2rqg3Pf27v5Qdu1Ceg
ij81Qc0ZrqtvnoD1e8u3VxqrETvn5qmoqI/boMcXlapqKuNHUR1Jj80bl56sjqKuq08XtVyq6foc
1XRVdHVsXXDq9PDe4uaojq6q5U1WFzXc81zxRZUc+uppJavoD8z8ypq2pxcyyOrT5V0eeUFBd0G4
7Wn7X71ynXplRH76f3c4qV6zKBkqrnSP6Isvn70FTVseVdzXh6/Td1qviqasq+Kpqsc5rqsdT81V
iro6rFWnMfv1TVDV/NUHqvHq3Dx1EeZdWc/wUnfmjV1fFVlXGjqHVeoIop51ZVTDvUZh6rmVWN0D
pTVfqroqsjqebdn71Zzdajt7zTnMeJ+3UVco+Y9WVuacnqiOrqtjqI8quc0sXP2jiqevNzVWFFfO
brV+ubs/t3fbquxuahioDn5qsq+oq6q32M6rd3eM1Qz1dz1XFV248dQ8qDHoOetV1QePmNQSnXPU
R1ZV+qmrux4+eKLp2eRHyomo6uq6q5Udsu56anJxc+qrCe7qLUamKrHPEzXucoDR3GqmqzV9Qfnq
3dmqpxlVjrQWqmgdDQ5q7oZInLVYq911aw9K86n69JqI54zVPWI5qmoVRU0EXijiNvnqeapmua+b
t0qyq5VcqOp87eVdqgioKujPV13VkVWuYqKk2XX71cbLhQVddnV4bK/SpuKI1BuMzf2OIxjo9p1N
QMqznqKunD8xpirTVFVy9GiPFV7j7Zzc8UV86q6rI6i6mrI4o6nmnqir4ue+fmqLq+r6uiiq2pjq
Kl1FTVY6VXKiz1dMTHS3VdN2YlluQ9XVWqg3pje755gxindVXKDJx5EeqmFVOaCgrkKCgqtR/I6t
oCVBQVXqqY1U5qpjQUFegoKqc1WfkcZKgIUFBVvSp5qCgyY56u5vYqmqzHVjq9VFXRHw0ZqsPV58
i54+aomY7oJ6r6u5409nZ1MAAf//////////9CoAJVkCAAA5xRRrEf//////////////////////
q2rzxR83PzH5qr2dKrNVyqy9TDdWVdFkVXVfV1Wc5rNHVbqu1Wau56qcVW46rtVmq+Z6mKsquVWa
uq7MqyKNvLqavd1c6rFV+OrKuqt3VYjurtHWnGbnoJi+kV97jqarGVe5OtVv7QGw2HloJZi+eYMu
5inMMl5r+0lB8oCVBVvNVZdBQUFBV5jUlBSUFAU9whVhqrF0FBQUHQ9X0FBVlXVCq2r+c1X25iro
oqrvNV1Vrm5qrBlFdBUVWY3MVZV2OOKrqssx6tqvVUxjNVdqs1U4qphVfqphVeqss1VOaqY1U5qs
zGqrlVirqseRRms56tqumurKuqs1XaqYVU4qt1XzR1UxqpzVTCqnOnVZqvVWarj6ezkkdW2bniq6
rKrtVmq/VbjNVdqphVTmqmLNVfqt1XarNVyqzV1WTEtVOKrJ+dN5FHVlXKK3dW1U5NU3Hzc9Xqq5
VY06qYVU4qsncxEdVN1fkRqrV3VTyqmtVI/PVcq+OgOeqmjqpzV9WVUzPU1dzVU856sMz1OUERqt
iqu1XKCrbPVeyeq68qv26qZ82GZ46rdAc0dVNqvjijNV1VMarmGquZXNdbL9dzikvLPdxmqu9qig
PdTzHmTd7ObpHFVYq7d5V0eXq6uzmzm5nV9VMOaduqkLn55w1TVSDV1V/u5mq3VTg1T2F81VNqm6
tztpXVeq2pqpIPVT3J7mjuQ8Rj1PPPc1Sc+c2j81Sot89Vip5o6GXoao54+fFV1WyxVe6reH56Ax
vT5Fk8eeq2r6m42dXV1TUmznoavqtOI+XVnSq3z5UHN5OOq7fNU4Yzl5zzp1UVMwe46rlTUHXt9L
5jVbV+ooozRnq+o5zc9W1dlTVtXRVHvMfLurMoamq1V/NHQ0D5o46gxz5z1ZPZHo+VdJnMeO7R5I
ojW46qZ5lBHQVU5VViq5eHqu81VigqsVfVTqrKqY81TUOqn1V2rMNUGMc1BV2VFWVWIyD9F715fb
0PKut1XMPVZquGG8ra09ClWee3WXnfz2KTpvzDTsxcbdBQM9TEaO1qPqbOjNm5m2N96uyKv0PzWY
/Tmo7VaUR9DR8+DYMclr1HvGbn964aY8oLfZT1pnNQRx61165163hsbtrfSwqC5zMeR5Ga24jxxH
5nbicrnPiEb5u/ObqR3ckreR57OKj2apnO9t612xRxdNRPLB55Kg1d0m9vv196Ro8R3EY8fz3MmB
Pxx83NUxxmPe8jjnJ7pl5HUHq6oqKuqyrquqyO8joGfm5quW1eM85m2lQXHF/EVTM6Ln5tHoKsqb
qyrKujoDHoN5z9IqGb6aygiinTRmoKA8x3m9anO2Hob+acXPzp68ydmLjboKBx1PMbntaj62Y2dW
bOyt2N9zxVdnMSP1PzWY/Soo/stiPqaOpMNiI5LXqjszMap964aY8oLfZK04zUEcetdeudet4bHd
tb6XWyguczLjyPIzXOOI8fMfmd0ETlkc58Qjvm785upHdySt5Hns4qPsarpzvbetdjKOLp0ivDg8
8soNXfWk3t0HX3pGo4o6RxGPH77hpgT8cfNzVdHGY99o+ecoemXkdQer6ioq6rauq6ree8jbPzVF
XLaszjnM7NZQH5+b+Iqneih6jUTPQRVbUu6sqyr46CI9BvKnpFHQ66PKCKKdiijioKA8xQTenOds
PQ5dHHupqKsdxM3W6irrqb5jCq7Vfjq49VNOeqmcXWM+VZVeyPmXPVZfNVY5oqqecx6r1s9TUVUs
1fzVbVSRUA2sOagCj1zxRxs8fNV8Sw2jmiPgiu4oqmKq9Z6jn7VFRUnqtVXKsjR6ipjUfPVTq6rV
VOlUqgqp5VaqFHEHz1XLqpnVT0/R81x1UzPGsNE3VauWgqp7FVTydoHzc8VV7WWK9V2gq6oqOfn5
zaqp4Y1XVZVTiqn1VMDRdO81EeqlHVRVTJ1UyqpvlX1WKqf0FV66qU6iOM2Waq3z3U1WTZU1HeKq
nZqmNnNQm1aoKvqboKui6VXaD7mVbU1UxqplVSBV9TVTmI7qtRdKrzyo56tzmqtKNVUziMaa6d6q
ZPVRVcq6gqtVUrVfZz88dV+6iKq7UGq6g1VTqKKPtWuq4ZVFRVh7ozvtUZVeqKhqoqpg6rVAc0R6
rJ6rmVdEzPO0T6b7xo91bQ9jqr8PkV4bpz3EfInO5UZzHfMjLR7w10Tiwx4syM3SpOz+c8cfOfNT
HZYZo9Vgzj6q2u6zea5hZuepSojc/OY9Sb3OerTnq2KOO1zxVHPVkZqjMUcU2aM56m2Y+Ve44qrn
N0uq5iMaqzUWZOwbWXd1MeRWbDRH3MRXzzp+tx4a878xj+/No+OLtGpjfj6P6e6COJZRRTj5zexo
zNnP1vr7d+TFV+K0Y+K2b21UmtTqq6qmdXe9M5jZugSjjMZvz1XdxbzDWfn3FVcMZHldEfnnMiN0
yK0zH55g+XzVYbnPZluY7VCOjG5uZUFRjOer6uygZjX0OZxHNGnVY5qiLbPht80fY1TLfPz82TEx
zxRVJ6g5ss1EqKzMx8znqczIo8PU9D1ZFGd+Rxq48qDRnPrI1kx2xHjMabTNZqrB3V+ZV9rrG92k
zVWTHM8UaMfm58Mc870Nz94j5HE8j5znjMbV5773VBQGoTx0USz6dNmO4/Uqvis96nTxoy5zM0Wu
qMY/ObsaNXhzR5ec+leG6TlqcMKv36/LN6j2Y9Sj3MnoDHyI+a54qCK4+ezc9mR6ti9pKirFGfJt
1MVxdo6v5umKYvdxbmcnOe8uojNadVuqmGY9n7GGGPHzGM7iuPMiuIS1FQeNnMfL5zvniy7i8Mdx
ZMYphWbse2rvIri6Wj82YrwxrMepb57MY/NzJYaM2ZVTioi8eGqDVfVvMaK/Tnq61zY86VU7qpjV
1VMOqOZcyVVmr4+ZOPKqY1X3VTCqnfTrh6uVX8yMqvqyq7VZUfbM5o/KujMZnNq9LI4qvdmPQX0W
+p75kYx88iiMeKgO7Xar3VYq2rrZqmrjm6m5jn7GPFz1PNzRbqasUdXVdVkV1NW1WDVcaYj6djMx
9mMaI0VSbmqKl2fmS7WlHz9Yqm4rwyi6c4OKmq0ePnvKuSs2Kr3Hl1UxyqmFXLmVVOY+dqr1VZqv
uqmMrqyoqp3VTCrruq0Y95zKr6rKdV9qq9zVUxqp3zuq5Z9HyTxZFOmNzTkmbqe/p5g+3UxdcdXV
cY3boeM5jmj5ueLm5qmpqyrKvq+4o86datqsVdVxjYYzw5o4j854oqmpqyrIufmjx3V1X1WKrCOY
5l0PHFzVNTzxR80eXFVlWVfV1W1WKuqenXD4zG6djnMbm0fnqyOKptm5ubMV50648PkV82GMe3Va
56rdVio5z1WKrSqd1Xar9TV56uPV56rPMdnMuZ1W6iOr46r1RlVMKr6qpll1XqqddKrvPdVt7uql
GrTs1WRxRxG56rMdW89Qz5bWKPHjxhnMfdBVSDz3fNh+sXMDR8wjw0VQsxup1dVP6DmzDdXV21Vc
qYnUVZz2juq5GjPHUGNztqrKmq3VfPVx6uuKaw8TqYjmq3ubqfI8qpzzWagOaM1TFZjRVacx9hds
6zyCqKuoLzXaoNU1FVMz5mHoD5U1WXFUR8+4ryOLoa8aSj5u3OjIyNMXmaNFVm8PdXxd7qai6DKD
MUR04qk3TmquVZNOOYzrH2jfNFHUR5FVyPEe75qsPHZor51zXFaZjUF1CZllRFHVShHVZ5kdUHeN
VU395qqc1XLurKqb3Vcqauq5xntuI0ckvPFcq+JSqdrQ5uKqsuPVJVZqI8IeuU7wMHGLy1vbji57
zRq5pxuTGijWOyq7Hb2e8y41erta9MLSkNbcq9u7klvXaZSxR3tni5+ezczrxuRLzq7ztXPht8Ca
izHvMbd+rnPFna7WMnf/ftFmPe/iy78D8avUw8Okc3Sg9VxVBz1Ea7RrduyFDeTPT7T1rrdLiWuy
eG5nzqv5L0wxuc5qgx/eBHk5l1MdRUc9xGV8Ce3XuajP26LKRduerF8aMWvxaSczFUVfzkPZT4pz
zmq2rueKovePr3Pz9s7c9X1bUc9XVER+ZzJTF6zsWZTFrfZx81TZmauaebkxoo1jtV12O3s9mMeN
Xq7WvTC0pDW3Kvbu5k0trtMpYo72z94qmps3NdeNyJTvid52rnw2/tWHMe8xt36ueOLLOsav+v2i
zHvbWXfkHR+NXqYeHSji6UHqvmqDnqyNdo1u3cZChs0z0+1611ul8y12x4aovnUvkvTDRc8Zqgx/
Snk5h6u56io57iNLeu3XuajP26I1InU1avjwxa/M0lc3zVZV9SQ9lPinN1FW1fzxVB94+vdH5+2d
qmr6tqOer6iKNH5lO6t6USRFa9E5Od+BPh1V/PmpMqedc9RZzc28PV8VA49mnar1X1Y+sTt1MSP7
Mxy0Scz7uLNdO3vjW6B3rcV+L3Z7CRry9YsnLP2kNZreKgPcZujoY8jmTurI48edlkdmtn2er+z0
Eb1c77c3NF1jV6Z43LQ1XNXfPz1c8orUdXUFRuc6ZVTGKPqZZdmqsVZF3oZ6OgoMyM/WYu7qplVY
MbnNqqmFA8zc4qmgvypoJzI2lFz1cz5Um6ufuLpuLsuaqyrRrXWLfQy64aKqxVTugi09dqC+lBQ3
p6quc0c5pzGRqqnFVOO2qtuNlO1VOI6tVVODVY4jZ1+Hw9HUVUw5nV1RzThoqN8x7jqyq5VZj6l8
ZtXvEi+jOz9YntXq/aGK+nSzUc6zPXTtcxQ7mtxzppiY7UPfen0Wd8R2lGskdE35V9W3HFvD/Lil
NMM6uid6nhpdpJpmoZkeTk+bHFnQ15qb3NK7ivNVKuLDUfbpMXb1Rk22j9KFRroY6R7fSabxG7a3
J0RrT13965cUZ3lvzzM3jWOWXR+lTZjUPRJuynSz9+zoJOfpu/eaq4fmevl2udbodZrN9nqn8/CI
7O7uJ7ySO7z3oY3p0rvS7Gye1PaodGj3Pdj3HtblTyPudvyKKOrlMqz3Masz9t0FqWI1me+2vezv
JhG321k5cVswu6K6toZYj306RxXRztGZm09GdFd9ukxuhJz2pmhNHualyYmJ+cb7b7UMRumLenqT
O+XcR8isx0jxij6dpizJ0PTI1moukuPO1BRuaw5t6ky7xP1Pn3FUpJb7LWaza2mLZu2X2fazJnPl
++zjly3rOnMvc3q4syg3HVnMeoTjiGjLd5rV55fbnqX9s2ex3fbKumvFV1Fcwoo9n6fAzp52mpGb
olmaub0udeO+btN5b8fTMeDI8c7Lp5mumN3LucuYvDPWks6aRsdDrNaOe9GzFp29t232SN2T6W86
Lc4bdy4c2eTOeeOzHiy32j0eKPG59mbNmzbio+mdD3UG57kvtGbdT079ilTzP2nk960t9vPIqnvv
3XSp5u0m6eRryKPXX01o+zv2cvExOzETjWajeUZ9xSzq7NbfWOOYMbnvDXzJnycmKO53yans1536
Zd9Im+fmjaft5LMXM4fNayaTvpay+mdNzeX6YSjpnnO5jedGpyYfPqi1Z8ivv9Ukj959XnM6nKG9
dvafwzij9k867879M5uhTsQXPtmevd9fPN++1Pr336Z2MaQ150zsp1Rc2pZlVJ5yYvJqe1nM7338
y+nSOLn5k4ql2aYnMtPD1PM781qavOnSKN99xVONc3Pl5uoesPNT2X06d/L3FUpxxc/NeTE5UrZ8
uemnOI+4on2R9n1vzbVTUnwxsObNG8oNo9BkdBVdVR4qiPn9yhRrOzpCYuYjvI7iqy6uPMVUwy5p
X0yNT2dnUwAB///////////0KgAlWgIAAM6GzTQR//////////////////////9Q0FQ6ti60GX0q
TeXVpzq76UPZPDJ5Y9Lv2cinMPfPa2ads2qvj58mHzLF7QuOONx3ZojodjRndB1qt0Cyro+9XSTQ
i2aK0/g621QXVTigqDPmj56BLoePUeXmGq2puI2aqFzxrma59YeN8/aew5zVfdTQP3mzI47w2Rnq
TxHjiw1REnQ5rJoxry49UG48zOmatVK58OrjvMznioOc0Wz853HnY3Mr74+a4jxmyOhjw5sNh6DD
x0CTiRtxUEretbq7rmVdFkUVWqq1VaqpnHl3HcVXRY4+l89WVF1G+lX3GNUG4zKXXxiX31sNTB/d
oav5sLdoeSbuZZOco/nsvMrN2d+J5mu2vV9+fZM1HHmSTOx5rpkqUrPelL7KPkjkU5tV7V5tkVv1
G5rnLadrtmNa+7WpPn34o8x0c0/uH79M0bPJZyT319l5na8pPe3vRrp7nzwSnkxzVv5L2L9MMbOd
5/dJau5NvpXl4EWuhsT96fhqd6Y7p+mdpiezeUm+2/ZbSp+BLadak4EP32WY8ngw/dr1/D9H0ujW
alkPn170Re+xsVeMpEfuq8u3Ta2+1xdj5FLS2X1onR/fVUKzdneknma7dNqd+0f2Qyjj6YaZmexD
zXTPMU7Z70p32Un8kuZU5tV7V5t4RW/ZTcx5y2nedsxrX3stSTr+/DKPMdHNP7h+/TNRZqXcnv1p
eZ2vKQr7296ORdPc+TAnT+Y5q7+TvbzoYxs53ktJeWeRvp7L4fOhsT96fhqd6Y7fTOzns3lJGu2/
Zbxe128dak4EP2WY8ngwzva9fw/To+l0eZrUhzfXvVM99jGVeOgKRR90tbdN02+1xdo1FMyYT7Mu
N9Y1h7O207qv1EfMd9sugXN3OarMmqA14Rw+dIjTvd1AxdjN83fLMuy1zx9mRoG5HHh+k5fR5zxH
5qDt0VWJHPFi6eHTuK6fVWUD+nQZz0pusyqDEfoY18/O1z9j3VcqY+bL3U0F9qJ5QdqCg56lxx3h
zZQXrmjNdVyrDxtlY9x75uZc0eXTWsVWVbzd93hgRj1PUBqrxsV766y6J9u9AZ0ESqw3PqMyNzqh
1N4fmnrquVXDKmaquWjT1Vw9Xm62VbnaG8M6s5zYsU5HrKiptdqs6IyW77T5LsYgmZHavPO9vqst
0OtTm+8x2R8w06LMiM9rcw6Cg1JQUNDtOcoNrWlvp06bcxvrnXXU71OZ0nGeK3h29zCtKzXQdtZ7
dzHSdntqgxX7aB9+dJN52d306UGZeTe1TNdV0SuZoWf0/an7Oe6TRjx5HVj96yRmNePXTKBOiRJr
rmuxt327a67UV2u0w7x7vp093QZmumTEVn1MW++dlnZdtd2+eh6J7WtudXTsfqZRdrudt9drpQSd
7dDQUE4+ix3vfSh7a81re+vXH3XbXTJzHZ8w5p01tpvJ273Qtaodx5nbrFstOS9O1qI5uzfaKOgx
Omok13733eTmK326HRsNQXrMvebV5FvuzW1U5OUXfDYc/T29UEmeY8P0306nvbzCq7S0Dyeyc6rW
l00966zp+km5g+Rbe5xdBfbprH26F5zfQ3V5u6BnazxLspw+7Nuc1erx+T+boZx5MbmFq6Cz73c4
vNLp1bo/fVvTeHNkUvpa87rWLTvtfTWjLrMTlAzO87X17Gd52tPoryM+bPstQzm0Fv1qS+y7Nx5O
a33Rry7vxK010b7dHvWdn3y7eJpJ9tPo/e8121O3M6IHZ+vXCs9qY0zs3nc9DOJUD57yJt50nIs5
kt9VaoM1MdtLUxd5c4tm1q86Jvp2fa+u9N3azZnaaTa6vpna+utt5szau0njXa2t7117GWN3aSd5
36N9ukzk72j7Z2NpozvOivfftQRc2R5Uxx0HOo1hsyrLMfKDbfazH7YZRZVx+xst50sz7c2VeqGo
7dF2NQVbp7jud9W1l3qz9OkW/NXci6rdT3obfS7MvTdV2x4u58u5Fz0B6nmqp5z7oKA9Vsx+aI8s
V9qjpVY5oo7zniV1B8oNc2VPM7nO6oD5qh7xuf0agcfNMPV78a1vJ5XeVNBV9B3Pz8xj4a8ToFQU
Ea13PlB0NQaoYzJ0FAqCh0eJqY856COgNH1oInQRO+pojH71HeLVDdz659G97mu6DFhnQ9+lFh9d
80rMd7q/r3up56Bo2+2do+g6ZvofaVAerd1Xj4aqwvWbDx9KCpwxszq+fnPmhJJvvv3ap/fiXm5d
evzeZfvzs+mmlntmTsk3vSreZphXotrwk0O3ndLPbzXr6SO21is2fXXRJ273vb09zvhb2utUxX68
vtQUmJzqk0iV4tCY3iWyPU7IXOY79UmFY2WWLz19Yu2s1m+0v35593jw9NMbyn8/H+Jn6uuY6SZ1
Xp9r6SrbPvrOGnKevT1s69t0m/c9P787PpppGrWZO0St76Kt5mn+ivVPrZK8HbzukY+a9fSS7bRl
Zs+uSuiTt3ve3p7nfK1+11qmK/Xl9qCkMnP5JpbvFoPeJbrdTty3OY7nFJhWNltLF566DcXTtrNG
7dnKvnmt41h6aY7ZT+fjW3Mpdcx0kzpV6fefSlJs+4us4ac9+1/m869t0i34rVBazHHQ6XMfndX0
GVWqrZ1kVV+qnUVVmgVVON89VOM8qvPMu8ZnnS8xHSiMj1B5xJrmzKrPnbujGZ7Tvmjq6q1H2i5r
obiqsZj6aiIWjo3Ph+3XeRYc1VOJim56rqqtRRx856r1V45qDnbqvVUwqtqmzI+3WpuLOtXR1MZ6
ioxKt0q5zWcx8UxHdBQUCdNjqy7RroDcyxGyq0oqmr8u4406Bemymj7ZmRRxR81rHQUx6A24ufKC
OPnszw5roKBuM5zUFBez0CoDXk5TUOrueyYoK9A4js+VZ3Ms91S1J+fOZ658vpFv3ea3Fz0HaO9Z
qaZzrIu1RZ46k8w3210fmeYj5z80cXXsZR70azXGdYnl0CW94taW3m7KdqVGjPFFEbtQUHS4tBH7
Z2umuvR3tPpmTvY6j7REO/O9dt02uzT3jve7qex76c/agN2w17paFql2310/e2rcfRxTOuvftudM
35uzrmN912oEvh2p7DR0Goz0BsiN1mKbO2/lKa7N0V0Gr7Y7vDHnN2rP2XVr6qWym4+bnioLj7RR
61jmte5Z1uLHHzWc/PHitOY26DSykfTVL5m10VZFIooj4u1LcSoOi759u/TrTvm1neojXbtlNvv0
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
3RzHntH3f3Wt1kUgad3OI520qTpnbW6Gc+69pPHWXtfaWleOXTnhsFDbZyG5ydaPjV0nbpmxSeJ2
6/Tfs5NbpKVijo8c54p6GtDNUhqNtl96pKNKjmJy77a2uiWhvU5R71vTko9fN711X1XrEd5R0imP
PdzWpg1uko5jz2j7v7rfSaz41FJ2NMpdJKTmUVXdOaLDedKsuoeVNBlxXQYqA9y0GO6nI8g1BdPH
2z2gb9EzvaazmyjndtaMbPaDzXbNpN7itfZvp17CdzrQc68lw/bcW7++0GZ8N3NE3lQo2orOepxO
85rtn1jiNV9XRd446nKCrFFQZPTSXNVkcbvKu56mptVPPHSc0tRzUDPmZd5UR3GeKTpLzRPEfVuK
ooKCPtVhjZrniMaPO9Q8qWDM7d1NTlWG3Oc91N46mgw9Wox6OYjmNv2pi547d3FVkXN1jygctzUs
7R0b9W/eWmaboDxPNdpxY8vDpR3uJ5edsvPl17ifvxe3o303fuMvLmt4qPxPIvWPZehhOJi1u66k
3bkiugvp1cxOwUZj3nbJ3JHrFz4F4PRdHzHjtaoJY+lA8ce7yM6dazWzi3Fhs7zl1FG6u6CpHU3w
b1vuaZyds8JB2mTnMmbMoJuI8ZuuPUxivLOaPFHdGbtl50xrbRzOj32dH0uzYjqPIuhxmrl85hoS
3R6cxdox17OYbO4m6A+OIYlv4tTieeIP28w6XW4/qcRujF5vLxW69/Irfz1BXeITsw+9BcY1muub
kzN6NHimIqImZ3QdG5cvthraxXQTC0ozWzdeqMdTqdImubfVLn69YqvHeJh/B1e8knbPRnXQ2l1v
LxaiHf3LCVvUxMYIlLOeBej26PfajeTkty4MMsu7WbSTx5ZsMc0eozvbWMdbnI4smeqNrDXnVxH8
8U6/mpMNKfmzd3l75zvI9SczWPtdzG/UNg47Yp9MZ3hcFBjB3vk079xm5+vMczamXjn46PUR+3Uy
M7UuNX2eGvD9fIo+3sVxmdmy7NeXM5dpHijnPXFH51Nc1Eeju+ry8au8tYYy5t5RnXxSfYpzjYaH
sUPWJXioznVRGY0cw8tm16urzv1PFHOeRxGtW8u8vMvE8PHF5ObN172nz3mXlq3l52zKsNHFl3lt
PFeZccR879s6+exRvUx0SZnu7x536nMc0dRFR81W1WLOquioMuM6oOfrQOKJ781do163dRpPemz7
NoziizW4jvpFuUSc8xD65V47jqOh9UfSpnbx92uzTzyI+HPQUFX0ERsPQVXjVOo6jm8qIs+Ysxvm
quc/MjRq3l853QLMZkqDnjVXRvNZUGoMyrTNo9RVdjNdHJl4uh1QOrasTvI8t0D6qq7zxo/TIo7a
Oaq1urqmgugyPDPpUK6uxxxaioDnoKB0F5rvZrxGjtRdqlHuOOro10oLoeffSO+lWxYaLpdW7Vnq
Oc1VOTpxNpT0SygyjxSo8Tuz1dQZ2oIokfN1dV1HtJZGbVW1Za8U99W67Dgxpax9FRmo8Egk175S
VvPP4GXicskm6P3LxpkKPXzQP6vccmWtpbavL1ilko37eWmqPRB+z2b0aZz5MYbxX2bzSlSUi35b
Pj36vLdzLU7Kmrkay51iZW/VmPf4vT81uQ5vfnSdFzv1sxzJyybo/cszTIb0/mvkfq9M5MtbS20z
mvWKWSjbvLTVHrbnJ7OyNM58mMnTeZabzSlS7ZJnby2fH4LWl5bPMTLU7KUTVyNZc60Gt+rPcvt+
L1fmtzJze/Ok6CmTNd3ORH9TfNmOrKB30vzDA9n7ROMxvas7KNZzmSMR/r3zyin9A4jyX+vW471z
+qavR08jj6AzWK+i7UG6uw+h27RG6Gqy8K5evTG7ZM2zxszOarkc5zs+px9OdzEd0B+bm2dRX1Pz
89FQaPMc3Z63u+aonfOsxVx4qCgitdjR1Mfpluhvaqu1FRU1ZEdHepy5g0cUXnOd0d3mnM3bq7Ku
3ZbxyPt2q/n6XnZqTtU89RRXVnt3PPDx1cf3N9OY91GLniqzeddHzzXqi69eyvXub9PfaW5M7yXv
Nfc996J63Qal3uI8sm7+WbtnQ8R1meGlMY54zzLuY9udWDzOYxted+3X3TnDPo/k5lpdLmfLdskR
QcS7R+sL2c3fQJL+tdpvN9evlzGePU1t7126dtdNy7tzocnkcUUXbvO32n9rNZ7dy6jF7zWZmLxK
Y83fbsVtS9NOi2bW29tmZra7Z0voaa3pmXsXWTt1lOa7ub12P83h7l7Sm8yQ9ydzH3mfdHjt++zi
6X7Me6oEtLzpHM9vJz1T3RuTJ9SsjIvRq+3WJTsPJnx3q32a7aGcw97djZ38nO3s5p5MzE709vp7
fahkXtjfTtqh6UW1p+dsy3ReGk1JZsuI0zrMPM78xkcczbfk3PY41k80bXRhdBnqXuaUxo6PIdJe
L2fPMGnF5qcPvr13k5b34c073+/enbcnTU32o1mxv22zznbzvs01Omvs72aa9NvoLz3RpyVp2vYT
+5nU2pz3Sz32W0tX3d69uc6dvZ0/TW+nv32d7djzaaUxrVH577R5On6a7dHuTp27HmelH9TcmnNy
o02Rfvk5P+eeaWnc25mcycoXva1K8Z/fHi87d7t77ve9+ia6a326ezp+2jdrU2k3R0fvs7l7NNdD
9um9e9p03abPr1JvyjxO9mPO++9O2eTPpj9u/T2dSbU32d7nco6P33t03roc0w+nad9V3eYtb7Hk
7Hndmmui1e6kVNB35+1AegioKG4xeGquc+VJqG7znDcS68/Nl0SP2bPVnPGZ1Ea5+r3vpro7eJdN
Gw+9YernOPEa4sNmR8/PMc2VCNFFnPG2+z55kyx3dx0HR0C7Xd0BszHQR50oKvPJnP0xuezOrZue
9dOf2WJ8zPFUmxW85oqCM5phKgoKCr3d88aoMix0Cj0o3fuGfPkdVv3n2007uWYd3VnUxrqu1bUR
x5rO9BQZ1MvZ6bTToKnmMruPq4tWqB1DqTurtUDd1ZQRm6JB2Y1xHQyzZz6nMq7nqaDv92r5s6W+
vN3x76+Q3DaakE5Cxmt+Pya0n2Wtq2SNz5OLvshm7XkK8zepa9F9mpx+L2Z0+3Xo1pr59c5pdeid
s2XOkdFFpesawaaeuy+DJmm92ve2pSjXSTsru6ykt2u2a7ezF7nHqbo/aOjo9+e6Pnvun0lI77Tn
V5cxq5nW29FdUVt4FhW4eTm/HMTWk+3xdN5bf2U3ODZOJbrZu8889FebvUtei8mtOYXs3r5t9uvR
ro8+fXOaT69Enbiy50joota9u62sGmnrsvhDPab3am/e3SUpbXSTsru62SW6C0pztj7ezF7nHqbo
/Zijo6Oj35OeanD577MavpLrfacoHh5hX5mtt63qim7d4HZGQdt7zOm7Z+h9xxc/NzVWOl5z9O9B
lDhqvyM2vlB1d/V1nqXndrn6WsPea1U1ZlWTCo+u0qB1E9H03u4zNVKi1Qc/NcTuYoHlBd1fZo6B
XQK7ETod756nsqFx5txRcyfTfPzRH9mjpdzdco3QZzxJn1qh0z89TE9nZ1MAAf//////////9CoA
JVwCAACHyNgYEf//////////////////////c90cUVAZuJ1PV2+ubcael37dasoaE6vveKgiaFDh
r7UOIZeWn0aZnFvVDo+RLtQG7a7sy91Fitrv5d321b037vd9X07nqUpztR0c7lvEZKh0pwhQvw3q
fdugepzTRszm3Wr7zU12mm+jnOuLMmtbntggreu+duhsmKHopZrc50zOmC79u76a10oKDZtb8vMo
vJige55LFQZm1nnqSU5nbtvPJweqkHNbnCA1rT249UC6TU5M9fWU37leexOdo13xY7u929W9JtzB
pXfV925ZzozZdSsrM+a10D6+bnJzJjer86dOy8kevtTjr73o152c9mZOb96X2oO/fqjtXeTWpDtW
U87TVHlDbnDBKWe9VBqe5sb9vcU5523MKceXc5lChcxQ5fnVT01zqScCelq9zS7XNe5rt5epjMoG
JxvvOebmN6vOnMutBaouk4qDqrouiT3iXWKeoeynlrfXp0IXk9l9nq++st5eXvvlronvMy8vOlD0
6T3Zte0FFvpvrQS66H96vtmumilDue6rp5fdKcvLTxK5jvaV41lziV18WZadziy1czrvO+aoF2WN
zl2r7+dKjnidQ44uc/Wgyrj9du+bI5h18nIz7MqscXdmaodKN27jqD9Ebej5mK8x+LSDXN2uYNlD
0oOlCZZQlMKTSjlS09ulvU9i5tTh9swaNjM93qM2Jc927j1zPmj1Um3Vj68+jx1abt3VTrtLVm+p
6DR760uXS4tV2lcR46jrVZVmi544qvMj9zdcjZ31oIo5rnrV+e6i6rHfO/U/XRj7qKDV1fi+s+ae
G6xnOeOLstm7bvm6x4aI2RrOvPeHVB0nY4uuqDtnXDxRRM+6jmrG56yzaXPvbnY7yI0dAZdau5jn
P7d61FlrnuOYE55OZkG66tb7TmGvylIe0unKvGqAt6K5STsEUEhDe+2nd+UtL7rV+b1j1QrwLfVC
v5MalxkBWE9Wt0q12TmcQ+X46XJiEfSc1S6VH5p9PMV0PmpRvJZ19KSn3f2vnTteujykpxSL5aRK
lpUt9pzDX5SkJz2l052VePoqAtOMI9eTsFSiQhvfbTu/KWl9l10vzesfRrwL3t1QpPNS46UUg1q3
Srp2T1M4mPl1nSzFitH0nte+6So5jT6PzFdHqY1kUpT7k6p19KTKfd/a+dO166PKSn9pFJeMpS7E
WZQUEVSz0FBFmoqrFBU0Jz3QGVWR86NjGYrWqDJzceD59NfagoH1NcxFl5kXdXGxU0B2OvNQZ2oO
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
/K4xenGbMjam0n6/AkZW+fy7eNJJXcm/LWfWjZOrG+a8ovLV21JdtBXHmGNzSDRj5e2pLx99IX07
FJw0kppxtP0949WeB+lBLLeZGnz9HcSUb9w+ZnXWXncGdH9Z7dmu3a3ppOU15nTMtZdpqRPFl2ri
BAzerib57GPbnNY89eM7dKY0YvFQVnEaPmjqKmLnMfK1mj5qmKOojzVa4o2fvHhvn2kxIe2pDCzn
POzInZk6Bz5ee9Ef6bU2rztjczhzGPl4cxznNd39VmvHN6eYDnztl6sxzNm2fFHZtrE8aWWtMz09
IWHaNFOX65edRVNRzS5z8zPSxPny8VRzxCKVaIbwYsax5eXl5dsGj7aeYc5jXnNGY58Ocxrv6rNl
Zmyb03mXkfNGbLiMc5jXhz5WvLX2fm5/2cijvDnMY5zGPhj5WvLv78m9PWM0a7ZhzmNeLIo8y1bw
ay6zNHbR8z6ldSap5+ymDRI1Wx1F1NRnOLvM7RW8W1FeRp4pwW+xo+sZoz5bW5jKDvoP1zKPr0IY
qCOVuroxmb8y8w+a1oZmNpPCnNFiNkfNHzttZceZUH5t24n0qai4j48PdTFVne46GI1Yy5+erDnj
746C63eOKP1jXuXezc/XL1qPtijjiNVnP31hpbNzX2Olzd948Pla6CKM5jc9RG3MYbWjHNHnbO+o
znuI8V81o2a751oMMc8WZfZdVZmxa3lRQR1FVMaHv0Dqy0fKmoNHkUdS3zHsSD4JQ+hnfJcrghtP
2gWXnhLT8cqr2Fqd3OaysvEV0699lpe9LVdP1ZO5l+EmmpmtX3g1f2srmWVlIiVEfLmXrIrXa99c
v69KRPemr9pU0H7LkuHT82ZeV8KEqW9Y1FpukezJT2dnUwAB///////////0KgAlXQIAANkEzHcR
///////////////////////qlOY8ubXboLztKMkTXmnedO3RNUu9edunRJVtt99edr1vpxK21fqW
XnhLT8aUtta1O7nNY14imoPV9s1k50tNK/Vns/mX4Saaar7x6v7R1lcy60pESqSYPMvWRWh2PvqQ
y/r0pE+3Rq3OSq0HqWXDp+EjKuYoS1S32vWNc0zrxvpK+xl21SnMeXNrt0F52lGaTXmmfOnfonlL
vp526dEiVbb13152F1t9AwpxdzDxPUW0ItYdmMfo11uQ3Sf87bxdRVxqM1Lf2jNt1q4fW2IrrQ9x
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
o7nc1J5WnUs+lZnKGlV3KJXuXU65m5NqSdeurl3Mvs+4+0Kpbo5nQklXT5fSjzrdzslIr3fxduvc
Z8nRrshfubKbV7y5gr6lW3Iu/TT3rXTtM67dJ2j3R0etUc7rtR70OyvU4/H1Q7Kdo9SLrt3OujlG
1O7kbudzSrNX0lu7WHw2YuaLHHeVEXPz+R0PS15GrqNjJnHCc9iSk2fPJc7b1QSeYfpLrmExQVdM
e8+ueNem3V1XJnzOY3Pec95nSPMiVnii68zdTz71ioIj75ubrU3Ubi3Z+15mZl1F4oo7o+eL00b5
9ipjVXDnoInUdOg0e8qb8qLzOc1Q78RtJNIY87Lt0XTOg93qcnL05xq5MsNZ4fS80PZTNUaZr3rs
lg7Pp0sbvWZqd0ZLfv2rGpiTNblojGB5zzeZ4jW1hs7LpiExPWs1vb93sZo6WvPQbW70km7tLNJ5
2xIa9Wt9OhjSu71qaW1v54M3M3m9a2EqPWx03ht9r2H883pxBjH5kmty3pjs5xzus905zGfUPO2s
Mm9zt9FieuxrWW9dum97S15j+54PJzPkx87azyEr+ffmdtTH3zNbCnKPepxrNXo5t36n5lq9dN2/
K+XnuSP35Meb39++fJjz7938Q21vO2jmvtrAtXiedtX03rNWfLS08u9R6y+x1qVq86avOxjjxq7z
trKLn6Ttxxc3bJOc3OdH5lGf3pnNGZM9yH2+17eufGsqN694mdT97ndTEmpE3LfQ6byLnPzm56Fc
2TXO9pG6duag7d3H2upzKCrHzRs1nqzcZrFvcUVB1x1bza127dOdrDRzHSgqcD5pm9VO4tugurqB
ZpurIj1OPLe+3Q1Bi6Hvp2NURTvZ1FAd6oOnarou2zdVlx9Mt1IZrM1buLo+aI3MqB51nL3n1deh
piOg8aazNPbHfrSGy5GrGrMMPvWTMoWtpvSb7WYK8k0azt+71njlV0e9yeBJ57u10+48ZvEsuS77
IdJHltNtSrY1LXHS2nPTGe+z7W5qYnJr2f9nvHrL13oDYeZav3WrMPuH7ayZlC09+p29Kk6vsc1d
XkmjXG37tm05VftHtSeDEng2PdntdPceReJZcl32Xo6SO3jeNSrc57par+9DtOemsm/fZ9rc5NTV
zk17Nz/tCNTjZ+2pJ6z+u78uhtmvmNMG0fTvpVcvplBQ32qN9tvoPaPV9E6M0W1E3MLTeVKWlQ1r
r1FHuh2qC0pyzGePw10Luo9w0WGtvmOlvpSMUNBzc2Rdnzc+qPtfscS5u46HOr8qz2PnvW6uzKua
nJg0tzXeOPvFhjvmSRz2dxc1xzmdOb2O4osuanFUxainKtjnMjvU44tGVtcxu3U59xx3BdFkJzYW
vF7nq0MrMaXqXu32rzmXkTl1ra7CWul7OXcx7LLq9M3RuY1fa/r7a1Y90H616+T+hTj92D+hprF6
/i+4jUdhYh78vJz0aG+/vTWPx+CdfrUi8euwPt5i8Y8Xq3rwa8daFzjdyXvW5yC6Bea9xV17oYpi
9ByeqVe77PWsnK9vIjNzX2271dH6HC/o8vXvnj7NNPPO0udBrktg3S6EZmveL6NV/R7LBzl+yv2t
09hrMsTE8s9eDy5yc2/RXy/oQmNUauc10dobkFajy88nG1W+bnPPFptaa88lQT42nILT3sbx++rG
nppje9+36+gTT8bVr1hLz0V34xsSjSl0t5re9p+v1prTTx72Pd6fp0mnr1p3jYfuNr16aTa15ve3
nsu3rVcLxNrW34KHw0eRPJxGPUm6M1oc3PeRGwZdRfPqh33szxX7xLzI7SDC0/PjSN7uP3m352Ph
qDpnQydi7Mer8qyr+2rqMWdu9Sjdlzno77yqxYSXj6Cpyo6805Rrm96PvmqF9ootPmGZV1T379uq
jUWueJm1MXFdvOvmLXZ0dT0zKP1TPPUz091XNEdzkWjvDrc6YZ05lFhgbO2uzB+/bmo6mNRnvGpi
OYtZtScpd27GMyyx8TlXj9EwJBu0PN6WkxNPWvg0Yx7N8TSbX2dV+3e3WxDcs5LD2a7uCDfxijFm
D8Xr8Xze126hYvXuY935OMbaTl+ffd+Tml5MSS0Op6hcxRznyT3fwZ7oPVH7O/OnoknOg+fWvqmO
m4RRmxrDj4m0ntiYEg7Wh5votKw3rXx6jNHhzUaaTao51X7dt/EZCTcs5OhMaoe7gg38clGDmr3O
eL11lR72u/XPFi9e5j3fk4xtpW5fn33fbyc6LySWh6T1C5jc588936MnNN6998Hzp6Nz3UP1r6pj
o+2h5QddbvW+zujfu6DOj7KgzmfMe8sPfQ6jW2e7saXbr2s/Y/Y/RdDdN9ubWa5nQIeHmpq6Dqt6
30RvUd2Eu9AqCLWukSXbEu6zn0aenG9ug7t9wnQYqCWRrN+oyCScU511Qs78dBQ5Ke8zeukWYlm/
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEQyQswtwywywywywxwzwwQ6w4wzwzwvwxwyQ3
Q8Qywxwww4g2HiGCHWGyGeGSHGHiGaG6FuGKGOHqGKHCGWG+HaGSFyGWGeGOFyGWFqGSHCGSGWGO
GSFuGuGSHOHGF6FyGCHGFuGOFqGSHCG+GiHaGCGOGOF2F2GyGyGaGSHGHGHqHaGOGOHGHGHeFuHG
HiHCF6HGGyFuGOGyG6GKGOGaF2GCHaGWGeG2FyGaGOFyHGGGGWGaGyGGHOGGFuGMGwzwvQ1w9Qxw
zQxw2wyQzwzwxw2Q5QyQ0QuQxwuQzwuQ3w4wuw7w3w2QxQyQzwzQxwxw2wtQuQzw3w5Qxwxwzw5w
zwtwyw3wyQ4wuQyQtwuw3wzwwQzw1wywyQ3w0QzQ3w7Q4wyQxwxwuQvQuwtwxQtwxQ4Qswvw0QxQ
vwxQuQtwxwyQtwxw2QuQ4wyQtw1w5w1w7Qvwzw2Qzwyw7Q0Qzwvwzwzw5wwQ7w7QyQ0Q4wzwuQ0Q
2Q1wuwzwywxQ4wxw3w4Qtwyw5Q4w2Qyw4w1wyQswwwtw7QyQ4w4wvQyQtw5w4wxwxQxwxQ2QzQ4w
xwwQ2QuQxwuQzQ2Q3QxQ0Q4wzw1wuwtwyQwwzQtwwQwQxQzwxwxPEMEMELkMsNsMEPENsMcMcMkM
UMMM8MsO0M0McL0McMUM8LUMcOENsMkMkL0MMNkO0MkM8NcM0McOcO0McNcOMNML0LMMsN0McM8O
cN8LkLkLcMMMkM0NEMkMsOELcMcMsMcL0LkM0LkOcOMMsNELkLMNkMcMcNkOMMMLkM0McLUMEOEN
kLUNkMUOUMUMUMUMkMkOcM8LcMcMcNkMcMkNELkM8MMMkLcLsMULsOMMEO0M8OMNkM8NcMENkNkN
kLkMkOMOMLsMcMcMEM8NkNkMMOMMMMsMULkLcNkLEO0OUMcLkO0McOMLsMcMcLUM0MMM0NELkLkL
0LcMsLcL0O0L8McOMMkMkMkLkO0OULcO0McOMMcOcM8OcMkOcNkLUO0OUOMO0OMO0MsM8LcOMMEL
UMsMsLsMMM8NEMcN0MUMUMkMMOMMMNkMcM0M8LkLcMcMMLkMcMUL8MkMsMcL8LkLsOMM8OMO8MkM
sNEM8MsOMNcOMO8LkLUOcOUO0McO0OMM8MkMcOcOcMcO8O0OULcPUOcOcOcLkLcMcOUOMOMLcM8M
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
zSst3wyfRuyjev/P47Kbp4XYOFH3INJNPHs1xc//9cskv96jepJahleLYkv853JtJI+uL83217cW
TJN5tfd0NyPDOfLAcmNMzWed475TDnZ16fV84PFsb6LlVso8fmgv8zNpNpGoSVjPlMDp+RUy2V8E
6R7lSEmnFBD8GLb7btHBsutllXvo3J9/87d9uleQGb42rd6ldvdho7cv3BjQv2RmvRE5k4xJu95I
TRYG9qbx7LV0Irq25f9fTuMjCZaHtC5GfGxxPpKMc/18KtmsplNxuf1qbm6f4uuKTIvvGadgitEr
uYJmDxdhz26rfcqYRG35SN/CrUVzPc+Zak5VYXk7Tc+vhwzCkiZr1edfDfM0mZ7H72/jmNbVe5zV
ue2paUq7/XqbcXtDO2mn7r8gszzt78a+Z61152t/cltKOkfp7rtd23wwMM2MWWSdt+P6g9Ldq1QZ
leRo6wlnOh61GGVVUi1KMkxsvW18qA+kq4JHVtNrwZwo84VdbXhpQ8vrG8/ZdProdMtmj29Y52yl
WTe/T3n4z538UYLzm8c2Pj57I7EdfjbmiYltt2Fb2o3+pLoVx18N2LCWGxj7c201IiXf2KpRiZk9
6Pa3vjRtta6fsu/2NENptv8WLS6yMAvT0LRmnx8WQ7Ouxh9/l3AEPJ0yftWomHO/sB7R9vl692yN
O+6mBrrFrfkocs08678h2WZfa7faV2Ua71t68sR4fZL0HJ/N87Sl5le16NX8cu3Ky/T6ttlcEfPH
eSLecnDO6ZA176l7AB61GHBmRivVLpG8e/u4wIjT9VW3ha06Fds9eNdGbXn/rk9rhbq3Y9vPJedD
sT205NhYjj51PKQ7vj6mndnHWa22qL7oBd2Sm53YTmxzw3zyINU/Rx0bN9plrH6dvIXsbH7a+NOM
W7RkytvzpeFWebJuQC7WkfEgs27Bnvk8v8ewJsfHbprrqteYRLaTsLT59umk4UJE9eroukc9l8TT
fr3SWLYST8w2hAwGc3utBjn0fd0pq9fSnOROMmx9w5nywp1ZCNOb+Zy5Ja61nS0s6kaTri4pK3Ed
cZs6DTsenchG1mwFHrUYuX8F6JulpO7e6XLJc798+SJvL+str/Kuxp7X1LTOqftXLmc+az2a7uLq
11e3fHJHt31lfHzEZND77+v8oL/Zt1r1MibWo/699+9f28NoS/rnJyvWfhuTeO526/BiFZazJ65f
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
TTz+1lpkQL/dBm8NN5cbu/ZWGedxaf6c2zzcMxc3Lm7ILWrfD9nDMQoetVjzZoBS0Y8ME9vatd+P
WCuq2r3zzIzdOrv/nG95rjtftkd3Xy7H0YlHOwq2H/6juJYzxmxJ4vksUXmJsDjMe5ZLrn+1Pcf0
T4YQpum0/chjXwS3Mn3idN+nyEpbYgnXWoPcM16H+xVqHQ1k7eqL2JNxayR6l3W6a/H2djt+zei7
g2lKUts66t+cX6Z9NHle7iF7YfTkvvzamPPwImkZ5OzDK7bpklRCOu9Dmnyv9PaKsrpOPFh3sQf1
FKMvXcrOWWP56+k4IO7EbOyGrvev1dgvbG8/+Yhosucm02nbMYxvMv/xz7D+XypQHqXYSP8aoWri
LpXabj/g4+7669AeunpK/1N3loZ032eXqxP7cM8D43erh6mTXX/jCokLN59hJ/bI78Zcqmt5SOn2
N3XVy2pvjrHS9OGc9DeTl/m++iQ2V9WWLTHMcZl22uacnDU7rZG2Iamc9pZluC923Zhtjxht98hW
ozFm3Bqc7WRSgt2bbnPMZJ3dRsWbuYy7QRjJpOl81fY5096R3TBVND08iZO12gtjzjr67KNzc9x4
se+3EPoM3Wu7JPGrVLV98OvVjmJ3+6Sv80fGndnTxs7cWI2TpOweBue9G4v2W4BJ9dzJAh6lGGQp
AnTIxalb9+X68nS/6pVr9O2jySt46LK32L5L2X1po+8meazBKfHT4sp1bJZ4T37E8wj5Gt/5bOur
/PWwebDwmNrlIsWnWxzuN/LT/aZf6+PGvru1Rqa2J8xU3m0mq3HtY+/593n+O/h2D0t+C9mPiF7q
pEw6E7NK7PCLnvb7+3RqQae1xWY3lnma5dKPYbGM//xdcno73LZlLkMUmq1vgXEsY1bTqdbEZqOu
WW4wsLte19YjmbCDsTCG9+yORghDaPLsJ/1u2u8M061yqAeRaW/vNt+caKbuY61eFh61SKBZGmUU
uWTutn37rbMXh+qqu16pc+rQXhXyW9ntbYRL8sXrPeXLON0Hvwu7GessvZ30g84201ub/7naR7Tb
8LFdzp8UxqZBs6cynNjrWh+NabV5YzW1HVWS3RcPOjXB9OyP4nT6SljouJikj0ky6m1665WriZ6N
jOfRI9a95evtD56SFib38flw5ix+Giz1PL78bH0UWdszt8xDSvO1Lyu8YW6a0VzJu/Sp01c1bZP9
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
OeCec1c369r05lDSFh9EvBq5WdODMLGYiznahpVcAx6VaLxuS7coTT2au3dFH4q7i9VbdV96e3mX
jq7F9tO7P++/9/TYwbPGdLZki493/BP/um045Gv9LN//xXbFlTai8QE95Ot8Ni6Tt3qyzildiOOb
a12NOBlOtvE0a3nUdWlNz9i56Fn71OJiDuHClWrmc3KFajf3+G10T7DzbLU3tdEalnZ736KJm5Co
y0IR4lrUl1FmSdrIUGxjHsNcrD3OwxBUzWlMT7c0U472FkMSI3IzOrR1gFs0oOWSMjvddYbqXmNv
cpf1ZrmkG33g1hOTvmfOddQ5u6V7LPPIxbJMIh61GGk1GgghkojemcP5g693plfelVX1Wdbdwb2r
SP90H397qsGaw//04tw4+a1tZ923heSW/YVUuqPYJ+xZX/WfO9Hd/FT0TaI+95i59CB9k9767jw6
6gWJhKvLxzE6h7PrZFo2eHHoYnOztWNpKOZ1wnHtuaEhdTPNv/zm5hLydEX0aBq/+OHF79dTm12W
9B7M3R6sD2/b9D2Dz5oH1Wi0l3kPeTohZJfwuNcS9sfVmzyYFxeQaWSUaGT9wdFB58Ik6qaGNTE1
2H/WaT8nvZ9O5+u7dnt/sj2mXzq4tDT3MO+z1KKWdo/eqw3DcBQetZhliYgoidQ2127XE+Nwd/eu
6ub6TL+sz46Gb7Uunb32nPILn0+jaZHn3hZtuusE+h+7/T3D17d/LNUfzM9Phbs537ou4teWPVRd
lEtuNssWWDOTKdFVpmH02dbcZ3n69auNZtbXE58myfwktrVtfWRr3O7JXsvWcw+ZJRbCt/Hv8D7L
jzicNPn8X3TbsxHXVt+sebh47pUd2Y6Q5gmGmOO0tvrmvRbf1nLjwyBub5c4B4ZMHh6N2+PctKbt
xptenRz529Odf7ZI8/bhL20vxp2X86PqmaLqQu5T+TGJRrWGKQoedVhsE02onETmpa4qVCy6vbSL
5693qu910O7BR0hQZuj9vZ03jvwX9y2/CKo3r6Ybjbp+DOPCqq7rbjSD37wLNUPBcmuxb2p30PE8
hvOx3RKZJm+2xnT92XYnptHZ7kLuV7n+k2/Wu/z9d4V2fLq59k3ru429nOtrHbXXk7iYljzEVx3b
+XpX24QM8fJ/ZvN+7AckRMNtnNV8mZamSDAPjavOwOonbyLB6iX+Nh6wUebcqTYfkcFsfUQ2XHnk
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
2yrDeUgTeUkTpwisL3VvfYtGSdW05g67C76aYbKcs3Iz3HSdg0svxD5Tl9yPeRP3Sdyt6KReNfsJ
nZR/zEFU9205x10jHpUYaYnTRLlWD+8mr4Xi8aWjrqfrzWmoO4TgXXZ+pZ8vhvj/+7mve3K8+12y
smcmW551cTduHPPS4yee92PamUVXr83z017/A9ut9+eTtZaZvzP3+Y99y3uN26eV7KdlRNIwuWS3
L92WcTJJHMvBWvSfH+nJMrmkhnvND2EyJrsTEqfylaTszPJMl1/HNnczXcZP8ukxihwmSh19ahVp
jmWG3bm0TlyInNPkrbT3j1ZGMH0sNpVYbby17nMyfzs658hCna1m/g9v3WN71XVj+sZPtLbuy5sN
Qjtv2km1qUjBsJbjOp2QCnH3AB61GGmKKRKKR81O3NnOju8ahudiad3R2+3l7T5zump7X3Wn7EHk
lBA3GqtPPJEHPfj6N8f2caOTYMbOrhuk9dL51NHkMP31bJp3G13Iu7apvE6uIe9LdD85ii9mn0qL
5Ga/asyNg2dYTS3e1LSN75+mz60et3ispSY2fx/7WeThMkPD52T0+M6W7mTW9U3Jxv9WkxwrJcP+
EZ/HUpWdb7Z2HdZ52y8e5qHUnLK5Y515fumTi164jmzs3db+tN42or/OH64f2P6c3b7IB5HIllly
iPXx08/JXwtxj2V9nczQfQrbfrh7tRieHR6FSKAeXKJaKuaGW+50m998Oesj88HB3B08eHuXssj7
OrvYTfx3781e+UBTi8pZwzdP6sF2d122RhO7T1wdtN+vvNHemOokJtvLwYP1zqzrXovV5lrSrg/p
09lW3xb6vMvWRT7ZuR/zqqa3jMf1d8kZG29m8L0uQ2qt6Z+efZZlv95tzW5NbVz791t87tPlQ4zx
D3Kxzqum9rvTvqi2I83iuk+2zdI931T+q5Nkmu6rXFfKMBnnuv39k7V0oy/Eu/L1vpsWjUlO6uOf
K6GEqXtCf/pyevgpPV0szbyim62WvOjzzUj9TY34AB6V6GiTBEEUTtxpUhiObz8+V1XvMHeXl3eJ
274T/l3KMVMpt+/kP+biRw9ORvpS3G+c4m/5E738TWTpwOXWR+nMzoLlbJ2lBnaa98y6526cuygy
OzfzuuWh2Xa3JppnNE5fL7PM7bDYjjhk1LBmt+/91IdXjBna9CexJkJ728qc0z9jCzc3Udrmfhjs
uOkS42C4L67zPE1D1s3tcuqXp1GxPt49l7Gak+X123bwkrN5rLp5NldtutjdxVl2Ry2v9gP9cnY6
farH5+nsecaO6FgSrxetRWNeHayPZuVYKDXqsh+70bosNSoUHrUoUR1hFqVw4rZTZnn1a6Zpq2OE
rKoQuv6hzM02tjX38rHDZ/12a/+bEHfWsU7PLtRtJ13S2j0SO6OyjTHMx3bNV/ff1uStv3/8m4eD
eczMd315uC4/vijeRi/n7DK+yV2vWP6NYPUldNrjJZrMHbm/kPhwu4Upp+/fJyPXzVyGWVUT7Wt1
ZI/sV7tGL+/X1wynpjQJIb8wTcvXh+1inqflsA9hulfXJCc2p73d8DhSon1R2m7kyKgP7E2NYeHq
bdMBR/e0B35zvv35WdwByz2VxB4xwAXpBL9LS6dSUDOw92w7AB6lmHmGCVq3qynO3JbrPP7E6vv6
9cK5Ynt7dSUfUvR7jrn8xn/+RuRo+H5q92KcWdxIOZUpMe5cnX/se90x2zm4OCvTpiSmM2vk1aS0
teMPlunSM79e58+pHfuwo9PoO8Ot7Um4rWPY3moqPIxKNNVE133/+PDSXTan6UY7/jAyS1qN5Pg3
xunyIUmnz6s9/Rbmc4ij5ksmPaxjM9/G9VfRRVk9RYdrjra3bkpuvem+qiGE7qmN9kyOmS91t2lT
zt32aJKYOL69OMRN+8iyfi7Bgb2F+Fvb1Xqbe7eCaR40TYuREMKrj2dEPAIetRhpdShQWxZJXdKn
iFGRxOqtDu6dFevPq5YK69p0NdeJn3es7TafudNJ4v3XyfcvnFgtPpNm8avUh2Vg26DhmV6642Xb
29fnZJntiw1dbJvbbSanbWJnU6U5ifHGtjCNGG+5Rnv+aokzHNEyjnqZJmWMpy2E5b9cknJoHMSd
njmIH5MtPhn12GzNrSpdJGY4Fu/qmL/6dVqyt99GPSfjSRrJRS47ySz7plVVV+VBum7rF3mXLNVM
HQa/01SI9RHTMrmZ3mZysh4NrfMhb653T0/FyH5RfCOxpy3M0rVONx8soOAAHsUYcRYV0OEgmLul
np6epq1Qq5oLglfwrt1EyVuY3wizlhyWSfBkd+HD5qH/z8T+rb268ZPb13m/ftJ5u861/z7FizZ1
sUuF+t3num6sYViW1Ws7x3i6W3r6eC+O8HaraDXGPmrF8v2y25qlWiXWl43IVl9nZ98s/03HWsjg
lWnPL/SHka0nb+3Bt8wVT+IqahzX6tsxNso4bNj1dE1HzEyGGB8mq79Bk95b0pux9Vt/M3XSl11f
e7PPT2yW3bsez6RsmqHf2uDlUeSt2+xdTXTSpjpG/AMjRNVDkApF66VGuJ7CVB7FGHBJihYlEtuH
+/pL81RVeeVGfp0//mVadPvT58Pta2LSbbmfTI1L81eNHISTcsbYtly3cCK2zG92pnLtsuV3eGXo
i07W99R/OX6MboFJFUtycqaN+dp0edtk7bQtt3vdNN6/HZzxa3dSS3tuTFljI5Jek75/hO+7+XpO
TvlxpfPxD6dds54VKbNZWavFw0dfI7P8TU9qvcfqdZ1sK3E2Btt6do2pdbgmc7B9sJ8XyplZ+vnZ
mOGvS5ya4OTGdeafn/dff1xxdcx//SFbsUPV7E5Odrxh3hgeVeVvpcH+oySgQH8GT2dnUwAAgGAL
AAAAAAC3kbsKUgAAAGvL7soS4ePe7Ovn3+Lt3eXv7O/m5+TnHoUYeBlM9BByk7x7wHbuu8J542QH
99B19xHW+W6vW/1n9I1deqoYSzx7b3X64izusxvj4uQxZkgZOBluV9VO04iYNbbkNDme5ra8io6h
lPl5TuPD9Ryt8y//YttMbR2CntVXv5/6q2E6S7ENq+dcoicvzY1y7JOYS9lYaMnVEC53n45nUXvY
2hcPs5mu3f2ipe+XcdJJe7hWyTTGRXaTLVcVn+qUnoRIR+uLpu1E24jstqw1DKkNX56hzdgv7b1z
av/+RkRuyyFvltndyYNSQuy09ucO8dIIhmmS2cIrrJUCHqUYub9OVVRnsh7K3cms6nl6dFqneY72
CtYVzZzvvtP8t83ZNX1j1n2Cxnxt6OTOBpf6fTobb/bPVp2Ti3488OpZQ3a7zeGNOSm3NnQ9Y+5j
Wo9mkLf+ZfKLRLu1L3t2Pk2STQ29Il6BVLFHx+i6jSYX4i80Laal6T1Im3xlfbuMFAfn7JO9xzT7
FoeV9aGaB3YOknvViFsvNivfl2012V+V/jBjqLiHP/KpGBa75uyoq6Hsc2K71gzftOba+YX+Y3Fe
bPjJfjYonll3hESSpjaSrunGSWCVsyQxE5VesjLn3QEexZh5UkKjw8k0tbld7t5EW3l5VXD1YKHa
2Dz7lhWhPM+d3Hu4bTdeZPHRXcfPNs+7he++k/F6mX7SdZ/1a/jpf2/Ja+7X6+Zx5Y/stY3rgo7V
vLner83IKjZieZUyifluxqH933y4b7a6ZoSFJbT23r75ZLvZa0iuPXhY3trzJ1+vZ876qtSdVZ0a
nZXFdvgtfbemi2VeTOkR0lLOfTHlgjcECaGCmrG262b7bjE3YTv/cxozSJrxwhqv+5jOTWi6q3tz
4E25a+nD521LFsm2oAemQei/G6LeumhVlA4ehRhlK2hJ9JtAalMG7GiH7F3d3rn22zufaW3VFP8K
3PJu6Ta//Lmy7ZPLdG7m1Oz+kLfF9L9IRuvwJ3tziRqbGh2Dy4s+yyd3rW9Srd6WSqf52DQmvds/
o+mSfu1Ous5rn2y9rTxs/2iXdBy9o3PjYYxl7VDFKkTc8P1g9cns5kV6kaSIyNlVNBttKhLKq001
QjhDMUxc/6pBb9QTQ+49rp6nPiXmaYuzn+tc/1TdSvq22ue2xmh4aX41mcXdbWy8G6fbPLw95qff
3fihNpfs6JTmgP59yt163lhF026Npuskg+aBQr0RhivXGx6VOObimIBusklM7nhftssvfHNQQ0eX
t4/nka9Xmk6PTszeLam5FbDnaak8evz3pFQqD/bh72yWyxuv2uTSsZzafS3dzsOt1k769f5TWefX
OaY9b/pm+vYSOfBj1G6nt9WVSTLZvTla4x2bbjkWQpwcK339j7nZ481u/UduE/3wr7ZtkwVu6xr6
Th4sI36K7fXENsY9sg+umKF3WdPPNtiXNXg5rnyZ+sjxEpILWw+a+2nYRxhny9TD4DTxvi2azOr5
Lq9xSB9Va2tpMVzq3Cx59IL1pGWLPXeuU96bLkIes/2hhxiZom2QQQ0ehVjbUgF0i4nc683xqqmq
HvFB5es80wFdVR45XTxVV9h6L2+7KsNU//dAx/eSNjv+WcG0PCjtXtT+0IL+y2nROJo53TZvx1ja
WIsF6ReCtdno/e3Pb+7+GMvhhW2brzqlc1RixgbR29ecdd60KWYyqDyeU93CMEiq9vgwaDSZez0m
H6hbuTw+98PckAS776vHczQMXSPd5rztb4d7zU7DYSXH6cjtIeazsNbiOfY2XajSYmc1Pmdv8Z94
4dlLQwJ3W89MvSq1IReZwwhD8naarncYObD9znCuaTWVz8SC6a7PcR8naQ4e9WhQ105nCJW2cIdp
XL5UMtTFqVqhqjy097zZ/3tDv7X0yz2eYUd3Wqrdo+NXPytvyvry65HYrF0zAfc62VkI5vJPbrb4
I2Y3W0sYfFTSZtMvBsZJbUkfxjYMd+J8y/uP1Amu6dNlzBJHMVyxs96WSJ7waGXOuoV5O1rypTzK
vs4SwtCE/VW3IfjZGG0ta5s/GIYZ6eb3LY5+fvvkt722W1yzXcUmDSnNkFp0cIHXnfWO9pWFs5y7
+OQ7r7PNbWKOA9YGTq4Lxmgj4c020+aICSTDkIDEZkIpEqlMDzsoHrWYeYyKEBMXqXu3M3aHQ8dP
F7aHDCEEDz7sX7fd13e+FbZwvxXTnyhPWLYk2tnJq0Of6I9Zn14aX6y2b9Euzeb4xcDIuk07Xs+O
bt2d3xBdaIn10NPl3VRLLcbX6HO02/N5GpXpaNiR5+/z8ue7SX9ql5s1H1+QqmMqMcdovKBIYqng
fVKfbPpM+tXNPPGmWVKbjrY2IznefVgMnWuJffm7LW/dmPYYtzDls3ke/5RpeD9uD5/idW8Pn2us
59MPp/1G89PjkWFt3vsgTXplPse60PERR05e2nCvdgze73GhAx6VWGzqAMKL3J1SHGR+mV6cq6c+
6+DuXbHeL8wSSzNld3puPbg0tXF65MITx2ZP9O4a+OX85cF0PbGbXL31y+M9YXdg4tnz/XEeXXJ+
Zl7UyDzCFps+fItrSXo66bTmEbVzfqEFIkZzdBony7TO8CfR8FYtIVj+z5f3LKZbDDMd8kkzs9li
5HAke4jr6GVuf35Jf/v0PLb8EJu23RgL4/BgybSyXR/VT8amcfnSPZ766TTyMg+um0q86lf55XXv
7MKW1WTg5nbbtIRtFmO9u2Tg+rJeHn/RjElOOzLjoFciyVrGFDYZkl2syzgGBR7FGHkdBbRIZptl
cPvlf0J58M7Fi2PK7cBDzR6z6vH6dZO1cdISHNLu090NmbwkNbNcyrr1/eeRf21oulu+Ja5tusPd
vJu0eZFsyqLu1RBZs6xtutbutJlKWnxdaVwzB0tTzQbL2iaDXxw2m9orMZ5bBj1k17WNXx8mn71V
9S/HebLOPLxMxfSWXSKlWDV3W7Xk8P5wbCTra8t15mmiw4aNvTWRVp4waCfPfMpSvGUsF1Ov1oy+
lTV9jLnZboacbshFpTOf3ziI+Z6zXy0SoUoUF1oVna7LaShtLPk7HrVYZDMA9A5CbnuGu9r6svbg
Hlwu0b72H/7ypOpOw+xp70lf9w93qOHydnb7539zM/FOvWs3gf7YmM7B0c1LYnq7LE67eHGhNpPx
zxmzr6Q93xduNm0vFnOW9O3b05fD/RKpjGSUrOX7fqVRunbFCPGYCf30vDa9Qmcqsc35mBtU5psR
Ote3z+dKDpuc95KriZn5t1s2U/rQL0J4NkyeK/txnc97wsoj5dLi7JcyDP+8Y8ok5//rPrTz55Nc
ZvqVczN1EIZPbqzznb2ewu6xrA3799y5W6571iYqTtnW0NeYCBirDh6FGHimDcTwM7pbGApDvaWH
z6brW1GXl3dd619PZa8dWVm+BJ9rWuI20zdIHT+a33Ow74tp4/5rqr896YarHSMct7e5fJxVwwYl
5jBcstnwVblteiBLZH1Lfx7+ZHPc7Rpp9u/DkbtltWr34EOuI8temVdItdELX72NjPHrtqSflnz1
0G/Rjjlbm0rT5R2mOoZs3Fx/klUy2g1z/CnoS6dnq7GSvpl5btm9x1R14tVrOnlcXf/5IdMyfDgg
r+7HiZs+OQl32ywU+WV17uN3WfvqktdfjtPYMf3ArfETLYyjtbfbnlsqPjzLyT6k3tsEHpUYeFOU
prXfMqlbZD+PQbwYsupkuo0OXt71h3yT7abZIp+12v/ml1s6v+7fnPTr5qud3p8FXfRxgmny8jrG
+GLYl9Fw0bRsVzXvZX4mKpOzYeO9vlnObb8O55Vpnl8UuZkw0ZjYtQERJ02LBvOtXcqR9lSiHm/G
sN/swpwkezcahqENJj4aVVNWzf6N1H4a8sVG+yq5f3/I53/f1g45GYNtLNmidSxz9e3jiMdq+m70
idXHz7O4cV90arUubveHJ9ePW17ftBO5k2BX1z+WC2k5evuJp2Z32oVkM6lR6XZEH2S7w3uLZvVw
ZwEeZRhktQqIkmjuzq2n6rHnj8w3lw+G4qnQXuVdbfykGdu5yX79nh2Gt62eP/OtmrrRS5d+Q8+V
s/uXs4c17dyxznW/HFv5TsQ2MupX63dSxkHbmG0fa8aX9RbX8t2STCtbz0+lqfFabOh9ej3uVpuq
s1T63UZCOGXckpqXd6PWDvu//Hc9TfHhS2k+MbxRjEk0cT+eniZj5LTJ9K3JKz2m0PLVHC9Orvss
5tzVb9H4IVK+veO3X9uez27FET3e5/JBXHc9SFirF1ZX/3Zy7Hzzxyeaa32ptV3bBRt7nZ3DC2kd
rVOfW5J2NB9y2oGZbh61GHWTSETxI0rdcrj/6GthS+bHL7hONwcd3D142Izt64/9c/9Whzvlu3ee
Yd/E3afdXatuX+MjUXsmbY7GWe/KYic/G7WGpg/W4gcelHFxNOZmvHN7fLQnc6LHXEnSj/5CCLnX
IBcRl2wZGN+XafUcbJrLxwa5xvQjTerrNK2WaTLMc8t/+HB0NzRiPUL4sHm0WU3jK1O8v6v9ss8J
+jH7QjdPQTXarHjtm1mW6yX/R43Re/99efvyw3q/+GT0wqLpPIHJla5OmhvH7NlY6A8PWfu2VuP1
lE1qCaWnYF5rsFkGZs8BHqVIUTNd1iBqxMydzI+eeD0UhcvX4x4Er/KuM27oMfbXWSU3b/cDS/jc
9tAm7/tmvkHk4dX9hl5+Gx6GH59va/NlMzLWIW/rn64ftjHzdFeNVr/mg+Z6t1yENzPVrCtrXOTf
0VWe2A5qLjCZnVZtD/wqViUMeUjGz4ke8cS18fxV19y5VFpuSqvysmNjnuxjseY6vv3sIal26n3N
P5vG5dKTsdVou2m7avmzJ2nex+Y8/S539lnt1nHYb21K4sPbtrtO/4bZPYhz55jl5spqv6Nl0lkn
bp54c9WMeCNQBqHyNaLGQUQ2HoVovGrCCUVqmbvTEHeq6vIhRubt2ZRdXt4loxj2lmo521/dt/kv
7dMnfxgS81Y7cfwlSV20WsvHdWP4MPrAuBMi0Ui29G26/frCPc3obpNoZDbu/RfuwElNlhy7FtXn
ePviqXJxuY2P49Hsf76+bdNZQtzm5XYvw2o3OrJcqWu33l/aakw0JS7fz3OO/Swjt/117Kb3yUzz
UKiTj3O5lnfbP+tIGLYwx4no5+Phan4Ki1Txhu2WMg0Navw470SaMbGdjeXXSm8yubmVQWNKa3Kx
ho15XIfP1rmRKQvZy5WvN8INHpXocEsLbdEvpO7s6Kx65RSPLi4e6PHyCqHLnBl62v713e2tv8SZ
bhvy+3165/7p6Sw06NxZu9ArkweJse21eiOtT9Zs/+vZeITTF5bbP1YNsczrKr1rNPkyXbOh1vNB
WD2ZdLz3xNxvzGtEk/1kbWQSa3Ymtjaejaz8Mf+mhHF0hmP4dFp+fV6/7IaKEaOdYXuYFdY73X5j
PdJDTxLM3az8fJG0RHTUtlg9ifNxLXWqre54G59Ytz6O80z40FYbZi6uxb41d+dtb1v46iBxoyY2
J48n5mhudutUtY/Garh0o4dUr98AT2dnUwABfnAAAAAAAAD0KgAlYgIAAGfMMYcYYP9NMdb//8H/
5f9jIh3//0NJ/2n/iMr/TajxHqpoftz1U1y6g981RV0fNUVNV5VFV+rqt3kSoIosqp26uW3dTU83
MeLKrC6ZVZMeg60RpeeOpvoqDmoKrNViOKKLD1aeay+fKDrp89BzrHzxqh3Z6AR1Mam7sbR8fz8r
t+D+/Enn4Ad/Ejfg/PwfHL91R2afl5fs3A4fwjD8IzFF9WoIAgCRCKYtszUAF4AK5wGR0ATDOgu0
xOPzdozu72pjo8s3mvzjaHUoFTtogYFkDCyhaDx8qF/VPGyerAbWltuL/LV0ddtSqhvWjFIf025A
e5029/VoaAHFqnQ7YCF1/1jX9ObetDVQRhktYcldFlVJ1YU7osXRaVUqkUrosGpkElPRYFOo+KlB
YLaKsqApRyCvasKAlV11QU5Qa5VNouupShFSixU1+pQqP/5UhQlFjCiqplE6qfVXasjNFVpqqdVW
qrNVmiqIqrFVrmqpxzR89W6qpzz9o+fnioedc1XVcz1ET6uqzFUVU7N0is1SvKv7VDqtG0bnPuqz
Gfuc7Tc7HeRndSmuaKO6nmqY5atyN1dQUM4eOpuNRWexk7R6O5iIPFhjmMB/Pyu34P78U9+JI/B+
fhCP3WXZp80Pi6fCjEAAAQxwxwtwswsgDE+eR8ExYBsbLF6Afz8rt+D+/Emn4Ak/Ekfg/PwfHL91
V2afk7PsvAfCafebge1QsiAAAOFOg7i0gpuhHqYQIATOCHCt5l+ejoDEmhgGY71tdnEFe1ReTMF0
SVb2bL2pboatHWCuXyfi/cuZ+KFeSd/5S/Z8PwJ3e1cUqyPTPZAYHRsgeevA3POT5GDm+3qbj42P
e16jXo+ecjlqc/AVMtXrwe22HLg6mm6ocd3S5hedK9mqZ09B4eI8Xx5dnuw6sNQXgjj9XY2J41CO
OcoMyJ5kwhefbdud8kvonvfmLcNW9n8/K7fg/vxJp+AJPxJH4Pz8Hxy/dVdmn13l8PHfuLwfKLxw
F6rLhDgDADuLQchoAE/BPwnSKCUIb6ICAJjldeDtF6VFY12p+D4jB20A39En/zWu8o6NBbUt7VR6
5rK+2TMPG5MPh4bM/LQpt77Zh2ZLI4Dzw2Iy+Q4+voxJ99eOZ+mb/rzlt03xj/HR7aezsj+kZWwu
zT0bfj3/fD2ymC/OK+oHAWgPHPPQXRogei5bRzwxcjuwkk9u13DU0o9xbSd4tXEkpmqipekTn+gh
BPDpHtdHM0p9YZWXQ5ZHaIPn/u0cRV4/ny3t9rjqFWfVFuEmBBC013LjSryqyFWQQd2khyCdRcxl
zrOaDELmTVPaJ8JIECH7kkPIZcyrYsEYTmxc8mifNm6h5I/Dqn/5I5Ah/qSGJyxTf7y95UqTRu0N
Df0d9QZaDdtsPL57q322z329Wkq20saeSvvVX2DnPbUKAWg+W1hpYMWbKStoGij0VPU9RLFA02Hm
8uZ3ft8jVdVtVW8lzuKz7OjtzYqYVMvtKuhKmOCleC85+T3twOtu6J5xRE49jTS9+dt7uO9dHRzj
cg23QKv9QMn3v1XspykqpvFycq6ubroECDqBAg5hunNQxc9RVnPUVfV9WedaDm6VfVtF16UC79lV
md85zVPP0qyPT7Uc8nVd6ao++6PG2Z1Xoo0dKgB+1XLr1dB3r4jRa7O8jq2rTV6rNTmUntVzniqK
rVRz1dD5fOKATz5jrKmK7uNa32e9dPXzLn35qgbq/dFeqKIVNAe6lp2eP9OvPlTqgoDUFAeecdWb
51zRxc9XVFTUXlxZvTbmklQ3jveZvd66Yctm1YT56A2eeHe5EtacWuy81JuVvet3rxY2tzM889hM
ffvanW+mYlm9K53JnuYazLvOsTUFgyQ2u3lbzSvM0EFhml54lxczOQB/Pyu34P78SafgCT8SR+D8
/B8cv3VXZp97y+Trn2x4PkAvGPTVhyIAAAks5JAkjMMouMg5JfvDi7DSEAo1xAGsiYgGY2dCgRva
mw9A/+Tri72qWh+TGCeM23D5rLe+LynEjNLZprd2T8sYCfzwHPZTdP4ai5MLG8MwpbqeGtn1Nq76
1JgYGxsZUmlsR9UJ+soI3g7sz3dvsTHvP+Di/lNE95BhzLTUenqym0K4P3CrI3x/dr+h9FvjqMua
MfjKb/XbM1G/ZvepG4lbsIPacvdqvnZ0MQTleUN2xSpZKUVWzgvuNk+Xy7kN/luKog9eC84zw2ve
Wb3Sq6+QQTnttzKuBUzZcLfY6/+2XvjU0WBmBA085iC/zcb85TG6CggoLVagVeKSnNRTmqpjzc1V
NVFrn5uarXV1B0Z4qv7qgI5z1PPVlRQRc66XzdOfvHfNQdnVlX57qrzmyhPQ8/MrdAzdqrKyLmjq
zmquZdVxA59rVn7dqm0dPmoWMPa7Nc+6rmtHjuJmqs89X9MMeMRVNqq6Od96BUB1znqD0qiNHHO9
bMfSLX8PlyTjNfWYHW7apbvM8OzHaWWjdWvDZJOJXHeIZGad6eYz4a9dA5NUBtXFepjs5fpskNKk
ms1t4OwS5SINvuDgfz8rt+D+/EmfgCz8SR+D8/B8cv3VnZp99p4YeynJ8gE5p0JKEAAABInApRou
tAjZh5yYk/DDlfADn2nXqvamWpGhm642lPr/q7Qa5jKl6MOL06GlkJMFXezyD0aTEkH9XYJax6Lr
90yrwQuEIxd4/4PzDHtRq/8bFl2Tqy96PR41rg1DV2JaOrC7y73dj/+eJ7N50rGCGGCbSf7OG3st
pDO2g2eyoNuqyqnf2z8viKjqKdJo1jeL3lzctJvui2lICqr5ulDQAgntTotgqCqJTtFkmhfPvj1D
Icq76py6rFRVTGgFVOE6DKCg3FVTqrT1XjVWatuqzbzKK/sdW2VNqM9Vw0fWKpqyq5wIqp7VTNHN
Trmxp1+fLiNV14e6m7xGqtdp1x3VaWXVcXftJz1U6NnObn7DqKKPtHLzUb9VWaizdPnSyl9LmLV+
Lt1qZ62lb6dKudc+92PnzN9B67D6cVYAfz8rt+D+/Emfj3PwfHL91l2afkw+R6oxAAAEMwAho7t5
AH8/K7fg/vxJn49z8IR+607NPyYfCjEAAAAAAeAAfz8rt+D+/Emn4Ak/Ekfg/PwfHL91V2affdfv
nyKcnyKc4p8gCfgn4GR4ypMlNJYdK04+XBk/AVGQDonzu2u/5MJUZV98Hls5j9mHwMVy/17qiSv7
isDnsqJwfDs3w+4srmMeY3Z/engIfv/wSoBr8e3rlujEO46tJ2msTZQfbO1m4eafqoDdUrBs/ZUn
TYGDUdNiH9eZW69Br7c3Bgwl+w7A06S4H7j6k0V19PyrJymhX+mC6Nhw2dq2VJHKTXYZuqWnLSlm
jWGC0qgYpH9/2oasnKbbmwGBVECE6w1Uq4/GyqoWYwc5N0Uc14guWix2nsZOVLQvdTenvztttHaq
NylWuPcU5VDft2TVSof92gKJ3/G5uvxHIU1KnqjjilJ6OyrTKqqgny6XtFlTKRTV7Ie0JegRIESC
paXqUVfVUqKo2zKStS6KoSKpoYXosLJXm1KW9VaLG525egl+7MU1Jxh3mU43IHfqprhsqplVsXPV
aqpR788d1D7Z0qUjHoH356ruHnO8dV7FfPQVWKB1XsR7qKrlWRZz5itnqt0Ecsl3fTO9Xx1Uyq/N
Kq7VbBqrtBF21O7m+aOp58quVUxq8yvrivDXlCqqQe9A6qVTRpKY5lVlVK3fIz6oFQbqT+8xoz8x
6DDZ2vxzmaq7s2dyu886HqB5zZQburLMqrsTtzmz5mVvOmv13qK1l9F2TTdSvjVVxOU1VMUbWr12
2m09oa2Z5OVZfO15U2E/I9drHioV3YWsWc3z2rH54pdgxuJzgH8/K7fg/vxJn4Ar8SV+D8/B8cv3
V3Zp9z6Xg5Puc0MQAAACIb4Yod4WQAAAJkfKtSRH+NgoYYctZBe4GKejV3CgTlvj5FzZS/1/Pyu3
4P78SafgCT8SR+D8/B8cv3VXZp9d5fDS58onJ8onOKvbWx2AAAArrm4DDKMg5uzRtQKRGDw4phwJ
T8E87ZHmMBjm9qaxvh64jZgqzzkFVnpjJ/R2VXBrXrNolproHp+b+nBcdALKfxCOL7LoGB18MKVU
O7hzEBZa/JufzQ/WYz8sZxedoIcCF3kRUu6fcMderlNGeXFPoA7QJXhJDhD079c9u5D0/g3zeU9o
Yj0/80R22bXsrSGO7dzypbUI3u39oYTIZDikBqCdob5/d+Bx+/4pDJ/JB75e+fA7Iemite0CDacp
y3G0M3koDIexBYQeOM9uXUMOCE2NVWDc1VMattc8wfsVXIr2XvpSZadeq5Viqs5F7NdCxHvuDeBz
zmbO8CDSYzUF9va9V9xq8lVrVWdruO+4secZlu3NzdOapk2B57seBtXidXdsIXEqz1vPY1ULorPO
C0SM9PQ/atjWQP82uTB/Pyu34P78SWfgCT8SSfg/Pwe5y/dTdmn1E87jTFaW8ibE5PwJsTngA2km
26ogCAwAIgQL4FupmqZkABFMpKSUDLTJSQgIgkBadCgnUHADoVFGsLHY1QZKiLnKZLME5JcdOOk3
5HlSKqhhQTynj+SdnlxCgPrlz9sDzPg6L2oa7/xpLVqieQ4Lro6GyoB0630Q6d42G8MdCrDHaM0a
/9XV9s1XoOANoRb0UPo4cDTkHuXmrV9bFfVUFqqDMp3ggyruIN7lotRTduq++aLg0WXVJSxQwbCg
dFkKlMlHhq3nyqCnRTyqOb6LX/l4hyrPVaL2KNe2qzk55hRVBuqpT8qe86UJ97ZK6g0rqMoe1uYq
qbVUmdYkKrneqmV1fFFVTHKqcVU87mvs6rVVOTReenu+bMo1S5Vz3dWrQ6RO8e6v5qjqxdVMat/d
H5s5qBmvMq0VU6zx1WqvfWrOZdqBrmitVZrydkNMOz5FGoqA55w1TQapD1EccX3Mizv2Yucw993b
8s6Wzo1gfz8rt+D+/Ekn4Al/Ekfg/vwe3T91R2afk7U+Y5DH4HKgJ91AcPW1NhkQAAB0oQJAlgki
jCyMM48dAESRSNGqIdCLm0/Rfb7KAkcetVwr4s4FiwSlJGBKRmaMKtY1Zm1/8yP1mXh849cUXcvM
caQRbyaE8q4OLeRB/ZGf5YXtlZEjyyDrb6GclPkvcZcyw3Hd4oyem4FtOxW8Ib0BmYzM7pQv4XRb
ECvz0nHxyq40CSBkjYsSxBnSHxPnVTMH4df8wdJ27ex5lfT8Un8/K7fg/vxJJ+AJPxJX4P78Ht0/
dVdmn4e3tweujmUT7SjinvpqfiAAAPnYYoY/iJcAkbkKkhZJb0IWxZ0AJwgAJ1ucCgFUJx3yFBjN
fOONnx3CjJ1yP/bhf9QmGFj1HVbKcOaHYTJn1Znks43LTTa26zqP2Mo0xtxBl4XoDBBoDRVUPaXM
tx2QMUOrWqoxH46kHLrCZwATMeqWdfgVYB1PCdpAtoYCGGajoBs6XEKhYeaL6KT/24oaqfXqhvpF
AVJUVSUyjyn/4Um11Kqz1AUCUeUTosFxAKuq8pyq6YqXtQFEbIja1aCo11XW07NJTHEsmxRoat6V
S4gzRZ9RfU9nZ1MAAX9wAAAAAAAA9CoAJWMCAADX+iqfEYX/////////////////////XUNVLNVx
Kgqt1U56irIuaq/mdqtqp/bx88dmSjqpzVYvuqvPUVXk6M0VVirAlEbrQVAxexWqrFB35lV+VNV0
VarPUYjjrVfqsyW6vqpga6rFX0PSoq7Kt56r2RVYb2d2Y0ed763tN7q1HoFnPFPHs3erXjk1cRsm
D+n7c6dxMRPoKg1RzD8AS4oXlm9K6hsy47zpcILhNcRbhEYuFJm4oSeIzQRuKM2iNwCuIWULdmr0
ABTTreDbima6UC2DPcVLyKNpxIhS4i91womrgSY7yvKCcA141uK4qI3DWTIlbh4Tm9OLwtcF7hBx
aV5HOxxjTCwMmvGk5yRo9cNNOz3C24RrTvYgmxOpzOuqAMgsgG8DgPM4zIJiErnryVeaREkVuDV4
jksAuGdwYledDdwwlhMFCd4H1TBXWcu5N3Wcu5MJTlZynIMTAutnLXVMKELOWtaYMfs5CICm/rOX
cm7rOXZkzgjZyiVTP6Wcu5N3WcmzJtidnIpom7rOXcm7rOVa0w8qzkDcm7rOXcm7rOWcSTTnI1nI
G5N3Wcu5Nz9nLx5NWGJ0dQE3O1QCSwHM6prSAkKMSjO70whVwVrCBuRbwWZnaRxKYX8/mbgHNFwX
a4BSfMxqSAa28bySH3A/rhZcDO65BXoK8JJzeU7iLiMXFMHLDJYanROJwvAlwcvCL9xOIBZ24BTy
PJxNFwSuIWUkUqiJjEib10TSFeIbgk1dwuwKNOQGU4vAa1g85XAa4hTAFzHKs9JpjmEOIy1eDCmU
CdvGEzviReUHTIHvW8Ze/jqBhx7AdkKaJ2uBOIHFJrP4MsoZrhs4auAAQQrrmCbBsnGAvJZ5xjZe
8AkMY/cKLxLLAwTx5zINiJmp/uABNBKXgfWqYMRoHuFQFkuBm4XC01vcW2/KGbMTFTM0kgYTw7kS
aN7I/GThOfFEbgVm3tBBt7iG3BPYzL4cJXEKY97rBo2t5z4TkLFwmQat4J+3uRZNuJFwVvEQELSB
xre8hTex8wNE5Yw4IrjvcbgC/jAZFyTGPjtWErKW93DEf3vcpEMM56n3cG97Jgm95rh9B6UQ5AzZ
TG2Lja3MYLEDmcfuBlxAJhm9z+H72L3A4lPE41SHcKjOHezFW9n7hgHTLcD8AgZjHb0lj7kJYIYy
94BxEzIMMb3n/e9SEiTBlFAQUCI73oK73GIpLODEL1vbt1kczg3IpIFEZmuAUxuXDaeN7Az+94HL
gTOxqVJIELhtm3s3He45NwJG8mJ4K1VwXpvYCVGBa4DXhaRLhtOW9yEf3vUiE11h0jwmspvY/He4
7yk1Cs4SNnlB/CQuA+93DC4rAc+hsmTjI1w7nDe3dd7BhAjW9eB7hRcVrgBDezwtuIMc8O+F4IkP
2tqkvDvd4GuKxE9cILwoYLSwX3tYJvcwXCg6/cCSK8HZN7jHb8oG14RDAdm6oWw7lof3sYkMNw1z
XN4IVBN7Add7zFzYNXcEF4LhVMW9x3bG4LGTBScK9JLGbgHg3cS9N7CTD9ZiMU2Le8Ud7Au3VmjV
u3FvcQLe8VvZokxl/S4X6v3Ay4/99wvgTmkMuAAwBShZw0PFLg9cNHVNZwxKQRl2XjRWzgpWO4dy
2TUqzgpVw/ALh3cFCKk47v9ahvAdlQmU/06EMQRcVEFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgo
KlWcFKQUFBQVKs4KUgoKCgqVZwUpBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQ
VKs4KUgoKCgqVZwUpBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQVKs4KUgoKCg
qVZwUpBQUFBUqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQVKs4KUgoKCgqVZwUpBQUFB
UqzgpSCgoKCpVnBSkFBQUFSrOClIKCgoKlWcFKQUFBQVKs4KUgoKCgqVZwUpBQUFBUqzgpSCgoKC
pVnBSkFBQUFSrOClIKCgoKlWcFK/k+gkd3//d/pv/0+k5d3//d/pv/0+k5d3//d/pv/0+k5d3//d
/pv/0+k5d3//d/pv/0+k5d3//d/pv/0+k5d3//d/pv/0+k5d3//d/pv/0+g2D14QvOt7DVev72fi
jevMuVOMuW9ddhvZV67fkK9Z5cqcZct7EmzBeyr2GspeusuVOMuW9kuEr2ZetBLDeycuVOMuW9ia
Cd7RvbiBhvYWXKnGXLewQ8TvW17OV97ey5U4y5b2hijexb2Cyr2Dlypxly3r9+T72He3Z2uPV4zy
5U4y5bx+LZ727e3t9e3suVOMuW9vN97fvbrfe3MuVOMuW9uWX727e3fa9t5cqcZct7asGN7ZvbXf
e28uVOMuW9t/u9t3tuj17by5U4y5b25b17bvblOxL25lypxly3tvvvbd7cg17by5U4y5b2233t29
u/G9t5cqcZct7c317bvbf/e3MuVOMuW9txa9t3ttIa9tZcqcZct7b317avbu2vbuXKnGXLe3KViX
ty9vd17ey5U4y5b2/YqVe3r29uN7ey5U4y5b27+729e3ua9u5cqcZct7f+N7dvYCrnvJeXKnFwiy
3h47cZZZT6CbeOJkTXla8rWcryteVk15WvK1nK8rXlZNeVrytZyvK15WTXla8rWcryteVrevJV5Q
/+7/Tf95WvKya8rXlazleVrysmvK15Ws5Xla8rJryteVrOV5WvKya8rXlazleVrysmvK15Ws5Xla
8rJryteVrOV5WvKya8rXlZOb2EOaXsK9h3k68On5jBw8TLgpnJXEw6+oaKPFoHJL3pNl4MyOzgSQ
PWYwhw0EYYiHGQMYk2Z8AhMckiRQ5jwcdDZuBDexqQnH5HmQOrsA9MJJAkIWKghkDHz5M2IbcPPg
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
wLltUnFyNuKNxBuQ9xbuEVxDuK2972zMzMzb3ve972zMzMzbT2dnUwAB///////////0KgAlZQIA
ANZ330oR///////////////////////e973vbMzctAQIIMPXveHNVFox3o3+gOqX2LM0Y6bf00I8
NDDz0AMLh//7dzN3N/////t3M3c3////+3czdzf////7dzN3N/////t3M3c3////+3czdzf////7
dzN3N/////t3M3c3////+3czdzf/+WGtcrYweZOdEpHfAJnlQpvjn73/73/dve99373/73/dve99
373/73/dve99373/73/dve99373/73/dve99373/73/dve99373/73/dve99373/73/dve99373/
735k5pxDBlr/e//e/0wmcCqUDv73/73+Xq3V6fD97/97+OuujkcD/73/73/HsCD8CX/vf/vf9297
33fvf/vf929733fvf/vf929733Ynj4Jgr1wd29733akCJ4pXzvdve99xc3VnAl6r7t73vuwVto7q
g77t73vuxPAYkaJ7/u3vbb797+Ekj/D8g3h64L7V2u0Hf/vf5ecqQIRq3vfb3veHNUyAoR3k3t7t
76Md73uMe3vu3vox3ve4x7e+7e+jHe97jHt77t76Md73uMe3vu3vox3vbRj299299GPf/xj29929
9GP//xj299299GP//xj299299GP//xj299299GP//xj299299GP//xj299299GP//xj29924JMY/
//HXBW5kSFZiWvf/+tjhFnVdoajH/+xRh+OzrUnh03L/xYsfDo++CzsMXWh2HTp2C6LFnafVZRYv
xVbnbTlp2JVjFi8dvlpixfpFnTaN5Rfrt8oqz0ixdFWHaYsX67GoqwWL9AsWdvlXvqFi1a+WmLF+
gWLO3GdpixfoFiztOnTgv0C6dvlpixfqpisfLcAMAuFCMJiIFuef8/xaEAV26NrizxLMpfLt0qL9
CdOBOFv0/y/fCdofRbfK7fh+/yaQHYO0WLMWOwWLEACxY7BYsWLHYLFixY7BYsXB2CxYsWOwWLFi
x2CxYsWOwWLFix2CxYsWOwWLFix2CxYsWOwWLFix2CxYsWOwWLFix2CxYsWOwWLgsdgsWLFjsFix
yQg0q/MgYKGwPHwKqq73VlVgWhSMVVVRlODC2yOv5qqqVvGF9/eJcsCv/2Kqq54C/wV3csEg1NVV
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
q8IrZpiztix5nJMiwehM1kCnWCUtqKC6FrrLL4S2oTwmhUGKgs0vDYqDFQbsUPnr4KHxRCqIdKYJ
i4zDnua2A8zfAORy3R0HiaWANrd/KAw1THwmr4vd81AHrMJKoxEqjEUYijESqo/EqDxVxKulUbbD
A9PDnoUBagnOTo6Ojo6Ojo6OhnR0GTiMv59HR0dB37ejo6PXo6NB7dHn99HQb8n30dHR0dHR0dCo
86OgxvxQFqDs2OjoOLo6OjoUAJpdHR0dGF9d3R0dHz0dHR0Kjno6DDOM0FBriejo2GT0dHQfuV6M
30dHR0dHR0dHR0dHR0dHR0dHR0dHRgsD0dEjejo6Ojo6Ojo6OjKN6OiSbo6Ojo6Oh+jo6BLo6Bk6
Ojo6Ojo6Ojo6MFo6Ojo8ujo6Ojo6Ojo6OjoLo6NXj0dHR0dHR0dHR0bi6OifX0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHRHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHQ8dHR0dHR0dHR0dHR0dHQ/Q/R0dHR0dHR0dG7o6Ojo6Ojo6Ojo26ujoKbo
6Ogujop0dHQPPR0dGvo6Oj/hQ8JVEUoksUjDmqYZqnYc/QmOqs35+gzPrjejPGPe4oxEqjEUYijE
SnvejcQqMP0lRBe5J0YvN9HR0dF7nR0dHR0dHR0XudHR0dHR0dHRe50dHR0dHR0dF7nR0dHR0dHR
0XudHR0dHR0dHRe50dHR0dHR0dF7nR0dHQoIFAP0dF7nR0Y82j7rt6L3Ojox5l4XKl0XudHRz561
AP0dF7nR0Z06jvkH/vc6Ogy1AIqCsP0ZxUMKhm8I5mpw/RVQHdHR0dBCKVYv6Ojo6Ojo6Oi1ZcUW
LLOjo6Ojo6OjoTpnS2pujo6Ojo6C6EQ84Zh6Ojo6Ojo6NM2VypgmCYJyIMXBGh0dHR0GP+USj6pZ
PXG9HR0dB17NqVUWKDdKaWsz+j+yHrnDAUCCWFSteug92qgI0/r56L3PXoyZna0qoVvShNMW9bcX
i0ud80uR8Q3vKMRKoxFGIoxEuWVGV6Ovcdpxs91AHg73VAPjEYY61SUG9xQBKhr9Mk8Mkc6pvvcU
D3v7mgjJ7L3fQ5c5/9Bh4JUE3uaVRadLMZ0eagMvd6PvPJVQ01UTqhhULLFoXuxEXgC6GJCyxde5
cS617e+9WJ0XFcSa+Ivcshtq5OhNYHrTkzKmCYOVyuVMEwTkORQkKDdQhHIcig46Ojo6F3RVcuv5
C7o6Ojo8c00yDJMa93CS67rXgOjo6Ohd0ZdcuSrujo6OhUjJVSkqRVSAlUYiVRiKMRRiJc4qD71u
wrehhkKEcN7hlqA/Def2lPy9w5lSRnskFnQdt7igHN/BYzo+83Je4ZqoBymEVF2/7VC97hmnNksY
jo6MFes4j+zmcOM+TAvcOFQaGGdOJxXv73uH3hOjNnR/qBDJXuaTDD0emCQoFr3DOUFGL8/s8FTz
l73GHX/7UYxQJ3uGKoIjBxnn95dQHpVQ2qSjt/OOj0x97ihvNQwzG9uiS90Ob+85/9B7qhW9w2NY
WS6DCzN7h9mR55bKfR+KgG91QDIVC0JlQqqFlQte4sTJbV1wWLrnRZerEJ7ViWELEO9txknS35F6
WI70tiW3KmCYOVyuVMEwczlOjoQchyGj4VS9HR0dHR0dHQlOLoDeujo56OhHR0dHR0dHR0dHR0dH
QhQAdB9peiXo6Ojo6OhL0dBw3ro6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo/uhRiJVGIoxFGIlVC8Wqh
hULqhZEWossvlKmdC69hoX2WIvhNCLnRauS2osSrEJ73U9mVMEwcrlfnFGDmM90dCDkOS9dHR0dH
R0dHResvn+jo6Mz0dHR5Yvo6MQaeV6M79dHR0dHR9GeYOR6M9g29HR0dHQfnn0YrRiVAl0dG7o6O
joOdUQdH178/MvR0dHR0dHR0YbBZw7/w2sD0dHR0dHR0dBiKAD0MY6ejoVAHR0dHR0dHR0dHRg8M
YmF09HR0R0dBwnKe/QcSjESqMRRiKMRKqFrm6FTAq7VXn0dHR0dHR0dELI6Ojo6Ojo6Ojo6OjoWW
XxHR0dHR0dHR0dHR0dF2ms6Ojo6Ojo6Ojo6OjoJHR0dHR0dHR0dHR0dCPAwDM/+joMgwsznOjoRm
Mxeujo6Ojo6Ojovc6Ojo6Ojo6Oi9zo6Ojo6Ojo6L3Ojo6Ojo6Ojovc6Ojo6Ojo6Oi9zo6Ojo6Ojo
6L3Ojo6Ojo6Ojovc6Ojo6Ojo6Oi9zo6Ojo6Ojo6EqjESqMRRBByHR0E3o6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoyEn
R0b8h0dGQp0dHRmejorTo6Gc9HRgMF0dGn46OinR0dGvo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojojo6Ojbp6Ojon6OgHRHQ
MdCrf6OhVoqpzJ9HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0F0ctD0
dHR0dDuDofo6PP4r0dHBdHRXZ0dHR0YNumTo56P/o6OjoOHP9HR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0
dHR0dHR0dHR0dE5l7tc2/dlc5+9HR0bCOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo/dlfr
o6Ojo6Ojo6Ojo6OgOjb0dHR0dHR0dHR0dHR0eXHh0dHR0dHR0dHR0dHR5Yn12dHR0dHR0dHR0dHR
0cdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dGY6Og
GD6OjG9HR0dHR0dHQY+no2Hd9gzPR0dHR0dHR0bvLoM/NbWM6Ojo6Ojo6OjP9HR/+fR49HR0dHR0
dHRgejoMTo6Ojo6Ojo6Ojgujo6Ojo/+joD0NOP46Ojo6Ojo6Ojo6Ojo6Hm0RA9HR0dHR0dHRHQCn
/0dHz0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
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
UGH8bagJzOQyfjvOc6FASbeTVA6gJUBJ1Hpm1Afhj+MVQWnDnFCqoDfM7VQqqJ1Qp/np057If++T
oVDefFoTgps2fGeyp1ZbM5I5QzbFBQd6oAz2HOTPZ45N2ePBUIqBgx8B/zz6z5P7PZ49zk2hny7f
E7z7pmp9uez2cmzx8nF5+GNUFqoIVAueOM989ns9njsVDigcM/M5mefPZ7O8sDO3xyp6ZXPZ7PZ4
/sxs5xXqqDFQZns9ns8qM1Sl7m/hszP/Z7PZD/6K88zAVFqoiz2ez2eVDU85kY43j9VDWez2ez06
opMnM/k80+ez0x0Kg1w9GVnVCqpzOg6DoOgIccYmIMQ6AnQdB0HQdaogxExxbahOjN/WezYhnlyO
1UA57PZ7PHSqEfhQdqBM2joVBuez2ez05+mNmf5oZ89tzWePunid/n4HycWez2ezyoIVAudUCqgE
NJUJHhns9ns9PPmf6drRzWzPZ5UBZUH7PsVAHzns9ns8qETvUFCgYNvdOeGez2ez08+XnDz/P9ZT
PZ5UQqhzkQmKqI/vPZ7PZ4/VQUb5vMzM6opz2ez2emnnnbwqIwBz2ezyovVRPPQYxvqgo789ns9n
lSMfpvGQbvsfKoxz2ez2QrPmeeQqgzo/89ns9OqFQzqBQ3j9VBWez2ez2XVIJpdHRmZ589ns9zSf
8b9ZpUrnVnc9ns8dyoRyJhZdQGKktURZ7PZ7PKidUmKDo0v7Mzz57PZr8y4ztwBjKgk5jkOQ5Dk2
545DkOQ5Orq6uo5DkOQ5OqQ+urJSaXBwe570xp5KijJ5fZs2ZhUBbNmzZs2bNhxdfX1dXV1n9kjp
VBKoZ2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2
bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs
2bNmzZs2bNmzZ19fV1dXX19XX19XV1dfX1dfX1dXV19fV19fV1dXX19XX19XV1dfX1dfX1dXV19f
V19fV1dXX19XX19XV1dfX1KLZQ8W9X5ls3izXVASi2UWyi2UWyoBNiU4DyMCqoEUWyi2UWyi2PHF
445z1wigGVB6i2UWyi2UWxz/3Bwqg42zROFRbKLZRbKLY9cNNkV44E9FFsotlFsotj7xSgIVCOcx
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
REiFKIpRIhERIhERIhHOdE3n+9GVUD3jVUQfgqlVQUbPw6TB8f1/HDjt2HBN2djP/s7PHDHCYXZ2
dme8cz++fH3g+znJmn2dhpTdnYYvtk86Z+S7OxJwHlkvjFdh09A1MzBy9B0dnZpMQ6PjBmV2dnl5
ZrDKgagVAT9+fZ2dnZ2dnZ2ZU/6qAbs7OzswvZ2feCyK7w7Ozs7Ozs7M9x94Psb2dnZ2dgcf+2YP
s7Ozs7OzsyuBriuzs7Ozs7Ozs6FQj2KBLs7Ozs7OzszWGm47Pzs7Pfjs7MN++ZLvKTp439nZN2ZD
O57C5Qzm5k44ljskwXZ2HsoAMLxKeHZ2dnZ6b8QPZ2GwHKnYcn77V7ODwMjswp4HweHn49nZtPj+
7DBw+E/Q/mvs3ZunZ2Z0jMx+dNMxTiyhyuoBcFjf/SoCPMyjv7PvAmf2dCoK+nZ0aS9M77dm9hwy
/6x49gf3x2ZT57Oz519hz5POYuVnZ2bMoPZ2HCz809m5uYwejy4q3s7P7JdigE247MHq9TJ7DlUA
XZ2dnDcn0BD2dnZ2PqrVHQfE3j2dnZ2eWVZ4HGYHjkOzs7OzHnWYBuG2Hs++zs+/Nj1GSSL+7Ozs
7M72IOnSaRm+HZ2dnZ2TKAfZ8I7OzsjsN7j6yPCoGk7Ozs7OzsOwfnCfnZ2dnZ2Z/JntiWdHZ2fX
r2M6KGadX9Wfs7Ozs4/sHh86A6f7s7Ozs7NBz02N09nZ+cdmjyzGDx2YUAm3s7OzsxRlbTCxSgPw
uX7Ozs7Ozs1NQzb8c+nZ2BBgjvH2+J+zs7OzJ/wM5J69hz9nZ2dnZ2bkV6MVH7r7Oz+0jK04Mlp7
Ozs7MLL+fpn6uw8+zs7OzsS/6gPfo7OzsVDfgcOo5fyUyezs7Oz9wv7wqGTHOgHZ2dn2/ZSos3M8
+zs7OyWqBPPOfHZ2dnZljCOA4/PZ2dnZ2dm/o7PjTHYaUdnZ2Gkff0eCoK42fXZ2dnY3Ayjrp2dn
Z2c4D3+EcfnkZRzdnZ2dkmb7Ozs7Ozs7OyTT/9hQtyJNk8DG9cl2dnZhj27Ozs7Ozs7OzE4DGnRi
/Ls7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OxUF9G/O5TDi3s7Ozsw303H4TI+Tezs7OzVn6ZrNGFry
HZ2dnYDJc1fHdEnZ2dnZzrblR5MPO9nZ2dlc7/Akmz3Z2dnZgejdIEOKznZ2dnZ//+vYzw7Ozs7M
r2dnZ2XSR2dnZ2daQsu7bV3Z2dnYnse+bz2dnZ2XVl2/Z2dnZZcibt7Ozs7Ou+E132dnZ2W9vZ2d
nZb2dnZ2WF2R2dnZ2DfizuT9nZ2dnZ23m8v2dnZ2JHZ2dnZfF5vZHZ2dnY9t5Lw2dnZ2ffiqEOzs
7Ozs7Ozs7Ozs7Ozs7Ozs8NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYcfQoHNXPR0Yzd0eG
G9CvgedtJRO7w+8H9/uZ37xMrxsyPleJPTb9+j4IOKyckj5PaWPMLXhps3kjG+zAwRM/3wDU27op
0ZHETe/l5UyeBpqfKef7gCuvX+tLAt+Dg5MAGI+u35tSZs0a14SUm823i5Em8VeLq8FciRdXV4Qu
dZezkm9ivebkvKT1prwkos7Itv1NcyF3Z3366dJvFyIuaxIviy8pEQ9pQ6RcllkISLuL2o9ck3Jc
K572YiO2El11wL72UnLrssco/KsD0GJmuifPmFpympr53dHydGA8sthsGcdcRmDAPLH5H5DhTr4k
OfL463B/eZ0YLw/OiWe0VnZksqcWMuNcRJN126MVRJuS9kZTyz/j2W9tqy37wmMzQ3EnRC64Be9k
RfLpCa9gXs6tLku7Hcbz1ovCEhIz+JjZL7FdHVjTiSeu83sUbmG8dhjPPUPON8uy8WPebkXXd7Fe
y0km4OEkhpMt601iF15u5bPL5ys2bxT9H9247AReXWJC5xIoxUJGbzONwnucKwbYXZxvzgM2YXR0
bMB0NzPn9Yd+itP3CY76/8T7c/XOgVnxPXPqAM6PTKccbML0W3JebLq8J+1ZYmTpkyZ7Viy9hveY
stvak7wuuu+LjvZFiFiE95tSbzEJ7zcCReL2cKL2db2WrLkuRJvN4vFl4vN32p7Mt0Ya8h9vabi8
dE2Kxea8EuUin8XsHLDu65OOECkdiTcFqC/RfY81yIuS172RVk+Pxb/FJQXi3ooj16PzNdga7CvZ
t7Ijs7VmDMPJukJ9dcbv+Y9/7y9tOK+Mxgw//uDd6dD9HlkcGcWC5yeljej286TfnZlvLKZ7ywGQ
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
Y8xsFrwqoUofR0HF/+3woBq0NrAbujCmh5GedZ5ZPo2mF+e5hYLoNc61Q+fEled3id0+OyGNxfub
Zx4uEtt6vFt7rW9nYanyzs7Ozs7Ozs7MleG9j6Ozs7Ozs7Ozs7Ozs7Ozs7Pns9uzjs7Ozs7Oy8Xg
6+zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7H9Oy9s3Ne5kNbeezs7Ozs7Ozs7Ozs7Oz87OzAbt5hfWvIdn
Z2dmZ+8579Bh9E3Z2dnZ//GXlwvh2dn12dnxO399sp2dnZ2dnZ2ZX2yZhmr75Q9uzs7Ozs7OzsMU
2+TrNBB9dnZ2dnZ2dnYl6DgNPV2dnZb2dm097xHYoEbzebz2difs7LzebzeezsR2dl5vN5vPZ2Xn
s7LzebzeezsHs7LzebzeezsP7D4f9vJRe1gSqBDBdnZE3Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2d
nZ2dnZ2dnZ2dnZ2dmvV2dnr59nZ417OzRhuzsB2dlJOzsyPz2dnxp7Owb47Oyfs7Ozs7Ozs7Ozs7
Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozsfot7JJuxOvk7OwD9hLOzI9jFQbTsuS5OzsuTs7OzsuTs7
LkuTs7Lk7Ozs7Lk7Oy5Lk7Oy5OzsHsLo7Ozs7I7E3Z2bNVezs47Oxuld2dmDrJ2bG/vZckdF6uS5
Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy
5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkvcuS5Ozs7Oy5LkSlmvDwf70c9HZ2cF5dnZ2dnZ2dnZ2dn
Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dn
Z2dnZ2V21m7Ozs7Ozs7Oyo/H/2dnZ2dnZ2dkA8ezs7Ozs7OzswPl5bezs7Ozs7OzsYs6Ozs7Ozs7
Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsZ2dk/R2dlezs7Oz88Oxmr/lm7Ozs7KenZtH4B4dnZ2dlOzsHT
2dlOzs7OwPZ2ffZ2dnYzjs7Ox8v2dnM3n483m89nZ2dnZ2dloQdED2dnZ2R2cReez67Ozs7OzsvN
5vN57Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83ns7Ozs
7Ozs7Lzebzeezs7Ozs7OzsvN5vN57Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebzeezs7Ozs7OzsvN5v
N57Ozs7Ozs7Oy83m83ns7Ozs7Ozs7Lzebzeezs7OzsXLi7LzebzeV3Y3s6GdEdHYV5vN5vPYs6Oi
Zm0YvjsvN50ecmU1RYVtv4MvRY7Et82EvJn9LPgNaP7gMM1fzy/tZgXuT6vvzB2C4hLniv1kJ+zs
7OyA816Jt2hnR0dnZ2dhA1a5pwbaMHw7Ozs7OgZ/ynRk8sOP2/HZ2dnYD47Ozs7EdnZ2diOzs7Oy
9dnZ2diXs7Ozs7Ozs7Ozs7Oz4jgGiTXxULRq0Hj6atnuO4UZDBjXhLuKvQ97m6nr8/coa+P95/eB
0TT/d6+y1e9BKaPbd8LnZQOqevuL7/T+cuhnRrIEVfoifn6yG/n7Si0IeiOianQHoGoNU9fEDBfy
QUozx0fGTGXlEjB6EWIYl2Dp/b1JHQl0ePhsXSoKmx2eUgJdEnQynRAGemnf4g3wjZhFnLQo+ejy
mD9auZPPKYKSWT5bUpEfSOQYNC6peMR0T/dV9F1W3WnZP6bfzo8/0A9FC8KSR0dAai2r1bkHEq9A
ZmRx4bBl2z8sDXXXXx0Fx76ZZG7gg+3ySXX6adVFkadzuQzPs+Nk+E2RtoQXnmaynx8h4BX/0h+A
eH47IfoZWOjW0RoxxW1BRoHLiHbXoC310kWr5lHo4vdshLbbpyPhooQ18H2efnXnZNsmqTPAEnnz
vtXV6OkYb9VoHoLo6Ohy6BGbo/f5m3oZQly5vREodwP+F3R0dHR0F0dHRKv5dteb3H7POT3/ezs7
Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7L8rsDttB2dnZ2dnYRc8E
n7Ozs7GdnR9Sk7l2dnZ2dnZ2JezsR2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2D2dhDK
ufs7OwSWTTeeURea3qiGrkoo7Ozs5kR9Dx2dhSdlGkl7EdiXs7EvZeuxL2diW8I4mkm0XtYEwrEb
PqfBlW9suV7lq5LpjnoSpKW8Xp71F7sXqxK5XuRe2RsvD3uwL9CNDadBTeKUdqMEzTze5Js1/HPY
NX6OXm4r+ZPZ2dnZ2QEPPRPt1sfo7Ozs7Gg1+E2wG5gKenZ2dnZ0Ds/qdGVzJib/rs7OzsB9dnZ2
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
1VAaqgNVQGqoDVUBqqA1VAaqgNVQGqoDVUBqqA1VAaqgNVQGqoDVUBqqA1VAaqgNVQGqoDVUB+VU
BqqArdhVQEqoDhVQEqoChVQGqoCdVQElq0asdubm6I1bVtW1aIbm5ubojVtW1bVohubm5uiNW1bV
dW7bm6Ibm5o1bVtW1aIbm6G5u++ratq2ofy3XuWqRGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEaz
rMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs5Di11JhD7Dk1LXmOLLYH9qX/2
bMMbHEMbHFmz///2bMMbHEMbHFmz///2bMMbHEMbHFmz///2bMMbHEMbHFmz///2bMMbHEMbHFmz
///2bMMbHEMbHFmz///2bMMbHEMbHFmz///2bMMbHEMbHFmz///2bMMbHEMbHFmynds3rNmGNjiG
NjizZ7OMhZswxscQxscWbMTebLNmGNjiGNjizZS/dRs2YY2OIY2OLNlJq9+zZhjY4hjY4s2f//+z
ZhjY4hjY4s2f//+zZhjY4hjY4s2f//+zZ7Y2O62sbHqFmz///2bOpaAxsfeg2fWbP///Zs32BjIX
tGZW6zZ///7NnUGNjSvMbHqFmz///2bKTGx3YY2OLNn//pI2YY2PhrbGxnMGmqoFq1ahjY4hjY4t
WRCi1ZhjY4hjY4s2j/vX4Y2OIY2OL169ehjY4hjY4vXr16GNjiGNji9evXoY2OIY2OL169ehjY4h
jY4vXr16GNjiGNji9evXoY2OIY2OL169ehjY4hjY4vXr16GNjiGNji9evXoY2OIY2OL169ehjY4h
jY4vXr16GNjiGNji9evXoY2OIY2O7evXm1iYu+TGy9Xrt68xMiXbKwXr0ZirfSmVp/eV0pldZ3ss
GN7Y9Eu9ZTPMulCSffnz8/+7uSX00009zuj93O6udpndNNNMQp7+O5ez3lNNNNI5znuJdqbmDppp
pzCaaaaaaaaaaaaaaaaaaaaaaaa00008ksyay9npHxsYrtIf49jHec9/S+c+Xd7DvOHn4t30wIT7
PjGVJ63REySTocse89jz/PHkMetz/D99//klHBDrG6z3T0mfHxQKaFm6fsZsCP3cSz2unjjxz686
7CD/eHl01sB0j5Q6Q9Xhe7ydpOfMefNyIPm5ZxMmclVRj6NpCX9nvGFqVi65EvEIUr6qy/TDYnP8
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
1tuBkaMQDIIENGuafowgyCDaRIh46eQbbFzRrmv6sQIasQIWNW1bX9fuXNGsae22CNgNEMhVAZq2
v3LlzVlUBjKG1q1jX7gZFi423LlgNrRrDbcuEdG0+wG1csEG2wGiGRcbbDbYZdGsXCDaQDRDI0ax
cbSBAgGQQ27qYYAYurWNDDE1YMUMXVtWDFDF1YMQNkMbVgwv6tq2ratq2ratq2ratq2ratq2rMAa
ehateDp1bVg6Q6dWDZDZxqwdIdOrasHSHTq2rB0h06tqwdIdOrasHSHTq2rBzPq23HpZAwcep6uH
SHTq+rh0h06vq4dIIdOr6vGr6u0azLVn2ttGr6vq+r+taMGyGNp2n41fV9X1e9pMxrAcKOr6vqur
6vOhyGF9k1fVwwQwdX1cMH+thsaKwacx9Bg6vq4YIYOr6uGCYPENPSkCAYOr6uGCGDq+rhgtxAMP
V9XDBDB1fV/MqtVQE27aG2htoKqAlVAaqgJVQFtobaG2htoKqAlVAS1VASqgLbQ20NtDbQVUBKqA
lqqAVVAW2htobaG2gqoCVUBKqAlVAW2htobaG2gqoCVUBUQuNG2gUJqslVkqslVkqslVkqslVkqs
lVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqslVkqskgyqsl
VkhmmVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJV
ZKrJVZKrJVZKrJVZKrJ+QVZKrJNKrJVZJ/qslVk9OqyVWShlVkqsn+VWSqyUfKslVk5sKslVk1vV
WSqyelWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyVWSqyV
WSqyVWSqyVWSqyfgqsnP1WSowqyVWS8AKsn6rJIKsmSGWpqaplVkqslVkqsmZampqaplVkqslVkq
smZampqaplVkqslRLy1NStqaiZPqZmf/3DU1QTamr/iczJCXhqTvKslVk376rJVPZ2dTAAH/////
//////QqACV1AgAAvNiGMhH//////////////////////1k376rJVZN++qyVWTfvqslVk376rJVZ
N++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfv
qslVk376rJVZN++qyVWTfGno9/c3lVCOtNgfF9arJZmzKtVkqsld++rv31qslVk7cVZKrJXfvq79
9arJVZO3FWSqyV376u/fWqyVWTtxVkqsld++rv31qslVk7cVZKrJXfvq799arJVZO3FWSqyV376u
/fWqyVWTtxVkqsld++rv31qslVk7cVZKrJXfvq799arJVZO3FWSqyV376u/fWqyVWTZtaNZVZKrJ
Xfvq799arJVZNjzSqyVWSu/fV3761WSqyUztTcqyVWSu/fV3761WSqyT2+ulWSqyV376u/fWqyVW
Tf1EgtVkqsld++rv31qslVk7cVZKrJXfvq799arJVZO3FWSqyV376u/fWqyVWTtxVkqsnN++m237
+oqslVk7cVZKrJvX75rzRqmoKslVk7cVZKrJaW2+26+03TqslVk7cVZKrJ1C/fuajfvnVZKrJ24q
yVWTql++dd++tVkqslUhJVkrv34v34yHlqie2xtsKslVkrv31d++tVkglHABXfvq799alVk+Jgbb
GoNq799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXf
vq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr
1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahts
bbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfaa1DUNtjbY22N
tjUNQTamn7U0d6hqG2xtsbbG2xqGoU0tRDzTe3uoahtsbbE8yG85kBAecW8WJYtwL24NxIcYUj5c
JcgInHLhLuMcC3EEo4u7u9DmKjlzkg7u/+YqeeG43Lu7keHHdSA8Q5B3dxcnd3d3d3d3d3d3d3d3
d35cKfnUkOQ5FMcJjcb2t9XGIqKqBEHHyFwiBCcYFVDvzkHhEvEPEV+IIy/nkVDHykYxO8cX4vNR
uCEc5449+tzU7hyPDiARIOPny84uFcd4Q5EajgvkKhTxIuPfRQxkVO8p34UR5VQHIcb94kQuREdE
q9wB4kVNcX5Q8cD5h43VRw5Pw48t05EUPAhvwnjwIzD1y58ODkeXCuVDfG65ECJAyHOa4co5cJmo
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
V1IpMpEpEpEpGnosCW5SJSJSJRuioMKm5MpLRcRSZSJSJSJSJS5TZSVV029vKFKRKRKRqikULosy
qCkSkSkdFk1K3lJFN6JPZ2dTAAH///////////QqACV+AgAA96ry8RH/////////////////////
/+IpEpEpEpFu0XCUrzlIpEpEpHe+76Lqq+mUgUiUiUi0VVVe7boqiDdqKRKRKRKRaqj2KWnSKRKR
q5uqmVXFK6LZ0WIUqUoUoUoUpSqUpQpQpQpQpQpQpQpTReFVXOVSaLp0VRpVei6SiEDU1NXlKNTU
1NTU1NTVSKb63FMaLhampqampqampqampqampqampqampqampqampqampqampqampqampqampqam
pqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam
pqampqampqampqampqampqampqampqampqampqampqampqamopOrWypeVVu0lJlJlJlJtO9X8V3K
C0WSUmUmUmUntxtk0tui4aiKTKTKTKTk3t1Q9q7hSZSZSZSdCmUhh42tJSZSZSZSe1PRcFRW2aLk
KTKTKTKTl2ntQpUqBSZSZSZSdR09FQFoKOi4ikykykyk6osykykykykzKTKTKTKTspMpMpMpOy9l
JlJlJlJ+ZSZSZSZSeFJlJlJlJn5SZSZSZSd/5SZSZSZSYPykykykyk1wUmUmUmUmZSZSZSZSZYFJ
lJlJlJlJlJlJlJ9KTKTKTKTrUylCkykyk22nouPRemi9NF6aL00XpovTRemi9NF6aL00XpovTRem
i9NF6aL00XpovPRemi9NF6aL00XpovTRemi9NF6aL00XpovTRemi9NF6aL00XpovTRemi9NF6aL0
0XpovTRemi9NF6aL00XomnXTVUU1VBSJQBRdKrKsqnRYFTlI1fRzeoylG+Qbqtb6nkUqUgXKa0Xf
otkoqryk6qp1PApMpCqd8KZKXKJKDKTqqnVRRBQ7RVBS+FOeUXV1VlKaLZqdWr9F2m21VX0WKUBS
yk3VMpu3N/5VdWlA1PVNUdqhtKd0VQA19OaOqpmX/DvR3mXMGDAJAPDGfmj7P7P9CyV+jy7QpYls
UBIJg2N7XUVWUW4oKo6jqXkm5qk3KqKU6LRlS0KgKK0WC2oLeFWUapqUoAoUoVpqs7OpqgqKoj8W
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
ovApTRauioHNFQDFKaLtspQpQpQpQpQpQpQpQpQpQpQpQpQpQpRrqQo8pRrKIKUKUKIKIKU0VA5o
qByoSlCiCiClClCiCiClClCiCiClClCiCiClClCiCiClClCiAUozdKJqWpyjSjanqco0o2p6nKNR
lF1PU/cqep28ptWhuU031PU+ZU9T4UDUsp1Q3aLRKFyp6nzKnqfKmb1CmtFwqZU9TlI5U9T5xqqh
vqyp6n0Xfou+p6n0Xfou7RfE6q3qspJq0XfU9T6Lv0XfU9T6LvKW0VQSrVXW/Rd9T1Pou/Rd9T1P
ou+om7Rd1T1Pou/Rd1T1PGyiaJRJRBRJRJRJRJRBRJRJRBRJRBRJROFElElElE72ULosDMzMzMzM
zMzMzMzMzMzMzMzMzCiL0WVosqoP0WVosrRZWiytFlaLK0WVosrRZWiytFlaLK0WVosrRZWiytFl
aLK0WVosrRZWiytFlaLK0WVosrRZWiytFlaLK0WVosrRZWiytFlaLKp5osrRZRSO+iytFlN96LK0
WVNu0WVosopFu0WVosqqZ6LK0WUUnVeiytFlbNuiytFlVY36LK0WVmiytFlaLK0WVosrRZWiytFl
aLK0WVosrRZWiytFlaLK0WVosrRZWiytFlaLK0WVosrRZWiytFlaLK0WVosrRZWiytFlaLK0WVos
vRZf/osvRZe+iy9FlZX0WXossaLKlUtSdqmqapqWpalqWqapqmqalqWpalqmqapqmpalqWpV6pqm
qapupalqWpa1U1SdU1SjypalqWodI6pplBZhQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKU
LmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQoqKbRosi1CjmlsUqmTY
2NLS0tLY2NjY0tLS0tjY2NjS0tLS2NjY2NLS0tLY2NjY0tLS0tjY2NjS0tLS2NjY2NLS0tLY2NjY
0tLS0tjY2NjS0tLS2Nj79LrY2NLS0tLY2djSbmxsaWlpaWxs3p021sbGlpaWlsbO/2TY2NLS0tLY
2NrfNk9nZ1MAAf//////////9CoAJX8CAAAhQYmgEf//////////////////////xsaWlpaWxsbG
xpaWlpbGxsbGlpaWlsbGxsxpab60tPWxsbGxsoNNVT2Qe2NjY2UqLSUjVLVjY2NjZ1paZt7S002x
sbGwphpaX2lpbGyhbY0tMqLS0roNFlaLQUbGxpaWlpbGz2ym0tLS002z6U2lpaWmlSpUmlpaWmlS
pUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWmlSpUmlpa
WmlSpUmlpaWmlSpUmlpaWmlSpUmlpaWpWkqrFpaa6NqaVVVVWloBdoo0lY+jrckWz623wXh3v2Kw
/86wwr/FkyP4XvHLuXWR7IOFxFGWLvRgwRFYiYjsF4Xd/W7/wvsMyMGBJX/HHBbDyxEeJQx5nz2a
P/XglsAF3nouVl+cuAnzkLhwXjHaCtfrRsOeM+tBKIBf3u30P11hkIfAv/uQ/li4W58GT85Wrgsn
rsLDde43+Vk9dhTXwS5znOc5znOc5zl8ltLl3d3d3znOc5fOXXzPH5kLr/CtqS+pnrFqWfALwn37
FYfmTYYMvxh2Od+zxy7kydZHsrQg4XEYBHkUZd6LjBGUgKxExE4Lwy7v63fyFzhnYwYklfLxxwWw
8sRsZewx5nwehj/18hWACObz04isvLli4T5KFw4LxjtAw3iwtcOXn1h4ctk97t9D8YV7ycIZAvnu
Qezli4W58BmcYYAsnZWGHIXG/7WrsrDC+XzFZznOc5znOc5zn2c91Vd5973ve9nOc53Oc7u54w3e
qO7I2tHtRIKjqftQ1GUC+hfanZtFWqlBlH6LGKFqHaoplDVCUIUJBQoQoSo6iqOoihChChCg6cqh
KAKFKFKKKEKBKD6UIUJVHlCFCFCUG0oEoqZQhQhQhQjUUAUcUIUJ+iySk6G5QDXotDcoQoTbCgFA
UIUJLYoQoTZoKKlosDRYBQhQhQhQhQhQhQhQhQhRhQZRZRZRZRZRZQJRZRZRJQlT6LCKCKEKEKEK
EKEKEKEKDKFKFKKKEKAKEKEKEKEKEKFKEKAKMKGKEKEKEKEKEKEKEKEKE0WGUcUIUIUIUIUIUIUI
UIUIUZotQowoQoQoQoQoQoQoQoQoTRami0ihChChKBQhQlGapSJSCB4FCFCOFCFB7ertsUs05sUK
UIUBotUoQoQowoipSmlaJQhQhQhQjU11FSKEKEqgoXRYk2nlDRUA2ioBnG/RbJRcygN6qacKLKLq
uqCiyi1aanW+k2FFlF71UUWUW2VUUjvKqChyi6SuiyyiYeUhosCigqrEEiilKPwQbx4UC1ZMoHbr
1UIGvGyWFClB5hQdQ42VVoqgGkUo2kqlAlBZjWUHx06sxCUrz28prMq6qMQVY0SurKppY2SzEGU6
tqqr6tq0nMzkY5sUo3ZmZtOVRVaUhVNU5mY3FJaLsKfbatPMxAgYmJs3leZmedEpCrm+rMzMOqqs
q2mTmcm1Q4URR0WXOc55nGhqoDJznNWpW9qqLMnl4UhHdouykMzMpw2paL2KZpVVmZht+i56tbHT
zn4UrzELRJBVmZmVRTpU28pKq55mYTVrZ+czCk6rohrkgzMyqmzNFUAlJ1abZmZhNWQYrQZkrbux
oTzMxvqmrquKWq06pzMwnfb+ZmKcKShSq6qWzMzKqb6uq8oKqUFU5mIGI6tQVWxIMzDq5A2Vc31T
mZk6uKUKVbatJzM44dPKtKM5mZnGtW6rb9Fz1dmZlOmrVzZVpOZg2+dX1a3VD3ve0Fe973ve9RNS
BRpsNNCpQUoU9Sq6q6rquril6rquq6rquq6rqspAparikimCm6rquq6rquq6rquq6rquq6rquq6r
quq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rq
uq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rqu
q6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rquq6rqspCqkvO220tikCkCkCkNlWxS0CC
rCkCkCkCkKObqUGwpCiUgUgUgUhRulxSm2tBSBSBSBSHtirUjbKBSBSBSBSEqZSNDlOrikCkCkCk
OdpSlSp7FIFIFIFIT4gUP6oKQKQKQKQ6SUgUgUgUgdckpApApApA65lIFIFIFIGsZSBSBSBSETKQ
KQKQKQ0PKQKQKQKQJKQKQKQKQ0YUgUgUgUgSUgUgUgUgTEpApApApCuZSBSBSBSBJSBSBSBSBJSB
SBSBSGjCkCkCkCkEtJtKQKQKQnZQ2iwtFhaLC0WFosLRYWiwtFhaLC0WFosLRYWiwtFhaLC0WFos
LRYGiwdFhaLC0WFosLRYWiwtFhaLC0WFosLRYWiwtFhaLC0WFosLRYWiwtFhaLC0WFosLRYWiwtF
haLC0WFosJpaaZvTm2WoptVUzmre27VvR3trU5O/p770Ke9Bo24rVFNBM1crd7RU5Qb6dhurV9z3
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
0niy7JyykykqJQZSza2qlHVOUVZSJShSbdQqQo2oLn2lVtWUKgatFwVYhhouDRcBT+i4ELfJQoHZ
oolD1CUEUZV3Kqq6lVNVlJtNXlI1cUopsh3KZpVRSV33bylKoq/G1vKRqvKW7a370m4pGqW9rbav
pRZo/o6GM/lOFOFKVb5ThThStWlIlOFOFKTKcKc3Wq6jRUqmqSkarQSvarqvq9pzPpUykaE6v3pF
I1dV7fVKBvbe1XV7bSKA3pVdVNAo7ekUjvVDZdQVLSpFKVTxoUUKZKZquqwp/KdU1bVVC1Cmavq+
qKnuQKUplBlAN9VlI1fV4qzLq6qKvqlsbaRSdUU6VXXVTfV5SNOrvzKrqkpGrKqb6pFX1c2tvW/h
0CgCg6HlN6LioFBlB0KBQZQdAorRZeiwaBQTlChQoUKFChQoUKFChQqvRdXKFtdCg1tdDRZeiy6N
Bra6FBra6FBra6FBra6FBra6FBq+gGilSaWmlSaWmlSaWmlSeOlSmglJ9BOlSJpUjqlvqopVup1T
VZ0qRNKkcqSCoeoDpUqR0qRwQNyqlKkUGUHSpFB9UKU7OlykUHSpFBlB0qRQeVQUjviAoOlSKDKD
pUig1dyg6VIoMoKlSQVFLQqKojqKotGVFUVRVFoyoqiqKotGVFUR1FUWjKiqJQIPNLorAlq5sKZK
ZKSmUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUyUz
dlMlMjymSmeMhTJTOcKZKZUspkpm3imSmZICmSmVZFMlM3pFMlM4UyUyUyUyUyUyUyUyT2dnUwAB
///////////0KgAlgAIAANhfBVkR//////////////////////9TJTJTJTJTJTJTJTJTJTJTJTJT
JTJTJTJTJTJTJTJTJTJTJTJTJTJlMlM+ylMlMgpkpmuU0UyuUygKmt3zJnMyppU0qaVNOcyZzMqa
VNKmlTTnMmczKmlTSppU05znOuVN1BU0qaJznOGsKmlTUE84TzhPOE84TzhPOE84TzhPOE84TzhP
OE84TzhPOE84TzhPOE84TxsKfl3b0Ep7lK1bvvvOc57777znOe+++85znvvvvOc57777znOe+++8
5znvvvvOc57777znOe+++85znvvS7vvOc5775zbfec5z33QgDfec5z33GYN95znPffgG+85znvvv
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
znOc5znOc5znOc5znONhTBTBSFUUWlv8UKj22kpfafOPcoUZ0poBbRLOHcarKXpNu6rjQUBJpbqV
WVQ11M20W9uqqq2trZKVKSfnOFMUikimCmKsKSnUVV1XUX1qlaGio+KSuhtwBHJvbpcqOoOV+PUs
Vz5VA12Cw54y7rq9qkpxUpyrabjjZnJNJQClSNdWFMlK1Xk6DiGp9qnoZYmrUFQRZagqDFadOnUl
SVJUmzZVOymzZVOUqqq3vyqKg4GjZH7arVSDmyxdobqp3oNVRVC8y/3KvbWG67dp5Wa7RMbQ2vWp
wSU72W+3KVBtVbBbVK+UNuudbqomBS4ByoKgqCoF6VOnTqSpKkqShVqjQo2tZSs/wpOg1+FO1ZUr
TKDfV7XXFXhHWrBSmw1VWW38UW1rXqzqzDVFaqMtsuTw27Lu3XOqXGf1LPy1LrBTus0si+1QVBUF
QU6dOnUlSVJUjQ29U22qqragk39qMpZqko40tXNtuUu8vkZNW8+/xEopnLONlK1X2qaXXKhqKTTV
qCmUjUdQ1Q032DVUfJONzawq1A15KoqbeKdNh3rOaLCaLoQz+bW2IK87VSXXoVLVlKl7DSvOzwpV
q6wzqJRWqGUVBUFQVBTp06dSVJUlSbN5SG22xSKtQ1U3tFDBtUVD2ipK3NlEaktuZy6QbpV6/Gu6
Fxoz+atJ4W1tFiWc/guvZxqttpFLblN1T3GxxxWdFolU/KnaZZVZSk6spN1UNVFtqVSp0LgOoKgq
CoKdOnTqSpKkqTbtX7UNqpp1+1Y2FI78qRoXoVDJlQVTlXCoatpNzRs1VIM8pXtdVSWCV0bU5Syg
2bMDYkaG9sVt7YbPdlLrneuVVS6pckZyaopqgqCoKgp06dOpKkqSpFKp+g0KU2i51Y3DKpCiu3K1
UtUqDSjpVQ1cyqu/DLelu33vl7K8ofWb8UDjaGydrU7AHOV3u9l1x61Iw3+dRznv87uFtF3dQVBU
FQU6dOnUlSVJUjQ2/tts2FI1FVTWUo0yaJVHtyUmVuBeXK9eole5kqzXdeymm2rKeVnKkaraqsRM
ZTAqei20Bzeo2kRPZ2dTAAH///////////QqACWEAgAAddOAhhH//////////////////////7lV
771JQh5QLdVHG2nhRlHkrwKe3X/FamqmlSxW3vnuUo0zqTalVV3UFQNbXTp06dSVJUlSUZ70dtik
dxNpaO8atyh+Bpz6EmG9/ujUzXanFuQaBQqcpNWm11CUrUNQtMqRSdANja3U+9pVTVdJ6k0dFFrq
Fra1VWxpaas5xBGh3k8oHUFQVBUFOnTp1JUlSVJLbbbpQdsezXUijGpVf1a0Yt7X3b2WoKtKQqJl
ZeNDaq1fWrXdW1ZWqmqa9cZNSuUlUFQFIVHTbakrMLRW2QMNforqUq9eoJ41lIVHUhSVai206nrM
NPjQw1BUFQVBTp06dSVJUlSbbbUM7UFCfLQNbWqgk0tDc3bcVuWK7dtrvZvqhrp9U3nQaFKUECC3
nKStP6fIqZnNs9lbVFKbbRooN96MMk8glKlQQd335zs9s9TMoKNtPKNFtEMqC+v4i2QTlL22vvlB
TeoKgqCoKdOnTqSpKkqSh3bbYVIKXaprulA3+zYG6/a6gmBJ7nQUAk5s1VNzyl/YaibWXMz7bB7D
pcbOhsq6oCkqkbagQN5QrDWaKzDTr11K9eqFOTqApLKv+hu29rBtrUWGvSrsNSSad66lfepG+pt6
gqCoKgp06dOpKkqSpNtttmtqlU9RNUqAr9lKqae/eVbFvvgU2UJFQFIR9RRtbaNHffIVG2bIHpSk
gQT7zm0+jKg/MxRRtbW9uhEpGo6e0smrKSBB3s3v6O5tzmd7n97UlPINFFXeUkCB6WyDo2n3vOZi
in5jWUhVVINrbRob70KGXLs57Nam2+dQZsMaykB7Vy6FQVB2oKgplFCnT3a9re7VyDRYhQbYChEF
NvmU4vVhTN1E9yhVxTuixKkqSpKkqWTcUEUG1Uu95VNHqtR6LGKW5otdq7md4rTz3+1S3Z1Bouko
fRVAe+0+8KFKMaeVHosYoxqxl4i4yj0QuU+YLtENq/8bqoqnJUWto8TnvSu/3qim31JUlSVJNBRK
e7Y3lNTepFbvdem41NUqJSdDOIqKDnOUOHX71VXdWn98aSgqgnU3Msp2lvSu+1gUhvVui/6v/isq
KmTy2/tNq0WKg3q1FGpKkqSpPqKdw7LZRXn4qUQrNVYb1RdUrOtdOpOdKTqSqVaHGjHucl1VXveq
qqqlG6LAKOVVqH96pqyrSjNFglHVFCqSntFw6LjqSpKkqSe6vJKyxvaatqL8ylUCATk0tKu45jaU
lR7OVzqnaaATUKe5UinJ7Wpk+qqzqBQoIpWmpmi4aiKB2mrbTSqJTMWbapbapVe5UjTfMxRtqTIS
QKqyKQc2bFClWptzlTO71FOSBoa1akez5ipOtcpSl1VXveqq7zVVoV+CuoLYbqSpKkqSXJS6qr3u
9JWe6qtS1Ls1Rm1aLgDd/lMFOhpxC18o3QKQ0XPQ2qXa6gpzbG1vp0tlaiauIGuVGoca6kqSpKkl
uUiUkq37zU23333qSpKgaGtHOeXuBEOQ+tEcyr6uqvfl9znVd2Ron0pspGnTqPOz7Ql37EYTYe3J
lZY16Ardnd5izlYoChKvm+ld5OeH+l4j6D+cUUVp01My7/791xwD/yVJWlKXOZKa6P3Zb/8tu5zn
e4y/X+HPw1rHhwXY3fDy1/z0HKClOnTUvMv/QOuD/lSpKylLkhNBgQXnoO4P/3ed+VBB3YdzLF/W
/gzHLF3FacWEa7xnECBBOOytOhy87Oh3bw73vypbT4J2gwIIcz0HcQZzMtycEGIM9A47XhYvm3Jc
QIM9AgxBne9lupug2YcW7mZK0Gfzf5DloFft2vjIp1BiCUp/LH/VUU2VVlLbxyUt+SV3nLfMIodl
l6hBHQnWc5LkpUKCrZToZl3/37rjgH/m1OlSltyR9lv8eS23z9tu5zne4y/XX+HPxhWWHzDgvg3f
Dy1DOclyhQbKdOhzMv/91wZ+1KkrKUuSE0GBBzvoJ4Oc5tzvf2oIO7DuZYv63/wZjli1ritOLCNd
6mcltL5vbUmyhy87Oj3bw73uSpc2nIT4gwIPhzPQTwXy7ly3ZwQYgz0DjteF2OT25PaSBBmIEGIM
73st1N9mG1u3dzlxBmc3zYStAr9u1+sinUGIJS3+XUH0lFFFVdttvCCUt+SVVnJXlrZLe76ughzb
PUZ1Rn35k9VU5qpWTizpVcqpUqp7VTmqm9V+pjqqw1NVNbqpKqsVU66c8VVMKrnPFVTWqkw11UmN
0FVOarBzde5qrmGUVWRZeVU6qpUdVygPQdL6c8TWdFrV4Y/Q2I+qr56Cqn1VK9VKFVPKF1VYcur6
qR6qY1U1M+eK6Cq9Vfqpd5qr9VIb7OKqzzdjrpduqntVm6igNVVBqv1VYqqXb58oMiqpCqs1U4dX
VUk89VPKqTKsquVUyqpAqyq3VTWqk3pGZ6Oeqkqq1HVTSqlqKKqxkdVIvPHVTmqlCgqyq9V1TVco
KBVWKqf1NVMMqsxVUqVUrLnq+q1VS3V1VItVLlWVZV1V2qmNVOT5VTupqpZqppccVVP6rFVI1XVU
wqztUVNX1afWR1bFVTSqmHWqzVSFzuqnWZVS9VSJVTCqkCq/Vfqpaq6q9VTGqlfnxc1V2q/VTSqn
VzVxVU4qpUqv1NVKHQ/aqndTHVcq6gVBVZiyp56qW6qeVU2qph05ubmqpjVaNHVTyqmcVVJVVNMj
qtR1Uh1NTVZFBVvOudVUyoN9KqdVU6qpS5qrpqqX6qUcqptVSPVSDVTqKq50qp1VS/VTaqleqnt1
NTV9W1Ul1WKirqqVon2N2PGd8+PKr1XXVTCqkGq7VZju856qcxXU1Ur1Ur1UoGq2q7QUBjVW6rdX
89Vyr350qvThrs3bV2kr1q7tJXau0ldq7SV2rtJXau0ldq7SV2rtJXau0ldrnq6rqr1XVFW28qKr
0eVFV2M0VS+nPGeqnlVO6u3Hfc8eZ0dXZQVFVjnqv1HMqsNlViqmNBFPc8dX1XOfnnOkV6Su1V0d
V6rquoKr0dVo56reb1VTmratqu3VYqv9KqcVWKCi3V1WVbVzquVN3qqndVPI6r1VOI6m3Urayrpz
nyS7oMXOezVW6qYZaqs1Xz1XaqY1bzRVYqDmqplzVUyoM7e2ep5+fn7Y26qaVU0qppVTSq1U1dVa
qs1Wo336ZzLRtb56vqM5zxXQc/NQXVlX1PPzVWKrlTur6rhneVOVN1ZFlArzL9dBURG5qtiqsb7X
3aygTw1Re44qNvsbn5+fn5jGNVTSqmlVNKqaVWeeq1VZqtcx8oNdoqirn25lVlV2q1jPVdqs7qyc
qvVWrijq+exdrvtqPRzVFVMM12qpi9Zsy0qDvQ212qzmUe9bMeq5VvPz8/OYxjVU0qppVTSqmlVm
q3VlVqq1Vaq+q5VYi73e6rkUWUdRV9XVGc9X82defvdXVdVfqvVXo7oIz5na6nvlVmKr6v61Wjc2
Gqt1WVmqCpquTjdXc+VFRzc9V6qmNTp1UxeUEV1XOZdaPrVajqNm6Gqsmqt1PNHqOOqndVOYor3U
xx1dNc/Pz85jGNVTSqmlVNKqaVWquqvVWqrVVqq9HlVs+7q3m65HVe5tVbVTigqsVU4qu1GRm7c8
W6sq66m4+kZ6uqp3VTyqndVO1Uu+fdAfMj3V2K+joMq6g51mVW6tqOfmqKr11X6rKVWRUBqsWVWI
qCqmPNVTLc9z8/PzmMY1VNKqaVU0qppVaPVdqtVWarVXLS5l0uq7VtRV9xc6q7m6VWqrsdX1ZFV1
X3HHFZzmy7Mu7Mo8u+bmqsVW6ti28WKg7dOnWKgqcS5qv5+fn5zGMaqmlVNKqaVU0qst1WarNVrp
Vh7oKDO3bmw9AZVFXVZUR0FTVvdc1V51WEY/Sp3nRt0DOjmoNxa3VYqOlVrW9JZ3aoG3QUFBzVGH
tx6uK6u7bNz8/PzmMY1VNKqaVU0qppVZqpn7VaqtVWueq9VaN0upUWVbz1XarFBdV6rNVN1fVeq+
r6qcVL57WXdSaq3lV2puqmFW8yqpjURUHbrlVypo7dV29mqsGdVOKqZ1c6qZtmNQVXMWpjKqZR44
sqtKqmXPh+naqndVOVFlVyOOr+nTn5+fnMYxqqaVU0qppVTSqyY1Vmq1Vaqu0HPVTirebvdXXQR6
Meq8k4tYepqsbzqbrcdTV57jqXVvPU82Rc2Hq6pjoIqrLq+I9Wc1BVYqKtqs1FW1WKir6vURqrrq
uxUe+bn5+fnMYxqqaVU0qppVTSq1VaqtVWu3Wq+qqc1FVMqrpqjdWRLKCgoO1X1d2quVf1vnvVDU
1WKrT71WKuqeaq/VaqtVU435V9VzNc1X1Xasqp7VTGq1VTqqmVV+qnFVNNVfVaqtVfrOarJjdVMa
rtX89VupqsVU95+fn5zGMaqmlVNKqaVU0qtVWqrVVnr0iq6r6DI6rlWVWKCr8j5oosWXlmqc7RXF
Hz8/Q7P1uo5jm5uZRRnjiqaDm5qmg7UNBHHdAbmqI4zPKvqyrOaKq5VpnU1NW5QdqGPm5uaOgvnM
agnHU81DzVZV/Q0UVXmypzKjOfn5+cxjGqppVTSqmlVNKrO6rVVqq1qqmO7iqKrfRuqmWPnWVcar
OfW8fPqcuKq3VaWqru6qZVUyfN03FHVm6rkUcw7jqubq/XlWVXaqYVUxqtRVUxqp7VTSqnNnVVqr
/Ndqh7PVTqqmNVhVXaqY1U9qppQTSqv1U4qtVWT1WM5+fn5zGMaqmlVNKqaVU0qtVWqrVVqqxVsd
V6ox0FRnPVpqrlV2KJVZzx2siiFX5Qxx0FAY0fO+ar6rdVOsqyrKrlVyratq6poMqpjVfqtVfQ9u
bmjjoKA2Lmq+q1jjjqyrKrlVyratyqnVVMar9VrtQVNTzc3Xeu3SiqKvcRo46ioq+r8qt1U5qpjV
foMq2ramp5uaOOh7VWavyKgnKCgMaOOgoMvrUVU4qpjkZjmNzdqrtV3tQVX6rNVzJyhqX1i5+d8/
OarOhlQVUpVXOlVmqnNVL91X+eRVfVTjmyqkCqm9VMuer4+eqxVTW6qaVU0qppVTQ9xVfV5ok9nq
u1Urnq6rqmqlRHqV3xOqxE43Vdis9VIVVP6sjjqpjVSKY9VINVOueqxV1VM6rlR01a21vs1QdNrq
lzGpnVZqpjVTHKvqp9VShVSgeqnuNmqb3lQbmqppVTSqmlVNI44qqb4771U+PQHPVcXQ9BV1Fz5h
6rRllWVfU1UsVUsVE0rvm5qqRj3o1BdX1U0jqp136drqKvNHmLSjqpjVlVw1WZNxGTwR8yqznqp1
VVA1VTiqmlVNKqaVU0oYj1f1w9A2ahPz1XnjOqrFQY54+arzm69XzKrTGNzxc1VLFVK9VLFVLF83
Nd3zcxz1U9qp9VT056v1lRVlW1U0qpvVTWrKr1VK1VLFVLFVNKqaVU0qppnXLugx9qCqlCOh5+ar
MqVQYfnZ2ai5qqYGNU3h6Cred1YroKBtHidBk9nU2UB6uk5qDEaPnqu89BQGd1XKrl8/NVYqygOb
DVbVlm5+ZVXTc546CLnqpyo3RG56qYcxzUTqpnF1yOz1PTnobx1PNVSxVSxVSxVSxfNzXd83NdnP
GtGvFVTSqmlVNKqaVUsVUsVUsVUsXzc13dRzXZz1WKrGK7oKrPa2bVBFQVCjq+LmqplV9VPKqZ1W
KrtVyOq8c2HqpzUx0F1Zz3FU3FUXzVU0qppVTSqmlVLFVKdVOqqdXVsTOe7u6qaVU0qphVfqMS7d
0tyLXTtkKqd1U8qvmPbIHt3K7uqnVgi6qf1Um81RVvbOyfWYpL13maC5rJw83a1RTkRpid10qqoV
U09nZ1MAAf//////////9CoAJYUCAACf4HRHEf//////////////////////JayCxCmgszM06Nja
1pPLoefnj79sNQJZHzc3NHHzczbqDnvXpzn12PbffMKZZznjoznqcidnVAdHvFUG3e/b1vc4bKM/
PFucdnPvtZuj13Oc58qdc/Pz9qHMSWKPm5uaOOo5m3UWc8xo5zzEzZ7oOxsWRHV8/iPHzR67SRG3
znOc8d+Hl5zmxs6yPI+iyLO225zc5rUWWeMzbfTp7t5t+M5znyp685o4juktYo+Y7q+roqieq91B
+3Tms8x0Pc52MsiOrj2r5+aPq98xnznOc4cG75upbUWuap54r59Nt30iNLIjGjPnNzR1NWVfVnNz
88fNzR3FmH5zO6h2ft16Yc5zvOWXnNV989RQG57fseVFvn56irKsqbvmqyr6uq6rKs5+eaN25zdr
bbuKKI2oqsqyrquqyrOfn2ahu9ZFU9jnOeF5fbZunnNz85Gzwu3J9FHDLVDzxx0HYxqDFnPzc3Nz
8/NzNurDnPr05z67HtugzPhr2Y0R6O3zVdkTOdI6OfFUGvft625wxqM9TFtuznbs3R67mMY0VXaj
54+1DhsSxc/Nzc3Pz1ZzNurDnPMaOc81NnPdB2NiNEdXzzGHjqI9OTmM+cxjGPbudi5zmxs6znNz
tZFm+225zc5rUWWeMzbfTp7t5t+MxjGNU9Y+Y/Md0lrFz8x7quVfFUT1XurD9lzWeY6Huc7GRojq
+favn5o+r3zGfOYxjJw27qOpbUWuarqmK6nVtu+nMaWZRjRnNzc0dTVtX1bzc9THUc0dxZkdTE7q
HZ+9B0MYxjTGcjHzmquXU1ZQGqbtc5qsO6mpqyrKtqbuoq2r6vq+rKs5+eaN2qTR9rbd3FFzG1FV
lWVfV9WVZz8+zUN3rIqnsYxjQyzdUfv7U1ZUNfDGi3ceYdUJqvqyrDXfNlRV54+9AY8SoKqYGioI
j1NWZUVXuerKnLaqYsoKrFXVbQc9RvnFTUR89VO4nVYq2goOaKeVBHe7iqsR89TUg6oGapq88UVD
QUFBQRx89VmK3FmVHNQVcZCpt88VAc1BZqg9WVY6nnXPVTTDK6Dnis1VMsoKtqsVNRz1ZVTIZ3oK
r2G5zsWeg5uaoqFd5Q5V9W8x+d0Iq6q5QUFXHj56C8oLPzH58oNdTUFBzCOoPV1Viq/V56qe83NV
Yqt1U6qu1U7oOaKEUdXVUg1Upc6mo6Chuq1V4quLnqw3MbnqvVU4oKrPcHyMGju6CqntVrnq+qxz
HoDh1XKCrrznoDRRVU5q+6rfRCgqDUCq2+a6A90BqEVN1aZiqmdVOaqYVUwqpj05xV9VMarlVjqe
qxVTCrquqpg6tqplVTyKKgg6qZ81VMnVSnVTirKiqnB1Q1ZYuq1FzHqp7VSDVlV26qTKtqpWqpfN
QdDdqqd89BVZqt1XuLzVXQtRHj5qsoONdVAIFWwPVYq6rKqcmurYueN2c1X9Dz1WVeagoOuVBt6u
cqplU1dVZiP2q/sqrlVqrqqcVUwq5VFVwZnKPj1ZyquFj9atqucxzc3PUxGoKA8dBz1FA7qxH60D
ugoHQVOUDuZ56BUFBUGquVXKmh6vXW8PHEqigijiqu1U4NzVNBVTYYOY8dSPwoYZ7Ocar6tCFW1N
Wc9VMcNV9X5dX8yq3nqKCI0dViq5UVNWxVXeluq1VdzKvPVYyrKrq3fNu7NFHUZFUVfFzc9V3Rzc
5u8VW1ddBVp285eLj9b7DdBUVPNV1W1Yqg5+arD89FU1OUHSgxXQcyw6qZ50Ga+Z0zuz83brV19a
CgN25zUHlDVJ05jqFXc1XRVUxjuLndX5zVeoldWR6mIqnHQUDqyPEpqYqplU1bFferzXVaoKvqtx
1FTUx5V9WXrdW85quqL5qviqse0EUa57quW3Zoo3UH6xZ0id0Bouc9VOI6CrapatPxKg/NV9VOai
rr54qt5jRnoLcZzdKu56BVB6ieq43Vd769XQZUZGa9b55t0E5VTKqxV1TUVfVcNl0Hc8VX1fQdjq
KPKr9V3mqpxV1Vqq3V1X1CqRVTWgqljMMFWVNVMKuqDUHPV9XxUFQ6CguramqxHUVbH5biPU1EV7
uNWzc189Wc0XPQRc8nZYfrFz67xVdvI8oHV3SgVUmqnHrtHVZPFVdqs8+c1Rzmjqzmq6q5z1XKtN
Vdq7HHaw9VxWY8UeZVTg9TurueKgR86HNEft1ug7UEVWRVUxUVTiP2x3VkVUtR2hV465VtWVPNQc
5qk0RqCooKB0F3QUFTQZioKGr+rvVBVYyI8TFWVXIqipq3pl1B2eoV/1LQCgu6rec9Rl1FBzWfnN
NVXLPd9PKDniji7c56pHFzobfNQdasq+Kp5qqd3VaXfmjx5VtV6ro41dXVWufmq+q1VdqplV9X80
VWVNW3VYquVfVsdxVW+arKCpijiq+rqvyojNVlVyraqcxR5nNcVX1Vhd4k3nTqZVXqvqarzztVh6
Hbi6nu6rVVqo7UHSgqv1U2qpzFQUFBRdZm6jVBQUHaq/VTaqnNBRUEXO6CgoKp2aqxceZQVdUVDy
q5V9XcxzVOc1BkUVVrI6mrKrlXH6x1dV9RUT7WUNBVYqyq5nWq5QvnoFrmqphV9W1ZVTiqzV+44q
rtBcVDQXlRV1A4oqHSj5qvVBV1W1U4q3KrNV2qmFBdVnMzKCKoqaCrosqTVMVUnTl2q5xvmck4jV
F5VlRVc6qgNVZPhsjoMm3QUOHquVXDaNlnoKCgqzVTVTOioKDXPmqCgWGoL53QUVBQVUzoKDVAap
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
W9XVnehw9VMKqQDVZVTWojiNFz+ZQVfVTWKq/QVU05qqcVUgVbH07VZVlVyqnFV5ZVY56ujqsVUp
Veer6sqKqcc9VO6rp6vqw1VuqnZ8q+qmlVP+8VCeNxXz1XKtoauoD1U3qvVXaCqnFVOKqZVU2qp/
VTyqxVTR9TVa6CrKsfNV9X1FXKgqpxdVyI9WVU1syjq1OqmlVMaCKq86rlDV8Xeoqw9VPav1EqiK
qzVfNzVXjcx+lV3nqyqnZulWVGNZVmuY+Xjaq3nq6oqsVf3oIqqdVU5q+q7U0BqC6sqasjoKqYVf
VtV66rdVNqrNVLVBV1V91XqCqmVGeqnXVq42j9dz10K5siUVQaJozjTyg1uO1hpDM5uh71E10oL2
uftEah6LKqYXU1U0H33x03Aoiemme3ZJ9LN37XMWROdLRO3nj1F0pf4t9uBObRdrxH/jHpu8y8a7
EGWnc0R4FHfa15nRK99vc6TFo2ibXn2+27RV2Q3FwK8WTS6Funbpfi/hL7p3tSl8dOnnzpT+67TF
30+YnnnSjycwpu+nWV1l8I38y52vm3lvFqTf1bnOftQp3b6XF03Z5Cd+TOZ9NJvS+3O+5Wpou6y6
Dpfbm8j0bqroLvpUboItX2215t+liJ9Tfbsk+hzPtcwcieM6WuBCt5t65ulL/B324E5s2s8L2vEd
Y9N+XmXjXYg4vZ3Ne8Cjvta1nRK327r3Okwe1HFrgQ1uS+3bdqmZyG4vPFl6VH0Kvt0vxfwkk72p
Xj+s3zoV1pzF30kzHeb6Go3k5hTd9OtG21sieXLrm2zdLeLUm/q3Oc/ahTMe30PF07WeQifyZzPp
pN9F5c77lb7zd1hroOt9qiYj0agoMugoLvrUboMcSzatLvUROgPVbq/KsNVTWKI+b5zVU2NlSjxm
qp9QZUVUwq6q5QVWN1W3VTjnuq1zurarPc+VMVBFVYi60B6ujsyznvM5137xHs6PlBVY2egPGc0V
9o4ry8VRUWm+BHM6CpNV7qsUHNVbq01RUc3MfmMfndTQRnqp+ubmoKrdVIVQaoqO0VAqrlVNXRc9
BVaugi56uqsR5dXxzVXVEWVWearejq01VMFfAmI1A6rvPVZquVXMqKqYVU4dXYaqzUc9Vi6io69K
sqt0FXVWqmI1VMavoaqdVUp81xmqyrLqKChq+ravqs0HOj1ZVSvVcyrI1QUFW89VmqzV1V+q9Vaq
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
dVMKqZHoKvq+rqrGOqmNVPavqp9VTnKt56mKraqYdetTHzrnuq3HVdqt1FA8qtVZVdqp3Vcq3nqp
xU1WV4eramqxHQVdHVcquYao5qqYVUz1V0a54qiOqnB6CrIuWKpdTUVWD89VMY4j1WaBVX6CgolU
xxPDKPmjqtc56rtVOKCLO0Rj1WscWHjqpzQbqs5lVMKtqtGyqkKqnFXVFVOOe8NzUFW1W6qZ0F81
81BV0eVXOar44qrB6rvNzVWOaqmNVznqpxVTiOrGuadqtLmoGaOq7Ve57oFVuRVUwqsUF8+GoOeq
8444lUGoIojUB6rdXVU4q1CqmFVP7qydfSg0agOb7QHiqs1Uwq9O0c3kVHdxR88dAYx1UxGqtp9Y
sRzztBQVbUNUHRuzLWK5N1eW70FQbKCgoDVXI86UmUhpfl3M9MjnL7JJx3URNx0FA6DRSgt0bW5h
W/tN4t/G/UF8Bk6Yq+/TfWV9Np5MY03W+U31STi398ympXTduxpb12+fWdP5rtI7o9KQJKmV0rs3
Ttv2jo+nYdr/LXfx782Ul3pSev260tB0u86UZSkpZqyCvpI5emukixUdH1bzcwjv7TeLcrfqBJAr
syshu+/Xt260ktG+m08mMvG63ym+qScxLa+zGU9NSum0uxpb12+fWdp/NLtI7o9KQJKmy/jsz6Px
b3dHrp2zztf5a7+ae/NlJVrGpL+zne/bUu6Dpd50o6WklmrIK11kcvTt07J/XFzVUzqpvugqpnVt
xc1X1XLqtVUxqt1U15usfNU1U1qprlVNaqax1fQnqprVTWqmtVm6rvPVlVM6qa1Uzqpq6qaVfVTW
qmsctVNaqa3UczqprVTWqmtVi6qbVUxqprVTWq1U0NVOKqbVUg1U4qprVTWhqtexVWZKqa1U1qqy
1VZKqYVUwq6q2ahqpjVTGqmtVNaqa1U1qprVTWqmtVNatqpAqpIqpAqptVTaqm1VNqqQaqbVU2qp
lVbqpvVTCqm1VNaqa1U1qprVTWqmtVNarNVM6qa1UzqprVTaqmtVNaqa1U1qprVTOq1VTaqmVVNK
qa1U1qprVTWqmtVNaqa1W6qZVUwqplVTWqmtVNaqa1U1qprVTWqmtW1UyqKqZVU1qprVTWqmtVNa
qa1U1qphVTCrKtqprVTWqmtVOKqa1U1qpy6qbVU2dVNaqa1U1q14aSq/F7VTWqmtWVU/qprVTWqn
VVPKsqp4t1U1qprVTWqmvNzTlVNaqax1UzoO55i6qd1U7PV1VMnV89HV3tVMqqZc8dVM6qZW89iu
6qZVUzcdVMqqZHPVjqvR1W8u6uWVU8qpDquo6Zqruc2c1p4qrdW1N1Waqf1U0qppQ3HUXVb56mre
eqmmVXJ2Kq1MGqp3zZFVZ2sqY4jVXaqc856uquVXMiqt1ZVazXNz1McdDV9VypjquTiRz1U8qp7V
YNU1J4+eq5VcjqpjMVWKqYVVQ0bKsy6tqum5vMqtz1WHNVlVg1AqrNxnyq5z5VamJ2Laiqsnivnq
+OKq5z5Vbqsmqsx3U1FWO6rmKqnNVKHOzVaeOpqaqcVXOd1U5qpxVVnqpxdTHfOepquVWquiquqq
5VaqpoqqZ1WHUnj3V1V2I1VzI/amqkqoyqmN5V1VLlVKVV7nqY6u56rmOoqKqUaqfVX6rtXVX0Ze
Or6qVPObKrVRVlWVZURVZVlWVZVlWVZVlQao5jGqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqy
rKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyr
KsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrK
sqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKqY1Wnz3UR1UxqpjVTGqmMZqrMZzHPVTGqmNV
MaqY8/sUfPzdKmqmNVMaqY1Ux55mKpMueqmNVMaqY1UxqyrKnm56qY1UxqpjVTGp5j1UxqpjVTGq
mN7iiijqpjVTGqmNVMefyrj3HVTGqmNVMaqYuqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVM
aqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1Uxqp
jVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMYqqY1Uxqpi6zqampqampqampqampqampq
amrqmpqampqampqampqampqampqampqampqampqampjfPeTdvmTubmnzR2rqbeW6mO7ajt3G1bcX
NMR3GnV1X1fnq9drHG+eqypbqsGqbyzc1Tz5z1dmGPFHeVWefnXPGueVZzmq+853mVd256sxRLO2
ePMypyrauqd81XTimauqY6rGWeq/Vei852zNuq7FzWbVV189RGdGyqw5jxUas5su47io45uotY5n
nnVRr11FWXLMZs/nNfmZ5VZqKnzKrlVyq5U1PPU1XKrmUZ3EqM6mFMXVmUOTDmpj3Oc7qMqar/mR
xVWIz5zm55k0fPFzc/PUm54jc9DVlWVdzc8eVHPFjc7FFzHPzxxPnjvnyq7V+qjnq6q3VtVnnj8n
Kr2cxvXlWVB+ez3URHqY6rmRXjqphV1V7FMRvnjm8qLjjjqsxWonavnPhz85ze3juO+nNz8/PFJa
tNo3PHz1ZVkUV3zc9THlXxxXFuf9xJxRH56nyO7j98uOrue6r020dGj5z8/h6hRc+dKuj8txqrKu
q7dW0OL2pjqtc0XtDU1X4queNurquqauc6OeLmjnK3arpyeVTV0WGjv2Yw11HPHFkWVXedXUZQXH
VYRsOfDnw9WVZuZ8NVddWRRxq6Hm8qccxcV2aodR5fPz8/Pd8/h1VePVt5q7NqrsMruh98qXkdVx
5FbUfM/L8V5lTdXdneKM2R52qc8q55mOpNVYnbqXV0xzx3hzxGyYquZMZn2rqTzpk/UR1FT5Zoqr
jnnccWeS89V6o5ubm56uj54qs54j3bOYzt1F1bVtTU8/NU1U4Nzc5oz82XFzc/rwxo6rtTVaq09X
1XarVWzk5VeqpxzRZVTI9XHu6iLLs0xacs7URqPmWXVZ5rufSeWvWqLxNp3ePG8o7tucV6S21Rt3
eN48o7bxtL2/Jx+XfPkXNFVZqvVXKrccV+xRYjxHyoqplVTmPmqt83lTzW7qYo4vfVz1OGq+KM5j
GjNVeNdVwxzmMbHHFUrnMdGMY8cVmjqumOYzqarvNVcq4yqcttVXo48MaqyfmqJizc0TmzVZUG88
qFntuiq28iqMqw65sM7zEqPM9tUeZd1WqhtKjSb5old5mHTujxJet+4arW1lWTOVX6qYz79qs1Ec
VRHzmvKti6x5V0VQ/GzHiOaI5jN3rDRxJmOZbtsxo4jHiquGbsxqk0R2lmttxGOaKN0O5auy2Yxz
GPHEnhr1uzYY8cRjmibjiMc5T2dnUwAB///////////0KgAliQIAAJbxfHkR////////////////
//////+ypqyqzdC9rKrsXWzmiqvmM2zc/NzRx81VnzzzmqyraqY1WKiq1FVtVNLq+qmdVM8qphVv
Nz1Uw5sqtVWKiqmVWGqsrObDRRVU5qplVaq2ratqKiqmFRUHNVSPVTKratq2rT1FQqioycqsVUyq
2rar0dRUVFRMVbVtVuqxVTlVWKioq2oqFVtW1bVtTnPUVFRUKratqtVUw5ubKiow9RUVdVtRVtW1
FRUVFW1bVtWxGNVtW1bVuRGNVtW1bVpqtq2ratNlRzVbVtW1bnNVtW1bVsURqtq2ratqKioqKtq2
ratqKioqKtq2ratqKioqKsq2ratqKioqKtq2rasqKioqKsq2ratqKioqKtq2ratqKio5qtq2rati
NzRVbVtW1bFzRc1WYoudGqygyqntVPartX1U7Rz32RqtPc9Q1bMzlCotxRrNruaPmjnKrVVqpq2q
3UVHNVfqp/zR1WarVVqotqpyLV1WarPPVfqv1U0qsVUzqppVTOqmid1fd1NV+q/V9V+rKrlVuKrD
c1RlVMqrFW1ZVYjVVo3MaM9RVTGqxzVYaqxVbq2oNVlW1JjRVbzVWaqQ6sqw05OVU9qp7VTWqmXt
VPaqe1U5qt1X6qe1U9qptFVT2qnp6sjqpvVa5uaraiOodWVZVlSbc4Y1W1UgVWarFAarasqyqzVZ
qtxKr6sqyrKqRKg1Wc1VNaqcGq3ObnyqmVVgxqrHNq446rVVqoqKrk3V8Ruaq3VSBVdqp7HVaqyr
Oaraqe9qqcVWDVW6tqtnqKtqyrKqaVZQ1ZzVZzVZVlW1bzGNVk3Vaqs1ZVpqsPVTI1DUc1W1ZdVu
qzVTSrKsii71W3VtXVfVY1VTWqm9Vir6vqsVWKvq+qxVbqppVTCqxV9ViqxVYqsVWKrFViqxVYqs
VWKrFViqxVYq2qkWqxVYPVdqsVWKrtV2qxVTSqmhqrFV2q7VYqsVXartViqxVdqu1WKrFV2q7VYq
sVXartViqxVcpKrE3V+VXKrmZVcquZlVyr8zMcWc0TzMzmiq2qmVW1FViozMyKo5qjMvM9yrKsvM
quVXMyq5VZqppVTE2VGZVczKrlVzMquVFRVbiVVzMquVXMyq4tVXMyq5V+Z6qr56r9V+q/Vfqv1X
6r9V+q/Vfqv1X6r9V+q/Vfqv1X3z1dVlTVaqtVU6uq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWq
rVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVpdqrVVqKq1VaVVqq128qtVWvKrVVrKrVVr
IqrVVqJ1WqrRqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtV
WqrVVqq1VaqtVWqrdVuq3Vbqt1WqrdVuq1HFHHHHHHHHHHHHkcccYjjjFXVfV9X1fV9X1fV9X1fV
9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fVbqphlVPKqcc9V26tqpK5ru7u7u7u7u7
u7u7u7u7u7u7u/cu7tXd37d3aVa7u7u7u7u7u7ud4FK7u5Ndj3d3E/Lu7XnY13dxS3Zu1+H6c1Vu
Zu7u7u4oooooooooooooooooooooooooooooooooooooooooooooooooooooriiiiii/L7LV0PYl
mpWn2kvs2r2JmXJh5SyL55Zj34msy0nryVedu07lpXkm5nMIXSeUZzp2qNyuV45nDfZy/rMbMcV3
9vfRWlu5Zz06SZrxfJlHibfjZ/MyutZHjxUffM356f7MYP6+SDzne86TrT7eXRptXtaWTDylkSsw
PfitZmJPp28nVJ27by0rzW7mcyS6TSjjV2nuW3ktmc3lm+u/tsxsxxWrkPud6K0t3LOenSVpmvM8
mUeJu7be8zNHo1rI8eKj87mzdJ56bNYtrI6nvz1AcxnXKtw+DR6s65FBwvnfI0caPeWKCKrIZCgo
KrNV98roGp0VXDVWVQVXoVWN88DOKOr6j9U6oOljOIoGjb3xzXljrxTHmuz48Ue7qg6GB+PFHl8b
SkBt8s7vtzHgerYVXavNdHxKCgoIGNVhlC6rgVBdXwoD+jFZ3QDx0EH1WVWMzmdjn3QKqwMCqviq
5s8Yqs0G6DPDGoLoXVcoKC3VvXF1i56ipB46sCiuM9WOJUNVg1VihmvcV3tXU86PQOgdnqsmuGRx
xVbFzc2d6DmPH2qv0FVrl2oHQYLNq6GFXUJzUGojVXDVX7oKBo8KsjZ6sVViqz0oKtUUTHPVxsoG
6G6tq+os41Uo181VoLrmc0VqqmG6r71rOuHWLobIwqvquiqxVl1c9YeqnHMfccOd1WXdXVXOeq52
zdBEkqmqmTqasq+pqsShb3VwoMO+SPVAsVqgqoCKP2O7oKDiJ88TMz8SOKOgoL4hj+4e+biOrOeg
oOJ0oFQdj1HEWTnSzPic/Td64jqoA4jmOTiqrEpVXts81QUD790fr1yzGtdefq8u6B0FB37dts+a
6KLvek4qFXQUHfXZUD7LmqxrWprevZ7puPajm5u3kd3eUFAsXTfd2k0roIjdjRdKrCVXGjaN1fft
HN7btd+71qeXPcZua4k46A51nWg6nle+3ZduazpGNfNzxHy7ia6687UHV3nY2Pmoce8caaPV9p82
u/bt3oF37ug7mUdBUn6XQZEaoT7dt9jankdd103Z7d0FB72e6sePniPnNQRxR0FAZmjj1h4+a+bn
oKDdrp0PiWTnazM8b7OheK4j0HOaPDXzm7d4u/TetzXaIz57vv2dxd8SNVjd3Q5e6sc68iWHt0He
gt0Ci53262uuONms8ccXTH3oKDdBQWbZ+z1fdWfObnqHQmdB3oKDVAqDS7OrKg/ZTmd6HpOKQ19H
zydI+m7u7oe/RdZrXXsk+sRnMc0UVXGq5Lrzn6bn3o83HFVnPioOfqc6oOq5+3ZzHbtQXzZ2yzmx
81TFeR52xb81O3QJ3FlArvmboOxke8VCeKOrs51zdKC107TG6Brr17Pt0xpx337UGJRPra3QTKaR
orPl4kea33oKDUXXteX0q0ztXQd08j0m4laP3oO3eg6Pm1rU1ueVH5zuboaDq+agPajWULzpQ0PT
rUtJWY9BMGooliyOK3HzdJxmnDaw9m0rfMzGtNq6CI9zlBanL3uJNdWleWc/TE0Z5z5s5qlc3fvU
xnNl6aXdLtcbmqDePH25udR1C7UFB2fTt279jd08aoaHo1bTfbv260Hft1T7JdHnTpa6N9k+vbvQ
de3fsk0n0vpiyYaU1eb3Fb1Hh4sN5FHlDPUXRqgoG3rS5o4j+ZcVSorRjxxGyg6tUHW/YjmTPHeR
Rx6vL7RR2jGTOZ516RNdaBn0qg5qDnvR8vMW+x6DXl+9udXeqFx+UN335ooqFOcPQ9l3oOd9c6Lo
c8WukfVNZnft279mu1DV/N0T6dE+lxedmu3fsu+7Wm+nTp0zsm0soKFRX155pOM2R9mbnPnObHMd
aCgTXXqrOY76rLjijvLyKOJW+qMcyfXrcToKDqsjPs8cWXlq7ZjRxGP2PHQI7TOaKO8uPLiV5FGc
yaM+tBl0HXo0Y98z53MK+z7XmRmNb60FApwxzRZHznq6rz+Wag+qghZsNlV7nVBG6rVVjse3ft1W
pjfNVYzinhlBVdfKOOFw01A9WR8Y65nUwqyDfEq3ueHSCheVUz57hQZCgqRdUTdBQcTFQUHE7UXS
g4j6Cc4mqGY6cTtQdqGqgD6l1xaWCE5kTPURxdvNHaMnswoHVXl8Sgj5UCdFyvm4lBdA+Rl2tiuM
zIqjnqcqGY0bqvUDoKsqGfKigquDns1Jy5llBiZ6si57q10HOeKoqt1Uyqtc2R0HuHNGo8oag0Tu
q/Vc56mgNVh+hz5zcCeaqmFEe+IaEdTUcooHqea6qdx0Hfmq6rd4nzHVqqzU1WuaLmoHeXG1zPI6
qZcyqKDvUVa+c/PVmVFV0x+bKCz0B+epqtVZFdBdWVXeeMycdqqmJ7q2q7VYXNzI5ubnoLoHV8Uf
NioKut856B1U8NQZFpVbdVigt0MbahV1RVBGDD2qerh6DVQGqrde1ROCgozqJ8S46vioFG+Ic6ND
pDDx5x6vu+ud2eqD09X2sqguXluHUGqrLLUfNyuqgCRwmnB8RQmKWEwoUkxD6QqoAtQiqr0hxyEG
PaqAJarrwVZVsdVyEQ5qqASCe6oJOtUGpiqDCslUEzVX01xWnxJBkz04s9xM4mcaPk4UB+OQqh9q
oBt/+qL5KdC8OtucXqV5lEnaVbT0km0+3k5fi6tebsxzNtee5dmPZbJayXizHr402tb+LcreK/Zj
33O+k5jtmr9fY6U5MKj+5meqj37a+VnMfjq3eXiTU5S2qNPcr8apKTUu5TXOHvNbxryYfrtbvPMf
2Y3J/XtJoSwUV2Y6e3OZ7LaVmwb1RK7S6Vuj1iVtOk7anr8XVqY7HMczbXnsuXZj2slrJT/izHqd
abWu3xb3K3ivt7NerO+vuOYme2av19jpTkxlH9zM9Uu/bXxt6rat3kxZkmp7y1Rp7llfjUtLqkXy
Xc7Fc4e81vLXkw/XNWtzt55iSep3WtLY/AScrMroKmzM9XHpHkRqv56rkR6sqN1a6vqpx1oN1dVc
qs96rrq2qxVjVTd89VyqmcfO6iq9U8/OjDo8qIru7M30i31oN96TOjvm5uj54433WVZQH57w85QV
fV/NQd+ap5ulBznjfNU0B4+aO+c9RlVNKC17mHNUVcjdqsXzVVipq6Jaqvdz81VOKqcVbQHNVTKo
qyrKCq7265VtWVU0q6gVAaqyc1X1FBVY7dulXc9BHQR1UxqpjzRc56uqv52x9FHz0KoKsqsdqmrK
rnNV3PHfaq8jYuapqpyqrvOfnqKqQ9ZnWgNQJmcZ7N0qD2u1V4/Q/c1TQ0HaYSfN25qrVVqo6cx7
YqtOo5qrVVrrQVUw11NFuOq9zn56qdVU6q7tU4Y1qr6uqzndVMb1vL3MUFnug8oOY2M/Wgis8VQa
g3kXPGZRd7jOjxVdzVbb7Z3jNbzmq6Kq3HQW7vpp663QaOfmyKJZkZ8yI/Mj9Y+aOo5rSugoEroL
5uarOa4+13ZsszxWZVX6mr44zW0aOPW6tMY6iVCc9FtR9KBdcMjzE06GSP2+mOLrU1WeaaNGl2wz
fdnoHv00T7PWKq0ZvmcXPU89AmkqDo+zdBVxjxPOvN3yoq2o751dzTy40rzfXnijj6Gj7XajjPEf
mqT9sfRzJrj0a6mI9TmdtZ0nvIzI/Q9S1FH35o4oj5eXUc3PE10q/tdRHHHq8M8jedutAqA/WKLN
88cSNiPFFHdAdc1nzm5qtiq632ugUffDYz2uaKro6rUXNVl3dA3faa1O6MZ4zHNrSPioNWY9DQvo
mc+dNZVlqooOfRooo9Or6md5zO6A9rvcRqr/Mucx6k8cyc9W9s1U7yrDqKONnikV3Glzx0HNV9Dn
TnWdOtRVtRvfe6uPzdjUGK32t2YzNGoubHHcWJo/NZ1QK+uUFAZPmPHNdpp0Oc99alJ0FRbqyfNQ
dsqKCPrFQZeqC226m6CpOnv28oenPVxjbXbUZuegjPFHHmVeeM0by5iLHe95vuojn7GVDmUHXmw1
RfZX0qMzvrKBRdlVaqpgY1WqNKgR9dsXTmoOnZKO7Ol0ztrm7K+lBpHx8+ZUnoI37l9DcymHE8q6
pqUtzBvdxT10StrTbNMHjzOfDd6DD+Gw+9Ye4m7Rpg+N7zeZGeYtZFVuribPiPUvLNjvNXd71VTK
pu4n051zx29PZ2dTAAH///////////QqACWKAgAAEaUGuhH//////////////////////x5QUHTt
QUCtZnPfTOzjXRWddEuxubWXzmjcRzZNRdD0D6c3O+aM+ZmUFB4egjvDdtHPdtmVn0eYbzDYePmo
IzeUGtnu7WXZ9TBm9bqI6mo5qDw5s79d6OfDR3ZzK7bbzDzGuYzjzKDu3UHdVy1h90HnXJgx6Hmj
Odp1WKjyq9huepqv1Xs5ou56r1VP1UXFVtV+q0sPmRc1XR3Veoau65FVxj5QVZz0F1dl1HfDZu85
+dR0NXxZlxx2eOOLIrvZzmjvt6sPQRd46Q9VyPKrlXVU56VFVqqzQ1Y+c2VWDVEXbvVTvmvKrFVg
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
1XqsqDVXKDKrtVOY6Cq8quqppV9RVTiqy4jVYeq5VS3VTGqnVVvOsd1fQ3V1VIdV27NHVdqzIsvm
q2qxVdjq2gqu1WcoKtPVcjm7iqu1fVbquPFna8oOvNVdqumoaB1fV1WO6uqzKmM+c+VdVZqpDqIq
rtBVlXc15z1W6qdGvOegoJiKKqzGfmcwarbqpzhnHQVXKtzmoKDnoKg5ndVirqsijiq3KrKqKrNS
qrtXVXKiqxVl97oKjKrNV01V+OgqvVdVlVmqzQPnoKuq5VdUc1W1Xcuq0e8ypupqKsVQrBoqr5xj
nud4egqsOqzznE9VcoDb54zxuoqpnuqnlRFd1WR0qxo67dMxaubvVAe6JSTDS8VH1ipJPZk1B66v
UVVMxl3537J9HMXRyJ3OvzPJM2T8vyizt07qYvLkkvTTd+KYuYvt5MoXbvV3K832nffNXdF713fa
ctUaXToakZsnczTz3p2fTslM+/PqZc19suioKLWZt0VFkxK14Xy7879sfS5pXR776TTuffTzF5M9
MW/fLzv5RT2duneavLk1enjt35kxcxfbyZQu3bu515vvOvzV3Ra67vtOWqPF06GpGbMWS61ee9O7
6dkrmffn1WXvffLoqCimtZm3RUVBkxpbxq/e3PV5qrmUMVTzRb0aqxzczNVTGraqcVfNrnquVU7I
niqpmbm06qcGqsrnoarGsPUc89HHVcdzVCZliUce7uK5sieLnIxVfFY3qaoe/TKszKGNGjquLvVa
qumP0fbnvnqpzV/UiaK6Cqw1o8cVVMT2bvLMYqmg56K8qsUFRzdOlB0NUUEcVVy+fni5hfZVWbqp
ltqrKrlXHy7XN0PQRc3NV1VIFVi6tPFPR0FVMM7GsxsPU9HFVZqs9arNXVd1ygPV9RUc/eqmNVNM
oHU1WDVdV175pUqir6qdVU6zKsuqxFzKq7kVXR3QXHkVX1flVi5q4rdX1XHHH0qLqprVcjnozxWb
sbnqah0FV3KsMusdWx1YddKuquH6VWOarVfNnWrJg9VurKrlFVYw6quzFVvm56J7qudIopvOsZ6r
Juaqx2it1FBz1e6sqKrnPQVUwjqua7TVBQHqFO0FFfaM/arO1rt3s0c13qMoKCis5jHMY/U+5zI+
e8Pzd+cyWdnugRrnD5mkaSaW7isxyVTQUBr535Gbp520qDmugJvO+zePo4rzyzcy51QUBOO4ukVx
9rZjvOlClQHToF3y8hOVXDc1V3n9qL6zU1nTJztGbqquoLNUo+y/p7ikcdl0kegjvm65UHqTnN0q
ajphn06dokjHyrKiivIojGyrXmR0EWa798MsR6HIqrCMKmZNVyMkW5s5+f3fvnPV+qqYDubpFVan
830nJyb7aLVWdEsskdZzYj51CNcdTesOY/vNHfP71mqm6Cg2sOY5zWfobWZzxc1mPz53enQ2nPc1
x5RR4mtXnOez2z65l5zXQxz0b4Eevsi7NfnNd5j51iM5ixnPFZ8vthzHNNZUd/aDnMeioKCzH6NE
6C8PFl9TvuZI85RGjw/PzGugJnNzG5+8eorx3izb7X0xugOnZ/c73nbKtL1XKi8oPet9nGpmaiCq
zKCruY2jdI8obzpHfvPzVZUZdS3UVM50PF26duvboeijqvmVTHT1ea8i65HNZNHskdzBj1Jj3zYY
8Rzxn5tzlAT5uaPIqrnuuj1VTlCdnJq5wObGaq+8JGfa6k+YeimujEWKcijuLIqAlUZGbrodMyg3
vmfh7o3JEueO0XoFZ12StJ3HioIrOk79NfNhuxo3dmW2boWu4soDR42osuK9uM6zp3oI5rLOo8dm
qs1dZqBTWHGTVTHhqGhPzvt2iXeaxOrsNPRPMyeXPq3zGN15ubZqDfRqq1NeTARuZxYbD2fKmrL3
fMicdugszVRUKgjVRUXHV9+1YanuryRqh85yTijq+oq+rb9NHdRdPVxiR6sJPnuoSS5olH15zs1x
83NEprt0mIjVPOc3bm546LpFlB1xULNU8+Vb3qOeKOPni5kouZ5ccbijiu1FUc0fPz1HPEo48XNb
fNneqxEa4o6siNEtrOZZVvmea6nw8xl3NGszqbj9zmw4iDoebteotn37fQ2qrD7jcQvxemp6sOSv
nsl03HFFVtXxVZ6479NVju7zfPcVW1N5dX3zz1BQUAPmPT5+s1duI66R1E7vOehPV6XNzNxxmqI4
4ruLmqKs5+c3PV9RUXHGlzc3arzVETju4oqio5zx1fUVBufnjj6Ld98qKBxx3cUR4o6vqDc9RUc/
PHGlUXV/NzNxxxxxXVtVyr+c/PRTFQ99DVFRdXHs5qqZ7y/OYjlV/n71WaiqmnNHzvMNEeOq9FVT
iq3FVlXdDHvVWOYi5oqHnqp2eKM6UcVViqmUS7xxGPHVSE6Cq/GaqxFH0oO/PVdevdZfXXlXVXo/
dVfnY1W516sb0bOm6u51o1WNboNc/Sq7HlA+9AqrtTFU8yRtK7P2vnq6LLquc9ture1WVWzVXKtq
+Pnl5sVViq3VddVOIu2UHPVlVPI6CrqA9VupqarFVg9VMulBVcquVNRVYodGqaqZUBjGMaq5QG7V
WKmp3UVUy2boaoqv1U67LLOjR1FV856r9TVYqp7UmoKA56rZzHqarlQeq5VTI9R0qDnN2P07HPU0
Bqmoqv1W6r/XsYxz1UyqdmoO1VKB6rFVugqsVWKqdVXKiq3Vcqvm2cxqA5zVWD0BzH7mMY/Q9VOj
1XDGqTVX6rlAeq4aqx3qD1Bz9qqZVB6iqxVYPVfqKCgMY1Vig6VFSforXTn5ziq8fIk8QurO1Xda
tq1HNUVFVMquXPQJ3z1fnepqtRVXairqDmqpkag6c3PQ1XarGp73OmpheTlzvbJenSI8enitjbc9
8Ja7GyeM4+0WVWlzc1ts++mGodr3Oi15e0s2nqXUm43PuhVC5zdFodraxXhKnJMe9EjrZj727xea
3d5vL2V7PTyavFjPlifmbvKHs5zFevXIZTnQleemJU9JJbWGu+xP08eYecMt93q599Kb0hdziU9n
Z1MAAf//////////9CoAJYsCAABwp7fsEf//////////////////////GWrWYjnzDHMY58xUFm30
wx5uWYjzJdZmozauz81PT7vNZrncVDMUK0U6BM++mGVDvHnRa8vsszaenqTcb8uhSocd77UWhP9r
a8zxXhKnJMTnRWjrZt7d4vNdrvN5e5Henk1esWPLHlFM3lD2aeK+nrkNifSSS8RiVPSbtqe3Fer7
J+njzOx5wy33ern30pvZwhdzmKJaormEaZMjnMa8NGaI53mLpQWbN9MMd9vZiOzZ7rDa54tXH25q
cpvd5o2udxUMxQ2tzTcy+6697vpV3dmUceRxo/PHz1a6qcc3Y7qfeeqwcUETNVeiNeP7HQdOf5p4
nUX1ygoDm7ONKp9jzDruUvpGOsKvB6BTXWrT9quoDXrDc/NU0CiyMw8zmPV0WNmqp3VYOUd1bVYq
pjrcfTKGK7uq5z1XszDRONdPMjzDVNTQYaJxq6rvNGahZ+tVyr4zRnuM/Y0dTzznNV1Xdql0EcZ6
mrefmq6q7FHVtXXnM8q66r1VOZxc1XswjobRj1bUc6oLqpmllB15+yjuI9VnD32NUdDdWc9x9TUN
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
qc1U8q6qkCq7QUFmqKrnNHVTa6lHj5+Y3Y2aquVU3dVmrcq/nuKq/z1UjVFRGaqntX1bVT91XqqY
VZz1dUVUo1W6r8XPUOI+Zz1WLqp5VTmYqt1U653VT9VbU1U1PzRVbVeqp1FV2VWeeKqn71z1ZVTy
q3VTSgqxc6ypjjN25qqbuq5V8auqnHkXNFUVZVcjqpvUVU5qpANV1VPKirufUVTk1zpVUxqpjVTP
mqv1bVSrlVIEdVyqmNRVeVVMaqRqqeVWqqfHPU89VMoqqcVHb2JnaXOmqvPVTE9VMKrxjnNVcq09
1N9oqmq/VYqvVFV+5ar9VNuaM/Mlnh6j3mq+otR1afmjq2rqiPmquZ1q7m5qT2dnUwAB////////
///0KgAljAIAAIV3HMMR//////////////////////+sVd11zPt1XMbtVcqyrO1VMKudQY9Xqr+e
jWVdUVfdAmY/s5zc/Mep5nHUT3PEfm7dI+0VJEqmrauqDc9/bu/lB27UJ6CKPzVBzRmuq2+egPV7
y7dXGqsRO+fmqaioj9ugxxeVqmoq40dRHUmPzRuXnqyOoq6rTxe1XKrp+hzVdFV0dWxdcOr08N7i
5qiOrqrlTVYXNdzzXPFFlRz66mklq+gPzPzKmranFzLI6tPlXR55QUF3QbjtaftfvXKdemVEfvp/
dzipXrMoGSqudI/oiy+fvQVNWx5V3NeHr9N3Wq+Kpqyr4qmqxzmuqx1PzVWKujqsVacx+/VNUNX8
1Qeq8ercPHUR5l1Zz/BSd+aNXV8VWVcaOodV6giinnVlVMO9RmHquZVY3QOlNV+quiqyOp5t2fvV
nN1qO3vNOcx4n7dRVyj5j1ZW5pyeqI6uq2Oojyq5zSxc/aOKp683NVYUV85utX65uz+3d9uq7G5q
GKgOfmqyr6irqrfYzqt3d4zVDPV3PVcVXbjx1DyoMeg561XVB4+Y1BKdc9RHVlX6qau7Hj54ounZ
5EfKiajq6rqrlR2y7npqcnFz6qsJ7uotRqYqsc8TNe5ygNHcaqarNX1B+erd2aqnGVWOtBaqaB0N
DmruhkictVir3XVrD0rzqfr0mojnjNU9YjmqahVFTQReKOI2+ep5qma5r5u3SrKrlVyo6nzt5V2q
CKgq6M9XXdWRVa5ioqTZdfvVxsuFBV12dXhsr9Km4ojUG4zN/Y4jGOj2nU1AyrOeoq6cPzGmKtNU
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
n8544+c+amOywzR6rBnH1Vtd1m81zCzc9SlRG5+cx6k3uc9WnPVsUcdrniqOerIzVGYo4ps0Zz1N
sx8q9xxVXObpdVzEY1Vmosydg2su7qY8is2GiPuYivnnT9bjw1535jH9+bR8cXaNTG/H0f090EcS
yiinHzm9jRmbOfrfX278mKr8Vox8Vs3tqpNanVV1VM6u96ZzGzdAlHGYzfnqu7i3mGs/PuKq4YyP
K6I/POZEbpkVpmPzzB8vmqw3OezLcx2qEdGNzcyoKjGc9X1dlAzGvocziOaNOqxzVEW2fDb5o+xq
mW+fn5smJjniiqT1BzZZqJUVmZj5nPU5mRR4ep6HqyKM78jjVx5UGjOfWRrJjtiPGY02mazVWDur
8yr7XWN7tJmqsmOZ4o0Y/Nz4Y553obn7xHyOJ5HznPGY2rz33uqCgNQnjooln06bMdx+pVfFZ71O
njRlzmZotdUYx+c3Y0avDmjy859K8N0nLU4YVfv1+Wb1Hsx6lHuZPQGPkR81zxUEVx89m57Mj1bF
7SVFWKM+TbqYri7R1fzdMUxe7i3M5Oc95dRGa06rdVMMx7P2MMMePmMZ3FceZFcQlqKg8bOY+Xzn
fPFl3F4Y7iyYxTCs3Y9tXeRXF0tH5sxXhjWY9S3z2Yx+bmSw0ZsyqnFRF48NUGq+reY0V+nPV1rm
x50qp3VTGrqqYdUcy5kqrNXx8yceVUxqvuqmFVO+nXD1cqv5kZVfVlV2qyo+2ZzR+VdGYzObV6WR
xVe7Megvot9T3zIxj55FEY8VAd2u1XuqxVtXWzVNXHN1NzHP2MeLnqebmi3U1Yo6uq6rIrqatqsG
q40xH07GZj7MY0Roqk3NUVLs/Ml2tKPn6xVNxXhlF05wcVNVo8fPeVclZsVXuPLqpjlVMKuXMqqc
x87VXqqzVfdVMZXVlRVTuqmFXXdVox7zmVX1WU6r7VV7mqpjVTvndVyz6PkniyKdMbmnJM3U9/Tz
B9upi646uq4xu3Q8ZzHNHzc8XNzVNTVlWVfV9xR5061bVYq6rjGwxnhzRxH5zxRVNTVlWRc/NHju
rqvqsVWEcxzLoeOLmqannij5o8uKrKsq+rqtqsVdU9OuHxmN07HOY3No/PVkcVTbNzc2Yrzp1x4f
Ir5sMY9uq1z1W6rFRznqsVWlU7qu1X6mrz1cerz1WeY7OZczqt1EdXx1XqjKqYVX1VTLLqvVU66V
Xee6rb3dVKNWnZqsjijiNz1WY6t56hny2sUePHjDOY+6CqkHnu+bD9YuYGj5hHhoqhZjdTq6qf0H
NmG6urtqq5UxOoqzntHdVyNGeOoMbnbVWVNVuq+erj1dcU1h4nUxHNVvc3U+R5VTnms1Ac0ZqmKz
Giq05j7C7Z1nkFUVdQXmu1QapqKqZnzMPQHypqsuKoj59xXkcXQ140lHzdudGRkaYvM0aKrN4e6v
i73U1F0GUGYojpxVJunNVcqyaccxnWPtG+aKOojyKrkeI93zVYeOzRXzrmuK0zGoLqEzLKiKOqlC
OqzzI6oO8aqpv7zVU5quXdWVU3uq5U1dVzjPbcRo5JeeK5V8SlU7WhzcVVZceqSqzUR4Q9cp3gaa
qp5VTMHGLy1vbji57zRq5pxuTGijWOyq7Hb2e8y41erta9MLSkNbcq9u7klvXaZSxR3tni5+ezcz
rxuRLzq7ztXPht8CaizHvMbd+rnPFna7WMnf/ftFmPe/iy78D8avUw8Okc3Sg9VxVBz1Ea7Rrduy
FDeTPT7T1rrdLiWuyeG5nzqv5L0wxuc5qgx/eBHk5l1MdRUc9xGV8Ce3XuajP26LKRduerF8aMWv
xaSczFUVfzkPZT4pzzmq2rueKovePr3Pz9s7c9X1bUc9XVER+ZzJTF6zsWZTFrfZx81TZmauaebk
xoo1jtV12O3s9mMeNXq7WvTC0pDW3Kvbu5k0trtMpYo72z94qmps3NdeNyJTvid52rnw2/tWHMe8
xt36ueOLLOsav+v2izHvbWXfkHR+NXqYeHSji6UHqvmqDnqyNdo1u3cZChs0z0+1611ul8y12x4a
ovnUvkvTDRc8Zqgx/Snk5h6u56io57iNLeu3XuajP26I1InU1avjwxa/M0lc3zVZV9SQ9lPinN1F
W1fzxVB94+vdH5+2dqmr6tqOer6iKNH5lO6t6USRFa9E5Od+BPh1V/PmpMqedc9RZzc28PV8VA49
mnar1X1Y+sTt1MSP7Mxy0Scz7uLNdO3vjW6B3rcV+L3Z7CRry9YsnLP2kNZreKgPcZujoY8jmTur
I48edlkdmtn2er+z0Eb1c77c3NF1jV6Z43LQ1XNXfPz1c8orUdXUFRuc6ZVTGKPqZZdmqsVZF3oZ
6OgoMyM/WYu7qplVYMbnNqqmFA8zc4qmgvypoJzI2lFz1cz5Um6ufuLpuLsuaqyrRrXWLfQy64aK
qxVTugi09dqC+lBQ3p6quc0c5pzGRqqnFVOO2qtuNlO1VOI6tVVODVY4jZ1+Hw9HUVUw5nV1RzTh
oqN8x7jqyq5VZj6l8ZtXvEi+jOz9YntXq/aGK+nSzUc6zPVPZ2dTAAH///////////QqACWNAgAA
y4NV1BH//////////////////////9O1zFDua3HOmmJjtQ996fRZ3xHaUayR0TflX1bccW8P8uKU
0wzq6J3qeGl2kmmahmR5OT5scWdDXmpvc0ruK81Uq4sNR9ukxdvVGTbaP0oVGuhjpHt9JpvEbtrc
nRGtPXf3rlxRneW/PMzeNY5ZdH6VNmNQ9Em7KdLP37Ogk5+m795qrh+Z6+Xa51uh1ms32eqfz8Ij
s7u4nvJI7vPehjenSu9LsbJ7U9qh0aPc92Pce1uVPI+52/Ioo6uUyrPcxqzP23QWpYjWZ77a97O8
mEbfbWTlxWzC7orq2hliPfTpHFdHO0ZmbT0Z0V326TG6EnPamaE0e5qXJiYn5xvtvtQxG6Yt6epM
75dxHyKzHSPGKPp2mLMnQ9MjWai6S487UFG5rDm3qTLvE/U+fcVSklvstZrNraYtm7ZfZ9rMmc+X
77OOXLes6cy9zerizKDcdWcx6hOOIaMt3mtXnl9uepf2zZ7Hd9sq6a8VXUVzCij2fp8DOnnaakZu
iWZq5vS51475u03lvx9Mx4Mjxzsunma6Y3cu5y5i8M9aSzppGx0Os1o570bMWnb23bfZI3ZPpbzo
tzht3LhzZ5M5547MeLLfaPR4o8bn2Zs2bNuKj6Z0PdQbnuS+0Zt1PTv2KVPM/aeT3rS3288iqe+/
ddKnm7Sbp5GvIo9dfTWj7O/Zy8TE7MRONZqN5Rn3FLOrs1t9Y45gxue8NfMmfJyYo7nfJqezXnfp
l30ib5+aNp+3ksxczh81rJpO+lrL6Z03N5fphKOmec7mN50anJh8+qLVnyK+/1SSP3n1eczqcob1
29p/DOKP2Tzrvzv0zm6FOxBc+2Z693188377U+vffpnYxpDXnTOynVFzalmVUnnJi8mp7Wczvffz
L6dI4ufmTiqXZpicy08PU8zvzWpq86dIo333FU41zc+Xm6h6w81PZfTp38vcVSnHFz815MTlStny
56ac4j7iifZH2fW/NtVNSfDGw5s0byg2j0GR0FV1VHiqI+f3KFGs7OkJi5iO8juKrLq48xVTDLml
fTI1Q0FQ6ti60GX0qTeXVpzq76UPZPDJ5Y9Lv2cinMPfPa2ads2qvj58mHzLF7QuOONx3ZojodjR
ndB1qt0Cyro+9XSTQi2aK0/g621QXVTigqDPmj56BLoePUeXmGq2puI2aqFzxrma59YeN8/aew5z
VfdTQP3mzI47w2RnqTxHjiw1REnQ5rJoxry49UG48zOmatVK58OrjvMznioOc0Wz853HnY3Mr74+
a4jxmyOhjw5sNh6DDx0CTiRtxUEretbq7rmVdFkUVWqq1VaqpnHl3HcVXRY4+l89WVF1G+lX3GNU
G4zKXXxiX31sNTB/doav5sLdoeSbuZd43jJzlH89l5lZuzvxPM1216vvz7Jmo48ySZ2PNdMlSlZ7
0pfZR8kcinNqvavNsit+o3Nc5bTtdsxrX3a1J8+/FHmOjmn9w/fpmjZ5LOSe+vsvM7XlJ7296NdP
c+eCU8mOat/JexfphjZzvP7pLV3Jt9K8vAi10NifvT8NTvTHdP0ztMT2byk3237LaVPwJbTrUnAh
++yzHk8GH7tev4fo+l0azUsh8+veiL32NirxlIj91Xl26bW32uLsfIpaWy+tE6P76qhWbs70k8zX
bptTv2j+yGUcfTDTMz2Iea6Z5inbPelO+yk/klzKnNqvavNvCK37KbmPOW07ztmNa+9lqSdf34ZR
5jo5p/cP36ZqLNS7k9+tLzO15SFfe3vRyLp7nyYE6fzHNXfyd7edDGNnO8lpLyzyN9PZfD50Nifv
T8NTvTHb6Z2c9m8pI1237LeL2u3jrUnAh+yzHk8GGd7Xr+H6dH0ujzNakOb696pnvsYyrx0BSKPu
lrbpum32uLtGopmTCfZlxvrGsPZ22ndV+oj5jvtl0C5u5zVZk1QGvCOHzpEad7uoGLsZvm75Zl2W
uePsyNA3I48P0nL6POeI/NQduiqxI54sXTw6dxXT6qygf06DOelN1mVQYj9DGvn52ufse6rlTHzZ
e6mgvtRPKDtQUHPUuOO8ObKC9c0ZrquVYeNsrHuPfNzLmjy6a1iqyrebvu8MCMep6gNVeNivfXWX
RPt3oDOgiVWG59RmRudUOpvD809dVyq4ZUzVVy0aequHq83Wyrc7Q3hnVnObFinI9ZUVNrtVnRGS
3fafJdjEEzI7V553t9Vluh1qc33mOyPmGnRZkRntbmHQUGpKChodpzlBta0t9OnTbmN9c666nepz
Ok4zxW8O3uYVpWa6DtrPbuY6Ts9tUGK/bQPvzpJvOzu+nSgzLyb2qZrquiVzNCz+n7U/Zz3SaMeP
I6sfvWSMxrx66ZQJ0SJNdc12Nu+3bXXaiu12mHePd9Onu6DM10yYis+pi33zss7Ltru3z0PRPa1t
zq6dj9TKLtdztvrtdKCTvboaCgnH0WO976UPbXmtb3164+67a6ZOY7PmHNOmttN5O3e6FrVDuPM7
dYtlpyXp2tRHN2b7RR0GJ01Emu/e+7ycxW+3Q6NhqC9Zl7zavIt92a2qnJyi74bDn6e3qgkzzHh+
m+nU97eYVXaWgeT2TnVa0umnvXWdP0k3MHyLb3OLoL7dNY+3QvOb6G6vN3QM7WeJdlOH3Ztzmr1e
PyfzdDOPJjcwtXQWfe7nF5pdOrdH76t6bw5sil9LXndaxad9r6a0ZdZicoGZ3na+vYzvO1p9FeRn
zZ9lqGc2gt+tSX2XZuPJzW+6NeXd+JWmujfbo96zs++XbxNJPtp9H73mu2p25nRA7P164VntTGmd
m87noZxKgfPeRNvOk5FnMlvqrVBmpjtpamLvLnFs2tXnRN9Oz7X13pu7WbM7TSbXV9M7X11tvNmb
V2k8a7W1veuvYyxu7STvO/Rvt0mcne0fbOxtNGd50V779qCLmyPKmOOg51GsNmVZZj5Qbb7WY/bD
KLKuP2NlvOlmfbmyr1Q1HbouxqCrdPcdzvq2su9Wfp0i35q7kXVbqe9Db6XZl6bqu2PF3Pl3Iueg
PU81VPOfdBQHqtmPzRHlivtUdKrHNFHec8SuoPlBrmyp5nc53VAfNUPeNz+jUDj5ph6vfjWt5PK7
ypoKvoO5+fmMfDXidAqCgjWu58oOhqDVDGZOgoFQUOjxNTHnPQR0Bo+tBE6CJ31NEY/eo7xaobuf
XPo3vc13QYsM6Hv0osPrvmlZjvdX9e91PPQNG32ztH0HTN9D7SoD1buq8fDVWF6zYePpQVOGNmdX
z8580JJN99+7VP78S83Lr1+bPvFlW5l+/Oz6aaWe2ZOyTe9Kt5mmFei2vCTQ7ed0s9vNevpI7bWK
zZ9ddEnbve9vT3O+Fva61TFfry+1BSYnOqTSJXi0JjeJbI9Tshc5jv1SYVjZZYvPX1i7azWb7S/f
nn3ePD00xvKfz8f4mfq65jpJnVen2vpKts++s4acp69PWzr23Sb9z0/vzs+mmkatZk7RK3voq3ma
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
V6WcZRKSY8vF4pFJfxdOi18JNK+1d9uhDWylzHzzt74STP7e92tz6paQp8nsHtI21IL99pO2tOSl
pHqmvEtJfdbFpFJst6teL5SeSzMx9UnyRy5tbnV09+dJz4YZJvXiIWb37m2+vk3aZKRNLo6y7FNb
/D5+PnlJ8anGUSUimvD5kxikUl/M6dFr4STSvXeu30Ia2UmPnnb3wkvX7e1an0tlPk9g9Vt4pBa9
nKTtqlKPTkpaR69pfh0tYso9doWmvPZvXub14vlIpZmY+v1SfJHLm1udXT350nKMwyZ3rxELi9+y
Ztvr75PmDP01naYj7Hq6N0m7PVcNHZk4qtqyPtuOw8qasWVGenq4/pjVMUwlmMdn4nd5kwzGVJq2
pZjXMubVvW4z2tVuZ1E1RRyXpsy6NVO3tOqzVTiOeqyMdsvnzdVznqanenQZVdiPHUXHQZHMHqKu
MbnXN0qDUFVM5qg5qCg7HqOf26sqznurKA1BKe6Cg24uagj5hU808ePnfTnqztdWnNVc1Vc5+a+b
L6qOYznRt1BzXugixI3PVct7ygq2rdUFmixVFRFQGFTU1aqhSGyoqyOhqsdcdTenVdioIxEs56rU
V2qrD6xc/Q/YYk5d48uXOnPEY54ze3fp+bn7Yk+t+Y+eKM2dlnS9jpKsa86fBu8v4Htq7eas3NEc
SzXTtSrt21tYtGPdR727L5rpvdH5OyTc7M2a3mYueojqx7Mcy5jo5zZ012vBl6mTm30VR15n0Mdx
/ZeniN7ZzWfp7kPWrjP2mLv5uJqaB5yPL8HodSDjKmYsR6HNVhojb5gg+wXuSYMWnHzDmVGDHsys
3Nz2uifTLnDZz80fPEs7Z0vdE+3Tn5u2c6V3zHXfz2dqMpB3ii1rp3FmqD3mOXsslXzpHqIxzq92
nc4Y92f5hzd+fmxIKXeu3V39eYj8/MaO1vO3TF8301Oze7vLQ5qirflHgNtHuPZszt2zp0Q3fAjc
0ouaN2Efpt/eY3Y31vuNvekfMR3DDm54z4cR9dOJbPebw517hm6mI0c7lXjm8ZwnHo0RthxGQvdH
2y7exnhsx2815ZubtlbsM0bm7UfySdmd6uofYWgfNZrfmwvl2YfHuXJN49txxIRZ2cd8z69k/HeL
TvmvM6xn6s9xnMl8evTPm6s/Tn5uk7M5zXqMxCzUcx5dm6zVTH80Z3781RPQ85JrsEL6buj+Q8Gk
E0Jwdu13E+8fe86drb8w24j1NTzc0cfP5UVOntm3ibe87XHEY8UZ+l9e5j9cxs+Z2s2jxo5ooz9F
U3zmtGieM/PGNb18MJGKP57uP5DnrLPteQ2pz3cHBbN2nPlHzVFHDyH2TNic+ZnQUY8u97f1A9AY
7oI87RRLRzPzxR2Y8cRj9e/U67XrMzN3pX2OaKPoeNdrzrfXM1t67Z9MY2d+3Q5j9e+ZetvMOa+2
k44ozm79ebt495nPF1697ztj0o7tqG7NIOfrzVf2quVdzxUDXO7PzxVPNV6WG0os546r76x50mUz
xR6USZt0XPQrJo8U5fPgzMWZoT2tTQW9tGVA6OuZS0Ezkxvq/sxOXqY8mJjeotZ9aUfagq6047qu
VXcVx1dzrrhjdj1NTQUFPE75m++VEVn56qYVOjRbiqsms8UaxGvOerDLnPl6NzRnzD3HV99B6cxj
rnqprVZiqF3jq0x6mpy8Rouaq3VhqriuOpqvVf3ayLHVmGVTHQXaNVcw5s+xrL66q/ceRVFW89TV
YPdTUqrqrMeG79j3U3VT2q95qPmqKrdWR1WjXcfvPVeqbuKpifN2N4bmq+q5Z3Qd+7TPzniqyzeq
IyqDVFWVbUVbVnPzukUXNaqphVZzHzxtT006J3YUlZY4rir7yHiXyT4rixLZDflzpT2jO1flJ07F
tznz7Me+VlLX2lpWnL9c4NgobbOQ3OTr2fGqTt0z3xN1+m/Zya2x8T98U5DWhmso23SapKMdpicu
962tJaFFqc3rbk183uj6L7q9K3lHSKY893MamDW6OY89o+7+61usikDTu5xHO2lSdM7a3Qzn3XtJ
46y9r7S0rxy6c8NgobbOQ3OTrR8auk7dM2KTxO3X6b9nJrdJSsUdHjnPFPQ1oZqkNRtsvvVJRpUc
xOXfbW10S0N6nKPet6clHr5veuq+q9YjvKOkUx57ua1MGt0lHMee0fd/db6TWfGopOxplLpJScyi
q7pzRYbzpVl1DypoMuK6DFQHuWgx3U5HkGoLp4+2e0Dfomd7TWc2Uc7trRjZ7Qea7ZtJvcVr7N9O
vYTudaDnXkuH7bi3f32gzPhu5om8qFG1FZz1OJ3nNds+scRqvq6LvHHU5QVYoqDJ6aS5qsjjd5V3
PU1Nqp546TmlqOagZ8zLvKiO4zxSdJeaJ4j6txVFBQR9qsMbNc8RjR53qHlSwZnbupqcqw25znup
vHU0GHq1GPRzEcxt+1MXPHbu4qsi5useUDlualnaOjfq37y0zTdAeJ5rtOLHl4dKO9xPLztl58uv
cT9+L29G+m79xl5c1vFR+J5F6x7L0MJxMWt3XUm7ckV0F9OrmJ2CjMe87ZO5I9YufAvB6Lo+Y8dr
VBLH0oHjj3eRnTrWa2cW4sNnecuoo3V3QVI6m+Det9zTOTtnhIO0yc5kzZlBNxHjN1x6mMV5ZzR4
o7ozdsvOmNbaOZ0e+zo+l2bEdR5F0OM1cvnMNCW6PTmLtGOvZzDZ3E3QHxxDEt/FqcTzxB+3mHS6
3H9TiN0YvN5eK3Xv5Fb+eoK7xCdmH3oLjGs11zcmZvRo8UxFREzO6Do3Ll9sNbWK6CYWlGa2br1R
jqdTpE1zb6pc/XrFV47xMP4Or3kk7Z6M66G0ut5eLUQ7+5YSt6mJjBEpZzwL0e3R77UbycluXBhl
l3azaSePLNhjmj1Gd7axjrc5HFkz1RtYa86uI/ninX81JhpT82bu8vfOd5HqTmax9ruY36hsHHbF
PpjO8LgoMYO98mnfuM3P15jmbUy8c/HR6iP26mRnalxq+zw14fr5FH29iuMzs2XZry5nLtI8Uc56
4o/Oprmoj0d31eXjV3lrDGXNvKM6+KT7FOcbDQ9ih6xK8VGc6qIzGjmHls2vV1ed+p4o5zyOI1q3
l3l5l4nh44vJzZuve0+e8y8tW8vO2ZVho4su8tp4rzLjiPnftnXz2KN6mOiTM93ePO/U5jmjqIqP
mq2qxZ1V0VBlxnVBz9aBxRPfmrtGvW7qNJ702fZtGcUWa3Ed9ItyiTnmIfXKvHcdR0Pqj6VM7ePu
12aeeRHw56Cgq+giNh6Cq8ap1HUc3lRFnzFmN81Vzn5kaNW8vnO6BZjMlQc8aq6N5rKg1BmVaZtH
qKrsZro5MvF0OqB1bVid5HlugfVVXeeNH6ZFHbRzVWt1dU0F0GR4Z9KhXV2OOLUVAc9BQOgvNd7N
eI0dqLtUo9xx1dGulBdDz76R30q2LDRdLq3as9RzmqpydOJtKeiWUGUeKVHid2erqDO1BFEj5urq
uo9pLIzaq2rLXinvq3XYcGNLWPoqM1HgkEmvfKSt54ffq8/gZeJyySbo/cvGmQo9fNA/q9xyZa2l
tq8vWKWSjft5aao9EH7PZvRpnPkxhvFfZvNKVJSLfls+Pfq8t3MtTsqauRrLnWJlb9WY9/i9PzW5
Dm9+dJ0XO/WzHMnLJuj9yzNMhvT+a+R+r0zky1tLbTOa9YpZKNu8tNUetucns7I0znyYydN5lpvN
KVLtkmdvLZ8fgtaXls8xMtTspRNXI1lzrQa36s9y+34vV+a3MnN786ToKZM13c5Ef1N82Y6soHfS
/MMD2ftE4zG9qzso1nOZIxH+vfPKKf0DiPJf69bjvXP6pq9HTyOPoDNYr6LtQbq7D6HbtEboarLw
rl69MbtkzbPGzM5quRznOz6nH053MR3QH5ubZ1FfU/Pz0VBo8xzdnre75qid86zFXHioKCK12NHU
x+mW6G9qq7UVFTVkR0d6nLmDRxRec53R3eaczdursq7dlvHI+3ar+fpedmpO1Tz1FFdWe3c88PHV
x/c305j3UYueKrN510fPNeqLr17K9e5v099pbkzvJe819z33onrdBqXe4jyybv5Zu2dDxHWZ4aUx
jnjPMu5j251YPM5jG1537dfdOcM+j+TmWl0uZ8t2yRFBxLtH6wvZzd9Akv612m8316+XMZ49TW3v
Xbp2103Lu3OhyeRxRRdu87faf2s1nt3LqMXvNZmYvEpjzd9uxW1L006LZtbb22ZmtrtnS+hpremZ
exdZO3WU5ru5vXY/zeHuXtKbzJD3J3MfeZ90eO377OLpfsx7qgS0vOkcz28nPVPdG5Mn1KyMi9Gr
7dYlOw8mfHerfZrtoZzD3t2Nnfyc7ezmnkzMTvT2+nt9qGRe2N9O2qHpRbWn52zLdF4aTUlmy4jT
Osw8zvzGRxzNt+Tc9jjWTzRtdGF0Gepe5pTGjo8h0l4vZ88wacXmpw++vXeTlvfhzTvf796dtydN
TfajWbG/bbPOdvO+zTU6T2dnUwAB///////////0KgAljwIAABWk/UMR////////////////////
//9r7O9mmvTb6C890acladr2E/uZ1Nqc90s99ltLV93evbnOnb2dP01vp799ne3Y82mlMa1R+e+0
eTp+mu3R7k6dux5npR/U3JpzcqNNkX75OT/nnmlp3NuZnMnKF72tSvGf3x4vO3e7e+73vfomumt9
uns6fto3a1NpN0dH77O5ezTXQ/bpvXvadN2mz69Sb8o8TvZjzvvvTtnkz6Y/bv09nUm1N9ne53KO
j997dN66HNMPp2nfVd3mLW+x5Ox53ZprotXupFTQd+ftQHoIqChuMXhqrnPlSahu85w3EuvPzZdE
j9mz1ZzxmdRGufq976a6O3iXTRsPvWHq5zjxGuLDZkfPzzHNlQjRRZzxtvs+eZMsd3cdB0dAu13d
AbMx0EedKCrzyZz9Mbnszq2bnvXTn9lifMzxVJsVvOaKgjOaYSoKCgq93fPGqDIsdAo9KN37hnz5
HVb959tNO7lmHd1Z1Ma6rtW1EceazvQUGdTL2em006Cp5jK7j6uLVqgdQ6k7q7VA3dWUEZuiQdmN
cR0Ms2c+pzKu56mg7/dq+bOlvrzd8e+vkNw2mpBOQeWM1vx+TWk+y1tWyRufJxd9kM3a8hXmb1LX
ovs1OPxezOn269GtNfPrnNLr0Ttmy50jootL1jWDTT12XwZM03u1721KUa6Sdld3WUlu12zXb2Yv
c49TdH7R0dHvz3R8990+kpHfac6vLmNXM623orqitvAsK3Dyc345ia0n2+LpvLb+ym5wbJxLdbN3
nnnorzd6lr0Xk1pzC9m9fNvt16NdHnz65zSfXok7cWXOkdFFrXt3W1g009dl8IZ7Te7U3726SlLa
6Sdld3WyS3QWlOdsfb2Yvc49TdH7MUdHR0e/JzzU4fPfZjV9Jdb7TlA8PMK/M1tvW9UU3bvA7IyD
tveZ03bP0PuOLn5uaqx0vOfp3oMocNV+Rm18oOrv6us9S87tc/S1h7zWqmrMqyYVH12lQOono+m9
3GZqpUWqDn5ridzFA8oLur7NHQK6BXYidDvfPU9lQuPNuKLmT6b5+aI/s0dLubrlG6DOeJM+tUOm
fnqY57o4oqAzcTqert9c2409Lv261ZQ0J1fe8VBE0KHDX2ocQy8tPo0zOLeqHR8iXagN213Zl7qL
FbXfy7vtq3pv3e76vp3PUpTnajo53LeIyVDpThChfhvU+7dA9TmmjZnNutX3mprtNN9HOdcWZNa3
PbBBW9d87dDZMUPRSzW5zpmdMF37d301rpQUGza35eZReTFA9zyWKgzNrPPUkpzO3beeTg9VIOa3
OEBrWntx6oF0mpyZ6+spv3K89ic7Rrvix3d7t6t6TbmDSu+r7tyznRmy6lZWZ81roH183OTmTG9X
506dl5I9fanHX3vRrzs57Myc370vtQd+/VHau8mtSHasp52mqPKG3OGCUs96qDU9zY37e4pzztuY
U48u5zKFC5ihy/OqnprnUk4E9LV7ml2ua9zXby9TGZQMTjfec83Mb1edOZdaC1RdJxUHVXRdEnvE
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
6mMYZTVYaXlbyY81Sa74/azYmGJdV5zH4zTth+JVlMamJglWFz2tzjxCY10syruZ0vSpB0j0N6G9
iT29tCZKrxOafbTrDoK61M6hsej2Y99Wa3M1px6a7TnZBeIZDanOUq1rU5sIH6TW1qttuXTYpA/X
0FJXrWd3Mb8IJw87162xX+78qV2ua1Scq4pOJMV60tbRqw7QYaGu04yuwnMTlLMeZSMdvPOmIpME
cZFFZXtKdbkfha4e/NzjkK0vrTaN6PZyWTmFftWr++a+ZJt/Jz7vXMrjWtduzx9qMhret67dl2eU
etdm9kN+1n5WPOSFYepSpD7OTXhWVN1xnQSPs01OlQ1MrT361vx/SEi0+y8c0J2Za1ucCXkxOe1p
Sm6zsrsV4TlZMV/bQ9DpXr0MY8aKPtqj7fXrRDtqYl7agUr1odtEO2tUnrXkypqdeTMnuOtqR9Pv
ZtOZnWtLH81tteepyPW127NNezieP49Y0/fNLW9bXZyY9KZnWmvPdv5rb0m+y7P0NTsymJjXj7re
lMTDU1vs12aHsxQUOSjd+dIjJeOPoaay7q7cTrodk987P0ssnmaXbOm+aa30TM9xvwIVhzphRrq5
mvfpCG9ujGLB2fae0dp7VV5e4Y2uZLnueq3sPY4+naZbPp9b7OzH6Hq9YbpMYc2boaE3SK1zmKoz
1aUZqDdDh7vDdrNQGs/MznVJOX0Mtn7deehuks3PZtdDXmdseHyrHzaMuhu7Oz76+bV9oui5rM3z
5HcfNlqJnTPfZhjV277ZzZHGmdKLWuj15O/W4tTQxmjB4P0t5xlj93CUV/v1KPW/ZSG9zEvz4wUc
vSjtSZk9MFDTA9rzLHym+x5LJLvdJ7qX3V/JDML3e66+dFpbrKc+XOeSy71PfZiT2ut++aXa7RUN
bpL8mGu049ZeWs+TGX77508xHmPm+nvrl8+7t6HbVq29kdL6tOsJRX+/cyN79893uYl9o/gYk2HL
06UZ0pnMnpgoaYHteZkY+y6+x5O+y72pzUvsw1qx8kMyS93uuqPotJbrKc+XOPcu9b+zEz7It+zG
l2F2itYLfzyYa73OPWXlrPkxnvr6PMPr5vru/fXLv7s70+2rVt7o9L7poa5YN3JYk29HoL1U6oL3
3MiivriFAfY0t7V5qMblt6nkD+em30ZmbedZzX2pyU3XH8d0DRknPrMV7x3GjZ3RkrXeKJUPbp2T
tN8/TpF3Y9D7Kg3dCbIu65r39ca70a30787bn49X2SEUsvSPtkfTpFzLo9bN16u6CPzzyZ10o/pl
37X16opL4+3Xp06FG+3TWZ927nX9T6dPjEoI6hlvn67zH2F3p9Jxa80t9tmHa7fWcy81I5fPaDt1
uYpVOucwdPuS33z6FfbIsa6Tj3YlZ/u8xfR079r6Zpztrr8H1+dH2fzp1lKDXQpqFt5z9nYz7oY7
nOmDt330D25ejWW5zSlSvtJaQnXM28kHR77N9sE62ug81nUUetIjbfboOy+3j9pd9XfTpnW/ma7U
tLrz2Yu64uD9yRdsedseWvMHz7889Xj7y507zkx1Ste+JS5Od136WUlfbQ9oxJogKMUaD87bGoKd
SGrR9697dMnJjr3SvGvSiUuZ3U536307Y10RT1KXHa6kCilS7qcxdunfqlLvprtMSrt0xRG74Y9L
3SoOlxTlB85jfMyhFAaG7Bu2L78oDZQK/nyCalNOCj+dI4/lybs0fTq/MfapR5ZVrvQHoMyYlozn
NJEbp0mTdI+kV76no53epnrJ70uZoHetbx0EUfSrjOzGPQRazr278/TFM0R3p5h+t9KDMmZMkmas
Po/e7iNH0XuLDH2fpc6c2pk150oOmUL7XRSUrPM96JUFAkeWOLeZGc7eM1xSzFug1FQXdBcTNGll
nugj7Boy1v7zyfRM5PK75bl1Ou5NyPXWWXcj7PuPs8qW9CSVdPl9KPOtzslJfl/F269/k6Ow+X7h
TavZDBcwV9Vbci760/da6bmdduktHuj1Ry67Ue9dp25x+Pqtqdo9SLrujuddHKNzs7uR0dzuak8r
TqWfSszlDSq7lEr3Lqdczcm1JOvXVy7mX2fcfaFUt0czoSSrp8vpR51u52SkV7v4u3XuM+To12Qv
3NlNq95cwV9SrbkXfpp71rp2mdduk7R7o6PWqOd12o96HZXqcfj6odlO0epF127nXRyjandyN3O5
pVmr6S3drD4bMXNFjjvKiLn5/I6Hpa8jV1GxkzjhOexJSbPnkudt6oJPMP0l1zCYoKumPefXPGvT
bq6rkz5nMbnvOe8zpHmRKzxRdeZup596xUER983N1qbqNxbs/a8zMy6i8UUd0fPF6aN8+xUxqrhz
0ETqOnQaPeVN+VF5nOaod+I2kmkMedl26LpnQe71OTl6c41cmWGs8PpeaHspmqNM1712Swdn06WN
3rM1O6Mlv37VjUxJmty0RjA855vM8Rraw2dl0xCYnrWa3t+72M0dLXnoNrd6STd2lmk87YkNerW+
nQxpXd61NLa388GbmbzetbCVHrY6bw2+17D+eb04gxj8yTW5b0x2c453We6c5jPqHnbWGTe52+ix
PXY1rLeu3Te9pa8x/c8Hk5nyY+dtZ5CV/PvzO2pj75mthTlHvU41mr0c279T8y1eum7flfLz3JH7
8mPN7+/fPkx59+7+Iba3nbRzX21gWrxPO2r6b1mrPlpaeXeo9ZfY61K1edNXnYxx41d521lFz9J2
44ubtknObnOj8yjP70zmjMme5D7fa9vXPjWVG9e8TOp+9zupiTUiblvodN5Fzn5zc9CubJrne0jd
O3NQdu7j7XU5lBVj5o2az1ZuM1i3uKKg646t5ta7dunO1ho5jpQVOB80zeqncW3QXV1As03VkR6n
HlvfboagxdD307GqIp3s6igO9UHTtV0XbZuqy4+mW6kM1mat3F0fNEbmVA86zl7z6uvQ0xHQeNNZ
mss+3tjv1pDZcjVjVmGH3rJmULW03pN9rMFeSaNZ2/d6zxyq6Pe5PAk893a6fceM3iWXJd9kOkjy
2m2pVsalrjpbTnpjPfZ9rc1MTk17P+z3j1l670BsPMtX7rVmH3D9tZMyhae/U7elSdX2OauryTRr
jb92zacqv2j2pPBiTwbHuz2unuPIvEsuS77L0dJHbxvGpVuc90tV/eh2nPTWTfvs+1ucmpq5ya9m
5/2hGpxs/bUk9Z/Xd+XQ2zXzGmDaPp30quX0ygob7VG+230HtHq+idGaLaibmFpvKlLSoa116ij3
Q7VBaU5ZjPH4a6F3Ue4aLDW3zHS30pGKGg5ubIuz5ufVH2v2OJc3cdDnV+VZ7Hz3rdXZlXNTkwaW
5rvHH3iwx3zJI57O4ua45zOnN7HcUWXNTiqYtRTlWxzmR3qccWjK2uY3bqc+447guiyE5sLXi9z1
aGVmNL1L3b7V5zLyJy61tdhLXS9nLuY9ll1embo3Mavtf19tase6D9a9fJ/Qpx+7B/Q01i9fxfcR
qOwsQ9+Xk56NDff3prH4/BOv1qRePXYH28xeMeL1b14NeOtC5xu5L3rc5BdAvNe4q690MUxeg5PV
Kvd9nrWTle3kRm5r7bd6uj9Dhf0eXr3zx9mmnnnaXOg1yWwbpdCMzXvF9Gq/o9lg5y/ZX7W6ew1m
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
4YYW4YwbDPC9DXD1DHDNDHDbDJDPDPDHDZDlDJDRC5DHC5DPC5DfDjC7DvDfDZDFDJDPDNDHDHDb
C1C5DPDfDlDHDHDPDnDPC3DLDfDJDjC5DJC3C7DfDPDBDPDXDLDJDfDRDNDfDtDjDJDHDHC5C9C7
C3DFC3DFDhCzC/DRDFC/DFC5C3DHDJC3DHDZC5DjDJC3DXDnDXDtC/DPDZDPDLDtDRDPC/DPDPDn
DBDvDtDJDRDjDPC5DRDZDXC7DPDLDFDjDHDfDhC3DLDlDjDZDLDjDXDJCzDDC3DtDJDjDjC9DJC3
DnDjDHDFDHDFDZDNDjDHDBDZC5DHC5DNDZDdDFDRDjDPDXC7C3DJDDDNC3DBDBDFDPDHDE8QwQwQ
uQyw2wwQ8Q2wxwxwyQxQwwzwyw7QzQxwvQxwxQzwtQxw4Q2wyQyQvQww2Q7QyQzw1wzQxw5w7Qxw
1w4w0wvQswyw3Qxwzw5w3wuQuQtwwwyQzQ0QyQyw4QtwxwywxwvQuQzQuQ5w4wyw0QuQsw2Qxwxw
2Q4wwwuQzQxwtQwQ4Q2QtQ2QxQ5QxQxQxQyQyQ5wzwtwxwxw2QxwyQ0QuQzwwwyQtwuwxQuw4wwQ
7Qzw4w2Qzw1wwQ2Q2Q2QuQyQ4w4wuwxwxwwQzw2Q2Qww4wwwywxQuQtw2QsQ7Q5QxwuQ7Qxw4wuw
xwxwtQzQwwzQ0QuQuQvQtwywtwvQ7Qvwxw4wyQyQyQuQ7Q5Qtw7Qxw4wxw5wzw5wyQ5w2QtQ7Q5Q
4w7Q4w7Qywzwtw4wwQtQywywuwwwzw0Qxw3QxQxQyQww4www2QxwzQzwuQtwxwwwuQxwxQvwyQyw
xwvwuQuw4wzw4w7wyQyw0Qzwyw4w1w4w7wuQtQ5w5Q7Qxw7Q4wzwyQxw5w5wxw7w7Q5Qtw9Q5w5w
5wuQtwxw5Q4w4wtwzwxwtw4w4w1wtw2QtQzwxw2QzQyQzwwwyQvwzQtQxwyQww3wzwuw1wzw1wxQ
zw7w8Qtw7w7Q5w0Q5w1w1w0gWGeHCGiGeGaFuGiHaGGHiGeG2GeHiHiGeGCGuGCFyGyGSGOGyFyG
eGOGeHaGKF6GOGOHiFyGOGeGeFuF6GSGaGaFmThIrQxwzQzQxwzQvQwQzQtwuQuQuQuwt6V70p24
WXDTCaAIT4SQRCaDwHCa8Qkwkwmg4AAYGgiE6EmE+FUDgUAAgFAKFGE2E8EgAAQng0AAcEQpAAGA
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
9/GbCR7F2Hk/NKV1VKmrqTv5OsRNlyrszYsdOnh5Vzzb94VHlvRsjWb+1vMHZeDY33DtCm5jt324
94fzZO8g7vOqZ+qJXuT4wcKJbSU6n7tJJ8Fm0oL0IP4To7MZbO/Je7GEZuplM8pBoS8Fz7HP0zqS
mxbLh26jI82KvpyFXX7/wt+GzbdtnVtdZOLzJJYHk5jU4FfYnudQ3mSJR7DUorTQ29An55/uTWS1
6X08f/zSYOZnljIozG4tHJ2xXo10Q81pqZLedWyODjdve1Q6Qz5V0jWbZ9CoGZtBEbfHHrvjGmIH
HsVYeHOGEPgXVfRG3Dzh7aWh+s5t51DtXl0pPhcKW92bnye772j7Zf/aKZfVfO6rZrhL5lvunzAH
bG4k5sOHdzpTNfevv/WQ9vxJjBB7ZmQ2YHpx+81OSEvz986tp6ax6VajMRM7Pt1F3ZpMHsPLPN82
8zI3poyP5lZi7vnD5Jr0w5cw2491m2mTeXBdwohojHxWu+34oTS0Rtlodlq049xeTDNGI6XvJvGh
ltxqv/c81/2kqcRYy4nEe4pEU3Iido4/92bhWDMi9TdPnmxb/3R/x69LmjQnxVDn8cSUuKjgb+p7
Ax6lGGipDYSQG2cO3/hqzeeuwwzo5RU8+La6vXTQMPWd6oYXX2ZvT+/Ln+3rt3afV18T77qe1e20
eePlvg5HogNnzf3WSVbTVfviq2xfyOPXZ1mCic2h3XQ1r39F7X1tN8Lc+/zwEO1fKjbHvlwOOrhw
cG4t3mTLcTXrOH/XJJ9shHaRmvnf6Xrkf69knS3kMdOjM3uuRMfIESrHEh8ku4fFjS8t3VW7h9DV
TH15+hVqWTx5q1eU7PZDHjLK6f9Hctquv15N37iB+2OzhfifLEcaxHawYd3ejGgbqZSQwk3z7lFC
Xu/vHqUooR4LiC1XcepOZmd7Hd6eUBdTXR3cI4118Njsydsodn1bWeyn80v0Rmxg2Pt1+NJA5urw
9GXcyS29RaSlG2hzfBVr18UkWI+S7z6U4+tz90XefHt7ttf8+cuh5VYb7XnYdra7xc384/nqbLff
8o3rv8N0oGGZvprYbc3ebU1PWpzSedSP5DDenjPbSDtPS6bcaHVu5yxrVsNNFT6OOfvh1+H3wnbg
PrOKbTZPb4/9I6tM8ULkvB0tuWsyhPxx6lGGt5X6x+ch2mb6CEvGsdXztcsvfp5H9cJ+kJxU3MTY
pco1dm86fKoOHrXY2+IyUR6a5Jops/M+v/D1JjZUh6rOd3yn3POf1fHN52Do7cfa/uS2abpFlwyZ
6r/Ysbt7rl0lw5Xd7jJf+7mMkyln08VKh315/DaN5+t7becD6/FTXM866zWz1bA4I2inf3PSJ9ot
sjfeabv8SC3+df1PllcPl6fL2DpbuJFWE3OypL6c+lIS7ap55qzMTUvot5BaedK3/mb+WRqa5j/y
hRAvRHIKdxQHMyrmkEg3pnTVDPuX9Nzam7YSmffas9Hbbs4+SJv6ARHbyAMjW31MWsxrtT5eP2Mn
MQT8xGxNplmytS/vnLVtBx6V6GgzGI3yY3J35ul64ejXgzsv32dEDhWC+8AFKpi7S3OrVNfuP+Pm
qIGt3c3P9tzpWPnrmW/8mdsuPBwX9V96Y1H7szpazvSv1vp6MvQYsxnplJs3Zh2qJb/b07uebKyS
BzX0rVVfmd0z02689hZdmxLO9eemj5QvJO+WH/mq/bVtb/Vi9MJv6c072iyJ5ZyFt7xry+Bvx/t6
u+njXRnC05Hctm7LejHD95bE8EppM+c1s+9v1ZfIsxmDonM/e2zTfPFc/0LzZbSO1mN9P4k0bOBu
GztMcjTppj0vN0Nl+CHnYPbD93MCHnVYdNkgqn8y06qJ7RvZ1/chVXmo9sByudm3Znv4/95+QUPj
yX+oLH/O5rRxdkV2cP6tzinmZjWj5dHMxR2NeSxvLfQ/mf987Ol7XjdNNlPuantxTN04v/jx3RfW
1t5s/4YM1R0jPJx+dqsxhaVZR9fLEfv1LxbnU/wgT6Te2jrZywwrPybmt/w+D+JN+x19fZSIdqRJ
FZ/SlwGZDphitLNp6IVc5T66Nd40HZ75x4zGrIicszuRYfvenIxl+/csmX71GUt+eVtaqjE3hni9
+9ZqZLb/e5K2Pa6d9480ZZrpnGf7nO/3ax6lmHmhncTQIt5obpvVgT9+ecsOXiGUtpZbaM6dXtye
/xw7vXDhn77jpt+d3BrOfVd30ucTs7i3GznypbiF5hnLwWWd5izVDOsPjp8bx7pQ/Q3VjLtN7ZNN
KeNnn+LXjXG1u2b2rN3IwVvnMvMv9AtdneRyHC36rt8Jb1P/PHb7lUNbWUZtmM7tW45PD1N1w5Wv
xu76GCLGVuPMnHJLnI5mbsH44FycymxjJ3hxc199aLozn+jNIwzNXg1/dPq7zrz23BfuGll2uB7T
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
M37syE27J/W3b/b8l+Bk9clyHmabnnnn43bG3zfN83y/Vf/VfN83zfPV1dVt83zfN89XUm6r5vm+
b56urq6r5vm+b56urq6r5vm+b5/5Z+q+b5vm+dzhlvm+b5vm6urql83zfN83zfN1fN8/GQNAwjBM
HP5/P58wTBMEwc/n8/nzBMEwTBz+fz+fMEwTBMHP5/P58wTBMEysln8tkcYaRkGVkMnkMkaRoGkY
v/ks/mMWYJgmDn8/n8+YJgmCYOfz+fz5gmCYJg5/P57P6FAGYJg5/PnBnzCMIwcbnc7nM+YGL1TX
zdyv0YfxxAJsJhsJN0a8PgPpgdWvVr1atWDk4kv2/b9v3qsvu+79v2/b96urq6r9v2/b96up+q/b
9v2/erq6uq/b9v2/erq6uq/b9v2/chLN1X7ft+37r6tHF+37ft+37ft+1v2/b9v2/b/u79v31wx9
nOdp2mUZRlGUdp2nadplGUZRlHadp2naZRlGUZR2nadp2mUZRlGUdp2nafGJMnHYk51QEex8YfFY
jFKgJUAqgM8sNijKME4ztO07TKMoyjKO07TtO0yjKMoyjtO07TsMoyjJMr5VC52naZJkmWZJ2ncd
p0GSY5jmWdhy/Gi/yHn71uXRgJs6cuRzCodVDCoIVFSoWVDGZzuTy2VzKoeVCSobVDGYz6ocVDuc
/ctmTrOs6DqzWw6zqOs6zrOs6zqOs6jrOs6zqVDaobOvLnXlsj09Kzpn+tEtI8sP6ZL66GMzMmZO
3dmZJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJMzN85nM5LXmczu0ZnM/DMzmVjczmd3RmczPvzOZ
88Fmcz9tzOZ2XtSOZkkkkkkkkkkkkkkkkkkkkkkNzFmGbeZWXtSOZkkkkkkkjTk5g5PKU1ZPKcDl
MnrplV3hmRxX7mMvmTZ80v19T2dnUwAB///////////0KgAllwIAAKtEHK0R////////////////
//////99fV7n19fX1e59fX19XufX19fV7n19fX1e59fX19XufX19fV7n19fX1e59fWXy5xHNm85l
8vl8vmmnpqy+Xy+XNkjG9svl8vl8Jmc4ZmXy+Xy+81Woy2W+vq9z6+vr6vc+vr6+r3Pr6+vq9z6+
vr6vc+vr6+kU0HJlsvl9nal+vr6+r3Pr6m+ojjh3etkgApwzP8L/zpgOjjTz8zA420+Zq6tX/zXt
7e3t7e3teIHpwFeM50+E4/mw6lQDk8nNNNNk8nk8nNNNNk8nk8nNNNNk8nk8nNNNNk8nkz7+pvn8
VAZ8H0f/79fn0fp8n0qA/38m3ZbJ5PJzTTTZPJ5PJzTTTZPJ5PJzTT57KnZk8nNNsmymT/8n9ff1
85DJte3tZzp48OfmeSTdH3OXh4fDKu/a/a7l0dFbMDXgxfvfXA6zVUCGKxWnTp04rFYrFadOnTis
VisVp06dOKxWKxWnTp04rFYpQGe+n1wKgWUBCgLUCWC98DgFAeoClAUoFsHgtPljcVisVp06dOKx
WKxWnTp04rFYrFadOkx8cbeKxWnTr04rE4XE++A9/XDYniKyfe2uAml418evPR/ZnJ6NOJlpqp8b
ZcP2enp0V7NglyNC7H19nZ2dnZ2dnZ2dnZHZ2dnZ2F2EDo6OirJmxgvYOS9M7q0yYTs7Oz+7Ozs7
Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs0eHZ2evj2dmlvZ2acL2dnHZ2Ak7OzI7+z
s+JOzspfHZ2c9nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2YgwOzs7Ozs7Ozs7OyKdkuzs7F2nsdsnZ
2NKv6Z5KgzwN7s4Izezs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7J8xtyPZ2dnZ
tlOE9+zs7OyjPMxuzs7Ow2zHMjM9nZ2dmsejs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzaZc3z2dn
p2dnZ2dnZP2XBQh7Ozsbs1OMvZqy/Faaujo56BKeIrTdhmlz2AY3oYQyyVHyrJlOzs7Ozs7Ozs7O
zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NDeylZOSonegt52l2U7OOezs7Ozs7Ozs7Ozs7Ozs7Ozs7
Ozs7OwI89nZ2dkdnYk3llVo3wuD4bAtpr6OiaBrtEas+MSGvPZ2dnZ2dgASdAOgdmwi/mfGP7Ozs
7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs3g7Gsnlo2BaXEmunZXsnk7Ozs7Ozs7Ozs7Oz
s7Ozs7Ozs7Ozs7OKydnZ2dhdnYkXgNOit+LOPvXqZLkPuoeZNv1o+Y3ZCV9OJp++mzTRuL1fvOvJ
h1MHmdwv1jH+dBznQdKoWVCioVVCioUVChznOc5zqhVUKHOdB0HOqE1QkqElQmc5zqhNUJKhFUIn
OcpzHMcpzKhJUIHMcyoSVCJy5jLzHB/jh8nnFxxHGcvkHnnnnnnnnnnkuOOgwgYr5weC0b/Yxae7
Hx/x0ZT1m+ssqAX6LKjMmbx0E4GePsoA/f68fK7xx7mqoCTRzSgUUJprmnm5TB2+SoTxyoFlykGE
qKPtmDgbepw7OQVLlszeegtLG8gBSsU2CsLmatBiadrZ2zzztDO2ds7Wt6Ois+TD8BXg+c9KIjY1
lAVXuLJnq/R7eoRIiT+OtleiutgZgAY2KbBW12TNpR5JGSMlllYyVkrJWMZo0AlxLPQujn1MnfWt
YAEPLs6IIOiKR0ZPJcFRjaR+/R4a8INcfnGvBwef2oELGmtqd2CGgENEv/ohqzXZMlgycxlrz9H3
veZmZmZve94MEMAMAMD3veDADAZWX3veZWUMAMD3veZWVlZfe94MDT9P0/3veZWXT9P973tO09lZ
fe95lZWVl973tP05lZfe97T9OZWD3vetM5rPve9d1BkN73vMDKx+972rREe970REe9734/Hve98h
73vYZWNjsaq1NzY5BjfW2t0tRRamnR7DaLHsyggdHIvPE6aztJBr0vR1VCgfmkqqPWO2GTCqi8OJ
t1wPshq+vf0Wg21VC2pIaFOOT9Wsy8WktGcKZNgz5sRH/u6JCbuszzqqqqq7du3KqquXbt2qqrt2
7cqqq7du3aqqu3bt2qqm69eu1VUlduNlVVFy5eqqi5cuXp89zh8EH4n4+o/p8+KeNxVc5lA1BDrx
jPm1H/5d7EPe1x6qnd3dgYGBhd3dgYGBgd3dgYGBgd3dgYGBgd3dgYGBgd3fFu0wO7vYYLaLu7zM
md3eS8u8GQg/zxXyCE1j79fjMHePS7kIrhdSLuf7M2ED9Sawp1Kxc1fUbT2NJ61ZDNvJ9Jt6lg+p
2TdEEk+JA5AgyFixYtwELgWLFi1CLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFiwyxYsWLFiw
yxYsWLFixYsWLFixYsAWLFixYsWLFixYsWLFmosWLFmDNxjLFixa/chAsWLFmnQ1AQLFixZlLFix
YsWLFixYsWLFixYsWLFixYsWOWLFi3gqQaNAuah+xqOuS0fQ1pi7ZmywRwGWqgVHyeiyEHctsFkr
GWFm0VqDFVUDohoMOoKoAlUATIGtoLhka74OUMT3USqgX0zV6ZiAUIApWXIni65dIyMiz/1R6M8J
Q5VUx/4ixYsWLFtoWLFixYsWLCLFixYsWosWLFixYsWLFixYsWLFixYsWLemixYsWLOW98sWLFqL
FixYt2xarZmP8c4MR5S+LlennqOe4eSMWEi3eHrP/R94zxlCqITGc/ksWLFiw+RYsWLFixYsWLFi
xYsWosWLFixYsWLFixYsWLFixYsWLYmCxYsWLfLZgsWLFixYs5YsWLFixYsg3aa0R7FGPnseeMfP
anMENHMhPvminv2PfZGlgu/5BF7bEhPVHaErXVnozE1tko/eCE93GSCHV9qam0b2P++hd0TRtIZi
Gf6S1Mja12WObpB21shBss2mlLuKRS5Tjjh2HVPaqkxIMwazWwaNjVEw+jB03WUMEPCLl2TSya7q
nmnvOPmMjPRhtaUSwGf8P3OXuMX4zFV2nGiU79oaE0m9BoxTkM9/9GfZj3iGag9WJd2LHvw6T/fN
5k//MRFJJxrb4hFPVWHv/s9+PMSZDH/GxkzxnJAxCfIO/I1plZ+DH27Pj5tEDAhk0G4fpHLAx6YG
NbIJ6MGKwUQwyo6Gzt1zQdB0HQdA0DQdB0DQdA0HQdBDHDH0Fm0FmsyUUlFJQpxa2BgtdIs32cyE
47Q0TU86IggggggggggggggggggggggggggggggggghojFY0TRNF9omiaHz0TRLPWiaJaZ9E0TQ7
eiaIxs+iaJho0TRNGZdE0TrREEEEEEEEEEEEEEEEEEEEEENc10OjW9E22tEQQQQQQQK9aCxsGg6F
oOgxoWgm0Lt/t11p01DWGhlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVl03TWzV9L1
nTdN03TWm57Gm6bpumxY1cOjTdN03TWz+raNpum6bprSHF1btsrKysrKysrKysrKysrKysrKysrK
ysv1UCyqCWzoWm6bqX2VlZWVlZdAZTn0PQ9C0Hhj+iaDoGhJJWOkCByBDxn9PVrrLH02nEgggggg
gjYRkoUtPm1e6Uv454/jGMf//+MYx///4xjH///jGMf///WEET5hKwgiimftNG1g3///jGMf//+M
Yx//4xjFhCP/xjGP//0bo0VE3nTutupNja03Wtpar3d7UpRveq5cuXLly5cTuUUA2Lb5aWD1f+Z/
eOc5/e945zn973jnOf3veOc5/e964e7eNh7F+7evWDdWL7UdL3veOc5/e945zn973jnPeuP7xznP
7xk0k0nf3KDW2to5sCWUDt2oRYvNJ2tpvpan786G2tDT1ocNF9qs/tW9D6t27du3bt27Vq2wMFvR
NFtVaqwpETvkPeq5c9g3OL7K3NzF5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm
4g7c3MDtzcQbm6x03N1sg3Nzw3NzEi3N3dtubsebm5Bubm5ubm5ubm5ubm5ubm5ubm5ubm5ubnu6
m7c3Nzc3Nzc3Nzc35y3t5m9v9De39t5DoaaqAOgxw22zOg6DoOg6DoOg6DoOg6DoOg6DoOg6DoOg
6DoOg6DoOg6DoOg6DoOg6DoOghjhj6TpiqAvSAxwxwxwx9FRyHQGOGOGOGPqjaHSHmGOGOGOGO16
cyMgY4Y4Y4Y4cIfxDQdB0HQdB0HQdB0HQdB0HQdB0HQdB0HQdB0HQdB0GvWNC0gMcMe6vQdB0HQd
B0HQdBrnoGgaDoJMh7QNA0HQeifPlcvHTPda7xz3jtF5t76v5u3bt27du5v3vy71yhhsYNatWLFi
xatWrVixYsWrVq1YsWLFq1atWLFixatWkLNhFHrpDCNiwjgxjWMWLFu1atWLFixatWrVixYsWrVq
3YsI+N1atWLFixbtWbFm3ZtWbbzwixbM5mE1s3Vvq1bMy9H9LAwMDCwMDD1at+l3ficbZe7TaWm7
du3WlpaWm7du3WlpaWm7du3WlpaWm7du3WlpaU7925dTSTPdu37p+++72bt1qaWlpu3bt1paWlpu
3bt1paWlpu3bue0mlpvXr15paL95oar7TfafxwzbYmiaskrsZOxMyTZ023Wvu5YRO0KshtzcwqyO
nxe/91WR66qyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWRSrIVZEqsiUaYO+rjnZG3VuyVfQVZCrI
VZB1WQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQ
qyFWQqyFWQqyFWQqyG1JVkKsgzQqyFWQ2SqyFWQkdVkKsi7bVZCrIYPqshVkQyqshVkZb1WQqyLW
8VZCrI6VZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrI00OVVkKsh
VkKshVkKshVkKshVkKsiVWRetqshVkZVZFfyqyFWRmkkWEhqqrIaFWQ0KshVkKshVkKshVkKshVk
KshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkGSDJMq
yFWQqyFWRMM7OqyFWQqyFWR1qOtHVZCrIVZCrI1Fpa7SrIVZCrIVZGokDKshVkKshVkKshVkKshV
kKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVke1vVA4GdVkKsjV1WQqyFWQqyFWQqyPqshfl
WQqyFWRWDOIh5VkRDg+rMVDxXLjnv34pVkKshVkKshVkKshVkKsiqlJ3/Fct5SrIVZCrIVZCrIVZ
CrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrI3VKsjhnf
7j1ARJGol6dVkSRVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIIEN4qy
FWQqyFWQNVkKshVkKsiY4OOuXx7Xz7zFZ/EPFcuJ08f/SrIVZCrIVZCrIVZCrIVZFVC0xuaX4zzV
ZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZ
CrIVZApVZHIxLefefURl6/MKsiCKrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIVZCrIV
ZCrIVZBAhSpPZ2dTAAH///////////QqACWYAgAA5yD74hH//////////////////////8hVkKsh
VkcFWQqyFWQqyI9z/wfh6oSIJIxxexYwm3JIInIItd4g8Xfu0NjdTMeKyL3SYV/+iKKCVrLb2Qva
g0kHrN5t1OmjFlO5ehphJhsP3auWhvxIV4gcuRMc1NGkTb18PtvDzROHRr1oMxs0MO66GfoQaWWe
g7mkOBqvcQkq1qfCWY7IeyPupeBVJc9VMQ4uHCJn1O/PkRIRxnn8DZ/yNcoQ6zn4+6d/ip9qeomP
uLmRqY/U/ohwkgN5oh4FT6e7fCZ4SZ6dj7stf8Gu17UcdBgtdxNJKx3pB4j91sssTRUXK5tnLkkQ
IdJ5eUXx1YvajFH7T0SzoGiRDYfSrUG0S4xW9a7RjJb5kvXe9FZemXS2VVQkHMmqoTnSgwID4Dka
m8PbQNc1whpNaeHzrbEy8I8QAxD4FR5nOdzJ6E73fRTkIflUfghJ81mnzgu4FBGhixkB4mcnme+c
v69iKd4fhP8PTxnHRA05xOIN49QC9bR+FHNxFbY7bELg+ravttnYbPUX6YJSaL988ftHOQdjZHZ2
qO4acO7uyMrIyO7vp2nadpzu76dpzIyO7uyMmm6a7u7KyMjI7u+nadp2mu7uyMunac7u+nacyMju
7sjIyMju76dpzIyO7vpunMlt3d7dy153d2dlZdDd3fRtMZGR3d2FgYWF3d2FhYWF3d2JhYWF3d2J
DtJ3wk6F+SFlheG19FYNBiz7TAxtAYm4q9Yzn3zHym0Vq7TVvR9Kb3IBlhrGua34Mtn0cPMNGwqg
pDBY5DTYLt9k3PNFJLEeyiQ59e3sVJoUf+bcwew6kpGc5znN25nOc3M3M5znOc3E85znNzNzOc5z
cuXM5zlubLuc5zm5/Oc5zERnOc5jMRnKf64VwzxztYPORcOHF/E9pyrlRCsyQ9MUIwEbnMmmO7Mq
SmDGMbrphYDGMZg6YOjGMbozAwGMY3Vs1sxjGMwMFsxjGfFroxjGYPaCYxjY97oxjG8bGDGs4fk/
I2OZtj3VYnlRCMhQnPGeDxTm43t6Dm1BBU7TygMQMg7s2e2CaDdTZW6naatUbM7fOdKllSypZUv8
zCpZUsqWVLzMwqWVLKllS8zMKllSypZUv//CpZUsqWVLzMwqWVLKllS8//KllSypZUv//ypZUsqW
VL//IoqWVLKllSyK//KllSypZUv//ypZUsqWVL/yKsqWVLKllS6CkmoqWVLKllS2qp/kVLKllSyp
dSUPIoqWVLKllS20pMpUpYqWVLKllSylilililipZUsqWVLKWKVKWKVKllSypZUspaq7sqWVLeqn
tOezW17Dbu1RK0d6oQbU+9p1X161HZZwqW9/qt9q721b1MUG2tAoUwUNvQ7Ve90+Uv0XfoqgAS24
1Zt4dwqXVs1uvPMFhgvIck11Bbm+++//3u+++/f7++++//3u+++/9/u+++/973fffcNDn7777x6H
N9999999999999999w2dekgfwK84HkGZ+T33lSeZnmBxgvHOMW1QVDwUKFChdy5QoUKErldChQoX
fJUKFChcrlQoUKFylKhQoUKFRqXQoUKEJY0UKFChtsptQoUKClDbah7VJzdAg59Cc8zJuIIcu7lQ
oQWqiqagqFZkIGSAqVRbH6Pt27XSbWxupd3aqU3RUVFBQbsV9A3oEG5UsqWVLKllSypZUsqWVLKl
lSypZUsqWVLKllSypZUsqWVLKllSypZUsqWVLKl1ypZEkSRJElSyJKlkSVLIlTtG6smEFPfCJQlS
ipRUoqUVKKlFSipRUoqUVKKlUSpRUoqVxA2yxA3VVSsoB8pduqtSflMaLgbSkygCpYKlOd4VLUp0
ykKlyqygNFjVVaAovRZbW2aLnU0WsUAUBoubRZzRotvRZfAqUC3VfUBUvnzAR9QFSwgpIBY9BeWV
KKlFSipRAkDqCpRUoqUVKKlFSiBKlECVKKlFSipRAkCVKKlFSipRUoqUQJUogSpRUoqUVKKlECVK
KlFSipRUoqUVKVsgSpRUoqUVKKlOFSipRUoqUVKKlFSsKlFSipRUoqUVKKlFSipUuYuHdob8U+Xx
rBySNGjRjw9hUqIYkFofQDLmVKKlFSipRUoqUVKKlFSipRUoqUVKKlFSipRUoqUVKKlFSipUSpRU
oqUVKKlFSipRUoqUVKKlFSipRUoqUVKKlFSipRUoqVSFlSipRUoqUVKKlPgqUVKKlFSipRUoqVwq
UVKKlFSipRUoqUVKKlb95HECsoqdp3uILeH51kaOtl47ZUruznb2lFA10qj2U62q01GjnVeoKO7Z
PqC9pylDqotrqBRs61URFspIG1obKvZOKNFFBJvlu4iaNFy6LG+6X5Wyio0VQ1UpVZVTVov0ourl
KiQVI2NNQtuixaubqLQNyhSmChGxl19U2pzKdDbiJj3zqBAEFLmLYgZPf7g5bLwMorjOM60RaJkj
6tZlRK/1BaCnzGC0A92fP7i85+w+vlzY2SGYvEeL2pSyg00ajaUDXVJSqmyDb1G4pikBdTSyqZPq
XLvOMgbGzG+aCgUByk72e1RUWuk121bKVB1sqjbmi7NF5TGZxTN85sUK0N1TqtpSHGyo6uKYKQKY
4Ug0tctFyNveqlF6LgKWKTRXzMRSoV6SBCOvuhDvKdJB8McG0fZNYg+NsvsnwDn2iQ3jntLMOvgB
VDKdJB8MdwqRs9ECsgtwdjbBb2PDF444L/l1Q1VXRtybRS3pfUxRDY3UimGzfbdr2pFLVcFJUNkF
Vd7vRa2uTVJu6KFO5qoKNWymKGdUbakU5s0KdqIcaileTQclbrTCgoU5JXRcWxR9V9qGjVOxSRTl
UaLrKGVKAKUQfZQRTRS5QVUIF5vZxJJAgQdQIFd5/fUAlLeMZW+9fgcYHOvMXH3+oHld55ckGT5N
SDm+BA7mX7yD59tlpVVVSq1BWdPKp0XCU6Um2aLlKcb26qKdWUykdFx1TouZubCkaopdbG5Wqmyk
UO1UqVJVWlSpUqVKlSVqhvpdV7ifcNys929oqme69RUShKgKJ2qAoQoQoQoQoQoQoQoQoQoQoQoQ
oQoQoQoQoQoQoQoQoQoQoQoQoQoQoQoQoQoQoQoQoQoSoG7tQVAUtvUFQVWKgqCdU1BUBS1U1BUF
WK1BUBTNXVBUFBvqCoCkKpqCoEFQFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCVNos
vRYlTVBUBQhQhQhQhQhQhQhQtR9yo6jpVHUeQqOoxUba3lC85Uui48u7u7u7u7u7u7u7u7u7u7u7
vnLQFIU+c5ynlXlN85zlVlKFJlL85zlOdJr5znCmdFwTUUu7u7u7u7u7u7u7sFDFD3PnBd3d3fe9
mx96x3QqNRSpWupNtqilUFSUGmVPt0Wii0UaNGTS0XtNJe6BBiqt3dqqqq3d2qqqrd3aqqqt3dqq
q3+dezveytVVVW7u1VVVbu7VVVVu7RYqrd3aqqqspSV3YWGmqrnZ71RT27fG5ubm5ubm7dsbe7br
doTQIL5RoZmZQoUKGZmUKFChmZlChQoZmZQoUMgOStyV85zfKNChQzMyhQoUMzMoUKFDMxFyhQzM
yjRo0d996KjPD+0tkDsu1K0bKULUKEQcf4goyg1zUtSVChspKi0UKKlUdoKKUKFBShQoUFKFBShQ
aaDU+zYhYkA5krt2qaRSVOQplJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJFJ
FJFJFJFJFJFJFJFJU5Sp00E6dNRDTp70KdOoOU6cn6dOj2nTqyjTp8ynT3+mUkUkUkUkUkUkUkUk
UkUkUkUkUkUkUkUkUkUkUkUkUkUlVFX1bVFP6ZSRSRSRSRSRSRSRSbd3G5uk3N1tzdbck3tn/Rdt
1bouLHqtq2ratq2ratq2ratq2ratq2ratq2ratq2ratq2ratq2ratq2ratq2ratq2radOr6dW1bV
tW0saKiq2ratq25SlVtW1bVsqVLaratq2rWiXKpqmratq2ratq2ratq2ratq2ratq2ratq2ratq2
reaL50Xq21ZVtW/VtW1bVtW1aUhVplJlJlJlJUikykikSkwq2dn2m3Uu4242tlKdBXOb7777775u
r8rzlelvmTnvvvvOc57777znOe+++85znvvvvOc183fz8xcPf/+N957znPfffec5z3333nOfd998
+c999959zqvVVe5f7WHbeldi0FyoUO3xRRRRRRTimw5y93Gja+SlKUpSlKUpSlKUpSlKUpSlKUpS
lJYSQWOchjgF3ikpbSlKUpSlKUpSlKUpclLaxKUpbSlLnKEqFDl+1VVVNQq0LxUUaibpVRVnGpS+
1cVMmgoWVMlk0DBnSpm9QEEVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCpnSpndqCEN1Nr42tpUwq
YVMUKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCph
UwqYVMqFqKmFTGxpKmFTKgKmFTGmpSphUyrG8qYVMbiphUyqKsKmFTKFMqYVMbERUwqZMyphUwqY
VMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCn6lKmFTCSphUwqYVMKmFTCphUzypg8
qYXsqYVMzyphUx8qZLdoVVKmNBUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTC
phUwqYVMKmFTCphUwqYVMKmFTCphUwUd5FTCphUwqYgmgqkqYVMKmFTLbW7cqYVMKmFTFWzGsqYV
MKmFTG5BhUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCpjxSVRfQKmFTEBUwq
YVMKmFTCpllTCphUwqYL8qZ+FTJV89gsXkIf0+s08bL/hUwqYVMKmFTCphUw//mM399GK5UwqYVM
KmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMfKmZ6OMYeWi
F8RlTPSFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqZryphUwqYVMKmaZUwqYVMK
mI0cQW8VvrX7AOCH9WmJ9br+RUwqYVMKmFTCphUw8/vWa7WCP6xUwqYVMKmFTCphUwqYVMKmFTCp
hUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMQFTLkEfwiEbnrX5UwLFTCphUwqYVMK
mFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqZDyphUwqYVMSFTCpmpKmI68PRjHv2RbK2yqqNXdqm
qFXanV+NTRUbRSyr6bVvKoudqhSjk1Eke9VkEAQcQfyXGhoHEE9mtp7Qg0T7l0qPkDaBBfYWLoK5
UZQtFpmo1lLlJ1VVe6lQlI9q/fEFS1VVtKDAghBgo8QOPX2M0Crr4y//IXDMZ/tfAwitJheZUHoH
Hh1A9MP0nBeX/84yR5dopDrALvGXAvv4cYfZJq8YvlJAgotdV06m2qHZsoNFUbKYqHKVUVJSEByS
B/JVAgoXvdU/Rfh/aNtiGhY2VbG7ceFaOi31bm051T2xSo+0ikamqnRcTX5TlR2UvUpRNEVLvlQb
80VQvOrSi6tp3yjz5/Pb6VDrP7hAlSh1A9DPfA/4dYF4lSGZFMb5Pb6dHvYY5qypWdGOR4EGYBHj
NERhrq0YIkOykOIHJ0lEF0v9gQIMc3m/2+oGwU9kF8djJ1y9/t+gh9BLGnglQocbN2jra2N3UE9n
Z1MAAf//////////9CoAJZkCAAAhccx6Ef//////////////////////b1SUA2Y9Ycfnzl0p7ZUO
yBAq9LKvQVPwSaXaVStn5Qdb+vce7kpIeKrLjqnj+qDscz0PJZk+4gf/8n2EUKCksuJqYPnqKF9j
mXyV7d4gdld3tJ5B7mVDVVzqhT9ggZvVlvvjnZjflQ0G6g2I3h3tGe6CVQt6D5SbqbfugbNqVU7U
7qL6e3KDRUbzz/BfcUn+3ajqBt2qHoo77M9UZSZKaRsbNuSxy3t5kAOZpwlFIQWYECn8g0jrnQ//
F+boXOdf+hOc3Msv7TmmNopNfmBBQfyXtI7/ECC95R6ohfnx0Nm22Dbwk/ne5LfKrbFaqvllGlH3
UrRf3s5PZQK9ei2NnaLQ3daZVE9yc5znOc5znOc5znOc5znOc5znOc5znOc5znOc0E5znSxWlOc5
1YUxTqic5zq1snOc6hKAKCKCnOcygigigigpznMoIoIoIoKc5zKCqGc5z3qzZtxsp92oVRzg5+7m
+/oJcqkLqDO4gQVQ0T7TUm2N7ZU7VTnWocFt2U+fouV6PIcauq/lLtA/z3N721SBr5vvvvLm+++/
Ob77785vvvvzm+++/Oc3333vL33335zm+++6qqu+++6u6qu95HJ3xad+x1q1ZOM72Keu45Helu2L
9xAgc3vav9Qc9RRRTM33UUUU3zfFFFFMzfdRRRTN83UUUUzffdRRRSk2q4ooopm6tJRRRSjRo7KK
KKUaFGgp3jnNs78sHsrKsWznJduEKz70KDRQMqqYVU0qplVTJYFVSVVSVrnqs80W7oNXV189BeVZ
zRVcqioqzmmqqY3U3d3VTyqnlVPKqeXd3VeqvVXqr13d1Xqr1VPKqeXd3VTyqnlV6q9d3dVPKqeV
U8qp5d3dV6q9VeqvXd3VTyqndV6q9d3dV6q9VTuqnd3d1U7qp5VTuqnd3d1Xqr1VO6qd3d3VeqvV
U7qp3d3dV+q9Vfqv3d3z5V1XXd3dTVTuqnd3d1X6vqu1XLu7qu1XartV27u6rtV2q7Vdu7uq7HVl
WXcdV7nq5xGioKCKLDni5j0BufOagi16aJbXNURVbVTSrqvtVBnzIx6DV1LOag7GNVSBVZ6GyrIl
MbzdWVUy7zXNNSaPFNHOueqnVWpHOc+IxjnOcyMjnOdIxjnOdGRjnOdGMY5znqs1UwiRznOc1V3m
Oc5+eOOznOeM8cZz8/egXMlkWa31s7pjxndRMSOOKajjXPVTyrcuKKKI91NTFFFFU3U3FFFFd1NT
FFFFfPfPFFFFdTU1MUUUSi57iiiiNz1UwqYoooubm5jRRRRc0XNzRGqFQUF1c3s/PfbXSgNFj3zV
EWzVUzqyrqqdGvIwqr9WRKKh7RmqDVN9MmqqdVfZjVddVs1VMt9ulVAK9HxHVcw/EqzmVVjido+N
V26q3qtcTAeoi5qtNV1X1YePKHOY+VFBQ1fHVTKBvcBxdRfNFdWZznq6q/VaqztQG7UFVzKCqwc6
oOwiEd2NZfS7dD0kZnxvaqAJT2uLgi7cc1UNn8Icx/DGPzHijylpZaWNCgiV9Gc9D1kcWVUAWHvr
xTip78eOqE0XriqTM8cVSaOOoO6XVLM+81jyznxTKuufnoI7oOa4+0XMo3zugjjoKs5nhrijPzn5
nO0XN6bHVY50tVbU8xlFU5VYiq6q5VTjqqDW/4cZj899j5URnuOoq5xR83NfOrNVnMzXeaqbvfPH
lAzSVdzmT3RvDG+5fZc5ka7nfPOdc+6nnNQWbyro3Mao18uM+/Lzo6sjjbjzJmkpJ3fvmVF8/R9e
dVWYlzVfzvHo1Xxx0PNVZqbiizKhZFd3QGXMbOsZvwo06lUHVRR9jRRVUwiqsxVbVTOrKrtVILo4
8TRjuhqx0N3naqnFTVp+aoq0/NVZqLoqqc81V6ObXRvxcEjTM5VmZl1dVlXRNqO8Idj9svdGui6K
j09bkujrsvurMw11fVlXc2ul4e8lj6WZ0d932dG0tS5lHIaM2R826qYx0EdX1ZFFdVOaqZVe1QVX
KujquVU3q+PG4zHOubtRVXI4zqI1X1WOerLPVdMegs1BHlFHHVTmhznzI9UHAh96g24qr9V2KPD1
WKrd3H2MbplXUNVq/Jy56LmkpV9MfCHq7Xl4Ox9VHAiR9WsosmbnfUlOmjN6xna7XaPXN4l3Sd6O
/U82r7VdFlTvnqOnararFXUFBV1TVYoKioq43PHVaqv3zVaerousV1NRQUBzX0qyLdRUxR83NVdq
uVNV3myr6qdVU8uq5V9XVWardnq+rar3fLTjPz0HPdx0LjquVJ7sy2qGgquc/ZSni6T57853pmkc
45jD+TGZcw6HeUPbanJzpQnvtOc85aZr100mri6Tk5d5PT2UOp6h300QqKmoj3z8xj0EVXVZVc53
V8V81VMKCr8vnoKCPKBo3PzxxfM6VMdVy3QVWajI+bKCPZ6rlVjInVsVXc3NdVMOeL3PO3OagNUV
XOtWdak1zlWdTUFBVZq4zoI6qS6qf1YzNZ1Z7ypZruWvZqDMoFi1Qd2e8qU4u2XKY770FnoE7vp2
oNVbVTSqm9VMXjoKqc1U7qpxV1V2r6Cq7Vcqp5VTuqnlVOaqcVU8qaqcVXarlVOaqdVfVcqp3VTm
qnFVOqqc1U4qp1VTuqluq/VTyqnlVPKqeVU8qp3VTyqnlVPKqeVU7qp5VTyqnlV2q7VTyqntVPKq
eVXJyruaJYaYIRXVYPVTGKqnjiqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1U
xqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMYosiiqptVYiiqIolkUWVZFFVY5ooqr
NVNIoqqZniiqphVTGKK4qqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1UxqpjVTGqmNVMaqY1U
xqpjVTHmq2qzzRRVUxqpjVTGqmNVMaqY1UxqplUVZzVFRUVHnNUcxnVYioKr1BVSJVT6qn1VPqqf
VU+qp9VT6qn1VPqqfVU+qp9VT6qn1VPqqfVU+qp9VT6qn1VPqqfVU+qp9VT6qn1VPqqfVU+qp9VT
6qn1VPqqfVXqryqyoqvVXqr1V7mUVV6q9VeqvXzc1V6q9VeqvRRGVV6q9Veqve1EdVO6qd1U+qp9
VT6qn1VPqqfVU+qp9VT6qn1VPqqfVU+qp9VT6qn1VPqqfVU+qp9VT6qn2VUoVU8q6q5VeqvXVT6q
n1VPqqfVU+qp9VShVT51UpVUpVUp1UpHuqlKqlKqlGqlOL2py9TmYa2szMzMwrNdb5uaOOOPm5ub
mjjjj5ubm5o444+bm5uaOOOPm5uapjqalZV1TV9XGyr44+eLm5uaOOOPm5ubmjjjj5ubm5o4485u
aOPnj5ubm5qvquVdV0XN66t7c9Tz3Hbi6y5d3d3d+TWkrlRm6uq6oqKioq6rquq6oqKioq6rquq6
oqKioq6rquq6oqKioq6rquq2oq2qxZ6rNW1WqrEZ6rNRUVHPV1XVdUVFRUVdV1XVdUVFRUVdV1XV
dUVFRV1XVFRVlRV1XVNTVYqtVWKrFTU7VVOaqaVUgVU7u48FWxGoKCgPFG+a4nUVb0OMygnBesoc
ojCoqpzVWNGJKk9Vup59Zd5U1HK6qAJKmqnEIquhz6hVfuB6iBshdWQijhqbhFVXFXVFUlXVA+8T
qDZV7iEQNVQBIz9r4msfE690uJzG6z/E6uquI6rFXc1wvjZxfnRjVihzVC9zvTPI83lUOqxQpVQB
DM9g260z52k7MeSjUwKN1VtJ2qi+DsKX34zuhnGfspjztO9Dec+VQ7fSNfVVQBDO9AsVJP+9Gl99
mf8U4KNVVtO9KovpTqKXyXJk/Q5nJUmqp3mVWubnPnWpqpiepPne6tyraBtYeI1A6toKigmIrXRv
LPFFzOhNznUXaq1Z9e3chquNRx1J7VVg1BQvniq+qm/MrpL8o5dzmmtpmP5eeZsSLpvTx5MGj8f2
kw63l3pV8in5OfM61bdTlXUD6VNVOTVc8NQRR1ZV8fS45tVE5Vdurris3PiNHVZjqup1FWRVWKs5
8qDVdVc7TDuZNZrivLM6CNRG5tHNQa7UF8xvcbjpKOK8fPQGzTygztMdsMjntoeZEZ89BFeY6DO2
u+zntGNif8TkfaOPtz1W4qCKpj3ln56rscayqmVVMufmcVXVZZ9qpj5jaoMugs+d6soKCOPnMY3P
EuarKA1WVXars4FfRaOtUBs5oueNXURdObnqprVtSd+vXNWI1ZUH3wRiXUUV5GY3dNduw8dqZ24q
SyNW1Yfai79RRWveeKejTeO+rc4jPWVDoMyKPfNPPm7acchpjIjGjcdW5UaWYufoc8VB051tdKCo
5lhoroKCI6fPG6CgqzQo1s2c1B7HfQ3sb3zRc/NlVPKqc1BrezxaNFb6nmHkeX0zXZ70Q3QG3eWP
dxKKKyk5QePI8u3m2jdNrVBHg0azEN2megP2UcfPQVFGlq86LZlQVXIzKrLzzyPfNGbm7a5+3Pcf
MqCrTVbQZHz26jmjygq2Kq/9XTgXjPGePmyq5HUGq51LPVYoKs+XEbtSmd3hCr8oIjedlYyreZrt
keR465zx733J1WVmUERvIuts1W8zZ+zNzHuvzHVYGi5tdtP26qc1U8qprVTJK6rFXRRX2x1J+e1F
zVXsNFVvN98qpjUKoOaOr+xhU5VkSjjjnpefn7YaOp74zxHquH9HPHfPneq52syqD51mDx53POZH
zc0V4Yzhm8qaKc5olZprnyKgZ+fDZ7MXVyRue5PR4aO2KminObmR6GpGZFQSGqDnPmeTmVWLZ6sN
L4JyPmWRDMNm6847vtrtlH2oaGhs0xNzFB16Rps3dPL+67X2PEOmTLTZp7DG67zvqcolVplrFFdR
fO+ZMxu24qmYPnPbsJ7WNdcoboFYQUeu0xtCtBGQRt3dbia2uuUN0COkFGpzdpVg42LO8yXi7B7o
zXRK5950qsVffMbL88UvMt5rtOeZZ41RKgvq6snb+Bp7o7XWgeo1dqLvHdVOzSpDeS6fz2PUyswN
eDMvzKD5vnmIpuVZmQo8fpa1eFPc6hmcR6E09FFz1J8oMNzVdUTlQ37QRG9z2dNmOObNZ46Cg7RR
e4JndBM9oprOk2pw5+hsuqnVTzfy3cfztkUdrzD6k8HZb3236SYmOf52NFz2vMjfn8db6a6amCOC
z6+9+tBZqh1J1fWrea1m+idxmt0nalyOh64jnUccdV3nq+zVXpjrFOUG9rstH2zH7UFXVGn4evHH
uk1lxdq/boV5406XVxdl7SdOyygPz1dEfKiqxV11fNXhqrGzvek0otmx0G8Ot0EfagoIzXdyrnqs
5QOK6CcnKCgs9VO6qb8x2cj29uu9XXt13kzIG+/tuj/C9XXMqytTtYgN813FaqXzYe8R6rBt6s2o
sqx5kx2i5x77roka1444siN1i5ubm13j+TlRl9OjcZjYZpxYZR7qMzLqtRYfoL9indUczKp961p7
3sVOtzuqOZlLKfvV9mtanNbdxzLfp3fOZn0fKrJ3hzeGtbRvfnbt2TN2TPcdzqtHj8zmV6vSdBR5
ft5Gon0NfbtQWrqucxrjMe82hOyjpS5jQlkg+2gnlezUNX0rnFq6tioKsNMmt8+jUDIqdjc50TZ6
DpJjj79I98183Mpjt9XMN7mGLmlOZMaixZjNh5+eXOU91IlebCElv3Uiau+hGx5cxd66d90OeZ1j
n5ZZg/PQR1YUicNXEhe6XVezxnvOaji97xVdW9HnboukzMOg3OXXqKA10gOGT2dnUwABbIAAAAAA
AAD0KgAlmgIAAPkgKvUS//8O////////////////////au5je9lISpmrvJjXTWyBRyJXcfZu6sxR
1NWVZbs/P27S5d7Pb6GnDX1PQM3jfP0iZ4+dYb2ZZ7vvg6aUxuz3Z6DB02580Z5xn0ecy4pnMzVC
c1zDv27vL1to019mLPm1ktXH7bvntnl+GNR5rBnlVjmd6NuMzlj9Q0/b9e4zTGueNTfiXmeDPkG7
nJ13U4zNZlQkeo52dqY6RZYN67b173vqc9FzReSiMZcUSyXm9muaos9xPF064kpiXXLzo8zrm8dL
4+0kJzHrb9vzp3OlfnbXpoq989R0mBlvWwliu9xXlTEzg9am32XXa9TiZn1WvKP0Le+orGreUfu1
23teD74xl5dmVA+e77Ypl+r3zUwcYj+9cnVQVcfa6vNLdRo97jWZO9BsSPMNO9ISvX3RgZmqvdO3
TXPFUGqs9sPV8zd2j3fusx9DKLKtMqsq2V9A/Na1OYt5tbyew41HDtvNKwx76OzmM1cH5OQQmWxq
dt7mHnrT12vXQJB79ghg0b427FBy7/B0yHhnQdznB/ZHBecvZPHKl4Nb4nbl4G5PtwfozlsSjzNM
PSfRRVcJF7l8uaK86YFyzl6Nj3N7emHcg07WrHtsWkk+fnOffk4oMTmoXrkt4HfLV+8l095RG7Tj
h0DiNGdBQ3xX06bXbW2N7C3buKgtb2eI5jjY2NcRwYvit1fVd4jEdnuwwwB/PLPbPbPbPxLvmz1d
+DHzO2PmdsfM7Y+Z2x8ztj5nbH4ADHzO2PmdsfM7Y+Z2x8ztj5vHHzeOPmej5no+Z6Pmej4TPSc7
xA+yfgYfBHixHixHixHixHixHixHjxHi5eLnz851PwMPgjxYjxlR4sR4sR4sR4sR48R4uXi5XJeX
7J7p7V7V7U+J2r2r2r6HtXtXtMfQ6r2r2srda8teWvLXlry15a8teWvLXlry15a8teWvLXlry15a
8teWvLXlyfBXtXtXtXtXtXtXtXtXtXtXtXBvth2+2Hs+J7fb7e32r2rgzsZ2M7GdjPb2M7Ge3sZ2
M7E8jOxnYzsZ2M9vYzsZ2M7Ge3sZ2M7GdjOxnt7GdjPb2M7GejyM7Ge4vavavavavavavavavauD
Oxne7zzzzzzzzzzzzzzzzzzieRnYzsZ2M7GdjOxnYzsc9Pq+z5mjO70Gfu+UPM9XyQ8BfN8n4E+B
0r2r2r2r2r2riSMsObFZeSWkJYRlilvm+b5vm6xBn0I9MQZ82PTEGfNj0xBnzYdsQZ82PTEGfh6Y
gz5pLFZYrLFZYrLFqDPmxBnzYgqpyKnIqcipyKnIqcKr2pyKnIvaqcFKYUrCrLFp2MsVA4V7V7V7
V7V7VxJGWELYwl5JaQlhGWPF83zfN83WIM+hHpiDPmxD8MQZ82PTEGfNh2xBnzY9MQZ+HpiDPmks
VlissVlissWoM+bEGfNiCr8zkVORU5PavZFOSFQIMzX/u27bdtvbdbVtW27t62rbOAAAAAAABdVV
VVVVVettttd3dd3d13ffde++9ceuPXd991x6++rx67jrj1x6xXgAAHOt22222VVQ9c9FFbX/dt1t
2222227sgah5gOG0BDjOEXDEEPEEX035KACFweHB4UU8FPBSP8fAI8+Dh4OGikU8W/i3hhFFI/hx
3iikIe9A4BUgP8UrgHGCIiUaZrS/YJCQkJCQkpuFNstIrBISEhONaCObgWBkNo1j/ZwgjnSFcS7K
xcpXJw94EcRZqXxjcx58gxsHGh7+0r2cTaNs5ltrNWPsFoT7E0A65HmjBpON8gOCQkJCQkJCQkJC
QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJC
QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCZLOm64miEhISEhISEhISEhISEhISU7KEhISEhISEhISE
hISEhISEhISEhISEhISEm6EBAQ5e0MMMcLMNsLcNcOUM8Mzz6IA9OFR2ShllgEkqEBAR6EngGhAQ
EBAQEG2IQEBAQEBAQEG2LBAQEBAQEBDoQEBAQEBAQEG36hAQEBAQEBAQbYhAQEBAQEBAQEBAQEBA
QEBBtiEBAQEBAQEBHoBAQEBAQEBAQbYhAQEBAQEBAQbYhAQEBAQEBAQbYRZTgEBAQEGzBDdkWI5B
ISEhISEhISEhISEhISEhISEhISEhISEhISysXUJCTZkTPNQ3QgICAiQKSPNUINsZSnHyHoWRqqhC
EKqqhCEKqqhCEKqqhECYhxxv6YmJjS5f2YmJiYCMWzCm1L/hBoe5oG6a0uASBmsbkgZt2QAICAgI
SdJ8AoQEBAQEXBAQEBAQEahAQEBARJRBGCAgIPg8Ag8LkLfoAqGmSHKxtG8ahtGtDFDL6EO8OMO8
OUMEOMM8LULkM8MkMkLcMcMUMELcmiRSEiEiFuBBISEhISEhITcEhISEhISEhISEhITKdlhCtCd6
EKXoA0CQygD0HiTZDF6EMQwsyZT79dUICAg/0ggICAiFuFuFuFvve0ICAgIhahbGFvvXQgICAiFs
T+970ICAgIhbhbd73vQgICAiFuFvu70ICAgIkQkAg6nuwUJCQn0AkJCQn0Ms9PehPBJAgc7btBAg
ICAi016EBAQEBFuCJxVGFSFSFSFSFSFSFSFSFSFSFSFSFSFSFSFQDwpAwFA4+E2FKE2FKFiFSFSF
SFSFSFSFSFSFSFQBgQAwpwqOwuQohC4eDZhExMW2YzJ7OTm2WcNrBISEhISEhISEhISEhISEhISE
hISE++nnAIIUAT09PTwMhrnp6engbCaC56enp4xPT09POz09PTzsMU9PT09DEM9PT09PT09PT09P
T09PT09PT09PBAQSkCAgIlO/fv1ggICAgYWxhbAAQEBAQEBAQEQtgR0ICPv0ICAgIhbGUEBH36EB
AQEASFt0ICAgICAgICBhbCKEBAQEBARINIsaZJU5OQMJCQmcnJycCQkJCZycnJxJAkJnJycnAnFs
5PWc0xaaAQEBAQEBEiHQgICAgIwQEBE0xBAgAAkKwNA4IhPBkMkoGAJ0CDDmCwhqA/A9G3o4KUgc
9HR0Ekpuj0yWWxV7Uzmvzo6Ojo6F1OOAAKOjo6OhvRAb4kk6Gh8vfII6Zujo6OgtOJ2PSKdHR0dH
Q9V72dHR0dDrn6MRo0GUY/50dHGxnR0Sy6MiPri8NgcXi8Xi8LgMBgMXi8Xi0YDAYDAYvF4vFoMQ
xDEMTF4vF4sxDEMQxMXi8Xi0YDAYDAYvF4vFoMQxDEMTF4vF4vAYDAYDF4vF4tBiGIYhiYvF4vFm
IYhiGJi8Xi8WgxDEMQxMXi8Xi3MQxDEMTF4vF4u9qXMQxDONDF4vF4uvr01B0PWjl0U9MMbWrF4v
F4s5NnQciOjo6MrZ0dHR0dHR0dHR0dHR0dHR0dHRpmECyB6A9HDONOwEN6MJ5u/Qzom8NGVxeLxe
LmPQ8sXi8XizyPA8jyxeLxeLPM9DzPLF4vF4vBYLBYLF4vCVS/Adnwdd7VBe1bXtW3qQgQI37g45
maNGjRjm1o0aNE6NGjRo0aNGObWjRo0aNGjQ/Ro0aKO+EBD3Yhr8CXbRo0aNGrQWjRo0cKatOjjH
vHNtjFcYjHKEsjECHaqpY5AFtu927duxyy27du3MYxm7du3MZu3bt2ORsZu3btzGMZu3btzCYzdu
3bq++XUiBAiOHTi1m7t27d+/v7u3bty6/7+7l8f8cnaHZuzn7/nAcBwHAcBwHBnRkMAwDLMIxzCM
IwjCMEwAbQdXX17ckAAAL+JJAcuAAAX8GSkABR+qvU/80IQ5L4TNpX7/QhCH+/dqfK5UIW370X6o
IFAN1dSggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUE
CggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUEC
ggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECggUECg
gUECgg/vMw/WWWWWWWWWWWWWWWWWNOuWWWWWWWWWWWWWWWWWWWWWWWWWWXq6ur0vrUEfrr6+vrlv
m+b56+vr675vm+b56+vr6+rq6urr6+vr6urq6uvr6+u+b5vm+evr6+vq6urq6+vr675vm+b56+vr
6+rq6urr6+vr6urq6uvr6+vq6urq6+vr60dXV1dXX19fX1Rms119fX13zTivp6enp6enp6enp6en
p6enp6enp6enp6enp6enn4aPTy8/Tz9KQ2Tr6+vrocBo+Bomh85g0DQNA0DQNA0DQNA0DQNA0TQN
A0d+/2wWPMsxDHMswDEMcwTBEvjFYP2wvEu34OQ5DlOPbv2np19fX1rurq6+vr646urq6+vr6+rq
6urr6+vr6urq6uvr1JtD0eab4379+/fv379+/fv379+/fv379+/fgwcihQoUKFChQoVjAoUKFICh
QoVjAoUKFYwKFChSWKFChTFPn4+Pj4+Pj4a0IoUKFChQoUQoUKFChQoUKAywvHsceOafr5eXl5eX
l5eXn5eXl5eXl5eXl5eXl5eWBE6BQpJFChQoWLFixQoUKxgUKFCkBYsUKFCkElJFChQrGBQoUKfi
oChQoUHY/09PT09PT08wMYwHCkPFChQoUKFCpFChQoUKFChXPLRY5E9cm1rWta11hLSazpYxjGUA
xrNDGMYGAA4maxjGOVOkr2pFlIHpxWCa1rcDhSiuFwrWtbhMK2o+/u1tWucWYOI4jiOI4jiOI4ji
OI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiO
I4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOI4jiOLI7TTUARpmmaZpmm
aZpmmaZpmmaZpmmaZpmgaprGmaZpmmaZpmmaZpmmaZpmmaZpmmaZpmmaZpmmaZpmmaZp42klOJXl
+GYIwTJw2Gw2Gw2Gw2Gw2Gw2Gw2Gw2Gw2Gw2Gw2Gw2Gw2Gw2GxhgYjFYnEYrE16V/pL6HFtOM48Z
hYg4zjOM44iIOM4zjOOIiDjOM4zjiIg4zjOM44hLs35bN9vb29uVy+ey3b29vbmcxkMl22h2/3x9
/XTqn6cdjsfj+kC7ysXT9CwNQAYRERERERERERERERF60ehUGg0Gg0Gg0Hx8fHx8fLV2yBDnGcfX
SWEzMzMzMzMzMzMzMzIjIiIiIiIiIiIiIiIiIiIiIiIiIiIiIoqVeS6vV6vV8Yq9Xq9Xxn8/f3GP
39/vnGJlBsyI8NnZ59nZ2dnZ2dgdn1L2dnZ2dnZZe1Qdmst/Z2dnZ2WMaT9Lj2dnZ2X5NTsLsF2d
k/Z2dnYWqknRFOzs7OxY5LOzs7OzscUdmb7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O
zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O
zs7PrwwPZ2dnZ2dnZ2dnZ2dnZ2dnZ2SbWdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2afh31au
jJnHXoZz2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZYxttOxf2Pzpbx2ffZ2PPeLx2dnZ2Xi8X
i8dnZ2dl4vF4vHZ2dnZeLxeLx2dnZ2Xi8b5S56ArqgTaK6ttAjx0UX9lOxbofVuIdgBPZ2dTAAH/
//////////QqACWbAgAA9W72bxH//////////////////////8YMGDBgwYMGDBgwYMGDBgwYMGDB
i1xAwYMGDBgwYMGDBgx1d+nhlhgwYMGDBgwYMGDBgwYMGDBgwYMGIKY4AWSwQMGDBgwYMGDBgwZM
MQ3rhbo5oEpoJYB5fJ+pkQIwweWp2h+PvyAK/oBz4CnEuu7T+56Hrq08riE9D1PXKSe4KeGgAAAA
AAAAAAAAAAAAAAAAAAABwD/+AB6BISbuygcT+4jolC0nBSq2rhaAeh/ifmRtW7NNwgVCKoSVCSoU
VCaoSVCSoRVCSoSMQxTEMTornjjyvhnDBjQpxp08cccccccccccccccccccccccccccaWg08cccL
crv4444a1ZbgwHGKdpSnz8vXXXXXXXXXXXXXXXXXXXXXXXXXXXX+AQXP0uuuuooouuuvwDjhclrO
P+sYg0VVR3EXrRou2bNnqjcEen/mxbSiru4x+pMJz92Wlp1vV55cGloaUkNV1zXtY1jWNY1i5evX
tY1jWNYvXr17WNY1jWNS1LUtS1jWNY1jUtS1LUtY1jWNYvXr17WNY1jWNS1LUtS1jWNY1i9evXtY
1jWNY1LUtS1LWNY1jWNS1LUtS1jWNY1jUtS1LUtY1jWNY1LUtS1LWNY1jWNS1LWg89Y1jWNYpAgj
YnlwxX/Hzc56xrGsaw16u0hza/nM4Ie94h7xCueeSX39n/r1lFLWNY1jWI0/T9Y1jWNY0/T9P0/W
NY1jWNP0/T9P1jWNY1gOwOwOsOvWNY1H5/93WkOPEKIi8qZmZmZmZmZmZmZmZmZmayFt8zMpUqWZ
mUyZKlkih4v1KmSkk1rWsREVrWta1rEVrWta1rWta9rWtTfUDJNa1rwOBwK1rXgcHgcCqS8ghOzB
nQiSCXCSFgsXUkHrHnfz8YLVBb5YEzkC8H950woW1IsWx9DiWLFmlFDHxlixYsgWLFixYsWLFixY
sWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFixYsWLFix
YsWLFixYsWLFi0I6uWLFiwSdJAgRIwRIoFixYsWLY1W2jnrEukf3h/78AfqnmCCiIIS/RYsWLcCx
YsWLFpLFixYsWLFixYsWLFixcuXLlixCUaaM3PREA26D58/fv379+/fv379+/fv379+/fv379+/f
v37ivnz9+/fvnz5+/fv3z58+foDRavvbvnz7r9+/f29O3p29O3pv379+/fv39vTt6b9+/fi0Wv37
9+/fv379+/f4ar5+/fv3z58/fv3758+fP05Xhn0aC3f2fGtJkCmeOCGOEVRBxfl5mMwbAiDkCAyE
W9QSaz+0eV8DT1sMLUfjnrOIm1cYWB7VjshPaPyBBqg2SHnICykQIIdbXQyqRXmVd0My9teS4cYz
Yv715HExw4hzCnDFVQJaayMjIyMjIyMIk2K42NDY2NjY1teHfGMYwf5sGznGMYMd/PjyitSbv5zl
t1CIbm3Oc5bGw8Q3N2c/81Xmpqampqampqampqampqampqampqampqampqampqampqampqampqam
pqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqamppzqWtND
Q0NDQ0NDQ0NDQ0NDQ0NF9oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaCG5PUVax5iQ0PQ9D0
PQ9D0PQ9D0PQ9D0PQ9D0PQ9D0PQ9D0PQ9D0PQ9D0LQGTQ9B0LQ9B0NJi770DGgaA13tA0DQNA0DQ
NA0DQNA0DQNA0Bn0BovMrC7u9qzoDI7u7KwYQd3YrTLa551zXNc1uiV6cGiI9NxBBBBBBBBBBBBB
BBBBBBBBBEp7I8vl8vl8vl8vlpUqVKlKTDwtImSpUqVKlSpUqVKlSpUqVKlSpUqWOHYjj8ewFgLA
WA4/H4HA4HARoeDnNoDi+gggggghi9qjSneTTTTS79mMpe972fxy5v/Pve8SMkOY84ilhg///2Rg
4fusDF///sjJw/swxsf//jSdC0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0
nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0nSdJ0n
SdJ0nSdJ0nSdJ0nSdJ0nSdJ0lt61LUg7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q6g7Q7g7Q7Q7Q7
Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7Q7c+IO8fYPMukadoGgaBoGgaBoGgaBoG
gaBoGgaBoGgaBoGgaBoGgaBoGgaBoGh6NoOhaDoOg6DdYKIUQqiB5mIqJmZiqiZmaiKmZmqipm3b
vENuEPXbu3LvKz0vZfHeW/JN2FhYGI+aIEDxz4BKSpkyZMmTJkyZMmTJkyZMmTJkyZMm/7yJEiRI
kSLgEkkkkk3OlcHg8Hg8Hg8Hg8Hg8Hg8Hg8Hg8Hg8Hg8Hg8Hg0vry+Xy+Xy+Xy+WlSpkqVKXQDAN
ZVZDKqyFWQqyFWQqyFWQqyMS02UFWQQVZCrIVZCrIVZFKsiCBN1WQqyFWQqyFWRw9ES6rIVZCrIV
ZGK3MKsh1WQ6rIVZCrIVZFVT8eSrIVZCrIVZHDhzBVZCrIVZCrIE6rIMqyFWQqyFWQqyFWQqyFWQ
qyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQq
yFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqy
FWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyLtxFVkKshVkKshVkKshVk
KshVkKshVkKshVkKshVkKshVkUXEqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyFWQqyF
WQqyFWQqyFWQqyFWQqyL6/HzGbKPyGDqshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVk
KshVkKshVkKshVkKshVkKsjf+yTdVkEwK6s2MqsjtVkKshDtWqyFWQqyFWRtxVkKshVkKsjbirIV
ZCrIVZG3FWQqyFWQqyFefYNbv9YOzWOXE8ukQgnvFWQIEg1VjE+i3kW8i3kW8i3kW8i3kW8i3kW8
i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kYw3bbyLeRbyLeRbyLeRbyLeRbyLeRbyLeRbyFzovt6f
fW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8i3kW8irvOlzbyLeRbyLeRby
LeRbyLeRbyLeRbyLeRbyAP5a6KJ4NP3/HufUEEiA4IEKn33IEAi7vzoh/02MoH5EPzWYYk/IdkHh
x+Og0XbCWflY6R/z8j4/vRF2bGGqiBCxHUP28gQrXEsgYsHfw4b99mONXjiLv3795yb5IY+a5chC
DR/OKf8R2Q4inr9UUvWrlFjoWKIZIEGJood5oKFHz+Eu9V1Qxu4/B46PwikJNJByG6SWBcXl/XLu
w4fMhzCs8xVx99l14xFKwb9Zcw8/4n750U6d0H3ppMicj//afCeP3t5hO/BXtLmGWGU1JqBBlBlB
lMzx1h9e17Xte7znOva9r2vZznOva9r2vJppp69r2va8mmmnr2va9r2c5zr2va9ryaaaeva9r2vZ
znOva9r2vJppp69r2va8mmmnr2va9ryaaaeva9r2vJppp69r2va8ncuXte17XteIcq3qmDIs069r
2va94gQ+QN/s7kIwilmkTKPdRjhCnKXWva9r2vadp2va9r2vadpunadr2va9r2nabp2na9r2va9r
2var/TdN0bBjtocOJ/8ra1rUsqtYpEvf/LYLIc9PMmMgwCl11yFDddN7R03kF7/f31S+0KFCl996
qEGKZ8szkpQUlP0DiC1EACtPnKgqPnObK0WloqCrquq6rqDS0tNXVdV1XNLS0tNXVdV1XNLS0tNX
VdV1XNLS0tNXVdV1XNLS0tNXVdV1XNLS0tNXVdV1XNLS0tNXVdV1XNLS0tNXVdV1XNLS0tNXVdV1
XNLS0tNXVdV1XNLS0tNXVdV1XNLTUFT1dV1XVdOHb7aR/OoKuq6rquoVI0VNU6D+oKdO+IMQEE4J
Zcu3wIefV1XVdV3/V1XVdV3//1dV1XVd//9XVdV1XFGFFlGFG1dV1U5y+XUZRKgnJg6SEaa3d3d3
d3d3d3d3d3d3d3KEbu6AN3dJA1OL+rEEJ9NY7vuJdtvGMYxjGMYxiO8YxiO/MYxiO8YxjGMYRPN4
xjHd2MYxue7DSRaTa+OatXfly7N3bjHhUoqWVLjnc9suQzLKlbkSVKwiSpUYlS+c7KeINvzCpSAq
UVK5NlKlFSipVSXT6OFSypZUsqX0gSBIEqWVLKllSyBIEgSBKllSypZUsgSBIEgSpZUsqWVLIEgS
BIEqWVLKllSyBIEgSBKllSypZUsgSBIEgSpZUsqWVLIEgSBIEqWVLKllSyBIEgSBKllSypZUsgSB
IEgSpZUsqWVLIEgSBIEqWVLKllSyBIEgSBKllSypZUsgRgKllSypZUs3kFo0aMqUVK2KllSypZUu
2pArQVlRoZnFW6ht7arR9AgKlI/dEipZUsqWVLWIkqWVLKllSypZUsqWVLKllSypZUsqWVLIkqWV
LKllSypZUsqUVKKlFSipZUtuDMVKafp0b4aMD69RzHLMpmUzKZlMymZTMpmUzKZlMymZTMpmUzKZ
lMymZTMpmUzKZlMymZTMpmUzKZlcJaZlMymZTMqMWZUYsymZTMpmUzKZlRjGLMrGLanMZYablsWZ
TMpmUzKZlMyo6ZlMymZTMpmUzKZlMymZTMpmUzKZlMymZTMpmUzKZlMymZTMpmUzK3oCMWZTMpmU
zKZlMymZTMpmUzKZlMymZTMpmUzKS379dr0sxDMuxJ/V2g7l65B2+97zTzmI+/j00DsYSUcWZxK2
tBxpkFFYqWgaWvf51JJq2nOhLjooCdBk/jaqVJU2WVIjZQiEDylDXh8WQZHjbRurPSKvh5vMpHHl
Q7fQmgVGz9191fhyeRhqUIffVQ+mzilU8qr1cV2p41cVUQZeIROlzadGxPm7d2lVfKDnVfsWhg83
Mm/R27jpJJyB33vo/0na7aetyoGLFhbQiQoBt58qSqDIP8eewcQoFp/1Bb+NtWNMLbPtALzVU6lm
53bvMaGgdAxC8q21bUTZTabKSqqjuKgg4oHO244936qbByPjQsxAT68d2Ttmd8ceVK2ZtVVVVVVV
VnWlbUo0KKKKbbcu+c5zmZnec5zn3y6qb8zMb6pm2VdVWZmVRVL2N7fmYG2k2tra2tra2tra2tra
2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra
2tra2tra2tra2tra2tra2tra2tra2ttPa7u7u7u7u7u+Xd3d3d3d3d3d3d3d3d3eMty2++tVtO1R
1HUdR1HUdR1HUdR1HUdR1HUdR1HUdR1HUdR1HUdR1HUdR1E11HUVR1HUdR0mnZSqO1RVDW0t9UN7
e3t7e3t9UVRVDfVFUVQ0KqtsqCitVt18AqQVDUNRVF+lsyyzM6oFAoFAoFAoFAoFAoFAoFAoFAoF
AoFAoFAoO9ye44u3PtzZrbbbbaUpSltJi+1Uixw5TKdTqdTqdTqdTk9nZ1MAAICADAAAAAAAt5G7
CloAAACxw42SEvDq5+Lu5erp6Ovo6+Pf3ujr7B61GGlGgioXDN/J8Z2bp9Yff1OsOwvRXe7tcek+
6cGZun9158HkxseJw/3m0MdO9xuPao05l/6rT9pny81D1zDxko0zA4d+s4pQF8fpP3NxMjdXvgzH
PrF93hxU1yL+d4dxhm3fGM68kEz1u11/Nl2uiTG7bmXUpGul03Dq5s0n7a1Zhy2W933a7pc2Rz2c
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
6xyX8D7E/X43h33MsbXUpP/8xZWfzYdWZZ9UdjWFZuODoGquPo4RO+mNw/aya/b2cY6ybeKF+M3R
uN4Ny9/J2NQyhP0e4vWzlq/sL8l3VUuS8180yn7dWtKNVvnTiat2H711dMuf74tkTdaBR+mnXxuL
vLWs4iWfuDTS6kH0IDo4NrTRMU+cSk+PMrzYbrnZttsGHpUYeVUJqCEgdefcmRunC7rkXD0db1eX
byDVd9c12iNrO6Z91oNOTq/Je7/2qdaO7wyLliGWDEj/8GZ780x9+O3EY/t0t1YvTuz2d0ryTHWW
DfP9+xvWvmnXz4k52+CoORTjeb8RzsSEuWWOOWltNEnNp9hvebMdPKulm3bWGDBbmx51273vffJd
tb0tOo09m9XOPGba3QymhounyHA7yc0j0frtb0mM7sbrTDz6cqGhu40gmhaJTkbUOusnryvSWS3D
aJ2bnF+983bbib3R9m9Oo4MS3HIzSvqDxNZydSqhO8Wg5XHA4+YfrQNPZ2dTAAFtgAAAAAAAAPQq
ACWcAgAAwDYqRRH/////////////////vP///6dTqdTqdTqdTqdTqdTqdTqfPv17Zkr06op2dnZ2
dnZ1QzJkyZMmTHoH0SfdopRj1KlSpUqVLdRBKipRo0aNBSwzQ5d3fc72fe3d3ks7/3bXRzMyi09w
bZmZQUz+0aOZ/01adOnTp06dOnTp06dOnTp06dOnTp06dOnTp06dOnTp06dOnTp06dOnTp06dOnT
p06dOnTp06dOnTp06dOnTp06dOnTp06dOnTp06dOnTp06c7vcokooooooooooooooooooooooooo
oooooogokoookooooooooooooooooooooooooooooooooooooooooooooooooooops9zoi6OW00W
lRRRRRRRRRRRRRRRRRRRRRRRRRRTZShttttttOX71NKpalbd6lqWpamqWpamqapqlqWpalqapamV
3pUFGjN5qVE0vfzlUcQr1VVVVVUwb8f7/cceS222222222222222222222224KancYxjGEY7u7HY
P6SSSSSSSSSSSSTCUbPOTJkyZMmTJkyZMmTJkyZMmTJkyZMmfDamznOc5zlttttvKetAXKmEWRZF
kWZFkXilPYqYgKmFTCphUwAg/KmEGQZBkG5bAIvIwQZBkGQYQM6/kGQYIPmjF0aGffnoxnAQXXKm
FTCdcCpllTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTC
phUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmF
TCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTN6W5UwqYVMKmFTCphUwqYVM
KmFTCphUwqYVMKmFTEYKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUwqYVMKmFTC
phUyzlt1pxBeEGQZBkGQZBkGQZBkGQZBkGQZBkGQZBkGQZBkGQZBkGQZB6YxKCDSLLqSVsqZsVMK
mT2KmFTCphUwqYVMKmFTCphUwqYVMKmFTCphUy/o1BU9VtDQ39KDqSLaoKrLFTCphUyhm188RmzM
ZmMzGZjMxmYzMZmMzGZjMxmYzMZmMzGZjMxmYzMZmMzGZksBi0d+R3Hcd1HbBZmfnt9iEJWKr0ej
tmYzMZmMzGZjMxmYzMZmMzGZjMxmYzMZmMzGZjMxmYzMZmMzClu8ZxnGcZxnGcZxnGbMxmYzMZmX
/PUl5Fe5PHtipYYfrZb2NDhUvv8uDmSrCeUUYV3ff6gptfNuoB4QYgee91xxTsqg6o0lAq01uUf+
VBA4h999mXYkv2i9LJGFtgmoRyxkXBgYAN/EYM2bKdyCASc93EAtpbqyCCk92yoci2NxAkCN/lzj
ZS7K6aANq29RBoXlGoGWYBlETXLvCAPOyqvvDMp+EC3K5e2UHvvHN/Qw/Nahn/HIjL+5XrncltOV
/0d2QuOkAQBUl20NF3LvBvT/b6DUrOhzXNgfou0kKisqz3OwvsNfEoB6+r24b+B7P5+OHtDJUs1n
HMG1/ugzYc7xBBIg5JAP+7QUv6gQd85yjpKCpHhFRxqauzjaQgFb2gXNVBSG7c/KMYtGrh/Ki/G2
VaOviebblWZVlwd38//u4Xj9IOV/VnNA9NlxV7rJ0urmm/vLabC2N3w3pTKXKX5dxKXKXKWbW0Ua
FBTl7bMrPz5zbUDfvle+D2Pmkq5v3aXBVlWVZVqApEpCrlan9tQj4haSlKUpSlKUpKUpSlKUpSlK
UpT8alKU8lKUqBQJwe/bevURoTk50L3YxjBJOMYxjGME4xjGMYxjGMYxjAHYxjG7uMYwxwxxu4zs
cSxZ6XObprWn3t0Bqn86sVRGeq7HzVOSvDd+fL7SUETkOe6rVVuq5VdxVWqrVVo1XBVU4qp9VT6q
ntRUVFRV9V2q7VdqKioqKrtV2q7VdqKioqKuq6rquqKioqKuq6rquqKioqKrtV2q7VdqKioqKuq6
rquqKioqKrtV2q7VdqKioqKuq6rquqKioqKuq6rquqKioqKuq6rquqKioqKuq6rquqKioqKuq6q5
VcqKioqD9COLrzRVFRUVFWVZVlTOLWdqC07Cqee/uYHUVFRUfnVeqvVFRUVFV6q9VeqvVFRUVFV6
q9VeqvVFRUVEfPzx1FREEbIqiq3+SVV3QjRMNEw8skkoklJIklJEkpEk8iSVxJI0RjRESSe7iSRq
Rqe45MmIT8zh0aUaJholr4p93d6d3cT3dx/3dx7u493ce7uGjyNHnn3d1eZ3dw0TDRNmdVkg1WZh
+x8lqvDgoW+PDG6OM0U9yWlFHzxVZIcGh2y62cqr9V7+s1IuJlVALPeLidCBDjacdXZzxvE6jtQD
0LKq7r8SgQOI1zv8eDVV14N8UugQNFArHhsQaQG4mbIbOsa5l0FRooE41ASKjSA1q6CANBqnlTHR
+fD5jv4eYmjdtI5SZIXnbtVyx0MtJGeOYyo1lVOeeq797VdQVfVcyg683PSOL8JmgnYuCrmYVmXB
ermTMEFlXWCT2X1yr4uudInMO6i1Z9HPknbFe0bsj4erN9aBXV08arqOgqsVFVygq6q9EegqsbPH
EcwZAHzNA0VnW7LE2H6BBC5vid2+e8av5P60uafdkNeoyyioJj1KLM0aOrKCLn3QHug56rNVg1XR
1WKBVW6sqp7VdamtddziBJXl8oI5XZvIABxVpx54+C/SLvH552S1m4p7U50eY5YpzXTtHUM+YZ82
R5SdeZ83PVxj1U4NV1V6qlKrarG7quUEx5wWtI1SCYiE9mmKZLygIAiK1L08BFNVeqsHzrTKj7OT
XVnPQOPelUORZeltZc3R5l1NBdXVX6qeVUwq+r6rRqqUKqdVWKmgqpiftGjr8RlkRQT62u2AFICn
a2IGiCbeY1tZYkKWq7VViq5qraqaRZmZmdHzlDu/mV76K6vq7nj57jj8+VEVRUVFRUVFRUVFRUVF
RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVF
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
7JuRp96LTrIr3WpUO6lqZllFiyaJ/6mLKZqPv4N3c9ifZNo8Vrr9Ir5tD4yzMs3H16Jp+8mqznpJ
a+zEsn0Hf0M6lTCWmvemsrdn2pTbVQAetRhwEQzocCW37QeK9W0/P3QI7sH91vtn7Pdf9U3r/497
p4Pebk3g6sGblz5ycfVqhy33jWO7GzGXxBseeL3NsXZJbHtxsVHd+MRa+sV91RqzeU8eMsMT89pi
+TuVPlvnzDw5WB3ORN8sZZwcTjYkJva4h9bmZ7OGl16+oEnDmB5IdIVlcTWakbWRNe/bZdChpMX2
kDzkjw1dLIMuaWa222M26foee/fuQ/fZb96+y/23rSXf4K1WQ/LUZvn39V+0jD9WO3oVS/fcS9rm
2ixM/+vP9mRxG2HcYrlXX7pS3o66h44nowsepdjZTAVahSKIZO5WZ+Wz+yNvx4fL3ZldwUP775/+
oQ37Yza18dne2v6+Gem+Ha64t3C4vM5sm3GHB52uzqaTts2vHzQ7+/vWm1jKtIzzqTslbj30Rqrm
cersmtaDjmFj+mtjt9GtKum3IYwNjc/ti23OXYwnPW+rveaJqyQPI4lFl6ZhefvKYTf0sClbm/qF
xr1+P/GVxWdSpmnxuCy3i2Zk2yZ69pgSac45irjkixjjBmfadG2kWoZbg8MUCQZe7ydvbcTRG2NU
0s4Nm/40crF9XpLjeb4yrZhmIsNW3lAN8xSv6B6VKHHSjSZ0OjLMbG9Xc70ztbt7lz9j/LfD/uer
3P+C3WH9z5A4dGdR8Q1iF89O2fbxq3Zxdzo2SNDmWLcz1Z7fEo2VeWd9/HB67kJvLVYWrvrIfDPS
23e52bQOmuGzp19+hLP1v4x+7OUWCZbsNNptcW/PW4tBfi8STdtlLk/N0+iIKRjqSdP42ThtT5V5
ZyWt1NsT5MomLZVmNUXDXrqSjy5lSTq+/WnPi32kuZcPuSPTvu5Rc0kt2Tb1+Jybf/7V4sE+Tl/t
N1/eeeflJDF68TLDFbOvovV4S71acOTazeWyAR61OPpsmgihRSScuUXcKX1lPl08Z3VeOk2h3atr
/UNbor2wrRaia7j2X8c7+7E9ld0w/dHG7Y/Vfv32enxdt2RP1z7y51tLdo5EGqnHZnEibtVJ/dYd
ieHLOLXdecytS7Wj3P5kr9lX+17KLDIcNqxhvlk3X6rYpk+We50+zBD3tfA4r92WyW5TbG4k5vP0
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
a75Bb18fvkFOxL5AtacLXfH+++P3yCDXx9a04Wu+Pt98hvkPxvj61pwtd8g318fvj//fIFrTha74
/Fr4/fH0hr48tacLXfH99fHr5Dtr5CtacLXfIKViXyC+Rd18iWtOFrvkdipV8ivkW43yJa04Wu+Q
/u+RXyLmvkK1pwtd8j+N8hvgirnufWtOJEXMGbFKSfQTb0ZemU16ZvTNnK9M3plNemb0zZyvTN6Z
TXpm9M2cr0zemU16ZvTNnK9M3pm3r0delP/u/03/emb0ymvTN6Zs5Xpm9Mpr0zembOV6ZvTKa9M3
pmzlemb0ymvTN6Zs5Xpm9Mpr0zembOV6ZvTKa9M3pmzlemb0ymvTN6ZTm8/3nS8yXn68/3h+ebzd
MYCTEy4KZyVxMOvwfKPaHzkl70my8GZHZwJBkVmMWMaCMMRDjIGMSaKcITGGZShzHg46GzcCG0BU
hOVgMyB1dgHphJIEhCzwAZAzD5M2IbcPPggEZgUH68EMlUG1IzvcCJhkwUK3ga8PLh8xXg68LEzu
hMjTQd/24c1GO9rhZaO0Hf7p75v6CDDoq2uz6FKwG6O40+/96LaG6P9/d3tyvaEd2B6ef/tkzYRe
hYSTHuj/UOs/sDu5v6xGt7u33dS7+9K32+7ae9icnvy2SkjvX1n3N1if3Qbre33d1jd9gfuMaXbs
/aHJH2JGLe3aMtXWNY3p8e9vikdZf7ft+qm9qe4/26TN/dRSv/47/obujl0UujO4XRk1k0it6GJP
oJF5svSeqAgIGuqdXpO9J3pO9J2dL0nek70nek7Ol6TvSd6TvSdnS9J3pO9J3pOzpejL0fek70nZ
0vSd6TvSd6Ts6XpO9J3pO9J2dL0nek70nek7Ol6TvSd6TvSdnS9J3pO9J3pOzpek70nek70nZ0vS
d6TvJN5Js6RPvWdTT2TWzoZN9XZ0PKfrs6QFazlnR3ZvPZ0MPry2dKn63rOlbzz1nR5596zpXW9X
Z0eeers6PPSXovRVTRsb0vvT8Oh25B+0GmUrnOgtczkO/rLZLLb9jtY39YnL5e+kShzbiqNFvmBv
7fU0TrI1gRg2/sRqXyDjeVNrhqQfZBHG5m+HR/sffGmah2+s/b4qp966ff0UHpA9rCGvAFFJgxmP
o/YmIyS5f7duZlzNuZ4j9zpKg+IugIGHCn0EhA11QEBA11T6MRpHqtNIxhEVAyffEIKis5STMC4C
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
to91l7u61reTfyal3XN//ub9zfubjeJAumu3ZJxaaJo73GO9xTaaaTZu2O9ZE7LVLMz1YRuaJXLB
mH67gkXQUGWRUzrM2yIscKoKCUzIKDcEwiQhOTTMxsMyKg4wQfyoJgUldpL4WG2rKrlg5/hIuA/w
FMx3AJ/8pR/3gLIVzhpUgQHv8SQf9B/4QfgKoFWjA9f6RA0DGLIGuqAgIGuqfRiNI3BQNlq4oXK2
41XJb/uS2LF1P+w4bkr/3Ja5L/9yWxYe7+wYbkr/3Ja5Lf9yWxY26h2PBcl/+5K3Jb/uS2HDan8N
+HFcl/+5L3JX/uS2HH1tz/MruRuD47iqG9wE27k3////+m7u5N/////pu7uTf////6bu7k3////+
m7u5N/////pu7uTf////6bu7k3////+m7u5N/////pu7uTf////6buQNdUABuBlwswwuadxThZwh
cNcUIYsULOEMWKEMWKFnCGLFCGLFCzhDFihDFihZwhixQhixQs4QxYoQxYoWcIYsUIYsULOEMWKE
MWKFnCGLFCEp3I6FnCFx1uOsIXHm4lQs4QuPVxphC493H+FnCFx7uMsIXIG47ws4QuPVxghC5BXI
CFnCFx1uGsIYsULOEMWKEMWKFnCGLFCGLFCzhDFihDFihZwhixQhixQs4QxYoQxYoWcIYbiBcN5Z
uElQjZwhixQhixQs4QxYoQxFarOFUhXFKELh5IkLOELh4BK3IVw49OLiTclbkLcQ7itcZbjDch97
3tmZmZm3ve973tmZmZm3ve973tmZuWgIEEGHr3vDmqi0Y70b/QHVL7FmaMdNv6aEeGhh56AGFw//
9u5m7m/////27mbub/////buZu5v////9u5m7m/////27mbub/////buZu5v////9u5m7m/////2
7mbub/////buZu5v//BxmWLhjIGMHMaOiUnXAcdmG8ZEd4C7m9uOb25gwb3veDA5vbjm9uYMG973
gwOb245vbmDBve94MDm9uOb25gwb3veDA5vbjm9uYMG973gwOb245vbmDBve94MDm9uOb25gwb3v
eDA5vbjm9uYMG973gwOb245vbgtMRBgsDN1ub245vbgPIcyk8eoFMjm9uOb24exCAEdwEANze3HN
7c2szjJnJFzub245vbmKagh5K6UyDm9uOb25gwb3veDA5vbjm9uYMG973gwOb245vbmDBve94MBR
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
XLiKxc8RUJR0KgtUH7NmxUFKg3YYiUxDEMRKoLUqgtUFqgtSnoi7PM9T0W3jrtXVhFsFS+Ii4XSC
KHQ9hWuUgEy5YSLqLiWW2LLnSFj9Fi6ENG2+OgNlXXuN+88WoYMsJ21itSmHRMvWcAuToG+Hl1pB
PomeECi40Lr2oiiHWJFU6eJkVK17OhxHuEUUVBqoM2bNioLVBuwxEpiGIYiVQWpVBaoLVBalPIj2
PM9IssuodYh04kmJl1CeyFxITwVl+X4V3ALH65uYcSA48LquSxe9WQsshBLeQJpehuhNYIw4UXxR
jbhhdattmAvtG95Oi41zxR0JhpdQqDVQbs2bFQYqDNhiJTEMQxEqgtSqC1QWqC1Kedxnoex7IhLb
a6e2KrYvi9qIstQ9kW2lcadBWWEvJxREUhAinQmG4k8JivJWoJPFrbFjrLmvDrnbLKPQ0mPC6esS
pio7L2pKoEWu0V1xsG9yxFxprL3E8IWXup0Kg1UG7NmxUGqg3YYiUxDEMRKoLUqgtUFqgtSqhSWi
oOVDKoS/aYXEmNhsZ50x5liOGx+j4G247IhYgkOmsXLL2pFDwi51i94qPJCKx1hUIoKZkUZbF8dH
QxZD2WotsINzV4RWzTFnbFjzOSZFg9CZrIFOsEpbUUF0LXWWXwltQnhNCoMVBZpeGxUGKg3YYnr4
GIZxoJTBMXGYc9zWwHmb4ByOW6Og8TSwBtbv5QGGqY+E1fF7vmoA9ZhJVBalUFqgtUFqVVHdHQqy
1WiqrOjo6Kg6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo09nZ1MAAf//////////9CoAJaACAADZKp/CEf//////////
////////////o6Ojo6Ojo6Ojo6Oh46Ojo6Ojo6Ojo6Ojo6Oh+h+jo6Ojo6Ojo6H6Ojo6Ojo6Ojo6
K06Ohy6OjoLo6KdHR0dHR0dHRTo6Oj/gwUppm1qS4c1TDNU7Dn6Ex1Vm/P0GZ9cb0Z4x73FBalUF
qgtUFqU970biFWDo6FUOeh63hHM1OH6OjEdHR0dBCKVYv6Ojo6Ojo6Oi1ZcUWLLOjo6Ojo6OjoTp
nS2pujo6Ojo6C6EQ84Zh6Ojo6Ojo6NM2VypgmCYJyIMXBGh0dHR0GP+USj6pZPXG9HR0dB17NqVU
WKDdKaWIM/oryDOGAoEEsKla9dB7f/m79F7jOibw0JcrelCaYt624vFpc75pcj4hveUFqVQWqC1Q
WpcsqMr0de47TjZ7qAPB3uqAfGIwx1qkoN7igCVDX6ZJ4ZI51Tfe4oHvf3NBGT2Xu+hy5z/6DDwS
oJvc0qi06WYzo81AZe70feeSns2FQGeh5LFoXuxEXgC6GJCyxde5cS617e+9WJ0XFcSa+Ivcshtq
5OhNYHrTkzKmCYOVyuVMEwTkORQkKDdQhHIcig46Ojo6F3RVcuv5C7o6Ojo8c00yDJMa93CS67rX
gOjo6Ohd0ZdcuSrujo6OhUjJVSkqRVSAlUFqVQWqC1QWpc4qD71uwrehhkKEcN7hlqA/Def2lPy9
w5lSRnskFnQdt7igHN/BYzo+83Je4ZqoBymEVF2/7VC97hmnNksYjo6MFes4j+zmcOM+TAvcOFQa
GGdOJxXv73uH3hOjNnR/qBDJXuaTDD0emCQoFr3DOUFGL8/s8FTzl73GHX/7UYxQJ3uGKoIjBxnn
95dQHpVQ2qSjt/OOj0x97ihvNQwzG9uiS90Ob+85/9B7qhW9w2NYWS6DCzN7h9mR55bKfR+KgG91
QDIPKEx4HkeV7ixMltXXBYuudFl6sQntWJYQsQ723GSdLfkXpYjvS2JbcqYJg5XK5UwTBzOU6OhB
yHIaPhVL0dHR0dHR0dCU4ugN66Ojno6EdHR0dHR0dHR0dHR0dCFAB0H2l6Jejo6Ojo6EvR0HDeuj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj+6FBalUFqgtUFqU84tPQ8zyRFqLLL5SpnQuvYaF9liL4TQi5
0WrktqLEqxCe91PZlTBMHK5X5xRg5jPdHQg5DkvXR0dHR0dHR0XrL5/o6OjM9HR0eWL6OjEGnlej
O/XR0dHR0fRnmDkejPYNvR0dHR0H559GK0YlQJdHRu6Ojo6DnVEHR9e/PzL0dHR0dHR0dGGwWcO/
8NrA9HR0dHR0dHQYigA9DGOno6FQB0dHR0dHR0dHR0YPDGJhdPR0dEdHQcJynv0HEoLUqgtUFqgt
Snlc3QqPFWQqz+jo6Ojo6OjohZHR0dHR0dHR0dHR0dCyy+I6Ojo6Ojo6Ojo6Ojou01nR0dHR0dHR
0dHR0dBI6Ojo6Ojo6Ojo6OjoR4GAZn/0dBkGFmc50dCMxmL10dHR0dHR0dF7nR0dHR0dHR0XudHR
0dHR0dHRe50dHR0dHR0dF7nR0dHR0dHR0XudHR0dHR0dHRe50dHR0dHR0dF7nR0dHR0dHR0XudHR
0dHR0dHQlUFqVQWqBCZUjdHQSgK6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6D09ujozh79HQemjo6OhUHdHRs0dHRq/O
joNY2+jow5wdHRpHo6Mb0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR
0dHR0dEY7LqAg2+jo6Ojo6Ojo6Ojo6Ojo6Oj6D0Z7HdD7cv0Dgfno6AewFV30dCqtVTypC6Ojo6O
jo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjoLo5aHo6Ojo6HcHQ/R0efxXo6OC
6Oiuzo6OjowbdMnRz0f/R0dHQcOf6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6KH/uNmb
fuyuc/ejo6NhGB0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0d
HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0d
HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0HjlZzq6Ojo6Ojo6Ojo6Ojo+sR
meOjo6Ojo6Ojo6Ojo6BMr2MHo6Ojo6Ojo6Ojo6Ogx1AsaGW6Ojo6Ojo6Ojo6Ojo9h6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjozHR0AwfR0Y3o6Ojo6Oj
o6DH09Gw7vsGZ6Ojo6Ojo6Ojd5dBn5raxnR0dHR0Gx0dGf6Oj/8+jx6Ojo6Ojo6OjA9HQYnR0dHR
0dHR0dHR0dHR0dHR0dHR8dHRnejo6Ojo6Ojo6Ojo6Of7LmD9dEnR0dHR0dHR0eHR7mCqQ+joPbo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6
Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OiB6Ojo6OgegPQDSzoZ0U6Ojo6Ojod+fvxHw46Ojo6M1
e/pUaAh4Y68D7odpfXRddT76FBD+un9JaKQ66666t11266667v0/rp/WC/T+un9E/rrrrrrrrrq3
Trvrrron9dP+lPao5hwuv1/SG1BQrBoD+8arvL/AqMhllL66cdIZvQyFr+EO2CBAgQIECBAgQIEC
BAgQIECBAgRwIMQzixK+NCAIgmiIssa64jw+flvGshF+QnfRrETfw3CFdeh9U2CBCAgR2/vt4hAR
jIh5qY3gfgS++0jDjHT3XXffb8fcZ1P1an0hCkUikY4AXqq+LHqqv9Pn992bvmp4EvC/y7fQvSiP
cPtaEFBD2fX4Im2MTjHT/Tgvdblfy9REeHgxh+PhMzNIQpFIpCHCiCqgF6vhf13hS8D/Pzl+DHR5
Mxp0/R8lsxrCG23x8UPHxmZmkIUikUhDhTwAopRaj/eM8/X68g4x7w+h+vs+Hk6f8T8fu50hwb78
Mf3hS/VXjz53bNFB5v5eRt8fKZmaQhSKRSEFOHqKM3VRL7fhdd+VAEY6ddkslHETYG63yZP6S4S1
hC/j4vcePjMzSEKRSKQhwohwoh3jXfaES/vvC4eR8F3gJ8unLzNveMePi/x8ZmaQhSKRSEKdkG+3
vjh63xjocS46wYxHSWWGJxrtDw8UNfhMyhSEKRSKQh7q9PoPuIECEEYjMPQhAQIQEICH2QECBAjG
hAhBEPwICBEIYMYcdJdIQpFIpCGjU8Ro1uTQ6wdY26f9fiXgvODAWEQIEZCQyEDB0/rrrrrr4zDm
AQIJR/Qgun0CgP666fSEKRSKQh40DAIfq09P6EYBAgRgQw4MawYx8Y1443846aQ+q0gQ67qAhAQI
ECBAhAQIQECBAgQIQECEBAgQIECEBAhAQIECBAhAQIQVUEBZw8N0LCCDe6DdiAhojbtQECEBAgQI
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
rJSaXBwe570xp5KijJ5fZs2ZhUBbNmzZs2bNhxdfX1dXV1n9kjpVBKoZ2bNmzZs2bNmzZs2bNmzZ
s2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmz
Zs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZ19fV1dXX19XX
19XV1dfX1dfX1dXV19fV19fV1dXX19XX19XV1dfX1dfX1dXV19fV19fV1dXX19XX19XV1dfX1KCB
QDdXV+ZbN4s11QEoIFBAoIFBAqATYlOA8jAqqBFBAoIFBAoIDxxeOOc9cIoBlQeoIFBAoIFBAc/9
wcKoONs0ThUECggUECggPXDTZFeOBPRQQKCBQQKCA+8UoCFQjnMVjlBAoIFBAoIM3BsHkfJrmyfS
ggUECggUEGV/VAge6QJG+oIFBAoIFBBgU9OxQQKCBQQKCAmtXKCBQQKCBQQQsJQQKCBQQKCArolB
AoIFBAoIG3C1QQKCBQQKCCyIdQQKCBQQKCCCUECggUECggF06ggUECggUEFyuoIFBAoIFBA2LlTE
oIFBAoIFBBVQQKCBQQKCBcuahQQKCBQQKCBNRQQKCBQQKCAUxJCggUECggUEBLOrD5hQQKCBQQf3
mo7VIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlId1qP9SDdXV19fUpDlIcpDlIcpDlIcpD
lIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlId1HFfHVaoasfwk4EzCwn/vy+
ayWYwi4yMT4BM7GGDpAdmQz2T0YQTGxycyjYMOmeOTMfmU4xRkmFpc2MavZiTny+7LZCXwxeKd2G
SS7NZM5TGn9zENdt+YCu7b8f3j84PA4sxDC88Blcoc+R0lJjcb7LmcNWTGBiuwnYyL2oiLWAuFgE
92G6k44pfljxcLGMEhAxA04fLkUQsElwrCuC9qRokXAmhwgcrBte4baxFyNi/b9K7i4bze1I3KNw
usXCLhTVgKyHHr5ZRvx8Ub1dXV1dSdnVauKhFAtzFp6KgU11AIcJ8tpC4A5Q/8UKxc2y4JtzLyem
eZlFAGsI4zkvYRzHNYTrqCN81e6foWssyocOY+d/fHPyO3PRpyRymBHVfd933Cw3fPq6urq6urqc
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
sZjAhxmMCqAeMAoLFBIbJ8KgMOMxgQ4zGBmVFigybgzV1ZgOMxhyBxmMDN/5Jq1QVKiHkGMxhiGJ
jMYYipGVBCgXUEhkqE5UcHOYmMxhiGJjMYYipLVOagRUHJjM5PMxMZjDEMTGYwxOeWMZjFQcHF4z
GGIYuMxn3yebK9XV1dXUqxj+d288tbyqxlWPCLgVYqrF5a3nlreVWMqx7mVYqrE5a3nlreVWKqxl
WMqx+Wt55a3lViqsVirHVY/LW88tbyqxlWKbeAwhj8tq2oeW9XU3nlreeWt55a3nlreeWt55a3nl
reeWt55a3nlreeWt55a3nlreeWt55a3nlreeWt55b1dR571QiqFVQqqbjpVCqoV+flUKqhX5+VQq
qFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VC
qoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFVQuqRFQqqFVRIqTVQqqFVR8fSoVVCqouVFq
oVVCqpJVJ6oVVCqpBVEaoVVCqpMVGioVVCqpcVFyoVVCqpHVJ6oVVCqop+VQqqFfn5VCqoV+flUK
qhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+flUKqhT5PVU
vnuafyqFVQr8/KoVVCvz8qhVUK/PyqFVQr8/aodVEp4HSqJVRH+KgVUSqiPKZxUSqiVULfaof9Df
3VOD6ym/flMpv3bjfN83zf3bt+Uym/flMpv3bjfN83zf3bt+Uym/flMpv3bjfN83VABu3b8plN+/
KZT43zKABQAKABQAZXJ7cplJvjKZSmX3qABQAKAAzt3zzlPoJkBCavIWta3nk1QhNU1QhNXnlrWt
55NUITVNUITV55a1reeTVCE1TVCE1eeWta3nk1QhNU1QhNXnlrWt55NUITVNUITV55a1reeTVCE1
TVCE1eeWta3nk1QhNU1QhNXnlrWt55NUITVNUITV55a1reeTVCE1TVCE1eeWty5vKgg89oDg/vnO
cblRoqB1DBg/n5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5
UaKjT5+fn5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5UaKj
T5+fn5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3HG5UaKjQy1B
IoJlCkqNFRpu443buONyo0VGigEMZQAKAZUaKjTdxxu3ccblRoqNFBSoGFBEoB1RoqNN3HG7dxxu
VGio0UCRoKBA0FRoqNN3HG7dxxuVGio0UEChONb5VGio03ccbt3HG5UaKjT5+fn5VGio03ccbt3H
G5UaKjT5+fn5VGio03ccbt3HG5UaKjT5+fn5VGio0+uOM/kuOMmqNFRp8/Pz8qjRUaZbAcf+RwmJ
zSo0VGnz8/PyqNFRplcJxkcgYuk4FRoqNPn5+jDVGio0yXHGbyvHH+qNFRp8/Pz8qjRUaZfjjNbu
ONxPZ2dTAAH///////////QqACWiAgAARLjsrxH//////////////////////6jRUafPz8/Ko0VG
m7jjdu443KiJUafOQzOZVCCoQ3ccbt3HG5UIKhbL4v5zCoPVC27jjdu443Kh9UIYbKZXk1927jjd
u443Gua/PPPJrmvu443buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu44
3buONxrmvzzzya5r7uON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu443buONxrmvzzzya5r7u
ON27jjca5r8888mua+7jjdu443Gua/PPPJrmvu443buONxrmvzzzya5r7uON27jjca5r8888mua+
7jjdu4k3mua/PPPJtGzSTif4k15U2TY5555Nk2N/Hj9f/mDabRs887fyje/MHPWmONJ3cGZ3QTiR
bhMA9P2teg8VCrOufms5mYp6134q1SqVSqVSqVSqVTqVSqVSqVSqVSqVSqVSqVS81FamvkLIWyoZ
IpPvq4oKzafS/9uQvCjM8KLt2+mS9m+haaD50Cn/HORch1D4+t1Fvt3/Pxv37/j4+t+FZLRKJxBQ
oUKkV86hQrxoH0rXM3/lS8431eTKKR5/n/+/P39fPk/41K5i/+d3z4+/mi0W35qqLReMChQoUKFC
u3GYqxUPut/Vfq4Y/821H7RYoUi8YFChQoUK+vIUKoVI8KJvzHuDxo8XDOf189uo9/DzVW+W2nz8
Y8qFWNjde7w86MKRfAj9RaLxgUKFChQoUKPO2Ya9W67/Zn4SXLWMr2y1SNr881WoCkWi0XjAoUKF
ChQoV1ecV+FEQeDpFotFisYFChQr/JerihVf+nzgfdFotEotLFChQq4oKPYDgAeeeeOOAc883aAA
GAAADGMgUKFChQoIpmA8Fsg+nPz8rC1PE1vn5vTfIhVxQoUKYj+BQpRTjhRRTjlbcKqmZMs5CTAh
MCE4BTgFOAU4BTAhMCEwITAhOAU4BTgFOAUwITAhMCEwITgFOAU4BTgFMCEwITAhMCE4BTgFOAU4
BTAhMCEwIyVmdOAc35npmUskZKzJmnMuacpZQylkXMWaE4BzpltMCEwITAhOAU4BTgFOAUwITAhM
CEwITgFOAU4BTgFMCEwITAhMCE4BTgHPmZ8sJgQmBCYEJwCnAKcBpwCmBCYEpgPl7P2fM9pwEmAm
W6T9o/T7VioGbiZ6bAV3Ed9OHLiZ76QpZTtdqvtH9z5ezkHnkDJ/LWtbz9UPRTaRSKRSKRSKRSKR
SKRSKRSKRSKRSKRSKRSKR7K6PWk5FyPR/HJ1MoPgpQ6RTMiU/XSch+NMU86PRKN5ZRo9EoXhRPah
5DoVLyTknyof5vpDdlCodCoNAoNCodEoHhhQnt8PxcVJFChQoV19axQr1of3ozBnX+qfpG6sG6dW
pnp/VCo/P5+/Pq/516My/wd336UP1lH3+qsKR+MChQoUKFChR5mrVT/a595jrS0fucal/CkeKFYw
KFChQoV9+goVQ6V4UffmfeHhXyZz/G6tagePnpX+mk/z8b+lErOxvh8+XtS0eK4Ef4oVjAoUKFCh
QoVfPWY8xV6v1DNT8wruKqWfavUhQoUKxgUKFChQoUKQFChSPxgUKFCqjG2tChWYfwUKIU/FQFCh
QqBR3a1rGMYFoWsYyGta1oWta1pwgKFChQoUKkhR1jfr18Cw7uwa9dU2mKIUKFCmiuRQpbnnnnlZ
YANAqmZPTge98zpw6nDqYJJgkmCSYJJw6nDqcOpw6mCSYJJgkmCScOpw6nDqcOpgkmCSYJJgknDq
cOpw6nDqYJJgkmCSYJJw6nDqcO54ykmCWXMp5nTgLO2eMn5VyhlVOAk4BTgPOWTcqpgkmAacGpw6
nDqcOpgkmCSYJJgknDqcOpw6nDqYJJgkmCSYJJw6nDqcOpw6mCSYJJgZktOCk4dTh1OHUwSTBJMF
UwSTh1OH04eThNMEEwOTAxMFU4bTg7MXvPodaob0fuszTA/Ns2tUTKC7Lf3MZfy85cPnDM6P7RmM
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
Nw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O
3tNw3N2cNw3DyMM3Dc/cIbhuZryNw3GdBuG5/cG4bnzlTcNw0jXNw3M0RuG5/9puG529puG529pu
G529puG529puG529puG529puG529puG529puG529puG529puG529puG4nw355Y7tNw3O3tNw3O3t
Nw3O3tNw3O0VAEoB/vcoB1AMDDKAdQDa+FAQoB8YxQB9FO3owgf+I//+O3tpSlO3tj//4j//47e2
lKU7e2P//iP//jt7aUoPPTH//9vb///TfGQERF4H//6X9//8my/hEadM0f+1/Lt7fKIiIiI8u3t8
vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8
u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiIiI8u3t8vLt7fKIiNeK/cws+von+vzty
+ZNnz7e3L5ft/Pzt7fz87cvl+3t7e3L5ft/Pzt7fz87cvl+3t7e3L5ft/Pzt7fz87cvl+3t7e3L5
ft/Pzt7fz87cvl+3t7e3L5ft/Pzt7fz87cvl+3t7e3L5ft/Pzt7fz87cvl+3t7e3L5ft/Pzt7fz8
7cvl+3t7e3L5ft/Pzt7fz87cvl+3t7e3L5ft/Pzt7fz87cvlziObN5zL5ft/Pzt7fz87cvl8009N
WXy/b+fnb2/n525fLmyRje2Xy/b+fnb2/n525fL4TM5wzMvl+38/O3t/Pzty+X3mrt7cvl+38/O3
t/Pzty+X7e3t7cvl+38/O3t/Pzty+X7e3t7cvl+38/O3t/Pzty+X7e3t7cvl2/n5t+vz8+cvl+3t
7e3L5dnP5/bWz7svl+3t7e3L5fL7Pyb6l+Q5fL9vb2+GXy+/8/Mr/fn5lcvl+3t7e3L5f5/Pzjt/
Pzty+X7e3t7cvl+38/O3t/Pzt+sv2x29pF2/n529v5+dpTLPPVvKbt/Pzt7fz87fksr0eEYj57fz
87e38/O3EYiIiMRiO38/O3t/PztxGIiIjEYjt/Pzt7fz87cRiIiIxGI7fz87e38/O3EYiIiMRiO3
8/O3t/PztxGIiIjEYjt/Pzt7fz87cRiIiIxGI7fz87e38/O3EYiIiMRiO38/O3t/PztxGIiIjEYj
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
k0//YULciTZPAxvXJdnZ2YY9uzs7Ozs7OzsxOAxp0Yvy7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs
ze/O5TDi3s7Ozsw303H4TI+Tezs7OzVn6ZrNGFryHZ2dnYDJc1fHdEnZ2dnZzrblR5MPO9nZ2dlc
7/Akmz3Z2dnZgejdIEOKznZ2dnZ//+vYz57Ozs7MH2dnZ2XSR2dnZ2daQsu7bV3Z2dnYnse+bz2d
nZ2XVl2/Z2dnZZcibt7Ozs7Ou+E132dnZ2W9vZ2dnZb2dnZ2WF2R2dnZ2DfizuT9nZ2dnZ23m8v2
dnZ2JHZ2dnZfF5vZHZ2dnY9t5Lw2dnZ2fXhn+zs7Ozs7Ozs7Ozs7Ozs7Ozs8NnZ2dnZ2dnZ2dnZ2
dnZ2dnZ2dnZ2dnZ2dnZ2dnYcfQoPjA1eY9GM3dHhhvQr4/sztpk9B3eH3g/v9zO/eOnE2enneJPT
b9+j4IOK/YkfdlCx5ha8NNm8kY33Lhy7PR8A1Nu6KdGRxHRWvZTJ4Gmp8p5/vw91T2tLAt+Dg5MA
GFk+u2zstSZsVg7x2diT2dl5tvFyJN47OyvY8XV4K5Ozs7ISLrs7OzsQudZezuzs7Ox7zpvKT1pr
wkos7Itv1NcyF3Z3366dJvFyIuaxIviy8pEQ9pQ6RcllkISLuL2o9ck3JcK572YiO2El11wL72Un
Lrssco/KsDddHQk9d5vYo3MN47DGeeoecb5dl4se83Iuu72K9lpJNwcJJDSZb1prELrzdy2eXzlZ
s3in6P7tx2Ai8usSFziRRioSM3mcbhPc4Vg2wuzjfnAZswujo2YDovHRNisXmvBLlIp/F7Byw7uu
TjhApHYk3Bagv0X2PNciLkte9kVZPj8W/xSUF4t6KI9ej8zXYGuwr2beyI7O1ZgzDybpCfXXG7/m
Pf+8vbTivjMYMP/7g3enQ/Qh0RGxOzfXdqtk+tG/fma71n19mRrxT2dnUwAB///////////0KgAl
pAIAAHX83L0R//////////////////////+5GQrzCS9xpV17G45wuVJEdd1cDDBynvkpsxlbUCuk
yjvOV08YTzrqpPk3FpXZWpnyeYycjA47xvS64osuS9nITIsWWosTXiOzrCN7UmnvNiHT3Vl7Ge4O
y2Ejrstd0h+5O0Xpd2iM43stD2ISID0I7LVvr2e5aQ4LlCZt5hFtl7DYjjUlsWkMtWCuHr/spgM6
cHZ/9HRsSOy8YDRb645Y4K22Xfd10IRfoq5w5WM1gMvx28j84HPeGQ9Ojr19jNpzeNaRlgdHqDJx
843KowGhHwtSeafWX+sSjsT9qXsRs0TmTm8dpzOL9aU6LzcHZ9YrEZu9gfV3ftlyRYne4G5PIHGn
fAl0UwnOAwmHwW3BZWRmIz+J5LLauguiy4K7cRR0/hgsxyTwvLz8ejV4ZJHReb2ZezYtuC8Re1EY
L8wxXmy7jX8dHn53JVYkOmvyy9gdF3fnxzbVJp68764q7sRcmS48cJHh82v0VurbBvF4fsvaibyn
vKe83lFt4SkkJNEDDpr2ZdwSd0i5Oy8J72Lclrii/YqGtRJeNBvCyL2B1oFNcFaLovY15Gx6NpW4
O226e8XixZHZeYJ7mSLYXovkrkSEm6GtLCpYV3P0F0P0UCMzrRvYxONW9DixdCW9nRSq0bCsHovF
yIurkvFw29iyzrvN7AQTpU7ldpFHEmWJDrRewoewrQNchuS4CBW1Y7OhKLboUWJMOlvFiZMi8XhN
cjpFl4WWpKQ95G9mXlDpN8pNlxONiWLzYJVACvZZZbS7tv2tWC4tK9dH50dGT95oCOE0txfjjcNA
jiP9k2WS0uC+EXtSSLiiI6FpRchDRyr12oex1yQt4A2tLkZELnKxCfrga0uddeBuLtu7Ojor+dA+
HRkzjExMUoD8t8xjeH539nZmBzJl7qnudZzYzTT38jqwCgB7EN6Gcpezs7OxL2dnZ2Jezs7OxL2d
nZ2Jezs7OxL2dnZ2JY7OzsS9nZ2diXs7OzsS9nZ2diUo7OxL2dnZ2JX7C7EvZ2dliXs7OzsSsbbR
KXZbRL2L+x0uVHZp0/XQOJ3IM4O3CeYPvV0ZvHS89h/LmFC7p09nZ11vjs7OzseEdnZ2dl67Owey
fjo7F2+U0fDMH8d/rL9/KoWyBymvp6PnKZo4D8m4MQ6jAyP72KAKtF/ZTsW6MOeGs49uS5Ov7HG4
E8lRybRnFkDJkxpxZ016GwfvpgD2N7FqkH7UAHOSP7FKhg0amFgOg7uTf+lQQa1Ti7GmL2exkDSC
rVNUrLyi8oDeLmckxD+gOfs7Lz2LbzeRvPZ2ZjxD0ZHoebCdnZeezHXm83ns7McEwcTnjhHo5PLI
qAybdnf/3y57uZOLA3+yeNMLLHF0e/4RkHHi82oAPPIHqBUC4s4ejo9RwZhGIZZlGLgsydxrZ44j
mOXbkegwzSwCgLNw1cMDoOXkKo0zRx//ub3sqHseY2C14VUKUPo6Di//b4UA1aG1gN3RhTQ8jPOs
8sn0bTC/PcwsF0GudaofPiSvO7xO6fHZDG4v3Ns48XCW29Xi291rezsNT5Z2dnZ2dnZ2dmSvDex9
HZ2dnZ2dnZ2dnZ2dnZ2dnz2e3Zx2dnZ2dnZeLwdfZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dj+nZe2bmv
cyGtvPZ2dnZ2dnZ2dnZ2dnZ+dnZgN28wvrXkOzs7OzM/ec9+gw+ibs7Ozs//jLy4Xw7Oz67Oz4nb
++2U7Ozs7Ozs7Mr7ZMwzV98oe3Z2dnZ2dnZ2GKbfJ1mgg+uzs7Ozs7OzsS9BwGnq7Ozst7Ozae94
jsUCN5vN57OxP2dl5vN5vPZ2I7Oy83m83ns7Lz2dl5vN5vPZ2D2dl5vN5vPZ2H9h8P+3kovawJTA
UAnZ2QcvZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dmOxXZ2GaZHZ2GBt7OzCKA
bs7NWvs7Jffs7D3OPs7Dgw/Z2ALs7Mj2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZjlQJjVAB2dnZ2
dnZ2dgydmEyvZA4bsLd69nZPXnIdjM6PZclydnZcnZ2dnZcnZ2XJcnZ2XJ2dnZ2XJ2dlyXJ2dlyd
nYPYXR2dnZ2R2Juzs2aq9nZx2djdK7s7MHWTs2N/ey5I6L1clydnZ2dlyXJe5clydnZ2dlyXJe5c
lydnZ2dlyXJe5clydnZ2dlyXJe5clydnZ2dlyXJe5clydnZ2dlyXJe5clydnZ2dlyXJe5clydnZ2
dlyXJe5clydnZ2dlyXIlyCoM8Def70c9HZ2cEZvZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ
2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dk+Y25Hs7Ozs7Ozs7Ns
pwnv2dnZ2dnZ2dlGeZjdnZ2dnZ2dnYbZjmRmezs7Ozs7Ozs1j0dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dn
Z2dnZ2dnYzs7J+js7K9nZ2dn54djNX/LN2dnZ2U9OzaPwDw7Ow1+zsp2dg6ezsp2dnZ2B7Oz77Oz
s7Ozs7Ozs7Pvsk7Ozs7Ozs7Jv3z6OzR2dnZ2enZgudV57FQD2dnZ2dnZebzebz2dnZ2dnZ2dl5vN
5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ
2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5v
PZ2dnZ2dnZ2Xm83m89nZ2dnYuXF2Xm83m8ruxvZ0M6I6OwrzebzeexZ0dEzNoxfHZebzo81Kpqjo
++/wlRHUseiejdmz+VXoGt/8y8W1fwhX9vyDGF9X35hGDBgwYMGDBgwYMGDBgwYMGDBgwYRyIM+b
avqoLwHkQjhCyxMECDBqI1wLwwvAQS4XAiprDPHx+A7hgwYMGDBjxgxfGVQ/3n90HQsv9pf2er3s
RrR7bvh1LLB1L39ynf6f0mIYIEFp/UtSBCGjx8NjpV522auapQlFVPltzUf9P5BQ3urn4xAhf7u7
s6u3E07F/Tb+CPP9AQixzUkNfpp1WcRp3TJktOzGeoQ778by2/OMEYwxgwYMQGDHjBgwYMGDBgwY
MGDBgwYMQGDBhIJW6XZ7XSBPGDBnKj/ouBgw1Blm3eMeMQGDEBiWMQGDEEo/hZSkr+1UGDBgwYMG
DBgwYMGDBgwYMGDBgwYMGDBgwYMGDBmhcZxypydpvxZvO0xgBmveMGDBgwYMGDBgwYMGDBgwYMGD
OKiqMGDBgwhgwWldARDERO2l/2z6XoZ3x0yeMdukNMciEElBKIS8unpRAkvpCTxiMdJdJScZgpEa
JQgQa3jjUbqExXnGFNmv44GDBgwYMGDBgwYMGDBgwYMGDBgwYgVzUOVra/yp7MYgIRCOEL8kyRGM
NBrK+wGwgW9MYEFs5gRVVvPy+sY5+BgwYMxgYMGDMbGDPDHHpEaef7z/KFoWX+0P18+FBI7rw+gb
/qZAx7X6tl6AU7/b/O4gAgtX9ogQl6fJ/jt0nbZrWq1D4VU+g3NT754ozqW+TuJ2ft3Vm30bdnpt
/BHl/WsItM1TX7a9aGre6OUFhG1L8riG3W7EDCGDBgwYMGDBgwYMGDBgwYMGJYwYMGYwMGDDS726
NKDBgA6hARgyAoDDQsl2SqVSqVSqVSqVSr+cY4xjl9e01iJp4wYMGDBgwYMGDBgwYMGDBgwYMGDB
gwYMGDBgwYM36Ri6q6tmlZdvCmuwxYZ9eIwYMGDBgwYMGIDBgwYMGIDBiAwYMWpm1AYMeMGDLjBk
DN3AgKMjXmR9Cc44mlcYSqVxhKpXGEqlcYSqVxhKpXGEqlcYSqVxhKpXGEqlUFQPN7KhRPNkcZmd
1DlM41VBGdxpeZgf/tput2APH0NJQWKCionWfZ3+PEypCNNQU16vAwjFNkQqC8JnzH/sHAb9Ows+
ewz7DDOP5y0x2ascqIjzwFQucJ4a4PbVqBkcj8y0n4r1eHtXo6PnX+U8wZHIhfRpOI6MpxP6dFJ+
jRN0TmyoLVADoUEOO9cRkcdzrk6MV7mZNMoCNJpmkowcb0X1nMAoLFSGqDVQiLY1fipVUCvmqB9u
f6Pf+Ok/tn+qL89P+mJ5qFdQHYNQXcYcxvLIx7qhRh5HrtAoFTJAcJ/yZH/0mHjfcx2zeM+LVMAc
j4nMoQf0VAooKVAmoEzhr+HmoGTC8jSwqoOhQFV1izLn3ksqzFmccEyoDMg1FRooCVQrH7mz8k6O
ihh9HRE+OLHGJgMToUBxwHUoRM7sxWIMfPnV4H90bgA/8xm8h9aqHEqHjbGn4oDDS6Pra5mmj5bq
NL12GfJKHAYrBAMHEdBzHTwvMDQJn+ec2HDxiMKqFP7w/8yYSgF6AM11Zksrlz7NRUaKgMyJv5Qb
mMe5o/HT0ebQT0b+GAoA/A7FCCoFMp+D+nmoAnqMqocVA+uOMHoYYf6fyoL3Yr1klM7oMk0fJzN2
tLdQz5PXZgMVKEwcRggAzHRm8hhML/gxZjKjCfNaP06pTj/uibx+pfHNx/cGQeigFVJeZ8MrkMJl
m9AOg/eVQfkDtzXj7mGYf39mQoB1AMZHC0gGoTmJjcCHZ+Vf7+/vEf/9hsf9/f39/f39/f39/f39
/f39/f39/f39/f39/f39/f39/fucBwY322Z1uQ+yObo4Ex8Fj8dk+W+By7jiVBioDyngAyvcy1A7
5+Qs084jE58OfOvxR95rX4GDoy3637ODJ6FAGbn9moSVkddwjF2kxA9fXA3hJUAygEBLq06ujn7+
/vPymTnzg+fPmbKw05A5D71HSHISz+j6TAxH35efjrOA1RxNL7+fg58N/bt06oBVCv7lfvKDq1ua
mqXRq0eygy04vUX6+CBkNX1lzA0+nzecncelUCb0wYwWd375cNvOPG6+XmO3M+G/6KWzDEi9hXXW
k3aZN12D13PbcF8pDoOJ+3rtvF5RF2kQ92UXlJT2xdEssWqAhQE+HCgJUBPzgOjmQxzHMcx1QsSo
VVC6oWoi8+N1kfs5jp0dCcrw5+RYcp+9lzlJpjAeOGwCfLf156P9MnsvDxYVoxSEnbl24DBGimu9
enAaw+6gLUBSgLUBP36gAAxzHMcx1Qs6oUVCqoU1sE4Nmg/s5kN+/5/+TC/v/KMK5bwqEt951/ao
Ltj0G8+GD6IlMbr6P/LR/ZX/6B/0novKQMbDo3vePnecOz8ky7NBqeAcKYmLnl1F7eGlQFKAhQGK
AoAAAMcxzHMdUKKhRUKKhOEXejzMl/3DJNJzsNrxMPVnHlxygGMA9zv/83Dxfl7DSbMMcBe97MuD
I/p05A+j5pnniGGPeyruXtu72X+5lUBKgXAnGFsO7lr8vHQYhq4TAKApQEqAtQEgAABjmOY5jqhN
UKKhVUKXi9iFEXOkWDdrrYdJSUiIuC+RsviF42xbDxS6iL7UBSgIUBKgJAAADHMcxzHVCioUVCio
UCc3zlMsIP2/VQkfZyxZfKa+dQ+Y2XjoNjYZMf+Xyn70fv4UPZdxe1G9bxeO28U0DfnyHLGd5mMI
Gh9meGGwepQEqAlQEqAkAAAMcxzHMdUJqhJUJKhPXB2y+B1Z3/+Mrr+coCbQ381afVz8zsauj7VA
hRp4kkwuD4Ho/sh85b+4YWl72YkOHYeU13/HD/0q3LekpgmJPnNGjTr0g9cF6qAhQFKAhQDgAABj
mOY5jqhNUIqhNUJCPqZnOu4jrNT+MIG6IHX6qAZPZ2dTAAH///////////QqACWlAgAAjh2CdRH/
/////////////////////8UqCzx3XPewkjru3MA4KxF0Rx5ZUKnvtXGCy7AspuyCoOPzxOMdQPAx
DV16lASoB1AOoCQAAAxzHMcx1QiqEVQkqEL2JUUhOSa7uut4iL2Ui6uq37DKxf1oE7NAYILwNwPd
2EoCFAQoCVAOAAAGOY5jmOqEXVCKoQVCIvcyTexey+CEkmLewrqIe+bb9goEmOTRo3jRUqCsrfCd
cyt82h5SGRTrTXkYFQEKApQEqAcAAAMcxzHMdUJKhBUJKhFPZCTYNesroXINRsGLaWvFg9DGXlt1
UPPLHhD29agIUBCgIUBAAAAY5jmOY6oSQqEVQeqEEWJbL2bF0SRfPZeCvi5IvYl8NYV/F1918dd+
9ydF06QoCFAQoCFAQAAAGOY5jmOfho41UAHsfxtm3n/k4js26fM7P3dkfvL5PI5m6vNnWLAiBOKR
D3sWKLE8VvF4uOCEii9mrr9rCRdMGOq+bzYoB1ARhtSgIUBADgOngH+YuKx0gQDP5GW8/RgzuyBi
mcoI//MqgU4/zbjG4rGmOY5jmPg1AAoBDJ1B6Hu7OuwSGExe187cjlA6/DG++VhUEfDOjy16COBh
0GOY5jmPk+g18D7qhFUIPHXPfN5GLyL36xoLAt+fn9/TiOKb/jAznma3mqI+cxkjkOPOnGqEMVJS
sv2zFKjHKgkbVuzSqPDgMifw6FQooAjK+jHMcxzHONUVGQoC+j0we8OOz34ce/PKjk1M9k8ZhzDU
EKg21qg3fh8uqGjqzX5vNT09FDzmlAdjMh+b9u/oVB/XYqBlQiqErb7Q72UuFZCBG7T/P7+/Pz8/
v6cRxKhNUBKgk4jiPGv3kqnWdx24vy90+7A79v99fBjmOY5j5M+zZM/B4zB71QEoOlAmqRzj375j
yw+HMMyMGaxw54Bh/h6bzBVMhlHfk8HrMhQHByagAMPJ5xQZfiofzn4ZAdeONQyPTGZ7J+OOVLip
8OrOb9+ZVFWfNsyMZr/DhwCoqzm/fhzB8lBMqDd5s9Bn5o1tf5v3nyYKo739B0YfGGzg1BJhw/2c
PRU+H6YO/83mooTVighUGpkYPo25XPKjtUAbzjyZhqEE71AEqEkhUKKhNUJfP7+/Pz8/v7l8kcRx
HDqpkwJucPq8f1NtMcxzHMdUJKhFUJKhJ0vz+/vz8/H5+5bOHEcU+36mMXUHJmPMqFDhzB+HCcZw
jgsds2Zv81Zn+MSmJMfG9HiHUdh1ZVUVmCZBgGIcpy7v4wN4f3flNpjmOY5jqhLOm8oArbM8eGQy
uczGXzWWyxjmPjJsR1m8cKgFN/E580VBvpNfV0KCLPuqBjP/ug6FB8bigB82rJwXc/6+z36CI1DK
N9QRCBgGNEFGBm/2yAWc/2fzrPf68Zt+84DMwXld449zVUBJo5pQKKE01zTzcpg7fJUJ45UCyqgf
DGft/8i+/QDjTgCjKbGZnFZDbg8ZrwXR0V2f27xmbv2KB37XND0SMbvoxkSThmKp5m2AqKh/zABx
bnhv4LfoisfDQfHeplLBwR0qgVdfizaJ7aza09NDoQQ0GhMaF1K+xbz9fMFvPaGOOPn38NTPeofN
qFV/nl5UKhUKhLL+PCyyympp7ffxMQatzk+D0L7TM78WOaJRPTbuV8aNSKfQqFQqFsXXXa308rcU
X8Eb2Bb4MZQqFQqEuurp2L7tOp0sv6+ZHcQIUO99l78/Ai53uooE6F5+S/1oojKNRaPQqFQqEuuu
u0/PxAr7/ZPSRG7qH4DvpZQqFQqEuuuuhBPNlCoVCoVhDFNi/18PoVCoVCuvZsImhUKhUJbldZDx
87EIFAZxgCXl50KhUKhcrLKKhoWlepqkABtZYEcuzJi0hMQuWmzQgbc6H5UTI+kPpsK/ks1jzIr3
N8kpOrhnOjFWvmVZe9sx/NA4a0OQaX7mFt9dFooQ0SiMCF0ezYv6+/oBnru5hVT7oPl4MtQal9so
lb+lrpdYrFYrCinjxxxsV1BvtoPmYidF7mal9Ozde973UteaRRvXd8aPOk0vIbaxWKxWFVFVQh9/
RnFF/p+TAFvi1raxWKxWFVVdSim/Trdr7Pb0I7iBChnfbdb5EXM7sVCdD9fRb81UdtJo1La2sVis
VhVVVVt/PyArQP0RuJA26mta2sVisVhVRVVrW1isVisUD1Yoqr9/DWtrFYrFYYpZiNrFYrFYUUUU
2bZmRTQrYrJ3/FYrFYrHDOOOeQVjerS8Wd9+eSAEPJqiLGHRHFhGk/gKJAouBhVr+VQAOZVAXJBn
1T2bKqA5j0DOpqqHw/bWCFz6SqivU2wMp9RVQMh5siqCwwYyqAjT9Q+kwB5MzRm6HFriqhx5vqqJ
urPmsgHKqoLvz0QZVUBGghjmVQEqoGAztG8ewzhoMFWUU/Jo2mDvcJm+kn65eASbkvJeTRPYYGjR
ww9Cx00hh+nQzG0oME2iaB2HdqAYZ9DbmT/rSOEWw6OoKoOoVQQqqDA+/tWp3Q71UFOhBo88MOgM
KqA9VQsqgJt2GJjZbGjBoeVQAKqff6hfIaMqgXRVQGB4taOiaFd3TOkqoEDkjXSCqj1VQSQDmdIM
RVAJe0aY0CFVDiqiFBmVQHnb/3w4lUBCqCDVAwQ9Pe19i0pVAYqgDZO9TVUWKqDFVBYbrkNR+zBy
BzWPaFqGhB+BqsV1VA8HgHNp7cGCqgbVQwW+1UJ4ZTY2CIXX5h+fDHDgDwapVUDaoHHjIcmgfVUP
B2NlwgQt/x13oONEIBm9tusaI0tzSQ1g3QdrEGtpY9aSVUXqoMlUGaqCtVAM3qoBG64qggtBhaf/
SdO0wN02sptjGqgZVQtBsaQqgdSlNptMnyD+DmsMwcl1VA8GqxNjaqofVUMay06polvu51EBhtl4
2qKoCAwW3StUVQQKoDFUBzexaiHQikHR7zQwMzUxqqjQ9bLfrSqDJVBmqgr0QNLoO3WDENLGxBrK
qL1UGWtJKoBm9VBmqgruKoIFUAjcQ/ax0GFo1shq+u6UqgWsaA0twbMNDcQ0xp0jXbEsWgvYDu0J
gQuB7XdQPY+fUcahjQmXTdG07Tg5A5LSqAcMS071NiH0xstdywsDZevJJJXmqx3em9eSSSvXkr15
JJK9eSvXkkkr15K9eSSSvXkr15JJK9eSvXkkkr15K9eSSSvXkr15JJK9eSspptzbrYdFgg2h4qoA
mbRtBVUM64lgONuNoGmhhmD9D41rQLQZjLc1TlEZZ+rDEi7Fo7LpiqA++HfoetWWAOtVQQ1+sBuB
qB/qqBpoYgd7FKd+TEvZHM7CmhbOxQpkagY9wIP8P+0Q1vV83s/SSvXkk2w6SX41nUCAFsP28Qsw
qgNVUHELFq9praQVUahgaD9MgHtDp3YhlVQA6SeWG4H6HfqNltapZ7MBs2WMxDPtYS/UyQB03J8d
smgQaossgYJrTWHSqgN0LQdddnsFWZtte1V2pVQe3a2/PhvbGha2p2d0FNhQPbaEJkrlvAhKgZXY
kSwpyneC2dgBRyHs7blb0Ytle20IBSCLe+AVUAKqAnjmqoCD/ua8HUHeHK2NjY2BgqAwAwQwf6ky
+1NssB3g7lSPbRUMu5sG2OShQDshDsaYbzVf0IM4hfRtj5SPlUgrGPYZASmjaFozYzUwvz1Po+G5
pVUBqqAVRVQGqoDSbdS1LUmxsbGwMEEMAMAMC8dO/9PTkSCaqCJPEatgXkcCnYYcXn0xZUXBpi7p
V1QgGTcvqSALQQt2OVqwMnuF0Alo5t7ZSDGStKqIWPyFvPTdo862Y4a17oO5VQEqoBVFVAaqgFep
alqWpNjY2NgYAYAYGnhQ7QGsHP0GSMeLt8NHSFUA7ezbxTqesh6hzs/R2PbZJg0pAnUEvtVQ0h5W
9OIY8oCglAAUMzJi1A4dwcGph4Wf1O05ceX7SqBjR2TQWfOyqoCVUAqiqgNVQCvUtS1LUmxsbGwM
AMAMAMCVqF7bW4XtZ2RQIJLJqBg76twANRW6IqSfKpB20ttylVASqgFUVUAqqAl6lqWpak2NjY2a
eGAGAGAv+qaahqCX8B9hBejMh5rlyvfaq2lwM5wwbl8hV21bU2rPD/IQHDeE9tqqUPodSzU322Iz
L9JLWAyOq6dVQAqoAVFVAKqgFepalqWpNjY2NgYGn6fp93+qYaGTD6IGtaxN2kb7Ml+5QOGHldTT
0Sl7+92kx6FpR+7l8xyFvGEehi5E6lPrR6aD6T9EPvQ+nZc4pE2qXbIYmWNqVUAh/qgf6qgBepal
qWpNjY2NgYGnafp4Q20obFUAocjIA3BlhnKoBGoxOa3HK/dD/DzDCsY2V7OtmT4KBXQ+mLRiHVE2
W7A+O9lPwdgeGpB2bwR1UDuhMzNYuCGqoCD/VFVAAf69S1LUtSbGxsbNO0/T9OUqK21KrbbXzU71
18lAxqKPxniQH96328iZnk69qvg6qgEP5UVUAKqAV6lqWpak2NjY2aeFdP07TwQF7Ue2oBXAGdnY
Hsb3nsAUpVZilTSmODwQojvs//zIcnp95tpVy3s8ttPkCBMbwe5laqgBVQCqKqAFVAC9S1LUtSbG
xsbNP07T9PnYkKbaYE0p5ej70QcH8frnIya+Qx5+4HNe8mIgEW5LKqAVVACoqoBVUAr1LUtS1Jsb
Gxs0/TtO04JDkmFFG2mMnvFK/74c0sB4mFVACqgBUVUAqqAF6lqWpak2NjY2aRrbXpOg6UH8HZ1G
val/WFVCh1UAjO7AGew39bXQ4d6d5BqScDGsEYqr/B97tscdxzHPLg+8AGEN8NVQAqoAs9LVUAKq
AF6lruqalrQeeqtD6uHqqghDZadQRrVA59cDO0BVQuQDqD6DpbEQ4EiCqgRVQ3rbY2NjY2BxByav
KNgc8uGK3g/+bLiVzm051JNu1nR2Fw4Q8/wgGKH4GW2NjY2WNS13SmrT9P/RDhxDLDD3O12a206p
KKzlsbGxsVQS68Guxu1WGJAMMM7SNCew16agqoUbfzxloYQ+zqqEXNHs/9esopKoJNJSTVUDKqF1
UDgaedPbGxsbNNVQfsyqCLRUA5dR14Pu3ouusyqDlVRoGBozEx5TDuDxDU1HUcaoqpPDQVUX6roJ
BJE90ONrrRWcNJv0nTtI0/T5obyNYlkqG2NjY2NjY2Nmva8y+R17Xp/2ytEBnBphqBmacGHY0XoM
NVAIqgGVQCNjY2NlrRPKoOgxSActBhqqNlULKqlHXdA1AP5VBEqgCbk9EDlVUIB320EdFIagqoUv
hih6ahoAa95VQAG/qqqgZO8QIIqqLgwtV70Nj0sOxVQAk15YFUHKqhVVB3qxC1OgqoDFVCIdiqGf
RCGtoqqBVUCSqlC9oGoZDvVUFBlM2gve1VVBeqpSDg0XQG9kDIVQjqoOdF0sMMgH0qg400OHU2kO
IhfVUHqqFNQ1XQSAcaqkdVBTogcut2w0w+1UHYajPpuoaO0h6Btafp+n6evYW2NjY2NjY2Nmqahr
2vMiP0znYZkgQbGxsbNP0/T9P2pNsbGxsbNTbWzVNZ17XmXQHnpDVdRzSqlzQGMONLRdFaNd149r
XzvdZ9F0sN7RrAdYd4cocIc6qBcgQcMjQQyQ4Lndhu7ietBNoLY2NjZp9kOEOMO5uuagxsOqavqe
ptjY0dhhBmaMqoGDnDwDp6IBj+VUMB19agH1oAcgcvSqAqVUCga4aTYgjchnlkuaBe467q4cAecf
yeX8Q5Q75PPBD/n7bNb1lBnaSHd2+k3t7XpejqqFA/NJVUesdsMmFVF4cTbrgfZDV9e+qgK1M7bo
2s3EdFxjRw4GltDm79oTBqWh609nZ1MAAf//////////9CoAJaYCAAA2GPLKEf//////////////
////////mvaywYtTi3ot7rOgtIc3Wcv/CD4j7xnLz8gwWOBGODucXg33Gf3MWHm+JRl/VknD5MOM
NM3Y4z6dIV/6E03EIeSUVXkx6646T9f/SHrKFCUWhIp8sutUqTHEW2kEEEJUpf0qXLkF+nQoql3p
cwDCoLKLiKUoX8Em65HPp/sV+4iCCCCEiVKlmCSPVSRwL1JZRp4iIIIIISpSvpUrhAg+dCikCpd6
fMzEkQVUvSNYKUSHwklES4oQ4iJ/kQQQQQlSpUswRdRwV9XUBygEKWIiCCCCEqVKlWM3EC6uIiCC
CCCz8lMlS12I2CCCCEyXqZMOQQQQlSpUt5WrwopwajgHxiCCCEqZKlDcAESbcpNMcSCfXHtP7PTS
KnXuuMwOb03JnXBoxeb7XE9C7uYsPoXQt/Huy53aAcXzjb9cVcON/yUpf/ozTcSi5RZdeVHiCDpP
1/VLfWUSMstETT5aQ9UyXHEiJEiRJwOAX/gcCbkN7i9FwKl3pcwAEuEhZcRSlEn3CC67ge9P8k/3
EykSJEnA4HA4E/QE0qkjgX4mngciZmUiRIk4HAKrwOA4QIP3oUUgHLKT5mYliCqpNJ2lEp8QIESB
wYnJyf5MpEiRJwOBwOBME3UcFfQnZi1Ik0zMpEiRJwOBwOBM5KRIkScLi8pNwOBUPM7nUiRIk4PA
4PBSJEiTgcDgcAxsUsxnH/uAv1SJEiTgcHgcAEEJJBWdg/zxv3BGbT83fisH8gIyZcRriCeDpWp9
NTLpWnNuhZvNWq69pwfIYSqBfV9QaGDRw40A+QwGXMHYzhn99h3uymbAxkg7/JMzh3aVojQ26kyX
7djT2B2tgDzDkbkbYYvLQiwdDPlis6j0yUztLTquj6NoPz2+zNmq4+QZD6N/UNV0fRmKzdvsZZu6
huvHdMiQlvIn0WLLUHan397NhhyQe7qRBsDraJIayGVWnaIxlkdU7fvUzNaqhvWGgO0g26tqKqjm
3revB2IaoGpoOn+0TRUW7X9A1nUdBtsOtodZVQP9J6IQfR4CmWM59K1W3puvoNxpLJsDhvBjWLCR
9SR1rWrYfP2VvZc3XCGg6K2WzWdVDH+H5pPtED5DDnNzQAzyBDOikCF6z7WULNhVAG3sGpaUGiGO
GHoQcoZmthikGrrq5dd479QdgawcXsakqgdQIX2iWXLM0W/6LfbQxQxGPRQxdAuaE3cphEgxNE6q
3tsa1Y9ZVQGNWNXDlDRIcsBC7kzZb0HRfaIH5pNzsOfUNSam20QYApfsmPrGg69qtlMN7vUnYEWj
RDvL6rdlFjsW84IKqBboYuihihifIBrZZpZWj7RbbQxdFv6KGKGIx6E3aBc6u8nf5C51iAxg5A5b
eph7h9mtELpr//a0+qIGssQaIcjLrmrXlUBx+HRDUkGrVdE17zKWLFixaWMsjxjj8MCn1MMrSu2j
UzwXLly5cuGG2asGAGaXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuXLly5cuX
Lly5cuXLly5cuXLly+pC2GHUbbRpLIwaF29rUtYvhyMet2zhhanYDE7NpF9wwtQDx0po3nWnxrTF
fkMIOWGYgg2ByMGoM7G239FrztDLO8Jy6gDZIKdtTbb3inebG2ko2d4MIira8KIJ4+0lyHZcuXLl
940jHwamWxSWsaejjSdCabGjPqNpMg9hmdpab2oNGtMD6T07a0sQZejMLJZ5Hb9UatXHbtgsKFy+
13O2Ng0m3O91IMf06PeZ9LDCY2NrnU72ssiJ7bQ1XkANFv3dPb0TWsz20NXe80u4+5CGmCncld5u
N4oFtFKgKyqytztQa5qSO9pZt1wa2T2SxYsWLFi3Dh8OLQ0W/VrmoBgcgx9fF20XtR61q9sBgaIQ
0WQBuOKAaLTZLexar7lLsF2zaLOohrYCxYsWLFi1chFi1deDUYL+pWdIZ/N2raL1qujXuthNjR1K
wD7KIYEtAYJBJPUtd1MgmQcBoZWSdAYw82jUQNDamDT21AMVuv6+0tVeswWqJLFixYsWLFixYso2
07G2kfQ9a1XRsXrV4MVithwb02n5Q0ht1fXhUse2wldrRa1jU26NP0zoOJBrsXdcZLXBC4fbYHuW
AyFtg60hmLTRYsWLFixYsWLFixbcBTgqyoU1G5AgXJ/KfRQNbwsWBLFixYsWLFi1FixYhGkX9T1n
o4FI6eHQ8yn78b0hfatZIaKGAysBBg0Z97vqIw3AQ050bWGdg1eZrgw2mhusln2pYsWLFixYsWLF
iw7uWhqaQ4WxisYbGYMXRbDQdsa2rVP6+GCxENAt7SQUEkWAKa1p1yCGo6Sy61qfaRC9wCAwWNn1
HAmEMTUTm0u22XGAOdHW0IyknqjfqbSorcqSxYsWLFixYsvZLD8WZtBZJTZg0WVBsA5MuhkAxzXm
mtRDrzB0dKfXmxe+IiB+Nlcg7QkQbmZoYiGWI9tg3AwVJYsWLFixYsWLFhKKEIFRVBHcKBzvt5h/
A9r5PzcB6gEmWLFixYsWLFi1Fiy94EI3AV5i5z/M16DwZ6yIGsepQWLKQCxYsWLFixYsWLFhg7Wd
pIvbyBEMvsrctx4RvCGH5fx6AqAAoLFixYsWLFixYsWLFlIKgFQAqyQfDeqAVZIixYsWLFixYsWL
FrdrT2JqdkDh0zUNe0ppsdaS1BwtjQz6pqbCAACUhyn55fofMoDP9xBWYrdQCW0iixYtp4esI6vG
rhi2WgMSA0dNDXnvUGytH0INoPsMWAzw7m5wwWQOJVBcWLFiwdtRhqQICGRIwRI6JZLFmRjHVogq
gDbDMDax6BrEVBYsWLXyHekBlliy6jN3G6lR7lzEWfrBYsWLEC2iaIQ1lC8qgHDNDwsBgaMGWGrp
Wqa6HAkWzeZdNDE1TTlFEFEQQl+tUDKDzsKoBJv6CHsyFixYsGdBAOkg3aux/9rWgBnMOlhyh36l
pgcocAdwYhgyVVCbMHBpgaAcrToDGqoFbjhvtIaYcui6B5mYSFPJYty5KCm8CNSrIKCxYsWLFixY
sWZI4Fi1gh1pFjMglm+a6YbWoPRYsWLFtM0pgDq1cOLWWNogNmyGdZshkh2a+HAHcHnquk6vrWiB
36AqgCshvtgYocmk6y0h5hpz2GEHdpgYSqCVoDEDF0APawiGFNxuDlDJ0cMhVBPo3Qa4YrGx+1gP
0OsPMOIxg79UbgxbNkODsNxVBMqgGZlVBRBBp0Vr0CywtAb7CxkA09cDiZe9AQsaEGKqgCQDxDfs
6AwqqAtP1MMCQ8ta9bbg6brewhnaSHgGgHJpMlixYsWLFixYsWzksWDiv5vYR0HS27UUCxYsWLFi
xYsWLFi0WS2TliwM93Yv6g0kLprGiBuaPpukqoC2XWnPrVhi/oPK/pNMtoMtovhohoBwB5hiaUHA
HWGYHMW0XQCx+TltfcsWLFiwfNFqCCjQNBS1OZBksWLFmF2sOANTXw+WjSQ+VVEPg5bjIqobDGaQ
1w79EIse8DPxoPXIh18syOdqxwY/tmYneKd5vqI48beH9vmrefMQhsktqLCzaK9N1g9tqDFVUDoh
oMOoKoAlUATIGtoLhka74OUMT3SWa86VGOgh3+Kq8bOgeSsXawQ33980sbpn1D3TUR3hEj8foH2O
K3hGc/75uRcWG5pN86jpdeus14hZFEHJjkgJwSi/2D8b6EusFpqY48qt93vJOd9kMhrhnCOvI5Xo
TIbwCykaVMnnecjSkuOGcqOikUikUvnyAt8+Ql/cXFcNF7IJ/vj+sF8uP1jxq1RcPiJuAl5QhCKw
AgpFIpFL58+VuokWQTeCXSCnjUCkUikUvn13IfPkSRI4ujgUjxp4EAz5B7zj/I/X3vHSXG4tPJOE
lsqIUDxRBSKRSKXz58+/nC4JjIeR3NShYX5qBSKRSKXz58+agUikUimnq+fPr/tQKRSKRSE+faKR
SKRS+fPt+ukuH5tcVF3xSKRSKdfPn1RSmsNykOHvytDbc49NEmkecGcI6mKma8HkPnFmOKXSJ0BI
4OZfp9Dlxc4QkhoUVLM/r4q40JOQSG49tSrveS2Q+oyE6rp4B+TzZjkIrwUpfAT8jkztkOCnQbxD
l+6+fPnz5ZJb58iSVcEF8VF7NJ/F9LC1Sfr/9DHpXg8Pj8jgpuYrpCOwQj58+fPnz59DhGjmCSnC
TDQXjUPnz58+fXcl8+RpUri6OFT9DTwYBnyH1HH+T+vqe+lIu4xvF8LkWWEKccYR8+fPnz58++44
XCuMh5OpsL81D58+fPnz581D58+fG9Xz58VbPnz58A+fAPnz58+fPn0vocP6qcU7L58+fY+fPn3B
s7x+RFxEGPW+Ujj/zosL+4v9ypuKQ/g1OZw32pqoKlUEbROjkFVCCqBPV3t/Z6bMKoG409vsXWKw
qgVxqiqAHGoKqHFVDbWlor6GGTrWEWvrS20M9K02MtgOjUb1jQUdUDFIasGOGLqSZAOXXA5MaMkl
YYmrQSjS4Ydm6QDbD7Qb9Av6LhFrxnVGRsZvvqBANsPtiaiBDUs+cNpukgGZYfSmZo1cMZhT70vU
2E9qGtqZqtNJgwZ+YMtw1SGtB1GuBg+6DtbNEYFVC7VqLBcD0IacGcGiyNNWiGs+1vVFVAaqg8OI
NBmatSDjYm2Gy0HCxBhnatQDoPpVOQIGY7Fq2waslxSOgg29hsM7P4OXUTJm/gMnT1UEjtd5C7rI
dmv9Z0VNKr3Wqdt/1UBTAQIGyHFqOMVZx4p5ot3m9mb8agzsDfod/XdD0LDU1MVcCpUhD5DKdu8G
Vb8ydWCGskCrSc2iWEQxj6g3330MhpuusO1xeZMYK6JpjXb0nrR/8WTsOZtRudXmvoOzX7us9apV
7SFUBes6YHwHHoZBN7Vo7GGD2xsjUh3pmotqBtUQDlQKlbn2y31CBvoBvi0NHUG9BPWSrTrJAhol
g5j6giGM+ht9/XWEhprVwKlbNimK/d7jWr+qoXUkerqVgoAwPojdjVNepJti28oJM7ShoE39OR11
w4G7gQsMmLlsMNHUdFDz0gMBnDl0lht2NTtMUEO2XTIYWgOfUtTYQ4oYrp/WdB04gwhh6RoHLStb
7i+zEH6r+lhwXNE1FIhomtMGss2iTF9Q0aFUCHS45Z2gEbMbbIWcQU22CfAYNasnqCWimygGcwhl
iIEKbLRBp1RpIbyj3NbaEtDY7D32XRWHQKtdRHJhbEWFsIfY0yGM3sa5f1XGksdlqlED7YbhYIZ0
S3oBAgIgGAQibrme8QfhRC+hLBBvAhpWSDSQSYNSGVrlw2QdjbZDg5REA7jZJ7Cx7aKngIdbO2iL
Yd94QzdhAhs/4rSbCDV006CIXIgQ1Gn5fCjQvXtNMwaq5Bl1tsJ7gY6rhsOE9xU6UysTXT6Gzjps
0hiRlqK8WdgG296Pa0i/ZimTtk7IeuxySYOh+/YWQ1Thxxl/auxsDbrbYQs8rjbLNpYhaFpWhCvm
M13UA52PXLmsNmpabdZm5HW9B+VEVisY1y5gEZmntp0B/pavqOhSjpCBCQhuBg/atC7bn4baftBa
E7nerakNC0YILJs5DONU1EhQ5HqeCJ9fzb0UqMDbScdBAczBMF/Oo+feA05XAYHLWYZWLQnN6s0D
sOID1ezDZ9kaNKZCBBNisNes0Q5Cp3iwo533DB0tiZ7L/UJ3Qx7yfACCH9HQe/VYTINmrs0MDdpT
cnb5ahyq/ozFE+/9kt6vc0dksf/zT1jVmxhCX+QyaDPpVlOtCzqiGgd6owMllhxpjfYT0W2yfj/d
n1EGvvWiFe4MT2dnUwAB///////////0KgAlpwIAALtuZu8R//////////////////////9WmHUb
et0sTVqOjQPmOzjQ79iNZW2eFKY5QwjhAQUbNU0Rh3lq4LhyK7G1j3hrmJ21a8+a5UU/5xcoXEhc
XAqqY3lUTeHpfvfIYHUeqI/scJ5V/c8HU8IcHhyjbVXCil7hRzOBQEn5YPgD/3qqBocgil/ztCXq
muAJWOEyj3XtA6RDgyHBqRBoYZTogjfaWLT42i+G02OVEZ3jk9tKiEQJQLmBOw+2xHex7+wtVQLq
OoTsMLVuNS0dEOHW+9QDkNR9ADDo2YDBaGNj0iLLAHyGLrQZBUrdIZ6IZxBB241pr7bmQMFt7vN/
6ZktoGBtA0w97LUGSBMwQ/eflBCx22h2soZGjRf1QOPU7OjByd60YOsOayGH3jVdNDr0sNYOnyRA
gh1tdD1YMFPR8oqoAte9Z1H2qsQcevJzlrDoZ9BDiq4QRuhih06zp+hNmq2gydSZgxQwm+iGnazZ
1/SQ5YZ9Q1y5rcDxEysWFxG01tDvuxkowj/OYb9N5lW1jD2VQRokOtNIB2oWtBYGjVmXAcGsyQDi
04OjU7bOQaGG4Q0bUtC0+8lpAd4emsspAhfbWxv1XWGljVUHMenBysejaDomeyGqa7Wv67oMyQDW
1ljD+S0RgaA6byqgAOJK9225DiY9DZ2C5pFjTPhxtbCQ0jQtYYdIDEZCFgNNhaG+8QaQwGPQko7R
1fVU7DNqOpNd/RtSKr7lmMfQTOmHMGpqmtkCGhXL/RWyzsDRrzLdb0tbvv9ubiAbFwhqqDtLCGF3
BWwHk0e1HUmgOdVQfZR1tl1bOmhmYs3Npr+0kMHSrUlhldW5BlamGIHgHToOn+1yKDqDnSZg5dH0
DXWttDgD70Q7G1/ex+zghtNG6IdHzyj2fkCCTpwQBZNVSYuXkXgggzBrNbBo2NUTD6MHTdZQwQ8I
uXZYOmbQ0M2LFlptoWUI9cw3mThvYjELx7TCydW7PO8HC8SQIED9ffkb30vIuzytLuAorPARTlGP
fcUhLg7GVwvEgXYjTmKz+fvJ4HsJPFDVJOslHU6M03xyUrhxyvcsq/PXUMjsicrxRiC+UjoYjme4
M1yckDZqZW0miQn2I5qQalDecf4aMqy0aTctEYBxQxVkOC4uccmbzo0ZsntQtS83MJ/M9pcRwCSk
iOvtiO8LXF/vcVfUGoe78/c7zbIEz7gfe++FiS4qCZH8eSC7uRwbCckxqkGim5SsVv/45d5F93ou
ucFuIOk/f/yFD/DK+QcLJw0ZkTWUl2eZUHOqlCOEkQ3lTHy0M8L2Ib/mpUm9DwD38EiSv8tNrjm0
5pd+eIMbgWUOWcoxBfL4FLiOdTiehonKAb49wG0miQn2cCakUpS7ziOLwL7MfhBQjeCYB3lDFWR4
WXOOVN50fANk4cLU3OBxB+kmuI4JJaREc0RSO8LdK97jIQUe1PzbIIMng/lWkVMU2ikX3H4XLsxw
b7zJL/HyD3SYin7kJCRCXUstwh31yOlhVBOHb2AqgJVQHtyqnFVAVoVvwcaqAztIPcM7VNHDdDbD
euaqqoISaQ+Q2g2ovBtBtKqDg4zKqFQ2g2g2tHVUCa+Hu0hnqoGFUCAbQdYeiqhkNoNoPLIbQbQe
XWoKqBQ5GwNoNoNhnDyVQEqoEFUBIbTfqDL60qgLVQZaNbDaDajUMsd2wG0G0wMoYgYc6p0kqgeV
QPBtBtBtBtBtBtBtBtMqqB1VCIqgdDaDaDaDaDaDaDaDK0xVAiqgQVQBBtBtBtBtBtBtBtaOGeqg
YVQIBtKoCw2g2g2g2g2g0dGVQEqoGFUAIbQbQbQbQbQbQbWnhlqoIFUDQbQbQbQbQbQbQbQbTKqg
dVQiKoHQ2g2g2g2g2g2g2gxAww31UAgbRANoNrzQG0G03Bg6AxsSfZD1wNoNroNpmuW7Gn23DRDO
IENODXRDVDH0itMVQEBsBlqqCAwdI0jSFVASqgAOzW9I0gPTQtADy1ZiD0DYDZyHcGGg2B6twcgc
1xBAP8PS2hqjZm3ruuBwoW9QD7QQDjDqVUI41gPS1rOt6u0tFjQA7A0bGvB1EQ69fbA5L5DrQruW
72qqqBQ9g6w5A7kw5w57mj6CHFpAdYfwd4dYdYd4fgdYcYf+laGHdoMQHkHi2B1h1h/h36sRjT21
q1kwc+uqoBw6w6w+A7Q62XWtQZNMDJD4DjDr1ZqDrDrD7DrDgVUEhlhqBhBhRAdYdYdep45ahrAc
uoB1h1h1h16UM+ghuhph9B9h1h1h1h162qoFDLVQG6OGFF4OsOvX9e8aurAdYdYdYdaEBjqoBA0w
7lVAwdYdYdYdcBxaOGEyQHWHXqQdb9YnE6KHWHWHWHWHyHFoQagaYaweQdwdYdYdYdbIGsHZpYYX
oDrDj1oOvXXbg4HxrQdYdYdYdeusQaWk69rgfgdYdYdYdcB3M4YTORgOvVg5w69ZM2tWoMjLrQdY
dYdYdYe4cgbOlaMG8qoA1QOsOsOsOuIDCZyJg6NWDrDrDn1fVtc60fSLIdYdYdYdYf4cWg6VeNAc
YdYdYdYdcRp6HtaDjDrDrx07+DFuB1h1h1h1h3B8hqBphrhhQHCHWHWHWHXGH61IOsOsOudFnGhB
qB8hxB1h1h1h1h5B3BphrB2aWyBrB1h1h16/AYTUHp7Xg6w6w64D2vacGmHcHyHWHWHWHW3B7BuN
LSGFEB1h1h16m8MjEGKzB5B6B6B6J6P5gZdQi4HoHoHoHo16t0GA5kEA9A9A79cbbLCGexh3h6h4
B4B4B4KqALgeAeAeAeAeAeAeAeD60HDfu+SDnDpH0qoEVUY6yHbruu66HcqoS13Xdd13Xdd13XQ9
lVCgdgfiqhhVRLruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ru
u67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu
67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu67ruu6
7ruu67ruu67ruutV5S1XTELzI1NTU1MSelMVvQW/WGpqamrRk3ZNHIMOkNTU1NWgtWMaTeaNFamp
qatPY9GBIaQ1NTU1WO2HRjZINTU1NRqTxZuJotTU1NSd/TCAuw02pqampkoJNTU1NQG4hqampqqo
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
ojVtW1XVu25uiG5uaNW1bVtWiG5uhubvvq2ratqH8t17lqkRrOsxGs6zEazrMRrOsxGs6zEazrMR
rOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrKbddaWEPsOTUteY401P
Z2dTAAH///////////QqACWoAgAAKUszMxH//////////////////////0NYaP/03TYY2OIY2ONN
03///03TYY2OIY2ONN03///03TYY2OIY2ONN03///03TYY2OIY2ONN03///03TYY2OIY2ONN03//
/03TYY2OIY2ONN03///03TYY2OIY2ONN03///03TYY2OIY2ONN03///03TYY2OIY2ONN01s1fS9Z
03TYY2OIY2ONN01puexpumwxscQxscabpsWNXDo03TYY2OIY2ONN01s/q2jabpsMbHEMbHGm6a0h
xMP9N02GNjiGNjjTdN///9N02GNjiGNjjTdN///9N02GNjiGNjjTdN///9N03tjY7raxseoabpv/
//pum6loDGx96DZ9pum///+m6bfYGMhe0ZlbtN03/4bdN03UGNjSvMbHqGm6b///6bpqTGx3YY2O
NN03///03TYY2OIY2OAw9N//4ZQZUMbHEMbHAZQY5DGQygx4Y2OIY2OAxAympO9qkMbHEMbHF69e
vQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69e
vQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHdvXr
zaxMXfJjZer129eYmRLtlYL16KxqO5vnS/zndb53asucCjKT6MmdqXTJKi4ggggggggggggggggg
gggggi/0+w/3B6uvsLEdxftSzypWT5aSt1b6lHO4cJCtIAvPDKQQQQQQSSSRncp9THdwCM9XxjW2
XMTkxRUkBU96UHp+ePEUedQET+YnJL7wDTsU+SiIyfVvpTrfqrgnXnEN+3ahm7goMr+pW33U4Fxr
qTd0iWwaG5YjMBnvXRE+96P//73vf/HY970+970zON3ja6Cy6+6LPllxdm5MzMzM5kzN5//pSlP/
/+lKU///6UpT///pSlP//+6hBJ6wUgIJJLPeWSiob///pSlP//+lKU///6UcSf//0pSn//uNcaI+
3mk4X9lnpsH7rfGWZ1fWgqLQ8T3f+uRX7dJSRIkSJEiRIkSJEiRIkSJEiRIkSJCqTyeXf/m2Sq6r
qj8znlbZDmpDyrA+XyVpbIJj31LPfzOalK5yQAo8akSJC0iRIkSJNeBG+pZHBIya0NcJhLE5uKKk
gI1PSh9Pzx2hNGyEn35iZ9pfANOxT6BGRk+OVQ3W4iiAtcRhMIZu4SHK/qXF9xuCQY1JuJbBo7l4
BPvXT6IiJmZ/H4mZmIiI/EREa27W670Ceuu7XuPN3Y/ds+8c5z+97xznP73vHOc/ve8c5z+97xZ0
iU1JQJkiVKgNcgTck5Xve8c5z+97xznP73vHPu3e945zn96aFXl3zNGxBVCHp3r1UGteDAumDFDD
IMIZOm6ho2khhsjBpYZ7Do2isjJEsjIGfobFoTIyMmkB3ahojGwywMhAOIP1kZA6csjIjpeiEGBp
ZGRj0YNLDLYZAzlUB4eUhlvrKqCIMxkZDBm+VUJtOWRkIWNB0Fsbg+r1u2yMjIyMjIyMmjIMqDIy
MjIyMjIzaJGhWmRkZGRkZGTSGGWBkdkZGRkZGLR8WmNkZGRkZGRk0RjYrbIyMjIyMjIyaMgyoMjI
yMjIyMmg6CGmGayHZGSNWZGTXfG1zVSHXc6IyMnTJpLc1pa5rTRb01laD6npWk3nSIBjaNraqAft
3dVAgqgODP1Z3Ds8fXwwWDQVVBKqgn4c4eBmkMfWQ7LqRjB6h1mNqGtdXf6zrZjNoeRja6HlDFrQ
djLb1bU9U0M52oOnVNYDyDj1hhYLnerd+sscagQDTDjDphw5iAYzLprbrbcHH0HIHGHGHJq4ceuB
5qoELgYDFtobaGqBsacHGHHoocmobaGiWEwwm3XyAZwcYcaTWHGQYHYekg7Q+A4/h9hxhxh/hx6y
H42IaNo22htoBxhxhxN2UGnR2AOMOMOMONtsaTFwPAPAOMOMOMOMOUO8MJg9o22gmHGHHrGsf/1b
upBxhxhxhxhw7aGh0QDlD5DjDjDjDj20NSZ9GtbaG2gHGHE2hxNx+wwH1DoOMOMOMOMO7W0qIaHr
YcocYcYcYcZBVAGqoMYNG/toBx65qgcejwi220mQOMOMOMOPV9b0u+qgG07Vg8Q4w4w4w49tAOXR
NGYNtAOPUNfDjDCbbCbsJBgDjDjDjDjDsD50Rt7YQ9A5w4w4w4w49tDbQ0ZgPr+oBxhx6Qz4aLWm
t10OMOMOMOMPPW21VAgx6Ntoa4HGHGHGHHtobaGiH/qmthxhx3c2UX0EO0gHGHGHGHGHKHdRDS9G
20NSDjDjDjDi20NtDtuO2hxBxhx6h0GA6VB3a2HGHGHGHHrYcpDQ1VBjAQVQBhxhxhx6x/bQ0bSg
2P6wHGHGHHtoBr6I2kA5Q7g4w4w4w42oONhDCYdG20NtAOMOMONujbQtW9KRDoDpDpDpbmX3tNVQ
VBhWg6Q6Q6Q6U2j4YjBoaaYdIdIcuqsV17aqAtVA4GYGYHMHMHMHMGnoYcwcwcwcwcwcwcwc3Fk1
q4n715H3BqDx0vDKysuNWZWVlZWVlZWXOt4T1sOZlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWV
lZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWV
lZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZdJ0Kyy
JhiaPquk6TpOk6xorM12Ln8aTpOk6Tq3TO365p2jBx6TpOk6TqbBo1/XdH61PSdJ0nSU9I0LUn0v
XtJ0nSdJbtI0UOG7o17SdJ0nSbtrRWjUNE0lt0nSdJ0lkshmXegzNJ0nSdJYN5MD0nSdJ0kDhtsB
DSdJ0nSYcS9xWk6TpOk0qya97SdJ0nSRUE9J0nSdJ2Y0nSdJ0l9J0nSdJVZLxpOk6TpMAaTpOk6T
SmdtzhpOk6TpO2gDQOk6TpOk06wuMKaTpOk6SEpCS9J0nSdJoewvbc0nSdJ0mljnRNW0nSdJbelV
AyqgZVQMqoGVUDKqBlVAyqgZVQMqoGVUDKqBlVAyqgZVQMqoGVUDKqBlVASqgRVQMqoGVUDKqBlV
AyqgZVQMqoGVUDKqBlVAyqgZVQMqoGVUDKqBlVAyqgZVQMqoGVUDKqBlVAyqgZVQMqoGVUDKqBob
o1VisbbCGo6mHJZ0LQmPVdT1CLDLYvaAh9Nr0NlbK4NJ+DdrjturaLpTLb1d2m4ScWtHAjVNJ0G2
zt+uW/zobaBq0i0XQNJbtXpo13c9aHb1azFhk1e+QQ73ENDRrOpMrO2saqgJFj7Yn0TQ9tDtwy2C
ioX0PRND0RWFK20ND0OJ0TRIepVZGhaHoeiA1Wh6Jomi6HokaJog5C65ZVhILhJWPcKHUrUAzS52
2AJXVKQjO4oLKZCcUILVGxwkUhQKDCZAg7kBkCFBb8QEhBi6/rGk6Rl9IWLlS9wAC/9tgMkIyHTp
TyJbwadMZuaWq6DoMaDoC9tCZoJTO2gENtyHoMHYC+lsN5tZWYMoGYZdF0rUm1im38QRXZNohDTU
Q7w49B0PQtF0O3pekBLSGHC1L64j9g12R1L09Tp+pShr8LZ9BrbY0GNS1HUdRHWhD0DbQfbYC88o
cX9xo7CGKOhaBa8GToGgZDAssdrRw4mnvVLTBZZWKxK//1MP/Q9Ulb6Y03L95uuL3gcOu69q2sax
od0JwsQC5lIPHX3mdF0HUQ4tSDm0LQZ20K4baGzjVFpDA0oO64HK3h4aIGFIG2psMJBq13qM2QFR
SJXS1CwV0LbYXUS9baj0v070fAank5flWH3G8jlwoUTAXmfRrcLDD00OPV9T+FdXVZNVtoLoOkMn
XJnk/FvIaMjoItD0DUdQzHm3UQNB0SchEU/XTx8VQ+vrFq4cGkMDt4dT1LS0XmXRG2boWfVtbuhl
afqutBysekayHgzIBxMFqxo76Vl9A0Zi2XfZV8FhwJaf1oeoaloWk6jCuNQ0HQtRsbbITrYiYtBg
68HKvU7wdeiaLrzR2ztjcHBoKGhMF9pvfINnALSiwL0YEOOCHmO08yPTdHYNGQ1CwqTtsVC5DC0T
ltoQFZ20NjrW23WuVgULjJN2CUc8ICX53n0gyPagHKQCUELcNvvrreSTJgRW2hMhdc0vbQAWFNtB
XtsOEhj5VIthXS5lXuXUimfC5PCl5mB0savbYB/vOXAnEOqD+oBeXpXJP8Zeq3EVNEJHw++6Ev25
mXBfeTEqFheF1K6XtsLrbT22FvMfoa8iVZEzsTvQCdAx+uG65OLkv22xS96rmdtBbuvbYlWC8jXI
lRx8JdaiNj8ct5uaAkKgjHuaW1as1tOiszFoeh6ppYY2qNWsBw67r+p6kGTrmt6XO2wE5HEgK9n/
8qsgBfDbQncRKvkAMVbbbuEqgTk2pvb9F+wXOmEPoO7Ww/j2LqFlpadDa9QZ2zT1VAGrH0rna0wP
BVQP631p+kacwMFu3oGgaBoFu2wMGgaBoGgMDBbYNA0DQNAYGBgYtA0DQNAYGBgt6BoGgaBbYLbB
oGgaBoDBbYWDQNA0DQGC2wW9D0bQdCYGC3b0HQdB0G2GXojBeohGiEA6g4buo61lknTCBByFv28t
sEmtsASCC7du2wKwvbtsFvbYt22G3QmBgt29bDAZtA03TQ8VVAjKn5nYtGDQ0nRVUAIaAZTyzabq
yqglqYdOd2FhYGI+WMhYOGLrYeod2g6Q2hkaNp7aQIXAyNGDIbW3VtW09t0bXyFwhYIBkBkatcua
Np4ZDbcZSDKyhkMpCw2kwyGXT7hCXAh4dxyvbQXO2gro65g1EA0Q0VhvBsq+1hohohhTRMMrc1w0
wNENFYbzCqBoho9Q2ho2NWIEW24ysthlbblxl0a5YIWG3RtGDIDIINrbcDI0YgGQQIaNc0/RhBkE
G0iRDx08g22LmjXNf1YgQ1YgQsatq2v6/cuaNY09tsEbAaIZCqAzVtfuXLmrKoDGUNrVrGv3AyLF
xtuXLAbWjWG25cI6Np9gNq5YINtgNEMi422G2wy6NYuEG0gGiGRo1i42kCBAMght3UwwAxdWsaGG
JqwYoYurasGKGLqwYgbIY2rBhf1bVtW1bVtW1bVtW1bVtW1bVtWYA09C1a8HTq2rB0h06sGyGzjV
g6Q6dW1YOkOnVtWDpDp1bVg6Q6dW1YOkOnVtWDmfVtuPSyBg49T1cOkOnV9XDpDp1fVw6QQ6dX1e
NX1do1mWrPtbaNX1fV9X9a0YNkMbTtPxq+r6vq97SZjWA4UdX1fVdX1edDkML7Jq+rhghg6vq4YP
9bDY0Vg05j6DB1fVwwQwdX1cMEweIaelIEAwdX1cMEMHV9XDBbiAYer6uGCGDq+r+ZVaqgJt20Nt
DbQVUBKqA1VASqgLbQ20NtDbQVUBKqAlqqAlVAW2htobaG2gqoCVUBLVUAqqAttDbQ20NtBVQEqo
CVUBKqAttDbQ20NtBVQEqoCohcaNtAoTVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKr
JVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZL7lldwzOndW7q3dW7q3dW7q3dW7q
3dW7q3dW7q3dW7q3dW7q3dW7pu7sPndo7d2RB3Zbzundd9BsO93RnfJJ3Ylu6t3Vu6t3Vu6t3Vu6
t3Vu6t3Vu6t3Xp4eHegrd1burd1buscqslpvKskVlVk8uu1WSqyWnkQVZMzlqU9nZ1MAAf//////
////9CoAJakCAAD8PtKQEf//////////////////////qaplVkqslVkqsmZampqaplVkqslVkqsm
ZampqaplVkqslRLy1NStqaiZPqZmf/3DU1QTamr/iczJCXhqTvKslVk376rJVZN++qyVWTfvqslV
k376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN++qyVWTfvqslVk376rJVZN+
+qyVWTfvqslVk376rJVZN++qyVWTfvqslVk3yCaqAOtzeVUI602B8X1hjhttmVYY4Y6799XfvrDH
DH24GOGOu/fV376wxwx9uBjhjrv31d++sMcMfbgY4Y6799XfvrDHDH24GOGOu/fV376wxwx9uBjh
jrv31d++sMcMfbgY4Y6799XfvrDHDH24GOGOu/fV376wxwx9uBjhjrv31d++sMcMfSdMVQF6QGOG
Ou/fV376wxwx9FRyHQGOGOu/fV376wxwx9UbQ6Q8wxwx1376u/fWGOGO16cyMgY4Y6799XfvrDHD
HDhD+ILDHDHXfvq799YY4Y+3Axwx1376u/fWGOGPtwMcMdd++rv31hjhj7cDHDHzfvptt+/qIY4Y
+3Axwx71++a80apqAY4Y+3Axwx2ltvtuvtN04Y4Y6o0hjhj6hfv3NRv3zhjhj7cDHDH1S/fOu/fW
GOGPtwMcMdd++rv31hjhjr3qsMYMZd++rv31hjBjKcSYMYMZd++rv31hjhjWiZDbY1BsXfvq799e
oahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUNtj
bY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xt
sahqC799Xfvr1DUNtjbY22NtjUNQXfvq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQX
fvq799eoahtsbbG2xtsahqC799Xfvr1DUNtjbY22NtjUNQXfvq77TWoahtsbbG2xtsahqCbU0/am
jvUNQ22NtjbY22NQ1CmlqIeab291DUNtjbYwNwyBuFDelTJ1XVMCvMBgcAhusIDJcKdwEBU5znOc
5znOc5znOc5znPK2YqrBBywZ0540o4eOPnPpzgMDC5ABPUaSzw4Wc561rWta7ESsbdiZDwcCMmIm
I38Q5yfTit0FkcBOdgDoStCc663wA4LlvoMhRMAHrEwxbAAUgAhMUuVZmwzK0Rjyc7RbBLvrvMzu
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
ui1cKd0WaUc3aL8pFO6LtVKOKO0XTouEooo6rG5ro71aUoUcUVVOi5ijijilSmRVOixtFw6LD0VA
IUjV2ioCdFvW2VdVhRVUFMshSNUN2iqKbgUTSnRqK6WiqGtFwlI1Zoqhlpq0oyoSjCkCkynSkdtF
UVFIlI6Koq0X0UiUpouYpDrVMpXRVB+iqESkSkdF46KoqpCly6klV1JvKRKR7ZSLf3jUUBV+i4tF
4lI1GUWUiUjU5SJSWi7dymqVIpEpEpDfl21VBIpEpEpEpEpz9yjauKU0XHouQpEpEpEpHRc+i6m4
ptupKlIlI1RVH0dFk6LKKRKRKRKR0XYUSUgUkU3ouspEpEpEpEpOrKXSkSkdykdFgSp1Nwo3RUGB
SJSJSJSOi4ik5lJFJVWUuU2UiUiUiUi3lC02+lwpGq20pFS6FClSqMpEpEpEpEpDRc5QlV1Tyr9F
yFIlIlIlIlN0qUwUjSq4pGpJcvjU39KRKRKRKR0XDovFqbik6t0XPouIpEpEpEpGlNmlV1IpEpGo
tnigKoKMKd3KRKRKRKR0XMUmUgUhJAUoUiUiUiUjSHG2qykSkdFhaLSuVlEaLzKRKRKRKRKb0XEU
kUlV1IpMpEpEpEpGnosCW5SJSJSJRuioMKm5MpLRcRSZSJSJSJSJS5TZSVV029vKFKRKRKRqikUL
osyqCkSkSkdFk1K3lJFN6LiKRKRKRKRbtFwlK85SKRKRKR3vrTVNEpUpYpYpb+XMo7RUC2ioENFk
FLFLFLFLFAVPsUZUZRe2xSxSxSbc3qVbouMotq0XEUoUoUoUoqUAUoUoUoUoUoUoUoUpovCqrnKp
NF06Ko0qvRdJRCBqamrylGpqampqampqpFN9bimNFwtTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NT
U1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NT
U1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU20m
ypeVVu0tra2trTvV/FdygtFktra2tu3G2TS26LhqJtbW1tk3t1Q9q7ja2trbQplIYeNrS2tra27U
9FwVFbZouRtbW1tl2ntQpUqDa2trbUdPRUBaCjosFtbW1taLNtbW1tNtbW1tttbW1tsvba2trb5t
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
USUSUSUTvZQuiwMzMzMzMzMzMzMzMzMzMzMzMzMaqiqaptFhbVNU1TVNU1TVNU1TVNU1TVNU1TVN
U1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TFI71NU2i+KoqapinOVNUzcU1U1TaL2KYqaptFwN9TVN
ov7Rc9TVNUBS9TVNoukpypqmnU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNU1TVNUZS7UUVU1TV
NU1TVNU1TFAFB7zKDKEqwoMoRVkKDKD4UHtUqnapqmqalqWpalqmqapqmpalqWpapqmqapqWpalq
VeqapqmqbqWpalqWtVNUnVNUo8qWpalqHSOqaZQWYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKU
LmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYUKULmFClC5hQpQuYULJvKF40aLItQo5
p5Uui485xpaWlp5znGlpaWnnOcaWlpaec5xpaWlp5znGlpaWnnOcaWlpaec5xpaWlp5znGlpaWnn
OcaWlpaectAUhT5xpaWlp5ynlXlN840tLS085VZShSZS/ONLS0tPOU50mvnGlpaWnnCmdFwN3ONL
S0tPOc40tLS085zjS0tLTznOY0tN9aWnvOc42UGmqp7IP5znKVFpKRqlqznM5zrS0zb2lpp85zhT
DS0vtLTznONLS0tPFVWlpaWlWdPESs2lpaWlVFKkgaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWlpa
aVKlSaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSaWlpaaVKlSa
WlpaaVKlSaWlpalaSqsWlpro2ppVVVVaWgF2ijSVuPv1hETOj00hCEIQhCEIQhCEIQhCEIRiZaZL
bORMnPSJgG5aatMReE1EwYRgIQhCEIQhEn3EivXtAXPqObwOON+JMV567jgOj1YY3QRu2594ZznO
c5znOc5znOZdznOc5znOc5zmJnOc5znu7O+v63pZirKeXJJupbbbbbbbbbbbbbbbbbbbbbbbm2my
2Tkemxupsm9sp2a3jf5tttttttttsH72/3Feu5AXQgn1HN4HHG/En7S88m5c7R6Ix3ctV3R78Odj
GMYxjGMYxjGMYxAYRjGMYxjGMYxhYxjGMYxu46F99qJBUdT9qGoygX0L7U7Noq1UoMo/RYxQtQ7V
FMoaoShChIKFCFCVHUVR1EUIUIUIUHTlUJQBQpQpRRQhQJQfShChKo8oQoQoSg2lAlFTKEKEKEKE
aigCjihChP0WSUnQ3KAa9FoblCFCbYUAoChChJbFCFCbNBRUtFgaLAKEKEKEKEKEKEKEKEKEKM0W
oUYUIUIUIUIUIUIUIUIUJU+iwigihChChChChChChCgyhShSiihCgChChChChChChShCgCjChihC
hChChChChChChChNFhlHFCFCFCFCFCFCFCFCFCFGaLUKMKEKEKEKEKEKEKEKEKE0WpotIoQoQoSg
UIUJRmqUiUggeBQhQjhQhQe3q7bFLNObFFFCFAaLVKIKLKMKIqUppWiUSUWUWUW1NdRUiiyi6oKL
0WJNp5Q0VANoqAZxv0WyUXMoDeqmnCiyi6rqgosotWmp1vpNhRZRe9VFFlFtlVFI7yqgocoukros
somHlIaLAooKqxBIopSj8EG8eFAtWTKB269VCBrxslhQpQeYUHUONlVaKoBpFKNpKpQJQWY1lB8d
OrMQlK89vKazKuqjEFWNErqyqaWNksxBlOraqq+ratJzM5GObFKN2ZmbTlUVWlIVTVOZmNxSWi7C
n22rTzMQIGJibN5XmZnnRKQq5vqzMzDqqrKtpk5nM2/cpKCnMzMqlspVdV1X1U35mYgqkoKqatie
ILwpCO7RdlIZmZThtS0XsUzSqrMzDb9Fz1a2OnnPwpXmIWiSCrMzMqinSpt5SVVzzMwmrWz85mFJ
1XRDXJBmZlVNmaKoBKTq02zMzCasgxWgzJW3djQnmZjfVNXVcUtVp1TmZhO+38zMU4UlClV1UtmZ
mVU31dV5QVUoKpzMQMR1agqtiQZmHVyBsq5vqnMzJ1cUoUq21aTmZxw6fNFx05znOdWudqChosGp
ZznOjRUa6NRZk59Es6UkUorUHe96or3ve973qJqQKNNhpoVKClCnqVXVXVdV1cUvVdV1XVdV1XVd
VlIFLVcUkUwU3VdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV
1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1
XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1X
VdV1XVdV1XVdV01Y87bbS2p06dPZVsUtAgqynTp06ObqUGwpCjTp06dG6XFKba0U6dOn7Yq1I2yh
Tp06cqZSNDlOrqdOnT52lKVKntTp06c+IFD9LUFOnTpyJp06dM65NOnTpnXOnTp0zWOnTp04nTp0
6eh9OnTpk06dOnoynTp0yadOnTJjTp06dc6dOnTJp06dMmnTp09GU6dOmlpNtOnTnZRBRpRpRpRp
RpRpRpRpRpRpRpRpRpRpRpRpRpRZRhRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRpRp
RpRpRpRpRrTU7RTOhQm2WoptVUzoXeyhQm9He2tTk79By5U96DRtxWqLozPZBW72ipyg307a51lL
Pc1FKNPedCVChTVs+SpfNSiTQoKq7KNHNFhwpNFCVCgcqo7QoKKEqUDUUP6FA6Ch0KFc1KGhQUoU
DfJXNcxoiWr6Hmto/zrEkDWfxKt6AmJLc07FIVVKkQWh9UaFTUzIrQFPnKByke22jFqxLAbcbZV/
EGb1Qy1+0uqcmXSsdJBoWFEDRe+6igoKNAonR2cXVu5VJoxeLZVZ22T3JmdWVXVdVx3PfQXJocaT
24Kg2yoWm+USkJ0m/kndpG5OoaChLjTPOu3w2tpbqgpYpyBoG1o8mi0ttBtaFGrQXEpHsUL0pBVr
UaSIkgxA9zR1Y2VfR3+fg/IFhNn9l0aKxtzZSqajV2VqWjKuqhQ13oLHUSCjktpVHUeaFRVJKRwr
kVWhWYIMNVEqUaU/3q6swT6g3pUKxL5wp1NdKnttvKjvPa2nvOUGyVZRRQ1qNtgUquq9qNV1UopV
V6OtopFAS4UnQodqraeNdUub9u0El1a5xQtlAlslw2ihvc+VtHWgU0IndW0qtbbJeiaA7PdrDa2N
pjrs0EOkjRFXJWP9GIzraIltG1yrpxJhFf1oaMho1c19EC+jSCZVi5K519Hiudc1tBYmB9Q8/qDq
sqbfKW+++8pNlGg2aDOTA/idcmBsujWGutoJdlCjiiBy7qUoCpKgo1GUCUBXKFqTnCgpFAlHFD6L
B22KLKD0WjULQoUHbTRaSgygygyg1FFFCgygygyg1FFFCgygygyg1FFFCgigygyhFFFFChCgygyg
lFFFCgigygyg1FFFChCgygyg1FFNihCgygyg1KG2xQZQZQZQW222xQLWpLm/aoKbb+bbBQICm6kq
FBZQKhQJQO1lAlAlAlAlAlBGUCUCUEUCZQJQRQRQLxZdkKAKAV3olB06NFrKOqcoq50t6NCpCjag
KAqL8kpQqBqqrZkXqqqqqqpg3koUDs0USh6hKCKMq7lVVdSqmqyk2mrykauKUU2Q7lM0qopK77t5
SlUVfja3lI1XlLdtb96TcUjVLe1ttX0os0f0dDGfynCnClKt8pwpwpWrSkSnCnClJlOFObrVdRoq
VTVJSNVoJXtV1X1e05n0qZSNCdX70ikauq9vqlA3tvarq9tpFAb0quqmgUdvSKR3qhsuoKlpUilK
p40KKFMlM1XVYU/lOqatqqhahTNX1fVFT3IFKUygygG+qykavq8VZl1dVFX1S2NtIpOqKdKrrqpv
q8pGnV35lV1SUjVlVN9Uir6ubW3rfw6BQBQdDym9FxUCgyg6FAoMoOgUVosvRYNAoJyhQoUKFChQ
oUKFChQoVXourlC2uhQa2uhosvRZdGg1tdCg1tdCg1tdCg1tdCg1tdCg1fQDRSpNLTSpNLTSpNLT
SpPHSpTQSk+gnSpE0qR1S31UUq3U6pqs6VImlSOVJBUPUB0qVI6VI4IG5VSlSKDKDpUig+qFKdnS
5SKDpUigyg6VIoPKoKR3xAUHSpFBlB0qRQau5QdKkUGUFSpIKiloVFUR1FUWjKiqKoqi0ZUVRVFU
WjKiqI6iqLRlRVEoEHml0VgS0/qiqFUFUVRVFUVRVFUVRVFUVRVFUVRVFUVRVFUVRVFUVRVFUVRV
FUVRVFUVRVFUVRVG0qoqjnaoqijCqKo3o1RVFR7VRVGyCqKoa0FUVRVjTVFUbMNUVRvVFUVRVFUV
RVFUVRVFUVRVFUVRVFUVRVFUVRVFUN+zfTaaoqiqKoqiqKoqiqar7lV1Wl2quq7quq7S1UgKm7/M
mczKmlTSppU05zJnMyppU0qaVNOcyZzMqaVNKmlTTnOc65U3UFTSponOc4awqaVNQTzhPOE84Tzh
POE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84TzhPM/Rdt929BKdW6Lix6ratnOc6tq2ratnOc6t
q2ratnOc6tq2ratnOc6tq2ratnOc6tq2ratnOc6tq2ratnOc6tq2ratnOc6tq2ratnOc6tq2nTq+
nVtWznOdW1bSxoqKratnOc6tq25SlVtWznOdW1bKlS2q2rZznOrataJSq2rZznOratq2rZznOrat
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
oUq1NucqZ3eopyQNDWrUj2fMVJ1r6qr3vVVd5qq0K/BXUFsN0KFCh1VXvd6Ss91ValqXZqjNq0XA
G7/KYKdDTiFr5RugUhouehtUu11BTm2NrfTpbK1E1cQNcqNQ410KFCg2FKlLKt+81Nt9996FDZov
G5tntRqrnH+IN3VZ+g4ULUe0RRv5lKFJFJVdy+5zqu/GifelNlI06ak2xvbKnaqc61DgtuyntJlZ
Y16Ardozu6/GjN/xWqO3eTntBUDj4L2Jk/PzN4AOuEaiemow8hoycQXD3Ft8vSH47R8Z0+sHdc49
15E3gSvA/FsaPjO/DqUN93d3cb7suJNPr169ev8G///9zJPpPx8PInFJPzm8AHXCNan55rDyJh3Y
HdkISXD2C2+XpN3dPxjI+E6d31ujB3XOPSdeRN4Erw3d0/AtjR8J07u6lKUbs3dzu7u7u6BjhkCF
hYWFkiHnXP///755tnqM6oz78yeqqc1UrJxZ0quVUqVU9qpzVTeq/Ux1VYamqmt1UlVWKqddOeKq
mFVzniqprVSYa6qTG6CqnNVg5uvc1VzDKKrIsvKqdVUqOq4ta6HoOl9OeJrOi1q8MfobEfVV89BV
T6qleqlCqnlC6qsObur6qR6qY1U1M3zxXQVX6r9VLvNVfqpDfZxVWebsddLt1U9qs3UUBqqoNV+q
rFVS7fPlBkVVIVVmqnDq6qknnqp5VSZVlVyqmVVIFWVW6qa1Um9IzPRz1UlVWo6qaVUtRRVWMjqp
F546qc1UoUFWVXquqarlBQKqxVT+pqphlVmKqlSqlZc9X1WqqW6uqpFqpcqyrKuqu1UxqpyfKqd1
NVLNVNLjiqp/VYqpGq6qmFWdqipq+rT6yOrYqqaVUw61WaqQud1Uo4aql+qkeqm0VVINVOqqdVUv
1XOlVPbqptVSvUmzmqu1U4qppVTq5q4qqcVUqVX6mqlDoftVTupjquVdQKgqsxZU89VLdVPKqbVU
w6c3NzVUxqtGjqp5VTOKqkqqmmR1Wo6qQ6mpqsigq3nXOqqZUG+lVOqqdVUpc1V01VL9VKOVU2qp
HqpBqp1FVc6VU6qpfqptVSvVT26mpq+raqS6rFRV1VK0T7G7HjO+fGaq5z7q2qm1V6qzG2nVTqK+
eqleqlmq/VTGqmtBhjVW6rdX89Vyr350qvThrs3bV2kr1q7tJXau0ldq7SV2rtJXau0ldq7SV2rt
JXau0ldq6rVVqq9V1RVtvKiq9HlRVdjNFUvpzxnqp5VTurtx33PHmdHV2UFRVY56r9RzKrDZVYqp
jQRT3NFVTeqkDn56rlV3L0ldqq1HVeqtVWYo44uh6reb1VTmrd3dB0qpxVYoKLdXVZo9Td6qp3VT
yPtHGujqVtZV05l0GLnPQKKqmGWqrNV85zJRVYqDmqplzcxs9yqxHU8/Pz9qvqvVXqr1W1bVtW1X
qr1V6q966CoiNzVbFVY32vu1lAnhqi9xxUbfY3Pz8/Pz1dV1XVbVtW1bVeqvVXqr09i7XfbUejmq
KqYZrtVTF6zZlpUHehtrtVnMo962Y9Vyrefn5+erquq6rqtq2ratqvVXqr1V7Tqpi8oIrqucy60f
Wq1HUbN0NVZNVbqeaPUcdVO6qcxRXupjjq6a5+fn56uq6rquq2ratq2q9VeqvVXufn5+erquq6rq
tq2ratqvVXqr1V7Lvm5qrFVurYtvFioO3Tp1ioKnEuar+fn5+erquq6rqtq2ratqvVXqr1V7edG3
QM6Oag3FrdVio6VWtb0lndqgbdBQUHNUYe3Hq4rq7ts3Pz8/PV1XVdV1W1bVtW1Xqr1V6q86qZtm
NQVXMWpjKqZR44sqtKqmXPh+naqndVOVFlVyOOr+nTn5+fnq6rquq6ratq2rar1V6q9Ve5+fn56u
q6rquq2ratq2q9VeqvVXufn5+erquq6rqtq2ratqvVXqr1V7n5+fnq6rquq6ratq2rar1V6q9Ve5
+fn56uq6rquq2ratq2r6qY5V9VyrzG5u1V2q72oKr9Vmq5k5Q1L6xc/O+fnq6rOlXVXKrlVKVVzp
VZqpzVS/dV/nkVX1U45sqpAqpvVTLnq+PnqsVU1uratq2rWYyI4n0iiq+qn1VKFVKB6qe42apveV
Buaratq2rY4zOq9VezxXfNzVUjHvRqC6vqppHVTrv07XUVeaPMCjqpjVlVygMR+5gfMqs56qdVVQ
NVU4q2ratq2hiPV/XD0DZqE/PVeeM6qsVBjnj5qvObr1fMqtMY3PFzVXqrtV6q9fNzXd83Mc9VPa
qfVU9Oer9ZUVZVtVNKqb1U1qyq9VStVSxVSxVtW1bVudcu6DH2oKqUI6Hn5qsypVBh+dnZqLmqpg
Y1TeHoKt53ViugoG0eJ0GT2dTZQHq6TmoMRo+eq7z0FAZ3VcquXz81VirKA5sNVtWWbn5lVdNznj
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
1VZNQVPPnNVSjVSpVTfmoDVW6qY3UUFAbniqvXQGiUVXR0GVeueKrqrtBV/PVdqpzUHqsrKmgioK
igiqKrFBHVSDVSDQVequ5+eqzVbq/nqu3F2qsc0cR+agyrolVTPDVXTc1VO6CqmNVKpsq66DmoKs
mqqZ1bVbqplz0FVKtVxmOo6rp+a7jiqX0W26rUeZOVWKnmizmq9VWKvqpCq/vuZcsvSoPz3VdoOf
sfKiM9x1FXOKPm5r51jyq3HcZm1Rx9bpLObtnQroNzgRe0xJXM+Z1WZVMSt5nSeUTLIQwIvViU3d
EMmT6whXF55ycEBt6CMVqg2bivYqcISQANeSB7J2mIUFCN8vgReZM5K5KmdVmDpiVpJ8nlHJSbhF
6sSELEMmT6wjgm+k85PCNbxsVqg2bVivYTRnCEgGgQBmHTOma1EUwURuY17qypqzVV3pGz88VAfM
jqp1VfPz1MZ6rNVyrD27jugOooqC7dVO6qa8/Ms6H5o+ag5+fpFHHzWeq+ag1hr7G3rmRjHugPVl
nqag+svmwxz9FU1U7q182nVc6x0CjyzvKDRo+hoqDoojVNTVSRVeoO/ShqsVXHnfnq2qmvOzxUFB
1qx81BV1mNVtVOKqVzUHagoHFzc56rNX1FWc/arasN2qpr0NQHxHq2qkWq7VlBVYqsVUzqx1WTVd
VYPUx9KnVVMcoKrtVyqmZ6jD81RVa57qpzVpqqY1Uxq2oqvVXpztV9BUZlX1PNmbqOepjqs1Xo+n
artGijq7I8qyOqmVWXVuVU8yo58q5VUi1X6Cr8qsVU4qp0eqmNBlBVeq6Kqk+pSq2rqqdVdrKA/N
UZV11dVTWq9QG56rXM0ZXrtVtWOq7VSLVZNVlVMbi7RnNQc6qppVaquZVt1FVPMq5c+VX6CqkWqx
VTir87VU6iq7pUmqsqgqeeq7zVNVMpx1Zh7qt1W6rFXVXKtNz1Xmftfa+aq3q+ffapw9A+bnVVmg
OqDm3QHqtVakvauqU8VDHmVMcVTnPVf5ufmoLjyrczFQGqsxc3fs+lVqz9Hiy7S5qrFXz1BnVrmu
r+eLKBx9sq+rHhqrvbmjiRo+fKr9XVWnGY5o6Gq72qDVNSeqxVaqVuPMq67iiNmM1X9+bmioDXGf
+fw6GqLugqyq6z913oKDrQc656A26Cp3dVjMoMqtHOeqnlB3i0qDKCOPmRup6HvQUFB3oOtXdT85
6A2qrUfPuPm2eLXNUdOZUER44o+c1Xc/N2uPnVDzUNVugjvnUcdRbdXxvtFzOO91WI6rlAahqzOn
fmXeg696Dr13QbqzDVdVdoeegPFEaqmlW0CoOl8x46k9A8zucRo19aBmoO19dmVBEfIjZHUHzpzR
RHTUfPZj3zZQUFQqviNzx1J4oqGLqdOqyfKmyWaSNVcvtzVNW1Yc1Wc3ar1VZquKoPeVU3uqnJz1
Yc1VOqqcmqKqaVWarR6Cq4fnNVaoKrz1VfqprHQc1D51oDdzmdVl0EVW85+fKr1X0RqFmo4qrXeq
zVZugqs6qtHNV9VO6qbOrqqVKrNWVU4q6q5VT6rNn54qvqeaOrDuqmPSOqm+VbVtBVTiq/z1WD9q
rFVqq1VSFU0LyrnVtTVzdVmqnNnqpxVvV1Z3ocPVTCqkA1WVU1qI4jRc/mUFX1U1iqv0FVNOaqnF
VIFWx9O1WVZVcqpxVeWVWOero6rFVKVXnq+rKiqnHPVTuq6er6sNVbqp2fKvqppVT/vFQnjcV89V
yraGrqA9VN6r1V2gqpxVTiqmVVNqqf1U8qsVU0fU1WugqyrHzVfV9RVyoKqcXVciPVlVNbMo6tTq
ppVTGgiqvOq5Q1fF3qKsPVT2r9RKoiqs1Xzc1V43MfpVd56sqp2bpVlRjWVZrmPl42qt56uqKrFX
96CKqnVVOavqu1NAagurKmrI6CqmFX1bVeuq3VTaqzVS1QVdVfdV6gqplRnqp11atqrs7dKDI6GL
mqplzVW4qrNVM6rFVP6sxHRjuNOhqx0N3naqnFTVp+aoq0/NVZqxnN0PeomulBe1z1HaI1D0maPp
72l6mBl0MGgo1zpyWVWnzsCMrxK0MkN00r42Jzuzip0AxTkBJA2OXUsfiLgQcA7A3zk4dxExNCel
hOxEyJqS51jdXOnJV1WnYEZWPxK1BBNr6V8bE6Z3ZxU6ARwsa4CSSOXUp4g3g1y9nnJxHYtRPBO9
xMoTVhPvUROgPVbq/KsNVTWKI+b5zVU2NlSjxmqp9QZUVUwq6q5QVWN1W3VTjnuq1zurarPc+VMV
BFVYi60B6ujsyznvM5+0cVs6PlBVY2egPGc0V9o4ry8VRUWm+BHM6CpNV7qsUHNVbq01RUc3MfmZ
j87qaA9VP1zc1BVbqpCqDVFR2ioFVcqpq6LnoKrV0EXPV1ViPLq+Oaq6oiyqzzVb0dWmqpgr4ExG
oHVd56rNVyq5lRVTCqnDq7DVWajnqsXUVHXpVlVugq6q1UxGqpjV9DVTqqlPmuM1WVZdRQUNX1bV
9Vmg50erKqV6rmVZGqCgq3nqs1Wauqv1XqrVW1Her+9VNSVWVXz9ardVtc9X9KtqpByO6hx1XKg9
W1ZVtX9I0egPVTCOrqiouq1U0FXVdV3PV65qru6rvPaiqsHoOeqmFV11U4qatqKrEXY/ObFur6r9
Vuq26rtXd6v71ZVTUl1qt1Xz89X1W1VSDnSrY6irannq2qmMVW1MS5qtyoObnfPVdqarnWgqsPI2
8ju+BC6c+6uizvUc1Xc8V89BzxxTDVXVZV9V6q1UUEUezHNur7yKruap3dVto5tGPlrvGerKsq6O
2zHPPqLXNQ7oKtoKDnoObvz0EcXPV9WRupq10FAaKJVec3WojvDR1Z0q+OrI6jurq86oMVmPs9BH
QZFV1XG1VcqpjV5zVZzZ0yJ+3Hi79unXFQUF1ZQduc9iojizm71NRzc1Qa6GqwIsju2z1UwNQR1U
8VBVZXPnNioIt0Bo4o4j1WIjnPFVTA5sugoKtyr46rKcVVxR9TxRVWulW81RzRVWrNVazdVqgj58
qcOar4zHXOa4Oq5Un4EHoLuO6k10FBUI0cccVT7FzUEVW3Fza5qrt9uaqmsTqu9DOI7j57LH59no
LuLLjzMurquiiZqqc9ebvU48NFGbKjV1dVnM7q6rlzxx1d5z5qrjx1caoWRxCoV5FUHzjWapoMji
5ufmPFE6rNVu1VtSaOIVU6ygqsx1ZdVNYqqeVX+bKmrPKuqucz56qc1fVeqpzVTKpPlXVUx7xdtu
goOerDc2Oqy6vj5qDsu3Sq1U1WqtiqpjVTuqnEbqs0FVMavuqm11W6iqntRVcqplVeVPZ2dTAAH/
//////////QqACW0AgAAkT9MLRH//////////////////////1NBVcyqmNXVbVcqpnVdquRcyqsc
9BVT6r6qZ1UxiPVTbKqeVPOeqmMVTVcqsc1V+qmfNlVOaDrVcqtVEdVMaKrasoqtobZo4tRc3PVT
V3zUB6rFVPaCq7VZqu81Vlo9W1dV/PVTOqnJ6qY0FV1c9BU9+tViqnNViJWfmoKCqmtVOYqiq5Hz
VU0quZVTSqnlVKtVqq1QVWqrlBzVWKsq6raCq4ruq9VZqu89VKHNzUNVx8yuKpqpjVZq3m5qkyNU
UFVMKiq/VSjU1W6DnVV2qnNVygoIqqcVWXzbqphVc5jVUx71XKrFT3s9TVlVyod1UwqxH5zYLqan
mVWVXOeq52R7iqtRVdVSz1971U4qsxZVtVioqp5dQqqVKiq5F2iqsmoKrdVMO/baNV9Wc11XIqCg
oMoD5RR1Uo1Ui0FRNZz5h9Pt0feoqyPXMbcVV+q7FHh6rFVu7j7GN1yczPZd24oueTpKeK/OaZhI
q76C1cAiqD0iDBur1LIBJCDZRijdHjqoYtDFuzjBDeqZPLSq5vauwai0RbKuzEa87UL5ajrwIBsu
CT2rFq5SkHpYGhqV6lmuEsKNlKUfKPHXogtAwW7OyCG9Uzm45Kq5nWrtdGKw1Ii2VdlcZZXnahfL
UbToDVzh1SKRA1Wc/MbVLV1X5lVOHUxrmjqvZVSRVTIVU6qvVUyqpWqp9HVTCqnlVJNVUeKgqptV
VH7UF1VQMVVLlVw9VmIy5r7HqpxV16zWVfduhVVhHMarquMd1caOKgqYufpEe+bMq6rqFVZzU/Aj
dJzs5QgcpfOmeoPVdxxGjfaoquVeo6rJ6qZVUydVqgioKrlVzmM6A/PVSPV1BVTo9V6gqefmNZ6r
1TVTDmq2I9W4fmq7ChuerKBXVcFRFlaqlyq0aqm3NlDQ1U7oe1VMlVVNqqm1UrvnoKsjzKqV6uq+
qkh0GRugVWmqaCLmqplHQ1XKrVXTlD0q3v3y8jqsRRVfUVZVZqsRvOp+52zRRxs+UC56jmoLqsVX
qrFQeKKoqyqzzVUgUHStnSgeVdHHVuVZVT2rIqmq7VbP0oGnQZHFzVNBdVyqx7U5HQZWSNQH5ueq
ndVMuftQ0FViJ0F9sj0Y1Vqq9VZqIooqCrarFViq9FUHqyqzFUVUgUHM+h6l89DV0dV01TVcjoMo
FdAc7qyq7Vc5ooqqe5tdY6nDKqxUUHbI6rlVqrDc7oKrHPU1bVa6GjdRd81BQdqqYVWIsqaGqxVT
G2d9qCrosPQVWKGoqpu2ds88brQOI6uI/NF2jzmyq1VThVZzUFV6qxV10FBQUB6DV88dVg1XVNVr
mqpzVTyoiMatQcxo46rNBcd81WG546rVVOqg/NVSrVdjq3miNFjiiM6k19efDzVXaM3zWKrtuqmn
Mo44ru1QVEXeLnzcRzmHbmdB3ObtlAcxz1X6s5qiOp5qrFTURqros56AVZQHq/vV9V+qxVbqsUFX
9TuLmipj8+jnN2jzn5qrFVg8cayOEdVMak6uznOagq+O6qaVKPlBVx6rdVMuerklU0FSjRTiOzG6
VXKmlqzkxVTXIzVOVWKsjSDdrrFURGoDRdxURUCdVw9XVN83Ng5s7G6VdHFVT6q+fOsZ6mK6DmqQ
qsugoKtqzmqt1a3QHyK+a7q5qp3UVY6uXPaVWuq1dVPorpVvI4qjpzVU9PV7DqaqU6CoPUG5js9X
HlqtVYQOQ4yhHcbw8boOuX1oDnNUGyKgVB+nOqr1WPmznqp4aq5VaoardVPqqdLrVZ5o6qdVUlVP
PVTPmqphVT2qkKr6qQospOvNzc/ag5j9qqdVZQnpKirvY+9VK1TFz1U6qpjVTSqntVPIquqvVUp1
Uu1UpKqkWoqsHquVbzVOecFrqY6qYnqelVyrqrdXVfUVU5qsUFViqmEVVO6rsXPV9XRz11XKsiVW
rrlVOaqYqqncUcXPFVYq+qzFcVX89Q6uV2agjdWHqv1fVTCqmposq+qmOVfVShVShVkXMqtqs1U0
qp52iiznqvVUoVU23FdWVWbyq9Vcq2rKqe1Xrq6PnoKrfPcUVViKgqpxz1Xec9THFFUHqzmqs1U1
iq2reegjqpQqpQTqu1U5qpjzUFWRdI+eqlCrqrdVNqCKgqu1UzqprVT+q9VaqpZqtxx1Xs5qqbVU
oc9XVWsqpjVcyqmTqs89V2Khq6r7qs3hukcVVOarqWVUxVW63Fq27qu1dzXVdurebLPVTaqxVeyK
qz3NQVX+epqp/zHu6qemoaqRFl1Ee6tNVzzKrlVznq+LKuqpzVTt1XKuq6rarV3U5VSjz1W+yte+
w/M/Pzxqg57uOhcdVypPdmW1QtrmifW5izZ0w/Pt9BcVvBcfQVizAi4YpIPmyuKRBW0WrVR4l8MU
XwItfs8BHnx4xX42srTLzOtchAuL9YT3XkMVrKKGaeMvAB7QI0CA6wReHeA88itgyYSGKQiwZZXF
NL2DKtVrEnZORii9YRa/Z4v58eMV+JslaZebYUvgQLi/ZYT3Xm6stAwI08ZeAD1yumBgYSg4ODLR
jUFBzUGVZz0HNR9aqcVUx5nUqq5dXdaDnj5qrFVMMVVwzug54qrFWVYz+Og2egZjHNRc9Qd0XOeP
nZnQRVWbijioKuqygZstUHPFQUDzKCgfNQVdVlBU1HNQdVQKZ9MjVFTSGyr+eqmdVNKiJ5QXkfar
aCqnNX1XDx/KuqtGPU1fVZx1fQc1Wc+VWD5HQRn58urDVcfnqFHz5zUln3zP71NlAbKrHM+tAego
Kr9Seqlg8edXVTqq9V90tSqCq5Ho9WUFWUFV6I9VugqtVfdBEvkh8qsnjNV1A8Oa6qbmu8pfmRvK
iqmFVMaqZ1GUFVjnq7pcvNZrVRFUVGRmoOegidVukWZnN2iqtVU0qpaqplU2qt56W9VXI1QRHoKr
0VVqqkOgqpmagqLhnNVapI9daA9VLFVrnqamSkygw9VMarGjKoqKtqI+a5ehruKoVRGaoygioOe/
lBUUuVceq/HcdBU1FTzv7V3NlV01Vp1bVTGgO+vO7NUVNVMFz1ee1rmWVFXHNV8RoqmLFa60DyKp
qznqu1Yo+agq7OfObtzVbV1JkdW0Hfrqg7RVY8vvHh8xNmqFHzVZh6Cg1Eu1nqxUETjq6rKqZVZH
VYw3PJVc58u+iy981XRUGzVWIorjmYqv5roKvzot9qBHoKCgoIp10Z1lA6CgPvKsVTQRYfBSkHRu
rKDKi8FBQHDjNkW8uLKre7NkWVMXN8+xKJ302ZZ031fbr81O3qKB6ruN0HPQc1VnDYa93dVypxnq
sx1FVwx6PnNR9qB0Hy+15R50qIuerKl9Omqr3NL0Magq08Z/hozGmak5+p+y1grdo6Dn5zXlBQIV
WXl52oOaq5HYqDxxGjqDxM3PUfauqx0FBe7Mu2UB3h+0WGWHcVVzn7dqDmjjqsZKaMz7UHY6qsHP
dXVWaTmPl77fOejzplbU7ivU7biUdBzVbO97DVT05jRdDcjHw6NzqPnj5qmO99cji54hKeqn9V1Z
bqaqeRx3dBFVtB3qw1VN6qdHyq8eOofO5mjNlxG56vaoFU1fVo590nNU1Xaqd1Uwqpkegq+r6uqs
Y6qY1U9q+qn9VOat56mKrarZ4+dc91W46rtVuooHlVqrKrtVO6rlW89VOKmqyvD1bU1WI6Cro6rl
VzDVHNVTCqmequjXPFUR1U4PQVZFyxVLqaiqwfnqpjHEeqzQKq/QUFEqmOJ4ZR80dVrnPVdqpxQR
Z2iMeq1jiw8dVOaDdVnMqphVtVo2VUhVU4q6oqpxz3huagq2q3VTOgvmvmoKujyq5zVfHFVYPVd5
uaqxzVUxquc9VOKqcR1Y1zTtVpc1AzR1Xar3PdAqtyKqmFVigvnw1Bz1XnHHEqg1BFEagPVbq6qn
FWoVUwqp/dWTr6UGjUBzfaA8VVmqmFXp2jm8io7uKPnjoDGOqmI1VtPrFiOedoKCJfIzY46Q9XVb
hutWRc8UW46rBqt+IbOW70F0BqigoKA1VzrVnWpNc5VnU1BQVWauM+3y7memRzl9kk47d9FqIIaE
oEIRBFoqQDqRFopnzLzbg6AmtEC06TUyzJynpCc0npwQiCLaLnepZAvk+bOnTVdAhAJrKIFlOkvh
lmGfNJEBAiDi5qqZ1U33QVUzq24uar6rl1WqqY1W6qa83WPmqaqa1U1yqmtVNY6voT1U1qprVTWq
zdV3nqyqmdVNaqZ1U1dVNKvqprVTWOWqmtVNbqOZ1U1qprVTWqxdVNqqY1U1qprVaqaGqnFVNqqQ
aqcVU1qprQ1WvYqrMlVNaqa1VZaqslVMKqYVdVbNQ1UxqpjVTWqmtVNaqa1U1qprVTWqmtW1UyqK
qZVU1qprVTWqmtVNaqa1U1qpjVbqpvVTCqm1VNaqa1U1qprVTWqmtVNarNVM6qa1UzqprVTaqmtV
Naqa1U1qprVTOq1VTaqmVVNKqa1U1qprVTWqmtVNaqa1W6qZVUwqplVTWqmtVNaqa1U1qprVTWqm
tW1UyqKqZVU1qprVTWqmtVNaqa1U1qphVTCrKtqprVTWqmtVOKqa1U1qpy6qbVU2dVNaqa1U1qsP
DSVX4vaqbVUgVZVT+qm9VNqqdVU8qyqni3VTeqm1VNqqbc3NOVU2qptHVTSg7nmLqp3VTs9XVUyd
Xz0dXe1Uyqplzx1Uzqplbz2K7qplVTNx1Uyqpkc9WOq9HVby7q5ZVTyqkOq6jpmqu5zZzWniqt1b
U3VZqp/VTSqmlDcdRdVvnqat56qaZVcnYqrUwaqnfNkVVnaypjiNVdqpzznq6q5VcyKq3VlVrNc3
PUxx0NX1XKmOq5OJHPVTyqntVg1TUnj56rlVyOqnLqpxVTiqrPHd1NTVc5zxVXarVXVXFlVueqw5
qsqsGoFVZuM+VXOfKrUxOxbUVVk8V89XxxVXOfKrdVk1VmO6moqx3VcxVU5qpQ52arTx1NTVTiq5
zuqnNVOKqs9VOLqY75z1NVyq1V0VV1VXKrVVNFVTOqw6k8e6uquxGquZHVT0/tXOKqkWqmVW83Mb
OYY6iq1Vfq6Oq9V9V9GXjq+qlTzmyq1UVZVlWVEVWVZVlWVZVlWVZUGqOYxqsqyrKsqyrKsqyrKs
qyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsq
yrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqy
rKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyoifPdRHUVFRURmqs
xnMc9RUVFRz+xR8/N0qaioqKjnmYqky56ioqKirKsqebnqKioqKnmPUVFRUXuKKKOoqKio5/KuPc
VRUVFQqioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi
oqKioiqKiodaq1VYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFV
iqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViOgq/nq+rsm7fMququzc1V9BHaupt5VdquVXK
vju2o6rtX1dVdatuLmmKmqnFV2q5cadXVdV9Vyr89XrquVdV1XLHG+er6vVVyq5dVP6uqu1XKrtV
2q7Vcqu1XarlVyq5Vdqu1XKrtV2q7VdquVXeeSrqmOqxlnqv1XovOU9nZ1MAAf//////////9CoA
JbUCAACCZX5dEf//////////////////////2zNuq7FzWbVV189RGdGmM2fzmvzM8qs1FT5lVyq5
VcqannqarlVzKM7iVGdTCmLqzKHJhzUxVezmN68qyoPz2e6iI9THVcyK8dVMKuqvYpiN1MdVrmi9
oamq/FVzxt1dV1TVznRzxc0c5W7VdOTyqauiNVddWRRxq6Hm8qccxcV2aodR5fPz8/Pd8/h1VePV
t5q7NqrsMruhquZMZn2rqTzpk/UR1FT5ZoqrjnnObWc5utnNFVfMZtm5+bmjj5qrPnnnNVlW1Uxq
sVFVqKraqaXV9VM6qZ5VTCrebnqphzZVaqsVFVMqsyrSlW1bVtW1bVtW1bVtW1bVtWVbVtW1bVtW
1ZVlW1bVtW1bVtW1bVtW1bVtW1bVuVZiJc6NVlBlVPaqe1Xavqp2jnurrq6rquq6rquq6rquq6rq
uq6rqvq6rquMapq2K2eq/VT/mjNEZ21U1J+/Tnqv1X6soKsqyrKs6O6vu6mq/Vfq+q/VlVyq3FVh
uaoyqmVVirasqsRqq0bmNGeoqpjVY5qsNVYqt1bUGqyrakxoqt5qrNVIdWVYacnKqe1U9qprVTL2
qntVPaqc1W6r9VPaqe1U2iqp7VT09WR1U3qtc3NVtRHUOrKsqypNucMaraqQKrNVigNVtWVZVZqs
1W4lV9WVZVlVIlQarOaqmtVODVbnNz5VTKqwY1Vjm1ccdVqq1UVFVybq+I3NVbqpAqu1U9jqtVZV
nNVtVPe1VOKrBqrdW1Wz1FW1ZVlVNKsoas5qs5qsqyrat5jGqybqtVWasq01WHqpkahqOarasuq3
VZqppVlWRRd6rbq2rqvqsaqprVTeqxV9X1WKrFX1fVYqt1U0qphVYq+qxVYqsVWKrFViqxVYqsVW
KrFViqxVYqsVbVSLVYqsHqu1WKrFV2q7VYqppVTQ1Viq7VdqsVWKrtV2qxVYqu1XarFViq7VdqsV
WKrtV2qxVYquUlVibq/KrlVzMquVXMyq5V+ZmOLOaJ5mZzRVbVTKraiqxUZmZFUc1RmXme5VlWXm
VXKrmZVcqs1U0qpibKjMquZlVyq5mVXKioqtxKq5mVXKrmZVcWqrmZVcq/M9VV89V+q/Vfqv1X6r
9V+q/Vfqv1X6r9V+q/Vfqv1X6r756uMfm5qrnNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc
3Nzc3Nzc2Lm5qrXNzcxubmoJrm5u0XNzc3Nzc1Vnm5qrJ+bmqyrebm5ubm5ubm5ubm5ubm5ubm5u
bm5ubm5ubmNdWZzc3Nzc3Nzc3NURGqKioqJaioqI8jjjjjjjjjjjjyOOOMRxxirqvq+r6vq+r6vq
+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6vq+r6v1VYioKqeVU456rtV6gqpEqvVXqr
1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeVWVF
V6q9VeqvcyiqvVXqr1V6+bmqvVXqr1V6KIyqvVXqr1V72oqvVXqr1V6q9VeqvVXqr1V6q9VeqvVX
p3gUqr1V6q9Vek12PVeqvVXqr0T8qvVXqr1V5edjVXqr1V6q9FLVeqvVXqr1V+q9VTiqnFVOKqcX
7VTiqnFV+qnEzFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFcUUUUUWyB
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
UHOt0EbugfS+0dFFMxxXZ8sxsV4o+tjm6CM9Sj2ryKgw2XFVj7mUnNz1DOePvUrI+9XYKDndBHRq
8qvUDV0HTKKdTvvPmi6vnqebtQLtj60GzVcd81Bbzpmd8Xbt1UTUzG8urjSdjxRXuKgsx5lVN81x
RR9Y0e6uXvPUHjqFZo6rGR82PKDJ3HGbD82dpDmqLiqu1W0Z1UzqyrqqcYfmqyoqyKq/VTOOgq2g
Z6k9Vm5bvIzO+c2pTRZz5zxVXarh7qs1XqsqDVXKDKrtVOY6Cq9V1VNKvqKqcVWaCI1WHquVUt1U
xqp1VbzrHdX0N1dVSHVduzR1XasyLL5qtqsVXY6toKrtVnKCrT1XI5u4qrtX1W6rjxZ2vKDrzVXa
rpqGgdX1dVjurqsypjPnPlXVWaqQ6iKq7QVZV3NeT2dnUwAB///////////0KgAltgIAAFa1UrER
//////////////////////9z1W6qdGvOegoJiKKqzGfmcwarbqpzhnHQVXKtzmoKDnoKg5ndVirq
sijiq3KrKqKrNSqrtXVXKiqxVl97oKjKrNV01V+OgqvVdVlVmqzQPnoKuq5VdUc1W1Xcuq0e8ypu
pqKsVQrBoqr5xjnud4egqsOqzznE9VcoDb54zxuoqpnuqnlRFd1WR0qxo8vaOrLq6g5uY1RzHUXP
zXz1Wd+OTLNQHuK8szoI1Ebm0c1BpUfWKkk95pk2SvNJ86YEZJJpJ14ehzRHLZkp684Nq4NM3ggT
enaT50wKWXn2kWgTM5X10w5pxw5gaevPDau5GbwQRNLR9uerzVXMoYqnmi3o1Vjm5maqmNW1U4q+
bXPVcqp2RPFVTM3Np1U4NVZXPQ1WNYeo556OOq47mqEzLEt6u4rmyJ4ucjFV8Vjepqh79MqzMoY0
aOq4u9Vqq6Y8vR9ue+eqnNX9SMUV0FVhrR44qqYns3eWYxVNBz0V5VYoKjm6dKDoaooI4qrl8/PF
zC+yqs3VTLbVWVXKuPl2uboegi5uarqqQKrF1aeKejoKqYZ2NZjYep6OKqzVZ61Wauq7rlAer6io
5+9VMaqaZQOpqsGq6rr3zSpVFX1U6qp1mVZdViKiqsHWVW6rsxRPm56rmVWLmrit1fVcccfSouqm
tVyOejPFZuxuepqHQVXcqwy6x1bHVh10q6q4fpVY5qtV82dasmD1W6squUVVjDqq7MVW+bnonuq5
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
vmmFFVtT1uPdySmPHE8MqCKr3VT2oPVTI2c1BH7HdVNqqeRnlq7Golz1Uxqp9cVTEjUHPi5+Znqz
Iqrp6l8x6qY4eOI88arsqpWqy6rpzxmqs1Ui3VaqKiqkhxnF7qpzVTyrqqQKrtBQWaoquc0dVNrq
UePn5jdjZqq5VTd1Watyr+e4qr/PVSNUVEZqqe1fVtVP3VeqphVnPV1RVSjVbqvxc9Q4j5nPVYuq
nlVOZiq3VTrndVKuVbHVSBUVXKqY1UxqpGqvKqnx6qeVWqnKrNTFVT9656sqp5VbqppQVYudZUxx
m7c1VN3Vcq+NXVTjyLmiqKsquR1U3qKqc1UgGq6qnlRV3PqKpya50qqY1UxqpnzVX6tqpVyqkCOq
5VTGoqvKqmNVI1VPKrVVPjnqeeqmUVVOKjt7EztLnTqRVaqsx5d5VjPV1uq7Vdq2qzVTioqv3LVf
qptzRn5ks8Ob3mq+otR1afmjq2rqiPmquZ1q7m5qrFXddcz7dVzG7VXKsqztVTCrnUGPV6q/no3Z
6jm57iZj+znNZ+zjqJ7niyOPtFSRKp56uNz39u7+X2oT0EUfNzRmuq2+ePLt1carIojVWubm9xc1
RHV1VypqsLmu55rniiyo59dTSbjtaftfvXKdemVEfvp/dzipXrMoGSqudI/oiy+fvQVXqCKKedWV
Uw71GYeq5lVjdA6U1X6q6KrI6nm3Z+9Wc3Wo7enyomo6uq6q5Udsu56anJxc+qrCe7qLVA6GhzV3
QyROWqxV7rq1h6V51P16TURzxmqesRzVNRV12dXhsr9Km4ojUG4zN/Y4jGOj2mqqcmNnNz1eqrlV
jTqphVTiqydzER1U3V+RGqtXdVPKqa1Uj89Vyr46A56qaOqnNX1ZVTM9TV3NVTzn59C46rvaooD3
U8x5k3e+bCV1Uhc/POGqaqQauqv93M1W6qcGqd3zVU2qb5ldV6ramqkg9VPcnuaO5DxGPU889zVJ
z5zaPzVKi3z1WKnmjoZehqjnj58VXVbLFV7qt4fnoDG9PkWTx56ravqbjZ1dXVNSbOehq+q04j5d
WdKrfPlQc3k46rt81ThjOXnPOnVRUzB7jquVNQde30vmNVtX6iijNGer6jnNz1bV2VNW1dFUe8x8
u6syhqarVX80dDQPmjjqDHPnPVk9kej5V0mcx47tHkiiNbjqpnmUEdBVTlVWKrl4eq7zVWKCqxV9
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
6rlveUFW1bqgs0WKoqIqAwqamrVUKQ2VFWR0NVjrjqb06rsVBGdvKrtpbjnu0Vtnj7DEnLvHkudO
eIxzxm9u/T83P2xJ9b8x88UZs7LOl7H3pLi6fBu8P8F5tq7eI8SiOJZro126dtbWI2oj2bsvmum9
zc7M2bdqo68z6GO4/svTxG9s5rP098HodSDjKmYsR6HNVhojb5gg+wXuSZO1GUg7xRa107izVB7z
HL2UXNG7CP02/vMbsb633G3vSPmGbqYjRzuVeObxnCcejRG2HEZC90fbLt7zW/NhfLsw+PcuSbx7
b3mdeve87Y9KO7ahuzSDn681X9qrlXc8VA1zuz88VTzVeoNGVA6OuZS0Ey6CrrTjuq5VdxXHV3Ou
uYbsepqaDrjvmb75URWfnqphU6NFuKqyazxRrEa856sMuc+Xo3NGfMPcdX30HpzGOueqmtVmKoXe
OrTHqanLxGi5qrdWGquK46mq9V/drIsdWYZVMdBdo1VzDmz7Gsvrqr9x5FUVbz1NVg91NSquqsx4
bv2PdTdVPar3mo+aoqt1ZHVaNdx+89V6pu4qmJ83Y3huar6rlndB37tM/OeKrLN6ojKoNUVZVtRV
tWc/O6RRc1qqmFVnMfPG1PTTorMs6YbXY9b2LnUxro044rMbDNOLDKPdRih4lMfJPivppwL6XDYm
omVmgpMnSqyxGUEhju4lVzXoiWAjrogz9rPrXVkiDazv5/E/YNuGKslaCkzpwMqss4y2Ic7uJVc1
imiOFiYnxDNEHftZ9a6mJEGyve2tmopOxplLpJScyiq7pzRYbzpVl1DypoMuK6DFQHuWgx3U5HkJ
ne/F08fbPaBv0TO9prObKOd21oxs9oPNdltJvcVr7N9OvYTudaDnXkuH7bi3f32gzPhu5om8qFG1
FZz1OJ3nNds+scRqvq6LvHHU5QVYoqDJ6aS5qsjjd5V3PU1Nqp549885d1NTQYz1bmZd5UR3GeKT
pLzRPEfVuKooKCPtVhjZrniMaPO9Q8qWDM7d1NTlWG3Oc91N46mgw9Wox6OYjmNv2pi548SPU2fu
agtvrO+0b9W/eWgaboDxPNdpxY8vDpR3uJ5edsvPl17ifvxe2Y1B3Gc5mfeKj8Wj5zesH96GDxi1
nl7rqS1Lqglj6UDxx7vIzp1rNV3QVI6m+Det9zTOTtnhIO0yc5jjNXL5zDQluj05i7Rjr2cyYioi
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
iGeGSG6HiGWGOGGHEGw8QwQ6w2Qzwww4w8QzQ3QtwxQxw9QxQ4Qyw3w7QyQuQywzwxwuQywtQyQ4
QyQywxwyQtw1wyQ7Qxwxw4w4wwQ4wtwxwtQyQ4Q3w0Q7QwQxwxwuwuw2Q2QzQyQ4w4w9Q7Qxwxw4
w4w7wtw4w8Q4Q4w7Qxw2Q5w1w2Q2Q3QxQxwzQuwwQ7Qywzw2wuQzQxwuQ4wwwywzQ2Qww5wwwtg2
GSGuGuHqGGGaGOG2G2FuGeGOGyHKFuGSGyFmFyGOHKG+HGG+GyGKGSGeGaGOF2FyGeG+HKGOF6GW
GSG+GiGaG+HaHGGSGOGOGKF+GKFyFuGOGSFuGOHGGOG+HCFuGWHKHGGyGWHGGuGSFmGGFuGGGeGW
HaGaGOF6GOGKGeFqGuHGGmF6FmGWG6GOGeHOG+FyFyFuGGGSGaGiGSGWHCGyGKHKGKGKGKGSGSGK
GOGyFuHGGiHeGuFuGyFqF2GuGeGuGGGGGuHOHaF+GuHCGKGaFuGiHaGGHiGeG2GeHiHiGeGCGuGC
FyGyGSGOGyFyGeGOGeHaGKF6GOGOHiFyGOGeHGGOGyGKGmGSHiHaGaGKGKGWHeHGGCGeFqFyGSGS
FyFyFyF2FuGeE0AQnwkgiE0HgOE14hJhNBwAhOBEJ0JMJ8KoJAIIBAKhNhOhNhPBIAAEJ8KUKwHB
AFhNBgMhUAoHhSBoEBoMBsJINBAAAUJwGBEKIKhOBIMhPBAAAYEBkKEJIGhJB0LAOBQLA4OAAIhY
hPBgABAIBALAkKEKIIBgMhNhOBAGhJBoAhJBgEhRhShRhJhSAEKIABYHBAFAEJ0JIABAKBAEAEJ8
KQGBMJIGeAQCwABwJCSDAPCSAQbCSDwABARCkDYSYYwQBAADIUoVAXCkBAXCgCQTCeCQABwYAAPC
kDAUDgGCwIB4TYUoTYUgBCaAIT4TQBCSAAXCTCSBQQAAGCAAAAGCAYBwOAAPCgA4SQIAQADgADgB
CkDwYDgABQKAIToTgICQADAbCaBgYDAWBAbCnCSAITgIDYUwBCoAITwICHwAQmwmwoAmFCEkHAgA
wpwngSFEAQpwngGFECAQCPYEBAGAoBBgOBgPhNhOBALhJBoAhJhTAsKIMA8JLwAAIAAXCiAAAAIT
oSQBCbCaCAaAIVweAwBCyCYSQIBwABIUYSQODAWDAOCAaDITgCDwABARCkDYToXYSYUQWDIUgYC4
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
xz29VZIXq19zx7ulr5sft7s06xXPr3TWq9OlIV3Cp01E09CWXpeNtP7u5nSe5/M9dCpw1RoY7OwG
M1XGztQ4m9lJe6qKpKdkukxGuxjpkfR5sNRTwd/Eu7hlchj7rujWG5EPb3aGWMa/OIhzsxfTfHhl
y5lp1O5T307MYfuNSVvaAb47dgwfPgbDdYu3R9e5AR6lGGWmNTEVLubiugf7U5HiQ3XhtIYO5cHb
77DyRdM4eeX5r/5L+hLbeJ1Lt07qp027s9P//m6/xuvstP7vur+aH0/NWTYXNo8bB4aMG58e+EjW
IkY7pvZay85JLAfdq5/8FILEKcNOa7mb35bLRA/3xTTk97RNLs0WJWLEpOtqLZql7alf1XxIKiy/
N5T+0QwlOXsdIdHosPli+B+jT5n21o2a8oc+L+LtlfRgsFxdTZ23sW+Ou3CnZ2MNzw31zdk6LopT
jn+0uD8+55+Yr3qZuwZ9NMG6exx8Iiy6N+l+2AIelehwvQJiYZG4xWnuYuHL8fFpmFp7uXuX20X6
mVv6Us6jmuYVoquTetvu4c3ZpPl+q+EJaAZRI+O12Lr6R9MMKvZbvlzegx+ZtX4ykprOkrGpAzne
nRZ/YP9rbsZzaOfTu4+IXwn/+zNND1Nu6ft9ybD7uUguLKPDlfyx+Ladl/R9zQw3c/jzxTY/ip21
RenDFbE0zbVlnhL60qdxVpePdpp9+yxh9lOem/b01edDqD7mVZ1E+jvltKmz90jk+PdnFuOb1727
hmzvP9f4YHGZ1piWvSt7+rwzUg5BLEuJTwf+pFh8oSNJFWRz6u3e+Xqcc1HJNGIqDq0aTLrdvcvN
zbuW8vtD3H3/jgq/f99X5q9yd5a8srfuVNJS+0amvVScWU4ZnZh51F3neEaDztTIs+PmLNIw3cRP
J2YkcpjcaTl5plNbn0yuvVh0Icn5UEpMWhnZyYfjeIjduvmRmeh7ac/G876/8tL1K4MK+fohqDzs
P7Ixwy/jaGxdt3w1J+OqyyCyZQivT74tX+YxfBzT58NVe803v6+9LLbztGgk+Waf2gdVXsvAXA+/
jveo2PNlVM6J/r4TJ7f9p3fw+NAlTNVMs3mzH8bWTrUBHsVYZDkp2nRIZFJ3qnP+8vv5zrmzOKsa
ooJXCN5cTbIbt3rb+Icdh+y3jW/fUxb3WX8ka4QtdYcSt/Pm2PBK3zWsh/uD3T4lUx9/jn/7YGfd
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
sU0iLjerL2Ua6q9HI189rx51aLjJMlNFMpvtJnO4yasK7huUpkY/ou/N/6ajf0OLt7eCf/2/5Wso
6/KWR/fna1JZ+Gi8dfFq2Z48d0j6X/y5tPW86PTEo+fn8+XG1I4h5nadm/sw54ekp6ei4XmaITUf
U93JQymaxIge7+hemcN8a9etRtg++zmG/jVvYsnPspSke8zwi10pMh3P1s01WW/G7QsJpZNH+d3q
pEHn6uS6JPEKgg1CX1VJ7tDy2u+t8uStbVHSx1eG1tMplfhuixeVH++uxd15d8vXxh2fbsMvPOEe
pkTKVNdSXcTGZCpTO01GOv0BHqVIWYdCiByZO1c+cTp89vFjt/NQ19qrQucwP/2Xtp1zfSz9XPwn
2Yzu9UG9c2bXLsduPSD2gZ2FXQ46qZRNu9dFxnTa7XQGJw/OxOarff+X490vLeskd9uL7dH062f/
0j7lcj+tq8nHtZnWP42sQl27baN7EFUjns1j+ptu68NW63zKrPjRialx4s8t/YlmW3I31Wca577N
UxgZs27b29yMXtG8zg0XX1ktIa8XvxbLOsnrEv+ieX9fVKZ+FWNZlHx4fKNsvn/8zmXXj8e3Fr2V
6k6X/TDNW6V/yRelWS2SpK7lwC5C179+b/r8AB6VGHizA8IuxehuMt9d79x57E5fPg4HFTx4e8i+
vr98Lv9e19w6DVMXE58aGXRhooP75KKK3eaYWlt7qR1JrU2YVifb48Jaf8xPrfr152t/O5aMXZJo
6Ydu2gjXqSLB+Wndyw3rXG3DyrCoyNdga1VX22/HkYssnzM9XF7ftuldhkfDva5tE7Of+uRTiSqW
vpyNZGri/dje+3YkYm40j/WrqX66FjWrty+mWCXu3DQtsTyMHI5nZ+siZ394JX1ud7M/XQ+7S1vr
0VOWdzPZUj2Q7dk2tMW4qW6i41WS9mt7AR512OdCTTKE/CY9eMf88oNfGJbNc3iqOniXVm6n3YWR
o4PL35U/v5aPjGkHxSO9YE2lUapfqmjLi278RUf+xmE+OrxeyLfS9ake93Zu5qfMvDeScQ+ym6XD
yJG1NtVgczuJ7OPlkNHNyLAyt4fpq3ey0RmPye2zg27UGibziDGWnJa8D6nhmCZLpuhhYc1fWKeQ
nM70Rug+cdBUm+kYm9/0Vd8+eqpaLSKBZ4ka/Og3mZIJH5Jho3MrOTk7ZDJ1dnuz+dd2ycmlCTx9
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
U1U4qp0fm6rmq2d5rdXR4Y0RufIquyooKqcR4aOpjw1WWZHNUVdkVX89BV9Aouc0fNG4MN8uB4lf
6/7vObmw3We9nupvbqzI7jyrJ7rlXXl3Pc1Xc1Rr323IepqairavqtVNW5V1C7PUcz9RqjUrnTKP
Oeraio56nqeJ0JzN1NV7vdXx6NV9Xx1E9ZvbqzI1Vk9zVZmVWM5ivGKgqO1XVd2u+0fXn7c/WOra
rc8aaq7plX3k1nPk1GfniiiVTUR81Tz9DVWja528ug56B8137FzxniqfVdVpXVsZpqPObOerPajK
v3faPrz1XY46rNWZV/c/nNzUFXVdQcxz83O4uzO4jI+UFAea62fvmGNk12i69D0FAbIz5E2dx2bn
jOa6HrEag5nnNlBcaNrL6UHMeKgjs/SLE2eKI9TUUFBQVFTQGa6m6p83W6rFB7HnPVYq/r0789BU
89B35jmPnfv73fSKofOos6d1z0C1rmjn9UF0PdVKuYeVPPEzHdAapoDNdYqnn0bu9Tn8Sy/jpgoa
7Ns1X1ZV5t1YersPlXdKrvP2NVZNHVTOq725mbtVlWR1caq6epi5qCgdVmrKrFX0FRQdqmrrNUvK
rOZVl1Y7jqw++9RHGerKsqun6Hug3qr+bdWHq7Kuqudooub8aybVBQUFBQUDq1Y8VW1YeiyrLqYj
ZQWfLoF1i5j5QdrqTxR0Fx5VlBd1XMijqajo8vnzmlMsPzc981Ro/PHdBHnU1VpczXY8dA6B1as5
qjn5+d3QBvn53FVtVmoqs1bFUGuOq0aq1HZzx73eo6qe80Z8qdVWvVzVFDVhqrNVjmfbVTU1Xqr2
VWKqe3Gbs/aA5uZ56jb6xmV3HQWbD9DRqKq1UG65Qxniqp5lSsqs80VQa46rV2e+er8j58I9jG7I
8/QT51QdI+fXTXPG6mojqIz1K7mjSoDVZd66dVeRVcaKOPpV8UeGR49LKunHh8q2pPzvDVf0xGiZ
uezHqzmzJFPxqg6R8+up0aoNQvaDCSoFGqCOJuKgT5ndTcXNboLtZQRx9z2fnq89BQIxnzVJoubf
P0oOY2XzGTO403hjd+Y2UFvXeM0cds1AagoJqgjidWUD5nQScUzZqi+t1HU6vD5a54spXFkZjGvm
VRGfp25utWLTNZ3ho4o4pieNlBU866c/NZr6dtHj5t1s6x82+rq/MqaC6i4vLqyKPD1GRR1HU6vK
uqObrh4o+jeRx5dRUXq/aDVB7Zmz9l0eYzc66Zu8OfpOdnQbu96xc/MulGz7d48TSvKtcmubnu09
5QWkuidu9X7QYjGoJvmrcnmOYq6anpqrpieUUSTj51zW4nEaOK556qcaiy7VDlTFd4ZxXa07z1o3
RmvzKHtMVBtRN37F5e6smrmJ5RRdWqCNHxvMy0azKzx4aM5juLD2c5zZ1mL6mmrS1rDzpjx8+HPF
mW8ObLw67qPvVlBPc9BFvOfqzc16Pq0a87xnq6KtetXQ0PRdl0XZHMund9UcyPfTrq8V3Oayg7Nz
h3zduaevDJd7vL69O6zrhjRduZR9L59d6Gzs3RdlQs5lzNJtpXcdB0oI+nbt27Gugt5QUB+kmz9O
fpI7jMd9MuiyS4rPmSbkoNuZWpnpQM1FkfZ9OnP0dCz0aoHH07dozzNBnago4OCCg0GGoJduy68/
Nzc/V0DoO11YePobs6jnqzpna+mGM75j526UFQY99Da6Hi2ePpVwzKCO9nPvrz+XmVGX0PzR9XQR
R9ObIwknfEXGSQST110+rnIm3FOTFirlPTPbKvqYu3WLG7mrnGIufU1Mrm5pq2fsfJjFfPR9uZLm
5ryjcWK4qvRtb6ucifMbts87xd8bOvXL6dL6Pv07s1Au660BqJ9bZ94uzDcz4o3YZ30zOm+3Zdnp
sOPpd5tH6KSeoG5y+j72jdG7vyhnKHycSUR+bI35mHc5Mc2UI1t8001kdu7w9hYsg5rxsRTF843l
CbycUR27NHxMbygoLzo7fTGseR3s9q8eLSt32TjxHcST2nmW8Xd4HQdsu70e+yfa86OzJUE93M8x
xxxx63er3du99dRHd82mEscfXpDN94uqP0CxBhPXTbezupWjZUdNIw0ePW7Xa3Un7Ntjn5c/KKKB
+eoMbOYYm+JGgZAwV3AzbPgULUDwfJ8xgflFcLtAfz8yd+ALx+AB5fYyR9z8sl+EI/dFcPL1zzzz
zzzzz2QgkJCCDxAkpOA4AEBAKaIcIdUnSvZJyIPV0+Z7PgdHo+ABTl3KqqqAAAAAAAxEgJ8nomTg
1JWFkCkSgkg0h/sahuBEqCHY6CQM+XKgkjZoSTsEN2QqUbNNuRY1QgIgBuyIQOCQywyw7Q7QSGSF
uFuGSHeGWGeHaHiGiHiGeFyHeFmHeHiGiGKF2GeFyHiFqFqG6GOGiGiGOGeFyGiFyG+GKGeGeFqG
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
RERfdJ5uqR+7377WUdsAqkN5l77Nn4NROexnz/96Tb8mxX/EzzxbOs2T/NqzHWxsvxNNd6ZGd8dj
7ZbETPP05wwTp/SZZmRdKrXS0CDqwo0cLarJQ6NtO9bj9dhkd77+WD+fTk+fHyyZT5IRP6z3tbzb
7ITR2Zhnnd3dLb2NA2Py+jAqJYkPefHESzcPXavtaN1I0qYVSqMmmVJ7jDS3xm/TR+onjrm/rJN9
ODAnuOi8/8e701nPnHTbew00X+ikozbNSf/l/5lYF9dxma6TEFPb4tN3DA7V3ta8ts00UB6lWHi1
TgqxqW7O3fT4Q33HBXy8dR50BfeuFpJHyZ8xe3sa7e3dc8kA6yWR00v6c/ej0teuJ3gn0tyWu/Mb
6a8yM3ud0p6RjfG1vTeaK7OzfRrO60Sb4rrWlcUc5NL6/Py2j/WzDr9jxkVGc7e//760vc2jt3Fc
Wfc2xe17s3Pd+FOJxuk7WJa0f+4wAKYfI3k+SX1fRev0lvf8099hDr3LcTnVobFy8w/PW0Vbd+mN
x/YWidTE6aMjqefjDsetluH8d2csmr80T0+eHfz+Ae5KB3t2uy4x1UYzmVTbDNqoq+YtK0Z8Ax61
SFgsikuMuU5J3XqO48tjH8wvplQsVghe7Xqz+heG7yWqme6ZaTa3lQHDDTio6Xc/Fd3dTN3dSNoY
2Rppnhv0yLfRffj7adTDylqstUnWnY6xdbPRbK4TkvHDuM5tNJVKQ91XmpbYd2Rzg7e275aT2ppr
ra2d1/yNJabNGCbGin3EdpRHD4YNVff08GH6rTaJnZVmmO4eM5uqJLPkc7HuST8Oh2SIvm/2mo5m
rNToNiYdEjsLRuKmW4sMx1hmWy8/6nDjkNhfF1ditu9oUL9m/Fnlf/+8bzFYVBf0urotGiRubZj0
MQsetZhxU6eLV18PpG66TyMLx7fOT+e2h/IQvEur2My78WPX8Oyd+tGv/LrBmbX+t+b1qth58hnx
OyJbv0iMu/jsi2m8yKwN2tt8W34ny9TfyWhcjNjjxaPv2efr6SGejyM/Z1gzp9HRdb4N32o8+msz
y9Nom7nu0NoS745dHXYk5labSkat+5qNZYvbxwbfn593+HNjv0+uxb+VrzrTiJiYfQvJZR84bavs
c+02Vcfa5zC27ykjEWmmJLnbuU7Vg2K3NqezBo9PCb3lffJUh2s7drNYmjG5N7gb63J4TLRai9VN
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
RYxmiGVsfhcehUigIwZ0kJTIu9mh62+X16pLxjeyq927/HM3zuhceh1Znz3PWk/wanL/7RtG+uEb
1vu6u758etttlxw7ennsIC29WJ9zVM7fuDHrvJHV0qrN5G1rK5vmj/tkbdWcdErt3vTN7IYk+rcl
1nvQTrOdLT4j+aymdtYaNZZ0JmpjXRnjZt23Zi+ZvZ5Wa8evdn1Obtu0aTMz2rj7t/MEpdens207
q72OH0N5qmu2G7G9mdNbCxble/WvMlM1jNX+INqs/WcW/SgaE7na8bZnmHW+SbTuX01SedgwlzeM
nHT9nTExxG7Pxr2apmNjygEetQisSYo6SLKitx2mLvTx+xfXF9PUqkOFruuvPsy0aQt77+aWPyXa
XpjucDbh59aDzW3xVrU7qLavtW9gae9fONX62dx8MrPbfVjnZMrbt5RzbfQeNzeHFyTl0+c2OQq3
GZOJdXdrz7+ltCVcYY+fdTC29me2jVjzgWsJvS21Lh+HrWEt2mdKWkj1Og1rv5Ga9MtdH1be57Zi
es9eptvKb3uUcLt8a3M6HTFyRi3XRk3me1LirKlh20jzCmes/pSOnTva8CDOwzI596XRtUbnO7ot
7ukNr2uqaHSytBhF/GnyqE0JwfAmaw0ehXCsbE01VRxCDXfTd9+8v1RxvI5Dil3t3l4x/1inL8HN
HP1dPYl/uPjgzFep0v77yKby4XTQXdsM4/Qw1kicsxJGNxvUGcdoMOZSk2s11a4sNvOQ1nFD33xn
UhNZWuZ2fFwu9unjr00b++vWsDeOa9cTJ643WauzXlgb+9tImmlMYyePH39YNtvrKVtm/yRv9pb0
fbBN7mKxF+l34/khsZt/rb8TeZC7t8kM4brmIWTj1FPZ5kym+aYjJBf1dt173djNbnV+1LU2Lfmt
wwu2d5sPpctpHW9msqzz2aKJm8Xc4qDPgznuqRFtAR6VcKxeHARJKHeTU55e/fL+2cH1TvU8d7l7
16/Fh2S3ahzKb9I1XD1saEwbhGNr7k1y6FRkvF7urZi97ZvqJWW8uLDo9PXmAdt7xpkTaVL40e22
kRdxf2YeHHRe2xoRI2+Z9ttuc86MwbTkr0xs+Rst1lvL/KEXLzNY2jYZN6tkl/ET/e1Lpv3P8nCW
fdV1iBVOp9tu+WMcS9rMV//ZLz6u0GlK9/lbGodPhyUUxq0kSjRV21Y2sTH2smdSdu5NOi52U41u
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
1cCeDkvXZv3NTYLRxudnLzcPWSd+b62/8SF6NhJJwzwYq7UmZ8Z+e462mj6n0hfri4k55EeLnzer
fi6R8GSLmWGgu6psaZINJKexYT7E3pr385Jq78RblFpPpR96W7s65bhlcczADLmMv9/yKOkc02E+
+uZu5Na4n2Qw5doAHqUgpn00oAtBnLozp7dze3Ou+ss3Fx7EXOwq93azLQ2fj9/cQrZsl17vqLdI
SoPJPvgnzOri9M4LN5Lj7dHSIM1ZdBJrdk9p+hgi5rn09c7u4ey1uJxXzbMHfp887j/W/zin07fc
MIKxrfJT7CroxI1bcETjqRmhOddv23a8vy6/vY/7UTY2Dflu7Dr+3pMox7rmnzTYDPls+tmeF+16
rxpCD9em+RrLCR2m7fw5Hd2Cvf23fWrFOOpb5ujCg2RD/YQZM916T8P7e/vari+k3/iPyzYta1+a
mcPwjXZPv1ohMNiepqYfy9CGPdkBHqVwol2UQOQtM9vs3983enSXe5d+49zI7nzLknVQ4PPEe1Cg
g2eX3pPX7jbGrfVMh7hxpp0lkkzrnesRO2K7nthgTJ4+tmm9dj6JdjbuHLuOdM0X2hvDYe1F48BE
dnbRVTUs00k0WVtrL6aTI+a1nXnzrPT1ImF1VfPh7/pjOWeu/eKV29Z0lBstfwsvtfbP//6Ud4ur
m0ecs+1YSHk2W3t/JqfntrHSyyEdca5SX3R5rR3kaImye992zVhL9/7ps7yoLn0Q848WHxhP/3S/
Ze5Oe1kbHnn2Qffk3Rz6rA13lejV27UAHoVIeRVRRUkvcflujG8cun1XMrbyQR5kt5d3uarZh+Fn
2K18W93WuK23r/GTkndvuMdtvWcW93AjH83d3XqYa2dAwLxODrLuZhfW2ByPxlhYEtb0sF110Egr
U7s55G10amz1Z9bSjLNnPi2GEZZBd8/cYjyN/DZRSTrFa13sq27TJcZ2LOkm91vj/Nj0xhKnmHkd
LeGy6ffCVMOjvpzBKNyypPM9MtXgjrhZnp4wSd1lNTfX0lLDxxO8/eh6YSGmv3Ge6LnWfDrdwscn
G1mc5u8kjgfGaJHsWrmWiRYIbdvSYRIepVCuzjDTlS9x6s714bh50q/Vc1VPGaoqeMjR6x2m9zIu
ftOx8FJrn9snNJkTw8dr89exNvk2SzE03ZORtc07sTnfL22v93WtUh9Rs036z9dBx2MiZrE2h32d
Jw3b8CvJ8jmdVmezbK9Xq/XhfXfRwC3rrfleA2zP90MzbLv1ek9WGZcv39PveUzImd0Y2W+nJWax
mKvHcXbDWp40XW8+2B/8WIn8lTc33ph2Ve/9aJp10et/bjK9WxmhVn4nap7O54Pb519lOTd3RuP9
LfNMvPlWm5Cqm/vFLyfddadGttcrJW4Zvwgedeh4s4qLhx1h9WTeTZ4/d/9JU1XX48XjonZ3D27/
Hult88vKVk7/5tzZJ45fvdG0yfHC2dE61rjPTb92Wut0QXPcms/6jh+jaY7E+k1Jdo3DNkJiP9NP
j8O6a2E5j8iN7O/Xn36d3MORPHa2DGFemcvlVTQae7X4QI6hV8q1kVivk+rb3sP1c/+3Y4a/uzk9
zm+X443zu8c/0/2r206S5DE8DIEov92n/HTrG/MKRnoI1rx/Nj9Oo/tUb8tixg71h/Npqje9H7+e
Gjrpj3U+Mn562Xyw3azPF/do0x/tU/Ip7+7Z0nklHqVIUKsUXdGMrAeHc7c2HecoU/FY8drlFbzL
TuOuuJy85Gu2Mmtw9GpwTg5KNxzT/8FX8ffxdRbtT+1eXDTpnZdzV037Ob/UZPtIf+eukl5ne059
Gffbl0cGOeYht7s+xv2+UaumMe2Lc2lKZRKJ6KzoC59vvRpJLzl9wSQ5vm+L3ezG8kkybY7f/bgx
bXtm23BAuobBx5ajG4lF1jKn/HT2fv6fbjW7Wc9Fun1w3cPCZLtGo3eIe8Y6ef4g7qL1t62WC3FP
H3RnEt0I/9Ju/7nnc9qCNVXbMk3mjh+buKxxc2feOqQedUhxC0AIYnJ3yD64690wfn36dBurqyq0
7yWzlbu5FlT2vS5q9EPzy0WT2OXPb5w7M324bmd4LYTkU5G1vaytaMa6jSePn1v4zmWmJTLZMBus
TxZOF5sbM+PV+U3zVjSv12A6F7l56F77x99B3QJrwbIWK35Mmg9WdW4v8x7u3uKPLd0q0gv7MfrQ
lL7eseyidf93qmv/usfoD89mrZZ037p7a3GZ/HY9Dkd5TLrd1dRT+CJMT0hkvX+yMdO06x1iN3dj
Hi9K2u+DwdqejwzFtmyJH/NfdvVPhjxslenH8c9bPAYNthLbPE239GYFHrUIrEOaJQaDzsps975R
GS5LlQfvmrhJPGfku+WZifgxF02pzzx8stmZbL/iVboS79jOcvvtZy0/btzrRmuQutLj+juP+T5Z
jof57zTo0jvrEu3dGus+RHe8f2kqNZEcXH49+pdmMg0ero/fY8/t1jGjfCn8fbDrp+UUj99fbq9e
f41j1Ze3zE1oUpMRtW+2mv5tXG/NGWln66IaS2zjtu3xyK7b9n+36jGEj0c3L+ZoarGJTvbrnZke
WdZKuL8wPL15aL3r6WUvfT5EwrFIzHBsmnO9V2vHe8NieoPysYqXGqHJ/mYdAx6lSCHTbiJ2QiC1
9f139S/XF5SXe5d5UHV9f3PPb33qNL3+aph/4+3eNdvfevryb3Z4sPiXYuM0o4nWdpX+eQ82k8jK
txAuq7YtbauhhSO291M9nWNaZWTn/Hu8t68tn5PXlB19+zZgDpZmPfIz2+7u8NjU5MnvmdiN9IIn
Az65fnz/szfj1xDqvkja/v562LaI6NU9LPU77K6V3XSMTOWei3nrKmWOV43RTSc3uzo7qGnLGDGW
c6m2uXaqI348To4/bBzL+XnpDZzEu6mT9It1q+aN7IoztCOIye9QSW7UCh51CNDERJT0Ssptbz0L
6l+X1h48tEvlnlr4d/t+HGqd7/qn7n79w5J42tXLvvmhXWlt3fnmfLa4j8hFasPhpo09qKrreAaS
ijdhOn/xMb+G5Vz4Kg2e6R5tIrPBr9YhHbsPMV8+frfmMe7bt9iGu5k1dM5Os2u6F9GpdXaajfG6
o1zPmWkoT6YfL96JnOxO5t/JsJlyph6977TEUEtN18ZJO67n8cIra4i7arqpcy+Gydf7/oEP2Vjb
NF7Gnt0vd1Hc+nASp/lu98nTf0fa3n5du+KY6jLKfZra0YYt2B6+mkYLHoVwpKkAusjI2za+WRmx
IFu3u7cL70lbp+h+w8nJph69py8PE+ynkep39kdx5Vyjqcd3mEqDtHojeUt2LMzWm7u3L2DEI7J4
Ys4XRR6FG2pnM9Z6rLvdwlF0HjMd1/t3mJ/Yyyr41Ll1MOf46C7mLFP2/ce81nu1lfHVzNh+lymM
eBm6Gq7DYioa49p/q18xzzEc/0oe5XYYdW6nt9Y/puNJtGy5xacCl2DGP6rBLb0Smmkxh0e28Vec
Sy1aveuTNuZvI5bUb9Yexjn/6OplH0ezRmaLjbGo30NMitexi/+11NyNRAH+lFCioww65rtAbt/v
uxH/3Ua7qr29u6zWdU7l7/TK0//PnvLP3YnutLN1dWHPVxpl2Qdm35myvh7Zu+F4yXmq1x2eWV/2
Dm0naRbX1QjzLRcmZwh9nDFkwY5NOOCefArxtJbSE3+6f95u2EjT8vBAVxFdi5hnKpMx/jcN5npZ
G0SrPWO9rWUhG35LYtPwE6ZrkeIiB2tbt7wYe6FDbXOa2fRcphstFu4uX5+NqFuiw3ik8To6mhOf
2I1abeNuJh/6bJ/w1ZflW8OJAwfO/Ifn0t3XD3PY45EZ4uBqhJBqkjboaajomgkelVCilUajWzg1
Z96xYT+3G/ljMoUK7oMzUd4Zf32trxpem9n32euinuLPXBzOnJ6RAdYTRNgtRq3tOn8uZ3QyI+b3
v2+GXHlNe/yePrVr+mVw1/O03qpMm2EtmzucawdV0uw2d01NSwOZDrs1bPxiS7dlPF/47STta/xm
sb6tPTG+aW+RfG49sjsLu6uGxrRsuGgJw6j7MRnGp5CW2X59epb355eZ5mXm8X79uLs3u389as1o
m8/b18TcHKN7jUtvxjrjWn/wkfuJJzYn1314N/xlbyO6PgnkVLXNo9laHuJhd3NyyQEehUihFUz3
WMhFzh1z92q4+TVCYOoO7lVrKssK5aHR6+kXvA1kwVscPi2tXBwWzSX/dL2+0en1Oydr7MDUAD96
m8Q7naApq8TGWu5Hm2I91vqzMfrOrdy0rHZ9dtPoynr6rHt85SKJnUh1nUGf6cOwBdthP+7pbt7m
Yh5QHmaj1a2T84fr+2NPyfhnsJvK/0JSYvbN271UbG/5W7MfPUjp8TAn37490RCSr5vEFYybcWlv
50pZ0ktqTExZlrm1qHN9P57H4+HrWkaLfL24Td/WqVdnb7N0UwN8MKcuOR2LEnrURMIu8m61dk9n
Z1MAAIAwDgAAAAAAt5G7CmYAAABQInEjEuXo5O7l5+jq5ern7eXn5vPt7R6lUKKFJkVL9kvnTnt6
n1PpXcP4+DzlEMqDj55FR8Vsnfa5Xjd1WzuXct/uz66r17aPbmaFyip/9uNzDY3deGVlqQc7CqON
SkZsJ3O48i3/uMcvenblxYCOeu27ebjTqR4kZ5FolfH1WaIv18NUj3kcP7mhwToZH9srfvg6adeX
eT3C5jReJD/d1V/+ctOjYK2ZY7nVsa6OxDCfP8ttzTBWpVumC/ezWqO+7Bq3PlynEluLphl7uHae
nxddtby4nuaBdhLn2004+t0QqchQljdqw0bTTO+tZfRT3BsxqWHxW2vBdFUedUhlXSGiJevJe7je
Tud9+3ycdb12GTqrLK8KYy16p3rf3x6cxM3O+W3zvnevmabp/gXfo/6rpqDLps/Jkmmh51VRl9G/
CWsn2TJf9PJ+WuJU9Hva9UioqQdjOH1M1lccWvJba6Xn18FnTNi60WzV9flxZI/PNYRJeBBdt2ps
1EcPamktu3/ermpsPr3nX4+U2SyS9G7mSv/Tm37NhVSbm/4vtEyxjKtLyr6lR3vPxPO3MkJ0WRNy
Tskrlztb2rWaDQlXDxtf49lJnDZT9/+1lWhz1evFX2k3TZO5dxzXNZtrOlzSD1MWHqUIqBpEkNAu
WkGJrf2+Mf78QrZ78FDN6oNO69frl1p493TuzCn1W5y9tfN43673i+vEvrwVCZNbYrq3Iq03dfHt
s769lyO7lohqTavN6c1g/ON/dvtX7PF1TOZr3ENLv54+v33d1kk3jAq2NoJh2XjI9OpBMiW8WHX9
ujOin/22SY5x5af00EE+T+va6OTYPnFpwfKJ+aT2Qm3jr6tc5mjK5dZ1zXux29yTc9+y4/MpMxqt
xyOX5x5tPng9izsTtZOgC/sti047dKub5wdMXCJG97gxqEwqpvg12mfJ9ToxjaULHqVwpCwpBi0v
kurZul1uTvthdAf39pt4e+nXq9Bf8x5e/nm4yaZbzoZ7s7EHZ+7qRO/Eu2vx9fV0S/qePbOHibJW
L26POd+nkal1Na6Eh2XMyZaidnoJCUln9Ptk92Ip/UfDt9Ju2D29m981LBOLsXQzL1nEVr1+WEaH
o6OZOqd17qS7O8hFhvT5nidivxRPr9eG42Ydn1c2W9eTZ45cHjI8HtvacBnBTM8XMatSLW33WvtX
4tSmFoazxDbddxrGsTNP86dKHcnLqHndMNZYhUTbw/gnz3wz//ft3PXyy/64BawcJ0eSKJEl1vZz
AR6FUKLekDrI5efuXjelQ/X76fa4UF+3qj24d/3mzbn5ngZej0nxVubztrUvjjHsU3ef0thykO87
wwb35jBHh53RidtOja5L9tG5QjdBcxobspKd1npU6+o5kRj+SnKphx569fmYxF5ThimDDxmHtlw+
GTKHcyfK8xM/u5VzLfma8Xs0k5Vaz0MGazzSwyIfNyuEshqW73EPU53a5t0ytym5TaEcoxbOlnnA
HGw8NsmpPL5lGWQcTtwzjEXmFc48Lj/tJBqfu/zBkTtnpNRm9fQTuSN9a9F+HySieUUql9rnVdZ4
bQkepUhxC4DmSd0tv0TV04VzTx5bjKm7y90PoDcdA+TPvb2NEv+bnzho62428jK/pRHiZitU5p/N
omZwJNK93/X39b/exYa37kk8lnrmfvidMfoD99722lljF9XhcVLi6oVxv0O4mRYbbaSu/+Zq/B3G
hrZbfJ7OivV7ypNRg/VDs5OaMUbPmTL/bk/kpvPd2HVfqXzN88uTp6dI79T9QtifnzPEbppxbfty
InP02tN/3fexIabMxmi/fAvmm59yDdZITknSvWRr6NLeMl5K9PC6HFqD+cEk0SXHqYZmrWr+Io4Z
TY7vtQMehUhwnQRaEsjcq2/OMsbe03FHPeeGR5S7d+0mOJNPuvabsW0v571cSU/pP914O7C4+f75
J68ayXlaPVWIieo3c42Y9RLXGQ6fujXb6HXri5PJxQMXpf24HMn9bTDvlGX52laSYX8bXNLT6i2c
KrdNGJtJsxjpZhuMjNfm/XyOBqG2tzjc421pp2mZ/p55jzcbDbq5QmzzoT13ybAv9tC+tKfTfGhy
2Ly7aa98fDrUSS//NLlq6MphmM9PtqezWh+deJEo46slt9ueX69R8mtb/G298uFhbafO4q7nZpwl
9R792RgfW7IAHpVw0ApOKdWsya9Vxy0Xbr7HguOKVbZXebv6auTO/SLxfb1v71+W+RS5f/dqvpf9
+zXAnI5F2TCobu3Vcf4mprmWGBa7QyOUZVtd9rEDp0V9/bbc64l9JY/jlvmyvZvPX57WT+vW1ej5
kvFBMo6Tc8HS8TfMhoSSnHaMV2+vTWSKIcnUdhk9SBqdlPOaQLJWSTwwl/crl2wG8fDUMeyR5bPh
z5nG9inSLixBvpys40drO1W4iM9ln/zcZvdFE4rOuJWA98sP36x6ZeNE/Q42d06fWXf5cvV2Hq4f
Mx4PbQT7nMouHdXAKq4JHnUwqB0BWpTVsM1vDry+L0+HKu86GRkKahEnDU1/jwtOj4wXp88JmVjL
uO35IeOl1d25Txd+F9dZsMbriZEjzV6nDW+aydnacdLneAfGzXWzyxz+jV/nmydhH0+PIjMXkxqb
OrFY95FpRKUZG4ObTrPTL5JSxvu4PUfMx2l9vzoscykp98quUWsJ/dOYhaYY7GIfj8Z3ic9mbow1
32axrskteBi+Bk3/SFW3C5MEGtZVes3JQcMhrtuYhZjtzxgc7wu1sS6aX2HQeqSTp++39G1zd60e
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
5HYqVfIr5FuN8iWtOFrvkP7vkV8i5r5CtacLXfI/jfIb4Iq57n1rTiRFzBmxSkn0E29GXplNemb0
zZyvTN6ZTXpm9M2cr0zemU16ZvTNnK9M3plNemb0zZyvTN6Zt69HXpT/7v9N/3pm9Mpr0zembOV6
ZvTKa9M3pmzlemb0ymvTN6Zs5Xpm9Mpr0zembOV6ZvTKa9M3pmzlemb0ymvTN6Zs5Xpm9Mpr0zem
U5vP950vMl5+vP94fnm83TGAkxMuCmclcTDr8Hyj2h85Je9JsvBmR2cCQZFZjFjGgjDEQ4yBjEmi
nCExhmUocx4OOhs3AhtAVITlYDMgdXYB6YSSBIQs8AGQMw+TNiG3Dz4IBGYFB+vBDJVBtSM73AiY
ZMFCt4GvDy4fMV4OvCxM7oTI00Hf9uHNRjva4WWjtB3+6e+b+ggw6Ktrs+hSsBujuNPv/ei2huj/
f3d7cr2hHdgenn/7ZM2EXoWEkx7o/1DrP7A7ub+sRre7t93Uu/vSt9vu2nvYnJ78tkpI719Z9zdY
n90G63t93dY3fYH7jGl27P2hyR9iRi3t2jLV1jWN6fHvb4pHWX+37fqpvanuP9ukzf3UUr/+O/6G
7o5dFLozuF0ZNZNIrehiT6CRebL0nqgICBrqnV6TvSd6TvSdnS9J3pO9J3pOzpek70nek70nZ0vS
d6TvSd6Ts6Xoy9H3pO9J2dL0nek70nek7Ol6TvSd6TvSdnS9J3pO9J3pOzpek70nek70nZ0vSd6T
vSd6Ts6XpO9J3pO9J2dL0nek7yTeSbOkT71nU09k1s6GTfV2dDyn67OkBWs5Z0d2bz2dDD68tnSp
+t6zpW889Z0eefes6V1vV2dHnnq7Ojz0l6L0VU0bG9L70/DoduQftBplK5zoLXM5Dv6y2Sy2/Y7W
N/WJy+XvpEoc24qjRb5gb+31NE6yNYEYNv7Eal8g43lTa4akH2QRxuZvh0f7H3xpmodvrP2+Kqfe
un39FB6QPawhrwBRSYMZj6P2JiMkuX+3bmZczbmeI/c6SoPiLoCBhwp9BIQNdUBAQNdU+jEaR6rT
SMYRFQMn3xCCorOUkzAuAkUCh+RlE5wb/5NzJVPrEsjWCkcRmH1RnWX58vA1GinuE57J3bsHutZT
a6Rj6AAvYRQMHwE/1iN/NDlNGPxaBognyTSYiZsLmi1L47X4uCgO+33aGSGCcJCmqS89VQwA5KtD
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
sUIYsULOEMWKEMWKFnCGLFCGLFCzhDFihDFihZwhixQhixQs4QxYoQxYoWcIYsUIYitVnCqQrilC
Fw8kSFnCFw8AlbkK4cenFxJuStyFuIdxWuMtxhuQ+972zMzMzb3ve972zMzMzb3ve972zM3LQECC
DD173hzVRaMd6N/oDql9izNGOm39NCPDQw89ADC4f/+3czdzf////7dzN3N/////t3M3c3////+3
czdzf////7dzN3N/////t3M3c3////+3czdzf////7dzN3N/////t3M3c3//g4zLFwxkDGDmNHRK
TrgOOzDeMiO8Bdze3HN7cwYN73vBgc3txze3MGDe97wYHN7cc3tzBg3ve8GBze3HN7cwYN73vBgc
3txze3MGDe97wYHN7cc3tzBg3ve8GBze3HN7cwYN73vBgc3txze3MGDe97wYHN7cc3twWmIgwWBm
63N7cc3twHkOZSePUCmRze3HN7cPYhACO4CAG5vbjm9ubWZxkzki53N7cc3tzFNQQ8ldKZBze3HN
7cwYN73vBgc3txze3MGDe97wYHN7cc3tzBg3ve8GAo8fCiVepLBg3ve8GDyBEwBV8SwYN73vBgBT
dWoQvXeDBve94MBKtsRHVBdwYN73vBgKPAZzIT25gwb3veDA5vbjm9oLYNkF1VRQd7qwb3AXxEC+
sPDMG9wq3vHJ4yAHtbiwEgY9vYp299GO973GPb33b30Y73vcY9vfdvfRjve9xj299299GO973GPb
33b30Y73tox7e+7e+jHv/4x7e+7e+jH//4x7e+7e+jH//4x7e+7e+jH//4x7e+7e+jH//4x7e+7e
+jH//4x7e+7e+jH//4x7e+7cEmMf//jrgrcyJCsxLXv//Wxwizqu0NRj//Yow/HZ1qTw6bl/4sWP
h0ffBZ2GLrQ7Dp07BdFiztPqsosX4qtztpy07EqxixeO3y0xYv0CxZ06dp2egWLO3yiqLF+gWLoq
w7TFi/XY1FWCxfoFizt8q99QsWrXy0xYv0CxZ24ztMWL9AsWdp06cF+gXTt8tMWL9VMVj5bgBgFw
oRhMRAtzz/n+LQgCu7RucWeJTIlOnt0y+hOnAvC76/7fvhO0Potvldvw/f5NIDsHaLFmLHYLFiAB
YsdgsWLFjsFixYsdgsWLFjsFixYsdgsWLFjsFixYsdgsWLFjsFixYsdgsWLFjsFixYsdgsWLFjsF
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
HR0dHRe50dHR0dHR0dF7nR0dHR0dHR0JVBalUFqgQmVI3R0EoCujo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Og9Pbo6M4e
/R0Hpo6OjoVB3R0bNHR0avzo6DWNvo6MOcHR0aR6OjG9HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0d
HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR9B6M9juh9uX6BwPz0d
APYCq76OhVWqp5UhdHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0F0ct
D0dHR0dDuDofo6PP4r0dHBdHRXZ0dHR0YNumTo56P/o6OjoOHP9HR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dFD/3GzNv3ZXOfvR0dGwjA6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo
6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Dxy
s51dHR0dHR0dHR0dHR0fWIzPHR0dHR0dHR0dHR0dAmV7GD0dHR0dHR0dHR0dHQY6gWNDLdHR0dHR
0dHR0dHR0ew9HR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0d
HR0Zjo6AYPo6Mb0dHR0dHR0dBj6ejYd32DM9HR0dHR0dHRu8ugz81tYzo6Ojo6Ojo6M/0dH/59Hj
0dHR0dHR0dGB6OgxOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj46OjO9HR0dHR0dHR0dHR0c/2XMH66JOjo6
Ojo6Ojo8Oj3MFUh9HQe3R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dH
R0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dED0dHR0dA9AegGlnQzop0
dHR0dHQ78/fiPhx0dHR0Zq9/So0BDwx14H3Q7S+ui66n30KCH9dP6S0Uh11111brrt11113fp/XT
+sF+n9dP6J/XXXXXXXXXVunXfXXXRP66f9Ke1RzDhdfr+kNqChWDQH941XeX+BUZDLKX1046Qzeh
kLX8IdsECBAgQIECBAgQIECBAgQIECBAjgQYhnFiV8aEARBNERZY11xHh8/LeNZCL8hO+jWIm/hu
EK69D6psECEBAjt/fbxCAjGRDzUxvA/Al99pGHGOnuuu++34+4zqfq1PpCFIpFIxwAvVV8WPVVf6
fP77s3fNTwJeF/l2+helEe4fa0IKCHs+vwRNsYnGOn+nBe63K/l6iI8PBjD8fCZmaQhSKRSEOFEF
VAL1fC/rvCl4H+fnL8GOjyZjTp+j5LZjWENtvj4oePjMzNIQpFIpCHCngBRSi1H+8Z5+v15Bxj3h
9D9fZ8PJ0/4n4/dzpDg334Y/vCl+qvHnzu2aKDzfy8jb4+UzM0hCkUikIKcPUUZuqiX2/C678qAI
x067JZKOImwN1vkyf0lwlrCF/Hxe48fGZmkIUikUhDhRDhRDvGu+0Il/feFw8j4LvAT5dOXmbe8Y
8fF/j4zM0hCkUikIU7IN9vfHD1vjHQ4lx1gxiOkssMTjXaHh4oa/CZlCkIUikUhD3V6fQfcQIEII
xGYehCAgQgIQEPsgIECBGNCBCCIfgQECIQwYw46S6QhSKRSENGp4jRrcmh1g6QuHGnT/r8S8F5wY
CwiBAjISGQgYOn9dddddfGYcwCBBKP6EF0+gUB/XXT6QhSKRSEPGgYBD9Wnp/QjAIECMCGHBjWDG
PjGvHG/nHTSH1WkCHXdQEICBAgQIEICBCAgQIECBCAgQgIECBAgQgIEICBAgQIEICBCCqggLOHhu
hYQQb3QbsQENEbdqAgQgIECBAgQgIEICBAgQIEICBCAgQIECBCAgQgIECAiBCAgQgpYQIECENmSE
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
kjpVBKoZ2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmz
Zs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNmzZs2bNm
zZs2bNmzZs2bNmzZ19fV1dXX19XX19XV1dfX1dfX1dXV19fV19fV1dXX19XX19XV1dfX1dfX1dXV
19fV19fV1dXX19XX19XV1dfX1KCBQDdXV+ZbN4s11QEoIFBAoIFBAqATYlOA8jAqqBFBAoIFBAoI
DxxeOOc9cIoBlQeoIFBAoIFBAc/9wcKoONs0ThUECggUECggPXDTZFeOBPRQQKCBQQKCA+8UoCFQ
jnMVjlBAoIFBAoIM3BsHkfJrmyfSggUECggUEGV/VAge6QJG+oIFBAoIFBBgU9OxQQKCBQQKCAmt
XKCBQQKCBQQQsJQQKCBQQKCArolBAoIFBAoIG3C1QQKCBQQKCCyIdQQKCBQQKCCCUECggUECggF0
6ggUECggUEFyuoIFBAoIFBA2LlTEoIFBAoIFBBVQQKCBQQKCBcuahQQKCBQQKCBNRQQKCBQQKCAU
xJCggUECggUEBLOrD5hQQKCBQQf3mo7VIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlId1q
P9SDdXV19fUpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIcpDlIc
pDlId1HFfHVaoasfwk4EzCwn/vy+ayWYwi4yMT4BM7GGDpAdmQz2T0YQTGxycyjYMOmeOTMfmU4x
RkmFpc2MavZiTny+7LZCXwxeKd2GSS7NZM5TGn9zENdt+YCu7b8f3j84PA4sxDC88Blcoc+R0lJj
cb7LmcNWTGBiuwnYyL2oiLWAuFgE92G6k44pfljxcLGMEhAxA04fLkUQsElwrCuC9qRokXAmhwgc
rBte4baxFyNi/b9K7i4bze1I3KNwusXCLhTVgKyHHr5ZRvx8Ub1dXV1dSdnVauKhFAtzFp6KgU11
AIcJ8tpC4A5Q/8UKxc2y4JtzLyemeZlFAGsI4zkvYRzHNYTrqCN81e6foWssyocOY+d/fHPyO3PR
pyRymBHVfd933Cw3fPq6urq6urqcrerq6OMZydm2MFmM8WOxepYYd2cqgA4WQmLZ8wz2kQXQ0GFx
+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
oV+flUKqhX5+VQqqFfn5VCqoV+flUKqhX5+VQqqFfn5VCqoV+ftUOqiU8DpVEqoj/FQKqJVRHlM4
qJVRKqFvtUP+hv7qnB9ZTfvymU37txvm+b5v7t2/KZTfvymU37txvm+b5v7t2/KZTfvymU37txvm
+bqgA3bt+Uym/flMp8b5lAAoAFAAoAMrk9uUyk3xlMpTL71AAoAFAAZ2755yn0EyAhNXkLWtbzya
oQmqaoQmrzy1rW88mqEJqmqEJq88ta1vPJqhCapqhCavPLWtbzyaoQmqaoQmrzy1rW88mqEJqmqE
Jq88ta1vPJqhCapqhCavPLWtbzyaoQmqaoQmrzy1rW88mqEJqmqEJq88ta1vPJqhCapqhCavPLW5
c3lQQee0Bwf3znONyo0VA6hgwfz8qjRUabuON27jjcqNFRp8/Pz8qjRUabuON27jjcqNFRp8/Pz8
qjRUabuON27jjcqNFRp8/Pz8qjRUabuON27jjcqNFRp8/Pz8qjRUabuON27jjcqNFRp8/Pz8qjRU
abuON27jjcqNFRp8/Pz8qjRUabuON27jjcqNFRp8/Pz8qjRUabuON27jjcqNFRp8/Pz8qjRUabuO
N27jjcqNFRoZagkUEyhSVGio03ccbt3HG5UaKjRQCGMoAFAMqNFRpu443buONyo0VGigpUDCgiUA
6o0VGm7jjdu443KjRUaKBI0FAgaCo0VGm7jjdu443KjRUaKCBQnGT2dnUwAB///////////0KgAl
xQIAAFFA1KkR//////////////////////+3yqNFRpu443buONyo0VGnz8/PyqNFRpu443buONyo
0VGnz8/PyqNFRpu443buONyo0VGnz8/PyqNFRp9ccZ/JccZNUaKjT5+fn5VGio0y2A4/8jhMTmlR
oqNPn5+flUaKjTK4TjI5AxdJwKjRUafPz8/Ko0VGmS44zeV44/1RoqNPn5+flUaKjTL8cZrdxxuV
Gio0+fn5+VRoqNN3HG7dxxuVESo0+chmcyqEFQhu443buONyoQVC2XxfzmFQeqFt3HG7dxxuVD6o
Qw2UyvJr7t3HG7dxxuNc1+eeeTXNfdxxu3ccbjXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxxu
Nc1+eeeTXNfdxxu3ccbjXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxxuNc1+eeeTXNfdxxu3cc
bjXNfnnnk1zX3ccbt3HG41zX5555Nc193HG7dxxuNc1+eeeTXNfdxxu3ccbjXNfnnnk1zX3ccbt3
HG41zX5555Nc193HG7dxJvNc1+eeeTaNmknE/xJrypsmxzzzybJsb+PH6//MG02jZ552/lG9+YOe
tMcaTu4MzugnEi3CYB6fta9B4qFWdc/NZzMxT1rvxVqlUqlUqlUqlUqnUqlUqlUqlUqlUqlUqlUq
l5qK1NfIWQtlQyRSffVxQVm0+l/7cheFGZ4UXbt9Ml7N9C00HzoFP+Oci5DqHx9bqLfbv+fjfv3/
Hx9b8KyWiUTiChQoVIr51ChXjQPpWuZv/Kl5xvq8mUUjz/P/9+fv6+fJ/xqVzF/87vnx9/NFotvz
VUWi8YFChQoUKFduMxViofdb+q/Vwx/5tqP2ixQpF4wKFChQoV9eQoVQqR4UTfmPcHjR4uGc/r57
dR7+Hmqt8ttPn4x5UKsbG693h50YUi+BH6i0XjAoUKFChQoUedsw16t13+zPwkuWsZXtlqkbX55q
tQFItFovGBQoUKFChQrq84r8KIg8HSLRaLFYwKFChX+S9XFCq/9PnA+6LRaJRaWKFChVxQUewHAA
8888ccA555u0AAMAAAGMZAoUKFChQRTMDEg8Fsg+nPz8rC1PE1vn5vTfIhVxQoUKYj+BQpRTjhRR
TjlbcKqmZMs5CTAhMCE4BTgFOAU4BTAhMCEwITAhOAU4BTgFOAUwITAhMCEwITgFOAU4BTgFMCEw
ITAhMCE4BTgFOAU4BTAhMCEwIyVmdOAc35npmUskZKzJmnMuacpZQylkXMWaE4BzpltMCEwITAhO
AU4BTgFOAUwITAhMCEwITgFOAU4BTgFMCEwITAhMCE4BTgFOAU4BTAhMCEwITAhOAU4BTgNOAUwI
TAlMB8vZ+z5ntOAkwEy3SftH6fasVAzcTPTYCu4jvpw5cTPfSFLKdrtV9o/ufL2cg88gZP5a1ref
qh6KbSKRSKRSKRSKRSKRSKRSKRSKRSKRSKRSKRSPZXR60nIuR6P45OplB8FKHSKZkSn66TkPxpin
nR6JRvLKNHolC8KJ7UPIdCpeSck+VD/N9IbsoVDoVBoFBoVDolA8MKE9vh+LipIoUKFCuvrWKFet
D+9GYM6/1T9I3Vg3Tq1M9P6oVH5/P359X/OvRmX+Du+/Sh+so+/1VhSPxgUKFChQoUKPM1aqf7XP
vMdaWj9zjUv4UjxQrGBQoUKFCvv0FCqHSvCj78z7w8K+TOf43VrUDx89K/00n+fjf0olZ2N8Pny9
qWjxXAj/FCsYFChQoUKFCr56zHmKvV+oZqfmFdxVSz7V6kKFChWMChQoUKFChSAoUKR+MChQoVUY
21oUKzD+ChRCn4qAoUKFQKO7WtYxjAtC1jGQ1rWtC1rWtOEBQoUKFChUvIUdY369fAsO7sGvXVNp
iiFChQporkUKW55555WWADQKpmT04HvfM6cOpw6mCSYJJgkmCScOpw6nDqcOpgkmCSYJJgknDqcO
pw6nDqYJJgkmCSYJJw6nDqcOpw6mCSYJJgkmCScOpw6nDueMpJgllzKeZ04CztnjJ+VcoZVTgJOA
U4Dzlk3KqYJJgGnBqcOpw6nDqYJJgkmCSYJJw6nDqcOpw6mCSYJJgkmCScOpw6nDqcOpgkmCSYJJ
gknDqcOpw6nDqYJJgkmCqYJJw6nD6cPJwmmCCYHJgYmCqcNpwdmL3n0OtUN6P3WZpgfm2bWqJlBd
lv7mMv5ecuHzhmdH9ozGPx9clj8fz6fGBx+Px+tUMYXK6zC2c4/k1czj8efAcfj9hr/Bgh/sfjzA
8cf7bvHHnQqHzkPQ5PTKqgw5cfjzsOeqhezIMfj1AEa2Fwnu6hexWdzuPx+Px+Px+Px/llVRhlcf
j8fj8fj8fivbT94bH4/H4/H4/H6zC2c4/0x+Px+Px5ha/b+wOPx+Px+Px+PwGGOPJ4/H4/H4/H4/
H+WVVGGVx+Px+Px+Px+Fwn7kcf64/H0x+Px+FNDwUFqgzMno0iYWPx/Rj9EmC5yGGIcUPRj9P6oL
cMY+L/TKyJwGHjTHMcx1AcoEcznzHMc+jHwKoEr4Ynz82noYph/2YPA7FQPtMMw1QOfRhmHlzk+/
n/Ok5TDMPJKgIwzDOdUDZMyTAPrBGFn80Yuv4odqgMxWZVAx0Zr2CHTiegPRHAf8wccdB4bv47eh
gY8FAEcmBOg2jaOg6Dag6DlVAZseWB0xB9HBgjoOjabWQiPLo0aTO0HHtMk6DoOPYdA+/578G4fm
dOjATHQdFh0HCqDsOoCPPziDoOg5/zlxWSeBlYA6DoOg6MHgP3UYmIP8/zoOg6DoPBUTKCdQHYvz
jadB0ZrMhrEaZcYYR0HQdB0FA4UyDYPFUGHQdB0HRB/ml5yjckHQdH4dGNn6dfpxilAUdB0HQdB+
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
RnvpF8cajm2483zSxzeqafpx2Ox+P6QLvL3y6oNzxumIaRungqDzG1qhBUAmNjDdNI7FRifprGMZ
YcH0GQaGMMHGAySoXPYyzBUAW86j2NY0jUxmTOo9snjFASaxunsqJTqUAWMHiqBBWxO9tlw2NSxe
z0JrlvVy9F6IgDZXEqAFQA3LcpZnPERXLcqgBUAKgGkra/45UUASgBUANy3KWZ/yIrluVQAqAEwq
rjGkPkJum6axpdH5rwRjKAJQBGVv34fGGyayohO8/VQvjDWMZQBHsXQexm+hyqAI6s8qH1QvjDGN
3OZjJ4w1jIMHAa8V9YzGGWbv5kAhNA0DSNLLhOP8Nk3fJUBY7WE0FAEoAjBVAWtQZ5cyzZ/s0e2s
0jWUASgCy6oN36zGMFQBG6qBjqzx2GCbOMMbWqAT2UARrGyY2s49+80jdNZQHKgE9iy6gCMYzTN9
D2/F1ypXuG9PCW4G5M6Oh4uG9nkjFB5x/2axq4/nnH4/nnHncfyoCx8/OPx+Px+Px+Px+Px+Px+P
x+PwJpFj/Y1MfjzUNTHn8f2Yx5qGpj8eahqY/HmoamPx5qGpj8eahqY/Hmm+PuVLcKIRUkXJCLkt
TIi9U4NrOHAoA1AGcBwKANQBnAcCgDsWqAM4DgkvakDgOD8FFydBq+KJPw4DgvakL2pA4DgvakDV
w2n+z30oGzevakDgOC9qQvakDgOC9qQQw8bkbh2AvakDgODO3tSBwHBe1II1GTcmaMLpg4DgymUO
A4MpjTUYce49WY/KHAcGUyhwHBlOTlE7PnhEZQ4DgymUOA4Mol44Bkcn05c4DgymSOA4JVgghQW4
eyxBElJQWKC10KC5QXElIkpKC1QXXIhQWqC4kpElJQWqC1KoLFBcSUiSkoLVBaSgtUFpJSJKSgtU
FjMXh8eSLS6Yi5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLkuSIuS5Ii5LkiLku
SIuS5Ii5LkiLkuSIuS5Ii5DEWHSbhuKij9Nw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3t
Nw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3O3tNw3N2cNw3DyMM3Dc
/cIbhuZryNw3GdBuG5/cG4bnzlTcNw0jXNw3M0RuG5/9puG529puG529puG529puG529puG529pu
G529puG529puG529puG529puG529puG529puG529puG529puG529puG529puG529puG52ioAlAP9
7lAOoBgYZQDqAbXwoCFAPjGKAPop29GED/xH//x29tKUp29sf//Ef//Hb20pSnb2x//8R//8dvbS
lB56Y///t7f//6b4yAiIvA///S/v//k2X8IjTpmj/2v5dvb5RERERHl29vl5dvb5RERERHl29vl5
dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERERHl2
9vl5dvb5RERERHl29vl5dvb5RERERHl29vl5dvb5RERrxX7mFn19E/1+duXzJs+fb25fL9v5+dvb
+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29v
b25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+dvb+fnbl8v29vb25fL9v5+d
vb+fnbl8v29vb25fL9v5+dvb+fnbl8ucRzZvOZfL9v5+dvb+fnbl8vmmnpqy+X7fz87e38/O3L5c
2SMb2y+X7fz87e38/O3L5fCZnOGZl8v2/n529v5+duXy+81dvbl8v2/n529v5+duXy/b29vbl8v2
/n529v5+duXy/b29vbl8v2/n529v5+duXy/b29vbl8u38/Nv1+fnzl8v29vb25fLs5/P7a2fdl8v
29vb25fL5fZ+TfUvyHL5ft7e3ty+X3/n5lf78/Mrl8v29vb25fL/P5+cdv5+duXy/b29vbl8v2/n
529v5+dv1l+2O3tIu38/O3t/PztKZZ56t5Tdv5+dvb+fnb8llejwjEfPb+fnb2/n524jERERiMR2
/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjE
dv5+dvb+fnbiMRERGIxHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGI
xHb+fnb2/n524jERERiMR2/n529v5+duIxEREYjEdv5+dvb+fnbiMRERGIxHb+fnb2/n7GHxEREY
jETfn49n78bcRh4iIxGIj8+AzbvldiMREbltPlrBjBY1bGFuQKYzOOk8dRY6yx0sx2TjoPHdnRrK
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
Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dmb353KYcW9nZ2dmG+
m4/CZHyb2dnZ2as/TNZowteQ7Ozs7AZLmr47ok7Ozs7OdbcqPJh53s7Ozsrnf4Ek2e7Ozs7MD0bp
AhxWc7Ozs7P//17GfPZ2dnZg+zs7Oy6SOzs7OzrSFl3bau7Ozs7E9j3zeezs7Oy6su37Ozs7LLkT
dvZ2dnZ13wmu+zs7Oy3t7Ozs7E9nZ1MAAf//////////9CoAJccCAACeHVHgEf//////////////
////////t7Ozs7LC7I7Ozs7BvxZ3J+zs7Ozs7bzeX7Ozs7Ejs7Ozsvi83sjs7Ozse28l4bOzs7Pr
wz/Z2dnZ2dnZ2dnZ2dnZ2dnZ2eGzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsOPoUHxgavMe
jGbujww3oV8f2Z20yeg7vD7wf3+5nfvHTibPTzvEnpt+/R8EHFfsSPuyhY8wteGmzeSMb7lw5dno
+Aam3dFOjI4jorXspk8DTU+U8/34e6p7WlgW/BwcmADCyfXbZ2WpM2Kwd47OxJ7Oy823i5Em8dnZ
XseLq8FcnZ2dkJF12dnZ2IXOsvZ3Z2dnY9503lJ6014SUWdkW36muZC7s779dOk3i5EXNYkXxZeU
iIe0odIuSyyEJF3F7UeuSbkuFc97MRHbCS664F97KTl12WOUflWBuujoSeu83sUbmG8dhjPPUPON
8uy8WPebkXXd7Fey0km4OEkhpMt601iF15u5bPL5ys2bxT9H9247AReXWJC5xIoxUJGbzONwnucK
wbYXZxvzgM2YXR0bMB0XjomxWLzXglykU/i9g5Yd3XJxwgUjsSbgtQX6L7HmuRFyWveyKsnx+Lf4
pKC8W9FEevR+ZrsDXYV7NvZEdnaswZh5N0hPrrjd/zHv/eXtpxXxmMGH/9wbvTofoQ6IjYnZvru1
WyfWjfvzNd6z6+zI143IyFeYSXuNKuvY3HOFypIjrurgYYOU98lNmMragV0mUd5yunjCeddVJ8m4
tK7K1M+TzGTkYHHeN6XXFFlyXs5CZFiy1Fia8R2dYRvak095sQ6e6svYz3B2WwkddlrukP3J2i9L
u0RnG9loexCRAehHZat9ez3LSHBcoTNvMItsvYbEcakti0hlqwVw9f9lMBnTg7P/o6NiR2XjAaLf
XHLHBW2y77uuhCL9FXOHKxmsBl+O3kfnA57wyHp0devsZtObxrSMsDo9QZOPnG5VGA0I+FqTzT6y
/1iUdiftS9iNmicyc3jtOZxfrSnRebg7PrFYjN3sD6u79suSLE73A3J5A4074EuimE5wGEw+C24L
KyMxGfxPJZbV0F0WXBXbiKOn8MFmOSeF5efj0avDJI6LzezL2bFtwXiL2ojBfmGK82Xca/jo8/O5
KrEh01+WXsDou78+ObapNPXnfXFXdiLkyXHjhI8Pm1+it1bYN4vD9l7UTeU95T3m8otvCUkhJogY
dNezLuCTukXJ2XhPexbktcUX7FQ1qJLxoN4WRewOtAprgrRdF7GvI2PRtK3B223T3i8WLI7LzBPc
yRbC9F8lciQk3Q1pYVLCu5+guh+igRmdaN7GJxq3ocWLoS3s6KVWjYVg9Gbx14uRF1cl4uG3sWWd
d5vYCCdKncrtIo4kyxIdaL2FD2FaBrkNyXAQK2rHZ0JRbdCixJh0vR4mpldx3Ys4Tq8fShxf5pGK
e1FAz0GAUh1+5/Yw5fQ5P/HbDe0ajaMETuwJyHteLEyZF4vCa5HSLLwstSUh7yN7MvKHSb5SbLic
bEsXmwSqAFeyyy2l3bftasFxaV66DLwOBMsfno6Oj5HoOs8vLFnXi/I8s6xvZjj69ja+PjCsxpiK
hA2jn0m9jeg7cgcZnHQdurIYnjJ//v+KAb5H49ujbiTE0nQYpn407/g59JvHdl5Do5OLF/Rxe3FD
ixuX+sGZG3oMEf5zWyHq52/2qhgKgn69zO6Og0R6DrPLyxagGyGNMI65/E/WHt+dHRk/eaAjhNLc
X443DQI4j/ZNlktLgvhF7Uki4oiOhaUXIQ0cq9dqHsdckLeANrS5GRC5ysQn64GtLnXXgbi7buzo
6K/nQPh0ZM4xMTFKA/LfMY3h+d/Z2ZgcyZe6p7nWc2M009/I6sBgTLH56Og68X5Hljj69vj4No3t
Jz43oOPIHbk+P9QDfnuYp0aTPxvwd+LOLn6OKnHtt6DBf+F/XIHbTV/fSoJMD36DOE0ejoOvF+R5
KAbIY2c6zCYfvieygB7EN6Gcpezs7OxL2dnZ2Jezs7OxL2dnZ2Jezs7OxL2dnZ2JY7OzsS9nZ2di
Xs7OzsS9nZ2diUo7OxL2dnZ2JX7C7EvZ2dliXs7OzsSsbbRKXZbRL2L+x0uVHZp0/XQOJ3IM4O3C
eYPvV0GXgej5HoOs8vLFtZnezCsVCBiY02jO1HadGJyB9Y2uO9KmEYWCnfA4s9DoyfRLz2H8uYUL
unT2dnXW+Ozs7Ox4R2dnZ2Xrs7B7J+OjsXb5TR8Mwfx3+sv38qhbIHKa+no+cpmjgPybgxDqMDI/
vYoAq0X9lOxbow54azj25Lk6/scbgTyVHJtGcWQMmTGnFnTXobB++mAPY3sWqQftQAc5I/sUqGDR
qYWA6Du5N/6VBBrVOLsaYvZ7GQNIKtU1SsvKLygN4uZyTEP6A5+zsvPYtvN5G89nZmPEPRkeh5sJ
2dl57MdebzeezsxwTBxOeOEejk8sioDJt2d//fLnu5k4sDf7J40wsscXR7/hGQceLzagA88geoFQ
Lizh6Oj1HBmEYhlmUYuCzJ3GtnjiOY5duR6DDNLAKAs3DVwwOg5eQqjTNHH/+5veyoex5jYLXhVQ
pQ+joOL/9vhQDVobWA3dGFNDyM86zyyfRtML89zCwXQa51qh8+JK87vE7p8dkMbi/c2zjxcJbb1e
LgLDfLbb3Wt7Ow1PlnZ2dnZ2dnZ2ZK8N7H0dnZ2dnZ2dnZ2dnZ2dnZ2fPZ7dnHZ2dnZ2dl4vB19n
Z2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2P6dl7Zua9zIa289nZ2dnZ2dnZ2dnZ2dn52dmA3bzC+teQ7Ozs7
Mz95z36DD6Juzs7Oz/+MvLhfDs7Prs7Pidv77ZTs7Ozs7OzsyvtkzDNX3yh7dnZ2dnZ2dnYYpt8n
WaCD67Ozs7Ozs7OxL0HAaers7Oy3s7Np73iOxQI3m83ns7E/Z2Xm83m89nYjs7LzebzeezsvPZ2X
m83m89nYPZ2Xm83m89nYf2Hw/7eSi9rAlMBQCdnZBy9nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dn
Z2dnZ2dnZ2dnZ2Y7FdnYZpkdnYYG3s7MIoBuzs1a+zsl9+zsPc4+zsODD9nYAuzsyPZ2dnZ2dnZ2
dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYMnZhMr2QOG7C3evZ2T15yHYzOj2XJcnZ2XJ2dnZ2X
J2dlyXJ2dlydnZ2dlydnZclydnZcnZ2D2F0dnZ2dkdibs7NmqvZ2cdnY3Su7OzB1k7Njf3suSOi9
XJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2
dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyXuXJcnZ2dnZclyJcgqDPA3n+9HPR2dnBGb2dnZ2dnZ
2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ
2dnZ2dnZ2dnZPmNuR7Ozs7Ozs7OzbKcJ79nZ2dnZ2dnZRnmY3Z2dnZ2dnZ2G2Y5kZns7Ozs7Ozs7
NY9HZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2M7Oyfo7OyvZ2dnZ+eHYzV/yzdnZ2dlPTs2j8A8
Ozs7OynZ2Dp7OynZ2dnYHs7Pvs7Ozs7Ozs7Ozs++yTs7Ozs7Ozsm/fPo7NHZ2dnZ6dmC51XnsVAP
Z2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm
83m89nZ2dnZ2dnZebzebz2dnZ2dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2
dnZ2dl5vN5vPZ2dnZ2dnZ2Xm83m89nZ2dnZ2dnZebzebz2dnZ2di5cXZebzebyu7G9nQzojo7CvN
5vN57FnR0TM2jF8dl5vOjzUqmqOj77/CVEdSx6J6N2bP5Vega3/zLxbV/CFf2/IMYX1ffmEYMGDB
gwYMGDBgwYMGDBgwYMGDBhHIgz5tq+qgvAeRCOELLEwQIMGojXAvDC8BBLhcCKmsM8fH4DuGDBgw
YMGPGDF8ZVD/ef3QdCy/2l/Z6vexGtHtu+HUssHUvf3Kd/p/SYhggQWn9S1IEIaPHw2OlXnbZq5q
lCUVU+W3NR/0/kFDe6ufjECF/u7uzq7cTTsX9Nv4I8/0BCLHNSQ1+mnVZxGndMmS07MZ6hDvvxvL
b84wRjDGDBgxAYMeMGDBgwYMGDBgwYMGDBgxAYMGEglbvshZ7XSBPGDBnKj/ouBgw1Blm3eMeMQG
DEBiWMQGDEEo/hZSkr+1UGDBgwYMGDBgwYMGDBgwYMGDBgwYMGDBgwYMGDBmhcZxypydpvxZvO0x
gBmveMGDBgwYMGDBgwYMGDBgwYMGDBgwYMGDBgwhgwWldARDERO2l/2z6XoZ3x0yeMdukNMciEEl
BKIS8unpRAkvpCTxiMdJdJScZgpEaJQgQa3jjUbqExXnGFNmv44GDBgwYMGDBgwYMGDBgwYMGDBg
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
HLUNYDl1AOsOsOsOvShn0EN0NMPoPsOsOsOsOvW1VAoZaqA3RwwovB1h16/r3jV1YDrDrDrDrQgM
dVAIGmHcqoGDrDrDrDrgOLRwwmSA6w69SDrfrE4nRQ6w6w6w6w+Q4tCDUDTDWDyDuDrDrDrDrZA1
g7NLDC9AdYcetB1667cHA+NaDrDrDrDr11iDS0nXtcD8DrDrDrDrgO5nDCZyMB16sHOHXrJm1q1B
kZdaDrDrDrDrD3DkDZ0rRg3lVAGqB1h1h1h1xAYTORMHRqwdYdYc+r6trnWj6RZDrDrDrDrD/Di0
HSrxoDjDrDrDrDriNPQ9rQcYdYdeOnfwYtwOsOsOsOsO4PkNQNMNcMKA4Q6w6w6w64w/WpB1h1h1
zos40INQPkOIOsOsOsOsPIO4NMNYOzS2QNYOsOsOvX4DCag9Pa8HWHWHXAe17Tg0w7g+Q6w6w6w6
24PYNxpaQwogOsOsOvU3hkYgxWYPIPQPQPRPR/MDLqEXA9A9T2dnUwAB///////////0KgAlywIA
AAziHTgR//////////////////////8D0D0a9W6DAcyCAegegd+uNtlhDPYw7w9Q8A8A8A8FVAFw
PAPAPAPAPAPAPAPB9aDhv3fJBzh0j6VUCKqMdZDt13XddDuVUJa7ruu67ruu67roeyqhQOwPxVQw
qol13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13X
dd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xd
d13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd13Xdd
13XWq8parpiF5kampqamJPSmK3oLfrDU1NTVoybsmjkGHSGpqamrQWrGNJvNGitTU1NWnsejAkNI
ampqarHbDoxskGpqamo1J4s3E0WpqampO/phAXYabU1NTUyUEmpqamoDcQ1NTU1VUNTU1NTtTU1N
WIampqattFqampqW1NTU1U1NTU1NTU1NXuMNTU1NTxDU1NTVEfampqatlqampqqmpqamqq1gOpqa
mppy2HOc5znOc5znOc5/5Oc5znOc5znOc5znOc5znOc59AA8pZgwmzSDctO06/qurN9rTjaJZIBg
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
XIjXNciNc1yI1zXIjXNciNc1yI1zXIjXNciNc1yI1zXIjXNciNc1wMPRNc1xVAMbXNcDbPrmuaUy
65rmmhn65rgbWka5rgZgaWua5Ou65riqAUMrXNcZ41zXIjXNciNc1yI1zXIjXNciNc1yI1zXIjXN
ciNc1yI1zXIjXNciNc1yI1zXIjXNciNc1yI1zXIjXNciteDgDC0oODX8hwa/2gHCHAip15LVoaO2
5ubojVtW1bVohubm5uiNW1bVtWiG5ubm6I1bVtV1btubohubmjVtW1bVohubobm776tq2rah/Lde
5apEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEazrMRrOsxGs6zEaz
rMRrOsxGs6zEaym3XWlhD7Dk1LXmONNQ1ho//TdNhjY4hjY403Tf///TdNhjY4hjY403Tf///TdN
hjY4hjY403Tf///TdNhjY4hjY403Tf///TdNhjY4hjY403Tf///TdNhjY4hjY403Tf///TdNhjY4
hjY403Tf///TdNhjY4hjY403Tf///TdNhjY4hjY403TWzV9L1nTdNhjY4hjY403TWm57Gm6bDGxx
DGxxpumxY1cOjTdNhjY4hjY403TWz+raNpumwxscQxscabprSHEw/03TYY2OIY2ONN03///03TYY
2OIY2ONN03///03TYY2OIY2ONN03///03Te2NjutrGx6hpum///+m6bqWgMbH3oNn2m6b///6bpt
9gYyF7RmVu03Tf///TdN1BjY0rzGx6hpum///+m6akxsd2GNjjTdN///9N02GNjiGNjgMPTf/+GU
GVDGxxDGxwGUGOQxkMoMeGNjiGNjgMQMpqTvapDGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169
DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169
DGxxDGxxevXr0MbHEMbHF69evQxscQxscXr169DGxxDGx3b1682sTF3yY2Xq9dvXmJkS7ZWC9eis
ajub50v853W+d2rLnAoyk+jJnal0ySouIIIIIIIIIIIIIIIIIIIIIIIv9PsP9werr7CxHcX7Us8q
Vk+WkrdW+pRzuHCQrSALzwykEEEEEEkkkZ3KfUx3cAjPV8Y1tlzE5MUVJAVPelB6fnjxFHnUBE/m
JyS+8A07FPkoiMn1b6U636q4J15xDft2oZu4KDK/qVt91OBca6k3dIlsGhuWIzAZ710RPvej//+9
73/x2Pe9Pve9MznW7xtdBZdfdFnyy4uzcmZmZmcyZm8//0pSn///SlKf//9KUp///0pSn///dQgk
9YKQEEklnvLJRUN///0pSn///SlKf//9KUp///0pSn//uNcaI+3mk4X9lnpsH7rfGWZ1fWgqLQ8T
3f+uRX7dJSRIkSJEiRIkSJEiRIkSJEiRIkSJCqTyeXf/m2Sq6rqj8znlbZDmpDyrA+XyVpbIJj31
LPfzOalK5yQAo8akSJC0iRIkSJNeBG+pZHBIya0NcJhLE5uKKkgI1PSh9Pzx2hNGyEn35iZ9pfAN
OxT6BGRk+OVQ3W4iiAtcRhMIZu4SHK/qXF9xuCQY1JuJbBo7l4BPvXT6IiJmZ/H4mZmIiI/EREa2
7W670Ceuu7XuPN3Y/ds+8c5z+97xznP73vHOc/ve8c5z+97xZ0iU1JQJkiVKgNcgTck5Xve8c5z+
97xznP73vHOc/ve8c5z+9NCry75mjYgqhD0716qDWvBgXTBihhkGEMnTdQ0bSQw2Rg0sM9h0bRWR
kiWRkDP0Ni0JkZGTSA7tQ0RjYZYGQgHEH6yMgdOWRkR0vRCDA0sjIx6MGlhlsMgZyqA8PKQy31lV
BEGYyMhgzfKqE2nLIyELGg6C2NwfV63bZGRkZGRkZGTRkGVBkZGRkZGRkZtEjQrTIyMjIyMjJpDD
LAyOyMjIyMjFo+LTGyMjIyMjIyaIxsVtkZGRkZGRkZNGQZUGRkZGRkZGTQdBDTDNZDsjJGrMjJrv
ja5qpDrudEZGTpk0lua0tc1pot6aytB9T0rSbzpEAxtG1tVAP27uqgQVQHBn6s7h2ePr4YLBoKqg
lVQT8OcPAzSGPrIdl1Ixg9Q6zG1DWurv9Z1sxm0PIxtdDyhi1oOxlt6tqeqaGc7UHTqmsB5Bx6ww
sFzvVu/WWONQIBphxh0w4cxAMZl01t1tuDj6DkDjDjDk1cOPXA81UCFwMBi20NtDVA2NODjDj0UO
TUNtDRLCYYTbr5AM4OMONJrDjIMDsPSQdofAcfw+w4w4w/w49ZD8bENG0bbQ20A4w4w4m7KDTo7A
HGHGHGHG22NJi4HgHgHGHGHGHGHKHeGEwe0bbQTDjDj1jWP/6t3Ug4w4w4w4w4dtDQ6IByh8hxhx
hxhx7aGpM+jWttDbQDjDibQ4m4/YYD6h0HGHGHGHGHdraVEND1sOUOMOMOMOMgqgDVUGMGjf20A4
9c1QOPR4RbbaTIHGHGHGHHq+t6XfVQDadqweIcYcYcYce2gHLomjMG2gHHqGvhxhhNthN2EgwBxh
xhxhxh2B86I29sIegc4cYcYcYce2htoaMwH1/UA4w49IZ8NFrTW66HGHGHGHGHnrbaqgQY9G20Nc
DjDjDjDj20NtDRD/1TWw4w47ubKL6CHaQDhPZ2dTAAH///////////QqACXMAgAAm11P3RH/////
/////////////////8OMOMOMOUO6iGl6NtoakHGHGHGHFtobaHbcdtDiDjDj1DoMB0qDu1sOMOMO
MOPWw5SGhqqDGAgqgDDjDjDj1j+2ho2lBsf1gOMOMOPbQDX0RtIByh3BxhxhxhxtQcbCGEw6Ntob
aAcYcYcbdG2hat6UiHQHSHSHS3MvvaaqgqDCtB0h0h0h0ptHwxGDQ00w6Q6Q5dVYrr21UBaqBwMw
MwOYOYOYOYNPQw5g5g5g5g5g5g5g5uLJrVxP3ryPuDUHjpeGVlZcasysrKysrKysudbwnrYczKys
rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKys
rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKys
rKysrKysrKysrKysrKysrKysrKy6ToVlkTDE0fVdJ0nSdJ1jRWZrsXP40nSdJ0nVumdv1zTtGDj0
nSdJ0nU2DRr+u6P1qek6TpOkp6RoWpPpevaTpOk6S3aRoocN3Rr2k6TpOk3bWitGoaJpLbpOk6Tp
LJZDMu9BmaTpOk6SwbyYHpOk6TpIHDbYCGk6TpOkw4l7itJ0nSdJpVk172k6TpOkioJ6TpOk6Tsx
pOk6TpL6TpOk6SqyXjSdJ0nSYA0nSdJ0mlM7bnDSdJ0nSdtAGgdJ0nSdJp1hcYU0nSdJ0kJSEl6T
pOk6TQ9he25pOk6TpNLHOiatpOk6S29KqBlVAyqgZVQMqoGVUDKqBlVAyqgZVQMqoGVUDKqBlVAy
qgZVQMqoGVUDKqAlVAiqgZVQMqoGVUDKqBlVAyqgZVQMqoGVUDKqBlVAyqgZVQMqoGVUDKqBlVAy
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
2rB0h06tqwdIdOrasHSHTq2rB0h06tqwcz6ttx6WQMHHqerh0h06vq4dIdOr6uHSCHTq+rxq+rtG
sy1Z9rbRq+r6vq/rWjBshjadp+NX1fV9XvaTMawHCjq+r6rq+rzochhfZNX1cMEMHV9XDB/rYbGi
sGnMfQYOr6uGCGDq+rhgmDxDT0pAgGDq+rhghg6vq4YLcQDD1fVwwQwdX1fzKrVUBNu2htobaCqg
JVQGqoCVUBbaG2htobaCqgJVQEtVQEqoC20NtDbQ20FVASqgJaqgFVQFtobaG2htoKqAlVASqgJV
QFtobaG2htoKqAlVAVELjRtoFCarJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZ
KrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJVZKrJfcsruGZ07q3dW7q3dW7q3dW7q3dW7q3dW
7q3dW7q3dW7q3dW7q3dN3dh87tHbuyIO7Led07rvoNh3u6M75JO7Et3Vu6t3Vu6t3Vu6t3Vu6t3V
u6t3Vu6t3Vu6t3Vu6t3WOVWS03lWSKyqyeXXarJVZLTyIKsmZy1NTVMqslVkqslVkzLU1NTVMqsl
VkqslVkzLU1NTVMqslVkqJeWpqVtTUTJ9TMz/+4amqCbU1f8TmZIS8NSd5Vkqsm/fVZKrJv31WSq
yb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm/
fVZKrJv31WSqyb99Vkqsm/fVZKrJv31WSqyb99Vkqsm+QTVQB1ubyqhHWmwPi+sMcNtsyrDHDHXf
vq799YY4Y+3Axwx1376u/fWGOGPtwMcMdd++rv31hjhj7cDHDHXfvq799YY4Y+3Axwx1376u/fWG
OGPtwMcMdd++rv31hjhj7cDHDHXfvq799YY4Y+3Axwx1376u/fWGOGPtwMcMdd++rv31hjhj6Tpi
qAvSAxwx1376u/fWGOGPoqOQ6Axwx1376u/fWGOGPqjaHSHmGOGOu/fV376wxwx2vTmRkDHDHXfv
q799YY4Y4cIfxBYY4Y6799XfvrDHDH24GOGOu/fV376wxwx9uBjhjrv31d++sMcMfbgY4Y+b99Nt
v39RDHDH24GOGPev3zXmjVNQDHDH24GOGO0tt9t19punDHDH24GOGPqF+/c1G/fOGOGPtwMcMfVL
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
27JKshVkKshVkQqyAVWQqyCEKshVkcFWQqyP/3arIVZFzfzCrIT90qyFgK1WQqyFWQqyNuKshVkK
shVkbcVZCrIVZCrI24qyFWQqyFWRtxVkKshVkKsjbirIVZCrIVZG3FWQqyFWQqyNuKshVkKshVkb
cVZCrIVZCrIVpsJDVfhkaHqgeCrIVZDQqyGhVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKsh
VkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshV
kKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKsgyQZJlWQqyFWQ
qyFWQqyFWQqyJhnZ1WQqyFWQqyFWQqyFWQqyOtR1o6rIVZCrIVZCrIVZCrIVZGotLXaVZCrIVZCr
IVZCrIVZCrI1EgwKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkK
shVkGVZCrIT1NVkKshrVZCrIVZCrIumVZFz3drQlWQqyFWQqyMwqyI459SrIVZCrIVZDIqyFWR1e
VZCrIa1WQqyFWQqyIVZCrISVZCrIVZCrIVZCrIVZCrIVZCrIOqyFWQqyFWQqyFWQqyFWRFhF1WR5
VkKshVkKsjpVkZMqyDqshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKsh
VkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshV
kKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVkKshVk
KshVkKshVkKshVkKshVkKshVkKshVkKshVkKsjf78BVkKVWRhVkCPAyEKsjeKsgmTJxh3carIcHN
P/r/tVUFT2dnUwAB///////////0KgAlzgIAACmtLkUR//////////////////////97byLeRbyL
eRbyLeRbyLeRbyLeRbyLeRbyLeRbyLeRbyLeRbyLeRbyLeRbyNXnx/LnRp2NBo4ZIid8FrAMQ2t5
AHibeRbyLeRbyLeRbyLeRbyLeRbyMjcVi3MxC6eHXjFsQuvh9ndcBxef+ZOzQFyMv+r1m/u5ueUf
J0HdW6pbhi3QFdvIt5ETNvIt5EW8gAJW28i3kW8m3k28m3k28i3kW8i3kW8m3k28m3k28i3kW8i3
kW8m3k28m3k28i3kW8i3kW8m3k28m3k28i3kW8hiZLeSqGdg9rfWBk2MkX5bycYreRbyLeRbybeT
bybeTbyLeRbyLeRbybeTbybeTbyLeRbyLeRbybeTbybeTbyLeRbyLeRbybeSu3k28i3kW8i10DF6
um523kThsOL5t5FvIt5FvIt5FvIt5FvIt5FvIt5FvIt5FvIt5FvIt5FvIt5FvIt5FvIt5G5lWSm+
nRvbGg0cMn4nfBbLAshtbyAPILeRbyLeRbyLeRbyLeRbyLeRbyNiMABxy5mIXTw68YtiF18ybO64
Di++uZOqmgLkZf9XrNWInI1xngD5k6DuhOqW59uwL7eRbyJi3kW8gX4BIdvIt5FvJt5NvJt5NvIt
5FvIt5FvJt5NvJt5NvIt5FvIt5FvJt5NvJt5NvIt5FvIt5FvJt5NvJt5NvIt5FvIUxW8kLzpk/I8
szFk78Vxbydc28i3kW8i3k28m3k28m3kW8i3kW8i3k28m3k28m3kW8i3kW8i3k28m3k28m3kW8i3
kW8i3k28lVvJt5FvIt5GyFCsA0LTGu3WoawHQqga1HAZLWqgSvaBod7VtVmyEbuiacHXobVpP72v
Bg3dTzjWVUD+hY5sOiBihqe7wxOHCx3yrMi1o3GPOgIWr4aFxhY2fOY6j7S0ItAtMRR0ZsbLlw2L
2cc2HRMfIReutTFozY2NLR7pkwYzKamEhV0gwa83h2sQeOveT0LXEkdaIEEtRtaLeYFUGKqDy8GP
XJrYctQYHjvnUVUE6JBVQM0B1ECGqa5+8HgHmHSQ1MNHQNFDG+gikdn1ijNlQwM3WgtHSDGmxZxC
WDhwoXmXU0iFn12y+samGYGY0Z1EMgOfUE9DVUA6Pq+g5sUjpegMBresBnhwy029BDl0WdF1FVBJ
RAh7WSBCbt77QHCHe1Jf/qLTgMQMEOjUXMwEGnrqxYvNWOeuMWoEMaiGs3kEb+W1g003ZbQ72pZ+
1MoYZAOLQUiDoEE7V9FqtaEiHezM2hpasHGGcHaQ/YybQGBHS7egy03NDIXVUBYdTZohC5YuYOHK
0t2qJXdY0XUXshka2QzSNmUYi/37JyAYeh5/qBAMhgy23+y2mm1LOh3mUMP7VoKRAOLqwQT/Y6g4
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
Letsq6rCiqoKZZCkaobtFUU3AomlOjUV0tFUNaLhKRqzRVDLTVpRlQlGFIFJlOlI7aKoqKRKR0VR
VovopEpTRcxSHWqZSuiqD9FUIlIlI6Lx0VRVSFLl1JKrqTeUiUj2ykW/vGooCr9FxaLxKRqMospE
pGpykSktF27lNUqRSJSJSG/LtqqCRSJSJSJSJTn7lG1cUpouPRchSJSJSJSOi59F1NxTbdSVKRKR
qiqPo6LJ0WUUiUiUiUjouwokpApIpvRdZSJSJSJSJSdWUulIlI7lI6LAlTqbhRuioMCkSkSkSkdF
xFJzKSKSqspcpspEpEpEpFvKFpt9LhSNVtpSKl0KFKlUZSJSJSJSJSGi5yhKrqnlX6LkKRKRKRKR
KbpUpgpGlVxSNSS5fGpv6UiUiUiUjouHReLU3FJ1boufRcRSJSJSJSNKbNKrqRSJSNRbPFAVQUYU
7uUiUiUiUjouYpMpApCSApQpEpEpEpGkONtVlIlI6LC0WlcrKI0XmUiUiUiUiU3ouIpIpKrqRSZS
JSJSJSNPRYEtykSkSkSjdFQYVNyZSWi4ikykSkSkSkSlymykqrpt7eUKUiUiUjVFIoXRZlUFIlIl
I6LJqVvKSKb0XEUiUiUiUi3aLhKV5ykUiUiUjvfWmqaJSpSxSxS38uZR2ioFtFQIaLIKWKWKWKWK
AqfYoyoyi9tililik25vUq3RcZRbVouIpQpQpQpRUoApQpQpQpQpQpQpQpTReFVXOVSaLp0VRpVe
i6SiEDU1NXlKNTU1NTU1NTVSKb63FMaLhampqampqampqampqampqampqampqampqampqampqamp
qampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqamp
qampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqamptpNlS8qrdpbW
1tbWner+K7lBaLJbW09nZ1MAAf//////////9CoAJdMCAAB8PWSuEf//////////////////////
W1t242yaW3RcNRNra2tsm9uqHtXcbW1tbaFMpDDxtaW1tbW3anouCorbNFyNra2tsu09qFKlQbW1
tbajp6KgLQUdFgtra2trRZtra2tptra2tttra2ttl7bW1tbfNtbW1txtbW1tP21tbW2/9tbW1tB+
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
0FHuFLVRsUQUDosQoapCmVSmSjSj6jqOoCmd5lOlJ+UjounReBSl1GUIUpovDReBShSmi8NF4FKa
LV0VA5oqAYpTRdtlKFKFKFKFKFKFKFKFKFKFKFKFKFKFKNdSFHlKNZRBShShRBRBSmioHNFQOVCU
oUQUQUoUoUQUQUoUoUQUQUoUoUQUQUoUoUQUQUoUoUQClGbpRNS1OUaUbU9TlGlG1PU5RqMoup6n
7lT1O3lNq0Nymm+p6nzKnqfCgallOqG7RaJQuVPU+ZU9T5UzeoU1ouFTKnqcpHKnqfONVUN9WVPU
+i79F31PU+i79F3aL4nVW9VlJNWi76nqfRd+i76nqfRd5S2iqCVaq636Lvqep9F36Lvqep9F31E3
aLuqep9F36Luqep42UTQKJKIKJKJKJKJKIKJKJKIKJKIKJKJwokokokoneyhdFgZmZmZmZmZmZmZ
mZmZmZmZmZmY1VFU1TaLC2qapqmqapqmqapqmqapqmqapqmqapqmqapqmqapqmqapqmqapqmqapq
mqapqmKR3qaptF8VRU1TFOcqapm4pqpqm0XsUxU1TaLgb6mqbRf2i56mqaoCl6mqbRdJTlTVNOpq
mqapqmqapqmqapqmqapqmqapqmqapqmqapqmqapqmqapqmqapqmqapigCg95lBlCVYUGUIqyFBlB
8KD2qVTtU1TVNS1LUtS1TVNU1TUtS1LUtU1TVNU1LUtS1KvVNU1TVN1LUtS1LWqmqTqmqUeVLUtS
1DpHVNMoLMKFKFzChShcwoUoXMKFKFzChShcwoUoXMKFKFzChShcwoUoXMKFKFzChShcwoUoXMKF
KFzChShcwoUoXMKFKFzChShcwoUoXMKFk3lC8aNFkWoUc08qXRcec40tLS085zjS0tLTznONLS0t
POc40tLS085zjS0tLTznONLS0tPOc40tLS085zjS0tLTznONLS0tPOWgKQp840tLS085Tyrym+ca
WlpaecqspQpMpfnGlpaWnnKc6TXzjS0tLTzhTOi4G7nGlpaWnnOcaWlpaec5xpaWlp5znMaWm+tL
T3nOcbKDTVU9kH85zlKi0lI1S1ZznOdaWmbe0tNPnOcKYaWl9paec5xpaWlp4qq0tLS0qzp4iVm0
tLS0qopUkDS0tLTSpUqTS0tLTSpUqTS0tLTSpUqTS0tLTSpUqTS0tLTSpUqTS0tLTSpUqTS0tLTS
pUqTS0tLTSpUqTS0tLTSpUqTS0tLTSpUqTS0tLTSpUqTS0tLTSpUqTS0tLUrSVVi0tNdG1NKqqqr
S0Au0UaStx9+sIiZ0emkIQhCEIQhCEIQhCEIQhCMTLTJbZyJk56RMA3LTVpiLwmomDCMBCEIQhCE
Ik+4kV69oC59RzeBxxvxJivPXccB0erDG6CN23PvDOc5znOc5znOc5zLuc5znOc5znOc5znOc5z3
dnfX9b0sxVlPLkk3UtttttttttttttttttttttttzbTZbJyPTY3U2Te2U7Nbxv82222222222D97
f7ivXcgLoQT6jm8DjjfiT9peeTcudo9EY7uWq7o9+HOxjGMYxjGMYxjGMYgMIxjGMYxjGMYxjGMY
xjG7joX32okFR1P2oajKBfQvtTs2irVSgyj9FjFC1DtUUyhqhKEKEgoUIUJUdRVHURQhQhQhQdOV
QlAFClClFFCFAlB9KEKEqjyhChChKDaUCUVMoQoQoQoRqKAKOKEKE/RZJSdDcoBr0WhuUIUJthQC
gKEKElsUIUJs0FFS0WBosAoQoQoQoQoQoQoQoQoQozRahRhQhQhQhQhQhQhQhQhQlT6LCKCKEKEK
EKEKEKEKEKDKFKFKKKEKAKEKEKEKEKEKFKEKAKMKGKEKEKEKEKEKEKEKEKE0WGUcUIUIUIUIUIUI
UIUIUIUZotQowoQoQoQoQoQoQoQoQoTRami0ihChChKBQhQlGapSJSCB4FCFCOFCFB7ertsUs05s
UUUIUBotUogosowoipSmlaJRJRZRZRbU11FSKLKLqgovRYk2nlDRUA2ioBnG/RbJRcygN6qacKLK
LquqCiyi1aanW+k2FFlF71UUWUW2VUUjvKqChyi6SuiyyiYeUhosCigqrEEiilKPwQbx4UC1ZMoH
br1UIGvGyWFClB5hQdQ42VVoqgGkUo2kqlAlBZjWUHx06sxCUrz28prMq6qMQVY0SurKppY2SzEG
U6tqqr6tq0nMzkY5sUo3ZmZtOVRVaUhVNU5mY3FJaLsKfbatPMxAgYmJs3leZmedEpCrm+rMzMOq
qsq2mTmczb9ykoKczMyqWylV1XVfVTfmZiCqSgqpq2J4gvCkI7tF2UhmZlOG1LRexTNKqszMNv0X
PVrY6ec/CleYhaJIKszMyqKdKm3lJVXPMzCatbPzmYUnVdENckGZmVU2ZoqgEpOrTbMzMJqyDFaD
Mlbd2NCeZmN9U1dVxS1WnVOZmE77fzMxThSUKVXVS2ZmZVTfV1XlBVSgqnMxAxHVqCq2JBmYdXIG
yrm+qczMnVxShSrbVpOZnHDp80XHTnOc51a52oKGiwalnOc6NFRro1FmTn0SzpSRSitQd73qive9
73veompAo02GmhUoKUKepVdVdV1XVxS9V1XVdV1XVdV1WUgUtVxSRTBTdV1XVdV1XVdV1XVdV1XV
dV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVd
V1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV
1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XTVjztttLanTp09lWxS0
CCrKdOnTo5upQbCkKNOnTp0bpcUptrRTp06ftirUjbKFOnTpyplI0OU6up06dPnaUpUqe1OnTpz4
gUP0tQU6dOnImnTp0zrk06dOmdc6dOnTNY6dOnTidOnTp6H06dOmTTp06ejKdOnTJp06dMmNOnTp
1zp06dMmnTp0yadOnT0ZTp06aWk206dOdlEFGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlFlGFGl
GlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGlGtNTtFM6FCbZaim1VTOhd7KF
Cb0dT2dnUwAB///////////0KgAl1AIAAEKIZEUR///////////////////////trU5O/QcuVPeg
0bcVqi6Mz2QVu9oqcoN9O2udZSz3NRSjT3nQlQoU1bPkqXzUok0KCquyjRzRYcKTRQlQoHKqO0KC
ihKlA1FD+hQOgodChXNShoUFKFA3yVzXMaIlq+h5raP86xJA1n8SregJiS3NOxSFVSpEFofVGhU1
MyK0BT5ygcpHttoxasSwG3G2VfxBm9UMtftLqnJl0rHSQaFhRA0XvuooKCjQKJ0dnF1buVSaMXi2
VWdtk9yZnVlV1XVcdz30FyaHGk9uCoNsqFpvlEpCdJv5J3aRuTqGgoS40zzrt8NraW6oKWKcgaBt
aPJotLbQbWhRq0FxKR7FC9KQVa1GkiJIMQPc0dWNlX0d/n4PyBYTZ/ZdGisbc2Uqmo1dlaloyrqo
UNd6Cx1Ego5LaVR1HmhUVSSkcK5FVoVmCDDVRKlGlP96urME+oN6VCsS+cKdTXSp7bbyo7z2tp7z
lBslWUUUNajbYFKrqvajVdVKKVVejraKRQEuFJ0KHaq2njXVLm/btBJdWucULZQJbJcNoob3PlbR
1oFNCJ3VtKrW2yXomgOz3aw2tjaY67NBDpI0RVyVj/RiM62iJbRtcq6cSYRX9aGjIaNXNc6kqHR6
+jSCZVi5K51zpb0qvpdqne29vKRq+nVIb9tylG2q6oahvdlI1fm7W21dV1XVTSo9paOFc65raCxM
DKUKUqmk21S20qpqmqKdJvqhvpU6uqlvqmnV1X1dVIKWb6upttXSuqKuqmqEG1LrfV9Ut7XtV9Xt
9WVTSFX1c3NtttU1dV1LGy6opVZVdLftMpGm3t5SNX5V9Kk3VdV1U0Wqkg3qmqKbbjXvV9X1du27
1TVNUU6TflX1cUjV9U7oG2l1Dz+oOqypt8pb777yk2UaDZoM5MD+J1yYGy6NYa62gl2UKOKIHLup
SgKkqCjUZQJQFcoWpOcKCkUCUcUPosHbYosoPRaNQtBSlU0m2qaob6VOnV1Xiqauqi5VdVOyCqNm
ur6sb6vqlturquyl3elTKRb2+m3VdVzVRqmqd0FUY206v3a6v3q6qd22qaob6VPKvq6qavKRbUG9
JQoO2mi0lBlBlBlBqKKKFBlBlBlBqKKKFBlBlBlBqKKKFBFBlBlCKKKKFCFBlBlBKKKKFBFBlBlB
qKKKFCFBlBlBqKKbFCFBlBlBqUNtigygygygttttigWtSXN+1QU23822CgQFNlKNtKqapqinSb2+
qauqkpZvbadXVdSq9v631TV1XXs2t5SNXVYUg2tu9WUqVJBZQKhQJQO1lAlAlAlAlAlBGUCUCUEU
CZQJQRQRQLxZdkKAKAV3olB06NFrKOqcoq50t6NCpCjagKAqL8kpQqBqqrZkXqqqqqqpg3koUDs0
USh6hKCKMq7lVVdSqmqyk2mrykauKUU2Q7lM0qopK77t5SlUVfja3lI1XlLdtb96TcUjVLe1ttX0
os0f0dDGfynCnClKt8pwpwpWrSkSnCnClJlOFObrVdRoqVTVJSNVoJXtV1X1e05n0qZSNCdX70ik
auq9vqlA3tvarq9tpFAb0quqmgUdvSKR3qhsuoKlpUilKp40KKFMlM1XVYU/lOqatqqhahTNX1fV
FT3IFKUygygG+qykavq8VZl1dVFX1S2NtIpOqKdKrrqpvq8pGnV35lV1SUjVlVN9Uir6ubW3rfx/
jXZ0CgCg6HlN6LioFBlB0KBQZQdAorRZeiwaBQTlChQoUKFChQoUKFChQqvRdXKFtdCg1tdDRZei
y6NBra6FBra6FBra6FBra6FBra6FBq+gGilSaWmlSaWmlSaWmlSeOlSmglJ9BOlSJpUjqlvqopVu
p1TVZ0qRNKkcqSCoeoDpUqR0qRwQNyqlKkUGUHSpFB9UKU7OlykUHSpFBlB0qRQeVQUjviAoOlSK
DKDpUig1dyg6VIoMoKlSQVFLQqKojqKotGVFUVRVFoyoqiqKotGVFUR1FUWjKiqJQIPNLorAlp/V
FUKoKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqNpVRVHO1RVFG
FUVRvRqiqKj2qiqNkFUVQ1oKoqirGmqKo2YaoqjeqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiqKoqiq
KoqiqKoqiqKoqiqKoqiqKpqvuVXVaXaq6ruq6rtLVSAqbv8yZzMqaVNKmlTTnMmczKmlTSppU05z
JnMyppU0qaVNOc5zrlTdQVNKmic5zhrCppU1BPOE84TzhPOE84TzhPOE84TzhPOE84TzhPOE84Tz
hPOE84TzhPOE8z9F233b0Ep1bouLHqtq2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5z
q2ratq2c5zq2ratq2c5zq2ratq2c5zq2ratq2c5zq2radOr6dW1bOc51bVtLGioqtq2c5zq2rblK
VW1bOc51bVsqVLaratnOc6tq1olKratnOc6tq2ratnOc6tq2ratnOc6tq2ratcnPvZz7VtW1bVvV
Zj6Soq2ratq3MnnW3s6tq2rat7Of5Oe9W1bVtW9nOc6tq2ratnOcykKtKTKTnOcykykqXlJlJTnO
ZSJSeGpRnOc1FNGKKTnOaimjFFJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMUUnOc1FNGKKTnOa
imjFFJznNRTRiik5zmopoxRSc5zUU0YopOc5qKaMUUnOc1FNGKKd7PvqKaMUU7MT6ooT0v0zdW8u
XklDkm7u7u7u7u7u7u7u7u+oHc5Ta47OU54OOc5nU7Aywmc+87gWO7u7u7uj74YAwBE7YE3za22k
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
sVU66c8VVMKrnPFVTWqkw11UmN0FVOarBzde5qrmGUVWRZeVU6qpUdVxa10PQdL6c8TWdFrV4Y/Q
2I+qr56Cqn1VK9VKFVPKF1VYc3dX1Uj1UxqpqZvniugqv1X6qXeaq/VSG+ziqs83Y66Xbqp7VZuo
oDVVQar9VWKql2+fKDIqqQqrNVOHV1VJPPVTyqkyrKrlVMqqQKsqt1U1qpN6RmejnqpKqtR1U0qp
aiiqsZHVSLzx1U5qpQoKsqvVdU1XKCgVViqn9TVTDKrMVVKlVKy56vqtVUt1dVSLVS5VlWVdVdqp
jVTk+VU7qaqWaqaXHFVT+qxVSNV1VMKs7VFTV9Wn1kdWxVU0qph1qs1Uhc7qpRw1VL9VI9VNoqqQ
aqdVU6qpfqudKqe3VTaqlepNnNVdqpxVTSqnVzVxVU4qpUqv1NVKHQ/aqndTHVcq6gVBVZiyp56q
W6qeVU2qph05ubmqpjVaNHVTyqmcVVJVVNMjqtR1Uh1NTVZFBVvOudVUyoN9KqdVU6qpS5qrpqqX
6qUcqptVSPVSDVTqKq50qp1VS/VTaqleqnt1NTV9W1Ul1WKirqqVon2N2PGd8+M1Vzn3VtVNqr1V
mNtOqnUV89VK9VLNV+qmNVNaDDGqt1W6v56rlXvzpVenDXZu2rtJXrV3aSu1dpK7V2krtXaSu1dp
K7V2krtXaSu1dpK7V1WqrVV6rqirbeVFV6PKiq7GaKpfTnjPVTyqndXbjvuePM6OrsoKiqxz1X6j
mVWGyqxVTGginuaKqm9VIHPz1XKruXpK7VVqOq9VaqsxRxxdD1W83qqnNW7u6DpVTiqxQUW6uqzR
6m71VTuqnkfaONdHUrayrpzLoMXOegUVVMMtVWar5zmSiqxUHNVTLm5jZ7lViOp5+fn7VfVeqvVX
qtq2ratqvVXqr1V710FREbmq2KqxvtfdrKBPDVF7jio2+xufn5+fnq6rquq2ratq2q9VeqvVXp7F
2u+2o9HNUVUwzXaqmL1mzLSoO9DbXarOZR71sx6rlW8/Pz89XVdV1XVbVtW1bVeqvVXqr2nVTF5Q
RXVc5l1o+tVqOo2boaqyaq3U80eo46qd1U5iivdTHHV01z8/Pz1dV1XVdVtW1bVtV6q9Veqvc/Pz
89XVdV1XVbVtW1bVeqvVXqr2XfNzVWKrdWxbeLFQdunTrFQVOJc1X8/Pz89XVdV1XVbVtW1bVeqv
VXqr286NugZ0c1BuLW6rFR0qta3pLO7VA26CgoOaow9uPVxXV3bZufn5+erquq6rqtq2ratqvVXq
r1V51UzbMagquYtTGVUyjxxZVaVVMufD9O1VO6qcqLKrkcdX9OnPz8/PV1XVdV1W1bVtW1Xqr1V6
q9z8/Pz1dV1XVdVtW1bVtV6q9Veqvc/Pz89XVdV1XVbVtW1bHHVeqvVXqr3Pz8/PV1XVdV1W1bVt
W0FSaq9H1uKOqnFWm54j7iq/IunVUJqi+xufplXZQZfVHqvVXqr1V7n5+fnq6rquq6ratq2rYorq
7VBqrroFHVTmgVBVTmOhq7n5uaNLmoe0eVWKCgVVp9bqyKLm5+aqmFV3nqp6uaiq8+VWIj0NB1qv
5VlVjrHVtnu+hueq7VpnVZ7Kr6LL58NVaq+gXNVboajO3MbNHugUdVOaA/PQnXTqaz1fVTHKvquV
eY3N2qu1Xe1BVfqs1XMnKGpfWLn53z89XVZ0q6q5VcqpSqudKrNVOaqX7qv88iq+qnHNlVIFVN6q
Zc9Xx89Viqmt1bVtW1bFdXaoFQVU5j5uZR1WMoKB1Wlz1XaqYcx4qrFDQZVf63Z+hqtqu89X0WZz
3QVfVaVDVb5u2VHNhrPqgVBVTmM/PQ9EezdTsxkRxPpFFV9VPqqUKqUD1U9xs1Te8qDc1W1bVtWx
aq66BR1U5oOerqFc0fah6xVZfNFQqqmtWVeeKOz1XTxugM6r1V7PFd83NVSMe9GoLq+qmkdVOu/T
tdRV5o8wKOqmNWVXKAxH7mB8yqznqp1VVA1VTiratq2raGI9X9cPQNmoT89V54zqqxUGOePmq85u
vV8yq0xjc8XNVequ1Xqr183Nd3zcxz1U9qp9VT056v1lRVlW1U0qpvVTWrKr1VK1VLFVLFW1bVtW
51y7oMfagqpQjoefmqzKlUGH52dmouaqmBjVN4egq3ndWK6CgbR4nQZPZ1NlAerpOagxGj56rvPQ
UBndVyq5fPzVWKsoDmw1W1ZZufmVV03OeOgi56qcqN0RueqmHMc1E6qZxdcjs9T056G8dTzVXqr1
V6q8qqoNVu+bmu75ua7OeNaNeKratq2rar1V6q9Vevm5ru6jmuznqsVWMV3QVWe1s2qCKgqFHV8X
NVTKr6qeVUzqsVXarkdV45sPVTmpjoLqznuKpuKovmq2ratq2q9UmNdWxM57u7q2ragc/bpzGioK
AxsuKK6DI8ybo4jUcmjYoqrR7ZA9u5Xdqr7QIuqn9VJvNUGfMjHoNXUs5qDsbLmsnDzdrVFORGmJ
3FFm5jaoebm7IU0FmZliJl3VrInsERuN53SWS4eNhsPG3EjWry1ddp1eST+kGv1VuXKrhOsbjrhh
yuu87KphtPSSVY8bD7TpB1VxuklYd2Vj6iSZkzW5650KSSwbjYfNNxtURukkO4ckNedy7u7u/mHu
7pCZ8xLuvYnuBYn/liERuN51Uh5cNxsNhuNuJGorrtXXadXhEOCRqqh0yvK8qqE6xrjrk5XWTlUw
2n5mZ1Y8aw+xkG1RG+ZmWHdlY+okmZM1ueudDmZiwbjYfNNxtURvmZgYHcOzBrzq8rrrzMrrzEkh
CfYm9eGcurri3ceYdUJqvqyrDXfNlRV54+9AY8SoKqYGioIj1NWZUVXuerKnLaqYsoKrFXVbQc9R
vnFTUR89VO4nVYqsVEU8qCO93FVYj56mpB1QM1TVx4oqGgoKCgjj56rMVuK8yo5qDnMhU2+eKgOa
gs1QerKsdTzrnqpphldBzxWaqmWUFW1WKmo56sqpkM70FV7Dc52LPQc3NUVCu8ocq+reY/O6EVdV
coKCrjx89BeUFn5j8+UGupqCg5hHUHq6qxVfq89VPebmqsVW6qdVXaqd0HNFCKOrqqQaqUudTUdB
Q3VTGq4Kv6nqsVdVYqphVTB1dVTyKraqZUAPkYNHd0FVParXPV9VjmPQHDquUFXXnPQGiiqpzV91
W+iFBUGoFVt810B7oDUIqbq0zFVM6qc1UwqphVTHpzir6qY1XKrHU9ViqmFXVdVTB1bVTKqnkUVB
B1Uz5qqZOqlOqnFWVFVODqhqLhVYMKqc1Uyi51VSC6qf1Usxd+iznoeeqmNV/i81V0LUR4+arKDj
XVQCAaB6rFXVZVTk11bFzxuzmq/oeeqyrzUFB1yoNvVzlVMqmrqrMR+1X9lVcqtVdVTiqmFXKoqu
C75dsvj1Zyq+rzxVXOY5uZRRUNBPZ2dTAAH///////////QqACXYAgAAVa5oKRH/////////////
/////////x46Dn7TBqsR+tA7oWsoHczz9MmqCoNVcquVNVyO+t4eOJVHNUR1dVdqpwbmqaCqmwyr
MPFVZ6D8KGGezlUMdRkVRV8XNz1XdHNzm7xVbV10FWnbzl4qo+ZYdVM86DNfM6Z3Z+bt1q6+tBQG
7c5qDyhqrD2gijXPdVy27NFG6g/WLOkTugNFznqpxHQVbVQBBfPVnNFz0EXPJ2WH6xc+u8VXbyPK
B1d0oFVWCsx4o8yqnB6ndXc8VAj50OaI/brdB2oIqsiqpioqnEftjurIqqxoLuq3nPUZdRQc1n5z
TVVyz3fTyg54o4u3OeqgCy6CqsKtj61bQR9I+ar6qZR5VYPdm5+fKDmvDVfVfioIo85qiqsHzczj
NzGj5ueqxlW89W5VYNQVdQZQUFBQ0EdBUc9Xc3OegW6CpqsdKDMq+r6jdBlV08XPQHq4VA56rHa6
Gojjj5qqZR1dz1NBVdijiquVB6rtRzx89nw5qCPm56rGVbU5HU9Kmou4+fD81TFec1R2qv1U2qYq
uhHyqp4O8VHzqgqpvQVUtVWqrlVq6rg5qqfVWqqZZVTqgNVlVOqqa1Uu8TmcZubnq3KrFXUGUFBQ
c9RV3NQH56DplX1fh6Dnq6oEdRQx1Uy5o6rsVVyKOoqun5+eM94Y8dBzc9W5VYqcqY6npUVZDRAg
aEWCgoKDm5+fFnODcV8xo+bnqsZVtAahoI6Cg2qrFTQZFVTOqmUdVzVR2qu1bU0FTVvlBV0DZxEI
7jqvVUyqxmoaqUqrx6rtS6qQYqqe1UpnigsuKrar1VNqCqntBxObDUEeVFBV0eRVWMoIqjrV8fPV
fNQHqaqZR51qp1VTKr6ir46CrMoKpsDhVd5uUQdV6gqtLjRUEUfNHlWR1bmHyg6xc9WVFXZceVfH
UVdFHcVXvtU9YueqlHKqaVMcXPz80VRURVWqrPPVtTmVXqtqsVEXNH1q2raipzHU1XqrJqs7UFVM
orjzKCr+uUEdBzKgy+eqxU89Vir8jyq0eq8z0FV2qmFTmRUFVMKui4lAD1Qb8hVYNVtBZ6pc7Dvq
GxUVWcV1WqqVLqtGqp9VS9zVXjR1EVW0AqpAqpUBqqac11U4qw0VV+r6rtW8/NVojsRcwoONVYh3
oOc9UGc/NVhqmrqts6mlFZubrQ1dDBYahSwpcuHPzRXz5NVXKsznPV1V+q1VnagN2oKrmUFVnXXt
rt2eWDC7FVwh6gQ9HlonSZd3NxuNRVXNmLQ6Wy5nTdboTVRtBnetaytJcPqmDXmCszPTSTvK1Vd/
SuNbTIF8M7tbDeWqv0m24TvevwPzcek6fr3yNIEqADVVX3YK/1nzHfCNdDUVVzZi0OlsDzOm6lCf
DtB5tBnetawelOVQ+rMmDXmATM9NJO8rXOry/pXAtpXAvhncGWG4FVfobcJ3vX4G+bj0XfIzLiRw
nWPHVrOFRXX/PQH5qA1Xx89XHnKiq/VTu+e7qs1Up1UtVFSqqd1KqptzVWqsqpQqsVbmZVdvKt5r
qp5VtRVTuzUlRQGi5qtVBzx1cndQc0fAvLoO3aLdWn5qtyo54zWeg7djmqyrsdBUR0CNzmqaqbVF
TV1TVS1V7uqmkVVOznx5U1bz0FRz1Wo6qRKqQHFVZq6qnVVMDXz9HV1VKp4quqe1nqpvVTOq7zRU
fPV0R48uOr6ujq2qnlWR75rqp2aKpvodVWeeKrquq6rqA1XVWD1FV6qlOqkQ1T51ypjqplV1V2gq
vc0dX1NBzHqpVyq5VTKOOpoKnKuVV09XVZ0qu1WOepq6qn9XRnjMbMs/NUVWjXVZypm7iNzxVXXq
q1VZdBVcuKKPfU9DHVTiOqxHVlVrmNH3qprFQVOVPnXmjoKr1BUUFVOKuNmG5qiqzFzVFVmrjRc9
XVWuhs7GoNuPT53qgqy6mbNFVdfPFVZeqrVxUFVw0RqCOguOqmPNVYjmqqZGzmznNHVlVxLKCq9V
SNZzXz1al2i7TNXGjPVsUdXHw3O4qHsfKA1Vx3Ves9RUc1RVuUHNHFFUUBquoKt70HSz5fNQ0FVO
Kmrk+fR7yhdJUnjjoKB312jc10F80dTVaw9XVfdCarr1FcVBUUFDz1XcoGd1dQRVXauqaDKCI7uq
/d0GqDtVauoq6Yqarr0zmyznoOjNV1BHED51yq5RRxUB4ubpZ6C+3MrxnZzUHa6F6zKr8R8oJzMU
VFdFkZ7oasPQ1U3vKCaqznq+rHNOqnFVhM11XaqcPnj1QZQHPUHt81XbR4uerqrZ0qs6RVYagoKO
Kr+kVBGKuy46Kiy4ufm5ojRdnU9esV0BqCgeVFVjreRbuI57qtoeUGGtxUWXVZ5j1U5q/nqKipj6
RKgtHxTVV6rMw/SqmF3dxGPdBQVXFUn5jmqarVBFFHVYNd1NBz3Vdqee6ioUdAarebn1UVdHVYqK
udVMI46CgyqkZxUEV1fU1WDx1PNzVNX3QUFBdX0FQeq66h1XT81ViLnjyKravj5+eqmMR2bnoKDd
VMqirKrNVPKqcc9BQVKNV+WaN1Xat5ufnqp6zVNVOquPz5HVaq1R1Dyq7Vl3V9V64t4qCq8aKq7z
ZQVfUUFX1fQVB6rrVXc8V1eaOM+qA1Czc1TQXFmXzKNHMc9VKVVioVV88dVMarFVuqmdV26r1VOD
UFVmqntXx1ZHVtTUc9VM+apq+6CgqHVdPzx5V9WxGZ+egqplug56BVNBVtV183PVT3n5z5GqtqtX
d1XqvWboIjVXs5qrtBUVfV9X0FBUOq6dVdz1fcUZo49Rm6OOqnNVOefMqIsoLq+p5qC6voKg9V1x
VWOaOqmPPzxVFVmrKqcVU8j56iqmZ3FQOrKuqpjV1VmgqI4vsVVzOdVUoKq/V1VIdVPoqigugqD5
VY56tq7R6Rx1FVNKqdVUsVX6iqxVcqzn5qrFVNIqirbi56iPmqLoN1fkZufnNQUB6rdxOLOlSeqn
B4qqUI4qrWVY/yR10Fx3wLs1VuOr6A/NQVbVcqv81BQHqpBqurmiqu1U/qKrLjoKl0FX8/MY91Wa
vygoFVdquxVbUxxUFTFQVX6qWqrJqCp585qqUaqVKqb81Aaq3VTG6igoDc8VV66A0Siq6Ogyr1zx
VdVdoKv56rtVOag9VlZU0EVBUUEVRVYoI6qQaqQaCr1V3Pz1WardX89VOartV24u1VjmjiPzUGVd
EqqZ4aq6bmqp3QVUxqpVNlXXQc1BVk1VTOrardVMuegqpVquMx1HVdPzXccVS+i23VajzJyqxU80
Wc1XqqxV/fcy5ZelQfnuq7Qc/Y+VEZ7jqKucUfNzXzrHkdxmbVHH1uks5u2dCug3OBF7TElcz5nV
ZlUxK3mdJ5RMshDAi9WJTd0QyZPrCFcXnnJwQG3oIxWqDZuK9ipwhJAA15IHsnaYhQUG+XwIvMmc
lclTOqzB0xK0k+TyjkpNwi9WJCFiGTJ9YRwTfSecnhGt42K1QbNqxXsJozhCQDQIAzDpnTNaiKYK
I3Ma91ZU1Zqq70jZ+eKgPmR1U6qvn56mM9Vmq5Vh7dx3QHUUVBduqndVNefmWdD80fNQc/P0ijj5
rPVfNQaw19jb1zIxj3QHqyz1NQfWXzYY5+iqaqd1a+bTqudY6BR5Z3lBo0fQ0VB0URqmpqpIqvUH
fpQ1WKrjzvz1bVTXnZ4qCg61Y+agq6zGq2qnFVK5qDtQUDi5uc9Vmr6irOftVtWG7VU16GoD4j1b
VSLVdqygqsVWKqZ1Y6rJquqsHqY+lTqqmOUFV2q5VTM9Rh+aoqtc91U5q01VMaqY1bUVXqr052q+
gqMyr6nmzN1HPUx1War0fTtV2jRR1dkeVZHVTKrLq3KqeZUc+VcqqRar9BV+VWKqcVU6PVTGgygq
vVdFVSfUpVbV1VOqu1lAfmqMq66uqprVeoDc9VrmaMr12q2rHVdqpFqsmqyqmNxdozmoOdVU0qtV
XMq26iqnmVcufKr9BVSLVYqpxV+dqqdRVd0qTVWVQVPPVd5qmqmU46sw91W6rdVirqrlWm56rzP2
vtfNVb1fPvtU4egfNzqqzQHVBzboD1WqtSXtXVKeKhjzKmOKpznqv83PzUFx5VuZioDVWYubv2fS
q1Z+jxZdpc1Vir56gzq1zXV/PFlA4+2VfVjw1V3tzRxI0fPlV+rqrTjMc0dDVd7VBqmpPVYqtVK3
HmVddxRGzGar+/NzRUBrjP/P4dDVF3QVZVdZ+670FB1oOdc9AbdBU7uqxmUGVWjnPVTyg7xaVBlB
HHzI3U9D3oKCg70HWrup+c9AbVVqPn3HzbPFrmqOnMqCI8cUfOarufm7XHzqh5qGq3QR3zqOOotu
r432i5nHe6rEdVygNQ1ZnTvzLvQde9B167oN1Zhququ0PPQHiiNVTSraBUHS+Y8dSegeZ3OI0a+t
AzUHa+uzKgiPkRsjqD505oojpqPnsx75soKCoVXxG546k8UVDF1OnVZPlTZLNKr6JVNVPqrB3Vp6
qeVU5iqLPVlVzOerquR4meI9x1U5qztUVbVcqyravoKtqtUFCo41QVXaqa1U0qprVdoKqaOq5Edn
iqudj1UgVUwqpSq2qmtW1UwvnqpA6c1VMqtPE+lVNKrFVNKtqpEO6iq3VSnVtWVZUGqD3VTWr6qe
VU4qpzFQZQdLUcTq26rMVVKHOeqnJ6rEdnqsVUo1UxoaiqnlX1fQc1V+hqsVFViqxEZZVTGrOtXV
U1qaCqmjquRHR+h6rhlUnoTVXL7c1TVtWHNVnN2q9VWariqD3lVN7qpyc9WHNVTqqnJqiqmlVmq0
egquH5zVWqCq89VX6qax0HNGqCq7VTWqmjPFVcqpSq2qmt1Uwq1xH6VU0qppVYq2qlOrDVFWZQRU
HRWfnqpQqpye46rFVPKvq+q/zUFRVYqsGiqsVUxxVZV3Wgqaqa1U0Z4qriP0NVcOepVDQ+daA3c5
nVZdBFVvOfnyq8o6qa1XaCqmjquRHqpAP2qphz1UgVUy5ulW1az1UiVW6irekdVPlZ46uqpvVTCq
mVBU1FDUmoWajiqtd6rNVm6Cqzqq0c1X1U7qps6uqpUqs1ZVTirqrlVPqs2fniq+p5o6sO6qY9I6
qb5VtW0FVOKr/PVYP2qsVWqrVVIVTQvKudW1NXN1Waqc2eqnFW9XVnehw9VMKqQDVZVTWojiNFz+
ZQVfVTWKq/QVU05qqcVUgVbH07VZVlVyqnFV5ZVY56ujqsVUpVeer6sqKqcc9VO6rp6vqw1VuqnZ
8q+qmlVP+8VCeNxXz1XKtoauoD1U3qvVXaCqnFVOKqZVU2qp/VTyqxVTR9TVa6CrKsfNV9X1FXKg
qpxdVyI9WVU1syjq1OqmlVMaCKq86rlDV8Xeoqw9VPav1EqiKqzVfNzVXjcx+lV3nqyqnZlGfOlW
VGNZVmuY+Xjaq3nq6oqsVf3oIqqdVU5q+q7U0BqC6sqasjoKqYVfVtV66rdVNqrNVLVBV1V91XqC
qmVGeqnXVq2quzt0oMjoYuaqmXNVbiqs1UzqsI6Mdxp0NWOhu87VU4qatPzVFWn5qrNWM5uh71E1
0oL2uftEah6TNH097S9TAy6GDQUa505LKrT52BGV4laGSG6aV8bE53ZxU6AYpyAkgbHLqWPxFwIO
Adgb5ycO4iYmhPSwnYiakudY3VzpyVdVp2BGVj8StQQTa+lfGxOmd2cVOgEcLGuAkkjl1KeIN4Nc
vZ5ycR2LUTwTvcTKE13qInQHqt1flWGqprFEfN85qqbGypR4zVU+oMqKqYVdVcoKrG6rbqpxz3Va
53VtVnufKmKgik9nZ1MAAf//////////9CoAJdkCAAA1IphcEf//////////////////////qxF1
oD1dHZlnPeZz9o4rZ0fKCqxs9AeM5or7RxXl4qiotN8COZ0FSar3VYoOaq3Vpqio5uY/MzH53U0B
6qfrm5qCq3VSFUGqKjtFQKq5VTV0XPQVWroIuerqrEeXV8c1V1RFlVnmq3o6tNVTBXwJiNQOq7z1
WarlVzKiqmFVOHV2Gqs1HPVYuoqOvSrKrdBV1VqpiNVTGr6GqnVVKfNcZqsqy6igoavq2r6rNBzo
9WVUr1XMqyNUFBVvPVZqs1dVfqvVWqtqO9X96qakqsqvn61W6ra56v6VbVSDkd1DjquVB6tqyrav
6Ro9AeqmEdXVFRdVqpoKuq6ruer1zVXd1Xee1FVYPQc9VMKrrqpxU1bUVWIux+c2LdX1X6rdVt1X
au71f3qyqmpLrVbqvn56vqtqqkHOlWx1FW1PPVtVMYqtqYlzVblQc3O+eq7U1XOtBVYeRt5Hd8CF
0591dFneo5qu54r56DnjimGquqyr6r1VqooIo9mObdX3kVXc1Tu6rbRzaMfLXeM9WVZV0dtmOefU
Wuah3QVbQUHPQc3fnoI4uer6sjdTVroKA0USq85utRHeGjqzpV8dWR1HdXV51QYrMfZ6COgyKrqu
Nqq5VTGrzmqzmzpkT9uPF37dOuKgoLqyg7c57FRHFnN3qajm5qg10NVgRZHdtnqpgagjqp4qCqyu
fObFQRboDRxRxHqsRHOeKqmBzZdBQVblXx1WU4qrij6niiqtdKt5qjmiqtWaq1m6rVBHz5U4c1Xx
mOuc1wdVypPwIPQXcd1JroKCoRo444qn2LmoIqtuLm1zVXb7c1VNYnVd6GcR3Hz2WPz7PQXcWXHm
ZdXVdFEzVU5683epx4aKM2VGrq6rOZ3V1XLnjjq7znzVXHjq41QsjiFQryKoPnFoBdBV5sqKrnXm
qpyndVMarNV+q+jZVdd1WannVV+KO6rNV6LmqsLn5qrjqt1FVyq5Uc0VBQUEXNQVNVuq/z1PPVfq
t1XKtoqrrq1VWOarqvjquLm5ueguraqc1WKDnqaCoqamqzVdXNQc/NVtA6qZVU45qr1V+q5VYquL
m56rlVipqarh+sdVMauqpndVMaqZ1Uix0LoOfmiNVtVyqmt1ZzRx1WI6rtV2gNzUFTVbqv89VP6q
Y1U5qpR5qrdBVhqmgyOLm5+Y8UTqs1W7VW1Jo4hVTrKCqzHVl1U1iqp5Vf5sqas8q6q5zPnqpzV9
V6qnNVMqk+VdVTGq5Uc0VBQVPPVfqt1XXVvNVYXPzc1BVTmrbqamqzzKq7Vfqvc1Vyq5VY6nquR1
UxuqmdXOg5zRc1VNarlW3HzVZHVYjqu1XeY1BQVPPVfqt1U/qpjzVUo1U5qygqt94u23QUHPVhub
HVZdXx81RVcoIuagqardV/nq2q5RVdV9VyNVWKnnoKigZzHyqnNVMKtyqxVtX5Q0HZdulVqpqtVb
FVTGqndVOI3VZoKqY1fdVNrqt1FVPaiq5VTKq8qmgquZVTGrqtquVUzqu1XIuZVWOegqp9V9VM6q
YxHqptlVPKnnPVTGKpquVWOaq/VTPmyqnNB1quVWqiOqmNFVtWUVW0Ns0cWoubnqpq75qA9Viqnt
BVdqs1Xeaqy0erauq/nqpnVTk9VMaCq6uegqe/WqxVTmqxErPzUFBVTWqnMVRVcj5qqaVXMqppVT
yqlWq1VaoKrVVyg5qrFWVdVtBVcV3Veqs1XeeqlDm5qGq4+ZXFU1Uxqs1bzc1SZGqKCqmFRVfqpR
qardBzqq7VTmq5QUEVVOKrL5t1UwqucxqqY96rlVip75VTqqmTs9TVlVyod1UwqxH5zYLqanmVWV
XOeq52R7iqtRVdVSz1971U4qsxZVtVioqp5dQqqVKiq5F2iqsmoKrdVMO/baNV9Wc11XIqCgoMoD
5RRzWc+YfT7dH3qKsj1zG3FVfquxR4eqxVbu4+xjdcnMz2XduKLnk6HivzmmYSKu+gtXAIqg9Igw
bq9SyASQg2UYo3R46qGLQxbs4wQ3qmTy0qub2rsGotEWyrsxGvO1C+Wo68CAbLgntWLVylIPSwND
Ur1LNcJYUbKUo+UeOvRBaBgt2dkEN6pnNxyVVzOtXa6MVhqRFsq7K4yyvO1C+Wo2nQGrnDqkUiBq
s5+Y2qWrqvzKqcOpjXNHVeyqkiqmQqp1VeqplVStVT6OqmFVPKqSaqo8VBVTaqqP2oLqqgYqqXKr
h6rMRlzX2PVTirr1msq+7dCqrCOY1XVcY7q40cVBUxc/SI982ZV1XUKqzmp+BG6TnZyhA5S+dM9Q
eq7jiNG+1RVcq9R1WT1Uyqpk6rVBFQVXKrnMZ0B+eqkerqCqnR6r1BU8/Maz1XqmqmHNVsR6tw/N
V2FDc9WUCuq4KiLK1VLlVo1VNubKGhqp3Q9qqZKqqbVVNqpXfPQVZHmVUr1dV9VJDoMjdAqtNU0E
XNVTKOhquVWqunKHpVvfvl5HVYiiq+oqyqzVYjedT9ztmijjZ8oFz1HNQXVYqvVWKg8UVRVlVnmq
pAoOlbOlA8q6OOrcqyqntWRVNV2q2fpQNOgyOLmqaC6rlVj2pyOgyskagPzc9VO6qZc/ahoKrETo
L7ZHoxqrVV6qzURRRUFW1WKrFV6KoPVlVmKoqpAoOZ9D1L56Gro6rpqmq5HQZQK6A53VlV2q5zRR
VU9za6x1OGVViooO2R1XKrVWG53QVWOepq2q10NG6i75qCg7VUwqsRZU0NViqmNs77UFXRYegqsU
NRVTds7Z543WgcR1cR+aLtHnNlVqqnCqzmoKr1VirroKCgoD0Gr546rBquqarXNVTmqnlREY1ag5
jRx1WaC475qsNzx1WqqdVB+aqlWq7HVvNEaLHFEZ1Jr68+Hmqu0ZvmsVXbdVNOZRxxXdqgqIu8XP
m4jnMO3M6Duc3bKA5jnqv1ZzVEdTzVWKmojVXRZz0AqygPV/er6r9Viq3VYoKv6ncXNFTH59HObt
HnPzVWKrB441kcI6qY1J1dnOc1BV8d1U0qUfKCrj1W6qZc9XJKpoKlGinEdmN0quVNLVnJiqmuRm
qcqsVZGkG7XWKoiNQGi7ioioE6rh6uqb5ubBzZ2N0q6OKqn1V8+dYz1MV0HNUhVZdBQVbVnNVbq1
ugPkV813VzVTuoqx1cue0qtdVq6qfRXSreRxVHTmqp6er2HU1Up0FQeoNzHZ6uPLVaqwgchxKugq
lVfVeqpnVYoKC6qbRc9VKEdVyqmseKq3VlVMqrdVOKuq241VShfPVTOr6CgqyqmFVirquig6iodV
MKr9VO6qa1U7qv1UwqprVbjqtVU+qt1U+qtR1fHUUFBV1BUVW6qWqir6mqmFBVcxVU1qpqeq5HVY
qp3VTiqmcdBQdaqUKqUKqbVU2iqpxVbq6q86A+dKrlW1U156rnNiqsOgjqI6u56rtxc8VTVkbqvV
ZVTCKgiquZEeq7VlTVTd1ZVShzKqndX1UwqprVbjqtVU+qsVdV/PVbiVVqqnMUdxvDxug65fWgOc
1QbIqBUH6c6qvVY+bOeqnhqrlVqhqt1U+qp0utVnmjqp1VSVU89VM+aqmFVPaqQqvqpCqHVTCq/V
TuqmtVuqn1VqOgoKuqt1FAsquVU1qprHVcP1oKqUKqbVU2qpQqudMq2qmtVznjqKu54rquuq9VlB
FVTCLKrh6mrKrtWOqm9VKC5qqYVfVTuqmtVuqn1VqOqxV1XxVW+eqnNVpRRZSdebm5+1BzH7VU6q
yhPSVDqKqd1X6qYVU1qtx1WqqfVEdX1UtVFVMKmr6CqxVTOqnFVO6COgq+KPIuegq2qkOr8yqmUd
T7H3qpWqYueqnVVMaqaVU9qp5FV1V6qlOql2qlJVUi1FVg9VyreapzzgtdTHVTE9T0quVdVbq6r6
iqnNVigqsVUwiqp3Vdi56vq6Oeuq5VkSq1dcqpzVTFVU7iji54qrFX1WYriq/nqHVyuzUEbqw9V+
r6qYVU1NFlX1Uxyr6qUKqUKsi5lVtVmqmlVPO0UWc9V6qlCqm24rqyqzeVXqrlW1ZVT2q9dXR89B
Vb57iiqsRUFVOOeq7znqY4oqg9Wc1VmqmsVW1bz0EdVKFVKCdV2qnNVMeagqyLpHz1UoVdVbqptQ
RUFV2qmdVNaqf1XqrVVLNVuOOq9nNVTaqlDnq6q1lVMarmVUydVnnquxUNXVfdVm7586YbpHFVTm
q6llVMVVutxatu6rtXc11Xbq3myz1U2qsVXsiqs9zUFV/nqaqf8x7uqnpqGqkRZdRHurTVc8yq5V
c56viyrqqc1U7dVyrquq2q1d1PZWvfYfmfn541Qc93HQuOq5UnuzLaoW1zRPrcxZs6Yfn2+guK3g
uPoKxZgRcMUkHzZXFIgraLVqo8S+GKL4EWv2eAjz48Yr8bWVpl5nWuQgXF+sJ7ryGK1lFDNPGXgA
9oEaBAdYIh3gPPIrYMmEhikIsGWVxTS9gyrVaxJ2TkYovWEWv2eL+fHjFfibJWmXm2FL4EC4v2WE
915urLQMCNPGXgA9crpgYGEoODgyMagoOagyrOeg5qPrVTiqmPM6lVXLq7rQc8fNVYqphiquGd0H
PFVYqyrGfx0Gz0DMY5qLnqDui5zx87M6CKqzcUcVBV1WUDNlqg54qCgeZQUD5qCrqsoKmo5qDqqB
TPpkaoqaQ2Vfz1UzqppURPKC8j7VbQVU5q+q4eP5V1Vox6mr6rOOr6DmqznyqwfI6CM/Pl1Yarj8
9Qo+fOaks++Z/epsoDZVY5n1oD0FBVfqT1UsHjzq6qdVXqvulqVQVXI9HqygqygqvRHqt0FVqr7o
Il8kPlVk8ZquoHhzXVTc13lL8yN5UVUwqpjVTOoygqsc9XdLl5rNaqIqioyM1Bz0ETqt0izM5u0V
VqqmlVLVVMqm1VvPS3qq5GqCI9BVeiqtVUh0FVMzUFRcM5qrVJHrrQHqpYqtc9TUyUmUGHqpjVY0
ZVFRVtRHzXL0NdxVCqIzVGUEVBz38oKilyrj1X47joKmoqed/au5squmqtOraqY0B3153Zqipqpg
uerz2tcyyoq45qviNFUxYrXWgeRVNWc9V2rFHzUFXZz5zduaraupMjq2g79dUHaKrHl948PmJs1Q
o+arMPQUGol2s9WKgicdXVZVTKrI6rGG55KrnPl30WXvmq6Kg2aqxFFcczFV/NdBV+dFvtQI9BQU
FBFOujOsoHQUB95ViqaCLD4KUg6N1ZQZUXgoKA4cZsi3lxZVb3Zsiypi5vn2JRO+mzLOm+r7dfmp
29RQPVdxug56Dmqs4bDXu7quVOM9VmOoquGPR85qPtQOg+X2vKPOlRFz1ZUvp01Ve5pehjUFWnjP
8NGY0zUnP1P2WsFbtHQc/Oa8oKBCqy8vO1BzVXI7FQeOI0dQeJm56j7V1WOgoL3Zl2ygO8P2iwyw
7iquc/btQc0cdVjJTRmfag7HVVg57q6qzScx8vfb5z0edMrancV6nbcSjoOarZ3vYaqenMaLoar6
t5desfNzVcaqnPPd89VOI+aoug3VlWVFBVeqxx3dXRqM9RFVaqpjVZq6oqvVNVqgoKrVVnmoKCg5
qrNBVe543VecfPU1J46r1WVWqtZzVBqiq1zuqxUUFT1qsVZE+e+erY4sTbqygyoqHUGqDmq91WKu
dX1U4jiNz1U4yPnqpxz83PkWUFVMarNx1HVGqbjyrjc8VVurKCrKrNBVe5431VRVTCq1FHcVSY+H
RudR88fNUx3vrkcXPEJT1U/qurLdTVTyOO7oIqtoO9WGqpvVTo+VXjx1DoKrVVnmoKCq84+eOq9V
T2dnUwAB///////////0KgAl2gIAAK/R7WER//////////////////////+OrarVVh89RQVWOtTV
sayKoZqgxzRR89VOOePMoKqYx3VZMutTkd85quiqyq3VZqygoKrzj5+qqIqrVVMIrjqedzNGbLiN
z1e1QKpqtUFBzVWaCq9zxs9TUnNUGqKrVWc7i57qvVE7kXNVTCqmVVnmeXVTuO+o590nNU1Xaqd1
Uwqpkegq+r6uqsY6qY1U9q+qn9VOat56mKrarZ4+dc91W46rtVuooHlVqrKrtVO6rlW89VOKmqyv
D1bU1WI6Cro6rlVzDVHNVTCqmequjXPFUR1U4PQVZFyxVLqaiqwfnqpjHEeqzQKq/QUFEqmOJ4ZR
80dVrnPVdqpxQRZ2iMeq1jiw8dVOaDdVnMqphVtVo2VUhVU4q6oqpxz3huagq2q3VTOgvmvmoKuj
yq5zVfHFVYPVd5uaqxzVUxquc9VOKqcR1Y1zTtVpc1AzR1Xar3PdAqtyKqmFVigvnw1Bz1XnHHEq
g1BFEbVugPVbq6qnFWoVUwqp/dWTr6UGjUBzfaA8VVmqmFXp2jm8io7uKPnjoDGOqmI1VtPrFiOe
doKCJfIzY46Q9XVbhutWRc8UW/iGzlu9BdAaooKCgNVc61Z1qTXOVZ1NQUFVmrjPt8u5npkc5fZJ
OO3fRaiCGhKBCEQRaKkA6kRaKZ8y824OgJrRAtOk1Msycp6QnNJ6cEIgi2i53qWQL5Pmzp01XQIQ
CayiBZTpL4ZZhnzSRAQIg4uaqmdVN90FVM6tuLmq+q5dVqqmNVuqmvN1j5qmqmtVNcqprVTWOr6E
9VNaqa1U1qs3Vd56sqpnVTWqmdVNXVTSr6qa1U1jlqprVTW6jmdVNaqa1U1qsXVTaqmNVNaqa1Wq
mhqpxVTaqkGqnFVNaqa0NVr2KqzJVTWqmtVWWqrJVTCqmFXVWzUNVMaqY1U1qprVTWqmtVNaqa1U
1qprVtVMqiqmVVNaqa1U1qprVTWqmtVNaqY1W6qb1UwqptVTWqmtVNaqa1U1qprVTWqzVTOqmtVM
6qa1U2qprVTWqmtVNaqa1UzqtVU2qplVTSqmtVNaqa1U1qprVTWqmtVuqmVVMKqZVU1qprVTWqmt
VNaqa1U1qprVtVMqiqmVVNaqa1U1qprVTWqmtVNaqYVUwqyraqa1U1qprVTiqmtVNaqcuqm1VNnV
TWqmtVNarDw0lV+L2qm1VIFWVU/qpvVTaqnVVPKsqp4t1U3qptVTaqm3NzTlVNqqbR1U0oO55i6q
d1U7PV1VMnV89HV3tVMqqZc8dVM6qZW89iu6qZVUzcdVMqqZHPVjqvR1W8u6uWVU8qpDquo6Zqru
c2c1p4qrdW1N1Waqf1U0qppQ3HUXVb56mreeqmmVXJ2Kq1MGqp3zZFVZ2sqY4jVXaqc856uquVXM
iqt1ZVazXNz1McdDV9VypjquTiRz1U8qp7VYNU1J4+eq5Vcjqpy6qcVU4qqzx3dTU1XOc8VV2q1V
1VxZVbnqsOarKrBqBVWbjPlVznyq1MTsW1FVZPFfPV8cVVznyq3VZNVZjupqKsd1XMVVOaqUOdmq
08dTU1U4quc7qpzVTiqrPVTi6mO+c9TVcqtVdFVdVVyq1VTRVUzqsOpPHurqrsRqrmR1U9P7Vziq
pFqplVvNzGzmGOoqtVX6ujqvVfVfRl46vqpU85sqtVFWVZVlRFVlWVZVlWVZVlWVBqjmMarKsqyr
KsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrK
sqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKs
qyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqyrKsqInz3U
R1FRUVEZqrMZzHPUVFRUc/sUfPzdKmoqKio55mKpMueoqKioqyrKnm56ioqKip5j1FRUVF7iiijq
KioqOfyrj3FUVFRUKoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqK
ioqKioqKioqKioqIqioqHWqtVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqs
VWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYqsVWKrFViqxVYjoKv56vq7Ju3zKrqrs3NVfQR2r
qbeVXarlVyr47tqOq7V9XVXWrbi5pipqpxVdquXGnV1XVfVcq/PV66rlXVdVyxxvnq+r1VcquXVT
+rqrtVyq7Vdqu1XKrtV2q5VcquVXartVyq7Vdqu1XarlV3nkq6pjqsZZ6r9V6LznbM26rsXNZtVX
Xz1EZ0aYzZ/Oa/MzyqzUVPmVXKrlVypqeepquVXMozuJUZ1MKYurMocmHNTFV7OY3ryrKg/PZ7qI
j1MdVzIrx1Uwq6q9imI3Ux1WuaL2hqar8VXPG3V1XVNXOdHPFzRzlbtV05PKpq6I1V11ZFHGroeb
ypxzFxXZqh1Hl8/Pz893z+HVV49W3mrs2quwyu6Gq5kxmfaupPOmT9RHUVPlmiquOeZ7NVlWGXNl
HVZqt1bVhuaqmlVMjVWIqjmqpnULJirasVRVSDVZqtVZVnMaqxVYNVYquVXKrHNVaqzmqyq1zc3M
araqY81VMatNVlVmqzzVdVlWVZVZqpoqrNWVOVZVTCf5qs5uaqwaqxVZqzmjx1ZVlVmrOaq9VTSr
Ksqs5FP1ZzVZVhjGn+Y3tRUG5karTVUyqt1bVYNVhjVWasqzmqpvVTY1DzcxqrUVVILqyrKsNVlW
c3NzGq2qmNWVZVtViqzFzxGnNrOc3WzmiqvmM2zc/NzRx81VnzzzmqyraqY1WKiq1FVtVNLq+qmd
VM8qphVvNz1Uw5sqtVWKiqmVWVXKrHNVaqzm5qqY1aarqsqyqmlVmrOafqphVnNVY5nlWVZVZqzm
qyfqyrDGXMY1W1W6qZGqs1ZVlVNqqb83NQ80VVo1WOqkGrDVZzVZVnNzVUxq01WVZVZqsVbFzxGy
rSlW1bVtW1bVtW1bVtW1bVtWVbVtW1bVtW1ZVlW1bVtW1bVtW1bVtW1bVtW1bVuVZiJc6NVlBlVP
aqe1Xavqp2j1WKrlWVWubm5jVbVTGqzVZqzmVVnKmrKsNVlVmqxHzVZVh6rFVurauq/nqyrDaMar
rq6rquq6rquq6rquq6rquq6rqvq6rquMapq2K2eq/VT/mjNEZ21U1J+/Tnqv1X6soKsqyrKs6O6v
u6mq/Vfq+q/VlVyq3FVhuaoyqmVVirasqsRqq0bmNGeoqpjVY5qsNVYqt1bUGqyrakxoqt5qrNVI
dWVYacnKqe1U9qprVTL2qntVPaqc1W6r9VPaqe1U2iqp7VT09WR1U3qtc3NVtRHUOrKsqypNucMa
raqQKrNVigNVtWVZVZqs1W4lV9WVZVlVIlQarOaqmtVODVbnNz5VTKqwY1Vjm1ccdVqq1UVFVybq
+I3NVbqpAqu1U9jqtVZVnNVtVPe1VOKrBqrdW1Wz1FW1ZVlVNKsoas5qs5qsqyrat5jGqybqtVWa
sq01WHqpkahqOarasuq3VZqppVlWRRd6rb5jurauq+qxqqmtVN6rFX1fVYqsVfV9Viq3VTSqmFVi
r6rFViqxVYqsVWKrFViqxVYqsVWKrFViqxVtVItViqweq7VYqsVXartViqmlVNDVWKrtV2qxVYqu
1XarFViq7VdqsVWKrtV2qxVYqu1XarFViq5SVWJur8quVXMyq5VczKrlX5mY4s5onmZnNFVtVMqt
qKrFRmZkVRzVGZeZ7lWVZeZVcquZlVyqzVTSqmJsqMyq5mVXKrmZVcqKiq3EqrmZVcquZlVxaquZ
lVyr8z1VXz1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqvvnq4x+bmquc3Nzc3Nzc3Nzc3Nzc
3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzYubmqtc3NzG5uagmubm7Rc3Nzc3NzVWebmqsn5uarKt5u
bm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5qiI1RUVFRLUVFRHkccccccccccceR
xxxiOOMVdV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV9X1fV+qrEVB
VTyqnHPVdqvUFVIlV6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9VeqvVXqr1V6q9Veqv
VXqr1V6q9VeqvVXqryqyoqvVXqr1V7mUVV6q9VeqvXzc1V6q9VeqvRRGVV6q9Veqve1FV6q9Veqv
VXqr1V6q9VeqvVXqr1V6q9O8ClVeqvVXqr0mux6r1V6q9VeiflV6q9VeqvLzsaq9VeqvVXopar1V
6q9Veqv1XqqcVU4qpxVTi/aqcVU4qv1U4mYooooooooooooooooooooooooooooooooooooooooo
ooooooooooooriiiiii2QMo1XapdaVTpMnLLoJtXmiK7sSwU0E660SE9UCGYCaquNWdpr2z7szM7
u7MzO7uzMzu7szM7uzK12V1dXmZ3d2Zmd3dmZnd3ZmZ3d2Zmd3dWPrr7t0BJoTedMDVO0zBNLL9a
1eaLF3clgpZDx6whfZUCcBw1VcjVnaa3WGuuqqqquuuuqqqquuuuqqqquuuuqqqquuuocOysdUNh
w+sbVVVV111VVVV1111VVVV1111VVVV1111VVVV114OGw4dlayOp789QHMZ1yrcPg0erOuRQcL53
yNHGj3ligiqyGQoKCqzVffK6BqdFVw1VlUFV6FVjfPAzijq+o/VOqDoYH48Ube+Oa8sdeKY812fH
ij3dUHQwPx4o8vjaUgNvlnd9uY7B6t9FV2rzXR65UFBQQNlWGULquBUF1fCgP6MVndAPHQQfVZVY
zOZ2OfdAqrAwKq+KrmzxiqzQboM8MaguhdVygoLdW9cXWLnqKkHjqwKK4z1Y4lQ1WDVWKGa9xXe1
dTzo9A6B2eqya4ZHHFVsXNzZ3oOY8e6qYLVV99c1mI6yPoZQq6hOag1Eaq4aq/dBQNHhVkbPViqs
VWelBVqiiY56uNlA3Q3VtX1FnGqlGvmqtBdczmitVUw3VfetZ1w6xdDZGFV9V0VWKsurnrD1U45j
7jhFUqKrTc3V7oLoYLpU1WKgwquVdVYlC3urhQYd8keqBYrVBVQEU+x3dBQcRPniZmfiRxR0FBfE
Mf3D3zcR1Zz0FBxOlAqDseo4iyc6WZ8Tn6bvfEVVAHEcxyeVViUqr26jD0NBQPv3R+tBQHiNa68/
V5G860FB37dts+TXRRd70nFQ9DjKDvrsqB+0E4Ksa1Q6oZz2e6bj2o1RTcLVTVWh3HQHOs60HU8r
327LtzWdIxr5ueI+Wnza79u3egXfu6DuZR0FSfpdBkRqhPt232NqeR13XeLv03rc12iM+e779ncX
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
6rF1U8qpzMVW6qdc7qpVyrY6qQKiq5VTGqmNVI1V5VU+PVTyq1U5VZqYqqfvXPVlVPKrdVNKCrFz
rKmOM3bmqpu6rlXxq6qceRc0VRVlVyOqm9RVTmqkA1XVU8qKu59RVOTXOlVTGqmNVM+aq/VtVKuV
UgR1XKqY1FV5VUxqpGqp5Vaqp8c9Tz1UyiqpxUdvYmdpc6dSKrVVmPLvKsZ6ut1XartW1WaqcVFV
+5ar9VNuaM/Mlnhze81X1FqOrT80dW1dUR81VzOtXc3NVYq7rrmfbquY3aq5VlWdqqYVc6gx6vVX
89G7PUc3PcTMf2c5rP2cdRPc8WRx9oqSJVPPVxue/t3fy+1Cegij5uaM11W3zx5durjVZFEaq1zc
3uLmqI6uquVNVhc13PNc8UWVHPrqaTcdrT9r965Tr0yoj99P7ucVK9ZlAyVVzpH9EWXz96Cq9QRR
TzqyqmHeozD1XMqsboHSmq/VXRVZHU827P3qzm61Hb0+VE1HV1XVXKjtl3PTU5OLn1VYT3dRaoHQ
0Oau6GSJy1WKvddWsPSvOp+vSaiOeM1T1iOapqKuuzq8NlfpU3FEag3GZv7HEYx0e07mKjmiqJcj
jqvVHPVtXc2VdVdqOftZ6k51z1asjoDmlNFzZzc2G6z3s91N7dWZHceVZPdcq68u57mq7mqNe+25
D1NTUVbV9Vqpq3KuoXZ6jmfqNUalc6ZR5z1bUVHPU9bdCczfPVe73V8ejVfV8dRPWb26syNVZPc1
WZlVjOZVU5MbObnq9VXKrGnVTCqnFVk7mIjqpur8iNVau6qeVU1qpH56rlXx0Bz1U0dVOavqyqmZ
6mruaqnnPzYbrPe3HlWVdl6qOb313VtTVaq/mqH6ZZGueoqKtdCds3eq9eo6vq81X1EZrnvbjyrF
Vk9lWc2VWM5ufQuOq72qKA91PMeZN3zmnupvbqzI86z13V3NPSVJ6ipnqsNUVPNV1W9aCq+eLJjm
wldVIXPzzhqmqkGrqr/dzNVuqnBqnd81VNqm+ZXVeq2pqpIPVT3J7mjuQ8Rj1PPPc1Sc+c2j81So
t89Vip5o6GXoao54+fFV1WyxVe6reH56AxvT5Fk8eeq2r6m42dXV1TUmznoavqtOI+XVnSq3z5UH
N5OOq7fNU4Yzl5zzp1UVMwe46rlTUHXt9L5jVbV+ooozRnq+o5zc9W1dlTVtXRVHvMfLurMoamq1
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
jvqsi63l0GLykxa0trNR9oiHfneu26bXZp7x3ve2+un721bj6OKZ1179tzpm/N2ftju8Mec3as/Z
dWvqpbKXzazvURrt2ym336ddUzj6UEceeo+boN65qF3tqj1H06rv2r3QK3UC3FOJZdbOhsPGss7K
mIKM5quqMdBV1RQVW4tGWHPUbur6Cgw8VSY+zVJrs2zVfVlXm3Vh6uw+Vd0qu8/Y1Vk0dVM6rvbm
Zu1WVZHVxqrp6kxqCgdVmrKrFX0FRQdqmrrNUvKrOZVl1Y7qw++9RHGerKsqun6Hug3qr+bdWHq7
KuqudooubpPWeO3a7Zl0EceVUxeJVfVlmquVYunPU3h6rVVM4qrtRhqqd2bZqvqw+Vd2NVZjN2qy
ro6sMagdBUUFB2q6pyqzl1ZVh6jvs8cdWHqu1ZZ+lBre+ar6sPlXVdVc7Rc0WjRxm3UGurzbqw9X
ZVd6c9VM6rr5uxjHqu1Ju1xnuqzFdVzrzYY7qyoqu1dUVNX89X1XXUKgVQaq5VuroIrq90Bu11XT
mNrnqt7qzpVmGjqDVFTHV5z1HPUG3Hz6j56rpqrL7qaMeoOt1Zzc90nSgoOfnRqirOfmq6rKrR6B
xVbFViqaioPVlT1qyz5rnRqBc5rqu0HPzqO6sqw+znoKCgq8xqDNZQVWausxj1ZVf7Yz1c6Cq7FV
zyqzd0FVztFzxVb0zOde3VceN5EutBzK8oMs5qvijUZo3Fzvm6HqXqyGTkUYUfSzqOOOr7jq6+kS
nKDe12Wj7Zo3kt68jYndilQtYKRsUEBkLstBFVdQ67BilWBvnXLjpamQJlxVXOBlhWTDa8GpYgpZ
bEEBknZaCKq6yHX1gxKfgb57XLjpasZAmX8q5wMsKyYbGzxdL1HzKKgORcfQ8wnVc5qDneVd0oOe
g5u3NM1fV1X1Z7UydI53KCOKSg5z7offKA2rztqj7Pp25pl9ujvNa1ee+Hx0Rr5z28y9nPtkNkDH
XTtQZd1Oc5sxYfn5u19Itcx4u3bKDMlqb7e9VVcNzVU4PhznjyKqmGVFs2ZzVds1BzVU5qsdYr7c
yq7noMm4r5+e7MfpVlBnRmqpjHV/O5rv16nq6rqm46Cpqec2R3HHVdqurN1UxqsqIaqEsVBVvMuz
qYuag2a+sVqoj7VJ+tWxc/PlDzY4j1U4qphUVdlXFKXO3PcdV2q7FVpsNccdV2PKrqqsrdVMYojX
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
C3DLDLDLDLDHDPDBDrDjDODYeIZ4ZIboeIZYY4YYcQbDxDBDrDZDPDDDjDxDNDdC3DFDHD1DFDhD
LDfDtDJC5DLDPDHC5DLC1DJDhDJDLDHDJC3DXDJDtDHDHDjDjDBDjC3DHC1DJDhDfDRDtDBDHDHC
7C7DZDZDNDJDjDjD1DtDHDHDjDjDvC3DjDxDhDjDtDHDZDnDXDZDZDdDFDHDNC7DBDtDLDPDbC5D
NDHC5DjDDDLDNDZDDDnDDC2DYZIa4a4eoYYZoY4bYbYW4Z4Y4bIcoW4ZIbIWYXIY4cob4cYb4bIY
oZIZ4ZoY4XYXIZ4b4coY4XoZYZIb4aIZob4docYZIY4Y4YoX4YoXIW4Y4ZIW4Y4cYY4b4cIW4ZYc
ocYbIZYcYa4ZIWYYYW4YYZ4ZYdoZoY4XoY4YoZ4Woa4cYaYXoWYZYboY4Z4c4b4XIXIW4YYZIZoa
IZIZYcIbIYocoYoYoYoZIZIZ4d4doW4W4boY4Z4W4doYoY4bIW4cYaId4a4W4bIWoW4Z4W4doXYa
4Z4a4W4boZ4YYYYa4c4doX4a4cIYoZoW4aIdoYYeIZ4bYZ4eIeIZ4YIa4YIXIbIZIY4bIXIZ4Y4Z
4doYoXoY4Y4eIXIY4Z4cYY4bIYoaYZIdoZoYoYoZYd4cYYIZ4WoXIZIZIXIXIXIXYW4Z4TQBCfCS
CITQeA4TXiEmE0HACE4EQnQkwnwqgkAggEAqE2E6E2E8EgAAQnwpQrAcEAWE0GAyFQCgeFIGgQGg
wGwkg0EAABQnAYEQogqE4EgyE8EAABgQGQoQkgaEkHQsA4FAsDg4AAiFiE8GAAEAgEAsCQoQoggG
AyE2E4EAaEkGgCEkGASFGFKFGEmFIAQogAFgcEAUAQnQkgAEAoEAQAQnwpAYEwkgZ4BALAAHAkJI
MA8JIBBsJIPAAEBEKQNhJhjBAEAAMhShUBcKQEBcKAJBMJ4JAAHBgAA8KQMBQOAYLAgHhNhShNhS
AEJoAhNAEJIABcJMJIFBAAAYIAAAAYIBgHA4AA8KADhJAgBAAOAAOAEKQPBgOAAFAoAhOhOAgJAA
MBsJoGBgMBYEBsKcJIAhOAgNhTAEKgAhPAgIfABCbCbCgCYUISQcCADCnCeBIUQBCnCeAYUQIBAI
9gQEAYCgEGA4GA+E2E4EAuEkGgCEmFMCwogwDwkvAAAgABcKIAAAAhOhJAEJsJoIBoAhXB4DAELI
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
zO6OgxlBTj/ZeuXdHQY2BvYvR0UH7wODlPJUJdHQs6OhdhMJkT4nz3R0Xi4kdHQc2R15Ex8hn1QZ
0dHR0dHQoGFBHhoNzZ0dCXo6OcB0dC9cu6Ojo6Fy5cu6Oi/EdHQuXLl3R0JejoXLly7o6LEizo6F
y5cufosTdHQuXLl3R0WXN0dC5cuXdHQhP0dC5cuXdHR0dC5cuXdHQizo6Fy5cu6Oh+joXLl69cuX
oNzHpTUNQ1TVzeazebUAygGNSw1uhyWLFixYsWLFixYsWLFixYsWLFixYsVQipFWLDo39HQ0GVB0
b+jo+Q9HR0dHR0dHR0dHR0dHR0dHR0dFxbWdHR0dHR0dHRvyHR0ZCnR0dHR0dHR0dHRmejorTo6O
jo6Ojo6OjoZz0dGAwXR0dHR0dHR0dHRp+Ojop0dHR0dHR0dHR0cdHR0dHR0dHR0dHR0dHR0dHR0d
GW6Ojo6MjkejoyucVBiof/z16Og4tXQoMcGE31QN99HR8Zvo6FAgoDTZkMDjo6OjCdHRgcXjOgzO
jo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6N3R0dHR0dGXx3R0T5fo6Ojo6Oj2+ejoB5dHR0
dE898+HRfNvR0W2229HR0dFtttvR0dHRbb0T1D0dHR0dHRSJOjowH43o6JeejobuC/R0Yivhp6Nu
77zebbgw8dGwjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6P
3ZX66Ojo6A6NsdHR0dHR5ceHR0dHR5Yn12dHR0dHHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0d
HR0GD0dChWWdHRBdHQRLA9Egf3o6KdHR0L5mF8/Pxu2fEbz6dEjAcMDGyk3R0XuTbvMPA6uWo5Lc
XxKG9VB4PLz4hbe27b14eF7tmtFuQpTIZDIMp8/Pz87/jo5m37+HqyOGUmC7ea7p/vjhy5bCUNZm
h/adFRQMILo6OhpVgAEoUvR0cwl+eiqJqJaXuVmqlCPQHoShK9teXj43rIMkyG3IaJPn5+fnfvp8
dHx8XqWnyLoYD70dHN7mtEiGLPysdCUKJnB4a/CV+J+iWi1HBIt8UcB09FfH80bZte7Tyjo6IQ2f
5vbG5t7f8vLx8dvFN27dRnz8/Pz8fHP+z43/HygFGCDj6ydZdoNCVs3RTQF9+whYTNdMhxrm28U6
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
fn5VFCo3+flUZKhn5+flRPqJ9RPqJ/5+flUWKiz5+VRsqOPn5+VE+on1E+on/n5+VRmqKPn5VG6o
u+fn5UT6ifUT6if+fn5VHqos+flUaqjj5+flRPqJ9RPqJ/5+WYH5VA6oH+fn5UT6ifUT6if+fn5V
A6oH+flUDqgf5+flRPqJ9RPqJ9UI/PyqB1QPjcOqB1QPgVQ4qGlE+on1E+on/pUZKAJUDqgc1lAm
qB8gaaoaPRRPqJ9RPqJ9UDqjH2xuNMg1MbjVAQqNFQ4on1E+on1E+qDVRniMbjcYoB8bjdR/n+on
1E+on1E/8qgD5xuN+fnG435+flRPqJ9RPqJ/5+fnG435+cbjfn5+VE+on1E+on/n5+cbjfn5xuF+
fn5UT6ifUT6if+fn5O3Z8/OBOD5+flRPqJ9RPqJ/5+fnyZ8/J44X5+flRPqJ9QFqAsq6c3m82oC1
AWoC1AXm83m82oC1AWoC1AXm83m82oC1AWoC1AEEizeb2bM3m5+ehQBKARQBKALJZDnN5sp83m9O
U5UAigCUARrltfN/e3b1dXMuN9cEb5plv34LBYLBb9+/fgsFgsFv379+CwWCwW/fv34LBYLBb9+/
fgsFgsFv379+CwWCwW/fv34LBYLBb9+/fgsFgsFv379+CwWCwWnEYoycFgsFgvWX09sFgsFgsVhc
R7YLBYLBYLXgdeCwWCwWHMfx34LBYLBb9+/fgsFgsFv379+CwWCwW/fv34LBZrBb/jhlJAAkBxxw
ySULa+ezZs2bdu3dt27t27du3bt27du3bt27du3bt23bt3FNPy2flvRUerqvuDKHffZfMb8qDVrI
deCBneadHRJoFZ4+APbTplHy8/DxBxx6yyx1dXR1dV99XV1dV99XV1dSbq/hwEX3hcJiPfVv+tzN
Hx8gBWT19cJx4dHz8eO2b09vb18sN7+nzv27PAHv7etcLJN/T7uPB/P137Pr8wWC1SN+/ndhcPwX
V1dXV1dXV1dXHV1dXV1X3fern/vvqnyDag6IpNlP75y1Oifj/yWX4mzO+Zwz9GibK5On7l+j+6Oj
f9c/O/JMo2fom/8n+/5bmdXV1dXV1dXU/V1Xx1dXV1X3fb6cBfd96/Dz9cdx0YrHyM8tPjq8cBhD
D46MdhKOD39/PDGHowWrCL+jDeGzb5YXA+ft76fHd+YPAbfjBYGT20+GnCSeu758/Ganr5ydTj1d
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
fznX7bZ/0wMyWezH/PgOjyl2fUeXxlqB6POknszVNt+f4DY8fT8yA+WQBzxHQOvYHw/sJ8XvXhFe
uiM5htnRX0+nDSb4aDfq+PA9vHy1MZL6S5Do6FkuZ408wQ/xYrovYRiePPRWuz3p0bJ2dG30+9Zy
SIuArzYnvCd7xcl6BM/Rzs1/Gz/l1bYBO7ONmnjJzYHB7d/t9/myT5r5fM/t0E2Vd8TTatv7VvR/
fLUM8shhmg4D/eHxhMlhb0Rjs0Hb/9nZ6RwYfZ2dEZrDXnE4hNkMXmPY7OzsPMyMQSXs7AB7Oyoj
+5KU+lAb2WI7LUdGrJh/8b2dnZ2GFlvT3z+WO9QD9nZ2dl5Nk5VQnukZ2dlwdnYdmDvKXs7Ozsvc
7Oy89nZe52dnZ2XudnYjs7L3H7EdnZe52dnZ2XudnYjs7L3Ozs7Oy9zs7Ozsvc7Ozs7L3M5g8n2d
nY3s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsVAcnYcv72dnMkk3Z5dnvz2dnZ2dnZ2dnZ2ccdnZ2
dnr5+Nezs7OzRhqA7Ozs7KSZH57Ozs7PjSN8dnZ2djezs7Ozs7Ozs7Ozs7Ozs7MV2dmazPZ2Z7J+
XZ2dnZ/fB+9nYcPv2HbpyJk9nZ2dhlZfI9nZ+5Ts7FAQcuR7Ozs7P35l7OzoxHZ2Ykw872dnZ2HZ
2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2SdnZ2dmAyoMN2dnZ2fXrPP2dnTHp2dnZ2dnZ2dnZ2dnYXZ2dnYP
Ys7Ozd4N7OzR2dnPhHZ2YZuns+dfy/3xJ2cF5dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ
2dnZ2dnZ2V21m7Ozs7Kj8f/Z2dnZAPHs7OzswPl5bezs7Oxizo7Ozs7Ozs7Ozs7Ozs7OwzOzsXFS
tB7Ozs7OezgcF2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2U7Ozs7Ozs7Ozslp5CA
d7Nga1K+pPCyShOsnoHomZ09HRx0QGlK89FR20FageatW0a/ABaumX9MVl1eQQ7aUn1dHRXRwzyr
0MGglHREjS+JF3PR0SD5dNdjIImS15pfXFgCdwaK9E/R0D0Fzrp0dIvxNwEmeQi64ikat4XdEnR0
QGX68N3QXRRZ0CBs1doGbZtOhrWWk3wbDNmhszJGN2eLH46Ogg9GwvHoXM85mdJX9NPw3SxeJUgP
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
xrGsaxq2ratq2saxq+p/1bVtW1a9qep6nqfLd6tq1atq1G1PU9T1Cf6s0d4hubP2WwP7Uv/s2bNn
///s2bNn///s2bNn///s2bNn///s2bNn///s2bNn///s2bNn///s2bNn///s2bNlO7ZvWbNmz2cZ
CzZs2Ym82WbNmyl+6jZs2bKTV79mzZs///9mzZs///9mzZs///9mzcs/MigZFBGwgiiihYMYxjGQ
wzWbNm1Zs2bNm1ZtWrVmzZs2bNmzZs2bNmzZtWrVmygigiiiiiiii9zGKvyi57k5Snoj7e8D906V
zFfTyQT7uR/KdH3J/fu9/S4fmj1vqO2xk/0s306ydJI+Tnylnu5c+kf97/+Of9/qoupH7iqhK/dr
s9b2Z691NR/5B0Eeu/ZwZFF8Wt8d6ipR6lBF/IcRdYdDDn/UcfGskMOZz3O6g/0+z5PKSU9nP2LO
T5/9IgfJ7pD1EI4JJn7OaO083bx8ppUfld7//vu6kfs1R5HBurHXSM4l8IdIoWEEH5oYN10IgY3j
QbBjEMdHohX/p99pfu3UsuQNCR7yZz5/kacEK/3n8nOjaOc6OLHrVk1jglOSBGf5/RB/u7u7u7vm
E85znOc5znOW3ur1xJsbNSbEkkkmxsbGxJJJJsbGxsSSSSbNSbGxJJK43t0ahqNy7duNrb73vNrZ
dS7SaWn3veaWlJJJJoafei80JJJJXb7W1ZSSSa2tra0krjQ0tTW1XLtyWn/2lpaWhpaGhoaGhoaG
hoaGhoaGhoaGhoaGhoaGhoaGhoaWi7fv379+/fvX70XsGhomw8HuydOUJ8Lj2lXk7uI/cyQT7ux/
Nyj7vv376WbnH88O6I13qEHP9I7TcjJ0kjn7PlI/d679Pv9//+Of9/qovJnSiqhNou12eFLyhjqY
j/yDo2EEiGD4MjYc1vfH9UU9jp0LD4Q4iQM6GH7/UcfGtEMP0/d1Kv9/ud9n7lNN0uzpTk58//cr
s575D1EI43Lh0j9f7Tzev95uJx3yvd5ykleTOkav4sm6QtIIWCJnc2EULKNlBH3NE3SCAiBuvG/1
jrogbruqj/7iSSf795PJ/EOoS7aLnfecnGnFR9LOX776YD992DIzZsmtSnOSFTk/6IPmKN7oxjGM
YxjGMbQUZt2kdA0HSNARRRR0DQNA0BFFFHQNA0DQUUUUdA0jQNARRRs6JoT6Lo1q3bs6DoH///oG
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
J9qOo6jqKKrJUKslVkxqOo7rUdR+beqslVkkMRqN7xDcZYElWSzNmVarJVZKrJVZO3FWSqyVWSqy
duKslVkqslVk7cVZKrJVZKrJ24qyVWSqyVWTtxVkqslVkqsnbirJVZKrJVZO3FWSqyVWSqyduKsl
VkqslVk2bWjWVWSqyVWSqybHmlVkqslVkqslM7U3KslVkqslVknt9dKslVkqslVk39RILVZKrJVZ
KrJ24qyVWSqyVWTtxVkqslVkqsnbirJVZNKslZTr2Dex58e97D9dddG66Ie973ve97z+87+95/P7
3ve95/O7+9MzPvTPnmuKCM2ROJAfhTn2Igg5uqxaNGPI8fVwjhjcDIIP48RiTPHLHPlWd1y+89+k
h/OOs9xnCCSXHtD3ee4fg/Kn8I3VzuSSHnInup+sGp8d7uPO8+693FcMdPOH/HD+Xjq3ievxW6Oe
ccuR80flY6520E+7veCHAnxg+fpJ+7h3fKH4//OM+c5DB04rh3Gf4S92l7/7/abmTTseSP7/Gcd5
6yl057yWYgBzzPjiIdk34JoRGU4fc9cz/o7++Q/4fI2fQQ7wY3iHKEZzRBD/KpRk3DMWDRRnzz8b
7/6U9+5i749xy/geMQfM5xtzzn54S6PtjNy5n9y5cuXLly5cuXLmL28garJfyrJdVkqslVkqsl3d
1WSqyVWSqyXd3VZKrJVZKrJdVku6rJVZO5fcy493L+9/KCCCH/+GJVkxCCCCEQqyVWSqyVWTEIII
/pVkqslVkqsn/8TSrJVZKrJxjGFWSqyZ9jD+3Q5AnjnOc5znOc5znOc5znOc5znOc5znOc5iIjOY
jOYfijYm1TiRH7hOfYgh8g/SFYt9RjyNPXCOOBDIIPjv8Yk0csEOVZ3XL7yl4gQ/kyGUozhBJMgk
j7vKX/cH50/qN1dSkk6OHInvJ+s9U5kq/h3n3WO/1xwh6cP//D53hBgw/X/1XZ5xy5nzXfKyhzto
3O7veCHDjHZ8p3MJQ7vmx+M5Pggfz9kMd3P1x7g/zJ4STxnLR2m/Vy5awmf2eM4SOhlPr3d9PMf3
D9zOOxJE/cbliP5u/9uUCHf67f2SGfD5Gz6CCZjdeIcosSeiFjPOHsT1wPFnqKM+Zx19/oKUsc57
4pfrPUmNB3zJ8ENuY92QMmh3tjBO1bl7NmzZs2bNmzZs2T2xvwVZMZVZMKslVkqslVkxEQqyVWSq
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
aRRJRTc01BoqALRZtS0ahKJKJKJKJqeeioD9FqNBRJRJRJRJRRQZQZQJRuizOVIUeUSUUUSUTso3
FMVPoqCsokokokonRZdSlElElElElElElElElElElElElElElElFFElElFFElElElElElElElEFE
lElElElElElEFElElEFE1lyiSiagaFahqFR+oahqGoahqGoahqGoahqGoahqGoahqGoahqGoahqG
oahqHbYp8p/RUDVR6LU0WXotDRac9FnFPlP5hT5T+aLT0WnotPRaeFPlP5VDbotPRaei09Fp5ovb
RcuZouwp7NFp6LT0WnotPNFyaLrzNF66LqzRaei09Fp6LTzRdui5MzRfGi8M0WnotPRaei08Kb0X
VmaLx0XZmi09Fp6LT0Wm2tmFPlP5otPRaei09Fp4U+U/mFPlP5otPRaei09FpoMKfKfKEKBKfKfq
UoAoPRaei09Fp6LT3qKiU+U+2qlP6LsKFKF20WnotPRaei0yganqPRfWi+iiqk0X1ovooeoygtFp
6LT0WnotMoEoQoHRfWi+ihGrRfWi+mvRYFQaLT0WnotPRaZQ+aL60X1maL60X1mi09Fp6LT0Wnmi
+tF9Zmi+tF9ZotPRaei09Fp5ovrRfWZovrRfWaLT0WnotPRaeaLu0X5maL60VQTmi09Fp6LT0Wnm
i/tF75mi9dF9ZotPRadT1OUvVtW1bU9T1PU9W1bVtW1PU9T1PVtW1bVtT1PU1R8q2ratq3lR1HUd
R8q2rcq2resFR1HUdQj6tbIoKONilUybGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsb
GxsffpdbGxsbOxpNzY2NjZvTptrY2NjZ3+ybGxsbG1vm2NjY2NjY2NjY2NjY2Nkmyg0UaDRRaGmj
RaGii0UFKFDlDKqbGxsbGxsbGxsbGxsbGxsbGym2U2xsbGxsbGym2NlNsbGzve0qXe0qQ6rUH09J
oU+qaYbt+bNNoFVc6q2t06qpTym2t7YrTVqnenJXtGW17qSqhs+hVVLl0H6poSVVpPZJpQUbmrDd
TZoy1VH6+Ut9pXu89DemrLM8Toz7SlcpYo2K7zkKIQbU6e9UKD6LWgoNlKu21R6BAgaFcp5LGpro
Nk2xtucWia7U1VROFUc27QUbGx6nMUGnffedG7fRZvvdGjP2riBWkgxWctrm3tra0yn3fJ3N277y
oKDza10ZioW0s/UFBpeRzoNNJWip3GjanQkgpqXyKqB+k3y/Nl3tqp9B7ZTQfz5b00H0aSBBOhTr
40TqibS1CNtfIVQ2NinNqc30W26D/2QXdy2qGV3dylKV3dylKV3dyqGUrvlaXFJKqqqyly722VVV
V22u7vbZVWe0ru722otCm221GjRo7bKbUKClBTbZTZqa2tra2tra2tra2pqa2tra2tqa2tramtra
2pra2tra2trltts0tO2zS07Z2lUXtmk1KfVbYKoVko12gVpZ2k3t+9V0542N1UNirYrVW7Zsr1ok
pzehtVTY5Rqyny6KCq6G1JWm9mzUKPN6Q3obNGcpKIFsp77Svd54b06W2Z4m0b9pyuW2UW2krvtb
QgQbNjYrVSg9oqFBRbKdduqn0FoEDVSynm2NdQIKDbu2tt9n7VP6ga5PZ2dTAAH///////////Qq
ACXuAgAAM9OzphH//////////////////////6rcQqqSk6NBubXmzcUWpXdXdo5x9FiqttFHfGvi
ClS/FZy2udUNrc1bT7v2dzdvk+VE0PN1QtMxUbeWfqKi1vDdoaqVJooTxpUbKMkDZQ5KNKSD6dU7
fijI8g2qv0HtzYgyXP2VbUGNFPxvRbMaZ1Uq1VDYuoeQqpubVEElG2YRKKoIxVQZ3s1arn3veznO
fe97Oc5973s6rnPvZwn3qu9GjRo77z71VWjRo0VVe971VWjR2V373vaSra206VKk2tra20qVOk2N
lNsp0lad0FFFKCiilBShQoKKKKKKUKCiiiiiiiilBRRRSgoooooopQUUoUFKCiiiiiiilBRSgpQU
oKKKKKKKKUFFFFKCiiiiiiilBRtVVtrFUSKA40N9VUGulSaSqLRVbZUdBvb2igdBn8yOP//Rv3S8
oiqWrdBfoG1qaW3BUe+ygDsbQVS0UarVamqq2yjLOXRpzabmgU451Btm+yitUlEym1NCtMICh5FJ
1A1N1UFDhtlaKff7TotG7eUNUDeUBQb22pm+oKpqpRRWFQN1UFD1M31FTb6gezv6ACBA2VJUH31u
5KYp07u41U0lBN80TaUFPJClPkldqFtFQbXVDU13OhS5mDkaLXR2FKg0BSJQU9kClkI1cvjS0mUB
QEtuSlQ+W16MkglEoK4UvpFLFIIKTZjbxxWqKTd29xlNWlu31WUk2oqTYLQcpBv3pW558qmk31e3
UvpN9MAbClVze21SgtApcykaob6qbaW6X6U44BDZTbL9fz3V7To1Q5Ehub07qhtQKz5te1zb4Uu0
u9tV6jt1o2QpXebILtFsptbY2Ry0FyGyFB6CgEHi9tkSBpFoLQca2zxd2g7T3bmyoWtroNtXxu1Y
DlqVCUFUHEE6d9sYgQclsED4pq0fVRXbriC5S3qlpqCio2twlne9ur2tSpWm7u0HEFQ1O1gwTlDJ
xVnTIhBULS05NUe5OdOqKEutzQL2vbLaFKpb26lRqejx2jk96pKRqnEDit5Ok+07zbKknjb2+FA1
fVTerRaaFtNTN86tb0HaoQVS2dbG9A2utEaW3CktptLRlhsbUE6VDmzRbR6AoFBuEDc1VA08b+Yr
vBBTa5VuUeILtuvLlsOVQ0K0JXtRKBUV52qaTc15cmlsqltqqi17So8m370kH4o0t6tX06LX22hv
ASsre0IKhnPfl3vNoaGl1Sl1BO/bZbttza27cCi3NtMoBShxpb+5cvztGoaPut/0mybX1hKSb1aj
aCWHQX7zeqJNKCbQ2NjRxuVoCfFG1DaD0HtDQ2N7U221Sqik0ybG1rvFUHKsotdUTaHaDTVCvCga
HKPe1a2f51tEDL3KVQTQNjW8LFtjQ0NrTQpTQXMoFBljdsbWhrbkAA57dQqgoBtnQaW++saC7/lK
hUO9UVD+NDbSqCapSTc01HKx+ckgbZ0Wid0BdJxttC2oPaLaWtS22TS1ck147xAryjJr72g38aul
A0ettWm2N7YgeaFaobGwWKdUWg62zmG6kg9AUDxub/FVTADY3t9LOUG7LQMba29qy75/5VCrRSbK
kablQ4JUmSmU1UVRUaiaqiqKlVg6cinaiKAQNJQzVUVRUqqKZlUVRFFZ9RVFovqiUorvvugqKoqi
qJpKSKSQVT2oqiqKokBSNUugpRWdRVFUVRHKqtF1UqtbaiqKoqilVJ1FUVRVFUVRHUVRVFUVRVFU
VRVFUVRVFUVRVFUR1FUVRVFUVRVFUVRVFUVRVFUVRVFUVRNbdTqyrCkasqyrKsqyrKsqyrKsqyrK
sqyrKsqyrKsqyrKsqyrKsQVZ26oqiqClay6nCpp9yqKoJqiqNAqaVNKmlTdCqKoJnMkqaVNKmlTd
Bvqkltb9AqaVNKmlTdCqWwmk3aBU0qaVNKm6Da3k06o0CppU0qaVN0KubCW6qNAqaVNKmlTdCmqT
VFUaBU0qaVNKm6FUVQTVFUaBU0qaVNKmtJNUVQ00aoqig0tZU0qaVNKm5Raaoqi7qgpChUVIqaVN
KmlTSilFCmSmWuymSmVKjqAqaVNKmlTSimmiUyUy0NRTJTOwqIqaVNKmlTT6ZTJTJJTJTOgVNKml
TSpugUyUySUyUzoFTSppU0qboFMlMklMlMaBU0qaVNKm6BSRTJJS5SWgVNKmlTSpugUsUsSUqUvo
FTSppU0qalKVb0re3lTSppU0qa3t7e3lTSppU0qa3t7e3lTSppU0qa83t5Le3yKmpCppU2XEbe3x
b29YsVNKmoIBvVfbNFwc3KVq3ffffffffffffffffffffffffffffffffffffel3ffffObb777oQ
BvvvuMwb7778A333333333333335vQ2UU22222222U2oUKFDlCkKIKmgqaVNKmlTSppU0qaVNKml
TQVNKmlTSppU0qaVNKmlTSppU0FTSppU0qaVNKmlTSppU0qaVNKmlTSppU0qaCpulBBikNqPG9qo
qtzRs3SafcpbKN01Nv9qsN1ChRo7KbUZUAsgam5FLalgUUltbRtVH7C6oujtJ7N+M21tiuT7NAHv
pyuhzvZ79U2pIN1d25XIrdFhx2nv7fT4/jqCqKp42q7PLWN+Us5dU7uIHQq3tl0qdQoL3/lUKqBt
x73v69OEqzJzkJUvsBzaVjmf+0trQZXvs6br3AHZz33yfW27QUGmhBBPO0uixJBNTlutPOQakNKX
8600EDFQ4gziBjHeUudojk6q2aoqzQ0kLVWqvduaKEN5vLTmglQbd5ZRbOL315BPnEMusTklZStT
l7DnO7bAbbbbbbbbbbbbR2lyypsJlTbu7KmlTSppU27uyppU0qaVNu7sqbMqaVNu7rf7J9gCypu+
++4LJF+WBvvvuBd3YG++Xd3d3eObKKKZmYopQoZmdotFCAolTf////Km/5U0qb///lTfKm+VN///
/8qaVN/65U0qaVN/yppU3ypumEGKOKNMqoqBopN7SpVGzVjlPag3zobZ9QWG+hRaKOym1HagEDW3
otlKeXQobbNClVfsLnVXGjbZ7N+M23G2l3cd3QB72yV0edn2e81NqSAbq7t6uRWndhx1sVyqWzg6
6gqqq+N1LZ5gsK8pZy6rVdQOhWqG26bZUSC9/lVNKhbd173sm9v7klqzJzjkqf2LcU25cs/1NtrQ
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
nN8zfffMsXifjDdoB4xAnrp6dIfh1U+veRVUqVUpVU8qp6+Y9VOj1NTVej5qqZZupqpzV/Q9VzpV
TKqmFqhs58wxojVUyqplVTKqmVVPKqeVU+qp72V1Uzqsc9VMKqb86qvVU4iqt1XdUB6CgqpzVa5q
vqyqkCqnPPfPV8dVNbdRkVVrpUVUzqux1W6uq28y9VXqqR+bMoGbnjyg1VlX89VPqtqMVVPebmqp
xUXdR3qt1UpnuOgoOaqyfLqpUqpCt83MZUG6qUbqp8dVUwqubWHw12fDRGMaqmVVMqqZVUyqp5VT
2qntVPKCq1VTY1W1Ui81VNqqdVWajn5zXdVNqrG5/WRVU9u6CqlYyqzRqsyqmNVODGiqpRqpieqm
9V49VPN89VOelWVXquq26rlWmiu6rVV2qkKq2eq3Ve53VTGoMeq9Fe6CramqxV/NVTqqxVfqplFQ
c9V3nw+Yc9CfMw2VUyqplVTKqmVVPaqeVU8qp5Vbqs1Wah81WVdznqv1U66VeZO6rHNzVUwu6rXe
q66qc1WKqZVXozRH6OqmGTMdWHqu+RHMqrN1EcfMtRc9Vir26Dmiy3Zz3d3eZmVUyqplVTKqmVVP
KqeVU8qp5VduOqlGq/0qee6qe1Xquqp3HVaNVSFVTCqmFVNKqZXVTy6qQYqtuq9zdj1U4qpS5zVW
6qc1WL1l0NVIzy6sNVdqt5VSAaoqt89BZz3dnPhjGqplVTKqmVVMqqeVU8qp5VT3miRqrPNzc1WV
W6tqarh46rmKoqM71Waqbs1W1X6qcVXcNUVZzc1V7nqu5z88XNV9VOarFWVWI6rtVmrKrNViJnWH
q9Hq7O1X1XjVdzRVN1U6q89Viq3VTiLmNVf56r9VhVXKsnDT3NFVYN2NVTCqnNXZHhqvPVTurzVF
VqqxzVfz5UVBjH5PZ2dTAAH///////////QqACXxAgAAMVjKnhH//////////////////////2qL
qu1dZz3dnOYxjVUyqplVTKqmVVPaqeVU8qp5VTWqm9Wc1R1qs1U6qpQNVcjPlVMcqpvVTnmqFdV2
q5VTPg1Qc1VKFVyq9VTa6qe1XjVUyqunNQGqpjVbdVPDVWqrK5+c9VO4qqeVZVSPV9VPKqQMqaqQ
OerqCqmVVKlXVU5qelVsziq88dVPb6VW46iqmlBUOqnVW1XY6txx1U4u7u7OcxjGqplVTKqmVVMq
rtVM6qdVXKrdVM6qcR1X6qY0FnquVbUVd2qyrKvPVcq1OoyK8yJ89VmqybKrFVMqrNVs9BQVW6jD
mj5osvIrqpp0qptVTOOqxeRKq5VYygoKrtViqmVVnmq2KgUV1UwNH1quUFX1U/w1TcVWUB6rVRFV
SlHqznu7OcxsyqmVVMqqZVUyqp5VTyqmdV2qm9W1U7qarVVNarlRU0FW1XKrVVw5qrdX1YY6qzWV
WefInlVIJ1VTSqmWZHUVU2oKDLNVnbKBKqkGqmE9VlVM6ChiqVd3d3d1XKuq/nqplVTKqmVVMqqe
VU8qp5VTyqkGqmHPVT2raqQqqUqrdVOKrW+1VOardWnqpyaqmlVParPdUVRmOqznPVp4qqQat5qq
ZVUyqprVTGgqsVUhWerNc+ZFQdYjYqqRKrKqpnVSJVh+lrBVdqu1XartTU1dV1VMqqZVUyqplVTm
qnFVPKqeVWaqQaqeVNV2qm1VM6qcVFXVdUdKrdVOOhqqaVU5Pz1bzVMV5zKrMdVnnuKJqoqpisyq
kSoqpCyOgqpvVbuPmoOkfNiuqm1VIKVVIlVMIqChVTVYuq7Vdqu1XampqamqmVVMqqZVUyq6qndV
PKqeVbVSDVT2qlKqkKrKrlW1Wqqcmqt1U5qp5VTTTqsuqxeVWY7qKqY5zVUyqsVWaqa0DqplkV88
WlQKrKqaaVVIlVlVFqq7Vdqu1XampqamqmVVMqqZVUyqp5VTyqnlVPKqbUFV2qnFVNKqY8/arqio
oKqZVNVvKCr6vq2rT5lxVZGaJ1LuJ1UyqsZlVINVN6C6qYVUxzOaOgT61UzqpsqqQanLqsHqu1Xa
r1V2pqampqplVTKqmVVMqqe1XTGzdVuqmLs1VMDXd1U1qpijVJ6Cr3HG6qdY6siVTVvPzc3MaqxV
TSqlCOqzzVfHVSnV5qCqnNVPk6qVarvYVX6r1V6q9U1NTU1UyqplVaqv1WLqaDnVX1WKrWJdu6W5
FrpQVNBv2goKrmsur81VTI7iP3tn1fapPiozG+b0YWe1Cr6uvbupSqXzhvUdTU1UpXuoq3tnZPrM
Ul67zNBVd6PrEEfnjRqre6Dqc3PVaoKvVVypqcqKqcXNxWa6tNVTapqp5dXrVRz1XvINJtoIRZQJ
VbQVfdXVdzdj0FBhqr3NU89WGoLV89BFU0FVMKtWdO9VhVGdDH0bKigqzsapquVWDLt23zxH5P8H
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
rrnTtQUEVVg8ccVQaPtFVaPFUVZVnOz0EHiqedVU4qu1ca6DpV9A1V1Tl1ZURJXRZUmoKCzVZVmZ
VTmq5VmVWartV7vzUGqCqzVTC8qzmjji5roekdXVXauoKvq2pyq7Vcq+qnK1HVcqsUHPlRVZqGer
D9Ks7xVeObKmrlVtXVNVNuY1Wnq+KoN3k6VZ02Xq3KuqpnV/NV1VIXftVtT2qp1z9ajmIuqzVTOp
oLqv9KA9VOKA8dVOaqY89TVb5jx5VZqvHqu1UzquRVXqmqmXSq5Uc3W1UxOqmNTVTJn5m1Vdypjz
nWPrWs8XkVX0FViNzVVjvnPQK4tVdVY71ZVdqxc9TV8dVMKnnqtVZU1bVfNVa56rFXWarLiqu0F1
XM5qDDZQVFTQdqCr8PVeqYud2OcpEVdBVYzpU0FBzXz1HPV/NFz1cY1BVl1FBVYORdDV/PVT7mZq
rtVupq7mqp7VSBUoytG5qrNXxVUo1UqXVSLvpUnqsKOqndV3XfN1NVM6qUajm1VTKqxSQK46mgug
znq3Kvq3nyguOr6s5qHmqKC2fnquc/PVYoLqplVtX1XD3PZd1fiqKsNFz5U1X6nuagoOvNUVdVl1
d0qKrOYjVWKioqsHqefnPdVyrzVHN35l1Pz1MVVuKpq+g56rEcdXu4qtyrqvztVcqDVWarJ+1RVZ
qchVtVjmw3eq5Xqs1XarlVIFVzUVRVbq+rartV7dVkVU3IVYwxNI26qdcxLpV+ZGqu6VfU1FVPef
mMaq1urqCKqnFVipq2q3zVUxq7njq+qkbtVlWxVXxHzRXV9SuerOeqnkVVMuarqv70FV2rDVXcq3
pmXVdPU7oM7UFXc+qmr6r1VmrKuq3noKDtEahPFVdqas5+bnq2pquxZVhqvvnqygqebsaq5VYoKm
qxVx6rneKh56rtRHHdXszq13VlVzmqzmmubmqTG7UFqrDG5qsq+gqs9osurlQVfPRqOPLyq9H3d1
XqrNWVNV2r+ehVBzLrVZdRU1eY0VVyp5o6tjqMqtVEfNnNF3q7nquGjqsc9VMz9sq+q1FU1XKCp7
ZzW6CJd+Y9VIFVMartV6rqmKgoFuOqwfKrvPnNFzVNV2q5VTKq/fNVYNz4qsiqy+eq9VTqq3Vaio
Kr9VmramqnHaq3FVfj54j1N7uoHNVYq9XUc9BVZqyrKrNV2q7U1dzNUD7x9qt53VtXVfzc0VV2rq
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
VB3oLuoji70Bk+fvzHoalxx4+e2r3u45igcWKKdVB060GUBm6tVur3zPn54zUdXUFHV1Tm46CgVB
QZcdBQVNTQRx1JkVFV+q3HQUGUFA7y+58oIrzGqi4lFHjv187ivO1AkeON0FVgyM04qmgoDdI6r0
VBQUEVRGbMoKs7dDGygoFQR1dVauPmoL52o6s3QZHEe+dGStzVBQLWUBqBc13HM0FzpfMjoMXePv
kXZRRnPZuZ0Ft2qDrhz8x3qZoD9uqPQUFBugNdDUx5Eo76c+t87Maq5VZ5qLD9zZe9UFBQXdWc8V
AzK+fvUHoauvn58dTbV73cc1QOOIy5p1RUDoKCgR6A65qqR6tq2ratq2qxVtW1bVtW1bVtW1bVtW
1bVtW1bVtWVbVlW1bVtW1bVlW1bVtW1bVtW1bVtW1bVtWVbVtW1bVlW1bVtViratq2ratq2rKsq2
ratq2ratqyreaLm5ooouaratq2rYoooqsq2ras24rqKrtX1WqqcvI6uNVY5+eoqyq8qreRx5GDtN
JKiofY6s5o6qQarEXPVcqKmOrM1VdNrnqDVZV1V6q1U1NVkxz3zR1WqrNVmq5HUVMwaqnFX1ZUVb
zOq4Y8UVVios1XR1UgVU3qznPVTGq7U1ZVtVrPar/PURVU0qsVNVPubnqyKrKCq9lWmjq2oqp3Vt
V2qxVYypih8jqyrardVO6sSqpxzVbV/TKEh5U1WarFGdVU2yqxVZqsVWsVGb2q5VlVNqvqturqqb
VU0nKtNVao1uqxzGZpKtyqm9RVYNVTSKqmXqwxsqyqxzc2qg1Q6qcXFVaMopzFzVFV81VMFmY3VZ
5qqZ1W7mk7qp9VdqKqQqqdc/e4qqY1Xaqe1U556qZVU3jq6qmMRrq+qlKqkKqm1XXVTmroqqQ6rt
V2pzmq6PovEnHV1VOqujNV1X89XVfV3Oar6mq5HU1f0qbVX1fVcq6M71zqYVDzYaj3FUdKrNVyjq
puj1BqGjPVTeqxNK7oXR2aqm3PdVMjXFUermupGYz81XGvmqeeq7HVZqOer5jI6rNV7nqtVWampV
81V7nqtVHPVdqtZVYquRmPVcmKtjjqtNVEXNjquRVPOo6riuqzVTSq1HVdqppVTi6reR3zVMeVFW
1XY+aq7VSFqojqs1fvmupyrqqa1WDZZ6rVV2qntVuqlGq3VTqqw6qYVbU1fVlXYqrlVq440Y0XNO
XU6iNdQvM5qqbq8qyp1dpXfNFFdVyq56lNRVWKqY1WOqVDQtG5s61FRVTmKKq0m6rfNcUdTtVU7q
yq1VvkdTMVWObOe6scVVMatjq8zNl1ZVtTVeq2OLZuZRR5nNh6tqsVdUZFUVfVZqs1W8qtRxZQm6
80VXR1W1VZ5vearKrKifh+cxsur46uqKqYGzmqarl1Xeao5ubD1eueqmXN7fNzVdVTqpiqsX7FV/
lWWarKvyqxUVXquq7Mu+c8WVU4qYsqKrGVHlHz1NWGq6q5V1RVnNlnq2Or6qdUeKrqqcTlWVU65+
aqxQRGyKq1zP11WqvyqxQ0cVTUxKq7HVn27obSjzIoqmrqihqs7qtVWqvqt1Y6uqya1FHzXVe1VY
qu3UVWKtqs5Vc06m7q+OKoqs1flV/mqyrKtq+rqiPnqMquVMUdXRZzLKjIqiOpqyq5V9W1WObmNH
VtRHz1bV8dVrmiqp3zGqpxFVtV+qnVVurebnVViLmNzVWjO8oYouY6qysbKjy8q6ozmqJ7JjmqtV
ZVayrZi85te5VYi5oqtVVi6rlTd8/vNVtRVfq2q1V9TU1bVlXcxquqpxlRV1W1XY8zmyKrKsyrqr
BqrlVmramrqvqt1WarNXVHPV9Vp1ddV6Lmqp1VTmq3Vdqs1bz81Vrmen5zx1UoVUoVX6r/PHVfqv
1Xqu+z1VKlVWiq/VdNQVNV+q/VTupqv1Xqr9V+rKr9V+ql6pqav5+eOq/Vfqv1X6qUqqUKqfVUp1
XD1X6r9V+q/z1U6q+q7VTmOq/Vfqv1Xz1XqqVeepqv1X6r9V+q/V1V2q/Vfqv1X6r9V+q/Vfqv1X
6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6r9V+q/Vfqv1X6qeVZz1WqrV
VK0dVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqq1VaqtVWqrVVqOq1QXHHVS7VTmqnNVO
6qdVU5nKqeRxxx1U5qpzVTmqnMcdTV1VOaqc1U5qpzcdVOaqc1U5qpyc56qc1U5qpzVTm3qqnNVO
aqc1U5peevVTmqnNVOaqc1fV8cdVOaqc1U5qpzHHHHVTmqnNVOaqc5HHmRx5NTlVOaqc1U5qpze4
o41QR1d3yrqqc1U5qpzVTmr6FVXarpj1XarvNUVU5qpzVTmqnNTQ5Vdqu81V2q6syqnNVOaqc1U5
qu1XartV2qnNVOaqc1U5qu1XartV2qnNVOaqc1U5qu1XartV2qnNVOaqc1U5jqartV2qnNVOaqc1
U5qu1Xar1V2qnNVOaqeVU8qp1U1NTVTyqnlVPKqeVNTU1NVPKqeVU8qp5U1NTU1U8qp5VTyqnVTU
1NTVYqp1VTmqnVVOj3U1PSpqdVU5qp1VTqqnCqY5yqkGqkPmurZPZ2dTAAH///////////QqACX0
AgAAPX2/oRH//////////////////////6pK5ru7u7u7u7u7u7u7u7u7u7u7u/cu7tXd37d3aVa7
u7u7u7u7u7tWaKKKKKKKKKKKKIxjGRqlUFRUVFRUVFRUVFRUc1RzVFRUVFRUVFRUVFRzVFRUVFRU
VFRmZkUWZFFg5qu5pDtRTkVRV8cznbKE5qsqv89RVlV18xqsiyLKtoTZZ6sq6r6rtRHFzVfzmqKr
nNVx6viq2rqg1SePmqyr6uq+q5VYqHUZz1fU+1YubLMbmuzGqMzoeqzVkuuhs5ubN87qKsi5oqC/
DOiqyofNF0qKrT1VtRzVblDZuzXMpg1xz1VMLiijqOae26uNFV1XGq6rqs9qas56rpqu58juKp5z
VZV0evDXVlTz1Wqsqucx6siq2ro6tqsI1TE6gzPVbNvn5uc1WVZG1HVlXVZUc12aOo5jzGO+ZqOo
q7m7I8VDQmqFdWRJ3JlRVvNcWZm6moqYn0tdah1czVZHUd6uq7nii8NHfnvaJZzc3Nzc3Nzc3Nzc
3MeLMu6m7u7u7u6m7w1o94aPnqsVWKrFVjn5zc/PVYqsVWKrHPz8/PVYqsRVPPz8/PV5jGNz8/Pz
mNzVZHzx89RzRRnqpxV1XVdV1XVdV1XVdV1XVdV1XVdV1XVdV1XVfV1XVdV1XVdV1XVdV1XVdV1n
Oerqk56mpP5UVfzeHtc09FVlVznzvlCeKrKr9TVlW1XnzGq2LObKtoTZZ6tq6q5VfqyOKoquc5qs
qu1ZSVXI6viqsVfVhquPHzVZV9X1XKrtVirHdWG56rlT7Vq5sPFFzHuI1RmdIz1WasN7robIuaoz
tUurKt5uaKgtGdFVlWOoidWVUweqrFWc1Vg1DZuzXNnkV889VTG4oo6jmnm6vi5qrlXmq9qr6t9q
6ramq+aq5U5nPcVXVJqtq+Pps11bV3PVbq2q7zHq2K6rFXx1WKrCiqY4rdQaz1UwfPUc8VW1bG1H
VtX1bVlWHuKOrKiOYx3UNc9WVdUd1HzUNDFViurY4k7WVZHVYqLiNmbqasq6J9bzrVrq9mq2Ore9
X1XKnmi8i578971cd1fV9X1fV9X1fV9X1fV9Xmq6M9mNVhru7MYxru7MYxru7NVhjXZ4zMx4446i
rKr9V+q/VfqyrOeO7qyrKr9V+q/VfqyrLu7qyrKr9V/nqyrLu7qyrKsqs1NTU1NWVZVlWVNTV1Vz
mqOaoq6rqmKpqmVVAJeubKDrdjveRHd9lVcocqsUN0CugmIOCCh353dBqq/0q2q3V9Vjm5zxxmvo
ehqam+apqyhuguo5+Y6Nh6CoNVTCrKnyq3Uqq9HFV/NVtQjVXKvqphVTDEZ1FVzmqav58qw0c1Ve
qtVdVTCpqKmgqyq3V+VFF1oOeravqsVcj1fzUNWUFBnPCram12y6rEZ8qpxQXVfq2qzVeWGq+qzV
q71aKA9VOqrxqr6qtMyMah75VlXx1U6jqpyqmrY8qsVWqipq011Yqm6BmsRnNzeUFX1U5jMbIX3q
pxznCV1djqsVU47uON1W8qyKpq2gj6RVXIqrtVOKsqt8/O6ia6VNW1adqrTIZe3QVHMarauqU9Gq
sc0UdSeKoqs1fEeKzVZzRjdAmKih3cdW1bV1TOmq/5FFVZw2YjmN7Q3VTircjq3UV3UnO+zfahug
PE4piq9GsyhiqpjVTyq5Vbqyr46FmVVnmqvVXKrPNznq7Mji51cfMeg5svRjkGqC7q3aquHqKsqt
VXebKs1HHzVXOeKrKrHObHVcjU9VcqsVdlV6rObKCqxlDQHqtXVdztVc7VMdBV91ZURmd9KrdV6q
m5+e1Qp0Fvms11aMNU0EeXHFQRqh33s8WPaurlQdXV9516dbs1Q+p+eqmHPVTiqmSPVTO6rEfZ1K
vnugq6+pqrFVyrDHoKqZ7q2oxVb3u9W9R1fUVWOeqmNVzmPGsur8Mrq2MxzRu91XuZTlSr7qOrqj
OerXQVHUxp47PQXz3kdXVPNVTPMqKmKM3e6CgqYrNUVNVMIzqrKv5qmgoI77x81VMqBKrKDKCrTV
bZ1huerY6rdVOarnaoqsLOc15V8Vmq7T74aOgq2rTK6Cgq6+aq/z4aNHV1MQugiqygNeVHOeqzVc
qtmx5V91es5qkxz8x75qrlBzc0fepuq5lBUVXD5dXGs3egur7x8/NVaiqygqsrFHV9WmPnNUx1bV
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
1Fg13zO7SqcoJvqcyoMyzzdmzrQZl1cerKtugygP3uePznu+yuZmKGaajmZOdHykOZ0DdBR3WboM
2fR+8eVfkR4s6dqEy7HS6I8WOg56FVZU7nm9GoEzc6vo5jWzVPZvniq+K4lRVNWXFVddAa77OI/Q
z5o+i535cmWo49xHkx9zmaHyu1BrpeLrVjiPH1q/usqamru1BVryq1z2bmjNFGnUVdU89WKgNlB0
zrlTG4ufqoooqCzZU2sjqM6PRoqNrnOosfSgzKC8VXZQUVAeLKA2XHo5ojdaDMPV56sq26DKA/e5
49Sc99suZmtzTUczJFUqgPFlIeJ0DdArrJ46DNx6jUeVfkR4sfSPtQmXc6XVRxY6CKp1kdW1O56J
vTNQJmqVfV9pjXaKru7fPzVXIqA/MqKpq08VV50EV32fNH0ivm5+i53u5nLXPzm7c0ckUWM8THSk
X3FPL5lxSzeXQZQZdWbyr6jnuqmR4ouY5gbjZkbkyO+aKgPz4bD89VjKui5nUR1MZ6DvUxUHSqnH
Wq9kdWnqtI55rVW1XTo1SqDOeo548qsVUwqyrOjiqDUFVqraDPT1NV2M/Y1ugqWqtNQUUdVmgoKt
7GXNVlXd6B1WRrOcx/MoLlq2rD8/OjGjYj75JVZqelAqsoebIqgzuNm5rNZqCM8VVwyiqznoO5ms
uau+zj51QJ5FQVWrvnOtXLmXmUCoJo9BMVWaszmF3/UfeKrefn5uarMq2r4lVejjqsVUwoKhVd2j
oKrNVk1V5HoKsqKqfY4qDn9oeapNV9V6rnVdi5+agqzmq+rO9WR1Z354uaKpNzXzRqz0FQjvrHzX
QXdTzVWDc1QKCLnonQVbjPQZ2dBFVl89vm57oGZH8HahMuYy5qrF1WTx1WDiii5oqmpzLquxn57q
tVPOY/Ook6rxjc53Qdj1NVyKOIxsVQ4qrka54vDRc75qrnSreaM1RHEarrqeeNncUTNVeuoqKriq
p1aUVWVFVyqxdWGoIqEx+arqDmWVWRkZ6iaqamp3QHqvRUFV2q3Vz6I9Bz8yUzd80bs1BGdUBqs5
j0FRzR0GufObmMY8bqOpsNQnqKvqsc1AazKgoD1biqphd4ao8NNRHsxj3QX15+l5VcquVdV5qir6
uNfb13zx5zRc3PU0BtmoDVYerKhHm/InQKrqnk9nZ1MAAf//////////9CoAJfUCAAAJBmt3Ef//
////////////////////1Vg0XU9VicqMuOc69auyqxV1WUFTh3UVOc0xQUDRosqKmq7zi6igiq+q
nSoLMbWHyz8/PQXFVeq6qzVlRVavZ6sqelW5FVciyPHQVEdTFdX0FV41tHOjc89zUCuz1X6rVXRX
UxLpbDPQVYa8zrlV+rz9qmJ31oI91PO7qKmgoKDnu6A1WRbioVQc1DQUElml5nVTGrqqYVe6qY1H
PQUEb6TFSeq5Vc70F3HzVXKvqyq1Vajq2p7c9Wc2oufOYyiNU1KoKs5ufmjivnupioFfOcyVXTlS
dZVlV7Kr9Vicq6q0eLpUY7y756voD4+mM/NFQc+R0EVX23QUF2egiugmlPGXWgvmk52Kmp56qYc/
eYoH0uOXnoKC7w1V+r6uqu1Wph1Z0O6tq+o7Vdz82Z0quxc9X3Fz81RUmqw9WXV5lFQmlq5VM5Vf
q2qmNROVWqut3lBH66A1Vh0GHqphQ1Hc0VpLm53VyygoIqCqzQUEV1W6r9HnNEeq/QRVYzmioart
Rz4utXijs2YtH3QGzpz6oKCgiiRsmIqjKt5qrvdycyVF45xZm+yURzq6JSTDS8GxMKYzOvO6rPMu
e48syi1V9BlWUHSreeOLHU82GP/KyM5r5o85qvyoq6gOaij7x9ldWuq4cynbec5ovI7t9L6KPn50
sZ7Oa2bDc89aOukVXWzY6m39quRUZz7mD87j3zRms9Xc9Bzc9Vwzs9XOqxQOru2RHq6pqw10ExqK
gznUToFpG5jn593QUEx2w1mvnzHbNl9pjoar7W6tqux9FVtS6s5+fdWVNSYyN4z/bebvt1NVZcxe
lV832oHUVY5hR28jvNszV1WOsdXlOY1XVBjrVBMUC6MTpKWXfT3PXMZioOd1W+bKm+fMyzKLVVxq
rKDpVvPHzG1U8xjHxZGc0V83PlRVcyrKuoDxUUffn7q6tdVw5lOnec5ovI7O+lpc9TU4soGe2Izm
jtmyLnoYrw66c1X3ZsdXW3Vd5qOM+5iPnoY91EZjnq6poKjnquGdx1e6rLdX91zHq6rqtiugmNRU
BufOadoKBaRqiM9Ts9Aeg32w1mdTmO2bL7THQ1Vy1uqxVe5+uVWKudW1PO6tq6rojYby46O3m779
YqrcbmL0qrk32oHVlWuYXPbzns3Zmauqy+eq4UqDVfVsUa6UExQLq5UWmZNLQ8ug7VdVtTVyZqjm
PVx9ndBkds+RdI6AJpe9mt88d96rlXburqsq2q3VYij50+d9bqvHjq49DHFGeKrarDfU989TFs99
Oeruc5qtaoHZ3iNFUGzmSeUGdqDOvOfMm8iqyrqiKLmNV9x1ZUVNViodSdnM+1Q63P0qT80VBV3T
oz1U3ijq2LKrfPzPdVyKgqsx5VT+M1WVdz4bvzVWKg1W1NRZqrVVOasNVp+y5rqatdWVFCcydV6q
87tVWtZlVmgyrVVp+fdTVp6mgw8WufsZb6c+ZVlRGkt88Tiqy+bKsiqzIqCq7V1XVX+9BVfzKuqu
UD56Hnq2Kq0bmDC6jKrJqrgqztVpj1XatR4+apjqyO2c9VIdXxadRzVBqvqpCu1HFVZqu1U4PV2V
WeY0VV66qUrqav56r1BVlVvKrR4qtoOnSqnNVqgNzVNWRUNWVYlQVWKsNVnPFeXVlBHlmZ+epuq7
z1dVfs/Oag544/UuyPQde8eRdTRVZfeooel81RVjuM8eVe+Y8fOfrp3kVBdVyq5lWZRd+/bnqudj
mqw0WXlRHQvoePmqKrlSaOOKpqyq7QJVZQRnq4+suLnq3mP1tZF2MueqzHU1fQ5VYqpyKr9D38t1
U1qsx81RFUdYj0JrPV0d1Yj1OsfPVtV6rKqaVWaCq1Uvnqv1Xu76OqkCMx8qKmh5zipNVlVIVWxx
9KmoqudOar6r3vagqsVUyzOegiV0NW0DVV2ranKBN3zXV+c8UVVyramq4ezR1NRzq6Cg7mjPzZzc
x+tVzoc1VirulVyr++O8qKrFREt1Wat5qr8dV/nqEeKKpWc/Sq3VkXMeq7VTiOhNVYqzKrFBU83N
3qKr1TlV2KpdW3NnyqmHPUUFXyZh6rnOaq5VlWXFfOrM86NVZkXPqgvtZ+Y+z5URx1DfXmNErjqp
Qu6rFVu/boOaKpiurzRVWatqarlVPqqZ1UxjurquyLKGM1Vnm546kxuePtzXzmoIqsq6gqvczurO
nNQc91U6oFVdqu47qt1bd77qgyOOqxdXxVbVZquVNW1XKrlWRHfNV1XRdT3m3QPOarD1c4zGOc/N
z7qsVdVkdXdIHMbm7c/PVTh1WqC7yrFlTFUR1YeqzV9Vmq+j1WKuiuPWZUc9TZqnDc9BFQGq6+eq
7z0FSorq2q6sNVd56uVAvavNHlVMOapquLvVlWVXKtqanI6irboXQKPmyrDnMbmPHVnSpqyrtRVd
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
I+eLKAzoKA1BVxqC6Crqigj/49BHQKgPfbeXSRVZHP8yNlB06RypUBjGRXvdBU0EZHmz5eo6CLdB
fc188fOfL3OM2zUEVAoh0VVMI6nsfKr91bQHidRh1URRKPKCzXL0x46rtXGm6DnoEolz4qCgV1dH
hri5qmr7WR3h+l3nPQR9OsWZeXHl9zUANdQe6mpygquc97jdVjHQWjRVNo1Bz86vtclx3Fz1FXXF
z0Cx4zXdAjGXV0F0HW+eboOZyXG1Fa5jfOaJdefpQOKKp71d5VTmPpuPm2mj2zRK7MqC7joOaLyP
JzEusW40qCgw3OdY6C9K+eM/w1BuWthuegN3sxjc0Z3Qc3WTmv6KBivTUGcy6qqmXPV3Y+VU4uqx
QRxXUYdVZFzLnvKCzXO9cZrqv1eaioKlLIlz5lBQI9Xx4a+aoq6q5esjPkbu856Dn6xYa8uPL7mo
Ga6sjurquygqu899ud1WcdBapYuapvDLn58y+1yOO+bnqKvPFz0Cx44rtqKJdXQXQUF1M3QVFxzN
xvOZVBvlRFQUHXn6UDi5qu71f5VTqPpuM1RtNqO3FzKgOcyoLPz0FRF5z5OYl15u3OsoKA0UdSdZ
dBfRH5+c7NQblrYbnoH0N3uKI3NzxugqIusczUWZfH0oEK1Rj5zn9vmjqYqrHPVlXTHPURTvP5V1
Vv1MTmR1WartWVX8q51Xqqc89WVXe3PVbqu1ZVcq91dURVddRzHq++aqzN1fVtXc1WV6rFX67b1V
dqKm4qruUFBnbJxVX6ir6rFWbdSarqrceume1W6viNzzlTVYd4o6Rd4riuYyzUJnVaq698SPrVdo
qmq5lBV9RVd56COI9VkY6rJ6iqmJvKutmoKCKOKqmVTs3Zxo1VuSrqrVBQHbiv2+eq04o6ip56sq
bjqsX8Cqu5z1WOeqmNXc3PdDVlW0G99VVaq2q5VcdWVZV1WVFTUzlWd5ir6idqy6rqq53Vbqu1ZV
dqbqz5dWTH3Io7q+jNFlVn6erKuPiiq6q1Ved1HMY7qp0fVWVj1Uxu6mr++jdvFUVbVmd2bniPQU
CfPEegoLygVV55QXEfmn95VnMfzGeg5uY7PVlXGqtVXaiq9zUC7VPNFM1XMuLdVMqrdXm56vqs1Z
V1VqqmVV11FTUVNW81X1ZHzc9VznqyK6CgqarfaPVEqqcUFXc3PzHPVY56rVX1U0qeY3PU1ZFVcV
V3dWfD+80VV01FV1TEud80fNV1VnmiqvOrqrNX1dVlxxPtFV1XT9BUVf5zVFWRVPNVx6iNVfQVc3
QGoKOpoKqcOoO6mLn5ufXO87xRc8dBUTkWo5asoKmq9VjurIqrE5VZOdVbi56rHNVdq5rVBFOVeq
vicVnzmVVyK6CqxV1Vvn5pzpfPVZq+r6rHtW1fVYjqyp8ypiq7rlXGqOeq4+1V2qyaq9QLn56toI
jVHPUd26m5h1dVZqarhouhlVpzTFW1Weeq9dRzc1DEY1VOKr9TMVMxVlVMMtZzUeVXqsiPzyRVfv
nq+rarsVX1bVcim6tqu5qro6squVaa6j46tqbqDm5uZdYuar8Xbsepw0qyKq9vmoOep5gacqsVNR
VtBVd9qphV1WR1WFEfqfKmKq9dRQUGc9Vm3VZqvVdVtTVZjPoc2GoOfmU5VZuqzMG586X8qpnH+k
fNVcq+rav5quqt1fVYquVbN1WaqceR5Vciq7mqasqelQeoZlVaqT1FSbtV8RrQq/pFzLKr1BUc/b
t5Vxri6Orol5Ve56soOarqrmVdVfqsOoPHQVXaqYRVdVY9oLeo6uvKr1RQUEeXVeqs1WquqTm6H5
qAZz89zFVlG6HPVb/3mo6vqt1fVZqfarFX1bQ1XKrlWXM1XKrFX1ZHF0q6rYqhVac1S6rVV3sbmx
UFV6rcNz1Hbs3Vaq5RVPNlVznyFVyYqtVXDXdWVPNeVUyqpQypq6Oq1Ux44oz0FBlVyqxUd85zVW
6qfVUhVcbnqsVdV9VjOeqmtVODmiqpxhHm5ueo5+e+eqmHl+i968vt6HUT1ahiqEY8VVPFJzR76T
WFHFOc0844950bvec+opi6rxt1XDDeVtaehSqNuMysJK6CgU5z9emz1HTw+dOe+fpVZ85j3zxc33
OarnU1ZlW9qu5rw6qcjqt89R2TR1zXzZHUKq/d558qvXU9lHzOKrvauP7FV9Vqq6e6yo+aOg10dS
ac6Vdjqp305qCKgpI6jOer+124zVWarsfNVejWtdqP2ruhr9ygcxfNze93HV+Vdz1bV1Xeyd4qiO
OoqbiqNZ5VYNs6NVnbnPz1U55qiq5l83PEf3zOZ0McWVdUVFVirMqJ/yoqtVGps7uOpj543z1M3V
1VOexaR1J3lBV1X89BQezFTz1U4zIqiow1BQfcqsJ1W6iW30i5szKsq73yq2cjHU94riqvFs7R89
2qReZURlIxzmyw0ldBQKKcqetd7PUdPD4fpz3z9KrXnNHfPFUUaqyr7q6qwaqwqv5ryOSrsjqphz
1HZNHzmuoznqyqnF3i+VXsup7KPmcVXzlX37FVcqt1Xj3WVHURigfW6uNvpV5nVT3rUUHNQLnqw3
PVc73bjiqtVXY6iq/z49P32r+hr9NQOYuo5ve9x89VzKrlTVYq+r/ZmgiqyOKOrKuvmqzWeVWTm2
dRVb2546mqndRVlV3LqOfmOvDVDoY5Ysq6rFUVWatyrN+VZVTCrNUUbuOro6mN1NXe1fVTvsWkd1
dZ2agq+q5U0FBqYq6pqp0bIqtqzDUFB9yqyvHVTGrN2+kVQY2VWI6v9dVMo1HV1BFfNVTh535+e8
eWmldX8wlIcwa96bWSm1h73iOa+5sP06cx6C1Zo6I8ep6eosfeOd3FGZYc/Yxzniod0ETV3c5QIy
dV++eow9TVxzd/JhDmPFO2fq7vJTe9+l0GSzGLF1d3ugoPZLuPKCpjN2yKPLxRmuz1cunbn9q6qz
iqu5dBnQ51nTdWVXL75knS+08e6vNflm5neant506UKvOfGeKaDnusWzTm7jZpJnRs70UzuYc6ZU
PPuWNXHlBbT89zoqA3PPXQuh54qmYeYrlVxdqrXN16RXVddx3cXRNVWKv8zJrtlDFV49q0/N4qsz
Ltmq+1z1U5qYzVGM8VroaZZnUUHXZqE95Uzs1houbm5nz3Gc5sUWT/P2iO447oDR8/PV9vmjuO9Y
azajiqeeLmuJx1Z29mV703FNGvMs+4nGozX2cxQ8+GN1ug8a1Hz1NxUEUxFQWfLtVZGbpFVYqsR5
FUVZQ3qIxozRYa8qu8+RHV4aOq3VvVKgP2j6UFRzas+8u1lTqr+fIuiNZzLt5a5nQc1nnbqFHOdT
c+K7Mf3I+YzXMdM95s11duLsapNz5h8MZ66qM8dBcVV3p1tTTzn3MZeN3QWfLxUHNMu6BmOLcVQo
9X1Nz25xmvLtXnPO+6aXMfD5HZjK4rzI8zXaiPMVbVaqTKgV3zGmquqs0E1PX1vN47v18/M83MK6
rvNo5s3dxxvDdOfmxZGnkejdD1XIzO8WbUc0e503Pzmc9nTLPeHzIuf25jo0fm5jmjzTyJXl9ojo
6T2aO6KYNVZ56BUDiqsm7c2+aq3V9BPZeRXqdu3Hk5u6iq8aOfyzG58q7RqjI8UdW9De1XHlnuan
T3a5zGj57V3nW+ZmTt83aM5+aYW7Nh7yLtztYozM8dEdUDoIzZVtnoLPVlVq5yrubOnY1Vyq7UxY
Yx6mrqrnP3bqOaLVFVz60FXVUzoPFQVW6vPUc9JZr6X2wRLa+JSqd8tVZEbw1egyKk1h3h3guCDE
wO3mdFUXUR4Q9cpx4MRk6DKG3zVd0qIj1FAuh3Vc5osmJ7vrmBl23NUl2u+355pdDzdAbE7nLtmc
1rmz4olaGOdxZmLI+eJSbtzEsSdT5HnNM0hueoyO2nrrfQ11dV1BeTjNlAoj1NXRXObHMQ7dT5Zu
a2fs6sXaZq89FQUEdqpyVyKLzv1P290sl7X2pMUx1mHTWpb6/ofWc3NFOVPQxtHcb3V91Z2RW+0u
6+RRY4+eq5V3tQr2c/psiiqsVZfTnkSmGrrTLt5zc2X0Z3M1fGqJt1xJyradn8WBGVigyhO+ar+l
Wcxj1ZQLod1XaiLNT3fVQIs7dpp3d5321pdDzdBFidzl3ZnNa5s+aUSOhjnTLMxG5+fmUna7UsSx
1c+fOaZpDVNWZzno2r11vpEer6voLzbizD0GRHq6r4rnOwqK6oDms1QeNx9nVudpmq4fVBQR2quy
W95zed6A/felmna7SYpjrMOmtSnoP0j1lRURTlXKI2o3G+1Vy6t7r7faXe8iiM+epqvVf7VivtHH
6bIoqrVW30qZEphq60y7eVFRrLbuONzNVznplq26R+cqOvvaNF6L4nrffp37Ysy7vt3aqsb8s/SP
orXS6E9B33l9zZrI08yPs7tR9u04bFFkXaNxrpd0Vx8zNt5p9ci7IzOjrnvmi67qyg0oqBXcR8O8
s75vbmHQdcqOlQ4nug6nqDdKA9XOM2u+aiznt91lRl943QHu5lZkzj5lukdo/We67s/PEZpXdXZ1
oenW8WoqFKg6UL6J0HSoyzXcdB174eg7xZdBQUB896c988Rz53nbec+Nd4sioVml1dQbV1GVPNMX
EdrLNhj9kroZp9W7vnd5z9ZDVdRVWHo2R7uz3md7i6vPNdTRxq9znY7R3cXUxzRx2ao3QUHdc/Xr
V2cxje9qCbvrQZzbNdnV9ey6O79joMqM12v16edaCraG6rF+bi5sNz9We9a79KDSWb5qr3XOx6Cr
8Ou8qvDszOao6US3ep1d8no432tKLr28a1UzmUHrePMq7DXEt+t6NFGfFHFMpxe1dQXdX3nSg70B
8XfzuZTx8VSfI4s3FZpp977vt31L5cXdHjoNXFMc+eLLWdo1fedyg683U1W3Qdl0mlPTu56Ogol7
3y5jKCgR+d9T7zH3u8qPDH1QGoX38WHaNHlXxmt3epcR3FNH79zNTe+ndec3c5+s4lQc005zG5jD
5H2q7O3PEr6UEV9at7UGuiocUc33l6d7fSYoLbj65mUWXUH1nXF7b6uPI40c0R3jl1ZvXO9/LzvP
JX2ojnoDUB9qcoFjeOY7R5V3hu2VdHUX96UD1E24uepqT9qrVVPOY0fNjNGa8oKrnPUVZHzX1uqx
QJdKGq4s+MS++uaqyr7oMl577Oiu3VmxLnzf0d99g8mNoav5sLck7vdBqJzmeXNKYnMj10jy5g2Z
Q9sfsek50glzZErTzFElMereGvLtTui19JiiU77fjoD87nO3l3fTet0XTedo6Dc/5Gy/SPd2orOn
lFZuyw3TJid8U/mzbkcUe6LofsfTU5OPzWZhuZdFHFbnJmcOZT7O8k1dCuzmKNJn3pUWjZPu+3Tz
Oz83vVvMJ6tTHWZR/FvO2m/NFy6ne26DpzXOZo80picyPXTny5g2ZQ9sc5HF50TnyHRZzG5svJ7M
XMlMereGvLvU7otfSYolO+308tnqXc507eXd9d9O1F13neN783HvgR0jnbtRWdXlFcXZHiMbrk1O
+KfztFuRxR9PZ2dTAAH///////////QqACX3AgAAQjVXGRH//////////////////////2ouh0fo
1OTkT81ZmbDcy6KOKI9z3eZZ8iU/Z3kzo+l2cxR5jP26NUWjZPs/fp4bu2971bzFq1NdXWxR+Led
ujcwN7+PtrZzKg7O6E/scdDOZ0eZOTl4bv28izOqPHHQnPt3H1qOjvdS8TNu+ydmdniNmqipxs8f
MZa6HR+Zdd99LKC9R8+9aoIqrm6CPps/Y9Wd7qJyhZrV2bqfm7I0eOLm6n0a6rx05zSNnNh9XUb9
NqoPHUH327UUfP1nVI+lDQLMN52dmoIjRLIulA+/TrQ3nQ2Wjxxcxo7XZyRnZuaJVZbzIneVZ3ii
5+qvVTV3NVZ6+n6dqsdDrsuzWsuqxdRUx9DYj5Z475t7jPi5ou3fb79LdnjU8qDreG3txdzWZM7n
G0jvMvyO+8bNuh3ivpay43z8/P1qDGPOx1WOkUa3eRRbPFUe9veeI/NFZ1NZlWdr59rIjx31yua3
GaZtI71Q86jzWHzKt93HFFHQTnTc1ORG58oIjp0MzeLe4rwxpg/a/fNb5+naPF0uYdQ4/D2bspzt
FQdux87ny+yNFQRcyvOnPEfNdqt58iMqG85++d7i0tULPo3NHlm596oOzmOp87KPVV2ooOZ7Wqrh
rNvnRlMHPzx4qrEfi1Q0D3Q76zGc51zUEZ+sfPmc9Qzc2r7Hvpid94tdO2YfpU8xu21H05ulDQdL
7nbyoeG6zhqCpqOm1V+GPcWz7j5tv5eu9C6Hrm+dUHV9z0Gc/P2PnOu/U/M2suh1tTBojc0XY/Ot
xqg6UExeOoPbxOejLGmN51dWZ3fbqo48oOa2qGpVmqzpbxo6UUXScnekXRLsJJN9+roW43aXRZdS
+z/Be0Ru6378UfVRUE8l27de1BFQanHNJzlBugpFQX7ugmLE7d4frvO+6NJ3p6SoHlApqeRumqir
pl703VhCfoPVzdn0tdH/WZMdleGoFmrdTL0mDqTxVPaXUz6nmFTc85NOJbxGoHHb8s7mTa8652oL
13TT731veu2aP36Rdp6gSXmdve8naz25V2XTWPUojoFFQUKXft17UEVBqcc0nOZQboKRUB99qCas
auzR9d52o0rvT1ioHlBNUKN01VlXzb3p3VroqCcXN2vpa6UD/rMmOyvIqBG6Hurp3pMRrcxqru2O
g1Mziu8wqjc62325lvFFQOO35cbmTaXegiM6C9d00Z0F9b7b12zod9eZT1AklrTztOPcvY8dzDlz
sutBrHt6EdCdvobnu32oDmoIq5S8xVYaMx+l89AZdInG1Q9MaPlAd0FB2uLtHvO2zK86R9NvWGbo
Lt2tx7u7nnjNd5HQXQsyyN50XY8XSgijfOsvV0B6h65j6ygfXH4U795VOb5jUHV326Jx32oIlvmX
ZJLndpuzHoI3Fz9KCoNzx0H03Oc8dAbKiKjiznOeqzUOo69qjObtHzVEfNnPGeoPVc5jxW6PnsOY
9vpQUaKI7qMygPwI+9z0FBs5tUe+mu9BQJo1B2mtvElQbjjNZzvOddj9PX0oNOguh1roc6jzsupo
5pc53zZrtbw/bbMzmc5nfodducpFnPcaPQ1F1flTQKeoI99uxujiM8zN2kdYr9KOIzPurrZ5xy3n
br0vKBUCxd6DDTkh+tBHF2j1mPteH6ndBOUGUFHt5EfF2NOdtPtGfnioKCg7G5qrjMbvqM5jGNjo
Do0cW7WRzHbuZFOfNLKBGyg5ubnvo8N2W+d0FTU0NA+sQ7OK6GeRzUFBpHRrj5iHOc+jqLJ4+dKi
7OduOJ5SZ3MjZQdaB81B35zfaPVvUdBQc3c7Z3dDc86Dtkec0fN2yPolz8509G7GOqCgfPnQ5mbL
1zEOegOaeyhzmPQn6ZFdRHGonSdYu+YU6RvIunWgoO/1NJ3FzvVB2bc8fut5nZZ0UfQoao1j5jdl
h4oonz4cxrOc3Mcy1nSK6GPKi44lFncpke6CgoI5rtVkXbKBcyjeHq58xr58NFUVGGuM0XbMyrOa
N9uaPPLmKOo3zVESMfv4zuyuZ0ebzS6G7TmvIerosj3QKPn32oOdR5zvW+frFHNRvm+c9BkXuZ17
R9oj36q+qKONc/YtvusuSrPOlA2agoN+rn5j9lQRxRdkeKpMZc8xnP0TjV42jVkncfMfM932WzGv
3tk1WUV8+c1XepLrROcvM7ZGY7zKA0cS/BRfVdBXesuLJ2gObtenOc+O8Ti7M5rNH2X0KRZHuKgX
PnP27UFSufKl63z9eaO6GN1HznoMi9w3Xtz9+Y9+6r6oo48qe33feYy1qrZjpQW4qCgU4qmtUHao
FHFzI/NUmNnPMZU9E41eO1FpM+ueoPme774txGfZdzTVZc18+c1XziWdaJzl50yJ4eM0bM8oDR88
SKLm+q6D6d6y7iydoIzd76OcqcdnxXzd3HEc3P3z6xMMjRrr6NXQZUtmugqea6rEcWG5863sxz0F
AjUF81TN1MXqU93MzRR2eo6Rcx06ipeSdKDrEfro1SY9BQI8cdRUx1bqpN2oLXTnMqCrro6v7GqY
+hueMx5Y4qCM1SfLydPDmq6K7j5kaOgoKm5YueKgoovkRnFzxXdTpt1Boo5bz7Hh59c283ju4rNG
rqMji0fn28w0R7NzYaOLtQR3dREzJd+aoVT2oKB9nVweLBLnPh6mNx9SZegyPKCI/t5sxj5FeWc0
juNfT0Ex2qY6g/SKOr423QVFx3Mugq/Izc1J0oO+++ZFQH6rO55NKc6X3vn5+13EbI952+UFBnZX
Kfn1QZraiiMcyug3dmxKYbzWfGe7s0eRZLlBQHuSrosqy6OVdFeYbtbqTHurL1QHMc1WVZFfNQHl
vaPzc1THeJnjjXdxYrPitxLZ+a+ePnXNVkb7Vfm3rIlfeg2eLm575z9HzxXG3z5is8R+keUCN3xr
rrOt9jW6m5btzrqDxc+HjiOotvo8oDUF80ZqmrqCIzeRXeUF2ep5ovsXObo475lmKzHxXzPmmL+p
5ugks6O9ZFURZUZ2d7oMtxVFXc/M+fmfM03HGY5ua3z1OJY7joMoMq6rI71Ux1efdyTOGqw5rzOf
td3U1Zzc5ubnetPnw+RRRmjtI6MmzrO+Z1oOyjUdRzxGjiqKtzs5eaq5tmqOaZ5ujlxPmV88cTdS
udO/tBkdXR5z1fHMn3mUFB3vMq7nu90F6VA30fO85+fpUKLLtRR5lBzZnfMoOudqCI1WHqInLu3z
c/NM1XL5qWOgj3HVauNdaCKPstTCvnq+7nqs5vaCznMfKrEaqXF2ikTKaa3+HAnvJURZZjGq3O8X
N1j75E+7QzqbsTHXM7R83PeYbMnDLmveZeqE6NPafRdqBHuKeqXNdPGfXbvu4mpGd0STPUdLUizN
/wfzsaYq69zD3FFHE3Wu85t7no5i7imlvJjnp3VmXk06PO3mqG+vfMmpo+HfTOkzF7fsmS8852xy
KW0nzOjt/Xe7t65121F163hFkFHe8dHLvK3uneuzqztzzEXVdot8+GPQ81K2s6SJeZest9nh8R3c
30yTwZuWXXXM7R1FTeRmNhpyJVF7zL0zo0830ztQLuz3FQ1d2b6+XGuy7XE5Gd0STjjqLUizN+nm
Oxpirr3MXuKJ8/NbrXZ8qDrs45q7ioVvJjnrurMPk06PO0x0Z33zPaGaOaN9M6OL2/ZDS8852w23
MqU6746h0dv673dvpUq+2ouvW8pmQyO946OXeVvd6d6V1b255iLqu0TqTRRuozy2s6SJeZo+sO+1
5HmRu5vpkzMfD6k0Frbqat5qumOkxmVY2aKg336ZlrJxUHe4ueK6mPD9+qjMc1NlTFzx9umZ0iqa
uq6oiju5hXFzPnMftUrtZ8jPU+Gvrl9HkXPFzR3zGypNh47oO/WoVmqN8/TLRuaplU4V5qCOj306
Ht1FWRRbmuy5j1EZ6uczUYah9o+Y3h6F1e8oKDrMZFiiUURtzBn056rm5jr7iVFzM2Z2q6oqL82e
KLnTNEY9WZHVYy4zUHTniq/I4lUxUCyzxqPvzRLMs56ioj7biaoI47jXMrPfp+g88c5RmiN7V2op
ihuOrpznmJoTWUdXaoH0MaKhb6THXFElHzRVZEY5rvvFR6jtUHNz1dVuosyKLnPe3H2WRO6NPmq2
OOgztUHOuePIkerI980dAeJ3ijq1G6RUFXc1Vzms1SjUGc/NRHMlrc5ln7Z2o4ontTHY9XTxs0bn
rH8d78P2WG93RzTmOnSKooZiYdmNQ1L5nQLPL5vL6xe+TE4bnvN5ejdMqGar+eN499b7c9B3NFeL
EfKTD5pVdzc/fn5ueKpjqLM+yiPH5VdkfPV3bd5OGmDnNHzdu3fpnMo44tKPoeoM8qNRG5uep6Lq
qgxue7qefmoHedleYdq00OvNz7dWVB87s8V1NTVc0o6sl3nU9TZ6I9A6u1dS6WhjN3oF2s0xRr6l
lJh+/Tm56Ghq5VNXc1Sa+ePm19icV1OR9L1HU3V2zOM0bqsc93ccfPQUHNHFQdcR8vMOu3Zvt1qO
erGquy4o+uXHHFU1NRFVcNlSa8zn5z9T1PlAfd5bPQ0sdAjTCG1kUed+eannJz1capvmpPMiztHs
573UmjPkdTz3z1do3eg5+arKDOY8Xa6TD4z447qyrl05uapi56g9TU1HPHdTFVcyPpV3P1Oegfp4
6h9Klemq37keVZfPQS8/PV05U1dVfw2HPHVdOa6vqsGVBzVGXs6516FJWHtroZVsoT+aN16tXro1
m8iud2a4q+8r3ropfF2xdW3uaucpMOsuN9jZQKYPNOLD9e712XX3FdA+rMU+Vuh3k5QtWx2b6Iar
vfh/EDmPdD7vSaZqDFQdm3i7XQurrS152ZzWbvQdta3M3rLmO0lBQUE9lbs6i6DSnkLrKrvUfG1b
Pz52107rT9x6ya7I+RmVD0a6du2Wkd3m+/jMum8Oa6+tzMx2vTUvi7Yurb3NC5ykw6y46B9jZQLZ
1NOLmNQd3pqg9oDK6BM/VmKfK3SN5OULVv72b6YNUl780eTBGaO6H3elHaZqDE+9B2dvF2uhdX2k
t0HdmPEc1A6DtrW7d71lzHaSgTnsrN1FBpbQv4qu9R8bw9n5zdtdO66P3016vJrsozc5suh6tUHX
t2w6R2c2+8wzLpvIzH1025jOm9H0ulB27d7oIzdLqEjpvoqjNdEomu9xX54qhXQXmS1FTE4+eLsa
4+bZry7Nz7nGjx3H2iznNGnU81xGvn6Lrfp6hOgcUXSc6dMNO3FjzSNGZLD5iNZu1TlBzXlBh5/t
Hqgq/mvmijy1h8PnTNKgx4cxjHzfbvmdduOOPm5jLvZ8VVzO9Vg1BFVdOfv17G1QR31qOe9RaR9R
qgOfKDH0XPM0BrjzLxvtjVzl9nh85+ZXiceZQRPD50jtpZ20eh683PQRuk8yPd316M1Rz3lXc0cX
btHQO8qx3e8Zo3S32oMmNM0XQ3SrIzXOHVnNkdRM5zv6ovDo8RriPho4ld1F83WgqOeOoqemYijl
XaLw+vcajUcR1QdNJqOPmRt1Yp6pSx9oo1G28uK+fO1Bzdj9Oy076y89311pmNUc0Z4j47CPneNR
xXF232P7zmV+vWHorNQurj9jHjaOZm59vM79c6NdG42aLd0FBFOdbZu2O7NU8+GO7y7jPMHPbjyK
PD9aPPvXtFQrzp5VrqLjqLPcb6Hd9uaOKzxUC1hI9xZMR9u3P36ZQ2j5H30apO6rJ4o021Hz1beP
H0uo5uepi547ZzHdm7x+HuPI4o4rr2r69ol1oYldm8XagWR81RVx7qsR88dnq7o+3bmiuJOg0U9n
Z1MAAf//////////9CoAJfgCAABvdnENEf//////////////////////ufIqPO3eNdLuM1TdREdP
R0+1Bl3cfNUVPV890HeOKz+x9z6PMRW44o77c/p8PFQ2soe+jWvKiroz3cbaiqyk6qM55npcVVyr
4+aKd6ZFz9j3V2XnM4n37Zzc7NVYquRvtavLwODGs6Z0uJrBeunSDdH9f1+G3jZsvrR4JBJrJ7n6
u++Lq1nWcj07iaUfqeLos973nl9rtxEGZM8R5npHvTZzXG8vanY+lxeetvN3tq+d7qDc/W8S861K
nrnsoz5Ea/em7x83aVP069inI+bzO2HUfjV5z9FqZOq2HUsxePLy8V30V7o7xo6c50y0u/SP3v77
MPM1N354a+1yY93LDQIwns5+t28XVo1Ao9M8TSj9TxdVnveK7NHE7i7XbiIOJOOKOZ6x9tOzmuN5
ayd5+h+Zzlt4721dS91Buegs0SXnWrk7nsSo4zcxr303Zo5iKo7e6VzkeOKcj5vMvvh1H40c1T0T
9OqTD5qYvGY+HzLvpl9neXkac51NaXfpz+9/XMPM1N3588Nfc8zjR/dQ3/HSj+SLQyO/InMzA6qQ
+P2Lt0131k3eGOY/a1v03egiTky0bp6fp27GOaLp3Xa85kzR+3R+Ogtrc1o2a7G1fa3Z7542Y99n
zmoKvNzeUF24sfar8eZVnM3MacWGjPa5qkzjqFVYiORuM8VBmTFvM0o8inPY0Q0fLlzL74sSmXky
Z72e7mY486aZsiXY5jaqI7yW6tzmfNivpFFGbHn2Y2fn5rNboKiNOoiyp53Fj56krGd4qrFC2egi
NGfOfNdk6DNx52aoKAxjKYPfbOY3ez3G6Skx3i9mVLl3Gr3QXrspzx7b5uxjdU1msffKCN3e5LNN
HPEY+RThs+yUB+7ToHQZEaU+86xVfzGw3Mr+9XLeN9l27q85tn7Ru77LEbRu8hsqDXHh127X15z5
205b0pTRc/RY/iFud8wx7xx7j6Tl+zGu1udiacR/LzqjW7ji5j2a87Pp7po+HjizI+frFbs8X0xr
3ePGehqTRdAfLwxzzPQ3h1maeRdJhaw3PaWGqejijR8vOb13HFeVPNVlHuzrHiobNHVhGNW+h8uY
PFzatvD9pTG+9lHEzXk9ep6djXTIo8s5jXczbqJrZ+k52vIleXk6nFmzc5ukR8j6Rq6HXvNcajyK
jR1NKaPd9LvojzGWfnztkqcRpa5zHjoV0Pk7U4bd3Zor3GeZPOdLvsjTpmouhufLmD8yR4k7uNKY
ixdr5j1ETosdB0tbmsijvA9OdPvKLYZ+btFhVxTg337UE8fzevel9gft2yQTg9l0d0BvIrdY3U+X
26WY2nZ9bEzeul3k70100fWnelmHoZd9KVzlRz6107dMt+WazWu07bvpQZzxR91IZXkaobNEdUkf
N2nJI1h10152m8U7szyTfSgoVLMUan+jmOhG1uzyZHZDpzTF83nsxepqTdzHc/mLu8eHz1xfxlJv
Uk50vSPJnh2ol0kU6bneBrZn65W3MZ6UwjLqNo0fkV3SRUB4u2W+lmN0eWfW5m31u8SfTWj9NM/R
YY+9edKW56rOfWunbrl35ZjmZU67Tp7vpqgypij745mLLyNUNmiPEpY+btOSR5nc66azztN4kzPJ
O3Sgoc1MUa3nW5jp2InW7PIaOyHTmPu6jz2ata1M9rmO594u7NeR56+atlJN9tTM50vWH9zw7zmx
yJ0WzVN5XtM1+vbbepg1+kLT36r6rtfp2a77W2f1LNrb3m5fekpsi7qJLHjXZ1f5nS5Xi9XY5tXu
P3Wpy0c3RxrFHdHFMNUqzQmtxKY682kuk5Zubs34a3fS6Dt2Zs1z9e2316dsHQ/TMbnOu1q1zfF3
61z481vtMWQuCinnjfzs6HMnF8PPdMcds1GnU0pC/ndX3FrWzmeMg3Zur5tUujmyg7nNGjRaw86u
vlw59zWTfXOftQboFNXdBO9ulnoN0Hc+7yg6EHuuoroFP0HaYZq7y3VtWvFF2xnjiNGbZj9GbvmZ
edKO7nN9u2ezSV5QT19Ku5uZ4rjqZ5u1nhCOKYPMu9eRTHPMvE5rSOfmurm2btzM8ToGlQTk7QR5
htYa857nTt0N0HScoPLNcToKD2anKFZdAzrsucz2nvtQ2/TUKoO9s9BfvQ6322Q1LVZoH1IaayeP
4ag82jvXqj6q+u+19qnnmtZlrXQ3b5iR+jzW+umavUtGyl6KYcdBUbnF2mqjWr2uqPV7R6CP25ox
8xPcTvO09qYajwzoX2yPJT9clvdVhtWunr1i8N0n87Jue53rtQPO9zUzHz2u1zRj5dWRminEaY6a
0dUp8oFzqenijs/ppqePdxGxqLaa75pPfbHhquiobqbN2w/To73QJX0V63hp2kXZ6d7750msfZXN
ZfNMLZukeUuqPNVf3ugqsPo5jJrDHnl4jn3FPc/e05iZvs7oakxxq71rpd5Q+dNXFNZQHoW8zpdu
I+VY3ZSzXQ8wmNZmMbmO3Ttta813rA9DHjmY/NjzePnN5Pbl1o589oPu7ofOlm8OutLMpqZzHt9H
28Dzrva3PTE4thW8qHmdpL5t7f4bN8901mpN+XMPofMXbOuM/bH7rtNTETVbPJW/HmmnfjTvMyJa
zFOKe1vN6beZSv7M67UVzh1MNLd6obzeb7Tw+Unb3VD72P2mvZPrLN6BBlPOxnUmmJ7cvToc8Wbo
KN3el0s3kedVS+pqcNMrMe30b8+POu+y3O0M1OLYVvKh4aS+bttlu0Xr01mpN+XMPrHmLtnXLP3x
zj9elNTUTWUmeSt+PNNO/GrvMzmTzHk8p7Wzb6W7zG3M9O9E7nD5NPF2vW8PvNmfZa+Und+6fvc6
mpzbeSt70UwoQpPp318zs7j9Z87+ZJIn0EzmX1SnO/RzjvrZzs19vnbNTe7t305z0FAry/m7XeNv
aUujd/vt6P2nMPl5R9H9oOnNQHj7Yrd82rw91bs599Ddosivni+DXXtQ9MftBR3QXqbuPfRT0fZO
YOfXOlk5nNQZ3yc7yDH213eeHXPOfZ2cpDpu32fcxlzGdT1w3Mu0cfSQ0cRooqiSrnHQzFRW6r63
QUDavO3ZYYzw3TSy++nZ+vftQLO3bt0cdvGbtNdnku7s7oMoGeY8XXAZXR2bat9urUXR9lQX8oMX
ajoOp8qdc3VKKjiNcs5MGZlfT3szcxqPm9Nh/YrqsR286LNx8x1QbuLoZUO+1qOcxas1Tz95jXTp
Orn5j4uvaJzXu86t1do5pUtp9pZmjzKCknO02beWtvtW7duvTcxUmfTM7UbqGudXSNxdfnc3bL6L
t0MfKMwrZ0ejpGluY106fLfNzSyZVx6Ck7G7Tu9blyKpeRWfN7yPqkaxZ76a7+drbiqJnWN0lB17
9ZrJyPt27Lp1RzmcUx36ZeLnRleG0ul65nV2MbjoO3bNbzo3pZ2SeXrvMa6qXn50+ZJWunfrSPfs
0bp1lw/Qx9roZH61b2ugdAc3XnPQY+1x0FtH6c152tUGdPhtVGtCkoKCSjo7vzJQpzp0PLOdt61l
BOzvRZzx/My5L2qCtavtq9Zq+4a57drI1Qe61takXSRe9nFH07a116EGn8vpeR7571qKvu89qycP
J2jvt3d52jifkyZo077IEnebFJ7nzM32y+d6vd9aCg6dKBHXZTq3LmV1QUF5lB2tr2jQyZ6N97pJ
n2v87b6aygnZ3qs5+d6zNXM3tUFa1ffpazV9w1z27w1x9qD3WtrUi6SZ72fNH07avVB001fl763k
e+e3qKvu8nasnDydue+3d3ed+eKvvx67maNuckCV3mx89z5ht9svKl6vsjX1NQUF9OlBiOuync39
nZ3Mr5QUF5lB2t57R48m+l0FvvQbu+0tI9et0dftnp8Dd3mjA+0qnsaI9GaKZ6PH28VvLINWktpJ
0PPHkcTz5rWH9uO08nT5UW57Rm/Dm8y/JY+sXbprLivL6uY28V7Zs+b6ZVtQ8fXxUGR0Xa+aPHHC
M/W+eKOpiOfmc4+maTuctNnyOafZmszx/J7w+o9xnj99z3tUaWeHXfVShUGzve499LPHdFN0SzVF
GY04fmq/MqyKrubF2Nls1zz8ivKmeVvOePtuN4e8iu+Y+za2eO4+9Q4o7WWG6CYzWRx5U1J1acRo
7oO2VBsy7uooKI3dZfh87R53zn7zyq9ZRbiq1887Zzc41GzugGqCOYjUd7nJ4/dJjI8Wr3iMvkya
5yM4iajXc3U2Qu8RrfnnpnF2OfMWl4Y++510zveaMN5c0jq+w2jHztORXd5zSzGe+ZcUc506H077
PTsKLIqKI8T6WbnjnprJ7svPLuY3z47y8s10XbE0uwjw/acijxXcq5nlzE5lzGRxYu3P57muh9dv
dXptG+RZzH7RW+c0eZa883cxnP4qN5c1NJqhs3xH0vfVEeemld3MRRo17dRuLtdRurqsWVB+aps3
bUcVR058Pz1WrqKuqYlU6NV/Nz5UfYjxj1ur4+bLqsd8jP1i7b7bd2taUx0i+HNkfnpzRKgjjWTn
Pc92E7OujTuL33z2+m6PmsIzWLtMiZnXrPKhEJTu0bej5Z+btOTCmT9bnb93m+0nvaseawJPolFj
5prDO7dH43vN80423z1csiNX8z72cWdJhJmzJbqyLH7cclA1HRnelvy1Rzl1AInmd+LQ30i+HiyP
z1nNFlBzxrJznue7CdXt0ad83vvk5fTcnNYwzWLtMiMTNzr6G8qyJa2d3kW9Hyz3Udlk0pzZ+rnb
nN527Se9q0c1iT6Jc2PmeRO7dH43vFvmnG7dTV6zmi15n3tfNnTUi28NLdWxYnRXzugajo7jY0tz
Ed7xTl1DZ32Wl91ywS4e8oL79nMXNaNez42tzO9Ki7PUz0mF000Z93Z1MW9rNro3sdjXjPjcy+kj
nNTJn3zeg8V3tYjJ3b7bvzMnNLXfeO4mutWUFBrMr97a3l5HffTWLos6Xzqi31uifbeezOz9LvWp
TZ23265QS0GNHjoOh9TJ/Z61vrnZ24755zXaS6vPlpYx06vd4fO93FPZUqh63vnl14siquZ23m7n
c9zKjvQTWULWSH7rwpPT0x5Lct6mLmLzRTLWddTjt0M4nrbtZMdPbzWpZ+3ceRaenmZhszJic276
mdtnyI/k8ZGW6s31BqCLSQieZOZXy8Z9dzdlOR5s1mnEsizrnWLpeR88Rs8zvs1BtUKU3J8zK86m
ne7XydmLlxq8666VyF5IllrJjO1vutzDu30dtRzz1QRHZs3eI5pyb8TUzayh9msUw+to7WTHnbp1
7rcwa73md5pzF2nQW0PLUr3hnZ1m+ktzU5fhs8vOy7LvdA+htntSNJNNNKdE4HkjmJhvV5MdunbX
TZ+/XtpZd+X6sc1byYPaemFs+6LEzHV7nfMy/fDZl5M32V9mzyTa8T7LMtqdVC/ZicbmJc6326dN
dD7697vJi5pu6Ds6m1ccQ82g7Ro6qZH1lVyJc+GPz1Zbn+eru3Ofth7j3ht7vVB5Y+CZCz5FkPKn
tljpDpmePkgvN+41Nbz3U5op0Td81n9u86TAWSrtmbXTp1e8jxZduiDWpjL6evI5jW5ycXdY716w
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
aKhKetE9hOPUTnY9+m1bG7zLu5Yc753We57dVxreLf275zuunnjAlWftrxv55Q+XLF4Srvj9LWN2
3Zb5e7+nR7yiZ9eJWo86Z5qrNMN1H49pla9d/rmllrgdp/s8uV7hKzvh+i1wfcV0cj/zZ3XgK/Pc
KTW5j0bN7UZeuHXUba6vT5b4rGUVP2mcyyGESHI86B7IywwXIflUtz059558n0Leg3375vWawpam
W4+GvrEfsar/mcuuMdCw6KuUYURe3saQKyMhMcNnQrJ25tHcXmKnb9LohWnH6uN6F2u2cUxa77od
J4w35iWkHpWYeQpBJ4aXfpS5Z3TW5y8sz+KdF4aqCqFryipaN/j43JrfkAM+090yqJFI8w22NxoN
ddFseHtzzfnLdiee45viei+r3RyOW2ZTSx6ii8Qi3dS0L2W9r9e7XXORT+bxZzY/lnjabz27SP/g
lRpbrXXUmBJGxw9vk349NLoThvwtZuzs3/Xc+6pZkqFhiQl5dzOZO1kWzc+ck3hkVYXW02BqG+eJ
ZdrOXWAjzz9orc6YpF6n+nI3ebT1TPNNiPzl4Fp2v7rejTFOsbnZW5vcGjSZttGYtaaU1hWNvrou
Xt1W2ry/ZU47HoVIoVUDrWtzupWpu7h953z1y3n8XOUe5mlubw9dsb/7ffdN/vLR2u63r76gf7Io
daG3cGNgNG2gPjSSmduPp+uPLdEl2dTWZY1VO2kd30/kfh4WI1llLZPLVtPNuiTmmDwz5sk2cmnO
YSnRM7MnykTp9jq7kqV0X3SSnYg52Idkz4mv/nm1f3EjWpYppB9uFXPKvmm6q6HLovtiNTKbB6Ix
G2Krq/xWoekr9Vhpt+wHHSUPNnopI/aNJMfO6mS8EwcTS9o8NOpcTXM7eWt9eriRkFT2HU1JJ/gU
ZlBPRV4iEsxJAR61CKyJ0SFKY8jcaadzX9yWzi/n48LNtgf3ruDsC7o2uy/T/OgfPCt5R850hz47
7i5Mzw18fXHrpRMXJO7rQ+cTOUrGb89vO9GGmN1pyHXM58RcMvtF+KltxvNgXNZU1vOf/FxXX0ab
h6El4VN+ymAUI7ZlsfHy4tdjood0EjzM+Zy/dm480WPx9ck8i/1i3o9xYj6FpyOjmbVwfXRS6jSC
U9Wg0z7ox3GINvev/bfp8jsVXIqUqQvfM9/6ib3fcjzWlcl6w/H03a0v0q3F/fTrg6ZFzbYfx6yt
o2yxJDek7zjU2Q4edUhwfQggxCJ5d9phq869OCiWeiUPDtorVNeMvpb4XLQp2Kpu0OHa+fFWmx5b
X/4gbp/e7r4dbxLGiz+L6Wz0RiNP5aC7kEzG8PI40Qlpt3lanW5LZjYOb/Pw0rh4qLDabLDefLKn
oU4ieX53qbOrN9vNGjWv5vZM2+HibZlrMcNDFPPO172+Mq/+n/u0b5kkpiYh0nwyLXE8arrSiRrt
aOwHu15ysaYSg8sUrQFl3o3HjcU8npg4Y8uBn7bDz/dMs3S/uNfZpefjftd/DtM3V/hAHlvGjmDm
voHzblHLeA8br3TSbax6Oib+lAioSSBEUUNmbrEez9uqD3ZSOI66vYMHP3WOOLYuMvR3uS8+bbrZ
Uwlk26idDy6ZOB2Qvr3p3aOjcZym9bRuh2Qkppfe9RnSL6L+ZXg+KklNCT9WkX30aDUYltVp3bcj
tm8pr11O76WLPFZpzhaiM9+dyHDHNjlwv1v3Y/2mrhLbxYU2kbe2Rqbhn+hFDQ3JG9lHF1cXOlOf
NahQU6Z9G2w7vfaBeTNe35dkqdj/u8uQPvpx/kU6vndj7e1Nz0y1jev8tLmcwxnX5fJm72n19dYJ
3Eg2svOcCCUhfBYepRh5HUAQGc2tVZ/rh2EqvHxNbj138K6u8Q1xf7TxF43lr+axenZz4IGljdN8
f7rV/tOYJyza21H/zUWJcdbOdn1Tpuma1v5zhu4QDv11b2H7mOstXqj/MwyaztOh1Vq7sxDdPdOw
2Uy6erGEJ9fxsLUpl7Xu0cLfvFWlU+ycdM4OT3VtLMm1ZCmSy5KIkbxw2MnTXhHzqB1DWYjYnbDP
pNKNOI0McjEuGm1qeb8Ip91ls5iHNRhp60uLuXBrP3mXVW4ZSWti8RE7oY2zmRizOi8fJPsuYJz1
efS5ZIJ/VBm3/PCgW+wepXCoaY0SFQKh0dwi7hyPrS5+eD06KMxbFYKHCsE374enpxOqMe7jZba/
r5ZB0xwT8+KC7c4lOf30QeKbrT5sD2Lk4Yzn/AjxivrZxrm2PI6umjcabj2cJ9cp4n0wzPT3KvTK
9C7ZPvJ4bRd1rNLvWg+ahq3P5n6WTJxYNobPvBwiZIm+kuTNOB8tM4RHz3ycm1nTJf1676y3vDgr
Fg7fuRp2TH3Jc0z2moxVbdPOZLcehxk7P+/HoZl5vzjOo8a/JKeXfvs7DWaDauLxU5i4K00ZejGm
nYwpmtVsO8SA6uGJtXy+1zcexUhIlxKK4O+2Uje31zt1HinOQ+lp7u3gwYOjY57eV5tr+3zU/13i
pNJfxzbcSEg6nZ+OOXizO5xoaW472ph3unHaA1Htv9EMtfOVnDt+LOJv0u6LVT26Yazug2GJG411
/nItkdjubdmIXBklkL36enNre78glcGDVfRVrhct3Uxbg8VbhpOOrW9v5/TT9J75sVhjHiJGKtZ6
Qts6dL0sc21s0TLn6uU/Wu/Blj+RLS+rVB9ub7WM6PEl8/O5rcv6buzZc8lNo5d25rc5P+xnzfcX
w7BZXt6C64JOLNWGtG4dHsVouACg5GReztUffjSUHr/idG7PZwMbRinrBeXB29p2erU1zGt+L9V+
3GYVsJsfbgzYOvMG5fTvkcvNyD0rrvIio8UcGwfri+RlpN2SOh59lU+5noY7aflo3Iw5Z6ff0sk6
zKD/TX10Toa3k/7me3dLz3/HZZiPh2PVQK3LJ/MvH7aGPX6xvDT8riF3idtTRrAmOreopfjuhm++
1tx6xp8n6qKdzLdebxq1cnq6+i2jv83YplfeNOra7ngrur62G6k7msVk2yVDx1nYWIlMBi037X78
EbLMk8GHWf6xzoQlbxvX2DBeBx616GQhAAlXUttv81/8xpoddHt5qMDATf78vapu+9a6G/o9d/z8
3/78aZdPLrmoi7b2Xj+8tbPxYLr+Wf1bemacZPJmuT9z59ZmDw63FJt0D06372Z90CD6LUPOHcTt
zob9sHOneuCqSpwwb2MI+I63KGvebzLW+OCsdl/0QxrXPsSH/ENCm62t0YmsqducPGFRr0OGP+lj
psHKLd3Qz5mbkZmVMXi32qMOf6c37y0dzHCFzSllmPYv+te7b/OnkV9bGHm2mSZ7x81IcsCF9VyZ
PrXDPR90T4/jZ0otIgMnPZ3nV/SgSglhAU9nZ1MAAUWgAAAAAAAA9CoAJfkCAAAFl3llEf//////
////////////5f//HudD6H8eTvTsb1POzSj67olpq1k9u961PK9bkUW8KVO7l+fe3NM3kcnbNaer
7Pp5UZqOVbU7F09851M3vCCvt1w6nYj+5WIXWuYvx7nehyntDhta7RddG7O7D98etGc5vzzeaoNd
PK46RvJ7o1hr8yLeZz93vzDZ1zHqYoJgz996bmHnt92/e1A5hLMvrOde94s5487dcfTvQ0GondBe
Lsu9ftrK+qGhNePq7EkVSaJy3GaKNZfdnt4u0aoMca7PO3RanLvvftBpyOgPl663ugN07RHvPk92
oJitOrs43dn9i6tLtl2aYuazO0qycnHmdjda+ReL47lUTr4jdzqttGNQ3gxdprLzXY2Hr306M++n
eN8/09RVZfaczpdvY6V166DN710a7Ub1Xe+nk9QGtHzWu2unZTC5tM5sztr152mPDc30eJzXbWdu
w9dXM0WLr3vFuOcnKG8XZLWdefE8MtdKAx81Qdn22eZ+86O8nvEOx/a32tfW0ksoH0oOtzFC4+Zd
99PFQzVBH0Bgt5l6yPpcfbHzGoOz6Z27PSoennPcuSXQzye/a1znZme9WkfFiM+j6d7oe3u++dFN
d6wsyG1W1aci6Z2087ZQdsN2ObyPmUgaY7dqxrWNJZGOnQzul9zugqPygZlWuc6edJ6cedsbVBQT
W59X26q44mN0kxPkBvfatfTWuuzavlvQXctQm8Tu5bUwfc970T8a0phnQmHQu9T0OiE9rMoNX56b
HO9l26fM7Zj8mLvV5cizsFjmGdFG27P90g30hg9xhax698Tb1OdNbvp28pBJ5SoktW+3R4s6bnGt
sEugxUFahw3lp3cp1NR7ofVacw1pTDOhNOhd6nvB1QntZlBo+vfmzLWOd7Lt0+Z2y/F0vUWW1nau
sas6KNt3H9aDfRwwbxhLGUTUrt6nOmPYvo+3nhWTz4pVq77dXvGs6bnGlv63WtGblyTUwft9hfag
tX1uc7dI9nloOuPIur6+rt52bfbqc08bqKA1+2bNmi6HiQsW8EcWaFXZOuTXSZfxybTo+kVjt8NG
OY3N2oLoKipZ7s9xayg5qCgvZmaYS0Mv7py3dBc4bpz3H5L2NQNCgzboBfed2YGxPmvD50wZfVUf
Paw3Mzm585qnY6c6iuOoio5ag9xml1HMZZu5+1+BqgvvEcTM0u9B07al6b+UfbT6B3zp9piTR0bt
QPXr3flo8lH2iOagxoxhna80fnxZpm1Fu6nmoK4uOzGelUfM2ZUCcVBije87GydxHNrWszIzvno+
k4ardzO5g2L3o+lEne29XgPEfLxaoN9T0bi3jycj5rNlA9Rs9xGR/ci1H2ZrvtMvt6rCdvpRnw8d
6NH0q67qJnauY3z88Rll6jlzs79jielVY6vLPnPlxX0MZ1Psme9jG7RqLs/ejVydgYJ26A9SaPA8
Nro7Szr2vDZcrao9K6rGN9NdYzGTi6Zp1EzMR2jGV+t9NR9na7NP3TuMZ1YvffHe+fm7dOnbpQRM
7qefbvOh4uhB7j2PLuZuSTXmdOhtTN712WO9dnugl6eB70991sb3o/Rr2869/b3IxQI+uln6ePvH
fa0h3Gz6ehfbtQbsHX370Xmb1Llke/qbBDs5ztRprOxQ0MoAd0GrG97ta7Z2vT6Xt/NfLgtmoyGu
2WHOL2YkdrUt9GwjdJmOK967LHeuz3QS9fA+2mjd7W6+99I+jSvH39vcgYoFh9dLj6PvHfa0n3+o
+n0F9u9BvpYOvv3ovPDPUuH6aoPU38x93OdqNJo3alMEFlADug6Kxt7va6a7Z2tPoe95fxfflsLc
W9dO2WHOKcfzVq1qU/R6v4hePmjfNJe5jmnM0dO9ZdSfZr5rN0vm6aj1cRn0CHjjl7zhvPTLpsc1
H07T7t721vRskmNbqai4+lhCZimlisTHOzO7v7O4rj+eS3Hce5gGWLZwn59XNzc0cI+kdTGvea3B
vmknJiOPFfQ9xRGq7DczuP0xs0jw53hrPi5su05ZvtPeC/NzU9IaYsTR81OfMmJOZefZiat7xGmP
sSB9e9ulnTzniiPzdsN4+rcedLxTG7MfKgx85zbjWeZtnl6xxVZHRJn5s7dBIZNa+rohrxAzEx2F
/Y7b8l83JmtiaklHsm5ipzyYmJznwOJKOht3LdwngdLWZJ4965t5M9ufoozRszw58zyxVl6iUusv
HkI48juI2s2jjs2lRXzKTnXNqrjYDGfM0xbVnifMc9zHZdvGmMz1RXqoO83LuY+9hzrQXk57qPPn
0w5na3k5hsmImftEkDDXiqLF5mLF25+boOkVg71cR+aMy1avt2PmLGsvXuc2tVZHHULV3qT75250
hOeD3UdH8zmvF6hkVsJRa8ZlmdhnP2d9Oa83q2ogjm58d4fsfcxmeZes9qI0DvvnNI3V19+1RFnM
ZrJigbfNQYJioGZMa87dpZViUu5Mb1CYyNTskxE8B7xRHiQNjzWGuxcwM1kcXOxrW9JZmXHt7lB3
afuPmKKrEDRTDFvQ6HUoUqhqQY+aoiBzD3Dxeex6FyfZmS4Z09TwNPz3ydl1ZC89yYlG+1iSZ3DJ
b9yQPYmufJ+ZmIngPeCI8SDNHjzWGuxu5jUWayOLnY1rekszL59vc6o8Z0/c9bqCiqxA0UxYt6k6
RtbEaydzykG9IY6ioiB4mPUaPm17z6FtzMlpyZ0SZttJjyc8c7vVkLN7kxL0Gt9pJHuGS28W81y0
wbErx72oe4PqbDY0xcxR+ehg97Y9HYw2EFnmle3DsFvAbtsLt5cELzTuHp0Onm/Owd78+6U4Ydry
1a2JxDIMMPfjgrxK1o3ReetJ9mHObh70vWdF9Z/Ah722NQ8E50x77Mdm7W6HfK4TGetCYtiwm+m8
5dM8SXltN10D4j7Fjz3IeiYyj9s9Hl6bHft4xdHMeTmnl9lOehwmJWO3q9e5TMPt3OgoPU57vGpj
QzPNms/ov1eLO2r93e53YnGPvS9GgpjSHobgvIODaMDJ6Ch5pRWr+3jT4mrG9dMY81DqxkHvLNHo
4UeeDozG6LlPLILl01BbjD0vj1QbhLsIdmoOD7G2vHtha2lY2grbP8NfpwfTSb8N2N5QwxQTZkOk
N6eh5DtOS6Wvj1ug+tQTfZQt9jJ+bWl4thO/h4a2Drl7nbw2x0cF6EoPkjDTe/ITiWqAfXi9+bva
eS5mX74O3lp9uhz3NVPXnuJdDTE4ojclFxN+CdxwahuGt715pDPq8azYmmMtcTzlNaXo32fvgmvB
6FDQ81xdqC5Na99bd6h5rxq9TkO3X64KG/fFtLtrXv2YkfnbQnFBi51j2Vqch90uJObnpiSc14PA
2uIt698+STksNMZDcx24unxNb23pDPq8aNuaYy1xJjlNNTi7JvwTXg9Ch0HnTi+9ltLk81r0Nu9I
eaHjV9JwedqD64KG/fFtLtrp77Meu2O2hOIebsXOvW5WpyH3S5eanNzk9MeTmvB9Hge2t8sepycm
PPns5NfEPnS1mh7MbmO2w4eDa4l/enmNLcmtIbwb3Y0NdJX4tBy7kGdOmMfLb1rWmunqzlpnh703
l7PlpPU4nmunbUNIaFpL163ksumJOmuu+1w330tdrQsNpKcSe+ynH2eaEm99dDfboxrtvWuyHnqQ
34JBKN66bG7GduqzTYQVB0zavoF9HSXNK9oaEWg+itdM1vQfYZ0HYahaGbEfT24SOVpoN7G9aaHT
ornM7bG1l5vY0kPe25/I+mhq0OnI4XJ+9LaDbWRqc7DWt6Y3mMLtnFQUM30G8nYzw2NIPpA8JH6E
m87a6Nq8DHbBuCwbQ6dIRtx7oPb3fe6F1C3vtvp2clB06C9GOKEb8zl25OHYNmmdL5DfLNDQb0tW
cS++8t5azY6MaklQsbW4ML5xVyUG+IhsTmdOw22ab0vkO2crG8+aCg3pDVnEvvolG5MvMi2OljUk
q7D5Y1tbkDC+J8RPQacH7tpb8gg3DY0/RoIeZjweDzehqDSGOx4JcTYteZ6NKY1fQW+kPAd50C1v
Ya5ejBgWvMYwZ5cwHl++BMHgr9hHdw94iHbBt8V5xFsaGX100NbGexXj3oMXbh5hot6xPoG6rloJ
w7DpVB2Q1uG85bDR9wcM2F6H0sZfqz3z3IK3fi0k4twMh76oeGweNBCYCzz3XFfLuNBt6g21D1eQ
nJhQ9Q8Hpo7weNYvLQ9kGjQcO8NXph54H7Ccgh5kPPYGtYw0FpTlB0ix3rD85+nNG4n2NndBZfEY
z1h6egmO+eY/YPipctiXSNyuRXetpPUHYPDYvV8faw3Fbd8TPb2+j0Ex3zzH60H7xcQY3rYUusND
25Fd67JXrkz6Bw4bha0F7x9p9OS9Dd+NXy1ywbaUH5oOHvblfG9fF7XvlsejfRth+1Su+W4LiIPf
LfG83r0bmF5roGEHMcTTDT4lthuC4q4muw1xN7HofjEwG1ynk2HnTpy89XbirwLzlt5t+MZxe3J7
4zcGr5Pja9gglybcEFyvc4h7sbcEveVtriOw8CehMctLk+SevIeLlucDfJb2OwmONpBa7BhjY6Lz
2F8t+3Brl4JgKDCSXYPYcOnnqhzYMuG+3SgqurwaNiCG5iaimJ48U50P1zBeOrFgXg2uWt2g+g1B
zHYdkEN5VFa30CGwkoY0ph75MODgh54EtzCcPHxFytcTx5yaG/NcRbtN+9N6g5hBoILOO+Ja30CG
+SS5Y1kw98Vh7gn7BDzwJKYCcJhhctri2oMLxjycGuM8G1qHsFeDQwagr07CQ1xFxdQTXF6PUN8b
e6okN8XcNaFjpuFwdqGxraqhRtDQ6cZa4rhi7OwhuF64z0GFp8Zh8tdoIaecRvloduSg4j9ssaje
d9xX0dA1eBdGfXPxNb3oJcToNC2hvWs6wfQNcuy086b09dhviafF0Na5JJWLHR8tC3kN61nXYfQX
kN9lrGLN13pvXYb4ifE3DTG99guWcnxE+OuT4iDgoPjriKCCDCDGPiXxXybUHbguSqnfFVUSDgmk
6oVxlya41xCxa5XyzIruCDsHFVyB+MnxGMhfHa4qCfEuB6oU+KxiFqqF5xkE+SqhwH8+mzPts38U
n6PR8z0fM9HzPRzJFkDHbjgYqL7ezn3t0GR7Ry44e3EZxj2k6m49zZUjHtwkjce/ayx8RHlJ76ym
fH0MX5WJsnx9RFa9unhL264nf2X8C/z5eLlSrGJjrnwjnwjnwjrs68I5jSMTwT3i/gX+fLxcqVxi
Y658I58I58I58E58PDojE8Ex+TS/ApfgGvyLmK9q9q/A7V7V7VzFe1e1c8jqvavazn5K9q9q9q9q
9q9q9q9q9q9q9q9q9q9q9q9q9q9q9q9q9q9q9q9q9nYzsZ2M7GdjOxnYz4K+3t9q9vt9q+Bfb7cF
+L0M+L0Ntwbbyt836mnN55HLefjz5vGXGfOJT8Nmnu/G8zyfhDwJ4OTDshQPQPAHu229Pyt5+NrQ
W9Pbs/Bwr5PkeD+On158HjOT4nvpP4Q+T8yDfBh6z41OgOBG4PPN0znnmPF6HzzfYX0/Mphyacif
E5MPhzydlt583T5PfPxdOLwXTBgHI348ekPgfG+b8fPR7xnffZ9xfSXyU7oeALfNvNvPODaM77h7
heYdcA8wvt5uHzdtttvm+w883zfPPdEeaHYAhyJ5ABLzfKfK82ZbeebzfPm3zfQ8+zsDoeeGW+df
NTq+efPP1vN5vl7v6PZwQkOaS/o3zb9Do93688288Tw8HJwTeSTmR9AcvfPPN09nZ1MAAf//////
////9CoAJfoCAABcR4A1Ef//////////////////////ng5tvN823m+b5e7Bfjb5t5vN5vxttxPn
siBBxJYWF8gdj5QE82383nnl4NFAF+50r2r2r2r6ulJLFJnm+c655555555vPJDgSnBwcoeQPd83
zfN8z+c88888888888884n1E+ByfFXtXtXtXtXtXtXtXtXtXtXtXtTRnzYgz4MOyPs8EfBD4Hpjr
0J9xIBBBRE4Aj5OmAQAE8yi6BwAAqCJhDAIf8iAfEw19pQVA0SKh0R5E6S6SD8mHAHyaANKcOlPi
dnJgrIdyCM+xoJR0XJAaQ8kMKYAAA8aAiWdkKgUO6sK9FnNZAIIOaFICKR9CWAEMKfQ5EgghBU0B
GhBfT8QOmAacFVCEKfcDkVE5eT7kQhTFKcABDTg9CfUN6455546547V7V7V7Wvop9xlis7GWKzT4
q9q9q9q9q9q9q9q9q9q9q9q9qaM+bEGfBh2R9ngj4IfA9MQr8CHb0J9lWACBBOwIB4OmAAAAnmUX
QOAAFQRMIYBCP5ESlA5McPgjpDBEivgjyJ0l0gIfMhwYenlp5dKfE7OTBWQ7kEZ9XkL2E1giYYBp
DkwAAB40BEs7IVAofM4awQeivVZAIIOaFICKR9CWAEMKeBPqciQQQiPgRoQX0/EDpgGnBVQhDwBg
iolPgR5PsxCHalOAAhpwfE+oUO9555DPG8dq9q9q9rX2Q9gQp377wfVCNjYynY2HAAAAAHwAzM2H
DYY7bba06haMZsbZrdc2vdqAAAbS66dt/7+AL4ioAaDO2bbid3Zu7UAFGr5WAA+FX2WqAI222tUr
WgADapVawAdtsst3d11V9oDRdZO7VqoANdHdWngAH3bUq6rhW11VegDAWK1QABAD9+P347u7W971
AQAF73ve973ve970/xcNwDB0IGUVhwP4INIBTJE1C2m/Dl78eCizi74EwgCSP4cOJMC+gCkf/hkp
GKKgCP4bk1J4dFIxLot04BxhVG2lqLct2UUlD+Sg2aXy41NcOS4KgZU+Wj5rhhwip9VtddgpHDho
igEoWbLab6DOShkooGozOjxpYH3HCGH8OoBbwAB9j7/gAD/b/4AD//v7+AA/P7Z/f/9/j+AXCOAR
Es25ICSJN8JCQmCwEJ9pAzRgMC7QkJCQkJpvQeWEEgDS3D2cjUgkGlSznDYJ5lCICbnt8rE6uPCK
4GrI2aDG64ubl7+7gaKlZgkJUup2gGxZaqWkNyBaW4yQkECQkJCQkJCQkJCQkJCQkJCcE0JCQkJC
QkJCQkJCQkJCQkJCQkJCQkJCQkJCQnBISEhISEhISEhNwSEhMhQSEhISEhISEhISEhISEhITcEhI
SEhISEhISEhITcEhISEOYQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBEjoEkyUKnpBARYXYWAj3
kXdMACGSG+GeGd2MYaYZIW4Y4d/QhoA/n0wIl2L04UwRDI9i9ybYpNEKPoAL0ZPYqUelCzDbC3DB
DPC5DJC3DFDhC3C3DJC5CzDTDXC3C7DxC5C9CuYhohcBKIcX1ML8KjoJ9KFNIgB7kyUMEm2R2FuF
yFx4eIUwbClDPCn6EgWde0eg/wqOmfThmhlhZhcAMNEMUPEPEMkNLxCy7Cn6MNEMYDhdhY9ABybI
W5NPPSh4BvoQqSboUxf5NsMUmgARAB/AD5C9CoBPEmgBIk2EtF7k1QzQxAOHCHeGeGeFaGeGYGwy
Q1w0Q3Q5QvQ7QuwyQ7QrQ6wuw7QuQ7w4urFDNDvDNCzDJC5DNJs229COTIPfh7eoWvML0OcO0MMM
cNkLUNPoQtwtQ7yYAse5NqPQhThwhihjhshjhyhehfhih3hfhjhZh2hbhoBsLkO0NEM8NsOUL8M0
L0OMMcOMMUMcNkPUM0N8LzxDLJlH+TOQtQ0wzwsQ2w5wuQ0Q7wtQyQyQzwxw0QswxQ4Q4wzQtw0Q
2Q2SakyafEmhEmoAesUmAIaOsmiF6GeFuGWFyFyGuGSGeF/oIhpk0P4IkyBkAC/OgCTVpM3CzDRD
SA4Zoc4XoY4cYeIb4W4d4XoWoVIZ4d4a4d4YZMhDNpMw++1hrhihmhchphUhshjhnhnh1hkhjhjh
ohlhnhihjh4hohbh2hpPTZMrDNJnocoZIWYaIgG8yYAsrOwwQtwzw2wzw8QuQ1wyQww2wuwvQ2Qz
wx+hC5DPDJDtDHDnDvDRDZDRDHDPC9DFDHJohnhfhkky0M8MkM0MkLEL8O0M8KcMcL8M0M0L8LkM
cOELcM0LMLkMcMcLcMXoQuQ8QyQxwywtwxQ8QxwtyGQxwzQzwxwyyMe0McMri0OUM0M0PEOULjND
NDQzQtwyQxwyHLnt7zPb3gl7e9nt72e3vM9vZPaCycSJOGhrBIScaYSEmqwT6JuGkIDhbAcLAJhk
hvdhkhjhmhnhihkhhhlhhhehbhihghghmhxhahkhchbhkhbdkcGSKCab9oSEhITbaEhISE22hISE
hNtoSEhITaWhLKa1CYLTTcWlF9oDBnH7oHGAeOX7BISEhISEhISEhISEhISEhISEhISEhISEhITq
EhPvrgkJoSEhISE64JuZggICAgIqhAQEBEr0IVPTCCBAQQFhEoB9EEQkwpA2FwYaYZnYUYZpMl5E
0yeh7euAkK0LYJh2hmGFQYYB47yFGFUYZhhmcfRhYk2QnAQYWgK9wpCD4XAOB4Z4eIWYVQGYUCiC
PTYdJoAkKwEhZBcKQHh2AaAOBQFC/CrC6B0AyFYYbYVoW5M7C0AwBDPC8CIUXsCQkgkBgOHWTAEV
9AGQpg0AggEAAHwownwqoeAdCgfJl1hbhbAAJAAHBQHk0Aj1BHoKIFhNhTAMKEJMKcKgFhUhThTh
ThThUhUhUhUhThThThTBAIBEKkKcKcKcKYwqQqQpwpgACACFE4+FEDQqgGFKCuclrHHGXAGEkBwp
1xjjjjthThThThTtjjkTkTkhwmFOFOFOFMJCZct2FMFDksM5ONtkpf797MTFt/ImIB9UJCQkJCQk
J1CQkJCQkJCQkJCQkJCdQnUJCQlwwTQkJCQkJCQnXUJCQktCAgIwRTggICAhzk2BBaEOZ8KkKkKg
GhNrkDYThchhqhJAUJMKUK4wwOwowzejDtJvg56fVy9ACvDwDYdgTCxC8+i8w0Owreh4lyZGFoGA
yFoCCAOA6FsCAkC4DDCTJpvoAz1hoAsKaAABgMDnkCgKFOGICQowzDDxC4AwfJmgYIMBsLkKMKII
AQMhxBMJMKIOBUmAJwYDIWwACALClCkBQdCi8giFcDgBpMvgaD0AgGwqAUGeIZvV/k24QYBYUYTo
SQQDQQCAQCIU4U4U4UwQCAQCIU4U4UwQCAQCBBAIAsKcJMKMuUCALCsBQNAoDJwFnJycIEwogwEA
jQWcnJyc2BAIBAIYJnLITITJb4EAgEAgJCfb2dBELQgPg4n/0bOj5mubfHQN4w2Y+MDe1R9HR0eC
y9qbxM4ejo6Ojo6OWtBTo6Ojb0WZH6/cAjo0P0dHQz5zMsVcujo6Bo8Xwt6OjojzhZJsq3Z7dHR0
dHR0dHR0dHR6KAZQDKAZQDfn5+/qgGUAygGUA37+fv6oBlAMoBlAN+/v7+qAZQDKAZQDI/fz9UAx
sIudF7UlerL1c6Lnvcudclulx7I/ujo6Ojo6Li6Ojo6Ojo6Ojo6OgPh5dHROBxjel6Ojo6Ojo6Oj
o6Ojo6Ojo6Ojo6Ojofo6Ojo6Hm0RAx0A2zLiBAgQIECBAgQIECOfn5+fndt27fn5+fl+0O3bjmb8
Y7O36RHnhuIECBAgQIw9COnpM4xj8hj3pECBAgQIECBAgQIECFfb29vby8fHx9vb29n+Knj44945
p+z8csx045w/EfzoAgQIECHTp0IEOnWrGKHxQQGEYRhGEbxhGFhuc6cRxHCcBwHAcBwHB1de/kIQ
735mymUCEIcjlQ8hLI/gQhL6ypU6oyZUAAC7b1g6JZmgAADZvDixgAMLo435rd9nF+fn5+fn5+fn
5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn7+fv7+fn7+fn7+fn7+/n
7+fn5+fv7+/n5+fv7+fn5+/v7+/v7+/v7+/n5+/n5+fv7nurq6urq6urq6urq6urq6urq6urq6ur
q6urq6urq6urq9EuX2adOnVp06dOnTp06dOnTp0A5Z8qghUMfPyqCVQb8/KodVA/zxv34LBYLBb9
+/fgsFgsFv379+CwWCwW/fv34LBYLBb9+/fgsFhMFv379+EwmEwe8E+/C4LBYRm+s+OaTPHXr169
evXr169evXr169evXr169evXr16/DXr169evXr169evXr169evXr4FChQrExMTEFChQpEhxMTpL0
ZUp2WMs69evXr1JgxpTBhMGHUTiB/fr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6+vr6
+vr7+vv7+/r7+/r6+/tcUKFCkajUajRQoUKRqiNRpP3JwDmhOB04J+vr6+vr5TjH4TjFOMSwMeDG
MZkWMinhWrWta1pYCjWtwGB6ui/PfANa1uC93pyvwOFa1pavcekunt6KMYzoFjOm1jGMq0eL2pG9
qRYxgsuAvH1wEh5qgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBK
gJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKg
JUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJUBKgJ
UBKgJUBKgJUBKgJUBKgNUBKgJUBKgJUBKgI4fi9uQl//+eefZPPPs2bJ5555555934vvakD5PK9q
QvakD2Pm9qQvakDxPm9qQ47e3C4XC4Xt7e3twuFwuF7e3t7cLhcLhe3t7e3C4XC4Xt7e3twuFw2F
7el3w2Gw2G6aUbh8LhMNPfHS2GmZmZmZmZmZmZmZmZmZmZmZmZmdzMzMzMzMRjF9lX5D6enp6eno
/78/v7fGMCDQxyN8gta1rWta1rWta1rWta1rWta1rWtYrWta1rWta1rWtawg0sGunERFoUqNRIiK
o1Go1EiIqBUKBQCL40VUA3Z2dnZ4dnZ4S+ZR2dnZ2dnYu307Ozs19jOzs7Ozs7I7IqCg9nZ2Fv7O
yuouzs7GfAeejs7OzsXittjs7OyKFN4eOU15Ps7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O
zs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O
zs7Ozs7Ozs7Ozs7Ozo9r2zhMj2dnZ2dnZ2dnZ2dnZ2dnZ2di5gF8jWFZHZ2dnZ2dnZ2dnZ2dnZ2d
nZ2dlvZebz2dnZaEHRAx2cTpQiGDBgwYMGDBgwYMGDBgwYMGDBgwYMGDBgwYMGDBgwYMGDBgwYMG
DBgwYMGKNPdK+MBGDBmMDBgwYljBgwZ1DJvcYMGDBgwYMGDBgwYMGDBgwYMGDBgwYMGDBgwYMGDB
gwYMGDBgwYMGDBgwZs4jxjTjHAwYMxgYMGDMYGJIwYhOCPjVpkBCf66G9FV9XWVd790+3h6fc7l0
Bl3BEki62PX7kx+WlzuJxOJxKoCVASoCVAWJxOJxKoCVASoCVAWJxOJxKoCVASoCVAWJxOJxKoCV
ASoCxOEvd6NziIS0dGoLQlogra6nIz3bt27du3bhG563GoViT2dnUwAB///////////0KgAl+wIA
ADUjZtUR//////////////////////+T7kXl5eXl5eXl5T5aFvnv3xsJjnuTL2cPm7YTuXbmXuNF
y+h4cms8M+nhSU1YlBoTDj137Hdu3bul6Xpel3bt27pel6XpV27du6VpWlaXdu3bulaVpd1PbrPE
z//zYIdfSn1Z91Mz1lOZAkooopEiRISiiikJkSK/vnBAn7e7/IQoUKHk8nk8lChQoeVfyeUgEq4S
o3bDVcS9XKixcjfIl6giRI8Jqui3ixc/yJd+ksx9CHMjqGiELujFixYsWLFixYsWLFixYsWLFixY
sWLFixYsWLFiyG3SF8jwkAiau5IxW8oHOCEwI+85c/y+fPnz58+fPnz58+YHz5VvhJIKmkQ+fPnz
58+fPnz58+ZHz6REqRA4fUfanf9870UqCETNl6j0OQnwhQQ+/s9n7ZdWaVRlvvT17xAh7BpnziPm
cOKy497WovcODQHKHCyNjY2NiDY2Xh6ExsbIyMjIyMjFqXLOc6lq/+25uznOW1uOk8NzZnOYut0T
Zx7GMb03IyCGMYxisexjERw7zY60PStK0rStK0rStK0rStK0rStK0rStK0rStK0rStK0rStK0rSt
K0rStK0rStK0rStK0rStK0rStK0rStK0rStK0rStK0rStK0rStK0rStK0rStK0rStK0rStK0rStK
0rStK0rStK0rStK0rStK0rStK0rStK0rStK0rStK0pjsK7mq6lqWpanqWpalqWp6lqep6nqep6nq
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
xiQvYj71Aujxt3Uod+1WKfoEVID97e5XS7d4+4C0sa2WNs50jloT6Ga2BWFuUXvt131YkflrWvF/
b2feH199qkpKqODP/Tj/EO1yZEIQDkBfFfDwbFN+oJFVAhQiWIRbyFChuvyb86s9FIC6VdpP2UgQ
gtex/BJ7kBIOzm8ZO/Ly97XLSmgSOFuK5KYoWiQ4a5SFlHNkx9jxGxaD6Gt/5CXrv9FFAGlkobn4
sXb8f49dGDJ72SLRDwtt7WimJIelsffs7EB+GoCS0siebHsRZXh/l4WctLxVyEySdKzJt+qnPUT2
i/ANlZQlK2ooooUCopKuKvpUlVVVVVd23ncxtpTqhvzMyqKomrRqiqszP3b1Y3znMZX6aC+c5y48
5bB8ShSjmgoFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
VVVVVVVVVVVVVVVVVVVVVVXfdVVVVVVVVVV9lH+YH//qFIFJlKFKFKFKFKFKFKFKFKFKFKFKFKFK
FKFKFKFKlJZouDRcmZouEp/MKeKfzZsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGz2ynTbPvKkUikUi
kUikUikUikUikUikUikUikUikUikUilUqlUqkUqlUikUikn1IpFIpVKpVKpVKpVKpVKpdq0DsU6J
B0ltEW5JsSSSSSSSTIPa+sMZKNRKEsZsZsZsZkksZsZoYyJJQg4UKjUajUajUajUajUajUajUajU
ajUajUajUajUbGDGCjUajYwYwUaiUajUajYwYwYwYwYwUbGDGDGCjYwYwxIqhNjoDR7NyVsiT1+g
AAAOe7MdscMcKeVj5j5j5j5j5j1LHyUlBlF0aNGj2jRkECqtKlSpUqStHuZlGj+UaOZmUaOfzGjb
MyMqPfF3cc7Snd3eZ3v/d2CminKoq/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbZTbZTbbbbZTbbbbbbbbbbbbbbbbaWym22220ttttttpbbSBjRnn5+YBtFUVVVNU1TVNUnV
NUk1TVJNU1STVNUk1TVJNU1STVVVHVDcS31QS3t5833333333333333333333J3333S5rFt9991n
McC000000000000000000000000hppqY000000hpppppppppppppokrgcN7C8Qb+yL5BiwPqOu9K
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
qpVqpVqpVqpVqpVqpVqpVqpWqpWqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVq
pVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpVqpWqpVqpWqpWqpWqpWqpXqpVqpWqpWqpWqpVqpVqp
VqpWqpWqpVqpWqpVqpWqpWqpWqpWqpWqpVqpWqpWqpWqpWqpVqpXqpXqpVqpWqpWqpVqpVqpWqpV
qpVqpWqpXqpWqpVqpVqpXqpVqpVqpVqpWqpWqpVqp2226ySXoS/FNVHPz1NTz8/Pz8/Pz89TU1NT
U1NTHzxxxxxx4t6V3d3d3d3d3d3d3d3d3d5caIMzMzMDEBpKArSXQSgjUTWlr3PXuPG41xrjXGuN
ca+DXzFqNE/Vd3d3d3drmi0IRMuwyyws3kCZHfWxZNlg4bajUjUjUjUjUjU1DU1VVXxnENDerk4+
SqgsSdRp1+nSjUjsTAfIx47j4lBi41XVEdXxVViqq92F8C4n+cE+IS/UfCglgwv8qreq43wS2g1w
Sa/RLgk3+gQSf6N/41wSaafgf1xth8Z1SXgKcSsvmvyLVVuQ4imUI+u+XptHe0vFFaeb38aPJ9xM
JGInpd25fRUI+wrcUtJoVE7VaJ9N4TDxiqv3UdL3SRuk4IrDJea6au8vmmZ7VVg9VqrD8vxFR4sD
4JP834oJLgkSl/OXginLI+CK/NE/x/xoISfWnor4xwRXBEdF/oX6KDZN/kCQSKlsAKII0tMRvJre
XCww5cCV7OsAMBv4vrbQMR0Nl2p4UqVH29NQFr596510NvmZunmdaA12/DL+/wBCUL/PBIOCLIh/
n+I/wTH6L8R+/4bBX3RNBIrySk+l7+ItXxgo3WxtpdHA2+IkCdLfVFTneSS19GDcTQCCOQGkpOoC
emadgN1dH2EmhzZ37trHNu+1vvPc/NQdNd+ycrgk29pBtNf2mG1wRlIdF+RJJrz83p6aYlokkGHE
GdraJpa9rXkVsve7SDC0+DEuubaJXMB3utLdY6la5zQ16u76Kp3oiI3+qeX1NR5V3Pzfr3TH8MMf
iG1/pb8vg04J7Wk1+6g04JpJsNQ/hfqF+VYLL/Ct4NrE/CHqwhacY2w3B86WzwdUU7ta2qc4b/RL
R8WmaRccTVEq1OK01VxDUCKf9+dSOee8vp2C7Y9mx9jRd6uN/v+f7zlS3/fg/qCSf7fgv0/StbZD
+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
y+wrjQ+xS+KaDUNlokOwPe3n6GpzW1mvaNt8W1/e2Af7McZufXDZxYPObfKr+Pzs2fc3zaW/Yy5u
VmxSYf46zQgehUigPQ6XonmTvLv7ZLpwPvvF6SAOirspwMtD1xduyVf6QEcd0V5o+4+BYyvbQ914
7EHGcn5itXd10UhXj+Yfj+eOTWTCgLpnITrW1ODct26G58+ft5piQ4doSWzTPm+W2GR6WjK/xdab
pjoTiNqN1mEp2W37xUd7f6Vv8xV/pTfD9nzX1cePi39e07f1P7Akokb2fV/b+00V0Sdpr+ktieOS
dMB8qhsx1WUn0bEaRuftSGjH+SFG3C3zW1dITU++PDe+/rrbiE93bmZdmK7OHQw8202+fiJWfMyR
26c6Rr+FcLLkPZy9jmG/BB51SEjdhhdqqOzmuVffH33PlZwfH1Fa71SoCi1de7Ma3VdtffKFbZ/a
nljmepuP21+XxqTd64rjPo7pd6v2WfEKHBVJdr5PIVVTM76058/SwkC5396YNG+7mtxYdOdoYy1r
jJvP64Tksq23+bHWhtP229+2t17p8GWz0ec5dr9355KxE0Pvd2KH104cxehK4GWYRIPz4u1yLS46
y/0h0SUeW0ue+tqK9w53m9RHhuItMzVfaMurLUa5Ors9bXdSntkmrXbuHh46LI73BxsP0zVyup2D
fB1ZP9vXOTh7z+zGrTVr5NA9lCx7b/cpT2tu9msetRCmy5eO8gfG72aehmJ15Xg0j8zIqbrcRzcT
yqeS43ZK1uD6u2Zr+aB+otftDxRZ61Fvk7xortKvvTgXmW6b+xsJbh1ef3Th0ji3Tu/1TW7sHw08
fdMH/3MpMR4X5v20uq5bjZmsr9M51OlNeRnT0l+P2Vkbg0ja+da6XSmzfW1nWrq0nbfbP3uyRYlp
WO1F3lObmfN2sAT/9elMIx/H/NOrIcvmX827t9aX8u2HxjL6884SVmriodnFiG0c211Hc1gapBKI
L48jUSNyY6pLz9mtdWLO0zqlpkqYgj+32Lq3nr7mJQFPZ2dTAARqtA4AAAAAALeRuwprAAAAseDG
rwPo5OUedWi8SSRQiOnQN0MfzNPTT5weetoR2+XuXXVcuy9veg+vIHnZLrFjZ21pYvdYuJB4MipL
zbNuuyXRv3LjDYk11LA+rLpGZXo8rW/Xs1xbl+j2Dr2tadgapBa1zbCu+Fv6TVnCE+LqFe7Ifck8
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
MB83zypGPhM+l1XXk+gA
--bcaec52e601f1faeb504b048fbe0
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

--bcaec52e601f1faeb504b048fbe0--


From xen-devel-bounces@lists.xensource.com Fri Oct 28 09:32:05 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 09:32:05 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJpLf-0000gh-RJ; Fri, 28 Oct 2011 09:32:04 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJTex-0003IY-0m
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 10:22:32 -0700
X-Env-Sender: miche@google.com
X-Msg-Ref: server-5.tower-182.messagelabs.com!1319736146!1003710!1
X-Originating-IP: [216.239.44.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32676 invoked from network); 27 Oct 2011 17:22:27 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51)
	by server-5.tower-182.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 17:22:27 -0000
Received: from hpaq6.eem.corp.google.com (hpaq6.eem.corp.google.com
	[172.25.149.6]) by smtp-out.google.com with ESMTP id p9RHMOUH008834
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 10:22:25 -0700
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1319736145; bh=Fxtd01y0xVohc8OVUfXND0YDt0U=;
	h=MIME-Version:In-Reply-To:References:Date:Message-ID:Subject:From:
	To:Cc:Content-Type:Content-Transfer-Encoding;
	b=Wkf3+XZPCq3KF6CyiyRhiEXMCLckVcgkI141kc6UCpce8wdgu3PMomHSnp6B8qgAR
	1N7y5qUWrKLK251ybClHQ==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=dkim-signature:mime-version:in-reply-to:references:date:
	message-id:subject:from:to:cc:content-type:
	content-transfer-encoding:x-system-of-record;
	b=shp+OSx/CEjEvrLP1ZafhcnT0jhJvRBGsw6q1Dx5hd9z1tWl+kn7YcKRUF/NVzLoF
	J8QLNdlRJeqF6VXGdBbVQ==
Received: from ggnk3 (ggnk3.prod.google.com [10.218.97.67])
	by hpaq6.eem.corp.google.com with ESMTP id p9RHLWFF007589
	(version=TLSv1/SSLv3 cipher=RC4-SHA bits=128 verify=NOT)
	for <xen-devel@lists.xensource.com>; Thu, 27 Oct 2011 10:22:22 -0700
Received: by ggnk3 with SMTP id k3so4350389ggn.1
	for <xen-devel@lists.xensource.com>;
	Thu, 27 Oct 2011 10:22:22 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=beta;
	h=mime-version:in-reply-to:references:date:message-id:subject:from:to
	:cc:content-type:content-transfer-encoding:x-system-of-record;
	bh=NRfk+bk4x0HZBP5LKUl1mKbct2HP1Mj+gp8/UN9r+BE=;
	b=fVvnAJrhRjVmcDp602FsNKcOK+AZAVHEAFJET+ZanMf9aKEkl6YVoQxZb3QZ8xmu1g
	Nl2OY/5QEkctCof3qHzA==
Received: by 10.229.61.71 with SMTP id s7mr8271233qch.19.1319736142303;
	Thu, 27 Oct 2011 10:22:22 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.229.61.71 with SMTP id s7mr8271217qch.19.1319736141925; Thu,
	27 Oct 2011 10:22:21 -0700 (PDT)
Received: by 10.229.175.10 with HTTP; Thu, 27 Oct 2011 10:22:21 -0700 (PDT)
In-Reply-To: <20111027153132.GA2751@phenom.dumpdata.com>
References: <20111027053007.GA32765@phenom.dumpdata.com>
	<20111027054806.GA1377@suse.de>
	<CAB8Rdaq2r4Uc-WZK-k=wiEW8DKdixn+9dB7E4_XDL7k8jCMwSw@mail.gmail.com>
	<20111027150826.GC1157@phenom.dumpdata.com>
	<20111027153132.GA2751@phenom.dumpdata.com>
Date: Thu, 27 Oct 2011 10:22:21 -0700
Message-ID: <CAB8RdarECbYFuuD7-Jz_o5kC3aBd5JAASB76B=ZioYo2-sjPfg@mail.gmail.com>
From: Miche Baker-Harvey <miche@google.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
X-System-Of-Record: true
X-Mailman-Approved-At: Fri, 28 Oct 2011 09:13:06 -0700
Cc: xen-devel@lists.xensource.com, Greg KH <gregkh@suse.de>,
	linux-kernel@vger.kernel.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

Konrad,

This looks similar to something I was seeing before I added some
locking and multi-hvc console support.
I think what's happening is that once the console is enabled, the
first line in printk's console buffer is
being infinitely printed.  Would you be willing to try another patch?
I'm pulling the patch into Linus'
latest now...

Here's the message on the patch:


    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 misse=
d
    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().  I=
t
    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 st=
atic
    struct console* hvc_console, to be used for early printk.  We aren't do=
ing
    early printk, but more importantly, there is no code to multiplex on th=
at
    one console.  Multiple virtio_console ports were "sharing" this, which =
was
    disasterous since both the index and the flags for the console are stor=
ed
    there. The console struct is remembered in the hvc_struct, and it is
    deallocated when the hvc_struct is deallocated.

Thanks,

Miche

On Thu, Oct 27, 2011 at 8:31 AM, Konrad Rzeszutek Wilk
<konrad.wilk@oracle.com> wrote:
>> > The "console [hvc0] enabled" message is coming from register_console()=
 in
>> > printk.c, and it doesn't have any loops.
>> > It's called from hvc_console_init(), hvc_instantiate(), and hvc_alloc(=
),
>> > none of which have loops. =A0The call in hvc_alloc() is the one I adde=
d, so
>> > either I've inadvertently made one of the other two repeat (I'm guestt=
ing
>> > hvc_instantiate() is the one you're using), or you're infinitely calli=
ng
>> > hvc_alloc(). =A0There's a calls to hvc_alloc() in hvc_xen.c::xen_hvc_i=
nit(),
>> > and in init_port_console() in virtio_console.c, but again, no loops.
>> > =A0Similarly for hvc_instantiate().
>> >
>> > So, could I trouble you to put a breakpoint in register_console() and =
send
>> > me the stack?
>>
>> A dump_stack() should suffice I presume? Yeah let me do that.
>
> Trying 192.168.101.14...
> Connected to maxsrv1.
> Escape character is '^]'.
>
> PXELINUX 3.82 2009-06-09 =A0Copyright (C) 1994-2009 H. Peter Anvin et al
> Loading xen.gz... ok
> Loading vmlinuz... ok
> Loading initramfs.cpio.gz... ok
> =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|_|_|_|\___/_____/_/
>
> (XEN) Xen version 4.1-111027 (konrad@dumpdata.com) (gcc version 4.4.4 201=
00503 (Red Hat 4.4.4-2) (GCC) ) Thu Oct 27 11:16:34 EDT 2011
> (XEN) Latest ChangeSet: Tue Oct 04 14:11:56 2011 +0200 23182:98306e1f58ba
> (XEN) Console output is synchronous.
> (XEN) Bootloader: unknown
> (XEN) Command line: com1=3D115200,8n1 console=3Dcom1,vga guest_loglvl=3Da=
ll sync_console apic=3Ddebug
> (XEN) Video information:
> (XEN) =A0VGA is text mode 80x25, font 8x16
> (XEN) =A0VBE/DDC methods: none; EDID transfer time: 2 seconds
> (XEN) =A0EDID info not retrieved because no DDC retrieval method detected
> (XEN) Disc information:
> (XEN) =A0Found 0 MBR signatures
> (XEN) =A0Found 0 EDD information structures
> (XEN) Xen-e820 RAM map:
> (XEN) =A00000000000000000 - 000000000009d800 (usable)
> (XEN) =A0000000000009d800 - 00000000000a0000 (reserved)
> (XEN) =A000000000000cc000 - 0000000000100000 (reserved)
> (XEN) =A00000000000100000 - 000000007fff0000 (usable)
> (XEN) =A0000000007fff0000 - 0000000080000000 (reserved)
> (XEN) =A00000000080000000 - 00000000cfef0000 (usable)
> (XEN) =A000000000cfef0000 - 00000000cfef5000 (ACPI data)
> (XEN) =A000000000cfef5000 - 00000000cff7f000 (ACPI NVS)
> (XEN) =A000000000cff80000 - 00000000d0000000 (reserved)
> (XEN) =A000000000e0000000 - 00000000f0000000 (reserved)
> (XEN) =A000000000fec00000 - 00000000fec10000 (reserved)
> (XEN) =A000000000fee00000 - 00000000fee01000 (reserved)
> (XEN) =A000000000fff80000 - 0000000100000000 (reserved)
> (XEN) =A00000000100000000 - 0000000130000000 (usable)
> (XEN) ACPI: RSDP 000F79B0, 0024 (r2 PTLTD )
> (XEN) ACPI: XSDT CFEF0753, 009C (r1 DELL =A0 PE_SC3 =A0 =A06040000 DELL =
=A0 =A0 =A0 =A00)
> (XEN) =A06040000 DELL =A0 =A0F4240)
> (XEN) ACPI: DSDT CFEF07EF, 33FC (r1 DELL =A0 PE_SC3 =A0 =A06040000 MSFT =
=A0100000E)
> (XEN) ACPI: FACS CFEF5FC0, 0040
> (XEN) ACPI: TCPA CFEF3D53, 0032 (r1 Phoeni =A0x =A0 =A0 =A0 =A06040000 =
=A0TL =A0 =A0 =A0 =A0 0)
> (XEN) ACPI: SLIC CFEF3D85, 0024 (r1 DELL =A0 PE_SC3 =A0 =A06040000 PTL =
=A0 =A0 =A0 =A0 1)
> (XEN) ACPI: SPCR CFEF3DA9, 0050 (r1 DELL =A0 PE_SC3 =A0 =A06040000 PTL =
=A0 =A0 =A0 =A0 1)
> (XEN) ACPI: EINJ CFEF3DF9, 01B0 (r1 PTL =A0 =A0WHEAPTL =A0 6040000 PTL =
=A0 =A0 =A0 =A0 1)
> (XEN) ACPI: HEST CFEF3FA9, 00A8 (r1 PTL =A0 =A0WHEAPTL =A0 6040000 PTL =
=A0 =A0 =A0 =A0 1)
> (XEN) ACPI: BERT CFEF4051, 0030 (r1 PTL =A0 =A0WHEAPTL =A0 6040000 PTL =
=A0 =A0 =A0 =A0 1)
> (XEN) ACPI: SSDT CFEF4081, 00E1 (r1 wheaos =A0wheaosc =A06040000 INTL 200=
50624)
> (XEN) ACPI: ERST CFEF4162, 0270 (r1 PTL =A0 =A0WHEAPTL =A0 6040000 PTL =
=A0 =A0 =A0 =A0 1)
> (XEN) ACPI: SRAT CFEF43D2, 00E8 (r1 AMD =A0 =A0HAMMER =A0 =A06040000 AMD =
=A0 =A0 =A0 =A0 1)
> (XEN) ACPI: SSDT CFEF44BA, 0A30 (r1 AMD =A0 =A0POWERNOW =A06040000 AMD =
=A0 =A0 =A0 =A0 1)
> (XEN) ACPI: MCFG CFEF4EEA, 003C (r1 PTLTD =A0 =A0MCFG =A0 =A06040000 =A0L=
TP =A0 =A0 =A0 =A00)
> (XEN) ACPI: HPET CFEF4F26, 0038 (r1 PTLTD =A0HPETTBL =A0 6040000 =A0LTP =
=A0 =A0 =A0 =A01)
> (XEN) ACPI: APIC CFEF4F5E, 007A (r1 PTLTD =A0 =A0 =A0 =A0APIC =A0 =A06040=
000 =A0LTP =A0 =A0 =A0 =A00)
> (XEN) ACPI: BOOT CFEF4FD8, 0028 (r1 PTLTD =A0$SBFTBL$ =A06040000 =A0LTP =
=A0 =A0 =A0 =A01)
> (XEN) System RAM: 4094MB (4192756kB)
> (XEN) Domain heap initialised
> (XEN) Processor #0 0:2 APIC version 16
> (XEN) Processor #1 0:2 APIC version 16
> (XEN) Processor #2 0:2 APIC version 16
> (XEN) Processor #3 0:2 APIC version 16
> (XEN) IOAPIC[0]: apic_id 4, version 17, address 0xfec00000, GSI 0-23
> (XEN) Enabling APIC mode: =A0Flat. =A0Using 1 I/O APICs
> (XEN) ERST table is invalid
> (XEN) Using scheduler: SMP Credit Scheduler (credit)
> (XEN) Detected 2109.738 MHz processor.
> (XEN) Initing memory sharing.
> (XEN) AMD-Vi: IOMMU not found!
> (XEN) I/O virtualisation disabled
> (XEN) ENABLING IO-APIC IRQs
> (XEN) =A0-> Using new ACK method
> (XEN) Platform timer is 25.000MHz HPET
> =FF(XEN) Allocated console ring of 16 KiB.
> (XEN) HVM: ASIDs enabled.
> (XEN) SVM: Support(XEN) Brought up 4 CPUs
> (XEN) *** LOADING DOMAIN 0 ***
> (XEN) =A0Xen =A0kernel: 64-bit, lsb, compat32
> (XEN) =A0Dom0 kernel: 64-bit, PAE, lsb, paddr 0x1000000 -> 0x202f000
> (XEN) PHYSICAL MEMORY ARRANGEMENT:
> (XEN) =A0Dom0 alloc.: =A0 0000000118000000->000000011c000000 (926310 page=
s to be allocated)
> (XEN) =A0Init. ramdisk: 000000012170e000->000000012ffff200
> (XEN) VIRTUAL MEMORY ARRANGEMENT:
> (XEN) =A0Loaded kernel: ffffffff81000000->ffffffff8202f000
> (XEN) =A0Init. ramdisk: ffffffff8202f000->ffffffff90920200
> (XEN) =A0Phys-Mach map: ffffffff90921000->ffffffff910c6ac0
> (XEN) =A0Start info: =A0 =A0ffffffff910c7000->ffffffff910c74b4
> (XEN) =A0Page tables: =A0 ffffffff910c8000->ffffffff91155000
> (XEN) =A0Boot stack: =A0 =A0ffffffff91155000->ffffffff91156000
> (XEN) =A0TOTAL: =A0 =A0 =A0 =A0 ffffffff80000000->ffffffff91400000
> (XEN) =A0ENTRY ADDRESS: ffffffff81aec200
> (XEN) Dom0 has maximum 4 VCPUs
> (XEN) Scrubbing Free RAM: .done.
> (XEN) Xen trace buffers: disabled
> (XEN) Std. Loglevel: Errors and warnings
> (XEN) Guest Loglevel: All
> (XEN) ***********RNING: CONSOLE OUTPUT IS SYNCHRONOUS
> (XEN) ******* This option is intended to aid debugging of Xen by ensuring
> (XEN) ******* that all output is synchronously delivered on the serial li=
ne.
> (XEN) ******* However it can introduce SIGNIFICANT latencies and affect
> (XEN) ******* timekeeping. It is NOT recommended for production use!
> (XEN) **********************************************
> (XEN) 3... 2... 1...
> (XEN) Xen is relinquishing VGA console.
> (XEN) *** Serial input -> DOM0 (type 'CTRL-a' three times to switch input=
 to Xen)
> (X[ =A0 =A00.000000] Initializing cgroup subsys cpuset
> [ =A0 =A00.000000] Initializing cgroup subsys cpu
> [ =A0 =A00.000000] Linux version 3.lways_enable earlyprintk=3Dxen console=
=3Dtty console=3Dhvc0 loglevel=3D10 xen-pciback.hide=3D(01:00.0)(01:00.1)(0=
5:02.0)(05:02.1) pciback.hide=3D(01:00.0)(01:00.1) initcall_debug ttm.no_dm=
a=3D1
> [ =A0 =A00.000000] Freeing =A09d-100 pfn range: 99 pages freed
> [ =A0 =A00.000000] 1-1 mapping on 9d->100
> [ =A0 =A00.000000] Freeing =A07fff0-80000 pfn range: 16 pages freed
> [ =A0 =A00.000000] 1-1 mapping on 7fff0->80000
> [ =A0 =A00.000000] Freeing =A0cfef0-f4b58 pfn range: 150632 pages freed
> [ =A0 =A00.000000] 1-1 mapping on cfef0->100000
> [ =A0 =A00.000000] Released 150747 pages of unused memory
> [ =A0 =A00.000000] Set 196995 page(s) to 1-1 mapping
> [ =A0 =A00.000000] BIOS-provided physical RAM map:
> [ =A0 =A00.000000] =A0Xen: 0000000000000000 - 000000000009d000 (usable)
> [ =A0 =A00.000000] =A0Xen: 000000000009d800 - 0000000000100000 (reserved)
> [ =A0 =A00.000000] =A0Xen: 0000000000100000 - 000000007fff0000 (usable)
> [ =A0 =A00.000000] =A0Xen: 000000007fff0000 - 0000000080000000 (reserved)
> [ =A0 =A00.000000] =A0Xen: 0000000080000000 - 00000000cfef0000 (usable)
> [ =A0 =A00.000000] =A0Xen: 00000000cfef0000 - 00000000cfef5000 (ACPI data=
)
> [ =A0 =A00.000000] =A0Xen: 00000000cfef5000 - 00000000cff7f000 (ACPI NVS)
> [ =A0 =A00.000000] =A0Xen: 00000000cff80000 - 00000000d0000000 (reserved)
> [ =A0 =A00.000000] =A0Xen: 00000000e0000000 - 00000000f0000000 (reserved)
> [ =A0 =A00.000000] =A0Xen: 00000000fec00000 - 00000000fec10000 (reserved)
> [ =A0 =A00.000000] =A0Xen: 00000000fee00000 - 00000000fee01000 (reserved)
> [ =A0 =A00.000000] =A0Xen: 00000000fff80000 - 0000000100000000 (reserved)
> [ =A0 =A00.000000] =A0Xen: 0000000100000000 - 0000000130000000 (usable)
> [ =A0 =A00.000000] bootconsole [xenboot0] enabled
> [ =A0 =A00.000000] NX (Execute Disable) protection: active
> [ =A0 =A00.000000] DMI present.
> [ =A0 =A00.000000] DMI: Dell Inc. PowerEdge T105 /0RR825, BIOS 1.3.2 08/2=
0/2008
> [ =A0 =A00.000000] e820 update range: 0000000000000000 - 0000000000010000=
 (usable) =3D=3D> (reserved)
> [ =A0 =A00.000000] e820 remove range: 00000000000a0000 - 0000000000100000=
 (usable)
> [ =A0 =A00.000000] No AGP bridge found
> [ =A0 =A00.000000] last_pfn =3D 0x130000 max_arch_pfn =3D 0x400000000
> [ =A0 =A00.000000] last_pfn =3D 0xc[ =A0 =A00.000000] initial memory mapp=
ed : 0 - 10921000
> [ =A0 =A00.000000] Base memory trampoline at [ffff880000098000] 98000 siz=
e 2048 - 00cfef0000 page 4k
> [ =A0 =A00.000000] kernel direct mapping tables up to cfef0000 @ 97b000-1=
000000
> [ =A0 =A00.000000] xen: setting RW the range f70000 - 1000000
> [ =A0 =A00.000000] init_memory_mapping: 0000000100000000-0000000130000000=
6a000-cfef0000
> [ =A0 =A00.000000] xen: setting RW the range cf6eb000 - cfef0000
> [ =A0 =A00.000000] RAMDISK: 0202f000 - 10921000
> [ =A0 =A00.000000] ACPI: =A000000000000f79b0 00024 (v02 PTLTD )
> [ =A0 =A00.000000] ACPI: XSDT 00000000cfef0753 0009C (v01 DELL =A0 PE_SC3=
 =A0 06040000 DELL 00000000)
> [ =A0 =A00.000000] ACPI: FACP 00000000cfef3c5f 000F4 (v03 DELL =A0 PE_SC3=
 =A0 06040000 DELL 000F4240)
> [ =A0 =A00.000000] ACPI: DSDT 00000000cfef07ef 033FC (v01 DELL =A0 PE_SC3=
 =A0 06040000 MSFT 0100000E)
> [ =A0 =A00.000000] ACPI: FACS 00000000cfef5fc0 00040
> [ =A0 =A00.000000] ACPI: TCPA 00000000cfef3d53 00032 (v01 Phoeni =A0x =A0=
 =A0 =A0 06040000 =A0TL =A000000000)
> [ =A0 =A00.000000] ACPI: SLIC 00000000cfef3d85 00024 (v01 DELL =A0 PE_SC3=
 =A0 06040000 PTL =A000000001)
> [ =A0 =A00.000000] ACPI: SPCR 00000000cfef3da9 00050 (v01 DELL =A0 PE_SC3=
 =A0 06040000 PTL =A000000001)
> [ =A0 =A00.000000] ACPI: EINJ 00000000cfef3df9 001B0 (v01 PTL =A0 =A0WHEA=
PTL =A006040000 PTL =A000000001)
> [ =A0 =A00.000000] ACPI: HEST 00000000cfef3fa9 000A8 (v01 PTL =A0 =A0WHEA=
PTL =A006040000 PTL =A000000001)
> [ =A0 =A00.000000] ACPI: BERT 00000000cfef4051 00030 (v01 PTL =A0 =A0WHEA=
PTL =A006040000 PTL =A000000001)
> [ =A0 =A00.000000] ACPI: SSDT 00000000cfef4081 000E1 (v01 wheaos =A0wheao=
sc 06040000 INTL 20050624)
> [ =A0 =A00.000000] ACPI: ERST 00000000cfef4162 00270 (v01 PTL =A0 =A0WHEA=
PTL =A006040000 PTL =A000000001)
> [ =A0 =A00.000000] ACPI: SRAT 00000000cfef43d2 000E8 (v01 AMD =A0 =A0HAMM=
ER =A0 06040000 AMD =A000000001)
> [ =A0 =A00.000000] ACPI: SSDT 00000000cfef44ba 00A30 (v01 AMD =A0 =A0POWE=
RNOW 06040000 AMD =A000000001)
> [ =A0 =A00.000000] ACPI: MCFG 00000000cfef4eea 0003C (v01 PTLTD =A0 =A0MC=
FG =A0 06040000 =A0LTP 00000000)
> [ =A0 =A00.000000] ACPI: HPET 00000000cfef4f26 00038 (v01 PTLTD =A0HPETTB=
L =A006040000 =A0LTP 00000001)
> [ =A0 =A00.000000] ACPI: APIC 00000000cfef4f5e 0007A (v01 PTLTD =A0? APIC=
 =A0 06040000 =A0LTP 00000000)
> [ =A0 =A00.000000] ACPI: BOOT 00000000cfef4fd8 00028 (v01 PTLTD =A0$SBFTB=
L$ 06040000 =A0LTP 00000001)
> [ =A0 =A00.000000] ACPI: Local APIC address 0xfee00000
> [ =A0 =A00.000000] Scanning NUMA topology in Northbridge 24
> [ =A0 =A00.000000] No NUMA configuration found
> [ =A0 =A00.000000] Faking a node at 0000000000000000-0000000130000000
> [ =A0 =A00.000000] Initmem setup node 0 0000000000000000-0000000130000000
> [ =A0 =A00.000000] =A0 NODE_DATA [00000000cfec9000 - 00000000cfeeffff]
> [ =A0 =A00.000000] Zone PFN ranges:
> [ =A0 =A00.000000] =A0 DMA =A0 =A0 =A00x00000010 -> 0x00001000
> [ =A0 =A00.000000] =A0 DMA32 =A0 =A00x00001000 -> 0x00100000
> [ =A0 =A00.000000] =A0 Normal =A0 0x00100000 -> 0x00130000
> [ =A0 =A00.000000] Movable zone start PFN for each node
> [ =A0 =A00.000000] early_node_map[4] active PFN ranges
> [ =A0 =A00.000000] =A0 =A0 0: 0x00000010 -> 0x0000009d
> [ =A0 =A00.000000] =A0 =A0 0: 0x00000100 -> 0x0007fff0
> [ =A0 =A00.000000] =A0 =A0 0: 0x00080000 -> 0x000cfef0
> [ =A0 =A00.000000] =A0 =A0 0: 0x00100000 -> 0x00130000
> [ =A0 =A00.000000] On node 0 totalpages: 1048173
> [ =A0 =A00.000000] =A0 DMA zone: 64 pages used for memmap
> [ =A0 =A00.000000] =A0 DMA zone: 1530 pages reserved
> [ =A0 =A00.000000] =A0 DMA zone: 2387 pages, LIFO batch:0
> [ =A0 =A00.000000] =A0 DMA32 zone: 16320 pages used for memmap
> [ =A0 =A00.000000] =A0 DMA32 zone: 831264 pages, LIFO batch:31
> [ =A0 =A00.000000] =A0 Normal zone: 3072 pages used for memmap
> [ =A0 =A00.000000] =A0 Normal zone: 193536 pages, LIFO batch:31
> [ =A0 =A00.000000] ACPI: PM-Timer IO Port: 0x8008
> [ =A0 =A00.000000] ACPI: Local APIC address 0xfee00000
> [ =A0 =A00.000000] ACPI: LAPIC (a 0/0x0, fixing up to 0x10
> [ =A0 =A00.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x01] enabled)
> [ =A0 =A00.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x02] enabled)
> [ =A0 =A00.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x03] enabled)
> [ =A0 =A00.000000] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
> [ =A0 =A00.000000] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
> [ =A0 =A00.000000] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1])
> [ =A0 =A00.000000] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1])
> [ =A0 =A00.000000] ACPI: IOAPIC (id[0x04] address[0xfec00000] gsi_base[0]=
)
> [ =A0 =A00.000000] IOAPIC[0]: apic_id 4, version 255, address 0xfec00000,=
 GSI 0-255
> [ =A0 =A00.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high e=
dge)
> [ =A0 =A00.000000] ACPI: IRQ0 used by override.
> [ =A0 =A00.000000] ACPI: IRQ2 used by override.
> [ =A0 =A00.000000] ACPI: IRQ9 used by override.
> [ =A0 =A00.000000] Using ACPI (MADT) for SMP configuration information
> [ =A0 =A00.000000] ACPI: HPET id: 0x10de8201 base: 0xfed00000
> [ =A0 =A00.000000] SMP: Allowing 4 CPUs, 0 hotplug CPUs
> [ =A0 =A00.000000] nr_irqs_gsi: 272
> [ =A0 =A00.000000] PM: Registered nosave memory: 000000000009d000 - 00000=
0000009e000
> [ =A0 =A00.000000] PM: Registered nosave memory: 000000000009e000 - 00000=
00000100000
> [ =A0 =A00.000000] PM: Registered nosave memory: 000000007fff0000 - 00000=
00080000000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000cfef0000 - 00000=
000cfef5000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000cfef5000 - 00000=
000cff7f000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000cff7f000 - 00000=
000cff80000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000cff80000 - 00000=
000d0000000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000d0000000 - 00000=
000e0000000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000e0000000 - 00000=
000f0000000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000f0000000 - 00000=
000fec00000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000fec00000 - 00000=
000fec10000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000fec10000 - 00000=
000fee00000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000fee00000 - 00000=
000fee01000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000fee01000 - 00000=
000fff80000
> [ =A0 =A00.000000] PM: Registered nosave memory: 00000000fff80000 - 00000=
00100000000
> [ =A0 =A00.000000] Allocating PCI resources starting at d0000000 (gap: d0=
000000:10000000)
> [ =A0 =A00.000000] Booting paravirtualized kernel on Xen
> [ =A0 =A00.000000] Xen version: 4.1-111027 (preserve-AD)
> [ =A0 =A00.000000] setup_percpu: NR_CPUS:4096 nr_cpumask_bits:4 nr_cpu_id=
s:4 nr_node_ids:1
> [ =A0 =A00.000000] PERCPU: Embedded 28 pages/cpu @ffff8800cfe33000 s82944=
 r8192 d23552 u114688
> [ =A0 =A00.000000] pcpu-alloc: s82944 r8192 d23552 u114688 alloc=3D28*409=
6
> [ =A0 =A00.000000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3
> [ =A0 =A00.000000] Built 1 zonelists in Node order, mobility grouping on.=
 =A0Total pages: 1027187
> [ =A0 =A00.000000] Policy zone: Normal
> [ =A0 =A00.000000] Kernel command line: debug selinux=3D0 initrd_ignore_l=
oglevel sysrq_always_enable earlyprintk=3Dxen console=3Dtty console=3Dhvc0 =
loglevel=3D10 xen-pciback.hide=3D(01:00.0)(01:00.1)(05:02.0)(05:02.1) pciba=
ck.hide=3D(01:00.0)(01:00.1) initcall_debug ttm.no_dma=3D1
> [ =A0 =A00.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)
> [ =A0 =A00.000000] Placing 64MB software IO TLB between ffff8800c7000000 =
- ffff8800cb000000
> [ =A0 =A00.000000] software IO TLB at phys [ =A0 =A00.000000] Memory: 300=
3820k/4980736k available (6391k kernel code, 788044k absent, 1188872k reser=
ved, 4703k data, 2448k init)
> [ =A0 =A00.000000] SLUB: Genslabs=3D15, HWalign=3D64, Order=3D0-3, MinObj=
ects=3D0, CPUs=3D4, Nodes=3D1
> [ =A0 =A00.000000] Preemptible hierarchical RCU implementation.
> [ =A0 =A00.000000] NR_IRQS:262400 nr_irqs:1024 16
> [ =A0 =A00.000000] xen: sci override: global_irq=3D9 trigger=3D0 polarity=
=3D1
> [ =A0 =A00.000000] xen: registering gsi 9 triggering 0 polarity 1
> [ =A0 =A00.000000] xen: --> pirq=3D9 -> irq=3D9 (gsi=3D9)
> [ =A0 =A00.000000] xen: acpi sci 9
> [ =A0 =A00.000000] xen: --> pirq=3D1 -> irq=3D1 (gsi=3D1)
> [ =A0 =A00.000000] xen: --> pirq=3D2 -> irq=3D2 (gsi=3D2)
> [ =A0 =A00.000000] xen: --> pirq=3D3 -> irq=3D3 (gsi=3D3)
> [ =A0 =A00.000000] xen: --> pirq=3D4 -> irq=3D4 (gsi=3D4)
> [ =A0 =A00.000000] xen: --> pirq=3D5 -> irq=3D5 (gsi=3D5)
> [ =A0 =A00.000000] xen: --> pirq=3D6 -> irq=3D6 (gsi=3D6)
> [ =A0 =A00.000000] xen: --> pirq=3D7 -> irq=3D7 (gsi=3D7)
> [ =A0 =A00.000000] xen: --> pirq=3D8 -> irq=3D8 (gsi=3D8)
> [ =A0 =A00.000000] xen_map_pirq_gsi: returning irq 9 for gsi 9
> [ =A0 =A00.000000] xen: --> pirq=3D9 -> irq=3D9 (gsi=3D9)
> [ =A0 =A00.000000] xen: --> pirq=3D10 -> irq=3D10 (gsi=3D10)
> [ =A0 =A00.000000] xen: --> pirq=3D11 -> irq=3D11 (gsi=3D11)
> [ =A0 =A00.000000] xen: --> pirq=3D12 -> irq=3D12 (gsi=3D12)
> [ =A0 =A00.000000] xen: --> pirq=3D13 -> irq=3D13 (gsi=3D13)
> [ =A0 =A00.000000] xen: --> pirq=3D14 -> irq=3D14 (gsi=3D14)
> [ =A0 =A00.000000] xen: --> pirq=3D15 -> irq=3D15 (gsi=3D15)
> [ =A0 =A00.000000] kmemleak: Early log buffer exceeded, please increase D=
EBUG_KMEMLEAK_EARLY_LOG_SIZE
> [ =A0 =A00.000000] kmemleak: Kernel memory leak detector disabled
> [ =A0 =A00.000000] Console: colour VGA+ 80x25
> [ =A0 =A00.000000] console [tty0] enabled
> [ =A0 =A00.000000] Pid: 0, comm: swapper Not tainted 3.1.0-04893-g138c4ae=
-dirty #1
> [ =A0 =A00.000000] Call Trace:
> [ =A0 =A00.000000] =A0[<ffffffff8109e15e>] ? register_console+0x1ae/0x390
> [ =A0 =A00.000000] =A0[<ffffffff813ae83d>] hvc_instantiate+0x2d/0xd0
> [ =A0 =A00.000000] =A0[<ffffffff813aea49>] xen_cons_init+0x49/0x50
> [ =A0 =A00.000000] =A0[<ffffffff81b1f261>] console_init+0x19/0x2a
> [ =A0 =A00.000000] =A0[<ffffffff81aecda6>] start_kernel+0x2d9/0x408
> [ =A0 =A00.000000] =A0[<ffffffff81aec346>] x86_64_start_reservations+0x13=
1/0x135
> [ =A0 =A00.000000] =A0[<ffffffff81aefb49>] xen_start_kernel+0x612/0x619
> [ =A0 =A00.000000] console [hvc0] enabled, bootconsole disabled
> [ =A0 =A00.000000] console [hvc0] enabled, bootconsole disabled
> [ =A0 =A00.000000] Xen: using vcpuop timer interface
> [ =A0 =A00.000000] installing Xen timer for CPU 0
> [ =A0 =A00.000000] Detected 2109.738 MHz processor.
> [ =A0 =A00.000999] Calibrating delay loop (skipped), value calculated usi=
ng timer frequency.. 4219.47 BogoMIPS (lpj=3D2109738)
> [ =A0 =A00.000999] pid_max: default: 32768 minimum: 301
> [ =A0 =A00.001051] Security Framework initialized
> [ =A0 =A00.001999] SELinux: =A0Disabled at boot.
> [ =A0 =A00.003840] Dentry cache hash table entries: 524288 (order: 10, 41=
94304 bytes)
> [ =A0 =A00.006658] Inode-cache hash table entries: 262144 (order: 9, 2097=
152 bytes)
> [ =A0 =A00.007725] Mount-cache hash table entries: 256
> [ =A0 =A00.008323] Initializing cgroup subsys cpuacct
> [ =A0 =A00.009009] Initializing cgroup subsys freezer
> [ =A0 =A00.010080] tseg: 00cff80000
> [ =A0 =A00.011006] CPU: Physical Processor ID: 0
> [ =A0 =A00.011998] CPU: Processor Core ID: 0
> [ =A0 =A00.011998] using AMD E400 aware idle routine
> [ =A0 =A00.013338] ACPI: Core revision 20110623
> [ =A0 =A00.025025] ftrace: allocating 23089 entries in 91 pages
> [ =A0 =A00.027130] cpu 0 spinlock event irq 273
> [ =A0 =A00.028099] calli0x0/0x12 @ 1
> [ =A0 =A00.028998] initcall trace_init_flags_sys_enter+0x0/0x12 returned =
0 after 0 usecs
> [ =A0 =A00.028998] calling =A0init_hw_perf_events+0x0/0x44b @ 1
> [ =A0 =A00.028998] Performance Events: (XEN) traps.c:2432:d0 Domain attem=
pted WRMSR 00000000c0010004 from 0x00000812a205b8c2 to 0x000000000000abcd.
> Broken PMU hardware detected, using software events only.
> [ =A0 =A00.030997] initcall init_hw_perf_events+0x0/0x44b returned 0 afte=
r 1952 usecs
> [ =A0 =A00.030997] calling =A0register_trigger_all_cpu_backtrace+0x0/0x1f=
 @ 1
> [ =A0 =A00.030997] initcall register_trigger_all_cpu_backtrace+0x0/0x1f r=
eturned 0 after 0 usecs
> [ =A0 =A00.030997] calling =A0migration_init+0x0/0x6d @ 1
> [ =A0 =A00.030997] initcall migration_init+0x0/0x6d returned 0 after 0 us=
ecs
> [ =A0 =A00.030997] calling =A0spawn_ksoftirqd+0x0/0x53 @ 1
> [ =A0 =A00.033013] initcall spawn_ksoftirqd+0x0/0x53 returned 0 after 292=
9 usecs
> [ =A0 =A00.033997] calling =A0init_workqueues+0x0/0x2ae @ 1
> [ =A0 =A00.036091] initcall init_workqueues+0x0/0x2ae returned 0 after 29=
29 usecs
> [ =A0 =A00.036997] calling =A0cpu_stop_init+0x0/0xab @ 1
> [ =A0 =A00.039026] initcall cpu_stop_init+0x0/0xab returned 0 after 2929 =
usecs
> [ =A0 =A00.039997] calling =A0rcu_scheduler_really_started+0x0/0x12 @ 1
> [ =A0 =A00.039997] initcall rcu_scheduler_really_started+0x0/0x12 returne=
d 0 after 0 usecs
> [ =A0 =A00.039997] calling =A0relay_init+0x0/0x14 @ 1
> [ =A0 =A00.039997] initcall relay_init+0x0/0x14 returned 0 after 0 usecs
> [ =A0 =A00.039997] calling =A0tracer_alloc_buffers+0x0/0x1cf @ 1
> [ =A0 =A00.039997] initcall tracer_alloc_buffers+0x0/0x1cf returned 0 aft=
er 0 usecs
> [ =A0 =A00.039997] calling =A0init_trace_printk+0x0/0x12 @ 1
> [ =A0 =A00.039997] initcall init_trace_printk+0x0/0x12 returned 0 after 0=
 usecs
> [ =A0 =A00.039997] calling =A0mce_amd_init+0x0/0x17f @ 1
> [ =A0 =A00.039997] MCE: In-kernel MCE decoding enabled.
> [ =A0 =A00.039997] initcall mce_amd_init+0x0/0x17f returned 0 after 0 use=
cs
> [ =A0 =A00.039997] NMI watchdog disabled (cpu0): hardware events not enab=
led
> [ =A0 =A00.046023] installing Xen timer for CPU 1
> [ =A0 =A00.047017] cpu 1 spinlock event irq 279
> [ =A0 =A00.048183] NMI watchdog disabl[ =A0 =A00.055018] installing Xen t=
imer for CPU 2
> [ =A0 =A00.056013] cpu 2 spinlock event irq 285
> [ =A0 =A00.057156] NMI watchdog disabl
> [ =A0 =A00.069010] Brought up 4 CPUs
> [ =A0 =A00.071204] calling =A0ipc_ns_init+0x0/0x14 @ 1
> [ =A0 =A00.071993] initcall ipc_ns_init+0x0/0x14 returned 0 after 0 usecs
> [ =A0 =A00.071993] calling =A0init_mmap_min_addr+0x0/0x26 @ 1
> [ =A0 =A00.071993] initcall init_mmap_min_addr+0x0/0x26 returned 0 after =
0 usecs
> [ =A0 =A00.071993] calling =A0init_cpufreq_transition_notifier_list+0x0/0=
x1b @ 1
> [ =A0 =A00.071993] initcall init_cpufreq_transition_notifier_list+0x0/0x1=
b returned 0 after 0 usecs
> [ =A0 =A00.071993] calling =A0net_ns_init+0x0/0xf7 @ 1
> [ =A0 =A00.072266] initcall net_ns_init+0x0/0xf7 returned 0 after 976 use=
cs
> [ =A0 =A00.072993] calling =A0e820_mark_nvs_memory+0x0/0x41 @ 1
> [ =A0 =A00.072993] PM: Registering ACPI NVS region at cfef5000 (565248 by=
tes)
> [ =A0 =A00.073131] initcall e820_mark_nvs_memory+0x0/0x41 returned 0 afte=
r 976 usecs
> [ =A0 =A00.073993] calling =A0cpufreq_tsc+0x0/0x37 @ 1
> [ =A0 =A00.073993] initcall cpufreq_tsc+0x0/0x37 returned 0 after 0 usecs
> [ =A0 =A00.073993] calling =A0pci_reboot_init+0x0/0x14 @ 1
> [ =A0 =A00.073993] initcall pci_reboot_init+0x0/0x14 returned 0 after 0 u=
secs
> [ =A0 =A00.073993] calling =A0init_lapic_sysfs+0x0/0x20 @ 1
> [ =A0 =A00.073993] initcall init_lapic_sysfs+0x0/0x20 returned 0 after 0 =
usecs
> [ =A0 =A00.073993] calling =A0init_smp_flush+0x0/0x3d @ 1
> [ =A0 =A00.073993] initcall init_smp_flush+0x0/0x3d returned 0 after 0 us=
ecs
> [ =A0 =A00.073993] calling =A0alloc_frozen_cpus+0x0/0x30 @ 1
> [ =A0 =A00.073993] initcall alloc_frozen_cpus+0x0/0x30 returned 0 after 0=
 usecs
> [ =A0 =A00.073993] calling =A0sysctl_init+0x0/0x32 @ 1
> [ =A0 =A00.074047] initcall sysctl_init+0x0/0x32 returned 0 after 976 use=
cs
> [ =A0 =A00.074993] calling =A0ksysfs_init+0x0/0x94 @ 1
> [ =A0 =A00.074993] initcall ksysfs_init+0x0/0x94 returned 0 after 0 usecs
> [ =A0 =A00.074993] calling =A0init_jiffies_clocksource+0x0/0x12 @ 1
> [ =A0 =A00.074993] initcall init_jiffies_clocksource+0x0/0x12 returned 0 =
after 0 usecs
> [ =A0 =A00.074993] calling =A0pm_init+0x0/0x3e @ 1
> [ =A0 =A00.074993] initcall pm_init+0x0/0x3e returned 0 after 0 usecs
> [ =A0 =A00.074993] calling =A0pm_disk_init+0x0/0x19 @ 1
> [ =A0 =A00.074993] initcall pm_disk_init+0x0/0x19 returned 0 after 0 usec=
s
> [ =A0 =A00.074993] calling =A0swsusp_header_init+0x0/0x40 @ 1
> [ =A0 =A00.074993] initcall swsusp_header_init+0x0/0x40 returned 0 after =
0 usecs
> [ =A0 =A00.074993] calling =A0init_zero_pfn+0x0/0x1f @ 1
> [ =A0 =A00.074993] initcall init_zero_pfn+0x0/0x1f returned 0 after 0 use=
cs
> [ =A0 =A00.074993] calling =A0fsnotify_init+0x0/0x26 @ 1
> [ =A0 =A00.074993] initcall fsnotify_init+0x0/0x26 returned 0 after 0 use=
cs
> [ =A0 =A00.074993] calling =A0filelock_init+0x0/0x2a @ 1
> [ =A0 =A00.074993] initcall filelock_init+0x0/0x2a returned 0 after 0 use=
cs
> [ =A0 =A00.074993] calling =A0init_misc_binfmt+0x0/0x44 @ 1
> [ =A0 =A00.074993] initcall init_misc_binfmt+0x0/0x44 returned 0 after 0 =
usecs
> [ =A0 =A00.074993] calling =A0init_script_binfmt+0x0/0x14 @ 1
> [ =A0 =A00.074993] initcall init_script_binfmt+0x0/0x14 returned 0 after =
0 usecs
> [ =A0 =A00.074993] calling =A0init_elf_binfmt+0x0/0x14 @ 1
> [ =A0 =A00.074993] initcall init_elf_binfmt+0x0/0x14 returned 0 after 0 u=
secs
> [ =A0 =A00.074993] calling =A0init_compat_elf_binfmt+0x0/0x14 @ 1
> [ =A0 =A00.074993] initcall init_compat_elf_binfmt+0x0/0x14 returned 0 af=
ter 0 usecs
> [ =A0 =A00.074993] calling =A0debugfs_init+0x0/0x5c @ 1
> [ =A0 =A00.074993] initcall debugfs_init+0x0/0x5c returned 0 after 0 usec=
s
> [ =A0 =A00.074993] calling =A0random32_init+0x0/0xdb @ 1
> [ =A0 =A00.074993] initcall random32_init+0x0/0xdb returned 0 after 0 use=
cs
> [ =A0 =A00.074993] calling =A0virtio_init+0x0/0x30 @ 1
> [ =A0 =A00.075081] kworker/u:0 used greatest stack depth: 5288 bytes left
> [ =A0 =A00.075114] initcall virtio_init+0x0/0x30 returned 0 after 976 use=
cs
> [ =A0 =A00.075114] calling =A0__gnttab_init+0x0/0x22 @ 1
> [ =A0 =A00.075114] Grant table initialized
> [ =A0 =A00.075114] initcall __gnttab_init+0x0/0x22 returned 0 after 0 use=
cs
> [ =A0 =A00.075114] calling =A0early_resume_init+0x0/0x1d0 @ 1
> [ =A0 =A00.075114] RTC time: 11:26:08, date: 10/26/11
> [ =A0 =A00.075114] initcall early_resume_init+0x0/0x1d0 returned 0 after =
0 usecs
> [ =A0 =A00.075114] calling =A0cpufreq_core_init+0x0/0xb2 @ 1
> [ =A0 =A00.075114] initcall cpufreq_core_init+0x0/0xb2 returned 0 after 0=
 usecs
> [ =A0 =A00.075114] calling =A0cpuidle_init+0x0/0x40 @ 1
> [ =A0 =A00.075114] initcall cpuidle_init+0x0/0x40 returned -19 after 0 us=
ecs
> [ =A0 =A00.075119] calling =A0sock_init+0x0/0x83 @ 1
> [ =A0 =A00.075185] initcall sock_init+0x0/0x83 returned 0 after 0 usecs
> [ =A0 =A00.075189] calling =A0net_inuse_init+0x0/0x26 @ 1
> [ =A0 =A00.075197] initcall net_inuse_init+0x0/0x26 returned 0 after 0 us=
ecs
> [ =A0 =A00.075201] calling =A0netpoll_init+0x0/0x31 @ 1
> [ =A0 =A00.075205] initcall netpoll_init+0x0/0x31 returned 0 after 0 usec=
s
> [ =A0 =A00.075209] calling =A0netlink_proto_init+0x0/0x1c2 @ 1
> [ =A0 =A00.075217] NET: Registered protocol family 16
> [ =A0 =A00.075233] initcall netlink_proto_init+0x0/0x1c2 returned 0 after=
 0 usecs
> [ =A0 =A00.075237] calling =A0bdi_class_init+0x0/0x4d @ 1
> [ =A0 =A00.075366] initcall bdi_class_init+0x0/0x4d returned 0 after 0 us=
ecs
> [ =A0 =A00.075366] calling =A0kobject_uevent_init+0x0/0x21 @ 1
> [ =A0 =A00.075366] initcall kobject_uevent_init+0x0/0x21 returned 0 after=
 0 usecs
> [ =A0 =A00.075366] calling =A0pcibus_class_init+0x0/0x19 @ 1
> [ =A0 =A00.075366] initcall pcibus_class_init+0x0/0x19 returned 0 after 0=
 usecs
> [ =A0 =A00.075366] calling =A0pci_driver_init+0x0/0x12 @ 1
> [ =A0 =A00.218045] initcall pci_driver_init+0x0/0x12 returned 0 after 139=
631 usecs
> [ =A0 =A00.218975] calling =A0backlight_class_init+0x0/0x5d @ 1
> [ =A0 =A00.219048] initcall backlight_class_init+0x0/0x5d returned 0 afte=
r 976 usecs
> [ =A0 =A00.219975] calling =A0video_output_class_init+0x0/0x19 @ 1
> [ =A0 =A00.220164] initcall video_output_class_init+0x0/0x19 returned 0 a=
fter 976 usecs
> [ =A0 =A00.220975] calling =A0xenbus_init+0x0/0x2af @ 1
> [ =A0 =A00.221059] initcall xenbus_init+0x0/0x2af returned 0 after 976 us=
ecs
> [ =A0 =A00.221975] calling =A0tty_class_init+0x0/0x38 @ 1
> [ =A0 =A00.222162] initcall tty_class_init+0x0/0x38 returned 0 after 976 =
usecs
> [ =A0 =A00.222975] calling =A0vtconsole_class_init+0x0/0xc2 @ 1
> [ =A0 =A00.223077] initcall vtconsole_class_init+0x0/0xc2 returned 0 afte=
r 976 usecs
> [ =A0 =A00.223974] calling =A0wakeup_sources_debugfs_init+0x0/0x2b @ 1
> [ =A0 =A00.223974] initcall wakeup_sources_debugfs_init+0x0/0x2b returned=
 0 after 0 usecs
> [ =A0 =A00.223974] calling =A0register_node_type+0x0/0x12 @ 1
> [ =A0 =A00.224166] initcall register_node_type+0x0/0x12 returned 0 after =
976 usecs
> [ =A0 =A00.224974] calling =A0i2c_init+0x0/0x70 @ 1
> [ =A0 =A00.225080] initcall i2c_init+0x0/0x70 returned 0 after 976 usecs
> [ =A0 =A00.225974] calling =A0amd_postcore_init+0x0/0x157 @ 1
> [ =A0 =A00.226119] node 0 link 0: io port [1000, 4fff]
> [ =A0 =A00.226983] node 0 link 0: io port [5000, fffff]
> [ =A0 =A00.227991] TOM: 00000000d0000000 aka 3328M
> [ =A0 =A00.228981] node 0 link 0: mmio [d0000000, d05fffff]
> [ =A0 =A00.230146] node 0 link 0: mmio [fed00000, fed0ffff]
> [ =A0 =A00.230982] node 0 link 0: mmio [d8000000, dfffffff]
> [ =A0 =A00.231983] node 0 link 0: mmio [fec00000, fec0ffff]
> [ =A0 =A00.232980] node 0 link 0: mmio [e0000000, efffffff]
> [ =A0 =A00.233981] node 0 link 0: mmio [a0000, bffff]
> [ =A0 =A00.234981] node 0 link 0: mmio [f0000000, fe0bffff]
> [ =A0 =A00.235978] TOM2: 0000000130000000 aka 4864M
> [ =A0 =A00.236973] bus: [00, ff] on node 0 link 0
> [ =A0 =A00.236973] bus: 00 index 0 [io =A00x0000-0xffff]
> [ =A0 =A00.236973] bus: 00 index 1 [mem 0xd0000000-0xd7ffffff]
> [ =A0 =A00.236973] bus: 00 index 2 [mem 0xfec10000-0xffffffff]
> [ =A0 =A00.236973] bus: 00 index 3 [mem 0xd8000000-0xfebfffff]
> [ =A0 =A00.236973] bus: 00 index 4 [mem 0xfec00000-0xfec0ffff]
> [ =A0 =A00.236973] bus: 00 index 5 [mem 0x000a0000-0x000bffff]
> [ =A0 =A00.236973] bus: 00 index 6 [mem 0x130000000-0xfcffffffff]
> [ =A0 =A00.236990] Extended Config Space enabled on 1 nodes
> [ =A0 =A00.238119] initcall amd_postcore_init+0x0/0x157 returned 0 after =
12693 usecs
> [ =A0 =A00.238972] calling =A0arch_kdebugfs_init+0x0/0x258 @ 1
> [ =A0 =A00.238972] initcall arch_kdebugfs_init+0x0/0x258 returned 0 after=
 0 usecs
> [ =A0 =A00.238972] calling =A0configure_trampolines+0x0/0x26 @ 1
> [ =A0 =A00.238972] initcall configure_trampolines+0x0/0x26 returned 0 aft=
er 0 usecs
> [ =A0 =A00.238972] calling =A0mtrr_if_init+0x0/0x78 @ 1
> [ =A0 =A00.238972] initcall mtrr_if_init+0x0/0x78 returned -19 after 0 us=
ecs
> [ =A0 =A00.238972] calling =A0ffh_cstate_init+0x0/0x2a @ 1
> [ =A0 =A00.238972] initcall ffh_cstate_init+0x0/0x2a returned -1 after 0 =
usecs
> [ =A0 =A00.238972] initcall ffh_cstate_init+0x0/0x2a returned with error =
code -1
> [ =A0 =A00.238972] calling =A0activate_jump_labels+0x0/0x28 @ 1
> [ =A0 =A00.238972] initcall activate_jump_labels+0x0/0x28 returned 0 afte=
r 0 usecs
> [ =A0 =A00.238972] calling =A0dynamic_debug_init+0x0/0x118 @ 1
> [ =A0 =A00.239026] initcall dynamic_debug_init+0x0/0x118 returned 0 after=
 976 usecs
> [ =A0 =A00.239972] calling =A0acpi_pci_init+0x0/0x61 @ 1
> [ =A0 =A00.239972] ACPI: bus type pci registered
> [ =A0 =A00.239972] initcall acpi_pci_init+0x0/0x61 returned 0 after 0 use=
cs
> [ =A0 =A00.239972] calling =A0setup_vcpu_hotplug_event+0x0/0x22 @ 1
> [ =A0 =A00.239972] initcall setup_vcpu_hotplug_event+0x0/0x22 returned 0 =
after 0 usecs
> [ =A0 =A00.239972] calling =A0register_xen_pci_notifier+0x0/0x33 @ 1
> [ =A0 =A00.239972] initcall register_xen_pci_notifier+0x0/0x33 returned 0=
 after 0 usecs
> [ =A0 =A00.239972] calling =A0dmi_id_init+0x0/0x329 @ 1
> [ =A0 =A00.240164] initcall dmi_id_init+0x0/0x329 returned 0 after 976 us=
ecs
> [ =A0 =A00.240972] calling =A0pci_arch_init+0x0/0x69 @ 1
> [ =A0 =A00.240972] PCI: MMCONFIG for domain 0000 [bus 00-04] at [mem 0xe0=
000000-0xe04fffff] (base 0xe0000000)
> [ =A0 =A00.240972] PCI: MMCONFIG at [mem 0xe0000000-0xe04fffff] reserved =
in E820
> [ =A0 =A00.243098] PCI: Using configuration type 1 for base access
> [ =A0 =A00.243972] initcall pci_arch_init+0x0/0x69 returned 0 after 2929 =
usecs
> [ =A0 =A00.243972] calling =A0topology_init+0x0/0xa1 @ 1
> [ =A0 =A00.244207] initcall topology_init+0x0/0xa1 returned 0 after 976 u=
secs
> [ =A0 =A00.244971] calling =A0mtrr_init_finialize+0x0/0x36 @ 1
> [ =A0 =A00.244971] initcall mtrr_init_finialize+0x0/0x36 returned 0 after=
 0 usecs
> [ =A0 =A00.244971] calling =A0init_vdso+0x0/0x135 @ 1
> [ =A0 =A00.244971] initcall init_vdso+0x0/0x135 returned 0 after 0 usecs
> [ =A0 =A00.244971] calling =A0sysenter_setup+0x0/0x2dd @ 1
> [ =A0 =A00.244971] initcall sysenter_setup+0x0/0x2dd returned 0 after 0 u=
secs
> [ =A0 =A00.244971] calling =A0param_sysfs_init+0x0/0x1b5 @ 1
> [ =A0 =A00.260062] initcall param_sysfs_init+0x0/0x1b5 returned 0 after 1=
5622 usecs
> [ =A0 =A00.260969] calling =A0pm_sysrq_init+0x0/0x20srq_init+0x0/0x20 ret=
urned 0 after 0 usecs
> [ =A0 =A00.260969] calling =A0default_bdi_init+0x0/0xaa @ 1
> [ =A0 =A00.261086] initcall default_bdi_init+0x0/0xaa returned 0 after 97=
6 usecs
> [ =A0 =A00.261969] calling =A0init_bio+0x0/0xf2 @ 1
> [ =A0 =A00.261969] bio: create slab <bio-0> at 0
> [ =A0 =A00.261969] initcall init_bio+0x0/0xf2 returned 0 after 0 usecs
> [ =A0 =A00.261969] calling =A0fsnotify_notification_init+0x0/0x8b @ 1
> [ =A0 =A00.261969] initcall fsnotify_notification_init+0x0/0x8b returned =
0 after 0 usecs
> [ =A0 =A00.261969] calling =A0cryptomgr_init+0x0/0x12 @ 1
> [ =A0 =A00.261969] initcall cryptomgr_init+0x0/0x12 returned 0 after 0 us=
ecs
> [ =A0 =A00.261969] calling =A0blk_settings_init+0x0/0x2c @ 1
> [ =A0 =A00.261969] initcall blk_settings_init+0x0/0x2c returned 0 after 0=
 usecs
> [ =A0 =A00.261969] calling =A0blk_ioc_init+0x0/0x2a @ 1
> [ =A0 =A00.261969] initcall blk_ioc_init+0x0/0x2a returned 0 after 0 usec=
s
> [ =A0 =A00.261969] calling =A0blk_softirq_init+0x0/0x70 @ 1
> [ =A0 =A00.261969] initcall blk_softirq_init+0x0/0x70 returned 0 after 0 =
usecs
> [ =A0 =A00.261969] calling =A0blk_iopoll_setup+0x0/0x70 @ 1
> [ =A0 =A00.261969] initcall blk_iopoll_setup+0x0/0x70 returned 0 after 0 =
usecs
> [ =A0 =A00.261969] calling =A0genhd_device_init+0x0/0x85 @ 1
> [ =A0 =A00.262166] initcall genhd_device_init+0x0/0x85 returned 0 after 9=
76 usecs
> [ =A0 =A00.262969] calling =A0pci_slot_init+0x0/0x50 @ 1
> [ =A0 =A00.262969] initcall pci_slot_init+0x0/0x50 returned 0 after 0 use=
cs
> [ =A0 =A00.262969] calling =A0fbmem_init+0x0/0x98 @ 1
> [ =A0 =A00.263039] initcall fbmem_init+0x0/0x98 returned 0 after 976 usec=
s
> [ =A0 =A00.263969] calling =A0acpi_init+0x0/0xbc @ 1
> [ =A0 =A00.263969] ACPI: Added _OSI(Module Device)
> [ =A0 =A00.263969] ACPI: Added _OSI(Processor Device)
> [ =A0 =A00.263969] ACPI: Added _OSI(3.0 _SCP Extensions)
> [ =A0 =A00.263969] ACPI: Added _OSI(Processor Aggregator Device)
> [ =A0 =A00.265128] ACPI: EC: Look up EC in DSDT
> [ =A0 =A00.265968] \_SB_:_OSC evaluation returned wrong type
> [ =A0 =A00.265968] _OSC reqg
> [ =A0 =A00.295088] initcall acpi_init+0x0/0xbc returned 0 after 31245 use=
cs
> [ =A0 =A00.295964] calling =A0dock_init+0x0/0xa5 @ 1
> [ =A0 =A0296964] initcall dock_init+0x0/0xa5 returned 0 after 976 usecs
> [ =A0 =A00.296964] calling =A0acpi_pci_root_init+0x0/0x2d @ 1
> [ =A0 =A00.296964] PCI: Using host bridge windows from ACPI; if necessary=
, use "pci=3Dnocrs" and report a bug
> [ =A0 =A00.297124] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
> [ =A0 =A00.298252] pci_root PNP0A03:00: host bridge window [io =A00x0000-=
0x0cf7]
> [ =A0 =A00.298963] pci_root PNP0A03:00: host bridge window [io =A00x0d00-=
0xffff]
> [ =A0 =A00.298963] pci_root PNP0A03:00: host bridge window [mem 0x000a000=
0-0x000bffff]
> [ =A0 =A00.298963] pci_root PNP0A03:00: host bridge window [mem 0x000c000=
0-0x000dffff]
> [ =A0 =A00.298963] pci_root PNP0A03:00: host bridge window [mem 0xd000000=
0-0xfebfffff]
> [ =A0 =A00.298963] pci_root PNP0A03:00: host bridge window [mem 0xfed4000=
0-0xfed8ffff]
> [ =A0 =A00.298963] pci 0000:00:00.0: [10de:005e] type 0 class 0x000580
> [ =A0 =A00.298984] pci 0000:00:01.0: [10de:0051] type 0 class 0x000601
> [ =A0 =A00.299963] pci 0000:00:01.0: reg 10: [io =A00x8c00-0x8fff]
> [ =A0 =A00.300105] pci 0000:00:01.1: [10de:0052] type 0 class 0x000c05
> [ =A0 =A00.300963] pci 0000:00:01.1: reg 10: [io =A00x2080-0x209f]
> [ =A0 =A00.300963] pci 0000:00:01.1: reg 20: [io =A00x2040-0x207f]
> [ =A0 =A00.300963] pci 0000:00:01.1: reg 24: [io =A00x2000-0x203f]
> [ =A0 =A00.300963] pci 0000:00:01.1: PME# supported from D3hot D3cold
> [ =A0 =A00.300963] pci 0000:00:01.1: PME# disabled
> [ =A0 =A00.300963] pci 0000:00:02.0: [10de:005a] type 0 class 0x000c03
> [ =A0 =A00.300963] pci 0000:00:02.0: reg 10: [mem 0xd0000000-0xd0000fff]
> [ =A0 =A00.300963] pci 0000:00:02.0: supports D1 D2
> [ =A0 =A00.300963] pci 0000:00:02.0: PME# supported from D0 D1 D2 D3hot D=
3cold
> [ =A0 =A00.300963] pci 0000:00:02.0: PME# disabled
> [ =A0 =A00.300963] pci 0000:00:02.1: [10de:005b] type 0 class 0x000c03
> [ =A0 =A00.300963] pci 0000:00:02.1: reg 10: [mem 0xd0001000-0xd00010ff]
> [ =A0 =A00.300963] pci 0000:00:02.1: supports D1 D2
> [ =A0 =A00.300963] pci 0000:00:02.1: PME# supported from D0 D1 D2 D3hot D=
3cold
> [ =A0 =A00.300963] pci 0000:00:02.1: PME# disabled
> [ =A0 =A00.300963] pci 0000:00:07.0: [10de:0054] type 0 class 0x000101
> [ =A0 =A00.300963] pci 0000:00:07.0: reg 10: [io =A00x20f0-0x20f7]
> [ =A0 =A00.300963] pci 0000:00:07.0: reg 14: [io =A00x20e0-0x20e3]
> [ =A0 =A00.300963] pci 0000:00:07.0: reg 18: [io =A00x20d0-0x20d7]
> [ =A0 =A00.300963] pci 0000:00:07.0: reg 1c: [io =A00x20c0-0x20c3]
> [ =A0 =A00.300963] pci 0000:00:07.0: reg 20: [io =A00x20b0-0x20bf]
> [ =A0 =A00.300963] pci 0000:00:07.0: reg 24: [mem 0xd0002000-0xd0002fff]
> [ =A0 =A00.300963] pci 0000:00:08.0: [10de:0055] type 0 class 0x000101
> [ =A0 =A00.300963] pci 0000:00:08.0: reg 10: [io =A00x2440-0x2447]
> [ =A0 =A00.300963] pci 0000:00:08.0: reg 14: [io =A00x2430-0x2433]
> [ =A0 =A00.300963] pci 0000:00:08.0: reg 18: [io =A00x2420-0x2427]
> [ =A0 =A00.300963] pci 0000:00:08.0: reg 1c: [io =A00x2410-0x2413]
> [ =A0 =A00.300963] pci 0000:00:08.0: reg 20: [io =A00x2400-0x240f]
> [ =A0 =A00.300963] pci 0000:00:08.0: reg 24: [mem 0xd0003000-0xd0003fff]
> [ =A0 =A00.300963] pci 0000:00:09.0: [10de:005c] type 1 class 0x000604
> [ =A0 =A00.300963] pci 0000:00:0b.0: [10de:005d] type 1 class 0x000604
> [ =A0 =A00.300963] pci 0000:00:0b.0: PME# supported from D0 D1 D2 D3hot D=
3cold
> [ =A0 =A00.300963] pci 0000:00:0b.0: PME# disabled
> [ =A0 =A00.301003] pci 0000:00:0c.0: [10de:005d] type 1 class 0x000604
> [ =A0 =A00.301963] pci 0000:00:0c.0: PME# supported from D0 D1 D2 D3hot D=
3cold
> [ =A0 =A00.301963] pci 0000:00:0c.0: PME# disabled
> [ =A0 =A00.301963] pci 0000:00:0d.0: [10de:005d] type 1 class 0x000604
> [ =A0 =A00.301963] pci 0000:00:0d.0: PME# supported from D0 D1 D2 D3hot D=
3cold
> [ =A0 =A00.301963] pci 0000:00:0d.0: PME# disabled
> [ =A0 =A00.301963] pci 0000:00:0e.0: [10de:005d] type 1 class 0x000604
> [ =A0 =A00.301963] pci 0000:00:0e.0: PME# supported from D0 D1 D2 D3hot D=
3cold
> [ =A0 =A00.301963] pci 0000:00:0e.0: PME# disabled
> [ =A0 =A00.301963] pci 0000:00:18.0: [1022:1200] type 0 class 0x000600
> [ =A0 =A00.301963] pci 0000:00:18.1: [1022:1201] type 0 class 0x000600
> [ =A0 =A00.301963] pci 0000:00:18.2: [1022:1202] type 0 class 0x000600
> [ =A0 =A00.301963] pci 0000:00:18.3: [1022:1203] type 0 class 0x000600
> [ =A0 =A00.301963] pci 0000:00:18.4: [1022:1204] type 0 class 0x000600
> [ =A0 =A00.302123] pci 0000:01:07.0: [1077:6312] type 0 class 0x000c04
> [ =A0 =A00.302963] pci 0000:01:07.0: reg 10: [io =A00x3000-0x30ff]
> [ =A0 =A00.302963] pci 0000:01:07.0: reg 14: [mem 0xd0110000-0xd0110fff]
> [ =A0 =A00.302963] pci 0000:01:07.0: reg 30: [mem 0x00000000-0x0001ffff p=
ref]
> [ =A0 =A00.302963] pci 0000:01:08.0: [1002:515e] type 0 class 0x000300
> [ =A0 =A00.302963] pci 0000:01:08.0: reg 10: [mem 0xd8000000-0xdfffffff p=
ref]
> [ =A0 =A00.302963] pci 0000:01:08.0: reg 14: [io =A00x3400-0x34ff]
> [ =A0 =A00.302963] pci 0000:01:08.0: reg 18: [mem 0xd0100000-0xd010ffff]
> [ =A0 =A00.302963] pci 0000:01:08.0: reg 30: [mem 0x00000000-0x0001ffff p=
ref]
> [ =A0 =A00.302963] pci 0000:01:08.0: supports D1 D2
> [ =A0 =A00.302963] pci 0000:00:09.0: PCI bridge to [bus 01-01]
> [ =A0 =A00.302963] pci 0000:00:09.0: =A0 bridge window [io =A00x3000-0x3f=
ff]
> [ =A0 =A00.302963] pci 0000:00:09.0: =A0 bridge window [mem 0xd0100000-0x=
d01fffff]
> [ =A0 =A00.302963] pci 0000:00:09.0: =A0 bridge window [mem 0xd8000000-0x=
dfffffff pref]
> [ =A0 =A00.302963] pci 0000:02:00.0: [14e4:165a] type 0 class 0x000200
> [ =A0 =A00.302963] pci 0000:02:00.0: reg 10: [mem 0xd0200000-0xd020ffff 6=
4bit]
> [ =A0 =A00.302963] pci 0000:02:00.0: PME# supported from D3hot D3cold
> [ =A0 =A00.302963] pci 0000:02:00.0: PME# disabled
> [ =A0 =A00.304126] pci 0000:00:0b.0: PCI bridge to [bus 02-02]
> [ =A0 =A00.304962] pci 0000:00:0b.0: =A0 bridge window [mem 0xd0200000-0x=
d02fffff]
> [ =A0 =A00.304962] pci 0000:00:0c.0: PCI bridge to [bus 03-03]
> [ =A0 =A00.304962] pci 0000:00:0d.0: PCI bridge to [bus 04-04]
> [ =A0 =A00.304962] pci 0000:05:00.0: [8086:105e] type 0 class 0x000200
> [ =A0 =A00.304962] pci 0000:05:00.0: reg 10: [mem 0xd0320000-0xd033ffff]
> [ =A0 =A00.304962] pci 0000:05:00.0: reg 14: [mem 0xd0300000-0xd031ffff]
> [ =A0 =A00.304962] pci 0000:05:00.0: reg 18: [io =A00x4000-0x401f]
> [ =A0 =A00.304962] pci 0000:05:00.0: reg 30: [mem 0x00000000-0x0001ffff p=
ref]
> [ =A0 =A00.304962] pci 0000:05:00.0: PME# supported from D0 D3hot D3cold
> [ =A0 =A00.304962] pci 0000:05:00.0: PME# disabled
> [ =A0 =A00.304962] pci 0000:05:00.1: [8086:105e] type 0 class 0x000200
> [ =A0 =A00.304962] pci 0000:05:00.1: reg 10: [mem 0xd0360000-0xd037ffff]
> [ =A0 =A00.304962] pci 0000:05:00.1: reg 14: [mem 0xd0340000-0xd035ffff]
> [ =A0 =A00.304962] pci 0000:05:00.1: reg 18: [io =A00x4020-0x403f]
> [ =A0 =A00.304962] pci 0000:05:00.1: reg 30: [mem 0x00000000-0x0001ffff p=
ref]
> [ =A0 =A00.304962] pci 0000:05:00.1: PME# supported from D0 D3hot D3cold
> [ =A0 =A00.304962] pci 0000:05:00.1: PME# disabled
> [ =A0 =A00.304962] pci 0000:05:00.0: disabling ASPM on pre-1.1 PCIe devic=
e. =A0You can enable it with 'pcie_aspm=3Dforce'
> [ =A0 =A00.304962] pci 0000:00:0e.0: PCI bridge to [bus 05-05]
> [ =A0 =A00.304962] pci 0000:00:0e.0: =A0 bridge window [io =A00x4000-0x4f=
ff]
> [ =A0 =A00.304962] pci 0000:00:0e.0: =A0 bridge window [mem 0xd0300000-0x=
d03fffff]
> [ =A0 =A00.304962] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
> [ =A0 =A00.305050] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.P2P0._PR=
T]
> [ =A0 =A00.306101] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR0._PR=
T]
> [ =A0 =A00.306962] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR1._PR=
T]
> [ =A0 =A00.306962] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR2._PR=
T]
> [ =A0 =A00.306962] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.XVR3._PR=
T]
> [ =A0 =A00.306962] =A0pci0000:00: Requesting ACPI _OSC control (0x1d)
> [ =A0 =A00.306962] =A0pci0000:00: ACPI _OSC request failed (AE_NOT_FOUND)=
, returned control mask: 0x1d
> [ =A0 =A00.306962] ACPI _OSC control for PCIe not granted, disabling ASPM
> [ =A0 =A00.338181] initcall acpi_pci_root_init+0x0/0x2d returned 0 after =
41009 usecs
> [ =A0 =A00.338957] calling =A0acpi_pci_link_init+0x70] ACPI: PCI Interrup=
t Link [LNK1] (IRQs 16 17 18 19) *0
> [ =A0 =A00.340322] ACPI: PCI Interrupt Link [LNK2] (IRQs 16 17 18 19) *0
> [ =A0 =A00.341113] ACPI: PCI Interrupt Link [LNK3] (IRQs 16 17 18 19) *0
> [ =A0 =A00.342231] ACPI: PCI Interrupt Link [LNK4] (IRQs 16 17 18 19) *0
> [ =A0 =A00.343198] ACPI: PCI Interrupt Link [LNK5] (IRQs 16 17 18 19) *0,=
 disabled.
> [ =A0 =A00.344228] ACPI: PCI Interrupt Link [LSMB] (IRQs 20 21 22 23) *0
> [ =A0 =A00.345111] ACPI: PCI Interrupt Link [LUS0] (IRQs 20 21 22 23) *0
> [ =A0 =A00.346105] ACPI: PCI Interrupt Link [LUS2] (IRQs 20 21 22 23) *0,=
 disabled.
> [ =A0 =A00.346956] ACPI: PCI Interrupt Link [LMAC] (IRQs 20 21 22 23) *0,=
 disabled.
> [ =A0 =A00.347112] ACPI: PCI Interrupt Link [LACI] (IRQs 20 21 22 23) *0,=
 disabled.
> [ =A0 =A00.348234] ACPI: PCI Interrupt Link [LMCI] (IRQs 20 21 22 23) *0,=
 disabled.
> [ =A0 =A00.349119] ACPI: PCI Interrupt Link [LPID] (IRQs 20 21 22 23) *0,=
 disabled.
> [ =A0 =A00.350123] ACPI: PCI Interrupt Link [LTID] (IRQs 20 21 22 23) *0
> [ =A0 =A00.351123] ACPI: PCI Interrupt Link [LSI1] (IRQs 20 21 22 23) *0
> [ =A0 =A00.352197] ACPI: PCI Interrupt Link [APCP] (IRQs 20 21 22 23) *0,=
 disabled.
> [ =A0 =A00.353037] initcall acpi_pci_link_init+0x0/0x43 returned 0 after =
14646 usecs
> [ =A0 =A00.353955] calling =A0pnp_init+0x0/0x12 @ 1
> [ =A0 =A00.354019] initcall pnp_init+0x0/0x12 returned 0 after 976 usecs
> [ =A0 =A00.354955] calling =A0xen_setup_shutdown_event+0x0/0x30 @ 1
> [ =A0 =A00.354955] initcall xen_setup_shutdown_event+0x0/0x30 returned 0 =
after 0 usecs
> [ =A0 =A00.354955] calling =A0balloon_init+0x0/0x13a @ 1
> [ =A0 =A00.354955] xen/balloon: Initialising balloon driver.
> [ =A0 =A00.358744] initcall balloon_init+0x0/0x13a returned 0 after 3905 =
usecs
> [ =A0 =A00.358954] calling =A0xenbus_probe_backend_init+0nbus_probe_backe=
nd_init+0x0/0x57 returned 0 after 976 usecs
> [ =A0 =A00.359954] calling =A0xenbus_probe_frontend_init+0x0/0x57 @ 1
> [ =A0 =A00.360149] initcall xenbus_probe_frontend_init+0x0/0x57 returned =
0 after 976 usecs
> [ =A0 =A00.360954] calling =A0balloon_init+0x0/0x10e @ 1
> [ =A0 =A00.360954] xen-balloon: Initialising balloon driver.
> [ =A0 =A00.361049] initcall balloon_init+0x0/0x10e returned 0 after 976 u=
secs
> [ =A0 =A00.361954] calling =A0xen_selfballoon_init+0x0/0x82 @ 1
> [ =A0 =A00.361954] xen/balloon: Xen selfballooning driver disabled for do=
main0.
> [ =A0 =A00.361954] initcall xen_selfballoon_init+0x0/0x82 returned -19 af=
ter 0 usecs
> [ =A0 =A00.361954] calling =A0misc_init+0x0/0xba @ 1
> [ =A0 =A00.362148] initcall misc_init+0x0/0xba returned 0 after 976 usecs
> [ =A0 =A00.362954] calling =A0vga_arb_device_init+0x0/0xde @ 1
> [ =A0 =A00.363027] vgaarb: device added: PCI:0000:01:08.0,decodes=3Dio+me=
m,owns=3Dio+mem,locks=3Dnone
> [ =A0 =A00.363953] vgaarb: loaded
> [ =A0 =A00.363953] vgaarb: bridge control possible 0000:01:08.0
> [ =A0 =A00.363953] initcall vga_arb_device_init+0x0/0xde returned 0 after=
 976 usecs
> [ =A0 =A00.363953] calling =A0cn_init+0x0/0x9e @ 1
> [ =A0 =A00.364099] initcall cn_init+0x0/0x9e returned 0 after 976 usecs
> [ =A0 =A00.364953] calling =A0phy_init+0x0/0x2e @ 1
> [ =A0 =A00.365055] initcall phy_init+0x0/0x2e returned 0 after 976 usecs
> [ =A0 =A00.365953] calling =A0init_pcmcia_cs+0x0/0x36 @ 1
> [ =A0 =A00.366017] initcall init_pcmcia_cs+0x0/0x36 returned 0 after 976 =
usecs
> [ =A0 =A00.366953] calling =A0usb_init+0x0/0x173 @ 1
> [ =A0 =A00.367069] usbcore: registered new interface driver usbfs
> [ =A0 =A00.368023] usbcore: registered new interface driver hub
> [ =A0 =A00.369057] usbcore: registered new device driver usb
> [ =A0 =A00.369953] initcall usb_init+0x0/0x173 returned 0 after 2929 usec=
s
> [ =A0 =A00.369953] calling =A0serio_init+0x0/0x31 @ 1
> [ =A0 =A00.370018] initcall serio_init+0x0/0x31 returned 0 after 976 usec=
s
> [ =A0 =A00.370952] calling =A0input_init+0x0/0x10c @ 1
> [ =A0 =A00.371147] initcall input_init+0x0/0x10c returned 0 after 976 use=
cs
> [ =A0 =A00.371952] calling =A0rtc_init+0x0/0x71 @ 1
> [ =A0 =A00.372020] initcall rtc_init+0x0/0x71 returned 0 after 976 usecs
> [ =A0 =A00.372952] calling =A0power_supply_class_init+0x0/0x44 @ 1
> [ =A0 =A00.373016] initcall power_supply_class_init+0x0/0x44 returned 0 a=
fter 976 usecs
> [ =A0 =A00.373952] calling =A0hwmon_init+0x0/0xee @ 1
> [ =A0 =A00.374016] initcall hwmon_init+0x0/0xee returned 0 after 976 usec=
s
> [ =A0 =A00.374952] calling =A0leds_init+0x0/0x48 @ 1
> [ =A0 =A00.375025] initcall leds_init+0x0/0x48 returned 0 after 976 usecs
> [ =A0 =A00.375952] calling =A0pci_subsys_init+0x0/0x4f @ 1
> [ =A0 =A00.375952] PCI: Using ACPI for IRQ routing
> [ =A0 =A00.375952] PCI: pci_cache_line_size set to 64 bytes
> [ =A0 =A00.376071] reserve RAM buffer: 000000000009d000 - 000000000009fff=
f
> [ =A0 =A00.376951] reserve RAM buffer: 000000007fff0000 - 000000007ffffff=
f
> [ =A0 =A00.376951] reserve RAM buffer: 00000000cfef0000 - 00000000cffffff=
f
> [ =A0 =A00.376951] initcall pci_subsys_init+0x0/0x4f returned 0 after 976=
 usecs
> [ =A0 =A00.376951] calling =A0proto_init+0x0/0x12 @ 1
> [ =A0 =A00.376951] initcall proto_init+0x0/0x12 returned 0 after 0 usecs
> [ =A0 =A00.376951] calling =A0net_dev_init+0x0/0x1b3 @ 1
> [ =A0 =A00.377146] initcall net_dev_init+0x0/0x1b3 returned 0 after 976 u=
secs
> [ =A0 =A00.377951] calling =A0neigh_init+0x0/0x80 @ 1
> [ =A0 =A00.377951] initcall neigh_init+0x0/0x80 returned 0 after 0 usecs
> [ =A0 =A00.377951] calling =A0fib_rules_init+0x0/0xaf @ 1
> [ =A0 =A00.377951] initcall fib_rules_init+0x0/0xaf returned 0 after 0 us=
ecs
> [ =A0 =A00.377951] calling =A0pktsched_init+0x0/0xfe @ 1
> [ =A0 =A00.377951] initcall pktsched_init+0x0/0xfe returned 0 after 0 use=
cs
> [ =A0 =A00.377951] calling =A0tc_filter_init+0x0/0x55 @ 1
> [ =A0 =A00.377951] initcall tc_filter_init+0x0/0x55 returned 0 after 0 us=
ecs
> [ =A0 =A00.377951] calling =A0tc_action_init+0x0/0x55 @ 1
> [ =A0 =A00.377951] initcall tc_action_init+0x0/0x55 returned 0 after 0 us=
ecs
> [ =A0 =A00.377951] calling =A0genl_init+0x0/0x84 @ 1
> [ =A0 =A00.377966] initcall genl_init+0x0/0x84 returned 0 after 976 usecs
> [ =A0 =A00.378951] calling =A0cipso_v4_init+0x0/0x61 @ 1
> [ =A0 =A00.378951] initcall cipso_v4_init+0x0/0x61 returned 0 after 0 use=
cs
> [ =A0 =A00.378951] calling =A0netlbl_init+0x0/0x81 @ 1
> [ =A0 =A00.378951] NetLabel: Initializing
> [ =A0 =A00.378951] NetLabel: =A0domain hash size =3D 128
> [ =A0 =A00.378951] NetLabel: =A0protocols =3D UNLABELED CIPSOv4
> [ =A0 =A00.378951] NetLabel: =A0unlabeled traffic allowed by default
> [ =A0 =A00.378951] initcall netlbl_init+0x0/0x81 returned 0 after 0 usecs
> [ =A0 =A00.378951] calling =A0rfkill_init+0x0/0x79 @ 1
> [ =A0 =A00.379145] initcall rfkill_init+0x0/0x79 returned 0 after 976 use=
cs
> [ =A0 =A00.379951] calling =A0sysctl_init+0x0/0x48 @ 1
> [ =A0 =A00.379951] initcall sysctl_init+0x0/0x48 returned 0 after 0 usecs
> [ =A0 =A00.379951] calling =A0xen_p2m_debugfs+0x0/0x4a @ 1
> [ =A0 =A00.379969] initcall xen_p2m_debugfs+0x0/0x4a returned 0 after 976=
 usecs
> [ =A0 =A00.380951] calling =A0xen_spinlock_debugfs+0x0/0x24e @ 1
> [ =A0 =A00.381017] initcall xen_spinlock_debugfs+0x0/0x24e returned 0 aft=
er 976 usecs
> [ =A0 =A00.381951] calling =A0hpet_late_init+0x0/0x103 @ 1
> [ =A0 =A00.381951] initcall hpet_late_init+0x0/0x103 returned -19 after 0=
 usecs
> [ =A0 =A00.381951] calling =A0init_amd_nbs+0x0/0xb8 @ 1
> [ =A0 =A00.382006] initcall init_amd_nbs+0x0/0xb8 returned 0 after 976 us=
ecs
> [ =A0 =A00.382951] calling =A0clocksource_done_booting+0x0/0x5a @ 1
> [ =A0 =A00.382951] Switching to clocksource xen
> [ =A0 =A00.382974] initcall clocksource_done_booting+0x0/0x5a returned 0 =
after 987 usecs
> [ =A0 =A00.383950] calling =A0ftrace_init_debugfs+0x0/0xcf @ 1
> [ =A0 =A00.395940] initcall ftrace_init_debugfs+0x0/0xcf returned 0 after=
 377 usecs
> [ =A0 =A00.396609] calling =A0rb_init_debugfs+0x0/0x2f @ 1
> [ =A0 =A00.396609] initcall rb_init_debugfs+0x0/0x2f returned 0 after 5 u=
secs
> [ =A0 =A00.396609] calling =A0tracer_init_debugfs+0x0/0x3c2 @ 1
> [ =A0 =A00.420026] initcall tracer_init_debugfs+0x0/0x3c2 returned 0 afte=
r 535 usecs
> [ =A0 =A00.420552] calling =A0init_trace_printk_function_export+0x0/0x2f =
@ 1
> [ =A0 =A00.420552] initcall init_trace_printk_function_export+0x0/0x2f re=
turned 0 after 5 usecs
> [ =A0 =A00.420552] calling =A0event_trace_init+0x0/0x2bd @ 1
> [ =A0 =A00.456145] initcall event_trace_init+0x0/0x2bd returned 0 after 9=
409 usecs
> [ =A0 =A00.457058] calling =A0init_kprobe_trace+0x0/0 1
> [ =A0 =A00.479551] initcall init_pipe_fs+0x0/0x4c returned 0 after 201 us=
ecs
> [ =A0 =A00.480367] calling =A0eventpoll_init+0x0/0xda @ 1
> [ =A0 =A00.490781] initcall eventpoll_init+0x0/0xda returned 0 after 142 =
usecs
> [ =A0 =A00.491644] calling =A0anon_inode_init+0x0/0x116 @ 1
> [ =A0 =A00.491644] initcall anon_inode_init+0x0/0x116 returned 0 after 14=
 usecs
> [ =A0 =A00.491644] calling =A0blk_scsi_ioctl_init+0x0/0x289 @ 1
> [ =A0 =A00.491644] initcall blk_scsi_ioctl_init+0x0/0x289 returned 0 afte=
r 0 usecs
> [ =A0 =A00.491644] calling =A0acpi_event_init+0x0/0x81 @ 1
> [ =A0 =A00.525947] initcall acpi_event_init+0x0/0x81 returned 0 after 27 =
usecs
> [ =A0 =A00.526927] calling =A0pnp_system_init+0x0/0x12 @ 1
> [ =A0 =A00.537517] initcall pnp_system_init+0x0/0x12 returned 0 after 174=
 usecs
> [ =A0 =A00.538491] calling =A0pnpacpi_init+0x0/0x8c @ 1
> [ =A0 =A00.538491] pnp: PnP ACPI init
> [ =A0 =A00.538491] ACPI: bus type pnp registered
> [ =A0 =A00.557402] pnp 00:00: [mem 0xffc00000-0xffffffff]
> [ =A0 =A00.558273] pnp 00:00: [mem 0xfec00000-0xfec00fff]
> [ =A0 =A00.558273] pnp 00:00: [mem 0xfee00000-0xfeefffff]
> [ =A0 =A00.558273] pnp 00:00: [mem 0xfed00000-0xfed00fff]
> [ =A0 =A00.577096] system 00:00: [mem 0xffc00000-0xffffffff] could not be=
 reserved
> [ =A0 =A00.578047] system 00:00: [mem 0xfec00000-0xfec00fff] could not be=
 reserved
> [ =A0 =A00.578047] system 00:00: [mem 0xfee00000-0xfeefffff] could not be=
 reserved
> [ =A0 =A00.578047] system 00:00: [mem 0xfed00000-0xfed00fff] has been res=
erved
> [ =A0 =A00.578047] system 00:00: Plug and Play ACPI device, IDs PNP0c01 (=
active)
> [ =A0 =A00.611747] pnp 00:01: [bus 00-ff]
> [ =A0 =A00.612649] pnp 00:01: [io =A00x0cf8-0x0cff]
> [ =A0 =A00.612649] pnp 00:01: [io =A00x0000-0x0cf7 window]
> [ =A0 =A00.612649] pnp 00:01: [io =A00x0d00-0xffff window]
> [ =A0 =A00.612649] pnp 00:01: [mem 0x000a0000-0x000bffff window]
> [ =A0 =A00.612649] pnp 00:01: [mem 0x000c0000-0x000dffff window]
> [ =A0 =A00.612649] pnp 00:01: [mem 0xd0000000-0xfebfffff window]
> [ =A0 =A00.612649] pnp 00:01: [mem 0xfed40000-0xfed8ffff]
> [ =A0 =A00.650423] pnp 00:01: Plug and Play ACPI device, IDs PNP0a03 (act=
ive)
> [ =A0 =A00.651400] pnp 00:02: [mem 0xe0000000-0xefffffff]
> [ =A0 =A00.662021] system 00:02: [mem 0xe0000000-0xefffffff] has been res=
erved
> [ =A0 =A00.662994] system 00:02: Plug and Play ACPI device, IDs PNP0c02 (=
active)
> [ =A0 =A00.676409] pnp 00:03: [io =A00x8000-0x807f]
> [ =A0 =A00.677057] pnp 00:03: [io =A00x8080-0x80ff]
> [ =A0 =A00.677057] pnp 00:03: [io =A00x8400-0x847f]
> [ =A0 =A00.677057] pnp 00:03: [io =A00x8480-0x84ff]
> [ =A0 =A00.677057] pnp 00:03: [io =A00x8800-0x887f]
> [ =A0 =A00.677057] pnp 00:03: [io =A00x8880-0x88ff]
> [ =A0 =A00.701260] pnp 00:03: [io =A00x2040-0x207f]
> [ =A0 =A00.702243] pnp 00:03: [io =A00x2000-0x203f]
> [ =A0 =A00.702243] pnp 00:03: [io =A00x0060]
> [ =A0 =A00.702243] pnp 00:03: [io =A00x0064]
> [ =A0 =A00.717025] system 00:03: [io =A00x8000-0x807f] has been reserved
> [ =A0 =A00.717998] system 00:03: [io =A00x8080-0x80ff] has been reserved
> [ =A0 =A00.717998] system 00:03: [io =A00x8400-0x847f] has been reserved
> [ =A0 =A00.717998] system 00:03: [io =A00x8480-0x84ff] has been reserved
> [ =A0 =A00.717998] system 00:03: [io =A00x8800-0x887f] has been reserved
> [ =A0 =A00.717998] system 00:03: [io =A00x8880-0x88ff] has been reserved
> [ =A0 =A00.717998] system 00:03: [io =A00x2040-0x207f] has been reserved
> [ =A0 =A00.717998] system 00:03: [io =A00x2000-0x203f] has been reserved
> [ =A0 =A00.717998] system 00:03: Plug and Play ACPI device, IDs PNP0c02 (=
active)
> [ =A0 =A00.771758] pnp 00:04: [irq 0 disabled]
> [ =A0 =A00.772631] xen: registering gsi 8 triggering 1 polarity 0
> [ =A0 =A00.781377] xen_map_pirq_gsi: returning irq 8 for gsi 8
> [ =A0 =A00.782114] xen: --> pirq=3D8 -> irq=3D8 (gsi=3D8)
> [ =A0 =A00.790911] pnp 00:04: [irq 8]
> [ =A0 =A00.791898] pnp 00:04: [mem 0xfed00000-0xfed003ff]
> [ =A0 =A00.799174] pnp 00:04: Plug and Play ACPI device, IDs PNP0103 (act=
ive)
> [ =A0 =A00.800152] pnp 00:05: [io =A00x0010-0x001f]
> [ =A0 =A00.800152] pnp 00:05: [io =A00x0022-0x003f]
> [ =A0 =A00.800152] pnp 00:05: [io =A00x0044-0x005f]
> [ =A0 =A00.800152] pnp 00:05: [io =A00x0062-0x0063]
> [ =A0 =A00.800152] pnp 00:05: [io =A00x0065-0x006f]
> [ =A0 =A00.800152] pnp 00:05: [io =A00x0072-0x0073]
> [ =A0 =A00.800152] pnp 00:05: [io =A00x0074-0x007f]
> [ =A0 =A00.800152] pnp 00:05: [io =A00x0091-0x0093]
> [ =A0 =A00.800152] pnp 00:05: [io =A00x0097-0x009f]
> [ =A0 =A00.800152] pnp 00:05: [io =A00x00a2-0x00bf]
> [ =A0 =A00.800152] pnp 00:05: [io =A00x00e0-0x00ef]
> [ =A0 =A00.800152] pnp 00:05: [io =A00x04d0-0x04d1]
> [ =A0 =A00.855784] system 00:05: [io =A00x04d0-0x04d1] has been reserved
> [ =A0 =A00.856756] system 00:05: Plug and Play ACPI device, IDs PNP0c02 (=
active)
> [ =A0 =A00.856756] pnp 00:06: [io =A00x0000-0x0008]
> [ =A0 =A00.856756] pnp 00:06: [io =A00x000a-0x000f]
> [ =A0 =A00.856756] pnp 00:06: [io =A00x0081-0x0083]
> [ =A0 =A00.856756] pnp 00:06: [io =A00x0087]
> [ =A0 =A00.856756] pnp 00:06: [io =A00x0089-0x008b]
> [ =A0 =A00.856756] pnp 00:06: [io =A00x008f]
> [ =A0 =A00.856756] pnp 00:06: [io =A00x00c0-0x00d1]
> [ =A0 =A00.856756] pnp 00:06: [io =A00x00d4-0x00df]
> [ =A0 =A00.856756] pnp 00:06: [dma 4]
> [ =A0 =A00.903820] pnp 00:06: Plug and Play ACPI device, IDs PNP0200 (act=
ive)
> [ =A0 =A00.904798] pnp 00:07: [io =A00x0061]
> [ =A0 =A00.914054] pnp 00:07: Plug and Play ACPI device, IDs PNP0800 (act=
ive)
> [ =A0 =A00.915029] pnp 00:08: [io =A00x0070-0x0071]
> [ =A0 =A00.924901] pnp 00:08: Plug and Play ACPI device, IDs PNP0b00 (act=
ive)
> [ =A0 =A00.925879] pnp 00:09: [io =A00x00f0-0x00f1]
> [ =A0 =A00.925879] xen: registering gsi 13 triggering 1 polarity 0
> [ =A0 =A00.941182] xen_map_pirq_gsi: returning irq 13 for gsi 13
> [ =A0 =A00.942170] xen: --> pirq=3D13 -> irq=3D13 (gsi=3D13)
> [ =A0 =A00.951350] pnp 00:09: [irq 13]
> [ =A0 =A00.954661] pnp 00:09: Plug and Play ACPI device, IDs PNP0c04 (act=
ive)
> [ =A0 =A00.955638] pnp 00:0a: [io =A00x0c00-0x0c7f]
> [ =A0 =A00.965693] system 00:0a: [io =A00x0c00-0x0c7f] has been reserved
> [ =A0 =A00.966666] system 00:0a: Plug and Play ACPI device, IDs PNP0c02 (=
active)
> [ =A0 =A00.978985] pnp 00:0b: [io =A00x03f8-0x03ff]
> [ =A0 =A00.979478] xen: registering gsi 4 triggering 1 polarity 0
> [ =A0 =A00.988733] xen_map_pirq_gsi: returning irq 4 for gsi 4
> [ =A0 =A00.989593] xen: --> pirq=3D4 -> irq=3D4 (gsi=3D4)
> [ =A0 =A00.998261] Already setup the GSI :4
> [ =A0 =A00.999250] pnp 00:0b: [irq 4]
> [ =A0 =A01.005553] pnp 00:0b: Plug and Play ACPI device, IDs PNP0501 (act=
ive)
> [ =A0 =A01.013548] pnp: PnP ACPI: found 12 devices
> [ =A0 =A01.014055] ACPI: ACPI bus type pnp unregistered
> [ =A0 =A01.014055] initcall pnpacpi_init+0x0/0x8c returned 0 after 462591=
 usecs
> [ =A0 =A01.014055] calling =A0pcistub_init+0x0/0x1d7 @ 1
> [ =A0 =A01.035975] initcall pcistub_init+0x0/0x1d7 returned 0 after 2209 =
usecs
> [ =A0 =A01.036941] calling =A0chr_dev_init+0x0/0xc6 @ 1
> [ =A0 =A01.056849] initcall chr_dev_init+0x0/0xc6 returned 0 after 9552 u=
secs
> [ =A0 =A01.057782] calling =A0firmware_class_init+0x0/0x19_bus+0x0/0x65 @=
 1
> [ =A0 =A01.080576] initcall init_pcmcia_bus+0x0/0x65 returned 0 after 230=
 usecs
> [ =A0 =A01.081355] calling =A0thermal_init+0x0/0x75 @ 1
> [ =A0 =A01.091977] initcall thermal_init+0x0/0x75 returned 0 after 221 us=
ecs
> [ =A0 =A01.092763] calling =A0cpufreq_gov_performance_init+0x0/0x12 @ 1
> [ =A0 =A01.092763] initcall cpufreq_gov_performance_init+0x0/0x12 returne=
d 0 after 0 usecs
> [ =A0 =A01.092763] calling =A0cpufreq_gov_dbs_init+0x0/0x12 @ 1
> [ =A0 =A01.092763] initcall cpufreq_gov_dbs_init+0x0/0x12 returned 0 afte=
r 0 usecs
> [ =A0 =A01.092763] calling =A0init_acpi_pm_clocksource+0x0/0xec @ 1
> [ =A0 =A01.133218] PM-Timer failed consistency check =A0(0x0xffffff) - ab=
orting.
> [ =A0 =A01.134062] initcall init_acpi_pm_clocksource+0x63] pci 0000:00:0e=
.0: BAR 15: assigned [mem 0xd0400000-0xd04fffff pref]
> [ =A0 =A01.154163] pci 0000:01:07.0: BAR 6: assigned [mem 0xd0120000-0xd0=
13ffff pref]
> [ =A0 =A01.154163] pci 0000:01:08.0: BAR 6: assigned [mem 0xd0140000-0xd0=
15ffff pref]
> [ =A0 =A01.154163] pci 0000:00:09.0: PCI bridge to [bus 01-01]
> [ =A0 =A01.154163] pci 0000:00:09.0: =A0 bridge window [io =A00x3000-0x3f=
ff]
> [ =A0 =A01.154163] pci 0000:00:09.0: =A0 bridge window [mem 0xd0100000-0x=
d01fffff]
> [ =A0 =A01.154163] pci 0000:00:09.0: =A0 bridge window [mem 0xd8000000-0x=
dfffffff pref]
> [ =A0 =A01.154163] pci 0000:00:0b.0: PCI bridge to [bus 02-02]
> [ =A0 =A01.154163] pci 0000:00:0b.0: =A0 bridge window [mem 0xd0200000-0x=
d02fffff]
> [ =A0 =A01.154163] pci 0000:00:0c.0: PCI bridge to [bus 03-03]
> [ =A0 =A01.154163] pci 0000:00:0d.0: PCI bridge to [bus 04-04]
> [ =A0 =A01.154163] pci 0000:05:00.0: BAR 6: assigned [mem 0xd0400000-0xd0=
41ffff pref]
> [ =A0 =A01.154163] pci 0000:05:00.1: BAR 6: assigned [mem 0xd0420000-0xd0=
43ffff pref]
> [ =A0 =A01.154163] pci 0000:00:0e.0: PCI bridge to [bus 05-05]
> [ =A0 =A01.154163] pci 0000:00:0e.0: =A0 bridge window [io =A00x4000-0x4f=
ff]
> [ =A0 =A01.154163] pci 0000:00:0e.0: =A0 bridge window [mem 0xd0300000-0x=
d03fffff]
> [ =A0 =A01.154163] pci 0000:00:0e.0: =A0 bridge window [mem 0xd0400000-0x=
d04fffff pref]
> [ =A0 =A01.154163] pci 0000:00:09.0: setting latency timer to 64
> [ =A0 =A01.154163] pci 0000:00:0b.0: setting latency timer to 64
> [ =A0 =A01.154163] pci 0000:00:0c.0: setting latency timer to 64
> [ =A0 =A01.154163] pci 0000:00:0d.0: setting latency timer to 64
> [ =A0 =A01.154163] pci 0000:00:0e.0: setting latency timer to 64
> [ =A0 =A01.154163] pci_bus 0000:00: resource 4 [io =A00x0000-0x0cf7]
> [ =A0 =A01.154163] pci_bus 0000:00: resource 5 [io =A00x0d00-0xffff]
> [ =A0 =A01.154163] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff=
]
> [ =A0 =A01.154163] pci_bus 0000:00: resource 7 [mem 0x000c0000-0x000dffff=
]
> [ =A0 =A01.154163] pci_bus 0000:00: resource 8 [mem 0xd0000000-0xfebfffff=
]
> [ =A0 =A01.154163] pci_bus 0000:00: resource 9 [mem 0xfed40000-0xfed8ffff=
]
> [ =A0 =A01.154163] pci_bus 0000:01: resource 0 [io =A00x3000-0x3fff]
> [ =A0 =A01.154163] pci_bus 0000:01: resource 1 [mem 0xd0100000-0xd01fffff=
]
> [ =A0 =A01.154163] pci_bus 0000:01: resource 2 [mem 0xd8000000-0xdfffffff=
 pref]
> [ =A0 =A01.154163] pci_bus 0000:02: resource 1 [mem 0xd0200000-0xd02fffff=
]
> [ =A0 =A01.154163] pci_bus 0000:05: resource 0 [io =A00x4000-0x4fff]
> [ =A0 =A01.154163] pci_bus 0000:05: resource 1 [mem 0xd0300000-0xd03fffff=
]
> [ =A0 =A01.154163] pci_bus 0000:05: resource 2 [mem 0xd0400000-0xd04fffff=
 pref]
> [ =A0 =A01.154163] initcall pcibios_assign_resources+0x0/0x76 returned 0 =
after 217184 usecs
> [ =A0 =A01.154163] calling =A0sysctl_core_init+0x0/0x38 @ 1
> [ =A0 =A01.388361] initcall sysctl_core_init+0x0/0x38 returned 0 after 18=
3 usecs
> [ =A0 =A01.389212] calling =A0inet_init+0x0/0x27d @ 1
> [ =A0 =A01.389212] NET: Registered protocol family 2
> [ =A0 =A01.404778] IP route cache hash table entries: 131072 (order: 8, 1=
048576 bytes)
> [ =A0 =A01.418009] TCP established hash table entries: 524288 (order: 11,=
 8388608 bytes)
> [ =A0 =A01.429619] TCP bind hash table entrie: Hash tables configured (es=
tablished 524288 bind 65536)
> [ =A0 =A01.437392] TCP reno registered
> [ =A0 =A01.446719] UDP hash table entries: 2048 (order: 4, 65536 bytes)
> [ =A0 =A01.452796] UDP-Lite hash table entries: 2048 (order: 4, 65536 byt=
es)
> [ =A0 =A01.459438] initcall inet_init+0x0/0x27d returned 0 after 58592 us=
ecs
> [ =A0 =A01.460337] calling =A0af_unix_init+0x0/0x55 @ 1
> [ =A0 =A01.460337] NET: Registered protocol family 1
> [ =A0 =A01.460337] initcall af_unix_init+0x0/0x55 returned 0 after 4323 u=
secs
> [ =A0 =A01.460337] calling =A0init_sunrpc+0x0/0x73 @ 1
> [ =A0 =A01.486196] RPC: Registered named UNIX socket transport module.
> [ =A0 =A01.487062] RPC: Registered udp transport module.
> [ =A0 =A01.487062] RPC: Registered tcp transport module.
> [ =A0 =A01.487062] RPC: Registered tcp NFSv4.1 backchannel transport modu=
le.
> [ =A0 =A01.487062] initcall init_sunrpc+0x0/0x73 returned 0 after 22944 u=
secs
> [ =A0 =A01.487062] calling =A0pci_apply_final_quirks+0x0/0x10c @ 1
> [ =A0 =A01.572298] pci 0000:00:00.0: Found enabled HT MSI Mapping
> [ =A0 =A01.573058] pci 0000:00:00.0: Found enabled HT MSI Mapping
> HT MSI Mapping
> [ =A0 =A01.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
> [ =A0 =A01.584419] pci 0000:00:0c.0: Found disabled HT MSI Mapping
> [ =A0 =A01.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
> [ =A0 =A01.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
> [ =A0 =A01.584419] pci 0000:00:0d.0: Found disabled HT MSI Mapping
> [ =A0 =A01.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
> [ =A0 =A01.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
> [ =A0 =A01.584419] pci 0000:00:0e.0: Found disabled HT MSI Mapping
> [ =A0 =A01.584419] pci 0000:00:00.0: Found enabled HT MSI Mapping
> [ =A0 =A01.584419] pci 0000:01:08.0: Boot video device
> [ =A0 =A01.584419] PCI: CLS 64 bytes, default 64
> [ =A0 =A01.584419] initcall pci_apply_final_quirks+0x0/0x10c returned 0 a=
fter 134779 usecs
> [ =A0 =A01.584419] calling =A0populate_rootfs+0x0/0xd3 @ 1
> [ =A0 =A01.672231] Trying to unpack rootfs image as initramfs...
> [ =A0 =A02.368114] Freeing initrd memory: 238536k freed
> [ =A0 =A02.480588] initcall populate_rootfs+0x0/0xd3 returned 0 after 789=
869 usecs
> [ =A0 =A02.481116] calling =A0pci_iommu_init+0x0/0x57[ =A0 =A02.498905] D=
MA-API: preallocated 32768 debug entries
> [ =A0 =A02.499057] DMA-API: debugging enabled by kernel config
> [ =A0 =A02.499057] initcall pci_iommu_init+0x0/0x57 returned 0 after 1662=
4 usecs
> [ =A0 =A02.499057] calling =A0calgary_fixup_tce_spaces+0x0/0x105 @ 1
> [ =A0 =A02.499057] initcall calgary_fixup_tce_spaces+0x0/0x105 returned -=
19 after 0 usecs
> [ =A0 =A02.499057] calling =A0irqfd_module_init+0x0/0x31 @ 1
> [ =A0 =A02.534754] initcall irqfd_module_init+0x0/0x31 returned 0 after 5=
24 usecs
> [ =A0 =A02.535735] calling =A0i8259A_init_ops+0x0/0x21 @ 1
> [ =A0 =A02.535735] initcall i8259A_init_ops+0x0/0x21 returned 0 after 1 u=
secs
> [ =A0 =A02.535735] calling =A0vsyscall_init+0x0/0x27 @ 1
> [ =A0 =A02.557547] initcall vsyscall_init+0x0/0x27 returned 0 after 32 us=
ecs
> [ =A0 =A02.558521] calling =A0sbf_init+0x0/0xf6 @ 1
> [ =A0 =A02.558521] Simple Boot Flag at 0x62 set to 0x1
> [ =A0 =A02.558521] initcall sbf_init+0x0/0xf6 returned 0 after 4483 usecs
> [ =A0 =A02.558521] calling =A0init_tsc_clocksource+0x0/0x5f @ 1
> [ =A0 =A02.558521] initcall init_tsc_clocksource+0x0/0x5f returned 0 afte=
r 5 usecs
> [ =A0 =A02.558521] calling =A0add_rtc_cmos+0x0/0x96 @ 1
> [ =A0 =A02.558521] initcall add_rtc_cmos+0x0/0x96 returned 0 after 3 usec=
s
> [ =A0 =A02.558521] calling =A0i8237A_init_ops+0x0/0x14 @ 1
> [ =A0 =A02.558521] initcall i8237A_init_ops+0x0/0x14 returned 0 after 0 u=
secs
> [ =A0 =A02.558521] calling =A0cache_sysfs_init+0x0/0x6e @ 1
> [ =A0 =A02.621792] initcall cache_sysfs_init+0x0/0x6e returned 0 after 35=
25 usecs
> [ =A0 =A02.622779] calling =A0mcheck_init_device+0x0/0rned -5 after 0 use=
cs
> [ =A0 =A02.634743] initcall mcheck_init_device+0x0/0x11f returned with er=
ror code -5
> [ =A0 =A02.634743] calling =A0threshold_init_device+0x0/0x91 @ 1
> [ =A0 =A02.634743] initcall threshold_init_device+0x0/0x91 returned 0 aft=
er 0 usecs
> [ =A0 =A02.634743] calling =A0inject_init+0x0/0x60 @ 1
> [ =A0 =A02.634743] Machine check injector initialized
> [ =A0 =A02.634743] initcall inject_init+0x0/0x60 returned 0 after 4395 us=
ecs
> [ =A0 =A02.634743] calling =A0thermal_throttle_init_device+0x0/0xa3 @ 1
> [ =A0 =A02.634743] initcall thermal_throttle_init_device+0x0/0xa3 returne=
d 0 after 0 usecs
> [ =A0 =A02.634743] calling =A0amd_ibs_init+0x0/0x4bc @ 1
> [ =A0 =A02.634743] initcall amd_ibs_init+0x0/0x4bc returned -19 after 0 u=
secs
> [ =A0 =A02.634743] calling =A0msr_init+0x0/0x150 @ 1
> [ =A0 =A02.705693] initcall msr_init+0x0/0x150 returned 0 after 886 usecs
> [ =A0 =A02.706682] calling =A0cpuid_init+0x0/0x150 @ 1
> [ =A0 =A02.716874] initcall cpuid_init+0x0/0x150 returned 0 after 609 use=
cs
> [ =A0 =A02.717862] calling =A0ioapic_init_ops+0x0/0x14 @ 1
> [ =A0 =A02.717862] initcall ioapic_init_ops+0x0/0x14 returned 0 after 0 u=
secs
> [ =A0 =A02.717862] calling =A0add_pcspkr+0x0/0x60 @ 1
> [ =A0 =A02.738993] initcall add_pcspkr+0x0/0x60 returned 0 after 136 usec=
s
> [ =A0 =A02.739980] calling =A0microcode_init+0x0/0x16b @ 1
> [ =A0 =A02.750141] microcode: CPU0: patch_level=3D0x01000065
> [ =A0 =A02.755002] microcode: CPU1: patch_level=3D0x01000065
> [ =A0 =A02.759938] microcode: CPU2: patch_level=3D0x01000065
> [ =A0 =A02.764875] microcode: CPU3: patch_level=3D0x01000065
> [ =A0 =A02.769926] microcode: Microcode Update Driver: v2.00 <tigran@aiva=
zian.fsnet.co.uk>, Peter Oruba
> [ =A0 =A02.770915] initcall microcode_init+0x0/0x16b returned 0 after 280=
32 usecs
> [ =A0 =A02.770915] calling =A0start_periodic_check_for_corruption+0x0/0x5=
0 @ 1
> [ =A0 =A02.770915] initcall start_periodic_check_for_corruption+0x0/0x50 =
returned 0 after 0 usecs
> [ =A0 =A02.770915] calling =A0audit_classes_init+0x0/0xaf @ 1
> [ =A0 =A02.770915] initcall audit_classes_init+0x0/0xaf returned 0 after =
3 usecs
> [ =A0 =A02.770915] calling =A0pt_dump_init+0x0/0x30 @ 1
> [ =A0 =A02.770915] initcall pt_dump_init+0x0/0x30 returned 0 after 12 use=
cs
> [ =A0 =A02.770915] calling =A0ia32_binfmt_init+0x0/0x14 @ 1
> [ =A0 =A02.770915] initcall ia32_binfmt_init+0x0/0x14 returned 0 after 17=
 usecs
> [ =A0 =A02.770915] calling =A0proc_schedstat_init+0x0/0x22 @ 1
> [ =A0 =A02.770915] initcall proc_schedstat_init+0x0/0x22 returned 0 after=
 6 usecs
> [ =A0 =A02.770915] calling =A0proc_execdomains_init+0x0/0x22 @ 1
> [ =A0 =A02.770915] initcall proc_execdomains_init+0x0/0x22 returned 0 aft=
er 6 usecs
> [ =A0 =A02.770915] calling =A0ioresources_init+0x0/0x3c @ 1
> [ =A0 =A02.864024] initcall ioresources_init+0x0/0x3c returned 0 after 25=
 usecs
> [ =A0 =A02.865004] calling =A0uid_cache_init+0x0/0x8c @ 1
> [ =A0 =A02.875574] initcall uid_cache_init+0x0/0x8c returned 0 after 148 =
usecs
> [ =A0 =A02.876430] calling =A0init_posix_timers+0x0/0x1f4 @ 1
> [ =A0 =A02.876430] initcall init_posix_timers+0x0/0x1f4 returned 0 after =
1 usecs
> [ =A0 =A02.876430] calling =A0init_posix_cpu_timers+0x0/0xbf @ 1
> [ =A0 =A02.876430] initcall init_posix_cpu_timers+0x0/0xbf returned 0 aft=
er 0 usecs
> [ =A0 =A02.876430] calling =A0create_proc_profile+0x0/0x290 @ 1
> [ =A0 =A02.876430] initcall create_proc_profile+0x0/0x290 returned 0 afte=
r 0 usecs
> [ =A0 =A02.876430] calling =A0timekeeping_init_ops+0x0/0x14 @ 1
> [ =A0 =A02.876430] initcall timekeeping_init_ops+0x0/0x14 returned 0 afte=
r 0 usecs
> [ =A0 =A02.876430] calling =A0init_clocksource_sysfs+0x0/0x50 @ 1
> [ =A0 =A02.936487] initcall init_clocksource_sysfs+0x0/0x50 returned 0 af=
ter 321 usecs
> [ =A0 =A02.937473] calling =A0init_timer_list_procfs+0x0/0x2c @ 1
> [ =A0 =A02.937473] initcall init_timer_list_procfs+0x0/0x2c returned 0 af=
ter 3 usecs
> [ =A0 =A02.937473] calling =A0alarmtimer_init+0x0/0x172 @ 1
> [ =A0 =A02.961417] initcall alarmtimer_init+0x0/0x172 returned 0 after 25=
5 usecs
> [ =A0 =A02.962399] calling =A0init_tstats_procfs+0x0/0x2c @ 1
> [ =A0 =A02.962399] initcall init_tstats_procfs+0x0/0x2c returned 0 after =
3 usecs
> [ =A0 =A02.962399] calling =A0futex_init+0x0/0x62 @ 1
> [ =A0 =A02.984366] initcall futex_init+0x0/0x62 returned 0 after 17 usecs
> [ =A0 =A02.985351] calling =A0proc_dma_init+0x0/0x22 @ 1
> [ =A0 =A02.985351] initcall proc_dma_init+0x0/0x22 returned 0 after 3 use=
cs
> [ =A0 =A02.985351] calling =A0proc_modules_init+0x0/0x22 @ 1
> [ =A0 =A02.985351] initcall proc_modules_init+0x0/0x22 returned 0 after 3=
 usecs
> [ =A0 =A02.985351] calling =A0kallsyms_init+0x0/0x25 @ 1
> [ =A0 =A02.985351] initcall kallsyms_init+0x0/0x25 returned 0 after 2 use=
cs
> [ =A0 =A02.985351] calling =A0snapshot_device_init+0x0/0x12 @ 1
> [ =A0 =A03.029665] initcall snapshot_device_init+0x0/0x12 returned 0 afte=
r 220 usecs
> [ =A0 =A03.030463] calling =A0crash_save_vmcoreinfo_init+0x0/0x46d @ 1
> [ =A0 =A03.030463] initcall crash_save_vmcoreinfo_init+0x0/0x46d returned=
 0 after 20 usecs
> [ =A0 =A03.030463] calling =A0crash_notes_memory_init+0x0/0x36 @ 1
> [ =A0 =A03.030463] initcall crash_notes_memory_init+0x0/0x36 returned 0 a=
fter 5 usecs
> [ =A0 =A03.030463] calling =A0user_namespaces_init+0x0/0x2d @ 1
> [ =A0 =A03.030463] initcall user_namespaces_init+0x0/0x2d returned 0 afte=
r 7 usecs
> [ =A0 =A03.030463] calling =A0pid_namespaces_init+0x0/0x2d @ 1
> [ =A0 =A03.030463] initcall pid_namespaces_init+0x0/0x2d returned 0 after=
 4 usecs
> [ =A0 =A03.030463] calling =A0audit_init+0x0/0x133 @ 1
> [ =A0 =A03.030463] audit: initializing netlink socket (disabled)
> [ =A0 =A03.097108] type=3D2000 audit(1319628370.680:1): initialized
> [ =A0 =A03.098090] initcall audit_init+0x0/0x133 returned 0 after 10737 u=
secs
> [ =A0 =A03.098090] calling =A0audit_watch_init+0x0/0x3a @ 1
> [ =A0 =A03.098090] initcall audit_watch_init+0x0/0x3a returned 0 after 0 =
usecs
> [ =A0 =A03.098090] calling =A0audit_tree_init+0x0/0x49 @ 1
> [ =A0 =A03.098090] initcall audit_tree_init+0x0/0x49 returned 0 after 0 u=
secs
> [ =A0 =A03.098090] calling =A0init_kprobes+0x0/0x17c @ 1
> [ =A0 =A03.152006] initcall init_kprobes+0x0/0x17c returned 0 after 15015=
 usecs
> [ =A0 =A03.152060] calling =A0irq_pm_init_ops+0x0/0x14 @ 1
> [ =A0 =A03.152060] initcall irq_pm_init_ops+0x0/0x14 returned 0 after 0 u=
secs
> [ =A0 =A03.152060] calling =A0utsname_sysctl_init+0x0/0x14 @ 1
> [ =A0 =A03.152060] initcall utsname_sysctl_init+0x0/0x14 returned 0 after=
 61 usecs
> [ =A0 =A03.152060] calling =A0init_tracepoints+0x0/0x20 @ 1
> [ =A0 =A03.152060] initcall init_tracepoints+0x0/0x20 returned 0 after 0 =
usecs
> [ =A0 =A03.152060] calling =A0ftrace_mod_cmd_init+0x0/0x12 @ 1
> [ =A0 =A03.152060] initcall ftrace_mod_cmd_init+0x0/0x12 returned 0 after=
 0 usecs
> [ =A0 =A03.152060] calling =A0init_events+0x0/0x61 @ 1
> [ =A0 =A03.152060] initcall init_events+0x0/0x61 returned 0 after 3 usecs
> [ =A0 =A03.152060] calling =A0init_function_trace+0x0/0x3e @ 1
> [ =A0 =A03.152060] initcall init_function_trace+0x0/0x3e returned 0 after=
 1 usecs
> [ =A0 =A03.152060] calling =A0init_graph_trace+0x0/0x66 @ 1
> [ =A0 =A03.152060] initcall init_graph_trace+0x0/0x66 returned 0 after 1 =
usecs
> [ =A0 =A03.152060] calling =A0init_blk_tracer+0x0/0x5a @ 1
> [ =A0 =A03.152060] initcall init_blk_tracer+0x0/0x5a returned 0 after 0 u=
secs
> [ =A0 =A03.152060] calling =A0perf_event_sysfs_init+0x0/0x93 @ 1
> [ =A0 =A03.257059] initcall perf_event_sysfs_init+0x0/0x93 returned 0 aft=
er 579 usecs
> [ =A0 =A03.258038] calling =A0init_per_zone_wmark_min+0x0/0x8b @ 1
> [ =A0 =A03.258038] initcall init_per_zone_wmark_min+0x0/0x8b returned 0 a=
fter 10095 usecs
> [ =A0 =A03.258038] calling =A0kswapd_init+0x0/
> [ =A0 =A03.293133] calling =A0extfrag_debug_init+0x0/0x72 @ 1
> [ =A0 =A03.293133] initcall extfrag_debug_init+0x0/0x72 returned 0 after =
27 usecs
> [ =A0 =A03.293133] calling =A0setup_vmstat+0x0/0xca @ 1
> [ =A0 =A03.293133] initcall setup_vmstat+0x0/0xca returned 0 after 43 use=
cs
> [ =A0 =A03.293133] calling =A0mm_sysfs_init+0x0/0x29 @ 1
> [ =A0 =A03.293133] initcall mm_sysfs_init+0x0/0x29 returned 0 after 8 use=
cs
> [ =A0 =A03.293133] calling =A0proc_vmalloc_init+0x0/0x25 @ 1
> [ =A0 =A03.293133] initcall proc_vmalloc_init+0x0/0x25 returned 0 after 3=
 usecs
> [ =A0 =A03.293133] calling =A0procswaps_init+0x0/0x22 @ 1
> [ =A0 =A03.348690] initcall procswaps_init+0x0/0x22 returned 0 after 23 u=
secs
> [ =A0 =A03.349671] calling =A0hugetlb_init+0x0/0x451 @ 1
> [ =A0 =A03.349671] HugeTLB registered 2 MB page size, pre-allocated 0 pag=
es
> [ =A0 =A03.366397] initcall hugetlb_init+0x0/0x451 returned 0 after 6412 =
usecs
> [ =A0 =A03.367255] calling =A0slab_proc_init+0x0/0x25 @ 1
> [ =A0 =A03.367255] initcall slab_proc_init+0x0/0x25 returned 0 after 3 us=
ecs
> [ =A0 =A03.367255] calling =A0slab_sysfs_init+0x0/0x100 @ 1
> [ =A0 =A03.401087] initcall slab_sysfs_init+0x0/0x100 returned 0 after 10=
697 usecs
> [ =A0 =A03.402058] calling =A0init_cleancache+0x0/0x1nit+0x0/0x22 returne=
d 0 after 8 usecs
> [ =A0 =A03.402058] calling =A0fsnotify_mark_init+0x0/0x40 @ 1
> [ =A0 =A03.447465] initcall fsnotify_mark_init+0x0/0x40 returned 0 after =
234 usecs
> [ =A0 =A03.448451] calling =A0dnotify_init+0x0/0x7b @ 1
> [ =A0 =A03.459083] initcall dnotify_init+0x0/0x7b returned 0 after 190 us=
ecs
> [ =A0 =A03.460049] calling =A0inotify_user_setup+0x0/0x70 @ 1
> [ =A0 =A03.460049] initcall inotify_user_setup+0x0/0x70 returned 0 after =
6 usecs
> [ =A0 =A03.460049] calling =A0aio_setup+0x0/0x9d @ 1
> [ =A0 =A03.460049] initcall aio_setup+0x0/0x9d returned 0 after 9 usecs
> [ =A0 =A03.460049] calling =A0proc_locks_init+0x0/0x22 @ 1
> [ =A0 =A03.460049] initcall proc_locks_init+0x0/0x22 returned 0 after 3 u=
secs
> [ =A0 =A03.460049] calling =A0init_sys32_ioctl+0x0/0x28 @ 1
> [ =A0 =A03.503949] initcall init_sys32_ioctl+0x0/0x28 returned 0 after 12=
1 usecs
> [ =A0 =A03.504938] calling =A0dquot_init+0x0/0x121 @ 1
> [ =A0 =A03.504938] VFS: Disk quotas dquot_6.5.2
> [ =A0 =A03.519507] Dquot-cache hash table entries: 512 (order 0, 4096 byt=
es)
> [ =A0 =A03.520473] initcall dquot_init+0x0/0x121 returned 0 after 10549 u=
secs
> [ =A0 =A03.520473] calling =A0init_v2_quota_format+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall init_v2_quota_format+0x0/0x22 returned 0 afte=
r 1 usecs
> [ =A0 =A03.520473] calling =A0quota_init+0x0/0x26 @ 1
> [ =A0 =A03.520473] initcall quota_init+0x0/0x26 returned 0 after 5 usecs
> [ =A0 =A03.520473] calling =A0proc_cmdline_init+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall proc_cmdline_init+0x0/0x22 returned 0 after 8=
 usecs
> [ =A0 =A03.520473] calling =A0proc_consoles_init+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall proc_consoles_init+0x0/0x22 returned 0 after =
3 usecs
> [ =A0 =A03.520473] calling =A0proc_cpuinfo_init+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall proc_cpuinfo_init+0x0/0x22 returned 0 after 2=
 usecs
> [ =A0 =A03.520473] calling =A0proc_devices_init+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall proc_devices_init+0x0/0x22 returned 0 after 3=
 usecs
> [ =A0 =A03.520473] calling =A0proc_interrupts_init+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall proc_interrupts_init+0x0/0x22 returned 0 afte=
r 3 usecs
> [ =A0 =A03.520473] calling =A0proc_loadavg_init+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall proc_loadavg_init+0x0/0x22 returned 0 after 2=
 usecs
> [ =A0 =A03.520473] calling =A0proc_meminfo_init+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall proc_meminfo_init+0x0/0x22 returned 0 after 2=
 usecs
> [ =A0 =A03.520473] calling =A0proc_stat_init+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall proc_stat_init+0x0/0x22 returned 0 after 3 us=
ecs
> [ =A0 =A03.520473] calling =A0proc_uptime_init+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall proc_uptime_init+0x0/0x22 returned 0 after 3 =
usecs
> [ =A0 =A03.520473] calling =A0proc_version_init+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall proc_version_init+0x0/0x22 returned 0 after 3=
 usecs
> [ =A0 =A03.520473] calling =A0proc_softirqs_init+0x0/0x22 @ 1
> [ =A0 =A03.520473] initcall proc_softirqs_init+0x0/0x22 returned 0 after =
3 usecs
> [ =A0 =A03.520473] calling =A0proc_kcore_init+0x0/0xa9 @ 1
> [ =A0 =A03.520473] initcall proc_kcore_init+0x0/0xa9 returned 0 after 8 u=
secs
> [ =A0 =A03.520473] calling =A0vmcore_init+0x0/0x39b @ 1
> [ =A0 =A03.520473] initcall vmcore_init+0x0/0x39b returned 0 after 0 usec=
s
> [ =A0 =A03.520473] calling =A0proc_kmsg_init+0x0/0x25 @ 1
> [ =A0 =A03.520473] initcall proc_kmsg_init+0x0/0x25 returned 0 after 3 us=
ecs
> [ =A0 =A03.520473] calling =A0proc_page_init+0x0/0x42 @ 1
> [ =A0 =A03.721888] initcall proc_page_init+0x0/0x42 returned 0 after 43 u=
secs
> [ =A0 =A03.722849] calling =A0init_devpts_fs+0x0/0x4c @ 1
> [ =A0 =A03.722849] initcall init_devpts_fs+0x0/0x4c returned 0 after 20 u=
secs
> [ =A0 =A03.722849] calling =A0init_ramfs_fs+0x0/0x12 @ 1
> [ =A0 =A03.722849] initcall init_ramfs_fs+0x0/0x12 returned 0 after 0 use=
cs
> [ =A0 =A03.722849] calling =A0init_hugetlbfs_fs+0x0/0x98 @ 1
> [ =A0 =A03.756080] initcall init_hugetlbfs_fs+0x0/0x98 returned 0 after 4=
70 usecs
> [ =A0 =A03.757019] calling =A0init_fat_fs+0x0/0x4f @ 1
> [ =A0 =A03.767631] initcall init_fat_fs+0x0/0x4f returned 0 after 289 use=
cs
> [ =A0 =A03.768620] calling =A0init_vfat_fs+0x0/0x12 @ 1
> [ =A0 =A03.768620] initcall init_vfat_fs+0x0/0x12 returned 0 after 1 usec=
s
> [ =A0 =A03.768620] calling =A0init_msdos_fs+0x0/0x12 @ 1
> [ =A0 =A03.768620] initcall init_msdos_fs+0x0/0x12 returned 0 after 0 use=
cs
> [ =A0 =A03.768620] calling =A0init_iso9660_fs+0x0/0x77 @ 1
> [ =A0 =A03.800749] initcall init_iso9660_fs+0x0/0x77 returned 0 after 227=
 usecs
> [ =A0 =A03.801688] calling =A0init_nfs_fs+0x0/0x150 @ 1
> [ =A0 =A03.812546] initcall init_nfs_fs+0x0/0x150 returned 0 after 620 us=
ecs
> [ =A0 =A03.813472] calling =A0init_nlm+0x0/0x22 @ 1
> [ =A0 =A03.813472] initcall init_nlm+0x0/0x22 returned 0 after 79 usecs
> [ =A0 =A03.813472] calling =A0init_nls_cp437+0x0/0x12 @ 1
> [ =A0 =A03.813472] initcall init_nls_cp437+0x0/0x12 returned 0 after 1 us=
ecs
> [ =A0 =A03.813472] calling =A0init_nls_ascii+0x0/0x12 @ 1
> [ =A0 =A03.813472] initcall init_nls_ascii+0x0/0x12 returned 0 after 0 us=
ecs
> [ =A0 =A03.813472] calling =A0init_nls_iso8859_1+0x0/0x12 @ 1
> [ =A0 =A03.813472] initcall init_nls_iso8859_1+0x0/0x12 returned 0 after =
0 usecs
> [ =A0 =A03.813472] calling =A0init_nls_utf8+0x0/0x2b @ 1
> [ =A0 =A03.813472] initcall init_nls_utf8+0x0/0x2b returned 0 after 1 use=
cs
> [ =A0 =A03.813472] calling =A0init_ntfs_fs+0x0/0x1d1 @ 1
> [ =A0 =A03.813472] NTFS driver 2.1.30 [Flags: R/W].
> [ =A0 =A03.883777] initcall init_ntfs_fs+0x0/0x1d1 returned 0 after 4739 =
usecs
> [ =A0 =A03.884764] calling =A0init_autofs4_fs+0x0/0x26 @ 1
> [ =A0 =A03.895263] initcall init_autofs4_fs+0x0/0x26 returned 0 after 145=
 usecs
> [ =A0 =A03.896249] calling =A0ipc_init+0x0/0x23 @ 1
> [ =A0 =A03.896249] msgmni has been set to 6332
> [ =A0 =A03.896249] initcall ipc_init+0x0/0x23 returned 0 after 3808 usecs
> [ =A0 =A03.896249] calling =A0ipc_sysctl_init+0x0/0x14 @ 1
> [ =A0 =A03.921105] initcall ipc_sysctl_init+0x0/0x14 returned 0 after 130=
 usecs
> [ =A0 =A03.922071] calling =A0init_mqueue_fs+0x0/0xb4 @ 1
> [ =A0 =A03.932833] initcall init_mqueue_fs+0x0/0xb4 returned 0 after 383 =
usecs
> [ =A0 =A03.933746] calling =A0key_proc_init+0x0/0x5e @ 1
> [ =A0 =A03.933746] initcall key_proc_init+0x0/0x5e returned 0 after 6 use=
cs
> [ =A0 =A03.933746] calling =A0selinux_nf_ip_init+0x0/0x69 @ 1
> [ =A0 =A03.933746] initcall selinux_nf_ip_init+0x0/0x69 returned 0 after =
0 usecs
> [ =A0 =A03.933746] calling =A0init_sel_fs+0x0/0x9e @ 1
> [ =A0 =A03.933746] initcall init_sel_fs+0x0/0x9e returned 0 after 0 usecs
> [ =A0 =A03.933746] calling =A0selnl_init+0x0/0x4d @ 1
> [ =A0 =A03.977248] initcall selnl_init+0x0/0x4d returned 0 after 19 usecs
> [ =A0 =A03.978236] calling =A0sel_netif_init+0x0/0x66 @ 1
> [ =A0 =A03.978236] initcall sel_netif_init+0x0/0x66 returned 0 after 0 us=
ecs
> [ =A0 =A03.978236] calling =A0sel_netnode_init+0x0/0x75 @ 1
> [ =A0 =A03.978236] initcall sel_netnode_init+0x0/0x75 returned 0 after 0 =
usecs
> [ =A0 =A03.978236] calling =A0sel_netport_init+0x0/0x75 @ 1
> [ =A0 =A03.978236] initcall sel_netport_init+0x0/0x75 returned 0 after 0 =
usecs
> [ =A0 =A03.978236] calling =A0aurule_init+0x0/0x37 @ 1
> [ =A0 =A03.978236] initcall aurule_init+0x0/0x37 returned 0 after 0 usecs
> [ =A0 =A03.978236] calling =A0crypto_wq_init+0x0/0x31 @ 1
> [ =A0 =A04.033335] initcall crypto_wq_init+0x0/0x31 returned 0 after 361 =
usecs
> [ =A0 =A04.034308] calling =A0crypto_algapi_init+0x0/0xd @ 1
> [ =A0 =A04.034308] initcall crypto_algapi_init+0x0/0xd returned 0 after 3=
 usecs
> [ =A0 =A04.034308] calling =A0skcipher_module_init+0x0/0x36 @ 1
> [ =A0 =A04.034308] initcall skcipher_module_init+0x0/0x36 returned 0 afte=
r 0 usecs
> [ =A0 =A04.034308] calling =A0chainiv_module_init+0x0/0x12 @ 1
> [ =A0 =A04.034308] initcall chainiv_module_init+0x0/0x12 returned 0 after=
 1 usecs
> [ =A0 =A04.034308] calling =A0eseqiv_module_init+0x0/0x12 @ 1
> [ =A0 =A04.034308] initcall eseqiv_module_init+0x0/0x12 returned 0 after =
0 usecs
> [ =A0 =A04.034308] calling =A0hmac_module_init+0x0/0x12 @ 1
> [ =A0 =A04.034308] initcall hmac_module_init+0x0/0x12 returned 0 after 0 =
usecs
> [ =A0 =A04.034308] calling =A0md5_mod_init+0x0/0x12 @ 1
> [ =A0 =A04.103980] initcall md5_mod_init+0x0/0x12 returned 0 after 277 us=
ecs
> [ =A0 =A04.104968] calling =A0sha1_generic_mod_init+0x0/0x12 @ 1
> [ =A0 =A04.115769] initcall sha1_generic_mod_init+0x0/0x12 returned 0 aft=
er 104 usecs
> [ =A0 =A04.116751] calling =A0crypto_cbc_module_init+0x0/0x12 @ 1
> [ =A0 =A04.116751] initcall crypto_cbc_module_init+0x0/0x12 returned 0 af=
ter 0 usecs
> [ =A0 =A04.116751] calling =A0des_generic_mod_init+0x0/0x3f @ 1
> [ =A0 =A04.140886] initcall des_generic_mod_init+0x0/0x3f returned 0 afte=
r 189 usecs
> [ =A0 =A04.141874] calling =A0zlib_mod_init+0x0/0x12 @ 1
> [ =A0 =A04.152688] initcall zlib_mod_init+0x0/0x12 returned 0 after 103 u=
secs
> [ =A0 =A04.153669] calling =A0crypto_authenc_module_init+0x0/0x12 @ 1
> [ =A0 =A04.153669] initcall crypto_authenc_module_init+0x0/0x12 returned =
0 after 0 usecs
> [ =A0 =A04.153669] calling =A0crypto_authenc_esn_module_init+0x0/0x12 @ 1
> [ =A0 =A04.153669] initcall crypto_authenc_esn_module_init+0x0/0x12 retur=
ned 0 after 0 usecs
> [ =A0 =A04.153669] calling =A0krng_mod_init+0x0/0x12 @ 1
> [ =A0 =A04.191133] initcall krng_mod_init+0x0/0x12 returned 0 after 188 u=
secs
> [ =A0 =A04.192121] calling =A0proc_genhd_init+0x0/0x3c @ 1
> [ =A0 =A04.202412] initcall proc_genhd_init+0x0/0x3c returned 0 after 27 =
usecs
> [ =A0 =A04.203388] calling =A0bsg_init+0x0/0x12e @ 1
> [ =A0 =A04.213764] Block layer SCSI generic (bsg) driver version 0.4 load=
ed (major 253)
> [ =A0 =A04.214752] initcall bsg_init+0x0/0x12e returned 0 after 7668 usec=
s
> [ =A0 =A04.214752] calling =A0noop_init+0x0/0x14 @ 1
> [ =A0 =A04.214752] io scheduler noop registered
> [ =A0 =A04.214752] initcall noop_init+0x0/0x14 returned 0 after 3886 usec=
s
> [ =A0 =A04.214752] calling =A0deadline_init+0x0/0x14 @ 1
> [ =A0 =A04.214752] io scheduler deadline registered
> [ =A0 =A04.214752] initcall deadline_init+0x0/0x14 returned 0 after 4224 =
usecs
> [ =A0 =A04.214752] calling =A0cfq_init+0x0/0x9e @ 1
> [ =A0 =A04.261873] io scheduler cfq registered (default)
> [ =A0 =A04.262857] initcall cfq_init+0x0/0x9e returned 0 after 4724 usecs
> [ =A0 =A04.262857] calling =A0percpu_counter_startup+0x0/0x33 @ 1
> [ =A0 =A04.262857] initcall percpu_counter_startup+0x0/0x33 returned 0 af=
ter 1 usecs
> [ =A0 =A04.262857] calling =A0dynamic_debug_init_debugfs+0x0/0x6a @ 1
> [ =A0 =A04.291081] initcall dynamic_debug_init_debugfs+0x0/0x6a returned =
0 after 43 usecs
> [ =A0 =A04.292043] calling =A0pci_proc_init+0x0/0x6a @ 1
> [ =A0 =A04.303505] initcall pci_proc_init+0x0/0x6a returned 0 after 261 u=
secs
> [ =A0 =A04.304337] calling =A0pcie_portdrv_init+0x0/0x7a @ 1
> [ =A0 =A04.315345] pcieport 0000:00:0b.0: setting latency timer to 64
> (XEN) physdev.c:155: dom0: wrong map_pirq type 3
> [ =A0 =A04.325783] pcieport 0000:00:0c.0: setting latency timer to 64
> [ =A0 =A04.332134] pcieport 0000:00:0d.0: setting latency timer to 64
> [ =A0 =A04.338343] pcieport 0000:00:0e.0: setting latency timer to 64
> [ =A0 =A04.344598] initcall pcie_portdrv_init+0x0/0x7a returned 0 after 2=
8974 usecs
> [ =A0 =A04.345583] calling =A0aer_service_init+0x0/0x22 @ 1
> [ =A0 =A04.356587] initcall aer_service_init+0x0/0x22 returned 0 after 13=
1 usecs
> [ =A0 =A04.357574] calling =A0ioapic_init+0x0/0x1b @ 1
> [ =A0 =A04.367906] initcall ioapic_init+0x0/0x1b returned 0 after 155 use=
cs
> [ =A0 =A04.368892] calling =A0pci_hotplug_init+0x0/0x1d @ 1
> [ =A0 =A04.368892] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
> [ =A0 =A04.368892] initcall pci_hotplug_init+0x0/0x1d returned 0 after 54=
91 usecs
> [ =A0 =A04.368892] calling =A0pcifront_init+0x0/0x5e @ 1
> [ =A0 =A04.368892] initcall pcifront_init+0x0/0x5e returned -19 after 0 u=
secs
> [ =A0 =A04.368892] calling =A0genericbl_init+0x0/0x12 @ 1
> [ =A0 =A04.408737] initcall genericbl_init+0x0/0x12 returned 0 after 139 =
usecs
> [ =A0 =A04.409724] calling =A0cirrusfb_init+0x0/0xcf @ 1
> [ =A0 =A04.420073] initcall cirrusfb_init+0x0/0xcf returned 0 after 170 u=
secs
> [ =A0 =A04.421050] calling =A0efifb_init+0x0/0x1fc @ 1
> [ =A0 =A04.421050] initcall efifb_init+0x0/0x1fc returned -19 after 4 use=
cs
> [ =A0 =A04.421050] calling =A0acpi_reserve_resources+0x0/0xeb @ 1
> [ =A0 =A04.421050] initcall acpi_reserve_resources+0x0/0xeb returned 0 af=
ter 3 usecs
> [ =A0 =A04.421050] calling =A0irqrouter_init_ops+0x0/0x26 @ 1
> [ =A0 =A04.421050] initcall irqrouter_init_ops+0x0/0x26 returned 0 after =
0 usecs
> [ =A0 =A04.421050] calling =A0acpi_ac_init+0x0/0x28 @ 1
> [ =A0 =A04.466486] initcall acpi_ac_init+0x0/0x28 returned 0 after 196 us=
ecs
> [ =A0 =A04.467474] calling =A0acpi_button_init+0x0/0x12 @ 1
> [ =A0 =A04.477954] input: Power Button as /devices/LNXSYSTM:00/device:00/=
PNP0C0C:00/input/input0
> [ =A0 =A04.478939] ACPI: Power Button [PWRB]
> [ =A0 =A04.490046] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:0=
0/input/input1
> [ =A0 =A04.491034] ACPI: Power Button [PWRF]
> [ =A0 =A04.501283] initcall acpi_button_init+0x0/0x12 returned 0 after 22=
996 usecs
> [ =A0 =A04.502271] calling =A0acpi_fan_init+0x0/0x18 @ 1
> [ =A0 =A04.512966] initcall acpi_fan_init+0x0/0x18 returned 0 after 168 u=
secs
> [ =A0 =A04.513952] calling =A0acpi_processor_init+0x0/0xcd @ 1
> [ =A0 =A04.513952] ACPI: acpi_idle yielding to (null)
> [ =A0 =A04.530746] initcall acpi_processor_init+0x0/0xcd returned 0 after=
 6038 usecs
> [ =A0 =A04.531593] calling =A0acpi_container_init+0x0/0x4a @ 1
> [ =A0 =A04.547835] initcall acpi_container_init+0x0/0x4a returned 0 after=
 4763 usecs
> [ =A0 =A04.548575] calling =A0acpi_thermal_init+0x0/0x42 @ 1
> [ =A0 =A04.560053] initcall acpi_thermal_init+0x0/0x42 returned 0 after 1=
84 usecs
> [ =A0 =A04.561041] calling =A0acpi_battery_init+0x0/0x16 @ 1
> [ =A0 =A04.561041] initcall acpi_battery_init+0x0/0x16 returned 0 after 5=
 usecs
> [ =A0 =A04.571853] calling =A01_acpi_battery_init_async+0x0/0x1b @ 5
> [ =A0 =A04.572171] initcall 1_acpi_battery_init_async+0x0/0x1b returned 0=
 after 303 usecs
> [ =A0 =A04.561041] calling =A0init+0x0/0x12 @ 1
> [ =A0 =A04.595751] initcall init+0x0/0x12 returned 0 after 128 usecs
> [ =A0 =A04.596739] calling =A0xenbus_probe_initcall+0x0/0x3b @ 1
> [ =A0 =A04.596739] initcall xenbus_probe_initcall+0x0/0x3b returned 0 aft=
er 0 usecs
> [ =A0 =A04.596739] calling =A0gntdev_init+0x0/0x4d @ 1
> [ =A0 =A04.618410] initcall gntdev_init+0x0/0x4d returned 0 after 156 use=
cs
> [ =A0 =A04.619396] calling =A0gntalloc_init+0x0/0x68 @ 1
> [ =A0 =A04.629445] initcall gntalloc_init+0x0/0x68 returned 0 after 129 u=
secs
> [ =A0 =A04.630431] calling =A0hypervisor_subsys_init+0x0/0x25 @ 1
> [ =A0 =A04.630431] initcall hypervisor_subsys_init+0x0/0x25 returned 0 af=
ter 0 usecs
> [ =A0 =A04.630431] calling =A0hyper_sysfs_init+0x0/0xfb @ 1
> [ =A0 =A04.630431] initcall hyper_sysfs_init+0x0/0xfb returned 0 after 15=
 usecs
> [ =A0 =A04.630431] calling =A0platform_pci_module_init+0x0/0x29 @ 1
> [ =A0 =A04.630431] initcall platform_pci_module_init+0x0/0x29 returned -1=
9 after 0 usecs
> [ =A0 =A04.630431] calling =A0xen_tmem_init+0x0/0x5c @ 1
> [ =A0 =A04.630431] initcall xen_tmem_init+0x0/0x5c returned 0 after 0 use=
cs
> [ =A0 =A04.630431] calling =A0xen_pcibk_init+0x0/0x152 @ 1
> [ =A0 =A04.688965] xen-pciback: backend is vpci
> [ =A0 =A04.693053] initcall xen_pcibk_init+0x0/0x152 returned 0 after 405=
6 usecs
> [ =A0 =A04.694036] calling =A0pty_init+0x0/0x524 @ 1
> [ =A0 =A04.775581] initcall pty_init+0x0/0x524 returned 0 after 69853 use=
cs
> [ =A0 =A04.776565] calling =A0sysrq_init+0x0/0x78 @ 1
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] console [hvc0] enabled
> [ =A0 =A04.798374] co=EE
>

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 09:33:33 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 09: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 1RJpN7-00014y-5p; Fri, 28 Oct 2011 09:33:33 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJUsG-0007Go-Tz
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 11:40:21 -0700
X-Env-Sender: miche@google.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1319740817!1917576!1
X-Originating-IP: [74.125.121.67]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32305 invoked from network); 27 Oct 2011 18:40:17 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (74.125.121.67)
	by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 18:40:17 -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 p9RIe8Qv003804;
	Thu, 27 Oct 2011 11:40:08 -0700
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1319740808; bh=JqNhSm5I6O9X18VApZJFmoNjYf8=;
	h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References;
	b=QWy+Sci0aK2hsfUfWHa1Ser5X3PiZwWcrHPzcrk90iXRYJJQsYdaWSl20DM9ys96T
	n354XdgOA0yJINCbzdGsw==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references;
	b=GhEb7VK4zgq3F1lChMggPGLqGiGRzd7oHKdmnmX3HtOZDFxvdNXDz2k5NNSCOW45J
	pEErLCtIiPsnXcwkopb1w==
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 p9RIdvhj012117;
	Thu, 27 Oct 2011 11:39:57 -0700
Received: by miche.sea.corp.google.com (Postfix, from userid 124214)
	id 8624C20467; Thu, 27 Oct 2011 11:39:56 -0700 (PDT)
From: Miche Baker-Harvey <miche@google.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 27 Oct 2011 11:39:53 -0700
Message-Id: <1319740793-2187-1-git-send-email-miche@google.com>
X-Mailer: git-send-email 1.7.3.1
In-Reply-To: <20111027173527.GA23839@phenom.dumpdata.com>
References: <20111027173527.GA23839@phenom.dumpdata.com>
X-Mailman-Approved-At: Fri, 28 Oct 2011 09:13:06 -0700
Cc: xen-devel@lists.xensource.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] [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

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.
+ */
+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);
 
+	/*
+	 * xxx Use index 0 for now assuming there is no early HVC, since
+	 * we don't support it.
+	 */
 	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);
-
 	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);
 }
 
 static void control_work_handler(struct work_struct *work)
diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
index 7430bc3..03ff6ed 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
@@ -242,6 +247,7 @@ static void destroy_hvc_struct(struct kref *kref)
 
 	spin_unlock(&hvc_structs_lock);
 
+	kfree(hp->hvc_console);
 	kfree(hp);
 }
 
@@ -822,19 +828,25 @@ 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 */
+	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);
+		}
 	}
 
 	hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
 			GFP_KERNEL);
-	if (!hp)
+	if (!hp) {
+		mutex_unlock(&hvc_ports_mutex);
 		return ERR_PTR(-ENOMEM);
+	}
 
 	hp->vtermno = vtermno;
 	hp->data = data;
@@ -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));
+	hp->hvc_console = cp;
+
 	spin_lock_init(&hp->lock);
 	spin_lock(&hvc_structs_lock);
 
@@ -862,13 +887,14 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
 		i = ++last_hvc;
 
 	hp->index = i;
-	hvc_console.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(&hvc_console);
+	register_console(cp);
+	mutex_unlock(&hvc_ports_mutex);
 
 	return hp;
 }
@@ -879,7 +905,8 @@ int hvc_remove(struct hvc_struct *hp)
 	unsigned long flags;
 	struct tty_struct *tty;
 
-	unregister_console(&hvc_console);
+	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;
-- 
1.7.3.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 09:34:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 09:34:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJpNw-0001Ss-7Y; Fri, 28 Oct 2011 09:34:24 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJXkM-000114-IB
	for xen-devel@lists.xensource.com; Thu, 27 Oct 2011 14:44:23 -0700
X-Env-Sender: miche@google.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1319751858!1338378!1
X-Originating-IP: [216.239.44.51]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17935 invoked from network); 27 Oct 2011 21:44:19 -0000
Received: from smtp-out.google.com (HELO smtp-out.google.com) (216.239.44.51)
	by server-12.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 27 Oct 2011 21:44:19 -0000
Received: from hpaq7.eem.corp.google.com (hpaq7.eem.corp.google.com
	[172.25.149.7]) by smtp-out.google.com with ESMTP id p9RLiAYm023523;
	Thu, 27 Oct 2011 14:44:11 -0700
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=google.com; s=beta;
	t=1319751853; bh=Yg/BAUegMETNW3Su3OcmzwVwAUY=;
	h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References;
	b=DpMcDes+qL7mBMmJx+BaqJtPGsaHs2XdjOkrxIZGWyosqEqnLwbWFZ0eruMo6JgVe
	Y8uROaf+kV7b3TIvPG6Xg==
DomainKey-Signature: a=rsa-sha1; s=beta; d=google.com; c=nofws; q=dns;
	h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references;
	b=AXh0ZxMgO7WreeV+W82CYkvOeh89sfpAaTHyc11zAbwccjeg204C+rniR08etq/9S
	DIun1qcnu4rMILp+z2BIA==
Received: from miche.sea.corp.google.com (miche.sea.corp.google.com
	[172.31.71.52])
	by hpaq7.eem.corp.google.com with ESMTP id p9RLhw34019268;
	Thu, 27 Oct 2011 14:43:59 -0700
Received: by miche.sea.corp.google.com (Postfix, from userid 124214)
	id 839C620467; Thu, 27 Oct 2011 14:43:58 -0700 (PDT)
From: Miche Baker-Harvey <miche@google.com>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Date: Thu, 27 Oct 2011 14:43:22 -0700
Message-Id: <1319751802-27013-1-git-send-email-miche@google.com>
X-Mailer: git-send-email 1.7.3.1
In-Reply-To: <20111027173527.GA23839@phenom.dumpdata.com>
References: <20111027173527.GA23839@phenom.dumpdata.com>
X-Mailman-Approved-At: Fri, 28 Oct 2011 09:13:06 -0700
Cc: xen-devel@lists.xensource.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] [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

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.

Signed-off-by: Miche Baker-Harvey <miche@google.com>
Reported-by-and-Tested-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.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.
+ */
+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);
 
+	/*
+	 * xxx Use index 0 for now assuming there is no early HVC, since
+	 * we don't support it.
+	 */
 	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);
-
 	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);
 }
 
 static void control_work_handler(struct work_struct *work)
diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c
index 7430bc3..03ff6ed 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
@@ -242,6 +247,7 @@ static void destroy_hvc_struct(struct kref *kref)
 
 	spin_unlock(&hvc_structs_lock);
 
+	kfree(hp->hvc_console);
 	kfree(hp);
 }
 
@@ -822,19 +828,25 @@ 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 */
+	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);
+		}
 	}
 
 	hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
 			GFP_KERNEL);
-	if (!hp)
+	if (!hp) {
+		mutex_unlock(&hvc_ports_mutex);
 		return ERR_PTR(-ENOMEM);
+	}
 
 	hp->vtermno = vtermno;
 	hp->data = data;
@@ -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));
+	hp->hvc_console = cp;
+
 	spin_lock_init(&hp->lock);
 	spin_lock(&hvc_structs_lock);
 
@@ -862,13 +887,14 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
 		i = ++last_hvc;
 
 	hp->index = i;
-	hvc_console.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(&hvc_console);
+	register_console(cp);
+	mutex_unlock(&hvc_ports_mutex);
 
 	return hp;
 }
@@ -879,7 +905,8 @@ int hvc_remove(struct hvc_struct *hp)
 	unsigned long flags;
 	struct tty_struct *tty;
 
-	unregister_console(&hvc_console);
+	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;
-- 
1.7.3.1


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 09:49:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 09:49:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJpcB-0005FJ-BF; Fri, 28 Oct 2011 09:49:07 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJpU6-0002si-CD
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 09:40:46 -0700
X-Env-Sender: gregkh@suse.de
X-Msg-Ref: server-8.tower-27.messagelabs.com!1319820021!50135799!1
X-Originating-IP: [195.135.220.15]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26477 invoked from network); 28 Oct 2011 16:40:21 -0000
Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15)
	by server-8.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 28 Oct 2011 16:40:21 -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 A44DE8F903;
	Fri, 28 Oct 2011 18:40:42 +0200 (CEST)
Date: Fri, 28 Oct 2011 18:27:59 +0200
From: Greg KH <gregkh@suse.de>
To: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Message-ID: <20111028162759.GA27263@suse.de>
References: <20111027173527.GA23839@phenom.dumpdata.com>
	<1319751802-27013-1-git-send-email-miche@google.com>
	<20111027215535.GA5671@phenom.dumpdata.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20111027215535.GA5671@phenom.dumpdata.com>
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: xen-devel@lists.xensource.com,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	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 Thu, Oct 27, 2011 at 05:55:35PM -0400, Konrad Rzeszutek Wilk wrote:
> On Thu, Oct 27, 2011 at 02:43:22PM -0700, Miche Baker-Harvey wrote:
> > Multiple HVC console terminals enabled.
> 
> Miche,
> 
> You might want to flesh out the description a bit. Perhaps include
> such details as : "fixes the infinite loop that git commit XX
> caused". Perhaps include some of the serial console output.
> 
> Maybe also change the title - the patch name (which is what shows up
> if you do 'git log --oneline') is 'VirtioConsole support.' which is
> not very informative.

Yes, all of these need to be resolved before I can accept this.

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 Fri Oct 28 11:38:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:38:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrJt-0001Kk-Pt; Fri, 28 Oct 2011 11:38:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJ0-00014n-U7
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:27 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15282 invoked from network); 28 Oct 2011 18:37:24 -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;
	28 Oct 2011 18:37:24 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652727"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37: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, 28 Oct 2011 19:37:23 +0100
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
	1RJrIx-0007Dn-3F; Fri, 28 Oct 2011 18:37:23 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrIw-00040y-Vz;
	Fri, 28 Oct 2011 19:37:23 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Fri, 28 Oct 2011 19:36:58 +0100
Message-ID: <1319827031-15395-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 RFC v2 00/13] New event API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 revised RFC version of my event handling API proposal.

It consists of 10 rather uninteresting preparatory, stylistic
and bugfix patches, plus 3 with some meat in:
  02/13  libxenstore: Provide xs_check_watch
  12/13  libxl: New API for providing OS events to libxl
  13/13  libxl: New event generation API

This series contains an implementation of almost everything, and
builds apart from the lack of libxl_event_free, but it has not been
executed at all.

So at this stage a very detailed code review, particularly of 12 and
13 is probably not appropriate.  However, this is hopefully a
near-final version of the external and internal interfaces so it would
be worth looking at those.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 11:39:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:39:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrLB-0001iE-M4; Fri, 28 Oct 2011 11:39:41 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJ3-00014o-O1
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:30 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!2
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15596 invoked from network); 28 Oct 2011 18:37:26 -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;
	28 Oct 2011 18:37:26 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652728"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37: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; Fri, 28 Oct 2011 19:37:26 +0100
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
	1RJrJ0-0007Dq-Hc; Fri, 28 Oct 2011 18:37:26 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ0-000418-Gz;
	Fri, 28 Oct 2011 19:37:26 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:36:59 +0100
Message-ID: <1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
References: <1319827031-15395-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 RFC v2 01/13] libxl: Make libxl__xs_* more
	const-correct
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Paths and values which are not modified by these functions should be
declared as "const char *" not "char *".

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/libxl_internal.h |    9 +++++----
 tools/libxl/libxl_xshelp.c   |    9 +++++----
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 2e26ac6..31adbc8 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -181,18 +181,19 @@ _hidden char *libxl__dirname(libxl__gc *gc, const char *s);
 _hidden char **libxl__xs_kvs_of_flexarray(libxl__gc *gc, flexarray_t *array, int length);
 
 _hidden int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t,
-                    char *dir, char **kvs);
+                             const char *dir, char **kvs);
 _hidden int libxl__xs_write(libxl__gc *gc, xs_transaction_t t,
-                   char *path, const char *fmt, ...) PRINTF_ATTRIBUTE(4, 5);
+               const char *path, const char *fmt, ...) PRINTF_ATTRIBUTE(4, 5);
    /* Each fn returns 0 on success.
     * On error: returns -1, sets errno (no logging) */
 
 _hidden char *libxl__xs_get_dompath(libxl__gc *gc, uint32_t domid);
    /* On error: logs, returns NULL, sets errno. */
 
-_hidden char *libxl__xs_read(libxl__gc *gc, xs_transaction_t t, char *path);
+_hidden char *libxl__xs_read(libxl__gc *gc, xs_transaction_t t,
+                             const char *path);
 _hidden char **libxl__xs_directory(libxl__gc *gc, xs_transaction_t t,
-                                   char *path, unsigned int *nb);
+                                   const char *path, unsigned int *nb);
    /* On error: returns NULL, sets errno (no logging) */
 
 /* from xl_dom */
diff --git a/tools/libxl/libxl_xshelp.c b/tools/libxl/libxl_xshelp.c
index e41f962..56a7c7b 100644
--- a/tools/libxl/libxl_xshelp.c
+++ b/tools/libxl/libxl_xshelp.c
@@ -49,7 +49,7 @@ char **libxl__xs_kvs_of_flexarray(libxl__gc *gc, flexarray_t *array, int length)
 }
 
 int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t,
-                    char *dir, char *kvs[])
+                     const char *dir, char *kvs[])
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     char *path;
@@ -69,7 +69,7 @@ int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t,
 }
 
 int libxl__xs_write(libxl__gc *gc, xs_transaction_t t,
-                   char *path, const char *fmt, ...)
+                    const char *path, const char *fmt, ...)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     char *s;
@@ -87,7 +87,7 @@ int libxl__xs_write(libxl__gc *gc, xs_transaction_t t,
     return 0;
 }
 
-char * libxl__xs_read(libxl__gc *gc, xs_transaction_t t, char *path)
+char * libxl__xs_read(libxl__gc *gc, xs_transaction_t t, const char *path)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     char *ptr;
@@ -113,7 +113,8 @@ char *libxl__xs_get_dompath(libxl__gc *gc, uint32_t domid)
     return s;
 }
 
-char **libxl__xs_directory(libxl__gc *gc, xs_transaction_t t, char *path, unsigned int *nb)
+char **libxl__xs_directory(libxl__gc *gc, xs_transaction_t t,
+                           const char *path, unsigned int *nb)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     char **ret = NULL;
-- 
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 Fri Oct 28 11:40:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:40:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrMM-00025J-Bj; Fri, 28 Oct 2011 11:40:54 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJ5-00016F-TC
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:32 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!3
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15626 invoked from network); 28 Oct 2011 18:37:28 -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;
	28 Oct 2011 18:37:28 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652730"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37: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, 28 Oct 2011 19:37:28 +0100
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
	1RJrJ2-0007Dt-KR; Fri, 28 Oct 2011 18:37:28 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ2-00041H-Jp;
	Fri, 28 Oct 2011 19:37:28 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:37:00 +0100
Message-ID: <1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-2-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 RFC v2 02/13] libxenstore: Provide xs_check_watch
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Event-driven programs want to wait until the xs_fileno triggers for
reading, and then repeatedly call xs_check_watch.

Also xs_read_watch exposes a useless "num" out parameter, which should
always (if things aren't going hideously wrong) be at least 2 and
which the caller shouldn't be interested in.  So xs_check_watch
doesn't have one of those.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/xenstore/xs.c |   89 ++++++++++++++++++++++++++++++++++++++++++++-------
 tools/xenstore/xs.h |   16 +++++++++
 2 files changed, 93 insertions(+), 12 deletions(-)

diff --git a/tools/xenstore/xs.c b/tools/xenstore/xs.c
index c72ea83..96e4b7a 100644
--- a/tools/xenstore/xs.c
+++ b/tools/xenstore/xs.c
@@ -132,7 +132,20 @@ struct xs_handle {
 
 #endif
 
-static int read_message(struct xs_handle *h);
+static int read_message(struct xs_handle *h, int nonblocking);
+
+static void setnonblock(int fd, int nonblock) {
+	int flags = fcntl(fd, F_GETFL);
+	if (flags == -1)
+		return;
+
+	if (nonblock)
+		flags |= O_NONBLOCK;
+	else
+		flags &= ~O_NONBLOCK;
+
+	fcntl(fd, F_SETFL, flags);
+}
 
 int xs_fileno(struct xs_handle *h)
 {
@@ -327,8 +340,16 @@ void xs_close(struct xs_handle* xsh)
 		xs_daemon_close(xsh);
 }
 
-static bool read_all(int fd, void *data, unsigned int len)
+static bool read_all(int fd, void *data, unsigned int len, int nonblocking)
+	/* With nonblocking, either reads either everything requested,
+	 * or nothing. */
 {
+	if (!len)
+		return true;
+
+	if (nonblocking)
+		setnonblock(fd, 1);
+
 	while (len) {
 		int done;
 
@@ -336,18 +357,31 @@ static bool read_all(int fd, void *data, unsigned int len)
 		if (done < 0) {
 			if (errno == EINTR)
 				continue;
-			return false;
+			goto out_false;
 		}
 		if (done == 0) {
 			/* It closed fd on us?  EBADF is appropriate. */
 			errno = EBADF;
-			return false;
+			goto out_false;
 		}
 		data += done;
 		len -= done;
+
+		if (nonblocking) {
+			setnonblock(fd, 0);
+			nonblocking = 0;
+		}
 	}
 
 	return true;
+
+out_false:
+	if (nonblocking) {
+		int e = errno;
+		setnonblock(fd, 0);
+		errno = e;
+	}
+	return false;
 }
 
 #ifdef XSTEST
@@ -376,7 +410,7 @@ static void *read_reply(
 	read_from_thread = read_thread_exists(h);
 
 	/* Read from comms channel ourselves if there is no reader thread. */
-	if (!read_from_thread && (read_message(h) == -1))
+	if (!read_from_thread && (read_message(h, 0) == -1))
 		return NULL;
 
 	mutex_lock(&h->reply_mutex);
@@ -695,7 +729,8 @@ bool xs_watch(struct xs_handle *h, const char *path, const char *token)
  * Returns array of two pointers: path and token, or NULL.
  * Call free() after use.
  */
-char **xs_read_watch(struct xs_handle *h, unsigned int *num)
+static char **read_watch_internal(struct xs_handle *h, unsigned int *num,
+				  int nonblocking)
 {
 	struct xs_stored_msg *msg;
 	char **ret, *strings, c = 0;
@@ -709,14 +744,20 @@ char **xs_read_watch(struct xs_handle *h, unsigned int *num)
 	 * we haven't called xs_watch.	Presumably the application
 	 * will do so later; in the meantime we just block.
 	 */
-	while (list_empty(&h->watch_list) && h->fd != -1)
+	while (list_empty(&h->watch_list) && h->fd != -1) {
+		if (nonblocking) {
+			mutex_unlock(&h->watch_mutex);
+			errno = EAGAIN;
+			return 0;
+		}
 		condvar_wait(&h->watch_condvar, &h->watch_mutex);
+	}
 #else /* !defined(USE_PTHREAD) */
 	/* Read from comms channel ourselves if there are no threads
 	 * and therefore no reader thread. */
 
 	assert(!read_thread_exists(h)); /* not threadsafe but worth a check */
-	if ((read_message(h) == -1))
+	if ((read_message(h, nonblocking) == -1))
 		return NULL;
 
 #endif /* !defined(USE_PTHREAD) */
@@ -762,6 +803,24 @@ char **xs_read_watch(struct xs_handle *h, unsigned int *num)
 	return ret;
 }
 
+char **xs_check_watch(struct xs_handle *h)
+{
+	unsigned int num;
+	char **ret;
+	ret = read_watch_internal(h, &num, 1);
+	if (ret) assert(num >= 2);
+	return ret;
+}
+
+/* Find out what node change was on (will block if nothing pending).
+ * Returns array of two pointers: path and token, or NULL.
+ * Call free() after use.
+ */
+char **xs_read_watch(struct xs_handle *h, unsigned int *num)
+{
+	return read_watch_internal(h, num, 0);
+}
+
 /* Remove a watch on a node.
  * Returns false on failure (no watch on that node).
  */
@@ -942,11 +1001,17 @@ char *xs_debug_command(struct xs_handle *h, const char *cmd,
 			ARRAY_SIZE(iov), NULL);
 }
 
-static int read_message(struct xs_handle *h)
+static int read_message(struct xs_handle *h, int nonblocking)
 {
 	/* IMPORTANT: It is forbidden to call this function without
 	 * acquiring the request lock and checking that h->read_thr_exists
 	 * is false.  See "Lock discipline" in struct xs_handle, above. */
+
+	/* If nonblocking==1, this function will always read either
+	 * nothing, returning -1 and setting errno==EAGAIN, or we read
+	 * whole amount requested.  Ie as soon as we have the start of
+	 * the message we block until we get all of it.
+	 */
          
 	struct xs_stored_msg *msg = NULL;
 	char *body = NULL;
@@ -958,7 +1023,7 @@ static int read_message(struct xs_handle *h)
 	if (msg == NULL)
 		goto error;
 	cleanup_push(free, msg);
-	if (!read_all(h->fd, &msg->hdr, sizeof(msg->hdr))) { /* Cancellation point */
+	if (!read_all(h->fd, &msg->hdr, sizeof(msg->hdr), nonblocking)) { /* Cancellation point */
 		saved_errno = errno;
 		goto error_freemsg;
 	}
@@ -968,7 +1033,7 @@ static int read_message(struct xs_handle *h)
 	if (body == NULL)
 		goto error_freemsg;
 	cleanup_push(free, body);
-	if (!read_all(h->fd, body, msg->hdr.len)) { /* Cancellation point */
+	if (!read_all(h->fd, body, msg->hdr.len, 0)) { /* Cancellation point */
 		saved_errno = errno;
 		goto error_freebody;
 	}
@@ -1023,7 +1088,7 @@ static void *read_thread(void *arg)
 	struct xs_handle *h = arg;
 	int fd;
 
-	while (read_message(h) != -1)
+	while (read_message(h, 0) != -1)
 		continue;
 
 	/* An error return from read_message leaves the socket in an undefined
diff --git a/tools/xenstore/xs.h b/tools/xenstore/xs.h
index 1cbe255..63f535d 100644
--- a/tools/xenstore/xs.h
+++ b/tools/xenstore/xs.h
@@ -135,6 +135,22 @@ bool xs_watch(struct xs_handle *h, const char *path, const char *token);
 /* Return the FD to poll on to see if a watch has fired. */
 int xs_fileno(struct xs_handle *h);
 
+/* Check for node changes.  On success, returns a non-NULL pointer ret
+ * such that ret[0] and ret[1] are valid C strings, namely the
+ * triggering path (see docs/misc/xenstore.txt) and the token (from
+ * xs_watch).  On error return value is NULL setting errno.
+ * 
+ * Callers should, after xs_fileno has become readable, repeatedly
+ * call xs_check_watch until it returns NULL and sets errno to EAGAIN.
+ * (If the fd became readable, xs_check_watch is allowed to make it no
+ * longer show up as readable even if future calls to xs_check_watch
+ * will return more watch events.)
+ *
+ * After the caller is finished with the returned information it
+ * should be freed all in one go with free(ret).
+ */
+char **xs_check_watch(struct xs_handle *h);
+
 /* Find out what node change was on (will block if nothing pending).
  * Returns array containing the path and token. Use XS_WATCH_* to access these
  * elements. Call free() after use.
-- 
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 Fri Oct 28 11:41:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11: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 1RJrNL-0002ST-Vd; Fri, 28 Oct 2011 11:41:56 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJ7-000178-PZ
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:34 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!6
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15678 invoked from network); 28 Oct 2011 18:37:30 -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;
	28 Oct 2011 18:37:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652734"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18: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; Fri, 28 Oct 2011 19:37:30 +0100
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
	1RJrJ4-0007E2-IP; Fri, 28 Oct 2011 18:37:30 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ4-00041T-Hl;
	Fri, 28 Oct 2011 19:37:30 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:37:03 +0100
Message-ID: <1319827031-15395-6-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-5-git-send-email-ian.jackson@eu.citrix.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>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC v2 05/13] libxl: idl: Provide struct and
	union tags
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 generating:

   typedef struct {
     ...
   } libxl_foo;

Produce:

   typedef struct libxl_foo {
     ...
   } libxl_foo;

This makes it possible to refer to libxl idl-generated structs and
unions, as incomplete types, before they have been defined.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/gentypes.py |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/tools/libxl/gentypes.py b/tools/libxl/gentypes.py
index e82b706..c4efbf3 100644
--- a/tools/libxl/gentypes.py
+++ b/tools/libxl/gentypes.py
@@ -56,7 +56,7 @@ def libxl_C_type_define(ty, indent = ""):
         if ty.typename is None:
             s += "%s {\n" % ty.kind
         else:
-            s += "typedef %s {\n" % ty.kind
+            s += "typedef %s %s {\n" % (ty.kind, ty.typename)
 
         for f in ty.fields:
             if f.comment is not None:
-- 
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 Fri Oct 28 11:42:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:42:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrO6-0002p9-M8; Fri, 28 Oct 2011 11:42:42 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJ7-000177-OB
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:34 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!5
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15674 invoked from network); 28 Oct 2011 18:37:30 -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;
	28 Oct 2011 18:37:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652732"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18: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; Fri, 28 Oct 2011 19:37:30 +0100
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
	1RJrJ4-0007Dz-2P; Fri, 28 Oct 2011 18:37:30 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ4-00041P-1m;
	Fri, 28 Oct 2011 19:37:30 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:37:02 +0100
Message-ID: <1319827031-15395-5-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.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>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC v2 04/13] libxl: idl: support new "c_only"
	type attribute
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 provides for fields in libxl datatypes which are only present in
the C version of structures.  This is useful, for example, when a
libxl datatype wants to contain fields which are used by libxl
internally and which are only present in the structure to avoid
additional memory allocation inconvenience.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/gentest.py    |    2 ++
 tools/libxl/libxltypes.py |    4 +++-
 2 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/tools/libxl/gentest.py b/tools/libxl/gentest.py
index 6697ac5..ed5358d 100644
--- a/tools/libxl/gentest.py
+++ b/tools/libxl/gentest.py
@@ -56,6 +56,8 @@ def gen_rand_init(ty, v, indent = "    ", parent = None):
         s += "%s = rand() %% 2;\n" % v
     elif ty.typename in ["char *"]:
         s += "%s = rand_str();\n" % v
+    elif ty.c_only:
+        pass
     elif ty.typename in handcoded:
         raise Exception("Gen for handcoded %s" % ty.typename)
     else:
diff --git a/tools/libxl/libxltypes.py b/tools/libxl/libxltypes.py
index 05cba88..83a9426 100644
--- a/tools/libxl/libxltypes.py
+++ b/tools/libxl/libxltypes.py
@@ -33,6 +33,8 @@ class Type(object):
         if self.passby not in [PASS_BY_VALUE, PASS_BY_REFERENCE]:
             raise ValueError
 
+        self.c_only = kwargs.setdefault('c_only', False)
+
         if typename is None: # Anonymous type
             self.typename = None
             self.rawname = None
@@ -50,7 +52,7 @@ class Type(object):
 
         self.autogenerate_destructor = kwargs.setdefault('autogenerate_destructor', True)
 
-        if self.typename is not None:
+        if self.typename is not None and not self.c_only:
             self.json_fn = kwargs.setdefault('json_fn', self.typename + "_gen_json")
         else:
             self.json_fn = kwargs.setdefault('json_fn', None)
-- 
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 Fri Oct 28 11:43:43 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:43:43 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrP4-0003Qz-UG; Fri, 28 Oct 2011 11:43:42 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJ8-00017F-Bq
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:35 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!7
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15685 invoked from network); 28 Oct 2011 18:37:31 -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;
	28 Oct 2011 18:37:31 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652735"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37:31 +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, 28 Oct 2011 19:37:31 +0100
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
	1RJrJ5-0007E5-1h; Fri, 28 Oct 2011 18:37:31 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ5-00041X-0z;
	Fri, 28 Oct 2011 19:37:31 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:37:04 +0100
Message-ID: <1319827031-15395-7-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-6-git-send-email-ian.jackson@eu.citrix.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>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC v2 06/13] libxl: permit declaration after
	statement
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

GCC and C99 allow declarations to be mixed with code.  This is a good
idea because:

 * It allows variables to be more often initialised as they are
   declared, thus reducing the occurrence of uninitialised variable
   errors.

 * Certain alloca-like constructs (arrays allocated at runtime on the
   stack) can more often be written without a spurious { } block.
   Such blocks are confusing to read.

 * It makes it easier to write and use macros which declare and
   initialise formulaic variables and do other function setup code,
   because there is no need to worry that such macros might be
   incompatible with each other or have strict ordering constraints.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/Makefile |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index f23661a..a3727ab 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -11,7 +11,8 @@ MINOR = 0
 XLUMAJOR = 1.0
 XLUMINOR = 0
 
-CFLAGS += -Werror -Wno-format-zero-length -Wmissing-declarations
+CFLAGS += -Werror -Wno-format-zero-length -Wmissing-declarations \
+	-Wno-declaration-after-statement
 CFLAGS += -I. -fPIC
 
 ifeq ($(CONFIG_Linux),y)
-- 
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 Fri Oct 28 11:44:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:44:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrQ4-0003oR-KS; Fri, 28 Oct 2011 11:44:44 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJ6-000173-Ul
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:34 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!4
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15666 invoked from network); 28 Oct 2011 18:37:29 -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;
	28 Oct 2011 18:37:29 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652731"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37: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; Fri, 28 Oct 2011 19:37:29 +0100
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
	1RJrJ3-0007Dw-EN; Fri, 28 Oct 2011 18:37:29 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ3-00041L-Dd;
	Fri, 28 Oct 2011 19:37:29 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: xen-devel@lists.xensource.com
Date: Fri, 28 Oct 2011 19:37:01 +0100
Message-ID: <1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.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>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC v2 03/13] libxl: Provide a version of bsd's
	queue.h as _libxl_list.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

We would like some linked list macros which are (a) well known to be
sane and (b) typesafe.  BSD's queue.h meets these criteria.

We also provide some simple perlery to arrange to add the libxl_
namespace prefix to the macros.  This will allow us to #include
_libxl_list.h in our public header file without clashing with anyone
else who is also using another version of queue.h.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 COPYING                              |    8 +
 tools/libxl/Makefile                 |   10 +-
 tools/libxl/bsd-sys-queue-h-seddery  |   70 +++
 tools/libxl/external/README          |   13 +
 tools/libxl/external/bsd-queue.3     | 1044 ++++++++++++++++++++++++++++++++++
 tools/libxl/external/bsd-sys-queue.h |  637 +++++++++++++++++++++
 6 files changed, 1779 insertions(+), 3 deletions(-)
 create mode 100755 tools/libxl/bsd-sys-queue-h-seddery
 create mode 100644 tools/libxl/external/README
 create mode 100644 tools/libxl/external/bsd-queue.3
 create mode 100644 tools/libxl/external/bsd-sys-queue.h

diff --git a/COPYING b/COPYING
index 07535ad..524542d 100644
--- a/COPYING
+++ b/COPYING
@@ -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.
+
+
 Licensing Exceptions (the relaxed BSD-style license)
 ----------------------------------------------------
 
diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index 51e5132..f23661a 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -42,7 +42,7 @@ LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o
 
 $(LIBXL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) $(CFLAGS_libxenstore) $(CFLAGS_libblktapctl)
 
-AUTOINCS= libxlu_cfg_y.h libxlu_cfg_l.h
+AUTOINCS= libxlu_cfg_y.h libxlu_cfg_l.h _libxl_list.h
 AUTOSRCS= libxlu_cfg_y.c libxlu_cfg_l.c
 LIBXLU_OBJS = libxlu_cfg_y.o libxlu_cfg_l.o libxlu_cfg.o \
 	libxlu_disk_l.o libxlu_disk.o
@@ -55,7 +55,7 @@ $(XL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) # For xentoollog.h
 $(XL_OBJS): CFLAGS += $(CFLAGS_libxenlight)
 
 testidl.o: CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenlight)
-testidl.c: libxl_types.idl gentest.py libxl.h
+testidl.c: libxl_types.idl gentest.py libxl.h $(AUTOINCS)
 	$(PYTHON) gentest.py libxl_types.idl testidl.c.new
 	mv testidl.c.new testidl.c
 
@@ -63,7 +63,7 @@ testidl.c: libxl_types.idl gentest.py libxl.h
 all: $(CLIENTS) libxenlight.so libxenlight.a libxlutil.so libxlutil.a \
 	$(AUTOSRCS) $(AUTOINCS)
 
-$(LIBXLU_OBJS): $(AUTOINCS)
+$(LIBXL_OBJS) $(LIBXLU_OBJS) $(XL_OBJS): $(AUTOINCS)
 
 %.c %.h: %.y
 	@rm -f $*.[ch]
@@ -81,6 +81,10 @@ _libxl_paths.h: genpath
 	rm -f $@.tmp
 	$(call move-if-changed,$@.2.tmp,$@)
 
+_libxl_list.h: bsd-sys-queue-h-seddery external/bsd-sys-queue.h
+	perl ./$^ --prefix=libxl >$@.new
+	$(call move-if-changed,$@.new,$@)
+
 libxl_paths.c: _libxl_paths.h
 
 libxl.h: _libxl_types.h
diff --git a/tools/libxl/bsd-sys-queue-h-seddery b/tools/libxl/bsd-sys-queue-h-seddery
new file mode 100755
index 0000000..c0aa079
--- /dev/null
+++ b/tools/libxl/bsd-sys-queue-h-seddery
@@ -0,0 +1,70 @@
+#!/usr/bin/perl -p
+#
+# This script is part of the Xen build system.  It has a very
+# permissive licence to avoid complicating the licence of the
+# generated header file and to allow this seddery to be reused by
+# other projects.
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this individual 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.
+#
+# Copyright (C) 2011 Citrix Ltd
+
+our $namespace, $ucnamespace;
+
+BEGIN {
+    die unless @ARGV;
+    $namespace = pop @ARGV;
+    $namespace =~ s/^--prefix=// or die;
+    $ucnamespace = uc $namespace;
+
+    print <<END or die $!;
+/*
+ * DO NOT EDIT THIS FILE
+ *
+ * Generated automatically by bsd-sys-queue-h-seddery to
+ *  - introduce ${ucnamespace}_ and ${namespace}_ namespace prefixes
+ *  - turn "struct type" into "type" so that type arguments
+ *     to the macros are type names not struct tags
+ *  - remove the reference to sys/cdefs.h, which is not needed
+ *
+ * The purpose of this seddery is to allow the resulting file to be
+ * freely included by software which might also want to include other
+ * list macros; to make it usable when struct tags are not being used
+ * or not known; to make it more portable.
+ */
+END
+}
+
+s/\b( _SYS_QUEUE |
+      SLIST | LIST | STAILQ | TAILQ | QUEUE
+      )/${ucnamespace}_$1/xg;
+
+s/\b( TRACEBUF | TRASHIT |
+      QMD_
+      )/${ucnamespace}__$1/xg;
+
+s/\b(
+      qm_
+      )/${namespace}__$1/xg;
+
+s/\b struct \s+ type \b/type/xg;
+
+s,^\#include.*sys/cdefs.*,/* $& */,xg;
diff --git a/tools/libxl/external/README b/tools/libxl/external/README
new file mode 100644
index 0000000..f3a3ac4
--- /dev/null
+++ b/tools/libxl/external/README
@@ -0,0 +1,13 @@
+WARNING - DO NOT EDIT THINGS IN THIS DIRECTORY (apart from this README)
+-----------------------------------------------------------------------
+
+These files were obtained elsewhere and should only be updated by
+copying new versions from the source location, as documented below:
+
+bsd-sys-queue.h
+bsd-queue.3
+
+  Obtained from the FreeBSD SVN using the following commands:
+    svn co -r 221843 svn://svn.freebsd.org/base/head/sys/sys/
+    svn co -r 221843 svn://svn.freebsd.org/base/head/share/man/man3
+
diff --git a/tools/libxl/external/bsd-queue.3 b/tools/libxl/external/bsd-queue.3
new file mode 100644
index 0000000..007ca5c
--- /dev/null
+++ b/tools/libxl/external/bsd-queue.3
@@ -0,0 +1,1044 @@
+.\" Copyright (c) 1993
+.\"	The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. All advertising materials mentioning features or use of this software
+.\"    must display the following acknowledgement:
+.\"	This product includes software developed by the University of
+.\"	California, Berkeley and its contributors.
+.\" 4. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"	@(#)queue.3	8.2 (Berkeley) 1/24/94
+.\" $FreeBSD$
+.\"
+.Dd May 13, 2011
+.Dt QUEUE 3
+.Os
+.Sh NAME
+.Nm SLIST_EMPTY ,
+.Nm SLIST_ENTRY ,
+.Nm SLIST_FIRST ,
+.Nm SLIST_FOREACH ,
+.Nm SLIST_FOREACH_SAFE ,
+.Nm SLIST_HEAD ,
+.Nm SLIST_HEAD_INITIALIZER ,
+.Nm SLIST_INIT ,
+.Nm SLIST_INSERT_AFTER ,
+.Nm SLIST_INSERT_HEAD ,
+.Nm SLIST_NEXT ,
+.Nm SLIST_REMOVE_AFTER ,
+.Nm SLIST_REMOVE_HEAD ,
+.Nm SLIST_REMOVE ,
+.Nm SLIST_SWAP ,
+.Nm STAILQ_CONCAT ,
+.Nm STAILQ_EMPTY ,
+.Nm STAILQ_ENTRY ,
+.Nm STAILQ_FIRST ,
+.Nm STAILQ_FOREACH ,
+.Nm STAILQ_FOREACH_SAFE ,
+.Nm STAILQ_HEAD ,
+.Nm STAILQ_HEAD_INITIALIZER ,
+.Nm STAILQ_INIT ,
+.Nm STAILQ_INSERT_AFTER ,
+.Nm STAILQ_INSERT_HEAD ,
+.Nm STAILQ_INSERT_TAIL ,
+.Nm STAILQ_LAST ,
+.Nm STAILQ_NEXT ,
+.Nm STAILQ_REMOVE_AFTER ,
+.Nm STAILQ_REMOVE_HEAD ,
+.Nm STAILQ_REMOVE ,
+.Nm STAILQ_SWAP ,
+.Nm LIST_EMPTY ,
+.Nm LIST_ENTRY ,
+.Nm LIST_FIRST ,
+.Nm LIST_FOREACH ,
+.Nm LIST_FOREACH_SAFE ,
+.Nm LIST_HEAD ,
+.Nm LIST_HEAD_INITIALIZER ,
+.Nm LIST_INIT ,
+.Nm LIST_INSERT_AFTER ,
+.Nm LIST_INSERT_BEFORE ,
+.Nm LIST_INSERT_HEAD ,
+.Nm LIST_NEXT ,
+.Nm LIST_REMOVE ,
+.Nm LIST_SWAP ,
+.Nm TAILQ_CONCAT ,
+.Nm TAILQ_EMPTY ,
+.Nm TAILQ_ENTRY ,
+.Nm TAILQ_FIRST ,
+.Nm TAILQ_FOREACH ,
+.Nm TAILQ_FOREACH_SAFE ,
+.Nm TAILQ_FOREACH_REVERSE ,
+.Nm TAILQ_FOREACH_REVERSE_SAFE ,
+.Nm TAILQ_HEAD ,
+.Nm TAILQ_HEAD_INITIALIZER ,
+.Nm TAILQ_INIT ,
+.Nm TAILQ_INSERT_AFTER ,
+.Nm TAILQ_INSERT_BEFORE ,
+.Nm TAILQ_INSERT_HEAD ,
+.Nm TAILQ_INSERT_TAIL ,
+.Nm TAILQ_LAST ,
+.Nm TAILQ_NEXT ,
+.Nm TAILQ_PREV ,
+.Nm TAILQ_REMOVE ,
+.Nm TAILQ_SWAP
+.Nd implementations of singly-linked lists, singly-linked tail queues,
+lists and tail queues
+.Sh SYNOPSIS
+.In sys/queue.h
+.\"
+.Fn SLIST_EMPTY "SLIST_HEAD *head"
+.Fn SLIST_ENTRY "TYPE"
+.Fn SLIST_FIRST "SLIST_HEAD *head"
+.Fn SLIST_FOREACH "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME"
+.Fn SLIST_FOREACH_SAFE "TYPE *var" "SLIST_HEAD *head" "SLIST_ENTRY NAME" "TYPE *temp_var"
+.Fn SLIST_HEAD "HEADNAME" "TYPE"
+.Fn SLIST_HEAD_INITIALIZER "SLIST_HEAD head"
+.Fn SLIST_INIT "SLIST_HEAD *head"
+.Fn SLIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_INSERT_HEAD "SLIST_HEAD *head" "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_NEXT "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_REMOVE_AFTER "TYPE *elm" "SLIST_ENTRY NAME"
+.Fn SLIST_REMOVE_HEAD "SLIST_HEAD *head" "SLIST_ENTRY NAME"
+.Fn SLIST_REMOVE "SLIST_HEAD *head" "TYPE *elm" "TYPE" "SLIST_ENTRY NAME"
+.Fn SLIST_SWAP "SLIST_HEAD *head1" "SLIST_HEAD *head2" "SLIST_ENTRY NAME"
+.\"
+.Fn STAILQ_CONCAT "STAILQ_HEAD *head1" "STAILQ_HEAD *head2"
+.Fn STAILQ_EMPTY "STAILQ_HEAD *head"
+.Fn STAILQ_ENTRY "TYPE"
+.Fn STAILQ_FIRST "STAILQ_HEAD *head"
+.Fn STAILQ_FOREACH "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
+.Fn STAILQ_FOREACH_SAFE "TYPE *var" "STAILQ_HEAD *head" "STAILQ_ENTRY NAME" "TYPE *temp_var"
+.Fn STAILQ_HEAD "HEADNAME" "TYPE"
+.Fn STAILQ_HEAD_INITIALIZER "STAILQ_HEAD head"
+.Fn STAILQ_INIT "STAILQ_HEAD *head"
+.Fn STAILQ_INSERT_AFTER "STAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_INSERT_HEAD "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_INSERT_TAIL "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_LAST "STAILQ_HEAD *head" "TYPE" "STAILQ_ENTRY NAME"
+.Fn STAILQ_NEXT "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_REMOVE_AFTER "STAILQ_HEAD *head" "TYPE *elm" "STAILQ_ENTRY NAME"
+.Fn STAILQ_REMOVE_HEAD "STAILQ_HEAD *head" "STAILQ_ENTRY NAME"
+.Fn STAILQ_REMOVE "STAILQ_HEAD *head" "TYPE *elm" "TYPE" "STAILQ_ENTRY NAME"
+.Fn STAILQ_SWAP "STAILQ_HEAD *head1" "STAILQ_HEAD *head2" "STAILQ_ENTRY NAME"
+.\"
+.Fn LIST_EMPTY "LIST_HEAD *head"
+.Fn LIST_ENTRY "TYPE"
+.Fn LIST_FIRST "LIST_HEAD *head"
+.Fn LIST_FOREACH "TYPE *var" "LIST_HEAD *head" "LIST_ENTRY NAME"
+.Fn LIST_FOREACH_SAFE "TYPE *var" "LIST_HEAD *head" "LIST_ENTRY NAME" "TYPE *temp_var"
+.Fn LIST_HEAD "HEADNAME" "TYPE"
+.Fn LIST_HEAD_INITIALIZER "LIST_HEAD head"
+.Fn LIST_INIT "LIST_HEAD *head"
+.Fn LIST_INSERT_AFTER "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_INSERT_HEAD "LIST_HEAD *head" "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_NEXT "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_REMOVE "TYPE *elm" "LIST_ENTRY NAME"
+.Fn LIST_SWAP "LIST_HEAD *head1" "LIST_HEAD *head2" "TYPE" "LIST_ENTRY NAME"
+.\"
+.Fn TAILQ_CONCAT "TAILQ_HEAD *head1" "TAILQ_HEAD *head2" "TAILQ_ENTRY NAME"
+.Fn TAILQ_EMPTY "TAILQ_HEAD *head"
+.Fn TAILQ_ENTRY "TYPE"
+.Fn TAILQ_FIRST "TAILQ_HEAD *head"
+.Fn TAILQ_FOREACH "TYPE *var" "TAILQ_HEAD *head" "TAILQ_ENTRY NAME"
+.Fn TAILQ_FOREACH_SAFE "TYPE *var" "TAILQ_HEAD *head" "TAILQ_ENTRY NAME" "TYPE *temp_var"
+.Fn TAILQ_FOREACH_REVERSE "TYPE *var" "TAILQ_HEAD *head" "HEADNAME" "TAILQ_ENTRY NAME"
+.Fn TAILQ_FOREACH_REVERSE_SAFE "TYPE *var" "TAILQ_HEAD *head" "HEADNAME" "TAILQ_ENTRY NAME" "TYPE *temp_var"
+.Fn TAILQ_HEAD "HEADNAME" "TYPE"
+.Fn TAILQ_HEAD_INITIALIZER "TAILQ_HEAD head"
+.Fn TAILQ_INIT "TAILQ_HEAD *head"
+.Fn TAILQ_INSERT_AFTER "TAILQ_HEAD *head" "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_INSERT_BEFORE "TYPE *listelm" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_INSERT_HEAD "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_INSERT_TAIL "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_LAST "TAILQ_HEAD *head" "HEADNAME"
+.Fn TAILQ_NEXT "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_PREV "TYPE *elm" "HEADNAME" "TAILQ_ENTRY NAME"
+.Fn TAILQ_REMOVE "TAILQ_HEAD *head" "TYPE *elm" "TAILQ_ENTRY NAME"
+.Fn TAILQ_SWAP "TAILQ_HEAD *head1" "TAILQ_HEAD *head2" "TYPE" "TAILQ_ENTRY NAME"
+.\"
+.Sh DESCRIPTION
+These macros define and operate on four types of data structures:
+singly-linked lists, singly-linked tail queues, lists, and tail queues.
+All four structures support the following functionality:
+.Bl -enum -compact -offset indent
+.It
+Insertion of a new entry at the head of the list.
+.It
+Insertion of a new entry after any element in the list.
+.It
+O(1) removal of an entry from the head of the list.
+.It
+Forward traversal through the list.
+.It
+Swawpping the contents of two lists.
+.El
+.Pp
+Singly-linked lists are the simplest of the four data structures
+and support only the above functionality.
+Singly-linked lists are ideal for applications with large datasets
+and few or no removals,
+or for implementing a LIFO queue.
+Singly-linked lists add the following functionality:
+.Bl -enum -compact -offset indent
+.It
+O(n) removal of any entry in the list.
+.El
+.Pp
+Singly-linked tail queues add the following functionality:
+.Bl -enum -compact -offset indent
+.It
+Entries can be added at the end of a list.
+.It
+O(n) removal of any entry in the list.
+.It
+They may be concatenated.
+.El
+However:
+.Bl -enum -compact -offset indent
+.It
+All list insertions must specify the head of the list.
+.It
+Each head entry requires two pointers rather than one.
+.It
+Code size is about 15% greater and operations run about 20% slower
+than singly-linked lists.
+.El
+.Pp
+Singly-linked tailqs are ideal for applications with large datasets and
+few or no removals,
+or for implementing a FIFO queue.
+.Pp
+All doubly linked types of data structures (lists and tail queues)
+additionally allow:
+.Bl -enum -compact -offset indent
+.It
+Insertion of a new entry before any element in the list.
+.It
+O(1) removal of any entry in the list.
+.El
+However:
+.Bl -enum -compact -offset indent
+.It
+Each element requires two pointers rather than one.
+.It
+Code size and execution time of operations (except for removal) is about
+twice that of the singly-linked data-structures.
+.El
+.Pp
+Linked lists are the simplest of the doubly linked data structures and support
+only the above functionality over singly-linked lists.
+.Pp
+Tail queues add the following functionality:
+.Bl -enum -compact -offset indent
+.It
+Entries can be added at the end of a list.
+.It
+They may be traversed backwards, from tail to head.
+.It
+They may be concatenated.
+.El
+However:
+.Bl -enum -compact -offset indent
+.It
+All list insertions and removals must specify the head of the list.
+.It
+Each head entry requires two pointers rather than one.
+.It
+Code size is about 15% greater and operations run about 20% slower
+than singly-linked lists.
+.El
+.Pp
+In the macro definitions,
+.Fa TYPE
+is the name of a user defined structure,
+that must contain a field of type
+.Li SLIST_ENTRY ,
+.Li STAILQ_ENTRY ,
+.Li LIST_ENTRY ,
+or
+.Li TAILQ_ENTRY ,
+named
+.Fa NAME .
+The argument
+.Fa HEADNAME
+is the name of a user defined structure that must be declared
+using the macros
+.Li SLIST_HEAD ,
+.Li STAILQ_HEAD ,
+.Li LIST_HEAD ,
+or
+.Li TAILQ_HEAD .
+See the examples below for further explanation of how these
+macros are used.
+.Sh SINGLY-LINKED LISTS
+A singly-linked list is headed by a structure defined by the
+.Nm SLIST_HEAD
+macro.
+This structure contains a single pointer to the first element
+on the list.
+The elements are singly linked for minimum space and pointer manipulation
+overhead at the expense of O(n) removal for arbitrary elements.
+New elements can be added to the list after an existing element or
+at the head of the list.
+An
+.Fa SLIST_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+SLIST_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Fa HEADNAME
+is the name of the structure to be defined, and
+.Fa TYPE
+is the type of the elements to be linked into the list.
+A pointer to the head of the list can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm SLIST_HEAD_INITIALIZER
+evaluates to an initializer for the list
+.Fa head .
+.Pp
+The macro
+.Nm SLIST_EMPTY
+evaluates to true if there are no elements in the list.
+.Pp
+The macro
+.Nm SLIST_ENTRY
+declares a structure that connects the elements in
+the list.
+.Pp
+The macro
+.Nm SLIST_FIRST
+returns the first element in the list or NULL if the list is empty.
+.Pp
+The macro
+.Nm SLIST_FOREACH
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in
+turn to
+.Fa var .
+.Pp
+The macro
+.Nm SLIST_FOREACH_SAFE
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in
+turn to
+.Fa var .
+However, unlike
+.Fn SLIST_FOREACH
+here it is permitted to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm SLIST_INIT
+initializes the list referenced by
+.Fa head .
+.Pp
+The macro
+.Nm SLIST_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the list.
+.Pp
+The macro
+.Nm SLIST_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm SLIST_NEXT
+returns the next element in the list.
+.Pp
+The macro
+.Nm SLIST_REMOVE_AFTER
+removes the element after
+.Fa elm
+from the list. Unlike
+.Fa SLIST_REMOVE ,
+this macro does not traverse the entire list.
+.Pp
+The macro
+.Nm SLIST_REMOVE_HEAD
+removes the element
+.Fa elm
+from the head of the list.
+For optimum efficiency,
+elements being removed from the head of the list should explicitly use
+this macro instead of the generic
+.Fa SLIST_REMOVE
+macro.
+.Pp
+The macro
+.Nm SLIST_REMOVE
+removes the element
+.Fa elm
+from the list.
+.Pp
+The macro
+.Nm SLIST_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh SINGLY-LINKED LIST EXAMPLE
+.Bd -literal
+SLIST_HEAD(slisthead, entry) head =
+    SLIST_HEAD_INITIALIZER(head);
+struct slisthead *headp;		/* Singly-linked List head. */
+struct entry {
+	...
+	SLIST_ENTRY(entry) entries;	/* Singly-linked List. */
+	...
+} *n1, *n2, *n3, *np;
+
+SLIST_INIT(&head);			/* Initialize the list. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+SLIST_INSERT_HEAD(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+SLIST_INSERT_AFTER(n1, n2, entries);
+
+SLIST_REMOVE(&head, n2, entry, entries);/* Deletion. */
+free(n2);
+
+n3 = SLIST_FIRST(&head);
+SLIST_REMOVE_HEAD(&head, entries);	/* Deletion from the head. */
+free(n3);
+					/* Forward traversal. */
+SLIST_FOREACH(np, &head, entries)
+	np-> ...
+					/* Safe forward traversal. */
+SLIST_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	SLIST_REMOVE(&head, np, entry, entries);
+	free(np);
+}
+
+while (!SLIST_EMPTY(&head)) {		/* List Deletion. */
+	n1 = SLIST_FIRST(&head);
+	SLIST_REMOVE_HEAD(&head, entries);
+	free(n1);
+}
+.Ed
+.Sh SINGLY-LINKED TAIL QUEUES
+A singly-linked tail queue is headed by a structure defined by the
+.Nm STAILQ_HEAD
+macro.
+This structure contains a pair of pointers,
+one to the first element in the tail queue and the other to
+the last element in the tail queue.
+The elements are singly linked for minimum space and pointer
+manipulation overhead at the expense of O(n) removal for arbitrary
+elements.
+New elements can be added to the tail queue after an existing element,
+at the head of the tail queue, or at the end of the tail queue.
+A
+.Fa STAILQ_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+STAILQ_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Li HEADNAME
+is the name of the structure to be defined, and
+.Li TYPE
+is the type of the elements to be linked into the tail queue.
+A pointer to the head of the tail queue can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm STAILQ_HEAD_INITIALIZER
+evaluates to an initializer for the tail queue
+.Fa head .
+.Pp
+The macro
+.Nm STAILQ_CONCAT
+concatenates the tail queue headed by
+.Fa head2
+onto the end of the one headed by
+.Fa head1
+removing all entries from the former.
+.Pp
+The macro
+.Nm STAILQ_EMPTY
+evaluates to true if there are no items on the tail queue.
+.Pp
+The macro
+.Nm STAILQ_ENTRY
+declares a structure that connects the elements in
+the tail queue.
+.Pp
+The macro
+.Nm STAILQ_FIRST
+returns the first item on the tail queue or NULL if the tail queue
+is empty.
+.Pp
+The macro
+.Nm STAILQ_FOREACH
+traverses the tail queue referenced by
+.Fa head
+in the forward direction, assigning each element
+in turn to
+.Fa var .
+.Pp
+The macro
+.Nm STAILQ_FOREACH_SAFE
+traverses the tail queue referenced by
+.Fa head
+in the forward direction, assigning each element
+in turn to
+.Fa var .
+However, unlike
+.Fn STAILQ_FOREACH
+here it is permitted to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm STAILQ_INIT
+initializes the tail queue referenced by
+.Fa head .
+.Pp
+The macro
+.Nm STAILQ_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the tail queue.
+.Pp
+The macro
+.Nm STAILQ_INSERT_TAIL
+inserts the new element
+.Fa elm
+at the end of the tail queue.
+.Pp
+The macro
+.Nm STAILQ_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm STAILQ_LAST
+returns the last item on the tail queue.
+If the tail queue is empty the return value is
+.Dv NULL .
+.Pp
+The macro
+.Nm STAILQ_NEXT
+returns the next item on the tail queue, or NULL this item is the last.
+.Pp
+The macro
+.Nm STAILQ_REMOVE_AFTER
+removes the element after
+.Fa elm
+from the tail queue. Unlike
+.Fa STAILQ_REMOVE ,
+this macro does not traverse the entire tail queue.
+.Pp
+The macro
+.Nm STAILQ_REMOVE_HEAD
+removes the element at the head of the tail queue.
+For optimum efficiency,
+elements being removed from the head of the tail queue should
+use this macro explicitly rather than the generic
+.Fa STAILQ_REMOVE
+macro.
+.Pp
+The macro
+.Nm STAILQ_REMOVE
+removes the element
+.Fa elm
+from the tail queue.
+.Pp
+The macro
+.Nm STAILQ_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh SINGLY-LINKED TAIL QUEUE EXAMPLE
+.Bd -literal
+STAILQ_HEAD(stailhead, entry) head =
+    STAILQ_HEAD_INITIALIZER(head);
+struct stailhead *headp;		/* Singly-linked tail queue head. */
+struct entry {
+	...
+	STAILQ_ENTRY(entry) entries;	/* Tail queue. */
+	...
+} *n1, *n2, *n3, *np;
+
+STAILQ_INIT(&head);			/* Initialize the queue. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+STAILQ_INSERT_HEAD(&head, n1, entries);
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the tail. */
+STAILQ_INSERT_TAIL(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+STAILQ_INSERT_AFTER(&head, n1, n2, entries);
+					/* Deletion. */
+STAILQ_REMOVE(&head, n2, entry, entries);
+free(n2);
+					/* Deletion from the head. */
+n3 = STAILQ_FIRST(&head);
+STAILQ_REMOVE_HEAD(&head, entries);
+free(n3);
+					/* Forward traversal. */
+STAILQ_FOREACH(np, &head, entries)
+	np-> ...
+					/* Safe forward traversal. */
+STAILQ_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	STAILQ_REMOVE(&head, np, entry, entries);
+	free(np);
+}
+					/* TailQ Deletion. */
+while (!STAILQ_EMPTY(&head)) {
+	n1 = STAILQ_FIRST(&head);
+	STAILQ_REMOVE_HEAD(&head, entries);
+	free(n1);
+}
+					/* Faster TailQ Deletion. */
+n1 = STAILQ_FIRST(&head);
+while (n1 != NULL) {
+	n2 = STAILQ_NEXT(n1, entries);
+	free(n1);
+	n1 = n2;
+}
+STAILQ_INIT(&head);
+.Ed
+.Sh LISTS
+A list is headed by a structure defined by the
+.Nm LIST_HEAD
+macro.
+This structure contains a single pointer to the first element
+on the list.
+The elements are doubly linked so that an arbitrary element can be
+removed without traversing the list.
+New elements can be added to the list after an existing element,
+before an existing element, or at the head of the list.
+A
+.Fa LIST_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+LIST_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Fa HEADNAME
+is the name of the structure to be defined, and
+.Fa TYPE
+is the type of the elements to be linked into the list.
+A pointer to the head of the list can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm LIST_HEAD_INITIALIZER
+evaluates to an initializer for the list
+.Fa head .
+.Pp
+The macro
+.Nm LIST_EMPTY
+evaluates to true if there are no elements in the list.
+.Pp
+The macro
+.Nm LIST_ENTRY
+declares a structure that connects the elements in
+the list.
+.Pp
+The macro
+.Nm LIST_FIRST
+returns the first element in the list or NULL if the list
+is empty.
+.Pp
+The macro
+.Nm LIST_FOREACH
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in turn to
+.Fa var .
+.Pp
+The macro
+.Nm LIST_FOREACH_SAFE
+traverses the list referenced by
+.Fa head
+in the forward direction, assigning each element in turn to
+.Fa var .
+However, unlike
+.Fn LIST_FOREACH
+here it is permitted to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm LIST_INIT
+initializes the list referenced by
+.Fa head .
+.Pp
+The macro
+.Nm LIST_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the list.
+.Pp
+The macro
+.Nm LIST_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm LIST_INSERT_BEFORE
+inserts the new element
+.Fa elm
+before the element
+.Fa listelm .
+.Pp
+The macro
+.Nm LIST_NEXT
+returns the next element in the list, or NULL if this is the last.
+.Pp
+The macro
+.Nm LIST_REMOVE
+removes the element
+.Fa elm
+from the list.
+.Pp
+The macro
+.Nm LIST_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh LIST EXAMPLE
+.Bd -literal
+LIST_HEAD(listhead, entry) head =
+    LIST_HEAD_INITIALIZER(head);
+struct listhead *headp;			/* List head. */
+struct entry {
+	...
+	LIST_ENTRY(entry) entries;	/* List. */
+	...
+} *n1, *n2, *n3, *np, *np_temp;
+
+LIST_INIT(&head);			/* Initialize the list. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+LIST_INSERT_HEAD(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+LIST_INSERT_AFTER(n1, n2, entries);
+
+n3 = malloc(sizeof(struct entry));	/* Insert before. */
+LIST_INSERT_BEFORE(n2, n3, entries);
+
+LIST_REMOVE(n2, entries);		/* Deletion. */
+free(n2);
+					/* Forward traversal. */
+LIST_FOREACH(np, &head, entries)
+	np-> ...
+
+					/* Safe forward traversal. */
+LIST_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	LIST_REMOVE(np, entries);
+	free(np);
+}
+
+while (!LIST_EMPTY(&head)) {		/* List Deletion. */
+	n1 = LIST_FIRST(&head);
+	LIST_REMOVE(n1, entries);
+	free(n1);
+}
+
+n1 = LIST_FIRST(&head);			/* Faster List Deletion. */
+while (n1 != NULL) {
+	n2 = LIST_NEXT(n1, entries);
+	free(n1);
+	n1 = n2;
+}
+LIST_INIT(&head);
+.Ed
+.Sh TAIL QUEUES
+A tail queue is headed by a structure defined by the
+.Nm TAILQ_HEAD
+macro.
+This structure contains a pair of pointers,
+one to the first element in the tail queue and the other to
+the last element in the tail queue.
+The elements are doubly linked so that an arbitrary element can be
+removed without traversing the tail queue.
+New elements can be added to the tail queue after an existing element,
+before an existing element, at the head of the tail queue,
+or at the end of the tail queue.
+A
+.Fa TAILQ_HEAD
+structure is declared as follows:
+.Bd -literal -offset indent
+TAILQ_HEAD(HEADNAME, TYPE) head;
+.Ed
+.Pp
+where
+.Li HEADNAME
+is the name of the structure to be defined, and
+.Li TYPE
+is the type of the elements to be linked into the tail queue.
+A pointer to the head of the tail queue can later be declared as:
+.Bd -literal -offset indent
+struct HEADNAME *headp;
+.Ed
+.Pp
+(The names
+.Li head
+and
+.Li headp
+are user selectable.)
+.Pp
+The macro
+.Nm TAILQ_HEAD_INITIALIZER
+evaluates to an initializer for the tail queue
+.Fa head .
+.Pp
+The macro
+.Nm TAILQ_CONCAT
+concatenates the tail queue headed by
+.Fa head2
+onto the end of the one headed by
+.Fa head1
+removing all entries from the former.
+.Pp
+The macro
+.Nm TAILQ_EMPTY
+evaluates to true if there are no items on the tail queue.
+.Pp
+The macro
+.Nm TAILQ_ENTRY
+declares a structure that connects the elements in
+the tail queue.
+.Pp
+The macro
+.Nm TAILQ_FIRST
+returns the first item on the tail queue or NULL if the tail queue
+is empty.
+.Pp
+The macro
+.Nm TAILQ_FOREACH
+traverses the tail queue referenced by
+.Fa head
+in the forward direction, assigning each element in turn to
+.Fa var .
+.Fa var
+is set to
+.Dv NULL
+if the loop completes normally, or if there were no elements.
+.Pp
+The macro
+.Nm TAILQ_FOREACH_REVERSE
+traverses the tail queue referenced by
+.Fa head
+in the reverse direction, assigning each element in turn to
+.Fa var .
+.Pp
+The macros
+.Nm TAILQ_FOREACH_SAFE
+and
+.Nm TAILQ_FOREACH_REVERSE_SAFE
+traverse the list referenced by
+.Fa head
+in the forward or reverse direction respectively,
+assigning each element in turn to
+.Fa var .
+However, unlike their unsafe counterparts,
+.Nm TAILQ_FOREACH
+and
+.Nm TAILQ_FOREACH_REVERSE
+permit to both remove
+.Fa var
+as well as free it from within the loop safely without interfering with the
+traversal.
+.Pp
+The macro
+.Nm TAILQ_INIT
+initializes the tail queue referenced by
+.Fa head .
+.Pp
+The macro
+.Nm TAILQ_INSERT_HEAD
+inserts the new element
+.Fa elm
+at the head of the tail queue.
+.Pp
+The macro
+.Nm TAILQ_INSERT_TAIL
+inserts the new element
+.Fa elm
+at the end of the tail queue.
+.Pp
+The macro
+.Nm TAILQ_INSERT_AFTER
+inserts the new element
+.Fa elm
+after the element
+.Fa listelm .
+.Pp
+The macro
+.Nm TAILQ_INSERT_BEFORE
+inserts the new element
+.Fa elm
+before the element
+.Fa listelm .
+.Pp
+The macro
+.Nm TAILQ_LAST
+returns the last item on the tail queue.
+If the tail queue is empty the return value is
+.Dv NULL .
+.Pp
+The macro
+.Nm TAILQ_NEXT
+returns the next item on the tail queue, or NULL if this item is the last.
+.Pp
+The macro
+.Nm TAILQ_PREV
+returns the previous item on the tail queue, or NULL if this item
+is the first.
+.Pp
+The macro
+.Nm TAILQ_REMOVE
+removes the element
+.Fa elm
+from the tail queue.
+.Pp
+The macro
+.Nm TAILQ_SWAP
+swaps the contents of
+.Fa head1
+and
+.Fa head2 .
+.Sh TAIL QUEUE EXAMPLE
+.Bd -literal
+TAILQ_HEAD(tailhead, entry) head =
+    TAILQ_HEAD_INITIALIZER(head);
+struct tailhead *headp;			/* Tail queue head. */
+struct entry {
+	...
+	TAILQ_ENTRY(entry) entries;	/* Tail queue. */
+	...
+} *n1, *n2, *n3, *np;
+
+TAILQ_INIT(&head);			/* Initialize the queue. */
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the head. */
+TAILQ_INSERT_HEAD(&head, n1, entries);
+
+n1 = malloc(sizeof(struct entry));	/* Insert at the tail. */
+TAILQ_INSERT_TAIL(&head, n1, entries);
+
+n2 = malloc(sizeof(struct entry));	/* Insert after. */
+TAILQ_INSERT_AFTER(&head, n1, n2, entries);
+
+n3 = malloc(sizeof(struct entry));	/* Insert before. */
+TAILQ_INSERT_BEFORE(n2, n3, entries);
+
+TAILQ_REMOVE(&head, n2, entries);	/* Deletion. */
+free(n2);
+					/* Forward traversal. */
+TAILQ_FOREACH(np, &head, entries)
+	np-> ...
+					/* Safe forward traversal. */
+TAILQ_FOREACH_SAFE(np, &head, entries, np_temp) {
+	np->do_stuff();
+	...
+	TAILQ_REMOVE(&head, np, entries);
+	free(np);
+}
+					/* Reverse traversal. */
+TAILQ_FOREACH_REVERSE(np, &head, tailhead, entries)
+	np-> ...
+					/* TailQ Deletion. */
+while (!TAILQ_EMPTY(&head)) {
+	n1 = TAILQ_FIRST(&head);
+	TAILQ_REMOVE(&head, n1, entries);
+	free(n1);
+}
+					/* Faster TailQ Deletion. */
+n1 = TAILQ_FIRST(&head);
+while (n1 != NULL) {
+	n2 = TAILQ_NEXT(n1, entries);
+	free(n1);
+	n1 = n2;
+}
+TAILQ_INIT(&head);
+.Ed
+.Sh SEE ALSO
+.Xr tree 3
+.Sh HISTORY
+The
+.Nm queue
+functions first appeared in
+.Bx 4.4 .
diff --git a/tools/libxl/external/bsd-sys-queue.h b/tools/libxl/external/bsd-sys-queue.h
new file mode 100644
index 0000000..274e636
--- /dev/null
+++ b/tools/libxl/external/bsd-sys-queue.h
@@ -0,0 +1,637 @@
+/*-
+ * Copyright (c) 1991, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)queue.h	8.5 (Berkeley) 8/20/94
+ * $FreeBSD$
+ */
+
+#ifndef _SYS_QUEUE_H_
+#define	_SYS_QUEUE_H_
+
+#include <sys/cdefs.h>
+
+/*
+ * This file defines four types of data structures: singly-linked lists,
+ * singly-linked tail queues, lists and tail queues.
+ *
+ * A singly-linked list is headed by a single forward pointer. The elements
+ * are singly linked for minimum space and pointer manipulation overhead at
+ * the expense of O(n) removal for arbitrary elements. New elements can be
+ * added to the list after an existing element or at the head of the list.
+ * Elements being removed from the head of the list should use the explicit
+ * macro for this purpose for optimum efficiency. A singly-linked list may
+ * only be traversed in the forward direction.  Singly-linked lists are ideal
+ * for applications with large datasets and few or no removals or for
+ * implementing a LIFO queue.
+ *
+ * A singly-linked tail queue is headed by a pair of pointers, one to the
+ * head of the list and the other to the tail of the list. The elements are
+ * singly linked for minimum space and pointer manipulation overhead at the
+ * expense of O(n) removal for arbitrary elements. New elements can be added
+ * to the list after an existing element, at the head of the list, or at the
+ * end of the list. Elements being removed from the head of the tail queue
+ * should use the explicit macro for this purpose for optimum efficiency.
+ * A singly-linked tail queue may only be traversed in the forward direction.
+ * Singly-linked tail queues are ideal for applications with large datasets
+ * and few or no removals or for implementing a FIFO queue.
+ *
+ * A list is headed by a single forward pointer (or an array of forward
+ * pointers for a hash table header). The elements are doubly linked
+ * so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before
+ * or after an existing element or at the head of the list. A list
+ * may only be traversed in the forward direction.
+ *
+ * A tail queue is headed by a pair of pointers, one to the head of the
+ * list and the other to the tail of the list. The elements are doubly
+ * linked so that an arbitrary element can be removed without a need to
+ * traverse the list. New elements can be added to the list before or
+ * after an existing element, at the head of the list, or at the end of
+ * the list. A tail queue may be traversed in either direction.
+ *
+ * For details on the use of these macros, see the queue(3) manual page.
+ *
+ *
+ *				SLIST	LIST	STAILQ	TAILQ
+ * _HEAD			+	+	+	+
+ * _HEAD_INITIALIZER		+	+	+	+
+ * _ENTRY			+	+	+	+
+ * _INIT			+	+	+	+
+ * _EMPTY			+	+	+	+
+ * _FIRST			+	+	+	+
+ * _NEXT			+	+	+	+
+ * _PREV			-	-	-	+
+ * _LAST			-	-	+	+
+ * _FOREACH			+	+	+	+
+ * _FOREACH_SAFE		+	+	+	+
+ * _FOREACH_REVERSE		-	-	-	+
+ * _FOREACH_REVERSE_SAFE	-	-	-	+
+ * _INSERT_HEAD			+	+	+	+
+ * _INSERT_BEFORE		-	+	-	+
+ * _INSERT_AFTER		+	+	+	+
+ * _INSERT_TAIL			-	-	+	+
+ * _CONCAT			-	-	+	+
+ * _REMOVE_AFTER		+	-	+	-
+ * _REMOVE_HEAD			+	-	+	-
+ * _REMOVE			+	+	+	+
+ * _SWAP			+	+	+	+
+ *
+ */
+#ifdef QUEUE_MACRO_DEBUG
+/* Store the last 2 places the queue element or head was altered */
+struct qm_trace {
+	char * lastfile;
+	int lastline;
+	char * prevfile;
+	int prevline;
+};
+
+#define	TRACEBUF	struct qm_trace trace;
+#define	TRASHIT(x)	do {(x) = (void *)-1;} while (0)
+#define	QMD_SAVELINK(name, link)	void **name = (void *)&(link)
+
+#define	QMD_TRACE_HEAD(head) do {					\
+	(head)->trace.prevline = (head)->trace.lastline;		\
+	(head)->trace.prevfile = (head)->trace.lastfile;		\
+	(head)->trace.lastline = __LINE__;				\
+	(head)->trace.lastfile = __FILE__;				\
+} while (0)
+
+#define	QMD_TRACE_ELEM(elem) do {					\
+	(elem)->trace.prevline = (elem)->trace.lastline;		\
+	(elem)->trace.prevfile = (elem)->trace.lastfile;		\
+	(elem)->trace.lastline = __LINE__;				\
+	(elem)->trace.lastfile = __FILE__;				\
+} while (0)
+
+#else
+#define	QMD_TRACE_ELEM(elem)
+#define	QMD_TRACE_HEAD(head)
+#define	QMD_SAVELINK(name, link)
+#define	TRACEBUF
+#define	TRASHIT(x)
+#endif	/* QUEUE_MACRO_DEBUG */
+
+/*
+ * Singly-linked List declarations.
+ */
+#define	SLIST_HEAD(name, type)						\
+struct name {								\
+	struct type *slh_first;	/* first element */			\
+}
+
+#define	SLIST_HEAD_INITIALIZER(head)					\
+	{ NULL }
+
+#define	SLIST_ENTRY(type)						\
+struct {								\
+	struct type *sle_next;	/* next element */			\
+}
+
+/*
+ * Singly-linked List functions.
+ */
+#define	SLIST_EMPTY(head)	((head)->slh_first == NULL)
+
+#define	SLIST_FIRST(head)	((head)->slh_first)
+
+#define	SLIST_FOREACH(var, head, field)					\
+	for ((var) = SLIST_FIRST((head));				\
+	    (var);							\
+	    (var) = SLIST_NEXT((var), field))
+
+#define	SLIST_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = SLIST_FIRST((head));				\
+	    (var) && ((tvar) = SLIST_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	SLIST_FOREACH_PREVPTR(var, varp, head, field)			\
+	for ((varp) = &SLIST_FIRST((head));				\
+	    ((var) = *(varp)) != NULL;					\
+	    (varp) = &SLIST_NEXT((var), field))
+
+#define	SLIST_INIT(head) do {						\
+	SLIST_FIRST((head)) = NULL;					\
+} while (0)
+
+#define	SLIST_INSERT_AFTER(slistelm, elm, field) do {			\
+	SLIST_NEXT((elm), field) = SLIST_NEXT((slistelm), field);	\
+	SLIST_NEXT((slistelm), field) = (elm);				\
+} while (0)
+
+#define	SLIST_INSERT_HEAD(head, elm, field) do {			\
+	SLIST_NEXT((elm), field) = SLIST_FIRST((head));			\
+	SLIST_FIRST((head)) = (elm);					\
+} while (0)
+
+#define	SLIST_NEXT(elm, field)	((elm)->field.sle_next)
+
+#define	SLIST_REMOVE(head, elm, type, field) do {			\
+	QMD_SAVELINK(oldnext, (elm)->field.sle_next);			\
+	if (SLIST_FIRST((head)) == (elm)) {				\
+		SLIST_REMOVE_HEAD((head), field);			\
+	}								\
+	else {								\
+		struct type *curelm = SLIST_FIRST((head));		\
+		while (SLIST_NEXT(curelm, field) != (elm))		\
+			curelm = SLIST_NEXT(curelm, field);		\
+		SLIST_REMOVE_AFTER(curelm, field);			\
+	}								\
+	TRASHIT(*oldnext);						\
+} while (0)
+
+#define SLIST_REMOVE_AFTER(elm, field) do {				\
+	SLIST_NEXT(elm, field) =					\
+	    SLIST_NEXT(SLIST_NEXT(elm, field), field);			\
+} while (0)
+
+#define	SLIST_REMOVE_HEAD(head, field) do {				\
+	SLIST_FIRST((head)) = SLIST_NEXT(SLIST_FIRST((head)), field);	\
+} while (0)
+
+#define SLIST_SWAP(head1, head2, type) do {				\
+	struct type *swap_first = SLIST_FIRST(head1);			\
+	SLIST_FIRST(head1) = SLIST_FIRST(head2);			\
+	SLIST_FIRST(head2) = swap_first;				\
+} while (0)
+
+/*
+ * Singly-linked Tail queue declarations.
+ */
+#define	STAILQ_HEAD(name, type)						\
+struct name {								\
+	struct type *stqh_first;/* first element */			\
+	struct type **stqh_last;/* addr of last next element */		\
+}
+
+#define	STAILQ_HEAD_INITIALIZER(head)					\
+	{ NULL, &(head).stqh_first }
+
+#define	STAILQ_ENTRY(type)						\
+struct {								\
+	struct type *stqe_next;	/* next element */			\
+}
+
+/*
+ * Singly-linked Tail queue functions.
+ */
+#define	STAILQ_CONCAT(head1, head2) do {				\
+	if (!STAILQ_EMPTY((head2))) {					\
+		*(head1)->stqh_last = (head2)->stqh_first;		\
+		(head1)->stqh_last = (head2)->stqh_last;		\
+		STAILQ_INIT((head2));					\
+	}								\
+} while (0)
+
+#define	STAILQ_EMPTY(head)	((head)->stqh_first == NULL)
+
+#define	STAILQ_FIRST(head)	((head)->stqh_first)
+
+#define	STAILQ_FOREACH(var, head, field)				\
+	for((var) = STAILQ_FIRST((head));				\
+	   (var);							\
+	   (var) = STAILQ_NEXT((var), field))
+
+
+#define	STAILQ_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = STAILQ_FIRST((head));				\
+	    (var) && ((tvar) = STAILQ_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	STAILQ_INIT(head) do {						\
+	STAILQ_FIRST((head)) = NULL;					\
+	(head)->stqh_last = &STAILQ_FIRST((head));			\
+} while (0)
+
+#define	STAILQ_INSERT_AFTER(head, tqelm, elm, field) do {		\
+	if ((STAILQ_NEXT((elm), field) = STAILQ_NEXT((tqelm), field)) == NULL)\
+		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
+	STAILQ_NEXT((tqelm), field) = (elm);				\
+} while (0)
+
+#define	STAILQ_INSERT_HEAD(head, elm, field) do {			\
+	if ((STAILQ_NEXT((elm), field) = STAILQ_FIRST((head))) == NULL)	\
+		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
+	STAILQ_FIRST((head)) = (elm);					\
+} while (0)
+
+#define	STAILQ_INSERT_TAIL(head, elm, field) do {			\
+	STAILQ_NEXT((elm), field) = NULL;				\
+	*(head)->stqh_last = (elm);					\
+	(head)->stqh_last = &STAILQ_NEXT((elm), field);			\
+} while (0)
+
+#define	STAILQ_LAST(head, type, field)					\
+	(STAILQ_EMPTY((head)) ?						\
+		NULL :							\
+	        ((struct type *)(void *)				\
+		((char *)((head)->stqh_last) - __offsetof(struct type, field))))
+
+#define	STAILQ_NEXT(elm, field)	((elm)->field.stqe_next)
+
+#define	STAILQ_REMOVE(head, elm, type, field) do {			\
+	QMD_SAVELINK(oldnext, (elm)->field.stqe_next);			\
+	if (STAILQ_FIRST((head)) == (elm)) {				\
+		STAILQ_REMOVE_HEAD((head), field);			\
+	}								\
+	else {								\
+		struct type *curelm = STAILQ_FIRST((head));		\
+		while (STAILQ_NEXT(curelm, field) != (elm))		\
+			curelm = STAILQ_NEXT(curelm, field);		\
+		STAILQ_REMOVE_AFTER(head, curelm, field);		\
+	}								\
+	TRASHIT(*oldnext);						\
+} while (0)
+
+#define STAILQ_REMOVE_AFTER(head, elm, field) do {			\
+	if ((STAILQ_NEXT(elm, field) =					\
+	     STAILQ_NEXT(STAILQ_NEXT(elm, field), field)) == NULL)	\
+		(head)->stqh_last = &STAILQ_NEXT((elm), field);		\
+} while (0)
+
+#define	STAILQ_REMOVE_HEAD(head, field) do {				\
+	if ((STAILQ_FIRST((head)) =					\
+	     STAILQ_NEXT(STAILQ_FIRST((head)), field)) == NULL)		\
+		(head)->stqh_last = &STAILQ_FIRST((head));		\
+} while (0)
+
+#define STAILQ_SWAP(head1, head2, type) do {				\
+	struct type *swap_first = STAILQ_FIRST(head1);			\
+	struct type **swap_last = (head1)->stqh_last;			\
+	STAILQ_FIRST(head1) = STAILQ_FIRST(head2);			\
+	(head1)->stqh_last = (head2)->stqh_last;			\
+	STAILQ_FIRST(head2) = swap_first;				\
+	(head2)->stqh_last = swap_last;					\
+	if (STAILQ_EMPTY(head1))					\
+		(head1)->stqh_last = &STAILQ_FIRST(head1);		\
+	if (STAILQ_EMPTY(head2))					\
+		(head2)->stqh_last = &STAILQ_FIRST(head2);		\
+} while (0)
+
+
+/*
+ * List declarations.
+ */
+#define	LIST_HEAD(name, type)						\
+struct name {								\
+	struct type *lh_first;	/* first element */			\
+}
+
+#define	LIST_HEAD_INITIALIZER(head)					\
+	{ NULL }
+
+#define	LIST_ENTRY(type)						\
+struct {								\
+	struct type *le_next;	/* next element */			\
+	struct type **le_prev;	/* address of previous next element */	\
+}
+
+/*
+ * List functions.
+ */
+
+#if (defined(_KERNEL) && defined(INVARIANTS))
+#define	QMD_LIST_CHECK_HEAD(head, field) do {				\
+	if (LIST_FIRST((head)) != NULL &&				\
+	    LIST_FIRST((head))->field.le_prev !=			\
+	     &LIST_FIRST((head)))					\
+		panic("Bad list head %p first->prev != head", (head));	\
+} while (0)
+
+#define	QMD_LIST_CHECK_NEXT(elm, field) do {				\
+	if (LIST_NEXT((elm), field) != NULL &&				\
+	    LIST_NEXT((elm), field)->field.le_prev !=			\
+	     &((elm)->field.le_next))					\
+	     	panic("Bad link elm %p next->prev != elm", (elm));	\
+} while (0)
+
+#define	QMD_LIST_CHECK_PREV(elm, field) do {				\
+	if (*(elm)->field.le_prev != (elm))				\
+		panic("Bad link elm %p prev->next != elm", (elm));	\
+} while (0)
+#else
+#define	QMD_LIST_CHECK_HEAD(head, field)
+#define	QMD_LIST_CHECK_NEXT(elm, field)
+#define	QMD_LIST_CHECK_PREV(elm, field)
+#endif /* (_KERNEL && INVARIANTS) */
+
+#define	LIST_EMPTY(head)	((head)->lh_first == NULL)
+
+#define	LIST_FIRST(head)	((head)->lh_first)
+
+#define	LIST_FOREACH(var, head, field)					\
+	for ((var) = LIST_FIRST((head));				\
+	    (var);							\
+	    (var) = LIST_NEXT((var), field))
+
+#define	LIST_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = LIST_FIRST((head));				\
+	    (var) && ((tvar) = LIST_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	LIST_INIT(head) do {						\
+	LIST_FIRST((head)) = NULL;					\
+} while (0)
+
+#define	LIST_INSERT_AFTER(listelm, elm, field) do {			\
+	QMD_LIST_CHECK_NEXT(listelm, field);				\
+	if ((LIST_NEXT((elm), field) = LIST_NEXT((listelm), field)) != NULL)\
+		LIST_NEXT((listelm), field)->field.le_prev =		\
+		    &LIST_NEXT((elm), field);				\
+	LIST_NEXT((listelm), field) = (elm);				\
+	(elm)->field.le_prev = &LIST_NEXT((listelm), field);		\
+} while (0)
+
+#define	LIST_INSERT_BEFORE(listelm, elm, field) do {			\
+	QMD_LIST_CHECK_PREV(listelm, field);				\
+	(elm)->field.le_prev = (listelm)->field.le_prev;		\
+	LIST_NEXT((elm), field) = (listelm);				\
+	*(listelm)->field.le_prev = (elm);				\
+	(listelm)->field.le_prev = &LIST_NEXT((elm), field);		\
+} while (0)
+
+#define	LIST_INSERT_HEAD(head, elm, field) do {				\
+	QMD_LIST_CHECK_HEAD((head), field);				\
+	if ((LIST_NEXT((elm), field) = LIST_FIRST((head))) != NULL)	\
+		LIST_FIRST((head))->field.le_prev = &LIST_NEXT((elm), field);\
+	LIST_FIRST((head)) = (elm);					\
+	(elm)->field.le_prev = &LIST_FIRST((head));			\
+} while (0)
+
+#define	LIST_NEXT(elm, field)	((elm)->field.le_next)
+
+#define	LIST_REMOVE(elm, field) do {					\
+	QMD_SAVELINK(oldnext, (elm)->field.le_next);			\
+	QMD_SAVELINK(oldprev, (elm)->field.le_prev);			\
+	QMD_LIST_CHECK_NEXT(elm, field);				\
+	QMD_LIST_CHECK_PREV(elm, field);				\
+	if (LIST_NEXT((elm), field) != NULL)				\
+		LIST_NEXT((elm), field)->field.le_prev = 		\
+		    (elm)->field.le_prev;				\
+	*(elm)->field.le_prev = LIST_NEXT((elm), field);		\
+	TRASHIT(*oldnext);						\
+	TRASHIT(*oldprev);						\
+} while (0)
+
+#define LIST_SWAP(head1, head2, type, field) do {			\
+	struct type *swap_tmp = LIST_FIRST((head1));			\
+	LIST_FIRST((head1)) = LIST_FIRST((head2));			\
+	LIST_FIRST((head2)) = swap_tmp;					\
+	if ((swap_tmp = LIST_FIRST((head1))) != NULL)			\
+		swap_tmp->field.le_prev = &LIST_FIRST((head1));		\
+	if ((swap_tmp = LIST_FIRST((head2))) != NULL)			\
+		swap_tmp->field.le_prev = &LIST_FIRST((head2));		\
+} while (0)
+
+/*
+ * Tail queue declarations.
+ */
+#define	TAILQ_HEAD(name, type)						\
+struct name {								\
+	struct type *tqh_first;	/* first element */			\
+	struct type **tqh_last;	/* addr of last next element */		\
+	TRACEBUF							\
+}
+
+#define	TAILQ_HEAD_INITIALIZER(head)					\
+	{ NULL, &(head).tqh_first }
+
+#define	TAILQ_ENTRY(type)						\
+struct {								\
+	struct type *tqe_next;	/* next element */			\
+	struct type **tqe_prev;	/* address of previous next element */	\
+	TRACEBUF							\
+}
+
+/*
+ * Tail queue functions.
+ */
+#if (defined(_KERNEL) && defined(INVARIANTS))
+#define	QMD_TAILQ_CHECK_HEAD(head, field) do {				\
+	if (!TAILQ_EMPTY(head) &&					\
+	    TAILQ_FIRST((head))->field.tqe_prev !=			\
+	     &TAILQ_FIRST((head)))					\
+		panic("Bad tailq head %p first->prev != head", (head));	\
+} while (0)
+
+#define	QMD_TAILQ_CHECK_TAIL(head, field) do {				\
+	if (*(head)->tqh_last != NULL)					\
+	    	panic("Bad tailq NEXT(%p->tqh_last) != NULL", (head)); 	\
+} while (0)
+
+#define	QMD_TAILQ_CHECK_NEXT(elm, field) do {				\
+	if (TAILQ_NEXT((elm), field) != NULL &&				\
+	    TAILQ_NEXT((elm), field)->field.tqe_prev !=			\
+	     &((elm)->field.tqe_next))					\
+		panic("Bad link elm %p next->prev != elm", (elm));	\
+} while (0)
+
+#define	QMD_TAILQ_CHECK_PREV(elm, field) do {				\
+	if (*(elm)->field.tqe_prev != (elm))				\
+		panic("Bad link elm %p prev->next != elm", (elm));	\
+} while (0)
+#else
+#define	QMD_TAILQ_CHECK_HEAD(head, field)
+#define	QMD_TAILQ_CHECK_TAIL(head, headname)
+#define	QMD_TAILQ_CHECK_NEXT(elm, field)
+#define	QMD_TAILQ_CHECK_PREV(elm, field)
+#endif /* (_KERNEL && INVARIANTS) */
+
+#define	TAILQ_CONCAT(head1, head2, field) do {				\
+	if (!TAILQ_EMPTY(head2)) {					\
+		*(head1)->tqh_last = (head2)->tqh_first;		\
+		(head2)->tqh_first->field.tqe_prev = (head1)->tqh_last;	\
+		(head1)->tqh_last = (head2)->tqh_last;			\
+		TAILQ_INIT((head2));					\
+		QMD_TRACE_HEAD(head1);					\
+		QMD_TRACE_HEAD(head2);					\
+	}								\
+} while (0)
+
+#define	TAILQ_EMPTY(head)	((head)->tqh_first == NULL)
+
+#define	TAILQ_FIRST(head)	((head)->tqh_first)
+
+#define	TAILQ_FOREACH(var, head, field)					\
+	for ((var) = TAILQ_FIRST((head));				\
+	    (var);							\
+	    (var) = TAILQ_NEXT((var), field))
+
+#define	TAILQ_FOREACH_SAFE(var, head, field, tvar)			\
+	for ((var) = TAILQ_FIRST((head));				\
+	    (var) && ((tvar) = TAILQ_NEXT((var), field), 1);		\
+	    (var) = (tvar))
+
+#define	TAILQ_FOREACH_REVERSE(var, head, headname, field)		\
+	for ((var) = TAILQ_LAST((head), headname);			\
+	    (var);							\
+	    (var) = TAILQ_PREV((var), headname, field))
+
+#define	TAILQ_FOREACH_REVERSE_SAFE(var, head, headname, field, tvar)	\
+	for ((var) = TAILQ_LAST((head), headname);			\
+	    (var) && ((tvar) = TAILQ_PREV((var), headname, field), 1);	\
+	    (var) = (tvar))
+
+#define	TAILQ_INIT(head) do {						\
+	TAILQ_FIRST((head)) = NULL;					\
+	(head)->tqh_last = &TAILQ_FIRST((head));			\
+	QMD_TRACE_HEAD(head);						\
+} while (0)
+
+#define	TAILQ_INSERT_AFTER(head, listelm, elm, field) do {		\
+	QMD_TAILQ_CHECK_NEXT(listelm, field);				\
+	if ((TAILQ_NEXT((elm), field) = TAILQ_NEXT((listelm), field)) != NULL)\
+		TAILQ_NEXT((elm), field)->field.tqe_prev = 		\
+		    &TAILQ_NEXT((elm), field);				\
+	else {								\
+		(head)->tqh_last = &TAILQ_NEXT((elm), field);		\
+		QMD_TRACE_HEAD(head);					\
+	}								\
+	TAILQ_NEXT((listelm), field) = (elm);				\
+	(elm)->field.tqe_prev = &TAILQ_NEXT((listelm), field);		\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+	QMD_TRACE_ELEM(&listelm->field);				\
+} while (0)
+
+#define	TAILQ_INSERT_BEFORE(listelm, elm, field) do {			\
+	QMD_TAILQ_CHECK_PREV(listelm, field);				\
+	(elm)->field.tqe_prev = (listelm)->field.tqe_prev;		\
+	TAILQ_NEXT((elm), field) = (listelm);				\
+	*(listelm)->field.tqe_prev = (elm);				\
+	(listelm)->field.tqe_prev = &TAILQ_NEXT((elm), field);		\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+	QMD_TRACE_ELEM(&listelm->field);				\
+} while (0)
+
+#define	TAILQ_INSERT_HEAD(head, elm, field) do {			\
+	QMD_TAILQ_CHECK_HEAD(head, field);				\
+	if ((TAILQ_NEXT((elm), field) = TAILQ_FIRST((head))) != NULL)	\
+		TAILQ_FIRST((head))->field.tqe_prev =			\
+		    &TAILQ_NEXT((elm), field);				\
+	else								\
+		(head)->tqh_last = &TAILQ_NEXT((elm), field);		\
+	TAILQ_FIRST((head)) = (elm);					\
+	(elm)->field.tqe_prev = &TAILQ_FIRST((head));			\
+	QMD_TRACE_HEAD(head);						\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+} while (0)
+
+#define	TAILQ_INSERT_TAIL(head, elm, field) do {			\
+	QMD_TAILQ_CHECK_TAIL(head, field);				\
+	TAILQ_NEXT((elm), field) = NULL;				\
+	(elm)->field.tqe_prev = (head)->tqh_last;			\
+	*(head)->tqh_last = (elm);					\
+	(head)->tqh_last = &TAILQ_NEXT((elm), field);			\
+	QMD_TRACE_HEAD(head);						\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+} while (0)
+
+#define	TAILQ_LAST(head, headname)					\
+	(*(((struct headname *)((head)->tqh_last))->tqh_last))
+
+#define	TAILQ_NEXT(elm, field) ((elm)->field.tqe_next)
+
+#define	TAILQ_PREV(elm, headname, field)				\
+	(*(((struct headname *)((elm)->field.tqe_prev))->tqh_last))
+
+#define	TAILQ_REMOVE(head, elm, field) do {				\
+	QMD_SAVELINK(oldnext, (elm)->field.tqe_next);			\
+	QMD_SAVELINK(oldprev, (elm)->field.tqe_prev);			\
+	QMD_TAILQ_CHECK_NEXT(elm, field);				\
+	QMD_TAILQ_CHECK_PREV(elm, field);				\
+	if ((TAILQ_NEXT((elm), field)) != NULL)				\
+		TAILQ_NEXT((elm), field)->field.tqe_prev = 		\
+		    (elm)->field.tqe_prev;				\
+	else {								\
+		(head)->tqh_last = (elm)->field.tqe_prev;		\
+		QMD_TRACE_HEAD(head);					\
+	}								\
+	*(elm)->field.tqe_prev = TAILQ_NEXT((elm), field);		\
+	TRASHIT(*oldnext);						\
+	TRASHIT(*oldprev);						\
+	QMD_TRACE_ELEM(&(elm)->field);					\
+} while (0)
+
+#define TAILQ_SWAP(head1, head2, type, field) do {			\
+	struct type *swap_first = (head1)->tqh_first;			\
+	struct type **swap_last = (head1)->tqh_last;			\
+	(head1)->tqh_first = (head2)->tqh_first;			\
+	(head1)->tqh_last = (head2)->tqh_last;				\
+	(head2)->tqh_first = swap_first;				\
+	(head2)->tqh_last = swap_last;					\
+	if ((swap_first = (head1)->tqh_first) != NULL)			\
+		swap_first->field.tqe_prev = &(head1)->tqh_first;	\
+	else								\
+		(head1)->tqh_last = &(head1)->tqh_first;		\
+	if ((swap_first = (head2)->tqh_first) != NULL)			\
+		swap_first->field.tqe_prev = &(head2)->tqh_first;	\
+	else								\
+		(head2)->tqh_last = &(head2)->tqh_first;		\
+} while (0)
+
+#endif /* !_SYS_QUEUE_H_ */
-- 
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 Fri Oct 28 11:45:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:45:59 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrRH-0004Bc-N3; Fri, 28 Oct 2011 11:45:59 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJ9-00017b-3f
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:35 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!8
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15692 invoked from network); 28 Oct 2011 18:37:32 -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;
	28 Oct 2011 18:37:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652736"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37: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; Fri, 28 Oct 2011 19:37:31 +0100
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
	1RJrJ5-0007E8-Np; Fri, 28 Oct 2011 18:37:31 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ5-00041b-NB;
	Fri, 28 Oct 2011 19:37:31 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:37:05 +0100
Message-ID: <1319827031-15395-8-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-7-git-send-email-ian.jackson@eu.citrix.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>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC v2 07/13] libxl: internal convenience macros
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 some macros which are useful shorthands for use within libxl:
  * GC_INIT to initialise a gc from a ctx and GC_FREE to free it
  * CTX(gc) to give you back the ctx
  * LIBXL_TAILQ_INSERT_SORTED for inserting things into sorted lists

These will be used by later patches.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/libxl_internal.h |   48 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 48 insertions(+), 0 deletions(-)

diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 31adbc8..8649788 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -555,6 +555,54 @@ _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);
 
+
+/*
+ * Convenience macros.
+ */
+
+
+/*
+ * All of these assume (or define)
+ *    libxl__gc *gc;
+ * as a local variable.
+ */
+
+#define GC_INIT(ctx)  libxl__gc gc[1] = { LIBXL_INIT_GC(ctx) }
+#define GC_FREE       libxl__free_all(gc)
+#define CTX           libxl__gc_owner(gc)
+
+
+/*
+ * Inserts "elm_new" into the sorted list "head".
+ *
+ * "elm_search" must be a loop search variable of the same type as
+ * "elm_new".  "new_after_search_p" must be an expression which is
+ * true iff the element "elm_new" sorts after the element
+ * "elm_search".
+ *
+ * "search_body" can be empty, or some declaration(s) and statement(s)
+ * needed for "new_after_search_p".
+ */
+#define LIBXL_TAILQ_INSERT_SORTED(head, entry, elm_new, elm_search,     \
+                                  search_body, new_after_search_p)      \
+    do {                                                                \
+        for ((elm_search) = LIBXL_TAILQ_FIRST((head));                  \
+             (elm_search);                                              \
+             (elm_search) = LIBXL_TAILQ_NEXT((elm_search), entry)) {    \
+            search_body;                                                \
+            if (!(new_after_search_p))                                  \
+                break;                                                  \
+        }                                                               \
+        /* now elm_search is either the element before which we want    \
+         * to place elm_new, or NULL meaning we want to put elm_new at  \
+         * the end */                                                   \
+        if ((elm_search))                                               \
+            LIBXL_TAILQ_INSERT_BEFORE((elm_search), (elm_new), entry);  \
+        else                                                            \
+            LIBXL_TAILQ_INSERT_TAIL((head), (elm_new), entry);          \
+    } while(0)
+
+
 #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 Fri Oct 28 11:48:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:48:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrTP-0004m7-5u; Fri, 28 Oct 2011 11:48:11 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJA-000182-Eh
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:37 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!10
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15716 invoked from network); 28 Oct 2011 18:37:33 -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;
	28 Oct 2011 18:37:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652738"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37: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; Fri, 28 Oct 2011 19:37:33 +0100
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
	1RJrJ7-0007EE-4V; Fri, 28 Oct 2011 18:37:33 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ7-00041j-3J;
	Fri, 28 Oct 2011 19:37:33 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:37:07 +0100
Message-ID: <1319827031-15395-10-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-9-git-send-email-ian.jackson@eu.citrix.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>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC v2 09/13] libxl: introduce lock in libxl_ctx
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 lock will be used to protect data structures which will be hung
off the libxl_ctx in subsequent patches.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/libxl.c          |    3 +++
 tools/libxl/libxl_internal.h |   16 ++++++++++++++++
 2 files changed, 19 insertions(+), 0 deletions(-)

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 5d448af..a3c9807 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -40,6 +40,7 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
 {
     libxl_ctx *ctx;
     struct stat stat_buf;
+    const pthread_mutex_t mutex_value = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
 
     if (version != LIBXL_VERSION)
         return ERROR_VERSION;
@@ -53,6 +54,8 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
     memset(ctx, 0, sizeof(libxl_ctx));
     ctx->lg = lg;
 
+    memcpy(&ctx->lock, &mutex_value, sizeof(ctx->lock));
+
     if ( stat(XENSTORE_PID_FILE, &stat_buf) != 0 ) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Is xenstore daemon running?\n"
                      "failed to stat %s", XENSTORE_PID_FILE);
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 6d9da2c..79a9de4 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -23,6 +23,7 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
+#include <pthread.h>
 
 #include <xs.h>
 #include <xenctrl.h>
@@ -95,6 +96,9 @@ struct libxl__ctx {
     xc_interface *xch;
     struct xs_handle *xsh;
 
+    pthread_mutex_t lock; /* protects data structures hanging off the ctx */
+      /* always use MUTEX_LOCK and MUTEX_UNLOCK to manipulate this */
+
     /* for callers who reap children willy-nilly; caller must only
      * set this after libxl_init and before any other call - or
      * may leave them untouched */
@@ -577,6 +581,18 @@ _hidden libxl__json_object *libxl__json_parse(libxl__gc *gc, const char *s);
 #define CTX           libxl__gc_owner(gc)
 
 
+#define MUTEX_LOCK do {                                 \
+        int mutex_r = pthread_mutex_lock(&CTX->lock);   \
+        assert(!mutex_r);                               \
+    } while(0)
+
+#define MUTEX_UNLOCK do {                               \
+        int mutex_r = pthread_mutex_unlock(&CTX->lock); \
+        assert(!mutex_r);                               \
+    } while(0)
+        
+
+
 /*
  * Inserts "elm_new" into the sorted list "head".
  *
-- 
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 Fri Oct 28 11:49:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:49:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrUd-000599-Bk; Fri, 28 Oct 2011 11:49:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJ9-00017n-Ho
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:37 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!9
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15698 invoked from network); 28 Oct 2011 18:37:32 -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;
	28 Oct 2011 18:37:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652737"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37: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; Fri, 28 Oct 2011 19:37:32 +0100
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
	1RJrJ6-0007EB-E0; Fri, 28 Oct 2011 18:37:32 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ6-00041f-DN;
	Fri, 28 Oct 2011 19:37:32 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:37:06 +0100
Message-ID: <1319827031-15395-9-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-8-git-send-email-ian.jackson@eu.citrix.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>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC v2 08/13] libxl: Rationalise #includes
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

libxl_internal.h now #includes libxl.h and various system headers.

This
 1. makes the order of header inclusion more predictable
 2. explicitly allows libxl_internal.h to use objects defined in libxl.h
 3. removes the need for individual files to include these headers

Also
 - remove some unnecessary #includes of libxl_utils.h,
   flexarray.h, etc. in some libxl*.c files,
 - include libxl_osdeps.h at the top of libxl_internal.h
 - add missing includes of libxl_osdeps.h to a couple of files
 - change libxl.h to libxl_internal.h in a couple of files

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/libxl.c            |    3 ---
 tools/libxl/libxl_blktap2.c    |    1 -
 tools/libxl/libxl_bootloader.c |    4 ----
 tools/libxl/libxl_cpuid.c      |    4 ----
 tools/libxl/libxl_create.c     |    4 +---
 tools/libxl/libxl_device.c     |    2 --
 tools/libxl/libxl_dm.c         |    4 +---
 tools/libxl/libxl_dom.c        |    1 -
 tools/libxl/libxl_exec.c       |    1 -
 tools/libxl/libxl_flask.c      |    3 ++-
 tools/libxl/libxl_internal.c   |    4 ----
 tools/libxl/libxl_internal.h   |    5 +++++
 tools/libxl/libxl_json.c       |    4 ++--
 tools/libxl/libxl_noblktap2.c  |    2 --
 tools/libxl/libxl_nocpuid.c    |    2 +-
 tools/libxl/libxl_paths.c      |    2 +-
 tools/libxl/libxl_pci.c        |    5 -----
 tools/libxl/libxl_qmp.c        |    2 ++
 tools/libxl/libxl_utils.c      |    1 -
 tools/libxl/libxl_uuid.c       |    4 ++++
 tools/libxl/libxl_xshelp.c     |    1 -
 21 files changed, 19 insertions(+), 40 deletions(-)

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 064fbc4..5d448af 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -31,10 +31,7 @@
 #include <inttypes.h>
 #include <assert.h>
 
-#include "libxl.h"
-#include "libxl_utils.h"
 #include "libxl_internal.h"
-#include "flexarray.h"
 
 #define PAGE_TO_MEMKB(pages) ((pages) * 4)
 #define BACKEND_STRING_SIZE 5
diff --git a/tools/libxl/libxl_blktap2.c b/tools/libxl/libxl_blktap2.c
index c8d9148..acf4110 100644
--- a/tools/libxl/libxl_blktap2.c
+++ b/tools/libxl/libxl_blktap2.c
@@ -12,7 +12,6 @@
  * GNU Lesser General Public License for more details.
  */
 
-#include "libxl.h"
 #include "libxl_osdeps.h"
 #include "libxl_internal.h"
 
diff --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c
index 1e735a8..396aac6 100644
--- a/tools/libxl/libxl_bootloader.c
+++ b/tools/libxl/libxl_bootloader.c
@@ -14,7 +14,6 @@
 
 #include "libxl_osdeps.h"
 
-#include <string.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <termios.h>
@@ -22,11 +21,8 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 
-#include "libxl.h"
 #include "libxl_internal.h"
 
-#include "flexarray.h"
-
 #define XENCONSOLED_BUF_SIZE 16
 #define BOOTLOADER_BUF_SIZE 1024
 
diff --git a/tools/libxl/libxl_cpuid.c b/tools/libxl/libxl_cpuid.c
index 12cc0b1..f65a898 100644
--- a/tools/libxl/libxl_cpuid.c
+++ b/tools/libxl/libxl_cpuid.c
@@ -10,10 +10,6 @@
  * GNU Lesser General Public License for more details.
  */
 
-#include <string.h>
-
-#include "libxl.h"
-#include "libxl_osdeps.h"
 #include "libxl_internal.h"
 
 void libxl_cpuid_destroy(libxl_cpuid_policy_list *p_cpuid_list)
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index 68d0fc3..70705af 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -26,10 +26,8 @@
 #include <xc_dom.h>
 #include <xenguest.h>
 #include <assert.h>
-#include "libxl.h"
-#include "libxl_utils.h"
+
 #include "libxl_internal.h"
-#include "flexarray.h"
 
 void libxl_domain_config_destroy(libxl_domain_config *d_config)
 {
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index 88cd990..8b5fc4a 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -24,8 +24,6 @@
 #include <unistd.h>
 #include <fcntl.h>
 
-
-#include "libxl.h"
 #include "libxl_internal.h"
 
 static const char *string_of_kinds[] = {
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index d6ad85b..e18bac7 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -24,10 +24,8 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <assert.h>
-#include "libxl_utils.h"
+
 #include "libxl_internal.h"
-#include "libxl.h"
-#include "flexarray.h"
 
 static const char *libxl_tapif_script(libxl__gc *gc)
 {
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index 718281a..430b3d0 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -32,7 +32,6 @@
 
 #include <xen/hvm/hvm_info_table.h>
 
-#include "libxl.h"
 #include "libxl_internal.h"
 
 libxl_domain_type libxl__domain_type(libxl__gc *gc, uint32_t domid)
diff --git a/tools/libxl/libxl_exec.c b/tools/libxl/libxl_exec.c
index d6199d4..e981679 100644
--- a/tools/libxl/libxl_exec.c
+++ b/tools/libxl/libxl_exec.c
@@ -28,7 +28,6 @@
 #include <signal.h> /* for SIGKILL */
 #include <fcntl.h>
 
-#include "libxl.h"
 #include "libxl_internal.h"
 
 static int call_waitpid(pid_t (*waitpid_cb)(pid_t, int *, int), pid_t pid, int *status, int options)
diff --git a/tools/libxl/libxl_flask.c b/tools/libxl/libxl_flask.c
index c8d0594..6b548dd 100644
--- a/tools/libxl/libxl_flask.c
+++ b/tools/libxl/libxl_flask.c
@@ -7,13 +7,14 @@
  *  as published by the Free Software Foundation.
  */
 
+#include "libxl_osdeps.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
 #include <xenctrl.h>
 
-#include "libxl.h"
 #include "libxl_internal.h"
 
 int libxl_flask_context_to_sid(libxl_ctx *ctx, char *buf, size_t len,
diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
index 3993d8e..dd31f25 100644
--- a/tools/libxl/libxl_internal.c
+++ b/tools/libxl/libxl_internal.c
@@ -16,8 +16,6 @@
 #include "libxl_osdeps.h"
 
 #include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -25,9 +23,7 @@
 #include <sys/mman.h>
 #include <unistd.h>
 
-#include "libxl.h"
 #include "libxl_internal.h"
-#include "libxl_utils.h"
 
 int libxl__error_set(libxl__gc *gc, int code)
 {
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 8649788..6d9da2c 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -17,14 +17,19 @@
 #ifndef LIBXL_INTERNAL_H
 #define LIBXL_INTERNAL_H
 
+#include "libxl_osdeps.h"
+
 #include <stdint.h>
 #include <stdarg.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include <xs.h>
 #include <xenctrl.h>
 #include "xentoollog.h"
 
+#include "libxl.h"
+
 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
 #define _hidden __attribute__((visibility("hidden")))
 #define _protected __attribute__((visibility("protected")))
diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
index 11f65fc..a4208f3 100644
--- a/tools/libxl/libxl_json.c
+++ b/tools/libxl/libxl_json.c
@@ -12,13 +12,13 @@
  * GNU Lesser General Public License for more details.
  */
 
+#include "libxl_osdeps.h"
+
 #include <assert.h>
-#include <string.h>
 
 #include <yajl/yajl_parse.h>
 #include <yajl/yajl_gen.h>
 
-#include <libxl.h>
 #include "libxl_internal.h"
 
 /* #define DEBUG_ANSWER */
diff --git a/tools/libxl/libxl_noblktap2.c b/tools/libxl/libxl_noblktap2.c
index 704d03f..3307551 100644
--- a/tools/libxl/libxl_noblktap2.c
+++ b/tools/libxl/libxl_noblktap2.c
@@ -12,8 +12,6 @@
  * GNU Lesser General Public License for more details.
  */
 
-#include "libxl.h"
-#include "libxl_osdeps.h"
 #include "libxl_internal.h"
 
 int libxl__blktap_enabled(libxl__gc *gc)
diff --git a/tools/libxl/libxl_nocpuid.c b/tools/libxl/libxl_nocpuid.c
index d63757f..2e9490c 100644
--- a/tools/libxl/libxl_nocpuid.c
+++ b/tools/libxl/libxl_nocpuid.c
@@ -10,7 +10,7 @@
  * GNU Lesser General Public License for more details.
  */
 
-#include "libxl.h"
+#include "libxl_internal.h"
 
 void libxl_cpuid_destroy(libxl_cpuid_policy_list *p_cpuid_list)
 {
diff --git a/tools/libxl/libxl_paths.c b/tools/libxl/libxl_paths.c
index 64f662d..fa80056 100644
--- a/tools/libxl/libxl_paths.c
+++ b/tools/libxl/libxl_paths.c
@@ -12,7 +12,7 @@
  * GNU Lesser General Public License for more details.
  */
 
-#include "libxl.h"
+#include "libxl_internal.h"
 #include "_libxl_paths.h"
 
 const char *libxl_sbindir_path(void)
diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 33dd060..9eac108 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -17,7 +17,6 @@
 #include "libxl_osdeps.h"
 
 #include <stdio.h>
-#include <string.h>
 #include <stdlib.h>
 #include <sys/types.h>
 #include <fcntl.h>
@@ -27,15 +26,11 @@
 #include <sys/stat.h>
 #include <signal.h>
 #include <unistd.h> /* for write, unlink and close */
-#include <stdint.h>
 #include <inttypes.h>
 #include <dirent.h>
 #include <assert.h>
 
-#include "libxl.h"
-#include "libxl_utils.h"
 #include "libxl_internal.h"
-#include "flexarray.h"
 
 #define PCI_BDF                "%04x:%02x:%02x.%01x"
 #define PCI_BDF_SHORT          "%02x:%02x.%01x"
diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
index 618f20f..0eefe4d 100644
--- a/tools/libxl/libxl_qmp.c
+++ b/tools/libxl/libxl_qmp.c
@@ -18,6 +18,8 @@
  * Specification, see in the QEMU repository.
  */
 
+#include "libxl_osdeps.h"
+
 #include <unistd.h>
 #include <sys/un.h>
 #include <sys/queue.h>
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index dce9d8b..7ea2d2c 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -28,7 +28,6 @@
 #include <unistd.h>
 #include <assert.h>
 
-#include "libxl_utils.h"
 #include "libxl_internal.h"
 
 struct schedid_name {
diff --git a/tools/libxl/libxl_uuid.c b/tools/libxl/libxl_uuid.c
index e837228..80ab789 100644
--- a/tools/libxl/libxl_uuid.c
+++ b/tools/libxl/libxl_uuid.c
@@ -12,8 +12,12 @@
  * GNU Lesser General Public License for more details.
  */
 
+#include "libxl_osdeps.h"
+
 #include <libxl_uuid.h>
 
+#include "libxl_internal.h"
+
 #if defined(__linux__)
 
 int libxl_uuid_is_nil(libxl_uuid *uuid)
diff --git a/tools/libxl/libxl_xshelp.c b/tools/libxl/libxl_xshelp.c
index 56a7c7b..f85e867 100644
--- a/tools/libxl/libxl_xshelp.c
+++ b/tools/libxl/libxl_xshelp.c
@@ -21,7 +21,6 @@
 #include <stdarg.h>
 #include <inttypes.h>
 
-#include "libxl.h"
 #include "libxl_internal.h"
 
 char **libxl__xs_kvs_of_flexarray(libxl__gc *gc, flexarray_t *array, int length)
-- 
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 Fri Oct 28 11:50:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:50:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrVr-0005WR-C5; Fri, 28 Oct 2011 11:50:43 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJB-00018A-0i
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:38 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!11
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15742 invoked from network); 28 Oct 2011 18:37:34 -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;
	28 Oct 2011 18:37:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652739"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37: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, 28 Oct 2011 19:37:33 +0100
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
	1RJrJ7-0007EH-PV; Fri, 28 Oct 2011 18:37:33 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ7-00041p-Oj;
	Fri, 28 Oct 2011 19:37:33 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:37:08 +0100
Message-ID: <1319827031-15395-11-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-10-git-send-email-ian.jackson@eu.citrix.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>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC v2 10/13] libxl: make libxl__[v]log
	const-correct
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/libxl_internal.c |    4 ++--
 tools/libxl/libxl_internal.h |    4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
index dd31f25..df2b7f8 100644
--- a/tools/libxl/libxl_internal.c
+++ b/tools/libxl/libxl_internal.c
@@ -179,7 +179,7 @@ char *libxl__dirname(libxl__gc *gc, const char *s)
 
 void libxl__logv(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
              const char *file, int line, const char *func,
-             char *fmt, va_list ap)
+             const char *fmt, va_list ap)
 {
     char *enomem = "[out of memory formatting log message]";
     char *base = NULL;
@@ -206,7 +206,7 @@ void libxl__logv(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
 
 void libxl__log(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
             const char *file, int line, const char *func,
-            char *fmt, ...)
+            const char *fmt, ...)
 {
     va_list ap;
     va_start(ap, fmt);
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 79a9de4..fe64d34 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -80,13 +80,13 @@
 _hidden void libxl__logv(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
              const char *file /* may be 0 */, int line /* ignored if !file */,
              const char *func /* may be 0 */,
-             char *fmt, va_list al)
+             const char *fmt, va_list al)
      __attribute__((format(printf,7,0)));
 
 _hidden void libxl__log(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
             const char *file /* may be 0 */, int line /* ignored if !file */,
             const char *func /* may be 0 */,
-            char *fmt, ...)
+            const char *fmt, ...)
      __attribute__((format(printf,7,8)));
 
      /* these functions preserve errno (saving and restoring) */
-- 
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 Fri Oct 28 11:51:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:51:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrWz-0005ts-DF; Fri, 28 Oct 2011 11:51:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJB-00018W-M5
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:40 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!12
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15766 invoked from network); 28 Oct 2011 18:37:34 -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;
	28 Oct 2011 18:37:34 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652740"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37: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, 28 Oct 2011 19:37:34 +0100
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
	1RJrJ8-0007EK-99; Fri, 28 Oct 2011 18:37:34 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ8-00041t-8S;
	Fri, 28 Oct 2011 19:37:34 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:37:09 +0100
Message-ID: <1319827031-15395-12-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-11-git-send-email-ian.jackson@eu.citrix.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>
	<1319827031-15395-11-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 RFC v2 11/13] libxl: make libxl__free_all
	idempotent
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/libxl_internal.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
index df2b7f8..62e7fba 100644
--- a/tools/libxl/libxl_internal.c
+++ b/tools/libxl/libxl_internal.c
@@ -72,6 +72,8 @@ void libxl__free_all(libxl__gc *gc)
         free(ptr);
     }
     free(gc->alloc_ptrs);
+    gc->alloc_ptrs = 0;
+    gc->alloc_maxsize = 0;
 }
 
 void *libxl__zalloc(libxl__gc *gc, int bytes)
-- 
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 Fri Oct 28 11:52:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:52:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrXx-0006HP-8i; Fri, 28 Oct 2011 11:52:53 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJD-000198-J0
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:40 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!14
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15802 invoked from network); 28 Oct 2011 18:37:36 -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;
	28 Oct 2011 18:37:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652742"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37: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; Fri, 28 Oct 2011 19:37:35 +0100
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
	1RJrJ9-0007EQ-Ao; Fri, 28 Oct 2011 18:37:35 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ9-000421-A0;
	Fri, 28 Oct 2011 19:37:35 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:37:11 +0100
Message-ID: <1319827031-15395-14-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-13-git-send-email-ian.jackson@eu.citrix.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>
	<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>
MIME-Version: 1.0
Content-Type: text/plain
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Subject: [Xen-devel] [PATCH RFC v2 13/13] libxl: New event generation API
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Replace the existing API for retrieving high-level events (events
about domains, etc.) from libxl with a new one.

This changes the definition and semantics of the `libxl_event'
structure, and replaces the calls for obtaining information about
domain death and disk eject events.

This is an incompatible change, sorry.  The alternative was to try to
provide both the previous horrid API and the new one, and would also
involve never using the name `libxl_event' for the new interface.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/libxl.c          |  306 +++++++++++++++++++++++++++++------------
 tools/libxl/libxl.h          |   55 ++-------
 tools/libxl/libxl_event.c    |  182 +++++++++++++++++++++++---
 tools/libxl/libxl_event.h    |  172 +++++++++++++++++++++++
 tools/libxl/libxl_internal.c |    6 +
 tools/libxl/libxl_internal.h |   66 +++++++++
 tools/libxl/libxl_types.idl  |   35 ++++-
 tools/libxl/xl_cmdimpl.c     |  261 +++++++++++++++++++++---------------
 8 files changed, 815 insertions(+), 268 deletions(-)

diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 4d619ab..701763e 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -58,6 +58,7 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
 
     ctx->osevent_hooks = 0;
 
+    ctx->fd_polls = 0;
     ctx->fd_beforepolled = 0;
     LIBXL_LIST_INIT(&ctx->efds);
     LIBXL_TAILQ_INIT(&ctx->etimes);
@@ -66,6 +67,9 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
     LIBXL_SLIST_INIT(&ctx->watch_freeslots);
     libxl__ev_fd_init(&ctx->watch_efd);
 
+    LIBXL_TAILQ_INIT(&ctx->death_list);
+    libxl__ev_xswatch_init(&ctx->death_watch);
+
     if ( stat(XENSTORE_PID_FILE, &stat_buf) != 0 ) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Is xenstore daemon running?\n"
                      "failed to stat %s", XENSTORE_PID_FILE);
@@ -93,6 +97,13 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
     return 0;
 }
 
+static void free_disable_deaths(libxl__gc *gc,
+                                struct libxl__evgen_domain_death_list *l) {
+    libxl_evgen_domain_death *death;
+    while ((death = LIBXL_TAILQ_FIRST(l)))
+        libxl__evdisable_domain_death(gc, death);
+}
+
 int libxl_ctx_free(libxl_ctx *ctx)
 {
     int i;
@@ -100,6 +111,9 @@ int libxl_ctx_free(libxl_ctx *ctx)
 
     if (!ctx) return 0;
 
+    free_disable_deaths(gc, &CTX->death_list);
+    free_disable_deaths(gc, &CTX->death_reported);
+
     for (i = 0; i < ctx->watch_nslots; i++)
         assert(!libxl__watch_slot_contents(gc, i));
     libxl__ev_fd_deregister(gc, &ctx->watch_efd);
@@ -111,6 +125,7 @@ int libxl_ctx_free(libxl_ctx *ctx)
     libxl_version_info_destroy(&ctx->version_info);
     if (ctx->xsh) xs_daemon_close(ctx->xsh);
 
+    free(ctx->fd_polls);
     free(ctx->fd_beforepolled);
     free(ctx->watch_slots);
 
@@ -610,117 +625,175 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req)
     return 0;
 }
 
-int libxl_get_wait_fd(libxl_ctx *ctx, int *fd)
-{
-    *fd = xs_fileno(ctx->xsh);
-    return 0;
-}
+static void domain_death_xswatch_callback(libxl__gc *gc, libxl__ev_xswatch *w,
+                                        const char *wpath, const char *epath) {
+    libxl_evgen_domain_death *evg;
+    uint32_t domid;
+    int rc;
 
-int libxl_wait_for_domain_death(libxl_ctx *ctx, uint32_t domid, libxl_waiter *waiter)
-{
-    waiter->path = strdup("@releaseDomain");
-    if (asprintf(&(waiter->token), "%d", LIBXL_EVENT_TYPE_DOMAIN_DEATH) < 0)
-        return -1;
-    if (!xs_watch(ctx->xsh, waiter->path, waiter->token))
-        return -1;
-    return 0;
-}
+    MUTEX_LOCK;
 
-int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t guest_domid, libxl_device_disk *disks, int num_disks, libxl_waiter *waiter)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    int i, rc = -1;
-    uint32_t domid = libxl_get_stubdom_id(ctx, guest_domid);
+    evg = LIBXL_TAILQ_FIRST(&CTX->death_list);
+    if (!evg) goto out;
 
-    if (!domid)
-        domid = guest_domid;
+    domid = evg->domid;
 
-    for (i = 0; i < num_disks; i++) {
-        if (asprintf(&(waiter[i].path), "%s/device/vbd/%d/eject",
-                     libxl__xs_get_dompath(&gc, domid),
-                     libxl__device_disk_dev_number(disks[i].vdev,
-                                                   NULL, NULL)) < 0)
-            goto out;
-        if (asprintf(&(waiter[i].token), "%d", LIBXL_EVENT_TYPE_DISK_EJECT) < 0)
+    for (;;) {
+        int nentries = LIBXL_TAILQ_NEXT(evg, entry) ? 200 : 1;
+        xc_domaininfo_t domaininfos[nentries];
+        const xc_domaininfo_t *got = domaininfos, *gotend;
+
+        rc = xc_domain_getinfolist(CTX->xch, domid, nentries, domaininfos);
+        if (rc == -1) {
+            LIBXL__EVENT_DISASTER(gc, "xc_domain_getinfolist failed while"
+                                  " processing @releaseDomain watch event",
+                                  errno, 0);
             goto out;
-        xs_watch(ctx->xsh, waiter[i].path, waiter[i].token);
+        }
+        gotend = &domaininfos[rc];
+
+        for (;;) {
+            if (!evg)
+                goto all_reported;
+
+            if (!rc || got->domain > evg->domid) {
+                /* ie, the list doesn't contain evg->domid any more so
+                 * the domain has been destroyed */
+                libxl_evgen_domain_death *evg_next;
+
+                libxl_event *ev = NEW_EVENT(gc, DOMAIN_DESTROY, evg->domid);
+                if (!ev) goto out;
+
+                libxl__event_occurred(gc, ev);
+
+                evg->death_reported = 1;
+                evg_next = LIBXL_TAILQ_NEXT(evg, entry);
+                LIBXL_TAILQ_REMOVE(&CTX->death_list, evg, entry);
+                LIBXL_TAILQ_INSERT_HEAD(&CTX->death_reported, evg, entry);
+                evg = evg_next;
+
+                continue;
+            }
+            
+            if (got == gotend)
+                break;
+
+            if (got->domain < evg->domid) {
+                got++;
+                continue;
+            }
+
+            assert(evg->domid == got->domain);
+
+            if (!evg->shutdown_reported &&
+                (got->flags & XEN_DOMINF_shutdown)) {
+                libxl_event *ev = NEW_EVENT(gc, DOMAIN_SHUTDOWN, got->domain);
+                if (!ev) goto out;
+                
+                ev->u.domain_shutdown.shutdown_reason =
+                    (got->flags >> XEN_DOMINF_shutdownshift) &
+                    XEN_DOMINF_shutdownmask;
+                libxl__event_occurred(gc, ev);
+
+                evg->shutdown_reported = 1;
+            }
+            evg = LIBXL_TAILQ_NEXT(evg, entry);
+        }
+
+        assert(rc); /* rc==0 results in us eating all evgs and quitting */
+        domid = gotend[-1].domain;
     }
-    rc = 0;
-out:
-    libxl__free_all(&gc);
-    return rc;
+ all_reported:
+ out:
+
+    MUTEX_UNLOCK;
 }
 
-int libxl_get_event(libxl_ctx *ctx, libxl_event *event)
-{
-    unsigned int num;
-    char **events = xs_read_watch(ctx->xsh, &num);
-    if (num != 2) {
-        free(events);
-        return ERROR_FAIL;
+int libxl_evenable_domain_death(libxl_ctx *ctx, uint32_t domid,
+                libxl_ev_user user, libxl_evgen_domain_death **evgen_out) {
+    GC_INIT(ctx);
+    libxl_evgen_domain_death *evg, *evg_search;
+    int rc;
+    
+    MUTEX_LOCK;
+
+    evg = malloc(sizeof(*evg));  if (!evg) { rc = ERROR_NOMEM; goto out; }
+    memset(evg, 0, sizeof(*evg));
+    evg->domid = domid;
+    evg->user = user;
+
+    LIBXL_TAILQ_INSERT_SORTED(&ctx->death_list, entry, evg, evg_search, ,
+                              evg->domid > evg_search->domid);
+
+    if (!libxl__ev_xswatch_isregistered(&ctx->death_watch)) {
+        rc = libxl__ev_xswatch_register(gc, &ctx->death_watch,
+                        domain_death_xswatch_callback, "@releaseDomain");
+        if (rc) { libxl__evdisable_domain_death(gc, evg); goto out; }
     }
-    event->path = strdup(events[XS_WATCH_PATH]);
-    event->token = strdup(events[XS_WATCH_TOKEN]);
-    event->type = atoi(event->token);
-    free(events);
-    return 0;
-}
 
-int libxl_stop_waiting(libxl_ctx *ctx, libxl_waiter *waiter)
-{
-    if (!xs_unwatch(ctx->xsh, waiter->path, waiter->token))
-        return ERROR_FAIL;
-    else
-        return 0;
-}
+    rc = 0;
 
-int libxl_free_event(libxl_event *event)
-{
-    free(event->path);
-    free(event->token);
-    return 0;
-}
+ out:
+    MUTEX_UNLOCK;
+    return rc;
+};
 
-int libxl_free_waiter(libxl_waiter *waiter)
-{
-    free(waiter->path);
-    free(waiter->token);
-    return 0;
-}
+void libxl__evdisable_domain_death(libxl__gc *gc,
+                                   libxl_evgen_domain_death *evg) {
+    MUTEX_LOCK;
 
-int libxl_event_get_domain_death_info(libxl_ctx *ctx, uint32_t domid, libxl_event *event, libxl_dominfo *info)
-{
-    if (libxl_domain_info(ctx, info, domid) < 0)
-        return 0;
+    if (!evg->death_reported)
+        LIBXL_TAILQ_REMOVE(&CTX->death_list, evg, entry);
+    else
+        LIBXL_TAILQ_REMOVE(&CTX->death_reported, evg, entry);
 
-    if (info->running || (!info->shutdown && !info->dying))
-        return ERROR_INVAL;
+    free(evg);
+
+    if (!LIBXL_TAILQ_FIRST(&CTX->death_list) &&
+        libxl__ev_xswatch_isregistered(&CTX->death_watch))
+        libxl__ev_xswatch_deregister(gc, &CTX->death_watch);
 
-    return 1;
+    MUTEX_UNLOCK;
 }
 
-int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event *event, libxl_device_disk *disk)
-{
-    libxl__gc gc = LIBXL_INIT_GC(ctx);
-    char *path;
+void libxl_evdisable_domain_death(libxl_ctx *ctx,
+                                  libxl_evgen_domain_death *evg) {
+    GC_INIT(ctx);
+    libxl__evdisable_domain_death(gc, evg);
+    GC_FREE;
+}
+
+static void disk_eject_xswatch_callback(libxl__gc *gc, libxl__ev_xswatch *watch,
+                                        const char *wpath, const char *epath) {
+    libxl_evgen_domain_death *evg = (void*)watch;
+    int rc;
     char *backend;
     char *value;
     char backend_type[BACKEND_STRING_SIZE+1];
 
-    value = libxl__xs_read(&gc, XBT_NULL, event->path);
+    value = libxl__xs_read(gc, XBT_NULL, wpath);
 
-    if (!value || strcmp(value,  "eject")) {
-        libxl__free_all(&gc);
-        return 0;
+    if (!value || strcmp(value,  "eject"))
+        return;
+
+    rc = libxl__xs_write(gc, XBT_NULL, wpath, "");
+    if (rc) {
+        LIBXL__EVENT_DISASTER(gc, "xs_write failed acknowledging eject",
+                              errno, LIBXL_EVENT_TYPE_DISK_EJECT);
+        return;
     }
 
-    path = strdup(event->path);
-    path[strlen(path) - 6] = '\0';
-    backend = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", path));
+    libxl_event *ev = NEW_EVENT(gc, DISK_EJECT, evg->domid);
+    libxl_device_disk *disk = &ev->u.disk_eject.disk;
+    
+    backend = libxl__xs_read(gc, XBT_NULL,
+                             libxl__sprintf(gc, "%.*s/backend",
+                                            (int)strlen(wpath)-6, wpath));
 
     sscanf(backend,
-            "/local/domain/%d/backend/%" TOSTRING(BACKEND_STRING_SIZE) "[a-z]/%*d/%*d",
-            &disk->backend_domid, backend_type);
+            "/local/domain/%d/backend/%" TOSTRING(BACKEND_STRING_SIZE)
+           "[a-z]/%*d/%*d",
+           &disk->backend_domid, backend_type);
     if (!strcmp(backend_type, "tap") || !strcmp(backend_type, "vbd")) {
         disk->backend = LIBXL_DISK_BACKEND_TAP;
     } else if (!strcmp(backend_type, "qdisk")) {
@@ -729,19 +802,72 @@ int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event
         disk->backend = LIBXL_DISK_BACKEND_UNKNOWN;
     }
 
-    disk->pdev_path = strdup("");
+    disk->pdev_path = strdup(""); /* xxx fixme malloc failure */
     disk->format = LIBXL_DISK_FORMAT_EMPTY;
     /* this value is returned to the user: do not free right away */
-    disk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/dev", backend), NULL);
+    disk->vdev = xs_read(CTX->xsh, XBT_NULL,
+                         libxl__sprintf(gc, "%s/dev", backend), NULL);
     disk->removable = 1;
     disk->readwrite = 0;
     disk->is_cdrom = 1;
 
-    free(path);
-    libxl__free_all(&gc);
-    return 1;
+    libxl__event_occurred(gc, ev);
 }
 
+int libxl_evenable_disk_eject(libxl_ctx *ctx, uint32_t guest_domid,
+                              const char *vdev, libxl_ev_user user,
+                              libxl_evgen_disk_eject **evgen_out) {
+    GC_INIT(ctx);
+    int rc;
+    char *path;
+    libxl_evgen_disk_eject *evg = NULL;
+
+    evg = malloc(sizeof(*evg));  if (!evg) { rc = ERROR_NOMEM; goto out; }
+    memset(evg, 0, sizeof(*evg));
+    evg->user = user;
+
+    evg->vdev = strdup(vdev);
+    if (!evg->vdev) { rc = ERROR_NOMEM; goto out; }
+
+    uint32_t domid = libxl_get_stubdom_id(ctx, guest_domid);
+    evg->domid = domid;
+
+    if (!domid)
+        domid = guest_domid;
+
+    path = libxl__sprintf(gc, "%s/device/vbd/%d/eject",
+                 libxl__xs_get_dompath(gc, domid),
+                 libxl__device_disk_dev_number(vdev, NULL, NULL));
+    if (!path) { rc = ERROR_NOMEM; goto out; }
+
+    rc = libxl__ev_xswatch_register(gc, &evg->watch,
+                                    disk_eject_xswatch_callback, path);
+    if (rc) goto out;
+
+    GC_FREE;
+    return 0;
+
+ out:
+    if (evg)
+        libxl__evdisable_disk_eject(gc, evg);
+    GC_FREE;
+    return rc;
+}
+
+void libxl__evdisable_disk_eject(libxl__gc *gc, libxl_evgen_disk_eject *evg) {
+    if (libxl__ev_xswatch_isregistered(&evg->watch))
+        libxl__ev_xswatch_deregister(gc, &evg->watch);
+
+    free(evg->vdev);
+    free(evg);
+}
+
+void libxl_evdisable_disk_eject(libxl_ctx *ctx, libxl_evgen_disk_eject *evg) {
+    GC_INIT(ctx);
+    libxl__evdisable_disk_eject(gc, evg);
+    GC_FREE;
+}    
+
 int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force)
 {
     libxl__gc gc = LIBXL_INIT_GC(ctx);
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index da06ed2..4759c18 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -53,7 +53,10 @@
  *    A public function may be called from within libxl; the call
  *    context initialisation macros will make sure that the internal
  *    caller's context is reused (eg, so that the same xenstore
- *    transaction is used).
+ *    transaction is used).  But in-libxl callers of libxl public
+ *    functions should note that any libxl public function may cause
+ *    recursively reentry into libxl via the application's event
+ *    callback hook.
  *
  *    Public functions have names like libxl_foobar.
  *
@@ -152,6 +155,8 @@ void libxl_key_value_list_destroy(libxl_key_value_list *kvl);
 
 typedef uint32_t libxl_hwcap[8];
 
+typedef uint64_t libxl_ev_user;
+
 typedef struct {
     uint32_t size;          /* number of bytes in map */
     uint8_t *map;
@@ -200,6 +205,9 @@ typedef struct {
     int v;
 } libxl_enum_string_table;
 
+struct libxl_event;
+typedef LIBXL_TAILQ_ENTRY(struct libxl_event) libxl_ev_link;
+
 typedef struct libxl__ctx libxl_ctx;
 
 #include "_libxl_types.h"
@@ -295,51 +303,6 @@ int libxl_run_bootloader(libxl_ctx *ctx,
 
   /* 0 means ERROR_ENOMEM, which we have logged */
 
-/* events handling */
-
-typedef struct {
-    /* event type */
-    libxl_event_type type;
-    /* data for internal use of the library */
-    char *path;
-    char *token;
-} libxl_event;
-
-typedef struct {
-    char *path;
-    char *token;
-} libxl_waiter;
-
-
-int libxl_get_wait_fd(libxl_ctx *ctx, int *fd);
-/* waiter is allocated by the caller */
-int libxl_wait_for_domain_death(libxl_ctx *ctx, uint32_t domid, libxl_waiter *waiter);
-/* waiter is a preallocated array of num_disks libxl_waiter elements */
-int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disks, int num_disks, libxl_waiter *waiter);
-int libxl_get_event(libxl_ctx *ctx, libxl_event *event);
-int libxl_stop_waiting(libxl_ctx *ctx, libxl_waiter *waiter);
-int libxl_free_event(libxl_event *event);
-int libxl_free_waiter(libxl_waiter *waiter);
-
-/*
- * Returns:
- *  - 0 if the domain is dead but there is no cleanup to be done. e.g
- *    because someone else has already done it.
- *  - 1 if the domain is dead and there is cleanup to be done.
- *
- * Can return error if the domain exists and is still running.
- *
- * *info will contain valid domain state iff 1 is returned. In
- * particular if 1 is returned then info->shutdown_reason is
- * guaranteed to be valid since by definition the domain is
- * (shutdown||dying))
- */
-int libxl_event_get_domain_death_info(libxl_ctx *ctx, uint32_t domid, libxl_event *event, libxl_dominfo *info);
-
-/*
- * Returns true and fills *disk if the caller should eject the disk
- */
-int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event *event, libxl_device_disk *disk);
 
 int libxl_domain_rename(libxl_ctx *ctx, uint32_t domid,
                         const char *old_name, const char *new_name);
diff --git a/tools/libxl/libxl_event.c b/tools/libxl/libxl_event.c
index 9283b04..9b0b6e0 100644
--- a/tools/libxl/libxl_event.c
+++ b/tools/libxl/libxl_event.c
@@ -487,9 +487,9 @@ void libxl__ev_xswatch_deregister(libxl__gc *gc, libxl__ev_xswatch *w) {
  * osevent poll
  */
 
-int libxl_osevent_beforepoll(libxl_ctx *ctx, int *nfds_io,
-                             struct pollfd *fds, int *timeout_upd,
-                             struct timeval now) {
+static int beforepoll_unlocked(libxl__gc *gc, int *nfds_io,
+                               struct pollfd *fds, int *timeout_upd,
+                               struct timeval now) {
     libxl__ev_fd *efd;
     int i;
 
@@ -500,9 +500,6 @@ int libxl_osevent_beforepoll(libxl_ctx *ctx, int *nfds_io,
      * the fds array corresponds to a slot in fd_beforepolled.
      */
 
-    GC_INIT(ctx);
-    MUTEX_LOCK;
-
     if (*nfds_io) {
         /*
          * As an optimisation, we don't touch fd_beforepolled_used
@@ -574,16 +571,25 @@ int libxl_osevent_beforepoll(libxl_ctx *ctx, int *nfds_io,
             *timeout_upd = our_timeout;
     }
 
-    MUTEX_UNLOCK;
-    GC_FREE;
     return rc;
 }
 
-void libxl_osevent_afterpoll(libxl_ctx *ctx, int nfds, const struct pollfd *fds,
+int libxl_osevent_beforepoll(libxl_ctx *ctx, int *nfds_io,
+                             struct pollfd *fds, int *timeout_upd,
                              struct timeval now) {
-    int i;
+
     GC_INIT(ctx);
     MUTEX_LOCK;
+    int rc = beforepoll_unlocked(gc, nfds_io, fds, timeout_upd, now);
+    MUTEX_UNLOCK;
+    GC_FREE;
+    return rc;
+}
+
+static void afterpoll_unlocked(libxl__gc *gc,
+                               int nfds, const struct pollfd *fds,
+                               struct timeval now) {
+    int i;
 
     assert(nfds <= CTX->fd_beforepolled_used);
 
@@ -619,12 +625,17 @@ void libxl_osevent_afterpoll(libxl_ctx *ctx, int nfds, const struct pollfd *fds,
 
         etime->func(gc, etime, &etime->abs);
     }
+}
 
+void libxl_osevent_afterpoll(libxl_ctx *ctx, int nfds, const struct pollfd *fds,
+                             struct timeval now) {
+    GC_INIT(ctx);
+    MUTEX_LOCK;
+    afterpoll_unlocked(gc, nfds, fds, now);
     MUTEX_UNLOCK;
     GC_FREE;
 }
 
-
 /*
  * osevent hook and callback machinery
  */
@@ -682,11 +693,10 @@ void libxl__event_disaster(libxl__gc *gc, const char *msg, int errnoval,
                type ? libxl_event_type_to_string(type) : "",
                type ? ")" : "");
 
-    /*
-     * FIXME: This should call the "disaster" hook supplied to
-     * libxl_event_register_callbacks, which will be introduced in the
-     * next patch.
-     */
+    if (CTX->event_hooks && CTX->event_hooks->disaster) {
+        CTX->event_hooks->disaster(CTX->event_hooks_user, type, msg, errnoval);
+        return;
+    }
 
     const char verybad[] =
         "DISASTER in event loop not handled by libxl application";
@@ -696,6 +706,146 @@ void libxl__event_disaster(libxl__gc *gc, const char *msg, int errnoval,
 }
 
 /*
+ * Event retrieval etc.
+ */
+
+void libxl_event_register_callbacks(libxl_ctx *ctx,
+                  const libxl_event_hooks *hooks, void *user) {
+    ctx->event_hooks = hooks;
+    ctx->event_hooks_user = user;
+}
+
+void libxl__event_occurred(libxl__gc *gc, libxl_event *event) {
+    if (CTX->event_hooks &&
+        (CTX->event_hooks->event_occurs_mask & (1UL << event->type))) {
+        /* libxl__free_all will call the callback, just before exit
+         * from libxl.  This helps avoid reentrancy bugs: parts of
+         * libxl that call libxl__event_occurred do not have to worry
+         * that libxl might be reentered at that point. */
+        LIBXL_TAILQ_INSERT_TAIL(&gc->occurred_for_callback, event, link);
+        return;
+    } else {
+        LIBXL_TAILQ_INSERT_TAIL(&CTX->occurred, event, link);
+    }
+}
+
+libxl_event *libxl__event_new(libxl__gc *gc,
+                              libxl_event_type type, uint32_t domid) {
+    libxl_event *ev;
+
+    ev = malloc(sizeof(*ev));
+    if (!ev) {
+        LIBXL__EVENT_DISASTER(gc, "allocate new event", errno, type);
+        return NULL;
+    }
+
+    memset(ev, 0, sizeof(*ev));
+    ev->type = type;
+    ev->domid = domid;
+
+    return ev;
+}
+
+static int event_check_unlocked(libxl__gc *gc, libxl_event **event_r,
+                                unsigned long typemask,
+                                libxl_event_predicate *pred, void *pred_user) {
+    libxl_event *ev;
+    int rc;
+
+    LIBXL_TAILQ_FOREACH(ev, &CTX->occurred, link) {
+        if (!(typemask & (1UL << ev->type)))
+            continue;
+
+        if (pred && !pred(ev, pred_user))
+            continue;
+
+        /* got one! */
+        LIBXL_TAILQ_REMOVE(&CTX->occurred, ev, link);
+        *event_r = ev;
+        rc = 0;
+        goto out;
+    }
+    rc = ERROR_NOT_READY;
+
+ out:
+    return rc;
+}
+
+int libxl_event_check(libxl_ctx *ctx, libxl_event **event_r,
+                      unsigned long typemask,
+                      libxl_event_predicate *pred, void *pred_user) {
+    GC_INIT(ctx);
+    MUTEX_LOCK;
+    int rc = event_check_unlocked(gc, event_r, typemask, pred, pred_user);
+    MUTEX_UNLOCK;
+    GC_FREE;
+    return rc;
+}
+
+int libxl_event_wait(libxl_ctx *ctx, libxl_event **event_r,
+                     unsigned long typemask,
+                     libxl_event_predicate *pred, void *pred_user) {
+    int rc;
+    struct timeval now;
+
+    GC_INIT(ctx);
+    MUTEX_LOCK;
+
+    for (;;) {
+        rc = event_check_unlocked(gc, event_r, typemask, pred, pred_user);
+        if (rc != ERROR_NOT_READY) goto out;
+
+        rc = libxl__gettimeofday(gc, &now);
+        if (rc) goto out;
+
+        int timeout;
+
+        for (;;) {
+            int nfds = CTX->fd_polls_allocd;
+            timeout = -1;
+            rc = beforepoll_unlocked(gc, &nfds, CTX->fd_polls, &timeout, now);
+            if (!rc) break;
+            if (rc != ERROR_BUFFERFULL) goto out;
+            
+            struct pollfd *newarray =
+                (nfds > INT_MAX / sizeof(struct pollfd) / 2) ? 0 :
+                realloc(CTX->fd_polls, sizeof(*newarray) * nfds);
+            
+            if (!newarray) { rc = ERROR_NOMEM; goto out; }
+
+            CTX->fd_polls_allocd = nfds;
+        }
+
+        rc = poll(CTX->fd_polls, CTX->fd_polls_allocd, timeout);
+        if (rc < 0) {
+            if (errno == EINTR) continue;
+            LIBXL__LOG_ERRNOVAL(CTX, LIBXL__LOG_ERROR, errno, "poll failed");
+            rc = ERROR_FAIL;
+            goto out;
+        }
+
+        rc = libxl__gettimeofday(gc, &now);
+        if (rc) goto out;
+
+        afterpoll_unlocked(gc, CTX->fd_polls_allocd, CTX->fd_polls, now);
+
+        /* we unlock and free the gc each time we go through this loop,
+         * so that (a) we don't accumulate garbage and (b) any events
+         * which are to be dispatched by callback are actually delivered
+         * in a timely fashion.
+         */
+        MUTEX_UNLOCK;
+        libxl__free_all(gc);
+        MUTEX_LOCK;
+    }
+
+ out:
+    MUTEX_UNLOCK;
+    GC_FREE;
+    return rc;
+}
+
+/*
  * Local variables:
  * mode: C
  * c-basic-offset: 4
diff --git a/tools/libxl/libxl_event.h b/tools/libxl/libxl_event.h
index 48c6277..c52addc 100644
--- a/tools/libxl/libxl_event.h
+++ b/tools/libxl/libxl_event.h
@@ -18,6 +18,178 @@
 
 #include <libxl.h>
 
+/*======================================================================*/
+
+/*
+ * Domain event handling - getting Xen events from libxl
+ */
+
+#define LIBXL_EVENTMASK_ALL (~(unsigned long)0)
+
+typedef int libxl_event_predicate(const libxl_event*, void *user);
+  /* Return value is 0 if the event is unwanted or non-0 if it is.
+   * Predicates are not allowed to fail.
+   */
+
+int libxl_event_check(libxl_ctx *ctx, libxl_event **event_r,
+                      unsigned long typemask,
+                      libxl_event_predicate *predicate, void *predicate_user);
+  /* Searches for an event, already-happened, which matches typemask
+   * and predicate.  predicate==0 matches any event.
+   * libxl_event_check returns the event, which must then later be
+   * freed by the caller using libxl_event_free.
+   *
+   * Returns ERROR_NOT_READY if no such event has happened.
+   */
+
+int libxl_event_wait(libxl_ctx *ctx, libxl_event **event_r,
+                     unsigned long typemask,
+                     libxl_event_predicate *predicate, void *predicate_user);
+  /* Like libxl_event_check but blocks if no suitable events are
+   * available, until some are.  Uses libxl_osevent_beforepoll/
+   * _afterpoll so may be inefficient if very many domains are being
+   * handled by a single program.
+   */
+
+int libxl_event_free(libxl_ctx *ctx, libxl_event *event);
+
+
+/* Alternatively or additionally, the application may also use this: */
+
+typedef struct libxl_event_hooks {
+    uint64_t event_occurs_mask;
+    void (*event_occurs)(void *user, const libxl_event *event);
+    void (*disaster)(void *user, libxl_event_type type,
+                     const char *msg, int errnoval);
+} libxl_event_hooks;
+
+void libxl_event_register_callbacks(libxl_ctx *ctx,
+                                    const libxl_event_hooks *hooks, void *user);
+  /*
+   * Arranges that libxl will henceforth call event_occurs for any
+   * events whose type is set in event_occurs_mask, rather than
+   * queueing the event for retrieval by libxl_event_check/wait.
+   * Events whose bit is clear in mask are not affected.
+   *
+   * event becomes owned by the application and must be freed, either
+   * by event_occurs or later.
+   *
+   * event_occurs may be NULL if mask is 0.
+   *
+   * libxl_event_register_callback also provides a way for libxl to
+   * report to the application that there was a problem reporting
+   * events; this can occur due to lack of host memory during event
+   * handling, or other wholly unrecoverable errors from system calls
+   * made by libxl.  This will not happen for frivolous reasons - only
+   * if the system, or the Xen components of it, are badly broken.
+   *
+   * msg and errnoval will describe the action that libxl was trying
+   * to do, and type specifies the type of libxl events which may be
+   * missing.  type may be 0 in which case events of all types may be
+   * missing.
+   *
+   * disaster may be NULL.  If it is, or if _register_callbacks has
+   * not been called, errors of this kind are fatal to the entire
+   * application: libxl will print messages to its logs and to stderr
+   * and call exit(-1).
+   *
+   * If disaster returns, it may be the case that some or all future
+   * libxl calls will return errors; likewise it may be the case that
+   * no more events (of the specified type, if applicable) can be
+   * produced.  An application which supplies a disaster function
+   * should normally react either by exiting, or by (when it has
+   * returned to its main event loop) shutting down libxl with
+   * libxl_ctx_free and perhaps trying to restart it with
+   * libxl_ctx_init.
+   *
+   * In any case before calling disaster, libxl will have logged a
+   * message with level XTL_CRITICAL.
+   *
+   * Reentrancy: it IS permitted to call libxl from within
+   * event_occurs.  It is NOT permitted to call libxl from within
+   * disaster.
+   *
+   * libxl_event_register_callbacks may be called as many times, with
+   * different parameters, as the application likes; the most recent
+   * call determines the libxl behaviour.  However it is NOT safe to
+   * call _register_callbacks concurrently with, or reentrantly from,
+   * any other libxl function.
+   *
+   * Calls to _register_callbacks do not affect events which have
+   * already occurred.
+   */
+
+
+/*
+ * Events are only generated if they have been requested.
+ * The following functions request the generation of specific events.
+ *
+ * Each set of functions for controlling event generation has this form:
+ *
+ *   typedef struct libxl__evgen_FOO libxl__evgen_FOO;
+ *   int libxl_evenable_FOO(libxl_ctx *ctx, FURTHER PARAMETERS,
+ *                          libxl_ev_user user, libxl__evgen_FOO **evgen_out);
+ *   void libxl_evdisable_FOO(libxl_ctx *ctx, libxl__evgen_FOO *evgen);
+ *
+ * The evenable function arranges that the events (as described in the
+ * doc comment for the individual function) will start to be generated
+ * by libxl.  On success, *evgen_out is set to a non-null pointer to
+ * an opaque struct.
+ *
+ * The user value is returned in the generated events and may be
+ * used by the caller for whatever it likes.  The type ev_user is
+ * guaranteed to be an unsigned integer type which is at least
+ * as big as uint64_t and is also guaranteed to be big enough to
+ * contain any intptr_t value.
+ *
+ * If it becomes desirable to stop generation of the relevant events,
+ * or to reclaim the resources in libxl associated with the evgen
+ * structure, the same evgen value should be passed to the evdisable
+ * function.  However, note that events which occurred prior to the
+ * evdisable call may still be returned.
+ *
+ * The caller may enable identical events more than once.  If they do
+ * so, each actual occurrence will generate several events to be
+ * returned by libxl_event_check, with the appropriate user value(s).
+ * Aside from this, each occurrence of each event is returned by
+ * libxl_event_check exactly once.
+ *
+ * An evgen is associated with the libxl_ctx used for its creation.
+ * After libxl_ctx_free, all corresponding evgen handles become
+ * invalid and must no longer be passed to evdisable.
+ *
+ * Events enabled with evenable prior to a fork and libxl_ctx_postfork
+ * are no longer generated after the fork/postfork; however the evgen
+ * structures are still valid and must be passed to evdisable if the
+ * memory they use should not be leaked.
+ *
+ * Applications should ensure that they eventually retrieve every
+ * event using libxl_event_check or libxl_event_wait, since events
+ * which occur but are not retreived by the application will be queued
+ * inside libxl indefinitely.  libxl_event_check/_wait may be O(n)
+ * where n is the number of queued events which do not match the
+ * criteria specified in the arguments to check/wait.
+ */
+
+typedef struct libxl__evgen_domain_death libxl_evgen_domain_death;
+int libxl_evenable_domain_death(libxl_ctx *ctx, uint32_t domid,
+                         libxl_ev_user, libxl_evgen_domain_death **evgen_out);
+void libxl_evdisable_domain_death(libxl_ctx *ctx, libxl_evgen_domain_death*);
+  /* Arranges for the generation of DOMAIN_SHUTDOWN and DOMAIN_DESTROY
+   * events.  A domain which is destroyed before it shuts down
+   * may generate only a DESTROY event.
+   */
+
+typedef struct libxl__evgen_disk_eject libxl_evgen_disk_eject;
+int libxl_evenable_disk_eject(libxl_ctx *ctx, uint32_t domid, const char *vdev,
+                        libxl_ev_user, libxl_evgen_disk_eject **evgen_out);
+void libxl_evdisable_disk_eject(libxl_ctx *ctx, libxl_evgen_disk_eject*);
+  /* Arranges for the generation of DISK_EJECT events.  A copy of the
+   * string *vdev will be made for libxl's internal use, and a pointer
+   * to this (or some other) copy will be returned as the vdev
+   * member of event.u.
+   */
+
 
 /*======================================================================*/
 
diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
index 62e7fba..202ba89 100644
--- a/tools/libxl/libxl_internal.c
+++ b/tools/libxl/libxl_internal.c
@@ -74,6 +74,12 @@ void libxl__free_all(libxl__gc *gc)
     free(gc->alloc_ptrs);
     gc->alloc_ptrs = 0;
     gc->alloc_maxsize = 0;
+
+    libxl_event *ev, *ev_tmp;
+    LIBXL_TAILQ_FOREACH_SAFE(ev, &gc->occurred_for_callback, link, ev_tmp) {
+        LIBXL_TAILQ_REMOVE(&gc->occurred_for_callback, ev, link);
+        CTX->event_hooks->event_occurs(CTX->event_hooks_user, ev);
+    }
 }
 
 void *libxl__zalloc(libxl__gc *gc, int bytes)
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 07bbe8d..51b807b 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -154,18 +154,56 @@ typedef struct libxl__ev_watch_slot {
     
 libxl__ev_xswatch *libxl__watch_slot_contents(libxl__gc *gc, int slotnum);
 
+
+/*
+ * evgen structures, which are the state we use for generating
+ * events for the caller.
+ *
+ * In general in each case there's an internal and an external
+ * version of the _evdisable_FOO function; the internal one is
+ * used during cleanup.
+ */
+
+struct libxl__evgen_domain_death {
+    uint32_t domid;
+    unsigned shutdown_reported:1, death_reported:1;
+    LIBXL_TAILQ_ENTRY(libxl_evgen_domain_death) entry;
+        /* on list .death_reported ? CTX->death_list : CTX->death_reported */
+    libxl_ev_user user;
+};
+_hidden void
+libxl__evdisable_domain_death(libxl__gc*, libxl_evgen_domain_death*);
+
+struct libxl__evgen_disk_eject {
+    libxl__ev_xswatch watch;
+    uint32_t domid;
+    libxl_ev_user user;
+    char *vdev;
+};
+_hidden void
+libxl__evdisable_disk_eject(libxl__gc*, libxl_evgen_disk_eject*);
+
+
 struct libxl__ctx {
     xentoollog_logger *lg;
     xc_interface *xch;
     struct xs_handle *xsh;
 
+    const libxl_event_hooks *event_hooks;
+    void *event_hooks_user;
+
     pthread_mutex_t lock; /* protects data structures hanging off the ctx */
       /* always use MUTEX_LOCK and MUTEX_UNLOCK to manipulate this */
 
+    LIBXL_TAILQ_HEAD(, libxl_event) occurred;
+
     int osevent_in_hook;
     const libxl_osevent_hooks *osevent_hooks;
     void *osevent_user;
 
+    struct pollfd *fd_polls;
+    int fd_polls_allocd;
+
     int fd_beforepolled_allocd, fd_beforepolled_used;
     libxl__ev_fd **fd_beforepolled; /* see libxl_osevent_beforepoll */
     LIBXL_LIST_HEAD(, libxl__ev_fd) efds;
@@ -177,6 +215,11 @@ struct libxl__ctx {
     uint32_t watch_counter; /* helps disambiguate slot reuse */
     libxl__ev_fd watch_efd;
 
+    LIBXL_TAILQ_HEAD(libxl__evgen_domain_death_list, libxl_evgen_domain_death)
+        death_list /* sorted by domid */,
+        death_reported;
+    libxl__ev_xswatch death_watch;
+    
     /* for callers who reap children willy-nilly; caller must only
      * set this after libxl_init and before any other call - or
      * may leave them untouched */
@@ -221,6 +264,7 @@ struct libxl__gc {
     int alloc_maxsize;
     void **alloc_ptrs;
     libxl_ctx *owner;
+    LIBXL_TAILQ_HEAD(, libxl_event) occurred_for_callback;
 };
 
 #define LIBXL_INIT_GC(ctx) (libxl__gc){ .alloc_maxsize = 0, .alloc_ptrs = 0, .owner = ctx }
@@ -392,6 +436,25 @@ static inline int libxl__ev_xswatch_isregistered(const libxl__ev_xswatch *xw)
 
 
 
+/*
+ * Other event-handling support provided by the libxl event core to
+ * the rest of libxl.
+ */
+
+_hidden void libxl__event_occurred(libxl__gc*, libxl_event *event);
+  /* Arranges to notify the application that the event has occurred.
+   * event should be suitable for passing to libxl_event_free. */
+
+_hidden libxl_event *libxl__event_new(libxl__gc*, libxl_event_type,
+                                      uint32_t domid);
+  /* Convenience function.
+   * Allocates a new libxl_event, fills in domid and type.
+   * If allocation fails, calls _disaster, and returns NULL. */
+
+#define NEW_EVENT(gc, type, domid)                              \
+    libxl__event_new((gc), LIBXL_EVENT_TYPE_##type, (domid));
+    /* Convenience macro. */
+
 _hidden void libxl__event_disaster(libxl__gc*, const char *msg, int errnoval,
                                    libxl_event_type type /* may be 0 */,
                                    const char *file, int line);
@@ -403,6 +466,9 @@ _hidden void libxl__event_disaster(libxl__gc*, const char *msg, int errnoval,
    * libxl__ev_FOO_callback or an application event), but are
    * prevented from doing so due to eg lack of memory.
    *
+   * See the "disaster" member of libxl_event_hooks and associated
+   * comment in libxl_event.h.
+   *
    * NB that this function may return and the caller isn't supposed to
    * then crash, although it may fail (and henceforth leave things in
    * a state where many or all calls fail).
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 93fb8cd..53c07ee 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -75,11 +75,6 @@ libxl_action_on_shutdown = Enumeration("action_on_shutdown", [
     (6, "COREDUMP_RESTART"),
     ])
 
-libxl_event_type = Enumeration("event_type", [
-    (1, "DOMAIN_DEATH"),
-    (2, "DISK_EJECT"),
-    ])
-
 libxl_button = Enumeration("button", [
     (1, "POWER"),
     (2, "SLEEP"),
@@ -374,3 +369,33 @@ libxl_sched_credit = Struct("sched_credit", [
     ("weight", integer),
     ("cap", integer),
     ], destructor_fn=None)
+
+libxl_event_type = Enumeration("event_type", [
+    (1, "DOMAIN_SHUTDOWN"),
+    (2, "DOMAIN_DESTROY"),
+    (3, "DISK_EJECT"),
+    ])
+
+libxl_ev_user = Number("libxl_ev_user")
+
+libxl_ev_link = Builtin("ev_link", passby=PASS_BY_REFERENCE, c_only=True)
+
+libxl_event = Struct("event",[
+    ("link",     libxl_ev_link,0,
+     "for use by libxl; caller may use this once the event has been"
+     " returned by libxl_event_{check,wait}"),
+    ("domid",    libxl_domid),
+    ("domuuid",  libxl_uuid),
+    ("for_user", libxl_ev_user),
+    ("type",     libxl_event_type),
+    ("u", KeyedUnion(None, libxl_event_type, "type",
+          [("domain_shutdown", Struct(None, [
+                                             ("shutdown_reason", uint8),
+                                      ])),
+           ("domain_destroy", Struct(None, [])),
+           ("disk_eject", Struct(None, [
+                                        ("vdev", string),
+                                        ("disk", libxl_device_disk),
+                                 ])),
+           ]))])
+
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index a890ef1..4c4ad69 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -1135,14 +1135,16 @@ skip_vfb:
     xlu_cfg_destroy(config);
 }
 
-/* Returns 1 if domain should be restarted, 2 if domain should be renamed then restarted  */
-static int handle_domain_death(libxl_ctx *ctx, uint32_t domid, libxl_event *event,
-                               libxl_domain_config *d_config, libxl_dominfo *info)
+/* Returns 1 if domain should be restarted,
+ * 2 if domain should be renamed then restarted, or 0 */
+static int handle_domain_death(libxl_ctx *ctx, uint32_t domid,
+                               libxl_event *event,
+                               libxl_domain_config *d_config)
 {
     int restart = 0;
     libxl_action_on_shutdown action;
 
-    switch (info->shutdown_reason) {
+    switch (event->u.domain_shutdown.shutdown_reason) {
     case SHUTDOWN_poweroff:
         action = d_config->on_poweroff;
         break;
@@ -1159,11 +1161,14 @@ static int handle_domain_death(libxl_ctx *ctx, uint32_t domid, libxl_event *even
         action = d_config->on_watchdog;
         break;
     default:
-        LOG("Unknown shutdown reason code %d. Destroying domain.", info->shutdown_reason);
+        LOG("Unknown shutdown reason code %d. Destroying domain.",
+            event->u.domain_shutdown.shutdown_reason);
         action = LIBXL_ACTION_ON_SHUTDOWN_DESTROY;
     }
 
-    LOG("Action for shutdown reason code %d is %s", info->shutdown_reason, action_on_shutdown_names[action]);
+    LOG("Action for shutdown reason code %d is %s",
+        event->u.domain_shutdown.shutdown_reason,
+        action_on_shutdown_names[action]);
 
     if (action == LIBXL_ACTION_ON_SHUTDOWN_COREDUMP_DESTROY || action == LIBXL_ACTION_ON_SHUTDOWN_COREDUMP_RESTART) {
         char *corefile;
@@ -1228,7 +1233,7 @@ static void replace_string(char **str, const char *val)
 
 
 static int preserve_domain(libxl_ctx *ctx, uint32_t domid, libxl_event *event,
-                           libxl_domain_config *d_config, libxl_dominfo *info)
+                           libxl_domain_config *d_config)
 {
     time_t now;
     struct tm tm;
@@ -1340,6 +1345,24 @@ static int autoconnect_console(libxl_ctx *ctx, uint32_t domid, void *priv)
     _exit(1);
 }
 
+static int domain_wait_event(libxl_event **event_r) {
+    int ret;
+    for (;;) {
+        ret = libxl_event_wait(ctx, event_r, LIBXL_EVENTMASK_ALL, 0,0);
+        if (ret) {
+            LOG("Domain %d, failed to get event, quitting (rc=%d)", domid, ret);
+            return ret;
+        }
+        if ((*event_r)->domid != domid) {
+            LOG("INTERNAL PROBLEM - ignoring unexpected event for"
+                " domain %d (expected %d)", (*event_r)->domid, domid);
+            libxl_event_free(ctx, *event_r);
+            continue;
+        }
+        return ret;
+    }
+}
+
 static int create_domain(struct domain_create *dom_info)
 {
     libxl_domain_config d_config;
@@ -1353,10 +1376,11 @@ static int create_domain(struct domain_create *dom_info)
     const char *restore_file = dom_info->restore_file;
     int migrate_fd = dom_info->migrate_fd;
 
-    int fd, i;
+    int i;
     int need_daemon = daemonize;
     int ret, rc;
-    libxl_waiter *w1 = NULL, *w2 = NULL;
+    libxl_evgen_domain_death *deathw = NULL;
+    libxl_evgen_disk_eject **diskws = NULL; /* one per disk */
     void *config_data = 0;
     int config_len = 0;
     int restore_fd = -1;
@@ -1604,92 +1628,104 @@ start:
     }
     LOG("Waiting for domain %s (domid %d) to die [pid %ld]",
         d_config.c_info.name, domid, (long)getpid());
-    w1 = (libxl_waiter*) xmalloc(sizeof(libxl_waiter) * d_config.num_disks);
-    w2 = (libxl_waiter*) xmalloc(sizeof(libxl_waiter));
-    libxl_wait_for_disk_ejects(ctx, domid, d_config.disks, d_config.num_disks, w1);
-    libxl_wait_for_domain_death(ctx, domid, w2);
-    libxl_get_wait_fd(ctx, &fd);
-    while (1) {
-        int ret;
-        fd_set rfds;
-        libxl_dominfo info;
-        libxl_event event;
-        libxl_device_disk disk;
 
-        FD_ZERO(&rfds);
-        FD_SET(fd, &rfds);
+    ret = libxl_evenable_domain_death(ctx, domid, 0, &deathw);
+    if (ret) goto error_out;
 
-        ret = select(fd + 1, &rfds, NULL, NULL, NULL);
-        if (!ret)
-            continue;
-        libxl_get_event(ctx, &event);
-        switch (event.type) {
-            case LIBXL_EVENT_TYPE_DOMAIN_DEATH:
-                ret = libxl_event_get_domain_death_info(ctx, domid, &event, &info);
-
-                if (ret < 0) {
-                    libxl_free_event(&event);
-                    continue;
+    if (!diskws) {
+        diskws = xmalloc(sizeof(*diskws) * d_config.num_disks);
+        for (i = 0; i < d_config.num_disks; i++)
+            diskws[i] = NULL;
+    }
+    for (i = 0; i < d_config.num_disks; i++) {
+        ret = libxl_evenable_disk_eject(ctx, domid, d_config.disks[i].vdev,
+                                        0, &diskws[i]);
+        if (ret) goto error_out;
+    }
+    while (1) {
+        libxl_event *event;
+        ret = domain_wait_event(&event);
+        if (ret) goto error_out;
+
+        switch (event->type) {
+
+        case LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN:
+            LOG("Domain %d has shut down, reason code %d 0x%x", domid,
+                event->u.domain_shutdown.shutdown_reason,
+                event->u.domain_shutdown.shutdown_reason);
+            switch (handle_domain_death(ctx, domid, event, &d_config)) {
+            case 2:
+                if (!preserve_domain(ctx, domid, event, &d_config)) {
+                    /* If we fail then exit leaving the old domain in place. */
+                    ret = -1;
+                    goto out;
                 }
 
-                LOG("Domain %d is dead", domid);
-
-                if (ret) {
-                    switch (handle_domain_death(ctx, domid, &event, &d_config, &info)) {
-                    case 2:
-                        if (!preserve_domain(ctx, domid, &event, &d_config, &info)) {
-                            /* If we fail then exit leaving the old domain in place. */
-                            ret = -1;
-                            goto out;
-                        }
-
-                        /* Otherwise fall through and restart. */
-                    case 1:
-
-                        for (i = 0; i < d_config.num_disks; i++)
-                            libxl_free_waiter(&w1[i]);
-                        libxl_free_waiter(w2);
-                        free(w1);
-                        free(w2);
-
-                        /*
-                         * Do not attempt to reconnect if we come round again due to a
-                         * guest reboot -- the stdin/out will be disconnected by then.
-                         */
-                        dom_info->console_autoconnect = 0;
-
-                        /* Some settings only make sense on first boot. */
-                        paused = 0;
-                        if (common_domname
-                            && strcmp(d_config.c_info.name, common_domname)) {
-                            d_config.c_info.name = strdup(common_domname);
-                        }
-
-                        /*
-                         * XXX FIXME: If this sleep is not there then domain
-                         * re-creation fails sometimes.
-                         */
-                        LOG("Done. Rebooting now");
-                        sleep(2);
-                        goto start;
-                    case 0:
-                        LOG("Done. Exiting now");
-                        ret = 0;
-                        goto out;
-                    }
-                } else {
-                    LOG("Unable to get domain death info, quitting");
-                    goto out;
+                /* Otherwise fall through and restart. */
+            case 1:
+                libxl_event_free(ctx, event);
+                libxl_evdisable_domain_death(ctx, deathw);
+                deathw = NULL;
+                for (i = 0; i < d_config.num_disks; i++) {
+                    libxl_evdisable_disk_eject(ctx, diskws[i]);
+                    diskws[i] = NULL;
                 }
-                break;
-            case LIBXL_EVENT_TYPE_DISK_EJECT:
-                if (libxl_event_get_disk_eject_info(ctx, domid, &event, &disk)) {
-                    libxl_cdrom_insert(ctx, domid, &disk);
-                    libxl_device_disk_destroy(&disk);
+                /* discard any other events which may have been generated */
+                while (!(ret = libxl_event_check(ctx, &event,
+                                                 LIBXL_EVENTMASK_ALL, 0,0))) {
+                    libxl_event_free(ctx, event);
                 }
-                break;
+                if (ret != ERROR_NOT_READY) {
+                    LOG("warning, libxl_event_check (cleanup) failed (rc=%d)",
+                        ret);
+                }
+
+                /*
+                 * Do not attempt to reconnect if we come round again due to a
+                 * guest reboot -- the stdin/out will be disconnected by then.
+                 */
+                dom_info->console_autoconnect = 0;
+
+                /* Some settings only make sense on first boot. */
+                paused = 0;
+                if (common_domname
+                    && strcmp(d_config.c_info.name, common_domname)) {
+                    d_config.c_info.name = strdup(common_domname);
+                }
+
+                /*
+                 * XXX FIXME: If this sleep is not there then domain
+                 * re-creation fails sometimes.
+                 */
+                LOG("Done. Rebooting now");
+                sleep(2);
+                goto start;
+
+            case 0:
+                LOG("Done. Exiting now");
+                ret = 0;
+                goto out;
+
+            default:
+                abort();
+            }
+
+        case LIBXL_EVENT_TYPE_DOMAIN_DESTROY:
+            LOG("Domain %d has been destroyed.", domid);
+            ret = 0;
+            goto out;
+
+        case LIBXL_EVENT_TYPE_DISK_EJECT:
+            /* XXX what is this for? */
+            libxl_cdrom_insert(ctx, domid, &event->u.disk_eject.disk);
+            libxl_device_disk_destroy(&event->u.disk_eject.disk);
+            break;
+
+        default:
+            LOG("warning, got unexpected event type %d", event->type);
         }
-        libxl_free_event(&event);
+
+        libxl_event_free(ctx, event);
     }
 
 error_out:
@@ -2163,43 +2199,46 @@ static void destroy_domain(const char *p)
 static void shutdown_domain(const char *p, int wait)
 {
     int rc;
+    libxl_event *event;
 
     find_domain(p);
     rc=libxl_domain_shutdown(ctx, domid, 0);
     if (rc) { fprintf(stderr,"shutdown failed (rc=%d)\n",rc);exit(-1); }
 
     if (wait) {
-        libxl_waiter waiter;
-        int fd;
-
-        libxl_wait_for_domain_death(ctx, domid, &waiter);
+        libxl_evgen_domain_death *deathw;
 
-        libxl_get_wait_fd(ctx, &fd);
-
-        while (wait) {
-            fd_set rfds;
-            libxl_event event;
-            libxl_dominfo info;
+        rc = libxl_evenable_domain_death(ctx, domid, 0, &deathw);
+        if (rc) {
+            fprintf(stderr,"wait for death failed (evgen, rc=%d)\n",rc);
+            exit(-1);
+        }
 
-            FD_ZERO(&rfds);
-            FD_SET(fd, &rfds);
+        for (;;) {
+            rc = domain_wait_event(&event);
+            if (rc) exit(-1);
 
-            if (!select(fd + 1, &rfds, NULL, NULL, NULL))
-                continue;
+            switch (event->type) {
 
-            libxl_get_event(ctx, &event);
+            case LIBXL_EVENT_TYPE_DOMAIN_DESTROY:
+                LOG("Domain %d has been destroyed", domid);
+                goto done;
 
-            if (event.type == LIBXL_EVENT_TYPE_DOMAIN_DEATH) {
-                if (libxl_event_get_domain_death_info(ctx, domid, &event, &info) < 0)
-                    continue;
+            case LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN:
+                LOG("Domain %d has been shut down, reason code %d %x", domid,
+                    event->u.domain_shutdown.shutdown_reason,
+                    event->u.domain_shutdown.shutdown_reason);
+                goto done;
 
-                LOG("Domain %d is dead", domid);
-                wait = 0;
+            default:
+                LOG("Unexpected event type %d", event->type);
+                break;
             }
-
-            libxl_free_event(&event);
+            libxl_event_free(ctx, event);
         }
-        libxl_free_waiter(&waiter);
+    done:
+        libxl_event_free(ctx, event);
+        libxl_evdisable_domain_death(ctx, deathw);
     }
 }
 
-- 
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 Fri Oct 28 11:54:16 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 11:54:16 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJrZH-0006fJ-Vl; Fri, 28 Oct 2011 11:54:16 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJrJC-00018i-7s
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 11:37:40 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-13.tower-216.messagelabs.com!1319827043!1457331!13
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15789 invoked from network); 28 Oct 2011 18:37:35 -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;
	28 Oct 2011 18:37:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,419,1315180800"; 
   d="scan'208";a="8652741"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 18:37: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; Fri, 28 Oct 2011 19:37:34 +0100
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
	1RJrJ8-0007EN-Qa; Fri, 28 Oct 2011 18:37:34 +0000
Received: from iwj by mariner.uk.xensource.com with local (Exim 4.72)
	(envelope-from <Ian.Jackson@eu.citrix.com>)	id 1RJrJ8-00041x-Pl;
	Fri, 28 Oct 2011 19:37:34 +0100
From: Ian Jackson <ian.jackson@eu.citrix.com>
To: <xen-devel@lists.xensource.com>
Date: Fri, 28 Oct 2011 19:37:10 +0100
Message-ID: <1319827031-15395-13-git-send-email-ian.jackson@eu.citrix.com>
X-Mailer: git-send-email 1.7.2.5
In-Reply-To: <1319827031-15395-12-git-send-email-ian.jackson@eu.citrix.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>
	<1319827031-15395-11-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-12-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 RFC v2 12/13] libxl: New API for providing OS
	events to libxl
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 provide a new set of functions and related structures
  libxl_osevent_*
which are to be used by event-driven applications to receive
information from libxl about which fds libxl is interested in, and
what timeouts libxl is waiting for, and to pass back to libxl
information about which fds are readable/writeable etc., and which
timeouts have occurred.  Ie, low-level events.

In this patch, this new machinery is still all unused.  Callers will
appear in the next patch in the series, which introduces a new API for
applications to receive high-level events about actual domains etc.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
---
 tools/libxl/Makefile         |    2 +-
 tools/libxl/libxl.c          |   25 ++
 tools/libxl/libxl.h          |    6 +
 tools/libxl/libxl_event.c    |  704 ++++++++++++++++++++++++++++++++++++++++++
 tools/libxl/libxl_event.h    |  185 +++++++++++
 tools/libxl/libxl_internal.h |  212 +++++++++++++-
 6 files changed, 1131 insertions(+), 3 deletions(-)
 create mode 100644 tools/libxl/libxl_event.c
 create mode 100644 tools/libxl/libxl_event.h

diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
index a3727ab..0680812 100644
--- a/tools/libxl/Makefile
+++ b/tools/libxl/Makefile
@@ -38,7 +38,7 @@ LIBXL_LIBS += -lyajl
 LIBXL_OBJS = flexarray.o libxl.o libxl_create.o libxl_dm.o libxl_pci.o \
 			libxl_dom.o libxl_exec.o libxl_xshelp.o libxl_device.o \
 			libxl_internal.o libxl_utils.o libxl_uuid.o libxl_json.o \
-			libxl_qmp.o $(LIBXL_OBJS-y)
+			libxl_qmp.o libxl_event.o $(LIBXL_OBJS-y)
 LIBXL_OBJS += _libxl_types.o libxl_flask.o _libxl_types_internal.o
 
 $(LIBXL_OBJS): CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) $(CFLAGS_libxenstore) $(CFLAGS_libblktapctl)
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index a3c9807..4d619ab 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -56,6 +56,16 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
 
     memcpy(&ctx->lock, &mutex_value, sizeof(ctx->lock));
 
+    ctx->osevent_hooks = 0;
+
+    ctx->fd_beforepolled = 0;
+    LIBXL_LIST_INIT(&ctx->efds);
+    LIBXL_TAILQ_INIT(&ctx->etimes);
+
+    ctx->watch_slots = 0;
+    LIBXL_SLIST_INIT(&ctx->watch_freeslots);
+    libxl__ev_fd_init(&ctx->watch_efd);
+
     if ( stat(XENSTORE_PID_FILE, &stat_buf) != 0 ) {
         LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Is xenstore daemon running?\n"
                      "failed to stat %s", XENSTORE_PID_FILE);
@@ -85,10 +95,25 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
 
 int libxl_ctx_free(libxl_ctx *ctx)
 {
+    int i;
+    GC_INIT(ctx);
+
     if (!ctx) return 0;
+
+    for (i = 0; i < ctx->watch_nslots; i++)
+        assert(!libxl__watch_slot_contents(gc, i));
+    libxl__ev_fd_deregister(gc, &ctx->watch_efd);
+
+    assert(LIBXL_LIST_EMPTY(&ctx->efds));
+    assert(LIBXL_TAILQ_EMPTY(&ctx->etimes));
+
     if (ctx->xch) xc_interface_close(ctx->xch);
     libxl_version_info_destroy(&ctx->version_info);
     if (ctx->xsh) xs_daemon_close(ctx->xsh);
+
+    free(ctx->fd_beforepolled);
+    free(ctx->watch_slots);
+
     return 0;
 }
 
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 5d28ff9..da06ed2 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -137,6 +137,7 @@
 #include <xen/sysctl.h>
 
 #include <libxl_uuid.h>
+#include <_libxl_list.h>
 
 typedef uint8_t libxl_mac[6];
 #define LIBXL_MAC_FMT "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx"
@@ -221,6 +222,9 @@ enum {
     ERROR_INVAL = -6,
     ERROR_BADFAIL = -7,
     ERROR_GUEST_TIMEDOUT = -8,
+    ERROR_NOT_READY = -9,
+    ERROR_OSEVENT_REG_FAIL = -10,
+    ERROR_BUFFERFULL = -11,
 };
 
 #define LIBXL_VERSION 0
@@ -539,6 +543,8 @@ const char *libxl_xen_script_dir_path(void);
 const char *libxl_lock_dir_path(void);
 const char *libxl_run_dir_path(void);
 
+#include <libxl_event.h>
+
 #endif /* LIBXL_H */
 
 /*
diff --git a/tools/libxl/libxl_event.c b/tools/libxl/libxl_event.c
new file mode 100644
index 0000000..9283b04
--- /dev/null
+++ b/tools/libxl/libxl_event.c
@@ -0,0 +1,704 @@
+/*
+ * Copyright (C) 2011      Citrix Ltd.
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+/*
+ * Internal event machinery for use by other parts of libxl
+ */
+
+#include <poll.h>
+
+#include "libxl_internal.h"
+
+#define OSEVENT_HOOK_INTERN(defval, hookname, ...)                      \
+    (CTX->osevent_hooks                                                 \
+     ? (CTX->osevent_in_hook++,                                         \
+        CTX->osevent_hooks->hookname(CTX->osevent_user, __VA_ARGS__),   \
+        CTX->osevent_in_hook--)                                         \
+     : defval)
+
+#define OSEVENT_HOOK(hookname,...)                      \
+    OSEVENT_HOOK_INTERN(0, hookname, __VA_ARGS__)
+
+#define OSEVENT_HOOK_VOID(hookname,...)                 \
+    OSEVENT_HOOK_INTERN((void)0, hookname, __VA_ARGS__)
+
+/*
+ * fd events
+ */
+
+int libxl__ev_fd_register(libxl__gc *gc, libxl__ev_fd *ev,
+                          libxl__ev_fd_callback *func,
+                          int fd, short events) {
+    int rc;
+
+    assert(fd >= 0);
+
+    MUTEX_LOCK;
+
+    rc = OSEVENT_HOOK(fd_register, fd, &ev->for_app_reg, events, ev);
+    if (rc) goto out;
+
+    LIBXL_LIST_INSERT_HEAD(&CTX->efds, ev, entry);
+
+    ev->fd = fd;
+    ev->events = events;
+    ev->in_beforepolled = -1;
+    ev->func = func;
+
+    rc = 0;
+
+ out:
+    MUTEX_UNLOCK;
+    return rc;
+}
+
+int libxl__ev_fd_modify(libxl__gc *gc, libxl__ev_fd *ev, short events) {
+    int rc;
+
+    MUTEX_LOCK;
+    assert(libxl__ev_fd_isregistered(ev));
+
+    rc = OSEVENT_HOOK(fd_modify, ev->fd, &ev->for_app_reg, events);
+    if (rc) goto out;
+
+    ev->events = events;
+
+    rc = 0;
+ out:
+    MUTEX_UNLOCK;
+    return rc;
+}
+
+void libxl__ev_fd_deregister(libxl__gc *gc, libxl__ev_fd *ev) {
+    MUTEX_LOCK;
+
+    if (!libxl__ev_fd_isregistered(ev))
+        goto out;
+
+    OSEVENT_HOOK_VOID(fd_deregister, ev->fd, ev->for_app_reg);
+    LIBXL_LIST_REMOVE(ev, entry);
+    ev->fd = -1;
+
+    if (ev->in_beforepolled >= 0 &&
+        ev->in_beforepolled < CTX->fd_beforepolled_used)
+        /* remove stale reference */
+        CTX->fd_beforepolled[ev->in_beforepolled] = NULL;
+
+ out:
+    MUTEX_UNLOCK;
+}
+
+/*
+ * timeouts
+ */
+
+
+int libxl__gettimeofday(libxl__gc *gc, struct timeval *now_r) {
+    int rc = gettimeofday(now_r, 0);
+    if (rc) {
+        LIBXL__LOG_ERRNO(CTX, LIBXL__LOG_ERROR, "gettimeofday failed");
+        return ERROR_FAIL;
+    }
+    return 0;
+}
+
+static int time_rel_to_abs(libxl__gc *gc, int ms, struct timeval *abs_out) {
+    int rc;
+    struct timeval additional = {
+        .tv_sec = ms / 1000,
+        .tv_usec = (ms % 1000) * 1000
+    };
+    struct timeval now;
+
+    rc = libxl__gettimeofday(gc, &now);
+    if (rc) return rc;
+
+    timeradd(&now, &additional, abs_out);
+    return 0;
+}
+
+static void time_insert_finite(libxl__gc *gc, libxl__ev_time *ev) {
+    libxl__ev_time *evsearch;
+    LIBXL_TAILQ_INSERT_SORTED(&CTX->etimes, entry, ev, evsearch, ,
+                              timercmp(&ev->abs, &evsearch->abs, >));
+    ev->infinite = 0;
+}
+
+static int time_register_finite(libxl__gc *gc, libxl__ev_time *ev,
+                                struct timeval abs) {
+    int rc;
+    
+    rc = OSEVENT_HOOK(timeout_register, &ev->for_app_reg, abs, ev);
+    if (rc) return rc;
+
+    ev->infinite = 0;
+    ev->abs = abs;
+    time_insert_finite(gc, ev);
+
+    return 0;
+}
+
+static void time_deregister(libxl__gc *gc, libxl__ev_time *ev) {
+    if (!ev->infinite) {
+        OSEVENT_HOOK_VOID(timeout_deregister, &ev->for_app_reg);
+        LIBXL_TAILQ_REMOVE(&CTX->etimes, ev, entry);
+    }
+}
+    
+
+int libxl__ev_time_register_abs(libxl__gc *gc, libxl__ev_time *ev,
+                                libxl__ev_time_callback *func,
+                                struct timeval abs) {
+    int rc;
+    
+    MUTEX_LOCK;
+
+    rc = time_register_finite(gc, ev, abs);
+    if (rc) goto out;
+
+    ev->func = func;
+
+    rc = 0;
+ out:
+    MUTEX_UNLOCK;
+    return rc;
+}
+
+
+int libxl__ev_time_register_rel(libxl__gc *gc, libxl__ev_time *ev,
+                                libxl__ev_time_callback *func,
+                                int milliseconds /* as for poll(2) */) {
+    struct timeval abs;
+    int rc;
+
+    MUTEX_LOCK;
+
+    if (milliseconds < 0) {
+        ev->infinite = 1;
+    } else {
+        rc = time_rel_to_abs(gc, milliseconds, &abs);
+        if (rc) goto out;
+
+        rc = time_register_finite(gc, ev, abs);
+        if (rc) goto out;
+    }
+
+    ev->func = func;
+    rc = 0;
+
+ out:
+    MUTEX_UNLOCK;
+    return 0;
+}
+
+int libxl__ev_time_modify_abs(libxl__gc *gc, libxl__ev_time *ev,
+                              struct timeval abs) {
+    int rc;
+
+    MUTEX_LOCK;
+
+    assert(libxl__ev_time_isregistered(ev));
+
+    if (ev->infinite) {
+        rc = time_register_finite(gc, ev, abs);
+        if (rc) goto out;
+    } else {
+        rc = OSEVENT_HOOK(timeout_modify, &ev->for_app_reg, abs);
+        if (rc) goto out;
+
+        LIBXL_TAILQ_REMOVE(&CTX->etimes, ev, entry);
+        ev->abs = abs;
+        time_insert_finite(gc, ev);
+    }
+
+    rc = 0;
+ out:
+    MUTEX_UNLOCK;
+    return rc;
+}
+
+int libxl__ev_time_modify_rel(libxl__gc *gc, libxl__ev_time *ev,
+                              int milliseconds) {
+    struct timeval abs;
+    int rc;
+
+    MUTEX_LOCK;
+
+    assert(libxl__ev_time_isregistered(ev));
+
+    if (milliseconds < 0) {
+        time_deregister(gc, ev);
+        ev->infinite = 1;
+        rc = 0;
+        goto out;
+    }
+
+    rc = time_rel_to_abs(gc, milliseconds, &abs);
+    if (rc) goto out;
+
+    rc = libxl__ev_time_modify_abs(gc, ev, abs);
+    if (rc) goto out;
+
+    rc = 0;
+ out:
+    MUTEX_UNLOCK;
+    return 0;
+}
+
+void libxl__ev_time_deregister(libxl__gc *gc, libxl__ev_time *ev) {
+    MUTEX_LOCK;
+
+    if (!libxl__ev_time_isregistered(ev))
+        goto out;
+        
+    time_deregister(gc, ev);
+    ev->func = 0;
+
+ out:
+    MUTEX_UNLOCK;
+    return;
+}
+
+
+/*
+ * xenstore watches
+ */
+
+libxl__ev_xswatch *libxl__watch_slot_contents(libxl__gc *gc, int slotnum) {
+    libxl__ev_watch_slot *slot = &CTX->watch_slots[slotnum];
+    libxl__ev_watch_slot *slotcontents = LIBXL_SLIST_NEXT(slot, empty);
+
+    if (slotcontents == NULL ||
+        ((uintptr_t)slotcontents >= (uintptr_t)CTX->watch_slots &&
+         (uintptr_t)slotcontents < (uintptr_t)(CTX->watch_slots +
+                                               CTX->watch_nslots)))
+        /* An empty slot has either a NULL pointer (end of the
+         * free list), or a pointer to another entry in the array.
+         * So we can do a bounds check to distinguish empty from
+         * full slots.
+         */
+        /* We need to do the comparisons as uintptr_t because
+         * comparing pointers which are not in the same object is
+         * undefined behaviour; if the compiler managed to figure
+         * out that watch_slots[0..watch_nslots-1] is all of the
+         * whole array object it could prove that the above bounds
+         * check was always true if it was legal, and remove it!
+         *
+         * uintptr_t because even on a machine with signed
+         * pointers, objects do not cross zero; whereas on
+         * machines with unsigned pointers, they may cross
+         * 0x8bazillion.
+         */
+        return NULL;
+
+        /* see comment near libxl__ev_watch_slot definition */
+    return (void*)slotcontents;
+}
+
+static void watchfd_callback(libxl__gc *gc, libxl__ev_fd *ev,
+                             int fd, short events, short revents) {
+    for (;;) {
+        char **event = xs_check_watch(CTX->xsh);
+        if (!event) {
+            if (errno == EAGAIN) break;
+            if (errno == EINTR) continue;
+            LIBXL__EVENT_DISASTER(gc, "cannot check/read watches", errno, 0);
+            return;
+        }
+
+        const char *epath = event[0];
+        const char *token = event[1];
+        int slotnum;
+        uint32_t counterval;
+        int rc = sscanf(token, "%d/%"SCNx32, &slotnum, &counterval);
+        if (rc != 2) {
+            LIBXL__LOG(CTX, LIBXL__LOG_ERROR,
+                       "watch epath=%s token=%s: failed to parse token",
+                       epath, token);
+            /* oh well */
+            goto ignore;
+        }
+        if (slotnum < 0 || slotnum >= CTX->watch_nslots) {
+            /* perhaps in the future we will make the watchslots array shrink */
+            LIBXL__LOG(CTX, LIBXL__LOG_DEBUG, "watch epath=%s token=%s:"
+                       " slotnum %d out of range [0,%d>",
+                       epath, token, slotnum, CTX->watch_nslots);
+            goto ignore;
+        }
+
+        libxl__ev_xswatch *w = libxl__watch_slot_contents(gc, slotnum);
+
+        if (!w) {
+            LIBXL__LOG(CTX, LIBXL__LOG_DEBUG,
+                       "watch epath=%s token=%s: empty slot",
+                       epath, token);
+            goto ignore;
+        }
+        
+        if (w->counterval != counterval) {
+            LIBXL__LOG(CTX, LIBXL__LOG_DEBUG,
+                       "watch epath=%s token=%s: counter != %"PRIx32,
+                       epath, token, w->counterval);
+            goto ignore;
+        }
+
+        /* Now it's possible, though unlikely, that this was an event
+         * from a previous use of the same slot with the same counterval.
+         *
+         * In that case either:
+         *  - the event path is a child of the watch path, in
+         *    which case this watch would really have generated this
+         *    event if it had been registered soon enough and we are
+         *    OK to give this possibly-spurious event to the caller; or
+         * - it is not, in which case we must suppress it as the
+         *   caller should not see events for unrelated paths.
+         *
+         * See also docs/misc/xenstore.txt.
+         */
+        size_t epathlen = strlen(epath);
+        size_t wpathlen = strlen(w->path);
+        if (epathlen < wpathlen ||
+            memcmp(epath, w->path, wpathlen) ||
+            (epathlen > wpathlen && epath[wpathlen] != '/')) {
+            LIBXL__LOG(CTX, LIBXL__LOG_DEBUG,
+                       "watch epath=%s token=%s: not child of wpath=%s",
+                       epath, token, w->path);
+            goto ignore;
+        }
+
+        /* At last, we have checked everything! */
+        LIBXL__LOG(CTX, LIBXL__LOG_DEBUG,
+                   "watch event: epath=%s token=%s wpath=%s w=%p",
+                   epath, token, w->path, w);
+        w->callback(gc, w, w->path, epath);
+
+    ignore:
+        free(event);
+    }
+}
+
+static char *watch_token(libxl__gc *gc, int slotnum, uint32_t counterval) {
+    return libxl__sprintf(gc, "%d/%"PRIx32, slotnum, counterval);
+}
+
+int libxl__ev_xswatch_register(libxl__gc *gc, libxl__ev_xswatch *w,
+                               libxl__ev_xswatch_callback *func,
+                               const char *path /* copied */) {
+    libxl__ev_watch_slot *use = NULL;
+    char *path_copy = NULL;
+    int rc;
+
+    MUTEX_LOCK;
+
+    if (!libxl__ev_fd_isregistered(&CTX->watch_efd)) {
+        rc = libxl__ev_fd_register(gc, &CTX->watch_efd, watchfd_callback,
+                                   xs_fileno(CTX->xsh), POLLIN);
+        if (rc) goto out_rc;
+    }
+
+    if (LIBXL_SLIST_EMPTY(&CTX->watch_freeslots)) {
+        /* Free list is empty so there is not in fact a linked
+         * free list in the array and we can safely realloc it */
+        int newarraysize = (CTX->watch_nslots + 1) << 2;
+        int i;
+        libxl__ev_watch_slot *newarray =
+            realloc(CTX->watch_slots, sizeof(*newarray) * newarraysize);
+        if (!newarray) goto out_nomem;
+        for (i=CTX->watch_nslots; i<newarraysize; i++)
+            LIBXL_SLIST_INSERT_HEAD(&CTX->watch_freeslots,
+                                    &newarray[i], empty);
+        CTX->watch_slots = newarray;
+        CTX->watch_nslots = newarraysize;
+    }
+    use = LIBXL_SLIST_FIRST(&CTX->watch_freeslots);
+    assert(use);
+    LIBXL_SLIST_REMOVE_HEAD(&CTX->watch_freeslots, empty);
+
+    path_copy = strdup(path);
+    if (!path_copy) goto out_nomem;
+
+    int slotnum = use - CTX->watch_slots;
+    w->counterval = CTX->watch_counter++;
+
+    rc = xs_watch(CTX->xsh, path, watch_token(gc, slotnum, w->counterval));
+    if (rc) {
+        LIBXL__LOG_ERRNOVAL(CTX, LIBXL__LOG_ERROR, errno,
+                            "create watch for path %s", path);
+        rc = ERROR_FAIL;
+        goto out_rc;
+    }
+
+    w->slotnum = slotnum;
+    w->path = path_copy;
+    w->callback = func;
+    /* we look a bit behind the curtain of LIBXL_SLIST, to explictly
+     * assign to the pointer that's the next link.  See the comment
+     * by the definitionn of libxl__ev_watch_slot */
+    use->empty.sle_next = (void*)w;
+
+    MUTEX_UNLOCK;
+    return 0;
+
+ out_nomem:
+    rc = ERROR_NOMEM;
+ out_rc:
+    if (use)
+        LIBXL_SLIST_INSERT_HEAD(&CTX->watch_freeslots, use, empty);
+    if (path_copy)
+        free(path_copy);
+    MUTEX_UNLOCK;
+    return rc;
+}
+
+void libxl__ev_xswatch_deregister(libxl__gc *gc, libxl__ev_xswatch *w) {
+    /* it is legal to deregister from within _callback */
+    MUTEX_LOCK;
+
+    if (w->slotnum >= 0) {
+        char *token = watch_token(gc, w->slotnum, w->counterval);
+        int rc = xs_unwatch(CTX->xsh, w->path, token);
+        if (rc)
+            /* Oh well, we will just get watch events forever more
+             * and ignore them.  But we should complain to the log. */
+            LIBXL__LOG_ERRNOVAL(CTX, LIBXL__LOG_ERROR, errno,
+                                "remove watch for path %s", w->path);
+
+        libxl__ev_watch_slot *slot = &CTX->watch_slots[w->slotnum];
+        LIBXL_SLIST_INSERT_HEAD(&CTX->watch_freeslots, slot, empty);
+    }
+
+    free(w->path);
+    w->path = NULL;
+
+    MUTEX_UNLOCK;
+}
+
+/*
+ * osevent poll
+ */
+
+int libxl_osevent_beforepoll(libxl_ctx *ctx, int *nfds_io,
+                             struct pollfd *fds, int *timeout_upd,
+                             struct timeval now) {
+    libxl__ev_fd *efd;
+    int i;
+
+    /*
+     * In order to be able to efficiently find the libxl__ev_fd
+     * for a struct poll during _afterpoll, we maintain a shadow
+     * data structure in CTX->fd_beforepolled: each slot in
+     * the fds array corresponds to a slot in fd_beforepolled.
+     */
+
+    GC_INIT(ctx);
+    MUTEX_LOCK;
+
+    if (*nfds_io) {
+        /*
+         * As an optimisation, we don't touch fd_beforepolled_used
+         * if *nfds_io is zero on entry, since in that case the
+         * caller just wanted to know how big an array to give us.
+         *
+         * If !*nfds_io, the unconditional parts below are guaranteed
+         * not to mess with fd_beforepolled... or any in_beforepolled.
+         */
+
+        /* Remove all the old references into beforepolled */
+        for (i = 0; i < CTX->fd_beforepolled_used; i++) {
+            efd = CTX->fd_beforepolled[i];
+            if (efd) {
+                assert(efd->in_beforepolled == i);
+                efd->in_beforepolled = -1;
+                CTX->fd_beforepolled[i] = NULL;
+            }
+        }
+        CTX->fd_beforepolled_used = 0;
+
+        /* make sure our array is as big as *nfds_io */
+        if (CTX->fd_beforepolled_allocd < *nfds_io) {
+            assert(*nfds_io < INT_MAX / sizeof(libxl__ev_fd*) / 2);
+            libxl__ev_fd **newarray =
+                realloc(CTX->fd_beforepolled, sizeof(*newarray) * *nfds_io);
+            if (!newarray)
+                return ERROR_NOMEM;
+            CTX->fd_beforepolled = newarray;
+            CTX->fd_beforepolled_allocd = *nfds_io;
+        }
+    }
+
+    int used = 0;
+    LIBXL_LIST_FOREACH(efd, &CTX->efds, entry) {
+        if (used < *nfds_io) {
+            fds[used].fd = efd->fd;
+            fds[used].events = efd->events;
+            fds[used].revents = 0;
+            CTX->fd_beforepolled[used] = efd;
+            efd->in_beforepolled = used;
+        }
+        used++;
+    }
+    int rc = used <= *nfds_io ? 0 : ERROR_BUFFERFULL;
+
+    if (*nfds_io) {
+        CTX->fd_beforepolled_used = used;
+    }
+
+    *nfds_io = used;
+
+    libxl__ev_time *etime = LIBXL_TAILQ_FIRST(&CTX->etimes);
+    if (etime) {
+        int our_timeout;
+        struct timeval rel;
+        static struct timeval zero;
+
+        timersub(&etime->abs, &now, &rel);
+
+        if (timercmp(&rel, &zero, <)) {
+            our_timeout = 0;
+        } else if (rel.tv_sec >= 2000000) {
+            our_timeout = 2000000000;
+        } else {
+            our_timeout = rel.tv_sec * 1000 + (rel.tv_usec + 999) / 1000;
+        }
+        if (*timeout_upd < 0 || our_timeout < *timeout_upd)
+            *timeout_upd = our_timeout;
+    }
+
+    MUTEX_UNLOCK;
+    GC_FREE;
+    return rc;
+}
+
+void libxl_osevent_afterpoll(libxl_ctx *ctx, int nfds, const struct pollfd *fds,
+                             struct timeval now) {
+    int i;
+    GC_INIT(ctx);
+    MUTEX_LOCK;
+
+    assert(nfds <= CTX->fd_beforepolled_used);
+
+    for (i = 0; i < nfds; i++) {
+        if (!fds[i].revents)
+            continue;
+
+        libxl__ev_fd *efd = CTX->fd_beforepolled[i];
+        if (!efd)
+            continue;
+
+        assert(efd->in_beforepolled == i);
+        assert(fds[i].fd == efd->fd);
+
+        int revents = fds[i].revents & efd->events;
+        if (!revents)
+            continue;
+
+        efd->func(gc, efd, efd->fd, efd->events, revents);
+    }
+
+    for (;;) {
+        libxl__ev_time *etime = LIBXL_TAILQ_FIRST(&CTX->etimes);
+        if (!etime)
+            break;
+
+        assert(!etime->infinite);
+
+        if (timercmp(&etime->abs, &now, >))
+            break;
+
+        time_deregister(gc, etime);
+
+        etime->func(gc, etime, &etime->abs);
+    }
+
+    MUTEX_UNLOCK;
+    GC_FREE;
+}
+
+
+/*
+ * osevent hook and callback machinery
+ */
+
+void libxl_osevent_register_hooks(libxl_ctx *ctx,
+                                  const libxl_osevent_hooks *hooks,
+                                  void *user) {
+    GC_INIT(ctx);
+    MUTEX_LOCK;
+    ctx->osevent_hooks = hooks;
+    ctx->osevent_user = user;
+    MUTEX_UNLOCK;
+    GC_FREE;
+}
+
+
+void libxl_osevent_occurred_fd(libxl_ctx *ctx, void *for_libxl,
+                               int fd, short events, short revents) {
+    libxl__ev_fd *ev = for_libxl;
+
+    GC_INIT(ctx);
+    MUTEX_LOCK;
+    assert(!CTX->osevent_in_hook);
+
+    assert(fd == ev->fd);
+    revents &= ev->events;
+    if (revents)
+        ev->func(gc, ev, fd, ev->events, revents);
+
+    MUTEX_UNLOCK;
+    GC_FREE;
+}
+
+void libxl_osevent_occurred_timeout(libxl_ctx *ctx, void *for_libxl) {
+    libxl__ev_time *ev = for_libxl;
+
+    GC_INIT(ctx);
+    MUTEX_LOCK;
+
+    assert(!ev->infinite);
+    LIBXL_TAILQ_REMOVE(&CTX->etimes, ev, entry);
+    ev->func(gc, ev, &ev->abs);
+
+    MUTEX_UNLOCK;
+    GC_FREE;
+}
+
+void libxl__event_disaster(libxl__gc *gc, const char *msg, int errnoval,
+                           libxl_event_type type /* may be 0 */,
+                           const char *file, int line) {
+    libxl__log(CTX, XTL_CRITICAL, errnoval, file, line,
+               "DISASTER in event loop: %s%s%s%s",
+               msg,
+               type ? " (relates to event type " : "",
+               type ? libxl_event_type_to_string(type) : "",
+               type ? ")" : "");
+
+    /*
+     * FIXME: This should call the "disaster" hook supplied to
+     * libxl_event_register_callbacks, which will be introduced in the
+     * next patch.
+     */
+
+    const char verybad[] =
+        "DISASTER in event loop not handled by libxl application";
+    LIBXL__LOG(CTX, XTL_CRITICAL, verybad);
+    fprintf(stderr, "libxl: fatal error, exiting program: %s\n", verybad);
+    exit(-1);
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/tools/libxl/libxl_event.h b/tools/libxl/libxl_event.h
new file mode 100644
index 0000000..48c6277
--- /dev/null
+++ b/tools/libxl/libxl_event.h
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2011      Citrix Ltd.
+ * Author Ian Jackson <ian.jackson@eu.citrix.com>
+ *
+ * This program 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 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program 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.
+ */
+
+#ifndef LIBXL_EVENT_H
+#define LIBXL_EVENT_H
+
+#include <libxl.h>
+
+
+/*======================================================================*/
+
+/*
+ * OS event handling - passing low-level OS events to libxl
+ *
+ * Event-driven programs must use these facilities to allow libxl
+ * to become aware of readability/writeability of file descriptors
+ * and the occurrence of timeouts.
+ *
+ * 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;
+ *      }
+ *   }
+ *
+ * The second approach uses libxl_osevent_register_hooks and is
+ * suitable for programs which are already using a callback-based
+ * event library.
+ *
+ * An application may freely mix the two styles of interaction.
+ */
+
+struct pollfd;
+
+int libxl_osevent_beforepoll(libxl_ctx *ctx, int *nfds_io,
+                             struct pollfd *fds, int *timeout_upd,
+                             struct timeval now);
+  /* The caller should provide beforepoll with some space for libxl's
+   * fds, and tell libxl how much space is available by setting *nfds_io.
+   * fds points to the start of this space (and fds may be a pointer into
+   * a larger array, for example, if the application has some fds of
+   * its own that it is interested in).
+   *
+   * On return *nfds_io will in any case have been updated by libxl
+   * according to how many fds libxl wants to poll on.
+   *
+   * If the space was sufficient, libxl fills in fds[0..<new
+   * *nfds_io>] suitably for poll(2), updates *timeout_upd if needed,
+   * and returns ok.
+   *
+   * If space was insufficient, fds[0..<old *nfds_io>] is undefined on
+   * return; *nfds_io on return will be greater than the value on
+   * entry; *timeout_upd may or may not have been updated; and
+   * libxl_osevent_beforepoll returns ERROR_BUFERFULL.  In this case
+   * the application needs to make more space (enough space for
+   * *nfds_io struct pollfd) and then call beforepoll again, before
+   * entering poll(2).  Typically this will involve calling realloc.
+   *
+   * The application may call beforepoll with fds==NULL and
+   * *nfds_io==0 in order to find out how much space is needed.
+   *
+   * *timeout_upd is as for poll(2): it's in milliseconds, and
+   * negative values mean no timeout (infinity).
+   * libxl_osevent_beforepoll will only reduce the timeout, naturally.
+   */
+void libxl_osevent_afterpoll(libxl_ctx *ctx, int nfds, const struct pollfd *fds,
+                             struct timeval now);
+  /* nfds and fds[0..nfds] must be from the most recent call to
+   * _beforepoll, as modified by poll.
+   *
+   * This function actually performs all of the IO and other actions,
+   * and generates events (libxl_event), which are implied by either
+   * (a) the time of day or (b) both (i) the returned information from
+   * _beforepoll, and (ii) the results from poll specified in
+   * fds[0..nfds-1].  Generated events can then be retrieved by
+   * libxl_event_check.
+   */
+
+
+typedef struct libxl_osevent_hooks {
+  int (*fd_register)(void *user, int fd, void **for_app_registration_out,
+                     short events, void *for_libxl);
+  int (*fd_modify)(void *user, int fd, void **for_app_registration_update,
+                   short events);
+  void (*fd_deregister)(void *user, int fd, void *for_app_registration);
+  int (*timeout_register)(void *user, void **for_app_registration_out,
+                          struct timeval abs, void *for_libxl);
+  int (*timeout_modify)(void *user, void **for_app_registration_update,
+                         struct timeval abs);
+  void (*timeout_deregister)(void *user, void *for_app_registration_io);
+} libxl_osevent_hooks;
+
+void libxl_osevent_register_hooks(libxl_ctx *ctx,
+                                  const libxl_osevent_hooks *hooks,
+                                  void *user);
+  /* The application which calls register_fd_hooks promises to
+   * maintain a register of fds and timeouts that libxl is interested
+   * in, and make calls into libxl (libxl_osevent_occurred_*)
+   * when those fd events and timeouts occur.  This is more efficient
+   * than _beforepoll/_afterpoll if there are many fds (which can
+   * happen if the same libxl application is managing many domains).
+   *
+   * For an fd event, events is as for poll().  register or modify may
+   * be called with events==0, in which case it must still work
+   * normally, just not generate any events.
+   *
+   * For a timeout event, milliseconds is as for poll().
+   * Specifically, negative values of milliseconds mean NO TIMEOUT.
+   * This is used by libxl to temporarily disable a timeout.
+   *
+   * If the register or modify hook succeeds it may update
+   * *for_app_registration_out/_update and must then return 0.
+   * On entry to register, *for_app_registration_out is always NULL.
+   *
+   * A registration or modification hook may fail, in which case it
+   * must leave the registration state of the fd or timeout unchanged.
+   * It may then either return ERROR_OSEVENT_REG_FAIL or any positive
+   * int.  The value returned will be passed up through libxl and
+   * eventually returned back to the application.  When register
+   * fails, any value stored into *for_registration_out is ignored by
+   * libxl; when modify fails, any changed value stored into
+   * *for_registration_update is honoured by libxl and will be passed
+   * to future modify or deregister calls.
+   *
+   * libxl will only attempt to register one callback for any one fd.
+   * libxl will remember the value stored in *for_app_registration_io
+   * by a successful call to register or modify and pass it into
+   * subsequent calls to modify or deregister.
+   *
+   * register_fd_hooks may be called only once for each libxl_ctx.
+   * libxl may make calls to register/modify/deregister from within
+   * any libxl function (indeed, it will usually call register from
+   * register_event_hooks).  Conversely, the application MUST NOT make
+   * the event occurrence calls (libxl_osevent_occurred_*) into libxl
+   * reentrantly from within libxl (for example, from within the
+   * register/modify functions).
+   *
+   * The value *hooks is not copied and must outlast the libxl_ctx.
+   */
+
+/* It is NOT legal to call _occurred_ reentrantly within any libxl
+ * function.  Specifically it is NOT legal to call it from within
+ * a register callback.  Conversely, libxl MAY call register/deregister
+ * from within libxl_event_registered_call_*.
+ */
+
+void libxl_osevent_occurred_fd(libxl_ctx *ctx, void *for_libxl,
+                               int fd, short events, short revents);
+
+void libxl_osevent_occurred_timeout(libxl_ctx *ctx, void *for_libxl);
+  /* Implicitly, on entry to this function the timeout has been
+   * deregistered.  If _occurred_timeout is called, libxl will not
+   * call timeout_deregister; if it wants to requeue the timeout it
+   * will call timeout_register again.
+   */
+
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index fe64d34..07bbe8d 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -24,6 +24,9 @@
 #include <stdlib.h>
 #include <string.h>
 #include <pthread.h>
+#include <inttypes.h>
+#include <assert.h>
+#include <sys/poll.h>
 
 #include <xs.h>
 #include <xenctrl.h>
@@ -91,6 +94,66 @@ _hidden void libxl__log(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
 
      /* these functions preserve errno (saving and restoring) */
 
+typedef struct libxl__gc libxl__gc;
+
+typedef struct libxl__ev_fd libxl__ev_fd;
+typedef void libxl__ev_fd_callback(libxl__gc *gc, libxl__ev_fd *ev,
+                                   int fd, short events, short revents);
+struct libxl__ev_fd {
+    /* all private for libxl__ev_fd... */
+    LIBXL_LIST_ENTRY(libxl__ev_fd) entry;
+    int fd;
+    short events;
+    int in_beforepolled; /* -1 means not in fd_beforepolled */
+    void *for_app_reg;
+    libxl__ev_fd_callback *func;
+};
+
+
+typedef struct libxl__ev_time libxl__ev_time;
+typedef void libxl__ev_time_callback(libxl__gc *gc, libxl__ev_time *ev,
+                                     const struct timeval *requested_abs);
+struct libxl__ev_time {
+    /* all private for libxl__ev_time... */
+    int infinite; /* not registered in list or with app if infinite */
+    LIBXL_TAILQ_ENTRY(libxl__ev_time) entry;
+    struct timeval abs;
+    void *for_app_reg;
+    libxl__ev_time_callback *func;
+};
+
+typedef struct libxl__ev_xswatch libxl__ev_xswatch;
+typedef void libxl__ev_xswatch_callback(libxl__gc *gc, libxl__ev_xswatch*,
+                            const char *watch_path, const char *event_path);
+struct libxl__ev_xswatch {
+    /* caller should include this in their own struct */
+    /* contents are private to xswatch_register */
+    int slotnum;
+    uint32_t counterval;
+    char *path;
+    libxl__ev_xswatch_callback *callback;
+};
+
+/*
+ * An entry in the watch_slots table is either:
+ *  1. an entry in the free list, ie NULL or pointer to next free list entry
+ *  2. an pointer to a libxl__ev_xswatch
+ *
+ * But we don't want to use unions or type-punning because the
+ * compiler might "prove" that our code is wrong and misoptimise it.
+ *
+ * The rules say that all struct pointers have identical
+ * representation and alignment requirements (C99+TC1+TC2 6.2.5p26) so
+ * what we do is simply declare our array as containing only the free
+ * list pointers, and explicitly convert from and to our actual
+ * xswatch pointers when we store and retrieve them.
+ */
+typedef struct libxl__ev_watch_slot {
+    LIBXL_SLIST_ENTRY(struct libxl__ev_watch_slot) empty;
+} libxl__ev_watch_slot;
+    
+libxl__ev_xswatch *libxl__watch_slot_contents(libxl__gc *gc, int slotnum);
+
 struct libxl__ctx {
     xentoollog_logger *lg;
     xc_interface *xch;
@@ -99,6 +162,21 @@ struct libxl__ctx {
     pthread_mutex_t lock; /* protects data structures hanging off the ctx */
       /* always use MUTEX_LOCK and MUTEX_UNLOCK to manipulate this */
 
+    int osevent_in_hook;
+    const libxl_osevent_hooks *osevent_hooks;
+    void *osevent_user;
+
+    int fd_beforepolled_allocd, fd_beforepolled_used;
+    libxl__ev_fd **fd_beforepolled; /* see libxl_osevent_beforepoll */
+    LIBXL_LIST_HEAD(, libxl__ev_fd) efds;
+    LIBXL_TAILQ_HEAD(, libxl__ev_time) etimes;
+
+    libxl__ev_watch_slot *watch_slots;
+    int watch_nslots;
+    LIBXL_SLIST_HEAD(, libxl__ev_watch_slot) watch_freeslots;
+    uint32_t watch_counter; /* helps disambiguate slot reuse */
+    libxl__ev_fd watch_efd;
+
     /* for callers who reap children willy-nilly; caller must only
      * set this after libxl_init and before any other call - or
      * may leave them untouched */
@@ -138,12 +216,12 @@ typedef struct {
 
 #define PRINTF_ATTRIBUTE(x, y) __attribute__((format(printf, x, y)))
 
-typedef struct {
+struct libxl__gc {
     /* mini-GC */
     int alloc_maxsize;
     void **alloc_ptrs;
     libxl_ctx *owner;
-} libxl__gc;
+};
 
 #define LIBXL_INIT_GC(ctx) (libxl__gc){ .alloc_maxsize = 0, .alloc_ptrs = 0, .owner = ctx }
 static inline libxl_ctx *libxl__gc_owner(libxl__gc *gc)
@@ -205,6 +283,134 @@ _hidden char **libxl__xs_directory(libxl__gc *gc, xs_transaction_t t,
                                    const char *path, unsigned int *nb);
    /* On error: returns NULL, sets errno (no logging) */
 
+
+/*
+ * Event generation functions provided by the libxl event core to the
+ * rest of libxl.  Implemented in terms of _beforepoll/_afterpoll
+ * and/or the fd registration machinery, as provided by the
+ * application.
+ *
+ * Semantics are similar to those of the fd and timeout registration
+ * functions provided to libxl_osevent_register_hooks.
+ *
+ * Non-0 returns from libxl__ev_{modify,deregister} have already been
+ * logged by the core and should be returned unmodified to libxl's
+ * caller; NB that they may be valid libxl error codes but they may
+ * also be positive numbers supplied by the caller.
+ *
+ * In each case, there is a libxl__ev_FOO structure which can be in
+ * one of three states:
+ *
+ *   Undefined   - Might contain anything.  All-bits-zero is
+ *                 an undefined state.
+ *
+ *   Idle        - Struct contents are defined enough to pass to any
+ *                 libxl__ev_FOO function but not registered and
+ *                 callback will not be called.  The struct does not
+ *                 contain references to any allocated resources so
+ *                 can be thrown away.
+ *
+ *   Active      - Request for events has been registered and events
+ *                 may be generated.  _deregister must be called to
+ *                 reclaim resources.
+ *
+ * These functions are provided for each kind of event KIND:
+ *
+ *   int libxl__ev_KIND_register(libxl__gc *gc, libxl__ev_KIND *GEN,
+ *                              libxl__ev_KIND_callback *FUNC,
+ *                              DETAILS);
+ *      On entry *GEN must be in state Undefined or Idle.
+ *      Returns a libxl error code; on error return *GEN is Idle.
+ *      On successful return *GEN is Active and FUNC wil be
+ *      called by the event machinery in future.  FUNC will
+ *      not be called from within the call to _register.
+ *
+ *  void libxl__ev_KIND_deregister(libxl__gc *gc, libxl__ev_KIND *GEN_upd);
+ *      On entry *GEN must be in state Active or Idle.
+ *      On return it is Idle.  (Idempotent.)
+ *
+ *  void libxl__ev_KIND_init(libxl__ev_KIND *GEN);
+ *      Provided for initialising an Undefined KIND.
+ *      On entry *GEN must be in state Idle or Undefined.
+ *      On return it is Idle.  (Idempotent.)
+ *
+ *  int libxl__ev_KIND_isregistered(const libxl__ev_KIND *GEN);
+ *      On entry *GEN must be Idle or Active.
+ *      Returns nonzero if it is Active, zero otherwise.
+ *      Cannot fail.
+ *
+ *  int libxl__ev_KiND_modify(libxl__gc*, libxl__ev_KIND *GEN,
+ *                            DETAILS);
+ *      Only provided for some kinds of generator.
+ *      On entry *GEN must be Active and on return, whether successful
+ *      or not, it will be Active.
+ *      Returns a libxl error code; on error the modification
+ *      is not effective.
+ *
+ * All of these functions are fully threadsafe and may be called by
+ * general code in libxl even from within event callback FUNCs.
+ */
+
+
+_hidden int libxl__ev_fd_register(libxl__gc*, libxl__ev_fd *ev_out,
+                                  libxl__ev_fd_callback*,
+                                  int fd, short events /* as for poll(2) */);
+_hidden int libxl__ev_fd_modify(libxl__gc*, libxl__ev_fd *ev,
+                                short events);
+_hidden void libxl__ev_fd_deregister(libxl__gc*, libxl__ev_fd *ev);
+static inline void libxl__ev_fd_init(libxl__ev_fd *efd)
+                    { efd->fd = -1; }
+static inline int libxl__ev_fd_isregistered(libxl__ev_fd *efd)
+                    { return efd->fd >= 0; }
+
+_hidden int libxl__ev_time_register_rel(libxl__gc*, libxl__ev_time *ev_out,
+                                        libxl__ev_time_callback*,
+                                        int milliseconds /* as for poll(2) */);
+_hidden int libxl__ev_time_register_abs(libxl__gc*, libxl__ev_time *ev_out,
+                                        libxl__ev_time_callback*,
+                                        struct timeval);
+_hidden int libxl__ev_time_modify_rel(libxl__gc*, libxl__ev_time *ev,
+                                      int milliseconds /* as for poll(2) */);
+_hidden int libxl__ev_time_modify_abs(libxl__gc*, libxl__ev_time *ev,
+                                      struct timeval);
+_hidden void libxl__ev_time_deregister(libxl__gc*, libxl__ev_time *ev);
+static inline void libxl__ev_time_init(libxl__ev_time *ev)
+                { ev->func = 0; }
+static inline int libxl__ev_time_isregistered(libxl__ev_time *ev)
+                { return !!ev->func; }
+
+
+_hidden int libxl__ev_xswatch_register(libxl__gc*, libxl__ev_xswatch *xsw_out,
+                                       libxl__ev_xswatch_callback*,
+                                       const char *path /* copied */);
+_hidden void libxl__ev_xswatch_deregister(libxl__gc *gc, libxl__ev_xswatch*);
+
+static inline void libxl__ev_xswatch_init(libxl__ev_xswatch *xswatch_out)
+                { xswatch_out->slotnum = -1; }
+static inline int libxl__ev_xswatch_isregistered(const libxl__ev_xswatch *xw)
+                { return xw->slotnum >= 0; }
+
+
+
+_hidden void libxl__event_disaster(libxl__gc*, const char *msg, int errnoval,
+                                   libxl_event_type type /* may be 0 */,
+                                   const char *file, int line);
+  /*
+   * In general, call this via the macro LIBXL__EVENT_DISASTER.
+   *
+   * Event-generating functions may call this if they might have
+   * wanted to generate an event (either an internal one ie a
+   * libxl__ev_FOO_callback or an application event), but are
+   * prevented from doing so due to eg lack of memory.
+   *
+   * NB that this function may return and the caller isn't supposed to
+   * then crash, although it may fail (and henceforth leave things in
+   * a state where many or all calls fail).
+   */
+#define LIBXL__EVENT_DISASTER(gc, msg, errnoval, type) \
+    libxl__event_disaster(gc, msg, errnoval, type, __FILE__, __LINE__)
+
+
 /* 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);
@@ -441,6 +647,8 @@ _hidden int libxl__parse_mac(const char *s, libxl_mac mac);
 /* compare mac address @a and @b. 0 if the same, -ve if a<b and +ve if a>b */
 _hidden int libxl__compare_macs(libxl_mac *a, libxl_mac *b);
 
+_hidden int libxl__gettimeofday(libxl__gc *gc, struct timeval *now_r);
+
 #define STRINGIFY(x) #x
 #define TOSTRING(x) STRINGIFY(x)
 
-- 
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 Fri Oct 28 12:48:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 12: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 1RJsPM-0008UU-SN; Fri, 28 Oct 2011 12:48:04 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJsO4-0008Gg-5j
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 12:46:45 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-174.messagelabs.com!1319831200!31021241!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29496 invoked from network); 28 Oct 2011 19:46:41 -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;
	28 Oct 2011 19:46:41 -0000
X-IronPort-AV: E=Sophos;i="4.69,420,1315180800"; 
   d="scan'208";a="8653206"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	28 Oct 2011 19:46:40 +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, 28 Oct 2011 20:46:39 +0100
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 1RJsNz-0007ce-Lc;
	Fri, 28 Oct 2011 19:46:39 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RJsNz-0001vv-DR;
	Fri, 28 Oct 2011 20:46:39 +0100
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9645-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Fri, 28 Oct 2011 20:46:39 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9645: 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 9645 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9645/

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 9644
 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                  0fea1ad50ce3
baseline version:
 xen                  0526644ad2a6

------------------------------------------------------------
People who touched revisions under test:
  Anthony PERARD <anthony.perard@citrix.com>
  Christoph Egger <Christoph.Egger@amd.com>
  Keir Fraser <keir@xen.org>
  Roger Pau Monne <roger.pau@entel.upc.edu>
  Stefano Stabellini <stefano.stabellini@eu.citrix.com>
  Zhenzhong Duan <zhenzhong.duan@oracle.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=0fea1ad50ce3
+ . 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 0fea1ad50ce3
+ branch=xen-unstable
+ revision=0fea1ad50ce3
+ . 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 0fea1ad50ce3 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 14 changes to 10 files

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Fri Oct 28 14:18:44 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 14:18:44 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJtp6-0002o1-6H; Fri, 28 Oct 2011 14:18:44 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJto2-0002b9-0B
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 14:17:38 -0700
X-Env-Sender: jfehlig@suse.com
X-Msg-Ref: server-4.tower-174.messagelabs.com!1319836654!37089983!1
X-Originating-IP: [137.65.248.97]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27310 invoked from network); 28 Oct 2011 21:17:34 -0000
Received: from novprvoes0314.provo.novell.com (HELO mail.novell.com)
	(137.65.248.97) by server-4.tower-174.messagelabs.com with SMTP;
	28 Oct 2011 21:17:34 -0000
Received: from [164.99.195.40] ([::ffff:164.99.195.40])
	by mail.novell.com with ESMTP; Fri, 28 Oct 2011 15:17:28 -0600
Message-ID: <4EAB1BE6.9030501@suse.com>
Date: Fri, 28 Oct 2011 15:17:26 -0600
From: Jim Fehlig <jfehlig@suse.com>
User-Agent: Thunderbird 2.0.0.24 (X11/20100302)
MIME-Version: 1.0
To: Ian Campbell <Ian.Campbell@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>
In-Reply-To: <1319729714.9436.146.camel@zakaz.uk.xensource.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Cc: xen-devel <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 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.

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

From xen-devel-bounces@lists.xensource.com Fri Oct 28 19:06:20 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 19:06:20 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJyJP-0003dF-Sa; Fri, 28 Oct 2011 19:06:19 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with smtp (Exim 4.43) id 1RJyIa-0003QI-2F
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 19:05:28 -0700
X-Env-Sender: hui.lv@intel.com
X-Msg-Ref: server-11.tower-182.messagelabs.com!1319853923!1143889!1
X-Originating-IP: [134.134.136.24]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1060 invoked from network); 29 Oct 2011 02:05:24 -0000
Received: from mga09.intel.com (HELO mga09.intel.com) (134.134.136.24)
	by server-11.tower-182.messagelabs.com with SMTP;
	29 Oct 2011 02:05:24 -0000
Received: from orsmga002.jf.intel.com ([10.7.209.21])
	by orsmga102.jf.intel.com with ESMTP; 28 Oct 2011 19:05:22 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.67,351,1309762800"; d="scan'208";a="68773817"
Received: from pgsmsx601.gar.corp.intel.com ([10.221.43.69])
	by orsmga002.jf.intel.com with ESMTP; 28 Oct 2011 19:05:20 -0700
Received: from pgsmsx103.gar.corp.intel.com (10.221.44.82) by
	pgsmsx601.gar.corp.intel.com (10.221.43.69) with Microsoft SMTP Server
	(TLS) id 8.2.255.0; Sat, 29 Oct 2011 10:05:19 +0800
Received: from shsmsx601.ccr.corp.intel.com (10.239.4.112) by
	PGSMSX103.gar.corp.intel.com (10.221.44.82) with Microsoft SMTP Server
	(TLS) id 14.1.323.3; Sat, 29 Oct 2011 10:05:19 +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, 29 Oct 2011 10:05:18 +0800
From: "Lv, Hui" <hui.lv@intel.com>
To: George Dunlap <george.dunlap@citrix.com>, Dario Faggioli
	<raistlin@linux.it>
Date: Sat, 29 Oct 2011 10:05:15 +0800
Subject: RE: [Xen-devel] [PATCH] scheduler rate controller
Thread-Topic: [Xen-devel] [PATCH] scheduler rate controller
Thread-Index: AcyVjEuhgC8vIZe3QEasI9kRnEiSfgASQIQQ
Message-ID: <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>
In-Reply-To: <1319818714.21033.414.camel@elijah>
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>, George Dunlap <George.Dunlap@eu.citrix.com>,
	"Dong, Eddie" <eddie.dong@intel.com>, "Duan,
	Jiangang" <jiangang.duan@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>
Content-Type: multipart/mixed; boundary="===============0709028084=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0709028084==
Content-Language: en-US
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64

SSBoYXZlIHRyaWVkIG9uZSB3YXkgdmVyeSBzaW1pbGFyIGFzIHlvdXIgaWRlYS4NCjEpIHRvIGNo
ZWNrIHdoZXRoZXIgY3VycmVudCBydW5uaW5nIHZjcHUgcnVucyBsZXNzIHRoYW4gMW1zLCBpZiB5
ZXMsIHdlIHdpbGwgcmV0dXJuIGN1cnJlbnQgdmNwdSBkaXJlY3RseSB3aXRob3V0IHByZWVtcHRp
b24uDQpJdCB0cnkgdG8gZ3VhcmFudGVlIHZjcHUgdG8gcnVuIGFzIGxvbmcgYXMgMW1zLCBpZiBp
dCB3YW50cy4NCkl0IGNhbiByZWR1Y2UgdGhlIHNjaGVkdWxpbmcgZnJlcXVlbmN5IHRvIHNvbWUg
ZGVncmVlLCBidXQgbm90IHZlcnkgc2lnbmlmaWNhbnQuIEJlY2F1c2UgMW1zIGlzIHRvbyBsaWdo
dC93ZWFrIHdpdGggY29tcGFyaXNvbiB0byAxMG1zIGRlbGF5IChTUkMgcGF0Y2ggdXNlZCkuDQoN
CkFzIHlvdSBzYWlkLCBpZiBhcHBseWluZyB0aGUgc2V2ZWFsX21zX2RlbGF5LCBpdCB3aWxsIGhh
cHBlbiB3aGVuZXZlciBzeXN0ZW0gaXMgbm9ybWFsIG9yIG5vdCAoZXhjZXNzaXZlIGZyZXF1ZW5j
eSkuIEl0IG1heSBwb3NzaWJsZSBoYXZlIHRoZSBjb25zZXF1ZW5jZSB0aGF0IDEpdW5kZXIgbm9y
bWFsIGNvbmRpdGlvbiwgaXQgd2lsbCBwcm9kdWNlIHdvcnNlIFFvcyB0aGFuIHRoYXQgd2l0aG91
dCBhcHBseWluZyBzdWNoIGRlbGF5LCAyKSB1bmRlciBleGNlc3NpdmUgZnJlcXVlbmN5IGNvbmRp
dGlvbiwgdGhlIG1pdGlnYXRpb24gZWZmZWN0IG9mIDFtcy1kZWxheSBtYXkgYmUgdG9vIHdlYWsu
IEluIGFkZGl0aW9uLCB5b3VyIGlkZWEgaXMgdG8gZGVsYXkgc2NoZWR1bGluZyBpbnN0ZWFkIG9m
IHJlZHVjaW5nLCB3aGljaCBtZWFucyB0aGUgdG90YWwgbnVtYmVyIG9mIHNjaGVkdWxpbmcgd291
bGQgcHJvYmFibHkgbm90IGNoYW5nZS4NCkkgdGhpbmsgb25lIHBvc3NpYmxlIHNvbHV0aW9uLCBp
cyB0byBtYWtlIHRoZSB2YWx1ZSBvZiAxbXMtZGVsYXkgYWRhcHRpdmUgYWNjb3JkaW5nIHRvIHRo
ZSBzeXN0ZW0gc3RhdHVzIChsb3cgbG9hZCBvciBoaWdoIGxvYWQpLiBJZiBzbywgU1JDIHBhdGNo
IGp1c3QgY292ZXJlZCB0aGUgZXhjZXNzaXZlIGNvbmRpdGlvbiBjdXJyZW50bHkgOikuIFRoYXQn
cyB3aHkgSSBtZW50aW9uZWQgdG8gdHJlYXQgbm9ybWFsIGFuZCBleGNlc3NpdmUgY29uZGl0aW9u
cyBzZXBhcmF0ZWx5IGFuZCBkb24ndCBpbmZsdWVuY2UgdGhlIG5vcm1hbCBjYXNlIGFzIG11Y2gg
YXMgcG9zc2libGUuIEJlY2F1c2Ugd2UgbmV2ZXIga25vdyB0aGUgY29uc2VxdWVuY2Ugd2l0aG91
dCBhbW91bnQgb2YgdGVzdGluZyB3b3JrLiA6KQ0KDQpTb21lIG9mIG15IHN0dXBpZCB0aGlua2lu
ZyA6KQ0KDQpCZXN0IHJlZ2FyZHMsDQoNCkx2LCBIdWkNCg0KDQotLS0tLU9yaWdpbmFsIE1lc3Nh
Z2UtLS0tLQ0KRnJvbTogR2VvcmdlIER1bmxhcCBbbWFpbHRvOmdlb3JnZS5kdW5sYXBAY2l0cml4
LmNvbV0gDQpTZW50OiBTYXR1cmRheSwgT2N0b2JlciAyOSwgMjAxMSAxMjoxOSBBTQ0KVG86IERh
cmlvIEZhZ2dpb2xpDQpDYzogTHYsIEh1aTsgR2VvcmdlIER1bmxhcDsgRHVhbiwgSmlhbmdhbmc7
IFRpYW4sIEtldmluOyB4ZW4tZGV2ZWxAbGlzdHMueGVuc291cmNlLmNvbTsgS2VpciAoWGVuLm9y
Zyk7IERvbmcsIEVkZGllDQpTdWJqZWN0OiBSRTogW1hlbi1kZXZlbF0gW1BBVENIXSBzY2hlZHVs
ZXIgcmF0ZSBjb250cm9sbGVyDQoNCk9uIEZyaSwgMjAxMS0xMC0yOCBhdCAxMTowOSArMDEwMCwg
RGFyaW8gRmFnZ2lvbGkgd3JvdGU6DQo+IE5vdCBzdXJlIHlldCwgSSBjYW4gaW1hZ2luZSBpdCdz
IHRyaWNreSBhbmQgSSBuZWVkIHRvIGRpZyBhIGJpdCBtb3JlIA0KPiBpbiB0aGUgY29kZSwgYnV0
IEknbGwgbGV0IGtub3cgaWYgSSBmb3VuZCBhIHdheSBvZiBkb2luZyB0aGF0Li4uDQoNClRoZXJl
IGFyZSBsb3RzIG9mIHJlYXNvbnMgd2h5IHRoZSBTQ0hFRFVMRV9TT0ZUSVJRIGdldHMgcmFpc2Vk
LiAgQnV0IEkgdGhpbmsgd2Ugd2FudCB0byBmb2N1cyBvbiB0aGUgc2NoZWR1bGVyIGl0c2VsZiBy
YWlzaW5nIGl0IGFzIGEgcmVzdWx0IG9mIHRoZSAud2FrZSgpIGNhbGxiYWNrLiAgV2hldGhlciB0
aGUgLndha2UoKSBoYXBwZW5zIGFzIGEgcmVzdWx0IG9mIGEgSFcgaW50ZXJydXB0IG9yIHNvbWV0
aGluZyBlbHNlLCBJIGRvbid0IHRoaW5rIHJlYWxseSBtYXR0ZXJzLg0KDQpEYXJpbyBhbmQgSHVp
LCAgbmVpdGhlciBvZiB5b3UgaGF2ZSBjb21tZW50ZWQgb24gbXkgaWRlYSwgd2hpY2ggaXMgc2lt
cGx5IGRvbid0IHByZWVtcHQgYSBWTSBpZiBpdCBoYXMgcnVuIGZvciBsZXNzIHRoYW4gc29tZSBh
bW91bnQgb2YgdGltZSAoc2F5LCA1MDB1cyBvciAxbXMpLiAgSWYgYSBoaWdoZXItcHJpb3JpdHkg
Vk0gaXMgd29rZW4gdXAsIHNlZSBob3cgbG9uZyB0aGUgY3VycmVudCBWTSBoYXMgcnVuLiAgSWYg
aXQncyBsZXNzIHRoYW4gMW1zLCBzZXQgYSAxbXMgdGltZXIgYW5kIGNhbGwgc2NoZWR1bGUoKSB0
aGVuLg0KDQo+ID4gPiBNb3JlIGdlbmVyYWxseSBzcGVha2luZywgSSBzZWUgaG93IHRoaXMgZmVh
dHVyZSBjYW4gYmUgdXNlZnVsLCBhbmQgDQo+ID4gPiBJIGFsc28gdGhpbmsgaXQgY291bGQgbGl2
ZSBpbiB0aGUgZ2VuZXJpYyBzY2hlZHVsZS5jIGNvZGUsIGJ1dCAoYXMgDQo+ID4gPiBHZW9yZ2Ug
d2FzIHNheWluZykgdGhlIGFsZ29yaXRobSBieSB3aGljaCByYXRlLWxpbWl0aW5nIGlzIA0KPiA+
ID4gaGFwcGVuaW5nIG5lZWRzIHRvIGJlIHdlbGwga25vd24sIGRvY3VtZW50ZWQgYW5kIGV4cG9z
ZWQgdG8gdGhlIA0KPiA+ID4gdXNlciAobW9yZSB0aGFuIGJ5IG1lYW5zIG9mIGEgY291cGxlIG9m
IHBlcmYtY291bnRlcnMpLg0KPiA+ID4gDQo+ID4gDQo+ID4gT25lIHF1ZXN0aW9uIGlzIHRoYXQs
IHdoYXQgaXMgdGhlIHJpZ2h0IHBhbGFjZSB0byBkb2N1bWVudCBzdWNoIGluZm9ybWF0aW9uPyBJ
J2QgbGlrZSB0byBtYWtlIGl0IGFzIGNsZWFyIGFzIHBvc3NpYmxlIHRvIHRoZSB1c2Vycy4NCj4g
PiANCj4gV2VsbCwgZG9uJ3Qga25vdywgbWF5YmUgYSBXQVJOIChhIFdBUk5fT05DRSBhbGlrZSB0
aGluZyB3b3VsZCBwcm9iYWJseSANCj4gYmUgYmV0dGVyKSwgb3IgaW4gZ2VuZXJhbCBzb21ldGhp
bmcgdGhhdCBsZWF2ZSBhIGZvb3RzdGVwIGluIHRoZSBsb2dzLCANCj4gc28gdGhhdCBvbmUgY2Fu
IGZpbmQgb3V0IGJ5IG1lYW5zIG9mIGB4bCBkbWVzZycgb3IgcmVsYXRlZC4gT2J2aW91c2x5LCAN
Cj4gSSdtIG5vdCBzdWdnZXN0aW5nIG9mIHByaW50ay1pbmcgZWFjaCBzdXBwcmVzc2VkIHNjaGVk
dWxlIGludm9jYXRpb24sIA0KPiBvciB0aGUgb3ZlcmhlYWQgd291bGQgZ2V0IGV2ZW4gd29yc2Uu
Li4gOi1QDQo+IA0KPiBJJ20gdGhpbmtpbmcgb2Ygc29tZXRoaW5nIHRoYXQgaGFwcGVucyB0aGUg
dmVyeSBmaXJzdCB0aW1lIHRoZSANCj4gbGltaXRpbmcgZmlyZXMsIG9yIG1heWJlIG9uY2VlIHNv
bWUgcGVyaW9kL251bWJlciBvZiBzdXBwcmVzc2lvbnMsIA0KPiBqdXN0IHRvIHJlbWluZCB0aGUg
dXNlciB0aGF0IGhlJ3MgZ2V0dGluZyB3ZWlyZCBiZWhhdmlvdXIgYmVjYXVzZSANCj4gX2hlX2Vu
YWJsZWRfIHJhdGUtbGltaXRpbmcuIEhvcGVmdWxseSwgdGhhdCBtaWdodCBhbHNvIGJlIHVzZWZ1
bCBmb3IgDQo+IHRoZSB1c2VyIGl0c2VsZiB0byBmaW5lIHR1bmUgdGhlIGxpbWl0aW5nIHBhcmFt
ZXRlcnMsIGFsdGhvdWdoIEkgdGhpbmsgDQo+IHRoZSBwZXJmLWNvdW50ZXJzIGFyZSBhbHJlYWR5
IHF1aXRlIHdlbGwgc3VpdGVkIGZvciB0aGlzLg0KDQpBcyBtdWNoIGFzIHBvc3NpYmxlLCB3ZSB3
YW50IHRoZSBzeXN0ZW0gdG8gSnVzdCBXb3JrLiAgVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMg
aXQgd291bGRuJ3QgYmUgdG9vIHVudXN1YWwgZm9yIGEgVk0gdG8gaGF2ZSBhIHNldmVyYWwtbXMg
ZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSBwaHlzaWNhbCBpbnRlcnJ1cHQgYW5kIGJlaW5nIHNj
aGVkdWxlZDsgSSB0aGluayB0aGF0IGlmIHRoZSAxbXMgZGVsYXkgd29ya3MsIGhhdmluZyBpdCBv
biBhbGwgdGhlIHRpbWUgd291bGQgcHJvYmFibHkgYmUgdGhlIGJlc3Qgc29sdXRpb24uICBUaGF0
J3MgYW5vdGhlciByZWFzb24gSSdtIGluIGZhdm9yIG9mIHRyeWluZyBpdCAtLSBpdCdzIHNpbXBs
ZSBhbmQgZWFzeSB0byB1bmRlcnN0YW5kLCBhbmQgZG9lc24ndCByZXF1aXJlIGRldGVjdGluZyB3
aGVuIHRvICJ0dXJuIGl0IG9uIi4NCg0KIC1HZW9yZ2UNCg0K


--===============0709028084==
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

--===============0709028084==--

From xen-devel-bounces@lists.xensource.com Fri Oct 28 20:40:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 20:40:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RJzmD-00079s-6v; Fri, 28 Oct 2011 20:40:09 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RJzlK-0006wn-0x
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 20:39:14 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-12.tower-174.messagelabs.com!1319859550!37080323!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30432 invoked from network); 29 Oct 2011 03:39:10 -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;
	29 Oct 2011 03:39:10 -0000
X-IronPort-AV: E=Sophos;i="4.69,422,1315180800"; 
   d="scan'208";a="8655943"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	29 Oct 2011 03:38: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; Sat, 29 Oct 2011 04:38:49 +0100
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 1RJzkv-0001no-EM;
	Sat, 29 Oct 2011 03:38:49 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RJzkv-0007wq-5X;
	Sat, 29 Oct 2011 04:38:49 +0100
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9646-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sat, 29 Oct 2011 04:38:49 +0100
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9646: 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 9646 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9646/

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 9645
 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                  0fea1ad50ce3
baseline version:
 xen                  0fea1ad50ce3

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 Oct 28 22:58:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 22:58:38 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RK1wE-00022I-Cd; Fri, 28 Oct 2011 22:58:38 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RK1v2-0001pL-7g
	for xen-devel@lists.xensource.com; Fri, 28 Oct 2011 22:57:24 -0700
X-Env-Sender: jim_burn@bellsouth.net
X-Msg-Ref: server-2.tower-27.messagelabs.com!1319867806!61114119!1
X-Originating-IP: [98.139.44.164]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18633 invoked from network); 29 Oct 2011 05:56:47 -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-2.tower-27.messagelabs.com with SMTP;
	29 Oct 2011 05:56:47 -0000
Received: from [98.139.44.96] by nm15.access.bullet.mail.sp2.yahoo.com with
	NNFMP; 29 Oct 2011 05:57:19 -0000
Received: from [98.139.44.86] by tm1.access.bullet.mail.sp2.yahoo.com with
	NNFMP; 29 Oct 2011 05:57:19 -0000
Received: from [127.0.0.1] by omp1023.access.mail.sp2.yahoo.com with NNFMP;
	29 Oct 2011 05:57:19 -0000
X-Yahoo-Newman-Id: 933709.60791.bm@omp1023.access.mail.sp2.yahoo.com
Received: (qmail 66634 invoked from network); 29 Oct 2011 05:57:19 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bellsouth.net; s=s1024;
	t=1319867839; bh=87JJdI38o4P3POctCS1c+MUcg141jSiIkSCQ6YJ8Ecc=;
	h=X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:From:To:Cc:Subject:Date:Message-ID:User-Agent:MIME-Version:Content-Transfer-Encoding:Content-Type;
	b=TuS+lIP++EcXNfY8DM/UnSzS+Ck19VogVdwAIy05CfZw8JuyucUfkY0kuOCd/hvApIWA9cpyJGVRTh6x8lGCQKWlIDIBDileTmZgNI4CeSTcVr+cWTAg2T1y3roQ4vAqlaOrkGxtUvYSPVJjdYvRxkajL3FPhgCN58Y5VqV3Yxo=
X-Yahoo-Newman-Property: ymail-3
X-YMail-OSG: XWRGhdwVM1lhk36lJ5HLntIa11JKmpp2.34tmrLImRVx7rQ
	kStIGcLwLjUpCHpSj6a5kWpZVzCrE22GvK_4Deu29l6ZFisZ4ShmGeYOIIT0
	Z1VMQmEHJGdkmY35c72U2Ql55PvQfdpTiWcLqyUvhFwLpD5001C.3mpdPdHP
	NNmblYb.pNIT7eE7CrdvMx1UKJSnbV7ZmLcti6vO4bSIc_aAw4LwKXLai.xT
	gIs5bqk9tJpQk1piQAwhr2BWcyk8aaUCNz9iikMoF2H8wVeyYTbkJo0ThlS3
	vzfkxmqLFl2g2jyhYRoT4KPWvon63sh4zw9peX.4jbM8E6f3WWM1QPP3fIK.
	xa6MleDyXM8AX4GWCPJVBgWuyFqrR_qfu5H9_I4hkLI56ZFLdTFWJUVhkjO7
	5KtK7YK_VOuPGtdy0I4VgHGWOhKc0VNB3LKywVN_zR8Emx6OHo4VVc17.Blm
	5CCzKsiqCgShOrzm.oCFtu93QrU1rck_VVv89uk1F0iklZxprnNVZmYaC6A_
	AYs9HFnB9qfTBMeeAWJ4HQlQPgUYh093GzCuibuqKEvNC6WUY8wik3Q--
X-Yahoo-SMTP: g0AhWW2swBA2djJKuhuwxPlPqLrHlDrycdPnfR9kZNrpKCA-
Received: from dell4550.localnet (jim_burn@98.92.75.218 with plain)
	by smtp102.sbc.mail.gq1.yahoo.com with SMTP;
	28 Oct 2011 22:57:19 -0700 PDT
From: jim burns <jim_burn@bellsouth.net>
To: xen-devel@lists.xensource.com
Date: Sat, 29 Oct 2011 01:57:12 -0400
Message-ID: <1758215.SCbitK4oVy@dell4550>
User-Agent: KMail/4.7.2 (Linux/2.6.37.6-0.7-default; KDE/4.7.2; i686; ; )
MIME-Version: 1.0
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"
Cc: xen-users@lists.xensource.com
Subject: [Xen-devel] Problems with 'xl create winxp' (hvm) on xen 4.1.2
	(also affects GPLPV)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

Setup:

Fedora 15, w/f16's 3.1.0 (also tried 2.6.40 & 3.0.0)
xen 4.1.2 (newly upgraded from 4.1.1, from rawhide)

Since the release notes for 4.1.2 said, in part:

Fixes/features include:
 * New XL toolstack

I decided to test some problems I saw using xl to start a winxp hvm domu under 
xen 4.1.1, and found that they were still there, and I came up with a somewhat 
more serious one as well. I'm sure that others can point out more serious 
problems, but these are the ones that affect me. In all cases, 'xm create' 
does not have these problems. Domu config at the end of the post.

New to 4.1.2:

1) Starting winxp with xl does not create a vif interface - only a tap one. 
More exactly, the vif is created, but does not get an ipv6 address - it shows 
up in 'ifconfig -a', or 'ifconfig vifn.0' - and does not get added to the 
bridge. If you are using James' GPLPV drivers, you end up with no network 
connectivity, as they use vif, not tap. I'd be surprised if other pvhvm 
solutions don't see this also.

To be clear, 'xm create winxp' correctly puts vif on the bridge, nor did xl 
have this problem under xen 4.1.1. Also, this is an hvm problem. 'xl create'-
ing a pv domu correctly puts the vif on a bridge.

For the remaining problems, note that 'xl create winxp' creates a qemu-dm 
process with the following parameters:

qemu-dm -d 8 -domain-name winxp -vnc 0.0.0.0:3 -k en-us -serial pty -videoram 
4 -boot cda -usb -usbdevice tablet -soundhw es1370 -acpi -vcpus 2 -vcpu_avail 
0x3 -net nic,vlan=0,macaddr=00:16:3e:23:1d:36,model=rtl8139 -net 
tap,vlan=0,ifname=tap8.0,bridge=xenbr0,script=no -M xenfv

2) If your vif= line in your config specifies a bridge, such as 
'bridge=virbr0', the '-net tap' option to qemu-dm remains as 'bridge=xenbr0', 
as if it was hard coded. Again, this is an hvm problem. 'xl create'-ing a pv 
domu correctly puts the vif on the requested bridge. (If memory serves, under 
xen 4.1.1, when the vif for an hvm domain was being put on a bridge, I believe 
it was on the bridge requested, so the problem is just with tap.)

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'.

4) The 'localtime=1' option in your config is ignored by xl. This works with 
xm. Xl will still honor the rtc_timeoffset option.

5) Anything other than 'videoram=4' in your config will be ignored when 
starting with xl, but not with xm. You will get an error in your qemu-dm log 
file of the form:

-videoram option does not work with cirrus vga device model. Videoram set to 
4M.

So, are these bugs? or features? Certainly, I see 1) and 2) as bugs.

The rest of the qemu-dm log is unremarkable. My config follows, with python 
code commented out to keep xl happy.

#import os, re
#arch = os.uname()[4]
#if re.search('64', arch):
#    arch_libdir = 'lib64'
#else:
#    arch_libdir = 'lib'

name = "winxp"
builder='hvm'
memory = "768"
uuid = "6c7de04e-df10-caa8-bb2a-8368246225c1"
#ostype = "hvm"
on_reboot = "restart"
on_crash = "restart"
on_poweroff = "destroy"
vcpus = "2"
viridian=1
#
#kernel = "/usr/lib/xen/boot/hvmloader"
kernel = "hvmloader"
acpi=1
apic=1
boot= "cda"
# New stuff
#device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'
#device_model = '/usr/lib/xen/bin/qemu-dm'
device_model = 'qemu-dm'
#
keymap='en-us'
localtime=1
#rtc_timeoffset=-14400
#rtc_timeoffset=-18000
pae=1
serial='pty'
#serial = "/dev/ttyS0"
#   enable sound card support, [sb16|es1370|all|..,..], default none
soundhw='es1370'
# enable stdvga, default = 0 (use cirrus logic device model)
#stdvga=1
videoram=4
stdvga=0
#usbdevice="mouse"
usbdevice="tablet"
xen_extended_power_mgmt = 0
#
#disk=[ 'tap2:aio:/var/lib/xen/images/winxp,hda,w', 
'phy:/dev/cdrom,hdc:cdrom,r' ]
#disk=[ 'file:/windows/C/var/lib/xen/images/winxp.sav,ioemu:hda,w', 
'phy:/dev/cdrom,hdc:cdrom,r' ]
#disk=[ 'file:/var/lib/xen/images/winxp,ioemu:hda,w', 
'phy:/dev/cdrom,hdc:cdrom,r' ]
disk=[ 'phy:/dev/disk/by-path/ip-192.168.1.101:3260-iscsi-
iqn.2001-04.com.Dell4550-iqn.2009-09.net.bellsouth.sda:041b7d3f-b008-4367-
b1f2-b4799d15e4cd-lun-1,hda,w', 'phy:/dev/cdrom,hdc:cdrom,r' ]
#
vif = [ 'mac=00:16:3e:23:1d:36, script=vif-bridge, bridge = xenbr0, 
model=rtl8139' ]
#vif = [ 'mac=00:16:3e:23:1d:36, type=ioemu, script=vif-bridge, bridge = 
xenbr0, model=e1000' ]
#vif = [ 'mac=00:16:3e:23:1d:37, type=netfront, script=vif-bridge, bridge = 
eth0' ]
#
sdl=0
#vfb = [ 'vnc=1, vnclisten=0.0.0.0, vncunused=0, vncdisplay=3, vncpasswd= ']
vnc=1
vnclisten="0.0.0.0"
#vnclisten="192.168.1.0"
# set VNC display number, default = domid
vncdisplay=3
# try to find an unused port for the VNC server, default = 1
vncunused=0
vncviewer=1
vncconsole=1
monitor=1
vncpasswd=""


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-users-bounces@lists.xensource.com Fri Oct 28 23:18:49 2011
Return-path: <xen-users-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Fri, 28 Oct 2011 23:18:49 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RK2Fl-0003cr-Fo; Fri, 28 Oct 2011 23:18:49 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RK2F4-0003JP-KE
	for xen-users@lists.xensource.com; Fri, 28 Oct 2011 23:18:06 -0700
X-Env-Sender: jim_burn@bellsouth.net
X-Msg-Ref: server-14.tower-216.messagelabs.com!1319869082!1494746!1
X-Originating-IP: [98.139.44.129]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31945 invoked from network); 29 Oct 2011 06:18:03 -0000
Received: from nm2.access.bullet.mail.sp2.yahoo.com (HELO
	nm2.access.bullet.mail.sp2.yahoo.com) (98.139.44.129)
	by server-14.tower-216.messagelabs.com with SMTP;
	29 Oct 2011 06:18:03 -0000
Received: from [98.139.44.97] by nm2.access.bullet.mail.sp2.yahoo.com with
	NNFMP; 29 Oct 2011 06:18:01 -0000
Received: from [98.139.44.89] by tm2.access.bullet.mail.sp2.yahoo.com with
	NNFMP; 29 Oct 2011 06:18:01 -0000
Received: from [127.0.0.1] by omp1026.access.mail.sp2.yahoo.com with NNFMP;
	29 Oct 2011 06:18:01 -0000
X-Yahoo-Newman-Id: 477974.67011.bm@omp1026.access.mail.sp2.yahoo.com
Received: (qmail 73715 invoked from network); 29 Oct 2011 06:18:01 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bellsouth.net; s=s1024;
	t=1319869081; bh=CtmkhHk1UZl7uBo1epCXHIuuty27yFLb0SszqdtM0LM=;
	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=JwFkhzencuORN9eyvka+UUQuRuGDNUh/AUmJYD2/KsUqRZEbhRnk+LMzp1ppdl1UrXrz0NLHInJx2SaHhGOOoPrcBCVWMNVT9JGvpWAkjzABHkKqv4CZp1CyGug13b2s5f29EDhGOmqtmp7A8RT8Psin3SH/d85zMzIFJci5X84=
X-Yahoo-Newman-Property: ymail-3
X-YMail-OSG: 4lcHk_cVM1k8CMa1D5FN.msuZY6KcFvJ8F46qUu9N2SXcMj
	g3TnEZ8cOliWHev0KYgiZnfkYJJ9H4Hd_HcZ8N9dDjvuyQ2CImsaWhCyUQtW
	WrPkPlD3Ig9kz1aGiO3Hp3of5kFTlKNfawx8RuhAyvED24ym39340s3RbhYp
	HdoUtp6D1mkNcqpH5bDWrr_Bo9p7qCiyuQ2cflhtQLbFG6WWNMwVOKXYVc4K
	VtcLQJYz0aZi5fMiaCc4TAMUcgwh0aOZ_otG.R2zDeoQbuZaAlyPV_6kTPlv
	QsTDxAdvA990JLHOSwRyhVvUPY5gNthZs13YTgCs0aG.r1Ju.idp7GE4Jj92
	QiK7OoqCw2R3_Khst6rQPXZ7.kc0YZQLBJh96QkRZea6Jew9i9sFHUvjoqSX
	PZqmzBzHvRRM6XlZHDNnVUvdMK4Kigk87QJ5SP5n.DisQ.dQKkd34cLSOCwK
	2ePrSSoFh5CXEPe5GbJxmNY8eSOpPmv2LyZs2x9fkicYtdvcgMpfQAZV1XSe
	X1fSIKGaBCNibK4mpad5Mc9CRXOA1z1MmmzzyqH2SYVDXENkokgotCp54C5M
	ivlV0LfgH8pBaAy8IngWO00_k2l.utVKkDTVNr_bDNbPiKJvnNTM2mwLAz5h
	yxW5lbwcctAtMg9o-
X-Yahoo-SMTP: g0AhWW2swBA2djJKuhuwxPlPqLrHlDrycdPnfR9kZNrpKCA-
Received: from dell4550.localnet (jim_burn@98.92.75.218 with plain)
	by smtp102.sbc.mail.gq1.yahoo.com with SMTP;
	28 Oct 2011 23:18:00 -0700 PDT
From: jim burns <jim_burn@bellsouth.net>
To: xen-devel@lists.xensource.com
Date: Sat, 29 Oct 2011 02:17:49 -0400
Message-ID: <9873598.H8yuxEpZYE@dell4550>
User-Agent: KMail/4.7.2 (Linux/2.6.37.6-0.7-default; KDE/4.7.2; i686; ; )
In-Reply-To: <1758215.SCbitK4oVy@dell4550>
References: <1758215.SCbitK4oVy@dell4550>
MIME-Version: 1.0
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"
Cc: xen-users@lists.xensource.com
Subject: [Xen-users] Re: Problems with 'xl create winxp' (hvm) on xen 4.1.2
	(also affects GPLPV)
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 Sat October 29 2011, 1:57:12 AM, jim burns wrote:
> For the remaining problems, note that 'xl create winxp' creates a qemu-dm 
> process with the following parameters:
> 
> qemu-dm -d 8 -domain-name winxp -vnc 0.0.0.0:3 -k en-us -serial pty
> -videoram  4 -boot cda -usb -usbdevice tablet -soundhw es1370 -acpi -vcpus
> 2 -vcpu_avail 0x3 -net nic,vlan=0,macaddr=00:16:3e:23:1d:36,model=rtl8139
> -net tap,vlan=0,ifname=tap8.0,bridge=xenbr0,script=no -M xenfv

Note, starting the domain with 'xm create' with the same config results in:

/usr/lib/xen/bin/qemu-dm -d 11 -domain-name winxp -videoram 4 -k en-us -vnc 
0.0.0.0:3 -monitor vc -vcpus 2 -vcpu_avail 0x3 -boot cda -soundhw es1370 -
localtime -serial pty -acpi -usbdevice tablet -net 
nic,vlan=1,macaddr=00:16:3e:23:1d:36,model=rtl8139 -net 
tap,vlan=1,ifname=tap11.0,bridge=xenbr0 -M xenfv

Note, 'xl create' does not pass the '-localtime' option, and its '-net tap' 
specifies 'script=no', unlike 'xm create'. Also, for some reason, the vlan 
numbers are different between xl and xm.

_______________________________________________
Xen-users mailing list
Xen-users@lists.xensource.com
http://lists.xensource.com/xen-users

From xen-devel-bounces@lists.xensource.com Sat Oct 29 12:39:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 29 Oct 2011 12:39:34 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKEke-0001xH-8J; Sat, 29 Oct 2011 12:39:32 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKEjp-0001kj-BE
	for xen-devel@lists.xensource.com; Sat, 29 Oct 2011 12:38:41 -0700
X-Env-Sender: florian.heigl@gmail.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1319917083!54776767!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5754 invoked from network); 29 Oct 2011 19:38:04 -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;
	29 Oct 2011 19:38:04 -0000
Received: by iaen33 with SMTP id n33so7508619iae.30
	for <xen-devel@lists.xensource.com>;
	Sat, 29 Oct 2011 12:38:36 -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=MvmuWd0INOkNUt/HrjoGjcUYnWoYbojpT8cdnMEJ1ww=;
	b=fZuhm0kqHIDAJdKnOlAccTeuTZKvh9wpbTwsqH3xGaZB8AdMm1oDyRUJfb9B5wCSUK
	iFPBuAxMc8glSdRdodW9Y6D/fqn6XSF+6XFQ5fPVfveYxpZRp1MpPyUkc1BHx0yPEjSM
	8lzdg1iivvgT178v53C06xz1UcbWoS0/SwJKs=
MIME-Version: 1.0
Received: by 10.231.41.4 with SMTP id m4mr2753307ibe.44.1319917116703; Sat, 29
	Oct 2011 12:38:36 -0700 (PDT)
Received: by 10.231.208.143 with HTTP; Sat, 29 Oct 2011 12:38:36 -0700 (PDT)
In-Reply-To: <1319795729.9436.209.camel@zakaz.uk.xensource.com>
References: <CAFivhPmT1mfzaQbPDviB4jMAUBe5u-cruXtDz7U2Jh7jWrPCcQ@mail.gmail.com>
	<CAFivhPniexii22twa+Cq+WPk2GUp5i=bKJZKpo4BH=ev1A3Jfg@mail.gmail.com>
	<1319795729.9436.209.camel@zakaz.uk.xensource.com>
Date: Sat, 29 Oct 2011 21:38:36 +0200
Message-ID: <CAFivhP=niHCDz_xsgdwTJxCd=8CU4sKA_v_TAh53WQPHSGF3gA@mail.gmail.com>
Subject: Re: [Xen-devel] Fwd: Examples for using xl migrate -s ?
From: Florian Heigl <florian.heigl@gmail.com>
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
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

Hi,

2011/10/28 Ian Campbell <Ian.Campbell@citrix.com>:
>> sorry to disturb, but are there any in-depth docs about migration in xl?
>
> Not that I know of, sorry.

usage as an exercise left to the user. :>

> Perhaps an option to xl migrate-receive to have it receive a single
> connection on a specified socket from a given source instead of
> expecting things on stdin would be a useful compromise? i.e. you should
> use ssh to execute that command "securely" then pipe the data to the
> unsecure socket?

I don't write network protocols ... I don't know which way of
connection setup would be best, but using ssh to securely initiate
things definitely makes sense.
On the other hand I don't like the initiator of (the migration)
something telling the receiver where to listen. That's like the NAT
traversal stuff in SIP.

Maybe, uh, something like:
ssh into migration target, saying hi, please spin up a receiver using
(stdin|network)
server says: receiver ready at (stdin|network ip+socket)
client sends to the correct destination.

The advantage would be that the server could have the final decision
about which interface to use, it might well be different from the
SSH-facing one.

> It's the Unix way, surely ;-)

Hehe, getting me from the Unix angle, I feel trapped!

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sat Oct 29 20:39:15 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 29 Oct 2011 20: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 1RKMEt-00045z-E8; Sat, 29 Oct 2011 20:39:15 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKMEB-0003tf-9q
	for xen-devel@lists.xensource.com; Sat, 29 Oct 2011 20:38:31 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-14.tower-27.messagelabs.com!1319945792!42321106!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19636 invoked from network); 30 Oct 2011 03:36:32 -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;
	30 Oct 2011 03:36:32 -0000
X-IronPort-AV: E=Sophos;i="4.69,425,1315180800"; 
   d="scan'208";a="8660268"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	30 Oct 2011 03:38: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; Sun, 30 Oct 2011 03:38: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 1RKME7-0001KC-5p;
	Sun, 30 Oct 2011 03:38:27 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RKME6-0005jp-Vn;
	Sun, 30 Oct 2011 03:38:27 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9647-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 30 Oct 2011 03:38:27 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9647: 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 9647 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9647/

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 9646
 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                  0fea1ad50ce3
baseline version:
 xen                  0fea1ad50ce3

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 Sat Oct 29 23:22:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sat, 29 Oct 2011 23: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 1RKOmY-0007VS-0v; Sat, 29 Oct 2011 23:22:10 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKOlc-0007Ie-U9
	for xen-devel@lists.xensource.com; Sat, 29 Oct 2011 23:21:13 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1319955669!1552659!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26389 invoked from network); 30 Oct 2011 06:21:09 -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;
	30 Oct 2011 06:21:09 -0000
X-IronPort-AV: E=Sophos;i="4.69,425,1315180800"; 
   d="scan'208";a="8660528"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	30 Oct 2011 06: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, 30 Oct 2011 06:21: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 1RKOlY-0002Dn-Ii;
	Sun, 30 Oct 2011 06:21:08 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RKOlY-0006ol-8C;
	Sun, 30 Oct 2011 06:21:08 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9648-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Sun, 30 Oct 2011 06:21:08 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9648: 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 9648 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9648/

Failures :-/ but no regressions.

Tests which are failing intermittently (not blocking):
 test-amd64-amd64-xl-sedf     11 guest-localmigrate           fail pass in 9647

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 9647 like 9646

version targeted for testing:
 xen                  0fea1ad50ce3
baseline version:
 xen                  0fea1ad50ce3

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 Sun Oct 30 13:59:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 30 Oct 2011 13:59:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKcTU-0006Xg-GB; Sun, 30 Oct 2011 13:59:24 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKcSH-0006Kv-PC; Sun, 30 Oct 2011 13:58:11 -0700
X-Env-Sender: florian.heigl@gmail.com
X-Msg-Ref: server-7.tower-182.messagelabs.com!1320008284!1276674!1
X-Originating-IP: [209.85.210.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26796 invoked from network); 30 Oct 2011 20:58:05 -0000
Received: from mail-iy0-f171.google.com (HELO mail-iy0-f171.google.com)
	(209.85.210.171)
	by server-7.tower-182.messagelabs.com with RC4-SHA encrypted SMTP;
	30 Oct 2011 20:58:05 -0000
Received: by iaen33 with SMTP id n33so9040032iae.30
	for <multiple recipients>; Sun, 30 Oct 2011 13:58: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=8Hauz9R9SK4/2DvUAQVXmk6DwH8XPKjddrNb/bZ0t7Q=;
	b=Y7LoEYytqa/dhtl/cvXzvFIjCJ0X34JmNahyFXFnWoQU7cH/bDQ3bi4OIt1O3XlZb0
	YgPTaQo2pEPw2LwkFBSHjWYfW9Gq7924z+gmCr99v9J7ux7TPxxabYjWJywsQP5kaV8b
	c7vfZmI2WSN+M/4OMgB8qLP+Ftj4JPWsTxvKI=
MIME-Version: 1.0
Received: by 10.231.41.4 with SMTP id m4mr4185720ibe.44.1320008283730; Sun, 30
	Oct 2011 13:58:03 -0700 (PDT)
Received: by 10.231.208.143 with HTTP; Sun, 30 Oct 2011 13:58:03 -0700 (PDT)
In-Reply-To: <4EAAA467.2030503@xen.org>
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111026195543.GA6558@phenom.dumpdata.com>
	<4EA932D5.3060504@xen.org>
	<CAOzFzEiTzSDABmtJw3u+jow5Xw_wRYNxFr9U_G-q59-Qwv7j=g@mail.gmail.com>
	<4EAAA467.2030503@xen.org>
Date: Sun, 30 Oct 2011 21:58:03 +0100
Message-ID: <CAFivhPk7Pk4DWHeDVTWvV26vQqU0-pqUqvV3GNx5JBDShQW85g@mail.gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Florian Heigl <florian.heigl@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>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Andrew Bobulsky <rulerof@gmail.com>,
	Joseph Glanville <joseph.glanville@orionvm.com.au>,
	"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

Hi Lars,

2011/10/28 Lars Kurth <lars.kurth@xen.org>:
> There may be a few more. Will need to work on these a little more. It may
> also mean that the MediWiki instance is set up that pages must have a
> category and that only a subset of users can create new ones. Otherwise we
> get into the same mess again.

I think the main issues (mess) with the old wiki were:
- not being able to contact someone if information is incorrect / outdated
- noone looking into pages that had become outdated
- not looking for pages that might be outdated
- most of the pages being immutable so you couldn't even fix stuff.

So if we limit edit rights to certain user groups that is not a
problem, as long as the groups are big enough to maintain the
categories.
Also it might be helpful to use a release mechanism - if any
registered user can create pages, but they stay invisible until
approval then this would save a lot of time for the regular authors
and still keep up quality. (Thats working really well in my
experience)

Greetings
Florian

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Sun Oct 30 21:39:09 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Sun, 30 Oct 2011 21:39:09 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKjeO-0006kD-KY; Sun, 30 Oct 2011 21:39:09 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKjdg-0006Xs-H8
	for xen-devel@lists.xensource.com; Sun, 30 Oct 2011 21:38:24 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320035877!50794742!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23096 invoked from network); 31 Oct 2011 04:37:57 -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;
	31 Oct 2011 04:37:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,429,1315180800"; 
   d="scan'208";a="8666340"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 04:38: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; Mon, 31 Oct 2011 04:38: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 1RKjdc-0001Ca-TU;
	Mon, 31 Oct 2011 04:38:20 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RKjdc-0001b6-ME;
	Mon, 31 Oct 2011 04:38:20 +0000
To: xen-devel@lists.xensource.com
Message-ID: <osstest-9649-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Mon, 31 Oct 2011 04:38:20 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9649: 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 9649 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9649/

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-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                  0fea1ad50ce3
baseline version:
 xen                  0fea1ad50ce3

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


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 Oct 31 02:26:32 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:26:32 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKo8W-0006En-7x; Mon, 31 Oct 2011 02:26:32 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKo7h-00062S-5O
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:25:41 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1320053137!2297809!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32572 invoked from network); 31 Oct 2011 09:25:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-7.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Oct 2011 09:25:38 -0000
X-IronPort-AV: E=Sophos;i="4.69,429,1315180800"; 
   d="scan'208";a="8668862"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:25:37 +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, 31 Oct 2011 09:25:37 +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>
Date: Mon, 31 Oct 2011 09:25:37 +0000
In-Reply-To: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110271659380.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: <1320053137.23193.9.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-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.
> Further improvements and clarifications to this man page are very welcome.

I had a thought over the weekend... It took me a while to get used to
but the git style of a manpage per subcommand and having "git COMMAND
--help" spawn man of that page works really well.

A long list of subcommands such as this gets a bit unwieldy. Having a
page per command also means you can take advantage of e.g. a SEE ALSO
for each command individually and things like that.

I think you've got all the content already it's just a matter of
separating it.

If we were feeling sneaky we could probably arrange for the build to
fail if no man page is available for a command listed in
xl_cmdtable.c };-)

Ian.

> 
> 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>]
> +
> +=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 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.
> +
> +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.
> +
> +=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.
> +
> +=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
> +domain OS any chance to react, and is the equivalent of ripping the
> +power cord out on a physical machine.  In most cases you will want to
> +use the B<shutdown> command instead.
> +
> +=item B<domid> I<domain-name>
> +
> +Converts a domain name to a domain id.
> +
> +=item B<domname> I<domain-id>
> +
> +Converts a domain id to a domain name.
> +
> +=item B<rename> I<domain-id> I<new-name>
> +
> +Change the domain name of I<domain-id> to I<new-name>.
> +
> +=item B<dump-core> I<domain-id> [I<filename>]
> +
> +Dumps the virtual machine's memory for the specified domain to the
> +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<help> [I<--long>]
> +
> +Displays the short help message (i.e. common commands).
> +
> +The I<--long> option prints out the complete set of B<xl> subcommands,
> +grouped by function.
> +
> +=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?
> +
> +=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?
> +
> +=back
> +
> +B<NOTES>
> +
> +=over 4
> +
> +The Time column is deceptive.  Virtual IO (network and block devices)
> +used by domains requires coordination by Domain0, which means that
> +Domain0 is actually charged for much of the time that a DomainU is
> +doing IO.  Use of this time value to determine relative utilizations
> +by domains is thus very suspect, as a high IO workload may show as
> +less utilized than a high CPU workload.  Consider yourself warned.
> +
> +=back
> +
> +=item B<mem-max> I<domain-id> I<mem>
> +
> +Specify the maximum amount of memory the domain is able to use, appending 't'
> +for terabytes, 'g' for gigabytes, 'm' for megabytes, 'k' for kilobytes and 'b'
> +for bytes.
> +
> +The mem-max value may not correspond to the actual memory used in the
> +domain, as it may balloon down its memory to give more back to the OS.
> +
> +=item B<mem-set> I<domain-id> I<mem>
> +
> +Set the domain's used memory using the balloon driver; append 't' for
> +terabytes, 'g' for gigabytes, 'm' for megabytes, 'k' for kilobytes and 'b' for
> +bytes.
> +
> +Because this operation requires cooperation from the domain operating
> +system, there is no guarantee that it will succeed.  This command will
> +definitely not work unless the domain has the required paravirt
> +driver.
> +
> +B<Warning:> There is no good way to know in advance how small of a
> +mem-set will make a domain unstable and cause it to crash.  Be very
> +careful when using this command on running domains.
> +
> +=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.
> +
> +=item B<-C> I<config>
> +
> +Send <config> instead of config file from creation.
> +
> +=back
> +
> +=item B<pause> I<domain-id>
> +
> +Pause a domain.  When in a paused state the domain will still consume
> +allocated resources such as memory, but will not be eligible for
> +scheduling by the Xen hypervisor.
> +
> +=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.  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.
> +
> +=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.
> +
> +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<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.
> +
> +=item B<unpause> I<domain-id>
> +
> +Moves a domain out of the paused state.  This will allow a previously
> +paused domain to now be eligible for scheduling by the Xen hypervisor.
> +
> +=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.
> +
> +=item B<vcpu-list> [I<domain-id>]
> +
> +Lists VCPU information for a specific domain.  If no domain is
> +specified, VCPU information for all domains will be provided.
> +
> +=item B<vcpu-pin> I<domain-id> I<vcpu> I<cpus>
> +
> +Pins the VCPU to only run on the specific CPUs.  The keyword
> +B<all> can be used to apply the I<cpus> list to all VCPUs in the
> +domain.
> +
> +Normally VCPUs can float between available CPUs whenever Xen deems a
> +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<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.
> +
> +=back
> +
> +=head1 XEN HOST SUBCOMMANDS
> +
> +=over 4
> +
> +=item B<debug-keys> I<keys>
> +
> +Send debug I<keys> to Xen.
> +
> +=item B<dmesg> [B<-c>]
> +
> +Reads the Xen message buffer, similar to dmesg on a Linux system.  The
> +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.
> +
> +Sample output looks as follows (lines wrapped manually to make the man
> +page more readable):
> +
> + host                   : talon
> + release                : 2.6.12.6-xen0
> + 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.
> +
> +=item B<free_memory>
> +
> +Available memory (in MB) not allocated to Xen, or any other domains.
> +
> +=item B<xen_caps>
> +
> +The Xen version and architecture.  Architecture values can be one of:
> +x86_32, x86_32p (i.e. PAE enabled), x86_64, ia64.
> +
> +=item B<xen_changeset>
> +
> +The Xen mercurial changeset id.  Very useful for determining exactly
> +what version of code your Xen system was built from.
> +
> +=back
> +
> +B<OPTIONS>
> +
> +=over 4
> +
> +=item B<-n>, B<--numa>
> +
> +List host NUMA topology information
> +
> +=back
> +
> +=item B<top>
> +
> +Executes the B<xentop> command, which provides real time monitoring of
> +domains.  Xentop is a curses interface, and reasonably self
> +explanatory.
> +
> +=item B<uptime>
> +
> +Prints the current uptime of the domains running.
> +
> +=item B<pci-list-assignable-devices>
> +
> +List all the assignable PCI devices.
> +
> +=back
> +
> +=head1 SCHEDULER SUBCOMMANDS
> +
> +Xen ships with a number of domain schedulers, which can be set at boot
> +time with the B<sched=> parameter on the Xen command line.  By
> +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>] ] ]
> +
> +Set 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>
> +
> +=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.
> +
> +=item I<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
> +is expressed in percentage of one physical CPU: 100 is 1 physical CPU,
> +50 is half a CPU, 400 is 4 CPUs, etc. The default, 0, means there is
> +no upper cap.
> +
> +=back
> +
> +=back
> +
> +=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.
> +
> +=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>.
> +
> +=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.  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.
> +
> +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.
> +
> +=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>
> +
> +=head1 BUGS
> +
> +Send bugs to xen-devel@lists.xensource.com.
> 
> _______________________________________________
> 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 Oct 31 02:31:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:31:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoD8-0006mB-72; Mon, 31 Oct 2011 02:31:18 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKoCb-0006Zk-49
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:30:45 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1320053414!51184591!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10457 invoked from network); 31 Oct 2011 09:30:14 -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;
	31 Oct 2011 09:30:14 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8668990"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:30: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;
	Mon, 31 Oct 2011 09:30:42 +0000
Subject: Re: [Xen-devel] Fwd: Examples for using xl migrate -s ?
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Florian Heigl <florian.heigl@gmail.com>
Date: Mon, 31 Oct 2011 09:30:41 +0000
In-Reply-To: <CAFivhP=niHCDz_xsgdwTJxCd=8CU4sKA_v_TAh53WQPHSGF3gA@mail.gmail.com>
References: <CAFivhPmT1mfzaQbPDviB4jMAUBe5u-cruXtDz7U2Jh7jWrPCcQ@mail.gmail.com>
	<CAFivhPniexii22twa+Cq+WPk2GUp5i=bKJZKpo4BH=ev1A3Jfg@mail.gmail.com>
	<1319795729.9436.209.camel@zakaz.uk.xensource.com>
	<CAFivhP=niHCDz_xsgdwTJxCd=8CU4sKA_v_TAh53WQPHSGF3gA@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: <1320053441.23193.14.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 Sat, 2011-10-29 at 20:38 +0100, Florian Heigl wrote:
> Hi,
> 
> 2011/10/28 Ian Campbell <Ian.Campbell@citrix.com>:
> >> sorry to disturb, but are there any in-depth docs about migration in xl?
> >
> > Not that I know of, sorry.
> 
> usage as an exercise left to the user. :>

As part of the documentation day last week Stefano Stabellini posted a
manpage for xl which no doubt contains a few words on this subject.
Please could you have a look in the archives and see if what is written
there would have helped.

> > Perhaps an option to xl migrate-receive to have it receive a single
> > connection on a specified socket from a given source instead of
> > expecting things on stdin would be a useful compromise? i.e. you should
> > use ssh to execute that command "securely" then pipe the data to the
> > unsecure socket?
> 
> I don't write network protocols ... I don't know which way of
> connection setup would be best, but using ssh to securely initiate
> things definitely makes sense.
> On the other hand I don't like the initiator of (the migration)
> something telling the receiver where to listen. That's like the NAT
> traversal stuff in SIP.
> 
> Maybe, uh, something like:
> ssh into migration target, saying hi, please spin up a receiver using
> (stdin|network)
> server says: receiver ready at (stdin|network ip+socket)
> client sends to the correct destination.

I think that could work, yes.

> The advantage would be that the server could have the final decision
> about which interface to use, it might well be different from the
> SSH-facing one.
> 
> > It's the Unix way, surely ;-)
> 
> Hehe, getting me from the Unix angle, I feel trapped!

:-)

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 02:32:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:32:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoER-0007RH-9C; Mon, 31 Oct 2011 02:32:39 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoD7-0006kc-6j; Mon, 31 Oct 2011 02:31:17 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-182.messagelabs.com!1320053473!1319920!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29294 invoked from network); 31 Oct 2011 09:31:14 -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;
	31 Oct 2011 09:31:14 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8669004"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:31:13 +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, 31 Oct 2011 09:31:13 +0000
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Florian Heigl <florian.heigl@gmail.com>
Date: Mon, 31 Oct 2011 09:31:13 +0000
In-Reply-To: <CAFivhPk7Pk4DWHeDVTWvV26vQqU0-pqUqvV3GNx5JBDShQW85g@mail.gmail.com>
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>	<20111026195543.GA6558@phenom.dumpdata.com>
	<4EA932D5.3060504@xen.org>
	<CAOzFzEiTzSDABmtJw3u+jow5Xw_wRYNxFr9U_G-q59-Qwv7j=g@mail.gmail.com>
	<4EAAA467.2030503@xen.org>
	<CAFivhPk7Pk4DWHeDVTWvV26vQqU0-pqUqvV3GNx5JBDShQW85g@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: <1320053473.23193.15.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>,
	Andrew Bobulsky <rulerof@gmail.com>, Lars Kurth <lars.kurth@xen.org>,
	Joseph Glanville <joseph.glanville@orionvm.com.au>,
	"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 Sun, 2011-10-30 at 20:58 +0000, Florian Heigl wrote:
> - most of the pages being immutable so you couldn't even fix stuff. 

This one is a protective measure against spammers (which have been a big
problem in the past). I sure hope media wiki has some better mechanisms
than requiring every account to be manually authorised as an editor (I'm
sure it must do!). It's a big barrier to "drive by fixups" as well as
presenting an initial barrier which even longer term contributors have
to cross.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 02:35:56 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:35:56 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoHc-0008WJ-Bu; Mon, 31 Oct 2011 02:35:56 -0700
Received: from mail174.messagelabs.com ([85.158.138.51])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKoEm-0007Xa-F5
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:33:01 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-174.messagelabs.com!1320053577!30874092!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24195 invoked from network); 31 Oct 2011 09:32:57 -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;
	31 Oct 2011 09:32:57 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8669057"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:32: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, 31 Oct 2011 09:32:57 +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>, Dan Magenheimer
	<dan.magenheimer@oracle.com>
Date: Mon, 31 Oct 2011 09:32:56 +0000
In-Reply-To: <alpine.DEB.2.00.1110271659380.3519@kaball-desktop>
References: <alpine.DEB.2.00.1110271659380.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: <1320053576.23193.17.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-10-27 at 17:19 +0100, Stefano Stabellini wrote:
> 
> Almost every command implemented in xl should be present, a notable
> exception are the tmem commands that are currently missing. 

That should be easy to fix -- Dan could you provide some words about
these commands please?

I assume Stefano is referring to:

$ grep \"tmem tools/libxl/xl_cmdtable.c
    { "tmem-list",
    { "tmem-freeze",
    { "tmem-destroy",
    { "tmem-thaw",
    { "tmem-set",
    { "tmem-shared-auth",
    { "tmem-freeable",

These mirror the xm commands but there's nothing we can crib there
either.

POD format per Stefano's original post would be ideal but if you don't
feel like learning that (although it is pretty simple) I think we can
offer to format stuff up if you just provide the words.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 02:36:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:36:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoIW-0000SL-PC; Mon, 31 Oct 2011 02:36:52 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKoGS-0008AH-Rx
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:34:45 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-9.tower-216.messagelabs.com!1320053681!1678052!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3301 invoked from network); 31 Oct 2011 09:34:41 -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;
	31 Oct 2011 09:34:41 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8669093"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:34: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;
	Mon, 31 Oct 2011 09:34:42 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 01/13] libxl: Make libxl__xs_* more
	const-correct
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 31 Oct 2011 09:34:41 +0000
In-Reply-To: <1319827031-15395-2-git-send-email-ian.jackson@eu.citrix.com>
References: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-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: <1320053681.23193.18.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-10-28 at 19:36 +0100, Ian Jackson wrote:
> Paths and values which are not modified by these functions should be
> declared as "const char *" not "char *".
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>

Obviously correct, (assuming it compiles, which is a safe assumption I
think ;-))):

Acked-by: Ian Campbell <ian.campbell@citrix.com>


> ---
>  tools/libxl/libxl_internal.h |    9 +++++----
>  tools/libxl/libxl_xshelp.c   |    9 +++++----
>  2 files changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 2e26ac6..31adbc8 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -181,18 +181,19 @@ _hidden char *libxl__dirname(libxl__gc *gc, const char *s);
>  _hidden char **libxl__xs_kvs_of_flexarray(libxl__gc *gc, flexarray_t *array, int length);
>  
>  _hidden int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t,
> -                    char *dir, char **kvs);
> +                             const char *dir, char **kvs);
>  _hidden int libxl__xs_write(libxl__gc *gc, xs_transaction_t t,
> -                   char *path, const char *fmt, ...) PRINTF_ATTRIBUTE(4, 5);
> +               const char *path, const char *fmt, ...) PRINTF_ATTRIBUTE(4, 5);
>     /* Each fn returns 0 on success.
>      * On error: returns -1, sets errno (no logging) */
>  
>  _hidden char *libxl__xs_get_dompath(libxl__gc *gc, uint32_t domid);
>     /* On error: logs, returns NULL, sets errno. */
>  
> -_hidden char *libxl__xs_read(libxl__gc *gc, xs_transaction_t t, char *path);
> +_hidden char *libxl__xs_read(libxl__gc *gc, xs_transaction_t t,
> +                             const char *path);
>  _hidden char **libxl__xs_directory(libxl__gc *gc, xs_transaction_t t,
> -                                   char *path, unsigned int *nb);
> +                                   const char *path, unsigned int *nb);
>     /* On error: returns NULL, sets errno (no logging) */
>  
>  /* from xl_dom */
> diff --git a/tools/libxl/libxl_xshelp.c b/tools/libxl/libxl_xshelp.c
> index e41f962..56a7c7b 100644
> --- a/tools/libxl/libxl_xshelp.c
> +++ b/tools/libxl/libxl_xshelp.c
> @@ -49,7 +49,7 @@ char **libxl__xs_kvs_of_flexarray(libxl__gc *gc, flexarray_t *array, int length)
>  }
>  
>  int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t,
> -                    char *dir, char *kvs[])
> +                     const char *dir, char *kvs[])
>  {
>      libxl_ctx *ctx = libxl__gc_owner(gc);
>      char *path;
> @@ -69,7 +69,7 @@ int libxl__xs_writev(libxl__gc *gc, xs_transaction_t t,
>  }
>  
>  int libxl__xs_write(libxl__gc *gc, xs_transaction_t t,
> -                   char *path, const char *fmt, ...)
> +                    const char *path, const char *fmt, ...)
>  {
>      libxl_ctx *ctx = libxl__gc_owner(gc);
>      char *s;
> @@ -87,7 +87,7 @@ int libxl__xs_write(libxl__gc *gc, xs_transaction_t t,
>      return 0;
>  }
>  
> -char * libxl__xs_read(libxl__gc *gc, xs_transaction_t t, char *path)
> +char * libxl__xs_read(libxl__gc *gc, xs_transaction_t t, const char *path)
>  {
>      libxl_ctx *ctx = libxl__gc_owner(gc);
>      char *ptr;
> @@ -113,7 +113,8 @@ char *libxl__xs_get_dompath(libxl__gc *gc, uint32_t domid)
>      return s;
>  }
>  
> -char **libxl__xs_directory(libxl__gc *gc, xs_transaction_t t, char *path, unsigned int *nb)
> +char **libxl__xs_directory(libxl__gc *gc, xs_transaction_t t,
> +                           const char *path, unsigned int *nb)
>  {
>      libxl_ctx *ctx = libxl__gc_owner(gc);
>      char **ret = NULL;



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 02:40:39 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:40:39 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoMB-0000tw-7u; Mon, 31 Oct 2011 02:40:39 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKoLZ-0000hE-VA
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:40:02 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1320053998!2268276!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8932 invoked from network); 31 Oct 2011 09:39:59 -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;
	31 Oct 2011 09:39:59 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8669221"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:39:58 +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, 31 Oct 2011 09:39:58 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 02/13] libxenstore: Provide
	xs_check_watch
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 31 Oct 2011 09:39:58 +0000
In-Reply-To: <1319827031-15395-3-git-send-email-ian.jackson@eu.citrix.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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320053998.23193.20.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-10-28 at 19:37 +0100, Ian Jackson wrote:
> +
> +out_false:
> +	if (nonblocking) {
> +		int e = errno;
> +		setnonblock(fd, 0);
> +		errno = e;
> +	}

Since setnonblock cannot itself return an error should it always
preserve errno on behalf of the caller?

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 02:41:29 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:41:29 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoMz-0001Gu-IZ; Mon, 31 Oct 2011 02:41:29 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoLr-0000mc-AM; Mon, 31 Oct 2011 02:40:20 -0700
X-Env-Sender: fajar@fajar.net
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320054014!1667035!1
X-Originating-IP: [209.85.160.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30702 invoked from network); 31 Oct 2011 09:40:15 -0000
Received: from mail-gy0-f171.google.com (HELO mail-gy0-f171.google.com)
	(209.85.160.171)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Oct 2011 09:40:15 -0000
Received: by gyg13 with SMTP id 13so9945289gyg.30
	for <multiple recipients>; Mon, 31 Oct 2011 02:40:14 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.151.59.20 with SMTP id m20mr10181997ybk.39.1320054014408; Mon,
	31 Oct 2011 02:40:14 -0700 (PDT)
Received: by 10.150.202.2 with HTTP; Mon, 31 Oct 2011 02:40:14 -0700 (PDT)
In-Reply-To: <1320053473.23193.15.camel@zakaz.uk.xensource.com>
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111026195543.GA6558@phenom.dumpdata.com>
	<4EA932D5.3060504@xen.org>
	<CAOzFzEiTzSDABmtJw3u+jow5Xw_wRYNxFr9U_G-q59-Qwv7j=g@mail.gmail.com>
	<4EAAA467.2030503@xen.org>
	<CAFivhPk7Pk4DWHeDVTWvV26vQqU0-pqUqvV3GNx5JBDShQW85g@mail.gmail.com>
	<1320053473.23193.15.camel@zakaz.uk.xensource.com>
Date: Mon, 31 Oct 2011 16:40:14 +0700
Message-ID: <CAG1y0sf-pYn5NaAJL=mxtvm3xtOKknK6O8evwH7wivNOd0uvsg@mail.gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
From: "Fajar A. Nugraha" <list@fajar.net>
To: Ian Campbell <Ian.Campbell@citrix.com>
Content-Type: text/plain; charset=ISO-8859-1
Cc: Florian Heigl <florian.heigl@gmail.com>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Andrew Bobulsky <rulerof@gmail.com>, Lars Kurth <lars.kurth@xen.org>,
	Joseph Glanville <joseph.glanville@orionvm.com.au>,
	"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, Oct 31, 2011 at 4:31 PM, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> On Sun, 2011-10-30 at 20:58 +0000, Florian Heigl wrote:
>> - most of the pages being immutable so you couldn't even fix stuff.
>
> This one is a protective measure against spammers (which have been a big
> problem in the past). I sure hope media wiki has some better mechanisms
> than requiring every account to be manually authorised as an editor (I'm
> sure it must do!). It's a big barrier to "drive by fixups" as well as
> presenting an initial barrier which even longer term contributors have
> to cross.

For comparison purposes, the approach taken by wiki.freeradius.org
looks good: http://wiki.freeradius.org/New%20Wiki

It uses Github, Facebook, or Twitter account for login, trusting those
providers to filter-out spammers to a certain degree.

-- 
Fajar

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 02:44:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:44:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoQ5-0002Lr-SL; Mon, 31 Oct 2011 02:44:41 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKoOz-0001zR-Ln
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:43:34 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-216.messagelabs.com!1320054210!1673556!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7970 invoked from network); 31 Oct 2011 09:43:30 -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;
	31 Oct 2011 09:43:30 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8669323"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:43: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, 31 Oct 2011 09:43:30 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 03/13] libxl: Provide a version of
	bsd's queue.h as _libxl_list.h
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 31 Oct 2011 09:43:30 +0000
In-Reply-To: <1319827031-15395-4-git-send-email-ian.jackson@eu.citrix.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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320054210.23193.23.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-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?

Otherwise I'm happy with this, so:

Acked-by: Ian Campbell <Ian.campbell@citrix.com>

Also Roger previously supplied a

Tested-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 Mon Oct 31 02:47:12 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:47:12 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoSV-0002kv-P9; Mon, 31 Oct 2011 02:47:11 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKoS0-0002Yi-32
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:46:40 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-216.messagelabs.com!1320054396!1666685!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14796 invoked from network); 31 Oct 2011 09:46:36 -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;
	31 Oct 2011 09:46:36 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8669395"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:46: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, 31 Oct 2011 09:46:36 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 04/13] libxl: idl: support new
	"c_only" type attribute
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 31 Oct 2011 09:46:36 +0000
In-Reply-To: <1319827031-15395-5-git-send-email-ian.jackson@eu.citrix.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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320054396.23193.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 Fri, 2011-10-28 at 19:37 +0100, Ian Jackson wrote:
> This provides for fields in libxl datatypes which are only present in
> the C version of structures.  This is useful, for example, when a
> libxl datatype wants to contain fields which are used by libxl
> internally and which are only present in the structure to avoid
> additional memory allocation inconvenience.
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>

Acked-by: Ian Campbell <ian.campbell@citrix.com>

> ---
>  tools/libxl/gentest.py    |    2 ++
>  tools/libxl/libxltypes.py |    4 +++-
>  2 files changed, 5 insertions(+), 1 deletions(-)
> 
> diff --git a/tools/libxl/gentest.py b/tools/libxl/gentest.py
> index 6697ac5..ed5358d 100644
> --- a/tools/libxl/gentest.py
> +++ b/tools/libxl/gentest.py
> @@ -56,6 +56,8 @@ def gen_rand_init(ty, v, indent = "    ", parent = None):
>          s += "%s = rand() %% 2;\n" % v
>      elif ty.typename in ["char *"]:
>          s += "%s = rand_str();\n" % v
> +    elif ty.c_only:
> +        pass
>      elif ty.typename in handcoded:
>          raise Exception("Gen for handcoded %s" % ty.typename)
>      else:
> diff --git a/tools/libxl/libxltypes.py b/tools/libxl/libxltypes.py
> index 05cba88..83a9426 100644
> --- a/tools/libxl/libxltypes.py
> +++ b/tools/libxl/libxltypes.py
> @@ -33,6 +33,8 @@ class Type(object):
>          if self.passby not in [PASS_BY_VALUE, PASS_BY_REFERENCE]:
>              raise ValueError
>  
> +        self.c_only = kwargs.setdefault('c_only', False)
> +
>          if typename is None: # Anonymous type
>              self.typename = None
>              self.rawname = None
> @@ -50,7 +52,7 @@ class Type(object):
>  
>          self.autogenerate_destructor = kwargs.setdefault('autogenerate_destructor', True)
>  
> -        if self.typename is not None:
> +        if self.typename is not None and not self.c_only:
>              self.json_fn = kwargs.setdefault('json_fn', self.typename + "_gen_json")
>          else:
>              self.json_fn = kwargs.setdefault('json_fn', None)



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 02:48:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:48:24 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoTg-0003Dy-BS; Mon, 31 Oct 2011 02:48:24 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKoSo-0002sB-1P
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:47:30 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320054446!1654085!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9247 invoked from network); 31 Oct 2011 09:47:27 -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;
	31 Oct 2011 09:47:27 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8669425"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:47:26 +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, 31 Oct 2011 09:47:27 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 05/13] libxl: idl: Provide struct and
	union tags
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 31 Oct 2011 09:47:26 +0000
In-Reply-To: <1319827031-15395-6-git-send-email-ian.jackson@eu.citrix.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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320054446.23193.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 Fri, 2011-10-28 at 19:37 +0100, Ian Jackson wrote:
> Instead of generating:
> 
>    typedef struct {
>      ...
>    } libxl_foo;
> 
> Produce:
> 
>    typedef struct libxl_foo {
>      ...
>    } libxl_foo;
> 
> This makes it possible to refer to libxl idl-generated structs and
> unions, as incomplete types, before they have been defined.
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>

Acked-by: Ian Campbell <ian.campbell@citrix.com>

> ---
>  tools/libxl/gentypes.py |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/tools/libxl/gentypes.py b/tools/libxl/gentypes.py
> index e82b706..c4efbf3 100644
> --- a/tools/libxl/gentypes.py
> +++ b/tools/libxl/gentypes.py
> @@ -56,7 +56,7 @@ def libxl_C_type_define(ty, indent = ""):
>          if ty.typename is None:
>              s += "%s {\n" % ty.kind
>          else:
> -            s += "typedef %s {\n" % ty.kind
> +            s += "typedef %s %s {\n" % (ty.kind, ty.typename)
>  
>          for f in ty.fields:
>              if f.comment is not None:



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 02:51:27 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:51:27 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoWd-0003fc-3y; Mon, 31 Oct 2011 02:51:27 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKoW7-0003TN-UP
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:50:56 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-11.tower-216.messagelabs.com!1320054652!1597542!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 31284 invoked from network); 31 Oct 2011 09:50:53 -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;
	31 Oct 2011 09:50:53 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8669514"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:50: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;
	Mon, 31 Oct 2011 09:50:53 +0000
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: Mon, 31 Oct 2011 09:50:52 +0000
In-Reply-To: <1319827031-15395-7-git-send-email-ian.jackson@eu.citrix.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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320054652.23193.28.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-10-28 at 19:37 +0100, Ian Jackson wrote:
> GCC and C99 allow declarations to be mixed with code.  This is a good
> idea because:
> 
>  * It allows variables to be more often initialised as they are
>    declared, thus reducing the occurrence of uninitialised variable
>    errors.
> 
>  * Certain alloca-like constructs (arrays allocated at runtime on the
>    stack) can more often be written without a spurious { } block.
>    Such blocks are confusing to read.
> 
>  * It makes it easier to write and use macros which declare and
>    initialise formulaic variables and do other function setup code,
>    because there is no need to worry that such macros might be
>    incompatible with each other or have strict ordering constraints.
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>

I suspect there isn't much scope for abuse of this capability but would
a few words of guidance in CODING_STYLE make sense?

> ---
>  tools/libxl/Makefile |    3 ++-
>  1 files changed, 2 insertions(+), 1 deletions(-)
> 
> diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile
> index f23661a..a3727ab 100644
> --- a/tools/libxl/Makefile
> +++ b/tools/libxl/Makefile
> @@ -11,7 +11,8 @@ MINOR = 0
>  XLUMAJOR = 1.0
>  XLUMINOR = 0
>  
> -CFLAGS += -Werror -Wno-format-zero-length -Wmissing-declarations
> +CFLAGS += -Werror -Wno-format-zero-length -Wmissing-declarations \
> +	-Wno-declaration-after-statement
>  CFLAGS += -I. -fPIC
>  
>  ifeq ($(CONFIG_Linux),y)



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 02:54:11 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:54:11 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoZH-00044I-06; Mon, 31 Oct 2011 02:54:11 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKoYk-0003s9-OE
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:53:39 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-8.tower-216.messagelabs.com!1320054815!1674185!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6310 invoked from network); 31 Oct 2011 09:53:35 -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;
	31 Oct 2011 09:53:35 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8669737"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:53:35 +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, 31 Oct 2011 09:53:36 +0000
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: Mon, 31 Oct 2011 09:53:35 +0000
In-Reply-To: <1319827031-15395-8-git-send-email-ian.jackson@eu.citrix.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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320054815.23193.30.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-10-28 at 19:37 +0100, Ian Jackson wrote:
> Provide some macros which are useful shorthands for use within libxl:
>   * GC_INIT to initialise a gc from a ctx and GC_FREE to free it
>   * CTX(gc) to give you back the ctx
>   * LIBXL_TAILQ_INSERT_SORTED for inserting things into sorted lists
> 
> These will be used by later patches.
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
> ---
>  tools/libxl/libxl_internal.h |   48 ++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 48 insertions(+), 0 deletions(-)
> 
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 31adbc8..8649788 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -555,6 +555,54 @@ _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);
>  
> +
> +/*
> + * Convenience macros.
> + */
> +
> +
> +/*
> + * All of these assume (or define)
> + *    libxl__gc *gc;
> + * as a local variable.
> + */
> +
> +#define GC_INIT(ctx)  libxl__gc gc[1] = { LIBXL_INIT_GC(ctx) }

Tricksy, I like it ;-)

Acked-by: Ian Campbell <ian.campbell@citrix.com>

Is there a massive conversion patch somewhere downseries?

> +#define GC_FREE       libxl__free_all(gc)
> +#define CTX           libxl__gc_owner(gc)
> +
> +
> +/*
> + * Inserts "elm_new" into the sorted list "head".
> + *
> + * "elm_search" must be a loop search variable of the same type as
> + * "elm_new".  "new_after_search_p" must be an expression which is
> + * true iff the element "elm_new" sorts after the element
> + * "elm_search".
> + *
> + * "search_body" can be empty, or some declaration(s) and statement(s)
> + * needed for "new_after_search_p".
> + */
> +#define LIBXL_TAILQ_INSERT_SORTED(head, entry, elm_new, elm_search,     \
> +                                  search_body, new_after_search_p)      \
> +    do {                                                                \
> +        for ((elm_search) = LIBXL_TAILQ_FIRST((head));                  \
> +             (elm_search);                                              \
> +             (elm_search) = LIBXL_TAILQ_NEXT((elm_search), entry)) {    \
> +            search_body;                                                \
> +            if (!(new_after_search_p))                                  \
> +                break;                                                  \
> +        }                                                               \
> +        /* now elm_search is either the element before which we want    \
> +         * to place elm_new, or NULL meaning we want to put elm_new at  \
> +         * the end */                                                   \
> +        if ((elm_search))                                               \
> +            LIBXL_TAILQ_INSERT_BEFORE((elm_search), (elm_new), entry);  \
> +        else                                                            \
> +            LIBXL_TAILQ_INSERT_TAIL((head), (elm_new), entry);          \
> +    } while(0)
> +
> +
>  #endif
>  
>  /*



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 02:55:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 02:55:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoan-0004S5-Kl; Mon, 31 Oct 2011 02:55:45 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKoaK-0004GM-0z
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 02:55:16 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320054912!723941!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29820 invoked from network); 31 Oct 2011 09:55:12 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-5.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Oct 2011 09:55:12 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8669782"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 09:55: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;
	Mon, 31 Oct 2011 09:55:12 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 08/13] libxl: Rationalise #includes
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 31 Oct 2011 09:55:11 +0000
In-Reply-To: <1319827031-15395-9-git-send-email-ian.jackson@eu.citrix.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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320054912.23193.31.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-10-28 at 19:37 +0100, Ian Jackson wrote:
> libxl_internal.h now #includes libxl.h and various system headers.
> 
> This
>  1. makes the order of header inclusion more predictable
>  2. explicitly allows libxl_internal.h to use objects defined in libxl.h
>  3. removes the need for individual files to include these headers
> 
> Also
>  - remove some unnecessary #includes of libxl_utils.h,
>    flexarray.h, etc. in some libxl*.c files,
>  - include libxl_osdeps.h at the top of libxl_internal.h
>  - add missing includes of libxl_osdeps.h to a couple of files
>  - change libxl.h to libxl_internal.h in a couple of files
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>

Acked-by: Ian Campbell <ian.campbell@citrix.com>

> ---
>  tools/libxl/libxl.c            |    3 ---
>  tools/libxl/libxl_blktap2.c    |    1 -
>  tools/libxl/libxl_bootloader.c |    4 ----
>  tools/libxl/libxl_cpuid.c      |    4 ----
>  tools/libxl/libxl_create.c     |    4 +---
>  tools/libxl/libxl_device.c     |    2 --
>  tools/libxl/libxl_dm.c         |    4 +---
>  tools/libxl/libxl_dom.c        |    1 -
>  tools/libxl/libxl_exec.c       |    1 -
>  tools/libxl/libxl_flask.c      |    3 ++-
>  tools/libxl/libxl_internal.c   |    4 ----
>  tools/libxl/libxl_internal.h   |    5 +++++
>  tools/libxl/libxl_json.c       |    4 ++--
>  tools/libxl/libxl_noblktap2.c  |    2 --
>  tools/libxl/libxl_nocpuid.c    |    2 +-
>  tools/libxl/libxl_paths.c      |    2 +-
>  tools/libxl/libxl_pci.c        |    5 -----
>  tools/libxl/libxl_qmp.c        |    2 ++
>  tools/libxl/libxl_utils.c      |    1 -
>  tools/libxl/libxl_uuid.c       |    4 ++++
>  tools/libxl/libxl_xshelp.c     |    1 -
>  21 files changed, 19 insertions(+), 40 deletions(-)
> 
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index 064fbc4..5d448af 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -31,10 +31,7 @@
>  #include <inttypes.h>
>  #include <assert.h>
> 
> -#include "libxl.h"
> -#include "libxl_utils.h"
>  #include "libxl_internal.h"
> -#include "flexarray.h"
> 
>  #define PAGE_TO_MEMKB(pages) ((pages) * 4)
>  #define BACKEND_STRING_SIZE 5
> diff --git a/tools/libxl/libxl_blktap2.c b/tools/libxl/libxl_blktap2.c
> index c8d9148..acf4110 100644
> --- a/tools/libxl/libxl_blktap2.c
> +++ b/tools/libxl/libxl_blktap2.c
> @@ -12,7 +12,6 @@
>   * GNU Lesser General Public License for more details.
>   */
> 
> -#include "libxl.h"
>  #include "libxl_osdeps.h"
>  #include "libxl_internal.h"
> 
> diff --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c
> index 1e735a8..396aac6 100644
> --- a/tools/libxl/libxl_bootloader.c
> +++ b/tools/libxl/libxl_bootloader.c
> @@ -14,7 +14,6 @@
> 
>  #include "libxl_osdeps.h"
> 
> -#include <string.h>
>  #include <unistd.h>
>  #include <fcntl.h>
>  #include <termios.h>
> @@ -22,11 +21,8 @@
>  #include <sys/stat.h>
>  #include <sys/types.h>
> 
> -#include "libxl.h"
>  #include "libxl_internal.h"
> 
> -#include "flexarray.h"
> -
>  #define XENCONSOLED_BUF_SIZE 16
>  #define BOOTLOADER_BUF_SIZE 1024
> 
> diff --git a/tools/libxl/libxl_cpuid.c b/tools/libxl/libxl_cpuid.c
> index 12cc0b1..f65a898 100644
> --- a/tools/libxl/libxl_cpuid.c
> +++ b/tools/libxl/libxl_cpuid.c
> @@ -10,10 +10,6 @@
>   * GNU Lesser General Public License for more details.
>   */
> 
> -#include <string.h>
> -
> -#include "libxl.h"
> -#include "libxl_osdeps.h"
>  #include "libxl_internal.h"
> 
>  void libxl_cpuid_destroy(libxl_cpuid_policy_list *p_cpuid_list)
> diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
> index 68d0fc3..70705af 100644
> --- a/tools/libxl/libxl_create.c
> +++ b/tools/libxl/libxl_create.c
> @@ -26,10 +26,8 @@
>  #include <xc_dom.h>
>  #include <xenguest.h>
>  #include <assert.h>
> -#include "libxl.h"
> -#include "libxl_utils.h"
> +
>  #include "libxl_internal.h"
> -#include "flexarray.h"
> 
>  void libxl_domain_config_destroy(libxl_domain_config *d_config)
>  {
> diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
> index 88cd990..8b5fc4a 100644
> --- a/tools/libxl/libxl_device.c
> +++ b/tools/libxl/libxl_device.c
> @@ -24,8 +24,6 @@
>  #include <unistd.h>
>  #include <fcntl.h>
> 
> -
> -#include "libxl.h"
>  #include "libxl_internal.h"
> 
>  static const char *string_of_kinds[] = {
> diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
> index d6ad85b..e18bac7 100644
> --- a/tools/libxl/libxl_dm.c
> +++ b/tools/libxl/libxl_dm.c
> @@ -24,10 +24,8 @@
>  #include <unistd.h>
>  #include <fcntl.h>
>  #include <assert.h>
> -#include "libxl_utils.h"
> +
>  #include "libxl_internal.h"
> -#include "libxl.h"
> -#include "flexarray.h"
> 
>  static const char *libxl_tapif_script(libxl__gc *gc)
>  {
> diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
> index 718281a..430b3d0 100644
> --- a/tools/libxl/libxl_dom.c
> +++ b/tools/libxl/libxl_dom.c
> @@ -32,7 +32,6 @@
> 
>  #include <xen/hvm/hvm_info_table.h>
> 
> -#include "libxl.h"
>  #include "libxl_internal.h"
> 
>  libxl_domain_type libxl__domain_type(libxl__gc *gc, uint32_t domid)
> diff --git a/tools/libxl/libxl_exec.c b/tools/libxl/libxl_exec.c
> index d6199d4..e981679 100644
> --- a/tools/libxl/libxl_exec.c
> +++ b/tools/libxl/libxl_exec.c
> @@ -28,7 +28,6 @@
>  #include <signal.h> /* for SIGKILL */
>  #include <fcntl.h>
> 
> -#include "libxl.h"
>  #include "libxl_internal.h"
> 
>  static int call_waitpid(pid_t (*waitpid_cb)(pid_t, int *, int), pid_t pid, int *status, int options)
> diff --git a/tools/libxl/libxl_flask.c b/tools/libxl/libxl_flask.c
> index c8d0594..6b548dd 100644
> --- a/tools/libxl/libxl_flask.c
> +++ b/tools/libxl/libxl_flask.c
> @@ -7,13 +7,14 @@
>   *  as published by the Free Software Foundation.
>   */
> 
> +#include "libxl_osdeps.h"
> +
>  #include <stdio.h>
>  #include <stdlib.h>
>  #include <string.h>
>  #include <errno.h>
>  #include <xenctrl.h>
> 
> -#include "libxl.h"
>  #include "libxl_internal.h"
> 
>  int libxl_flask_context_to_sid(libxl_ctx *ctx, char *buf, size_t len,
> diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
> index 3993d8e..dd31f25 100644
> --- a/tools/libxl/libxl_internal.c
> +++ b/tools/libxl/libxl_internal.c
> @@ -16,8 +16,6 @@
>  #include "libxl_osdeps.h"
> 
>  #include <stdio.h>
> -#include <stdarg.h>
> -#include <string.h>
> 
>  #include <sys/types.h>
>  #include <sys/stat.h>
> @@ -25,9 +23,7 @@
>  #include <sys/mman.h>
>  #include <unistd.h>
> 
> -#include "libxl.h"
>  #include "libxl_internal.h"
> -#include "libxl_utils.h"
> 
>  int libxl__error_set(libxl__gc *gc, int code)
>  {
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 8649788..6d9da2c 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -17,14 +17,19 @@
>  #ifndef LIBXL_INTERNAL_H
>  #define LIBXL_INTERNAL_H
> 
> +#include "libxl_osdeps.h"
> +
>  #include <stdint.h>
>  #include <stdarg.h>
>  #include <stdlib.h>
> +#include <string.h>
> 
>  #include <xs.h>
>  #include <xenctrl.h>
>  #include "xentoollog.h"
> 
> +#include "libxl.h"
> +
>  #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
>  #define _hidden __attribute__((visibility("hidden")))
>  #define _protected __attribute__((visibility("protected")))
> diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c
> index 11f65fc..a4208f3 100644
> --- a/tools/libxl/libxl_json.c
> +++ b/tools/libxl/libxl_json.c
> @@ -12,13 +12,13 @@
>   * GNU Lesser General Public License for more details.
>   */
> 
> +#include "libxl_osdeps.h"
> +
>  #include <assert.h>
> -#include <string.h>
> 
>  #include <yajl/yajl_parse.h>
>  #include <yajl/yajl_gen.h>
> 
> -#include <libxl.h>
>  #include "libxl_internal.h"
> 
>  /* #define DEBUG_ANSWER */
> diff --git a/tools/libxl/libxl_noblktap2.c b/tools/libxl/libxl_noblktap2.c
> index 704d03f..3307551 100644
> --- a/tools/libxl/libxl_noblktap2.c
> +++ b/tools/libxl/libxl_noblktap2.c
> @@ -12,8 +12,6 @@
>   * GNU Lesser General Public License for more details.
>   */
> 
> -#include "libxl.h"
> -#include "libxl_osdeps.h"
>  #include "libxl_internal.h"
> 
>  int libxl__blktap_enabled(libxl__gc *gc)
> diff --git a/tools/libxl/libxl_nocpuid.c b/tools/libxl/libxl_nocpuid.c
> index d63757f..2e9490c 100644
> --- a/tools/libxl/libxl_nocpuid.c
> +++ b/tools/libxl/libxl_nocpuid.c
> @@ -10,7 +10,7 @@
>   * GNU Lesser General Public License for more details.
>   */
> 
> -#include "libxl.h"
> +#include "libxl_internal.h"
> 
>  void libxl_cpuid_destroy(libxl_cpuid_policy_list *p_cpuid_list)
>  {
> diff --git a/tools/libxl/libxl_paths.c b/tools/libxl/libxl_paths.c
> index 64f662d..fa80056 100644
> --- a/tools/libxl/libxl_paths.c
> +++ b/tools/libxl/libxl_paths.c
> @@ -12,7 +12,7 @@
>   * GNU Lesser General Public License for more details.
>   */
> 
> -#include "libxl.h"
> +#include "libxl_internal.h"
>  #include "_libxl_paths.h"
> 
>  const char *libxl_sbindir_path(void)
> diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
> index 33dd060..9eac108 100644
> --- a/tools/libxl/libxl_pci.c
> +++ b/tools/libxl/libxl_pci.c
> @@ -17,7 +17,6 @@
>  #include "libxl_osdeps.h"
> 
>  #include <stdio.h>
> -#include <string.h>
>  #include <stdlib.h>
>  #include <sys/types.h>
>  #include <fcntl.h>
> @@ -27,15 +26,11 @@
>  #include <sys/stat.h>
>  #include <signal.h>
>  #include <unistd.h> /* for write, unlink and close */
> -#include <stdint.h>
>  #include <inttypes.h>
>  #include <dirent.h>
>  #include <assert.h>
> 
> -#include "libxl.h"
> -#include "libxl_utils.h"
>  #include "libxl_internal.h"
> -#include "flexarray.h"
> 
>  #define PCI_BDF                "%04x:%02x:%02x.%01x"
>  #define PCI_BDF_SHORT          "%02x:%02x.%01x"
> diff --git a/tools/libxl/libxl_qmp.c b/tools/libxl/libxl_qmp.c
> index 618f20f..0eefe4d 100644
> --- a/tools/libxl/libxl_qmp.c
> +++ b/tools/libxl/libxl_qmp.c
> @@ -18,6 +18,8 @@
>   * Specification, see in the QEMU repository.
>   */
> 
> +#include "libxl_osdeps.h"
> +
>  #include <unistd.h>
>  #include <sys/un.h>
>  #include <sys/queue.h>
> diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
> index dce9d8b..7ea2d2c 100644
> --- a/tools/libxl/libxl_utils.c
> +++ b/tools/libxl/libxl_utils.c
> @@ -28,7 +28,6 @@
>  #include <unistd.h>
>  #include <assert.h>
> 
> -#include "libxl_utils.h"
>  #include "libxl_internal.h"
> 
>  struct schedid_name {
> diff --git a/tools/libxl/libxl_uuid.c b/tools/libxl/libxl_uuid.c
> index e837228..80ab789 100644
> --- a/tools/libxl/libxl_uuid.c
> +++ b/tools/libxl/libxl_uuid.c
> @@ -12,8 +12,12 @@
>   * GNU Lesser General Public License for more details.
>   */
> 
> +#include "libxl_osdeps.h"
> +
>  #include <libxl_uuid.h>
> 
> +#include "libxl_internal.h"
> +
>  #if defined(__linux__)
> 
>  int libxl_uuid_is_nil(libxl_uuid *uuid)
> diff --git a/tools/libxl/libxl_xshelp.c b/tools/libxl/libxl_xshelp.c
> index 56a7c7b..f85e867 100644
> --- a/tools/libxl/libxl_xshelp.c
> +++ b/tools/libxl/libxl_xshelp.c
> @@ -21,7 +21,6 @@
>  #include <stdarg.h>
>  #include <inttypes.h>
> 
> -#include "libxl.h"
>  #include "libxl_internal.h"
> 
>  char **libxl__xs_kvs_of_flexarray(libxl__gc *gc, flexarray_t *array, int length)
> --
> 1.7.2.5
> 
> 
> _______________________________________________
> 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 Oct 31 03:02:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 03:02:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKohj-0004x8-22; Mon, 31 Oct 2011 03:02:55 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RKof0-0004ix-AM
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 03:00:14 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320055196!1650778!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18400 invoked from network); 31 Oct 2011 09:59:56 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-4.tower-216.messagelabs.com with SMTP;
	31 Oct 2011 09:59:56 -0000
Received: from [83.211.176.139] (account d.faggioli@sssup.it HELO
	[192.168.0.4]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72798305; Mon, 31 Oct 2011 10:59:55 +0100
Message-ID: <1320055194.15109.22.camel@Abyss>
Subject: RE: [Xen-devel] [PATCH] scheduler rate controller
From: Dario Faggioli <raistlin@linux.it>
To: George Dunlap <george.dunlap@citrix.com>
Date: Mon, 31 Oct 2011 10:59:54 +0100
In-Reply-To: <1319818714.21033.414.camel@elijah>
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>
Face: 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
X-Mailer: Evolution 3.2.1 (3.2.1-1.fc16) 
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>,
	George Dunlap <George.Dunlap@eu.citrix.com>, "Dong, 
	Eddie" <eddie.dong@intel.com>, "Lv, Hui" <hui.lv@intel.com>, "Duan,
	Jiangang" <jiangang.duan@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>
Content-Type: multipart/mixed; boundary="===============0817685849=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============0817685849==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-TGy8z7QGGZc47Y4OQT/0"


--=-TGy8z7QGGZc47Y4OQT/0
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, 2011-10-28 at 17:18 +0100, George Dunlap wrote:
> 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...
>=20
> There are lots of reasons why the SCHEDULE_SOFTIRQ gets raised.  But I
> think we want to focus on the scheduler itself raising it as a result of
> the .wake() callback.  Whether the .wake() happens as a result of a HW
> interrupt or something else, I don't think really matters.
>=20
I fully agree, since these are the events that are likely to cause a
context switch, and it's the context switch that --when happening too
frequently-- trashes the performances, isn't it?

> Dario and Hui,  neither of you have commented on my idea, which is
> simply don't preempt a VM if it has run for less than some amount of
> time (say, 500us or 1ms).  If a higher-priority VM is woken up, see how
> long the current VM has run.  If it's less than 1ms, set a 1ms timer and
> call schedule() then.
>=20
Right, I was about to, but the got busy with other stuff. To me, it
sounds a more than valid method for achieving similar results. Maybe I
like it more than pure rate-limiting because it makes it easier to
understand what's going on, especially from the final user point of
view, and thus also easier to configure and to be dealt with.

However, the  effect is still pretty much the same, and this is also
able to cause "scheduling artifact", and affect guarantees and/or
expected behaviour, e.g., in EDF, if the earliest deadline task wakes up
right after a context switch it would need to run, independently on for
how long current is running, and not doing so could jeopardize
schedulability.=20

Again, I'm not saying something like that shouldn't be done at all, just
that --if it is something special kicking in from time to time-- it
should make itsself evident.

> As much as possible, we want the system to Just Work.  Under normal
> circumstances it wouldn't be too unusual for a VM to have a several-ms
> delay between 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 solution.  That'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".
>=20
Ok, that's the other way around. Having it all the time is pretty much
self evident so, if we're fine with the latency this introduces, and it
improves fairness and performances , this could be the way. From my
experience in real-time scheduling, ms alike scheduling latency is
something very very huge... But this obviously depend on the workload.

Thanks and Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-TGy8z7QGGZc47Y4OQT/0
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk6ucZoACgkQk4XaBE3IOsQWCwCgp9Fgmp8pYoTmqou6QboeBrKz
8xMAnRvJ/xCcVTvNvjMr/bQKJJ27T/62
=OjG2
-----END PGP SIGNATURE-----

--=-TGy8z7QGGZc47Y4OQT/0--



--===============0817685849==
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

--===============0817685849==--



From xen-devel-bounces@lists.xensource.com Mon Oct 31 03:06:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 03:06:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKol7-0005Sv-9z; Mon, 31 Oct 2011 03:06:25 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKohu-0004yq-Ed
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 03:03:09 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320055383!2245571!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3770 invoked from network); 31 Oct 2011 10:03:03 -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;
	31 Oct 2011 10:03:03 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8669986"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 10:03: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, 31 Oct 2011 10:03:02 +0000
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: Mon, 31 Oct 2011 10:03:02 +0000
In-Reply-To: <1319827031-15395-10-git-send-email-ian.jackson@eu.citrix.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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320055382.23193.38.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-10-28 at 19:37 +0100, Ian Jackson wrote:
> This lock will be used to protect data structures which will be hung
> off the libxl_ctx in subsequent patches.
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
> ---
>  tools/libxl/libxl.c          |    3 +++
>  tools/libxl/libxl_internal.h |   16 ++++++++++++++++
>  2 files changed, 19 insertions(+), 0 deletions(-)
> 
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index 5d448af..a3c9807 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -40,6 +40,7 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
>  {
>      libxl_ctx *ctx;
>      struct stat stat_buf;
> +    const pthread_mutex_t mutex_value = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
>  
>      if (version != LIBXL_VERSION)
>          return ERROR_VERSION;
> @@ -53,6 +54,8 @@ int libxl_ctx_alloc(libxl_ctx **pctx, int version, xentoollog_logger * lg)
>      memset(ctx, 0, sizeof(libxl_ctx));
>      ctx->lg = lg;
>  
> +    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?

> +
>      if ( stat(XENSTORE_PID_FILE, &stat_buf) != 0 ) {
>          LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "Is xenstore daemon running?\n"
>                       "failed to stat %s", XENSTORE_PID_FILE);
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 6d9da2c..79a9de4 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -23,6 +23,7 @@
>  #include <stdarg.h>
>  #include <stdlib.h>
>  #include <string.h>
> +#include <pthread.h>
>  
>  #include <xs.h>
>  #include <xenctrl.h>
> @@ -95,6 +96,9 @@ struct libxl__ctx {
>      xc_interface *xch;
>      struct xs_handle *xsh;
>  
> +    pthread_mutex_t lock; /* protects data structures hanging off the ctx */
> +      /* always use MUTEX_LOCK and MUTEX_UNLOCK to manipulate this */

MUTEX is something of an implementation detail (although I admit we are
unlikely to use anything else), perhaps CTX_(UN)LOCK?

Perhaps give the variable a less obvious name to help discourage direct
use?

> +
>      /* for callers who reap children willy-nilly; caller must only
>       * set this after libxl_init and before any other call - or
>       * may leave them untouched */
> @@ -577,6 +581,18 @@ _hidden libxl__json_object *libxl__json_parse(libxl__gc *gc, const char *s);
>  #define CTX           libxl__gc_owner(gc)
>  
> 
> +#define MUTEX_LOCK do {                                 \
> +        int mutex_r = pthread_mutex_lock(&CTX->lock);   \
> +        assert(!mutex_r);                               \

This assert is to catch EINVAL ("the mutex has not been properly
initialized") rather than EDEADLK ("the mutex is already locked by the
calling thread") since we asked for a non-error-checking recursive lock?

Since it is OK to take this lock recursively then it might be as well to
say so explicitly?

This is the first lock in libxl so I guess there isn't much of a locking
hierarchy yet. Are there any particular considerations which a caller
must make wrt its own locking?

> +    } while(0)
> +
> +#define MUTEX_UNLOCK do {                               \
> +        int mutex_r = pthread_mutex_unlock(&CTX->lock); \
> +        assert(!mutex_r);                               \
> +    } while(0)
> +        
> +
> +
>  /*
>   * Inserts "elm_new" into the sorted list "head".
>   *



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 03:09:34 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 03: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 1RKoo8-0005sQ-BL; Mon, 31 Oct 2011 03:09:32 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKojj-0005Ew-FJ
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 03:05:00 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-5.tower-21.messagelabs.com!1320055496!725643!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 4321 invoked from network); 31 Oct 2011 10:04:56 -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;
	31 Oct 2011 10:04:56 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8670037"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 10:04: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, 31 Oct 2011 10:04:56 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 10/13] libxl: make libxl__[v]log
	const-correct
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 31 Oct 2011 10:04:55 +0000
In-Reply-To: <1319827031-15395-11-git-send-email-ian.jackson@eu.citrix.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>
	<1319827031-15395-11-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: <1320055496.23193.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 Fri, 2011-10-28 at 19:37 +0100, Ian Jackson wrote:
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>

Acked-by: Ian Campbell <ian.campbell@citrix.com>

> ---
>  tools/libxl/libxl_internal.c |    4 ++--
>  tools/libxl/libxl_internal.h |    4 ++--
>  2 files changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
> index dd31f25..df2b7f8 100644
> --- a/tools/libxl/libxl_internal.c
> +++ b/tools/libxl/libxl_internal.c
> @@ -179,7 +179,7 @@ char *libxl__dirname(libxl__gc *gc, const char *s)
>  
>  void libxl__logv(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
>               const char *file, int line, const char *func,
> -             char *fmt, va_list ap)
> +             const char *fmt, va_list ap)
>  {
>      char *enomem = "[out of memory formatting log message]";
>      char *base = NULL;
> @@ -206,7 +206,7 @@ void libxl__logv(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
>  
>  void libxl__log(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
>              const char *file, int line, const char *func,
> -            char *fmt, ...)
> +            const char *fmt, ...)
>  {
>      va_list ap;
>      va_start(ap, fmt);
> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
> index 79a9de4..fe64d34 100644
> --- a/tools/libxl/libxl_internal.h
> +++ b/tools/libxl/libxl_internal.h
> @@ -80,13 +80,13 @@
>  _hidden void libxl__logv(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
>               const char *file /* may be 0 */, int line /* ignored if !file */,
>               const char *func /* may be 0 */,
> -             char *fmt, va_list al)
> +             const char *fmt, va_list al)
>       __attribute__((format(printf,7,0)));
>  
>  _hidden void libxl__log(libxl_ctx *ctx, xentoollog_level msglevel, int errnoval,
>              const char *file /* may be 0 */, int line /* ignored if !file */,
>              const char *func /* may be 0 */,
> -            char *fmt, ...)
> +            const char *fmt, ...)
>       __attribute__((format(printf,7,8)));
>  
>       /* these functions preserve errno (saving and restoring) */



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 03:11:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 03:11:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKoqF-0006Gq-9W; Mon, 31 Oct 2011 03:11:43 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKokQ-0005NV-Ng
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 03:05:43 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-4.tower-216.messagelabs.com!1320055539!1651866!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14449 invoked from network); 31 Oct 2011 10:05:39 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-4.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Oct 2011 10:05:39 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8670067"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 10:05:39 +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, 31 Oct 2011 10:05:38 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 11/13] libxl: make libxl__free_all
	idempotent
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 31 Oct 2011 10:05:38 +0000
In-Reply-To: <1319827031-15395-12-git-send-email-ian.jackson@eu.citrix.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>
	<1319827031-15395-11-git-send-email-ian.jackson@eu.citrix.com>
	<1319827031-15395-12-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: <1320055538.23193.40.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-10-28 at 19:37 +0100, Ian Jackson wrote:
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>

Acked-by: Ian Campbell <ian.campbell@citrix.com>

> ---
>  tools/libxl/libxl_internal.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
> 
> diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
> index df2b7f8..62e7fba 100644
> --- a/tools/libxl/libxl_internal.c
> +++ b/tools/libxl/libxl_internal.c
> @@ -72,6 +72,8 @@ void libxl__free_all(libxl__gc *gc)
>          free(ptr);
>      }
>      free(gc->alloc_ptrs);
> +    gc->alloc_ptrs = 0;
> +    gc->alloc_maxsize = 0;
>  }
>  
>  void *libxl__zalloc(libxl__gc *gc, int bytes)



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 03:15:48 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 03:15:48 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKouB-0006gB-1H; Mon, 31 Oct 2011 03:15:47 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKoph-000692-Ao
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 03:11:10 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-14.tower-216.messagelabs.com!1320055866!1672512!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1144 invoked from network); 31 Oct 2011 10:11:06 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (62.200.22.115)
	by server-14.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Oct 2011 10:11:06 -0000
X-IronPort-AV: E=Sophos;i="4.69,430,1315180800"; 
   d="scan'208";a="8670242"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 10:11: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;
	Mon, 31 Oct 2011 10:11:05 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 00/13] New event API
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>
Date: Mon, 31 Oct 2011 10:11:05 +0000
In-Reply-To: <1319827031-15395-1-git-send-email-ian.jackson@eu.citrix.com>
References: <1319827031-15395-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: <1320055865.23193.45.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-10-28 at 19:36 +0100, Ian Jackson wrote:
> This is a revised RFC version of my event handling API proposal.
> 
> It consists of 10 rather uninteresting preparatory, stylistic
> and bugfix patches, plus 3 with some meat in:
>   02/13  libxenstore: Provide xs_check_watch
>   12/13  libxl: New API for providing OS events to libxl
>   13/13  libxl: New event generation API
> 
> This series contains an implementation of almost everything, and
> builds apart from the lack of libxl_event_free, but it has not been
> executed at all.

> 
> So at this stage a very detailed code review, particularly of 12 and
> 13 is probably not appropriate.  However, this is hopefully a
> near-final version of the external and internal interfaces so it would
> be worth looking at those.

I reviewed all but #12 and #13 so far and I think they can mostly go in
now, at least in principal. I acked the majority with that in mind.

I suppose the ones which introduce new facilities should/could wait for
the actual users (which I presume are in #12 and #13) which I guess was
your intent but I think #1, #3, #5, #8, #10 and #11 would be obviously
fine right now.

#3 is a bit borderline wrt having a user but I think you wanted
libxl_qmp.c to use it so bashing it in now makes sense?

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 03:19:38 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 03: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 1RKoxt-00076K-MU; Mon, 31 Oct 2011 03:19:38 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RKov3-0006lB-3O
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 03:16:48 -0700
X-Env-Sender: raistlin@linux.it
X-Msg-Ref: server-14.tower-27.messagelabs.com!1320056081!42428626!1
X-Originating-IP: [193.205.80.99]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19385 invoked from network); 31 Oct 2011 10:14:41 -0000
Received: from ms01.sssup.it (HELO sssup.it) (193.205.80.99)
	by server-14.tower-27.messagelabs.com with SMTP;
	31 Oct 2011 10:14:41 -0000
Received: from [83.211.176.139] (account d.faggioli@sssup.it HELO
	[192.168.0.4]) by sssup.it (CommuniGate Pro SMTP 5.3.14)
	with ESMTPSA id 72799306; Mon, 31 Oct 2011 11:16:37 +0100
Message-ID: <1320056196.15109.34.camel@Abyss>
Subject: RE: [Xen-devel] [PATCH] scheduler rate controller
From: Dario Faggioli <raistlin@linux.it>
To: "Lv, Hui" <hui.lv@intel.com>
Date: Mon, 31 Oct 2011 11:16:36 +0100
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>
Face: 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
X-Mailer: Evolution 3.2.1 (3.2.1-1.fc16) 
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>,
	George Dunlap <George.Dunlap@eu.citrix.com>, "Dong, 
	Eddie" <eddie.dong@intel.com>, George Dunlap <george.dunlap@citrix.com>,
	"Duan, Jiangang" <jiangang.duan@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>
Content-Type: multipart/mixed; boundary="===============0468922175=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--===============0468922175==
Content-Type: multipart/signed; micalg="pgp-sha1";
	protocol="application/pgp-signature"; 
	boundary="=-AVDXRWCClejGJ+IvAZFz"


--=-AVDXRWCClejGJ+IvAZFz
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Sat, 2011-10-29 at 10:05 +0800, Lv, Hui wrote:
> 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, 2) under excessive frequency condition, the miti=
gation effect of 1ms-delay may be too weak. In addition, your idea is to de=
lay scheduling instead of reducing, which means the total number of schedul=
ing would probably not change.
>
I think it would. I mean, all the interrupts that arrive (and that are
causing TASKLET_SCHEDULE->schedule() right now) and see current vcpu not
having run for 1ms would collapse in just one call to schedule() at the
end of the 1ms delay from the time instant when the very first one
(interrupt) happened... Isn't it?

If yes, that would definitely reduce the number of calls to schedule().

> 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. :)
>=20
Well, again, from my perspective, these numbers (1ms, 10ms) really looks
like ages, considering for example audio processing workloads with
software like JACK needs periodicity of 1.3 or 2.6 ms, and thus having
1ms or (for worse) 10ms eaten by the scheduler would definitely step on
their toes. I understand we're not talking very much about audio
processing VMs here but hey, if it has to be general purpose... :-P

> Some of my stupid thinking :)
>=20
Same for mine. :-)

Thanks and Regards,
Dario

--=20
<<This happens because I choose it to happen!>> (Raistlin Majere)
----------------------------------------------------------------------
Dario Faggioli, http://retis.sssup.it/people/faggioli
Senior Software Engineer, Citrix Systems R&D Ltd., Cambridge (UK)
PhD Candidate, ReTiS Lab, Scuola Superiore Sant'Anna, Pisa  (Italy)

--=-AVDXRWCClejGJ+IvAZFz
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: This is a digitally signed message part
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEABECAAYFAk6udYQACgkQk4XaBE3IOsRjGgCggItGz/6uMML+a4cZTemRkxpw
TEIAnA3vOg5/fwz78+lENpyLDWdh6CmE
=uJjt
-----END PGP SIGNATURE-----

--=-AVDXRWCClejGJ+IvAZFz--



--===============0468922175==
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

--===============0468922175==--



From xen-devel-bounces@lists.xensource.com Mon Oct 31 03:51:21 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 03:51:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKpSa-0008QE-C4; Mon, 31 Oct 2011 03:51:21 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKpRs-0008Df-Qn; Mon, 31 Oct 2011 03:50:37 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320058233!1664631!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 519 invoked from network); 31 Oct 2011 10:50:33 -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;
	31 Oct 2011 10:50:33 -0000
X-IronPort-AV: E=Sophos;i="4.69,431,1315180800"; 
   d="scan'208";a="8671521"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 10:50: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;
	Mon, 31 Oct 2011 10:50:32 +0000
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: Mon, 31 Oct 2011 10:50:32 +0000
In-Reply-To: <1758215.SCbitK4oVy@dell4550>
References: <1758215.SCbitK4oVy@dell4550>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320058232.23193.59.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

On Sat, 2011-10-29 at 06:57 +0100, jim burns wrote:
> Setup:
> 
> Fedora 15, w/f16's 3.1.0 (also tried 2.6.40 & 3.0.0)
> xen 4.1.2 (newly upgraded from 4.1.1, from rawhide)
> 
> Since the release notes for 4.1.2 said, in part:
> 
> Fixes/features include:
>  * New XL toolstack
> 
> I decided to test some problems I saw using xl to start a winxp hvm domu under 
> xen 4.1.1, and found that they were still there, and I came up with a somewhat 
> more serious one as well. I'm sure that others can point out more serious 
> problems, but these are the ones that affect me. In all cases, 'xm create' 
> does not have these problems. Domu config at the end of the post.
> 
> New to 4.1.2:
> 
> 1) Starting winxp with xl does not create a vif interface - only a tap one. 
> More exactly, the vif is created, but does not get an ipv6 address - it shows 
> up in 'ifconfig -a', or 'ifconfig vifn.0' - and does not get added to the 
> bridge. If you are using James' GPLPV drivers, you end up with no network 
> connectivity, as they use vif, not tap. I'd be surprised if other pvhvm 
> solutions don't see this also.

I see this with the tip of xen-4.1-testing too but not with
xen-unstable. I'll see if I can figure out which backport is missing...

[...]
> 2) If your vif= line in your config specifies a bridge, such as 
> 'bridge=virbr0', the '-net tap' option to qemu-dm remains as 'bridge=xenbr0', 
> as if it was hard coded. Again, this is an hvm problem. 'xl create'-ing a pv 
> domu correctly puts the vif on the requested bridge. (If memory serves, under 
> xen 4.1.1, when the vif for an hvm domain was being put on a bridge, I believe 
> it was on the bridge requested, so the problem is just with tap.)

Similarly I can reproduce this too but only on 4.1.

> 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.

> 
> 4) The 'localtime=1' option in your config is ignored by xl. This works with 
> xm. Xl will still honor the rtc_timeoffset option.

This option is supposed to control the setting of the RTC to localtime
vs UTC? Another missing feature.

If you fancy having a stab at either of these (I thing they will be
relatively simple to fix) then I'm happy to give some guidance (modulo
going to the airport in a few hours to head out to XenSummit Asia).

> 5) Anything other than 'videoram=4' in your config will be ignored when 
> starting with xl, but not with xm. You will get an error in your qemu-dm log 
> file of the form:
> 
> -videoram option does not work with cirrus vga device model. Videoram set to 
> 4M.

I'm not sure what's going on here, since this appears to be a qemu thing
and that is the same for xend and xl. Perhaps they are choosing
differing graphics card device models? How do the command lines differ
if you use this option?

> 
> So, are these bugs? or features? Certainly, I see 1) and 2) as bugs.
> 
> The rest of the qemu-dm log is unremarkable. My config follows, with python 
> code commented out to keep xl happy.
> 
> #import os, re
> #arch = os.uname()[4]
> #if re.search('64', arch):
> #    arch_libdir = 'lib64'
> #else:
> #    arch_libdir = 'lib'
> 
> name = "winxp"
> builder='hvm'
> memory = "768"
> uuid = "6c7de04e-df10-caa8-bb2a-8368246225c1"
> #ostype = "hvm"
> on_reboot = "restart"
> on_crash = "restart"
> on_poweroff = "destroy"
> vcpus = "2"
> viridian=1
> #
> #kernel = "/usr/lib/xen/boot/hvmloader"
> kernel = "hvmloader"
> acpi=1
> apic=1
> boot= "cda"
> # New stuff
> #device_model = '/usr/' + arch_libdir + '/xen/bin/qemu-dm'
> #device_model = '/usr/lib/xen/bin/qemu-dm'
> device_model = 'qemu-dm'
> #
> keymap='en-us'
> localtime=1
> #rtc_timeoffset=-14400
> #rtc_timeoffset=-18000
> pae=1
> serial='pty'
> #serial = "/dev/ttyS0"
> #   enable sound card support, [sb16|es1370|all|..,..], default none
> soundhw='es1370'
> # enable stdvga, default = 0 (use cirrus logic device model)
> #stdvga=1
> videoram=4
> stdvga=0
> #usbdevice="mouse"
> usbdevice="tablet"
> xen_extended_power_mgmt = 0
> #
> #disk=[ 'tap2:aio:/var/lib/xen/images/winxp,hda,w', 
> 'phy:/dev/cdrom,hdc:cdrom,r' ]
> #disk=[ 'file:/windows/C/var/lib/xen/images/winxp.sav,ioemu:hda,w', 
> 'phy:/dev/cdrom,hdc:cdrom,r' ]
> #disk=[ 'file:/var/lib/xen/images/winxp,ioemu:hda,w', 
> 'phy:/dev/cdrom,hdc:cdrom,r' ]
> disk=[ 'phy:/dev/disk/by-path/ip-192.168.1.101:3260-iscsi-
> iqn.2001-04.com.Dell4550-iqn.2009-09.net.bellsouth.sda:041b7d3f-b008-4367-
> b1f2-b4799d15e4cd-lun-1,hda,w', 'phy:/dev/cdrom,hdc:cdrom,r' ]
> #
> vif = [ 'mac=00:16:3e:23:1d:36, script=vif-bridge, bridge = xenbr0, 
> model=rtl8139' ]
> #vif = [ 'mac=00:16:3e:23:1d:36, type=ioemu, script=vif-bridge, bridge = 
> xenbr0, model=e1000' ]
> #vif = [ 'mac=00:16:3e:23:1d:37, type=netfront, script=vif-bridge, bridge = 
> eth0' ]
> #
> sdl=0
> #vfb = [ 'vnc=1, vnclisten=0.0.0.0, vncunused=0, vncdisplay=3, vncpasswd= ']
> vnc=1
> vnclisten="0.0.0.0"
> #vnclisten="192.168.1.0"
> # set VNC display number, default = domid
> vncdisplay=3
> # try to find an unused port for the VNC server, default = 1
> vncunused=0
> vncviewer=1
> vncconsole=1
> monitor=1
> vncpasswd=""
> 
> 
> _______________________________________________
> 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 Oct 31 03:57:58 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 03:57:58 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKpYz-00017o-EJ; Mon, 31 Oct 2011 03:57:57 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKpXz-0000td-Oo; Mon, 31 Oct 2011 03:56:56 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-16.tower-21.messagelabs.com!1320058612!2282984!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19717 invoked from network); 31 Oct 2011 10:56:52 -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;
	31 Oct 2011 10:56:52 -0000
X-IronPort-AV: E=Sophos;i="4.69,431,1315180800"; 
   d="scan'208";a="8671675"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 10:56: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;
	Mon, 31 Oct 2011 10:56:51 +0000
Subject: Re: [Xen-devel] Re: 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: Mon, 31 Oct 2011 10:56:51 +0000
In-Reply-To: <9873598.H8yuxEpZYE@dell4550>
References: <1758215.SCbitK4oVy@dell4550> <9873598.H8yuxEpZYE@dell4550>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320058611.23193.63.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

On Sat, 2011-10-29 at 07:17 +0100, jim burns wrote:
> On Sat October 29 2011, 1:57:12 AM, jim burns wrote:
> > For the remaining problems, note that 'xl create winxp' creates a qemu-dm 
> > process with the following parameters:
> > 
> > qemu-dm -d 8 -domain-name winxp -vnc 0.0.0.0:3 -k en-us -serial pty
> > -videoram  4 -boot cda -usb -usbdevice tablet -soundhw es1370 -acpi -vcpus
> > 2 -vcpu_avail 0x3 -net nic,vlan=0,macaddr=00:16:3e:23:1d:36,model=rtl8139
> > -net tap,vlan=0,ifname=tap8.0,bridge=xenbr0,script=no -M xenfv
> 
> Note, starting the domain with 'xm create' with the same config results in:
> 
> /usr/lib/xen/bin/qemu-dm -d 11 -domain-name winxp -videoram 4 -k en-us -vnc 
> 0.0.0.0:3 -monitor vc -vcpus 2 -vcpu_avail 0x3 -boot cda -soundhw es1370 -
> localtime -serial pty -acpi -usbdevice tablet -net 
> nic,vlan=1,macaddr=00:16:3e:23:1d:36,model=rtl8139 -net 
> tap,vlan=1,ifname=tap11.0,bridge=xenbr0 -M xenfv
> 
> Note, 'xl create' does not pass the '-localtime' option,

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().

>  and its '-net tap' specifies 'script=no', unlike 'xm create'.

This is expected, with xl the script for tap devices is run via the
hotplug mechanism (i.e. the same as vif) whereas xend apparently runs it
via qemu. Either _should_ work.

> Also, for some reason, the vlan numbers are different between xl and xm.

That's ok, they are effectively arbitrary and just serve to bind the
"-net nic,..." and "-net tap,..." options to one another (IOW the vlan
ID needs to be consistent across those two options but is otherwise
unimportant).

Ian.



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 04:28:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 04:28:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKq2U-0002hp-N7; Mon, 31 Oct 2011 04:28:26 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKq0V-0002U3-Ub; Mon, 31 Oct 2011 04:26:24 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1320060380!2273956!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3881 invoked from network); 31 Oct 2011 11:26:20 -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;
	31 Oct 2011 11:26:20 -0000
X-IronPort-AV: E=Sophos;i="4.69,431,1315180800"; 
   d="scan'208";a="8672324"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 11:26:20 +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, 31 Oct 2011 11:26:19 +0000
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: Mon, 31 Oct 2011 11:26:19 +0000
In-Reply-To: <1320058232.23193.59.camel@zakaz.uk.xensource.com>
References: <1758215.SCbitK4oVy@dell4550>
	<1320058232.23193.59.camel@zakaz.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: <1320060379.23193.72.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

On Mon, 2011-10-31 at 10:50 +0000, Ian Campbell wrote:
> On Sat, 2011-10-29 at 06:57 +0100, jim burns wrote:
> > Setup:
> > 
> > Fedora 15, w/f16's 3.1.0 (also tried 2.6.40 & 3.0.0)
> > xen 4.1.2 (newly upgraded from 4.1.1, from rawhide)
> > 
> > Since the release notes for 4.1.2 said, in part:
> > 
> > Fixes/features include:
> >  * New XL toolstack
> > 
> > I decided to test some problems I saw using xl to start a winxp hvm domu under 
> > xen 4.1.1, and found that they were still there, and I came up with a somewhat 
> > more serious one as well. I'm sure that others can point out more serious 
> > problems, but these are the ones that affect me. In all cases, 'xm create' 
> > does not have these problems. Domu config at the end of the post.
> > 
> > New to 4.1.2:
> > 
> > 1) Starting winxp with xl does not create a vif interface - only a tap one. 
> > More exactly, the vif is created, but does not get an ipv6 address - it shows 
> > up in 'ifconfig -a', or 'ifconfig vifn.0' - and does not get added to the 
> > bridge. If you are using James' GPLPV drivers, you end up with no network 
> > connectivity, as they use vif, not tap. I'd be surprised if other pvhvm 
> > solutions don't see this also.
> 
> I see this with the tip of xen-4.1-testing too but not with
> xen-unstable. I'll see if I can figure out which backport is missing...

23047:4ca13a170482 "libxl: provide full path to vif hotplug script
script" seems like a very plausible candidate, I bet
"script=/etc/xen/scripts/vif-bridge" would function as a workaround.

> [...]
> > 2) If your vif= line in your config specifies a bridge, such as 
> > 'bridge=virbr0', the '-net tap' option to qemu-dm remains as 'bridge=xenbr0', 
> > as if it was hard coded. Again, this is an hvm problem. 'xl create'-ing a pv 
> > domu correctly puts the vif on the requested bridge. (If memory serves, under 
> > xen 4.1.1, when the vif for an hvm domain was being put on a bridge, I believe 
> > it was on the bridge requested, so the problem is just with tap.)
> 
> Similarly I can reproduce this too but only on 4.1.

Actually this one is broken in unstable too.

The handling of leading and trailing whitespace in the vif option seems
to be completely b0rked in xl and e.g. "bridge = virbr1" ends up as key
"bridge " and key " virbr1". That entire parser (actually, both of them
-- there's a whole nother one in main_networkattach!) is a mess.

There's probably a bandaid which can be applied but really the whole
thing need ripping out and making sensible.

As a workaround in the meantime you can probably avoid whitespace around
the "=" and "," in the vif line.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 04:50:37 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 04:50:37 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKqNx-0004Nn-Dg; Mon, 31 Oct 2011 04:50:37 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKqNF-0004BT-MM
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 04:49:54 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1320061758!44030940!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28220 invoked from network); 31 Oct 2011 11:49:18 -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;
	31 Oct 2011 11:49:18 -0000
X-IronPort-AV: E=Sophos;i="4.69,431,1315180800"; 
   d="scan'208";a="8672865"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 11:49:35 +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, 31 Oct 2011 11:49:35 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 13/13] libxl: New event generation API
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>, Jim Fehlig <jfehlig@suse.com>,
	Dave Scott <Dave.Scott@eu.citrix.com>, Jon Ludlam
	<jonathan.ludlam@eu.citrix.com>
Date: Mon, 31 Oct 2011 11:49:35 +0000
In-Reply-To: <1319827031-15395-14-git-send-email-ian.jackson@eu.citrix.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>
	<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>
	<1319827031-15395-14-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: <1320061775.23193.73.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

I've not looked at this yet but CCing a few potential users of this
interface. I've trimmed it to just the public header changes for their
benefit, I'm sure they can find the full thing in the archive if they
are interested in the gorey details.

On Fri, 2011-10-28 at 19:37 +0100, Ian Jackson wrote:
> Replace the existing API for retrieving high-level events (events
> about domains, etc.) from libxl with a new one.
> 
> This changes the definition and semantics of the `libxl_event'
> structure, and replaces the calls for obtaining information about
> domain death and disk eject events.
> 
> This is an incompatible change, sorry.  The alternative was to try to
> provide both the previous horrid API and the new one, and would also
> involve never using the name `libxl_event' for the new interface.
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
> ---
>  tools/libxl/libxl.c          |  306 +++++++++++++++++++++++++++++------------
>  tools/libxl/libxl.h          |   55 ++-------
>  tools/libxl/libxl_event.c    |  182 +++++++++++++++++++++++---
>  tools/libxl/libxl_event.h    |  172 +++++++++++++++++++++++
>  tools/libxl/libxl_internal.c |    6 +
>  tools/libxl/libxl_internal.h |   66 +++++++++
>  tools/libxl/libxl_types.idl  |   35 ++++-
>  tools/libxl/xl_cmdimpl.c     |  261 +++++++++++++++++++++---------------
>  8 files changed, 815 insertions(+), 268 deletions(-)
> 
> diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
> index da06ed2..4759c18 100644
> --- a/tools/libxl/libxl.h
> +++ b/tools/libxl/libxl.h
> @@ -53,7 +53,10 @@
>   *    A public function may be called from within libxl; the call
>   *    context initialisation macros will make sure that the internal
>   *    caller's context is reused (eg, so that the same xenstore
> - *    transaction is used).
> + *    transaction is used).  But in-libxl callers of libxl public
> + *    functions should note that any libxl public function may cause
> + *    recursively reentry into libxl via the application's event
> + *    callback hook.
>   *
>   *    Public functions have names like libxl_foobar.
>   *
> @@ -152,6 +155,8 @@ void libxl_key_value_list_destroy(libxl_key_value_list *kvl);
> 
>  typedef uint32_t libxl_hwcap[8];
> 
> +typedef uint64_t libxl_ev_user;
> +
>  typedef struct {
>      uint32_t size;          /* number of bytes in map */
>      uint8_t *map;
> @@ -200,6 +205,9 @@ typedef struct {
>      int v;
>  } libxl_enum_string_table;
> 
> +struct libxl_event;
> +typedef LIBXL_TAILQ_ENTRY(struct libxl_event) libxl_ev_link;
> +
>  typedef struct libxl__ctx libxl_ctx;
> 
>  #include "_libxl_types.h"
> @@ -295,51 +303,6 @@ int libxl_run_bootloader(libxl_ctx *ctx,
> 
>    /* 0 means ERROR_ENOMEM, which we have logged */
> 
> -/* events handling */
> -
> -typedef struct {
> -    /* event type */
> -    libxl_event_type type;
> -    /* data for internal use of the library */
> -    char *path;
> -    char *token;
> -} libxl_event;
> -
> -typedef struct {
> -    char *path;
> -    char *token;
> -} libxl_waiter;
> -
> -
> -int libxl_get_wait_fd(libxl_ctx *ctx, int *fd);
> -/* waiter is allocated by the caller */
> -int libxl_wait_for_domain_death(libxl_ctx *ctx, uint32_t domid, libxl_waiter *waiter);
> -/* waiter is a preallocated array of num_disks libxl_waiter elements */
> -int libxl_wait_for_disk_ejects(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *disks, int num_disks, libxl_waiter *waiter);
> -int libxl_get_event(libxl_ctx *ctx, libxl_event *event);
> -int libxl_stop_waiting(libxl_ctx *ctx, libxl_waiter *waiter);
> -int libxl_free_event(libxl_event *event);
> -int libxl_free_waiter(libxl_waiter *waiter);
> -
> -/*
> - * Returns:
> - *  - 0 if the domain is dead but there is no cleanup to be done. e.g
> - *    because someone else has already done it.
> - *  - 1 if the domain is dead and there is cleanup to be done.
> - *
> - * Can return error if the domain exists and is still running.
> - *
> - * *info will contain valid domain state iff 1 is returned. In
> - * particular if 1 is returned then info->shutdown_reason is
> - * guaranteed to be valid since by definition the domain is
> - * (shutdown||dying))
> - */
> -int libxl_event_get_domain_death_info(libxl_ctx *ctx, uint32_t domid, libxl_event *event, libxl_dominfo *info);
> -
> -/*
> - * Returns true and fills *disk if the caller should eject the disk
> - */
> -int libxl_event_get_disk_eject_info(libxl_ctx *ctx, uint32_t domid, libxl_event *event, libxl_device_disk *disk);
> 
>  int libxl_domain_rename(libxl_ctx *ctx, uint32_t domid,
>                          const char *old_name, const char *new_name);
[...]
> diff --git a/tools/libxl/libxl_event.h b/tools/libxl/libxl_event.h
> index 48c6277..c52addc 100644
> --- a/tools/libxl/libxl_event.h
> +++ b/tools/libxl/libxl_event.h
> @@ -18,6 +18,178 @@
> 
>  #include <libxl.h>
> 
> +/*======================================================================*/
> +
> +/*
> + * Domain event handling - getting Xen events from libxl
> + */
> +
> +#define LIBXL_EVENTMASK_ALL (~(unsigned long)0)
> +
> +typedef int libxl_event_predicate(const libxl_event*, void *user);
> +  /* Return value is 0 if the event is unwanted or non-0 if it is.
> +   * Predicates are not allowed to fail.
> +   */
> +
> +int libxl_event_check(libxl_ctx *ctx, libxl_event **event_r,
> +                      unsigned long typemask,
> +                      libxl_event_predicate *predicate, void *predicate_user);
> +  /* Searches for an event, already-happened, which matches typemask
> +   * and predicate.  predicate==0 matches any event.
> +   * libxl_event_check returns the event, which must then later be
> +   * freed by the caller using libxl_event_free.
> +   *
> +   * Returns ERROR_NOT_READY if no such event has happened.
> +   */
> +
> +int libxl_event_wait(libxl_ctx *ctx, libxl_event **event_r,
> +                     unsigned long typemask,
> +                     libxl_event_predicate *predicate, void *predicate_user);
> +  /* Like libxl_event_check but blocks if no suitable events are
> +   * available, until some are.  Uses libxl_osevent_beforepoll/
> +   * _afterpoll so may be inefficient if very many domains are being
> +   * handled by a single program.
> +   */
> +
> +int libxl_event_free(libxl_ctx *ctx, libxl_event *event);
> +
> +
> +/* Alternatively or additionally, the application may also use this: */
> +
> +typedef struct libxl_event_hooks {
> +    uint64_t event_occurs_mask;
> +    void (*event_occurs)(void *user, const libxl_event *event);
> +    void (*disaster)(void *user, libxl_event_type type,
> +                     const char *msg, int errnoval);
> +} libxl_event_hooks;
> +
> +void libxl_event_register_callbacks(libxl_ctx *ctx,
> +                                    const libxl_event_hooks *hooks, void *user);
> +  /*
> +   * Arranges that libxl will henceforth call event_occurs for any
> +   * events whose type is set in event_occurs_mask, rather than
> +   * queueing the event for retrieval by libxl_event_check/wait.
> +   * Events whose bit is clear in mask are not affected.
> +   *
> +   * event becomes owned by the application and must be freed, either
> +   * by event_occurs or later.
> +   *
> +   * event_occurs may be NULL if mask is 0.
> +   *
> +   * libxl_event_register_callback also provides a way for libxl to
> +   * report to the application that there was a problem reporting
> +   * events; this can occur due to lack of host memory during event
> +   * handling, or other wholly unrecoverable errors from system calls
> +   * made by libxl.  This will not happen for frivolous reasons - only
> +   * if the system, or the Xen components of it, are badly broken.
> +   *
> +   * msg and errnoval will describe the action that libxl was trying
> +   * to do, and type specifies the type of libxl events which may be
> +   * missing.  type may be 0 in which case events of all types may be
> +   * missing.
> +   *
> +   * disaster may be NULL.  If it is, or if _register_callbacks has
> +   * not been called, errors of this kind are fatal to the entire
> +   * application: libxl will print messages to its logs and to stderr
> +   * and call exit(-1).
> +   *
> +   * If disaster returns, it may be the case that some or all future
> +   * libxl calls will return errors; likewise it may be the case that
> +   * no more events (of the specified type, if applicable) can be
> +   * produced.  An application which supplies a disaster function
> +   * should normally react either by exiting, or by (when it has
> +   * returned to its main event loop) shutting down libxl with
> +   * libxl_ctx_free and perhaps trying to restart it with
> +   * libxl_ctx_init.
> +   *
> +   * In any case before calling disaster, libxl will have logged a
> +   * message with level XTL_CRITICAL.
> +   *
> +   * Reentrancy: it IS permitted to call libxl from within
> +   * event_occurs.  It is NOT permitted to call libxl from within
> +   * disaster.
> +   *
> +   * libxl_event_register_callbacks may be called as many times, with
> +   * different parameters, as the application likes; the most recent
> +   * call determines the libxl behaviour.  However it is NOT safe to
> +   * call _register_callbacks concurrently with, or reentrantly from,
> +   * any other libxl function.
> +   *
> +   * Calls to _register_callbacks do not affect events which have
> +   * already occurred.
> +   */
> +
> +
> +/*
> + * Events are only generated if they have been requested.
> + * The following functions request the generation of specific events.
> + *
> + * Each set of functions for controlling event generation has this form:
> + *
> + *   typedef struct libxl__evgen_FOO libxl__evgen_FOO;
> + *   int libxl_evenable_FOO(libxl_ctx *ctx, FURTHER PARAMETERS,
> + *                          libxl_ev_user user, libxl__evgen_FOO **evgen_out);
> + *   void libxl_evdisable_FOO(libxl_ctx *ctx, libxl__evgen_FOO *evgen);
> + *
> + * The evenable function arranges that the events (as described in the
> + * doc comment for the individual function) will start to be generated
> + * by libxl.  On success, *evgen_out is set to a non-null pointer to
> + * an opaque struct.
> + *
> + * The user value is returned in the generated events and may be
> + * used by the caller for whatever it likes.  The type ev_user is
> + * guaranteed to be an unsigned integer type which is at least
> + * as big as uint64_t and is also guaranteed to be big enough to
> + * contain any intptr_t value.
> + *
> + * If it becomes desirable to stop generation of the relevant events,
> + * or to reclaim the resources in libxl associated with the evgen
> + * structure, the same evgen value should be passed to the evdisable
> + * function.  However, note that events which occurred prior to the
> + * evdisable call may still be returned.
> + *
> + * The caller may enable identical events more than once.  If they do
> + * so, each actual occurrence will generate several events to be
> + * returned by libxl_event_check, with the appropriate user value(s).
> + * Aside from this, each occurrence of each event is returned by
> + * libxl_event_check exactly once.
> + *
> + * An evgen is associated with the libxl_ctx used for its creation.
> + * After libxl_ctx_free, all corresponding evgen handles become
> + * invalid and must no longer be passed to evdisable.
> + *
> + * Events enabled with evenable prior to a fork and libxl_ctx_postfork
> + * are no longer generated after the fork/postfork; however the evgen
> + * structures are still valid and must be passed to evdisable if the
> + * memory they use should not be leaked.
> + *
> + * Applications should ensure that they eventually retrieve every
> + * event using libxl_event_check or libxl_event_wait, since events
> + * which occur but are not retreived by the application will be queued
> + * inside libxl indefinitely.  libxl_event_check/_wait may be O(n)
> + * where n is the number of queued events which do not match the
> + * criteria specified in the arguments to check/wait.
> + */
> +
> +typedef struct libxl__evgen_domain_death libxl_evgen_domain_death;
> +int libxl_evenable_domain_death(libxl_ctx *ctx, uint32_t domid,
> +                         libxl_ev_user, libxl_evgen_domain_death **evgen_out);
> +void libxl_evdisable_domain_death(libxl_ctx *ctx, libxl_evgen_domain_death*);
> +  /* Arranges for the generation of DOMAIN_SHUTDOWN and DOMAIN_DESTROY
> +   * events.  A domain which is destroyed before it shuts down
> +   * may generate only a DESTROY event.
> +   */
> +
> +typedef struct libxl__evgen_disk_eject libxl_evgen_disk_eject;
> +int libxl_evenable_disk_eject(libxl_ctx *ctx, uint32_t domid, const char *vdev,
> +                        libxl_ev_user, libxl_evgen_disk_eject **evgen_out);
> +void libxl_evdisable_disk_eject(libxl_ctx *ctx, libxl_evgen_disk_eject*);
> +  /* Arranges for the generation of DISK_EJECT events.  A copy of the
> +   * string *vdev will be made for libxl's internal use, and a pointer
> +   * to this (or some other) copy will be returned as the vdev
> +   * member of event.u.
> +   */
> +
> 
>  /*======================================================================*/
> 
> diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
> index 62e7fba..202ba89 100644
> --- a/tools/libxl/libxl_internal.c
> +++ b/tools/libxl/libxl_internal.c
> @@ -74,6 +74,12 @@ void libxl__free_all(libxl__gc *gc)
>      free(gc->alloc_ptrs);
>      gc->alloc_ptrs = 0;
>      gc->alloc_maxsize = 0;
> +
> +    libxl_event *ev, *ev_tmp;
> +    LIBXL_TAILQ_FOREACH_SAFE(ev, &gc->occurred_for_callback, link, ev_tmp) {
> +        LIBXL_TAILQ_REMOVE(&gc->occurred_for_callback, ev, link);
> +        CTX->event_hooks->event_occurs(CTX->event_hooks_user, ev);
> +    }
>  }
> 
>  void *libxl__zalloc(libxl__gc *gc, int bytes)
[...]
> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
> index 93fb8cd..53c07ee 100644
> --- a/tools/libxl/libxl_types.idl
> +++ b/tools/libxl/libxl_types.idl
> @@ -75,11 +75,6 @@ libxl_action_on_shutdown = Enumeration("action_on_shutdown", [
>      (6, "COREDUMP_RESTART"),
>      ])
> 
> -libxl_event_type = Enumeration("event_type", [
> -    (1, "DOMAIN_DEATH"),
> -    (2, "DISK_EJECT"),
> -    ])
> -
>  libxl_button = Enumeration("button", [
>      (1, "POWER"),
>      (2, "SLEEP"),
> @@ -374,3 +369,33 @@ libxl_sched_credit = Struct("sched_credit", [
>      ("weight", integer),
>      ("cap", integer),
>      ], destructor_fn=None)
> +
> +libxl_event_type = Enumeration("event_type", [
> +    (1, "DOMAIN_SHUTDOWN"),
> +    (2, "DOMAIN_DESTROY"),
> +    (3, "DISK_EJECT"),
> +    ])
> +
> +libxl_ev_user = Number("libxl_ev_user")
> +
> +libxl_ev_link = Builtin("ev_link", passby=PASS_BY_REFERENCE, c_only=True)
> +
> +libxl_event = Struct("event",[
> +    ("link",     libxl_ev_link,0,
> +     "for use by libxl; caller may use this once the event has been"
> +     " returned by libxl_event_{check,wait}"),
> +    ("domid",    libxl_domid),
> +    ("domuuid",  libxl_uuid),
> +    ("for_user", libxl_ev_user),
> +    ("type",     libxl_event_type),
> +    ("u", KeyedUnion(None, libxl_event_type, "type",
> +          [("domain_shutdown", Struct(None, [
> +                                             ("shutdown_reason", uint8),
> +                                      ])),
> +           ("domain_destroy", Struct(None, [])),
> +           ("disk_eject", Struct(None, [
> +                                        ("vdev", string),
> +                                        ("disk", libxl_device_disk),
> +                                 ])),
> +           ]))])
> +



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 05:16:55 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 05:16:55 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKqnN-0005HL-W7; Mon, 31 Oct 2011 05:16:54 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKqmN-00054N-AU
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 05:15:52 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-15.tower-216.messagelabs.com!1320063347!1701392!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22648 invoked from network); 31 Oct 2011 12:15:48 -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;
	31 Oct 2011 12:15:48 -0000
X-IronPort-AV: E=Sophos;i="4.69,432,1315180800"; 
   d="scan'208";a="8673410"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 12:15:47 +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, 31 Oct 2011 12:15:47 +0000
Subject: Re: [Xen-devel] [PATCH RFC v2 12/13] libxl: New API for providing
	OS events to libxl
From: Ian Campbell <Ian.Campbell@citrix.com>
To: Ian Jackson <ian.jackson@eu.citrix.com>, Jon Ludlam
	<jonathan.ludlam@eu.citrix.com>, Dave Scott <Dave.Scott@eu.citrix.com>,
	"Jim Fehlig" <jfehlig@suse.com>
Date: Mon, 31 Oct 2011 12:15:47 +0000
In-Reply-To: <1319827031-15395-13-git-send-email-ian.jackson@eu.citrix.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>
	<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>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320063347.23193.76.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

Jon/Dave/Jim,

I CC'd you the API bits from 13/13 (as potential users of it) without
realising that there was some here too. Once again I've trimmed this to
just the public headers, see the archives if you want the underlying
bits.

Comments on the suitability for your usecases etc gratefully received.

Ian.

 On Fri, 2011-10-28 at 19:37 +0100, Ian Jackson wrote:
> We provide a new set of functions and related structures
>   libxl_osevent_*
> which are to be used by event-driven applications to receive
> information from libxl about which fds libxl is interested in, and
> what timeouts libxl is waiting for, and to pass back to libxl
> information about which fds are readable/writeable etc., and which
> timeouts have occurred.  Ie, low-level events.
> 
> In this patch, this new machinery is still all unused.  Callers will
> appear in the next patch in the series, which introduces a new API for
> applications to receive high-level events about actual domains etc.
> 
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
> ---
>  tools/libxl/Makefile         |    2 +-
>  tools/libxl/libxl.c          |   25 ++
>  tools/libxl/libxl.h          |    6 +
>  tools/libxl/libxl_event.c    |  704 ++++++++++++++++++++++++++++++++++++++++++
>  tools/libxl/libxl_event.h    |  185 +++++++++++
>  tools/libxl/libxl_internal.h |  212 +++++++++++++-
>  6 files changed, 1131 insertions(+), 3 deletions(-)
>  create mode 100644 tools/libxl/libxl_event.c
>  create mode 100644 tools/libxl/libxl_event.h
[...]
> diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
> index 5d28ff9..da06ed2 100644
> --- a/tools/libxl/libxl.h
> +++ b/tools/libxl/libxl.h
> @@ -137,6 +137,7 @@
>  #include <xen/sysctl.h>
> 
>  #include <libxl_uuid.h>
> +#include <_libxl_list.h>
> 
>  typedef uint8_t libxl_mac[6];
>  #define LIBXL_MAC_FMT "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx"
> @@ -221,6 +222,9 @@ enum {
>      ERROR_INVAL = -6,
>      ERROR_BADFAIL = -7,
>      ERROR_GUEST_TIMEDOUT = -8,
> +    ERROR_NOT_READY = -9,
> +    ERROR_OSEVENT_REG_FAIL = -10,
> +    ERROR_BUFFERFULL = -11,
>  };
> 
>  #define LIBXL_VERSION 0
> @@ -539,6 +543,8 @@ const char *libxl_xen_script_dir_path(void);
>  const char *libxl_lock_dir_path(void);
>  const char *libxl_run_dir_path(void);
> 
> +#include <libxl_event.h>
> +
>  #endif /* LIBXL_H */
> 
>  /*
> [...]
> diff --git a/tools/libxl/libxl_event.h b/tools/libxl/libxl_event.h
> new file mode 100644
> index 0000000..48c6277
> --- /dev/null
> +++ b/tools/libxl/libxl_event.h
> @@ -0,0 +1,185 @@
> +/*
> + * Copyright (C) 2011      Citrix Ltd.
> + * Author Ian Jackson <ian.jackson@eu.citrix.com>
> + *
> + * This program 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 only. with the special
> + * exception on linking described in file LICENSE.
> + *
> + * This program 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.
> + */
> +
> +#ifndef LIBXL_EVENT_H
> +#define LIBXL_EVENT_H
> +
> +#include <libxl.h>
> +
> +
> +/*======================================================================*/
> +
> +/*
> + * OS event handling - passing low-level OS events to libxl
> + *
> + * Event-driven programs must use these facilities to allow libxl
> + * to become aware of readability/writeability of file descriptors
> + * and the occurrence of timeouts.
> + *
> + * 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;
> + *      }
> + *   }
> + *
> + * The second approach uses libxl_osevent_register_hooks and is
> + * suitable for programs which are already using a callback-based
> + * event library.
> + *
> + * An application may freely mix the two styles of interaction.
> + */
> +
> +struct pollfd;
> +
> +int libxl_osevent_beforepoll(libxl_ctx *ctx, int *nfds_io,
> +                             struct pollfd *fds, int *timeout_upd,
> +                             struct timeval now);
> +  /* The caller should provide beforepoll with some space for libxl's
> +   * fds, and tell libxl how much space is available by setting *nfds_io.
> +   * fds points to the start of this space (and fds may be a pointer into
> +   * a larger array, for example, if the application has some fds of
> +   * its own that it is interested in).
> +   *
> +   * On return *nfds_io will in any case have been updated by libxl
> +   * according to how many fds libxl wants to poll on.
> +   *
> +   * If the space was sufficient, libxl fills in fds[0..<new
> +   * *nfds_io>] suitably for poll(2), updates *timeout_upd if needed,
> +   * and returns ok.
> +   *
> +   * If space was insufficient, fds[0..<old *nfds_io>] is undefined on
> +   * return; *nfds_io on return will be greater than the value on
> +   * entry; *timeout_upd may or may not have been updated; and
> +   * libxl_osevent_beforepoll returns ERROR_BUFERFULL.  In this case
> +   * the application needs to make more space (enough space for
> +   * *nfds_io struct pollfd) and then call beforepoll again, before
> +   * entering poll(2).  Typically this will involve calling realloc.
> +   *
> +   * The application may call beforepoll with fds==NULL and
> +   * *nfds_io==0 in order to find out how much space is needed.
> +   *
> +   * *timeout_upd is as for poll(2): it's in milliseconds, and
> +   * negative values mean no timeout (infinity).
> +   * libxl_osevent_beforepoll will only reduce the timeout, naturally.
> +   */
> +void libxl_osevent_afterpoll(libxl_ctx *ctx, int nfds, const struct pollfd *fds,
> +                             struct timeval now);
> +  /* nfds and fds[0..nfds] must be from the most recent call to
> +   * _beforepoll, as modified by poll.
> +   *
> +   * This function actually performs all of the IO and other actions,
> +   * and generates events (libxl_event), which are implied by either
> +   * (a) the time of day or (b) both (i) the returned information from
> +   * _beforepoll, and (ii) the results from poll specified in
> +   * fds[0..nfds-1].  Generated events can then be retrieved by
> +   * libxl_event_check.
> +   */
> +
> +
> +typedef struct libxl_osevent_hooks {
> +  int (*fd_register)(void *user, int fd, void **for_app_registration_out,
> +                     short events, void *for_libxl);
> +  int (*fd_modify)(void *user, int fd, void **for_app_registration_update,
> +                   short events);
> +  void (*fd_deregister)(void *user, int fd, void *for_app_registration);
> +  int (*timeout_register)(void *user, void **for_app_registration_out,
> +                          struct timeval abs, void *for_libxl);
> +  int (*timeout_modify)(void *user, void **for_app_registration_update,
> +                         struct timeval abs);
> +  void (*timeout_deregister)(void *user, void *for_app_registration_io);
> +} libxl_osevent_hooks;
> +
> +void libxl_osevent_register_hooks(libxl_ctx *ctx,
> +                                  const libxl_osevent_hooks *hooks,
> +                                  void *user);
> +  /* The application which calls register_fd_hooks promises to
> +   * maintain a register of fds and timeouts that libxl is interested
> +   * in, and make calls into libxl (libxl_osevent_occurred_*)
> +   * when those fd events and timeouts occur.  This is more efficient
> +   * than _beforepoll/_afterpoll if there are many fds (which can
> +   * happen if the same libxl application is managing many domains).
> +   *
> +   * For an fd event, events is as for poll().  register or modify may
> +   * be called with events==0, in which case it must still work
> +   * normally, just not generate any events.
> +   *
> +   * For a timeout event, milliseconds is as for poll().
> +   * Specifically, negative values of milliseconds mean NO TIMEOUT.
> +   * This is used by libxl to temporarily disable a timeout.
> +   *
> +   * If the register or modify hook succeeds it may update
> +   * *for_app_registration_out/_update and must then return 0.
> +   * On entry to register, *for_app_registration_out is always NULL.
> +   *
> +   * A registration or modification hook may fail, in which case it
> +   * must leave the registration state of the fd or timeout unchanged.
> +   * It may then either return ERROR_OSEVENT_REG_FAIL or any positive
> +   * int.  The value returned will be passed up through libxl and
> +   * eventually returned back to the application.  When register
> +   * fails, any value stored into *for_registration_out is ignored by
> +   * libxl; when modify fails, any changed value stored into
> +   * *for_registration_update is honoured by libxl and will be passed
> +   * to future modify or deregister calls.
> +   *
> +   * libxl will only attempt to register one callback for any one fd.
> +   * libxl will remember the value stored in *for_app_registration_io
> +   * by a successful call to register or modify and pass it into
> +   * subsequent calls to modify or deregister.
> +   *
> +   * register_fd_hooks may be called only once for each libxl_ctx.
> +   * libxl may make calls to register/modify/deregister from within
> +   * any libxl function (indeed, it will usually call register from
> +   * register_event_hooks).  Conversely, the application MUST NOT make
> +   * the event occurrence calls (libxl_osevent_occurred_*) into libxl
> +   * reentrantly from within libxl (for example, from within the
> +   * register/modify functions).
> +   *
> +   * The value *hooks is not copied and must outlast the libxl_ctx.
> +   */
> +
> +/* It is NOT legal to call _occurred_ reentrantly within any libxl
> + * function.  Specifically it is NOT legal to call it from within
> + * a register callback.  Conversely, libxl MAY call register/deregister
> + * from within libxl_event_registered_call_*.
> + */
> +
> +void libxl_osevent_occurred_fd(libxl_ctx *ctx, void *for_libxl,
> +                               int fd, short events, short revents);
> +
> +void libxl_osevent_occurred_timeout(libxl_ctx *ctx, void *for_libxl);
> +  /* Implicitly, on entry to this function the timeout has been
> +   * deregistered.  If _occurred_timeout is called, libxl will not
> +   * call timeout_deregister; if it wants to requeue the timeout it
> +   * will call timeout_register again.
> +   */
> +
> +#endif
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-basic-offset: 4
> + * indent-tabs-mode: nil
> + * End:
> + */




_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 05:42:52 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 05:42:52 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKrCV-00066K-1F; Mon, 31 Oct 2011 05:42:51 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKrBj-0005sL-R3
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 05:42:04 -0700
X-Env-Sender: Ian.Campbell@citrix.com
X-Msg-Ref: server-6.tower-216.messagelabs.com!1320064920!1685795!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 10446 invoked from network); 31 Oct 2011 12:42:00 -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;
	31 Oct 2011 12:42:00 -0000
X-IronPort-AV: E=Sophos;i="4.69,432,1315180800"; 
   d="scan'208";a="8674021"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 12:42: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, 31 Oct 2011 12:42:00 +0000
From: Ian Campbell <Ian.Campbell@citrix.com>
To: John Baboval <john.baboval@virtualcomputer.com>
Date: Mon, 31 Oct 2011 12:41:59 +0000
In-Reply-To: <4EAB04B8.2030505@virtualcomputer.com>
References: <4EAB04B8.2030505@virtualcomputer.com>
Organization: Citrix Systems, Inc.
Content-Type: text/plain; charset="UTF-8"
X-Mailer: Evolution 3.0.3- 
Content-Transfer-Encoding: 7bit
Message-ID: <1320064920.23193.79.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Cc: Anthony Perard <anthony.perard@citrix.com>,
	xen-devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@citrix.com>, qemu-devel@nongnu.org
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH 3/3] piix4 acpi xen 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

Please CC xen-devel on patches which impact the Xen support in qemu.

On Fri, 2011-10-28 at 15:38 -0400, John Baboval wrote:
> When in xen mode, handle the view of pm ioport appropriately.
> 
> I'm not entirely comfortable with this patch, since it relies on values
> that are hard coded into the DSDT that is shipped with Xen. There has to 
> be a better way to handle it, but I haven't thought of what that might 
> be yet... Perhaps there should be an acpi_xen.c. Or perhaps the Xen 
> table should be modified to match the device model. Or perhaps there is 
> a good way to match them up dynamically.

Anthony Perard posted a patch to xen-devel last week (series entitled
"hvmloader/DSDT change to handle PCI hotplug with QEMU upstream") which
makes the Xen ACPI tables compatible with the upstream QEMU PM registers
etc. I think that covers this issue too?

Ian.
> 
> 
> Signed-off-by: John V. Baboval <john.baboval@virtualcomputer.com>
> Signed-off-by: Tom Goetz <tom.goetz@virtualcomputer.com>
> ---
>   hw/acpi_piix4.c |   82 
> +++++++++++++++++++++++++++++++++++++++++++++++++------
>   1 files changed, 73 insertions(+), 9 deletions(-)
> 
> diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
> index 29f0f76..277ae9f 100644
> --- a/hw/acpi_piix4.c
> +++ b/hw/acpi_piix4.c
> @@ -24,6 +24,7 @@
>   #include "sysemu.h"
>   #include "range.h"
>   #include "ioport.h"
> +#include "xen.h"
>    //#define DEBUG
>   @@ -111,6 +112,35 @@ static void pm_ioport_write(IORange *ioport, 
> uint64_t addr, unsigned width,
>                         (unsigned)addr, width, (unsigned)val);
>       }
>   +    if (xen_enabled()) {
> +    /*
> +     * Only the PM control register is emulated in Qemu under Xen. The
> +     * remaining registers are emulated by the hypervisor.
> +     */
> +        int sus_typ;
> +        s->pm1_cnt.cnt = val & ~(ACPI_BITMASK_SLEEP_ENABLE);
> +        if (val & ACPI_BITMASK_SLEEP_ENABLE) {
> +            /* change suspend type */
> +            sus_typ = (val >> 10) & 7;
> +            switch(sus_typ) {
> +            case 6: /* soft power off */
> +            case 7: /* soft power off */
> +                qemu_system_shutdown_request();
> +                break;
> +            case 5:
> +                /* ACPI_BITMASK_WAKE_STATUS should be set on resume.
> +                   Pretend that resume was caused by power button */
> +                qemu_system_reset_request();
> +                if (s->pm1_cnt.cmos_s3) {
> +                    qemu_irq_raise(s->pm1_cnt.cmos_s3);
> +                }
> +            default:
> +                break;
> +            }
> +        }
> +        return;
> +    }
> +
>       switch(addr) {
>       case 0x00:
>           acpi_pm1_evt_write_sts(&s->pm1a, &s->tmr, val);
> @@ -136,6 +166,15 @@ static void pm_ioport_read(IORange *ioport, 
> uint64_t addr, unsigned width,
>       PIIX4PMState *s = container_of(ioport, PIIX4PMState, ioport);
>       uint32_t val;
>   +    if (xen_enabled()) {
> +    /*
> +     * Only the PM control register is emulated in Qemu under Xen. The
> +     * remaining registers are emulated by the hypervisor.
> +     */
> +        val = s->pm1_cnt.cnt;
> +        return;
> +    }
> +
>       switch(addr) {
>       case 0x00:
>           val = acpi_pm1_evt_get_sts(&s->pm1a, s->tmr.overflow_time);
> @@ -181,19 +220,28 @@ static void acpi_dbg_writel(void *opaque, uint32_t 
> addr, uint32_t val)
>       PIIX4_DPRINTF("ACPI: DBG: 0x%08x\n", val);
>   }
>   +#define PMCNTRL	0x04
>   static void pm_io_space_update(PIIX4PMState *s)
>   {
> -    uint32_t pm_io_base;
> +    uint32_t pm_io_base, size;
> +
> +    if (!(s->dev.config[0x80] & 1) && !xen_enabled()) {
> +        return;
> +    }
>   -    if (s->dev.config[0x80] & 1) {
> -        pm_io_base = le32_to_cpu(*(uint32_t *)(s->dev.config + 0x40));
> -        pm_io_base &= 0xffc0;
> +    pm_io_base = le32_to_cpu(*(uint32_t *)(s->dev.config + 0x40));
> +    pm_io_base &= 0xffc0;
> +    size = 16;
>   -        /* XXX: need to improve memory and ioport allocation */
> -        PIIX4_DPRINTF("PM: mapping to 0x%x\n", pm_io_base);
> -        iorange_init(&s->ioport, &pm_iorange_ops, pm_io_base, 64);
> -        ioport_register(&s->ioport);
> +    if (xen_enabled()) {
> +        size = 2;
> +        pm_io_base += PMCNTRL;
>       }
> +
> +    /* XXX: need to improve memory and ioport allocation */
> +    PIIX4_DPRINTF("PM: mapping to 0x%x\n", pm_io_base);
> +    iorange_init(&s->ioport, &pm_iorange_ops, pm_io_base, size);
> +    ioport_register(&s->ioport);
>   }
>    static void pm_write_config(PCIDevice *d,
> @@ -326,6 +374,13 @@ static void piix4_pm_machine_ready(Notifier *n, 
> void *opaque)
>    }
>   +#define    PIIX4_BASE_IOADDR       0x1f40
> +#define    PIIX4_BASE_IOADDR_LO    ((PIIX4_BASE_IOADDR) & 0xff)
> +#define    PIIX4_BASE_IOADDR_HI    ((PIIX4_BASE_IOADDR)>>8)
> +
> +/* PM1a_CNT bits, as defined in the ACPI specification. */
> +#define SCI_EN            (1 <<  0)
> +
>   static int piix4_pm_initfn(PCIDevice *dev)
>   {
>       PIIX4PMState *s = DO_UPCAST(PIIX4PMState, dev, dev);
> @@ -337,7 +392,13 @@ static int piix4_pm_initfn(PCIDevice *dev)
>       pci_conf[0x09] = 0x00;
>       pci_conf[0x3d] = 0x01; // interrupt pin 1
>   -    pci_conf[0x40] = 0x01; /* PM io base read only bit */
> +    if (!xen_enabled()) {
> +        pci_conf[0x40] = 0x01; /* PM io base read only bit */
> +    } else {
> +        pci_conf[0x40] = PIIX4_BASE_IOADDR_LO | 0x01; /* Special 
> device-specific BAR at 0x40 */
> +        pci_conf[0x41] = PIIX4_BASE_IOADDR_HI;
> +        s->pm1_cnt.cnt = SCI_EN;
> +    }
>        /* APM */
>       apm_init(&s->apm, apm_ctrl_changed, s);
> @@ -369,6 +430,9 @@ static int piix4_pm_initfn(PCIDevice *dev)
>       qemu_register_reset(piix4_reset, s);
>       piix4_acpi_system_hot_add_init(dev->bus, s);
>   +    if (xen_enabled())
> +        pm_io_space_update(s);
> +
>       return 0;
>   }
>   -- 1.7.4.1
> 
> 
> 



_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 06:19:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 06:19:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKrmD-0007IQ-Ah; Mon, 31 Oct 2011 06:19:45 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKrlT-00075z-3W
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 06:18:59 -0700
X-Env-Sender: anthony.perard@gmail.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1320067114!42711556!1
X-Originating-IP: [209.85.215.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15919 invoked from network); 31 Oct 2011 13:18:34 -0000
Received: from mail-ey0-f171.google.com (HELO mail-ey0-f171.google.com)
	(209.85.215.171)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Oct 2011 13:18:34 -0000
Received: by eyb6 with SMTP id 6so8453978eyb.30
	for <xen-devel@lists.xensource.com>;
	Mon, 31 Oct 2011 06:18:55 -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=6BHTabmgr9tttuQmHSxn3DxMaQMWCenUjgzlJYj/HCo=;
	b=pXzSX7kYE4eP0qgt1HqZid3ZZ8Au6YaH/kkZlXite41cOAvX4f+lUD3RCVPn4QXutz
	LbLjoWVwsHes4RgkztvGikjooXoZp2zuu48Q95CK7EOirbWCozVhDwkbGoN6qLZXCkMx
	1Ues+8jQ86bUAj6FBuHMjsjDPqSCBD0QjtapA=
Received: by 10.182.77.196 with SMTP id u4mr2848414obw.19.1320067135172; Mon,
	31 Oct 2011 06:18:55 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.182.37.197 with HTTP; Mon, 31 Oct 2011 06:18:23 -0700 (PDT)
In-Reply-To: <1320064920.23193.79.camel@zakaz.uk.xensource.com>
References: <4EAB04B8.2030505@virtualcomputer.com>
	<1320064920.23193.79.camel@zakaz.uk.xensource.com>
From: Anthony PERARD <anthony.perard@citrix.com>
Date: Mon, 31 Oct 2011 13:18:23 +0000
X-Google-Sender-Auth: T21SPx0sgIIzLS8Lx9ewx43OLPc
Message-ID: <CAJJyHjJnVWEDZmx7fOByyiVrAS0PVdVJ_6JcjzQkHTa-1XV19w@mail.gmail.com>
To: John Baboval <john.baboval@virtualcomputer.com>
Content-Type: text/plain; charset=UTF-8
Cc: xen-devel <xen-devel@lists.xensource.com>,
	Stefano Stabellini <stefano.stabellini@citrix.com>,
	qemu-devel@nongnu.org, Ian Campbell <Ian.Campbell@citrix.com>
Subject: [Xen-devel] Re: [Qemu-devel] [PATCH 3/3] piix4 acpi xen 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 Mon, Oct 31, 2011 at 12:41, Ian Campbell <Ian.Campbell@citrix.com> wrote:
> Please CC xen-devel on patches which impact the Xen support in qemu.
>
> On Fri, 2011-10-28 at 15:38 -0400, John Baboval wrote:
>> When in xen mode, handle the view of pm ioport appropriately.
>>
>> I'm not entirely comfortable with this patch, since it relies on values
>> that are hard coded into the DSDT that is shipped with Xen. There has to
>> be a better way to handle it, but I haven't thought of what that might
>> be yet... Perhaps there should be an acpi_xen.c. Or perhaps the Xen
>> table should be modified to match the device model. Or perhaps there is
>> a good way to match them up dynamically.
>
> Anthony Perard posted a patch to xen-devel last week (series entitled
> "hvmloader/DSDT change to handle PCI hotplug with QEMU upstream") which
> makes the Xen ACPI tables compatible with the upstream QEMU PM registers
> etc. I think that covers this issue too?

Actually, Xen unstable should already have the necessary change to
cover everythings in this patch since a while. So QEMU does not need
to be modified.

If something does not work, could you tell me what?

Regards,

-- 
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 Oct 31 07:09:53 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 07:09:53 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKsYi-0000Qe-Qs; Mon, 31 Oct 2011 07:09:52 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKsXj-0000DD-MU
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 07:08:52 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-6.tower-27.messagelabs.com!1320070099!55355246!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29954 invoked from network); 31 Oct 2011 14:08:20 -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; 31 Oct 2011 14:08:20 -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
	p9VE8ikZ011148
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 31 Oct 2011 14:08:45 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
	p9VE8hfU021018
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 31 Oct 2011 14:08:43 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
	p9VE8bqQ022637; Mon, 31 Oct 2011 09:08:37 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 31 Oct 2011 07:08:37 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 18235827DD; Mon, 31 Oct 2011 10:08:36 -0400 (EDT)
Date: Mon, 31 Oct 2011 10:08:36 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: Tobias Heinlein <theinlein@vandium.net>, 2013pfoley@tjhsst.edu
Message-ID: <20111031140836.GA9245@phenom.dumpdata.com>
References: <05c3da5dc6158197e28d62e853ac2f04@tjhsst.edu>
	<loom.20111031T140651-901@post.gmane.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <loom.20111031T140651-901@post.gmane.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.0A090208.4EAEABEE.00DB,ss=1,re=0.000,fgs=0
Cc: xen-devel@lists.xensource.com, linux-kernel@vger.kernel.org
Subject: [Xen-devel] Re: Xen dom0 linux kernel 3.1 boot failure
 ptwr_emulate: could not get_page_from_l1e
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto: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 01:17:09PM +0000, Tobias Heinlein wrote:
> Hi,
> 
> 2013pfoley <2013pfoley <at> tjhsst.edu> writes:
> > [..]
> >
> >  [    0.000000] last_pfn = 0x63b5ef max_arch_pfn = 0x400000000
> >  [    0.000000] last_pfn = 0xdf62d max_arch_pfn = 0x400000000
> >  [    0.000000] found SMP MP-table at [ffff8800000f4f80] f4f80
> >  (XEN) mm.c:945:d0 Error getting mfn 100 (pfn 5555555555555555) from L1 
> >  entry 8000000000100461 for l1e_owner=0, pg_owner=0
> >  (XEN) mm.c:5046:d0 ptwr_emulate: could not get_page_from_l1e()
> >  [    0.000000] BUG: unable to handle kernel NULL pointer dereference at 
> >           (null)
> >  [    0.000000] IP: [<ffffffff81008a5a>] xen_set_pte+0x3a/0x1f0
> >  [    0.000000] PGD 0
> >  [    0.000000] Oops: 0003 [#1] SMP
> >  [    0.000000] CPU 0
> >  [    0.000000] Modules linked in:
> >  [    0.000000]
> >  [    0.000000] Pid: 0, comm: swapper Not tainted 3.1.0 #4 HP ProLiant 
> >  DL380 G6
> 
> I get the exact same error here. Reading from your output, it seems we have the
> same hardware; I have this problem on a HP ProLiant DL380 G6, too. 
> 
> After a wild hint from a guy on ##xen to play around with the BIOS settings, I
> was able to narrow down the problem to a setting called "MPS Table Mode". It is
> set to "Full Table APIC" by default (with which the crash occurs), but when it's
> set to "Disabled" Xen boots the kernel just fine.
> 
> FWIW, the help text of the setting is: "Multi Processor Specification (MPS)
> Table / APIC Setting is used for interrupt routing. Certain unsupported
> operating systems may require setting the MPS Table Mode to APIC Disabled."

Oh nice. What does you /proc/interrupts look like compared to baremetal?

> 
> (BTW, the kernel itself boots fine without Xen. So I'm not sure if this belongs
> to the LKML at all.)

It does not. But CC-ing xen-devel here for further tracking.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 07:11:50 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 07:11:50 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKsac-0000vF-IX; Mon, 31 Oct 2011 07:11:50 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKsZT-0000Yv-Fm
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 07:10:42 -0700
X-Env-Sender: liang.tang@oracle.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1320070234!2341065!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26043 invoked from network); 31 Oct 2011 14:10:35 -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; 31 Oct 2011 14:10:35 -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
	p9VEAWit013780
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 31 Oct 2011 14:10:33 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
	p9VEAVth028926
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 31 Oct 2011 14:10:32 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
	p9VEAQLC001263; Mon, 31 Oct 2011 09:10:26 -0500
Received: from [10.191.10.241] (/10.191.10.241)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 31 Oct 2011 07:10:26 -0700
Message-ID: <4EAEAC4B.4000004@oracle.com>
Date: Mon, 31 Oct 2011 22:10:19 +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>,
	"xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
X-Source-IP: acsinet21.oracle.com [141.146.126.237]
X-Auth-Type: Internal IP
X-CT-RefId: str=0001.0A090209.4EAEAC59.0111,ss=1,re=0.000,fgs=0
Cc: 
Subject: [Xen-devel] 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>
Content-Type: multipart/mixed; boundary="===============1200059316=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

This is a multi-part message in MIME format.
--===============1200059316==
Content-Type: multipart/alternative;
	boundary="------------070605000207030700010909"

This is a multi-part message in MIME format.
--------------070605000207030700010909
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

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.
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'

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

liang.


--------------070605000207030700010909
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">
    Hi,Jan<br>
    <div id="yui_3_2_0_1_1320066973281111" class="msg-body inner
      undoreset">
      <div id="yiv1739815411">
        <div id="yui_3_2_0_1_1320066973281110">
          <div style="background-color: rgb(255, 255, 255); font-family:
            times new roman,new york,times,serif; color: rgb(0, 0, 0);
            font-size: 12pt;" id="yui_3_2_0_1_1320066973281109">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.<br>
            if modify the i386pep to elf_x86_64 ,the build can continue
            ,and report other error --subsystem=10 and
            --image-base=0xffff82c480000000 unrecognized.<br>
            do you have any suggestion about that?Â  thank you very much!<br>
            <br>
            the detail is follow.<br>
            <div id="yui_3_2_0_1_1320066973281115">ld: unrecognized
              option '--image-base=0xffff82c480000000'<br>
            </div>
            <div><br>
            </div>
            <div>In the xen/arch/x86/efi/disabled</div>
            ld: unrecognized emulation mode: i386pep<br>
            Supported emulations: elf_x86_64 elf32_x86_64 elf_i386
            i386linux elf_l1om<br>
          </div>
        </div>
      </div>
    </div>
    <br>
    liang.<br>
    <br>
  </body>
</html>

--------------070605000207030700010909--


--===============1200059316==
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

--===============1200059316==--


From xen-devel-bounces@lists.xensource.com Mon Oct 31 09:16:54 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 09:16:54 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKuXd-0004q5-4s; Mon, 31 Oct 2011 09:16:53 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKuWo-0004dJ-Po
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 09:16:03 -0700
X-Env-Sender: konrad.wilk@oracle.com
X-Msg-Ref: server-3.tower-21.messagelabs.com!1320077757!2375427!1
X-Originating-IP: [141.146.126.227]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9421 invoked from network); 31 Oct 2011 16:15:58 -0000
Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com)
	(141.146.126.227)
	by server-3.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 31 Oct 2011 16:15:58 -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
	p9VGFsw4031491
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK);
	Mon, 31 Oct 2011 16:15:55 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
	p9VGFsnS007318
	(version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO);
	Mon, 31 Oct 2011 16:15:54 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
	p9VGFmhq032537; Mon, 31 Oct 2011 11:15:48 -0500
Received: from phenom.dumpdata.com (/209.6.85.33)
	by default (Oracle Beehive Gateway v4.0)
	with ESMTP ; Mon, 31 Oct 2011 09:15:48 -0700
Received: by phenom.dumpdata.com (Postfix, from userid 1000)
	id 58E18827DD; Mon, 31 Oct 2011 12:15:47 -0400 (EDT)
Date: Mon, 31 Oct 2011 12:15:47 -0400
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: liang tang <liang.tang@oracle.com>
Subject: Re: [Xen-devel] Need some help about the build xen.efi
Message-ID: <20111031161547.GA12475@phenom.dumpdata.com>
References: <4EAEAC4B.4000004@oracle.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <4EAEAC4B.4000004@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.0A090203.4EAEC9BB.018A,ss=1,re=0.000,fgs=0
Cc: "xen-devel@lists.xensource.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 Mon, Oct 31, 2011 at 10:10:19PM +0800, liang tang 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.
> if modify the i386pep to elf_x86_64 ,the build can continue ,and

Right, but that is not correct. The i386pep defines what type of executable
the binary will be. You do not want an x86_64 ELF, you want an i386
Portable Executable Program (I think that is what PEP stands for).

Google should have some details on how build/install an cross compiler for
i386pep.

> 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'
> 
> 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
> 
> liang.
> 

> _______________________________________________
> 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 Oct 31 09:39:06 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 09:39:06 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKut7-0005ZL-Ib; Mon, 31 Oct 2011 09:39:05 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKusF-0005MR-Nu
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 09:38:12 -0700
X-Env-Sender: Jean.Guyader@citrix.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320079063!46647626!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17559 invoked from network); 31 Oct 2011 16:37:44 -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;
	31 Oct 2011 16:37:44 -0000
X-IronPort-AV: E=Sophos;i="4.69,432,1315180800"; 
   d="scan'208";a="8680227"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 16:38: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, 31 Oct 2011 16:38: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 1RKusB-0005Ga-QV;
	Mon, 31 Oct 2011 16:38:07 +0000
Received: from jeangu by spongy.cam.xci-test.com with local (Exim 4.69)
	(envelope-from <jean.guyader@eu.citrix.com>)	id 1RKus5-0005K5-Qt;
	Mon, 31 Oct 2011 16:38:01 +0000
Date: Mon, 31 Oct 2011 16:38:01 +0000
From: Jean Guyader <jean.guyader@eu.citrix.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
BCC: Ross Philipson <Ross.Philipson@citrix.com>
Message-ID: <20111031163801.GG19392@spongy.cam.xci-test.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
User-Agent: Mutt/1.5.21 (2010-09-15)
Cc: "Kay, Allen M" <allen.m.kay@intel.com>
Subject: [Xen-devel] [VTD] Intel iommu IOTLB flush really slow
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

Some IOMMU DMA remapping engine sometimes take longer to flush the IOTLBs.
For instance on Ibex Peak a iommu_map_page can in the order of milisecondes.

In the Intel IOMMU spec you can see that you don't need to flush if the PTE was
present so it's all good when we are creating a domain because we don't need to
flush anything. Some problem happen when we try to move memory arround.

Here is some code from hvmloader, pci.c:190 on xen-unstable:

while ( (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);
    xatp.domid = DOMID_SELF;
    xatp.space = XENMAPSPACE_gmfn;
    xatp.idx   = --hvm_info->low_mem_pgend;
    xatp.gpfn  = hvm_info->high_mem_pgend++;
    if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) != 0 )
        BUG();
}

This code gets triggered when the PCI hole increased so much that it
overlaps with the allocated RAM. So we have to relocate the section that
overlap in the top memory.

If we folow the code down to Xen we can find that add_to_physmap calls
set_p2m_entry which uses either p2m_set_entry or ept_set_entry with an order
or 0, yes we only try to move one page.

Both implementations update the iommu page table with iommu_map_page.
So at the end we end up doing a loop of iommu_map_page driven by this loop
in hvmloader.

The IOMMU DMA remapping enigne of the Intel GPU is really really
slow to flush. So when we try to create a domain that does Intel GPU pass
through with enough memory to force a relocation of the top RAM below 4G
the domain can take minutes to start!

There are multiple approches that we can use to fix this problem, but before I
start working on a patch I would like to get the list's point of view.

Plan A:
  - Add a new XENMEM add_to_physmap_range that would relocate a gfn range to a new gfn.
  - Add a flag in the IOMMU API to delay the IOTLB flush
  - Add a new API call to flush the the IOTLB manully once we relocate all the range.

Plan B:
  - Add a new XENMEM add_to_physmap_range that would relocate a gfn range to a new gfn.
  - Add a new set_p2m_entry function that will understand batches of gfns and mfns.
  - Implement batch operation for shadow and HAP.
  - Add new IOMMU API to support batch operation

(A) isn't very nice but has the benefit of not modifying to much code, (B) would be the
right thing to do but would be quite disruptive in term of code and API change.

Let me know what you think,
Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 11:02:13 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 11:02:13 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKwBZ-0001ZN-5D; Mon, 31 Oct 2011 11:02:13 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKw9o-0000z6-Ty
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 11:00:25 -0700
X-Env-Sender: murkys@gmail.com
X-Msg-Ref: server-2.tower-216.messagelabs.com!1320084021!3085867!1
X-Originating-IP: [209.85.161.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13594 invoked from network); 31 Oct 2011 18:00:21 -0000
Received: from mail-fx0-f43.google.com (HELO mail-fx0-f43.google.com)
	(209.85.161.43)
	by server-2.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	31 Oct 2011 18:00:21 -0000
Received: by faat9 with SMTP id t9so8168336faa.30
	for <xen-devel@lists.xensource.com>;
	Mon, 31 Oct 2011 11:00:21 -0700 (PDT)
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
	:content-type:content-transfer-encoding;
	bh=ILTzh70aZgIpH1qqmwl2quL/WXSjSyAnjd/zkbsR5dk=;
	b=WODEwVqax54YqqTxuLRU9oCz+X73pYGWF+9wnk8yy8OvhxdPXC4S+WQUCiko9D0WKY
	ViFPRCYU5JVVwBtJhdQBhKIKMS4bVdd0uTURcSwtM71J47/x+aCO15qyC8P+kaGE23Em
	KiZ8Vo6IP3f06oUmuMp8REpIQc9LaERksAYgY=
Received: by 10.223.88.216 with SMTP id b24mr14696229fam.30.1320084021093;
	Mon, 31 Oct 2011 11:00:21 -0700 (PDT)
Received: from [192.168.0.200] ([94.75.87.9])
	by mx.google.com with ESMTPS id a26sm24557462fac.2.2011.10.31.11.00.19
	(version=SSLv3 cipher=OTHER); Mon, 31 Oct 2011 11:00:20 -0700 (PDT)
Message-ID: <4EAEE2B9.2030209@gmail.com>
Date: Mon, 31 Oct 2011 19:02:33 +0100
From: Dawid <murkys@gmail.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:7.0.1) Gecko/20111001 Thunderbird/7.0.1
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Problem with dump-core after restoring VM
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

Sorry to bother you, but I have some problems with dumping core of HVM
domain after previously restoring it from a given save point. After
starting HVM domain from a scratch (i.e. xm/xl create ..) there is no
problem with dumping core. But when I decide to save VM and then restore
it, dump-core fails afterwards.

dom0: Debian Squeeze
hvm domain: Windows Xp (tried both 32bit and 64bit version)
Xen hypervisor: tried on machine with Xen 4.1 (dom0 kernel 3.0.0) and
also Xen 4.0 (dom0 kernel 2.6.32)

Using xm I got error (it's xmlrpclib.Fault exception in _run_cmd() at
xm/main.py):
Fault 2: "Failed to dump core: (1, 'Internal error', 'Failed to write
buffer (14 = Bad address)')"

Using new xl toolstack I got similar error:
xc: error: Failed to write buffer (14 = Bad address): Internal error
libxl: error: libxl.c:479:libxl_domain_core_dump core dumping domain 14
to ./dump.2: Bad address
core dump failed (rc=-3)

Doing `xm save -c` without stopping VM doesn't cause problem with
core-dump (well, it would be strange if it does), so it seems problem
exist only after restoring VM.

Regards,
David

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 11:23:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 11:23:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKwWL-0002Fd-PC; Mon, 31 Oct 2011 11:23:41 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKwV7-000236-Op
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 11:22:26 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-6.tower-182.messagelabs.com!1320085341!1411032!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 13937 invoked from network); 31 Oct 2011 18:22:22 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-6.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 31 Oct 2011 18:22:22 -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 2D9FC20F5;
	Mon, 31 Oct 2011 20:22:21 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 0C5FD20097; Mon, 31 Oct 2011 20:22:20 +0200 (EET)
Date: Mon, 31 Oct 2011 20:22:20 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: xen-devel@lists.xensource.com
Message-ID: <20111031182220.GZ12984@reaktio.net>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="bg08WKrSYDhXBjb5"
Content-Disposition: inline
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen@lists.fedoraproject.org
Subject: [Xen-devel] Xen 4.1.1 HVM guest cdrom trouble, lost interrupts,
	ata failed commands (frozen)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--bg08WKrSYDhXBjb5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hello,

I was testing Fedora 16 (rc2) Xen host, with included Xen 4.1.1 rpms 
and Linux 3.1.0 dom0 kernel. Fedora 16 PV domUs seem to work nicely. 

I noticed a problem with Fedora 16 Xen HVM guests though. 
The F16 guest kernel (Linux 3.1.0) fails with the qemu-dm emulated DVD-ROM drive.. 

Full HVM guest kernel dmesg attached to this email. 
See the end of this email for Xen cfgfile for the domain and some workarounds..

Important parts of the guest dmesg:

[    0.000000] Linux version 3.1.0-5.fc16.x86_64 (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: initrd=initrd.img console=ttyS0,38400 console=tty0 BOOT_IMAGE=vmlinuz 
<snip>
[    4.310149] ata2.00: ATAPI: QEMU DVD-ROM, 0.10.2, max UDMA/100
[    4.325107] ata1.00: ATA-7: QEMU HARDDISK, 0.10.2, max UDMA/100
[    4.339397] ata1.00: 62914560 sectors, multi 16: LBA48 
[    4.362818] ata1.00: configured for MWDMA2
[    4.373968] scsi 0:0:0:0: Direct-Access     ATA      QEMU HARDDISK    0.10 PQ: 0 ANSI: 5
[    4.495976] ata2.00: configured for MWDMA2
[    4.540361] sd 0:0:0:0: Attached scsi generic sg0 type 0
[    4.556311] sd 0:0:0:0: [sda] 62914560 512-byte logical blocks: (32.2 GB/30.0 GiB)
[    4.575201] sd 0:0:0:0: [sda] Write Protect is off
[    4.586948] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[    9.511381] ata2.00: qc timeout (cmd 0xa0)
[    9.514923] ata2.00: TEST_UNIT_READY failed (err_mask=0x4)
[    9.675770] ata2.00: configured for MWDMA2
[   14.680417] ata2.00: qc timeout (cmd 0xa0)
[   14.685010] ata2.00: TEST_UNIT_READY failed (err_mask=0x4)
[   14.690798] ata2.00: limiting speed to MWDMA2:PIO3
[   14.850811] ata2.00: configured for MWDMA2
[   19.855357] ata2.00: qc timeout (cmd 0xa0)
[   19.859931] ata2.00: TEST_UNIT_READY failed (err_mask=0x4)
[   19.865765] ata2.00: disabled
[   19.869676] ata2: soft resetting link
[   20.056857] ata2: EH complete
[   35.712153] ata1: lost interrupt (Status 0x50)
[   35.722381] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[   35.735437] ata1.00: failed command: READ DMA
[   35.745912] ata1.00: cmd c8/00:08:00:00:00/00:00:00:00:00/e0 tag 0 dma 4096 in
[   35.745913]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[   35.777373] ata1.00: status: { DRDY }
[   35.785709] ata1: soft resetting link
[   35.946815] ata1.00: configured for MWDMA2
[   35.955695] ata1.00: device reported invalid CHS sector 0
[   35.967512] ata1: EH complete
[   66.784177] ata1: lost interrupt (Status 0x50)
[   66.788709] ata1.00: limiting speed to MWDMA1:PIO2
[   66.793395] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[   66.799857] ata1.00: failed command: READ DMA
[   66.804193] ata1.00: cmd c8/00:08:00:00:00/00:00:00:00:00/e0 tag 0 dma 4096 in
[   66.804194]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[   66.818098] ata1.00: status: { DRDY }
[   66.822310] ata1: soft resetting link
[   66.981440] ata1.00: configured for MWDMA1
[   66.985550] ata1.00: device reported invalid CHS sector 0
[   66.990704] ata1: EH complete
[   97.760172] ata1: lost interrupt (Status 0x50)
[   97.765465] ata1.00: limiting speed to PIO2
[   97.770093] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[   97.777360] ata1.00: failed command: READ DMA
[   97.781823] ata1.00: cmd c8/00:08:00:00:00/00:00:00:00:00/e0 tag 0 dma 4096 in
[   97.781824]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[   97.795560] ata1.00: status: { DRDY }
[   97.799269] ata1: soft resetting link
[   97.957830] ata1.00: configured for PIO2
[   97.961338] ata1.00: device reported invalid CHS sector 0
[   97.965874] ata1: EH complete
[  128.736132] ata1: lost interrupt (Status 0x58)
[  128.830108] ata1.00: limiting speed to PIO1
[  128.834274] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[  128.840650] ata1.00: failed command: READ MULTIPLE
[  128.845289] ata1.00: cmd c4/00:08:00:00:00/00:00:00:00:00/e0 tag 0 pio 4096 in
[  128.845291]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  128.859072] ata1.00: status: { DRDY }
[  128.863253] ata1: soft resetting link
[  129.022319] ata1.00: configured for PIO1
[  129.026279] ata1.00: device reported invalid CHS sector 0
[  129.031398] ata1: EH complete
[  159.712158] ata1: lost interrupt (Status 0x58)
[  159.802324] ata1.00: limiting speed to PIO0
[  159.806496] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[  159.812888] ata1.00: failed command: READ MULTIPLE
[  159.817503] ata1.00: cmd c4/00:08:00:00:00/00:00:00:00:00/e0 tag 0 pio 4096 in
[  159.817505]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  159.831339] ata1.00: status: { DRDY }
[  159.835482] ata1: soft resetting link
[  159.994295] ata1.00: configured for PIO0
[  159.998279] ata1.00: device reported invalid CHS sector 0
[  160.003401] ata1: EH complete
[  190.816215] ata1: lost interrupt (Status 0x58)
[  190.898787] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[  190.904509] ata1.00: failed command: READ MULTIPLE
[  190.908616] ata1.00: cmd c4/00:08:00:00:00/00:00:00:00:00/e0 tag 0 pio 4096 in
[  190.908617]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  190.920911] ata1.00: status: { DRDY }
[  190.924608] ata1: soft resetting link
[  191.082728] ata1.00: configured for PIO0
[  191.086575] ata1.00: device reported invalid CHS sector 0
[  191.091675] sd 0:0:0:0: [sda]  Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[  191.099098] sd 0:0:0:0: [sda]  Sense Key : Aborted Command [current] [descriptor]
[  191.108415] Descriptor sense data with sense descriptors (in hex):
[  191.114713]         72 0b 00 00 00 00 00 0c 00 0a 80 00 00 00 00 00 
[  191.130002]         00 00 00 00 
[  191.136199] sd 0:0:0:0: [sda]  Add. Sense: No additional sense information
[  191.143574] sd 0:0:0:0: [sda] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00
[  191.157045] end_request: I/O error, dev sda, sector 0
[  191.161675] Buffer I/O error on device sda, logical block 0
[  191.166372] ata1: EH complete
[  221.792133] ata1: lost interrupt (Status 0x58)
[  221.875310] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[  221.882176] ata1.00: failed command: READ MULTIPLE
[  221.886834] ata1.00: cmd c4/00:08:00:00:00/00:00:00:00:00/e0 tag 0 pio 4096 in
[  221.886836]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  221.901648] ata1.00: status: { DRDY }
[  221.906550] ata1: soft resetting link
[  222.124783] ata1.00: configured for PIO0
[  222.127744] ata1.00: device reported invalid CHS sector 0
[  222.132141] ata1: EH complete


/etc/xen/<vm> cfgfile:

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:3e:04: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'

I'm using "xm create" to start the HVM guest.
I noticed I can workaround the problem with the following methods:

- Specify "xen_platform_pci=1" in the domain cfgfile. The emulated dvdrom drive works then,
  but there are other problems (nic doesn't work - the mac address is all empty and the installer fails).
  Guest dmesg from this case also attached to this email.

- Upgrade Xen hypervisor to 4.1.2 (rpms available in f16 updates-testing).
  Emulated dvdrom works then with the original hvm domain cfgfile above.
  guest kernel dmesg for this working method attached aswell.

The following guest kernel options didn't help with the dvdrom problem:
- libata.dma=0
- pci=nocrs


Is this a known problem? Any proper workarounds for Xen 4.1.1,
or should everyone upgrade to Xen 4.1.2 ?


Info about the Fedora 16 dom0 host:

# uname -a
Linux f16dom0.localdomain 3.1.0-5.fc16.x86_64 #1 SMP Thu Oct 27 03:46:50 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

# rpm -qa|grep xen
xen-hypervisor-4.1.1-8.fc16.x86_64
xen-libs-4.1.1-8.fc16.x86_64
xen-runtime-4.1.1-8.fc16.x86_64
xen-4.1.1-8.fc16.x86_64
xen-licenses-4.1.1-8.fc16.x86_64


Thanks,

-- Pasi


--bg08WKrSYDhXBjb5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename="xen-4.1.1-f16test64hvm-linux-3.1.0-platform-pci-disabled.log"

[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.1.0-5.fc16.x86_64 (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: initrd=initrd.img console=ttyS0,38400 console=tty0 BOOT_IMAGE=vmlinuz 
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009e000 (usable)
[    0.000000]  BIOS-e820: 000000000009e000 - 00000000000a0000 (reserved)
[    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
[    0.000000]  BIOS-e820: 0000000000100000 - 0000000040000000 (usable)
[    0.000000]  BIOS-e820: 00000000fc000000 - 0000000100000000 (reserved)
[    0.000000] Using x86 segment limits to approximate NX protection
[    0.000000] DMI 2.4 present.
[    0.000000] Hypervisor detected: Xen HVM
[    0.000000] Xen version 4.1.
[    0.000000] Xen Platform PCI: unrecognised magic value
[    0.000000] No AGP bridge found
[    0.000000] last_pfn = 0x40000 max_arch_pfn = 0x400000000
[    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106
[    0.000000] found SMP MP-table at [ffff8800000fbc70] fbc70
[    0.000000] init_memory_mapping: 0000000000000000-0000000040000000
[    0.000000] RAMDISK: 37e7a000 - 3ffdf000
[    0.000000] ACPI: RSDP 00000000000ea020 00024 (v02    Xen)
[    0.000000] ACPI: XSDT 00000000fc0134b0 00034 (v01    Xen      HVM 00000000 HVML 00000000)
[    0.000000] ACPI: FACP 00000000fc0132d0 000F4 (v04    Xen      HVM 00000000 HVML 00000000)
[    0.000000] ACPI: DSDT 00000000fc003440 0FE05 (v02    Xen      HVM 00000000 INTL 20100528)
[    0.000000] ACPI: FACS 00000000fc003400 00040
[    0.000000] ACPI: APIC 00000000fc0133d0 000D8 (v02    Xen      HVM 00000000 HVML 00000000)
[    0.000000] No NUMA configuration found
[    0.000000] Faking a node at 0000000000000000-0000000040000000
[    0.000000] Initmem setup node 0 0000000000000000-0000000040000000
[    0.000000]   NODE_DATA [000000003ffec000 - 000000003fffffff]
[    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 -> 0x00040000
[    0.000000] ACPI: PM-Timer IO Port: 0xb008
[    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] disabled)
[    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, GSI 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 level)
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 low level)
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 low level)
[    0.000000] Using ACPI (MADT) for SMP configuration information
[    0.000000] SMP: Allowing 15 CPUs, 14 hotplug CPUs
[    0.000000] PM: Registered nosave memory: 000000000009e000 - 00000000000a0000
[    0.000000] PM: Registered nosave memory: 00000000000a0000 - 00000000000e0000
[    0.000000] PM: Registered nosave memory: 00000000000e0000 - 0000000000100000
[    0.000000] Allocating PCI resources starting at 40000000 (gap: 40000000:bc000000)
[    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 @ffff880037c00000 s81024 r8192 d21376 u131072
[    0.000000] Built 1 zonelists in Node order, mobility grouping on.  Total pages: 257929
[    0.000000] Policy zone: DMA32
[    0.000000] Kernel command line: initrd=initrd.img console=ttyS0,38400 console=tty0 BOOT_IMAGE=vmlinuz 
[    0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)
[    0.000000] Checking aperture...
[    0.000000] No AGP bridge found
[    0.000000] Memory: 883240k/1048576k available (4867k kernel code, 456k absent, 164880k reserved, 6782k data, 940k init)
[    0.000000] SLUB: Genslabs=15, HWalign=64, Order=0-3, MinObjects=0, CPUs=15, Nodes=1
[    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] Console: colour VGA+ 80x25
[    0.000000] console [tty0] enabled
[    0.000000] console [ttyS0] enabled
[    0.000000] allocated 8388608 bytes of page_cgroup
[    0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
[    0.000000] Detected 2677.276 MHz processor.
[    0.004999] Calibrating delay loop (skipped), value calculated using timer frequency.. 5354.55 BogoMIPS (lpj=2677276)
[    0.014003] pid_max: default: 32768 minimum: 301
[    0.019036] Security Framework initialized
[    0.023010] SELinux:  Initializing.
[    0.027198] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
[    0.034258] Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
[    0.040108] Mount-cache hash table entries: 256
[    0.045162] Initializing cgroup subsys cpuacct
[    0.049006] Initializing cgroup subsys memory
[    0.058038] Initializing cgroup subsys devices
[    0.078003] Initializing cgroup subsys freezer
[    0.122002] Initializing cgroup subsys net_cls
[    0.131996] Initializing cgroup subsys blkio
[    0.141009] Initializing cgroup subsys perf_event
[    0.153114] CPU: Physical Processor ID: 0
[    0.161990] CPU: Processor Core ID: 0
[    0.172992] mce: CPU supports 9 MCE banks
[    0.187024] SMP alternatives: switching to UP code
[    0.207887] ACPI: Core revision 20110623
[    0.231609] ftrace: allocating 25204 entries in 99 pages
[    0.279972] Not enabling x2apic, Intr-remapping init failed.
[    0.297970] Switched APIC routing to physical flat.
[    0.311246] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=0 pin2=0
[    0.332335] CPU0: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz stepping 05
[    0.352990] installing Xen timer for CPU 0
[    0.358056] Performance Events: unsupported p6 CPU model 37 no PMU driver, software events only.
[    0.366988] NMI watchdog disabled (cpu0): hardware events not enabled
[    0.367999] Brought up 1 CPUs
[    0.368967] Total of 1 processors activated (5354.55 BogoMIPS).
[    0.374024] devtmpfs: initialized
[    0.412971] atomic64 test passed for x86-64 platform with CX8 and with SSE
[    0.414011] RTC time: 17:45:37, date: 10/31/11
[    0.415022] NET: Registered protocol family 16
[    0.418010] ACPI: bus type pci registered
[    0.421960] PCI: Using configuration type 1 for base access
[    0.437115] bio: create slab <bio-0> at 0
[    0.438093] ACPI: Added _OSI(Module Device)
[    0.438963] ACPI: Added _OSI(Processor Device)
[    0.439967] ACPI: Added _OSI(3.0 _SCP Extensions)
[    0.440974] ACPI: Added _OSI(Processor Aggregator Device)
[    0.519054] ACPI: Interpreter enabled
[    0.519951] ACPI: (supports S0 S3 S4 S5)
[    0.524951] ACPI: Using IOAPIC for interrupt routing
[    1.096959] ACPI: No dock devices found.
[    1.097861] HEST: Table not found.
[    1.098862] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
[    1.099943] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[    1.100988] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7]
[    1.101860] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff]
[    1.102862] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x000bffff]
[    1.103860] pci_root PNP0A03:00: host bridge window [mem 0xf0000000-0xfbffffff]
[    1.144922] * Found PM-Timer Bug on the chipset. Due to workarounds for a bug,
[    1.144923] * this clock source is slow. Consider trying other clock sources
[    1.154850] pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PIIX4 ACPI
[    1.185924]  pci0000:00: Unable to request _OSC control (_OSC support mask: 0x1e)
[    1.884892] ACPI: PCI Interrupt Link [LNKA] (IRQs *5 10 11)
[    1.890929] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
[    1.896927] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
[    1.902931] ACPI: PCI Interrupt Link [LNKD] (IRQs *5 10 11)
[    1.908856] xen/balloon: Initialising balloon driver.
[    1.909736] last_pfn = 0x40000 max_arch_pfn = 0x400000000
[    1.910751] xen-balloon: Initialising balloon driver.
[    1.911877] vgaarb: device added: PCI:0000:00:02.0,decodes=io+mem,owns=io+mem,locks=none
[    1.912734] vgaarb: loaded
[    1.913733] vgaarb: bridge control possible 0000:00:02.0
[    1.914821] SCSI subsystem initialized
[    1.915855] usbcore: registered new interface driver usbfs
[    1.916752] usbcore: registered new interface driver hub
[    1.917762] usbcore: registered new device driver usb
[    1.918801] PCI: Using ACPI for IRQ routing
[    1.921776] NetLabel: Initializing
[    1.922732] NetLabel:  domain hash size = 128
[    1.923731] NetLabel:  protocols = UNLABELED CIPSOv4
[    1.924747] NetLabel:  unlabeled traffic allowed by default
[    1.925738] Switching to clocksource xen
[    1.927071] Switched to NOHz mode on CPU #0
[    1.944150] pnp: PnP ACPI init
[    1.950692] ACPI: bus type pnp registered
[    1.968745] system 00:00: [mem 0x00000000-0x0009ffff] could not be reserved
[    2.009903] system 00:02: [io  0x10c0-0x1141] has been reserved
[    2.020115] system 00:02: [io  0xb044-0xb047] has been reserved
[    2.032398] system 00:03: [io  0x08a0-0x08a3] has been reserved
[    2.046965] system 00:03: [io  0x0cc0-0x0ccf] has been reserved
[    2.060746] system 00:03: [io  0x04d0-0x04d1] has been reserved
[    2.132279] pnp: PnP ACPI: found 12 devices
[    2.143196] ACPI: ACPI bus type pnp unregistered
[    2.168095] NET: Registered protocol family 2
[    2.180174] IP route cache hash table entries: 32768 (order: 6, 262144 bytes)
[    2.199948] TCP established hash table entries: 131072 (order: 9, 2097152 bytes)
[    2.223886] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
[    2.240895] TCP: Hash tables configured (established 131072 bind 65536)
[    2.251707] TCP reno registered
[    2.257377] UDP hash table entries: 512 (order: 2, 16384 bytes)
[    2.271814] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[    2.292031] NET: Registered protocol family 1
[    2.296744] pci 0000:00:00.0: Limiting direct PCI/PCI transfers
[    2.307567] pci 0000:00:01.0: PIIX3: Enabling Passive Release
[    2.321092] pci 0000:00:01.0: Activating ISA DMA hang workarounds
[    2.337035] Unpacking initramfs...
[    2.994473] Freeing initrd memory: 132500k freed
[    3.031082] alg: No test for __gcm-aes-aesni (__driver-gcm-aes-aesni)
[    3.036743] audit: initializing netlink socket (disabled)
[    3.041250] type=2000 audit(1320083141.268:1): initialized
[    3.069999] HugeTLB registered 2 MB page size, pre-allocated 0 pages
[    3.081358] VFS: Disk quotas dquot_6.5.2
[    3.085050] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    3.090701] msgmni has been set to 1983
[    3.094445] alg: No test for stdrng (krng)
[    3.098010] NET: Registered protocol family 38
[    3.107373] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)
[    3.123398] io scheduler noop registered
[    3.132300] io scheduler deadline registered
[    3.143504] io scheduler cfq registered (default)
[    3.154997] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
[    3.168358] pciehp: PCI Express Hot Plug Controller Driver version: 0.4
[    3.186729] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
[    3.201997] acpiphp: Slot [0] registered
[    3.212613] acpiphp: Slot [1] registered
[    3.227042] acpiphp: Slot [2] registered
[    3.234824] acpiphp: Slot [3] registered
[    3.243333] acpiphp: Slot [4] registered
[    3.254169] acpiphp: Slot [5] registered
[    3.264412] acpiphp: Slot [6] registered
[    3.278546] acpiphp: Slot [7] registered
[    3.288234] acpiphp: Slot [8] registered
[    3.299249] acpiphp: Slot [9] registered
[    3.309300] acpiphp: Slot [10] registered
[    3.320623] acpiphp: Slot [11] registered
[    3.329553] acpiphp: Slot [12] registered
[    3.340383] acpiphp: Slot [13] registered
[    3.351436] acpiphp: Slot [14] registered
[    3.371532] acpiphp: Slot [15] registered
[    3.383484] acpiphp: Slot [16] registered
[    3.391217] acpiphp: Slot [17] registered
[    3.400109] acpiphp: Slot [18] registered
[    3.410752] acpiphp: Slot [19] registered
[    3.418563] acpiphp: Slot [20] registered
[    3.427333] acpiphp: Slot [21] registered
[    3.435531] acpiphp: Slot [22] registered
[    3.447844] acpiphp: Slot [23] registered
[    3.458886] acpiphp: Slot [24] registered
[    3.468774] acpiphp: Slot [25] registered
[    3.480989] acpiphp: Slot [26] registered
[    3.491224] acpiphp: Slot [27] registered
[    3.508879] acpiphp: Slot [28] registered
[    3.518513] acpiphp: Slot [29] registered
[    3.534696] acpiphp: Slot [30] registered
[    3.549822] acpiphp: Slot [31] registered
[    3.560227] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
[    3.574537] ACPI: Power Button [PWRF]
[    3.586151] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
[    3.602954] ACPI: Sleep Button [SLPF]
[    3.676678] ERST: Table is not found!
[    3.683875] GHES: HEST is not enabled!
[    3.687897] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    3.750685] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    3.793768] 00:0a: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    3.805453] Non-volatile memory driver v1.3
[    3.811376] Linux agpgart interface v0.103
[    3.817834] loop: module loaded
[    3.827537] scsi0 : ata_piix
[    3.832212] scsi1 : ata_piix
[    3.836293] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc120 irq 14
[    3.856704] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc128 irq 15
[    3.872777] Fixed MDIO Bus: probed
[    3.884228] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    3.899724] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    3.917226] uhci_hcd: USB Universal Host Controller Interface driver
[    3.933624] uhci_hcd 0000:00:01.2: PCI INT D -> GSI 23 (level, low) -> IRQ 23
[    3.949714] uhci_hcd 0000:00:01.2: UHCI Host Controller
[    3.965097] uhci_hcd 0000:00:01.2: new USB bus registered, assigned bus number 1
[    3.988778] uhci_hcd 0000:00:01.2: irq 23, io base 0x0000c100
[    4.009517] usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
[    4.027023] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    4.046997] usb usb1: Product: UHCI Host Controller
[    4.063419] usb usb1: Manufacturer: Linux 3.1.0-5.fc16.x86_64 uhci_hcd
[    4.076305] usb usb1: SerialNumber: 0000:00:01.2
[    4.091799] Refined TSC clocksource calibration: 2677.185 MHz.
[    4.105911] hub 1-0:1.0: USB hub found
[    4.115835] hub 1-0:1.0: 2 ports detected
[    4.147486] usbcore: registered new interface driver usbserial
[    4.167002] USB Serial support registered for generic
[    4.179996] usbcore: registered new interface driver usbserial_generic
[    4.202861] usbserial: USB Serial Driver core
[    4.211934] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0x60,0x64 irq 1,12
[    4.233258] serio: i8042 KBD port at 0x60,0x64 irq 1
[    4.241291] serio: i8042 AUX port at 0x60,0x64 irq 12
[    4.255074] mousedev: PS/2 mouse device common for all mice
[    4.275424] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input2
[    4.310149] ata2.00: ATAPI: QEMU DVD-ROM, 0.10.2, max UDMA/100
[    4.325107] ata1.00: ATA-7: QEMU HARDDISK, 0.10.2, max UDMA/100
[    4.339397] ata1.00: 62914560 sectors, multi 16: LBA48 
[    4.362818] ata1.00: configured for MWDMA2
[    4.373968] scsi 0:0:0:0: Direct-Access     ATA      QEMU HARDDISK    0.10 PQ: 0 ANSI: 5
[    4.393304] rtc_cmos 00:05: rtc core: registered rtc_cmos as rtc0
[    4.408850] rtc0: alarms up to one day, 114 bytes nvram
[    4.423453] device-mapper: uevent: version 1.0.3
[    4.436554] device-mapper: ioctl: 4.21.0-ioctl (2011-07-06) initialised: dm-devel@redhat.com
[    4.474247] usb 1-2: new full speed USB device number 2 using uhci_hcd
[    4.495976] ata2.00: configured for MWDMA2
[    4.511333] cpuidle: using governor ladder
[    4.519271] cpuidle: using governor menu
[    4.529126] EFI Variables Facility v0.08 2004-May-17
[    4.540361] sd 0:0:0:0: Attached scsi generic sg0 type 0
[    4.556311] sd 0:0:0:0: [sda] 62914560 512-byte logical blocks: (32.2 GB/30.0 GiB)
[    4.575201] sd 0:0:0:0: [sda] Write Protect is off
[    4.586948] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[    4.612829] usbcore: registered new interface driver usbhid
[    4.628550] usbhid: USB HID core driver
[    4.637882] ip_tables: (C) 2000-2006 Netfilter Core Team
[    4.651005] TCP cubic registered
[    4.658941] Initializing XFRM netlink socket
[    4.670660] NET: Registered protocol family 10
[    4.690433] Mobile IPv6
[    4.693485] NET: Registered protocol family 17
[    4.698486] Registering the dns_resolver key type
[    4.703788] registered taskstats version 1
[    4.711313] IMA: No TPM chip found, activating TPM-bypass!
[    4.719240]   Magic number: 15:394:796
[    4.723704] rtc_cmos 00:05: setting system clock to 2011-10-31 17:45:40 UTC (1320083140)
[    4.735181] Initializing network drop monitor service
[    4.939838] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input3
[    7.954331] usb 1-2: New USB device found, idVendor=0627, idProduct=0001
[    7.960550] usb 1-2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    7.967135] usb 1-2: Product: QEMU USB Tablet
[    7.971435] usb 1-2: Manufacturer: QEMU 0.10.2
[    7.975858] usb 1-2: SerialNumber: 1
[    9.511381] ata2.00: qc timeout (cmd 0xa0)
[    9.514923] ata2.00: TEST_UNIT_READY failed (err_mask=0x4)
[    9.675770] ata2.00: configured for MWDMA2
[   10.204455] input: QEMU 0.10.2 QEMU USB Tablet as /devices/pci0000:00/0000:00:01.2/usb1/1-2/1-2:1.0/input/input4
[   10.211936] 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
[   14.680417] ata2.00: qc timeout (cmd 0xa0)
[   14.685010] ata2.00: TEST_UNIT_READY failed (err_mask=0x4)
[   14.690798] ata2.00: limiting speed to MWDMA2:PIO3
[   14.850811] ata2.00: configured for MWDMA2
[   19.855357] ata2.00: qc timeout (cmd 0xa0)
[   19.859931] ata2.00: TEST_UNIT_READY failed (err_mask=0x4)
[   19.865765] ata2.00: disabled
[   19.869676] ata2: soft resetting link
[   20.056857] ata2: EH complete
[   35.712153] ata1: lost interrupt (Status 0x50)
[   35.722381] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[   35.735437] ata1.00: failed command: READ DMA
[   35.745912] ata1.00: cmd c8/00:08:00:00:00/00:00:00:00:00/e0 tag 0 dma 4096 in
[   35.745913]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[   35.777373] ata1.00: status: { DRDY }
[   35.785709] ata1: soft resetting link
[   35.946815] ata1.00: configured for MWDMA2
[   35.955695] ata1.00: device reported invalid CHS sector 0
[   35.967512] ata1: EH complete
[   66.784177] ata1: lost interrupt (Status 0x50)
[   66.788709] ata1.00: limiting speed to MWDMA1:PIO2
[   66.793395] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[   66.799857] ata1.00: failed command: READ DMA
[   66.804193] ata1.00: cmd c8/00:08:00:00:00/00:00:00:00:00/e0 tag 0 dma 4096 in
[   66.804194]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[   66.818098] ata1.00: status: { DRDY }
[   66.822310] ata1: soft resetting link
[   66.981440] ata1.00: configured for MWDMA1
[   66.985550] ata1.00: device reported invalid CHS sector 0
[   66.990704] ata1: EH complete
[   97.760172] ata1: lost interrupt (Status 0x50)
[   97.765465] ata1.00: limiting speed to PIO2
[   97.770093] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[   97.777360] ata1.00: failed command: READ DMA
[   97.781823] ata1.00: cmd c8/00:08:00:00:00/00:00:00:00:00/e0 tag 0 dma 4096 in
[   97.781824]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[   97.795560] ata1.00: status: { DRDY }
[   97.799269] ata1: soft resetting link
[   97.957830] ata1.00: configured for PIO2
[   97.961338] ata1.00: device reported invalid CHS sector 0
[   97.965874] ata1: EH complete
[  128.736132] ata1: lost interrupt (Status 0x58)
[  128.830108] ata1.00: limiting speed to PIO1
[  128.834274] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[  128.840650] ata1.00: failed command: READ MULTIPLE
[  128.845289] ata1.00: cmd c4/00:08:00:00:00/00:00:00:00:00/e0 tag 0 pio 4096 in
[  128.845291]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  128.859072] ata1.00: status: { DRDY }
[  128.863253] ata1: soft resetting link
[  129.022319] ata1.00: configured for PIO1
[  129.026279] ata1.00: device reported invalid CHS sector 0
[  129.031398] ata1: EH complete
[  159.712158] ata1: lost interrupt (Status 0x58)
[  159.802324] ata1.00: limiting speed to PIO0
[  159.806496] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[  159.812888] ata1.00: failed command: READ MULTIPLE
[  159.817503] ata1.00: cmd c4/00:08:00:00:00/00:00:00:00:00/e0 tag 0 pio 4096 in
[  159.817505]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  159.831339] ata1.00: status: { DRDY }
[  159.835482] ata1: soft resetting link
[  159.994295] ata1.00: configured for PIO0
[  159.998279] ata1.00: device reported invalid CHS sector 0
[  160.003401] ata1: EH complete
[  190.816215] ata1: lost interrupt (Status 0x58)
[  190.898787] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[  190.904509] ata1.00: failed command: READ MULTIPLE
[  190.908616] ata1.00: cmd c4/00:08:00:00:00/00:00:00:00:00/e0 tag 0 pio 4096 in
[  190.908617]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  190.920911] ata1.00: status: { DRDY }
[  190.924608] ata1: soft resetting link
[  191.082728] ata1.00: configured for PIO0
[  191.086575] ata1.00: device reported invalid CHS sector 0
[  191.091675] sd 0:0:0:0: [sda]  Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[  191.099098] sd 0:0:0:0: [sda]  Sense Key : Aborted Command [current] [descriptor]
[  191.108415] Descriptor sense data with sense descriptors (in hex):
[  191.114713]         72 0b 00 00 00 00 00 0c 00 0a 80 00 00 00 00 00 
[  191.130002]         00 00 00 00 
[  191.136199] sd 0:0:0:0: [sda]  Add. Sense: No additional sense information
[  191.143574] sd 0:0:0:0: [sda] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00
[  191.157045] end_request: I/O error, dev sda, sector 0
[  191.161675] Buffer I/O error on device sda, logical block 0
[  191.166372] ata1: EH complete
[  221.792133] ata1: lost interrupt (Status 0x58)
[  221.875310] ata1.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
[  221.882176] ata1.00: failed command: READ MULTIPLE
[  221.886834] ata1.00: cmd c4/00:08:00:00:00/00:00:00:00:00/e0 tag 0 pio 4096 in
[  221.886836]          res 40/00:00:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[  221.901648] ata1.00: status: { DRDY }
[  221.906550] ata1: soft resetting link
[  222.124783] ata1.00: configured for PIO0
[  222.127744] ata1.00: device reported invalid CHS sector 0
[  222.132141] ata1: EH complete

--bg08WKrSYDhXBjb5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename="xen-4.1.1-f16test64hvm-linux-3.1.0-platform-pci-enabled.log"

[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.1.0-5.fc16.x86_64 (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: initrd=initrd.img console=ttyS0,38400 console=tty0 BOOT_IMAGE=vmlinuz 
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009e000 (usable)
[    0.000000]  BIOS-e820: 000000000009e000 - 00000000000a0000 (reserved)
[    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
[    0.000000]  BIOS-e820: 0000000000100000 - 0000000040000000 (usable)
[    0.000000]  BIOS-e820: 00000000fc000000 - 0000000100000000 (reserved)
[    0.000000] Using x86 segment limits to approximate NX protection
[    0.000000] DMI 2.4 present.
[    0.000000] Hypervisor detected: Xen HVM
[    0.000000] Xen version 4.1.
[    0.000000] Netfront and the Xen platform PCI driver have been compiled for this kernel: unplug emulated NICs.
[    0.000000] Blkfront and the Xen platform PCI driver have been compiled 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= kernel command line option
[    0.000000] No AGP bridge found
[    0.000000] last_pfn = 0x40000 max_arch_pfn = 0x400000000
[    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106
[    0.000000] found SMP MP-table at [ffff8800000fbc70] fbc70
[    0.000000] init_memory_mapping: 0000000000000000-0000000040000000
[    0.000000] RAMDISK: 37e7a000 - 3ffdf000
[    0.000000] ACPI: RSDP 00000000000ea020 00024 (v02    Xen)
[    0.000000] ACPI: XSDT 00000000fc0134b0 00034 (v01    Xen      HVM 00000000 HVML 00000000)
[    0.000000] ACPI: FACP 00000000fc0132d0 000F4 (v04    Xen      HVM 00000000 HVML 00000000)
[    0.000000] ACPI: DSDT 00000000fc003440 0FE05 (v02    Xen      HVM 00000000 INTL 20100528)
[    0.000000] ACPI: FACS 00000000fc003400 00040
[    0.000000] ACPI: APIC 00000000fc0133d0 000D8 (v02    Xen      HVM 00000000 HVML 00000000)
[    0.000000] No NUMA configuration found
[    0.000000] Faking a node at 0000000000000000-0000000040000000
[    0.000000] Initmem setup node 0 0000000000000000-0000000040000000
[    0.000000]   NODE_DATA [000000003ffec000 - 000000003fffffff]
[    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 -> 0x00040000
[    0.000000] ACPI: PM-Timer IO Port: 0xb008
[    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] disabled)
[    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, GSI 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 level)
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 low level)
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 low level)
[    0.000000] Using ACPI (MADT) for SMP configuration information
[    0.000000] SMP: Allowing 15 CPUs, 14 hotplug CPUs
[    0.000000] PM: Registered nosave memory: 000000000009e000 - 00000000000a0000
[    0.000000] PM: Registered nosave memory: 00000000000a0000 - 00000000000e0000
[    0.000000] PM: Registered nosave memory: 00000000000e0000 - 0000000000100000
[    0.000000] Allocating PCI resources starting at 40000000 (gap: 40000000:bc000000)
[    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 @ffff880037c00000 s81024 r8192 d21376 u131072
[    0.000000] Built 1 zonelists in Node order, mobility grouping on.  Total pages: 257929
[    0.000000] Policy zone: DMA32
[    0.000000] Kernel command line: initrd=initrd.img console=ttyS0,38400 console=tty0 BOOT_IMAGE=vmlinuz 
[    0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)
[    0.000000] Checking aperture...
[    0.000000] No AGP bridge found
[    0.000000] Memory: 883240k/1048576k available (4867k kernel code, 456k absent, 164880k reserved, 6782k data, 940k init)
[    0.000000] SLUB: Genslabs=15, HWalign=64, Order=0-3, MinObjects=0, CPUs=15, Nodes=1
[    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] Console: colour VGA+ 80x25
[    0.000000] console [tty0] enabled
[    0.000000] console [ttyS0] enabled
[    0.000000] allocated 8388608 bytes of page_cgroup
[    0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
[    0.000000] Detected 2677.276 MHz processor.
[    0.004999] Calibrating delay loop (skipped), value calculated using timer frequency.. 5354.55 BogoMIPS (lpj=2677276)
[    0.013004] pid_max: default: 32768 minimum: 301
[    0.017034] Security Framework initialized
[    0.020012] SELinux:  Initializing.
[    0.024185] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
[    0.031268] Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
[    0.038112] Mount-cache hash table entries: 256
[    0.044180] Initializing cgroup subsys cpuacct
[    0.049006] Initializing cgroup subsys memory
[    0.053014] Initializing cgroup subsys devices
[    0.056999] Initializing cgroup subsys freezer
[    0.062000] Initializing cgroup subsys net_cls
[    0.066999] Initializing cgroup subsys blkio
[    0.071004] Initializing cgroup subsys perf_event
[    0.076071] CPU: Physical Processor ID: 0
[    0.079997] CPU: Processor Core ID: 0
[    0.083998] mce: CPU supports 9 MCE banks
[    0.089138] SMP alternatives: switching to UP code
[    0.101620] ACPI: Core revision 20110623
[    0.113856] ftrace: allocating 25204 entries in 99 pages
[    0.148567] Not enabling x2apic, Intr-remapping init failed.
[    0.153989] Switched APIC routing to physical flat.
[    0.161120] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=0 pin2=0
[    0.176622] CPU0: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz stepping 05
[    0.184012] installing Xen timer for CPU 0
[    0.187040] Performance Events: unsupported p6 CPU model 37 no PMU driver, software events only.
[    0.194059] NMI watchdog disabled (cpu0): hardware events not enabled
[    0.195003] Brought up 1 CPUs
[    0.195987] Total of 1 processors activated (5354.55 BogoMIPS).
[    0.199117] devtmpfs: initialized
[    0.230082] atomic64 test passed for x86-64 platform with CX8 and with SSE
[    0.231035] RTC time: 18:20:40, date: 10/31/11
[    0.232074] NET: Registered protocol family 16
[    0.235115] ACPI: bus type pci registered
[    0.239989] PCI: Using configuration type 1 for base access
[    0.248000] bio: create slab <bio-0> at 0
[    0.249120] ACPI: Added _OSI(Module Device)
[    0.249988] ACPI: Added _OSI(Processor Device)
[    0.251019] ACPI: Added _OSI(3.0 _SCP Extensions)
[    0.251988] ACPI: Added _OSI(Processor Aggregator Device)
[    0.337021] ACPI: Interpreter enabled
[    0.337978] ACPI: (supports S0 S3 S4 S5)
[    0.342983] ACPI: Using IOAPIC for interrupt routing
[    0.886914] ACPI: No dock devices found.
[    0.887893] HEST: Table not found.
[    0.888895] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
[    0.889977] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[    0.891032] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7]
[    0.891890] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff]
[    0.892890] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x000bffff]
[    0.893889] pci_root PNP0A03:00: host bridge window [mem 0xf0000000-0xfbffffff]
[    0.946878] * Found PM-Timer Bug on the chipset. Due to workarounds for a bug,
[    0.946879] * this clock source is slow. Consider trying other clock sources
[    0.959005] pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PIIX4 ACPI
[    1.012889]  pci0000:00: Unable to request _OSC control (_OSC support mask: 0x1e)
[    1.906831] ACPI: PCI Interrupt Link [LNKA] (IRQs *5 10 11)
[    1.913047] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
[    1.918965] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
[    1.925873] ACPI: PCI Interrupt Link [LNKD] (IRQs *5 10 11)
[    1.931973] xen/balloon: Initialising balloon driver.
[    1.932738] last_pfn = 0x40000 max_arch_pfn = 0x400000000
[    1.933757] xen-balloon: Initialising balloon driver.
[    1.934926] vgaarb: device added: PCI:0000:00:02.0,decodes=io+mem,owns=io+mem,locks=none
[    1.935740] vgaarb: loaded
[    1.936731] vgaarb: bridge control possible 0000:00:02.0
[    1.937896] SCSI subsystem initialized
[    1.938927] usbcore: registered new interface driver usbfs
[    1.939771] usbcore: registered new interface driver hub
[    1.940799] usbcore: registered new device driver usb
[    1.941890] PCI: Using ACPI for IRQ routing
[    1.945843] NetLabel: Initializing
[    1.946732] NetLabel:  domain hash size = 128
[    1.947734] NetLabel:  protocols = UNLABELED CIPSOv4
[    1.948768] NetLabel:  unlabeled traffic allowed by default
[    1.949747] Switching to clocksource xen
[    1.951085] Switched to NOHz mode on CPU #0
[    1.973062] pnp: PnP ACPI init
[    1.980265] ACPI: bus type pnp registered
[    1.990358] system 00:00: [mem 0x00000000-0x0009ffff] could not be reserved
[    2.005868] system 00:02: [io  0x10c0-0x1141] has been reserved
[    2.019621] system 00:02: [io  0xb044-0xb047] has been reserved
[    2.035179] system 00:03: [io  0x08a0-0x08a3] has been reserved
[    2.054489] system 00:03: [io  0x0cc0-0x0ccf] has been reserved
[    2.070648] system 00:03: [io  0x04d0-0x04d1] has been reserved
[    2.145328] pnp: PnP ACPI: found 12 devices
[    2.156592] ACPI: ACPI bus type pnp unregistered
[    2.182889] NET: Registered protocol family 2
[    2.192696] IP route cache hash table entries: 32768 (order: 6, 262144 bytes)
[    2.222619] TCP established hash table entries: 131072 (order: 9, 2097152 bytes)
[    2.237754] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
[    2.252830] TCP: Hash tables configured (established 131072 bind 65536)
[    2.268252] TCP reno registered
[    2.282694] UDP hash table entries: 512 (order: 2, 16384 bytes)
[    2.305323] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[    2.314751] NET: Registered protocol family 1
[    2.327035] pci 0000:00:00.0: Limiting direct PCI/PCI transfers
[    2.340403] pci 0000:00:01.0: PIIX3: Enabling Passive Release
[    2.353106] pci 0000:00:01.0: Activating ISA DMA hang workarounds
[    2.368124] Unpacking initramfs...
[    3.000634] Freeing initrd memory: 132500k freed
[    3.037083] alg: No test for __gcm-aes-aesni (__driver-gcm-aes-aesni)
[    3.044131] audit: initializing netlink socket (disabled)
[    3.049789] type=2000 audit(1320085244.797:1): initialized
[    3.079237] HugeTLB registered 2 MB page size, pre-allocated 0 pages
[    3.092703] VFS: Disk quotas dquot_6.5.2
[    3.110961] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    3.122725] msgmni has been set to 1983
[    3.132377] alg: No test for stdrng (krng)
[    3.140344] NET: Registered protocol family 38
[    3.149876] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)
[    3.164511] io scheduler noop registered
[    3.174275] io scheduler deadline registered
[    3.184322] io scheduler cfq registered (default)
[    3.194993] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
[    3.214332] pciehp: PCI Express Hot Plug Controller Driver version: 0.4
[    3.229680] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
[    3.243454] acpiphp: Slot [0] registered
[    3.253341] acpiphp: Slot [1] registered
[    3.262621] acpiphp: Slot [2] registered
[    3.273661] acpiphp: Slot [3] registered
[    3.283254] acpiphp: Slot [4] registered
[    3.292918] acpiphp: Slot [5] registered
[    3.302207] acpiphp: Slot [6] registered
[    3.310836] acpiphp: Slot [7] registered
[    3.320223] acpiphp: Slot [8] registered
[    3.334559] acpiphp: Slot [9] registered
[    3.342859] acpiphp: Slot [10] registered
[    3.353368] acpiphp: Slot [11] registered
[    3.362397] acpiphp: Slot [12] registered
[    3.371935] acpiphp: Slot [13] registered
[    3.384052] acpiphp: Slot [14] registered
[    3.392590] acpiphp: Slot [15] registered
[    3.404644] acpiphp: Slot [16] registered
[    3.413333] acpiphp: Slot [17] registered
[    3.424608] acpiphp: Slot [18] registered
[    3.435636] acpiphp: Slot [19] registered
[    3.445201] acpiphp: Slot [20] registered
[    3.461498] acpiphp: Slot [21] registered
[    3.470781] acpiphp: Slot [22] registered
[    3.480989] acpiphp: Slot [23] registered
[    3.491360] acpiphp: Slot [24] registered
[    3.500789] acpiphp: Slot [25] registered
[    3.510470] acpiphp: Slot [26] registered
[    3.518468] acpiphp: Slot [27] registered
[    3.527290] acpiphp: Slot [28] registered
[    3.534022] acpiphp: Slot [29] registered
[    3.545699] acpiphp: Slot [30] registered
[    3.553786] acpiphp: Slot [31] registered
[    3.561598] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
[    3.579001] ACPI: Power Button [PWRF]
[    3.586183] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
[    3.598568] ACPI: Sleep Button [SLPF]
[    3.666534] ERST: Table is not found!
[    3.675525] GHES: HEST is not enabled!
[    3.684103] xen-platform-pci 0000:00:03.0: PCI INT A -> GSI 28 (level, low) -> IRQ 28
[    3.709467] Grant table initialized
[    3.720211] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    3.775440] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    3.824734] 00:0a: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    3.839434] Non-volatile memory driver v1.3
[    3.849378] Linux agpgart interface v0.103
[    3.860863] loop: module loaded
[    3.870446] scsi0 : ata_piix
[    3.878405] scsi1 : ata_piix
[    3.885877] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc220 irq 14
[    3.900343] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc228 irq 15
[    3.917546] Fixed MDIO Bus: probed
[    3.925950] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    3.940198] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    3.952266] uhci_hcd: USB Universal Host Controller Interface driver
[    3.973531] uhci_hcd 0000:00:01.2: PCI INT D -> GSI 23 (level, low) -> IRQ 23
[    3.989527] uhci_hcd 0000:00:01.2: UHCI Host Controller
[    4.001676] uhci_hcd 0000:00:01.2: new USB bus registered, assigned bus number 1
[    4.024124] uhci_hcd 0000:00:01.2: irq 23, io base 0x0000c200
[    4.041633] Refined TSC clocksource calibration: 2677.181 MHz.
[    4.059702] usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
[    4.074935] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    4.090748] usb usb1: Product: UHCI Host Controller
[    4.099439] usb usb1: Manufacturer: Linux 3.1.0-5.fc16.x86_64 uhci_hcd
[    4.113828] usb usb1: SerialNumber: 0000:00:01.2
[    4.124868] hub 1-0:1.0: USB hub found
[    4.143311] hub 1-0:1.0: 2 ports detected
[    4.153270] usbcore: registered new interface driver usbserial
[    4.163776] USB Serial support registered for generic
[    4.176772] usbcore: registered new interface driver usbserial_generic
[    4.191573] usbserial: USB Serial Driver core
[    4.202112] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0x60,0x64 irq 1,12
[    4.224277] serio: i8042 KBD port at 0x60,0x64 irq 1
[    4.234579] serio: i8042 AUX port at 0x60,0x64 irq 12
[    4.243591] mousedev: PS/2 mouse device common for all mice
[    4.266000] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input2
[    4.305325] rtc_cmos 00:05: rtc core: registered rtc_cmos as rtc0
[    4.320654] ata2.00: ATAPI: QEMU DVD-ROM, 0.10.2, max UDMA/100
[    4.336894] ata2.00: configured for MWDMA2
[    4.346972] rtc0: alarms up to one day, 114 bytes nvram
[    4.356267] device-mapper: uevent: version 1.0.3
[    4.364728] device-mapper: ioctl: 4.21.0-ioctl (2011-07-06) initialised: dm-devel@redhat.com
[    4.398637] cpuidle: using governor ladder
[    4.416798] cpuidle: using governor menu
[    4.440463] EFI Variables Facility v0.08 2004-May-17
[    4.455401] usbcore: registered new interface driver usbhid
[    4.466464] usbhid: USB HID core driver
[    4.471941] usb 1-2: new full speed USB device number 2 using uhci_hcd
[    4.479442] ip_tables: (C) 2000-2006 Netfilter Core Team
[    4.487208] TCP cubic registered
[    4.491879] Initializing XFRM netlink socket
[    4.498196] NET: Registered protocol family 10
[    4.504427] Mobile IPv6
[    4.508392] NET: Registered protocol family 17
[    4.516365] Registering the dns_resolver key type
[    4.522166] registered taskstats version 1
[    4.530496] IMA: No TPM chip found, activating TPM-bypass!
[    4.542259] XENBUS: Device with no driver: device/vfb/0
[    4.551985] XENBUS: Device with no driver: device/vbd/768
[    4.557808] XENBUS: Device with no driver: device/vbd/5632
[    4.563305] XENBUS: Device with no driver: device/vif/0
[    4.569566] XENBUS: Device with no driver: device/console/0
[    4.575926]   Magic number: 15:535:343
[    4.582096] tty tty60: hash matches
[    4.586306] rtc_cmos 00:05: setting system clock to 2011-10-31 18:20:43 UTC (1320085243)
[    4.597213] Initializing network drop monitor service
[    4.784955] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input3
[    7.954288] usb 1-2: New USB device found, idVendor=0627, idProduct=0001
[    7.959982] usb 1-2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    7.965696] usb 1-2: Product: QEMU USB Tablet
[    7.969472] usb 1-2: Manufacturer: QEMU 0.10.2
[    7.973301] usb 1-2: SerialNumber: 1
[    9.346286] ata2.00: qc timeout (cmd 0xa0)
[    9.350447] ata2.00: TEST_UNIT_READY failed (err_mask=0x4)
[    9.511368] ata2.00: configured for MWDMA2
[   10.204402] input: QEMU 0.10.2 QEMU USB Tablet as /devices/pci0000:00/0000:00:01.2/usb1/1-2/1-2:1.0/input/input4
[   10.220604] 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
[   14.515409] ata2.00: qc timeout (cmd 0xa0)
[   14.519215] ata2.00: TEST_UNIT_READY failed (err_mask=0x4)
[   14.523777] ata2.00: limiting speed to MWDMA2:PIO3
[   14.682705] ata2.00: configured for MWDMA2
[   19.686372] ata2.00: qc timeout (cmd 0xa0)
[   19.690003] ata2.00: TEST_UNIT_READY failed (err_mask=0x4)
[   19.694549] ata2.00: disabled
[   19.697694] ata2: soft resetting link
[   19.853703] ata2: EH complete
[   19.857284] Freeing unused kernel memory: 940k freed
[   19.861651] Write protecting the kernel read-only data: 10240k
[   19.871213] Freeing unused kernel memory: 1260k freed
[   19.881542] Freeing unused kernel memory: 1584k freed
[   19.914218] dracut: dracut-013-16.fc16
[   19.921618] dracut: root was live:/squashfs.img, liveroot is now live:/squashfs.img
[   19.937701] udevd[89]: starting version 173
[   20.067306] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[   20.124812] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)
[   20.136542] dracut: Mounted root filesystem /dev/mapper/live-rw
[   20.166494] dracut: Switching root
[   20.538986] type=1403 audit(1320085259.451:2): policy loaded auid=4294967295 ses=4294967295
[   20.551722] systemd[1]: Successfully loaded SELinux policy in 147ms 38us.
[   20.585152] systemd[1]: Successfully loaded SELinux database in 27ms 524us, size on heap is 475K.
[   20.636550] systemd[1]: Relabelled /dev and /run in 39ms 368us.
[   20.646389] systemd[1]: systemd 36 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +SYSVINIT +LIBCRYPTSETUP; fedora)
[   20.664870] systemd[1]: No hostname configured.
[   20.668864] systemd[1]: Initializing machine ID from random generator.
[   20.730269] systemd[1]: Failed to fully start up daemon: No such file or directory
[   20.736720] systemd[1]: Cannot add dependency job for unit fedora-wait-storage.service, ignoring: Unit fedora-wait-storage.service failed to load: No such file or directory. See system logs and 'systemctl status fedora-wait-storage.service' for details.
[   20.753901] systemd[1]: Cannot add dependency job for unit systemd-remount-api-vfs.service, ignoring: Unit systemd-remount-api-vfs.service failed to load: No such file or directory. See system logs and 'systemctl status systemd-remount-api-vfs.service' for details.
[   20.771807] systemd[1]: Cannot add dependency job for unit fedora-storage-init.service, ignoring: Unit fedora-storage-init.service failed to load: No such file or directory. See system logs and 'systemctl status fedora-storage-init.service' for details.
[   20.788942] systemd[1]: Cannot add dependency job for unit fedora-readonly.service, ignoring: Unit fedora-readonly.service failed to load: No such file or directory. See system logs and 'systemctl status fedora-readonly.service' for details.
[   20.805387] systemd[1]: Cannot add dependency job for unit lvm2-monitor.service, ignoring: Unit dm-event.socket failed to load: No such file or directory. See system logs and 'systemctl status dm-event.socket' for details.
[   20.820446] 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 details.
[   20.835852] systemd[1]: Cannot add dependency job for unit rpcbind.socket, ignoring: Unit rpcbind.socket failed to load: No such file or directory. See system logs and 'systemctl status rpcbind.socket' for details.
[   20.861030] systemd[1]: Cannot add dependency job for unit dm-event.socket, ignoring: Unit dm-event.socket failed to load: No such file or directory. See system logs and 'systemctl status dm-event.socket' for details.
[   20.890039] systemd[1]: Cannot add dependency job for unit iptables.service, ignoring: Unit iptables.service failed to load: No such file or directory. See system logs and 'systemctl status iptables.service' for details.
[   20.920513] systemd[1]: Cannot add dependency job for unit ip6tables.service, ignoring: Unit ip6tables.service failed to load: No such file or directory. See system logs and 'systemctl status ip6tables.service' for details.
[   20.973456] systemd-readahead-collect[254]: Disabling readahead collector due to execution in virtualized environment.
[   21.270214] systemd[1]: fedora-storage-init-late.service: main process exited, code=exited, status=203
[   21.298485] udevd[271]: starting version 173
[   21.339731] systemd[1]: Unit fedora-storage-init-late.service entered failed state.
[   21.503947] systemd-fsck[295]: Root directory is writable, skipping check.
[   21.653227] EXT4-fs (dm-0): re-mounted. Opts: user_xattr,acl,barrier=1,data=ordered
[   21.700121] mount[304]: warning: can't open /etc/fstab: No such file or directory
[   21.765128] systemd-vconsole-setup[298]: /bin/loadkeys failed with error code 1.
[   21.895550] systemd-vconsole-setup[298]: /bin/setfont failed with error code 1.
[   21.978459] lvm[294]: No volume groups found
[   22.094733] systemd-tmpfiles[340]: Successfully loaded SELinux database in 69ms 304us, size on heap is 476K.
[   22.506681] Initialising Xen virtual ethernet driver.
[   22.593025] vbd vbd-5632: 19 xenbus_dev_probe on device/vbd/5632
[   22.609176] blkfront: xvda: flush diskcache: enabled
[   22.648502]  xvda: unknown partition table
[   22.977881] vif vif-0: 2 parsing device/vif/0/mac

--bg08WKrSYDhXBjb5
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename="xen-4.1.2-f16test64hvm-linux-3.1.0-platform-pci-disabled.log"

[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.1.0-5.fc16.x86_64 (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: initrd=initrd.img console=ttyS0,38400 console=tty0 BOOT_IMAGE=vmlinuz 
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009e000 (usable)
[    0.000000]  BIOS-e820: 000000000009e000 - 00000000000a0000 (reserved)
[    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
[    0.000000]  BIOS-e820: 0000000000100000 - 0000000040000000 (usable)
[    0.000000]  BIOS-e820: 00000000fc000000 - 0000000100000000 (reserved)
[    0.000000] Using x86 segment limits to approximate NX protection
[    0.000000] DMI 2.4 present.
[    0.000000] Hypervisor detected: Xen HVM
[    0.000000] Xen version 4.1.
[    0.000000] Xen Platform PCI: unrecognised magic value
[    0.000000] No AGP bridge found
[    0.000000] last_pfn = 0x40000 max_arch_pfn = 0x400000000
[    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600070106
[    0.000000] found SMP MP-table at [ffff8800000fbc70] fbc70
[    0.000000] init_memory_mapping: 0000000000000000-0000000040000000
[    0.000000] RAMDISK: 37e7a000 - 3ffdf000
[    0.000000] ACPI: RSDP 00000000000ea020 00024 (v02    Xen)
[    0.000000] ACPI: XSDT 00000000fc0134b0 00034 (v01    Xen      HVM 00000000 HVML 00000000)
[    0.000000] ACPI: FACP 00000000fc0132d0 000F4 (v04    Xen      HVM 00000000 HVML 00000000)
[    0.000000] ACPI: DSDT 00000000fc003440 0FE05 (v02    Xen      HVM 00000000 INTL 20100528)
[    0.000000] ACPI: FACS 00000000fc003400 00040
[    0.000000] ACPI: APIC 00000000fc0133d0 000D8 (v02    Xen      HVM 00000000 HVML 00000000)
[    0.000000] No NUMA configuration found
[    0.000000] Faking a node at 0000000000000000-0000000040000000
[    0.000000] Initmem setup node 0 0000000000000000-0000000040000000
[    0.000000]   NODE_DATA [000000003ffec000 - 000000003fffffff]
[    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 -> 0x00040000
[    0.000000] ACPI: PM-Timer IO Port: 0xb008
[    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] disabled)
[    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, GSI 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 level)
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 low level)
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 low level)
[    0.000000] Using ACPI (MADT) for SMP configuration information
[    0.000000] SMP: Allowing 15 CPUs, 14 hotplug CPUs
[    0.000000] PM: Registered nosave memory: 000000000009e000 - 00000000000a0000
[    0.000000] PM: Registered nosave memory: 00000000000a0000 - 00000000000e0000
[    0.000000] PM: Registered nosave memory: 00000000000e0000 - 0000000000100000
[    0.000000] Allocating PCI resources starting at 40000000 (gap: 40000000:bc000000)
[    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 @ffff880037c00000 s81024 r8192 d21376 u131072
[    0.000000] Built 1 zonelists in Node order, mobility grouping on.  Total pages: 257929
[    0.000000] Policy zone: DMA32
[    0.000000] Kernel command line: initrd=initrd.img console=ttyS0,38400 console=tty0 BOOT_IMAGE=vmlinuz 
[    0.000000] PID hash table entries: 4096 (order: 3, 32768 bytes)
[    0.000000] Checking aperture...
[    0.000000] No AGP bridge found
[    0.000000] Memory: 883240k/1048576k available (4867k kernel code, 456k absent, 164880k reserved, 6782k data, 940k init)
[    0.000000] SLUB: Genslabs=15, HWalign=64, Order=0-3, MinObjects=0, CPUs=15, Nodes=1
[    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] Console: colour VGA+ 80x25
[    0.000000] console [tty0] enabled
[    0.000000] console [ttyS0] enabled
[    0.000000] allocated 8388608 bytes of page_cgroup
[    0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
[    0.000000] Detected 2677.244 MHz processor.
[    0.009999] Calibrating delay loop (skipped), value calculated using timer frequency.. 5354.48 BogoMIPS (lpj=2677244)
[    0.036006] pid_max: default: 32768 minimum: 301
[    0.049053] Security Framework initialized
[    0.060011] SELinux:  Initializing.
[    0.070196] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
[    0.086283] Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
[    0.108126] Mount-cache hash table entries: 256
[    0.118237] Initializing cgroup subsys cpuacct
[    0.131007] Initializing cgroup subsys memory
[    0.143020] Initializing cgroup subsys devices
[    0.155994] Initializing cgroup subsys freezer
[    0.168992] Initializing cgroup subsys net_cls
[    0.185998] Initializing cgroup subsys blkio
[    0.199003] Initializing cgroup subsys perf_event
[    0.210117] CPU: Physical Processor ID: 0
[    0.227983] CPU: Processor Core ID: 0
[    0.237983] mce: CPU supports 9 MCE banks
[    0.248169] SMP alternatives: switching to UP code
[    0.270478] ACPI: Core revision 20110623
[    0.301144] ftrace: allocating 25204 entries in 99 pages
[    0.359854] Not enabling x2apic, Intr-remapping init failed.
[    0.379963] Switched APIC routing to physical flat.
[    0.395377] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=0 pin2=0
[    0.421054] CPU0: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz stepping 05
[    0.441969] installing Xen timer for CPU 0
[    0.460041] Performance Events: unsupported p6 CPU model 37 no PMU driver, software events only.
[    0.469990] NMI watchdog disabled (cpu0): hardware events not enabled
[    0.470987] Brought up 1 CPUs
[    0.471952] Total of 1 processors activated (5354.48 BogoMIPS).
[    0.477079] devtmpfs: initialized
[    0.543947] atomic64 test passed for x86-64 platform with CX8 and with SSE
[    0.544994] RTC time: 18:31:27, date: 10/31/11
[    0.546027] NET: Registered protocol family 16
[    0.548999] ACPI: bus type pci registered
[    0.552043] PCI: Using configuration type 1 for base access
[    0.563016] bio: create slab <bio-0> at 0
[    0.565020] ACPI: Added _OSI(Module Device)
[    0.565937] ACPI: Added _OSI(Processor Device)
[    0.566948] ACPI: Added _OSI(3.0 _SCP Extensions)
[    0.567950] ACPI: Added _OSI(Processor Aggregator Device)
[    0.645984] ACPI: Interpreter enabled
[    0.646923] ACPI: (supports S0 S3 S4 S5)
[    0.651923] ACPI: Using IOAPIC for interrupt routing
[    1.146001] ACPI: No dock devices found.
[    1.146841] HEST: Table not found.
[    1.147842] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
[    1.148917] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[    1.149962] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7]
[    1.150842] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff]
[    1.151841] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x000bffff]
[    1.152841] pci_root PNP0A03:00: host bridge window [mem 0xf0000000-0xfbffffff]
[    1.192014] * Found PM-Timer Bug on the chipset. Due to workarounds for a bug,
[    1.192015] * this clock source is slow. Consider trying other clock sources
[    1.201900] pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PIIX4 ACPI
[    1.241962]  pci0000:00: Unable to request _OSC control (_OSC support mask: 0x1e)
[    2.025898] ACPI: PCI Interrupt Link [LNKA] (IRQs *5 10 11)
[    2.031953] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
[    2.037956] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
[    2.043955] ACPI: PCI Interrupt Link [LNKD] (IRQs *5 10 11)
[    2.049869] xen/balloon: Initialising balloon driver.
[    2.050708] last_pfn = 0x40000 max_arch_pfn = 0x400000000
[    2.051722] xen-balloon: Initialising balloon driver.
[    2.052853] vgaarb: device added: PCI:0000:00:02.0,decodes=io+mem,owns=io+mem,locks=none
[    2.053707] vgaarb: loaded
[    2.054705] vgaarb: bridge control possible 0000:00:02.0
[    2.055783] SCSI subsystem initialized
[    2.056815] usbcore: registered new interface driver usbfs
[    2.057722] usbcore: registered new interface driver hub
[    2.058730] usbcore: registered new device driver usb
[    2.059795] PCI: Using ACPI for IRQ routing
[    2.062025] NetLabel: Initializing
[    2.062701] NetLabel:  domain hash size = 128
[    2.063700] NetLabel:  protocols = UNLABELED CIPSOv4
[    2.064721] NetLabel:  unlabeled traffic allowed by default
[    2.065725] Switching to clocksource xen
[    2.067059] Switched to NOHz mode on CPU #0
[    2.084009] pnp: PnP ACPI init
[    2.091041] ACPI: bus type pnp registered
[    2.099766] system 00:00: [mem 0x00000000-0x0009ffff] could not be reserved
[    2.117529] system 00:02: [io  0x10c0-0x1141] has been reserved
[    2.130328] system 00:02: [io  0xb044-0xb047] has been reserved
[    2.144333] system 00:03: [io  0x08a0-0x08a3] has been reserved
[    2.167610] system 00:03: [io  0x0cc0-0x0ccf] has been reserved
[    2.181435] system 00:03: [io  0x04d0-0x04d1] has been reserved
[    2.246335] pnp: PnP ACPI: found 12 devices
[    2.255920] ACPI: ACPI bus type pnp unregistered
[    2.272417] NET: Registered protocol family 2
[    2.282943] IP route cache hash table entries: 32768 (order: 6, 262144 bytes)
[    2.298402] TCP established hash table entries: 131072 (order: 9, 2097152 bytes)
[    2.319541] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
[    2.334573] TCP: Hash tables configured (established 131072 bind 65536)
[    2.351355] TCP reno registered
[    2.362101] UDP hash table entries: 512 (order: 2, 16384 bytes)
[    2.376828] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[    2.398645] NET: Registered protocol family 1
[    2.411609] pci 0000:00:00.0: Limiting direct PCI/PCI transfers
[    2.428007] pci 0000:00:01.0: PIIX3: Enabling Passive Release
[    2.443328] pci 0000:00:01.0: Activating ISA DMA hang workarounds
[    2.460932] Unpacking initramfs...
[    3.153438] Freeing initrd memory: 132500k freed
[    3.193642] alg: No test for __gcm-aes-aesni (__driver-gcm-aes-aesni)
[    3.210175] audit: initializing netlink socket (disabled)
[    3.224144] type=2000 audit(1320085891.637:1): initialized
[    3.269240] HugeTLB registered 2 MB page size, pre-allocated 0 pages
[    3.294091] VFS: Disk quotas dquot_6.5.2
[    3.305685] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    3.322563] msgmni has been set to 1983
[    3.333804] alg: No test for stdrng (krng)
[    3.345060] NET: Registered protocol family 38
[    3.369417] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)
[    3.389791] io scheduler noop registered
[    3.400170] io scheduler deadline registered
[    3.412652] io scheduler cfq registered (default)
[    3.434054] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
[    3.452509] pciehp: PCI Express Hot Plug Controller Driver version: 0.4
[    3.467564] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
[    3.482297] acpiphp: Slot [0] registered
[    3.498329] acpiphp: Slot [1] registered
[    3.509545] acpiphp: Slot [2] registered
[    3.521837] acpiphp: Slot [3] registered
[    3.535810] acpiphp: Slot [4] registered
[    3.546618] acpiphp: Slot [5] registered
[    3.558013] acpiphp: Slot [6] registered
[    3.569028] acpiphp: Slot [7] registered
[    3.577378] acpiphp: Slot [8] registered
[    3.585571] acpiphp: Slot [9] registered
[    3.594136] acpiphp: Slot [10] registered
[    3.605047] acpiphp: Slot [11] registered
[    3.617289] acpiphp: Slot [12] registered
[    3.635176] acpiphp: Slot [13] registered
[    3.645500] acpiphp: Slot [14] registered
[    3.653631] acpiphp: Slot [15] registered
[    3.662873] acpiphp: Slot [16] registered
[    3.673800] acpiphp: Slot [17] registered
[    3.683048] acpiphp: Slot [18] registered
[    3.695166] acpiphp: Slot [19] registered
[    3.707294] acpiphp: Slot [20] registered
[    3.719412] acpiphp: Slot [21] registered
[    3.733379] acpiphp: Slot [22] registered
[    3.743860] acpiphp: Slot [23] registered
[    3.753505] acpiphp: Slot [24] registered
[    3.761528] acpiphp: Slot [25] registered
[    3.772585] acpiphp: Slot [26] registered
[    3.779635] acpiphp: Slot [27] registered
[    3.787641] acpiphp: Slot [28] registered
[    3.803456] acpiphp: Slot [29] registered
[    3.811555] acpiphp: Slot [30] registered
[    3.822066] acpiphp: Slot [31] registered
[    3.830693] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
[    3.843044] ACPI: Power Button [PWRF]
[    3.848869] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
[    3.858744] ACPI: Sleep Button [SLPF]
[    3.914683] ERST: Table is not found!
[    3.919555] GHES: HEST is not enabled!
[    3.925848] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    3.971082] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    4.017938] 00:0a: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    4.025223] Non-volatile memory driver v1.3
[    4.031615] Linux agpgart interface v0.103
[    4.044197] loop: module loaded
[    4.056103] scsi0 : ata_piix
[    4.064587] scsi1 : ata_piix
[    4.070221] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc120 irq 14
[    4.079404] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc128 irq 15
[    4.090982] Fixed MDIO Bus: probed
[    4.100125] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    4.110214] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    4.119711] uhci_hcd: USB Universal Host Controller Interface driver
[    4.131711] uhci_hcd 0000:00:01.2: PCI INT D -> GSI 23 (level, low) -> IRQ 23
[    4.144448] uhci_hcd 0000:00:01.2: UHCI Host Controller
[    4.157176] uhci_hcd 0000:00:01.2: new USB bus registered, assigned bus number 1
[    4.169978] uhci_hcd 0000:00:01.2: irq 23, io base 0x0000c100
[    4.185559] usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
[    4.196823] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    4.210203] usb usb1: Product: UHCI Host Controller
[    4.218714] usb usb1: Manufacturer: Linux 3.1.0-5.fc16.x86_64 uhci_hcd
[    4.234499] usb usb1: SerialNumber: 0000:00:01.2
[    4.243426] Refined TSC clocksource calibration: 2677.181 MHz.
[    4.254583] hub 1-0:1.0: USB hub found
[    4.260973] hub 1-0:1.0: 2 ports detected
[    4.270658] usbcore: registered new interface driver usbserial
[    4.281673] USB Serial support registered for generic
[    4.290221] usbcore: registered new interface driver usbserial_generic
[    4.306771] usbserial: USB Serial Driver core
[    4.319613] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0x60,0x64 irq 1,12
[    4.337869] serio: i8042 KBD port at 0x60,0x64 irq 1
[    4.346917] serio: i8042 AUX port at 0x60,0x64 irq 12
[    4.356592] mousedev: PS/2 mouse device common for all mice
[    4.369511] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input2
[    4.390238] rtc_cmos 00:05: rtc core: registered rtc_cmos as rtc0
[    4.400963] rtc0: alarms up to one day, 114 bytes nvram
[    4.411174] device-mapper: uevent: version 1.0.3
[    4.419520] device-mapper: ioctl: 4.21.0-ioctl (2011-07-06) initialised: dm-devel@redhat.com
[    4.434994] cpuidle: using governor ladder
[    4.443631] cpuidle: using governor menu
[    4.450955] EFI Variables Facility v0.08 2004-May-17
[    4.465752] usbcore: registered new interface driver usbhid
[    4.476575] usbhid: USB HID core driver
[    4.489789] ip_tables: (C) 2000-2006 Netfilter Core Team
[    4.500777] TCP cubic registered
[    4.512424] Initializing XFRM netlink socket
[    4.524175] NET: Registered protocol family 10
[    4.555973] Mobile IPv6
[    4.563289] NET: Registered protocol family 17
[    4.590928] ata1.00: ATA-7: QEMU HARDDISK, 0.10.2, max UDMA/100
[    4.603485] ata1.00: 62914560 sectors, multi 16: LBA48 
[    4.612965] ata2.00: ATAPI: QEMU DVD-ROM, 0.10.2, max UDMA/100
[    4.627911] ata2.00: configured for MWDMA2
[    4.642096] Registering the dns_resolver key type
[    4.661460] ata1.00: configured for MWDMA2
[    4.670193] scsi 0:0:0:0: Direct-Access     ATA      QEMU HARDDISK    0.10 PQ: 0 ANSI: 5
[    4.685673] sd 0:0:0:0: Attached scsi generic sg0 type 0
[    4.697488] scsi 1:0:0:0: CD-ROM            QEMU     QEMU DVD-ROM     0.10 PQ: 0 ANSI: 5
[    4.714448] sd 0:0:0:0: [sda] 62914560 512-byte logical blocks: (32.2 GB/30.0 GiB)
[    4.734544] registered taskstats version 1
[    4.744923] IMA: No TPM chip found, activating TPM-bypass!
[    4.756015]   Magic number: 15:741:545
[    4.761907] rtc_cmos 00:05: setting system clock to 2011-10-31 18:31:31 UTC (1320085891)
[    4.771881] Initializing network drop monitor service
[    4.781501] sr0: scsi3-mmc drive: 4x/4x xa/form2 tray
[    4.789242] cdrom: Uniform CD-ROM driver Revision: 3.20
[    4.805026] sr 1:0:0:0: Attached scsi generic sg1 type 5
[    4.811640] usb 1-2: new full speed USB device number 2 using uhci_hcd
[    4.820549] sd 0:0:0:0: [sda] Write Protect is off
[    4.827544] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[    4.843720]  sda: unknown partition table
[    4.849601] sd 0:0:0:0: [sda] Attached SCSI disk
[    4.856223] Freeing unused kernel memory: 940k freed
[    4.862917] Write protecting the kernel read-only data: 10240k
[    4.878993] Freeing unused kernel memory: 1260k freed
[    4.903033] Freeing unused kernel memory: 1584k freed
[    4.955884] dracut: dracut-013-16.fc16
[    4.970221] dracut: root was live:/squashfs.img, liveroot is now live:/squashfs.img
[    4.996561] udevd[91]: starting version 173
[    5.038989] usb 1-2: New USB device found, idVendor=0627, idProduct=0001
[    5.051977] usb 1-2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    5.073198] usb 1-2: Product: QEMU USB Tablet
[    5.081687] usb 1-2: Manufacturer: QEMU 0.10.2
[    5.090037] usb 1-2: SerialNumber: 1
[    5.106364] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input3
[    5.207463] input: QEMU 0.10.2 QEMU USB Tablet as /devices/pci0000:00/0000:00:01.2/usb1/1-2/1-2:1.0/input/input4
[    5.261120] 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
[    5.652656] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    5.723242] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)
[    5.738022] dracut: Mounted root filesystem /dev/mapper/live-rw
[    5.790468] dracut: Switching root
[    6.269951] type=1403 audit(1320085893.007:2): policy loaded auid=4294967295 ses=4294967295
[    6.284896] systemd[1]: Successfully loaded SELinux policy in 175ms 109us.
[    6.324879] systemd[1]: Successfully loaded SELinux database in 31ms 773us, size on heap is 475K.
[    6.385001] systemd[1]: Relabelled /dev and /run in 45ms 812us.
[    6.396418] systemd[1]: systemd 36 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +SYSVINIT +LIBCRYPTSETUP; fedora)
[    6.418068] systemd[1]: No hostname configured.
[    6.423046] systemd[1]: Initializing machine ID from random generator.
[    6.492643] systemd[1]: Failed to fully start up daemon: No such file or directory
[    6.511686] systemd[1]: Cannot add dependency job for unit fedora-wait-storage.service, ignoring: Unit fedora-wait-storage.service failed to load: No such file or directory. See system logs and 'systemctl status fedora-wait-storage.service' for details.
[    6.571435] systemd[1]: Cannot add dependency job for unit systemd-remount-api-vfs.service, ignoring: Unit systemd-remount-api-vfs.service failed to load: No such file or directory. See system logs and 'systemctl status systemd-remount-api-vfs.service' for details.
[    6.623918] systemd[1]: Cannot add dependency job for unit fedora-storage-init.service, ignoring: Unit fedora-storage-init.service failed to load: No such file or directory. See system logs and 'systemctl status fedora-storage-init.service' for details.
[    6.653173] systemd[1]: Cannot add dependency job for unit fedora-readonly.service, ignoring: Unit fedora-readonly.service failed to load: No such file or directory. See system logs and 'systemctl status fedora-readonly.service' for details.
[    6.705570] systemd[1]: Cannot add dependency job for unit lvm2-monitor.service, ignoring: Unit dm-event.socket failed to load: No such file or directory. See system logs and 'systemctl status dm-event.socket' for details.
[    6.754188] 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 details.
[    6.816406] systemd[1]: Cannot add dependency job for unit rpcbind.socket, ignoring: Unit rpcbind.socket failed to load: No such file or directory. See system logs and 'systemctl status rpcbind.socket' for details.
[    6.865606] systemd[1]: Cannot add dependency job for unit dm-event.socket, ignoring: Unit dm-event.socket failed to load: No such file or directory. See system logs and 'systemctl status dm-event.socket' for details.
[    6.913090] systemd[1]: Cannot add dependency job for unit iptables.service, ignoring: Unit iptables.service failed to load: No such file or directory. See system logs and 'systemctl status iptables.service' for details.
[    6.955579] systemd[1]: Cannot add dependency job for unit ip6tables.service, ignoring: Unit ip6tables.service failed to load: No such file or directory. See system logs and 'systemctl status ip6tables.service' for details.
[    7.012440] systemd-readahead-collect[333]: Disabling readahead collector due to execution in virtualized environment.
[    7.386262] systemd[1]: fedora-storage-init-late.service: main process exited, code=exited, status=203
[    7.443655] udevd[350]: starting version 173
[    7.516084] systemd[1]: Unit fedora-storage-init-late.service entered failed state.
[    7.761565] systemd-fsck[413]: Root directory is writable, skipping check.
[    7.906119] systemd-vconsole-setup[417]: /bin/loadkeys failed with error code 1.
[    7.949179] EXT4-fs (dm-0): re-mounted. Opts: user_xattr,acl,barrier=1,data=ordered
[    7.982573] systemd-vconsole-setup[417]: /bin/setfont failed with error code 1.
[    8.047026] mount[422]: warning: can't open /etc/fstab: No such file or directory
[    8.109546] lvm[412]: No volume groups found
[    8.284843] systemd-tmpfiles[441]: Successfully loaded SELinux database in 35ms 444us, size on heap is 476K.
[    8.540772] 8139cp: 8139cp: 10/100 PCI Ethernet driver v1.3 (Mar 22, 2004)
[    9.353982] 8139cp 0000:00:03.0: PCI INT A -> GSI 28 (level, low) -> IRQ 28
[    9.560432] 8139cp 0000:00:03.0: eth0: RTL-8139C+ at 0xffffc90000a30000, 00:16:3f:03:01:14, IRQ 28
[    9.662977] 8139too: 8139too Fast Ethernet driver 0.9.28

--bg08WKrSYDhXBjb5
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

--bg08WKrSYDhXBjb5--


From xen-devel-bounces@lists.xensource.com Mon Oct 31 11:38:45 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 11:38:45 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKwku-0002xn-Vv; Mon, 31 Oct 2011 11:38:45 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RKwkF-0002lu-Q7
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 11:38:04 -0700
X-Env-Sender: dgdegra@tycho.nsa.gov
X-Msg-Ref: server-16.tower-216.messagelabs.com!1320086276!1744013!1
X-Originating-IP: [63.239.65.39]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2675 invoked from network); 31 Oct 2011 18:37:57 -0000
Received: from msux-gh1-uea01.nsa.gov (HELO msux-gh1-uea01.nsa.gov)
	(63.239.65.39) by server-16.tower-216.messagelabs.com with SMTP;
	31 Oct 2011 18:37:57 -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
	p9VIbtrr028342
	for <xen-devel@lists.xensource.com>; Mon, 31 Oct 2011 18:37:56 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 p9VIbtLE003490; 
	Mon, 31 Oct 2011 14:37:55 -0400
From: Daniel De Graaf <dgdegra@tycho.nsa.gov>
To: xen-devel@lists.xensource.com
Date: Mon, 31 Oct 2011 14:38:12 -0400
Message-Id: <1320086292-5058-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>
Subject: [Xen-devel] [PATCH] xenstored: Fix processing of zero-length
	messages
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 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>
---
 tools/xenstore/xenstored_core.c |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 5d308ca..9e6c2c7 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -1297,7 +1297,6 @@ static void handle_input(struct connection *conn)
 			goto bad_client;
 		in->used = 0;
 		in->inhdr = false;
-		return;
 	}
 
 	bytes = conn->read(conn, in->buffer + in->used,
-- 
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 Oct 31 11:49:59 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 11: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 1RKwvn-0003kx-Bh; Mon, 31 Oct 2011 11:49:59 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKwv1-0003X3-CY
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 11:49:12 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-9.tower-27.messagelabs.com!1320086923!50925501!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2881 invoked from network); 31 Oct 2011 18:48:43 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 31 Oct 2011 18:48:43 -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 5C45E24A6
	for <xen-devel@lists.xensource.com>;
	Mon, 31 Oct 2011 20:49:07 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 4250420097; Mon, 31 Oct 2011 20:49:07 +0200 (EET)
Date: Mon, 31 Oct 2011 20:49:07 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: xen-devel@lists.xensource.com
Message-ID: <20111031184907.GA12984@reaktio.net>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="RASg3xLB4tUQ4RcS"
Content-Disposition: inline
User-Agent: Mutt/1.5.18 (2008-05-17)
Subject: [Xen-devel] Xen 4.1.2 HVM guest realtek nic problems (eth0 8139cp
	transmit queue timed out)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--RASg3xLB4tUQ4RcS
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

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 (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


--RASg3xLB4tUQ4RcS
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename="xen-4.1.2-f16test64hvm-linux-3.1.0-realtek-problem.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-5.fc16.x86_64 (mockbuild@x86-10.phx2.fed=
oraproject.org) (gcc version 4.6.1 20111003 (Red Hat 4.6.1-10) (GCC) ) #1 S=
MP Thu Oct 27 03:46:50 UTC 2011=0D
[    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_ro=
ot rd.dm=3D0 SYSFONT=3Dlatarcyrheb-sun16 rhgb KEYTABLE=3Dfi rd.md=3D0 rd.lu=
ks=3D0 rd.lvm.lv=3Dvg_f16test64hvm/lv_swap LANG=3Den_US.UTF-8 console=3Dtty=
S0,38400 console=3Dtty0=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] Using x86 segment limits to approximate NX protection=0D
[    0.000000] DMI 2.4 present.=0D
[    0.000000] Hypervisor detected: Xen HVM=0D
[    0.000000] Xen version 4.1.=0D
[    0.000000] Xen Platform PCI: unrecognised magic value=0D
[    0.000000] No AGP bridge found=0D
[    0.000000] last_pfn =3D 0x40000 max_arch_pfn =3D 0x400000000=0D
[    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x701060007=
0106=0D
[    0.000000] found SMP MP-table at [ffff8800000fbc70] fbc70=0D
[    0.000000] init_memory_mapping: 0000000000000000-0000000040000000=0D
[    0.000000] RAMDISK: 36608000 - 372fc000=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] 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] 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] ACPI: PM-Timer IO Port: 0xb008=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)=0D
[    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] disabled)=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] Using ACPI (MADT) for SMP configuration information=0D
[    0.000000] SMP: Allowing 15 CPUs, 14 hotplug CPUs=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 @ffff88003fc00000 s81024 r8192=
 d21376 u131072=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: BOOT_IMAGE=3D/vmlinuz-3.1.0-5.fc16.x86_=
64 root=3D/dev/mapper/vg_f16test64hvm-lv_root ro rd.lvm.lv=3Dvg_f16test64hv=
m/lv_root rd.dm=3D0 SYSFONT=3Dlatarcyrheb-sun16 rhgb KEYTABLE=3Dfi rd.md=3D=
0 rd.luks=3D0 rd.lvm.lv=3Dvg_f16test64hvm/lv_swap LANG=3Den_US.UTF-8 consol=
e=3DttyS0,38400 console=3Dtty0=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] Memory: 1002468k/1048576k available (4867k kernel code, 456k=
 absent, 45652k reserved, 6782k 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 [tty0] enabled=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 2677.244 MHz processor.=0D
[    0.005999] Calibrating delay loop (skipped), value calculated using tim=
er frequency.. 5354.48 BogoMIPS (lpj=3D2677244)=0D
[    0.015004] pid_max: default: 32768 minimum: 301=0D
[    0.021037] Security Framework initialized=0D
[    0.025012] SELinux:  Initializing.=0D
[    0.030209] Dentry cache hash table entries: 131072 (order: 8, 1048576 b=
ytes)=0D
[    0.039268] Inode-cache hash table entries: 65536 (order: 7, 524288 byte=
s)=0D
[    0.047115] Mount-cache hash table entries: 256=0D
[    0.051161] Initializing cgroup subsys cpuacct=0D
[    0.056007] Initializing cgroup subsys memory=0D
[    0.060013] Initializing cgroup subsys devices=0D
[    0.063998] Initializing cgroup subsys freezer=0D
[    0.071007] Initializing cgroup subsys net_cls=0D
[    0.077002] Initializing cgroup subsys blkio=0D
[    0.092016] Initializing cgroup subsys perf_event=0D
[    0.097110] CPU: Physical Processor ID: 0=0D
[    0.105998] CPU: Processor Core ID: 0=0D
[    0.114998] mce: CPU supports 9 MCE banks=0D
[    0.120027] SMP alternatives: switching to UP code=0D
[    0.137406] ACPI: Core revision 20110623=0D
[    0.154723] ftrace: allocating 25204 entries in 99 pages=0D
[    0.203985] Not enabling x2apic, Intr-remapping init failed.=0D
[    0.212983] Switched APIC routing to physical flat.=0D
[    0.227511] ..TIMER: vector=3D0x30 apic1=3D0 pin1=3D2 apic2=3D0 pin2=3D0=
=0D
[    0.247910] CPU0: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz steppi=
ng 05=0D
[    0.266997] installing Xen timer for CPU 0=0D
[    0.279095] Performance Events: unsupported p6 CPU model 37 no PMU drive=
r, software events only.=0D
[    0.288052] NMI watchdog disabled (cpu0): hardware events not enabled=0D
[    0.289014] Brought up 1 CPUs=0D
[    0.289980] Total of 1 processors activated (5354.48 BogoMIPS).=0D
[    0.295080] devtmpfs: initialized=0D
[    0.334074] atomic64 test passed for x86-64 platform with CX8 and with S=
SE=0D
[    0.335009] RTC time: 18:48:31, date: 10/31/11=0D
[    0.336031] NET: Registered protocol family 16=0D
[    0.340028] ACPI: bus type pci registered=0D
[    0.343066] PCI: Using configuration type 1 for base access=0D
[    0.352055] bio: create slab <bio-0> at 0=0D
[    0.354016] ACPI: Added _OSI(Module Device)=0D
[    0.354986] ACPI: Added _OSI(Processor Device)=0D
[    0.355988] ACPI: Added _OSI(3.0 _SCP Extensions)=0D
[    0.356976] ACPI: Added _OSI(Processor Aggregator Device)=0D
[    0.461035] ACPI: Interpreter enabled=0D
[    0.461960] ACPI: (supports S0 S3 S4 S5)=0D
[    0.466962] ACPI: Using IOAPIC for interrupt routing=0D
[    1.042887] ACPI: No dock devices found.=0D
[    1.043879] HEST: Table not found.=0D
[    1.044874] PCI: Using host bridge windows from ACPI; if necessary, use =
"pci=3Dnocrs" and report a bug=0D
[    1.045996] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])=0D
[    1.047922] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7]=
=0D
[    1.048872] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff]=
=0D
[    1.049876] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x00=
0bffff]=0D
[    1.050885] pci_root PNP0A03:00: host bridge window [mem 0xf0000000-0xfb=
ffffff]=0D
[    1.148854] * Found PM-Timer Bug on the chipset. Due to workarounds for =
a bug,=0D
[    1.148856] * this clock source is slow. Consider trying other clock sou=
rces=0D
[    1.174862] pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PIIX=
4 ACPI=0D
[    1.249999]  pci0000:00: Unable to request _OSC control (_OSC support ma=
sk: 0x1e)=0D
[    1.988937] ACPI: PCI Interrupt Link [LNKA] (IRQs *5 10 11)=0D
[    1.995734] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)=0D
[    2.002022] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)=0D
[    2.007986] ACPI: PCI Interrupt Link [LNKD] (IRQs *5 10 11)=0D
[    2.013926] xen/balloon: Initialising balloon driver.=0D
[    2.014721] last_pfn =3D 0x40000 max_arch_pfn =3D 0x400000000=0D
[    2.015744] xen-balloon: Initialising balloon driver.=0D
[    2.016893] vgaarb: device added: PCI:0000:00:02.0,decodes=3Dio+mem,owns=
=3Dio+mem,locks=3Dnone=0D
[    2.017723] vgaarb: loaded=0D
[    2.018717] vgaarb: bridge control possible 0000:00:02.0=0D
[    2.019908] SCSI subsystem initialized=0D
[    2.020926] usbcore: registered new interface driver usbfs=0D
[    2.021751] usbcore: registered new interface driver hub=0D
[    2.022778] usbcore: registered new device driver usb=0D
[    2.023833] PCI: Using ACPI for IRQ routing=0D
[    2.027000] NetLabel: Initializing=0D
[    2.027726] NetLabel:  domain hash size =3D 128=0D
[    2.028719] NetLabel:  protocols =3D UNLABELED CIPSOv4=0D
[    2.029771] NetLabel:  unlabeled traffic allowed by default=0D
[    2.030738] Switching to clocksource xen=0D
[    2.032064] Switched to NOHz mode on CPU #0=0D
[    2.058600] pnp: PnP ACPI init=0D
[    2.070312] ACPI: bus type pnp registered=0D
[    2.081358] system 00:00: [mem 0x00000000-0x0009ffff] could not be reser=
ved=0D
[    2.105526] system 00:02: [io  0x10c0-0x1141] has been reserved=0D
[    2.123586] system 00:02: [io  0xb044-0xb047] has been reserved=0D
[    2.140716] system 00:03: [io  0x08a0-0x08a3] has been reserved=0D
[    2.155376] system 00:03: [io  0x0cc0-0x0ccf] has been reserved=0D
[    2.171720] system 00:03: [io  0x04d0-0x04d1] has been reserved=0D
[    2.235079] pnp: PnP ACPI: found 12 devices=0D
[    2.239980] ACPI: ACPI bus type pnp unregistered=0D
[    2.252651] NET: Registered protocol family 2=0D
[    2.262951] IP route cache hash table entries: 32768 (order: 6, 262144 b=
ytes)=0D
[    2.271095] TCP established hash table entries: 131072 (order: 9, 209715=
2 bytes)=0D
[    2.282685] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)=
=0D
[    2.293164] TCP: Hash tables configured (established 131072 bind 65536)=
=0D
[    2.302409] TCP reno registered=0D
[    2.307217] UDP hash table entries: 512 (order: 2, 16384 bytes)=0D
[    2.317125] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)=0D
[    2.326389] NET: Registered protocol family 1=0D
[    2.331960] pci 0000:00:00.0: Limiting direct PCI/PCI transfers=0D
[    2.341391] pci 0000:00:01.0: PIIX3: Enabling Passive Release=0D
[    2.353138] pci 0000:00:01.0: Activating ISA DMA hang workarounds=0D
[    2.361559] Unpacking initramfs...=0D
[    2.699968] Freeing initrd memory: 13264k freed=0D
[    2.710147] alg: No test for __gcm-aes-aesni (__driver-gcm-aes-aesni)=0D
[    2.717216] audit: initializing netlink socket (disabled)=0D
[    2.722974] type=3D2000 audit(1320086915.409:1): initialized=0D
[    2.752235] HugeTLB registered 2 MB page size, pre-allocated 0 pages=0D
[    2.764915] VFS: Disk quotas dquot_6.5.2=0D
[    2.769491] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)=0D
[    2.776668] msgmni has been set to 1983=0D
[    2.781504] alg: No test for stdrng (krng)=0D
[    2.787102] NET: Registered protocol family 38=0D
[    2.792422] Block layer SCSI generic (bsg) driver version 0.4 loaded (ma=
jor 253)=0D
[    2.801199] io scheduler noop registered=0D
[    2.806077] io scheduler deadline registered=0D
[    2.811278] io scheduler cfq registered (default)=0D
[    2.818821] pci_hotplug: PCI Hot Plug PCI Core version: 0.5=0D
[    2.825681] pciehp: PCI Express Hot Plug Controller Driver version: 0.4=
=0D
[    2.831486] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5=0D
[    2.838723] acpiphp: Slot [0] registered=0D
[    2.842985] acpiphp: Slot [1] registered=0D
[    2.847352] acpiphp: Slot [2] registered=0D
[    2.851192] acpiphp: Slot [3] registered=0D
[    2.855526] acpiphp: Slot [4] registered=0D
[    2.859987] acpiphp: Slot [5] registered=0D
[    2.865216] acpiphp: Slot [6] registered=0D
[    2.870721] acpiphp: Slot [7] registered=0D
[    2.875193] acpiphp: Slot [8] registered=0D
[    2.882170] acpiphp: Slot [9] registered=0D
[    2.887602] acpiphp: Slot [10] registered=0D
[    2.893553] acpiphp: Slot [11] registered=0D
[    2.901005] acpiphp: Slot [12] registered=0D
[    2.909484] acpiphp: Slot [13] registered=0D
[    2.927108] acpiphp: Slot [14] registered=0D
[    2.936646] acpiphp: Slot [15] registered=0D
[    2.947352] acpiphp: Slot [16] registered=0D
[    2.959370] acpiphp: Slot [17] registered=0D
[    2.975306] acpiphp: Slot [18] registered=0D
[    2.986962] acpiphp: Slot [19] registered=0D
[    2.998507] acpiphp: Slot [20] registered=0D
[    3.008809] acpiphp: Slot [21] registered=0D
[    3.019088] acpiphp: Slot [22] registered=0D
[    3.028701] acpiphp: Slot [23] registered=0D
[    3.041087] acpiphp: Slot [24] registered=0D
[    3.054701] acpiphp: Slot [25] registered=0D
[    3.088485] acpiphp: Slot [26] registered=0D
[    3.096559] acpiphp: Slot [27] registered=0D
[    3.104123] acpiphp: Slot [28] registered=0D
[    3.112335] acpiphp: Slot [29] registered=0D
[    3.120729] acpiphp: Slot [30] registered=0D
[    3.128063] acpiphp: Slot [31] registered=0D
[    3.140336] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/inpu=
t/input0=0D
[    3.152824] ACPI: Power Button [PWRF]=0D
[    3.159164] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/inpu=
t/input1=0D
[    3.170535] ACPI: Sleep Button [SLPF]=0D
[    3.240741] ERST: Table is not found!=0D
[    3.247178] GHES: HEST is not enabled!=0D
[    3.255081] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled=0D
[    3.299342] serial8250: ttyS0 at I/O 0x3f8 (irq =3D 4) is a 16550A=0D
[    3.339144] 00:0a: ttyS0 at I/O 0x3f8 (irq =3D 4) is a 16550A=0D
[    3.348389] Non-volatile memory driver v1.3=0D
[    3.359031] Linux agpgart interface v0.103=0D
[    3.373452] loop: module loaded=0D
[    3.380620] scsi0 : ata_piix=0D
[    3.385158] scsi1 : ata_piix=0D
[    3.392804] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc120 irq 1=
4=0D
[    3.406093] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc128 irq 1=
5=0D
[    3.424665] Fixed MDIO Bus: probed=0D
[    3.432049] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver=0D
[    3.452302] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver=0D
[    3.465814] uhci_hcd: USB Universal Host Controller Interface driver=0D
[    3.480645] uhci_hcd 0000:00:01.2: PCI INT D -> GSI 23 (level, low) -> I=
RQ 23=0D
[    3.495010] uhci_hcd 0000:00:01.2: UHCI Host Controller=0D
[    3.509922] uhci_hcd 0000:00:01.2: new USB bus registered, assigned bus =
number 1=0D
[    3.532921] uhci_hcd 0000:00:01.2: irq 23, io base 0x0000c100=0D
[    3.556237] usb usb1: New USB device found, idVendor=3D1d6b, idProduct=
=3D0001=0D
[    3.577164] usb usb1: New USB device strings: Mfr=3D3, Product=3D2, Seri=
alNumber=3D1=0D
[    3.597277] usb usb1: Product: UHCI Host Controller=0D
[    3.609990] usb usb1: Manufacturer: Linux 3.1.0-5.fc16.x86_64 uhci_hcd=0D
[    3.623617] usb usb1: SerialNumber: 0000:00:01.2=0D
[    3.633485] hub 1-0:1.0: USB hub found=0D
[    3.641829] hub 1-0:1.0: 2 ports detected=0D
[    3.654394] usbcore: registered new interface driver usbserial=0D
[    3.834631] Refined TSC clocksource calibration: 2677.188 MHz.=0D
[    3.849203] ata2.00: ATAPI: QEMU DVD-ROM, 0.10.2, max UDMA/100=0D
[    3.860117] ata1.00: ATA-7: QEMU HARDDISK, 0.10.2, max UDMA/100=0D
[    3.867830] ata1.00: 62914560 sectors, multi 16: LBA48 =0D
[    3.880575] ata2.00: configured for MWDMA2=0D
[    3.888438] ata1.00: configured for MWDMA2=0D
[    3.897324] scsi 0:0:0:0: Direct-Access     ATA      QEMU HARDDISK    0.=
10 PQ: 0 ANSI: 5=0D
[    3.909309] sd 0:0:0:0: Attached scsi generic sg0 type 0=0D
[    3.921146] scsi 1:0:0:0: CD-ROM            QEMU     QEMU DVD-ROM     0.=
10 PQ: 0 ANSI: 5=0D
[    3.940204] sd 0:0:0:0: [sda] 62914560 512-byte logical blocks: (32.2 GB=
/30.0 GiB)=0D
[    3.953575] sr0: scsi3-mmc drive: 4x/4x xa/form2 tray=0D
[    3.972245] cdrom: Uniform CD-ROM driver Revision: 3.20=0D
[    3.985565] sd 0:0:0:0: [sda] Write Protect is off=0D
[    3.995242] sr 1:0:0:0: Attached scsi generic sg1 type 5=0D
[    4.003515] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled=
, doesn't support DPO or FUA=0D
[    4.030638] USB Serial support registered for generic=0D
[    4.071098] usb 1-2: new full speed USB device number 2 using uhci_hcd=0D
[    4.116603]  sda: sda1 sda2 sda3=0D
[    4.122784] sd 0:0:0:0: [sda] Attached SCSI disk=0D
[    4.279332] usb 1-2: New USB device found, idVendor=3D0627, idProduct=3D=
0001=0D
[    4.285003] usb 1-2: New USB device strings: Mfr=3D3, Product=3D2, Seria=
lNumber=3D1=0D
[    4.291626] usb 1-2: Product: QEMU USB Tablet=0D
[    4.296035] usb 1-2: Manufacturer: QEMU 0.10.2=0D
[    4.301072] usb 1-2: SerialNumber: 1=0D
[    4.327941] usbcore: registered new interface driver usbserial_generic=0D
[    4.334045] usbserial: USB Serial Driver core=0D
[    4.338689] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0=
x60,0x64 irq 1,12=0D
[    4.356131] serio: i8042 KBD port at 0x60,0x64 irq 1=0D
[    4.365819] serio: i8042 AUX port at 0x60,0x64 irq 12=0D
[    4.377814] mousedev: PS/2 mouse device common for all mice=0D
[    4.391350] input: AT Translated Set 2 keyboard as /devices/platform/i80=
42/serio0/input/input2=0D
[    4.409931] rtc_cmos 00:05: rtc core: registered rtc_cmos as rtc0=0D
[    4.423898] rtc0: alarms up to one day, 114 bytes nvram=0D
[    4.435841] device-mapper: uevent: version 1.0.3=0D
[    4.449590] device-mapper: ioctl: 4.21.0-ioctl (2011-07-06) initialised:=
 dm-devel@redhat.com=0D
[    4.495727] cpuidle: using governor ladder=0D
[    4.504718] cpuidle: using governor menu=0D
[    4.513536] EFI Variables Facility v0.08 2004-May-17=0D
[    4.552133] input: QEMU 0.10.2 QEMU USB Tablet as /devices/pci0000:00/00=
00:00:01.2/usb1/1-2/1-2:1.0/input/input3=0D
[    4.574945] generic-usb 0003:0627:0001.0001: input,hidraw0: USB HID v0.0=
1 Pointer [QEMU 0.10.2 QEMU USB Tablet] on usb-0000:00:01.2-2/input0=0D
[    4.604382] usbcore: registered new interface driver usbhid=0D
[    4.615480] usbhid: USB HID core driver=0D
[    4.632689] ip_tables: (C) 2000-2006 Netfilter Core Team=0D
[    4.642932] TCP cubic registered=0D
[    4.650070] Initializing XFRM netlink socket=0D
[    4.659989] NET: Registered protocol family 10=0D
[    4.670710] Mobile IPv6=0D
[    4.676439] NET: Registered protocol family 17=0D
[    4.686698] Registering the dns_resolver key type=0D
[    4.698703] registered taskstats version 1=0D
[    4.710470] IMA: No TPM chip found, activating TPM-bypass!=0D
[    4.727752]   Magic number: 15:53:849=0D
[    4.737301] graphics fbcon: hash matches=0D
[    4.747845] rtc_cmos 00:05: setting system clock to 2011-10-31 18:48:35 =
UTC (1320086915)=0D
[    4.766933] Initializing network drop monitor service=0D
[    4.778567] Freeing unused kernel memory: 940k freed=0D
[    4.790390] Write protecting the kernel read-only data: 10240k=0D
[    4.816829] Freeing unused kernel memory: 1260k freed=0D
[    4.847132] Freeing unused kernel memory: 1584k freed=0D
[    4.946739] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/=
i8042/serio1/input/input4=0D
[    5.069194] dracut: dracut-013-16.fc16=0D
[    5.086672] udevd[115]: starting version 173=0D
[    5.237375] dracut: Starting plymouth daemon=0D
=1B%G[    5.437681] dracut: rd.dm=3D0: removing DM RAID activation=0D
[    5.456883] dracut: rd.md.imsm=3D0: no MD RAID for imsm/isw raids=0D
[    5.471879] dracut: rd.md.ddf=3D0: no MD RAID for SNIA ddf raids=0D
=1B%G[    6.056855] dracut: Scanning devices sda3  for LVM logical volumes =
vg_f16test64hvm/lv_root vg_f16test64hvm/lv_swap=0D
[    6.099044] dracut: inactive '/dev/vg_f16test64hvm/lv_swap' [1.97 GiB] i=
nherit=0D
[    6.107308] dracut: inactive '/dev/vg_f16test64hvm/lv_root' [27.53 GiB] =
inherit=0D
[    6.615218] EXT4-fs (dm-1): INFO: recovery required on readonly filesyst=
em=0D
[    6.623572] EXT4-fs (dm-1): write access will be enabled during recovery=
=0D
[    7.513709] EXT4-fs (dm-1): recovery complete=0D
[    7.539777] EXT4-fs (dm-1): mounted filesystem with ordered data mode. O=
pts: (null)=0D
[    7.596678] dracut: Checking ext4: /dev/mapper/vg_f16test64hvm-lv_root=0D
[    7.603638] dracut: issuing e2fsck -a  /dev/mapper/vg_f16test64hvm-lv_ro=
ot=0D
[    7.657115] dracut: /dev/mapper/vg_f16test64hvm-lv_root: clean, 18709/18=
06896 files, 289903/7217152 blocks=0D
[    7.666279] dracut: Remounting /dev/mapper/vg_f16test64hvm-lv_root with =
-o ro=0D
[    7.680814] EXT4-fs (dm-1): mounted filesystem with ordered data mode. O=
pts: (null)=0D
[    7.717573] dracut: Mounted root filesystem /dev/mapper/vg_f16test64hvm-=
lv_root=0D
[    7.854983] dracut: Switching root=0D
[    8.204987] type=3D1404 audit(1320086918.956:2): enforcing=3D1 old_enfor=
cing=3D0 auid=3D4294967295 ses=3D4294967295=0D
[    8.329675] type=3D1403 audit(1320086919.081:3): policy loaded auid=3D42=
94967295 ses=3D4294967295=0D
[    8.353773] systemd[1]: Successfully loaded SELinux policy in 165ms 166u=
s.=0D
[    8.451859] systemd[1]: Successfully loaded SELinux database in 77ms 139=
us, size on heap is 475K.=0D
[    8.509781] systemd[1]: RTC configured in localtime, applying delta of 1=
20 minutes to system time.=0D
[    8.660676] systemd[1]: Relabelled /dev and /run in 87ms 636us.=0D
[    8.689704] systemd[1]: systemd 36 running in system mode. (+PAM +LIBWRA=
P +AUDIT +SELINUX +SYSVINIT +LIBCRYPTSETUP; fedora)=0D
=0D=0D
Welcome to =1B[0;34mFedora release 16 (Verne)=1B[0m!=0D=0D
=0D=0D
[    8.755902] systemd[1]: Set hostname to <f16test64hvm.localdomain>.=0D
Starting Collect Read-Ahead Data...=0D=0D
Started Replay Read-Ahead Data.=0D=0D
Starting Media Directory...=0D=0D
[    9.215716] systemd-readahead-collect[402]: Disabling readahead collecto=
r due to execution in virtualized environment.=0D
Started Lock Directory.=0D=0D
Started Runtime Directory.=0D=0D
Starting Debug File System...=0D=0D
Starting POSIX Message Queue File System...=0D=0D
Starting Security File System...=0D=0D
Starting Huge Pages File System...=0D=0D
Starting udev Coldplug all Devices...=0D=0D
Starting udev Kernel Device Manager...=0D=0D
Starting Syslog Kernel Log Buffer Bridge...=0D=0D
Started Syslog Kernel Log Buffer Bridge.=0D=0D
[    9.410090] udevd[410]: starting version 173=0D
Started udev Kernel Device Manager.=0D=0D
Started Collect Read-Ahead Data.=0D=0D
Started Load legacy module configuration.=0D=0D
Started File System Check on Root Device.=0D=0D
Starting Remount API VFS...=0D=0D
Starting Remount Root FS...=0D=0D
Started Set Up Additional Binary Formats.=0D=0D
Started Load Kernel Modules.=0D=0D
Started FUSE Control File System.=0D=0D
Started Configuration File System.=0D=0D
Starting Apply Kernel Variables...=0D=0D
Starting Setup Virtual Console...=0D=0D
Starting STDOUT Syslog Bridge...=0D=0D
Started STDOUT Syslog Bridge.=0D=0D
Started udev Coldplug all Devices.=0D=0D
Started Remount API VFS.=0D=0D
Started Apply Kernel Variables.=0D=0D
Starting udev Wait for Complete Device Initialization...=0D=0D
Started Security File System.=0D=0D
Started POSIX Message Queue File System.=0D=0D
Started Debug File System.=0D=0D
Started Huge Pages File System.=0D=0D
[    9.798875] EXT4-fs (dm-1): re-mounted. Opts: (null)=0D
Started Media Directory.=0D=0D
Started Remount Root FS.=0D=0D
Starting Configure read-only root support...=0D=0D
Started Configure read-only root support.=0D=0D
Started Setup Virtual Console.=0D=0D
Starting /dev/mapper/vg_f16test64hvm-lv_swap...=0D=0D
[   10.958370] Adding 2064380k swap on /dev/mapper/vg_f16test64hvm-lv_swap.=
  Priority:0 extents:1 across:2064380k =0D
Started /dev/mapper/vg_f16test64hvm-lv_swap.=0D=0D
[   11.009608] piix4_smbus 0000:00:01.3: SMBus base address uninitialized -=
 upgrade BIOS or use force_addr=3D0xaddr=0D
[   11.038011] parport_pc 00:0b: reported by Plug and Play ACPI=0D
[   11.047803] parport0: PC-style at 0x378, irq 7 [PCSPP,TRISTATE]=0D
[   11.094629] 8139cp: 8139cp: 10/100 PCI Ethernet driver v1.3 (Mar 22, 200=
4)=0D
[   11.125422] 8139cp 0000:00:03.0: PCI INT A -> GSI 28 (level, low) -> IRQ=
 28=0D
[   11.160994] 8139cp 0000:00:03.0: eth0: RTL-8139C+ at 0xffffc9000019e000,=
 00:16:3f:03:01:14, IRQ 28=0D
[   11.186450] ppdev: user-space parallel port driver=0D
Starting File System Check on /dev/disk/by-uuid/6d0e406a-ac9c-443d-a84c-34d=
0cc56d2a2...=0D[   11.279756] 8139too: 8139too Fast Ethernet driver 0.9.28=
=0D
=0D
Started udev Wait for Complete Device Initialization.[   11.449395] rmmod[5=
98]: ERROR: Module scsi_wait_scan does not exist in /proc/modules=0D
=0D=0D
Started Show Plymouth Boot Screen.=0D=0D
Starting Wait for storage scan...=0D=0D
Started Wait for storage scan.=0D=0D
Starting Initialize storage subsystems (RAID, LVM, etc.)...=0D=0D
systemd-fsck[   11.727436] systemd-fsck[591]: /dev/sda2: recovering journal=
=0D
[591]: /dev/sda2: recovering journal=0D=0D
systemd-fsck[591]: /dev/sda2: clean, 219/128016 files, 48307/512000 blocks[=
   11.841965] systemd-fsck[591]: /dev/sda2: clean, 219/128016 files, 48307/=
512000 blocks=0D
=0D=0D
Started File System Check on /dev/disk/by-uuid/6d0e406a-ac9c-443d-a84c-34d0=
cc56d2a2.=0D=0D
Starting /boot...=0D=0D
[   12.185717] EXT4-fs (sda2): mounted filesystem with ordered data mode. O=
pts: (null)=0D
Started /boot.=0D=0D
[   12.462997] fedora-storage-init[604]: Setting up Logical Volume Manageme=
nt:   2 logical volume(s) in volume group "vg_f16test64hvm" now active=0D
Started Initialize storage subsystems (RAID, LVM, etc.).=0D=0D
Starting Initialize storage subsystems (RAID, LVM, etc.)...=0D=0D
[   12.528806] fedora-storage-init[604]: [  OK  ]=0D
[   12.639613] fedora-storage-init[618]: Setting up Logical Volume Manageme=
nt:   2 logical volume(s) in volume group "vg_f16test64hvm" now active=0D
Started Initialize storage subsystems (RAID, LVM, etc.).=0D=0D
Starting Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progr=
ess polling...=0D=0D
[   12.787931] fedora-storage-init[618]: [  OK  ]=0D
[   12.857150] lvm[624]: 2 logical volume(s) in volume group "vg_f16test64h=
vm" monitored=0D
Started Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progre=
ss polling.=0D=0D
Started Mark the need to relabel after reboot.=0D=0D
Started Relabel all filesystems, if necessary.=0D=0D
Started Reconfigure the system on administrator request.=0D=0D
Starting Load Random Seed...=0D=0D
Starting Tell Plymouth To Write Out Runtime Data...=0D=0D
Starting Recreate Volatile Files and Directories...=0D=0D
Started Load Random Seed.=0D=0D
[   13.065835] systemd-tmpfiles[629]: Successfully loaded SELinux database =
in 36ms 529us, size on heap is 476K.=0D
Started Tell Plymouth To Write Out Runtime Data.=0D=0D
Started Recreate Volatile Files and Directories.=0D=0D
Starting LSB: Mount and unmount network filesystems....=0D=0D
Starting IPv4 firewall with iptables...=0D=0D
Starting IPv6 firewall with ip6tables...=0D=0D
Starting Security Auditing Service...=0D=0D
Starting SSH server keys generation....=0D[   13.419101] auditd[635]: Start=
ed dispatcher: /sbin/audispd pid: 645=0D
=0D
Starting Sendmail Mail Transport Agent...=0D=0D
Starting System Logging Service...=0D=0D
Starting Login Service...=0D=0D
Started /etc/rc.local Compatibility.=0D=0D
Starting Wait for Plymouth Boot Screen to Quit...=0D=0D
Starting Terminate Plymouth Boot Screen...=0D=0D
Starting D-Bus System Message Bus...=0D=0D
Stopping Syslog Kernel Log Buffer Bridge...=0D=0D
[   14.410603] nf_conntrack version 0.5.0 (7964 buckets, 31856 max)=0D
[   14.418528] ip6_tables: (C) 2000-2006 Netfilter Core Team=0D
[   28.998481] 8139cp 0000:00:03.0: eth0: link up, 100Mbps, full-duplex, lp=
a 0x05E1=0D
[  149.712071] ------------[ cut here ]------------=0D
[  149.717216] WARNING: at net/sched/sch_generic.c:255 dev_watchdog+0xf0/0x=
150()=0D
[  149.724709] Hardware name: HVM domU=0D
[  149.728738] NETDEV WATCHDOG: eth0 (8139cp): transmit queue 0 timed out=0D
[  149.735537] Modules linked in: ip6t_REJECT nf_conntrack_ipv6 nf_defrag_i=
pv6 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 j=
oydev [last unloaded: scsi_wait_scan]=0D
[  149.768028] Pid: 0, comm: swapper Not tainted 3.1.0-5.fc16.x86_64 #1=0D
[  149.774639] Call Trace:=0D
[  149.777765]  <IRQ>  [<ffffffff81057a56>] warn_slowpath_common+0x83/0x9b=
=0D
[  149.784024]  [<ffffffff81057b11>] warn_slowpath_fmt+0x46/0x48=0D
[  149.790141]  [<ffffffff813ef49d>] ? netif_tx_lock+0x4a/0x7c=0D
[  149.799007]  [<ffffffff813ef613>] dev_watchdog+0xf0/0x150=0D
[  149.806361]  [<ffffffff81064b51>] run_timer_softirq+0x19b/0x280=0D
[  149.814392]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd=0D
[  149.821650]  [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54=0D
[  149.828926]  [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5=0D
[  149.836803]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd=0D
[  149.843422]  [<ffffffff814be5ec>] call_softirq+0x1c/0x30=0D
[  149.850067]  [<ffffffff81010b45>] do_softirq+0x46/0x81=0D
[  149.856760]  [<ffffffff8105d97b>] irq_exit+0x57/0xb1=0D
[  149.863035]  [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x3e=0D
[  149.871144]  [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e/0x80=0D
[  149.879494]  <EOI>  [<ffffffff8102f2f1>] ? native_safe_halt+0xb/0xd=0D
[  149.888220]  [<ffffffff81015b7e>] default_idle+0x4e/0x86=0D
[  149.894962]  [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8=0D
[  149.901461]  [<ffffffff814934ee>] rest_init+0x72/0x74=0D
[  149.908949]  [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6=0D
[  149.916617]  [<ffffffff81b762c4>] x86_64_start_reservations+0xaf/0xb3=0D
[  149.929148]  [<ffffffff81b76140>] ? early_idt_handlers+0x140/0x140=0D
[  149.936797]  [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x111=0D
[  149.944336] ---[ end trace d8786cb7d6a57f8a ]---=0D
[  149.950406] 8139cp 0000:00:03.0: eth0: Transmit timeout, status  d   3b =
  15 80ff=0D
[  149.961879] ------------[ cut here ]------------=0D
[  149.962245] WARNING: at kernel/softirq.c:159 _local_bh_enable_ip+0x44/0x=
8e()=0D
[  149.962245] Hardware name: HVM domU=0D
[  149.962245] Modules linked in: ip6t_REJECT nf_conntrack_ipv6 nf_defrag_i=
pv6 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 j=
oydev [last unloaded: scsi_wait_scan]=0D
[  149.962245] Pid: 0, comm: swapper Tainted: G        W   3.1.0-5.fc16.x86=
_64 #1=0D
[  149.962245] Call Trace:=0D
[  149.962245]  <IRQ>  [<ffffffff81057a56>] warn_slowpath_common+0x83/0x9b=
=0D
[  149.962245]  [<ffffffff813ce599>] ? skb_release_data+0xca/0xcf=0D
[  149.962245]  [<ffffffff81057a88>] warn_slowpath_null+0x1a/0x1c=0D
[  149.962245]  [<ffffffff8105d462>] _local_bh_enable_ip+0x44/0x8e=0D
[  149.962245]  [<ffffffff8105d4ba>] local_bh_enable_ip+0xe/0x10=0D
[  149.962245]  [<ffffffff814b5db4>] _raw_spin_unlock_bh+0x15/0x17=0D
[  149.962245]  [<ffffffffa0053969>] destroy_conntrack+0x9d/0xdc [nf_conntr=
ack]=0D
[  149.962245]  [<ffffffff813fa343>] nf_conntrack_destroy+0x19/0x1b=0D
[  149.962245]  [<ffffffff813ce7ad>] skb_release_head_state+0xa7/0xef=0D
[  149.962245]  [<ffffffff813ce5b1>] __kfree_skb+0x13/0x83=0D
[  149.962245]  [<ffffffff813ce677>] consume_skb+0x56/0x6b=0D
[  149.962245]  [<ffffffffa003c1b9>] cp_clean_rings+0xb4/0x114 [8139cp]=0D
[  149.962245]  [<ffffffffa003c371>] cp_tx_timeout+0x88/0x10e [8139cp]=0D
[  149.962245]  [<ffffffff813ef627>] dev_watchdog+0x104/0x150=0D
[  149.962245]  [<ffffffff81064b51>] run_timer_softirq+0x19b/0x280=0D
[  149.962245]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd=0D
[  149.962245]  [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54=0D
[  149.962245]  [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5=0D
[  149.962245]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd=0D
[  149.962245]  [<ffffffff814be5ec>] call_softirq+0x1c/0x30=0D
[  149.962245]  [<ffffffff81010b45>] do_softirq+0x46/0x81=0D
[  149.962245]  [<ffffffff8105d97b>] irq_exit+0x57/0xb1=0D
[  149.962245]  [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x3e=0D
[  149.962245]  [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e/0x80=0D
[  149.962245]  <EOI>  [<ffffffff8102f2f1>] ? native_safe_halt+0xb/0xd=0D
[  149.962245]  [<ffffffff81015b7e>] default_idle+0x4e/0x86=0D
[  149.962245]  [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8=0D
[  149.962245]  [<ffffffff814934ee>] rest_init+0x72/0x74=0D
[  149.962245]  [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6=0D
[  149.962245]  [<ffffffff81b762c4>] x86_64_start_reservations+0xaf/0xb3=0D
[  149.962245]  [<ffffffff81b76140>] ? early_idt_handlers+0x140/0x140=0D
[  149.962245]  [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x111=0D
[  149.962245] ---[ end trace d8786cb7d6a57f8b ]---=0D

--RASg3xLB4tUQ4RcS
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

--RASg3xLB4tUQ4RcS--


From xen-devel-bounces@lists.xensource.com Mon Oct 31 11:53:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 11:53:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKwyo-0004He-T1; Mon, 31 Oct 2011 11:53:07 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKwyH-00045L-VY
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 11:52:35 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-10.tower-27.messagelabs.com!1320087120!42112892!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6901 invoked from network); 31 Oct 2011 18:52:02 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-10.tower-27.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 31 Oct 2011 18:52:02 -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 32C4A24F1;
	Mon, 31 Oct 2011 20:52:27 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 194E420057; Mon, 31 Oct 2011 20:52:27 +0200 (EET)
Date: Mon, 31 Oct 2011 20:52:27 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] Xen 4.1.2 HVM guest realtek nic problems (eth0
	8139cp transmit queue timed out)
Message-ID: <20111031185227.GB12984@reaktio.net>
References: <20111031184907.GA12984@reaktio.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable
In-Reply-To: <20111031184907.GA12984@reaktio.net>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen@lists.fedoraproject.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


And added fedora xen mailinglist to CC aswell..

On Mon, Oct 31, 2011 at 08:49:07PM +0200, Pasi K=E4rkk=E4inen wrote:
> Hello,
>=20
> 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):
>=20
> The errors (call trace) happens pretty much immediately when there's some=
 network traffic going on..
>=20
> Simple "yum update" in the VM triggers the problem..
>=20
>=20
> [    0.000000] Linux version 3.1.0-5.fc16.x86_64 (mockbuild@x86-10.phx2.f=
edoraproject.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 ro=
ot=3D/dev/mapper/vg_f16test64hvm-lv_root ro rd.lvm.lv=3Dvg_f16test64hvm/lv_=
root rd.dm=3D0 SYSFONT=3Dlatarcyrheb-sun16 rhgb KEYTABLE=3Dfi rd.md=3D0 rd.=
luks=3D0 rd.lvm.lv=3Dvg_f16test64hvm/lv_swap LANG=3Den_US.UTF-8 console=3Dt=
tyS0,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 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   3=
b   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.x=
86_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_conn=
track]
> [  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 ]---
>=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 kernel.
>=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-1=
6-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
>=20
> Using "model=3De1000" instead for the vif works OK.. no problems with the=
 emulated intel nic.
>=20
> Any ideas what the problem with the emulated realtek nic?=20
>=20
> Thanks,
>=20
>=20
> -- Pasi
>=20

> [    0.000000] Initializing cgroup subsys cpuset=0D
> [    0.000000] Initializing cgroup subsys cpu=0D
> [    0.000000] Linux version 3.1.0-5.fc16.x86_64 (mockbuild@x86-10.phx2.f=
edoraproject.org) (gcc version 4.6.1 20111003 (Red Hat 4.6.1-10) (GCC) ) #1=
 SMP Thu Oct 27 03:46:50 UTC 2011=0D
> [    0.000000] Command line: BOOT_IMAGE=3D/vmlinuz-3.1.0-5.fc16.x86_64 ro=
ot=3D/dev/mapper/vg_f16test64hvm-lv_root ro rd.lvm.lv=3Dvg_f16test64hvm/lv_=
root rd.dm=3D0 SYSFONT=3Dlatarcyrheb-sun16 rhgb KEYTABLE=3Dfi rd.md=3D0 rd.=
luks=3D0 rd.lvm.lv=3Dvg_f16test64hvm/lv_swap LANG=3Den_US.UTF-8 console=3Dt=
tyS0,38400 console=3Dtty0=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] Using x86 segment limits to approximate NX protection=0D
> [    0.000000] DMI 2.4 present.=0D
> [    0.000000] Hypervisor detected: Xen HVM=0D
> [    0.000000] Xen version 4.1.=0D
> [    0.000000] Xen Platform PCI: unrecognised magic value=0D
> [    0.000000] No AGP bridge found=0D
> [    0.000000] last_pfn =3D 0x40000 max_arch_pfn =3D 0x400000000=0D
> [    0.000000] x86 PAT enabled: cpu 0, old 0x7040600070406, new 0x7010600=
070106=0D
> [    0.000000] found SMP MP-table at [ffff8800000fbc70] fbc70=0D
> [    0.000000] init_memory_mapping: 0000000000000000-0000000040000000=0D
> [    0.000000] RAMDISK: 36608000 - 372fc000=0D
> [    0.000000] ACPI: RSDP 00000000000ea020 00024 (v02    Xen)=0D
> [    0.000000] ACPI: XSDT 00000000fc0134b0 00034 (v01    Xen      HVM 000=
00000 HVML 00000000)=0D
> [    0.000000] ACPI: FACP 00000000fc0132d0 000F4 (v04    Xen      HVM 000=
00000 HVML 00000000)=0D
> [    0.000000] ACPI: DSDT 00000000fc003440 0FE05 (v02    Xen      HVM 000=
00000 INTL 20100528)=0D
> [    0.000000] ACPI: FACS 00000000fc003400 00040=0D
> [    0.000000] ACPI: APIC 00000000fc0133d0 000D8 (v02    Xen      HVM 000=
00000 HVML 00000000)=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] 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] ACPI: PM-Timer IO Port: 0xb008=0D
> [    0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)=0D
> [    0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x02] disabled)=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 leve=
l)=0D
> [    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 low leve=
l)=0D
> [    0.000000] Using ACPI (MADT) for SMP configuration information=0D
> [    0.000000] SMP: Allowing 15 CPUs, 14 hotplug CPUs=0D
> [    0.000000] PM: Registered nosave memory: 000000000009e000 - 000000000=
00a0000=0D
> [    0.000000] PM: Registered nosave memory: 00000000000a0000 - 000000000=
00e0000=0D
> [    0.000000] PM: Registered nosave memory: 00000000000e0000 - 000000000=
0100000=0D
> [    0.000000] Allocating PCI resources starting at 40000000 (gap: 400000=
00: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:1=
5 nr_node_ids:1=0D
> [    0.000000] PERCPU: Embedded 27 pages/cpu @ffff88003fc00000 s81024 r81=
92 d21376 u131072=0D
> [    0.000000] Built 1 zonelists in Node order, mobility grouping on.  To=
tal pages: 257929=0D
> [    0.000000] Policy zone: DMA32=0D
> [    0.000000] Kernel command line: BOOT_IMAGE=3D/vmlinuz-3.1.0-5.fc16.x8=
6_64 root=3D/dev/mapper/vg_f16test64hvm-lv_root ro rd.lvm.lv=3Dvg_f16test64=
hvm/lv_root rd.dm=3D0 SYSFONT=3Dlatarcyrheb-sun16 rhgb KEYTABLE=3Dfi rd.md=
=3D0 rd.luks=3D0 rd.lvm.lv=3Dvg_f16test64hvm/lv_swap LANG=3Den_US.UTF-8 con=
sole=3DttyS0,38400 console=3Dtty0=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] Memory: 1002468k/1048576k available (4867k kernel code, 45=
6k absent, 45652k reserved, 6782k 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 [tty0] enabled=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 w=
ant memory cgroups=0D
> [    0.000000] Detected 2677.244 MHz processor.=0D
> [    0.005999] Calibrating delay loop (skipped), value calculated using t=
imer frequency.. 5354.48 BogoMIPS (lpj=3D2677244)=0D
> [    0.015004] pid_max: default: 32768 minimum: 301=0D
> [    0.021037] Security Framework initialized=0D
> [    0.025012] SELinux:  Initializing.=0D
> [    0.030209] Dentry cache hash table entries: 131072 (order: 8, 1048576=
 bytes)=0D
> [    0.039268] Inode-cache hash table entries: 65536 (order: 7, 524288 by=
tes)=0D
> [    0.047115] Mount-cache hash table entries: 256=0D
> [    0.051161] Initializing cgroup subsys cpuacct=0D
> [    0.056007] Initializing cgroup subsys memory=0D
> [    0.060013] Initializing cgroup subsys devices=0D
> [    0.063998] Initializing cgroup subsys freezer=0D
> [    0.071007] Initializing cgroup subsys net_cls=0D
> [    0.077002] Initializing cgroup subsys blkio=0D
> [    0.092016] Initializing cgroup subsys perf_event=0D
> [    0.097110] CPU: Physical Processor ID: 0=0D
> [    0.105998] CPU: Processor Core ID: 0=0D
> [    0.114998] mce: CPU supports 9 MCE banks=0D
> [    0.120027] SMP alternatives: switching to UP code=0D
> [    0.137406] ACPI: Core revision 20110623=0D
> [    0.154723] ftrace: allocating 25204 entries in 99 pages=0D
> [    0.203985] Not enabling x2apic, Intr-remapping init failed.=0D
> [    0.212983] Switched APIC routing to physical flat.=0D
> [    0.227511] ..TIMER: vector=3D0x30 apic1=3D0 pin1=3D2 apic2=3D0 pin2=
=3D0=0D
> [    0.247910] CPU0: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz step=
ping 05=0D
> [    0.266997] installing Xen timer for CPU 0=0D
> [    0.279095] Performance Events: unsupported p6 CPU model 37 no PMU dri=
ver, software events only.=0D
> [    0.288052] NMI watchdog disabled (cpu0): hardware events not enabled=
=0D
> [    0.289014] Brought up 1 CPUs=0D
> [    0.289980] Total of 1 processors activated (5354.48 BogoMIPS).=0D
> [    0.295080] devtmpfs: initialized=0D
> [    0.334074] atomic64 test passed for x86-64 platform with CX8 and with=
 SSE=0D
> [    0.335009] RTC time: 18:48:31, date: 10/31/11=0D
> [    0.336031] NET: Registered protocol family 16=0D
> [    0.340028] ACPI: bus type pci registered=0D
> [    0.343066] PCI: Using configuration type 1 for base access=0D
> [    0.352055] bio: create slab <bio-0> at 0=0D
> [    0.354016] ACPI: Added _OSI(Module Device)=0D
> [    0.354986] ACPI: Added _OSI(Processor Device)=0D
> [    0.355988] ACPI: Added _OSI(3.0 _SCP Extensions)=0D
> [    0.356976] ACPI: Added _OSI(Processor Aggregator Device)=0D
> [    0.461035] ACPI: Interpreter enabled=0D
> [    0.461960] ACPI: (supports S0 S3 S4 S5)=0D
> [    0.466962] ACPI: Using IOAPIC for interrupt routing=0D
> [    1.042887] ACPI: No dock devices found.=0D
> [    1.043879] HEST: Table not found.=0D
> [    1.044874] PCI: Using host bridge windows from ACPI; if necessary, us=
e "pci=3Dnocrs" and report a bug=0D
> [    1.045996] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])=0D
> [    1.047922] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7=
]=0D
> [    1.048872] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff=
]=0D
> [    1.049876] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x=
000bffff]=0D
> [    1.050885] pci_root PNP0A03:00: host bridge window [mem 0xf0000000-0x=
fbffffff]=0D
> [    1.148854] * Found PM-Timer Bug on the chipset. Due to workarounds fo=
r a bug,=0D
> [    1.148856] * this clock source is slow. Consider trying other clock s=
ources=0D
> [    1.174862] pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PI=
IX4 ACPI=0D
> [    1.249999]  pci0000:00: Unable to request _OSC control (_OSC support =
mask: 0x1e)=0D
> [    1.988937] ACPI: PCI Interrupt Link [LNKA] (IRQs *5 10 11)=0D
> [    1.995734] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)=0D
> [    2.002022] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)=0D
> [    2.007986] ACPI: PCI Interrupt Link [LNKD] (IRQs *5 10 11)=0D
> [    2.013926] xen/balloon: Initialising balloon driver.=0D
> [    2.014721] last_pfn =3D 0x40000 max_arch_pfn =3D 0x400000000=0D
> [    2.015744] xen-balloon: Initialising balloon driver.=0D
> [    2.016893] vgaarb: device added: PCI:0000:00:02.0,decodes=3Dio+mem,ow=
ns=3Dio+mem,locks=3Dnone=0D
> [    2.017723] vgaarb: loaded=0D
> [    2.018717] vgaarb: bridge control possible 0000:00:02.0=0D
> [    2.019908] SCSI subsystem initialized=0D
> [    2.020926] usbcore: registered new interface driver usbfs=0D
> [    2.021751] usbcore: registered new interface driver hub=0D
> [    2.022778] usbcore: registered new device driver usb=0D
> [    2.023833] PCI: Using ACPI for IRQ routing=0D
> [    2.027000] NetLabel: Initializing=0D
> [    2.027726] NetLabel:  domain hash size =3D 128=0D
> [    2.028719] NetLabel:  protocols =3D UNLABELED CIPSOv4=0D
> [    2.029771] NetLabel:  unlabeled traffic allowed by default=0D
> [    2.030738] Switching to clocksource xen=0D
> [    2.032064] Switched to NOHz mode on CPU #0=0D
> [    2.058600] pnp: PnP ACPI init=0D
> [    2.070312] ACPI: bus type pnp registered=0D
> [    2.081358] system 00:00: [mem 0x00000000-0x0009ffff] could not be res=
erved=0D
> [    2.105526] system 00:02: [io  0x10c0-0x1141] has been reserved=0D
> [    2.123586] system 00:02: [io  0xb044-0xb047] has been reserved=0D
> [    2.140716] system 00:03: [io  0x08a0-0x08a3] has been reserved=0D
> [    2.155376] system 00:03: [io  0x0cc0-0x0ccf] has been reserved=0D
> [    2.171720] system 00:03: [io  0x04d0-0x04d1] has been reserved=0D
> [    2.235079] pnp: PnP ACPI: found 12 devices=0D
> [    2.239980] ACPI: ACPI bus type pnp unregistered=0D
> [    2.252651] NET: Registered protocol family 2=0D
> [    2.262951] IP route cache hash table entries: 32768 (order: 6, 262144=
 bytes)=0D
> [    2.271095] TCP established hash table entries: 131072 (order: 9, 2097=
152 bytes)=0D
> [    2.282685] TCP bind hash table entries: 65536 (order: 8, 1048576 byte=
s)=0D
> [    2.293164] TCP: Hash tables configured (established 131072 bind 65536=
)=0D
> [    2.302409] TCP reno registered=0D
> [    2.307217] UDP hash table entries: 512 (order: 2, 16384 bytes)=0D
> [    2.317125] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)=0D
> [    2.326389] NET: Registered protocol family 1=0D
> [    2.331960] pci 0000:00:00.0: Limiting direct PCI/PCI transfers=0D
> [    2.341391] pci 0000:00:01.0: PIIX3: Enabling Passive Release=0D
> [    2.353138] pci 0000:00:01.0: Activating ISA DMA hang workarounds=0D
> [    2.361559] Unpacking initramfs...=0D
> [    2.699968] Freeing initrd memory: 13264k freed=0D
> [    2.710147] alg: No test for __gcm-aes-aesni (__driver-gcm-aes-aesni)=
=0D
> [    2.717216] audit: initializing netlink socket (disabled)=0D
> [    2.722974] type=3D2000 audit(1320086915.409:1): initialized=0D
> [    2.752235] HugeTLB registered 2 MB page size, pre-allocated 0 pages=0D
> [    2.764915] VFS: Disk quotas dquot_6.5.2=0D
> [    2.769491] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)=
=0D
> [    2.776668] msgmni has been set to 1983=0D
> [    2.781504] alg: No test for stdrng (krng)=0D
> [    2.787102] NET: Registered protocol family 38=0D
> [    2.792422] Block layer SCSI generic (bsg) driver version 0.4 loaded (=
major 253)=0D
> [    2.801199] io scheduler noop registered=0D
> [    2.806077] io scheduler deadline registered=0D
> [    2.811278] io scheduler cfq registered (default)=0D
> [    2.818821] pci_hotplug: PCI Hot Plug PCI Core version: 0.5=0D
> [    2.825681] pciehp: PCI Express Hot Plug Controller Driver version: 0.=
4=0D
> [    2.831486] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5=
=0D
> [    2.838723] acpiphp: Slot [0] registered=0D
> [    2.842985] acpiphp: Slot [1] registered=0D
> [    2.847352] acpiphp: Slot [2] registered=0D
> [    2.851192] acpiphp: Slot [3] registered=0D
> [    2.855526] acpiphp: Slot [4] registered=0D
> [    2.859987] acpiphp: Slot [5] registered=0D
> [    2.865216] acpiphp: Slot [6] registered=0D
> [    2.870721] acpiphp: Slot [7] registered=0D
> [    2.875193] acpiphp: Slot [8] registered=0D
> [    2.882170] acpiphp: Slot [9] registered=0D
> [    2.887602] acpiphp: Slot [10] registered=0D
> [    2.893553] acpiphp: Slot [11] registered=0D
> [    2.901005] acpiphp: Slot [12] registered=0D
> [    2.909484] acpiphp: Slot [13] registered=0D
> [    2.927108] acpiphp: Slot [14] registered=0D
> [    2.936646] acpiphp: Slot [15] registered=0D
> [    2.947352] acpiphp: Slot [16] registered=0D
> [    2.959370] acpiphp: Slot [17] registered=0D
> [    2.975306] acpiphp: Slot [18] registered=0D
> [    2.986962] acpiphp: Slot [19] registered=0D
> [    2.998507] acpiphp: Slot [20] registered=0D
> [    3.008809] acpiphp: Slot [21] registered=0D
> [    3.019088] acpiphp: Slot [22] registered=0D
> [    3.028701] acpiphp: Slot [23] registered=0D
> [    3.041087] acpiphp: Slot [24] registered=0D
> [    3.054701] acpiphp: Slot [25] registered=0D
> [    3.088485] acpiphp: Slot [26] registered=0D
> [    3.096559] acpiphp: Slot [27] registered=0D
> [    3.104123] acpiphp: Slot [28] registered=0D
> [    3.112335] acpiphp: Slot [29] registered=0D
> [    3.120729] acpiphp: Slot [30] registered=0D
> [    3.128063] acpiphp: Slot [31] registered=0D
> [    3.140336] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/in=
put/input0=0D
> [    3.152824] ACPI: Power Button [PWRF]=0D
> [    3.159164] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/in=
put/input1=0D
> [    3.170535] ACPI: Sleep Button [SLPF]=0D
> [    3.240741] ERST: Table is not found!=0D
> [    3.247178] GHES: HEST is not enabled!=0D
> [    3.255081] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled=0D
> [    3.299342] serial8250: ttyS0 at I/O 0x3f8 (irq =3D 4) is a 16550A=0D
> [    3.339144] 00:0a: ttyS0 at I/O 0x3f8 (irq =3D 4) is a 16550A=0D
> [    3.348389] Non-volatile memory driver v1.3=0D
> [    3.359031] Linux agpgart interface v0.103=0D
> [    3.373452] loop: module loaded=0D
> [    3.380620] scsi0 : ata_piix=0D
> [    3.385158] scsi1 : ata_piix=0D
> [    3.392804] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc120 irq=
 14=0D
> [    3.406093] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc128 irq=
 15=0D
> [    3.424665] Fixed MDIO Bus: probed=0D
> [    3.432049] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver=
=0D
> [    3.452302] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver=0D
> [    3.465814] uhci_hcd: USB Universal Host Controller Interface driver=0D
> [    3.480645] uhci_hcd 0000:00:01.2: PCI INT D -> GSI 23 (level, low) ->=
 IRQ 23=0D
> [    3.495010] uhci_hcd 0000:00:01.2: UHCI Host Controller=0D
> [    3.509922] uhci_hcd 0000:00:01.2: new USB bus registered, assigned bu=
s number 1=0D
> [    3.532921] uhci_hcd 0000:00:01.2: irq 23, io base 0x0000c100=0D
> [    3.556237] usb usb1: New USB device found, idVendor=3D1d6b, idProduct=
=3D0001=0D
> [    3.577164] usb usb1: New USB device strings: Mfr=3D3, Product=3D2, Se=
rialNumber=3D1=0D
> [    3.597277] usb usb1: Product: UHCI Host Controller=0D
> [    3.609990] usb usb1: Manufacturer: Linux 3.1.0-5.fc16.x86_64 uhci_hcd=
=0D
> [    3.623617] usb usb1: SerialNumber: 0000:00:01.2=0D
> [    3.633485] hub 1-0:1.0: USB hub found=0D
> [    3.641829] hub 1-0:1.0: 2 ports detected=0D
> [    3.654394] usbcore: registered new interface driver usbserial=0D
> [    3.834631] Refined TSC clocksource calibration: 2677.188 MHz.=0D
> [    3.849203] ata2.00: ATAPI: QEMU DVD-ROM, 0.10.2, max UDMA/100=0D
> [    3.860117] ata1.00: ATA-7: QEMU HARDDISK, 0.10.2, max UDMA/100=0D
> [    3.867830] ata1.00: 62914560 sectors, multi 16: LBA48 =0D
> [    3.880575] ata2.00: configured for MWDMA2=0D
> [    3.888438] ata1.00: configured for MWDMA2=0D
> [    3.897324] scsi 0:0:0:0: Direct-Access     ATA      QEMU HARDDISK    =
0.10 PQ: 0 ANSI: 5=0D
> [    3.909309] sd 0:0:0:0: Attached scsi generic sg0 type 0=0D
> [    3.921146] scsi 1:0:0:0: CD-ROM            QEMU     QEMU DVD-ROM     =
0.10 PQ: 0 ANSI: 5=0D
> [    3.940204] sd 0:0:0:0: [sda] 62914560 512-byte logical blocks: (32.2 =
GB/30.0 GiB)=0D
> [    3.953575] sr0: scsi3-mmc drive: 4x/4x xa/form2 tray=0D
> [    3.972245] cdrom: Uniform CD-ROM driver Revision: 3.20=0D
> [    3.985565] sd 0:0:0:0: [sda] Write Protect is off=0D
> [    3.995242] sr 1:0:0:0: Attached scsi generic sg1 type 5=0D
> [    4.003515] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabl=
ed, doesn't support DPO or FUA=0D
> [    4.030638] USB Serial support registered for generic=0D
> [    4.071098] usb 1-2: new full speed USB device number 2 using uhci_hcd=
=0D
> [    4.116603]  sda: sda1 sda2 sda3=0D
> [    4.122784] sd 0:0:0:0: [sda] Attached SCSI disk=0D
> [    4.279332] usb 1-2: New USB device found, idVendor=3D0627, idProduct=
=3D0001=0D
> [    4.285003] usb 1-2: New USB device strings: Mfr=3D3, Product=3D2, Ser=
ialNumber=3D1=0D
> [    4.291626] usb 1-2: Product: QEMU USB Tablet=0D
> [    4.296035] usb 1-2: Manufacturer: QEMU 0.10.2=0D
> [    4.301072] usb 1-2: SerialNumber: 1=0D
> [    4.327941] usbcore: registered new interface driver usbserial_generic=
=0D
> [    4.334045] usbserial: USB Serial Driver core=0D
> [    4.338689] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at=
 0x60,0x64 irq 1,12=0D
> [    4.356131] serio: i8042 KBD port at 0x60,0x64 irq 1=0D
> [    4.365819] serio: i8042 AUX port at 0x60,0x64 irq 12=0D
> [    4.377814] mousedev: PS/2 mouse device common for all mice=0D
> [    4.391350] input: AT Translated Set 2 keyboard as /devices/platform/i=
8042/serio0/input/input2=0D
> [    4.409931] rtc_cmos 00:05: rtc core: registered rtc_cmos as rtc0=0D
> [    4.423898] rtc0: alarms up to one day, 114 bytes nvram=0D
> [    4.435841] device-mapper: uevent: version 1.0.3=0D
> [    4.449590] device-mapper: ioctl: 4.21.0-ioctl (2011-07-06) initialise=
d: dm-devel@redhat.com=0D
> [    4.495727] cpuidle: using governor ladder=0D
> [    4.504718] cpuidle: using governor menu=0D
> [    4.513536] EFI Variables Facility v0.08 2004-May-17=0D
> [    4.552133] input: QEMU 0.10.2 QEMU USB Tablet as /devices/pci0000:00/=
0000:00:01.2/usb1/1-2/1-2:1.0/input/input3=0D
> [    4.574945] generic-usb 0003:0627:0001.0001: input,hidraw0: USB HID v0=
=2E01 Pointer [QEMU 0.10.2 QEMU USB Tablet] on usb-0000:00:01.2-2/input0=0D
> [    4.604382] usbcore: registered new interface driver usbhid=0D
> [    4.615480] usbhid: USB HID core driver=0D
> [    4.632689] ip_tables: (C) 2000-2006 Netfilter Core Team=0D
> [    4.642932] TCP cubic registered=0D
> [    4.650070] Initializing XFRM netlink socket=0D
> [    4.659989] NET: Registered protocol family 10=0D
> [    4.670710] Mobile IPv6=0D
> [    4.676439] NET: Registered protocol family 17=0D
> [    4.686698] Registering the dns_resolver key type=0D
> [    4.698703] registered taskstats version 1=0D
> [    4.710470] IMA: No TPM chip found, activating TPM-bypass!=0D
> [    4.727752]   Magic number: 15:53:849=0D
> [    4.737301] graphics fbcon: hash matches=0D
> [    4.747845] rtc_cmos 00:05: setting system clock to 2011-10-31 18:48:3=
5 UTC (1320086915)=0D
> [    4.766933] Initializing network drop monitor service=0D
> [    4.778567] Freeing unused kernel memory: 940k freed=0D
> [    4.790390] Write protecting the kernel read-only data: 10240k=0D
> [    4.816829] Freeing unused kernel memory: 1260k freed=0D
> [    4.847132] Freeing unused kernel memory: 1584k freed=0D
> [    4.946739] input: ImExPS/2 Generic Explorer Mouse as /devices/platfor=
m/i8042/serio1/input/input4=0D
> [    5.069194] dracut: dracut-013-16.fc16=0D
> [    5.086672] udevd[115]: starting version 173=0D
> [    5.237375] dracut: Starting plymouth daemon=0D
> =1B%G[    5.437681] dracut: rd.dm=3D0: removing DM RAID activation=0D
> [    5.456883] dracut: rd.md.imsm=3D0: no MD RAID for imsm/isw raids=0D
> [    5.471879] dracut: rd.md.ddf=3D0: no MD RAID for SNIA ddf raids=0D
> =1B%G[    6.056855] dracut: Scanning devices sda3  for LVM logical volume=
s vg_f16test64hvm/lv_root vg_f16test64hvm/lv_swap=0D
> [    6.099044] dracut: inactive '/dev/vg_f16test64hvm/lv_swap' [1.97 GiB]=
 inherit=0D
> [    6.107308] dracut: inactive '/dev/vg_f16test64hvm/lv_root' [27.53 GiB=
] inherit=0D
> [    6.615218] EXT4-fs (dm-1): INFO: recovery required on readonly filesy=
stem=0D
> [    6.623572] EXT4-fs (dm-1): write access will be enabled during recove=
ry=0D
> [    7.513709] EXT4-fs (dm-1): recovery complete=0D
> [    7.539777] EXT4-fs (dm-1): mounted filesystem with ordered data mode.=
 Opts: (null)=0D
> [    7.596678] dracut: Checking ext4: /dev/mapper/vg_f16test64hvm-lv_root=
=0D
> [    7.603638] dracut: issuing e2fsck -a  /dev/mapper/vg_f16test64hvm-lv_=
root=0D
> [    7.657115] dracut: /dev/mapper/vg_f16test64hvm-lv_root: clean, 18709/=
1806896 files, 289903/7217152 blocks=0D
> [    7.666279] dracut: Remounting /dev/mapper/vg_f16test64hvm-lv_root wit=
h -o ro=0D
> [    7.680814] EXT4-fs (dm-1): mounted filesystem with ordered data mode.=
 Opts: (null)=0D
> [    7.717573] dracut: Mounted root filesystem /dev/mapper/vg_f16test64hv=
m-lv_root=0D
> [    7.854983] dracut: Switching root=0D
> [    8.204987] type=3D1404 audit(1320086918.956:2): enforcing=3D1 old_enf=
orcing=3D0 auid=3D4294967295 ses=3D4294967295=0D
> [    8.329675] type=3D1403 audit(1320086919.081:3): policy loaded auid=3D=
4294967295 ses=3D4294967295=0D
> [    8.353773] systemd[1]: Successfully loaded SELinux policy in 165ms 16=
6us.=0D
> [    8.451859] systemd[1]: Successfully loaded SELinux database in 77ms 1=
39us, size on heap is 475K.=0D
> [    8.509781] systemd[1]: RTC configured in localtime, applying delta of=
 120 minutes to system time.=0D
> [    8.660676] systemd[1]: Relabelled /dev and /run in 87ms 636us.=0D
> [    8.689704] systemd[1]: systemd 36 running in system mode. (+PAM +LIBW=
RAP +AUDIT +SELINUX +SYSVINIT +LIBCRYPTSETUP; fedora)=0D
> =0D=0D
> Welcome to =1B[0;34mFedora release 16 (Verne)=1B[0m!=0D=0D
> =0D=0D
> [    8.755902] systemd[1]: Set hostname to <f16test64hvm.localdomain>.=0D
> Starting Collect Read-Ahead Data...=0D=0D
> Started Replay Read-Ahead Data.=0D=0D
> Starting Media Directory...=0D=0D
> [    9.215716] systemd-readahead-collect[402]: Disabling readahead collec=
tor due to execution in virtualized environment.=0D
> Started Lock Directory.=0D=0D
> Started Runtime Directory.=0D=0D
> Starting Debug File System...=0D=0D
> Starting POSIX Message Queue File System...=0D=0D
> Starting Security File System...=0D=0D
> Starting Huge Pages File System...=0D=0D
> Starting udev Coldplug all Devices...=0D=0D
> Starting udev Kernel Device Manager...=0D=0D
> Starting Syslog Kernel Log Buffer Bridge...=0D=0D
> Started Syslog Kernel Log Buffer Bridge.=0D=0D
> [    9.410090] udevd[410]: starting version 173=0D
> Started udev Kernel Device Manager.=0D=0D
> Started Collect Read-Ahead Data.=0D=0D
> Started Load legacy module configuration.=0D=0D
> Started File System Check on Root Device.=0D=0D
> Starting Remount API VFS...=0D=0D
> Starting Remount Root FS...=0D=0D
> Started Set Up Additional Binary Formats.=0D=0D
> Started Load Kernel Modules.=0D=0D
> Started FUSE Control File System.=0D=0D
> Started Configuration File System.=0D=0D
> Starting Apply Kernel Variables...=0D=0D
> Starting Setup Virtual Console...=0D=0D
> Starting STDOUT Syslog Bridge...=0D=0D
> Started STDOUT Syslog Bridge.=0D=0D
> Started udev Coldplug all Devices.=0D=0D
> Started Remount API VFS.=0D=0D
> Started Apply Kernel Variables.=0D=0D
> Starting udev Wait for Complete Device Initialization...=0D=0D
> Started Security File System.=0D=0D
> Started POSIX Message Queue File System.=0D=0D
> Started Debug File System.=0D=0D
> Started Huge Pages File System.=0D=0D
> [    9.798875] EXT4-fs (dm-1): re-mounted. Opts: (null)=0D
> Started Media Directory.=0D=0D
> Started Remount Root FS.=0D=0D
> Starting Configure read-only root support...=0D=0D
> Started Configure read-only root support.=0D=0D
> Started Setup Virtual Console.=0D=0D
> Starting /dev/mapper/vg_f16test64hvm-lv_swap...=0D=0D
> [   10.958370] Adding 2064380k swap on /dev/mapper/vg_f16test64hvm-lv_swa=
p.  Priority:0 extents:1 across:2064380k =0D
> Started /dev/mapper/vg_f16test64hvm-lv_swap.=0D=0D
> [   11.009608] piix4_smbus 0000:00:01.3: SMBus base address uninitialized=
 - upgrade BIOS or use force_addr=3D0xaddr=0D
> [   11.038011] parport_pc 00:0b: reported by Plug and Play ACPI=0D
> [   11.047803] parport0: PC-style at 0x378, irq 7 [PCSPP,TRISTATE]=0D
> [   11.094629] 8139cp: 8139cp: 10/100 PCI Ethernet driver v1.3 (Mar 22, 2=
004)=0D
> [   11.125422] 8139cp 0000:00:03.0: PCI INT A -> GSI 28 (level, low) -> I=
RQ 28=0D
> [   11.160994] 8139cp 0000:00:03.0: eth0: RTL-8139C+ at 0xffffc9000019e00=
0, 00:16:3f:03:01:14, IRQ 28=0D
> [   11.186450] ppdev: user-space parallel port driver=0D
> Starting File System Check on /dev/disk/by-uuid/6d0e406a-ac9c-443d-a84c-3=
4d0cc56d2a2...=0D[   11.279756] 8139too: 8139too Fast Ethernet driver 0.9.2=
8=0D
> =0D
> Started udev Wait for Complete Device Initialization.[   11.449395] rmmod=
[598]: ERROR: Module scsi_wait_scan does not exist in /proc/modules=0D
> =0D=0D
> Started Show Plymouth Boot Screen.=0D=0D
> Starting Wait for storage scan...=0D=0D
> Started Wait for storage scan.=0D=0D
> Starting Initialize storage subsystems (RAID, LVM, etc.)...=0D=0D
> systemd-fsck[   11.727436] systemd-fsck[591]: /dev/sda2: recovering journ=
al=0D
> [591]: /dev/sda2: recovering journal=0D=0D
> systemd-fsck[591]: /dev/sda2: clean, 219/128016 files, 48307/512000 block=
s[   11.841965] systemd-fsck[591]: /dev/sda2: clean, 219/128016 files, 4830=
7/512000 blocks=0D
> =0D=0D
> Started File System Check on /dev/disk/by-uuid/6d0e406a-ac9c-443d-a84c-34=
d0cc56d2a2.=0D=0D
> Starting /boot...=0D=0D
> [   12.185717] EXT4-fs (sda2): mounted filesystem with ordered data mode.=
 Opts: (null)=0D
> Started /boot.=0D=0D
> [   12.462997] fedora-storage-init[604]: Setting up Logical Volume Manage=
ment:   2 logical volume(s) in volume group "vg_f16test64hvm" now active=0D
> Started Initialize storage subsystems (RAID, LVM, etc.).=0D=0D
> Starting Initialize storage subsystems (RAID, LVM, etc.)...=0D=0D
> [   12.528806] fedora-storage-init[604]: [  OK  ]=0D
> [   12.639613] fedora-storage-init[618]: Setting up Logical Volume Manage=
ment:   2 logical volume(s) in volume group "vg_f16test64hvm" now active=0D
> Started Initialize storage subsystems (RAID, LVM, etc.).=0D=0D
> Starting Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or pro=
gress polling...=0D=0D
> [   12.787931] fedora-storage-init[618]: [  OK  ]=0D
> [   12.857150] lvm[624]: 2 logical volume(s) in volume group "vg_f16test6=
4hvm" monitored=0D
> Started Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or prog=
ress polling.=0D=0D
> Started Mark the need to relabel after reboot.=0D=0D
> Started Relabel all filesystems, if necessary.=0D=0D
> Started Reconfigure the system on administrator request.=0D=0D
> Starting Load Random Seed...=0D=0D
> Starting Tell Plymouth To Write Out Runtime Data...=0D=0D
> Starting Recreate Volatile Files and Directories...=0D=0D
> Started Load Random Seed.=0D=0D
> [   13.065835] systemd-tmpfiles[629]: Successfully loaded SELinux databas=
e in 36ms 529us, size on heap is 476K.=0D
> Started Tell Plymouth To Write Out Runtime Data.=0D=0D
> Started Recreate Volatile Files and Directories.=0D=0D
> Starting LSB: Mount and unmount network filesystems....=0D=0D
> Starting IPv4 firewall with iptables...=0D=0D
> Starting IPv6 firewall with ip6tables...=0D=0D
> Starting Security Auditing Service...=0D=0D
> Starting SSH server keys generation....=0D[   13.419101] auditd[635]: Sta=
rted dispatcher: /sbin/audispd pid: 645=0D
> =0D
> Starting Sendmail Mail Transport Agent...=0D=0D
> Starting System Logging Service...=0D=0D
> Starting Login Service...=0D=0D
> Started /etc/rc.local Compatibility.=0D=0D
> Starting Wait for Plymouth Boot Screen to Quit...=0D=0D
> Starting Terminate Plymouth Boot Screen...=0D=0D
> Starting D-Bus System Message Bus...=0D=0D
> Stopping Syslog Kernel Log Buffer Bridge...=0D=0D
> [   14.410603] nf_conntrack version 0.5.0 (7964 buckets, 31856 max)=0D
> [   14.418528] ip6_tables: (C) 2000-2006 Netfilter Core Team=0D
> [   28.998481] 8139cp 0000:00:03.0: eth0: link up, 100Mbps, full-duplex, =
lpa 0x05E1=0D
> [  149.712071] ------------[ cut here ]------------=0D
> [  149.717216] WARNING: at net/sched/sch_generic.c:255 dev_watchdog+0xf0/=
0x150()=0D
> [  149.724709] Hardware name: HVM domU=0D
> [  149.728738] NETDEV WATCHDOG: eth0 (8139cp): transmit queue 0 timed out=
=0D
> [  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 8139too 8139cp ppdev parport_pc mii parport i2c_piix4 i2c_core=
 joydev [last unloaded: scsi_wait_scan]=0D
> [  149.768028] Pid: 0, comm: swapper Not tainted 3.1.0-5.fc16.x86_64 #1=0D
> [  149.774639] Call Trace:=0D
> [  149.777765]  <IRQ>  [<ffffffff81057a56>] warn_slowpath_common+0x83/0x9=
b=0D
> [  149.784024]  [<ffffffff81057b11>] warn_slowpath_fmt+0x46/0x48=0D
> [  149.790141]  [<ffffffff813ef49d>] ? netif_tx_lock+0x4a/0x7c=0D
> [  149.799007]  [<ffffffff813ef613>] dev_watchdog+0xf0/0x150=0D
> [  149.806361]  [<ffffffff81064b51>] run_timer_softirq+0x19b/0x280=0D
> [  149.814392]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd=0D
> [  149.821650]  [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54=0D
> [  149.828926]  [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5=0D
> [  149.836803]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd=0D
> [  149.843422]  [<ffffffff814be5ec>] call_softirq+0x1c/0x30=0D
> [  149.850067]  [<ffffffff81010b45>] do_softirq+0x46/0x81=0D
> [  149.856760]  [<ffffffff8105d97b>] irq_exit+0x57/0xb1=0D
> [  149.863035]  [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x3e=0D
> [  149.871144]  [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e/0x80=0D
> [  149.879494]  <EOI>  [<ffffffff8102f2f1>] ? native_safe_halt+0xb/0xd=0D
> [  149.888220]  [<ffffffff81015b7e>] default_idle+0x4e/0x86=0D
> [  149.894962]  [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8=0D
> [  149.901461]  [<ffffffff814934ee>] rest_init+0x72/0x74=0D
> [  149.908949]  [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6=0D
> [  149.916617]  [<ffffffff81b762c4>] x86_64_start_reservations+0xaf/0xb3=
=0D
> [  149.929148]  [<ffffffff81b76140>] ? early_idt_handlers+0x140/0x140=0D
> [  149.936797]  [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x111=0D
> [  149.944336] ---[ end trace d8786cb7d6a57f8a ]---=0D
> [  149.950406] 8139cp 0000:00:03.0: eth0: Transmit timeout, status  d   3=
b   15 80ff=0D
> [  149.961879] ------------[ cut here ]------------=0D
> [  149.962245] WARNING: at kernel/softirq.c:159 _local_bh_enable_ip+0x44/=
0x8e()=0D
> [  149.962245] Hardware name: HVM domU=0D
> [  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]=0D
> [  149.962245] Pid: 0, comm: swapper Tainted: G        W   3.1.0-5.fc16.x=
86_64 #1=0D
> [  149.962245] Call Trace:=0D
> [  149.962245]  <IRQ>  [<ffffffff81057a56>] warn_slowpath_common+0x83/0x9=
b=0D
> [  149.962245]  [<ffffffff813ce599>] ? skb_release_data+0xca/0xcf=0D
> [  149.962245]  [<ffffffff81057a88>] warn_slowpath_null+0x1a/0x1c=0D
> [  149.962245]  [<ffffffff8105d462>] _local_bh_enable_ip+0x44/0x8e=0D
> [  149.962245]  [<ffffffff8105d4ba>] local_bh_enable_ip+0xe/0x10=0D
> [  149.962245]  [<ffffffff814b5db4>] _raw_spin_unlock_bh+0x15/0x17=0D
> [  149.962245]  [<ffffffffa0053969>] destroy_conntrack+0x9d/0xdc [nf_conn=
track]=0D
> [  149.962245]  [<ffffffff813fa343>] nf_conntrack_destroy+0x19/0x1b=0D
> [  149.962245]  [<ffffffff813ce7ad>] skb_release_head_state+0xa7/0xef=0D
> [  149.962245]  [<ffffffff813ce5b1>] __kfree_skb+0x13/0x83=0D
> [  149.962245]  [<ffffffff813ce677>] consume_skb+0x56/0x6b=0D
> [  149.962245]  [<ffffffffa003c1b9>] cp_clean_rings+0xb4/0x114 [8139cp]=0D
> [  149.962245]  [<ffffffffa003c371>] cp_tx_timeout+0x88/0x10e [8139cp]=0D
> [  149.962245]  [<ffffffff813ef627>] dev_watchdog+0x104/0x150=0D
> [  149.962245]  [<ffffffff81064b51>] run_timer_softirq+0x19b/0x280=0D
> [  149.962245]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd=0D
> [  149.962245]  [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54=0D
> [  149.962245]  [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5=0D
> [  149.962245]  [<ffffffff81014fec>] ? sched_clock+0x9/0xd=0D
> [  149.962245]  [<ffffffff814be5ec>] call_softirq+0x1c/0x30=0D
> [  149.962245]  [<ffffffff81010b45>] do_softirq+0x46/0x81=0D
> [  149.962245]  [<ffffffff8105d97b>] irq_exit+0x57/0xb1=0D
> [  149.962245]  [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x3e=0D
> [  149.962245]  [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e/0x80=0D
> [  149.962245]  <EOI>  [<ffffffff8102f2f1>] ? native_safe_halt+0xb/0xd=0D
> [  149.962245]  [<ffffffff81015b7e>] default_idle+0x4e/0x86=0D
> [  149.962245]  [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8=0D
> [  149.962245]  [<ffffffff814934ee>] rest_init+0x72/0x74=0D
> [  149.962245]  [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6=0D
> [  149.962245]  [<ffffffff81b762c4>] x86_64_start_reservations+0xaf/0xb3=
=0D
> [  149.962245]  [<ffffffff81b76140>] ? early_idt_handlers+0x140/0x140=0D
> [  149.962245]  [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x111=0D
> [  149.962245] ---[ end trace d8786cb7d6a57f8b ]---=0D

> _______________________________________________
> 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 Oct 31 12:25:19 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 12:25:19 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKxTz-0005WD-BG; Mon, 31 Oct 2011 12:25:19 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RKxT1-0005JW-HW
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 12:24:20 -0700
X-Env-Sender: bderzhavets@yahoo.com
X-Msg-Ref: server-2.tower-27.messagelabs.com!1320089021!61372575!1
X-Originating-IP: [98.139.52.224]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 15469 invoked from network); 31 Oct 2011 19:23:41 -0000
Received: from nm27.bullet.mail.ac4.yahoo.com (HELO
	nm27.bullet.mail.ac4.yahoo.com) (98.139.52.224)
	by server-2.tower-27.messagelabs.com with SMTP;
	31 Oct 2011 19:23:41 -0000
Received: from [98.139.52.190] by nm27.bullet.mail.ac4.yahoo.com with NNFMP;
	31 Oct 2011 19:24:15 -0000
Received: from [98.139.52.137] by tm3.bullet.mail.ac4.yahoo.com with NNFMP;
	31 Oct 2011 19:24:15 -0000
Received: from [127.0.0.1] by omp1020.mail.ac4.yahoo.com with NNFMP;
	31 Oct 2011 19:24:15 -0000
X-Yahoo-Newman-Property: ymail-3
X-Yahoo-Newman-Id: 645505.59314.bm@omp1020.mail.ac4.yahoo.com
Received: (qmail 54488 invoked by uid 60001); 31 Oct 2011 19:24:15 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s1024;
	t=1320089055; bh=IT4McyCbSQAICr/8kaBYOCKDimfdg/aEcSQO8LSBM0Y=;
	h=X-YMail-OSG:Received:X-Mailer:Message-ID:Date:From:Subject:To:In-Reply-To:MIME-Version:Content-Type;
	b=scEFX9jod4bvnWyXXLspbNcCXSjTX8y93ZpMO+2D2mY5lbow/zCK2Cmq8i7gLwuaLE2IyPqzNE352nT+osA2+Vavur3d/GUFnPZ666if/NMXqNL/ZUPl6tp7aEscvAPQdUfWAq6Gpg09CPoBdg0mNa/vroPhFVhw/r4hpn94xz4=
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=nhDeqdLJRvPvU+wOzUfPa2GOv4bShyMJ683sA0RA2Zj6b70D0PlcUHhpiAoFYtwhN2e7qBxYvgPWQooAlhwUDRplTqRtk3T3XjlEBJStgo7eh6YVJpf9RDuzYWNDItAZtGYb7fQuZtZXdw3PdPbwcLNFemix32JTtPh9tp1Qbq8=;
X-YMail-OSG: 5SLI4kcVM1ncAOhbLoEp3w6v1fe5d4PhCOaIqLmQlVgx6Lb
	hacE2mIM93oZ__eUJQbjsftG7z5yqjgvwruklkqzPfy.O54SC6_ooZl5OzV4
	.DqToCk7y6trecTLRjK6BtzwtpvF1FTiYG.5Ns.uEeOukUKfPyoCLWforAeO
	ekDTz6hUDGwgdP8cRO0j8OuI5fW80UzrSfnd7bkTf8Ar36oC8WQzSc92BMau
	4AmsNbkXkCBvlK4NismPFVRFyGX6i_kmbP7qgTWIKxIQWXAr7rN8DPNlHa7C
	ZFI76TnAj8yuZHBZ57RbjhaK2ArZSrFnSE5Ore_.k8fW89GplJgQozL5RaTg
	Yo..AK75m6TCFEdtIrtETx3G2DgxLJk8cSG2VgnohmHRJzedcU1_OSyiPr.e
	jvQGYBzSCqf3vD6m8UiJj_PjKKKQ4NbD19DPnkmbu41nvoB2a9iRf8xF4GmY
	vmpO8XoccaSDIhkHNvLYLLmNNO5ZoGNa6LASEn7e3QH31lZmu9ol8_7NmZ6b
	wldB1VDwIt3F6YCFYrJicufc0_ewYFusy5awCu7Gs22QqrHO..bPM1hATiBJ
	n7Cn2NV8IahybYwK9jAWiOQu63eW.BshZulJQWlpkBJXYwUWI.C04HzS9MHh
	5E_yN9bC_cRruUBYRqLuTxyW9CM95FWofXfVr_wEjNEgDfYaB.ms-
Received: from [188.114.44.167] by web65902.mail.ac4.yahoo.com via HTTP;
	Mon, 31 Oct 2011 12:24:14 PDT
X-Mailer: YahooMailClassic/14.0.11 YahooMailWebService/0.8.114.317681
Message-ID: <1320089054.54459.YahooMailClassic@web65902.mail.ac4.yahoo.com>
Date: Mon, 31 Oct 2011 12:24:14 -0700 (PDT)
From: Boris Derzhavets <bderzhavets@yahoo.com>
Subject: Re: [Xen-devel] Xen 4.1.2 HVM guest realtek nic problems (eth0 8139cp
	transmit queue timed out)
To: xen-devel@lists.xensource.com,
	=?iso-8859-1?Q?Pasi_K=E4rkk=E4inen?= <pasik@iki.fi>
In-Reply-To: <20111031184907.GA12984@reaktio.net>
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="===============1153826804=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============1153826804==
Content-Type: multipart/alternative;
	boundary="-1740618739-1254292987-1320089054=:54459"

---1740618739-1254292987-1320089054=:54459
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: quoted-printable

Seems to related

https://bugs.launchpad.net/ubuntu/+source/xen/+bug/854829

Boris.

--- On Mon, 10/31/11, Pasi K=E4rkk=E4inen <pasik@iki.fi> wrote:

From: Pasi K=E4rkk=E4inen <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 n=
etwork traffic going on..

Simple "yum update" in the VM triggers the problem..


[=A0 =A0 0.000000] Linux version 3.1.0-5.fc16.x86_64 (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
[=A0 =A0 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/l=
v_root rd.dm=3D0 SYSFONT=3Dlatarcyrheb-sun16 rhgb KEYTABLE=3Dfi rd.md=3D0 r=
d.luks=3D0 rd.lvm.lv=3Dvg_f16test64hvm/lv_swap LANG=3Den_US.UTF-8 console=
=3DttyS0,38400 console=3Dtty0
<snip>

[=A0=A0=A028.998481] 8139cp 0000:00:03.0: eth0: link up, 100Mbps, full-dupl=
ex, lpa 0x05E1
[=A0 149.712071] ------------[ cut here ]------------
[=A0 149.717216] WARNING: at net/sched/sch_generic.c:255 dev_watchdog+0xf0/=
0x150()
[=A0 149.724709] Hardware name: HVM domU
[=A0 149.728738] NETDEV WATCHDOG: eth0 (8139cp): transmit queue 0 timed out
[=A0 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 u=
nloaded: scsi_wait_scan]
[=A0 149.768028] Pid: 0, comm: swapper Not tainted 3.1.0-5.fc16.x86_64 #1
[=A0 149.774639] Call Trace:
[=A0 149.777765]=A0 <IRQ>=A0 [<ffffffff81057a56>] warn_slowpath_common+0x83=
/0x9b
[=A0 149.784024]=A0 [<ffffffff81057b11>] warn_slowpath_fmt+0x46/0x48
[=A0 149.790141]=A0 [<ffffffff813ef49d>] ? netif_tx_lock+0x4a/0x7c
[=A0 149.799007]=A0 [<ffffffff813ef613>] dev_watchdog+0xf0/0x150
[=A0 149.806361]=A0 [<ffffffff81064b51>] run_timer_softirq+0x19b/0x280
[=A0 149.814392]=A0 [<ffffffff81014fec>] ? sched_clock+0x9/0xd
[=A0 149.821650]=A0 [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54
[=A0 149.828926]=A0 [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5
[=A0 149.836803]=A0 [<ffffffff81014fec>] ? sched_clock+0x9/0xd
[=A0 149.843422]=A0 [<ffffffff814be5ec>] call_softirq+0x1c/0x30
[=A0 149.850067]=A0 [<ffffffff81010b45>] do_softirq+0x46/0x81
[=A0 149.856760]=A0 [<ffffffff8105d97b>] irq_exit+0x57/0xb1
[=A0 149.863035]=A0 [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x3e
[=A0 149.871144]=A0 [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e/0x80
[=A0 149.879494]=A0 <EOI>=A0 [<ffffffff8102f2f1>] ? native_safe_halt+0xb/0x=
d
[=A0 149.888220]=A0 [<ffffffff81015b7e>] default_idle+0x4e/0x86
[=A0 149.894962]=A0 [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8
[=A0 149.901461]=A0 [<ffffffff814934ee>] rest_init+0x72/0x74
[=A0 149.908949]=A0 [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6
[=A0 149.916617]=A0 [<ffffffff81b762c4>] x86_64_start_reservations+0xaf/0xb=
3
[=A0 149.929148]=A0 [<ffffffff81b76140>] ? early_idt_handlers+0x140/0x140
[=A0 149.936797]=A0 [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x111
[=A0 149.944336] ---[ end trace d8786cb7d6a57f8a ]---
[=A0 149.950406] 8139cp 0000:00:03.0: eth0: Transmit timeout, status=A0 d=
=A0=A0=A03b=A0=A0=A015 80ff
[=A0 149.961879] ------------[ cut here ]------------
[=A0 149.962245] WARNING: at kernel/softirq.c:159 _local_bh_enable_ip+0x44/=
0x8e()
[=A0 149.962245] Hardware name: HVM domU
[=A0 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]
[=A0 149.962245] Pid: 0, comm: swapper Tainted: G=A0 =A0 =A0 =A0 W=A0=A0=A0=
3.1.0-5.fc16.x86_64 #1
[=A0 149.962245] Call Trace:
[=A0 149.962245]=A0 <IRQ>=A0 [<ffffffff81057a56>] warn_slowpath_common+0x83=
/0x9b
[=A0 149.962245]=A0 [<ffffffff813ce599>] ? skb_release_data+0xca/0xcf
[=A0 149.962245]=A0 [<ffffffff81057a88>] warn_slowpath_null+0x1a/0x1c
[=A0 149.962245]=A0 [<ffffffff8105d462>] _local_bh_enable_ip+0x44/0x8e
[=A0 149.962245]=A0 [<ffffffff8105d4ba>] local_bh_enable_ip+0xe/0x10
[=A0 149.962245]=A0 [<ffffffff814b5db4>] _raw_spin_unlock_bh+0x15/0x17
[=A0 149.962245]=A0 [<ffffffffa0053969>] destroy_conntrack+0x9d/0xdc [nf_co=
nntrack]
[=A0 149.962245]=A0 [<ffffffff813fa343>] nf_conntrack_destroy+0x19/0x1b
[=A0 149.962245]=A0 [<ffffffff813ce7ad>] skb_release_head_state+0xa7/0xef
[=A0 149.962245]=A0 [<ffffffff813ce5b1>] __kfree_skb+0x13/0x83
[=A0 149.962245]=A0 [<ffffffff813ce677>] consume_skb+0x56/0x6b
[=A0 149.962245]=A0 [<ffffffffa003c1b9>] cp_clean_rings+0xb4/0x114 [8139cp]
[=A0 149.962245]=A0 [<ffffffffa003c371>] cp_tx_timeout+0x88/0x10e [8139cp]
[=A0 149.962245]=A0 [<ffffffff813ef627>] dev_watchdog+0x104/0x150
[=A0 149.962245]=A0 [<ffffffff81064b51>] run_timer_softirq+0x19b/0x280
[=A0 149.962245]=A0 [<ffffffff81014fec>] ? sched_clock+0x9/0xd
[=A0 149.962245]=A0 [<ffffffff813ef523>] ? netif_tx_unlock+0x54/0x54
[=A0 149.962245]=A0 [<ffffffff8105d6b3>] __do_softirq+0xc9/0x1b5
[=A0 149.962245]=A0 [<ffffffff81014fec>] ? sched_clock+0x9/0xd
[=A0 149.962245]=A0 [<ffffffff814be5ec>] call_softirq+0x1c/0x30
[=A0 149.962245]=A0 [<ffffffff81010b45>] do_softirq+0x46/0x81
[=A0 149.962245]=A0 [<ffffffff8105d97b>] irq_exit+0x57/0xb1
[=A0 149.962245]=A0 [<ffffffff812a39d3>] xen_evtchn_do_upcall+0x31/0x3e
[=A0 149.962245]=A0 [<ffffffff814be76e>] xen_hvm_callback_vector+0x6e/0x80
[=A0 149.962245]=A0 <EOI>=A0 [<ffffffff8102f2f1>] ? native_safe_halt+0xb/0x=
d
[=A0 149.962245]=A0 [<ffffffff81015b7e>] default_idle+0x4e/0x86
[=A0 149.962245]=A0 [<ffffffff8100e2ed>] cpu_idle+0xae/0xe8
[=A0 149.962245]=A0 [<ffffffff814934ee>] rest_init+0x72/0x74
[=A0 149.962245]=A0 [<ffffffff81b76b7d>] start_kernel+0x3ab/0x3b6
[=A0 149.962245]=A0 [<ffffffff81b762c4>] x86_64_start_reservations+0xaf/0xb=
3
[=A0 149.962245]=A0 [<ffffffff81b76140>] ? early_idt_handlers+0x140/0x140
[=A0 149.962245]=A0 [<ffffffff81b763ca>] x86_64_start_kernel+0x102/0x111
[=A0 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 =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=A0=A0=A0=3D 'restart'
on_crash=A0 =A0 =3D 'restart'
sdl=3D0
vnc=3D1
vncpasswd=3D''
stdvga=3D0
serial=3D'pty'
tsc_mode=3D0
usb=3D1
usbdevice=3D'tablet'
keymap=3D'fi'


Using "model=3De1000" instead for the vif works OK.. no problems with the e=
mulated intel nic.

Any ideas what the problem with the emulated realtek nic?=20

Thanks,


-- Pasi


-----Inline Attachment Follows-----

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

---1740618739-1254292987-1320089054=:54459
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;">Seems to related<br><br>https://bugs.launchpa=
d.net/ubuntu/+source/xen/+bug/854829<br><br>Boris.<br><br>--- On <b>Mon, 10=
/31/11, Pasi K=E4rkk=E4inen <i>&lt;pasik@iki.fi&gt;</i></b> wrote:<br><bloc=
kquote style=3D"border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; =
padding-left: 5px;"><br>From: Pasi K=E4rkk=E4inen &lt;pasik@iki.fi&gt;<br>S=
ubject: [Xen-devel] Xen 4.1.2 HVM guest realtek nic problems (eth0 8139cp t=
ransmit queue timed out)<br>To: xen-devel@lists.xensource.com<br>Date: Mond=
ay, October 31, 2011, 2:49 PM<br><br><div class=3D"plainMail">Hello,<br><br=
>While testing Xen 4.1.2 and HVM guests I noticed the following problem<br>=
with Fedora 16 HVM guests (using Linux 3.1.0 kernel in the VM):<br><br>The =
errors (call trace) happens pretty much immediately when there's some netwo=
rk traffic going on..<br><br>Simple "yum update" in the VM triggers the
 problem..<br><br><br>[&nbsp; &nbsp; 0.000000] Linux version 3.1.0-5.fc16.x=
86_64 (<a ymailto=3D"mailto:mockbuild@x86-10.phx2.fedoraproject.org" href=
=3D"/mc/compose?to=3Dmockbuild@x86-10.phx2.fedoraproject.org">mockbuild@x86=
-10.phx2.fedoraproject.org</a>) (gcc version 4.6.1 20111003 (Red Hat 4.6.1-=
10) (GCC) ) #1 SMP Thu Oct 27 03:46:50 UTC 2011<br>[&nbsp; &nbsp; 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 S=
YSFONT=3Dlatarcyrheb-sun16 rhgb KEYTABLE=3Dfi rd.md=3D0 rd.luks=3D0 rd.lvm.=
lv=3Dvg_f16test64hvm/lv_swap LANG=3Den_US.UTF-8 console=3DttyS0,38400 conso=
le=3Dtty0<br>&lt;snip&gt;<br><br>[&nbsp;&nbsp;&nbsp;28.998481] 8139cp 0000:=
00:03.0: eth0: link up, 100Mbps, full-duplex, lpa 0x05E1<br>[&nbsp; 149.712=
071] ------------[ cut here ]------------<br>[&nbsp; 149.717216] WARNING: a=
t net/sched/sch_generic.c:255 dev_watchdog+0xf0/0x150()<br>[&nbsp; 149.7247=
09] Hardware name: HVM
 domU<br>[&nbsp; 149.728738] NETDEV WATCHDOG: eth0 (8139cp): transmit queue=
 0 timed out<br>[&nbsp; 149.735537] Modules linked in: ip6t_REJECT nf_connt=
rack_ipv6 nf_defrag_ipv6 nf_conntrack_ipv4 nf_defrag_ipv4 ip6table_filter x=
t_state ip6_tables nf_conntrack 81<br>39too 8139cp ppdev parport_pc mii par=
port i2c_piix4 i2c_core joydev [last unloaded: scsi_wait_scan]<br>[&nbsp; 1=
49.768028] Pid: 0, comm: swapper Not tainted 3.1.0-5.fc16.x86_64 #1<br>[&nb=
sp; 149.774639] Call Trace:<br>[&nbsp; 149.777765]&nbsp; &lt;IRQ&gt;&nbsp; =
[&lt;ffffffff81057a56&gt;] warn_slowpath_common+0x83/0x9b<br>[&nbsp; 149.78=
4024]&nbsp; [&lt;ffffffff81057b11&gt;] warn_slowpath_fmt+0x46/0x48<br>[&nbs=
p; 149.790141]&nbsp; [&lt;ffffffff813ef49d&gt;] ? netif_tx_lock+0x4a/0x7c<b=
r>[&nbsp; 149.799007]&nbsp; [&lt;ffffffff813ef613&gt;] dev_watchdog+0xf0/0x=
150<br>[&nbsp; 149.806361]&nbsp; [&lt;ffffffff81064b51&gt;] run_timer_softi=
rq+0x19b/0x280<br>[&nbsp; 149.814392]&nbsp;
 [&lt;ffffffff81014fec&gt;] ? sched_clock+0x9/0xd<br>[&nbsp; 149.821650]&nb=
sp; [&lt;ffffffff813ef523&gt;] ? netif_tx_unlock+0x54/0x54<br>[&nbsp; 149.8=
28926]&nbsp; [&lt;ffffffff8105d6b3&gt;] __do_softirq+0xc9/0x1b5<br>[&nbsp; =
149.836803]&nbsp; [&lt;ffffffff81014fec&gt;] ? sched_clock+0x9/0xd<br>[&nbs=
p; 149.843422]&nbsp; [&lt;ffffffff814be5ec&gt;] call_softirq+0x1c/0x30<br>[=
&nbsp; 149.850067]&nbsp; [&lt;ffffffff81010b45&gt;] do_softirq+0x46/0x81<br=
>[&nbsp; 149.856760]&nbsp; [&lt;ffffffff8105d97b&gt;] irq_exit+0x57/0xb1<br=
>[&nbsp; 149.863035]&nbsp; [&lt;ffffffff812a39d3&gt;] xen_evtchn_do_upcall+=
0x31/0x3e<br>[&nbsp; 149.871144]&nbsp; [&lt;ffffffff814be76e&gt;] xen_hvm_c=
allback_vector+0x6e/0x80<br>[&nbsp; 149.879494]&nbsp; &lt;EOI&gt;&nbsp; [&l=
t;ffffffff8102f2f1&gt;] ? native_safe_halt+0xb/0xd<br>[&nbsp; 149.888220]&n=
bsp; [&lt;ffffffff81015b7e&gt;] default_idle+0x4e/0x86<br>[&nbsp; 149.89496=
2]&nbsp; [&lt;ffffffff8100e2ed&gt;] cpu_idle+0xae/0xe8<br>[&nbsp;
 149.901461]&nbsp; [&lt;ffffffff814934ee&gt;] rest_init+0x72/0x74<br>[&nbsp=
; 149.908949]&nbsp; [&lt;ffffffff81b76b7d&gt;] start_kernel+0x3ab/0x3b6<br>=
[&nbsp; 149.916617]&nbsp; [&lt;ffffffff81b762c4&gt;] x86_64_start_reservati=
ons+0xaf/0xb3<br>[&nbsp; 149.929148]&nbsp; [&lt;ffffffff81b76140&gt;] ? ear=
ly_idt_handlers+0x140/0x140<br>[&nbsp; 149.936797]&nbsp; [&lt;ffffffff81b76=
3ca&gt;] x86_64_start_kernel+0x102/0x111<br>[&nbsp; 149.944336] ---[ end tr=
ace d8786cb7d6a57f8a ]---<br>[&nbsp; 149.950406] 8139cp 0000:00:03.0: eth0:=
 Transmit timeout, status&nbsp; d&nbsp;&nbsp;&nbsp;3b&nbsp;&nbsp;&nbsp;15 8=
0ff<br>[&nbsp; 149.961879] ------------[ cut here ]------------<br>[&nbsp; =
149.962245] WARNING: at kernel/softirq.c:159 _local_bh_enable_ip+0x44/0x8e(=
)<br>[&nbsp; 149.962245] Hardware name: HVM domU<br>[&nbsp; 149.962245] Mod=
ules linked in: ip6t_REJECT nf_conntrack_ipv6 nf_defrag_ipv6 nf_conntrack_i=
pv4 nf_defrag_ipv4 ip6table_filter xt_state ip6_tables nf_conntrack
 8139too 8139cp ppdev parport_pc mii parport i2c_piix4 i2c_core joydev [las=
t unloaded: scsi_wait_scan]<br>[&nbsp; 149.962245] Pid: 0, comm: swapper Ta=
inted: G&nbsp; &nbsp; &nbsp; &nbsp; W&nbsp;&nbsp;&nbsp;3.1.0-5.fc16.x86_64 =
#1<br>[&nbsp; 149.962245] Call Trace:<br>[&nbsp; 149.962245]&nbsp; &lt;IRQ&=
gt;&nbsp; [&lt;ffffffff81057a56&gt;] warn_slowpath_common+0x83/0x9b<br>[&nb=
sp; 149.962245]&nbsp; [&lt;ffffffff813ce599&gt;] ? skb_release_data+0xca/0x=
cf<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff81057a88&gt;] warn_slowpath_nu=
ll+0x1a/0x1c<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff8105d462&gt;] _local=
_bh_enable_ip+0x44/0x8e<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff8105d4ba&=
gt;] local_bh_enable_ip+0xe/0x10<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff=
814b5db4&gt;] _raw_spin_unlock_bh+0x15/0x17<br>[&nbsp; 149.962245]&nbsp; [&=
lt;ffffffffa0053969&gt;] destroy_conntrack+0x9d/0xdc [nf_conntrack]<br>[&nb=
sp; 149.962245]&nbsp; [&lt;ffffffff813fa343&gt;]
 nf_conntrack_destroy+0x19/0x1b<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff8=
13ce7ad&gt;] skb_release_head_state+0xa7/0xef<br>[&nbsp; 149.962245]&nbsp; =
[&lt;ffffffff813ce5b1&gt;] __kfree_skb+0x13/0x83<br>[&nbsp; 149.962245]&nbs=
p; [&lt;ffffffff813ce677&gt;] consume_skb+0x56/0x6b<br>[&nbsp; 149.962245]&=
nbsp; [&lt;ffffffffa003c1b9&gt;] cp_clean_rings+0xb4/0x114 [8139cp]<br>[&nb=
sp; 149.962245]&nbsp; [&lt;ffffffffa003c371&gt;] cp_tx_timeout+0x88/0x10e [=
8139cp]<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff813ef627&gt;] dev_watchdo=
g+0x104/0x150<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff81064b51&gt;] run_t=
imer_softirq+0x19b/0x280<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff81014fec=
&gt;] ? sched_clock+0x9/0xd<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff813ef=
523&gt;] ? netif_tx_unlock+0x54/0x54<br>[&nbsp; 149.962245]&nbsp; [&lt;ffff=
ffff8105d6b3&gt;] __do_softirq+0xc9/0x1b5<br>[&nbsp; 149.962245]&nbsp; [&lt=
;ffffffff81014fec&gt;] ? sched_clock+0x9/0xd<br>[&nbsp;
 149.962245]&nbsp; [&lt;ffffffff814be5ec&gt;] call_softirq+0x1c/0x30<br>[&n=
bsp; 149.962245]&nbsp; [&lt;ffffffff81010b45&gt;] do_softirq+0x46/0x81<br>[=
&nbsp; 149.962245]&nbsp; [&lt;ffffffff8105d97b&gt;] irq_exit+0x57/0xb1<br>[=
&nbsp; 149.962245]&nbsp; [&lt;ffffffff812a39d3&gt;] xen_evtchn_do_upcall+0x=
31/0x3e<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff814be76e&gt;] xen_hvm_cal=
lback_vector+0x6e/0x80<br>[&nbsp; 149.962245]&nbsp; &lt;EOI&gt;&nbsp; [&lt;=
ffffffff8102f2f1&gt;] ? native_safe_halt+0xb/0xd<br>[&nbsp; 149.962245]&nbs=
p; [&lt;ffffffff81015b7e&gt;] default_idle+0x4e/0x86<br>[&nbsp; 149.962245]=
&nbsp; [&lt;ffffffff8100e2ed&gt;] cpu_idle+0xae/0xe8<br>[&nbsp; 149.962245]=
&nbsp; [&lt;ffffffff814934ee&gt;] rest_init+0x72/0x74<br>[&nbsp; 149.962245=
]&nbsp; [&lt;ffffffff81b76b7d&gt;] start_kernel+0x3ab/0x3b6<br>[&nbsp; 149.=
962245]&nbsp; [&lt;ffffffff81b762c4&gt;] x86_64_start_reservations+0xaf/0xb=
3<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff81b76140&gt;] ?
 early_idt_handlers+0x140/0x140<br>[&nbsp; 149.962245]&nbsp; [&lt;ffffffff8=
1b763ca&gt;] x86_64_start_kernel+0x102/0x111<br>[&nbsp; 149.962245] ---[ en=
d trace d8786cb7d6a57f8b ]---<br><br>Full guest kernel dmesg attached to th=
is email.<br>The host is running F16 with Xen 4.1.2 and Linux 3.1.0 dom0 ke=
rnel.<br><br>Xen cfgfile for the HVM domain:<br><br>kernel =3D "hvmloader"<=
br>builder=3D'hvm'<br>device_model =3D 'qemu-dm'<br>name =3D "f16test64hvm"=
<br>memory =3D 1024<br>vcpus=3D1<br>pae=3D1<br>acpi=3D1<br>apic=3D1<br>vif =
=3D [ 'type=3Dioemu, mac=3D00:16:3f:03:01:14, bridge=3Dvirbr0' ]<br>disk =
=3D [ 'phy:/dev/vg_f16/f16test64hvm,hda,w', 'file:/root/iso/Fedora-16-Final=
-RC2-x86_64-DVD.iso,hdc:cdrom,r' ]<br>boot=3D'cd'<br>xen_platform_pci=3D0<b=
r>on_poweroff =3D 'destroy'<br>on_reboot&nbsp;&nbsp;&nbsp;=3D 'restart'<br>=
on_crash&nbsp; &nbsp; =3D 'restart'<br>sdl=3D0<br>vnc=3D1<br>vncpasswd=3D''=
<br>stdvga=3D0<br>serial=3D'pty'<br>tsc_mode=3D0<br>usb=3D1<br>usbdevice=3D=
'tablet'<br>keymap=3D'fi'<br><br><br>Using
 "model=3De1000" instead for the vif works OK.. no problems with the emulat=
ed intel nic.<br><br>Any ideas what the problem with the emulated realtek n=
ic? <br><br>Thanks,<br><br><br>-- Pasi<br><br></div><br>-----Inline Attachm=
ent Follows-----<br><br><div class=3D"plainMail">__________________________=
_____________________<br>Xen-devel mailing list<br><a ymailto=3D"mailto:Xen=
-devel@lists.xensource.com" href=3D"/mc/compose?to=3DXen-devel@lists.xensou=
rce.com">Xen-devel@lists.xensource.com</a><br><a href=3D"http://lists.xenso=
urce.com/xen-devel" target=3D"_blank">http://lists.xensource.com/xen-devel<=
/a><br></div></blockquote></td></tr></table>
---1740618739-1254292987-1320089054=:54459--


--===============1153826804==
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

--===============1153826804==--


From xen-devel-bounces@lists.xensource.com Mon Oct 31 12:30:28 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 12:30:28 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKxYy-0005yD-RV; Mon, 31 Oct 2011 12:30:28 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKxY1-0005l6-Ps
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 12:29:30 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-3.tower-182.messagelabs.com!1320089365!1417203!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18763 invoked from network); 31 Oct 2011 19:29:26 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-3.tower-182.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 31 Oct 2011 19:29:26 -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 519B32934;
	Mon, 31 Oct 2011 21:29:24 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 1A86C20097; Mon, 31 Oct 2011 21:29:24 +0200 (EET)
Date: Mon, 31 Oct 2011 21:29:24 +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)
Message-ID: <20111031192924.GC12984@reaktio.net>
References: <20111031184907.GA12984@reaktio.net>
	<1320089054.54459.YahooMailClassic@web65902.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: <1320089054.54459.YahooMailClassic@web65902.mail.ac4.yahoo.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen@lists.fedoraproject.org, 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, 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..)


-- 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

From xen-api-bounces@lists.xensource.com Mon Oct 31 12:32:21 2011
Return-path: <xen-api-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 12:32:21 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKxam-0006K4-RZ; Mon, 31 Oct 2011 12:32:20 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKxad-0006Gr-1y; Mon, 31 Oct 2011 12:32:11 -0700
X-Env-Sender: mike.mcclurg@citrix.com
X-Msg-Ref: server-2.tower-21.messagelabs.com!1320089526!2336886!1
X-Originating-IP: [66.165.176.89]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20553 invoked from network); 31 Oct 2011 19:32:07 -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;
	31 Oct 2011 19:32:07 -0000
X-IronPort-AV: E=Sophos;i="4.69,433,1315195200"; d="scan'208";a="18693926"
Received: from ftlpmailmx02.citrite.net ([10.13.107.66])
	by FTLPIPO01.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	31 Oct 2011 15:32:04 -0400
Received: from [IPv6:::1] (10.80.16.67) by smtprelay.citrix.com (10.13.107.66)
	with Microsoft SMTP Server id 8.3.137.0;
	Mon, 31 Oct 2011 15:32:04 -0400
Message-ID: <4EAEF7B5.2030902@citrix.com>
Date: Mon, 31 Oct 2011 19:32:05 +0000
From: Mike McClurg <mike.mcclurg@citrix.com>
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20110807 Icedove/5.0
MIME-Version: 1.0
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>, 
	"xen-api@lists.xensource.com" <xen-api@lists.xensource.com>,
	"xen-users@lists.xensource.com" <xen-users@lists.xensource.com>
Content-Type: text/plain; charset="ISO-8859-1"; format=flowed
Content-Transfer-Encoding: 7bit
Cc: 
Subject: [Xen-API] ANN: Project Kronos - Ubuntu UDS Session,
	1 Nov @ 20:15 UTC
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 all,

I just wanted to let you know that Jon Ludlam and I will be hosting a 
workshop on Project Kronos [1] tomorrow at the Ubuntu Developer Summit 
(UDS) for Ubuntu 12.04. We'll be discussing the status of the project, 
and the work remaining for us to get Kronos included in Ubuntu.

You can join in the workshop remotely. There will be a live audio stream 
[2], an IRC channel on freenode [3], and an etherpad instance to take 
notes [4]. You will need a Launchpad account to read or write on the 
etherpad, and you must register with the group Ubuntu Etherpad instance [5].

The workshop will start on Tuesday, 1 Nov, at 20:15 UTC (16:15 EST). I 
welcome everyone who is interested in Ubuntu, Xen and XCP to join!

Mike

[1] https://blueprints.launchpad.net/ubuntu/+spec/servercloud-p-kronos
[2] http://icecast.ubuntu.com:8000/status.xsl - go to antigua2 channel
[3] #ubuntu-uds-Antigua2 on freenode
[4] http://summit.ubuntu.com/uds-p/meeting/19427/servercloud-p-kronos/
[5] https://launchpad.net/~ubuntu-etherpad

_______________________________________________
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 Oct 31 13:14:41 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 13:14:41 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKyFl-0000tl-4R; Mon, 31 Oct 2011 13:14:41 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKyEo-0000gq-BD
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 13:13:43 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-16.tower-21.messagelabs.com!1320092017!2368513!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6986 invoked from network); 31 Oct 2011 20:13:38 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-16.tower-21.messagelabs.com with DHE-RSA-AES256-SHA encrypted
	SMTP; 31 Oct 2011 20:13:38 -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 4B9D92E1B;
	Mon, 31 Oct 2011 22:13:36 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 2971120097; Mon, 31 Oct 2011 22:13:36 +0200 (EET)
Date: Mon, 31 Oct 2011 22:13:36 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: xen-devel@lists.xensource.com
Message-ID: <20111031201336.GD12984@reaktio.net>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="pAwQNkOnpTn9IO2O"
Content-Disposition: inline
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen@lists.fedoraproject.org
Subject: [Xen-devel] Xen 4.1.2 PVHVM guest with Linux 3.1.0 network problem,
	empty MAC address (all zeroes)
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com


--pAwQNkOnpTn9IO2O
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hello,

While testing Fedora 16 Xen PVHVM guests I noticed the following problem:

When starting F16 PVHVM guest I can see the vifX.0 and tapX.0 interfaces appear on dom0, 
but after the guest kernel (Linux 3.1.0) starts and loads PVHVM drivers the 
vif/tap interfaces disappear from dom0.. 
so the bridge in dom0 doesn't have any vifs/taps connected to it anymore.

Has anyone seen that behaviour? 

I bet that's also the reason why eth0 inside the PVHVM guest 
has a MAC address with only zeroes in it: 00:00:00:00:00:00.

If I disable PVHVM with "xen_platform_pci=0" in the domain cfgfile
then network for the guest works OK using the qemu-dm emulated nic.

PVHVM guest cfgfile:

kernel = "hvmloader"
builder='hvm'
device_model = 'qemu-dm'
name = "f16pvhvm"
memory = 1024
vcpus=1
pae=1
acpi=1
apic=1
vif = [ 'type=ioemu, mac=00:16:5f:03:01:15, bridge=virbr0, model=e1000' ]
disk = [ 'phy:/dev/vg_f16/f16pvhvm,hda,w', 'file:/root/iso/Fedora-16-Final-RC2-x86_64-DVD.iso,hdc:cdrom,r' ]
boot='cd'
xen_platform_pci=1
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'

Some output from inside the PVHVM guest:

# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

# ethtool eth0
Settings for eth0:
        Link detected: no

# ethtool -i eth0
driver: vif
version:
firmware-version:
bus-info: vif-0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no

Full PVHVM guest kernel (Linux 3.1.0) dmesg attached to this email.
Some parts of the guest dmesg here:

$ egrep -i 'xen|vif' xen-4.1.2-f16pvhvm-linux-3.1.0-dmesg.txt
[    0.000000] DMI: Xen HVM domU, BIOS 4.1.2 10/21/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 compiled for this kernel: unplug emulated NICs.
[    0.000000] Blkfront and the Xen platform PCI driver have been compiled for this kernel: unplug emulated disks.
[    0.000000] ACPI: RSDP 00000000000ea020 00024 (v02    Xen)
[    0.000000] ACPI: XSDT 00000000fc0134b0 00034 (v01    Xen      HVM 00000000 HVML 00000000)
[    0.000000] ACPI: FACP 00000000fc0132d0 000F4 (v04    Xen      HVM 00000000 HVML 00000000)
[    0.000000] ACPI: DSDT 00000000fc003440 0FE05 (v02    Xen      HVM 00000000 INTL 20100528)
[    0.000000] ACPI: APIC 00000000fc0133d0 000D8 (v02    Xen      HVM 00000000 HVML 00000000)
[    0.000000] Booting paravirtualized kernel on Xen HVM
[    0.000000] Xen HVM callback vector for event delivery is enabled
[    0.167992] Xen: using vcpuop timer interface
[    0.167998] installing Xen timer for CPU 0
[    1.761867] xen/balloon: Initialising balloon driver.
[    1.763774] xen-balloon: Initialising balloon driver.
[    1.777781] Switching to clocksource xen
[    1.911620] xen: --> pirq=16 -> irq=8 (gsi=8)
[    1.911716] xen: --> pirq=17 -> irq=12 (gsi=12)
[    1.911786] xen: --> pirq=18 -> irq=1 (gsi=1)
[    1.911856] xen: --> pirq=19 -> irq=6 (gsi=6)
[    1.911934] xen: --> pirq=20 -> irq=4 (gsi=4)
[    1.912011] xen: --> pirq=21 -> irq=7 (gsi=7)
[    3.246196] xen: --> pirq=22 -> irq=28 (gsi=28)
[    3.246201] xen-platform-pci 0000:00:03.0: PCI INT A -> GSI 28 (level, low) -> IRQ 28
[    3.451348] xen: --> pirq=23 -> irq=23 (gsi=23)
[    4.273081] XENBUS: Device with no driver: device/vfb/0
[    4.286483] XENBUS: Device with no driver: device/vbd/768
[    4.302078] XENBUS: Device with no driver: device/vbd/5632
[    4.316760] XENBUS: Device with no driver: device/vif/0
[    4.331416] XENBUS: Device with no driver: device/console/0
[    5.296770] vbd vbd-5632: 19 xenbus_dev_probe on device/vbd/5632
[    9.747194] Initialising Xen virtual ethernet driver.
[    9.754392] vif vif-0: 2 parsing device/vif/0/mac


dom0 kernel (Linux 3.1.0 aswell) messages:

[ 1759.102852] device tap4.0 entered promiscuous mode
[ 1759.102914] virbr0: topology change detected, propagating
[ 1759.102920] virbr0: port 2(tap4.0) entering forwarding state
[ 1759.102931] virbr0: port 2(tap4.0) entering forwarding state
[ 1759.271512] virbr0: port 2(tap4.0) entering forwarding state
[ 1759.282639] virbr0: topology change detected, propagating
[ 1759.282647] virbr0: port 2(tap4.0) entering forwarding state
[ 1759.282654] virbr0: port 2(tap4.0) entering forwarding state
[ 1759.298054] device vif4.0 entered promiscuous mode
[ 1759.301103] ADDRCONF(NETDEV_UP): vif4.0: link is not ready
[ 1769.895245] tap4.0: no IPv6 routers present


"xm log" doesn't have any errors.
Any ideas how to fix this? Why do the vif/tap devices disappear from dom0?

Thanks,


-- Pasi


--pAwQNkOnpTn9IO2O
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment;
	filename="xen-4.1.2-f16pvhvm-linux-3.1.0-dmesg.txt"

[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Linux version 3.1.0-5.fc16.x86_64 (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=UUID=e8610da3-e470-45ab-9723-bbf51d177f64 ro rd.md=0 rd.lvm=0 rd.dm=0 SYSFONT=latarcyrheb-sun16 rhgb KEYTABLE=fi rd.luks=0 LANG=en_US.UTF-8 console=ttyS0,38400 console=tty0
[    0.000000] BIOS-provided physical RAM map:
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009e000 (usable)
[    0.000000]  BIOS-e820: 000000000009e000 - 00000000000a0000 (reserved)
[    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
[    0.000000]  BIOS-e820: 0000000000100000 - 0000000040000000 (usable)
[    0.000000]  BIOS-e820: 00000000fc000000 - 0000000100000000 (reserved)
[    0.000000] Using x86 segment limits to approximate NX protection
[    0.000000] DMI 2.4 present.
[    0.000000] DMI: Xen HVM domU, BIOS 4.1.2 10/21/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 compiled for this kernel: unplug emulated NICs.
[    0.000000] Blkfront and the Xen platform PCI driver have been compiled 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= kernel command line option
[    0.000000] HVMOP_pagetable_dying not supported
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usable) ==> (reserved)
[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (usable)
[    0.000000] No AGP bridge found
[    0.000000] last_pfn = 0x40000 max_arch_pfn = 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 0x7010600070106
[    0.000000] found SMP MP-table at [ffff8800000fbc70] fbc70
[    0.000000] initial memory mapped : 0 - 20000000
[    0.000000] Base memory trampoline at [ffff880000099000] 99000 size 20480
[    0.000000] init_memory_mapping: 0000000000000000-0000000040000000
[    0.000000]  0000000000 - 0040000000 page 2M
[    0.000000] kernel direct mapping tables up to 40000000 @ 1fffe000-20000000
[    0.000000] RAMDISK: 3601e000 - 37007000
[    0.000000] ACPI: RSDP 00000000000ea020 00024 (v02    Xen)
[    0.000000] ACPI: XSDT 00000000fc0134b0 00034 (v01    Xen      HVM 00000000 HVML 00000000)
[    0.000000] ACPI: FACP 00000000fc0132d0 000F4 (v04    Xen      HVM 00000000 HVML 00000000)
[    0.000000] ACPI: DSDT 00000000fc003440 0FE05 (v02    Xen      HVM 00000000 INTL 20100528)
[    0.000000] ACPI: FACS 00000000fc003400 00040
[    0.000000] ACPI: APIC 00000000fc0133d0 000D8 (v02    Xen      HVM 00000000 HVML 00000000)
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] No NUMA configuration found
[    0.000000] Faking a node at 0000000000000000-0000000040000000
[    0.000000] Initmem setup node 0 0000000000000000-0000000040000000
[    0.000000]   NODE_DATA [000000003ffec000 - 000000003fffffff]
[    0.000000]  [ffffea0000000000-ffffea0000ffffff] PMD -> [ffff88003e600000-ffff88003f5fffff] 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 -> 0x00040000
[    0.000000] On node 0 totalpages: 262030
[    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: 4032 pages used for memmap
[    0.000000]   DMA32 zone: 254016 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] disabled)
[    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, GSI 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 level)
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 low level)
[    0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 low level)
[    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] SMP: Allowing 15 CPUs, 14 hotplug CPUs
[    0.000000] nr_irqs_gsi: 64
[    0.000000] PM: Registered nosave memory: 000000000009e000 - 00000000000a0000
[    0.000000] PM: Registered nosave memory: 00000000000a0000 - 00000000000e0000
[    0.000000] PM: Registered nosave memory: 00000000000e0000 - 0000000000100000
[    0.000000] Allocating PCI resources starting at 40000000 (gap: 40000000:bc000000)
[    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 @ffff88003fc00000 s81024 r8192 d21376 u131072
[    0.000000] pcpu-alloc: s81024 r8192 d21376 u131072 alloc=1*2097152
[    0.000000] pcpu-alloc: [0] 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 -- 
[    0.000000] Built 1 zonelists in Node order, mobility grouping on.  Total pages: 257929
[    0.000000] Policy zone: DMA32
[    0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-3.1.0-5.fc16.x86_64 root=UUID=e8610da3-e470-45ab-9723-bbf51d177f64 ro rd.md=0 rd.lvm=0 rd.dm=0 SYSFONT=latarcyrheb-sun16 rhgb KEYTABLE=fi rd.luks=0 LANG=en_US.UTF-8 console=ttyS0,38400 console=tty0
[    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 - bailing!
[    0.000000] Memory: 999440k/1048576k available (4867k kernel code, 456k absent, 48680k reserved, 6782k data, 940k init)
[    0.000000] SLUB: Genslabs=15, HWalign=64, Order=0-3, MinObjects=0, CPUs=15, Nodes=1
[    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] Console: colour VGA+ 80x25
[    0.000000] console [tty0] enabled
[    0.000000] console [ttyS0] enabled
[    0.000000] allocated 8388608 bytes of page_cgroup
[    0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
[    0.000000] Detected 2677.230 MHz processor.
[    0.004999] Calibrating delay loop (skipped), value calculated using timer frequency.. 5354.46 BogoMIPS (lpj=2677230)
[    0.012004] pid_max: default: 32768 minimum: 301
[    0.016041] Security Framework initialized
[    0.020011] SELinux:  Initializing.
[    0.023012] SELinux:  Starting in permissive mode
[    0.023180] Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
[    0.029266] Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
[    0.034109] Mount-cache hash table entries: 256
[    0.038180] Initializing cgroup subsys cpuacct
[    0.042007] Initializing cgroup subsys memory
[    0.046014] Initializing cgroup subsys devices
[    0.049001] Initializing cgroup subsys freezer
[    0.053000] Initializing cgroup subsys net_cls
[    0.057000] Initializing cgroup subsys blkio
[    0.060005] Initializing cgroup subsys perf_event
[    0.064068] CPU: Physical Processor ID: 0
[    0.066998] CPU: Processor Core ID: 0
[    0.070000] mce: CPU supports 9 MCE banks
[    0.074147] SMP alternatives: switching to UP code
[    0.086589] ACPI: Core revision 20110623
[    0.100337] ftrace: allocating 25204 entries in 99 pages
[    0.136594] Not enabling x2apic, Intr-remapping init failed.
[    0.140991] Switched APIC routing to physical flat.
[    0.146264] ..TIMER: vector=0x30 apic1=0 pin1=2 apic2=0 pin2=0
[    0.161850] CPU0: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz stepping 05
[    0.167992] Xen: using vcpuop timer interface
[    0.167998] installing Xen timer for CPU 0
[    0.171043] Performance Events: unsupported p6 CPU model 37 no PMU driver, software events only.
[    0.177069] NMI watchdog disabled (cpu0): hardware events not enabled
[    0.178007] Brought up 1 CPUs
[    0.178991] Total of 1 processors activated (5354.46 BogoMIPS).
[    0.182998] devtmpfs: initialized
[    0.216074] atomic64 test passed for x86-64 platform with CX8 and with SSE
[    0.217015] RTC time: 19:57:16, date: 10/31/11
[    0.218028] NET: Registered protocol family 16
[    0.220073] ACPI: bus type pci registered
[    0.222984] PCI: Using configuration type 1 for base access
[    0.231053] bio: create slab <bio-0> at 0
[    0.232074] ACPI: Added _OSI(Module Device)
[    0.232985] ACPI: Added _OSI(Processor Device)
[    0.233993] ACPI: Added _OSI(3.0 _SCP Extensions)
[    0.234985] ACPI: Added _OSI(Processor Aggregator Device)
[    0.250047] ACPI: EC: Look up EC in DSDT
[    0.293982] ACPI: Interpreter enabled
[    0.294982] ACPI: (supports S0 S3 S4 S5)
[    0.299980] ACPI: Using IOAPIC for interrupt routing
[    0.579024] ACPI: No dock devices found.
[    0.579936] HEST: Table not found.
[    0.580937] PCI: Using host bridge windows from ACPI; if necessary, use "pci=nocrs" and report a bug
[    0.582000] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[    0.583939] pci_root PNP0A03:00: host bridge window [io  0x0000-0x0cf7]
[    0.584936] pci_root PNP0A03:00: host bridge window [io  0x0d00-0xffff]
[    0.585952] pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x000bffff]
[    0.586946] pci_root PNP0A03:00: host bridge window [mem 0xf0000000-0xfbffffff]
[    0.589078] pci 0000:00:00.0: [8086:1237] type 0 class 0x000600
[    0.609937] pci 0000:00:01.0: [8086:7000] type 0 class 0x000601
[    0.636013] pci 0000:00:01.1: [8086:7010] type 0 class 0x000101
[    0.653931] pci 0000:00:01.1: reg 20: [io  0xc160-0xc16f]
[    0.665927] pci 0000:00:01.2: [8086:7020] type 0 class 0x000c03
[    0.682062] pci 0000:00:01.2: reg 20: [io  0xc140-0xc15f]
[    0.691041] pci 0000:00:01.3: [8086:7113] type 0 class 0x000680
[    0.691922] * Found PM-Timer Bug on the chipset. Due to workarounds for a bug,
[    0.691924] * this clock source is slow. Consider trying other clock sources
[    0.716007] pci 0000:00:01.3: quirk: [io  0xb000-0xb03f] claimed by PIIX4 ACPI
[    0.724924] pci 0000:00:02.0: [1013:00b8] type 0 class 0x000300
[    0.728921] pci 0000:00:02.0: reg 10: [mem 0xf0000000-0xf1ffffff pref]
[    0.732920] pci 0000:00:02.0: reg 14: [mem 0xf3020000-0xf3020fff]
[    0.758041] pci 0000:00:03.0: [5853:0001] type 0 class 0x00ff80
[    0.763917] pci 0000:00:03.0: reg 10: [io  0xc000-0xc0ff]
[    0.767915] pci 0000:00:03.0: reg 14: [mem 0xf2000000-0xf2ffffff pref]
[    0.797014] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
[    0.801991]  pci0000:00: Unable to request _OSC control (_OSC support mask: 0x1e)
[    1.737775] ACPI: PCI Interrupt Link [LNKA] (IRQs *5 10 11)
[    1.743959] ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
[    1.749915] ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
[    1.756024] ACPI: PCI Interrupt Link [LNKD] (IRQs *5 10 11)
[    1.761867] xen/balloon: Initialising balloon driver.
[    1.762757] last_pfn = 0x40000 max_arch_pfn = 0x400000000
[    1.763774] xen-balloon: Initialising balloon driver.
[    1.764889] vgaarb: device added: PCI:0000:00:02.0,decodes=io+mem,owns=io+mem,locks=none
[    1.765756] vgaarb: loaded
[    1.766755] vgaarb: bridge control possible 0000:00:02.0
[    1.767835] SCSI subsystem initialized
[    1.768816] libata version 3.00 loaded.
[    1.768869] usbcore: registered new interface driver usbfs
[    1.769774] usbcore: registered new interface driver hub
[    1.770781] usbcore: registered new device driver usb
[    1.771831] PCI: Using ACPI for IRQ routing
[    1.772754] PCI: pci_cache_line_size set to 64 bytes
[    1.773918] reserve RAM buffer: 000000000009e000 - 000000000009ffff 
[    1.774022] NetLabel: Initializing
[    1.774772] NetLabel:  domain hash size = 128
[    1.775760] NetLabel:  protocols = UNLABELED CIPSOv4
[    1.776798] NetLabel:  unlabeled traffic allowed by default
[    1.777781] Switching to clocksource xen
[    1.779061] Switched to NOHz mode on CPU #0
[    1.806153] pnp: PnP ACPI init
[    1.816380] ACPI: bus type pnp registered
[    1.833328] pnp 00:00: [mem 0x00000000-0x0009ffff]
[    1.833401] system 00:00: [mem 0x00000000-0x0009ffff] could not be reserved
[    1.857643] system 00:00: Plug and Play ACPI device, IDs PNP0c02 (active)
[    1.857765] pnp 00:01: [bus 00-ff]
[    1.857773] pnp 00:01: [io  0x0cf8-0x0cff]
[    1.857776] pnp 00:01: [io  0x0000-0x0cf7 window]
[    1.857779] pnp 00:01: [io  0x0d00-0xffff window]
[    1.857782] pnp 00:01: [mem 0x000a0000-0x000bffff window]
[    1.857785] pnp 00:01: [mem 0xf0000000-0xfbffffff window]
[    1.857835] pnp 00:01: Plug and Play ACPI device, IDs PNP0a03 (active)
[    1.857850] pnp 00:02: [io  0x10c0-0x1141]
[    1.857853] pnp 00:02: [io  0xb044-0xb047]
[    1.857896] system 00:02: [io  0x10c0-0x1141] has been reserved
[    1.866763] system 00:02: [io  0xb044-0xb047] has been reserved
[    1.879580] system 00:02: Plug and Play ACPI device, IDs PNP0c02 (active)
[    1.879646] pnp 00:03: [io  0x0010-0x001f]
[    1.879650] pnp 00:03: [io  0x0022-0x002d]
[    1.879654] pnp 00:03: [io  0x0030-0x003f]
[    1.879657] pnp 00:03: [io  0x0044-0x005f]
[    1.879660] pnp 00:03: [io  0x0062-0x0063]
[    1.879663] pnp 00:03: [io  0x0065-0x006f]
[    1.879667] pnp 00:03: [io  0x0072-0x007f]
[    1.879669] pnp 00:03: [io  0x0080]
[    1.879672] pnp 00:03: [io  0x0084-0x0086]
[    1.879674] pnp 00:03: [io  0x0088]
[    1.879676] pnp 00:03: [io  0x008c-0x008e]
[    1.879678] pnp 00:03: [io  0x0090-0x009f]
[    1.879680] pnp 00:03: [io  0x00a2-0x00bd]
[    1.879682] pnp 00:03: [io  0x00e0-0x00ef]
[    1.879684] pnp 00:03: [io  0x08a0-0x08a3]
[    1.879686] pnp 00:03: [io  0x0cc0-0x0ccf]
[    1.879689] pnp 00:03: [io  0x04d0-0x04d1]
[    1.879740] system 00:03: [io  0x08a0-0x08a3] has been reserved
[    1.892361] system 00:03: [io  0x0cc0-0x0ccf] has been reserved
[    1.906307] system 00:03: [io  0x04d0-0x04d1] has been reserved
[    1.911503] system 00:03: Plug and Play ACPI device, IDs PNP0c02 (active)
[    1.911534] pnp 00:04: [dma 4]
[    1.911537] pnp 00:04: [io  0x0000-0x000f]
[    1.911539] pnp 00:04: [io  0x0081-0x0083]
[    1.911540] pnp 00:04: [io  0x0087]
[    1.911542] pnp 00:04: [io  0x0089-0x008b]
[    1.911544] pnp 00:04: [io  0x008f]
[    1.911546] pnp 00:04: [io  0x00c0-0x00df]
[    1.911547] pnp 00:04: [io  0x0480-0x048f]
[    1.911593] pnp 00:04: Plug and Play ACPI device, IDs PNP0200 (active)
[    1.911605] pnp 00:05: [io  0x0070-0x0071]
[    1.911620] xen: --> pirq=16 -> irq=8 (gsi=8)
[    1.911630] pnp 00:05: [irq 8]
[    1.911654] pnp 00:05: Plug and Play ACPI device, IDs PNP0b00 (active)
[    1.911663] pnp 00:06: [io  0x0061]
[    1.911683] pnp 00:06: Plug and Play ACPI device, IDs PNP0800 (active)
[    1.911716] xen: --> pirq=17 -> irq=12 (gsi=12)
[    1.911719] pnp 00:07: [irq 12]
[    1.911746] pnp 00:07: Plug and Play ACPI device, IDs PNP0f13 (active)
[    1.911770] pnp 00:08: [io  0x0060]
[    1.911773] pnp 00:08: [io  0x0064]
[    1.911786] xen: --> pirq=18 -> irq=1 (gsi=1)
[    1.911789] pnp 00:08: [irq 1]
[    1.911821] pnp 00:08: Plug and Play ACPI device, IDs PNP0303 PNP030b (active)
[    1.911843] pnp 00:09: [io  0x03f0-0x03f5]
[    1.911846] pnp 00:09: [io  0x03f7]
[    1.911856] xen: --> pirq=19 -> irq=6 (gsi=6)
[    1.911858] pnp 00:09: [irq 6]
[    1.911860] pnp 00:09: [dma 2]
[    1.911888] pnp 00:09: Plug and Play ACPI device, IDs PNP0700 (active)
[    1.911923] pnp 00:0a: [io  0x03f8-0x03ff]
[    1.911934] xen: --> pirq=20 -> irq=4 (gsi=4)
[    1.911936] pnp 00:0a: [irq 4]
[    1.911967] pnp 00:0a: Plug and Play ACPI device, IDs PNP0501 (active)
[    1.912001] pnp 00:0b: [io  0x0378-0x037f]
[    1.912011] xen: --> pirq=21 -> irq=7 (gsi=7)
[    1.912013] pnp 00:0b: [irq 7]
[    1.912036] pnp 00:0b: Plug and Play ACPI device, IDs PNP0400 (active)
[    1.971036] pnp: PnP ACPI: found 12 devices
[    1.980681] ACPI: ACPI bus type pnp unregistered
[    2.003011] PCI: max bus depth: 0 pci_try_num: 1
[    2.003023] pci_bus 0000:00: resource 4 [io  0x0000-0x0cf7]
[    2.003027] pci_bus 0000:00: resource 5 [io  0x0d00-0xffff]
[    2.003031] pci_bus 0000:00: resource 6 [mem 0x000a0000-0x000bffff]
[    2.003035] pci_bus 0000:00: resource 7 [mem 0xf0000000-0xfbffffff]
[    2.003109] NET: Registered protocol family 2
[    2.013194] IP route cache hash table entries: 32768 (order: 6, 262144 bytes)
[    2.035442] TCP established hash table entries: 131072 (order: 9, 2097152 bytes)
[    2.059486] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
[    2.091850] TCP: Hash tables configured (established 131072 bind 65536)
[    2.130990] TCP reno registered
[    2.138597] UDP hash table entries: 512 (order: 2, 16384 bytes)
[    2.152240] UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
[    2.174421] NET: Registered protocol family 1
[    2.187797] pci 0000:00:00.0: Limiting direct PCI/PCI transfers
[    2.201151] pci 0000:00:01.0: PIIX3: Enabling Passive Release
[    2.224757] pci 0000:00:01.0: Activating ISA DMA hang workarounds
[    2.242034] pci 0000:00:02.0: Boot video device
[    2.242185] PCI: CLS 0 bytes, default 64
[    2.242263] Unpacking initramfs...
[    2.632193] Freeing initrd memory: 16292k freed
[    2.643653] alg: No test for __gcm-aes-aesni (__driver-gcm-aes-aesni)
[    2.649498] audit: initializing netlink socket (disabled)
[    2.654485] type=2000 audit(1320091039.982:1): initialized
[    2.686580] HugeTLB registered 2 MB page size, pre-allocated 0 pages
[    2.698196] VFS: Disk quotas dquot_6.5.2
[    2.702807] Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    2.708719] msgmni has been set to 1983
[    2.712769] SELinux:  Registering netfilter hooks
[    2.713094] alg: No test for stdrng (krng)
[    2.716950] NET: Registered protocol family 38
[    2.720927] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)
[    2.728691] io scheduler noop registered
[    2.732789] io scheduler deadline registered
[    2.741702] io scheduler cfq registered (default)
[    2.750846] pci_hotplug: PCI Hot Plug PCI Core version: 0.5
[    2.760782] pciehp: PCI Express Hot Plug Controller Driver version: 0.4
[    2.778915] acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
[    2.786455] acpiphp: Slot [0] registered
[    2.792549] acpiphp: Slot [1] registered
[    2.797038] acpiphp: Slot [2] registered
[    2.801808] acpiphp: Slot [3] registered
[    2.814981] acpiphp: Slot [4] registered
[    2.823436] acpiphp: Slot [5] registered
[    2.830502] acpiphp: Slot [6] registered
[    2.834640] acpiphp: Slot [7] registered
[    2.843245] acpiphp: Slot [8] registered
[    2.853112] acpiphp: Slot [9] registered
[    2.863684] acpiphp: Slot [10] registered
[    2.875365] acpiphp: Slot [11] registered
[    2.885784] acpiphp: Slot [12] registered
[    2.908943] acpiphp: Slot [13] registered
[    2.914907] acpiphp: Slot [14] registered
[    2.921928] acpiphp: Slot [15] registered
[    2.936438] acpiphp: Slot [16] registered
[    2.947506] acpiphp: Slot [17] registered
[    2.956915] acpiphp: Slot [18] registered
[    2.967609] acpiphp: Slot [19] registered
[    2.980614] acpiphp: Slot [20] registered
[    2.991370] acpiphp: Slot [21] registered
[    3.004133] acpiphp: Slot [22] registered
[    3.013303] acpiphp: Slot [23] registered
[    3.021929] acpiphp: Slot [24] registered
[    3.030514] acpiphp: Slot [25] registered
[    3.075333] acpiphp: Slot [26] registered
[    3.083485] acpiphp: Slot [27] registered
[    3.098816] acpiphp: Slot [28] registered
[    3.106733] acpiphp: Slot [29] registered
[    3.116309] acpiphp: Slot [30] registered
[    3.121277] acpiphp: Slot [31] registered
[    3.131143] input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
[    3.149752] ACPI: Power Button [PWRF]
[    3.161293] input: Sleep Button as /devices/LNXSYSTM:00/LNXSLPBN:00/input/input1
[    3.173829] ACPI: Sleep Button [SLPF]
[    3.183401] ACPI: acpi_idle registered with cpuidle
[    3.236995] ERST: Table is not found!
[    3.241554] GHES: HEST is not enabled!
[    3.246196] xen: --> pirq=22 -> irq=28 (gsi=28)
[    3.246201] xen-platform-pci 0000:00:03.0: PCI INT A -> GSI 28 (level, low) -> IRQ 28
[    3.252697] Grant table initialized
[    3.258001] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    3.292942] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    3.326971] 00:0a: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    3.337803] Non-volatile memory driver v1.3
[    3.344953] Linux agpgart interface v0.103
[    3.355911] loop: module loaded
[    3.365092] ata_piix 0000:00:01.1: version 2.13
[    3.365547] ata_piix 0000:00:01.1: setting latency timer to 64
[    3.366625] scsi0 : ata_piix
[    3.376611] scsi1 : ata_piix
[    3.387452] ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc160 irq 14
[    3.401531] ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc168 irq 15
[    3.414597] Fixed MDIO Bus: probed
[    3.422798] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    3.436535] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    3.445072] uhci_hcd: USB Universal Host Controller Interface driver
[    3.451348] xen: --> pirq=23 -> irq=23 (gsi=23)
[    3.451353] uhci_hcd 0000:00:01.2: PCI INT D -> GSI 23 (level, low) -> IRQ 23
[    3.459628] uhci_hcd 0000:00:01.2: setting latency timer to 64
[    3.459692] uhci_hcd 0000:00:01.2: UHCI Host Controller
[    3.465519] uhci_hcd 0000:00:01.2: new USB bus registered, assigned bus number 1
[    3.476074] uhci_hcd 0000:00:01.2: irq 23, io base 0x0000c140
[    3.486730] usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
[    3.509164] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    3.520909] usb usb1: Product: UHCI Host Controller
[    3.530508] usb usb1: Manufacturer: Linux 3.1.0-5.fc16.x86_64 uhci_hcd
[    3.542154] usb usb1: SerialNumber: 0000:00:01.2
[    3.561811] hub 1-0:1.0: USB hub found
[    3.566227] hub 1-0:1.0: 2 ports detected
[    3.579602] usbcore: registered new interface driver usbserial
[    3.593543] USB Serial support registered for generic
[    3.604863] usbcore: registered new interface driver usbserial_generic
[    3.619204] usbserial: USB Serial Driver core
[    3.631171] i8042: PNP: PS/2 Controller [PNP0303:PS2K,PNP0f13:PS2M] at 0x60,0x64 irq 1,12
[    3.679417] Refined TSC clocksource calibration: 2677.181 MHz.
[    3.770388] ata2.01: NODEV after polling detection
[    3.772700] ata2.00: ATAPI: QEMU DVD-ROM, 0.10.2, max UDMA/100
[    3.789762] ata2.00: configured for MWDMA2
[    3.807715] scsi 1:0:0:0: CD-ROM            QEMU     QEMU DVD-ROM     0.10 PQ: 0 ANSI: 5
[    3.828843] sr0: scsi3-mmc drive: 4x/4x xa/form2 tray
[    3.852566] cdrom: Uniform CD-ROM driver Revision: 3.20
[    3.867454] sr 1:0:0:0: Attached scsi CD-ROM sr0
[    3.868290] sr 1:0:0:0: Attached scsi generic sg0 type 5
[    3.891197] serio: i8042 KBD port at 0x60,0x64 irq 1
[    3.906432] serio: i8042 AUX port at 0x60,0x64 irq 12
[    3.922387] usb 1-2: new full speed USB device number 2 using uhci_hcd
[    3.943534] mousedev: PS/2 mouse device common for all mice
[    3.964416] input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input2
[    3.988006] rtc_cmos 00:05: rtc core: registered rtc_cmos as rtc0
[    4.008027] rtc0: alarms up to one day, 114 bytes nvram
[    4.022991] device-mapper: uevent: version 1.0.3
[    4.041867] device-mapper: ioctl: 4.21.0-ioctl (2011-07-06) initialised: dm-devel@redhat.com
[    4.063353] cpuidle: using governor ladder
[    4.076212] cpuidle: using governor menu
[    4.090637] EFI Variables Facility v0.08 2004-May-17
[    4.102466] usbcore: registered new interface driver usbhid
[    4.117406] usbhid: USB HID core driver
[    4.131249] ip_tables: (C) 2000-2006 Netfilter Core Team
[    4.146190] TCP cubic registered
[    4.154333] Initializing XFRM netlink socket
[    4.170722] NET: Registered protocol family 10
[    4.204569] Mobile IPv6
[    4.209599] NET: Registered protocol family 17
[    4.223318] Registering the dns_resolver key type
[    4.241447] PM: Hibernation image not present or could not be loaded.
[    4.241464] registered taskstats version 1
[    4.254797] IMA: No TPM chip found, activating TPM-bypass!
[    4.273081] XENBUS: Device with no driver: device/vfb/0
[    4.286483] XENBUS: Device with no driver: device/vbd/768
[    4.302078] XENBUS: Device with no driver: device/vbd/5632
[    4.316760] XENBUS: Device with no driver: device/vif/0
[    4.331416] XENBUS: Device with no driver: device/console/0
[    4.343728]   Magic number: 15:812:1002
[    4.352675] pnp 00:04: hash matches
[    4.369900] rtc_cmos 00:05: setting system clock to 2011-10-31 19:57:19 UTC (1320091039)
[    4.383267] Initializing network drop monitor service
[    4.389082] Freeing unused kernel memory: 940k freed
[    4.397902] Write protecting the kernel read-only data: 10240k
[    4.414605] Freeing unused kernel memory: 1260k freed
[    4.433881] Freeing unused kernel memory: 1584k freed
[    4.439341] usb 1-2: New USB device found, idVendor=0627, idProduct=0001
[    4.448574] usb 1-2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    4.457047] usb 1-2: Product: QEMU USB Tablet
[    4.462381] usb 1-2: Manufacturer: QEMU 0.10.2
[    4.468609] usb 1-2: SerialNumber: 1
[    4.570035] input: QEMU 0.10.2 QEMU USB Tablet as /devices/pci0000:00/0000:00:01.2/usb1/1-2/1-2:1.0/input/input3
[    4.603262] 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
[    4.684868] dracut: dracut-013-16.fc16
[    4.710357] input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input4
[    4.739708] dracut: rd.luks=0: removing cryptoluks activation
[    4.760635] dracut: rd.lvm=0: removing LVM activation
[    4.787177] udevd[113]: starting version 173
[    4.973560] dracut: Starting plymouth daemon
[    5.139514] dracut: rd.dm=0: removing DM RAID activation
[    5.150693] dracut: rd.md=0: removing MD RAID activation
[    5.296770] vbd vbd-5632: 19 xenbus_dev_probe on device/vbd/5632
[    5.313220] blkfront: xvda: flush diskcache: enabled
[    5.367292]  xvda: xvda1 xvda2 xvda3
[    5.736847] EXT4-fs (xvda3): mounting ext3 file system using the ext4 subsystem
[    5.772700] EXT4-fs (xvda3): mounted filesystem with ordered data mode. Opts: (null)
[    5.854374] dracut: Checking ext3: /dev/disk/by-uuid/e8610da3-e470-45ab-9723-bbf51d177f64
[    5.863328] dracut: issuing e2fsck -a  /dev/disk/by-uuid/e8610da3-e470-45ab-9723-bbf51d177f64
[    6.041808] dracut: /dev/disk/by-uuid/e8610da3-e470-45ab-9723-bbf51d177f64: clean, 159953/1672800 files, 1052813/6687488 blocks
[    6.055883] dracut: Remounting /dev/disk/by-uuid/e8610da3-e470-45ab-9723-bbf51d177f64 with -o ro
[    6.113981] EXT4-fs (xvda3): mounting ext3 file system using the ext4 subsystem
[    6.139322] EXT4-fs (xvda3): mounted filesystem with ordered data mode. Opts: (null)
[    6.171511] dracut: Mounted root filesystem /dev/xvda3
[    6.396172] dracut: Switching root
[    6.858748] type=1404 audit(1320091041.987:2): enforcing=1 old_enforcing=0 auid=4294967295 ses=4294967295
[    6.992286] SELinux: 2048 avtab hash slots, 96028 rules.
[    7.016755] SELinux: 2048 avtab hash slots, 96028 rules.
[    7.027392] SELinux:  9 users, 13 roles, 3892 types, 204 bools, 1 sens, 1024 cats
[    7.027396] SELinux:  82 classes, 96028 rules
[    7.034757] SELinux:  Completing initialization.
[    7.034760] SELinux:  Setting up existing superblocks.
[    7.034768] SELinux: initialized (dev sysfs, type sysfs), uses genfs_contexts
[    7.034775] SELinux: initialized (dev rootfs, type rootfs), uses genfs_contexts
[    7.034998] SELinux: initialized (dev bdev, type bdev), uses genfs_contexts
[    7.035004] SELinux: initialized (dev proc, type proc), uses genfs_contexts
[    7.035014] SELinux: initialized (dev tmpfs, type tmpfs), uses transition SIDs
[    7.035032] SELinux: initialized (dev devtmpfs, type devtmpfs), uses transition SIDs
[    7.035563] SELinux: initialized (dev sockfs, type sockfs), uses task SIDs
[    7.035568] SELinux: initialized (dev debugfs, type debugfs), uses genfs_contexts
[    7.036186] SELinux: initialized (dev pipefs, type pipefs), uses task SIDs
[    7.036194] SELinux: initialized (dev anon_inodefs, type anon_inodefs), uses genfs_contexts
[    7.036198] SELinux: initialized (dev devpts, type devpts), uses transition SIDs
[    7.036221] SELinux: initialized (dev hugetlbfs, type hugetlbfs), uses transition SIDs
[    7.036232] SELinux: initialized (dev mqueue, type mqueue), uses transition SIDs
[    7.036242] SELinux: initialized (dev selinuxfs, type selinuxfs), uses genfs_contexts
[    7.036255] SELinux: initialized (dev usbfs, type usbfs), uses genfs_contexts
[    7.036260] SELinux: initialized (dev securityfs, type securityfs), uses genfs_contexts
[    7.036266] SELinux: initialized (dev sysfs, type sysfs), uses genfs_contexts
[    7.036429] SELinux: initialized (dev tmpfs, type tmpfs), uses transition SIDs
[    7.036436] SELinux: initialized (dev tmpfs, type tmpfs), uses transition SIDs
[    7.038855] SELinux: initialized (dev xvda3, type ext3), uses xattr
[    7.040874] type=1403 audit(1320091042.170:3): policy loaded auid=4294967295 ses=4294967295
[    7.077798] systemd[1]: Successfully loaded SELinux policy in 241ms 687us.
[    7.148407] systemd[1]: Successfully loaded SELinux database in 63ms 468us, size on heap is 475K.
[    7.216208] systemd[1]: RTC configured in localtime, applying delta of 120 minutes to system time.
[    7.244979] SELinux: initialized (dev tmpfs, type tmpfs), uses transition SIDs
[    7.245534] SELinux: initialized (dev cgroup, type cgroup), uses genfs_contexts
[    7.308179] systemd[1]: Relabelled /dev and /run in 62ms 537us.
[    7.334360] SELinux: initialized (dev cgroup, type cgroup), uses genfs_contexts
[    7.334740] SELinux: initialized (dev cgroup, type cgroup), uses genfs_contexts
[    7.335202] SELinux: initialized (dev cgroup, type cgroup), uses genfs_contexts
[    7.335521] SELinux: initialized (dev cgroup, type cgroup), uses genfs_contexts
[    7.335841] SELinux: initialized (dev cgroup, type cgroup), uses genfs_contexts
[    7.336204] SELinux: initialized (dev cgroup, type cgroup), uses genfs_contexts
[    7.336522] SELinux: initialized (dev cgroup, type cgroup), uses genfs_contexts
[    7.336876] SELinux: initialized (dev cgroup, type cgroup), uses genfs_contexts
[    7.336949] systemd[1]: systemd 36 running in system mode. (+PAM +LIBWRAP +AUDIT +SELINUX +SYSVINIT +LIBCRYPTSETUP; fedora)
[    7.412224] systemd[1]: Set hostname to <f16pvhvm.localdomain>.
[    7.993759] SELinux: initialized (dev autofs, type autofs), uses genfs_contexts
[    8.005589] systemd-readahead-collect[342]: Disabling readahead collector due to execution in virtualized environment.
[    8.396907] SELinux: initialized (dev tmpfs, type tmpfs), uses transition SIDs
[    8.398990] SELinux: initialized (dev hugetlbfs, type hugetlbfs), uses transition SIDs
[    8.466028] udevd[353]: starting version 173
[    8.663435] EXT4-fs (xvda3): re-mounted. Opts: (null)
[    9.023732] RPC: Registered named UNIX socket transport module.
[    9.028669] RPC: Registered udp transport module.
[    9.032761] RPC: Registered tcp transport module.
[    9.036844] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    9.042689] SELinux: initialized (dev rpc_pipefs, type rpc_pipefs), uses genfs_contexts
[    9.620449] microcode: CPU0 sig=0x20655, pf=0x10, revision=0x2
[    9.747194] Initialising Xen virtual ethernet driver.
[    9.754392] vif vif-0: 2 parsing device/vif/0/mac
[    9.819979] parport_pc 00:0b: reported by Plug and Play ACPI
[    9.839457] microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
[    9.881675] parport0: PC-style at 0x378, irq 7 [PCSPP,TRISTATE]
[    9.911287] piix4_smbus 0000:00:01.3: SMBus base address uninitialized - upgrade BIOS or use force_addr=0xaddr
[   10.043357] ppdev: user-space parallel port driver
[   12.779048] rmmod[555]: ERROR: Module scsi_wait_scan does not exist in /proc/modules
[   12.916160] Adding 4194300k swap on /dev/xvda2.  Priority:0 extents:1 across:4194300k SS
[   13.351526] systemd-fsck[553]: /dev/xvda1: clean, 220/128016 files, 51750/512000 blocks
[   13.430399] fedora-storage-init[562]: Setting up Logical Volume Management:   No volume groups found
[   13.444132] fedora-storage-init[562]: [  OK  ]
[   13.486948] EXT4-fs (xvda1): mounting ext3 file system using the ext4 subsystem
[   13.519504] EXT4-fs (xvda1): mounted filesystem with ordered data mode. Opts: (null)
[   13.528823] SELinux: initialized (dev xvda1, type ext3), uses xattr
[   13.538195] fedora-storage-init[576]: Setting up Logical Volume Management:   No volume groups found
[   13.576099] fedora-storage-init[576]: [  OK  ]
[   13.599234] lvm[585]: No volume groups found
[   13.775816] systemd-tmpfiles[590]: Successfully loaded SELinux database in 22ms 952us, size on heap is 476K.
[   14.357797] auditd[597]: Started dispatcher: /sbin/audispd pid: 620
[   14.618654] acpid[632]: starting up with netlink and the input layer
[   14.647711] auditd[597]: Init complete, auditd 2.1.3 listening for events (startup state enable)
[   14.670604] acpid[632]: skipping incomplete file /etc/acpi/events/videoconf
[   14.680422] acpid[632]: 1 rule loaded
[   14.687840] acpid[632]: waiting for events: event logging is off
[   14.745262] audispd[620]: priority_boost_parser called with: 4
[   14.745270] audispd[620]: max_restarts_parser called with: 10
[   14.745276] audispd[620]: No plugins found, exiting
[   15.512880] ip6_tables: (C) 2000-2006 Netfilter Core Team
[   15.539447] nf_conntrack version 0.5.0 (7964 buckets, 31856 max)
[   19.378230] mtrr: no MTRR for f0000000,100000 found
[   35.518822] fuse init (API version 7.17)
[   35.533551] SELinux: initialized (dev fuse, type fuse), uses genfs_contexts
[   35.555273] SELinux: initialized (dev fusectl, type fusectl), uses genfs_contexts
[   40.042754] ISO 9660 Extensions: Microsoft Joliet Level 3
[   40.192307] ISO 9660 Extensions: RRIP_1991A
[   40.192420] SELinux: initialized (dev sr0, type iso9660), uses genfs_contexts
[   46.184291] TCP lp registered

--pAwQNkOnpTn9IO2O
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

--pAwQNkOnpTn9IO2O--


From xen-devel-bounces@lists.xensource.com Mon Oct 31 13:44:25 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 13:44:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKyiX-0002kg-6U; Mon, 31 Oct 2011 13:44:25 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RKyi3-0002UZ-2Q
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 13:43:55 -0700
X-Env-Sender: jonnyt@abpni.co.uk
X-Msg-Ref: server-11.tower-27.messagelabs.com!1320093819!43850026!1
X-Originating-IP: [109.200.19.114]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17793 invoked from network); 31 Oct 2011 20:43:39 -0000
Received: from edge1.gosport.uk.abpni.net (HELO
	mail1.gosport.corp.uk.abpni.net) (109.200.19.114)
	by server-11.tower-27.messagelabs.com with SMTP;
	31 Oct 2011 20:43:39 -0000
Received: from localhost (mail1.gosport.corp.uk.abpni.net [127.0.0.1])
	by mail1.gosport.corp.uk.abpni.net (Postfix) with ESMTP id 14EE116296
	for <xen-devel@lists.xensource.com>;
	Mon, 31 Oct 2011 16:43:52 -0400 (EDT)
X-Virus-Scanned: Debian amavisd-new at mail1.mail.gosport.corp.uk.abpni.net
Received: from mail1.gosport.corp.uk.abpni.net ([127.0.0.1])
	by localhost (mail1.mail.gosport.corp.uk.abpni.net [127.0.0.1])
	(amavisd-new, port 10024)
	with ESMTP id Ewn9j-GXydVR for <xen-devel@lists.xensource.com>;
	Mon, 31 Oct 2011 20:43:49 +0000 (GMT)
Received: from Jonathans-MacBook-Air.local (unknown [10.87.0.118])
	by mail1.gosport.corp.uk.abpni.net (Postfix) with ESMTPSA id 094B3161F3
	for <xen-devel@lists.xensource.com>;
	Mon, 31 Oct 2011 20:43:48 +0000 (GMT)
Message-ID: <4EAF0883.3080002@abpni.co.uk>
Date: Mon, 31 Oct 2011 20:43:47 +0000
From: Jonathan Tripathy <jonnyt@abpni.co.uk>
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7;
	rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1
MIME-Version: 1.0
To: xen-devel@lists.xensource.com
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Subject: [Xen-devel] Patch in 3.4.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

Hi Everyone,

Does Xen 3.4.3 contain the following patch:

http://lists.xensource.com/archives/html/xen-devel/2011-05/msg00483.html

We currently get our Xen rpms from Gitco, and are wondering if it 
includes this patch

Thanks

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 13:52:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 13:52:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKypy-0003Gr-Qy; Mon, 31 Oct 2011 13:52:06 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKypW-00034Y-KV
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 13:51:38 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-12.tower-216.messagelabs.com!1320094295!1771374!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 5144 invoked from network); 31 Oct 2011 20:51:35 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-12.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 31 Oct 2011 20:51:35 -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 8774921A8;
	Mon, 31 Oct 2011 22:51:34 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 3201A20062; Mon, 31 Oct 2011 22:51:34 +0200 (EET)
Date: Mon, 31 Oct 2011 22:51:34 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] Xen 4.1.2 PVHVM guest with Linux 3.1.0 network
	problem, empty MAC address (all zeroes)
Message-ID: <20111031205134.GE12984@reaktio.net>
References: <20111031201336.GD12984@reaktio.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20111031201336.GD12984@reaktio.net>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen@lists.fedoraproject.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, Oct 31, 2011 at 10:13:36PM +0200, Pasi Kärkkäinen wrote:
> Hello,
> 
> While testing Fedora 16 Xen PVHVM guests I noticed the following problem:
> 
> When starting F16 PVHVM guest I can see the vifX.0 and tapX.0 interfaces appear on dom0, 
> but after the guest kernel (Linux 3.1.0) starts and loads PVHVM drivers the 
> vif/tap interfaces disappear from dom0.. 
> so the bridge in dom0 doesn't have any vifs/taps connected to it anymore.
> 
> Has anyone seen that behaviour? 
> 
> I bet that's also the reason why eth0 inside the PVHVM guest 
> has a MAC address with only zeroes in it: 00:00:00:00:00:00.
> 
> If I disable PVHVM with "xen_platform_pci=0" in the domain cfgfile
> then network for the guest works OK using the qemu-dm emulated nic.
> 
> PVHVM guest cfgfile:
> 

<snip>

> 
> Some output from inside the PVHVM guest:
> 
> # ifconfig eth0
> eth0      Link encap:Ethernet  HWaddr 00:00:00:00:00:00
>           BROADCAST MULTICAST  MTU:1500  Metric:1
>           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
>           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
>           collisions:0 txqueuelen:1000
>           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
> 

<snip>

> 
> Full PVHVM guest kernel (Linux 3.1.0) dmesg attached to this email.
> Some parts of the guest dmesg here:
> 
> $ egrep -i 'xen|vif' xen-4.1.2-f16pvhvm-linux-3.1.0-dmesg.txt
> 

<snip>

> 
> dom0 kernel (Linux 3.1.0 aswell) messages:
> 

<snip>

> 
> 
> "xm log" doesn't have any errors.
> Any ideas how to fix this? Why do the vif/tap devices disappear from dom0?
> 

Well.. it was actually as simple as removing "type=ioemu" from the vif line.
Working vif-example for Xen PVHVM Linux guest VM:

vif = [ 'mac=00:16:5f:03:01:15, bridge=virbr0, model=e1000' ]

So uhm.. when enabling PVHVM there's no need to modify the disk line, 
but you need to modify the vif-line.. is that like it should be ?


-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 14:04:07 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 14:04:07 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKz1Z-0003pS-CE; Mon, 31 Oct 2011 14:04:05 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKyyQ-0003b0-5l
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 14:00:52 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-10.tower-216.messagelabs.com!1320094846!1668192!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 19244 invoked from network); 31 Oct 2011 21:00:46 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-10.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 31 Oct 2011 21:00:46 -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 59CDE228C;
	Mon, 31 Oct 2011 23:00:45 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id 3C10320062; Mon, 31 Oct 2011 23:00:45 +0200 (EET)
Date: Mon, 31 Oct 2011 23:00:45 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: xen-devel@lists.xensource.com
Subject: Re: [Xen-devel] Xen 4.1.2 PVHVM guest with Linux 3.1.0 network
	problem, empty MAC address (all zeroes)
Message-ID: <20111031210045.GF12984@reaktio.net>
References: <20111031201336.GD12984@reaktio.net>
	<20111031205134.GE12984@reaktio.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <20111031205134.GE12984@reaktio.net>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: xen@lists.fedoraproject.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, Oct 31, 2011 at 10:51:34PM +0200, Pasi Kärkkäinen wrote:
> On Mon, Oct 31, 2011 at 10:13:36PM +0200, Pasi Kärkkäinen wrote:
> > Hello,
> > 
> > While testing Fedora 16 Xen PVHVM guests I noticed the following problem:
> > 
> > When starting F16 PVHVM guest I can see the vifX.0 and tapX.0 interfaces appear on dom0, 
> > but after the guest kernel (Linux 3.1.0) starts and loads PVHVM drivers the 
> > vif/tap interfaces disappear from dom0.. 
> > so the bridge in dom0 doesn't have any vifs/taps connected to it anymore.
> > 
> > Has anyone seen that behaviour? 
> > 
> > I bet that's also the reason why eth0 inside the PVHVM guest 
> > has a MAC address with only zeroes in it: 00:00:00:00:00:00.
> > 
> > If I disable PVHVM with "xen_platform_pci=0" in the domain cfgfile
> > then network for the guest works OK using the qemu-dm emulated nic.
> > 
> > PVHVM guest cfgfile:
> > 
> 
> <snip>
> 
> > 
> > Some output from inside the PVHVM guest:
> > 
> > # ifconfig eth0
> > eth0      Link encap:Ethernet  HWaddr 00:00:00:00:00:00
> >           BROADCAST MULTICAST  MTU:1500  Metric:1
> >           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
> >           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
> >           collisions:0 txqueuelen:1000
> >           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
> > 
> 
> <snip>
> 
> > 
> > Full PVHVM guest kernel (Linux 3.1.0) dmesg attached to this email.
> > Some parts of the guest dmesg here:
> > 
> > $ egrep -i 'xen|vif' xen-4.1.2-f16pvhvm-linux-3.1.0-dmesg.txt
> > 
> 
> <snip>
> 
> > 
> > dom0 kernel (Linux 3.1.0 aswell) messages:
> > 
> 
> <snip>
> 
> > 
> > 
> > "xm log" doesn't have any errors.
> > Any ideas how to fix this? Why do the vif/tap devices disappear from dom0?
> > 
> 
> Well.. it was actually as simple as removing "type=ioemu" from the vif line.
> Working vif-example for Xen PVHVM Linux guest VM:
> 
> vif = [ 'mac=00:16:5f:03:01:15, bridge=virbr0, model=e1000' ]
> 
> So uhm.. when enabling PVHVM there's no need to modify the disk line, 
> but you need to modify the vif-line.. is that like it should be ?
> 

It seems "type=ioemu" is not required for anything.. 
not even for normal HVM emulated nics.

So this works for both normal HVM and PVHVM:
vif = [ 'mac=00:16:5f:03:01:15, bridge=virbr0, model=e1000' ]

And control the HVM/PVHVM mode with:
	xen_platform_pci=1
or
	xen_platform_pci=0



-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 14:41:26 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 14:41:26 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RKzbi-0004tS-Gm; Mon, 31 Oct 2011 14:41:26 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RKzb0-0004gs-Kh
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 14:40:42 -0700
X-Env-Sender: pasik@iki.fi
X-Msg-Ref: server-13.tower-216.messagelabs.com!1320097237!1770070!1
X-Originating-IP: [192.89.123.25]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11966 invoked from network); 31 Oct 2011 21:40:39 -0000
Received: from smtp.tele.fi (HELO smtp.tele.fi) (192.89.123.25)
	by server-13.tower-216.messagelabs.com with DHE-RSA-AES256-SHA
	encrypted SMTP; 31 Oct 2011 21:40:39 -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 CD0F327F6
	for <xen-devel@lists.xensource.com>;
	Mon, 31 Oct 2011 23:40:36 +0200 (EET)
Received: by ydin.reaktio.net (Postfix, from userid 1001)
	id ABD6920062; Mon, 31 Oct 2011 23:40:36 +0200 (EET)
Date: Mon, 31 Oct 2011 23:40:36 +0200
From: Pasi =?iso-8859-1?Q?K=E4rkk=E4inen?= <pasik@iki.fi>
To: xen-devel@lists.xensource.com
Message-ID: <20111031214036.GG12984@reaktio.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
User-Agent: Mutt/1.5.18 (2008-05-17)
Subject: [Xen-devel] Phoronix Xen vs KVM vs Virtualbox benchmark with Ubuntu
	11.10
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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,

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.

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.

-- Pasi


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 16:01:36 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 16:01:36 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RL0rH-0007i3-AX; Mon, 31 Oct 2011 16:01:35 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with smtp (Exim 4.43) id 1RL0qR-0007Vf-Tz
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 16:00:44 -0700
X-Env-Sender: jim_burn@bellsouth.net
X-Msg-Ref: server-10.tower-216.messagelabs.com!1320102040!1676055!1
X-Originating-IP: [66.94.237.138]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 6556 invoked from network); 31 Oct 2011 23:00:40 -0000
Received: from nm4-vm0.access.bullet.mail.mud.yahoo.com (HELO
	nm4-vm0.access.bullet.mail.mud.yahoo.com) (66.94.237.138)
	by server-10.tower-216.messagelabs.com with SMTP;
	31 Oct 2011 23:00:40 -0000
Received: from [66.94.237.200] by nm4.access.bullet.mail.mud.yahoo.com with
	NNFMP; 31 Oct 2011 23:00:39 -0000
Received: from [66.94.237.103] by tm11.access.bullet.mail.mud.yahoo.com with
	NNFMP; 31 Oct 2011 23:00:39 -0000
Received: from [127.0.0.1] by omp1008.access.mail.mud.yahoo.com with NNFMP;
	31 Oct 2011 23:00:39 -0000
X-Yahoo-Newman-Id: 738138.87171.bm@omp1008.access.mail.mud.yahoo.com
Received: (qmail 22317 invoked from network); 31 Oct 2011 23:00:39 -0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bellsouth.net; s=s1024;
	t=1320102039; bh=ifZ9XEA0AjK96tLMJIFA69B2WtBgJ71iQLz3qW/u+EA=;
	h=X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:From:To:Subject:Date:Message-ID:User-Agent:In-Reply-To:References:MIME-Version:Content-Transfer-Encoding:Content-Type;
	b=WyRNuVHQAYXeVJJAs7Qa4P6eJTrBeJVxY4u1w63jbfXOo9shJbZAEaai8wjE0UMqyHr4Sqnh5GA+EtMbnT6bpE8pGD4uMSXaUWVTDFZa1hyKNc83LBnHJMxtNT+llmxUQhwiL8Yo2UMCKbqgmjsod73jgfO9fJuEPLwoEmtkjxo=
X-Yahoo-Newman-Property: ymail-3
X-YMail-OSG: bgwUTK0VM1lDQNi74EywGeEg4ESD0QCKx2.YFZgyGdZoVHV
	dHLxaGyd0Tq2XLrue8N4l9b56FilYlPPIIm05twVEARvGtl19urOuG.Gq.IK
	i.DAsakkRZkt4czdG.EaLUAXze6iElxmlpDtVL6DWgzJT66l38EqK0xLyFss
	RF04OIfUGmDz5SjFIDDq8hhoI66mgpVTFDS92R68u_DY9FC6DxqQH0jUVLLW
	rIjOmS6axn_4HOPYkpI706vrJoPj5Bsu9uRE297lo6FcJCd422rIIWCBtQ7p
	VGrgiObJPwoYJrnoIFs2Sss1QGbF6hAsUpkBB4nh7UL4dStkYyGPY8HQqph0
	48dbMvjM2McLCsvqQL5JQQjAnkEa_54FvJKsNgpRkxkmty.t3nSwmcjAxn5n
	PlbHKWCA0slHuaxJu_82HnDDtV60qcYTJ4qdEHtVywatX3rQxIRNmX2htgwH
	iqmvp9Mx33ffO8pCmOge73nw8MFnXHn3YdRPGNNOpJPZJZRSkikaFNoISv4d
	Uq0VcoDLiKf7JLoF.718QBrRrbPl8f.uDMWR6f_odINUgL2dL1MKn10bJySn
	k35cuOF3ujBexopgLwR1x4Oi0p8HAbUkwF1uHBBWvn5LDafV_b3_I67nDj_j
	sCSvKshT1RcQbOTXSZy1gjjwGPLwSsug5Cp64ppB37ghK8fgoQt4rBKtS9sD
	QtY59isQUf_8GzWd_tJv9ZJeld9inBZQ-
X-Yahoo-SMTP: g0AhWW2swBA2djJKuhuwxPlPqLrHlDrycdPnfR9kZNrpKCA-
Received: from dell4550.localnet (jim_burn@184.36.206.203 with plain)
	by smtp106.sbc.mail.mud.yahoo.com with SMTP;
	31 Oct 2011 16:00:39 -0700 PDT
From: jim burns <jim_burn@bellsouth.net>
To: Ian Campbell <Ian.Campbell@citrix.com>, xen-devel@lists.xensource.com,
	xen-users@lists.xensource.com
Subject: Re: [Xen-devel] Problems with 'xl create winxp' (hvm) on xen 4.1.2
	(also affects GPLPV)
Date: Mon, 31 Oct 2011 19:00:32 -0400
Message-ID: <15732981.uFr7VF8Mh1@dell4550>
User-Agent: KMail/4.7.2 (Linux/2.6.37.6-0.7-default; KDE/4.7.2; i686; ; )
In-Reply-To: <1320060379.23193.72.camel@zakaz.uk.xensource.com>
References: <1758215.SCbitK4oVy@dell4550>
	<1320058232.23193.59.camel@zakaz.uk.xensource.com>
	<1320060379.23193.72.camel@zakaz.uk.xensource.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 7Bit
Content-Type: text/plain; charset="us-ascii"
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 Mon October 31 2011, 11:26:19 AM, Ian Campbell wrote:
> On Mon, 2011-10-31 at 10:50 +0000, Ian Campbell wrote:
> > On Sat, 2011-10-29 at 06:57 +0100, jim burns wrote:
> > > [...]
> > > New to 4.1.2:
> > > 
> > > 1) Starting winxp with xl does not create a vif interface - only a
> > > tap one. More exactly, the vif is created, but does not get an ipv6
> > > address - it shows up in 'ifconfig -a', or 'ifconfig vifn.0' - and
> > > does not get added to the bridge. If you are using James' GPLPV
> > > drivers, you end up with no network connectivity, as they use vif,
> > > not tap. I'd be surprised if other pvhvm solutions don't see this
> > > also.
> > 
> > I see this with the tip of xen-4.1-testing too but not with
> > xen-unstable. I'll see if I can figure out which backport is missing...
> 
> 23047:4ca13a170482 "libxl: provide full path to vif hotplug script
> script" seems like a very plausible candidate, I bet
> "script=/etc/xen/scripts/vif-bridge" would function as a workaround.

Yep - that works. Should have guessed. You have to supply the full path to the 
config file too, or it can't find it (doesn't default to searching /etc/xen).

> > [...]
> > 
> > > 2) If your vif= line in your config specifies a bridge, such as
> > > 'bridge=virbr0', the '-net tap' option to qemu-dm remains as
> > > 'bridge=xenbr0', as if it was hard coded. Again, this is an hvm
> > > problem. 'xl create'-ing a pv domu correctly puts the vif on the
> > > requested bridge. (If memory serves, under xen 4.1.1, when the vif
> > > for an hvm domain was being put on a bridge, I believe it was on
> > > the bridge requested, so the problem is just with tap.)> 
> > Similarly I can reproduce this too but only on 4.1.
> 
> Actually this one is broken in unstable too.
> 
> The handling of leading and trailing whitespace in the vif option seems
> to be completely b0rked in xl and e.g. "bridge = virbr1" ends up as key
> "bridge " and key " virbr1". That entire parser (actually, both of them
> -- there's a whole nother one in main_networkattach!) is a mess.
> 
> There's probably a bandaid which can be applied but really the whole
> thing need ripping out and making sensible.
> 
> As a workaround in the meantime you can probably avoid whitespace around
> the "=" and "," in the vif line.
> 
Yep - that works too:

root@insp6400 10/31/11  6:31PM:~
[512] > xl create /etc/xen/winxp; brctl show;  ps -A|grep qemu; netstat -tlp|
grep 59; renice -11 `pidof qemu-dm`;  ps -A|grep vncv; ifconfig vif3.0 mtu 
9000 
Parsing config file /etc/xen/winxp
xc: info: VIRTUAL MEMORY ARRANGEMENT:
  Loader:        0000000000100000->000000000017b270
  TOTAL:         0000000000000000->000000002fc00000
  ENTRY ADDRESS: 00000000001015a0
xc: info: PHYSICAL MEMORY ALLOCATION:
  4KB PAGES: 0x0000000000009a00
  2MB PAGES: 0x0000000000000131
  1GB PAGES: 0x0000000000000000
Daemon running with PID 6804
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.feffffffffff       yes             tap3.0
xenbr0          8000.0015c5047d4f       no              bond0
 6809 pts/1    S+     0:00                     grep --color=auto qemu
 6758 ?        RLsl   0:00   qemu-dm -d 3 -domain-name winxp -vnc 0.0.0.0:3 -k 
en-us -serial pty -videoram 4 -boot cda -usb -usbdevice tablet -soundhw es1370 
-acpi -vcpus 2 -vcpu_avail 0x3 -net 
nic,vlan=0,macaddr=00:16:3e:23:1d:36,model=rtl8139 -net 
tap,vlan=0,ifname=tap3.0,bridge=virbr0,script=no -M xenfv
tcp        0      0 *:5901                      *:*                         
LISTEN      3283/Xvnc           
tcp        0      0 *:5903                      *:*                         
LISTEN      6758/qemu-dm        
6758 (process ID) old priority 0, new priority -11
 6907 pts/1    S+     0:00                     grep --color=auto vncv
root@insp6400 10/31/11  6:32PM:~
[513] > brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.feffffffffff       yes             tap3.0
                                                        vif3.0
xenbr0          8000.0015c5047d4f       no              bond0

For 4):

On Mon October 31 2011, 10:56:51 AM, Ian Campbell wrote:
> On Sat, 2011-10-29 at 07:17 +0100, jim burns wrote:
> > On Sat October 29 2011, 1:57:12 AM, jim burns wrote:
> > > For the remaining problems, note that 'xl create winxp' creates a
> > > qemu-dm process with the following parameters:
> > > 
> > > qemu-dm -d 8 -domain-name winxp -vnc 0.0.0.0:3 -k en-us -serial pty
> > > -videoram  4 -boot cda -usb -usbdevice tablet -soundhw es1370 -acpi
> > > -vcpus 2 -vcpu_avail 0x3 -net
> > > nic,vlan=0,macaddr=00:16:3e:23:1d:36,model=rtl8139 -net
> > > tap,vlan=0,ifname=tap8.0,bridge=xenbr0,script=no -M xenfv> 
> > Note, starting the domain with 'xm create' with the same config results
> > in:
> > 
> > /usr/lib/xen/bin/qemu-dm -d 11 -domain-name winxp -videoram 4 -k en-us
> > -vnc 0.0.0.0:3 -monitor vc -vcpus 2 -vcpu_avail 0x3 -boot cda -soundhw
> > es1370 - localtime -serial pty -acpi -usbdevice tablet -net
> > nic,vlan=1,macaddr=00:16:3e:23:1d:36,model=rtl8139 -net
> > tap,vlan=1,ifname=tap11.0,bridge=xenbr0 -M xenfv
> > 
> > Note, 'xl create' does not pass the '-localtime' option,
> 
> 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.

> >  and its '-net tap' specifies 'script=no', unlike 'xm create'.
> 
> This is expected, with xl the script for tap devices is run via the
> hotplug mechanism (i.e. the same as vif) whereas xend apparently runs it
> via qemu. Either _should_ work.
> 
> > Also, for some reason, the vlan numbers are different between xl and xm.
> 
> That's ok, they are effectively arbitrary and just serve to bind the
> "-net nic,..." and "-net tap,..." options to one another (IOW the vlan
> ID needs to be consistent across those two options but is otherwise
> unimportant).

Thanx for the explanations.

On Mon October 31 2011, 10:50:32 AM, Ian Campbell wrote:
> > 5) Anything other than 'videoram=4' in your config will be ignored when 
> > starting with xl, but not with xm. You will get an error in your qemu-dm
> > log file of the form:
> > 
> >
> > -videoram option does not work with cirrus vga device model. Videoram
> > set to  4M.
> 
> I'm not sure what's going on here, since this appears to be a qemu thing
> and that is the same for xend and xl. Perhaps they are choosing
> differing graphics card device models? How do the command lines differ
> if you use this option?

With videoram=8, and 'xm create', you get what you expect:

 6026 ?        RLl    0:00     /usr/lib/xen/bin/qemu-dm -d 2 -domain-name 
winxp -videoram 8 -k en-us -vnc 0.0.0.0:3 -monitor vc -vcpus 2 -vcpu_avail 0x3 
-boot cda -soundhw es1370 -localtime -serial pty -acpi -usbdevice tablet -net 
nic,vlan=1,macaddr=00:16:3e:23:1d:36,model=rtl8139 -net 
tap,vlan=1,ifname=tap2.0,bridge=xenbr0 -M xenfv

Thanx for the thorough review.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 19:19:00 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 19:19:00 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RL3wJ-0004sQ-NJ; Mon, 31 Oct 2011 19:19:00 -0700
Received: from mail216.messagelabs.com ([85.158.143.99])
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RL3vS-0004gP-RS; Mon, 31 Oct 2011 19:18:07 -0700
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-5.tower-216.messagelabs.com!1320113882!1785783!1
X-Originating-IP: [209.85.213.43]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20723 invoked from network); 1 Nov 2011 02:18:03 -0000
Received: from mail-yw0-f43.google.com (HELO mail-yw0-f43.google.com)
	(209.85.213.43)
	by server-5.tower-216.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 02:18:03 -0000
Received: by ywp17 with SMTP id 17so10877294ywp.30
	for <multiple recipients>; Mon, 31 Oct 2011 19:18:02 -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=1Cc2Dqe9jae/Rhm1vY30NTPMGirHyjNlR7NfCRc9KYA=;
	b=wDvQRRqdnzOXemlFXAj3SctoOiMoIP4Vsm20Kk604vsnX1hjt5t+0mnMwwnkFwCtOB
	UKaGKhVmoIeTwt832ouoJx+vUrVXe+AuuUREuGIuEucchPCFhe1ygU2PCVKIz8YQFaSS
	AAC3TGtEiTdGZayZ8Be77TWnNKYnPDUJLk1/4=
Received: by 10.68.40.136 with SMTP id x8mr12417555pbk.10.1320113881546;
	Mon, 31 Oct 2011 19:18:01 -0700 (PDT)
Received: from [172.16.25.10] ([221.149.233.253])
	by mx.google.com with ESMTPS id c3sm20737569pbt.12.2011.10.31.19.17.58
	(version=SSLv3 cipher=OTHER); Mon, 31 Oct 2011 19:18:00 -0700 (PDT)
Message-ID: <4EAF56D3.706@xen.org>
Date: Tue, 01 Nov 2011 02:17:55 +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: Florian Heigl <florian.heigl@gmail.com>
Subject: Re: [Xen-users] Re: [Xen-devel] Xen document day (Oct 12 or 26)
References: <4E92D809.9000504@xen.org>
	<20111010160404.GB28646@phenom.oracle.com>
	<4E946EB9.7050209@xen.org>
	<CAOzFzEhU3YJtzyJn7rcUXUmwz+PhaxRsKQaYU+2-eHrv-LyD6g@mail.gmail.com>
	<20111013180244.GC15499@phenom.oracle.com>
	<5400260811821008556@unknownmsgid>
	<1318859996.16132.16.camel@zakaz.uk.xensource.com>
	<4E9C4516.2070902@xen.org>
	<1318864667.16132.22.camel@zakaz.uk.xensource.com>
	<4E9C4BAB.9020605@xen.org>
	<20111026195543.GA6558@phenom.dumpdata.com>
	<4EA932D5.3060504@xen.org>
	<CAOzFzEiTzSDABmtJw3u+jow5Xw_wRYNxFr9U_G-q59-Qwv7j=g@mail.gmail.com>
	<4EAAA467.2030503@xen.org>
	<CAFivhPk7Pk4DWHeDVTWvV26vQqU0-pqUqvV3GNx5JBDShQW85g@mail.gmail.com>
In-Reply-To: <CAFivhPk7Pk4DWHeDVTWvV26vQqU0-pqUqvV3GNx5JBDShQW85g@mail.gmail.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>,
	Ian Campbell <Ian.Campbell@citrix.com>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Andrew Bobulsky <rulerof@gmail.com>,
	Joseph Glanville <joseph.glanville@orionvm.com.au>,
	"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

Note that mediawiki allows pages to be in several categories. Check out 
http://en.wikipedia.org/wiki/Special:Categories

>  I think the main issues (mess) with the old wiki were:
>  - not being able to contact someone if information is incorrect / outdated
We would need category and page owners for this. I will have to think about this.

>  - noone looking into pages that had become outdated
Agreed. I think we also faced the issue that we didn't know what was outdated. That makes fixing it a harder problem

>  - not looking for pages that might be outdated
Categories and attention boxes should help

>  - most of the pages being immutable so you couldn't even fix stuff.
That is a MoinMoin feature (which should be resolved with MediaWiki). The MoinMoin spamming protection is extremely primitive.

>  So if we limit edit rights to certain user groups that is not a
>  problem, as long as the groups are big enough to maintain the
>  categories.
MediaWiki has quite fine grained user control. I will have to think about how to set this up, but my gut feel is we should have:
- Admins
- Editors (get notified when people make changes, owners of categories)
- Authors (anybody with an account)

>  Also it might be helpful to use a release mechanism - if any
>  registered user can create pages, but they stay invisible until
>  approval then this would save a lot of time for the regular authors
>  and still keep up quality. (Thats working really well in my
>  experience)
I think that is not advisable. I rather go for the WikiPedia approach, where wrong changes are reverted by editors. I think we should try with an open model and make it more restrictive it the open model doesn't work

Regards
Lars


On 30/10/2011 20:58, Florian Heigl wrote:
> Hi Lars,
>
> 2011/10/28 Lars Kurth<lars.kurth@xen.org>:
>> There may be a few more. Will need to work on these a little more. It may
>> also mean that the MediWiki instance is set up that pages must have a
>> category and that only a subset of users can create new ones. Otherwise we
>> get into the same mess again.
> I think the main issues (mess) with the old wiki were:
> - not being able to contact someone if information is incorrect / outdated
> - noone looking into pages that had become outdated
> - not looking for pages that might be outdated
> - most of the pages being immutable so you couldn't even fix stuff.
>
> So if we limit edit rights to certain user groups that is not a
> problem, as long as the groups are big enough to maintain the
> categories.
> Also it might be helpful to use a release mechanism - if any
> registered user can create pages, but they stay invisible until
> approval then this would save a lot of time for the regular authors
> and still keep up quality. (Thats working really well in my
> experience)
>
> Greetings
> Florian


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

From xen-devel-bounces@lists.xensource.com Mon Oct 31 21:19:18 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 21:19:18 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RL5oj-0001I3-96; Mon, 31 Oct 2011 21:19:17 -0700
Received: from mail21.messagelabs.com ([85.158.143.35])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RL5ny-00015f-Qk
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 21:18:31 -0700
X-Env-Sender: vase@selfip.ru
X-Msg-Ref: server-8.tower-21.messagelabs.com!1320121107!2426511!1
X-Originating-IP: [74.125.82.171]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 17842 invoked from network); 1 Nov 2011 04:18:27 -0000
Received: from mail-wy0-f171.google.com (HELO mail-wy0-f171.google.com)
	(74.125.82.171)
	by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Nov 2011 04:18:27 -0000
Received: by wyi11 with SMTP id 11so8563098wyi.30
	for <xen-devel@lists.xensource.com>;
	Mon, 31 Oct 2011 21:18:27 -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=Tn62ZdNOIwgNwERpAD+FBaZ2VYZYG4wuOniY5VEcf48=;
	b=aG3ODIZqcGDwy+cWeVtB0i62ZnTb9+tzbanqc78K4E1BGbWkG8qr7zG8ipee3eAbEx
	/no9wcXle5Xh15RyCxbzJFTiTDgJ9oEkbxp8cU8+KZK8kdVndGD/Gp5XjM+8OHveEOSD
	K/oeGejXmh7HeOQ5DEv2a/Bmle8ravVa05TAI=
Received: by 10.216.14.166 with SMTP id d38mr5283189wed.14.1320121107178; Mon,
	31 Oct 2011 21:18:27 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.216.26.207 with HTTP; Mon, 31 Oct 2011 21:18:11 -0700 (PDT)
X-Originating-IP: [85.143.161.18]
In-Reply-To: <1320086292-5058-1-git-send-email-dgdegra@tycho.nsa.gov>
References: <1320086292-5058-1-git-send-email-dgdegra@tycho.nsa.gov>
From: Vasiliy Tolstov <v.tolstov@selfip.ru>
Date: Tue, 1 Nov 2011 08:18:11 +0400
X-Google-Sender-Auth: jPQ0ErWLVW-2hgiy7Wc2vIjqhss
Message-ID: <CACaajQum+1XJZY2RN366eUPZqpJPPc-r6+X6OgfwxV+d6rjpBg@mail.gmail.com>
Subject: Re: [Xen-devel] [PATCH] xenstored: Fix processing of zero-length
	messages
To: Daniel De Graaf <dgdegra@tycho.nsa.gov>
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="===============0909788457=="
Sender: xen-devel-bounces@lists.xensource.com
Errors-To: xen-devel-bounces@lists.xensource.com

--===============0909788457==
Content-Type: multipart/alternative; boundary=0016364d24c9a7642904b0a4a58d

--0016364d24c9a7642904b0a4a58d
Content-Type: text/plain; charset=UTF-8

Thanks! Can somebody check ocaml oxenstored for deadlocks when incorrect
messages sent to xenstore?

2011/10/31 Daniel De Graaf <dgdegra@tycho.nsa.gov>

> 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>
> ---
>  tools/xenstore/xenstored_core.c |    1 -
>  1 files changed, 0 insertions(+), 1 deletions(-)
>
> diff --git a/tools/xenstore/xenstored_core.c
> b/tools/xenstore/xenstored_core.c
> index 5d308ca..9e6c2c7 100644
> --- a/tools/xenstore/xenstored_core.c
> +++ b/tools/xenstore/xenstored_core.c
> @@ -1297,7 +1297,6 @@ static void handle_input(struct connection *conn)
>                        goto bad_client;
>                in->used = 0;
>                in->inhdr = false;
> -               return;
>        }
>
>        bytes = conn->read(conn, in->buffer + in->used,
> --
> 1.7.6.4
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>



-- 
Vasiliy Tolstov,
Clodo.ru
e-mail: v.tolstov@selfip.ru
jabber: vase@selfip.ru

--0016364d24c9a7642904b0a4a58d
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Thanks! Can somebody check ocaml oxenstored for deadlocks when incorrect me=
ssages sent to xenstore?<br><br><div class=3D"gmail_quote">2011/10/31 Danie=
l De Graaf <span dir=3D"ltr">&lt;<a href=3D"mailto:dgdegra@tycho.nsa.gov">d=
gdegra@tycho.nsa.gov</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;">When a message with zero length is sent to =
xenstore, the body of the<br>
message was not processed until the socket or ring had more data to<br>
read; this will cause deadlocks if the requestor is waiting on a<br>
response to continue.<br>
<br>
Signed-off-by: Daniel De Graaf &lt;<a href=3D"mailto:dgdegra@tycho.nsa.gov"=
>dgdegra@tycho.nsa.gov</a>&gt;<br>
---<br>
=C2=A0tools/xenstore/xenstored_core.c | =C2=A0 =C2=A01 -<br>
=C2=A01 files changed, 0 insertions(+), 1 deletions(-)<br>
<br>
diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_cor=
e.c<br>
index 5d308ca..9e6c2c7 100644<br>
--- a/tools/xenstore/xenstored_core.c<br>
+++ b/tools/xenstore/xenstored_core.c<br>
@@ -1297,7 +1297,6 @@ static void handle_input(struct connection *conn)<br>
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0goto bad_client;<br>
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0in-&gt;used =3D 0;<=
br>
 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0in-&gt;inhdr =3D fa=
lse;<br>
- =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return;<br>
 =C2=A0 =C2=A0 =C2=A0 =C2=A0}<br>
<br>
 =C2=A0 =C2=A0 =C2=A0 =C2=A0bytes =3D conn-&gt;read(conn, in-&gt;buffer + i=
n-&gt;used,<br>
<font color=3D"#888888">--<br>
1.7.6.4<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></blockquote></div><br><br clear=3D"all"><div><br></div>-- <br><span=
 style=3D"border-collapse:collapse;color:rgb(136, 136, 136);font-family:ari=
al, sans-serif;font-size:13px"><div><div>Vasiliy Tolstov,</div><div>Clodo.r=
u</div>

<div>e-mail: <a href=3D"mailto:v.tolstov@selfip.ru" target=3D"_blank">v.tol=
stov@selfip.ru</a></div><div>jabber: <a href=3D"mailto:vase@selfip.ru" targ=
et=3D"_blank">vase@selfip.ru</a></div></div></span><br>

--0016364d24c9a7642904b0a4a58d--


--===============0909788457==
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

--===============0909788457==--


From xen-devel-bounces@lists.xensource.com Mon Oct 31 21:43:42 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 21:43:42 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RL6CK-0002Ks-Va; Mon, 31 Oct 2011 21:43:41 -0700
Received: from mail182.messagelabs.com ([85.158.139.83])
	by lists.xensource.com with esmtp (Exim 4.43) id 1RL6BY-00023h-Ok
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 21:42:53 -0700
X-Env-Sender: Ian.Jackson@eu.citrix.com
X-Msg-Ref: server-4.tower-182.messagelabs.com!1320122569!1446786!1
X-Originating-IP: [62.200.22.115]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 16833 invoked from network); 1 Nov 2011 04:42:49 -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 04:42:49 -0000
X-IronPort-AV: E=Sophos;i="4.69,436,1315180800"; 
   d="scan'208";a="8688552"
Received: from lonpmailmx01.citrite.net ([10.30.203.162])
	by LONPIPO01.EU.CITRIX.COM with ESMTP/TLS/RC4-MD5;
	01 Nov 2011 04:42: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, 1 Nov 2011 04:42:49 +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 1RL6BU-0001Bl-VL;
	Tue, 01 Nov 2011 04:42:49 +0000
Received: from osstest by woking.xci-test.com with local (Exim 4.69)
	(envelope-from <ian.jackson@eu.citrix.com>)	id 1RL6BU-0007yV-UH;
	Tue, 01 Nov 2011 04:42:48 +0000
To: <xen-devel@lists.xensource.com>
Message-ID: <osstest-9650-mainreport@xen.org>
From: xen.org <ian.jackson@eu.citrix.com>
Date: Tue, 1 Nov 2011 04:42:48 +0000
MIME-Version: 1.0
Content-Type: text/plain
Cc: ian.jackson@eu.citrix.com
Subject: [Xen-devel] [xen-unstable test] 9650: 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 9650 xen-unstable real [real]
http://www.chiark.greenend.org.uk/~xensrcts/logs/9650/

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 9647
 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                  0fea1ad50ce3
baseline version:
 xen                  0fea1ad50ce3

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 Oct 31 23:01:24 2011
Return-path: <xen-devel-bounces@lists.xensource.com>
Envelope-to: www-data@lists.xensource.com
Delivery-date: Mon, 31 Oct 2011 23:01:25 -0700
Received: from localhost ([127.0.0.1] helo=lists.colo.xensource.com)
	by lists.xensource.com with esmtp (Exim 4.43)
	id 1RL7PX-00047y-Gx; Mon, 31 Oct 2011 23:01:23 -0700
Received: from mail27.messagelabs.com ([193.109.254.147])
	by lists.xensource.com with smtp (Exim 4.43) id 1RL7OR-0003vK-K7
	for xen-devel@lists.xensource.com; Mon, 31 Oct 2011 23:00:16 -0700
X-Env-Sender: allen.m.kay@intel.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1320127187!46703750!1
X-Originating-IP: [192.55.52.93]
X-StarScan-Version: 6.4.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9378 invoked from network); 1 Nov 2011 05:59:47 -0000
Received: from mga11.intel.com (HELO mga11.intel.com) (192.55.52.93)
	by server-4.tower-27.messagelabs.com with SMTP;
	1 Nov 2011 05:59:47 -0000
Received: from fmsmga001.fm.intel.com ([10.253.24.23])
	by fmsmga102.fm.intel.com with ESMTP; 31 Oct 2011 23:00:11 -0700
X-ExtLoop1: 1
X-IronPort-AV: E=Sophos;i="4.69,436,1315206000"; d="scan'208";a="79960180"
Received: from orsmsx604.amr.corp.intel.com ([10.22.226.87])
	by fmsmga001.fm.intel.com with ESMTP; 31 Oct 2011 23:00:11 -0700
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; Mon, 31 Oct 2011 23:00:10 -0700
Received: from orsmsx505.amr.corp.intel.com ([10.22.226.208]) by
	orsmsx601.amr.corp.intel.com ([10.22.226.213]) with mapi;
	Mon, 31 Oct 2011 23:00:11 -0700
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, 31 Oct 2011 23:00:08 -0700
Thread-Topic: [VTD] Intel iommu IOTLB flush really slow
Thread-Index: AcyX65BzepR+qNlgQF+YjSahZrA8NAAbbXQA
Message-ID: <987664A83D2D224EAE907B061CE93D5301F20D31F3@orsmsx505.amr.corp.intel.com>
References: <20111031163801.GG19392@spongy.cam.xci-test.com>
In-Reply-To: <20111031163801.GG19392@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: 
Subject: [Xen-devel] RE: [VTD] Intel iommu IOTLB flush really slow
X-BeenThere: xen-devel@lists.xensource.com
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: Xen developer discussion <xen-devel.lists.xensource.com>
List-Unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
List-Post: <mailto:xen-devel@lists.xensource.com>
List-Help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-Subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>,
	<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 Jean,

I agree plan B is the better solution.  Having batch capability in shadow/H=
AP might be useful for other use cases.

Allen

-----Original Message-----
From: Jean Guyader [mailto:jean.guyader@eu.citrix.com]=20
Sent: Monday, October 31, 2011 9:38 AM
To: xen-devel@lists.xensource.com
Cc: Kay, Allen M
Subject: [VTD] Intel iommu IOTLB flush really slow

Hi,

Some IOMMU DMA remapping engine sometimes take longer to flush the IOTLBs.
For instance on Ibex Peak a iommu_map_page can in the order of milisecondes=
.

In the Intel IOMMU spec you can see that you don't need to flush if the PTE=
 was present so it's all good when we are creating a domain because we don'=
t need to flush anything. Some problem happen when we try to move memory ar=
round.

Here is some code from hvmloader, pci.c:190 on xen-unstable:

while ( (pci_mem_start >> PAGE_SHIFT) < hvm_info->low_mem_pgend ) {
    struct xen_add_to_physmap xatp;
    if ( hvm_info->high_mem_pgend =3D=3D 0 )
        hvm_info->high_mem_pgend =3D 1ull << (32 - PAGE_SHIFT);
    xatp.domid =3D DOMID_SELF;
    xatp.space =3D XENMAPSPACE_gmfn;
    xatp.idx   =3D --hvm_info->low_mem_pgend;
    xatp.gpfn  =3D hvm_info->high_mem_pgend++;
    if ( hypercall_memory_op(XENMEM_add_to_physmap, &xatp) !=3D 0 )
        BUG();
}

This code gets triggered when the PCI hole increased so much that it overla=
ps with the allocated RAM. So we have to relocate the section that overlap =
in the top memory.

If we folow the code down to Xen we can find that add_to_physmap calls set_=
p2m_entry which uses either p2m_set_entry or ept_set_entry with an order or=
 0, yes we only try to move one page.

Both implementations update the iommu page table with iommu_map_page.
So at the end we end up doing a loop of iommu_map_page driven by this loop =
in hvmloader.

The IOMMU DMA remapping enigne of the Intel GPU is really really slow to fl=
ush. So when we try to create a domain that does Intel GPU pass through wit=
h enough memory to force a relocation of the top RAM below 4G the domain ca=
n take minutes to start!

There are multiple approches that we can use to fix this problem, but befor=
e I start working on a patch I would like to get the list's point of view.

Plan A:
  - Add a new XENMEM add_to_physmap_range that would relocate a gfn range t=
o a new gfn.
  - Add a flag in the IOMMU API to delay the IOTLB flush
  - Add a new API call to flush the the IOTLB manully once we relocate all =
the range.

Plan B:
  - Add a new XENMEM add_to_physmap_range that would relocate a gfn range t=
o a new gfn.
  - Add a new set_p2m_entry function that will understand batches of gfns a=
nd mfns.
  - Implement batch operation for shadow and HAP.
  - Add new IOMMU API to support batch operation

(A) isn't very nice but has the benefit of not modifying to much code, (B) =
would be the right thing to do but would be quite disruptive in term of cod=
e and API change.

Let me know what you think,
Jean

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

